ZGlmZiAtLWdpdCBhL2Jpbi8ydG8zIGIvYmluLzJ0bzMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDViNWRlNQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi8ydG8zCkBAIC0wLDAgKzEsNSBAQAorIyEvdG1wL25kay1Vc2VyL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2Rhcndpbi14ODZfNjQvYmluL3B5dGhvbjIuNworaW1wb3J0IHN5cworZnJvbSBsaWIydG8zLm1haW4gaW1wb3J0IG1haW4KKworc3lzLmV4aXQobWFpbigibGliMnRvMy5maXhlcyIpKQpkaWZmIC0tZ2l0IGEvYmluL2lkbGUgYi9iaW4vaWRsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNDBkMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvYmluL2lkbGUKQEAgLTAsMCArMSw1IEBACisjIS90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NC9iaW4vcHl0aG9uMi43CisKK2Zyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBtYWluCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvYmluL3B5ZG9jIGIvYmluL3B5ZG9jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMwNTQ1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vcHlkb2MKQEAgLTAsMCArMSw1IEBACisjIS90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NC9iaW4vcHl0aG9uMi43CisKK2ltcG9ydCBweWRvYworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBweWRvYy5jbGkoKQpkaWZmIC0tZ2l0IGEvYmluL3B5dGhvbiBiL2Jpbi9weXRob24KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTUxYWIyNgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9weXRob24KQEAgLTAsMCArMSBAQAorcHl0aG9uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Jpbi9weXRob24tY29uZmlnIGIvYmluL3B5dGhvbi1jb25maWcKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzU4MDI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9weXRob24tY29uZmlnCkBAIC0wLDAgKzEgQEAKK3B5dGhvbjItY29uZmlnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluL3B5dGhvbi1jb25maWcuc2ggYi9iaW4vcHl0aG9uLWNvbmZpZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kM2U2MzU5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluL3B5dGhvbi1jb25maWcuc2gKQEAgLTAsMCArMSwxMTIgQEAKKyMhL3Vzci9iaW4vZW52IHNoCisKK2V4aXRfd2l0aF91c2FnZSAoKQoreworICAgIGVjaG8gIlVzYWdlOiAkMCBbaWdub3JlZC5weV0gLS1wcmVmaXh8LS1leGVjLXByZWZpeHwtLWluY2x1ZGVzfC0tbGlic3wtLWNmbGFnc3wtLWxkZmxhZ3N8LS1leHRlbnNpb24tc3VmZml4fC0taGVscHwtLWFiaWZsYWdzfC0tY29uZmlnZGlyIgorICAgIGV4aXQgMQorfQorCitjYXNlICIkMSIgaW4KKyAgICAqLnB5KQorICAgICAgICBzaGlmdAorICAgIDs7Citlc2FjCisKK2lmIFsgIiQxIiA9ICIiIF0gOyB0aGVuCisgICAgZXhpdF93aXRoX3VzYWdlCitmaQorCisjIFJldHVybnMgdGhlIGFjdHVhbCBwcmVmaXggd2hlcmUgdGhpcyBzY3JpcHQgd2FzIGluc3RhbGxlZCB0by4KK2luc3RhbGxlZF9wcmVmaXggKCkKK3sKKyAgICBsb2NhbCBSRVNVTFQ9JChkaXJuYW1lICQoY2QgJChkaXJuYW1lICIkMSIpICYmIHB3ZCAtUCkpCisgICAgbG9jYWwgUkVBRExJTks9cmVhZGxpbmsKKyAgICBpZiBbICIkKHVuYW1lIC1zKSIgPSAiRGFyd2luIiBdIDsgdGhlbgorICAgICAgICAjIHJlYWRsaW5rIGluIGRhcndpbiBjYW4ndCBoYW5kbGUgLWYuICBVc2UgZ3JlYWRsaW5rIGZyb20gTWFjUG9ydHMgaW5zdGVhZC4KKyAgICAgICAgUkVBRExJTks9Z3JlYWRsaW5rCisgICAgZmkKKyAgICBpZiBbICQod2hpY2ggJFJFQURMSU5LKSBdIDsgdGhlbgorICAgICAgICBSRVNVTFQ9JCgkUkVBRExJTksgLWYgIiRSRVNVTFQiKQorICAgIGZpCisgICAgZWNobyAkUkVTVUxUCit9CisKK3ByZWZpeF9idWlsZD0iL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0IgorcHJlZml4X3JlYWw9JChpbnN0YWxsZWRfcHJlZml4ICIkMCIpCisKKyMgVXNlIHNlZCB0byBmaXggcGF0aHMgZnJvbSB0aGVpciBidWlsdCB0byBsb2NhdGlvbnMgdG8gdGhlaXIgaW5zdGFsbGVkIHRvIGxvY2F0aW9ucy4KK3ByZWZpeD0kKGVjaG8gIiRwcmVmaXhfYnVpbGQiIHwgc2VkICJzIyRwcmVmaXhfYnVpbGQjJHByZWZpeF9yZWFsIyIpCitleGVjX3ByZWZpeF9idWlsZD0iJHtwcmVmaXh9IgorZXhlY19wcmVmaXg9JChlY2hvICIkZXhlY19wcmVmaXhfYnVpbGQiIHwgc2VkICJzIyRleGVjX3ByZWZpeF9idWlsZCMkcHJlZml4X3JlYWwjIikKK2luY2x1ZGVkaXI9JChlY2hvICIke3ByZWZpeH0vaW5jbHVkZSIgfCBzZWQgInMjJHByZWZpeF9idWlsZCMkcHJlZml4X3JlYWwjIikKK2xpYmRpcj0kKGVjaG8gIiR7ZXhlY19wcmVmaXh9L2xpYiIgfCBzZWQgInMjJHByZWZpeF9idWlsZCMkcHJlZml4X3JlYWwjIikKK0NGTEFHUz0kKGVjaG8gIi1PMiAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLXMiIHwgc2VkICJzIyRwcmVmaXhfYnVpbGQjJHByZWZpeF9yZWFsIyIpCitWRVJTSU9OPSIyLjciCitMSUJNPSIiCitMSUJDPSIiCitTWVNMSUJTPSIkTElCTSAkTElCQyIKK0FCSUZMQUdTPSJAQUJJRkxBR1NAIgorIyBQcm90ZWN0IGFnYWluc3QgbGFjayBvZiBzdWJzdGl0dXRpb24uCitpZiBbICIkQUJJRkxBR1MiID0gIkBBQklGTEFHU0AiIF0gOyB0aGVuCisgICAgQUJJRkxBR1M9CitmaQorTElCUz0iLWxkbCAgLWZyYW1ld29yayBDb3JlRm91bmRhdGlvbiAkU1lTTElCUyAtbHB5dGhvbiR7VkVSU0lPTn0ke0FCSUZMQUdTfSIKK0JBU0VDRkxBR1M9IiAtZm5vLXN0cmljdC1hbGlhc2luZyIKK0xETElCUkFSWT0ibGlicHl0aG9uJHtWRVJTSU9OfS5hIgorTElOS0ZPUlNIQVJFRD0iLXUgX1B5TWFjX0Vycm9yIgorT1BUPSItRE5ERUJVRyAtZyAtZndyYXB2IC1PMyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIgorUFlfRU5BQkxFX1NIQVJFRD0iMCIKK0RMTExJQlJBUlk9IiIKK0xJQkRFU1Q9JHtwcmVmaXh9L2xpYi9weXRob24ke1ZFUlNJT059CitMSUJQTD0ke0xJQkRFU1R9L2NvbmZpZworU089Ii5zbyIKK1BZVEhPTkZSQU1FV09SSz0iIgorSU5DRElSPSItSSRpbmNsdWRlZGlyL3B5dGhvbiR7VkVSU0lPTn0ke0FCSUZMQUdTfSIKK1BMQVRJTkNESVI9Ii1JJGluY2x1ZGVkaXIvcHl0aG9uJHtWRVJTSU9OfSR7QUJJRkxBR1N9IgorCisjIFNjYW4gZm9yIC0taGVscCBvciB1bmtub3duIGFyZ3VtZW50LgorZm9yIEFSRyBpbiAkKgorZG8KKyAgICBjYXNlICRBUkcgaW4KKyAgICAgICAgLS1oZWxwKQorICAgICAgICAgICAgZXhpdF93aXRoX3VzYWdlCisgICAgICAgIDs7CisgICAgICAgIC0tcHJlZml4fC0tZXhlYy1wcmVmaXh8LS1pbmNsdWRlc3wtLWxpYnN8LS1jZmxhZ3N8LS1sZGZsYWdzKQorICAgICAgICA7OworICAgICAgICAqKQorICAgICAgICAgICAgZXhpdF93aXRoX3VzYWdlCisgICAgICAgIDs7CisgICAgZXNhYworZG9uZQorCitmb3IgQVJHIGluICQqCitkbworICAgIGNhc2UgJEFSRyBpbgorICAgICAgICAtLXByZWZpeCkKKyAgICAgICAgICAgIGVjaG8gIiRwcmVmaXgiCisgICAgICAgIDs7CisgICAgICAgIC0tZXhlYy1wcmVmaXgpCisgICAgICAgICAgICBlY2hvICIkZXhlY19wcmVmaXgiCisgICAgICAgIDs7CisgICAgICAgIC0taW5jbHVkZXMpCisgICAgICAgICAgICBlY2hvICIkSU5DRElSIgorICAgICAgICA7OworICAgICAgICAtLWNmbGFncykKKyAgICAgICAgICAgIGVjaG8gIiRJTkNESVIgJEJBU0VDRkxBR1MgJENGTEFHUyAkT1BUIgorICAgICAgICA7OworICAgICAgICAtLWxpYnMpCisgICAgICAgICAgICBlY2hvICIkTElCUyIKKyAgICAgICAgOzsKKyAgICAgICAgLS1sZGZsYWdzKQorICAgICAgICAgICAgTElOS0ZPUlNIQVJFRFVTRUQ9CisgICAgICAgICAgICBpZiBbIC16ICIkUFlUSE9ORlJBTUVXT1JLIiBdIDsgdGhlbgorICAgICAgICAgICAgICAgIExJTktGT1JTSEFSRURVU0VEPSRMSU5LRk9SU0hBUkVECisgICAgICAgICAgICBmaQorICAgICAgICAgICAgTElCUExVU0VEPQorICAgICAgICAgICAgaWYgWyAiJFBZX0VOQUJMRV9TSEFSRUQiID0gIjAiIC1vIC1uICIke0RMTExJQlJBUll9IiBdIDsgdGhlbgorICAgICAgICAgICAgICAgIExJQlBMVVNFRD0iLUwkTElCUEwiCisgICAgICAgICAgICBmaQorICAgICAgICAgICAgZWNobyAiJExJQlBMVVNFRCAtTCRsaWJkaXIgJExJQlMgJExJTktGT1JTSEFSRURVU0VEIgorICAgICAgICA7OworZXNhYworZG9uZQpkaWZmIC0tZ2l0IGEvYmluL3B5dGhvbjIgYi9iaW4vcHl0aG9uMgpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44ZjdhM2MxCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3B5dGhvbjIKQEAgLTAsMCArMSBAQAorcHl0aG9uMi43ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluL3B5dGhvbjItY29uZmlnIGIvYmluL3B5dGhvbjItY29uZmlnCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjc4NWYzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vcHl0aG9uMi1jb25maWcKQEAgLTAsMCArMSBAQAorcHl0aG9uMi43LWNvbmZpZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Jpbi9weXRob24yLjcgYi9iaW4vcHl0aG9uMi43Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM1YmMzZjkKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vcHl0aG9uMi43CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Jpbi9weXRob24yLjctY29uZmlnIGIvYmluL3B5dGhvbjIuNy1jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGVjYjgyMQotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9weXRob24yLjctY29uZmlnCkBAIC0wLDAgKzEsNTcgQEAKKyMhL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0L2Jpbi9weXRob24yLjcKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgZ2V0b3B0Citmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCisKK3ZhbGlkX29wdHMgPSBbJ3ByZWZpeCcsICdleGVjLXByZWZpeCcsICdpbmNsdWRlcycsICdsaWJzJywgJ2NmbGFncycsCisgICAgICAgICAgICAgICdsZGZsYWdzJywgJ2hlbHAnXQorCitkZWYgZXhpdF93aXRoX3VzYWdlKGNvZGU9MSk6CisgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiVXNhZ2U6ICVzIFslc10iICUgKHN5cy5hcmd2WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcuam9pbignLS0nK29wdCBmb3Igb3B0IGluIHZhbGlkX29wdHMpKQorICAgIHN5cy5leGl0KGNvZGUpCisKK3RyeToKKyAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICcnLCB2YWxpZF9vcHRzKQorZXhjZXB0IGdldG9wdC5lcnJvcjoKKyAgICBleGl0X3dpdGhfdXNhZ2UoKQorCitpZiBub3Qgb3B0czoKKyAgICBleGl0X3dpdGhfdXNhZ2UoKQorCitweXZlciA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignVkVSU0lPTicpCitnZXR2YXIgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIKKworb3B0X2ZsYWdzID0gW2ZsYWcgZm9yIChmbGFnLCB2YWwpIGluIG9wdHNdCisKK2lmICctLWhlbHAnIGluIG9wdF9mbGFnczoKKyAgICBleGl0X3dpdGhfdXNhZ2UoY29kZT0wKQorCitmb3Igb3B0IGluIG9wdF9mbGFnczoKKyAgICBpZiBvcHQgPT0gJy0tcHJlZml4JzoKKyAgICAgICAgcHJpbnQgc3lzY29uZmlnLlBSRUZJWAorCisgICAgZWxpZiBvcHQgPT0gJy0tZXhlYy1wcmVmaXgnOgorICAgICAgICBwcmludCBzeXNjb25maWcuRVhFQ19QUkVGSVgKKworICAgIGVsaWYgb3B0IGluICgnLS1pbmNsdWRlcycsICctLWNmbGFncycpOgorICAgICAgICBmbGFncyA9IFsnLUknICsgc3lzY29uZmlnLmdldF9weXRob25faW5jKCksCisgICAgICAgICAgICAgICAgICctSScgKyBzeXNjb25maWcuZ2V0X3B5dGhvbl9pbmMocGxhdF9zcGVjaWZpYz1UcnVlKV0KKyAgICAgICAgaWYgb3B0ID09ICctLWNmbGFncyc6CisgICAgICAgICAgICBmbGFncy5leHRlbmQoZ2V0dmFyKCdDRkxBR1MnKS5zcGxpdCgpKQorICAgICAgICBwcmludCAnICcuam9pbihmbGFncykKKworICAgIGVsaWYgb3B0IGluICgnLS1saWJzJywgJy0tbGRmbGFncycpOgorICAgICAgICBsaWJzID0gZ2V0dmFyKCdMSUJTJykuc3BsaXQoKSArIGdldHZhcignU1lTTElCUycpLnNwbGl0KCkKKyAgICAgICAgbGlicy5hcHBlbmQoJy1scHl0aG9uJytweXZlcikKKyAgICAgICAgIyBhZGQgdGhlIHByZWZpeC9saWIvcHl0aG9uWC5ZL2NvbmZpZyBkaXIsIGJ1dCBvbmx5IGlmIHRoZXJlIGlzIG5vCisgICAgICAgICMgc2hhcmVkIGxpYnJhcnkgaW4gcHJlZml4L2xpYi8uCisgICAgICAgIGlmIG9wdCA9PSAnLS1sZGZsYWdzJzoKKyAgICAgICAgICAgIGlmIG5vdCBnZXR2YXIoJ1B5X0VOQUJMRV9TSEFSRUQnKToKKyAgICAgICAgICAgICAgICBsaWJzLmluc2VydCgwLCAnLUwnICsgZ2V0dmFyKCdMSUJQTCcpKQorICAgICAgICAgICAgaWYgbm90IGdldHZhcignUFlUSE9ORlJBTUVXT1JLJyk6CisgICAgICAgICAgICAgICAgbGlicy5leHRlbmQoZ2V0dmFyKCdMSU5LRk9SU0hBUkVEJykuc3BsaXQoKSkKKyAgICAgICAgcHJpbnQgJyAnLmpvaW4obGlicykKKwpkaWZmIC0tZ2l0IGEvYmluL3NtdHBkLnB5IGIvYmluL3NtdHBkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmNjhkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vc210cGQucHkKQEAgLTAsMCArMSw1NTUgQEAKKyMhL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0L2Jpbi9weXRob24yLjcKKyIiIkFuIFJGQyAyODIxIHNtdHAgcHJveHkuCisKK1VzYWdlOiAlKHByb2dyYW0pcyBbb3B0aW9uc10gW2xvY2FsaG9zdDpsb2NhbHBvcnQgW3JlbW90ZWhvc3Q6cmVtb3RlcG9ydF1dCisKK09wdGlvbnM6CisKKyAgICAtLW5vc2V0dWlkCisgICAgLW4KKyAgICAgICAgVGhpcyBwcm9ncmFtIGdlbmVyYWxseSB0cmllcyB0byBzZXR1aWQgYG5vYm9keScsIHVubGVzcyB0aGlzIGZsYWcgaXMKKyAgICAgICAgc2V0LiAgVGhlIHNldHVpZCBjYWxsIHdpbGwgZmFpbCBpZiB0aGlzIHByb2dyYW0gaXMgbm90IHJ1biBhcyByb290IChpbgorICAgICAgICB3aGljaCBjYXNlLCB1c2UgdGhpcyBmbGFnKS4KKworICAgIC0tdmVyc2lvbgorICAgIC1WCisgICAgICAgIFByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdC4KKworICAgIC0tY2xhc3MgY2xhc3NuYW1lCisgICAgLWMgY2xhc3NuYW1lCisgICAgICAgIFVzZSBgY2xhc3NuYW1lJyBhcyB0aGUgY29uY3JldGUgU01UUCBwcm94eSBjbGFzcy4gIFVzZXMgYFB1cmVQcm94eScgYnkKKyAgICAgICAgZGVmYXVsdC4KKworICAgIC0tZGVidWcKKyAgICAtZAorICAgICAgICBUdXJuIG9uIGRlYnVnZ2luZyBwcmludHMuCisKKyAgICAtLWhlbHAKKyAgICAtaAorICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQuCisKK1ZlcnNpb246ICUoX192ZXJzaW9uX18pcworCitJZiBsb2NhbGhvc3QgaXMgbm90IGdpdmVuIHRoZW4gYGxvY2FsaG9zdCcgaXMgdXNlZCwgYW5kIGlmIGxvY2FscG9ydCBpcyBub3QKK2dpdmVuIHRoZW4gODAyNSBpcyB1c2VkLiAgSWYgcmVtb3RlaG9zdCBpcyBub3QgZ2l2ZW4gdGhlbiBgbG9jYWxob3N0JyBpcyB1c2VkLAorYW5kIGlmIHJlbW90ZXBvcnQgaXMgbm90IGdpdmVuLCB0aGVuIDI1IGlzIHVzZWQuCisiIiIKKworIyBPdmVydmlldzoKKyMKKyMgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIG1pbmltYWwgU01UUCBwcm90b2NvbCBhcyBkZWZpbmVkIGluIFJGQyA4MjEuICBJdAorIyBoYXMgYSBoaWVyYXJjaHkgb2YgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhlIGJhY2tlbmQgZnVuY3Rpb25hbGl0eSBmb3IgdGhlCisjIHNtdHBkLiAgQSBudW1iZXIgb2YgY2xhc3NlcyBhcmUgcHJvdmlkZWQ6CisjCisjICAgU01UUFNlcnZlciAtIHRoZSBiYXNlIGNsYXNzIGZvciB0aGUgYmFja2VuZC4gIFJhaXNlcyBOb3RJbXBsZW1lbnRlZEVycm9yCisjICAgaWYgeW91IHRyeSB0byB1c2UgaXQuCisjCisjICAgRGVidWdnaW5nU2VydmVyIC0gc2ltcGx5IHByaW50cyBlYWNoIG1lc3NhZ2UgaXQgcmVjZWl2ZXMgb24gc3Rkb3V0LgorIworIyAgIFB1cmVQcm94eSAtIFByb3hpZXMgYWxsIG1lc3NhZ2VzIHRvIGEgcmVhbCBzbXRwZCB3aGljaCBkb2VzIGZpbmFsCisjICAgZGVsaXZlcnkuICBPbmUga25vd24gcHJvYmxlbSB3aXRoIHRoaXMgY2xhc3MgaXMgdGhhdCBpdCBkb2Vzbid0IGhhbmRsZQorIyAgIFNNVFAgZXJyb3JzIGZyb20gdGhlIGJhY2tlbmQgc2VydmVyIGF0IGFsbC4gIFRoaXMgc2hvdWxkIGJlIGZpeGVkCisjICAgKGNvbnRyaWJ1dGlvbnMgYXJlIHdlbGNvbWUhKS4KKyMKKyMgICBNYWlsbWFuUHJveHkgLSBBbiBleHBlcmltZW50YWwgaGFjayB0byB3b3JrIHdpdGggR05VIE1haWxtYW4KKyMgICA8d3d3Lmxpc3Qub3JnPi4gIFVzaW5nIHRoaXMgc2VydmVyIGFzIHlvdXIgcmVhbCBpbmNvbWluZyBzbXRwZCwgeW91cgorIyAgIG1haWxob3N0IHdpbGwgYXV0b21hdGljYWxseSByZWNvZ25pemUgYW5kIGFjY2VwdCBtYWlsIGRlc3RpbmVkIHRvIE1haWxtYW4KKyMgICBsaXN0cyB3aGVuIHRob3NlIGxpc3RzIGFyZSBjcmVhdGVkLiAgRXZlcnkgbWVzc2FnZSBub3QgZGVzdGluZWQgZm9yIGEgbGlzdAorIyAgIGdldHMgZm9yd2FyZGVkIHRvIGEgcmVhbCBiYWNrZW5kIHNtdHBkLCBhcyB3aXRoIFB1cmVQcm94eS4gIEFnYWluLCBlcnJvcnMKKyMgICBhcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5IHlldC4KKyMKKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHNjcmlwdCByZXF1aXJlcyBQeXRob24gMi4wCisjCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3IDxiYXJyeUBweXRob24ub3JnPgorIworIyBUT0RPOgorIworIyAtIHN1cHBvcnQgbWFpbGJveCBkZWxpdmVyeQorIyAtIGFsaWFzIGZpbGVzCisjIC0gRVNNVFAKKyMgLSBoYW5kbGUgZXJyb3IgY29kZXMgZnJvbSB0aGUgYmFja2VuZCBzbXRwZAorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBlcnJubworaW1wb3J0IGdldG9wdAoraW1wb3J0IHRpbWUKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBhc3luY29yZQoraW1wb3J0IGFzeW5jaGF0CisKK19fYWxsX18gPSBbIlNNVFBTZXJ2ZXIiLCJEZWJ1Z2dpbmdTZXJ2ZXIiLCJQdXJlUHJveHkiLCJNYWlsbWFuUHJveHkiXQorCitwcm9ncmFtID0gc3lzLmFyZ3ZbMF0KK19fdmVyc2lvbl9fID0gJ1B5dGhvbiBTTVRQIHByb3h5IHZlcnNpb24gMC4yJworCisKK2NsYXNzIERldm51bGw6CisgICAgZGVmIHdyaXRlKHNlbGYsIG1zZyk6IHBhc3MKKyAgICBkZWYgZmx1c2goc2VsZik6IHBhc3MKKworCitERUJVR1NUUkVBTSA9IERldm51bGwoKQorTkVXTElORSA9ICdcbicKK0VNUFRZU1RSSU5HID0gJycKK0NPTU1BU1BBQ0UgPSAnLCAnCisKKworZGVmIHVzYWdlKGNvZGUsIG1zZz0nJyk6CisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgX19kb2NfXyAlIGdsb2JhbHMoKQorICAgIGlmIG1zZzoKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCisgICAgc3lzLmV4aXQoY29kZSkKKworCitjbGFzcyBTTVRQQ2hhbm5lbChhc3luY2hhdC5hc3luY19jaGF0KToKKyAgICBDT01NQU5EID0gMAorICAgIERBVEEgPSAxCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyLCBjb25uLCBhZGRyKToKKyAgICAgICAgYXN5bmNoYXQuYXN5bmNfY2hhdC5fX2luaXRfXyhzZWxmLCBjb25uKQorICAgICAgICBzZWxmLl9fc2VydmVyID0gc2VydmVyCisgICAgICAgIHNlbGYuX19jb25uID0gY29ubgorICAgICAgICBzZWxmLl9fYWRkciA9IGFkZHIKKyAgICAgICAgc2VsZi5fX2xpbmUgPSBbXQorICAgICAgICBzZWxmLl9fc3RhdGUgPSBzZWxmLkNPTU1BTkQKKyAgICAgICAgc2VsZi5fX2dyZWV0aW5nID0gMAorICAgICAgICBzZWxmLl9fbWFpbGZyb20gPSBOb25lCisgICAgICAgIHNlbGYuX19yY3B0dG9zID0gW10KKyAgICAgICAgc2VsZi5fX2RhdGEgPSAnJworICAgICAgICBzZWxmLl9fZnFkbiA9IHNvY2tldC5nZXRmcWRuKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fX3BlZXIgPSBjb25uLmdldHBlZXJuYW1lKCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgorICAgICAgICAgICAgIyBhIHJhY2UgY29uZGl0aW9uICBtYXkgb2NjdXIgaWYgdGhlIG90aGVyIGVuZCBpcyBjbG9zaW5nCisgICAgICAgICAgICAjIGJlZm9yZSB3ZSBjYW4gZ2V0IHRoZSBwZWVybmFtZQorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICBpZiBlcnJbMF0gIT0gZXJybm8uRU5PVENPTk46CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ1BlZXI6JywgcmVwcihzZWxmLl9fcGVlcikKKyAgICAgICAgc2VsZi5wdXNoKCcyMjAgJXMgJXMnICUgKHNlbGYuX19mcWRuLCBfX3ZlcnNpb25fXykpCisgICAgICAgIHNlbGYuc2V0X3Rlcm1pbmF0b3IoJ1xyXG4nKQorCisgICAgIyBPdmVycmlkZXMgYmFzZSBjbGFzcyBmb3IgY29udmVuaWVuY2UKKyAgICBkZWYgcHVzaChzZWxmLCBtc2cpOgorICAgICAgICBhc3luY2hhdC5hc3luY19jaGF0LnB1c2goc2VsZiwgbXNnICsgJ1xyXG4nKQorCisgICAgIyBJbXBsZW1lbnRhdGlvbiBvZiBiYXNlIGNsYXNzIGFic3RyYWN0IG1ldGhvZAorICAgIGRlZiBjb2xsZWN0X2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX19saW5lLmFwcGVuZChkYXRhKQorCisgICAgIyBJbXBsZW1lbnRhdGlvbiBvZiBiYXNlIGNsYXNzIGFic3RyYWN0IG1ldGhvZAorICAgIGRlZiBmb3VuZF90ZXJtaW5hdG9yKHNlbGYpOgorICAgICAgICBsaW5lID0gRU1QVFlTVFJJTkcuam9pbihzZWxmLl9fbGluZSkKKyAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICdEYXRhOicsIHJlcHIobGluZSkKKyAgICAgICAgc2VsZi5fX2xpbmUgPSBbXQorICAgICAgICBpZiBzZWxmLl9fc3RhdGUgPT0gc2VsZi5DT01NQU5EOgorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDAgRXJyb3I6IGJhZCBzeW50YXgnKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgbWV0aG9kID0gTm9uZQorICAgICAgICAgICAgaSA9IGxpbmUuZmluZCgnICcpCisgICAgICAgICAgICBpZiBpIDwgMDoKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gbGluZS51cHBlcigpCisgICAgICAgICAgICAgICAgYXJnID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gbGluZVs6aV0udXBwZXIoKQorICAgICAgICAgICAgICAgIGFyZyA9IGxpbmVbaSsxOl0uc3RyaXAoKQorICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLCAnc210cF8nICsgY29tbWFuZCwgTm9uZSkKKyAgICAgICAgICAgIGlmIG5vdCBtZXRob2Q6CisgICAgICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDIgRXJyb3I6IGNvbW1hbmQgIiVzIiBub3QgaW1wbGVtZW50ZWQnICUgY29tbWFuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG1ldGhvZChhcmcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuX19zdGF0ZSAhPSBzZWxmLkRBVEE6CisgICAgICAgICAgICAgICAgc2VsZi5wdXNoKCc0NTEgSW50ZXJuYWwgY29uZnVzaW9uJykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICMgUmVtb3ZlIGV4dHJhbmVvdXMgY2FycmlhZ2UgcmV0dXJucyBhbmQgZGUtdHJhbnNwYXJlbmN5IGFjY29yZGluZworICAgICAgICAgICAgIyB0byBSRkMgODIxLCBTZWN0aW9uIDQuNS4yLgorICAgICAgICAgICAgZGF0YSA9IFtdCisgICAgICAgICAgICBmb3IgdGV4dCBpbiBsaW5lLnNwbGl0KCdcclxuJyk6CisgICAgICAgICAgICAgICAgaWYgdGV4dCBhbmQgdGV4dFswXSA9PSAnLic6CisgICAgICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKHRleHRbMTpdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKHRleHQpCisgICAgICAgICAgICBzZWxmLl9fZGF0YSA9IE5FV0xJTkUuam9pbihkYXRhKQorICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5fX3NlcnZlci5wcm9jZXNzX21lc3NhZ2Uoc2VsZi5fX3BlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fbWFpbGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fcmNwdHRvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19kYXRhKQorICAgICAgICAgICAgc2VsZi5fX3JjcHR0b3MgPSBbXQorICAgICAgICAgICAgc2VsZi5fX21haWxmcm9tID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fX3N0YXRlID0gc2VsZi5DT01NQU5ECisgICAgICAgICAgICBzZWxmLnNldF90ZXJtaW5hdG9yKCdcclxuJykKKyAgICAgICAgICAgIGlmIG5vdCBzdGF0dXM6CisgICAgICAgICAgICAgICAgc2VsZi5wdXNoKCcyNTAgT2snKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnB1c2goc3RhdHVzKQorCisgICAgIyBTTVRQIGFuZCBFU01UUCBjb21tYW5kcworICAgIGRlZiBzbXRwX0hFTE8oc2VsZiwgYXJnKToKKyAgICAgICAgaWYgbm90IGFyZzoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAxIFN5bnRheDogSEVMTyBob3N0bmFtZScpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fX2dyZWV0aW5nOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDMgRHVwbGljYXRlIEhFTE8vRUhMTycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fZ3JlZXRpbmcgPSBhcmcKKyAgICAgICAgICAgIHNlbGYucHVzaCgnMjUwICVzJyAlIHNlbGYuX19mcWRuKQorCisgICAgZGVmIHNtdHBfTk9PUChzZWxmLCBhcmcpOgorICAgICAgICBpZiBhcmc6CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMSBTeW50YXg6IE5PT1AnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wdXNoKCcyNTAgT2snKQorCisgICAgZGVmIHNtdHBfUVVJVChzZWxmLCBhcmcpOgorICAgICAgICAjIGFyZ3MgaXMgaWdub3JlZAorICAgICAgICBzZWxmLnB1c2goJzIyMSBCeWUnKQorICAgICAgICBzZWxmLmNsb3NlX3doZW5fZG9uZSgpCisKKyAgICAjIGZhY3RvcmVkCisgICAgZGVmIF9fZ2V0YWRkcihzZWxmLCBrZXl3b3JkLCBhcmcpOgorICAgICAgICBhZGRyZXNzID0gTm9uZQorICAgICAgICBrZXlsZW4gPSBsZW4oa2V5d29yZCkKKyAgICAgICAgaWYgYXJnWzprZXlsZW5dLnVwcGVyKCkgPT0ga2V5d29yZDoKKyAgICAgICAgICAgIGFkZHJlc3MgPSBhcmdba2V5bGVuOl0uc3RyaXAoKQorICAgICAgICAgICAgaWYgbm90IGFkZHJlc3M6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZiBhZGRyZXNzWzBdID09ICc8JyBhbmQgYWRkcmVzc1stMV0gPT0gJz4nIGFuZCBhZGRyZXNzICE9ICc8Pic6CisgICAgICAgICAgICAgICAgIyBBZGRyZXNzZXMgY2FuIGJlIGluIHRoZSBmb3JtIDxwZXJzb25AZG9tLmNvbT4gYnV0IHdhdGNoIG91dAorICAgICAgICAgICAgICAgICMgZm9yIG51bGwgYWRkcmVzcywgZS5nLiA8PgorICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzWzE6LTFdCisgICAgICAgIHJldHVybiBhZGRyZXNzCisKKyAgICBkZWYgc210cF9NQUlMKHNlbGYsIGFyZyk6CisgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnPT09PiBNQUlMJywgYXJnCisgICAgICAgIGFkZHJlc3MgPSBzZWxmLl9fZ2V0YWRkcignRlJPTTonLCBhcmcpIGlmIGFyZyBlbHNlIE5vbmUKKyAgICAgICAgaWYgbm90IGFkZHJlc3M6CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMSBTeW50YXg6IE1BSUwgRlJPTTo8YWRkcmVzcz4nKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuX19tYWlsZnJvbToKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAzIEVycm9yOiBuZXN0ZWQgTUFJTCBjb21tYW5kJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9fbWFpbGZyb20gPSBhZGRyZXNzCisgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnc2VuZGVyOicsIHNlbGYuX19tYWlsZnJvbQorICAgICAgICBzZWxmLnB1c2goJzI1MCBPaycpCisKKyAgICBkZWYgc210cF9SQ1BUKHNlbGYsIGFyZyk6CisgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnPT09PiBSQ1BUJywgYXJnCisgICAgICAgIGlmIG5vdCBzZWxmLl9fbWFpbGZyb206CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMyBFcnJvcjogbmVlZCBNQUlMIGNvbW1hbmQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGFkZHJlc3MgPSBzZWxmLl9fZ2V0YWRkcignVE86JywgYXJnKSBpZiBhcmcgZWxzZSBOb25lCisgICAgICAgIGlmIG5vdCBhZGRyZXNzOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDEgU3ludGF4OiBSQ1BUIFRPOiA8YWRkcmVzcz4nKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX19yY3B0dG9zLmFwcGVuZChhZGRyZXNzKQorICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ3JlY2lwczonLCBzZWxmLl9fcmNwdHRvcworICAgICAgICBzZWxmLnB1c2goJzI1MCBPaycpCisKKyAgICBkZWYgc210cF9SU0VUKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIGFyZzoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAxIFN5bnRheDogUlNFVCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBSZXNldHMgdGhlIHNlbmRlciwgcmVjaXBpZW50cywgYW5kIGRhdGEsIGJ1dCBub3QgdGhlIGdyZWV0aW5nCisgICAgICAgIHNlbGYuX19tYWlsZnJvbSA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3JjcHR0b3MgPSBbXQorICAgICAgICBzZWxmLl9fZGF0YSA9ICcnCisgICAgICAgIHNlbGYuX19zdGF0ZSA9IHNlbGYuQ09NTUFORAorICAgICAgICBzZWxmLnB1c2goJzI1MCBPaycpCisKKyAgICBkZWYgc210cF9EQVRBKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9fcmNwdHRvczoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAzIEVycm9yOiBuZWVkIFJDUFQgY29tbWFuZCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgYXJnOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDEgU3ludGF4OiBEQVRBJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9fc3RhdGUgPSBzZWxmLkRBVEEKKyAgICAgICAgc2VsZi5zZXRfdGVybWluYXRvcignXHJcbi5cclxuJykKKyAgICAgICAgc2VsZi5wdXNoKCczNTQgRW5kIGRhdGEgd2l0aCA8Q1I+PExGPi48Q1I+PExGPicpCisKKworY2xhc3MgU01UUFNlcnZlcihhc3luY29yZS5kaXNwYXRjaGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jYWxhZGRyLCByZW1vdGVhZGRyKToKKyAgICAgICAgc2VsZi5fbG9jYWxhZGRyID0gbG9jYWxhZGRyCisgICAgICAgIHNlbGYuX3JlbW90ZWFkZHIgPSByZW1vdGVhZGRyCisgICAgICAgIGFzeW5jb3JlLmRpc3BhdGNoZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jcmVhdGVfc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICAgICAjIHRyeSB0byByZS11c2UgYSBzZXJ2ZXIgcG9ydCBpZiBwb3NzaWJsZQorICAgICAgICAgICAgc2VsZi5zZXRfcmV1c2VfYWRkcigpCisgICAgICAgICAgICBzZWxmLmJpbmQobG9jYWxhZGRyKQorICAgICAgICAgICAgc2VsZi5saXN0ZW4oNSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgIyBjbGVhbnVwIGFzeW5jb3JlLnNvY2tldF9tYXAgYmVmb3JlIHJhaXNpbmcKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCBcCisgICAgICAgICAgICAgICAgICAnJXMgc3RhcnRlZCBhdCAlc1xuXHRMb2NhbCBhZGRyOiAlc1xuXHRSZW1vdGUgYWRkcjolcycgJSAoCisgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHRpbWUuY3RpbWUodGltZS50aW1lKCkpLAorICAgICAgICAgICAgICAgIGxvY2FsYWRkciwgcmVtb3RlYWRkcikKKworICAgIGRlZiBoYW5kbGVfYWNjZXB0KHNlbGYpOgorICAgICAgICBwYWlyID0gc2VsZi5hY2NlcHQoKQorICAgICAgICBpZiBwYWlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29ubiwgYWRkciA9IHBhaXIKKyAgICAgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnSW5jb21pbmcgY29ubmVjdGlvbiBmcm9tICVzJyAlIHJlcHIoYWRkcikKKyAgICAgICAgICAgIGNoYW5uZWwgPSBTTVRQQ2hhbm5lbChzZWxmLCBjb25uLCBhZGRyKQorCisgICAgIyBBUEkgZm9yICJkb2luZyBzb21ldGhpbmcgdXNlZnVsIHdpdGggdGhlIG1lc3NhZ2UiCisgICAgZGVmIHByb2Nlc3NfbWVzc2FnZShzZWxmLCBwZWVyLCBtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSk6CisgICAgICAgICIiIk92ZXJyaWRlIHRoaXMgYWJzdHJhY3QgbWV0aG9kIHRvIGhhbmRsZSBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQuCisKKyAgICAgICAgcGVlciBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgKGlwYWRkciwgcG9ydCkgb2YgdGhlIGNsaWVudCB0aGF0IG1hZGUgdGhlCisgICAgICAgIHNvY2tldCBjb25uZWN0aW9uIHRvIG91ciBzbXRwIHBvcnQuCisKKyAgICAgICAgbWFpbGZyb20gaXMgdGhlIHJhdyBhZGRyZXNzIHRoZSBjbGllbnQgY2xhaW1zIHRoZSBtZXNzYWdlIGlzIGNvbWluZworICAgICAgICBmcm9tLgorCisgICAgICAgIHJjcHR0b3MgaXMgYSBsaXN0IG9mIHJhdyBhZGRyZXNzZXMgdGhlIGNsaWVudCB3aXNoZXMgdG8gZGVsaXZlciB0aGUKKyAgICAgICAgbWVzc2FnZSB0by4KKworICAgICAgICBkYXRhIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVudGlyZSBmdWxsIHRleHQgb2YgdGhlIG1lc3NhZ2UsCisgICAgICAgIGhlYWRlcnMgKGlmIHN1cHBsaWVkKSBhbmQgYWxsLiAgSXQgaGFzIGJlZW4gYGRlLXRyYW5zcGFyZW5jaWVkJworICAgICAgICBhY2NvcmRpbmcgdG8gUkZDIDgyMSwgU2VjdGlvbiA0LjUuMi4gIEluIG90aGVyIHdvcmRzLCBhIGxpbmUKKyAgICAgICAgY29udGFpbmluZyBhIGAuJyBmb2xsb3dlZCBieSBvdGhlciB0ZXh0IGhhcyBoYWQgdGhlIGxlYWRpbmcgZG90CisgICAgICAgIHJlbW92ZWQuCisKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIE5vbmUsIGZvciBhIG5vcm1hbCBgMjUwIE9rJyByZXNwb25zZTsKKyAgICAgICAgb3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIGRlc2lyZWQgcmVzcG9uc2Ugc3RyaW5nIGluIFJGQyA4MjEgZm9ybWF0LgorCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworY2xhc3MgRGVidWdnaW5nU2VydmVyKFNNVFBTZXJ2ZXIpOgorICAgICMgRG8gc29tZXRoaW5nIHdpdGggdGhlIGdhdGhlcmVkIG1lc3NhZ2UKKyAgICBkZWYgcHJvY2Vzc19tZXNzYWdlKHNlbGYsIHBlZXIsIG1haWxmcm9tLCByY3B0dG9zLCBkYXRhKToKKyAgICAgICAgaW5oZWFkZXJzID0gMQorICAgICAgICBsaW5lcyA9IGRhdGEuc3BsaXQoJ1xuJykKKyAgICAgICAgcHJpbnQgJy0tLS0tLS0tLS0gTUVTU0FHRSBGT0xMT1dTIC0tLS0tLS0tLS0nCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgIyBoZWFkZXJzIGZpcnN0CisgICAgICAgICAgICBpZiBpbmhlYWRlcnMgYW5kIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHByaW50ICdYLVBlZXI6JywgcGVlclswXQorICAgICAgICAgICAgICAgIGluaGVhZGVycyA9IDAKKyAgICAgICAgICAgIHByaW50IGxpbmUKKyAgICAgICAgcHJpbnQgJy0tLS0tLS0tLS0tLSBFTkQgTUVTU0FHRSAtLS0tLS0tLS0tLS0nCisKKworY2xhc3MgUHVyZVByb3h5KFNNVFBTZXJ2ZXIpOgorICAgIGRlZiBwcm9jZXNzX21lc3NhZ2Uoc2VsZiwgcGVlciwgbWFpbGZyb20sIHJjcHR0b3MsIGRhdGEpOgorICAgICAgICBsaW5lcyA9IGRhdGEuc3BsaXQoJ1xuJykKKyAgICAgICAgIyBMb29rIGZvciB0aGUgbGFzdCBoZWFkZXIKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaSArPSAxCisgICAgICAgIGxpbmVzLmluc2VydChpLCAnWC1QZWVyOiAlcycgJSBwZWVyWzBdKQorICAgICAgICBkYXRhID0gTkVXTElORS5qb2luKGxpbmVzKQorICAgICAgICByZWZ1c2VkID0gc2VsZi5fZGVsaXZlcihtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSkKKyAgICAgICAgIyBUQkQ6IHdoYXQgdG8gZG8gd2l0aCByZWZ1c2VkIGFkZHJlc3Nlcz8KKyAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICd3ZSBnb3Qgc29tZSByZWZ1c2FsczonLCByZWZ1c2VkCisKKyAgICBkZWYgX2RlbGl2ZXIoc2VsZiwgbWFpbGZyb20sIHJjcHR0b3MsIGRhdGEpOgorICAgICAgICBpbXBvcnQgc210cGxpYgorICAgICAgICByZWZ1c2VkID0ge30KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcyA9IHNtdHBsaWIuU01UUCgpCisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5fcmVtb3RlYWRkclswXSwgc2VsZi5fcmVtb3RlYWRkclsxXSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWZ1c2VkID0gcy5zZW5kbWFpbChtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5xdWl0KCkKKyAgICAgICAgZXhjZXB0IHNtdHBsaWIuU01UUFJlY2lwaWVudHNSZWZ1c2VkLCBlOgorICAgICAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICdnb3QgU01UUFJlY2lwaWVudHNSZWZ1c2VkJworICAgICAgICAgICAgcmVmdXNlZCA9IGUucmVjaXBpZW50cworICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgc210cGxpYi5TTVRQRXhjZXB0aW9uKSwgZToKKyAgICAgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnZ290JywgZS5fX2NsYXNzX18KKyAgICAgICAgICAgICMgQWxsIHJlY2lwaWVudHMgd2VyZSByZWZ1c2VkLiAgSWYgdGhlIGV4Y2VwdGlvbiBoYWQgYW4gYXNzb2NpYXRlZAorICAgICAgICAgICAgIyBlcnJvciBjb2RlLCB1c2UgaXQuICBPdGhlcndpc2UsZmFrZSBpdCB3aXRoIGEgbm9uLXRyaWdnZXJpbmcKKyAgICAgICAgICAgICMgZXhjZXB0aW9uIGNvZGUuCisgICAgICAgICAgICBlcnJjb2RlID0gZ2V0YXR0cihlLCAnc210cF9jb2RlJywgLTEpCisgICAgICAgICAgICBlcnJtc2cgPSBnZXRhdHRyKGUsICdzbXRwX2Vycm9yJywgJ2lnbm9yZScpCisgICAgICAgICAgICBmb3IgciBpbiByY3B0dG9zOgorICAgICAgICAgICAgICAgIHJlZnVzZWRbcl0gPSAoZXJyY29kZSwgZXJybXNnKQorICAgICAgICByZXR1cm4gcmVmdXNlZAorCisKK2NsYXNzIE1haWxtYW5Qcm94eShQdXJlUHJveHkpOgorICAgIGRlZiBwcm9jZXNzX21lc3NhZ2Uoc2VsZiwgcGVlciwgbWFpbGZyb20sIHJjcHR0b3MsIGRhdGEpOgorICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgZnJvbSBNYWlsbWFuIGltcG9ydCBVdGlscworICAgICAgICBmcm9tIE1haWxtYW4gaW1wb3J0IE1lc3NhZ2UKKyAgICAgICAgZnJvbSBNYWlsbWFuIGltcG9ydCBNYWlsTGlzdAorICAgICAgICAjIElmIHRoZSBtZXNzYWdlIGlzIHRvIGEgTWFpbG1hbiBtYWlsaW5nIGxpc3QsIHRoZW4gd2UnbGwgaW52b2tlIHRoZQorICAgICAgICAjIE1haWxtYW4gc2NyaXB0IGRpcmVjdGx5LCB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIHJlYWwgc210cGQuCisgICAgICAgICMgT3RoZXJ3aXNlIHdlJ2xsIGZvcndhcmQgaXQgdG8gdGhlIGxvY2FsIHByb3h5IGZvciBkaXNwb3NpdGlvbi4KKyAgICAgICAgbGlzdG5hbWVzID0gW10KKyAgICAgICAgZm9yIHJjcHQgaW4gcmNwdHRvczoKKyAgICAgICAgICAgIGxvY2FsID0gcmNwdC5sb3dlcigpLnNwbGl0KCdAJylbMF0KKyAgICAgICAgICAgICMgV2UgYWxsb3cgdGhlIGZvbGxvd2luZyB2YXJpYXRpb25zIG9uIHRoZSB0aGVtZQorICAgICAgICAgICAgIyAgIGxpc3RuYW1lCisgICAgICAgICAgICAjICAgbGlzdG5hbWUtYWRtaW4KKyAgICAgICAgICAgICMgICBsaXN0bmFtZS1vd25lcgorICAgICAgICAgICAgIyAgIGxpc3RuYW1lLXJlcXVlc3QKKyAgICAgICAgICAgICMgICBsaXN0bmFtZS1qb2luCisgICAgICAgICAgICAjICAgbGlzdG5hbWUtbGVhdmUKKyAgICAgICAgICAgIHBhcnRzID0gbG9jYWwuc3BsaXQoJy0nKQorICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA+IDI6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxpc3RuYW1lID0gcGFydHNbMF0KKyAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMjoKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gcGFydHNbMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29tbWFuZCA9ICcnCisgICAgICAgICAgICBpZiBub3QgVXRpbHMubGlzdF9leGlzdHMobGlzdG5hbWUpIG9yIGNvbW1hbmQgbm90IGluICgKKyAgICAgICAgICAgICAgICAgICAgJycsICdhZG1pbicsICdvd25lcicsICdyZXF1ZXN0JywgJ2pvaW4nLCAnbGVhdmUnKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbGlzdG5hbWVzLmFwcGVuZCgocmNwdCwgbGlzdG5hbWUsIGNvbW1hbmQpKQorICAgICAgICAjIFJlbW92ZSBhbGwgbGlzdCByZWNpcGllbnRzIGZyb20gcmNwdHRvcyBhbmQgZm9yd2FyZCB3aGF0IHdlJ3JlIG5vdAorICAgICAgICAjIGdvaW5nIHRvIHRha2UgY2FyZSBvZiBvdXJzZWx2ZXMuICBMaW5lYXIgcmVtb3ZhbCBzaG91bGQgYmUgZmluZQorICAgICAgICAjIHNpbmNlIHdlIGRvbid0IGV4cGVjdCBhIGxhcmdlIG51bWJlciBvZiByZWNpcGllbnRzLgorICAgICAgICBmb3IgcmNwdCwgbGlzdG5hbWUsIGNvbW1hbmQgaW4gbGlzdG5hbWVzOgorICAgICAgICAgICAgcmNwdHRvcy5yZW1vdmUocmNwdCkKKyAgICAgICAgIyBJZiB0aGVyZSdzIGFueSBub24tbGlzdCBkZXN0aW5lZCByZWNpcGllbnRzIGxlZnQsCisgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnZm9yd2FyZGluZyByZWNpcHM6JywgJyAnLmpvaW4ocmNwdHRvcykKKyAgICAgICAgaWYgcmNwdHRvczoKKyAgICAgICAgICAgIHJlZnVzZWQgPSBzZWxmLl9kZWxpdmVyKG1haWxmcm9tLCByY3B0dG9zLCBkYXRhKQorICAgICAgICAgICAgIyBUQkQ6IHdoYXQgdG8gZG8gd2l0aCByZWZ1c2VkIGFkZHJlc3Nlcz8KKyAgICAgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnd2UgZ290IHJlZnVzYWxzOicsIHJlZnVzZWQKKyAgICAgICAgIyBOb3cgZGVsaXZlciBkaXJlY3RseSB0byB0aGUgbGlzdCBjb21tYW5kcworICAgICAgICBtbGlzdHMgPSB7fQorICAgICAgICBzID0gU3RyaW5nSU8oZGF0YSkKKyAgICAgICAgbXNnID0gTWVzc2FnZS5NZXNzYWdlKHMpCisgICAgICAgICMgVGhlc2UgaGVhZGVycyBhcmUgcmVxdWlyZWQgZm9yIHRoZSBwcm9wZXIgZXhlY3V0aW9uIG9mIE1haWxtYW4uICBBbGwKKyAgICAgICAgIyBNVEFzIGluIGV4aXN0ZW5jZSBzZWVtIHRvIGFkZCB0aGVzZSBpZiB0aGUgb3JpZ2luYWwgbWVzc2FnZSBkb2Vzbid0CisgICAgICAgICMgaGF2ZSB0aGVtLgorICAgICAgICBpZiBub3QgbXNnLmdldGhlYWRlcignZnJvbScpOgorICAgICAgICAgICAgbXNnWydGcm9tJ10gPSBtYWlsZnJvbQorICAgICAgICBpZiBub3QgbXNnLmdldGhlYWRlcignZGF0ZScpOgorICAgICAgICAgICAgbXNnWydEYXRlJ10gPSB0aW1lLmN0aW1lKHRpbWUudGltZSgpKQorICAgICAgICBmb3IgcmNwdCwgbGlzdG5hbWUsIGNvbW1hbmQgaW4gbGlzdG5hbWVzOgorICAgICAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICdzZW5kaW5nIG1lc3NhZ2UgdG8nLCByY3B0CisgICAgICAgICAgICBtbGlzdCA9IG1saXN0cy5nZXQobGlzdG5hbWUpCisgICAgICAgICAgICBpZiBub3QgbWxpc3Q6CisgICAgICAgICAgICAgICAgbWxpc3QgPSBNYWlsTGlzdC5NYWlsTGlzdChsaXN0bmFtZSwgbG9jaz0wKQorICAgICAgICAgICAgICAgIG1saXN0c1tsaXN0bmFtZV0gPSBtbGlzdAorICAgICAgICAgICAgIyBkaXNwYXRjaCBvbiB0aGUgdHlwZSBvZiBjb21tYW5kCisgICAgICAgICAgICBpZiBjb21tYW5kID09ICcnOgorICAgICAgICAgICAgICAgICMgcG9zdAorICAgICAgICAgICAgICAgIG1zZy5FbnF1ZXVlKG1saXN0LCB0b2xpc3Q9MSkKKyAgICAgICAgICAgIGVsaWYgY29tbWFuZCA9PSAnYWRtaW4nOgorICAgICAgICAgICAgICAgIG1zZy5FbnF1ZXVlKG1saXN0LCB0b2FkbWluPTEpCisgICAgICAgICAgICBlbGlmIGNvbW1hbmQgPT0gJ293bmVyJzoKKyAgICAgICAgICAgICAgICBtc2cuRW5xdWV1ZShtbGlzdCwgdG9vd25lcj0xKQorICAgICAgICAgICAgZWxpZiBjb21tYW5kID09ICdyZXF1ZXN0JzoKKyAgICAgICAgICAgICAgICBtc2cuRW5xdWV1ZShtbGlzdCwgdG9yZXF1ZXN0PTEpCisgICAgICAgICAgICBlbGlmIGNvbW1hbmQgaW4gKCdqb2luJywgJ2xlYXZlJyk6CisgICAgICAgICAgICAgICAgIyBUQkQ6IHRoaXMgaXMgYSBoYWNrIQorICAgICAgICAgICAgICAgIGlmIGNvbW1hbmQgPT0gJ2pvaW4nOgorICAgICAgICAgICAgICAgICAgICBtc2dbJ1N1YmplY3QnXSA9ICdzdWJzY3JpYmUnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbXNnWydTdWJqZWN0J10gPSAndW5zdWJzY3JpYmUnCisgICAgICAgICAgICAgICAgbXNnLkVucXVldWUobWxpc3QsIHRvcmVxdWVzdD0xKQorCisKK2NsYXNzIE9wdGlvbnM6CisgICAgc2V0dWlkID0gMQorICAgIGNsYXNzbmFtZSA9ICdQdXJlUHJveHknCisKKworZGVmIHBhcnNlYXJncygpOgorICAgIGdsb2JhbCBERUJVR1NUUkVBTQorICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoCisgICAgICAgICAgICBzeXMuYXJndlsxOl0sICduVmhjOmQnLAorICAgICAgICAgICAgWydjbGFzcz0nLCAnbm9zZXR1aWQnLCAndmVyc2lvbicsICdoZWxwJywgJ2RlYnVnJ10pCisgICAgZXhjZXB0IGdldG9wdC5lcnJvciwgZToKKyAgICAgICAgdXNhZ2UoMSwgZSkKKworICAgIG9wdGlvbnMgPSBPcHRpb25zKCkKKyAgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKKyAgICAgICAgaWYgb3B0IGluICgnLWgnLCAnLS1oZWxwJyk6CisgICAgICAgICAgICB1c2FnZSgwKQorICAgICAgICBlbGlmIG9wdCBpbiAoJy1WJywgJy0tdmVyc2lvbicpOgorICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgX192ZXJzaW9uX18KKyAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgICAgIGVsaWYgb3B0IGluICgnLW4nLCAnLS1ub3NldHVpZCcpOgorICAgICAgICAgICAgb3B0aW9ucy5zZXR1aWQgPSAwCisgICAgICAgIGVsaWYgb3B0IGluICgnLWMnLCAnLS1jbGFzcycpOgorICAgICAgICAgICAgb3B0aW9ucy5jbGFzc25hbWUgPSBhcmcKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctZCcsICctLWRlYnVnJyk6CisgICAgICAgICAgICBERUJVR1NUUkVBTSA9IHN5cy5zdGRlcnIKKworICAgICMgcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cworICAgIGlmIGxlbihhcmdzKSA8IDE6CisgICAgICAgIGxvY2Fsc3BlYyA9ICdsb2NhbGhvc3Q6ODAyNScKKyAgICAgICAgcmVtb3Rlc3BlYyA9ICdsb2NhbGhvc3Q6MjUnCisgICAgZWxpZiBsZW4oYXJncykgPCAyOgorICAgICAgICBsb2NhbHNwZWMgPSBhcmdzWzBdCisgICAgICAgIHJlbW90ZXNwZWMgPSAnbG9jYWxob3N0OjI1JworICAgIGVsaWYgbGVuKGFyZ3MpIDwgMzoKKyAgICAgICAgbG9jYWxzcGVjID0gYXJnc1swXQorICAgICAgICByZW1vdGVzcGVjID0gYXJnc1sxXQorICAgIGVsc2U6CisgICAgICAgIHVzYWdlKDEsICdJbnZhbGlkIGFyZ3VtZW50czogJXMnICUgQ09NTUFTUEFDRS5qb2luKGFyZ3MpKQorCisgICAgIyBzcGxpdCBpbnRvIGhvc3QvcG9ydCBwYWlycworICAgIGkgPSBsb2NhbHNwZWMuZmluZCgnOicpCisgICAgaWYgaSA8IDA6CisgICAgICAgIHVzYWdlKDEsICdCYWQgbG9jYWwgc3BlYzogJXMnICUgbG9jYWxzcGVjKQorICAgIG9wdGlvbnMubG9jYWxob3N0ID0gbG9jYWxzcGVjWzppXQorICAgIHRyeToKKyAgICAgICAgb3B0aW9ucy5sb2NhbHBvcnQgPSBpbnQobG9jYWxzcGVjW2krMTpdKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICB1c2FnZSgxLCAnQmFkIGxvY2FsIHBvcnQ6ICVzJyAlIGxvY2Fsc3BlYykKKyAgICBpID0gcmVtb3Rlc3BlYy5maW5kKCc6JykKKyAgICBpZiBpIDwgMDoKKyAgICAgICAgdXNhZ2UoMSwgJ0JhZCByZW1vdGUgc3BlYzogJXMnICUgcmVtb3Rlc3BlYykKKyAgICBvcHRpb25zLnJlbW90ZWhvc3QgPSByZW1vdGVzcGVjWzppXQorICAgIHRyeToKKyAgICAgICAgb3B0aW9ucy5yZW1vdGVwb3J0ID0gaW50KHJlbW90ZXNwZWNbaSsxOl0pCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHVzYWdlKDEsICdCYWQgcmVtb3RlIHBvcnQ6ICVzJyAlIHJlbW90ZXNwZWMpCisgICAgcmV0dXJuIG9wdGlvbnMKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG9wdGlvbnMgPSBwYXJzZWFyZ3MoKQorICAgICMgQmVjb21lIG5vYm9keQorICAgIGNsYXNzbmFtZSA9IG9wdGlvbnMuY2xhc3NuYW1lCisgICAgaWYgIi4iIGluIGNsYXNzbmFtZToKKyAgICAgICAgbGFzdGRvdCA9IGNsYXNzbmFtZS5yZmluZCgiLiIpCisgICAgICAgIG1vZCA9IF9faW1wb3J0X18oY2xhc3NuYW1lWzpsYXN0ZG90XSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWyIiXSkKKyAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lW2xhc3Rkb3QrMTpdCisgICAgZWxzZToKKyAgICAgICAgaW1wb3J0IF9fbWFpbl9fIGFzIG1vZAorICAgIGNsYXNzXyA9IGdldGF0dHIobW9kLCBjbGFzc25hbWUpCisgICAgcHJveHkgPSBjbGFzc18oKG9wdGlvbnMubG9jYWxob3N0LCBvcHRpb25zLmxvY2FscG9ydCksCisgICAgICAgICAgICAgICAgICAgKG9wdGlvbnMucmVtb3RlaG9zdCwgb3B0aW9ucy5yZW1vdGVwb3J0KSkKKyAgICBpZiBvcHRpb25zLnNldHVpZDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHB3ZAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBcCisgICAgICAgICAgICAgICAgICAnQ2Fubm90IGltcG9ydCBtb2R1bGUgInB3ZCI7IHRyeSBydW5uaW5nIHdpdGggLW4gb3B0aW9uLicKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIG5vYm9keSA9IHB3ZC5nZXRwd25hbSgnbm9ib2R5JylbMl0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3Muc2V0dWlkKG5vYm9keSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVQRVJNOiByYWlzZQorICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgXAorICAgICAgICAgICAgICAgICAgJ0Nhbm5vdCBzZXR1aWQgIm5vYm9keSI7IHRyeSBydW5uaW5nIHdpdGggLW4gb3B0aW9uLicKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgdHJ5OgorICAgICAgICBhc3luY29yZS5sb29wKCkKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L1B5dGhvbi1hc3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L1B5dGhvbi1hc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjM1YmJiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvUHl0aG9uLWFzdC5oCkBAIC0wLDAgKzEsNTM1IEBACisvKiBGaWxlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFBhcnNlci9hc2RsX2MucHkuICovCisKKyNpbmNsdWRlICJhc2RsLmgiCisKK3R5cGVkZWYgc3RydWN0IF9tb2QgKm1vZF90eTsKKwordHlwZWRlZiBzdHJ1Y3QgX3N0bXQgKnN0bXRfdHk7CisKK3R5cGVkZWYgc3RydWN0IF9leHByICpleHByX3R5OworCit0eXBlZGVmIGVudW0gX2V4cHJfY29udGV4dCB7IExvYWQ9MSwgU3RvcmU9MiwgRGVsPTMsIEF1Z0xvYWQ9NCwgQXVnU3RvcmU9NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW09NiB9IGV4cHJfY29udGV4dF90eTsKKwordHlwZWRlZiBzdHJ1Y3QgX3NsaWNlICpzbGljZV90eTsKKwordHlwZWRlZiBlbnVtIF9ib29sb3AgeyBBbmQ9MSwgT3I9MiB9IGJvb2xvcF90eTsKKwordHlwZWRlZiBlbnVtIF9vcGVyYXRvciB7IEFkZD0xLCBTdWI9MiwgTXVsdD0zLCBEaXY9NCwgTW9kPTUsIFBvdz02LCBMU2hpZnQ9NywKKyAgICAgICAgICAgICAgICAgICAgICAgICBSU2hpZnQ9OCwgQml0T3I9OSwgQml0WG9yPTEwLCBCaXRBbmQ9MTEsIEZsb29yRGl2PTEyIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvcl90eTsKKwordHlwZWRlZiBlbnVtIF91bmFyeW9wIHsgSW52ZXJ0PTEsIE5vdD0yLCBVQWRkPTMsIFVTdWI9NCB9IHVuYXJ5b3BfdHk7CisKK3R5cGVkZWYgZW51bSBfY21wb3AgeyBFcT0xLCBOb3RFcT0yLCBMdD0zLCBMdEU9NCwgR3Q9NSwgR3RFPTYsIElzPTcsIElzTm90PTgsCisgICAgICAgICAgICAgICAgICAgICAgSW49OSwgTm90SW49MTAgfSBjbXBvcF90eTsKKwordHlwZWRlZiBzdHJ1Y3QgX2NvbXByZWhlbnNpb24gKmNvbXByZWhlbnNpb25fdHk7CisKK3R5cGVkZWYgc3RydWN0IF9leGNlcHRoYW5kbGVyICpleGNlcHRoYW5kbGVyX3R5OworCit0eXBlZGVmIHN0cnVjdCBfYXJndW1lbnRzICphcmd1bWVudHNfdHk7CisKK3R5cGVkZWYgc3RydWN0IF9rZXl3b3JkICprZXl3b3JkX3R5OworCit0eXBlZGVmIHN0cnVjdCBfYWxpYXMgKmFsaWFzX3R5OworCisKK2VudW0gX21vZF9raW5kIHtNb2R1bGVfa2luZD0xLCBJbnRlcmFjdGl2ZV9raW5kPTIsIEV4cHJlc3Npb25fa2luZD0zLAorICAgICAgICAgICAgICAgICBTdWl0ZV9raW5kPTR9Oworc3RydWN0IF9tb2QgeworICAgICAgICBlbnVtIF9tb2Rfa2luZCBraW5kOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpib2R5OworICAgICAgICAgICAgICAgIH0gTW9kdWxlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYm9keTsKKyAgICAgICAgICAgICAgICB9IEludGVyYWN0aXZlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGJvZHk7CisgICAgICAgICAgICAgICAgfSBFeHByZXNzaW9uOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYm9keTsKKyAgICAgICAgICAgICAgICB9IFN1aXRlOworICAgICAgICAgICAgICAgIAorICAgICAgICB9IHY7Cit9OworCitlbnVtIF9zdG10X2tpbmQge0Z1bmN0aW9uRGVmX2tpbmQ9MSwgQ2xhc3NEZWZfa2luZD0yLCBSZXR1cm5fa2luZD0zLAorICAgICAgICAgICAgICAgICAgRGVsZXRlX2tpbmQ9NCwgQXNzaWduX2tpbmQ9NSwgQXVnQXNzaWduX2tpbmQ9NiwgUHJpbnRfa2luZD03LAorICAgICAgICAgICAgICAgICAgRm9yX2tpbmQ9OCwgV2hpbGVfa2luZD05LCBJZl9raW5kPTEwLCBXaXRoX2tpbmQ9MTEsCisgICAgICAgICAgICAgICAgICBSYWlzZV9raW5kPTEyLCBUcnlFeGNlcHRfa2luZD0xMywgVHJ5RmluYWxseV9raW5kPTE0LAorICAgICAgICAgICAgICAgICAgQXNzZXJ0X2tpbmQ9MTUsIEltcG9ydF9raW5kPTE2LCBJbXBvcnRGcm9tX2tpbmQ9MTcsCisgICAgICAgICAgICAgICAgICBFeGVjX2tpbmQ9MTgsIEdsb2JhbF9raW5kPTE5LCBFeHByX2tpbmQ9MjAsIFBhc3Nfa2luZD0yMSwKKyAgICAgICAgICAgICAgICAgIEJyZWFrX2tpbmQ9MjIsIENvbnRpbnVlX2tpbmQ9MjN9Oworc3RydWN0IF9zdG10IHsKKyAgICAgICAgZW51bSBfc3RtdF9raW5kIGtpbmQ7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBuYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzX3R5IGFyZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYm9keTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpkZWNvcmF0b3JfbGlzdDsKKyAgICAgICAgICAgICAgICB9IEZ1bmN0aW9uRGVmOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYmFzZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYm9keTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpkZWNvcmF0b3JfbGlzdDsKKyAgICAgICAgICAgICAgICB9IENsYXNzRGVmOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgICAgIH0gUmV0dXJuOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqdGFyZ2V0czsKKyAgICAgICAgICAgICAgICB9IERlbGV0ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKnRhcmdldHM7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgICAgIH0gQXNzaWduOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHRhcmdldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yX3R5IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9IEF1Z0Fzc2lnbjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBkZXN0OworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKnZhbHVlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbmw7CisgICAgICAgICAgICAgICAgfSBQcmludDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSB0YXJnZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGl0ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYm9keTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpvcmVsc2U7CisgICAgICAgICAgICAgICAgfSBGb3I7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdGVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpib2R5OworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKm9yZWxzZTsKKyAgICAgICAgICAgICAgICB9IFdoaWxlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHRlc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYm9keTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpvcmVsc2U7CisgICAgICAgICAgICAgICAgfSBJZjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBjb250ZXh0X2V4cHI7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IG9wdGlvbmFsX3ZhcnM7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYm9keTsKKyAgICAgICAgICAgICAgICB9IFdpdGg7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgaW5zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdGJhY2s7CisgICAgICAgICAgICAgICAgfSBSYWlzZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmJvZHk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqaGFuZGxlcnM7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqb3JlbHNlOworICAgICAgICAgICAgICAgIH0gVHJ5RXhjZXB0OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYm9keTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpmaW5hbGJvZHk7CisgICAgICAgICAgICAgICAgfSBUcnlGaW5hbGx5OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHRlc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IG1zZzsKKyAgICAgICAgICAgICAgICB9IEFzc2VydDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKm5hbWVzOworICAgICAgICAgICAgICAgIH0gSW1wb3J0OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1vZHVsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpuYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbDsKKyAgICAgICAgICAgICAgICB9IEltcG9ydEZyb207CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgYm9keTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgZ2xvYmFsczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgbG9jYWxzOworICAgICAgICAgICAgICAgIH0gRXhlYzsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKm5hbWVzOworICAgICAgICAgICAgICAgIH0gR2xvYmFsOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgICAgIH0gRXhwcjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgfSB2OworICAgICAgICBpbnQgbGluZW5vOworICAgICAgICBpbnQgY29sX29mZnNldDsKK307CisKK2VudW0gX2V4cHJfa2luZCB7Qm9vbE9wX2tpbmQ9MSwgQmluT3Bfa2luZD0yLCBVbmFyeU9wX2tpbmQ9MywgTGFtYmRhX2tpbmQ9NCwKKyAgICAgICAgICAgICAgICAgIElmRXhwX2tpbmQ9NSwgRGljdF9raW5kPTYsIFNldF9raW5kPTcsIExpc3RDb21wX2tpbmQ9OCwKKyAgICAgICAgICAgICAgICAgIFNldENvbXBfa2luZD05LCBEaWN0Q29tcF9raW5kPTEwLCBHZW5lcmF0b3JFeHBfa2luZD0xMSwKKyAgICAgICAgICAgICAgICAgIFlpZWxkX2tpbmQ9MTIsIENvbXBhcmVfa2luZD0xMywgQ2FsbF9raW5kPTE0LCBSZXByX2tpbmQ9MTUsCisgICAgICAgICAgICAgICAgICBOdW1fa2luZD0xNiwgU3RyX2tpbmQ9MTcsIEF0dHJpYnV0ZV9raW5kPTE4LAorICAgICAgICAgICAgICAgICAgU3Vic2NyaXB0X2tpbmQ9MTksIE5hbWVfa2luZD0yMCwgTGlzdF9raW5kPTIxLCBUdXBsZV9raW5kPTIyfTsKK3N0cnVjdCBfZXhwciB7CisgICAgICAgIGVudW0gX2V4cHJfa2luZCBraW5kOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xvcF90eSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICp2YWx1ZXM7CisgICAgICAgICAgICAgICAgfSBCb29sT3A7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yX3R5IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSByaWdodDsKKyAgICAgICAgICAgICAgICB9IEJpbk9wOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmFyeW9wX3R5IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBvcGVyYW5kOworICAgICAgICAgICAgICAgIH0gVW5hcnlPcDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzX3R5IGFyZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGJvZHk7CisgICAgICAgICAgICAgICAgfSBMYW1iZGE7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdGVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgYm9keTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgb3JlbHNlOworICAgICAgICAgICAgICAgIH0gSWZFeHA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICprZXlzOworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKnZhbHVlczsKKyAgICAgICAgICAgICAgICB9IERpY3Q7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICplbHRzOworICAgICAgICAgICAgICAgIH0gU2V0OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGVsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpnZW5lcmF0b3JzOworICAgICAgICAgICAgICAgIH0gTGlzdENvbXA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgZWx0OworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmdlbmVyYXRvcnM7CisgICAgICAgICAgICAgICAgfSBTZXRDb21wOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGtleTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqZ2VuZXJhdG9yczsKKyAgICAgICAgICAgICAgICB9IERpY3RDb21wOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGVsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpnZW5lcmF0b3JzOworICAgICAgICAgICAgICAgIH0gR2VuZXJhdG9yRXhwOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgICAgIH0gWWllbGQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfaW50X3NlcSAqb3BzOworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmNvbXBhcmF0b3JzOworICAgICAgICAgICAgICAgIH0gQ29tcGFyZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBmdW5jOworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmFyZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqa2V5d29yZHM7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHN0YXJhcmdzOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBrd2FyZ3M7CisgICAgICAgICAgICAgICAgfSBDYWxsOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgICAgIH0gUmVwcjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IG47CisgICAgICAgICAgICAgICAgfSBOdW07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzOworICAgICAgICAgICAgICAgIH0gU3RyOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBhdHRyOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9jb250ZXh0X3R5IGN0eDsKKyAgICAgICAgICAgICAgICB9IEF0dHJpYnV0ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlX3R5IHNsaWNlOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9jb250ZXh0X3R5IGN0eDsKKyAgICAgICAgICAgICAgICB9IFN1YnNjcmlwdDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfY29udGV4dF90eSBjdHg7CisgICAgICAgICAgICAgICAgfSBOYW1lOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqZWx0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfY29udGV4dF90eSBjdHg7CisgICAgICAgICAgICAgICAgfSBMaXN0OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqZWx0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfY29udGV4dF90eSBjdHg7CisgICAgICAgICAgICAgICAgfSBUdXBsZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgfSB2OworICAgICAgICBpbnQgbGluZW5vOworICAgICAgICBpbnQgY29sX29mZnNldDsKK307CisKK2VudW0gX3NsaWNlX2tpbmQge0VsbGlwc2lzX2tpbmQ9MSwgU2xpY2Vfa2luZD0yLCBFeHRTbGljZV9raW5kPTMsIEluZGV4X2tpbmQ9NH07CitzdHJ1Y3QgX3NsaWNlIHsKKyAgICAgICAgZW51bSBfc2xpY2Vfa2luZCBraW5kOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgbG93ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHVwcGVyOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBzdGVwOworICAgICAgICAgICAgICAgIH0gU2xpY2U7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpkaW1zOworICAgICAgICAgICAgICAgIH0gRXh0U2xpY2U7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgICAgICAgICAgfSBJbmRleDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgfSB2OworfTsKKworc3RydWN0IF9jb21wcmVoZW5zaW9uIHsKKyAgICAgICAgZXhwcl90eSB0YXJnZXQ7CisgICAgICAgIGV4cHJfdHkgaXRlcjsKKyAgICAgICAgYXNkbF9zZXEgKmlmczsKK307CisKK2VudW0gX2V4Y2VwdGhhbmRsZXJfa2luZCB7RXhjZXB0SGFuZGxlcl9raW5kPTF9Oworc3RydWN0IF9leGNlcHRoYW5kbGVyIHsKKyAgICAgICAgZW51bSBfZXhjZXB0aGFuZGxlcl9raW5kIGtpbmQ7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSB0eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBuYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmJvZHk7CisgICAgICAgICAgICAgICAgfSBFeGNlcHRIYW5kbGVyOworICAgICAgICAgICAgICAgIAorICAgICAgICB9IHY7CisgICAgICAgIGludCBsaW5lbm87CisgICAgICAgIGludCBjb2xfb2Zmc2V0OworfTsKKworc3RydWN0IF9hcmd1bWVudHMgeworICAgICAgICBhc2RsX3NlcSAqYXJnczsKKyAgICAgICAgaWRlbnRpZmllciB2YXJhcmc7CisgICAgICAgIGlkZW50aWZpZXIga3dhcmc7CisgICAgICAgIGFzZGxfc2VxICpkZWZhdWx0czsKK307CisKK3N0cnVjdCBfa2V5d29yZCB7CisgICAgICAgIGlkZW50aWZpZXIgYXJnOworICAgICAgICBleHByX3R5IHZhbHVlOworfTsKKworc3RydWN0IF9hbGlhcyB7CisgICAgICAgIGlkZW50aWZpZXIgbmFtZTsKKyAgICAgICAgaWRlbnRpZmllciBhc25hbWU7Cit9OworCisKKyNkZWZpbmUgTW9kdWxlKGEwLCBhMSkgX1B5X01vZHVsZShhMCwgYTEpCittb2RfdHkgX1B5X01vZHVsZShhc2RsX3NlcSAqIGJvZHksIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgSW50ZXJhY3RpdmUoYTAsIGExKSBfUHlfSW50ZXJhY3RpdmUoYTAsIGExKQorbW9kX3R5IF9QeV9JbnRlcmFjdGl2ZShhc2RsX3NlcSAqIGJvZHksIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgRXhwcmVzc2lvbihhMCwgYTEpIF9QeV9FeHByZXNzaW9uKGEwLCBhMSkKK21vZF90eSBfUHlfRXhwcmVzc2lvbihleHByX3R5IGJvZHksIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgU3VpdGUoYTAsIGExKSBfUHlfU3VpdGUoYTAsIGExKQorbW9kX3R5IF9QeV9TdWl0ZShhc2RsX3NlcSAqIGJvZHksIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgRnVuY3Rpb25EZWYoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpIF9QeV9GdW5jdGlvbkRlZihhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikKK3N0bXRfdHkgX1B5X0Z1bmN0aW9uRGVmKGlkZW50aWZpZXIgbmFtZSwgYXJndW1lbnRzX3R5IGFyZ3MsIGFzZGxfc2VxICogYm9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICogZGVjb3JhdG9yX2xpc3QsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBDbGFzc0RlZihhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikgX1B5X0NsYXNzRGVmKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KQorc3RtdF90eSBfUHlfQ2xhc3NEZWYoaWRlbnRpZmllciBuYW1lLCBhc2RsX3NlcSAqIGJhc2VzLCBhc2RsX3NlcSAqIGJvZHksCisgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqIGRlY29yYXRvcl9saXN0LCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgUmV0dXJuKGEwLCBhMSwgYTIsIGEzKSBfUHlfUmV0dXJuKGEwLCBhMSwgYTIsIGEzKQorc3RtdF90eSBfUHlfUmV0dXJuKGV4cHJfdHkgdmFsdWUsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIERlbGV0ZShhMCwgYTEsIGEyLCBhMykgX1B5X0RlbGV0ZShhMCwgYTEsIGEyLCBhMykKK3N0bXRfdHkgX1B5X0RlbGV0ZShhc2RsX3NlcSAqIHRhcmdldHMsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hCisgICAgICAgICAgICAgICAgICAgKmFyZW5hKTsKKyNkZWZpbmUgQXNzaWduKGEwLCBhMSwgYTIsIGEzLCBhNCkgX1B5X0Fzc2lnbihhMCwgYTEsIGEyLCBhMywgYTQpCitzdG10X3R5IF9QeV9Bc3NpZ24oYXNkbF9zZXEgKiB0YXJnZXRzLCBleHByX3R5IHZhbHVlLCBpbnQgbGluZW5vLCBpbnQKKyAgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEF1Z0Fzc2lnbihhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfQXVnQXNzaWduKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCitzdG10X3R5IF9QeV9BdWdBc3NpZ24oZXhwcl90eSB0YXJnZXQsIG9wZXJhdG9yX3R5IG9wLCBleHByX3R5IHZhbHVlLCBpbnQKKyAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFByaW50KGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9QcmludChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KQorc3RtdF90eSBfUHlfUHJpbnQoZXhwcl90eSBkZXN0LCBhc2RsX3NlcSAqIHZhbHVlcywgYm9vbCBubCwgaW50IGxpbmVubywgaW50CisgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEZvcihhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikgX1B5X0ZvcihhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikKK3N0bXRfdHkgX1B5X0ZvcihleHByX3R5IHRhcmdldCwgZXhwcl90eSBpdGVyLCBhc2RsX3NlcSAqIGJvZHksIGFzZGxfc2VxICoKKyAgICAgICAgICAgICAgICBvcmVsc2UsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFdoaWxlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9XaGlsZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KQorc3RtdF90eSBfUHlfV2hpbGUoZXhwcl90eSB0ZXN0LCBhc2RsX3NlcSAqIGJvZHksIGFzZGxfc2VxICogb3JlbHNlLCBpbnQgbGluZW5vLAorICAgICAgICAgICAgICAgICAgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgSWYoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X0lmKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCitzdG10X3R5IF9QeV9JZihleHByX3R5IHRlc3QsIGFzZGxfc2VxICogYm9keSwgYXNkbF9zZXEgKiBvcmVsc2UsIGludCBsaW5lbm8sCisgICAgICAgICAgICAgICBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBXaXRoKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9XaXRoKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCitzdG10X3R5IF9QeV9XaXRoKGV4cHJfdHkgY29udGV4dF9leHByLCBleHByX3R5IG9wdGlvbmFsX3ZhcnMsIGFzZGxfc2VxICogYm9keSwKKyAgICAgICAgICAgICAgICAgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgUmFpc2UoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X1JhaXNlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCitzdG10X3R5IF9QeV9SYWlzZShleHByX3R5IHR5cGUsIGV4cHJfdHkgaW5zdCwgZXhwcl90eSB0YmFjaywgaW50IGxpbmVubywgaW50CisgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFRyeUV4Y2VwdChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfVHJ5RXhjZXB0KGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCitzdG10X3R5IF9QeV9UcnlFeGNlcHQoYXNkbF9zZXEgKiBib2R5LCBhc2RsX3NlcSAqIGhhbmRsZXJzLCBhc2RsX3NlcSAqIG9yZWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBUcnlGaW5hbGx5KGEwLCBhMSwgYTIsIGEzLCBhNCkgX1B5X1RyeUZpbmFsbHkoYTAsIGExLCBhMiwgYTMsIGE0KQorc3RtdF90eSBfUHlfVHJ5RmluYWxseShhc2RsX3NlcSAqIGJvZHksIGFzZGxfc2VxICogZmluYWxib2R5LCBpbnQgbGluZW5vLCBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBBc3NlcnQoYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfQXNzZXJ0KGEwLCBhMSwgYTIsIGEzLCBhNCkKK3N0bXRfdHkgX1B5X0Fzc2VydChleHByX3R5IHRlc3QsIGV4cHJfdHkgbXNnLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEltcG9ydChhMCwgYTEsIGEyLCBhMykgX1B5X0ltcG9ydChhMCwgYTEsIGEyLCBhMykKK3N0bXRfdHkgX1B5X0ltcG9ydChhc2RsX3NlcSAqIG5hbWVzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYQorICAgICAgICAgICAgICAgICAgICphcmVuYSk7CisjZGVmaW5lIEltcG9ydEZyb20oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X0ltcG9ydEZyb20oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK3N0bXRfdHkgX1B5X0ltcG9ydEZyb20oaWRlbnRpZmllciBtb2R1bGUsIGFzZGxfc2VxICogbmFtZXMsIGludCBsZXZlbCwgaW50CisgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgRXhlYyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfRXhlYyhhMCwgYTEsIGEyLCBhMywgYTQsIGE1KQorc3RtdF90eSBfUHlfRXhlYyhleHByX3R5IGJvZHksIGV4cHJfdHkgZ2xvYmFscywgZXhwcl90eSBsb2NhbHMsIGludCBsaW5lbm8sIGludAorICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEdsb2JhbChhMCwgYTEsIGEyLCBhMykgX1B5X0dsb2JhbChhMCwgYTEsIGEyLCBhMykKK3N0bXRfdHkgX1B5X0dsb2JhbChhc2RsX3NlcSAqIG5hbWVzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYQorICAgICAgICAgICAgICAgICAgICphcmVuYSk7CisjZGVmaW5lIEV4cHIoYTAsIGExLCBhMiwgYTMpIF9QeV9FeHByKGEwLCBhMSwgYTIsIGEzKQorc3RtdF90eSBfUHlfRXhwcihleHByX3R5IHZhbHVlLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBQYXNzKGEwLCBhMSwgYTIpIF9QeV9QYXNzKGEwLCBhMSwgYTIpCitzdG10X3R5IF9QeV9QYXNzKGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEJyZWFrKGEwLCBhMSwgYTIpIF9QeV9CcmVhayhhMCwgYTEsIGEyKQorc3RtdF90eSBfUHlfQnJlYWsoaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgQ29udGludWUoYTAsIGExLCBhMikgX1B5X0NvbnRpbnVlKGEwLCBhMSwgYTIpCitzdG10X3R5IF9QeV9Db250aW51ZShpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBCb29sT3AoYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfQm9vbE9wKGEwLCBhMSwgYTIsIGEzLCBhNCkKK2V4cHJfdHkgX1B5X0Jvb2xPcChib29sb3BfdHkgb3AsIGFzZGxfc2VxICogdmFsdWVzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEJpbk9wKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9CaW5PcChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KQorZXhwcl90eSBfUHlfQmluT3AoZXhwcl90eSBsZWZ0LCBvcGVyYXRvcl90eSBvcCwgZXhwcl90eSByaWdodCwgaW50IGxpbmVubywgaW50CisgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFVuYXJ5T3AoYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfVW5hcnlPcChhMCwgYTEsIGEyLCBhMywgYTQpCitleHByX3R5IF9QeV9VbmFyeU9wKHVuYXJ5b3BfdHkgb3AsIGV4cHJfdHkgb3BlcmFuZCwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgTGFtYmRhKGEwLCBhMSwgYTIsIGEzLCBhNCkgX1B5X0xhbWJkYShhMCwgYTEsIGEyLCBhMywgYTQpCitleHByX3R5IF9QeV9MYW1iZGEoYXJndW1lbnRzX3R5IGFyZ3MsIGV4cHJfdHkgYm9keSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBJZkV4cChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfSWZFeHAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK2V4cHJfdHkgX1B5X0lmRXhwKGV4cHJfdHkgdGVzdCwgZXhwcl90eSBib2R5LCBleHByX3R5IG9yZWxzZSwgaW50IGxpbmVubywgaW50CisgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIERpY3QoYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfRGljdChhMCwgYTEsIGEyLCBhMywgYTQpCitleHByX3R5IF9QeV9EaWN0KGFzZGxfc2VxICoga2V5cywgYXNkbF9zZXEgKiB2YWx1ZXMsIGludCBsaW5lbm8sIGludAorICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFNldChhMCwgYTEsIGEyLCBhMykgX1B5X1NldChhMCwgYTEsIGEyLCBhMykKK2V4cHJfdHkgX1B5X1NldChhc2RsX3NlcSAqIGVsdHMsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIExpc3RDb21wKGEwLCBhMSwgYTIsIGEzLCBhNCkgX1B5X0xpc3RDb21wKGEwLCBhMSwgYTIsIGEzLCBhNCkKK2V4cHJfdHkgX1B5X0xpc3RDb21wKGV4cHJfdHkgZWx0LCBhc2RsX3NlcSAqIGdlbmVyYXRvcnMsIGludCBsaW5lbm8sIGludAorICAgICAgICAgICAgICAgICAgICAgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBTZXRDb21wKGEwLCBhMSwgYTIsIGEzLCBhNCkgX1B5X1NldENvbXAoYTAsIGExLCBhMiwgYTMsIGE0KQorZXhwcl90eSBfUHlfU2V0Q29tcChleHByX3R5IGVsdCwgYXNkbF9zZXEgKiBnZW5lcmF0b3JzLCBpbnQgbGluZW5vLCBpbnQKKyAgICAgICAgICAgICAgICAgICAgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBEaWN0Q29tcChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfRGljdENvbXAoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK2V4cHJfdHkgX1B5X0RpY3RDb21wKGV4cHJfdHkga2V5LCBleHByX3R5IHZhbHVlLCBhc2RsX3NlcSAqIGdlbmVyYXRvcnMsIGludAorICAgICAgICAgICAgICAgICAgICAgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBHZW5lcmF0b3JFeHAoYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfR2VuZXJhdG9yRXhwKGEwLCBhMSwgYTIsIGEzLCBhNCkKK2V4cHJfdHkgX1B5X0dlbmVyYXRvckV4cChleHByX3R5IGVsdCwgYXNkbF9zZXEgKiBnZW5lcmF0b3JzLCBpbnQgbGluZW5vLCBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFlpZWxkKGEwLCBhMSwgYTIsIGEzKSBfUHlfWWllbGQoYTAsIGExLCBhMiwgYTMpCitleHByX3R5IF9QeV9ZaWVsZChleHByX3R5IHZhbHVlLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBDb21wYXJlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9Db21wYXJlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCitleHByX3R5IF9QeV9Db21wYXJlKGV4cHJfdHkgbGVmdCwgYXNkbF9pbnRfc2VxICogb3BzLCBhc2RsX3NlcSAqIGNvbXBhcmF0b3JzLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBDYWxsKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNykgX1B5X0NhbGwoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KQorZXhwcl90eSBfUHlfQ2FsbChleHByX3R5IGZ1bmMsIGFzZGxfc2VxICogYXJncywgYXNkbF9zZXEgKiBrZXl3b3JkcywgZXhwcl90eQorICAgICAgICAgICAgICAgICBzdGFyYXJncywgZXhwcl90eSBrd2FyZ3MsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hCisgICAgICAgICAgICAgICAgICphcmVuYSk7CisjZGVmaW5lIFJlcHIoYTAsIGExLCBhMiwgYTMpIF9QeV9SZXByKGEwLCBhMSwgYTIsIGEzKQorZXhwcl90eSBfUHlfUmVwcihleHByX3R5IHZhbHVlLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBOdW0oYTAsIGExLCBhMiwgYTMpIF9QeV9OdW0oYTAsIGExLCBhMiwgYTMpCitleHByX3R5IF9QeV9OdW0ob2JqZWN0IG4sIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFN0cihhMCwgYTEsIGEyLCBhMykgX1B5X1N0cihhMCwgYTEsIGEyLCBhMykKK2V4cHJfdHkgX1B5X1N0cihzdHJpbmcgcywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgQXR0cmlidXRlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9BdHRyaWJ1dGUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK2V4cHJfdHkgX1B5X0F0dHJpYnV0ZShleHByX3R5IHZhbHVlLCBpZGVudGlmaWVyIGF0dHIsIGV4cHJfY29udGV4dF90eSBjdHgsIGludAorICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgU3Vic2NyaXB0KGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9TdWJzY3JpcHQoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK2V4cHJfdHkgX1B5X1N1YnNjcmlwdChleHByX3R5IHZhbHVlLCBzbGljZV90eSBzbGljZSwgZXhwcl9jb250ZXh0X3R5IGN0eCwgaW50CisgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBOYW1lKGEwLCBhMSwgYTIsIGEzLCBhNCkgX1B5X05hbWUoYTAsIGExLCBhMiwgYTMsIGE0KQorZXhwcl90eSBfUHlfTmFtZShpZGVudGlmaWVyIGlkLCBleHByX2NvbnRleHRfdHkgY3R4LCBpbnQgbGluZW5vLCBpbnQKKyAgICAgICAgICAgICAgICAgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBMaXN0KGEwLCBhMSwgYTIsIGEzLCBhNCkgX1B5X0xpc3QoYTAsIGExLCBhMiwgYTMsIGE0KQorZXhwcl90eSBfUHlfTGlzdChhc2RsX3NlcSAqIGVsdHMsIGV4cHJfY29udGV4dF90eSBjdHgsIGludCBsaW5lbm8sIGludAorICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFR1cGxlKGEwLCBhMSwgYTIsIGEzLCBhNCkgX1B5X1R1cGxlKGEwLCBhMSwgYTIsIGEzLCBhNCkKK2V4cHJfdHkgX1B5X1R1cGxlKGFzZGxfc2VxICogZWx0cywgZXhwcl9jb250ZXh0X3R5IGN0eCwgaW50IGxpbmVubywgaW50CisgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEVsbGlwc2lzKGEwKSBfUHlfRWxsaXBzaXMoYTApCitzbGljZV90eSBfUHlfRWxsaXBzaXMoUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBTbGljZShhMCwgYTEsIGEyLCBhMykgX1B5X1NsaWNlKGEwLCBhMSwgYTIsIGEzKQorc2xpY2VfdHkgX1B5X1NsaWNlKGV4cHJfdHkgbG93ZXIsIGV4cHJfdHkgdXBwZXIsIGV4cHJfdHkgc3RlcCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBFeHRTbGljZShhMCwgYTEpIF9QeV9FeHRTbGljZShhMCwgYTEpCitzbGljZV90eSBfUHlfRXh0U2xpY2UoYXNkbF9zZXEgKiBkaW1zLCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEluZGV4KGEwLCBhMSkgX1B5X0luZGV4KGEwLCBhMSkKK3NsaWNlX3R5IF9QeV9JbmRleChleHByX3R5IHZhbHVlLCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIGNvbXByZWhlbnNpb24oYTAsIGExLCBhMiwgYTMpIF9QeV9jb21wcmVoZW5zaW9uKGEwLCBhMSwgYTIsIGEzKQorY29tcHJlaGVuc2lvbl90eSBfUHlfY29tcHJlaGVuc2lvbihleHByX3R5IHRhcmdldCwgZXhwcl90eSBpdGVyLCBhc2RsX3NlcSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcywgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBFeGNlcHRIYW5kbGVyKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9FeGNlcHRIYW5kbGVyKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCitleGNlcHRoYW5kbGVyX3R5IF9QeV9FeGNlcHRIYW5kbGVyKGV4cHJfdHkgdHlwZSwgZXhwcl90eSBuYW1lLCBhc2RsX3NlcSAqIGJvZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIGFyZ3VtZW50cyhhMCwgYTEsIGEyLCBhMywgYTQpIF9QeV9hcmd1bWVudHMoYTAsIGExLCBhMiwgYTMsIGE0KQorYXJndW1lbnRzX3R5IF9QeV9hcmd1bWVudHMoYXNkbF9zZXEgKiBhcmdzLCBpZGVudGlmaWVyIHZhcmFyZywgaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAga3dhcmcsIGFzZGxfc2VxICogZGVmYXVsdHMsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUga2V5d29yZChhMCwgYTEsIGEyKSBfUHlfa2V5d29yZChhMCwgYTEsIGEyKQora2V5d29yZF90eSBfUHlfa2V5d29yZChpZGVudGlmaWVyIGFyZywgZXhwcl90eSB2YWx1ZSwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBhbGlhcyhhMCwgYTEsIGEyKSBfUHlfYWxpYXMoYTAsIGExLCBhMikKK2FsaWFzX3R5IF9QeV9hbGlhcyhpZGVudGlmaWVyIG5hbWUsIGlkZW50aWZpZXIgYXNuYW1lLCBQeUFyZW5hICphcmVuYSk7CisKK1B5T2JqZWN0KiBQeUFTVF9tb2Qyb2JqKG1vZF90eSB0KTsKK21vZF90eSBQeUFTVF9vYmoybW9kKFB5T2JqZWN0KiBhc3QsIFB5QXJlbmEqIGFyZW5hLCBpbnQgbW9kZSk7CitpbnQgUHlBU1RfQ2hlY2soUHlPYmplY3QqIG9iaik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9QeXRob24uaCBiL2luY2x1ZGUvcHl0aG9uMi43L1B5dGhvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTQxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9QeXRob24uaApAQCAtMCwwICsxLDE3OCBAQAorI2lmbmRlZiBQeV9QWVRIT05fSAorI2RlZmluZSBQeV9QWVRIT05fSAorLyogU2luY2UgdGhpcyBpcyBhICJtZXRhLWluY2x1ZGUiIGZpbGUsIG5vICNpZmRlZiBfX2NwbHVzcGx1cyAvIGV4dGVybiAiQyIgeyAqLworCisvKiBJbmNsdWRlIG5lYXJseSBhbGwgUHl0aG9uIGhlYWRlciBmaWxlcyAqLworCisjaW5jbHVkZSAicGF0Y2hsZXZlbC5oIgorI2luY2x1ZGUgInB5Y29uZmlnLmgiCisjaW5jbHVkZSAicHltYWNjb25maWcuaCIKKworLyogQ3ljbGljIGdjIGlzIGFsd2F5cyBlbmFibGVkLCBzdGFydGluZyB3aXRoIHJlbGVhc2UgMi4zYTEuICBTdXBwbHkgdGhlCisgKiBvbGQgc3ltYm9sIGZvciB0aGUgYmVuZWZpdCBvZiBleHRlbnNpb24gbW9kdWxlcyB3cml0dGVuIGJlZm9yZSB0aGVuCisgKiB0aGF0IG1heSBiZSBjb25kaXRpb25hbGl6aW5nIG9uIGl0LiAgVGhlIGNvcmUgZG9lc24ndCB1c2UgaXQgYW55bW9yZS4KKyAqLworI2lmbmRlZiBXSVRIX0NZQ0xFX0dDCisjZGVmaW5lIFdJVEhfQ1lDTEVfR0MgMQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2lmbmRlZiBVQ0hBUl9NQVgKKyNlcnJvciAiU29tZXRoaW5nJ3MgYnJva2VuLiAgVUNIQVJfTUFYIHNob3VsZCBiZSBkZWZpbmVkIGluIGxpbWl0cy5oLiIKKyNlbmRpZgorCisjaWYgVUNIQVJfTUFYICE9IDI1NQorI2Vycm9yICJQeXRob24ncyBzb3VyY2UgY29kZSBhc3N1bWVzIEMncyB1bnNpZ25lZCBjaGFyIGlzIGFuIDgtYml0IHR5cGUuIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fc2dpKSAmJiBkZWZpbmVkKFdJVEhfVEhSRUFEKSAmJiAhZGVmaW5lZChfU0dJX01QX1NPVVJDRSkKKyNkZWZpbmUgX1NHSV9NUF9TT1VSQ0UKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpZm5kZWYgTlVMTAorIyAgIGVycm9yICJQeXRob24uaCByZXF1aXJlcyB0aGF0IHN0ZGlvLmggZGVmaW5lIE5VTEwuIgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZmRlZiBIQVZFX0VSUk5PX0gKKyNpbmNsdWRlIDxlcnJuby5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaWZkZWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKy8qIEZvciBzaXplX3Q/ICovCisjaWZkZWYgSEFWRV9TVERERUZfSAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2VuZGlmCisKKy8qIENBVVRJT046ICBCdWlsZCBzZXR1cHMgc2hvdWxkIGVuc3VyZSB0aGF0IE5ERUJVRyBpcyBkZWZpbmVkIG9uIHRoZQorICogY29tcGlsZXIgY29tbWFuZCBsaW5lIHdoZW4gYnVpbGRpbmcgUHl0aG9uIGluIHJlbGVhc2UgbW9kZTsgZWxzZQorICogYXNzZXJ0KCkgY2FsbHMgd29uJ3QgYmUgcmVtb3ZlZC4KKyAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAicHlwb3J0LmgiCisKKy8qIHB5Y29uZmlnLmggb3IgcHlwb3J0LmggbWF5IG9yIG1heSBub3QgZGVmaW5lIERMX0lNUE9SVCAqLworI2lmbmRlZiBETF9JTVBPUlQJLyogZGVjbGFyYXRpb25zIGZvciBETEwgaW1wb3J0L2V4cG9ydCAqLworI2RlZmluZSBETF9JTVBPUlQoUlRZUEUpIFJUWVBFCisjZW5kaWYKKyNpZm5kZWYgRExfRVhQT1JUCS8qIGRlY2xhcmF0aW9ucyBmb3IgRExMIGltcG9ydC9leHBvcnQgKi8KKyNkZWZpbmUgRExfRVhQT1JUKFJUWVBFKSBSVFlQRQorI2VuZGlmCisKKy8qIERlYnVnLW1vZGUgYnVpbGQgd2l0aCBweW1hbGxvYyBpbXBsaWVzIFBZTUFMTE9DX0RFQlVHLgorICogIFBZTUFMTE9DX0RFQlVHIGlzIGluIGVycm9yIGlmIHB5bWFsbG9jIGlzIG5vdCBpbiB1c2UuCisgKi8KKyNpZiBkZWZpbmVkKFB5X0RFQlVHKSAmJiBkZWZpbmVkKFdJVEhfUFlNQUxMT0MpICYmICFkZWZpbmVkKFBZTUFMTE9DX0RFQlVHKQorI2RlZmluZSBQWU1BTExPQ19ERUJVRworI2VuZGlmCisjaWYgZGVmaW5lZChQWU1BTExPQ19ERUJVRykgJiYgIWRlZmluZWQoV0lUSF9QWU1BTExPQykKKyNlcnJvciAiUFlNQUxMT0NfREVCVUcgcmVxdWlyZXMgV0lUSF9QWU1BTExPQyIKKyNlbmRpZgorI2luY2x1ZGUgInB5bWF0aC5oIgorI2luY2x1ZGUgInB5bWVtLmgiCisKKyNpbmNsdWRlICJvYmplY3QuaCIKKyNpbmNsdWRlICJvYmppbXBsLmgiCisKKyNpbmNsdWRlICJweWRlYnVnLmgiCisKKyNpbmNsdWRlICJ1bmljb2Rlb2JqZWN0LmgiCisjaW5jbHVkZSAiaW50b2JqZWN0LmgiCisjaW5jbHVkZSAiYm9vbG9iamVjdC5oIgorI2luY2x1ZGUgImxvbmdvYmplY3QuaCIKKyNpbmNsdWRlICJmbG9hdG9iamVjdC5oIgorI2lmbmRlZiBXSVRIT1VUX0NPTVBMRVgKKyNpbmNsdWRlICJjb21wbGV4b2JqZWN0LmgiCisjZW5kaWYKKyNpbmNsdWRlICJyYW5nZW9iamVjdC5oIgorI2luY2x1ZGUgInN0cmluZ29iamVjdC5oIgorI2luY2x1ZGUgIm1lbW9yeW9iamVjdC5oIgorI2luY2x1ZGUgImJ1ZmZlcm9iamVjdC5oIgorI2luY2x1ZGUgImJ5dGVzb2JqZWN0LmgiCisjaW5jbHVkZSAiYnl0ZWFycmF5b2JqZWN0LmgiCisjaW5jbHVkZSAidHVwbGVvYmplY3QuaCIKKyNpbmNsdWRlICJsaXN0b2JqZWN0LmgiCisjaW5jbHVkZSAiZGljdG9iamVjdC5oIgorI2luY2x1ZGUgImVudW1vYmplY3QuaCIKKyNpbmNsdWRlICJzZXRvYmplY3QuaCIKKyNpbmNsdWRlICJtZXRob2RvYmplY3QuaCIKKyNpbmNsdWRlICJtb2R1bGVvYmplY3QuaCIKKyNpbmNsdWRlICJmdW5jb2JqZWN0LmgiCisjaW5jbHVkZSAiY2xhc3NvYmplY3QuaCIKKyNpbmNsdWRlICJmaWxlb2JqZWN0LmgiCisjaW5jbHVkZSAiY29iamVjdC5oIgorI2luY2x1ZGUgInB5Y2Fwc3VsZS5oIgorI2luY2x1ZGUgInRyYWNlYmFjay5oIgorI2luY2x1ZGUgInNsaWNlb2JqZWN0LmgiCisjaW5jbHVkZSAiY2VsbG9iamVjdC5oIgorI2luY2x1ZGUgIml0ZXJvYmplY3QuaCIKKyNpbmNsdWRlICJnZW5vYmplY3QuaCIKKyNpbmNsdWRlICJkZXNjcm9iamVjdC5oIgorI2luY2x1ZGUgIndhcm5pbmdzLmgiCisjaW5jbHVkZSAid2Vha3JlZm9iamVjdC5oIgorCisjaW5jbHVkZSAiY29kZWNzLmgiCisjaW5jbHVkZSAicHllcnJvcnMuaCIKKworI2luY2x1ZGUgInB5c3RhdGUuaCIKKworI2luY2x1ZGUgInB5YXJlbmEuaCIKKyNpbmNsdWRlICJtb2RzdXBwb3J0LmgiCisjaW5jbHVkZSAicHl0aG9ucnVuLmgiCisjaW5jbHVkZSAiY2V2YWwuaCIKKyNpbmNsdWRlICJzeXNtb2R1bGUuaCIKKyNpbmNsdWRlICJpbnRyY2hlY2suaCIKKyNpbmNsdWRlICJpbXBvcnQuaCIKKworI2luY2x1ZGUgImFic3RyYWN0LmgiCisKKyNpbmNsdWRlICJjb21waWxlLmgiCisjaW5jbHVkZSAiZXZhbC5oIgorCisjaW5jbHVkZSAicHljdHlwZS5oIgorI2luY2x1ZGUgInB5c3RydG9kLmgiCisjaW5jbHVkZSAicHlzdHJjbXAuaCIKKyNpbmNsdWRlICJkdG9hLmgiCisKKy8qIF9QeV9NYW5nbGUgaXMgZGVmaW5lZCBpbiBjb21waWxlLmMgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBfUHlfTWFuZ2xlKFB5T2JqZWN0ICpwLCBQeU9iamVjdCAqbmFtZSk7CisKKy8qIFB5QXJnX0dldEludCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQsIHVzZSBQeUFyZ19QYXJzZSgpLiAqLworI2RlZmluZSBQeUFyZ19HZXRJbnQodiwgYSkJUHlBcmdfUGFyc2UoKHYpLCAiaSIsIChhKSkKKworLyogUHlBcmdfTm9BcmdzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5LgorICAgU2V0IG1sX2ZsYWdzIGluIHRoZSBQeU1ldGhvZERlZiB0byBNRVRIX05PQVJHUy4gKi8KKyNkZWZpbmUgUHlBcmdfTm9BcmdzKHYpCQlQeUFyZ19QYXJzZSh2LCAiIikKKworLyogQXJndW1lbnQgbXVzdCBiZSBhIGNoYXIgb3IgYW4gaW50IGluIFstMTI4LCAxMjddIG9yIFswLCAyNTVdLiAqLworI2RlZmluZSBQeV9DSEFSTUFTSyhjKQkJKCh1bnNpZ25lZCBjaGFyKSgoYykgJiAweGZmKSkKKworI2luY2x1ZGUgInB5ZnBlLmgiCisKKy8qIFRoZXNlIGRlZmluaXRpb25zIG11c3QgbWF0Y2ggY29ycmVzcG9uZGluZyBkZWZpbml0aW9ucyBpbiBncmFtaW5pdC5oLgorICAgVGhlcmUncyBjb2RlIGluIGNvbXBpbGUuYyB0aGF0IGNoZWNrcyB0aGF0IHRoZXkgYXJlIHRoZSBzYW1lLiAqLworI2RlZmluZSBQeV9zaW5nbGVfaW5wdXQgMjU2CisjZGVmaW5lIFB5X2ZpbGVfaW5wdXQgMjU3CisjZGVmaW5lIFB5X2V2YWxfaW5wdXQgMjU4CisKKyNpZmRlZiBIQVZFX1BUSAorLyogR05VIHB0aCB1c2VyLXNwYWNlIHRocmVhZCBzdXBwb3J0ICovCisjaW5jbHVkZSA8cHRoLmg+CisjZW5kaWYKKworLyogRGVmaW5lIG1hY3JvcyBmb3IgaW5saW5lIGRvY3VtZW50YXRpb24uICovCisjZGVmaW5lIFB5RG9jX1ZBUihuYW1lKSBzdGF0aWMgY2hhciBuYW1lW10KKyNkZWZpbmUgUHlEb2NfU1RSVkFSKG5hbWUsc3RyKSBQeURvY19WQVIobmFtZSkgPSBQeURvY19TVFIoc3RyKQorI2lmZGVmIFdJVEhfRE9DX1NUUklOR1MKKyNkZWZpbmUgUHlEb2NfU1RSKHN0cikgc3RyCisjZWxzZQorI2RlZmluZSBQeURvY19TVFIoc3RyKSAiIgorI2VuZGlmCisKKyNlbmRpZiAvKiAhUHlfUFlUSE9OX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2Fic3RyYWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9hYnN0cmFjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNzc0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9hYnN0cmFjdC5oCkBAIC0wLDAgKzEsMTM5NiBAQAorI2lmbmRlZiBQeV9BQlNUUkFDVE9CSkVDVF9ICisjZGVmaW5lIFB5X0FCU1RSQUNUT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIFBZX1NTSVpFX1RfQ0xFQU4KKyNkZWZpbmUgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQKKyNkZWZpbmUgUHlPYmplY3RfQ2FsbE1ldGhvZCBfUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVAorI2VuZGlmCisKKy8qIEFic3RyYWN0IE9iamVjdCBJbnRlcmZhY2UgKG1hbnkgdGhhbmtzIHRvIEppbSBGdWx0b24pICovCisKKy8qCisgICBQUk9QT1NBTDogQSBHZW5lcmljIFB5dGhvbiBPYmplY3QgSW50ZXJmYWNlIGZvciBQeXRob24gQyBNb2R1bGVzCisKK1Byb2JsZW0KKworICBQeXRob24gbW9kdWxlcyB3cml0dGVuIGluIEMgdGhhdCBtdXN0IGFjY2VzcyBQeXRob24gb2JqZWN0cyBtdXN0IGRvCisgIHNvIHRocm91Z2ggcm91dGluZXMgd2hvc2UgaW50ZXJmYWNlcyBhcmUgZGVzY3JpYmVkIGJ5IGEgc2V0IG9mCisgIGluY2x1ZGUgZmlsZXMuICBVbmZvcnR1bmF0ZWx5LCB0aGVzZSByb3V0aW5lcyB2YXJ5IGFjY29yZGluZyB0byB0aGUKKyAgb2JqZWN0IGFjY2Vzc2VkLiAgVG8gdXNlIHRoZXNlIHJvdXRpbmVzLCB0aGUgQyBwcm9ncmFtbWVyIG11c3QgY2hlY2sKKyAgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBiZWluZyB1c2VkIGFuZCBtdXN0IGNhbGwgYSByb3V0aW5lIGJhc2VkIG9uCisgIHRoZSBvYmplY3QgdHlwZS4gIEZvciBleGFtcGxlLCB0byBhY2Nlc3MgYW4gZWxlbWVudCBvZiBhIHNlcXVlbmNlLAorICB0aGUgcHJvZ3JhbW1lciBtdXN0IGRldGVybWluZSB3aGV0aGVyIHRoZSBzZXF1ZW5jZSBpcyBhIGxpc3Qgb3IgYQorICB0dXBsZToKKworICAgIGlmKGlzX3R1cGxlb2JqZWN0KG8pKQorICAgICAgZT1nZXR0dXBsZWl0ZW0obyxpKQorICAgIGVsc2UgaWYoaXNfbGlzdGl0ZW0obykpCisgICAgICBlPWdldGxpc3RpdGVtKG8saSkKKworICBJZiB0aGUgcHJvZ3JhbW1lciB3YW50cyB0byBnZXQgYW4gaXRlbSBmcm9tIGFub3RoZXIgdHlwZSBvZiBvYmplY3QKKyAgdGhhdCBwcm92aWRlcyBzZXF1ZW5jZSBiZWhhdmlvciwgdGhlcmUgaXMgbm8gY2xlYXIgd2F5IHRvIGRvIGl0CisgIGNvcnJlY3RseS4KKworICBUaGUgcGVyc2lzdGVudCBwcm9ncmFtbWVyIG1heSBwZXJ1c2Ugb2JqZWN0LmggYW5kIGZpbmQgdGhhdCB0aGUKKyAgX3R5cGVvYmplY3Qgc3RydWN0dXJlIHByb3ZpZGVzIGEgbWVhbnMgb2YgaW52b2tpbmcgdXAgdG8gKGN1cnJlbnRseQorICBhYm91dCkgNDEgc3BlY2lhbCBvcGVyYXRvcnMuICBTbywgZm9yIGV4YW1wbGUsIGEgcm91dGluZSBjYW4gZ2V0IGFuCisgIGl0ZW0gZnJvbSBhbnkgb2JqZWN0IHRoYXQgcHJvdmlkZXMgc2VxdWVuY2UgYmVoYXZpb3IuIEhvd2V2ZXIsIHRvCisgIHVzZSB0aGlzIG1lY2hhbmlzbSwgdGhlIHByb2dyYW1tZXIgbXVzdCBtYWtlIHRoZWlyIGNvZGUgZGVwZW5kZW50IG9uCisgIHRoZSBjdXJyZW50IFB5dGhvbiBpbXBsZW1lbnRhdGlvbi4KKworICBBbHNvLCBjZXJ0YWluIHNlbWFudGljcywgZXNwZWNpYWxseSBtZW1vcnkgbWFuYWdlbWVudCBzZW1hbnRpY3MsIG1heQorICBkaWZmZXIgYnkgdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHVzZWQuICBVbmZvcnR1bmF0ZWx5LCB0aGVzZQorICBzZW1hbnRpY3MgYXJlIG5vdCBjbGVhcmx5IGRlc2NyaWJlZCBpbiB0aGUgY3VycmVudCBpbmNsdWRlIGZpbGVzLgorICBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgcHJvdmlkaW5nIG1vcmUgY29uc2lzdGVudCBzZW1hbnRpY3MgaXMgbmVlZGVkLgorCitQcm9wb3NhbAorCisgIEkgcHJvcG9zZSB0aGUgY3JlYXRpb24gb2YgYSBzdGFuZGFyZCBpbnRlcmZhY2UgKHdpdGggYW4gYXNzb2NpYXRlZAorICBsaWJyYXJ5IG9mIHJvdXRpbmVzIGFuZC9vciBtYWNyb3MpIGZvciBnZW5lcmljYWxseSBvYnRhaW5pbmcgdGhlCisgIHNlcnZpY2VzIG9mIFB5dGhvbiBvYmplY3RzLiAgVGhpcyBwcm9wb3NhbCBjYW4gYmUgdmlld2VkIGFzIG9uZQorICBjb21wb25lbnRzIG9mIGEgUHl0aG9uIEMgaW50ZXJmYWNlIGNvbnNpc3Rpbmcgb2Ygc2V2ZXJhbCBjb21wb25lbnRzLgorCisgIEZyb20gdGhlIHZpZXdwb2ludCBvZiBDIGFjY2VzcyB0byBQeXRob24gc2VydmljZXMsIHdlIGhhdmUgKGFzCisgIHN1Z2dlc3RlZCBieSBHdWlkbyBpbiBvZmYtbGluZSBkaXNjdXNzaW9ucyk6CisKKyAgLSAiVmVyeSBoaWdoIGxldmVsIGxheWVyIjogdHdvIG9yIHRocmVlIGZ1bmN0aW9ucyB0aGF0IGxldCB5b3UgZXhlYyBvcgorICAgIGV2YWwgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIGdpdmVuIGFzIGEgc3RyaW5nIGluIGEgbW9kdWxlIHdob3NlIG5hbWUgaXMKKyAgICBnaXZlbiwgcGFzc2luZyBDIHZhbHVlcyBpbiBhbmQgZ2V0dGluZyBDIHZhbHVlcyBvdXQgdXNpbmcKKyAgICBta3ZhbHVlL2dldGFyZ3Mgc3R5bGUgZm9ybWF0IHN0cmluZ3MuICBUaGlzIGRvZXMgbm90IHJlcXVpcmUgdGhlIHVzZXIKKyAgICB0byBkZWNsYXJlIGFueSB2YXJpYWJsZXMgb2YgdHlwZSAiUHlPYmplY3QgKiIuICBUaGlzIHNob3VsZCBiZSBlbm91Z2gKKyAgICB0byB3cml0ZSBhIHNpbXBsZSBhcHBsaWNhdGlvbiB0aGF0IGdldHMgUHl0aG9uIGNvZGUgZnJvbSB0aGUgdXNlciwKKyAgICBleGVjcyBpdCwgYW5kIHJldHVybnMgdGhlIG91dHB1dCBvciBlcnJvcnMuICAoRXJyb3IgaGFuZGxpbmcgbXVzdCBhbHNvCisgICAgYmUgcGFydCBvZiB0aGlzIEFQSS4pCisKKyAgLSAiQWJzdHJhY3Qgb2JqZWN0cyBsYXllciI6IHdoaWNoIGlzIHRoZSBzdWJqZWN0IG9mIHRoaXMgcHJvcG9zYWwuCisgICAgSXQgaGFzIG1hbnkgZnVuY3Rpb25zIG9wZXJhdGluZyBvbiBvYmplY3RzLCBhbmQgbGVzdCB5b3UgZG8gbWFueQorICAgIHRoaW5ncyBmcm9tIEMgdGhhdCB5b3UgY2FuIGFsc28gd3JpdGUgaW4gUHl0aG9uLCB3aXRob3V0IGdvaW5nCisgICAgdGhyb3VnaCB0aGUgUHl0aG9uIHBhcnNlci4KKworICAtICJDb25jcmV0ZSBvYmplY3RzIGxheWVyIjogVGhpcyBpcyB0aGUgcHVibGljIHR5cGUtZGVwZW5kZW50CisgICAgaW50ZXJmYWNlIHByb3ZpZGVkIGJ5IHRoZSBzdGFuZGFyZCBidWlsdC1pbiB0eXBlcywgc3VjaCBhcyBmbG9hdHMsCisgICAgc3RyaW5ncywgYW5kIGxpc3RzLiAgVGhpcyBpbnRlcmZhY2UgZXhpc3RzIGFuZCBpcyBjdXJyZW50bHkKKyAgICBkb2N1bWVudGVkIGJ5IHRoZSBjb2xsZWN0aW9uIG9mIGluY2x1ZGUgZmlsZXMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgICBQeXRob24gZGlzdHJpYnV0aW9ucy4KKworICBGcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIFB5dGhvbiBhY2Nlc3Npbmcgc2VydmljZXMgcHJvdmlkZWQgYnkgQworICBtb2R1bGVzOgorCisgIC0gIlB5dGhvbiBtb2R1bGUgaW50ZXJmYWNlIjogdGhpcyBpbnRlcmZhY2UgY29uc2lzdCBvZiB0aGUgYmFzaWMKKyAgICByb3V0aW5lcyB1c2VkIHRvIGRlZmluZSBtb2R1bGVzIGFuZCB0aGVpciBtZW1iZXJzLiAgTW9zdCBvZiB0aGUKKyAgICBjdXJyZW50IGV4dGVuc2lvbnMtd3JpdGluZyBndWlkZSBkZWFscyB3aXRoIHRoaXMgaW50ZXJmYWNlLgorCisgIC0gIkJ1aWx0LWluIG9iamVjdCBpbnRlcmZhY2UiOiB0aGlzIGlzIHRoZSBpbnRlcmZhY2UgdGhhdCBhIG5ldworICAgIGJ1aWx0LWluIHR5cGUgbXVzdCBwcm92aWRlIGFuZCB0aGUgbWVjaGFuaXNtcyBhbmQgcnVsZXMgdGhhdCBhCisgICAgZGV2ZWxvcGVyIG9mIGEgbmV3IGJ1aWx0LWluIHR5cGUgbXVzdCB1c2UgYW5kIGZvbGxvdy4KKworICBUaGlzIHByb3Bvc2FsIGlzIGEgImZpcnN0LWN1dCIgdGhhdCBpcyBpbnRlbmRlZCB0byBzcHVyCisgIGRpc2N1c3Npb24uIFNlZSBlc3BlY2lhbGx5IHRoZSBsaXN0cyBvZiBub3Rlcy4KKworICBUaGUgUHl0aG9uIEMgb2JqZWN0IGludGVyZmFjZSB3aWxsIHByb3ZpZGUgZm91ciBwcm90b2NvbHM6IG9iamVjdCwKKyAgbnVtZXJpYywgc2VxdWVuY2UsIGFuZCBtYXBwaW5nLiAgRWFjaCBwcm90b2NvbCBjb25zaXN0cyBvZiBhCisgIGNvbGxlY3Rpb24gb2YgcmVsYXRlZCBvcGVyYXRpb25zLiAgSWYgYW4gb3BlcmF0aW9uIHRoYXQgaXMgbm90CisgIHByb3ZpZGVkIGJ5IGEgcGFydGljdWxhciB0eXBlIGlzIGludm9rZWQsIHRoZW4gYSBzdGFuZGFyZCBleGNlcHRpb24sCisgIE5vdEltcGxlbWVudGVkRXJyb3IgaXMgcmFpc2VkIHdpdGggYSBvcGVyYXRpb24gbmFtZSBhcyBhbiBhcmd1bWVudC4KKyAgSW4gYWRkaXRpb24sIGZvciBjb252ZW5pZW5jZSB0aGlzIGludGVyZmFjZSBkZWZpbmVzIGEgc2V0IG9mCisgIGNvbnN0cnVjdG9ycyBmb3IgYnVpbGRpbmcgb2JqZWN0cyBvZiBidWlsdC1pbiB0eXBlcy4gIFRoaXMgaXMgbmVlZGVkCisgIHNvIG5ldyBvYmplY3RzIGNhbiBiZSByZXR1cm5lZCBmcm9tIEMgZnVuY3Rpb25zIHRoYXQgb3RoZXJ3aXNlIHRyZWF0CisgIG9iamVjdHMgZ2VuZXJpY2FsbHkuCisKK01lbW9yeSBNYW5hZ2VtZW50CisKKyAgRm9yIGFsbCBvZiB0aGUgZnVuY3Rpb25zIGRlc2NyaWJlZCBpbiB0aGlzIHByb3Bvc2FsLCBpZiBhIGZ1bmN0aW9uCisgIHJldGFpbnMgYSByZWZlcmVuY2UgdG8gYSBQeXRob24gb2JqZWN0IHBhc3NlZCBhcyBhbiBhcmd1bWVudCwgdGhlbiB0aGUKKyAgZnVuY3Rpb24gd2lsbCBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBvYmplY3QuICBJdCBpcworICB1bm5lY2Vzc2FyeSBmb3IgdGhlIGNhbGxlciB0byBpbmNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuCisgIGFyZ3VtZW50IGluIGFudGljaXBhdGlvbiBvZiB0aGUgb2JqZWN0J3MgcmV0ZW50aW9uLgorCisgIEFsbCBQeXRob24gb2JqZWN0cyByZXR1cm5lZCBmcm9tIGZ1bmN0aW9ucyBzaG91bGQgYmUgdHJlYXRlZCBhcyBuZXcKKyAgb2JqZWN0cy4gIEZ1bmN0aW9ucyB0aGF0IHJldHVybiBvYmplY3RzIGFzc3VtZSB0aGF0IHRoZSBjYWxsZXIgd2lsbAorICByZXRhaW4gYSByZWZlcmVuY2UgYW5kIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIG9iamVjdCBoYXMgYWxyZWFkeQorICBiZWVuIGluY3JlbWVudGVkIHRvIGFjY291bnQgZm9yIHRoaXMgZmFjdC4gIEEgY2FsbGVyIHRoYXQgZG9lcyBub3QKKyAgcmV0YWluIGEgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCB0aGF0IGlzIHJldHVybmVkIGZyb20gYSBmdW5jdGlvbgorICBtdXN0IGRlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBvYmplY3QgKHVzaW5nCisgIERFQ1JFRihvYmplY3QpKSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4KKworICBOb3RlIHRoYXQgdGhlIGJlaGF2aW9yIG1lbnRpb25lZCBoZXJlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50CisgIGJlaGF2aW9yIGZvciBzb21lIG9iamVjdHMgKGUuZy4gbGlzdHMgYW5kIHR1cGxlcykgd2hlbiBjZXJ0YWluCisgIHR5cGUtc3BlY2lmaWMgcm91dGluZXMgYXJlIGNhbGxlZCBkaXJlY3RseSAoZS5nLiBzZXRsaXN0aXRlbSkuICBUaGUKKyAgcHJvcG9zZWQgYWJzdHJhY3Rpb24gbGF5ZXIgd2lsbCBwcm92aWRlIGEgY29uc2lzdGVudCBtZW1vcnkKKyAgbWFuYWdlbWVudCBpbnRlcmZhY2UsIGNvcnJlY3RpbmcgZm9yIGluY29uc2lzdGVudCBiZWhhdmlvciBmb3Igc29tZQorICBidWlsdC1pbiB0eXBlcy4KKworUHJvdG9jb2xzCisKK3h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCovCisKKy8qICBPYmplY3QgUHJvdG9jb2w6ICovCisKKyAgICAgLyogSW1wbGVtZW50ZWQgZWxzZXdoZXJlOgorCisgICAgIGludCBQeU9iamVjdF9QcmludChQeU9iamVjdCAqbywgRklMRSAqZnAsIGludCBmbGFncyk7CisKKyAgICAgUHJpbnQgYW4gb2JqZWN0LCBvLCBvbiBmaWxlLCBmcC4gIFJldHVybnMgLTEgb24KKyAgICAgZXJyb3IuICBUaGUgZmxhZ3MgYXJndW1lbnQgaXMgdXNlZCB0byBlbmFibGUgY2VydGFpbiBwcmludGluZworICAgICBvcHRpb25zLiBUaGUgb25seSBvcHRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBpcyBQeV9QcmludF9SQVcuCisKKyAgICAgKFdoYXQgc2hvdWxkIGJlIHNhaWQgYWJvdXQgUHlfUHJpbnRfUkFXPykKKworICAgICAgICovCisKKyAgICAgLyogSW1wbGVtZW50ZWQgZWxzZXdoZXJlOgorCisgICAgIGludCBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUpOworCisgICAgIFJldHVybnMgMSBpZiBvIGhhcyB0aGUgYXR0cmlidXRlIGF0dHJfbmFtZSwgYW5kIDAgb3RoZXJ3aXNlLgorICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBoYXNhdHRyKG8sYXR0cl9uYW1lKS4KKworICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KKworICAgICAgICovCisKKyAgICAgLyogSW1wbGVtZW50ZWQgZWxzZXdoZXJlOgorCisgICAgIFB5T2JqZWN0KiBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUpOworCisgICAgIFJldHJpZXZlIGFuIGF0dHJpYnV0ZWQgbmFtZWQgYXR0cl9uYW1lIGZvcm0gb2JqZWN0IG8uCisgICAgIFJldHVybnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvLmF0dHJfbmFtZS4KKworICAgICAgICovCisKKyAgICAgLyogSW1wbGVtZW50ZWQgZWxzZXdoZXJlOgorCisgICAgIGludCBQeU9iamVjdF9IYXNBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKTsKKworICAgICBSZXR1cm5zIDEgaWYgbyBoYXMgdGhlIGF0dHJpYnV0ZSBhdHRyX25hbWUsIGFuZCAwIG90aGVyd2lzZS4KKyAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgaGFzYXR0cihvLGF0dHJfbmFtZSkuCisKKyAgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisKKyAgICAgICAqLworCisgICAgIC8qIEltcGxlbWVudGVkIGVsc2V3aGVyZToKKworICAgICBQeU9iamVjdCogUHlPYmplY3RfR2V0QXR0cihQeU9iamVjdCAqbywgUHlPYmplY3QgKmF0dHJfbmFtZSk7CisKKyAgICAgUmV0cmlldmUgYW4gYXR0cmlidXRlZCBuYW1lZCBhdHRyX25hbWUgZm9ybSBvYmplY3Qgby4KKyAgICAgUmV0dXJucyB0aGUgYXR0cmlidXRlIHZhbHVlIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8uYXR0cl9uYW1lLgorCisgICAgICAgKi8KKworCisgICAgIC8qIEltcGxlbWVudGVkIGVsc2V3aGVyZToKKworICAgICBpbnQgUHlPYmplY3RfU2V0QXR0clN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqYXR0cl9uYW1lLCBQeU9iamVjdCAqdik7CisKKyAgICAgU2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG5hbWVkIGF0dHJfbmFtZSwgZm9yIG9iamVjdCBvLAorICAgICB0byB0aGUgdmFsdWUsIHYuIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IG8uYXR0cl9uYW1lPXYuCisKKyAgICAgICAqLworCisgICAgIC8qIEltcGxlbWVudGVkIGVsc2V3aGVyZToKKworICAgICBpbnQgUHlPYmplY3RfU2V0QXR0cihQeU9iamVjdCAqbywgUHlPYmplY3QgKmF0dHJfbmFtZSwgUHlPYmplY3QgKnYpOworCisgICAgIFNldCB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lZCBhdHRyX25hbWUsIGZvciBvYmplY3QgbywKKyAgICAgdG8gdGhlIHZhbHVlLCB2LiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzCisgICAgIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gc3RhdGVtZW50OiBvLmF0dHJfbmFtZT12LgorCisgICAgICAgKi8KKworICAgICAvKiBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvOgorCisgICAgIGludCBQeU9iamVjdF9EZWxBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUpOworCisgICAgIERlbGV0ZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8uIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IGRlbCBvLmF0dHJfbmFtZS4KKworICAgICAgICovCisjZGVmaW5lICBQeU9iamVjdF9EZWxBdHRyU3RyaW5nKE8sQSkgUHlPYmplY3RfU2V0QXR0clN0cmluZygoTyksKEEpLE5VTEwpCisKKyAgICAgLyogaW1wbGVtZW50ZWQgYXMgYSBtYWNybzoKKworICAgICBpbnQgUHlPYmplY3RfRGVsQXR0cihQeU9iamVjdCAqbywgUHlPYmplY3QgKmF0dHJfbmFtZSk7CisKKyAgICAgRGVsZXRlIGF0dHJpYnV0ZSBuYW1lZCBhdHRyX25hbWUsIGZvciBvYmplY3Qgby4gUmV0dXJucyAtMQorICAgICBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogZGVsIG8uYXR0cl9uYW1lLgorCisgICAgICAgKi8KKyNkZWZpbmUgIFB5T2JqZWN0X0RlbEF0dHIoTyxBKSBQeU9iamVjdF9TZXRBdHRyKChPKSwoQSksTlVMTCkKKworICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQ21wKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yLCBpbnQgKnJlc3VsdCk7CisKKyAgICAgICAvKgorICAgICBDb21wYXJlIHRoZSB2YWx1ZXMgb2YgbzEgYW5kIG8yIHVzaW5nIGEgcm91dGluZSBwcm92aWRlZCBieQorICAgICBvMSwgaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlIHdpdGggYSByb3V0aW5lIHByb3ZpZGVkIGJ5IG8yLgorICAgICBUaGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIHJldHVybmVkIGluIHJlc3VsdC4gIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IHJlc3VsdD1jbXAobzEsbzIpLgorCisgICAgICAgKi8KKworICAgICAvKiBJbXBsZW1lbnRlZCBlbHNld2hlcmU6CisKKyAgICAgaW50IFB5T2JqZWN0X0NvbXBhcmUoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgIENvbXBhcmUgdGhlIHZhbHVlcyBvZiBvMSBhbmQgbzIgdXNpbmcgYSByb3V0aW5lIHByb3ZpZGVkIGJ5CisgICAgIG8xLCBpZiBvbmUgZXhpc3RzLCBvdGhlcndpc2Ugd2l0aCBhIHJvdXRpbmUgcHJvdmlkZWQgYnkgbzIuCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBvbiBzdWNjZXNzLiAgT24gZXJyb3IsCisgICAgIHRoZSB2YWx1ZSByZXR1cm5lZCBpcyB1bmRlZmluZWQuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgUHl0aG9uIGV4cHJlc3Npb246IGNtcChvMSxvMikuCisKKyAgICAgICAqLworCisgICAgIC8qIEltcGxlbWVudGVkIGVsc2V3aGVyZToKKworICAgICBQeU9iamVjdCAqUHlPYmplY3RfUmVwcihQeU9iamVjdCAqbyk7CisKKyAgICAgQ29tcHV0ZSB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdCwgby4gIFJldHVybnMgdGhlCisgICAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzCisgICAgIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogcmVwcihvKS4KKworICAgICBDYWxsZWQgYnkgdGhlIHJlcHIoKSBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgcmV2ZXJzZSBxdW90ZXMuCisKKyAgICAgICAqLworCisgICAgIC8qIEltcGxlbWVudGVkIGVsc2V3aGVyZToKKworICAgICBQeU9iamVjdCAqUHlPYmplY3RfU3RyKFB5T2JqZWN0ICpvKTsKKworICAgICBDb21wdXRlIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0LCBvLiAgUmV0dXJucyB0aGUKKyAgICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBzdHIobykuKQorCisgICAgIENhbGxlZCBieSB0aGUgc3RyKCkgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHRoZSBwcmludAorICAgICBzdGF0ZW1lbnQuCisKKyAgICAgICAqLworCisgICAgIC8qIEltcGxlbWVudGVkIGVsc2V3aGVyZToKKworICAgICBQeU9iamVjdCAqUHlPYmplY3RfVW5pY29kZShQeU9iamVjdCAqbyk7CisKKyAgICAgQ29tcHV0ZSB0aGUgdW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQorICAgICB1bmljb2RlIHJlcHJlc2VudGF0aW9uIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiB1bmlzdHIobykuKQorCisgICAgIENhbGxlZCBieSB0aGUgdW5pc3RyKCkgYnVpbHQtaW4gZnVuY3Rpb24uCisKKyAgICAgICAqLworCisgICAgICAgLyogRGVjbGFyZWQgZWxzZXdoZXJlCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5Q2FsbGFibGVfQ2hlY2soUHlPYmplY3QgKm8pOworCisgICAgIERldGVybWluZSBpZiB0aGUgb2JqZWN0LCBvLCBpcyBjYWxsYWJsZS4gIFJldHVybiAxIGlmIHRoZQorICAgICBvYmplY3QgaXMgY2FsbGFibGUgYW5kIDAgb3RoZXJ3aXNlLgorCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorCisgICAgICAgKi8KKworCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9DYWxsKFB5T2JqZWN0ICpjYWxsYWJsZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3cpOworCisgICAgICAgLyoKKyAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aAorICAgICBhcmd1bWVudHMgYW5kIGtleXdvcmRzIGFyZ3VtZW50cy4gIFRoZSAnYXJncycgYXJndW1lbnQgY2FuIG5vdCBiZQorICAgICBOVUxMLCBidXQgdGhlICdrdycgYXJndW1lbnQgY2FuIGJlIE5VTEwuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfQ2FsbE9iamVjdChQeU9iamVjdCAqY2FsbGFibGVfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqYXJncyk7CisKKyAgICAgICAvKgorICAgICBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCwgY2FsbGFibGVfb2JqZWN0LCB3aXRoCisgICAgIGFyZ3VtZW50cyBnaXZlbiBieSB0aGUgdHVwbGUsIGFyZ3MuICBJZiBubyBhcmd1bWVudHMgYXJlCisgICAgIG5lZWRlZCwgdGhlbiBhcmdzIG1heSBiZSBOVUxMLiAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZQorICAgICBjYWxsIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQKKyAgICAgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBhcHBseShvLGFyZ3MpLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihQeU9iamVjdCAqY2FsbGFibGVfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZvcm1hdCwgLi4uKTsKKworICAgICAgIC8qCisgICAgIENhbGwgYSBjYWxsYWJsZSBQeXRob24gb2JqZWN0LCBjYWxsYWJsZV9vYmplY3QsIHdpdGggYQorICAgICB2YXJpYWJsZSBudW1iZXIgb2YgQyBhcmd1bWVudHMuIFRoZSBDIGFyZ3VtZW50cyBhcmUgZGVzY3JpYmVkCisgICAgIHVzaW5nIGEgbWt2YWx1ZS1zdHlsZSBmb3JtYXQgc3RyaW5nLiBUaGUgZm9ybWF0IG1heSBiZSBOVUxMLAorICAgICBpbmRpY2F0aW5nIHRoYXQgbm8gYXJndW1lbnRzIGFyZSBwcm92aWRlZC4gIFJldHVybnMgdGhlCisgICAgIHJlc3VsdCBvZiB0aGUgY2FsbCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzCisgICAgIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogYXBwbHkobyxhcmdzKS4KKworICAgICAgICovCisKKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0NhbGxNZXRob2QoUHlPYmplY3QgKm8sIGNoYXIgKm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZvcm1hdCwgLi4uKTsKKworICAgICAgIC8qCisgICAgIENhbGwgdGhlIG1ldGhvZCBuYW1lZCBtIG9mIG9iamVjdCBvIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YKKyAgICAgQyBhcmd1bWVudHMuICBUaGUgQyBhcmd1bWVudHMgYXJlIGRlc2NyaWJlZCBieSBhIG1rdmFsdWUKKyAgICAgZm9ybWF0IHN0cmluZy4gIFRoZSBmb3JtYXQgbWF5IGJlIE5VTEwsIGluZGljYXRpbmcgdGhhdCBubworICAgICBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgb24KKyAgICAgc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUKKyAgICAgUHl0aG9uIGV4cHJlc3Npb246IG8ubWV0aG9kKGFyZ3MpLgorICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlPYmplY3RfQ2FsbEZ1bmN0aW9uX1NpemVUKFB5T2JqZWN0ICpjYWxsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZvcm1hdCwgLi4uKTsKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVChQeU9iamVjdCAqbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZvcm1hdCwgLi4uKTsKKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoUHlPYmplY3QgKmNhbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4pOworCisgICAgICAgLyoKKyAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aCBhCisgICAgIHZhcmlhYmxlIG51bWJlciBvZiBDIGFyZ3VtZW50cy4gIFRoZSBDIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQKKyAgICAgYXMgUHlPYmplY3QgKiB2YWx1ZXMsIHRlcm1pbmF0ZWQgYnkgYSBOVUxMLiAgUmV0dXJucyB0aGUKKyAgICAgcmVzdWx0IG9mIHRoZSBjYWxsIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBhcHBseShvLGFyZ3MpLgorICAgICAgICovCisKKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzKFB5T2JqZWN0ICpvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm0sIC4uLik7CisKKyAgICAgICAvKgorICAgICBDYWxsIHRoZSBtZXRob2QgbmFtZWQgbSBvZiBvYmplY3QgbyB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mCisgICAgIEMgYXJndW1lbnRzLiAgVGhlIEMgYXJndW1lbnRzIGFyZSBwcm92aWRlZCBhcyBQeU9iamVjdCAqCisgICAgIHZhbHVlcywgdGVybWluYXRlZCBieSBOVUxMLiAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjYWxsCisgICAgIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YKKyAgICAgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvLm1ldGhvZChhcmdzKS4KKyAgICAgICAqLworCisKKyAgICAgLyogSW1wbGVtZW50ZWQgZWxzZXdoZXJlOgorCisgICAgIGxvbmcgUHlPYmplY3RfSGFzaChQeU9iamVjdCAqbyk7CisKKyAgICAgQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBoYXNoLCBoYXNoX3ZhbHVlLCBvZiBhbiBvYmplY3QsIG8uICBPbgorICAgICBmYWlsdXJlLCByZXR1cm4gLTEuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogaGFzaChvKS4KKworICAgICAgICovCisKKworICAgICAvKiBJbXBsZW1lbnRlZCBlbHNld2hlcmU6CisKKyAgICAgaW50IFB5T2JqZWN0X0lzVHJ1ZShQeU9iamVjdCAqbyk7CisKKyAgICAgUmV0dXJucyAxIGlmIHRoZSBvYmplY3QsIG8sIGlzIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZSwgMCBpZiBvIGlzCisgICAgIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgYW5kIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgUHl0aG9uIGV4cHJlc3Npb246IG5vdCBub3QgbworCisgICAgICAgKi8KKworICAgICAvKiBJbXBsZW1lbnRlZCBlbHNld2hlcmU6CisKKyAgICAgaW50IFB5T2JqZWN0X05vdChQeU9iamVjdCAqbyk7CisKKyAgICAgUmV0dXJucyAwIGlmIHRoZSBvYmplY3QsIG8sIGlzIGNvbnNpZGVyZWQgdG8gYmUgdHJ1ZSwgMSBpZiBvIGlzCisgICAgIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgYW5kIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUKKyAgICAgUHl0aG9uIGV4cHJlc3Npb246IG5vdCBvCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfVHlwZShQeU9iamVjdCAqbyk7CisKKyAgICAgICAvKgorICAgICBPbiBzdWNjZXNzLCByZXR1cm5zIGEgdHlwZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0CisgICAgIHR5cGUgb2Ygb2JqZWN0IG8uIE9uIGZhaWx1cmUsIHJldHVybnMgTlVMTC4gIFRoaXMgaXMKKyAgICAgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHR5cGUobykuCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5T2JqZWN0X1NpemUoUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJuIHRoZSBzaXplIG9mIG9iamVjdCBvLiAgSWYgdGhlIG9iamVjdCwgbywgcHJvdmlkZXMKKyAgICAgYm90aCBzZXF1ZW5jZSBhbmQgbWFwcGluZyBwcm90b2NvbHMsIHRoZSBzZXF1ZW5jZSBzaXplIGlzCisgICAgIHJldHVybmVkLiBPbiBlcnJvciwgLTEgaXMgcmV0dXJuZWQuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50CisgICAgIHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbGVuKG8pLgorCisgICAgICAgKi8KKworICAgICAgIC8qIEZvciBETEwgY29tcGF0aWJpbGl0eSAqLworI3VuZGVmIFB5T2JqZWN0X0xlbmd0aAorICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5T2JqZWN0X0xlbmd0aChQeU9iamVjdCAqbyk7CisjZGVmaW5lIFB5T2JqZWN0X0xlbmd0aCBQeU9iamVjdF9TaXplCisKKyAgICAgUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBfUHlPYmplY3RfTGVuZ3RoSGludChQeU9iamVjdCAqbywgUHlfc3NpemVfdCk7CisKKyAgICAgICAvKgorICAgICBHdWVzcyB0aGUgc2l6ZSBvZiBvYmplY3QgbyB1c2luZyBsZW4obykgb3Igby5fX2xlbmd0aF9oaW50X18oKS4KKyAgICAgSWYgbmVpdGhlciBvZiB0aG9zZSByZXR1cm4gYSBub24tbmVnYXRpdmUgdmFsdWUsIHRoZW4gcmV0dXJuIHRoZQorICAgICBkZWZhdWx0IHZhbHVlLiAgSWYgb25lIG9mIHRoZSBjYWxscyBmYWlscywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIC0xLgorICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9HZXRJdGVtKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqa2V5KTsKKworICAgICAgIC8qCisgICAgIFJldHVybiBlbGVtZW50IG9mIG8gY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0LCBrZXksIG9yIE5VTEwKKyAgICAgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG9ba2V5XS4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X1NldEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICp2KTsKKworICAgICAgIC8qCisgICAgIE1hcCB0aGUgb2JqZWN0LCBrZXksIHRvIHRoZSB2YWx1ZSwgdi4gIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IG9ba2V5XT12LgorICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0RlbEl0ZW1TdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmtleSk7CisKKyAgICAgICAvKgorICAgICBSZW1vdmUgdGhlIG1hcHBpbmcgZm9yIG9iamVjdCwga2V5LCBmcm9tIHRoZSBvYmplY3QgKm8uCisgICAgIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bworICAgICB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9EZWxJdGVtKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqa2V5KTsKKworICAgICAgIC8qCisgICAgIERlbGV0ZSB0aGUgbWFwcGluZyBmb3Iga2V5IGZyb20gKm8uICBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IGRlbCBvW2tleV0uCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQXNDaGFyQnVmZmVyKFB5T2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqYnVmZmVyX2xlbik7CisKKyAgICAgICAvKgorICAgICAgVGFrZXMgYW4gYXJiaXRyYXJ5IG9iamVjdCB3aGljaCBtdXN0IHN1cHBvcnQgdGhlIChjaGFyYWN0ZXIsCisgICAgICBzaW5nbGUgc2VnbWVudCkgYnVmZmVyIGludGVyZmFjZSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gYQorICAgICAgcmVhZC1vbmx5IG1lbW9yeSBsb2NhdGlvbiB1c2VhYmxlIGFzIGNoYXJhY3RlciBiYXNlZCBpbnB1dAorICAgICAgZm9yIHN1YnNlcXVlbnQgcHJvY2Vzc2luZy4KKworICAgICAgMCBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLiAgYnVmZmVyIGFuZCBidWZmZXJfbGVuIGFyZSBvbmx5CisgICAgICBzZXQgaW4gY2FzZSBubyBlcnJvciBvY2N1cnMuIE90aGVyd2lzZSwgLTEgaXMgcmV0dXJuZWQgYW5kCisgICAgICBhbiBleGNlcHRpb24gc2V0LgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQ2hlY2tSZWFkQnVmZmVyKFB5T2JqZWN0ICpvYmopOworCisgICAgICAvKgorICAgICAgQ2hlY2tzIHdoZXRoZXIgYW4gYXJiaXRyYXJ5IG9iamVjdCBzdXBwb3J0cyB0aGUgKGNoYXJhY3RlciwKKyAgICAgIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlLiAgUmV0dXJucyAxIG9uIHN1Y2Nlc3MsIDAKKyAgICAgIG9uIGZhaWx1cmUuCisKKyAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihQeU9iamVjdCAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOworCisgICAgICAgLyoKKyAgICAgIFNhbWUgYXMgUHlPYmplY3RfQXNDaGFyQnVmZmVyKCkgZXhjZXB0IHRoYXQgdGhpcyBBUEkgZXhwZWN0cworICAgICAgKHJlYWRhYmxlLCBzaW5nbGUgc2VnbWVudCkgYnVmZmVyIGludGVyZmFjZSBhbmQgcmV0dXJucyBhCisgICAgICBwb2ludGVyIHRvIGEgcmVhZC1vbmx5IG1lbW9yeSBsb2NhdGlvbiB3aGljaCBjYW4gY29udGFpbgorICAgICAgYXJiaXRyYXJ5IGRhdGEuCisKKyAgICAgIDAgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4gIGJ1ZmZlciBhbmQgYnVmZmVyX2xlbiBhcmUgb25seQorICAgICAgc2V0IGluIGNhc2Ugbm8gZXJyb3Igb2NjdXJzLiAgT3RoZXJ3aXNlLCAtMSBpcyByZXR1cm5lZCBhbmQKKyAgICAgIGFuIGV4Y2VwdGlvbiBzZXQuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Bc1dyaXRlQnVmZmVyKFB5T2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpidWZmZXJfbGVuKTsKKworICAgICAgIC8qCisgICAgICBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHdoaWNoIG11c3Qgc3VwcG9ydCB0aGUgKHdyaXRlYWJsZSwKKyAgICAgIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhCisgICAgICB3cml0ZWFibGUgbWVtb3J5IGxvY2F0aW9uIGluIGJ1ZmZlciBvZiBzaXplIGJ1ZmZlcl9sZW4uCisKKyAgICAgIDAgaXMgcmV0dXJuZWQgb24gc3VjY2Vzcy4gIGJ1ZmZlciBhbmQgYnVmZmVyX2xlbiBhcmUgb25seQorICAgICAgc2V0IGluIGNhc2Ugbm8gZXJyb3Igb2NjdXJzLiBPdGhlcndpc2UsIC0xIGlzIHJldHVybmVkIGFuZAorICAgICAgYW4gZXhjZXB0aW9uIHNldC4KKworICAgICAgICovCisKKyAgICAvKiBuZXcgYnVmZmVyIEFQSSAqLworCisjZGVmaW5lIFB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iaikgXAorICAgICgoKG9iaiktPm9iX3R5cGUtPnRwX2FzX2J1ZmZlciAhPSBOVUxMKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoUHlUeXBlX0hhc0ZlYXR1cmUoKG9iaiktPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEFWRV9ORVdCVUZGRVIpKSAmJiBcCisgICAgICgob2JqKS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyLT5iZl9nZXRidWZmZXIgIT0gTlVMTCkpCisKKyAgICAvKiBSZXR1cm4gMSBpZiB0aGUgZ2V0YnVmZmVyIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZSwgb3RoZXJ3aXNlCisgICAgICAgcmV0dXJuIDAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfR2V0QnVmZmVyKFB5T2JqZWN0ICpvYmosIFB5X2J1ZmZlciAqdmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOworCisgICAgLyogVGhpcyBpcyBhIEMtQVBJIHZlcnNpb24gb2YgdGhlIGdldGJ1ZmZlciBmdW5jdGlvbiBjYWxsLiAgSXQgY2hlY2tzCisgICAgICAgdG8gbWFrZSBzdXJlIG9iamVjdCBoYXMgdGhlIHJlcXVpcmVkIGZ1bmN0aW9uIHBvaW50ZXIgYW5kIGlzc3VlcyB0aGUKKyAgICAgICBjYWxsLiAgUmV0dXJucyAtMSBhbmQgcmFpc2VzIGFuIGVycm9yIG9uIGZhaWx1cmUgYW5kIHJldHVybnMgMCBvbgorICAgICAgIHN1Y2Nlc3MKKyAgICAqLworCisKKyAgICAgUHlBUElfRlVOQyh2b2lkICopIFB5QnVmZmVyX0dldFBvaW50ZXIoUHlfYnVmZmVyICp2aWV3LCBQeV9zc2l6ZV90ICppbmRpY2VzKTsKKworICAgIC8qIEdldCB0aGUgbWVtb3J5IGFyZWEgcG9pbnRlZCB0byBieSB0aGUgaW5kaWNlcyBmb3IgdGhlIGJ1ZmZlciBnaXZlbi4KKyAgICAgICBOb3RlIHRoYXQgdmlldy0+bmRpbSBpcyB0aGUgYXNzdW1lZCBzaXplIG9mIGluZGljZXMKKyAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9TaXplRnJvbUZvcm1hdChjb25zdCBjaGFyICopOworCisgICAgLyogUmV0dXJuIHRoZSBpbXBsaWVkIGl0ZW1zaXplIG9mIHRoZSBkYXRhLWZvcm1hdCBhcmVhIGZyb20gYQorICAgICAgIHN0cnVjdC1zdHlsZSBkZXNjcmlwdGlvbiAqLworCisKKworICAgICBQeUFQSV9GVU5DKGludCkgUHlCdWZmZXJfVG9Db250aWd1b3VzKHZvaWQgKmJ1ZiwgUHlfYnVmZmVyICp2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpOworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9Gcm9tQ29udGlndW91cyhQeV9idWZmZXIgKnZpZXcsIHZvaWQgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLCBjaGFyIGZvcnQpOworCisKKyAgICAvKiBDb3B5IGxlbiBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGNvbnRpZ3VvdXMgY2h1bmsgb2YgbWVtb3J5CisgICAgICAgcG9pbnRlZCB0byBieSBidWYgaW50byB0aGUgYnVmZmVyIGV4cG9ydGVkIGJ5IG9iai4gIFJldHVybgorICAgICAgIDAgb24gc3VjY2VzcyBhbmQgcmV0dXJuIC0xIGFuZCByYWlzZSBhIFB5QnVmZmVyX0Vycm9yIG9uCisgICAgICAgZXJyb3IgKGkuZS4gdGhlIG9iamVjdCBkb2VzIG5vdCBoYXZlIGEgYnVmZmVyIGludGVyZmFjZSBvcgorICAgICAgIGl0IGlzIG5vdCB3b3JraW5nKS4KKworICAgICAgIElmIGZvcnQgaXMgJ0YnIGFuZCB0aGUgb2JqZWN0IGlzIG11bHRpLWRpbWVuc2lvbmFsLAorICAgICAgIHRoZW4gdGhlIGRhdGEgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgYXJyYXkgaW4KKyAgICAgICBGb3J0cmFuLXN0eWxlIChmaXJzdCBkaW1lbnNpb24gdmFyaWVzIHRoZSBmYXN0ZXN0KS4gIElmCisgICAgICAgZm9ydCBpcyAnQycsIHRoZW4gdGhlIGRhdGEgd2lsbCBiZSBjb3BpZWQgaW50byB0aGUgYXJyYXkKKyAgICAgICBpbiBDLXN0eWxlIChsYXN0IGRpbWVuc2lvbiB2YXJpZXMgdGhlIGZhc3Rlc3QpLiAgSWYgZm9ydAorICAgICAgIGlzICdBJywgdGhlbiBpdCBkb2VzIG5vdCBtYXR0ZXIgYW5kIHRoZSBjb3B5IHdpbGwgYmUgbWFkZQorICAgICAgIGluIHdoYXRldmVyIHdheSBpcyBtb3JlIGVmZmljaWVudC4KKworICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0NvcHlEYXRhKFB5T2JqZWN0ICpkZXN0LCBQeU9iamVjdCAqc3JjKTsKKworICAgIC8qIENvcHkgdGhlIGRhdGEgZnJvbSB0aGUgc3JjIGJ1ZmZlciB0byB0aGUgYnVmZmVyIG9mIGRlc3RpbmF0aW9uCisgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5QnVmZmVyX0lzQ29udGlndW91cyhQeV9idWZmZXIgKnZpZXcsIGNoYXIgZm9ydCk7CisKKworICAgICBQeUFQSV9GVU5DKHZvaWQpIFB5QnVmZmVyX0ZpbGxDb250aWd1b3VzU3RyaWRlcyhpbnQgbmRpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRlbXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmb3J0KTsKKworICAgIC8qICBGaWxsIHRoZSBzdHJpZGVzIGFycmF5IHdpdGggYnl0ZS1zdHJpZGVzIG9mIGEgY29udGlndW91cworICAgICAgICAoRm9ydHJhbi1zdHlsZSBpZiBmb3J0IGlzICdGJyBvciBDLXN0eWxlIG90aGVyd2lzZSkKKyAgICAgICAgYXJyYXkgb2YgdGhlIGdpdmVuIHNoYXBlIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcworICAgICAgICBwZXIgZWxlbWVudC4KKyAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9GaWxsSW5mbyhQeV9idWZmZXIgKnZpZXcsIFB5T2JqZWN0ICpvLCB2b2lkICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGxlbiwgaW50IHJlYWRvbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKworICAgIC8qIEZpbGxzIGluIGEgYnVmZmVyLWluZm8gc3RydWN0dXJlIGNvcnJlY3RseSBmb3IgYW4gZXhwb3J0ZXIKKyAgICAgICB0aGF0IGNhbiBvbmx5IHNoYXJlIGEgY29udGlndW91cyBjaHVuayBvZiBtZW1vcnkgb2YKKyAgICAgICAidW5zaWduZWQgYnl0ZXMiIG9mIHRoZSBnaXZlbiBsZW5ndGguIFJldHVybnMgMCBvbiBzdWNjZXNzCisgICAgICAgYW5kIC0xICh3aXRoIHJhaXNpbmcgYW4gZXJyb3IpIG9uIGVycm9yLgorICAgICAqLworCisgICAgIFB5QVBJX0ZVTkModm9pZCkgUHlCdWZmZXJfUmVsZWFzZShQeV9idWZmZXIgKnZpZXcpOworCisgICAgICAgLyogUmVsZWFzZXMgYSBQeV9idWZmZXIgb2J0YWluZWQgZnJvbSBnZXRidWZmZXIgUGFyc2VUdXBsZSdzIHMqLgorICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9Gb3JtYXQoUHlPYmplY3QqIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmZvcm1hdF9zcGVjKTsKKyAgICAgICAvKgorICAgICBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgb2YKKyAgICAgY2FsbGluZyBvYmouX19mb3JtYXRfXyhmb3JtYXRfc3BlYykuCisgICAgICAgKi8KKworLyogSXRlcmF0b3JzICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9HZXRJdGVyKFB5T2JqZWN0ICopOworICAgICAvKiBUYWtlcyBhbiBvYmplY3QgYW5kIHJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGl0LgorICAgIFRoaXMgaXMgdHlwaWNhbGx5IGEgbmV3IGl0ZXJhdG9yIGJ1dCBpZiB0aGUgYXJndW1lbnQKKyAgICBpcyBhbiBpdGVyYXRvciwgdGhpcyByZXR1cm5zIGl0c2VsZi4gKi8KKworI2RlZmluZSBQeUl0ZXJfQ2hlY2sob2JqKSBcCisgICAgKFB5VHlwZV9IYXNGZWF0dXJlKChvYmopLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfSVRFUikgJiYgXAorICAgICAob2JqKS0+b2JfdHlwZS0+dHBfaXRlcm5leHQgIT0gTlVMTCAmJiBcCisgICAgIChvYmopLT5vYl90eXBlLT50cF9pdGVybmV4dCAhPSAmX1B5T2JqZWN0X05leHROb3RJbXBsZW1lbnRlZCkKKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5SXRlcl9OZXh0KFB5T2JqZWN0ICopOworICAgICAvKiBUYWtlcyBhbiBpdGVyYXRvciBvYmplY3QgYW5kIGNhbGxzIGl0cyB0cF9pdGVybmV4dCBzbG90LAorICAgIHJldHVybmluZyB0aGUgbmV4dCB2YWx1ZS4gIElmIHRoZSBpdGVyYXRvciBpcyBleGhhdXN0ZWQsCisgICAgdGhpcyByZXR1cm5zIE5VTEwgd2l0aG91dCBzZXR0aW5nIGFuIGV4Y2VwdGlvbi4KKyAgICBOVUxMIHdpdGggYW4gZXhjZXB0aW9uIG1lYW5zIGFuIGVycm9yIG9jY3VycmVkLiAqLworCisvKiAgTnVtYmVyIFByb3RvY29sOiovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5TnVtYmVyX0NoZWNrKFB5T2JqZWN0ICpvKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgMSBpZiB0aGUgb2JqZWN0LCBvLCBwcm92aWRlcyBudW1lcmljIHByb3RvY29scywgYW5kCisgICAgIGZhbHNlIG90aGVyd2lzZS4KKworICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9BZGQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFkZGluZyBvMSBhbmQgbzIsIG9yIG51bGwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xK28yLgorCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfU3VidHJhY3QoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIG8yIGZyb20gbzEsIG9yIG51bGwgb24KKyAgICAgZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMS1vMi4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9NdWx0aXBseShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgbzEgYW5kIG8yLCBvciBudWxsIG9uCisgICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEqbzIuCisKKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9EaXZpZGUoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS9vMi4KKworCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0Zsb29yRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYW4gaW50ZWdyYWwgcmVzdWx0LAorICAgICBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMS8vbzIuCisKKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9UcnVlRGl2aWRlKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYSBmbG9hdCByZXN1bHQsCisgICAgIG9yIG51bGwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xL28yLgorCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfUmVtYWluZGVyKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHJlbWFpbmRlciBvZiBkaXZpZGluZyBvMSBieSBvMiwgb3IgbnVsbCBvbgorICAgICBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xJW8yLgorCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfRGl2bW9kKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKKworICAgICAgIC8qCisgICAgIFNlZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gZGl2bW9kLiAgUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBkaXZtb2QobzEsbzIpLgorCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfUG93ZXIoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzMpOworCisgICAgICAgLyoKKyAgICAgU2VlIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBwb3cuICBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIHBvdyhvMSxvMixvMyksIHdoZXJlIG8zIGlzIG9wdGlvbmFsLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX05lZ2F0aXZlKFB5T2JqZWN0ICpvKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIG5lZ2F0aW9uIG9mIG8gb24gc3VjY2Vzcywgb3IgbnVsbCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogLW8uCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfUG9zaXRpdmUoUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgKHdoYXQ/KSBvZiBvIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246ICtvLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0Fic29sdXRlKFB5T2JqZWN0ICpvKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIG8sIG9yIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBhYnMobykuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW52ZXJ0KFB5T2JqZWN0ICpvKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIGJpdHdpc2UgbmVnYXRpb24gb2YgbyBvbiBzdWNjZXNzLCBvciBOVUxMIG9uCisgICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgfm8uCisKKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9Mc2hpZnQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGxlZnQgc2hpZnRpbmcgbzEgYnkgbzIgb24gc3VjY2Vzcywgb3IKKyAgICAgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xIDw8IG8yLgorCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfUnNoaWZ0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByaWdodCBzaGlmdGluZyBvMSBieSBvMiBvbiBzdWNjZXNzLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbzEgPj4gbzIuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfQW5kKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIGFuZCBvZiBvMSBhbmQgbzIgb24gc3VjY2Vzcywgb3IKKyAgICAgTlVMTCBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbzEmbzIuCisKKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9Yb3IoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgYml0d2lzZSBleGNsdXNpdmUgb3Igb2YgbzEgYnkgbzIgb24gc3VjY2Vzcywgb3IKKyAgICAgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xXm8yLgorCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfT3IoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2Ugb3Igb24gbzEgYW5kIG8yIG9uIHN1Y2Nlc3MsIG9yCisgICAgIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMXxvMi4KKworICAgICAgICovCisKKyAgICAgLyogSW1wbGVtZW50ZWQgZWxzZXdoZXJlOgorCisgICAgIGludCBQeU51bWJlcl9Db2VyY2UoUHlPYmplY3QgKipwMSwgUHlPYmplY3QgKipwMik7CisKKyAgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgYWRkcmVzc2VzIG9mIHR3byB2YXJpYWJsZXMgb2YgdHlwZQorICAgICBQeU9iamVjdCouCisKKyAgICAgSWYgdGhlIG9iamVjdHMgcG9pbnRlZCB0byBieSAqcDEgYW5kICpwMiBoYXZlIHRoZSBzYW1lIHR5cGUsCisgICAgIGluY3JlbWVudCB0aGVpciByZWZlcmVuY2UgY291bnQgYW5kIHJldHVybiAwIChzdWNjZXNzKS4KKyAgICAgSWYgdGhlIG9iamVjdHMgY2FuIGJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiBudW1lcmljIHR5cGUsCisgICAgIHJlcGxhY2UgKnAxIGFuZCAqcDIgYnkgdGhlaXIgY29udmVydGVkIHZhbHVlICh3aXRoICduZXcnCisgICAgIHJlZmVyZW5jZSBjb3VudHMpLCBhbmQgcmV0dXJuIDAuCisgICAgIElmIG5vIGNvbnZlcnNpb24gaXMgcG9zc2libGUsIG9yIGlmIHNvbWUgb3RoZXIgZXJyb3Igb2NjdXJzLAorICAgICByZXR1cm4gLTEgKGZhaWx1cmUpIGFuZCBkb24ndCBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudHMuCisgICAgIFRoZSBjYWxsIFB5TnVtYmVyX0NvZXJjZSgmbzEsICZvMikgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudCBvMSwgbzIgPSBjb2VyY2UobzEsIG8yKS4KKworICAgICAgICovCisKKyNkZWZpbmUgUHlJbmRleF9DaGVjayhvYmopIFwKKyAgICgob2JqKS0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyICE9IE5VTEwgJiYgXAorICAgIFB5VHlwZV9IYXNGZWF0dXJlKChvYmopLT5vYl90eXBlLCBQeV9UUEZMQUdTX0hBVkVfSU5ERVgpICYmIFwKKyAgICAob2JqKS0+b2JfdHlwZS0+dHBfYXNfbnVtYmVyLT5uYl9pbmRleCAhPSBOVUxMKQorCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5kZXgoUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgb2JqZWN0IGNvbnZlcnRlZCB0byBhIFB5dGhvbiBsb25nIG9yIGludAorICAgICBvciBOVUxMIHdpdGggYW4gZXJyb3IgcmFpc2VkIG9uIGZhaWx1cmUuCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5TnVtYmVyX0FzU3NpemVfdChQeU9iamVjdCAqbywgUHlPYmplY3QgKmV4Yyk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSBJbnRlZ3JhbCBpbnN0YW5jZSBjb252ZXJ0ZWQgdG8gYW4gaW50LiBUaGUKKyAgICAgaW5zdGFuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgaW50IG9yIGxvbmcgb3IgaGF2ZSBhbiBfX2ludF9fCisgICAgIG1ldGhvZC4gU3RlYWxzIGludGVncmFsJ3MgcmVmZXJlbmNlLiBlcnJvcl9mb3JtYXQgd2lsbCBiZQorICAgICB1c2VkIHRvIGNyZWF0ZSB0aGUgVHlwZUVycm9yIGlmIGludGVncmFsIGlzbid0IGFjdHVhbGx5IGFuCisgICAgIEludGVncmFsIGluc3RhbmNlLiBlcnJvcl9mb3JtYXQgc2hvdWxkIGJlIGEgZm9ybWF0IHN0cmluZworICAgICB0aGF0IGNhbiBhY2NlcHQgYSBjaGFyKiBuYW1pbmcgaW50ZWdyYWwncyB0eXBlLgorICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlOdW1iZXJfQ29udmVydEludGVncmFsVG9JbnQoCisgICAgICAgICBQeU9iamVjdCAqaW50ZWdyYWwsCisgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcl9mb3JtYXQpOworCisgICAgICAgLyoKKyAgICBSZXR1cm5zIHRoZSBvYmplY3QgY29udmVydGVkIHRvIFB5X3NzaXplX3QgYnkgZ29pbmcgdGhyb3VnaAorICAgIFB5TnVtYmVyX0luZGV4IGZpcnN0LiAgSWYgYW4gb3ZlcmZsb3cgZXJyb3Igb2NjdXJzIHdoaWxlCisgICAgY29udmVydGluZyB0aGUgaW50LW9yLWxvbmcgdG8gUHlfc3NpemVfdCwgdGhlbiB0aGUgc2Vjb25kIGFyZ3VtZW50CisgICAgaXMgdGhlIGVycm9yLXR5cGUgdG8gcmV0dXJuLiAgSWYgaXQgaXMgTlVMTCwgdGhlbiB0aGUgb3ZlcmZsb3cgZXJyb3IKKyAgICBpcyBjbGVhcmVkIGFuZCB0aGUgdmFsdWUgaXMgY2xpcHBlZC4KKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW50KFB5T2JqZWN0ICpvKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGFuIGludGVnZXIgb2JqZWN0IG9uIHN1Y2Nlc3MsIG9yCisgICAgIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBpbnQobykuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfTG9uZyhQeU9iamVjdCAqbyk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSBvIGNvbnZlcnRlZCB0byBhIGxvbmcgaW50ZWdlciBvYmplY3Qgb24gc3VjY2VzcywKKyAgICAgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IGxvbmcobykuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfRmxvYXQoUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgbyBjb252ZXJ0ZWQgdG8gYSBmbG9hdCBvYmplY3Qgb24gc3VjY2Vzcywgb3IgTlVMTAorICAgICBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIGZsb2F0KG8pLgorICAgICAgICovCisKKy8qICBJbi1wbGFjZSB2YXJpYW50cyBvZiAoc29tZSBvZikgdGhlIGFib3ZlIG51bWJlciBwcm90b2NvbCBmdW5jdGlvbnMgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VBZGQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFkZGluZyBvMiB0byBvMSwgcG9zc2libHkgaW4tcGxhY2UsIG9yIG51bGwKKyAgICAgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSArPSBvMi4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlU3VidHJhY3QoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHN1YnRyYWN0aW5nIG8yIGZyb20gbzEsIHBvc3NpYmx5IGluLXBsYWNlIG9yCisgICAgIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSAtPSBvMi4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlTXVsdGlwbHkoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIG11bHRpcGx5aW5nIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IKKyAgICAgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xICo9IG8yLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VEaXZpZGUoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IgbnVsbAorICAgICBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIC89IG8yLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VGbG9vckRpdmlkZShQeU9iamVjdCAqbzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8yKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYW4gaW50ZWdyYWwgcmVzdWx0LAorICAgICBwb3NzaWJseSBpbi1wbGFjZSwgb3IgbnVsbCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEgLz0gbzIuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZVRydWVEaXZpZGUoUHlPYmplY3QgKm8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8yKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBkaXZpZGluZyBvMSBieSBvMiBnaXZpbmcgYSBmbG9hdCByZXN1bHQsCisgICAgIHBvc3NpYmx5IGluLXBsYWNlLCBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSAvPSBvMi4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlUmVtYWluZGVyKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHJlbWFpbmRlciBvZiBkaXZpZGluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2UsIG9yCisgICAgIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSAlPSBvMi4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlUG93ZXIoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm8zKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiByYWlzaW5nIG8xIHRvIHRoZSBwb3dlciBvZiBvMiwgcG9zc2libHkKKyAgICAgaW4tcGxhY2UsIG9yIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSAqKj0gbzIsIG9yIHBvdyhvMSwgbzIsIG8zKSBpZiBvMyBpcyBwcmVzZW50LgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VMc2hpZnQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGxlZnQgc2hpZnRpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgorICAgICBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEgPDw9IG8yLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VSc2hpZnQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJpZ2h0IHNoaWZ0aW5nIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSBvcgorICAgICBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEgPj49IG8yLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VBbmQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2UgYW5kIG9mIG8xIGFuZCBvMiwgcG9zc2libHkgaW4tcGxhY2UsCisgICAgIG9yIG51bGwgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xICY9IG8yLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VYb3IoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgYml0d2lzZSBleGNsdXNpdmUgb3Igb2YgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgorICAgICBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEgXj0gbzIuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZU9yKFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBiaXR3aXNlIG9yIG9mIG8xIGFuZCBvMiwgcG9zc2libHkgaW4tcGxhY2UsCisgICAgIG9yIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSB8PSBvMi4KKworICAgICAgICovCisKKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1RvQmFzZShQeU9iamVjdCAqbiwgaW50IGJhc2UpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgaW50ZWdlciBuIGNvbnZlcnRlZCB0byBhIHN0cmluZyB3aXRoIGEgYmFzZSwgd2l0aCBhIGJhc2UKKyAgICAgbWFya2VyIG9mIDBiLCAwbyBvciAweCBwcmVmaXhlZCBpZiBhcHBsaWNhYmxlLgorICAgICBJZiBuIGlzIG5vdCBhbiBpbnQgb2JqZWN0LCBpdCBpcyBjb252ZXJ0ZWQgd2l0aCBQeU51bWJlcl9JbmRleCBmaXJzdC4KKyAgICAgICAqLworCisKKy8qICBTZXF1ZW5jZSBwcm90b2NvbDoqLworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeVNlcXVlbmNlX0NoZWNrKFB5T2JqZWN0ICpvKTsKKworICAgICAgIC8qCisgICAgIFJldHVybiAxIGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgc2VxdWVuY2UgcHJvdG9jb2wsIGFuZCB6ZXJvCisgICAgIG90aGVyd2lzZS4KKworICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVNlcXVlbmNlX1NpemUoUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJuIHRoZSBzaXplIG9mIHNlcXVlbmNlIG9iamVjdCBvLCBvciAtMSBvbiBmYWlsdXJlLgorCisgICAgICAgKi8KKworICAgICAgIC8qIEZvciBETEwgY29tcGF0aWJpbGl0eSAqLworI3VuZGVmIFB5U2VxdWVuY2VfTGVuZ3RoCisgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlTZXF1ZW5jZV9MZW5ndGgoUHlPYmplY3QgKm8pOworI2RlZmluZSBQeVNlcXVlbmNlX0xlbmd0aCBQeVNlcXVlbmNlX1NpemUKKworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXF1ZW5jZV9Db25jYXQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJuIHRoZSBjb25jYXRlbmF0aW9uIG9mIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBhbmQgTlVMTCBvbgorICAgICBmYWlsdXJlLiAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMStvMi4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX1JlcGVhdChQeU9iamVjdCAqbywgUHlfc3NpemVfdCBjb3VudCk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm4gdGhlIHJlc3VsdCBvZiByZXBlYXRpbmcgc2VxdWVuY2Ugb2JqZWN0IG8gY291bnQgdGltZXMsCisgICAgIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSpjb3VudC4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX0dldEl0ZW0oUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaSk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm4gdGhlIGl0aCBlbGVtZW50IG9mIG8sIG9yIE5VTEwgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUKKyAgICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG9baV0uCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfR2V0U2xpY2UoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJuIHRoZSBzbGljZSBvZiBzZXF1ZW5jZSBvYmplY3QgbyBiZXR3ZWVuIGkxIGFuZCBpMiwgb3IKKyAgICAgTlVMTCBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogb1tpMTppMl0uCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeVNlcXVlbmNlX1NldEl0ZW0oUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaSwgUHlPYmplY3QgKnYpOworCisgICAgICAgLyoKKyAgICAgQXNzaWduIG9iamVjdCB2IHRvIHRoZSBpdGggZWxlbWVudCBvZiBvLiAgUmV0dXJucworICAgICAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogb1tpXT12LgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlTZXF1ZW5jZV9EZWxJdGVtKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkpOworCisgICAgICAgLyoKKyAgICAgRGVsZXRlIHRoZSBpdGggZWxlbWVudCBvZiBvYmplY3Qgdi4gIFJldHVybnMKKyAgICAgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IGRlbCBvW2ldLgorICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfU2V0U2xpY2UoUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaTEsIFB5X3NzaXplX3QgaTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnYpOworCisgICAgICAgLyoKKyAgICAgQXNzaWduIHRoZSBzZXF1ZW5jZSBvYmplY3QsIHYsIHRvIHRoZSBzbGljZSBpbiBzZXF1ZW5jZQorICAgICBvYmplY3QsIG8sIGZyb20gaTEgdG8gaTIuICBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlCisgICAgIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IG9baTE6aTJdPXYuCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlTZXF1ZW5jZV9EZWxTbGljZShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpMSwgUHlfc3NpemVfdCBpMik7CisKKyAgICAgICAvKgorICAgICBEZWxldGUgdGhlIHNsaWNlIGluIHNlcXVlbmNlIG9iamVjdCwgbywgZnJvbSBpMSB0byBpMi4KKyAgICAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgc3RhdGVtZW50OiBkZWwgb1tpMTppMl0uCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfVHVwbGUoUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgc2VxdWVuY2UsIG8sIGFzIGEgdHVwbGUgb24gc3VjY2VzcywgYW5kIE5VTEwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogdHVwbGUobykKKyAgICAgICAqLworCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX0xpc3QoUHlPYmplY3QgKm8pOworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHNlcXVlbmNlLCBvLCBhcyBhIGxpc3Qgb24gc3VjY2VzcywgYW5kIE5VTEwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbGlzdChvKQorICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX0Zhc3QoUHlPYmplY3QgKm8sIGNvbnN0IGNoYXIqIG0pOworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHNlcXVlbmNlLCBvLCBhcyBhIHR1cGxlLCB1bmxlc3MgaXQncyBhbHJlYWR5IGEKKyAgICAgdHVwbGUgb3IgbGlzdC4gIFVzZSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0gdG8gYWNjZXNzIHRoZQorICAgICBtZW1iZXJzIG9mIHRoaXMgbGlzdCwgYW5kIFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRSB0byBnZXQgaXRzIGxlbmd0aC4KKworICAgICBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4gIElmIHRoZSBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVyYXRpb24sCisgICAgIHJhaXNlcyBhIFR5cGVFcnJvciBleGNlcHRpb24gd2l0aCBtIGFzIHRoZSBtZXNzYWdlIHRleHQuCisgICAgICAgKi8KKworI2RlZmluZSBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUobykgXAorICAgIChQeUxpc3RfQ2hlY2sobykgPyBQeUxpc3RfR0VUX1NJWkUobykgOiBQeVR1cGxlX0dFVF9TSVpFKG8pKQorICAgICAgIC8qCisgICAgIFJldHVybiB0aGUgc2l6ZSBvZiBvLCBhc3N1bWluZyB0aGF0IG8gd2FzIHJldHVybmVkIGJ5CisgICAgIFB5U2VxdWVuY2VfRmFzdCBhbmQgaXMgbm90IE5VTEwuCisgICAgICAgKi8KKworI2RlZmluZSBQeVNlcXVlbmNlX0Zhc3RfR0VUX0lURU0obywgaSlcCisgICAgIChQeUxpc3RfQ2hlY2sobykgPyBQeUxpc3RfR0VUX0lURU0obywgaSkgOiBQeVR1cGxlX0dFVF9JVEVNKG8sIGkpKQorICAgICAgIC8qCisgICAgIFJldHVybiB0aGUgaXRoIGVsZW1lbnQgb2YgbywgYXNzdW1pbmcgdGhhdCBvIHdhcyByZXR1cm5lZCBieQorICAgICBQeVNlcXVlbmNlX0Zhc3QsIGFuZCB0aGF0IGkgaXMgd2l0aGluIGJvdW5kcy4KKyAgICAgICAqLworCisjZGVmaW5lIFB5U2VxdWVuY2VfSVRFTShvLCBpKVwKKyAgICAoIFB5X1RZUEUobyktPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKG8sIGkpICkKKyAgICAgICAvKiBBc3N1bWUgdHBfYXNfc2VxdWVuY2UgYW5kIHNxX2l0ZW0gZXhpc3QgYW5kIHRoYXQgaSBkb2VzIG5vdAorICAgICAgbmVlZCB0byBiZSBjb3JyZWN0ZWQgZm9yIGEgbmVnYXRpdmUgaW5kZXgKKyAgICAgICAqLworCisjZGVmaW5lIFB5U2VxdWVuY2VfRmFzdF9JVEVNUyhzZikgXAorICAgIChQeUxpc3RfQ2hlY2soc2YpID8gKChQeUxpc3RPYmplY3QgKikoc2YpKS0+b2JfaXRlbSBcCisgICAgICAgICAgICAgICAgICAgICAgOiAoKFB5VHVwbGVPYmplY3QgKikoc2YpKS0+b2JfaXRlbSkKKyAgICAvKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIGl0ZW0gYXJyYXkgZm9yCisgICAgICAgYW4gb2JqZWN0IHJldHVyZWQgYnkgUHlTZXF1ZW5jZV9GYXN0ICovCisKKyAgICAgUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVNlcXVlbmNlX0NvdW50KFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqdmFsdWUpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb24gdmFsdWUgb24gbywgdGhhdCBpcywKKyAgICAgcmV0dXJuIHRoZSBudW1iZXIgb2Yga2V5cyBmb3Igd2hpY2ggb1trZXldPT12YWx1ZS4gIE9uCisgICAgIGZhaWx1cmUsIHJldHVybiAtMS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8uY291bnQodmFsdWUpLgorICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfQ29udGFpbnMoUHlPYmplY3QgKnNlcSwgUHlPYmplY3QgKm9iKTsKKyAgICAgICAvKgorICAgICBSZXR1cm4gLTEgaWYgZXJyb3I7IDEgaWYgb2IgaW4gc2VxOyAwIGlmIG9iIG5vdCBpbiBzZXEuCisgICAgIFVzZSBfX2NvbnRhaW5zX18gaWYgcG9zc2libGUsIGVsc2UgX1B5U2VxdWVuY2VfSXRlclNlYXJjaCgpLgorICAgICAgICovCisKKyNkZWZpbmUgUFlfSVRFUlNFQVJDSF9DT1VOVCAgICAxCisjZGVmaW5lIFBZX0lURVJTRUFSQ0hfSU5ERVggICAgMgorI2RlZmluZSBQWV9JVEVSU0VBUkNIX0NPTlRBSU5TIDMKKyAgICAgUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKFB5T2JqZWN0ICpzZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm9iaiwgaW50IG9wZXJhdGlvbik7CisgICAgLyoKKyAgICAgIEl0ZXJhdGUgb3ZlciBzZXEuICBSZXN1bHQgZGVwZW5kcyBvbiB0aGUgb3BlcmF0aW9uOgorICAgICAgUFlfSVRFUlNFQVJDSF9DT1VOVDogIHJldHVybiAjIG9mIHRpbWVzIG9iaiBhcHBlYXJzIGluIHNlcTsgLTEgaWYKKyAgICAgICAgZXJyb3IuCisgICAgICBQWV9JVEVSU0VBUkNIX0lOREVYOiAgcmV0dXJuIDAtYmFzZWQgaW5kZXggb2YgZmlyc3Qgb2NjdXJyZW5jZSBvZgorICAgICAgICBvYmogaW4gc2VxOyBzZXQgVmFsdWVFcnJvciBhbmQgcmV0dXJuIC0xIGlmIG5vbmUgZm91bmQ7CisgICAgICAgIGFsc28gcmV0dXJuIC0xIG9uIGVycm9yLgorICAgICAgUFlfSVRFUlNFQVJDSF9DT05UQUlOUzogIHJldHVybiAxIGlmIG9iaiBpbiBzZXEsIGVsc2UgMDsgLTEgb24KKyAgICAgICAgZXJyb3IuCisgICAgKi8KKworLyogRm9yIERMTC1sZXZlbCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworI3VuZGVmIFB5U2VxdWVuY2VfSW4KKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfSW4oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICp2YWx1ZSk7CisKKy8qIEZvciBzb3VyY2UtbGV2ZWwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyNkZWZpbmUgUHlTZXF1ZW5jZV9JbiBQeVNlcXVlbmNlX0NvbnRhaW5zCisKKyAgICAgICAvKgorICAgICBEZXRlcm1pbmUgaWYgbyBjb250YWlucyB2YWx1ZS4gIElmIGFuIGl0ZW0gaW4gbyBpcyBlcXVhbCB0bworICAgICBYLCByZXR1cm4gMSwgb3RoZXJ3aXNlIHJldHVybiAwLiAgT24gZXJyb3IsIHJldHVybiAtMS4gIFRoaXMKKyAgICAgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHZhbHVlIGluIG8uCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5U2VxdWVuY2VfSW5kZXgoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICp2YWx1ZSk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm4gdGhlIGZpcnN0IGluZGV4IGZvciB3aGljaCBvW2ldPXZhbHVlLiAgT24gZXJyb3IsCisgICAgIHJldHVybiAtMS4gICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogby5pbmRleCh2YWx1ZSkuCisgICAgICAgKi8KKworLyogSW4tcGxhY2UgdmVyc2lvbnMgb2Ygc29tZSBvZiB0aGUgYWJvdmUgU2VxdWVuY2UgZnVuY3Rpb25zLiAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKKworICAgICAgIC8qCisgICAgIEFwcGVuZCBvMiB0byBvMSwgaW4tcGxhY2Ugd2hlbiBwb3NzaWJsZS4gUmV0dXJuIHRoZSByZXN1bHRpbmcKKyAgICAgb2JqZWN0LCB3aGljaCBjb3VsZCBiZSBvMSwgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUKKyAgICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xICs9IG8yLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfSW5QbGFjZVJlcGVhdChQeU9iamVjdCAqbywgUHlfc3NpemVfdCBjb3VudCk7CisKKyAgICAgICAvKgorICAgICBSZXBlYXQgbzEgYnkgY291bnQsIGluLXBsYWNlIHdoZW4gcG9zc2libGUuIFJldHVybiB0aGUgcmVzdWx0aW5nCisgICAgIG9iamVjdCwgd2hpY2ggY291bGQgYmUgbzEsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlCisgICAgIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBvMSAqPSBjb3VudC4KKworICAgICAgICovCisKKy8qICBNYXBwaW5nIHByb3RvY29sOiovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5TWFwcGluZ19DaGVjayhQeU9iamVjdCAqbyk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm4gMSBpZiB0aGUgb2JqZWN0IHByb3ZpZGVzIG1hcHBpbmcgcHJvdG9jb2wsIGFuZCB6ZXJvCisgICAgIG90aGVyd2lzZS4KKworICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlNYXBwaW5nX1NpemUoUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGtleXMgaW4gb2JqZWN0IG8gb24gc3VjY2VzcywgYW5kIC0xIG9uCisgICAgIGZhaWx1cmUuICBGb3Igb2JqZWN0cyB0aGF0IGRvIG5vdCBwcm92aWRlIHNlcXVlbmNlIHByb3RvY29sLAorICAgICB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOiBsZW4obykuCisgICAgICAgKi8KKworICAgICAgIC8qIEZvciBETEwgY29tcGF0aWJpbGl0eSAqLworI3VuZGVmIFB5TWFwcGluZ19MZW5ndGgKKyAgICAgUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeU1hcHBpbmdfTGVuZ3RoKFB5T2JqZWN0ICpvKTsKKyNkZWZpbmUgUHlNYXBwaW5nX0xlbmd0aCBQeU1hcHBpbmdfU2l6ZQorCisKKyAgICAgLyogaW1wbGVtZW50ZWQgYXMgYSBtYWNybzoKKworICAgICBpbnQgUHlNYXBwaW5nX0RlbEl0ZW1TdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmtleSk7CisKKyAgICAgUmVtb3ZlIHRoZSBtYXBwaW5nIGZvciBvYmplY3QsIGtleSwgZnJvbSB0aGUgb2JqZWN0ICpvLgorICAgICBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IGRlbCBvW2tleV0uCisgICAgICAgKi8KKyNkZWZpbmUgUHlNYXBwaW5nX0RlbEl0ZW1TdHJpbmcoTyxLKSBQeU9iamVjdF9EZWxJdGVtU3RyaW5nKChPKSwoSykpCisKKyAgICAgLyogaW1wbGVtZW50ZWQgYXMgYSBtYWNybzoKKworICAgICBpbnQgUHlNYXBwaW5nX0RlbEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpOworCisgICAgIFJlbW92ZSB0aGUgbWFwcGluZyBmb3Igb2JqZWN0LCBrZXksIGZyb20gdGhlIG9iamVjdCAqby4KKyAgICAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAgIHRoZSBQeXRob24gc3RhdGVtZW50OiBkZWwgb1trZXldLgorICAgICAgICovCisjZGVmaW5lIFB5TWFwcGluZ19EZWxJdGVtKE8sSykgUHlPYmplY3RfRGVsSXRlbSgoTyksKEspKQorCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU1hcHBpbmdfSGFzS2V5U3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpOworCisgICAgICAgLyoKKyAgICAgT24gc3VjY2VzcywgcmV0dXJuIDEgaWYgdGhlIG1hcHBpbmcgb2JqZWN0IGhhcyB0aGUga2V5LCBrZXksCisgICAgIGFuZCAwIG90aGVyd2lzZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8uaGFzX2tleShrZXkpLgorCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5TWFwcGluZ19IYXNLZXkoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJuIDEgaWYgdGhlIG1hcHBpbmcgb2JqZWN0IGhhcyB0aGUga2V5LCBrZXksCisgICAgIGFuZCAwIG90aGVyd2lzZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8uaGFzX2tleShrZXkpLgorCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorCisgICAgICAgKi8KKworICAgICAvKiBJbXBsZW1lbnRlZCBhcyBtYWNybzoKKworICAgICBQeU9iamVjdCAqUHlNYXBwaW5nX0tleXMoUHlPYmplY3QgKm8pOworCisgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiBhIGxpc3Qgb2YgdGhlIGtleXMgaW4gb2JqZWN0IG8uICBPbgorICAgICBmYWlsdXJlLCByZXR1cm4gTlVMTC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogby5rZXlzKCkuCisgICAgICAgKi8KKyNkZWZpbmUgUHlNYXBwaW5nX0tleXMoTykgUHlPYmplY3RfQ2FsbE1ldGhvZChPLCJrZXlzIixOVUxMKQorCisgICAgIC8qIEltcGxlbWVudGVkIGFzIG1hY3JvOgorCisgICAgIFB5T2JqZWN0ICpQeU1hcHBpbmdfVmFsdWVzKFB5T2JqZWN0ICpvKTsKKworICAgICBPbiBzdWNjZXNzLCByZXR1cm4gYSBsaXN0IG9mIHRoZSB2YWx1ZXMgaW4gb2JqZWN0IG8uICBPbgorICAgICBmYWlsdXJlLCByZXR1cm4gTlVMTC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogby52YWx1ZXMoKS4KKyAgICAgICAqLworI2RlZmluZSBQeU1hcHBpbmdfVmFsdWVzKE8pIFB5T2JqZWN0X0NhbGxNZXRob2QoTywidmFsdWVzIixOVUxMKQorCisgICAgIC8qIEltcGxlbWVudGVkIGFzIG1hY3JvOgorCisgICAgIFB5T2JqZWN0ICpQeU1hcHBpbmdfSXRlbXMoUHlPYmplY3QgKm8pOworCisgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiBhIGxpc3Qgb2YgdGhlIGl0ZW1zIGluIG9iamVjdCBvLCB3aGVyZQorICAgICBlYWNoIGl0ZW0gaXMgYSB0dXBsZSBjb250YWluaW5nIGEga2V5LXZhbHVlIHBhaXIuICBPbgorICAgICBmYWlsdXJlLCByZXR1cm4gTlVMTC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogby5pdGVtcygpLgorCisgICAgICAgKi8KKyNkZWZpbmUgUHlNYXBwaW5nX0l0ZW1zKE8pIFB5T2JqZWN0X0NhbGxNZXRob2QoTywiaXRlbXMiLE5VTEwpCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU1hcHBpbmdfR2V0SXRlbVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5KTsKKworICAgICAgIC8qCisgICAgIFJldHVybiBlbGVtZW50IG9mIG8gY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0LCBrZXksIG9yIE5VTEwKKyAgICAgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG9ba2V5XS4KKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU1hcHBpbmdfU2V0SXRlbVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdmFsdWUpOworCisgICAgICAgLyoKKyAgICAgTWFwIHRoZSBvYmplY3QsIGtleSwgdG8gdGhlIHZhbHVlLCB2LiAgUmV0dXJucworICAgICAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogb1trZXldPXYuCisgICAgICAqLworCisKK1B5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Jc0luc3RhbmNlKFB5T2JqZWN0ICpvYmplY3QsIFB5T2JqZWN0ICp0eXBlb3JjbGFzcyk7CisgICAgICAvKiBpc2luc3RhbmNlKG9iamVjdCwgdHlwZW9yY2xhc3MpICovCisKK1B5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Jc1N1YmNsYXNzKFB5T2JqZWN0ICpvYmplY3QsIFB5T2JqZWN0ICp0eXBlb3JjbGFzcyk7CisgICAgICAvKiBpc3N1YmNsYXNzKG9iamVjdCwgdHlwZW9yY2xhc3MpICovCisKKworUHlBUElfRlVOQyhpbnQpIF9QeU9iamVjdF9SZWFsSXNJbnN0YW5jZShQeU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKmNscyk7CisKK1B5QVBJX0ZVTkMoaW50KSBfUHlPYmplY3RfUmVhbElzU3ViY2xhc3MoUHlPYmplY3QgKmRlcml2ZWQsIFB5T2JqZWN0ICpjbHMpOworCisKKy8qIEZvciBpbnRlcm5hbCB1c2UgYnkgYnVmZmVyIEFQSSBmdW5jdGlvbnMgKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5X2FkZF9vbmVfdG9faW5kZXhfRihpbnQgbmQsIFB5X3NzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgKnNoYXBlKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5X2FkZF9vbmVfdG9faW5kZXhfQyhpbnQgbmQsIFB5X3NzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFB5X3NzaXplX3QgKnNoYXBlKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIFB5X0FCU1RSQUNUT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2FzZGwuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2FzZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGU4MzdlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvYXNkbC5oCkBAIC0wLDAgKzEsNDUgQEAKKyNpZm5kZWYgUHlfQVNETF9ICisjZGVmaW5lIFB5X0FTRExfSAorCit0eXBlZGVmIFB5T2JqZWN0ICogaWRlbnRpZmllcjsKK3R5cGVkZWYgUHlPYmplY3QgKiBzdHJpbmc7Cit0eXBlZGVmIFB5T2JqZWN0ICogb2JqZWN0OworCisjaWZuZGVmIF9fY3BsdXNwbHVzCit0eXBlZGVmIGVudW0ge2ZhbHNlLCB0cnVlfSBib29sOworI2VuZGlmCisKKy8qIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhlIGNvZGUgZ2VuZXJhdGVkIGJ5IGFzZGxfYy5weSB3YXMgY29tcGxldGVseQorICAgaW5kZXBlbmRlbnQgb2YgUHl0aG9uLCBidXQgaXQgaXMgYSBnb2FsIHRoZSByZXF1aXJlcyB0b28gbXVjaCB3b3JrCisgICBhdCB0aGlzIHN0YWdlLiAgU28sIGZvciBleGFtcGxlLCBJJ2xsIHJlcHJlc2VudCBpZGVudGlmaWVycyBhcworICAgaW50ZXJuZWQgUHl0aG9uIHN0cmluZ3MuCisqLworCisvKiBYWFggQSBzZXF1ZW5jZSBzaG91bGQgYmUgdHlwZWQgc28gdGhhdCBpdHMgdXNlIGNhbiBiZSB0eXBlY2hlY2tlZC4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBzaXplOworICAgIHZvaWQgKmVsZW1lbnRzWzFdOworfSBhc2RsX3NlcTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBzaXplOworICAgIGludCBlbGVtZW50c1sxXTsKK30gYXNkbF9pbnRfc2VxOworCithc2RsX3NlcSAqYXNkbF9zZXFfbmV3KGludCBzaXplLCBQeUFyZW5hICphcmVuYSk7Cithc2RsX2ludF9zZXEgKmFzZGxfaW50X3NlcV9uZXcoaW50IHNpemUsIFB5QXJlbmEgKmFyZW5hKTsKKworI2RlZmluZSBhc2RsX3NlcV9HRVQoUywgSSkgKFMpLT5lbGVtZW50c1soSSldCisjZGVmaW5lIGFzZGxfc2VxX0xFTihTKSAoKFMpID09IE5VTEwgPyAwIDogKFMpLT5zaXplKQorI2lmZGVmIFB5X0RFQlVHCisjZGVmaW5lIGFzZGxfc2VxX1NFVChTLCBJLCBWKSB7IFwKKyAgICAgICAgaW50IF9hc2RsX2kgPSAoSSk7IFwKKyAgICAgICAgYXNzZXJ0KChTKSAmJiBfYXNkbF9pIDwgKFMpLT5zaXplKTsgXAorICAgICAgICAoUyktPmVsZW1lbnRzW19hc2RsX2ldID0gKFYpOyBcCit9CisjZWxzZQorI2RlZmluZSBhc2RsX3NlcV9TRVQoUywgSSwgVikgKFMpLT5lbGVtZW50c1tJXSA9IChWKQorI2VuZGlmCisKKyNlbmRpZiAvKiAhUHlfQVNETF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9hc3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2FzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMTRiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9hc3QuaApAQCAtMCwwICsxLDEzIEBACisjaWZuZGVmIFB5X0FTVF9ICisjZGVmaW5lIFB5X0FTVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0ZVTkMobW9kX3R5KSBQeUFTVF9Gcm9tTm9kZShjb25zdCBub2RlICosIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsCisJCQkJICBjb25zdCBjaGFyICosIFB5QXJlbmEgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0FTVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9iaXRzZXQuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2JpdHNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZWI0MTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9iaXRzZXQuaApAQCAtMCwwICsxLDMyIEBACisKKyNpZm5kZWYgUHlfQklUU0VUX0gKKyNkZWZpbmUgUHlfQklUU0VUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQml0c2V0IGludGVyZmFjZSAqLworCisjZGVmaW5lIEJZVEUJCWNoYXIKKwordHlwZWRlZiBCWVRFICpiaXRzZXQ7CisKK2JpdHNldCBuZXdiaXRzZXQoaW50IG5iaXRzKTsKK3ZvaWQgZGVsYml0c2V0KGJpdHNldCBicyk7CisjZGVmaW5lIHRlc3RiaXQoc3MsIGliaXQpICgoKHNzKVtCSVQyQllURShpYml0KV0gJiBCSVQyTUFTSyhpYml0KSkgIT0gMCkKK2ludCBhZGRiaXQoYml0c2V0IGJzLCBpbnQgaWJpdCk7IC8qIFJldHVybnMgMCBpZiBhbHJlYWR5IHNldCAqLworaW50IHNhbWViaXRzZXQoYml0c2V0IGJzMSwgYml0c2V0IGJzMiwgaW50IG5iaXRzKTsKK3ZvaWQgbWVyZ2ViaXRzZXQoYml0c2V0IGJzMSwgYml0c2V0IGJzMiwgaW50IG5iaXRzKTsKKworI2RlZmluZSBCSVRTUEVSQllURQkoOCpzaXplb2YoQllURSkpCisjZGVmaW5lIE5CWVRFUyhuYml0cykJKCgobmJpdHMpICsgQklUU1BFUkJZVEUgLSAxKSAvIEJJVFNQRVJCWVRFKQorCisjZGVmaW5lIEJJVDJCWVRFKGliaXQpCSgoaWJpdCkgLyBCSVRTUEVSQllURSkKKyNkZWZpbmUgQklUMlNISUZUKGliaXQpCSgoaWJpdCkgJSBCSVRTUEVSQllURSkKKyNkZWZpbmUgQklUMk1BU0soaWJpdCkJKDEgPDwgQklUMlNISUZUKGliaXQpKQorI2RlZmluZSBCWVRFMkJJVChpYnl0ZSkJKChpYnl0ZSkgKiBCSVRTUEVSQllURSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfQklUU0VUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2Jvb2xvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2Jvb2xvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGU4NTRmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvYm9vbG9iamVjdC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIEJvb2xlYW4gb2JqZWN0IGludGVyZmFjZSAqLworCisjaWZuZGVmIFB5X0JPT0xPQkpFQ1RfSAorI2RlZmluZSBQeV9CT09MT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCit0eXBlZGVmIFB5SW50T2JqZWN0IFB5Qm9vbE9iamVjdDsKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5Qm9vbF9UeXBlOworCisjZGVmaW5lIFB5Qm9vbF9DaGVjayh4KSAoUHlfVFlQRSh4KSA9PSAmUHlCb29sX1R5cGUpCisKKy8qIFB5X0ZhbHNlIGFuZCBQeV9UcnVlIGFyZSB0aGUgb25seSB0d28gYm9vbHMgaW4gZXhpc3RlbmNlLgorRG9uJ3QgZm9yZ2V0IHRvIGFwcGx5IFB5X0lOQ1JFRigpIHdoZW4gcmV0dXJuaW5nIGVpdGhlciEhISAqLworCisvKiBEb24ndCB1c2UgdGhlc2UgZGlyZWN0bHkgKi8KK1B5QVBJX0RBVEEoUHlJbnRPYmplY3QpIF9QeV9aZXJvU3RydWN0LCBfUHlfVHJ1ZVN0cnVjdDsKKworLyogVXNlIHRoZXNlIG1hY3JvcyAqLworI2RlZmluZSBQeV9GYWxzZSAoKFB5T2JqZWN0ICopICZfUHlfWmVyb1N0cnVjdCkKKyNkZWZpbmUgUHlfVHJ1ZSAoKFB5T2JqZWN0ICopICZfUHlfVHJ1ZVN0cnVjdCkKKworLyogTWFjcm9zIGZvciByZXR1cm5pbmcgUHlfVHJ1ZSBvciBQeV9GYWxzZSwgcmVzcGVjdGl2ZWx5ICovCisjZGVmaW5lIFB5X1JFVFVSTl9UUlVFIHJldHVybiBQeV9JTkNSRUYoUHlfVHJ1ZSksIFB5X1RydWUKKyNkZWZpbmUgUHlfUkVUVVJOX0ZBTFNFIHJldHVybiBQeV9JTkNSRUYoUHlfRmFsc2UpLCBQeV9GYWxzZQorCisvKiBGdW5jdGlvbiB0byByZXR1cm4gYSBib29sIGZyb20gYSBDIGxvbmcgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlCb29sX0Zyb21Mb25nKGxvbmcpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9CT09MT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2J1ZmZlcm9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvYnVmZmVyb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkODM0NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2J1ZmZlcm9iamVjdC5oCkBAIC0wLDAgKzEsMzMgQEAKKworLyogQnVmZmVyIG9iamVjdCBpbnRlcmZhY2UgKi8KKworLyogTm90ZTogdGhlIG9iamVjdCdzIHN0cnVjdHVyZSBpcyBwcml2YXRlICovCisKKyNpZm5kZWYgUHlfQlVGRkVST0JKRUNUX0gKKyNkZWZpbmUgUHlfQlVGRkVST0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlCdWZmZXJfVHlwZTsKKworI2RlZmluZSBQeUJ1ZmZlcl9DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeUJ1ZmZlcl9UeXBlKQorCisjZGVmaW5lIFB5X0VORF9PRl9CVUZGRVIJKC0xKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5QnVmZmVyX0Zyb21PYmplY3QoUHlPYmplY3QgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvZmZzZXQsIFB5X3NzaXplX3Qgc2l6ZSk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5QnVmZmVyX0Zyb21SZWFkV3JpdGVPYmplY3QoUHlPYmplY3QgKmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBzaXplKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUJ1ZmZlcl9Gcm9tTWVtb3J5KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlCdWZmZXJfRnJvbVJlYWRXcml0ZU1lbW9yeSh2b2lkICpwdHIsIFB5X3NzaXplX3Qgc2l6ZSk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlCdWZmZXJfTmV3KFB5X3NzaXplX3Qgc2l6ZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0JVRkZFUk9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9ieXRlYXJyYXlvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2J5dGVhcnJheW9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMjgxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9ieXRlYXJyYXlvYmplY3QuaApAQCAtMCwwICsxLDU3IEBACisvKiBCeXRlQXJyYXkgb2JqZWN0IGludGVyZmFjZSAqLworCisjaWZuZGVmIFB5X0JZVEVBUlJBWU9CSkVDVF9ICisjZGVmaW5lIFB5X0JZVEVBUlJBWU9CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogVHlwZSBQeUJ5dGVBcnJheU9iamVjdCByZXByZXNlbnRzIGEgbXV0YWJsZSBhcnJheSBvZiBieXRlcy4KKyAqIFRoZSBQeXRob24gQVBJIGlzIHRoYXQgb2YgYSBzZXF1ZW5jZTsKKyAqIHRoZSBieXRlcyBhcmUgbWFwcGVkIHRvIGludHMgaW4gWzAsIDI1NikuCisgKiBCeXRlcyBhcmUgbm90IGNoYXJhY3RlcnM7IHRoZXkgbWF5IGJlIHVzZWQgdG8gZW5jb2RlIGNoYXJhY3RlcnMuCisgKiBUaGUgb25seSB3YXkgdG8gZ28gYmV0d2VlbiBieXRlcyBhbmQgc3RyL3VuaWNvZGUgaXMgdmlhIGVuY29kaW5nCisgKiBhbmQgZGVjb2RpbmcuCisgKiBGb3IgdGhlIGNvbnZlbmllbmNlIG9mIEMgcHJvZ3JhbW1lcnMsIHRoZSBieXRlcyB0eXBlIGlzIGNvbnNpZGVyZWQKKyAqIHRvIGNvbnRhaW4gYSBjaGFyIHBvaW50ZXIsIG5vdCBhbiB1bnNpZ25lZCBjaGFyIHBvaW50ZXIuCisgKi8KKworLyogT2JqZWN0IGxheW91dCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X1ZBUl9IRUFECisgICAgLyogWFhYKG5ub3J3aXR6KTogc2hvdWxkIG9iX2V4cG9ydHMgYmUgUHlfc3NpemVfdD8gKi8KKyAgICBpbnQgb2JfZXhwb3J0czsgLyogaG93IG1hbnkgYnVmZmVyIGV4cG9ydHMgKi8KKyAgICBQeV9zc2l6ZV90IG9iX2FsbG9jOyAvKiBIb3cgbWFueSBieXRlcyBhbGxvY2F0ZWQgKi8KKyAgICBjaGFyICpvYl9ieXRlczsKK30gUHlCeXRlQXJyYXlPYmplY3Q7CisKKy8qIFR5cGUgb2JqZWN0ICovCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlCeXRlQXJyYXlfVHlwZTsKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUJ5dGVBcnJheUl0ZXJfVHlwZTsKKworLyogVHlwZSBjaGVjayBtYWNyb3MgKi8KKyNkZWZpbmUgUHlCeXRlQXJyYXlfQ2hlY2soc2VsZikgUHlPYmplY3RfVHlwZUNoZWNrKHNlbGYsICZQeUJ5dGVBcnJheV9UeXBlKQorI2RlZmluZSBQeUJ5dGVBcnJheV9DaGVja0V4YWN0KHNlbGYpIChQeV9UWVBFKHNlbGYpID09ICZQeUJ5dGVBcnJheV9UeXBlKQorCisvKiBEaXJlY3QgQVBJIGZ1bmN0aW9ucyAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUJ5dGVBcnJheV9Gcm9tT2JqZWN0KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUJ5dGVBcnJheV9Db25jYXQoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Qnl0ZUFycmF5X0Zyb21TdHJpbmdBbmRTaXplKGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5Qnl0ZUFycmF5X1NpemUoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGNoYXIgKikgUHlCeXRlQXJyYXlfQXNTdHJpbmcoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlCeXRlQXJyYXlfUmVzaXplKFB5T2JqZWN0ICosIFB5X3NzaXplX3QpOworCisvKiBNYWNyb3MsIHRyYWRpbmcgc2FmZXR5IGZvciBzcGVlZCAqLworI2RlZmluZSBQeUJ5dGVBcnJheV9BU19TVFJJTkcoc2VsZikgXAorICAgIChhc3NlcnQoUHlCeXRlQXJyYXlfQ2hlY2soc2VsZikpLCBcCisgICAgIFB5X1NJWkUoc2VsZikgPyAoKFB5Qnl0ZUFycmF5T2JqZWN0ICopKHNlbGYpKS0+b2JfYnl0ZXMgOiBfUHlCeXRlQXJyYXlfZW1wdHlfc3RyaW5nKQorI2RlZmluZSBQeUJ5dGVBcnJheV9HRVRfU0laRShzZWxmKSAgKGFzc2VydChQeUJ5dGVBcnJheV9DaGVjayhzZWxmKSksUHlfU0laRShzZWxmKSkKKworUHlBUElfREFUQShjaGFyKSBfUHlCeXRlQXJyYXlfZW1wdHlfc3RyaW5nW107CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0JZVEVBUlJBWU9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9ieXRlc19tZXRob2RzLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9ieXRlc19tZXRob2RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyNTY2NgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2J5dGVzX21ldGhvZHMuaApAQCAtMCwwICsxLDc1IEBACisjaWZuZGVmIFB5X0JZVEVTX0NUWVBFX0gKKyNkZWZpbmUgUHlfQllURVNfQ1RZUEVfSAorCisvKgorICogVGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIGJlaGluZCBQeVN0cmluZyAoYnl0ZXMpIGFuZCBQeUJ5dGVzIChidWZmZXIpCisgKiBtZXRob2RzIG9mIHRoZSBnaXZlbiBuYW1lcywgdGhleSBvcGVyYXRlIG9uIEFTQ0lJIGJ5dGUgc3RyaW5ncy4KKyAqLworZXh0ZXJuIFB5T2JqZWN0KiBfUHlfYnl0ZXNfaXNzcGFjZShjb25zdCBjaGFyICpjcHRyLCBQeV9zc2l6ZV90IGxlbik7CitleHRlcm4gUHlPYmplY3QqIF9QeV9ieXRlc19pc2FscGhhKGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiBQeU9iamVjdCogX1B5X2J5dGVzX2lzYWxudW0oY29uc3QgY2hhciAqY3B0ciwgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIFB5T2JqZWN0KiBfUHlfYnl0ZXNfaXNkaWdpdChjb25zdCBjaGFyICpjcHRyLCBQeV9zc2l6ZV90IGxlbik7CitleHRlcm4gUHlPYmplY3QqIF9QeV9ieXRlc19pc2xvd2VyKGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiBQeU9iamVjdCogX1B5X2J5dGVzX2lzdXBwZXIoY29uc3QgY2hhciAqY3B0ciwgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIFB5T2JqZWN0KiBfUHlfYnl0ZXNfaXN0aXRsZShjb25zdCBjaGFyICpjcHRyLCBQeV9zc2l6ZV90IGxlbik7CisKKy8qIFRoZXNlIHN0b3JlIHRoZWlyIGxlbiBzaXplZCBhbnN3ZXIgaW4gdGhlIGdpdmVuIHByZWFsbG9jYXRlZCAqcmVzdWx0IGFyZy4gKi8KK2V4dGVybiB2b2lkIF9QeV9ieXRlc19sb3dlcihjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIF9QeV9ieXRlc191cHBlcihjaGFyICpyZXN1bHQsIGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIF9QeV9ieXRlc190aXRsZShjaGFyICpyZXN1bHQsIGNoYXIgKnMsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkIF9QeV9ieXRlc19jYXBpdGFsaXplKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3N3YXBjYXNlKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOworCisvKiBTaGFyZWQgX19kb2NfXyBzdHJpbmdzLiAqLworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2lzc3BhY2VfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfaXNhbHBoYV9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9pc2FsbnVtX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2lzZGlnaXRfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfaXNsb3dlcl9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9pc3VwcGVyX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2lzdGl0bGVfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfbG93ZXJfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfdXBwZXJfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfdGl0bGVfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfY2FwaXRhbGl6ZV9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9zd2FwY2FzZV9fZG9jX19bXTsKKworLyogVGhlc2UgYXJlIGxlZnQgaW4gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIHdpbGwgYmUgcmVtb3ZlZAorICAgaW4gMi44LzMuMiAqLworI2RlZmluZSBJU0xPV0VSKGMpICBQeV9JU0xPV0VSKGMpCisjZGVmaW5lIElTVVBQRVIoYykgIFB5X0lTVVBQRVIoYykKKyNkZWZpbmUgSVNBTFBIQShjKSAgUHlfSVNBTFBIQShjKQorI2RlZmluZSBJU0RJR0lUKGMpICBQeV9JU0RJR0lUKGMpCisjZGVmaW5lIElTWERJR0lUKGMpIFB5X0lTWERJR0lUKGMpCisjZGVmaW5lIElTQUxOVU0oYykgIFB5X0lTQUxOVU0oYykKKyNkZWZpbmUgSVNTUEFDRShjKSAgUHlfSVNTUEFDRShjKQorCisjdW5kZWYgaXNsb3dlcgorI2RlZmluZSBpc2xvd2VyKGMpIHVuZGVmaW5lZF9pc2xvd2VyKGMpCisjdW5kZWYgaXN1cHBlcgorI2RlZmluZSBpc3VwcGVyKGMpIHVuZGVmaW5lZF9pc3VwcGVyKGMpCisjdW5kZWYgaXNhbHBoYQorI2RlZmluZSBpc2FscGhhKGMpIHVuZGVmaW5lZF9pc2FscGhhKGMpCisjdW5kZWYgaXNkaWdpdAorI2RlZmluZSBpc2RpZ2l0KGMpIHVuZGVmaW5lZF9pc2RpZ2l0KGMpCisjdW5kZWYgaXN4ZGlnaXQKKyNkZWZpbmUgaXN4ZGlnaXQoYykgdW5kZWZpbmVkX2lzeGRpZ2l0KGMpCisjdW5kZWYgaXNhbG51bQorI2RlZmluZSBpc2FsbnVtKGMpIHVuZGVmaW5lZF9pc2FsbnVtKGMpCisjdW5kZWYgaXNzcGFjZQorI2RlZmluZSBpc3NwYWNlKGMpIHVuZGVmaW5lZF9pc3NwYWNlKGMpCisKKy8qIFRoZXNlIGFyZSBsZWZ0IGluIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFuZCB3aWxsIGJlIHJlbW92ZWQKKyAgIGluIDIuOC8zLjIgKi8KKyNkZWZpbmUgVE9MT1dFUihjKSBQeV9UT0xPV0VSKGMpCisjZGVmaW5lIFRPVVBQRVIoYykgUHlfVE9VUFBFUihjKQorCisjdW5kZWYgdG9sb3dlcgorI2RlZmluZSB0b2xvd2VyKGMpIHVuZGVmaW5lZF90b2xvd2VyKGMpCisjdW5kZWYgdG91cHBlcgorI2RlZmluZSB0b3VwcGVyKGMpIHVuZGVmaW5lZF90b3VwcGVyKGMpCisKKy8qIHRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugc29tZSBkb2NzIGFyZSBzaGFyZWQgZnJvbSB0aGUgLm8sIG5vdCBzdGF0aWMgKi8KKyNkZWZpbmUgUHlEb2NfU1RSVkFSX3NoYXJlZChuYW1lLHN0cikgY29uc3QgY2hhciBuYW1lW10gPSBQeURvY19TVFIoc3RyKQorCisjZW5kaWYgLyogIVB5X0JZVEVTX0NUWVBFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2J5dGVzb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9ieXRlc29iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODNkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9ieXRlc29iamVjdC5oCkBAIC0wLDAgKzEsMjcgQEAKKyNkZWZpbmUgUHlCeXRlc09iamVjdCBQeVN0cmluZ09iamVjdAorI2RlZmluZSBQeUJ5dGVzX1R5cGUgUHlTdHJpbmdfVHlwZQorCisjZGVmaW5lIFB5Qnl0ZXNfQ2hlY2sgUHlTdHJpbmdfQ2hlY2sKKyNkZWZpbmUgUHlCeXRlc19DaGVja0V4YWN0IFB5U3RyaW5nX0NoZWNrRXhhY3QgCisjZGVmaW5lIFB5Qnl0ZXNfQ0hFQ0tfSU5URVJORUQgUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQKKyNkZWZpbmUgUHlCeXRlc19BU19TVFJJTkcgUHlTdHJpbmdfQVNfU1RSSU5HCisjZGVmaW5lIFB5Qnl0ZXNfR0VUX1NJWkUgUHlTdHJpbmdfR0VUX1NJWkUKKyNkZWZpbmUgUHlfVFBGTEFHU19CWVRFU19TVUJDTEFTUyBQeV9UUEZMQUdTX1NUUklOR19TVUJDTEFTUworCisjZGVmaW5lIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUKKyNkZWZpbmUgUHlCeXRlc19Gcm9tU3RyaW5nIFB5U3RyaW5nX0Zyb21TdHJpbmcKKyNkZWZpbmUgUHlCeXRlc19Gcm9tRm9ybWF0ViBQeVN0cmluZ19Gcm9tRm9ybWF0VgorI2RlZmluZSBQeUJ5dGVzX0Zyb21Gb3JtYXQgUHlTdHJpbmdfRnJvbUZvcm1hdAorI2RlZmluZSBQeUJ5dGVzX1NpemUgUHlTdHJpbmdfU2l6ZQorI2RlZmluZSBQeUJ5dGVzX0FzU3RyaW5nIFB5U3RyaW5nX0FzU3RyaW5nCisjZGVmaW5lIFB5Qnl0ZXNfUmVwciBQeVN0cmluZ19SZXByCisjZGVmaW5lIFB5Qnl0ZXNfQ29uY2F0IFB5U3RyaW5nX0NvbmNhdAorI2RlZmluZSBQeUJ5dGVzX0NvbmNhdEFuZERlbCBQeVN0cmluZ19Db25jYXRBbmREZWwKKyNkZWZpbmUgX1B5Qnl0ZXNfUmVzaXplIF9QeVN0cmluZ19SZXNpemUKKyNkZWZpbmUgX1B5Qnl0ZXNfRXEgX1B5U3RyaW5nX0VxCisjZGVmaW5lIFB5Qnl0ZXNfRm9ybWF0IFB5U3RyaW5nX0Zvcm1hdAorI2RlZmluZSBfUHlCeXRlc19Gb3JtYXRMb25nIF9QeVN0cmluZ19Gb3JtYXRMb25nCisjZGVmaW5lIFB5Qnl0ZXNfRGVjb2RlRXNjYXBlIFB5U3RyaW5nX0RlY29kZUVzY2FwZQorI2RlZmluZSBfUHlCeXRlc19Kb2luIF9QeVN0cmluZ19Kb2luCisjZGVmaW5lIFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZQorI2RlZmluZSBfUHlCeXRlc19JbnNlcnRUaG91c2FuZHNHcm91cGluZyBfUHlTdHJpbmdfSW5zZXJ0VGhvdXNhbmRzR3JvdXBpbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2NTdHJpbmdJTy5oIGIvaW5jbHVkZS9weXRob24yLjcvY1N0cmluZ0lPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczYTQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2NTdHJpbmdJTy5oCkBAIC0wLDAgKzEsNzMgQEAKKyNpZm5kZWYgUHlfQ1NUUklOR0lPX0gKKyNkZWZpbmUgUHlfQ1NUUklOR0lPX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKy8qCisKKyAgVGhpcyBoZWFkZXIgcHJvdmlkZXMgYWNjZXNzIHRvIGNTdHJpbmdJTyBvYmplY3RzIGZyb20gQy4KKyAgRnVuY3Rpb25zIGFyZSBwcm92aWRlZCBmb3IgY2FsbGluZyBjU3RyaW5nSU8gb2JqZWN0cyBhbmQKKyAgbWFjcm9zIGFyZSBwcm92aWRlZCBmb3IgdGVzdGluZyB3aGV0aGVyIHlvdSBoYXZlIGNTdHJpbmdJTworICBvYmplY3RzLgorCisgIEJlZm9yZSBjYWxsaW5nIGFueSBvZiB0aGUgZnVuY3Rpb25zIG9yIG1hY3JvcywgeW91IG11c3QgaW5pdGlhbGl6ZQorICB0aGUgcm91dGluZXMgd2l0aDoKKworICAgIFB5Y1N0cmluZ19JTVBPUlQKKworICBUaGlzIHdvdWxkIHR5cGljYWxseSBiZSBkb25lIGluIHlvdXIgaW5pdCBmdW5jdGlvbi4KKworKi8KKworI2RlZmluZSBQeWNTdHJpbmdJT19DQVBTVUxFX05BTUUgImNTdHJpbmdJTy5jU3RyaW5nSU9fQ0FQSSIKKworI2RlZmluZSBQeWNTdHJpbmdfSU1QT1JUIFwKKyAgUHljU3RyaW5nSU8gPSAoKHN0cnVjdCBQeWNTdHJpbmdJT19DQVBJKilQeUNhcHN1bGVfSW1wb3J0KFwKKyAgICBQeWNTdHJpbmdJT19DQVBTVUxFX05BTUUsIDApKQorCisvKiBCYXNpYyBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBjU3RyaW5nSU8gb2JqZWN0cyBmcm9tIEMgKi8KKworc3RhdGljIHN0cnVjdCBQeWNTdHJpbmdJT19DQVBJIHsKKworIC8qIFJlYWQgYSBzdHJpbmcgZnJvbSBhbiBpbnB1dCBvYmplY3QuICBJZiB0aGUgbGFzdCBhcmd1bWVudAorICAgIGlzIC0xLCB0aGUgcmVtYWluZGVyIHdpbGwgYmUgcmVhZC4KKyAgICAqLworICBpbnQoKmNyZWFkKShQeU9iamVjdCAqLCBjaGFyICoqLCBQeV9zc2l6ZV90KTsKKworIC8qIFJlYWQgYSBsaW5lIGZyb20gYW4gaW5wdXQgb2JqZWN0LiAgUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSByZWFkCisgICAgbGluZSBhcyBhbiBpbnQgYW5kIGEgcG9pbnRlciBpbnNpZGUgdGhlIG9iamVjdCBidWZmZXIgYXMgY2hhcioqIChzbworICAgIHRoZSBjYWxsZXIgZG9lc24ndCBoYXZlIHRvIHByb3ZpZGUgaXRzIG93biBidWZmZXIgYXMgZGVzdGluYXRpb24pLgorICAgICovCisgIGludCgqY3JlYWRsaW5lKShQeU9iamVjdCAqLCBjaGFyICoqKTsKKworICAvKiBXcml0ZSBhIHN0cmluZyB0byBhbiBvdXRwdXQgb2JqZWN0Ki8KKyAgaW50KCpjd3JpdGUpKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCk7CisKKyAgLyogR2V0IHRoZSBvdXRwdXQgb2JqZWN0IGFzIGEgUHl0aG9uIHN0cmluZyAocmV0dXJucyBuZXcgcmVmZXJlbmNlKS4gKi8KKyAgUHlPYmplY3QgKigqY2dldHZhbHVlKShQeU9iamVjdCAqKTsKKworICAvKiBDcmVhdGUgYSBuZXcgb3V0cHV0IG9iamVjdCAqLworICBQeU9iamVjdCAqKCpOZXdPdXRwdXQpKGludCk7CisKKyAgLyogQ3JlYXRlIGFuIGlucHV0IG9iamVjdCBmcm9tIGEgUHl0aG9uIHN0cmluZworICAgICAoY29waWVzIHRoZSBQeXRob24gc3RyaW5nIHJlZmVyZW5jZSkuCisgICAgICovCisgIFB5T2JqZWN0ICooKk5ld0lucHV0KShQeU9iamVjdCAqKTsKKworICAvKiBUaGUgUHl0aG9uIHR5cGVzIGZvciBjU3RyaW5nSU8gaW5wdXQgYW5kIG91dHB1dCBvYmplY3RzLgorICAgICBOb3RlIHRoYXQgeW91IGNhbiBkbyBpbnB1dCBvbiBhbiBvdXRwdXQgb2JqZWN0LgorICAgICAqLworICBQeVR5cGVPYmplY3QgKklucHV0VHlwZSwgKk91dHB1dFR5cGU7CisKK30gKlB5Y1N0cmluZ0lPOworCisvKiBUaGVzZSBjYW4gYmUgdXNlZCB0byB0ZXN0IGlmIHlvdSBoYXZlIG9uZSAqLworI2RlZmluZSBQeWNTdHJpbmdJT19JbnB1dENoZWNrKE8pIFwKKyAgKFB5X1RZUEUoTyk9PVB5Y1N0cmluZ0lPLT5JbnB1dFR5cGUpCisjZGVmaW5lIFB5Y1N0cmluZ0lPX091dHB1dENoZWNrKE8pIFwKKyAgKFB5X1RZUEUoTyk9PVB5Y1N0cmluZ0lPLT5PdXRwdXRUeXBlKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9DU1RSSU5HSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvY2VsbG9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvY2VsbG9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MjdlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9jZWxsb2JqZWN0LmgKQEAgLTAsMCArMSwyOCBAQAorLyogQ2VsbCBvYmplY3QgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfQ0VMTE9CSkVDVF9ICisjZGVmaW5lIFB5X0NFTExPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisJUHlPYmplY3RfSEVBRAorCVB5T2JqZWN0ICpvYl9yZWY7CS8qIENvbnRlbnQgb2YgdGhlIGNlbGwgb3IgTlVMTCB3aGVuIGVtcHR5ICovCit9IFB5Q2VsbE9iamVjdDsKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5Q2VsbF9UeXBlOworCisjZGVmaW5lIFB5Q2VsbF9DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeUNlbGxfVHlwZSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNlbGxfTmV3KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNlbGxfR2V0KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIFB5Q2VsbF9TZXQoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKKyNkZWZpbmUgUHlDZWxsX0dFVChvcCkgKCgoUHlDZWxsT2JqZWN0ICopKG9wKSktPm9iX3JlZikKKyNkZWZpbmUgUHlDZWxsX1NFVChvcCwgdikgKCgoUHlDZWxsT2JqZWN0ICopKG9wKSktPm9iX3JlZiA9IHYpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1RVUExFT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2NldmFsLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9jZXZhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOGJkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9jZXZhbC5oCkBAIC0wLDAgKzEsMTUzIEBACisjaWZuZGVmIFB5X0NFVkFMX0gKKyNkZWZpbmUgUHlfQ0VWQUxfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIEludGVyZmFjZSB0byByYW5kb20gcGFydHMgaW4gY2V2YWwuYyAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKAorICAgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCisvKiBJbmxpbmUgdGhpcyAqLworI2RlZmluZSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLGFyZykgXAorICAgIFB5RXZhbF9DYWxsT2JqZWN0V2l0aEtleXdvcmRzKGZ1bmMsIGFyZywgKFB5T2JqZWN0ICopTlVMTCkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUV2YWxfQ2FsbEZ1bmN0aW9uKFB5T2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUV2YWxfQ2FsbE1ldGhvZChQeU9iamVjdCAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRob2RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisKK1B5QVBJX0ZVTkModm9pZCkgUHlFdmFsX1NldFByb2ZpbGUoUHlfdHJhY2VmdW5jLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFdmFsX1NldFRyYWNlKFB5X3RyYWNlZnVuYywgUHlPYmplY3QgKik7CisKK3N0cnVjdCBfZnJhbWU7IC8qIEF2b2lkIGluY2x1ZGluZyBmcmFtZW9iamVjdC5oICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFdmFsX0dldEJ1aWx0aW5zKHZvaWQpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUV2YWxfR2V0R2xvYmFscyh2b2lkKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFdmFsX0dldExvY2Fscyh2b2lkKTsKK1B5QVBJX0ZVTkMoc3RydWN0IF9mcmFtZSAqKSBQeUV2YWxfR2V0RnJhbWUodm9pZCk7CitQeUFQSV9GVU5DKGludCkgUHlFdmFsX0dldFJlc3RyaWN0ZWQodm9pZCk7CisKKy8qIExvb2sgYXQgdGhlIGN1cnJlbnQgZnJhbWUncyAoaWYgYW55KSBjb2RlJ3MgY29fZmxhZ3MsIGFuZCB0dXJuIG9uCisgICB0aGUgY29ycmVzcG9uZGluZyBjb21waWxlciBmbGFncyBpbiBjZi0+Y2ZfZmxhZ3MuICBSZXR1cm4gMSBpZiBhbnkKKyAgIGZsYWcgd2FzIHNldCwgZWxzZSByZXR1cm4gMC4gKi8KK1B5QVBJX0ZVTkMoaW50KSBQeUV2YWxfTWVyZ2VDb21waWxlckZsYWdzKFB5Q29tcGlsZXJGbGFncyAqY2YpOworCitQeUFQSV9GVU5DKGludCkgUHlfRmx1c2hMaW5lKHZvaWQpOworCitQeUFQSV9GVU5DKGludCkgUHlfQWRkUGVuZGluZ0NhbGwoaW50ICgqZnVuYykodm9pZCAqKSwgdm9pZCAqYXJnKTsKK1B5QVBJX0ZVTkMoaW50KSBQeV9NYWtlUGVuZGluZ0NhbGxzKHZvaWQpOworCisvKiBQcm90ZWN0aW9uIGFnYWluc3QgZGVlcGx5IG5lc3RlZCByZWN1cnNpdmUgY2FsbHMgKi8KK1B5QVBJX0ZVTkModm9pZCkgUHlfU2V0UmVjdXJzaW9uTGltaXQoaW50KTsKK1B5QVBJX0ZVTkMoaW50KSBQeV9HZXRSZWN1cnNpb25MaW1pdCh2b2lkKTsKKworI2RlZmluZSBQeV9FbnRlclJlY3Vyc2l2ZUNhbGwod2hlcmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKF9QeV9NYWtlUmVjQ2hlY2soUHlUaHJlYWRTdGF0ZV9HRVQoKS0+cmVjdXJzaW9uX2RlcHRoKSAmJiAgXAorICAgICAgICAgICAgIF9QeV9DaGVja1JlY3Vyc2l2ZUNhbGwod2hlcmUpKQorI2RlZmluZSBQeV9MZWF2ZVJlY3Vyc2l2ZUNhbGwoKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoLS1QeVRocmVhZFN0YXRlX0dFVCgpLT5yZWN1cnNpb25fZGVwdGgpCitQeUFQSV9GVU5DKGludCkgX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbChjaGFyICp3aGVyZSk7CitQeUFQSV9EQVRBKGludCkgX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQ7CisjaWZkZWYgVVNFX1NUQUNLQ0hFQ0sKKyMgIGRlZmluZSBfUHlfTWFrZVJlY0NoZWNrKHgpICAoKysoeCkgPiAtLV9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0KQorI2Vsc2UKKyMgIGRlZmluZSBfUHlfTWFrZVJlY0NoZWNrKHgpICAoKysoeCkgPiBfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdCkKKyNlbmRpZgorCitQeUFQSV9GVU5DKGNvbnN0IGNoYXIgKikgUHlFdmFsX0dldEZ1bmNOYW1lKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhjb25zdCBjaGFyICopIFB5RXZhbF9HZXRGdW5jRGVzYyhQeU9iamVjdCAqKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUV2YWxfR2V0Q2FsbFN0YXRzKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUV2YWxfRXZhbEZyYW1lKHN0cnVjdCBfZnJhbWUgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9FdmFsRnJhbWVFeChzdHJ1Y3QgX2ZyYW1lICpmLCBpbnQgZXhjKTsKKworLyogdGhpcyB1c2VkIHRvIGJlIGhhbmRsZWQgb24gYSBwZXItdGhyZWFkIGJhc2lzIC0gbm93IGp1c3QgdHdvIGdsb2JhbHMgKi8KK1B5QVBJX0RBVEEodm9sYXRpbGUgaW50KSBfUHlfVGlja2VyOworUHlBUElfREFUQShpbnQpIF9QeV9DaGVja0ludGVydmFsOworCisvKiBJbnRlcmZhY2UgZm9yIHRocmVhZHMuCisKKyAgIEEgbW9kdWxlIHRoYXQgcGxhbnMgdG8gZG8gYSBibG9ja2luZyBzeXN0ZW0gY2FsbCAob3Igc29tZXRoaW5nIGVsc2UKKyAgIHRoYXQgbGFzdHMgYSBsb25nIHRpbWUgYW5kIGRvZXNuJ3QgdG91Y2ggUHl0aG9uIGRhdGEpIGNhbiBhbGxvdyBvdGhlcgorICAgdGhyZWFkcyB0byBydW4gYXMgZm9sbG93czoKKworICAgIC4uLnByZXBhcmF0aW9ucyBoZXJlLi4uCisgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworICAgIC4uLmJsb2NraW5nIHN5c3RlbSBjYWxsIGhlcmUuLi4KKyAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUworICAgIC4uLmludGVycHJldCByZXN1bHQgaGVyZS4uLgorCisgICBUaGUgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUy9QeV9FTkRfQUxMT1dfVEhSRUFEUyBwYWlyIGV4cGFuZHMgdG8gYQorICAge30tc3Vycm91bmRlZCBibG9jay4KKyAgIFRvIGxlYXZlIHRoZSBibG9jayBpbiB0aGUgbWlkZGxlIChlLmcuLCB3aXRoIHJldHVybiksIHlvdSBtdXN0IGluc2VydAorICAgYSBsaW5lIGNvbnRhaW5pbmcgUHlfQkxPQ0tfVEhSRUFEUyBiZWZvcmUgdGhlIHJldHVybiwgZS5nLgorCisgICAgaWYgKC4uLnByZW1hdHVyZV9leGl0Li4uKSB7CisgICAgICAgIFB5X0JMT0NLX1RIUkVBRFMKKyAgICAgICAgUHlFcnJfU2V0RnJvbUVycm5vKFB5RXhjX0lPRXJyb3IpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgIEFuIGFsdGVybmF0aXZlIGlzOgorCisgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgIGlmICguLi5wcmVtYXR1cmVfZXhpdC4uLikgeworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBQeV9VTkJMT0NLX1RIUkVBRFMKKworICAgRm9yIGNvbnZlbmllbmNlLCB0aGF0IHRoZSB2YWx1ZSBvZiAnZXJybm8nIGlzIHJlc3RvcmVkIGFjcm9zcworICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMgYW5kIFB5X0JMT0NLX1RIUkVBRFMuCisKKyAgIFdBUk5JTkc6IE5FVkVSIE5FU1QgQ0FMTFMgVE8gUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyBBTkQKKyAgIFB5X0VORF9BTExPV19USFJFQURTISEhCisKKyAgIFRoZSBmdW5jdGlvbiBQeUV2YWxfSW5pdFRocmVhZHMoKSBzaG91bGQgYmUgY2FsbGVkIG9ubHkgZnJvbQorICAgaW5pdHRocmVhZCgpIGluICJ0aHJlYWRtb2R1bGUuYyIuCisKKyAgIE5vdGUgdGhhdCBub3QgeWV0IGFsbCBjYW5kaWRhdGVzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgdG8gdXNlIHRoaXMKKyAgIG1lY2hhbmlzbSEKKyovCisKK1B5QVBJX0ZVTkMoUHlUaHJlYWRTdGF0ZSAqKSBQeUV2YWxfU2F2ZVRocmVhZCh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoUHlUaHJlYWRTdGF0ZSAqKTsKKworI2lmZGVmIFdJVEhfVEhSRUFECisKK1B5QVBJX0ZVTkMoaW50KSAgUHlFdmFsX1RocmVhZHNJbml0aWFsaXplZCh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFdmFsX0luaXRUaHJlYWRzKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeUV2YWxfQWNxdWlyZUxvY2sodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5RXZhbF9SZWxlYXNlTG9jayh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFdmFsX0FjcXVpcmVUaHJlYWQoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFdmFsX1JlbGVhc2VUaHJlYWQoUHlUaHJlYWRTdGF0ZSAqdHN0YXRlKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFdmFsX1JlSW5pdFRocmVhZHModm9pZCk7CisKKyNkZWZpbmUgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUyB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5VGhyZWFkU3RhdGUgKl9zYXZlOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBfc2F2ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7CisjZGVmaW5lIFB5X0JMT0NLX1RIUkVBRFMgICAgICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKF9zYXZlKTsKKyNkZWZpbmUgUHlfVU5CTE9DS19USFJFQURTICAgICAgX3NhdmUgPSBQeUV2YWxfU2F2ZVRocmVhZCgpOworI2RlZmluZSBQeV9FTkRfQUxMT1dfVEhSRUFEUyAgICBQeUV2YWxfUmVzdG9yZVRocmVhZChfc2F2ZSk7IFwKKyAgICAgICAgICAgICAgICAgfQorCisjZWxzZSAvKiAhV0lUSF9USFJFQUQgKi8KKworI2RlZmluZSBQeV9CRUdJTl9BTExPV19USFJFQURTIHsKKyNkZWZpbmUgUHlfQkxPQ0tfVEhSRUFEUworI2RlZmluZSBQeV9VTkJMT0NLX1RIUkVBRFMKKyNkZWZpbmUgUHlfRU5EX0FMTE9XX1RIUkVBRFMgfQorCisjZW5kaWYgLyogIVdJVEhfVEhSRUFEICovCisKK1B5QVBJX0ZVTkMoaW50KSBfUHlFdmFsX1NsaWNlSW5kZXgoUHlPYmplY3QgKiwgUHlfc3NpemVfdCAqKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9DRVZBTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9jbGFzc29iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvY2xhc3NvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzAzZTBkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvY2xhc3NvYmplY3QuaApAQCAtMCwwICsxLDgzIEBACisKKy8qIENsYXNzIG9iamVjdCBpbnRlcmZhY2UgKi8KKworLyogUmV2ZWFsaW5nIHNvbWUgc3RydWN0dXJlcyAobm90IGZvciBnZW5lcmFsIHVzZSkgKi8KKworI2lmbmRlZiBQeV9DTEFTU09CSkVDVF9ICisjZGVmaW5lIFB5X0NMQVNTT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdAkqY2xfYmFzZXM7CS8qIEEgdHVwbGUgb2YgY2xhc3Mgb2JqZWN0cyAqLworICAgIFB5T2JqZWN0CSpjbF9kaWN0OwkvKiBBIGRpY3Rpb25hcnkgKi8KKyAgICBQeU9iamVjdAkqY2xfbmFtZTsJLyogQSBzdHJpbmcgKi8KKyAgICAvKiBUaGUgZm9sbG93aW5nIHRocmVlIGFyZSBmdW5jdGlvbnMgb3IgTlVMTCAqLworICAgIFB5T2JqZWN0CSpjbF9nZXRhdHRyOworICAgIFB5T2JqZWN0CSpjbF9zZXRhdHRyOworICAgIFB5T2JqZWN0CSpjbF9kZWxhdHRyOworICAgIFB5T2JqZWN0ICAgICpjbF93ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KK30gUHlDbGFzc09iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeUNsYXNzT2JqZWN0ICppbl9jbGFzczsJLyogVGhlIGNsYXNzIG9iamVjdCAqLworICAgIFB5T2JqZWN0CSAgKmluX2RpY3Q7CS8qIEEgZGljdGlvbmFyeSAqLworICAgIFB5T2JqZWN0CSAgKmluX3dlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworfSBQeUluc3RhbmNlT2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICppbV9mdW5jOyAgIC8qIFRoZSBjYWxsYWJsZSBvYmplY3QgaW1wbGVtZW50aW5nIHRoZSBtZXRob2QgKi8KKyAgICBQeU9iamVjdCAqaW1fc2VsZjsgICAvKiBUaGUgaW5zdGFuY2UgaXQgaXMgYm91bmQgdG8sIG9yIE5VTEwgKi8KKyAgICBQeU9iamVjdCAqaW1fY2xhc3M7ICAvKiBUaGUgY2xhc3MgdGhhdCBhc2tlZCBmb3IgdGhlIG1ldGhvZCAqLworICAgIFB5T2JqZWN0ICppbV93ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KK30gUHlNZXRob2RPYmplY3Q7CisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUNsYXNzX1R5cGUsIFB5SW5zdGFuY2VfVHlwZSwgUHlNZXRob2RfVHlwZTsKKworI2RlZmluZSBQeUNsYXNzX0NoZWNrKG9wKSAoKG9wKS0+b2JfdHlwZSA9PSAmUHlDbGFzc19UeXBlKQorI2RlZmluZSBQeUluc3RhbmNlX0NoZWNrKG9wKSAoKG9wKS0+b2JfdHlwZSA9PSAmUHlJbnN0YW5jZV9UeXBlKQorI2RlZmluZSBQeU1ldGhvZF9DaGVjayhvcCkgKChvcCktPm9iX3R5cGUgPT0gJlB5TWV0aG9kX1R5cGUpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDbGFzc19OZXcoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5SW5zdGFuY2VfTmV3KFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUluc3RhbmNlX05ld1JhdyhQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlNZXRob2RfTmV3KFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWV0aG9kX0Z1bmN0aW9uKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU1ldGhvZF9TZWxmKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU1ldGhvZF9DbGFzcyhQeU9iamVjdCAqKTsKKworLyogTG9vayB1cCBhdHRyaWJ1dGUgd2l0aCBuYW1lIChhIHN0cmluZykgb24gaW5zdGFuY2Ugb2JqZWN0IHBpbnN0LCB1c2luZworICogb25seSB0aGUgaW5zdGFuY2UgYW5kIGJhc2UgY2xhc3MgZGljdHMuICBJZiBhIGRlc2NyaXB0b3IgaXMgZm91bmQgaW4KKyAqIGEgY2xhc3MgZGljdCwgdGhlIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQgd2l0aG91dCBjYWxsaW5nIGl0LgorICogUmV0dXJucyBOVUxMIGlmIG5vdGhpbmcgZm91bmQsIGVsc2UgYSBib3Jyb3dlZCByZWZlcmVuY2UgdG8gdGhlCisgKiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggbmFtZSBpbiB0aGUgZGljdCBpbiB3aGljaCBuYW1lIHdhcyBmb3VuZC4KKyAqIFRoZSBwb2ludCBvZiB0aGlzIHJvdXRpbmUgaXMgdGhhdCBpdCBuZXZlciBjYWxscyBhcmJpdHJhcnkgUHl0aG9uCisgKiBjb2RlLCBzbyBpcyBhbHdheXMgInNhZmUiOiAgYWxsIGl0IGRvZXMgaXMgZGljdCBsb29rdXBzLiAgVGhlIGZ1bmN0aW9uCisgKiBjYW4ndCBmYWlsLCBuZXZlciBzZXRzIGFuIGV4Y2VwdGlvbiwgYW5kIE5VTEwgaXMgbm90IGFuIGVycm9yIChpdCBqdXN0CisgKiBtZWFucyAibm90IGZvdW5kIikuCisgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5SW5zdGFuY2VfTG9va3VwKFB5T2JqZWN0ICpwaW5zdCwgUHlPYmplY3QgKm5hbWUpOworCisvKiBNYWNyb3MgZm9yIGRpcmVjdCBhY2Nlc3MgdG8gdGhlc2UgdmFsdWVzLiBUeXBlIGNoZWNrcyBhcmUgKm5vdCoKKyAgIGRvbmUsIHNvIHVzZSB3aXRoIGNhcmUuICovCisjZGVmaW5lIFB5TWV0aG9kX0dFVF9GVU5DVElPTihtZXRoKSBcCisgICAgICAgICgoKFB5TWV0aG9kT2JqZWN0ICopbWV0aCkgLT4gaW1fZnVuYykKKyNkZWZpbmUgUHlNZXRob2RfR0VUX1NFTEYobWV0aCkgXAorCSgoKFB5TWV0aG9kT2JqZWN0ICopbWV0aCkgLT4gaW1fc2VsZikKKyNkZWZpbmUgUHlNZXRob2RfR0VUX0NMQVNTKG1ldGgpIFwKKwkoKChQeU1ldGhvZE9iamVjdCAqKW1ldGgpIC0+IGltX2NsYXNzKQorCitQeUFQSV9GVU5DKGludCkgUHlDbGFzc19Jc1N1YmNsYXNzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCitQeUFQSV9GVU5DKGludCkgUHlNZXRob2RfQ2xlYXJGcmVlTGlzdCh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfQ0xBU1NPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvY29iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvY29iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkM2NkOWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9jb2JqZWN0LmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAgIENPYmplY3RzIGFyZSBtYXJrZWQgUGVuZGluZyBEZXByZWNhdGlvbiBhcyBvZiBQeXRob24gMi43LgorICAgVGhlIGZ1bGwgc2NoZWR1bGUgZm9yIDIueCBpcyBhcyBmb2xsb3dzOgorICAgICAtIENPYmplY3RzIGFyZSBtYXJrZWQgUGVuZGluZyBEZXByZWNhdGlvbiBpbiBQeXRob24gMi43LgorICAgICAtIENPYmplY3RzIHdpbGwgYmUgbWFya2VkIERlcHJlY2F0ZWQgaW4gUHl0aG9uIDIuOAorICAgICAgIChpZiB0aGVyZSBpcyBvbmUpLgorICAgICAtIENPYmplY3RzIHdpbGwgYmUgcmVtb3ZlZCBpbiBQeXRob24gMi45IChpZiB0aGVyZSBpcyBvbmUpLgorCisgICBBZGRpdGlvbmFsbHksIGZvciB0aGUgUHl0aG9uIDMueCBzZXJpZXM6CisgICAgIC0gQ09iamVjdHMgd2VyZSBtYXJrZWQgRGVwcmVjYXRlZCBpbiBQeXRob24gMy4xLgorICAgICAtIENPYmplY3RzIHdpbGwgYmUgcmVtb3ZlZCBpbiBQeXRob24gMy4yLgorCisgICBZb3Ugc2hvdWxkIHN3aXRjaCBhbGwgdXNlIG9mIENPYmplY3RzIHRvIGNhcHN1bGVzLiAgQ2Fwc3VsZXMKKyAgIGhhdmUgYSBzYWZlciBhbmQgbW9yZSBjb25zaXN0ZW50IEFQSS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLAorICAgc2VlIEluY2x1ZGUvcHljYXBzdWxlLmgsIG9yIHJlYWQgdGhlICJDYXBzdWxlcyIgdG9waWMgaW4KKyAgIHRoZSAiUHl0aG9uL0MgQVBJIFJlZmVyZW5jZSBNYW51YWwiLgorCisgICBQeXRob24gMi43IG5vIGxvbmdlciB1c2VzIENPYmplY3RzIGl0c2VsZjsgYWxsIG9iamVjdHMgd2hpY2gKKyAgIHdlcmUgZm9ybWVybHkgQ09iamVjdHMgYXJlIG5vdyBjYXBzdWxlcy4gIE5vdGUgdGhhdCB0aGlzIGNoYW5nZQorICAgZG9lcyBub3QgYnkgaXRzZWxmIGJyZWFrIGJpbmFyeSBjb21wYXRpYmlsaXR5IHdpdGggZXh0ZW5zaW9ucworICAgYnVpbHQgZm9yIHByZXZpb3VzIHZlcnNpb25zIG9mIFB5dGhvbi0tUHlDT2JqZWN0X0FzVm9pZFB0cigpCisgICBoYXMgYmVlbiBjaGFuZ2VkIHRvIGFsc28gdW5kZXJzdGFuZCBjYXBzdWxlcy4KKworKi8KKworLyogb3JpZ2luYWwgZmlsZSBoZWFkZXIgY29tbWVudCBmb2xsb3dzOiAqLworCisvKiBDIG9iamVjdHMgdG8gYmUgZXhwb3J0ZWQgZnJvbSBvbmUgZXh0ZW5zaW9uIG1vZHVsZSB0byBhbm90aGVyLgorIAorICAgQyBvYmplY3RzIGFyZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gZXh0ZW5zaW9uIG1vZHVsZXMuCisgICBUaGV5IHByb3ZpZGUgYSB3YXkgZm9yIGFuIGV4dGVuc2lvbiBtb2R1bGUgdG8gZXhwb3J0IGEgQyBpbnRlcmZhY2UKKyAgIHRvIG90aGVyIGV4dGVuc2lvbiBtb2R1bGVzLCBzbyB0aGF0IGV4dGVuc2lvbiBtb2R1bGVzIGNhbiB1c2UgdGhlCisgICBQeXRob24gaW1wb3J0IG1lY2hhbmlzbSB0byBsaW5rIHRvIG9uZSBhbm90aGVyLgorCisqLworCisjaWZuZGVmIFB5X0NPQkpFQ1RfSAorI2RlZmluZSBQeV9DT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5Q09iamVjdF9UeXBlOworCisjZGVmaW5lIFB5Q09iamVjdF9DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeUNPYmplY3RfVHlwZSkKKworLyogQ3JlYXRlIGEgUHlDT2JqZWN0IGZyb20gYSBwb2ludGVyIHRvIGEgQyBvYmplY3QgYW5kIGFuIG9wdGlvbmFsCisgICBkZXN0cnVjdG9yIGZ1bmN0aW9uLiAgSWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBub24tbnVsbCwgdGhlbiBpdAorICAgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgZmlyc3QgYXJndW1lbnQgaWYgYW5kIHdoZW4gdGhlIFB5Q09iamVjdCBpcworICAgZGVzdHJveWVkLgorCisqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNPYmplY3RfRnJvbVZvaWRQdHIoCisJdm9pZCAqY29iaiwgdm9pZCAoKmRlc3RydWN0KSh2b2lkKikpOworCisKKy8qIENyZWF0ZSBhIFB5Q09iamVjdCBmcm9tIGEgcG9pbnRlciB0byBhIEMgb2JqZWN0LCBhIGRlc2NyaXB0aW9uIG9iamVjdCwKKyAgIGFuZCBhbiBvcHRpb25hbCBkZXN0cnVjdG9yIGZ1bmN0aW9uLiAgSWYgdGhlIHRoaXJkIGFyZ3VtZW50IGlzIG5vbi1udWxsLAorICAgdGhlbiBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGFyZ3VtZW50cyBpZiBhbmQgd2hlbiAKKyAgIHRoZSBQeUNPYmplY3QgaXMgZGVzdHJveWVkLgorKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDT2JqZWN0X0Zyb21Wb2lkUHRyQW5kRGVzYygKKwl2b2lkICpjb2JqLCB2b2lkICpkZXNjLCB2b2lkICgqZGVzdHJ1Y3QpKHZvaWQqLHZvaWQqKSk7CisKKy8qIFJldHJpZXZlIGEgcG9pbnRlciB0byBhIEMgb2JqZWN0IGZyb20gYSBQeUNPYmplY3QuICovCitQeUFQSV9GVU5DKHZvaWQgKikgUHlDT2JqZWN0X0FzVm9pZFB0cihQeU9iamVjdCAqKTsKKworLyogUmV0cmlldmUgYSBwb2ludGVyIHRvIGEgZGVzY3JpcHRpb24gb2JqZWN0IGZyb20gYSBQeUNPYmplY3QuICovCitQeUFQSV9GVU5DKHZvaWQgKikgUHlDT2JqZWN0X0dldERlc2MoUHlPYmplY3QgKik7CisKKy8qIEltcG9ydCBhIHBvaW50ZXIgdG8gYSBDIG9iamVjdCBmcm9tIGEgbW9kdWxlIHVzaW5nIGEgUHlDT2JqZWN0LiAqLworUHlBUElfRlVOQyh2b2lkICopIFB5Q09iamVjdF9JbXBvcnQoY2hhciAqbW9kdWxlX25hbWUsIGNoYXIgKmNvYmplY3RfbmFtZSk7CisKKy8qIE1vZGlmeSBhIEMgb2JqZWN0LiBGYWlscyAoPT0wKSBpZiBvYmplY3QgaGFzIGEgZGVzdHJ1Y3Rvci4gKi8KK1B5QVBJX0ZVTkMoaW50KSBQeUNPYmplY3RfU2V0Vm9pZFB0cihQeU9iamVjdCAqc2VsZiwgdm9pZCAqY29iaik7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICB2b2lkICpjb2JqZWN0OworICAgIHZvaWQgKmRlc2M7CisgICAgdm9pZCAoKmRlc3RydWN0b3IpKHZvaWQgKik7Cit9IFB5Q09iamVjdDsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9DT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2NvZGUuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2NvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGIyOTU4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvY29kZS5oCkBAIC0wLDAgKzEsMTA3IEBACisvKiBEZWZpbml0aW9ucyBmb3IgYnl0ZWNvZGUgKi8KKworI2lmbmRlZiBQeV9DT0RFX0gKKyNkZWZpbmUgUHlfQ09ERV9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEJ5dGVjb2RlIG9iamVjdCAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBpbnQgY29fYXJnY291bnQ7CQkvKiAjYXJndW1lbnRzLCBleGNlcHQgKmFyZ3MgKi8KKyAgICBpbnQgY29fbmxvY2FsczsJCS8qICNsb2NhbCB2YXJpYWJsZXMgKi8KKyAgICBpbnQgY29fc3RhY2tzaXplOwkJLyogI2VudHJpZXMgbmVlZGVkIGZvciBldmFsdWF0aW9uIHN0YWNrICovCisgICAgaW50IGNvX2ZsYWdzOwkJLyogQ09fLi4uLCBzZWUgYmVsb3cgKi8KKyAgICBQeU9iamVjdCAqY29fY29kZTsJCS8qIGluc3RydWN0aW9uIG9wY29kZXMgKi8KKyAgICBQeU9iamVjdCAqY29fY29uc3RzOwkvKiBsaXN0IChjb25zdGFudHMgdXNlZCkgKi8KKyAgICBQeU9iamVjdCAqY29fbmFtZXM7CQkvKiBsaXN0IG9mIHN0cmluZ3MgKG5hbWVzIHVzZWQpICovCisgICAgUHlPYmplY3QgKmNvX3Zhcm5hbWVzOwkvKiB0dXBsZSBvZiBzdHJpbmdzIChsb2NhbCB2YXJpYWJsZSBuYW1lcykgKi8KKyAgICBQeU9iamVjdCAqY29fZnJlZXZhcnM7CS8qIHR1cGxlIG9mIHN0cmluZ3MgKGZyZWUgdmFyaWFibGUgbmFtZXMpICovCisgICAgUHlPYmplY3QgKmNvX2NlbGx2YXJzOyAgICAgIC8qIHR1cGxlIG9mIHN0cmluZ3MgKGNlbGwgdmFyaWFibGUgbmFtZXMpICovCisgICAgLyogVGhlIHJlc3QgZG9lc24ndCBjb3VudCBmb3IgaGFzaC9jbXAgKi8KKyAgICBQeU9iamVjdCAqY29fZmlsZW5hbWU7CS8qIHN0cmluZyAod2hlcmUgaXQgd2FzIGxvYWRlZCBmcm9tKSAqLworICAgIFB5T2JqZWN0ICpjb19uYW1lOwkJLyogc3RyaW5nIChuYW1lLCBmb3IgcmVmZXJlbmNlKSAqLworICAgIGludCBjb19maXJzdGxpbmVubzsJCS8qIGZpcnN0IHNvdXJjZSBsaW5lIG51bWJlciAqLworICAgIFB5T2JqZWN0ICpjb19sbm90YWI7CS8qIHN0cmluZyAoZW5jb2RpbmcgYWRkcjwtPmxpbmVubyBtYXBwaW5nKSBTZWUKKwkJCQkgICBPYmplY3RzL2xub3RhYl9ub3Rlcy50eHQgZm9yIGRldGFpbHMuICovCisgICAgdm9pZCAqY29fem9tYmllZnJhbWU7ICAgICAvKiBmb3Igb3B0aW1pemF0aW9uIG9ubHkgKHNlZSBmcmFtZW9iamVjdC5jKSAqLworICAgIFB5T2JqZWN0ICpjb193ZWFrcmVmbGlzdDsgICAvKiB0byBzdXBwb3J0IHdlYWtyZWZzIHRvIGNvZGUgb2JqZWN0cyAqLworfSBQeUNvZGVPYmplY3Q7CisKKy8qIE1hc2tzIGZvciBjb19mbGFncyBhYm92ZSAqLworI2RlZmluZSBDT19PUFRJTUlaRUQJMHgwMDAxCisjZGVmaW5lIENPX05FV0xPQ0FMUwkweDAwMDIKKyNkZWZpbmUgQ09fVkFSQVJHUwkweDAwMDQKKyNkZWZpbmUgQ09fVkFSS0VZV09SRFMJMHgwMDA4CisjZGVmaW5lIENPX05FU1RFRCAgICAgICAweDAwMTAKKyNkZWZpbmUgQ09fR0VORVJBVE9SICAgIDB4MDAyMAorLyogVGhlIENPX05PRlJFRSBmbGFnIGlzIHNldCBpZiB0aGVyZSBhcmUgbm8gZnJlZSBvciBjZWxsIHZhcmlhYmxlcy4KKyAgIFRoaXMgaW5mb3JtYXRpb24gaXMgcmVkdW5kYW50LCBidXQgaXQgYWxsb3dzIGEgc2luZ2xlIGZsYWcgdGVzdAorICAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgaXMgYW55IGV4dHJhIHdvcmsgdG8gYmUgZG9uZSB3aGVuIHRoZQorICAgY2FsbCBmcmFtZSBpdCBzZXR1cC4KKyovCisjZGVmaW5lIENPX05PRlJFRSAgICAgICAweDAwNDAKKworI2lmIDAKKy8qIFRoaXMgaXMgbm8gbG9uZ2VyIHVzZWQuICBTdG9wcGVkIGRlZmluaW5nIGluIDIuNSwgZG8gbm90IHJlLXVzZS4gKi8KKyNkZWZpbmUgQ09fR0VORVJBVE9SX0FMTE9XRUQgICAgMHgxMDAwCisjZW5kaWYKKyNkZWZpbmUgQ09fRlVUVVJFX0RJVklTSU9OICAgIAkweDIwMDAKKyNkZWZpbmUgQ09fRlVUVVJFX0FCU09MVVRFX0lNUE9SVCAweDQwMDAgLyogZG8gYWJzb2x1dGUgaW1wb3J0cyBieSBkZWZhdWx0ICovCisjZGVmaW5lIENPX0ZVVFVSRV9XSVRIX1NUQVRFTUVOVCAgMHg4MDAwCisjZGVmaW5lIENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTiAgMHgxMDAwMAorI2RlZmluZSBDT19GVVRVUkVfVU5JQ09ERV9MSVRFUkFMUyAweDIwMDAwCisKKy8qIFRoaXMgc2hvdWxkIGJlIGRlZmluZWQgaWYgYSBmdXR1cmUgc3RhdGVtZW50IG1vZGlmaWVzIHRoZSBzeW50YXguCisgICBGb3IgZXhhbXBsZSwgd2hlbiBhIGtleXdvcmQgaXMgYWRkZWQuCisqLworI2lmIDEKKyNkZWZpbmUgUFlfUEFSU0VSX1JFUVVJUkVTX0ZVVFVSRV9LRVlXT1JECisjZW5kaWYKKworI2RlZmluZSBDT19NQVhCTE9DS1MgMjAgLyogTWF4IHN0YXRpYyBibG9jayBuZXN0aW5nIHdpdGhpbiBhIGZ1bmN0aW9uICovCisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUNvZGVfVHlwZTsKKworI2RlZmluZSBQeUNvZGVfQ2hlY2sob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlDb2RlX1R5cGUpCisjZGVmaW5lIFB5Q29kZV9HZXROdW1GcmVlKG9wKSAoUHlUdXBsZV9HRVRfU0laRSgob3ApLT5jb19mcmVldmFycykpCisKKy8qIFB1YmxpYyBpbnRlcmZhY2UgKi8KK1B5QVBJX0ZVTkMoUHlDb2RlT2JqZWN0ICopIFB5Q29kZV9OZXcoCisJaW50LCBpbnQsIGludCwgaW50LCBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorCVB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIGludCwgUHlPYmplY3QgKik7IAorICAgICAgICAvKiBzYW1lIGFzIHN0cnVjdCBhYm92ZSAqLworCisvKiBDcmVhdGVzIGEgbmV3IGVtcHR5IGNvZGUgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgbG9jYXRpb24uICovCitQeUFQSV9GVU5DKFB5Q29kZU9iamVjdCAqKQorUHlDb2RlX05ld0VtcHR5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpmdW5jbmFtZSwgaW50IGZpcnN0bGluZW5vKTsKKworLyogUmV0dXJuIHRoZSBsaW5lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBieXRlY29kZSBpbmRleAorICAgaW4gdGhpcyBjb2RlIG9iamVjdC4gIElmIHlvdSBqdXN0IG5lZWQgdGhlIGxpbmUgbnVtYmVyIG9mIGEgZnJhbWUsCisgICB1c2UgUHlGcmFtZV9HZXRMaW5lTnVtYmVyKCkgaW5zdGVhZC4gKi8KK1B5QVBJX0ZVTkMoaW50KSBQeUNvZGVfQWRkcjJMaW5lKFB5Q29kZU9iamVjdCAqLCBpbnQpOworCisvKiBmb3IgaW50ZXJuYWwgdXNlIG9ubHkgKi8KKyNkZWZpbmUgX1B5Q29kZV9HRVRDT0RFUFRSKGNvLCBwcCkgXAorCSgoKlB5X1RZUEUoKGNvKS0+Y29fY29kZSktPnRwX2FzX2J1ZmZlci0+YmZfZ2V0cmVhZGJ1ZmZlcikgXAorCSAoKGNvKS0+Y29fY29kZSwgMCwgKHZvaWQgKiopKHBwKSkpCisKK3R5cGVkZWYgc3RydWN0IF9hZGRyX3BhaXIgeworICAgICAgICBpbnQgYXBfbG93ZXI7CisgICAgICAgIGludCBhcF91cHBlcjsKK30gUHlBZGRyUGFpcjsKKworLyogVXBkYXRlICpib3VuZHMgdG8gZGVzY3JpYmUgdGhlIGZpcnN0IGFuZCBvbmUtcGFzdC10aGUtbGFzdCBpbnN0cnVjdGlvbnMgaW4gdGhlCisgICBzYW1lIGxpbmUgYXMgbGFzdGkuICBSZXR1cm4gdGhlIG51bWJlciBvZiB0aGF0IGxpbmUuCisqLworUHlBUElfRlVOQyhpbnQpIF9QeUNvZGVfQ2hlY2tMaW5lTnVtYmVyKFB5Q29kZU9iamVjdCogY28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhc3RpLCBQeUFkZHJQYWlyICpib3VuZHMpOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlDb2RlX09wdGltaXplKFB5T2JqZWN0ICpjb2RlLCBQeU9iamVjdCogY29uc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbmFtZXMsIFB5T2JqZWN0ICpsaW5lbm9fb2JqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfQ09ERV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9jb2RlY3MuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2NvZGVjcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzhjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9jb2RlY3MuaApAQCAtMCwwICsxLDE2NyBAQAorI2lmbmRlZiBQeV9DT0RFQ1JFR0lTVFJZX0gKKyNkZWZpbmUgUHlfQ09ERUNSRUdJU1RSWV9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBQeXRob24gQ29kZWMgUmVnaXN0cnkgYW5kIHN1cHBvcnQgZnVuY3Rpb25zCisKKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKK0NvcHlyaWdodCAoYykgQ29ycG9yYXRpb24gZm9yIE5hdGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzLgorCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogUmVnaXN0ZXIgYSBuZXcgY29kZWMgc2VhcmNoIGZ1bmN0aW9uLgorCisgICBBcyBzaWRlIGVmZmVjdCwgdGhpcyB0cmllcyB0byBsb2FkIHRoZSBlbmNvZGluZ3MgcGFja2FnZSwgaWYgbm90CisgICB5ZXQgZG9uZSwgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgYWx3YXlzIGZpcnN0IGluIHRoZSBsaXN0IG9mCisgICBzZWFyY2ggZnVuY3Rpb25zLgorCisgICBUaGUgc2VhcmNoX2Z1bmN0aW9uJ3MgcmVmY291bnQgaXMgaW5jcmVtZW50ZWQgYnkgdGhpcyBmdW5jdGlvbi4gKi8KKworUHlBUElfRlVOQyhpbnQpIFB5Q29kZWNfUmVnaXN0ZXIoCisgICAgICAgUHlPYmplY3QgKnNlYXJjaF9mdW5jdGlvbgorICAgICAgICk7CisKKy8qIENvZGVjIHJlZ2lzdGVyIGxvb2t1cCBBUEkuCisKKyAgIExvb2tzIHVwIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgcmV0dXJucyBhIENvZGVjSW5mbyBvYmplY3Qgd2l0aAorICAgZnVuY3Rpb24gYXR0cmlidXRlcyB3aGljaCBpbXBsZW1lbnQgdGhlIGRpZmZlcmVudCBhc3BlY3RzIG9mCisgICBwcm9jZXNzaW5nIHRoZSBlbmNvZGluZy4KKworICAgVGhlIGVuY29kaW5nIHN0cmluZyBpcyBsb29rZWQgdXAgY29udmVydGVkIHRvIGFsbCBsb3dlci1jYXNlCisgICBjaGFyYWN0ZXJzLiBUaGlzIG1ha2VzIGVuY29kaW5ncyBsb29rZWQgdXAgdGhyb3VnaCB0aGlzIG1lY2hhbmlzbQorICAgZWZmZWN0aXZlbHkgY2FzZS1pbnNlbnNpdGl2ZS4KKworICAgSWYgbm8gY29kZWMgaXMgZm91bmQsIGEgS2V5RXJyb3IgaXMgc2V0IGFuZCBOVUxMIHJldHVybmVkLgorCisgICBBcyBzaWRlIGVmZmVjdCwgdGhpcyB0cmllcyB0byBsb2FkIHRoZSBlbmNvZGluZ3MgcGFja2FnZSwgaWYgbm90CisgICB5ZXQgZG9uZS4gVGhpcyBpcyBwYXJ0IG9mIHRoZSBsYXp5IGxvYWQgc3RyYXRlZ3kgZm9yIHRoZSBlbmNvZGluZ3MKKyAgIHBhY2thZ2UuCisKKyAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUNvZGVjX0xvb2t1cCgKKyAgICAgICBjb25zdCBjaGFyICplbmNvZGluZworICAgICAgICk7CisKKy8qIEdlbmVyaWMgY29kZWMgYmFzZWQgZW5jb2RpbmcgQVBJLgorCisgICBvYmplY3QgaXMgcGFzc2VkIHRocm91Z2ggdGhlIGVuY29kZXIgZnVuY3Rpb24gZm91bmQgZm9yIHRoZSBnaXZlbgorICAgZW5jb2RpbmcgdXNpbmcgdGhlIGVycm9yIGhhbmRsaW5nIG1ldGhvZCBkZWZpbmVkIGJ5IGVycm9ycy4gZXJyb3JzCisgICBtYXkgYmUgTlVMTCB0byB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kIGRlZmluZWQgZm9yIHRoZSBjb2RlYy4KKyAgIAorICAgUmFpc2VzIGEgTG9va3VwRXJyb3IgaW4gY2FzZSBubyBlbmNvZGVyIGNhbiBiZSBmb3VuZC4KKworICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDb2RlY19FbmNvZGUoCisgICAgICAgUHlPYmplY3QgKm9iamVjdCwKKyAgICAgICBjb25zdCBjaGFyICplbmNvZGluZywKKyAgICAgICBjb25zdCBjaGFyICplcnJvcnMKKyAgICAgICApOworCisvKiBHZW5lcmljIGNvZGVjIGJhc2VkIGRlY29kaW5nIEFQSS4KKworICAgb2JqZWN0IGlzIHBhc3NlZCB0aHJvdWdoIHRoZSBkZWNvZGVyIGZ1bmN0aW9uIGZvdW5kIGZvciB0aGUgZ2l2ZW4KKyAgIGVuY29kaW5nIHVzaW5nIHRoZSBlcnJvciBoYW5kbGluZyBtZXRob2QgZGVmaW5lZCBieSBlcnJvcnMuIGVycm9ycworICAgbWF5IGJlIE5VTEwgdG8gdXNlIHRoZSBkZWZhdWx0IG1ldGhvZCBkZWZpbmVkIGZvciB0aGUgY29kZWMuCisgICAKKyAgIFJhaXNlcyBhIExvb2t1cEVycm9yIGluIGNhc2Ugbm8gZW5jb2RlciBjYW4gYmUgZm91bmQuCisKKyAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q29kZWNfRGVjb2RlKAorICAgICAgIFB5T2JqZWN0ICpvYmplY3QsCisgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgY29uc3QgY2hhciAqZXJyb3JzCisgICAgICAgKTsKKworLyogLS0tIENvZGVjIExvb2t1cCBBUElzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCisgICBBbGwgQVBJcyByZXR1cm4gYSBjb2RlYyBvYmplY3Qgd2l0aCBpbmNyZW1lbnRlZCByZWZjb3VudCBhbmQgYXJlCisgICBiYXNlZCBvbiBfUHlDb2RlY19Mb29rdXAoKS4gIFRoZSBzYW1lIGNvbW1lbnRzIHcvciB0byB0aGUgZW5jb2RpbmcKKyAgIG5hbWUgYWxzbyBhcHBseSB0byB0aGVzZSBBUElzLgorCisqLworCisvKiBHZXQgYW4gZW5jb2RlciBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuIGVuY29kaW5nLiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q29kZWNfRW5jb2RlcigKKyAgICAgICBjb25zdCBjaGFyICplbmNvZGluZworICAgICAgICk7CisKKy8qIEdldCBhIGRlY29kZXIgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBlbmNvZGluZy4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNvZGVjX0RlY29kZXIoCisgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcKKyAgICAgICApOworCisvKiBHZXQgYSBJbmNyZW1lbnRhbEVuY29kZXIgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZW5jb2RpbmcuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDb2RlY19JbmNyZW1lbnRhbEVuY29kZXIoCisgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgY29uc3QgY2hhciAqZXJyb3JzCisgICAgICAgKTsKKworLyogR2V0IGEgSW5jcmVtZW50YWxEZWNvZGVyIG9iamVjdCBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuIGVuY29kaW5nLiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q29kZWNfSW5jcmVtZW50YWxEZWNvZGVyKAorICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycworICAgICAgICk7CisKKy8qIEdldCBhIFN0cmVhbVJlYWRlciBmYWN0b3J5IGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gZW5jb2RpbmcuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDb2RlY19TdHJlYW1SZWFkZXIoCisgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgUHlPYmplY3QgKnN0cmVhbSwKKyAgICAgICBjb25zdCBjaGFyICplcnJvcnMKKyAgICAgICApOworCisvKiBHZXQgYSBTdHJlYW1Xcml0ZXIgZmFjdG9yeSBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuIGVuY29kaW5nLiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q29kZWNfU3RyZWFtV3JpdGVyKAorICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgIFB5T2JqZWN0ICpzdHJlYW0sCisgICAgICAgY29uc3QgY2hhciAqZXJyb3JzCisgICAgICAgKTsKKworLyogVW5pY29kZSBlbmNvZGluZyBlcnJvciBoYW5kbGluZyBjYWxsYmFjayByZWdpc3RyeSBBUEkgKi8KKworLyogUmVnaXN0ZXIgdGhlIGVycm9yIGhhbmRsaW5nIGNhbGxiYWNrIGZ1bmN0aW9uIGVycm9yIHVuZGVyIHRoZSBnaXZlbgorICAgbmFtZS4gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBieSB0aGUgY29kZWMgd2hlbiBpdCBlbmNvdW50ZXJzCisgICB1bmVuY29kYWJsZSBjaGFyYWN0ZXJzL3VuZGVjb2RhYmxlIGJ5dGVzIGFuZCBkb2Vzbid0IGtub3cgdGhlCisgICBjYWxsYmFjayBuYW1lLCB3aGVuIG5hbWUgaXMgc3BlY2lmaWVkIGFzIHRoZSBlcnJvciBwYXJhbWV0ZXIKKyAgIGluIHRoZSBjYWxsIHRvIHRoZSBlbmNvZGUvZGVjb2RlIGZ1bmN0aW9uLgorICAgUmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeUNvZGVjX1JlZ2lzdGVyRXJyb3IoY29uc3QgY2hhciAqbmFtZSwgUHlPYmplY3QgKmVycm9yKTsKKworLyogTG9va3VwIHRoZSBlcnJvciBoYW5kbGluZyBjYWxsYmFjayBmdW5jdGlvbiByZWdpc3RlcmVkIHVuZGVyIHRoZSBnaXZlbgorICAgbmFtZS4gQXMgYSBzcGVjaWFsIGNhc2UgTlVMTCBjYW4gYmUgcGFzc2VkLCBpbiB3aGljaCBjYXNlCisgICB0aGUgZXJyb3IgaGFuZGxpbmcgY2FsbGJhY2sgZm9yICJzdHJpY3QiIHdpbGwgYmUgcmV0dXJuZWQuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q29kZWNfTG9va3VwRXJyb3IoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qIHJhaXNlIGV4YyBhcyBhbiBleGNlcHRpb24gKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDb2RlY19TdHJpY3RFcnJvcnMoUHlPYmplY3QgKmV4Yyk7CisKKy8qIGlnbm9yZSB0aGUgdW5pY29kZSBlcnJvciwgc2tpcHBpbmcgdGhlIGZhdWx0eSBpbnB1dCAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNvZGVjX0lnbm9yZUVycm9ycyhQeU9iamVjdCAqZXhjKTsKKworLyogcmVwbGFjZSB0aGUgdW5pY29kZSBlbmNvZGUgZXJyb3Igd2l0aCA/IG9yIFUrRkZGRCAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNvZGVjX1JlcGxhY2VFcnJvcnMoUHlPYmplY3QgKmV4Yyk7CisKKy8qIHJlcGxhY2UgdGhlIHVuaWNvZGUgZW5jb2RlIGVycm9yIHdpdGggWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q29kZWNfWE1MQ2hhclJlZlJlcGxhY2VFcnJvcnMoUHlPYmplY3QgKmV4Yyk7CisKKy8qIHJlcGxhY2UgdGhlIHVuaWNvZGUgZW5jb2RlIGVycm9yIHdpdGggYmFja3NsYXNoIGVzY2FwZXMgKFx4LCBcdSBhbmQgXFUpICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q29kZWNfQmFja3NsYXNoUmVwbGFjZUVycm9ycyhQeU9iamVjdCAqZXhjKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfQ09ERUNSRUdJU1RSWV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9jb21waWxlLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9jb21waWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEwMDEwMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2NvbXBpbGUuaApAQCAtMCwwICsxLDQwIEBACisKKyNpZm5kZWYgUHlfQ09NUElMRV9ICisjZGVmaW5lIFB5X0NPTVBJTEVfSAorCisjaW5jbHVkZSAiY29kZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIFB1YmxpYyBpbnRlcmZhY2UgKi8KK3N0cnVjdCBfbm9kZTsgLyogRGVjbGFyZSB0aGUgZXhpc3RlbmNlIG9mIHRoaXMgdHlwZSAqLworUHlBUElfRlVOQyhQeUNvZGVPYmplY3QgKikgUHlOb2RlX0NvbXBpbGUoc3RydWN0IF9ub2RlICosIGNvbnN0IGNoYXIgKik7CisKKy8qIEZ1dHVyZSBmZWF0dXJlIHN1cHBvcnQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBmZl9mZWF0dXJlczsgICAgICAvKiBmbGFncyBzZXQgYnkgZnV0dXJlIHN0YXRlbWVudHMgKi8KKyAgICBpbnQgZmZfbGluZW5vOyAgICAgICAgLyogbGluZSBudW1iZXIgb2YgbGFzdCBmdXR1cmUgc3RhdGVtZW50ICovCit9IFB5RnV0dXJlRmVhdHVyZXM7CisKKyNkZWZpbmUgRlVUVVJFX05FU1RFRF9TQ09QRVMgIm5lc3RlZF9zY29wZXMiCisjZGVmaW5lIEZVVFVSRV9HRU5FUkFUT1JTICJnZW5lcmF0b3JzIgorI2RlZmluZSBGVVRVUkVfRElWSVNJT04gImRpdmlzaW9uIgorI2RlZmluZSBGVVRVUkVfQUJTT0xVVEVfSU1QT1JUICJhYnNvbHV0ZV9pbXBvcnQiCisjZGVmaW5lIEZVVFVSRV9XSVRIX1NUQVRFTUVOVCAid2l0aF9zdGF0ZW1lbnQiCisjZGVmaW5lIEZVVFVSRV9QUklOVF9GVU5DVElPTiAicHJpbnRfZnVuY3Rpb24iCisjZGVmaW5lIEZVVFVSRV9VTklDT0RFX0xJVEVSQUxTICJ1bmljb2RlX2xpdGVyYWxzIgorCisKK3N0cnVjdCBfbW9kOyAvKiBEZWNsYXJlIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyB0eXBlICovCitQeUFQSV9GVU5DKFB5Q29kZU9iamVjdCAqKSBQeUFTVF9Db21waWxlKHN0cnVjdCBfbW9kICosIGNvbnN0IGNoYXIgKiwKKwkJCQkJUHlDb21waWxlckZsYWdzICosIFB5QXJlbmEgKik7CitQeUFQSV9GVU5DKFB5RnV0dXJlRmVhdHVyZXMgKikgUHlGdXR1cmVfRnJvbUFTVChzdHJ1Y3QgX21vZCAqLCBjb25zdCBjaGFyICopOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0NPTVBJTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvY29tcGxleG9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvY29tcGxleG9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YTk1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9jb21wbGV4b2JqZWN0LmgKQEAgLTAsMCArMSw2NiBAQAorLyogQ29tcGxleCBudW1iZXIgc3RydWN0dXJlICovCisKKyNpZm5kZWYgUHlfQ09NUExFWE9CSkVDVF9ICisjZGVmaW5lIFB5X0NPTVBMRVhPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgZG91YmxlIHJlYWw7CisgICAgZG91YmxlIGltYWc7Cit9IFB5X2NvbXBsZXg7CisKKy8qIE9wZXJhdGlvbnMgb24gY29tcGxleCBudW1iZXJzIGZyb20gY29tcGxleG1vZHVsZS5jICovCisKKyNkZWZpbmUgY19zdW0gX1B5X2Nfc3VtCisjZGVmaW5lIGNfZGlmZiBfUHlfY19kaWZmCisjZGVmaW5lIGNfbmVnIF9QeV9jX25lZworI2RlZmluZSBjX3Byb2QgX1B5X2NfcHJvZAorI2RlZmluZSBjX3F1b3QgX1B5X2NfcXVvdAorI2RlZmluZSBjX3BvdyBfUHlfY19wb3cKKyNkZWZpbmUgY19hYnMgX1B5X2NfYWJzCisKK1B5QVBJX0ZVTkMoUHlfY29tcGxleCkgY19zdW0oUHlfY29tcGxleCwgUHlfY29tcGxleCk7CitQeUFQSV9GVU5DKFB5X2NvbXBsZXgpIGNfZGlmZihQeV9jb21wbGV4LCBQeV9jb21wbGV4KTsKK1B5QVBJX0ZVTkMoUHlfY29tcGxleCkgY19uZWcoUHlfY29tcGxleCk7CitQeUFQSV9GVU5DKFB5X2NvbXBsZXgpIGNfcHJvZChQeV9jb21wbGV4LCBQeV9jb21wbGV4KTsKK1B5QVBJX0ZVTkMoUHlfY29tcGxleCkgY19xdW90KFB5X2NvbXBsZXgsIFB5X2NvbXBsZXgpOworUHlBUElfRlVOQyhQeV9jb21wbGV4KSBjX3BvdyhQeV9jb21wbGV4LCBQeV9jb21wbGV4KTsKK1B5QVBJX0ZVTkMoZG91YmxlKSBjX2FicyhQeV9jb21wbGV4KTsKKworCisvKiBDb21wbGV4IG9iamVjdCBpbnRlcmZhY2UgKi8KKworLyoKK1B5Q29tcGxleE9iamVjdCByZXByZXNlbnRzIGEgY29tcGxleCBudW1iZXIgd2l0aCBkb3VibGUtcHJlY2lzaW9uCityZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMuCisqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X2NvbXBsZXggY3ZhbDsKK30gUHlDb21wbGV4T2JqZWN0OyAgICAgCisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUNvbXBsZXhfVHlwZTsKKworI2RlZmluZSBQeUNvbXBsZXhfQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgJlB5Q29tcGxleF9UeXBlKQorI2RlZmluZSBQeUNvbXBsZXhfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09ICZQeUNvbXBsZXhfVHlwZSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNvbXBsZXhfRnJvbUNDb21wbGV4KFB5X2NvbXBsZXgpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNvbXBsZXhfRnJvbURvdWJsZXMoZG91YmxlIHJlYWwsIGRvdWJsZSBpbWFnKTsKKworUHlBUElfRlVOQyhkb3VibGUpIFB5Q29tcGxleF9SZWFsQXNEb3VibGUoUHlPYmplY3QgKm9wKTsKK1B5QVBJX0ZVTkMoZG91YmxlKSBQeUNvbXBsZXhfSW1hZ0FzRG91YmxlKFB5T2JqZWN0ICpvcCk7CitQeUFQSV9GVU5DKFB5X2NvbXBsZXgpIFB5Q29tcGxleF9Bc0NDb21wbGV4KFB5T2JqZWN0ICpvcCk7CisKKy8qIEZvcm1hdCB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBmb3JtYXRfc3BlYywgYXMgZGVmaW5lZCBpbiBQRVAgMzEwMQorICAgKEFkdmFuY2VkIFN0cmluZyBGb3JtYXR0aW5nKS4gKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5Q29tcGxleF9Gb3JtYXRBZHZhbmNlZChQeU9iamVjdCAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZvcm1hdF9zcGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfQ09NUExFWE9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9kYXRldGltZS5oIGIvaW5jbHVkZS9weXRob24yLjcvZGF0ZXRpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2FiZTVjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvZGF0ZXRpbWUuaApAQCAtMCwwICsxLDIzOSBAQAorLyogIGRhdGV0aW1lLmgKKyAqLworCisjaWZuZGVmIERBVEVUSU1FX0gKKyNkZWZpbmUgREFURVRJTUVfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBGaWVsZHMgYXJlIHBhY2tlZCBpbnRvIHN1Y2Nlc3NpdmUgYnl0ZXMsIGVhY2ggdmlld2VkIGFzIHVuc2lnbmVkIGFuZAorICogYmlnLWVuZGlhbiwgdW5sZXNzIG90aGVyd2lzZSBub3RlZDoKKyAqCisgKiBieXRlIG9mZnNldAorICogIDAgICAgICAgICAgIHllYXIgICAgIDIgYnl0ZXMsIDEtOTk5OQorICogIDIgICAgICAgICAgIG1vbnRoICAgIDEgYnl0ZSwgMS0xMgorICogIDMgICAgICAgICAgIGRheSAgICAgIDEgYnl0ZSwgMS0zMQorICogIDQgICAgICAgICAgIGhvdXIgICAgIDEgYnl0ZSwgMC0yMworICogIDUgICAgICAgICAgIG1pbnV0ZSAgIDEgYnl0ZSwgMC01OQorICogIDYgICAgICAgICAgIHNlY29uZCAgIDEgYnl0ZSwgMC01OQorICogIDcgICAgICAgICAgIHVzZWNvbmQgIDMgYnl0ZXMsIDAtOTk5OTk5CisgKiAxMAorICovCisKKy8qICMgb2YgYnl0ZXMgZm9yIHllYXIsIG1vbnRoLCBhbmQgZGF5LiAqLworI2RlZmluZSBfUHlEYXRlVGltZV9EQVRFX0RBVEFTSVpFIDQKKworLyogIyBvZiBieXRlcyBmb3IgaG91ciwgbWludXRlLCBzZWNvbmQsIGFuZCB1c2Vjb25kLiAqLworI2RlZmluZSBfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFIDYKKworLyogIyBvZiBieXRlcyBmb3IgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGFuZCB1c2Vjb25kLiAqLworI2RlZmluZSBfUHlEYXRlVGltZV9EQVRFVElNRV9EQVRBU0laRSAxMAorCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRAorICAgIGxvbmcgaGFzaGNvZGU7ICAgICAgICAgICAgICAvKiAtMSB3aGVuIHVua25vd24gKi8KKyAgICBpbnQgZGF5czsgICAgICAgICAgICAgICAgICAgLyogLU1BWF9ERUxUQV9EQVlTIDw9IGRheXMgPD0gTUFYX0RFTFRBX0RBWVMgKi8KKyAgICBpbnQgc2Vjb25kczsgICAgICAgICAgICAgICAgLyogMCA8PSBzZWNvbmRzIDwgMjQqMzYwMCBpcyBpbnZhcmlhbnQgKi8KKyAgICBpbnQgbWljcm9zZWNvbmRzOyAgICAgICAgICAgLyogMCA8PSBtaWNyb3NlY29uZHMgPCAxMDAwMDAwIGlzIGludmFyaWFudCAqLworfSBQeURhdGVUaW1lX0RlbHRhOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFB5T2JqZWN0X0hFQUQgICAgICAgICAgICAgICAvKiBhIHB1cmUgYWJzdHJhY3QgYmFzZSBjbGFzZSAqLworfSBQeURhdGVUaW1lX1RaSW5mbzsKKworCisvKiBUaGUgZGF0ZXRpbWUgYW5kIHRpbWUgdHlwZXMgaGF2ZSBoYXNoY29kZXMsIGFuZCBhbiBvcHRpb25hbCB0emluZm8gbWVtYmVyLAorICogcHJlc2VudCBpZiBhbmQgb25seSBpZiBoYXN0emluZm8gaXMgdHJ1ZS4KKyAqLworI2RlZmluZSBfUHlUWklORk9fSEVBRCAgICAgICAgICBcCisgICAgUHlPYmplY3RfSEVBRCAgICAgICAgICAgICAgIFwKKyAgICBsb25nIGhhc2hjb2RlOyAgICAgICAgICAgICAgXAorICAgIGNoYXIgaGFzdHppbmZvOyAgICAgICAgICAgICAvKiBib29sZWFuIGZsYWcgKi8KKworLyogTm8gX1B5RGF0ZVRpbWVfQmFzZVRaSW5mbyBpcyBhbGxvY2F0ZWQ7IGl0J3MganVzdCB0byBoYXZlIHNvbWV0aGluZworICogY29udmVuaWVudCB0byBjYXN0IHRvLCB3aGVuIGdldHRpbmcgYXQgdGhlIGhhc3R6aW5mbyBtZW1iZXIgb2Ygb2JqZWN0cworICogc3RhcnRpbmcgd2l0aCBfUHlUWklORk9fSEVBRC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBfUHlUWklORk9fSEVBRAorfSBfUHlEYXRlVGltZV9CYXNlVFpJbmZvOworCisvKiBBbGwgdGltZSBvYmplY3RzIGFyZSBvZiBQeURhdGVUaW1lX1RpbWVUeXBlLCBidXQgdGhhdCBjYW4gYmUgYWxsb2NhdGVkCisgKiBpbiB0d28gd2F5cywgd2l0aCBvciB3aXRob3V0IGEgdHppbmZvIG1lbWJlci4gIFdpdGhvdXQgaXMgdGhlIHNhbWUgYXMKKyAqIHR6aW5mbyA9PSBOb25lLCBidXQgY29uc3VtZXMgbGVzcyBtZW1vcnkuICBfUHlEYXRlVGltZV9CYXNlVGltZSBpcyBhbgorICogaW50ZXJuYWwgc3RydWN0IHVzZWQgdG8gYWxsb2NhdGUgdGhlIHJpZ2h0IGFtb3VudCBvZiBzcGFjZSBmb3IgdGhlCisgKiAid2l0aG91dCIgY2FzZS4KKyAqLworI2RlZmluZSBfUHlEYXRlVGltZV9USU1FSEVBRCAgICBcCisgICAgX1B5VFpJTkZPX0hFQUQgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGFbX1B5RGF0ZVRpbWVfVElNRV9EQVRBU0laRV07CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgX1B5RGF0ZVRpbWVfVElNRUhFQUQKK30gX1B5RGF0ZVRpbWVfQmFzZVRpbWU7ICAgICAgICAgLyogaGFzdHppbmZvIGZhbHNlICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgX1B5RGF0ZVRpbWVfVElNRUhFQUQKKyAgICBQeU9iamVjdCAqdHppbmZvOworfSBQeURhdGVUaW1lX1RpbWU7ICAgICAgICAgICAgICAvKiBoYXN0emluZm8gdHJ1ZSAqLworCisKKy8qIEFsbCBkYXRldGltZSBvYmplY3RzIGFyZSBvZiBQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSwgYnV0IHRoYXQgY2FuIGJlCisgKiBhbGxvY2F0ZWQgaW4gdHdvIHdheXMgdG9vLCBqdXN0IGxpa2UgZm9yIHRpbWUgb2JqZWN0cyBhYm92ZS4gIEluIGFkZGl0aW9uLAorICogdGhlIHBsYWluIGRhdGUgdHlwZSBpcyBhIGJhc2UgY2xhc3MgZm9yIGRhdGV0aW1lLCBzbyBpdCBtdXN0IGFsc28gaGF2ZQorICogYSBoYXN0emluZm8gbWVtYmVyIChhbHRob3VnaCBpdCdzIHVudXNlZCB0aGVyZSkuCisgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisgICAgX1B5VFpJTkZPX0hFQUQKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGFbX1B5RGF0ZVRpbWVfREFURV9EQVRBU0laRV07Cit9IFB5RGF0ZVRpbWVfRGF0ZTsKKworI2RlZmluZSBfUHlEYXRlVGltZV9EQVRFVElNRUhFQUQgICAgICAgIFwKKyAgICBfUHlUWklORk9fSEVBRCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgY2hhciBkYXRhW19QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFXTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBfUHlEYXRlVGltZV9EQVRFVElNRUhFQUQKK30gX1B5RGF0ZVRpbWVfQmFzZURhdGVUaW1lOyAgICAgLyogaGFzdHppbmZvIGZhbHNlICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgX1B5RGF0ZVRpbWVfREFURVRJTUVIRUFECisgICAgUHlPYmplY3QgKnR6aW5mbzsKK30gUHlEYXRlVGltZV9EYXRlVGltZTsgICAgICAgICAgLyogaGFzdHppbmZvIHRydWUgKi8KKworCisvKiBBcHBseSBmb3IgZGF0ZSBhbmQgZGF0ZXRpbWUgaW5zdGFuY2VzLiAqLworI2RlZmluZSBQeURhdGVUaW1lX0dFVF9ZRUFSKG8pICAgICAoKCgoUHlEYXRlVGltZV9EYXRlKilvKS0+ZGF0YVswXSA8PCA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICgoUHlEYXRlVGltZV9EYXRlKilvKS0+ZGF0YVsxXSkKKyNkZWZpbmUgUHlEYXRlVGltZV9HRVRfTU9OVEgobykgICAgKCgoUHlEYXRlVGltZV9EYXRlKilvKS0+ZGF0YVsyXSkKKyNkZWZpbmUgUHlEYXRlVGltZV9HRVRfREFZKG8pICAgICAgKCgoUHlEYXRlVGltZV9EYXRlKilvKS0+ZGF0YVszXSkKKworI2RlZmluZSBQeURhdGVUaW1lX0RBVEVfR0VUX0hPVVIobykgICAgICAgICgoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzRdKQorI2RlZmluZSBQeURhdGVUaW1lX0RBVEVfR0VUX01JTlVURShvKSAgICAgICgoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzVdKQorI2RlZmluZSBQeURhdGVUaW1lX0RBVEVfR0VUX1NFQ09ORChvKSAgICAgICgoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzZdKQorI2RlZmluZSBQeURhdGVUaW1lX0RBVEVfR0VUX01JQ1JPU0VDT05EKG8pICAgICAgICAgICAgICBcCisgICAgKCgoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzddIDw8IDE2KSB8ICAgICAgIFwKKyAgICAgKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbOF0gPDwgOCkgIHwgICAgICAgXAorICAgICAgKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs5XSkKKworLyogQXBwbHkgZm9yIHRpbWUgaW5zdGFuY2VzLiAqLworI2RlZmluZSBQeURhdGVUaW1lX1RJTUVfR0VUX0hPVVIobykgICAgICAgICgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbMF0pCisjZGVmaW5lIFB5RGF0ZVRpbWVfVElNRV9HRVRfTUlOVVRFKG8pICAgICAgKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVsxXSkKKyNkZWZpbmUgUHlEYXRlVGltZV9USU1FX0dFVF9TRUNPTkQobykgICAgICAoKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzJdKQorI2RlZmluZSBQeURhdGVUaW1lX1RJTUVfR0VUX01JQ1JPU0VDT05EKG8pICAgICAgICAgICAgICBcCisgICAgKCgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbM10gPDwgMTYpIHwgICAgICAgICAgIFwKKyAgICAgKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVs0XSA8PCA4KSAgfCAgICAgICAgICAgXAorICAgICAgKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzVdKQorCisKKy8qIERlZmluZSBzdHJ1Y3R1cmUgZm9yIEMgQVBJLiAqLwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIHR5cGUgb2JqZWN0cyAqLworICAgIFB5VHlwZU9iamVjdCAqRGF0ZVR5cGU7CisgICAgUHlUeXBlT2JqZWN0ICpEYXRlVGltZVR5cGU7CisgICAgUHlUeXBlT2JqZWN0ICpUaW1lVHlwZTsKKyAgICBQeVR5cGVPYmplY3QgKkRlbHRhVHlwZTsKKyAgICBQeVR5cGVPYmplY3QgKlRaSW5mb1R5cGU7CisKKyAgICAvKiBjb25zdHJ1Y3RvcnMgKi8KKyAgICBQeU9iamVjdCAqKCpEYXRlX0Zyb21EYXRlKShpbnQsIGludCwgaW50LCBQeVR5cGVPYmplY3QqKTsKKyAgICBQeU9iamVjdCAqKCpEYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWUpKGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwKKyAgICAgICAgUHlPYmplY3QqLCBQeVR5cGVPYmplY3QqKTsKKyAgICBQeU9iamVjdCAqKCpUaW1lX0Zyb21UaW1lKShpbnQsIGludCwgaW50LCBpbnQsIFB5T2JqZWN0KiwgUHlUeXBlT2JqZWN0Kik7CisgICAgUHlPYmplY3QgKigqRGVsdGFfRnJvbURlbHRhKShpbnQsIGludCwgaW50LCBpbnQsIFB5VHlwZU9iamVjdCopOworCisgICAgLyogY29uc3RydWN0b3JzIGZvciB0aGUgREIgQVBJICovCisgICAgUHlPYmplY3QgKigqRGF0ZVRpbWVfRnJvbVRpbWVzdGFtcCkoUHlPYmplY3QqLCBQeU9iamVjdCosIFB5T2JqZWN0Kik7CisgICAgUHlPYmplY3QgKigqRGF0ZV9Gcm9tVGltZXN0YW1wKShQeU9iamVjdCosIFB5T2JqZWN0Kik7CisKK30gUHlEYXRlVGltZV9DQVBJOworCisjZGVmaW5lIFB5RGF0ZVRpbWVfQ0FQU1VMRV9OQU1FICJkYXRldGltZS5kYXRldGltZV9DQVBJIgorCisKKy8qICJtYWdpYyIgY29uc3RhbnQgdXNlZCB0byBwYXJ0aWFsbHkgcHJvdGVjdCBhZ2FpbnN0IGRldmVsb3BlciBtaXN0YWtlcy4gKi8KKyNkZWZpbmUgREFURVRJTUVfQVBJX01BR0lDIDB4NDE0NTQ4ZDUKKworI2lmZGVmIFB5X0JVSUxEX0NPUkUKKworLyogTWFjcm9zIGZvciB0eXBlIGNoZWNraW5nIHdoZW4gYnVpbGRpbmcgdGhlIFB5dGhvbiBjb3JlLiAqLworI2RlZmluZSBQeURhdGVfQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgJlB5RGF0ZVRpbWVfRGF0ZVR5cGUpCisjZGVmaW5lIFB5RGF0ZV9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5RGF0ZVRpbWVfRGF0ZVR5cGUpCisKKyNkZWZpbmUgUHlEYXRlVGltZV9DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCAmUHlEYXRlVGltZV9EYXRlVGltZVR5cGUpCisjZGVmaW5lIFB5RGF0ZVRpbWVfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09ICZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSkKKworI2RlZmluZSBQeVRpbWVfQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgJlB5RGF0ZVRpbWVfVGltZVR5cGUpCisjZGVmaW5lIFB5VGltZV9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5RGF0ZVRpbWVfVGltZVR5cGUpCisKKyNkZWZpbmUgUHlEZWx0YV9DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCAmUHlEYXRlVGltZV9EZWx0YVR5cGUpCisjZGVmaW5lIFB5RGVsdGFfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09ICZQeURhdGVUaW1lX0RlbHRhVHlwZSkKKworI2RlZmluZSBQeVRaSW5mb19DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCAmUHlEYXRlVGltZV9UWkluZm9UeXBlKQorI2RlZmluZSBQeVRaSW5mb19DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5RGF0ZVRpbWVfVFpJbmZvVHlwZSkKKworI2Vsc2UKKworLyogRGVmaW5lIGdsb2JhbCB2YXJpYWJsZSBmb3IgdGhlIEMgQVBJIGFuZCBhIG1hY3JvIGZvciBzZXR0aW5nIGl0LiAqLworc3RhdGljIFB5RGF0ZVRpbWVfQ0FQSSAqUHlEYXRlVGltZUFQSSA9IE5VTEw7CisKKyNkZWZpbmUgUHlEYXRlVGltZV9JTVBPUlQgXAorICAgIFB5RGF0ZVRpbWVBUEkgPSAoUHlEYXRlVGltZV9DQVBJICopUHlDYXBzdWxlX0ltcG9ydChQeURhdGVUaW1lX0NBUFNVTEVfTkFNRSwgMCkKKworLyogTWFjcm9zIGZvciB0eXBlIGNoZWNraW5nIHdoZW4gbm90IGJ1aWxkaW5nIHRoZSBQeXRob24gY29yZS4gKi8KKyNkZWZpbmUgUHlEYXRlX0NoZWNrKG9wKSBQeU9iamVjdF9UeXBlQ2hlY2sob3AsIFB5RGF0ZVRpbWVBUEktPkRhdGVUeXBlKQorI2RlZmluZSBQeURhdGVfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09IFB5RGF0ZVRpbWVBUEktPkRhdGVUeXBlKQorCisjZGVmaW5lIFB5RGF0ZVRpbWVfQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVUeXBlKQorI2RlZmluZSBQeURhdGVUaW1lX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSBQeURhdGVUaW1lQVBJLT5EYXRlVGltZVR5cGUpCisKKyNkZWZpbmUgUHlUaW1lX0NoZWNrKG9wKSBQeU9iamVjdF9UeXBlQ2hlY2sob3AsIFB5RGF0ZVRpbWVBUEktPlRpbWVUeXBlKQorI2RlZmluZSBQeVRpbWVfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09IFB5RGF0ZVRpbWVBUEktPlRpbWVUeXBlKQorCisjZGVmaW5lIFB5RGVsdGFfQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgUHlEYXRlVGltZUFQSS0+RGVsdGFUeXBlKQorI2RlZmluZSBQeURlbHRhX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSBQeURhdGVUaW1lQVBJLT5EZWx0YVR5cGUpCisKKyNkZWZpbmUgUHlUWkluZm9fQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgUHlEYXRlVGltZUFQSS0+VFpJbmZvVHlwZSkKKyNkZWZpbmUgUHlUWkluZm9fQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09IFB5RGF0ZVRpbWVBUEktPlRaSW5mb1R5cGUpCisKKy8qIE1hY3JvcyBmb3IgYWNjZXNzaW5nIGNvbnN0cnVjdG9ycyBpbiBhIHNpbXBsaWZpZWQgZmFzaGlvbi4gKi8KKyNkZWZpbmUgUHlEYXRlX0Zyb21EYXRlKHllYXIsIG1vbnRoLCBkYXkpIFwKKyAgICBQeURhdGVUaW1lQVBJLT5EYXRlX0Zyb21EYXRlKHllYXIsIG1vbnRoLCBkYXksIFB5RGF0ZVRpbWVBUEktPkRhdGVUeXBlKQorCisjZGVmaW5lIFB5RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbiwgc2VjLCB1c2VjKSBcCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVfRnJvbURhdGVBbmRUaW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIFwKKyAgICAgICAgbWluLCBzZWMsIHVzZWMsIFB5X05vbmUsIFB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lVHlwZSkKKworI2RlZmluZSBQeVRpbWVfRnJvbVRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQpIFwKKyAgICBQeURhdGVUaW1lQVBJLT5UaW1lX0Zyb21UaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCB1c2Vjb25kLCBcCisgICAgICAgIFB5X05vbmUsIFB5RGF0ZVRpbWVBUEktPlRpbWVUeXBlKQorCisjZGVmaW5lIFB5RGVsdGFfRnJvbURTVShkYXlzLCBzZWNvbmRzLCB1c2Vjb25kcykgXAorICAgIFB5RGF0ZVRpbWVBUEktPkRlbHRhX0Zyb21EZWx0YShkYXlzLCBzZWNvbmRzLCB1c2Vjb25kcywgMSwgXAorICAgICAgICBQeURhdGVUaW1lQVBJLT5EZWx0YVR5cGUpCisKKy8qIE1hY3JvcyBzdXBwb3J0aW5nIHRoZSBEQiBBUEkuICovCisjZGVmaW5lIFB5RGF0ZVRpbWVfRnJvbVRpbWVzdGFtcChhcmdzKSBcCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVfRnJvbVRpbWVzdGFtcCggXAorICAgICAgICAoUHlPYmplY3QqKSAoUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVUeXBlKSwgYXJncywgTlVMTCkKKworI2RlZmluZSBQeURhdGVfRnJvbVRpbWVzdGFtcChhcmdzKSBcCisgICAgUHlEYXRlVGltZUFQSS0+RGF0ZV9Gcm9tVGltZXN0YW1wKCBcCisgICAgICAgIChQeU9iamVjdCopIChQeURhdGVUaW1lQVBJLT5EYXRlVHlwZSksIGFyZ3MpCisKKyNlbmRpZiAgLyogUHlfQlVJTERfQ09SRSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9kZXNjcm9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvZGVzY3JvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTQyNzMyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvZGVzY3JvYmplY3QuaApAQCAtMCwwICsxLDk0IEBACisvKiBEZXNjcmlwdG9ycyAqLworI2lmbmRlZiBQeV9ERVNDUk9CSkVDVF9ICisjZGVmaW5lIFB5X0RFU0NST0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBQeU9iamVjdCAqKCpnZXR0ZXIpKFB5T2JqZWN0ICosIHZvaWQgKik7Cit0eXBlZGVmIGludCAoKnNldHRlcikoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgdm9pZCAqKTsKKwordHlwZWRlZiBzdHJ1Y3QgUHlHZXRTZXREZWYgeworICAgIGNoYXIgKm5hbWU7CisgICAgZ2V0dGVyIGdldDsKKyAgICBzZXR0ZXIgc2V0OworICAgIGNoYXIgKmRvYzsKKyAgICB2b2lkICpjbG9zdXJlOworfSBQeUdldFNldERlZjsKKwordHlwZWRlZiBQeU9iamVjdCAqKCp3cmFwcGVyZnVuYykoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqd3JhcHBlZCk7CisKK3R5cGVkZWYgUHlPYmplY3QgKigqd3JhcHBlcmZ1bmNfa3dkcykoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp3cmFwcGVkLCBQeU9iamVjdCAqa3dkcyk7CisKK3N0cnVjdCB3cmFwcGVyYmFzZSB7CisgICAgY2hhciAqbmFtZTsKKyAgICBpbnQgb2Zmc2V0OworICAgIHZvaWQgKmZ1bmN0aW9uOworICAgIHdyYXBwZXJmdW5jIHdyYXBwZXI7CisgICAgY2hhciAqZG9jOworICAgIGludCBmbGFnczsKKyAgICBQeU9iamVjdCAqbmFtZV9zdHJvYmo7Cit9OworCisvKiBGbGFncyBmb3IgYWJvdmUgc3RydWN0ICovCisjZGVmaW5lIFB5V3JhcHBlckZsYWdfS0VZV09SRFMgMSAvKiB3cmFwcGVyIGZ1bmN0aW9uIHRha2VzIGtleXdvcmQgYXJncyAqLworCisvKiBWYXJpb3VzIGtpbmRzIG9mIGRlc2NyaXB0b3Igb2JqZWN0cyAqLworCisjZGVmaW5lIFB5RGVzY3JfQ09NTU9OIFwKKyAgICBQeU9iamVjdF9IRUFEIFwKKyAgICBQeVR5cGVPYmplY3QgKmRfdHlwZTsgXAorICAgIFB5T2JqZWN0ICpkX25hbWUKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5RGVzY3JfQ09NTU9OOworfSBQeURlc2NyT2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlEZXNjcl9DT01NT047CisgICAgUHlNZXRob2REZWYgKmRfbWV0aG9kOworfSBQeU1ldGhvZERlc2NyT2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlEZXNjcl9DT01NT047CisgICAgc3RydWN0IFB5TWVtYmVyRGVmICpkX21lbWJlcjsKK30gUHlNZW1iZXJEZXNjck9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5RGVzY3JfQ09NTU9OOworICAgIFB5R2V0U2V0RGVmICpkX2dldHNldDsKK30gUHlHZXRTZXREZXNjck9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5RGVzY3JfQ09NTU9OOworICAgIHN0cnVjdCB3cmFwcGVyYmFzZSAqZF9iYXNlOworICAgIHZvaWQgKmRfd3JhcHBlZDsgLyogVGhpcyBjYW4gYmUgYW55IGZ1bmN0aW9uIHBvaW50ZXIgKi8KK30gUHlXcmFwcGVyRGVzY3JPYmplY3Q7CisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVdyYXBwZXJEZXNjcl9UeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RGljdFByb3h5X1R5cGU7CitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlHZXRTZXREZXNjcl9UeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5TWVtYmVyRGVzY3JfVHlwZTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld01ldGhvZChQeVR5cGVPYmplY3QgKiwgUHlNZXRob2REZWYgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGVzY3JfTmV3Q2xhc3NNZXRob2QoUHlUeXBlT2JqZWN0ICosIFB5TWV0aG9kRGVmICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld01lbWJlcihQeVR5cGVPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFB5TWVtYmVyRGVmICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld0dldFNldChQeVR5cGVPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFB5R2V0U2V0RGVmICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURlc2NyX05ld1dyYXBwZXIoUHlUeXBlT2JqZWN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgd3JhcHBlcmJhc2UgKiwgdm9pZCAqKTsKKyNkZWZpbmUgUHlEZXNjcl9Jc0RhdGEoZCkgKFB5X1RZUEUoZCktPnRwX2Rlc2NyX3NldCAhPSBOVUxMKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGljdFByb3h5X05ldyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlXcmFwcGVyX05ldyhQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlQcm9wZXJ0eV9UeXBlOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfREVTQ1JPQkpFQ1RfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9kaWN0b2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9kaWN0b2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlMDFjNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2RpY3RvYmplY3QuaApAQCAtMCwwICsxLDE1NiBAQAorI2lmbmRlZiBQeV9ESUNUT0JKRUNUX0gKKyNkZWZpbmUgUHlfRElDVE9CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogRGljdGlvbmFyeSBvYmplY3QgdHlwZSAtLSBtYXBwaW5nIGZyb20gaGFzaGFibGUgb2JqZWN0IHRvIG9iamVjdCAqLworCisvKiBUaGUgZGlzdHJpYnV0aW9uIGluY2x1ZGVzIGEgc2VwYXJhdGUgZmlsZSwgT2JqZWN0cy9kaWN0bm90ZXMudHh0LAorICAgZGVzY3JpYmluZyBleHBsb3JhdGlvbnMgaW50byBkaWN0aW9uYXJ5IGRlc2lnbiBhbmQgb3B0aW1pemF0aW9uLgorICAgSXQgY292ZXJzIHR5cGljYWwgZGljdGlvbmFyeSB1c2UgcGF0dGVybnMsIHRoZSBwYXJhbWV0ZXJzIGZvcgorICAgdHVuaW5nIGRpY3Rpb25hcmllcywgYW5kIHNldmVyYWwgaWRlYXMgZm9yIHBvc3NpYmxlIG9wdGltaXphdGlvbnMuCisqLworCisvKgorVGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIHNsb3RzIGluIHRoZSB0YWJsZToKKworMS4gVW51c2VkLiAgbWVfa2V5ID09IG1lX3ZhbHVlID09IE5VTEwKKyAgIERvZXMgbm90IGhvbGQgYW4gYWN0aXZlIChrZXksIHZhbHVlKSBwYWlyIG5vdyBhbmQgbmV2ZXIgZGlkLiAgVW51c2VkIGNhbgorICAgdHJhbnNpdGlvbiB0byBBY3RpdmUgdXBvbiBrZXkgaW5zZXJ0aW9uLiAgVGhpcyBpcyB0aGUgb25seSBjYXNlIGluIHdoaWNoCisgICBtZV9rZXkgaXMgTlVMTCwgYW5kIGlzIGVhY2ggc2xvdCdzIGluaXRpYWwgc3RhdGUuCisKKzIuIEFjdGl2ZS4gIG1lX2tleSAhPSBOVUxMIGFuZCBtZV9rZXkgIT0gZHVtbXkgYW5kIG1lX3ZhbHVlICE9IE5VTEwKKyAgIEhvbGRzIGFuIGFjdGl2ZSAoa2V5LCB2YWx1ZSkgcGFpci4gIEFjdGl2ZSBjYW4gdHJhbnNpdGlvbiB0byBEdW1teSB1cG9uCisgICBrZXkgZGVsZXRpb24uICBUaGlzIGlzIHRoZSBvbmx5IGNhc2UgaW4gd2hpY2ggbWVfdmFsdWUgIT0gTlVMTC4KKworMy4gRHVtbXkuICBtZV9rZXkgPT0gZHVtbXkgYW5kIG1lX3ZhbHVlID09IE5VTEwKKyAgIFByZXZpb3VzbHkgaGVsZCBhbiBhY3RpdmUgKGtleSwgdmFsdWUpIHBhaXIsIGJ1dCB0aGF0IHdhcyBkZWxldGVkIGFuZCBhbgorICAgYWN0aXZlIHBhaXIgaGFzIG5vdCB5ZXQgb3ZlcndyaXR0ZW4gdGhlIHNsb3QuICBEdW1teSBjYW4gdHJhbnNpdGlvbiB0bworICAgQWN0aXZlIHVwb24ga2V5IGluc2VydGlvbi4gIER1bW15IHNsb3RzIGNhbm5vdCBiZSBtYWRlIFVudXNlZCBhZ2FpbgorICAgKGNhbm5vdCBoYXZlIG1lX2tleSBzZXQgdG8gTlVMTCksIGVsc2UgdGhlIHByb2JlIHNlcXVlbmNlIGluIGNhc2Ugb2YKKyAgIGNvbGxpc2lvbiB3b3VsZCBoYXZlIG5vIHdheSB0byBrbm93IHRoZXkgd2VyZSBvbmNlIGFjdGl2ZS4KKworTm90ZTogLnBvcGl0ZW0oKSBhYnVzZXMgdGhlIG1lX2hhc2ggZmllbGQgb2YgYW4gVW51c2VkIG9yIER1bW15IHNsb3QgdG8KK2hvbGQgYSBzZWFyY2ggZmluZ2VyLiAgVGhlIG1lX2hhc2ggZmllbGQgb2YgVW51c2VkIG9yIER1bW15IHNsb3RzIGhhcyBubworbWVhbmluZyBvdGhlcndpc2UuCisqLworCisvKiBQeURpY3RfTUlOU0laRSBpcyB0aGUgbWluaW11bSBzaXplIG9mIGEgZGljdGlvbmFyeS4gIFRoaXMgbWFueSBzbG90cyBhcmUKKyAqIGFsbG9jYXRlZCBkaXJlY3RseSBpbiB0aGUgZGljdCBvYmplY3QgKGluIHRoZSBtYV9zbWFsbHRhYmxlIG1lbWJlcikuCisgKiBJdCBtdXN0IGJlIGEgcG93ZXIgb2YgMiwgYW5kIGF0IGxlYXN0IDQuICA4IGFsbG93cyBkaWN0cyB3aXRoIG5vIG1vcmUKKyAqIHRoYW4gNSBhY3RpdmUgZW50cmllcyB0byBsaXZlIGluIG1hX3NtYWxsdGFibGUgKGFuZCBzbyBhdm9pZCBhbgorICogYWRkaXRpb25hbCBtYWxsb2MpOyBpbnN0cnVtZW50YXRpb24gc3VnZ2VzdGVkIHRoaXMgc3VmZmljZXMgZm9yIHRoZQorICogbWFqb3JpdHkgb2YgZGljdHMgKGNvbnNpc3RpbmcgbW9zdGx5IG9mIHVzdWFsbHktc21hbGwgaW5zdGFuY2UgZGljdHMgYW5kCisgKiB1c3VhbGx5LXNtYWxsIGRpY3RzIGNyZWF0ZWQgdG8gcGFzcyBrZXl3b3JkIGFyZ3VtZW50cykuCisgKi8KKyNkZWZpbmUgUHlEaWN0X01JTlNJWkUgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogQ2FjaGVkIGhhc2ggY29kZSBvZiBtZV9rZXkuICBOb3RlIHRoYXQgaGFzaCBjb2RlcyBhcmUgQyBsb25ncy4KKyAgICAgKiBXZSBoYXZlIHRvIHVzZSBQeV9zc2l6ZV90IGluc3RlYWQgYmVjYXVzZSBkaWN0X3BvcGl0ZW0oKSBhYnVzZXMKKyAgICAgKiBtZV9oYXNoIHRvIGhvbGQgYSBzZWFyY2ggZmluZ2VyLgorICAgICAqLworICAgIFB5X3NzaXplX3QgbWVfaGFzaDsKKyAgICBQeU9iamVjdCAqbWVfa2V5OworICAgIFB5T2JqZWN0ICptZV92YWx1ZTsKK30gUHlEaWN0RW50cnk7CisKKy8qCitUbyBlbnN1cmUgdGhlIGxvb2t1cCBhbGdvcml0aG0gdGVybWluYXRlcywgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgVW51c2VkCitzbG90IChOVUxMIGtleSkgaW4gdGhlIHRhYmxlLgorVGhlIHZhbHVlIG1hX2ZpbGwgaXMgdGhlIG51bWJlciBvZiBub24tTlVMTCBrZXlzIChzdW0gb2YgQWN0aXZlIGFuZCBEdW1teSk7CittYV91c2VkIGlzIHRoZSBudW1iZXIgb2Ygbm9uLU5VTEwsIG5vbi1kdW1teSBrZXlzICg9PSB0aGUgbnVtYmVyIG9mIG5vbi1OVUxMCit2YWx1ZXMgPT0gdGhlIG51bWJlciBvZiBBY3RpdmUgaXRlbXMpLgorVG8gYXZvaWQgc2xvd2luZyBkb3duIGxvb2t1cHMgb24gYSBuZWFyLWZ1bGwgdGFibGUsIHdlIHJlc2l6ZSB0aGUgdGFibGUgd2hlbgoraXQncyB0d28tdGhpcmRzIGZ1bGwuCisqLwordHlwZWRlZiBzdHJ1Y3QgX2RpY3RvYmplY3QgUHlEaWN0T2JqZWN0Oworc3RydWN0IF9kaWN0b2JqZWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfc3NpemVfdCBtYV9maWxsOyAgLyogIyBBY3RpdmUgKyAjIER1bW15ICovCisgICAgUHlfc3NpemVfdCBtYV91c2VkOyAgLyogIyBBY3RpdmUgKi8KKworICAgIC8qIFRoZSB0YWJsZSBjb250YWlucyBtYV9tYXNrICsgMSBzbG90cywgYW5kIHRoYXQncyBhIHBvd2VyIG9mIDIuCisgICAgICogV2Ugc3RvcmUgdGhlIG1hc2sgaW5zdGVhZCBvZiB0aGUgc2l6ZSBiZWNhdXNlIHRoZSBtYXNrIGlzIG1vcmUKKyAgICAgKiBmcmVxdWVudGx5IG5lZWRlZC4KKyAgICAgKi8KKyAgICBQeV9zc2l6ZV90IG1hX21hc2s7CisKKyAgICAvKiBtYV90YWJsZSBwb2ludHMgdG8gbWFfc21hbGx0YWJsZSBmb3Igc21hbGwgdGFibGVzLCBlbHNlIHRvCisgICAgICogYWRkaXRpb25hbCBtYWxsb2MnZWQgbWVtb3J5LiAgbWFfdGFibGUgaXMgbmV2ZXIgTlVMTCEgIFRoaXMgcnVsZQorICAgICAqIHNhdmVzIHJlcGVhdGVkIHJ1bnRpbWUgbnVsbC10ZXN0cyBpbiB0aGUgd29ya2hvcnNlIGdldGl0ZW0gYW5kCisgICAgICogc2V0aXRlbSBjYWxscy4KKyAgICAgKi8KKyAgICBQeURpY3RFbnRyeSAqbWFfdGFibGU7CisgICAgUHlEaWN0RW50cnkgKigqbWFfbG9va3VwKShQeURpY3RPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpOworICAgIFB5RGljdEVudHJ5IG1hX3NtYWxsdGFibGVbUHlEaWN0X01JTlNJWkVdOworfTsKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RGljdF9UeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RGljdEl0ZXJLZXlfVHlwZTsKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeURpY3RJdGVyVmFsdWVfVHlwZTsKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeURpY3RJdGVySXRlbV9UeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RGljdEtleXNfVHlwZTsKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeURpY3RJdGVtc19UeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RGljdFZhbHVlc19UeXBlOworCisjZGVmaW5lIFB5RGljdF9DaGVjayhvcCkgXAorICAgICAgICAgICAgICAgICBQeVR5cGVfRmFzdFN1YmNsYXNzKFB5X1RZUEUob3ApLCBQeV9UUEZMQUdTX0RJQ1RfU1VCQ0xBU1MpCisjZGVmaW5lIFB5RGljdF9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5RGljdF9UeXBlKQorI2RlZmluZSBQeURpY3RLZXlzX0NoZWNrKG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5RGljdEtleXNfVHlwZSkKKyNkZWZpbmUgUHlEaWN0SXRlbXNfQ2hlY2sob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlEaWN0SXRlbXNfVHlwZSkKKyNkZWZpbmUgUHlEaWN0VmFsdWVzX0NoZWNrKG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5RGljdFZhbHVlc19UeXBlKQorLyogVGhpcyBleGNsdWRlcyBWYWx1ZXMsIHNpbmNlIHRoZXkgYXJlIG5vdCBzZXRzLiAqLworIyBkZWZpbmUgUHlEaWN0Vmlld1NldF9DaGVjayhvcCkgXAorICAgIChQeURpY3RLZXlzX0NoZWNrKG9wKSB8fCBQeURpY3RJdGVtc19DaGVjayhvcCkpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEaWN0X05ldyh2b2lkKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEaWN0X0dldEl0ZW0oUHlPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5KTsKK1B5QVBJX0ZVTkMoaW50KSBQeURpY3RfU2V0SXRlbShQeU9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXksIFB5T2JqZWN0ICppdGVtKTsKK1B5QVBJX0ZVTkMoaW50KSBQeURpY3RfRGVsSXRlbShQeU9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXkpOworUHlBUElfRlVOQyh2b2lkKSBQeURpY3RfQ2xlYXIoUHlPYmplY3QgKm1wKTsKK1B5QVBJX0ZVTkMoaW50KSBQeURpY3RfTmV4dCgKKyAgICBQeU9iamVjdCAqbXAsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXksIFB5T2JqZWN0ICoqdmFsdWUpOworUHlBUElfRlVOQyhpbnQpIF9QeURpY3RfTmV4dCgKKyAgICBQeU9iamVjdCAqbXAsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXksIFB5T2JqZWN0ICoqdmFsdWUsIGxvbmcgKmhhc2gpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURpY3RfS2V5cyhQeU9iamVjdCAqbXApOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURpY3RfVmFsdWVzKFB5T2JqZWN0ICptcCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGljdF9JdGVtcyhQeU9iamVjdCAqbXApOworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeURpY3RfU2l6ZShQeU9iamVjdCAqbXApOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURpY3RfQ29weShQeU9iamVjdCAqbXApOworUHlBUElfRlVOQyhpbnQpIFB5RGljdF9Db250YWlucyhQeU9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXkpOworUHlBUElfRlVOQyhpbnQpIF9QeURpY3RfQ29udGFpbnMoUHlPYmplY3QgKm1wLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlEaWN0X05ld1ByZXNpemVkKFB5X3NzaXplX3QgbWludXNlZCk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeURpY3RfTWF5YmVVbnRyYWNrKFB5T2JqZWN0ICptcCk7CisKKy8qIFB5RGljdF9VcGRhdGUobXAsIG90aGVyKSBpcyBlcXVpdmFsZW50IHRvIFB5RGljdF9NZXJnZShtcCwgb3RoZXIsIDEpLiAqLworUHlBUElfRlVOQyhpbnQpIFB5RGljdF9VcGRhdGUoUHlPYmplY3QgKm1wLCBQeU9iamVjdCAqb3RoZXIpOworCisvKiBQeURpY3RfTWVyZ2UgdXBkYXRlcy9tZXJnZXMgZnJvbSBhIG1hcHBpbmcgb2JqZWN0IChhbiBvYmplY3QgdGhhdAorICAgc3VwcG9ydHMgUHlNYXBwaW5nX0tleXMoKSBhbmQgUHlPYmplY3RfR2V0SXRlbSgpKS4gIElmIG92ZXJyaWRlIGlzIHRydWUsCisgICB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGEga2V5IHdpbnMsIGVsc2UgdGhlIGZpcnN0LiAgVGhlIFB5dGhvbgorICAgZGljdC51cGRhdGUob3RoZXIpIGlzIGVxdWl2YWxlbnQgdG8gUHlEaWN0X01lcmdlKGRpY3QsIG90aGVyLCAxKS4KKyovCitQeUFQSV9GVU5DKGludCkgUHlEaWN0X01lcmdlKFB5T2JqZWN0ICptcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3ZlcnJpZGUpOworCisvKiBQeURpY3RfTWVyZ2VGcm9tU2VxMiB1cGRhdGVzL21lcmdlcyBmcm9tIGFuIGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcKKyAgIGl0ZXJhYmxlIG9iamVjdHMgb2YgbGVuZ3RoIDIuICBJZiBvdmVycmlkZSBpcyB0cnVlLCB0aGUgbGFzdCBvY2N1cnJlbmNlCisgICBvZiBhIGtleSB3aW5zLCBlbHNlIHRoZSBmaXJzdC4gIFRoZSBQeXRob24gZGljdCBjb25zdHJ1Y3RvciBkaWN0KHNlcTIpCisgICBpcyBlcXVpdmFsZW50IHRvIGRpY3Q9e307IFB5RGljdF9NZXJnZUZyb21TZXEoZGljdCwgc2VxMiwgMSkuCisqLworUHlBUElfRlVOQyhpbnQpIFB5RGljdF9NZXJnZUZyb21TZXEyKFB5T2JqZWN0ICpkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpzZXEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdmVycmlkZSk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEaWN0X0dldEl0ZW1TdHJpbmcoUHlPYmplY3QgKmRwLCBjb25zdCBjaGFyICprZXkpOworUHlBUElfRlVOQyhpbnQpIFB5RGljdF9TZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpkcCwgY29uc3QgY2hhciAqa2V5LCBQeU9iamVjdCAqaXRlbSk7CitQeUFQSV9GVU5DKGludCkgUHlEaWN0X0RlbEl0ZW1TdHJpbmcoUHlPYmplY3QgKmRwLCBjb25zdCBjaGFyICprZXkpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9ESUNUT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2R0b2EuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2R0b2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjQzNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvZHRvYS5oCkBAIC0wLDAgKzEsMTUgQEAKKyNpZm5kZWYgUFlfTk9fU0hPUlRfRkxPQVRfUkVQUgorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9GVU5DKGRvdWJsZSkgX1B5X2RnX3N0cnRvZChjb25zdCBjaGFyICpzdHIsIGNoYXIgKipwdHIpOworUHlBUElfRlVOQyhjaGFyICopIF9QeV9kZ19kdG9hKGRvdWJsZSBkLCBpbnQgbW9kZSwgaW50IG5kaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRlY3B0LCBpbnQgKnNpZ24sIGNoYXIgKipydmUpOworUHlBUElfRlVOQyh2b2lkKSBfUHlfZGdfZnJlZWR0b2EoY2hhciAqcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvZW51bW9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvZW51bW9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNGRiZmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9lbnVtb2JqZWN0LmgKQEAgLTAsMCArMSwxNyBAQAorI2lmbmRlZiBQeV9FTlVNT0JKRUNUX0gKKyNkZWZpbmUgUHlfRU5VTU9CSkVDVF9ICisKKy8qIEVudW1lcmF0ZSBPYmplY3QgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlFbnVtX1R5cGU7CitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlSZXZlcnNlZF9UeXBlOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIVB5X0VOVU1PQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvZXJyY29kZS5oIGIvaW5jbHVkZS9weXRob24yLjcvZXJyY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlY2VjODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9lcnJjb2RlLmgKQEAgLTAsMCArMSwzNiBAQAorI2lmbmRlZiBQeV9FUlJDT0RFX0gKKyNkZWZpbmUgUHlfRVJSQ09ERV9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogRXJyb3IgY29kZXMgcGFzc2VkIGFyb3VuZCBiZXR3ZWVuIGZpbGUgaW5wdXQsIHRva2VuaXplciwgcGFyc2VyIGFuZAorICAgaW50ZXJwcmV0ZXIuICBUaGlzIGlzIG5lY2Vzc2FyeSBzbyB3ZSBjYW4gdHVybiB0aGVtIGludG8gUHl0aG9uCisgICBleGNlcHRpb25zIGF0IGEgaGlnaGVyIGxldmVsLiAgTm90ZSB0aGF0IHNvbWUgZXJyb3JzIGhhdmUgYQorICAgc2xpZ2h0bHkgZGlmZmVyZW50IG1lYW5pbmcgd2hlbiBwYXNzZWQgZnJvbSB0aGUgdG9rZW5pemVyIHRvIHRoZQorICAgcGFyc2VyIHRoYW4gd2hlbiBwYXNzZWQgZnJvbSB0aGUgcGFyc2VyIHRvIHRoZSBpbnRlcnByZXRlcjsgZS5nLgorICAgdGhlIHBhcnNlciBvbmx5IHJldHVybnMgRV9FT0Ygd2hlbiBpdCBoaXRzIEVPRiBpbW1lZGlhdGVseSwgYW5kIGl0CisgICBuZXZlciByZXR1cm5zIEVfT0suICovCisKKyNkZWZpbmUgRV9PSwkJMTAJLyogTm8gZXJyb3IgKi8KKyNkZWZpbmUgRV9FT0YJCTExCS8qIEVuZCBPZiBGaWxlICovCisjZGVmaW5lIEVfSU5UUgkJMTIJLyogSW50ZXJydXB0ZWQgKi8KKyNkZWZpbmUgRV9UT0tFTgkJMTMJLyogQmFkIHRva2VuICovCisjZGVmaW5lIEVfU1lOVEFYCTE0CS8qIFN5bnRheCBlcnJvciAqLworI2RlZmluZSBFX05PTUVNCQkxNQkvKiBSYW4gb3V0IG9mIG1lbW9yeSAqLworI2RlZmluZSBFX0RPTkUJCTE2CS8qIFBhcnNpbmcgY29tcGxldGUgKi8KKyNkZWZpbmUgRV9FUlJPUgkJMTcJLyogRXhlY3V0aW9uIGVycm9yICovCisjZGVmaW5lIEVfVEFCU1BBQ0UJMTgJLyogSW5jb25zaXN0ZW50IG1peGluZyBvZiB0YWJzIGFuZCBzcGFjZXMgKi8KKyNkZWZpbmUgRV9PVkVSRkxPVyAgICAgIDE5CS8qIE5vZGUgaGFkIHRvbyBtYW55IGNoaWxkcmVuICovCisjZGVmaW5lIEVfVE9PREVFUAkyMAkvKiBUb28gbWFueSBpbmRlbnRhdGlvbiBsZXZlbHMgKi8KKyNkZWZpbmUgRV9ERURFTlQJMjEJLyogTm8gbWF0Y2hpbmcgb3V0ZXIgYmxvY2sgZm9yIGRlZGVudCAqLworI2RlZmluZSBFX0RFQ09ERQkyMgkvKiBFcnJvciBpbiBkZWNvZGluZyBpbnRvIFVuaWNvZGUgKi8KKyNkZWZpbmUgRV9FT0ZTCQkyMwkvKiBFT0YgaW4gdHJpcGxlLXF1b3RlZCBzdHJpbmcgKi8KKyNkZWZpbmUgRV9FT0xTCQkyNAkvKiBFT0wgaW4gc2luZ2xlLXF1b3RlZCBzdHJpbmcgKi8KKyNkZWZpbmUgRV9MSU5FQ09OVAkyNQkvKiBVbmV4cGVjdGVkIGNoYXJhY3RlcnMgYWZ0ZXIgYSBsaW5lIGNvbnRpbnVhdGlvbiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9FUlJDT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2V2YWwuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2V2YWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzhkZmUwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvZXZhbC5oCkBAIC0wLDAgKzEsMjUgQEAKKworLyogSW50ZXJmYWNlIHRvIGV4ZWN1dGUgY29tcGlsZWQgY29kZSAqLworCisjaWZuZGVmIFB5X0VWQUxfSAorI2RlZmluZSBQeV9FVkFMX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUV2YWxfRXZhbENvZGUoUHlDb2RlT2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9FdmFsQ29kZUV4KFB5Q29kZU9iamVjdCAqY28sCisJCQkJCVB5T2JqZWN0ICpnbG9iYWxzLAorCQkJCQlQeU9iamVjdCAqbG9jYWxzLAorCQkJCQlQeU9iamVjdCAqKmFyZ3MsIGludCBhcmdjLAorCQkJCQlQeU9iamVjdCAqKmt3ZHMsIGludCBrd2RjLAorCQkJCQlQeU9iamVjdCAqKmRlZnMsIGludCBkZWZjLAorCQkJCQlQeU9iamVjdCAqY2xvc3VyZSk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5RXZhbF9DYWxsVHJhY2luZyhQeU9iamVjdCAqZnVuYywgUHlPYmplY3QgKmFyZ3MpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9FVkFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2ZpbGVvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2ZpbGVvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjU0MGY5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvZmlsZW9iamVjdC5oCkBAIC0wLDAgKzEsOTcgQEAKKworLyogRmlsZSBvYmplY3QgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfRklMRU9CSkVDVF9ICisjZGVmaW5lIFB5X0ZJTEVPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIEZJTEUgKmZfZnA7CisgICAgUHlPYmplY3QgKmZfbmFtZTsKKyAgICBQeU9iamVjdCAqZl9tb2RlOworICAgIGludCAoKmZfY2xvc2UpKEZJTEUgKik7CisgICAgaW50IGZfc29mdHNwYWNlOyAgICAgICAgICAgIC8qIEZsYWcgdXNlZCBieSAncHJpbnQnIGNvbW1hbmQgKi8KKyAgICBpbnQgZl9iaW5hcnk7ICAgICAgICAgICAgICAgLyogRmxhZyB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmlsZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gaW4gYmluYXJ5ICgxKSBvciB0ZXh0ICgwKSBtb2RlICovCisgICAgY2hhciogZl9idWY7ICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlZCByZWFkYWhlYWQgYnVmZmVyICovCisgICAgY2hhciogZl9idWZlbmQ7ICAgICAgICAgICAgIC8qIFBvaW50cyBhZnRlciBsYXN0IG9jY3VwaWVkIHBvc2l0aW9uICovCisgICAgY2hhciogZl9idWZwdHI7ICAgICAgICAgICAgIC8qIEN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uICovCisgICAgY2hhciAqZl9zZXRidWY7ICAgICAgICAgICAgIC8qIEJ1ZmZlciBmb3Igc2V0YnVmKDMpIGFuZCBzZXR2YnVmKDMpICovCisgICAgaW50IGZfdW5pdl9uZXdsaW5lOyAgICAgICAgIC8qIEhhbmRsZSBhbnkgbmV3bGluZSBjb252ZW50aW9uICovCisgICAgaW50IGZfbmV3bGluZXR5cGVzOyAgICAgICAgIC8qIFR5cGVzIG9mIG5ld2xpbmVzIHNlZW4gKi8KKyAgICBpbnQgZl9za2lwbmV4dGxmOyAgICAgICAgICAgLyogU2tpcCBuZXh0IFxuICovCisgICAgUHlPYmplY3QgKmZfZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKmZfZXJyb3JzOworICAgIFB5T2JqZWN0ICp3ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KKyAgICBpbnQgdW5sb2NrZWRfY291bnQ7ICAgICAgICAgLyogTnVtLiBjdXJyZW50bHkgcnVubmluZyBzZWN0aW9ucyBvZiBjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgZl9mcCB3aXRoIHRoZSBHSUwgcmVsZWFzZWQuICovCisgICAgaW50IHJlYWRhYmxlOworICAgIGludCB3cml0YWJsZTsKK30gUHlGaWxlT2JqZWN0OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlGaWxlX1R5cGU7CisKKyNkZWZpbmUgUHlGaWxlX0NoZWNrKG9wKSBQeU9iamVjdF9UeXBlQ2hlY2sob3AsICZQeUZpbGVfVHlwZSkKKyNkZWZpbmUgUHlGaWxlX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlGaWxlX1R5cGUpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGaWxlX0Zyb21TdHJpbmcoY2hhciAqLCBjaGFyICopOworUHlBUElfRlVOQyh2b2lkKSBQeUZpbGVfU2V0QnVmU2l6ZShQeU9iamVjdCAqLCBpbnQpOworUHlBUElfRlVOQyhpbnQpIFB5RmlsZV9TZXRFbmNvZGluZyhQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOworUHlBUElfRlVOQyhpbnQpIFB5RmlsZV9TZXRFbmNvZGluZ0FuZEVycm9ycyhQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIGNoYXIgKmVycm9ycyk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RmlsZV9Gcm9tRmlsZShGSUxFICosIGNoYXIgKiwgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqKShGSUxFICopKTsKK1B5QVBJX0ZVTkMoRklMRSAqKSBQeUZpbGVfQXNGaWxlKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh2b2lkKSBQeUZpbGVfSW5jVXNlQ291bnQoUHlGaWxlT2JqZWN0ICopOworUHlBUElfRlVOQyh2b2lkKSBQeUZpbGVfRGVjVXNlQ291bnQoUHlGaWxlT2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZpbGVfTmFtZShQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGaWxlX0dldExpbmUoUHlPYmplY3QgKiwgaW50KTsKK1B5QVBJX0ZVTkMoaW50KSBQeUZpbGVfV3JpdGVPYmplY3QoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgaW50KTsKK1B5QVBJX0ZVTkMoaW50KSBQeUZpbGVfU29mdFNwYWNlKFB5T2JqZWN0ICosIGludCk7CitQeUFQSV9GVU5DKGludCkgUHlGaWxlX1dyaXRlU3RyaW5nKGNvbnN0IGNoYXIgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvcihQeU9iamVjdCAqKTsKKworLyogVGhlIGRlZmF1bHQgZW5jb2RpbmcgdXNlZCBieSB0aGUgcGxhdGZvcm0gZmlsZSBzeXN0ZW0gQVBJcworICAgSWYgbm9uLU5VTEwsIHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHN0cmluZ3MKKyovCitQeUFQSV9EQVRBKGNvbnN0IGNoYXIgKikgUHlfRmlsZVN5c3RlbURlZmF1bHRFbmNvZGluZzsKKworLyogUm91dGluZXMgdG8gcmVwbGFjZSBmcmVhZCgpIGFuZCBmZ2V0cygpIHdoaWNoIGFjY2VwdCBhbnkgb2YgXHIsIFxuCisgICBvciBcclxuIGFzIGxpbmUgdGVybWluYXRvcnMuCisqLworI2RlZmluZSBQWV9TVERJT1RFWFRNT0RFICJiIgorY2hhciAqUHlfVW5pdmVyc2FsTmV3bGluZUZnZXRzKGNoYXIgKiwgaW50LCBGSUxFKiwgUHlPYmplY3QgKik7CitzaXplX3QgUHlfVW5pdmVyc2FsTmV3bGluZUZyZWFkKGNoYXIgKiwgc2l6ZV90LCBGSUxFICosIFB5T2JqZWN0ICopOworCisvKiBBIHJvdXRpbmUgdG8gZG8gc2FuaXR5IGNoZWNraW5nIG9uIHRoZSBmaWxlIG1vZGUgc3RyaW5nLiAgcmV0dXJucworICAgbm9uLXplcm8gb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkCisqLworaW50IF9QeUZpbGVfU2FuaXRpemVNb2RlKGNoYXIgKm1vZGUpOworCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNDAwCisvKiBBIHJvdXRpbmUgdG8gY2hlY2sgaWYgYSBmaWxlIGRlc2NyaXB0b3IgaXMgdmFsaWQgb24gV2luZG93cy4gIFJldHVybnMgMAorICogYW5kIHNldHMgZXJybm8gdG8gRUJBREYgaWYgaXQgaXNuJ3QuICBUaGlzIGlzIHRvIGF2b2lkIEFzc2VydGlvbnMKKyAqIGZyb20gdmFyaW91cyBmdW5jdGlvbnMgaW4gdGhlIFdpbmRvd3MgQ1JUIGJlZ2lubmluZyB3aXRoCisgKiBWaXN1YWwgU3R1ZGlvIDIwMDUKKyAqLworaW50IF9QeVZlcmlmeV9mZChpbnQgZmQpOworI2VsaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxMjAwCisvKiBmZG9wZW4gZG9lc24ndCBzZXQgZXJybm8gRUJBREYgYW5kIGNyYXNoZXMgZm9yIGxhcmdlIGZkIG9uIGRlYnVnIGJ1aWxkICovCisjZGVmaW5lIF9QeVZlcmlmeV9mZChmZCkgKF9nZXRfb3NmaGFuZGxlKGZkKSA+PSAwKQorI2Vsc2UKKyNkZWZpbmUgX1B5VmVyaWZ5X2ZkKEEpICgxKSAvKiBkdW1teSAqLworI2VuZGlmCisKKy8qIEEgcm91dGluZSB0byBjaGVjayBpZiBhIGZpbGUgZGVzY3JpcHRvciBjYW4gYmUgc2VsZWN0KCktZWQuICovCisjaWZkZWYgSEFWRV9TRUxFQ1QKKyAjZGVmaW5lIF9QeUlzU2VsZWN0YWJsZV9mZChGRCkgKCgoRkQpID49IDApICYmICgoRkQpIDwgRkRfU0VUU0laRSkpCisjZWxzZQorICNkZWZpbmUgX1B5SXNTZWxlY3RhYmxlX2ZkKEZEKSAoMSkKKyNlbmRpZiAvKiBIQVZFX1NFTEVDVCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9GSUxFT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2Zsb2F0b2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9mbG9hdG9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZTg4MjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9mbG9hdG9iamVjdC5oCkBAIC0wLDAgKzEsMTQwIEBACisKKy8qIEZsb2F0IG9iamVjdCBpbnRlcmZhY2UgKi8KKworLyoKK1B5RmxvYXRPYmplY3QgcmVwcmVzZW50cyBhIChkb3VibGUgcHJlY2lzaW9uKSBmbG9hdGluZyBwb2ludCBudW1iZXIuCisqLworCisjaWZuZGVmIFB5X0ZMT0FUT0JKRUNUX0gKKyNkZWZpbmUgUHlfRkxPQVRPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIGRvdWJsZSBvYl9mdmFsOworfSBQeUZsb2F0T2JqZWN0OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlGbG9hdF9UeXBlOworCisjZGVmaW5lIFB5RmxvYXRfQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgJlB5RmxvYXRfVHlwZSkKKyNkZWZpbmUgUHlGbG9hdF9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5RmxvYXRfVHlwZSkKKworLyogVGhlIHN0cigpIHByZWNpc2lvbiBQeUZsb2F0X1NUUl9QUkVDSVNJT04gaXMgY2hvc2VuIHNvIHRoYXQgaW4gbW9zdCBjYXNlcywKKyAgIHRoZSByb3VuZGluZyBub2lzZSBjcmVhdGVkIGJ5IHZhcmlvdXMgb3BlcmF0aW9ucyBpcyBzdXBwcmVzc2VkLCB3aGlsZQorICAgZ2l2aW5nIHBsZW50eSBvZiBwcmVjaXNpb24gZm9yIHByYWN0aWNhbCB1c2UuICovCisKKyNkZWZpbmUgUHlGbG9hdF9TVFJfUFJFQ0lTSU9OIDEyCisKKyNpZmRlZiBQeV9OQU4KKyNkZWZpbmUgUHlfUkVUVVJOX05BTiByZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKFB5X05BTikKKyNlbmRpZgorCisjZGVmaW5lIFB5X1JFVFVSTl9JTkYoc2lnbikgZG8JCQkJCVwKKwlpZiAoY29weXNpZ24oMS4sIHNpZ24pID09IDEuKSB7CQkJCVwKKwkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZShQeV9IVUdFX1ZBTCk7CVwKKwl9IGVsc2UgewkJCQkJCVwKKwkJcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSgtUHlfSFVHRV9WQUwpOwlcCisJfSB3aGlsZSgwKQorCitQeUFQSV9GVU5DKGRvdWJsZSkgUHlGbG9hdF9HZXRNYXgodm9pZCk7CitQeUFQSV9GVU5DKGRvdWJsZSkgUHlGbG9hdF9HZXRNaW4odm9pZCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RmxvYXRfR2V0SW5mbyh2b2lkKTsKKworLyogUmV0dXJuIFB5dGhvbiBmbG9hdCBmcm9tIHN0cmluZyBQeU9iamVjdC4gIFNlY29uZCBhcmd1bWVudCBpZ25vcmVkIG9uCisgICBpbnB1dCwgYW5kLCBpZiBub24tTlVMTCwgTlVMTCBpcyBzdG9yZWQgaW50byAqanVuayAodGhpcyB0cmllZCB0byBzZXJ2ZSBhCisgICBwdXJwb3NlIG9uY2UgYnV0IGNhbid0IGJlIG1hZGUgdG8gd29yayBhcyBpbnRlbmRlZCkuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RmxvYXRfRnJvbVN0cmluZyhQeU9iamVjdCosIGNoYXIqKiBqdW5rKTsKKworLyogUmV0dXJuIFB5dGhvbiBmbG9hdCBmcm9tIEMgZG91YmxlLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZsb2F0X0Zyb21Eb3VibGUoZG91YmxlKTsKKworLyogRXh0cmFjdCBDIGRvdWJsZSBmcm9tIFB5dGhvbiBmbG9hdC4gIFRoZSBtYWNybyB2ZXJzaW9uIHRyYWRlcyBzYWZldHkgZm9yCisgICBzcGVlZC4gKi8KK1B5QVBJX0ZVTkMoZG91YmxlKSBQeUZsb2F0X0FzRG91YmxlKFB5T2JqZWN0ICopOworI2RlZmluZSBQeUZsb2F0X0FTX0RPVUJMRShvcCkgKCgoUHlGbG9hdE9iamVjdCAqKShvcCkpLT5vYl9mdmFsKQorCisvKiBXcml0ZSByZXByKHYpIGludG8gdGhlIGNoYXIgYnVmZmVyIGFyZ3VtZW50LCBmb2xsb3dlZCBieSBudWxsIGJ5dGUuICBUaGUKKyAgIGJ1ZmZlciBtdXN0IGJlICJiaWcgZW5vdWdoIjsgPj0gMTAwIGlzIHZlcnkgc2FmZS4KKyAgIFB5RmxvYXRfQXNSZXByU3RyaW5nKGJ1ZiwgeCkgc3RyaXZlcyB0byBwcmludCBlbm91Z2ggZGlnaXRzIHNvIHRoYXQKKyAgIFB5RmxvYXRfRnJvbVN0cmluZyhidWYpIHRoZW4gcmVwcm9kdWNlcyB4IGV4YWN0bHkuICovCitQeUFQSV9GVU5DKHZvaWQpIFB5RmxvYXRfQXNSZXByU3RyaW5nKGNoYXIqLCBQeUZsb2F0T2JqZWN0ICp2KTsKKworLyogV3JpdGUgc3RyKHYpIGludG8gdGhlIGNoYXIgYnVmZmVyIGFyZ3VtZW50LCBmb2xsb3dlZCBieSBudWxsIGJ5dGUuICBUaGUKKyAgIGJ1ZmZlciBtdXN0IGJlICJiaWcgZW5vdWdoIjsgPj0gMTAwIGlzIHZlcnkgc2FmZS4gIE5vdGUgdGhhdCBpdCdzCisgICB1bnVzdWFsIHRvIGJlIGFibGUgdG8gZ2V0IGJhY2sgdGhlIGZsb2F0IHlvdSBzdGFydGVkIHdpdGggZnJvbQorICAgUHlGbG9hdF9Bc1N0cmluZydzIHJlc3VsdCAtLSB1c2UgUHlGbG9hdF9Bc1JlcHJTdHJpbmcoKSBpZiB5b3Ugd2FudCB0bworICAgcHJlc2VydmUgcHJlY2lzaW9uIGFjcm9zcyBjb252ZXJzaW9ucy4gKi8KK1B5QVBJX0ZVTkModm9pZCkgUHlGbG9hdF9Bc1N0cmluZyhjaGFyKiwgUHlGbG9hdE9iamVjdCAqdik7CisKKy8qIF9QeUZsb2F0X3tQYWNrLFVucGFja317NCw4fQorICoKKyAqIFRoZSBzdHJ1Y3QgYW5kIHBpY2tsZSAoYXQgbGVhc3QpIG1vZHVsZXMgbmVlZCBhbiBlZmZpY2llbnQgcGxhdGZvcm0tCisgKiBpbmRlcGVuZGVudCB3YXkgdG8gc3RvcmUgZmxvYXRpbmctcG9pbnQgdmFsdWVzIGFzIGJ5dGUgc3RyaW5ncy4KKyAqIFRoZSBQYWNrIHJvdXRpbmVzIHByb2R1Y2UgYSBzdHJpbmcgZnJvbSBhIEMgZG91YmxlLCBhbmQgdGhlIFVucGFjaworICogcm91dGluZXMgcHJvZHVjZSBhIEMgZG91YmxlIGZyb20gc3VjaCBhIHN0cmluZy4gIFRoZSBzdWZmaXggKDQgb3IgOCkKKyAqIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJpbmcuCisgKgorICogT24gcGxhdGZvcm1zIHRoYXQgYXBwZWFyIHRvIHVzZSAoc2VlIF9QeUZsb2F0X0luaXQoKSkgSUVFRS03NTQgZm9ybWF0cworICogdGhlc2UgZnVuY3Rpb25zIHdvcmsgYnkgY29weWluZyBiaXRzLiAgT24gb3RoZXIgcGxhdGZvcm1zLCB0aGUgZm9ybWF0cyB0aGUKKyAqIDQtIGJ5dGUgZm9ybWF0IGlzIGlkZW50aWNhbCB0byB0aGUgSUVFRS03NTQgc2luZ2xlIHByZWNpc2lvbiBmb3JtYXQsIGFuZAorICogdGhlIDgtYnl0ZSBmb3JtYXQgdG8gdGhlIElFRUUtNzU0IGRvdWJsZSBwcmVjaXNpb24gZm9ybWF0LCBhbHRob3VnaCB0aGUKKyAqIHBhY2tpbmcgb2YgSU5GcyBhbmQgTmFOcyAoaWYgc3VjaCB0aGluZ3MgZXhpc3Qgb24gdGhlIHBsYXRmb3JtKSBpc24ndAorICogaGFuZGxlZCBjb3JyZWN0bHksIGFuZCBhdHRlbXB0aW5nIHRvIHVucGFjayBhIHN0cmluZyBjb250YWluaW5nIGFuIElFRUUKKyAqIElORiBvciBOYU4gd2lsbCByYWlzZSBhbiBleGNlcHRpb24uCisgKgorICogT24gbm9uLUlFRUUgcGxhdGZvcm1zIHdpdGggbW9yZSBwcmVjaXNpb24sIG9yIGxhcmdlciBkeW5hbWljIHJhbmdlLCB0aGFuCisgKiA3NTQgc3VwcG9ydHMsIG5vdCBhbGwgdmFsdWVzIGNhbiBiZSBwYWNrZWQ7IG9uIG5vbi1JRUVFIHBsYXRmb3JtcyB3aXRoIGxlc3MKKyAqIHByZWNpc2lvbiwgb3Igc21hbGxlciBkeW5hbWljIHJhbmdlLCBub3QgYWxsIHZhbHVlcyBjYW4gYmUgdW5wYWNrZWQuICBXaGF0CisgKiBoYXBwZW5zIGluIHN1Y2ggY2FzZXMgaXMgcGFydGx5IGFjY2lkZW50YWwgKGFsYXMpLgorICovCisKKy8qIFRoZSBwYWNrIHJvdXRpbmVzIHdyaXRlIDQgb3IgOCBieXRlcywgc3RhcnRpbmcgYXQgcC4gIGxlIGlzIGEgYm9vbAorICogYXJndW1lbnQsIHRydWUgaWYgeW91IHdhbnQgdGhlIHN0cmluZyBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdCAoZXhwb25lbnQKKyAqIGxhc3QsIGF0IHArMyBvciBwKzcpLCBmYWxzZSBpZiB5b3Ugd2FudCBiaWctZW5kaWFuIGZvcm1hdCAoZXhwb25lbnQKKyAqIGZpcnN0LCBhdCBwKS4KKyAqIFJldHVybiB2YWx1ZTogIDAgaWYgYWxsIGlzIE9LLCAtMSBpZiBlcnJvciAoYW5kIGFuIGV4Y2VwdGlvbiBpcworICogc2V0LCBtb3N0IGxpa2VseSBPdmVyZmxvd0Vycm9yKS4KKyAqIFRoZXJlIGFyZSB0d28gcHJvYmxlbXMgb24gbm9uLUlFRUUgcGxhdGZvcm1zOgorICogMSk6ICBXaGF0IHRoaXMgZG9lcyBpcyB1bmRlZmluZWQgaWYgeCBpcyBhIE5hTiBvciBpbmZpbml0eS4KKyAqIDIpOiAgLTAuMCBhbmQgKzAuMCBwcm9kdWNlIHRoZSBzYW1lIHN0cmluZy4KKyAqLworUHlBUElfRlVOQyhpbnQpIF9QeUZsb2F0X1BhY2s0KGRvdWJsZSB4LCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpOworUHlBUElfRlVOQyhpbnQpIF9QeUZsb2F0X1BhY2s4KGRvdWJsZSB4LCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpOworCisvKiBVc2VkIHRvIGdldCB0aGUgaW1wb3J0YW50IGRlY2ltYWwgZGlnaXRzIG9mIGEgZG91YmxlICovCitQeUFQSV9GVU5DKGludCkgX1B5RmxvYXRfRGlnaXRzKGNoYXIgKmJ1ZiwgZG91YmxlIHYsIGludCAqc2lnbnVtKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5RmxvYXRfRGlnaXRzSW5pdCh2b2lkKTsKKworLyogVGhlIHVucGFjayByb3V0aW5lcyByZWFkIDQgb3IgOCBieXRlcywgc3RhcnRpbmcgYXQgcC4gIGxlIGlzIGEgYm9vbAorICogYXJndW1lbnQsIHRydWUgaWYgdGhlIHN0cmluZyBpcyBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdCAoZXhwb25lbnQKKyAqIGxhc3QsIGF0IHArMyBvciBwKzcpLCBmYWxzZSBpZiBiaWctZW5kaWFuIChleHBvbmVudCBmaXJzdCwgYXQgcCkuCisgKiBSZXR1cm4gdmFsdWU6ICBUaGUgdW5wYWNrZWQgZG91YmxlLiAgT24gZXJyb3IsIHRoaXMgaXMgLTEuMCBhbmQKKyAqIFB5RXJyX09jY3VycmVkKCkgaXMgdHJ1ZSAoYW5kIGFuIGV4Y2VwdGlvbiBpcyBzZXQsIG1vc3QgbGlrZWx5CisgKiBPdmVyZmxvd0Vycm9yKS4gIE5vdGUgdGhhdCBvbiBhIG5vbi1JRUVFIHBsYXRmb3JtIHRoaXMgd2lsbCByZWZ1c2UKKyAqIHRvIHVucGFjayBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYSBOYU4gb3IgaW5maW5pdHkuCisgKi8KK1B5QVBJX0ZVTkMoZG91YmxlKSBfUHlGbG9hdF9VbnBhY2s0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSk7CitQeUFQSV9GVU5DKGRvdWJsZSkgX1B5RmxvYXRfVW5wYWNrOChjb25zdCB1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGUpOworCisvKiBmcmVlIGxpc3QgYXBpICovCitQeUFQSV9GVU5DKGludCkgUHlGbG9hdF9DbGVhckZyZWVMaXN0KHZvaWQpOworCisvKiBGb3JtYXQgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUgZm9ybWF0X3NwZWMsIGFzIGRlZmluZWQgaW4gUEVQIDMxMDEKKyAgIChBZHZhbmNlZCBTdHJpbmcgRm9ybWF0dGluZykuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUZsb2F0X0Zvcm1hdEFkdmFuY2VkKFB5T2JqZWN0ICpvYmosCisJCQkJCSAgICAgICBjaGFyICpmb3JtYXRfc3BlYywKKwkJCQkJICAgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKTsKKworLyogUm91bmQgYSBDIGRvdWJsZSB4IHRvIHRoZSBjbG9zZXN0IG11bHRpcGxlIG9mIDEwKiotbmRpZ2l0cy4gIFJldHVybnMgYQorICAgUHl0aG9uIGZsb2F0IG9uIHN1Y2Nlc3MsIG9yIE5VTEwgKHdpdGggYW4gYXBwcm9wcmlhdGUgZXhjZXB0aW9uIHNldCkgb24KKyAgIGZhaWx1cmUuICBVc2VkIGluIGJ1aWx0aW5fcm91bmQgaW4gYmx0aW5tb2R1bGUuYy4gKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5X2RvdWJsZV9yb3VuZChkb3VibGUgeCwgaW50IG5kaWdpdHMpOworCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfRkxPQVRPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvZnJhbWVvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2ZyYW1lb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlNzY3OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2ZyYW1lb2JqZWN0LmgKQEAgLTAsMCArMSw4OSBAQAorCisvKiBGcmFtZSBvYmplY3QgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfRlJBTUVPQkpFQ1RfSAorI2RlZmluZSBQeV9GUkFNRU9CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgYl90eXBlOwkJCS8qIHdoYXQga2luZCBvZiBibG9jayB0aGlzIGlzICovCisgICAgaW50IGJfaGFuZGxlcjsJCS8qIHdoZXJlIHRvIGp1bXAgdG8gZmluZCBoYW5kbGVyICovCisgICAgaW50IGJfbGV2ZWw7CQkvKiB2YWx1ZSBzdGFjayBsZXZlbCB0byBwb3AgdG8gKi8KK30gUHlUcnlCbG9jazsKKwordHlwZWRlZiBzdHJ1Y3QgX2ZyYW1lIHsKKyAgICBQeU9iamVjdF9WQVJfSEVBRAorICAgIHN0cnVjdCBfZnJhbWUgKmZfYmFjazsJLyogcHJldmlvdXMgZnJhbWUsIG9yIE5VTEwgKi8KKyAgICBQeUNvZGVPYmplY3QgKmZfY29kZTsJLyogY29kZSBzZWdtZW50ICovCisgICAgUHlPYmplY3QgKmZfYnVpbHRpbnM7CS8qIGJ1aWx0aW4gc3ltYm9sIHRhYmxlIChQeURpY3RPYmplY3QpICovCisgICAgUHlPYmplY3QgKmZfZ2xvYmFsczsJLyogZ2xvYmFsIHN5bWJvbCB0YWJsZSAoUHlEaWN0T2JqZWN0KSAqLworICAgIFB5T2JqZWN0ICpmX2xvY2FsczsJCS8qIGxvY2FsIHN5bWJvbCB0YWJsZSAoYW55IG1hcHBpbmcpICovCisgICAgUHlPYmplY3QgKipmX3ZhbHVlc3RhY2s7CS8qIHBvaW50cyBhZnRlciB0aGUgbGFzdCBsb2NhbCAqLworICAgIC8qIE5leHQgZnJlZSBzbG90IGluIGZfdmFsdWVzdGFjay4gIEZyYW1lIGNyZWF0aW9uIHNldHMgdG8gZl92YWx1ZXN0YWNrLgorICAgICAgIEZyYW1lIGV2YWx1YXRpb24gdXN1YWxseSBOVUxMcyBpdCwgYnV0IGEgZnJhbWUgdGhhdCB5aWVsZHMgc2V0cyBpdAorICAgICAgIHRvIHRoZSBjdXJyZW50IHN0YWNrIHRvcC4gKi8KKyAgICBQeU9iamVjdCAqKmZfc3RhY2t0b3A7CisgICAgUHlPYmplY3QgKmZfdHJhY2U7CQkvKiBUcmFjZSBmdW5jdGlvbiAqLworCisgICAgLyogSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbiB0aGlzIGZyYW1lLCB0aGUgbmV4dCB0aHJlZSBhcmUgdXNlZCB0bworICAgICAqIHJlY29yZCB0aGUgZXhjZXB0aW9uIGluZm8gKGlmIGFueSkgb3JpZ2luYWxseSBpbiB0aGUgdGhyZWFkIHN0YXRlLiAgU2VlCisgICAgICogY29tbWVudHMgYmVmb3JlIHNldF9leGNfaW5mbygpIC0tIGl0J3Mgbm90IG9idmlvdXMuCisgICAgICogSW52YXJpYW50OiAgaWYgX3R5cGUgaXMgTlVMTCwgdGhlbiBzbyBhcmUgX3ZhbHVlIGFuZCBfdHJhY2ViYWNrLgorICAgICAqIERlc2lyZWQgaW52YXJpYW50OiAgYWxsIHRocmVlIGFyZSBOVUxMLCBvciBhbGwgdGhyZWUgYXJlIG5vbi1OVUxMLiAgVGhhdAorICAgICAqIG9uZSBpc24ndCBjdXJyZW50bHkgdHJ1ZSwgYnV0ICJzaG91bGQgYmUiLgorICAgICAqLworICAgIFB5T2JqZWN0ICpmX2V4Y190eXBlLCAqZl9leGNfdmFsdWUsICpmX2V4Y190cmFjZWJhY2s7CisKKyAgICBQeVRocmVhZFN0YXRlICpmX3RzdGF0ZTsKKyAgICBpbnQgZl9sYXN0aTsJCS8qIExhc3QgaW5zdHJ1Y3Rpb24gaWYgY2FsbGVkICovCisgICAgLyogQ2FsbCBQeUZyYW1lX0dldExpbmVOdW1iZXIoKSBpbnN0ZWFkIG9mIHJlYWRpbmcgdGhpcyBmaWVsZAorICAgICAgIGRpcmVjdGx5LiAgQXMgb2YgMi4zIGZfbGluZW5vIGlzIG9ubHkgdmFsaWQgd2hlbiB0cmFjaW5nIGlzCisgICAgICAgYWN0aXZlIChpLmUuIHdoZW4gZl90cmFjZSBpcyBzZXQpLiAgQXQgb3RoZXIgdGltZXMgd2UgdXNlCisgICAgICAgUHlDb2RlX0FkZHIyTGluZSB0byBjYWxjdWxhdGUgdGhlIGxpbmUgZnJvbSB0aGUgY3VycmVudAorICAgICAgIGJ5dGVjb2RlIGluZGV4LiAqLworICAgIGludCBmX2xpbmVubzsJCS8qIEN1cnJlbnQgbGluZSBudW1iZXIgKi8KKyAgICBpbnQgZl9pYmxvY2s7CQkvKiBpbmRleCBpbiBmX2Jsb2Nrc3RhY2sgKi8KKyAgICBQeVRyeUJsb2NrIGZfYmxvY2tzdGFja1tDT19NQVhCTE9DS1NdOyAvKiBmb3IgdHJ5IGFuZCBsb29wIGJsb2NrcyAqLworICAgIFB5T2JqZWN0ICpmX2xvY2Fsc3BsdXNbMV07CS8qIGxvY2FscytzdGFjaywgZHluYW1pY2FsbHkgc2l6ZWQgKi8KK30gUHlGcmFtZU9iamVjdDsKKworCisvKiBTdGFuZGFyZCBvYmplY3QgaW50ZXJmYWNlICovCisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUZyYW1lX1R5cGU7CisKKyNkZWZpbmUgUHlGcmFtZV9DaGVjayhvcCkgKChvcCktPm9iX3R5cGUgPT0gJlB5RnJhbWVfVHlwZSkKKyNkZWZpbmUgUHlGcmFtZV9Jc1Jlc3RyaWN0ZWQoZikgXAorCSgoZiktPmZfYnVpbHRpbnMgIT0gKGYpLT5mX3RzdGF0ZS0+aW50ZXJwLT5idWlsdGlucykKKworUHlBUElfRlVOQyhQeUZyYW1lT2JqZWN0ICopIFB5RnJhbWVfTmV3KFB5VGhyZWFkU3RhdGUgKiwgUHlDb2RlT2JqZWN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKworCisvKiBUaGUgcmVzdCBvZiB0aGUgaW50ZXJmYWNlIGlzIHNwZWNpZmljIGZvciBmcmFtZSBvYmplY3RzICovCisKKy8qIEJsb2NrIG1hbmFnZW1lbnQgZnVuY3Rpb25zICovCisKK1B5QVBJX0ZVTkModm9pZCkgUHlGcmFtZV9CbG9ja1NldHVwKFB5RnJhbWVPYmplY3QgKiwgaW50LCBpbnQsIGludCk7CitQeUFQSV9GVU5DKFB5VHJ5QmxvY2sgKikgUHlGcmFtZV9CbG9ja1BvcChQeUZyYW1lT2JqZWN0ICopOworCisvKiBFeHRlbmQgdGhlIHZhbHVlIHN0YWNrICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKiopIFB5RnJhbWVfRXh0ZW5kU3RhY2soUHlGcmFtZU9iamVjdCAqLCBpbnQsIGludCk7CisKKy8qIENvbnZlcnNpb25zIGJldHdlZW4gImZhc3QgbG9jYWxzIiBhbmQgbG9jYWxzIGluIGRpY3Rpb25hcnkgKi8KKworUHlBUElfRlVOQyh2b2lkKSBQeUZyYW1lX0xvY2Fsc1RvRmFzdChQeUZyYW1lT2JqZWN0ICosIGludCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5RnJhbWVfRmFzdFRvTG9jYWxzKFB5RnJhbWVPYmplY3QgKik7CisKK1B5QVBJX0ZVTkMoaW50KSBQeUZyYW1lX0NsZWFyRnJlZUxpc3Qodm9pZCk7CisKKy8qIFJldHVybiB0aGUgbGluZSBvZiBjb2RlIHRoZSBmcmFtZSBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLiAqLworUHlBUElfRlVOQyhpbnQpIFB5RnJhbWVfR2V0TGluZU51bWJlcihQeUZyYW1lT2JqZWN0ICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9GUkFNRU9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9mdW5jb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9mdW5jb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxOWY0YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2Z1bmNvYmplY3QuaApAQCAtMCwwICsxLDc2IEBACisKKy8qIEZ1bmN0aW9uIG9iamVjdCBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9GVU5DT0JKRUNUX0gKKyNkZWZpbmUgUHlfRlVOQ09CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEZ1bmN0aW9uIG9iamVjdHMgYW5kIGNvZGUgb2JqZWN0cyBzaG91bGQgbm90IGJlIGNvbmZ1c2VkIHdpdGggZWFjaCBvdGhlcjoKKyAqCisgKiBGdW5jdGlvbiBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IHRoZSBleGVjdXRpb24gb2YgdGhlICdkZWYnIHN0YXRlbWVudC4KKyAqIFRoZXkgcmVmZXJlbmNlIGEgY29kZSBvYmplY3QgaW4gdGhlaXIgZnVuY19jb2RlIGF0dHJpYnV0ZSwgd2hpY2ggaXMgYQorICogcHVyZWx5IHN5bnRhY3RpYyBvYmplY3QsIGkuZS4gbm90aGluZyBtb3JlIHRoYW4gYSBjb21waWxlZCB2ZXJzaW9uIG9mIHNvbWUKKyAqIHNvdXJjZSBjb2RlIGxpbmVzLiAgVGhlcmUgaXMgb25lIGNvZGUgb2JqZWN0IHBlciBzb3VyY2UgY29kZSAiZnJhZ21lbnQiLAorICogYnV0IGVhY2ggY29kZSBvYmplY3QgY2FuIGJlIHJlZmVyZW5jZWQgYnkgemVybyBvciBtYW55IGZ1bmN0aW9uIG9iamVjdHMKKyAqIGRlcGVuZGluZyBvbmx5IG9uIGhvdyBtYW55IHRpbWVzIHRoZSAnZGVmJyBzdGF0ZW1lbnQgaW4gdGhlIHNvdXJjZSB3YXMKKyAqIGV4ZWN1dGVkIHNvIGZhci4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpmdW5jX2NvZGU7CS8qIEEgY29kZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqZnVuY19nbG9iYWxzOwkvKiBBIGRpY3Rpb25hcnkgKG90aGVyIG1hcHBpbmdzIHdvbid0IGRvKSAqLworICAgIFB5T2JqZWN0ICpmdW5jX2RlZmF1bHRzOwkvKiBOVUxMIG9yIGEgdHVwbGUgKi8KKyAgICBQeU9iamVjdCAqZnVuY19jbG9zdXJlOwkvKiBOVUxMIG9yIGEgdHVwbGUgb2YgY2VsbCBvYmplY3RzICovCisgICAgUHlPYmplY3QgKmZ1bmNfZG9jOwkJLyogVGhlIF9fZG9jX18gYXR0cmlidXRlLCBjYW4gYmUgYW55dGhpbmcgKi8KKyAgICBQeU9iamVjdCAqZnVuY19uYW1lOwkvKiBUaGUgX19uYW1lX18gYXR0cmlidXRlLCBhIHN0cmluZyBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqZnVuY19kaWN0OwkvKiBUaGUgX19kaWN0X18gYXR0cmlidXRlLCBhIGRpY3Qgb3IgTlVMTCAqLworICAgIFB5T2JqZWN0ICpmdW5jX3dlYWtyZWZsaXN0OwkvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworICAgIFB5T2JqZWN0ICpmdW5jX21vZHVsZTsJLyogVGhlIF9fbW9kdWxlX18gYXR0cmlidXRlLCBjYW4gYmUgYW55dGhpbmcgKi8KKworICAgIC8qIEludmFyaWFudDoKKyAgICAgKiAgICAgZnVuY19jbG9zdXJlIGNvbnRhaW5zIHRoZSBiaW5kaW5ncyBmb3IgZnVuY19jb2RlLT5jb19mcmVldmFycywgc28KKyAgICAgKiAgICAgUHlUdXBsZV9TaXplKGZ1bmNfY2xvc3VyZSkgPT0gUHlDb2RlX0dldE51bUZyZWUoZnVuY19jb2RlKQorICAgICAqICAgICAoZnVuY19jbG9zdXJlIG1heSBiZSBOVUxMIGlmIFB5Q29kZV9HZXROdW1GcmVlKGZ1bmNfY29kZSkgPT0gMCkuCisgICAgICovCit9IFB5RnVuY3Rpb25PYmplY3Q7CisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUZ1bmN0aW9uX1R5cGU7CisKKyNkZWZpbmUgUHlGdW5jdGlvbl9DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeUZ1bmN0aW9uX1R5cGUpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGdW5jdGlvbl9OZXcoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RnVuY3Rpb25fR2V0Q29kZShQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGdW5jdGlvbl9HZXRHbG9iYWxzKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZ1bmN0aW9uX0dldE1vZHVsZShQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGdW5jdGlvbl9HZXREZWZhdWx0cyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUZ1bmN0aW9uX1NldERlZmF1bHRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZ1bmN0aW9uX0dldENsb3N1cmUoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlGdW5jdGlvbl9TZXRDbG9zdXJlKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCisvKiBNYWNyb3MgZm9yIGRpcmVjdCBhY2Nlc3MgdG8gdGhlc2UgdmFsdWVzLiBUeXBlIGNoZWNrcyBhcmUgKm5vdCoKKyAgIGRvbmUsIHNvIHVzZSB3aXRoIGNhcmUuICovCisjZGVmaW5lIFB5RnVuY3Rpb25fR0VUX0NPREUoZnVuYykgXAorICAgICAgICAoKChQeUZ1bmN0aW9uT2JqZWN0ICopZnVuYykgLT4gZnVuY19jb2RlKQorI2RlZmluZSBQeUZ1bmN0aW9uX0dFVF9HTE9CQUxTKGZ1bmMpIFwKKwkoKChQeUZ1bmN0aW9uT2JqZWN0ICopZnVuYykgLT4gZnVuY19nbG9iYWxzKQorI2RlZmluZSBQeUZ1bmN0aW9uX0dFVF9NT0RVTEUoZnVuYykgXAorCSgoKFB5RnVuY3Rpb25PYmplY3QgKilmdW5jKSAtPiBmdW5jX21vZHVsZSkKKyNkZWZpbmUgUHlGdW5jdGlvbl9HRVRfREVGQVVMVFMoZnVuYykgXAorCSgoKFB5RnVuY3Rpb25PYmplY3QgKilmdW5jKSAtPiBmdW5jX2RlZmF1bHRzKQorI2RlZmluZSBQeUZ1bmN0aW9uX0dFVF9DTE9TVVJFKGZ1bmMpIFwKKwkoKChQeUZ1bmN0aW9uT2JqZWN0ICopZnVuYykgLT4gZnVuY19jbG9zdXJlKQorCisvKiBUaGUgY2xhc3NtZXRob2QgYW5kIHN0YXRpY21ldGhvZCB0eXBlcyBsaXZlcyBoZXJlLCB0b28gKi8KK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUNsYXNzTWV0aG9kX1R5cGU7CitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTdGF0aWNNZXRob2RfVHlwZTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNsYXNzTWV0aG9kX05ldyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdGF0aWNNZXRob2RfTmV3KFB5T2JqZWN0ICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9GVU5DT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2dlbm9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvZ2Vub2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1NTYxYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2dlbm9iamVjdC5oCkBAIC0wLDAgKzEsNDAgQEAKKworLyogR2VuZXJhdG9yIG9iamVjdCBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9HRU5PQkpFQ1RfSAorI2RlZmluZSBQeV9HRU5PQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgX2ZyYW1lOyAvKiBBdm9pZCBpbmNsdWRpbmcgZnJhbWVvYmplY3QuaCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJUHlPYmplY3RfSEVBRAorCS8qIFRoZSBnaV8gcHJlZml4IGlzIGludGVuZGVkIHRvIHJlbWluZCBvZiBnZW5lcmF0b3ItaXRlcmF0b3IuICovCisKKwkvKiBOb3RlOiBnaV9mcmFtZSBjYW4gYmUgTlVMTCBpZiB0aGUgZ2VuZXJhdG9yIGlzICJmaW5pc2hlZCIgKi8KKwlzdHJ1Y3QgX2ZyYW1lICpnaV9mcmFtZTsKKworCS8qIFRydWUgaWYgZ2VuZXJhdG9yIGlzIGJlaW5nIGV4ZWN1dGVkLiAqLworCWludCBnaV9ydW5uaW5nOworICAgIAorCS8qIFRoZSBjb2RlIG9iamVjdCBiYWNraW5nIHRoZSBnZW5lcmF0b3IgKi8KKwlQeU9iamVjdCAqZ2lfY29kZTsKKworCS8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2UuICovCisJUHlPYmplY3QgKmdpX3dlYWtyZWZsaXN0OworfSBQeUdlbk9iamVjdDsKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5R2VuX1R5cGU7CisKKyNkZWZpbmUgUHlHZW5fQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgJlB5R2VuX1R5cGUpCisjZGVmaW5lIFB5R2VuX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlHZW5fVHlwZSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUdlbl9OZXcoc3RydWN0IF9mcmFtZSAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUdlbl9OZWVkc0ZpbmFsaXppbmcoUHlHZW5PYmplY3QgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0dFTk9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9ncmFtaW5pdC5oIGIvaW5jbHVkZS9weXRob24yLjcvZ3JhbWluaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGQ1MzFlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvZ3JhbWluaXQuaApAQCAtMCwwICsxLDg3IEBACisvKiBHZW5lcmF0ZWQgYnkgUGFyc2VyL3BnZW4gKi8KKworI2RlZmluZSBzaW5nbGVfaW5wdXQgMjU2CisjZGVmaW5lIGZpbGVfaW5wdXQgMjU3CisjZGVmaW5lIGV2YWxfaW5wdXQgMjU4CisjZGVmaW5lIGRlY29yYXRvciAyNTkKKyNkZWZpbmUgZGVjb3JhdG9ycyAyNjAKKyNkZWZpbmUgZGVjb3JhdGVkIDI2MQorI2RlZmluZSBmdW5jZGVmIDI2MgorI2RlZmluZSBwYXJhbWV0ZXJzIDI2MworI2RlZmluZSB2YXJhcmdzbGlzdCAyNjQKKyNkZWZpbmUgZnBkZWYgMjY1CisjZGVmaW5lIGZwbGlzdCAyNjYKKyNkZWZpbmUgc3RtdCAyNjcKKyNkZWZpbmUgc2ltcGxlX3N0bXQgMjY4CisjZGVmaW5lIHNtYWxsX3N0bXQgMjY5CisjZGVmaW5lIGV4cHJfc3RtdCAyNzAKKyNkZWZpbmUgYXVnYXNzaWduIDI3MQorI2RlZmluZSBwcmludF9zdG10IDI3MgorI2RlZmluZSBkZWxfc3RtdCAyNzMKKyNkZWZpbmUgcGFzc19zdG10IDI3NAorI2RlZmluZSBmbG93X3N0bXQgMjc1CisjZGVmaW5lIGJyZWFrX3N0bXQgMjc2CisjZGVmaW5lIGNvbnRpbnVlX3N0bXQgMjc3CisjZGVmaW5lIHJldHVybl9zdG10IDI3OAorI2RlZmluZSB5aWVsZF9zdG10IDI3OQorI2RlZmluZSByYWlzZV9zdG10IDI4MAorI2RlZmluZSBpbXBvcnRfc3RtdCAyODEKKyNkZWZpbmUgaW1wb3J0X25hbWUgMjgyCisjZGVmaW5lIGltcG9ydF9mcm9tIDI4MworI2RlZmluZSBpbXBvcnRfYXNfbmFtZSAyODQKKyNkZWZpbmUgZG90dGVkX2FzX25hbWUgMjg1CisjZGVmaW5lIGltcG9ydF9hc19uYW1lcyAyODYKKyNkZWZpbmUgZG90dGVkX2FzX25hbWVzIDI4NworI2RlZmluZSBkb3R0ZWRfbmFtZSAyODgKKyNkZWZpbmUgZ2xvYmFsX3N0bXQgMjg5CisjZGVmaW5lIGV4ZWNfc3RtdCAyOTAKKyNkZWZpbmUgYXNzZXJ0X3N0bXQgMjkxCisjZGVmaW5lIGNvbXBvdW5kX3N0bXQgMjkyCisjZGVmaW5lIGlmX3N0bXQgMjkzCisjZGVmaW5lIHdoaWxlX3N0bXQgMjk0CisjZGVmaW5lIGZvcl9zdG10IDI5NQorI2RlZmluZSB0cnlfc3RtdCAyOTYKKyNkZWZpbmUgd2l0aF9zdG10IDI5NworI2RlZmluZSB3aXRoX2l0ZW0gMjk4CisjZGVmaW5lIGV4Y2VwdF9jbGF1c2UgMjk5CisjZGVmaW5lIHN1aXRlIDMwMAorI2RlZmluZSB0ZXN0bGlzdF9zYWZlIDMwMQorI2RlZmluZSBvbGRfdGVzdCAzMDIKKyNkZWZpbmUgb2xkX2xhbWJkZWYgMzAzCisjZGVmaW5lIHRlc3QgMzA0CisjZGVmaW5lIG9yX3Rlc3QgMzA1CisjZGVmaW5lIGFuZF90ZXN0IDMwNgorI2RlZmluZSBub3RfdGVzdCAzMDcKKyNkZWZpbmUgY29tcGFyaXNvbiAzMDgKKyNkZWZpbmUgY29tcF9vcCAzMDkKKyNkZWZpbmUgZXhwciAzMTAKKyNkZWZpbmUgeG9yX2V4cHIgMzExCisjZGVmaW5lIGFuZF9leHByIDMxMgorI2RlZmluZSBzaGlmdF9leHByIDMxMworI2RlZmluZSBhcml0aF9leHByIDMxNAorI2RlZmluZSB0ZXJtIDMxNQorI2RlZmluZSBmYWN0b3IgMzE2CisjZGVmaW5lIHBvd2VyIDMxNworI2RlZmluZSBhdG9tIDMxOAorI2RlZmluZSBsaXN0bWFrZXIgMzE5CisjZGVmaW5lIHRlc3RsaXN0X2NvbXAgMzIwCisjZGVmaW5lIGxhbWJkZWYgMzIxCisjZGVmaW5lIHRyYWlsZXIgMzIyCisjZGVmaW5lIHN1YnNjcmlwdGxpc3QgMzIzCisjZGVmaW5lIHN1YnNjcmlwdCAzMjQKKyNkZWZpbmUgc2xpY2VvcCAzMjUKKyNkZWZpbmUgZXhwcmxpc3QgMzI2CisjZGVmaW5lIHRlc3RsaXN0IDMyNworI2RlZmluZSBkaWN0b3JzZXRtYWtlciAzMjgKKyNkZWZpbmUgY2xhc3NkZWYgMzI5CisjZGVmaW5lIGFyZ2xpc3QgMzMwCisjZGVmaW5lIGFyZ3VtZW50IDMzMQorI2RlZmluZSBsaXN0X2l0ZXIgMzMyCisjZGVmaW5lIGxpc3RfZm9yIDMzMworI2RlZmluZSBsaXN0X2lmIDMzNAorI2RlZmluZSBjb21wX2l0ZXIgMzM1CisjZGVmaW5lIGNvbXBfZm9yIDMzNgorI2RlZmluZSBjb21wX2lmIDMzNworI2RlZmluZSB0ZXN0bGlzdDEgMzM4CisjZGVmaW5lIGVuY29kaW5nX2RlY2wgMzM5CisjZGVmaW5lIHlpZWxkX2V4cHIgMzQwCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9ncmFtbWFyLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9ncmFtbWFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyNmRhMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2dyYW1tYXIuaApAQCAtMCwwICsxLDkzIEBACisKKy8qIEdyYW1tYXIgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfR1JBTU1BUl9ICisjZGVmaW5lIFB5X0dSQU1NQVJfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSAiYml0c2V0LmgiIC8qIFNpZ2guLi4gKi8KKworLyogQSBsYWJlbCBvZiBhbiBhcmMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludAkJIGxiX3R5cGU7CisgICAgY2hhcgkqbGJfc3RyOworfSBsYWJlbDsKKworI2RlZmluZSBFTVBUWSAwCQkvKiBMYWJlbCBudW1iZXIgMCBpcyBieSBkZWZpbml0aW9uIHRoZSBlbXB0eSBsYWJlbCAqLworCisvKiBBIGxpc3Qgb2YgbGFiZWxzICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQJCSBsbF9ubGFiZWxzOworICAgIGxhYmVsCSpsbF9sYWJlbDsKK30gbGFiZWxsaXN0OworCisvKiBBbiBhcmMgZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlciAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2hvcnQJYV9sYmw7CQkvKiBMYWJlbCBvZiB0aGlzIGFyYyAqLworICAgIHNob3J0CWFfYXJyb3c7CS8qIFN0YXRlIHdoZXJlIHRoaXMgYXJjIGdvZXMgdG8gKi8KK30gYXJjOworCisvKiBBIHN0YXRlIGluIGEgREZBICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQJCSBzX25hcmNzOworICAgIGFyYwkJKnNfYXJjOwkJLyogQXJyYXkgb2YgYXJjcyAqLworCQorICAgIC8qIE9wdGlvbmFsIGFjY2VsZXJhdG9ycyAqLworICAgIGludAkJIHNfbG93ZXI7CS8qIExvd2VzdCBsYWJlbCBpbmRleCAqLworICAgIGludAkJIHNfdXBwZXI7CS8qIEhpZ2hlc3QgbGFiZWwgaW5kZXggKi8KKyAgICBpbnQJCSpzX2FjY2VsOwkvKiBBY2NlbGVyYXRvciAqLworICAgIGludAkJIHNfYWNjZXB0OwkvKiBOb256ZXJvIGZvciBhY2NlcHRpbmcgc3RhdGUgKi8KK30gc3RhdGU7CisKKy8qIEEgREZBICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQJCSBkX3R5cGU7CS8qIE5vbi10ZXJtaW5hbCB0aGlzIHJlcHJlc2VudHMgKi8KKyAgICBjaGFyCSpkX25hbWU7CS8qIEZvciBwcmludGluZyAqLworICAgIGludAkJIGRfaW5pdGlhbDsJLyogSW5pdGlhbCBzdGF0ZSAqLworICAgIGludAkJIGRfbnN0YXRlczsKKyAgICBzdGF0ZQkqZF9zdGF0ZTsJLyogQXJyYXkgb2Ygc3RhdGVzICovCisgICAgYml0c2V0CSBkX2ZpcnN0OworfSBkZmE7CisKKy8qIEEgZ3JhbW1hciAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50CQkgZ19uZGZhczsKKyAgICBkZmEJCSpnX2RmYTsJCS8qIEFycmF5IG9mIERGQXMgKi8KKyAgICBsYWJlbGxpc3QJIGdfbGw7CisgICAgaW50CQkgZ19zdGFydDsJLyogU3RhcnQgc3ltYm9sIG9mIHRoZSBncmFtbWFyICovCisgICAgaW50CQkgZ19hY2NlbDsJLyogU2V0IGlmIGFjY2VsZXJhdG9ycyBwcmVzZW50ICovCit9IGdyYW1tYXI7CisKKy8qIEZVTkNUSU9OUyAqLworCitncmFtbWFyICpuZXdncmFtbWFyKGludCBzdGFydCk7CitkZmEgKmFkZGRmYShncmFtbWFyICpnLCBpbnQgdHlwZSwgY2hhciAqbmFtZSk7CitpbnQgYWRkc3RhdGUoZGZhICpkKTsKK3ZvaWQgYWRkYXJjKGRmYSAqZCwgaW50IGZyb20sIGludCB0bywgaW50IGxibCk7CitkZmEgKlB5R3JhbW1hcl9GaW5kREZBKGdyYW1tYXIgKmcsIGludCB0eXBlKTsKKworaW50IGFkZGxhYmVsKGxhYmVsbGlzdCAqbGwsIGludCB0eXBlLCBjaGFyICpzdHIpOworaW50IGZpbmRsYWJlbChsYWJlbGxpc3QgKmxsLCBpbnQgdHlwZSwgY2hhciAqc3RyKTsKK2NoYXIgKlB5R3JhbW1hcl9MYWJlbFJlcHIobGFiZWwgKmxiKTsKK3ZvaWQgdHJhbnNsYXRlbGFiZWxzKGdyYW1tYXIgKmcpOworCit2b2lkIGFkZGZpcnN0c2V0cyhncmFtbWFyICpnKTsKKwordm9pZCBQeUdyYW1tYXJfQWRkQWNjZWxlcmF0b3JzKGdyYW1tYXIgKmcpOwordm9pZCBQeUdyYW1tYXJfUmVtb3ZlQWNjZWxlcmF0b3JzKGdyYW1tYXIgKik7CisKK3ZvaWQgcHJpbnRncmFtbWFyKGdyYW1tYXIgKmcsIEZJTEUgKmZwKTsKK3ZvaWQgcHJpbnRub250ZXJtaW5hbHMoZ3JhbW1hciAqZywgRklMRSAqZnApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9HUkFNTUFSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2ltcG9ydC5oIGIvaW5jbHVkZS9weXRob24yLjcvaW1wb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3ZmUwYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2ltcG9ydC5oCkBAIC0wLDAgKzEsNzEgQEAKKworLyogTW9kdWxlIGRlZmluaXRpb24gYW5kIGltcG9ydCBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9JTVBPUlRfSAorI2RlZmluZSBQeV9JTVBPUlRfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9GVU5DKGxvbmcpIFB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyKHZvaWQpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZShjaGFyICpuYW1lLCBQeU9iamVjdCAqY28pOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4KAorCWNoYXIgKm5hbWUsIFB5T2JqZWN0ICpjbywgY2hhciAqcGF0aG5hbWUpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUltcG9ydF9HZXRNb2R1bGVEaWN0KHZvaWQpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUltcG9ydF9BZGRNb2R1bGUoY29uc3QgY2hhciAqbmFtZSk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5SW1wb3J0X0ltcG9ydE1vZHVsZShjb25zdCBjaGFyICpuYW1lKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlJbXBvcnRfSW1wb3J0TW9kdWxlTm9CbG9jayhjb25zdCBjaGFyICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbChjaGFyICpuYW1lLAorCVB5T2JqZWN0ICpnbG9iYWxzLCBQeU9iamVjdCAqbG9jYWxzLCBQeU9iamVjdCAqZnJvbWxpc3QsIGludCBsZXZlbCk7CisKKyNkZWZpbmUgUHlJbXBvcnRfSW1wb3J0TW9kdWxlRXgobiwgZywgbCwgZikgXAorCVB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsKG4sIGcsIGwsIGYsIC0xKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5SW1wb3J0X0dldEltcG9ydGVyKFB5T2JqZWN0ICpwYXRoKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlJbXBvcnRfSW1wb3J0KFB5T2JqZWN0ICpuYW1lKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlJbXBvcnRfUmVsb2FkTW9kdWxlKFB5T2JqZWN0ICptKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlJbXBvcnRfQ2xlYW51cCh2b2lkKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUltcG9ydF9JbXBvcnRGcm96ZW5Nb2R1bGUoY2hhciAqKTsKKworI2lmZGVmIFdJVEhfVEhSRUFECitQeUFQSV9GVU5DKHZvaWQpIF9QeUltcG9ydF9BY3F1aXJlTG9jayh2b2lkKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlJbXBvcnRfUmVsZWFzZUxvY2sodm9pZCk7CisjZWxzZQorI2RlZmluZSBfUHlJbXBvcnRfQWNxdWlyZUxvY2soKQorI2RlZmluZSBfUHlJbXBvcnRfUmVsZWFzZUxvY2soKSAxCisjZW5kaWYKKworUHlBUElfRlVOQyhzdHJ1Y3QgZmlsZWRlc2NyICopIF9QeUltcG9ydF9GaW5kTW9kdWxlKAorCWNvbnN0IGNoYXIgKiwgUHlPYmplY3QgKiwgY2hhciAqLCBzaXplX3QsIEZJTEUgKiosIFB5T2JqZWN0ICoqKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlJbXBvcnRfSXNTY3JpcHQoc3RydWN0IGZpbGVkZXNjciAqKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5SW1wb3J0X1JlSW5pdExvY2sodm9pZCk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKilfUHlJbXBvcnRfRmluZEV4dGVuc2lvbihjaGFyICosIGNoYXIgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopX1B5SW1wb3J0X0ZpeHVwRXh0ZW5zaW9uKGNoYXIgKiwgY2hhciAqKTsKKworc3RydWN0IF9pbml0dGFiIHsKKyAgICBjaGFyICpuYW1lOworICAgIHZvaWQgKCppbml0ZnVuYykodm9pZCk7Cit9OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlOdWxsSW1wb3J0ZXJfVHlwZTsKK1B5QVBJX0RBVEEoc3RydWN0IF9pbml0dGFiICopIFB5SW1wb3J0X0luaXR0YWI7CisKK1B5QVBJX0ZVTkMoaW50KSBQeUltcG9ydF9BcHBlbmRJbml0dGFiKGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKCppbml0ZnVuYykodm9pZCkpOworUHlBUElfRlVOQyhpbnQpIFB5SW1wb3J0X0V4dGVuZEluaXR0YWIoc3RydWN0IF9pbml0dGFiICpuZXd0YWIpOworCitzdHJ1Y3QgX2Zyb3plbiB7CisgICAgY2hhciAqbmFtZTsKKyAgICB1bnNpZ25lZCBjaGFyICpjb2RlOworICAgIGludCBzaXplOworfTsKKworLyogRW1iZWRkaW5nIGFwcHMgbWF5IGNoYW5nZSB0aGlzIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlaXIgZmF2b3JpdGUKKyAgIGNvbGxlY3Rpb24gb2YgZnJvemVuIG1vZHVsZXM6ICovCisKK1B5QVBJX0RBVEEoc3RydWN0IF9mcm96ZW4gKikgUHlJbXBvcnRfRnJvemVuTW9kdWxlczsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfSU1QT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2ludG9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvaW50b2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyZWVhOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2ludG9iamVjdC5oCkBAIC0wLDAgKzEsODEgQEAKKworLyogSW50ZWdlciBvYmplY3QgaW50ZXJmYWNlICovCisKKy8qCitQeUludE9iamVjdCByZXByZXNlbnRzIGEgKGxvbmcpIGludGVnZXIuICBUaGlzIGlzIGFuIGltbXV0YWJsZSBvYmplY3Q7CithbiBpbnRlZ2VyIGNhbm5vdCBjaGFuZ2UgaXRzIHZhbHVlIGFmdGVyIGNyZWF0aW9uLgorCitUaGVyZSBhcmUgZnVuY3Rpb25zIHRvIGNyZWF0ZSBuZXcgaW50ZWdlciBvYmplY3RzLCB0byB0ZXN0IGFuIG9iamVjdAorZm9yIGludGVnZXItbmVzcywgYW5kIHRvIGdldCB0aGUgaW50ZWdlciB2YWx1ZS4gIFRoZSBsYXR0ZXIgZnVuY3Rpb25zCityZXR1cm5zIC0xIGFuZCBzZXRzIGVycm5vIHRvIEVCQURGIGlmIHRoZSBvYmplY3QgaXMgbm90IGFuIFB5SW50T2JqZWN0LgorTm9uZSBvZiB0aGUgZnVuY3Rpb25zIHNob3VsZCBiZSBhcHBsaWVkIHRvIG5pbCBvYmplY3RzLgorCitUaGUgdHlwZSBQeUludE9iamVjdCBpcyAodW5mb3J0dW5hdGVseSkgZXhwb3NlZCBoZXJlIHNvIHdlIGNhbiBkZWNsYXJlCitfUHlfVHJ1ZVN0cnVjdCBhbmQgX1B5X1plcm9TdHJ1Y3QgaW4gYm9vbG9iamVjdC5oOyBkb24ndCB1c2UgdGhpcy4KKyovCisKKyNpZm5kZWYgUHlfSU5UT0JKRUNUX0gKKyNkZWZpbmUgUHlfSU5UT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBsb25nIG9iX2l2YWw7Cit9IFB5SW50T2JqZWN0OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlJbnRfVHlwZTsKKworI2RlZmluZSBQeUludF9DaGVjayhvcCkgXAorCQkgUHlUeXBlX0Zhc3RTdWJjbGFzcygob3ApLT5vYl90eXBlLCBQeV9UUEZMQUdTX0lOVF9TVUJDTEFTUykKKyNkZWZpbmUgUHlJbnRfQ2hlY2tFeGFjdChvcCkgKChvcCktPm9iX3R5cGUgPT0gJlB5SW50X1R5cGUpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlJbnRfRnJvbVN0cmluZyhjaGFyKiwgY2hhcioqLCBpbnQpOworI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlJbnRfRnJvbVVuaWNvZGUoUHlfVU5JQ09ERSosIFB5X3NzaXplX3QsIGludCk7CisjZW5kaWYKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlJbnRfRnJvbUxvbmcobG9uZyk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5SW50X0Zyb21TaXplX3Qoc2l6ZV90KTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlJbnRfRnJvbVNzaXplX3QoUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKGxvbmcpIFB5SW50X0FzTG9uZyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlJbnRfQXNTc2l6ZV90KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIF9QeUludF9Bc0ludChQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkModW5zaWduZWQgbG9uZykgUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKFB5T2JqZWN0ICopOworI2lmZGVmIEhBVkVfTE9OR19MT05HCitQeUFQSV9GVU5DKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykgUHlJbnRfQXNVbnNpZ25lZExvbmdMb25nTWFzayhQeU9iamVjdCAqKTsKKyNlbmRpZgorCitQeUFQSV9GVU5DKGxvbmcpIFB5SW50X0dldE1heCh2b2lkKTsKKworLyogTWFjcm8sIHRyYWRpbmcgc2FmZXR5IGZvciBzcGVlZCAqLworI2RlZmluZSBQeUludF9BU19MT05HKG9wKSAoKChQeUludE9iamVjdCAqKShvcCkpLT5vYl9pdmFsKQorCisvKiBUaGVzZSBhcmVuJ3QgcmVhbGx5IHBhcnQgb2YgdGhlIEludCBvYmplY3QsIGJ1dCB0aGV5J3JlIGhhbmR5OyB0aGUgcHJvdG9zCisgKiBhcmUgbmVjZXNzYXJ5IGZvciBzeXN0ZW1zIHRoYXQgbmVlZCB0aGUgbWFnaWMgb2YgUHlBUElfRlVOQyBhbmQgdGhhdCB3YW50CisgKiB0byBoYXZlIHN0cm9wbW9kdWxlIGFzIGEgZHluYW1pY2FsbHkgbG9hZGVkIG1vZHVsZSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGl0CisgKiBpbnRvIHRoZSBtYWluIFB5dGhvbiBzaGFyZWQgbGlicmFyeS9ETEwuICBHdWlkbyB0aGlua3MgSSdtIHdlaXJkIGZvcgorICogYnVpbGRpbmcgaXQgdGhpcyB3YXkuICA6LSkgIFtjamhdCisgKi8KK1B5QVBJX0ZVTkModW5zaWduZWQgbG9uZykgUHlPU19zdHJ0b3VsKGNoYXIgKiwgY2hhciAqKiwgaW50KTsKK1B5QVBJX0ZVTkMobG9uZykgUHlPU19zdHJ0b2woY2hhciAqLCBjaGFyICoqLCBpbnQpOworCisvKiBmcmVlIGxpc3QgYXBpICovCitQeUFQSV9GVU5DKGludCkgUHlJbnRfQ2xlYXJGcmVlTGlzdCh2b2lkKTsKKworLyogQ29udmVydCBhbiBpbnRlZ2VyIHRvIHRoZSBnaXZlbiBiYXNlLiAgUmV0dXJucyBhIHN0cmluZy4KKyAgIElmIGJhc2UgaXMgMiwgOCBvciAxNiwgYWRkIHRoZSBwcm9wZXIgcHJlZml4ICcwYicsICcwbycgb3IgJzB4Jy4KKyAgIElmIG5ld3N0eWxlIGlzIHplcm8sIHRoZW4gdXNlIHRoZSBwcmUtMi42IGJlaGF2aW9yIG9mIG9jdGFsIGhhdmluZworICAgYSBsZWFkaW5nICIwIiAqLworUHlBUElfRlVOQyhQeU9iamVjdCopIF9QeUludF9Gb3JtYXQoUHlJbnRPYmplY3QqIHYsIGludCBiYXNlLCBpbnQgbmV3c3R5bGUpOworCisvKiBGb3JtYXQgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUgZm9ybWF0X3NwZWMsIGFzIGRlZmluZWQgaW4gUEVQIDMxMDEKKyAgIChBZHZhbmNlZCBTdHJpbmcgRm9ybWF0dGluZykuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUludF9Gb3JtYXRBZHZhbmNlZChQeU9iamVjdCAqb2JqLAorCQkJCQkgICAgIGNoYXIgKmZvcm1hdF9zcGVjLAorCQkJCQkgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfSU5UT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2ludHJjaGVjay5oIGIvaW5jbHVkZS9weXRob24yLjcvaW50cmNoZWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2N2VkMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2ludHJjaGVjay5oCkBAIC0wLDAgKzEsMTUgQEAKKworI2lmbmRlZiBQeV9JTlRSQ0hFQ0tfSAorI2RlZmluZSBQeV9JTlRSQ0hFQ0tfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9GVU5DKGludCkgUHlPU19JbnRlcnJ1cHRPY2N1cnJlZCh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlPU19Jbml0SW50ZXJydXB0cyh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlPU19BZnRlckZvcmsodm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0lOVFJDSEVDS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9pdGVyb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9pdGVyb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkMTljMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2l0ZXJvYmplY3QuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIFB5X0lURVJPQkpFQ1RfSAorI2RlZmluZSBQeV9JVEVST0JKRUNUX0gKKy8qIEl0ZXJhdG9ycyAodGhlIGJhc2ljIGtpbmQsIG92ZXIgYSBzZXF1ZW5jZSkgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5U2VxSXRlcl9UeXBlOworCisjZGVmaW5lIFB5U2VxSXRlcl9DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeVNlcUl0ZXJfVHlwZSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcUl0ZXJfTmV3KFB5T2JqZWN0ICopOworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlDYWxsSXRlcl9UeXBlOworCisjZGVmaW5lIFB5Q2FsbEl0ZXJfQ2hlY2sob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlDYWxsSXRlcl9UeXBlKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q2FsbEl0ZXJfTmV3KFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfSVRFUk9CSkVDVF9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2xpc3RvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2xpc3RvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDQ1ODczCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvbGlzdG9iamVjdC5oCkBAIC0wLDAgKzEsNjggQEAKKworLyogTGlzdCBvYmplY3QgaW50ZXJmYWNlICovCisKKy8qCitBbm90aGVyIGdlbmVyYWxseSB1c2VmdWwgb2JqZWN0IHR5cGUgaXMgYW4gbGlzdCBvZiBvYmplY3QgcG9pbnRlcnMuCitUaGlzIGlzIGEgbXV0YWJsZSB0eXBlOiB0aGUgbGlzdCBpdGVtcyBjYW4gYmUgY2hhbmdlZCwgYW5kIGl0ZW1zIGNhbiBiZQorYWRkZWQgb3IgcmVtb3ZlZC4gIE91dC1vZi1yYW5nZSBpbmRpY2VzIG9yIG5vbi1saXN0IG9iamVjdHMgYXJlIGlnbm9yZWQuCisKKyoqKiBXQVJOSU5HICoqKiBQeUxpc3RfU2V0SXRlbSBkb2VzIG5vdCBpbmNyZW1lbnQgdGhlIG5ldyBpdGVtJ3MgcmVmZXJlbmNlCitjb3VudCwgYnV0IGRvZXMgZGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGl0ZW0gaXQgcmVwbGFjZXMsCitpZiBub3QgbmlsLiAgSXQgZG9lcyAqZGVjcmVtZW50KiB0aGUgcmVmZXJlbmNlIGNvdW50IGlmIGl0IGlzICpub3QqCitpbnNlcnRlZCBpbiB0aGUgbGlzdC4gIFNpbWlsYXJseSwgUHlMaXN0X0dldEl0ZW0gZG9lcyBub3QgaW5jcmVtZW50IHRoZQorcmV0dXJuZWQgaXRlbSdzIHJlZmVyZW5jZSBjb3VudC4KKyovCisKKyNpZm5kZWYgUHlfTElTVE9CSkVDVF9ICisjZGVmaW5lIFB5X0xJU1RPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfVkFSX0hFQUQKKyAgICAvKiBWZWN0b3Igb2YgcG9pbnRlcnMgdG8gbGlzdCBlbGVtZW50cy4gIGxpc3RbMF0gaXMgb2JfaXRlbVswXSwgZXRjLiAqLworICAgIFB5T2JqZWN0ICoqb2JfaXRlbTsKKworICAgIC8qIG9iX2l0ZW0gY29udGFpbnMgc3BhY2UgZm9yICdhbGxvY2F0ZWQnIGVsZW1lbnRzLiAgVGhlIG51bWJlcgorICAgICAqIGN1cnJlbnRseSBpbiB1c2UgaXMgb2Jfc2l6ZS4KKyAgICAgKiBJbnZhcmlhbnRzOgorICAgICAqICAgICAwIDw9IG9iX3NpemUgPD0gYWxsb2NhdGVkCisgICAgICogICAgIGxlbihsaXN0KSA9PSBvYl9zaXplCisgICAgICogICAgIG9iX2l0ZW0gPT0gTlVMTCBpbXBsaWVzIG9iX3NpemUgPT0gYWxsb2NhdGVkID09IDAKKyAgICAgKiBsaXN0LnNvcnQoKSB0ZW1wb3JhcmlseSBzZXRzIGFsbG9jYXRlZCB0byAtMSB0byBkZXRlY3QgbXV0YXRpb25zLgorICAgICAqCisgICAgICogSXRlbXMgbXVzdCBub3JtYWxseSBub3QgYmUgTlVMTCwgZXhjZXB0IGR1cmluZyBjb25zdHJ1Y3Rpb24gd2hlbgorICAgICAqIHRoZSBsaXN0IGlzIG5vdCB5ZXQgdmlzaWJsZSBvdXRzaWRlIHRoZSBmdW5jdGlvbiB0aGF0IGJ1aWxkcyBpdC4KKyAgICAgKi8KKyAgICBQeV9zc2l6ZV90IGFsbG9jYXRlZDsKK30gUHlMaXN0T2JqZWN0OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlMaXN0X1R5cGU7CisKKyNkZWZpbmUgUHlMaXN0X0NoZWNrKG9wKSBcCisJCVB5VHlwZV9GYXN0U3ViY2xhc3MoUHlfVFlQRShvcCksIFB5X1RQRkxBR1NfTElTVF9TVUJDTEFTUykKKyNkZWZpbmUgUHlMaXN0X0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlMaXN0X1R5cGUpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMaXN0X05ldyhQeV9zc2l6ZV90IHNpemUpOworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeUxpc3RfU2l6ZShQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMaXN0X0dldEl0ZW0oUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKGludCkgUHlMaXN0X1NldEl0ZW0oUHlPYmplY3QgKiwgUHlfc3NpemVfdCwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlMaXN0X0luc2VydChQeU9iamVjdCAqLCBQeV9zc2l6ZV90LCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUxpc3RfQXBwZW5kKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxpc3RfR2V0U2xpY2UoUHlPYmplY3QgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKGludCkgUHlMaXN0X1NldFNsaWNlKFB5T2JqZWN0ICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIFB5TGlzdF9Tb3J0KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIFB5TGlzdF9SZXZlcnNlKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxpc3RfQXNUdXBsZShQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5TGlzdF9FeHRlbmQoUHlMaXN0T2JqZWN0ICosIFB5T2JqZWN0ICopOworCisvKiBNYWNybywgdHJhZGluZyBzYWZldHkgZm9yIHNwZWVkICovCisjZGVmaW5lIFB5TGlzdF9HRVRfSVRFTShvcCwgaSkgKCgoUHlMaXN0T2JqZWN0ICopKG9wKSktPm9iX2l0ZW1baV0pCisjZGVmaW5lIFB5TGlzdF9TRVRfSVRFTShvcCwgaSwgdikgKCgoUHlMaXN0T2JqZWN0ICopKG9wKSktPm9iX2l0ZW1baV0gPSAodikpCisjZGVmaW5lIFB5TGlzdF9HRVRfU0laRShvcCkgICAgUHlfU0laRShvcCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfTElTVE9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9sb25naW50cmVwci5oIGIvaW5jbHVkZS9weXRob24yLjcvbG9uZ2ludHJlcHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDI1YzMwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvbG9uZ2ludHJlcHIuaApAQCAtMCwwICsxLDEwMyBAQAorI2lmbmRlZiBQeV9MT05HSU5UUkVQUl9ICisjZGVmaW5lIFB5X0xPTkdJTlRSRVBSX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBUaGlzIGlzIHB1Ymxpc2hlZCBmb3IgdGhlIGJlbmVmaXQgb2YgImZyaWVuZCIgbWFyc2hhbC5jIG9ubHkuICovCisKKy8qIFBhcmFtZXRlcnMgb2YgdGhlIGxvbmcgaW50ZWdlciByZXByZXNlbnRhdGlvbi4gIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50CisgICBzZXRzIG9mIHBhcmFtZXRlcnM6IG9uZSBzZXQgZm9yIDMwLWJpdCBkaWdpdHMsIHN0b3JlZCBpbiBhbiB1bnNpZ25lZCAzMi1iaXQKKyAgIGludGVnZXIgdHlwZSwgYW5kIG9uZSBzZXQgZm9yIDE1LWJpdCBkaWdpdHMgd2l0aCBlYWNoIGRpZ2l0IHN0b3JlZCBpbiBhbgorICAgdW5zaWduZWQgc2hvcnQuICBUaGUgdmFsdWUgb2YgUFlMT05HX0JJVFNfSU5fRElHSVQsIGRlZmluZWQgZWl0aGVyIGF0CisgICBjb25maWd1cmUgdGltZSBvciBpbiBweXBvcnQuaCwgaXMgdXNlZCB0byBkZWNpZGUgd2hpY2ggZGlnaXQgc2l6ZSB0byB1c2UuCisKKyAgIFR5cGUgJ2RpZ2l0JyBzaG91bGQgYmUgYWJsZSB0byBob2xkIDIqUHlMb25nX0JBU0UtMSwgYW5kIHR5cGUgJ3R3b2RpZ2l0cycKKyAgIHNob3VsZCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgYWJsZSB0byBob2xkIGFsbCBpbnRlZ2VycyB1cCB0bworICAgUHlMb25nX0JBU0UqUHlMb25nX0JBU0UtMS4gIHhfc3ViIGFzc3VtZXMgdGhhdCAnZGlnaXQnIGlzIGFuIHVuc2lnbmVkIHR5cGUsCisgICBhbmQgdGhhdCBvdmVyZmxvdyBpcyBoYW5kbGVkIGJ5IHRha2luZyB0aGUgcmVzdWx0IG1vZHVsbyAyKipOIGZvciBzb21lIE4gPgorICAgUHlMb25nX1NISUZULiAgVGhlIG1ham9yaXR5IG9mIHRoZSBjb2RlIGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgcHJlY2lzZQorICAgdmFsdWUgb2YgUHlMb25nX1NISUZULCBidXQgdGhlcmUgYXJlIHNvbWUgbm90YWJsZSBleGNlcHRpb25zOgorCisgICAtIGxvbmdfcG93KCkgcmVxdWlyZXMgdGhhdCBQeUxvbmdfU0hJRlQgYmUgZGl2aXNpYmxlIGJ5IDUKKworICAgLSBQeUxvbmdfe0FzLEZyb219Qnl0ZUFycmF5IHJlcXVpcmUgdGhhdCBQeUxvbmdfU0hJRlQgYmUgYXQgbGVhc3QgOAorCisgICAtIGxvbmdfaGFzaCgpIHJlcXVpcmVzIHRoYXQgUHlMb25nX1NISUZUIGlzICpzdHJpY3RseSogbGVzcyB0aGFuIHRoZSBudW1iZXIKKyAgICAgb2YgYml0cyBpbiBhbiB1bnNpZ25lZCBsb25nLCBhcyBkbyB0aGUgUHlMb25nIDwtPiBsb25nIChvciB1bnNpZ25lZCBsb25nKQorICAgICBjb252ZXJzaW9uIGZ1bmN0aW9ucworCisgICAtIHRoZSBsb25nIDwtPiBzaXplX3QvUHlfc3NpemVfdCBjb252ZXJzaW9uIGZ1bmN0aW9ucyBleHBlY3QgdGhhdAorICAgICBQeUxvbmdfU0hJRlQgaXMgc3RyaWN0bHkgbGVzcyB0aGFuIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhIHNpemVfdAorCisgICAtIHRoZSBtYXJzaGFsIGNvZGUgY3VycmVudGx5IGV4cGVjdHMgdGhhdCBQeUxvbmdfU0hJRlQgaXMgYSBtdWx0aXBsZSBvZiAxNQorCisgIFRoZSB2YWx1ZXMgMTUgYW5kIDMwIHNob3VsZCBmaXQgYWxsIG9mIHRoZSBhYm92ZSByZXF1aXJlbWVudHMsIG9uIGFueQorICBwbGF0Zm9ybS4KKyovCisKKyNpZiBQWUxPTkdfQklUU19JTl9ESUdJVCA9PSAzMAorI2lmICEoZGVmaW5lZCBIQVZFX1VJTlQ2NF9UICYmIGRlZmluZWQgSEFWRV9VSU5UMzJfVCAmJiAgICAgICAgICBcCisgICAgICBkZWZpbmVkIEhBVkVfSU5UNjRfVCAmJiBkZWZpbmVkIEhBVkVfSU5UMzJfVCkKKyNlcnJvciAiMzAtYml0IGxvbmcgZGlnaXRzIHJlcXVlc3RlZCwgYnV0IHRoZSBuZWNlc3NhcnkgdHlwZXMgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybSIKKyNlbmRpZgordHlwZWRlZiBQWV9VSU5UMzJfVCBkaWdpdDsKK3R5cGVkZWYgUFlfSU5UMzJfVCBzZGlnaXQ7IC8qIHNpZ25lZCB2YXJpYW50IG9mIGRpZ2l0ICovCit0eXBlZGVmIFBZX1VJTlQ2NF9UIHR3b2RpZ2l0czsKK3R5cGVkZWYgUFlfSU5UNjRfVCBzdHdvZGlnaXRzOyAvKiBzaWduZWQgdmFyaWFudCBvZiB0d29kaWdpdHMgKi8KKyNkZWZpbmUgUHlMb25nX1NISUZUCTMwCisjZGVmaW5lIF9QeUxvbmdfREVDSU1BTF9TSElGVAk5IC8qIG1heChlIHN1Y2ggdGhhdCAxMCoqZSBmaXRzIGluIGEgZGlnaXQpICovCisjZGVmaW5lIF9QeUxvbmdfREVDSU1BTF9CQVNFCSgoZGlnaXQpMTAwMDAwMDAwMCkgLyogMTAgKiogREVDSU1BTF9TSElGVCAqLworI2VsaWYgUFlMT05HX0JJVFNfSU5fRElHSVQgPT0gMTUKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgZGlnaXQ7Cit0eXBlZGVmIHNob3J0IHNkaWdpdDsgLyogc2lnbmVkIHZhcmlhbnQgb2YgZGlnaXQgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB0d29kaWdpdHM7Cit0eXBlZGVmIGxvbmcgc3R3b2RpZ2l0czsgLyogc2lnbmVkIHZhcmlhbnQgb2YgdHdvZGlnaXRzICovCisjZGVmaW5lIFB5TG9uZ19TSElGVAkxNQorI2RlZmluZSBfUHlMb25nX0RFQ0lNQUxfU0hJRlQJNCAvKiBtYXgoZSBzdWNoIHRoYXQgMTAqKmUgZml0cyBpbiBhIGRpZ2l0KSAqLworI2RlZmluZSBfUHlMb25nX0RFQ0lNQUxfQkFTRQkoKGRpZ2l0KTEwMDAwKSAvKiAxMCAqKiBERUNJTUFMX1NISUZUICovCisjZWxzZQorI2Vycm9yICJQWUxPTkdfQklUU19JTl9ESUdJVCBzaG91bGQgYmUgMTUgb3IgMzAiCisjZW5kaWYKKyNkZWZpbmUgUHlMb25nX0JBU0UJKChkaWdpdCkxIDw8IFB5TG9uZ19TSElGVCkKKyNkZWZpbmUgUHlMb25nX01BU0sJKChkaWdpdCkoUHlMb25nX0JBU0UgLSAxKSkKKworLyogYi93IGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi41ICovCisjZGVmaW5lIFNISUZUCVB5TG9uZ19TSElGVAorI2RlZmluZSBCQVNFCVB5TG9uZ19CQVNFCisjZGVmaW5lIE1BU0sJUHlMb25nX01BU0sKKworI2lmIFB5TG9uZ19TSElGVCAlIDUgIT0gMAorI2Vycm9yICJsb25nb2JqZWN0LmMgcmVxdWlyZXMgdGhhdCBQeUxvbmdfU0hJRlQgYmUgZGl2aXNpYmxlIGJ5IDUiCisjZW5kaWYKKworLyogTG9uZyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uLgorICAgVGhlIGFic29sdXRlIHZhbHVlIG9mIGEgbnVtYmVyIGlzIGVxdWFsIHRvCisgICAJU1VNKGZvciBpPTAgdGhyb3VnaCBhYnMob2Jfc2l6ZSktMSkgb2JfZGlnaXRbaV0gKiAyKiooU0hJRlQqaSkKKyAgIE5lZ2F0aXZlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIHdpdGggb2Jfc2l6ZSA8IDA7CisgICB6ZXJvIGlzIHJlcHJlc2VudGVkIGJ5IG9iX3NpemUgPT0gMC4KKyAgIEluIGEgbm9ybWFsaXplZCBudW1iZXIsIG9iX2RpZ2l0W2FicyhvYl9zaXplKS0xXSAodGhlIG1vc3Qgc2lnbmlmaWNhbnQKKyAgIGRpZ2l0KSBpcyBuZXZlciB6ZXJvLiAgQWxzbywgaW4gYWxsIGNhc2VzLCBmb3IgYWxsIHZhbGlkIGksCisgICAJMCA8PSBvYl9kaWdpdFtpXSA8PSBNQVNLLgorICAgVGhlIGFsbG9jYXRpb24gZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBhbGxvY2F0aW5nIGV4dHJhIG1lbW9yeQorICAgc28gdGhhdCBvYl9kaWdpdFswXSAuLi4gb2JfZGlnaXRbYWJzKG9iX3NpemUpLTFdIGFyZSBhY3R1YWxseSBhdmFpbGFibGUuCisKKyAgIENBVVRJT046ICBHZW5lcmljIGNvZGUgbWFuaXB1bGF0aW5nIHN1YnR5cGVzIG9mIFB5VmFyT2JqZWN0IGhhcyB0bworICAgYXdhcmUgdGhhdCBsb25ncyBhYnVzZSAgb2Jfc2l6ZSdzIHNpZ24gYml0LgorKi8KKworc3RydWN0IF9sb25nb2JqZWN0IHsKKwlQeU9iamVjdF9WQVJfSEVBRAorCWRpZ2l0IG9iX2RpZ2l0WzFdOworfTsKKworUHlBUElfRlVOQyhQeUxvbmdPYmplY3QgKikgX1B5TG9uZ19OZXcoUHlfc3NpemVfdCk7CisKKy8qIFJldHVybiBhIGNvcHkgb2Ygc3JjLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlMb25nX0NvcHkoUHlMb25nT2JqZWN0ICpzcmMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9MT05HSU5UUkVQUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9sb25nb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9sb25nb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlMjM0NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2xvbmdvYmplY3QuaApAQCAtMCwwICsxLDEzNSBAQAorI2lmbmRlZiBQeV9MT05HT0JKRUNUX0gKKyNkZWZpbmUgUHlfTE9OR09CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogTG9uZyAoYXJiaXRyYXJ5IHByZWNpc2lvbikgaW50ZWdlciBvYmplY3QgaW50ZXJmYWNlICovCisKK3R5cGVkZWYgc3RydWN0IF9sb25nb2JqZWN0IFB5TG9uZ09iamVjdDsgLyogUmV2ZWFsZWQgaW4gbG9uZ2ludHJlcHIuaCAqLworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlMb25nX1R5cGU7CisKKyNkZWZpbmUgUHlMb25nX0NoZWNrKG9wKSBcCisJCVB5VHlwZV9GYXN0U3ViY2xhc3MoUHlfVFlQRShvcCksIFB5X1RQRkxBR1NfTE9OR19TVUJDTEFTUykKKyNkZWZpbmUgUHlMb25nX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlMb25nX1R5cGUpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21Mb25nKGxvbmcpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZyh1bnNpZ25lZCBsb25nKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21Eb3VibGUoZG91YmxlKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21TaXplX3Qoc2l6ZV90KTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21Tc2l6ZV90KFB5X3NzaXplX3QpOworUHlBUElfRlVOQyhsb25nKSBQeUxvbmdfQXNMb25nKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhsb25nKSBQeUxvbmdfQXNMb25nQW5kT3ZlcmZsb3coUHlPYmplY3QgKiwgaW50ICopOworUHlBUElfRlVOQyh1bnNpZ25lZCBsb25nKSBQeUxvbmdfQXNVbnNpZ25lZExvbmcoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKHVuc2lnbmVkIGxvbmcpIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ01hc2soUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5TG9uZ19Bc1NzaXplX3QoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgX1B5TG9uZ19Bc0ludChQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0dldEluZm8odm9pZCk7CisKKy8qIEZvciB1c2UgYnkgaW50b2JqZWN0LmMgb25seSAqLworI2RlZmluZSBfUHlMb25nX0FzU3NpemVfdCBQeUxvbmdfQXNTc2l6ZV90CisjZGVmaW5lIF9QeUxvbmdfRnJvbVNpemVfdCBQeUxvbmdfRnJvbVNpemVfdAorI2RlZmluZSBfUHlMb25nX0Zyb21Tc2l6ZV90IFB5TG9uZ19Gcm9tU3NpemVfdAorUHlBUElfREFUQShpbnQpIF9QeUxvbmdfRGlnaXRWYWx1ZVsyNTZdOworCisvKiBfUHlMb25nX0ZyZXhwIHJldHVybnMgYSBkb3VibGUgeCBhbmQgYW4gZXhwb25lbnQgZSBzdWNoIHRoYXQgdGhlCisgICB0cnVlIHZhbHVlIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8geCAqIDIqKmUuICBlIGlzID49IDAuICB4IGlzCisgICAwLjAgaWYgYW5kIG9ubHkgaWYgdGhlIGlucHV0IGlzIDAgKGluIHdoaWNoIGNhc2UsIGUgYW5kIHggYXJlIGJvdGgKKyAgIHplcm9lcyk7IG90aGVyd2lzZSwgMC41IDw9IGFicyh4KSA8IDEuMC4gIE9uIG92ZXJmbG93LCB3aGljaCBpcworICAgcG9zc2libGUgaWYgdGhlIG51bWJlciBvZiBiaXRzIGRvZXNuJ3QgZml0IGludG8gYSBQeV9zc2l6ZV90LCBzZXRzCisgICBPdmVyZmxvd0Vycm9yIGFuZCByZXR1cm5zIC0xLjAgZm9yIHgsIDAgZm9yIGUuICovCitQeUFQSV9GVU5DKGRvdWJsZSkgX1B5TG9uZ19GcmV4cChQeUxvbmdPYmplY3QgKmEsIFB5X3NzaXplX3QgKmUpOworCitQeUFQSV9GVU5DKGRvdWJsZSkgUHlMb25nX0FzRG91YmxlKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfRnJvbVZvaWRQdHIodm9pZCAqKTsKK1B5QVBJX0ZVTkModm9pZCAqKSBQeUxvbmdfQXNWb2lkUHRyKFB5T2JqZWN0ICopOworCisjaWZkZWYgSEFWRV9MT05HX0xPTkcKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21Mb25nTG9uZyhQWV9MT05HX0xPTkcpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodW5zaWduZWQgUFlfTE9OR19MT05HKTsKK1B5QVBJX0ZVTkMoUFlfTE9OR19MT05HKSBQeUxvbmdfQXNMb25nTG9uZyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkModW5zaWduZWQgUFlfTE9OR19MT05HKSBQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQWV9MT05HX0xPTkcpIFB5TG9uZ19Bc0xvbmdMb25nQW5kT3ZlcmZsb3coUHlPYmplY3QgKiwgaW50ICopOworI2VuZGlmIC8qIEhBVkVfTE9OR19MT05HICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21TdHJpbmcoY2hhciAqLCBjaGFyICoqLCBpbnQpOworI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlMb25nX0Zyb21Vbmljb2RlKFB5X1VOSUNPREUqLCBQeV9zc2l6ZV90LCBpbnQpOworI2VuZGlmCisKKy8qIF9QeUxvbmdfU2lnbi4gIFJldHVybiAwIGlmIHYgaXMgMCwgLTEgaWYgdiA8IDAsICsxIGlmIHYgPiAwLgorICAgdiBtdXN0IG5vdCBiZSBOVUxMLCBhbmQgbXVzdCBiZSBhIG5vcm1hbGl6ZWQgbG9uZy4KKyAgIFRoZXJlIGFyZSBubyBlcnJvciBjYXNlcy4KKyovCitQeUFQSV9GVU5DKGludCkgX1B5TG9uZ19TaWduKFB5T2JqZWN0ICp2KTsKKworCisvKiBfUHlMb25nX051bUJpdHMuICBSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byByZXByZXNlbnQgdGhlCisgICBhYnNvbHV0ZSB2YWx1ZSBvZiBhIGxvbmcuICBGb3IgZXhhbXBsZSwgdGhpcyByZXR1cm5zIDEgZm9yIDEgYW5kIC0xLCAyCisgICBmb3IgMiBhbmQgLTIsIGFuZCAyIGZvciAzIGFuZCAtMy4gIEl0IHJldHVybnMgMCBmb3IgMC4KKyAgIHYgbXVzdCBub3QgYmUgTlVMTCwgYW5kIG11c3QgYmUgYSBub3JtYWxpemVkIGxvbmcuCisgICAoc2l6ZV90KS0xIGlzIHJldHVybmVkIGFuZCBPdmVyZmxvd0Vycm9yIHNldCBpZiB0aGUgdHJ1ZSByZXN1bHQgZG9lc24ndAorICAgZml0IGluIGEgc2l6ZV90LgorKi8KK1B5QVBJX0ZVTkMoc2l6ZV90KSBfUHlMb25nX051bUJpdHMoUHlPYmplY3QgKnYpOworCisvKiBfUHlMb25nX0Zyb21CeXRlQXJyYXk6ICBWaWV3IHRoZSBuIHVuc2lnbmVkIGJ5dGVzIGFzIGEgYmluYXJ5IGludGVnZXIgaW4KKyAgIGJhc2UgMjU2LCBhbmQgcmV0dXJuIGEgUHl0aG9uIGxvbmcgd2l0aCB0aGUgc2FtZSBudW1lcmljIHZhbHVlLgorICAgSWYgbiBpcyAwLCB0aGUgaW50ZWdlciBpcyAwLiAgRWxzZToKKyAgIElmIGxpdHRsZV9lbmRpYW4gaXMgMS90cnVlLCBieXRlc1tuLTFdIGlzIHRoZSBNU0IgYW5kIGJ5dGVzWzBdIHRoZSBMU0I7CisgICBlbHNlIChsaXR0bGVfZW5kaWFuIGlzIDAvZmFsc2UpIGJ5dGVzWzBdIGlzIHRoZSBNU0IgYW5kIGJ5dGVzW24tMV0gdGhlCisgICBMU0IuCisgICBJZiBpc19zaWduZWQgaXMgMC9mYWxzZSwgdmlldyB0aGUgYnl0ZXMgYXMgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KKyAgIElmIGlzX3NpZ25lZCBpcyAxL3RydWUsIHZpZXcgdGhlIGJ5dGVzIGFzIGEgMidzLWNvbXBsZW1lbnQgaW50ZWdlciwKKyAgIG5vbi1uZWdhdGl2ZSBpZiBiaXQgMHg4MCBvZiB0aGUgTVNCIGlzIGNsZWFyLCBuZWdhdGl2ZSBpZiBzZXQuCisgICBFcnJvciByZXR1cm5zOgorICAgKyBSZXR1cm4gTlVMTCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBleGNlcHRpb24gc2V0IGlmIHRoZXJlJ3Mgbm90CisgICAgIGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBQeXRob24gbG9uZy4KKyovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUxvbmdfRnJvbUJ5dGVBcnJheSgKKwljb25zdCB1bnNpZ25lZCBjaGFyKiBieXRlcywgc2l6ZV90IG4sCisJaW50IGxpdHRsZV9lbmRpYW4sIGludCBpc19zaWduZWQpOworCisvKiBfUHlMb25nX0FzQnl0ZUFycmF5OiBDb252ZXJ0IHRoZSBsZWFzdC1zaWduaWZpY2FudCA4Km4gYml0cyBvZiBsb25nCisgICB2IHRvIGEgYmFzZS0yNTYgaW50ZWdlciwgc3RvcmVkIGluIGFycmF5IGJ5dGVzLiAgTm9ybWFsbHkgcmV0dXJuIDAsCisgICByZXR1cm4gLTEgb24gZXJyb3IuCisgICBJZiBsaXR0bGVfZW5kaWFuIGlzIDEvdHJ1ZSwgc3RvcmUgdGhlIE1TQiBhdCBieXRlc1tuLTFdIGFuZCB0aGUgTFNCIGF0CisgICBieXRlc1swXTsgZWxzZSAobGl0dGxlX2VuZGlhbiBpcyAwL2ZhbHNlKSBzdG9yZSB0aGUgTVNCIGF0IGJ5dGVzWzBdIGFuZAorICAgdGhlIExTQiBhdCBieXRlc1tuLTFdLgorICAgSWYgaXNfc2lnbmVkIGlzIDAvZmFsc2UsIGl0J3MgYW4gZXJyb3IgaWYgdiA8IDA7IGVsc2UgKHYgPj0gMCkgbiBieXRlcworICAgYXJlIGZpbGxlZCBhbmQgdGhlcmUncyBub3RoaW5nIHNwZWNpYWwgYWJvdXQgYml0IDB4ODAgb2YgdGhlIE1TQi4KKyAgIElmIGlzX3NpZ25lZCBpcyAxL3RydWUsIGJ5dGVzIGlzIGZpbGxlZCB3aXRoIHRoZSAyJ3MtY29tcGxlbWVudAorICAgcmVwcmVzZW50YXRpb24gb2YgdidzIHZhbHVlLiAgQml0IDB4ODAgb2YgdGhlIE1TQiBpcyB0aGUgc2lnbiBiaXQuCisgICBFcnJvciByZXR1cm5zICgtMSk6CisgICArIGlzX3NpZ25lZCBpcyAwIGFuZCB2IDwgMC4gIFR5cGVFcnJvciBpcyBzZXQgaW4gdGhpcyBjYXNlLCBhbmQgYnl0ZXMKKyAgICAgaXNuJ3QgYWx0ZXJlZC4KKyAgICsgbiBpc24ndCBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIGZ1bGwgbWF0aGVtYXRpY2FsIHZhbHVlIG9mIHYuICBGb3IKKyAgICAgZXhhbXBsZSwgaWYgaXNfc2lnbmVkIGlzIDAgYW5kIHRoZXJlIGFyZSBtb3JlIGRpZ2l0cyBpbiB0aGUgdiB0aGFuCisgICAgIGZpdCBpbiBuOyBvciBpZiBpc19zaWduZWQgaXMgMSwgdiA8IDAsIGFuZCBuIGlzIGp1c3QgMSBiaXQgc2h5IG9mCisgICAgIGJlaW5nIGxhcmdlIGVub3VnaCB0byBob2xkIGEgc2lnbiBiaXQuICBPdmVyZmxvd0Vycm9yIGlzIHNldCBpbiB0aGlzCisgICAgIGNhc2UsIGJ1dCBieXRlcyBob2xkcyB0aGUgbGVhc3Qtc2lnbmZpY2FudCBuIGJ5dGVzIG9mIHRoZSB0cnVlIHZhbHVlLgorKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlMb25nX0FzQnl0ZUFycmF5KFB5TG9uZ09iamVjdCogdiwKKwl1bnNpZ25lZCBjaGFyKiBieXRlcywgc2l6ZV90IG4sCisJaW50IGxpdHRsZV9lbmRpYW4sIGludCBpc19zaWduZWQpOworCisvKiBfUHlMb25nX0Zvcm1hdDogQ29udmVydCB0aGUgbG9uZyB0byBhIHN0cmluZyBvYmplY3Qgd2l0aCBnaXZlbiBiYXNlLAorICAgYXBwZW5kaW5nIGEgYmFzZSBwcmVmaXggb2YgMFtib3hdIGlmIGJhc2UgaXMgMiwgOCBvciAxNi4KKyAgIEFkZCBhIHRyYWlsaW5nICJMIiBpZiBhZGRMIGlzIG5vbi16ZXJvLgorICAgSWYgbmV3c3R5bGUgaXMgemVybywgdGhlbiB1c2UgdGhlIHByZS0yLjYgYmVoYXZpb3Igb2Ygb2N0YWwgaGF2aW5nCisgICBhIGxlYWRpbmcgIjAiLCBpbnN0ZWFkIG9mIHRoZSBwcmVmaXggIjBvIiAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlMb25nX0Zvcm1hdChQeU9iamVjdCAqYWEsIGludCBiYXNlLCBpbnQgYWRkTCwgaW50IG5ld3N0eWxlKTsKKworLyogRm9ybWF0IHRoZSBvYmplY3QgYmFzZWQgb24gdGhlIGZvcm1hdF9zcGVjLCBhcyBkZWZpbmVkIGluIFBFUCAzMTAxCisgICAoQWR2YW5jZWQgU3RyaW5nIEZvcm1hdHRpbmcpLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlMb25nX0Zvcm1hdEFkdmFuY2VkKFB5T2JqZWN0ICpvYmosCisJCQkJCSAgICAgIGNoYXIgKmZvcm1hdF9zcGVjLAorCQkJCQkgICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0xPTkdPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvbWFyc2hhbC5oIGIvaW5jbHVkZS9weXRob24yLjcvbWFyc2hhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMWZkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9tYXJzaGFsLmgKQEAgLTAsMCArMSwyNSBAQAorCisvKiBJbnRlcmZhY2UgZm9yIG1hcnNoYWwuYyAqLworCisjaWZuZGVmIFB5X01BUlNIQUxfSAorI2RlZmluZSBQeV9NQVJTSEFMX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBQeV9NQVJTSEFMX1ZFUlNJT04gMgorCitQeUFQSV9GVU5DKHZvaWQpIFB5TWFyc2hhbF9Xcml0ZUxvbmdUb0ZpbGUobG9uZywgRklMRSAqLCBpbnQpOworUHlBUElfRlVOQyh2b2lkKSBQeU1hcnNoYWxfV3JpdGVPYmplY3RUb0ZpbGUoUHlPYmplY3QgKiwgRklMRSAqLCBpbnQpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU1hcnNoYWxfV3JpdGVPYmplY3RUb1N0cmluZyhQeU9iamVjdCAqLCBpbnQpOworCitQeUFQSV9GVU5DKGxvbmcpIFB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlKEZJTEUgKik7CitQeUFQSV9GVU5DKGludCkgUHlNYXJzaGFsX1JlYWRTaG9ydEZyb21GaWxlKEZJTEUgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbUZpbGUoRklMRSAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlNYXJzaGFsX1JlYWRMYXN0T2JqZWN0RnJvbUZpbGUoRklMRSAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tU3RyaW5nKGNoYXIgKiwgUHlfc3NpemVfdCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X01BUlNIQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvbWVtb3J5b2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9tZW1vcnlvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBiNjIxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvbWVtb3J5b2JqZWN0LmgKQEAgLTAsMCArMSw3NCBAQAorLyogTWVtb3J5IHZpZXcgb2JqZWN0LiBJbiBQeXRob24gdGhpcyBpcyBhdmFpbGFibGUgYXMgIm1lbW9yeXZpZXciLiAqLworCisjaWZuZGVmIFB5X01FTU9SWU9CSkVDVF9ICisjZGVmaW5lIFB5X01FTU9SWU9CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeU1lbW9yeVZpZXdfVHlwZTsKKworI2RlZmluZSBQeU1lbW9yeVZpZXdfQ2hlY2sob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlNZW1vcnlWaWV3X1R5cGUpCisKKy8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIHVuZGVybHlpbmcgUHlfYnVmZmVyIG9mIGEgbWVtb3J5dmlldyBvYmplY3QuICovCisjZGVmaW5lIFB5TWVtb3J5Vmlld19HRVRfQlVGRkVSKG9wKSAoJigoUHlNZW1vcnlWaWV3T2JqZWN0ICopKG9wKSktPnZpZXcpCisvKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBQeU9iamVjdCBmcm9tIHdoaWNoIG9yaWdpbmF0ZXMgYSBtZW1vcnl2aWV3IG9iamVjdC4gKi8KKyNkZWZpbmUgUHlNZW1vcnlWaWV3X0dFVF9CQVNFKG9wKSAoKChQeU1lbW9yeVZpZXdPYmplY3QgKikob3ApKS0+dmlldy5vYmopCisKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU1lbW9yeVZpZXdfR2V0Q29udGlndW91cyhQeU9iamVjdCAqYmFzZSwgCisJCQkJCQkgIGludCBidWZmZXJ0eXBlLCAKKwkJCQkJCSAgY2hhciBmb3J0KTsKKworICAgIC8qIFJldHVybiBhIGNvbnRpZ3VvdXMgY2h1bmsgb2YgbWVtb3J5IHJlcHJlc2VudGluZyB0aGUgYnVmZmVyCisgICAgICAgZnJvbSBhbiBvYmplY3QgaW4gYSBtZW1vcnkgdmlldyBvYmplY3QuICBJZiBhIGNvcHkgaXMgbWFkZSB0aGVuIHRoZQorICAgICAgIGJhc2Ugb2JqZWN0IGZvciB0aGUgbWVtb3J5IHZpZXcgd2lsbCBiZSBhICpuZXcqIGJ5dGVzIG9iamVjdC4gCisgICAgICAgCisgICAgICAgT3RoZXJ3aXNlLCB0aGUgYmFzZS1vYmplY3Qgd2lsbCBiZSB0aGUgb2JqZWN0IGl0c2VsZiBhbmQgbm8gCisgICAgICAgZGF0YS1jb3B5aW5nIHdpbGwgYmUgZG9uZS4gCisKKyAgICAgICBUaGUgYnVmZmVydHlwZSBhcmd1bWVudCBjYW4gYmUgUHlCVUZfUkVBRCwgUHlCVUZfV1JJVEUsCisgICAgICAgUHlCVUZfU0hBRE9XIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSByZXR1cm5lZCBidWZmZXIKKyAgICAgICBzaG91bGQgYmUgUkVBRE9OTFksIFdSSVRBQkxFLCBvciBzZXQgdG8gdXBkYXRlIHRoZQorICAgICAgIG9yaWdpbmFsIGJ1ZmZlciBpZiBhIGNvcHkgbXVzdCBiZSBtYWRlLiAgSWYgYnVmZmVydHlwZSBpcworICAgICAgIFB5QlVGX1dSSVRFIGFuZCB0aGUgYnVmZmVyIGlzIG5vdCBjb250aWd1b3VzIGFuIGVycm9yIHdpbGwKKyAgICAgICBiZSByYWlzZWQuICBJbiB0aGlzIGNpcmN1bXN0YW5jZSwgdGhlIHVzZXIgY2FuIHVzZQorICAgICAgIFB5QlVGX1NIQURPVyB0byBlbnN1cmUgdGhhdCBhIGEgd3JpdGFibGUgdGVtcG9yYXJ5CisgICAgICAgY29udGlndW91cyBidWZmZXIgaXMgcmV0dXJuZWQuICBUaGUgY29udGVudHMgb2YgdGhpcworICAgICAgIGNvbnRpZ3VvdXMgYnVmZmVyIHdpbGwgYmUgY29waWVkIGJhY2sgaW50byB0aGUgb3JpZ2luYWwKKyAgICAgICBvYmplY3QgYWZ0ZXIgdGhlIG1lbW9yeXZpZXcgb2JqZWN0IGlzIGRlbGV0ZWQgYXMgbG9uZyBhcworICAgICAgIHRoZSBvcmlnaW5hbCBvYmplY3QgaXMgd3JpdGFibGUgYW5kIGFsbG93cyBzZXR0aW5nIGFuCisgICAgICAgZXhjbHVzaXZlIHdyaXRlIGxvY2suIElmIHRoaXMgaXMgbm90IGFsbG93ZWQgYnkgdGhlCisgICAgICAgb3JpZ2luYWwgb2JqZWN0LCB0aGVuIGEgQnVmZmVyRXJyb3IgaXMgcmFpc2VkLgorICAgICAgIAorICAgICAgIElmIHRoZSBvYmplY3QgaXMgbXVsdGktZGltZW5zaW9uYWwgYW5kIGlmIGZvcnRyYW4gaXMgJ0YnLAorICAgICAgIHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgdGhlIHVuZGVybHlpbmcgYXJyYXkgd2lsbCB2YXJ5IHRoZQorICAgICAgIGZhc3Rlc3QgaW4gdGhlIGJ1ZmZlci4gIElmIGZvcnRyYW4gaXMgJ0MnLCB0aGVuIHRoZSBsYXN0CisgICAgICAgZGltZW5zaW9uIHdpbGwgdmFyeSB0aGUgZmFzdGVzdCAoQy1zdHlsZSBjb250aWd1b3VzKS4gIElmCisgICAgICAgZm9ydHJhbiBpcyAnQScsIHRoZW4gaXQgZG9lcyBub3QgbWF0dGVyIGFuZCB5b3Ugd2lsbCBnZXQKKyAgICAgICB3aGF0ZXZlciB0aGUgb2JqZWN0IGRlY2lkZXMgaXMgbW9yZSBlZmZpY2llbnQuICAKKworICAgICAgIEEgbmV3IHJlZmVyZW5jZSBpcyByZXR1cm5lZCB0aGF0IG11c3QgYmUgREVDUkVGJ2Qgd2hlbiBmaW5pc2hlZC4KKyAgICAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWVtb3J5Vmlld19Gcm9tT2JqZWN0KFB5T2JqZWN0ICpiYXNlKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU1lbW9yeVZpZXdfRnJvbUJ1ZmZlcihQeV9idWZmZXIgKmluZm8pOworICAgIC8qIGNyZWF0ZSBuZXcgaWYgYnVmcHRyIGlzIE5VTEwgCisgICAgICAgIHdpbGwgYmUgYSBuZXcgYnl0ZXNvYmplY3QgaW4gYmFzZSAqLworCisKKy8qIFRoZSBzdHJ1Y3QgaXMgZGVjbGFyZWQgaGVyZSBzbyB0aGF0IG1hY3JvcyBjYW4gd29yaywgYnV0IGl0IHNob3VsZG4ndAorICAgYmUgY29uc2lkZXJlZCBwdWJsaWMuIERvbid0IGFjY2VzcyB0aG9zZSBmaWVsZHMgZGlyZWN0bHksIHVzZSB0aGUgbWFjcm9zCisgICBhbmQgZnVuY3Rpb25zIGluc3RlYWQhICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpiYXNlOworICAgIFB5X2J1ZmZlciB2aWV3OworfSBQeU1lbW9yeVZpZXdPYmplY3Q7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfTUVNT1JZT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L21ldGFncmFtbWFyLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9tZXRhZ3JhbW1hci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YzhlZjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9tZXRhZ3JhbW1hci5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgUHlfTUVUQUdSQU1NQVJfSAorI2RlZmluZSBQeV9NRVRBR1JBTU1BUl9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworI2RlZmluZSBNU1RBUlQgMjU2CisjZGVmaW5lIFJVTEUgMjU3CisjZGVmaW5lIFJIUyAyNTgKKyNkZWZpbmUgQUxUIDI1OQorI2RlZmluZSBJVEVNIDI2MAorI2RlZmluZSBBVE9NIDI2MQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9NRVRBR1JBTU1BUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9tZXRob2RvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L21ldGhvZG9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMTYwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9tZXRob2RvYmplY3QuaApAQCAtMCwwICsxLDkzIEBACisKKy8qIE1ldGhvZCBvYmplY3QgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfTUVUSE9ET0JKRUNUX0gKKyNkZWZpbmUgUHlfTUVUSE9ET0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogVGhpcyBpcyBhYm91dCB0aGUgdHlwZSAnYnVpbHRpbl9mdW5jdGlvbl9vcl9tZXRob2QnLAorICAgbm90IFB5dGhvbiBtZXRob2RzIGluIHVzZXItZGVmaW5lZCBjbGFzc2VzLiAgU2VlIGNsYXNzb2JqZWN0LmgKKyAgIGZvciB0aGUgbGF0dGVyLiAqLworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlDRnVuY3Rpb25fVHlwZTsKKworI2RlZmluZSBQeUNGdW5jdGlvbl9DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeUNGdW5jdGlvbl9UeXBlKQorCit0eXBlZGVmIFB5T2JqZWN0ICooKlB5Q0Z1bmN0aW9uKShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgUHlPYmplY3QgKigqUHlDRnVuY3Rpb25XaXRoS2V5d29yZHMpKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCisJCQkJCSAgICAgUHlPYmplY3QgKik7Cit0eXBlZGVmIFB5T2JqZWN0ICooKlB5Tm9BcmdzRnVuY3Rpb24pKFB5T2JqZWN0ICopOworCitQeUFQSV9GVU5DKFB5Q0Z1bmN0aW9uKSBQeUNGdW5jdGlvbl9HZXRGdW5jdGlvbihQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDRnVuY3Rpb25fR2V0U2VsZihQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUNGdW5jdGlvbl9HZXRGbGFncyhQeU9iamVjdCAqKTsKKworLyogTWFjcm9zIGZvciBkaXJlY3QgYWNjZXNzIHRvIHRoZXNlIHZhbHVlcy4gVHlwZSBjaGVja3MgYXJlICpub3QqCisgICBkb25lLCBzbyB1c2Ugd2l0aCBjYXJlLiAqLworI2RlZmluZSBQeUNGdW5jdGlvbl9HRVRfRlVOQ1RJT04oZnVuYykgXAorICAgICAgICAoKChQeUNGdW5jdGlvbk9iamVjdCAqKWZ1bmMpIC0+IG1fbWwgLT4gbWxfbWV0aCkKKyNkZWZpbmUgUHlDRnVuY3Rpb25fR0VUX1NFTEYoZnVuYykgXAorCSgoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopZnVuYykgLT4gbV9zZWxmKQorI2RlZmluZSBQeUNGdW5jdGlvbl9HRVRfRkxBR1MoZnVuYykgXAorCSgoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopZnVuYykgLT4gbV9tbCAtPiBtbF9mbGFncykKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDRnVuY3Rpb25fQ2FsbChQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKworc3RydWN0IFB5TWV0aG9kRGVmIHsKKyAgICBjb25zdCBjaGFyCSptbF9uYW1lOwkvKiBUaGUgbmFtZSBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24vbWV0aG9kICovCisgICAgUHlDRnVuY3Rpb24gIG1sX21ldGg7CS8qIFRoZSBDIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyBpdCAqLworICAgIGludAkJIG1sX2ZsYWdzOwkvKiBDb21iaW5hdGlvbiBvZiBNRVRIX3h4eCBmbGFncywgd2hpY2ggbW9zdGx5CisJCQkJICAgZGVzY3JpYmUgdGhlIGFyZ3MgZXhwZWN0ZWQgYnkgdGhlIEMgZnVuYyAqLworICAgIGNvbnN0IGNoYXIJKm1sX2RvYzsJLyogVGhlIF9fZG9jX18gYXR0cmlidXRlLCBvciBOVUxMICovCit9OwordHlwZWRlZiBzdHJ1Y3QgUHlNZXRob2REZWYgUHlNZXRob2REZWY7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlfRmluZE1ldGhvZChQeU1ldGhvZERlZltdLCBQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOworCisjZGVmaW5lIFB5Q0Z1bmN0aW9uX05ldyhNTCwgU0VMRikgUHlDRnVuY3Rpb25fTmV3RXgoKE1MKSwgKFNFTEYpLCBOVUxMKQorUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNGdW5jdGlvbl9OZXdFeChQeU1ldGhvZERlZiAqLCBQeU9iamVjdCAqLCAKKwkJCQkJIFB5T2JqZWN0ICopOworCisvKiBGbGFnIHBhc3NlZCB0byBuZXdtZXRob2RvYmplY3QgKi8KKyNkZWZpbmUgTUVUSF9PTERBUkdTICAweDAwMDAKKyNkZWZpbmUgTUVUSF9WQVJBUkdTICAweDAwMDEKKyNkZWZpbmUgTUVUSF9LRVlXT1JEUyAweDAwMDIKKy8qIE1FVEhfTk9BUkdTIGFuZCBNRVRIX08gbXVzdCBub3QgYmUgY29tYmluZWQgd2l0aCB0aGUgZmxhZ3MgYWJvdmUuICovCisjZGVmaW5lIE1FVEhfTk9BUkdTICAgMHgwMDA0CisjZGVmaW5lIE1FVEhfTyAgICAgICAgMHgwMDA4CisKKy8qIE1FVEhfQ0xBU1MgYW5kIE1FVEhfU1RBVElDIGFyZSBhIGxpdHRsZSBkaWZmZXJlbnQ7IHRoZXNlIGNvbnRyb2wKKyAgIHRoZSBjb25zdHJ1Y3Rpb24gb2YgbWV0aG9kcyBmb3IgYSBjbGFzcy4gIFRoZXNlIGNhbm5vdCBiZSB1c2VkIGZvcgorICAgZnVuY3Rpb25zIGluIG1vZHVsZXMuICovCisjZGVmaW5lIE1FVEhfQ0xBU1MgICAgMHgwMDEwCisjZGVmaW5lIE1FVEhfU1RBVElDICAgMHgwMDIwCisKKy8qIE1FVEhfQ09FWElTVCBhbGxvd3MgYSBtZXRob2QgdG8gYmUgZW50ZXJlZCBldmVudGhvdWdoIGEgc2xvdCBoYXMKKyAgIGFscmVhZHkgZmlsbGVkIHRoZSBlbnRyeS4gIFdoZW4gZGVmaW5lZCwgdGhlIGZsYWcgYWxsb3dzIGEgc2VwYXJhdGUKKyAgIG1ldGhvZCwgIl9fY29udGFpbnNfXyIgZm9yIGV4YW1wbGUsIHRvIGNvZXhpc3Qgd2l0aCBhIGRlZmluZWQgCisgICBzbG90IGxpa2Ugc3FfY29udGFpbnMuICovCisKKyNkZWZpbmUgTUVUSF9DT0VYSVNUICAgMHgwMDQwCisKK3R5cGVkZWYgc3RydWN0IFB5TWV0aG9kQ2hhaW4geworICAgIFB5TWV0aG9kRGVmICptZXRob2RzOwkJLyogTWV0aG9kcyBvZiB0aGlzIHR5cGUgKi8KKyAgICBzdHJ1Y3QgUHlNZXRob2RDaGFpbiAqbGluazsJLyogTlVMTCBvciBiYXNlIHR5cGUgKi8KK30gUHlNZXRob2RDaGFpbjsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeV9GaW5kTWV0aG9kSW5DaGFpbihQeU1ldGhvZENoYWluICosIFB5T2JqZWN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKik7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlNZXRob2REZWYgKm1fbWw7IC8qIERlc2NyaXB0aW9uIG9mIHRoZSBDIGZ1bmN0aW9uIHRvIGNhbGwgKi8KKyAgICBQeU9iamVjdCAgICAqbV9zZWxmOyAvKiBQYXNzZWQgYXMgJ3NlbGYnIGFyZyB0byB0aGUgQyBmdW5jLCBjYW4gYmUgTlVMTCAqLworICAgIFB5T2JqZWN0ICAgICptX21vZHVsZTsgLyogVGhlIF9fbW9kdWxlX18gYXR0cmlidXRlLCBjYW4gYmUgYW55dGhpbmcgKi8KK30gUHlDRnVuY3Rpb25PYmplY3Q7CisKK1B5QVBJX0ZVTkMoaW50KSBQeUNGdW5jdGlvbl9DbGVhckZyZWVMaXN0KHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9NRVRIT0RPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvbW9kc3VwcG9ydC5oIGIvaW5jbHVkZS9weXRob24yLjcvbW9kc3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZGRkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9tb2RzdXBwb3J0LmgKQEAgLTAsMCArMSwxMzQgQEAKKworI2lmbmRlZiBQeV9NT0RTVVBQT1JUX0gKKyNkZWZpbmUgUHlfTU9EU1VQUE9SVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIE1vZHVsZSBzdXBwb3J0IGludGVyZmFjZSAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qIElmIFBZX1NTSVpFX1RfQ0xFQU4gaXMgZGVmaW5lZCwgZWFjaCBmdW5jdGlvbnMgdHJlYXRzICMtc3BlY2lmaWVyCisgICB0byBtZWFuIFB5X3NzaXplX3QgKi8KKyNpZmRlZiBQWV9TU0laRV9UX0NMRUFOCisjZGVmaW5lIFB5QXJnX1BhcnNlCQkJX1B5QXJnX1BhcnNlX1NpemVUCisjZGVmaW5lIFB5QXJnX1BhcnNlVHVwbGUJCV9QeUFyZ19QYXJzZVR1cGxlX1NpemVUCisjZGVmaW5lIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcwlfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUCisjZGVmaW5lIFB5QXJnX1ZhUGFyc2UJCQlfUHlBcmdfVmFQYXJzZV9TaXplVAorI2RlZmluZSBQeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3JkcwlfUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQKKyNkZWZpbmUgUHlfQnVpbGRWYWx1ZQkJCV9QeV9CdWlsZFZhbHVlX1NpemVUCisjZGVmaW5lIFB5X1ZhQnVpbGRWYWx1ZQkJCV9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQKKyNlbHNlCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeV9WYUJ1aWxkVmFsdWVfU2l6ZVQoY29uc3QgY2hhciAqLCB2YV9saXN0KTsKKyNlbmRpZgorCitQeUFQSV9GVU5DKGludCkgUHlBcmdfUGFyc2UoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCAuLi4pOworUHlBUElfRlVOQyhpbnQpIFB5QXJnX1BhcnNlVHVwbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCAuLi4pIFB5X0ZPUk1BVF9QQVJTRVRVUExFKFB5QXJnX1BhcnNlVHVwbGUsIDIsIDMpOworUHlBUElfRlVOQyhpbnQpIFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICosIGNoYXIgKiosIC4uLik7CitQeUFQSV9GVU5DKGludCkgUHlBcmdfVW5wYWNrVHVwbGUoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90LCBQeV9zc2l6ZV90LCAuLi4pOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeV9CdWlsZFZhbHVlKGNvbnN0IGNoYXIgKiwgLi4uKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5X0J1aWxkVmFsdWVfU2l6ZVQoY29uc3QgY2hhciAqLCAuLi4pOworUHlBUElfRlVOQyhpbnQpIF9QeUFyZ19Ob0tleXdvcmRzKGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCBQeU9iamVjdCAqa3cpOworCitQeUFQSV9GVU5DKGludCkgUHlBcmdfVmFQYXJzZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOworUHlBUElfRlVOQyhpbnQpIFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgdmFfbGlzdCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5X1ZhQnVpbGRWYWx1ZShjb25zdCBjaGFyICosIHZhX2xpc3QpOworCitQeUFQSV9GVU5DKGludCkgUHlNb2R1bGVfQWRkT2JqZWN0KFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCBsb25nKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisjZGVmaW5lIFB5TW9kdWxlX0FkZEludE1hY3JvKG0sIGMpIFB5TW9kdWxlX0FkZEludENvbnN0YW50KG0sICNjLCBjKQorI2RlZmluZSBQeU1vZHVsZV9BZGRTdHJpbmdNYWNybyhtLCBjKSBQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAjYywgYykKKworI2RlZmluZSBQWVRIT05fQVBJX1ZFUlNJT04gMTAxMworI2RlZmluZSBQWVRIT05fQVBJX1NUUklORyAiMTAxMyIKKy8qIFRoZSBBUEkgdmVyc2lvbiBpcyBtYWludGFpbmVkIChpbmRlcGVuZGVudGx5IGZyb20gdGhlIFB5dGhvbiB2ZXJzaW9uKQorICAgc28gd2UgY2FuIGRldGVjdCBtaXNtYXRjaGVzIGJldHdlZW4gdGhlIGludGVycHJldGVyIGFuZCBkeW5hbWljYWxseQorICAgbG9hZGVkIG1vZHVsZXMuICBUaGVzZSBhcmUgZGlhZ25vc2VkIGJ5IGFuIGVycm9yIG1lc3NhZ2UgYnV0CisgICB0aGUgbW9kdWxlIGlzIHN0aWxsIGxvYWRlZCAoYmVjYXVzZSB0aGUgbWlzbWF0Y2ggY2FuIG9ubHkgYmUgdGVzdGVkCisgICBhZnRlciBsb2FkaW5nIHRoZSBtb2R1bGUpLiAgVGhlIGVycm9yIG1lc3NhZ2UgaXMgaW50ZW5kZWQgdG8KKyAgIGV4cGxhaW4gdGhlIGNvcmUgZHVtcCBhIGZldyBzZWNvbmRzIGxhdGVyLgorCisgICBUaGUgc3ltYm9sIFBZVEhPTl9BUElfU1RSSU5HIGRlZmluZXMgdGhlIHNhbWUgdmFsdWUgYXMgYSBzdHJpbmcKKyAgIGxpdGVyYWwuICAqKiogUExFQVNFIE1BS0UgU1VSRSBUSEUgREVGSU5JVElPTlMgTUFUQ0guICoqKgorCisgICBQbGVhc2UgYWRkIGEgbGluZSBvciB0d28gdG8gdGhlIHRvcCBvZiB0aGlzIGxvZyBmb3IgZWFjaCBBUEkKKyAgIHZlcnNpb24gY2hhbmdlOgorCisgICAyMi1GZWItMjAwNiAgTXZMCTEwMTMJUEVQIDM1MyAtIGxvbmcgaW5kaWNlcyBmb3Igc2VxdWVuY2UgbGVuZ3RocworCisgICAxOS1BdWctMjAwMiAgR3ZSCTEwMTIJQ2hhbmdlcyB0byBzdHJpbmcgb2JqZWN0IHN0cnVjdCBmb3IKKyAgIAkJCQlpbnRlcm5pbmcgY2hhbmdlcywgc2F2aW5nIDMgYnl0ZXMuCisKKyAgIDE3LUp1bC0yMDAxCUd2UgkxMDExCURlc2NyLWJyYW5jaCwganVzdCB0byBiZSBvbiB0aGUgc2FmZSBzaWRlCisKKyAgIDI1LUphbi0yMDAxICBGTEQgICAgIDEwMTAgICAgUGFyYW1ldGVycyBhZGRlZCB0byBQeUNvZGVfTmV3KCkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnJhbWVfTmV3KCk7IFB5dGhvbiAyLjFhMgorCisgICAxNC1NYXItMjAwMCAgR3ZSICAgICAxMDA5ICAgIFVuaWNvZGUgQVBJIGFkZGVkCisKKyAgIDMtSmFuLTE5OTkJR3ZSCTEwMDcJRGVjaWRlZCB0byBjaGFuZ2UgYmFjayEgIChEb24ndCByZXVzZSAxMDA4ISkKKworICAgMy1EZWMtMTk5OAlHdlIJMTAwOAlQeXRob24gMS41LjJiMQorCisgICAxOC1KYW4tMTk5NwlHdlIJMTAwNwlzdHJpbmcgaW50ZXJuaW5nIGFuZCBvdGhlciBzcGVlZHVwcworCisgICAxMS1PY3QtMTk5NglHdlIJcmVuYW1lZCBQeV9FbGxpcHNlcyB0byBQeV9FbGxpcHNpcyA6LSgKKworICAgMzAtSnVsLTE5OTYJR3ZSCVNsaWNlIGFuZCBlbGxpcHNlcyBzeW50YXggYWRkZWQKKworICAgMjMtSnVsLTE5OTYJR3ZSCUZvciAxLjQgLS0gYmV0dGVyIHNhZmUgdGhhbiBzb3JyeSB0aGlzIHRpbWUgOi0pCisKKyAgIDctTm92LTE5OTUJR3ZSCUtleXdvcmQgYXJndW1lbnRzIChzaG91bGQndmUgYmVlbiBkb25lIGF0IDEuMyA6LSggKQorCisgICAxMC1KYW4tMTk5NQlHdlIJUmVuYW1lZCBnbG9iYWxzIHRvIG5ldyBuYW1pbmcgc2NoZW1lCisKKyAgIDktSmFuLTE5OTUJR3ZSCUluaXRpYWwgdmVyc2lvbiAoaW5jb21wYXRpYmxlIHdpdGggb2xkZXIgQVBJKQorKi8KKworI2lmZGVmIE1TX1dJTkRPV1MKKy8qIFNwZWNpYWwgZGVmaW5lcyBmb3IgV2luZG93cyB2ZXJzaW9ucyB1c2VkIHRvIGxpdmUgaGVyZS4gIFRoaW5ncworICAgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhlICJWZXJzaW9uIiBpcyBub3cgaW4gYSBnbG9iYWwgc3RyaW5nIHZhcmlhYmxlLgorICAgUmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhpcyBmb3IgZWFzaWVyIGJyYW5kaW5nIG9mIGEgImN1c3RvbSBETEwiCisgICB3aXRob3V0IGFjdHVhbGx5IG5lZWRpbmcgYSByZWNvbXBpbGUuICAqLworI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KKworI2lmIFNJWkVPRl9TSVpFX1QgIT0gU0laRU9GX0lOVAorLyogT24gYSA2NC1iaXQgc3lzdGVtLCByZW5hbWUgdGhlIFB5X0luaXRNb2R1bGU0IHNvIHRoYXQgMi40CisgICBtb2R1bGVzIGNhbm5vdCBnZXQgbG9hZGVkIGludG8gYSAyLjUgaW50ZXJwcmV0ZXIgKi8KKyNkZWZpbmUgUHlfSW5pdE1vZHVsZTQgUHlfSW5pdE1vZHVsZTRfNjQKKyNlbmRpZgorCisjaWZkZWYgUHlfVFJBQ0VfUkVGUworIC8qIFdoZW4gd2UgYXJlIHRyYWNpbmcgcmVmZXJlbmNlIGNvdW50cywgcmVuYW1lIFB5X0luaXRNb2R1bGU0IHNvCisgICAgbW9kdWxlcyBjb21waWxlZCB3aXRoIGluY29tcGF0aWJsZSBzZXR0aW5ncyB3aWxsIGdlbmVyYXRlIGEKKyAgICBsaW5rLXRpbWUgZXJyb3IuICovCisgI2lmIFNJWkVPRl9TSVpFX1QgIT0gU0laRU9GX0lOVAorICN1bmRlZiBQeV9Jbml0TW9kdWxlNAorICNkZWZpbmUgUHlfSW5pdE1vZHVsZTQgUHlfSW5pdE1vZHVsZTRUcmFjZVJlZnNfNjQKKyAjZWxzZQorICNkZWZpbmUgUHlfSW5pdE1vZHVsZTQgUHlfSW5pdE1vZHVsZTRUcmFjZVJlZnMKKyAjZW5kaWYKKyNlbmRpZgorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5X0luaXRNb2R1bGU0KGNvbnN0IGNoYXIgKm5hbWUsIFB5TWV0aG9kRGVmICptZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkb2MsIFB5T2JqZWN0ICpzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBpdmVyKTsKKworI2RlZmluZSBQeV9Jbml0TW9kdWxlKG5hbWUsIG1ldGhvZHMpIFwKKwlQeV9Jbml0TW9kdWxlNChuYW1lLCBtZXRob2RzLCAoY2hhciAqKU5VTEwsIChQeU9iamVjdCAqKU5VTEwsIFwKKwkJICAgICAgIFBZVEhPTl9BUElfVkVSU0lPTikKKworI2RlZmluZSBQeV9Jbml0TW9kdWxlMyhuYW1lLCBtZXRob2RzLCBkb2MpIFwKKwlQeV9Jbml0TW9kdWxlNChuYW1lLCBtZXRob2RzLCBkb2MsIChQeU9iamVjdCAqKU5VTEwsIFwKKwkJICAgICAgIFBZVEhPTl9BUElfVkVSU0lPTikKKworUHlBUElfREFUQShjaGFyICopIF9QeV9QYWNrYWdlQ29udGV4dDsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfTU9EU1VQUE9SVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9tb2R1bGVvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L21vZHVsZW9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODdmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9tb2R1bGVvYmplY3QuaApAQCAtMCwwICsxLDI0IEBACisKKy8qIE1vZHVsZSBvYmplY3QgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfTU9EVUxFT0JKRUNUX0gKKyNkZWZpbmUgUHlfTU9EVUxFT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5TW9kdWxlX1R5cGU7CisKKyNkZWZpbmUgUHlNb2R1bGVfQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgJlB5TW9kdWxlX1R5cGUpCisjZGVmaW5lIFB5TW9kdWxlX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlNb2R1bGVfVHlwZSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU1vZHVsZV9OZXcoY29uc3QgY2hhciAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlNb2R1bGVfR2V0RGljdChQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoY2hhciAqKSBQeU1vZHVsZV9HZXROYW1lKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhjaGFyICopIFB5TW9kdWxlX0dldEZpbGVuYW1lKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh2b2lkKSBfUHlNb2R1bGVfQ2xlYXIoUHlPYmplY3QgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X01PRFVMRU9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9ub2RlLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9ub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkZTNiOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L25vZGUuaApAQCAtMCwwICsxLDQzIEBACisKKy8qIFBhcnNlIHRyZWUgbm9kZSBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9OT0RFX0gKKyNkZWZpbmUgUHlfTk9ERV9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IF9ub2RlIHsKKyAgICBzaG9ydAkJbl90eXBlOworICAgIGNoYXIJCSpuX3N0cjsKKyAgICBpbnQJCQluX2xpbmVubzsKKyAgICBpbnQJCQluX2NvbF9vZmZzZXQ7CisgICAgaW50CQkJbl9uY2hpbGRyZW47CisgICAgc3RydWN0IF9ub2RlCSpuX2NoaWxkOworfSBub2RlOworCitQeUFQSV9GVU5DKG5vZGUgKikgUHlOb2RlX05ldyhpbnQgdHlwZSk7CitQeUFQSV9GVU5DKGludCkgUHlOb2RlX0FkZENoaWxkKG5vZGUgKm4sIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdHIsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0KTsKK1B5QVBJX0ZVTkModm9pZCkgUHlOb2RlX0ZyZWUobm9kZSAqbik7CisjaWZuZGVmIFB5X0xJTUlURURfQVBJCitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIF9QeU5vZGVfU2l6ZU9mKG5vZGUgKm4pOworI2VuZGlmCisKKy8qIE5vZGUgYWNjZXNzIGZ1bmN0aW9ucyAqLworI2RlZmluZSBOQ0gobikJCSgobiktPm5fbmNoaWxkcmVuKQorCQorI2RlZmluZSBDSElMRChuLCBpKQkoJihuKS0+bl9jaGlsZFtpXSkKKyNkZWZpbmUgUkNISUxEKG4sIGkpCShDSElMRChuLCBOQ0gobikgKyBpKSkKKyNkZWZpbmUgVFlQRShuKQkJKChuKS0+bl90eXBlKQorI2RlZmluZSBTVFIobikJCSgobiktPm5fc3RyKQorCisvKiBBc3NlcnQgdGhhdCB0aGUgdHlwZSBvZiBhIG5vZGUgaXMgd2hhdCB3ZSBleHBlY3QgKi8KKyNkZWZpbmUgUkVRKG4sIHR5cGUpIGFzc2VydChUWVBFKG4pID09ICh0eXBlKSkKKworUHlBUElfRlVOQyh2b2lkKSBQeU5vZGVfTGlzdFRyZWUobm9kZSAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfTk9ERV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9vYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L29iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYmM2OGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9vYmplY3QuaApAQCAtMCwwICsxLDEwMTEgQEAKKyNpZm5kZWYgUHlfT0JKRUNUX0gKKyNkZWZpbmUgUHlfT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBPYmplY3QgYW5kIHR5cGUgb2JqZWN0IGludGVyZmFjZSAqLworCisvKgorT2JqZWN0cyBhcmUgc3RydWN0dXJlcyBhbGxvY2F0ZWQgb24gdGhlIGhlYXAuICBTcGVjaWFsIHJ1bGVzIGFwcGx5IHRvCit0aGUgdXNlIG9mIG9iamVjdHMgdG8gZW5zdXJlIHRoZXkgYXJlIHByb3Blcmx5IGdhcmJhZ2UtY29sbGVjdGVkLgorT2JqZWN0cyBhcmUgbmV2ZXIgYWxsb2NhdGVkIHN0YXRpY2FsbHkgb3Igb24gdGhlIHN0YWNrOyB0aGV5IG11c3QgYmUKK2FjY2Vzc2VkIHRocm91Z2ggc3BlY2lhbCBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBvbmx5LiAgKFR5cGUgb2JqZWN0cyBhcmUKK2V4Y2VwdGlvbnMgdG8gdGhlIGZpcnN0IHJ1bGU7IHRoZSBzdGFuZGFyZCB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgYnkKK3N0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgdHlwZSBvYmplY3RzLCBhbHRob3VnaCB3b3JrIG9uIHR5cGUvY2xhc3MgdW5pZmljYXRpb24KK2ZvciBQeXRob24gMi4yIG1hZGUgaXQgcG9zc2libGUgdG8gaGF2ZSBoZWFwLWFsbG9jYXRlZCB0eXBlIG9iamVjdHMgdG9vKS4KKworQW4gb2JqZWN0IGhhcyBhICdyZWZlcmVuY2UgY291bnQnIHRoYXQgaXMgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZCB3aGVuIGEKK3BvaW50ZXIgdG8gdGhlIG9iamVjdCBpcyBjb3BpZWQgb3IgZGVsZXRlZDsgd2hlbiB0aGUgcmVmZXJlbmNlIGNvdW50CityZWFjaGVzIHplcm8gdGhlcmUgYXJlIG5vIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdCBsZWZ0IGFuZCBpdCBjYW4gYmUKK3JlbW92ZWQgZnJvbSB0aGUgaGVhcC4KKworQW4gb2JqZWN0IGhhcyBhICd0eXBlJyB0aGF0IGRldGVybWluZXMgd2hhdCBpdCByZXByZXNlbnRzIGFuZCB3aGF0IGtpbmQKK29mIGRhdGEgaXQgY29udGFpbnMuICBBbiBvYmplY3QncyB0eXBlIGlzIGZpeGVkIHdoZW4gaXQgaXMgY3JlYXRlZC4KK1R5cGVzIHRoZW1zZWx2ZXMgYXJlIHJlcHJlc2VudGVkIGFzIG9iamVjdHM7IGFuIG9iamVjdCBjb250YWlucyBhCitwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgb2JqZWN0LiAgVGhlIHR5cGUgaXRzZWxmIGhhcyBhIHR5cGUKK3BvaW50ZXIgcG9pbnRpbmcgdG8gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHR5cGUgJ3R5cGUnLCB3aGljaAorY29udGFpbnMgYSBwb2ludGVyIHRvIGl0c2VsZiEpLgorCitPYmplY3RzIGRvIG5vdCBmbG9hdCBhcm91bmQgaW4gbWVtb3J5OyBvbmNlIGFsbG9jYXRlZCBhbiBvYmplY3Qga2VlcHMKK3RoZSBzYW1lIHNpemUgYW5kIGFkZHJlc3MuICBPYmplY3RzIHRoYXQgbXVzdCBob2xkIHZhcmlhYmxlLXNpemUgZGF0YQorY2FuIGNvbnRhaW4gcG9pbnRlcnMgdG8gdmFyaWFibGUtc2l6ZSBwYXJ0cyBvZiB0aGUgb2JqZWN0LiAgTm90IGFsbAorb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGhhdmUgdGhlIHNhbWUgc2l6ZTsgYnV0IHRoZSBzaXplIGNhbm5vdCBjaGFuZ2UKK2FmdGVyIGFsbG9jYXRpb24uICAoVGhlc2UgcmVzdHJpY3Rpb25zIGFyZSBtYWRlIHNvIGEgcmVmZXJlbmNlIHRvIGFuCitvYmplY3QgY2FuIGJlIHNpbXBseSBhIHBvaW50ZXIgLS0gbW92aW5nIGFuIG9iamVjdCB3b3VsZCByZXF1aXJlCit1cGRhdGluZyBhbGwgdGhlIHBvaW50ZXJzLCBhbmQgY2hhbmdpbmcgYW4gb2JqZWN0J3Mgc2l6ZSB3b3VsZCByZXF1aXJlCittb3ZpbmcgaXQgaWYgdGhlcmUgd2FzIGFub3RoZXIgb2JqZWN0IHJpZ2h0IG5leHQgdG8gaXQuKQorCitPYmplY3RzIGFyZSBhbHdheXMgYWNjZXNzZWQgdGhyb3VnaCBwb2ludGVycyBvZiB0aGUgdHlwZSAnUHlPYmplY3QgKicuCitUaGUgdHlwZSAnUHlPYmplY3QnIGlzIGEgc3RydWN0dXJlIHRoYXQgb25seSBjb250YWlucyB0aGUgcmVmZXJlbmNlIGNvdW50CithbmQgdGhlIHR5cGUgcG9pbnRlci4gIFRoZSBhY3R1YWwgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYW4gb2JqZWN0Citjb250YWlucyBvdGhlciBkYXRhIHRoYXQgY2FuIG9ubHkgYmUgYWNjZXNzZWQgYWZ0ZXIgY2FzdGluZyB0aGUgcG9pbnRlcgordG8gYSBwb2ludGVyIHRvIGEgbG9uZ2VyIHN0cnVjdHVyZSB0eXBlLiAgVGhpcyBsb25nZXIgdHlwZSBtdXN0IHN0YXJ0Cit3aXRoIHRoZSByZWZlcmVuY2UgY291bnQgYW5kIHR5cGUgZmllbGRzOyB0aGUgbWFjcm8gUHlPYmplY3RfSEVBRCBzaG91bGQgYmUKK3VzZWQgZm9yIHRoaXMgKHRvIGFjY29tbW9kYXRlIGZvciBmdXR1cmUgY2hhbmdlcykuICBUaGUgaW1wbGVtZW50YXRpb24KK29mIGEgcGFydGljdWxhciBvYmplY3QgdHlwZSBjYW4gY2FzdCB0aGUgb2JqZWN0IHBvaW50ZXIgdG8gdGhlIHByb3BlcgordHlwZSBhbmQgYmFjay4KKworQSBzdGFuZGFyZCBpbnRlcmZhY2UgZXhpc3RzIGZvciBvYmplY3RzIHRoYXQgY29udGFpbiBhbiBhcnJheSBvZiBpdGVtcword2hvc2Ugc2l6ZSBpcyBkZXRlcm1pbmVkIHdoZW4gdGhlIG9iamVjdCBpcyBhbGxvY2F0ZWQuCisqLworCisvKiBQeV9ERUJVRyBpbXBsaWVzIFB5X1RSQUNFX1JFRlMuICovCisjaWYgZGVmaW5lZChQeV9ERUJVRykgJiYgIWRlZmluZWQoUHlfVFJBQ0VfUkVGUykKKyNkZWZpbmUgUHlfVFJBQ0VfUkVGUworI2VuZGlmCisKKy8qIFB5X1RSQUNFX1JFRlMgaW1wbGllcyBQeV9SRUZfREVCVUcuICovCisjaWYgZGVmaW5lZChQeV9UUkFDRV9SRUZTKSAmJiAhZGVmaW5lZChQeV9SRUZfREVCVUcpCisjZGVmaW5lIFB5X1JFRl9ERUJVRworI2VuZGlmCisKKyNpZmRlZiBQeV9UUkFDRV9SRUZTCisvKiBEZWZpbmUgcG9pbnRlcnMgdG8gc3VwcG9ydCBhIGRvdWJseS1saW5rZWQgbGlzdCBvZiBhbGwgbGl2ZSBoZWFwIG9iamVjdHMuICovCisjZGVmaW5lIF9QeU9iamVjdF9IRUFEX0VYVFJBICAgICAgICAgICAgXAorICAgIHN0cnVjdCBfb2JqZWN0ICpfb2JfbmV4dDsgICAgICAgICAgIFwKKyAgICBzdHJ1Y3QgX29iamVjdCAqX29iX3ByZXY7CisKKyNkZWZpbmUgX1B5T2JqZWN0X0VYVFJBX0lOSVQgMCwgMCwKKworI2Vsc2UKKyNkZWZpbmUgX1B5T2JqZWN0X0hFQURfRVhUUkEKKyNkZWZpbmUgX1B5T2JqZWN0X0VYVFJBX0lOSVQKKyNlbmRpZgorCisvKiBQeU9iamVjdF9IRUFEIGRlZmluZXMgdGhlIGluaXRpYWwgc2VnbWVudCBvZiBldmVyeSBQeU9iamVjdC4gKi8KKyNkZWZpbmUgUHlPYmplY3RfSEVBRCAgICAgICAgICAgICAgICAgICBcCisgICAgX1B5T2JqZWN0X0hFQURfRVhUUkEgICAgICAgICAgICAgICAgXAorICAgIFB5X3NzaXplX3Qgb2JfcmVmY250OyAgICAgICAgICAgICAgIFwKKyAgICBzdHJ1Y3QgX3R5cGVvYmplY3QgKm9iX3R5cGU7CisKKyNkZWZpbmUgUHlPYmplY3RfSEVBRF9JTklUKHR5cGUpICAgICAgICBcCisgICAgX1B5T2JqZWN0X0VYVFJBX0lOSVQgICAgICAgICAgICAgICAgXAorICAgIDEsIHR5cGUsCisKKyNkZWZpbmUgUHlWYXJPYmplY3RfSEVBRF9JTklUKHR5cGUsIHNpemUpICAgICAgIFwKKyAgICBQeU9iamVjdF9IRUFEX0lOSVQodHlwZSkgc2l6ZSwKKworLyogUHlPYmplY3RfVkFSX0hFQUQgZGVmaW5lcyB0aGUgaW5pdGlhbCBzZWdtZW50IG9mIGFsbCB2YXJpYWJsZS1zaXplCisgKiBjb250YWluZXIgb2JqZWN0cy4gIFRoZXNlIGVuZCB3aXRoIGEgZGVjbGFyYXRpb24gb2YgYW4gYXJyYXkgd2l0aCAxCisgKiBlbGVtZW50LCBidXQgZW5vdWdoIHNwYWNlIGlzIG1hbGxvYydlZCBzbyB0aGF0IHRoZSBhcnJheSBhY3R1YWxseQorICogaGFzIHJvb20gZm9yIG9iX3NpemUgZWxlbWVudHMuICBOb3RlIHRoYXQgb2Jfc2l6ZSBpcyBhbiBlbGVtZW50IGNvdW50LAorICogbm90IG5lY2Vzc2FyaWx5IGEgYnl0ZSBjb3VudC4KKyAqLworI2RlZmluZSBQeU9iamVjdF9WQVJfSEVBRCAgICAgICAgICAgICAgIFwKKyAgICBQeU9iamVjdF9IRUFEICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUHlfc3NpemVfdCBvYl9zaXplOyAvKiBOdW1iZXIgb2YgaXRlbXMgaW4gdmFyaWFibGUgcGFydCAqLworI2RlZmluZSBQeV9JTlZBTElEX1NJWkUgKFB5X3NzaXplX3QpLTEKKworLyogTm90aGluZyBpcyBhY3R1YWxseSBkZWNsYXJlZCB0byBiZSBhIFB5T2JqZWN0LCBidXQgZXZlcnkgcG9pbnRlciB0bworICogYSBQeXRob24gb2JqZWN0IGNhbiBiZSBjYXN0IHRvIGEgUHlPYmplY3QqLiAgVGhpcyBpcyBpbmhlcml0YW5jZSBidWlsdAorICogYnkgaGFuZC4gIFNpbWlsYXJseSBldmVyeSBwb2ludGVyIHRvIGEgdmFyaWFibGUtc2l6ZSBQeXRob24gb2JqZWN0IGNhbiwKKyAqIGluIGFkZGl0aW9uLCBiZSBjYXN0IHRvIFB5VmFyT2JqZWN0Ki4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgX29iamVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorfSBQeU9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X1ZBUl9IRUFECit9IFB5VmFyT2JqZWN0OworCisjZGVmaW5lIFB5X1JFRkNOVChvYikgICAgICAgICAgICgoKFB5T2JqZWN0Kikob2IpKS0+b2JfcmVmY250KQorI2RlZmluZSBQeV9UWVBFKG9iKSAgICAgICAgICAgICAoKChQeU9iamVjdCopKG9iKSktPm9iX3R5cGUpCisjZGVmaW5lIFB5X1NJWkUob2IpICAgICAgICAgICAgICgoKFB5VmFyT2JqZWN0Kikob2IpKS0+b2Jfc2l6ZSkKKworLyoKK1R5cGUgb2JqZWN0cyBjb250YWluIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHR5cGUgbmFtZSAodG8gaGVscCBzb21ld2hhdAoraW4gZGVidWdnaW5nKSwgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycyAoc2VlIFB5T2JqZWN0X05ldygpIGFuZAorUHlPYmplY3RfTmV3VmFyKCkpLAorYW5kIG1ldGhvZHMgZm9yIGFjY2Vzc2luZyBvYmplY3RzIG9mIHRoZSB0eXBlLiAgTWV0aG9kcyBhcmUgb3B0aW9uYWwsIGEKK25pbCBwb2ludGVyIG1lYW5pbmcgdGhhdCBwYXJ0aWN1bGFyIGtpbmQgb2YgYWNjZXNzIGlzIG5vdCBhdmFpbGFibGUgZm9yCit0aGlzIHR5cGUuICBUaGUgUHlfREVDUkVGKCkgbWFjcm8gdXNlcyB0aGUgdHBfZGVhbGxvYyBtZXRob2Qgd2l0aG91dAorY2hlY2tpbmcgZm9yIGEgbmlsIHBvaW50ZXI7IGl0IHNob3VsZCBhbHdheXMgYmUgaW1wbGVtZW50ZWQgZXhjZXB0IGlmCit0aGUgaW1wbGVtZW50YXRpb24gY2FuIGd1YXJhbnRlZSB0aGF0IHRoZSByZWZlcmVuY2UgY291bnQgd2lsbCBuZXZlcgorcmVhY2ggemVybyAoZS5nLiwgZm9yIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHR5cGUgb2JqZWN0cykuCisKK05COiB0aGUgbWV0aG9kcyBmb3IgY2VydGFpbiB0eXBlIGdyb3VwcyBhcmUgbm93IGNvbnRhaW5lZCBpbiBzZXBhcmF0ZQorbWV0aG9kIGJsb2Nrcy4KKyovCisKK3R5cGVkZWYgUHlPYmplY3QgKiAoKnVuYXJ5ZnVuYykoUHlPYmplY3QgKik7Cit0eXBlZGVmIFB5T2JqZWN0ICogKCpiaW5hcnlmdW5jKShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgUHlPYmplY3QgKiAoKnRlcm5hcnlmdW5jKShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgaW50ICgqaW5xdWlyeSkoUHlPYmplY3QgKik7Cit0eXBlZGVmIFB5X3NzaXplX3QgKCpsZW5mdW5jKShQeU9iamVjdCAqKTsKK3R5cGVkZWYgaW50ICgqY29lcmNpb24pKFB5T2JqZWN0ICoqLCBQeU9iamVjdCAqKik7Cit0eXBlZGVmIFB5T2JqZWN0ICooKmludGFyZ2Z1bmMpKFB5T2JqZWN0ICosIGludCkgUHlfREVQUkVDQVRFRCgyLjUpOwordHlwZWRlZiBQeU9iamVjdCAqKCppbnRpbnRhcmdmdW5jKShQeU9iamVjdCAqLCBpbnQsIGludCkgUHlfREVQUkVDQVRFRCgyLjUpOwordHlwZWRlZiBQeU9iamVjdCAqKCpzc2l6ZWFyZ2Z1bmMpKFB5T2JqZWN0ICosIFB5X3NzaXplX3QpOwordHlwZWRlZiBQeU9iamVjdCAqKCpzc2l6ZXNzaXplYXJnZnVuYykoUHlPYmplY3QgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCk7Cit0eXBlZGVmIGludCgqaW50b2JqYXJncHJvYykoUHlPYmplY3QgKiwgaW50LCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgaW50KCppbnRpbnRvYmphcmdwcm9jKShQeU9iamVjdCAqLCBpbnQsIGludCwgUHlPYmplY3QgKik7Cit0eXBlZGVmIGludCgqc3NpemVvYmphcmdwcm9jKShQeU9iamVjdCAqLCBQeV9zc2l6ZV90LCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgaW50KCpzc2l6ZXNzaXplb2JqYXJncHJvYykoUHlPYmplY3QgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlPYmplY3QgKik7Cit0eXBlZGVmIGludCgqb2Jqb2JqYXJncHJvYykoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKKworCisvKiBpbnQtYmFzZWQgYnVmZmVyIGludGVyZmFjZSAqLwordHlwZWRlZiBpbnQgKCpnZXRyZWFkYnVmZmVycHJvYykoUHlPYmplY3QgKiwgaW50LCB2b2lkICoqKTsKK3R5cGVkZWYgaW50ICgqZ2V0d3JpdGVidWZmZXJwcm9jKShQeU9iamVjdCAqLCBpbnQsIHZvaWQgKiopOwordHlwZWRlZiBpbnQgKCpnZXRzZWdjb3VudHByb2MpKFB5T2JqZWN0ICosIGludCAqKTsKK3R5cGVkZWYgaW50ICgqZ2V0Y2hhcmJ1ZmZlcnByb2MpKFB5T2JqZWN0ICosIGludCwgY2hhciAqKik7CisvKiBzc2l6ZV90LWJhc2VkIGJ1ZmZlciBpbnRlcmZhY2UgKi8KK3R5cGVkZWYgUHlfc3NpemVfdCAoKnJlYWRidWZmZXJwcm9jKShQeU9iamVjdCAqLCBQeV9zc2l6ZV90LCB2b2lkICoqKTsKK3R5cGVkZWYgUHlfc3NpemVfdCAoKndyaXRlYnVmZmVycHJvYykoUHlPYmplY3QgKiwgUHlfc3NpemVfdCwgdm9pZCAqKik7Cit0eXBlZGVmIFB5X3NzaXplX3QgKCpzZWdjb3VudHByb2MpKFB5T2JqZWN0ICosIFB5X3NzaXplX3QgKik7Cit0eXBlZGVmIFB5X3NzaXplX3QgKCpjaGFyYnVmZmVycHJvYykoUHlPYmplY3QgKiwgUHlfc3NpemVfdCwgY2hhciAqKik7CisKKworLyogUHkzayBidWZmZXIgaW50ZXJmYWNlICovCit0eXBlZGVmIHN0cnVjdCBidWZmZXJpbmZvIHsKKyAgICB2b2lkICpidWY7CisgICAgUHlPYmplY3QgKm9iajsgICAgICAgIC8qIG93bmVkIHJlZmVyZW5jZSAqLworICAgIFB5X3NzaXplX3QgbGVuOworICAgIFB5X3NzaXplX3QgaXRlbXNpemU7ICAvKiBUaGlzIGlzIFB5X3NzaXplX3Qgc28gaXQgY2FuIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgdG8gYnkgc3RyaWRlcyBpbiBzaW1wbGUgY2FzZS4qLworICAgIGludCByZWFkb25seTsKKyAgICBpbnQgbmRpbTsKKyAgICBjaGFyICpmb3JtYXQ7CisgICAgUHlfc3NpemVfdCAqc2hhcGU7CisgICAgUHlfc3NpemVfdCAqc3RyaWRlczsKKyAgICBQeV9zc2l6ZV90ICpzdWJvZmZzZXRzOworICAgIFB5X3NzaXplX3Qgc21hbGx0YWJsZVsyXTsgIC8qIHN0YXRpYyBzdG9yZSBmb3Igc2hhcGUgYW5kIHN0cmlkZXMgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25vLWRpbWVuc2lvbmFsIGJ1ZmZlcnMuICovCisgICAgdm9pZCAqaW50ZXJuYWw7Cit9IFB5X2J1ZmZlcjsKKwordHlwZWRlZiBpbnQgKCpnZXRidWZmZXJwcm9jKShQeU9iamVjdCAqLCBQeV9idWZmZXIgKiwgaW50KTsKK3R5cGVkZWYgdm9pZCAoKnJlbGVhc2VidWZmZXJwcm9jKShQeU9iamVjdCAqLCBQeV9idWZmZXIgKik7CisKKyAgICAvKiBGbGFncyBmb3IgZ2V0dGluZyBidWZmZXJzICovCisjZGVmaW5lIFB5QlVGX1NJTVBMRSAwCisjZGVmaW5lIFB5QlVGX1dSSVRBQkxFIDB4MDAwMQorLyogIHdlIHVzZWQgdG8gaW5jbHVkZSBhbiBFLCBiYWNrd2FyZHMgY29tcGF0aWJsZSBhbGlhcyAgKi8KKyNkZWZpbmUgUHlCVUZfV1JJVEVBQkxFIFB5QlVGX1dSSVRBQkxFCisjZGVmaW5lIFB5QlVGX0ZPUk1BVCAweDAwMDQKKyNkZWZpbmUgUHlCVUZfTkQgMHgwMDA4CisjZGVmaW5lIFB5QlVGX1NUUklERVMgKDB4MDAxMCB8IFB5QlVGX05EKQorI2RlZmluZSBQeUJVRl9DX0NPTlRJR1VPVVMgKDB4MDAyMCB8IFB5QlVGX1NUUklERVMpCisjZGVmaW5lIFB5QlVGX0ZfQ09OVElHVU9VUyAoMHgwMDQwIHwgUHlCVUZfU1RSSURFUykKKyNkZWZpbmUgUHlCVUZfQU5ZX0NPTlRJR1VPVVMgKDB4MDA4MCB8IFB5QlVGX1NUUklERVMpCisjZGVmaW5lIFB5QlVGX0lORElSRUNUICgweDAxMDAgfCBQeUJVRl9TVFJJREVTKQorCisjZGVmaW5lIFB5QlVGX0NPTlRJRyAoUHlCVUZfTkQgfCBQeUJVRl9XUklUQUJMRSkKKyNkZWZpbmUgUHlCVUZfQ09OVElHX1JPIChQeUJVRl9ORCkKKworI2RlZmluZSBQeUJVRl9TVFJJREVEIChQeUJVRl9TVFJJREVTIHwgUHlCVUZfV1JJVEFCTEUpCisjZGVmaW5lIFB5QlVGX1NUUklERURfUk8gKFB5QlVGX1NUUklERVMpCisKKyNkZWZpbmUgUHlCVUZfUkVDT1JEUyAoUHlCVUZfU1RSSURFUyB8IFB5QlVGX1dSSVRBQkxFIHwgUHlCVUZfRk9STUFUKQorI2RlZmluZSBQeUJVRl9SRUNPUkRTX1JPIChQeUJVRl9TVFJJREVTIHwgUHlCVUZfRk9STUFUKQorCisjZGVmaW5lIFB5QlVGX0ZVTEwgKFB5QlVGX0lORElSRUNUIHwgUHlCVUZfV1JJVEFCTEUgfCBQeUJVRl9GT1JNQVQpCisjZGVmaW5lIFB5QlVGX0ZVTExfUk8gKFB5QlVGX0lORElSRUNUIHwgUHlCVUZfRk9STUFUKQorCisKKyNkZWZpbmUgUHlCVUZfUkVBRCAgMHgxMDAKKyNkZWZpbmUgUHlCVUZfV1JJVEUgMHgyMDAKKyNkZWZpbmUgUHlCVUZfU0hBRE9XIDB4NDAwCisvKiBlbmQgUHkzayBidWZmZXIgaW50ZXJmYWNlICovCisKK3R5cGVkZWYgaW50ICgqb2Jqb2JqcHJvYykoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7Cit0eXBlZGVmIGludCAoKnZpc2l0cHJvYykoUHlPYmplY3QgKiwgdm9pZCAqKTsKK3R5cGVkZWYgaW50ICgqdHJhdmVyc2Vwcm9jKShQeU9iamVjdCAqLCB2aXNpdHByb2MsIHZvaWQgKik7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBGb3IgbnVtYmVycyB3aXRob3V0IGZsYWcgYml0IFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyBzZXQsIGFsbAorICAgICAgIGFyZ3VtZW50cyBhcmUgZ3VhcmFudGVlZCB0byBiZSBvZiB0aGUgb2JqZWN0J3MgdHlwZSAobW9kdWxvCisgICAgICAgY29lcmNpb24gaGFja3MgLS0gaS5lLiBpZiB0aGUgdHlwZSdzIGNvZXJjaW9uIGZ1bmN0aW9uCisgICAgICAgcmV0dXJucyBvdGhlciB0eXBlcywgdGhlbiB0aGVzZSBhcmUgYWxsb3dlZCBhcyB3ZWxsKS4gIE51bWJlcnMgdGhhdAorICAgICAgIGhhdmUgdGhlIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyBmbGFnIGJpdCBzZXQgc2hvdWxkIGNoZWNrICpib3RoKgorICAgICAgIGFyZ3VtZW50cyBmb3IgcHJvcGVyIHR5cGUgYW5kIGltcGxlbWVudCB0aGUgbmVjZXNzYXJ5IGNvbnZlcnNpb25zCisgICAgICAgaW4gdGhlIHNsb3QgZnVuY3Rpb25zIHRoZW1zZWx2ZXMuICovCisKKyAgICBiaW5hcnlmdW5jIG5iX2FkZDsKKyAgICBiaW5hcnlmdW5jIG5iX3N1YnRyYWN0OworICAgIGJpbmFyeWZ1bmMgbmJfbXVsdGlwbHk7CisgICAgYmluYXJ5ZnVuYyBuYl9kaXZpZGU7CisgICAgYmluYXJ5ZnVuYyBuYl9yZW1haW5kZXI7CisgICAgYmluYXJ5ZnVuYyBuYl9kaXZtb2Q7CisgICAgdGVybmFyeWZ1bmMgbmJfcG93ZXI7CisgICAgdW5hcnlmdW5jIG5iX25lZ2F0aXZlOworICAgIHVuYXJ5ZnVuYyBuYl9wb3NpdGl2ZTsKKyAgICB1bmFyeWZ1bmMgbmJfYWJzb2x1dGU7CisgICAgaW5xdWlyeSBuYl9ub256ZXJvOworICAgIHVuYXJ5ZnVuYyBuYl9pbnZlcnQ7CisgICAgYmluYXJ5ZnVuYyBuYl9sc2hpZnQ7CisgICAgYmluYXJ5ZnVuYyBuYl9yc2hpZnQ7CisgICAgYmluYXJ5ZnVuYyBuYl9hbmQ7CisgICAgYmluYXJ5ZnVuYyBuYl94b3I7CisgICAgYmluYXJ5ZnVuYyBuYl9vcjsKKyAgICBjb2VyY2lvbiBuYl9jb2VyY2U7CisgICAgdW5hcnlmdW5jIG5iX2ludDsKKyAgICB1bmFyeWZ1bmMgbmJfbG9uZzsKKyAgICB1bmFyeWZ1bmMgbmJfZmxvYXQ7CisgICAgdW5hcnlmdW5jIG5iX29jdDsKKyAgICB1bmFyeWZ1bmMgbmJfaGV4OworICAgIC8qIEFkZGVkIGluIHJlbGVhc2UgMi4wICovCisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2FkZDsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2Vfc3VidHJhY3Q7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX211bHRpcGx5OworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9kaXZpZGU7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3JlbWFpbmRlcjsKKyAgICB0ZXJuYXJ5ZnVuYyBuYl9pbnBsYWNlX3Bvd2VyOworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9sc2hpZnQ7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3JzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfYW5kOworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV94b3I7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX29yOworCisgICAgLyogQWRkZWQgaW4gcmVsZWFzZSAyLjIgKi8KKyAgICAvKiBUaGUgZm9sbG93aW5nIHJlcXVpcmUgdGhlIFB5X1RQRkxBR1NfSEFWRV9DTEFTUyBmbGFnICovCisgICAgYmluYXJ5ZnVuYyBuYl9mbG9vcl9kaXZpZGU7CisgICAgYmluYXJ5ZnVuYyBuYl90cnVlX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfZmxvb3JfZGl2aWRlOworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV90cnVlX2RpdmlkZTsKKworICAgIC8qIEFkZGVkIGluIHJlbGVhc2UgMi41ICovCisgICAgdW5hcnlmdW5jIG5iX2luZGV4OworfSBQeU51bWJlck1ldGhvZHM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBsZW5mdW5jIHNxX2xlbmd0aDsKKyAgICBiaW5hcnlmdW5jIHNxX2NvbmNhdDsKKyAgICBzc2l6ZWFyZ2Z1bmMgc3FfcmVwZWF0OworICAgIHNzaXplYXJnZnVuYyBzcV9pdGVtOworICAgIHNzaXplc3NpemVhcmdmdW5jIHNxX3NsaWNlOworICAgIHNzaXplb2JqYXJncHJvYyBzcV9hc3NfaXRlbTsKKyAgICBzc2l6ZXNzaXplb2JqYXJncHJvYyBzcV9hc3Nfc2xpY2U7CisgICAgb2Jqb2JqcHJvYyBzcV9jb250YWluczsKKyAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuMCAqLworICAgIGJpbmFyeWZ1bmMgc3FfaW5wbGFjZV9jb25jYXQ7CisgICAgc3NpemVhcmdmdW5jIHNxX2lucGxhY2VfcmVwZWF0OworfSBQeVNlcXVlbmNlTWV0aG9kczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGxlbmZ1bmMgbXBfbGVuZ3RoOworICAgIGJpbmFyeWZ1bmMgbXBfc3Vic2NyaXB0OworICAgIG9iam9iamFyZ3Byb2MgbXBfYXNzX3N1YnNjcmlwdDsKK30gUHlNYXBwaW5nTWV0aG9kczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHJlYWRidWZmZXJwcm9jIGJmX2dldHJlYWRidWZmZXI7CisgICAgd3JpdGVidWZmZXJwcm9jIGJmX2dldHdyaXRlYnVmZmVyOworICAgIHNlZ2NvdW50cHJvYyBiZl9nZXRzZWdjb3VudDsKKyAgICBjaGFyYnVmZmVycHJvYyBiZl9nZXRjaGFyYnVmZmVyOworICAgIGdldGJ1ZmZlcnByb2MgYmZfZ2V0YnVmZmVyOworICAgIHJlbGVhc2VidWZmZXJwcm9jIGJmX3JlbGVhc2VidWZmZXI7Cit9IFB5QnVmZmVyUHJvY3M7CisKKwordHlwZWRlZiB2b2lkICgqZnJlZWZ1bmMpKHZvaWQgKik7Cit0eXBlZGVmIHZvaWQgKCpkZXN0cnVjdG9yKShQeU9iamVjdCAqKTsKK3R5cGVkZWYgaW50ICgqcHJpbnRmdW5jKShQeU9iamVjdCAqLCBGSUxFICosIGludCk7Cit0eXBlZGVmIFB5T2JqZWN0ICooKmdldGF0dHJmdW5jKShQeU9iamVjdCAqLCBjaGFyICopOwordHlwZWRlZiBQeU9iamVjdCAqKCpnZXRhdHRyb2Z1bmMpKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwordHlwZWRlZiBpbnQgKCpzZXRhdHRyZnVuYykoUHlPYmplY3QgKiwgY2hhciAqLCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgaW50ICgqc2V0YXR0cm9mdW5jKShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgaW50ICgqY21wZnVuYykoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7Cit0eXBlZGVmIFB5T2JqZWN0ICooKnJlcHJmdW5jKShQeU9iamVjdCAqKTsKK3R5cGVkZWYgbG9uZyAoKmhhc2hmdW5jKShQeU9iamVjdCAqKTsKK3R5cGVkZWYgUHlPYmplY3QgKigqcmljaGNtcGZ1bmMpIChQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBpbnQpOwordHlwZWRlZiBQeU9iamVjdCAqKCpnZXRpdGVyZnVuYykgKFB5T2JqZWN0ICopOwordHlwZWRlZiBQeU9iamVjdCAqKCppdGVybmV4dGZ1bmMpIChQeU9iamVjdCAqKTsKK3R5cGVkZWYgUHlPYmplY3QgKigqZGVzY3JnZXRmdW5jKSAoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7Cit0eXBlZGVmIGludCAoKmRlc2Nyc2V0ZnVuYykgKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwordHlwZWRlZiBpbnQgKCppbml0cHJvYykoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7Cit0eXBlZGVmIFB5T2JqZWN0ICooKm5ld2Z1bmMpKHN0cnVjdCBfdHlwZW9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgUHlPYmplY3QgKigqYWxsb2NmdW5jKShzdHJ1Y3QgX3R5cGVvYmplY3QgKiwgUHlfc3NpemVfdCk7CisKK3R5cGVkZWYgc3RydWN0IF90eXBlb2JqZWN0IHsKKyAgICBQeU9iamVjdF9WQVJfSEVBRAorICAgIGNvbnN0IGNoYXIgKnRwX25hbWU7IC8qIEZvciBwcmludGluZywgaW4gZm9ybWF0ICI8bW9kdWxlPi48bmFtZT4iICovCisgICAgUHlfc3NpemVfdCB0cF9iYXNpY3NpemUsIHRwX2l0ZW1zaXplOyAvKiBGb3IgYWxsb2NhdGlvbiAqLworCisgICAgLyogTWV0aG9kcyB0byBpbXBsZW1lbnQgc3RhbmRhcmQgb3BlcmF0aW9ucyAqLworCisgICAgZGVzdHJ1Y3RvciB0cF9kZWFsbG9jOworICAgIHByaW50ZnVuYyB0cF9wcmludDsKKyAgICBnZXRhdHRyZnVuYyB0cF9nZXRhdHRyOworICAgIHNldGF0dHJmdW5jIHRwX3NldGF0dHI7CisgICAgY21wZnVuYyB0cF9jb21wYXJlOworICAgIHJlcHJmdW5jIHRwX3JlcHI7CisKKyAgICAvKiBNZXRob2Qgc3VpdGVzIGZvciBzdGFuZGFyZCBjbGFzc2VzICovCisKKyAgICBQeU51bWJlck1ldGhvZHMgKnRwX2FzX251bWJlcjsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyAqdHBfYXNfc2VxdWVuY2U7CisgICAgUHlNYXBwaW5nTWV0aG9kcyAqdHBfYXNfbWFwcGluZzsKKworICAgIC8qIE1vcmUgc3RhbmRhcmQgb3BlcmF0aW9ucyAoaGVyZSBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkpICovCisKKyAgICBoYXNoZnVuYyB0cF9oYXNoOworICAgIHRlcm5hcnlmdW5jIHRwX2NhbGw7CisgICAgcmVwcmZ1bmMgdHBfc3RyOworICAgIGdldGF0dHJvZnVuYyB0cF9nZXRhdHRybzsKKyAgICBzZXRhdHRyb2Z1bmMgdHBfc2V0YXR0cm87CisKKyAgICAvKiBGdW5jdGlvbnMgdG8gYWNjZXNzIG9iamVjdCBhcyBpbnB1dC9vdXRwdXQgYnVmZmVyICovCisgICAgUHlCdWZmZXJQcm9jcyAqdHBfYXNfYnVmZmVyOworCisgICAgLyogRmxhZ3MgdG8gZGVmaW5lIHByZXNlbmNlIG9mIG9wdGlvbmFsL2V4cGFuZGVkIGZlYXR1cmVzICovCisgICAgbG9uZyB0cF9mbGFnczsKKworICAgIGNvbnN0IGNoYXIgKnRwX2RvYzsgLyogRG9jdW1lbnRhdGlvbiBzdHJpbmcgKi8KKworICAgIC8qIEFzc2lnbmVkIG1lYW5pbmcgaW4gcmVsZWFzZSAyLjAgKi8KKyAgICAvKiBjYWxsIGZ1bmN0aW9uIGZvciBhbGwgYWNjZXNzaWJsZSBvYmplY3RzICovCisgICAgdHJhdmVyc2Vwcm9jIHRwX3RyYXZlcnNlOworCisgICAgLyogZGVsZXRlIHJlZmVyZW5jZXMgdG8gY29udGFpbmVkIG9iamVjdHMgKi8KKyAgICBpbnF1aXJ5IHRwX2NsZWFyOworCisgICAgLyogQXNzaWduZWQgbWVhbmluZyBpbiByZWxlYXNlIDIuMSAqLworICAgIC8qIHJpY2ggY29tcGFyaXNvbnMgKi8KKyAgICByaWNoY21wZnVuYyB0cF9yaWNoY29tcGFyZTsKKworICAgIC8qIHdlYWsgcmVmZXJlbmNlIGVuYWJsZXIgKi8KKyAgICBQeV9zc2l6ZV90IHRwX3dlYWtsaXN0b2Zmc2V0OworCisgICAgLyogQWRkZWQgaW4gcmVsZWFzZSAyLjIgKi8KKyAgICAvKiBJdGVyYXRvcnMgKi8KKyAgICBnZXRpdGVyZnVuYyB0cF9pdGVyOworICAgIGl0ZXJuZXh0ZnVuYyB0cF9pdGVybmV4dDsKKworICAgIC8qIEF0dHJpYnV0ZSBkZXNjcmlwdG9yIGFuZCBzdWJjbGFzc2luZyBzdHVmZiAqLworICAgIHN0cnVjdCBQeU1ldGhvZERlZiAqdHBfbWV0aG9kczsKKyAgICBzdHJ1Y3QgUHlNZW1iZXJEZWYgKnRwX21lbWJlcnM7CisgICAgc3RydWN0IFB5R2V0U2V0RGVmICp0cF9nZXRzZXQ7CisgICAgc3RydWN0IF90eXBlb2JqZWN0ICp0cF9iYXNlOworICAgIFB5T2JqZWN0ICp0cF9kaWN0OworICAgIGRlc2NyZ2V0ZnVuYyB0cF9kZXNjcl9nZXQ7CisgICAgZGVzY3JzZXRmdW5jIHRwX2Rlc2NyX3NldDsKKyAgICBQeV9zc2l6ZV90IHRwX2RpY3RvZmZzZXQ7CisgICAgaW5pdHByb2MgdHBfaW5pdDsKKyAgICBhbGxvY2Z1bmMgdHBfYWxsb2M7CisgICAgbmV3ZnVuYyB0cF9uZXc7CisgICAgZnJlZWZ1bmMgdHBfZnJlZTsgLyogTG93LWxldmVsIGZyZWUtbWVtb3J5IHJvdXRpbmUgKi8KKyAgICBpbnF1aXJ5IHRwX2lzX2djOyAvKiBGb3IgUHlPYmplY3RfSVNfR0MgKi8KKyAgICBQeU9iamVjdCAqdHBfYmFzZXM7CisgICAgUHlPYmplY3QgKnRwX21ybzsgLyogbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgKi8KKyAgICBQeU9iamVjdCAqdHBfY2FjaGU7CisgICAgUHlPYmplY3QgKnRwX3N1YmNsYXNzZXM7CisgICAgUHlPYmplY3QgKnRwX3dlYWtsaXN0OworICAgIGRlc3RydWN0b3IgdHBfZGVsOworCisgICAgLyogVHlwZSBhdHRyaWJ1dGUgY2FjaGUgdmVyc2lvbiB0YWcuIEFkZGVkIGluIHZlcnNpb24gMi42ICovCisgICAgdW5zaWduZWQgaW50IHRwX3ZlcnNpb25fdGFnOworCisjaWZkZWYgQ09VTlRfQUxMT0NTCisgICAgLyogdGhlc2UgbXVzdCBiZSBsYXN0IGFuZCBuZXZlciBleHBsaWNpdGx5IGluaXRpYWxpemVkICovCisgICAgUHlfc3NpemVfdCB0cF9hbGxvY3M7CisgICAgUHlfc3NpemVfdCB0cF9mcmVlczsKKyAgICBQeV9zc2l6ZV90IHRwX21heGFsbG9jOworICAgIHN0cnVjdCBfdHlwZW9iamVjdCAqdHBfcHJldjsKKyAgICBzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX25leHQ7CisjZW5kaWYKK30gUHlUeXBlT2JqZWN0OworCisKKy8qIFRoZSAqcmVhbCogbGF5b3V0IG9mIGEgdHlwZSBvYmplY3Qgd2hlbiBhbGxvY2F0ZWQgb24gdGhlIGhlYXAgKi8KK3R5cGVkZWYgc3RydWN0IF9oZWFwdHlwZW9iamVjdCB7CisgICAgLyogTm90ZTogdGhlcmUncyBhIGRlcGVuZGVuY3kgb24gdGhlIG9yZGVyIG9mIHRoZXNlIG1lbWJlcnMKKyAgICAgICBpbiBzbG90cHRyKCkgaW4gdHlwZW9iamVjdC5jIC4gKi8KKyAgICBQeVR5cGVPYmplY3QgaHRfdHlwZTsKKyAgICBQeU51bWJlck1ldGhvZHMgYXNfbnVtYmVyOworICAgIFB5TWFwcGluZ01ldGhvZHMgYXNfbWFwcGluZzsKKyAgICBQeVNlcXVlbmNlTWV0aG9kcyBhc19zZXF1ZW5jZTsgLyogYXNfc2VxdWVuY2UgY29tZXMgYWZ0ZXIgYXNfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgbWFwcGluZyB3aW5zIHdoZW4gYm90aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFwcGluZyBhbmQgdGhlIHNlcXVlbmNlIGRlZmluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGdpdmVuIG9wZXJhdG9yIChlLmcuIF9fZ2V0aXRlbV9fKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlIGFkZF9vcGVyYXRvcnMoKSBpbiB0eXBlb2JqZWN0LmMgLiAqLworICAgIFB5QnVmZmVyUHJvY3MgYXNfYnVmZmVyOworICAgIFB5T2JqZWN0ICpodF9uYW1lLCAqaHRfc2xvdHM7CisgICAgLyogaGVyZSBhcmUgb3B0aW9uYWwgdXNlciBzbG90cywgZm9sbG93ZWQgYnkgdGhlIG1lbWJlcnMuICovCit9IFB5SGVhcFR5cGVPYmplY3Q7CisKKy8qIGFjY2VzcyBtYWNybyB0byB0aGUgbWVtYmVycyB3aGljaCBhcmUgZmxvYXRpbmcgImJlaGluZCIgdGhlIG9iamVjdCAqLworI2RlZmluZSBQeUhlYXBUeXBlX0dFVF9NRU1CRVJTKGV0eXBlKSBcCisgICAgKChQeU1lbWJlckRlZiAqKSgoKGNoYXIgKilldHlwZSkgKyBQeV9UWVBFKGV0eXBlKS0+dHBfYmFzaWNzaXplKSkKKworCisvKiBHZW5lcmljIHR5cGUgY2hlY2sgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeVR5cGVfSXNTdWJ0eXBlKFB5VHlwZU9iamVjdCAqLCBQeVR5cGVPYmplY3QgKik7CisjZGVmaW5lIFB5T2JqZWN0X1R5cGVDaGVjayhvYiwgdHApIFwKKyAgICAoUHlfVFlQRShvYikgPT0gKHRwKSB8fCBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAodHApKSkKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5VHlwZV9UeXBlOyAvKiBidWlsdC1pbiAndHlwZScgKi8KK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUJhc2VPYmplY3RfVHlwZTsgLyogYnVpbHQtaW4gJ29iamVjdCcgKi8KK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVN1cGVyX1R5cGU7IC8qIGJ1aWx0LWluICdzdXBlcicgKi8KKworI2RlZmluZSBQeVR5cGVfQ2hlY2sob3ApIFwKKyAgICBQeVR5cGVfRmFzdFN1YmNsYXNzKFB5X1RZUEUob3ApLCBQeV9UUEZMQUdTX1RZUEVfU1VCQ0xBU1MpCisjZGVmaW5lIFB5VHlwZV9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5VHlwZV9UeXBlKQorCitQeUFQSV9GVU5DKGludCkgUHlUeXBlX1JlYWR5KFB5VHlwZU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlUeXBlX0dlbmVyaWNBbGxvYyhQeVR5cGVPYmplY3QgKiwgUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VHlwZV9HZW5lcmljTmV3KFB5VHlwZU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5VHlwZV9Mb29rdXAoUHlUeXBlT2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlPYmplY3RfTG9va3VwU3BlY2lhbChQeU9iamVjdCAqLCBjaGFyICosIFB5T2JqZWN0ICoqKTsKK1B5QVBJX0ZVTkModW5zaWduZWQgaW50KSBQeVR5cGVfQ2xlYXJDYWNoZSh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlUeXBlX01vZGlmaWVkKFB5VHlwZU9iamVjdCAqKTsKKworLyogR2VuZXJpYyBvcGVyYXRpb25zIG9uIG9iamVjdHMgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9QcmludChQeU9iamVjdCAqLCBGSUxFICosIGludCk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeU9iamVjdF9EdW1wKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9SZXByKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlPYmplY3RfU3RyKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9TdHIoUHlPYmplY3QgKik7CisjZGVmaW5lIFB5T2JqZWN0X0J5dGVzIFB5T2JqZWN0X1N0cgorI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfVW5pY29kZShQeU9iamVjdCAqKTsKKyNlbmRpZgorUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0NvbXBhcmUoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X1JpY2hDb21wYXJlKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIGludCk7CitQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfUmljaENvbXBhcmVCb29sKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIGludCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfSGFzQXR0clN0cmluZyhQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9HZXRBdHRyKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X1NldEF0dHIoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfSGFzQXR0cihQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKiopIF9QeU9iamVjdF9HZXREaWN0UHRyKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9TZWxmSXRlcihQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5T2JqZWN0X05leHROb3RJbXBsZW1lbnRlZChQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfR2VuZXJpY0dldEF0dHIoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoUHlPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMobG9uZykgUHlPYmplY3RfSGFzaChQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMobG9uZykgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0lzVHJ1ZShQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Ob3QoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlDYWxsYWJsZV9DaGVjayhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU51bWJlcl9Db2VyY2UoUHlPYmplY3QgKiosIFB5T2JqZWN0ICoqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU51bWJlcl9Db2VyY2VFeChQeU9iamVjdCAqKiwgUHlPYmplY3QgKiopOworCitQeUFQSV9GVU5DKHZvaWQpIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoUHlPYmplY3QgKik7CisKKy8qIEEgc2xvdCBmdW5jdGlvbiB3aG9zZSBhZGRyZXNzIHdlIG5lZWQgdG8gY29tcGFyZSAqLworZXh0ZXJuIGludCBfUHlPYmplY3RfU2xvdENvbXBhcmUoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisvKiBTYW1lIGFzIFB5T2JqZWN0X0dlbmVyaWN7R2V0LFNldH1BdHRyLCBidXQgcGFzc2luZyB0aGUgYXR0cmlidXRlcworICAgZGljdCBhcyB0aGUgbGFzdCBwYXJhbWV0ZXIuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopCitfUHlPYmplY3RfR2VuZXJpY0dldEF0dHJXaXRoRGljdChQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KQorX1B5T2JqZWN0X0dlbmVyaWNTZXRBdHRyV2l0aERpY3QoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCisKKy8qIFB5T2JqZWN0X0RpcihvYmopIGFjdHMgbGlrZSBQeXRob24gX19idWlsdGluX18uZGlyKG9iaiksIHJldHVybmluZyBhCisgICBsaXN0IG9mIHN0cmluZ3MuICBQeU9iamVjdF9EaXIoTlVMTCkgaXMgbGlrZSBfX2J1aWx0aW5fXy5kaXIoKSwKKyAgIHJldHVybmluZyB0aGUgbmFtZXMgb2YgdGhlIGN1cnJlbnQgbG9jYWxzLiAgSW4gdGhpcyBjYXNlLCBpZiB0aGVyZSBhcmUKKyAgIG5vIGN1cnJlbnQgbG9jYWxzLCBOVUxMIGlzIHJldHVybmVkLCBhbmQgUHlFcnJfT2NjdXJyZWQoKSBpcyBmYWxzZS4KKyovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0RpcihQeU9iamVjdCAqKTsKKworCisvKiBIZWxwZXJzIGZvciBwcmludGluZyByZWN1cnNpdmUgY29udGFpbmVyIHR5cGVzICovCitQeUFQSV9GVU5DKGludCkgUHlfUmVwckVudGVyKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh2b2lkKSBQeV9SZXByTGVhdmUoUHlPYmplY3QgKik7CisKKy8qIEhlbHBlcnMgZm9yIGhhc2ggZnVuY3Rpb25zICovCitQeUFQSV9GVU5DKGxvbmcpIF9QeV9IYXNoRG91YmxlKGRvdWJsZSk7CitQeUFQSV9GVU5DKGxvbmcpIF9QeV9IYXNoUG9pbnRlcih2b2lkKik7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBsb25nIHByZWZpeDsKKyAgICBsb25nIHN1ZmZpeDsKK30gX1B5X0hhc2hTZWNyZXRfdDsKK1B5QVBJX0RBVEEoX1B5X0hhc2hTZWNyZXRfdCkgX1B5X0hhc2hTZWNyZXQ7CisKKyNpZmRlZiBQeV9ERUJVRworUHlBUElfREFUQShpbnQpIF9QeV9IYXNoU2VjcmV0X0luaXRpYWxpemVkOworI2VuZGlmCisKKy8qIEhlbHBlciBmb3IgcGFzc2luZyBvYmplY3RzIHRvIHByaW50ZiBhbmQgdGhlIGxpa2UgKi8KKyNkZWZpbmUgUHlPYmplY3RfUkVQUihvYmopIFB5U3RyaW5nX0FTX1NUUklORyhQeU9iamVjdF9SZXByKG9iaikpCisKKy8qIEZsYWcgYml0cyBmb3IgcHJpbnRpbmc6ICovCisjZGVmaW5lIFB5X1BSSU5UX1JBVyAgICAxICAgICAgIC8qIE5vIHN0cmluZyBxdW90ZXMgZXRjLiAqLworCisvKgorYFR5cGUgZmxhZ3MgKHRwX2ZsYWdzKQorCitUaGVzZSBmbGFncyBhcmUgdXNlZCB0byBleHRlbmQgdGhlIHR5cGUgc3RydWN0dXJlIGluIGEgYmFja3dhcmRzLWNvbXBhdGlibGUKK2Zhc2hpb24uIEV4dGVuc2lvbnMgY2FuIHVzZSB0aGUgZmxhZ3MgdG8gaW5kaWNhdGUgKGFuZCB0ZXN0KSB3aGVuIGEgZ2l2ZW4KK3R5cGUgc3RydWN0dXJlIGNvbnRhaW5zIGEgbmV3IGZlYXR1cmUuIFRoZSBQeXRob24gY29yZSB3aWxsIHVzZSB0aGVzZSB3aGVuCitpbnRyb2R1Y2luZyBuZXcgZnVuY3Rpb25hbGl0eSBiZXR3ZWVuIG1ham9yIHJldmlzaW9ucyAodG8gYXZvaWQgbWlkLXZlcnNpb24KK2NoYW5nZXMgaW4gdGhlIFBZVEhPTl9BUElfVkVSU0lPTikuCisKK0FyYml0cmF0aW9uIG9mIHRoZSBmbGFnIGJpdCBwb3NpdGlvbnMgd2lsbCBuZWVkIHRvIGJlIGNvb3JkaW5hdGVkIGFtb25nCithbGwgZXh0ZW5zaW9uIHdyaXRlcnMgd2hvIHB1YmxpY2FsbHkgcmVsZWFzZSB0aGVpciBleHRlbnNpb25zICh0aGlzIHdpbGwKK2JlIGZld2VyIHRoYW4geW91IG1pZ2h0IGV4cGVjdCEpLi4KKworUHl0aG9uIDEuNS4yIGludHJvZHVjZWQgdGhlIGJmX2dldGNoYXJidWZmZXIgc2xvdCBpbnRvIFB5QnVmZmVyUHJvY3MuCisKK1R5cGUgZGVmaW5pdGlvbnMgc2hvdWxkIHVzZSBQeV9UUEZMQUdTX0RFRkFVTFQgZm9yIHRoZWlyIHRwX2ZsYWdzIHZhbHVlLgorCitDb2RlIGNhbiB1c2UgUHlUeXBlX0hhc0ZlYXR1cmUodHlwZV9vYiwgZmxhZ192YWx1ZSkgdG8gdGVzdCB3aGV0aGVyIHRoZQorZ2l2ZW4gdHlwZSBvYmplY3QgaGFzIGEgc3BlY2lmaWVkIGZlYXR1cmUuCisKK05PVEU6IHdoZW4gYnVpbGRpbmcgdGhlIGNvcmUsIFB5X1RQRkxBR1NfREVGQVVMVCBpbmNsdWRlcworUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHOyBvdXRzaWRlIHRoZSBjb3JlLCBpdCBkb2Vzbid0LiAgVGhpcyBpcyBzbwordGhhdCBleHRlbnNpb25zIHRoYXQgbW9kaWZ5IHRwX2RpY3Qgb2YgdGhlaXIgb3duIHR5cGVzIGRpcmVjdGx5IGRvbid0CiticmVhaywgc2luY2UgdGhpcyB3YXMgYWxsb3dlZCBpbiAyLjUuICBJbiAzLjAgdGhleSB3aWxsIGhhdmUgdG8KK21hbnVhbGx5IHJlbW92ZSB0aGlzIGZsYWcgdGhvdWdoIQorKi8KKworLyogUHlCdWZmZXJQcm9jcyBjb250YWlucyBiZl9nZXRjaGFyYnVmZmVyICovCisjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSICAoMUw8PDApCisKKy8qIFB5U2VxdWVuY2VNZXRob2RzIGNvbnRhaW5zIHNxX2NvbnRhaW5zICovCisjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9TRVFVRU5DRV9JTiAoMUw8PDEpCisKKy8qIFRoaXMgaXMgaGVyZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuICBFeHRlbnNpb25zIHRoYXQgdXNlIHRoZSBvbGQgR0MKKyAqIEFQSSB3aWxsIHN0aWxsIGNvbXBpbGUgYnV0IHRoZSBvYmplY3RzIHdpbGwgbm90IGJlIHRyYWNrZWQgYnkgdGhlIEdDLiAqLworI2RlZmluZSBQeV9UUEZMQUdTX0dDIDAgLyogdXNlZCB0byBiZSAoMUw8PDIpICovCisKKy8qIFB5U2VxdWVuY2VNZXRob2RzIGFuZCBQeU51bWJlck1ldGhvZHMgY29udGFpbiBpbi1wbGFjZSBvcGVyYXRvcnMgKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX0lOUExBQ0VPUFMgKDFMPDwzKQorCisvKiBQeU51bWJlck1ldGhvZHMgZG8gdGhlaXIgb3duIGNvZXJjaW9uICovCisjZGVmaW5lIFB5X1RQRkxBR1NfQ0hFQ0tUWVBFUyAoMUw8PDQpCisKKy8qIHRwX3JpY2hjb21wYXJlIGlzIGRlZmluZWQgKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFICgxTDw8NSkKKworLyogT2JqZWN0cyB3aGljaCBhcmUgd2Vha2x5IHJlZmVyZW5jYWJsZSBpZiB0aGVpciB0cF93ZWFrbGlzdG9mZnNldCBpcyA+MCAqLworI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMgKDFMPDw2KQorCisvKiB0cF9pdGVyIGlzIGRlZmluZWQgKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX0lURVIgKDFMPDw3KQorCisvKiBOZXcgbWVtYmVycyBpbnRyb2R1Y2VkIGJ5IFB5dGhvbiAyLjIgZXhpc3QgKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX0NMQVNTICgxTDw8OCkKKworLyogU2V0IGlmIHRoZSB0eXBlIG9iamVjdCBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19IRUFQVFlQRSAoMUw8PDkpCisKKy8qIFNldCBpZiB0aGUgdHlwZSBhbGxvd3Mgc3ViY2xhc3NpbmcgKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19CQVNFVFlQRSAoMUw8PDEwKQorCisvKiBTZXQgaWYgdGhlIHR5cGUgaXMgJ3JlYWR5JyAtLSBmdWxseSBpbml0aWFsaXplZCAqLworI2RlZmluZSBQeV9UUEZMQUdTX1JFQURZICgxTDw8MTIpCisKKy8qIFNldCB3aGlsZSB0aGUgdHlwZSBpcyBiZWluZyAncmVhZGllZCcsIHRvIHByZXZlbnQgcmVjdXJzaXZlIHJlYWR5IGNhbGxzICovCisjZGVmaW5lIFB5X1RQRkxBR1NfUkVBRFlJTkcgKDFMPDwxMykKKworLyogT2JqZWN0cyBzdXBwb3J0IGdhcmJhZ2UgY29sbGVjdGlvbiAoc2VlIG9iamltcC5oKSAqLworI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfR0MgKDFMPDwxNCkKKworLyogVGhlc2UgdHdvIGJpdHMgYXJlIHByZXNlcnZlZCBmb3IgU3RhY2tsZXNzIFB5dGhvbiwgbmV4dCBhZnRlciB0aGlzIGlzIDE3ICovCisjaWZkZWYgU1RBQ0tMRVNTCisjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9TVEFDS0xFU1NfRVhURU5TSU9OICgzTDw8MTUpCisjZWxzZQorI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfU1RBQ0tMRVNTX0VYVEVOU0lPTiAwCisjZW5kaWYKKworLyogT2JqZWN0cyBzdXBwb3J0IG5iX2luZGV4IGluIFB5TnVtYmVyTWV0aG9kcyAqLworI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfSU5ERVggKDFMPDwxNykKKworLyogT2JqZWN0cyBzdXBwb3J0IHR5cGUgYXR0cmlidXRlIGNhY2hlICovCisjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9WRVJTSU9OX1RBRyAgICgxTDw8MTgpCisjZGVmaW5lIFB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUcgICgxTDw8MTkpCisKKy8qIFR5cGUgaXMgYWJzdHJhY3QgYW5kIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19JU19BQlNUUkFDVCAoMUw8PDIwKQorCisvKiBIYXMgdGhlIG5ldyBidWZmZXIgcHJvdG9jb2wgKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUiAoMUw8PDIxKQorCisvKiBUaGVzZSBmbGFncyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSB0eXBlIGlzIGEgc3ViY2xhc3MuICovCisjZGVmaW5lIFB5X1RQRkxBR1NfSU5UX1NVQkNMQVNTICAgICAgICAgKDFMPDwyMykKKyNkZWZpbmUgUHlfVFBGTEFHU19MT05HX1NVQkNMQVNTICAgICAgICAoMUw8PDI0KQorI2RlZmluZSBQeV9UUEZMQUdTX0xJU1RfU1VCQ0xBU1MgICAgICAgICgxTDw8MjUpCisjZGVmaW5lIFB5X1RQRkxBR1NfVFVQTEVfU1VCQ0xBU1MgICAgICAgKDFMPDwyNikKKyNkZWZpbmUgUHlfVFBGTEFHU19TVFJJTkdfU1VCQ0xBU1MgICAgICAoMUw8PDI3KQorI2RlZmluZSBQeV9UUEZMQUdTX1VOSUNPREVfU1VCQ0xBU1MgICAgICgxTDw8MjgpCisjZGVmaW5lIFB5X1RQRkxBR1NfRElDVF9TVUJDTEFTUyAgICAgICAgKDFMPDwyOSkKKyNkZWZpbmUgUHlfVFBGTEFHU19CQVNFX0VYQ19TVUJDTEFTUyAgICAoMUw8PDMwKQorI2RlZmluZSBQeV9UUEZMQUdTX1RZUEVfU1VCQ0xBU1MgICAgICAgICgxTDw8MzEpCisKKyNkZWZpbmUgUHlfVFBGTEFHU19ERUZBVUxUX0VYVEVSTkFMICggXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfR0VUQ0hBUkJVRkZFUiB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1NFUVVFTkNFX0lOIHwgXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUyB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1JJQ0hDT01QQVJFIHwgXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMgfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9JVEVSIHwgXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MgfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9TVEFDS0xFU1NfRVhURU5TSU9OIHwgXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfSU5ERVggfCBcCisgICAgICAgICAgICAgICAgIDApCisjZGVmaW5lIFB5X1RQRkxBR1NfREVGQVVMVF9DT1JFIChQeV9UUEZMQUdTX0RFRkFVTFRfRVhURVJOQUwgfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9WRVJTSU9OX1RBRykKKworI2lmZGVmIFB5X0JVSUxEX0NPUkUKKyNkZWZpbmUgUHlfVFBGTEFHU19ERUZBVUxUIFB5X1RQRkxBR1NfREVGQVVMVF9DT1JFCisjZWxzZQorI2RlZmluZSBQeV9UUEZMQUdTX0RFRkFVTFQgUHlfVFBGTEFHU19ERUZBVUxUX0VYVEVSTkFMCisjZW5kaWYKKworI2RlZmluZSBQeVR5cGVfSGFzRmVhdHVyZSh0LGYpICAoKCh0KS0+dHBfZmxhZ3MgJiAoZikpICE9IDApCisjZGVmaW5lIFB5VHlwZV9GYXN0U3ViY2xhc3ModCxmKSAgUHlUeXBlX0hhc0ZlYXR1cmUodCxmKQorCisKKy8qCitUaGUgbWFjcm9zIFB5X0lOQ1JFRihvcCkgYW5kIFB5X0RFQ1JFRihvcCkgYXJlIHVzZWQgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudAorcmVmZXJlbmNlIGNvdW50cy4gIFB5X0RFQ1JFRiBjYWxscyB0aGUgb2JqZWN0J3MgZGVhbGxvY2F0b3IgZnVuY3Rpb24gd2hlbgordGhlIHJlZmNvdW50IGZhbGxzIHRvIDA7IGZvcgorb2JqZWN0cyB0aGF0IGRvbid0IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzIG9yIGhlYXAgbWVtb3J5Cit0aGlzIGNhbiBiZSB0aGUgc3RhbmRhcmQgZnVuY3Rpb24gZnJlZSgpLiAgQm90aCBtYWNyb3MgY2FuIGJlIHVzZWQKK3doZXJldmVyIGEgdm9pZCBleHByZXNzaW9uIGlzIGFsbG93ZWQuICBUaGUgYXJndW1lbnQgbXVzdCBub3QgYmUgYQorTlVMTCBwb2ludGVyLiAgSWYgaXQgbWF5IGJlIE5VTEwsIHVzZSBQeV9YSU5DUkVGL1B5X1hERUNSRUYgaW5zdGVhZC4KK1RoZSBtYWNybyBfUHlfTmV3UmVmZXJlbmNlKG9wKSBpbml0aWFsaXplIHJlZmVyZW5jZSBjb3VudHMgdG8gMSwgYW5kCitpbiBzcGVjaWFsIGJ1aWxkcyAoUHlfUkVGX0RFQlVHLCBQeV9UUkFDRV9SRUZTKSBwZXJmb3JtcyBhZGRpdGlvbmFsCitib29ra2VlcGluZyBhcHByb3ByaWF0ZSB0byB0aGUgc3BlY2lhbCBidWlsZC4KKworV2UgYXNzdW1lIHRoYXQgdGhlIHJlZmVyZW5jZSBjb3VudCBmaWVsZCBjYW4gbmV2ZXIgb3ZlcmZsb3c7IHRoaXMgY2FuCitiZSBwcm92ZW4gd2hlbiB0aGUgc2l6ZSBvZiB0aGUgZmllbGQgaXMgdGhlIHNhbWUgYXMgdGhlIHBvaW50ZXIgc2l6ZSwgc28KK3dlIGlnbm9yZSB0aGUgcG9zc2liaWxpdHkuICBQcm92aWRlZCBhIEMgaW50IGlzIGF0IGxlYXN0IDMyIGJpdHMgKHdoaWNoCitpcyBpbXBsaWNpdGx5IGFzc3VtZWQgaW4gbWFueSBwYXJ0cyBvZiB0aGlzIGNvZGUpLCB0aGF0J3MgZW5vdWdoIGZvcgorYWJvdXQgMioqMzEgcmVmZXJlbmNlcyB0byBhbiBvYmplY3QuCisKK1hYWCBUaGUgZm9sbG93aW5nIGJlY2FtZSBvdXQgb2YgZGF0ZSBpbiBQeXRob24gMi4yLCBidXQgSSdtIG5vdCBzdXJlCitYWFggd2hhdCB0aGUgZnVsbCB0cnV0aCBpcyBub3cuICBDZXJ0YWlubHksIGhlYXAtYWxsb2NhdGVkIHR5cGUgb2JqZWN0cworWFhYIGNhbiBhbmQgc2hvdWxkIGJlIGRlYWxsb2NhdGVkLgorVHlwZSBvYmplY3RzIHNob3VsZCBuZXZlciBiZSBkZWFsbG9jYXRlZDsgdGhlIHR5cGUgcG9pbnRlciBpbiBhbiBvYmplY3QKK2lzIG5vdCBjb25zaWRlcmVkIHRvIGJlIGEgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIG9iamVjdCwgdG8gc2F2ZQorY29tcGxpY2F0aW9ucyBpbiB0aGUgZGVhbGxvY2F0aW9uIGZ1bmN0aW9uLiAgKFRoaXMgaXMgYWN0dWFsbHkgYQorZGVjaXNpb24gdGhhdCdzIHVwIHRvIHRoZSBpbXBsZW1lbnRlciBvZiBlYWNoIG5ldyB0eXBlIHNvIGlmIHlvdSB3YW50LAoreW91IGNhbiBjb3VudCBzdWNoIHJlZmVyZW5jZXMgdG8gdGhlIHR5cGUgb2JqZWN0LikKKworKioqIFdBUk5JTkcqKiogVGhlIFB5X0RFQ1JFRiBtYWNybyBtdXN0IGhhdmUgYSBzaWRlLWVmZmVjdC1mcmVlIGFyZ3VtZW50CitzaW5jZSBpdCBtYXkgZXZhbHVhdGUgaXRzIGFyZ3VtZW50IG11bHRpcGxlIHRpbWVzLiAgKFRoZSBhbHRlcm5hdGl2ZQord291bGQgYmUgdG8gbWFjZSBpdCBhIHByb3BlciBmdW5jdGlvbiBvciBhc3NpZ24gaXQgdG8gYSBnbG9iYWwgdGVtcG9yYXJ5Cit2YXJpYWJsZSBmaXJzdCwgYm90aCBvZiB3aGljaCBhcmUgc2xvd2VyOyBhbmQgaW4gYSBtdWx0aS10aHJlYWRlZAorZW52aXJvbm1lbnQgdGhlIGdsb2JhbCB2YXJpYWJsZSB0cmljayBpcyBub3Qgc2FmZS4pCisqLworCisvKiBGaXJzdCBkZWZpbmUgYSBwaWxlIG9mIHNpbXBsZSBoZWxwZXIgbWFjcm9zLCBvbmUgc2V0IHBlciBzcGVjaWFsCisgKiBidWlsZCBzeW1ib2wuICBUaGVzZSBlaXRoZXIgZXhwYW5kIHRvIHRoZSBvYnZpb3VzIHRoaW5ncywgb3IgdG8KKyAqIG5vdGhpbmcgYXQgYWxsIHdoZW4gdGhlIHNwZWNpYWwgbW9kZSBpc24ndCBpbiBlZmZlY3QuICBUaGUgbWFpbgorICogbWFjcm9zIGNhbiBsYXRlciBiZSBkZWZpbmVkIGp1c3Qgb25jZSB0aGVuLCB5ZXQgZXhwYW5kIHRvIGRpZmZlcmVudAorICogdGhpbmdzIGRlcGVuZGluZyBvbiB3aGljaCBzcGVjaWFsIGJ1aWxkIG9wdGlvbnMgYXJlIGFuZCBhcmVuJ3QgaW4gZWZmZWN0LgorICogVHJ1c3QgbWUgPHdpbms+OiAgd2hpbGUgcGFpbmZ1bCwgdGhpcyBpcyAyMHggZWFzaWVyIHRvIHVuZGVyc3RhbmQgdGhhbiwKKyAqIGUuZywgZGVmaW5pbmcgX1B5X05ld1JlZmVyZW5jZSBmaXZlIGRpZmZlcmVudCB0aW1lcyBpbiBhIG1hemUgb2YgbmVzdGVkCisgKiAjaWZkZWZzICh3ZSB1c2VkIHRvIGRvIHRoYXQgLS0gaXQgd2FzIGltcGVuZXRyYWJsZSkuCisgKi8KKyNpZmRlZiBQeV9SRUZfREVCVUcKK1B5QVBJX0RBVEEoUHlfc3NpemVfdCkgX1B5X1JlZlRvdGFsOworUHlBUElfRlVOQyh2b2lkKSBfUHlfTmVnYXRpdmVSZWZjb3VudChjb25zdCBjaGFyICpmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVubywgUHlPYmplY3QgKm9wKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5RGljdF9EdW1teSh2b2lkKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5U2V0X0R1bW15KHZvaWQpOworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBfUHlfR2V0UmVmVG90YWwodm9pZCk7CisjZGVmaW5lIF9QeV9JTkNfUkVGVE9UQUwgICAgICAgIF9QeV9SZWZUb3RhbCsrCisjZGVmaW5lIF9QeV9ERUNfUkVGVE9UQUwgICAgICAgIF9QeV9SZWZUb3RhbC0tCisjZGVmaW5lIF9QeV9SRUZfREVCVUdfQ09NTUEgICAgICwKKyNkZWZpbmUgX1B5X0NIRUNLX1JFRkNOVChPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgIGlmICgoKFB5T2JqZWN0KilPUCktPm9iX3JlZmNudCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX1B5X05lZ2F0aXZlUmVmY291bnQoX19GSUxFX18sIF9fTElORV9fLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChQeU9iamVjdCAqKShPUCkpOyAgICAgICAgIFwKK30KKyNlbHNlCisjZGVmaW5lIF9QeV9JTkNfUkVGVE9UQUwKKyNkZWZpbmUgX1B5X0RFQ19SRUZUT1RBTAorI2RlZmluZSBfUHlfUkVGX0RFQlVHX0NPTU1BCisjZGVmaW5lIF9QeV9DSEVDS19SRUZDTlQoT1ApICAgIC8qIGEgc2VtaWNvbG9uICovOworI2VuZGlmIC8qIFB5X1JFRl9ERUJVRyAqLworCisjaWZkZWYgQ09VTlRfQUxMT0NTCitQeUFQSV9GVU5DKHZvaWQpIGluY19jb3VudChQeVR5cGVPYmplY3QgKik7CitQeUFQSV9GVU5DKHZvaWQpIGRlY19jb3VudChQeVR5cGVPYmplY3QgKik7CisjZGVmaW5lIF9QeV9JTkNfVFBBTExPQ1MoT1ApICAgIGluY19jb3VudChQeV9UWVBFKE9QKSkKKyNkZWZpbmUgX1B5X0lOQ19UUEZSRUVTKE9QKSAgICAgZGVjX2NvdW50KFB5X1RZUEUoT1ApKQorI2RlZmluZSBfUHlfREVDX1RQRlJFRVMoT1ApICAgICBQeV9UWVBFKE9QKS0+dHBfZnJlZXMtLQorI2RlZmluZSBfUHlfQ09VTlRfQUxMT0NTX0NPTU1BICAsCisjZWxzZQorI2RlZmluZSBfUHlfSU5DX1RQQUxMT0NTKE9QKQorI2RlZmluZSBfUHlfSU5DX1RQRlJFRVMoT1ApCisjZGVmaW5lIF9QeV9ERUNfVFBGUkVFUyhPUCkKKyNkZWZpbmUgX1B5X0NPVU5UX0FMTE9DU19DT01NQQorI2VuZGlmIC8qIENPVU5UX0FMTE9DUyAqLworCisjaWZkZWYgUHlfVFJBQ0VfUkVGUworLyogUHlfVFJBQ0VfUkVGUyBpcyBzdWNoIG1ham9yIHN1cmdlcnkgdGhhdCB3ZSBjYWxsIGV4dGVybmFsIHJvdXRpbmVzLiAqLworUHlBUElfRlVOQyh2b2lkKSBfUHlfTmV3UmVmZXJlbmNlKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh2b2lkKSBfUHlfRm9yZ2V0UmVmZXJlbmNlKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh2b2lkKSBfUHlfRGVhbGxvYyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5X1ByaW50UmVmZXJlbmNlcyhGSUxFICopOworUHlBUElfRlVOQyh2b2lkKSBfUHlfUHJpbnRSZWZlcmVuY2VBZGRyZXNzZXMoRklMRSAqKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5X0FkZFRvQWxsT2JqZWN0cyhQeU9iamVjdCAqLCBpbnQgZm9yY2UpOworCisjZWxzZQorLyogV2l0aG91dCBQeV9UUkFDRV9SRUZTLCB0aGVyZSdzIGxpdHRsZSBlbm91Z2ggdG8gZG8gdGhhdCB3ZSBleHBhbmQgY29kZQorICogaW5saW5lLgorICovCisjZGVmaW5lIF9QeV9OZXdSZWZlcmVuY2Uob3ApICggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfUHlfSU5DX1RQQUxMT0NTKG9wKSBfUHlfQ09VTlRfQUxMT0NTX0NPTU1BICAgICAgICAgXAorICAgIF9QeV9JTkNfUkVGVE9UQUwgIF9QeV9SRUZfREVCVUdfQ09NTUEgICAgICAgICAgICAgICBcCisgICAgUHlfUkVGQ05UKG9wKSA9IDEpCisKKyNkZWZpbmUgX1B5X0ZvcmdldFJlZmVyZW5jZShvcCkgX1B5X0lOQ19UUEZSRUVTKG9wKQorCisjZGVmaW5lIF9QeV9EZWFsbG9jKG9wKSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfUHlfSU5DX1RQRlJFRVMob3ApIF9QeV9DT1VOVF9BTExPQ1NfQ09NTUEgICAgICAgICAgXAorICAgICgqUHlfVFlQRShvcCktPnRwX2RlYWxsb2MpKChQeU9iamVjdCAqKShvcCkpKQorI2VuZGlmIC8qICFQeV9UUkFDRV9SRUZTICovCisKKyNkZWZpbmUgUHlfSU5DUkVGKG9wKSAoICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfUHlfSU5DX1JFRlRPVEFMICBfUHlfUkVGX0RFQlVHX0NPTU1BICAgICAgIFwKKyAgICAoKFB5T2JqZWN0Kikob3ApKS0+b2JfcmVmY250KyspCisKKyNkZWZpbmUgUHlfREVDUkVGKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChfUHlfREVDX1JFRlRPVEFMICBfUHlfUkVGX0RFQlVHX0NPTU1BICAgICAgIFwKKyAgICAgICAgLS0oKFB5T2JqZWN0Kikob3ApKS0+b2JfcmVmY250ICE9IDApICAgICAgICAgICAgXAorICAgICAgICAgICAgX1B5X0NIRUNLX1JFRkNOVChvcCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX1B5X0RlYWxsb2MoKFB5T2JqZWN0ICopKG9wKSk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFNhZmVseSBkZWNyZWYgYG9wYCBhbmQgc2V0IGBvcGAgdG8gTlVMTCwgZXNwZWNpYWxseSB1c2VmdWwgaW4gdHBfY2xlYXIKKyAqIGFuZCB0cF9kZWFsbG9jIGltcGxlbWVudGF0b25zLgorICoKKyAqIE5vdGUgdGhhdCAidGhlIG9idmlvdXMiIGNvZGUgY2FuIGJlIGRlYWRseToKKyAqCisgKiAgICAgUHlfWERFQ1JFRihvcCk7CisgKiAgICAgb3AgPSBOVUxMOworICoKKyAqIFR5cGljYWxseSwgYG9wYCBpcyBzb21ldGhpbmcgbGlrZSBzZWxmLT5jb250YWluZWUsIGFuZCBgc2VsZmAgaXMgZG9uZQorICogdXNpbmcgaXRzIGBjb250YWluZWVgIG1lbWJlci4gIEluIHRoZSBjb2RlIHNlcXVlbmNlIGFib3ZlLCBzdXBwb3NlCisgKiBgY29udGFpbmVlYCBpcyBub24tTlVMTCB3aXRoIGEgcmVmY291bnQgb2YgMS4gIEl0cyByZWZjb3VudCBmYWxscyB0bworICogMCBvbiB0aGUgZmlyc3QgbGluZSwgd2hpY2ggY2FuIHRyaWdnZXIgYW4gYXJiaXRyYXJ5IGFtb3VudCBvZiBjb2RlLAorICogcG9zc2libHkgaW5jbHVkaW5nIGZpbmFsaXplcnMgKGxpa2UgX19kZWxfXyBtZXRob2RzIG9yIHdlYWtyZWYgY2FsbGJhY2tzKQorICogY29kZWQgaW4gUHl0aG9uLCB3aGljaCBpbiB0dXJuIGNhbiByZWxlYXNlIHRoZSBHSUwgYW5kIGFsbG93IG90aGVyIHRocmVhZHMKKyAqIHRvIHJ1biwgZXRjLiAgU3VjaCBjb2RlIG1heSBldmVuIGludm9rZSBtZXRob2RzIG9mIGBzZWxmYCBhZ2Fpbiwgb3IgY2F1c2UKKyAqIGN5Y2xpYyBnYyB0byB0cmlnZ2VyLCBidXQtLSBvb3BzISAtLXNlbGYtPmNvbnRhaW5lZSBzdGlsbCBwb2ludHMgdG8gdGhlCisgKiBvYmplY3QgYmVpbmcgdG9ybiBkb3duLCBhbmQgaXQgbWF5IGJlIGluIGFuIGluc2FuZSBzdGF0ZSB3aGlsZSBiZWluZyB0b3JuCisgKiBkb3duLiAgVGhpcyBoYXMgaW4gZmFjdCBiZWVuIGEgcmljaCBoaXN0b3JpYyBzb3VyY2Ugb2YgbWlzZXJhYmxlIChyYXJlICYKKyAqIGhhcmQtdG8tZGlhZ25vc2UpIHNlZ2ZhdWx0aW5nIChhbmQgb3RoZXIpIGJ1Z3MuCisgKgorICogVGhlIHNhZmUgd2F5IGlzOgorICoKKyAqICAgICAgUHlfQ0xFQVIob3ApOworICoKKyAqIFRoYXQgYXJyYW5nZXMgdG8gc2V0IGBvcGAgdG8gTlVMTCBfYmVmb3JlXyBkZWNyZWYnaW5nLCBzbyB0aGF0IGFueSBjb2RlCisgKiB0cmlnZ2VyZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiBgb3BgIGdldHRpbmcgdG9ybiBkb3duIG5vIGxvbmdlciBiZWxpZXZlcworICogYG9wYCBwb2ludHMgdG8gYSB2YWxpZCBvYmplY3QuCisgKgorICogVGhlcmUgYXJlIGNhc2VzIHdoZXJlIGl0J3Mgc2FmZSB0byB1c2UgdGhlIG5haXZlIGNvZGUsIGJ1dCB0aGV5J3JlIGJyaXR0bGUuCisgKiBGb3IgZXhhbXBsZSwgaWYgYG9wYCBwb2ludHMgdG8gYSBQeXRob24gaW50ZWdlciwgeW91IGtub3cgdGhhdCBkZXN0cm95aW5nCisgKiBvbmUgb2YgdGhvc2UgY2FuJ3QgY2F1c2UgcHJvYmxlbXMgLS0gYnV0IGluIHBhcnQgdGhhdCByZWxpZXMgb24gdGhhdAorICogUHl0aG9uIGludGVnZXJzIGFyZW4ndCBjdXJyZW50bHkgd2Vha2x5IHJlZmVyZW5jYWJsZS4gIEJlc3QgcHJhY3RpY2UgaXMKKyAqIHRvIHVzZSBQeV9DTEVBUigpIGV2ZW4gaWYgeW91IGNhbid0IHRoaW5rIG9mIGEgcmVhc29uIGZvciB3aHkgeW91IG5lZWQgdG8uCisgKi8KKyNkZWZpbmUgUHlfQ0xFQVIob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5T2JqZWN0ICpfcHlfdG1wID0gKFB5T2JqZWN0ICopKG9wKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAob3ApID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBQeV9ERUNSRUYoX3B5X3RtcCk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworLyogTWFjcm9zIHRvIHVzZSBpbiBjYXNlIHRoZSBvYmplY3QgcG9pbnRlciBtYXkgYmUgTlVMTDogKi8KKyNkZWZpbmUgUHlfWElOQ1JFRihvcCkgZG8geyBpZiAoKG9wKSA9PSBOVUxMKSA7IGVsc2UgUHlfSU5DUkVGKG9wKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgUHlfWERFQ1JFRihvcCkgZG8geyBpZiAoKG9wKSA9PSBOVUxMKSA7IGVsc2UgUHlfREVDUkVGKG9wKTsgfSB3aGlsZSAoMCkKKworLyoKK1RoZXNlIGFyZSBwcm92aWRlZCBhcyBjb252ZW5pZW5jZXMgdG8gUHl0aG9uIHJ1bnRpbWUgZW1iZWRkZXJzLCBzbyB0aGF0Cit0aGV5IGNhbiBoYXZlIG9iamVjdCBjb2RlIHRoYXQgaXMgbm90IGRlcGVuZGVudCBvbiBQeXRob24gY29tcGlsYXRpb24gZmxhZ3MuCisqLworUHlBUElfRlVOQyh2b2lkKSBQeV9JbmNSZWYoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5X0RlY1JlZihQeU9iamVjdCAqKTsKKworLyoKK19QeV9Ob25lU3RydWN0IGlzIGFuIG9iamVjdCBvZiB1bmRlZmluZWQgdHlwZSB3aGljaCBjYW4gYmUgdXNlZCBpbiBjb250ZXh0cword2hlcmUgTlVMTCAobmlsKSBpcyBub3Qgc3VpdGFibGUgKHNpbmNlIE5VTEwgb2Z0ZW4gbWVhbnMgJ2Vycm9yJykuCisKK0Rvbid0IGZvcmdldCB0byBhcHBseSBQeV9JTkNSRUYoKSB3aGVuIHJldHVybmluZyB0aGlzIHZhbHVlISEhCisqLworUHlBUElfREFUQShQeU9iamVjdCkgX1B5X05vbmVTdHJ1Y3Q7IC8qIERvbid0IHVzZSB0aGlzIGRpcmVjdGx5ICovCisjZGVmaW5lIFB5X05vbmUgKCZfUHlfTm9uZVN0cnVjdCkKKworLyogTWFjcm8gZm9yIHJldHVybmluZyBQeV9Ob25lIGZyb20gYSBmdW5jdGlvbiAqLworI2RlZmluZSBQeV9SRVRVUk5fTk9ORSByZXR1cm4gUHlfSU5DUkVGKFB5X05vbmUpLCBQeV9Ob25lCisKKy8qCitQeV9Ob3RJbXBsZW1lbnRlZCBpcyBhIHNpbmdsZXRvbiB1c2VkIHRvIHNpZ25hbCB0aGF0IGFuIG9wZXJhdGlvbiBpcworbm90IGltcGxlbWVudGVkIGZvciBhIGdpdmVuIHR5cGUgY29tYmluYXRpb24uCisqLworUHlBUElfREFUQShQeU9iamVjdCkgX1B5X05vdEltcGxlbWVudGVkU3RydWN0OyAvKiBEb24ndCB1c2UgdGhpcyBkaXJlY3RseSAqLworI2RlZmluZSBQeV9Ob3RJbXBsZW1lbnRlZCAoJl9QeV9Ob3RJbXBsZW1lbnRlZFN0cnVjdCkKKworLyogUmljaCBjb21wYXJpc29uIG9wY29kZXMgKi8KKyNkZWZpbmUgUHlfTFQgMAorI2RlZmluZSBQeV9MRSAxCisjZGVmaW5lIFB5X0VRIDIKKyNkZWZpbmUgUHlfTkUgMworI2RlZmluZSBQeV9HVCA0CisjZGVmaW5lIFB5X0dFIDUKKworLyogTWFwcyBQeV9MVCB0byBQeV9HVCwgLi4uLCBQeV9HRSB0byBQeV9MRS4KKyAqIERlZmluZWQgaW4gb2JqZWN0LmMuCisgKi8KK1B5QVBJX0RBVEEoaW50KSBfUHlfU3dhcHBlZE9wW107CisKKy8qCitEZWZpbmUgc3RhdGljZm9yd2FyZCBhbmQgc3RhdGljaGVyZSBmb3Igc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQKK0MgZXh0ZW5zaW9ucy4KKworVGhlIHN0YXRpY2ZvcndhcmQgZGVmaW5lIHdhcyBuZWVkZWQgdG8gc3VwcG9ydCBjZXJ0YWluIGJyb2tlbiBDCitjb21waWxlcnMgKG5vdGFibHkgU0NPIE9EVCAzLjAsIHBlcmhhcHMgZWFybHkgQUlYIGFzIHdlbGwpIGJvdGNoZWQgdGhlCitzdGF0aWMga2V5d29yZCB3aGVuIGl0IHdhcyB1c2VkIHdpdGggYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIGEgc3RhdGljCitpbml0aWFsaXplZCBzdHJ1Y3R1cmUuICBTdGFuZGFyZCBDIGFsbG93cyB0aGUgZm9yd2FyZCBkZWNsYXJhdGlvbiB3aXRoCitzdGF0aWMsIGFuZCB3ZSd2ZSBkZWNpZGVkIHRvIHN0b3AgY2F0ZXJpbmcgdG8gYnJva2VuIEMgY29tcGlsZXJzLgorKEluIGZhY3QsIHdlIGV4cGVjdCB0aGF0IHRoZSBjb21waWxlcnMgYXJlIGFsbCBmaXhlZCBlaWdodCB5ZWFycyBsYXRlci4pCisqLworCisjZGVmaW5lIHN0YXRpY2ZvcndhcmQgc3RhdGljCisjZGVmaW5lIHN0YXRpY2hlcmUgc3RhdGljCisKKworLyoKK01vcmUgY29udmVudGlvbnMKKz09PT09PT09PT09PT09PT0KKworQXJndW1lbnQgQ2hlY2tpbmcKKy0tLS0tLS0tLS0tLS0tLS0tCisKK0Z1bmN0aW9ucyB0aGF0IHRha2Ugb2JqZWN0cyBhcyBhcmd1bWVudHMgbm9ybWFsbHkgZG9uJ3QgY2hlY2sgZm9yIG5pbAorYXJndW1lbnRzLCBidXQgdGhleSBkbyBjaGVjayB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQsIGFuZCByZXR1cm4gYW4KK2Vycm9yIGlmIHRoZSBmdW5jdGlvbiBkb2Vzbid0IGFwcGx5IHRvIHRoZSB0eXBlLgorCitGYWlsdXJlIE1vZGVzCistLS0tLS0tLS0tLS0tCisKK0Z1bmN0aW9ucyBtYXkgZmFpbCBmb3IgYSB2YXJpZXR5IG9mIHJlYXNvbnMsIGluY2x1ZGluZyBydW5uaW5nIG91dCBvZgorbWVtb3J5LiAgVGhpcyBpcyBjb21tdW5pY2F0ZWQgdG8gdGhlIGNhbGxlciBpbiB0d28gd2F5czogYW4gZXJyb3Igc3RyaW5nCitpcyBzZXQgKHNlZSBlcnJvcnMuaCksIGFuZCB0aGUgZnVuY3Rpb24gcmVzdWx0IGRpZmZlcnM6IGZ1bmN0aW9ucyB0aGF0Citub3JtYWxseSByZXR1cm4gYSBwb2ludGVyIHJldHVybiBOVUxMIGZvciBmYWlsdXJlLCBmdW5jdGlvbnMgcmV0dXJuaW5nCithbiBpbnRlZ2VyIHJldHVybiAtMSAod2hpY2ggY291bGQgYmUgYSBsZWdhbCByZXR1cm4gdmFsdWUgdG9vISksIGFuZAorb3RoZXIgZnVuY3Rpb25zIHJldHVybiAwIGZvciBzdWNjZXNzIGFuZCAtMSBmb3IgZmFpbHVyZS4KK0NhbGxlcnMgc2hvdWxkIGFsd2F5cyBjaGVjayBmb3IgZXJyb3JzIGJlZm9yZSB1c2luZyB0aGUgcmVzdWx0LiAgSWYKK2FuIGVycm9yIHdhcyBzZXQsIHRoZSBjYWxsZXIgbXVzdCBlaXRoZXIgZXhwbGljaXRseSBjbGVhciBpdCwgb3IgcGFzcwordGhlIGVycm9yIG9uIHRvIGl0cyBjYWxsZXIuCisKK1JlZmVyZW5jZSBDb3VudHMKKy0tLS0tLS0tLS0tLS0tLS0KKworSXQgdGFrZXMgYSB3aGlsZSB0byBnZXQgdXNlZCB0byB0aGUgcHJvcGVyIHVzYWdlIG9mIHJlZmVyZW5jZSBjb3VudHMuCisKK0Z1bmN0aW9ucyB0aGF0IGNyZWF0ZSBhbiBvYmplY3Qgc2V0IHRoZSByZWZlcmVuY2UgY291bnQgdG8gMTsgc3VjaCBuZXcKK29iamVjdHMgbXVzdCBiZSBzdG9yZWQgc29tZXdoZXJlIG9yIGRlc3Ryb3llZCBhZ2FpbiB3aXRoIFB5X0RFQ1JFRigpLgorU29tZSBmdW5jdGlvbnMgdGhhdCAnc3RvcmUnIG9iamVjdHMsIHN1Y2ggYXMgUHlUdXBsZV9TZXRJdGVtKCkgYW5kCitQeUxpc3RfU2V0SXRlbSgpLAorZG9uJ3QgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIG9iamVjdCwgc2luY2UgdGhlIG1vc3QKK2ZyZXF1ZW50IHVzZSBpcyB0byBzdG9yZSBhIGZyZXNoIG9iamVjdC4gIEZ1bmN0aW9ucyB0aGF0ICdyZXRyaWV2ZScKK29iamVjdHMsIHN1Y2ggYXMgUHlUdXBsZV9HZXRJdGVtKCkgYW5kIFB5RGljdF9HZXRJdGVtU3RyaW5nKCksIGFsc28KK2Rvbid0IGluY3JlbWVudAordGhlIHJlZmVyZW5jZSBjb3VudCwgc2luY2UgbW9zdCBmcmVxdWVudGx5IHRoZSBvYmplY3QgaXMgb25seSBsb29rZWQgYXQKK3F1aWNrbHkuICBUaHVzLCB0byByZXRyaWV2ZSBhbiBvYmplY3QgYW5kIHN0b3JlIGl0IGFnYWluLCB0aGUgY2FsbGVyCittdXN0IGNhbGwgUHlfSU5DUkVGKCkgZXhwbGljaXRseS4KKworTk9URTogZnVuY3Rpb25zIHRoYXQgJ2NvbnN1bWUnIGEgcmVmZXJlbmNlIGNvdW50LCBsaWtlCitQeUxpc3RfU2V0SXRlbSgpLCBjb25zdW1lIHRoZSByZWZlcmVuY2UgZXZlbiBpZiB0aGUgb2JqZWN0IHdhc24ndAorc3VjY2Vzc2Z1bGx5IHN0b3JlZCwgdG8gc2ltcGxpZnkgZXJyb3IgaGFuZGxpbmcuCisKK0l0IHNlZW1zIGF0dHJhY3RpdmUgdG8gbWFrZSBvdGhlciBmdW5jdGlvbnMgdGhhdCB0YWtlIGFuIG9iamVjdCBhcworYXJndW1lbnQgY29uc3VtZSBhIHJlZmVyZW5jZSBjb3VudDsgaG93ZXZlciwgdGhpcyBtYXkgcXVpY2tseSBnZXQKK2NvbmZ1c2luZyAoZXZlbiB0aGUgY3VycmVudCBwcmFjdGljZSBpcyBhbHJlYWR5IGNvbmZ1c2luZykuICBDb25zaWRlcgoraXQgY2FyZWZ1bGx5LCBpdCBtYXkgc2F2ZSBsb3RzIG9mIGNhbGxzIHRvIFB5X0lOQ1JFRigpIGFuZCBQeV9ERUNSRUYoKSBhdAordGltZXMuCisqLworCisKKy8qIFRyYXNoY2FuIG1lY2hhbmlzbSwgdGhhbmtzIHRvIENocmlzdGlhbiBUaXNtZXIuCisKK1doZW4gZGVhbGxvY2F0aW5nIGEgY29udGFpbmVyIG9iamVjdCwgaXQncyBwb3NzaWJsZSB0byB0cmlnZ2VyIGFuIHVuYm91bmRlZAorY2hhaW4gb2YgZGVhbGxvY2F0aW9ucywgYXMgZWFjaCBQeV9ERUNSRUYgaW4gdHVybiBkcm9wcyB0aGUgcmVmY291bnQgb24gInRoZQorbmV4dCIgb2JqZWN0IGluIHRoZSBjaGFpbiB0byAwLiAgVGhpcyBjYW4gZWFzaWx5IGxlYWQgdG8gc3RhY2sgZmF1bHRzLCBhbmQKK2VzcGVjaWFsbHkgaW4gdGhyZWFkcyAod2hpY2ggdHlwaWNhbGx5IGhhdmUgbGVzcyBzdGFjayBzcGFjZSB0byB3b3JrIHdpdGgpLgorCitBIGNvbnRhaW5lciBvYmplY3QgdGhhdCBwYXJ0aWNpcGF0ZXMgaW4gY3ljbGljIGdjIGNhbiBhdm9pZCB0aGlzIGJ5CiticmFja2V0aW5nIHRoZSBib2R5IG9mIGl0cyB0cF9kZWFsbG9jIGZ1bmN0aW9uIHdpdGggYSBwYWlyIG9mIG1hY3JvczoKKworc3RhdGljIHZvaWQKK215dHlwZV9kZWFsbG9jKG15dHlwZSAqcCkKK3sKKyAgICAuLi4gZGVjbGFyYXRpb25zIGdvIGhlcmUgLi4uCisKKyAgICBQeU9iamVjdF9HQ19VblRyYWNrKHApOyAgICAgICAgLy8gbXVzdCB1bnRyYWNrIGZpcnN0CisgICAgUHlfVFJBU0hDQU5fU0FGRV9CRUdJTihwKQorICAgIC4uLiBUaGUgYm9keSBvZiB0aGUgZGVhbGxvY2F0b3IgZ29lcyBoZXJlLCBpbmNsdWRpbmcgYWxsIGNhbGxzIC4uLgorICAgIC4uLiB0byBQeV9ERUNSRUYgb24gY29udGFpbmVkIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgorICAgIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKHApCit9CisKK0NBVVRJT046ICBOZXZlciByZXR1cm4gZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSBib2R5ISAgSWYgdGhlIGJvZHkgbmVlZHMgdG8KKyJnZXQgb3V0IGVhcmx5IiwgcHV0IGEgbGFiZWwgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBQeV9UUkFTSENBTl9TQUZFX0VORAorY2FsbCwgYW5kIGdvdG8gaXQuICBFbHNlIHRoZSBjYWxsLWRlcHRoIGNvdW50ZXIgKHNlZSBiZWxvdykgd2lsbCBzdGF5CithYm92ZSAwIGZvcmV2ZXIsIGFuZCB0aGUgdHJhc2hjYW4gd2lsbCBuZXZlciBnZXQgZW1wdGllZC4KKworSG93IGl0IHdvcmtzOiAgVGhlIEJFR0lOIG1hY3JvIGluY3JlbWVudHMgYSBjYWxsLWRlcHRoIGNvdW50ZXIuICBTbyBsb25nCithcyB0aGlzIGNvdW50ZXIgaXMgc21hbGwsIHRoZSBib2R5IG9mIHRoZSBkZWFsbG9jYXRvciBpcyBydW4gZGlyZWN0bHkgd2l0aG91dAorZnVydGhlciBhZG8uICBCdXQgaWYgdGhlIGNvdW50ZXIgZ2V0cyBsYXJnZSwgaXQgaW5zdGVhZCBhZGRzIHAgdG8gYSBsaXN0IG9mCitvYmplY3RzIHRvIGJlIGRlYWxsb2NhdGVkIGxhdGVyLCBza2lwcyB0aGUgYm9keSBvZiB0aGUgZGVhbGxvY2F0b3IsIGFuZAorcmVzdW1lcyBleGVjdXRpb24gYWZ0ZXIgdGhlIEVORCBtYWNyby4gIFRoZSB0cF9kZWFsbG9jIHJvdXRpbmUgdGhlbiByZXR1cm5zCit3aXRob3V0IGRlYWxsb2NhdGluZyBhbnl0aGluZyAoYW5kIHNvIHVuYm91bmRlZCBjYWxsLXN0YWNrIGRlcHRoIGlzIGF2b2lkZWQpLgorCitXaGVuIHRoZSBjYWxsIHN0YWNrIGZpbmlzaGVzIHVud2luZGluZyBhZ2FpbiwgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIEVORCBtYWNybworbm90aWNlcyB0aGlzLCBhbmQgY2FsbHMgYW5vdGhlciByb3V0aW5lIHRvIGRlYWxsb2NhdGUgYWxsIHRoZSBvYmplY3RzIHRoYXQKK21heSBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGxpc3Qgb2YgZGVmZXJyZWQgZGVhbGxvY2F0aW9ucy4gIEluIGVmZmVjdCwgYQorY2hhaW4gb2YgTiBkZWFsbG9jYXRpb25zIGlzIGJyb2tlbiBpbnRvIE4gLyBQeVRyYXNoX1VOV0lORF9MRVZFTCBwaWVjZXMsCit3aXRoIHRoZSBjYWxsIHN0YWNrIG5ldmVyIGV4Y2VlZGluZyBhIGRlcHRoIG9mIFB5VHJhc2hfVU5XSU5EX0xFVkVMLgorKi8KKworLyogVGhpcyBpcyB0aGUgb2xkIHByaXZhdGUgQVBJLCBpbnZva2VkIGJ5IHRoZSBtYWNyb3MgYmVmb3JlIDIuNy40LgorICAgS2VwdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkgb2YgZXh0ZW5zaW9ucy4gKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5VHJhc2hfZGVwb3NpdF9vYmplY3QoUHlPYmplY3QqKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5VHJhc2hfZGVzdHJveV9jaGFpbih2b2lkKTsKK1B5QVBJX0RBVEEoaW50KSBfUHlUcmFzaF9kZWxldGVfbmVzdGluZzsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgX1B5VHJhc2hfZGVsZXRlX2xhdGVyOworCisvKiBUaGUgbmV3IHRocmVhZC1zYWZlIHByaXZhdGUgQVBJLCBpbnZva2VkIGJ5IHRoZSBtYWNyb3MgYmVsb3cuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeVRyYXNoX3RocmVhZF9kZXBvc2l0X29iamVjdChQeU9iamVjdCopOworUHlBUElfRlVOQyh2b2lkKSBfUHlUcmFzaF90aHJlYWRfZGVzdHJveV9jaGFpbih2b2lkKTsKKworI2RlZmluZSBQeVRyYXNoX1VOV0lORF9MRVZFTCA1MAorCisvKiBOb3RlIHRoZSB3b3JrYXJvdW5kIGZvciB3aGVuIHRoZSB0aHJlYWQgc3RhdGUgaXMgTlVMTCAoaXNzdWUgIzE3NzAzKSAqLworI2RlZmluZSBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKG9wKSBcCisgICAgZG8geyBcCisgICAgICAgIFB5VGhyZWFkU3RhdGUgKl90c3RhdGUgPSBQeVRocmVhZFN0YXRlX0dFVCgpOyBcCisgICAgICAgIGlmICghX3RzdGF0ZSB8fCBcCisgICAgICAgICAgICBfdHN0YXRlLT50cmFzaF9kZWxldGVfbmVzdGluZyA8IFB5VHJhc2hfVU5XSU5EX0xFVkVMKSB7IFwKKyAgICAgICAgICAgIGlmIChfdHN0YXRlKSBcCisgICAgICAgICAgICAgICAgKytfdHN0YXRlLT50cmFzaF9kZWxldGVfbmVzdGluZzsKKyAgICAgICAgICAgIC8qIFRoZSBib2R5IG9mIHRoZSBkZWFsbG9jYXRvciBpcyBoZXJlLiAqLworI2RlZmluZSBQeV9UUkFTSENBTl9TQUZFX0VORChvcCkgXAorICAgICAgICAgICAgaWYgKF90c3RhdGUpIHsgXAorICAgICAgICAgICAgICAgIC0tX3RzdGF0ZS0+dHJhc2hfZGVsZXRlX25lc3Rpbmc7IFwKKyAgICAgICAgICAgICAgICBpZiAoX3RzdGF0ZS0+dHJhc2hfZGVsZXRlX2xhdGVyIFwKKyAgICAgICAgICAgICAgICAgICAgJiYgX3RzdGF0ZS0+dHJhc2hfZGVsZXRlX25lc3RpbmcgPD0gMCkgXAorICAgICAgICAgICAgICAgICAgICBfUHlUcmFzaF90aHJlYWRfZGVzdHJveV9jaGFpbigpOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgX1B5VHJhc2hfdGhyZWFkX2RlcG9zaXRfb2JqZWN0KChQeU9iamVjdCopb3ApOyBcCisgICAgfSB3aGlsZSAoMCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X09CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9vYmppbXBsLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9vYmppbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZhOTYwNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L29iamltcGwuaApAQCAtMCwwICsxLDM2MCBAQAorLyogVGhlIFB5T2JqZWN0XyBtZW1vcnkgZmFtaWx5OiAgaGlnaC1sZXZlbCBvYmplY3QgbWVtb3J5IGludGVyZmFjZXMuCisgICBTZWUgcHltZW0uaCBmb3IgdGhlIGxvdy1sZXZlbCBQeU1lbV8gZmFtaWx5LgorKi8KKworI2lmbmRlZiBQeV9PQkpJTVBMX0gKKyNkZWZpbmUgUHlfT0JKSU1QTF9ICisKKyNpbmNsdWRlICJweW1lbS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEJFV0FSRToKKworICAgRWFjaCBpbnRlcmZhY2UgZXhwb3J0cyBib3RoIGZ1bmN0aW9ucyBhbmQgbWFjcm9zLiAgRXh0ZW5zaW9uIG1vZHVsZXMgc2hvdWxkCisgICB1c2UgdGhlIGZ1bmN0aW9ucywgdG8gZW5zdXJlIGJpbmFyeSBjb21wYXRpYmlsaXR5IGFjcm9zcyBQeXRob24gdmVyc2lvbnMuCisgICBCZWNhdXNlIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gaXMgZnJlZSB0byBjaGFuZ2UgaW50ZXJuYWwgZGV0YWlscywgYW5kCisgICB0aGUgbWFjcm9zIG1heSAob3IgbWF5IG5vdCkgZXhwb3NlIGRldGFpbHMgZm9yIHNwZWVkLCBpZiB5b3UgZG8gdXNlIHRoZQorICAgbWFjcm9zIHlvdSBtdXN0IHJlY29tcGlsZSB5b3VyIGV4dGVuc2lvbnMgd2l0aCBlYWNoIFB5dGhvbiByZWxlYXNlLgorCisgICBOZXZlciBtaXggY2FsbHMgdG8gUHlPYmplY3RfIG1lbW9yeSBmdW5jdGlvbnMgd2l0aCBjYWxscyB0byB0aGUgcGxhdGZvcm0KKyAgIG1hbGxvYy9yZWFsbG9jLyBjYWxsb2MvZnJlZSwgb3Igd2l0aCBjYWxscyB0byBQeU1lbV8uCisqLworCisvKgorRnVuY3Rpb25zIGFuZCBtYWNyb3MgZm9yIG1vZHVsZXMgdGhhdCBpbXBsZW1lbnQgbmV3IG9iamVjdCB0eXBlcy4KKworIC0gUHlPYmplY3RfTmV3KHR5cGUsIHR5cGVvYmopIGFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgbmV3IG9iamVjdCBvZiB0aGUgZ2l2ZW4KKyAgIHR5cGUsIGFuZCBpbml0aWFsaXplcyBwYXJ0IG9mIGl0LiAgJ3R5cGUnIG11c3QgYmUgdGhlIEMgc3RydWN0dXJlIHR5cGUgdXNlZAorICAgdG8gcmVwcmVzZW50IHRoZSBvYmplY3QsIGFuZCAndHlwZW9iaicgdGhlIGFkZHJlc3Mgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKyAgIHR5cGUgb2JqZWN0LiAgUmVmZXJlbmNlIGNvdW50IGFuZCB0eXBlIHBvaW50ZXIgYXJlIGZpbGxlZCBpbjsgdGhlIHJlc3Qgb2YKKyAgIHRoZSBieXRlcyBvZiB0aGUgb2JqZWN0IGFyZSAqdW5kZWZpbmVkKiEgIFRoZSByZXN1bHRpbmcgZXhwcmVzc2lvbiB0eXBlIGlzCisgICAndHlwZSAqJy4gIFRoZSBzaXplIG9mIHRoZSBvYmplY3QgaXMgZGV0ZXJtaW5lZCBieSB0aGUgdHBfYmFzaWNzaXplIGZpZWxkCisgICBvZiB0aGUgdHlwZSBvYmplY3QuCisKKyAtIFB5T2JqZWN0X05ld1Zhcih0eXBlLCB0eXBlb2JqLCBuKSBpcyBzaW1pbGFyIGJ1dCBhbGxvY2F0ZXMgYSB2YXJpYWJsZS1zaXplCisgICBvYmplY3Qgd2l0aCByb29tIGZvciBuIGl0ZW1zLiAgSW4gYWRkaXRpb24gdG8gdGhlIHJlZmNvdW50IGFuZCB0eXBlIHBvaW50ZXIKKyAgIGZpZWxkcywgdGhpcyBhbHNvIGZpbGxzIGluIHRoZSBvYl9zaXplIGZpZWxkLgorCisgLSBQeU9iamVjdF9EZWwob3ApIHJlbGVhc2VzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBhbiBvYmplY3QuICBJdCBkb2VzIG5vdAorICAgcnVuIGEgZGVzdHJ1Y3RvciAtLSBpdCBvbmx5IGZyZWVzIHRoZSBtZW1vcnkuICBQeU9iamVjdF9GcmVlIGlzIGlkZW50aWNhbC4KKworIC0gUHlPYmplY3RfSW5pdChvcCwgdHlwZW9iaikgYW5kIFB5T2JqZWN0X0luaXRWYXIob3AsIHR5cGVvYmosIG4pIGRvbid0CisgICBhbGxvY2F0ZSBtZW1vcnkuICBJbnN0ZWFkIG9mIGEgJ3R5cGUnIHBhcmFtZXRlciwgdGhleSB0YWtlIGEgcG9pbnRlciB0byBhCisgICBuZXcgb2JqZWN0IChhbGxvY2F0ZWQgYnkgYW4gYXJiaXRyYXJ5IGFsbG9jYXRvciksIGFuZCBpbml0aWFsaXplIGl0cyBvYmplY3QKKyAgIGhlYWRlciBmaWVsZHMuCisKK05vdGUgdGhhdCBvYmplY3RzIGNyZWF0ZWQgd2l0aCBQeU9iamVjdF97TmV3LCBOZXdWYXJ9IGFyZSBhbGxvY2F0ZWQgdXNpbmcgdGhlCitzcGVjaWFsaXplZCBQeXRob24gYWxsb2NhdG9yIChpbXBsZW1lbnRlZCBpbiBvYm1hbGxvYy5jKSwgaWYgV0lUSF9QWU1BTExPQyBpcworZW5hYmxlZC4gIEluIGFkZGl0aW9uLCBhIHNwZWNpYWwgZGVidWdnaW5nIGFsbG9jYXRvciBpcyB1c2VkIGlmIFBZTUFMTE9DX0RFQlVHCitpcyBhbHNvICNkZWZpbmVkLgorCitJbiBjYXNlIGEgc3BlY2lmaWMgZm9ybSBvZiBtZW1vcnkgbWFuYWdlbWVudCBpcyBuZWVkZWQgKGZvciBleGFtcGxlLCBpZiB5b3UKK211c3QgdXNlIHRoZSBwbGF0Zm9ybSBtYWxsb2MgaGVhcChzKSwgb3Igc2hhcmVkIG1lbW9yeSwgb3IgQysrIGxvY2FsIHN0b3JhZ2Ugb3IKK29wZXJhdG9yIG5ldyksIHlvdSBtdXN0IGZpcnN0IGFsbG9jYXRlIHRoZSBvYmplY3Qgd2l0aCB5b3VyIGN1c3RvbSBhbGxvY2F0b3IsCit0aGVuIHBhc3MgaXRzIHBvaW50ZXIgdG8gUHlPYmplY3Rfe0luaXQsIEluaXRWYXJ9IGZvciBmaWxsaW5nIGluIGl0cyBQeXRob24tCitzcGVjaWZpYyBmaWVsZHM6ICByZWZlcmVuY2UgY291bnQsIHR5cGUgcG9pbnRlciwgcG9zc2libHkgb3RoZXJzLiAgWW91IHNob3VsZAorYmUgYXdhcmUgdGhhdCBQeXRob24gbm8gY29udHJvbCBvdmVyIHRoZXNlIG9iamVjdHMgYmVjYXVzZSB0aGV5IGRvbid0Citjb29wZXJhdGUgd2l0aCB0aGUgUHl0aG9uIG1lbW9yeSBtYW5hZ2VyLiAgU3VjaCBvYmplY3RzIG1heSBub3QgYmUgZWxpZ2libGUKK2ZvciBhdXRvbWF0aWMgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCB5b3UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB0aGV5IGFyZQorcmVsZWFzZWQgYWNjb3JkaW5nbHkgd2hlbmV2ZXIgdGhlaXIgZGVzdHJ1Y3RvciBnZXRzIGNhbGxlZCAoY2YuIHRoZSBzcGVjaWZpYworZm9ybSBvZiBtZW1vcnkgbWFuYWdlbWVudCB5b3UncmUgdXNpbmcpLgorCitVbmxlc3MgeW91IGhhdmUgc3BlY2lmaWMgbWVtb3J5IG1hbmFnZW1lbnQgcmVxdWlyZW1lbnRzLCB1c2UKK1B5T2JqZWN0X3tOZXcsIE5ld1ZhciwgRGVsfS4KKyovCisKKy8qCisgKiBSYXcgb2JqZWN0IG1lbW9yeSBpbnRlcmZhY2UKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIEZ1bmN0aW9ucyB0byBjYWxsIHRoZSBzYW1lIG1hbGxvYy9yZWFsbG9jL2ZyZWUgYXMgdXNlZCBieSBQeXRob24ncworICAgb2JqZWN0IGFsbG9jYXRvci4gIElmIFdJVEhfUFlNQUxMT0MgaXMgZW5hYmxlZCwgdGhlc2UgbWF5IGRpZmZlciBmcm9tCisgICB0aGUgcGxhdGZvcm0gbWFsbG9jL3JlYWxsb2MvZnJlZS4gIFRoZSBQeXRob24gb2JqZWN0IGFsbG9jYXRvciBpcworICAgZGVzaWduZWQgZm9yIGZhc3QsIGNhY2hlLWNvbnNjaW91cyBhbGxvY2F0aW9uIG9mIG1hbnkgInNtYWxsIiBvYmplY3RzLAorICAgYW5kIHdpdGggbG93IGhpZGRlbiBtZW1vcnkgb3ZlcmhlYWQuCisKKyAgIFB5T2JqZWN0X01hbGxvYygwKSByZXR1cm5zIGEgdW5pcXVlIG5vbi1OVUxMIHBvaW50ZXIgaWYgcG9zc2libGUuCisKKyAgIFB5T2JqZWN0X1JlYWxsb2MoTlVMTCwgbikgYWN0cyBsaWtlIFB5T2JqZWN0X01hbGxvYyhuKS4KKyAgIFB5T2JqZWN0X1JlYWxsb2MocCAhPSBOVUxMLCAwKSBkb2VzIG5vdCByZXR1cm4gIE5VTEwsIG9yIGZyZWUgdGhlIG1lbW9yeQorICAgYXQgcC4KKworICAgUmV0dXJuZWQgcG9pbnRlcnMgbXVzdCBiZSBjaGVja2VkIGZvciBOVUxMIGV4cGxpY2l0bHk7IG5vIGFjdGlvbiBpcworICAgcGVyZm9ybWVkIG9uIGZhaWx1cmUgb3RoZXIgdGhhbiB0byByZXR1cm4gTlVMTCAobm8gd2FybmluZyBpdCBwcmludGVkLCBubworICAgZXhjZXB0aW9uIGlzIHNldCwgZXRjKS4KKworICAgRm9yIGFsbG9jYXRpbmcgb2JqZWN0cywgdXNlIFB5T2JqZWN0X3tOZXcsIE5ld1Zhcn0gaW5zdGVhZCB3aGVuZXZlcgorICAgcG9zc2libGUuICBUaGUgUHlPYmplY3Rfe01hbGxvYywgUmVhbGxvYywgRnJlZX0gZmFtaWx5IGlzIGV4cG9zZWQKKyAgIHNvIHRoYXQgeW91IGNhbiBleHBsb2l0IFB5dGhvbidzIHNtYWxsLWJsb2NrIGFsbG9jYXRvciBmb3Igbm9uLW9iamVjdAorICAgdXNlcy4gIElmIHlvdSBtdXN0IHVzZSB0aGVzZSByb3V0aW5lcyB0byBhbGxvY2F0ZSBvYmplY3QgbWVtb3J5LCBtYWtlIHN1cmUKKyAgIHRoZSBvYmplY3QgZ2V0cyBpbml0aWFsaXplZCB2aWEgUHlPYmplY3Rfe0luaXQsIEluaXRWYXJ9IGFmdGVyIG9idGFpbmluZworICAgdGhlIHJhdyBtZW1vcnkuCisqLworUHlBUElfRlVOQyh2b2lkICopIFB5T2JqZWN0X01hbGxvYyhzaXplX3QpOworUHlBUElfRlVOQyh2b2lkICopIFB5T2JqZWN0X1JlYWxsb2Modm9pZCAqLCBzaXplX3QpOworUHlBUElfRlVOQyh2b2lkKSBQeU9iamVjdF9GcmVlKHZvaWQgKik7CisKKworLyogTWFjcm9zICovCisjaWZkZWYgV0lUSF9QWU1BTExPQworI2lmZGVmIFBZTUFMTE9DX0RFQlVHICAgLyogV0lUSF9QWU1BTExPQyAmJiBQWU1BTExPQ19ERUJVRyAqLworUHlBUElfRlVOQyh2b2lkICopIF9QeU9iamVjdF9EZWJ1Z01hbGxvYyhzaXplX3QgbmJ5dGVzKTsKK1B5QVBJX0ZVTkModm9pZCAqKSBfUHlPYmplY3RfRGVidWdSZWFsbG9jKHZvaWQgKnAsIHNpemVfdCBuYnl0ZXMpOworUHlBUElfRlVOQyh2b2lkKSBfUHlPYmplY3RfRGVidWdGcmVlKHZvaWQgKnApOworUHlBUElfRlVOQyh2b2lkKSBfUHlPYmplY3RfRGVidWdEdW1wQWRkcmVzcyhjb25zdCB2b2lkICpwKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5T2JqZWN0X0RlYnVnQ2hlY2tBZGRyZXNzKGNvbnN0IHZvaWQgKnApOworUHlBUElfRlVOQyh2b2lkKSBfUHlPYmplY3RfRGVidWdNYWxsb2NTdGF0cyh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCAqKSBfUHlPYmplY3RfRGVidWdNYWxsb2NBcGkoY2hhciBhcGksIHNpemVfdCBuYnl0ZXMpOworUHlBUElfRlVOQyh2b2lkICopIF9QeU9iamVjdF9EZWJ1Z1JlYWxsb2NBcGkoY2hhciBhcGksIHZvaWQgKnAsIHNpemVfdCBuYnl0ZXMpOworUHlBUElfRlVOQyh2b2lkKSBfUHlPYmplY3RfRGVidWdGcmVlQXBpKGNoYXIgYXBpLCB2b2lkICpwKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5T2JqZWN0X0RlYnVnQ2hlY2tBZGRyZXNzQXBpKGNoYXIgYXBpLCBjb25zdCB2b2lkICpwKTsKK1B5QVBJX0ZVTkModm9pZCAqKSBfUHlNZW1fRGVidWdNYWxsb2Moc2l6ZV90IG5ieXRlcyk7CitQeUFQSV9GVU5DKHZvaWQgKikgX1B5TWVtX0RlYnVnUmVhbGxvYyh2b2lkICpwLCBzaXplX3QgbmJ5dGVzKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5TWVtX0RlYnVnRnJlZSh2b2lkICpwKTsKKyNkZWZpbmUgUHlPYmplY3RfTUFMTE9DICAgICAgICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jCisjZGVmaW5lIFB5T2JqZWN0X01hbGxvYyAgICAgICAgIF9QeU9iamVjdF9EZWJ1Z01hbGxvYworI2RlZmluZSBQeU9iamVjdF9SRUFMTE9DICAgICAgICBfUHlPYmplY3RfRGVidWdSZWFsbG9jCisjZGVmaW5lIFB5T2JqZWN0X1JlYWxsb2MgICAgICAgIF9QeU9iamVjdF9EZWJ1Z1JlYWxsb2MKKyNkZWZpbmUgUHlPYmplY3RfRlJFRSAgICAgICAgICAgX1B5T2JqZWN0X0RlYnVnRnJlZQorI2RlZmluZSBQeU9iamVjdF9GcmVlICAgICAgICAgICBfUHlPYmplY3RfRGVidWdGcmVlCisKKyNlbHNlICAgLyogV0lUSF9QWU1BTExPQyAmJiAhIFBZTUFMTE9DX0RFQlVHICovCisjZGVmaW5lIFB5T2JqZWN0X01BTExPQyAgICAgICAgIFB5T2JqZWN0X01hbGxvYworI2RlZmluZSBQeU9iamVjdF9SRUFMTE9DICAgICAgICBQeU9iamVjdF9SZWFsbG9jCisjZGVmaW5lIFB5T2JqZWN0X0ZSRUUgICAgICAgICAgIFB5T2JqZWN0X0ZyZWUKKyNlbmRpZgorCisjZWxzZSAgIC8qICEgV0lUSF9QWU1BTExPQyAqLworI2RlZmluZSBQeU9iamVjdF9NQUxMT0MgICAgICAgICBQeU1lbV9NQUxMT0MKKyNkZWZpbmUgUHlPYmplY3RfUkVBTExPQyAgICAgICAgUHlNZW1fUkVBTExPQworI2RlZmluZSBQeU9iamVjdF9GUkVFICAgICAgICAgICBQeU1lbV9GUkVFCisKKyNlbmRpZiAgLyogV0lUSF9QWU1BTExPQyAqLworCisjZGVmaW5lIFB5T2JqZWN0X0RlbCAgICAgICAgICAgIFB5T2JqZWN0X0ZyZWUKKyNkZWZpbmUgUHlPYmplY3RfREVMICAgICAgICAgICAgUHlPYmplY3RfRlJFRQorCisvKiBmb3Igc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCAyLjIgKi8KKyNkZWZpbmUgX1B5T2JqZWN0X0RlbCAgICAgICAgICAgUHlPYmplY3RfRnJlZQorCisvKgorICogR2VuZXJpYyBvYmplY3QgYWxsb2NhdG9yIGludGVyZmFjZQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIEZ1bmN0aW9ucyAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9Jbml0KFB5T2JqZWN0ICosIFB5VHlwZU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlWYXJPYmplY3QgKikgUHlPYmplY3RfSW5pdFZhcihQeVZhck9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHlwZU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5T2JqZWN0X05ldyhQeVR5cGVPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5VmFyT2JqZWN0ICopIF9QeU9iamVjdF9OZXdWYXIoUHlUeXBlT2JqZWN0ICosIFB5X3NzaXplX3QpOworCisjZGVmaW5lIFB5T2JqZWN0X05ldyh0eXBlLCB0eXBlb2JqKSBcCisgICAgICAgICAgICAgICAgKCAodHlwZSAqKSBfUHlPYmplY3RfTmV3KHR5cGVvYmopICkKKyNkZWZpbmUgUHlPYmplY3RfTmV3VmFyKHR5cGUsIHR5cGVvYmosIG4pIFwKKyAgICAgICAgICAgICAgICAoICh0eXBlICopIF9QeU9iamVjdF9OZXdWYXIoKHR5cGVvYmopLCAobikpICkKKworLyogTWFjcm9zIHRyYWRpbmcgYmluYXJ5IGNvbXBhdGliaWxpdHkgZm9yIHNwZWVkLiBTZWUgYWxzbyBweW1lbS5oLgorICAgTm90ZSB0aGF0IHRoZXNlIG1hY3JvcyBleHBlY3Qgbm9uLU5VTEwgb2JqZWN0IHBvaW50ZXJzLiovCisjZGVmaW5lIFB5T2JqZWN0X0lOSVQob3AsIHR5cGVvYmopIFwKKyAgICAoIFB5X1RZUEUob3ApID0gKHR5cGVvYmopLCBfUHlfTmV3UmVmZXJlbmNlKChQeU9iamVjdCAqKShvcCkpLCAob3ApICkKKyNkZWZpbmUgUHlPYmplY3RfSU5JVF9WQVIob3AsIHR5cGVvYmosIHNpemUpIFwKKyAgICAoIFB5X1NJWkUob3ApID0gKHNpemUpLCBQeU9iamVjdF9JTklUKChvcCksICh0eXBlb2JqKSkgKQorCisjZGVmaW5lIF9QeU9iamVjdF9TSVpFKHR5cGVvYmopICggKHR5cGVvYmopLT50cF9iYXNpY3NpemUgKQorCisvKiBfUHlPYmplY3RfVkFSX1NJWkUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIChhcyBzaXplX3QpIGFsbG9jYXRlZCBmb3IgYQorICAgdnJibC1zaXplIG9iamVjdCB3aXRoIG5pdGVtcyBpdGVtcywgZXhjbHVzaXZlIG9mIGdjIG92ZXJoZWFkIChpZiBhbnkpLiAgVGhlCisgICB2YWx1ZSBpcyByb3VuZGVkIHVwIHRvIHRoZSBjbG9zZXN0IG11bHRpcGxlIG9mIHNpemVvZih2b2lkICopLCBpbiBvcmRlciB0bworICAgZW5zdXJlIHRoYXQgcG9pbnRlciBmaWVsZHMgYXQgdGhlIGVuZCBvZiB0aGUgb2JqZWN0IGFyZSBjb3JyZWN0bHkgYWxpZ25lZAorICAgZm9yIHRoZSBwbGF0Zm9ybSAodGhpcyBpcyBvZiBzcGVjaWFsIGltcG9ydGFuY2UgZm9yIHN1YmNsYXNzZXMgb2YsIGUuZy4sCisgICBzdHIgb3IgbG9uZywgc28gdGhhdCBwb2ludGVycyBjYW4gYmUgc3RvcmVkIGFmdGVyIHRoZSBlbWJlZGRlZCBkYXRhKS4KKworICAgTm90ZSB0aGF0IHRoZXJlJ3Mgbm8gbWVtb3J5IHdhc3RhZ2UgaW4gZG9pbmcgdGhpcywgYXMgbWFsbG9jIGhhcyB0bworICAgcmV0dXJuIChhdCB3b3JzdCkgcG9pbnRlci1hbGlnbmVkIG1lbW9yeSBhbnl3YXkuCisqLworI2lmICgoU0laRU9GX1ZPSURfUCAtIDEpICYgU0laRU9GX1ZPSURfUCkgIT0gMAorIyAgIGVycm9yICJfUHlPYmplY3RfVkFSX1NJWkUgcmVxdWlyZXMgU0laRU9GX1ZPSURfUCBiZSBhIHBvd2VyIG9mIDIiCisjZW5kaWYKKworI2RlZmluZSBfUHlPYmplY3RfVkFSX1NJWkUodHlwZW9iaiwgbml0ZW1zKSAgICAgXAorICAgIChzaXplX3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggKCAodHlwZW9iaiktPnRwX2Jhc2ljc2l6ZSArICAgICAgICAgICAgICAgXAorICAgICAgICAobml0ZW1zKSoodHlwZW9iaiktPnRwX2l0ZW1zaXplICsgICAgICAgXAorICAgICAgICAoU0laRU9GX1ZPSURfUCAtIDEpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKSAmIH4oU0laRU9GX1ZPSURfUCAtIDEpICAgICAgICAgICAgICAgICAgXAorICAgICkKKworI2RlZmluZSBQeU9iamVjdF9ORVcodHlwZSwgdHlwZW9iaikgXAorKCAodHlwZSAqKSBQeU9iamVjdF9Jbml0KCBcCisgICAgKFB5T2JqZWN0ICopIFB5T2JqZWN0X01BTExPQyggX1B5T2JqZWN0X1NJWkUodHlwZW9iaikgKSwgKHR5cGVvYmopKSApCisKKyNkZWZpbmUgUHlPYmplY3RfTkVXX1ZBUih0eXBlLCB0eXBlb2JqLCBuKSBcCisoICh0eXBlICopIFB5T2JqZWN0X0luaXRWYXIoIFwKKyAgICAgIChQeVZhck9iamVjdCAqKSBQeU9iamVjdF9NQUxMT0MoX1B5T2JqZWN0X1ZBUl9TSVpFKCh0eXBlb2JqKSwobikpICksXAorICAgICAgKHR5cGVvYmopLCAobikpICkKKworLyogVGhpcyBleGFtcGxlIGNvZGUgaW1wbGVtZW50cyBhbiBvYmplY3QgY29uc3RydWN0b3Igd2l0aCBhIGN1c3RvbQorICAgYWxsb2NhdG9yLCB3aGVyZSBQeU9iamVjdF9OZXcgaXMgaW5saW5lZCwgYW5kIHNob3dzIHRoZSBpbXBvcnRhbnQKKyAgIGRpc3RpbmN0aW9uIGJldHdlZW4gdHdvIHN0ZXBzIChhdCBsZWFzdCk6CisgICAgICAgMSkgdGhlIGFjdHVhbCBhbGxvY2F0aW9uIG9mIHRoZSBvYmplY3Qgc3RvcmFnZTsKKyAgICAgICAyKSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIFB5dGhvbiBzcGVjaWZpYyBmaWVsZHMKKyAgICAgIGluIHRoaXMgc3RvcmFnZSB3aXRoIFB5T2JqZWN0X3tJbml0LCBJbml0VmFyfS4KKworICAgUHlPYmplY3QgKgorICAgWW91ck9iamVjdF9OZXcoLi4uKQorICAgeworICAgICAgIFB5T2JqZWN0ICpvcDsKKworICAgICAgIG9wID0gKFB5T2JqZWN0ICopIFlvdXJfQWxsb2NhdG9yKF9QeU9iamVjdF9TSVpFKFlvdXJUeXBlU3RydWN0KSk7CisgICAgICAgaWYgKG9wID09IE5VTEwpCisgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisKKyAgICAgICBQeU9iamVjdF9Jbml0KG9wLCAmWW91clR5cGVTdHJ1Y3QpOworCisgICAgICAgb3AtPm9iX2ZpZWxkID0gdmFsdWU7CisgICAgICAgLi4uCisgICAgICAgcmV0dXJuIG9wOworICAgfQorCisgICBOb3RlIHRoYXQgaW4gQysrLCB0aGUgdXNlIG9mIHRoZSBuZXcgb3BlcmF0b3IgdXN1YWxseSBpbXBsaWVzIHRoYXQKKyAgIHRoZSAxc3Qgc3RlcCBpcyBwZXJmb3JtZWQgYXV0b21hdGljYWxseSBmb3IgeW91LCBzbyBpbiBhIEMrKyBjbGFzcworICAgY29uc3RydWN0b3IgeW91IHdvdWxkIHN0YXJ0IGRpcmVjdGx5IHdpdGggUHlPYmplY3RfSW5pdC9Jbml0VmFyCisqLworCisvKgorICogR2FyYmFnZSBDb2xsZWN0aW9uIFN1cHBvcnQKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogQyBlcXVpdmFsZW50IG9mIGdjLmNvbGxlY3QoKS4gKi8KK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlHQ19Db2xsZWN0KHZvaWQpOworCisvKiBUZXN0IGlmIGEgdHlwZSBoYXMgYSBHQyBoZWFkICovCisjZGVmaW5lIFB5VHlwZV9JU19HQyh0KSBQeVR5cGVfSGFzRmVhdHVyZSgodCksIFB5X1RQRkxBR1NfSEFWRV9HQykKKworLyogVGVzdCBpZiBhbiBvYmplY3QgaGFzIGEgR0MgaGVhZCAqLworI2RlZmluZSBQeU9iamVjdF9JU19HQyhvKSAoUHlUeXBlX0lTX0dDKFB5X1RZUEUobykpICYmIFwKKyAgICAoUHlfVFlQRShvKS0+dHBfaXNfZ2MgPT0gTlVMTCB8fCBQeV9UWVBFKG8pLT50cF9pc19nYyhvKSkpCisKK1B5QVBJX0ZVTkMoUHlWYXJPYmplY3QgKikgX1B5T2JqZWN0X0dDX1Jlc2l6ZShQeVZhck9iamVjdCAqLCBQeV9zc2l6ZV90KTsKKyNkZWZpbmUgUHlPYmplY3RfR0NfUmVzaXplKHR5cGUsIG9wLCBuKSBcCisgICAgICAgICAgICAgICAgKCAodHlwZSAqKSBfUHlPYmplY3RfR0NfUmVzaXplKChQeVZhck9iamVjdCAqKShvcCksIChuKSkgKQorCisvKiBmb3Igc291cmNlIGNvbXBhdGliaWxpdHkgd2l0aCAyLjIgKi8KKyNkZWZpbmUgX1B5T2JqZWN0X0dDX0RlbCBQeU9iamVjdF9HQ19EZWwKKworLyogR0MgaW5mb3JtYXRpb24gaXMgc3RvcmVkIEJFRk9SRSB0aGUgb2JqZWN0IHN0cnVjdHVyZS4gKi8KK3R5cGVkZWYgdW5pb24gX2djX2hlYWQgeworICAgIHN0cnVjdCB7CisgICAgICAgIHVuaW9uIF9nY19oZWFkICpnY19uZXh0OworICAgICAgICB1bmlvbiBfZ2NfaGVhZCAqZ2NfcHJldjsKKyAgICAgICAgUHlfc3NpemVfdCBnY19yZWZzOworICAgIH0gZ2M7CisgICAgbG9uZyBkb3VibGUgZHVtbXk7ICAvKiBmb3JjZSB3b3JzdC1jYXNlIGFsaWdubWVudCAqLworI2lmIGRlZmluZWQoX19NSU5HVzMyX18pCisvKiBGSVhNRTogd2hhdCBhYm91dCA2NC1iaXQgcGxhdGZvcm1zID8KKyAqIHNlZSBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDktSnVseS8wOTA3MjQuaHRtbAorICovCisJZG91YmxlIGR1bW15MTsKKyNlbmRpZgorfSBQeUdDX0hlYWQ7CisKK2V4dGVybiBQeUdDX0hlYWQgKl9QeUdDX2dlbmVyYXRpb24wOworCisjZGVmaW5lIF9QeV9BU19HQyhvKSAoKFB5R0NfSGVhZCAqKShvKS0xKQorCisjZGVmaW5lIF9QeUdDX1JFRlNfVU5UUkFDS0VEICAgICAgICAgICAgICAgICAgICAoLTIpCisjZGVmaW5lIF9QeUdDX1JFRlNfUkVBQ0hBQkxFICAgICAgICAgICAgICAgICAgICAoLTMpCisjZGVmaW5lIF9QeUdDX1JFRlNfVEVOVEFUSVZFTFlfVU5SRUFDSEFCTEUgICAgICAoLTQpCisKKy8qIFRlbGwgdGhlIEdDIHRvIHRyYWNrIHRoaXMgb2JqZWN0LiAgTkI6IFdoaWxlIHRoZSBvYmplY3QgaXMgdHJhY2tlZCB0aGUKKyAqIGNvbGxlY3RvciBpdCBtdXN0IGJlIHNhZmUgdG8gY2FsbCB0aGUgb2JfdHJhdmVyc2UgbWV0aG9kLiAqLworI2RlZmluZSBfUHlPYmplY3RfR0NfVFJBQ0sobykgZG8geyBcCisgICAgUHlHQ19IZWFkICpnID0gX1B5X0FTX0dDKG8pOyBcCisgICAgaWYgKGctPmdjLmdjX3JlZnMgIT0gX1B5R0NfUkVGU19VTlRSQUNLRUQpIFwKKyAgICAgICAgUHlfRmF0YWxFcnJvcigiR0Mgb2JqZWN0IGFscmVhZHkgdHJhY2tlZCIpOyBcCisgICAgZy0+Z2MuZ2NfcmVmcyA9IF9QeUdDX1JFRlNfUkVBQ0hBQkxFOyBcCisgICAgZy0+Z2MuZ2NfbmV4dCA9IF9QeUdDX2dlbmVyYXRpb24wOyBcCisgICAgZy0+Z2MuZ2NfcHJldiA9IF9QeUdDX2dlbmVyYXRpb24wLT5nYy5nY19wcmV2OyBcCisgICAgZy0+Z2MuZ2NfcHJldi0+Z2MuZ2NfbmV4dCA9IGc7IFwKKyAgICBfUHlHQ19nZW5lcmF0aW9uMC0+Z2MuZ2NfcHJldiA9IGc7IFwKKyAgICB9IHdoaWxlICgwKTsKKworLyogVGVsbCB0aGUgR0MgdG8gc3RvcCB0cmFja2luZyB0aGlzIG9iamVjdC4KKyAqIGdjX25leHQgZG9lc24ndCBuZWVkIHRvIGJlIHNldCB0byBOVUxMLCBidXQgZG9pbmcgc28gaXMgYSBnb29kCisgKiB3YXkgdG8gcHJvdm9rZSBtZW1vcnkgZXJyb3JzIGlmIGNhbGxpbmcgY29kZSBpcyBjb25mdXNlZC4KKyAqLworI2RlZmluZSBfUHlPYmplY3RfR0NfVU5UUkFDSyhvKSBkbyB7IFwKKyAgICBQeUdDX0hlYWQgKmcgPSBfUHlfQVNfR0Mobyk7IFwKKyAgICBhc3NlcnQoZy0+Z2MuZ2NfcmVmcyAhPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRCk7IFwKKyAgICBnLT5nYy5nY19yZWZzID0gX1B5R0NfUkVGU19VTlRSQUNLRUQ7IFwKKyAgICBnLT5nYy5nY19wcmV2LT5nYy5nY19uZXh0ID0gZy0+Z2MuZ2NfbmV4dDsgXAorICAgIGctPmdjLmdjX25leHQtPmdjLmdjX3ByZXYgPSBnLT5nYy5nY19wcmV2OyBcCisgICAgZy0+Z2MuZ2NfbmV4dCA9IE5VTEw7IFwKKyAgICB9IHdoaWxlICgwKTsKKworLyogVHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGN1cnJlbnRseSB0cmFja2VkIGJ5IHRoZSBHQy4gKi8KKyNkZWZpbmUgX1B5T2JqZWN0X0dDX0lTX1RSQUNLRUQobykgXAorICAgICgoX1B5X0FTX0dDKG8pKS0+Z2MuZ2NfcmVmcyAhPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRCkKKworLyogVHJ1ZSBpZiB0aGUgb2JqZWN0IG1heSBiZSB0cmFja2VkIGJ5IHRoZSBHQyBpbiB0aGUgZnV0dXJlLCBvciBhbHJlYWR5IGlzLgorICAgVGhpcyBjYW4gYmUgdXNlZnVsIHRvIGltcGxlbWVudCBzb21lIG9wdGltaXphdGlvbnMuICovCisjZGVmaW5lIF9QeU9iamVjdF9HQ19NQVlfQkVfVFJBQ0tFRChvYmopIFwKKyAgICAoUHlPYmplY3RfSVNfR0Mob2JqKSAmJiBcCisgICAgICAgICghUHlUdXBsZV9DaGVja0V4YWN0KG9iaikgfHwgX1B5T2JqZWN0X0dDX0lTX1RSQUNLRUQob2JqKSkpCisKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlPYmplY3RfR0NfTWFsbG9jKHNpemVfdCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9HQ19OZXcoUHlUeXBlT2JqZWN0ICopOworUHlBUElfRlVOQyhQeVZhck9iamVjdCAqKSBfUHlPYmplY3RfR0NfTmV3VmFyKFB5VHlwZU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKK1B5QVBJX0ZVTkModm9pZCkgUHlPYmplY3RfR0NfVHJhY2sodm9pZCAqKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlPYmplY3RfR0NfVW5UcmFjayh2b2lkICopOworUHlBUElfRlVOQyh2b2lkKSBQeU9iamVjdF9HQ19EZWwodm9pZCAqKTsKKworI2RlZmluZSBQeU9iamVjdF9HQ19OZXcodHlwZSwgdHlwZW9iaikgXAorICAgICAgICAgICAgICAgICggKHR5cGUgKikgX1B5T2JqZWN0X0dDX05ldyh0eXBlb2JqKSApCisjZGVmaW5lIFB5T2JqZWN0X0dDX05ld1Zhcih0eXBlLCB0eXBlb2JqLCBuKSBcCisgICAgICAgICAgICAgICAgKCAodHlwZSAqKSBfUHlPYmplY3RfR0NfTmV3VmFyKCh0eXBlb2JqKSwgKG4pKSApCisKKworLyogVXRpbGl0eSBtYWNybyB0byBoZWxwIHdyaXRlIHRwX3RyYXZlcnNlIGZ1bmN0aW9ucy4KKyAqIFRvIHVzZSB0aGlzIG1hY3JvLCB0aGUgdHBfdHJhdmVyc2UgZnVuY3Rpb24gbXVzdCBuYW1lIGl0cyBhcmd1bWVudHMKKyAqICJ2aXNpdCIgYW5kICJhcmciLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBrZWVwIHRwX3RyYXZlcnNlIGZ1bmN0aW9ucworICogbG9va2luZyBhcyBtdWNoIGFsaWtlIGFzIHBvc3NpYmxlLgorICovCisjZGVmaW5lIFB5X1ZJU0lUKG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChvcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgdnJldCA9IHZpc2l0KChQeU9iamVjdCAqKShvcCksIGFyZyk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAodnJldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmV0dXJuIHZyZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworLyogVGhpcyBpcyBoZXJlIGZvciB0aGUgc2FrZSBvZiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEV4dGVuc2lvbnMgdGhhdAorICogdXNlIHRoZSBvbGQgR0MgQVBJIHdpbGwgc3RpbGwgY29tcGlsZSBidXQgdGhlIG9iamVjdHMgd2lsbCBub3QgYmUKKyAqIHRyYWNrZWQgYnkgdGhlIEdDLiAqLworI2RlZmluZSBQeUdDX0hFQURfU0laRSAwCisjZGVmaW5lIFB5T2JqZWN0X0dDX0luaXQob3ApCisjZGVmaW5lIFB5T2JqZWN0X0dDX0Zpbmkob3ApCisjZGVmaW5lIFB5T2JqZWN0X0FTX0dDKG9wKSAob3ApCisjZGVmaW5lIFB5T2JqZWN0X0ZST01fR0Mob3ApIChvcCkKKworCisvKiBUZXN0IGlmIGEgdHlwZSBzdXBwb3J0cyB3ZWFrIHJlZmVyZW5jZXMgKi8KKyNkZWZpbmUgUHlUeXBlX1NVUFBPUlRTX1dFQUtSRUZTKHQpIFwKKyAgICAoUHlUeXBlX0hhc0ZlYXR1cmUoKHQpLCBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMpIFwKKyAgICAgJiYgKCh0KS0+dHBfd2Vha2xpc3RvZmZzZXQgPiAwKSkKKworI2RlZmluZSBQeU9iamVjdF9HRVRfV0VBS1JFRlNfTElTVFBUUihvKSBcCisgICAgKChQeU9iamVjdCAqKikgKCgoY2hhciAqKSAobykpICsgUHlfVFlQRShvKS0+dHBfd2Vha2xpc3RvZmZzZXQpKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9PQkpJTVBMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L29wY29kZS5oIGIvaW5jbHVkZS9weXRob24yLjcvb3Bjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2NDEwOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L29wY29kZS5oCkBAIC0wLDAgKzEsMTYyIEBACisjaWZuZGVmIFB5X09QQ09ERV9ICisjZGVmaW5lIFB5X09QQ09ERV9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlcyBmb3IgY29tcGlsZWQgY29kZSAqLworCisjZGVmaW5lIFNUT1BfQ09ERQkwCisjZGVmaW5lIFBPUF9UT1AJCTEKKyNkZWZpbmUgUk9UX1RXTwkJMgorI2RlZmluZSBST1RfVEhSRUUJMworI2RlZmluZSBEVVBfVE9QCQk0CisjZGVmaW5lIFJPVF9GT1VSCTUKKyNkZWZpbmUgTk9QCQk5CisKKyNkZWZpbmUgVU5BUllfUE9TSVRJVkUJMTAKKyNkZWZpbmUgVU5BUllfTkVHQVRJVkUJMTEKKyNkZWZpbmUgVU5BUllfTk9UCTEyCisjZGVmaW5lIFVOQVJZX0NPTlZFUlQJMTMKKworI2RlZmluZSBVTkFSWV9JTlZFUlQJMTUKKworI2RlZmluZSBCSU5BUllfUE9XRVIJMTkKKworI2RlZmluZSBCSU5BUllfTVVMVElQTFkJMjAKKyNkZWZpbmUgQklOQVJZX0RJVklERQkyMQorI2RlZmluZSBCSU5BUllfTU9EVUxPCTIyCisjZGVmaW5lIEJJTkFSWV9BREQJMjMKKyNkZWZpbmUgQklOQVJZX1NVQlRSQUNUCTI0CisjZGVmaW5lIEJJTkFSWV9TVUJTQ1IJMjUKKyNkZWZpbmUgQklOQVJZX0ZMT09SX0RJVklERSAyNgorI2RlZmluZSBCSU5BUllfVFJVRV9ESVZJREUgMjcKKyNkZWZpbmUgSU5QTEFDRV9GTE9PUl9ESVZJREUgMjgKKyNkZWZpbmUgSU5QTEFDRV9UUlVFX0RJVklERSAyOQorCisjZGVmaW5lIFNMSUNFCQkzMAorLyogQWxzbyB1c2VzIDMxLTMzICovCisKKyNkZWZpbmUgU1RPUkVfU0xJQ0UJNDAKKy8qIEFsc28gdXNlcyA0MS00MyAqLworCisjZGVmaW5lIERFTEVURV9TTElDRQk1MAorLyogQWxzbyB1c2VzIDUxLTUzICovCisKKyNkZWZpbmUgU1RPUkVfTUFQCTU0CisjZGVmaW5lIElOUExBQ0VfQURECTU1CisjZGVmaW5lIElOUExBQ0VfU1VCVFJBQ1QJNTYKKyNkZWZpbmUgSU5QTEFDRV9NVUxUSVBMWQk1NworI2RlZmluZSBJTlBMQUNFX0RJVklERQk1OAorI2RlZmluZSBJTlBMQUNFX01PRFVMTwk1OQorI2RlZmluZSBTVE9SRV9TVUJTQ1IJNjAKKyNkZWZpbmUgREVMRVRFX1NVQlNDUgk2MQorCisjZGVmaW5lIEJJTkFSWV9MU0hJRlQJNjIKKyNkZWZpbmUgQklOQVJZX1JTSElGVAk2MworI2RlZmluZSBCSU5BUllfQU5ECTY0CisjZGVmaW5lIEJJTkFSWV9YT1IJNjUKKyNkZWZpbmUgQklOQVJZX09SCTY2CisjZGVmaW5lIElOUExBQ0VfUE9XRVIJNjcKKyNkZWZpbmUgR0VUX0lURVIJNjgKKworI2RlZmluZSBQUklOVF9FWFBSCTcwCisjZGVmaW5lIFBSSU5UX0lURU0JNzEKKyNkZWZpbmUgUFJJTlRfTkVXTElORQk3MgorI2RlZmluZSBQUklOVF9JVEVNX1RPICAgNzMKKyNkZWZpbmUgUFJJTlRfTkVXTElORV9UTyA3NAorI2RlZmluZSBJTlBMQUNFX0xTSElGVAk3NQorI2RlZmluZSBJTlBMQUNFX1JTSElGVAk3NgorI2RlZmluZSBJTlBMQUNFX0FORAk3NworI2RlZmluZSBJTlBMQUNFX1hPUgk3OAorI2RlZmluZSBJTlBMQUNFX09SCTc5CisjZGVmaW5lIEJSRUFLX0xPT1AJODAKKyNkZWZpbmUgV0lUSF9DTEVBTlVQICAgIDgxCisjZGVmaW5lIExPQURfTE9DQUxTCTgyCisjZGVmaW5lIFJFVFVSTl9WQUxVRQk4MworI2RlZmluZSBJTVBPUlRfU1RBUgk4NAorI2RlZmluZSBFWEVDX1NUTVQJODUKKyNkZWZpbmUgWUlFTERfVkFMVUUJODYKKyNkZWZpbmUgUE9QX0JMT0NLCTg3CisjZGVmaW5lIEVORF9GSU5BTExZCTg4CisjZGVmaW5lIEJVSUxEX0NMQVNTCTg5CisKKyNkZWZpbmUgSEFWRV9BUkdVTUVOVAk5MAkvKiBPcGNvZGVzIGZyb20gaGVyZSBoYXZlIGFuIGFyZ3VtZW50OiAqLworCisjZGVmaW5lIFNUT1JFX05BTUUJOTAJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCisjZGVmaW5lIERFTEVURV9OQU1FCTkxCS8qICIiICovCisjZGVmaW5lIFVOUEFDS19TRVFVRU5DRQk5MgkvKiBOdW1iZXIgb2Ygc2VxdWVuY2UgaXRlbXMgKi8KKyNkZWZpbmUgRk9SX0lURVIJOTMKKyNkZWZpbmUgTElTVF9BUFBFTkQJOTQKKworI2RlZmluZSBTVE9SRV9BVFRSCTk1CS8qIEluZGV4IGluIG5hbWUgbGlzdCAqLworI2RlZmluZSBERUxFVEVfQVRUUgk5NgkvKiAiIiAqLworI2RlZmluZSBTVE9SRV9HTE9CQUwJOTcJLyogIiIgKi8KKyNkZWZpbmUgREVMRVRFX0dMT0JBTAk5OAkvKiAiIiAqLworI2RlZmluZSBEVVBfVE9QWAk5OQkvKiBudW1iZXIgb2YgaXRlbXMgdG8gZHVwbGljYXRlICovCisjZGVmaW5lIExPQURfQ09OU1QJMTAwCS8qIEluZGV4IGluIGNvbnN0IGxpc3QgKi8KKyNkZWZpbmUgTE9BRF9OQU1FCTEwMQkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KKyNkZWZpbmUgQlVJTERfVFVQTEUJMTAyCS8qIE51bWJlciBvZiB0dXBsZSBpdGVtcyAqLworI2RlZmluZSBCVUlMRF9MSVNUCTEwMwkvKiBOdW1iZXIgb2YgbGlzdCBpdGVtcyAqLworI2RlZmluZSBCVUlMRF9TRVQJMTA0ICAgICAvKiBOdW1iZXIgb2Ygc2V0IGl0ZW1zICovCisjZGVmaW5lIEJVSUxEX01BUAkxMDUJLyogQWx3YXlzIHplcm8gZm9yIG5vdyAqLworI2RlZmluZSBMT0FEX0FUVFIJMTA2CS8qIEluZGV4IGluIG5hbWUgbGlzdCAqLworI2RlZmluZSBDT01QQVJFX09QCTEwNwkvKiBDb21wYXJpc29uIG9wZXJhdG9yICovCisjZGVmaW5lIElNUE9SVF9OQU1FCTEwOAkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KKyNkZWZpbmUgSU1QT1JUX0ZST00JMTA5CS8qIEluZGV4IGluIG5hbWUgbGlzdCAqLworI2RlZmluZSBKVU1QX0ZPUldBUkQJMTEwCS8qIE51bWJlciBvZiBieXRlcyB0byBza2lwICovCisKKyNkZWZpbmUgSlVNUF9JRl9GQUxTRV9PUl9QT1AgMTExIC8qIFRhcmdldCBieXRlIG9mZnNldCBmcm9tIGJlZ2lubmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgY29kZSAqLworI2RlZmluZSBKVU1QX0lGX1RSVUVfT1JfUE9QIDExMgkvKiAiIiAqLworI2RlZmluZSBKVU1QX0FCU09MVVRFCTExMwkvKiAiIiAqLworI2RlZmluZSBQT1BfSlVNUF9JRl9GQUxTRSAxMTQJLyogIiIgKi8KKyNkZWZpbmUgUE9QX0pVTVBfSUZfVFJVRSAxMTUJLyogIiIgKi8KKworI2RlZmluZSBMT0FEX0dMT0JBTAkxMTYJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCisKKyNkZWZpbmUgQ09OVElOVUVfTE9PUAkxMTkJLyogU3RhcnQgb2YgbG9vcCAoYWJzb2x1dGUpICovCisjZGVmaW5lIFNFVFVQX0xPT1AJMTIwCS8qIFRhcmdldCBhZGRyZXNzIChyZWxhdGl2ZSkgKi8KKyNkZWZpbmUgU0VUVVBfRVhDRVBUCTEyMQkvKiAiIiAqLworI2RlZmluZSBTRVRVUF9GSU5BTExZCTEyMgkvKiAiIiAqLworCisjZGVmaW5lIExPQURfRkFTVAkxMjQJLyogTG9jYWwgdmFyaWFibGUgbnVtYmVyICovCisjZGVmaW5lIFNUT1JFX0ZBU1QJMTI1CS8qIExvY2FsIHZhcmlhYmxlIG51bWJlciAqLworI2RlZmluZSBERUxFVEVfRkFTVAkxMjYJLyogTG9jYWwgdmFyaWFibGUgbnVtYmVyICovCisKKyNkZWZpbmUgUkFJU0VfVkFSQVJHUwkxMzAJLyogTnVtYmVyIG9mIHJhaXNlIGFyZ3VtZW50cyAoMSwgMiBvciAzKSAqLworLyogQ0FMTF9GVU5DVElPTl9YWFggb3Bjb2RlcyBkZWZpbmVkIGJlbG93IGRlcGVuZCBvbiB0aGlzIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgQ0FMTF9GVU5DVElPTgkxMzEJLyogI2FyZ3MgKyAoI2t3YXJnczw8OCkgKi8KKyNkZWZpbmUgTUFLRV9GVU5DVElPTgkxMzIJLyogI2RlZmF1bHRzICovCisjZGVmaW5lIEJVSUxEX1NMSUNFIAkxMzMJLyogTnVtYmVyIG9mIGl0ZW1zICovCisKKyNkZWZpbmUgTUFLRV9DTE9TVVJFICAgIDEzNCAgICAgLyogI2ZyZWUgdmFycyAqLworI2RlZmluZSBMT0FEX0NMT1NVUkUgICAgMTM1ICAgICAvKiBMb2FkIGZyZWUgdmFyaWFibGUgZnJvbSBjbG9zdXJlICovCisjZGVmaW5lIExPQURfREVSRUYgICAgICAxMzYgICAgIC8qIExvYWQgYW5kIGRlcmVmZXJlbmNlIGZyb20gY2xvc3VyZSBjZWxsICovIAorI2RlZmluZSBTVE9SRV9ERVJFRiAgICAgMTM3ICAgICAvKiBTdG9yZSBpbnRvIGNlbGwgKi8gCisKKy8qIFRoZSBuZXh0IDMgb3Bjb2RlcyBtdXN0IGJlIGNvbnRpZ3VvdXMgYW5kIHNhdGlzZnkKKyAgIChDQUxMX0ZVTkNUSU9OX1ZBUiAtIENBTExfRlVOQ1RJT04pICYgMyA9PSAxICAqLworI2RlZmluZSBDQUxMX0ZVTkNUSU9OX1ZBUiAgICAgICAgICAxNDAJLyogI2FyZ3MgKyAoI2t3YXJnczw8OCkgKi8KKyNkZWZpbmUgQ0FMTF9GVU5DVElPTl9LVyAgICAgICAgICAgMTQxCS8qICNhcmdzICsgKCNrd2FyZ3M8PDgpICovCisjZGVmaW5lIENBTExfRlVOQ1RJT05fVkFSX0tXICAgICAgIDE0MgkvKiAjYXJncyArICgja3dhcmdzPDw4KSAqLworCisjZGVmaW5lIFNFVFVQX1dJVEggMTQzCisKKy8qIFN1cHBvcnQgZm9yIG9wYXJncyBtb3JlIHRoYW4gMTYgYml0cyBsb25nICovCisjZGVmaW5lIEVYVEVOREVEX0FSRyAgMTQ1CisKKyNkZWZpbmUgU0VUX0FERCAgICAgICAgIDE0NgorI2RlZmluZSBNQVBfQUREICAgICAgICAgMTQ3CisKKworZW51bSBjbXBfb3Age1B5Q21wX0xUPVB5X0xULCBQeUNtcF9MRT1QeV9MRSwgUHlDbXBfRVE9UHlfRVEsIFB5Q21wX05FPVB5X05FLCBQeUNtcF9HVD1QeV9HVCwgUHlDbXBfR0U9UHlfR0UsCisJICAgICBQeUNtcF9JTiwgUHlDbXBfTk9UX0lOLCBQeUNtcF9JUywgUHlDbXBfSVNfTk9ULCBQeUNtcF9FWENfTUFUQ0gsIFB5Q21wX0JBRH07CisKKyNkZWZpbmUgSEFTX0FSRyhvcCkgKChvcCkgPj0gSEFWRV9BUkdVTUVOVCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfT1BDT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L29zZGVmcy5oIGIvaW5jbHVkZS9weXRob24yLjcvb3NkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2MWVmZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L29zZGVmcy5oCkBAIC0wLDAgKzEsNjYgQEAKKyNpZm5kZWYgUHlfT1NERUZTX0gKKyNkZWZpbmUgUHlfT1NERUZTX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBPcGVyYXRpbmcgc3lzdGVtIGRlcGVuZGVuY2llcyAqLworCisvKiBNb2QgYnkgY2hyaXNoOiBRTlggaGFzIFdBVENPTSwgYnV0IGlzbid0IERPUyAqLworI2lmICFkZWZpbmVkKF9fUU5YX18pCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykgfHwgZGVmaW5lZChfX1dBVENPTUNfXykgfHwgZGVmaW5lZChfX0RKR1BQX18pIHx8IGRlZmluZWQoUFlPU19PUzIpCisjaWYgKGRlZmluZWQoUFlPU19PUzIpICYmIGRlZmluZWQoUFlDQ19HQ0MpKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKQorI2RlZmluZSBNQVhQQVRITEVOIDI2MAorI2RlZmluZSBTRVAgJy8nCisjZGVmaW5lIEFMVFNFUCAnXFwnCisjZWxzZQorI2RlZmluZSBTRVAgJ1xcJworI2RlZmluZSBBTFRTRVAgJy8nCisjZGVmaW5lIE1BWFBBVEhMRU4gMjU2CisjZW5kaWYKKyNkZWZpbmUgREVMSU0gJzsnCisjZGVmaW5lIERFTElNU1RSICI7IgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIFJJU0NPUworI2RlZmluZSBTRVAgJy4nCisjZGVmaW5lIE1BWFBBVEhMRU4gMjU2CisjZGVmaW5lIERFTElNICcsJworI2RlZmluZSBERUxJTVNUUiAiLCIKKyNlbmRpZgorCisKKy8qIEZpbGVuYW1lIHNlcGFyYXRvciAqLworI2lmbmRlZiBTRVAKKyNkZWZpbmUgU0VQICcvJworI2VuZGlmCisKKy8qIE1heCBwYXRobmFtZSBsZW5ndGggKi8KKyNpZmRlZiBfX2hwdXgKKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpZm5kZWYgUEFUSF9NQVgKKyNkZWZpbmUgUEFUSF9NQVggTUFYUEFUSExFTgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBNQVhQQVRITEVOCisjaWYgZGVmaW5lZChQQVRIX01BWCkgJiYgUEFUSF9NQVggPiAxMDI0CisjZGVmaW5lIE1BWFBBVEhMRU4gUEFUSF9NQVgKKyNlbHNlCisjZGVmaW5lIE1BWFBBVEhMRU4gMTAyNAorI2VuZGlmCisjZW5kaWYKKworLyogU2VhcmNoIHBhdGggZW50cnkgZGVsaW1pdGVyICovCisjaWZuZGVmIERFTElNCisjZGVmaW5lIERFTElNICc6JworI2RlZmluZSBERUxJTVNUUiAiOiIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9PU0RFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcGFyc2V0b2suaCBiL2luY2x1ZGUvcHl0aG9uMi43L3BhcnNldG9rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxZWI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3BhcnNldG9rLmgKQEAgLTAsMCArMSw2NCBAQAorCisvKiBQYXJzZXItdG9rZW5pemVyIGxpbmsgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfUEFSU0VUT0tfSAorI2RlZmluZSBQeV9QQVJTRVRPS19ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgZXJyb3I7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgaW50IGxpbmVubzsKKyAgICBpbnQgb2Zmc2V0OworICAgIGNoYXIgKnRleHQ7CisgICAgaW50IHRva2VuOworICAgIGludCBleHBlY3RlZDsKK30gcGVycmRldGFpbDsKKworI2lmIDAKKyNkZWZpbmUgUHlQQVJTRV9ZSUVMRF9JU19LRVlXT1JECTB4MDAwMQorI2VuZGlmCisKKyNkZWZpbmUgUHlQQVJTRV9ET05UX0lNUExZX0RFREVOVAkweDAwMDIKKworI2lmIDAKKyNkZWZpbmUgUHlQQVJTRV9XSVRIX0lTX0tFWVdPUkQJCTB4MDAwMworI2VuZGlmCisKKyNkZWZpbmUgUHlQQVJTRV9QUklOVF9JU19GVU5DVElPTiAgICAgICAweDAwMDQKKyNkZWZpbmUgUHlQQVJTRV9VTklDT0RFX0xJVEVSQUxTICAgICAgICAweDAwMDgKKworCisKK1B5QVBJX0ZVTkMobm9kZSAqKSBQeVBhcnNlcl9QYXJzZVN0cmluZyhjb25zdCBjaGFyICosIGdyYW1tYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJkZXRhaWwgKik7CitQeUFQSV9GVU5DKG5vZGUgKikgUHlQYXJzZXJfUGFyc2VGaWxlIChGSUxFICosIGNvbnN0IGNoYXIgKiwgZ3JhbW1hciAqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICosIGNoYXIgKiwgcGVycmRldGFpbCAqKTsKKworUHlBUElfRlVOQyhub2RlICopIFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqLCBncmFtbWFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJyZGV0YWlsICosIGludCk7CitQeUFQSV9GVU5DKG5vZGUgKikgUHlQYXJzZXJfUGFyc2VGaWxlRmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosIGdyYW1tYXIgKiwKKwkJCQkJCSBpbnQsIGNoYXIgKiwgY2hhciAqLAorCQkJCQkJIHBlcnJkZXRhaWwgKiwgaW50KTsKK1B5QVBJX0ZVTkMobm9kZSAqKSBQeVBhcnNlcl9QYXJzZUZpbGVGbGFnc0V4KEZJTEUgKiwgY29uc3QgY2hhciAqLCBncmFtbWFyICosCisJCQkJCQkgaW50LCBjaGFyICosIGNoYXIgKiwKKwkJCQkJCSBwZXJyZGV0YWlsICosIGludCAqKTsKKworUHlBUElfRlVOQyhub2RlICopIFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZShjb25zdCBjaGFyICosCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKiwKKwkJCQkJICAgICAgZ3JhbW1hciAqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVycmRldGFpbCAqLCBpbnQpOworUHlBUElfRlVOQyhub2RlICopIFB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZUV4KGNvbnN0IGNoYXIgKiwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqLAorCQkJCQkgICAgICBncmFtbWFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJyZGV0YWlsICosIGludCAqKTsKKworLyogTm90ZSB0aGF0IGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyBkZWZpbmVkIGluIHB5dGhvbnJ1bi5jIG5vdCBwYXJzZXRvay5jLiAqLworUHlBUElfRlVOQyh2b2lkKSBQeVBhcnNlcl9TZXRFcnJvcihwZXJyZGV0YWlsICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9QQVJTRVRPS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9wYXRjaGxldmVsLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9wYXRjaGxldmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmMTc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3BhdGNobGV2ZWwuaApAQCAtMCwwICsxLDQzIEBACisKKy8qIE5ld2ZhbmdsZWQgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiBzY2hlbWUuCisKKyAgIFRoaXMgc2NoZW1lIHdhcyBhZGRlZCBpbiBQeXRob24gMS41LjJiMjsgYmVmb3JlIHRoYXQgdGltZSwgb25seSBQQVRDSExFVkVMCisgICB3YXMgYXZhaWxhYmxlLiAgVG8gdGVzdCBmb3IgcHJlc2VuY2Ugb2YgdGhlIHNjaGVtZSwgdGVzdCBmb3IKKyAgIGRlZmluZWQoUFlfTUFKT1JfVkVSU0lPTikuCisKKyAgIFdoZW4gdGhlIG1ham9yIG9yIG1pbm9yIHZlcnNpb24gY2hhbmdlcywgdGhlIFZFUlNJT04gdmFyaWFibGUgaW4KKyAgIGNvbmZpZ3VyZS5hYyBtdXN0IGFsc28gYmUgY2hhbmdlZC4KKworICAgVGhlcmUgaXMgYWxzbyAoaW5kZXBlbmRlbnQpIEFQSSB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIG1vZHN1cHBvcnQuaC4KKyovCisKKy8qIFZhbHVlcyBmb3IgUFlfUkVMRUFTRV9MRVZFTCAqLworI2RlZmluZSBQWV9SRUxFQVNFX0xFVkVMX0FMUEhBCTB4QQorI2RlZmluZSBQWV9SRUxFQVNFX0xFVkVMX0JFVEEJMHhCCisjZGVmaW5lIFBZX1JFTEVBU0VfTEVWRUxfR0FNTUEJMHhDICAgICAvKiBGb3IgcmVsZWFzZSBjYW5kaWRhdGVzICovCisjZGVmaW5lIFBZX1JFTEVBU0VfTEVWRUxfRklOQUwJMHhGCS8qIFNlcmlhbCBzaG91bGQgYmUgMCBoZXJlICovCisJCQkJCS8qIEhpZ2hlciBmb3IgcGF0Y2ggcmVsZWFzZXMgKi8KKworLyogVmVyc2lvbiBwYXJzZWQgb3V0IGludG8gbnVtZXJpYyB2YWx1ZXMgKi8KKy8qLS1zdGFydCBjb25zdGFudHMtLSovCisjZGVmaW5lIFBZX01BSk9SX1ZFUlNJT04JMgorI2RlZmluZSBQWV9NSU5PUl9WRVJTSU9OCTcKKyNkZWZpbmUgUFlfTUlDUk9fVkVSU0lPTgk1CisjZGVmaW5lIFBZX1JFTEVBU0VfTEVWRUwJUFlfUkVMRUFTRV9MRVZFTF9GSU5BTAorI2RlZmluZSBQWV9SRUxFQVNFX1NFUklBTAkwCisKKy8qIFZlcnNpb24gYXMgYSBzdHJpbmcgKi8KKyNkZWZpbmUgUFlfVkVSU0lPTiAgICAgIAkiMi43LjUiCisvKi0tZW5kIGNvbnN0YW50cy0tKi8KKworLyogU3VidmVyc2lvbiBSZXZpc2lvbiBudW1iZXIgb2YgdGhpcyBmaWxlIChub3Qgb2YgdGhlIHJlcG9zaXRvcnkpLiBFbXB0eQorICAgc2luY2UgTWVyY3VyaWFsIG1pZ3JhdGlvbi4gKi8KKyNkZWZpbmUgUFlfUEFUQ0hMRVZFTF9SRVZJU0lPTiAgIiIKKworLyogVmVyc2lvbiBhcyBhIHNpbmdsZSA0LWJ5dGUgaGV4IG51bWJlciwgZS5nLiAweDAxMDUwMkIyID09IDEuNS4yYjIuCisgICBVc2UgdGhpcyBmb3IgbnVtZXJpYyBjb21wYXJpc29ucywgZS5nLiAjaWYgUFlfVkVSU0lPTl9IRVggPj0gLi4uICovCisjZGVmaW5lIFBZX1ZFUlNJT05fSEVYICgoUFlfTUFKT1JfVkVSU0lPTiA8PCAyNCkgfCBcCisJCQkoUFlfTUlOT1JfVkVSU0lPTiA8PCAxNikgfCBcCisJCQkoUFlfTUlDUk9fVkVSU0lPTiA8PCAgOCkgfCBcCisJCQkoUFlfUkVMRUFTRV9MRVZFTCA8PCAgNCkgfCBcCisJCQkoUFlfUkVMRUFTRV9TRVJJQUwgPDwgMCkpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9wZ2VuLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9wZ2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzMjVlZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3BnZW4uaApAQCAtMCwwICsxLDE4IEBACisjaWZuZGVmIFB5X1BHRU5fSAorI2RlZmluZSBQeV9QR0VOX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBQYXJzZXIgZ2VuZXJhdG9yIGludGVyZmFjZSAqLworCitleHRlcm4gZ3JhbW1hciAqbWV0YV9ncmFtbWFyKHZvaWQpOworCitzdHJ1Y3QgX25vZGU7CitleHRlcm4gZ3JhbW1hciAqcGdlbihzdHJ1Y3QgX25vZGUgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1BHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcGdlbmhlYWRlcnMuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3BnZW5oZWFkZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0OWFlMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3BnZW5oZWFkZXJzLmgKQEAgLTAsMCArMSw0MiBAQAorI2lmbmRlZiBQeV9QR0VOSEVBREVSU19ICisjZGVmaW5lIFB5X1BHRU5IRUFERVJTX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBJbmNsdWRlIGZpbGVzIGFuZCBleHRlcm4gZGVjbGFyYXRpb25zIHVzZWQgYnkgbW9zdCBvZiB0aGUgcGFyc2VyLiAqLworCisjaW5jbHVkZSAiUHl0aG9uLmgiCisKK1B5QVBJX0ZVTkModm9pZCkgUHlTeXNfV3JpdGVTdGRvdXQoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJCQlQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOworUHlBUElfRlVOQyh2b2lkKSBQeVN5c19Xcml0ZVN0ZGVycihjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKwkJCVB5X0dDQ19BVFRSSUJVVEUoKGZvcm1hdChwcmludGYsIDEsIDIpKSk7CisKKyNkZWZpbmUgYWRkYXJjIF9QeV9hZGRhcmMKKyNkZWZpbmUgYWRkYml0IF9QeV9hZGRiaXQKKyNkZWZpbmUgYWRkZGZhIF9QeV9hZGRkZmEKKyNkZWZpbmUgYWRkZmlyc3RzZXRzIF9QeV9hZGRmaXJzdHNldHMKKyNkZWZpbmUgYWRkbGFiZWwgX1B5X2FkZGxhYmVsCisjZGVmaW5lIGFkZHN0YXRlIF9QeV9hZGRzdGF0ZQorI2RlZmluZSBkZWxiaXRzZXQgX1B5X2RlbGJpdHNldAorI2RlZmluZSBkdW1wdHJlZSBfUHlfZHVtcHRyZWUKKyNkZWZpbmUgZmluZGxhYmVsIF9QeV9maW5kbGFiZWwKKyNkZWZpbmUgbWVyZ2ViaXRzZXQgX1B5X21lcmdlYml0c2V0CisjZGVmaW5lIG1ldGFfZ3JhbW1hciBfUHlfbWV0YV9ncmFtbWFyCisjZGVmaW5lIG5ld2JpdHNldCBfUHlfbmV3Yml0c2V0CisjZGVmaW5lIG5ld2dyYW1tYXIgX1B5X25ld2dyYW1tYXIKKyNkZWZpbmUgcGdlbiBfUHlfcGdlbgorI2RlZmluZSBwcmludGdyYW1tYXIgX1B5X3ByaW50Z3JhbW1hcgorI2RlZmluZSBwcmludG5vbnRlcm1pbmFscyBfUHlfcHJpbnRub250ZXJtaW5hbHMKKyNkZWZpbmUgcHJpbnR0cmVlIF9QeV9wcmludHRyZWUKKyNkZWZpbmUgc2FtZWJpdHNldCBfUHlfc2FtZWJpdHNldAorI2RlZmluZSBzaG93dHJlZSBfUHlfc2hvd3RyZWUKKyNkZWZpbmUgdG9rX2R1bXAgX1B5X3Rva19kdW1wCisjZGVmaW5lIHRyYW5zbGF0ZWxhYmVscyBfUHlfdHJhbnNsYXRlbGFiZWxzCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1BHRU5IRUFERVJTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3B5X2N1cnNlcy5oIGIvaW5jbHVkZS9weXRob24yLjcvcHlfY3Vyc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwNmFiMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5X2N1cnNlcy5oCkBAIC0wLDAgKzEsMTgwIEBACisKKyNpZm5kZWYgUHlfQ1VSU0VTX0gKKyNkZWZpbmUgUHlfQ1VSU0VTX0gKKworI2lmZGVmIF9fQVBQTEVfXworLyoKKyoqIE9uIE1hYyBPUyBYIDEwLjIgW25dY3Vyc2VzLmggYW5kIHN0ZGxpYi5oIHVzZSBkaWZmZXJlbnQgZ3VhcmRzCisqKiBhZ2FpbnN0IG11bHRpcGxlIGRlZmluaXRpb24gb2Ygd2NoYXJfdC4KKyovCisjaWZkZWYJX0JTRF9XQ0hBUl9UX0RFRklORURfCisjZGVmaW5lIF9XQ0hBUl9UCisjZW5kaWYKKworLyogdGhlIGZvbGxvd2luZyBkZWZpbmUgaXMgbmVjZXNzYXJ5IGZvciBPUyBYIDEwLjY7IHdpdGhvdXQgaXQsIHRoZQorICAgQXBwbGUtc3VwcGxpZWQgbmN1cnNlcy5oIHNldHMgTkNVUlNFU19PUEFRVUUgdG8gMSwgYW5kIHRoZW4gUHl0aG9uCisgICBjYW4ndCBnZXQgYXQgdGhlIFdJTkRPVyBmbGFncyBmaWVsZC4gKi8KKyNkZWZpbmUgTkNVUlNFU19PUEFRVUUgMAorI2VuZGlmIC8qIF9fQVBQTEVfXyAqLworCisjaWZkZWYgX19GcmVlQlNEX18KKy8qCisqKiBPbiBGcmVlQlNELCBbbl1jdXJzZXMuaCBhbmQgc3RkbGliLmgvd2NoYXIuaCB1c2UgZGlmZmVyZW50IGd1YXJkcworKiogYWdhaW5zdCBtdWx0aXBsZSBkZWZpbml0aW9uIG9mIHdjaGFyX3QgYW5kIHdpbnRfdC4KKyovCisjaWZkZWYJX1hPUEVOX1NPVVJDRV9FWFRFTkRFRAorI2lmbmRlZiBfX0ZyZWVCU0RfdmVyc2lvbgorI2luY2x1ZGUgPG9zcmVsZGF0ZS5oPgorI2VuZGlmCisjaWYgX19GcmVlQlNEX3ZlcnNpb24gPj0gNTAwMDAwCisjaWZuZGVmIF9fd2NoYXJfdAorI2RlZmluZSBfX3djaGFyX3QKKyNlbmRpZgorI2lmbmRlZiBfX3dpbnRfdAorI2RlZmluZSBfX3dpbnRfdAorI2VuZGlmCisjZWxzZQorI2lmbmRlZiBfV0NIQVJfVAorI2RlZmluZSBfV0NIQVJfVAorI2VuZGlmCisjaWZuZGVmIF9XSU5UX1QKKyNkZWZpbmUgX1dJTlRfVAorI2VuZGlmCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX05DVVJTRVNfSAorI2luY2x1ZGUgPG5jdXJzZXMuaD4KKyNlbHNlCisjaW5jbHVkZSA8Y3Vyc2VzLmg+CisjaWZkZWYgSEFWRV9URVJNX0gKKy8qIGZvciB0aWdldHN0ciwgd2hpY2ggaXMgbm90IGRlY2xhcmVkIGluIFN5c1YgY3Vyc2VzICovCisjaW5jbHVkZSA8dGVybS5oPgorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19NSU5HVzMyX18pICYmICFkZWZpbmVkKF9JU1BBRCkKKyNkZWZpbmUgX0lTUEFEIDB4MTAKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9OQ1VSU0VTX0gKKy8qIGNvbmZpZ3VyZSB3YXMgY2hlY2tpbmcgPGN1cnNlcy5oPiwgYnV0IHdlIHdpbGwKKyAgIHVzZSA8bmN1cnNlcy5oPiwgd2hpY2ggaGFzIGFsbCB0aGVzZSBmZWF0dXJlcy4gKi8KKyNpZm5kZWYgV0lORE9XX0hBU19GTEFHUworI2RlZmluZSBXSU5ET1dfSEFTX0ZMQUdTIDEKKyNlbmRpZgorI2lmbmRlZiBNVldERUxDSF9JU19FWFBSRVNTSU9OCisjZGVmaW5lIE1WV0RFTENIX0lTX0VYUFJFU1NJT04gMQorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFB5Q3Vyc2VzX0FQSV9wb2ludGVycyA0CisKKy8qIFR5cGUgZGVjbGFyYXRpb25zICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlQeU9iamVjdF9IRUFECisJV0lORE9XICp3aW47Cit9IFB5Q3Vyc2VzV2luZG93T2JqZWN0OworCisjZGVmaW5lIFB5Q3Vyc2VzV2luZG93X0NoZWNrKHYpCSAoUHlfVFlQRSh2KSA9PSAmUHlDdXJzZXNXaW5kb3dfVHlwZSkKKworI2RlZmluZSBQeUN1cnNlc19DQVBTVUxFX05BTUUgIl9jdXJzZXMuX0NfQVBJIgorCisKKyNpZmRlZiBDVVJTRVNfTU9EVUxFCisvKiBUaGlzIHNlY3Rpb24gaXMgdXNlZCB3aGVuIGNvbXBpbGluZyBfY3Vyc2VzbW9kdWxlLmMgKi8KKworI2Vsc2UKKy8qIFRoaXMgc2VjdGlvbiBpcyB1c2VkIGluIG1vZHVsZXMgdGhhdCB1c2UgdGhlIF9jdXJzZXNtb2R1bGUgQVBJICovCisKK3N0YXRpYyB2b2lkICoqUHlDdXJzZXNfQVBJOworCisjZGVmaW5lIFB5Q3Vyc2VzV2luZG93X1R5cGUgKCooUHlUeXBlT2JqZWN0ICopIFB5Q3Vyc2VzX0FQSVswXSkKKyNkZWZpbmUgUHlDdXJzZXNTZXR1cFRlcm1DYWxsZWQgIHtpZiAoISAoKGludCAoKikodm9pZCkpUHlDdXJzZXNfQVBJWzFdKSAoKSApIHJldHVybiBOVUxMO30KKyNkZWZpbmUgUHlDdXJzZXNJbml0aWFsaXNlZCAgICAgIHtpZiAoISAoKGludCAoKikodm9pZCkpUHlDdXJzZXNfQVBJWzJdKSAoKSApIHJldHVybiBOVUxMO30KKyNkZWZpbmUgUHlDdXJzZXNJbml0aWFsaXNlZENvbG9yIHtpZiAoISAoKGludCAoKikodm9pZCkpUHlDdXJzZXNfQVBJWzNdKSAoKSApIHJldHVybiBOVUxMO30KKworI2RlZmluZSBpbXBvcnRfY3Vyc2VzKCkgXAorICAgIFB5Q3Vyc2VzX0FQSSA9ICh2b2lkICoqKVB5Q2Fwc3VsZV9JbXBvcnQoUHlDdXJzZXNfQ0FQU1VMRV9OQU1FLCAxKTsKKworI2VuZGlmCisKKy8qIGdlbmVyYWwgZXJyb3IgbWVzc2FnZXMgKi8KK3N0YXRpYyBjaGFyICpjYXRjaGFsbF9FUlIgID0gImN1cnNlcyBmdW5jdGlvbiByZXR1cm5lZCBFUlIiOworc3RhdGljIGNoYXIgKmNhdGNoYWxsX05VTEwgPSAiY3Vyc2VzIGZ1bmN0aW9uIHJldHVybmVkIE5VTEwiOworCisvKiBGdW5jdGlvbiBQcm90b3R5cGUgTWFjcm9zIC0gVGhleSBhcmUgdWdseSBidXQgdmVyeSwgdmVyeSB1c2VmdWwuIDstKQorCisgICBYIC0gZnVuY3Rpb24gbmFtZQorICAgVFlQRSAtIHBhcmFtZXRlciBUeXBlCisgICBFUkdTVFIgLSBmb3JtYXQgc3RyaW5nIGZvciBjb25zdHJ1Y3Rpb24gb2YgdGhlIHJldHVybiB2YWx1ZQorICAgUEFSU0VTVFIgLSBmb3JtYXQgc3RyaW5nIGZvciBhcmd1bWVudCBwYXJzaW5nCisgICAqLworCisjZGVmaW5lIE5vQXJnTm9SZXR1cm5GdW5jdGlvbihYKSBcCitzdGF0aWMgUHlPYmplY3QgKlB5Q3Vyc2VzXyAjIyBYIChQeU9iamVjdCAqc2VsZikgXAoreyBcCisgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQgXAorICByZXR1cm4gUHlDdXJzZXNDaGVja0VSUihYKCksICMgWCk7IH0KKworI2RlZmluZSBOb0FyZ09yRmxhZ05vUmV0dXJuRnVuY3Rpb24oWCkgXAorc3RhdGljIFB5T2JqZWN0ICpQeUN1cnNlc18gIyMgWCAoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKSBcCit7IFwKKyAgaW50IGZsYWcgPSAwOyBcCisgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQgXAorICBzd2l0Y2goUHlUdXBsZV9TaXplKGFyZ3MpKSB7IFwKKyAgY2FzZSAwOiBcCisgICAgcmV0dXJuIFB5Q3Vyc2VzQ2hlY2tFUlIoWCgpLCAjIFgpOyBcCisgIGNhc2UgMTogXAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaTtUcnVlKDEpIG9yIEZhbHNlKDApIiwgJmZsYWcpKSByZXR1cm4gTlVMTDsgXAorICAgIGlmIChmbGFnKSByZXR1cm4gUHlDdXJzZXNDaGVja0VSUihYKCksICMgWCk7IFwKKyAgICBlbHNlIHJldHVybiBQeUN1cnNlc0NoZWNrRVJSKG5vICMjIFggKCksICMgWCk7IFwKKyAgZGVmYXVsdDogXAorICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICMgWCAiIHJlcXVpcmVzIDAgb3IgMSBhcmd1bWVudHMiKTsgXAorICAgIHJldHVybiBOVUxMOyB9IH0KKworI2RlZmluZSBOb0FyZ1JldHVybkludEZ1bmN0aW9uKFgpIFwKK3N0YXRpYyBQeU9iamVjdCAqUHlDdXJzZXNfICMjIFggKFB5T2JqZWN0ICpzZWxmKSBcCit7IFwKKyBQeUN1cnNlc0luaXRpYWxpc2VkIFwKKyByZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpIFgoKSk7IH0KKworCisjZGVmaW5lIE5vQXJnUmV0dXJuU3RyaW5nRnVuY3Rpb24oWCkgXAorc3RhdGljIFB5T2JqZWN0ICpQeUN1cnNlc18gIyMgWCAoUHlPYmplY3QgKnNlbGYpIFwKK3sgXAorICBQeUN1cnNlc0luaXRpYWxpc2VkIFwKKyAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoWCgpKTsgfQorCisjZGVmaW5lIE5vQXJnVHJ1ZUZhbHNlRnVuY3Rpb24oWCkgXAorc3RhdGljIFB5T2JqZWN0ICpQeUN1cnNlc18gIyMgWCAoUHlPYmplY3QgKnNlbGYpIFwKK3sgXAorICBQeUN1cnNlc0luaXRpYWxpc2VkIFwKKyAgaWYgKFggKCkgPT0gRkFMU0UpIHsgXAorICAgIFB5X0lOQ1JFRihQeV9GYWxzZSk7IFwKKyAgICByZXR1cm4gUHlfRmFsc2U7IFwKKyAgfSBcCisgIFB5X0lOQ1JFRihQeV9UcnVlKTsgXAorICByZXR1cm4gUHlfVHJ1ZTsgfQorCisjZGVmaW5lIE5vQXJnTm9SZXR1cm5Wb2lkRnVuY3Rpb24oWCkgXAorc3RhdGljIFB5T2JqZWN0ICpQeUN1cnNlc18gIyMgWCAoUHlPYmplY3QgKnNlbGYpIFwKK3sgXAorICBQeUN1cnNlc0luaXRpYWxpc2VkIFwKKyAgWCgpOyBcCisgIFB5X0lOQ1JFRihQeV9Ob25lKTsgXAorICByZXR1cm4gUHlfTm9uZTsgfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIWRlZmluZWQoUHlfQ1VSU0VTX0gpICovCisKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHlhcmVuYS5oIGIvaW5jbHVkZS9weXRob24yLjcvcHlhcmVuYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMTkzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9weWFyZW5hLmgKQEAgLTAsMCArMSw2MiBAQAorLyogQW4gYXJlbmEtbGlrZSBtZW1vcnkgaW50ZXJmYWNlIGZvciB0aGUgY29tcGlsZXIuCisgKi8KKworI2lmbmRlZiBQeV9QWUFSRU5BX0gKKyNkZWZpbmUgUHlfUFlBUkVOQV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworICB0eXBlZGVmIHN0cnVjdCBfYXJlbmEgUHlBcmVuYTsKKworICAvKiBQeUFyZW5hX05ldygpIGFuZCBQeUFyZW5hX0ZyZWUoKSBjcmVhdGUgYSBuZXcgYXJlbmEgYW5kIGZyZWUgaXQsCisgICAgIHJlc3BlY3RpdmVseS4gIE9uY2UgYW4gYXJlbmEgaGFzIGJlZW4gY3JlYXRlZCwgaXQgY2FuIGJlIHVzZWQKKyAgICAgdG8gYWxsb2NhdGUgbWVtb3J5IHZpYSBQeUFyZW5hX01hbGxvYygpLiAgUG9pbnRlcnMgdG8gUHlPYmplY3QgY2FuCisgICAgIGFsc28gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBhcmVuYSB2aWEgUHlBcmVuYV9BZGRQeU9iamVjdCgpLCBhbmQgdGhlCisgICAgIGFyZW5hIHdpbGwgZW5zdXJlIHRoYXQgdGhlIFB5T2JqZWN0cyBzdGF5IGFsaXZlIGF0IGxlYXN0IHVudGlsCisgICAgIFB5QXJlbmFfRnJlZSgpIGlzIGNhbGxlZC4gIFdoZW4gYW4gYXJlbmEgaXMgZnJlZWQsIGFsbCB0aGUgbWVtb3J5IGl0CisgICAgIGFsbG9jYXRlZCBpcyBmcmVlZCwgdGhlIGFyZW5hIHJlbGVhc2VzIGludGVybmFsIHJlZmVyZW5jZXMgdG8gcmVnaXN0ZXJlZAorICAgICBQeU9iamVjdCosIGFuZCBub25lIG9mIGl0cyBwb2ludGVycyBhcmUgdmFsaWQuCisgICAgIFhYWCAodGltKSBXaGF0IGRvZXMgIm5vbmUgb2YgaXRzIHBvaW50ZXJzIGFyZSB2YWxpZCIgbWVhbj8gIERvZXMgaXQKKyAgICAgWFhYIG1lYW4gdGhhdCBwb2ludGVycyBwcmV2aW91c2x5IG9idGFpbmVkIHZpYSBQeUFyZW5hX01hbGxvYygpIGFyZQorICAgICBYWFggbm8gbG9uZ2VyIHZhbGlkPyAgKFRoYXQncyBjbGVhcmx5IHRydWUsIGJ1dCBub3Qgc3VyZSB0aGF0J3Mgd2hhdAorICAgICBYWFggdGhlIHRleHQgaXMgdHJ5aW5nIHRvIHNheS4pCisKKyAgICAgUHlBcmVuYV9OZXcoKSByZXR1cm5zIGFuIGFyZW5hIHBvaW50ZXIuICBPbiBlcnJvciwgaXQKKyAgICAgcmV0dXJucyBhIG5lZ2F0aXZlIG51bWJlciBhbmQgc2V0cyBhbiBleGNlcHRpb24uCisgICAgIFhYWCAodGltKTogIE5vdCB0cnVlLiAgT24gZXJyb3IsIFB5QXJlbmFfTmV3KCkgYWN0dWFsbHkgcmV0dXJucyBOVUxMLAorICAgICBYWFggYW5kIGxvb2tzIGxpa2UgaXQgbWF5IG9yIG1heSBub3Qgc2V0IGFuIGV4Y2VwdGlvbiAoZS5nLiwgaWYgdGhlCisgICAgIFhYWCBpbnRlcm5hbCBQeUxpc3RfTmV3KDApIHJldHVybnMgTlVMTCwgUHlBcmVuYV9OZXcoKSBwYXNzZXMgdGhhdCBvbgorICAgICBYWFggYW5kIGFuIGV4Y2VwdGlvbiBpcyBzZXQ7IE9UT0gsIGlmIHRoZSBpbnRlcm5hbAorICAgICBYWFggYmxvY2tfbmV3KERFRkFVTFRfQkxPQ0tfU0laRSkgcmV0dXJucyBOVUxMLCB0aGF0J3MgcGFzc2VkIG9uIGJ1dAorICAgICBYWFggYW4gZXhjZXB0aW9uIGlzIG5vdCBzZXQgaW4gdGhhdCBjYXNlKS4KKyAgKi8KKyAgUHlBUElfRlVOQyhQeUFyZW5hICopIFB5QXJlbmFfTmV3KHZvaWQpOworICBQeUFQSV9GVU5DKHZvaWQpIFB5QXJlbmFfRnJlZShQeUFyZW5hICopOworCisgIC8qIE1vc3RseSBsaWtlIG1hbGxvYygpLCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgYSBibG9jayBvZiBtZW1vcnkgc3Bhbm5pbmcKKyAgICogYHNpemVgIGJ5dGVzLCBvciByZXR1cm4gTlVMTCAod2l0aG91dCBzZXR0aW5nIGFuIGV4Y2VwdGlvbikgaWYgZW5vdWdoCisgICAqIG5ldyBtZW1vcnkgY2FuJ3QgYmUgb2J0YWluZWQuICBVbmxpa2UgbWFsbG9jKDApLCBQeUFyZW5hX01hbGxvYygpIHdpdGgKKyAgICogc2l6ZT0wIGRvZXMgbm90IGd1YXJhbnRlZSB0byByZXR1cm4gYSB1bmlxdWUgcG9pbnRlciAodGhlIHBvaW50ZXIKKyAgICogcmV0dXJuZWQgbWF5IGVxdWFsIG9uZSBvciBtb3JlIG90aGVyIHBvaW50ZXJzIG9idGFpbmVkIGZyb20KKyAgICogUHlBcmVuYV9NYWxsb2MoKSkuCisgICAqIE5vdGUgdGhhdCBwb2ludGVycyBvYnRhaW5lZCB2aWEgUHlBcmVuYV9NYWxsb2MoKSBtdXN0IG5ldmVyIGJlIHBhc3NlZCB0bworICAgKiB0aGUgc3lzdGVtIGZyZWUoKSBvciByZWFsbG9jKCksIG9yIHRvIGFueSBvZiBQeXRob24ncyBzaW1pbGFyIG1lbW9yeS0KKyAgICogbWFuYWdlbWVudCBmdW5jdGlvbnMuICBQeUFyZW5hX01hbGxvYygpLW9idGFpbmVkIHBvaW50ZXJzIHJlbWFpbiB2YWxpZAorICAgKiB1bnRpbCBQeUFyZW5hX0ZyZWUoYXIpIGlzIGNhbGxlZCwgYXQgd2hpY2ggcG9pbnQgYWxsIHBvaW50ZXJzIG9idGFpbmVkCisgICAqIGZyb20gdGhlIGFyZW5hIGBhcmAgYmVjb21lIGludmFsaWQgc2ltdWx0YW5lb3VzbHkuCisgICAqLworICBQeUFQSV9GVU5DKHZvaWQgKikgUHlBcmVuYV9NYWxsb2MoUHlBcmVuYSAqLCBzaXplX3Qgc2l6ZSk7CisKKyAgLyogVGhpcyByb3V0aW5lIGlzbid0IGEgcHJvcGVyIGFyZW5hIGFsbG9jYXRpb24gcm91dGluZS4gIEl0IHRha2VzCisgICAqIGEgUHlPYmplY3QqIGFuZCByZWNvcmRzIGl0IHNvIHRoYXQgaXQgY2FuIGJlIERFQ1JFRmVkIHdoZW4gdGhlCisgICAqIGFyZW5hIGlzIGZyZWVkLgorICAgKi8KKyAgUHlBUElfRlVOQyhpbnQpIFB5QXJlbmFfQWRkUHlPYmplY3QoUHlBcmVuYSAqLCBQeU9iamVjdCAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFQeV9QWUFSRU5BX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3B5Y2Fwc3VsZS5oIGIvaW5jbHVkZS9weXRob24yLjcvcHljYXBzdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q2ODJmYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5Y2Fwc3VsZS5oCkBAIC0wLDAgKzEsNTYgQEAKKworLyogQ2Fwc3VsZSBvYmplY3RzIGxldCB5b3Ugd3JhcCBhIEMgInZvaWQgKiIgcG9pbnRlciBpbiBhIFB5dGhvbgorICAgb2JqZWN0LiAgVGhleSdyZSBhIHdheSBvZiBwYXNzaW5nIGRhdGEgdGhyb3VnaCB0aGUgUHl0aG9uIGludGVycHJldGVyCisgICB3aXRob3V0IGNyZWF0aW5nIHlvdXIgb3duIGN1c3RvbSB0eXBlLgorCisgICBDYXBzdWxlcyBhcmUgdXNlZCBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGV4dGVuc2lvbiBtb2R1bGVzLgorICAgVGhleSBwcm92aWRlIGEgd2F5IGZvciBhbiBleHRlbnNpb24gbW9kdWxlIHRvIGV4cG9ydCBhIEMgaW50ZXJmYWNlCisgICB0byBvdGhlciBleHRlbnNpb24gbW9kdWxlcywgc28gdGhhdCBleHRlbnNpb24gbW9kdWxlcyBjYW4gdXNlIHRoZQorICAgUHl0aG9uIGltcG9ydCBtZWNoYW5pc20gdG8gbGluayB0byBvbmUgYW5vdGhlci4KKworICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgImMtYXBpL2NhcHN1bGUuaHRtbCIgaW4gdGhlCisgICBkb2N1bWVudGF0aW9uLgorKi8KKworI2lmbmRlZiBQeV9DQVBTVUxFX0gKKyNkZWZpbmUgUHlfQ0FQU1VMRV9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUNhcHN1bGVfVHlwZTsKKwordHlwZWRlZiB2b2lkICgqUHlDYXBzdWxlX0Rlc3RydWN0b3IpKFB5T2JqZWN0ICopOworCisjZGVmaW5lIFB5Q2Fwc3VsZV9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5Q2Fwc3VsZV9UeXBlKQorCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDYXBzdWxlX05ldygKKyAgICB2b2lkICpwb2ludGVyLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgUHlDYXBzdWxlX0Rlc3RydWN0b3IgZGVzdHJ1Y3Rvcik7CisKK1B5QVBJX0ZVTkModm9pZCAqKSBQeUNhcHN1bGVfR2V0UG9pbnRlcihQeU9iamVjdCAqY2Fwc3VsZSwgY29uc3QgY2hhciAqbmFtZSk7CisKK1B5QVBJX0ZVTkMoUHlDYXBzdWxlX0Rlc3RydWN0b3IpIFB5Q2Fwc3VsZV9HZXREZXN0cnVjdG9yKFB5T2JqZWN0ICpjYXBzdWxlKTsKKworUHlBUElfRlVOQyhjb25zdCBjaGFyICopIFB5Q2Fwc3VsZV9HZXROYW1lKFB5T2JqZWN0ICpjYXBzdWxlKTsKKworUHlBUElfRlVOQyh2b2lkICopIFB5Q2Fwc3VsZV9HZXRDb250ZXh0KFB5T2JqZWN0ICpjYXBzdWxlKTsKKworUHlBUElfRlVOQyhpbnQpIFB5Q2Fwc3VsZV9Jc1ZhbGlkKFB5T2JqZWN0ICpjYXBzdWxlLCBjb25zdCBjaGFyICpuYW1lKTsKKworUHlBUElfRlVOQyhpbnQpIFB5Q2Fwc3VsZV9TZXRQb2ludGVyKFB5T2JqZWN0ICpjYXBzdWxlLCB2b2lkICpwb2ludGVyKTsKKworUHlBUElfRlVOQyhpbnQpIFB5Q2Fwc3VsZV9TZXREZXN0cnVjdG9yKFB5T2JqZWN0ICpjYXBzdWxlLCBQeUNhcHN1bGVfRGVzdHJ1Y3RvciBkZXN0cnVjdG9yKTsKKworUHlBUElfRlVOQyhpbnQpIFB5Q2Fwc3VsZV9TZXROYW1lKFB5T2JqZWN0ICpjYXBzdWxlLCBjb25zdCBjaGFyICpuYW1lKTsKKworUHlBUElfRlVOQyhpbnQpIFB5Q2Fwc3VsZV9TZXRDb250ZXh0KFB5T2JqZWN0ICpjYXBzdWxlLCB2b2lkICpjb250ZXh0KTsKKworUHlBUElfRlVOQyh2b2lkICopIFB5Q2Fwc3VsZV9JbXBvcnQoY29uc3QgY2hhciAqbmFtZSwgaW50IG5vX2Jsb2NrKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfQ0FQU1VMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weWNvbmZpZy5oIGIvaW5jbHVkZS9weXRob24yLjcvcHljb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzZmODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHljb25maWcuaApAQCAtMCwwICsxLDEyNzkgQEAKKy8qIHB5Y29uZmlnLmguICBHZW5lcmF0ZWQgZnJvbSBweWNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKiBweWNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLworCisKKyNpZm5kZWYgUHlfUFlDT05GSUdfSAorI2RlZmluZSBQeV9QWUNPTkZJR19ICisKKworLyogRGVmaW5lIGlmIGJ1aWxkaW5nIHVuaXZlcnNhbCAoaW50ZXJuYWwgaGVscGVyIG1hY3JvKSAqLworLyogI3VuZGVmIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCAqLworCisvKiBEZWZpbmUgZm9yIEFJWCBpZiB5b3VyIGNvbXBpbGVyIGlzIGEgZ2VudWluZSBJQk0geGxDL3hsQ19yIGFuZCB5b3Ugd2FudAorICAgc3VwcG9ydCBmb3IgQUlYIEMrKyBzaGFyZWQgZXh0ZW5zaW9uIG1vZHVsZXMuICovCisvKiAjdW5kZWYgQUlYX0dFTlVJTkVfQ1BMVVNQTFVTICovCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIEF0aGVPUyB0aHJlYWRzLiAqLworLyogI3VuZGVmIEFUSEVPU19USFJFQURTICovCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIEJlT1MgdGhyZWFkcy4gKi8KKy8qICN1bmRlZiBCRU9TX1RIUkVBRFMgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBNYWNoIGN0aHJlYWRzIHBhY2thZ2UgKi8KKy8qICN1bmRlZiBDX1RIUkVBRFMgKi8KKworLyogRGVmaW5lIGlmIEMgZG91YmxlcyBhcmUgNjQtYml0IElFRUUgNzU0IGJpbmFyeSBmb3JtYXQsIHN0b3JlZCBpbiBBUk0KKyAgIG1peGVkLWVuZGlhbiBvcmRlciAoYnl0ZSBvcmRlciA0NTY3MDEyMykgKi8KKy8qICN1bmRlZiBET1VCTEVfSVNfQVJNX01JWEVEX0VORElBTl9JRUVFNzU0ICovCisKKy8qIERlZmluZSBpZiBDIGRvdWJsZXMgYXJlIDY0LWJpdCBJRUVFIDc1NCBiaW5hcnkgZm9ybWF0LCBzdG9yZWQgd2l0aCB0aGUgbW9zdAorICAgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAqLworLyogI3VuZGVmIERPVUJMRV9JU19CSUdfRU5ESUFOX0lFRUU3NTQgKi8KKworLyogRGVmaW5lIGlmIEMgZG91YmxlcyBhcmUgNjQtYml0IElFRUUgNzU0IGJpbmFyeSBmb3JtYXQsIHN0b3JlZCB3aXRoIHRoZQorICAgbGVhc3Qgc2lnbmlmaWNhbnQgYnl0ZSBmaXJzdCAqLworI2RlZmluZSBET1VCTEVfSVNfTElUVExFX0VORElBTl9JRUVFNzU0IDEKKworLyogRGVmaW5lIGlmIC0tZW5hYmxlLWlwdjYgaXMgc3BlY2lmaWVkICovCisvKiAjdW5kZWYgRU5BQkxFX0lQVjYgKi8KKworLyogRGVmaW5lIGlmIGZsb2NrIG5lZWRzIHRvIGJlIGxpbmtlZCB3aXRoIGJzZCBsaWJyYXJ5LiAqLworLyogI3VuZGVmIEZMT0NLX05FRURTX0xJQkJTRCAqLworCisvKiBEZWZpbmUgaWYgZ2V0cGdycCgpIG11c3QgYmUgY2FsbGVkIGFzIGdldHBncnAoMCkuICovCisvKiAjdW5kZWYgR0VUUEdSUF9IQVZFX0FSRyAqLworCisvKiBEZWZpbmUgaWYgZ2V0dGltZW9mZGF5KCkgZG9lcyBub3QgaGF2ZSBzZWNvbmQgKHRpbWV6b25lKSBhcmd1bWVudCBUaGlzIGlzCisgICB0aGUgY2FzZSBvbiBNb3Rvcm9sYSBWNCAoUjQwVjQuMikgKi8KKy8qICN1bmRlZiBHRVRUSU1FT0ZEQVlfTk9fVFogKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhY29zaCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQUNPU0ggMQorCisvKiBzdHJ1Y3QgYWRkcmluZm8gKi8KKyNkZWZpbmUgSEFWRV9BRERSSU5GTyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYWxhcm0nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0FMQVJNIDEKKworLyogRGVmaW5lIHRoaXMgaWYgeW91ciB0aW1lLmggZGVmaW5lcyBhbHR6b25lLiAqLworLyogI3VuZGVmIEhBVkVfQUxUWk9ORSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFzaW5oJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9BU0lOSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8YXNtL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfQVNNX1RZUEVTX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhdGFuaCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQVRBTkggMQorCisvKiBEZWZpbmUgaWYgR0NDIHN1cHBvcnRzIF9fYXR0cmlidXRlX18oKGZvcm1hdChQeUFyZ19QYXJzZVR1cGxlLCAyLCAzKSkpICovCisvKiAjdW5kZWYgSEFWRV9BVFRSSUJVVEVfRk9STUFUX1BBUlNFVFVQTEUgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBiaW5kX3RleHRkb21haW5fY29kZXNldCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9CSU5EX1RFWFRET01BSU5fQ09ERVNFVCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGJsdWV0b290aC9ibHVldG9vdGguaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9CTFVFVE9PVEhfQkxVRVRPT1RIX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxibHVldG9vdGguaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9CTFVFVE9PVEhfSCAqLworCisvKiBEZWZpbmUgaWYgbmljZSgpIHJldHVybnMgc3VjY2Vzcy9mYWlsdXJlIGluc3RlYWQgb2YgdGhlIG5ldyBwcmlvcml0eS4gKi8KKy8qICN1bmRlZiBIQVZFX0JST0tFTl9OSUNFICovCisKKy8qIERlZmluZSBpZiB0aGUgc3lzdGVtIHJlcG9ydHMgYW4gaW52YWxpZCBQSVBFX0JVRiB2YWx1ZS4gKi8KKy8qICN1bmRlZiBIQVZFX0JST0tFTl9QSVBFX0JVRiAqLworCisvKiBEZWZpbmUgaWYgcG9sbCgpIHNldHMgZXJybm8gb24gaW52YWxpZCBmaWxlIGRlc2NyaXB0b3JzLiAqLworLyogI3VuZGVmIEhBVkVfQlJPS0VOX1BPTEwgKi8KKworLyogRGVmaW5lIGlmIHRoZSBQb3NpeCBzZW1hcGhvcmVzIGRvIG5vdCB3b3JrIG9uIHlvdXIgc3lzdGVtICovCisvKiAjdW5kZWYgSEFWRV9CUk9LRU5fUE9TSVhfU0VNQVBIT1JFUyAqLworCisvKiBEZWZpbmUgaWYgcHRocmVhZF9zaWdtYXNrKCkgZG9lcyBub3Qgd29yayBvbiB5b3VyIHN5c3RlbS4gKi8KKy8qICN1bmRlZiBIQVZFX0JST0tFTl9QVEhSRUFEX1NJR01BU0sgKi8KKworLyogZGVmaW5lIHRvIDEgaWYgeW91ciBzZW1fZ2V0dmFsdWUgaXMgYnJva2VuLiAqLworI2RlZmluZSBIQVZFX0JST0tFTl9TRU1fR0VUVkFMVUUgMQorCisvKiBEZWZpbmUgaWYgYHVuc2V0ZW52YCBkb2VzIG5vdCByZXR1cm4gYW4gaW50LiAqLworLyogI3VuZGVmIEhBVkVfQlJPS0VOX1VOU0VURU5WICovCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIHRoZSB0eXBlIF9Cb29sLiAqLworI2RlZmluZSBIQVZFX0M5OV9CT09MIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlICdjaGZsYWdzJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9DSEZMQUdTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjaG93bicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQ0hPV04gMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdjaHJvb3QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0NIUk9PVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY2xvY2snIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0NMT0NLIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjb25mc3RyJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9DT05GU1RSIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxjb25pby5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0NPTklPX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjb3B5c2lnbicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQ09QWVNJR04gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGN0ZXJtaWQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0NURVJNSUQgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdjdGVybWlkX3InIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0NURVJNSURfUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y3Vyc2VzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0NVUlNFU19IIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnaXNfdGVybV9yZXNpemVkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9DVVJTRVNfSVNfVEVSTV9SRVNJWkVEIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAncmVzaXpldGVybScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQ1VSU0VTX1JFU0laRVRFUk0gMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdyZXNpemVfdGVybScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQ1VSU0VTX1JFU0laRV9URVJNIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBpc2Zpbml0ZScsIGFuZCB0byAwIGlmIHlvdQorICAgZG9uJ3QuICovCisjZGVmaW5lIEhBVkVfREVDTF9JU0ZJTklURSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgaXNpbmYnLCBhbmQgdG8gMCBpZiB5b3UgZG9uJ3QuCisgICAqLworI2RlZmluZSBIQVZFX0RFQ0xfSVNJTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGlzbmFuJywgYW5kIHRvIDAgaWYgeW91IGRvbid0LgorICAgKi8KKyNkZWZpbmUgSEFWRV9ERUNMX0lTTkFOIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGB0em5hbWUnLCBhbmQgdG8gMCBpZiB5b3UgZG9uJ3QuCisgICAqLworLyogI3VuZGVmIEhBVkVfREVDTF9UWk5BTUUgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRldmljZSBtYWNyb3MuICovCisjZGVmaW5lIEhBVkVfREVWSUNFX01BQ1JPUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSAvZGV2L3B0YyBkZXZpY2UgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0RFVl9QVEMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIC9kZXYvcHRteCBkZXZpY2UgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9ERVZfUFRNWCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZWN0Lmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfRElSRUNUX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLgorICAgKi8KKyNkZWZpbmUgSEFWRV9ESVJFTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfRExGQ05fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZGxvcGVuJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9ETE9QRU4gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGR1cDInIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0RVUDIgMQorCisvKiBEZWZpbmVkIHdoZW4gYW55IGR5bmFtaWMgbW9kdWxlIGxvYWRpbmcgaXMgZW5hYmxlZC4gKi8KKyNkZWZpbmUgSEFWRV9EWU5BTUlDX0xPQURJTkcgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdlcG9sbCcgZnVuY3Rpb25zLiAqLworLyogI3VuZGVmIEhBVkVfRVBPTEwgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBlcmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0VSRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZXJmYycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRVJGQyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfRVJSTk9fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZXhlY3YnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0VYRUNWIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBleHBtMScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRVhQTTEgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdmY2hkaXInIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0ZDSERJUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmNobW9kJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9GQ0hNT0QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZjaG93bicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRkNIT1dOIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnZmRhdGFzeW5jJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX0ZEQVRBU1lOQyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZpbml0ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRklOSVRFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmbG9jaycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRkxPQ0sgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZvcmsnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0ZPUksgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZvcmtwdHknIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0ZPUktQVFkgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZwYXRoY29uZicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRlBBVEhDT05GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmc2VlazY0JyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX0ZTRUVLNjQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmc2Vla28nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0ZTRUVLTyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnN0YXR2ZnMnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0ZTVEFUVkZTIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnZnN5bmMnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0ZTWU5DIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmdGVsbDY0JyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX0ZURUxMNjQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmdGVsbG8nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0ZURUxMTyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnRpbWUnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0ZUSU1FIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmdHJ1bmNhdGUnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0ZUUlVOQ0FURSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2FpX3N0cmVycm9yJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HQUlfU1RSRVJST1IgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdhbW1hJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HQU1NQSAxCisKKy8qIERlZmluZSBpZiB3ZSBjYW4gdXNlIGdjYyBpbmxpbmUgYXNzZW1ibGVyIHRvIGdldCBhbmQgc2V0IHg4NyBjb250cm9sIHdvcmQKKyAgICovCisjZGVmaW5lIEhBVkVfR0NDX0FTTV9GT1JfWDg3IDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBnZXRhZGRyaW5mbyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRBRERSSU5GTyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0Y3dkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRDV0QgMQorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3UgaGF2ZSBmbG9ja2ZpbGUoKSwgZ2V0Y191bmxvY2tlZCgpLCBhbmQgZnVubG9ja2ZpbGUoKSAqLworI2RlZmluZSBIQVZFX0dFVENfVU5MT0NLRUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGdyb3VwcycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUR1JPVVBTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRob3N0YnluYW1lJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FIDEKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgc29tZSB2ZXJzaW9uIG9mIGdldGhvc3RieW5hbWVfcigpICovCisvKiAjdW5kZWYgSEFWRV9HRVRIT1NUQllOQU1FX1IgKi8KKworLyogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgdGhlIDMtYXJnIHZlcnNpb24gb2YgZ2V0aG9zdGJ5bmFtZV9yKCkuICovCisvKiAjdW5kZWYgSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcgKi8KKworLyogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgdGhlIDUtYXJnIHZlcnNpb24gb2YgZ2V0aG9zdGJ5bmFtZV9yKCkuICovCisvKiAjdW5kZWYgSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9BUkcgKi8KKworLyogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgdGhlIDYtYXJnIHZlcnNpb24gb2YgZ2V0aG9zdGJ5bmFtZV9yKCkuICovCisvKiAjdW5kZWYgSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9BUkcgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRpdGltZXInIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVElUSU1FUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0bG9hZGF2ZycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUTE9BREFWRyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0bG9naW4nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVExPR0lOIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRuYW1laW5mbycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUTkFNRUlORk8gMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdnZXRwYWdlc2l6ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUUEFHRVNJWkUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHBlZXJuYW1lJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRQRUVSTkFNRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cGdpZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUUEdJRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cGdycCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUUEdSUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cGlkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRQSUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHByaW9yaXR5JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRQUklPUklUWSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cHdlbnQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVFBXRU5UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRyZXNnaWQnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfR0VUUkVTR0lEICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cmVzdWlkJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX0dFVFJFU1VJRCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHNpZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUU0lEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRzcGVudCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9HRVRTUEVOVCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHNwbmFtJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX0dFVFNQTkFNICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0dGltZW9mZGF5JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRUSU1FT0ZEQVkgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHdkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRXRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Z3JwLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0dSUF9IIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnaHN0cmVycm9yJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9IU1RSRVJST1IgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGh5cG90JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9IWVBPVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aWVlZWZwLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfSUVFRUZQX0ggKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnaW5ldF9hdG9uJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9JTkVUX0FUT04gMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdpbmV0X3B0b24nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0lORVRfUFRPTiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaW5pdGdyb3VwcycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfSU5JVEdST1VQUyAxCisKKy8qIERlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIGludDMyX3QuICovCisjZGVmaW5lIEhBVkVfSU5UMzJfVCAxCisKKy8qIERlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIGludDY0X3QuICovCisjZGVmaW5lIEhBVkVfSU5UNjRfVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW8uaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9JT19IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBga2lsbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfS0lMTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBga2lsbHBnJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9LSUxMUEcgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdrcXVldWUnIGZ1bmN0aW9ucy4gKi8KKyNkZWZpbmUgSEFWRV9LUVVFVUUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxhbmdpbmZvLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0xBTkdJTkZPX0ggMQorCisvKiBEZWZpbmVkIHRvIGVuYWJsZSBsYXJnZSBmaWxlIHN1cHBvcnQgd2hlbiBhbiBvZmZfdCBpcyBiaWdnZXIgdGhhbiBhIGxvbmcKKyAgIGFuZCBsb25nIGxvbmcgaXMgYXZhaWxhYmxlIGFuZCBhdCBsZWFzdCBhcyBiaWcgYXMgYW4gb2ZmX3QuIFlvdSBtYXkgbmVlZCB0bworICAgYWRkIHNvbWUgZmxhZ3MgZm9yIGNvbmZpZ3VyYXRpb24gYW5kIGNvbXBpbGF0aW9uIHRvIGVuYWJsZSB0aGlzIG1vZGUuIChGb3IKKyAgIFNvbGFyaXMgYW5kIExpbnV4LCB0aGUgbmVjZXNzYXJ5IGRlZmluZXMgYXJlIGFscmVhZHkgZGVmaW5lZC4pICovCisvKiAjdW5kZWYgSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgJ2xjaGZsYWdzJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9MQ0hGTEFHUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbGNobW9kJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9MQ0hNT0QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxjaG93bicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfTENIT1dOIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsZ2FtbWEnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0xHQU1NQSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZGwnIGxpYnJhcnkgKC1sZGwpLiAqLworI2RlZmluZSBIQVZFX0xJQkRMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBkbGQnIGxpYnJhcnkgKC1sZGxkKS4gKi8KKy8qICN1bmRlZiBIQVZFX0xJQkRMRCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGllZWUnIGxpYnJhcnkgKC1saWVlZSkuICovCisvKiAjdW5kZWYgSEFWRV9MSUJJRUVFICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGliaW50bC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0xJQklOVExfSCAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIHJlYWRsaW5lIGxpYnJhcnkgKC1scmVhZGxpbmUpLiAqLworI2RlZmluZSBIQVZFX0xJQlJFQURMSU5FIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByZXNvbHYnIGxpYnJhcnkgKC1scmVzb2x2KS4gKi8KKy8qICN1bmRlZiBIQVZFX0xJQlJFU09MViAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpYnV0aWwuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9MSUJVVElMX0ggKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnbGluaycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfTElOSyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvbmV0bGluay5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0xJTlVYX05FVExJTktfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpbnV4L3RpcGMuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9MSU5VWF9USVBDX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsb2cxcCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfTE9HMVAgMQorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3UgaGF2ZSB0aGUgdHlwZSBsb25nIGRvdWJsZS4gKi8KKyNkZWZpbmUgSEFWRV9MT05HX0RPVUJMRSAxCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIHRoZSB0eXBlIGxvbmcgbG9uZy4gKi8KKyNkZWZpbmUgSEFWRV9MT05HX0xPTkcgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxzdGF0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9MU1RBVCAxCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIHRoZSBtYWtlZGV2IG1hY3JvLiAqLworI2RlZmluZSBIQVZFX01BS0VERVYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1lbW1vdmUnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX01FTU1PVkUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWtmaWZvJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9NS0ZJRk8gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rbm9kJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9NS05PRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWt0aW1lJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9NS1RJTUUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1yZW1hcCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9NUkVNQVAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuY3Vyc2VzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX05DVVJTRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bmRpci5oPiBoZWFkZXIgZmlsZSwgYW5kIGl0IGRlZmluZXMgYERJUicuICovCisvKiAjdW5kZWYgSEFWRV9ORElSX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZXRwYWNrZXQvcGFja2V0Lmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbmljZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfTklDRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgb3BlbnB0eScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfT1BFTlBUWSAxCisKKy8qIERlZmluZSBpZiBjb21waWxpbmcgdXNpbmcgTWFjT1MgWCAxMC41IFNESyBvciBsYXRlci4gKi8KKyNkZWZpbmUgSEFWRV9PU1gxMDVfU0RLIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwYXRoY29uZicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfUEFUSENPTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBhdXNlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9QQVVTRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGxvY2snIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfUExPQ0sgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwb2xsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9QT0xMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwb2xsLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1BPTExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cHJvY2Vzcy5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1BST0NFU1NfSCAqLworCisvKiBEZWZpbmUgaWYgeW91ciBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBwcm90b3R5cGUgKi8KKyNkZWZpbmUgSEFWRV9QUk9UT1RZUEVTIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIEdOVSBQVEggdGhyZWFkcy4gKi8KKy8qICN1bmRlZiBIQVZFX1BUSCAqLworCisvKiBEZWZpbmVkIGZvciBTb2xhcmlzIDIuNiBidWcgaW4gcHRocmVhZCBoZWFkZXIuICovCisvKiAjdW5kZWYgSEFWRV9QVEhSRUFEX0RFU1RSVUNUT1IgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwdGhyZWFkLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1BUSFJFQURfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHRocmVhZF9pbml0JyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1BUSFJFQURfSU5JVCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHB0aHJlYWRfc2lnbWFzaycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfUFRIUkVBRF9TSUdNQVNLIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwdHkuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9QVFlfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHB1dGVudicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfUFVURU5WIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByZWFkbGluaycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfUkVBRExJTksgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJlYWxwYXRoJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9SRUFMUEFUSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSByZWFkbGluZSAyLjEgKi8KKyNkZWZpbmUgSEFWRV9STF9DQUxMQkFDSyAxCisKKy8qIERlZmluZSBpZiB5b3UgY2FuIHR1cm4gb2ZmIHJlYWRsaW5lJ3Mgc2lnbmFsIGhhbmRsaW5nLiAqLworLyogI3VuZGVmIEhBVkVfUkxfQ0FUQ0hfU0lHTkFMICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSByZWFkbGluZSAyLjIgKi8KKyNkZWZpbmUgSEFWRV9STF9DT01QTEVUSU9OX0FQUEVORF9DSEFSQUNURVIgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgcmVhZGxpbmUgNC4wICovCisjZGVmaW5lIEhBVkVfUkxfQ09NUExFVElPTl9ESVNQTEFZX01BVENIRVNfSE9PSyAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSByZWFkbGluZSA0LjIgKi8KKyNkZWZpbmUgSEFWRV9STF9DT01QTEVUSU9OX01BVENIRVMgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgcmxfY29tcGxldGlvbl9zdXBwcmVzc19hcHBlbmQgKi8KKy8qICN1bmRlZiBIQVZFX1JMX0NPTVBMRVRJT05fU1VQUFJFU1NfQVBQRU5EICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSByZWFkbGluZSA0LjAgKi8KKyNkZWZpbmUgSEFWRV9STF9QUkVfSU5QVVRfSE9PSyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcm91bmQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1JPVU5EIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZWxlY3QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFTEVDVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2VtX2dldHZhbHVlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRU1fR0VUVkFMVUUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNlbV9vcGVuJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRU1fT1BFTiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2VtX3RpbWVkd2FpdCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TRU1fVElNRURXQUlUICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2VtX3VubGluaycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VNX1VOTElOSyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZWdpZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VURUdJRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0ZXVpZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VURVVJRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0Z2lkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRHSUQgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdzZXRncm91cHMnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFVEdST1VQUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0aXRpbWVyJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRJVElNRVIgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldGxvY2FsZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VUTE9DQUxFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRwZ2lkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRQR0lEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRwZ3JwJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRQR1JQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRyZWdpZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VUUkVHSUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHJlc2dpZCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TRVRSRVNHSUQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRyZXN1aWQnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfU0VUUkVTVUlEICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmV1aWQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFVFJFVUlEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRzaWQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFVFNJRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0dWlkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRVSUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHZidWYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFVFZCVUYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNoYWRvdy5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NIQURPV19IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lnYWN0aW9uJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TSUdBQ1RJT04gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpZ2ludGVycnVwdCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0lHSU5URVJSVVBUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzaWduYWwuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU0lHTkFMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNpZ3JlbHNlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TSUdSRUxTRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc25wcmludGYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NOUFJJTlRGIDEKKworLyogRGVmaW5lIGlmIHNvY2thZGRyIGhhcyBzYV9sZW4gbWVtYmVyICovCisjZGVmaW5lIEhBVkVfU09DS0FERFJfU0FfTEVOIDEKKworLyogc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKHN5cy9zb2NrZXQuaCkgKi8KKyNkZWZpbmUgSEFWRV9TT0NLQUREUl9TVE9SQUdFIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAnc29ja2V0cGFpcicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU09DS0VUUEFJUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3Bhd24uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1BBV05fSCAxCisKKy8qIERlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIHNzaXplX3QgKi8KKyNkZWZpbmUgSEFWRV9TU0laRV9UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdGF0dmZzJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVEFUVkZTIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCBzdGF0LnN0X210aW0udHZfbnNlYyAqLworLyogI3VuZGVmIEhBVkVfU1RBVF9UVl9OU0VDICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBzdHJ1Y3Qgc3RhdC5zdF9tdGltZW5zZWMgKi8KKyNkZWZpbmUgSEFWRV9TVEFUX1RWX05TRUMyIDEKKworLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgdmFyaWFibGUgbGVuZ3RoIGZ1bmN0aW9uIHByb3RvdHlwZXMgKGUuZy4KKyAgIHZvaWQgZnByaW50ZihGSUxFICosIGNoYXIgKiwgLi4uKTspICphbmQqIDxzdGRhcmcuaD4gKi8KKyNkZWZpbmUgSEFWRV9TVERBUkdfUFJPVE9UWVBFUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmR1cCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSRFVQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJmdGltZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSRlRJTUUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cm9wdHMuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9TVFJPUFRTX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgYHN0X2JpcnRodGltZScgaXMgYSBtZW1iZXIgb2YgYHN0cnVjdCBzdGF0Jy4gKi8KKy8qICN1bmRlZiBIQVZFX1NUUlVDVF9TVEFUX1NUX0JJUlRIVElNRSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiBgc3RfYmxrc2l6ZScgaXMgYSBtZW1iZXIgb2YgYHN0cnVjdCBzdGF0Jy4gKi8KKyNkZWZpbmUgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTEtTSVpFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgYHN0X2Jsb2NrcycgaXMgYSBtZW1iZXIgb2YgYHN0cnVjdCBzdGF0Jy4gKi8KKyNkZWZpbmUgSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTE9DS1MgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBgc3RfZmxhZ3MnIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3Qgc3RhdCcuICovCisjZGVmaW5lIEhBVkVfU1RSVUNUX1NUQVRfU1RfRkxBR1MgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBgc3RfZ2VuJyBpcyBhIG1lbWJlciBvZiBgc3RydWN0IHN0YXQnLiAqLworI2RlZmluZSBIQVZFX1NUUlVDVF9TVEFUX1NUX0dFTiAxCisKKy8qIERlZmluZSB0byAxIGlmIGBzdF9yZGV2JyBpcyBhIG1lbWJlciBvZiBgc3RydWN0IHN0YXQnLiAqLworI2RlZmluZSBIQVZFX1NUUlVDVF9TVEFUX1NUX1JERVYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBgdG1fem9uZScgaXMgYSBtZW1iZXIgb2YgYHN0cnVjdCB0bScuICovCisjZGVmaW5lIEhBVkVfU1RSVUNUX1RNX1RNX1pPTkUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3VyIGBzdHJ1Y3Qgc3RhdCcgaGFzIGBzdF9ibG9ja3MnLiBEZXByZWNhdGVkLCB1c2UKKyAgIGBIQVZFX1NUUlVDVF9TVEFUX1NUX0JMT0NLUycgaW5zdGVhZC4gKi8KKyNkZWZpbmUgSEFWRV9TVF9CTE9DS1MgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdzeW1saW5rJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TWU1MSU5LIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzeXNjb25mJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TWVNDT05GIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXNleGl0cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNFWElUU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvYXVkaW9pby5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NZU19BVURJT0lPX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvYnNkdHR5Lmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfU1lTX0JTRFRUWV9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2Rpci5oPiBoZWFkZXIgZmlsZSwgYW5kIGl0IGRlZmluZXMgYERJUicuCisgICAqLworLyogI3VuZGVmIEhBVkVfU1lTX0RJUl9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2Vwb2xsLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfU1lTX0VQT0xMX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvZXZlbnQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX0VWRU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9maWxlLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19GSUxFX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9sb2FkYXZnLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfU1lTX0xPQURBVkdfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9sb2NrLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19MT0NLX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9ta2Rldi5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NZU19NS0RFVl9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL21vZGVtLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfU1lTX01PREVNX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbmRpci5oPiBoZWFkZXIgZmlsZSwgYW5kIGl0IGRlZmluZXMgYERJUicuCisgICAqLworLyogI3VuZGVmIEhBVkVfU1lTX05ESVJfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9wYXJhbS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfUEFSQU1fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BvbGwuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1BPTExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Jlc291cmNlLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19SRVNPVVJDRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VsZWN0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19TRUxFQ1RfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tldC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfU09DS0VUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0dmZzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19TVEFUVkZTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90ZXJtaW8uaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9TWVNfVEVSTUlPX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1RJTUVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19USU1FX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3VuLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19VTl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdXRzbmFtZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfVVRTTkFNRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvd2FpdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfV0FJVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0Y2dldHBncnAnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1RDR0VUUEdSUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGNzZXRwZ3JwJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9UQ1NFVFBHUlAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRlbXBuYW0nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1RFTVBOQU0gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHRlcm1pb3MuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfVEVSTUlPU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx0ZXJtLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1RFUk1fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGdhbW1hJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9UR0FNTUEgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHRocmVhZC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1RIUkVBRF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGltZWdtJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9USU1FR00gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRpbWVzJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9USU1FUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdG1wZmlsZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVE1QRklMRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdG1wbmFtJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9UTVBOQU0gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRtcG5hbV9yJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1RNUE5BTV9SICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdXIgYHN0cnVjdCB0bScgaGFzIGB0bV96b25lJy4gRGVwcmVjYXRlZCwgdXNlCisgICBgSEFWRV9TVFJVQ1RfVE1fVE1fWk9ORScgaW5zdGVhZC4gKi8KKyNkZWZpbmUgSEFWRV9UTV9aT05FIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0cnVuY2F0ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVFJVTkNBVEUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgZG9uJ3QgaGF2ZSBgdG1fem9uZScgYnV0IGRvIGhhdmUgdGhlIGV4dGVybmFsIGFycmF5CisgICBgdHpuYW1lJy4gKi8KKy8qICN1bmRlZiBIQVZFX1RaTkFNRSAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3UgaGF2ZSB0Y2wgYW5kIFRDTF9VVEZfTUFYPT02ICovCisvKiAjdW5kZWYgSEFWRV9VQ1M0X1RDTCAqLworCisvKiBEZWZpbmUgaWYgeW91ciBjb21waWxlciBwcm92aWRlcyB1aW50MzJfdC4gKi8KKyNkZWZpbmUgSEFWRV9VSU5UMzJfVCAxCisKKy8qIERlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIHVpbnQ2NF90LiAqLworI2RlZmluZSBIQVZFX1VJTlQ2NF9UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgdGhlIHN5c3RlbSBoYXMgdGhlIHR5cGUgYHVpbnRwdHJfdCcuICovCisjZGVmaW5lIEhBVkVfVUlOVFBUUl9UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1bmFtZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVU5BTUUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdW5zZXRlbnYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1VOU0VURU5WIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIGEgdXNlYWJsZSB3Y2hhcl90IHR5cGUgZGVmaW5lZCBpbiB3Y2hhci5oOyB1c2VhYmxlIG1lYW5zCisgICB3Y2hhcl90IG11c3QgYmUgYW4gdW5zaWduZWQgdHlwZSB3aXRoIGF0IGxlYXN0IDE2IGJpdHMuIChzZWUKKyAgIEluY2x1ZGUvdW5pY29kZW9iamVjdC5oKS4gKi8KKy8qICN1bmRlZiBIQVZFX1VTQUJMRV9XQ0hBUl9UICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dXRpbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9VVElMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHV0aW1lcycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVVRJTUVTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1dGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9VVElNRV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3YWl0MycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfV0FJVDMgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHdhaXQ0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9XQUlUNCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgd2FpdHBpZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfV0FJVFBJRCAxCisKKy8qIERlZmluZSBpZiB0aGUgY29tcGlsZXIgcHJvdmlkZXMgYSB3Y2hhci5oIGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1dDSEFSX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHdjc2NvbGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1dDU0NPTEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHdpbnNvY2syLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfV0lOU09DSzJfSCAqLworCisvKiBEZWZpbmUgaWYgdHpzZXQoKSBhY3R1YWxseSBzd2l0Y2hlcyB0aGUgbG9jYWwgdGltZXpvbmUgaW4gYSBtZWFuaW5nZnVsIHdheS4KKyAgICovCisjZGVmaW5lIEhBVkVfV09SS0lOR19UWlNFVCAxCisKKy8qIERlZmluZSBpZiB0aGUgemxpYiBsaWJyYXJ5IGhhcyBpbmZsYXRlQ29weSAqLworI2RlZmluZSBIQVZFX1pMSUJfQ09QWSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2dldHB0eScgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9fR0VUUFRZICovCisKKy8qIERlZmluZSBpZiB5b3UgYXJlIHVzaW5nIE1hY2ggY3RocmVhZHMgZGlyZWN0bHkgdW5kZXIgL2luY2x1ZGUgKi8KKy8qICN1bmRlZiBIVVJEX0NfVEhSRUFEUyAqLworCisvKiBEZWZpbmUgaWYgeW91IGFyZSB1c2luZyBNYWNoIGN0aHJlYWRzIHVuZGVyIG1hY2ggLyAqLworLyogI3VuZGVmIE1BQ0hfQ19USFJFQURTICovCisKKy8qIERlZmluZSB0byAxIGlmIGBtYWpvcicsIGBtaW5vcicsIGFuZCBgbWFrZWRldicgYXJlIGRlY2xhcmVkIGluIDxta2Rldi5oPi4KKyAgICovCisvKiAjdW5kZWYgTUFKT1JfSU5fTUtERVYgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgYG1ham9yJywgYG1pbm9yJywgYW5kIGBtYWtlZGV2JyBhcmUgZGVjbGFyZWQgaW4KKyAgIDxzeXNtYWNyb3MuaD4uICovCisvKiAjdW5kZWYgTUFKT1JfSU5fU1lTTUFDUk9TICovCisKKy8qIERlZmluZSBpZiBtdndkZWxjaCBpbiBjdXJzZXMuaCBpcyBhbiBleHByZXNzaW9uLiAqLworI2RlZmluZSBNVldERUxDSF9JU19FWFBSRVNTSU9OIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IHdhbnQgdG8gdXNlIG5hdGl2ZSBOVCB0aHJlYWRzICovCisvKiAjdW5kZWYgTlRfVEhSRUFEUyAqLworCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKy8qICN1bmRlZiBQQUNLQUdFX0JVR1JFUE9SVCAqLworCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisvKiAjdW5kZWYgUEFDS0FHRV9OQU1FICovCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKy8qICN1bmRlZiBQQUNLQUdFX1NUUklORyAqLworCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisvKiAjdW5kZWYgUEFDS0FHRV9UQVJOQU1FICovCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisvKiAjdW5kZWYgUEFDS0FHRV9VUkwgKi8KKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKy8qICN1bmRlZiBQQUNLQUdFX1ZFUlNJT04gKi8KKworLyogRGVmaW5lIGlmIFBPU0lYIHNlbWFwaG9yZXMgYXJlbid0IGVuYWJsZWQgb24geW91ciBzeXN0ZW0gKi8KKy8qICN1bmRlZiBQT1NJWF9TRU1BUEhPUkVTX05PVF9FTkFCTEVEICovCisKKy8qIERlZmluZWQgaWYgUFRIUkVBRF9TQ09QRV9TWVNURU0gc3VwcG9ydGVkLiAqLworI2RlZmluZSBQVEhSRUFEX1NZU1RFTV9TQ0hFRF9TVVBQT1JURUQgMQorCisvKiBEZWZpbmUgYXMgdGhlIHByZWZlcnJlZCBzaXplIGluIGJpdHMgb2YgbG9uZyBkaWdpdHMgKi8KKy8qICN1bmRlZiBQWUxPTkdfQklUU19JTl9ESUdJVCAqLworCisvKiBEZWZpbmUgdG8gcHJpbnRmIGZvcm1hdCBtb2RpZmllciBmb3IgbG9uZyBsb25nIHR5cGUgKi8KKyNkZWZpbmUgUFlfRk9STUFUX0xPTkdfTE9ORyAibGwiCisKKy8qIERlZmluZSB0byBwcmludGYgZm9ybWF0IG1vZGlmaWVyIGZvciBQeV9zc2l6ZV90ICovCisjZGVmaW5lIFBZX0ZPUk1BVF9TSVpFX1QgInoiCisKKy8qIERlZmluZSBhcyB0aGUgaW50ZWdyYWwgdHlwZSB1c2VkIGZvciBVbmljb2RlIHJlcHJlc2VudGF0aW9uLiAqLworI2RlZmluZSBQWV9VTklDT0RFX1RZUEUgdW5zaWduZWQgc2hvcnQKKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGFuIGludGVycHJldGVyIHdpdGggbWFueSBydW4tdGltZSBjaGVja3MuICovCisvKiAjdW5kZWYgUHlfREVCVUcgKi8KKworLyogRGVmaW5lZCBpZiBQeXRob24gaXMgYnVpbHQgYXMgYSBzaGFyZWQgbGlicmFyeS4gKi8KKy8qICN1bmRlZiBQeV9FTkFCTEVfU0hBUkVEICovCisKKy8qIERlZmluZSBhcyB0aGUgc2l6ZSBvZiB0aGUgdW5pY29kZSB0eXBlLiAqLworI2RlZmluZSBQeV9VTklDT0RFX1NJWkUgMgorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gaGF2ZSBhIFVuaWNvZGUgdHlwZS4gKi8KKyNkZWZpbmUgUHlfVVNJTkdfVU5JQ09ERSAxCisKKy8qIFJFUEFSU0VfREFUQV9CVUZGRVIgaW4gd2lubnQuaCAqLworLyogI3VuZGVmIFJFUEFSU0VfREFUQV9CVUZGRVJfSU5fV0lOTlQgKi8KKworLyogYXNzdW1lIEM4OSBzZW1hbnRpY3MgdGhhdCBSRVRTSUdUWVBFIGlzIGFsd2F5cyB2b2lkICovCisjZGVmaW5lIFJFVFNJR1RZUEUgdm9pZAorCisvKiBEZWZpbmUgaWYgc2V0cGdycCgpIG11c3QgYmUgY2FsbGVkIGFzIHNldHBncnAoMCwgMCkuICovCisvKiAjdW5kZWYgU0VUUEdSUF9IQVZFX0FSRyAqLworCisvKiBEZWZpbmUgdGhpcyB0byBiZSBleHRlbnNpb24gb2Ygc2hhcmVkIGxpYnJhcmllcyAoaW5jbHVkaW5nIHRoZSBkb3QhKS4gKi8KKyNkZWZpbmUgU0hMSUJfRVhUICIuc28iCisKKy8qIERlZmluZSBpZiBpPj5qIGZvciBzaWduZWQgaW50IGkgZG9lcyBub3QgZXh0ZW5kIHRoZSBzaWduIGJpdCB3aGVuIGkgPCAwICovCisvKiAjdW5kZWYgU0lHTkVEX1JJR0hUX1NISUZUX1pFUk9fRklMTFMgKi8KKworLyogVGhlIHNpemUgb2YgYGRvdWJsZScsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX0RPVUJMRSA4CisKKy8qIFRoZSBzaXplIG9mIGBmbG9hdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX0ZMT0FUIDQKKworLyogVGhlIHNpemUgb2YgYGZwb3NfdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX0ZQT1NfVCA4CisKKy8qIFRoZSBzaXplIG9mIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9JTlQgNAorCisvKiBUaGUgc2l6ZSBvZiBgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX0xPTkcgOAorCisvKiBUaGUgc2l6ZSBvZiBgbG9uZyBkb3VibGUnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9MT05HX0RPVUJMRSAxNgorCisvKiBUaGUgc2l6ZSBvZiBgbG9uZyBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfTE9OR19MT05HIDgKKworLyogVGhlIHNpemUgb2YgYG9mZl90JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfT0ZGX1QgOAorCisvKiBUaGUgc2l6ZSBvZiBgcGlkX3QnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9QSURfVCA0CisKKy8qIFRoZSBzaXplIG9mIGBwdGhyZWFkX3QnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9QVEhSRUFEX1QgOAorCisvKiBUaGUgc2l6ZSBvZiBgc2hvcnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9TSE9SVCAyCisKKy8qIFRoZSBzaXplIG9mIGBzaXplX3QnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9TSVpFX1QgOAorCisvKiBUaGUgc2l6ZSBvZiBgdGltZV90JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfVElNRV9UIDgKKworLyogVGhlIHNpemUgb2YgYHVpbnRwdHJfdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX1VJTlRQVFJfVCA4CisKKy8qIFRoZSBzaXplIG9mIGB2b2lkIConLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9WT0lEX1AgOAorCisvKiBUaGUgc2l6ZSBvZiBgd2NoYXJfdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX1dDSEFSX1QgNAorCisvKiBUaGUgc2l6ZSBvZiBgX0Jvb2wnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9fQk9PTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI2RlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBEZWZpbmUgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvc2VsZWN0Lmg+IGFuZCA8c3lzL3RpbWUuaD4KKyAgICh3aGljaCB5b3UgY2FuJ3Qgb24gU0NPIE9EVCAzLjApLiAqLworI2RlZmluZSBTWVNfU0VMRUNUX1dJVEhfU1lTX1RJTUUgMQorCisvKiBEZWZpbmUgaWYgdGFuaCgtMC4pIGlzIC0wLiwgb3IgaWYgcGxhdGZvcm0gZG9lc24ndCBoYXZlIHNpZ25lZCB6ZXJvcyAqLworI2RlZmluZSBUQU5IX1BSRVNFUlZFU19aRVJPX1NJR04gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgY2FuIHNhZmVseSBpbmNsdWRlIGJvdGggPHN5cy90aW1lLmg+IGFuZCA8dGltZS5oPi4gKi8KKyNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91ciA8c3lzL3RpbWUuaD4gZGVjbGFyZXMgYHN0cnVjdCB0bScuICovCisvKiAjdW5kZWYgVE1fSU5fU1lTX1RJTUUgKi8KKworLyogRW5hYmxlIGV4dGVuc2lvbnMgb24gQUlYIDMsIEludGVyaXguICAqLworI2lmbmRlZiBfQUxMX1NPVVJDRQorIyBkZWZpbmUgX0FMTF9TT1VSQ0UgMQorI2VuZGlmCisvKiBFbmFibGUgR05VIGV4dGVuc2lvbnMgb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlbS4gICovCisjaWZuZGVmIF9HTlVfU09VUkNFCisjIGRlZmluZSBfR05VX1NPVVJDRSAxCisjZW5kaWYKKy8qIEVuYWJsZSB0aHJlYWRpbmcgZXh0ZW5zaW9ucyBvbiBTb2xhcmlzLiAgKi8KKyNpZm5kZWYgX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTCisjIGRlZmluZSBfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MgMQorI2VuZGlmCisvKiBFbmFibGUgZXh0ZW5zaW9ucyBvbiBIUCBOb25TdG9wLiAgKi8KKyNpZm5kZWYgX1RBTkRFTV9TT1VSQ0UKKyMgZGVmaW5lIF9UQU5ERU1fU09VUkNFIDEKKyNlbmRpZgorLyogRW5hYmxlIGdlbmVyYWwgZXh0ZW5zaW9ucyBvbiBTb2xhcmlzLiAgKi8KKyNpZm5kZWYgX19FWFRFTlNJT05TX18KKyMgZGVmaW5lIF9fRVhURU5TSU9OU19fIDEKKyNlbmRpZgorCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB0byB1c2UgTWFjUHl0aG9uIG1vZHVsZXMgb24gTWFjT1NYIGluIHVuaXgtUHl0aG9uLiAqLworI2RlZmluZSBVU0VfVE9PTEJPWF9PQkpFQ1RfR0xVRSAxCisKKy8qIERlZmluZSBpZiBhIHZhX2xpc3QgaXMgYW4gYXJyYXkgb2Ygc29tZSBraW5kICovCisjZGVmaW5lIFZBX0xJU1RfSVNfQVJSQVkgMQorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgU0lHRlBFIGhhbmRsZWQgKHNlZSBJbmNsdWRlL3B5ZnBlLmgpLiAqLworLyogI3VuZGVmIFdBTlRfU0lHRlBFX0hBTkRMRVIgKi8KKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHdjdHlwZS5oIGZ1bmN0aW9ucyB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIG9uZQorICAgc3VwcGxpZWQgYnkgUHl0aG9uIGl0c2VsZi4gKHNlZSBJbmNsdWRlL3VuaWNvZGVjdHlwZS5oKS4gKi8KKy8qICN1bmRlZiBXQU5UX1dDVFlQRV9GVU5DVElPTlMgKi8KKworLyogRGVmaW5lIGlmIFdJTkRPVyBpbiBjdXJzZXMuaCBvZmZlcnMgYSBmaWVsZCBfZmxhZ3MuICovCisvKiAjdW5kZWYgV0lORE9XX0hBU19GTEFHUyAqLworCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgZG9jdW1lbnRhdGlvbiBzdHJpbmdzIGluIGV4dGVuc2lvbiBtb2R1bGVzICovCisjZGVmaW5lIFdJVEhfRE9DX1NUUklOR1MgMQorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBuZXctc3R5bGUgKE9wZW5zdGVwLCBSaGFwc29keSwgTWFjT1MpIGR5bmFtaWMKKyAgIGxpbmtlciAoZHlsZCkgaW5zdGVhZCBvZiB0aGUgb2xkLXN0eWxlIChOZXh0U3RlcCkgZHluYW1pYyBsaW5rZXIgKHJsZCkuCisgICBEeWxkIGlzIG5lY2Vzc2FyeSB0byBzdXBwb3J0IGZyYW1ld29ya3MuICovCisjZGVmaW5lIFdJVEhfRFlMRCAxCisKKy8qIERlZmluZSB0byAxIGlmIGxpYmludGwgaXMgbmVlZGVkIGZvciBsb2NhbGUgZnVuY3Rpb25zLiAqLworLyogI3VuZGVmIFdJVEhfTElCSU5UTCAqLworCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gcHJvZHVjZSBhbiBPcGVuU3RlcC9SaGFwc29keSBmcmFtZXdvcmsgKHNoYXJlZAorICAgbGlicmFyeSBwbHVzIGFjY2Vzc29yeSBmaWxlcykuICovCisvKiAjdW5kZWYgV0lUSF9ORVhUX0ZSQU1FV09SSyAqLworCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gY29tcGlsZSBpbiBQeXRob24tc3BlY2lmaWMgbWFsbG9jcyAqLworI2RlZmluZSBXSVRIX1BZTUFMTE9DIDEKKworLyogRGVmaW5lIGlmIHdlIGhhdmUgZXh0ZXJuYWwgbGliZmZpLiAqLworLyogI3VuZGVmIFdJVEhfU1lTVEVNX0xJQkZGSSAqLworCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gY29tcGlsZSBpbiBydWRpbWVudGFyeSB0aHJlYWQgc3VwcG9ydCAqLworI2RlZmluZSBXSVRIX1RIUkVBRCAxCisKKy8qIERlZmluZSB0byBwcm9maWxlIHdpdGggdGhlIFBlbnRpdW0gdGltZXN0YW1wIGNvdW50ZXIgKi8KKy8qICN1bmRlZiBXSVRIX1RTQyAqLworCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgcHltYWxsb2MgdG8gYmUgZGlzYWJsZWQgd2hlbiBydW5uaW5nIHVuZGVyIHZhbGdyaW5kICovCisvKiAjdW5kZWYgV0lUSF9WQUxHUklORCAqLworCisvKiBEZWZpbmUgV09SRFNfQklHRU5ESUFOIHRvIDEgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3QKKyAgIHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwpLiAqLworI2lmIGRlZmluZWQgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxECisjIGlmIGRlZmluZWQgX19CSUdfRU5ESUFOX18KKyMgIGRlZmluZSBXT1JEU19CSUdFTkRJQU4gMQorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIFdPUkRTX0JJR0VORElBTgorLyogIyAgdW5kZWYgV09SRFNfQklHRU5ESUFOICovCisjIGVuZGlmCisjZW5kaWYKKworLyogRGVmaW5lIGlmIGFyaXRobWV0aWMgaXMgc3ViamVjdCB0byB4ODctc3R5bGUgZG91YmxlIHJvdW5kaW5nIGlzc3VlICovCisvKiAjdW5kZWYgWDg3X0RPVUJMRV9ST1VORElORyAqLworCisvKiBEZWZpbmUgb24gT3BlbkJTRCB0byBhY3RpdmF0ZSBhbGwgbGlicmFyeSBmZWF0dXJlcyAqLworLyogI3VuZGVmIF9CU0RfU09VUkNFICovCisKKy8qIERlZmluZSBvbiBJcml4IHRvIGVuYWJsZSB1X2ludCAqLworI2RlZmluZSBfQlNEX1RZUEVTIDEKKworLyogRGVmaW5lIG9uIERhcndpbiB0byBhY3RpdmF0ZSBhbGwgbGlicmFyeSBmZWF0dXJlcyAqLworI2RlZmluZSBfREFSV0lOX0NfU09VUkNFIDEKKworLyogVGhpcyBtdXN0IGJlIHNldCB0byA2NCBvbiBzb21lIHN5c3RlbXMgdG8gZW5hYmxlIGxhcmdlIGZpbGUgc3VwcG9ydC4gKi8KKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKKworLyogRGVmaW5lIG9uIExpbnV4IHRvIGFjdGl2YXRlIGFsbCBsaWJyYXJ5IGZlYXR1cmVzICovCisjZGVmaW5lIF9HTlVfU09VUkNFIDEKKworLyogVGhpcyBtdXN0IGJlIGRlZmluZWQgb24gc29tZSBzeXN0ZW1zIHRvIGVuYWJsZSBsYXJnZSBmaWxlIHN1cHBvcnQuICovCisjZGVmaW5lIF9MQVJHRUZJTEVfU09VUkNFIDEKKworLyogVGhpcyBtdXN0IGJlIGRlZmluZWQgb24gQUlYIHN5c3RlbXMgdG8gZW5hYmxlIGxhcmdlIGZpbGUgc3VwcG9ydC4gKi8KKy8qICN1bmRlZiBfTEFSR0VfRklMRVMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgb24gTUlOSVguICovCisvKiAjdW5kZWYgX01JTklYICovCisKKy8qIERlZmluZSBvbiBOZXRCU0QgdG8gYWN0aXZhdGUgYWxsIGxpYnJhcnkgZmVhdHVyZXMgKi8KKyNkZWZpbmUgX05FVEJTRF9TT1VSQ0UgMQorCisvKiBEZWZpbmUgX09TRl9TT1VSQ0UgdG8gZ2V0IHRoZSBtYWtlZGV2IG1hY3JvLiAqLworLyogI3VuZGVmIF9PU0ZfU09VUkNFICovCisKKy8qIERlZmluZSB0byAyIGlmIHRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSBQT1NJWC4xIGZlYXR1cmVzIGV4Y2VwdCB3aXRoCisgICB0aGlzIGRlZmluZWQuICovCisvKiAjdW5kZWYgX1BPU0lYXzFfU09VUkNFICovCisKKy8qIERlZmluZSB0byBhY3RpdmF0ZSBmZWF0dXJlcyBmcm9tIElFRUUgU3RkcyAxMDAzLjEtMjAwMSAqLworLyogI3VuZGVmIF9QT1NJWF9DX1NPVVJDRSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3IgYHN0YXQnIGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gKi8KKy8qICN1bmRlZiBfUE9TSVhfU09VUkNFICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBQT1NJWCB0aHJlYWRzLCBhbmQgeW91ciBzeXN0ZW0gZG9lcyBub3QgZGVmaW5lIHRoYXQuICovCisvKiAjdW5kZWYgX1BPU0lYX1RIUkVBRFMgKi8KKworLyogRGVmaW5lIHRvIGZvcmNlIHVzZSBvZiB0aHJlYWQtc2FmZSBlcnJubywgaF9lcnJubywgYW5kIG90aGVyIGZ1bmN0aW9ucyAqLworI2RlZmluZSBfUkVFTlRSQU5UIDEKKworLyogRGVmaW5lIGZvciBTb2xhcmlzIDIuNS4xIHNvIHRoZSB1aW50MzJfdCB0eXBlZGVmIGZyb20gPHN5cy9zeW5jaC5oPiwKKyAgIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLiBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZQorICAgI2RlZmluZSBiZWxvdyB3b3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvci4gKi8KKy8qICN1bmRlZiBfVUlOVDMyX1QgKi8KKworLyogRGVmaW5lIGZvciBTb2xhcmlzIDIuNS4xIHNvIHRoZSB1aW50NjRfdCB0eXBlZGVmIGZyb20gPHN5cy9zeW5jaC5oPiwKKyAgIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLiBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZQorICAgI2RlZmluZSBiZWxvdyB3b3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvci4gKi8KKy8qICN1bmRlZiBfVUlOVDY0X1QgKi8KKworLyogRGVmaW5lIHRvIHRoZSBsZXZlbCBvZiBYL09wZW4gdGhhdCB5b3VyIHN5c3RlbSBzdXBwb3J0cyAqLworLyogI3VuZGVmIF9YT1BFTl9TT1VSQ0UgKi8KKworLyogRGVmaW5lIHRvIGFjdGl2YXRlIFVuaXg5NS1hbmQtZWFybGllciBmZWF0dXJlcyAqLworLyogI3VuZGVmIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgKi8KKworLyogRGVmaW5lIG9uIEZyZWVCU0QgdG8gYWN0aXZhdGUgYWxsIGxpYnJhcnkgZmVhdHVyZXMgKi8KKyNkZWZpbmUgX19CU0RfVklTSUJMRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHR5cGUgYGNoYXInIGlzIHVuc2lnbmVkIGFuZCB5b3UgYXJlIG5vdCB1c2luZyBnY2MuICAqLworI2lmbmRlZiBfX0NIQVJfVU5TSUdORURfXworLyogIyB1bmRlZiBfX0NIQVJfVU5TSUdORURfXyAqLworI2VuZGlmCisKKy8qIERlZmluZWQgb24gU29sYXJpcyB0byBzZWUgYWRkaXRpb25hbCBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworI2RlZmluZSBfX0VYVEVOU0lPTlNfXyAxCisKKy8qIERlZmluZSB0byAnbG9uZycgaWYgPHRpbWUuaD4gZG9lc24ndCBkZWZpbmUuICovCisvKiAjdW5kZWYgY2xvY2tfdCAqLworCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KKy8qICN1bmRlZiBjb25zdCAqLworCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gKi8KKy8qICN1bmRlZiBnaWRfdCAqLworCisvKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYSBzaWduZWQgaW50ZWdlciB0eXBlIG9mIHdpZHRoIGV4YWN0bHkgMzIgYml0cyBpZgorICAgc3VjaCBhIHR5cGUgZXhpc3RzIGFuZCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMgZG8gbm90IGRlZmluZSBpdC4gKi8KKy8qICN1bmRlZiBpbnQzMl90ICovCisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSA2NCBiaXRzIGlmCisgICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLworLyogI3VuZGVmIGludDY0X3QgKi8KKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworLyogI3VuZGVmIG1vZGVfdCAqLworCisvKiBEZWZpbmUgdG8gYGxvbmcgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKy8qICN1bmRlZiBvZmZfdCAqLworCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisvKiAjdW5kZWYgcGlkX3QgKi8KKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICovCisvKiAjdW5kZWYgc2lnbmVkICovCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKy8qICN1bmRlZiBzaXplX3QgKi8KKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvc29ja2V0Lmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKy8qICN1bmRlZiBzb2NrbGVuX3QgKi8KKworLyogRGVmaW5lIHRvIGBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lc24ndCBkZWZpbmUuICovCisvKiAjdW5kZWYgdWlkX3QgKi8KKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDMyIGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisvKiAjdW5kZWYgdWludDMyX3QgKi8KKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDY0IGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisvKiAjdW5kZWYgdWludDY0X3QgKi8KKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHdvcmsuICovCisvKiAjdW5kZWYgdm9sYXRpbGUgKi8KKworCisvKiBEZWZpbmUgdGhlIG1hY3JvcyBuZWVkZWQgaWYgb24gYSBVbml4V2FyZSA3Lnggc3lzdGVtLiAqLworI2lmIGRlZmluZWQoX19VU0xDX18pICYmIGRlZmluZWQoX19TQ09fVkVSU0lPTl9fKQorI2RlZmluZSBTVFJJQ1RfU1lTVl9DVVJTRVMgLyogRG9uJ3QgdXNlIG5jdXJzZXMgZXh0ZW5zaW9ucyAqLworI2VuZGlmCisKKyNlbmRpZiAvKlB5X1BZQ09ORklHX0gqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weWN0eXBlLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9weWN0eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczY2YyZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5Y3R5cGUuaApAQCAtMCwwICsxLDMxIEBACisjaWZuZGVmIFBZQ1RZUEVfSAorI2RlZmluZSBQWUNUWVBFX0gKKworI2RlZmluZSBQWV9DVEZfTE9XRVIgIDB4MDEKKyNkZWZpbmUgUFlfQ1RGX1VQUEVSICAweDAyCisjZGVmaW5lIFBZX0NURl9BTFBIQSAgKFBZX0NURl9MT1dFUnxQWV9DVEZfVVBQRVIpCisjZGVmaW5lIFBZX0NURl9ESUdJVCAgMHgwNAorI2RlZmluZSBQWV9DVEZfQUxOVU0gIChQWV9DVEZfQUxQSEF8UFlfQ1RGX0RJR0lUKQorI2RlZmluZSBQWV9DVEZfU1BBQ0UgIDB4MDgKKyNkZWZpbmUgUFlfQ1RGX1hESUdJVCAweDEwCisKK1B5QVBJX0RBVEEoY29uc3QgdW5zaWduZWQgaW50KSBfUHlfY3R5cGVfdGFibGVbMjU2XTsKKworLyogVW5saWtlIHRoZWlyIEMgY291bnRlcnBhcnRzLCB0aGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgbm90IG1lYW50IHRvCisgKiBoYW5kbGUgYW4gaW50IHdpdGggYW55IG9mIHRoZSB2YWx1ZXMgW0VPRiwgMC1VQ0hBUl9NQVhdLiBUaGUgYXJndW1lbnQKKyAqIG11c3QgYmUgYSBzaWduZWQvdW5zaWduZWQgY2hhci4gKi8KKyNkZWZpbmUgUHlfSVNMT1dFUihjKSAgKF9QeV9jdHlwZV90YWJsZVtQeV9DSEFSTUFTSyhjKV0gJiBQWV9DVEZfTE9XRVIpCisjZGVmaW5lIFB5X0lTVVBQRVIoYykgIChfUHlfY3R5cGVfdGFibGVbUHlfQ0hBUk1BU0soYyldICYgUFlfQ1RGX1VQUEVSKQorI2RlZmluZSBQeV9JU0FMUEhBKGMpICAoX1B5X2N0eXBlX3RhYmxlW1B5X0NIQVJNQVNLKGMpXSAmIFBZX0NURl9BTFBIQSkKKyNkZWZpbmUgUHlfSVNESUdJVChjKSAgKF9QeV9jdHlwZV90YWJsZVtQeV9DSEFSTUFTSyhjKV0gJiBQWV9DVEZfRElHSVQpCisjZGVmaW5lIFB5X0lTWERJR0lUKGMpIChfUHlfY3R5cGVfdGFibGVbUHlfQ0hBUk1BU0soYyldICYgUFlfQ1RGX1hESUdJVCkKKyNkZWZpbmUgUHlfSVNBTE5VTShjKSAgKF9QeV9jdHlwZV90YWJsZVtQeV9DSEFSTUFTSyhjKV0gJiBQWV9DVEZfQUxOVU0pCisjZGVmaW5lIFB5X0lTU1BBQ0UoYykgIChfUHlfY3R5cGVfdGFibGVbUHlfQ0hBUk1BU0soYyldICYgUFlfQ1RGX1NQQUNFKQorCitQeUFQSV9EQVRBKGNvbnN0IHVuc2lnbmVkIGNoYXIpIF9QeV9jdHlwZV90b2xvd2VyWzI1Nl07CitQeUFQSV9EQVRBKGNvbnN0IHVuc2lnbmVkIGNoYXIpIF9QeV9jdHlwZV90b3VwcGVyWzI1Nl07CisKKyNkZWZpbmUgUHlfVE9MT1dFUihjKSAoX1B5X2N0eXBlX3RvbG93ZXJbUHlfQ0hBUk1BU0soYyldKQorI2RlZmluZSBQeV9UT1VQUEVSKGMpIChfUHlfY3R5cGVfdG91cHBlcltQeV9DSEFSTUFTSyhjKV0pCisKKyNlbmRpZiAvKiAhUFlDVFlQRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weWRlYnVnLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9weWRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0NTk2MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5ZGVidWcuaApAQCAtMCwwICsxLDQxIEBACisKKyNpZm5kZWYgUHlfUFlERUJVR19ICisjZGVmaW5lIFB5X1BZREVCVUdfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9EQVRBKGludCkgUHlfRGVidWdGbGFnOworUHlBUElfREFUQShpbnQpIFB5X1ZlcmJvc2VGbGFnOworUHlBUElfREFUQShpbnQpIFB5X0ludGVyYWN0aXZlRmxhZzsKK1B5QVBJX0RBVEEoaW50KSBQeV9JbnNwZWN0RmxhZzsKK1B5QVBJX0RBVEEoaW50KSBQeV9PcHRpbWl6ZUZsYWc7CitQeUFQSV9EQVRBKGludCkgUHlfTm9TaXRlRmxhZzsKK1B5QVBJX0RBVEEoaW50KSBQeV9CeXRlc1dhcm5pbmdGbGFnOworUHlBUElfREFUQShpbnQpIFB5X1VzZUNsYXNzRXhjZXB0aW9uc0ZsYWc7CitQeUFQSV9EQVRBKGludCkgUHlfRnJvemVuRmxhZzsKK1B5QVBJX0RBVEEoaW50KSBQeV9UYWJjaGVja0ZsYWc7CitQeUFQSV9EQVRBKGludCkgUHlfVW5pY29kZUZsYWc7CitQeUFQSV9EQVRBKGludCkgUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnOworUHlBUElfREFUQShpbnQpIFB5X0RpdmlzaW9uV2FybmluZ0ZsYWc7CitQeUFQSV9EQVRBKGludCkgUHlfRG9udFdyaXRlQnl0ZWNvZGVGbGFnOworUHlBUElfREFUQShpbnQpIFB5X05vVXNlclNpdGVEaXJlY3Rvcnk7CisvKiBfWFhYIFB5X1FuZXdGbGFnIHNob3VsZCBnbyBhd2F5IGluIDMuMC4gIEl0J3MgdHJ1ZSBpZmYgLVFuZXcgaXMgcGFzc2VkLAorICBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgaXMgdXNlZCBpbiAyLjIgYnkgY2V2YWwuYyB0byBtYWtlIGFsbCAiLyIgZGl2aXNpb25zCisgIHRydWUgZGl2aXNpb25zICh3aGljaCB0aGV5IHdpbGwgYmUgaW4gMy4wKS4gKi8KK1B5QVBJX0RBVEEoaW50KSBfUHlfUW5ld0ZsYWc7CisvKiBXYXJuIGFib3V0IDMueCBpc3N1ZXMgKi8KK1B5QVBJX0RBVEEoaW50KSBQeV9QeTNrV2FybmluZ0ZsYWc7CitQeUFQSV9EQVRBKGludCkgUHlfSGFzaFJhbmRvbWl6YXRpb25GbGFnOworCisvKiB0aGlzIGlzIGEgd3JhcHBlciBhcm91bmQgZ2V0ZW52KCkgdGhhdCBwYXlzIGF0dGVudGlvbiB0bworICAgUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnLiAgSXQgc2hvdWxkIGJlIHVzZWQgZm9yIGdldHRpbmcgdmFyaWFibGVzIGxpa2UKKyAgIFBZVEhPTlBBVEggYW5kIFBZVEhPTkhPTUUgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KKyNkZWZpbmUgUHlfR0VURU5WKHMpIChQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWcgPyBOVUxMIDogZ2V0ZW52KHMpKQorCitQeUFQSV9GVU5DKHZvaWQpIFB5X0ZhdGFsRXJyb3IoY29uc3QgY2hhciAqbWVzc2FnZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1BZREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHllcnJvcnMuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5ZXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlM2JmYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5ZXJyb3JzLmgKQEAgLTAsMCArMSwzMjggQEAKKyNpZm5kZWYgUHlfRVJST1JTX0gKKyNkZWZpbmUgUHlfRVJST1JTX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRXJyb3Igb2JqZWN0cyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICptZXNzYWdlOworfSBQeUJhc2VFeGNlcHRpb25PYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKm1lc3NhZ2U7CisgICAgUHlPYmplY3QgKm1zZzsKKyAgICBQeU9iamVjdCAqZmlsZW5hbWU7CisgICAgUHlPYmplY3QgKmxpbmVubzsKKyAgICBQeU9iamVjdCAqb2Zmc2V0OworICAgIFB5T2JqZWN0ICp0ZXh0OworICAgIFB5T2JqZWN0ICpwcmludF9maWxlX2FuZF9saW5lOworfSBQeVN5bnRheEVycm9yT2JqZWN0OworCisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqbWVzc2FnZTsKKyAgICBQeU9iamVjdCAqZW5jb2Rpbmc7CisgICAgUHlPYmplY3QgKm9iamVjdDsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0OworICAgIFB5X3NzaXplX3QgZW5kOworICAgIFB5T2JqZWN0ICpyZWFzb247Cit9IFB5VW5pY29kZUVycm9yT2JqZWN0OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKm1lc3NhZ2U7CisgICAgUHlPYmplY3QgKmNvZGU7Cit9IFB5U3lzdGVtRXhpdE9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqbWVzc2FnZTsKKyAgICBQeU9iamVjdCAqbXllcnJubzsKKyAgICBQeU9iamVjdCAqc3RyZXJyb3I7CisgICAgUHlPYmplY3QgKmZpbGVuYW1lOworfSBQeUVudmlyb25tZW50RXJyb3JPYmplY3Q7CisKKyNpZmRlZiBNU19XSU5ET1dTCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICptZXNzYWdlOworICAgIFB5T2JqZWN0ICpteWVycm5vOworICAgIFB5T2JqZWN0ICpzdHJlcnJvcjsKKyAgICBQeU9iamVjdCAqZmlsZW5hbWU7CisgICAgUHlPYmplY3QgKndpbmVycm9yOworfSBQeVdpbmRvd3NFcnJvck9iamVjdDsKKyNlbmRpZgorCisvKiBFcnJvciBoYW5kbGluZyBkZWZpbml0aW9ucyAqLworCitQeUFQSV9GVU5DKHZvaWQpIFB5RXJyX1NldE5vbmUoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5RXJyX1NldE9iamVjdChQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFcnJfU2V0U3RyaW5nKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX09jY3VycmVkKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeUVycl9DbGVhcih2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFcnJfRmV0Y2goUHlPYmplY3QgKiosIFB5T2JqZWN0ICoqLCBQeU9iamVjdCAqKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5RXJyX1Jlc3RvcmUoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKKyNpZmRlZiBQeV9ERUJVRworI2RlZmluZSBfUHlFcnJfT0NDVVJSRUQoKSBQeUVycl9PY2N1cnJlZCgpCisjZWxzZQorI2RlZmluZSBfUHlFcnJfT0NDVVJSRUQoKSAoX1B5VGhyZWFkU3RhdGVfQ3VycmVudC0+Y3VyZXhjX3R5cGUpCisjZW5kaWYKKworLyogRXJyb3IgdGVzdGluZyBhbmQgbm9ybWFsaXphdGlvbiAqLworUHlBUElfRlVOQyhpbnQpIFB5RXJyX0dpdmVuRXhjZXB0aW9uTWF0Y2hlcyhQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh2b2lkKSBQeUVycl9Ob3JtYWxpemVFeGNlcHRpb24oUHlPYmplY3QqKiwgUHlPYmplY3QqKiwgUHlPYmplY3QqKik7CisKKy8qICovCisKKyNkZWZpbmUgUHlFeGNlcHRpb25DbGFzc19DaGVjayh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoUHlDbGFzc19DaGVjaygoeCkpIHx8IChQeVR5cGVfQ2hlY2soKHgpKSAmJiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoKFB5VHlwZU9iamVjdCopKHgpLCBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTKSkpCisKKyNkZWZpbmUgUHlFeGNlcHRpb25JbnN0YW5jZV9DaGVjayh4KSAgICAgICAgICAgICAgICAgICAgXAorICAgIChQeUluc3RhbmNlX0NoZWNrKCh4KSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoKHgpLT5vYl90eXBlLCBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTKSkKKworI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX05hbWUoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoUHlDbGFzc19DaGVjaygoeCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgID8gUHlTdHJpbmdfQVNfU1RSSU5HKCgoUHlDbGFzc09iamVjdCopKHgpKS0+Y2xfbmFtZSkgICAgICAgICAgXAorICAgICA6IChjaGFyICopKCgoUHlUeXBlT2JqZWN0KikoeCkpLT50cF9uYW1lKSkKKworI2RlZmluZSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NsYXNzKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoUHlJbnN0YW5jZV9DaGVjaygoeCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgPyAoUHlPYmplY3QqKSgoUHlJbnN0YW5jZU9iamVjdCopKHgpKS0+aW5fY2xhc3MgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAoUHlPYmplY3QqKSgoeCktPm9iX3R5cGUpKSkKKworCisvKiBQcmVkZWZpbmVkIGV4Y2VwdGlvbnMgKi8KKworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19CYXNlRXhjZXB0aW9uOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19FeGNlcHRpb247CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1N0b3BJdGVyYXRpb247CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0dlbmVyYXRvckV4aXQ7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1N0YW5kYXJkRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0FyaXRobWV0aWNFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfTG9va3VwRXJyb3I7CisKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfQXNzZXJ0aW9uRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0F0dHJpYnV0ZUVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19FT0ZFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfRmxvYXRpbmdQb2ludEVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19FbnZpcm9ubWVudEVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19JT0Vycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19PU0Vycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19JbXBvcnRFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfSW5kZXhFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfS2V5RXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0tleWJvYXJkSW50ZXJydXB0OworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19NZW1vcnlFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfTmFtZUVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19PdmVyZmxvd0Vycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19SdW50aW1lRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1N5bnRheEVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19JbmRlbnRhdGlvbkVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19UYWJFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfUmVmZXJlbmNlRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1N5c3RlbUVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19TeXN0ZW1FeGl0OworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19UeXBlRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1VuYm91bmRMb2NhbEVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19Vbmljb2RlRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1VuaWNvZGVFbmNvZGVFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfVW5pY29kZURlY29kZUVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19Vbmljb2RlVHJhbnNsYXRlRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1ZhbHVlRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1plcm9EaXZpc2lvbkVycm9yOworI2lmZGVmIE1TX1dJTkRPV1MKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfV2luZG93c0Vycm9yOworI2VuZGlmCisjaWZkZWYgX19WTVMKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfVk1TRXJyb3I7CisjZW5kaWYKKworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19CdWZmZXJFcnJvcjsKKworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19NZW1vcnlFcnJvckluc3Q7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1JlY3Vyc2lvbkVycm9ySW5zdDsKKworLyogUHJlZGVmaW5lZCB3YXJuaW5nIGNhdGVnb3JpZXMgKi8KK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfV2FybmluZzsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfVXNlcldhcm5pbmc7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZzsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZzsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfU3ludGF4V2FybmluZzsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfUnVudGltZVdhcm5pbmc7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0Z1dHVyZVdhcm5pbmc7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0ltcG9ydFdhcm5pbmc7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1VuaWNvZGVXYXJuaW5nOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19CeXRlc1dhcm5pbmc7CisKKworLyogQ29udmVuaWVuY2UgZnVuY3Rpb25zICovCisKK1B5QVBJX0ZVTkMoaW50KSBQeUVycl9CYWRBcmd1bWVudCh2b2lkKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfTm9NZW1vcnkodm9pZCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEZyb21FcnJubyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KAorICAgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWUoCisgICAgUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKKyNpZmRlZiBNU19XSU5ET1dTCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEZyb21FcnJub1dpdGhVbmljb2RlRmlsZW5hbWUoCisgICAgUHlPYmplY3QgKiwgY29uc3QgUHlfVU5JQ09ERSAqKTsKKyNlbmRpZiAvKiBNU19XSU5ET1dTICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfRm9ybWF0KFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgLi4uKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMiwgMykpKTsKKworI2lmZGVmIE1TX1dJTkRPV1MKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoCisgICAgaW50LCBjb25zdCBjaGFyICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgKKyAgICBpbnQsIGNvbnN0IGNoYXIgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aFVuaWNvZGVGaWxlbmFtZSgKKyAgICBpbnQsIGNvbnN0IFB5X1VOSUNPREUgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyKGludCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lT2JqZWN0KAorICAgIFB5T2JqZWN0ICosaW50LCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWUoCisgICAgUHlPYmplY3QgKixpbnQsIGNvbnN0IGNoYXIgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEV4Y0Zyb21XaW5kb3dzRXJyV2l0aFVuaWNvZGVGaWxlbmFtZSgKKyAgICBQeU9iamVjdCAqLGludCwgY29uc3QgUHlfVU5JQ09ERSAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnIoUHlPYmplY3QgKiwgaW50KTsKKyNlbmRpZiAvKiBNU19XSU5ET1dTICovCisKKy8qIEV4cG9ydCB0aGUgb2xkIGZ1bmN0aW9uIHNvIHRoYXQgdGhlIGV4aXN0aW5nIEFQSSByZW1haW5zIGF2YWlsYWJsZTogKi8KK1B5QVBJX0ZVTkModm9pZCkgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBfUHlFcnJfQmFkSW50ZXJuYWxDYWxsKGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZW5vKTsKKy8qIE1hc2sgdGhlIG9sZCBBUEkgd2l0aCBhIGNhbGwgdG8gdGhlIG5ldyBBUEkgZm9yIGNvZGUgY29tcGlsZWQgdW5kZXIKKyAgIFB5dGhvbiAyLjA6ICovCisjZGVmaW5lIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpIF9QeUVycl9CYWRJbnRlcm5hbENhbGwoX19GSUxFX18sIF9fTElORV9fKQorCisvKiBGdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgZXhjZXB0aW9uICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX05ld0V4Y2VwdGlvbigKKyAgICBjaGFyICpuYW1lLCBQeU9iamVjdCAqYmFzZSwgUHlPYmplY3QgKmRpY3QpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9OZXdFeGNlcHRpb25XaXRoRG9jKAorICAgIGNoYXIgKm5hbWUsIGNoYXIgKmRvYywgUHlPYmplY3QgKmJhc2UsIFB5T2JqZWN0ICpkaWN0KTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKFB5T2JqZWN0ICopOworCisvKiBJbiBzaWdjaGVjay5jIG9yIHNpZ25hbG1vZHVsZS5jICovCitQeUFQSV9GVU5DKGludCkgUHlFcnJfQ2hlY2tTaWduYWxzKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeUVycl9TZXRJbnRlcnJ1cHQodm9pZCk7CisKKy8qIEluIHNpZ25hbG1vZHVsZS5jICovCitpbnQgUHlTaWduYWxfU2V0V2FrZXVwRmQoaW50IGZkKTsKKworLyogU3VwcG9ydCBmb3IgYWRkaW5nIHByb2dyYW0gdGV4dCB0byBTeW50YXhFcnJvcnMgKi8KK1B5QVBJX0ZVTkModm9pZCkgUHlFcnJfU3ludGF4TG9jYXRpb24oY29uc3QgY2hhciAqLCBpbnQpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9Qcm9ncmFtVGV4dChjb25zdCBjaGFyICosIGludCk7CisKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBjcmVhdGUgYW5kIG1vZGlmeSB1bmljb2RlCisgICBleGNlcHRpb25zIGZyb20gQyAqLworCisvKiBjcmVhdGUgYSBVbmljb2RlRGVjb2RlRXJyb3Igb2JqZWN0ICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZURlY29kZUVycm9yX0NyZWF0ZSgKKyAgICBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgY29uc3QgY2hhciAqKTsKKworLyogY3JlYXRlIGEgVW5pY29kZUVuY29kZUVycm9yIG9iamVjdCAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9DcmVhdGUoCisgICAgY29uc3QgY2hhciAqLCBjb25zdCBQeV9VTklDT0RFICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIGNvbnN0IGNoYXIgKik7CisKKy8qIGNyZWF0ZSBhIFVuaWNvZGVUcmFuc2xhdGVFcnJvciBvYmplY3QgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfQ3JlYXRlKAorICAgIGNvbnN0IFB5X1VOSUNPREUgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgY29uc3QgY2hhciAqKTsKKworLyogZ2V0IHRoZSBlbmNvZGluZyBhdHRyaWJ1dGUgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5jb2RpbmcoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuY29kaW5nKFB5T2JqZWN0ICopOworCisvKiBnZXQgdGhlIG9iamVjdCBhdHRyaWJ1dGUgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0T2JqZWN0KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRPYmplY3QoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldE9iamVjdChQeU9iamVjdCAqKTsKKworLyogZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3RhcnQgYXR0cmlidXRlICh0aGUgaW50ICogbWF5IG5vdCBiZSBOVUxMKQorICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZSAqLworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0KFB5T2JqZWN0ICosIFB5X3NzaXplX3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQoUHlPYmplY3QgKiwgUHlfc3NpemVfdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRTdGFydChQeU9iamVjdCAqLCBQeV9zc2l6ZV90ICopOworCisvKiBhc3NpZ24gYSBuZXcgdmFsdWUgdG8gdGhlIHN0YXJ0IGF0dHJpYnV0ZQorICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZSAqLworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFN0YXJ0KFB5T2JqZWN0ICosIFB5X3NzaXplX3QpOworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZURlY29kZUVycm9yX1NldFN0YXJ0KFB5T2JqZWN0ICosIFB5X3NzaXplX3QpOworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFN0YXJ0KFB5T2JqZWN0ICosIFB5X3NzaXplX3QpOworCisvKiBnZXQgdGhlIHZhbHVlIG9mIHRoZSBlbmQgYXR0cmlidXRlICh0aGUgaW50ICptYXkgbm90IGJlIE5VTEwpCisgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZSAqLworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZUVuY29kZUVycm9yX0dldEVuZChQeU9iamVjdCAqLCBQeV9zc2l6ZV90ICopOworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZURlY29kZUVycm9yX0dldEVuZChQeU9iamVjdCAqLCBQeV9zc2l6ZV90ICopOworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldEVuZChQeU9iamVjdCAqLCBQeV9zc2l6ZV90ICopOworCisvKiBhc3NpZ24gYSBuZXcgdmFsdWUgdG8gdGhlIGVuZCBhdHRyaWJ1dGUKKyAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRFbmQoUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0RW5kKFB5T2JqZWN0ICosIFB5X3NzaXplX3QpOworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldEVuZChQeU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKKworLyogZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgcmVhc29uIGF0dHJpYnV0ZSAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRSZWFzb24oUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZURlY29kZUVycm9yX0dldFJlYXNvbihQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0UmVhc29uKFB5T2JqZWN0ICopOworCisvKiBhc3NpZ24gYSBuZXcgdmFsdWUgdG8gdGhlIHJlYXNvbiBhdHRyaWJ1dGUKKyAgIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9TZXRSZWFzb24oCisgICAgUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRSZWFzb24oCisgICAgUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9TZXRSZWFzb24oCisgICAgUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisKKy8qIFRoZXNlIEFQSXMgYXJlbid0IHJlYWxseSBwYXJ0IG9mIHRoZSBlcnJvciBpbXBsZW1lbnRhdGlvbiwgYnV0CisgICBvZnRlbiBuZWVkZWQgdG8gZm9ybWF0IGVycm9yIG1lc3NhZ2VzOyB0aGUgbmF0aXZlIEMgbGliIEFQSXMgYXJlCisgICBub3QgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXMsIHdoaWNoIGlzIHdoeSB3ZSBwcm92aWRlIGVtdWxhdGlvbnMKKyAgIGZvciB0aG9zZSBwbGF0Zm9ybXMgaW4gUHl0aG9uL215c25wcmludGYuYywKKyAgIFdBUk5JTkc6ICBUaGUgcmV0dXJuIHZhbHVlIG9mIHNucHJpbnRmIHZhcmllcyBhY3Jvc3MgcGxhdGZvcm1zOyBkbworICAgbm90IHJlbHkgb24gYW55IHBhcnRpY3VsYXIgYmVoYXZpb3I7IGV2ZW50dWFsbHkgdGhlIEM5OSBkZWZuIG1heQorICAgYmUgcmVsaWFibGUuCisqLworI2lmIGRlZmluZWQoTVNfV0lOMzIpICYmICFkZWZpbmVkKEhBVkVfU05QUklOVEYpCisjIGRlZmluZSBIQVZFX1NOUFJJTlRGCisjIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyMgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorUHlBUElfRlVOQyhpbnQpIFB5T1Nfc25wcmludGYoY2hhciAqc3RyLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAgKmZvcm1hdCwgLi4uKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMywgNCkpKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU9TX3ZzbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICAqZm9ybWF0LCB2YV9saXN0IHZhKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMywgMCkpKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfRVJST1JTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3B5ZXhwYXQuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5ZXhwYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQwZWY1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHlleHBhdC5oCkBAIC0wLDAgKzEsNDggQEAKKy8qIFN0dWZmIHRvIGV4cG9ydCByZWxldmFudCAnZXhwYXQnIGVudHJ5IHBvaW50cyBmcm9tIHB5ZXhwYXQgdG8gb3RoZXIKKyAqIHBhcnNlciBtb2R1bGVzLCBzdWNoIGFzIGNFbGVtZW50VHJlZS4gKi8KKworLyogbm90ZTogeW91IG11c3QgaW1wb3J0IGV4cGF0LmggYmVmb3JlIGltcG9ydGluZyB0aGlzIG1vZHVsZSEgKi8KKworI2RlZmluZSBQeUV4cGF0X0NBUElfTUFHSUMgICJweWV4cGF0LmV4cGF0X0NBUEkgMS4wIgorI2RlZmluZSBQeUV4cGF0X0NBUFNVTEVfTkFNRSAicHlleHBhdC5leHBhdF9DQVBJIgorCitzdHJ1Y3QgUHlFeHBhdF9DQVBJIAoreworICAgIGNoYXIqIG1hZ2ljOyAvKiBzZXQgdG8gUHlFeHBhdF9DQVBJX01BR0lDICovCisgICAgaW50IHNpemU7IC8qIHNldCB0byBzaXplb2Yoc3RydWN0IFB5RXhwYXRfQ0FQSSkgKi8KKyAgICBpbnQgTUFKT1JfVkVSU0lPTjsKKyAgICBpbnQgTUlOT1JfVkVSU0lPTjsKKyAgICBpbnQgTUlDUk9fVkVSU0lPTjsKKyAgICAvKiBwb2ludGVycyB0byBzZWxlY3RlZCBleHBhdCBmdW5jdGlvbnMuICBhZGQgbmV3IGZ1bmN0aW9ucyBhdAorICAgICAgIHRoZSBlbmQsIGlmIG5lZWRlZCAqLworICAgIGNvbnN0IFhNTF9MQ2hhciAqICgqRXJyb3JTdHJpbmcpKGVudW0gWE1MX0Vycm9yIGNvZGUpOworICAgIGVudW0gWE1MX0Vycm9yICgqR2V0RXJyb3JDb2RlKShYTUxfUGFyc2VyIHBhcnNlcik7CisgICAgWE1MX1NpemUgKCpHZXRFcnJvckNvbHVtbk51bWJlcikoWE1MX1BhcnNlciBwYXJzZXIpOworICAgIFhNTF9TaXplICgqR2V0RXJyb3JMaW5lTnVtYmVyKShYTUxfUGFyc2VyIHBhcnNlcik7CisgICAgZW51bSBYTUxfU3RhdHVzICgqUGFyc2UpKAorICAgICAgICBYTUxfUGFyc2VyIHBhcnNlciwgY29uc3QgY2hhciAqcywgaW50IGxlbiwgaW50IGlzRmluYWwpOworICAgIFhNTF9QYXJzZXIgKCpQYXJzZXJDcmVhdGVfTU0pKAorICAgICAgICBjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsIGNvbnN0IFhNTF9NZW1vcnlfSGFuZGxpbmdfU3VpdGUgKm1lbXN1aXRlLAorICAgICAgICBjb25zdCBYTUxfQ2hhciAqbmFtZXNwYWNlU2VwYXJhdG9yKTsKKyAgICB2b2lkICgqUGFyc2VyRnJlZSkoWE1MX1BhcnNlciBwYXJzZXIpOworICAgIHZvaWQgKCpTZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcikoCisgICAgICAgIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfQ2hhcmFjdGVyRGF0YUhhbmRsZXIgaGFuZGxlcik7CisgICAgdm9pZCAoKlNldENvbW1lbnRIYW5kbGVyKSgKKyAgICAgICAgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Db21tZW50SGFuZGxlciBoYW5kbGVyKTsKKyAgICB2b2lkICgqU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQpKAorICAgICAgICBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0RlZmF1bHRIYW5kbGVyIGhhbmRsZXIpOworICAgIHZvaWQgKCpTZXRFbGVtZW50SGFuZGxlcikoCisgICAgICAgIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfU3RhcnRFbGVtZW50SGFuZGxlciBzdGFydCwKKyAgICAgICAgWE1MX0VuZEVsZW1lbnRIYW5kbGVyIGVuZCk7CisgICAgdm9pZCAoKlNldE5hbWVzcGFjZURlY2xIYW5kbGVyKSgKKyAgICAgICAgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyIHN0YXJ0LAorICAgICAgICBYTUxfRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgZW5kKTsKKyAgICB2b2lkICgqU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcikoCisgICAgICAgIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciBoYW5kbGVyKTsKKyAgICB2b2lkICgqU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlcikoCisgICAgICAgIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfVW5rbm93bkVuY29kaW5nSGFuZGxlciBoYW5kbGVyLAorICAgICAgICB2b2lkICplbmNvZGluZ0hhbmRsZXJEYXRhKTsKKyAgICB2b2lkICgqU2V0VXNlckRhdGEpKFhNTF9QYXJzZXIgcGFyc2VyLCB2b2lkICp1c2VyRGF0YSk7CisgICAgLyogYWx3YXlzIGFkZCBuZXcgc3R1ZmYgdG8gdGhlIGVuZCEgKi8KK307CisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3B5ZnBlLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9weWZwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NTcxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9weWZwZS5oCkBAIC0wLDAgKzEsMTc2IEBACisjaWZuZGVmIFB5X1BZRlBFX0gKKyNkZWZpbmUgUHlfUFlGUEVfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorLyoKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLyAgICAgICAgICAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAxOTk2LiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIHwgICAgICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gICAgICAgICAgICAgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIHwgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciAgIHwKKyAgIHwgICBhbnkgcHVycG9zZSB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGlzIGVuLSAgIHwKKyAgIHwgICB0aXJlIG5vdGljZSBpcyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9mIGFueSBzb2Z0d2FyZSB3aGljaCBpcyBvciAgIHwKKyAgIHwgICBpbmNsdWRlcyAgYSAgY29weSAgb3IgIG1vZGlmaWNhdGlvbiAgb2YgIHRoaXMgc29mdHdhcmUgYW5kIGluIGFsbCAgIHwKKyAgIHwgICBjb3BpZXMgb2YgdGhlIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiBmb3Igc3VjaCBzb2Z0d2FyZS4gICAgICAgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIHwgICBUaGlzICB3b3JrIHdhcyBwcm9kdWNlZCBhdCB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBMYXdyZW5jZSAgIHwKKyAgIHwgICBMaXZlcm1vcmUgTmF0aW9uYWwgTGFib3JhdG9yeSB1bmRlciAgY29udHJhY3QgIG5vLiAgVy03NDA1LUVORy00OCAgIHwKKyAgIHwgICBiZXR3ZWVuICB0aGUgIFUuUy4gIERlcGFydG1lbnQgIG9mICBFbmVyZ3kgYW5kIFRoZSBSZWdlbnRzIG9mIHRoZSAgIHwKKyAgIHwgICBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEgZm9yIHRoZSBvcGVyYXRpb24gb2YgVUMgTExOTC4gICAgICAgICAgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNDTEFJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgIHwgICBUaGlzICBzb2Z0d2FyZSB3YXMgcHJlcGFyZWQgYXMgYW4gYWNjb3VudCBvZiB3b3JrIHNwb25zb3JlZCBieSBhbiAgIHwKKyAgIHwgICBhZ2VuY3kgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudC4gTmVpdGhlciB0aGUgVW5pdGVkIFN0YXRlcyAgIHwKKyAgIHwgICBHb3Zlcm5tZW50ICBub3IgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBub3IgYW55IG9mIHRoZWlyIGVtLSAgIHwKKyAgIHwgICBwbG95ZWVzLCBtYWtlcyBhbnkgd2FycmFudHksIGV4cHJlc3Mgb3IgaW1wbGllZCwgb3IgIGFzc3VtZXMgIGFueSAgIHwKKyAgIHwgICBsaWFiaWxpdHkgIG9yICByZXNwb25zaWJpbGl0eSAgZm9yIHRoZSBhY2N1cmFjeSwgY29tcGxldGVuZXNzLCBvciAgIHwKKyAgIHwgICB1c2VmdWxuZXNzIG9mIGFueSBpbmZvcm1hdGlvbiwgIGFwcGFyYXR1cywgIHByb2R1Y3QsICBvciAgcHJvY2VzcyAgIHwKKyAgIHwgICBkaXNjbG9zZWQsICAgb3IgIHJlcHJlc2VudHMgIHRoYXQgIGl0cyAgdXNlICB3b3VsZCAgbm90ICBpbmZyaW5nZSAgIHwKKyAgIHwgICBwcml2YXRlbHktb3duZWQgcmlnaHRzLiBSZWZlcmVuY2UgaGVyZWluIHRvIGFueSBzcGVjaWZpYyAgY29tbWVyLSAgIHwKKyAgIHwgICBjaWFsICBwcm9kdWN0cywgIHByb2Nlc3MsICBvciAgc2VydmljZSAgYnkgdHJhZGUgbmFtZSwgdHJhZGVtYXJrLCAgIHwKKyAgIHwgICBtYW51ZmFjdHVyZXIsIG9yIG90aGVyd2lzZSwgZG9lcyBub3QgIG5lY2Vzc2FyaWx5ICBjb25zdGl0dXRlICBvciAgIHwKKyAgIHwgICBpbXBseSAgaXRzIGVuZG9yc2VtZW50LCByZWNvbW1lbmRhdGlvbiwgb3IgZmF2b3JpbmcgYnkgdGhlIFVuaXRlZCAgIHwKKyAgIHwgICBTdGF0ZXMgR292ZXJubWVudCBvciB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiBUaGUgdmlld3MgIGFuZCAgIHwKKyAgIHwgICBvcGluaW9ucyAgb2YgYXV0aG9ycyBleHByZXNzZWQgaGVyZWluIGRvIG5vdCBuZWNlc3NhcmlseSBzdGF0ZSBvciAgIHwKKyAgIHwgICByZWZsZWN0IHRob3NlIG9mIHRoZSBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQgb3IgIHRoZSAgVW5pdmVyc2l0eSAgIHwKKyAgIHwgICBvZiAgQ2FsaWZvcm5pYSwgIGFuZCBzaGFsbCBub3QgYmUgdXNlZCBmb3IgYWR2ZXJ0aXNpbmcgb3IgcHJvZHVjdCAgIHwKKyAgICBcICBlbmRvcnNlbWVudCBwdXJwb3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8qCisgKiAgICAgICBEZWZpbmUgbWFjcm9zIGZvciBoYW5kbGluZyBTSUdGUEUuCisgKiAgICAgICBMZWUgQnVzYnksIExMTkwsIE5vdmVtYmVyLCAxOTk2CisgKiAgICAgICBidXNieTFAbGxubC5nb3YKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3ZlcnZpZXcgb2YgdGhlIHN5c3RlbSBmb3IgaGFuZGxpbmcgU0lHRlBFOgorICogCisgKiBUaGlzIGZpbGUgKEluY2x1ZGUvcHlmcGUuaCkgZGVmaW5lcyBhIGNvdXBsZSBvZiAid3JhcHBlciIgbWFjcm9zIGZvcgorICogaW5zZXJ0aW9uIGludG8geW91ciBQeXRob24gQyBjb2RlIG9mIGNob2ljZS4gVGhlaXIgcHJvcGVyIHVzZSBpcworICogZGlzY3Vzc2VkIGJlbG93LiBUaGUgZmlsZSBQeXRob24vcHlmcGUuYyBkZWZpbmVzIGEgcGFpciBvZiBnbG9iYWwKKyAqIHZhcmlhYmxlcyBQeUZQRV9qYnVmIGFuZCBQeUZQRV9jb3VudGVyIHdoaWNoIGFyZSB1c2VkIGJ5IHRoZSBzaWduYWwKKyAqIGhhbmRsZXIgZm9yIFNJR0ZQRSB0byBkZWNpZGUgaWYgYSBwYXJ0aWN1bGFyIGV4Y2VwdGlvbiB3YXMgcHJvdGVjdGVkCisgKiBieSB0aGUgbWFjcm9zLiBUaGUgc2lnbmFsIGhhbmRsZXIgaXRzZWxmLCBhbmQgY29kZSBmb3IgZW5hYmxpbmcgdGhlCisgKiBnZW5lcmF0aW9uIG9mIFNJR0ZQRSBpbiB0aGUgZmlyc3QgcGxhY2UsIGlzIGluIGEgKG5ldykgUHl0aG9uIG1vZHVsZQorICogbmFtZWQgZnBlY3RsLiBUaGlzIG1vZHVsZSBpcyBzdGFuZGFyZCBpbiBldmVyeSByZXNwZWN0LiBJdCBjYW4gYmUgbG9hZGVkCisgKiBlaXRoZXIgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSBhcyB5b3UgY2hvb3NlLCBhbmQgbGlrZSBhbnkgb3RoZXIKKyAqIFB5dGhvbiBtb2R1bGUsIGhhcyBubyBlZmZlY3QgdW50aWwgeW91IGltcG9ydCBpdC4KKyAqIAorICogSW4gdGhlIGdlbmVyYWwgY2FzZSwgdGhlcmUgYXJlIHRocmVlIHN0ZXBzIHRvd2FyZCBoYW5kbGluZyBTSUdGUEUgaW4gYW55CisgKiBQeXRob24gY29kZToKKyAqIAorICogMSkgQWRkIHRoZSAqX1BST1RFQ1QgbWFjcm9zIHRvIHlvdXIgQyBjb2RlIGFzIHJlcXVpcmVkIHRvIHByb3RlY3QKKyAqICAgIGRhbmdlcm91cyBmbG9hdGluZyBwb2ludCBzZWN0aW9ucy4KKyAqIAorICogMikgVHVybiBvbiB0aGUgaW5jbHVzaW9uIG9mIHRoZSBjb2RlIGJ5IGFkZGluZyB0aGUgYGAtLXdpdGgtZnBlY3RsJycKKyAqICAgIGZsYWcgYXQgdGhlIHRpbWUgeW91IHJ1biBjb25maWd1cmUuICBJZiB0aGUgZnBlY3RsIG9yIG90aGVyIG1vZHVsZXMKKyAqICAgIHdoaWNoIHVzZSB0aGUgKl9QUk9URUNUIG1hY3JvcyBhcmUgdG8gYmUgZHluYW1pY2FsbHkgbG9hZGVkLCBiZQorICogICAgc3VyZSB0aGV5IGFyZSBjb21waWxlZCB3aXRoIFdBTlRfU0lHRlBFX0hBTkRMRVIgZGVmaW5lZC4KKyAqIAorICogMykgV2hlbiBweXRob24gaXMgYnVpbHQgYW5kIHJ1bm5pbmcsIGltcG9ydCBmcGVjdGwsIGFuZCBleGVjdXRlCisgKiAgICBmcGVjdGwudHVybm9uX3NpZ2ZwZSgpLiBUaGlzIHNldHMgdXAgdGhlIHNpZ25hbCBoYW5kbGVyIGFuZCBlbmFibGVzCisgKiAgICBnZW5lcmF0aW9uIG9mIFNJR0ZQRSB3aGVuZXZlciBhbiBleGNlcHRpb24gb2NjdXJzLiBGcm9tIHRoaXMgcG9pbnQKKyAqICAgIG9uLCBhbnkgcHJvcGVybHkgdHJhcHBlZCBTSUdGUEUgc2hvdWxkIHJlc3VsdCBpbiB0aGUgUHl0aG9uCisgKiAgICBGbG9hdGluZ1BvaW50RXJyb3IgZXhjZXB0aW9uLgorICogCisgKiBTdGVwIDEgaGFzIGJlZW4gZG9uZSBhbHJlYWR5IGZvciB0aGUgUHl0aG9uIGtlcm5lbCBjb2RlLCBhbmQgc2hvdWxkIGJlCisgKiBkb25lIHNvb24gZm9yIHRoZSBOdW1QeSBhcnJheSBwYWNrYWdlLiAgU3RlcCAyIGlzIHVzdWFsbHkgZG9uZSBvbmNlIGF0CisgKiBweXRob24gaW5zdGFsbCB0aW1lLiBQeXRob24ncyBiZWhhdmlvciB3aXRoIHJlc3BlY3QgdG8gU0lHRlBFIGlzIG5vdAorICogY2hhbmdlZCB1bmxlc3MgeW91IGFsc28gZG8gc3RlcCAzLiBUaHVzIHlvdSBjYW4gY29udHJvbCB0aGlzIG5ldworICogZmFjaWxpdHkgYXQgY29tcGlsZSB0aW1lLCBvciBydW4gdGltZSwgb3IgYm90aC4KKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogVXNpbmcgdGhlIG1hY3JvcyBpbiB5b3VyIGNvZGU6CisgKiAKKyAqIHN0YXRpYyBQeU9iamVjdCAqZm9vYmFyKFB5T2JqZWN0ICpzZWxmLFB5T2JqZWN0ICphcmdzKQorICogeworICogICAgIC4uLi4KKyAqICAgICBQeUZQRV9TVEFSVF9QUk9URUNUKCJFcnJvciBpbiBmb29iYXIiLCByZXR1cm4gMCkKKyAqICAgICByZXN1bHQgPSBkYW5nZXJvdXNfb3Aoc29tZWFyZzEsIHNvbWVhcmcyLCAuLi4pOworICogICAgIFB5RlBFX0VORF9QUk9URUNUKHJlc3VsdCkKKyAqICAgICAuLi4uCisgKiB9CisgKiAKKyAqIElmIGEgZmxvYXRpbmcgcG9pbnQgZXJyb3Igb2NjdXJzIGluIGRhbmdlcm91c19vcCwgZm9vYmFyIHJldHVybnMgMCAoTlVMTCksCisgKiBhZnRlciBzZXR0aW5nIHRoZSBhc3NvY2lhdGVkIHZhbHVlIG9mIHRoZSBGbG9hdGluZ1BvaW50RXJyb3IgZXhjZXB0aW9uIHRvCisgKiAiRXJyb3IgaW4gZm9vYmFyIi4gYGBEYW5nZXJvdXNfb3AnJyBjYW4gYmUgYSBzaW5nbGUgb3BlcmF0aW9uLCBvciBhIGJsb2NrCisgKiBvZiBjb2RlLCBmdW5jdGlvbiBjYWxscywgb3IgYW55IGNvbWJpbmF0aW9uLCBzbyBsb25nIGFzIG5vIGFsdGVybmF0ZQorICogcmV0dXJuIGlzIHBvc3NpYmxlIGJlZm9yZSB0aGUgUHlGUEVfRU5EX1BST1RFQ1QgbWFjcm8gaXMgcmVhY2hlZC4KKyAqIAorICogVGhlIG1hY3JvcyBjYW4gb25seSBiZSB1c2VkIGluIGEgZnVuY3Rpb24gY29udGV4dCB3aGVyZSBhbiBlcnJvciByZXR1cm4KKyAqIGNhbiBiZSByZWNvZ25pemVkIGFzIHNpZ25hbGluZyBhIFB5dGhvbiBleGNlcHRpb24uIChHZW5lcmFsbHksIG1vc3QKKyAqIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBhIFB5T2JqZWN0ICogd2lsbCBxdWFsaWZ5LikKKyAqIAorICogR3VpZG8ncyBvcmlnaW5hbCBkZXNpZ24gc3VnZ2VzdGlvbiBmb3IgUHlGUEVfU1RBUlRfUFJPVEVDVCBhbmQKKyAqIFB5RlBFX0VORF9QUk9URUNUIGhhZCB0aGVtIG9wZW4gYW5kIGNsb3NlIGEgbG9jYWwgYmxvY2ssIHdpdGggYSBsb2NhbGx5CisgKiBkZWZpbmVkIGptcF9idWYgYW5kIGptcF9idWYgcG9pbnRlci4gVGhpcyB3b3VsZCBhbGxvdyByZWN1cnNpdmUgbmVzdGluZworICogb2YgdGhlIG1hY3Jvcy4gVGhlIEFuc2kgQyBzdGFuZGFyZCBtYWtlcyBpdCBjbGVhciB0aGF0IHN1Y2ggbG9jYWwKKyAqIHZhcmlhYmxlcyBuZWVkIHRvIGJlIGRlY2xhcmVkIHdpdGggdGhlICJ2b2xhdGlsZSIgdHlwZSBxdWFsaWZpZXIgdG8ga2VlcAorICogc2V0am1wIGZyb20gY29ycnVwdGluZyB0aGVpciB2YWx1ZXMuIFNvbWUgY3VycmVudCBpbXBsZW1lbnRhdGlvbnMgc2VlbQorICogdG8gYmUgbW9yZSByZXN0cmljdGl2ZS4gRm9yIGV4YW1wbGUsIHRoZSBIUFVYIG1hbiBwYWdlIGZvciBzZXRqbXAgc2F5cworICogCisgKiAgIFVwb24gdGhlIHJldHVybiBmcm9tIGEgc2V0am1wKCkgY2FsbCBjYXVzZWQgYnkgYSBsb25nam1wKCksIHRoZQorICogICB2YWx1ZXMgb2YgYW55IG5vbi1zdGF0aWMgbG9jYWwgdmFyaWFibGVzIGJlbG9uZ2luZyB0byB0aGUgcm91dGluZQorICogICBmcm9tIHdoaWNoIHNldGptcCgpIHdhcyBjYWxsZWQgYXJlIHVuZGVmaW5lZC4gQ29kZSB3aGljaCBkZXBlbmRzIG9uCisgKiAgIHN1Y2ggdmFsdWVzIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIHBvcnRhYmxlLgorICogCisgKiBJIHRoZXJlZm9yZSBkZWNpZGVkIG9uIGEgbW9yZSBsaW1pdGVkIGZvcm0gb2YgbmVzdGluZywgdXNpbmcgYSBjb3VudGVyCisgKiB2YXJpYWJsZSAoUHlGUEVfY291bnRlcikgdG8ga2VlcCB0cmFjayBvZiBhbnkgcmVjdXJzaW9uLiAgSWYgYW4gZXhjZXB0aW9uCisgKiBvY2N1cnMgaW4gYW4gYGBpbm5lcicnIHBhaXIgb2YgbWFjcm9zLCB0aGUgcmV0dXJuIHdpbGwgYXBwYXJlbnRseQorICogY29tZSBmcm9tIHRoZSBvdXRlcm1vc3QgbGV2ZWwuCisgKiAKKyAqLworCisjaWZkZWYgV0FOVF9TSUdGUEVfSEFORExFUgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPG1hdGguaD4KK2V4dGVybiBqbXBfYnVmIFB5RlBFX2pidWY7CitleHRlcm4gaW50IFB5RlBFX2NvdW50ZXI7CitleHRlcm4gZG91YmxlIFB5RlBFX2R1bW15KHZvaWQgKik7CisKKyNkZWZpbmUgUHlGUEVfU1RBUlRfUFJPVEVDVChlcnJfc3RyaW5nLCBsZWF2ZV9zdG10KSBcCitpZiAoIVB5RlBFX2NvdW50ZXIrKyAmJiBzZXRqbXAoUHlGUEVfamJ1ZikpIHsgXAorCVB5RXJyX1NldFN0cmluZyhQeUV4Y19GbG9hdGluZ1BvaW50RXJyb3IsIGVycl9zdHJpbmcpOyBcCisJUHlGUEVfY291bnRlciA9IDA7IFwKKwlsZWF2ZV9zdG10OyBcCit9CisKKy8qCisgKiBUaGlzIChmb2xsb3dpbmcpIGlzIGEgaGVjayBvZiBhIHdheSB0byBkZWNyZW1lbnQgYSBjb3VudGVyLiBIb3dldmVyLAorICogdW5sZXNzIHRoZSBtYWNybyBhcmd1bWVudCBpcyBwcm92aWRlZCwgY29kZSBvcHRpbWl6ZXJzIHdpbGwgc29tZXRpbWVzIG1vdmUKKyAqIHRoaXMgc3RhdGVtZW50IHNvIHRoYXQgaXQgZ2V0cyBleGVjdXRlZCAqYmVmb3JlKiB0aGUgdW5zYWZlIGV4cHJlc3Npb24KKyAqIHdoaWNoIHdlJ3JlIHRyeWluZyB0byBwcm90ZWN0LiAgVGhhdCBwcmV0dHkgd2VsbCBtZXNzZXMgdGhpbmdzIHVwLAorICogb2YgY291cnNlLgorICogCisgKiBJZiB0aGUgZXhwcmVzc2lvbihzKSB5b3UncmUgdHJ5aW5nIHRvIHByb3RlY3QgZG9uJ3QgaGFwcGVuIHRvIHJldHVybiBhCisgKiB2YWx1ZSwgeW91IHdpbGwgbmVlZCB0byBtYW51ZmFjdHVyZSBhIGR1bW15IHJlc3VsdCBqdXN0IHRvIHByZXNlcnZlIHRoZQorICogY29ycmVjdCBvcmRlcmluZyBvZiBzdGF0ZW1lbnRzLiAgTm90ZSB0aGF0IHRoZSBtYWNybyBwYXNzZXMgdGhlIGFkZHJlc3MKKyAqIG9mIGl0cyBhcmd1bWVudCAoc28geW91IG5lZWQgdG8gZ2l2ZSBpdCBzb21ldGhpbmcgd2hpY2ggaXMgYWRkcmVzc2FibGUpLgorICogSWYgeW91ciBleHByZXNzaW9uIHJldHVybnMgbXVsdGlwbGUgcmVzdWx0cywgcGFzcyB0aGUgbGFzdCBzdWNoIHJlc3VsdAorICogdG8gUHlGUEVfRU5EX1BST1RFQ1QuCisgKiAKKyAqIE5vdGUgdGhhdCBQeUZQRV9kdW1teSByZXR1cm5zIGEgZG91YmxlLCB3aGljaCBpcyBjYXN0IHRvIGludC4KKyAqIFRoaXMgc2VlbWluZyBpbnNhbml0eSBpcyB0byB0aWNrbGUgdGhlIEZsb2F0aW5nIFBvaW50IFVuaXQgKEZQVSkuCisgKiBJZiBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkIGluIGEgcHJlY2VkaW5nIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbiwKKyAqIHNvbWUgYXJjaGl0ZWN0dXJlcyAobm90YWJseSBJbnRlbCA4MHg4Nikgd2lsbCBub3QgZGVsaXZlciB0aGUgaW50ZXJydXB0CisgKiB1bnRpbCB0aGUgKm5leHQqIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbi4gIFRoaXMgaXMgcGFpbmZ1bCBpZiB5b3UndmUKKyAqIGFscmVhZHkgZGVjcmVtZW50ZWQgUHlGUEVfY291bnRlci4KKyAqLworI2RlZmluZSBQeUZQRV9FTkRfUFJPVEVDVCh2KSBQeUZQRV9jb3VudGVyIC09IChpbnQpUHlGUEVfZHVtbXkoJih2KSk7CisKKyNlbHNlCisKKyNkZWZpbmUgUHlGUEVfU1RBUlRfUFJPVEVDVChlcnJfc3RyaW5nLCBsZWF2ZV9zdG10KQorI2RlZmluZSBQeUZQRV9FTkRfUFJPVEVDVCh2KQorCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfUFlGUEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHlnZXRvcHQuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5Z2V0b3B0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2MGQzNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5Z2V0b3B0LmgKQEAgLTAsMCArMSwxOCBAQAorCisjaWZuZGVmIFB5X1BZR0VUT1BUX0gKKyNkZWZpbmUgUHlfUFlHRVRPUFRfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9EQVRBKGludCkgX1B5T1Nfb3B0ZXJyOworUHlBUElfREFUQShpbnQpIF9QeU9TX29wdGluZDsKK1B5QVBJX0RBVEEoY2hhciAqKSBfUHlPU19vcHRhcmc7CisKK1B5QVBJX0ZVTkModm9pZCkgX1B5T1NfUmVzZXRHZXRPcHQodm9pZCk7CitQeUFQSV9GVU5DKGludCkgX1B5T1NfR2V0T3B0KGludCBhcmdjLCBjaGFyICoqYXJndiwgY2hhciAqb3B0c3RyaW5nKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfUFlHRVRPUFRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHltYWNjb25maWcuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5bWFjY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlN2I4ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5bWFjY29uZmlnLmgKQEAgLTAsMCArMSwxMDIgQEAKKyNpZm5kZWYgUFlNQUNDT05GSUdfSAorI2RlZmluZSBQWU1BQ0NPTkZJR19ICisgICAgIC8qCisgICAgICAqIFRoaXMgZmlsZSBtb3ZlcyBzb21lIG9mIHRoZSBhdXRvY29uZiBtYWdpYyB0byBjb21waWxlLXRpbWUKKyAgICAgICogd2hlbiBidWlsZGluZyBvbiBNYWNPU1guIFRoaXMgaXMgbmVlZGVkIGZvciBidWlsZGluZyA0LXdheQorICAgICAgKiB1bml2ZXJzYWwgYmluYXJpZXMgYW5kIGZvciA2NC1iaXQgdW5pdmVyc2FsIGJpbmFyaWVzIGJlY2F1c2UKKyAgICAgICogdGhlIHZhbHVlcyByZWRlZmluZWQgYmVsb3cgYXJlbid0IGNvbmZpZ3VyZS10aW1lIGNvbnN0YW50IGJ1dAorICAgICAgKiBvbmx5IGNvbXBpbGUtdGltZSBjb25zdGFudCBpbiB0aGVzZSBzY2VuYXJpb3MuCisgICAgICAqLworCisjaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyMgdW5kZWYgU0laRU9GX0xPTkcKKyMgdW5kZWYgU0laRU9GX1BUSFJFQURfVAorIyB1bmRlZiBTSVpFT0ZfU0laRV9UCisjIHVuZGVmIFNJWkVPRl9USU1FX1QKKyMgdW5kZWYgU0laRU9GX1ZPSURfUAorIyB1bmRlZiBTSVpFT0ZfX0JPT0wKKyMgdW5kZWYgU0laRU9GX1VJTlRQVFJfVAorIyB1bmRlZiBTSVpFT0ZfUFRIUkVBRF9UCisjIHVuZGVmIFdPUkRTX0JJR0VORElBTgorIyB1bmRlZiBET1VCTEVfSVNfQVJNX01JWEVEX0VORElBTl9JRUVFNzU0CisjIHVuZGVmIERPVUJMRV9JU19CSUdfRU5ESUFOX0lFRUU3NTQKKyMgdW5kZWYgRE9VQkxFX0lTX0xJVFRMRV9FTkRJQU5fSUVFRTc1NAorIyB1bmRlZiBIQVZFX0dDQ19BU01fRk9SX1g4NworCisjICAgIHVuZGVmIFZBX0xJU1RfSVNfQVJSQVkKKyMgICAgaWYgZGVmaW5lZChfX0xQNjRfXykgJiYgZGVmaW5lZChfX3g4Nl82NF9fKQorIyAgICAgICAgZGVmaW5lIFZBX0xJU1RfSVNfQVJSQVkgMQorIyAgICBlbmRpZgorCisjICAgIHVuZGVmIEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQKKyMgICAgaWZuZGVmIF9fTFA2NF9fCisjICAgICAgICAgZGVmaW5lIEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQgMQorIyAgICBlbmRpZgorCisjICAgIHVuZGVmIFNJWkVPRl9MT05HCisjICAgIGlmZGVmIF9fTFA2NF9fCisjICAgICAgICBkZWZpbmUgU0laRU9GX19CT09MICAgICAgICAgICAgMQorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9fQk9PTCAgICAgICAgICAgIDEKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfTE9ORyAgICAgICAgICAgICA4CisjICAgICAgICBkZWZpbmUgU0laRU9GX1BUSFJFQURfVCAgICAgICAgOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9TSVpFX1QgICAgICAgICAgIDgKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfVElNRV9UICAgICAgICAgICA4CisjICAgICAgICBkZWZpbmUgU0laRU9GX1ZPSURfUCAgICAgICAgICAgOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9VSU5UUFRSX1QgICAgICAgIDgKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfUFRIUkVBRF9UICAgICAgICA4CisjICAgIGVsc2UKKyMgICAgICAgIGlmZGVmIF9fcHBjX18KKyMgICAgICAgICAgIGRlZmluZSBTSVpFT0ZfX0JPT0wgICAgICAgICA0CisjICAgICAgICBlbHNlCisjICAgICAgICAgICBkZWZpbmUgU0laRU9GX19CT09MICAgICAgICAgMQorIyAgICAgICAgZW5kaWYKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfTE9ORyAgICAgICAgICAgICA0CisjICAgICAgICBkZWZpbmUgU0laRU9GX1BUSFJFQURfVCAgICAgICAgNAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9TSVpFX1QgICAgICAgICAgIDQKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfVElNRV9UICAgICAgICAgICA0CisjICAgICAgICBkZWZpbmUgU0laRU9GX1ZPSURfUCAgICAgICAgICAgNAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9VSU5UUFRSX1QgICAgICAgIDQKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfUFRIUkVBRF9UICAgICAgICA0CisjICAgIGVuZGlmCisKKyMgICAgaWYgZGVmaW5lZChfX0xQNjRfXykKKyAgICAgLyogTWFjT1NYIDEwLjQgKHRoZSBmaXJzdCByZWxlYXNlIHRvIHN1cHBvcnQgNjQtYml0IGNvZGUKKyAgICAgICogYXQgYWxsKSBvbmx5IHN1cHBvcnRzIDY0LWJpdCBpbiB0aGUgVU5JWCBsYXllci4KKyAgICAgICogVGhlcmVmb3JlIHN1cnByZXNzIHRoZSB0b29sYm94LWdsdWUgaW4gNjQtYml0IG1vZGUuCisgICAgICAqLworCisgICAgLyogSW4gNjQtYml0IG1vZGUgc2V0cGdycCBhbHdheXMgaGFzIG5vIGFyZ21lbnRzLCBpbiAzMi1iaXQKKyAgICAgKiBtb2RlIHRoYXQgZGVwZW5kcyBvbiB0aGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQKKyAgICAgKi8KKyMgICAgICAgdW5kZWYgU0VUUEdSUF9IQVZFX0FSRworCisjICAgIGVuZGlmCisKKyNpZmRlZiBfX0JJR19FTkRJQU5fXworI2RlZmluZSBXT1JEU19CSUdFTkRJQU4gMQorI2RlZmluZSBET1VCTEVfSVNfQklHX0VORElBTl9JRUVFNzU0CisjZWxzZQorI2RlZmluZSBET1VCTEVfSVNfTElUVExFX0VORElBTl9JRUVFNzU0CisjZW5kaWYgLyogX19CSUdfRU5ESUFOICovCisKKyNpZmRlZiBfX2kzODZfXworIyBkZWZpbmUgSEFWRV9HQ0NfQVNNX0ZPUl9YODcKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBUaGUgZGVmaW5pdGlvbiBpbiBweWNvbmZpZy5oIGlzIG9ubHkgdmFsaWQgb24gdGhlIE9TIHJlbGVhc2UKKyAgICAgKiB3aGVyZSBjb25maWd1cmUgcmFuIG9uIGFuZCBub3QgbmVjZXNzYXJpbHkgZm9yIGFsbCBzeXN0ZW1zIHdoZXJlCisgICAgICogdGhlIGV4ZWN1dGFibGUgY2FuIGJlIHVzZWQgb24uCisgICAgICoKKyAgICAgKiBTcGVjaWZpY2FsbHk6IE9TWCAxMC40IGhhcyBsaW1pdGVkIHN1cHBvcnRlZCBmb3IgJyV6ZCcsIHdoaWxlCisgICAgICogMTAuNSBoYXMgZnVsbCBzdXBwb3J0IGZvciAnJXpkJy4gQSBiaW5hcnkgYnVpbHQgb24gMTAuNSB3b24ndAorICAgICAqIHdvcmsgcHJvcGVybHkgb24gMTAuNCB1bmxlc3Mgd2Ugc3VycHJlc3MgdGhlIGRlZmluaXRpb24KKyAgICAgKiBvZiBQWV9GT1JNQVRfU0laRV9UCisgICAgICovCisjdW5kZWYgIFBZX0ZPUk1BVF9TSVpFX1QKKworCisjZW5kaWYgLyogZGVmaW5lZChfQVBQTEVfXykgKi8KKworI2VuZGlmIC8qIFBZTUFDQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3B5bWFjdG9vbGJveC5oIGIvaW5jbHVkZS9weXRob24yLjcvcHltYWN0b29sYm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxNTk3NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5bWFjdG9vbGJveC5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorKiogcHltYWN0b29sYm94LmggLSBnbG9iYWxzIGRlZmluZWQgaW4gbWFjdG9vbGJveGdsdWUuYworKi8KKyNpZm5kZWYgUHlfUFlNQUNUT09MQk9YX0gKKyNkZWZpbmUgUHlfUFlNQUNUT09MQk9YX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworCWV4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxDYXJib24vQ2FyYm9uLmg+CisKKyNpZm5kZWYgX19MUDY0X18KKyNpbmNsdWRlIDxRdWlja1RpbWUvUXVpY2tUaW1lLmg+CisjZW5kaWYgLyogIV9fTFA2NF9fICovCisKKy8qCisqKiBIZWxwZXIgcm91dGluZXMgZm9yIGVycm9yIGNvZGVzIGFuZCBzdWNoLgorKi8KK2NoYXIgKlB5TWFjX1N0ckVycm9yKGludCk7CQkJLyogc3RyZXJyb3Igd2l0aCBtYWMgZXJyb3JzICovCitleHRlcm4gUHlPYmplY3QgKlB5TWFjX09TRXJyRXhjZXB0aW9uOwkJLyogRXhjZXB0aW9uIGZvciBPU0VyciAqLworUHlPYmplY3QgKlB5TWFjX0dldE9TRXJyRXhjZXB0aW9uKHZvaWQpOwkvKiBJbml0aWFsaXplICYgcmV0dXJuIGl0ICovCitQeU9iamVjdCAqUHlFcnJfTWFjKFB5T2JqZWN0ICosIGludCk7CQkvKiBFeGNlcHRpb24gd2l0aCBhIG1hYyBlcnJvciAqLworUHlPYmplY3QgKlB5TWFjX0Vycm9yKE9TRXJyKTsJCQkvKiBVc2VzIFB5TWFjX0dldE9TRXJyRXhjZXB0aW9uICovCisjaWZuZGVmIF9fTFA2NF9fIAorZXh0ZXJuIE9TRXJyIFB5TWFjX0dldEZ1bGxQYXRobmFtZShGU1NwZWMgKiwgY2hhciAqLCBpbnQpOyAvKiBjb252ZXJ0CisJCQkJCQkJICAgICAgZnNzcGVjLT5wYXRoICovCisjZW5kaWYgLyogX19MUDY0X18gKi8KKworLyoKKyoqIFRoZXNlIGNvbnZlcnNpb24gcm91dGluZXMgYXJlIGRlZmluZWQgaW4gbWFjdG9vbGJveGdsdWUuYyBpdHNlbGYuCisqLworaW50IFB5TWFjX0dldE9TVHlwZShQeU9iamVjdCAqLCBPU1R5cGUgKik7CS8qIGFyZ3VtZW50IHBhcnNlciBmb3IgT1NUeXBlICovCitQeU9iamVjdCAqUHlNYWNfQnVpbGRPU1R5cGUoT1NUeXBlKTsJCS8qIENvbnZlcnQgT1NUeXBlIHRvIFB5T2JqZWN0ICovCisKK1B5T2JqZWN0ICpQeU1hY19CdWlsZE51bVZlcnNpb24oTnVtVmVyc2lvbik7LyogQ29udmVydCBOdW1WZXJzaW9uIHRvIFB5T2JqZWN0ICovCisKK2ludCBQeU1hY19HZXRTdHIyNTUoUHlPYmplY3QgKiwgU3RyMjU1KTsJLyogYXJndW1lbnQgcGFyc2VyIGZvciBTdHIyNTUgKi8KK1B5T2JqZWN0ICpQeU1hY19CdWlsZFN0cjI1NShTdHIyNTUpOwkJLyogQ29udmVydCBTdHIyNTUgdG8gUHlPYmplY3QgKi8KK1B5T2JqZWN0ICpQeU1hY19CdWlsZE9wdFN0cjI1NShTdHIyNTUpOwkJLyogQ29udmVydCBTdHIyNTUgdG8gUHlPYmplY3QsCisJCQkJCQkgICBOVUxMIHRvIE5vbmUgKi8KKworaW50IFB5TWFjX0dldFJlY3QoUHlPYmplY3QgKiwgUmVjdCAqKTsJCS8qIGFyZ3VtZW50IHBhcnNlciBmb3IgUmVjdCAqLworUHlPYmplY3QgKlB5TWFjX0J1aWxkUmVjdChSZWN0ICopOwkJLyogQ29udmVydCBSZWN0IHRvIFB5T2JqZWN0ICovCisKK2ludCBQeU1hY19HZXRQb2ludChQeU9iamVjdCAqLCBQb2ludCAqKTsJLyogYXJndW1lbnQgcGFyc2VyIGZvciBQb2ludCAqLworUHlPYmplY3QgKlB5TWFjX0J1aWxkUG9pbnQoUG9pbnQpOwkJLyogQ29udmVydCBQb2ludCB0byBQeU9iamVjdCAqLworCitpbnQgUHlNYWNfR2V0RXZlbnRSZWNvcmQoUHlPYmplY3QgKiwgRXZlbnRSZWNvcmQgKik7IC8qIGFyZ3VtZW50IHBhcnNlciBmb3IKKwkJCQkJCQlFdmVudFJlY29yZCAqLworUHlPYmplY3QgKlB5TWFjX0J1aWxkRXZlbnRSZWNvcmQoRXZlbnRSZWNvcmQgKik7IC8qIENvbnZlcnQgRXZlbnRSZWNvcmQgdG8KKwkJCQkJCSAgICBQeU9iamVjdCAqLworCitpbnQgUHlNYWNfR2V0Rml4ZWQoUHlPYmplY3QgKiwgRml4ZWQgKik7CS8qIGFyZ3VtZW50IHBhcnNlciBmb3IgRml4ZWQgKi8KK1B5T2JqZWN0ICpQeU1hY19CdWlsZEZpeGVkKEZpeGVkKTsJCS8qIENvbnZlcnQgRml4ZWQgdG8gUHlPYmplY3QgKi8KK2ludCBQeU1hY19HZXR3aWRlKFB5T2JqZWN0ICosIHdpZGUgKik7CQkvKiBhcmd1bWVudCBwYXJzZXIgZm9yIHdpZGUgKi8KK1B5T2JqZWN0ICpQeU1hY19CdWlsZHdpZGUod2lkZSAqKTsJCS8qIENvbnZlcnQgd2lkZSB0byBQeU9iamVjdCAqLworCisvKgorKiogVGhlIHJlc3Qgb2YgdGhlIHJvdXRpbmVzIGFyZSBpbXBsZW1lbnRlZCBieSBleHRlbnNpb24gbW9kdWxlcy4gSWYgdGhleSBhcmUKKyoqIGR5bmFtaWNhbGx5IGxvYWRlZCBtYWN0b29sYm94Z2x1ZSB3aWxsIGNvbnRhaW4gYSBzdHViIGltcGxlbWVudGF0aW9uIG9mIHRoZQorKiogcm91dGluZSwgd2hpY2ggaW1wb3J0cyB0aGUgbW9kdWxlLCB3aGVyZXVwb24gdGhlIG1vZHVsZSdzIGluaXQgcm91dGluZSB3aWxsCisqKiBjb21tdW5pY2F0ZSB0aGUgcm91dGluZSBwb2ludGVyIGJhY2sgdG8gdGhlIHN0dWIuCisqKiBJZiBVU0VfVE9PTEJPWF9PQkpFQ1RfR0xVRSBpcyBub3QgZGVmaW5lZCB0aGVyZSBpcyBubyBnbHVlIGNvZGUsIGFuZCB0aGUKKyoqIGV4dGVuc2lvbiBtb2R1bGVzIHNpbXBseSBkZWNsYXJlIHRoZSByb3V0aW5lLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBzdGF0aWMKKyoqIGJ1aWxkcyAoYW5kIGNvdWxkIGJlIHRoZSBjYXNlIGZvciBNYWNQeXRob24gQ0ZNIGJ1aWxkcywgYmVjYXVzZSBDRk0gZXh0ZW5zaW9uCisqKiBtb2R1bGVzIGNhbiByZWZlcmVuY2UgZWFjaCBvdGhlciB3aXRob3V0IHByb2JsZW1zKS4KKyovCisKKyNpZmRlZiBVU0VfVE9PTEJPWF9PQkpFQ1RfR0xVRQorLyoKKyoqIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCBpbiB0aGUgbW9kdWxlIGluaXQgY29kZS4gSWYgd2UgdXNlIHRvb2xib3ggb2JqZWN0IGdsdWUKKyoqIGl0IHNldHMgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhlIHJlYWwgZnVuY3Rpb24uCisqLworI2RlZmluZSBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhvYmplY3QsIHJ0bikgeyBcCisJZXh0ZXJuIFB5T2JqZWN0ICooKlB5TWFjR2x1ZVB0cl8jI3J0bikob2JqZWN0KTsgXAorCVB5TWFjR2x1ZVB0cl8jI3J0biA9IF8jI3J0bjsgXAorfQorI2RlZmluZSBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQob2JqZWN0LCBydG4pIHsgXAorCWV4dGVybiBpbnQgKCpQeU1hY0dsdWVQdHJfIyNydG4pKFB5T2JqZWN0ICosIG9iamVjdCAqKTsgXAorCVB5TWFjR2x1ZVB0cl8jI3J0biA9IF8jI3J0bjsgXAorfQorI2Vsc2UKKy8qCisqKiBJZiB3ZSBkb24ndCB1c2UgdG9vbGJveCBvYmplY3QgZ2x1ZSB0aGUgaW5pdCBtYWNyb3MgYXJlIGVtcHR5LiBNb3Jlb3Zlciwgd2UgZGVmaW5lCisqKiBfeHh4X05ldyB0byBiZSB0aGUgc2FtZSBhcyB4eHhfTmV3LCBhbmQgdGhlIGNvZGUgaW4gbWFjdG9vbGJveGdsdWUgaXNuJ3QgaW5jbHVkZWQuCisqLworI2RlZmluZSBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhvYmplY3QsIHJ0bikKKyNkZWZpbmUgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKG9iamVjdCwgcnRuKQorI2VuZGlmIC8qIFVTRV9UT09MQk9YX09CSkVDVF9HTFVFICovCisKKy8qIG1hY2ZzIGV4cG9ydHMgKi8KKyNpZm5kZWYgX19MUDY0X18KK2ludCBQeU1hY19HZXRGU1NwZWMoUHlPYmplY3QgKiwgRlNTcGVjICopOwkvKiBhcmd1bWVudCBwYXJzZXIgZm9yIEZTU3BlYyAqLworUHlPYmplY3QgKlB5TWFjX0J1aWxkRlNTcGVjKEZTU3BlYyAqKTsJCS8qIENvbnZlcnQgRlNTcGVjIHRvIFB5T2JqZWN0ICovCisjZW5kaWYgLyogIV9fTFA2NF9fICovCisKK2ludCBQeU1hY19HZXRGU1JlZihQeU9iamVjdCAqLCBGU1JlZiAqKTsJLyogYXJndW1lbnQgcGFyc2VyIGZvciBGU1JlZiAqLworUHlPYmplY3QgKlB5TWFjX0J1aWxkRlNSZWYoRlNSZWYgKik7CQkvKiBDb252ZXJ0IEZTUmVmIHRvIFB5T2JqZWN0ICovCisKKy8qIEFFIGV4cG9ydHMgKi8KK2V4dGVybiBQeU9iamVjdCAqQUVEZXNjX05ldyhBcHBsZUV2ZW50ICopOyAvKiBYWFhYIFdoeSBwYXNzZWQgYnkgYWRkcmVzcz8/ICovCitleHRlcm4gUHlPYmplY3QgKkFFRGVzY19OZXdCb3Jyb3dlZChBcHBsZUV2ZW50ICopOworZXh0ZXJuIGludCBBRURlc2NfQ29udmVydChQeU9iamVjdCAqLCBBcHBsZUV2ZW50ICopOworCisvKiBDbSBleHBvcnRzICovCitleHRlcm4gUHlPYmplY3QgKkNtcE9ial9OZXcoQ29tcG9uZW50KTsKK2V4dGVybiBpbnQgQ21wT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgQ29tcG9uZW50ICopOworZXh0ZXJuIFB5T2JqZWN0ICpDbXBJbnN0T2JqX05ldyhDb21wb25lbnRJbnN0YW5jZSk7CitleHRlcm4gaW50IENtcEluc3RPYmpfQ29udmVydChQeU9iamVjdCAqLCBDb21wb25lbnRJbnN0YW5jZSAqKTsKKworLyogQ3RsIGV4cG9ydHMgKi8KKyNpZm5kZWYgX19MUDY0X18KK2V4dGVybiBQeU9iamVjdCAqQ3RsT2JqX05ldyhDb250cm9sSGFuZGxlKTsKK2V4dGVybiBpbnQgQ3RsT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgQ29udHJvbEhhbmRsZSAqKTsKKyNlbmRpZiAvKiAhX19MUDY0X18gKi8KKworLyogRGxnIGV4cG9ydHMgKi8KKyNpZm5kZWYgX19MUDY0X18KK2V4dGVybiBQeU9iamVjdCAqRGxnT2JqX05ldyhEaWFsb2dQdHIpOworZXh0ZXJuIGludCBEbGdPYmpfQ29udmVydChQeU9iamVjdCAqLCBEaWFsb2dQdHIgKik7CitleHRlcm4gUHlPYmplY3QgKkRsZ09ial9XaGljaERpYWxvZyhEaWFsb2dQdHIpOworI2VuZGlmIC8qICFfX0xQNjRfXyAqLworCisvKiBEcmFnIGV4cG9ydHMgKi8KKyNpZm5kZWYgX19MUDY0X18KK2V4dGVybiBQeU9iamVjdCAqRHJhZ09ial9OZXcoRHJhZ1JlZmVyZW5jZSk7CitleHRlcm4gaW50IERyYWdPYmpfQ29udmVydChQeU9iamVjdCAqLCBEcmFnUmVmZXJlbmNlICopOworI2VuZGlmIC8qICFfX0xQNjRfXyAqLworCisvKiBMaXN0IGV4cG9ydHMgKi8KKyNpZm5kZWYgX19MUDY0X18KK2V4dGVybiBQeU9iamVjdCAqTGlzdE9ial9OZXcoTGlzdEhhbmRsZSk7CitleHRlcm4gaW50IExpc3RPYmpfQ29udmVydChQeU9iamVjdCAqLCBMaXN0SGFuZGxlICopOworI2VuZGlmIC8qICFfX0xQNjRfXyAqLworCisvKiBNZW51IGV4cG9ydHMgKi8KKyNpZm5kZWYgX19MUDY0X18KK2V4dGVybiBQeU9iamVjdCAqTWVudU9ial9OZXcoTWVudUhhbmRsZSk7CitleHRlcm4gaW50IE1lbnVPYmpfQ29udmVydChQeU9iamVjdCAqLCBNZW51SGFuZGxlICopOworI2VuZGlmIC8qICFfX0xQNjRfXyAqLworCisvKiBRZCBleHBvcnRzICovCisjaWZuZGVmIF9fTFA2NF9fCitleHRlcm4gUHlPYmplY3QgKkdyYWZPYmpfTmV3KEdyYWZQdHIpOworZXh0ZXJuIGludCBHcmFmT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgR3JhZlB0ciAqKTsKK2V4dGVybiBQeU9iamVjdCAqQk1PYmpfTmV3KEJpdE1hcFB0cik7CitleHRlcm4gaW50IEJNT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgQml0TWFwUHRyICopOworZXh0ZXJuIFB5T2JqZWN0ICpRZFJHQl9OZXcoUkdCQ29sb3IgKik7CitleHRlcm4gaW50IFFkUkdCX0NvbnZlcnQoUHlPYmplY3QgKiwgUkdCQ29sb3IgKik7CisjZW5kaWYgLyogIV9fTFA2NF9fICovCisKKy8qIFFkb2ZmcyBleHBvcnRzICovCisjaWZuZGVmIF9fTFA2NF9fCitleHRlcm4gUHlPYmplY3QgKkdXb3JsZE9ial9OZXcoR1dvcmxkUHRyKTsKK2V4dGVybiBpbnQgR1dvcmxkT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgR1dvcmxkUHRyICopOworI2VuZGlmIC8qICFfX0xQNjRfXyAqLworCisvKiBRdCBleHBvcnRzICovCisjaWZuZGVmIF9fTFA2NF9fCitleHRlcm4gUHlPYmplY3QgKlRyYWNrT2JqX05ldyhUcmFjayk7CitleHRlcm4gaW50IFRyYWNrT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgVHJhY2sgKik7CitleHRlcm4gUHlPYmplY3QgKk1vdmllT2JqX05ldyhNb3ZpZSk7CitleHRlcm4gaW50IE1vdmllT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgTW92aWUgKik7CitleHRlcm4gUHlPYmplY3QgKk1vdmllQ3RsT2JqX05ldyhNb3ZpZUNvbnRyb2xsZXIpOworZXh0ZXJuIGludCBNb3ZpZUN0bE9ial9Db252ZXJ0KFB5T2JqZWN0ICosIE1vdmllQ29udHJvbGxlciAqKTsKK2V4dGVybiBQeU9iamVjdCAqVGltZUJhc2VPYmpfTmV3KFRpbWVCYXNlKTsKK2V4dGVybiBpbnQgVGltZUJhc2VPYmpfQ29udmVydChQeU9iamVjdCAqLCBUaW1lQmFzZSAqKTsKK2V4dGVybiBQeU9iamVjdCAqVXNlckRhdGFPYmpfTmV3KFVzZXJEYXRhKTsKK2V4dGVybiBpbnQgVXNlckRhdGFPYmpfQ29udmVydChQeU9iamVjdCAqLCBVc2VyRGF0YSAqKTsKK2V4dGVybiBQeU9iamVjdCAqTWVkaWFPYmpfTmV3KE1lZGlhKTsKK2V4dGVybiBpbnQgTWVkaWFPYmpfQ29udmVydChQeU9iamVjdCAqLCBNZWRpYSAqKTsKKyNlbmRpZiAvKiAhX19MUDY0X18gKi8KKworLyogUmVzIGV4cG9ydHMgKi8KK2V4dGVybiBQeU9iamVjdCAqUmVzT2JqX05ldyhIYW5kbGUpOworZXh0ZXJuIGludCBSZXNPYmpfQ29udmVydChQeU9iamVjdCAqLCBIYW5kbGUgKik7CitleHRlcm4gUHlPYmplY3QgKk9wdFJlc09ial9OZXcoSGFuZGxlKTsKK2V4dGVybiBpbnQgT3B0UmVzT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgSGFuZGxlICopOworCisvKiBURSBleHBvcnRzICovCisjaWZuZGVmIF9fTFA2NF9fCitleHRlcm4gUHlPYmplY3QgKlRFT2JqX05ldyhURUhhbmRsZSk7CitleHRlcm4gaW50IFRFT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgVEVIYW5kbGUgKik7CisjZW5kaWYgLyogIV9fTFA2NF9fICovCisKKy8qIFdpbiBleHBvcnRzICovCisjaWZuZGVmIF9fTFA2NF9fCitleHRlcm4gUHlPYmplY3QgKldpbk9ial9OZXcoV2luZG93UHRyKTsKK2V4dGVybiBpbnQgV2luT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgV2luZG93UHRyICopOworZXh0ZXJuIFB5T2JqZWN0ICpXaW5PYmpfV2hpY2hXaW5kb3coV2luZG93UHRyKTsKKyNlbmRpZiAvKiAhX19MUDY0X18gKi8KKworLyogQ0YgZXhwb3J0cyAqLworZXh0ZXJuIFB5T2JqZWN0ICpDRk9ial9OZXcoQ0ZUeXBlUmVmKTsKK2V4dGVybiBpbnQgQ0ZPYmpfQ29udmVydChQeU9iamVjdCAqLCBDRlR5cGVSZWYgKik7CitleHRlcm4gUHlPYmplY3QgKkNGVHlwZVJlZk9ial9OZXcoQ0ZUeXBlUmVmKTsKK2V4dGVybiBpbnQgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgQ0ZUeXBlUmVmICopOworZXh0ZXJuIFB5T2JqZWN0ICpDRlN0cmluZ1JlZk9ial9OZXcoQ0ZTdHJpbmdSZWYpOworZXh0ZXJuIGludCBDRlN0cmluZ1JlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICosIENGU3RyaW5nUmVmICopOworZXh0ZXJuIFB5T2JqZWN0ICpDRk11dGFibGVTdHJpbmdSZWZPYmpfTmV3KENGTXV0YWJsZVN0cmluZ1JlZik7CitleHRlcm4gaW50IENGTXV0YWJsZVN0cmluZ1JlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICosIENGTXV0YWJsZVN0cmluZ1JlZiAqKTsKK2V4dGVybiBQeU9iamVjdCAqQ0ZBcnJheVJlZk9ial9OZXcoQ0ZBcnJheVJlZik7CitleHRlcm4gaW50IENGQXJyYXlSZWZPYmpfQ29udmVydChQeU9iamVjdCAqLCBDRkFycmF5UmVmICopOworZXh0ZXJuIFB5T2JqZWN0ICpDRk11dGFibGVBcnJheVJlZk9ial9OZXcoQ0ZNdXRhYmxlQXJyYXlSZWYpOworZXh0ZXJuIGludCBDRk11dGFibGVBcnJheVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICosIENGTXV0YWJsZUFycmF5UmVmICopOworZXh0ZXJuIFB5T2JqZWN0ICpDRkRpY3Rpb25hcnlSZWZPYmpfTmV3KENGRGljdGlvbmFyeVJlZik7CitleHRlcm4gaW50IENGRGljdGlvbmFyeVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICosIENGRGljdGlvbmFyeVJlZiAqKTsKK2V4dGVybiBQeU9iamVjdCAqQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9OZXcoQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZik7CitleHRlcm4gaW50IENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ29udmVydChQeU9iamVjdCAqLCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmICopOworZXh0ZXJuIFB5T2JqZWN0ICpDRlVSTFJlZk9ial9OZXcoQ0ZVUkxSZWYpOworZXh0ZXJuIGludCBDRlVSTFJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICosIENGVVJMUmVmICopOworZXh0ZXJuIGludCBPcHRpb25hbENGVVJMUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgQ0ZVUkxSZWYgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworCX0KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weW1hdGguaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5bWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZmQyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9weW1hdGguaApAQCAtMCwwICsxLDE5NCBAQAorI2lmbmRlZiBQeV9QWU1BVEhfSAorI2RlZmluZSBQeV9QWU1BVEhfSAorCisjaW5jbHVkZSAicHljb25maWcuaCIgLyogaW5jbHVkZSBmb3IgZGVmaW5lcyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1N5bWJvbHMgYW5kIG1hY3JvcyB0byBzdXBwbHkgcGxhdGZvcm0taW5kZXBlbmRlbnQgaW50ZXJmYWNlcyB0byBtYXRoZW1hdGljYWwKK2Z1bmN0aW9ucyBhbmQgY29uc3RhbnRzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogUHl0aG9uIHByb3ZpZGVzIGltcGxlbWVudGF0aW9ucyBmb3IgY29weXNpZ24sIHJvdW5kIGFuZCBoeXBvdCBpbgorICogUHl0aG9uL3B5bWF0aC5jIGp1c3QgaW4gY2FzZSB5b3VyIG1hdGggbGlicmFyeSBkb2Vzbid0IHByb3ZpZGUgdGhlCisgKiBmdW5jdGlvbnMuCisgKgorICpOb3RlOiBQQy9weWNvbmZpZy5oIGRlZmluZXMgY29weXNpZ24gYXMgX2NvcHlzaWduCisgKi8KKyNpZm5kZWYgSEFWRV9DT1BZU0lHTgorZXh0ZXJuIGRvdWJsZSBjb3B5c2lnbihkb3VibGUsIGRvdWJsZSk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1JPVU5ECitleHRlcm4gZG91YmxlIHJvdW5kKGRvdWJsZSk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0hZUE9UCitleHRlcm4gZG91YmxlIGh5cG90KGRvdWJsZSwgZG91YmxlKTsKKyNlbmRpZgorCisvKiBleHRyYSBkZWNsYXJhdGlvbnMgKi8KKyNpZm5kZWYgX01TQ19WRVIKKyNpZm5kZWYgX19TVERDX18KK2V4dGVybiBkb3VibGUgZm1vZCAoZG91YmxlLCBkb3VibGUpOworZXh0ZXJuIGRvdWJsZSBmcmV4cCAoZG91YmxlLCBpbnQgKik7CitleHRlcm4gZG91YmxlIGxkZXhwIChkb3VibGUsIGludCk7CitleHRlcm4gZG91YmxlIG1vZGYgKGRvdWJsZSwgZG91YmxlICopOworZXh0ZXJuIGRvdWJsZSBwb3coZG91YmxlLCBkb3VibGUpOworI2VuZGlmIC8qIF9fU1REQ19fICovCisjZW5kaWYgLyogX01TQ19WRVIgKi8KKworI2lmZGVmIF9PU0ZfU09VUkNFCisvKiBPU0YxIDUuMSBkb2Vzbid0IG1ha2UgdGhlc2UgYXZhaWxhYmxlIHdpdGggWE9QRU5fU09VUkNFX0VYVEVOREVEIGRlZmluZWQgKi8KK2V4dGVybiBpbnQgZmluaXRlKGRvdWJsZSk7CitleHRlcm4gZG91YmxlIGNvcHlzaWduKGRvdWJsZSwgZG91YmxlKTsKKyNlbmRpZgorCisvKiBIaWdoIHByZWNpc2lvbiBkZWZpbnRpb24gb2YgcGkgYW5kIGUgKEV1bGVyKQorICogVGhlIHZhbHVlcyBhcmUgdGFrZW4gZnJvbSBsaWJjNidzIG1hdGguaC4KKyAqLworI2lmbmRlZiBQeV9NQVRIX1BJbAorI2RlZmluZSBQeV9NQVRIX1BJbCAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTUwMjlMCisjZW5kaWYKKyNpZm5kZWYgUHlfTUFUSF9QSQorI2RlZmluZSBQeV9NQVRIX1BJIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorCisjaWZuZGVmIFB5X01BVEhfRWwKKyNkZWZpbmUgUHlfTUFUSF9FbCAyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MjVMCisjZW5kaWYKKworI2lmbmRlZiBQeV9NQVRIX0UKKyNkZWZpbmUgUHlfTUFUSF9FIDIuNzE4MjgxODI4NDU5MDQ1MjM1NAorI2VuZGlmCisKKy8qIE9uIHg4NiwgUHlfRk9SQ0VfRE9VQkxFIGZvcmNlcyBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBvdXQgb2YgYW4geDg3IEZQVQorICAgcmVnaXN0ZXIgYW5kIGludG8gYSA2NC1iaXQgbWVtb3J5IGxvY2F0aW9uLCByb3VuZGluZyBmcm9tIGV4dGVuZGVkCisgICBwcmVjaXNpb24gdG8gZG91YmxlIHByZWNpc2lvbiBpbiB0aGUgcHJvY2Vzcy4gIE9uIG90aGVyIHBsYXRmb3JtcyBpdCBkb2VzCisgICBub3RoaW5nLiAqLworCisvKiB3ZSB0YWtlIGRvdWJsZSByb3VuZGluZyBhcyBldmlkZW5jZSBvZiB4ODcgdXNhZ2UgKi8KKyNpZm5kZWYgUHlfRk9SQ0VfRE9VQkxFCisjICBpZmRlZiBYODdfRE9VQkxFX1JPVU5ESU5HCitQeUFQSV9GVU5DKGRvdWJsZSkgX1B5X2ZvcmNlX2RvdWJsZShkb3VibGUpOworIyAgICBkZWZpbmUgUHlfRk9SQ0VfRE9VQkxFKFgpIChfUHlfZm9yY2VfZG91YmxlKFgpKQorIyAgZWxzZQorIyAgICBkZWZpbmUgUHlfRk9SQ0VfRE9VQkxFKFgpIChYKQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9HQ0NfQVNNX0ZPUl9YODcKK1B5QVBJX0ZVTkModW5zaWduZWQgc2hvcnQpIF9QeV9nZXRfMzg3Y29udHJvbHdvcmQodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeV9zZXRfMzg3Y29udHJvbHdvcmQodW5zaWduZWQgc2hvcnQpOworI2VuZGlmCisKKy8qIFB5X0lTX05BTihYKQorICogUmV0dXJuIDEgaWYgZmxvYXQgb3IgZG91YmxlIGFyZyBpcyBhIE5hTiwgZWxzZSAwLgorICogQ2F1dGlvbjoKKyAqICAgICBYIGlzIGV2YWx1YXRlZCBtb3JlIHRoYW4gb25jZS4KKyAqICAgICBUaGlzIG1heSBub3Qgd29yayBvbiBhbGwgcGxhdGZvcm1zLiAgRWFjaCBwbGF0Zm9ybSBoYXMgKnNvbWUqCisgKiAgICAgd2F5IHRvIHNwZWxsIHRoaXMsIHRob3VnaCAtLSBvdmVycmlkZSBpbiBweWNvbmZpZy5oIGlmIHlvdSBoYXZlCisgKiAgICAgYSBwbGF0Zm9ybSB3aGVyZSBpdCBkb2Vzbid0IHdvcmsuCisgKiBOb3RlOiBQQy9weWNvbmZpZy5oIGRlZmluZXMgUHlfSVNfTkFOIGFzIF9pc25hbgorICovCisjaWZuZGVmIFB5X0lTX05BTgorI2lmIGRlZmluZWQgSEFWRV9ERUNMX0lTTkFOICYmIEhBVkVfREVDTF9JU05BTiA9PSAxCisjZGVmaW5lIFB5X0lTX05BTihYKSBpc25hbihYKQorI2Vsc2UKKyNkZWZpbmUgUHlfSVNfTkFOKFgpICgoWCkgIT0gKFgpKQorI2VuZGlmCisjZW5kaWYKKworLyogUHlfSVNfSU5GSU5JVFkoWCkKKyAqIFJldHVybiAxIGlmIGZsb2F0IG9yIGRvdWJsZSBhcmcgaXMgYW4gaW5maW5pdHksIGVsc2UgMC4KKyAqIENhdXRpb246CisgKiAgICBYIGlzIGV2YWx1YXRlZCBtb3JlIHRoYW4gb25jZS4KKyAqICAgIFRoaXMgaW1wbGVtZW50YXRpb24gbWF5IHNldCB0aGUgdW5kZXJmbG93IGZsYWcgaWYgfFh8IGlzIHZlcnkgc21hbGw7CisgKiAgICBpdCByZWFsbHkgY2FuJ3QgYmUgaW1wbGVtZW50ZWQgY29ycmVjdGx5ICgmIGVhc2lseSkgYmVmb3JlIEM5OS4KKyAqICAgIE92ZXJyaWRlIGluIHB5Y29uZmlnLmggaWYgeW91IGhhdmUgYSBiZXR0ZXIgc3BlbGxpbmcgb24geW91ciBwbGF0Zm9ybS4KKyAqICBQeV9GT1JDRV9ET1VCTEUgaXMgdXNlZCB0byBhdm9pZCBnZXR0aW5nIGZhbHNlIG5lZ2F0aXZlcyBmcm9tIGEKKyAqICAgIG5vbi1pbmZpbml0ZSB2YWx1ZSB2IHNpdHRpbmcgaW4gYW4gODAtYml0IHg4NyByZWdpc3RlciBzdWNoIHRoYXQKKyAqICAgIHYgYmVjb21lcyBpbmZpbml0ZSB3aGVuIHNwaWxsZWQgZnJvbSB0aGUgcmVnaXN0ZXIgdG8gNjQtYml0IG1lbW9yeS4KKyAqIE5vdGU6IFBDL3B5Y29uZmlnLmggZGVmaW5lcyBQeV9JU19JTkZJTklUWSBhcyBfaXNpbmYKKyAqIEZJWE1FOiBQQy9weWNvbmZpZy5oIGRlZmluZXMgUHlfSVNfSU5GSU5JVFkgYXMgKCFfZmluaXRlKFgpICYmICFfaXNuYW4oWCkpCisgKiBzbyB0aGF0IGFib3ZlIG5vdGUgaXNuJ3QgY29ycmVjdCAhISEKKyAqLworI2lmbmRlZiBQeV9JU19JTkZJTklUWQorIyAgaWYgZGVmaW5lZCBIQVZFX0RFQ0xfSVNJTkYgJiYgSEFWRV9ERUNMX0lTSU5GID09IDEKKyMgICAgZGVmaW5lIFB5X0lTX0lORklOSVRZKFgpIGlzaW5mKFgpCisjICBlbHNlCisjICAgIGRlZmluZSBQeV9JU19JTkZJTklUWShYKSAoKFgpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5X0ZPUkNFX0RPVUJMRShYKSowLjUgPT0gUHlfRk9SQ0VfRE9VQkxFKFgpKSkKKyMgIGVuZGlmCisjZW5kaWYKKworLyogUHlfSVNfRklOSVRFKFgpCisgKiBSZXR1cm4gMSBpZiBmbG9hdCBvciBkb3VibGUgYXJnIGlzIG5laXRoZXIgaW5maW5pdGUgbm9yIE5BTiwgZWxzZSAwLgorICogU29tZSBjb21waWxlcnMgKGUuZy4gVmlzdWFsU3R1ZGlvKSBoYXZlIGludHJpc2ljcyBmb3IgdGhpcywgc28gYSBzcGVjaWFsCisgKiBtYWNybyBmb3IgdGhpcyBwYXJ0aWN1bGFyIHRlc3QgaXMgdXNlZnVsCisgKiBOb3RlOiBQQy9weWNvbmZpZy5oIGRlZmluZXMgUHlfSVNfRklOSVRFIGFzIF9maW5pdGUKKyAqLworI2lmbmRlZiBQeV9JU19GSU5JVEUKKyNpZiBkZWZpbmVkIEhBVkVfREVDTF9JU0ZJTklURSAmJiBIQVZFX0RFQ0xfSVNGSU5JVEUgPT0gMQorI2RlZmluZSBQeV9JU19GSU5JVEUoWCkgaXNmaW5pdGUoWCkKKyNlbGlmIGRlZmluZWQgSEFWRV9GSU5JVEUKKyNkZWZpbmUgUHlfSVNfRklOSVRFKFgpIGZpbml0ZShYKQorI2Vsc2UKKyNkZWZpbmUgUHlfSVNfRklOSVRFKFgpICghUHlfSVNfSU5GSU5JVFkoWCkgJiYgIVB5X0lTX05BTihYKSkKKyNlbmRpZgorI2VuZGlmCisKKy8qIEhVR0VfVkFMIGlzIHN1cHBvc2VkIHRvIGV4cGFuZCB0byBhIHBvc2l0aXZlIGRvdWJsZSBpbmZpbml0eS4gIFB5dGhvbgorICogdXNlcyBQeV9IVUdFX1ZBTCBpbnN0ZWFkIGJlY2F1c2Ugc29tZSBwbGF0Zm9ybXMgYXJlIGJyb2tlbiBpbiB0aGlzCisgKiByZXNwZWN0LiAgV2UgdXNlZCB0byBlbWJlZCBjb2RlIGluIHB5cG9ydC5oIHRvIHRyeSB0byB3b3JtIGFyb3VuZCB0aGF0LAorICogYnV0IGRpZmZlcmVudCBwbGF0Zm9ybXMgYXJlIGJyb2tlbiBpbiBjb25mbGljdGluZyB3YXlzLiAgSWYgeW91J3JlIG9uCisgKiBhIHBsYXRmb3JtIHdoZXJlIEhVR0VfVkFMIGlzIGRlZmluZWQgaW5jb3JyZWN0bHksIGZpZGRsZSB5b3VyIFB5dGhvbgorICogY29uZmlnIHRvICNkZWZpbmUgUHlfSFVHRV9WQUwgdG8gc29tZXRoaW5nIHRoYXQgd29ya3Mgb24geW91ciBwbGF0Zm9ybS4KKyAqLworI2lmbmRlZiBQeV9IVUdFX1ZBTAorI2RlZmluZSBQeV9IVUdFX1ZBTCBIVUdFX1ZBTAorI2VuZGlmCisKKy8qIFB5X05BTgorICogQSB2YWx1ZSB0aGF0IGV2YWx1YXRlcyB0byBhIE5hTi4gT24gSUVFRSA3NTQgcGxhdGZvcm1zIElORiowIG9yCisgKiBJTkYvSU5GIHdvcmtzLiBEZWZpbmUgUHlfTk9fTkFOIGluIHB5Y29uZmlnLmggaWYgeW91ciBwbGF0Zm9ybQorICogZG9lc24ndCBzdXBwb3J0IE5hTnMuCisgKi8KKyNpZiAhZGVmaW5lZChQeV9OQU4pICYmICFkZWZpbmVkKFB5X05PX05BTikKKyNkZWZpbmUgUHlfTkFOIChQeV9IVUdFX1ZBTCAqIDAuKQorI2VuZGlmCisKKy8qIFB5X09WRVJGTE9XRUQoWCkKKyAqIFJldHVybiAxIGlmZiBhIGxpYm0gZnVuY3Rpb24gb3ZlcmZsb3dlZC4gIFNldCBlcnJubyB0byAwIGJlZm9yZSBjYWxsaW5nCisgKiBhIGxpYm0gZnVuY3Rpb24sIGFuZCBpbnZva2UgdGhpcyBtYWNybyBhZnRlciwgcGFzc2luZyB0aGUgZnVuY3Rpb24KKyAqIHJlc3VsdC4KKyAqIENhdXRpb246CisgKiAgICBUaGlzIGlzbid0IHJlbGlhYmxlLiAgQzk5IG5vIGxvbmdlciByZXF1aXJlcyBsaWJtIHRvIHNldCBlcnJubyB1bmRlcgorICoJICBhbnkgZXhjZXB0aW9uYWwgY29uZGl0aW9uLCBidXQgZG9lcyByZXF1aXJlICstIEhVR0VfVkFMIHJldHVybgorICoJICB2YWx1ZXMgb24gb3ZlcmZsb3cuICBBIDc1NCBib3ggKnByb2JhYmx5KiBtYXBzIEhVR0VfVkFMIHRvIGEKKyAqCSAgZG91YmxlIGluZmluaXR5LCBhbmQgd2UncmUgY29vbCBpZiB0aGF0J3Mgc28sIHVubGVzcyB0aGUgaW5wdXQKKyAqCSAgd2FzIGFuIGluZmluaXR5IGFuZCBhbiBpbmZpbml0eSBpcyB0aGUgZXhwZWN0ZWQgcmVzdWx0LiAgQSBDODkKKyAqCSAgc3lzdGVtIHNldHMgZXJybm8gdG8gRVJBTkdFLCBzbyB3ZSBjaGVjayBmb3IgdGhhdCB0b28uICBXZSdyZQorICoJICBvdXQgb2YgbHVjayBpZiBhIEM5OSA3NTQgYm94IGRvZXNuJ3QgbWFwIEhVR0VfVkFMIHRvICtJbmYsIG9yCisgKgkgIGlmIHRoZSByZXR1cm5lZCByZXN1bHQgaXMgYSBOYU4sIG9yIGlmIGEgQzg5IGJveCByZXR1cm5zIEhVR0VfVkFMCisgKgkgIGluIG5vbi1vdmVyZmxvdyBjYXNlcy4KKyAqICAgIFggaXMgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgorICogU29tZSBwbGF0Zm9ybXMgaGF2ZSBiZXR0ZXIgd2F5IHRvIHNwZWxsIHRoaXMsIHNvIGV4cGVjdCBzb21lICNpZmRlZidlcnkuCisgKgorICogT3BlbkJTRCB1c2VzICdpc2luZigpJyBiZWNhdXNlIGEgY29tcGlsZXIgYnVnIG9uIHRoYXQgcGxhdGZvcm0gY2F1c2VzCisgKiB0aGUgbG9uZ2VyIG1hY3JvIHZlcnNpb24gdG8gYmUgbWlzLWNvbXBpbGVkLiBUaGlzIGlzbid0IG9wdGltYWwsIGFuZAorICogc2hvdWxkIGJlIHJlbW92ZWQgb25jZSBhIG5ld2VyIGNvbXBpbGVyIGlzIGF2YWlsYWJsZSBvbiB0aGF0IHBsYXRmb3JtLgorICogVGhlIHN5c3RlbSB0aGF0IGhhZCB0aGUgZmFpbHVyZSB3YXMgcnVubmluZyBPcGVuQlNEIDMuMiBvbiBJbnRlbCwgd2l0aAorICogZ2NjIDIuOTUuMy4KKyAqCisgKiBBY2NvcmRpbmcgdG8gVGltJ3MgY2hlY2tpbiwgdGhlIEZyZWVCU0Qgc3lzdGVtcyB1c2UgaXNpbmYoKSB0byB3b3JrCisgKiBhcm91bmQgYSBGUEUgYnVnIG9uIHRoYXQgcGxhdGZvcm0uCisgKi8KKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKQorI2RlZmluZSBQeV9PVkVSRkxPV0VEKFgpIGlzaW5mKFgpCisjZWxzZQorI2RlZmluZSBQeV9PVkVSRkxPV0VEKFgpICgoWCkgIT0gMC4wICYmIChlcnJubyA9PSBFUkFOR0UgfHwgICAgXAorCQkJCQkgKFgpID09IFB5X0hVR0VfVkFMIHx8IFwKKwkJCQkJIChYKSA9PSAtUHlfSFVHRV9WQUwpKQorI2VuZGlmCisKKyNlbmRpZiAvKiBQeV9QWU1BVEhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHltZW0uaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5bWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiNWJlYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5bWVtLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qIFRoZSBQeU1lbV8gZmFtaWx5OiAgbG93LWxldmVsIG1lbW9yeSBhbGxvY2F0aW9uIGludGVyZmFjZXMuCisgICBTZWUgb2JqaW1wbC5oIGZvciB0aGUgUHlPYmplY3RfIG1lbW9yeSBmYW1pbHkuCisqLworCisjaWZuZGVmIFB5X1BZTUVNX0gKKyNkZWZpbmUgUHlfUFlNRU1fSAorCisjaW5jbHVkZSAicHlwb3J0LmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQkVXQVJFOgorCisgICBFYWNoIGludGVyZmFjZSBleHBvcnRzIGJvdGggZnVuY3Rpb25zIGFuZCBtYWNyb3MuICBFeHRlbnNpb24gbW9kdWxlcyBzaG91bGQKKyAgIHVzZSB0aGUgZnVuY3Rpb25zLCB0byBlbnN1cmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgYWNyb3NzIFB5dGhvbiB2ZXJzaW9ucy4KKyAgIEJlY2F1c2UgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIGNoYW5nZSBpbnRlcm5hbCBkZXRhaWxzLCBhbmQKKyAgIHRoZSBtYWNyb3MgbWF5IChvciBtYXkgbm90KSBleHBvc2UgZGV0YWlscyBmb3Igc3BlZWQsIGlmIHlvdSBkbyB1c2UgdGhlCisgICBtYWNyb3MgeW91IG11c3QgcmVjb21waWxlIHlvdXIgZXh0ZW5zaW9ucyB3aXRoIGVhY2ggUHl0aG9uIHJlbGVhc2UuCisKKyAgIE5ldmVyIG1peCBjYWxscyB0byBQeU1lbV8gd2l0aCBjYWxscyB0byB0aGUgcGxhdGZvcm0gbWFsbG9jL3JlYWxsb2MvCisgICBjYWxsb2MvZnJlZS4gIEZvciBleGFtcGxlLCBvbiBXaW5kb3dzIGRpZmZlcmVudCBETExzIG1heSBlbmQgdXAgdXNpbmcKKyAgIGRpZmZlcmVudCBoZWFwcywgYW5kIGlmIHlvdSB1c2UgUHlNZW1fTWFsbG9jIHlvdSdsbCBnZXQgdGhlIG1lbW9yeSBmcm9tIHRoZQorICAgaGVhcCB1c2VkIGJ5IHRoZSBQeXRob24gRExMOyBpdCBjb3VsZCBiZSBhIGRpc2FzdGVyIGlmIHlvdSBmcmVlKCknZWQgdGhhdAorICAgZGlyZWN0bHkgaW4geW91ciBvd24gZXh0ZW5zaW9uLiAgVXNpbmcgUHlNZW1fRnJlZSBpbnN0ZWFkIGVuc3VyZXMgUHl0aG9uCisgICBjYW4gcmV0dXJuIHRoZSBtZW1vcnkgdG8gdGhlIHByb3BlciBoZWFwLiAgQXMgYW5vdGhlciBleGFtcGxlLCBpbgorICAgUFlNQUxMT0NfREVCVUcgbW9kZSwgUHl0aG9uIHdyYXBzIGFsbCBjYWxscyB0byBhbGwgUHlNZW1fIGFuZCBQeU9iamVjdF8KKyAgIG1lbW9yeSBmdW5jdGlvbnMgaW4gc3BlY2lhbCBkZWJ1Z2dpbmcgd3JhcHBlcnMgdGhhdCBhZGQgYWRkaXRpb25hbAorICAgZGVidWdnaW5nIGluZm8gdG8gZHluYW1pYyBtZW1vcnkgYmxvY2tzLiAgVGhlIHN5c3RlbSByb3V0aW5lcyBoYXZlIG5vIGlkZWEKKyAgIHdoYXQgdG8gZG8gd2l0aCB0aGF0IHN0dWZmLCBhbmQgdGhlIFB5dGhvbiB3cmFwcGVycyBoYXZlIG5vIGlkZWEgd2hhdCB0byBkbworICAgd2l0aCByYXcgYmxvY2tzIG9idGFpbmVkIGRpcmVjdGx5IGJ5IHRoZSBzeXN0ZW0gcm91dGluZXMgdGhlbi4KKworICAgVGhlIEdJTCBtdXN0IGJlIGhlbGQgd2hlbiB1c2luZyB0aGVzZSBBUElzLgorKi8KKworLyoKKyAqIFJhdyBtZW1vcnkgaW50ZXJmYWNlCisgKiA9PT09PT09PT09PT09PT09PT09PQorICovCisKKy8qIEZ1bmN0aW9ucworCisgICBGdW5jdGlvbnMgc3VwcGx5aW5nIHBsYXRmb3JtLWluZGVwZW5kZW50IHNlbWFudGljcyBmb3IgbWFsbG9jL3JlYWxsb2MvCisgICBmcmVlLiAgVGhlc2UgZnVuY3Rpb25zIG1ha2Ugc3VyZSB0aGF0IGFsbG9jYXRpbmcgMCBieXRlcyByZXR1cm5zIGEgZGlzdGluY3QKKyAgIG5vbi1OVUxMIHBvaW50ZXIgKHdoZW5ldmVyIHBvc3NpYmxlIC0tIGlmIHdlJ3JlIGZsYXQgb3V0IG9mIG1lbW9yeSwgTlVMTAorICAgbWF5IGJlIHJldHVybmVkKSwgZXZlbiBpZiB0aGUgcGxhdGZvcm0gbWFsbG9jIGFuZCByZWFsbG9jIGRvbid0LgorICAgUmV0dXJuZWQgcG9pbnRlcnMgbXVzdCBiZSBjaGVja2VkIGZvciBOVUxMIGV4cGxpY2l0bHkuICBObyBhY3Rpb24gaXMKKyAgIHBlcmZvcm1lZCBvbiBmYWlsdXJlIChubyBleGNlcHRpb24gaXMgc2V0LCBubyB3YXJuaW5nIGlzIHByaW50ZWQsIGV0YykuCisqLworCitQeUFQSV9GVU5DKHZvaWQgKikgUHlNZW1fTWFsbG9jKHNpemVfdCk7CitQeUFQSV9GVU5DKHZvaWQgKikgUHlNZW1fUmVhbGxvYyh2b2lkICosIHNpemVfdCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5TWVtX0ZyZWUodm9pZCAqKTsKKworLyogU3RhcnRpbmcgZnJvbSBQeXRob24gMS42LCB0aGUgd3JhcHBlcnMgUHlfe01hbGxvYyxSZWFsbG9jLEZyZWV9IGFyZQorICAgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVGhleSB1c2VkIHRvIGNhbGwgUHlFcnJfTm9NZW1vcnkoKSBvbiBmYWlsdXJlLiAqLworCisvKiBNYWNyb3MuICovCisjaWZkZWYgUFlNQUxMT0NfREVCVUcKKy8qIFJlZGlyZWN0IGFsbCBtZW1vcnkgb3BlcmF0aW9ucyB0byBQeXRob24ncyBkZWJ1Z2dpbmcgYWxsb2NhdG9yLiAqLworI2RlZmluZSBQeU1lbV9NQUxMT0MJCV9QeU1lbV9EZWJ1Z01hbGxvYworI2RlZmluZSBQeU1lbV9SRUFMTE9DCQlfUHlNZW1fRGVidWdSZWFsbG9jCisjZGVmaW5lIFB5TWVtX0ZSRUUJCV9QeU1lbV9EZWJ1Z0ZyZWUKKworI2Vsc2UJLyogISBQWU1BTExPQ19ERUJVRyAqLworCisvKiBQeU1lbV9NQUxMT0MoMCkgbWVhbnMgbWFsbG9jKDEpLiBTb21lIHN5c3RlbXMgd291bGQgcmV0dXJuIE5VTEwKKyAgIGZvciBtYWxsb2MoMCksIHdoaWNoIHdvdWxkIGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IuIFNvbWUgcGxhdGZvcm1zCisgICB3b3VsZCByZXR1cm4gYSBwb2ludGVyIHdpdGggbm8gbWVtb3J5IGJlaGluZCBpdCwgd2hpY2ggd291bGQgYnJlYWsKKyAgIHB5bWFsbG9jLiBUbyBzb2x2ZSB0aGVzZSBwcm9ibGVtcywgYWxsb2NhdGUgYW4gZXh0cmEgYnl0ZS4gKi8KKy8qIFJldHVybnMgTlVMTCB0byBpbmRpY2F0ZSBlcnJvciBpZiBhIG5lZ2F0aXZlIHNpemUgb3Igc2l6ZSBsYXJnZXIgdGhhbgorICAgUHlfc3NpemVfdCBjYW4gcmVwcmVzZW50IGlzIHN1cHBsaWVkLiAgSGVscHMgcHJldmVudHMgc2VjdXJpdHkgaG9sZXMuICovCisjZGVmaW5lIFB5TWVtX01BTExPQyhuKQkJKChzaXplX3QpKG4pID4gKHNpemVfdClQWV9TU0laRV9UX01BWCA/IE5VTEwgXAorCQkJCTogbWFsbG9jKChuKSA/IChuKSA6IDEpKQorI2RlZmluZSBQeU1lbV9SRUFMTE9DKHAsIG4pCSgoc2l6ZV90KShuKSA+IChzaXplX3QpUFlfU1NJWkVfVF9NQVggID8gTlVMTCBcCisJCQkJOiByZWFsbG9jKChwKSwgKG4pID8gKG4pIDogMSkpCisjZGVmaW5lIFB5TWVtX0ZSRUUJCWZyZWUKKworI2VuZGlmCS8qIFBZTUFMTE9DX0RFQlVHICovCisKKy8qCisgKiBUeXBlLW9yaWVudGVkIG1lbW9yeSBpbnRlcmZhY2UKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgbiBvYmplY3RzIG9mIHRoZSBnaXZlbiB0eXBlLiAgUmV0dXJucyBhIG5ldyBwb2ludGVyCisgKiBvciBOVUxMIGlmIHRoZSByZXF1ZXN0IHdhcyB0b28gbGFyZ2Ugb3IgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAgVXNlCisgKiB0aGVzZSBtYWNyb3MgcmF0aGVyIHRoYW4gZG9pbmcgdGhlIG11bHRpcGxpY2F0aW9uIHlvdXJzZWxmIHNvIHRoYXQgcHJvcGVyCisgKiBvdmVyZmxvdyBjaGVja2luZyBpcyBhbHdheXMgZG9uZS4KKyAqLworCisjZGVmaW5lIFB5TWVtX05ldyh0eXBlLCBuKSBcCisgICggKChzaXplX3QpKG4pID4gUFlfU1NJWkVfVF9NQVggLyBzaXplb2YodHlwZSkpID8gTlVMTCA6CVwKKwkoICh0eXBlICopIFB5TWVtX01hbGxvYygobikgKiBzaXplb2YodHlwZSkpICkgKQorI2RlZmluZSBQeU1lbV9ORVcodHlwZSwgbikgXAorICAoICgoc2l6ZV90KShuKSA+IFBZX1NTSVpFX1RfTUFYIC8gc2l6ZW9mKHR5cGUpKSA/IE5VTEwgOglcCisJKCAodHlwZSAqKSBQeU1lbV9NQUxMT0MoKG4pICogc2l6ZW9mKHR5cGUpKSApICkKKworLyoKKyAqIFRoZSB2YWx1ZSBvZiAocCkgaXMgYWx3YXlzIGNsb2JiZXJlZCBieSB0aGlzIG1hY3JvIHJlZ2FyZGxlc3Mgb2Ygc3VjY2Vzcy4KKyAqIFRoZSBjYWxsZXIgTVVTVCBjaGVjayBpZiAocCkgaXMgTlVMTCBhZnRlcndhcmRzIGFuZCBkZWFsIHdpdGggdGhlIG1lbW9yeQorICogZXJyb3IgaWYgc28uICBUaGlzIG1lYW5zIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAocCkgTVVTVCBiZSBzYXZlZCBmb3IgdGhlCisgKiBjYWxsZXIncyBtZW1vcnkgZXJyb3IgaGFuZGxlciB0byBub3QgbG9zZSB0cmFjayBvZiBpdC4KKyAqLworI2RlZmluZSBQeU1lbV9SZXNpemUocCwgdHlwZSwgbikgXAorICAoIChwKSA9ICgoc2l6ZV90KShuKSA+IFBZX1NTSVpFX1RfTUFYIC8gc2l6ZW9mKHR5cGUpKSA/IE5VTEwgOglcCisJKHR5cGUgKikgUHlNZW1fUmVhbGxvYygocCksIChuKSAqIHNpemVvZih0eXBlKSkgKQorI2RlZmluZSBQeU1lbV9SRVNJWkUocCwgdHlwZSwgbikgXAorICAoIChwKSA9ICgoc2l6ZV90KShuKSA+IFBZX1NTSVpFX1RfTUFYIC8gc2l6ZW9mKHR5cGUpKSA/IE5VTEwgOglcCisJKHR5cGUgKikgUHlNZW1fUkVBTExPQygocCksIChuKSAqIHNpemVvZih0eXBlKSkgKQorCisvKiBQeU1lbXtEZWwsREVMfSBhcmUgbGVmdCBvdmVyIGZyb20gYW5jaWVudCBkYXlzLCBhbmQgc2hvdWxkbid0IGJlIHVzZWQKKyAqIGFueW1vcmUuICBUaGV5J3JlIGp1c3QgY29uZnVzaW5nIGFsaWFzZXMgZm9yIFB5TWVtX3tGcmVlLEZSRUV9IG5vdy4KKyAqLworI2RlZmluZSBQeU1lbV9EZWwJCVB5TWVtX0ZyZWUKKyNkZWZpbmUgUHlNZW1fREVMCQlQeU1lbV9GUkVFCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhUHlfUFlNRU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHlwb3J0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9weXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTY0NzQwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHlwb3J0LmgKQEAgLTAsMCArMSwxMDg0IEBACisjaWZuZGVmIFB5X1BZUE9SVF9ICisjZGVmaW5lIFB5X1BZUE9SVF9ICisKKyNpbmNsdWRlICJweWNvbmZpZy5oIiAvKiBpbmNsdWRlIGZvciBkZWZpbmVzICovCisKKy8qIFNvbWUgdmVyc2lvbnMgb2YgSFAtVVggJiBTb2xhcmlzIG5lZWQgaW50dHlwZXMuaCBmb3IgaW50MzJfdCwKKyAgIElOVDMyX01BWCwgZXRjLiAqLworI2lmZGVmIEhBVkVfSU5UVFlQRVNfSAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1RESU5UX0gKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1N5bWJvbHMgYW5kIG1hY3JvcyB0byBzdXBwbHkgcGxhdGZvcm0taW5kZXBlbmRlbnQgaW50ZXJmYWNlcyB0byBiYXNpYworQyBsYW5ndWFnZSAmIGxpYnJhcnkgb3BlcmF0aW9ucyB3aG9zZSBzcGVsbGluZ3MgdmFyeSBhY3Jvc3MgcGxhdGZvcm1zLgorCitQbGVhc2UgdHJ5IHRvIG1ha2UgZG9jdW1lbnRhdGlvbiBoZXJlIGFzIGNsZWFyIGFzIHBvc3NpYmxlOiAgYnkgZGVmaW5pdGlvbiwKK3RoZSBzdHVmZiBoZXJlIGlzIHRyeWluZyB0byBpbGx1bWluYXRlIEMncyBkYXJrZXN0IGNvcm5lcnMuCisKK0NvbmZpZyAjZGVmaW5lcyByZWZlcmVuY2VkIGhlcmU6CisKK1NJR05FRF9SSUdIVF9TSElGVF9aRVJPX0ZJTExTCitNZWFuaW5nOiAgVG8gYmUgZGVmaW5lZCBpZmYgaT4+aiBkb2VzIG5vdCBleHRlbmQgdGhlIHNpZ24gYml0IHdoZW4gaSBpcyBhCisgICAgICAgICAgc2lnbmVkIGludGVncmFsIHR5cGUgYW5kIGkgPCAwLgorVXNlZCBpbjogIFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQKKworUHlfREVCVUcKK01lYW5pbmc6ICBFeHRyYSBjaGVja3MgY29tcGlsZWQgaW4gZm9yIGRlYnVnIG1vZGUuCitVc2VkIGluOiAgUHlfU0FGRV9ET1dOQ0FTVAorCitIQVZFX1VJTlRQVFJfVAorTWVhbmluZzogIFRoZSBDOVggdHlwZSB1aW50cHRyX3QgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjb21waWxlcgorVXNlZCBpbjogIFB5X3VpbnRwdHJfdAorCitIQVZFX0xPTkdfTE9ORworTWVhbmluZzogIFRoZSBjb21waWxlciBzdXBwb3J0cyB0aGUgQyB0eXBlICJsb25nIGxvbmciCitVc2VkIGluOiAgUFlfTE9OR19MT05HCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkuIE9ic29sZXRlLCBkbyBub3QgdXNlLiAqLworI2lmZGVmIEhBVkVfUFJPVE9UWVBFUworI2RlZmluZSBQeV9QUk9UTyh4KSB4CisjZWxzZQorI2RlZmluZSBQeV9QUk9UTyh4KSAoKQorI2VuZGlmCisjaWZuZGVmIFB5X0ZQUk9UTworI2RlZmluZSBQeV9GUFJPVE8oeCkgUHlfUFJPVE8oeCkKKyNlbmRpZgorCisvKiB0eXBlZGVmcyBmb3Igc29tZSBDOVgtZGVmaW5lZCBzeW5vbnltcyBmb3IgaW50ZWdyYWwgdHlwZXMuCisgKgorICogVGhlIG5hbWVzIGluIFB5dGhvbiBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgQzlYIG5hbWVzLCBleGNlcHQgd2l0aCBhCisgKiBQeV8gcHJlZml4LiAgVW50aWwgQzlYIGlzIHVuaXZlcnNhbGx5IGltcGxlbWVudGVkLCB0aGlzIGlzIHRoZSBvbmx5IHdheQorICogdG8gZW5zdXJlIHRoYXQgUHl0aG9uIGdldHMgcmVsaWFibGUgbmFtZXMgdGhhdCBkb24ndCBjb25mbGljdCB3aXRoIG5hbWVzCisgKiBpbiBub24tUHl0aG9uIGNvZGUgdGhhdCBhcmUgcGxheWluZyB0aGVpciBvd24gdHJpY2tzIHRvIGRlZmluZSB0aGUgQzlYCisgKiBuYW1lcy4KKyAqCisgKiBOT1RFOiBkb24ndCBnbyBudXRzIGhlcmUhICBQeXRob24gaGFzIG5vIHVzZSBmb3IgKm1vc3QqIG9mIHRoZSBDOVgKKyAqIGludGVncmFsIHN5bm9ueW1zLiAgT25seSBkZWZpbmUgdGhlIG9uZXMgd2UgYWN0dWFsbHkgbmVlZC4KKyAqLworCisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyNpZm5kZWYgUFlfTE9OR19MT05HCisjZGVmaW5lIFBZX0xPTkdfTE9ORyBsb25nIGxvbmcKKyNpZiBkZWZpbmVkKExMT05HX01BWCkKKy8qIElmIExMT05HX01BWCBpcyBkZWZpbmVkIGluIGxpbWl0cy5oLCB1c2UgdGhhdC4gKi8KKyNkZWZpbmUgUFlfTExPTkdfTUlOIExMT05HX01JTgorI2RlZmluZSBQWV9MTE9OR19NQVggTExPTkdfTUFYCisjZGVmaW5lIFBZX1VMTE9OR19NQVggVUxMT05HX01BWAorI2VsaWYgZGVmaW5lZChfX0xPTkdfTE9OR19NQVhfXykKKy8qIE90aGVyd2lzZSwgaWYgR0NDIGhhcyBhIGJ1aWx0aW4gZGVmaW5lLCB1c2UgdGhhdC4gKi8KKyNkZWZpbmUgUFlfTExPTkdfTUFYIF9fTE9OR19MT05HX01BWF9fCisjZGVmaW5lIFBZX0xMT05HX01JTiAoLVBZX0xMT05HX01BWC0xKQorI2RlZmluZSBQWV9VTExPTkdfTUFYIChfX0xPTkdfTE9OR19NQVhfXyoyVUxMICsgMVVMTCkKKyNlbHNlCisvKiBPdGhlcndpc2UsIHJlbHkgb24gdHdvJ3MgY29tcGxlbWVudC4gKi8KKyNkZWZpbmUgUFlfVUxMT05HX01BWCAofjBVTEwpCisjZGVmaW5lIFBZX0xMT05HX01BWCAgKChsb25nIGxvbmcpKFBZX1VMTE9OR19NQVg+PjEpKQorI2RlZmluZSBQWV9MTE9OR19NSU4gKC1QWV9MTE9OR19NQVgtMSkKKyNlbmRpZiAvKiBMTE9OR19NQVggKi8KKyNlbmRpZgorI2VuZGlmIC8qIEhBVkVfTE9OR19MT05HICovCisKKy8qIGEgYnVpbGQgd2l0aCAzMC1iaXQgZGlnaXRzIGZvciBQeXRob24gbG9uZyBpbnRlZ2VycyBuZWVkcyBhbiBleGFjdC13aWR0aAorICogMzItYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZSB0byBzdG9yZSB0aG9zZSBkaWdpdHMuICAoV2UgY291bGQganVzdCB1c2UKKyAqIHR5cGUgJ3Vuc2lnbmVkIGxvbmcnLCBidXQgdGhhdCB3b3VsZCBiZSB3YXN0ZWZ1bCBvbiBhIHN5c3RlbSB3aGVyZSBsb25ncworICogYXJlIDY0LWJpdHMuKSAgT24gVW5peCBzeXN0ZW1zLCB0aGUgYXV0b2NvbmYgbWFjcm8gQUNfVFlQRV9VSU5UMzJfVCBkZWZpbmVzCisgKiB1aW50MzJfdCB0byBiZSBzdWNoIGEgdHlwZSB1bmxlc3Mgc3RkaW50Lmggb3IgaW50dHlwZXMuaCBkZWZpbmVzIHVpbnQzMl90LgorICogSG93ZXZlciwgaXQgZG9lc24ndCBzZXQgSEFWRV9VSU5UMzJfVCwgc28gd2UgZG8gdGhhdCBoZXJlLgorICovCisjaWZkZWYgdWludDMyX3QKKyNkZWZpbmUgSEFWRV9VSU5UMzJfVCAxCisjZW5kaWYKKworI2lmZGVmIEhBVkVfVUlOVDMyX1QKKyNpZm5kZWYgUFlfVUlOVDMyX1QKKyNkZWZpbmUgUFlfVUlOVDMyX1QgdWludDMyX3QKKyNlbmRpZgorI2VuZGlmCisKKy8qIE1hY3JvcyBmb3IgYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlOyB1c2VkIGZvciB0eXBlICd0d29kaWdpdHMnIGluIHRoZQorICogbG9uZyBpbnRlZ2VyIGltcGxlbWVudGF0aW9uLCB3aGVuIDMwLWJpdCBkaWdpdHMgYXJlIGVuYWJsZWQuCisgKi8KKyNpZmRlZiB1aW50NjRfdAorI2RlZmluZSBIQVZFX1VJTlQ2NF9UIDEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VSU5UNjRfVAorI2lmbmRlZiBQWV9VSU5UNjRfVAorI2RlZmluZSBQWV9VSU5UNjRfVCB1aW50NjRfdAorI2VuZGlmCisjZW5kaWYKKworLyogU2lnbmVkIHZhcmlhbnRzIG9mIHRoZSBhYm92ZSAqLworI2lmZGVmIGludDMyX3QKKyNkZWZpbmUgSEFWRV9JTlQzMl9UIDEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9JTlQzMl9UCisjaWZuZGVmIFBZX0lOVDMyX1QKKyNkZWZpbmUgUFlfSU5UMzJfVCBpbnQzMl90CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgaW50NjRfdAorI2RlZmluZSBIQVZFX0lOVDY0X1QgMQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lOVDY0X1QKKyNpZm5kZWYgUFlfSU5UNjRfVAorI2RlZmluZSBQWV9JTlQ2NF9UIGludDY0X3QKKyNlbmRpZgorI2VuZGlmCisKKy8qIElmIFBZTE9OR19CSVRTX0lOX0RJR0lUIGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UnbGwgdXNlIDMwLWJpdCBkaWdpdHMgaWYgYWxsCisgICB0aGUgbmVjZXNzYXJ5IGludGVnZXIgdHlwZXMgYXJlIGF2YWlsYWJsZSwgYW5kIHdlJ3JlIG9uIGEgNjQtYml0IHBsYXRmb3JtCisgICAoYXMgZGV0ZXJtaW5lZCBieSBTSVpFT0ZfVk9JRF9QKTsgb3RoZXJ3aXNlIHdlIHVzZSAxNS1iaXQgZGlnaXRzLiAqLworCisjaWZuZGVmIFBZTE9OR19CSVRTX0lOX0RJR0lUCisjaWYgKGRlZmluZWQgSEFWRV9VSU5UNjRfVCAmJiBkZWZpbmVkIEhBVkVfSU5UNjRfVCAmJiBcCisgICAgIGRlZmluZWQgSEFWRV9VSU5UMzJfVCAmJiBkZWZpbmVkIEhBVkVfSU5UMzJfVCAmJiBTSVpFT0ZfVk9JRF9QID49IDgpCisjZGVmaW5lIFBZTE9OR19CSVRTX0lOX0RJR0lUIDMwCisjZWxzZQorI2RlZmluZSBQWUxPTkdfQklUU19JTl9ESUdJVCAxNQorI2VuZGlmCisjZW5kaWYKKworLyogdWludHB0cl90IGlzIHRoZSBDOVggbmFtZSBmb3IgYW4gdW5zaWduZWQgaW50ZWdyYWwgdHlwZSBzdWNoIHRoYXQgYQorICogbGVnaXRpbWF0ZSB2b2lkKiBjYW4gYmUgY2FzdCB0byB1aW50cHRyX3QgYW5kIHRoZW4gYmFjayB0byB2b2lkKiBhZ2FpbgorICogd2l0aG91dCBsb3NzIG9mIGluZm9ybWF0aW9uLiAgU2ltaWxhcmx5IGZvciBpbnRwdHJfdCwgd3J0IGEgc2lnbmVkCisgKiBpbnRlZ3JhbCB0eXBlLgorICovCisjaWZkZWYgSEFWRV9VSU5UUFRSX1QKK3R5cGVkZWYgdWludHB0cl90ICAgICAgIFB5X3VpbnRwdHJfdDsKK3R5cGVkZWYgaW50cHRyX3QgICAgICAgIFB5X2ludHB0cl90OworCisjZWxpZiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9JTlQKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIFB5X3VpbnRwdHJfdDsKK3R5cGVkZWYgaW50ICAgICAgICAgICAgIFB5X2ludHB0cl90OworCisjZWxpZiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBQeV91aW50cHRyX3Q7Cit0eXBlZGVmIGxvbmcgICAgICAgICAgICBQeV9pbnRwdHJfdDsKKworI2VsaWYgZGVmaW5lZChIQVZFX0xPTkdfTE9ORykgJiYgKFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkdfTE9ORykKK3R5cGVkZWYgdW5zaWduZWQgUFlfTE9OR19MT05HICAgUHlfdWludHB0cl90OwordHlwZWRlZiBQWV9MT05HX0xPTkcgICAgICAgICAgICBQeV9pbnRwdHJfdDsKKworI2Vsc2UKKyMgICBlcnJvciAiUHl0aG9uIG5lZWRzIGEgdHlwZWRlZiBmb3IgUHlfdWludHB0cl90IGluIHB5cG9ydC5oLiIKKyNlbmRpZiAvKiBIQVZFX1VJTlRQVFJfVCAqLworCisvKiBQeV9zc2l6ZV90IGlzIGEgc2lnbmVkIGludGVncmFsIHR5cGUgc3VjaCB0aGF0IHNpemVvZihQeV9zc2l6ZV90KSA9PQorICogc2l6ZW9mKHNpemVfdCkuICBDOTkgZG9lc24ndCBkZWZpbmUgc3VjaCBhIHRoaW5nIGRpcmVjdGx5IChzaXplX3QgaXMgYW4KKyAqIHVuc2lnbmVkIGludGVncmFsIHR5cGUpLiAgU2VlIFBFUCAzNTMgZm9yIGRldGFpbHMuCisgKi8KKyNpZmRlZiBIQVZFX1NTSVpFX1QKK3R5cGVkZWYgc3NpemVfdCAgICAgICAgIFB5X3NzaXplX3Q7CisjZWxpZiBTSVpFT0ZfVk9JRF9QID09IFNJWkVPRl9TSVpFX1QKK3R5cGVkZWYgUHlfaW50cHRyX3QgICAgIFB5X3NzaXplX3Q7CisjZWxzZQorIyAgIGVycm9yICJQeXRob24gbmVlZHMgYSB0eXBlZGVmIGZvciBQeV9zc2l6ZV90IGluIHB5cG9ydC5oLiIKKyNlbmRpZgorCisvKiBMYXJnZXN0IHBvc3NpYmxlIHZhbHVlIG9mIHNpemVfdC4KKyAgIFNJWkVfTUFYIGlzIHBhcnQgb2YgQzk5LCBzbyBpdCBtaWdodCBiZSBkZWZpbmVkIG9uIHNvbWUKKyAgIHBsYXRmb3Jtcy4gSWYgaXQgaXMgbm90IGRlZmluZWQsIChzaXplX3QpLTEgaXMgYSBwb3J0YWJsZQorICAgZGVmaW5pdGlvbiBmb3IgQzg5LCBkdWUgdG8gdGhlIHdheSBzaWduZWQtPnVuc2lnbmVkCisgICBjb252ZXJzaW9uIGlzIGRlZmluZWQuICovCisjaWZkZWYgU0laRV9NQVgKKyNkZWZpbmUgUFlfU0laRV9NQVggU0laRV9NQVgKKyNlbHNlCisjZGVmaW5lIFBZX1NJWkVfTUFYICgoc2l6ZV90KS0xKQorI2VuZGlmCisKKy8qIExhcmdlc3QgcG9zaXRpdmUgdmFsdWUgb2YgdHlwZSBQeV9zc2l6ZV90LiAqLworI2RlZmluZSBQWV9TU0laRV9UX01BWCAoKFB5X3NzaXplX3QpKCgoc2l6ZV90KS0xKT4+MSkpCisvKiBTbWFsbGVzdCBuZWdhdGl2ZSB2YWx1ZSBvZiB0eXBlIFB5X3NzaXplX3QuICovCisjZGVmaW5lIFBZX1NTSVpFX1RfTUlOICgtUFlfU1NJWkVfVF9NQVgtMSkKKworLyoKKyNpZiBTSVpFT0ZfUElEX1QgPiBTSVpFT0ZfTE9ORworIyAgIGVycm9yICJQeXRob24gZG9lc24ndCBzdXBwb3J0IHNpemVvZihwaWRfdCkgPiBzaXplb2YobG9uZykiCisjZW5kaWYKKyovCisKKy8qIFBZX0ZPUk1BVF9TSVpFX1QgaXMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBtb2RpZmllciBmb3IgdXNlIGluIGEgcHJpbnRmCisgKiBmb3JtYXQgdG8gY29udmVydCBhbiBhcmd1bWVudCB3aXRoIHRoZSB3aWR0aCBvZiBhIHNpemVfdCBvciBQeV9zc2l6ZV90LgorICogQzk5IGludHJvZHVjZWQgInoiIGZvciB0aGlzIHB1cnBvc2UsIGJ1dCBub3QgYWxsIHBsYXRmb3JtcyBzdXBwb3J0IHRoYXQ7CisgKiBlLmcuLCBNUyBjb21waWxlcnMgdXNlICJJIiBpbnN0ZWFkLgorICoKKyAqIFRoZXNlICJoaWdoIGxldmVsIiBQeXRob24gZm9ybWF0IGZ1bmN0aW9ucyBpbnRlcnByZXQgInoiIGNvcnJlY3RseSBvbgorICogYWxsIHBsYXRmb3JtcyAoUHl0aG9uIGludGVycHJldHMgdGhlIGZvcm1hdCBzdHJpbmcgaXRzZWxmLCBhbmQgZG9lcyB3aGF0ZXZlcgorICogdGhlIHBsYXRmb3JtIEMgcmVxdWlyZXMgdG8gY29udmVydCBhIHNpemVfdC9QeV9zc2l6ZV90IGFyZ3VtZW50KToKKyAqCisgKiAgICAgUHlTdHJpbmdfRnJvbUZvcm1hdAorICogICAgIFB5RXJyX0Zvcm1hdAorICogICAgIFB5U3RyaW5nX0Zyb21Gb3JtYXRWCisgKgorICogTG93ZXItbGV2ZWwgdXNlcyByZXF1aXJlIHRoYXQgeW91IGludGVycG9sYXRlIHRoZSBjb3JyZWN0IGZvcm1hdCBtb2RpZmllcgorICogeW91cnNlbGYgKGUuZy4sIGNhbGxpbmcgcHJpbnRmLCBmcHJpbnRmLCBzcHJpbnRmLCBQeU9TX3NucHJpbnRmKTsgZm9yCisgKiBleGFtcGxlLAorICoKKyAqICAgICBQeV9zc2l6ZV90IGluZGV4OworICogICAgIGZwcmludGYoc3RkZXJyLCAiaW5kZXggJSIgUFlfRk9STUFUX1NJWkVfVCAiZCBzdWNrc1xuIiwgaW5kZXgpOworICoKKyAqIFRoYXQgd2lsbCBleHBhbmQgdG8gJWxkLCBvciAlSWQsIG9yIHRvIHNvbWV0aGluZyBlbHNlIGNvcnJlY3QgZm9yIGEKKyAqIFB5X3NzaXplX3Qgb24gdGhlIHBsYXRmb3JtLgorICovCisjaWZuZGVmIFBZX0ZPUk1BVF9TSVpFX1QKKyMgICBpZiBTSVpFT0ZfU0laRV9UID09IFNJWkVPRl9JTlQgJiYgIWRlZmluZWQoX19BUFBMRV9fKQorIyAgICAgICBkZWZpbmUgUFlfRk9STUFUX1NJWkVfVCAiIgorIyAgIGVsaWYgU0laRU9GX1NJWkVfVCA9PSBTSVpFT0ZfTE9ORworIyAgICAgICBkZWZpbmUgUFlfRk9STUFUX1NJWkVfVCAibCIKKyMgICBlbGlmIGRlZmluZWQoTVNfV0lORE9XUykKKyMgICAgICAgZGVmaW5lIFBZX0ZPUk1BVF9TSVpFX1QgIkkiCisjICAgZWxpZiBkZWZpbmVkKF9fTUlOR1czMl9fKSAmJiBkZWZpbmVkKF9fVVNFX01JTkdXX0FOU0lfU1RESU8pCisjICAgICAgIGRlZmluZSBQWV9GT1JNQVRfU0laRV9UICJ6IgorIyAgIGVsc2UKKyMgICAgICAgZXJyb3IgIlRoaXMgcGxhdGZvcm0ncyBweWNvbmZpZy5oIG5lZWRzIHRvIGRlZmluZSBQWV9GT1JNQVRfU0laRV9UIgorIyAgIGVuZGlmCisjZW5kaWYKKworLyogUFlfRk9STUFUX0xPTkdfTE9ORyBpcyBhbmFsb2dvdXMgdG8gUFlfRk9STUFUX1NJWkVfVCBhYm92ZSwgYnV0IGZvcgorICogdGhlIGxvbmcgbG9uZyB0eXBlIGluc3RlYWQgb2YgdGhlIHNpemVfdCB0eXBlLiAgSXQncyBvbmx5IGF2YWlsYWJsZQorICogd2hlbiBIQVZFX0xPTkdfTE9ORyBpcyBkZWZpbmVkLiBUaGUgImhpZ2ggbGV2ZWwiIFB5dGhvbiBmb3JtYXQKKyAqIGZ1bmN0aW9ucyBsaXN0ZWQgYWJvdmUgd2lsbCBpbnRlcnByZXQgImxsZCIgb3IgImxsdSIgY29ycmVjdGx5IG9uCisgKiBhbGwgcGxhdGZvcm1zLgorICovCisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyMgICBpZm5kZWYgUFlfRk9STUFUX0xPTkdfTE9ORworIyAgICAgICBpZiBkZWZpbmVkKE1TX1dJTjY0KSB8fCBkZWZpbmVkKE1TX1dJTkRPV1MpCisjICAgICAgICAgICBkZWZpbmUgUFlfRk9STUFUX0xPTkdfTE9ORyAiSTY0IgorIyAgICAgICBlbHNlCisjICAgICAgICAgICBlcnJvciAiVGhpcyBwbGF0Zm9ybSdzIHB5Y29uZmlnLmggbmVlZHMgdG8gZGVmaW5lIFBZX0ZPUk1BVF9MT05HX0xPTkciCisjICAgICAgIGVuZGlmCisjICAgZW5kaWYKKyNlbmRpZgorCisvKiBQeV9MT0NBTCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIHN0YXRpYyB0byBnZXQgdGhlIGZhc3Rlc3QgcG9zc2libGUgY2FsbGluZworICogY29udmVudGlvbiBmb3IgZnVuY3Rpb25zIHRoYXQgYXJlIGxvY2FsIHRvIGEgZ2l2ZW4gbW9kdWxlLgorICoKKyAqIFB5X0xPQ0FMX0lOTElORSBkb2VzIHRoZSBzYW1lIHRoaW5nLCBhbmQgYWxzbyBleHBsaWNpdGx5IHJlcXVlc3RzIGlubGluaW5nLAorICogZm9yIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgdGhhdC4KKyAqCisgKiBJZiBQWV9MT0NBTF9BR0dSRVNTSVZFIGlzIGRlZmluZWQgYmVmb3JlIHB5dGhvbi5oIGlzIGluY2x1ZGVkLCBtb3JlCisgKiAiYWdncmVzc2l2ZSIgaW5saW5pbmcvb3B0aW1pemFpb24gaXMgZW5hYmxlZCBmb3IgdGhlIGVudGlyZSBtb2R1bGUuICBUaGlzCisgKiBtYXkgbGVhZCB0byBjb2RlIGJsb2F0LCBhbmQgbWF5IHNsb3cgdGhpbmdzIGRvd24gZm9yIHRob3NlIHJlYXNvbnMuICBJdCBtYXkKKyAqIGFsc28gbGVhZCB0byBlcnJvcnMsIGlmIHRoZSBjb2RlIHJlbGllcyBvbiBwb2ludGVyIGFsaWFzaW5nLiAgVXNlIHdpdGgKKyAqIGNhcmUuCisgKgorICogTk9URTogWW91IGNhbiBvbmx5IHVzZSB0aGlzIGZvciBmdW5jdGlvbnMgdGhhdCBhcmUgZW50aXJlbHkgbG9jYWwgdG8gYQorICogbW9kdWxlOyBmdW5jdGlvbnMgdGhhdCBhcmUgZXhwb3J0ZWQgdmlhIG1ldGhvZCB0YWJsZXMsIGNhbGxiYWNrcywgZXRjLAorICogc2hvdWxkIGtlZXAgdXNpbmcgc3RhdGljLgorICovCisKKyN1bmRlZiBVU0VfSU5MSU5FIC8qIFhYWCAtIHNldCB2aWEgY29uZmlndXJlPyAqLworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNpZiBkZWZpbmVkKFBZX0xPQ0FMX0FHR1JFU1NJVkUpCisvKiBlbmFibGUgbW9yZSBhZ2dyZXNzaXZlIG9wdGltaXphdGlvbiBmb3IgdmlzdWFsIHN0dWRpbyAqLworI3ByYWdtYSBvcHRpbWl6ZSgiYWd0dyIsIG9uKQorI2VuZGlmCisvKiBpZ25vcmUgd2FybmluZ3MgaWYgdGhlIGNvbXBpbGVyIGRlY2lkZXMgbm90IHRvIGlubGluZSBhIGZ1bmN0aW9uICovCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDcxMCkKKy8qIGZhc3Rlc3QgcG9zc2libGUgbG9jYWwgY2FsbCB1bmRlciBNU1ZDICovCisjZGVmaW5lIFB5X0xPQ0FMKHR5cGUpIHN0YXRpYyB0eXBlIF9fZmFzdGNhbGwKKyNkZWZpbmUgUHlfTE9DQUxfSU5MSU5FKHR5cGUpIHN0YXRpYyBfX2lubGluZSB0eXBlIF9fZmFzdGNhbGwKKyNlbGlmIGRlZmluZWQoVVNFX0lOTElORSkKKyNkZWZpbmUgUHlfTE9DQUwodHlwZSkgc3RhdGljIHR5cGUKKyNkZWZpbmUgUHlfTE9DQUxfSU5MSU5FKHR5cGUpIHN0YXRpYyBpbmxpbmUgdHlwZQorI2Vsc2UKKyNkZWZpbmUgUHlfTE9DQUwodHlwZSkgc3RhdGljIHR5cGUKKyNkZWZpbmUgUHlfTE9DQUxfSU5MSU5FKHR5cGUpIHN0YXRpYyB0eXBlCisjZW5kaWYKKworLyogUHlfTUVNQ1BZIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgbWVtY3B5IGluIGNhc2VzIHdoZXJlIHRoZSBjb3BpZWQgYmxvY2tzCisgKiBhcmUgb2Z0ZW4gdmVyeSBzaG9ydC4gIFdoaWxlIG1vc3QgcGxhdGZvcm1zIGhhdmUgaGlnaGx5IG9wdGltaXplZCBjb2RlIGZvcgorICogbGFyZ2UgdHJhbnNmZXJzLCB0aGUgc2V0dXAgY29zdHMgZm9yIG1lbWNweSBhcmUgb2Z0ZW4gcXVpdGUgaGlnaC4gIE1FTUNQWQorICogc29sdmVzIHRoaXMgYnkgZG9pbmcgc2hvcnQgY29waWVzICJpbiBsaW5lIi4KKyAqLworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgUHlfTUVNQ1BZKHRhcmdldCwgc291cmNlLCBsZW5ndGgpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2l6ZV90IGlfLCBuXyA9IChsZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2hhciAqdF8gPSAodm9pZCopICh0YXJnZXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgY2hhciAqc18gPSAodm9pZCopIChzb3VyY2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG5fID49IDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1lbWNweSh0Xywgc18sIG5fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoaV8gPSAwOyBpXyA8IG5fOyBpXysrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0X1tpX10gPSBzX1tpX107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUHlfTUVNQ1BZIG1lbWNweQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2lmZGVmIEhBVkVfSUVFRUZQX0gKKyNpbmNsdWRlIDxpZWVlZnAuaD4gIC8qIG5lZWRlZCBmb3IgJ2Zpbml0ZScgZGVjbGFyYXRpb24gb24gc29tZSBwbGF0Zm9ybXMgKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8bWF0aC5oPiAvKiBNb3ZlZCBoZXJlIGZyb20gdGhlIG1hdGggc2VjdGlvbiwgYmVmb3JlIGV4dGVybiAiQyIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXUkFQUEVSIEZPUiA8dGltZS5oPiBhbmQvb3IgPHN5cy90aW1lLmg+ICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFRJTUVfV0lUSF9TWVNfVElNRQorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2Vsc2UgLyogIVRJTUVfV0lUSF9TWVNfVElNRSAqLworI2lmZGVmIEhBVkVfU1lTX1RJTUVfSAorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZWxzZSAvKiAhSEFWRV9TWVNfVElNRV9IICovCisjaW5jbHVkZSA8dGltZS5oPgorI2VuZGlmIC8qICFIQVZFX1NZU19USU1FX0ggKi8KKyNlbmRpZiAvKiAhVElNRV9XSVRIX1NZU19USU1FICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogV1JBUFBFUiBGT1IgPHN5cy9zZWxlY3QuaD4gKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTkIgY2FsbGVyIG11c3QgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICovCisKKyNpZmRlZiBIQVZFX1NZU19TRUxFQ1RfSAorCisjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorCisjZW5kaWYgLyogIUhBVkVfU1lTX1NFTEVDVF9IICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBzdGF0KCkgYW5kIGZzdGF0KCkgZmlkZGxpbmcgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdlIGV4cGVjdCB0aGF0IHN0YXQgYW5kIGZzdGF0IGV4aXN0IG9uIG1vc3Qgc3lzdGVtcy4KKyAqICBJdCdzIGNvbmZpcm1lZCBvbiBVbml4LCBNYWMgYW5kIFdpbmRvd3MuCisgKiAgSWYgeW91IGRvbid0IGhhdmUgdGhlbSwgYWRkCisgKiAgICAgICNkZWZpbmUgRE9OVF9IQVZFX1NUQVQKKyAqIGFuZC9vcgorICogICAgICAjZGVmaW5lIERPTlRfSEFWRV9GU1RBVAorICogdG8geW91ciBweWNvbmZpZy5oLiBQeXRob24gY29kZSBiZXlvbmQgdGhpcyBzaG91bGQgY2hlY2sgSEFWRV9TVEFUIGFuZAorICogSEFWRV9GU1RBVCBpbnN0ZWFkLgorICogQWxzbworICogICAgICAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSAorICogaWYgPHN5cy9zdGF0Lmg+IGV4aXN0cyBvbiB5b3VyIHBsYXRmb3JtLCBhbmQKKyAqICAgICAgI2RlZmluZSBIQVZFX1NUQVRfSAorICogaWYgPHN0YXQuaD4gZG9lcy4KKyAqLworI2lmbmRlZiBET05UX0hBVkVfU1RBVAorI2RlZmluZSBIQVZFX1NUQVQKKyNlbmRpZgorCisjaWZuZGVmIERPTlRfSEFWRV9GU1RBVAorI2RlZmluZSBIQVZFX0ZTVEFUCisjZW5kaWYKKworI2lmZGVmIFJJU0NPUworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgInVuaXhzdHVmZi5oIgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKKyNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9TVEFUX0gpCisjaW5jbHVkZSA8c3RhdC5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFBZQ0NfVkFDUFApCisvKiBWaXN1YWxBZ2UgQy9DKysgRmFpbGVkIHRvIERlZmluZSBNb3VudFR5cGUgRmllbGQgaW4gc3lzL3N0YXQuaCAqLworI2RlZmluZSBTX0lGTVQgKFNfSUZESVJ8U19JRkNIUnxTX0lGUkVHKQorI2VuZGlmCisKKyNpZm5kZWYgU19JU1JFRworI2RlZmluZSBTX0lTUkVHKHgpICgoKHgpICYgU19JRk1UKSA9PSBTX0lGUkVHKQorI2VuZGlmCisKKyNpZm5kZWYgU19JU0RJUgorI2RlZmluZSBTX0lTRElSKHgpICgoKHgpICYgU19JRk1UKSA9PSBTX0lGRElSKQorI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCisvKiBNb3ZlIHRoaXMgZG93biBoZXJlIHNpbmNlIHNvbWUgQysrICNpbmNsdWRlJ3MgZG9uJ3QgbGlrZSB0byBiZSBpbmNsdWRlZAorICAgaW5zaWRlIGFuIGV4dGVybiAiQyIgKi8KK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogUHlfQVJJVEhNRVRJQ19SSUdIVF9TSElGVAorICogQyBkb2Vzbid0IGRlZmluZSB3aGV0aGVyIGEgcmlnaHQtc2hpZnQgb2YgYSBzaWduZWQgaW50ZWdlciBzaWduLWV4dGVuZHMKKyAqIG9yIHplcm8tZmlsbHMuICBIZXJlIGEgbWFjcm8gdG8gZm9yY2Ugc2lnbiBleHRlbnNpb246CisgKiBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKFRZUEUsIEksIEopCisgKiAgICBSZXR1cm4gSSA+PiBKLCBmb3JjaW5nIHNpZ24gZXh0ZW5zaW9uLiAgQXJpdGhtZXRpY2FsbHksIHJldHVybiB0aGUKKyAqICAgIGZsb29yIG9mIEkvMioqSi4KKyAqIFJlcXVpcmVtZW50czoKKyAqICAgIEkgc2hvdWxkIGhhdmUgc2lnbmVkIGludGVnZXIgdHlwZS4gIEluIHRoZSB0ZXJtaW5vbG9neSBvZiBDOTksIHRoaXMgY2FuCisgKiAgICBiZSBlaXRoZXIgb25lIG9mIHRoZSBmaXZlIHN0YW5kYXJkIHNpZ25lZCBpbnRlZ2VyIHR5cGVzIChzaWduZWQgY2hhciwKKyAqICAgIHNob3J0LCBpbnQsIGxvbmcsIGxvbmcgbG9uZykgb3IgYW4gZXh0ZW5kZWQgc2lnbmVkIGludGVnZXIgdHlwZS4KKyAqICAgIEogaXMgYW4gaW50ZWdlciA+PSAwIGFuZCBzdHJpY3RseSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZQorICogICAgdHlwZSBvZiBJIChiZWNhdXNlIEMgZG9lc24ndCBkZWZpbmUgd2hhdCBoYXBwZW5zIGZvciBKIG91dHNpZGUgdGhhdAorICogICAgcmFuZ2UgZWl0aGVyKS4KKyAqICAgIFRZUEUgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIEksIGJ1dCBpcyBub3cgaWdub3JlZC4gIEl0J3MgYmVlbiBsZWZ0CisgKiAgICBpbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyA8PSAyLjYgb3IgMy4wLgorICogQ2F1dGlvbjoKKyAqICAgIEkgbWF5IGJlIGV2YWx1YXRlZCBtb3JlIHRoYW4gb25jZS4KKyAqLworI2lmZGVmIFNJR05FRF9SSUdIVF9TSElGVF9aRVJPX0ZJTExTCisjZGVmaW5lIFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQoVFlQRSwgSSwgSikgXAorICAgICgoSSkgPCAwID8gLTEtKCgtMS0oSSkpID4+IChKKSkgOiAoSSkgPj4gKEopKQorI2Vsc2UKKyNkZWZpbmUgUHlfQVJJVEhNRVRJQ19SSUdIVF9TSElGVChUWVBFLCBJLCBKKSAoKEkpID4+IChKKSkKKyNlbmRpZgorCisvKiBQeV9GT1JDRV9FWFBBTlNJT04oWCkKKyAqICJTaW1wbHkiIHJldHVybnMgaXRzIGFyZ3VtZW50LiAgSG93ZXZlciwgbWFjcm8gZXhwYW5zaW9ucyB3aXRoaW4gdGhlCisgKiBhcmd1bWVudCBhcmUgZXZhbHVhdGVkLiAgVGhpcyB1bmZvcnR1bmF0ZSB0cmlja2VyeSBpcyBuZWVkZWQgdG8gZ2V0CisgKiB0b2tlbi1wYXN0aW5nIHRvIHdvcmsgYXMgZGVzaXJlZCBpbiBzb21lIGNhc2VzLgorICovCisjZGVmaW5lIFB5X0ZPUkNFX0VYUEFOU0lPTihYKSBYCisKKy8qIFB5X1NBRkVfRE9XTkNBU1QoVkFMVUUsIFdJREUsIE5BUlJPVykKKyAqIENhc3QgVkFMVUUgdG8gdHlwZSBOQVJST1cgZnJvbSB0eXBlIFdJREUuICBJbiBQeV9ERUJVRyBtb2RlLCB0aGlzCisgKiBhc3NlcnQtZmFpbHMgaWYgYW55IGluZm9ybWF0aW9uIGlzIGxvc3QuCisgKiBDYXV0aW9uOgorICogICAgVkFMVUUgbWF5IGJlIGV2YWx1YXRlZCBtb3JlIHRoYW4gb25jZS4KKyAqLworI2lmZGVmIFB5X0RFQlVHCisjZGVmaW5lIFB5X1NBRkVfRE9XTkNBU1QoVkFMVUUsIFdJREUsIE5BUlJPVykgXAorICAgIChhc3NlcnQoKFdJREUpKE5BUlJPVykoVkFMVUUpID09IChWQUxVRSkpLCAoTkFSUk9XKShWQUxVRSkpCisjZWxzZQorI2RlZmluZSBQeV9TQUZFX0RPV05DQVNUKFZBTFVFLCBXSURFLCBOQVJST1cpIChOQVJST1cpKFZBTFVFKQorI2VuZGlmCisKKy8qIFB5X1NFVF9FUlJOT19PTl9NQVRIX0VSUk9SKHgpCisgKiBJZiBhIGxpYm0gZnVuY3Rpb24gZGlkIG5vdCBzZXQgZXJybm8sIGJ1dCBpdCBsb29rcyBsaWtlIHRoZSByZXN1bHQKKyAqIG92ZXJmbG93ZWQgb3Igbm90LWEtbnVtYmVyLCBzZXQgZXJybm8gdG8gRVJBTkdFIG9yIEVET00uICBTZXQgZXJybm8KKyAqIHRvIDAgYmVmb3JlIGNhbGxpbmcgYSBsaWJtIGZ1bmN0aW9uLCBhbmQgaW52b2tlIHRoaXMgbWFjcm8gYWZ0ZXIsCisgKiBwYXNzaW5nIHRoZSBmdW5jdGlvbiByZXN1bHQuCisgKiBDYXV0aW9uOgorICogICAgVGhpcyBpc24ndCByZWxpYWJsZS4gIFNlZSBQeV9PVkVSRkxPV0VEIGNvbW1lbnRzLgorICogICAgWCBpcyBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UuCisgKi8KKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKSB8fCBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCAoZGVmaW5lZChfX2hwdXgpICYmIGRlZmluZWQoX19pYTY0KSkKKyNkZWZpbmUgX1B5X1NFVF9FRE9NX0ZPUl9OQU4oWCkgaWYgKGlzbmFuKFgpKSBlcnJubyA9IEVET007CisjZWxzZQorI2RlZmluZSBfUHlfU0VUX0VET01fRk9SX05BTihYKSA7CisjZW5kaWYKKyNkZWZpbmUgUHlfU0VUX0VSUk5PX09OX01BVEhfRVJST1IoWCkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAoZXJybm8gPT0gMCkgeyBcCisgICAgICAgICAgICBpZiAoKFgpID09IFB5X0hVR0VfVkFMIHx8IChYKSA9PSAtUHlfSFVHRV9WQUwpIFwKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVSQU5HRTsgXAorICAgICAgICAgICAgZWxzZSBfUHlfU0VUX0VET01fRk9SX05BTihYKSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUoMCkKKworLyogUHlfU0VUX0VSQU5HRV9PTl9PVkVSRkxPVyh4KQorICogQW4gYWxpYXMgb2YgUHlfU0VUX0VSUk5PX09OX01BVEhfRVJST1IgZm9yIGJhY2t3YXJkLWNvbXBhdGliaWxpdHkuCisgKi8KKyNkZWZpbmUgUHlfU0VUX0VSQU5HRV9JRl9PVkVSRkxPVyhYKSBQeV9TRVRfRVJSTk9fT05fTUFUSF9FUlJPUihYKQorCisvKiBQeV9BREpVU1RfRVJBTkdFMSh4KQorICogUHlfQURKVVNUX0VSQU5HRTIoeCwgeSkKKyAqIFNldCBlcnJubyB0byAwIGJlZm9yZSBjYWxsaW5nIGEgbGlibSBmdW5jdGlvbiwgYW5kIGludm9rZSBvbmUgb2YgdGhlc2UKKyAqIG1hY3JvcyBhZnRlciwgcGFzc2luZyB0aGUgZnVuY3Rpb24gcmVzdWx0KHMpIChQeV9BREpVU1RfRVJBTkdFMiBpcyB1c2VmdWwKKyAqIGZvciBmdW5jdGlvbnMgcmV0dXJuaW5nIGNvbXBsZXggcmVzdWx0cykuICBUaGlzIG1ha2VzIHR3byBraW5kcyBvZgorICogYWRqdXN0bWVudHMgdG8gZXJybm86ICAoQSkgSWYgaXQgbG9va3MgbGlrZSB0aGUgcGxhdGZvcm0gbGlibSBzZXQKKyAqIGVycm5vPUVSQU5HRSBkdWUgdG8gdW5kZXJmbG93LCBjbGVhciBlcnJuby4gKEIpIElmIGl0IGxvb2tzIGxpa2UgdGhlCisgKiBwbGF0Zm9ybSBsaWJtIG92ZXJmbG93ZWQgYnV0IGRpZG4ndCBzZXQgZXJybm8sIGZvcmNlIGVycm5vIHRvIEVSQU5HRS4gIEluCisgKiBlZmZlY3QsIHdlJ3JlIHRyeWluZyB0byBmb3JjZSBhIHVzZWZ1bCBpbXBsZW1lbnRhdGlvbiBvZiBDODkgZXJybm8KKyAqIGJlaGF2aW9yLgorICogQ2F1dGlvbjoKKyAqICAgIFRoaXMgaXNuJ3QgcmVsaWFibGUuICBTZWUgUHlfT1ZFUkZMT1dFRCBjb21tZW50cy4KKyAqICAgIFggYW5kIFkgbWF5IGJlIGV2YWx1YXRlZCBtb3JlIHRoYW4gb25jZS4KKyAqLworI2RlZmluZSBQeV9BREpVU1RfRVJBTkdFMShYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZXJybm8gPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKChYKSA9PSBQeV9IVUdFX1ZBTCB8fCAoWCkgPT0gLVB5X0hVR0VfVkFMKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIGlmIChlcnJubyA9PSBFUkFOR0UgJiYgKFgpID09IDAuMCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKKworI2RlZmluZSBQeV9BREpVU1RfRVJBTkdFMihYLCBZKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKFgpID09IFB5X0hVR0VfVkFMIHx8IChYKSA9PSAtUHlfSFVHRV9WQUwgfHwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKFkpID09IFB5X0hVR0VfVkFMIHx8IChZKSA9PSAtUHlfSFVHRV9WQUwpIHsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubyA9IEVSQU5HRTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIGlmIChlcnJubyA9PSBFUkFOR0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZXJybm8gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKKworLyogIFRoZSBmdW5jdGlvbnMgX1B5X2RnX3N0cnRvZCBhbmQgX1B5X2RnX2R0b2EgaW4gUHl0aG9uL2R0b2EuYyAod2hpY2ggYXJlCisgKiAgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGUgc2hvcnQgZmxvYXQgcmVwciBpbnRyb2R1Y2VkIGluIFB5dGhvbiAzLjEpIHJlcXVpcmUKKyAqICB0aGF0IHRoZSBmbG9hdGluZy1wb2ludCB1bml0IHRoYXQncyBiZWluZyB1c2VkIGZvciBhcml0aG1ldGljIG9wZXJhdGlvbnMKKyAqICBvbiBDIGRvdWJsZXMgaXMgc2V0IHRvIHVzZSA1My1iaXQgcHJlY2lzaW9uLiAgSXQgYWxzbyByZXF1aXJlcyB0aGF0IHRoZQorICogIEZQVSByb3VuZGluZyBtb2RlIGlzIHJvdW5kLWhhbGYtdG8tZXZlbiwgYnV0IHRoYXQncyBsZXNzIG9mdGVuIGFuIGlzc3VlLgorICoKKyAqICBJZiB5b3VyIEZQVSBpc24ndCBhbHJlYWR5IHNldCB0byA1My1iaXQgcHJlY2lzaW9uL3JvdW5kLWhhbGYtdG8tZXZlbiwgYW5kCisgKiAgeW91IHdhbnQgdG8gbWFrZSB1c2Ugb2YgX1B5X2RnX3N0cnRvZCBhbmQgX1B5X2RnX2R0b2EsIHRoZW4geW91IHNob3VsZAorICoKKyAqICAgICAjZGVmaW5lIEhBVkVfUFlfU0VUXzUzQklUX1BSRUNJU0lPTiAxCisgKgorICogIGFuZCBhbHNvIGdpdmUgYXBwcm9wcmlhdGUgZGVmaW5pdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgdGhyZWUgbWFjcm9zOgorICoKKyAqICAgIF9QWV9TRVRfNTNCSVRfUFJFQ0lTSU9OX1NUQVJUIDogc3RvcmUgb3JpZ2luYWwgRlBVIHNldHRpbmdzLCBhbmQKKyAqICAgICAgICBzZXQgRlBVIHRvIDUzLWJpdCBwcmVjaXNpb24vcm91bmQtaGFsZi10by1ldmVuCisgKiAgICBfUFlfU0VUXzUzQklUX1BSRUNJU0lPTl9FTkQgOiByZXN0b3JlIG9yaWdpbmFsIEZQVSBzZXR0aW5ncworICogICAgX1BZX1NFVF81M0JJVF9QUkVDSVNJT05fSEVBREVSIDogYW55IHZhcmlhYmxlIGRlY2xhcmF0aW9ucyBuZWVkZWQgdG8KKyAqICAgICAgICB1c2UgdGhlIHR3byBtYWNyb3MgYWJvdmUuCisgKgorICogVGhlIG1hY3JvcyBhcmUgZGVzaWduZWQgdG8gYmUgdXNlZCB3aXRoaW4gYSBzaW5nbGUgQyBmdW5jdGlvbjogc2VlCisgKiBQeXRob24vcHlzdHJ0b2QuYyBmb3IgYW4gZXhhbXBsZSBvZiB0aGVpciB1c2UuCisgKi8KKworLyogZ2V0IGFuZCBzZXQgeDg3IGNvbnRyb2wgd29yZCBmb3IgZ2NjL3g4NiAqLworI2lmZGVmIEhBVkVfR0NDX0FTTV9GT1JfWDg3CisjZGVmaW5lIEhBVkVfUFlfU0VUXzUzQklUX1BSRUNJU0lPTiAxCisvKiBfUHlfZ2V0L3NldF8zODdjb250cm9sd29yZCBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gUHl0aG9uL3B5bWF0aC5jICovCisjZGVmaW5lIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIHNob3J0IG9sZF8zODdjb250cm9sd29yZCwgbmV3XzM4N2NvbnRyb2x3b3JkCisjZGVmaW5lIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF8zODdjb250cm9sd29yZCA9IF9QeV9nZXRfMzg3Y29udHJvbHdvcmQoKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld18zODdjb250cm9sd29yZCA9IChvbGRfMzg3Y29udHJvbHdvcmQgJiB+MHgwZjAwKSB8IDB4MDIwMDsgXAorICAgICAgICBpZiAobmV3XzM4N2NvbnRyb2x3b3JkICE9IG9sZF8zODdjb250cm9sd29yZCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX1B5X3NldF8zODdjb250cm9sd29yZChuZXdfMzg3Y29udHJvbHdvcmQpOyAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChuZXdfMzg3Y29udHJvbHdvcmQgIT0gb2xkXzM4N2NvbnRyb2x3b3JkKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgX1B5X3NldF8zODdjb250cm9sd29yZChvbGRfMzg3Y29udHJvbHdvcmQpCisjZW5kaWYKKworLyogZ2V0IGFuZCBzZXQgeDg3IGNvbnRyb2wgd29yZCBmb3IgVmlzdWFsU3R1ZGlvL3g4NiAqLworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9XSU42NCkgLyogeDg3IG5vdCBzdXBwb3J0ZWQgaW4gNjQtYml0ICovCisjZGVmaW5lIEhBVkVfUFlfU0VUXzUzQklUX1BSRUNJU0lPTiAxCisjZGVmaW5lIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX0hFQURFUiBcCisgICAgdW5zaWduZWQgaW50IG9sZF8zODdjb250cm9sd29yZCwgbmV3XzM4N2NvbnRyb2x3b3JkLCBvdXRfMzg3Y29udHJvbHdvcmQKKy8qIFdlIHVzZSB0aGUgX19jb250cm9sODdfMiBmdW5jdGlvbiB0byBzZXQgb25seSB0aGUgeDg3IGNvbnRyb2wgd29yZC4KKyAgIFRoZSBTU0UgY29udHJvbCB3b3JkIGlzIHVuYWZmZWN0ZWQuICovCisjZGVmaW5lIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9fY29udHJvbDg3XzIoMCwgMCwgJm9sZF8zODdjb250cm9sd29yZCwgTlVMTCk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld18zODdjb250cm9sd29yZCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKG9sZF8zODdjb250cm9sd29yZCAmIH4oX01DV19QQyB8IF9NQ1dfUkMpKSB8IChfUENfNTMgfCBfUkNfTkVBUik7IFwKKyAgICAgICAgaWYgKG5ld18zODdjb250cm9sd29yZCAhPSBvbGRfMzg3Y29udHJvbHdvcmQpICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fY29udHJvbDg3XzIobmV3XzM4N2NvbnRyb2x3b3JkLCBfTUNXX1BDIHwgX01DV19SQywgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dF8zODdjb250cm9sd29yZCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorI2RlZmluZSBfUHlfU0VUXzUzQklUX1BSRUNJU0lPTl9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobmV3XzM4N2NvbnRyb2x3b3JkICE9IG9sZF8zODdjb250cm9sd29yZCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19jb250cm9sODdfMihvbGRfMzg3Y29udHJvbHdvcmQsIF9NQ1dfUEMgfCBfTUNXX1JDLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0XzM4N2NvbnRyb2x3b3JkLCBOVUxMKTsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisjZW5kaWYKKworLyogZGVmYXVsdCBkZWZpbml0aW9ucyBhcmUgZW1wdHkgKi8KKyNpZm5kZWYgSEFWRV9QWV9TRVRfNTNCSVRfUFJFQ0lTSU9OCisjZGVmaW5lIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX0hFQURFUgorI2RlZmluZSBfUHlfU0VUXzUzQklUX1BSRUNJU0lPTl9TVEFSVAorI2RlZmluZSBfUHlfU0VUXzUzQklUX1BSRUNJU0lPTl9FTkQKKyNlbmRpZgorCisvKiBJZiB3ZSBjYW4ndCBndWFyYW50ZWUgNTMtYml0IHByZWNpc2lvbiwgZG9uJ3QgdXNlIHRoZSBjb2RlCisgICBpbiBQeXRob24vZHRvYS5jLCBidXQgZmFsbCBiYWNrIHRvIHN0YW5kYXJkIGNvZGUuICBUaGlzCisgICBtZWFucyB0aGF0IHJlcHIgb2YgYSBmbG9hdCB3aWxsIGJlIGxvbmcgKDE3IHNpZyBkaWdpdHMpLgorCisgICBSZWFsaXN0aWNhbGx5LCB0aGVyZSBhcmUgdHdvIHRoaW5ncyB0aGF0IGNvdWxkIGdvIHdyb25nOgorCisgICAoMSkgZG91YmxlcyBhcmVuJ3QgSUVFRSA3NTQgZG91Ymxlcywgb3IKKyAgICgyKSB3ZSdyZSBvbiB4ODYgd2l0aCB0aGUgcm91bmRpbmcgcHJlY2lzaW9uIHNldCB0byA2NC1iaXRzCisgICAgICAgKGV4dGVuZGVkIHByZWNpc2lvbiksIGFuZCB3ZSBkb24ndCBrbm93IGhvdyB0byBjaGFuZ2UKKyAgICAgICB0aGUgcm91bmRpbmcgcHJlY2lzaW9uLgorICovCisKKyNpZiAhZGVmaW5lZChET1VCTEVfSVNfTElUVExFX0VORElBTl9JRUVFNzU0KSAmJiBcCisgICAgIWRlZmluZWQoRE9VQkxFX0lTX0JJR19FTkRJQU5fSUVFRTc1NCkgJiYgXAorICAgICFkZWZpbmVkKERPVUJMRV9JU19BUk1fTUlYRURfRU5ESUFOX0lFRUU3NTQpCisjZGVmaW5lIFBZX05PX1NIT1JUX0ZMT0FUX1JFUFIKKyNlbmRpZgorCisvKiBkb3VibGUgcm91bmRpbmcgaXMgc3ltcHRvbWF0aWMgb2YgdXNlIG9mIGV4dGVuZGVkIHByZWNpc2lvbiBvbiB4ODYuICBJZgorICAgd2UncmUgc2VlaW5nIGRvdWJsZSByb3VuZGluZywgYW5kIHdlIGRvbid0IGhhdmUgYW55IG1lY2hhbmlzbSBhdmFpbGFibGUgZm9yCisgICBjaGFuZ2luZyB0aGUgRlBVIHJvdW5kaW5nIHByZWNpc2lvbiwgdGhlbiBkb24ndCB1c2UgUHl0aG9uL2R0b2EuYy4gKi8KKyNpZiBkZWZpbmVkKFg4N19ET1VCTEVfUk9VTkRJTkcpICYmICFkZWZpbmVkKEhBVkVfUFlfU0VUXzUzQklUX1BSRUNJU0lPTikKKyNkZWZpbmUgUFlfTk9fU0hPUlRfRkxPQVRfUkVQUgorI2VuZGlmCisKKy8qIFB5X0RFUFJFQ0FURUQodmVyc2lvbikKKyAqIERlY2xhcmUgYSB2YXJpYWJsZSwgdHlwZSwgb3IgZnVuY3Rpb24gZGVwcmVjYXRlZC4KKyAqIFVzYWdlOgorICogICAgZXh0ZXJuIGludCBvbGRfdmFyIFB5X0RFUFJFQ0FURUQoMi4zKTsKKyAqICAgIHR5cGVkZWYgaW50IFQxIFB5X0RFUFJFQ0FURUQoMi40KTsKKyAqICAgIGV4dGVybiBpbnQgeCgpIFB5X0RFUFJFQ0FURUQoMi41KTsKKyAqLworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICgoX19HTlVDX18gPj0gNCkgfHwgXAorICAgICAgICAgICAgICAoX19HTlVDX18gPT0gMykgJiYgKF9fR05VQ19NSU5PUl9fID49IDEpKQorI2RlZmluZSBQeV9ERVBSRUNBVEVEKFZFUlNJT05fVU5VU0VEKSBfX2F0dHJpYnV0ZV9fKChfX2RlcHJlY2F0ZWRfXykpCisjZWxzZQorI2RlZmluZSBQeV9ERVBSRUNBVEVEKFZFUlNJT05fVU5VU0VEKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorUHJvdG90eXBlcyB0aGF0IGFyZSBtaXNzaW5nIGZyb20gdGhlIHN0YW5kYXJkIGluY2x1ZGUgZmlsZXMgb24gc29tZSBzeXN0ZW1zCisoYW5kIHBvc3NpYmx5IG9ubHkgc29tZSB2ZXJzaW9ucyBvZiBzdWNoIHN5c3RlbXMuKQorCitQbGVhc2UgYmUgY29uc2VydmF0aXZlIHdpdGggYWRkaW5nIG5ldyBvbmVzLCBkb2N1bWVudCB0aGVtIGFuZCBlbmNsb3NlIHRoZW0KK2luIHBsYXRmb3JtLXNwZWNpZmljICNpZmRlZnMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmZGVmIFNPTEFSSVMKKy8qIFVuY2hlY2tlZCAqLworZXh0ZXJuIGludCBnZXRob3N0bmFtZShjaGFyICosIGludCk7CisjZW5kaWYKKworI2lmZGVmIF9fQkVPU19fCisvKiBVbmNoZWNrZWQgKi8KKy8qIEl0J3MgaW4gdGhlIGxpYnMsIGJ1dCBub3QgdGhlIGhlYWRlcnMuLi4gLSBbY2poXSAqLworaW50IHNodXRkb3duKCBpbnQsIGludCApOworI2VuZGlmCisKKyNpZmRlZiBIQVZFX19HRVRQVFkKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4gICAgICAgICAgLyogd2UgbmVlZCB0byBpbXBvcnQgbW9kZV90ICovCitleHRlcm4gY2hhciAqIF9nZXRwdHkoaW50ICosIGludCwgbW9kZV90LCBpbnQpOworI2VuZGlmCisKKy8qIE9uIFFOWCA2LCBzdHJ1Y3QgdGVybWlvIG11c3QgYmUgZGVjbGFyZWQgYnkgaW5jbHVkaW5nIHN5cy90ZXJtaW8uaAorICAgaWYgVENHRVRBLCBUQ1NFVEEsIFRDU0VUQVcsIG9yIFRDU0VUQUYgYXJlIHVzZWQuICBzeXMvdGVybWlvLmggbXVzdAorICAgYmUgaW5jbHVkZWQgYmVmb3JlIHRlcm1pb3MuaCBvciBpdCB3aWxsIGdlbmVyYXRlIGFuIGVycm9yLiAqLworI2lmIGRlZmluZWQoSEFWRV9TWVNfVEVSTUlPX0gpICYmICFkZWZpbmVkKF9faHB1eCkKKyNpbmNsdWRlIDxzeXMvdGVybWlvLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoSEFWRV9PUEVOUFRZKSB8fCBkZWZpbmVkKEhBVkVfRk9SS1BUWSkKKyNpZiAhZGVmaW5lZChIQVZFX1BUWV9IKSAmJiAhZGVmaW5lZChIQVZFX0xJQlVUSUxfSCkgJiYgIWRlZmluZWQoSEFWRV9VVElMX0gpCisvKiBCU0RJIGRvZXMgbm90IHN1cHBseSBhIHByb3RvdHlwZSBmb3IgdGhlICdvcGVucHR5JyBhbmQgJ2ZvcmtwdHknCisgICBmdW5jdGlvbnMsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGluY2x1ZGVkIGluIGxpYnV0aWwuICovCisjaW5jbHVkZSA8dGVybWlvcy5oPgorZXh0ZXJuIGludCBvcGVucHR5KGludCAqLCBpbnQgKiwgY2hhciAqLCBzdHJ1Y3QgdGVybWlvcyAqLCBzdHJ1Y3Qgd2luc2l6ZSAqKTsKK2V4dGVybiBwaWRfdCBmb3JrcHR5KGludCAqLCBjaGFyICosIHN0cnVjdCB0ZXJtaW9zICosIHN0cnVjdCB3aW5zaXplICopOworI2VuZGlmIC8qICFkZWZpbmVkKEhBVkVfUFRZX0gpICYmICFkZWZpbmVkKEhBVkVfTElCVVRJTF9IKSAqLworI2VuZGlmIC8qIGRlZmluZWQoSEFWRV9PUEVOUFRZKSB8fCBkZWZpbmVkKEhBVkVfRk9SS1BUWSkgKi8KKworCisvKiBUaGVzZSBhcmUgcHVsbGVkIGZyb20gdmFyaW91cyBwbGFjZXMuIEl0IGlzbid0IG9idmlvdXMgb24gd2hhdCBwbGF0Zm9ybXMKKyAgIHRoZXkgYXJlIG5lY2Vzc2FyeSwgbm9yIHdoYXQgdGhlIGV4YWN0IHByb3RvdHlwZSBzaG91bGQgbG9vayBsaWtlICh3aGljaAorICAgaXMgbGlrZWx5IHRvIHZhcnkgYmV0d2VlbiBwbGF0Zm9ybXMhKSBJZiB5b3UgZmluZCB5b3UgbmVlZCBvbmUgb2YgdGhlc2UKKyAgIGRlY2xhcmF0aW9ucywgcGxlYXNlIG1vdmUgdGhlbSB0byBhIHBsYXRmb3JtLXNwZWNpZmljIGJsb2NrIGFuZCBpbmNsdWRlCisgICBwcm9wZXIgcHJvdG90eXBlcy4gKi8KKyNpZiAwCisKKy8qIEZyb20gTW9kdWxlcy9yZXNvdXJjZS5jICovCitleHRlcm4gaW50IGdldHJ1c2FnZSgpOworZXh0ZXJuIGludCBnZXRwYWdlc2l6ZSgpOworCisvKiBGcm9tIFB5dGhvbi9zeXNtb2R1bGUuYyBhbmQgTW9kdWxlcy9wb3NpeG1vZHVsZS5jICovCitleHRlcm4gaW50IGZjbG9zZShGSUxFICopOworCisvKiBGcm9tIE1vZHVsZXMvcG9zaXhtb2R1bGUuYyAqLworZXh0ZXJuIGludCBmZGF0YXN5bmMoaW50KTsKKyNlbmRpZiAvKiAwICovCisKKworI2lmZGVmIF9fTUlOR1czMl9fCisvKiBGSVhNRTogc29tZSBvZiBuZXh0IGRlZmluaXRpb25zIHNwZWNpZmljIHRvIGdjYyhtaW5ndyBidWlsZCkgY2FuIGJlCisgICBnZW5lcmFsaXplZCBvbiBkZWZpbml0aW9ucyBvZiBfV0lOMzIgb3IgV0lOMzIgYW5kIHRvIGJlIGNvbW1vbiBmb3IKKyAgIGFsbCB3aW5kb3dzIGJ1aWxkIGluc3RlYWQgZXhwbGljaXRseSB0byBkZWZpbmUgb25seSBmb3Igbm9uLWF1dG90b29scworICAgYmFzZWQgYnVpbGRzIChzZWUgUEMvcHljb25maWcuaCBmb3IgZGV0YWlscykuICovCisjaWYgIWRlZmluZWQoTVNfV0lONjQpICYmIGRlZmluZWQoX1dJTjY0KQorIyAgZGVmaW5lIE1TX1dJTjY0CisjZW5kaWYKKyNpZiAhZGVmaW5lZChNU19XSU4zMikgJiYgZGVmaW5lZChfV0lOMzIpCisjICBkZWZpbmUgTVNfV0lOMzIKKyNlbmRpZgorI2lmICFkZWZpbmVkKE1TX1dJTjMyKSAmJiBkZWZpbmVkKF9XSU4zMikKKyMgIGRlZmluZSBNU19XSU4zMgorI2VuZGlmCisjaWYgIWRlZmluZWQoTVNfV0lORE9XUykgJiYgZGVmaW5lZChNU19XSU4zMikKKyMgIGRlZmluZSBNU19XSU5ET1dTCisjZW5kaWYKKworI2lmbmRlZiBQWVRIT05QQVRICisjICBkZWZpbmUgUFlUSE9OUEFUSCAiLlxcRExMczsuXFxsaWI7LlxcbGliXFxwbGF0LXdpbjsuXFxsaWJcXGxpYi10ayIKKyNlbmRpZgorCisvKiBweXRob24gMi42KyByZXF1aXJlcyBXaW5kb3dzIDIwMDAgb3IgZ3JlYXRlci4gKi8KKyNkZWZpbmUgUHlfV0lOVkVSIDB4MDUwMAorCisjaWYgZGVmaW5lZChQeV9CVUlMRF9DT1JFKSB8fCBkZWZpbmVkKFB5X0JVSUxEX0NPUkVfTU9EVUxFKQorLyogRklYTUUgaWYgTlRERElfeHh4IGlzIGluIHVzZSBieSBtaW5ndyAoc2VlIFBDL3B5Y29uZmlnLmgpICovCisjaWZuZGVmIFdJTlZFUgorIyAgZGVmaW5lIFdJTlZFUiBQeV9XSU5WRVIKKyNlbmRpZgorI2lmbmRlZiBfV0lOMzJfV0lOTlQKKyMgIGRlZmluZSBfV0lOMzJfV0lOTlQgUHlfV0lOVkVSCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUExBVEZPUk0KKy8qTk9URTogaWYgY29tcGlsZSBnZXRwbGF0Zm9ybS5jIFBMQVRGT1JNIGlzIHNldCB0byBNQUNIREVQIHRoYXQgaXMKKyAgIndpbiIgZm9yIG1pbmd3IGJ1aWxkIChzZWUgcmVzcGVjdGl2ZSBjb21tZW50IGluIGNvbmZpZ3VyZS5pbikuICovCisjIHVuZGVmIFBMQVRGT1JNCisjZW5kaWYKKy8qIGFsd2F5cyBzZXQgdG8gIndpbjMyIiAtIHNlZSBQQy9weWNvbmZpZy5oICovCisjZGVmaW5lIFBMQVRGT1JNICJ3aW4zMiIKKworI2lmIGRlZmluZWQoTVNfV0lONjQpCisjICBkZWZpbmUgU0laRU9GX0hLRVkgOAorI2VsaWYgZGVmaW5lZChNU19XSU4zMikKKyMgIGRlZmluZSBTSVpFT0ZfSEtFWSA0CisjZW5kaWYKKworLypOT1RFOiBtaW5ndyBoYXMgaXNpbmYgYXMgbWFjcm8gZGVmaW5lZCBpbiBtYXRoLmguCisgIFNpbmNlIFBDL3B5Y29uZmlnLmggZGVmaW5lIFB5X0lTX0lORklOSVRZKFgpIHRoYXQgY292ZXIgSEFWRV9ERUNMX0lTRklOSVRFCisgIGhlcmUgZm9yIFB5X0lTX0lORklOSVRZIHdlIGRlZmluZSBzYW1lIGFzIGZvciBNU1ZDIGJ1aWxkLgorICBUaGlzIG1ha2VzIEhBVkVfREVDTF9JU0ZJTklURSBuZWVkbGVzcy4KKyAgQWxzbyBzZWUgY29tbWFudHMgaW4gY29uZmlndXJlLmluIGFuZCBweW1hdGguaC4gKi8KKyNkZWZpbmUgUHlfSVNfSU5GSU5JVFkoWCkgKCFfZmluaXRlKFgpICYmICFfaXNuYW4oWCkpCisKKyNpZm5kZWYgSEFWRV9MQVJHRUZJTEVfU1VQUE9SVAorLyoKKyAgRklYTUU6IG9uIHdpbmRvd3MgcGxhdGZvcm1zOgorICAgLSBQeXRob24gdXNlIFBZX0xPTkdfTE9ORyghKSBmb3IgUHlfb2ZmX3QgKF9maWxlaW8uYyk7CisgICAtIEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQgaXMgZGVmaW5lZCBpbiBQQy9weWNvbmZpZy5oOworICAgLSBQQy9weWNvbmZpZy5oIGRlZmluZSA0IGZvciBTSVpFT0ZfT0ZGX1QgYW5kIDggZm9yIFNJWkVPRl9GUE9TX1Q7CisgICAtIElmIEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQgaXNuJ3QgZGVmaW5lZCBweXRob24gd2lsbCB1c2Ugb2ZmX3QoISkKKyAgIGZvciBQeV9vZmZfdCAoc2VlIGZpbGVvYmplY3RzLmMgYW5kIGJ6Mm1vZHVsZS5jKS4KKyAgU2luY2UgZm9yIG1pbmd3IGNvbmZpZ3VyZSBkZXRlY3QgNCBmb3Igc2l6ZSBvZiAib2ZmX3QiIGFuZCA4IC0gZm9yCisgICJmcG9zX3QiIHdlIGhhcyB0byBkZWZpbmUgSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCB0b28uCisgIFRPRE86IHRvIHRlc3Qgd2l0aCBBQ19TWVNfTEFSR0VGSUxFIGFuZCBhcHByb3ByaWF0ZSB1cGRhdGVzIGluCisgIHB5dGhvbiBjb2RlLgorKi8KKyMgIGRlZmluZSBIQVZFX0xBUkdFRklMRV9TVVBQT1JUCisjZW5kaWYKKworI2lmIGRlZmluZWQoUHlfRU5BQkxFX1NIQVJFRCkKKyMgIGRlZmluZSBNU19DT1JFRExMIDEgLyogZGVwcmVjYXRlZCBvbGQgc3ltYm9sLCBidXQgc3RpbGwgaW4gdXNlIGZvciB3aW5kb3dzIGNvZGUgKi8KKyNlbHNlCisjICBkZWZpbmUgTVNfTk9fQ09SRURMTCAxCisjZW5kaWYKKworI2lmIFB5X1VOSUNPREVfU0laRSA9PSAyCisvKiBGb3IgbWluZ3cgaXMgMiBidXQgRklYTUU6IFdoYXQgYWJvdXQgdG8gcmFpc2UgZXJyb3IgaW4gY29uZmlndXJlIGlmCisgICB1bmljb2RlIHNpemUgaXNuJ3QgdHdvID8gRGlkIHB5dGhvbiB3aW5kb3dzIGNvZGUgc3VwcG9ydCB1Y3M0ID8gKi8KKyMgIGRlZmluZSBQeV9XSU5fV0lERV9GSUxFTkFNRVMKKyNlbmRpZgorCisvKiBOT1RFOiBEb24ndCBkZWZpbmUgSEFWRV9TVERERUZfSC4KKyAqIEl0IGlzIGRlZmluZWQgYnkgUEMvcHljb25maWcuaCBhbmQgdXNlZCBieSBJbmNsdWRlL1B5dGhvbi5oCisgKiAod2l0aCBjb21tZW50IEZvciBzaXplX3Q/KSBidXQgaXNuJ3QgcmVxdWlyZWQgZm9yIG1pbmd3ICAqLworI2RlZmluZSBQeV9TT0NLRVRfRkRfQ0FOX0JFX0dFX0ZEX1NFVFNJWkUKKworLyogQWxsIG90aGVyIGRlZmluZXMgZnJvbSBQQy9weWNvbmZpZy5oIGFyZSBpbiBhdXRvY29uZiBnZW5lcmF0ZWQKKyAgIHB5Y29uZmlnLmggKi8KKyNpZiAwCisvKkZJWE1FOgorICBNU0ROOgorICAgICJUaGUgZ2V0YWRkcmluZm8gZnVuY3Rpb24gd2FzIGFkZGVkIHRvIHRoZSB3czJfMzIuZGxsIG9uIFdpbmRvd3MgWFAKKyAgICBhbmQgbGF0ZXIuIgorICBtaW5ndzoKKyAgICBnZXRhZGRyaW5mbyBhbmQgZ2V0bmFtZWluZm8gaXMgZGVmaW5lZCBmb3IgV0lOVkVSID49IDB4MDUwMS4KKyAgUEMvcHljb25maWcuaDoKKyAgICAiUHl0aG9uIDIuNisgcmVxdWlyZXMgV2luZG93cyAyMDAwIG9yIGdyZWF0ZXIiCisgIFNvIGZhciBzbyBnb29kIGJ1dCBzb2NrZXRtb2R1bGUuaCBkZWZpbmUgSEFWRV9HRVRBRERSSU5GTyBhbmQKKyAgSEFWRV9HRVROQU1FSU5GTyB1bmRlciB2ZXJ5IHNwZWNpZmljIGNvbmRpdGlvbiA6CisgICAgIyBpZmRlZiBTSU9fR0VUX01VTFRJQ0FTVF9GSUxURVIKKyAgICAjICBpbmNsdWRlIDxNU1RjcElQLmg+CisgIFNvIHRoZSBxdWVzdGlvbiBpcyAiU2VwYXJhdGUgU0RLcyIgcmVxdWlyZWQgZm9yIHcyayBpbiBNU1ZDIGJ1aWxkID8KKyAgVE9ETzogcmVzb2x2ZSBsYXRlciwgbWF5IGJ5IGNvbmZpZ3VyZSA6LS8uIEZvciBub3cgcHl0aG9uIGNvZGUgd2lsbAorICB1c2UgZmFrZSBpbXBsZW1lbnRhdGlvbiBhbmQgaWYgdXNlciBkZWZpbmUgYXBwcm9wcmlhdGUgdmFsdWUgZm9yCisgIFdJTlZFUiAtIHRoZSBmdW5jdGlvbmFzIGZyb20gQyBydW50aW1lLgorICBGb3IgZGV0YWlscyBzZWUgc29ja2V0bW9kdWxlLmMgLgorICAqLworI2lmbmRlZiBIQVZFX0dFVEFERFJJTkZPCisjICBkZWZpbmUgSEFWRV9HRVRBRERSSU5GTworI2VuZGlmCisjaWZuZGVmIEhBVkVfR0VUTkFNRUlORk8KKyMgIGRlZmluZSBIQVZFX0dFVE5BTUVJTkZPCisjZW5kaWYKKyNlbmRpZgorCisvKiBSZWZlciB0byA8TW9kdWxlcy9fbWF0aC5oPiAuCisgICBGb3IgbWluZ3cgaG9zdCBjb25maWd1cmUgZGV0ZWN0IGZ1bmN0aW9ucyBkZXNjcmliZWQgYXMgSEFWRV9YWFgKKyAgIGluIF9tYXRoLmggYnV0IGFzIE1TVkMgZG9uJ3QgZGVmaW5lIHRoZW0gd2Ugd2lsbCB1bmRlZmluZSBIQVZFX1hYWAorICAgdG9vIHRvIHVzZSBfUHlfKiByZXBsYWNlbWVudHMgc2FtZSBhcyBNU1ZDIGJ1aWxkIC4KKyAqLworI3VuZGVmIEhBVkVfQUNPU0gKKyN1bmRlZiBIQVZFX0FTSU5ICisjdW5kZWYgSEFWRV9BVEFOSAorI3VuZGVmIEhBVkVfRVhQTTEKKyN1bmRlZiBIQVZFX0xPRzFQCisKKyNlbmRpZiAvKmRlZiBfX01JTkdXMzJfXyovCisKKy8qIE9uIDQuNEJTRC1kZXNjZW5kYW50cywgY3R5cGUgZnVuY3Rpb25zIHNlcnZlcyB0aGUgd2hvbGUgcmFuZ2Ugb2YKKyAqIHdjaGFyX3QgY2hhcmFjdGVyIHNldCByYXRoZXIgdGhhbiBzaW5nbGUgYnl0ZSBjb2RlIHBvaW50cyBvbmx5LgorICogVGhpcyBjaGFyYWN0ZXJpc3RpYyBjYW4gYnJlYWsgc29tZSBvcGVyYXRpb25zIG9mIHN0cmluZyBvYmplY3QKKyAqIGluY2x1ZGluZyBzdHIudXBwZXIoKSBhbmQgc3RyLnNwbGl0KCkgb24gVVRGLTggbG9jYWxlcy4gIFRoaXMKKyAqIHdvcmthcm91bmQgd2FzIHByb3ZpZGVkIGJ5IFRpbSBSb2JiaW5zIG9mIEZyZWVCU0QgcHJvamVjdC4KKyAqLworCisjaWZkZWYgX19GcmVlQlNEX18KKyNpbmNsdWRlIDxvc3JlbGRhdGUuaD4KKyNpZiBfX0ZyZWVCU0RfdmVyc2lvbiA+IDUwMDAzOQorIyBkZWZpbmUgX1BZX1BPUlRfQ1RZUEVfVVRGOF9JU1NVRQorI2VuZGlmCisjZW5kaWYKKworCisjaWYgZGVmaW5lZChfX0FQUExFX18pCisjIGRlZmluZSBfUFlfUE9SVF9DVFlQRV9VVEY4X0lTU1VFCisjZW5kaWYKKworI2lmZGVmIF9QWV9QT1JUX0NUWVBFX1VURjhfSVNTVUUKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHdjdHlwZS5oPgorI3VuZGVmIGlzYWxudW0KKyNkZWZpbmUgaXNhbG51bShjKSBpc3dhbG51bShidG93YyhjKSkKKyN1bmRlZiBpc2FscGhhCisjZGVmaW5lIGlzYWxwaGEoYykgaXN3YWxwaGEoYnRvd2MoYykpCisjdW5kZWYgaXNsb3dlcgorI2RlZmluZSBpc2xvd2VyKGMpIGlzd2xvd2VyKGJ0b3djKGMpKQorI3VuZGVmIGlzc3BhY2UKKyNkZWZpbmUgaXNzcGFjZShjKSBpc3dzcGFjZShidG93YyhjKSkKKyN1bmRlZiBpc3VwcGVyCisjZGVmaW5lIGlzdXBwZXIoYykgaXN3dXBwZXIoYnRvd2MoYykpCisjdW5kZWYgdG9sb3dlcgorI2RlZmluZSB0b2xvd2VyKGMpIHRvd2xvd2VyKGJ0b3djKGMpKQorI3VuZGVmIHRvdXBwZXIKKyNkZWZpbmUgdG91cHBlcihjKSB0b3d1cHBlcihidG93YyhjKSkKKyNlbmRpZgorCisKKy8qIERlY2xhcmF0aW9ucyBmb3Igc3ltYm9sIHZpc2liaWxpdHkuCisKKyAgUHlBUElfRlVOQyh0eXBlKTogRGVjbGFyZXMgYSBwdWJsaWMgUHl0aG9uIEFQSSBmdW5jdGlvbiBhbmQgcmV0dXJuIHR5cGUKKyAgUHlBUElfREFUQSh0eXBlKTogRGVjbGFyZXMgcHVibGljIFB5dGhvbiBkYXRhIGFuZCBpdHMgdHlwZQorICBQeU1PRElOSVRfRlVOQzogICBBIFB5dGhvbiBtb2R1bGUgaW5pdCBmdW5jdGlvbi4gIElmIHRoZXNlIGZ1bmN0aW9ucyBhcmUKKyAgICAgICAgICAgICAgICAgICAgaW5zaWRlIHRoZSBQeXRob24gY29yZSwgdGhleSBhcmUgcHJpdmF0ZSB0byB0aGUgY29yZS4KKyAgICAgICAgICAgICAgICAgICAgSWYgaW4gYW4gZXh0ZW5zaW9uIG1vZHVsZSwgaXQgbWF5IGJlIGRlY2xhcmVkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgbGlua2FnZSBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtLgorCisgIEFzIGEgbnVtYmVyIG9mIHBsYXRmb3JtcyBzdXBwb3J0L3JlcXVpcmUgIl9fZGVjbHNwZWMoZGxsaW1wb3J0L2RsbGV4cG9ydCkiLAorICB3ZSBzdXBwb3J0IGEgSEFWRV9ERUNMU1BFQ19ETEwgbWFjcm8gdG8gc2F2ZSBkdXBsaWNhdGlvbi4KKyovCisKKy8qCisgIE1TVkMgd2luZG93cyBwb3J0IGlzIGhhbmRsZWQgaW4gUEMvcHljb25maWcuaC4KKworICBCZU9TLCBtaW5ndzMyIGFuZCBjeWd3aW4gdXNlIGF1dG9jb25mIGFuZCByZXF1aXJlIHNwZWNpYWwKKyAgbGlua2FnZSBoYW5kbGluZyBhbmQgYWxsIG9mIHRoZXNlIHVzZSBfX2RlY2xzcGVjKCkuCisqLworI2lmIGRlZmluZWQoX19DWUdXSU5fXykgfHwgZGVmaW5lZChfX01JTkdXMzJfXykgfHwgZGVmaW5lZChfX0JFT1NfXykKKyMgICAgICAgZGVmaW5lIEhBVkVfREVDTFNQRUNfRExMCisjZW5kaWYKKworLyogb25seSBnZXQgc3BlY2lhbCBsaW5rYWdlIGlmIGJ1aWx0IGFzIHNoYXJlZCBvciBwbGF0Zm9ybSBpcyBDeWd3aW4gKi8KKyNpZiBkZWZpbmVkKFB5X0VOQUJMRV9TSEFSRUQpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyMgICAgICAgaWYgZGVmaW5lZChIQVZFX0RFQ0xTUEVDX0RMTCkKKyMgICAgICAgICAgICAgICBpZmRlZiBQeV9CVUlMRF9DT1JFCisjICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlBUElfRlVOQyhSVFlQRSkgX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCisjICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlBUElfREFUQShSVFlQRSkgZXh0ZXJuIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQorICAgICAgICAvKiBtb2R1bGUgaW5pdCBmdW5jdGlvbnMgaW5zaWRlIHRoZSBjb3JlIG5lZWQgbm8gZXh0ZXJuYWwgbGlua2FnZSAqLworICAgICAgICAvKiBleGNlcHQgZm9yIEN5Z3dpbiB0byBoYW5kbGUgZW1iZWRkaW5nIChGSVhNRTogQmVPUyB0b28/KSAqLworIyAgICAgICAgICAgICAgICAgICAgICAgaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlNT0RJTklUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQKKyMgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgLyogX19DWUdXSU5fXyAqLworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAorIyAgICAgICAgICAgICAgICAgICAgICAgZW5kaWYgLyogX19DWUdXSU5fXyAqLworIyAgICAgICAgICAgICAgIGVsc2UgLyogUHlfQlVJTERfQ09SRSAqLworICAgICAgICAvKiBCdWlsZGluZyBhbiBleHRlbnNpb24gbW9kdWxlLCBvciBhbiBlbWJlZGRlZCBzaXR1YXRpb24gKi8KKyAgICAgICAgLyogcHVibGljIFB5dGhvbiBmdW5jdGlvbnMgYW5kIGRhdGEgYXJlIGltcG9ydGVkICovCisgICAgICAgIC8qIFVuZGVyIEN5Z3dpbiwgYXV0by1pbXBvcnQgZnVuY3Rpb25zIHRvIHByZXZlbnQgY29tcGlsYXRpb24gKi8KKyAgICAgICAgLyogZmFpbHVyZXMgc2ltaWxhciB0byB0aG9zZSBkZXNjcmliZWQgYXQgdGhlIGJvdHRvbSBvZiA0LjE6ICovCisgICAgICAgIC8qIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvZXh0ZW5kaW5nL3dpbmRvd3MuaHRtbCNhLWNvb2tib29rLWFwcHJvYWNoICovCisjICAgICAgICAgICAgICAgICAgICAgICBpZiAhZGVmaW5lZChfX0NZR1dJTl9fKSAmJiAhZGVmaW5lZChfX01JTkdXMzJfXykKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lIFB5QVBJX0ZVTkMoUlRZUEUpIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBSVFlQRQorIyAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlBUElfRlVOQyhSVFlQRSkgUlRZUEUKKyMgICAgICAgICAgICAgICAgICAgICAgIGVuZGlmIC8qICFfX0NZR1dJTl9fICAhX19NSU5HVzMyX18gKi8KKyAgICAgICAgICAgIC8qIE5PVEU6IFRoZSBpc3N1ZTM5NDUgImNvbXBpbGUgZXJyb3IgaW4gX2ZpbGVpby5jIChjeWd3aW4pIgorICAgICAgICAgICAgICogd2FzIHJlc29sdmVkIHdpdGggbW9kaWZpY2F0aW9uIG9mIGNvZGUuCisgICAgICAgICAgICAgKiBUaGlzIGlzc3VlIHdhcyByZXNvbHZlZCBmb3IgZ2NjKG1pbmd3KSB3aXRoIGVuYWJsaW5nIGF1dG8KKyAgICAgICAgICAgICAqIGltcG9ydCBmZWF0dXJlLiBTaW5jZSBfZmlsZWlvLmMgcHJvYmxlbSBub3cgZGlzYXBwZWFyIHRoZXJlCisgICAgICAgICAgICAgKiBpcyBubyBtb3JlIHJlYXNvbnMgdG8gYXZvaWQgZGxsaW1wb3J0IGZvciBnY2MobWluZ3cpLgorICAgICAgICAgICAgICovCisjICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlBUElfREFUQShSVFlQRSkgZXh0ZXJuIF9fZGVjbHNwZWMoZGxsaW1wb3J0KSBSVFlQRQorICAgICAgICAvKiBtb2R1bGUgaW5pdCBmdW5jdGlvbnMgb3V0c2lkZSB0aGUgY29yZSBtdXN0IGJlIGV4cG9ydGVkICovCisjICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlNT0RJTklUX0ZVTkMgZXh0ZXJuICJDIiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZAorIyAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBfX2NwbHVzcGx1cyAqLworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlNT0RJTklUX0ZVTkMgX19kZWNsc3BlYyhkbGxleHBvcnQpIHZvaWQKKyMgICAgICAgICAgICAgICAgICAgICAgIGVuZGlmIC8qIF9fY3BsdXNwbHVzICovCisjICAgICAgICAgICAgICAgZW5kaWYgLyogUHlfQlVJTERfQ09SRSAqLworIyAgICAgICBlbmRpZiAvKiBIQVZFX0RFQ0xTUEVDICovCisjZW5kaWYgLyogUHlfRU5BQkxFX1NIQVJFRCAqLworCisvKiBJZiBubyBleHRlcm5hbCBsaW5rYWdlIG1hY3JvcyBkZWZpbmVkIGJ5IG5vdywgY3JlYXRlIGRlZmF1bHRzICovCisjaWZuZGVmIFB5QVBJX0ZVTkMKKyMgICAgICAgZGVmaW5lIFB5QVBJX0ZVTkMoUlRZUEUpIFJUWVBFCisjZW5kaWYKKyNpZm5kZWYgUHlBUElfREFUQQorIyAgICAgICBkZWZpbmUgUHlBUElfREFUQShSVFlQRSkgZXh0ZXJuIFJUWVBFCisjZW5kaWYKKyNpZm5kZWYgUHlNT0RJTklUX0ZVTkMKKyMgICAgICAgaWYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyMgICAgICAgICAgICAgICBkZWZpbmUgUHlNT0RJTklUX0ZVTkMgZXh0ZXJuICJDIiB2b2lkCisjICAgICAgIGVsc2UgLyogX19jcGx1c3BsdXMgKi8KKyMgICAgICAgICAgICAgICBkZWZpbmUgUHlNT0RJTklUX0ZVTkMgdm9pZAorIyAgICAgICBlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworI2VuZGlmCisKKy8qIERlcHJlY2F0ZWQgRExfSU1QT1JUIGFuZCBETF9FWFBPUlQgbWFjcm9zICovCisjaWYgZGVmaW5lZChQeV9FTkFCTEVfU0hBUkVEKSAmJiBkZWZpbmVkIChIQVZFX0RFQ0xTUEVDX0RMTCkKKyMgICAgICAgaWYgZGVmaW5lZChQeV9CVUlMRF9DT1JFKQorIyAgICAgICAgICAgICAgIGRlZmluZSBETF9JTVBPUlQoUlRZUEUpIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQorIyAgICAgICAgICAgICAgIGRlZmluZSBETF9FWFBPUlQoUlRZUEUpIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBSVFlQRQorIyAgICAgICBlbHNlCisjICAgICAgICAgICAgICAgZGVmaW5lIERMX0lNUE9SVChSVFlQRSkgX19kZWNsc3BlYyhkbGxpbXBvcnQpIFJUWVBFCisjICAgICAgICAgICAgICAgZGVmaW5lIERMX0VYUE9SVChSVFlQRSkgX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCisjICAgICAgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgRExfRVhQT1JUCisjICAgICAgIGRlZmluZSBETF9FWFBPUlQoUlRZUEUpIFJUWVBFCisjZW5kaWYKKyNpZm5kZWYgRExfSU1QT1JUCisjICAgICAgIGRlZmluZSBETF9JTVBPUlQoUlRZUEUpIFJUWVBFCisjZW5kaWYKKy8qIEVuZCBvZiBkZXByZWNhdGVkIERMXyogbWFjcm9zICovCisKKy8qIElmIHRoZSBmZCBtYW5pcHVsYXRpb24gbWFjcm9zIGFyZW4ndCBkZWZpbmVkLAorICAgaGVyZSBpcyBhIHNldCB0aGF0IHNob3VsZCBkbyB0aGUgam9iICovCisKKyNpZiAwIC8qIGRpc2FibGVkIGFuZCBwcm9iYWJseSBvYnNvbGV0ZSAqLworCisjaWZuZGVmIEZEX1NFVFNJWkUKKyNkZWZpbmUgRkRfU0VUU0laRSAgICAgIDI1NgorI2VuZGlmCisKKyNpZm5kZWYgRkRfU0VUCisKK3R5cGVkZWYgbG9uZyBmZF9tYXNrOworCisjZGVmaW5lIE5GREJJVFMgKHNpemVvZihmZF9tYXNrKSAqIE5CQlkpICAgICAgICAvKiBiaXRzIHBlciBtYXNrICovCisjaWZuZGVmIGhvd21hbnkKKyNkZWZpbmUgaG93bWFueSh4LCB5KSAgICgoKHgpKygoeSktMSkpLyh5KSkKKyNlbmRpZiAvKiBob3dtYW55ICovCisKK3R5cGVkZWYgc3RydWN0IGZkX3NldCB7CisgICAgZmRfbWFzayAgICAgZmRzX2JpdHNbaG93bWFueShGRF9TRVRTSVpFLCBORkRCSVRTKV07Cit9IGZkX3NldDsKKworI2RlZmluZSBGRF9TRVQobiwgcCkgICAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdIHw9ICgxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZGVmaW5lIEZEX0NMUihuLCBwKSAgICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJj0gfigxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZGVmaW5lIEZEX0lTU0VUKG4sIHApICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJiAoMSA8PCAoKG4pICUgTkZEQklUUykpKQorI2RlZmluZSBGRF9aRVJPKHApICAgICAgbWVtc2V0KChjaGFyICopKHApLCAnXDAnLCBzaXplb2YoKihwKSkpCisKKyNlbmRpZiAvKiBGRF9TRVQgKi8KKworI2VuZGlmIC8qIGZkIG1hbmlwdWxhdGlvbiBtYWNyb3MgKi8KKworCisvKiBsaW1pdHMuaCBjb25zdGFudHMgdGhhdCBtYXkgYmUgbWlzc2luZyAqLworCisjaWZuZGVmIElOVF9NQVgKKyNkZWZpbmUgSU5UX01BWCAyMTQ3NDgzNjQ3CisjZW5kaWYKKworI2lmbmRlZiBMT05HX01BWAorI2lmIFNJWkVPRl9MT05HID09IDQKKyNkZWZpbmUgTE9OR19NQVggMFg3RkZGRkZGRkwKKyNlbGlmIFNJWkVPRl9MT05HID09IDgKKyNkZWZpbmUgTE9OR19NQVggMFg3RkZGRkZGRkZGRkZGRkZGTAorI2Vsc2UKKyNlcnJvciAiY291bGQgbm90IHNldCBMT05HX01BWCBpbiBweXBvcnQuaCIKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgTE9OR19NSU4KKyNkZWZpbmUgTE9OR19NSU4gKC1MT05HX01BWC0xKQorI2VuZGlmCisKKyNpZm5kZWYgTE9OR19CSVQKKyNkZWZpbmUgTE9OR19CSVQgKDggKiBTSVpFT0ZfTE9ORykKKyNlbmRpZgorCisjaWYgTE9OR19CSVQgIT0gOCAqIFNJWkVPRl9MT05HCisvKiAwNC1PY3QtMjAwMCBMT05HX0JJVCBpcyBhcHBhcmVudGx5IChtaXMpZGVmaW5lZCBhcyA2NCBvbiBzb21lIHJlY2VudAorICogMzItYml0IHBsYXRmb3JtcyB1c2luZyBnY2MuICBXZSB0cnkgdG8gY2F0Y2ggdGhhdCBoZXJlIGF0IGNvbXBpbGUtdGltZQorICogcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgaW50ZWdlciBtdWx0aXBsaWNhdGlvbiB0byB0cmlnZ2VyIGJvZ3VzCisgKiBvdmVyZmxvd3MuCisgKi8KKyNlcnJvciAiTE9OR19CSVQgZGVmaW5pdGlvbiBhcHBlYXJzIHdyb25nIGZvciBwbGF0Zm9ybSAoYmFkIGdjYy9nbGliYyBjb25maWc/KS4iCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLyoKKyAqIEhpZGUgR0NDIGF0dHJpYnV0ZXMgZnJvbSBjb21waWxlcnMgdGhhdCBkb24ndCBzdXBwb3J0IHRoZW0uCisgKi8KKyNpZiAoIWRlZmluZWQoX19HTlVDX18pIHx8IF9fR05VQ19fIDwgMiB8fCBcCisgICAgIChfX0dOVUNfXyA9PSAyICYmIF9fR05VQ19NSU5PUl9fIDwgNykgKSAmJiBcCisgICAgIWRlZmluZWQoUklTQ09TKQorI2RlZmluZSBQeV9HQ0NfQVRUUklCVVRFKHgpCisjZWxzZQorI2RlZmluZSBQeV9HQ0NfQVRUUklCVVRFKHgpIF9fYXR0cmlidXRlX18oeCkKKyNlbmRpZgorCisvKgorICogQWRkIFB5QXJnX1BhcnNlVHVwbGUgZm9ybWF0IHdoZXJlIGF2YWlsYWJsZS4KKyAqLworI2lmZGVmIEhBVkVfQVRUUklCVVRFX0ZPUk1BVF9QQVJTRVRVUExFCisjZGVmaW5lIFB5X0ZPUk1BVF9QQVJTRVRVUExFKGZ1bmMscDEscDIpIF9fYXR0cmlidXRlX18oKGZvcm1hdChmdW5jLHAxLHAyKSkpCisjZWxzZQorI2RlZmluZSBQeV9GT1JNQVRfUEFSU0VUVVBMRShmdW5jLHAxLHAyKQorI2VuZGlmCisKKy8qCisgKiBTcGVjaWZ5IGFsaWdubWVudCBvbiBjb21waWxlcnMgdGhhdCBzdXBwb3J0IGl0LgorICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gMworI2RlZmluZSBQeV9BTElHTkVEKHgpIF9fYXR0cmlidXRlX18oKGFsaWduZWQoeCkpKQorI2Vsc2UKKyNkZWZpbmUgUHlfQUxJR05FRCh4KQorI2VuZGlmCisKKy8qIEVsaW1pbmF0ZSBlbmQtb2YtbG9vcCBjb2RlIG5vdCByZWFjaGVkIHdhcm5pbmdzIGZyb20gU3VuUHJvIEMKKyAqIHdoZW4gdXNpbmcgZG97Li4ufXdoaWxlKDApIG1hY3JvcworICovCisjaWZkZWYgX19TVU5QUk9fQworI3ByYWdtYSBlcnJvcl9tZXNzYWdlcyAob2ZmLEVfRU5EX09GX0xPT1BfQ09ERV9OT1RfUkVBQ0hFRCkKKyNlbmRpZgorCisvKgorICogT2xkZXIgTWljcm9zb2Z0IGNvbXBpbGVycyBkb24ndCBzdXBwb3J0IHRoZSBDOTkgbG9uZyBsb25nIGxpdGVyYWwgc3VmZml4ZXMsCisgKiBzbyB0aGVzZSB3aWxsIGJlIGRlZmluZWQgaW4gUEMvcHljb25maWcuaCBmb3IgdGhvc2UgY29tcGlsZXJzLgorICovCisjaWZuZGVmIFB5X0xMCisjZGVmaW5lIFB5X0xMKHgpIHgjI0xMCisjZW5kaWYKKworI2lmbmRlZiBQeV9VTEwKKyNkZWZpbmUgUHlfVUxMKHgpIFB5X0xMKHgjI1UpCisjZW5kaWYKKworI2VuZGlmIC8qIFB5X1BZUE9SVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weXN0YXRlLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9weXN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjZmMzMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5c3RhdGUuaApAQCAtMCwwICsxLDIwMCBAQAorCisvKiBUaHJlYWQgYW5kIGludGVycHJldGVyIHN0YXRlIHN0cnVjdHVyZXMgYW5kIHRoZWlyIGludGVyZmFjZXMgKi8KKworCisjaWZuZGVmIFB5X1BZU1RBVEVfSAorI2RlZmluZSBQeV9QWVNUQVRFX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogU3RhdGUgc2hhcmVkIGJldHdlZW4gdGhyZWFkcyAqLworCitzdHJ1Y3QgX3RzOyAvKiBGb3J3YXJkICovCitzdHJ1Y3QgX2lzOyAvKiBGb3J3YXJkICovCisKK3R5cGVkZWYgc3RydWN0IF9pcyB7CisKKyAgICBzdHJ1Y3QgX2lzICpuZXh0OworICAgIHN0cnVjdCBfdHMgKnRzdGF0ZV9oZWFkOworCisgICAgUHlPYmplY3QgKm1vZHVsZXM7CisgICAgUHlPYmplY3QgKnN5c2RpY3Q7CisgICAgUHlPYmplY3QgKmJ1aWx0aW5zOworICAgIFB5T2JqZWN0ICptb2R1bGVzX3JlbG9hZGluZzsKKworICAgIFB5T2JqZWN0ICpjb2RlY19zZWFyY2hfcGF0aDsKKyAgICBQeU9iamVjdCAqY29kZWNfc2VhcmNoX2NhY2hlOworICAgIFB5T2JqZWN0ICpjb2RlY19lcnJvcl9yZWdpc3RyeTsKKworI2lmZGVmIEhBVkVfRExPUEVOCisgICAgaW50IGRsb3BlbmZsYWdzOworI2VuZGlmCisjaWZkZWYgV0lUSF9UU0MKKyAgICBpbnQgdHNjZHVtcDsKKyNlbmRpZgorCit9IFB5SW50ZXJwcmV0ZXJTdGF0ZTsKKworCisvKiBTdGF0ZSB1bmlxdWUgcGVyIHRocmVhZCAqLworCitzdHJ1Y3QgX2ZyYW1lOyAvKiBBdm9pZCBpbmNsdWRpbmcgZnJhbWVvYmplY3QuaCAqLworCisvKiBQeV90cmFjZWZ1bmMgcmV0dXJuIC0xIHdoZW4gcmFpc2luZyBhbiBleGNlcHRpb24sIG9yIDAgZm9yIHN1Y2Nlc3MuICovCit0eXBlZGVmIGludCAoKlB5X3RyYWNlZnVuYykoUHlPYmplY3QgKiwgc3RydWN0IF9mcmFtZSAqLCBpbnQsIFB5T2JqZWN0ICopOworCisvKiBUaGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCBmb3IgJ3doYXQnIGZvciB0cmFjZWZ1bmMgZnVuY3Rpb25zOiAqLworI2RlZmluZSBQeVRyYWNlX0NBTEwgMAorI2RlZmluZSBQeVRyYWNlX0VYQ0VQVElPTiAxCisjZGVmaW5lIFB5VHJhY2VfTElORSAyCisjZGVmaW5lIFB5VHJhY2VfUkVUVVJOIDMKKyNkZWZpbmUgUHlUcmFjZV9DX0NBTEwgNAorI2RlZmluZSBQeVRyYWNlX0NfRVhDRVBUSU9OIDUKKyNkZWZpbmUgUHlUcmFjZV9DX1JFVFVSTiA2CisKK3R5cGVkZWYgc3RydWN0IF90cyB7CisgICAgLyogU2VlIFB5dGhvbi9jZXZhbC5jIGZvciBjb21tZW50cyBleHBsYWluaW5nIG1vc3QgZmllbGRzICovCisKKyAgICBzdHJ1Y3QgX3RzICpuZXh0OworICAgIFB5SW50ZXJwcmV0ZXJTdGF0ZSAqaW50ZXJwOworCisgICAgc3RydWN0IF9mcmFtZSAqZnJhbWU7CisgICAgaW50IHJlY3Vyc2lvbl9kZXB0aDsKKyAgICAvKiAndHJhY2luZycga2VlcHMgdHJhY2sgb2YgdGhlIGV4ZWN1dGlvbiBkZXB0aCB3aGVuIHRyYWNpbmcvcHJvZmlsaW5nLgorICAgICAgIFRoaXMgaXMgdG8gcHJldmVudCB0aGUgYWN0dWFsIHRyYWNlL3Byb2ZpbGUgY29kZSBmcm9tIGJlaW5nIHJlY29yZGVkIGluCisgICAgICAgdGhlIHRyYWNlL3Byb2ZpbGUuICovCisgICAgaW50IHRyYWNpbmc7CisgICAgaW50IHVzZV90cmFjaW5nOworCisgICAgUHlfdHJhY2VmdW5jIGNfcHJvZmlsZWZ1bmM7CisgICAgUHlfdHJhY2VmdW5jIGNfdHJhY2VmdW5jOworICAgIFB5T2JqZWN0ICpjX3Byb2ZpbGVvYmo7CisgICAgUHlPYmplY3QgKmNfdHJhY2VvYmo7CisKKyAgICBQeU9iamVjdCAqY3VyZXhjX3R5cGU7CisgICAgUHlPYmplY3QgKmN1cmV4Y192YWx1ZTsKKyAgICBQeU9iamVjdCAqY3VyZXhjX3RyYWNlYmFjazsKKworICAgIFB5T2JqZWN0ICpleGNfdHlwZTsKKyAgICBQeU9iamVjdCAqZXhjX3ZhbHVlOworICAgIFB5T2JqZWN0ICpleGNfdHJhY2ViYWNrOworCisgICAgUHlPYmplY3QgKmRpY3Q7ICAvKiBTdG9yZXMgcGVyLXRocmVhZCBzdGF0ZSAqLworCisgICAgLyogdGlja19jb3VudGVyIGlzIGluY3JlbWVudGVkIHdoZW5ldmVyIHRoZSBjaGVja19pbnRlcnZhbCB0aWNrZXIKKyAgICAgKiByZWFjaGVzIHplcm8uIFRoZSBwdXJwb3NlIGlzIHRvIGdpdmUgYSB1c2VmdWwgbWVhc3VyZSBvZiB0aGUgbnVtYmVyCisgICAgICogb2YgaW50ZXJwcmV0ZWQgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIGluIGEgZ2l2ZW4gdGhyZWFkLiAgVGhpcworICAgICAqIGV4dHJlbWVseSBsaWdodHdlaWdodCBzdGF0aXN0aWMgY29sbGVjdG9yIG1heSBiZSBvZiBpbnRlcmVzdCB0bworICAgICAqIHByb2ZpbGVycyAobGlrZSBwc3ljby5qaXQoKSksIGFsdGhvdWdoIG5vdGhpbmcgaW4gdGhlIGNvcmUgdXNlcyBpdC4KKyAgICAgKi8KKyAgICBpbnQgdGlja19jb3VudGVyOworCisgICAgaW50IGdpbHN0YXRlX2NvdW50ZXI7CisKKyAgICBQeU9iamVjdCAqYXN5bmNfZXhjOyAvKiBBc3luY2hyb25vdXMgZXhjZXB0aW9uIHRvIHJhaXNlICovCisgICAgbG9uZyB0aHJlYWRfaWQ7IC8qIFRocmVhZCBpZCB3aGVyZSB0aGlzIHRzdGF0ZSB3YXMgY3JlYXRlZCAqLworCisgICAgaW50IHRyYXNoX2RlbGV0ZV9uZXN0aW5nOworICAgIFB5T2JqZWN0ICp0cmFzaF9kZWxldGVfbGF0ZXI7CisKKyAgICAvKiBYWFggc2lnbmFsIGhhbmRsZXJzIHNob3VsZCBhbHNvIGJlIGhlcmUgKi8KKworfSBQeVRocmVhZFN0YXRlOworCisKK1B5QVBJX0ZVTkMoUHlJbnRlcnByZXRlclN0YXRlICopIFB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXcodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5SW50ZXJwcmV0ZXJTdGF0ZV9DbGVhcihQeUludGVycHJldGVyU3RhdGUgKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5SW50ZXJwcmV0ZXJTdGF0ZV9EZWxldGUoUHlJbnRlcnByZXRlclN0YXRlICopOworCitQeUFQSV9GVU5DKFB5VGhyZWFkU3RhdGUgKikgUHlUaHJlYWRTdGF0ZV9OZXcoUHlJbnRlcnByZXRlclN0YXRlICopOworUHlBUElfRlVOQyhQeVRocmVhZFN0YXRlICopIF9QeVRocmVhZFN0YXRlX1ByZWFsbG9jKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5VGhyZWFkU3RhdGVfSW5pdChQeVRocmVhZFN0YXRlICopOworUHlBUElfRlVOQyh2b2lkKSBQeVRocmVhZFN0YXRlX0NsZWFyKFB5VGhyZWFkU3RhdGUgKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5VGhyZWFkU3RhdGVfRGVsZXRlKFB5VGhyZWFkU3RhdGUgKik7CisjaWZkZWYgV0lUSF9USFJFQUQKK1B5QVBJX0ZVTkModm9pZCkgUHlUaHJlYWRTdGF0ZV9EZWxldGVDdXJyZW50KHZvaWQpOworI2VuZGlmCisKK1B5QVBJX0ZVTkMoUHlUaHJlYWRTdGF0ZSAqKSBQeVRocmVhZFN0YXRlX0dldCh2b2lkKTsKK1B5QVBJX0ZVTkMoUHlUaHJlYWRTdGF0ZSAqKSBQeVRocmVhZFN0YXRlX1N3YXAoUHlUaHJlYWRTdGF0ZSAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlUaHJlYWRTdGF0ZV9HZXREaWN0KHZvaWQpOworUHlBUElfRlVOQyhpbnQpIFB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMobG9uZywgUHlPYmplY3QgKik7CisKKworLyogVmFyaWFibGUgYW5kIG1hY3JvIGZvciBpbi1saW5lIGFjY2VzcyB0byBjdXJyZW50IHRocmVhZCBzdGF0ZSAqLworCitQeUFQSV9EQVRBKFB5VGhyZWFkU3RhdGUgKikgX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKKworI2lmZGVmIFB5X0RFQlVHCisjZGVmaW5lIFB5VGhyZWFkU3RhdGVfR0VUKCkgUHlUaHJlYWRTdGF0ZV9HZXQoKQorI2Vsc2UKKyNkZWZpbmUgUHlUaHJlYWRTdGF0ZV9HRVQoKSAoX1B5VGhyZWFkU3RhdGVfQ3VycmVudCkKKyNlbmRpZgorCit0eXBlZGVmCisgICAgZW51bSB7UHlHSUxTdGF0ZV9MT0NLRUQsIFB5R0lMU3RhdGVfVU5MT0NLRUR9CisgICAgICAgIFB5R0lMU3RhdGVfU1RBVEU7CisKKy8qIEVuc3VyZSB0aGF0IHRoZSBjdXJyZW50IHRocmVhZCBpcyByZWFkeSB0byBjYWxsIHRoZSBQeXRob24KKyAgIEMgQVBJLCByZWdhcmRsZXNzIG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIFB5dGhvbiwgb3Igb2YgaXRzCisgICB0aHJlYWQgbG9jay4gIFRoaXMgbWF5IGJlIGNhbGxlZCBhcyBtYW55IHRpbWVzIGFzIGRlc2lyZWQKKyAgIGJ5IGEgdGhyZWFkIHNvIGxvbmcgYXMgZWFjaCBjYWxsIGlzIG1hdGNoZWQgd2l0aCBhIGNhbGwgdG8KKyAgIFB5R0lMU3RhdGVfUmVsZWFzZSgpLiAgSW4gZ2VuZXJhbCwgb3RoZXIgdGhyZWFkLXN0YXRlIEFQSXMgbWF5CisgICBiZSB1c2VkIGJldHdlZW4gX0Vuc3VyZSgpIGFuZCBfUmVsZWFzZSgpIGNhbGxzLCBzbyBsb25nIGFzIHRoZQorICAgdGhyZWFkLXN0YXRlIGlzIHJlc3RvcmVkIHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBiZWZvcmUgdGhlIFJlbGVhc2UoKS4KKyAgIEZvciBleGFtcGxlLCBub3JtYWwgdXNlIG9mIHRoZSBQeV9CRUdJTl9BTExPV19USFJFQURTLworICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMgbWFjcm9zIGFyZSBhY2NlcHRhYmxlLgorCisgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIG9wYXF1ZSAiaGFuZGxlIiB0byB0aGUgdGhyZWFkIHN0YXRlIHdoZW4KKyAgIFB5R0lMU3RhdGVfRW5zdXJlKCkgd2FzIGNhbGxlZCwgYW5kIG11c3QgYmUgcGFzc2VkIHRvCisgICBQeUdJTFN0YXRlX1JlbGVhc2UoKSB0byBlbnN1cmUgUHl0aG9uIGlzIGxlZnQgaW4gdGhlIHNhbWUgc3RhdGUuIEV2ZW4KKyAgIHRob3VnaCByZWN1cnNpdmUgY2FsbHMgYXJlIGFsbG93ZWQsIHRoZXNlIGhhbmRsZXMgY2FuICpub3QqIGJlIHNoYXJlZCAtCisgICBlYWNoIHVuaXF1ZSBjYWxsIHRvIFB5R0lMU3RhdGVfRW5zdXJlIG11c3Qgc2F2ZSB0aGUgaGFuZGxlIGZvciBpdHMKKyAgIGNhbGwgdG8gUHlHSUxTdGF0ZV9SZWxlYXNlLgorCisgICBXaGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLCB0aGUgY3VycmVudCB0aHJlYWQgd2lsbCBob2xkIHRoZSBHSUwuCisKKyAgIEZhaWx1cmUgaXMgYSBmYXRhbCBlcnJvci4KKyovCitQeUFQSV9GVU5DKFB5R0lMU3RhdGVfU1RBVEUpIFB5R0lMU3RhdGVfRW5zdXJlKHZvaWQpOworCisvKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgcHJldmlvdXNseSBhY3F1aXJlZC4gIEFmdGVyIHRoaXMgY2FsbCwgUHl0aG9uJ3MKKyAgIHN0YXRlIHdpbGwgYmUgdGhlIHNhbWUgYXMgaXQgd2FzIHByaW9yIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgICBQeUdJTFN0YXRlX0Vuc3VyZSgpIGNhbGwgKGJ1dCBnZW5lcmFsbHkgdGhpcyBzdGF0ZSB3aWxsIGJlIHVua25vd24gdG8KKyAgIHRoZSBjYWxsZXIsIGhlbmNlIHRoZSB1c2Ugb2YgdGhlIEdJTFN0YXRlIEFQSS4pCisKKyAgIEV2ZXJ5IGNhbGwgdG8gUHlHSUxTdGF0ZV9FbnN1cmUgbXVzdCBiZSBtYXRjaGVkIGJ5IGEgY2FsbCB0bworICAgUHlHSUxTdGF0ZV9SZWxlYXNlIG9uIHRoZSBzYW1lIHRocmVhZC4KKyovCitQeUFQSV9GVU5DKHZvaWQpIFB5R0lMU3RhdGVfUmVsZWFzZShQeUdJTFN0YXRlX1NUQVRFKTsKKworLyogSGVscGVyL2RpYWdub3N0aWMgZnVuY3Rpb24gLSBnZXQgdGhlIGN1cnJlbnQgdGhyZWFkIHN0YXRlIGZvcgorICAgdGhpcyB0aHJlYWQuICBNYXkgcmV0dXJuIE5VTEwgaWYgbm8gR0lMU3RhdGUgQVBJIGhhcyBiZWVuIHVzZWQKKyAgIG9uIHRoZSBjdXJyZW50IHRocmVhZC4gIE5vdGUgdGhhdCB0aGUgbWFpbiB0aHJlYWQgYWx3YXlzIGhhcyBzdWNoIGEKKyAgIHRocmVhZC1zdGF0ZSwgZXZlbiBpZiBubyBhdXRvLXRocmVhZC1zdGF0ZSBjYWxsIGhhcyBiZWVuIG1hZGUKKyAgIG9uIHRoZSBtYWluIHRocmVhZC4KKyovCitQeUFQSV9GVU5DKFB5VGhyZWFkU3RhdGUgKikgUHlHSUxTdGF0ZV9HZXRUaGlzVGhyZWFkU3RhdGUodm9pZCk7CisKKy8qIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzeXMuX2N1cnJlbnRfZnJhbWVzKCkgIFJldHVybnMgYSBkaWN0IG1hcHBpbmcKKyAgIHRocmVhZCBpZCB0byB0aGF0IHRocmVhZCdzIGN1cnJlbnQgZnJhbWUuCisqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlUaHJlYWRfQ3VycmVudEZyYW1lcyh2b2lkKTsKKworLyogUm91dGluZXMgZm9yIGFkdmFuY2VkIGRlYnVnZ2VycywgcmVxdWVzdGVkIGJ5IERhdmlkIEJlYXpsZXkuCisgICBEb24ndCB1c2UgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEgKi8KK1B5QVBJX0ZVTkMoUHlJbnRlcnByZXRlclN0YXRlICopIFB5SW50ZXJwcmV0ZXJTdGF0ZV9IZWFkKHZvaWQpOworUHlBUElfRlVOQyhQeUludGVycHJldGVyU3RhdGUgKikgUHlJbnRlcnByZXRlclN0YXRlX05leHQoUHlJbnRlcnByZXRlclN0YXRlICopOworUHlBUElfRlVOQyhQeVRocmVhZFN0YXRlICopIFB5SW50ZXJwcmV0ZXJTdGF0ZV9UaHJlYWRIZWFkKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqKTsKK1B5QVBJX0ZVTkMoUHlUaHJlYWRTdGF0ZSAqKSBQeVRocmVhZFN0YXRlX05leHQoUHlUaHJlYWRTdGF0ZSAqKTsKKwordHlwZWRlZiBzdHJ1Y3QgX2ZyYW1lICooKlB5VGhyZWFkRnJhbWVHZXR0ZXIpKFB5VGhyZWFkU3RhdGUgKnNlbGZfKTsKKworLyogaG9vayBmb3IgUHlFdmFsX0dldEZyYW1lKCksIHJlcXVlc3RlZCBmb3IgUHN5Y28gKi8KK1B5QVBJX0RBVEEoUHlUaHJlYWRGcmFtZUdldHRlcikgX1B5VGhyZWFkU3RhdGVfR2V0RnJhbWU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1BZU1RBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHlzdHJjbXAuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5c3RyY21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5YzdlNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5c3RyY21wLmgKQEAgLTAsMCArMSwyMyBAQAorI2lmbmRlZiBQeV9TVFJDTVBfSAorI2RlZmluZSBQeV9TVFJDTVBfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0ZVTkMoaW50KSBQeU9TX215c3RybmljbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIFB5X3NzaXplX3QpOworUHlBUElfRlVOQyhpbnQpIFB5T1NfbXlzdHJpY21wKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworI2lmIGRlZmluZWQoTVNfV0lORE9XUykgfHwgZGVmaW5lZChQWU9TX09TMikKKyNkZWZpbmUgUHlPU19zdHJuaWNtcCBzdHJuaWNtcAorI2RlZmluZSBQeU9TX3N0cmljbXAgc3RyaWNtcAorI2Vsc2UKKyNkZWZpbmUgUHlPU19zdHJuaWNtcCBQeU9TX215c3RybmljbXAKKyNkZWZpbmUgUHlPU19zdHJpY21wIFB5T1NfbXlzdHJpY21wCisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFQeV9TVFJDTVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHlzdHJ0b2QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5c3RydG9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjNDM0ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5c3RydG9kLmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBQeV9TVFJUT0RfSAorI2RlZmluZSBQeV9TVFJUT0RfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworUHlBUElfRlVOQyhkb3VibGUpIFB5T1NfYXNjaWlfc3RydG9kKGNvbnN0IGNoYXIgKnN0ciwgY2hhciAqKnB0cik7CitQeUFQSV9GVU5DKGRvdWJsZSkgUHlPU19hc2NpaV9hdG9mKGNvbnN0IGNoYXIgKnN0cik7CisKKy8qIERlcHJlY2F0ZWQgaW4gMi43IGFuZCAzLjEuIFdpbGwgZGlzYXBwZWFyIGluIDIuOCAoaWYgaXQgZXhpc3RzKSBhbmQgMy4yICovCitQeUFQSV9GVU5DKGNoYXIgKikgUHlPU19hc2NpaV9mb3JtYXRkKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1Zl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgZG91YmxlIGQpOworUHlBUElfRlVOQyhkb3VibGUpIFB5T1Nfc3RyaW5nX3RvX2RvdWJsZShjb25zdCBjaGFyICpzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiplbmRwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvdmVyZmxvd19leGNlcHRpb24pOworCisvKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIFB5TWVtX0ZyZWUgdG8gZnJlZSB0aGUgYnVmZmVyCisgICB0aGF0J3MgaXMgcmV0dXJuZWQuICovCitQeUFQSV9GVU5DKGNoYXIgKikgUHlPU19kb3VibGVfdG9fc3RyaW5nKGRvdWJsZSB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgZm9ybWF0X2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0eXBlKTsKKworUHlBUElfRlVOQyhkb3VibGUpIF9QeV9wYXJzZV9pbmZfb3JfbmFuKGNvbnN0IGNoYXIgKnAsIGNoYXIgKiplbmRwdHIpOworCisKKy8qIFB5T1NfZG91YmxlX3RvX3N0cmluZydzICJmbGFncyIgcGFyYW1ldGVyIGNhbiBiZSBzZXQgdG8gMCBvciBtb3JlIG9mOiAqLworI2RlZmluZSBQeV9EVFNGX1NJR04gICAgICAweDAxIC8qIGFsd2F5cyBhZGQgdGhlIHNpZ24gKi8KKyNkZWZpbmUgUHlfRFRTRl9BRERfRE9UXzAgMHgwMiAvKiBpZiB0aGUgcmVzdWx0IGlzIGFuIGludGVnZXIgYWRkICIuMCIgKi8KKyNkZWZpbmUgUHlfRFRTRl9BTFQgICAgICAgMHgwNCAvKiAiYWx0ZXJuYXRlIiBmb3JtYXR0aW5nLiBpdCdzIGZvcm1hdF9jb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgKi8KKworLyogUHlPU19kb3VibGVfdG9fc3RyaW5nJ3MgInR5cGUiLCBpZiBub24tTlVMTCwgd2lsbCBiZSBzZXQgdG8gb25lIG9mOiAqLworI2RlZmluZSBQeV9EVFNUX0ZJTklURSAwCisjZGVmaW5lIFB5X0RUU1RfSU5GSU5JVEUgMQorI2RlZmluZSBQeV9EVFNUX05BTiAyCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhUHlfU1RSVE9EX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3B5dGhvbnJ1bi5oIGIvaW5jbHVkZS9weXRob24yLjcvcHl0aG9ucnVuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmYzE3NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5dGhvbnJ1bi5oCkBAIC0wLDAgKzEsMTgxIEBACisKKy8qIEludGVyZmFjZXMgdG8gcGFyc2UgYW5kIGV4ZWN1dGUgcGllY2VzIG9mIHB5dGhvbiBjb2RlICovCisKKyNpZm5kZWYgUHlfUFlUSE9OUlVOX0gKKyNkZWZpbmUgUHlfUFlUSE9OUlVOX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBQeUNGX01BU0sgKENPX0ZVVFVSRV9ESVZJU0lPTiB8IENPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQgfCBcCisgICAgICAgICAgICAgICAgICAgQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UIHwgQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OIHwgXAorICAgICAgICAgICAgICAgICAgIENPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTKQorI2RlZmluZSBQeUNGX01BU0tfT0JTT0xFVEUgKENPX05FU1RFRCkKKyNkZWZpbmUgUHlDRl9TT1VSQ0VfSVNfVVRGOCAgMHgwMTAwCisjZGVmaW5lIFB5Q0ZfRE9OVF9JTVBMWV9ERURFTlQgMHgwMjAwCisjZGVmaW5lIFB5Q0ZfT05MWV9BU1QgMHgwNDAwCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgY2ZfZmxhZ3M7ICAvKiBiaXRtYXNrIG9mIENPX3h4eCBmbGFncyByZWxldmFudCB0byBmdXR1cmUgKi8KK30gUHlDb21waWxlckZsYWdzOworCitQeUFQSV9GVU5DKHZvaWQpIFB5X1NldFByb2dyYW1OYW1lKGNoYXIgKik7CitQeUFQSV9GVU5DKGNoYXIgKikgUHlfR2V0UHJvZ3JhbU5hbWUodm9pZCk7CisKK1B5QVBJX0ZVTkModm9pZCkgUHlfU2V0UHl0aG9uSG9tZShjaGFyICopOworUHlBUElfRlVOQyhjaGFyICopIFB5X0dldFB5dGhvbkhvbWUodm9pZCk7CisKK1B5QVBJX0ZVTkModm9pZCkgUHlfSW5pdGlhbGl6ZSh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlfSW5pdGlhbGl6ZUV4KGludCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5X0ZpbmFsaXplKHZvaWQpOworUHlBUElfRlVOQyhpbnQpIFB5X0lzSW5pdGlhbGl6ZWQodm9pZCk7CitQeUFQSV9GVU5DKFB5VGhyZWFkU3RhdGUgKikgUHlfTmV3SW50ZXJwcmV0ZXIodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5X0VuZEludGVycHJldGVyKFB5VGhyZWFkU3RhdGUgKik7CisKK1B5QVBJX0ZVTkMoaW50KSBQeVJ1bl9BbnlGaWxlRmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosIFB5Q29tcGlsZXJGbGFncyAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVJ1bl9BbnlGaWxlRXhGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwgaW50LCBQeUNvbXBpbGVyRmxhZ3MgKik7CitQeUFQSV9GVU5DKGludCkgUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqLCBQeUNvbXBpbGVyRmxhZ3MgKik7CitQeUFQSV9GVU5DKGludCkgUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosIGludCwgUHlDb21waWxlckZsYWdzICopOworUHlBUElfRlVOQyhpbnQpIFB5UnVuX0ludGVyYWN0aXZlT25lRmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosIFB5Q29tcGlsZXJGbGFncyAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwgUHlDb21waWxlckZsYWdzICopOworCitQeUFQSV9GVU5DKHN0cnVjdCBfbW9kICopIFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKik7CitQeUFQSV9GVU5DKHN0cnVjdCBfbW9kICopIFB5UGFyc2VyX0FTVEZyb21GaWxlKEZJTEUgKiwgY29uc3QgY2hhciAqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKiwgaW50ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKik7CisjZGVmaW5lIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nKFMsIEIpIFwKKyAgICBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzKFMsIEIsIDApCisjZGVmaW5lIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZShGUCwgUywgQikgXAorICAgIFB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZUZsYWdzKEZQLCBTLCBCLCAwKQorUHlBUElfRlVOQyhzdHJ1Y3QgX25vZGUgKikgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFncyhjb25zdCBjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpOworUHlBUElfRlVOQyhzdHJ1Y3QgX25vZGUgKikgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwgaW50KTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVJ1bl9TdHJpbmdGbGFncyhjb25zdCBjaGFyICosIGludCwgUHlPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlDb21waWxlckZsYWdzICopOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5UnVuX0ZpbGVFeEZsYWdzKEZJTEUgKiwgY29uc3QgY2hhciAqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICopOworCisjZGVmaW5lIFB5X0NvbXBpbGVTdHJpbmcoc3RyLCBwLCBzKSBQeV9Db21waWxlU3RyaW5nRmxhZ3Moc3RyLCBwLCBzLCBOVUxMKQorUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeV9Db21waWxlU3RyaW5nRmxhZ3MoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqKTsKK1B5QVBJX0ZVTkMoc3RydWN0IHN5bXRhYmxlICopIFB5X1N5bXRhYmxlU3RyaW5nKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBpbnQpOworCitQeUFQSV9GVU5DKHZvaWQpIFB5RXJyX1ByaW50KHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeUVycl9QcmludEV4KGludCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5RXJyX0Rpc3BsYXkoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKK1B5QVBJX0ZVTkMoaW50KSBQeV9BdEV4aXQodm9pZCAoKmZ1bmMpKHZvaWQpKTsKKworUHlBUElfRlVOQyh2b2lkKSBQeV9FeGl0KGludCk7CisKK1B5QVBJX0ZVTkMoaW50KSBQeV9GZElzSW50ZXJhY3RpdmUoRklMRSAqLCBjb25zdCBjaGFyICopOworCisvKiBCb290c3RyYXAgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeV9NYWluKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKy8qIFVzZSBtYWNyb3MgZm9yIGEgYnVuY2ggb2Ygb2xkIHZhcmlhbnRzICovCisjZGVmaW5lIFB5UnVuX1N0cmluZyhzdHIsIHMsIGcsIGwpIFB5UnVuX1N0cmluZ0ZsYWdzKHN0ciwgcywgZywgbCwgTlVMTCkKKyNkZWZpbmUgUHlSdW5fQW55RmlsZShmcCwgbmFtZSkgUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIE5VTEwpCisjZGVmaW5lIFB5UnVuX0FueUZpbGVFeChmcCwgbmFtZSwgY2xvc2VpdCkgXAorICAgIFB5UnVuX0FueUZpbGVFeEZsYWdzKGZwLCBuYW1lLCBjbG9zZWl0LCBOVUxMKQorI2RlZmluZSBQeVJ1bl9BbnlGaWxlRmxhZ3MoZnAsIG5hbWUsIGZsYWdzKSBcCisgICAgUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIDAsIGZsYWdzKQorI2RlZmluZSBQeVJ1bl9TaW1wbGVTdHJpbmcocykgUHlSdW5fU2ltcGxlU3RyaW5nRmxhZ3MocywgTlVMTCkKKyNkZWZpbmUgUHlSdW5fU2ltcGxlRmlsZShmLCBwKSBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyhmLCBwLCAwLCBOVUxMKQorI2RlZmluZSBQeVJ1bl9TaW1wbGVGaWxlRXgoZiwgcCwgYykgUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoZiwgcCwgYywgTlVMTCkKKyNkZWZpbmUgUHlSdW5fSW50ZXJhY3RpdmVPbmUoZiwgcCkgUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyhmLCBwLCBOVUxMKQorI2RlZmluZSBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3AoZiwgcCkgUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MoZiwgcCwgTlVMTCkKKyNkZWZpbmUgUHlSdW5fRmlsZShmcCwgcCwgcywgZywgbCkgXAorICAgIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCAwLCBOVUxMKQorI2RlZmluZSBQeVJ1bl9GaWxlRXgoZnAsIHAsIHMsIGcsIGwsIGMpIFwKKyAgICBQeVJ1bl9GaWxlRXhGbGFncyhmcCwgcCwgcywgZywgbCwgYywgTlVMTCkKKyNkZWZpbmUgUHlSdW5fRmlsZUZsYWdzKGZwLCBwLCBzLCBnLCBsLCBmbGFncykgXAorICAgIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCAwLCBmbGFncykKKworLyogSW4gZ2V0cGF0aC5jICovCitQeUFQSV9GVU5DKGNoYXIgKikgUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKHZvaWQpOworUHlBUElfRlVOQyhjaGFyICopIFB5X0dldFByZWZpeCh2b2lkKTsKK1B5QVBJX0ZVTkMoY2hhciAqKSBQeV9HZXRFeGVjUHJlZml4KHZvaWQpOworUHlBUElfRlVOQyhjaGFyICopIFB5X0dldFBhdGgodm9pZCk7CisKKy8qIEluIHRoZWlyIG93biBmaWxlcyAqLworUHlBUElfRlVOQyhjb25zdCBjaGFyICopIFB5X0dldFZlcnNpb24odm9pZCk7CitQeUFQSV9GVU5DKGNvbnN0IGNoYXIgKikgUHlfR2V0UGxhdGZvcm0odm9pZCk7CitQeUFQSV9GVU5DKGNvbnN0IGNoYXIgKikgUHlfR2V0Q29weXJpZ2h0KHZvaWQpOworUHlBUElfRlVOQyhjb25zdCBjaGFyICopIFB5X0dldENvbXBpbGVyKHZvaWQpOworUHlBUElfRlVOQyhjb25zdCBjaGFyICopIFB5X0dldEJ1aWxkSW5mbyh2b2lkKTsKK1B5QVBJX0ZVTkMoY29uc3QgY2hhciAqKSBfUHlfc3ZudmVyc2lvbih2b2lkKTsKK1B5QVBJX0ZVTkMoY29uc3QgY2hhciAqKSBQeV9TdWJ2ZXJzaW9uUmV2aXNpb24odm9pZCk7CitQeUFQSV9GVU5DKGNvbnN0IGNoYXIgKikgUHlfU3VidmVyc2lvblNob3J0QnJhbmNoKHZvaWQpOworUHlBUElfRlVOQyhjb25zdCBjaGFyICopIF9QeV9oZ2lkZW50aWZpZXIodm9pZCk7CitQeUFQSV9GVU5DKGNvbnN0IGNoYXIgKikgX1B5X2hndmVyc2lvbih2b2lkKTsKKworLyogSW50ZXJuYWwgLS0gdmFyaW91cyBvbmUtdGltZSBpbml0aWFsaXphdGlvbnMgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5QnVpbHRpbl9Jbml0KHZvaWQpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlTeXNfSW5pdCh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5SW1wb3J0X0luaXQodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeUV4Y19Jbml0KHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBfUHlJbXBvcnRIb29rc19Jbml0KHZvaWQpOworUHlBUElfRlVOQyhpbnQpIF9QeUZyYW1lX0luaXQodm9pZCk7CitQeUFQSV9GVU5DKGludCkgX1B5SW50X0luaXQodm9pZCk7CitQeUFQSV9GVU5DKGludCkgX1B5TG9uZ19Jbml0KHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBfUHlGbG9hdF9Jbml0KHZvaWQpOworUHlBUElfRlVOQyhpbnQpIFB5Qnl0ZUFycmF5X0luaXQodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeVJhbmRvbV9Jbml0KHZvaWQpOworCisvKiBWYXJpb3VzIGludGVybmFsIGZpbmFsaXplcnMgKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5RXhjX0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeUltcG9ydF9GaW5pKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeU1ldGhvZF9GaW5pKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeUZyYW1lX0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5Q0Z1bmN0aW9uX0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5RGljdF9GaW5pKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeVR1cGxlX0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5TGlzdF9GaW5pKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeVNldF9GaW5pKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeVN0cmluZ19GaW5pKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeUludF9GaW5pKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeUZsb2F0X0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5T1NfRmluaUludGVycnVwdHModm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5Qnl0ZUFycmF5X0Zpbmkodm9pZCk7CisKKy8qIFN0dWZmIHdpdGggbm8gcHJvcGVyIGhvbWUgKHlldCkgKi8KK1B5QVBJX0ZVTkMoY2hhciAqKSBQeU9TX1JlYWRsaW5lKEZJTEUgKiwgRklMRSAqLCBjaGFyICopOworUHlBUElfREFUQShpbnQpICgqUHlPU19JbnB1dEhvb2spKHZvaWQpOworUHlBUElfREFUQShjaGFyKSAqKCpQeU9TX1JlYWRsaW5lRnVuY3Rpb25Qb2ludGVyKShGSUxFICosIEZJTEUgKiwgY2hhciAqKTsKK1B5QVBJX0RBVEEoUHlUaHJlYWRTdGF0ZSopIF9QeU9TX1JlYWRsaW5lVFN0YXRlOworCisvKiBTdGFjayBzaXplLCBpbiAicG9pbnRlcnMiIChzbyB3ZSBnZXQgZXh0cmEgc2FmZXR5IG1hcmdpbnMKKyAgIG9uIDY0LWJpdCBwbGF0Zm9ybXMpLiAgT24gYSAzMi1iaXQgcGxhdGZvcm0sIHRoaXMgdHJhbnNsYXRlcworICAgdG8gYSA4ayBtYXJnaW4uICovCisjZGVmaW5lIFBZT1NfU1RBQ0tfTUFSR0lOIDIwNDgKKworI2lmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKE1TX1dJTjY0KSAmJiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA+PSAxMzAwCisvKiBFbmFibGUgc3RhY2sgY2hlY2tpbmcgdW5kZXIgTWljcm9zb2Z0IEMgKi8KKyNkZWZpbmUgVVNFX1NUQUNLQ0hFQ0sKKyNlbmRpZgorCisjaWZkZWYgVVNFX1NUQUNLQ0hFQ0sKKy8qIENoZWNrIHRoYXQgd2UgYXJlbid0IG92ZXJmbG93aW5nIG91ciBzdGFjayAqLworUHlBUElfRlVOQyhpbnQpIFB5T1NfQ2hlY2tTdGFjayh2b2lkKTsKKyNlbmRpZgorCisvKiBTaWduYWxzICovCit0eXBlZGVmIHZvaWQgKCpQeU9TX3NpZ2hhbmRsZXJfdCkoaW50KTsKK1B5QVBJX0ZVTkMoUHlPU19zaWdoYW5kbGVyX3QpIFB5T1NfZ2V0c2lnKGludCk7CitQeUFQSV9GVU5DKFB5T1Nfc2lnaGFuZGxlcl90KSBQeU9TX3NldHNpZyhpbnQsIFB5T1Nfc2lnaGFuZGxlcl90KTsKKworLyogUmFuZG9tICovCitQeUFQSV9GVU5DKGludCkgX1B5T1NfVVJhbmRvbSAodm9pZCAqYnVmZmVyLCBQeV9zc2l6ZV90IHNpemUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9QWVRIT05SVU5fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHl0aHJlYWQuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5dGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkNjE1NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5dGhyZWFkLmgKQEAgLTAsMCArMSw0MSBAQAorCisjaWZuZGVmIFB5X1BZVEhSRUFEX0gKKyNkZWZpbmUgUHlfUFlUSFJFQURfSAorCit0eXBlZGVmIHZvaWQgKlB5VGhyZWFkX3R5cGVfbG9jazsKK3R5cGVkZWYgdm9pZCAqUHlUaHJlYWRfdHlwZV9zZW1hOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0ZVTkModm9pZCkgUHlUaHJlYWRfaW5pdF90aHJlYWQodm9pZCk7CitQeUFQSV9GVU5DKGxvbmcpIFB5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQodm9pZCAoKikodm9pZCAqKSwgdm9pZCAqKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlUaHJlYWRfZXhpdF90aHJlYWQodm9pZCk7CitQeUFQSV9GVU5DKGxvbmcpIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQodm9pZCk7CisKK1B5QVBJX0ZVTkMoUHlUaHJlYWRfdHlwZV9sb2NrKSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeVRocmVhZF9mcmVlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVRocmVhZF9hY3F1aXJlX2xvY2soUHlUaHJlYWRfdHlwZV9sb2NrLCBpbnQpOworI2RlZmluZSBXQUlUX0xPQ0sJMQorI2RlZmluZSBOT1dBSVRfTE9DSwkwCitQeUFQSV9GVU5DKHZvaWQpIFB5VGhyZWFkX3JlbGVhc2VfbG9jayhQeVRocmVhZF90eXBlX2xvY2spOworCitQeUFQSV9GVU5DKHNpemVfdCkgUHlUaHJlYWRfZ2V0X3N0YWNrc2l6ZSh2b2lkKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVRocmVhZF9zZXRfc3RhY2tzaXplKHNpemVfdCk7CisKKy8qIFRocmVhZCBMb2NhbCBTdG9yYWdlIChUTFMpIEFQSSAqLworUHlBUElfRlVOQyhpbnQpIFB5VGhyZWFkX2NyZWF0ZV9rZXkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5VGhyZWFkX2RlbGV0ZV9rZXkoaW50KTsKK1B5QVBJX0ZVTkMoaW50KSBQeVRocmVhZF9zZXRfa2V5X3ZhbHVlKGludCwgdm9pZCAqKTsKK1B5QVBJX0ZVTkModm9pZCAqKSBQeVRocmVhZF9nZXRfa2V5X3ZhbHVlKGludCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5VGhyZWFkX2RlbGV0ZV9rZXlfdmFsdWUoaW50IGtleSk7CisKKy8qIENsZWFudXAgYWZ0ZXIgYSBmb3JrICovCitQeUFQSV9GVU5DKHZvaWQpIFB5VGhyZWFkX1JlSW5pdFRMUyh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFQeV9QWVRIUkVBRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9yYW5nZW9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvcmFuZ2VvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM5Y2VlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcmFuZ2VvYmplY3QuaApAQCAtMCwwICsxLDI4IEBACisKKy8qIFJhbmdlIG9iamVjdCBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9SQU5HRU9CSkVDVF9ICisjZGVmaW5lIFB5X1JBTkdFT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogVGhpcyBpcyBhYm91dCB0aGUgdHlwZSAneHJhbmdlJywgbm90IHRoZSBidWlsdC1pbiBmdW5jdGlvbiByYW5nZSgpLCB3aGljaAorICAgcmV0dXJucyByZWd1bGFyIGxpc3RzLiAqLworCisvKgorQSByYW5nZSBvYmplY3QgcmVwcmVzZW50cyBhbiBpbnRlZ2VyIHJhbmdlLiAgVGhpcyBpcyBhbiBpbW11dGFibGUgb2JqZWN0OworYSByYW5nZSBjYW5ub3QgY2hhbmdlIGl0cyB2YWx1ZSBhZnRlciBjcmVhdGlvbi4KKworUmFuZ2Ugb2JqZWN0cyBiZWhhdmUgbGlrZSB0aGUgY29ycmVzcG9uZGluZyB0dXBsZSBvYmplY3RzIGV4Y2VwdCB0aGF0Cit0aGV5IGFyZSByZXByZXNlbnRlZCBieSBhIHN0YXJ0LCBzdG9wLCBhbmQgc3RlcCBkYXRhbWVtYmVycy4KKyovCisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVJhbmdlX1R5cGU7CisKKyNkZWZpbmUgUHlSYW5nZV9DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeVJhbmdlX1R5cGUpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1JBTkdFT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3NldG9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvc2V0b2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiMDdkNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3NldG9iamVjdC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qIFNldCBvYmplY3QgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfU0VUT0JKRUNUX0gKKyNkZWZpbmUgUHlfU0VUT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKgorVGhlcmUgYXJlIHRocmVlIGtpbmRzIG9mIHNsb3RzIGluIHRoZSB0YWJsZToKKworMS4gVW51c2VkOiAga2V5ID09IE5VTEwKKzIuIEFjdGl2ZTogIGtleSAhPSBOVUxMIGFuZCBrZXkgIT0gZHVtbXkKKzMuIER1bW15OiAgIGtleSA9PSBkdW1teQorCitOb3RlOiAucG9wKCkgYWJ1c2VzIHRoZSBoYXNoIGZpZWxkIG9mIGFuIFVudXNlZCBvciBEdW1teSBzbG90IHRvCitob2xkIGEgc2VhcmNoIGZpbmdlci4gIFRoZSBoYXNoIGZpZWxkIG9mIFVudXNlZCBvciBEdW1teSBzbG90cyBoYXMKK25vIG1lYW5pbmcgb3RoZXJ3aXNlLgorKi8KKworI2RlZmluZSBQeVNldF9NSU5TSVpFIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGxvbmcgaGFzaDsgICAgICAvKiBjYWNoZWQgaGFzaCBjb2RlIGZvciB0aGUgZW50cnkga2V5ICovCisgICAgUHlPYmplY3QgKmtleTsKK30gc2V0ZW50cnk7CisKKworLyoKK1RoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgc2hhcmVkIGJ5IHNldCBhbmQgZnJvemVuc2V0IG9iamVjdHMuCisqLworCit0eXBlZGVmIHN0cnVjdCBfc2V0b2JqZWN0IFB5U2V0T2JqZWN0Oworc3RydWN0IF9zZXRvYmplY3QgeworICAgIFB5T2JqZWN0X0hFQUQKKworICAgIFB5X3NzaXplX3QgZmlsbDsgIC8qICMgQWN0aXZlICsgIyBEdW1teSAqLworICAgIFB5X3NzaXplX3QgdXNlZDsgIC8qICMgQWN0aXZlICovCisKKyAgICAvKiBUaGUgdGFibGUgY29udGFpbnMgbWFzayArIDEgc2xvdHMsIGFuZCB0aGF0J3MgYSBwb3dlciBvZiAyLgorICAgICAqIFdlIHN0b3JlIHRoZSBtYXNrIGluc3RlYWQgb2YgdGhlIHNpemUgYmVjYXVzZSB0aGUgbWFzayBpcyBtb3JlCisgICAgICogZnJlcXVlbnRseSBuZWVkZWQuCisgICAgICovCisgICAgUHlfc3NpemVfdCBtYXNrOworCisgICAgLyogdGFibGUgcG9pbnRzIHRvIHNtYWxsdGFibGUgZm9yIHNtYWxsIHRhYmxlcywgZWxzZSB0bworICAgICAqIGFkZGl0aW9uYWwgbWFsbG9jJ2VkIG1lbW9yeS4gIHRhYmxlIGlzIG5ldmVyIE5VTEwhICBUaGlzIHJ1bGUKKyAgICAgKiBzYXZlcyByZXBlYXRlZCBydW50aW1lIG51bGwtdGVzdHMuCisgICAgICovCisgICAgc2V0ZW50cnkgKnRhYmxlOworICAgIHNldGVudHJ5ICooKmxvb2t1cCkoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5LCBsb25nIGhhc2gpOworICAgIHNldGVudHJ5IHNtYWxsdGFibGVbUHlTZXRfTUlOU0laRV07CisKKyAgICBsb25nIGhhc2g7ICAgICAgICAgICAgICAgICAgLyogb25seSB1c2VkIGJ5IGZyb3plbnNldCBvYmplY3RzICovCisgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAgICAgIC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCit9OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTZXRfVHlwZTsKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUZyb3plblNldF9UeXBlOworCisvKiBJbnZhcmlhbnRzIGZvciBmcm96ZW5zZXRzOgorICogICAgIGRhdGEgaXMgaW1tdXRhYmxlLgorICogICAgIGhhc2ggaXMgdGhlIGhhc2ggb2YgdGhlIGZyb3plbnNldCBvciAtMSBpZiBub3QgY29tcHV0ZWQgeWV0LgorICogSW52YXJpYW50cyBmb3Igc2V0czoKKyAqICAgICBoYXNoIGlzIC0xCisgKi8KKworI2RlZmluZSBQeUZyb3plblNldF9DaGVja0V4YWN0KG9iKSAoUHlfVFlQRShvYikgPT0gJlB5RnJvemVuU2V0X1R5cGUpCisjZGVmaW5lIFB5QW55U2V0X0NoZWNrRXhhY3Qob2IpIFwKKyAgICAoUHlfVFlQRShvYikgPT0gJlB5U2V0X1R5cGUgfHwgUHlfVFlQRShvYikgPT0gJlB5RnJvemVuU2V0X1R5cGUpCisjZGVmaW5lIFB5QW55U2V0X0NoZWNrKG9iKSBcCisgICAgKFB5X1RZUEUob2IpID09ICZQeVNldF9UeXBlIHx8IFB5X1RZUEUob2IpID09ICZQeUZyb3plblNldF9UeXBlIHx8IFwKKyAgICAgIFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYiksICZQeVNldF9UeXBlKSB8fCBcCisgICAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlGcm96ZW5TZXRfVHlwZSkpCisjZGVmaW5lIFB5U2V0X0NoZWNrKG9iKSBcCisgICAgKFB5X1RZUEUob2IpID09ICZQeVNldF9UeXBlIHx8IFwKKyAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlTZXRfVHlwZSkpCisjZGVmaW5lICAgUHlGcm96ZW5TZXRfQ2hlY2sob2IpIFwKKyAgICAoUHlfVFlQRShvYikgPT0gJlB5RnJvemVuU2V0X1R5cGUgfHwgXAorICAgICAgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgJlB5RnJvemVuU2V0X1R5cGUpKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2V0X05ldyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGcm96ZW5TZXRfTmV3KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVNldF9TaXplKFB5T2JqZWN0ICphbnlzZXQpOworI2RlZmluZSBQeVNldF9HRVRfU0laRShzbykgKCgoUHlTZXRPYmplY3QgKikoc28pKS0+dXNlZCkKK1B5QVBJX0ZVTkMoaW50KSBQeVNldF9DbGVhcihQeU9iamVjdCAqc2V0KTsKK1B5QVBJX0ZVTkMoaW50KSBQeVNldF9Db250YWlucyhQeU9iamVjdCAqYW55c2V0LCBQeU9iamVjdCAqa2V5KTsKK1B5QVBJX0ZVTkMoaW50KSBQeVNldF9EaXNjYXJkKFB5T2JqZWN0ICpzZXQsIFB5T2JqZWN0ICprZXkpOworUHlBUElfRlVOQyhpbnQpIFB5U2V0X0FkZChQeU9iamVjdCAqc2V0LCBQeU9iamVjdCAqa2V5KTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlTZXRfTmV4dChQeU9iamVjdCAqc2V0LCBQeV9zc2l6ZV90ICpwb3MsIFB5T2JqZWN0ICoqa2V5KTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlTZXRfTmV4dEVudHJ5KFB5T2JqZWN0ICpzZXQsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXksIGxvbmcgKmhhc2gpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNldF9Qb3AoUHlPYmplY3QgKnNldCk7CitQeUFQSV9GVU5DKGludCkgX1B5U2V0X1VwZGF0ZShQeU9iamVjdCAqc2V0LCBQeU9iamVjdCAqaXRlcmFibGUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9TRVRPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvc2xpY2VvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3NsaWNlb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiNjJkZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3NsaWNlb2JqZWN0LmgKQEAgLTAsMCArMSw0NCBAQAorI2lmbmRlZiBQeV9TTElDRU9CSkVDVF9ICisjZGVmaW5lIFB5X1NMSUNFT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogVGhlIHVuaXF1ZSBlbGxpcHNpcyBvYmplY3QgIi4uLiIgKi8KKworUHlBUElfREFUQShQeU9iamVjdCkgX1B5X0VsbGlwc2lzT2JqZWN0OyAvKiBEb24ndCB1c2UgdGhpcyBkaXJlY3RseSAqLworCisjZGVmaW5lIFB5X0VsbGlwc2lzICgmX1B5X0VsbGlwc2lzT2JqZWN0KQorCisvKiBTbGljZSBvYmplY3QgaW50ZXJmYWNlICovCisKKy8qCisKK0Egc2xpY2Ugb2JqZWN0IGNvbnRhaW5pbmcgc3RhcnQsIHN0b3AsIGFuZCBzdGVwIGRhdGEgbWVtYmVycyAodGhlCituYW1lcyBhcmUgZnJvbSByYW5nZSkuICBBZnRlciBtdWNoIHRhbGsgd2l0aCBHdWlkbywgaXQgd2FzIGRlY2lkZWQgdG8KK2xldCB0aGVzZSBiZSBhbnkgYXJiaXRyYXJ5IHB5dGhvbiB0eXBlLiAgUHlfTm9uZSBzdGFuZHMgZm9yIG9taXR0ZWQgdmFsdWVzLgorKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqc3RhcnQsICpzdG9wLCAqc3RlcDsJLyogbm90IE5VTEwgKi8KK30gUHlTbGljZU9iamVjdDsKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5U2xpY2VfVHlwZTsKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUVsbGlwc2lzX1R5cGU7CisKKyNkZWZpbmUgUHlTbGljZV9DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeVNsaWNlX1R5cGUpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTbGljZV9OZXcoUHlPYmplY3QqIHN0YXJ0LCBQeU9iamVjdCogc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogc3RlcCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVNsaWNlX0Zyb21JbmRpY2VzKFB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3Qgc3RvcCk7CitQeUFQSV9GVU5DKGludCkgUHlTbGljZV9HZXRJbmRpY2VzKFB5U2xpY2VPYmplY3QgKnIsIFB5X3NzaXplX3QgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKnN0YXJ0LCBQeV9zc2l6ZV90ICpzdG9wLCBQeV9zc2l6ZV90ICpzdGVwKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVNsaWNlX0dldEluZGljZXNFeChQeVNsaWNlT2JqZWN0ICpyLCBQeV9zc2l6ZV90IGxlbmd0aCwKKwkJCQkgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKnN0b3AsIAorCQkJCSAgICBQeV9zc2l6ZV90ICpzdGVwLCBQeV9zc2l6ZV90ICpzbGljZWxlbmd0aCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1NMSUNFT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3N0cmluZ29iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvc3RyaW5nb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiNWI0MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3N0cmluZ29iamVjdC5oCkBAIC0wLDAgKzEsMjEwIEBACisKKy8qIFN0cmluZyAoc3RyL2J5dGVzKSBvYmplY3QgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfU1RSSU5HT0JKRUNUX0gKKyNkZWZpbmUgUHlfU1RSSU5HT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKgorVHlwZSBQeVN0cmluZ09iamVjdCByZXByZXNlbnRzIGEgY2hhcmFjdGVyIHN0cmluZy4gIEFuIGV4dHJhIHplcm8gYnl0ZSBpcworcmVzZXJ2ZWQgYXQgdGhlIGVuZCB0byBlbnN1cmUgaXQgaXMgemVyby10ZXJtaW5hdGVkLCBidXQgYSBzaXplIGlzCitwcmVzZW50IHNvIHN0cmluZ3Mgd2l0aCBudWxsIGJ5dGVzIGluIHRoZW0gY2FuIGJlIHJlcHJlc2VudGVkLiAgVGhpcworaXMgYW4gaW1tdXRhYmxlIG9iamVjdCB0eXBlLgorCitUaGVyZSBhcmUgZnVuY3Rpb25zIHRvIGNyZWF0ZSBuZXcgc3RyaW5nIG9iamVjdHMsIHRvIHRlc3QKK2FuIG9iamVjdCBmb3Igc3RyaW5nLW5lc3MsIGFuZCB0byBnZXQgdGhlCitzdHJpbmcgdmFsdWUuICBUaGUgbGF0dGVyIGZ1bmN0aW9uIHJldHVybnMgYSBudWxsIHBvaW50ZXIKK2lmIHRoZSBvYmplY3QgaXMgbm90IG9mIHRoZSBwcm9wZXIgdHlwZS4KK1RoZXJlIGlzIGEgdmFyaWFudCB0aGF0IHRha2VzIGFuIGV4cGxpY2l0IHNpemUgYXMgd2VsbCBhcyBhCit2YXJpYW50IHRoYXQgYXNzdW1lcyBhIHplcm8tdGVybWluYXRlZCBzdHJpbmcuICBOb3RlIHRoYXQgbm9uZSBvZiB0aGUKK2Z1bmN0aW9ucyBzaG91bGQgYmUgYXBwbGllZCB0byBuaWwgb2JqZWN0cy4KKyovCisKKy8qIENhY2hpbmcgdGhlIGhhc2ggKG9iX3NoYXNoKSBzYXZlcyByZWNhbGN1bGF0aW9uIG9mIGEgc3RyaW5nJ3MgaGFzaCB2YWx1ZS4KKyAgIEludGVybmluZyBzdHJpbmdzIChvYl9zc3RhdGUpIHRyaWVzIHRvIGVuc3VyZSB0aGF0IG9ubHkgb25lIHN0cmluZworICAgb2JqZWN0IHdpdGggYSBnaXZlbiB2YWx1ZSBleGlzdHMsIHNvIGVxdWFsaXR5IHRlc3RzIGNhbiBiZSBvbmUgcG9pbnRlcgorICAgY29tcGFyaXNvbi4gIFRoaXMgaXMgZ2VuZXJhbGx5IHJlc3RyaWN0ZWQgdG8gc3RyaW5ncyB0aGF0ICJsb29rIGxpa2UiCisgICBQeXRob24gaWRlbnRpZmllcnMsIGFsdGhvdWdoIHRoZSBpbnRlcm4oKSBidWlsdGluIGNhbiBiZSB1c2VkIHRvIGZvcmNlCisgICBpbnRlcm5pbmcgb2YgYW55IHN0cmluZy4KKyAgIFRvZ2V0aGVyLCB0aGVzZSBzcGVkIHRoZSBpbnRlcnByZXRlciBieSB1cCB0byAyMCUuICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9WQVJfSEVBRAorICAgIGxvbmcgb2Jfc2hhc2g7CisgICAgaW50IG9iX3NzdGF0ZTsKKyAgICBjaGFyIG9iX3N2YWxbMV07CisKKyAgICAvKiBJbnZhcmlhbnRzOgorICAgICAqICAgICBvYl9zdmFsIGNvbnRhaW5zIHNwYWNlIGZvciAnb2Jfc2l6ZSsxJyBlbGVtZW50cy4KKyAgICAgKiAgICAgb2Jfc3ZhbFtvYl9zaXplXSA9PSAwLgorICAgICAqICAgICBvYl9zaGFzaCBpcyB0aGUgaGFzaCBvZiB0aGUgc3RyaW5nIG9yIC0xIGlmIG5vdCBjb21wdXRlZCB5ZXQuCisgICAgICogICAgIG9iX3NzdGF0ZSAhPSAwIGlmZiB0aGUgc3RyaW5nIG9iamVjdCBpcyBpbiBzdHJpbmdvYmplY3QuYydzCisgICAgICogICAgICAgJ2ludGVybmVkJyBkaWN0aW9uYXJ5OyBpbiB0aGlzIGNhc2UgdGhlIHR3byByZWZlcmVuY2VzCisgICAgICogICAgICAgZnJvbSAnaW50ZXJuZWQnIHRvIHRoaXMgb2JqZWN0IGFyZSAqbm90IGNvdW50ZWQqIGluIG9iX3JlZmNudC4KKyAgICAgKi8KK30gUHlTdHJpbmdPYmplY3Q7CisKKyNkZWZpbmUgU1NUQVRFX05PVF9JTlRFUk5FRCAwCisjZGVmaW5lIFNTVEFURV9JTlRFUk5FRF9NT1JUQUwgMQorI2RlZmluZSBTU1RBVEVfSU5URVJORURfSU1NT1JUQUwgMgorCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlCYXNlU3RyaW5nX1R5cGU7CitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTdHJpbmdfVHlwZTsKKworI2RlZmluZSBQeVN0cmluZ19DaGVjayhvcCkgXAorICAgICAgICAgICAgICAgICBQeVR5cGVfRmFzdFN1YmNsYXNzKFB5X1RZUEUob3ApLCBQeV9UUEZMQUdTX1NUUklOR19TVUJDTEFTUykKKyNkZWZpbmUgUHlTdHJpbmdfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09ICZQeVN0cmluZ19UeXBlKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmcoY29uc3QgY2hhciAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfRnJvbUZvcm1hdFYoY29uc3QgY2hhciosIHZhX2xpc3QpCisJCQkJUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMSwgMCkpKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfRnJvbUZvcm1hdChjb25zdCBjaGFyKiwgLi4uKQorCQkJCVB5X0dDQ19BVFRSSUJVVEUoKGZvcm1hdChwcmludGYsIDEsIDIpKSk7CitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5U3RyaW5nX1NpemUoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGNoYXIgKikgUHlTdHJpbmdfQXNTdHJpbmcoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U3RyaW5nX1JlcHIoUHlPYmplY3QgKiwgaW50KTsKK1B5QVBJX0ZVTkModm9pZCkgUHlTdHJpbmdfQ29uY2F0KFB5T2JqZWN0ICoqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKFB5T2JqZWN0ICoqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlTdHJpbmdfUmVzaXplKFB5T2JqZWN0ICoqLCBQeV9zc2l6ZV90KTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlTdHJpbmdfRXEoUHlPYmplY3QgKiwgUHlPYmplY3QqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfRm9ybWF0KFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlTdHJpbmdfRm9ybWF0TG9uZyhQeU9iamVjdCosIGludCwgaW50LAorCQkJCQkJICBpbnQsIGNoYXIqKiwgaW50Kik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U3RyaW5nX0RlY29kZUVzY2FwZShjb25zdCBjaGFyICosIFB5X3NzaXplX3QsIAorCQkJCQkJICAgY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90LAorCQkJCQkJICAgY29uc3QgY2hhciAqKTsKKworUHlBUElfRlVOQyh2b2lkKSBQeVN0cmluZ19JbnRlcm5JblBsYWNlKFB5T2JqZWN0ICoqKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlTdHJpbmdfSW50ZXJuSW1tb3J0YWwoUHlPYmplY3QgKiopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKGNvbnN0IGNoYXIgKik7CitQeUFQSV9GVU5DKHZvaWQpIF9QeV9SZWxlYXNlSW50ZXJuZWRTdHJpbmdzKHZvaWQpOworCisvKiBVc2Ugb25seSBpZiB5b3Uga25vdyBpdCdzIGEgc3RyaW5nICovCisjZGVmaW5lIFB5U3RyaW5nX0NIRUNLX0lOVEVSTkVEKG9wKSAoKChQeVN0cmluZ09iamVjdCAqKShvcCkpLT5vYl9zc3RhdGUpCisKKy8qIE1hY3JvLCB0cmFkaW5nIHNhZmV0eSBmb3Igc3BlZWQgKi8KKyNkZWZpbmUgUHlTdHJpbmdfQVNfU1RSSU5HKG9wKSAoKChQeVN0cmluZ09iamVjdCAqKShvcCkpLT5vYl9zdmFsKQorI2RlZmluZSBQeVN0cmluZ19HRVRfU0laRShvcCkgIFB5X1NJWkUob3ApCisKKy8qIF9QeVN0cmluZ19Kb2luKHNlcCwgeCkgaXMgbGlrZSBzZXAuam9pbih4KS4gIHNlcCBtdXN0IGJlIFB5U3RyaW5nT2JqZWN0KiwKKyAgIHggbXVzdCBiZSBhbiBpdGVyYWJsZSBvYmplY3QuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVN0cmluZ19Kb2luKFB5T2JqZWN0ICpzZXAsIFB5T2JqZWN0ICp4KTsKKworLyogLS0tIEdlbmVyaWMgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENyZWF0ZSBhbiBvYmplY3QgYnkgZGVjb2RpbmcgdGhlIGVuY29kZWQgc3RyaW5nIHMgb2YgdGhlCisgICBnaXZlbiBzaXplLiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlTdHJpbmdfRGVjb2RlKAorICAgIGNvbnN0IGNoYXIgKnMsICAgICAgICAgICAgICAvKiBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3Qgc2l6ZSwgICAgICAgICAgICAvKiBzaXplIG9mIGJ1ZmZlciAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAgICAgICAvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKy8qIEVuY29kZXMgYSBjaGFyIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSBhbmQgcmV0dXJucyBhIAorICAgUHl0aG9uIG9iamVjdC4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5U3RyaW5nX0VuY29kZSgKKyAgICBjb25zdCBjaGFyICpzLCAgICAgICAgICAgICAgLyogc3RyaW5nIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBzaXplLCAgICAgICAgICAgIC8qIG51bWJlciBvZiBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgICAgICAgLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiBFbmNvZGVzIGEgc3RyaW5nIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIFB5dGhvbiAKKyAgIG9iamVjdC4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5U3RyaW5nX0FzRW5jb2RlZE9iamVjdCgKKyAgICBQeU9iamVjdCAqc3RyLAkgCS8qIHN0cmluZyBvYmplY3QgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywJLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworLyogRW5jb2RlcyBhIHN0cmluZyBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBQeXRob24gc3RyaW5nCisgICBvYmplY3QuICAgCisgICAKKyAgIElmIHRoZSBjb2RlYyByZXR1cm5zIGFuIFVuaWNvZGUgb2JqZWN0LCB0aGUgb2JqZWN0IGlzIGNvbnZlcnRlZAorICAgYmFjayB0byBhIHN0cmluZyB1c2luZyB0aGUgZGVmYXVsdCBlbmNvZGluZy4KKworICAgREVQUkVDQVRFRCAtIHVzZSBQeVN0cmluZ19Bc0VuY29kZWRPYmplY3QoKSBpbnN0ZWFkLiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlTdHJpbmdfQXNFbmNvZGVkU3RyaW5nKAorICAgIFB5T2JqZWN0ICpzdHIsCSAJLyogc3RyaW5nIG9iamVjdCAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAkvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiBEZWNvZGVzIGEgc3RyaW5nIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIFB5dGhvbiAKKyAgIG9iamVjdC4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5U3RyaW5nX0FzRGVjb2RlZE9iamVjdCgKKyAgICBQeU9iamVjdCAqc3RyLAkgCS8qIHN0cmluZyBvYmplY3QgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywJLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworLyogRGVjb2RlcyBhIHN0cmluZyBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBQeXRob24gc3RyaW5nCisgICBvYmplY3QuICAKKyAgIAorICAgSWYgdGhlIGNvZGVjIHJldHVybnMgYW4gVW5pY29kZSBvYmplY3QsIHRoZSBvYmplY3QgaXMgY29udmVydGVkCisgICBiYWNrIHRvIGEgc3RyaW5nIHVzaW5nIHRoZSBkZWZhdWx0IGVuY29kaW5nLgorCisgICBERVBSRUNBVEVEIC0gdXNlIFB5U3RyaW5nX0FzRGVjb2RlZE9iamVjdCgpIGluc3RlYWQuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVN0cmluZ19Bc0RlY29kZWRTdHJpbmcoCisgICAgUHlPYmplY3QgKnN0ciwJIAkvKiBzdHJpbmcgb2JqZWN0ICovCisgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCS8qIGVuY29kaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKy8qIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaW50ZXJuYWwgZGF0YSBidWZmZXIgYW5kIHNpemUgb2YgYSBzdHJpbmcKKyAgIG9iamVjdCBvciB0aGUgZGVmYXVsdCBlbmNvZGVkIHZlcnNpb24gb2YgYW4gVW5pY29kZSBvYmplY3QuIFBhc3NpbmcKKyAgIE5VTEwgYXMgKmxlbiBwYXJhbWV0ZXIgd2lsbCBmb3JjZSB0aGUgc3RyaW5nIGJ1ZmZlciB0byBiZQorICAgMC10ZXJtaW5hdGVkIChwYXNzaW5nIGEgc3RyaW5nIHdpdGggZW1iZWRkZWQgTlVMTCBjaGFyYWN0ZXJzIHdpbGwKKyAgIGNhdXNlIGFuIGV4Y2VwdGlvbikuICAqLworCitQeUFQSV9GVU5DKGludCkgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKAorICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpvYmosCS8qIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCAqLworICAgIHJlZ2lzdGVyIGNoYXIgKipzLAkJLyogcG9pbnRlciB0byBidWZmZXIgdmFyaWFibGUgKi8KKyAgICByZWdpc3RlciBQeV9zc2l6ZV90ICpsZW4JLyogcG9pbnRlciB0byBsZW5ndGggdmFyaWFibGUgb3IgTlVMTAorCQkJCSAgIChvbmx5IHBvc3NpYmxlIGZvciAwLXRlcm1pbmF0ZWQKKwkJCQkgICBzdHJpbmdzKSAqLworICAgICk7CisKKworLyogVXNpbmcgdGhlIGN1cnJlbnQgbG9jYWxlLCBpbnNlcnQgdGhlIHRob3VzYW5kcyBncm91cGluZworICAgaW50byB0aGUgc3RyaW5nIHBvaW50ZWQgdG8gYnkgYnVmZmVyLiAgRm9yIHRoZSBhcmd1bWVudCBkZXNjcmlwdGlvbnMsCisgICBzZWUgT2JqZWN0cy9zdHJpbmdsaWIvbG9jYWxldXRpbC5oICovCitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIF9QeVN0cmluZ19JbnNlcnRUaG91c2FuZHNHcm91cGluZ0xvY2FsZShjaGFyICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBuX2RpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG1pbl93aWR0aCk7CisKKy8qIFVzaW5nIGV4cGxpY2l0IHBhc3NlZC1pbiB2YWx1ZXMsIGluc2VydCB0aGUgdGhvdXNhbmRzIGdyb3VwaW5nCisgICBpbnRvIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBidWZmZXIuICBGb3IgdGhlIGFyZ3VtZW50IGRlc2NyaXB0aW9ucywKKyAgIHNlZSBPYmplY3RzL3N0cmluZ2xpYi9sb2NhbGV1dGlsLmggKi8KK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5U3RyaW5nX0luc2VydFRob3VzYW5kc0dyb3VwaW5nKGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG5fYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG5fZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWluX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmdyb3VwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRob3VzYW5kc19zZXApOworCisvKiBGb3JtYXQgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUgZm9ybWF0X3NwZWMsIGFzIGRlZmluZWQgaW4gUEVQIDMxMDEKKyAgIChBZHZhbmNlZCBTdHJpbmcgRm9ybWF0dGluZykuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUJ5dGVzX0Zvcm1hdEFkdmFuY2VkKFB5T2JqZWN0ICpvYmosCisJCQkJCSAgICAgICBjaGFyICpmb3JtYXRfc3BlYywKKwkJCQkJICAgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfU1RSSU5HT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3N0cnVjdG1lbWJlci5oIGIvaW5jbHVkZS9weXRob24yLjcvc3RydWN0bWVtYmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1YjQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3N0cnVjdG1lbWJlci5oCkBAIC0wLDAgKzEsOTkgQEAKKyNpZm5kZWYgUHlfU1RSVUNUTUVNQkVSX0gKKyNkZWZpbmUgUHlfU1RSVUNUTUVNQkVSX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBJbnRlcmZhY2UgdG8gbWFwIEMgc3RydWN0IG1lbWJlcnMgdG8gUHl0aG9uIG9iamVjdCBhdHRyaWJ1dGVzICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4gLyogRm9yIG9mZnNldG9mICovCisKKy8qIFRoZSBvZmZzZXRvZigpIG1hY3JvIGNhbGN1bGF0ZXMgdGhlIG9mZnNldCBvZiBhIHN0cnVjdHVyZSBtZW1iZXIKKyAgIGluIGl0cyBzdHJ1Y3R1cmUuICBVbmZvcnR1bmF0ZWx5IHRoaXMgY2Fubm90IGJlIHdyaXR0ZW4gZG93bgorICAgcG9ydGFibHksIGhlbmNlIGl0IGlzIHByb3ZpZGVkIGJ5IGEgU3RhbmRhcmQgQyBoZWFkZXIgZmlsZS4KKyAgIEZvciBwcmUtU3RhbmRhcmQgQyBjb21waWxlcnMsIGhlcmUgaXMgYSB2ZXJzaW9uIHRoYXQgdXN1YWxseSB3b3JrcworICAgKGJ1dCB3YXRjaCBvdXQhKTogKi8KKworI2lmbmRlZiBvZmZzZXRvZgorI2RlZmluZSBvZmZzZXRvZih0eXBlLCBtZW1iZXIpICggKGludCkgJiAoKHR5cGUqKTApIC0+IG1lbWJlciApCisjZW5kaWYKKworLyogQW4gYXJyYXkgb2YgbWVtYmVybGlzdCBzdHJ1Y3R1cmVzIGRlZmluZXMgdGhlIG5hbWUsIHR5cGUgYW5kIG9mZnNldAorICAgb2Ygc2VsZWN0ZWQgbWVtYmVycyBvZiBhIEMgc3RydWN0dXJlLiAgVGhlc2UgY2FuIGJlIHJlYWQgYnkKKyAgIFB5TWVtYmVyX0dldCgpIGFuZCBzZXQgYnkgUHlNZW1iZXJfU2V0KCkgKGV4Y2VwdCBpZiB0aGVpciBSRUFET05MWSBmbGFnCisgICBpcyBzZXQpLiAgVGhlIGFycmF5IG11c3QgYmUgdGVybWluYXRlZCB3aXRoIGFuIGVudHJ5IHdob3NlIG5hbWUKKyAgIHBvaW50ZXIgaXMgTlVMTC4gKi8KKworc3RydWN0IG1lbWJlcmxpc3QgeworICAgIC8qIE9ic29sZXRlIHZlcnNpb24sIGZvciBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KKyAgICBjaGFyICpuYW1lOworICAgIGludCB0eXBlOworICAgIGludCBvZmZzZXQ7CisgICAgaW50IGZsYWdzOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgUHlNZW1iZXJEZWYgeworICAgIC8qIEN1cnJlbnQgdmVyc2lvbiwgdXNlIHRoaXMgKi8KKyAgICBjaGFyICpuYW1lOworICAgIGludCB0eXBlOworICAgIFB5X3NzaXplX3Qgb2Zmc2V0OworICAgIGludCBmbGFnczsKKyAgICBjaGFyICpkb2M7Cit9IFB5TWVtYmVyRGVmOworCisvKiBUeXBlcyAqLworI2RlZmluZSBUX1NIT1JUICAgICAgICAgMAorI2RlZmluZSBUX0lOVCAgICAgICAgICAgMQorI2RlZmluZSBUX0xPTkcgICAgICAgICAgMgorI2RlZmluZSBUX0ZMT0FUICAgICAgICAgMworI2RlZmluZSBUX0RPVUJMRSAgICAgICAgNAorI2RlZmluZSBUX1NUUklORyAgICAgICAgNQorI2RlZmluZSBUX09CSkVDVCAgICAgICAgNgorLyogWFhYIHRoZSBvcmRlcmluZyBoZXJlIGlzIHdlaXJkIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBUX0NIQVIgICAgICAgICAgNyAgICAgICAvKiAxLWNoYXJhY3RlciBzdHJpbmcgKi8KKyNkZWZpbmUgVF9CWVRFICAgICAgICAgIDggICAgICAgLyogOC1iaXQgc2lnbmVkIGludCAqLworLyogdW5zaWduZWQgdmFyaWFudHM6ICovCisjZGVmaW5lIFRfVUJZVEUgICAgICAgICA5CisjZGVmaW5lIFRfVVNIT1JUICAgICAgICAxMAorI2RlZmluZSBUX1VJTlQgICAgICAgICAgMTEKKyNkZWZpbmUgVF9VTE9ORyAgICAgICAgIDEyCisKKy8qIEFkZGVkIGJ5IEphY2s6IHN0cmluZ3MgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgVF9TVFJJTkdfSU5QTEFDRSAgICAgICAgMTMKKworLyogQWRkZWQgYnkgTGlsbG86IGJvb2xzIGNvbnRhaW5lZCBpbiB0aGUgc3RydWN0dXJlIChhc3N1bWVkIGNoYXIpICovCisjZGVmaW5lIFRfQk9PTCAgICAgICAgICAxNAorCisjZGVmaW5lIFRfT0JKRUNUX0VYICAgICAxNiAgICAgIC8qIExpa2UgVF9PQkpFQ1QsIGJ1dCByYWlzZXMgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB2YWx1ZSBpcyBOVUxMLCBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgY29udmVydGluZyB0byBOb25lLiAqLworI2lmZGVmIEhBVkVfTE9OR19MT05HCisjZGVmaW5lIFRfTE9OR0xPTkcgICAgICAxNworI2RlZmluZSBUX1VMT05HTE9ORyAgICAgIDE4CisjZW5kaWYgLyogSEFWRV9MT05HX0xPTkcgKi8KKworI2RlZmluZSBUX1BZU1NJWkVUICAgICAgIDE5IC8qIFB5X3NzaXplX3QgKi8KKworCisvKiBGbGFncyAqLworI2RlZmluZSBSRUFET05MWSAgICAgICAgMQorI2RlZmluZSBSTyAgICAgICAgICAgICAgUkVBRE9OTFkgICAgICAgICAgICAgICAgLyogU2hvcnRoYW5kICovCisjZGVmaW5lIFJFQURfUkVTVFJJQ1RFRCAyCisjZGVmaW5lIFBZX1dSSVRFX1JFU1RSSUNURUQgNAorI2RlZmluZSBSRVNUUklDVEVEICAgICAgKFJFQURfUkVTVFJJQ1RFRCB8IFBZX1dSSVRFX1JFU1RSSUNURUQpCisKKworLyogT2Jzb2xldGUgQVBJLCBmb3IgYmluYXJ5IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWVtYmVyX0dldChjb25zdCBjaGFyICosIHN0cnVjdCBtZW1iZXJsaXN0ICosIGNvbnN0IGNoYXIgKik7CitQeUFQSV9GVU5DKGludCkgUHlNZW1iZXJfU2V0KGNoYXIgKiwgc3RydWN0IG1lbWJlcmxpc3QgKiwgY29uc3QgY2hhciAqLCBQeU9iamVjdCAqKTsKKworLyogQ3VycmVudCBBUEksIHVzZSB0aGlzICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWVtYmVyX0dldE9uZShjb25zdCBjaGFyICosIHN0cnVjdCBQeU1lbWJlckRlZiAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU1lbWJlcl9TZXRPbmUoY2hhciAqLCBzdHJ1Y3QgUHlNZW1iZXJEZWYgKiwgUHlPYmplY3QgKik7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfU1RSVUNUTUVNQkVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3N0cnVjdHNlcS5oIGIvaW5jbHVkZS9weXRob24yLjcvc3RydWN0c2VxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2MjkxNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3N0cnVjdHNlcS5oCkBAIC0wLDAgKzEsNDEgQEAKKworLyogVHVwbGUgb2JqZWN0IGludGVyZmFjZSAqLworCisjaWZuZGVmIFB5X1NUUlVDVFNFUV9ICisjZGVmaW5lIFB5X1NUUlVDVFNFUV9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IFB5U3RydWN0U2VxdWVuY2VfRmllbGQgeworCWNoYXIgKm5hbWU7CisJY2hhciAqZG9jOworfSBQeVN0cnVjdFNlcXVlbmNlX0ZpZWxkOworCit0eXBlZGVmIHN0cnVjdCBQeVN0cnVjdFNlcXVlbmNlX0Rlc2MgeworCWNoYXIgKm5hbWU7CisJY2hhciAqZG9jOworCXN0cnVjdCBQeVN0cnVjdFNlcXVlbmNlX0ZpZWxkICpmaWVsZHM7CisJaW50IG5faW5fc2VxdWVuY2U7Cit9IFB5U3RydWN0U2VxdWVuY2VfRGVzYzsKKworZXh0ZXJuIGNoYXIqIFB5U3RydWN0U2VxdWVuY2VfVW5uYW1lZEZpZWxkOworCitQeUFQSV9GVU5DKHZvaWQpIFB5U3RydWN0U2VxdWVuY2VfSW5pdFR5cGUoUHlUeXBlT2JqZWN0ICp0eXBlLAorCQkJCQkgICBQeVN0cnVjdFNlcXVlbmNlX0Rlc2MgKmRlc2MpOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U3RydWN0U2VxdWVuY2VfTmV3KFB5VHlwZU9iamVjdCogdHlwZSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlQeU9iamVjdF9WQVJfSEVBRAorCVB5T2JqZWN0ICpvYl9pdGVtWzFdOworfSBQeVN0cnVjdFNlcXVlbmNlOworCisvKiBNYWNybywgKm9ubHkqIHRvIGJlIHVzZWQgdG8gZmlsbCBpbiBicmFuZCBuZXcgb2JqZWN0cyAqLworI2RlZmluZSBQeVN0cnVjdFNlcXVlbmNlX1NFVF9JVEVNKG9wLCBpLCB2KSBcCisJKCgoUHlTdHJ1Y3RTZXF1ZW5jZSAqKShvcCkpLT5vYl9pdGVtW2ldID0gdikKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfU1RSVUNUU0VRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3N5bXRhYmxlLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9zeW10YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTBiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9zeW10YWJsZS5oCkBAIC0wLDAgKzEsOTggQEAKKyNpZm5kZWYgUHlfU1lNVEFCTEVfSAorI2RlZmluZSBQeV9TWU1UQUJMRV9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBlbnVtIF9ibG9ja190eXBlIHsgRnVuY3Rpb25CbG9jaywgQ2xhc3NCbG9jaywgTW9kdWxlQmxvY2sgfQorICAgIF9QeV9ibG9ja190eTsKKworc3RydWN0IF9zeW10YWJsZV9lbnRyeTsKKworc3RydWN0IHN5bXRhYmxlIHsKKyAgICBjb25zdCBjaGFyICpzdF9maWxlbmFtZTsgLyogbmFtZSBvZiBmaWxlIGJlaW5nIGNvbXBpbGVkICovCisgICAgc3RydWN0IF9zeW10YWJsZV9lbnRyeSAqc3RfY3VyOyAvKiBjdXJyZW50IHN5bWJvbCB0YWJsZSBlbnRyeSAqLworICAgIHN0cnVjdCBfc3ltdGFibGVfZW50cnkgKnN0X3RvcDsgLyogbW9kdWxlIGVudHJ5ICovCisgICAgUHlPYmplY3QgKnN0X3N5bWJvbHM7ICAgIC8qIGRpY3Rpb25hcnkgb2Ygc3ltYm9sIHRhYmxlIGVudHJpZXMgKi8KKyAgICBQeU9iamVjdCAqc3Rfc3RhY2s7ICAgICAgLyogc3RhY2sgb2YgbmFtZXNwYWNlIGluZm8gKi8KKyAgICBQeU9iamVjdCAqc3RfZ2xvYmFsOyAgICAgLyogYm9ycm93ZWQgcmVmIHRvIE1PRFVMRSBpbiBzdF9zeW1ib2xzICovCisgICAgaW50IHN0X25ibG9ja3M7ICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICBQeU9iamVjdCAqc3RfcHJpdmF0ZTsgICAgICAgIC8qIG5hbWUgb2YgY3VycmVudCBjbGFzcyBvciBOVUxMICovCisgICAgUHlGdXR1cmVGZWF0dXJlcyAqc3RfZnV0dXJlOyAvKiBtb2R1bGUncyBmdXR1cmUgZmVhdHVyZXMgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IF9zeW10YWJsZV9lbnRyeSB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpzdGVfaWQ7ICAgICAgICAvKiBpbnQ6IGtleSBpbiBzdF9zeW1ib2xzICovCisgICAgUHlPYmplY3QgKnN0ZV9zeW1ib2xzOyAgIC8qIGRpY3Q6IG5hbWUgdG8gZmxhZ3MgKi8KKyAgICBQeU9iamVjdCAqc3RlX25hbWU7ICAgICAgLyogc3RyaW5nOiBuYW1lIG9mIGJsb2NrICovCisgICAgUHlPYmplY3QgKnN0ZV92YXJuYW1lczsgIC8qIGxpc3Qgb2YgdmFyaWFibGUgbmFtZXMgKi8KKyAgICBQeU9iamVjdCAqc3RlX2NoaWxkcmVuOyAgLyogbGlzdCBvZiBjaGlsZCBpZHMgKi8KKyAgICBfUHlfYmxvY2tfdHkgc3RlX3R5cGU7ICAgLyogbW9kdWxlLCBjbGFzcywgb3IgZnVuY3Rpb24gKi8KKyAgICBpbnQgc3RlX3Vub3B0aW1pemVkOyAgICAgLyogZmFsc2UgaWYgbmFtZXNwYWNlIGlzIG9wdGltaXplZCAqLworICAgIGludCBzdGVfbmVzdGVkOyAgICAgIC8qIHRydWUgaWYgYmxvY2sgaXMgbmVzdGVkICovCisgICAgdW5zaWduZWQgc3RlX2ZyZWUgOiAxOyAgICAgICAgLyogdHJ1ZSBpZiBibG9jayBoYXMgZnJlZSB2YXJpYWJsZXMgKi8KKyAgICB1bnNpZ25lZCBzdGVfY2hpbGRfZnJlZSA6IDE7ICAvKiB0cnVlIGlmIGEgY2hpbGQgYmxvY2sgaGFzIGZyZWUgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgZnJlZSByZWZzIHRvIGdsb2JhbHMgKi8KKyAgICB1bnNpZ25lZCBzdGVfZ2VuZXJhdG9yIDogMTsgICAvKiB0cnVlIGlmIG5hbWVzcGFjZSBpcyBhIGdlbmVyYXRvciAqLworICAgIHVuc2lnbmVkIHN0ZV92YXJhcmdzIDogMTsgICAgIC8qIHRydWUgaWYgYmxvY2sgaGFzIHZhcmFyZ3MgKi8KKyAgICB1bnNpZ25lZCBzdGVfdmFya2V5d29yZHMgOiAxOyAvKiB0cnVlIGlmIGJsb2NrIGhhcyB2YXJrZXl3b3JkcyAqLworICAgIHVuc2lnbmVkIHN0ZV9yZXR1cm5zX3ZhbHVlIDogMTsgIC8qIHRydWUgaWYgbmFtZXNwYWNlIHVzZXMgcmV0dXJuIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBhcmd1bWVudCAqLworICAgIGludCBzdGVfbGluZW5vOyAgICAgICAgICAvKiBmaXJzdCBsaW5lIG9mIGJsb2NrICovCisgICAgaW50IHN0ZV9vcHRfbGluZW5vOyAgICAgIC8qIGxpbmVubyBvZiBsYXN0IGV4ZWMgb3IgaW1wb3J0ICogKi8KKyAgICBpbnQgc3RlX3RtcG5hbWU7ICAgICAgICAgLyogY291bnRlciBmb3IgbGlzdGNvbXAgdGVtcCB2YXJzICovCisgICAgc3RydWN0IHN5bXRhYmxlICpzdGVfdGFibGU7Cit9IFB5U1RFbnRyeU9iamVjdDsKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5U1RFbnRyeV9UeXBlOworCisjZGVmaW5lIFB5U1RFbnRyeV9DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeVNURW50cnlfVHlwZSkKKworUHlBUElfRlVOQyhpbnQpIFB5U1RfR2V0U2NvcGUoUHlTVEVudHJ5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCitQeUFQSV9GVU5DKHN0cnVjdCBzeW10YWJsZSAqKSBQeVN5bXRhYmxlX0J1aWxkKG1vZF90eSwgY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RnV0dXJlRmVhdHVyZXMgKik7CitQeUFQSV9GVU5DKFB5U1RFbnRyeU9iamVjdCAqKSBQeVN5bXRhYmxlX0xvb2t1cChzdHJ1Y3Qgc3ltdGFibGUgKiwgdm9pZCAqKTsKKworUHlBUElfRlVOQyh2b2lkKSBQeVN5bXRhYmxlX0ZyZWUoc3RydWN0IHN5bXRhYmxlICopOworCisvKiBGbGFncyBmb3IgZGVmLXVzZSBpbmZvcm1hdGlvbiAqLworCisjZGVmaW5lIERFRl9HTE9CQUwgMSAgICAgICAgICAgLyogZ2xvYmFsIHN0bXQgKi8KKyNkZWZpbmUgREVGX0xPQ0FMIDIgICAgICAgICAgICAvKiBhc3NpZ25tZW50IGluIGNvZGUgYmxvY2sgKi8KKyNkZWZpbmUgREVGX1BBUkFNIDI8PDEgICAgICAgICAvKiBmb3JtYWwgcGFyYW1ldGVyICovCisjZGVmaW5lIFVTRSAyPDwyICAgICAgICAgICAgICAgLyogbmFtZSBpcyB1c2VkICovCisjZGVmaW5lIERFRl9GUkVFIDI8PDMgICAgICAgICAvKiBuYW1lIHVzZWQgYnV0IG5vdCBkZWZpbmVkIGluIG5lc3RlZCBibG9jayAqLworI2RlZmluZSBERUZfRlJFRV9DTEFTUyAyPDw0ICAgIC8qIGZyZWUgdmFyaWFibGUgZnJvbSBjbGFzcydzIG1ldGhvZCAqLworI2RlZmluZSBERUZfSU1QT1JUIDI8PDUgICAgICAgIC8qIGFzc2lnbm1lbnQgb2NjdXJyZWQgdmlhIGltcG9ydCAqLworCisjZGVmaW5lIERFRl9CT1VORCAoREVGX0xPQ0FMIHwgREVGX1BBUkFNIHwgREVGX0lNUE9SVCkKKworLyogR0xPQkFMX0VYUExJQ0lUIGFuZCBHTE9CQUxfSU1QTElDSVQgYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgc3ltYm9sCisgICB0YWJsZS4gIEdMT0JBTCBpcyByZXR1cm5lZCBmcm9tIFB5U1RfR2V0U2NvcGUoKSBmb3IgZWl0aGVyIG9mIHRoZW0uCisgICBJdCBpcyBzdG9yZWQgaW4gc3RlX3N5bWJvbHMgYXQgYml0cyAxMi0xNC4KKyovCisjZGVmaW5lIFNDT1BFX09GRiAxMQorI2RlZmluZSBTQ09QRV9NQVNLIDcKKworI2RlZmluZSBMT0NBTCAxCisjZGVmaW5lIEdMT0JBTF9FWFBMSUNJVCAyCisjZGVmaW5lIEdMT0JBTF9JTVBMSUNJVCAzCisjZGVmaW5lIEZSRUUgNAorI2RlZmluZSBDRUxMIDUKKworLyogVGhlIGZvbGxvd2luZyB0aHJlZSBuYW1lcyBhcmUgdXNlZCBmb3IgdGhlIHN0ZV91bm9wdGltaXplZCBiaXQgZmllbGQgKi8KKyNkZWZpbmUgT1BUX0lNUE9SVF9TVEFSIDEKKyNkZWZpbmUgT1BUX0VYRUMgMgorI2RlZmluZSBPUFRfQkFSRV9FWEVDIDQKKyNkZWZpbmUgT1BUX1RPUExFVkVMIDggIC8qIHRvcC1sZXZlbCBuYW1lcywgaW5jbHVkaW5nIGV2YWwgYW5kIGV4ZWMgKi8KKworI2RlZmluZSBHRU5FUkFUT1IgMQorI2RlZmluZSBHRU5FUkFUT1JfRVhQUkVTU0lPTiAyCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1NZTVRBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3N5c21vZHVsZS5oIGIvaW5jbHVkZS9weXRob24yLjcvc3lzbW9kdWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5NjJiNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3N5c21vZHVsZS5oCkBAIC0wLDAgKzEsMjkgQEAKKworLyogU3lzdGVtIG1vZHVsZSBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9TWVNNT0RVTEVfSAorI2RlZmluZSBQeV9TWVNNT0RVTEVfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U3lzX0dldE9iamVjdChjaGFyICopOworUHlBUElfRlVOQyhpbnQpIFB5U3lzX1NldE9iamVjdChjaGFyICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhGSUxFICopIFB5U3lzX0dldEZpbGUoY2hhciAqLCBGSUxFICopOworUHlBUElfRlVOQyh2b2lkKSBQeVN5c19TZXRBcmd2KGludCwgY2hhciAqKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5U3lzX1NldEFyZ3ZFeChpbnQsIGNoYXIgKiosIGludCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5U3lzX1NldFBhdGgoY2hhciAqKTsKKworUHlBUElfRlVOQyh2b2lkKSBQeVN5c19Xcml0ZVN0ZG91dChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKwkJCVB5X0dDQ19BVFRSSUJVVEUoKGZvcm1hdChwcmludGYsIDEsIDIpKSk7CitQeUFQSV9GVU5DKHZvaWQpIFB5U3lzX1dyaXRlU3RkZXJyKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCQkJUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKKworUHlBUElfRlVOQyh2b2lkKSBQeVN5c19SZXNldFdhcm5PcHRpb25zKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeVN5c19BZGRXYXJuT3B0aW9uKGNoYXIgKik7CitQeUFQSV9GVU5DKGludCkgUHlTeXNfSGFzV2Fybk9wdGlvbnModm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1NZU01PRFVMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy90aW1lZnVuY3MuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3RpbWVmdW5jcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZDI2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy90aW1lZnVuY3MuaApAQCAtMCwwICsxLDI2IEBACisvKiAgdGltZWZ1bmNzLmgKKyAqLworCisvKiBVdGlsaXR5IGZ1bmN0aW9uIHJlbGF0ZWQgdG8gdGltZW1vZHVsZS5jLiAqLworCisjaWZuZGVmIFRJTUVGVU5DU19ICisjZGVmaW5lIFRJTUVGVU5DU19ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogQ2FzdCBkb3VibGUgeCB0byB0aW1lX3QsIGJ1dCByYWlzZSBWYWx1ZUVycm9yIGlmIHggaXMgdG9vIGxhcmdlCisgKiB0byBmaXQgaW4gYSB0aW1lX3QuICBWYWx1ZUVycm9yIGlzIHNldCBvbiByZXR1cm4gaWZmIHRoZSByZXR1cm4KKyAqIHZhbHVlIGlzICh0aW1lX3QpLTEgYW5kIFB5RXJyX09jY3VycmVkKCkuCisgKi8KK1B5QVBJX0ZVTkModGltZV90KSBfUHlUaW1lX0RvdWJsZVRvVGltZXQoZG91YmxlIHgpOworCisvKiBHZXQgdGhlIGN1cnJlbnQgdGltZSBzaW5jZSB0aGUgZXBvY2ggaW4gc2Vjb25kcyAqLworUHlBUElfRlVOQyhkb3VibGUpIF9QeVRpbWVfRmxvYXRUaW1lKHZvaWQpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgIC8qIFRJTUVGVU5DU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy90b2tlbi5oIGIvaW5jbHVkZS9weXRob24yLjcvdG9rZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjY1OWFjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvdG9rZW4uaApAQCAtMCwwICsxLDg1IEBACisKKy8qIFRva2VuIHR5cGVzICovCisKKyNpZm5kZWYgUHlfVE9LRU5fSAorI2RlZmluZSBQeV9UT0tFTl9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyN1bmRlZiBUSUxERSAgIC8qIFByZXZlbnQgY2xhc2ggb2Ygb3VyIGRlZmluaXRpb24gd2l0aCBzeXN0ZW0gbWFjcm8uIEV4IEFJWCwgaW9jdGwuaCAqLworCisjZGVmaW5lIEVORE1BUktFUgkwCisjZGVmaW5lIE5BTUUJCTEKKyNkZWZpbmUgTlVNQkVSCQkyCisjZGVmaW5lIFNUUklORwkJMworI2RlZmluZSBORVdMSU5FCQk0CisjZGVmaW5lIElOREVOVAkJNQorI2RlZmluZSBERURFTlQJCTYKKyNkZWZpbmUgTFBBUgkJNworI2RlZmluZSBSUEFSCQk4CisjZGVmaW5lIExTUUIJCTkKKyNkZWZpbmUgUlNRQgkJMTAKKyNkZWZpbmUgQ09MT04JCTExCisjZGVmaW5lIENPTU1BCQkxMgorI2RlZmluZSBTRU1JCQkxMworI2RlZmluZSBQTFVTCQkxNAorI2RlZmluZSBNSU5VUwkJMTUKKyNkZWZpbmUgU1RBUgkJMTYKKyNkZWZpbmUgU0xBU0gJCTE3CisjZGVmaW5lIFZCQVIJCTE4CisjZGVmaW5lIEFNUEVSCQkxOQorI2RlZmluZSBMRVNTCQkyMAorI2RlZmluZSBHUkVBVEVSCQkyMQorI2RlZmluZSBFUVVBTAkJMjIKKyNkZWZpbmUgRE9UCQkyMworI2RlZmluZSBQRVJDRU5UCQkyNAorI2RlZmluZSBCQUNLUVVPVEUJMjUKKyNkZWZpbmUgTEJSQUNFCQkyNgorI2RlZmluZSBSQlJBQ0UJCTI3CisjZGVmaW5lIEVRRVFVQUwJCTI4CisjZGVmaW5lIE5PVEVRVUFMCTI5CisjZGVmaW5lIExFU1NFUVVBTAkzMAorI2RlZmluZSBHUkVBVEVSRVFVQUwJMzEKKyNkZWZpbmUgVElMREUJCTMyCisjZGVmaW5lIENJUkNVTUZMRVgJMzMKKyNkZWZpbmUgTEVGVFNISUZUCTM0CisjZGVmaW5lIFJJR0hUU0hJRlQJMzUKKyNkZWZpbmUgRE9VQkxFU1RBUgkzNgorI2RlZmluZSBQTFVTRVFVQUwJMzcKKyNkZWZpbmUgTUlORVFVQUwJMzgKKyNkZWZpbmUgU1RBUkVRVUFMCTM5CisjZGVmaW5lIFNMQVNIRVFVQUwJNDAKKyNkZWZpbmUgUEVSQ0VOVEVRVUFMCTQxCisjZGVmaW5lIEFNUEVSRVFVQUwJNDIKKyNkZWZpbmUgVkJBUkVRVUFMCTQzCisjZGVmaW5lIENJUkNVTUZMRVhFUVVBTAk0NAorI2RlZmluZSBMRUZUU0hJRlRFUVVBTAk0NQorI2RlZmluZSBSSUdIVFNISUZURVFVQUwJNDYKKyNkZWZpbmUgRE9VQkxFU1RBUkVRVUFMCTQ3CisjZGVmaW5lIERPVUJMRVNMQVNICTQ4CisjZGVmaW5lIERPVUJMRVNMQVNIRVFVQUwgNDkKKyNkZWZpbmUgQVQgICAgICAgICAgICAgIDUwCQorLyogRG9uJ3QgZm9yZ2V0IHRvIHVwZGF0ZSB0aGUgdGFibGUgX1B5UGFyc2VyX1Rva2VuTmFtZXMgaW4gdG9rZW5pemVyLmMhICovCisjZGVmaW5lIE9QCQk1MQorI2RlZmluZSBFUlJPUlRPS0VOCTUyCisjZGVmaW5lIE5fVE9LRU5TCTUzCisKKy8qIFNwZWNpYWwgZGVmaW5pdGlvbnMgZm9yIGNvb3BlcmF0aW9uIHdpdGggcGFyc2VyICovCisKKyNkZWZpbmUgTlRfT0ZGU0VUCQkyNTYKKworI2RlZmluZSBJU1RFUk1JTkFMKHgpCQkoKHgpIDwgTlRfT0ZGU0VUKQorI2RlZmluZSBJU05PTlRFUk1JTkFMKHgpCSgoeCkgPj0gTlRfT0ZGU0VUKQorI2RlZmluZSBJU0VPRih4KQkJKCh4KSA9PSBFTkRNQVJLRVIpCisKKworUHlBUElfREFUQShjaGFyICopIF9QeVBhcnNlcl9Ub2tlbk5hbWVzW107IC8qIFRva2VuIG5hbWVzICovCitQeUFQSV9GVU5DKGludCkgUHlUb2tlbl9PbmVDaGFyKGludCk7CitQeUFQSV9GVU5DKGludCkgUHlUb2tlbl9Ud29DaGFycyhpbnQsIGludCk7CitQeUFQSV9GVU5DKGludCkgUHlUb2tlbl9UaHJlZUNoYXJzKGludCwgaW50LCBpbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9UT0tFTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy90cmFjZWJhY2suaCBiL2luY2x1ZGUvcHl0aG9uMi43L3RyYWNlYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OTQzZGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy90cmFjZWJhY2suaApAQCAtMCwwICsxLDMxIEBACisKKyNpZm5kZWYgUHlfVFJBQ0VCQUNLX0gKKyNkZWZpbmUgUHlfVFJBQ0VCQUNLX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IF9mcmFtZTsKKworLyogVHJhY2ViYWNrIGludGVyZmFjZSAqLworCit0eXBlZGVmIHN0cnVjdCBfdHJhY2ViYWNrIHsKKwlQeU9iamVjdF9IRUFECisJc3RydWN0IF90cmFjZWJhY2sgKnRiX25leHQ7CisJc3RydWN0IF9mcmFtZSAqdGJfZnJhbWU7CisJaW50IHRiX2xhc3RpOworCWludCB0Yl9saW5lbm87Cit9IFB5VHJhY2ViYWNrT2JqZWN0OworCitQeUFQSV9GVU5DKGludCkgUHlUcmFjZUJhY2tfSGVyZShzdHJ1Y3QgX2ZyYW1lICopOworUHlBUElfRlVOQyhpbnQpIFB5VHJhY2VCYWNrX1ByaW50KFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIF9QeV9EaXNwbGF5U291cmNlTGluZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIGludCwgaW50KTsKKworLyogUmV2ZWFsIHRyYWNlYmFjayB0eXBlIHNvIHdlIGNhbiB0eXBlY2hlY2sgdHJhY2ViYWNrIG9iamVjdHMgKi8KK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVRyYWNlQmFja19UeXBlOworI2RlZmluZSBQeVRyYWNlQmFja19DaGVjayh2KSAoUHlfVFlQRSh2KSA9PSAmUHlUcmFjZUJhY2tfVHlwZSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfVFJBQ0VCQUNLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3R1cGxlb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy90dXBsZW9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YWI3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy90dXBsZW9iamVjdC5oCkBAIC0wLDAgKzEsNjEgQEAKKworLyogVHVwbGUgb2JqZWN0IGludGVyZmFjZSAqLworCisjaWZuZGVmIFB5X1RVUExFT0JKRUNUX0gKKyNkZWZpbmUgUHlfVFVQTEVPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKgorQW5vdGhlciBnZW5lcmFsbHkgdXNlZnVsIG9iamVjdCB0eXBlIGlzIGEgdHVwbGUgb2Ygb2JqZWN0IHBvaW50ZXJzLgorRm9yIFB5dGhvbiwgdGhpcyBpcyBhbiBpbW11dGFibGUgdHlwZS4gIEMgY29kZSBjYW4gY2hhbmdlIHRoZSB0dXBsZSBpdGVtcworKGJ1dCBub3QgdGhlaXIgbnVtYmVyKSwgYW5kIGV2ZW4gdXNlIHR1cGxlcyBhcmUgZ2VuZXJhbC1wdXJwb3NlIGFycmF5cyBvZgorb2JqZWN0IHJlZmVyZW5jZXMsIGJ1dCBpbiBnZW5lcmFsIG9ubHkgYnJhbmQgbmV3IHR1cGxlcyBzaG91bGQgYmUgbXV0YXRlZCwKK25vdCBvbmVzIHRoYXQgbWlnaHQgYWxyZWFkeSBoYXZlIGJlZW4gZXhwb3NlZCB0byBQeXRob24gY29kZS4KKworKioqIFdBUk5JTkcgKioqIFB5VHVwbGVfU2V0SXRlbSBkb2VzIG5vdCBpbmNyZW1lbnQgdGhlIG5ldyBpdGVtJ3MgcmVmZXJlbmNlCitjb3VudCwgYnV0IGRvZXMgZGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGl0ZW0gaXQgcmVwbGFjZXMsCitpZiBub3QgbmlsLiAgSXQgZG9lcyAqZGVjcmVtZW50KiB0aGUgcmVmZXJlbmNlIGNvdW50IGlmIGl0IGlzICpub3QqCitpbnNlcnRlZCBpbiB0aGUgdHVwbGUuICBTaW1pbGFybHksIFB5VHVwbGVfR2V0SXRlbSBkb2VzIG5vdCBpbmNyZW1lbnQgdGhlCityZXR1cm5lZCBpdGVtJ3MgcmVmZXJlbmNlIGNvdW50LgorKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X1ZBUl9IRUFECisgICAgUHlPYmplY3QgKm9iX2l0ZW1bMV07CisKKyAgICAvKiBvYl9pdGVtIGNvbnRhaW5zIHNwYWNlIGZvciAnb2Jfc2l6ZScgZWxlbWVudHMuCisgICAgICogSXRlbXMgbXVzdCBub3JtYWxseSBub3QgYmUgTlVMTCwgZXhjZXB0IGR1cmluZyBjb25zdHJ1Y3Rpb24gd2hlbgorICAgICAqIHRoZSB0dXBsZSBpcyBub3QgeWV0IHZpc2libGUgb3V0c2lkZSB0aGUgZnVuY3Rpb24gdGhhdCBidWlsZHMgaXQuCisgICAgICovCit9IFB5VHVwbGVPYmplY3Q7CisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVR1cGxlX1R5cGU7CisKKyNkZWZpbmUgUHlUdXBsZV9DaGVjayhvcCkgXAorICAgICAgICAgICAgICAgICBQeVR5cGVfRmFzdFN1YmNsYXNzKFB5X1RZUEUob3ApLCBQeV9UUEZMQUdTX1RVUExFX1NVQkNMQVNTKQorI2RlZmluZSBQeVR1cGxlX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlUdXBsZV9UeXBlKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VHVwbGVfTmV3KFB5X3NzaXplX3Qgc2l6ZSk7CitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5VHVwbGVfU2l6ZShQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlUdXBsZV9HZXRJdGVtKFB5T2JqZWN0ICosIFB5X3NzaXplX3QpOworUHlBUElfRlVOQyhpbnQpIFB5VHVwbGVfU2V0SXRlbShQeU9iamVjdCAqLCBQeV9zc2l6ZV90LCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlUdXBsZV9HZXRTbGljZShQeU9iamVjdCAqLCBQeV9zc2l6ZV90LCBQeV9zc2l6ZV90KTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlUdXBsZV9SZXNpemUoUHlPYmplY3QgKiosIFB5X3NzaXplX3QpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVR1cGxlX1BhY2soUHlfc3NpemVfdCwgLi4uKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5VHVwbGVfTWF5YmVVbnRyYWNrKFB5T2JqZWN0ICopOworCisvKiBNYWNybywgdHJhZGluZyBzYWZldHkgZm9yIHNwZWVkICovCisjZGVmaW5lIFB5VHVwbGVfR0VUX0lURU0ob3AsIGkpICgoKFB5VHVwbGVPYmplY3QgKikob3ApKS0+b2JfaXRlbVtpXSkKKyNkZWZpbmUgUHlUdXBsZV9HRVRfU0laRShvcCkgICAgUHlfU0laRShvcCkKKworLyogTWFjcm8sICpvbmx5KiB0byBiZSB1c2VkIHRvIGZpbGwgaW4gYnJhbmQgbmV3IHR1cGxlcyAqLworI2RlZmluZSBQeVR1cGxlX1NFVF9JVEVNKG9wLCBpLCB2KSAoKChQeVR1cGxlT2JqZWN0ICopKG9wKSktPm9iX2l0ZW1baV0gPSB2KQorCitQeUFQSV9GVU5DKGludCkgUHlUdXBsZV9DbGVhckZyZWVMaXN0KHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9UVVBMRU9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy91Y25oYXNoLmggYi9pbmNsdWRlL3B5dGhvbjIuNy91Y25oYXNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliNzc3NAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3Vjbmhhc2guaApAQCAtMCwwICsxLDMzIEBACisvKiBVbmljb2RlIG5hbWUgZGF0YWJhc2UgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfVUNOSEFTSF9ICisjZGVmaW5lIFB5X1VDTkhBU0hfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiByZXZpc2VkIHVjbmhhc2ggQ0FQSSBpbnRlcmZhY2UgKGV4cG9ydGVkIHRocm91Z2ggYSAid3JhcHBlciIpICovCisKKyNkZWZpbmUgUHlVbmljb2RlRGF0YV9DQVBTVUxFX05BTUUgInVuaWNvZGVkYXRhLnVjbmhhc2hfQ0FQSSIKKwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgLyogU2l6ZSBvZiB0aGlzIHN0cnVjdCAqLworICAgIGludCBzaXplOworCisgICAgLyogR2V0IG5hbWUgZm9yIGEgZ2l2ZW4gY2hhcmFjdGVyIGNvZGUuICBSZXR1cm5zIG5vbi16ZXJvIGlmCisgICAgICAgc3VjY2VzcywgemVybyBpZiBub3QuICBEb2VzIG5vdCBzZXQgUHl0aG9uIGV4Y2VwdGlvbnMuIAorICAgICAgIElmIHNlbGYgaXMgTlVMTCwgZGF0YSBjb21lIGZyb20gdGhlIGRlZmF1bHQgdmVyc2lvbiBvZiB0aGUgZGF0YWJhc2UuCisgICAgICAgSWYgaXQgaXMgbm90IE5VTEwsIGl0IHNob3VsZCBiZSBhIHVuaWNvZGVkYXRhLnVjZF9YX1lfWiBvYmplY3QgKi8KKyAgICBpbnQgKCpnZXRuYW1lKShQeU9iamVjdCAqc2VsZiwgUHlfVUNTNCBjb2RlLCBjaGFyKiBidWZmZXIsIGludCBidWZsZW4pOworCisgICAgLyogR2V0IGNoYXJhY3RlciBjb2RlIGZvciBhIGdpdmVuIG5hbWUuICBTYW1lIGVycm9yIGhhbmRsaW5nCisgICAgICAgYXMgZm9yIGdldG5hbWUuICovCisgICAgaW50ICgqZ2V0Y29kZSkoUHlPYmplY3QgKnNlbGYsIGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lbGVuLCBQeV9VQ1M0KiBjb2RlKTsKKworfSBfUHlVbmljb2RlX05hbWVfQ0FQSTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfVUNOSEFTSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy91bmljb2Rlb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy91bmljb2Rlb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiNzI0YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3VuaWNvZGVvYmplY3QuaApAQCAtMCwwICsxLDE0MTMgQEAKKyNpZm5kZWYgUHlfVU5JQ09ERU9CSkVDVF9ICisjZGVmaW5lIFB5X1VOSUNPREVPQkpFQ1RfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qCisKK1VuaWNvZGUgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gb3JpZ2luYWwgY29kZSBieSBGcmVkcmlrIEx1bmRoLAorbW9kaWZpZWQgYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pIGFjY29yZGluZyB0byB0aGUKK1VuaWNvZGUgSW50ZWdyYXRpb24gUHJvcG9zYWwgKHNlZSBmaWxlIE1pc2MvdW5pY29kZS50eHQpLgorCitDb3B5cmlnaHQgKGMpIENvcnBvcmF0aW9uIGZvciBOYXRpb25hbCBSZXNlYXJjaCBJbml0aWF0aXZlcy4KKworCisgT3JpZ2luYWwgaGVhZGVyOgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAqIFlldCBhbm90aGVyIFVuaWNvZGUgc3RyaW5nIHR5cGUgZm9yIFB5dGhvbi4gIFRoaXMgdHlwZSBzdXBwb3J0cyB0aGUKKyAqIDE2LWJpdCBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUgKEJNUCkgb25seS4KKyAqCisgKiBXcml0dGVuIGJ5IEZyZWRyaWsgTHVuZGgsIEphbnVhcnkgMTk5OS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgYnkgU2VjcmV0IExhYnMgQUIuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgYnkgRnJlZHJpayBMdW5kaC4KKyAqCisgKiBmcmVkcmlrQHB5dGhvbndhcmUuY29tCisgKiBodHRwOi8vd3d3LnB5dGhvbndhcmUuY29tCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgVW5pY29kZSBTdHJpbmcgVHlwZSBpcworICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBieSBTZWNyZXQgTGFicyBBQgorICogQ29weXJpZ2h0IChjKSAxOTk5IGJ5IEZyZWRyaWsgTHVuZGgKKyAqCisgKiBCeSBvYnRhaW5pbmcsIHVzaW5nLCBhbmQvb3IgY29weWluZyB0aGlzIHNvZnR3YXJlIGFuZC9vciBpdHMKKyAqIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiwgeW91IGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwKKyAqIGFuZCB3aWxsIGNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnM6CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkKKyAqIGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwKKyAqIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UKKyAqIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFNlY3JldCBMYWJzCisgKiBBQiBvciB0aGUgYXV0aG9yIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCisgKiBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IKKyAqIHBlcm1pc3Npb24uCisgKgorICogU0VDUkVUIExBQlMgQUIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCisgKiBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgKiBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0VDUkVUIExBQlMgQUIgT1IgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisgKiBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qID09PSBJbnRlcm5hbCBBUEkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiAtLS0gSW50ZXJuYWwgVW5pY29kZSBGb3JtYXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBQeV9VU0lOR19VTklDT0RFCisKKyNkZWZpbmUgUHlVbmljb2RlX0NoZWNrKG9wKSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQeVVuaWNvZGVfQ2hlY2tFeGFjdChvcCkgICAgICAgICAgICAwCisKKyNlbHNlCisKKy8qIEZJWE1FOiBNdkwncyBuZXcgaW1wbGVtZW50YXRpb24gYXNzdW1lcyB0aGF0IFB5X1VOSUNPREVfU0laRSBpcworICAgcHJvcGVybHkgc2V0LCBidXQgdGhlIGRlZmF1bHQgcnVsZXMgYmVsb3cgZG9lc24ndCBzZXQgaXQuICBJJ2xsCisgICBzb3J0IHRoaXMgb3V0IHNvbWUgb3RoZXIgZGF5IC0tIGZyZWRyaWtAcHl0aG9ud2FyZS5jb20gKi8KKworI2lmbmRlZiBQeV9VTklDT0RFX1NJWkUKKyNlcnJvciBNdXN0IGRlZmluZSBQeV9VTklDT0RFX1NJWkUKKyNlbmRpZgorCisvKiBTZXR0aW5nIFB5X1VOSUNPREVfV0lERSBlbmFibGVzIFVDUy00IHN0b3JhZ2UuICBPdGhlcndpc2UsIFVuaWNvZGUKKyAgIHN0cmluZ3MgYXJlIHN0b3JlZCBhcyBVQ1MtMiAod2l0aCBsaW1pdGVkIHN1cHBvcnQgZm9yIFVURi0xNikgKi8KKworI2lmIFB5X1VOSUNPREVfU0laRSA+PSA0CisjZGVmaW5lIFB5X1VOSUNPREVfV0lERQorI2VuZGlmCisKKy8qIFNldCB0aGVzZSBmbGFncyBpZiB0aGUgcGxhdGZvcm0gaGFzICJ3Y2hhci5oIiwgIndjdHlwZS5oIiBhbmQgdGhlCisgICB3Y2hhcl90IHR5cGUgaXMgYSAxNi1iaXQgdW5zaWduZWQgdHlwZSAqLworLyogI2RlZmluZSBIQVZFX1dDSEFSX0ggKi8KKy8qICNkZWZpbmUgSEFWRV9VU0FCTEVfV0NIQVJfVCAqLworCisvKiBEZWZhdWx0cyBmb3IgdmFyaW91cyBwbGF0Zm9ybXMgKi8KKyNpZm5kZWYgUFlfVU5JQ09ERV9UWVBFCisKKy8qIFdpbmRvd3MgaGFzIGEgdXNhYmxlIHdjaGFyX3QgdHlwZSAodW5sZXNzIHdlJ3JlIHVzaW5nIFVDUy00KSAqLworIyBpZiBkZWZpbmVkKE1TX1dJTjMyKSAmJiBQeV9VTklDT0RFX1NJWkUgPT0gMgorIyAgZGVmaW5lIEhBVkVfVVNBQkxFX1dDSEFSX1QKKyMgIGRlZmluZSBQWV9VTklDT0RFX1RZUEUgd2NoYXJfdAorIyBlbmRpZgorCisjIGlmIGRlZmluZWQoUHlfVU5JQ09ERV9XSURFKQorIyAgZGVmaW5lIFBZX1VOSUNPREVfVFlQRSBQeV9VQ1M0CisjIGVuZGlmCisKKyNlbmRpZgorCisvKiBJZiB0aGUgY29tcGlsZXIgcHJvdmlkZXMgYSB3Y2hhcl90IHR5cGUgd2UgdHJ5IHRvIHN1cHBvcnQgaXQKKyAgIHRocm91Z2ggdGhlIGludGVyZmFjZSBmdW5jdGlvbnMgUHlVbmljb2RlX0Zyb21XaWRlQ2hhcigpIGFuZAorICAgUHlVbmljb2RlX0FzV2lkZUNoYXIoKS4gKi8KKworI2lmZGVmIEhBVkVfVVNBQkxFX1dDSEFSX1QKKyMgaWZuZGVmIEhBVkVfV0NIQVJfSAorIyAgZGVmaW5lIEhBVkVfV0NIQVJfSAorIyBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1dDSEFSX0gKKy8qIFdvcmsgYXJvdW5kIGEgY29zbWV0aWMgYnVnIGluIEJTREkgNC54IHdjaGFyLmg7IHRoYW5rcyB0byBUaG9tYXMgV291dGVycyAqLworIyBpZmRlZiBfSEFWRV9CU0RJCisjICBpbmNsdWRlIDx0aW1lLmg+CisjIGVuZGlmCisjICBpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmCisKKy8qCisgKiBVc2UgdGhpcyB0eXBlZGVmIHdoZW4geW91IG5lZWQgdG8gcmVwcmVzZW50IGEgVVRGLTE2IHN1cnJvZ2F0ZSBwYWlyCisgKiBhcyBzaW5nbGUgdW5zaWduZWQgaW50ZWdlci4KKyAqLworI2lmIFNJWkVPRl9JTlQgPj0gNAordHlwZWRlZiB1bnNpZ25lZCBpbnQgUHlfVUNTNDsKKyNlbGlmIFNJWkVPRl9MT05HID49IDQKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBQeV9VQ1M0OworI2VuZGlmCisKKy8qIFB5X1VOSUNPREUgaXMgdGhlIG5hdGl2ZSBVbmljb2RlIHN0b3JhZ2UgZm9ybWF0IChjb2RlIHVuaXQpIHVzZWQgYnkKKyAgIFB5dGhvbiBhbmQgcmVwcmVzZW50cyBhIHNpbmdsZSBVbmljb2RlIGVsZW1lbnQgaW4gdGhlIFVuaWNvZGUKKyAgIHR5cGUuICovCisKK3R5cGVkZWYgUFlfVU5JQ09ERV9UWVBFIFB5X1VOSUNPREU7CisKKy8qIC0tLSBVQ1MtMi9VQ1MtNCBOYW1lIE1hbmdsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBVbmljb2RlIEFQSSBuYW1lcyBhcmUgbWFuZ2xlZCB0byBhc3N1cmUgdGhhdCBVQ1MtMiBhbmQgVUNTLTQgYnVpbGRzCisgICBwcm9kdWNlIGRpZmZlcmVudCBleHRlcm5hbCBuYW1lcyBhbmQgdGh1cyBjYXVzZSBpbXBvcnQgZXJyb3JzIGluCisgICBjYXNlIFB5dGhvbiBpbnRlcnByZXRlcnMgYW5kIGV4dGVuc2lvbnMgd2l0aCBtaXhlZCBjb21waWxlZCBpbgorICAgVW5pY29kZSB3aWR0aCBhc3N1bXB0aW9ucyBhcmUgY29tYmluZWQuICovCisKKyNpZm5kZWYgUHlfVU5JQ09ERV9XSURFCisKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nIFB5VW5pY29kZVVDUzJfQXNBU0NJSVN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZyBQeVVuaWNvZGVVQ1MyX0FzQ2hhcm1hcFN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdCBQeVVuaWNvZGVVQ1MyX0FzRW5jb2RlZE9iamVjdAorIyBkZWZpbmUgUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyBQeVVuaWNvZGVVQ1MyX0FzRW5jb2RlZFN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nIFB5VW5pY29kZVVDUzJfQXNMYXRpbjFTdHJpbmcKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcgUHlVbmljb2RlVUNTMl9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc1VURjMyU3RyaW5nIFB5VW5pY29kZVVDUzJfQXNVVEYzMlN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0FzVVRGMTZTdHJpbmcgUHlVbmljb2RlVUNTMl9Bc1VURjE2U3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nIFB5VW5pY29kZVVDUzJfQXNVVEY4U3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNVbmljb2RlIFB5VW5pY29kZVVDUzJfQXNVbmljb2RlCisjIGRlZmluZSBQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nIFB5VW5pY29kZVVDUzJfQXNVbmljb2RlRXNjYXBlU3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNXaWRlQ2hhciBQeVVuaWNvZGVVQ1MyX0FzV2lkZUNoYXIKKyMgZGVmaW5lIFB5VW5pY29kZV9DbGVhckZyZWVMaXN0IFB5VW5pY29kZVVDUzJfQ2xlYXJGcmVlbGlzdAorIyBkZWZpbmUgUHlVbmljb2RlX0NvbXBhcmUgUHlVbmljb2RlVUNTMl9Db21wYXJlCisjIGRlZmluZSBQeVVuaWNvZGVfQ29uY2F0IFB5VW5pY29kZVVDUzJfQ29uY2F0CisjIGRlZmluZSBQeVVuaWNvZGVfQ29udGFpbnMgUHlVbmljb2RlVUNTMl9Db250YWlucworIyBkZWZpbmUgUHlVbmljb2RlX0NvdW50IFB5VW5pY29kZVVDUzJfQ291bnQKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGUgUHlVbmljb2RlVUNTMl9EZWNvZGUKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVBU0NJSSBQeVVuaWNvZGVVQ1MyX0RlY29kZUFTQ0lJCisjIGRlZmluZSBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcCBQeVVuaWNvZGVVQ1MyX0RlY29kZUNoYXJtYXAKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVMYXRpbjEgUHlVbmljb2RlVUNTMl9EZWNvZGVMYXRpbjEKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlIFB5VW5pY29kZVVDUzJfRGVjb2RlUmF3VW5pY29kZUVzY2FwZQorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZVVURjMyIFB5VW5pY29kZVVDUzJfRGVjb2RlVVRGMzIKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsIFB5VW5pY29kZVVDUzJfRGVjb2RlVVRGMzJTdGF0ZWZ1bAorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZVVURjE2IFB5VW5pY29kZVVDUzJfRGVjb2RlVVRGMTYKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsIFB5VW5pY29kZVVDUzJfRGVjb2RlVVRGMTZTdGF0ZWZ1bAorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZVVURjggUHlVbmljb2RlVUNTMl9EZWNvZGVVVEY4CisjIGRlZmluZSBQeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsIFB5VW5pY29kZVVDUzJfRGVjb2RlVVRGOFN0YXRlZnVsCisjIGRlZmluZSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZSBQeVVuaWNvZGVVQ1MyX0RlY29kZVVuaWNvZGVFc2NhcGUKKyMgZGVmaW5lIFB5VW5pY29kZV9FbmNvZGUgUHlVbmljb2RlVUNTMl9FbmNvZGUKKyMgZGVmaW5lIFB5VW5pY29kZV9FbmNvZGVBU0NJSSBQeVVuaWNvZGVVQ1MyX0VuY29kZUFTQ0lJCisjIGRlZmluZSBQeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcCBQeVVuaWNvZGVVQ1MyX0VuY29kZUNoYXJtYXAKKyMgZGVmaW5lIFB5VW5pY29kZV9FbmNvZGVEZWNpbWFsIFB5VW5pY29kZVVDUzJfRW5jb2RlRGVjaW1hbAorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZUxhdGluMSBQeVVuaWNvZGVVQ1MyX0VuY29kZUxhdGluMQorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZVJhd1VuaWNvZGVFc2NhcGUgUHlVbmljb2RlVUNTMl9FbmNvZGVSYXdVbmljb2RlRXNjYXBlCisjIGRlZmluZSBQeVVuaWNvZGVfRW5jb2RlVVRGMzIgUHlVbmljb2RlVUNTMl9FbmNvZGVVVEYzMgorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZVVURjE2IFB5VW5pY29kZVVDUzJfRW5jb2RlVVRGMTYKKyMgZGVmaW5lIFB5VW5pY29kZV9FbmNvZGVVVEY4IFB5VW5pY29kZVVDUzJfRW5jb2RlVVRGOAorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZVVuaWNvZGVFc2NhcGUgUHlVbmljb2RlVUNTMl9FbmNvZGVVbmljb2RlRXNjYXBlCisjIGRlZmluZSBQeVVuaWNvZGVfRmluZCBQeVVuaWNvZGVVQ1MyX0ZpbmQKKyMgZGVmaW5lIFB5VW5pY29kZV9Gb3JtYXQgUHlVbmljb2RlVUNTMl9Gb3JtYXQKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCBQeVVuaWNvZGVVQ1MyX0Zyb21FbmNvZGVkT2JqZWN0CisjIGRlZmluZSBQeVVuaWNvZGVfRnJvbUZvcm1hdCBQeVVuaWNvZGVVQ1MyX0Zyb21Gb3JtYXQKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tRm9ybWF0ViBQeVVuaWNvZGVVQ1MyX0Zyb21Gb3JtYXRWCisjIGRlZmluZSBQeVVuaWNvZGVfRnJvbU9iamVjdCBQeVVuaWNvZGVVQ1MyX0Zyb21PYmplY3QKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tT3JkaW5hbCBQeVVuaWNvZGVVQ1MyX0Zyb21PcmRpbmFsCisjIGRlZmluZSBQeVVuaWNvZGVfRnJvbVN0cmluZyBQeVVuaWNvZGVVQ1MyX0Zyb21TdHJpbmcKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZSBQeVVuaWNvZGVVQ1MyX0Zyb21TdHJpbmdBbmRTaXplCisjIGRlZmluZSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUgUHlVbmljb2RlVUNTMl9Gcm9tVW5pY29kZQorIyBkZWZpbmUgUHlVbmljb2RlX0Zyb21XaWRlQ2hhciBQeVVuaWNvZGVVQ1MyX0Zyb21XaWRlQ2hhcgorIyBkZWZpbmUgUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZyBQeVVuaWNvZGVVQ1MyX0dldERlZmF1bHRFbmNvZGluZworIyBkZWZpbmUgUHlVbmljb2RlX0dldE1heCBQeVVuaWNvZGVVQ1MyX0dldE1heAorIyBkZWZpbmUgUHlVbmljb2RlX0dldFNpemUgUHlVbmljb2RlVUNTMl9HZXRTaXplCisjIGRlZmluZSBQeVVuaWNvZGVfSm9pbiBQeVVuaWNvZGVVQ1MyX0pvaW4KKyMgZGVmaW5lIFB5VW5pY29kZV9QYXJ0aXRpb24gUHlVbmljb2RlVUNTMl9QYXJ0aXRpb24KKyMgZGVmaW5lIFB5VW5pY29kZV9SUGFydGl0aW9uIFB5VW5pY29kZVVDUzJfUlBhcnRpdGlvbgorIyBkZWZpbmUgUHlVbmljb2RlX1JTcGxpdCBQeVVuaWNvZGVVQ1MyX1JTcGxpdAorIyBkZWZpbmUgUHlVbmljb2RlX1JlcGxhY2UgUHlVbmljb2RlVUNTMl9SZXBsYWNlCisjIGRlZmluZSBQeVVuaWNvZGVfUmVzaXplIFB5VW5pY29kZVVDUzJfUmVzaXplCisjIGRlZmluZSBQeVVuaWNvZGVfUmljaENvbXBhcmUgUHlVbmljb2RlVUNTMl9SaWNoQ29tcGFyZQorIyBkZWZpbmUgUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZyBQeVVuaWNvZGVVQ1MyX1NldERlZmF1bHRFbmNvZGluZworIyBkZWZpbmUgUHlVbmljb2RlX1NwbGl0IFB5VW5pY29kZVVDUzJfU3BsaXQKKyMgZGVmaW5lIFB5VW5pY29kZV9TcGxpdGxpbmVzIFB5VW5pY29kZVVDUzJfU3BsaXRsaW5lcworIyBkZWZpbmUgUHlVbmljb2RlX1RhaWxtYXRjaCBQeVVuaWNvZGVVQ1MyX1RhaWxtYXRjaAorIyBkZWZpbmUgUHlVbmljb2RlX1RyYW5zbGF0ZSBQeVVuaWNvZGVVQ1MyX1RyYW5zbGF0ZQorIyBkZWZpbmUgUHlVbmljb2RlX1RyYW5zbGF0ZUNoYXJtYXAgUHlVbmljb2RlVUNTMl9UcmFuc2xhdGVDaGFybWFwCisjIGRlZmluZSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcgX1B5VW5pY29kZVVDUzJfQXNEZWZhdWx0RW5jb2RlZFN0cmluZworIyBkZWZpbmUgX1B5VW5pY29kZV9GaW5pIF9QeVVuaWNvZGVVQ1MyX0ZpbmkKKyMgZGVmaW5lIF9QeVVuaWNvZGVfSW5pdCBfUHlVbmljb2RlVUNTMl9Jbml0CisjIGRlZmluZSBfUHlVbmljb2RlX0lzQWxwaGEgX1B5VW5pY29kZVVDUzJfSXNBbHBoYQorIyBkZWZpbmUgX1B5VW5pY29kZV9Jc0RlY2ltYWxEaWdpdCBfUHlVbmljb2RlVUNTMl9Jc0RlY2ltYWxEaWdpdAorIyBkZWZpbmUgX1B5VW5pY29kZV9Jc0RpZ2l0IF9QeVVuaWNvZGVVQ1MyX0lzRGlnaXQKKyMgZGVmaW5lIF9QeVVuaWNvZGVfSXNMaW5lYnJlYWsgX1B5VW5pY29kZVVDUzJfSXNMaW5lYnJlYWsKKyMgZGVmaW5lIF9QeVVuaWNvZGVfSXNMb3dlcmNhc2UgX1B5VW5pY29kZVVDUzJfSXNMb3dlcmNhc2UKKyMgZGVmaW5lIF9QeVVuaWNvZGVfSXNOdW1lcmljIF9QeVVuaWNvZGVVQ1MyX0lzTnVtZXJpYworIyBkZWZpbmUgX1B5VW5pY29kZV9Jc1RpdGxlY2FzZSBfUHlVbmljb2RlVUNTMl9Jc1RpdGxlY2FzZQorIyBkZWZpbmUgX1B5VW5pY29kZV9Jc1VwcGVyY2FzZSBfUHlVbmljb2RlVUNTMl9Jc1VwcGVyY2FzZQorIyBkZWZpbmUgX1B5VW5pY29kZV9Jc1doaXRlc3BhY2UgX1B5VW5pY29kZVVDUzJfSXNXaGl0ZXNwYWNlCisjIGRlZmluZSBfUHlVbmljb2RlX1RvRGVjaW1hbERpZ2l0IF9QeVVuaWNvZGVVQ1MyX1RvRGVjaW1hbERpZ2l0CisjIGRlZmluZSBfUHlVbmljb2RlX1RvRGlnaXQgX1B5VW5pY29kZVVDUzJfVG9EaWdpdAorIyBkZWZpbmUgX1B5VW5pY29kZV9Ub0xvd2VyY2FzZSBfUHlVbmljb2RlVUNTMl9Ub0xvd2VyY2FzZQorIyBkZWZpbmUgX1B5VW5pY29kZV9Ub051bWVyaWMgX1B5VW5pY29kZVVDUzJfVG9OdW1lcmljCisjIGRlZmluZSBfUHlVbmljb2RlX1RvVGl0bGVjYXNlIF9QeVVuaWNvZGVVQ1MyX1RvVGl0bGVjYXNlCisjIGRlZmluZSBfUHlVbmljb2RlX1RvVXBwZXJjYXNlIF9QeVVuaWNvZGVVQ1MyX1RvVXBwZXJjYXNlCisKKyNlbHNlCisKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nIFB5VW5pY29kZVVDUzRfQXNBU0NJSVN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZyBQeVVuaWNvZGVVQ1M0X0FzQ2hhcm1hcFN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdCBQeVVuaWNvZGVVQ1M0X0FzRW5jb2RlZE9iamVjdAorIyBkZWZpbmUgUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZyBQeVVuaWNvZGVVQ1M0X0FzRW5jb2RlZFN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0FzTGF0aW4xU3RyaW5nIFB5VW5pY29kZVVDUzRfQXNMYXRpbjFTdHJpbmcKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcgUHlVbmljb2RlVUNTNF9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc1VURjMyU3RyaW5nIFB5VW5pY29kZVVDUzRfQXNVVEYzMlN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0FzVVRGMTZTdHJpbmcgUHlVbmljb2RlVUNTNF9Bc1VURjE2U3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nIFB5VW5pY29kZVVDUzRfQXNVVEY4U3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNVbmljb2RlIFB5VW5pY29kZVVDUzRfQXNVbmljb2RlCisjIGRlZmluZSBQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nIFB5VW5pY29kZVVDUzRfQXNVbmljb2RlRXNjYXBlU3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNXaWRlQ2hhciBQeVVuaWNvZGVVQ1M0X0FzV2lkZUNoYXIKKyMgZGVmaW5lIFB5VW5pY29kZV9DbGVhckZyZWVMaXN0IFB5VW5pY29kZVVDUzRfQ2xlYXJGcmVlbGlzdAorIyBkZWZpbmUgUHlVbmljb2RlX0NvbXBhcmUgUHlVbmljb2RlVUNTNF9Db21wYXJlCisjIGRlZmluZSBQeVVuaWNvZGVfQ29uY2F0IFB5VW5pY29kZVVDUzRfQ29uY2F0CisjIGRlZmluZSBQeVVuaWNvZGVfQ29udGFpbnMgUHlVbmljb2RlVUNTNF9Db250YWlucworIyBkZWZpbmUgUHlVbmljb2RlX0NvdW50IFB5VW5pY29kZVVDUzRfQ291bnQKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGUgUHlVbmljb2RlVUNTNF9EZWNvZGUKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVBU0NJSSBQeVVuaWNvZGVVQ1M0X0RlY29kZUFTQ0lJCisjIGRlZmluZSBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcCBQeVVuaWNvZGVVQ1M0X0RlY29kZUNoYXJtYXAKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVMYXRpbjEgUHlVbmljb2RlVUNTNF9EZWNvZGVMYXRpbjEKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlIFB5VW5pY29kZVVDUzRfRGVjb2RlUmF3VW5pY29kZUVzY2FwZQorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZVVURjMyIFB5VW5pY29kZVVDUzRfRGVjb2RlVVRGMzIKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsIFB5VW5pY29kZVVDUzRfRGVjb2RlVVRGMzJTdGF0ZWZ1bAorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZVVURjE2IFB5VW5pY29kZVVDUzRfRGVjb2RlVVRGMTYKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsIFB5VW5pY29kZVVDUzRfRGVjb2RlVVRGMTZTdGF0ZWZ1bAorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZVVURjggUHlVbmljb2RlVUNTNF9EZWNvZGVVVEY4CisjIGRlZmluZSBQeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsIFB5VW5pY29kZVVDUzRfRGVjb2RlVVRGOFN0YXRlZnVsCisjIGRlZmluZSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZSBQeVVuaWNvZGVVQ1M0X0RlY29kZVVuaWNvZGVFc2NhcGUKKyMgZGVmaW5lIFB5VW5pY29kZV9FbmNvZGUgUHlVbmljb2RlVUNTNF9FbmNvZGUKKyMgZGVmaW5lIFB5VW5pY29kZV9FbmNvZGVBU0NJSSBQeVVuaWNvZGVVQ1M0X0VuY29kZUFTQ0lJCisjIGRlZmluZSBQeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcCBQeVVuaWNvZGVVQ1M0X0VuY29kZUNoYXJtYXAKKyMgZGVmaW5lIFB5VW5pY29kZV9FbmNvZGVEZWNpbWFsIFB5VW5pY29kZVVDUzRfRW5jb2RlRGVjaW1hbAorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZUxhdGluMSBQeVVuaWNvZGVVQ1M0X0VuY29kZUxhdGluMQorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZVJhd1VuaWNvZGVFc2NhcGUgUHlVbmljb2RlVUNTNF9FbmNvZGVSYXdVbmljb2RlRXNjYXBlCisjIGRlZmluZSBQeVVuaWNvZGVfRW5jb2RlVVRGMzIgUHlVbmljb2RlVUNTNF9FbmNvZGVVVEYzMgorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZVVURjE2IFB5VW5pY29kZVVDUzRfRW5jb2RlVVRGMTYKKyMgZGVmaW5lIFB5VW5pY29kZV9FbmNvZGVVVEY4IFB5VW5pY29kZVVDUzRfRW5jb2RlVVRGOAorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZVVuaWNvZGVFc2NhcGUgUHlVbmljb2RlVUNTNF9FbmNvZGVVbmljb2RlRXNjYXBlCisjIGRlZmluZSBQeVVuaWNvZGVfRmluZCBQeVVuaWNvZGVVQ1M0X0ZpbmQKKyMgZGVmaW5lIFB5VW5pY29kZV9Gb3JtYXQgUHlVbmljb2RlVUNTNF9Gb3JtYXQKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCBQeVVuaWNvZGVVQ1M0X0Zyb21FbmNvZGVkT2JqZWN0CisjIGRlZmluZSBQeVVuaWNvZGVfRnJvbUZvcm1hdCBQeVVuaWNvZGVVQ1M0X0Zyb21Gb3JtYXQKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tRm9ybWF0ViBQeVVuaWNvZGVVQ1M0X0Zyb21Gb3JtYXRWCisjIGRlZmluZSBQeVVuaWNvZGVfRnJvbU9iamVjdCBQeVVuaWNvZGVVQ1M0X0Zyb21PYmplY3QKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tT3JkaW5hbCBQeVVuaWNvZGVVQ1M0X0Zyb21PcmRpbmFsCisjIGRlZmluZSBQeVVuaWNvZGVfRnJvbVN0cmluZyBQeVVuaWNvZGVVQ1M0X0Zyb21TdHJpbmcKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZSBQeVVuaWNvZGVVQ1M0X0Zyb21TdHJpbmdBbmRTaXplCisjIGRlZmluZSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUgUHlVbmljb2RlVUNTNF9Gcm9tVW5pY29kZQorIyBkZWZpbmUgUHlVbmljb2RlX0Zyb21XaWRlQ2hhciBQeVVuaWNvZGVVQ1M0X0Zyb21XaWRlQ2hhcgorIyBkZWZpbmUgUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZyBQeVVuaWNvZGVVQ1M0X0dldERlZmF1bHRFbmNvZGluZworIyBkZWZpbmUgUHlVbmljb2RlX0dldE1heCBQeVVuaWNvZGVVQ1M0X0dldE1heAorIyBkZWZpbmUgUHlVbmljb2RlX0dldFNpemUgUHlVbmljb2RlVUNTNF9HZXRTaXplCisjIGRlZmluZSBQeVVuaWNvZGVfSm9pbiBQeVVuaWNvZGVVQ1M0X0pvaW4KKyMgZGVmaW5lIFB5VW5pY29kZV9QYXJ0aXRpb24gUHlVbmljb2RlVUNTNF9QYXJ0aXRpb24KKyMgZGVmaW5lIFB5VW5pY29kZV9SUGFydGl0aW9uIFB5VW5pY29kZVVDUzRfUlBhcnRpdGlvbgorIyBkZWZpbmUgUHlVbmljb2RlX1JTcGxpdCBQeVVuaWNvZGVVQ1M0X1JTcGxpdAorIyBkZWZpbmUgUHlVbmljb2RlX1JlcGxhY2UgUHlVbmljb2RlVUNTNF9SZXBsYWNlCisjIGRlZmluZSBQeVVuaWNvZGVfUmVzaXplIFB5VW5pY29kZVVDUzRfUmVzaXplCisjIGRlZmluZSBQeVVuaWNvZGVfUmljaENvbXBhcmUgUHlVbmljb2RlVUNTNF9SaWNoQ29tcGFyZQorIyBkZWZpbmUgUHlVbmljb2RlX1NldERlZmF1bHRFbmNvZGluZyBQeVVuaWNvZGVVQ1M0X1NldERlZmF1bHRFbmNvZGluZworIyBkZWZpbmUgUHlVbmljb2RlX1NwbGl0IFB5VW5pY29kZVVDUzRfU3BsaXQKKyMgZGVmaW5lIFB5VW5pY29kZV9TcGxpdGxpbmVzIFB5VW5pY29kZVVDUzRfU3BsaXRsaW5lcworIyBkZWZpbmUgUHlVbmljb2RlX1RhaWxtYXRjaCBQeVVuaWNvZGVVQ1M0X1RhaWxtYXRjaAorIyBkZWZpbmUgUHlVbmljb2RlX1RyYW5zbGF0ZSBQeVVuaWNvZGVVQ1M0X1RyYW5zbGF0ZQorIyBkZWZpbmUgUHlVbmljb2RlX1RyYW5zbGF0ZUNoYXJtYXAgUHlVbmljb2RlVUNTNF9UcmFuc2xhdGVDaGFybWFwCisjIGRlZmluZSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcgX1B5VW5pY29kZVVDUzRfQXNEZWZhdWx0RW5jb2RlZFN0cmluZworIyBkZWZpbmUgX1B5VW5pY29kZV9GaW5pIF9QeVVuaWNvZGVVQ1M0X0ZpbmkKKyMgZGVmaW5lIF9QeVVuaWNvZGVfSW5pdCBfUHlVbmljb2RlVUNTNF9Jbml0CisjIGRlZmluZSBfUHlVbmljb2RlX0lzQWxwaGEgX1B5VW5pY29kZVVDUzRfSXNBbHBoYQorIyBkZWZpbmUgX1B5VW5pY29kZV9Jc0RlY2ltYWxEaWdpdCBfUHlVbmljb2RlVUNTNF9Jc0RlY2ltYWxEaWdpdAorIyBkZWZpbmUgX1B5VW5pY29kZV9Jc0RpZ2l0IF9QeVVuaWNvZGVVQ1M0X0lzRGlnaXQKKyMgZGVmaW5lIF9QeVVuaWNvZGVfSXNMaW5lYnJlYWsgX1B5VW5pY29kZVVDUzRfSXNMaW5lYnJlYWsKKyMgZGVmaW5lIF9QeVVuaWNvZGVfSXNMb3dlcmNhc2UgX1B5VW5pY29kZVVDUzRfSXNMb3dlcmNhc2UKKyMgZGVmaW5lIF9QeVVuaWNvZGVfSXNOdW1lcmljIF9QeVVuaWNvZGVVQ1M0X0lzTnVtZXJpYworIyBkZWZpbmUgX1B5VW5pY29kZV9Jc1RpdGxlY2FzZSBfUHlVbmljb2RlVUNTNF9Jc1RpdGxlY2FzZQorIyBkZWZpbmUgX1B5VW5pY29kZV9Jc1VwcGVyY2FzZSBfUHlVbmljb2RlVUNTNF9Jc1VwcGVyY2FzZQorIyBkZWZpbmUgX1B5VW5pY29kZV9Jc1doaXRlc3BhY2UgX1B5VW5pY29kZVVDUzRfSXNXaGl0ZXNwYWNlCisjIGRlZmluZSBfUHlVbmljb2RlX1RvRGVjaW1hbERpZ2l0IF9QeVVuaWNvZGVVQ1M0X1RvRGVjaW1hbERpZ2l0CisjIGRlZmluZSBfUHlVbmljb2RlX1RvRGlnaXQgX1B5VW5pY29kZVVDUzRfVG9EaWdpdAorIyBkZWZpbmUgX1B5VW5pY29kZV9Ub0xvd2VyY2FzZSBfUHlVbmljb2RlVUNTNF9Ub0xvd2VyY2FzZQorIyBkZWZpbmUgX1B5VW5pY29kZV9Ub051bWVyaWMgX1B5VW5pY29kZVVDUzRfVG9OdW1lcmljCisjIGRlZmluZSBfUHlVbmljb2RlX1RvVGl0bGVjYXNlIF9QeVVuaWNvZGVVQ1M0X1RvVGl0bGVjYXNlCisjIGRlZmluZSBfUHlVbmljb2RlX1RvVXBwZXJjYXNlIF9QeVVuaWNvZGVVQ1M0X1RvVXBwZXJjYXNlCisKKworI2VuZGlmCisKKy8qIC0tLSBJbnRlcm5hbCBVbmljb2RlIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBJZiB5b3Ugd2FudCBQeXRob24gdG8gdXNlIHRoZSBjb21waWxlcidzIHdjdHlwZS5oIGZ1bmN0aW9ucyBpbnN0ZWFkCisgICBvZiB0aGUgb25lcyBzdXBwbGllZCB3aXRoIFB5dGhvbiwgZGVmaW5lIFdBTlRfV0NUWVBFX0ZVTkNUSU9OUyBvcgorICAgY29uZmlndXJlIFB5dGhvbiB1c2luZyAtLXdpdGgtd2N0eXBlLWZ1bmN0aW9ucy4gIFRoaXMgcmVkdWNlcyB0aGUKKyAgIGludGVycHJldGVyJ3MgY29kZSBzaXplLiAqLworCisjaWYgZGVmaW5lZChIQVZFX1VTQUJMRV9XQ0hBUl9UKSAmJiBkZWZpbmVkKFdBTlRfV0NUWVBFX0ZVTkNUSU9OUykKKworI2luY2x1ZGUgPHdjdHlwZS5oPgorCisjZGVmaW5lIFB5X1VOSUNPREVfSVNTUEFDRShjaCkgaXN3c3BhY2UoY2gpCisKKyNkZWZpbmUgUHlfVU5JQ09ERV9JU0xPV0VSKGNoKSBpc3dsb3dlcihjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9JU1VQUEVSKGNoKSBpc3d1cHBlcihjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9JU1RJVExFKGNoKSBfUHlVbmljb2RlX0lzVGl0bGVjYXNlKGNoKQorI2RlZmluZSBQeV9VTklDT0RFX0lTTElORUJSRUFLKGNoKSBfUHlVbmljb2RlX0lzTGluZWJyZWFrKGNoKQorCisjZGVmaW5lIFB5X1VOSUNPREVfVE9MT1dFUihjaCkgdG93bG93ZXIoY2gpCisjZGVmaW5lIFB5X1VOSUNPREVfVE9VUFBFUihjaCkgdG93dXBwZXIoY2gpCisjZGVmaW5lIFB5X1VOSUNPREVfVE9USVRMRShjaCkgX1B5VW5pY29kZV9Ub1RpdGxlY2FzZShjaCkKKworI2RlZmluZSBQeV9VTklDT0RFX0lTREVDSU1BTChjaCkgX1B5VW5pY29kZV9Jc0RlY2ltYWxEaWdpdChjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9JU0RJR0lUKGNoKSBfUHlVbmljb2RlX0lzRGlnaXQoY2gpCisjZGVmaW5lIFB5X1VOSUNPREVfSVNOVU1FUklDKGNoKSBfUHlVbmljb2RlX0lzTnVtZXJpYyhjaCkKKworI2RlZmluZSBQeV9VTklDT0RFX1RPREVDSU1BTChjaCkgX1B5VW5pY29kZV9Ub0RlY2ltYWxEaWdpdChjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9UT0RJR0lUKGNoKSBfUHlVbmljb2RlX1RvRGlnaXQoY2gpCisjZGVmaW5lIFB5X1VOSUNPREVfVE9OVU1FUklDKGNoKSBfUHlVbmljb2RlX1RvTnVtZXJpYyhjaCkKKworI2RlZmluZSBQeV9VTklDT0RFX0lTQUxQSEEoY2gpIGlzd2FscGhhKGNoKQorCisjZWxzZQorCisvKiBTaW5jZSBzcGxpdHRpbmcgb24gd2hpdGVzcGFjZSBpcyBhbiBpbXBvcnRhbnQgdXNlIGNhc2UsIGFuZAorICAgd2hpdGVzcGFjZSBpbiBtb3N0IHNpdHVhdGlvbnMgaXMgc29sZWx5IEFTQ0lJIHdoaXRlc3BhY2UsIHdlCisgICBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIGJ5IHVzaW5nIGEgcXVpY2sgbG9vay11cCB0YWJsZQorICAgX1B5X2FzY2lpX3doaXRlc3BhY2UgKHNlZSBiZWxvdykgd2l0aCBhbiBpbmxpbmVkIGNoZWNrLgorCisgKi8KKyNkZWZpbmUgUHlfVU5JQ09ERV9JU1NQQUNFKGNoKSBcCisgICAgKChjaCkgPCAxMjhVID8gX1B5X2FzY2lpX3doaXRlc3BhY2VbKGNoKV0gOiBfUHlVbmljb2RlX0lzV2hpdGVzcGFjZShjaCkpCisKKyNkZWZpbmUgUHlfVU5JQ09ERV9JU0xPV0VSKGNoKSBfUHlVbmljb2RlX0lzTG93ZXJjYXNlKGNoKQorI2RlZmluZSBQeV9VTklDT0RFX0lTVVBQRVIoY2gpIF9QeVVuaWNvZGVfSXNVcHBlcmNhc2UoY2gpCisjZGVmaW5lIFB5X1VOSUNPREVfSVNUSVRMRShjaCkgX1B5VW5pY29kZV9Jc1RpdGxlY2FzZShjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9JU0xJTkVCUkVBSyhjaCkgX1B5VW5pY29kZV9Jc0xpbmVicmVhayhjaCkKKworI2RlZmluZSBQeV9VTklDT0RFX1RPTE9XRVIoY2gpIF9QeVVuaWNvZGVfVG9Mb3dlcmNhc2UoY2gpCisjZGVmaW5lIFB5X1VOSUNPREVfVE9VUFBFUihjaCkgX1B5VW5pY29kZV9Ub1VwcGVyY2FzZShjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9UT1RJVExFKGNoKSBfUHlVbmljb2RlX1RvVGl0bGVjYXNlKGNoKQorCisjZGVmaW5lIFB5X1VOSUNPREVfSVNERUNJTUFMKGNoKSBfUHlVbmljb2RlX0lzRGVjaW1hbERpZ2l0KGNoKQorI2RlZmluZSBQeV9VTklDT0RFX0lTRElHSVQoY2gpIF9QeVVuaWNvZGVfSXNEaWdpdChjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9JU05VTUVSSUMoY2gpIF9QeVVuaWNvZGVfSXNOdW1lcmljKGNoKQorCisjZGVmaW5lIFB5X1VOSUNPREVfVE9ERUNJTUFMKGNoKSBfUHlVbmljb2RlX1RvRGVjaW1hbERpZ2l0KGNoKQorI2RlZmluZSBQeV9VTklDT0RFX1RPRElHSVQoY2gpIF9QeVVuaWNvZGVfVG9EaWdpdChjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9UT05VTUVSSUMoY2gpIF9QeVVuaWNvZGVfVG9OdW1lcmljKGNoKQorCisjZGVmaW5lIFB5X1VOSUNPREVfSVNBTFBIQShjaCkgX1B5VW5pY29kZV9Jc0FscGhhKGNoKQorCisjZW5kaWYKKworI2RlZmluZSBQeV9VTklDT0RFX0lTQUxOVU0oY2gpIFwKKyAgICAgICAoUHlfVU5JQ09ERV9JU0FMUEhBKGNoKSB8fCBcCisgICAgUHlfVU5JQ09ERV9JU0RFQ0lNQUwoY2gpIHx8IFwKKyAgICBQeV9VTklDT0RFX0lTRElHSVQoY2gpIHx8IFwKKyAgICBQeV9VTklDT0RFX0lTTlVNRVJJQyhjaCkpCisKKyNkZWZpbmUgUHlfVU5JQ09ERV9DT1BZKHRhcmdldCwgc291cmNlLCBsZW5ndGgpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQeV9NRU1DUFkoKHRhcmdldCksIChzb3VyY2UpLCAobGVuZ3RoKSpzaXplb2YoUHlfVU5JQ09ERSkpCisKKyNkZWZpbmUgUHlfVU5JQ09ERV9GSUxMKHRhcmdldCwgdmFsdWUsIGxlbmd0aCkgXAorICAgIGRvIHtQeV9zc2l6ZV90IGlfOyBQeV9VTklDT0RFICp0XyA9ICh0YXJnZXQpOyBQeV9VTklDT0RFIHZfID0gKHZhbHVlKTtcCisgICAgZm9yIChpXyA9IDA7IGlfIDwgKGxlbmd0aCk7IGlfKyspIHRfW2lfXSA9IHZfO1wKKyAgICB9IHdoaWxlICgwKQorCisvKiBDaGVjayBpZiBzdWJzdHJpbmcgbWF0Y2hlcyBhdCBnaXZlbiBvZmZzZXQuICB0aGUgb2Zmc2V0IG11c3QgYmUKKyAgIHZhbGlkLCBhbmQgdGhlIHN1YnN0cmluZyBtdXN0IG5vdCBiZSBlbXB0eSAqLworCisjZGVmaW5lIFB5X1VOSUNPREVfTUFUQ0goc3RyaW5nLCBvZmZzZXQsIHN1YnN0cmluZykgXAorICAgICgoKigoc3RyaW5nKS0+c3RyICsgKG9mZnNldCkpID09ICooKHN1YnN0cmluZyktPnN0cikpICYmIFwKKyAgICAoKCooKHN0cmluZyktPnN0ciArIChvZmZzZXQpICsgKHN1YnN0cmluZyktPmxlbmd0aC0xKSA9PSAqKChzdWJzdHJpbmcpLT5zdHIgKyAoc3Vic3RyaW5nKS0+bGVuZ3RoLTEpKSkgJiYgXAorICAgICAhbWVtY21wKChzdHJpbmcpLT5zdHIgKyAob2Zmc2V0KSwgKHN1YnN0cmluZyktPnN0ciwgKHN1YnN0cmluZyktPmxlbmd0aCpzaXplb2YoUHlfVU5JQ09ERSkpKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIC0tLSBVbmljb2RlIFR5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5X3NzaXplX3QgbGVuZ3RoOyAgICAgICAgICAvKiBMZW5ndGggb2YgcmF3IFVuaWNvZGUgZGF0YSBpbiBidWZmZXIgKi8KKyAgICBQeV9VTklDT0RFICpzdHI7ICAgICAgICAgICAgLyogUmF3IFVuaWNvZGUgYnVmZmVyICovCisgICAgbG9uZyBoYXNoOyAgICAgICAgICAgICAgICAgIC8qIEhhc2ggdmFsdWU7IC0xIGlmIG5vdCBzZXQgKi8KKyAgICBQeU9iamVjdCAqZGVmZW5jOyAgICAgICAgICAgLyogKERlZmF1bHQpIEVuY29kZWQgdmVyc2lvbiBhcyBQeXRob24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLCBvciBOVUxMOyB0aGlzIGlzIHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGluZyB0aGUgYnVmZmVyIHByb3RvY29sICovCit9IFB5VW5pY29kZU9iamVjdDsKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5VW5pY29kZV9UeXBlOworCisjZGVmaW5lIFB5VW5pY29kZV9DaGVjayhvcCkgXAorICAgICAgICAgICAgICAgICBQeVR5cGVfRmFzdFN1YmNsYXNzKFB5X1RZUEUob3ApLCBQeV9UUEZMQUdTX1VOSUNPREVfU1VCQ0xBU1MpCisjZGVmaW5lIFB5VW5pY29kZV9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5VW5pY29kZV9UeXBlKQorCisvKiBGYXN0IGFjY2VzcyBtYWNyb3MgKi8KKyNkZWZpbmUgUHlVbmljb2RlX0dFVF9TSVpFKG9wKSBcCisgICAgKCgoUHlVbmljb2RlT2JqZWN0ICopKG9wKSktPmxlbmd0aCkKKyNkZWZpbmUgUHlVbmljb2RlX0dFVF9EQVRBX1NJWkUob3ApIFwKKyAgICAoKChQeVVuaWNvZGVPYmplY3QgKikob3ApKS0+bGVuZ3RoICogc2l6ZW9mKFB5X1VOSUNPREUpKQorI2RlZmluZSBQeVVuaWNvZGVfQVNfVU5JQ09ERShvcCkgXAorICAgICgoKFB5VW5pY29kZU9iamVjdCAqKShvcCkpLT5zdHIpCisjZGVmaW5lIFB5VW5pY29kZV9BU19EQVRBKG9wKSBcCisgICAgKChjb25zdCBjaGFyICopKChQeVVuaWNvZGVPYmplY3QgKikob3ApKS0+c3RyKQorCisvKiAtLS0gQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhpcyBVbmljb2RlIGNoYXJhY3RlciB3aWxsIGJlIHVzZWQgYXMgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIGR1cmluZworICAgZGVjb2RpbmcgaWYgdGhlIGVycm9ycyBhcmd1bWVudCBpcyBzZXQgdG8gInJlcGxhY2UiLiBOb3RlOiB0aGUKKyAgIFVuaWNvZGUgY2hhcmFjdGVyIFUrRkZGRCBpcyB0aGUgb2ZmaWNpYWwgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSIGluCisgICBVbmljb2RlIDMuMC4gKi8KKworI2RlZmluZSBQeV9VTklDT0RFX1JFUExBQ0VNRU5UX0NIQVJBQ1RFUiAoKFB5X1VOSUNPREUpIDB4RkZGRCkKKworLyogPT09IFB1YmxpYyBBUEkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIC0tLSBQbGFpbiBQeV9VTklDT0RFIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDcmVhdGUgYSBVbmljb2RlIE9iamVjdCBmcm9tIHRoZSBQeV9VTklDT0RFIGJ1ZmZlciB1IG9mIHRoZSBnaXZlbgorICAgc2l6ZS4KKworICAgdSBtYXkgYmUgTlVMTCB3aGljaCBjYXVzZXMgdGhlIGNvbnRlbnRzIHRvIGJlIHVuZGVmaW5lZC4gSXQgaXMgdGhlCisgICB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZmlsbCBpbiB0aGUgbmVlZGVkIGRhdGEgYWZ0ZXJ3YXJkcy4gTm90ZQorICAgdGhhdCBtb2RpZnlpbmcgdGhlIFVuaWNvZGUgb2JqZWN0IGNvbnRlbnRzIGFmdGVyIGNvbnN0cnVjdGlvbiBpcworICAgb25seSBhbGxvd2VkIGlmIHUgd2FzIHNldCB0byBOVUxMLgorCisgICBUaGUgYnVmZmVyIGlzIGNvcGllZCBpbnRvIHRoZSBuZXcgb2JqZWN0LiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0Zyb21Vbmljb2RlKAorICAgIGNvbnN0IFB5X1VOSUNPREUgKnUsICAgICAgICAvKiBVbmljb2RlIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3Qgc2l6ZSAgICAgICAgICAgICAvKiBzaXplIG9mIGJ1ZmZlciAqLworICAgICk7CisKKy8qIFNpbWlsYXIgdG8gUHlVbmljb2RlX0Zyb21Vbmljb2RlKCksIGJ1dCB1IHBvaW50cyB0byBMYXRpbi0xIGVuY29kZWQgYnl0ZXMgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgY29uc3QgY2hhciAqdSwgICAgICAgIC8qIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBzaXplICAgICAgIC8qIHNpemUgb2YgYnVmZmVyICovCisgICAgKTsKKworLyogU2ltaWxhciB0byBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoKSwgYnV0IHUgcG9pbnRzIHRvIG51bGwtdGVybWluYXRlZAorICAgTGF0aW4tMSBlbmNvZGVkIGJ5dGVzICovCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0Zyb21TdHJpbmcoCisgICAgY29uc3QgY2hhciAqdSAgICAgICAgLyogc3RyaW5nICovCisgICAgKTsKKworLyogUmV0dXJuIGEgcmVhZC1vbmx5IHBvaW50ZXIgdG8gdGhlIFVuaWNvZGUgb2JqZWN0J3MgaW50ZXJuYWwKKyAgIFB5X1VOSUNPREUgYnVmZmVyLiAqLworCitQeUFQSV9GVU5DKFB5X1VOSUNPREUgKikgUHlVbmljb2RlX0FzVW5pY29kZSgKKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICApOworCisvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUgVW5pY29kZSBvYmplY3QuICovCisKK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlVbmljb2RlX0dldFNpemUoCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgKTsKKworLyogR2V0IHRoZSBtYXhpbXVtIG9yZGluYWwgZm9yIGEgVW5pY29kZSBjaGFyYWN0ZXIuICovCitQeUFQSV9GVU5DKFB5X1VOSUNPREUpIFB5VW5pY29kZV9HZXRNYXgodm9pZCk7CisKKy8qIFJlc2l6ZSBhbiBhbHJlYWR5IGFsbG9jYXRlZCBVbmljb2RlIG9iamVjdCB0byB0aGUgbmV3IHNpemUgbGVuZ3RoLgorCisgICAqdW5pY29kZSBpcyBtb2RpZmllZCB0byBwb2ludCB0byB0aGUgbmV3IChyZXNpemVkKSBvYmplY3QgYW5kIDAKKyAgIHJldHVybmVkIG9uIHN1Y2Nlc3MuCisKKyAgIFRoaXMgQVBJIG1heSBvbmx5IGJlIGNhbGxlZCBieSB0aGUgZnVuY3Rpb24gd2hpY2ggYWxzbyBjYWxsZWQgdGhlCisgICBVbmljb2RlIGNvbnN0cnVjdG9yLiBUaGUgcmVmY291bnQgb24gdGhlIG9iamVjdCBtdXN0IGJlIDEuIE90aGVyd2lzZSwKKyAgIGFuIGVycm9yIGlzIHJldHVybmVkLgorCisgICBFcnJvciBoYW5kbGluZyBpcyBpbXBsZW1lbnRlZCBhcyBmb2xsb3dzOiBhbiBleGNlcHRpb24gaXMgc2V0LCAtMQorICAgaXMgcmV0dXJuZWQgYW5kICp1bmljb2RlIGxlZnQgdW50b3VjaGVkLgorCisqLworCitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlX1Jlc2l6ZSgKKyAgICBQeU9iamVjdCAqKnVuaWNvZGUsICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgVW5pY29kZSBvYmplY3QgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCAgICAgICAgICAgLyogTmV3IGxlbmd0aCAqLworICAgICk7CisKKy8qIENvZXJjZSBvYmogdG8gYW4gVW5pY29kZSBvYmplY3QgYW5kIHJldHVybiBhIHJlZmVyZW5jZSB3aXRoCisgICAqaW5jcmVtZW50ZWQqIHJlZmNvdW50LgorCisgICBDb2VyY2lvbiBpcyBkb25lIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorCisgICAxLiBTdHJpbmcgYW5kIG90aGVyIGNoYXIgYnVmZmVyIGNvbXBhdGlibGUgb2JqZWN0cyBhcmUgZGVjb2RlZAorICAgICAgdW5kZXIgdGhlIGFzc3VtcHRpb25zIHRoYXQgdGhleSBjb250YWluIGRhdGEgdXNpbmcgdGhlIGN1cnJlbnQKKyAgICAgIGRlZmF1bHQgZW5jb2RpbmcuIERlY29kaW5nIGlzIGRvbmUgaW4gInN0cmljdCIgbW9kZS4KKworICAgMi4gQWxsIG90aGVyIG9iamVjdHMgKGluY2x1ZGluZyBVbmljb2RlIG9iamVjdHMpIHJhaXNlIGFuCisgICAgICBleGNlcHRpb24uCisKKyAgIFRoZSBBUEkgcmV0dXJucyBOVUxMIGluIGNhc2Ugb2YgYW4gZXJyb3IuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKKyAgIGZvciBkZWNyZWYnaW5nIHRoZSByZXR1cm5lZCBvYmplY3RzLgorCisqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KAorICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpvYmosICAgICAvKiBPYmplY3QgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgICAgICAgLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiBDb2VyY2Ugb2JqIHRvIGFuIFVuaWNvZGUgb2JqZWN0IGFuZCByZXR1cm4gYSByZWZlcmVuY2Ugd2l0aAorICAgKmluY3JlbWVudGVkKiByZWZjb3VudC4KKworICAgVW5pY29kZSBvYmplY3RzIGFyZSBwYXNzZWQgYmFjayBhcy1pcyAoc3ViY2xhc3NlcyBhcmUgY29udmVydGVkIHRvCisgICB0cnVlIFVuaWNvZGUgb2JqZWN0cyksIGFsbCBvdGhlciBvYmplY3RzIGFyZSBkZWxlZ2F0ZWQgdG8KKyAgIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdChvYmosIE5VTEwsICJzdHJpY3QiKSB3aGljaCByZXN1bHRzIGluCisgICB1c2luZyB0aGUgZGVmYXVsdCBlbmNvZGluZyBhcyBiYXNpcyBmb3IgZGVjb2RpbmcgdGhlIG9iamVjdC4KKworICAgVGhlIEFQSSByZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBhbiBlcnJvci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorICAgZm9yIGRlY3JlZidpbmcgdGhlIHJldHVybmVkIG9iamVjdHMuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRnJvbU9iamVjdCgKKyAgICByZWdpc3RlciBQeU9iamVjdCAqb2JqICAgICAgLyogT2JqZWN0ICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVfRnJvbUZvcm1hdFYoY29uc3QgY2hhciosIHZhX2xpc3QpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVfRnJvbUZvcm1hdChjb25zdCBjaGFyKiwgLi4uKTsKKworLyogRm9ybWF0IHRoZSBvYmplY3QgYmFzZWQgb24gdGhlIGZvcm1hdF9zcGVjLCBhcyBkZWZpbmVkIGluIFBFUCAzMTAxCisgICAoQWR2YW5jZWQgU3RyaW5nIEZvcm1hdHRpbmcpLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlVbmljb2RlX0Zvcm1hdEFkdmFuY2VkKFB5T2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfVU5JQ09ERSAqZm9ybWF0X3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBmb3JtYXRfc3BlY19sZW4pOworCisvKiAtLS0gd2NoYXJfdCBzdXBwb3J0IGZvciBwbGF0Zm9ybXMgd2hpY2ggc3VwcG9ydCBpdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEhBVkVfV0NIQVJfSAorCisvKiBDcmVhdGUgYSBVbmljb2RlIE9iamVjdCBmcm9tIHRoZSB3aGNhcl90IGJ1ZmZlciB3IG9mIHRoZSBnaXZlbgorICAgc2l6ZS4KKworICAgVGhlIGJ1ZmZlciBpcyBjb3BpZWQgaW50byB0aGUgbmV3IG9iamVjdC4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Gcm9tV2lkZUNoYXIoCisgICAgcmVnaXN0ZXIgY29uc3Qgd2NoYXJfdCAqdywgIC8qIHdjaGFyX3QgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBzaXplICAgICAgICAgICAgIC8qIHNpemUgb2YgYnVmZmVyICovCisgICAgKTsKKworLyogQ29waWVzIHRoZSBVbmljb2RlIE9iamVjdCBjb250ZW50cyBpbnRvIHRoZSB3Y2hhcl90IGJ1ZmZlciB3LiAgQXQKKyAgIG1vc3Qgc2l6ZSB3Y2hhcl90IGNoYXJhY3RlcnMgYXJlIGNvcGllZC4KKworICAgTm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgd2NoYXJfdCBzdHJpbmcgbWF5IG9yIG1heSBub3QgYmUKKyAgIDAtdGVybWluYXRlZC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIG1ha2Ugc3VyZQorICAgdGhhdCB0aGUgd2NoYXJfdCBzdHJpbmcgaXMgMC10ZXJtaW5hdGVkIGluIGNhc2UgdGhpcyBpcyByZXF1aXJlZCBieQorICAgdGhlIGFwcGxpY2F0aW9uLgorCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2NoYXJfdCBjaGFyYWN0ZXJzIGNvcGllZCAoZXhjbHVkaW5nIGEKKyAgIHBvc3NpYmx5IHRyYWlsaW5nIDAtdGVybWluYXRpb24gY2hhcmFjdGVyKSBvciAtMSBpbiBjYXNlIG9mIGFuCisgICBlcnJvci4gKi8KKworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVVuaWNvZGVfQXNXaWRlQ2hhcigKKyAgICBQeVVuaWNvZGVPYmplY3QgKnVuaWNvZGUsICAgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICByZWdpc3RlciB3Y2hhcl90ICp3LCAgICAgICAgLyogd2NoYXJfdCBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IHNpemUgICAgICAgICAgICAgLyogc2l6ZSBvZiBidWZmZXIgKi8KKyAgICApOworCisjZW5kaWYKKworLyogLS0tIFVuaWNvZGUgb3JkaW5hbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENyZWF0ZSBhIFVuaWNvZGUgT2JqZWN0IGZyb20gdGhlIGdpdmVuIFVuaWNvZGUgY29kZSBwb2ludCBvcmRpbmFsLgorCisgICBUaGUgb3JkaW5hbCBtdXN0IGJlIGluIHJhbmdlKDB4MTAwMDApIG9uIG5hcnJvdyBQeXRob24gYnVpbGRzCisgICAoVUNTMiksIGFuZCByYW5nZSgweDExMDAwMCkgb24gd2lkZSBidWlsZHMgKFVDUzQpLiBBIFZhbHVlRXJyb3IgaXMKKyAgIHJhaXNlZCBpbiBjYXNlIGl0IGlzIG5vdC4KKworKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Gcm9tT3JkaW5hbChpbnQgb3JkaW5hbCk7CisKKy8qIC0tLSBGcmVlLWxpc3QgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDbGVhciB0aGUgZnJlZSBsaXN0IHVzZWQgYnkgdGhlIFVuaWNvZGUgaW1wbGVtZW50YXRpb24uCisKKyAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVsZWFzZSBtZW1vcnkgdXNlZCBmb3Igb2JqZWN0cyBvbiB0aGUgZnJlZQorICAgbGlzdCBiYWNrIHRvIHRoZSBQeXRob24gbWVtb3J5IGFsbG9jYXRvci4KKworKi8KKworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZV9DbGVhckZyZWVMaXN0KHZvaWQpOworCisvKiA9PT0gQnVpbHRpbiBDb2RlY3MgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgTWFueSBvZiB0aGVzZSBBUElzIHRha2UgdHdvIGFyZ3VtZW50cyBlbmNvZGluZyBhbmQgZXJyb3JzLiBUaGVzZQorICAgcGFyYW1ldGVycyBlbmNvZGluZyBhbmQgZXJyb3JzIGhhdmUgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBvbmVzCisgICBvZiB0aGUgYnVpbHRpbiB1bmljb2RlKCkgQVBJLgorCisgICBTZXR0aW5nIGVuY29kaW5nIHRvIE5VTEwgY2F1c2VzIHRoZSBkZWZhdWx0IGVuY29kaW5nIHRvIGJlIHVzZWQuCisKKyAgIEVycm9yIGhhbmRsaW5nIGlzIHNldCBieSBlcnJvcnMgd2hpY2ggbWF5IGFsc28gYmUgc2V0IHRvIE5VTEwKKyAgIG1lYW5pbmcgdG8gdXNlIHRoZSBkZWZhdWx0IGhhbmRsaW5nIGRlZmluZWQgZm9yIHRoZSBjb2RlYy4gRGVmYXVsdAorICAgZXJyb3IgaGFuZGxpbmcgZm9yIGFsbCBidWlsdGluIGNvZGVjcyBpcyAic3RyaWN0IiAoVmFsdWVFcnJvcnMgYXJlCisgICByYWlzZWQpLgorCisgICBUaGUgY29kZWNzIGFsbCB1c2UgYSBzaW1pbGFyIGludGVyZmFjZS4gT25seSBkZXZpYXRpb24gZnJvbSB0aGUKKyAgIGdlbmVyaWMgb25lcyBhcmUgZG9jdW1lbnRlZC4KKworKi8KKworLyogLS0tIE1hbmFnZSB0aGUgZGVmYXVsdCBlbmNvZGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFJldHVybiBhIFB5dGhvbiBzdHJpbmcgaG9sZGluZyB0aGUgZGVmYXVsdCBlbmNvZGVkIHZhbHVlIG9mIHRoZQorICAgVW5pY29kZSBvYmplY3QuCisKKyAgIFRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIGNhY2hlZCBpbiB0aGUgVW5pY29kZSBvYmplY3QgZm9yIHN1YnNlcXVlbnQKKyAgIHVzYWdlIGJ5IHRoaXMgZnVuY3Rpb24uIFRoZSBjYWNoZWQgdmVyc2lvbiBpcyBuZWVkZWQgdG8gaW1wbGVtZW50CisgICB0aGUgY2hhcmFjdGVyIGJ1ZmZlciBpbnRlcmZhY2UgYW5kIHdpbGwgbGl2ZSAoYXQgbGVhc3QpIGFzIGxvbmcgYXMKKyAgIHRoZSBVbmljb2RlIG9iamVjdCBpdHNlbGYuCisKKyAgIFRoZSByZWZjb3VudCBvZiB0aGUgc3RyaW5nIGlzICpub3QqIGluY3JlbWVudGVkLgorCisgICAqKiogRXhwb3J0ZWQgZm9yIGludGVybmFsIHVzZSBieSB0aGUgaW50ZXJwcmV0ZXIgb25seSAhISEgKioqCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5VW5pY29kZV9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nKAorICAgIFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CisKKy8qIFJldHVybnMgdGhlIGN1cnJlbnRseSBhY3RpdmUgZGVmYXVsdCBlbmNvZGluZy4KKworICAgVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgY3VycmVudGx5IGltcGxlbWVudGVkIGFzIHJ1bi10aW1lIHNldHRhYmxlCisgICBwcm9jZXNzIGdsb2JhbC4gIFRoaXMgbWF5IGNoYW5nZSBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlCisgICBpbnRlcnByZXRlciB0byBiZWNvbWUgYSBwYXJhbWV0ZXIgd2hpY2ggaXMgbWFuYWdlZCBvbiBhIHBlci10aHJlYWQKKyAgIGJhc2lzLgorCisgKi8KKworUHlBUElfRlVOQyhjb25zdCBjaGFyKikgUHlVbmljb2RlX0dldERlZmF1bHRFbmNvZGluZyh2b2lkKTsKKworLyogU2V0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBkZWZhdWx0IGVuY29kaW5nLgorCisgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgaW4gY2FzZSBvZiBhbiBlcnJvci4KKworICovCisKK1B5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nKAorICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nICAgICAgICAvKiBFbmNvZGluZyBuYW1lIGluIHN0YW5kYXJkIGZvcm0gKi8KKyAgICApOworCisvKiAtLS0gR2VuZXJpYyBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ3JlYXRlIGEgVW5pY29kZSBvYmplY3QgYnkgZGVjb2RpbmcgdGhlIGVuY29kZWQgc3RyaW5nIHMgb2YgdGhlCisgICBnaXZlbiBzaXplLiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZSgKKyAgICBjb25zdCBjaGFyICpzLCAgICAgICAgICAgICAgLyogZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IHNpemUsICAgICAgICAgICAgLyogc2l6ZSBvZiBidWZmZXIgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgICAgICAgLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiBFbmNvZGVzIGEgUHlfVU5JQ09ERSBidWZmZXIgb2YgdGhlIGdpdmVuIHNpemUgYW5kIHJldHVybnMgYQorICAgUHl0aG9uIHN0cmluZyBvYmplY3QuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlKAorICAgIGNvbnN0IFB5X1VOSUNPREUgKnMsICAgICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBzaXplLCAgICAgICAgICAgIC8qIG51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAgICAgICAvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKy8qIEVuY29kZXMgYSBVbmljb2RlIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIFB5dGhvbgorICAgb2JqZWN0LiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzRW5jb2RlZE9iamVjdCgKKyAgICBQeU9iamVjdCAqdW5pY29kZSwgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywgICAgICAgLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiBFbmNvZGVzIGEgVW5pY29kZSBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBQeXRob24gc3RyaW5nCisgICBvYmplY3QuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKAorICAgIFB5T2JqZWN0ICp1bmljb2RlLCAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAgICAgICAvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQnVpbGRFbmNvZGluZ01hcCgKKyAgICBQeU9iamVjdCogc3RyaW5nICAgICAgICAgICAgLyogMjU2IGNoYXJhY3RlciBtYXAgKi8KKyAgICk7CisKKworLyogLS0tIFVURi03IENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlVVRGNygKKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTcgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjdTdGF0ZWZ1bCgKKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTcgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBQeV9zc2l6ZV90ICpjb25zdW1lZCAgICAgICAgLyogYnl0ZXMgY29uc3VtZWQgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZVVURjcoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBpbnQgYmFzZTY0U2V0TywgICAgICAgICAgICAgLyogRW5jb2RlIFJGQzIxNTIgU2V0IE8gY2hhcmFjdGVycyBpbiBiYXNlNjQgKi8KKyAgICBpbnQgYmFzZTY0V2hpdGVTcGFjZSwgICAgICAgLyogRW5jb2RlIHdoaXRlc3BhY2UgKHNwLCBodCwgbmwsIGNyKSBpbiBiYXNlNjQgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiAtLS0gVVRGLTggQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVVEY4KAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtOCBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlVVRGOFN0YXRlZnVsKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtOCBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycywgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkICAgICAgICAgICAgICAgIC8qIGJ5dGVzIGNvbnN1bWVkICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVVVEY4KAorICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworLyogLS0tIFVURi0zMiBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIERlY29kZXMgbGVuZ3RoIGJ5dGVzIGZyb20gYSBVVEYtMzIgZW5jb2RlZCBidWZmZXIgc3RyaW5nIGFuZCByZXR1cm5zCisgICB0aGUgY29ycmVzcG9uZGluZyBVbmljb2RlIG9iamVjdC4KKworICAgZXJyb3JzIChpZiBub24tTlVMTCkgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcuIEl0IGRlZmF1bHRzCisgICB0byAic3RyaWN0Ii4KKworICAgSWYgYnl0ZW9yZGVyIGlzIG5vbi1OVUxMLCB0aGUgZGVjb2RlciBzdGFydHMgZGVjb2RpbmcgdXNpbmcgdGhlCisgICBnaXZlbiBieXRlIG9yZGVyOgorCisgICAgKmJ5dGVvcmRlciA9PSAtMTogbGl0dGxlIGVuZGlhbgorICAgICpieXRlb3JkZXIgPT0gMDogIG5hdGl2ZSBvcmRlcgorICAgICpieXRlb3JkZXIgPT0gMTogIGJpZyBlbmRpYW4KKworICAgSW4gbmF0aXZlIG1vZGUsIHRoZSBmaXJzdCBmb3VyIGJ5dGVzIG9mIHRoZSBzdHJlYW0gYXJlIGNoZWNrZWQgZm9yIGEKKyAgIEJPTSBtYXJrLiBJZiBmb3VuZCwgdGhlIEJPTSBtYXJrIGlzIGFuYWx5c2VkLCB0aGUgYnl0ZSBvcmRlcgorICAgYWRqdXN0ZWQgYW5kIHRoZSBCT00gc2tpcHBlZC4gIEluIHRoZSBvdGhlciBtb2Rlcywgbm8gQk9NIG1hcmsKKyAgIGludGVycHJldGF0aW9uIGlzIGRvbmUuIEFmdGVyIGNvbXBsZXRpb24sICpieXRlb3JkZXIgaXMgc2V0IHRvIHRoZQorICAgY3VycmVudCBieXRlIG9yZGVyIGF0IHRoZSBlbmQgb2YgaW5wdXQgZGF0YS4KKworICAgSWYgYnl0ZW9yZGVyIGlzIE5VTEwsIHRoZSBjb2RlYyBzdGFydHMgaW4gbmF0aXZlIG9yZGVyIG1vZGUuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlVVRGMzIoCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVURi0zMiBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycywgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGludCAqYnl0ZW9yZGVyICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGJ5dGVvcmRlciB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD1uYXRpdmU7LTE9TEUsMT1CRTsgdXBkYXRlZCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0ICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVVEYzMlN0YXRlZnVsKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtMzIgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBpbnQgKmJ5dGVvcmRlciwgICAgICAgICAgICAgLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9bmF0aXZlOy0xPUxFLDE9QkU7IHVwZGF0ZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAqLworICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkICAgICAgICAvKiBieXRlcyBjb25zdW1lZCAqLworICAgICk7CisKKy8qIFJldHVybnMgYSBQeXRob24gc3RyaW5nIHVzaW5nIHRoZSBVVEYtMzIgZW5jb2RpbmcgaW4gbmF0aXZlIGJ5dGUKKyAgIG9yZGVyLiBUaGUgc3RyaW5nIGFsd2F5cyBzdGFydHMgd2l0aCBhIEJPTSBtYXJrLiAgKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1VURjMyU3RyaW5nKAorICAgIFB5T2JqZWN0ICp1bmljb2RlICAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLworICAgICk7CisKKy8qIFJldHVybnMgYSBQeXRob24gc3RyaW5nIG9iamVjdCBob2xkaW5nIHRoZSBVVEYtMzIgZW5jb2RlZCB2YWx1ZSBvZgorICAgdGhlIFVuaWNvZGUgZGF0YS4KKworICAgSWYgYnl0ZW9yZGVyIGlzIG5vdCAwLCBvdXRwdXQgaXMgd3JpdHRlbiBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZworICAgYnl0ZSBvcmRlcjoKKworICAgYnl0ZW9yZGVyID09IC0xOiBsaXR0bGUgZW5kaWFuCisgICBieXRlb3JkZXIgPT0gMDogIG5hdGl2ZSBieXRlIG9yZGVyICh3cml0ZXMgYSBCT00gbWFyaykKKyAgIGJ5dGVvcmRlciA9PSAxOiAgYmlnIGVuZGlhbgorCisgICBJZiBieXRlb3JkZXIgaXMgMCwgdGhlIG91dHB1dCBzdHJpbmcgd2lsbCBhbHdheXMgc3RhcnQgd2l0aCB0aGUKKyAgIFVuaWNvZGUgQk9NIG1hcmsgKFUrRkVGRikuIEluIHRoZSBvdGhlciB0d28gbW9kZXMsIG5vIEJPTSBtYXJrIGlzCisgICBwcmVwZW5kZWQuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlVVRGMzIoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50IGJ5dGVvcmRlciAgICAgICAgICAgICAgIC8qIGJ5dGVvcmRlciB0byB1c2UgMD1CT00rbmF0aXZlOy0xPUxFLDE9QkUgKi8KKyAgICApOworCisvKiAtLS0gVVRGLTE2IENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogRGVjb2RlcyBsZW5ndGggYnl0ZXMgZnJvbSBhIFVURi0xNiBlbmNvZGVkIGJ1ZmZlciBzdHJpbmcgYW5kIHJldHVybnMKKyAgIHRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGUgb2JqZWN0LgorCisgICBlcnJvcnMgKGlmIG5vbi1OVUxMKSBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZy4gSXQgZGVmYXVsdHMKKyAgIHRvICJzdHJpY3QiLgorCisgICBJZiBieXRlb3JkZXIgaXMgbm9uLU5VTEwsIHRoZSBkZWNvZGVyIHN0YXJ0cyBkZWNvZGluZyB1c2luZyB0aGUKKyAgIGdpdmVuIGJ5dGUgb3JkZXI6CisKKyAgICAqYnl0ZW9yZGVyID09IC0xOiBsaXR0bGUgZW5kaWFuCisgICAgKmJ5dGVvcmRlciA9PSAwOiAgbmF0aXZlIG9yZGVyCisgICAgKmJ5dGVvcmRlciA9PSAxOiAgYmlnIGVuZGlhbgorCisgICBJbiBuYXRpdmUgbW9kZSwgdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGUgc3RyZWFtIGFyZSBjaGVja2VkIGZvciBhCisgICBCT00gbWFyay4gSWYgZm91bmQsIHRoZSBCT00gbWFyayBpcyBhbmFseXNlZCwgdGhlIGJ5dGUgb3JkZXIKKyAgIGFkanVzdGVkIGFuZCB0aGUgQk9NIHNraXBwZWQuICBJbiB0aGUgb3RoZXIgbW9kZXMsIG5vIEJPTSBtYXJrCisgICBpbnRlcnByZXRhdGlvbiBpcyBkb25lLiBBZnRlciBjb21wbGV0aW9uLCAqYnl0ZW9yZGVyIGlzIHNldCB0byB0aGUKKyAgIGN1cnJlbnQgYnl0ZSBvcmRlciBhdCB0aGUgZW5kIG9mIGlucHV0IGRhdGEuCisKKyAgIElmIGJ5dGVvcmRlciBpcyBOVUxMLCB0aGUgY29kZWMgc3RhcnRzIGluIG5hdGl2ZSBvcmRlciBtb2RlLgorCisqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjE2KAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtMTYgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBpbnQgKmJ5dGVvcmRlciAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9bmF0aXZlOy0xPUxFLDE9QkU7IHVwZGF0ZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlVVRGMTZTdGF0ZWZ1bCgKKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTE2IGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50ICpieXRlb3JkZXIsICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYnl0ZW9yZGVyIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPW5hdGl2ZTstMT1MRSwxPUJFOyB1cGRhdGVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgKi8KKyAgICBQeV9zc2l6ZV90ICpjb25zdW1lZCAgICAgICAgICAgICAgICAvKiBieXRlcyBjb25zdW1lZCAqLworICAgICk7CisKKy8qIFJldHVybnMgYSBQeXRob24gc3RyaW5nIHVzaW5nIHRoZSBVVEYtMTYgZW5jb2RpbmcgaW4gbmF0aXZlIGJ5dGUKKyAgIG9yZGVyLiBUaGUgc3RyaW5nIGFsd2F5cyBzdGFydHMgd2l0aCBhIEJPTSBtYXJrLiAgKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1VURjE2U3RyaW5nKAorICAgIFB5T2JqZWN0ICp1bmljb2RlICAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLworICAgICk7CisKKy8qIFJldHVybnMgYSBQeXRob24gc3RyaW5nIG9iamVjdCBob2xkaW5nIHRoZSBVVEYtMTYgZW5jb2RlZCB2YWx1ZSBvZgorICAgdGhlIFVuaWNvZGUgZGF0YS4KKworICAgSWYgYnl0ZW9yZGVyIGlzIG5vdCAwLCBvdXRwdXQgaXMgd3JpdHRlbiBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZworICAgYnl0ZSBvcmRlcjoKKworICAgYnl0ZW9yZGVyID09IC0xOiBsaXR0bGUgZW5kaWFuCisgICBieXRlb3JkZXIgPT0gMDogIG5hdGl2ZSBieXRlIG9yZGVyICh3cml0ZXMgYSBCT00gbWFyaykKKyAgIGJ5dGVvcmRlciA9PSAxOiAgYmlnIGVuZGlhbgorCisgICBJZiBieXRlb3JkZXIgaXMgMCwgdGhlIG91dHB1dCBzdHJpbmcgd2lsbCBhbHdheXMgc3RhcnQgd2l0aCB0aGUKKyAgIFVuaWNvZGUgQk9NIG1hcmsgKFUrRkVGRikuIEluIHRoZSBvdGhlciB0d28gbW9kZXMsIG5vIEJPTSBtYXJrIGlzCisgICBwcmVwZW5kZWQuCisKKyAgIE5vdGUgdGhhdCBQeV9VTklDT0RFIGRhdGEgaXMgYmVpbmcgaW50ZXJwcmV0ZWQgYXMgVVRGLTE2IHJlZHVjZWQgdG8KKyAgIFVDUy0yLiBUaGlzIHRyaWNrIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGFkZCBmdWxsIFVURi0xNiBjYXBhYmlsaXRpZXMKKyAgIGF0IGEgbGF0ZXIgcG9pbnQgd2l0aG91dCBjb21wcm9taXNpbmcgdGhlIEFQSXMuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlVVRGMTYoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBpbnQgYnl0ZW9yZGVyICAgICAgICAgICAgICAgLyogYnl0ZW9yZGVyIHRvIHVzZSAwPUJPTStuYXRpdmU7LTE9TEUsMT1CRSAqLworICAgICk7CisKKy8qIC0tLSBVbmljb2RlLUVzY2FwZSBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVuaWNvZGVFc2NhcGUoCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVuaWNvZGUtRXNjYXBlIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcoCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVVbmljb2RlRXNjYXBlKAorICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGggICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgKTsKKworLyogLS0tIFJhdy1Vbmljb2RlLUVzY2FwZSBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlUmF3VW5pY29kZUVzY2FwZSgKKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogUmF3LVVuaWNvZGUtRXNjYXBlIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc1Jhd1VuaWNvZGVFc2NhcGVTdHJpbmcoCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVSYXdVbmljb2RlRXNjYXBlKAorICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGggICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgKTsKKworLyogLS0tIFVuaWNvZGUgSW50ZXJuYWwgQ29kZWMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBPbmx5IGZvciBpbnRlcm5hbCB1c2UgaW4gX2NvZGVjc21vZHVsZS5jICovCisKK1B5T2JqZWN0ICpfUHlVbmljb2RlX0RlY29kZVVuaWNvZGVJbnRlcm5hbCgKKyAgICBjb25zdCBjaGFyICpzdHJpbmcsCisgICAgUHlfc3NpemVfdCBsZW5ndGgsCisgICAgY29uc3QgY2hhciAqZXJyb3JzCisgICAgKTsKKworLyogLS0tIExhdGluLTEgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIE5vdGU6IExhdGluLTEgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IDI1NiBVbmljb2RlIG9yZGluYWxzLgorCisqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZUxhdGluMSgKKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogTGF0aW4tMSBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmcoCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVMYXRpbjEoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiAtLS0gQVNDSUkgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgT25seSA3LWJpdCBBU0NJSSBkYXRhIGlzIGV4Y2VwdGVkLiBBbGwgb3RoZXIgY29kZXMgZ2VuZXJhdGUgZXJyb3JzLgorCisqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZUFTQ0lJKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBBU0NJSSBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQXNBU0NJSVN0cmluZygKKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZUFTQ0lJKAorICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworLyogLS0tIENoYXJhY3RlciBNYXAgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFRoaXMgY29kZWMgdXNlcyBtYXBwaW5ncyB0byBlbmNvZGUgYW5kIGRlY29kZSBjaGFyYWN0ZXJzLgorCisgICBEZWNvZGluZyBtYXBwaW5ncyBtdXN0IG1hcCBzaW5nbGUgc3RyaW5nIGNoYXJhY3RlcnMgdG8gc2luZ2xlCisgICBVbmljb2RlIGNoYXJhY3RlcnMsIGludGVnZXJzICh3aGljaCBhcmUgdGhlbiBpbnRlcnByZXRlZCBhcyBVbmljb2RlCisgICBvcmRpbmFscykgb3IgTm9uZSAobWVhbmluZyAidW5kZWZpbmVkIG1hcHBpbmciIGFuZCBjYXVzaW5nIGFuCisgICBlcnJvcikuCisKKyAgIEVuY29kaW5nIG1hcHBpbmdzIG11c3QgbWFwIHNpbmdsZSBVbmljb2RlIGNoYXJhY3RlcnMgdG8gc2luZ2xlCisgICBzdHJpbmcgY2hhcmFjdGVycywgaW50ZWdlcnMgKHdoaWNoIGFyZSB0aGVuIGludGVycHJldGVkIGFzIExhdGluLTEKKyAgIG9yZGluYWxzKSBvciBOb25lIChtZWFuaW5nICJ1bmRlZmluZWQgbWFwcGluZyIgYW5kIGNhdXNpbmcgYW4KKyAgIGVycm9yKS4KKworICAgSWYgYSBjaGFyYWN0ZXIgbG9va3VwIGZhaWxzIHdpdGggYSBMb29rdXBFcnJvciwgdGhlIGNoYXJhY3RlciBpcworICAgY29waWVkIGFzLWlzIG1lYW5pbmcgdGhhdCBpdHMgb3JkaW5hbCB2YWx1ZSB3aWxsIGJlIGludGVycHJldGVkIGFzCisgICBVbmljb2RlIG9yIExhdGluLTEgb3JkaW5hbCByZXNwLiBCZWNhdXNlIG9mIHRoaXMgbWFwcGluZ3Mgb25seSBuZWVkCisgICB0byBjb250YWluIHRob3NlIG1hcHBpbmdzIHdoaWNoIG1hcCBjaGFyYWN0ZXJzIHRvIGRpZmZlcmVudCBjb2RlCisgICBwb2ludHMuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlQ2hhcm1hcCgKKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogRW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqbWFwcGluZywgICAgICAgICAgLyogY2hhcmFjdGVyIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgb3JkaW5hbCAtPiB1bmljb2RlIG9yZGluYWwpICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc0NoYXJtYXBTdHJpbmcoCisgICAgUHlPYmplY3QgKnVuaWNvZGUsICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgUHlPYmplY3QgKm1hcHBpbmcgICAgICAgICAgIC8qIGNoYXJhY3RlciBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bmljb2RlIG9yZGluYWwgLT4gY2hhciBvcmRpbmFsKSAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlQ2hhcm1hcCgKKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBQeU9iamVjdCAqbWFwcGluZywgICAgICAgICAgLyogY2hhcmFjdGVyIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuaWNvZGUgb3JkaW5hbCAtPiBjaGFyIG9yZGluYWwpICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworLyogVHJhbnNsYXRlIGEgUHlfVU5JQ09ERSBidWZmZXIgb2YgdGhlIGdpdmVuIGxlbmd0aCBieSBhcHBseWluZyBhCisgICBjaGFyYWN0ZXIgbWFwcGluZyB0YWJsZSB0byBpdCBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgVW5pY29kZQorICAgb2JqZWN0LgorCisgICBUaGUgbWFwcGluZyB0YWJsZSBtdXN0IG1hcCBVbmljb2RlIG9yZGluYWwgaW50ZWdlcnMgdG8gVW5pY29kZQorICAgb3JkaW5hbCBpbnRlZ2VycyBvciBOb25lIChjYXVzaW5nIGRlbGV0aW9uIG9mIHRoZSBjaGFyYWN0ZXIpLgorCisgICBNYXBwaW5nIHRhYmxlcyBtYXkgYmUgZGljdGlvbmFyaWVzIG9yIHNlcXVlbmNlcy4gVW5tYXBwZWQgY2hhcmFjdGVyCisgICBvcmRpbmFscyAob25lcyB3aGljaCBjYXVzZSBhIExvb2t1cEVycm9yKSBhcmUgbGVmdCB1bnRvdWNoZWQgYW5kCisgICBhcmUgY29waWVkIGFzLWlzLgorCisqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZV9UcmFuc2xhdGVDaGFybWFwKAorICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgUHlPYmplY3QgKnRhYmxlLCAgICAgICAgICAgIC8qIFRyYW5zbGF0ZSB0YWJsZSAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKyNpZmRlZiBNU19XSU4zMgorCisvKiAtLS0gTUJDUyBjb2RlY3MgZm9yIFdpbmRvd3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVNQkNTKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBNQkNTIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlTUJDU1N0YXRlZnVsKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBNQkNTIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlfc3NpemVfdCAqY29uc3VtZWQgICAgICAgIC8qIGJ5dGVzIGNvbnN1bWVkICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc01CQ1NTdHJpbmcoCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVNQkNTKAorICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisjZW5kaWYgLyogTVNfV0lOMzIgKi8KKworLyogLS0tIERlY2ltYWwgRW5jb2RlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRha2VzIGEgVW5pY29kZSBzdHJpbmcgaG9sZGluZyBhIGRlY2ltYWwgdmFsdWUgYW5kIHdyaXRlcyBpdCBpbnRvCisgICBhbiBvdXRwdXQgYnVmZmVyIHVzaW5nIHN0YW5kYXJkIEFTQ0lJIGRpZ2l0IGNvZGVzLgorCisgICBUaGUgb3V0cHV0IGJ1ZmZlciBoYXMgdG8gcHJvdmlkZSBhdCBsZWFzdCBsZW5ndGgrMSBieXRlcyBvZiBzdG9yYWdlCisgICBhcmVhLiBUaGUgb3V0cHV0IHN0cmluZyBpcyAwLXRlcm1pbmF0ZWQuCisKKyAgIFRoZSBlbmNvZGVyIGNvbnZlcnRzIHdoaXRlc3BhY2UgdG8gJyAnLCBkZWNpbWFsIGNoYXJhY3RlcnMgdG8gdGhlaXIKKyAgIGNvcnJlc3BvbmRpbmcgQVNDSUkgZGlnaXQgYW5kIGFsbCBvdGhlciBMYXRpbi0xIGNoYXJhY3RlcnMgZXhjZXB0CisgICBcMCBhcy1pcy4gQ2hhcmFjdGVycyBvdXRzaWRlIHRoaXMgcmFuZ2UgKFVuaWNvZGUgb3JkaW5hbHMgMS0yNTYpCisgICBhcmUgdHJlYXRlZCBhcyBlcnJvcnMuIFRoaXMgaW5jbHVkZXMgZW1iZWRkZWQgTlVMTCBieXRlcy4KKworICAgRXJyb3IgaGFuZGxpbmcgaXMgZGVmaW5lZCBieSB0aGUgZXJyb3JzIGFyZ3VtZW50OgorCisgICAgICBOVUxMIG9yICJzdHJpY3QiOiByYWlzZSBhIFZhbHVlRXJyb3IKKyAgICAgICJpZ25vcmUiOiBpZ25vcmUgdGhlIHdyb25nIGNoYXJhY3RlcnMgKHRoZXNlIGFyZSBub3QgY29waWVkIHRvIHRoZQorICAgICAgICAgICAgICAgIG91dHB1dCBidWZmZXIpCisgICAgICAicmVwbGFjZSI6IHJlcGxhY2VzIGlsbGVnYWwgY2hhcmFjdGVycyB3aXRoICc/JworCisgICBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KKworKi8KKworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZV9FbmNvZGVEZWNpbWFsKAorICAgIFB5X1VOSUNPREUgKnMsICAgICAgICAgICAgICAvKiBVbmljb2RlIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNoYXIgKm91dHB1dCwgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyOyBtdXN0IGhhdmUgc2l6ZSA+PSBsZW5ndGggKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiAtLS0gTWV0aG9kcyAmIFNsb3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgVGhlc2UgYXJlIGNhcGFibGUgb2YgaGFuZGxpbmcgVW5pY29kZSBvYmplY3RzIGFuZCBzdHJpbmdzIG9uIGlucHV0CisgICAod2UgcmVmZXIgdG8gdGhlbSBhcyBzdHJpbmdzIGluIHRoZSBkZXNjcmlwdGlvbnMpIGFuZCByZXR1cm4KKyAgIFVuaWNvZGUgb2JqZWN0cyBvciBpbnRlZ2VycyBhcyBhcHBvcnByaWF0ZS4gKi8KKworLyogQ29uY2F0IHR3byBzdHJpbmdzIGdpdmluZyBhIG5ldyBVbmljb2RlIHN0cmluZy4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Db25jYXQoCisgICAgUHlPYmplY3QgKmxlZnQsICAgICAgICAgICAgIC8qIExlZnQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKnJpZ2h0ICAgICAgICAgICAgIC8qIFJpZ2h0IHN0cmluZyAqLworICAgICk7CisKKy8qIFNwbGl0IGEgc3RyaW5nIGdpdmluZyBhIGxpc3Qgb2YgVW5pY29kZSBzdHJpbmdzLgorCisgICBJZiBzZXAgaXMgTlVMTCwgc3BsaXR0aW5nIHdpbGwgYmUgZG9uZSBhdCBhbGwgd2hpdGVzcGFjZQorICAgc3Vic3RyaW5ncy4gT3RoZXJ3aXNlLCBzcGxpdHMgb2NjdXIgYXQgdGhlIGdpdmVuIHNlcGFyYXRvci4KKworICAgQXQgbW9zdCBtYXhzcGxpdCBzcGxpdHMgd2lsbCBiZSBkb25lLiBJZiBuZWdhdGl2ZSwgbm8gbGltaXQgaXMgc2V0LgorCisgICBTZXBhcmF0b3JzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0LgorCisqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX1NwbGl0KAorICAgIFB5T2JqZWN0ICpzLCAgICAgICAgICAgICAgICAvKiBTdHJpbmcgdG8gc3BsaXQgKi8KKyAgICBQeU9iamVjdCAqc2VwLCAgICAgICAgICAgICAgLyogU3RyaW5nIHNlcGFyYXRvciAqLworICAgIFB5X3NzaXplX3QgbWF4c3BsaXQgICAgICAgICAvKiBNYXhzcGxpdCBjb3VudCAqLworICAgICk7CisKKy8qIERpdG8sIGJ1dCBzcGxpdCBhdCBsaW5lIGJyZWFrcy4KKworICAgQ1JMRiBpcyBjb25zaWRlcmVkIHRvIGJlIG9uZSBsaW5lIGJyZWFrLiBMaW5lIGJyZWFrcyBhcmUgbm90CisgICBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3QuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfU3BsaXRsaW5lcygKKyAgICBQeU9iamVjdCAqcywgICAgICAgICAgICAgICAgLyogU3RyaW5nIHRvIHNwbGl0ICovCisgICAgaW50IGtlZXBlbmRzICAgICAgICAgICAgICAgIC8qIElmIHRydWUsIGxpbmUgZW5kIG1hcmtlcnMgYXJlIGluY2x1ZGVkICovCisgICAgKTsKKworLyogUGFydGl0aW9uIGEgc3RyaW5nIHVzaW5nIGEgZ2l2ZW4gc2VwYXJhdG9yLiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX1BhcnRpdGlvbigKKyAgICBQeU9iamVjdCAqcywgICAgICAgICAgICAgICAgLyogU3RyaW5nIHRvIHBhcnRpdGlvbiAqLworICAgIFB5T2JqZWN0ICpzZXAgICAgICAgICAgICAgICAvKiBTdHJpbmcgc2VwYXJhdG9yICovCisgICAgKTsKKworLyogUGFydGl0aW9uIGEgc3RyaW5nIHVzaW5nIGEgZ2l2ZW4gc2VwYXJhdG9yLCBzZWFyY2hpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZQorICAgc3RyaW5nLiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX1JQYXJ0aXRpb24oCisgICAgUHlPYmplY3QgKnMsICAgICAgICAgICAgICAgIC8qIFN0cmluZyB0byBwYXJ0aXRpb24gKi8KKyAgICBQeU9iamVjdCAqc2VwICAgICAgICAgICAgICAgLyogU3RyaW5nIHNlcGFyYXRvciAqLworICAgICk7CisKKy8qIFNwbGl0IGEgc3RyaW5nIGdpdmluZyBhIGxpc3Qgb2YgVW5pY29kZSBzdHJpbmdzLgorCisgICBJZiBzZXAgaXMgTlVMTCwgc3BsaXR0aW5nIHdpbGwgYmUgZG9uZSBhdCBhbGwgd2hpdGVzcGFjZQorICAgc3Vic3RyaW5ncy4gT3RoZXJ3aXNlLCBzcGxpdHMgb2NjdXIgYXQgdGhlIGdpdmVuIHNlcGFyYXRvci4KKworICAgQXQgbW9zdCBtYXhzcGxpdCBzcGxpdHMgd2lsbCBiZSBkb25lLiBCdXQgdW5saWtlIFB5VW5pY29kZV9TcGxpdAorICAgUHlVbmljb2RlX1JTcGxpdCBzcGxpdHMgZnJvbSB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuIElmIG5lZ2F0aXZlLAorICAgbm8gbGltaXQgaXMgc2V0LgorCisgICBTZXBhcmF0b3JzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBsaXN0LgorCisqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX1JTcGxpdCgKKyAgICBQeU9iamVjdCAqcywgICAgICAgICAgICAgICAgLyogU3RyaW5nIHRvIHNwbGl0ICovCisgICAgUHlPYmplY3QgKnNlcCwgICAgICAgICAgICAgIC8qIFN0cmluZyBzZXBhcmF0b3IgKi8KKyAgICBQeV9zc2l6ZV90IG1heHNwbGl0ICAgICAgICAgLyogTWF4c3BsaXQgY291bnQgKi8KKyAgICApOworCisvKiBUcmFuc2xhdGUgYSBzdHJpbmcgYnkgYXBwbHlpbmcgYSBjaGFyYWN0ZXIgbWFwcGluZyB0YWJsZSB0byBpdCBhbmQKKyAgIHJldHVybiB0aGUgcmVzdWx0aW5nIFVuaWNvZGUgb2JqZWN0LgorCisgICBUaGUgbWFwcGluZyB0YWJsZSBtdXN0IG1hcCBVbmljb2RlIG9yZGluYWwgaW50ZWdlcnMgdG8gVW5pY29kZQorICAgb3JkaW5hbCBpbnRlZ2VycyBvciBOb25lIChjYXVzaW5nIGRlbGV0aW9uIG9mIHRoZSBjaGFyYWN0ZXIpLgorCisgICBNYXBwaW5nIHRhYmxlcyBtYXkgYmUgZGljdGlvbmFyaWVzIG9yIHNlcXVlbmNlcy4gVW5tYXBwZWQgY2hhcmFjdGVyCisgICBvcmRpbmFscyAob25lcyB3aGljaCBjYXVzZSBhIExvb2t1cEVycm9yKSBhcmUgbGVmdCB1bnRvdWNoZWQgYW5kCisgICBhcmUgY29waWVkIGFzLWlzLgorCisqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZV9UcmFuc2xhdGUoCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIFN0cmluZyAqLworICAgIFB5T2JqZWN0ICp0YWJsZSwgICAgICAgICAgICAvKiBUcmFuc2xhdGUgdGFibGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiBKb2luIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB1c2luZyB0aGUgZ2l2ZW4gc2VwYXJhdG9yIGFuZCByZXR1cm4KKyAgIHRoZSByZXN1bHRpbmcgVW5pY29kZSBzdHJpbmcuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfSm9pbigKKyAgICBQeU9iamVjdCAqc2VwYXJhdG9yLCAgICAgICAgLyogU2VwYXJhdG9yIHN0cmluZyAqLworICAgIFB5T2JqZWN0ICpzZXEgICAgICAgICAgICAgICAvKiBTZXF1ZW5jZSBvYmplY3QgKi8KKyAgICApOworCisvKiBSZXR1cm4gMSBpZiBzdWJzdHIgbWF0Y2hlcyBzdHJbc3RhcnQ6ZW5kXSBhdCB0aGUgZ2l2ZW4gdGFpbCBlbmQsIDAKKyAgIG90aGVyd2lzZS4gKi8KKworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVVuaWNvZGVfVGFpbG1hdGNoKAorICAgIFB5T2JqZWN0ICpzdHIsICAgICAgICAgICAgICAvKiBTdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqc3Vic3RyLCAgICAgICAgICAgLyogUHJlZml4IG9yIFN1ZmZpeCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IHN0YXJ0LCAgICAgICAgICAgLyogU3RhcnQgaW5kZXggKi8KKyAgICBQeV9zc2l6ZV90IGVuZCwgICAgICAgICAgICAgLyogU3RvcCBpbmRleCAqLworICAgIGludCBkaXJlY3Rpb24gICAgICAgICAgICAgICAvKiBUYWlsIGVuZDogLTEgcHJlZml4LCArMSBzdWZmaXggKi8KKyAgICApOworCisvKiBSZXR1cm4gdGhlIGZpcnN0IHBvc2l0aW9uIG9mIHN1YnN0ciBpbiBzdHJbc3RhcnQ6ZW5kXSB1c2luZyB0aGUKKyAgIGdpdmVuIHNlYXJjaCBkaXJlY3Rpb24gb3IgLTEgaWYgbm90IGZvdW5kLiAtMiBpcyByZXR1cm5lZCBpbiBjYXNlCisgICBhbiBlcnJvciBvY2N1cnJlZCBhbmQgYW4gZXhjZXB0aW9uIGlzIHNldC4gKi8KKworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVVuaWNvZGVfRmluZCgKKyAgICBQeU9iamVjdCAqc3RyLCAgICAgICAgICAgICAgLyogU3RyaW5nICovCisgICAgUHlPYmplY3QgKnN1YnN0ciwgICAgICAgICAgIC8qIFN1YnN0cmluZyB0byBmaW5kICovCisgICAgUHlfc3NpemVfdCBzdGFydCwgICAgICAgICAgIC8qIFN0YXJ0IGluZGV4ICovCisgICAgUHlfc3NpemVfdCBlbmQsICAgICAgICAgICAgIC8qIFN0b3AgaW5kZXggKi8KKyAgICBpbnQgZGlyZWN0aW9uICAgICAgICAgICAgICAgLyogRmluZCBkaXJlY3Rpb246ICsxIGZvcndhcmQsIC0xIGJhY2t3YXJkICovCisgICAgKTsKKworLyogQ291bnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBzdWJzdHIgaW4gc3RyW3N0YXJ0OmVuZF0uICovCisKK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlVbmljb2RlX0NvdW50KAorICAgIFB5T2JqZWN0ICpzdHIsICAgICAgICAgICAgICAvKiBTdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqc3Vic3RyLCAgICAgICAgICAgLyogU3Vic3RyaW5nIHRvIGNvdW50ICovCisgICAgUHlfc3NpemVfdCBzdGFydCwgICAgICAgICAgIC8qIFN0YXJ0IGluZGV4ICovCisgICAgUHlfc3NpemVfdCBlbmQgICAgICAgICAgICAgIC8qIFN0b3AgaW5kZXggKi8KKyAgICApOworCisvKiBSZXBsYWNlIGF0IG1vc3QgbWF4Y291bnQgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyIGluIHN0ciB3aXRoIHJlcGxzdHIKKyAgIGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBVbmljb2RlIG9iamVjdC4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVfUmVwbGFjZSgKKyAgICBQeU9iamVjdCAqc3RyLCAgICAgICAgICAgICAgLyogU3RyaW5nICovCisgICAgUHlPYmplY3QgKnN1YnN0ciwgICAgICAgICAgIC8qIFN1YnN0cmluZyB0byBmaW5kICovCisgICAgUHlPYmplY3QgKnJlcGxzdHIsICAgICAgICAgIC8qIFN1YnN0cmluZyB0byByZXBsYWNlICovCisgICAgUHlfc3NpemVfdCBtYXhjb3VudCAgICAgICAgIC8qIE1heC4gbnVtYmVyIG9mIHJlcGxhY2VtZW50cyB0byBhcHBseTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgPSBhbGwgKi8KKyAgICApOworCisvKiBDb21wYXJlIHR3byBzdHJpbmdzIGFuZCByZXR1cm4gLTEsIDAsIDEgZm9yIGxlc3MgdGhhbiwgZXF1YWwsCisgICBncmVhdGVyIHRoYW4gcmVzcC4gKi8KKworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZV9Db21wYXJlKAorICAgIFB5T2JqZWN0ICpsZWZ0LCAgICAgICAgICAgICAvKiBMZWZ0IHN0cmluZyAqLworICAgIFB5T2JqZWN0ICpyaWdodCAgICAgICAgICAgICAvKiBSaWdodCBzdHJpbmcgKi8KKyAgICApOworCisvKiBSaWNoIGNvbXBhcmUgdHdvIHN0cmluZ3MgYW5kIHJldHVybiBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgLSBOVUxMIGluIGNhc2UgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQKKyAgIC0gUHlfVHJ1ZSBvciBQeV9GYWxzZSBmb3Igc3VjY2Vzc2Z1bHkgY29tcGFyaXNvbnMKKyAgIC0gUHlfTm90SW1wbGVtZW50ZWQgaW4gY2FzZSB0aGUgdHlwZSBjb21iaW5hdGlvbiBpcyB1bmtub3duCisKKyAgIE5vdGUgdGhhdCBQeV9FUSBhbmQgUHlfTkUgY29tcGFyaXNvbnMgY2FuIGNhdXNlIGEgVW5pY29kZVdhcm5pbmcgaW4KKyAgIGNhc2UgdGhlIGNvbnZlcnNpb24gb2YgdGhlIGFyZ3VtZW50cyB0byBVbmljb2RlIGZhaWxzIHdpdGggYQorICAgVW5pY29kZURlY29kZUVycm9yLgorCisgICBQb3NzaWJsZSB2YWx1ZXMgZm9yIG9wOgorCisgICAgIFB5X0dULCBQeV9HRSwgUHlfRVEsIFB5X05FLCBQeV9MVCwgUHlfTEUKKworKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVfUmljaENvbXBhcmUoCisgICAgUHlPYmplY3QgKmxlZnQsICAgICAgICAgICAgIC8qIExlZnQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKnJpZ2h0LCAgICAgICAgICAgIC8qIFJpZ2h0IHN0cmluZyAqLworICAgIGludCBvcCAgICAgICAgICAgICAgICAgICAgICAvKiBPcGVyYXRpb246IFB5X0VRLCBQeV9ORSwgUHlfR1QsIGV0Yy4gKi8KKyAgICApOworCisvKiBBcHBseSBhIGFyZ3VtZW50IHR1cGxlIG9yIGRpY3Rpb25hcnkgdG8gYSBmb3JtYXQgc3RyaW5nIGFuZCByZXR1cm4KKyAgIHRoZSByZXN1bHRpbmcgVW5pY29kZSBzdHJpbmcuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlX0Zvcm1hdCgKKyAgICBQeU9iamVjdCAqZm9ybWF0LCAgICAgICAgICAgLyogRm9ybWF0IHN0cmluZyAqLworICAgIFB5T2JqZWN0ICphcmdzICAgICAgICAgICAgICAvKiBBcmd1bWVudCB0dXBsZSBvciBkaWN0aW9uYXJ5ICovCisgICAgKTsKKworLyogQ2hlY2tzIHdoZXRoZXIgZWxlbWVudCBpcyBjb250YWluZWQgaW4gY29udGFpbmVyIGFuZCByZXR1cm4gMS8wCisgICBhY2NvcmRpbmdseS4KKworICAgZWxlbWVudCBoYXMgdG8gY29lcmNlIHRvIGFuIG9uZSBlbGVtZW50IFVuaWNvZGUgc3RyaW5nLiAtMSBpcworICAgcmV0dXJuZWQgaW4gY2FzZSBvZiBhbiBlcnJvci4gKi8KKworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZV9Db250YWlucygKKyAgICBQeU9iamVjdCAqY29udGFpbmVyLCAgICAgICAgLyogQ29udGFpbmVyIHN0cmluZyAqLworICAgIFB5T2JqZWN0ICplbGVtZW50ICAgICAgICAgICAvKiBFbGVtZW50IHN0cmluZyAqLworICAgICk7CisKKy8qIEV4dGVybmFsbHkgdmlzaWJsZSBmb3Igc3RyLnN0cmlwKHVuaWNvZGUpICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVVuaWNvZGVfWFN0cmlwKAorICAgIFB5VW5pY29kZU9iamVjdCAqc2VsZiwKKyAgICBpbnQgc3RyaXB0eXBlLAorICAgIFB5T2JqZWN0ICpzZXBvYmoKKyAgICApOworCisvKiA9PT0gQ2hhcmFjdGVycyBUeXBlIEFQSXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogSGVscGVyIGFycmF5IHVzZWQgYnkgUHlfVU5JQ09ERV9JU1NQQUNFKCkuICovCisKK1B5QVBJX0RBVEEoY29uc3QgdW5zaWduZWQgY2hhcikgX1B5X2FzY2lpX3doaXRlc3BhY2VbXTsKKworLyogVGhlc2Ugc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LiBVc2UgdGhlIFB5X1VOSUNPREVfSVMqIGFuZAorICAgUHlfVU5JQ09ERV9UTyogbWFjcm9zIGluc3RlYWQuCisKKyAgIFRoZXNlIEFQSXMgYXJlIGltcGxlbWVudGVkIGluIE9iamVjdHMvdW5pY29kZWN0eXBlLmMuCisKKyovCisKK1B5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0lzTG93ZXJjYXNlKAorICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCitQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc1VwcGVyY2FzZSgKKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgKTsKKworUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNUaXRsZWNhc2UoCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0lzV2hpdGVzcGFjZSgKKyAgICBjb25zdCBQeV9VTklDT0RFIGNoICAgICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCitQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc0xpbmVicmVhaygKKyAgICBjb25zdCBQeV9VTklDT0RFIGNoICAgICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5X1VOSUNPREUpIF9QeVVuaWNvZGVfVG9Mb3dlcmNhc2UoCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoUHlfVU5JQ09ERSkgX1B5VW5pY29kZV9Ub1VwcGVyY2FzZSgKKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeV9VTklDT0RFKSBfUHlVbmljb2RlX1RvVGl0bGVjYXNlKAorICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCitQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Ub0RlY2ltYWxEaWdpdCgKKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgKTsKKworUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfVG9EaWdpdCgKKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgKTsKKworUHlBUElfRlVOQyhkb3VibGUpIF9QeVVuaWNvZGVfVG9OdW1lcmljKAorICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCitQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc0RlY2ltYWxEaWdpdCgKKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgKTsKKworUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNEaWdpdCgKKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgKTsKKworUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNOdW1lcmljKAorICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCitQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc0FscGhhKAorICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qIFB5X1VTSU5HX1VOSUNPREUgKi8KKyNlbmRpZiAvKiAhUHlfVU5JQ09ERU9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy93YXJuaW5ncy5oIGIvaW5jbHVkZS9weXRob24yLjcvd2FybmluZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODE4ZDdhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvd2FybmluZ3MuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIFB5X1dBUk5JTkdTX0gKKyNkZWZpbmUgUHlfV0FSTklOR1NfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9GVU5DKHZvaWQpIF9QeVdhcm5pbmdzX0luaXQodm9pZCk7CisKK1B5QVBJX0ZVTkMoaW50KSBQeUVycl9XYXJuRXgoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90KTsKK1B5QVBJX0ZVTkMoaW50KSBQeUVycl9XYXJuRXhwbGljaXQoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgUHlPYmplY3QgKik7CisKKyNkZWZpbmUgUHlFcnJfV2FyblB5M2sobXNnLCBzdGFja2xldmVsKSBcCisgIChQeV9QeTNrV2FybmluZ0ZsYWcgPyBQeUVycl9XYXJuRXgoUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLCBtc2csIHN0YWNrbGV2ZWwpIDogMCkKKworLyogREVQUkVDQVRFRDogVXNlIFB5RXJyX1dhcm5FeCgpIGluc3RlYWQuICovCisjZGVmaW5lIFB5RXJyX1dhcm4oY2F0ZWdvcnksIG1zZykgUHlFcnJfV2FybkV4KGNhdGVnb3J5LCBtc2csIDEpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1dBUk5JTkdTX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvd2Vha3JlZm9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvd2Vha3JlZm9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmFlY2YKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy93ZWFrcmVmb2JqZWN0LmgKQEAgLTAsMCArMSw4NSBAQAorLyogV2VhayByZWZlcmVuY2VzIG9iamVjdHMgZm9yIFB5dGhvbi4gKi8KKworI2lmbmRlZiBQeV9XRUFLUkVGT0JKRUNUX0gKKyNkZWZpbmUgUHlfV0VBS1JFRk9CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgX1B5V2Vha1JlZmVyZW5jZSBQeVdlYWtSZWZlcmVuY2U7CisKKy8qIFB5V2Vha1JlZmVyZW5jZSBpcyB0aGUgYmFzZSBzdHJ1Y3QgZm9yIHRoZSBQeXRob24gUmVmZXJlbmNlVHlwZSwgUHJveHlUeXBlLAorICogYW5kIENhbGxhYmxlUHJveHlUeXBlLgorICovCitzdHJ1Y3QgX1B5V2Vha1JlZmVyZW5jZSB7CisgICAgUHlPYmplY3RfSEVBRAorCisgICAgLyogVGhlIG9iamVjdCB0byB3aGljaCB0aGlzIGlzIGEgd2VhayByZWZlcmVuY2UsIG9yIFB5X05vbmUgaWYgbm9uZS4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyBhIHN0ZWFsdGggcmVmZXJlbmNlOiAgd3Jfb2JqZWN0J3MgcmVmY291bnQgaXMKKyAgICAgKiBub3QgaW5jcmVtZW50ZWQgdG8gcmVmbGVjdCB0aGlzIHBvaW50ZXIuCisgICAgICovCisgICAgUHlPYmplY3QgKndyX29iamVjdDsKKworICAgIC8qIEEgY2FsbGFibGUgdG8gaW52b2tlIHdoZW4gd3Jfb2JqZWN0IGRpZXMsIG9yIE5VTEwgaWYgbm9uZS4gKi8KKyAgICBQeU9iamVjdCAqd3JfY2FsbGJhY2s7CisKKyAgICAvKiBBIGNhY2hlIGZvciB3cl9vYmplY3QncyBoYXNoIGNvZGUuICBBcyB1c3VhbCBmb3IgaGFzaGVzLCB0aGlzIGlzIC0xCisgICAgICogaWYgdGhlIGhhc2ggY29kZSBpc24ndCBrbm93biB5ZXQuCisgICAgICovCisgICAgbG9uZyBoYXNoOworCisgICAgLyogSWYgd3Jfb2JqZWN0IGlzIHdlYWtseSByZWZlcmVuY2VkLCB3cl9vYmplY3QgaGFzIGEgZG91Ymx5LWxpbmtlZCBOVUxMLQorICAgICAqIHRlcm1pbmF0ZWQgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gaXQuICBUaGVzZSBhcmUgdGhlIGxpc3QgcG9pbnRlcnMuCisgICAgICogSWYgd3Jfb2JqZWN0IGdvZXMgYXdheSwgd3Jfb2JqZWN0IGlzIHNldCB0byBQeV9Ob25lLCBhbmQgdGhlc2UgcG9pbnRlcnMKKyAgICAgKiBoYXZlIG5vIG1lYW5pbmcgdGhlbi4KKyAgICAgKi8KKyAgICBQeVdlYWtSZWZlcmVuY2UgKndyX3ByZXY7CisgICAgUHlXZWFrUmVmZXJlbmNlICp3cl9uZXh0OworfTsKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIF9QeVdlYWtyZWZfUmVmVHlwZTsKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBfUHlXZWFrcmVmX1Byb3h5VHlwZTsKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBfUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlOworCisjZGVmaW5lIFB5V2Vha3JlZl9DaGVja1JlZihvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCAmX1B5V2Vha3JlZl9SZWZUeXBlKQorI2RlZmluZSBQeVdlYWtyZWZfQ2hlY2tSZWZFeGFjdChvcCkgXAorICAgICAgICAoUHlfVFlQRShvcCkgPT0gJl9QeVdlYWtyZWZfUmVmVHlwZSkKKyNkZWZpbmUgUHlXZWFrcmVmX0NoZWNrUHJveHkob3ApIFwKKyAgICAgICAgKChQeV9UWVBFKG9wKSA9PSAmX1B5V2Vha3JlZl9Qcm94eVR5cGUpIHx8IFwKKyAgICAgICAgIChQeV9UWVBFKG9wKSA9PSAmX1B5V2Vha3JlZl9DYWxsYWJsZVByb3h5VHlwZSkpCisKKy8qIFRoaXMgbWFjcm8gY2FsbHMgUHlXZWFrcmVmX0NoZWNrUmVmKCkgbGFzdCBzaW5jZSB0aGF0IGNhbiBpbnZvbHZlIGEKKyAgIGZ1bmN0aW9uIGNhbGw7IHRoaXMgbWFrZXMgaXQgbW9yZSBsaWtlbHkgdGhhdCB0aGUgZnVuY3Rpb24gY2FsbAorICAgd2lsbCBiZSBhdm9pZGVkLiAqLworI2RlZmluZSBQeVdlYWtyZWZfQ2hlY2sob3ApIFwKKyAgICAgICAgKFB5V2Vha3JlZl9DaGVja1JlZihvcCkgfHwgUHlXZWFrcmVmX0NoZWNrUHJveHkob3ApKQorCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlXZWFrcmVmX05ld1JlZihQeU9iamVjdCAqb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNhbGxiYWNrKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlXZWFrcmVmX05ld1Byb3h5KFB5T2JqZWN0ICpvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjYWxsYmFjayk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5V2Vha3JlZl9HZXRPYmplY3QoUHlPYmplY3QgKnJlZik7CisKK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5V2Vha3JlZl9HZXRXZWFrcmVmQ291bnQoUHlXZWFrUmVmZXJlbmNlICpoZWFkKTsKKworUHlBUElfRlVOQyh2b2lkKSBfUHlXZWFrcmVmX0NsZWFyUmVmKFB5V2Vha1JlZmVyZW5jZSAqc2VsZik7CisKKy8qIEV4cGxhbmF0aW9uIGZvciB0aGUgUHlfUkVGQ05UKCkgY2hlY2s6IHdoZW4gYSB3ZWFrcmVmJ3MgdGFyZ2V0IGlzIHBhcnQKKyAgIG9mIGEgbG9uZyBjaGFpbiBvZiBkZWFsbG9jYXRpb25zIHdoaWNoIHRyaWdnZXJzIHRoZSB0cmFzaGNhbiBtZWNoYW5pc20sCisgICBjbGVhcmluZyB0aGUgd2Vha3JlZnMgY2FuIGJlIGRlbGF5ZWQgbG9uZyBhZnRlciB0aGUgdGFyZ2V0J3MgcmVmY291bnQKKyAgIGhhcyBkcm9wcGVkIHRvIHplcm8uICBJbiB0aGUgbWVhbnRpbWUsIGNvZGUgYWNjZXNzaW5nIHRoZSB3ZWFrcmVmIHdpbGwKKyAgIGJlIGFibGUgdG8gInNlZSIgdGhlIHRhcmdldCBvYmplY3QgZXZlbiB0aG91Z2ggaXQgaXMgc3VwcG9zZWQgdG8gYmUKKyAgIHVucmVhY2hhYmxlLiAgU2VlIGlzc3VlICMxNjYwMi4gKi8KKworI2RlZmluZSBQeVdlYWtyZWZfR0VUX09CSkVDVChyZWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChQeV9SRUZDTlQoKChQeVdlYWtSZWZlcmVuY2UgKikocmVmKSktPndyX29iamVjdCkgPiAwICAgXAorICAgICA/ICgoUHlXZWFrUmVmZXJlbmNlICopKHJlZikpLT53cl9vYmplY3QgICAgICAgICAgICAgICAgXAorICAgICA6IFB5X05vbmUpCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfV0VBS1JFRk9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9saWIvbGlicHl0aG9uMi43LmEgYi9saWIvbGlicHl0aG9uMi43LmEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTRjNjExOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9saWJweXRob24yLjcuYQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcGtnY29uZmlnL3B5dGhvbi0yLjcucGMgYi9saWIvcGtnY29uZmlnL3B5dGhvbi0yLjcucGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlMjUzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wa2djb25maWcvcHl0aG9uLTIuNy5wYwpAQCAtMCwwICsxLDEzIEBACitwcmVmaXg9L3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0CitleGVjX3ByZWZpeD0ke3ByZWZpeH0KK2xpYmRpcj0ke2V4ZWNfcHJlZml4fS9saWIKK2luY2x1ZGVkaXI9JHtwcmVmaXh9L2luY2x1ZGUKKworTmFtZTogUHl0aG9uCitEZXNjcmlwdGlvbjogUHl0aG9uIGxpYnJhcnkKK1JlcXVpcmVzOiAKK1ZlcnNpb246IDIuNworTGlicy5wcml2YXRlOiAtbGRsICAtZnJhbWV3b3JrIENvcmVGb3VuZGF0aW9uCitMaWJzOiAtTCR7bGliZGlyfSAtbHB5dGhvbjIuNworQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vcHl0aG9uMi43IAorCmRpZmYgLS1naXQgYS9saWIvcGtnY29uZmlnL3B5dGhvbi5wYyBiL2xpYi9wa2djb25maWcvcHl0aG9uLnBjCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmI3ZGZmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGtnY29uZmlnL3B5dGhvbi5wYwpAQCAtMCwwICsxIEBACitweXRob24yLnBjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3BrZ2NvbmZpZy9weXRob24yLnBjIGIvbGliL3BrZ2NvbmZpZy9weXRob24yLnBjCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmI1YWM2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcGtnY29uZmlnL3B5dGhvbjIucGMKQEAgLTAsMCArMSBAQAorcHl0aG9uLTIuNy5wYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQmFzZUhUVFBTZXJ2ZXIucHkgYi9saWIvcHl0aG9uMi43L0Jhc2VIVFRQU2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWYyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0Jhc2VIVFRQU2VydmVyLnB5CkBAIC0wLDAgKzEsNjAzIEBACisiIiJIVFRQIHNlcnZlciBiYXNlIGNsYXNzLgorCitOb3RlOiB0aGUgY2xhc3MgaW4gdGhpcyBtb2R1bGUgZG9lc24ndCBpbXBsZW1lbnQgYW55IEhUVFAgcmVxdWVzdDsgc2VlCitTaW1wbGVIVFRQU2VydmVyIGZvciBzaW1wbGUgaW1wbGVtZW50YXRpb25zIG9mIEdFVCwgSEVBRCBhbmQgUE9TVAorKGluY2x1ZGluZyBDR0kgc2NyaXB0cykuICBJdCBkb2VzLCBob3dldmVyLCBvcHRpb25hbGx5IGltcGxlbWVudCBIVFRQLzEuMQorcGVyc2lzdGVudCBjb25uZWN0aW9ucywgYXMgb2YgdmVyc2lvbiAwLjMuCisKK0NvbnRlbnRzOgorCistIEJhc2VIVFRQUmVxdWVzdEhhbmRsZXI6IEhUVFAgcmVxdWVzdCBoYW5kbGVyIGJhc2UgY2xhc3MKKy0gdGVzdDogdGVzdCBmdW5jdGlvbgorCitYWFggVG8gZG86CisKKy0gbG9nIHJlcXVlc3RzIGV2ZW4gbGF0ZXIgKHRvIGNhcHR1cmUgYnl0ZSBjb3VudCkKKy0gbG9nIHVzZXItYWdlbnQgaGVhZGVyIGFuZCBvdGhlciBpbnRlcmVzdGluZyBnb29kaWVzCistIHNlbmQgZXJyb3IgbG9nIHRvIHNlcGFyYXRlIGZpbGUKKyIiIgorCisKKyMgU2VlIGFsc286CisjCisjIEhUVFAgV29ya2luZyBHcm91cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULiBCZXJuZXJzLUxlZQorIyBJTlRFUk5FVC1EUkFGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi4gVC4gRmllbGRpbmcKKyMgPGRyYWZ0LWlldGYtaHR0cC12MTAtc3BlYy0wMC50eHQ+ICAgICAgICAgICAgICAgICAgICAgSC4gRnJ5c3R5ayBOaWVsc2VuCisjIEV4cGlyZXMgU2VwdGVtYmVyIDgsIDE5OTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyY2ggOCwgMTk5NQorIworIyBVUkw6IGh0dHA6Ly93d3cuaWNzLnVjaS5lZHUvcHViL2lldGYvaHR0cC9kcmFmdC1pZXRmLWh0dHAtdjEwLXNwZWMtMDAudHh0CisjCisjIGFuZAorIworIyBOZXR3b3JrIFdvcmtpbmcgR3JvdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuIEZpZWxkaW5nCisjIFJlcXVlc3QgZm9yIENvbW1lbnRzOiAyNjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXQgYWwKKyMgT2Jzb2xldGVzOiAyMDY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1bmUgMTk5OQorIyBDYXRlZ29yeTogU3RhbmRhcmRzIFRyYWNrCisjCisjIFVSTDogaHR0cDovL3d3dy5mYXFzLm9yZy9yZmNzL3JmYzI2MTYuaHRtbAorCisjIExvZyBmaWxlcworIyAtLS0tLS0tLS0KKyMKKyMgSGVyZSdzIGEgcXVvdGUgZnJvbSB0aGUgTkNTQSBodHRwZCBkb2NzIGFib3V0IGxvZyBmaWxlIGZvcm1hdC4KKyMKKyMgfCBUaGUgbG9nZmlsZSBmb3JtYXQgaXMgYXMgZm9sbG93cy4gRWFjaCBsaW5lIGNvbnNpc3RzIG9mOgorIyB8CisjIHwgaG9zdCByZmM5MzEgYXV0aHVzZXIgW0REL01vbi9ZWVlZOmhoOm1tOnNzXSAicmVxdWVzdCIgZGRkIGJiYmIKKyMgfAorIyB8ICAgICAgICBob3N0OiBFaXRoZXIgdGhlIEROUyBuYW1lIG9yIHRoZSBJUCBudW1iZXIgb2YgdGhlIHJlbW90ZSBjbGllbnQKKyMgfCAgICAgICAgcmZjOTMxOiBBbnkgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgaWRlbnRkIGZvciB0aGlzIHBlcnNvbiwKKyMgfCAgICAgICAgICAgICAgICAtIG90aGVyd2lzZS4KKyMgfCAgICAgICAgYXV0aHVzZXI6IElmIHVzZXIgc2VudCBhIHVzZXJpZCBmb3IgYXV0aGVudGljYXRpb24sIHRoZSB1c2VyIG5hbWUsCisjIHwgICAgICAgICAgICAgICAgICAtIG90aGVyd2lzZS4KKyMgfCAgICAgICAgREQ6IERheQorIyB8ICAgICAgICBNb246IE1vbnRoIChjYWxlbmRhciBuYW1lKQorIyB8ICAgICAgICBZWVlZOiBZZWFyCisjIHwgICAgICAgIGhoOiBob3VyICgyNC1ob3VyIGZvcm1hdCwgdGhlIG1hY2hpbmUncyB0aW1lem9uZSkKKyMgfCAgICAgICAgbW06IG1pbnV0ZXMKKyMgfCAgICAgICAgc3M6IHNlY29uZHMKKyMgfCAgICAgICAgcmVxdWVzdDogVGhlIGZpcnN0IGxpbmUgb2YgdGhlIEhUVFAgcmVxdWVzdCBhcyBzZW50IGJ5IHRoZSBjbGllbnQuCisjIHwgICAgICAgIGRkZDogdGhlIHN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIsIC0gaWYgbm90IGF2YWlsYWJsZS4KKyMgfCAgICAgICAgYmJiYjogdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBzZW50LAorIyB8ICAgICAgICAgICAgICAqbm90IGluY2x1ZGluZyB0aGUgSFRUUC8xLjAgaGVhZGVyKiwgLSBpZiBub3QgYXZhaWxhYmxlCisjIHwKKyMgfCBZb3UgY2FuIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSBhY2Nlc3NlZCB0aHJvdWdoIHJlcXVlc3QuCisjCisjIChBY3R1YWxseSwgdGhlIGxhdHRlciBpcyBvbmx5IHRydWUgaWYgeW91IGtub3cgdGhlIHNlcnZlciBjb25maWd1cmF0aW9uCisjIGF0IHRoZSB0aW1lIHRoZSByZXF1ZXN0IHdhcyBtYWRlISkKKworX192ZXJzaW9uX18gPSAiMC4zIgorCitfX2FsbF9fID0gWyJIVFRQU2VydmVyIiwgIkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIiXQorCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHNvY2tldCAjIEZvciBnZXRob3N0YnlhZGRyKCkKK2Zyb20gd2FybmluZ3MgaW1wb3J0IGZpbHRlcndhcm5pbmdzLCBjYXRjaF93YXJuaW5ncword2l0aCBjYXRjaF93YXJuaW5ncygpOgorICAgIGlmIHN5cy5weTNrd2FybmluZzoKKyAgICAgICAgZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuKm1pbWV0b29scyBoYXMgYmVlbiByZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKyAgICBpbXBvcnQgbWltZXRvb2xzCitpbXBvcnQgU29ja2V0U2VydmVyCisKKyMgRGVmYXVsdCBlcnJvciBtZXNzYWdlIHRlbXBsYXRlCitERUZBVUxUX0VSUk9SX01FU1NBR0UgPSAiIiJcCis8aGVhZD4KKzx0aXRsZT5FcnJvciByZXNwb25zZTwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxoMT5FcnJvciByZXNwb25zZTwvaDE+Cis8cD5FcnJvciBjb2RlICUoY29kZSlkLgorPHA+TWVzc2FnZTogJShtZXNzYWdlKXMuCis8cD5FcnJvciBjb2RlIGV4cGxhbmF0aW9uOiAlKGNvZGUpcyA9ICUoZXhwbGFpbilzLgorPC9ib2R5PgorIiIiCisKK0RFRkFVTFRfRVJST1JfQ09OVEVOVF9UWVBFID0gInRleHQvaHRtbCIKKworZGVmIF9xdW90ZV9odG1sKGh0bWwpOgorICAgIHJldHVybiBodG1sLnJlcGxhY2UoIiYiLCAiJmFtcDsiKS5yZXBsYWNlKCI8IiwgIiZsdDsiKS5yZXBsYWNlKCI+IiwgIiZndDsiKQorCitjbGFzcyBIVFRQU2VydmVyKFNvY2tldFNlcnZlci5UQ1BTZXJ2ZXIpOgorCisgICAgYWxsb3dfcmV1c2VfYWRkcmVzcyA9IDEgICAgIyBTZWVtcyB0byBtYWtlIHNlbnNlIGluIHRlc3RpbmcgZW52aXJvbm1lbnQKKworICAgIGRlZiBzZXJ2ZXJfYmluZChzZWxmKToKKyAgICAgICAgIiIiT3ZlcnJpZGUgc2VydmVyX2JpbmQgdG8gc3RvcmUgdGhlIHNlcnZlciBuYW1lLiIiIgorICAgICAgICBTb2NrZXRTZXJ2ZXIuVENQU2VydmVyLnNlcnZlcl9iaW5kKHNlbGYpCisgICAgICAgIGhvc3QsIHBvcnQgPSBzZWxmLnNvY2tldC5nZXRzb2NrbmFtZSgpWzoyXQorICAgICAgICBzZWxmLnNlcnZlcl9uYW1lID0gc29ja2V0LmdldGZxZG4oaG9zdCkKKyAgICAgICAgc2VsZi5zZXJ2ZXJfcG9ydCA9IHBvcnQKKworCitjbGFzcyBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyKFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlcik6CisKKyAgICAiIiJIVFRQIHJlcXVlc3QgaGFuZGxlciBiYXNlIGNsYXNzLgorCisgICAgVGhlIGZvbGxvd2luZyBleHBsYW5hdGlvbiBvZiBIVFRQIHNlcnZlcyB0byBndWlkZSB5b3UgdGhyb3VnaCB0aGUKKyAgICBjb2RlIGFzIHdlbGwgYXMgdG8gZXhwb3NlIGFueSBtaXN1bmRlcnN0YW5kaW5ncyBJIG1heSBoYXZlIGFib3V0CisgICAgSFRUUCAoc28geW91IGRvbid0IG5lZWQgdG8gcmVhZCB0aGUgY29kZSB0byBmaWd1cmUgb3V0IEknbSB3cm9uZworICAgIDotKS4KKworICAgIEhUVFAgKEh5cGVyVGV4dCBUcmFuc2ZlciBQcm90b2NvbCkgaXMgYW4gZXh0ZW5zaWJsZSBwcm90b2NvbCBvbgorICAgIHRvcCBvZiBhIHJlbGlhYmxlIHN0cmVhbSB0cmFuc3BvcnQgKGUuZy4gVENQL0lQKS4gIFRoZSBwcm90b2NvbAorICAgIHJlY29nbml6ZXMgdGhyZWUgcGFydHMgdG8gYSByZXF1ZXN0OgorCisgICAgMS4gT25lIGxpbmUgaWRlbnRpZnlpbmcgdGhlIHJlcXVlc3QgdHlwZSBhbmQgcGF0aAorICAgIDIuIEFuIG9wdGlvbmFsIHNldCBvZiBSRkMtODIyLXN0eWxlIGhlYWRlcnMKKyAgICAzLiBBbiBvcHRpb25hbCBkYXRhIHBhcnQKKworICAgIFRoZSBoZWFkZXJzIGFuZCBkYXRhIGFyZSBzZXBhcmF0ZWQgYnkgYSBibGFuayBsaW5lLgorCisgICAgVGhlIGZpcnN0IGxpbmUgb2YgdGhlIHJlcXVlc3QgaGFzIHRoZSBmb3JtCisKKyAgICA8Y29tbWFuZD4gPHBhdGg+IDx2ZXJzaW9uPgorCisgICAgd2hlcmUgPGNvbW1hbmQ+IGlzIGEgKGNhc2Utc2Vuc2l0aXZlKSBrZXl3b3JkIHN1Y2ggYXMgR0VUIG9yIFBPU1QsCisgICAgPHBhdGg+IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgcGF0aCBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlcXVlc3QsCisgICAgYW5kIDx2ZXJzaW9uPiBzaG91bGQgYmUgdGhlIHN0cmluZyAiSFRUUC8xLjAiIG9yICJIVFRQLzEuMSIuCisgICAgPHBhdGg+IGlzIGVuY29kZWQgdXNpbmcgdGhlIFVSTCBlbmNvZGluZyBzY2hlbWUgKHVzaW5nICV4eCB0byBzaWduaWZ5CisgICAgdGhlIEFTQ0lJIGNoYXJhY3RlciB3aXRoIGhleCBjb2RlIHh4KS4KKworICAgIFRoZSBzcGVjaWZpY2F0aW9uIHNwZWNpZmllcyB0aGF0IGxpbmVzIGFyZSBzZXBhcmF0ZWQgYnkgQ1JMRiBidXQKKyAgICBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB3aWRlc3QgcmFuZ2Ugb2YgY2xpZW50cyByZWNvbW1lbmRzCisgICAgc2VydmVycyBhbHNvIGhhbmRsZSBMRi4gIFNpbWlsYXJseSwgd2hpdGVzcGFjZSBpbiB0aGUgcmVxdWVzdCBsaW5lCisgICAgaXMgdHJlYXRlZCBzZW5zaWJseSAoYWxsb3dpbmcgbXVsdGlwbGUgc3BhY2VzIGJldHdlZW4gY29tcG9uZW50cworICAgIGFuZCBhbGxvd2luZyB0cmFpbGluZyB3aGl0ZXNwYWNlKS4KKworICAgIFNpbWlsYXJseSwgZm9yIG91dHB1dCwgbGluZXMgb3VnaHQgdG8gYmUgc2VwYXJhdGVkIGJ5IENSTEYgcGFpcnMKKyAgICBidXQgbW9zdCBjbGllbnRzIGdyb2sgTEYgY2hhcmFjdGVycyBqdXN0IGZpbmUuCisKKyAgICBJZiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgcmVxdWVzdCBoYXMgdGhlIGZvcm0KKworICAgIDxjb21tYW5kPiA8cGF0aD4KKworICAgIChpLmUuIDx2ZXJzaW9uPiBpcyBsZWZ0IG91dCkgdGhlbiB0aGlzIGlzIGFzc3VtZWQgdG8gYmUgYW4gSFRUUAorICAgIDAuOSByZXF1ZXN0OyB0aGlzIGZvcm0gaGFzIG5vIG9wdGlvbmFsIGhlYWRlcnMgYW5kIGRhdGEgcGFydCBhbmQKKyAgICB0aGUgcmVwbHkgY29uc2lzdHMgb2YganVzdCB0aGUgZGF0YS4KKworICAgIFRoZSByZXBseSBmb3JtIG9mIHRoZSBIVFRQIDEueCBwcm90b2NvbCBhZ2FpbiBoYXMgdGhyZWUgcGFydHM6CisKKyAgICAxLiBPbmUgbGluZSBnaXZpbmcgdGhlIHJlc3BvbnNlIGNvZGUKKyAgICAyLiBBbiBvcHRpb25hbCBzZXQgb2YgUkZDLTgyMi1zdHlsZSBoZWFkZXJzCisgICAgMy4gVGhlIGRhdGEKKworICAgIEFnYWluLCB0aGUgaGVhZGVycyBhbmQgZGF0YSBhcmUgc2VwYXJhdGVkIGJ5IGEgYmxhbmsgbGluZS4KKworICAgIFRoZSByZXNwb25zZSBjb2RlIGxpbmUgaGFzIHRoZSBmb3JtCisKKyAgICA8dmVyc2lvbj4gPHJlc3BvbnNlY29kZT4gPHJlc3BvbnNlc3RyaW5nPgorCisgICAgd2hlcmUgPHZlcnNpb24+IGlzIHRoZSBwcm90b2NvbCB2ZXJzaW9uICgiSFRUUC8xLjAiIG9yICJIVFRQLzEuMSIpLAorICAgIDxyZXNwb25zZWNvZGU+IGlzIGEgMy1kaWdpdCByZXNwb25zZSBjb2RlIGluZGljYXRpbmcgc3VjY2VzcyBvcgorICAgIGZhaWx1cmUgb2YgdGhlIHJlcXVlc3QsIGFuZCA8cmVzcG9uc2VzdHJpbmc+IGlzIGFuIG9wdGlvbmFsCisgICAgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGV4cGxhaW5pbmcgd2hhdCB0aGUgcmVzcG9uc2UgY29kZSBtZWFucy4KKworICAgIFRoaXMgc2VydmVyIHBhcnNlcyB0aGUgcmVxdWVzdCBhbmQgdGhlIGhlYWRlcnMsIGFuZCB0aGVuIGNhbGxzIGEKKyAgICBmdW5jdGlvbiBzcGVjaWZpYyB0byB0aGUgcmVxdWVzdCB0eXBlICg8Y29tbWFuZD4pLiAgU3BlY2lmaWNhbGx5LAorICAgIGEgcmVxdWVzdCBTUEFNIHdpbGwgYmUgaGFuZGxlZCBieSBhIG1ldGhvZCBkb19TUEFNKCkuICBJZiBubworICAgIHN1Y2ggbWV0aG9kIGV4aXN0cyB0aGUgc2VydmVyIHNlbmRzIGFuIGVycm9yIHJlc3BvbnNlIHRvIHRoZQorICAgIGNsaWVudC4gIElmIGl0IGV4aXN0cywgaXQgaXMgY2FsbGVkIHdpdGggbm8gYXJndW1lbnRzOgorCisgICAgZG9fU1BBTSgpCisKKyAgICBOb3RlIHRoYXQgdGhlIHJlcXVlc3QgbmFtZSBpcyBjYXNlIHNlbnNpdGl2ZSAoaS5lLiBTUEFNIGFuZCBzcGFtCisgICAgYXJlIGRpZmZlcmVudCByZXF1ZXN0cykuCisKKyAgICBUaGUgdmFyaW91cyByZXF1ZXN0IGRldGFpbHMgYXJlIHN0b3JlZCBpbiBpbnN0YW5jZSB2YXJpYWJsZXM6CisKKyAgICAtIGNsaWVudF9hZGRyZXNzIGlzIHRoZSBjbGllbnQgSVAgYWRkcmVzcyBpbiB0aGUgZm9ybSAoaG9zdCwKKyAgICBwb3J0KTsKKworICAgIC0gY29tbWFuZCwgcGF0aCBhbmQgdmVyc2lvbiBhcmUgdGhlIGJyb2tlbi1kb3duIHJlcXVlc3QgbGluZTsKKworICAgIC0gaGVhZGVycyBpcyBhbiBpbnN0YW5jZSBvZiBtaW1ldG9vbHMuTWVzc2FnZSAob3IgYSBkZXJpdmVkCisgICAgY2xhc3MpIGNvbnRhaW5pbmcgdGhlIGhlYWRlciBpbmZvcm1hdGlvbjsKKworICAgIC0gcmZpbGUgaXMgYSBmaWxlIG9iamVjdCBvcGVuIGZvciByZWFkaW5nIHBvc2l0aW9uZWQgYXQgdGhlCisgICAgc3RhcnQgb2YgdGhlIG9wdGlvbmFsIGlucHV0IGRhdGEgcGFydDsKKworICAgIC0gd2ZpbGUgaXMgYSBmaWxlIG9iamVjdCBvcGVuIGZvciB3cml0aW5nLgorCisgICAgSVQgSVMgSU1QT1JUQU5UIFRPIEFESEVSRSBUTyBUSEUgUFJPVE9DT0wgRk9SIFdSSVRJTkchCisKKyAgICBUaGUgZmlyc3QgdGhpbmcgdG8gYmUgd3JpdHRlbiBtdXN0IGJlIHRoZSByZXNwb25zZSBsaW5lLiAgVGhlbgorICAgIGZvbGxvdyAwIG9yIG1vcmUgaGVhZGVyIGxpbmVzLCB0aGVuIGEgYmxhbmsgbGluZSwgYW5kIHRoZW4gdGhlCisgICAgYWN0dWFsIGRhdGEgKGlmIGFueSkuICBUaGUgbWVhbmluZyBvZiB0aGUgaGVhZGVyIGxpbmVzIGRlcGVuZHMgb24KKyAgICB0aGUgY29tbWFuZCBleGVjdXRlZCBieSB0aGUgc2VydmVyOyBpbiBtb3N0IGNhc2VzLCB3aGVuIGRhdGEgaXMKKyAgICByZXR1cm5lZCwgdGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBoZWFkZXIgbGluZSBvZiB0aGUgZm9ybQorCisgICAgQ29udGVudC10eXBlOiA8dHlwZT4vPHN1YnR5cGU+CisKKyAgICB3aGVyZSA8dHlwZT4gYW5kIDxzdWJ0eXBlPiBzaG91bGQgYmUgcmVnaXN0ZXJlZCBNSU1FIHR5cGVzLAorICAgIGUuZy4gInRleHQvaHRtbCIgb3IgInRleHQvcGxhaW4iLgorCisgICAgIiIiCisKKyAgICAjIFRoZSBQeXRob24gc3lzdGVtIHZlcnNpb24sIHRydW5jYXRlZCB0byBpdHMgZmlyc3QgY29tcG9uZW50LgorICAgIHN5c192ZXJzaW9uID0gIlB5dGhvbi8iICsgc3lzLnZlcnNpb24uc3BsaXQoKVswXQorCisgICAgIyBUaGUgc2VydmVyIHNvZnR3YXJlIHZlcnNpb24uICBZb3UgbWF5IHdhbnQgdG8gb3ZlcnJpZGUgdGhpcy4KKyAgICAjIFRoZSBmb3JtYXQgaXMgbXVsdGlwbGUgd2hpdGVzcGFjZS1zZXBhcmF0ZWQgc3RyaW5ncywKKyAgICAjIHdoZXJlIGVhY2ggc3RyaW5nIGlzIG9mIHRoZSBmb3JtIG5hbWVbL3ZlcnNpb25dLgorICAgIHNlcnZlcl92ZXJzaW9uID0gIkJhc2VIVFRQLyIgKyBfX3ZlcnNpb25fXworCisgICAgIyBUaGUgZGVmYXVsdCByZXF1ZXN0IHZlcnNpb24uICBUaGlzIG9ubHkgYWZmZWN0cyByZXNwb25zZXMgdXAgdW50aWwKKyAgICAjIHRoZSBwb2ludCB3aGVyZSB0aGUgcmVxdWVzdCBsaW5lIGlzIHBhcnNlZCwgc28gaXQgbWFpbmx5IGRlY2lkZXMgd2hhdAorICAgICMgdGhlIGNsaWVudCBnZXRzIGJhY2sgd2hlbiBzZW5kaW5nIGEgbWFsZm9ybWVkIHJlcXVlc3QgbGluZS4KKyAgICAjIE1vc3Qgd2ViIHNlcnZlcnMgZGVmYXVsdCB0byBIVFRQIDAuOSwgaS5lLiBkb24ndCBzZW5kIGEgc3RhdHVzIGxpbmUuCisgICAgZGVmYXVsdF9yZXF1ZXN0X3ZlcnNpb24gPSAiSFRUUC8wLjkiCisKKyAgICBkZWYgcGFyc2VfcmVxdWVzdChzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgYSByZXF1ZXN0IChpbnRlcm5hbCkuCisKKyAgICAgICAgVGhlIHJlcXVlc3Qgc2hvdWxkIGJlIHN0b3JlZCBpbiBzZWxmLnJhd19yZXF1ZXN0bGluZTsgdGhlIHJlc3VsdHMKKyAgICAgICAgYXJlIGluIHNlbGYuY29tbWFuZCwgc2VsZi5wYXRoLCBzZWxmLnJlcXVlc3RfdmVyc2lvbiBhbmQKKyAgICAgICAgc2VsZi5oZWFkZXJzLgorCisgICAgICAgIFJldHVybiBUcnVlIGZvciBzdWNjZXNzLCBGYWxzZSBmb3IgZmFpbHVyZTsgb24gZmFpbHVyZSwgYW4KKyAgICAgICAgZXJyb3IgaXMgc2VudCBiYWNrLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNvbW1hbmQgPSBOb25lICAjIHNldCBpbiBjYXNlIG9mIGVycm9yIG9uIHRoZSBmaXJzdCBsaW5lCisgICAgICAgIHNlbGYucmVxdWVzdF92ZXJzaW9uID0gdmVyc2lvbiA9IHNlbGYuZGVmYXVsdF9yZXF1ZXN0X3ZlcnNpb24KKyAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gMQorICAgICAgICByZXF1ZXN0bGluZSA9IHNlbGYucmF3X3JlcXVlc3RsaW5lCisgICAgICAgIHJlcXVlc3RsaW5lID0gcmVxdWVzdGxpbmUucnN0cmlwKCdcclxuJykKKyAgICAgICAgc2VsZi5yZXF1ZXN0bGluZSA9IHJlcXVlc3RsaW5lCisgICAgICAgIHdvcmRzID0gcmVxdWVzdGxpbmUuc3BsaXQoKQorICAgICAgICBpZiBsZW4od29yZHMpID09IDM6CisgICAgICAgICAgICBjb21tYW5kLCBwYXRoLCB2ZXJzaW9uID0gd29yZHMKKyAgICAgICAgICAgIGlmIHZlcnNpb25bOjVdICE9ICdIVFRQLyc6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwMCwgIkJhZCByZXF1ZXN0IHZlcnNpb24gKCVyKSIgJSB2ZXJzaW9uKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJhc2VfdmVyc2lvbl9udW1iZXIgPSB2ZXJzaW9uLnNwbGl0KCcvJywgMSlbMV0KKyAgICAgICAgICAgICAgICB2ZXJzaW9uX251bWJlciA9IGJhc2VfdmVyc2lvbl9udW1iZXIuc3BsaXQoIi4iKQorICAgICAgICAgICAgICAgICMgUkZDIDIxNDUgc2VjdGlvbiAzLjEgc2F5cyB0aGVyZSBjYW4gYmUgb25seSBvbmUgIi4iIGFuZAorICAgICAgICAgICAgICAgICMgICAtIG1ham9yIGFuZCBtaW5vciBudW1iZXJzIE1VU1QgYmUgdHJlYXRlZCBhcworICAgICAgICAgICAgICAgICMgICAgICBzZXBhcmF0ZSBpbnRlZ2VyczsKKyAgICAgICAgICAgICAgICAjICAgLSBIVFRQLzIuNCBpcyBhIGxvd2VyIHZlcnNpb24gdGhhbiBIVFRQLzIuMTMsIHdoaWNoIGluCisgICAgICAgICAgICAgICAgIyAgICAgIHR1cm4gaXMgbG93ZXIgdGhhbiBIVFRQLzEyLjM7CisgICAgICAgICAgICAgICAgIyAgIC0gTGVhZGluZyB6ZXJvcyBNVVNUIGJlIGlnbm9yZWQgYnkgcmVjaXBpZW50cy4KKyAgICAgICAgICAgICAgICBpZiBsZW4odmVyc2lvbl9udW1iZXIpICE9IDI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgICAgICB2ZXJzaW9uX251bWJlciA9IGludCh2ZXJzaW9uX251bWJlclswXSksIGludCh2ZXJzaW9uX251bWJlclsxXSkKKyAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgSW5kZXhFcnJvcik6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwMCwgIkJhZCByZXF1ZXN0IHZlcnNpb24gKCVyKSIgJSB2ZXJzaW9uKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgdmVyc2lvbl9udW1iZXIgPj0gKDEsIDEpIGFuZCBzZWxmLnByb3RvY29sX3ZlcnNpb24gPj0gIkhUVFAvMS4xIjoKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlX2Nvbm5lY3Rpb24gPSAwCisgICAgICAgICAgICBpZiB2ZXJzaW9uX251bWJlciA+PSAoMiwgMCk6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDUwNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgSFRUUCBWZXJzaW9uICglcykiICUgYmFzZV92ZXJzaW9uX251bWJlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxpZiBsZW4od29yZHMpID09IDI6CisgICAgICAgICAgICBjb21tYW5kLCBwYXRoID0gd29yZHMKKyAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IDEKKyAgICAgICAgICAgIGlmIGNvbW1hbmQgIT0gJ0dFVCc6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhZCBIVFRQLzAuOSByZXF1ZXN0IHR5cGUgKCVyKSIgJSBjb21tYW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbGlmIG5vdCB3b3JkczoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwMCwgIkJhZCByZXF1ZXN0IHN5bnRheCAoJXIpIiAlIHJlcXVlc3RsaW5lKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHNlbGYuY29tbWFuZCwgc2VsZi5wYXRoLCBzZWxmLnJlcXVlc3RfdmVyc2lvbiA9IGNvbW1hbmQsIHBhdGgsIHZlcnNpb24KKworICAgICAgICAjIEV4YW1pbmUgdGhlIGhlYWRlcnMgYW5kIGxvb2sgZm9yIGEgQ29ubmVjdGlvbiBkaXJlY3RpdmUKKyAgICAgICAgc2VsZi5oZWFkZXJzID0gc2VsZi5NZXNzYWdlQ2xhc3Moc2VsZi5yZmlsZSwgMCkKKworICAgICAgICBjb25udHlwZSA9IHNlbGYuaGVhZGVycy5nZXQoJ0Nvbm5lY3Rpb24nLCAiIikKKyAgICAgICAgaWYgY29ubnR5cGUubG93ZXIoKSA9PSAnY2xvc2UnOgorICAgICAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gMQorICAgICAgICBlbGlmIChjb25udHlwZS5sb3dlcigpID09ICdrZWVwLWFsaXZlJyBhbmQKKyAgICAgICAgICAgICAgc2VsZi5wcm90b2NvbF92ZXJzaW9uID49ICJIVFRQLzEuMSIpOgorICAgICAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gMAorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGhhbmRsZV9vbmVfcmVxdWVzdChzZWxmKToKKyAgICAgICAgIiIiSGFuZGxlIGEgc2luZ2xlIEhUVFAgcmVxdWVzdC4KKworICAgICAgICBZb3Ugbm9ybWFsbHkgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZDsgc2VlIHRoZSBjbGFzcworICAgICAgICBfX2RvY19fIHN0cmluZyBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGhhbmRsZSBzcGVjaWZpYyBIVFRQCisgICAgICAgIGNvbW1hbmRzIHN1Y2ggYXMgR0VUIGFuZCBQT1NULgorCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnJhd19yZXF1ZXN0bGluZSA9IHNlbGYucmZpbGUucmVhZGxpbmUoNjU1MzcpCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5yYXdfcmVxdWVzdGxpbmUpID4gNjU1MzY6CisgICAgICAgICAgICAgICAgc2VsZi5yZXF1ZXN0bGluZSA9ICcnCisgICAgICAgICAgICAgICAgc2VsZi5yZXF1ZXN0X3ZlcnNpb24gPSAnJworICAgICAgICAgICAgICAgIHNlbGYuY29tbWFuZCA9ICcnCisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQxNCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJhd19yZXF1ZXN0bGluZToKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlX2Nvbm5lY3Rpb24gPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5wYXJzZV9yZXF1ZXN0KCk6CisgICAgICAgICAgICAgICAgIyBBbiBlcnJvciBjb2RlIGhhcyBiZWVuIHNlbnQsIGp1c3QgZXhpdAorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgbW5hbWUgPSAnZG9fJyArIHNlbGYuY29tbWFuZAorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgbW5hbWUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcig1MDEsICJVbnN1cHBvcnRlZCBtZXRob2QgKCVyKSIgJSBzZWxmLmNvbW1hbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsIG1uYW1lKQorICAgICAgICAgICAgbWV0aG9kKCkKKyAgICAgICAgICAgIHNlbGYud2ZpbGUuZmx1c2goKSAjYWN0dWFsbHkgc2VuZCB0aGUgcmVzcG9uc2UgaWYgbm90IGFscmVhZHkgZG9uZS4KKyAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0LCBlOgorICAgICAgICAgICAgI2EgcmVhZCBvciBhIHdyaXRlIHRpbWVkIG91dC4gIERpc2NhcmQgdGhpcyBjb25uZWN0aW9uCisgICAgICAgICAgICBzZWxmLmxvZ19lcnJvcigiUmVxdWVzdCB0aW1lZCBvdXQ6ICVyIiwgZSkKKyAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IDEKKyAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgIiIiSGFuZGxlIG11bHRpcGxlIHJlcXVlc3RzIGlmIG5lY2Vzc2FyeS4iIiIKKyAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gMQorCisgICAgICAgIHNlbGYuaGFuZGxlX29uZV9yZXF1ZXN0KCkKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuY2xvc2VfY29ubmVjdGlvbjoKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX29uZV9yZXF1ZXN0KCkKKworICAgIGRlZiBzZW5kX2Vycm9yKHNlbGYsIGNvZGUsIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgICIiIlNlbmQgYW5kIGxvZyBhbiBlcnJvciByZXBseS4KKworICAgICAgICBBcmd1bWVudHMgYXJlIHRoZSBlcnJvciBjb2RlLCBhbmQgYSBkZXRhaWxlZCBtZXNzYWdlLgorICAgICAgICBUaGUgZGV0YWlsZWQgbWVzc2FnZSBkZWZhdWx0cyB0byB0aGUgc2hvcnQgZW50cnkgbWF0Y2hpbmcgdGhlCisgICAgICAgIHJlc3BvbnNlIGNvZGUuCisKKyAgICAgICAgVGhpcyBzZW5kcyBhbiBlcnJvciByZXNwb25zZSAoc28gaXQgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueQorICAgICAgICBvdXRwdXQgaGFzIGJlZW4gZ2VuZXJhdGVkKSwgbG9ncyB0aGUgZXJyb3IsIGFuZCBmaW5hbGx5IHNlbmRzCisgICAgICAgIGEgcGllY2Ugb2YgSFRNTCBleHBsYWluaW5nIHRoZSBlcnJvciB0byB0aGUgdXNlci4KKworICAgICAgICAiIiIKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzaG9ydCwgbG9uZyA9IHNlbGYucmVzcG9uc2VzW2NvZGVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHNob3J0LCBsb25nID0gJz8/PycsICc/Pz8nCisgICAgICAgIGlmIG1lc3NhZ2UgaXMgTm9uZToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBzaG9ydAorICAgICAgICBleHBsYWluID0gbG9uZworICAgICAgICBzZWxmLmxvZ19lcnJvcigiY29kZSAlZCwgbWVzc2FnZSAlcyIsIGNvZGUsIG1lc3NhZ2UpCisgICAgICAgICMgdXNpbmcgX3F1b3RlX2h0bWwgdG8gcHJldmVudCBDcm9zcyBTaXRlIFNjcmlwdGluZyBhdHRhY2tzIChzZWUgYnVnICMxMTAwMjAxKQorICAgICAgICBjb250ZW50ID0gKHNlbGYuZXJyb3JfbWVzc2FnZV9mb3JtYXQgJQorICAgICAgICAgICAgICAgICAgIHsnY29kZSc6IGNvZGUsICdtZXNzYWdlJzogX3F1b3RlX2h0bWwobWVzc2FnZSksICdleHBsYWluJzogZXhwbGFpbn0pCisgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZShjb2RlLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LVR5cGUiLCBzZWxmLmVycm9yX2NvbnRlbnRfdHlwZSkKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignQ29ubmVjdGlvbicsICdjbG9zZScpCisgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICBpZiBzZWxmLmNvbW1hbmQgIT0gJ0hFQUQnIGFuZCBjb2RlID49IDIwMCBhbmQgY29kZSBub3QgaW4gKDIwNCwgMzA0KToKKyAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoY29udGVudCkKKworICAgIGVycm9yX21lc3NhZ2VfZm9ybWF0ID0gREVGQVVMVF9FUlJPUl9NRVNTQUdFCisgICAgZXJyb3JfY29udGVudF90eXBlID0gREVGQVVMVF9FUlJPUl9DT05URU5UX1RZUEUKKworICAgIGRlZiBzZW5kX3Jlc3BvbnNlKHNlbGYsIGNvZGUsIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgICIiIlNlbmQgdGhlIHJlc3BvbnNlIGhlYWRlciBhbmQgbG9nIHRoZSByZXNwb25zZSBjb2RlLgorCisgICAgICAgIEFsc28gc2VuZCB0d28gc3RhbmRhcmQgaGVhZGVycyB3aXRoIHRoZSBzZXJ2ZXIgc29mdHdhcmUKKyAgICAgICAgdmVyc2lvbiBhbmQgdGhlIGN1cnJlbnQgZGF0ZS4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5sb2dfcmVxdWVzdChjb2RlKQorICAgICAgICBpZiBtZXNzYWdlIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBjb2RlIGluIHNlbGYucmVzcG9uc2VzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBzZWxmLnJlc3BvbnNlc1tjb2RlXVswXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gJycKKyAgICAgICAgaWYgc2VsZi5yZXF1ZXN0X3ZlcnNpb24gIT0gJ0hUVFAvMC45JzoKKyAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoIiVzICVkICVzXHJcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5wcm90b2NvbF92ZXJzaW9uLCBjb2RlLCBtZXNzYWdlKSkKKyAgICAgICAgICAgICMgcHJpbnQgKHNlbGYucHJvdG9jb2xfdmVyc2lvbiwgY29kZSwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignU2VydmVyJywgc2VsZi52ZXJzaW9uX3N0cmluZygpKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdEYXRlJywgc2VsZi5kYXRlX3RpbWVfc3RyaW5nKCkpCisKKyAgICBkZWYgc2VuZF9oZWFkZXIoc2VsZiwga2V5d29yZCwgdmFsdWUpOgorICAgICAgICAiIiJTZW5kIGEgTUlNRSBoZWFkZXIuIiIiCisgICAgICAgIGlmIHNlbGYucmVxdWVzdF92ZXJzaW9uICE9ICdIVFRQLzAuOSc6CisgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKCIlczogJXNcclxuIiAlIChrZXl3b3JkLCB2YWx1ZSkpCisKKyAgICAgICAgaWYga2V5d29yZC5sb3dlcigpID09ICdjb25uZWN0aW9uJzoKKyAgICAgICAgICAgIGlmIHZhbHVlLmxvd2VyKCkgPT0gJ2Nsb3NlJzoKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlX2Nvbm5lY3Rpb24gPSAxCisgICAgICAgICAgICBlbGlmIHZhbHVlLmxvd2VyKCkgPT0gJ2tlZXAtYWxpdmUnOgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IDAKKworICAgIGRlZiBlbmRfaGVhZGVycyhzZWxmKToKKyAgICAgICAgIiIiU2VuZCB0aGUgYmxhbmsgbGluZSBlbmRpbmcgdGhlIE1JTUUgaGVhZGVycy4iIiIKKyAgICAgICAgaWYgc2VsZi5yZXF1ZXN0X3ZlcnNpb24gIT0gJ0hUVFAvMC45JzoKKyAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoIlxyXG4iKQorCisgICAgZGVmIGxvZ19yZXF1ZXN0KHNlbGYsIGNvZGU9Jy0nLCBzaXplPSctJyk6CisgICAgICAgICIiIkxvZyBhbiBhY2NlcHRlZCByZXF1ZXN0LgorCisgICAgICAgIFRoaXMgaXMgY2FsbGVkIGJ5IHNlbmRfcmVzcG9uc2UoKS4KKworICAgICAgICAiIiIKKworICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCciJXMiICVzICVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcXVlc3RsaW5lLCBzdHIoY29kZSksIHN0cihzaXplKSkKKworICAgIGRlZiBsb2dfZXJyb3Ioc2VsZiwgZm9ybWF0LCAqYXJncyk6CisgICAgICAgICIiIkxvZyBhbiBlcnJvci4KKworICAgICAgICBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgcmVxdWVzdCBjYW5ub3QgYmUgZnVsZmlsbGVkLiAgQnkKKyAgICAgICAgZGVmYXVsdCBpdCBwYXNzZXMgdGhlIG1lc3NhZ2Ugb24gdG8gbG9nX21lc3NhZ2UoKS4KKworICAgICAgICBBcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciBsb2dfbWVzc2FnZSgpLgorCisgICAgICAgIFhYWCBUaGlzIHNob3VsZCBnbyB0byB0aGUgc2VwYXJhdGUgZXJyb3IgbG9nLgorCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoZm9ybWF0LCAqYXJncykKKworICAgIGRlZiBsb2dfbWVzc2FnZShzZWxmLCBmb3JtYXQsICphcmdzKToKKyAgICAgICAgIiIiTG9nIGFuIGFyYml0cmFyeSBtZXNzYWdlLgorCisgICAgICAgIFRoaXMgaXMgdXNlZCBieSBhbGwgb3RoZXIgbG9nZ2luZyBmdW5jdGlvbnMuICBPdmVycmlkZQorICAgICAgICBpdCBpZiB5b3UgaGF2ZSBzcGVjaWZpYyBsb2dnaW5nIHdpc2hlcy4KKworICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQsIEZPUk1BVCwgaXMgYSBmb3JtYXQgc3RyaW5nIGZvciB0aGUKKyAgICAgICAgbWVzc2FnZSB0byBiZSBsb2dnZWQuICBJZiB0aGUgZm9ybWF0IHN0cmluZyBjb250YWlucworICAgICAgICBhbnkgJSBlc2NhcGVzIHJlcXVpcmluZyBwYXJhbWV0ZXJzLCB0aGV5IHNob3VsZCBiZQorICAgICAgICBzcGVjaWZpZWQgYXMgc3Vic2VxdWVudCBhcmd1bWVudHMgKGl0J3MganVzdCBsaWtlCisgICAgICAgIHByaW50ZiEpLgorCisgICAgICAgIFRoZSBjbGllbnQgaXAgYWRkcmVzcyBhbmQgY3VycmVudCBkYXRlL3RpbWUgYXJlIHByZWZpeGVkIHRvIGV2ZXJ5CisgICAgICAgIG1lc3NhZ2UuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiJXMgLSAtIFslc10gJXNcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmNsaWVudF9hZGRyZXNzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ19kYXRlX3RpbWVfc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCVhcmdzKSkKKworICAgIGRlZiB2ZXJzaW9uX3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzZXJ2ZXIgc29mdHdhcmUgdmVyc2lvbiBzdHJpbmcuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNlcnZlcl92ZXJzaW9uICsgJyAnICsgc2VsZi5zeXNfdmVyc2lvbgorCisgICAgZGVmIGRhdGVfdGltZV9zdHJpbmcoc2VsZiwgdGltZXN0YW1wPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBmb3JtYXR0ZWQgZm9yIGEgbWVzc2FnZSBoZWFkZXIuIiIiCisgICAgICAgIGlmIHRpbWVzdGFtcCBpcyBOb25lOgorICAgICAgICAgICAgdGltZXN0YW1wID0gdGltZS50aW1lKCkKKyAgICAgICAgeWVhciwgbW9udGgsIGRheSwgaGgsIG1tLCBzcywgd2QsIHksIHogPSB0aW1lLmdtdGltZSh0aW1lc3RhbXApCisgICAgICAgIHMgPSAiJXMsICUwMmQgJTNzICU0ZCAlMDJkOiUwMmQ6JTAyZCBHTVQiICUgKAorICAgICAgICAgICAgICAgIHNlbGYud2Vla2RheW5hbWVbd2RdLAorICAgICAgICAgICAgICAgIGRheSwgc2VsZi5tb250aG5hbWVbbW9udGhdLCB5ZWFyLAorICAgICAgICAgICAgICAgIGhoLCBtbSwgc3MpCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgbG9nX2RhdGVfdGltZV9zdHJpbmcoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCB0aW1lIGZvcm1hdHRlZCBmb3IgbG9nZ2luZy4iIiIKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgeWVhciwgbW9udGgsIGRheSwgaGgsIG1tLCBzcywgeCwgeSwgeiA9IHRpbWUubG9jYWx0aW1lKG5vdykKKyAgICAgICAgcyA9ICIlMDJkLyUzcy8lMDRkICUwMmQ6JTAyZDolMDJkIiAlICgKKyAgICAgICAgICAgICAgICBkYXksIHNlbGYubW9udGhuYW1lW21vbnRoXSwgeWVhciwgaGgsIG1tLCBzcykKKyAgICAgICAgcmV0dXJuIHMKKworICAgIHdlZWtkYXluYW1lID0gWydNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCcsICdTdW4nXQorCisgICAgbW9udGhuYW1lID0gW05vbmUsCisgICAgICAgICAgICAgICAgICdKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsCisgICAgICAgICAgICAgICAgICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddCisKKyAgICBkZWYgYWRkcmVzc19zdHJpbmcoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgY2xpZW50IGFkZHJlc3MgZm9ybWF0dGVkIGZvciBsb2dnaW5nLgorCisgICAgICAgIFRoaXMgdmVyc2lvbiBsb29rcyB1cCB0aGUgZnVsbCBob3N0bmFtZSB1c2luZyBnZXRob3N0YnlhZGRyKCksCisgICAgICAgIGFuZCB0cmllcyB0byBmaW5kIGEgbmFtZSB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBkb3QuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgaG9zdCwgcG9ydCA9IHNlbGYuY2xpZW50X2FkZHJlc3NbOjJdCisgICAgICAgIHJldHVybiBzb2NrZXQuZ2V0ZnFkbihob3N0KQorCisgICAgIyBFc3NlbnRpYWxseSBzdGF0aWMgY2xhc3MgdmFyaWFibGVzCisKKyAgICAjIFRoZSB2ZXJzaW9uIG9mIHRoZSBIVFRQIHByb3RvY29sIHdlIHN1cHBvcnQuCisgICAgIyBTZXQgdGhpcyB0byBIVFRQLzEuMSB0byBlbmFibGUgYXV0b21hdGljIGtlZXBhbGl2ZQorICAgIHByb3RvY29sX3ZlcnNpb24gPSAiSFRUUC8xLjAiCisKKyAgICAjIFRoZSBNZXNzYWdlLWxpa2UgY2xhc3MgdXNlZCB0byBwYXJzZSBoZWFkZXJzCisgICAgTWVzc2FnZUNsYXNzID0gbWltZXRvb2xzLk1lc3NhZ2UKKworICAgICMgVGFibGUgbWFwcGluZyByZXNwb25zZSBjb2RlcyB0byBtZXNzYWdlczsgZW50cmllcyBoYXZlIHRoZQorICAgICMgZm9ybSB7Y29kZTogKHNob3J0bWVzc2FnZSwgbG9uZ21lc3NhZ2UpfS4KKyAgICAjIFNlZSBSRkMgMjYxNi4KKyAgICByZXNwb25zZXMgPSB7CisgICAgICAgIDEwMDogKCdDb250aW51ZScsICdSZXF1ZXN0IHJlY2VpdmVkLCBwbGVhc2UgY29udGludWUnKSwKKyAgICAgICAgMTAxOiAoJ1N3aXRjaGluZyBQcm90b2NvbHMnLAorICAgICAgICAgICAgICAnU3dpdGNoaW5nIHRvIG5ldyBwcm90b2NvbDsgb2JleSBVcGdyYWRlIGhlYWRlcicpLAorCisgICAgICAgIDIwMDogKCdPSycsICdSZXF1ZXN0IGZ1bGZpbGxlZCwgZG9jdW1lbnQgZm9sbG93cycpLAorICAgICAgICAyMDE6ICgnQ3JlYXRlZCcsICdEb2N1bWVudCBjcmVhdGVkLCBVUkwgZm9sbG93cycpLAorICAgICAgICAyMDI6ICgnQWNjZXB0ZWQnLAorICAgICAgICAgICAgICAnUmVxdWVzdCBhY2NlcHRlZCwgcHJvY2Vzc2luZyBjb250aW51ZXMgb2ZmLWxpbmUnKSwKKyAgICAgICAgMjAzOiAoJ05vbi1BdXRob3JpdGF0aXZlIEluZm9ybWF0aW9uJywgJ1JlcXVlc3QgZnVsZmlsbGVkIGZyb20gY2FjaGUnKSwKKyAgICAgICAgMjA0OiAoJ05vIENvbnRlbnQnLCAnUmVxdWVzdCBmdWxmaWxsZWQsIG5vdGhpbmcgZm9sbG93cycpLAorICAgICAgICAyMDU6ICgnUmVzZXQgQ29udGVudCcsICdDbGVhciBpbnB1dCBmb3JtIGZvciBmdXJ0aGVyIGlucHV0LicpLAorICAgICAgICAyMDY6ICgnUGFydGlhbCBDb250ZW50JywgJ1BhcnRpYWwgY29udGVudCBmb2xsb3dzLicpLAorCisgICAgICAgIDMwMDogKCdNdWx0aXBsZSBDaG9pY2VzJywKKyAgICAgICAgICAgICAgJ09iamVjdCBoYXMgc2V2ZXJhbCByZXNvdXJjZXMgLS0gc2VlIFVSSSBsaXN0JyksCisgICAgICAgIDMwMTogKCdNb3ZlZCBQZXJtYW5lbnRseScsICdPYmplY3QgbW92ZWQgcGVybWFuZW50bHkgLS0gc2VlIFVSSSBsaXN0JyksCisgICAgICAgIDMwMjogKCdGb3VuZCcsICdPYmplY3QgbW92ZWQgdGVtcG9yYXJpbHkgLS0gc2VlIFVSSSBsaXN0JyksCisgICAgICAgIDMwMzogKCdTZWUgT3RoZXInLCAnT2JqZWN0IG1vdmVkIC0tIHNlZSBNZXRob2QgYW5kIFVSTCBsaXN0JyksCisgICAgICAgIDMwNDogKCdOb3QgTW9kaWZpZWQnLAorICAgICAgICAgICAgICAnRG9jdW1lbnQgaGFzIG5vdCBjaGFuZ2VkIHNpbmNlIGdpdmVuIHRpbWUnKSwKKyAgICAgICAgMzA1OiAoJ1VzZSBQcm94eScsCisgICAgICAgICAgICAgICdZb3UgbXVzdCB1c2UgcHJveHkgc3BlY2lmaWVkIGluIExvY2F0aW9uIHRvIGFjY2VzcyB0aGlzICcKKyAgICAgICAgICAgICAgJ3Jlc291cmNlLicpLAorICAgICAgICAzMDc6ICgnVGVtcG9yYXJ5IFJlZGlyZWN0JywKKyAgICAgICAgICAgICAgJ09iamVjdCBtb3ZlZCB0ZW1wb3JhcmlseSAtLSBzZWUgVVJJIGxpc3QnKSwKKworICAgICAgICA0MDA6ICgnQmFkIFJlcXVlc3QnLAorICAgICAgICAgICAgICAnQmFkIHJlcXVlc3Qgc3ludGF4IG9yIHVuc3VwcG9ydGVkIG1ldGhvZCcpLAorICAgICAgICA0MDE6ICgnVW5hdXRob3JpemVkJywKKyAgICAgICAgICAgICAgJ05vIHBlcm1pc3Npb24gLS0gc2VlIGF1dGhvcml6YXRpb24gc2NoZW1lcycpLAorICAgICAgICA0MDI6ICgnUGF5bWVudCBSZXF1aXJlZCcsCisgICAgICAgICAgICAgICdObyBwYXltZW50IC0tIHNlZSBjaGFyZ2luZyBzY2hlbWVzJyksCisgICAgICAgIDQwMzogKCdGb3JiaWRkZW4nLAorICAgICAgICAgICAgICAnUmVxdWVzdCBmb3JiaWRkZW4gLS0gYXV0aG9yaXphdGlvbiB3aWxsIG5vdCBoZWxwJyksCisgICAgICAgIDQwNDogKCdOb3QgRm91bmQnLCAnTm90aGluZyBtYXRjaGVzIHRoZSBnaXZlbiBVUkknKSwKKyAgICAgICAgNDA1OiAoJ01ldGhvZCBOb3QgQWxsb3dlZCcsCisgICAgICAgICAgICAgICdTcGVjaWZpZWQgbWV0aG9kIGlzIGludmFsaWQgZm9yIHRoaXMgcmVzb3VyY2UuJyksCisgICAgICAgIDQwNjogKCdOb3QgQWNjZXB0YWJsZScsICdVUkkgbm90IGF2YWlsYWJsZSBpbiBwcmVmZXJyZWQgZm9ybWF0LicpLAorICAgICAgICA0MDc6ICgnUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQnLCAnWW91IG11c3QgYXV0aGVudGljYXRlIHdpdGggJworICAgICAgICAgICAgICAndGhpcyBwcm94eSBiZWZvcmUgcHJvY2VlZGluZy4nKSwKKyAgICAgICAgNDA4OiAoJ1JlcXVlc3QgVGltZW91dCcsICdSZXF1ZXN0IHRpbWVkIG91dDsgdHJ5IGFnYWluIGxhdGVyLicpLAorICAgICAgICA0MDk6ICgnQ29uZmxpY3QnLCAnUmVxdWVzdCBjb25mbGljdC4nKSwKKyAgICAgICAgNDEwOiAoJ0dvbmUnLAorICAgICAgICAgICAgICAnVVJJIG5vIGxvbmdlciBleGlzdHMgYW5kIGhhcyBiZWVuIHBlcm1hbmVudGx5IHJlbW92ZWQuJyksCisgICAgICAgIDQxMTogKCdMZW5ndGggUmVxdWlyZWQnLCAnQ2xpZW50IG11c3Qgc3BlY2lmeSBDb250ZW50LUxlbmd0aC4nKSwKKyAgICAgICAgNDEyOiAoJ1ByZWNvbmRpdGlvbiBGYWlsZWQnLCAnUHJlY29uZGl0aW9uIGluIGhlYWRlcnMgaXMgZmFsc2UuJyksCisgICAgICAgIDQxMzogKCdSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2UnLCAnRW50aXR5IGlzIHRvbyBsYXJnZS4nKSwKKyAgICAgICAgNDE0OiAoJ1JlcXVlc3QtVVJJIFRvbyBMb25nJywgJ1VSSSBpcyB0b28gbG9uZy4nKSwKKyAgICAgICAgNDE1OiAoJ1Vuc3VwcG9ydGVkIE1lZGlhIFR5cGUnLCAnRW50aXR5IGJvZHkgaW4gdW5zdXBwb3J0ZWQgZm9ybWF0LicpLAorICAgICAgICA0MTY6ICgnUmVxdWVzdGVkIFJhbmdlIE5vdCBTYXRpc2ZpYWJsZScsCisgICAgICAgICAgICAgICdDYW5ub3Qgc2F0aXNmeSByZXF1ZXN0IHJhbmdlLicpLAorICAgICAgICA0MTc6ICgnRXhwZWN0YXRpb24gRmFpbGVkJywKKyAgICAgICAgICAgICAgJ0V4cGVjdCBjb25kaXRpb24gY291bGQgbm90IGJlIHNhdGlzZmllZC4nKSwKKworICAgICAgICA1MDA6ICgnSW50ZXJuYWwgU2VydmVyIEVycm9yJywgJ1NlcnZlciBnb3QgaXRzZWxmIGluIHRyb3VibGUnKSwKKyAgICAgICAgNTAxOiAoJ05vdCBJbXBsZW1lbnRlZCcsCisgICAgICAgICAgICAgICdTZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbicpLAorICAgICAgICA1MDI6ICgnQmFkIEdhdGV3YXknLCAnSW52YWxpZCByZXNwb25zZXMgZnJvbSBhbm90aGVyIHNlcnZlci9wcm94eS4nKSwKKyAgICAgICAgNTAzOiAoJ1NlcnZpY2UgVW5hdmFpbGFibGUnLAorICAgICAgICAgICAgICAnVGhlIHNlcnZlciBjYW5ub3QgcHJvY2VzcyB0aGUgcmVxdWVzdCBkdWUgdG8gYSBoaWdoIGxvYWQnKSwKKyAgICAgICAgNTA0OiAoJ0dhdGV3YXkgVGltZW91dCcsCisgICAgICAgICAgICAgICdUaGUgZ2F0ZXdheSBzZXJ2ZXIgZGlkIG5vdCByZWNlaXZlIGEgdGltZWx5IHJlc3BvbnNlJyksCisgICAgICAgIDUwNTogKCdIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCcsICdDYW5ub3QgZnVsZmlsbCByZXF1ZXN0LicpLAorICAgICAgICB9CisKKworZGVmIHRlc3QoSGFuZGxlckNsYXNzID0gQmFzZUhUVFBSZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgIFNlcnZlckNsYXNzID0gSFRUUFNlcnZlciwgcHJvdG9jb2w9IkhUVFAvMS4wIik6CisgICAgIiIiVGVzdCB0aGUgSFRUUCByZXF1ZXN0IGhhbmRsZXIgY2xhc3MuCisKKyAgICBUaGlzIHJ1bnMgYW4gSFRUUCBzZXJ2ZXIgb24gcG9ydCA4MDAwIChvciB0aGUgZmlyc3QgY29tbWFuZCBsaW5lCisgICAgYXJndW1lbnQpLgorCisgICAgIiIiCisKKyAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgIHBvcnQgPSBpbnQoc3lzLmFyZ3ZbMV0pCisgICAgZWxzZToKKyAgICAgICAgcG9ydCA9IDgwMDAKKyAgICBzZXJ2ZXJfYWRkcmVzcyA9ICgnJywgcG9ydCkKKworICAgIEhhbmRsZXJDbGFzcy5wcm90b2NvbF92ZXJzaW9uID0gcHJvdG9jb2wKKyAgICBodHRwZCA9IFNlcnZlckNsYXNzKHNlcnZlcl9hZGRyZXNzLCBIYW5kbGVyQ2xhc3MpCisKKyAgICBzYSA9IGh0dHBkLnNvY2tldC5nZXRzb2NrbmFtZSgpCisgICAgcHJpbnQgIlNlcnZpbmcgSFRUUCBvbiIsIHNhWzBdLCAicG9ydCIsIHNhWzFdLCAiLi4uIgorICAgIGh0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0Jhc2VIVFRQU2VydmVyLnB5YyBiL2xpYi9weXRob24yLjcvQmFzZUhUVFBTZXJ2ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjAxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0Jhc2VIVFRQU2VydmVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0Jhc2VIVFRQU2VydmVyLnB5byBiL2xpYi9weXRob24yLjcvQmFzZUhUVFBTZXJ2ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjAxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0Jhc2VIVFRQU2VydmVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0Jhc3Rpb24ucHkgYi9saWIvcHl0aG9uMi43L0Jhc3Rpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkZGRiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvQmFzdGlvbi5weQpAQCAtMCwwICsxLDE4MCBAQAorIiIiQmFzdGlvbmlmaWNhdGlvbiB1dGlsaXR5LgorCitBIGJhc3Rpb24gKGZvciBhbm90aGVyIG9iamVjdCAtLSB0aGUgJ29yaWdpbmFsJykgaXMgYW4gb2JqZWN0IHRoYXQgaGFzCit0aGUgc2FtZSBtZXRob2RzIGFzIHRoZSBvcmlnaW5hbCBidXQgZG9lcyBub3QgZ2l2ZSBhY2Nlc3MgdG8gaXRzCitpbnN0YW5jZSB2YXJpYWJsZXMuICBCYXN0aW9ucyBoYXZlIGEgbnVtYmVyIG9mIHVzZXMsIGJ1dCB0aGUgbW9zdAorb2J2aW91cyBvbmUgaXMgdG8gcHJvdmlkZSBjb2RlIGV4ZWN1dGluZyBpbiByZXN0cmljdGVkIG1vZGUgd2l0aCBhCitzYWZlIGludGVyZmFjZSB0byBhbiBvYmplY3QgaW1wbGVtZW50ZWQgaW4gdW5yZXN0cmljdGVkIG1vZGUuCisKK1RoZSBiYXN0aW9uaWZpY2F0aW9uIHJvdXRpbmUgaGFzIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB3aGljaCBpcworYSBmaWx0ZXIgZnVuY3Rpb24uICBPbmx5IHRob3NlIG1ldGhvZHMgZm9yIHdoaWNoIHRoZSBmaWx0ZXIgbWV0aG9kCisoY2FsbGVkIHdpdGggdGhlIG1ldGhvZCBuYW1lIGFzIGFyZ3VtZW50KSByZXR1cm5zIHRydWUgYXJlIGFjY2Vzc2libGUuCitUaGUgZGVmYXVsdCBmaWx0ZXIgbWV0aG9kIHJldHVybnMgdHJ1ZSB1bmxlc3MgdGhlIG1ldGhvZCBuYW1lIGJlZ2lucword2l0aCBhbiB1bmRlcnNjb3JlLgorCitUaGVyZSBhcmUgYSBudW1iZXIgb2YgcG9zc2libGUgaW1wbGVtZW50YXRpb25zIG9mIGJhc3Rpb25zLiAgV2UgdXNlIGEKKydsYXp5JyBhcHByb2FjaCB3aGVyZSB0aGUgYmFzdGlvbidzIF9fZ2V0YXR0cl9fKCkgZGlzY2lwbGluZSBkb2VzIGFsbAordGhlIHdvcmsgZm9yIGEgcGFydGljdWxhciBtZXRob2QgdGhlIGZpcnN0IHRpbWUgaXQgaXMgdXNlZC4gIFRoaXMgaXMKK3VzdWFsbHkgZmFzdGVzdCwgZXNwZWNpYWxseSBpZiB0aGUgdXNlciBkb2Vzbid0IGNhbGwgYWxsIGF2YWlsYWJsZQorbWV0aG9kcy4gIFRoZSByZXRyaWV2ZWQgbWV0aG9kcyBhcmUgc3RvcmVkIGFzIGluc3RhbmNlIHZhcmlhYmxlcyBvZgordGhlIGJhc3Rpb24sIHNvIHRoZSBvdmVyaGVhZCBpcyBvbmx5IG9jY3VycmVkIG9uIHRoZSBmaXJzdCB1c2Ugb2YgZWFjaAorbWV0aG9kLgorCitEZXRhaWw6IHRoZSBiYXN0aW9uIGNsYXNzIGhhcyBhIF9fcmVwcl9fKCkgZGlzY2lwbGluZSB3aGljaCBpbmNsdWRlcwordGhlIHJlcHIoKSBvZiB0aGUgb3JpZ2luYWwgb2JqZWN0LiAgVGhpcyBpcyBwcmVjb21wdXRlZCB3aGVuIHRoZQorYmFzdGlvbiBpcyBjcmVhdGVkLgorCisiIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIEJhc3Rpb24gbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCIsIHN0YWNrbGV2ZWw9MikKK2RlbCB3YXJucHkzaworCitfX2FsbF9fID0gWyJCYXN0aW9uQ2xhc3MiLCAiQmFzdGlvbiJdCisKK2Zyb20gdHlwZXMgaW1wb3J0IE1ldGhvZFR5cGUKKworCitjbGFzcyBCYXN0aW9uQ2xhc3M6CisKKyAgICAiIiJIZWxwZXIgY2xhc3MgdXNlZCBieSB0aGUgQmFzdGlvbigpIGZ1bmN0aW9uLgorCisgICAgWW91IGNvdWxkIHN1YmNsYXNzIHRoaXMgYW5kIHBhc3MgdGhlIHN1YmNsYXNzIGFzIHRoZSBiYXN0aW9uY2xhc3MKKyAgICBhcmd1bWVudCB0byB0aGUgQmFzdGlvbigpIGZ1bmN0aW9uLCBhcyBsb25nIGFzIHRoZSBjb25zdHJ1Y3RvciBoYXMKKyAgICB0aGUgc2FtZSBzaWduYXR1cmUgKGEgZ2V0KCkgZnVuY3Rpb24gYW5kIGEgbmFtZSBmb3IgdGhlIG9iamVjdCkuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZXQsIG5hbWUpOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4KKworICAgICAgICBBcmd1bWVudHM6CisKKyAgICAgICAgZ2V0IC0gYSBmdW5jdGlvbiB0aGF0IGdldHMgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAoYnkgbmFtZSkKKyAgICAgICAgbmFtZSAtIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhlIG9yaWdpbmFsIG9iamVjdAorICAgICAgICAgICAgICAgKHN1Z2dlc3Rpb246IHVzZSByZXByKG9iamVjdCkpCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2dldF8gPSBnZXQKKyAgICAgICAgc2VsZi5fbmFtZV8gPSBuYW1lCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIHJlcHJlc2VudGF0aW9uIHN0cmluZy4KKworICAgICAgICBUaGlzIGluY2x1ZGVzIHRoZSBuYW1lIHBhc3NlZCBpbiB0byB0aGUgY29uc3RydWN0b3IsIHNvIHRoYXQKKyAgICAgICAgaWYgeW91IHByaW50IHRoZSBiYXN0aW9uIGR1cmluZyBkZWJ1Z2dpbmcsIGF0IGxlYXN0IHlvdSBoYXZlCisgICAgICAgIHNvbWUgaWRlYSBvZiB3aGF0IGl0IGlzLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gIjxCYXN0aW9uIGZvciAlcz4iICUgc2VsZi5fbmFtZV8KKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiR2V0IGFuIGFzLXlldCB1bmRlZmluZWQgYXR0cmlidXRlIHZhbHVlLgorCisgICAgICAgIFRoaXMgY2FsbHMgdGhlIGdldCgpIGZ1bmN0aW9uIHRoYXQgd2FzIHBhc3NlZCB0byB0aGUKKyAgICAgICAgY29uc3RydWN0b3IuICBUaGUgcmVzdWx0IGlzIHN0b3JlZCBhcyBhbiBpbnN0YW5jZSB2YXJpYWJsZSBzbworICAgICAgICB0aGF0IHRoZSBuZXh0IHRpbWUgdGhlIHNhbWUgYXR0cmlidXRlIGlzIHJlcXVlc3RlZCwKKyAgICAgICAgX19nZXRhdHRyX18oKSB3b24ndCBiZSBpbnZva2VkLgorCisgICAgICAgIElmIHRoZSBnZXQoKSBmdW5jdGlvbiByYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGlzIGlzIHNpbXBseQorICAgICAgICBwYXNzZWQgb24gLS0gZXhjZXB0aW9ucyBhcmUgbm90IGNhY2hlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgYXR0cmlidXRlID0gc2VsZi5fZ2V0XyhuYW1lKQorICAgICAgICBzZWxmLl9fZGljdF9fW25hbWVdID0gYXR0cmlidXRlCisgICAgICAgIHJldHVybiBhdHRyaWJ1dGUKKworCitkZWYgQmFzdGlvbihvYmplY3QsIGZpbHRlciA9IGxhbWJkYSBuYW1lOiBuYW1lWzoxXSAhPSAnXycsCisgICAgICAgICAgICBuYW1lPU5vbmUsIGJhc3Rpb25jbGFzcz1CYXN0aW9uQ2xhc3MpOgorICAgICIiIkNyZWF0ZSBhIGJhc3Rpb24gZm9yIGFuIG9iamVjdCwgdXNpbmcgYW4gb3B0aW9uYWwgZmlsdGVyLgorCisgICAgU2VlIHRoZSBCYXN0aW9uIG1vZHVsZSdzIGRvY3VtZW50YXRpb24gZm9yIGJhY2tncm91bmQuCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBvYmplY3QgLSB0aGUgb3JpZ2luYWwgb2JqZWN0CisgICAgZmlsdGVyIC0gYSBwcmVkaWNhdGUgdGhhdCBkZWNpZGVzIHdoZXRoZXIgYSBmdW5jdGlvbiBuYW1lIGlzIE9LOworICAgICAgICAgICAgIGJ5IGRlZmF1bHQgYWxsIG5hbWVzIGFyZSBPSyB0aGF0IGRvbid0IHN0YXJ0IHdpdGggJ18nCisgICAgbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvYmplY3Q7IGRlZmF1bHQgcmVwcihvYmplY3QpCisgICAgYmFzdGlvbmNsYXNzIC0gY2xhc3MgdXNlZCB0byBjcmVhdGUgdGhlIGJhc3Rpb247IGRlZmF1bHQgQmFzdGlvbkNsYXNzCisKKyAgICAiIiIKKworICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIlRoaXMgY29kZSBpcyBub3Qgc2VjdXJlIGluIFB5dGhvbiAyLjIgYW5kIGxhdGVyIgorCisgICAgIyBOb3RlOiB3ZSBkZWZpbmUgKnR3byogYWQtaG9jIGZ1bmN0aW9ucyBoZXJlLCBnZXQxIGFuZCBnZXQyLgorICAgICMgQm90aCBhcmUgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGluIHRoZSBzYW1lIHdheTogZ2V0KG5hbWUpLgorICAgICMgSXQgaXMgY2xlYXIgdGhhdCB0aGUgcmVhbCB3b3JrIChnZXR0aW5nIHRoZSBhdHRyaWJ1dGUKKyAgICAjIGZyb20gdGhlIG9iamVjdCBhbmQgY2FsbGluZyB0aGUgZmlsdGVyKSBpcyBkb25lIGluIGdldDEuCisgICAgIyBXaHkgY2FuJ3Qgd2UgcGFzcyBnZXQxIHRvIHRoZSBiYXN0aW9uPyAgQmVjYXVzZSB0aGUgdXNlcgorICAgICMgd291bGQgYmUgYWJsZSB0byBvdmVycmlkZSB0aGUgZmlsdGVyIGFyZ3VtZW50ISAgV2l0aCBnZXQyLAorICAgICMgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBhcmd1bWVudCBpcyBubyBzZWN1cml0eSBsb29waG9sZToKKyAgICAjIGFsbCBpdCBkb2VzIGlzIGNhbGwgaXQuCisgICAgIyBBbHNvIG5vdGljZSB0aGF0IHdlIGNhbid0IHBsYWNlIHRoZSBvYmplY3QgYW5kIGZpbHRlciBhcworICAgICMgaW5zdGFuY2UgdmFyaWFibGVzIG9uIHRoZSBiYXN0aW9uIG9iamVjdCBpdHNlbGYsIHNpbmNlCisgICAgIyB0aGUgdXNlciBoYXMgZnVsbCBhY2Nlc3MgdG8gYWxsIGluc3RhbmNlIHZhcmlhYmxlcyEKKworICAgIGRlZiBnZXQxKG5hbWUsIG9iamVjdD1vYmplY3QsIGZpbHRlcj1maWx0ZXIpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbiBmb3IgQmFzdGlvbigpLiAgU2VlIHNvdXJjZSBjb21tZW50cy4iIiIKKyAgICAgICAgaWYgZmlsdGVyKG5hbWUpOgorICAgICAgICAgICAgYXR0cmlidXRlID0gZ2V0YXR0cihvYmplY3QsIG5hbWUpCisgICAgICAgICAgICBpZiB0eXBlKGF0dHJpYnV0ZSkgPT0gTWV0aG9kVHlwZToKKyAgICAgICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlCisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBuYW1lCisKKyAgICBkZWYgZ2V0MihuYW1lLCBnZXQxPWdldDEpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbiBmb3IgQmFzdGlvbigpLiAgU2VlIHNvdXJjZSBjb21tZW50cy4iIiIKKyAgICAgICAgcmV0dXJuIGdldDEobmFtZSkKKworICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgbmFtZSA9IHJlcHIob2JqZWN0KQorICAgIHJldHVybiBiYXN0aW9uY2xhc3MoZ2V0MiwgbmFtZSkKKworCitkZWYgX3Rlc3QoKToKKyAgICAiIiJUZXN0IHRoZSBCYXN0aW9uKCkgZnVuY3Rpb24uIiIiCisgICAgY2xhc3MgT3JpZ2luYWw6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgIHNlbGYuc3VtID0gMAorICAgICAgICBkZWYgYWRkKHNlbGYsIG4pOgorICAgICAgICAgICAgc2VsZi5fYWRkKG4pCisgICAgICAgIGRlZiBfYWRkKHNlbGYsIG4pOgorICAgICAgICAgICAgc2VsZi5zdW0gPSBzZWxmLnN1bSArIG4KKyAgICAgICAgZGVmIHRvdGFsKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3VtCisgICAgbyA9IE9yaWdpbmFsKCkKKyAgICBiID0gQmFzdGlvbihvKQorICAgIHRlc3Rjb2RlID0gIiIiaWYgMToKKyAgICBiLmFkZCg4MSkKKyAgICBiLmFkZCgxOCkKKyAgICBwcmludCAiYi50b3RhbCgpID0iLCBiLnRvdGFsKCkKKyAgICB0cnk6CisgICAgICAgIHByaW50ICJiLnN1bSA9IiwgYi5zdW0sCisgICAgZXhjZXB0OgorICAgICAgICBwcmludCAiaW5hY2Nlc3NpYmxlIgorICAgIGVsc2U6CisgICAgICAgIHByaW50ICJhY2Nlc3NpYmxlIgorICAgIHRyeToKKyAgICAgICAgcHJpbnQgImIuX2FkZCA9IiwgYi5fYWRkLAorICAgIGV4Y2VwdDoKKyAgICAgICAgcHJpbnQgImluYWNjZXNzaWJsZSIKKyAgICBlbHNlOgorICAgICAgICBwcmludCAiYWNjZXNzaWJsZSIKKyAgICB0cnk6CisgICAgICAgIHByaW50ICJiLl9nZXRfLmZ1bmNfZGVmYXVsdHMgPSIsIG1hcCh0eXBlLCBiLl9nZXRfLmZ1bmNfZGVmYXVsdHMpLAorICAgIGV4Y2VwdDoKKyAgICAgICAgcHJpbnQgImluYWNjZXNzaWJsZSIKKyAgICBlbHNlOgorICAgICAgICBwcmludCAiYWNjZXNzaWJsZSIKKyAgICBcbiIiIgorICAgIGV4ZWMgdGVzdGNvZGUKKyAgICBwcmludCAnPScqMjAsICJVc2luZyByZXhlYzoiLCAnPScqMjAKKyAgICBpbXBvcnQgcmV4ZWMKKyAgICByID0gcmV4ZWMuUkV4ZWMoKQorICAgIG0gPSByLmFkZF9tb2R1bGUoJ19fbWFpbl9fJykKKyAgICBtLmIgPSBiCisgICAgci5yX2V4ZWModGVzdGNvZGUpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0Jhc3Rpb24ucHljIGIvbGliL3B5dGhvbjIuNy9CYXN0aW9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmZkMmJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9CYXN0aW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0Jhc3Rpb24ucHlvIGIvbGliL3B5dGhvbjIuNy9CYXN0aW9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmZkMmJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9CYXN0aW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0NHSUhUVFBTZXJ2ZXIucHkgYi9saWIvcHl0aG9uMi43L0NHSUhUVFBTZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhOTk0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvQ0dJSFRUUFNlcnZlci5weQpAQCAtMCwwICsxLDM3OCBAQAorIiIiQ0dJLXNhdnZ5IEhUVFAgU2VydmVyLgorCitUaGlzIG1vZHVsZSBidWlsZHMgb24gU2ltcGxlSFRUUFNlcnZlciBieSBpbXBsZW1lbnRpbmcgR0VUIGFuZCBQT1NUCityZXF1ZXN0cyB0byBjZ2ktYmluIHNjcmlwdHMuCisKK0lmIHRoZSBvcy5mb3JrKCkgZnVuY3Rpb24gaXMgbm90IHByZXNlbnQgKGUuZy4gb24gV2luZG93cyksCitvcy5wb3BlbjIoKSBpcyB1c2VkIGFzIGEgZmFsbGJhY2ssIHdpdGggc2xpZ2h0bHkgYWx0ZXJlZCBzZW1hbnRpY3M7IGlmCit0aGF0IGZ1bmN0aW9uIGlzIG5vdCBwcmVzZW50IGVpdGhlciAoZS5nLiBvbiBNYWNpbnRvc2gpLCBvbmx5IFB5dGhvbgorc2NyaXB0cyBhcmUgc3VwcG9ydGVkLCBhbmQgdGhleSBhcmUgZXhlY3V0ZWQgYnkgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKworSW4gYWxsIGNhc2VzLCB0aGUgaW1wbGVtZW50YXRpb24gaXMgaW50ZW50aW9uYWxseSBuYWl2ZSAtLSBhbGwKK3JlcXVlc3RzIGFyZSBleGVjdXRlZCBzeWNocm9ub3VzbHkuCisKK1NFQ1VSSVRZIFdBUk5JTkc6IERPTidUIFVTRSBUSElTIENPREUgVU5MRVNTIFlPVSBBUkUgSU5TSURFIEEgRklSRVdBTEwKKy0tIGl0IG1heSBleGVjdXRlIGFyYml0cmFyeSBQeXRob24gY29kZSBvciBleHRlcm5hbCBwcm9ncmFtcy4KKworTm90ZSB0aGF0IHN0YXR1cyBjb2RlIDIwMCBpcyBzZW50IHByaW9yIHRvIGV4ZWN1dGlvbiBvZiBhIENHSSBzY3JpcHQsIHNvCitzY3JpcHRzIGNhbm5vdCBzZW5kIG90aGVyIHN0YXR1cyBjb2RlcyBzdWNoIGFzIDMwMiAocmVkaXJlY3QpLgorIiIiCisKKworX192ZXJzaW9uX18gPSAiMC40IgorCitfX2FsbF9fID0gWyJDR0lIVFRQUmVxdWVzdEhhbmRsZXIiXQorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCBCYXNlSFRUUFNlcnZlcgoraW1wb3J0IFNpbXBsZUhUVFBTZXJ2ZXIKK2ltcG9ydCBzZWxlY3QKK2ltcG9ydCBjb3B5CisKKworY2xhc3MgQ0dJSFRUUFJlcXVlc3RIYW5kbGVyKFNpbXBsZUhUVFBTZXJ2ZXIuU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyKToKKworICAgICIiIkNvbXBsZXRlIEhUVFAgc2VydmVyIHdpdGggR0VULCBIRUFEIGFuZCBQT1NUIGNvbW1hbmRzLgorCisgICAgR0VUIGFuZCBIRUFEIGFsc28gc3VwcG9ydCBydW5uaW5nIENHSSBzY3JpcHRzLgorCisgICAgVGhlIFBPU1QgY29tbWFuZCBpcyAqb25seSogaW1wbGVtZW50ZWQgZm9yIENHSSBzY3JpcHRzLgorCisgICAgIiIiCisKKyAgICAjIERldGVybWluZSBwbGF0Zm9ybSBzcGVjaWZpY3MKKyAgICBoYXZlX2ZvcmsgPSBoYXNhdHRyKG9zLCAnZm9yaycpCisgICAgaGF2ZV9wb3BlbjIgPSBoYXNhdHRyKG9zLCAncG9wZW4yJykKKyAgICBoYXZlX3BvcGVuMyA9IGhhc2F0dHIob3MsICdwb3BlbjMnKQorCisgICAgIyBNYWtlIHJmaWxlIHVuYnVmZmVyZWQgLS0gd2UgbmVlZCB0byByZWFkIG9uZSBsaW5lIGFuZCB0aGVuIHBhc3MKKyAgICAjIHRoZSByZXN0IHRvIGEgc3VicHJvY2Vzcywgc28gd2UgY2FuJ3QgdXNlIGJ1ZmZlcmVkIGlucHV0LgorICAgIHJidWZzaXplID0gMAorCisgICAgZGVmIGRvX1BPU1Qoc2VsZik6CisgICAgICAgICIiIlNlcnZlIGEgUE9TVCByZXF1ZXN0LgorCisgICAgICAgIFRoaXMgaXMgb25seSBpbXBsZW1lbnRlZCBmb3IgQ0dJIHNjcmlwdHMuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgc2VsZi5pc19jZ2koKToKKyAgICAgICAgICAgIHNlbGYucnVuX2NnaSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNTAxLCAiQ2FuIG9ubHkgUE9TVCB0byBDR0kgc2NyaXB0cyIpCisKKyAgICBkZWYgc2VuZF9oZWFkKHNlbGYpOgorICAgICAgICAiIiJWZXJzaW9uIG9mIHNlbmRfaGVhZCB0aGF0IHN1cHBvcnQgQ0dJIHNjcmlwdHMiIiIKKyAgICAgICAgaWYgc2VsZi5pc19jZ2koKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJ1bl9jZ2koKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFNpbXBsZUhUVFBTZXJ2ZXIuU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyLnNlbmRfaGVhZChzZWxmKQorCisgICAgZGVmIGlzX2NnaShzZWxmKToKKyAgICAgICAgIiIiVGVzdCB3aGV0aGVyIHNlbGYucGF0aCBjb3JyZXNwb25kcyB0byBhIENHSSBzY3JpcHQuCisKKyAgICAgICAgUmV0dXJucyBUcnVlIGFuZCB1cGRhdGVzIHRoZSBjZ2lfaW5mbyBhdHRyaWJ1dGUgdG8gdGhlIHR1cGxlCisgICAgICAgIChkaXIsIHJlc3QpIGlmIHNlbGYucGF0aCByZXF1aXJlcyBydW5uaW5nIGEgQ0dJIHNjcmlwdC4KKyAgICAgICAgUmV0dXJucyBGYWxzZSBvdGhlcndpc2UuCisKKyAgICAgICAgSWYgYW55IGV4Y2VwdGlvbiBpcyByYWlzZWQsIHRoZSBjYWxsZXIgc2hvdWxkIGFzc3VtZSB0aGF0CisgICAgICAgIHNlbGYucGF0aCB3YXMgcmVqZWN0ZWQgYXMgaW52YWxpZCBhbmQgYWN0IGFjY29yZGluZ2x5LgorCisgICAgICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRlc3RzIHdoZXRoZXIgdGhlIG5vcm1hbGl6ZWQgdXJsCisgICAgICAgIHBhdGggYmVnaW5zIHdpdGggb25lIG9mIHRoZSBzdHJpbmdzIGluIHNlbGYuY2dpX2RpcmVjdG9yaWVzCisgICAgICAgIChhbmQgdGhlIG5leHQgY2hhcmFjdGVyIGlzIGEgJy8nIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmluZykuCisgICAgICAgICIiIgorICAgICAgICBjb2xsYXBzZWRfcGF0aCA9IF91cmxfY29sbGFwc2VfcGF0aChzZWxmLnBhdGgpCisgICAgICAgIGRpcl9zZXAgPSBjb2xsYXBzZWRfcGF0aC5maW5kKCcvJywgMSkKKyAgICAgICAgaGVhZCwgdGFpbCA9IGNvbGxhcHNlZF9wYXRoWzpkaXJfc2VwXSwgY29sbGFwc2VkX3BhdGhbZGlyX3NlcCsxOl0KKyAgICAgICAgaWYgaGVhZCBpbiBzZWxmLmNnaV9kaXJlY3RvcmllczoKKyAgICAgICAgICAgIHNlbGYuY2dpX2luZm8gPSBoZWFkLCB0YWlsCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGNnaV9kaXJlY3RvcmllcyA9IFsnL2NnaS1iaW4nLCAnL2h0YmluJ10KKworICAgIGRlZiBpc19leGVjdXRhYmxlKHNlbGYsIHBhdGgpOgorICAgICAgICAiIiJUZXN0IHdoZXRoZXIgYXJndW1lbnQgcGF0aCBpcyBhbiBleGVjdXRhYmxlIGZpbGUuIiIiCisgICAgICAgIHJldHVybiBleGVjdXRhYmxlKHBhdGgpCisKKyAgICBkZWYgaXNfcHl0aG9uKHNlbGYsIHBhdGgpOgorICAgICAgICAiIiJUZXN0IHdoZXRoZXIgYXJndW1lbnQgcGF0aCBpcyBhIFB5dGhvbiBzY3JpcHQuIiIiCisgICAgICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0ZXh0KHBhdGgpCisgICAgICAgIHJldHVybiB0YWlsLmxvd2VyKCkgaW4gKCIucHkiLCAiLnB5dyIpCisKKyAgICBkZWYgcnVuX2NnaShzZWxmKToKKyAgICAgICAgIiIiRXhlY3V0ZSBhIENHSSBzY3JpcHQuIiIiCisgICAgICAgIHBhdGggPSBzZWxmLnBhdGgKKyAgICAgICAgZGlyLCByZXN0ID0gc2VsZi5jZ2lfaW5mbworCisgICAgICAgIGkgPSBwYXRoLmZpbmQoJy8nLCBsZW4oZGlyKSArIDEpCisgICAgICAgIHdoaWxlIGkgPj0gMDoKKyAgICAgICAgICAgIG5leHRkaXIgPSBwYXRoWzppXQorICAgICAgICAgICAgbmV4dHJlc3QgPSBwYXRoW2krMTpdCisKKyAgICAgICAgICAgIHNjcmlwdGRpciA9IHNlbGYudHJhbnNsYXRlX3BhdGgobmV4dGRpcikKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc2NyaXB0ZGlyKToKKyAgICAgICAgICAgICAgICBkaXIsIHJlc3QgPSBuZXh0ZGlyLCBuZXh0cmVzdAorICAgICAgICAgICAgICAgIGkgPSBwYXRoLmZpbmQoJy8nLCBsZW4oZGlyKSArIDEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgIyBmaW5kIGFuIGV4cGxpY2l0IHF1ZXJ5IHN0cmluZywgaWYgcHJlc2VudC4KKyAgICAgICAgaSA9IHJlc3QucmZpbmQoJz8nKQorICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICByZXN0LCBxdWVyeSA9IHJlc3RbOmldLCByZXN0W2krMTpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBxdWVyeSA9ICcnCisKKyAgICAgICAgIyBkaXNzZWN0IHRoZSBwYXJ0IGFmdGVyIHRoZSBkaXJlY3RvcnkgbmFtZSBpbnRvIGEgc2NyaXB0IG5hbWUgJgorICAgICAgICAjIGEgcG9zc2libGUgYWRkaXRpb25hbCBwYXRoLCB0byBiZSBzdG9yZWQgaW4gUEFUSF9JTkZPLgorICAgICAgICBpID0gcmVzdC5maW5kKCcvJykKKyAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgc2NyaXB0LCByZXN0ID0gcmVzdFs6aV0sIHJlc3RbaTpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzY3JpcHQsIHJlc3QgPSByZXN0LCAnJworCisgICAgICAgIHNjcmlwdG5hbWUgPSBkaXIgKyAnLycgKyBzY3JpcHQKKyAgICAgICAgc2NyaXB0ZmlsZSA9IHNlbGYudHJhbnNsYXRlX3BhdGgoc2NyaXB0bmFtZSkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNjcmlwdGZpbGUpOgorICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwNCwgIk5vIHN1Y2ggQ0dJIHNjcmlwdCAoJXIpIiAlIHNjcmlwdG5hbWUpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHNjcmlwdGZpbGUpOgorICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwMywgIkNHSSBzY3JpcHQgaXMgbm90IGEgcGxhaW4gZmlsZSAoJXIpIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0bmFtZSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpc3B5ID0gc2VsZi5pc19weXRob24oc2NyaXB0bmFtZSkKKyAgICAgICAgaWYgbm90IGlzcHk6CisgICAgICAgICAgICBpZiBub3QgKHNlbGYuaGF2ZV9mb3JrIG9yIHNlbGYuaGF2ZV9wb3BlbjIgb3Igc2VsZi5oYXZlX3BvcGVuMyk6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwMywgIkNHSSBzY3JpcHQgaXMgbm90IGEgUHl0aG9uIHNjcmlwdCAoJXIpIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdG5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5pc19leGVjdXRhYmxlKHNjcmlwdGZpbGUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcig0MDMsICJDR0kgc2NyaXB0IGlzIG5vdCBleGVjdXRhYmxlICglcikiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0bmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIFJlZmVyZW5jZTogaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9lbnYuaHRtbAorICAgICAgICAjIFhYWCBNdWNoIG9mIHRoZSBmb2xsb3dpbmcgY291bGQgYmUgcHJlcGFyZWQgYWhlYWQgb2YgdGltZSEKKyAgICAgICAgZW52ID0gY29weS5kZWVwY29weShvcy5lbnZpcm9uKQorICAgICAgICBlbnZbJ1NFUlZFUl9TT0ZUV0FSRSddID0gc2VsZi52ZXJzaW9uX3N0cmluZygpCisgICAgICAgIGVudlsnU0VSVkVSX05BTUUnXSA9IHNlbGYuc2VydmVyLnNlcnZlcl9uYW1lCisgICAgICAgIGVudlsnR0FURVdBWV9JTlRFUkZBQ0UnXSA9ICdDR0kvMS4xJworICAgICAgICBlbnZbJ1NFUlZFUl9QUk9UT0NPTCddID0gc2VsZi5wcm90b2NvbF92ZXJzaW9uCisgICAgICAgIGVudlsnU0VSVkVSX1BPUlQnXSA9IHN0cihzZWxmLnNlcnZlci5zZXJ2ZXJfcG9ydCkKKyAgICAgICAgZW52WydSRVFVRVNUX01FVEhPRCddID0gc2VsZi5jb21tYW5kCisgICAgICAgIHVxcmVzdCA9IHVybGxpYi51bnF1b3RlKHJlc3QpCisgICAgICAgIGVudlsnUEFUSF9JTkZPJ10gPSB1cXJlc3QKKyAgICAgICAgZW52WydQQVRIX1RSQU5TTEFURUQnXSA9IHNlbGYudHJhbnNsYXRlX3BhdGgodXFyZXN0KQorICAgICAgICBlbnZbJ1NDUklQVF9OQU1FJ10gPSBzY3JpcHRuYW1lCisgICAgICAgIGlmIHF1ZXJ5OgorICAgICAgICAgICAgZW52WydRVUVSWV9TVFJJTkcnXSA9IHF1ZXJ5CisgICAgICAgIGhvc3QgPSBzZWxmLmFkZHJlc3Nfc3RyaW5nKCkKKyAgICAgICAgaWYgaG9zdCAhPSBzZWxmLmNsaWVudF9hZGRyZXNzWzBdOgorICAgICAgICAgICAgZW52WydSRU1PVEVfSE9TVCddID0gaG9zdAorICAgICAgICBlbnZbJ1JFTU9URV9BRERSJ10gPSBzZWxmLmNsaWVudF9hZGRyZXNzWzBdCisgICAgICAgIGF1dGhvcml6YXRpb24gPSBzZWxmLmhlYWRlcnMuZ2V0aGVhZGVyKCJhdXRob3JpemF0aW9uIikKKyAgICAgICAgaWYgYXV0aG9yaXphdGlvbjoKKyAgICAgICAgICAgIGF1dGhvcml6YXRpb24gPSBhdXRob3JpemF0aW9uLnNwbGl0KCkKKyAgICAgICAgICAgIGlmIGxlbihhdXRob3JpemF0aW9uKSA9PSAyOgorICAgICAgICAgICAgICAgIGltcG9ydCBiYXNlNjQsIGJpbmFzY2lpCisgICAgICAgICAgICAgICAgZW52WydBVVRIX1RZUEUnXSA9IGF1dGhvcml6YXRpb25bMF0KKyAgICAgICAgICAgICAgICBpZiBhdXRob3JpemF0aW9uWzBdLmxvd2VyKCkgPT0gImJhc2ljIjoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbiA9IGJhc2U2NC5kZWNvZGVzdHJpbmcoYXV0aG9yaXphdGlvblsxXSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGJpbmFzY2lpLkVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbiA9IGF1dGhvcml6YXRpb24uc3BsaXQoJzonKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGF1dGhvcml6YXRpb24pID09IDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52WydSRU1PVEVfVVNFUiddID0gYXV0aG9yaXphdGlvblswXQorICAgICAgICAjIFhYWCBSRU1PVEVfSURFTlQKKyAgICAgICAgaWYgc2VsZi5oZWFkZXJzLnR5cGVoZWFkZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGVudlsnQ09OVEVOVF9UWVBFJ10gPSBzZWxmLmhlYWRlcnMudHlwZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW52WydDT05URU5UX1RZUEUnXSA9IHNlbGYuaGVhZGVycy50eXBlaGVhZGVyCisgICAgICAgIGxlbmd0aCA9IHNlbGYuaGVhZGVycy5nZXRoZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJykKKyAgICAgICAgaWYgbGVuZ3RoOgorICAgICAgICAgICAgZW52WydDT05URU5UX0xFTkdUSCddID0gbGVuZ3RoCisgICAgICAgIHJlZmVyZXIgPSBzZWxmLmhlYWRlcnMuZ2V0aGVhZGVyKCdyZWZlcmVyJykKKyAgICAgICAgaWYgcmVmZXJlcjoKKyAgICAgICAgICAgIGVudlsnSFRUUF9SRUZFUkVSJ10gPSByZWZlcmVyCisgICAgICAgIGFjY2VwdCA9IFtdCisgICAgICAgIGZvciBsaW5lIGluIHNlbGYuaGVhZGVycy5nZXRhbGxtYXRjaGluZ2hlYWRlcnMoJ2FjY2VwdCcpOgorICAgICAgICAgICAgaWYgbGluZVs6MV0gaW4gIlx0XG5cciAiOgorICAgICAgICAgICAgICAgIGFjY2VwdC5hcHBlbmQobGluZS5zdHJpcCgpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhY2NlcHQgPSBhY2NlcHQgKyBsaW5lWzc6XS5zcGxpdCgnLCcpCisgICAgICAgIGVudlsnSFRUUF9BQ0NFUFQnXSA9ICcsJy5qb2luKGFjY2VwdCkKKyAgICAgICAgdWEgPSBzZWxmLmhlYWRlcnMuZ2V0aGVhZGVyKCd1c2VyLWFnZW50JykKKyAgICAgICAgaWYgdWE6CisgICAgICAgICAgICBlbnZbJ0hUVFBfVVNFUl9BR0VOVCddID0gdWEKKyAgICAgICAgY28gPSBmaWx0ZXIoTm9uZSwgc2VsZi5oZWFkZXJzLmdldGhlYWRlcnMoJ2Nvb2tpZScpKQorICAgICAgICBpZiBjbzoKKyAgICAgICAgICAgIGVudlsnSFRUUF9DT09LSUUnXSA9ICcsICcuam9pbihjbykKKyAgICAgICAgIyBYWFggT3RoZXIgSFRUUF8qIGhlYWRlcnMKKyAgICAgICAgIyBTaW5jZSB3ZSdyZSBzZXR0aW5nIHRoZSBlbnYgaW4gdGhlIHBhcmVudCwgcHJvdmlkZSBlbXB0eQorICAgICAgICAjIHZhbHVlcyB0byBvdmVycmlkZSBwcmV2aW91c2x5IHNldCB2YWx1ZXMKKyAgICAgICAgZm9yIGsgaW4gKCdRVUVSWV9TVFJJTkcnLCAnUkVNT1RFX0hPU1QnLCAnQ09OVEVOVF9MRU5HVEgnLAorICAgICAgICAgICAgICAgICAgJ0hUVFBfVVNFUl9BR0VOVCcsICdIVFRQX0NPT0tJRScsICdIVFRQX1JFRkVSRVInKToKKyAgICAgICAgICAgIGVudi5zZXRkZWZhdWx0KGssICIiKQorCisgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDAsICJTY3JpcHQgb3V0cHV0IGZvbGxvd3MiKQorCisgICAgICAgIGRlY29kZWRfcXVlcnkgPSBxdWVyeS5yZXBsYWNlKCcrJywgJyAnKQorCisgICAgICAgIGlmIHNlbGYuaGF2ZV9mb3JrOgorICAgICAgICAgICAgIyBVbml4IC0tIGZvcmsgYXMgd2Ugc2hvdWxkCisgICAgICAgICAgICBhcmdzID0gW3NjcmlwdF0KKyAgICAgICAgICAgIGlmICc9JyBub3QgaW4gZGVjb2RlZF9xdWVyeToKKyAgICAgICAgICAgICAgICBhcmdzLmFwcGVuZChkZWNvZGVkX3F1ZXJ5KQorICAgICAgICAgICAgbm9ib2R5ID0gbm9ib2R5X3VpZCgpCisgICAgICAgICAgICBzZWxmLndmaWxlLmZsdXNoKCkgIyBBbHdheXMgZmx1c2ggYmVmb3JlIGZvcmtpbmcKKyAgICAgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgaWYgcGlkICE9IDA6CisgICAgICAgICAgICAgICAgIyBQYXJlbnQKKyAgICAgICAgICAgICAgICBwaWQsIHN0cyA9IG9zLndhaXRwaWQocGlkLCAwKQorICAgICAgICAgICAgICAgICMgdGhyb3cgYXdheSBhZGRpdGlvbmFsIGRhdGEgW3NlZSBidWcgIzQyNzM0NV0KKyAgICAgICAgICAgICAgICB3aGlsZSBzZWxlY3Quc2VsZWN0KFtzZWxmLnJmaWxlXSwgW10sIFtdLCAwKVswXToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucmZpbGUucmVhZCgxKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgc3RzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ19lcnJvcigiQ0dJIHNjcmlwdCBleGl0IHN0YXR1cyAlI3giLCBzdHMpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAjIENoaWxkCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy5zZXR1aWQobm9ib2R5KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIG9zLmR1cDIoc2VsZi5yZmlsZS5maWxlbm8oKSwgMCkKKyAgICAgICAgICAgICAgICBvcy5kdXAyKHNlbGYud2ZpbGUuZmlsZW5vKCksIDEpCisgICAgICAgICAgICAgICAgb3MuZXhlY3ZlKHNjcmlwdGZpbGUsIGFyZ3MsIGVudikKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5oYW5kbGVfZXJyb3Ioc2VsZi5yZXF1ZXN0LCBzZWxmLmNsaWVudF9hZGRyZXNzKQorICAgICAgICAgICAgICAgIG9zLl9leGl0KDEyNykKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBOb24gVW5peCAtIHVzZSBzdWJwcm9jZXNzCisgICAgICAgICAgICBpbXBvcnQgc3VicHJvY2VzcworICAgICAgICAgICAgY21kbGluZSA9IFtzY3JpcHRmaWxlXQorICAgICAgICAgICAgaWYgc2VsZi5pc19weXRob24oc2NyaXB0ZmlsZSk6CisgICAgICAgICAgICAgICAgaW50ZXJwID0gc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgICAgICAgICBpZiBpbnRlcnAubG93ZXIoKS5lbmRzd2l0aCgidy5leGUiKToKKyAgICAgICAgICAgICAgICAgICAgIyBPbiBXaW5kb3dzLCB1c2UgcHl0aG9uLmV4ZSwgbm90IHB5dGhvbncuZXhlCisgICAgICAgICAgICAgICAgICAgIGludGVycCA9IGludGVycFs6LTVdICsgaW50ZXJwWy00Ol0KKyAgICAgICAgICAgICAgICBjbWRsaW5lID0gW2ludGVycCwgJy11J10gKyBjbWRsaW5lCisgICAgICAgICAgICBpZiAnPScgbm90IGluIHF1ZXJ5OgorICAgICAgICAgICAgICAgIGNtZGxpbmUuYXBwZW5kKHF1ZXJ5KQorCisgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJjb21tYW5kOiAlcyIsIHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKGNtZGxpbmUpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG5ieXRlcyA9IGludChsZW5ndGgpCisgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgbmJ5dGVzID0gMAorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluID0gc3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyID0gc3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52ID0gZW52CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGlmIHNlbGYuY29tbWFuZC5sb3dlcigpID09ICJwb3N0IiBhbmQgbmJ5dGVzID4gMDoKKyAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5yZmlsZS5yZWFkKG5ieXRlcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGF0YSA9IE5vbmUKKyAgICAgICAgICAgICMgdGhyb3cgYXdheSBhZGRpdGlvbmFsIGRhdGEgW3NlZSBidWcgIzQyNzM0NV0KKyAgICAgICAgICAgIHdoaWxlIHNlbGVjdC5zZWxlY3QoW3NlbGYucmZpbGUuX3NvY2tdLCBbXSwgW10sIDApWzBdOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJmaWxlLl9zb2NrLnJlY3YoMSk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoZGF0YSkKKyAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoc3Rkb3V0KQorICAgICAgICAgICAgaWYgc3RkZXJyOgorICAgICAgICAgICAgICAgIHNlbGYubG9nX2Vycm9yKCclcycsIHN0ZGVycikKKyAgICAgICAgICAgIHAuc3RkZXJyLmNsb3NlKCkKKyAgICAgICAgICAgIHAuc3Rkb3V0LmNsb3NlKCkKKyAgICAgICAgICAgIHN0YXR1cyA9IHAucmV0dXJuY29kZQorICAgICAgICAgICAgaWYgc3RhdHVzOgorICAgICAgICAgICAgICAgIHNlbGYubG9nX2Vycm9yKCJDR0kgc2NyaXB0IGV4aXQgc3RhdHVzICUjeCIsIHN0YXR1cykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgiQ0dJIHNjcmlwdCBleGl0ZWQgT0siKQorCisKK2RlZiBfdXJsX2NvbGxhcHNlX3BhdGgocGF0aCk6CisgICAgIiIiCisgICAgR2l2ZW4gYSBVUkwgcGF0aCwgcmVtb3ZlIGV4dHJhICcvJ3MgYW5kICcuJyBwYXRoIGVsZW1lbnRzIGFuZCBjb2xsYXBzZQorICAgIGFueSAnLi4nIHJlZmVyZW5jZXMgYW5kIHJldHVybnMgYSBjb2xsbGFwc2VkIHBhdGguCisKKyAgICBJbXBsZW1lbnRzIHNvbWV0aGluZyBha2luIHRvIFJGQy0yMzk2IDUuMiBzdGVwIDYgdG8gcGFyc2UgcmVsYXRpdmUgcGF0aHMuCisgICAgVGhlIHV0aWxpdHkgb2YgdGhpcyBmdW5jdGlvbiBpcyBsaW1pdGVkIHRvIGlzX2NnaSBtZXRob2QgYW5kIGhlbHBzCisgICAgcHJldmVudGluZyBzb21lIHNlY3VyaXR5IGF0dGFja3MuCisKKyAgICBSZXR1cm5zOiBBIHR1cGxlIG9mIChoZWFkLCB0YWlsKSB3aGVyZSB0YWlsIGlzIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpbmFsIC8KKyAgICBhbmQgaGVhZCBpcyBldmVyeXRoaW5nIGJlZm9yZSBpdC4gIEhlYWQgd2lsbCBhbHdheXMgc3RhcnQgd2l0aCBhICcvJyBhbmQsCisgICAgaWYgaXQgY29udGFpbnMgYW55dGhpbmcgZWxzZSwgbmV2ZXIgaGF2ZSBhIHRyYWlsaW5nICcvJy4KKworICAgIFJhaXNlczogSW5kZXhFcnJvciBpZiB0b28gbWFueSAnLi4nIG9jY3VyIHdpdGhpbiB0aGUgcGF0aC4KKworICAgICIiIgorICAgICMgU2ltaWxhciB0byBvcy5wYXRoLnNwbGl0KG9zLnBhdGgubm9ybXBhdGgocGF0aCkpIGJ1dCBzcGVjaWZpYyB0byBVUkwKKyAgICAjIHBhdGggc2VtYW50aWNzIHJhdGhlciB0aGFuIGxvY2FsIG9wZXJhdGluZyBzeXN0ZW0gc2VtYW50aWNzLgorICAgIHBhdGhfcGFydHMgPSBwYXRoLnNwbGl0KCcvJykKKyAgICBoZWFkX3BhcnRzID0gW10KKyAgICBmb3IgcGFydCBpbiBwYXRoX3BhcnRzWzotMV06CisgICAgICAgIGlmIHBhcnQgPT0gJy4uJzoKKyAgICAgICAgICAgIGhlYWRfcGFydHMucG9wKCkgIyBJbmRleEVycm9yIGlmIG1vcmUgJy4uJyB0aGFuIHByaW9yIHBhcnRzCisgICAgICAgIGVsaWYgcGFydCBhbmQgcGFydCAhPSAnLic6CisgICAgICAgICAgICBoZWFkX3BhcnRzLmFwcGVuZCggcGFydCApCisgICAgaWYgcGF0aF9wYXJ0czoKKyAgICAgICAgdGFpbF9wYXJ0ID0gcGF0aF9wYXJ0cy5wb3AoKQorICAgICAgICBpZiB0YWlsX3BhcnQ6CisgICAgICAgICAgICBpZiB0YWlsX3BhcnQgPT0gJy4uJzoKKyAgICAgICAgICAgICAgICBoZWFkX3BhcnRzLnBvcCgpCisgICAgICAgICAgICAgICAgdGFpbF9wYXJ0ID0gJycKKyAgICAgICAgICAgIGVsaWYgdGFpbF9wYXJ0ID09ICcuJzoKKyAgICAgICAgICAgICAgICB0YWlsX3BhcnQgPSAnJworICAgIGVsc2U6CisgICAgICAgIHRhaWxfcGFydCA9ICcnCisKKyAgICBzcGxpdHBhdGggPSAoJy8nICsgJy8nLmpvaW4oaGVhZF9wYXJ0cyksIHRhaWxfcGFydCkKKyAgICBjb2xsYXBzZWRfcGF0aCA9ICIvIi5qb2luKHNwbGl0cGF0aCkKKworICAgIHJldHVybiBjb2xsYXBzZWRfcGF0aAorCisKK25vYm9keSA9IE5vbmUKKworZGVmIG5vYm9keV91aWQoKToKKyAgICAiIiJJbnRlcm5hbCByb3V0aW5lIHRvIGdldCBub2JvZHkncyB1aWQiIiIKKyAgICBnbG9iYWwgbm9ib2R5CisgICAgaWYgbm9ib2R5OgorICAgICAgICByZXR1cm4gbm9ib2R5CisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgcHdkCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICByZXR1cm4gLTEKKyAgICB0cnk6CisgICAgICAgIG5vYm9keSA9IHB3ZC5nZXRwd25hbSgnbm9ib2R5JylbMl0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIG5vYm9keSA9IDEgKyBtYXgobWFwKGxhbWJkYSB4OiB4WzJdLCBwd2QuZ2V0cHdhbGwoKSkpCisgICAgcmV0dXJuIG5vYm9keQorCisKK2RlZiBleGVjdXRhYmxlKHBhdGgpOgorICAgICIiIlRlc3QgZm9yIGV4ZWN1dGFibGUgZmlsZS4iIiIKKyAgICB0cnk6CisgICAgICAgIHN0ID0gb3Muc3RhdChwYXRoKQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIHN0LnN0X21vZGUgJiAwMTExICE9IDAKKworCitkZWYgdGVzdChIYW5kbGVyQ2xhc3MgPSBDR0lIVFRQUmVxdWVzdEhhbmRsZXIsCisgICAgICAgICBTZXJ2ZXJDbGFzcyA9IEJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIpOgorICAgIFNpbXBsZUhUVFBTZXJ2ZXIudGVzdChIYW5kbGVyQ2xhc3MsIFNlcnZlckNsYXNzKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0NHSUhUVFBTZXJ2ZXIucHljIGIvbGliL3B5dGhvbjIuNy9DR0lIVFRQU2VydmVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2JmZmNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9DR0lIVFRQU2VydmVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0NHSUhUVFBTZXJ2ZXIucHlvIGIvbGliL3B5dGhvbjIuNy9DR0lIVFRQU2VydmVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2JmZmNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9DR0lIVFRQU2VydmVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0NvbmZpZ1BhcnNlci5weSBiL2xpYi9weXRob24yLjcvQ29uZmlnUGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNmNkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0NvbmZpZ1BhcnNlci5weQpAQCAtMCwwICsxLDc1MyBAQAorIiIiQ29uZmlndXJhdGlvbiBmaWxlIHBhcnNlci4KKworQSBzZXR1cCBmaWxlIGNvbnNpc3RzIG9mIHNlY3Rpb25zLCBsZWFkIGJ5IGEgIltzZWN0aW9uXSIgaGVhZGVyLAorYW5kIGZvbGxvd2VkIGJ5ICJuYW1lOiB2YWx1ZSIgZW50cmllcywgd2l0aCBjb250aW51YXRpb25zIGFuZCBzdWNoIGluCit0aGUgc3R5bGUgb2YgUkZDIDgyMi4KKworVGhlIG9wdGlvbiB2YWx1ZXMgY2FuIGNvbnRhaW4gZm9ybWF0IHN0cmluZ3Mgd2hpY2ggcmVmZXIgdG8gb3RoZXIgdmFsdWVzIGluCit0aGUgc2FtZSBzZWN0aW9uLCBvciB2YWx1ZXMgaW4gYSBzcGVjaWFsIFtERUZBVUxUXSBzZWN0aW9uLgorCitGb3IgZXhhbXBsZToKKworICAgIHNvbWV0aGluZzogJShkaXIpcy93aGF0ZXZlcgorCit3b3VsZCByZXNvbHZlIHRoZSAiJShkaXIpcyIgdG8gdGhlIHZhbHVlIG9mIGRpci4gIEFsbCByZWZlcmVuY2UKK2V4cGFuc2lvbnMgYXJlIGRvbmUgbGF0ZSwgb24gZGVtYW5kLgorCitJbnRyaW5zaWMgZGVmYXVsdHMgY2FuIGJlIHNwZWNpZmllZCBieSBwYXNzaW5nIHRoZW0gaW50byB0aGUKK0NvbmZpZ1BhcnNlciBjb25zdHJ1Y3RvciBhcyBhIGRpY3Rpb25hcnkuCisKK2NsYXNzOgorCitDb25maWdQYXJzZXIgLS0gcmVzcG9uc2libGUgZm9yIHBhcnNpbmcgYSBsaXN0IG9mCisgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlcywgYW5kIG1hbmFnaW5nIHRoZSBwYXJzZWQgZGF0YWJhc2UuCisKKyAgICBtZXRob2RzOgorCisgICAgX19pbml0X18oZGVmYXVsdHM9Tm9uZSkKKyAgICAgICAgY3JlYXRlIHRoZSBwYXJzZXIgYW5kIHNwZWNpZnkgYSBkaWN0aW9uYXJ5IG9mIGludHJpbnNpYyBkZWZhdWx0cy4gIFRoZQorICAgICAgICBrZXlzIG11c3QgYmUgc3RyaW5ncywgdGhlIHZhbHVlcyBtdXN0IGJlIGFwcHJvcHJpYXRlIGZvciAlKClzIHN0cmluZworICAgICAgICBpbnRlcnBvbGF0aW9uLiAgTm90ZSB0aGF0IGBfX25hbWVfXycgaXMgYWx3YXlzIGFuIGludHJpbnNpYyBkZWZhdWx0OworICAgICAgICBpdHMgdmFsdWUgaXMgdGhlIHNlY3Rpb24ncyBuYW1lLgorCisgICAgc2VjdGlvbnMoKQorICAgICAgICByZXR1cm4gYWxsIHRoZSBjb25maWd1cmF0aW9uIHNlY3Rpb24gbmFtZXMsIHNhbnMgREVGQVVMVAorCisgICAgaGFzX3NlY3Rpb24oc2VjdGlvbikKKyAgICAgICAgcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHNlY3Rpb24gZXhpc3RzCisKKyAgICBoYXNfb3B0aW9uKHNlY3Rpb24sIG9wdGlvbikKKyAgICAgICAgcmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIG9wdGlvbiBleGlzdHMgaW4gdGhlIGdpdmVuIHNlY3Rpb24KKworICAgIG9wdGlvbnMoc2VjdGlvbikKKyAgICAgICAgcmV0dXJuIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbmFtZWQgc2VjdGlvbgorCisgICAgcmVhZChmaWxlbmFtZXMpCisgICAgICAgIHJlYWQgYW5kIHBhcnNlIHRoZSBsaXN0IG9mIG5hbWVkIGNvbmZpZ3VyYXRpb24gZmlsZXMsIGdpdmVuIGJ5CisgICAgICAgIG5hbWUuICBBIHNpbmdsZSBmaWxlbmFtZSBpcyBhbHNvIGFsbG93ZWQuICBOb24tZXhpc3RpbmcgZmlsZXMKKyAgICAgICAgYXJlIGlnbm9yZWQuICBSZXR1cm4gbGlzdCBvZiBzdWNjZXNzZnVsbHkgcmVhZCBmaWxlcy4KKworICAgIHJlYWRmcChmcCwgZmlsZW5hbWU9Tm9uZSkKKyAgICAgICAgcmVhZCBhbmQgcGFyc2Ugb25lIGNvbmZpZ3VyYXRpb24gZmlsZSwgZ2l2ZW4gYXMgYSBmaWxlIG9iamVjdC4KKyAgICAgICAgVGhlIGZpbGVuYW1lIGRlZmF1bHRzIHRvIGZwLm5hbWU7IGl0IGlzIG9ubHkgdXNlZCBpbiBlcnJvcgorICAgICAgICBtZXNzYWdlcyAoaWYgZnAgaGFzIG5vIGBuYW1lJyBhdHRyaWJ1dGUsIHRoZSBzdHJpbmcgYDw/Pz8+JyBpcyB1c2VkKS4KKworICAgIGdldChzZWN0aW9uLCBvcHRpb24sIHJhdz1GYWxzZSwgdmFycz1Ob25lKQorICAgICAgICByZXR1cm4gYSBzdHJpbmcgdmFsdWUgZm9yIHRoZSBuYW1lZCBvcHRpb24uICBBbGwgJSBpbnRlcnBvbGF0aW9ucyBhcmUKKyAgICAgICAgZXhwYW5kZWQgaW4gdGhlIHJldHVybiB2YWx1ZXMsIGJhc2VkIG9uIHRoZSBkZWZhdWx0cyBwYXNzZWQgaW50byB0aGUKKyAgICAgICAgY29uc3RydWN0b3IgYW5kIHRoZSBERUZBVUxUIHNlY3Rpb24uICBBZGRpdGlvbmFsIHN1YnN0aXR1dGlvbnMgbWF5IGJlCisgICAgICAgIHByb3ZpZGVkIHVzaW5nIHRoZSBgdmFycycgYXJndW1lbnQsIHdoaWNoIG11c3QgYmUgYSBkaWN0aW9uYXJ5IHdob3NlCisgICAgICAgIGNvbnRlbnRzIG92ZXJyaWRlIGFueSBwcmUtZXhpc3RpbmcgZGVmYXVsdHMuCisKKyAgICBnZXRpbnQoc2VjdGlvbiwgb3B0aW9ucykKKyAgICAgICAgbGlrZSBnZXQoKSwgYnV0IGNvbnZlcnQgdmFsdWUgdG8gYW4gaW50ZWdlcgorCisgICAgZ2V0ZmxvYXQoc2VjdGlvbiwgb3B0aW9ucykKKyAgICAgICAgbGlrZSBnZXQoKSwgYnV0IGNvbnZlcnQgdmFsdWUgdG8gYSBmbG9hdAorCisgICAgZ2V0Ym9vbGVhbihzZWN0aW9uLCBvcHRpb25zKQorICAgICAgICBsaWtlIGdldCgpLCBidXQgY29udmVydCB2YWx1ZSB0byBhIGJvb2xlYW4gKGN1cnJlbnRseSBjYXNlCisgICAgICAgIGluc2Vuc2l0aXZlbHkgZGVmaW5lZCBhcyAwLCBmYWxzZSwgbm8sIG9mZiBmb3IgRmFsc2UsIGFuZCAxLCB0cnVlLAorICAgICAgICB5ZXMsIG9uIGZvciBUcnVlKS4gIFJldHVybnMgRmFsc2Ugb3IgVHJ1ZS4KKworICAgIGl0ZW1zKHNlY3Rpb24sIHJhdz1GYWxzZSwgdmFycz1Ob25lKQorICAgICAgICByZXR1cm4gYSBsaXN0IG9mIHR1cGxlcyB3aXRoIChuYW1lLCB2YWx1ZSkgZm9yIGVhY2ggb3B0aW9uCisgICAgICAgIGluIHRoZSBzZWN0aW9uLgorCisgICAgcmVtb3ZlX3NlY3Rpb24oc2VjdGlvbikKKyAgICAgICAgcmVtb3ZlIHRoZSBnaXZlbiBmaWxlIHNlY3Rpb24gYW5kIGFsbCBpdHMgb3B0aW9ucworCisgICAgcmVtb3ZlX29wdGlvbihzZWN0aW9uLCBvcHRpb24pCisgICAgICAgIHJlbW92ZSB0aGUgZ2l2ZW4gb3B0aW9uIGZyb20gdGhlIGdpdmVuIHNlY3Rpb24KKworICAgIHNldChzZWN0aW9uLCBvcHRpb24sIHZhbHVlKQorICAgICAgICBzZXQgdGhlIGdpdmVuIG9wdGlvbgorCisgICAgd3JpdGUoZnApCisgICAgICAgIHdyaXRlIHRoZSBjb25maWd1cmF0aW9uIHN0YXRlIGluIC5pbmkgZm9ybWF0CisiIiIKKwordHJ5OgorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0IGFzIF9kZWZhdWx0X2RpY3QKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIGZhbGxiYWNrIGZvciBzZXR1cC5weSB3aGljaCBoYXNuJ3QgeWV0IGJ1aWx0IF9jb2xsZWN0aW9ucworICAgIF9kZWZhdWx0X2RpY3QgPSBkaWN0CisKK2ltcG9ydCByZQorCitfX2FsbF9fID0gWyJOb1NlY3Rpb25FcnJvciIsICJEdXBsaWNhdGVTZWN0aW9uRXJyb3IiLCAiTm9PcHRpb25FcnJvciIsCisgICAgICAgICAgICJJbnRlcnBvbGF0aW9uRXJyb3IiLCAiSW50ZXJwb2xhdGlvbkRlcHRoRXJyb3IiLAorICAgICAgICAgICAiSW50ZXJwb2xhdGlvblN5bnRheEVycm9yIiwgIlBhcnNpbmdFcnJvciIsCisgICAgICAgICAgICJNaXNzaW5nU2VjdGlvbkhlYWRlckVycm9yIiwKKyAgICAgICAgICAgIkNvbmZpZ1BhcnNlciIsICJTYWZlQ29uZmlnUGFyc2VyIiwgIlJhd0NvbmZpZ1BhcnNlciIsCisgICAgICAgICAgICJERUZBVUxUU0VDVCIsICJNQVhfSU5URVJQT0xBVElPTl9ERVBUSCJdCisKK0RFRkFVTFRTRUNUID0gIkRFRkFVTFQiCisKK01BWF9JTlRFUlBPTEFUSU9OX0RFUFRIID0gMTAKKworCisKKyMgZXhjZXB0aW9uIGNsYXNzZXMKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgQ29uZmlnUGFyc2VyIGV4Y2VwdGlvbnMuIiIiCisKKyAgICBkZWYgX2dldF9tZXNzYWdlKHNlbGYpOgorICAgICAgICAiIiJHZXR0ZXIgZm9yICdtZXNzYWdlJzsgbmVlZGVkIG9ubHkgdG8gb3ZlcnJpZGUgZGVwcmVjYXRpb24gaW4KKyAgICAgICAgQmFzZUV4Y2VwdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19tZXNzYWdlCisKKyAgICBkZWYgX3NldF9tZXNzYWdlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIiU2V0dGVyIGZvciAnbWVzc2FnZSc7IG5lZWRlZCBvbmx5IHRvIG92ZXJyaWRlIGRlcHJlY2F0aW9uIGluCisgICAgICAgIEJhc2VFeGNlcHRpb24uIiIiCisgICAgICAgIHNlbGYuX19tZXNzYWdlID0gdmFsdWUKKworICAgICMgQmFzZUV4Y2VwdGlvbi5tZXNzYWdlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDIuNi4gIFRvIHByZXZlbnQKKyAgICAjIERlcHJlY2F0aW9uV2FybmluZyBmcm9tIHBvcHBpbmcgdXAgb3ZlciB0aGlzIHByZS1leGlzdGluZyBhdHRyaWJ1dGUsIHVzZQorICAgICMgYSBuZXcgcHJvcGVydHkgdGhhdCB0YWtlcyBsb29rdXAgcHJlY2VkZW5jZS4KKyAgICBtZXNzYWdlID0gcHJvcGVydHkoX2dldF9tZXNzYWdlLCBfc2V0X21lc3NhZ2UpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbXNnPScnKToKKyAgICAgICAgc2VsZi5tZXNzYWdlID0gbXNnCisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtc2cpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1lc3NhZ2UKKworICAgIF9fc3RyX18gPSBfX3JlcHJfXworCitjbGFzcyBOb1NlY3Rpb25FcnJvcihFcnJvcik6CisgICAgIiIiUmFpc2VkIHdoZW4gbm8gc2VjdGlvbiBtYXRjaGVzIGEgcmVxdWVzdGVkIG9wdGlvbi4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZWN0aW9uKToKKyAgICAgICAgRXJyb3IuX19pbml0X18oc2VsZiwgJ05vIHNlY3Rpb246ICVyJyAlIChzZWN0aW9uLCkpCisgICAgICAgIHNlbGYuc2VjdGlvbiA9IHNlY3Rpb24KKyAgICAgICAgc2VsZi5hcmdzID0gKHNlY3Rpb24sICkKKworY2xhc3MgRHVwbGljYXRlU2VjdGlvbkVycm9yKEVycm9yKToKKyAgICAiIiJSYWlzZWQgd2hlbiBhIHNlY3Rpb24gaXMgbXVsdGlwbHktY3JlYXRlZC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZWN0aW9uKToKKyAgICAgICAgRXJyb3IuX19pbml0X18oc2VsZiwgIlNlY3Rpb24gJXIgYWxyZWFkeSBleGlzdHMiICUgc2VjdGlvbikKKyAgICAgICAgc2VsZi5zZWN0aW9uID0gc2VjdGlvbgorICAgICAgICBzZWxmLmFyZ3MgPSAoc2VjdGlvbiwgKQorCitjbGFzcyBOb09wdGlvbkVycm9yKEVycm9yKToKKyAgICAiIiJBIHJlcXVlc3RlZCBvcHRpb24gd2FzIG5vdCBmb3VuZC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb24sIHNlY3Rpb24pOgorICAgICAgICBFcnJvci5fX2luaXRfXyhzZWxmLCAiTm8gb3B0aW9uICVyIGluIHNlY3Rpb246ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb24sIHNlY3Rpb24pKQorICAgICAgICBzZWxmLm9wdGlvbiA9IG9wdGlvbgorICAgICAgICBzZWxmLnNlY3Rpb24gPSBzZWN0aW9uCisgICAgICAgIHNlbGYuYXJncyA9IChvcHRpb24sIHNlY3Rpb24pCisKK2NsYXNzIEludGVycG9sYXRpb25FcnJvcihFcnJvcik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgaW50ZXJwb2xhdGlvbi1yZWxhdGVkIGV4Y2VwdGlvbnMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9uLCBzZWN0aW9uLCBtc2cpOgorICAgICAgICBFcnJvci5fX2luaXRfXyhzZWxmLCBtc2cpCisgICAgICAgIHNlbGYub3B0aW9uID0gb3B0aW9uCisgICAgICAgIHNlbGYuc2VjdGlvbiA9IHNlY3Rpb24KKyAgICAgICAgc2VsZi5hcmdzID0gKG9wdGlvbiwgc2VjdGlvbiwgbXNnKQorCitjbGFzcyBJbnRlcnBvbGF0aW9uTWlzc2luZ09wdGlvbkVycm9yKEludGVycG9sYXRpb25FcnJvcik6CisgICAgIiIiQSBzdHJpbmcgc3Vic3RpdHV0aW9uIHJlcXVpcmVkIGEgc2V0dGluZyB3aGljaCB3YXMgbm90IGF2YWlsYWJsZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb24sIHNlY3Rpb24sIHJhd3ZhbCwgcmVmZXJlbmNlKToKKyAgICAgICAgbXNnID0gKCJCYWQgdmFsdWUgc3Vic3RpdHV0aW9uOlxuIgorICAgICAgICAgICAgICAgIlx0c2VjdGlvbjogWyVzXVxuIgorICAgICAgICAgICAgICAgIlx0b3B0aW9uIDogJXNcbiIKKyAgICAgICAgICAgICAgICJcdGtleSAgICA6ICVzXG4iCisgICAgICAgICAgICAgICAiXHRyYXd2YWwgOiAlc1xuIgorICAgICAgICAgICAgICAgJSAoc2VjdGlvbiwgb3B0aW9uLCByZWZlcmVuY2UsIHJhd3ZhbCkpCisgICAgICAgIEludGVycG9sYXRpb25FcnJvci5fX2luaXRfXyhzZWxmLCBvcHRpb24sIHNlY3Rpb24sIG1zZykKKyAgICAgICAgc2VsZi5yZWZlcmVuY2UgPSByZWZlcmVuY2UKKyAgICAgICAgc2VsZi5hcmdzID0gKG9wdGlvbiwgc2VjdGlvbiwgcmF3dmFsLCByZWZlcmVuY2UpCisKK2NsYXNzIEludGVycG9sYXRpb25TeW50YXhFcnJvcihJbnRlcnBvbGF0aW9uRXJyb3IpOgorICAgICIiIlJhaXNlZCB3aGVuIHRoZSBzb3VyY2UgdGV4dCBpbnRvIHdoaWNoIHN1YnN0aXR1dGlvbnMgYXJlIG1hZGUKKyAgICBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSByZXF1aXJlZCBzeW50YXguIiIiCisKK2NsYXNzIEludGVycG9sYXRpb25EZXB0aEVycm9yKEludGVycG9sYXRpb25FcnJvcik6CisgICAgIiIiUmFpc2VkIHdoZW4gc3Vic3RpdHV0aW9ucyBhcmUgbmVzdGVkIHRvbyBkZWVwbHkuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9uLCBzZWN0aW9uLCByYXd2YWwpOgorICAgICAgICBtc2cgPSAoIlZhbHVlIGludGVycG9sYXRpb24gdG9vIGRlZXBseSByZWN1cnNpdmU6XG4iCisgICAgICAgICAgICAgICAiXHRzZWN0aW9uOiBbJXNdXG4iCisgICAgICAgICAgICAgICAiXHRvcHRpb24gOiAlc1xuIgorICAgICAgICAgICAgICAgIlx0cmF3dmFsIDogJXNcbiIKKyAgICAgICAgICAgICAgICUgKHNlY3Rpb24sIG9wdGlvbiwgcmF3dmFsKSkKKyAgICAgICAgSW50ZXJwb2xhdGlvbkVycm9yLl9faW5pdF9fKHNlbGYsIG9wdGlvbiwgc2VjdGlvbiwgbXNnKQorICAgICAgICBzZWxmLmFyZ3MgPSAob3B0aW9uLCBzZWN0aW9uLCByYXd2YWwpCisKK2NsYXNzIFBhcnNpbmdFcnJvcihFcnJvcik6CisgICAgIiIiUmFpc2VkIHdoZW4gYSBjb25maWd1cmF0aW9uIGZpbGUgZG9lcyBub3QgZm9sbG93IGxlZ2FsIHN5bnRheC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIEVycm9yLl9faW5pdF9fKHNlbGYsICdGaWxlIGNvbnRhaW5zIHBhcnNpbmcgZXJyb3JzOiAlcycgJSBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuZXJyb3JzID0gW10KKyAgICAgICAgc2VsZi5hcmdzID0gKGZpbGVuYW1lLCApCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIGxpbmVubywgbGluZSk6CisgICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZCgobGluZW5vLCBsaW5lKSkKKyAgICAgICAgc2VsZi5tZXNzYWdlICs9ICdcblx0W2xpbmUgJTJkXTogJXMnICUgKGxpbmVubywgbGluZSkKKworY2xhc3MgTWlzc2luZ1NlY3Rpb25IZWFkZXJFcnJvcihQYXJzaW5nRXJyb3IpOgorICAgICIiIlJhaXNlZCB3aGVuIGEga2V5LXZhbHVlIHBhaXIgaXMgZm91bmQgYmVmb3JlIGFueSBzZWN0aW9uIGhlYWRlci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lKToKKyAgICAgICAgRXJyb3IuX19pbml0X18oCisgICAgICAgICAgICBzZWxmLAorICAgICAgICAgICAgJ0ZpbGUgY29udGFpbnMgbm8gc2VjdGlvbiBoZWFkZXJzLlxuZmlsZTogJXMsIGxpbmU6ICVkXG4lcicgJQorICAgICAgICAgICAgKGZpbGVuYW1lLCBsaW5lbm8sIGxpbmUpKQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKyAgICAgICAgc2VsZi5saW5lID0gbGluZQorICAgICAgICBzZWxmLmFyZ3MgPSAoZmlsZW5hbWUsIGxpbmVubywgbGluZSkKKworCitjbGFzcyBSYXdDb25maWdQYXJzZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlZmF1bHRzPU5vbmUsIGRpY3RfdHlwZT1fZGVmYXVsdF9kaWN0LAorICAgICAgICAgICAgICAgICBhbGxvd19ub192YWx1ZT1GYWxzZSk6CisgICAgICAgIHNlbGYuX2RpY3QgPSBkaWN0X3R5cGUKKyAgICAgICAgc2VsZi5fc2VjdGlvbnMgPSBzZWxmLl9kaWN0KCkKKyAgICAgICAgc2VsZi5fZGVmYXVsdHMgPSBzZWxmLl9kaWN0KCkKKyAgICAgICAgaWYgYWxsb3dfbm9fdmFsdWU6CisgICAgICAgICAgICBzZWxmLl9vcHRjcmUgPSBzZWxmLk9QVENSRV9OVgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fb3B0Y3JlID0gc2VsZi5PUFRDUkUKKyAgICAgICAgaWYgZGVmYXVsdHM6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkZWZhdWx0cy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlZmF1bHRzW3NlbGYub3B0aW9ueGZvcm0oa2V5KV0gPSB2YWx1ZQorCisgICAgZGVmIGRlZmF1bHRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZGVmYXVsdHMKKworICAgIGRlZiBzZWN0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzZWN0aW9uIG5hbWVzLCBleGNsdWRpbmcgW0RFRkFVTFRdIiIiCisgICAgICAgICMgc2VsZi5fc2VjdGlvbnMgd2lsbCBuZXZlciBoYXZlIFtERUZBVUxUXSBpbiBpdAorICAgICAgICByZXR1cm4gc2VsZi5fc2VjdGlvbnMua2V5cygpCisKKyAgICBkZWYgYWRkX3NlY3Rpb24oc2VsZiwgc2VjdGlvbik6CisgICAgICAgICIiIkNyZWF0ZSBhIG5ldyBzZWN0aW9uIGluIHRoZSBjb25maWd1cmF0aW9uLgorCisgICAgICAgIFJhaXNlIER1cGxpY2F0ZVNlY3Rpb25FcnJvciBpZiBhIHNlY3Rpb24gYnkgdGhlIHNwZWNpZmllZCBuYW1lCisgICAgICAgIGFscmVhZHkgZXhpc3RzLiBSYWlzZSBWYWx1ZUVycm9yIGlmIG5hbWUgaXMgREVGQVVMVCBvciBhbnkgb2YgaXQncworICAgICAgICBjYXNlLWluc2Vuc2l0aXZlIHZhcmlhbnRzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VjdGlvbi5sb3dlcigpID09ICJkZWZhdWx0IjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdJbnZhbGlkIHNlY3Rpb24gbmFtZTogJXMnICUgc2VjdGlvbgorCisgICAgICAgIGlmIHNlY3Rpb24gaW4gc2VsZi5fc2VjdGlvbnM6CisgICAgICAgICAgICByYWlzZSBEdXBsaWNhdGVTZWN0aW9uRXJyb3Ioc2VjdGlvbikKKyAgICAgICAgc2VsZi5fc2VjdGlvbnNbc2VjdGlvbl0gPSBzZWxmLl9kaWN0KCkKKworICAgIGRlZiBoYXNfc2VjdGlvbihzZWxmLCBzZWN0aW9uKToKKyAgICAgICAgIiIiSW5kaWNhdGUgd2hldGhlciB0aGUgbmFtZWQgc2VjdGlvbiBpcyBwcmVzZW50IGluIHRoZSBjb25maWd1cmF0aW9uLgorCisgICAgICAgIFRoZSBERUZBVUxUIHNlY3Rpb24gaXMgbm90IGFja25vd2xlZGdlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWN0aW9uIGluIHNlbGYuX3NlY3Rpb25zCisKKyAgICBkZWYgb3B0aW9ucyhzZWxmLCBzZWN0aW9uKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBvcHRpb24gbmFtZXMgZm9yIHRoZSBnaXZlbiBzZWN0aW9uIG5hbWUuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wdHMgPSBzZWxmLl9zZWN0aW9uc1tzZWN0aW9uXS5jb3B5KCkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgTm9TZWN0aW9uRXJyb3Ioc2VjdGlvbikKKyAgICAgICAgb3B0cy51cGRhdGUoc2VsZi5fZGVmYXVsdHMpCisgICAgICAgIGlmICdfX25hbWVfXycgaW4gb3B0czoKKyAgICAgICAgICAgIGRlbCBvcHRzWydfX25hbWVfXyddCisgICAgICAgIHJldHVybiBvcHRzLmtleXMoKQorCisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWVzKToKKyAgICAgICAgIiIiUmVhZCBhbmQgcGFyc2UgYSBmaWxlbmFtZSBvciBhIGxpc3Qgb2YgZmlsZW5hbWVzLgorCisgICAgICAgIEZpbGVzIHRoYXQgY2Fubm90IGJlIG9wZW5lZCBhcmUgc2lsZW50bHkgaWdub3JlZDsgdGhpcyBpcworICAgICAgICBkZXNpZ25lZCBzbyB0aGF0IHlvdSBjYW4gc3BlY2lmeSBhIGxpc3Qgb2YgcG90ZW50aWFsCisgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZSBsb2NhdGlvbnMgKGUuZy4gY3VycmVudCBkaXJlY3RvcnksIHVzZXIncworICAgICAgICBob21lIGRpcmVjdG9yeSwgc3lzdGVtd2lkZSBkaXJlY3RvcnkpLCBhbmQgYWxsIGV4aXN0aW5nCisgICAgICAgIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdGhlIGxpc3Qgd2lsbCBiZSByZWFkLiAgQSBzaW5nbGUKKyAgICAgICAgZmlsZW5hbWUgbWF5IGFsc28gYmUgZ2l2ZW4uCisKKyAgICAgICAgUmV0dXJuIGxpc3Qgb2Ygc3VjY2Vzc2Z1bGx5IHJlYWQgZmlsZXMuCisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lcywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBmaWxlbmFtZXMgPSBbZmlsZW5hbWVzXQorICAgICAgICByZWFkX29rID0gW10KKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5fcmVhZChmcCwgZmlsZW5hbWUpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICByZWFkX29rLmFwcGVuZChmaWxlbmFtZSkKKyAgICAgICAgcmV0dXJuIHJlYWRfb2sKKworICAgIGRlZiByZWFkZnAoc2VsZiwgZnAsIGZpbGVuYW1lPU5vbmUpOgorICAgICAgICAiIiJMaWtlIHJlYWQoKSBidXQgdGhlIGFyZ3VtZW50IG11c3QgYmUgYSBmaWxlLWxpa2Ugb2JqZWN0LgorCisgICAgICAgIFRoZSBgZnAnIGFyZ3VtZW50IG11c3QgaGF2ZSBhIGByZWFkbGluZScgbWV0aG9kLiAgT3B0aW9uYWwKKyAgICAgICAgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBgZmlsZW5hbWUnLCB3aGljaCBpZiBub3QgZ2l2ZW4sIGlzCisgICAgICAgIHRha2VuIGZyb20gZnAubmFtZS4gIElmIGZwIGhhcyBubyBgbmFtZScgYXR0cmlidXRlLCBgPD8/Pz4nIGlzCisgICAgICAgIHVzZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmcC5uYW1lCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAnPD8/Pz4nCisgICAgICAgIHNlbGYuX3JlYWQoZnAsIGZpbGVuYW1lKQorCisgICAgZGVmIGdldChzZWxmLCBzZWN0aW9uLCBvcHRpb24pOgorICAgICAgICBvcHQgPSBzZWxmLm9wdGlvbnhmb3JtKG9wdGlvbikKKyAgICAgICAgaWYgc2VjdGlvbiBub3QgaW4gc2VsZi5fc2VjdGlvbnM6CisgICAgICAgICAgICBpZiBzZWN0aW9uICE9IERFRkFVTFRTRUNUOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vU2VjdGlvbkVycm9yKHNlY3Rpb24pCisgICAgICAgICAgICBpZiBvcHQgaW4gc2VsZi5fZGVmYXVsdHM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RlZmF1bHRzW29wdF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgTm9PcHRpb25FcnJvcihvcHRpb24sIHNlY3Rpb24pCisgICAgICAgIGVsaWYgb3B0IGluIHNlbGYuX3NlY3Rpb25zW3NlY3Rpb25dOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NlY3Rpb25zW3NlY3Rpb25dW29wdF0KKyAgICAgICAgZWxpZiBvcHQgaW4gc2VsZi5fZGVmYXVsdHM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGVmYXVsdHNbb3B0XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgTm9PcHRpb25FcnJvcihvcHRpb24sIHNlY3Rpb24pCisKKyAgICBkZWYgaXRlbXMoc2VsZiwgc2VjdGlvbik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGQyID0gc2VsZi5fc2VjdGlvbnNbc2VjdGlvbl0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgc2VjdGlvbiAhPSBERUZBVUxUU0VDVDoKKyAgICAgICAgICAgICAgICByYWlzZSBOb1NlY3Rpb25FcnJvcihzZWN0aW9uKQorICAgICAgICAgICAgZDIgPSBzZWxmLl9kaWN0KCkKKyAgICAgICAgZCA9IHNlbGYuX2RlZmF1bHRzLmNvcHkoKQorICAgICAgICBkLnVwZGF0ZShkMikKKyAgICAgICAgaWYgIl9fbmFtZV9fIiBpbiBkOgorICAgICAgICAgICAgZGVsIGRbIl9fbmFtZV9fIl0KKyAgICAgICAgcmV0dXJuIGQuaXRlbXMoKQorCisgICAgZGVmIF9nZXQoc2VsZiwgc2VjdGlvbiwgY29udiwgb3B0aW9uKToKKyAgICAgICAgcmV0dXJuIGNvbnYoc2VsZi5nZXQoc2VjdGlvbiwgb3B0aW9uKSkKKworICAgIGRlZiBnZXRpbnQoc2VsZiwgc2VjdGlvbiwgb3B0aW9uKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldChzZWN0aW9uLCBpbnQsIG9wdGlvbikKKworICAgIGRlZiBnZXRmbG9hdChzZWxmLCBzZWN0aW9uLCBvcHRpb24pOgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KHNlY3Rpb24sIGZsb2F0LCBvcHRpb24pCisKKyAgICBfYm9vbGVhbl9zdGF0ZXMgPSB7JzEnOiBUcnVlLCAneWVzJzogVHJ1ZSwgJ3RydWUnOiBUcnVlLCAnb24nOiBUcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAnMCc6IEZhbHNlLCAnbm8nOiBGYWxzZSwgJ2ZhbHNlJzogRmFsc2UsICdvZmYnOiBGYWxzZX0KKworICAgIGRlZiBnZXRib29sZWFuKHNlbGYsIHNlY3Rpb24sIG9wdGlvbik6CisgICAgICAgIHYgPSBzZWxmLmdldChzZWN0aW9uLCBvcHRpb24pCisgICAgICAgIGlmIHYubG93ZXIoKSBub3QgaW4gc2VsZi5fYm9vbGVhbl9zdGF0ZXM6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnTm90IGEgYm9vbGVhbjogJXMnICUgdgorICAgICAgICByZXR1cm4gc2VsZi5fYm9vbGVhbl9zdGF0ZXNbdi5sb3dlcigpXQorCisgICAgZGVmIG9wdGlvbnhmb3JtKHNlbGYsIG9wdGlvbnN0cik6CisgICAgICAgIHJldHVybiBvcHRpb25zdHIubG93ZXIoKQorCisgICAgZGVmIGhhc19vcHRpb24oc2VsZiwgc2VjdGlvbiwgb3B0aW9uKToKKyAgICAgICAgIiIiQ2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSBnaXZlbiBvcHRpb24gaW4gYSBnaXZlbiBzZWN0aW9uLiIiIgorICAgICAgICBpZiBub3Qgc2VjdGlvbiBvciBzZWN0aW9uID09IERFRkFVTFRTRUNUOgorICAgICAgICAgICAgb3B0aW9uID0gc2VsZi5vcHRpb254Zm9ybShvcHRpb24pCisgICAgICAgICAgICByZXR1cm4gb3B0aW9uIGluIHNlbGYuX2RlZmF1bHRzCisgICAgICAgIGVsaWYgc2VjdGlvbiBub3QgaW4gc2VsZi5fc2VjdGlvbnM6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wdGlvbiA9IHNlbGYub3B0aW9ueGZvcm0ob3B0aW9uKQorICAgICAgICAgICAgcmV0dXJuIChvcHRpb24gaW4gc2VsZi5fc2VjdGlvbnNbc2VjdGlvbl0KKyAgICAgICAgICAgICAgICAgICAgb3Igb3B0aW9uIGluIHNlbGYuX2RlZmF1bHRzKQorCisgICAgZGVmIHNldChzZWxmLCBzZWN0aW9uLCBvcHRpb24sIHZhbHVlPU5vbmUpOgorICAgICAgICAiIiJTZXQgYW4gb3B0aW9uLiIiIgorICAgICAgICBpZiBub3Qgc2VjdGlvbiBvciBzZWN0aW9uID09IERFRkFVTFRTRUNUOgorICAgICAgICAgICAgc2VjdGRpY3QgPSBzZWxmLl9kZWZhdWx0cworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlY3RkaWN0ID0gc2VsZi5fc2VjdGlvbnNbc2VjdGlvbl0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBOb1NlY3Rpb25FcnJvcihzZWN0aW9uKQorICAgICAgICBzZWN0ZGljdFtzZWxmLm9wdGlvbnhmb3JtKG9wdGlvbildID0gdmFsdWUKKworICAgIGRlZiB3cml0ZShzZWxmLCBmcCk6CisgICAgICAgICIiIldyaXRlIGFuIC5pbmktZm9ybWF0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIHN0YXRlLiIiIgorICAgICAgICBpZiBzZWxmLl9kZWZhdWx0czoKKyAgICAgICAgICAgIGZwLndyaXRlKCJbJXNdXG4iICUgREVGQVVMVFNFQ1QpCisgICAgICAgICAgICBmb3IgKGtleSwgdmFsdWUpIGluIHNlbGYuX2RlZmF1bHRzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgZnAud3JpdGUoIiVzID0gJXNcbiIgJSAoa2V5LCBzdHIodmFsdWUpLnJlcGxhY2UoJ1xuJywgJ1xuXHQnKSkpCisgICAgICAgICAgICBmcC53cml0ZSgiXG4iKQorICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWxmLl9zZWN0aW9uczoKKyAgICAgICAgICAgIGZwLndyaXRlKCJbJXNdXG4iICUgc2VjdGlvbikKKyAgICAgICAgICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gc2VsZi5fc2VjdGlvbnNbc2VjdGlvbl0uaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBrZXkgPT0gIl9fbmFtZV9fIjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgaXMgbm90IE5vbmUpIG9yIChzZWxmLl9vcHRjcmUgPT0gc2VsZi5PUFRDUkUpOgorICAgICAgICAgICAgICAgICAgICBrZXkgPSAiID0gIi5qb2luKChrZXksIHN0cih2YWx1ZSkucmVwbGFjZSgnXG4nLCAnXG5cdCcpKSkKKyAgICAgICAgICAgICAgICBmcC53cml0ZSgiJXNcbiIgJSAoa2V5KSkKKyAgICAgICAgICAgIGZwLndyaXRlKCJcbiIpCisKKyAgICBkZWYgcmVtb3ZlX29wdGlvbihzZWxmLCBzZWN0aW9uLCBvcHRpb24pOgorICAgICAgICAiIiJSZW1vdmUgYW4gb3B0aW9uLiIiIgorICAgICAgICBpZiBub3Qgc2VjdGlvbiBvciBzZWN0aW9uID09IERFRkFVTFRTRUNUOgorICAgICAgICAgICAgc2VjdGRpY3QgPSBzZWxmLl9kZWZhdWx0cworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlY3RkaWN0ID0gc2VsZi5fc2VjdGlvbnNbc2VjdGlvbl0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBOb1NlY3Rpb25FcnJvcihzZWN0aW9uKQorICAgICAgICBvcHRpb24gPSBzZWxmLm9wdGlvbnhmb3JtKG9wdGlvbikKKyAgICAgICAgZXhpc3RlZCA9IG9wdGlvbiBpbiBzZWN0ZGljdAorICAgICAgICBpZiBleGlzdGVkOgorICAgICAgICAgICAgZGVsIHNlY3RkaWN0W29wdGlvbl0KKyAgICAgICAgcmV0dXJuIGV4aXN0ZWQKKworICAgIGRlZiByZW1vdmVfc2VjdGlvbihzZWxmLCBzZWN0aW9uKToKKyAgICAgICAgIiIiUmVtb3ZlIGEgZmlsZSBzZWN0aW9uLiIiIgorICAgICAgICBleGlzdGVkID0gc2VjdGlvbiBpbiBzZWxmLl9zZWN0aW9ucworICAgICAgICBpZiBleGlzdGVkOgorICAgICAgICAgICAgZGVsIHNlbGYuX3NlY3Rpb25zW3NlY3Rpb25dCisgICAgICAgIHJldHVybiBleGlzdGVkCisKKyAgICAjCisgICAgIyBSZWd1bGFyIGV4cHJlc3Npb25zIGZvciBwYXJzaW5nIHNlY3Rpb24gaGVhZGVycyBhbmQgb3B0aW9ucy4KKyAgICAjCisgICAgU0VDVENSRSA9IHJlLmNvbXBpbGUoCisgICAgICAgIHInXFsnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBbCisgICAgICAgIHInKD9QPGhlYWRlcj5bXl1dKyknICAgICAgICAgICAgICAgICAgIyB2ZXJ5IHBlcm1pc3NpdmUhCisgICAgICAgIHInXF0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBdCisgICAgICAgICkKKyAgICBPUFRDUkUgPSByZS5jb21waWxlKAorICAgICAgICByJyg/UDxvcHRpb24+W146PVxzXVteOj1dKiknICAgICAgICAgICMgdmVyeSBwZXJtaXNzaXZlIQorICAgICAgICByJ1xzKig/UDx2aT5bOj1dKVxzKicgICAgICAgICAgICAgICAgICMgYW55IG51bWJlciBvZiBzcGFjZS90YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb2xsb3dlZCBieSBzZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChlaXRoZXIgOiBvciA9KSwgZm9sbG93ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGJ5IGFueSAjIHNwYWNlL3RhYgorICAgICAgICByJyg/UDx2YWx1ZT4uKikkJyAgICAgICAgICAgICAgICAgICAgICMgZXZlcnl0aGluZyB1cCB0byBlb2wKKyAgICAgICAgKQorICAgIE9QVENSRV9OViA9IHJlLmNvbXBpbGUoCisgICAgICAgIHInKD9QPG9wdGlvbj5bXjo9XHNdW146PV0qKScgICAgICAgICAgIyB2ZXJ5IHBlcm1pc3NpdmUhCisgICAgICAgIHInXHMqKD86JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbnkgbnVtYmVyIG9mIHNwYWNlL3RhYiwKKyAgICAgICAgcicoP1A8dmk+Wzo9XSlccyonICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNlcGFyYXRvciAoZWl0aGVyIDogb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjID0pLCBmb2xsb3dlZCBieSBhbnkgIworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3BhY2UvdGFiCisgICAgICAgIHInKD9QPHZhbHVlPi4qKSk/JCcgICAgICAgICAgICAgICAgICAgIyBldmVyeXRoaW5nIHVwIHRvIGVvbAorICAgICAgICApCisKKyAgICBkZWYgX3JlYWQoc2VsZiwgZnAsIGZwbmFtZSk6CisgICAgICAgICIiIlBhcnNlIGEgc2VjdGlvbmVkIHNldHVwIGZpbGUuCisKKyAgICAgICAgVGhlIHNlY3Rpb25zIGluIHNldHVwIGZpbGUgY29udGFpbnMgYSB0aXRsZSBsaW5lIGF0IHRoZSB0b3AsCisgICAgICAgIGluZGljYXRlZCBieSBhIG5hbWUgaW4gc3F1YXJlIGJyYWNrZXRzIChgW10nKSwgcGx1cyBrZXkvdmFsdWUKKyAgICAgICAgb3B0aW9ucyBsaW5lcywgaW5kaWNhdGVkIGJ5IGBuYW1lOiB2YWx1ZScgZm9ybWF0IGxpbmVzLgorICAgICAgICBDb250aW51YXRpb25zIGFyZSByZXByZXNlbnRlZCBieSBhbiBlbWJlZGRlZCBuZXdsaW5lIHRoZW4KKyAgICAgICAgbGVhZGluZyB3aGl0ZXNwYWNlLiAgQmxhbmsgbGluZXMsIGxpbmVzIGJlZ2lubmluZyB3aXRoIGEgJyMnLAorICAgICAgICBhbmQganVzdCBhYm91dCBldmVyeXRoaW5nIGVsc2UgYXJlIGlnbm9yZWQuCisgICAgICAgICIiIgorICAgICAgICBjdXJzZWN0ID0gTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICMgTm9uZSwgb3IgYSBkaWN0aW9uYXJ5CisgICAgICAgIG9wdG5hbWUgPSBOb25lCisgICAgICAgIGxpbmVubyA9IDAKKyAgICAgICAgZSA9IE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vbmUsIG9yIGFuIGV4Y2VwdGlvbgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBsaW5lbm8gPSBsaW5lbm8gKyAxCisgICAgICAgICAgICAjIGNvbW1lbnQgb3IgYmxhbmsgbGluZT8KKyAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKSA9PSAnJyBvciBsaW5lWzBdIGluICcjOyc6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGxpbmUuc3BsaXQoTm9uZSwgMSlbMF0ubG93ZXIoKSA9PSAncmVtJyBhbmQgbGluZVswXSBpbiAiclIiOgorICAgICAgICAgICAgICAgICMgbm8gbGVhZGluZyB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgY29udGludWF0aW9uIGxpbmU/CisgICAgICAgICAgICBpZiBsaW5lWzBdLmlzc3BhY2UoKSBhbmQgY3Vyc2VjdCBpcyBub3QgTm9uZSBhbmQgb3B0bmFtZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgICAgIGlmIHZhbHVlOgorICAgICAgICAgICAgICAgICAgICBjdXJzZWN0W29wdG5hbWVdLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgICAgICMgYSBzZWN0aW9uIGhlYWRlciBvciBvcHRpb24gaGVhZGVyPworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGlzIGl0IGEgc2VjdGlvbiBoZWFkZXI/CisgICAgICAgICAgICAgICAgbW8gPSBzZWxmLlNFQ1RDUkUubWF0Y2gobGluZSkKKyAgICAgICAgICAgICAgICBpZiBtbzoKKyAgICAgICAgICAgICAgICAgICAgc2VjdG5hbWUgPSBtby5ncm91cCgnaGVhZGVyJykKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VjdG5hbWUgaW4gc2VsZi5fc2VjdGlvbnM6CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJzZWN0ID0gc2VsZi5fc2VjdGlvbnNbc2VjdG5hbWVdCisgICAgICAgICAgICAgICAgICAgIGVsaWYgc2VjdG5hbWUgPT0gREVGQVVMVFNFQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJzZWN0ID0gc2VsZi5fZGVmYXVsdHMKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNlY3QgPSBzZWxmLl9kaWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNlY3RbJ19fbmFtZV9fJ10gPSBzZWN0bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2VjdGlvbnNbc2VjdG5hbWVdID0gY3Vyc2VjdAorICAgICAgICAgICAgICAgICAgICAjIFNvIHNlY3Rpb25zIGNhbid0IHN0YXJ0IHdpdGggYSBjb250aW51YXRpb24gbGluZQorICAgICAgICAgICAgICAgICAgICBvcHRuYW1lID0gTm9uZQorICAgICAgICAgICAgICAgICMgbm8gc2VjdGlvbiBoZWFkZXIgaW4gdGhlIGZpbGU/CisgICAgICAgICAgICAgICAgZWxpZiBjdXJzZWN0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE1pc3NpbmdTZWN0aW9uSGVhZGVyRXJyb3IoZnBuYW1lLCBsaW5lbm8sIGxpbmUpCisgICAgICAgICAgICAgICAgIyBhbiBvcHRpb24gbGluZT8KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtbyA9IHNlbGYuX29wdGNyZS5tYXRjaChsaW5lKQorICAgICAgICAgICAgICAgICAgICBpZiBtbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdG5hbWUsIHZpLCBvcHR2YWwgPSBtby5ncm91cCgnb3B0aW9uJywgJ3ZpJywgJ3ZhbHVlJykKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdG5hbWUgPSBzZWxmLm9wdGlvbnhmb3JtKG9wdG5hbWUucnN0cmlwKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgY2hlY2sgaXMgZmluZSBiZWNhdXNlIHRoZSBPUFRDUkUgY2Fubm90CisgICAgICAgICAgICAgICAgICAgICAgICAjIG1hdGNoIGlmIGl0IHdvdWxkIHNldCBvcHR2YWwgdG8gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3B0dmFsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZpIGluICgnPScsICc6JykgYW5kICc7JyBpbiBvcHR2YWw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJzsnIGlzIGEgY29tbWVudCBkZWxpbWl0ZXIgb25seSBpZiBpdCBmb2xsb3dzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBzcGFjaW5nIGNoYXJhY3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBvcHR2YWwuZmluZCgnOycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcyAhPSAtMSBhbmQgb3B0dmFsW3Bvcy0xXS5pc3NwYWNlKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHR2YWwgPSBvcHR2YWxbOnBvc10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHR2YWwgPSBvcHR2YWwuc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWxsb3cgZW1wdHkgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3B0dmFsID09ICciIic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHZhbCA9ICcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc2VjdFtvcHRuYW1lXSA9IFtvcHR2YWxdCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdmFsdWVsZXNzIG9wdGlvbiBoYW5kbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNlY3Rbb3B0bmFtZV0gPSBvcHR2YWwKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYSBub24tZmF0YWwgcGFyc2luZyBlcnJvciBvY2N1cnJlZC4gIHNldCB1cCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZXhjZXB0aW9uIGJ1dCBrZWVwIGdvaW5nLiB0aGUgZXhjZXB0aW9uIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgcmFpc2VkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIHdpbGwgY29udGFpbiBhCisgICAgICAgICAgICAgICAgICAgICAgICAjIGxpc3Qgb2YgYWxsIGJvZ3VzIGxpbmVzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gUGFyc2luZ0Vycm9yKGZwbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuYXBwZW5kKGxpbmVubywgcmVwcihsaW5lKSkKKyAgICAgICAgIyBpZiBhbnkgcGFyc2luZyBlcnJvcnMgb2NjdXJyZWQsIHJhaXNlIGFuIGV4Y2VwdGlvbgorICAgICAgICBpZiBlOgorICAgICAgICAgICAgcmFpc2UgZQorCisgICAgICAgICMgam9pbiB0aGUgbXVsdGktbGluZSB2YWx1ZXMgY29sbGVjdGVkIHdoaWxlIHJlYWRpbmcKKyAgICAgICAgYWxsX3NlY3Rpb25zID0gW3NlbGYuX2RlZmF1bHRzXQorICAgICAgICBhbGxfc2VjdGlvbnMuZXh0ZW5kKHNlbGYuX3NlY3Rpb25zLnZhbHVlcygpKQorICAgICAgICBmb3Igb3B0aW9ucyBpbiBhbGxfc2VjdGlvbnM6CisgICAgICAgICAgICBmb3IgbmFtZSwgdmFsIGluIG9wdGlvbnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbCwgbGlzdCk6CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNbbmFtZV0gPSAnXG4nLmpvaW4odmFsKQorCitpbXBvcnQgVXNlckRpY3QgYXMgX1VzZXJEaWN0CisKK2NsYXNzIF9DaGFpbm1hcChfVXNlckRpY3QuRGljdE1peGluKToKKyAgICAiIiJDb21iaW5lIG11bHRpcGxlIG1hcHBpbmdzIGZvciBzdWNjZXNzaXZlIGxvb2t1cHMuCisKKyAgICBGb3IgZXhhbXBsZSwgdG8gZW11bGF0ZSBQeXRob24ncyBub3JtYWwgbG9va3VwIHNlcXVlbmNlOgorCisgICAgICAgIGltcG9ydCBfX2J1aWx0aW5fXworICAgICAgICBweWxvb2t1cCA9IF9DaGFpbm1hcChsb2NhbHMoKSwgZ2xvYmFscygpLCB2YXJzKF9fYnVpbHRpbl9fKSkKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqbWFwcyk6CisgICAgICAgIHNlbGYuX21hcHMgPSBtYXBzCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgZm9yIG1hcHBpbmcgaW4gc2VsZi5fbWFwczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGluZ1trZXldCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgc2VlbiA9IHNldCgpCisgICAgICAgIGZvciBtYXBwaW5nIGluIHNlbGYuX21hcHM6CisgICAgICAgICAgICBmb3Iga2V5IGluIG1hcHBpbmc6CisgICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWVuOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGtleSkKKyAgICAgICAgICAgICAgICAgICAgc2Vlbi5hZGQoa2V5KQorICAgICAgICByZXR1cm4gcmVzdWx0CisKK2NsYXNzIENvbmZpZ1BhcnNlcihSYXdDb25maWdQYXJzZXIpOgorCisgICAgZGVmIGdldChzZWxmLCBzZWN0aW9uLCBvcHRpb24sIHJhdz1GYWxzZSwgdmFycz1Ob25lKToKKyAgICAgICAgIiIiR2V0IGFuIG9wdGlvbiB2YWx1ZSBmb3IgYSBnaXZlbiBzZWN0aW9uLgorCisgICAgICAgIElmIGB2YXJzJyBpcyBwcm92aWRlZCwgaXQgbXVzdCBiZSBhIGRpY3Rpb25hcnkuIFRoZSBvcHRpb24gaXMgbG9va2VkIHVwCisgICAgICAgIGluIGB2YXJzJyAoaWYgcHJvdmlkZWQpLCBgc2VjdGlvbicsIGFuZCBpbiBgZGVmYXVsdHMnIGluIHRoYXQgb3JkZXIuCisKKyAgICAgICAgQWxsICUgaW50ZXJwb2xhdGlvbnMgYXJlIGV4cGFuZGVkIGluIHRoZSByZXR1cm4gdmFsdWVzLCB1bmxlc3MgdGhlCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50IGByYXcnIGlzIHRydWUuIFZhbHVlcyBmb3IgaW50ZXJwb2xhdGlvbiBrZXlzIGFyZQorICAgICAgICBsb29rZWQgdXAgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZSBvcHRpb24uCisKKyAgICAgICAgVGhlIHNlY3Rpb24gREVGQVVMVCBpcyBzcGVjaWFsLgorICAgICAgICAiIiIKKyAgICAgICAgc2VjdGlvbmRpY3QgPSB7fQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWN0aW9uZGljdCA9IHNlbGYuX3NlY3Rpb25zW3NlY3Rpb25dCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGlmIHNlY3Rpb24gIT0gREVGQVVMVFNFQ1Q6CisgICAgICAgICAgICAgICAgcmFpc2UgTm9TZWN0aW9uRXJyb3Ioc2VjdGlvbikKKyAgICAgICAgIyBVcGRhdGUgd2l0aCB0aGUgZW50cnkgc3BlY2lmaWMgdmFyaWFibGVzCisgICAgICAgIHZhcmRpY3QgPSB7fQorICAgICAgICBpZiB2YXJzOgorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gdmFycy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHZhcmRpY3Rbc2VsZi5vcHRpb254Zm9ybShrZXkpXSA9IHZhbHVlCisgICAgICAgIGQgPSBfQ2hhaW5tYXAodmFyZGljdCwgc2VjdGlvbmRpY3QsIHNlbGYuX2RlZmF1bHRzKQorICAgICAgICBvcHRpb24gPSBzZWxmLm9wdGlvbnhmb3JtKG9wdGlvbikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBkW29wdGlvbl0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgTm9PcHRpb25FcnJvcihvcHRpb24sIHNlY3Rpb24pCisKKyAgICAgICAgaWYgcmF3IG9yIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9pbnRlcnBvbGF0ZShzZWN0aW9uLCBvcHRpb24sIHZhbHVlLCBkKQorCisgICAgZGVmIGl0ZW1zKHNlbGYsIHNlY3Rpb24sIHJhdz1GYWxzZSwgdmFycz1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiB0dXBsZXMgd2l0aCAobmFtZSwgdmFsdWUpIGZvciBlYWNoIG9wdGlvbgorICAgICAgICBpbiB0aGUgc2VjdGlvbi4KKworICAgICAgICBBbGwgJSBpbnRlcnBvbGF0aW9ucyBhcmUgZXhwYW5kZWQgaW4gdGhlIHJldHVybiB2YWx1ZXMsIGJhc2VkIG9uIHRoZQorICAgICAgICBkZWZhdWx0cyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IsIHVubGVzcyB0aGUgb3B0aW9uYWwgYXJndW1lbnQKKyAgICAgICAgYHJhdycgaXMgdHJ1ZS4gIEFkZGl0aW9uYWwgc3Vic3RpdHV0aW9ucyBtYXkgYmUgcHJvdmlkZWQgdXNpbmcgdGhlCisgICAgICAgIGB2YXJzJyBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2hvc2UgY29udGVudHMgb3ZlcnJpZGVzCisgICAgICAgIGFueSBwcmUtZXhpc3RpbmcgZGVmYXVsdHMuCisKKyAgICAgICAgVGhlIHNlY3Rpb24gREVGQVVMVCBpcyBzcGVjaWFsLgorICAgICAgICAiIiIKKyAgICAgICAgZCA9IHNlbGYuX2RlZmF1bHRzLmNvcHkoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkLnVwZGF0ZShzZWxmLl9zZWN0aW9uc1tzZWN0aW9uXSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgc2VjdGlvbiAhPSBERUZBVUxUU0VDVDoKKyAgICAgICAgICAgICAgICByYWlzZSBOb1NlY3Rpb25FcnJvcihzZWN0aW9uKQorICAgICAgICAjIFVwZGF0ZSB3aXRoIHRoZSBlbnRyeSBzcGVjaWZpYyB2YXJpYWJsZXMKKyAgICAgICAgaWYgdmFyczoKKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHZhcnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBkW3NlbGYub3B0aW9ueGZvcm0oa2V5KV0gPSB2YWx1ZQorICAgICAgICBvcHRpb25zID0gZC5rZXlzKCkKKyAgICAgICAgaWYgIl9fbmFtZV9fIiBpbiBvcHRpb25zOgorICAgICAgICAgICAgb3B0aW9ucy5yZW1vdmUoIl9fbmFtZV9fIikKKyAgICAgICAgaWYgcmF3OgorICAgICAgICAgICAgcmV0dXJuIFsob3B0aW9uLCBkW29wdGlvbl0pCisgICAgICAgICAgICAgICAgICAgIGZvciBvcHRpb24gaW4gb3B0aW9uc10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBbKG9wdGlvbiwgc2VsZi5faW50ZXJwb2xhdGUoc2VjdGlvbiwgb3B0aW9uLCBkW29wdGlvbl0sIGQpKQorICAgICAgICAgICAgICAgICAgICBmb3Igb3B0aW9uIGluIG9wdGlvbnNdCisKKyAgICBkZWYgX2ludGVycG9sYXRlKHNlbGYsIHNlY3Rpb24sIG9wdGlvbiwgcmF3dmFsLCB2YXJzKToKKyAgICAgICAgIyBkbyB0aGUgc3RyaW5nIGludGVycG9sYXRpb24KKyAgICAgICAgdmFsdWUgPSByYXd2YWwKKyAgICAgICAgZGVwdGggPSBNQVhfSU5URVJQT0xBVElPTl9ERVBUSAorICAgICAgICB3aGlsZSBkZXB0aDogICAgICAgICAgICAgICAgICAgICMgTG9vcCB0aHJvdWdoIHRoaXMgdW50aWwgaXQncyBkb25lCisgICAgICAgICAgICBkZXB0aCAtPSAxCisgICAgICAgICAgICBpZiB2YWx1ZSBhbmQgIiUoIiBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX0tFWUNSRS5zdWIoc2VsZi5faW50ZXJwb2xhdGlvbl9yZXBsYWNlLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgJSB2YXJzCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnRlcnBvbGF0aW9uTWlzc2luZ09wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uLCBzZWN0aW9uLCByYXd2YWwsIGUuYXJnc1swXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgdmFsdWUgYW5kICIlKCIgaW4gdmFsdWU6CisgICAgICAgICAgICByYWlzZSBJbnRlcnBvbGF0aW9uRGVwdGhFcnJvcihvcHRpb24sIHNlY3Rpb24sIHJhd3ZhbCkKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBfS0VZQ1JFID0gcmUuY29tcGlsZShyIiVcKChbXildKilcKXN8LiIpCisKKyAgICBkZWYgX2ludGVycG9sYXRpb25fcmVwbGFjZShzZWxmLCBtYXRjaCk6CisgICAgICAgIHMgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICBpZiBzIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gbWF0Y2guZ3JvdXAoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICIlJSglcylzIiAlIHNlbGYub3B0aW9ueGZvcm0ocykKKworCitjbGFzcyBTYWZlQ29uZmlnUGFyc2VyKENvbmZpZ1BhcnNlcik6CisKKyAgICBkZWYgX2ludGVycG9sYXRlKHNlbGYsIHNlY3Rpb24sIG9wdGlvbiwgcmF3dmFsLCB2YXJzKToKKyAgICAgICAgIyBkbyB0aGUgc3RyaW5nIGludGVycG9sYXRpb24KKyAgICAgICAgTCA9IFtdCisgICAgICAgIHNlbGYuX2ludGVycG9sYXRlX3NvbWUob3B0aW9uLCBMLCByYXd2YWwsIHNlY3Rpb24sIHZhcnMsIDEpCisgICAgICAgIHJldHVybiAnJy5qb2luKEwpCisKKyAgICBfaW50ZXJwdmFyX3JlID0gcmUuY29tcGlsZShyIiVcKChbXildKylcKXMiKQorCisgICAgZGVmIF9pbnRlcnBvbGF0ZV9zb21lKHNlbGYsIG9wdGlvbiwgYWNjdW0sIHJlc3QsIHNlY3Rpb24sIG1hcCwgZGVwdGgpOgorICAgICAgICBpZiBkZXB0aCA+IE1BWF9JTlRFUlBPTEFUSU9OX0RFUFRIOgorICAgICAgICAgICAgcmFpc2UgSW50ZXJwb2xhdGlvbkRlcHRoRXJyb3Iob3B0aW9uLCBzZWN0aW9uLCByZXN0KQorICAgICAgICB3aGlsZSByZXN0OgorICAgICAgICAgICAgcCA9IHJlc3QuZmluZCgiJSIpCisgICAgICAgICAgICBpZiBwIDwgMDoKKyAgICAgICAgICAgICAgICBhY2N1bS5hcHBlbmQocmVzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHAgPiAwOgorICAgICAgICAgICAgICAgIGFjY3VtLmFwcGVuZChyZXN0WzpwXSkKKyAgICAgICAgICAgICAgICByZXN0ID0gcmVzdFtwOl0KKyAgICAgICAgICAgICMgcCBpcyBubyBsb25nZXIgdXNlZAorICAgICAgICAgICAgYyA9IHJlc3RbMToyXQorICAgICAgICAgICAgaWYgYyA9PSAiJSI6CisgICAgICAgICAgICAgICAgYWNjdW0uYXBwZW5kKCIlIikKKyAgICAgICAgICAgICAgICByZXN0ID0gcmVzdFsyOl0KKyAgICAgICAgICAgIGVsaWYgYyA9PSAiKCI6CisgICAgICAgICAgICAgICAgbSA9IHNlbGYuX2ludGVycHZhcl9yZS5tYXRjaChyZXN0KQorICAgICAgICAgICAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW50ZXJwb2xhdGlvblN5bnRheEVycm9yKG9wdGlvbiwgc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgaW50ZXJwb2xhdGlvbiB2YXJpYWJsZSByZWZlcmVuY2UgJXIiICUgcmVzdCkKKyAgICAgICAgICAgICAgICB2YXIgPSBzZWxmLm9wdGlvbnhmb3JtKG0uZ3JvdXAoMSkpCisgICAgICAgICAgICAgICAgcmVzdCA9IHJlc3RbbS5lbmQoKTpdCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB2ID0gbWFwW3Zhcl0KKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEludGVycG9sYXRpb25NaXNzaW5nT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24sIHNlY3Rpb24sIHJlc3QsIHZhcikKKyAgICAgICAgICAgICAgICBpZiAiJSIgaW4gdjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faW50ZXJwb2xhdGVfc29tZShvcHRpb24sIGFjY3VtLCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIG1hcCwgZGVwdGggKyAxKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGFjY3VtLmFwcGVuZCh2KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBJbnRlcnBvbGF0aW9uU3ludGF4RXJyb3IoCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbiwgc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIiclJScgbXVzdCBiZSBmb2xsb3dlZCBieSAnJSUnIG9yICcoJywgZm91bmQ6ICVyIiAlIChyZXN0LCkpCisKKyAgICBkZWYgc2V0KHNlbGYsIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWU9Tm9uZSk6CisgICAgICAgICIiIlNldCBhbiBvcHRpb24uICBFeHRlbmQgQ29uZmlnUGFyc2VyLnNldDogY2hlY2sgZm9yIHN0cmluZyB2YWx1ZXMuIiIiCisgICAgICAgICMgVGhlIG9ubHkgbGVnYWwgbm9uLXN0cmluZyB2YWx1ZSBpZiB3ZSBhbGxvdyB2YWx1ZWxlc3MKKyAgICAgICAgIyBvcHRpb25zIGlzIE5vbmUsIHNvIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEKKyAgICAgICAgIyBzdHJpbmcgaWY6CisgICAgICAgICMgLSB3ZSBkbyBub3QgYWxsb3cgdmFsdWVsZXNzIG9wdGlvbnMsIG9yCisgICAgICAgICMgLSB3ZSBhbGxvdyB2YWx1ZWxlc3Mgb3B0aW9ucyBidXQgdGhlIHZhbHVlIGlzIG5vdCBOb25lCisgICAgICAgIGlmIHNlbGYuX29wdGNyZSBpcyBzZWxmLk9QVENSRSBvciB2YWx1ZToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIm9wdGlvbiB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzIikKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIGNoZWNrIGZvciBiYWQgcGVyY2VudCBzaWduczoKKyAgICAgICAgICAgICMgZmlyc3QsIHJlcGxhY2UgYWxsICJnb29kIiBpbnRlcnBvbGF0aW9ucworICAgICAgICAgICAgdG1wX3ZhbHVlID0gdmFsdWUucmVwbGFjZSgnJSUnLCAnJykKKyAgICAgICAgICAgIHRtcF92YWx1ZSA9IHNlbGYuX2ludGVycHZhcl9yZS5zdWIoJycsIHRtcF92YWx1ZSkKKyAgICAgICAgICAgICMgdGhlbiwgY2hlY2sgaWYgdGhlcmUncyBhIGxvbmUgcGVyY2VudCBzaWduIGxlZnQKKyAgICAgICAgICAgIGlmICclJyBpbiB0bXBfdmFsdWU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCBpbnRlcnBvbGF0aW9uIHN5bnRheCBpbiAlciBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGlvbiAlZCIgJSAodmFsdWUsIHRtcF92YWx1ZS5maW5kKCclJykpKQorICAgICAgICBDb25maWdQYXJzZXIuc2V0KHNlbGYsIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0NvbmZpZ1BhcnNlci5weWMgYi9saWIvcHl0aG9uMi43L0NvbmZpZ1BhcnNlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1YTdkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvQ29uZmlnUGFyc2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0NvbmZpZ1BhcnNlci5weW8gYi9saWIvcHl0aG9uMi43L0NvbmZpZ1BhcnNlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1YTdkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvQ29uZmlnUGFyc2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0Nvb2tpZS5weSBiL2xpYi9weXRob24yLjcvQ29va2llLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZGE0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0Nvb2tpZS5weQpAQCAtMCwwICsxLDc2MSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisKKyMjIyMKKyMgQ29weXJpZ2h0IDIwMDAgYnkgVGltb3RoeSBPJ01hbGxleSA8dGltb0BhbHVtLm1pdC5lZHU+CisjCisjICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorIyBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkKKyMgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsCisjIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uCisjIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZgorIyBUaW1vdGh5IE8nTWFsbGV5ICBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKKyMgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4KKyMgcHJpb3IgcGVybWlzc2lvbi4KKyMKKyMgVGltb3RoeSBPJ01hbGxleSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUworIyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCisjIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUaW1vdGh5IE8nTWFsbGV5IEJFIExJQUJMRSBGT1IKKyMgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisjIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCisjIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKKyMgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyMKKyMjIyMKKyMKKyMgSWQ6IENvb2tpZS5weSx2IDIuMjkgMjAwMC8wOC8yMyAwNToyODo0OSB0aW1vIEV4cAorIyAgIGJ5IFRpbW90aHkgTydNYWxsZXkgPHRpbW9AYWx1bS5taXQuZWR1PgorIworIyAgQ29va2llLnB5IGlzIGEgUHl0aG9uIG1vZHVsZSBmb3IgdGhlIGhhbmRsaW5nIG9mIEhUVFAKKyMgIGNvb2tpZXMgYXMgYSBQeXRob24gZGljdGlvbmFyeS4gIFNlZSBSRkMgMjEwOSBmb3IgbW9yZQorIyAgaW5mb3JtYXRpb24gb24gY29va2llcy4KKyMKKyMgIFRoZSBvcmlnaW5hbCBpZGVhIHRvIHRyZWF0IENvb2tpZXMgYXMgYSBkaWN0aW9uYXJ5IGNhbWUgZnJvbQorIyAgRGF2ZSBNaXRjaGVsbCAoZGF2ZW1AbWFnbmV0LmNvbSkgaW4gMTk5NSwgd2hlbiBoZSByZWxlYXNlZCB0aGUKKyMgIGZpcnN0IHZlcnNpb24gb2YgbnNjb29raWUucHkuCisjCisjIyMjCisKK3IiIiIKK0hlcmUncyBhIHNhbXBsZSBzZXNzaW9uIHRvIHNob3cgaG93IHRvIHVzZSB0aGlzIG1vZHVsZS4KK0F0IHRoZSBtb21lbnQsIHRoaXMgaXMgdGhlIG9ubHkgZG9jdW1lbnRhdGlvbi4KKworVGhlIEJhc2ljcworLS0tLS0tLS0tLQorCitJbXBvcnRpbmcgaXMgZWFzeS4uCisKKyAgID4+PiBpbXBvcnQgQ29va2llCisKK01vc3Qgb2YgdGhlIHRpbWUgeW91IHN0YXJ0IGJ5IGNyZWF0aW5nIGEgY29va2llLiAgQ29va2llcyBjb21lIGluCit0aHJlZSBmbGF2b3JzLCBlYWNoIHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IGVuY29kaW5nIHNlbWFudGljcywgYnV0Cittb3JlIG9uIHRoYXQgbGF0ZXIuCisKKyAgID4+PiBDID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCisgICA+Pj4gQyA9IENvb2tpZS5TZXJpYWxDb29raWUoKQorICAgPj4+IEMgPSBDb29raWUuU21hcnRDb29raWUoKQorCitbTm90ZTogTG9uZy10aW1lIHVzZXJzIG9mIENvb2tpZS5weSB3aWxsIHJlbWVtYmVyIHVzaW5nCitDb29raWUuQ29va2llKCkgdG8gY3JlYXRlIGFuIENvb2tpZSBvYmplY3QuICBBbHRob3VnaCBkZXByZWNhdGVkLCBpdAoraXMgc3RpbGwgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlLiAgU2VlIHRoZSBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IG5vdGVzCitmb3IgbW9yZSBpbmZvcm1hdGlvbi5dCisKK09uY2UgeW91J3ZlIGNyZWF0ZWQgeW91ciBDb29raWUsIHlvdSBjYW4gYWRkIHZhbHVlcyBqdXN0IGFzIGlmIGl0IHdlcmUKK2EgZGljdGlvbmFyeS4KKworICAgPj4+IEMgPSBDb29raWUuU21hcnRDb29raWUoKQorICAgPj4+IENbImZpZyJdID0gIm5ld3RvbiIKKyAgID4+PiBDWyJzdWdhciJdID0gIndhZmVyIgorICAgPj4+IEMub3V0cHV0KCkKKyAgICdTZXQtQ29va2llOiBmaWc9bmV3dG9uXHJcblNldC1Db29raWU6IHN1Z2FyPXdhZmVyJworCitOb3RpY2UgdGhhdCB0aGUgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgQ29va2llIGlzIHRoZQorYXBwcm9wcmlhdGUgZm9ybWF0IGZvciBhIFNldC1Db29raWU6IGhlYWRlci4gIFRoaXMgaXMgdGhlCitkZWZhdWx0IGJlaGF2aW9yLiAgWW91IGNhbiBjaGFuZ2UgdGhlIGhlYWRlciBhbmQgcHJpbnRlZAorYXR0cmlidXRlcyBieSB1c2luZyB0aGUgLm91dHB1dCgpIGZ1bmN0aW9uCisKKyAgID4+PiBDID0gQ29va2llLlNtYXJ0Q29va2llKCkKKyAgID4+PiBDWyJyb2NreSJdID0gInJvYWQiCisgICA+Pj4gQ1sicm9ja3kiXVsicGF0aCJdID0gIi9jb29raWUiCisgICA+Pj4gcHJpbnQgQy5vdXRwdXQoaGVhZGVyPSJDb29raWU6IikKKyAgIENvb2tpZTogcm9ja3k9cm9hZDsgUGF0aD0vY29va2llCisgICA+Pj4gcHJpbnQgQy5vdXRwdXQoYXR0cnM9W10sIGhlYWRlcj0iQ29va2llOiIpCisgICBDb29raWU6IHJvY2t5PXJvYWQKKworVGhlIGxvYWQoKSBtZXRob2Qgb2YgYSBDb29raWUgZXh0cmFjdHMgY29va2llcyBmcm9tIGEgc3RyaW5nLiAgSW4gYQorQ0dJIHNjcmlwdCwgeW91IHdvdWxkIHVzZSB0aGlzIG1ldGhvZCB0byBleHRyYWN0IHRoZSBjb29raWVzIGZyb20gdGhlCitIVFRQX0NPT0tJRSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworICAgPj4+IEMgPSBDb29raWUuU21hcnRDb29raWUoKQorICAgPj4+IEMubG9hZCgiY2hpcHM9YWhveTsgdmllbm5hPWZpbmdlciIpCisgICA+Pj4gQy5vdXRwdXQoKQorICAgJ1NldC1Db29raWU6IGNoaXBzPWFob3lcclxuU2V0LUNvb2tpZTogdmllbm5hPWZpbmdlcicKKworVGhlIGxvYWQoKSBtZXRob2QgaXMgZGFybi10b290aW4gc21hcnQgYWJvdXQgaWRlbnRpZnlpbmcgY29va2llcword2l0aGluIGEgc3RyaW5nLiAgRXNjYXBlZCBxdW90YXRpb24gbWFya3MsIG5lc3RlZCBzZW1pY29sb25zLCBhbmQgb3RoZXIKK3N1Y2ggdHJpY2tlcmllcyBkbyBub3QgY29uZnVzZSBpdC4KKworICAgPj4+IEMgPSBDb29raWUuU21hcnRDb29raWUoKQorICAgPj4+IEMubG9hZCgna2VlYmxlcj0iRT1ldmVyeWJvZHk7IEw9XFwiTG92ZXNcXCI7IGZ1ZGdlPVxcMDEyOyI7JykKKyAgID4+PiBwcmludCBDCisgICBTZXQtQ29va2llOiBrZWVibGVyPSJFPWV2ZXJ5Ym9keTsgTD1cIkxvdmVzXCI7IGZ1ZGdlPVwwMTI7IgorCitFYWNoIGVsZW1lbnQgb2YgdGhlIENvb2tpZSBhbHNvIHN1cHBvcnRzIGFsbCBvZiB0aGUgUkZDIDIxMDkKK0Nvb2tpZSBhdHRyaWJ1dGVzLiAgSGVyZSdzIGFuIGV4YW1wbGUgd2hpY2ggc2V0cyB0aGUgUGF0aAorYXR0cmlidXRlLgorCisgICA+Pj4gQyA9IENvb2tpZS5TbWFydENvb2tpZSgpCisgICA+Pj4gQ1sib3JlbyJdID0gImRvdWJsZXN0dWZmIgorICAgPj4+IENbIm9yZW8iXVsicGF0aCJdID0gIi8iCisgICA+Pj4gcHJpbnQgQworICAgU2V0LUNvb2tpZTogb3Jlbz1kb3VibGVzdHVmZjsgUGF0aD0vCisKK0VhY2ggZGljdGlvbmFyeSBlbGVtZW50IGhhcyBhICd2YWx1ZScgYXR0cmlidXRlLCB3aGljaCBnaXZlcyB5b3UKK2JhY2sgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LgorCisgICA+Pj4gQyA9IENvb2tpZS5TbWFydENvb2tpZSgpCisgICA+Pj4gQ1sidHdpeCJdID0gIm5vbmUgZm9yIHlvdSIKKyAgID4+PiBDWyJ0d2l4Il0udmFsdWUKKyAgICdub25lIGZvciB5b3UnCisKKworQSBCaXQgTW9yZSBBZHZhbmNlZAorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcyBtZW50aW9uZWQgYmVmb3JlLCB0aGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGZsYXZvcnMgb2YgQ29va2llCitvYmplY3RzLCBlYWNoIHdpdGggZGlmZmVyZW50IGVuY29kaW5nL2RlY29kaW5nIHNlbWFudGljcy4gIFRoaXMKK3NlY3Rpb24gYnJpZWZseSBkaXNjdXNzZXMgdGhlIGRpZmZlcmVuY2VzLgorCitTaW1wbGVDb29raWUKKworVGhlIFNpbXBsZUNvb2tpZSBleHBlY3RzIHRoYXQgYWxsIHZhbHVlcyBzaG91bGQgYmUgc3RhbmRhcmQgc3RyaW5ncy4KK0p1c3QgdG8gYmUgc3VyZSwgU2ltcGxlQ29va2llIGludm9rZXMgdGhlIHN0cigpIGJ1aWx0aW4gdG8gY29udmVydAordGhlIHZhbHVlIHRvIGEgc3RyaW5nLCB3aGVuIHRoZSB2YWx1ZXMgYXJlIHNldCBkaWN0aW9uYXJ5LXN0eWxlLgorCisgICA+Pj4gQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQorICAgPj4+IENbIm51bWJlciJdID0gNworICAgPj4+IENbInN0cmluZyJdID0gInNldmVuIgorICAgPj4+IENbIm51bWJlciJdLnZhbHVlCisgICAnNycKKyAgID4+PiBDWyJzdHJpbmciXS52YWx1ZQorICAgJ3NldmVuJworICAgPj4+IEMub3V0cHV0KCkKKyAgICdTZXQtQ29va2llOiBudW1iZXI9N1xyXG5TZXQtQ29va2llOiBzdHJpbmc9c2V2ZW4nCisKKworU2VyaWFsQ29va2llCisKK1RoZSBTZXJpYWxDb29raWUgZXhwZWN0cyB0aGF0IGFsbCB2YWx1ZXMgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgdXNpbmcKK2NQaWNrbGUgKG9yIHBpY2tsZSwgaWYgY1BpY2tsZSBpc24ndCBhdmFpbGFibGUpLiAgQXMgYSByZXN1bHQgb2YKK3NlcmlhbGl6aW5nLCBTZXJpYWxDb29raWUgY2FuIHNhdmUgYWxtb3N0IGFueSBQeXRob24gb2JqZWN0IHRvIGEKK3ZhbHVlLCBhbmQgcmVjb3ZlciB0aGUgZXhhY3Qgc2FtZSBvYmplY3Qgd2hlbiB0aGUgY29va2llIGhhcyBiZWVuCityZXR1cm5lZC4gIChTZXJpYWxDb29raWUgY2FuIHlpZWxkIHNvbWUgc3RyYW5nZS1sb29raW5nIGNvb2tpZQordmFsdWVzLCBob3dldmVyLikKKworICAgPj4+IEMgPSBDb29raWUuU2VyaWFsQ29va2llKCkKKyAgID4+PiBDWyJudW1iZXIiXSA9IDcKKyAgID4+PiBDWyJzdHJpbmciXSA9ICJzZXZlbiIKKyAgID4+PiBDWyJudW1iZXIiXS52YWx1ZQorICAgNworICAgPj4+IENbInN0cmluZyJdLnZhbHVlCisgICAnc2V2ZW4nCisgICA+Pj4gQy5vdXRwdXQoKQorICAgJ1NldC1Db29raWU6IG51bWJlcj0iSTdcXDAxMi4iXHJcblNldC1Db29raWU6IHN0cmluZz0iU1wnc2V2ZW5cJ1xcMDEycDFcXDAxMi4iJworCitCZSB3YXJuZWQsIGhvd2V2ZXIsIGlmIFNlcmlhbENvb2tpZSBjYW5ub3QgZGUtc2VyaWFsaXplIGEgdmFsdWUgKGJlY2F1c2UKK2l0IGlzbid0IGEgdmFsaWQgcGlja2xlJ2Qgb2JqZWN0KSwgSVQgV0lMTCBSQUlTRSBBTiBFWENFUFRJT04uCisKKworU21hcnRDb29raWUKKworVGhlIFNtYXJ0Q29va2llIGNvbWJpbmVzIGFzcGVjdHMgb2YgZWFjaCBvZiB0aGUgb3RoZXIgdHdvIGZsYXZvcnMuCitXaGVuIHNldHRpbmcgYSB2YWx1ZSBpbiBhIGRpY3Rpb25hcnktZmFzaGlvbiwgdGhlIFNtYXJ0Q29va2llIHdpbGwKK3NlcmlhbGl6ZSAoYWxhIGNQaWNrbGUpIHRoZSB2YWx1ZSAqaWYgYW5kIG9ubHkgaWYqIGl0IGlzbid0IGEKK1B5dGhvbiBzdHJpbmcuICBTdHJpbmcgb2JqZWN0cyBhcmUgKm5vdCogc2VyaWFsaXplZC4gIFNpbWlsYXJseSwKK3doZW4gdGhlIGxvYWQoKSBtZXRob2QgcGFyc2VzIG91dCB2YWx1ZXMsIGl0IGF0dGVtcHRzIHRvIGRlLXNlcmlhbGl6ZQordGhlIHZhbHVlLiAgSWYgaXQgZmFpbHMsIHRoZW4gaXQgZmFsbHNiYWNrIHRvIHRyZWF0aW5nIHRoZSB2YWx1ZQorYXMgYSBzdHJpbmcuCisKKyAgID4+PiBDID0gQ29va2llLlNtYXJ0Q29va2llKCkKKyAgID4+PiBDWyJudW1iZXIiXSA9IDcKKyAgID4+PiBDWyJzdHJpbmciXSA9ICJzZXZlbiIKKyAgID4+PiBDWyJudW1iZXIiXS52YWx1ZQorICAgNworICAgPj4+IENbInN0cmluZyJdLnZhbHVlCisgICAnc2V2ZW4nCisgICA+Pj4gQy5vdXRwdXQoKQorICAgJ1NldC1Db29raWU6IG51bWJlcj0iSTdcXDAxMi4iXHJcblNldC1Db29raWU6IHN0cmluZz1zZXZlbicKKworCitCYWNrd2FyZHMgQ29tcGF0aWJpbGl0eQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW4gb3JkZXIgdG8ga2VlcCBjb21wYXRpYmlsdHkgd2l0aCBlYXJsaWVyIHZlcnNpb25zIG9mIENvb2tpZS5weSwKK2l0IGlzIHN0aWxsIHBvc3NpYmxlIHRvIHVzZSBDb29raWUuQ29va2llKCkgdG8gY3JlYXRlIGEgQ29va2llLiAgSW4KK2ZhY3QsIHRoaXMgc2ltcGx5IHJldHVybnMgYSBTbWFydENvb2tpZS4KKworICAgPj4+IEMgPSBDb29raWUuQ29va2llKCkKKyAgID4+PiBwcmludCBDLl9fY2xhc3NfXy5fX25hbWVfXworICAgU21hcnRDb29raWUKKworCitGaW5pcy4KKyIiIiAgIyIKKyMgICAgIF4KKyMgICAgIHwtLS0taGVscHMgb3V0IGZvbnQtbG9jaworCisjCisjIEltcG9ydCBvdXIgcmVxdWlyZWQgbW9kdWxlcworIworaW1wb3J0IHN0cmluZworCit0cnk6CisgICAgZnJvbSBjUGlja2xlIGltcG9ydCBkdW1wcywgbG9hZHMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIHBpY2tsZSBpbXBvcnQgZHVtcHMsIGxvYWRzCisKK2ltcG9ydCByZSwgd2FybmluZ3MKKworX19hbGxfXyA9IFsiQ29va2llRXJyb3IiLCJCYXNlQ29va2llIiwiU2ltcGxlQ29va2llIiwiU2VyaWFsQ29va2llIiwKKyAgICAgICAgICAgIlNtYXJ0Q29va2llIiwiQ29va2llIl0KKworX251bGxqb2luID0gJycuam9pbgorX3NlbWlzcGFjZWpvaW4gPSAnOyAnLmpvaW4KK19zcGFjZWpvaW4gPSAnICcuam9pbgorCisjCisjIERlZmluZSBhbiBleGNlcHRpb24gdmlzaWJsZSB0byBFeHRlcm5hbCBtb2R1bGVzCisjCitjbGFzcyBDb29raWVFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworCisjIFRoZXNlIHF1b3Rpbmcgcm91dGluZXMgY29uZm9ybSB0byB0aGUgUkZDMjEwOSBzcGVjaWZpY2F0aW9uLCB3aGljaCBpbgorIyB0dXJuIHJlZmVyZW5jZXMgdGhlIGNoYXJhY3RlciBkZWZpbml0aW9ucyBmcm9tIFJGQzIwNjguICBUaGV5IHByb3ZpZGUKKyMgYSB0d28td2F5IHF1b3RpbmcgYWxnb3JpdGhtLiAgQW55IG5vbi10ZXh0IGNoYXJhY3RlciBpcyB0cmFuc2xhdGVkCisjIGludG8gYSA0IGNoYXJhY3RlciBzZXF1ZW5jZTogYSBmb3J3YXJkLXNsYXNoIGZvbGxvd2VkIGJ5IHRoZQorIyB0aHJlZS1kaWdpdCBvY3RhbCBlcXVpdmFsZW50IG9mIHRoZSBjaGFyYWN0ZXIuICBBbnkgJ1wnIG9yICciJyBpcworIyBxdW90ZWQgd2l0aCBhIHByZWNlZWRpbmcgJ1wnIHNsYXNoLgorIworIyBUaGVzZSBhcmUgdGFrZW4gZnJvbSBSRkMyMDY4IGFuZCBSRkMyMTA5LgorIyAgICAgICBfTGVnYWxDaGFycyAgICAgICBpcyB0aGUgbGlzdCBvZiBjaGFycyB3aGljaCBkb24ndCByZXF1aXJlICIncworIyAgICAgICBfVHJhbnNsYXRvciAgICAgICBoYXNoLXRhYmxlIGZvciBmYXN0IHF1b3RpbmcKKyMKK19MZWdhbENoYXJzICAgICAgID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgIiEjJCUmJyorLS5eX2B8fiIKK19UcmFuc2xhdG9yICAgICAgID0geworICAgICdcMDAwJyA6ICdcXDAwMCcsICAnXDAwMScgOiAnXFwwMDEnLCAgJ1wwMDInIDogJ1xcMDAyJywKKyAgICAnXDAwMycgOiAnXFwwMDMnLCAgJ1wwMDQnIDogJ1xcMDA0JywgICdcMDA1JyA6ICdcXDAwNScsCisgICAgJ1wwMDYnIDogJ1xcMDA2JywgICdcMDA3JyA6ICdcXDAwNycsICAnXDAxMCcgOiAnXFwwMTAnLAorICAgICdcMDExJyA6ICdcXDAxMScsICAnXDAxMicgOiAnXFwwMTInLCAgJ1wwMTMnIDogJ1xcMDEzJywKKyAgICAnXDAxNCcgOiAnXFwwMTQnLCAgJ1wwMTUnIDogJ1xcMDE1JywgICdcMDE2JyA6ICdcXDAxNicsCisgICAgJ1wwMTcnIDogJ1xcMDE3JywgICdcMDIwJyA6ICdcXDAyMCcsICAnXDAyMScgOiAnXFwwMjEnLAorICAgICdcMDIyJyA6ICdcXDAyMicsICAnXDAyMycgOiAnXFwwMjMnLCAgJ1wwMjQnIDogJ1xcMDI0JywKKyAgICAnXDAyNScgOiAnXFwwMjUnLCAgJ1wwMjYnIDogJ1xcMDI2JywgICdcMDI3JyA6ICdcXDAyNycsCisgICAgJ1wwMzAnIDogJ1xcMDMwJywgICdcMDMxJyA6ICdcXDAzMScsICAnXDAzMicgOiAnXFwwMzInLAorICAgICdcMDMzJyA6ICdcXDAzMycsICAnXDAzNCcgOiAnXFwwMzQnLCAgJ1wwMzUnIDogJ1xcMDM1JywKKyAgICAnXDAzNicgOiAnXFwwMzYnLCAgJ1wwMzcnIDogJ1xcMDM3JywKKworICAgICMgQmVjYXVzZSBvZiB0aGUgd2F5IGJyb3dzZXJzIHJlYWxseSBoYW5kbGUgY29va2llcyAoYXMgb3Bwb3NlZAorICAgICMgdG8gd2hhdCB0aGUgUkZDIHNheXMpIHdlIGFsc28gZW5jb2RlICwgYW5kIDsKKworICAgICcsJyA6ICdcXDA1NCcsICc7JyA6ICdcXDA3MycsCisKKyAgICAnIicgOiAnXFwiJywgICAgICAgJ1xcJyA6ICdcXFxcJywKKworICAgICdcMTc3JyA6ICdcXDE3NycsICAnXDIwMCcgOiAnXFwyMDAnLCAgJ1wyMDEnIDogJ1xcMjAxJywKKyAgICAnXDIwMicgOiAnXFwyMDInLCAgJ1wyMDMnIDogJ1xcMjAzJywgICdcMjA0JyA6ICdcXDIwNCcsCisgICAgJ1wyMDUnIDogJ1xcMjA1JywgICdcMjA2JyA6ICdcXDIwNicsICAnXDIwNycgOiAnXFwyMDcnLAorICAgICdcMjEwJyA6ICdcXDIxMCcsICAnXDIxMScgOiAnXFwyMTEnLCAgJ1wyMTInIDogJ1xcMjEyJywKKyAgICAnXDIxMycgOiAnXFwyMTMnLCAgJ1wyMTQnIDogJ1xcMjE0JywgICdcMjE1JyA6ICdcXDIxNScsCisgICAgJ1wyMTYnIDogJ1xcMjE2JywgICdcMjE3JyA6ICdcXDIxNycsICAnXDIyMCcgOiAnXFwyMjAnLAorICAgICdcMjIxJyA6ICdcXDIyMScsICAnXDIyMicgOiAnXFwyMjInLCAgJ1wyMjMnIDogJ1xcMjIzJywKKyAgICAnXDIyNCcgOiAnXFwyMjQnLCAgJ1wyMjUnIDogJ1xcMjI1JywgICdcMjI2JyA6ICdcXDIyNicsCisgICAgJ1wyMjcnIDogJ1xcMjI3JywgICdcMjMwJyA6ICdcXDIzMCcsICAnXDIzMScgOiAnXFwyMzEnLAorICAgICdcMjMyJyA6ICdcXDIzMicsICAnXDIzMycgOiAnXFwyMzMnLCAgJ1wyMzQnIDogJ1xcMjM0JywKKyAgICAnXDIzNScgOiAnXFwyMzUnLCAgJ1wyMzYnIDogJ1xcMjM2JywgICdcMjM3JyA6ICdcXDIzNycsCisgICAgJ1wyNDAnIDogJ1xcMjQwJywgICdcMjQxJyA6ICdcXDI0MScsICAnXDI0MicgOiAnXFwyNDInLAorICAgICdcMjQzJyA6ICdcXDI0MycsICAnXDI0NCcgOiAnXFwyNDQnLCAgJ1wyNDUnIDogJ1xcMjQ1JywKKyAgICAnXDI0NicgOiAnXFwyNDYnLCAgJ1wyNDcnIDogJ1xcMjQ3JywgICdcMjUwJyA6ICdcXDI1MCcsCisgICAgJ1wyNTEnIDogJ1xcMjUxJywgICdcMjUyJyA6ICdcXDI1MicsICAnXDI1MycgOiAnXFwyNTMnLAorICAgICdcMjU0JyA6ICdcXDI1NCcsICAnXDI1NScgOiAnXFwyNTUnLCAgJ1wyNTYnIDogJ1xcMjU2JywKKyAgICAnXDI1NycgOiAnXFwyNTcnLCAgJ1wyNjAnIDogJ1xcMjYwJywgICdcMjYxJyA6ICdcXDI2MScsCisgICAgJ1wyNjInIDogJ1xcMjYyJywgICdcMjYzJyA6ICdcXDI2MycsICAnXDI2NCcgOiAnXFwyNjQnLAorICAgICdcMjY1JyA6ICdcXDI2NScsICAnXDI2NicgOiAnXFwyNjYnLCAgJ1wyNjcnIDogJ1xcMjY3JywKKyAgICAnXDI3MCcgOiAnXFwyNzAnLCAgJ1wyNzEnIDogJ1xcMjcxJywgICdcMjcyJyA6ICdcXDI3MicsCisgICAgJ1wyNzMnIDogJ1xcMjczJywgICdcMjc0JyA6ICdcXDI3NCcsICAnXDI3NScgOiAnXFwyNzUnLAorICAgICdcMjc2JyA6ICdcXDI3NicsICAnXDI3NycgOiAnXFwyNzcnLCAgJ1wzMDAnIDogJ1xcMzAwJywKKyAgICAnXDMwMScgOiAnXFwzMDEnLCAgJ1wzMDInIDogJ1xcMzAyJywgICdcMzAzJyA6ICdcXDMwMycsCisgICAgJ1wzMDQnIDogJ1xcMzA0JywgICdcMzA1JyA6ICdcXDMwNScsICAnXDMwNicgOiAnXFwzMDYnLAorICAgICdcMzA3JyA6ICdcXDMwNycsICAnXDMxMCcgOiAnXFwzMTAnLCAgJ1wzMTEnIDogJ1xcMzExJywKKyAgICAnXDMxMicgOiAnXFwzMTInLCAgJ1wzMTMnIDogJ1xcMzEzJywgICdcMzE0JyA6ICdcXDMxNCcsCisgICAgJ1wzMTUnIDogJ1xcMzE1JywgICdcMzE2JyA6ICdcXDMxNicsICAnXDMxNycgOiAnXFwzMTcnLAorICAgICdcMzIwJyA6ICdcXDMyMCcsICAnXDMyMScgOiAnXFwzMjEnLCAgJ1wzMjInIDogJ1xcMzIyJywKKyAgICAnXDMyMycgOiAnXFwzMjMnLCAgJ1wzMjQnIDogJ1xcMzI0JywgICdcMzI1JyA6ICdcXDMyNScsCisgICAgJ1wzMjYnIDogJ1xcMzI2JywgICdcMzI3JyA6ICdcXDMyNycsICAnXDMzMCcgOiAnXFwzMzAnLAorICAgICdcMzMxJyA6ICdcXDMzMScsICAnXDMzMicgOiAnXFwzMzInLCAgJ1wzMzMnIDogJ1xcMzMzJywKKyAgICAnXDMzNCcgOiAnXFwzMzQnLCAgJ1wzMzUnIDogJ1xcMzM1JywgICdcMzM2JyA6ICdcXDMzNicsCisgICAgJ1wzMzcnIDogJ1xcMzM3JywgICdcMzQwJyA6ICdcXDM0MCcsICAnXDM0MScgOiAnXFwzNDEnLAorICAgICdcMzQyJyA6ICdcXDM0MicsICAnXDM0MycgOiAnXFwzNDMnLCAgJ1wzNDQnIDogJ1xcMzQ0JywKKyAgICAnXDM0NScgOiAnXFwzNDUnLCAgJ1wzNDYnIDogJ1xcMzQ2JywgICdcMzQ3JyA6ICdcXDM0NycsCisgICAgJ1wzNTAnIDogJ1xcMzUwJywgICdcMzUxJyA6ICdcXDM1MScsICAnXDM1MicgOiAnXFwzNTInLAorICAgICdcMzUzJyA6ICdcXDM1MycsICAnXDM1NCcgOiAnXFwzNTQnLCAgJ1wzNTUnIDogJ1xcMzU1JywKKyAgICAnXDM1NicgOiAnXFwzNTYnLCAgJ1wzNTcnIDogJ1xcMzU3JywgICdcMzYwJyA6ICdcXDM2MCcsCisgICAgJ1wzNjEnIDogJ1xcMzYxJywgICdcMzYyJyA6ICdcXDM2MicsICAnXDM2MycgOiAnXFwzNjMnLAorICAgICdcMzY0JyA6ICdcXDM2NCcsICAnXDM2NScgOiAnXFwzNjUnLCAgJ1wzNjYnIDogJ1xcMzY2JywKKyAgICAnXDM2NycgOiAnXFwzNjcnLCAgJ1wzNzAnIDogJ1xcMzcwJywgICdcMzcxJyA6ICdcXDM3MScsCisgICAgJ1wzNzInIDogJ1xcMzcyJywgICdcMzczJyA6ICdcXDM3MycsICAnXDM3NCcgOiAnXFwzNzQnLAorICAgICdcMzc1JyA6ICdcXDM3NScsICAnXDM3NicgOiAnXFwzNzYnLCAgJ1wzNzcnIDogJ1xcMzc3JworICAgIH0KKworX2lkbWFwID0gJycuam9pbihjaHIoeCkgZm9yIHggaW4geHJhbmdlKDI1NikpCisKK2RlZiBfcXVvdGUoc3RyLCBMZWdhbENoYXJzPV9MZWdhbENoYXJzLAorICAgICAgICAgICBpZG1hcD1faWRtYXAsIHRyYW5zbGF0ZT1zdHJpbmcudHJhbnNsYXRlKToKKyAgICAjCisgICAgIyBJZiB0aGUgc3RyaW5nIGRvZXMgbm90IG5lZWQgdG8gYmUgZG91YmxlLXF1b3RlZCwKKyAgICAjIHRoZW4ganVzdCByZXR1cm4gdGhlIHN0cmluZy4gIE90aGVyd2lzZSwgc3Vycm91bmQKKyAgICAjIHRoZSBzdHJpbmcgaW4gZG91YmxlcXVvdGVzIGFuZCBwcmVjZWRlIHF1b3RlICh3aXRoIGEgXCkKKyAgICAjIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAgICAjCisgICAgaWYgIiIgPT0gdHJhbnNsYXRlKHN0ciwgaWRtYXAsIExlZ2FsQ2hhcnMpOgorICAgICAgICByZXR1cm4gc3RyCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICciJyArIF9udWxsam9pbiggbWFwKF9UcmFuc2xhdG9yLmdldCwgc3RyLCBzdHIpICkgKyAnIicKKyMgZW5kIF9xdW90ZQorCisKK19PY3RhbFBhdHQgPSByZS5jb21waWxlKHIiXFxbMC0zXVswLTddWzAtN10iKQorX1F1b3RlUGF0dCA9IHJlLmNvbXBpbGUociJbXFxdLiIpCisKK2RlZiBfdW5xdW90ZShzdHIpOgorICAgICMgSWYgdGhlcmUgYXJlbid0IGFueSBkb3VibGVxdW90ZXMsCisgICAgIyB0aGVuIHRoZXJlIGNhbid0IGJlIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMuICBTZWUgUkZDIDIxMDkuCisgICAgaWYgIGxlbihzdHIpIDwgMjoKKyAgICAgICAgcmV0dXJuIHN0cgorICAgIGlmIHN0clswXSAhPSAnIicgb3Igc3RyWy0xXSAhPSAnIic6CisgICAgICAgIHJldHVybiBzdHIKKworICAgICMgV2UgaGF2ZSB0byBhc3N1bWUgdGhhdCB3ZSBtdXN0IGRlY29kZSB0aGlzIHN0cmluZy4KKyAgICAjIERvd24gdG8gd29yay4KKworICAgICMgUmVtb3ZlIHRoZSAicworICAgIHN0ciA9IHN0clsxOi0xXQorCisgICAgIyBDaGVjayBmb3Igc3BlY2lhbCBzZXF1ZW5jZXMuICBFeGFtcGxlczoKKyAgICAjICAgIFwwMTIgLS0+IFxuCisgICAgIyAgICBcIiAgIC0tPiAiCisgICAgIworICAgIGkgPSAwCisgICAgbiA9IGxlbihzdHIpCisgICAgcmVzID0gW10KKyAgICB3aGlsZSAwIDw9IGkgPCBuOgorICAgICAgICBPbWF0Y2ggPSBfT2N0YWxQYXR0LnNlYXJjaChzdHIsIGkpCisgICAgICAgIFFtYXRjaCA9IF9RdW90ZVBhdHQuc2VhcmNoKHN0ciwgaSkKKyAgICAgICAgaWYgbm90IE9tYXRjaCBhbmQgbm90IFFtYXRjaDogICAgICAgICAgICAgICMgTmVpdGhlciBtYXRjaGVkCisgICAgICAgICAgICByZXMuYXBwZW5kKHN0cltpOl0pCisgICAgICAgICAgICBicmVhaworICAgICAgICAjIGVsc2U6CisgICAgICAgIGogPSBrID0gLTEKKyAgICAgICAgaWYgT21hdGNoOiBqID0gT21hdGNoLnN0YXJ0KDApCisgICAgICAgIGlmIFFtYXRjaDogayA9IFFtYXRjaC5zdGFydCgwKQorICAgICAgICBpZiBRbWF0Y2ggYW5kICggbm90IE9tYXRjaCBvciBrIDwgaiApOiAgICAgIyBRdW90ZVBhdHQgbWF0Y2hlZAorICAgICAgICAgICAgcmVzLmFwcGVuZChzdHJbaTprXSkKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoc3RyW2srMV0pCisgICAgICAgICAgICBpID0gaysyCisgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9jdGFsUGF0dCBtYXRjaGVkCisgICAgICAgICAgICByZXMuYXBwZW5kKHN0cltpOmpdKQorICAgICAgICAgICAgcmVzLmFwcGVuZCggY2hyKCBpbnQoc3RyW2orMTpqKzRdLCA4KSApICkKKyAgICAgICAgICAgIGkgPSBqKzQKKyAgICByZXR1cm4gX251bGxqb2luKHJlcykKKyMgZW5kIF91bnF1b3RlCisKKyMgVGhlIF9nZXRkYXRlKCkgcm91dGluZSBpcyB1c2VkIHRvIHNldCB0aGUgZXhwaXJhdGlvbiB0aW1lIGluCisjIHRoZSBjb29raWUncyBIVFRQIGhlYWRlci4gICAgICBCeSBkZWZhdWx0LCBfZ2V0ZGF0ZSgpIHJldHVybnMgdGhlCisjIGN1cnJlbnQgdGltZSBpbiB0aGUgYXBwcm9wcmlhdGUgImV4cGlyZXMiIGZvcm1hdCBmb3IgYQorIyBTZXQtQ29va2llIGhlYWRlci4gICAgIFRoZSBvbmUgb3B0aW9uYWwgYXJndW1lbnQgaXMgYW4gb2Zmc2V0IGZyb20KKyMgbm93LCBpbiBzZWNvbmRzLiAgICAgIEZvciBleGFtcGxlLCBhbiBvZmZzZXQgb2YgLTM2MDAgbWVhbnMgIm9uZSBob3VyIGFnbyIuCisjIFRoZSBvZmZzZXQgbWF5IGJlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorIworCitfd2Vla2RheW5hbWUgPSBbJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0JywgJ1N1biddCisKK19tb250aG5hbWUgPSBbTm9uZSwKKyAgICAgICAgICAgICAgJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywKKyAgICAgICAgICAgICAgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ10KKworZGVmIF9nZXRkYXRlKGZ1dHVyZT0wLCB3ZWVrZGF5bmFtZT1fd2Vla2RheW5hbWUsIG1vbnRobmFtZT1fbW9udGhuYW1lKToKKyAgICBmcm9tIHRpbWUgaW1wb3J0IGdtdGltZSwgdGltZQorICAgIG5vdyA9IHRpbWUoKQorICAgIHllYXIsIG1vbnRoLCBkYXksIGhoLCBtbSwgc3MsIHdkLCB5LCB6ID0gZ210aW1lKG5vdyArIGZ1dHVyZSkKKyAgICByZXR1cm4gIiVzLCAlMDJkICUzcyAlNGQgJTAyZDolMDJkOiUwMmQgR01UIiAlIFwKKyAgICAgICAgICAgKHdlZWtkYXluYW1lW3dkXSwgZGF5LCBtb250aG5hbWVbbW9udGhdLCB5ZWFyLCBoaCwgbW0sIHNzKQorCisKKyMKKyMgQSBjbGFzcyB0byBob2xkIE9ORSBrZXksdmFsdWUgcGFpci4KKyMgSW4gYSBjb29raWUsIGVhY2ggc3VjaCBwYWlyIG1heSBoYXZlIHNldmVyYWwgYXR0cmlidXRlcy4KKyMgICAgICAgc28gdGhpcyBjbGFzcyBpcyB1c2VkIHRvIGtlZXAgdGhlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZAorIyAgICAgICB3aXRoIHRoZSBhcHByb3ByaWF0ZSBrZXksdmFsdWUgcGFpci4KKyMgVGhpcyBjbGFzcyBhbHNvIGluY2x1ZGVzIGEgY29kZWRfdmFsdWUgYXR0cmlidXRlLCB3aGljaAorIyAgICAgICBpcyB1c2VkIHRvIGhvbGQgdGhlIG5ldHdvcmsgcmVwcmVzZW50YXRpb24gb2YgdGhlCisjICAgICAgIHZhbHVlLiAgVGhpcyBpcyBtb3N0IHVzZWZ1bCB3aGVuIFB5dGhvbiBvYmplY3RzIGFyZQorIyAgICAgICBwaWNrbGVkIGZvciBuZXR3b3JrIHRyYW5zaXQuCisjCisKK2NsYXNzIE1vcnNlbChkaWN0KToKKyAgICAjIFJGQyAyMTA5IGxpc3RzIHRoZXNlIGF0dHJpYnV0ZXMgYXMgcmVzZXJ2ZWQ6CisgICAgIyAgIHBhdGggICAgICAgY29tbWVudCAgICAgICAgIGRvbWFpbgorICAgICMgICBtYXgtYWdlICAgIHNlY3VyZSAgICAgIHZlcnNpb24KKyAgICAjCisgICAgIyBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBhbHNvIHJlc2VydmVkOgorICAgICMgICBleHBpcmVzCisgICAgIworICAgICMgVGhpcyBpcyBhbiBleHRlbnNpb24gZnJvbSBNaWNyb3NvZnQ6CisgICAgIyAgIGh0dHBvbmx5CisgICAgIworICAgICMgVGhpcyBkaWN0aW9uYXJ5IHByb3ZpZGVzIGEgbWFwcGluZyBmcm9tIHRoZSBsb3dlcmNhc2UKKyAgICAjIHZhcmlhbnQgb24gdGhlIGxlZnQgdG8gdGhlIGFwcHJvcHJpYXRlIHRyYWRpdGlvbmFsCisgICAgIyBmb3JtYXR0aW5nIG9uIHRoZSByaWdodC4KKyAgICBfcmVzZXJ2ZWQgPSB7ICJleHBpcmVzIiA6ICJleHBpcmVzIiwKKyAgICAgICAgICAgICAgICAgICAicGF0aCIgICAgICAgIDogIlBhdGgiLAorICAgICAgICAgICAgICAgICAgICJjb21tZW50IiA6ICJDb21tZW50IiwKKyAgICAgICAgICAgICAgICAgICAiZG9tYWluIiAgICAgIDogIkRvbWFpbiIsCisgICAgICAgICAgICAgICAgICAgIm1heC1hZ2UiIDogIk1heC1BZ2UiLAorICAgICAgICAgICAgICAgICAgICJzZWN1cmUiICAgICAgOiAic2VjdXJlIiwKKyAgICAgICAgICAgICAgICAgICAiaHR0cG9ubHkiICA6ICJodHRwb25seSIsCisgICAgICAgICAgICAgICAgICAgInZlcnNpb24iIDogIlZlcnNpb24iLAorICAgICAgICAgICAgICAgICAgIH0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIyBTZXQgZGVmYXVsdHMKKyAgICAgICAgc2VsZi5rZXkgPSBzZWxmLnZhbHVlID0gc2VsZi5jb2RlZF92YWx1ZSA9IE5vbmUKKworICAgICAgICAjIFNldCBkZWZhdWx0IGF0dHJpYnV0ZXMKKyAgICAgICAgZm9yIEsgaW4gc2VsZi5fcmVzZXJ2ZWQ6CisgICAgICAgICAgICBkaWN0Ll9fc2V0aXRlbV9fKHNlbGYsIEssICIiKQorICAgICMgZW5kIF9faW5pdF9fCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgSywgVik6CisgICAgICAgIEsgPSBLLmxvd2VyKCkKKyAgICAgICAgaWYgbm90IEsgaW4gc2VsZi5fcmVzZXJ2ZWQ6CisgICAgICAgICAgICByYWlzZSBDb29raWVFcnJvcigiSW52YWxpZCBBdHRyaWJ1dGUgJXMiICUgSykKKyAgICAgICAgZGljdC5fX3NldGl0ZW1fXyhzZWxmLCBLLCBWKQorICAgICMgZW5kIF9fc2V0aXRlbV9fCisKKyAgICBkZWYgaXNSZXNlcnZlZEtleShzZWxmLCBLKToKKyAgICAgICAgcmV0dXJuIEsubG93ZXIoKSBpbiBzZWxmLl9yZXNlcnZlZAorICAgICMgZW5kIGlzUmVzZXJ2ZWRLZXkKKworICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWwsIGNvZGVkX3ZhbCwKKyAgICAgICAgICAgIExlZ2FsQ2hhcnM9X0xlZ2FsQ2hhcnMsCisgICAgICAgICAgICBpZG1hcD1faWRtYXAsIHRyYW5zbGF0ZT1zdHJpbmcudHJhbnNsYXRlKToKKyAgICAgICAgIyBGaXJzdCB3ZSB2ZXJpZnkgdGhhdCB0aGUga2V5IGlzbid0IGEgcmVzZXJ2ZWQgd29yZAorICAgICAgICAjIFNlY29uZCB3ZSBtYWtlIHN1cmUgaXQgb25seSBjb250YWlucyBsZWdhbCBjaGFyYWN0ZXJzCisgICAgICAgIGlmIGtleS5sb3dlcigpIGluIHNlbGYuX3Jlc2VydmVkOgorICAgICAgICAgICAgcmFpc2UgQ29va2llRXJyb3IoIkF0dGVtcHQgdG8gc2V0IGEgcmVzZXJ2ZWQga2V5OiAlcyIgJSBrZXkpCisgICAgICAgIGlmICIiICE9IHRyYW5zbGF0ZShrZXksIGlkbWFwLCBMZWdhbENoYXJzKToKKyAgICAgICAgICAgIHJhaXNlIENvb2tpZUVycm9yKCJJbGxlZ2FsIGtleSB2YWx1ZTogJXMiICUga2V5KQorCisgICAgICAgICMgSXQncyBhIGdvb2Qga2V5LCBzbyBzYXZlIGl0LgorICAgICAgICBzZWxmLmtleSAgICAgICAgICAgICAgICAgPSBrZXkKKyAgICAgICAgc2VsZi52YWx1ZSAgICAgICAgICAgICAgID0gdmFsCisgICAgICAgIHNlbGYuY29kZWRfdmFsdWUgICAgICAgICA9IGNvZGVkX3ZhbAorICAgICMgZW5kIHNldAorCisgICAgZGVmIG91dHB1dChzZWxmLCBhdHRycz1Ob25lLCBoZWFkZXIgPSAiU2V0LUNvb2tpZToiKToKKyAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAoIGhlYWRlciwgc2VsZi5PdXRwdXRTdHJpbmcoYXR0cnMpICkKKworICAgIF9fc3RyX18gPSBvdXRwdXQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8JXM6ICVzPSVzPicgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYua2V5LCByZXByKHNlbGYudmFsdWUpICkKKworICAgIGRlZiBqc19vdXRwdXQoc2VsZiwgYXR0cnM9Tm9uZSk6CisgICAgICAgICMgUHJpbnQgamF2YXNjcmlwdAorICAgICAgICByZXR1cm4gIiIiCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgICAgPCEtLSBiZWdpbiBoaWRpbmcKKyAgICAgICAgZG9jdW1lbnQuY29va2llID0gXCIlc1wiOworICAgICAgICAvLyBlbmQgaGlkaW5nIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgICAgIiIiICUgKCBzZWxmLk91dHB1dFN0cmluZyhhdHRycykucmVwbGFjZSgnIicscidcIicpLCApCisgICAgIyBlbmQganNfb3V0cHV0KCkKKworICAgIGRlZiBPdXRwdXRTdHJpbmcoc2VsZiwgYXR0cnM9Tm9uZSk6CisgICAgICAgICMgQnVpbGQgdXAgb3VyIHJlc3VsdAorICAgICAgICAjCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIFJBID0gcmVzdWx0LmFwcGVuZAorCisgICAgICAgICMgRmlyc3QsIHRoZSBrZXk9dmFsdWUgcGFpcgorICAgICAgICBSQSgiJXM9JXMiICUgKHNlbGYua2V5LCBzZWxmLmNvZGVkX3ZhbHVlKSkKKworICAgICAgICAjIE5vdyBhZGQgYW55IGRlZmluZWQgYXR0cmlidXRlcworICAgICAgICBpZiBhdHRycyBpcyBOb25lOgorICAgICAgICAgICAgYXR0cnMgPSBzZWxmLl9yZXNlcnZlZAorICAgICAgICBpdGVtcyA9IHNlbGYuaXRlbXMoKQorICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgZm9yIEssViBpbiBpdGVtczoKKyAgICAgICAgICAgIGlmIFYgPT0gIiI6IGNvbnRpbnVlCisgICAgICAgICAgICBpZiBLIG5vdCBpbiBhdHRyczogY29udGludWUKKyAgICAgICAgICAgIGlmIEsgPT0gImV4cGlyZXMiIGFuZCB0eXBlKFYpID09IHR5cGUoMSk6CisgICAgICAgICAgICAgICAgUkEoIiVzPSVzIiAlIChzZWxmLl9yZXNlcnZlZFtLXSwgX2dldGRhdGUoVikpKQorICAgICAgICAgICAgZWxpZiBLID09ICJtYXgtYWdlIiBhbmQgdHlwZShWKSA9PSB0eXBlKDEpOgorICAgICAgICAgICAgICAgIFJBKCIlcz0lZCIgJSAoc2VsZi5fcmVzZXJ2ZWRbS10sIFYpKQorICAgICAgICAgICAgZWxpZiBLID09ICJzZWN1cmUiOgorICAgICAgICAgICAgICAgIFJBKHN0cihzZWxmLl9yZXNlcnZlZFtLXSkpCisgICAgICAgICAgICBlbGlmIEsgPT0gImh0dHBvbmx5IjoKKyAgICAgICAgICAgICAgICBSQShzdHIoc2VsZi5fcmVzZXJ2ZWRbS10pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBSQSgiJXM9JXMiICUgKHNlbGYuX3Jlc2VydmVkW0tdLCBWKSkKKworICAgICAgICAjIFJldHVybiB0aGUgcmVzdWx0CisgICAgICAgIHJldHVybiBfc2VtaXNwYWNlam9pbihyZXN1bHQpCisgICAgIyBlbmQgT3V0cHV0U3RyaW5nCisjIGVuZCBNb3JzZWwgY2xhc3MKKworCisKKyMKKyMgUGF0dGVybiBmb3IgZmluZGluZyBjb29raWUKKyMKKyMgVGhpcyB1c2VkIHRvIGJlIHN0cmljdCBwYXJzaW5nIGJhc2VkIG9uIHRoZSBSRkMyMTA5IGFuZCBSRkMyMDY4CisjIHNwZWNpZmljYXRpb25zLiAgSSBoYXZlIHNpbmNlIGRpc2NvdmVyZWQgdGhhdCBNU0lFIDMuMHggZG9lc24ndAorIyBmb2xsb3cgdGhlIGNoYXJhY3RlciBydWxlcyBvdXRsaW5lZCBpbiB0aG9zZSBzcGVjcy4gIEFzIGEKKyMgcmVzdWx0LCB0aGUgcGFyc2luZyBydWxlcyBoZXJlIGFyZSBsZXNzIHN0cmljdC4KKyMKKworX0xlZ2FsQ2hhcnNQYXR0ICA9IHIiW1x3XGQhIyUmJ35fYD48QCw6L1wkXCpcK1wtXC5cXlx8XClcKFw/XH1ce1w9XSIKK19Db29raWVQYXR0ZXJuID0gcmUuY29tcGlsZSgKKyAgICByIig/eCkiICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYSBWZXJib3NlIHBhdHRlcm4KKyAgICByIig/UDxrZXk+IiAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IG9mIGdyb3VwICdrZXknCisgICAgIiIrIF9MZWdhbENoYXJzUGF0dCArIis/IiAgICAgIyBBbnkgd29yZCBvZiBhdCBsZWFzdCBvbmUgbGV0dGVyLCBub25ncmVlZHkKKyAgICByIikiICAgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCBvZiBncm91cCAna2V5JworICAgIHIiXHMqPVxzKiIgICAgICAgICAgICAgICAgICAgICMgRXF1YWwgU2lnbgorICAgIHIiKD9QPHZhbD4iICAgICAgICAgICAgICAgICAgICMgU3RhcnQgb2YgZ3JvdXAgJ3ZhbCcKKyAgICByJyIoPzpbXlxcIl18XFwuKSoiJyAgICAgICAgICAgICMgQW55IGRvdWJsZXF1b3RlZCBzdHJpbmcKKyAgICByInwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IKKyAgICByIlx3ezN9LFxzW1xzXHdcZC1dezksMTF9XHNbXGQ6XXs4fVxzR01UIiAjIFNwZWNpYWwgY2FzZSBmb3IgImV4cGlyZXMiIGF0dHIKKyAgICByInwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IKKyAgICAiIisgX0xlZ2FsQ2hhcnNQYXR0ICsiKiIgICAgICAgICMgQW55IHdvcmQgb3IgZW1wdHkgc3RyaW5nCisgICAgciIpIiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFbmQgb2YgZ3JvdXAgJ3ZhbCcKKyAgICByIlxzKjs/IiAgICAgICAgICAgICAgICAgICAgICAjIFByb2JhYmx5IGVuZGluZyBpbiBhIHNlbWktY29sb24KKyAgICApCisKKworIyBBdCBsb25nIGxhc3QsIGhlcmUgaXMgdGhlIGNvb2tpZSBjbGFzcy4KKyMgICBVc2luZyB0aGlzIGNsYXNzIGlzIGFsbW9zdCBqdXN0IGxpa2UgdXNpbmcgYSBkaWN0aW9uYXJ5LgorIyBTZWUgdGhpcyBtb2R1bGUncyBkb2NzdHJpbmcgZm9yIGV4YW1wbGUgdXNhZ2UuCisjCitjbGFzcyBCYXNlQ29va2llKGRpY3QpOgorICAgICMgQSBjb250YWluZXIgY2xhc3MgZm9yIGEgc2V0IG9mIE1vcnNlbHMKKyAgICAjCisKKyAgICBkZWYgdmFsdWVfZGVjb2RlKHNlbGYsIHZhbCk6CisgICAgICAgICIiInJlYWxfdmFsdWUsIGNvZGVkX3ZhbHVlID0gdmFsdWVfZGVjb2RlKFNUUklORykKKyAgICAgICAgQ2FsbGVkIHByaW9yIHRvIHNldHRpbmcgYSBjb29raWUncyB2YWx1ZSBmcm9tIHRoZSBuZXR3b3JrCisgICAgICAgIHJlcHJlc2VudGF0aW9uLiAgVGhlIFZBTFVFIGlzIHRoZSB2YWx1ZSByZWFkIGZyb20gSFRUUAorICAgICAgICBoZWFkZXIuCisgICAgICAgIE92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSBiZWhhdmlvciBvZiBjb29raWVzLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHZhbCwgdmFsCisgICAgIyBlbmQgdmFsdWVfZW5jb2RlCisKKyAgICBkZWYgdmFsdWVfZW5jb2RlKHNlbGYsIHZhbCk6CisgICAgICAgICIiInJlYWxfdmFsdWUsIGNvZGVkX3ZhbHVlID0gdmFsdWVfZW5jb2RlKFZBTFVFKQorICAgICAgICBDYWxsZWQgcHJpb3IgdG8gc2V0dGluZyBhIGNvb2tpZSdzIHZhbHVlIGZyb20gdGhlIGRpY3Rpb25hcnkKKyAgICAgICAgcmVwcmVzZW50YXRpb24uICBUaGUgVkFMVUUgaXMgdGhlIHZhbHVlIGJlaW5nIGFzc2lnbmVkLgorICAgICAgICBPdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3Igb2YgY29va2llcy4KKyAgICAgICAgIiIiCisgICAgICAgIHN0cnZhbCA9IHN0cih2YWwpCisgICAgICAgIHJldHVybiBzdHJ2YWwsIHN0cnZhbAorICAgICMgZW5kIHZhbHVlX2VuY29kZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0PU5vbmUpOgorICAgICAgICBpZiBpbnB1dDogc2VsZi5sb2FkKGlucHV0KQorICAgICMgZW5kIF9faW5pdF9fCisKKyAgICBkZWYgX19zZXQoc2VsZiwga2V5LCByZWFsX3ZhbHVlLCBjb2RlZF92YWx1ZSk6CisgICAgICAgICIiIlByaXZhdGUgbWV0aG9kIGZvciBzZXR0aW5nIGEgY29va2llJ3MgdmFsdWUiIiIKKyAgICAgICAgTSA9IHNlbGYuZ2V0KGtleSwgTW9yc2VsKCkpCisgICAgICAgIE0uc2V0KGtleSwgcmVhbF92YWx1ZSwgY29kZWRfdmFsdWUpCisgICAgICAgIGRpY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCBNKQorICAgICMgZW5kIF9fc2V0CisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgICIiIkRpY3Rpb25hcnkgc3R5bGUgYXNzaWdubWVudC4iIiIKKyAgICAgICAgcnZhbCwgY3ZhbCA9IHNlbGYudmFsdWVfZW5jb2RlKHZhbHVlKQorICAgICAgICBzZWxmLl9fc2V0KGtleSwgcnZhbCwgY3ZhbCkKKyAgICAjIGVuZCBfX3NldGl0ZW1fXworCisgICAgZGVmIG91dHB1dChzZWxmLCBhdHRycz1Ob25lLCBoZWFkZXI9IlNldC1Db29raWU6Iiwgc2VwPSJcMDE1XDAxMiIpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgc3VpdGFibGUgZm9yIEhUVFAuIiIiCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGl0ZW1zID0gc2VsZi5pdGVtcygpCisgICAgICAgIGl0ZW1zLnNvcnQoKQorICAgICAgICBmb3IgSyxWIGluIGl0ZW1zOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCggVi5vdXRwdXQoYXR0cnMsIGhlYWRlcikgKQorICAgICAgICByZXR1cm4gc2VwLmpvaW4ocmVzdWx0KQorICAgICMgZW5kIG91dHB1dAorCisgICAgX19zdHJfXyA9IG91dHB1dAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBMID0gW10KKyAgICAgICAgaXRlbXMgPSBzZWxmLml0ZW1zKCkKKyAgICAgICAgaXRlbXMuc29ydCgpCisgICAgICAgIGZvciBLLFYgaW4gaXRlbXM6CisgICAgICAgICAgICBMLmFwcGVuZCggJyVzPSVzJyAlIChLLHJlcHIoVi52YWx1ZSkgKSApCisgICAgICAgIHJldHVybiAnPCVzOiAlcz4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBfc3BhY2Vqb2luKEwpKQorCisgICAgZGVmIGpzX291dHB1dChzZWxmLCBhdHRycz1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBKYXZhU2NyaXB0LiIiIgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBpdGVtcyA9IHNlbGYuaXRlbXMoKQorICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgZm9yIEssViBpbiBpdGVtczoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIFYuanNfb3V0cHV0KGF0dHJzKSApCisgICAgICAgIHJldHVybiBfbnVsbGpvaW4ocmVzdWx0KQorICAgICMgZW5kIGpzX291dHB1dAorCisgICAgZGVmIGxvYWQoc2VsZiwgcmF3ZGF0YSk6CisgICAgICAgICIiIkxvYWQgY29va2llcyBmcm9tIGEgc3RyaW5nIChwcmVzdW1hYmx5IEhUVFBfQ09PS0lFKSBvcgorICAgICAgICBmcm9tIGEgZGljdGlvbmFyeS4gIExvYWRpbmcgY29va2llcyBmcm9tIGEgZGljdGlvbmFyeSAnZCcKKyAgICAgICAgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nOgorICAgICAgICAgICAgbWFwKENvb2tpZS5fX3NldGl0ZW1fXywgZC5rZXlzKCksIGQudmFsdWVzKCkpCisgICAgICAgICIiIgorICAgICAgICBpZiB0eXBlKHJhd2RhdGEpID09IHR5cGUoIiIpOgorICAgICAgICAgICAgc2VsZi5fX1BhcnNlU3RyaW5nKHJhd2RhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHNlbGYudXBkYXRlKCkgd291bGRuJ3QgY2FsbCBvdXIgY3VzdG9tIF9fc2V0aXRlbV9fCisgICAgICAgICAgICBmb3IgaywgdiBpbiByYXdkYXRhLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgc2VsZltrXSA9IHYKKyAgICAgICAgcmV0dXJuCisgICAgIyBlbmQgbG9hZCgpCisKKyAgICBkZWYgX19QYXJzZVN0cmluZyhzZWxmLCBzdHIsIHBhdHQ9X0Nvb2tpZVBhdHRlcm4pOgorICAgICAgICBpID0gMCAgICAgICAgICAgICMgT3VyIHN0YXJ0aW5nIHBvaW50CisgICAgICAgIG4gPSBsZW4oc3RyKSAgICAgIyBMZW5ndGggb2Ygc3RyaW5nCisgICAgICAgIE0gPSBOb25lICAgICAgICAgIyBjdXJyZW50IG1vcnNlbAorCisgICAgICAgIHdoaWxlIDAgPD0gaSA8IG46CisgICAgICAgICAgICAjIFN0YXJ0IGxvb2tpbmcgZm9yIGEgY29va2llCisgICAgICAgICAgICBtYXRjaCA9IHBhdHQuc2VhcmNoKHN0ciwgaSkKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaDogYnJlYWsgICAgICAgICAgIyBObyBtb3JlIGNvb2tpZXMKKworICAgICAgICAgICAgSyxWID0gbWF0Y2guZ3JvdXAoImtleSIpLCBtYXRjaC5ncm91cCgidmFsIikKKyAgICAgICAgICAgIGkgPSBtYXRjaC5lbmQoMCkKKworICAgICAgICAgICAgIyBQYXJzZSB0aGUga2V5LCB2YWx1ZSBpbiBjYXNlIGl0J3MgbWV0YWluZm8KKyAgICAgICAgICAgIGlmIEtbMF0gPT0gIiQiOgorICAgICAgICAgICAgICAgICMgV2UgaWdub3JlIGF0dHJpYnV0ZXMgd2hpY2ggcGVydGFpbiB0byB0aGUgY29va2llCisgICAgICAgICAgICAgICAgIyBtZWNoYW5pc20gYXMgYSB3aG9sZS4gIFNlZSBSRkMgMjEwOS4KKyAgICAgICAgICAgICAgICAjIChEb2VzIGFueW9uZSBjYXJlPykKKyAgICAgICAgICAgICAgICBpZiBNOgorICAgICAgICAgICAgICAgICAgICBNWyBLWzE6XSBdID0gVgorICAgICAgICAgICAgZWxpZiBLLmxvd2VyKCkgaW4gTW9yc2VsLl9yZXNlcnZlZDoKKyAgICAgICAgICAgICAgICBpZiBNOgorICAgICAgICAgICAgICAgICAgICBNWyBLIF0gPSBfdW5xdW90ZShWKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBydmFsLCBjdmFsID0gc2VsZi52YWx1ZV9kZWNvZGUoVikKKyAgICAgICAgICAgICAgICBzZWxmLl9fc2V0KEssIHJ2YWwsIGN2YWwpCisgICAgICAgICAgICAgICAgTSA9IHNlbGZbS10KKyAgICAjIGVuZCBfX1BhcnNlU3RyaW5nCisjIGVuZCBCYXNlQ29va2llIGNsYXNzCisKK2NsYXNzIFNpbXBsZUNvb2tpZShCYXNlQ29va2llKToKKyAgICAiIiJTaW1wbGVDb29raWUKKyAgICBTaW1wbGVDb29raWUgc3VwcG9ydHMgc3RyaW5ncyBhcyBjb29raWUgdmFsdWVzLiAgV2hlbiBzZXR0aW5nCisgICAgdGhlIHZhbHVlIHVzaW5nIHRoZSBkaWN0aW9uYXJ5IGFzc2lnbm1lbnQgbm90YXRpb24sIFNpbXBsZUNvb2tpZQorICAgIGNhbGxzIHRoZSBidWlsdGluIHN0cigpIHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvIGEgc3RyaW5nLiAgVmFsdWVzCisgICAgcmVjZWl2ZWQgZnJvbSBIVFRQIGFyZSBrZXB0IGFzIHN0cmluZ3MuCisgICAgIiIiCisgICAgZGVmIHZhbHVlX2RlY29kZShzZWxmLCB2YWwpOgorICAgICAgICByZXR1cm4gX3VucXVvdGUoIHZhbCApLCB2YWwKKyAgICBkZWYgdmFsdWVfZW5jb2RlKHNlbGYsIHZhbCk6CisgICAgICAgIHN0cnZhbCA9IHN0cih2YWwpCisgICAgICAgIHJldHVybiBzdHJ2YWwsIF9xdW90ZSggc3RydmFsICkKKyMgZW5kIFNpbXBsZUNvb2tpZQorCitjbGFzcyBTZXJpYWxDb29raWUoQmFzZUNvb2tpZSk6CisgICAgIiIiU2VyaWFsQ29va2llCisgICAgU2VyaWFsQ29va2llIHN1cHBvcnRzIGFyYml0cmFyeSBvYmplY3RzIGFzIGNvb2tpZSB2YWx1ZXMuIEFsbAorICAgIHZhbHVlcyBhcmUgc2VyaWFsaXplZCAodXNpbmcgY1BpY2tsZSkgYmVmb3JlIGJlaW5nIHNlbnQgdG8gdGhlCisgICAgY2xpZW50LiAgQWxsIGluY29taW5nIHZhbHVlcyBhcmUgYXNzdW1lZCB0byBiZSB2YWxpZCBQaWNrbGUKKyAgICByZXByZXNlbnRhdGlvbnMuICBJRiBBTiBJTkNPTUlORyBWQUxVRSBJUyBOT1QgSU4gQSBWQUxJRCBQSUNLTEUKKyAgICBGT1JNQVQsIFRIRU4gQU4gRVhDRVBUSU9OIFdJTEwgQkUgUkFJU0VELgorCisgICAgTm90ZTogTGFyZ2UgY29va2llIHZhbHVlcyBhZGQgb3ZlcmhlYWQgYmVjYXVzZSB0aGV5IG11c3QgYmUKKyAgICByZXRyYW5zbWl0dGVkIG9uIGV2ZXJ5IEhUVFAgdHJhbnNhY3Rpb24uCisKKyAgICBOb3RlOiBIVFRQIGhhcyBhIDJrIGxpbWl0IG9uIHRoZSBzaXplIG9mIGEgY29va2llLiAgVGhpcyBjbGFzcworICAgIGRvZXMgbm90IGNoZWNrIGZvciB0aGlzIGxpbWl0LCBzbyBiZSBjYXJlZnVsISEhCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0PU5vbmUpOgorICAgICAgICB3YXJuaW5ncy53YXJuKCJTZXJpYWxDb29raWUgY2xhc3MgaXMgaW5zZWN1cmU7IGRvIG5vdCB1c2UgaXQiLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgQmFzZUNvb2tpZS5fX2luaXRfXyhzZWxmLCBpbnB1dCkKKyAgICAjIGVuZCBfX2luaXRfXworICAgIGRlZiB2YWx1ZV9kZWNvZGUoc2VsZiwgdmFsKToKKyAgICAgICAgIyBUaGlzIGNvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiEKKyAgICAgICAgcmV0dXJuIGxvYWRzKCBfdW5xdW90ZSh2YWwpICksIHZhbAorICAgIGRlZiB2YWx1ZV9lbmNvZGUoc2VsZiwgdmFsKToKKyAgICAgICAgcmV0dXJuIHZhbCwgX3F1b3RlKCBkdW1wcyh2YWwpICkKKyMgZW5kIFNlcmlhbENvb2tpZQorCitjbGFzcyBTbWFydENvb2tpZShCYXNlQ29va2llKToKKyAgICAiIiJTbWFydENvb2tpZQorICAgIFNtYXJ0Q29va2llIHN1cHBvcnRzIGFyYml0cmFyeSBvYmplY3RzIGFzIGNvb2tpZSB2YWx1ZXMuICBJZiB0aGUKKyAgICBvYmplY3QgaXMgYSBzdHJpbmcsIHRoZW4gaXQgaXMgcXVvdGVkLiAgSWYgdGhlIG9iamVjdCBpcyBub3QgYQorICAgIHN0cmluZywgaG93ZXZlciwgdGhlbiBTbWFydENvb2tpZSB3aWxsIHVzZSBjUGlja2xlIHRvIHNlcmlhbGl6ZQorICAgIHRoZSBvYmplY3QgaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKworICAgIE5vdGU6IExhcmdlIGNvb2tpZSB2YWx1ZXMgYWRkIG92ZXJoZWFkIGJlY2F1c2UgdGhleSBtdXN0IGJlCisgICAgcmV0cmFuc21pdHRlZCBvbiBldmVyeSBIVFRQIHRyYW5zYWN0aW9uLgorCisgICAgTm90ZTogSFRUUCBoYXMgYSAyayBsaW1pdCBvbiB0aGUgc2l6ZSBvZiBhIGNvb2tpZS4gIFRoaXMgY2xhc3MKKyAgICBkb2VzIG5vdCBjaGVjayBmb3IgdGhpcyBsaW1pdCwgc28gYmUgY2FyZWZ1bCEhIQorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnB1dD1Ob25lKToKKyAgICAgICAgd2FybmluZ3Mud2FybigiQ29va2llL1NtYXJ0Q29va2llIGNsYXNzIGlzIGluc2VjdXJlOyBkbyBub3QgdXNlIGl0IiwKKyAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIEJhc2VDb29raWUuX19pbml0X18oc2VsZiwgaW5wdXQpCisgICAgIyBlbmQgX19pbml0X18KKyAgICBkZWYgdmFsdWVfZGVjb2RlKHNlbGYsIHZhbCk6CisgICAgICAgIHN0cnZhbCA9IF91bnF1b3RlKHZhbCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGxvYWRzKHN0cnZhbCksIHZhbAorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gc3RydmFsLCB2YWwKKyAgICBkZWYgdmFsdWVfZW5jb2RlKHNlbGYsIHZhbCk6CisgICAgICAgIGlmIHR5cGUodmFsKSA9PSB0eXBlKCIiKToKKyAgICAgICAgICAgIHJldHVybiB2YWwsIF9xdW90ZSh2YWwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gdmFsLCBfcXVvdGUoIGR1bXBzKHZhbCkgKQorIyBlbmQgU21hcnRDb29raWUKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCYWNrd2FyZHMgQ29tcGF0aWJpbGl0eTogIERvbid0IGJyZWFrIGFueSBleGlzdGluZyBjb2RlIQorCisjIFdlIHByb3ZpZGUgQ29va2llKCkgYXMgYW4gYWxpYXMgZm9yIFNtYXJ0Q29va2llKCkKK0Nvb2tpZSA9IFNtYXJ0Q29va2llCisKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiBfdGVzdCgpOgorICAgIGltcG9ydCBkb2N0ZXN0LCBDb29raWUKKyAgICByZXR1cm4gZG9jdGVzdC50ZXN0bW9kKENvb2tpZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBfdGVzdCgpCisKKworI0xvY2FsIFZhcmlhYmxlczoKKyN0YWItd2lkdGg6IDQKKyNlbmQ6CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0Nvb2tpZS5weWMgYi9saWIvcHl0aG9uMi43L0Nvb2tpZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhMzJjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvQ29va2llLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0Nvb2tpZS5weW8gYi9saWIvcHl0aG9uMi43L0Nvb2tpZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhMzJjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvQ29va2llLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0RvY1hNTFJQQ1NlcnZlci5weSBiL2xpYi9weXRob24yLjcvRG9jWE1MUlBDU2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjRlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0RvY1hNTFJQQ1NlcnZlci5weQpAQCAtMCwwICsxLDI3OSBAQAorIiIiU2VsZiBkb2N1bWVudGluZyBYTUwtUlBDIFNlcnZlci4KKworVGhpcyBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIFhNTC1SUEMgc2VydmVycyB0aGF0CitzZXJ2ZSBweWRvYy1zdHlsZSBkb2N1bWVudGF0aW9uIGluIHJlc3BvbnNlIHRvIEhUVFAKK0dFVCByZXF1ZXN0cy4gVGhpcyBkb2N1bWVudGF0aW9uIGlzIGR5bmFtaWNhbGx5IGdlbmVyYXRlZAorYmFzZWQgb24gdGhlIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcyByZWdpc3RlcmVkIHdpdGggdGhlCitzZXJ2ZXIuCisKK1RoaXMgbW9kdWxlIGlzIGJ1aWx0IHVwb24gdGhlIHB5ZG9jIGFuZCBTaW1wbGVYTUxSUENTZXJ2ZXIKK21vZHVsZXMuCisiIiIKKworaW1wb3J0IHB5ZG9jCitpbXBvcnQgaW5zcGVjdAoraW1wb3J0IHJlCitpbXBvcnQgc3lzCisKK2Zyb20gU2ltcGxlWE1MUlBDU2VydmVyIGltcG9ydCAoU2ltcGxlWE1MUlBDU2VydmVyLAorICAgICAgICAgICAgU2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIsCisgICAgICAgICAgICBDR0lYTUxSUENSZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgIHJlc29sdmVfZG90dGVkX2F0dHJpYnV0ZSkKKworY2xhc3MgU2VydmVySFRNTERvYyhweWRvYy5IVE1MRG9jKToKKyAgICAiIiJDbGFzcyB1c2VkIHRvIGdlbmVyYXRlIHB5ZG9jIEhUTUwgZG9jdW1lbnQgZm9yIGEgc2VydmVyIiIiCisKKyAgICBkZWYgbWFya3VwKHNlbGYsIHRleHQsIGVzY2FwZT1Ob25lLCBmdW5jcz17fSwgY2xhc3Nlcz17fSwgbWV0aG9kcz17fSk6CisgICAgICAgICIiIk1hcmsgdXAgc29tZSBwbGFpbiB0ZXh0LCBnaXZlbiBhIGNvbnRleHQgb2Ygc3ltYm9scyB0byBsb29rIGZvci4KKyAgICAgICAgRWFjaCBjb250ZXh0IGRpY3Rpb25hcnkgbWFwcyBvYmplY3QgbmFtZXMgdG8gYW5jaG9yIG5hbWVzLiIiIgorICAgICAgICBlc2NhcGUgPSBlc2NhcGUgb3Igc2VsZi5lc2NhcGUKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIGhlcmUgPSAwCisKKyAgICAgICAgIyBYWFggTm90ZSB0aGF0IHRoaXMgcmVndWxhciBleHByZXNzaW9uIGRvZXMgbm90IGFsbG93IGZvciB0aGUKKyAgICAgICAgIyBoeXBlcmxpbmtpbmcgb2YgYXJiaXRyYXJ5IHN0cmluZ3MgYmVpbmcgdXNlZCBhcyBtZXRob2QKKyAgICAgICAgIyBuYW1lcy4gT25seSBtZXRob2RzIHdpdGggbmFtZXMgY29uc2lzdGluZyBvZiB3b3JkIGNoYXJhY3RlcnMKKyAgICAgICAgIyBhbmQgJy4ncyBhcmUgaHlwZXJsaW5rZWQuCisgICAgICAgIHBhdHRlcm4gPSByZS5jb21waWxlKHInXGIoKGh0dHB8ZnRwKTovL1xTK1tcdy9dfCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidSRkNbLSBdPyhcZCspfCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidQRVBbLSBdPyhcZCspfCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicoc2VsZlwuKT8oKD86XHd8XC4pKykpXGInKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbWF0Y2ggPSBwYXR0ZXJuLnNlYXJjaCh0ZXh0LCBoZXJlKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOiBicmVhaworICAgICAgICAgICAgc3RhcnQsIGVuZCA9IG1hdGNoLnNwYW4oKQorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoZXNjYXBlKHRleHRbaGVyZTpzdGFydF0pKQorCisgICAgICAgICAgICBhbGwsIHNjaGVtZSwgcmZjLCBwZXAsIHNlbGZkb3QsIG5hbWUgPSBtYXRjaC5ncm91cHMoKQorICAgICAgICAgICAgaWYgc2NoZW1lOgorICAgICAgICAgICAgICAgIHVybCA9IGVzY2FwZShhbGwpLnJlcGxhY2UoJyInLCAnJnF1b3Q7JykKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgnPGEgaHJlZj0iJXMiPiVzPC9hPicgJSAodXJsLCB1cmwpKQorICAgICAgICAgICAgZWxpZiByZmM6CisgICAgICAgICAgICAgICAgdXJsID0gJ2h0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYyVkLnR4dCcgJSBpbnQocmZjKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCc8YSBocmVmPSIlcyI+JXM8L2E+JyAlICh1cmwsIGVzY2FwZShhbGwpKSkKKyAgICAgICAgICAgIGVsaWYgcGVwOgorICAgICAgICAgICAgICAgIHVybCA9ICdodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLSUwNGQvJyAlIGludChwZXApCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJzxhIGhyZWY9IiVzIj4lczwvYT4nICUgKHVybCwgZXNjYXBlKGFsbCkpKQorICAgICAgICAgICAgZWxpZiB0ZXh0W2VuZDplbmQrMV0gPT0gJygnOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHNlbGYubmFtZWxpbmsobmFtZSwgbWV0aG9kcywgZnVuY3MsIGNsYXNzZXMpKQorICAgICAgICAgICAgZWxpZiBzZWxmZG90OgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCdzZWxmLjxzdHJvbmc+JXM8L3N0cm9uZz4nICUgbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoc2VsZi5uYW1lbGluayhuYW1lLCBjbGFzc2VzKSkKKyAgICAgICAgICAgIGhlcmUgPSBlbmQKKyAgICAgICAgcmVzdWx0cy5hcHBlbmQoZXNjYXBlKHRleHRbaGVyZTpdKSkKKyAgICAgICAgcmV0dXJuICcnLmpvaW4ocmVzdWx0cykKKworICAgIGRlZiBkb2Nyb3V0aW5lKHNlbGYsIG9iamVjdCwgbmFtZSwgbW9kPU5vbmUsCisgICAgICAgICAgICAgICAgICAgZnVuY3M9e30sIGNsYXNzZXM9e30sIG1ldGhvZHM9e30sIGNsPU5vbmUpOgorICAgICAgICAiIiJQcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LiIiIgorCisgICAgICAgIGFuY2hvciA9IChjbCBhbmQgY2wuX19uYW1lX18gb3IgJycpICsgJy0nICsgbmFtZQorICAgICAgICBub3RlID0gJycKKworICAgICAgICB0aXRsZSA9ICc8YSBuYW1lPSIlcyI+PHN0cm9uZz4lczwvc3Ryb25nPjwvYT4nICUgKAorICAgICAgICAgICAgc2VsZi5lc2NhcGUoYW5jaG9yKSwgc2VsZi5lc2NhcGUobmFtZSkpCisKKyAgICAgICAgaWYgaW5zcGVjdC5pc21ldGhvZChvYmplY3QpOgorICAgICAgICAgICAgYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzID0gaW5zcGVjdC5nZXRhcmdzcGVjKG9iamVjdC5pbV9mdW5jKQorICAgICAgICAgICAgIyBleGNsdWRlIHRoZSBhcmd1bWVudCBib3VuZCB0byB0aGUgaW5zdGFuY2UsIGl0IHdpbGwgYmUKKyAgICAgICAgICAgICMgY29uZnVzaW5nIHRvIHRoZSBub24tUHl0aG9uIHVzZXIKKyAgICAgICAgICAgIGFyZ3NwZWMgPSBpbnNwZWN0LmZvcm1hdGFyZ3NwZWMgKAorICAgICAgICAgICAgICAgICAgICBhcmdzWzE6XSwKKyAgICAgICAgICAgICAgICAgICAgdmFyYXJncywKKyAgICAgICAgICAgICAgICAgICAgdmFya3csCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXR2YWx1ZT1zZWxmLmZvcm1hdHZhbHVlCisgICAgICAgICAgICAgICAgKQorICAgICAgICBlbGlmIGluc3BlY3QuaXNmdW5jdGlvbihvYmplY3QpOgorICAgICAgICAgICAgYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzID0gaW5zcGVjdC5nZXRhcmdzcGVjKG9iamVjdCkKKyAgICAgICAgICAgIGFyZ3NwZWMgPSBpbnNwZWN0LmZvcm1hdGFyZ3NwZWMoCisgICAgICAgICAgICAgICAgYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzLCBmb3JtYXR2YWx1ZT1zZWxmLmZvcm1hdHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJnc3BlYyA9ICcoLi4uKScKKworICAgICAgICBpZiBpc2luc3RhbmNlKG9iamVjdCwgdHVwbGUpOgorICAgICAgICAgICAgYXJnc3BlYyA9IG9iamVjdFswXSBvciBhcmdzcGVjCisgICAgICAgICAgICBkb2NzdHJpbmcgPSBvYmplY3RbMV0gb3IgIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRvY3N0cmluZyA9IHB5ZG9jLmdldGRvYyhvYmplY3QpCisKKyAgICAgICAgZGVjbCA9IHRpdGxlICsgYXJnc3BlYyArIChub3RlIGFuZCBzZWxmLmdyZXkoCisgICAgICAgICAgICAgICAnPGZvbnQgZmFjZT0iaGVsdmV0aWNhLCBhcmlhbCI+JXM8L2ZvbnQ+JyAlIG5vdGUpKQorCisgICAgICAgIGRvYyA9IHNlbGYubWFya3VwKAorICAgICAgICAgICAgZG9jc3RyaW5nLCBzZWxmLnByZWZvcm1hdCwgZnVuY3MsIGNsYXNzZXMsIG1ldGhvZHMpCisgICAgICAgIGRvYyA9IGRvYyBhbmQgJzxkZD48dHQ+JXM8L3R0PjwvZGQ+JyAlIGRvYworICAgICAgICByZXR1cm4gJzxkbD48ZHQ+JXM8L2R0PiVzPC9kbD5cbicgJSAoZGVjbCwgZG9jKQorCisgICAgZGVmIGRvY3NlcnZlcihzZWxmLCBzZXJ2ZXJfbmFtZSwgcGFja2FnZV9kb2N1bWVudGF0aW9uLCBtZXRob2RzKToKKyAgICAgICAgIiIiUHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGFuIFhNTC1SUEMgc2VydmVyLiIiIgorCisgICAgICAgIGZkaWN0ID0ge30KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gbWV0aG9kcy5pdGVtcygpOgorICAgICAgICAgICAgZmRpY3Rba2V5XSA9ICcjLScgKyBrZXkKKyAgICAgICAgICAgIGZkaWN0W3ZhbHVlXSA9IGZkaWN0W2tleV0KKworICAgICAgICBzZXJ2ZXJfbmFtZSA9IHNlbGYuZXNjYXBlKHNlcnZlcl9uYW1lKQorICAgICAgICBoZWFkID0gJzxiaWc+PGJpZz48c3Ryb25nPiVzPC9zdHJvbmc+PC9iaWc+PC9iaWc+JyAlIHNlcnZlcl9uYW1lCisgICAgICAgIHJlc3VsdCA9IHNlbGYuaGVhZGluZyhoZWFkLCAnI2ZmZmZmZicsICcjNzc5OWVlJykKKworICAgICAgICBkb2MgPSBzZWxmLm1hcmt1cChwYWNrYWdlX2RvY3VtZW50YXRpb24sIHNlbGYucHJlZm9ybWF0LCBmZGljdCkKKyAgICAgICAgZG9jID0gZG9jIGFuZCAnPHR0PiVzPC90dD4nICUgZG9jCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICc8cD4lczwvcD5cbicgJSBkb2MKKworICAgICAgICBjb250ZW50cyA9IFtdCisgICAgICAgIG1ldGhvZF9pdGVtcyA9IHNvcnRlZChtZXRob2RzLml0ZW1zKCkpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG1ldGhvZF9pdGVtczoKKyAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZChzZWxmLmRvY3JvdXRpbmUodmFsdWUsIGtleSwgZnVuY3M9ZmRpY3QpKQorICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLmJpZ3NlY3Rpb24oCisgICAgICAgICAgICAnTWV0aG9kcycsICcjZmZmZmZmJywgJyNlZWFhNzcnLCBweWRvYy5qb2luKGNvbnRlbnRzKSkKKworICAgICAgICByZXR1cm4gcmVzdWx0CisKK2NsYXNzIFhNTFJQQ0RvY0dlbmVyYXRvcjoKKyAgICAiIiJHZW5lcmF0ZXMgZG9jdW1lbnRhdGlvbiBmb3IgYW4gWE1MLVJQQyBzZXJ2ZXIuCisKKyAgICBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIGFzIG1peC1pbiBhbmQgc2hvdWxkIG5vdAorICAgIGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5LgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIHNldHVwIHZhcmlhYmxlcyB1c2VkIGZvciBIVE1MIGRvY3VtZW50YXRpb24KKyAgICAgICAgc2VsZi5zZXJ2ZXJfbmFtZSA9ICdYTUwtUlBDIFNlcnZlciBEb2N1bWVudGF0aW9uJworICAgICAgICBzZWxmLnNlcnZlcl9kb2N1bWVudGF0aW9uID0gXAorICAgICAgICAgICAgIlRoaXMgc2VydmVyIGV4cG9ydHMgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRocm91Z2ggdGhlIFhNTC1SUEMgIlwKKyAgICAgICAgICAgICJwcm90b2NvbC4iCisgICAgICAgIHNlbGYuc2VydmVyX3RpdGxlID0gJ1hNTC1SUEMgU2VydmVyIERvY3VtZW50YXRpb24nCisKKyAgICBkZWYgc2V0X3NlcnZlcl90aXRsZShzZWxmLCBzZXJ2ZXJfdGl0bGUpOgorICAgICAgICAiIiJTZXQgdGhlIEhUTUwgdGl0bGUgb2YgdGhlIGdlbmVyYXRlZCBzZXJ2ZXIgZG9jdW1lbnRhdGlvbiIiIgorCisgICAgICAgIHNlbGYuc2VydmVyX3RpdGxlID0gc2VydmVyX3RpdGxlCisKKyAgICBkZWYgc2V0X3NlcnZlcl9uYW1lKHNlbGYsIHNlcnZlcl9uYW1lKToKKyAgICAgICAgIiIiU2V0IHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBzZXJ2ZXIgZG9jdW1lbnRhdGlvbiIiIgorCisgICAgICAgIHNlbGYuc2VydmVyX25hbWUgPSBzZXJ2ZXJfbmFtZQorCisgICAgZGVmIHNldF9zZXJ2ZXJfZG9jdW1lbnRhdGlvbihzZWxmLCBzZXJ2ZXJfZG9jdW1lbnRhdGlvbik6CisgICAgICAgICIiIlNldCB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcgZm9yIHRoZSBlbnRpcmUgc2VydmVyLiIiIgorCisgICAgICAgIHNlbGYuc2VydmVyX2RvY3VtZW50YXRpb24gPSBzZXJ2ZXJfZG9jdW1lbnRhdGlvbgorCisgICAgZGVmIGdlbmVyYXRlX2h0bWxfZG9jdW1lbnRhdGlvbihzZWxmKToKKyAgICAgICAgIiIiZ2VuZXJhdGVfaHRtbF9kb2N1bWVudGF0aW9uKCkgPT4gaHRtbCBkb2N1bWVudGF0aW9uIGZvciB0aGUgc2VydmVyCisKKyAgICAgICAgR2VuZXJhdGVzIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHNlcnZlciB1c2luZyBpbnRyb3NwZWN0aW9uIGZvcgorICAgICAgICBpbnN0YWxsZWQgZnVuY3Rpb25zIGFuZCBpbnN0YW5jZXMgdGhhdCBkbyBub3QgaW1wbGVtZW50IHRoZQorICAgICAgICBfZGlzcGF0Y2ggbWV0aG9kLiBBbHRlcm5hdGl2ZWx5LCBpbnN0YW5jZXMgY2FuIGNob29zZSB0byBpbXBsZW1lbnQKKyAgICAgICAgdGhlIF9nZXRfbWV0aG9kX2FyZ3N0cmluZyhtZXRob2RfbmFtZSkgbWV0aG9kIHRvIHByb3ZpZGUgdGhlCisgICAgICAgIGFyZ3VtZW50IHN0cmluZyB1c2VkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0aGUKKyAgICAgICAgX21ldGhvZEhlbHAobWV0aG9kX25hbWUpIG1ldGhvZCB0byBwcm92aWRlIHRoZSBoZWxwIHRleHQgdXNlZAorICAgICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbi4iIiIKKworICAgICAgICBtZXRob2RzID0ge30KKworICAgICAgICBmb3IgbWV0aG9kX25hbWUgaW4gc2VsZi5zeXN0ZW1fbGlzdE1ldGhvZHMoKToKKyAgICAgICAgICAgIGlmIG1ldGhvZF9uYW1lIGluIHNlbGYuZnVuY3M6CisgICAgICAgICAgICAgICAgbWV0aG9kID0gc2VsZi5mdW5jc1ttZXRob2RfbmFtZV0KKyAgICAgICAgICAgIGVsaWYgc2VsZi5pbnN0YW5jZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBtZXRob2RfaW5mbyA9IFtOb25lLCBOb25lXSAjIGFyZ3NwZWMsIGRvY3VtZW50YXRpb24KKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuaW5zdGFuY2UsICdfZ2V0X21ldGhvZF9hcmdzdHJpbmcnKToKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kX2luZm9bMF0gPSBzZWxmLmluc3RhbmNlLl9nZXRfbWV0aG9kX2FyZ3N0cmluZyhtZXRob2RfbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuaW5zdGFuY2UsICdfbWV0aG9kSGVscCcpOgorICAgICAgICAgICAgICAgICAgICBtZXRob2RfaW5mb1sxXSA9IHNlbGYuaW5zdGFuY2UuX21ldGhvZEhlbHAobWV0aG9kX25hbWUpCisKKyAgICAgICAgICAgICAgICBtZXRob2RfaW5mbyA9IHR1cGxlKG1ldGhvZF9pbmZvKQorICAgICAgICAgICAgICAgIGlmIG1ldGhvZF9pbmZvICE9IChOb25lLCBOb25lKToKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gbWV0aG9kX2luZm8KKyAgICAgICAgICAgICAgICBlbGlmIG5vdCBoYXNhdHRyKHNlbGYuaW5zdGFuY2UsICdfZGlzcGF0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gcmVzb2x2ZV9kb3R0ZWRfYXR0cmlidXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IG1ldGhvZF9pbmZvCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gbWV0aG9kX2luZm8KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNzZXJ0IDAsICJDb3VsZCBub3QgZmluZCBtZXRob2QgaW4gc2VsZi5mdW5jdGlvbnMgYW5kIG5vICJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZSBpbnN0YWxsZWQiCisKKyAgICAgICAgICAgIG1ldGhvZHNbbWV0aG9kX25hbWVdID0gbWV0aG9kCisKKyAgICAgICAgZG9jdW1lbnRlciA9IFNlcnZlckhUTUxEb2MoKQorICAgICAgICBkb2N1bWVudGF0aW9uID0gZG9jdW1lbnRlci5kb2NzZXJ2ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX2RvY3VtZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50ZXIucGFnZShzZWxmLnNlcnZlcl90aXRsZSwgZG9jdW1lbnRhdGlvbikKKworY2xhc3MgRG9jWE1MUlBDUmVxdWVzdEhhbmRsZXIoU2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIpOgorICAgICIiIlhNTC1SUEMgYW5kIGRvY3VtZW50YXRpb24gcmVxdWVzdCBoYW5kbGVyIGNsYXNzLgorCisgICAgSGFuZGxlcyBhbGwgSFRUUCBQT1NUIHJlcXVlc3RzIGFuZCBhdHRlbXB0cyB0byBkZWNvZGUgdGhlbSBhcworICAgIFhNTC1SUEMgcmVxdWVzdHMuCisKKyAgICBIYW5kbGVzIGFsbCBIVFRQIEdFVCByZXF1ZXN0cyBhbmQgaW50ZXJwcmV0cyB0aGVtIGFzIHJlcXVlc3RzCisgICAgZm9yIGRvY3VtZW50YXRpb24uCisgICAgIiIiCisKKyAgICBkZWYgZG9fR0VUKHNlbGYpOgorICAgICAgICAiIiJIYW5kbGVzIHRoZSBIVFRQIEdFVCByZXF1ZXN0LgorCisgICAgICAgIEludGVycHJldCBhbGwgSFRUUCBHRVQgcmVxdWVzdHMgYXMgcmVxdWVzdHMgZm9yIHNlcnZlcgorICAgICAgICBkb2N1bWVudGF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBwYXRoIGlzIGxlZ2FsCisgICAgICAgIGlmIG5vdCBzZWxmLmlzX3JwY19wYXRoX3ZhbGlkKCk6CisgICAgICAgICAgICBzZWxmLnJlcG9ydF80MDQoKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnNlcnZlci5nZW5lcmF0ZV9odG1sX2RvY3VtZW50YXRpb24oKQorICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LXR5cGUiLCAidGV4dC9odG1sIikKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1sZW5ndGgiLCBzdHIobGVuKHJlc3BvbnNlKSkpCisgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICBzZWxmLndmaWxlLndyaXRlKHJlc3BvbnNlKQorCitjbGFzcyBEb2NYTUxSUENTZXJ2ZXIoICBTaW1wbGVYTUxSUENTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBYTUxSUENEb2NHZW5lcmF0b3IpOgorICAgICIiIlhNTC1SUEMgYW5kIEhUTUwgZG9jdW1lbnRhdGlvbiBzZXJ2ZXIuCisKKyAgICBBZGRzIHRoZSBhYmlsaXR5IHRvIHNlcnZlIHNlcnZlciBkb2N1bWVudGF0aW9uIHRvIHRoZSBjYXBhYmlsaXRpZXMKKyAgICBvZiBTaW1wbGVYTUxSUENTZXJ2ZXIuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkciwgcmVxdWVzdEhhbmRsZXI9RG9jWE1MUlBDUmVxdWVzdEhhbmRsZXIsCisgICAgICAgICAgICAgICAgIGxvZ1JlcXVlc3RzPTEsIGFsbG93X25vbmU9RmFsc2UsIGVuY29kaW5nPU5vbmUsCisgICAgICAgICAgICAgICAgIGJpbmRfYW5kX2FjdGl2YXRlPVRydWUpOgorICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIuX19pbml0X18oc2VsZiwgYWRkciwgcmVxdWVzdEhhbmRsZXIsIGxvZ1JlcXVlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfbm9uZSwgZW5jb2RpbmcsIGJpbmRfYW5kX2FjdGl2YXRlKQorICAgICAgICBYTUxSUENEb2NHZW5lcmF0b3IuX19pbml0X18oc2VsZikKKworY2xhc3MgRG9jQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXIoICAgQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxSUENEb2NHZW5lcmF0b3IpOgorICAgICIiIkhhbmRsZXIgZm9yIFhNTC1SUEMgZGF0YSBhbmQgZG9jdW1lbnRhdGlvbiByZXF1ZXN0cyBwYXNzZWQgdGhyb3VnaAorICAgIENHSSIiIgorCisgICAgZGVmIGhhbmRsZV9nZXQoc2VsZik6CisgICAgICAgICIiIkhhbmRsZXMgdGhlIEhUVFAgR0VUIHJlcXVlc3QuCisKKyAgICAgICAgSW50ZXJwcmV0IGFsbCBIVFRQIEdFVCByZXF1ZXN0cyBhcyByZXF1ZXN0cyBmb3Igc2VydmVyCisgICAgICAgIGRvY3VtZW50YXRpb24uCisgICAgICAgICIiIgorCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5nZW5lcmF0ZV9odG1sX2RvY3VtZW50YXRpb24oKQorCisgICAgICAgIHByaW50ICdDb250ZW50LVR5cGU6IHRleHQvaHRtbCcKKyAgICAgICAgcHJpbnQgJ0NvbnRlbnQtTGVuZ3RoOiAlZCcgJSBsZW4ocmVzcG9uc2UpCisgICAgICAgIHByaW50CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUocmVzcG9uc2UpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIENHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIFhNTFJQQ0RvY0dlbmVyYXRvci5fX2luaXRfXyhzZWxmKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9Eb2NYTUxSUENTZXJ2ZXIucHljIGIvbGliL3B5dGhvbjIuNy9Eb2NYTUxSUENTZXJ2ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZWViZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0RvY1hNTFJQQ1NlcnZlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9Eb2NYTUxSUENTZXJ2ZXIucHlvIGIvbGliL3B5dGhvbjIuNy9Eb2NYTUxSUENTZXJ2ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTA4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0RvY1hNTFJQQ1NlcnZlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9IVE1MUGFyc2VyLnB5IGIvbGliL3B5dGhvbjIuNy9IVE1MUGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzZhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0hUTUxQYXJzZXIucHkKQEAgLTAsMCArMSw0NzIgQEAKKyIiIkEgcGFyc2VyIGZvciBIVE1MIGFuZCBYSFRNTC4iIiIKKworIyBUaGlzIGZpbGUgaXMgYmFzZWQgb24gc2dtbGxpYi5weSwgYnV0IHRoZSBBUEkgaXMgc2xpZ2h0bHkgZGlmZmVyZW50LgorCisjIFhYWCBUaGVyZSBzaG91bGQgYmUgYSB3YXkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBQQ0RBVEEgKHBhcnNlZAorIyBjaGFyYWN0ZXIgZGF0YSAtLSB0aGUgbm9ybWFsIGNhc2UpLCBSQ0RBVEEgKHJlcGxhY2VhYmxlIGNoYXJhY3RlcgorIyBkYXRhIC0tIG9ubHkgY2hhciBhbmQgZW50aXR5IHJlZmVyZW5jZXMgYW5kIGVuZCB0YWdzIGFyZSBzcGVjaWFsKQorIyBhbmQgQ0RBVEEgKGNoYXJhY3RlciBkYXRhIC0tIG9ubHkgZW5kIHRhZ3MgYXJlIHNwZWNpYWwpLgorCisKK2ltcG9ydCBtYXJrdXBiYXNlCitpbXBvcnQgcmUKKworIyBSZWd1bGFyIGV4cHJlc3Npb25zIHVzZWQgZm9yIHBhcnNpbmcKKworaW50ZXJlc3Rpbmdfbm9ybWFsID0gcmUuY29tcGlsZSgnWyY8XScpCitpbmNvbXBsZXRlID0gcmUuY29tcGlsZSgnJlthLXpBLVojXScpCisKK2VudGl0eXJlZiA9IHJlLmNvbXBpbGUoJyYoW2EtekEtWl1bLS5hLXpBLVowLTldKilbXmEtekEtWjAtOV0nKQorY2hhcnJlZiA9IHJlLmNvbXBpbGUoJyYjKD86WzAtOV0rfFt4WF1bMC05YS1mQS1GXSspW14wLTlhLWZBLUZdJykKKworc3RhcnR0YWdvcGVuID0gcmUuY29tcGlsZSgnPFthLXpBLVpdJykKK3BpY2xvc2UgPSByZS5jb21waWxlKCc+JykKK2NvbW1lbnRjbG9zZSA9IHJlLmNvbXBpbGUocictLVxzKj4nKQordGFnZmluZCA9IHJlLmNvbXBpbGUoJyhbYS16QS1aXVstLmEtekEtWjAtOTpfXSopKD86XHN8Lyg/IT4pKSonKQorIyBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvdG9rZW5pemF0aW9uLmh0bWwjdGFnLW9wZW4tc3RhdGUKKyMgYW5kIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3Rva2VuaXphdGlvbi5odG1sI3RhZy1uYW1lLXN0YXRlCit0YWdmaW5kX3RvbGVyYW50ID0gcmUuY29tcGlsZSgnW2EtekEtWl1bXlx0XG5cclxmIC8+XHgwMF0qJykKKworYXR0cmZpbmQgPSByZS5jb21waWxlKAorICAgIHInKCg/PD1bXCciXHMvXSlbXlxzLz5dW15ccy89Pl0qKShccyo9K1xzKicKKyAgICByJyhcJ1teXCddKlwnfCJbXiJdKiJ8KD8hW1wnIl0pW14+XHNdKikpPyg/OlxzfC8oPyE+KSkqJykKKworbG9jYXRlc3RhcnR0YWdlbmQgPSByZS5jb21waWxlKHIiIiIKKyAgPFthLXpBLVpdWy0uYS16QS1aMC05Ol9dKiAgICAgICAgICAjIHRhZyBuYW1lCisgICg/Oltccy9dKiAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCB3aGl0ZXNwYWNlIGJlZm9yZSBhdHRyaWJ1dGUgbmFtZQorICAgICg/Oig/PD1bJyJccy9dKVteXHMvPl1bXlxzLz0+XSogICMgYXR0cmlidXRlIG5hbWUKKyAgICAgICg/OlxzKj0rXHMqICAgICAgICAgICAgICAgICAgICAjIHZhbHVlIGluZGljYXRvcgorICAgICAgICAoPzonW14nXSonICAgICAgICAgICAgICAgICAgICMgTElUQS1lbmNsb3NlZCB2YWx1ZQorICAgICAgICAgIHwiW14iXSoiICAgICAgICAgICAgICAgICAgICMgTElULWVuY2xvc2VkIHZhbHVlCisgICAgICAgICAgfCg/IVsnIl0pW14+XHNdKiAgICAgICAgICAgIyBiYXJlIHZhbHVlCisgICAgICAgICApCisgICAgICAgKT8oPzpcc3wvKD8hPikpKgorICAgICApKgorICAgKT8KKyAgXHMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyIiIiwgcmUuVkVSQk9TRSkKK2VuZGVuZHRhZyA9IHJlLmNvbXBpbGUoJz4nKQorIyB0aGUgSFRNTCA1IHNwZWMsIHNlY3Rpb24gOC4xLjIuMiwgZG9lc24ndCBhbGxvdyBzcGFjZXMgYmV0d2VlbgorIyA8LyBhbmQgdGhlIHRhZyBuYW1lLCBzbyBtYXliZSB0aGlzIHNob3VsZCBiZSBmaXhlZAorZW5kdGFnZmluZCA9IHJlLmNvbXBpbGUoJzwvXHMqKFthLXpBLVpdWy0uYS16QS1aMC05Ol9dKilccyo+JykKKworCitjbGFzcyBIVE1MUGFyc2VFcnJvcihFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgZm9yIGFsbCBwYXJzZSBlcnJvcnMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbXNnLCBwb3NpdGlvbj0oTm9uZSwgTm9uZSkpOgorICAgICAgICBhc3NlcnQgbXNnCisgICAgICAgIHNlbGYubXNnID0gbXNnCisgICAgICAgIHNlbGYubGluZW5vID0gcG9zaXRpb25bMF0KKyAgICAgICAgc2VsZi5vZmZzZXQgPSBwb3NpdGlvblsxXQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYubXNnCisgICAgICAgIGlmIHNlbGYubGluZW5vIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgIiwgYXQgbGluZSAlZCIgJSBzZWxmLmxpbmVubworICAgICAgICBpZiBzZWxmLm9mZnNldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICIsIGNvbHVtbiAlZCIgJSAoc2VsZi5vZmZzZXQgKyAxKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKworY2xhc3MgSFRNTFBhcnNlcihtYXJrdXBiYXNlLlBhcnNlckJhc2UpOgorICAgICIiIkZpbmQgdGFncyBhbmQgb3RoZXIgbWFya3VwIGFuZCBjYWxsIGhhbmRsZXIgZnVuY3Rpb25zLgorCisgICAgVXNhZ2U6CisgICAgICAgIHAgPSBIVE1MUGFyc2VyKCkKKyAgICAgICAgcC5mZWVkKGRhdGEpCisgICAgICAgIC4uLgorICAgICAgICBwLmNsb3NlKCkKKworICAgIFN0YXJ0IHRhZ3MgYXJlIGhhbmRsZWQgYnkgY2FsbGluZyBzZWxmLmhhbmRsZV9zdGFydHRhZygpIG9yCisgICAgc2VsZi5oYW5kbGVfc3RhcnRlbmR0YWcoKTsgZW5kIHRhZ3MgYnkgc2VsZi5oYW5kbGVfZW5kdGFnKCkuICBUaGUKKyAgICBkYXRhIGJldHdlZW4gdGFncyBpcyBwYXNzZWQgZnJvbSB0aGUgcGFyc2VyIHRvIHRoZSBkZXJpdmVkIGNsYXNzCisgICAgYnkgY2FsbGluZyBzZWxmLmhhbmRsZV9kYXRhKCkgd2l0aCB0aGUgZGF0YSBhcyBhcmd1bWVudCAodGhlIGRhdGEKKyAgICBtYXkgYmUgc3BsaXQgdXAgaW4gYXJiaXRyYXJ5IGNodW5rcykuICBFbnRpdHkgcmVmZXJlbmNlcyBhcmUKKyAgICBwYXNzZWQgYnkgY2FsbGluZyBzZWxmLmhhbmRsZV9lbnRpdHlyZWYoKSB3aXRoIHRoZSBlbnRpdHkKKyAgICByZWZlcmVuY2UgYXMgdGhlIGFyZ3VtZW50LiAgTnVtZXJpYyBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBhcmUKKyAgICBwYXNzZWQgdG8gc2VsZi5oYW5kbGVfY2hhcnJlZigpIHdpdGggdGhlIHN0cmluZyBjb250YWluaW5nIHRoZQorICAgIHJlZmVyZW5jZSBhcyB0aGUgYXJndW1lbnQuCisgICAgIiIiCisKKyAgICBDREFUQV9DT05URU5UX0VMRU1FTlRTID0gKCJzY3JpcHQiLCAic3R5bGUiKQorCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICIiIkluaXRpYWxpemUgYW5kIHJlc2V0IHRoaXMgaW5zdGFuY2UuIiIiCisgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICAiIiJSZXNldCB0aGlzIGluc3RhbmNlLiAgTG9zZXMgYWxsIHVucHJvY2Vzc2VkIGRhdGEuIiIiCisgICAgICAgIHNlbGYucmF3ZGF0YSA9ICcnCisgICAgICAgIHNlbGYubGFzdHRhZyA9ICc/Pz8nCisgICAgICAgIHNlbGYuaW50ZXJlc3RpbmcgPSBpbnRlcmVzdGluZ19ub3JtYWwKKyAgICAgICAgc2VsZi5jZGF0YV9lbGVtID0gTm9uZQorICAgICAgICBtYXJrdXBiYXNlLlBhcnNlckJhc2UucmVzZXQoc2VsZikKKworICAgIGRlZiBmZWVkKHNlbGYsIGRhdGEpOgorICAgICAgICByIiIiRmVlZCBkYXRhIHRvIHRoZSBwYXJzZXIuCisKKyAgICAgICAgQ2FsbCB0aGlzIGFzIG9mdGVuIGFzIHlvdSB3YW50LCB3aXRoIGFzIGxpdHRsZSBvciBhcyBtdWNoIHRleHQKKyAgICAgICAgYXMgeW91IHdhbnQgKG1heSBpbmNsdWRlICdcbicpLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5yYXdkYXRhID0gc2VsZi5yYXdkYXRhICsgZGF0YQorICAgICAgICBzZWxmLmdvYWhlYWQoMCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiSGFuZGxlIGFueSBidWZmZXJlZCBkYXRhLiIiIgorICAgICAgICBzZWxmLmdvYWhlYWQoMSkKKworICAgIGRlZiBlcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgcmFpc2UgSFRNTFBhcnNlRXJyb3IobWVzc2FnZSwgc2VsZi5nZXRwb3MoKSkKKworICAgIF9fc3RhcnR0YWdfdGV4dCA9IE5vbmUKKworICAgIGRlZiBnZXRfc3RhcnR0YWdfdGV4dChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGZ1bGwgc291cmNlIG9mIHN0YXJ0IHRhZzogJzwuLi4+Jy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19zdGFydHRhZ190ZXh0CisKKyAgICBkZWYgc2V0X2NkYXRhX21vZGUoc2VsZiwgZWxlbSk6CisgICAgICAgIHNlbGYuY2RhdGFfZWxlbSA9IGVsZW0ubG93ZXIoKQorICAgICAgICBzZWxmLmludGVyZXN0aW5nID0gcmUuY29tcGlsZShyJzwvXHMqJXNccyo+JyAlIHNlbGYuY2RhdGFfZWxlbSwgcmUuSSkKKworICAgIGRlZiBjbGVhcl9jZGF0YV9tb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmludGVyZXN0aW5nID0gaW50ZXJlc3Rpbmdfbm9ybWFsCisgICAgICAgIHNlbGYuY2RhdGFfZWxlbSA9IE5vbmUKKworICAgICMgSW50ZXJuYWwgLS0gaGFuZGxlIGRhdGEgYXMgZmFyIGFzIHJlYXNvbmFibGUuICBNYXkgbGVhdmUgc3RhdGUKKyAgICAjIGFuZCBkYXRhIHRvIGJlIHByb2Nlc3NlZCBieSBhIHN1YnNlcXVlbnQgY2FsbC4gIElmICdlbmQnIGlzCisgICAgIyB0cnVlLCBmb3JjZSBoYW5kbGluZyBhbGwgZGF0YSBhcyBpZiBmb2xsb3dlZCBieSBFT0YgbWFya2VyLgorICAgIGRlZiBnb2FoZWFkKHNlbGYsIGVuZCk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgaSA9IDAKKyAgICAgICAgbiA9IGxlbihyYXdkYXRhKQorICAgICAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgICAgIG1hdGNoID0gc2VsZi5pbnRlcmVzdGluZy5zZWFyY2gocmF3ZGF0YSwgaSkgIyA8IG9yICYKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIGogPSBtYXRjaC5zdGFydCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2RhdGFfZWxlbToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBqID0gbgorICAgICAgICAgICAgaWYgaSA8IGo6IHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpOmpdKQorICAgICAgICAgICAgaSA9IHNlbGYudXBkYXRlcG9zKGksIGopCisgICAgICAgICAgICBpZiBpID09IG46IGJyZWFrCisgICAgICAgICAgICBzdGFydHN3aXRoID0gcmF3ZGF0YS5zdGFydHN3aXRoCisgICAgICAgICAgICBpZiBzdGFydHN3aXRoKCc8JywgaSk6CisgICAgICAgICAgICAgICAgaWYgc3RhcnR0YWdvcGVuLm1hdGNoKHJhd2RhdGEsIGkpOiAjIDwgKyBsZXR0ZXIKKyAgICAgICAgICAgICAgICAgICAgayA9IHNlbGYucGFyc2Vfc3RhcnR0YWcoaSkKKyAgICAgICAgICAgICAgICBlbGlmIHN0YXJ0c3dpdGgoIjwvIiwgaSk6CisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX2VuZHRhZyhpKQorICAgICAgICAgICAgICAgIGVsaWYgc3RhcnRzd2l0aCgiPCEtLSIsIGkpOgorICAgICAgICAgICAgICAgICAgICBrID0gc2VsZi5wYXJzZV9jb21tZW50KGkpCisgICAgICAgICAgICAgICAgZWxpZiBzdGFydHN3aXRoKCI8PyIsIGkpOgorICAgICAgICAgICAgICAgICAgICBrID0gc2VsZi5wYXJzZV9waShpKQorICAgICAgICAgICAgICAgIGVsaWYgc3RhcnRzd2l0aCgiPCEiLCBpKToKKyAgICAgICAgICAgICAgICAgICAgayA9IHNlbGYucGFyc2VfaHRtbF9kZWNsYXJhdGlvbihpKQorICAgICAgICAgICAgICAgIGVsaWYgKGkgKyAxKSA8IG46CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoIjwiKQorICAgICAgICAgICAgICAgICAgICBrID0gaSArIDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIGsgPCAwOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZW5kOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgayA9IHJhd2RhdGEuZmluZCgnPicsIGkgKyAxKQorICAgICAgICAgICAgICAgICAgICBpZiBrIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGsgPSByYXdkYXRhLmZpbmQoJzwnLCBpICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGsgPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBpICsgMQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgayArPSAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpOmtdKQorICAgICAgICAgICAgICAgIGkgPSBzZWxmLnVwZGF0ZXBvcyhpLCBrKQorICAgICAgICAgICAgZWxpZiBzdGFydHN3aXRoKCImIyIsIGkpOgorICAgICAgICAgICAgICAgIG1hdGNoID0gY2hhcnJlZi5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gbWF0Y2guZ3JvdXAoKVsyOi0xXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9jaGFycmVmKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGsgPSBtYXRjaC5lbmQoKQorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3RhcnRzd2l0aCgnOycsIGstMSk6CisgICAgICAgICAgICAgICAgICAgICAgICBrID0gayAtIDEKKyAgICAgICAgICAgICAgICAgICAgaSA9IHNlbGYudXBkYXRlcG9zKGksIGspCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgIjsiIGluIHJhd2RhdGFbaTpdOiAjYmFpbCBieSBjb25zdW1pbmcgJiMKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVswOjJdKQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHNlbGYudXBkYXRlcG9zKGksIDIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIHN0YXJ0c3dpdGgoJyYnLCBpKToKKyAgICAgICAgICAgICAgICBtYXRjaCA9IGVudGl0eXJlZi5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZW50aXR5cmVmKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGsgPSBtYXRjaC5lbmQoKQorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3RhcnRzd2l0aCgnOycsIGstMSk6CisgICAgICAgICAgICAgICAgICAgICAgICBrID0gayAtIDEKKyAgICAgICAgICAgICAgICAgICAgaSA9IHNlbGYudXBkYXRlcG9zKGksIGspCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbWF0Y2ggPSBpbmNvbXBsZXRlLm1hdGNoKHJhd2RhdGEsIGkpCisgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgICMgbWF0Y2guZ3JvdXAoKSB3aWxsIGNvbnRhaW4gYXQgbGVhc3QgMiBjaGFycworICAgICAgICAgICAgICAgICAgICBpZiBlbmQgYW5kIG1hdGNoLmdyb3VwKCkgPT0gcmF3ZGF0YVtpOl06CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKCJFT0YgaW4gbWlkZGxlIG9mIGVudGl0eSBvciBjaGFyIHJlZiIpCisgICAgICAgICAgICAgICAgICAgICMgaW5jb21wbGV0ZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgKGkgKyAxKSA8IG46CisgICAgICAgICAgICAgICAgICAgICMgbm90IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgYW5kIGNhbid0IGJlIGNvbmZ1c2VkCisgICAgICAgICAgICAgICAgICAgICMgd2l0aCBzb21lIG90aGVyIGNvbnN0cnVjdAorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKCImIikKKyAgICAgICAgICAgICAgICAgICAgaSA9IHNlbGYudXBkYXRlcG9zKGksIGkgKyAxKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFzc2VydCAwLCAiaW50ZXJlc3Rpbmcuc2VhcmNoKCkgbGllZCIKKyAgICAgICAgIyBlbmQgd2hpbGUKKyAgICAgICAgaWYgZW5kIGFuZCBpIDwgbiBhbmQgbm90IHNlbGYuY2RhdGFfZWxlbToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpOm5dKQorICAgICAgICAgICAgaSA9IHNlbGYudXBkYXRlcG9zKGksIG4pCisgICAgICAgIHNlbGYucmF3ZGF0YSA9IHJhd2RhdGFbaTpdCisKKyAgICAjIEludGVybmFsIC0tIHBhcnNlIGh0bWwgZGVjbGFyYXRpb25zLCByZXR1cm4gbGVuZ3RoIG9yIC0xIGlmIG5vdCB0ZXJtaW5hdGVkCisgICAgIyBTZWUgdzMub3JnL1RSL2h0bWw1L3Rva2VuaXphdGlvbi5odG1sI21hcmt1cC1kZWNsYXJhdGlvbi1vcGVuLXN0YXRlCisgICAgIyBTZWUgYWxzbyBwYXJzZV9kZWNsYXJhdGlvbiBpbiBfbWFya3VwYmFzZQorICAgIGRlZiBwYXJzZV9odG1sX2RlY2xhcmF0aW9uKHNlbGYsIGkpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGlmIHJhd2RhdGFbaTppKzJdICE9ICc8ISc6CisgICAgICAgICAgICBzZWxmLmVycm9yKCd1bmV4cGVjdGVkIGNhbGwgdG8gcGFyc2VfaHRtbF9kZWNsYXJhdGlvbigpJykKKyAgICAgICAgaWYgcmF3ZGF0YVtpOmkrNF0gPT0gJzwhLS0nOgorICAgICAgICAgICAgIyB0aGlzIGNhc2UgaXMgYWN0dWFsbHkgYWxyZWFkeSBoYW5kbGVkIGluIGdvYWhlYWQoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfY29tbWVudChpKQorICAgICAgICBlbGlmIHJhd2RhdGFbaTppKzNdID09ICc8IVsnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfbWFya2VkX3NlY3Rpb24oaSkKKyAgICAgICAgZWxpZiByYXdkYXRhW2k6aSs5XS5sb3dlcigpID09ICc8IWRvY3R5cGUnOgorICAgICAgICAgICAgIyBmaW5kIHRoZSBjbG9zaW5nID4KKyAgICAgICAgICAgIGd0cG9zID0gcmF3ZGF0YS5maW5kKCc+JywgaSs5KQorICAgICAgICAgICAgaWYgZ3Rwb3MgPT0gLTE6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9kZWNsKHJhd2RhdGFbaSsyOmd0cG9zXSkKKyAgICAgICAgICAgIHJldHVybiBndHBvcysxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9ib2d1c19jb21tZW50KGkpCisKKyAgICAjIEludGVybmFsIC0tIHBhcnNlIGJvZ3VzIGNvbW1lbnQsIHJldHVybiBsZW5ndGggb3IgLTEgaWYgbm90IHRlcm1pbmF0ZWQKKyAgICAjIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS90b2tlbml6YXRpb24uaHRtbCNib2d1cy1jb21tZW50LXN0YXRlCisgICAgZGVmIHBhcnNlX2JvZ3VzX2NvbW1lbnQoc2VsZiwgaSwgcmVwb3J0PTEpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGlmIHJhd2RhdGFbaTppKzJdIG5vdCBpbiAoJzwhJywgJzwvJyk6CisgICAgICAgICAgICBzZWxmLmVycm9yKCd1bmV4cGVjdGVkIGNhbGwgdG8gcGFyc2VfY29tbWVudCgpJykKKyAgICAgICAgcG9zID0gcmF3ZGF0YS5maW5kKCc+JywgaSsyKQorICAgICAgICBpZiBwb3MgPT0gLTE6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgaWYgcmVwb3J0OgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29tbWVudChyYXdkYXRhW2krMjpwb3NdKQorICAgICAgICByZXR1cm4gcG9zICsgMQorCisgICAgIyBJbnRlcm5hbCAtLSBwYXJzZSBwcm9jZXNzaW5nIGluc3RyLCByZXR1cm4gZW5kIG9yIC0xIGlmIG5vdCB0ZXJtaW5hdGVkCisgICAgZGVmIHBhcnNlX3BpKHNlbGYsIGkpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGFzc2VydCByYXdkYXRhW2k6aSsyXSA9PSAnPD8nLCAndW5leHBlY3RlZCBjYWxsIHRvIHBhcnNlX3BpKCknCisgICAgICAgIG1hdGNoID0gcGljbG9zZS5zZWFyY2gocmF3ZGF0YSwgaSsyKSAjID4KKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGogPSBtYXRjaC5zdGFydCgpCisgICAgICAgIHNlbGYuaGFuZGxlX3BpKHJhd2RhdGFbaSsyOiBqXSkKKyAgICAgICAgaiA9IG1hdGNoLmVuZCgpCisgICAgICAgIHJldHVybiBqCisKKyAgICAjIEludGVybmFsIC0tIGhhbmRsZSBzdGFydHRhZywgcmV0dXJuIGVuZCBvciAtMSBpZiBub3QgdGVybWluYXRlZAorICAgIGRlZiBwYXJzZV9zdGFydHRhZyhzZWxmLCBpKToKKyAgICAgICAgc2VsZi5fX3N0YXJ0dGFnX3RleHQgPSBOb25lCisgICAgICAgIGVuZHBvcyA9IHNlbGYuY2hlY2tfZm9yX3dob2xlX3N0YXJ0X3RhZyhpKQorICAgICAgICBpZiBlbmRwb3MgPCAwOgorICAgICAgICAgICAgcmV0dXJuIGVuZHBvcworICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIHNlbGYuX19zdGFydHRhZ190ZXh0ID0gcmF3ZGF0YVtpOmVuZHBvc10KKworICAgICAgICAjIE5vdyBwYXJzZSB0aGUgZGF0YSBiZXR3ZWVuIGkrMSBhbmQgaiBpbnRvIGEgdGFnIGFuZCBhdHRycworICAgICAgICBhdHRycyA9IFtdCisgICAgICAgIG1hdGNoID0gdGFnZmluZC5tYXRjaChyYXdkYXRhLCBpKzEpCisgICAgICAgIGFzc2VydCBtYXRjaCwgJ3VuZXhwZWN0ZWQgY2FsbCB0byBwYXJzZV9zdGFydHRhZygpJworICAgICAgICBrID0gbWF0Y2guZW5kKCkKKyAgICAgICAgc2VsZi5sYXN0dGFnID0gdGFnID0gbWF0Y2guZ3JvdXAoMSkubG93ZXIoKQorCisgICAgICAgIHdoaWxlIGsgPCBlbmRwb3M6CisgICAgICAgICAgICBtID0gYXR0cmZpbmQubWF0Y2gocmF3ZGF0YSwgaykKKyAgICAgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBhdHRybmFtZSwgcmVzdCwgYXR0cnZhbHVlID0gbS5ncm91cCgxLCAyLCAzKQorICAgICAgICAgICAgaWYgbm90IHJlc3Q6CisgICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gTm9uZQorICAgICAgICAgICAgZWxpZiBhdHRydmFsdWVbOjFdID09ICdcJycgPT0gYXR0cnZhbHVlWy0xOl0gb3IgXAorICAgICAgICAgICAgICAgICBhdHRydmFsdWVbOjFdID09ICciJyA9PSBhdHRydmFsdWVbLTE6XToKKyAgICAgICAgICAgICAgICBhdHRydmFsdWUgPSBhdHRydmFsdWVbMTotMV0KKyAgICAgICAgICAgIGlmIGF0dHJ2YWx1ZToKKyAgICAgICAgICAgICAgICBhdHRydmFsdWUgPSBzZWxmLnVuZXNjYXBlKGF0dHJ2YWx1ZSkKKyAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgoYXR0cm5hbWUubG93ZXIoKSwgYXR0cnZhbHVlKSkKKyAgICAgICAgICAgIGsgPSBtLmVuZCgpCisKKyAgICAgICAgZW5kID0gcmF3ZGF0YVtrOmVuZHBvc10uc3RyaXAoKQorICAgICAgICBpZiBlbmQgbm90IGluICgiPiIsICIvPiIpOgorICAgICAgICAgICAgbGluZW5vLCBvZmZzZXQgPSBzZWxmLmdldHBvcygpCisgICAgICAgICAgICBpZiAiXG4iIGluIHNlbGYuX19zdGFydHRhZ190ZXh0OgorICAgICAgICAgICAgICAgIGxpbmVubyA9IGxpbmVubyArIHNlbGYuX19zdGFydHRhZ190ZXh0LmNvdW50KCJcbiIpCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbGVuKHNlbGYuX19zdGFydHRhZ190ZXh0KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgLSBzZWxmLl9fc3RhcnR0YWdfdGV4dC5yZmluZCgiXG4iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgKyBsZW4oc2VsZi5fX3N0YXJ0dGFnX3RleHQpCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaTplbmRwb3NdKQorICAgICAgICAgICAgcmV0dXJuIGVuZHBvcworICAgICAgICBpZiBlbmQuZW5kc3dpdGgoJy8+Jyk6CisgICAgICAgICAgICAjIFhIVE1MLXN0eWxlIGVtcHR5IHRhZzogPHNwYW4gYXR0cj0idmFsdWUiIC8+CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9zdGFydGVuZHRhZyh0YWcsIGF0dHJzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfc3RhcnR0YWcodGFnLCBhdHRycykKKyAgICAgICAgICAgIGlmIHRhZyBpbiBzZWxmLkNEQVRBX0NPTlRFTlRfRUxFTUVOVFM6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRfY2RhdGFfbW9kZSh0YWcpCisgICAgICAgIHJldHVybiBlbmRwb3MKKworICAgICMgSW50ZXJuYWwgLS0gY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBjb21wbGV0ZSBzdGFydHRhZzsgcmV0dXJuIGVuZAorICAgICMgb3IgLTEgaWYgaW5jb21wbGV0ZS4KKyAgICBkZWYgY2hlY2tfZm9yX3dob2xlX3N0YXJ0X3RhZyhzZWxmLCBpKToKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBtID0gbG9jYXRlc3RhcnR0YWdlbmQubWF0Y2gocmF3ZGF0YSwgaSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIGogPSBtLmVuZCgpCisgICAgICAgICAgICBuZXh0ID0gcmF3ZGF0YVtqOmorMV0KKyAgICAgICAgICAgIGlmIG5leHQgPT0gIj4iOgorICAgICAgICAgICAgICAgIHJldHVybiBqICsgMQorICAgICAgICAgICAgaWYgbmV4dCA9PSAiLyI6CisgICAgICAgICAgICAgICAgaWYgcmF3ZGF0YS5zdGFydHN3aXRoKCIvPiIsIGopOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaiArIDIKKyAgICAgICAgICAgICAgICBpZiByYXdkYXRhLnN0YXJ0c3dpdGgoIi8iLCBqKToKKyAgICAgICAgICAgICAgICAgICAgIyBidWZmZXIgYm91bmRhcnkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgIyBlbHNlIGJvZ3VzIGlucHV0CisgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVwb3MoaSwgaiArIDEpCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvcigibWFsZm9ybWVkIGVtcHR5IHN0YXJ0IHRhZyIpCisgICAgICAgICAgICBpZiBuZXh0ID09ICIiOgorICAgICAgICAgICAgICAgICMgZW5kIG9mIGlucHV0CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBpZiBuZXh0IGluICgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo9LyIKKyAgICAgICAgICAgICAgICAgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIpOgorICAgICAgICAgICAgICAgICMgZW5kIG9mIGlucHV0IGluIG9yIGJlZm9yZSBhdHRyaWJ1dGUgdmFsdWUsIG9yIHdlIGhhdmUgdGhlCisgICAgICAgICAgICAgICAgIyAnLycgZnJvbSBhICcvPicgZW5kaW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBpZiBqID4gaToKKyAgICAgICAgICAgICAgICByZXR1cm4gagorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gaSArIDEKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIndlIHNob3VsZCBub3QgZ2V0IGhlcmUhIikKKworICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgZW5kdGFnLCByZXR1cm4gZW5kIG9yIC0xIGlmIGluY29tcGxldGUKKyAgICBkZWYgcGFyc2VfZW5kdGFnKHNlbGYsIGkpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGFzc2VydCByYXdkYXRhW2k6aSsyXSA9PSAiPC8iLCAidW5leHBlY3RlZCBjYWxsIHRvIHBhcnNlX2VuZHRhZyIKKyAgICAgICAgbWF0Y2ggPSBlbmRlbmR0YWcuc2VhcmNoKHJhd2RhdGEsIGkrMSkgIyA+CisgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBndHBvcyA9IG1hdGNoLmVuZCgpCisgICAgICAgIG1hdGNoID0gZW5kdGFnZmluZC5tYXRjaChyYXdkYXRhLCBpKSAjIDwvICsgdGFnICsgPgorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICBpZiBzZWxmLmNkYXRhX2VsZW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2k6Z3Rwb3NdKQorICAgICAgICAgICAgICAgIHJldHVybiBndHBvcworICAgICAgICAgICAgIyBmaW5kIHRoZSBuYW1lOiB3My5vcmcvVFIvaHRtbDUvdG9rZW5pemF0aW9uLmh0bWwjdGFnLW5hbWUtc3RhdGUKKyAgICAgICAgICAgIG5hbWVtYXRjaCA9IHRhZ2ZpbmRfdG9sZXJhbnQubWF0Y2gocmF3ZGF0YSwgaSsyKQorICAgICAgICAgICAgaWYgbm90IG5hbWVtYXRjaDoKKyAgICAgICAgICAgICAgICAjIHczLm9yZy9UUi9odG1sNS90b2tlbml6YXRpb24uaHRtbCNlbmQtdGFnLW9wZW4tc3RhdGUKKyAgICAgICAgICAgICAgICBpZiByYXdkYXRhW2k6aSszXSA9PSAnPC8+JzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkrMworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2JvZ3VzX2NvbW1lbnQoaSkKKyAgICAgICAgICAgIHRhZ25hbWUgPSBuYW1lbWF0Y2guZ3JvdXAoKS5sb3dlcigpCisgICAgICAgICAgICAjIGNvbnN1bWUgYW5kIGlnbm9yZSBvdGhlciBzdHVmZiBiZXR3ZWVuIHRoZSBuYW1lIGFuZCB0aGUgPgorICAgICAgICAgICAgIyBOb3RlOiB0aGlzIGlzIG5vdCAxMDAlIGNvcnJlY3QsIHNpbmNlIHdlIG1pZ2h0IGhhdmUgdGhpbmdzIGxpa2UKKyAgICAgICAgICAgICMgPC90YWcgYXR0cj0iPiI+LCBidXQgbG9va2luZyBmb3IgPiBhZnRlciB0aGEgbmFtZSBzaG91bGQgY292ZXIKKyAgICAgICAgICAgICMgbW9zdCBvZiB0aGUgY2FzZXMgYW5kIGlzIG11Y2ggc2ltcGxlcgorICAgICAgICAgICAgZ3Rwb3MgPSByYXdkYXRhLmZpbmQoJz4nLCBuYW1lbWF0Y2guZW5kKCkpCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9lbmR0YWcodGFnbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBndHBvcysxCisKKyAgICAgICAgZWxlbSA9IG1hdGNoLmdyb3VwKDEpLmxvd2VyKCkgIyBzY3JpcHQgb3Igc3R5bGUKKyAgICAgICAgaWYgc2VsZi5jZGF0YV9lbGVtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgZWxlbSAhPSBzZWxmLmNkYXRhX2VsZW06CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2k6Z3Rwb3NdKQorICAgICAgICAgICAgICAgIHJldHVybiBndHBvcworCisgICAgICAgIHNlbGYuaGFuZGxlX2VuZHRhZyhlbGVtKQorICAgICAgICBzZWxmLmNsZWFyX2NkYXRhX21vZGUoKQorICAgICAgICByZXR1cm4gZ3Rwb3MKKworICAgICMgT3ZlcnJpZGFibGUgLS0gZmluaXNoIHByb2Nlc3Npbmcgb2Ygc3RhcnQrZW5kIHRhZzogPHRhZy4uLi8+CisgICAgZGVmIGhhbmRsZV9zdGFydGVuZHRhZyhzZWxmLCB0YWcsIGF0dHJzKToKKyAgICAgICAgc2VsZi5oYW5kbGVfc3RhcnR0YWcodGFnLCBhdHRycykKKyAgICAgICAgc2VsZi5oYW5kbGVfZW5kdGFnKHRhZykKKworICAgICMgT3ZlcnJpZGFibGUgLS0gaGFuZGxlIHN0YXJ0IHRhZworICAgIGRlZiBoYW5kbGVfc3RhcnR0YWcoc2VsZiwgdGFnLCBhdHRycyk6CisgICAgICAgIHBhc3MKKworICAgICMgT3ZlcnJpZGFibGUgLS0gaGFuZGxlIGVuZCB0YWcKKyAgICBkZWYgaGFuZGxlX2VuZHRhZyhzZWxmLCB0YWcpOgorICAgICAgICBwYXNzCisKKyAgICAjIE92ZXJyaWRhYmxlIC0tIGhhbmRsZSBjaGFyYWN0ZXIgcmVmZXJlbmNlCisgICAgZGVmIGhhbmRsZV9jaGFycmVmKHNlbGYsIG5hbWUpOgorICAgICAgICBwYXNzCisKKyAgICAjIE92ZXJyaWRhYmxlIC0tIGhhbmRsZSBlbnRpdHkgcmVmZXJlbmNlCisgICAgZGVmIGhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgIHBhc3MKKworICAgICMgT3ZlcnJpZGFibGUgLS0gaGFuZGxlIGRhdGEKKyAgICBkZWYgaGFuZGxlX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHBhc3MKKworICAgICMgT3ZlcnJpZGFibGUgLS0gaGFuZGxlIGNvbW1lbnQKKyAgICBkZWYgaGFuZGxlX2NvbW1lbnQoc2VsZiwgZGF0YSk6CisgICAgICAgIHBhc3MKKworICAgICMgT3ZlcnJpZGFibGUgLS0gaGFuZGxlIGRlY2xhcmF0aW9uCisgICAgZGVmIGhhbmRsZV9kZWNsKHNlbGYsIGRlY2wpOgorICAgICAgICBwYXNzCisKKyAgICAjIE92ZXJyaWRhYmxlIC0tIGhhbmRsZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uCisgICAgZGVmIGhhbmRsZV9waShzZWxmLCBkYXRhKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHVua25vd25fZGVjbChzZWxmLCBkYXRhKToKKyAgICAgICAgcGFzcworCisgICAgIyBJbnRlcm5hbCAtLSBoZWxwZXIgdG8gcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVyIHF1b3RpbmcKKyAgICBlbnRpdHlkZWZzID0gTm9uZQorICAgIGRlZiB1bmVzY2FwZShzZWxmLCBzKToKKyAgICAgICAgaWYgJyYnIG5vdCBpbiBzOgorICAgICAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgZGVmIHJlcGxhY2VFbnRpdGllcyhzKToKKyAgICAgICAgICAgIHMgPSBzLmdyb3VwcygpWzBdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgc1swXSA9PSAiIyI6CisgICAgICAgICAgICAgICAgICAgIHMgPSBzWzE6XQorICAgICAgICAgICAgICAgICAgICBpZiBzWzBdIGluIFsneCcsJ1gnXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBpbnQoc1sxOl0sIDE2KQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGludChzKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5pY2hyKGMpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gJyYjJytzKyc7JworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIENhbm5vdCB1c2UgbmFtZTJjb2RlcG9pbnQgZGlyZWN0bHksIGJlY2F1c2UgSFRNTFBhcnNlciBzdXBwb3J0cyBhcG9zLAorICAgICAgICAgICAgICAgICMgd2hpY2ggaXMgbm90IHBhcnQgb2YgSFRNTCA0CisgICAgICAgICAgICAgICAgaW1wb3J0IGh0bWxlbnRpdHlkZWZzCisgICAgICAgICAgICAgICAgaWYgSFRNTFBhcnNlci5lbnRpdHlkZWZzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGVudGl0eWRlZnMgPSBIVE1MUGFyc2VyLmVudGl0eWRlZnMgPSB7J2Fwb3MnOnUiJyJ9CisgICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIGh0bWxlbnRpdHlkZWZzLm5hbWUyY29kZXBvaW50Lml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5ZGVmc1trXSA9IHVuaWNocih2KQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW50aXR5ZGVmc1tzXQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcmJytzKyc7JworCisgICAgICAgIHJldHVybiByZS5zdWIociImKCM/W3hYXT8oPzpbMC05YS1mQS1GXSt8XHd7MSw4fSkpOyIsIHJlcGxhY2VFbnRpdGllcywgcykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvSFRNTFBhcnNlci5weWMgYi9saWIvcHl0aG9uMi43L0hUTUxQYXJzZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NDQyMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0hUTUxQYXJzZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvSFRNTFBhcnNlci5weW8gYi9saWIvcHl0aG9uMi43L0hUTUxQYXJzZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Y2NmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0hUTUxQYXJzZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvTElDRU5TRS50eHQgYi9saWIvcHl0aG9uMi43L0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlODljMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMjc5IEBACitBLiBISVNUT1JZIE9GIFRIRSBTT0ZUV0FSRQorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUHl0aG9uIHdhcyBjcmVhdGVkIGluIHRoZSBlYXJseSAxOTkwcyBieSBHdWlkbyB2YW4gUm9zc3VtIGF0IFN0aWNodGluZworTWF0aGVtYXRpc2NoIENlbnRydW0gKENXSSwgc2VlIGh0dHA6Ly93d3cuY3dpLm5sKSBpbiB0aGUgTmV0aGVybGFuZHMKK2FzIGEgc3VjY2Vzc29yIG9mIGEgbGFuZ3VhZ2UgY2FsbGVkIEFCQy4gIEd1aWRvIHJlbWFpbnMgUHl0aG9uJ3MKK3ByaW5jaXBhbCBhdXRob3IsIGFsdGhvdWdoIGl0IGluY2x1ZGVzIG1hbnkgY29udHJpYnV0aW9ucyBmcm9tIG90aGVycy4KKworSW4gMTk5NSwgR3VpZG8gY29udGludWVkIGhpcyB3b3JrIG9uIFB5dGhvbiBhdCB0aGUgQ29ycG9yYXRpb24gZm9yCitOYXRpb25hbCBSZXNlYXJjaCBJbml0aWF0aXZlcyAoQ05SSSwgc2VlIGh0dHA6Ly93d3cuY25yaS5yZXN0b24udmEudXMpCitpbiBSZXN0b24sIFZpcmdpbmlhIHdoZXJlIGhlIHJlbGVhc2VkIHNldmVyYWwgdmVyc2lvbnMgb2YgdGhlCitzb2Z0d2FyZS4KKworSW4gTWF5IDIwMDAsIEd1aWRvIGFuZCB0aGUgUHl0aG9uIGNvcmUgZGV2ZWxvcG1lbnQgdGVhbSBtb3ZlZCB0bworQmVPcGVuLmNvbSB0byBmb3JtIHRoZSBCZU9wZW4gUHl0aG9uTGFicyB0ZWFtLiAgSW4gT2N0b2JlciBvZiB0aGUgc2FtZQoreWVhciwgdGhlIFB5dGhvbkxhYnMgdGVhbSBtb3ZlZCB0byBEaWdpdGFsIENyZWF0aW9ucyAobm93IFpvcGUKK0NvcnBvcmF0aW9uLCBzZWUgaHR0cDovL3d3dy56b3BlLmNvbSkuICBJbiAyMDAxLCB0aGUgUHl0aG9uIFNvZnR3YXJlCitGb3VuZGF0aW9uIChQU0YsIHNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHNmLykgd2FzIGZvcm1lZCwgYQorbm9uLXByb2ZpdCBvcmdhbml6YXRpb24gY3JlYXRlZCBzcGVjaWZpY2FsbHkgdG8gb3duIFB5dGhvbi1yZWxhdGVkCitJbnRlbGxlY3R1YWwgUHJvcGVydHkuICBab3BlIENvcnBvcmF0aW9uIGlzIGEgc3BvbnNvcmluZyBtZW1iZXIgb2YKK3RoZSBQU0YuCisKK0FsbCBQeXRob24gcmVsZWFzZXMgYXJlIE9wZW4gU291cmNlIChzZWUgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZyBmb3IKK3RoZSBPcGVuIFNvdXJjZSBEZWZpbml0aW9uKS4gIEhpc3RvcmljYWxseSwgbW9zdCwgYnV0IG5vdCBhbGwsIFB5dGhvbgorcmVsZWFzZXMgaGF2ZSBhbHNvIGJlZW4gR1BMLWNvbXBhdGlibGU7IHRoZSB0YWJsZSBiZWxvdyBzdW1tYXJpemVzCit0aGUgdmFyaW91cyByZWxlYXNlcy4KKworICAgIFJlbGVhc2UgICAgICAgICBEZXJpdmVkICAgICBZZWFyICAgICAgICBPd25lciAgICAgICBHUEwtCisgICAgICAgICAgICAgICAgICAgIGZyb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGU/ICgxKQorCisgICAgMC45LjAgdGhydSAxLjIgICAgICAgICAgICAgIDE5OTEtMTk5NSAgIENXSSAgICAgICAgIHllcworICAgIDEuMyB0aHJ1IDEuNS4yICAxLjIgICAgICAgICAxOTk1LTE5OTkgICBDTlJJICAgICAgICB5ZXMKKyAgICAxLjYgICAgICAgICAgICAgMS41LjIgICAgICAgMjAwMCAgICAgICAgQ05SSSAgICAgICAgbm8KKyAgICAyLjAgICAgICAgICAgICAgMS42ICAgICAgICAgMjAwMCAgICAgICAgQmVPcGVuLmNvbSAgbm8KKyAgICAxLjYuMSAgICAgICAgICAgMS42ICAgICAgICAgMjAwMSAgICAgICAgQ05SSSAgICAgICAgeWVzICgyKQorICAgIDIuMSAgICAgICAgICAgICAyLjArMS42LjEgICAyMDAxICAgICAgICBQU0YgICAgICAgICBubworICAgIDIuMC4xICAgICAgICAgICAyLjArMS42LjEgICAyMDAxICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjEuMSAgICAgICAgICAgMi4xKzIuMC4xICAgMjAwMSAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi4yICAgICAgICAgICAgIDIuMS4xICAgICAgIDIwMDEgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuMS4yICAgICAgICAgICAyLjEuMSAgICAgICAyMDAyICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjEuMyAgICAgICAgICAgMi4xLjIgICAgICAgMjAwMiAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi4yLjEgICAgICAgICAgIDIuMiAgICAgICAgIDIwMDIgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuMi4yICAgICAgICAgICAyLjIuMSAgICAgICAyMDAyICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjIuMyAgICAgICAgICAgMi4yLjIgICAgICAgMjAwMyAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi4zICAgICAgICAgICAgIDIuMi4yICAgICAgIDIwMDItMjAwMyAgIFBTRiAgICAgICAgIHllcworICAgIDIuMy4xICAgICAgICAgICAyLjMgICAgICAgICAyMDAyLTIwMDMgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjMuMiAgICAgICAgICAgMi4zLjEgICAgICAgMjAwMi0yMDAzICAgUFNGICAgICAgICAgeWVzCisgICAgMi4zLjMgICAgICAgICAgIDIuMy4yICAgICAgIDIwMDItMjAwMyAgIFBTRiAgICAgICAgIHllcworICAgIDIuMy40ICAgICAgICAgICAyLjMuMyAgICAgICAyMDA0ICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjMuNSAgICAgICAgICAgMi4zLjQgICAgICAgMjAwNSAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi40ICAgICAgICAgICAgIDIuMyAgICAgICAgIDIwMDQgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuNC4xICAgICAgICAgICAyLjQgICAgICAgICAyMDA1ICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjQuMiAgICAgICAgICAgMi40LjEgICAgICAgMjAwNSAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi40LjMgICAgICAgICAgIDIuNC4yICAgICAgIDIwMDYgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuNC40ICAgICAgICAgICAyLjQuMyAgICAgICAyMDA2ICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjUgICAgICAgICAgICAgMi40ICAgICAgICAgMjAwNiAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi41LjEgICAgICAgICAgIDIuNSAgICAgICAgIDIwMDcgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuNS4yICAgICAgICAgICAyLjUuMSAgICAgICAyMDA4ICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjUuMyAgICAgICAgICAgMi41LjIgICAgICAgMjAwOCAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi42ICAgICAgICAgICAgIDIuNSAgICAgICAgIDIwMDggICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuNi4xICAgICAgICAgICAyLjYgICAgICAgICAyMDA4ICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjYuMiAgICAgICAgICAgMi42LjEgICAgICAgMjAwOSAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi42LjMgICAgICAgICAgIDIuNi4yICAgICAgIDIwMDkgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuNi40ICAgICAgICAgICAyLjYuMyAgICAgICAyMDA5ICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjYuNSAgICAgICAgICAgMi42LjQgICAgICAgMjAxMCAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi43ICAgICAgICAgICAgIDIuNiAgICAgICAgIDIwMTAgICAgICAgIFBTRiAgICAgICAgIHllcworCitGb290bm90ZXM6CisKKygxKSBHUEwtY29tcGF0aWJsZSBkb2Vzbid0IG1lYW4gdGhhdCB3ZSdyZSBkaXN0cmlidXRpbmcgUHl0aG9uIHVuZGVyCisgICAgdGhlIEdQTC4gIEFsbCBQeXRob24gbGljZW5zZXMsIHVubGlrZSB0aGUgR1BMLCBsZXQgeW91IGRpc3RyaWJ1dGUKKyAgICBhIG1vZGlmaWVkIHZlcnNpb24gd2l0aG91dCBtYWtpbmcgeW91ciBjaGFuZ2VzIG9wZW4gc291cmNlLiAgVGhlCisgICAgR1BMLWNvbXBhdGlibGUgbGljZW5zZXMgbWFrZSBpdCBwb3NzaWJsZSB0byBjb21iaW5lIFB5dGhvbiB3aXRoCisgICAgb3RoZXIgc29mdHdhcmUgdGhhdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMOyB0aGUgb3RoZXJzIGRvbid0LgorCisoMikgQWNjb3JkaW5nIHRvIFJpY2hhcmQgU3RhbGxtYW4sIDEuNi4xIGlzIG5vdCBHUEwtY29tcGF0aWJsZSwKKyAgICBiZWNhdXNlIGl0cyBsaWNlbnNlIGhhcyBhIGNob2ljZSBvZiBsYXcgY2xhdXNlLiAgQWNjb3JkaW5nIHRvCisgICAgQ05SSSwgaG93ZXZlciwgU3RhbGxtYW4ncyBsYXd5ZXIgaGFzIHRvbGQgQ05SSSdzIGxhd3llciB0aGF0IDEuNi4xCisgICAgaXMgIm5vdCBpbmNvbXBhdGlibGUiIHdpdGggdGhlIEdQTC4KKworVGhhbmtzIHRvIHRoZSBtYW55IG91dHNpZGUgdm9sdW50ZWVycyB3aG8gaGF2ZSB3b3JrZWQgdW5kZXIgR3VpZG8ncworZGlyZWN0aW9uIHRvIG1ha2UgdGhlc2UgcmVsZWFzZXMgcG9zc2libGUuCisKKworQi4gVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIEFDQ0VTU0lORyBPUiBPVEhFUldJU0UgVVNJTkcgUFlUSE9OCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUFlUSE9OIFNPRlRXQVJFIEZPVU5EQVRJT04gTElDRU5TRSBWRVJTSU9OIDIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEuIFRoaXMgTElDRU5TRSBBR1JFRU1FTlQgaXMgYmV0d2VlbiB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKygiUFNGIiksIGFuZCB0aGUgSW5kaXZpZHVhbCBvciBPcmdhbml6YXRpb24gKCJMaWNlbnNlZSIpIGFjY2Vzc2luZyBhbmQKK290aGVyd2lzZSB1c2luZyB0aGlzIHNvZnR3YXJlICgiUHl0aG9uIikgaW4gc291cmNlIG9yIGJpbmFyeSBmb3JtIGFuZAoraXRzIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbi4KKworMi4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIEFncmVlbWVudCwgUFNGIGhlcmVieQorZ3JhbnRzIExpY2Vuc2VlIGEgbm9uZXhjbHVzaXZlLCByb3lhbHR5LWZyZWUsIHdvcmxkLXdpZGUgbGljZW5zZSB0byByZXByb2R1Y2UsCithbmFseXplLCB0ZXN0LCBwZXJmb3JtIGFuZC9vciBkaXNwbGF5IHB1YmxpY2x5LCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MsCitkaXN0cmlidXRlLCBhbmQgb3RoZXJ3aXNlIHVzZSBQeXRob24gYWxvbmUgb3IgaW4gYW55IGRlcml2YXRpdmUgdmVyc2lvbiwKK3Byb3ZpZGVkLCBob3dldmVyLCB0aGF0IFBTRidzIExpY2Vuc2UgQWdyZWVtZW50IGFuZCBQU0YncyBub3RpY2Ugb2YgY29weXJpZ2h0LAoraS5lLiwgIkNvcHlyaWdodCAoYykgMjAwMSwgMjAwMiwgMjAwMywgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwKKzIwMTEsIDIwMTIsIDIwMTMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb247IEFsbCBSaWdodHMgUmVzZXJ2ZWQiIGFyZSByZXRhaW5lZAoraW4gUHl0aG9uIGFsb25lIG9yIGluIGFueSBkZXJpdmF0aXZlIHZlcnNpb24gcHJlcGFyZWQgYnkgTGljZW5zZWUuCisKKzMuIEluIHRoZSBldmVudCBMaWNlbnNlZSBwcmVwYXJlcyBhIGRlcml2YXRpdmUgd29yayB0aGF0IGlzIGJhc2VkIG9uCitvciBpbmNvcnBvcmF0ZXMgUHl0aG9uIG9yIGFueSBwYXJ0IHRoZXJlb2YsIGFuZCB3YW50cyB0byBtYWtlCit0aGUgZGVyaXZhdGl2ZSB3b3JrIGF2YWlsYWJsZSB0byBvdGhlcnMgYXMgcHJvdmlkZWQgaGVyZWluLCB0aGVuCitMaWNlbnNlZSBoZXJlYnkgYWdyZWVzIHRvIGluY2x1ZGUgaW4gYW55IHN1Y2ggd29yayBhIGJyaWVmIHN1bW1hcnkgb2YKK3RoZSBjaGFuZ2VzIG1hZGUgdG8gUHl0aG9uLgorCis0LiBQU0YgaXMgbWFraW5nIFB5dGhvbiBhdmFpbGFibGUgdG8gTGljZW5zZWUgb24gYW4gIkFTIElTIgorYmFzaXMuICBQU0YgTUFLRVMgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IKK0lNUExJRUQuICBCWSBXQVkgT0YgRVhBTVBMRSwgQlVUIE5PVCBMSU1JVEFUSU9OLCBQU0YgTUFLRVMgTk8gQU5ECitESVNDTEFJTVMgQU5ZIFJFUFJFU0VOVEFUSU9OIE9SIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTCitGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgUFlUSE9OIFdJTEwgTk9UCitJTkZSSU5HRSBBTlkgVEhJUkQgUEFSVFkgUklHSFRTLgorCis1LiBQU0YgU0hBTEwgTk9UIEJFIExJQUJMRSBUTyBMSUNFTlNFRSBPUiBBTlkgT1RIRVIgVVNFUlMgT0YgUFlUSE9OCitGT1IgQU5ZIElOQ0lERU5UQUwsIFNQRUNJQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBMT1NTIEFTCitBIFJFU1VMVCBPRiBNT0RJRllJTkcsIERJU1RSSUJVVElORywgT1IgT1RIRVJXSVNFIFVTSU5HIFBZVEhPTiwKK09SIEFOWSBERVJJVkFUSVZFIFRIRVJFT0YsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgVEhFUkVPRi4KKworNi4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHVwb24gYSBtYXRlcmlhbAorYnJlYWNoIG9mIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KKworNy4gTm90aGluZyBpbiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50IHNoYWxsIGJlIGRlZW1lZCB0byBjcmVhdGUgYW55CityZWxhdGlvbnNoaXAgb2YgYWdlbmN5LCBwYXJ0bmVyc2hpcCwgb3Igam9pbnQgdmVudHVyZSBiZXR3ZWVuIFBTRiBhbmQKK0xpY2Vuc2VlLiAgVGhpcyBMaWNlbnNlIEFncmVlbWVudCBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSBQU0YKK3RyYWRlbWFya3Mgb3IgdHJhZGUgbmFtZSBpbiBhIHRyYWRlbWFyayBzZW5zZSB0byBlbmRvcnNlIG9yIHByb21vdGUKK3Byb2R1Y3RzIG9yIHNlcnZpY2VzIG9mIExpY2Vuc2VlLCBvciBhbnkgdGhpcmQgcGFydHkuCisKKzguIEJ5IGNvcHlpbmcsIGluc3RhbGxpbmcgb3Igb3RoZXJ3aXNlIHVzaW5nIFB5dGhvbiwgTGljZW5zZWUKK2FncmVlcyB0byBiZSBib3VuZCBieSB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlCitBZ3JlZW1lbnQuCisKKworQkVPUEVOLkNPTSBMSUNFTlNFIEFHUkVFTUVOVCBGT1IgUFlUSE9OIDIuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCRU9QRU4gUFlUSE9OIE9QRU4gU09VUkNFIExJQ0VOU0UgQUdSRUVNRU5UIFZFUlNJT04gMQorCisxLiBUaGlzIExJQ0VOU0UgQUdSRUVNRU5UIGlzIGJldHdlZW4gQmVPcGVuLmNvbSAoIkJlT3BlbiIpLCBoYXZpbmcgYW4KK29mZmljZSBhdCAxNjAgU2FyYXRvZ2EgQXZlbnVlLCBTYW50YSBDbGFyYSwgQ0EgOTUwNTEsIGFuZCB0aGUKK0luZGl2aWR1YWwgb3IgT3JnYW5pemF0aW9uICgiTGljZW5zZWUiKSBhY2Nlc3NpbmcgYW5kIG90aGVyd2lzZSB1c2luZwordGhpcyBzb2Z0d2FyZSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0gYW5kIGl0cyBhc3NvY2lhdGVkCitkb2N1bWVudGF0aW9uICgidGhlIFNvZnR3YXJlIikuCisKKzIuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQmVPcGVuIFB5dGhvbiBMaWNlbnNlCitBZ3JlZW1lbnQsIEJlT3BlbiBoZXJlYnkgZ3JhbnRzIExpY2Vuc2VlIGEgbm9uLWV4Y2x1c2l2ZSwKK3JveWFsdHktZnJlZSwgd29ybGQtd2lkZSBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgYW5hbHl6ZSwgdGVzdCwgcGVyZm9ybQorYW5kL29yIGRpc3BsYXkgcHVibGljbHksIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcywgZGlzdHJpYnV0ZSwgYW5kCitvdGhlcndpc2UgdXNlIHRoZSBTb2Z0d2FyZSBhbG9uZSBvciBpbiBhbnkgZGVyaXZhdGl2ZSB2ZXJzaW9uLAorcHJvdmlkZWQsIGhvd2V2ZXIsIHRoYXQgdGhlIEJlT3BlbiBQeXRob24gTGljZW5zZSBpcyByZXRhaW5lZCBpbiB0aGUKK1NvZnR3YXJlLCBhbG9uZSBvciBpbiBhbnkgZGVyaXZhdGl2ZSB2ZXJzaW9uIHByZXBhcmVkIGJ5IExpY2Vuc2VlLgorCiszLiBCZU9wZW4gaXMgbWFraW5nIHRoZSBTb2Z0d2FyZSBhdmFpbGFibGUgdG8gTGljZW5zZWUgb24gYW4gIkFTIElTIgorYmFzaXMuICBCRU9QRU4gTUFLRVMgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IKK0lNUExJRUQuICBCWSBXQVkgT0YgRVhBTVBMRSwgQlVUIE5PVCBMSU1JVEFUSU9OLCBCRU9QRU4gTUFLRVMgTk8gQU5ECitESVNDTEFJTVMgQU5ZIFJFUFJFU0VOVEFUSU9OIE9SIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTCitGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIFdJTEwgTk9UCitJTkZSSU5HRSBBTlkgVEhJUkQgUEFSVFkgUklHSFRTLgorCis0LiBCRU9QRU4gU0hBTEwgTk9UIEJFIExJQUJMRSBUTyBMSUNFTlNFRSBPUiBBTlkgT1RIRVIgVVNFUlMgT0YgVEhFCitTT0ZUV0FSRSBGT1IgQU5ZIElOQ0lERU5UQUwsIFNQRUNJQUwsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBMT1NTCitBUyBBIFJFU1VMVCBPRiBVU0lORywgTU9ESUZZSU5HIE9SIERJU1RSSUJVVElORyBUSEUgU09GVFdBUkUsIE9SIEFOWQorREVSSVZBVElWRSBUSEVSRU9GLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIFRIRVJFT0YuCisKKzUuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB1cG9uIGEgbWF0ZXJpYWwKK2JyZWFjaCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCisKKzYuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgc2hhbGwgYmUgZ292ZXJuZWQgYnkgYW5kIGludGVycHJldGVkIGluIGFsbAorcmVzcGVjdHMgYnkgdGhlIGxhdyBvZiB0aGUgU3RhdGUgb2YgQ2FsaWZvcm5pYSwgZXhjbHVkaW5nIGNvbmZsaWN0IG9mCitsYXcgcHJvdmlzaW9ucy4gIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIEFncmVlbWVudCBzaGFsbCBiZSBkZWVtZWQgdG8KK2NyZWF0ZSBhbnkgcmVsYXRpb25zaGlwIG9mIGFnZW5jeSwgcGFydG5lcnNoaXAsIG9yIGpvaW50IHZlbnR1cmUKK2JldHdlZW4gQmVPcGVuIGFuZCBMaWNlbnNlZS4gIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgZG9lcyBub3QgZ3JhbnQKK3Blcm1pc3Npb24gdG8gdXNlIEJlT3BlbiB0cmFkZW1hcmtzIG9yIHRyYWRlIG5hbWVzIGluIGEgdHJhZGVtYXJrCitzZW5zZSB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgb3Igc2VydmljZXMgb2YgTGljZW5zZWUsIG9yIGFueQordGhpcmQgcGFydHkuICBBcyBhbiBleGNlcHRpb24sIHRoZSAiQmVPcGVuIFB5dGhvbiIgbG9nb3MgYXZhaWxhYmxlIGF0CitodHRwOi8vd3d3LnB5dGhvbmxhYnMuY29tL2xvZ29zLmh0bWwgbWF5IGJlIHVzZWQgYWNjb3JkaW5nIHRvIHRoZQorcGVybWlzc2lvbnMgZ3JhbnRlZCBvbiB0aGF0IHdlYiBwYWdlLgorCis3LiBCeSBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIG90aGVyd2lzZSB1c2luZyB0aGUgc29mdHdhcmUsIExpY2Vuc2VlCithZ3JlZXMgdG8gYmUgYm91bmQgYnkgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZQorQWdyZWVtZW50LgorCisKK0NOUkkgTElDRU5TRSBBR1JFRU1FTlQgRk9SIFBZVEhPTiAxLjYuMQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKzEuIFRoaXMgTElDRU5TRSBBR1JFRU1FTlQgaXMgYmV0d2VlbiB0aGUgQ29ycG9yYXRpb24gZm9yIE5hdGlvbmFsCitSZXNlYXJjaCBJbml0aWF0aXZlcywgaGF2aW5nIGFuIG9mZmljZSBhdCAxODk1IFByZXN0b24gV2hpdGUgRHJpdmUsCitSZXN0b24sIFZBIDIwMTkxICgiQ05SSSIpLCBhbmQgdGhlIEluZGl2aWR1YWwgb3IgT3JnYW5pemF0aW9uCisoIkxpY2Vuc2VlIikgYWNjZXNzaW5nIGFuZCBvdGhlcndpc2UgdXNpbmcgUHl0aG9uIDEuNi4xIHNvZnR3YXJlIGluCitzb3VyY2Ugb3IgYmluYXJ5IGZvcm0gYW5kIGl0cyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24uCisKKzIuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSBBZ3JlZW1lbnQsIENOUkkKK2hlcmVieSBncmFudHMgTGljZW5zZWUgYSBub25leGNsdXNpdmUsIHJveWFsdHktZnJlZSwgd29ybGQtd2lkZQorbGljZW5zZSB0byByZXByb2R1Y2UsIGFuYWx5emUsIHRlc3QsIHBlcmZvcm0gYW5kL29yIGRpc3BsYXkgcHVibGljbHksCitwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MsIGRpc3RyaWJ1dGUsIGFuZCBvdGhlcndpc2UgdXNlIFB5dGhvbiAxLjYuMQorYWxvbmUgb3IgaW4gYW55IGRlcml2YXRpdmUgdmVyc2lvbiwgcHJvdmlkZWQsIGhvd2V2ZXIsIHRoYXQgQ05SSSdzCitMaWNlbnNlIEFncmVlbWVudCBhbmQgQ05SSSdzIG5vdGljZSBvZiBjb3B5cmlnaHQsIGkuZS4sICJDb3B5cmlnaHQgKGMpCisxOTk1LTIwMDEgQ29ycG9yYXRpb24gZm9yIE5hdGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzOyBBbGwgUmlnaHRzCitSZXNlcnZlZCIgYXJlIHJldGFpbmVkIGluIFB5dGhvbiAxLjYuMSBhbG9uZSBvciBpbiBhbnkgZGVyaXZhdGl2ZQordmVyc2lvbiBwcmVwYXJlZCBieSBMaWNlbnNlZS4gIEFsdGVybmF0ZWx5LCBpbiBsaWV1IG9mIENOUkkncyBMaWNlbnNlCitBZ3JlZW1lbnQsIExpY2Vuc2VlIG1heSBzdWJzdGl0dXRlIHRoZSBmb2xsb3dpbmcgdGV4dCAob21pdHRpbmcgdGhlCitxdW90ZXMpOiAiUHl0aG9uIDEuNi4xIGlzIG1hZGUgYXZhaWxhYmxlIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZAorY29uZGl0aW9ucyBpbiBDTlJJJ3MgTGljZW5zZSBBZ3JlZW1lbnQuICBUaGlzIEFncmVlbWVudCB0b2dldGhlciB3aXRoCitQeXRob24gMS42LjEgbWF5IGJlIGxvY2F0ZWQgb24gdGhlIEludGVybmV0IHVzaW5nIHRoZSBmb2xsb3dpbmcKK3VuaXF1ZSwgcGVyc2lzdGVudCBpZGVudGlmaWVyIChrbm93biBhcyBhIGhhbmRsZSk6IDE4OTUuMjIvMTAxMy4gIFRoaXMKK0FncmVlbWVudCBtYXkgYWxzbyBiZSBvYnRhaW5lZCBmcm9tIGEgcHJveHkgc2VydmVyIG9uIHRoZSBJbnRlcm5ldAordXNpbmcgdGhlIGZvbGxvd2luZyBVUkw6IGh0dHA6Ly9oZGwuaGFuZGxlLm5ldC8xODk1LjIyLzEwMTMiLgorCiszLiBJbiB0aGUgZXZlbnQgTGljZW5zZWUgcHJlcGFyZXMgYSBkZXJpdmF0aXZlIHdvcmsgdGhhdCBpcyBiYXNlZCBvbgorb3IgaW5jb3Jwb3JhdGVzIFB5dGhvbiAxLjYuMSBvciBhbnkgcGFydCB0aGVyZW9mLCBhbmQgd2FudHMgdG8gbWFrZQordGhlIGRlcml2YXRpdmUgd29yayBhdmFpbGFibGUgdG8gb3RoZXJzIGFzIHByb3ZpZGVkIGhlcmVpbiwgdGhlbgorTGljZW5zZWUgaGVyZWJ5IGFncmVlcyB0byBpbmNsdWRlIGluIGFueSBzdWNoIHdvcmsgYSBicmllZiBzdW1tYXJ5IG9mCit0aGUgY2hhbmdlcyBtYWRlIHRvIFB5dGhvbiAxLjYuMS4KKworNC4gQ05SSSBpcyBtYWtpbmcgUHl0aG9uIDEuNi4xIGF2YWlsYWJsZSB0byBMaWNlbnNlZSBvbiBhbiAiQVMgSVMiCitiYXNpcy4gIENOUkkgTUFLRVMgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IKK0lNUExJRUQuICBCWSBXQVkgT0YgRVhBTVBMRSwgQlVUIE5PVCBMSU1JVEFUSU9OLCBDTlJJIE1BS0VTIE5PIEFORAorRElTQ0xBSU1TIEFOWSBSRVBSRVNFTlRBVElPTiBPUiBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUworRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgVEhBVCBUSEUgVVNFIE9GIFBZVEhPTiAxLjYuMSBXSUxMIE5PVAorSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFJJR0hUUy4KKworNS4gQ05SSSBTSEFMTCBOT1QgQkUgTElBQkxFIFRPIExJQ0VOU0VFIE9SIEFOWSBPVEhFUiBVU0VSUyBPRiBQWVRIT04KKzEuNi4xIEZPUiBBTlkgSU5DSURFTlRBTCwgU1BFQ0lBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIExPU1MgQVMKK0EgUkVTVUxUIE9GIE1PRElGWUlORywgRElTVFJJQlVUSU5HLCBPUiBPVEhFUldJU0UgVVNJTkcgUFlUSE9OIDEuNi4xLAorT1IgQU5ZIERFUklWQVRJVkUgVEhFUkVPRiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBUSEVSRU9GLgorCis2LiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgdXBvbiBhIG1hdGVyaWFsCiticmVhY2ggb2YgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zLgorCis3LiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IHNoYWxsIGJlIGdvdmVybmVkIGJ5IHRoZSBmZWRlcmFsCitpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3IG9mIHRoZSBVbml0ZWQgU3RhdGVzLCBpbmNsdWRpbmcgd2l0aG91dAorbGltaXRhdGlvbiB0aGUgZmVkZXJhbCBjb3B5cmlnaHQgbGF3LCBhbmQsIHRvIHRoZSBleHRlbnQgc3VjaAorVS5TLiBmZWRlcmFsIGxhdyBkb2VzIG5vdCBhcHBseSwgYnkgdGhlIGxhdyBvZiB0aGUgQ29tbW9ud2VhbHRoIG9mCitWaXJnaW5pYSwgZXhjbHVkaW5nIFZpcmdpbmlhJ3MgY29uZmxpY3Qgb2YgbGF3IHByb3Zpc2lvbnMuCitOb3R3aXRoc3RhbmRpbmcgdGhlIGZvcmVnb2luZywgd2l0aCByZWdhcmQgdG8gZGVyaXZhdGl2ZSB3b3JrcyBiYXNlZAorb24gUHl0aG9uIDEuNi4xIHRoYXQgaW5jb3Jwb3JhdGUgbm9uLXNlcGFyYWJsZSBtYXRlcmlhbCB0aGF0IHdhcworcHJldmlvdXNseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIHRoZQorbGF3IG9mIHRoZSBDb21tb253ZWFsdGggb2YgVmlyZ2luaWEgc2hhbGwgZ292ZXJuIHRoaXMgTGljZW5zZQorQWdyZWVtZW50IG9ubHkgYXMgdG8gaXNzdWVzIGFyaXNpbmcgdW5kZXIgb3Igd2l0aCByZXNwZWN0IHRvCitQYXJhZ3JhcGhzIDQsIDUsIGFuZCA3IG9mIHRoaXMgTGljZW5zZSBBZ3JlZW1lbnQuICBOb3RoaW5nIGluIHRoaXMKK0xpY2Vuc2UgQWdyZWVtZW50IHNoYWxsIGJlIGRlZW1lZCB0byBjcmVhdGUgYW55IHJlbGF0aW9uc2hpcCBvZgorYWdlbmN5LCBwYXJ0bmVyc2hpcCwgb3Igam9pbnQgdmVudHVyZSBiZXR3ZWVuIENOUkkgYW5kIExpY2Vuc2VlLiAgVGhpcworTGljZW5zZSBBZ3JlZW1lbnQgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgQ05SSSB0cmFkZW1hcmtzIG9yCit0cmFkZSBuYW1lIGluIGEgdHJhZGVtYXJrIHNlbnNlIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBvcgorc2VydmljZXMgb2YgTGljZW5zZWUsIG9yIGFueSB0aGlyZCBwYXJ0eS4KKworOC4gQnkgY2xpY2tpbmcgb24gdGhlICJBQ0NFUFQiIGJ1dHRvbiB3aGVyZSBpbmRpY2F0ZWQsIG9yIGJ5IGNvcHlpbmcsCitpbnN0YWxsaW5nIG9yIG90aGVyd2lzZSB1c2luZyBQeXRob24gMS42LjEsIExpY2Vuc2VlIGFncmVlcyB0byBiZQorYm91bmQgYnkgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSBBZ3JlZW1lbnQuCisKKyAgICAgICAgQUNDRVBUCisKKworQ1dJIExJQ0VOU0UgQUdSRUVNRU5UIEZPUiBQWVRIT04gMC45LjAgVEhST1VHSCAxLjIKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvcHlyaWdodCAoYykgMTk5MSAtIDE5OTUsIFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bSBBbXN0ZXJkYW0sCitUaGUgTmV0aGVybGFuZHMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCitQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKK2RvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKK3Byb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKK2JvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTdGljaHRpbmcgTWF0aGVtYXRpc2NoCitDZW50cnVtIG9yIENXSSBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bworZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yCitwZXJtaXNzaW9uLgorCitTVElDSFRJTkcgTUFUSEVNQVRJU0NIIENFTlRSVU0gRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPCitUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECitGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBTVElDSFRJTkcgTUFUSEVNQVRJU0NIIENFTlRSVU0gQkUgTElBQkxFCitGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCitBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAorT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvTWltZVdyaXRlci5weSBiL2xpYi9weXRob24yLjcvTWltZVdyaXRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODk4ZjlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9NaW1lV3JpdGVyLnB5CkBAIC0wLDAgKzEsMTg2IEBACisiIiJHZW5lcmljIE1JTUUgd3JpdGVyLgorCitUaGlzIG1vZHVsZSBkZWZpbmVzIHRoZSBjbGFzcyBNaW1lV3JpdGVyLiAgVGhlIE1pbWVXcml0ZXIgY2xhc3MgaW1wbGVtZW50cworYSBiYXNpYyBmb3JtYXR0ZXIgZm9yIGNyZWF0aW5nIE1JTUUgbXVsdGktcGFydCBmaWxlcy4gIEl0IGRvZXNuJ3Qgc2VlayBhcm91bmQKK3RoZSBvdXRwdXQgZmlsZSBub3IgZG9lcyBpdCB1c2UgbGFyZ2UgYW1vdW50cyBvZiBidWZmZXIgc3BhY2UuIFlvdSBtdXN0IHdyaXRlCit0aGUgcGFydHMgb3V0IGluIHRoZSBvcmRlciB0aGF0IHRoZXkgc2hvdWxkIG9jY3VyIGluIHRoZSBmaW5hbCBmaWxlLgorTWltZVdyaXRlciBkb2VzIGJ1ZmZlciB0aGUgaGVhZGVycyB5b3UgYWRkLCBhbGxvd2luZyB5b3UgdG8gcmVhcnJhbmdlIHRoZWlyCitvcmRlci4KKworIiIiCisKKworaW1wb3J0IG1pbWV0b29scworCitfX2FsbF9fID0gWyJNaW1lV3JpdGVyIl0KKworaW1wb3J0IHdhcm5pbmdzCisKK3dhcm5pbmdzLndhcm4oInRoZSBNaW1lV3JpdGVyIG1vZHVsZSBpcyBkZXByZWNhdGVkOyB1c2UgdGhlIGVtYWlsIHBhY2thZ2UgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorCitjbGFzcyBNaW1lV3JpdGVyOgorCisgICAgIiIiR2VuZXJpYyBNSU1FIHdyaXRlci4KKworICAgIE1ldGhvZHM6CisKKyAgICBfX2luaXRfXygpCisgICAgYWRkaGVhZGVyKCkKKyAgICBmbHVzaGhlYWRlcnMoKQorICAgIHN0YXJ0Ym9keSgpCisgICAgc3RhcnRtdWx0aXBhcnRib2R5KCkKKyAgICBuZXh0cGFydCgpCisgICAgbGFzdHBhcnQoKQorCisgICAgQSBNSU1FIHdyaXRlciBpcyBtdWNoIG1vcmUgcHJpbWl0aXZlIHRoYW4gYSBNSU1FIHBhcnNlci4gIEl0CisgICAgZG9lc24ndCBzZWVrIGFyb3VuZCBvbiB0aGUgb3V0cHV0IGZpbGUsIGFuZCBpdCBkb2Vzbid0IHVzZSBsYXJnZQorICAgIGFtb3VudHMgb2YgYnVmZmVyIHNwYWNlLCBzbyB5b3UgaGF2ZSB0byB3cml0ZSB0aGUgcGFydHMgaW4gdGhlCisgICAgb3JkZXIgdGhleSBzaG91bGQgb2NjdXIgb24gdGhlIG91dHB1dCBmaWxlLiAgSXQgZG9lcyBidWZmZXIgdGhlCisgICAgaGVhZGVycyB5b3UgYWRkLCBhbGxvd2luZyB5b3UgdG8gcmVhcnJhbmdlIHRoZWlyIG9yZGVyLgorCisgICAgR2VuZXJhbCB1c2FnZSBpczoKKworICAgIGYgPSA8b3BlbiB0aGUgb3V0cHV0IGZpbGU+CisgICAgdyA9IE1pbWVXcml0ZXIoZikKKyAgICAuLi5jYWxsIHcuYWRkaGVhZGVyKGtleSwgdmFsdWUpIDAgb3IgbW9yZSB0aW1lcy4uLgorCisgICAgZm9sbG93ZWQgYnkgZWl0aGVyOgorCisgICAgZiA9IHcuc3RhcnRib2R5KGNvbnRlbnRfdHlwZSkKKyAgICAuLi5jYWxsIGYud3JpdGUoZGF0YSkgZm9yIGJvZHkgZGF0YS4uLgorCisgICAgb3I6CisKKyAgICB3LnN0YXJ0bXVsdGlwYXJ0Ym9keShzdWJ0eXBlKQorICAgIGZvciBlYWNoIHBhcnQ6CisgICAgICAgIHN1YndyaXRlciA9IHcubmV4dHBhcnQoKQorICAgICAgICAuLi51c2UgdGhlIHN1YndyaXRlcidzIG1ldGhvZHMgdG8gY3JlYXRlIHRoZSBzdWJwYXJ0Li4uCisgICAgdy5sYXN0cGFydCgpCisKKyAgICBUaGUgc3Vid3JpdGVyIGlzIGFub3RoZXIgTWltZVdyaXRlciBpbnN0YW5jZSwgYW5kIHNob3VsZCBiZQorICAgIHRyZWF0ZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSB0b3BsZXZlbCBNaW1lV3JpdGVyLiAgVGhpcyB3YXksCisgICAgd3JpdGluZyByZWN1cnNpdmUgYm9keSBwYXJ0cyBpcyBlYXN5LgorCisgICAgV2FybmluZzogZG9uJ3QgZm9yZ2V0IHRvIGNhbGwgbGFzdHBhcnQoKSEKKworICAgIFhYWCBUaGVyZSBzaG91bGQgYmUgbW9yZSBzdGF0ZSBzbyBjYWxscyBtYWRlIGluIHRoZSB3cm9uZyBvcmRlcgorICAgIGFyZSBkZXRlY3RlZC4KKworICAgIFNvbWUgc3BlY2lhbCBjYXNlczoKKworICAgIC0gc3RhcnRib2R5KCkganVzdCByZXR1cm5zIHRoZSBmaWxlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3I7CisgICAgICBidXQgZG9uJ3QgdXNlIHRoaXMga25vd2xlZGdlLCBhcyBpdCBtYXkgYmUgY2hhbmdlZC4KKworICAgIC0gc3RhcnRtdWx0aXBhcnRib2R5KCkgYWN0dWFsbHkgcmV0dXJucyBhIGZpbGUgYXMgd2VsbDsKKyAgICAgIHRoaXMgY2FuIGJlIHVzZWQgdG8gd3JpdGUgdGhlIGluaXRpYWwgJ2lmIHlvdSBjYW4gcmVhZCB0aGlzIHlvdXIKKyAgICAgIG1haWxlciBpcyBub3QgTUlNRS1hd2FyZScgbWVzc2FnZS4KKworICAgIC0gSWYgeW91IGNhbGwgZmx1c2hoZWFkZXJzKCksIHRoZSBoZWFkZXJzIGFjY3VtdWxhdGVkIHNvIGZhciBhcmUKKyAgICAgIHdyaXR0ZW4gb3V0IChhbmQgZm9yZ290dGVuKTsgdGhpcyBpcyB1c2VmdWwgaWYgeW91IGRvbid0IG5lZWQgYQorICAgICAgYm9keSBwYXJ0IGF0IGFsbCwgZS5nLiBmb3IgYSBzdWJwYXJ0IG9mIHR5cGUgbWVzc2FnZS9yZmM4MjIKKyAgICAgIHRoYXQncyAobWlzKXVzZWQgdG8gc3RvcmUgc29tZSBoZWFkZXItbGlrZSBpbmZvcm1hdGlvbi4KKworICAgIC0gUGFzc2luZyBhIGtleXdvcmQgYXJndW1lbnQgJ3ByZWZpeD08ZmxhZz4nIHRvIGFkZGhlYWRlcigpLAorICAgICAgc3RhcnQqYm9keSgpIGFmZmVjdHMgd2hlcmUgdGhlIGhlYWRlciBpcyBpbnNlcnRlZDsgMCBtZWFucworICAgICAgYXBwZW5kIGF0IHRoZSBlbmQsIDEgbWVhbnMgaW5zZXJ0IGF0IHRoZSBzdGFydDsgZGVmYXVsdCBpcworICAgICAgYXBwZW5kIGZvciBhZGRoZWFkZXIoKSwgYnV0IGluc2VydCBmb3Igc3RhcnQqYm9keSgpLCB3aGljaCB1c2UKKyAgICAgIGl0IHRvIGRldGVybWluZSB3aGVyZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBnb2VzLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnApOgorICAgICAgICBzZWxmLl9mcCA9IGZwCisgICAgICAgIHNlbGYuX2hlYWRlcnMgPSBbXQorCisgICAgZGVmIGFkZGhlYWRlcihzZWxmLCBrZXksIHZhbHVlLCBwcmVmaXg9MCk6CisgICAgICAgICIiIkFkZCBhIGhlYWRlciBsaW5lIHRvIHRoZSBNSU1FIG1lc3NhZ2UuCisKKyAgICAgICAgVGhlIGtleSBpcyB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyLCB3aGVyZSB0aGUgdmFsdWUgb2J2aW91c2x5IHByb3ZpZGVzCisgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgaGVhZGVyLiBUaGUgb3B0aW9uYWwgYXJndW1lbnQgcHJlZml4IGRldGVybWluZXMKKyAgICAgICAgd2hlcmUgdGhlIGhlYWRlciBpcyBpbnNlcnRlZDsgMCBtZWFucyBhcHBlbmQgYXQgdGhlIGVuZCwgMSBtZWFucworICAgICAgICBpbnNlcnQgYXQgdGhlIHN0YXJ0LiBUaGUgZGVmYXVsdCBpcyB0byBhcHBlbmQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGxpbmVzID0gdmFsdWUuc3BsaXQoIlxuIikKKyAgICAgICAgd2hpbGUgbGluZXMgYW5kIG5vdCBsaW5lc1stMV06IGRlbCBsaW5lc1stMV0KKyAgICAgICAgd2hpbGUgbGluZXMgYW5kIG5vdCBsaW5lc1swXTogZGVsIGxpbmVzWzBdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihsaW5lcykpOgorICAgICAgICAgICAgbGluZXNbaV0gPSAiICAgICIgKyBsaW5lc1tpXS5zdHJpcCgpCisgICAgICAgIHZhbHVlID0gIlxuIi5qb2luKGxpbmVzKSArICJcbiIKKyAgICAgICAgbGluZSA9IGtleSArICI6ICIgKyB2YWx1ZQorICAgICAgICBpZiBwcmVmaXg6CisgICAgICAgICAgICBzZWxmLl9oZWFkZXJzLmluc2VydCgwLCBsaW5lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5faGVhZGVycy5hcHBlbmQobGluZSkKKworICAgIGRlZiBmbHVzaGhlYWRlcnMoc2VsZik6CisgICAgICAgICIiIldyaXRlcyBvdXQgYW5kIGZvcmdldHMgYWxsIGhlYWRlcnMgYWNjdW11bGF0ZWQgc28gZmFyLgorCisgICAgICAgIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBkb24ndCBuZWVkIGEgYm9keSBwYXJ0IGF0IGFsbDsgZm9yIGV4YW1wbGUsCisgICAgICAgIGZvciBhIHN1YnBhcnQgb2YgdHlwZSBtZXNzYWdlL3JmYzgyMiB0aGF0J3MgKG1pcyl1c2VkIHRvIHN0b3JlIHNvbWUKKyAgICAgICAgaGVhZGVyLWxpa2UgaW5mb3JtYXRpb24uCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2ZwLndyaXRlbGluZXMoc2VsZi5faGVhZGVycykKKyAgICAgICAgc2VsZi5faGVhZGVycyA9IFtdCisKKyAgICBkZWYgc3RhcnRib2R5KHNlbGYsIGN0eXBlLCBwbGlzdD1bXSwgcHJlZml4PTEpOgorICAgICAgICAiIiJSZXR1cm5zIGEgZmlsZS1saWtlIG9iamVjdCBmb3Igd3JpdGluZyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS4KKworICAgICAgICBUaGUgY29udGVudC10eXBlIGlzIHNldCB0byB0aGUgcHJvdmlkZWQgY3R5cGUsIGFuZCB0aGUgb3B0aW9uYWwKKyAgICAgICAgcGFyYW1ldGVyLCBwbGlzdCwgcHJvdmlkZXMgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUKKyAgICAgICAgY29udGVudC10eXBlIGRlY2xhcmF0aW9uLiAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IHByZWZpeCBkZXRlcm1pbmVzCisgICAgICAgIHdoZXJlIHRoZSBoZWFkZXIgaXMgaW5zZXJ0ZWQ7IDAgbWVhbnMgYXBwZW5kIGF0IHRoZSBlbmQsIDEgbWVhbnMKKyAgICAgICAgaW5zZXJ0IGF0IHRoZSBzdGFydC4gVGhlIGRlZmF1bHQgaXMgdG8gaW5zZXJ0IGF0IHRoZSBzdGFydC4KKworICAgICAgICAiIiIKKyAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHBsaXN0OgorICAgICAgICAgICAgY3R5cGUgPSBjdHlwZSArICc7XG4gJXM9XCIlc1wiJyAlIChuYW1lLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5hZGRoZWFkZXIoIkNvbnRlbnQtVHlwZSIsIGN0eXBlLCBwcmVmaXg9cHJlZml4KQorICAgICAgICBzZWxmLmZsdXNoaGVhZGVycygpCisgICAgICAgIHNlbGYuX2ZwLndyaXRlKCJcbiIpCisgICAgICAgIHJldHVybiBzZWxmLl9mcAorCisgICAgZGVmIHN0YXJ0bXVsdGlwYXJ0Ym9keShzZWxmLCBzdWJ0eXBlLCBib3VuZGFyeT1Ob25lLCBwbGlzdD1bXSwgcHJlZml4PTEpOgorICAgICAgICAiIiJSZXR1cm5zIGEgZmlsZS1saWtlIG9iamVjdCBmb3Igd3JpdGluZyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS4KKworICAgICAgICBBZGRpdGlvbmFsbHksIHRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRoZSBtdWx0aS1wYXJ0IGNvZGUsIHdoZXJlIHRoZQorICAgICAgICBzdWJ0eXBlIHBhcmFtZXRlciBwcm92aWRlcyB0aGUgbXVsdGlwYXJ0IHN1YnR5cGUsIHRoZSBib3VuZGFyeQorICAgICAgICBwYXJhbWV0ZXIgbWF5IHByb3ZpZGUgYSB1c2VyLWRlZmluZWQgYm91bmRhcnkgc3BlY2lmaWNhdGlvbiwgYW5kIHRoZQorICAgICAgICBwbGlzdCBwYXJhbWV0ZXIgcHJvdmlkZXMgb3B0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIHN1YnR5cGUuICBUaGUKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnQsIHByZWZpeCwgZGV0ZXJtaW5lcyB3aGVyZSB0aGUgaGVhZGVyIGlzIGluc2VydGVkOworICAgICAgICAwIG1lYW5zIGFwcGVuZCBhdCB0aGUgZW5kLCAxIG1lYW5zIGluc2VydCBhdCB0aGUgc3RhcnQuIFRoZSBkZWZhdWx0CisgICAgICAgIGlzIHRvIGluc2VydCBhdCB0aGUgc3RhcnQuICBTdWJwYXJ0cyBzaG91bGQgYmUgY3JlYXRlZCB1c2luZyB0aGUKKyAgICAgICAgbmV4dHBhcnQoKSBtZXRob2QuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2JvdW5kYXJ5ID0gYm91bmRhcnkgb3IgbWltZXRvb2xzLmNob29zZV9ib3VuZGFyeSgpCisgICAgICAgIHJldHVybiBzZWxmLnN0YXJ0Ym9keSgibXVsdGlwYXJ0LyIgKyBzdWJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygiYm91bmRhcnkiLCBzZWxmLl9ib3VuZGFyeSldICsgcGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9cHJlZml4KQorCisgICAgZGVmIG5leHRwYXJ0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIE1pbWVXcml0ZXIgd2hpY2ggcmVwcmVzZW50cyBhbgorICAgICAgICBpbmRpdmlkdWFsIHBhcnQgaW4gYSBtdWx0aXBhcnQgbWVzc2FnZS4KKworICAgICAgICBUaGlzIG1heSBiZSB1c2VkIHRvIHdyaXRlIHRoZSBwYXJ0IGFzIHdlbGwgYXMgdXNlZCBmb3IgY3JlYXRpbmcKKyAgICAgICAgcmVjdXJzaXZlbHkgY29tcGxleCBtdWx0aXBhcnQgbWVzc2FnZXMuIFRoZSBtZXNzYWdlIG11c3QgZmlyc3QgYmUKKyAgICAgICAgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3RhcnRtdWx0aXBhcnRib2R5KCkgbWV0aG9kIGJlZm9yZSB1c2luZyB0aGUKKyAgICAgICAgbmV4dHBhcnQoKSBtZXRob2QuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2ZwLndyaXRlKCJcbi0tIiArIHNlbGYuX2JvdW5kYXJ5ICsgIlxuIikKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuX2ZwKQorCisgICAgZGVmIGxhc3RwYXJ0KHNlbGYpOgorICAgICAgICAiIiJUaGlzIGlzIHVzZWQgdG8gZGVzaWduYXRlIHRoZSBsYXN0IHBhcnQgb2YgYSBtdWx0aXBhcnQgbWVzc2FnZS4KKworICAgICAgICBJdCBzaG91bGQgYWx3YXlzIGJlIHVzZWQgd2hlbiB3cml0aW5nIG11bHRpcGFydCBtZXNzYWdlcy4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZnAud3JpdGUoIlxuLS0iICsgc2VsZi5fYm91bmRhcnkgKyAiLS1cbiIpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgdGVzdC50ZXN0X01pbWVXcml0ZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvTWltZVdyaXRlci5weWMgYi9saWIvcHl0aG9uMi43L01pbWVXcml0ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOGJiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L01pbWVXcml0ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvTWltZVdyaXRlci5weW8gYi9saWIvcHl0aG9uMi43L01pbWVXcml0ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOGJiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L01pbWVXcml0ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvUXVldWUucHkgYi9saWIvcHl0aG9uMi43L1F1ZXVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjhkNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1F1ZXVlLnB5CkBAIC0wLDAgKzEsMjQ0IEBACisiIiJBIG11bHRpLXByb2R1Y2VyLCBtdWx0aS1jb25zdW1lciBxdWV1ZS4iIiIKKworZnJvbSB0aW1lIGltcG9ydCB0aW1lIGFzIF90aW1lCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZyBhcyBfdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IGR1bW15X3RocmVhZGluZyBhcyBfdGhyZWFkaW5nCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQoraW1wb3J0IGhlYXBxCisKK19fYWxsX18gPSBbJ0VtcHR5JywgJ0Z1bGwnLCAnUXVldWUnLCAnUHJpb3JpdHlRdWV1ZScsICdMaWZvUXVldWUnXQorCitjbGFzcyBFbXB0eShFeGNlcHRpb24pOgorICAgICJFeGNlcHRpb24gcmFpc2VkIGJ5IFF1ZXVlLmdldChibG9jaz0wKS9nZXRfbm93YWl0KCkuIgorICAgIHBhc3MKKworY2xhc3MgRnVsbChFeGNlcHRpb24pOgorICAgICJFeGNlcHRpb24gcmFpc2VkIGJ5IFF1ZXVlLnB1dChibG9jaz0wKS9wdXRfbm93YWl0KCkuIgorICAgIHBhc3MKKworY2xhc3MgUXVldWU6CisgICAgIiIiQ3JlYXRlIGEgcXVldWUgb2JqZWN0IHdpdGggYSBnaXZlbiBtYXhpbXVtIHNpemUuCisKKyAgICBJZiBtYXhzaXplIGlzIDw9IDAsIHRoZSBxdWV1ZSBzaXplIGlzIGluZmluaXRlLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXhzaXplPTApOgorICAgICAgICBzZWxmLm1heHNpemUgPSBtYXhzaXplCisgICAgICAgIHNlbGYuX2luaXQobWF4c2l6ZSkKKyAgICAgICAgIyBtdXRleCBtdXN0IGJlIGhlbGQgd2hlbmV2ZXIgdGhlIHF1ZXVlIGlzIG11dGF0aW5nLiAgQWxsIG1ldGhvZHMKKyAgICAgICAgIyB0aGF0IGFjcXVpcmUgbXV0ZXggbXVzdCByZWxlYXNlIGl0IGJlZm9yZSByZXR1cm5pbmcuICBtdXRleAorICAgICAgICAjIGlzIHNoYXJlZCBiZXR3ZWVuIHRoZSB0aHJlZSBjb25kaXRpb25zLCBzbyBhY3F1aXJpbmcgYW5kCisgICAgICAgICMgcmVsZWFzaW5nIHRoZSBjb25kaXRpb25zIGFsc28gYWNxdWlyZXMgYW5kIHJlbGVhc2VzIG11dGV4LgorICAgICAgICBzZWxmLm11dGV4ID0gX3RocmVhZGluZy5Mb2NrKCkKKyAgICAgICAgIyBOb3RpZnkgbm90X2VtcHR5IHdoZW5ldmVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gdGhlIHF1ZXVlOyBhCisgICAgICAgICMgdGhyZWFkIHdhaXRpbmcgdG8gZ2V0IGlzIG5vdGlmaWVkIHRoZW4uCisgICAgICAgIHNlbGYubm90X2VtcHR5ID0gX3RocmVhZGluZy5Db25kaXRpb24oc2VsZi5tdXRleCkKKyAgICAgICAgIyBOb3RpZnkgbm90X2Z1bGwgd2hlbmV2ZXIgYW4gaXRlbSBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlOworICAgICAgICAjIGEgdGhyZWFkIHdhaXRpbmcgdG8gcHV0IGlzIG5vdGlmaWVkIHRoZW4uCisgICAgICAgIHNlbGYubm90X2Z1bGwgPSBfdGhyZWFkaW5nLkNvbmRpdGlvbihzZWxmLm11dGV4KQorICAgICAgICAjIE5vdGlmeSBhbGxfdGFza3NfZG9uZSB3aGVuZXZlciB0aGUgbnVtYmVyIG9mIHVuZmluaXNoZWQgdGFza3MKKyAgICAgICAgIyBkcm9wcyB0byB6ZXJvOyB0aHJlYWQgd2FpdGluZyB0byBqb2luKCkgaXMgbm90aWZpZWQgdG8gcmVzdW1lCisgICAgICAgIHNlbGYuYWxsX3Rhc2tzX2RvbmUgPSBfdGhyZWFkaW5nLkNvbmRpdGlvbihzZWxmLm11dGV4KQorICAgICAgICBzZWxmLnVuZmluaXNoZWRfdGFza3MgPSAwCisKKyAgICBkZWYgdGFza19kb25lKHNlbGYpOgorICAgICAgICAiIiJJbmRpY2F0ZSB0aGF0IGEgZm9ybWVybHkgZW5xdWV1ZWQgdGFzayBpcyBjb21wbGV0ZS4KKworICAgICAgICBVc2VkIGJ5IFF1ZXVlIGNvbnN1bWVyIHRocmVhZHMuICBGb3IgZWFjaCBnZXQoKSB1c2VkIHRvIGZldGNoIGEgdGFzaywKKyAgICAgICAgYSBzdWJzZXF1ZW50IGNhbGwgdG8gdGFza19kb25lKCkgdGVsbHMgdGhlIHF1ZXVlIHRoYXQgdGhlIHByb2Nlc3NpbmcKKyAgICAgICAgb24gdGhlIHRhc2sgaXMgY29tcGxldGUuCisKKyAgICAgICAgSWYgYSBqb2luKCkgaXMgY3VycmVudGx5IGJsb2NraW5nLCBpdCB3aWxsIHJlc3VtZSB3aGVuIGFsbCBpdGVtcworICAgICAgICBoYXZlIGJlZW4gcHJvY2Vzc2VkIChtZWFuaW5nIHRoYXQgYSB0YXNrX2RvbmUoKSBjYWxsIHdhcyByZWNlaXZlZAorICAgICAgICBmb3IgZXZlcnkgaXRlbSB0aGF0IGhhZCBiZWVuIHB1dCgpIGludG8gdGhlIHF1ZXVlKS4KKworICAgICAgICBSYWlzZXMgYSBWYWx1ZUVycm9yIGlmIGNhbGxlZCBtb3JlIHRpbWVzIHRoYW4gdGhlcmUgd2VyZSBpdGVtcworICAgICAgICBwbGFjZWQgaW4gdGhlIHF1ZXVlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hbGxfdGFza3NfZG9uZS5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdW5maW5pc2hlZCA9IHNlbGYudW5maW5pc2hlZF90YXNrcyAtIDEKKyAgICAgICAgICAgIGlmIHVuZmluaXNoZWQgPD0gMDoKKyAgICAgICAgICAgICAgICBpZiB1bmZpbmlzaGVkIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndGFza19kb25lKCkgY2FsbGVkIHRvbyBtYW55IHRpbWVzJykKKyAgICAgICAgICAgICAgICBzZWxmLmFsbF90YXNrc19kb25lLm5vdGlmeV9hbGwoKQorICAgICAgICAgICAgc2VsZi51bmZpbmlzaGVkX3Rhc2tzID0gdW5maW5pc2hlZAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5hbGxfdGFza3NfZG9uZS5yZWxlYXNlKCkKKworICAgIGRlZiBqb2luKHNlbGYpOgorICAgICAgICAiIiJCbG9ja3MgdW50aWwgYWxsIGl0ZW1zIGluIHRoZSBRdWV1ZSBoYXZlIGJlZW4gZ290dGVuIGFuZCBwcm9jZXNzZWQuCisKKyAgICAgICAgVGhlIGNvdW50IG9mIHVuZmluaXNoZWQgdGFza3MgZ29lcyB1cCB3aGVuZXZlciBhbiBpdGVtIGlzIGFkZGVkIHRvIHRoZQorICAgICAgICBxdWV1ZS4gVGhlIGNvdW50IGdvZXMgZG93biB3aGVuZXZlciBhIGNvbnN1bWVyIHRocmVhZCBjYWxscyB0YXNrX2RvbmUoKQorICAgICAgICB0byBpbmRpY2F0ZSB0aGUgaXRlbSB3YXMgcmV0cmlldmVkIGFuZCBhbGwgd29yayBvbiBpdCBpcyBjb21wbGV0ZS4KKworICAgICAgICBXaGVuIHRoZSBjb3VudCBvZiB1bmZpbmlzaGVkIHRhc2tzIGRyb3BzIHRvIHplcm8sIGpvaW4oKSB1bmJsb2Nrcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYWxsX3Rhc2tzX2RvbmUuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIHNlbGYudW5maW5pc2hlZF90YXNrczoKKyAgICAgICAgICAgICAgICBzZWxmLmFsbF90YXNrc19kb25lLndhaXQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5hbGxfdGFza3NfZG9uZS5yZWxlYXNlKCkKKworICAgIGRlZiBxc2l6ZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBhcHByb3hpbWF0ZSBzaXplIG9mIHRoZSBxdWV1ZSAobm90IHJlbGlhYmxlISkuIiIiCisgICAgICAgIHNlbGYubXV0ZXguYWNxdWlyZSgpCisgICAgICAgIG4gPSBzZWxmLl9xc2l6ZSgpCisgICAgICAgIHNlbGYubXV0ZXgucmVsZWFzZSgpCisgICAgICAgIHJldHVybiBuCisKKyAgICBkZWYgZW1wdHkoc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eSwgRmFsc2Ugb3RoZXJ3aXNlIChub3QgcmVsaWFibGUhKS4iIiIKKyAgICAgICAgc2VsZi5tdXRleC5hY3F1aXJlKCkKKyAgICAgICAgbiA9IG5vdCBzZWxmLl9xc2l6ZSgpCisgICAgICAgIHNlbGYubXV0ZXgucmVsZWFzZSgpCisgICAgICAgIHJldHVybiBuCisKKyAgICBkZWYgZnVsbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIHF1ZXVlIGlzIGZ1bGwsIEZhbHNlIG90aGVyd2lzZSAobm90IHJlbGlhYmxlISkuIiIiCisgICAgICAgIHNlbGYubXV0ZXguYWNxdWlyZSgpCisgICAgICAgIG4gPSAwIDwgc2VsZi5tYXhzaXplID09IHNlbGYuX3FzaXplKCkKKyAgICAgICAgc2VsZi5tdXRleC5yZWxlYXNlKCkKKyAgICAgICAgcmV0dXJuIG4KKworICAgIGRlZiBwdXQoc2VsZiwgaXRlbSwgYmxvY2s9VHJ1ZSwgdGltZW91dD1Ob25lKToKKyAgICAgICAgIiIiUHV0IGFuIGl0ZW0gaW50byB0aGUgcXVldWUuCisKKyAgICAgICAgSWYgb3B0aW9uYWwgYXJncyAnYmxvY2snIGlzIHRydWUgYW5kICd0aW1lb3V0JyBpcyBOb25lICh0aGUgZGVmYXVsdCksCisgICAgICAgIGJsb2NrIGlmIG5lY2Vzc2FyeSB1bnRpbCBhIGZyZWUgc2xvdCBpcyBhdmFpbGFibGUuIElmICd0aW1lb3V0JyBpcworICAgICAgICBhIHBvc2l0aXZlIG51bWJlciwgaXQgYmxvY2tzIGF0IG1vc3QgJ3RpbWVvdXQnIHNlY29uZHMgYW5kIHJhaXNlcworICAgICAgICB0aGUgRnVsbCBleGNlcHRpb24gaWYgbm8gZnJlZSBzbG90IHdhcyBhdmFpbGFibGUgd2l0aGluIHRoYXQgdGltZS4KKyAgICAgICAgT3RoZXJ3aXNlICgnYmxvY2snIGlzIGZhbHNlKSwgcHV0IGFuIGl0ZW0gb24gdGhlIHF1ZXVlIGlmIGEgZnJlZSBzbG90CisgICAgICAgIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSwgZWxzZSByYWlzZSB0aGUgRnVsbCBleGNlcHRpb24gKCd0aW1lb3V0JworICAgICAgICBpcyBpZ25vcmVkIGluIHRoYXQgY2FzZSkuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm5vdF9mdWxsLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLm1heHNpemUgPiAwOgorICAgICAgICAgICAgICAgIGlmIG5vdCBibG9jazoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fcXNpemUoKSA9PSBzZWxmLm1heHNpemU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBGdWxsCisgICAgICAgICAgICAgICAgZWxpZiB0aW1lb3V0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYuX3FzaXplKCkgPT0gc2VsZi5tYXhzaXplOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3RfZnVsbC53YWl0KCkKKyAgICAgICAgICAgICAgICBlbGlmIHRpbWVvdXQgPCAwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCIndGltZW91dCcgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZW5kdGltZSA9IF90aW1lKCkgKyB0aW1lb3V0CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYuX3FzaXplKCkgPT0gc2VsZi5tYXhzaXplOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nID0gZW5kdGltZSAtIF90aW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJlbWFpbmluZyA8PSAwLjA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3RfZnVsbC53YWl0KHJlbWFpbmluZykKKyAgICAgICAgICAgIHNlbGYuX3B1dChpdGVtKQorICAgICAgICAgICAgc2VsZi51bmZpbmlzaGVkX3Rhc2tzICs9IDEKKyAgICAgICAgICAgIHNlbGYubm90X2VtcHR5Lm5vdGlmeSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLm5vdF9mdWxsLnJlbGVhc2UoKQorCisgICAgZGVmIHB1dF9ub3dhaXQoc2VsZiwgaXRlbSk6CisgICAgICAgICIiIlB1dCBhbiBpdGVtIGludG8gdGhlIHF1ZXVlIHdpdGhvdXQgYmxvY2tpbmcuCisKKyAgICAgICAgT25seSBlbnF1ZXVlIHRoZSBpdGVtIGlmIGEgZnJlZSBzbG90IGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4KKyAgICAgICAgT3RoZXJ3aXNlIHJhaXNlIHRoZSBGdWxsIGV4Y2VwdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnB1dChpdGVtLCBGYWxzZSkKKworICAgIGRlZiBnZXQoc2VsZiwgYmxvY2s9VHJ1ZSwgdGltZW91dD1Ob25lKToKKyAgICAgICAgIiIiUmVtb3ZlIGFuZCByZXR1cm4gYW4gaXRlbSBmcm9tIHRoZSBxdWV1ZS4KKworICAgICAgICBJZiBvcHRpb25hbCBhcmdzICdibG9jaycgaXMgdHJ1ZSBhbmQgJ3RpbWVvdXQnIGlzIE5vbmUgKHRoZSBkZWZhdWx0KSwKKyAgICAgICAgYmxvY2sgaWYgbmVjZXNzYXJ5IHVudGlsIGFuIGl0ZW0gaXMgYXZhaWxhYmxlLiBJZiAndGltZW91dCcgaXMKKyAgICAgICAgYSBwb3NpdGl2ZSBudW1iZXIsIGl0IGJsb2NrcyBhdCBtb3N0ICd0aW1lb3V0JyBzZWNvbmRzIGFuZCByYWlzZXMKKyAgICAgICAgdGhlIEVtcHR5IGV4Y2VwdGlvbiBpZiBubyBpdGVtIHdhcyBhdmFpbGFibGUgd2l0aGluIHRoYXQgdGltZS4KKyAgICAgICAgT3RoZXJ3aXNlICgnYmxvY2snIGlzIGZhbHNlKSwgcmV0dXJuIGFuIGl0ZW0gaWYgb25lIGlzIGltbWVkaWF0ZWx5CisgICAgICAgIGF2YWlsYWJsZSwgZWxzZSByYWlzZSB0aGUgRW1wdHkgZXhjZXB0aW9uICgndGltZW91dCcgaXMgaWdub3JlZAorICAgICAgICBpbiB0aGF0IGNhc2UpLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ub3RfZW1wdHkuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBibG9jazoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fcXNpemUoKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRW1wdHkKKyAgICAgICAgICAgIGVsaWYgdGltZW91dCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLl9xc2l6ZSgpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9lbXB0eS53YWl0KCkKKyAgICAgICAgICAgIGVsaWYgdGltZW91dCA8IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJ3RpbWVvdXQnIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbmR0aW1lID0gX3RpbWUoKSArIHRpbWVvdXQKKyAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5fcXNpemUoKToKKyAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nID0gZW5kdGltZSAtIF90aW1lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVtYWluaW5nIDw9IDAuMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVtcHR5CisgICAgICAgICAgICAgICAgICAgIHNlbGYubm90X2VtcHR5LndhaXQocmVtYWluaW5nKQorICAgICAgICAgICAgaXRlbSA9IHNlbGYuX2dldCgpCisgICAgICAgICAgICBzZWxmLm5vdF9mdWxsLm5vdGlmeSgpCisgICAgICAgICAgICByZXR1cm4gaXRlbQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5ub3RfZW1wdHkucmVsZWFzZSgpCisKKyAgICBkZWYgZ2V0X25vd2FpdChzZWxmKToKKyAgICAgICAgIiIiUmVtb3ZlIGFuZCByZXR1cm4gYW4gaXRlbSBmcm9tIHRoZSBxdWV1ZSB3aXRob3V0IGJsb2NraW5nLgorCisgICAgICAgIE9ubHkgZ2V0IGFuIGl0ZW0gaWYgb25lIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4gT3RoZXJ3aXNlCisgICAgICAgIHJhaXNlIHRoZSBFbXB0eSBleGNlcHRpb24uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXQoRmFsc2UpCisKKyAgICAjIE92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgdG8gaW1wbGVtZW50IG90aGVyIHF1ZXVlIG9yZ2FuaXphdGlvbnMKKyAgICAjIChlLmcuIHN0YWNrIG9yIHByaW9yaXR5IHF1ZXVlKS4KKyAgICAjIFRoZXNlIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCBhcHByb3ByaWF0ZSBsb2NrcyBoZWxkCisKKyAgICAjIEluaXRpYWxpemUgdGhlIHF1ZXVlIHJlcHJlc2VudGF0aW9uCisgICAgZGVmIF9pbml0KHNlbGYsIG1heHNpemUpOgorICAgICAgICBzZWxmLnF1ZXVlID0gZGVxdWUoKQorCisgICAgZGVmIF9xc2l6ZShzZWxmLCBsZW49bGVuKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLnF1ZXVlKQorCisgICAgIyBQdXQgYSBuZXcgaXRlbSBpbiB0aGUgcXVldWUKKyAgICBkZWYgX3B1dChzZWxmLCBpdGVtKToKKyAgICAgICAgc2VsZi5xdWV1ZS5hcHBlbmQoaXRlbSkKKworICAgICMgR2V0IGFuIGl0ZW0gZnJvbSB0aGUgcXVldWUKKyAgICBkZWYgX2dldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucXVldWUucG9wbGVmdCgpCisKKworY2xhc3MgUHJpb3JpdHlRdWV1ZShRdWV1ZSk6CisgICAgJycnVmFyaWFudCBvZiBRdWV1ZSB0aGF0IHJldHJpZXZlcyBvcGVuIGVudHJpZXMgaW4gcHJpb3JpdHkgb3JkZXIgKGxvd2VzdCBmaXJzdCkuCisKKyAgICBFbnRyaWVzIGFyZSB0eXBpY2FsbHkgdHVwbGVzIG9mIHRoZSBmb3JtOiAgKHByaW9yaXR5IG51bWJlciwgZGF0YSkuCisgICAgJycnCisKKyAgICBkZWYgX2luaXQoc2VsZiwgbWF4c2l6ZSk6CisgICAgICAgIHNlbGYucXVldWUgPSBbXQorCisgICAgZGVmIF9xc2l6ZShzZWxmLCBsZW49bGVuKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLnF1ZXVlKQorCisgICAgZGVmIF9wdXQoc2VsZiwgaXRlbSwgaGVhcHB1c2g9aGVhcHEuaGVhcHB1c2gpOgorICAgICAgICBoZWFwcHVzaChzZWxmLnF1ZXVlLCBpdGVtKQorCisgICAgZGVmIF9nZXQoc2VsZiwgaGVhcHBvcD1oZWFwcS5oZWFwcG9wKToKKyAgICAgICAgcmV0dXJuIGhlYXBwb3Aoc2VsZi5xdWV1ZSkKKworCitjbGFzcyBMaWZvUXVldWUoUXVldWUpOgorICAgICcnJ1ZhcmlhbnQgb2YgUXVldWUgdGhhdCByZXRyaWV2ZXMgbW9zdCByZWNlbnRseSBhZGRlZCBlbnRyaWVzIGZpcnN0LicnJworCisgICAgZGVmIF9pbml0KHNlbGYsIG1heHNpemUpOgorICAgICAgICBzZWxmLnF1ZXVlID0gW10KKworICAgIGRlZiBfcXNpemUoc2VsZiwgbGVuPWxlbik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5xdWV1ZSkKKworICAgIGRlZiBfcHV0KHNlbGYsIGl0ZW0pOgorICAgICAgICBzZWxmLnF1ZXVlLmFwcGVuZChpdGVtKQorCisgICAgZGVmIF9nZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnF1ZXVlLnBvcCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1F1ZXVlLnB5YyBiL2xpYi9weXRob24yLjcvUXVldWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYWVhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1F1ZXVlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1F1ZXVlLnB5byBiL2xpYi9weXRob24yLjcvUXVldWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYWVhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1F1ZXVlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1NpbXBsZUhUVFBTZXJ2ZXIucHkgYi9saWIvcHl0aG9uMi43L1NpbXBsZUhUVFBTZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwMzM0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvU2ltcGxlSFRUUFNlcnZlci5weQpAQCAtMCwwICsxLDIyMCBAQAorIiIiU2ltcGxlIEhUVFAgU2VydmVyLgorCitUaGlzIG1vZHVsZSBidWlsZHMgb24gQmFzZUhUVFBTZXJ2ZXIgYnkgaW1wbGVtZW50aW5nIHRoZSBzdGFuZGFyZCBHRVQKK2FuZCBIRUFEIHJlcXVlc3RzIGluIGEgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZCBtYW5uZXIuCisKKyIiIgorCisKK19fdmVyc2lvbl9fID0gIjAuNiIKKworX19hbGxfXyA9IFsiU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyIl0KKworaW1wb3J0IG9zCitpbXBvcnQgcG9zaXhwYXRoCitpbXBvcnQgQmFzZUhUVFBTZXJ2ZXIKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCBjZ2kKK2ltcG9ydCBzeXMKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBtaW1ldHlwZXMKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCisKK2NsYXNzIFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlcihCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKKworICAgICIiIlNpbXBsZSBIVFRQIHJlcXVlc3QgaGFuZGxlciB3aXRoIEdFVCBhbmQgSEVBRCBjb21tYW5kcy4KKworICAgIFRoaXMgc2VydmVzIGZpbGVzIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBhbnkgb2YgaXRzCisgICAgc3ViZGlyZWN0b3JpZXMuICBUaGUgTUlNRSB0eXBlIGZvciBmaWxlcyBpcyBkZXRlcm1pbmVkIGJ5CisgICAgY2FsbGluZyB0aGUgLmd1ZXNzX3R5cGUoKSBtZXRob2QuCisKKyAgICBUaGUgR0VUIGFuZCBIRUFEIHJlcXVlc3RzIGFyZSBpZGVudGljYWwgZXhjZXB0IHRoYXQgdGhlIEhFQUQKKyAgICByZXF1ZXN0IG9taXRzIHRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlIGZpbGUuCisKKyAgICAiIiIKKworICAgIHNlcnZlcl92ZXJzaW9uID0gIlNpbXBsZUhUVFAvIiArIF9fdmVyc2lvbl9fCisKKyAgICBkZWYgZG9fR0VUKHNlbGYpOgorICAgICAgICAiIiJTZXJ2ZSBhIEdFVCByZXF1ZXN0LiIiIgorICAgICAgICBmID0gc2VsZi5zZW5kX2hlYWQoKQorICAgICAgICBpZiBmOgorICAgICAgICAgICAgc2VsZi5jb3B5ZmlsZShmLCBzZWxmLndmaWxlKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgZG9fSEVBRChzZWxmKToKKyAgICAgICAgIiIiU2VydmUgYSBIRUFEIHJlcXVlc3QuIiIiCisgICAgICAgIGYgPSBzZWxmLnNlbmRfaGVhZCgpCisgICAgICAgIGlmIGY6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBzZW5kX2hlYWQoc2VsZik6CisgICAgICAgICIiIkNvbW1vbiBjb2RlIGZvciBHRVQgYW5kIEhFQUQgY29tbWFuZHMuCisKKyAgICAgICAgVGhpcyBzZW5kcyB0aGUgcmVzcG9uc2UgY29kZSBhbmQgTUlNRSBoZWFkZXJzLgorCisgICAgICAgIFJldHVybiB2YWx1ZSBpcyBlaXRoZXIgYSBmaWxlIG9iamVjdCAod2hpY2ggaGFzIHRvIGJlIGNvcGllZAorICAgICAgICB0byB0aGUgb3V0cHV0ZmlsZSBieSB0aGUgY2FsbGVyIHVubGVzcyB0aGUgY29tbWFuZCB3YXMgSEVBRCwKKyAgICAgICAgYW5kIG11c3QgYmUgY2xvc2VkIGJ5IHRoZSBjYWxsZXIgdW5kZXIgYWxsIGNpcmN1bXN0YW5jZXMpLCBvcgorICAgICAgICBOb25lLCBpbiB3aGljaCBjYXNlIHRoZSBjYWxsZXIgaGFzIG5vdGhpbmcgZnVydGhlciB0byBkby4KKworICAgICAgICAiIiIKKyAgICAgICAgcGF0aCA9IHNlbGYudHJhbnNsYXRlX3BhdGgoc2VsZi5wYXRoKQorICAgICAgICBmID0gTm9uZQorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYucGF0aC5lbmRzd2l0aCgnLycpOgorICAgICAgICAgICAgICAgICMgcmVkaXJlY3QgYnJvd3NlciAtIGRvaW5nIGJhc2ljYWxseSB3aGF0IGFwYWNoZSBkb2VzCisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDMwMSkKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJMb2NhdGlvbiIsIHNlbGYucGF0aCArICIvIikKKyAgICAgICAgICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgZm9yIGluZGV4IGluICJpbmRleC5odG1sIiwgImluZGV4Lmh0bSI6CisgICAgICAgICAgICAgICAgaW5kZXggPSBvcy5wYXRoLmpvaW4ocGF0aCwgaW5kZXgpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoaW5kZXgpOgorICAgICAgICAgICAgICAgICAgICBwYXRoID0gaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubGlzdF9kaXJlY3RvcnkocGF0aCkKKyAgICAgICAgY3R5cGUgPSBzZWxmLmd1ZXNzX3R5cGUocGF0aCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBBbHdheXMgcmVhZCBpbiBiaW5hcnkgbW9kZS4gT3BlbmluZyBmaWxlcyBpbiB0ZXh0IG1vZGUgbWF5IGNhdXNlCisgICAgICAgICAgICAjIG5ld2xpbmUgdHJhbnNsYXRpb25zLCBtYWtpbmcgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb250ZW50CisgICAgICAgICAgICAjIHRyYW5zbWl0dGVkICpsZXNzKiB0aGFuIHRoZSBjb250ZW50LWxlbmd0aCEKKyAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgsICdyYicpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwNCwgIkZpbGUgbm90IGZvdW5kIikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtdHlwZSIsIGN0eXBlKQorICAgICAgICBmcyA9IG9zLmZzdGF0KGYuZmlsZW5vKCkpCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgc3RyKGZzWzZdKSkKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiTGFzdC1Nb2RpZmllZCIsIHNlbGYuZGF0ZV90aW1lX3N0cmluZyhmcy5zdF9tdGltZSkpCisgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICByZXR1cm4gZgorCisgICAgZGVmIGxpc3RfZGlyZWN0b3J5KHNlbGYsIHBhdGgpOgorICAgICAgICAiIiJIZWxwZXIgdG8gcHJvZHVjZSBhIGRpcmVjdG9yeSBsaXN0aW5nIChhYnNlbnQgaW5kZXguaHRtbCkuCisKKyAgICAgICAgUmV0dXJuIHZhbHVlIGlzIGVpdGhlciBhIGZpbGUgb2JqZWN0LCBvciBOb25lIChpbmRpY2F0aW5nIGFuCisgICAgICAgIGVycm9yKS4gIEluIGVpdGhlciBjYXNlLCB0aGUgaGVhZGVycyBhcmUgc2VudCwgbWFraW5nIHRoZQorICAgICAgICBpbnRlcmZhY2UgdGhlIHNhbWUgYXMgZm9yIHNlbmRfaGVhZCgpLgorCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaXN0ID0gb3MubGlzdGRpcihwYXRoKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDA0LCAiTm8gcGVybWlzc2lvbiB0byBsaXN0IGRpcmVjdG9yeSIpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBsaXN0LnNvcnQoa2V5PWxhbWJkYSBhOiBhLmxvd2VyKCkpCisgICAgICAgIGYgPSBTdHJpbmdJTygpCisgICAgICAgIGRpc3BsYXlwYXRoID0gY2dpLmVzY2FwZSh1cmxsaWIudW5xdW90ZShzZWxmLnBhdGgpKQorICAgICAgICBmLndyaXRlKCc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiI+JykKKyAgICAgICAgZi53cml0ZSgiPGh0bWw+XG48dGl0bGU+RGlyZWN0b3J5IGxpc3RpbmcgZm9yICVzPC90aXRsZT5cbiIgJSBkaXNwbGF5cGF0aCkKKyAgICAgICAgZi53cml0ZSgiPGJvZHk+XG48aDI+RGlyZWN0b3J5IGxpc3RpbmcgZm9yICVzPC9oMj5cbiIgJSBkaXNwbGF5cGF0aCkKKyAgICAgICAgZi53cml0ZSgiPGhyPlxuPHVsPlxuIikKKyAgICAgICAgZm9yIG5hbWUgaW4gbGlzdDoKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHBhdGgsIG5hbWUpCisgICAgICAgICAgICBkaXNwbGF5bmFtZSA9IGxpbmtuYW1lID0gbmFtZQorICAgICAgICAgICAgIyBBcHBlbmQgLyBmb3IgZGlyZWN0b3JpZXMgb3IgQCBmb3Igc3ltYm9saWMgbGlua3MKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnVsbG5hbWUpOgorICAgICAgICAgICAgICAgIGRpc3BsYXluYW1lID0gbmFtZSArICIvIgorICAgICAgICAgICAgICAgIGxpbmtuYW1lID0gbmFtZSArICIvIgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsoZnVsbG5hbWUpOgorICAgICAgICAgICAgICAgIGRpc3BsYXluYW1lID0gbmFtZSArICJAIgorICAgICAgICAgICAgICAgICMgTm90ZTogYSBsaW5rIHRvIGEgZGlyZWN0b3J5IGRpc3BsYXlzIHdpdGggQCBhbmQgbGlua3Mgd2l0aCAvCisgICAgICAgICAgICBmLndyaXRlKCc8bGk+PGEgaHJlZj0iJXMiPiVzPC9hPlxuJworICAgICAgICAgICAgICAgICAgICAlICh1cmxsaWIucXVvdGUobGlua25hbWUpLCBjZ2kuZXNjYXBlKGRpc3BsYXluYW1lKSkpCisgICAgICAgIGYud3JpdGUoIjwvdWw+XG48aHI+XG48L2JvZHk+XG48L2h0bWw+XG4iKQorICAgICAgICBsZW5ndGggPSBmLnRlbGwoKQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKKyAgICAgICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC10eXBlIiwgInRleHQvaHRtbDsgY2hhcnNldD0lcyIgJSBlbmNvZGluZykKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBzdHIobGVuZ3RoKSkKKyAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgIHJldHVybiBmCisKKyAgICBkZWYgdHJhbnNsYXRlX3BhdGgoc2VsZiwgcGF0aCk6CisgICAgICAgICIiIlRyYW5zbGF0ZSBhIC8tc2VwYXJhdGVkIFBBVEggdG8gdGhlIGxvY2FsIGZpbGVuYW1lIHN5bnRheC4KKworICAgICAgICBDb21wb25lbnRzIHRoYXQgbWVhbiBzcGVjaWFsIHRoaW5ncyB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0KKyAgICAgICAgKGUuZy4gZHJpdmUgb3IgZGlyZWN0b3J5IG5hbWVzKSBhcmUgaWdub3JlZC4gIChYWFggVGhleSBzaG91bGQKKyAgICAgICAgcHJvYmFibHkgYmUgZGlhZ25vc2VkLikKKworICAgICAgICAiIiIKKyAgICAgICAgIyBhYmFuZG9uIHF1ZXJ5IHBhcmFtZXRlcnMKKyAgICAgICAgcGF0aCA9IHBhdGguc3BsaXQoJz8nLDEpWzBdCisgICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KCcjJywxKVswXQorICAgICAgICBwYXRoID0gcG9zaXhwYXRoLm5vcm1wYXRoKHVybGxpYi51bnF1b3RlKHBhdGgpKQorICAgICAgICB3b3JkcyA9IHBhdGguc3BsaXQoJy8nKQorICAgICAgICB3b3JkcyA9IGZpbHRlcihOb25lLCB3b3JkcykKKyAgICAgICAgcGF0aCA9IG9zLmdldGN3ZCgpCisgICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgorICAgICAgICAgICAgZHJpdmUsIHdvcmQgPSBvcy5wYXRoLnNwbGl0ZHJpdmUod29yZCkKKyAgICAgICAgICAgIGhlYWQsIHdvcmQgPSBvcy5wYXRoLnNwbGl0KHdvcmQpCisgICAgICAgICAgICBpZiB3b3JkIGluIChvcy5jdXJkaXIsIG9zLnBhcmRpcik6IGNvbnRpbnVlCisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHdvcmQpCisgICAgICAgIHJldHVybiBwYXRoCisKKyAgICBkZWYgY29weWZpbGUoc2VsZiwgc291cmNlLCBvdXRwdXRmaWxlKToKKyAgICAgICAgIiIiQ29weSBhbGwgZGF0YSBiZXR3ZWVuIHR3byBmaWxlIG9iamVjdHMuCisKKyAgICAgICAgVGhlIFNPVVJDRSBhcmd1bWVudCBpcyBhIGZpbGUgb2JqZWN0IG9wZW4gZm9yIHJlYWRpbmcKKyAgICAgICAgKG9yIGFueXRoaW5nIHdpdGggYSByZWFkKCkgbWV0aG9kKSBhbmQgdGhlIERFU1RJTkFUSU9OCisgICAgICAgIGFyZ3VtZW50IGlzIGEgZmlsZSBvYmplY3Qgb3BlbiBmb3Igd3JpdGluZyAob3IKKyAgICAgICAgYW55dGhpbmcgd2l0aCBhIHdyaXRlKCkgbWV0aG9kKS4KKworICAgICAgICBUaGUgb25seSByZWFzb24gZm9yIG92ZXJyaWRpbmcgdGhpcyB3b3VsZCBiZSB0byBjaGFuZ2UKKyAgICAgICAgdGhlIGJsb2NrIHNpemUgb3IgcGVyaGFwcyB0byByZXBsYWNlIG5ld2xpbmVzIGJ5IENSTEYKKyAgICAgICAgLS0gbm90ZSBob3dldmVyIHRoYXQgdGhpcyB0aGUgZGVmYXVsdCBzZXJ2ZXIgdXNlcyB0aGlzCisgICAgICAgIHRvIGNvcHkgYmluYXJ5IGRhdGEgYXMgd2VsbC4KKworICAgICAgICAiIiIKKyAgICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKHNvdXJjZSwgb3V0cHV0ZmlsZSkKKworICAgIGRlZiBndWVzc190eXBlKHNlbGYsIHBhdGgpOgorICAgICAgICAiIiJHdWVzcyB0aGUgdHlwZSBvZiBhIGZpbGUuCisKKyAgICAgICAgQXJndW1lbnQgaXMgYSBQQVRIIChhIGZpbGVuYW1lKS4KKworICAgICAgICBSZXR1cm4gdmFsdWUgaXMgYSBzdHJpbmcgb2YgdGhlIGZvcm0gdHlwZS9zdWJ0eXBlLAorICAgICAgICB1c2FibGUgZm9yIGEgTUlNRSBDb250ZW50LXR5cGUgaGVhZGVyLgorCisgICAgICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGxvb2tzIHRoZSBmaWxlJ3MgZXh0ZW5zaW9uCisgICAgICAgIHVwIGluIHRoZSB0YWJsZSBzZWxmLmV4dGVuc2lvbnNfbWFwLCB1c2luZyBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KKyAgICAgICAgYXMgYSBkZWZhdWx0OyBob3dldmVyIGl0IHdvdWxkIGJlIHBlcm1pc3NpYmxlIChpZgorICAgICAgICBzbG93KSB0byBsb29rIGluc2lkZSB0aGUgZGF0YSB0byBtYWtlIGEgYmV0dGVyIGd1ZXNzLgorCisgICAgICAgICIiIgorCisgICAgICAgIGJhc2UsIGV4dCA9IHBvc2l4cGF0aC5zcGxpdGV4dChwYXRoKQorICAgICAgICBpZiBleHQgaW4gc2VsZi5leHRlbnNpb25zX21hcDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmV4dGVuc2lvbnNfbWFwW2V4dF0KKyAgICAgICAgZXh0ID0gZXh0Lmxvd2VyKCkKKyAgICAgICAgaWYgZXh0IGluIHNlbGYuZXh0ZW5zaW9uc19tYXA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5leHRlbnNpb25zX21hcFtleHRdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5leHRlbnNpb25zX21hcFsnJ10KKworICAgIGlmIG5vdCBtaW1ldHlwZXMuaW5pdGVkOgorICAgICAgICBtaW1ldHlwZXMuaW5pdCgpICMgdHJ5IHRvIHJlYWQgc3lzdGVtIG1pbWUudHlwZXMKKyAgICBleHRlbnNpb25zX21hcCA9IG1pbWV0eXBlcy50eXBlc19tYXAuY29weSgpCisgICAgZXh0ZW5zaW9uc19tYXAudXBkYXRlKHsKKyAgICAgICAgJyc6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCAjIERlZmF1bHQKKyAgICAgICAgJy5weSc6ICd0ZXh0L3BsYWluJywKKyAgICAgICAgJy5jJzogJ3RleHQvcGxhaW4nLAorICAgICAgICAnLmgnOiAndGV4dC9wbGFpbicsCisgICAgICAgIH0pCisKKworZGVmIHRlc3QoSGFuZGxlckNsYXNzID0gU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgU2VydmVyQ2xhc3MgPSBCYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyKToKKyAgICBCYXNlSFRUUFNlcnZlci50ZXN0KEhhbmRsZXJDbGFzcywgU2VydmVyQ2xhc3MpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvU2ltcGxlSFRUUFNlcnZlci5weWMgYi9saWIvcHl0aG9uMi43L1NpbXBsZUhUVFBTZXJ2ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZmQ3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1NpbXBsZUhUVFBTZXJ2ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvU2ltcGxlSFRUUFNlcnZlci5weW8gYi9saWIvcHl0aG9uMi43L1NpbXBsZUhUVFBTZXJ2ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZmQ3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1NpbXBsZUhUVFBTZXJ2ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvU2ltcGxlWE1MUlBDU2VydmVyLnB5IGIvbGliL3B5dGhvbjIuNy9TaW1wbGVYTUxSUENTZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1Y2Q2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvU2ltcGxlWE1MUlBDU2VydmVyLnB5CkBAIC0wLDAgKzEsNzA3IEBACityIiIiU2ltcGxlIFhNTC1SUEMgU2VydmVyLgorCitUaGlzIG1vZHVsZSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgc2ltcGxlIFhNTC1SUEMgc2VydmVycworYnkgY3JlYXRpbmcgYSBzZXJ2ZXIgYW5kIGVpdGhlciBpbnN0YWxsaW5nIGZ1bmN0aW9ucywgYQorY2xhc3MgaW5zdGFuY2UsIG9yIGJ5IGV4dGVuZGluZyB0aGUgU2ltcGxlWE1MUlBDU2VydmVyCitjbGFzcy4KKworSXQgY2FuIGFsc28gYmUgdXNlZCB0byBoYW5kbGUgWE1MLVJQQyByZXF1ZXN0cyBpbiBhIENHSQorZW52aXJvbm1lbnQgdXNpbmcgQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXIuCisKK0EgbGlzdCBvZiBwb3NzaWJsZSB1c2FnZSBwYXR0ZXJucyBmb2xsb3dzOgorCisxLiBJbnN0YWxsIGZ1bmN0aW9uczoKKworc2VydmVyID0gU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCkpCitzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQorc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCitzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisKKzIuIEluc3RhbGwgYW4gaW5zdGFuY2U6CisKK2NsYXNzIE15RnVuY3M6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIG1ha2UgYWxsIG9mIHRoZSBzdHJpbmcgZnVuY3Rpb25zIGF2YWlsYWJsZSB0aHJvdWdoCisgICAgICAgICMgc3RyaW5nLmZ1bmNfbmFtZQorICAgICAgICBpbXBvcnQgc3RyaW5nCisgICAgICAgIHNlbGYuc3RyaW5nID0gc3RyaW5nCisgICAgZGVmIF9saXN0TWV0aG9kcyhzZWxmKToKKyAgICAgICAgIyBpbXBsZW1lbnQgdGhpcyBtZXRob2Qgc28gdGhhdCBzeXN0ZW0ubGlzdE1ldGhvZHMKKyAgICAgICAgIyBrbm93cyB0byBhZHZlcnRpc2UgdGhlIHN0cmluZ3MgbWV0aG9kcworICAgICAgICByZXR1cm4gbGlzdF9wdWJsaWNfbWV0aG9kcyhzZWxmKSArIFwKKyAgICAgICAgICAgICAgICBbJ3N0cmluZy4nICsgbWV0aG9kIGZvciBtZXRob2QgaW4gbGlzdF9wdWJsaWNfbWV0aG9kcyhzZWxmLnN0cmluZyldCisgICAgZGVmIHBvdyhzZWxmLCB4LCB5KTogcmV0dXJuIHBvdyh4LCB5KQorICAgIGRlZiBhZGQoc2VsZiwgeCwgeSkgOiByZXR1cm4geCArIHkKKworc2VydmVyID0gU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCkpCitzZXJ2ZXIucmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9mdW5jdGlvbnMoKQorc2VydmVyLnJlZ2lzdGVyX2luc3RhbmNlKE15RnVuY3MoKSkKK3NlcnZlci5zZXJ2ZV9mb3JldmVyKCkKKworMy4gSW5zdGFsbCBhbiBpbnN0YW5jZSB3aXRoIGN1c3RvbSBkaXNwYXRjaCBtZXRob2Q6CisKK2NsYXNzIE1hdGg6CisgICAgZGVmIF9saXN0TWV0aG9kcyhzZWxmKToKKyAgICAgICAgIyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByZXNlbnQgZm9yIHN5c3RlbS5saXN0TWV0aG9kcworICAgICAgICAjIHRvIHdvcmsKKyAgICAgICAgcmV0dXJuIFsnYWRkJywgJ3BvdyddCisgICAgZGVmIF9tZXRob2RIZWxwKHNlbGYsIG1ldGhvZCk6CisgICAgICAgICMgdGhpcyBtZXRob2QgbXVzdCBiZSBwcmVzZW50IGZvciBzeXN0ZW0ubWV0aG9kSGVscAorICAgICAgICAjIHRvIHdvcmsKKyAgICAgICAgaWYgbWV0aG9kID09ICdhZGQnOgorICAgICAgICAgICAgcmV0dXJuICJhZGQoMiwzKSA9PiA1IgorICAgICAgICBlbGlmIG1ldGhvZCA9PSAncG93JzoKKyAgICAgICAgICAgIHJldHVybiAicG93KHgsIHlbLCB6XSkgPT4gbnVtYmVyIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBCeSBjb252ZW50aW9uLCByZXR1cm4gZW1wdHkKKyAgICAgICAgICAgICMgc3RyaW5nIGlmIG5vIGhlbHAgaXMgYXZhaWxhYmxlCisgICAgICAgICAgICByZXR1cm4gIiIKKyAgICBkZWYgX2Rpc3BhdGNoKHNlbGYsIG1ldGhvZCwgcGFyYW1zKToKKyAgICAgICAgaWYgbWV0aG9kID09ICdwb3cnOgorICAgICAgICAgICAgcmV0dXJuIHBvdygqcGFyYW1zKQorICAgICAgICBlbGlmIG1ldGhvZCA9PSAnYWRkJzoKKyAgICAgICAgICAgIHJldHVybiBwYXJhbXNbMF0gKyBwYXJhbXNbMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlICdiYWQgbWV0aG9kJworCitzZXJ2ZXIgPSBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSkKK3NlcnZlci5yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2Z1bmN0aW9ucygpCitzZXJ2ZXIucmVnaXN0ZXJfaW5zdGFuY2UoTWF0aCgpKQorc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorCis0LiBTdWJjbGFzcyBTaW1wbGVYTUxSUENTZXJ2ZXI6CisKK2NsYXNzIE1hdGhTZXJ2ZXIoU2ltcGxlWE1MUlBDU2VydmVyKToKKyAgICBkZWYgX2Rpc3BhdGNoKHNlbGYsIG1ldGhvZCwgcGFyYW1zKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBXZSBhcmUgZm9yY2luZyB0aGUgJ2V4cG9ydF8nIHByZWZpeCBvbiBtZXRob2RzIHRoYXQgYXJlCisgICAgICAgICAgICAjIGNhbGxhYmxlIHRocm91Z2ggWE1MLVJQQyB0byBwcmV2ZW50IHBvdGVudGlhbCBzZWN1cml0eQorICAgICAgICAgICAgIyBwcm9ibGVtcworICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoc2VsZiwgJ2V4cG9ydF8nICsgbWV0aG9kKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ21ldGhvZCAiJXMiIGlzIG5vdCBzdXBwb3J0ZWQnICUgbWV0aG9kKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKnBhcmFtcykKKworICAgIGRlZiBleHBvcnRfYWRkKHNlbGYsIHgsIHkpOgorICAgICAgICByZXR1cm4geCArIHkKKworc2VydmVyID0gTWF0aFNlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApKQorc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorCis1LiBDR0kgc2NyaXB0OgorCitzZXJ2ZXIgPSBDR0lYTUxSUENSZXF1ZXN0SGFuZGxlcigpCitzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQorc2VydmVyLmhhbmRsZV9yZXF1ZXN0KCkKKyIiIgorCisjIFdyaXR0ZW4gYnkgQnJpYW4gUXVpbmxhbiAoYnJpYW5Ac3dlZXRhcHAuY29tKS4KKyMgQmFzZWQgb24gY29kZSB3cml0dGVuIGJ5IEZyZWRyaWsgTHVuZGguCisKK2ltcG9ydCB4bWxycGNsaWIKK2Zyb20geG1scnBjbGliIGltcG9ydCBGYXVsdAoraW1wb3J0IFNvY2tldFNlcnZlcgoraW1wb3J0IEJhc2VIVFRQU2VydmVyCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCByZQordHJ5OgorICAgIGltcG9ydCBmY250bAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZjbnRsID0gTm9uZQorCitkZWYgcmVzb2x2ZV9kb3R0ZWRfYXR0cmlidXRlKG9iaiwgYXR0ciwgYWxsb3dfZG90dGVkX25hbWVzPVRydWUpOgorICAgICIiInJlc29sdmVfZG90dGVkX2F0dHJpYnV0ZShhLCAnYi5jLmQnKSA9PiBhLmIuYy5kCisKKyAgICBSZXNvbHZlcyBhIGRvdHRlZCBhdHRyaWJ1dGUgbmFtZSB0byBhbiBvYmplY3QuICBSYWlzZXMKKyAgICBhbiBBdHRyaWJ1dGVFcnJvciBpZiBhbnkgYXR0cmlidXRlIGluIHRoZSBjaGFpbiBzdGFydHMgd2l0aCBhICdfJy4KKworICAgIElmIHRoZSBvcHRpb25hbCBhbGxvd19kb3R0ZWRfbmFtZXMgYXJndW1lbnQgaXMgZmFsc2UsIGRvdHMgYXJlIG5vdAorICAgIHN1cHBvcnRlZCBhbmQgdGhpcyBmdW5jdGlvbiBvcGVyYXRlcyBzaW1pbGFyIHRvIGdldGF0dHIob2JqLCBhdHRyKS4KKyAgICAiIiIKKworICAgIGlmIGFsbG93X2RvdHRlZF9uYW1lczoKKyAgICAgICAgYXR0cnMgPSBhdHRyLnNwbGl0KCcuJykKKyAgICBlbHNlOgorICAgICAgICBhdHRycyA9IFthdHRyXQorCisgICAgZm9yIGkgaW4gYXR0cnM6CisgICAgICAgIGlmIGkuc3RhcnRzd2l0aCgnXycpOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoCisgICAgICAgICAgICAgICAgJ2F0dGVtcHQgdG8gYWNjZXNzIHByaXZhdGUgYXR0cmlidXRlICIlcyInICUgaQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9iaiA9IGdldGF0dHIob2JqLGkpCisgICAgcmV0dXJuIG9iagorCitkZWYgbGlzdF9wdWJsaWNfbWV0aG9kcyhvYmopOgorICAgICIiIlJldHVybnMgYSBsaXN0IG9mIGF0dHJpYnV0ZSBzdHJpbmdzLCBmb3VuZCBpbiB0aGUgc3BlY2lmaWVkCisgICAgb2JqZWN0LCB3aGljaCByZXByZXNlbnQgY2FsbGFibGUgYXR0cmlidXRlcyIiIgorCisgICAgcmV0dXJuIFttZW1iZXIgZm9yIG1lbWJlciBpbiBkaXIob2JqKQorICAgICAgICAgICAgICAgIGlmIG5vdCBtZW1iZXIuc3RhcnRzd2l0aCgnXycpIGFuZAorICAgICAgICAgICAgICAgICAgICBoYXNhdHRyKGdldGF0dHIob2JqLCBtZW1iZXIpLCAnX19jYWxsX18nKV0KKworZGVmIHJlbW92ZV9kdXBsaWNhdGVzKGxzdCk6CisgICAgIiIicmVtb3ZlX2R1cGxpY2F0ZXMoWzIsMiwyLDEsMywzXSkgPT4gWzMsMSwyXQorCisgICAgUmV0dXJucyBhIGNvcHkgb2YgYSBsaXN0IHdpdGhvdXQgZHVwbGljYXRlcy4gRXZlcnkgbGlzdAorICAgIGl0ZW0gbXVzdCBiZSBoYXNoYWJsZSBhbmQgdGhlIG9yZGVyIG9mIHRoZSBpdGVtcyBpbiB0aGUKKyAgICByZXN1bHRpbmcgbGlzdCBpcyBub3QgZGVmaW5lZC4KKyAgICAiIiIKKyAgICB1ID0ge30KKyAgICBmb3IgeCBpbiBsc3Q6CisgICAgICAgIHVbeF0gPSAxCisKKyAgICByZXR1cm4gdS5rZXlzKCkKKworY2xhc3MgU2ltcGxlWE1MUlBDRGlzcGF0Y2hlcjoKKyAgICAiIiJNaXgtaW4gY2xhc3MgdGhhdCBkaXNwYXRjaGVzIFhNTC1SUEMgcmVxdWVzdHMuCisKKyAgICBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVnaXN0ZXIgWE1MLVJQQyBtZXRob2QgaGFuZGxlcnMKKyAgICBhbmQgdGhlbiB0byBkaXNwYXRjaCB0aGVtLiBUaGlzIGNsYXNzIGRvZXNuJ3QgbmVlZCB0byBiZQorICAgIGluc3RhbmNlZCBkaXJlY3RseSB3aGVuIHVzZWQgYnkgU2ltcGxlWE1MUlBDU2VydmVyIGJ1dCBpdAorICAgIGNhbiBiZSBpbnN0YW5jZWQgd2hlbiB1c2VkIGJ5IHRoZSBNdWx0aVBhdGhYTUxSUENTZXJ2ZXIuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWxsb3dfbm9uZT1GYWxzZSwgZW5jb2Rpbmc9Tm9uZSk6CisgICAgICAgIHNlbGYuZnVuY3MgPSB7fQorICAgICAgICBzZWxmLmluc3RhbmNlID0gTm9uZQorICAgICAgICBzZWxmLmFsbG93X25vbmUgPSBhbGxvd19ub25lCisgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZworCisgICAgZGVmIHJlZ2lzdGVyX2luc3RhbmNlKHNlbGYsIGluc3RhbmNlLCBhbGxvd19kb3R0ZWRfbmFtZXM9RmFsc2UpOgorICAgICAgICAiIiJSZWdpc3RlcnMgYW4gaW5zdGFuY2UgdG8gcmVzcG9uZCB0byBYTUwtUlBDIHJlcXVlc3RzLgorCisgICAgICAgIE9ubHkgb25lIGluc3RhbmNlIGNhbiBiZSBpbnN0YWxsZWQgYXQgYSB0aW1lLgorCisgICAgICAgIElmIHRoZSByZWdpc3RlcmVkIGluc3RhbmNlIGhhcyBhIF9kaXNwYXRjaCBtZXRob2QgdGhlbiB0aGF0CisgICAgICAgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBYTUwtUlBDIG1ldGhvZCBhbmQKKyAgICAgICAgaXRzIHBhcmFtZXRlcnMgYXMgYSB0dXBsZQorICAgICAgICBlLmcuIGluc3RhbmNlLl9kaXNwYXRjaCgnYWRkJywoMiwzKSkKKworICAgICAgICBJZiB0aGUgcmVnaXN0ZXJlZCBpbnN0YW5jZSBkb2VzIG5vdCBoYXZlIGEgX2Rpc3BhdGNoIG1ldGhvZAorICAgICAgICB0aGVuIHRoZSBpbnN0YW5jZSB3aWxsIGJlIHNlYXJjaGVkIHRvIGZpbmQgYSBtYXRjaGluZyBtZXRob2QKKyAgICAgICAgYW5kLCBpZiBmb3VuZCwgd2lsbCBiZSBjYWxsZWQuIE1ldGhvZHMgYmVnaW5uaW5nIHdpdGggYW4gJ18nCisgICAgICAgIGFyZSBjb25zaWRlcmVkIHByaXZhdGUgYW5kIHdpbGwgbm90IGJlIGNhbGxlZCBieQorICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIuCisKKyAgICAgICAgSWYgYSByZWdpc3RlcmVkIGZ1bmN0aW9uIG1hdGNoZXMgYSBYTUwtUlBDIHJlcXVlc3QsIHRoZW4gaXQKKyAgICAgICAgd2lsbCBiZSBjYWxsZWQgaW5zdGVhZCBvZiB0aGUgcmVnaXN0ZXJlZCBpbnN0YW5jZS4KKworICAgICAgICBJZiB0aGUgb3B0aW9uYWwgYWxsb3dfZG90dGVkX25hbWVzIGFyZ3VtZW50IGlzIHRydWUgYW5kIHRoZQorICAgICAgICBpbnN0YW5jZSBkb2VzIG5vdCBoYXZlIGEgX2Rpc3BhdGNoIG1ldGhvZCwgbWV0aG9kIG5hbWVzCisgICAgICAgIGNvbnRhaW5pbmcgZG90cyBhcmUgc3VwcG9ydGVkIGFuZCByZXNvbHZlZCwgYXMgbG9uZyBhcyBub25lIG9mCisgICAgICAgIHRoZSBuYW1lIHNlZ21lbnRzIHN0YXJ0IHdpdGggYW4gJ18nLgorCisgICAgICAgICAgICAqKiogU0VDVVJJVFkgV0FSTklORzogKioqCisKKyAgICAgICAgICAgIEVuYWJsaW5nIHRoZSBhbGxvd19kb3R0ZWRfbmFtZXMgb3B0aW9ucyBhbGxvd3MgaW50cnVkZXJzCisgICAgICAgICAgICB0byBhY2Nlc3MgeW91ciBtb2R1bGUncyBnbG9iYWwgdmFyaWFibGVzIGFuZCBtYXkgYWxsb3cKKyAgICAgICAgICAgIGludHJ1ZGVycyB0byBleGVjdXRlIGFyYml0cmFyeSBjb2RlIG9uIHlvdXIgbWFjaGluZS4gIE9ubHkKKyAgICAgICAgICAgIHVzZSB0aGlzIG9wdGlvbiBvbiBhIHNlY3VyZSwgY2xvc2VkIG5ldHdvcmsuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5pbnN0YW5jZSA9IGluc3RhbmNlCisgICAgICAgIHNlbGYuYWxsb3dfZG90dGVkX25hbWVzID0gYWxsb3dfZG90dGVkX25hbWVzCisKKyAgICBkZWYgcmVnaXN0ZXJfZnVuY3Rpb24oc2VsZiwgZnVuY3Rpb24sIG5hbWUgPSBOb25lKToKKyAgICAgICAgIiIiUmVnaXN0ZXJzIGEgZnVuY3Rpb24gdG8gcmVzcG9uZCB0byBYTUwtUlBDIHJlcXVlc3RzLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBuYW1lIGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIHNldCBhIFVuaWNvZGUgbmFtZQorICAgICAgICBmb3IgdGhlIGZ1bmN0aW9uLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBuYW1lID0gZnVuY3Rpb24uX19uYW1lX18KKyAgICAgICAgc2VsZi5mdW5jc1tuYW1lXSA9IGZ1bmN0aW9uCisKKyAgICBkZWYgcmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgICIiIlJlZ2lzdGVycyB0aGUgWE1MLVJQQyBpbnRyb3NwZWN0aW9uIG1ldGhvZHMgaW4gdGhlIHN5c3RlbQorICAgICAgICBuYW1lc3BhY2UuCisKKyAgICAgICAgc2VlIGh0dHA6Ly94bWxycGMudXNlZnVsaW5jLmNvbS9kb2MvcmVzZXJ2ZWQuaHRtbAorICAgICAgICAiIiIKKworICAgICAgICBzZWxmLmZ1bmNzLnVwZGF0ZSh7J3N5c3RlbS5saXN0TWV0aG9kcycgOiBzZWxmLnN5c3RlbV9saXN0TWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAnc3lzdGVtLm1ldGhvZFNpZ25hdHVyZScgOiBzZWxmLnN5c3RlbV9tZXRob2RTaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbS5tZXRob2RIZWxwJyA6IHNlbGYuc3lzdGVtX21ldGhvZEhlbHB9KQorCisgICAgZGVmIHJlZ2lzdGVyX211bHRpY2FsbF9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgICIiIlJlZ2lzdGVycyB0aGUgWE1MLVJQQyBtdWx0aWNhbGwgbWV0aG9kIGluIHRoZSBzeXN0ZW0KKyAgICAgICAgbmFtZXNwYWNlLgorCisgICAgICAgIHNlZSBodHRwOi8vd3d3LnhtbHJwYy5jb20vZGlzY3Vzcy9tc2dSZWFkZXIkMTIwOCIiIgorCisgICAgICAgIHNlbGYuZnVuY3MudXBkYXRlKHsnc3lzdGVtLm11bHRpY2FsbCcgOiBzZWxmLnN5c3RlbV9tdWx0aWNhbGx9KQorCisgICAgZGVmIF9tYXJzaGFsZWRfZGlzcGF0Y2goc2VsZiwgZGF0YSwgZGlzcGF0Y2hfbWV0aG9kID0gTm9uZSwgcGF0aCA9IE5vbmUpOgorICAgICAgICAiIiJEaXNwYXRjaGVzIGFuIFhNTC1SUEMgbWV0aG9kIGZyb20gbWFyc2hhbGxlZCAoWE1MKSBkYXRhLgorCisgICAgICAgIFhNTC1SUEMgbWV0aG9kcyBhcmUgZGlzcGF0Y2hlZCBmcm9tIHRoZSBtYXJzaGFsbGVkIChYTUwpIGRhdGEKKyAgICAgICAgdXNpbmcgdGhlIF9kaXNwYXRjaCBtZXRob2QgYW5kIHRoZSByZXN1bHQgaXMgcmV0dXJuZWQgYXMKKyAgICAgICAgbWFyc2hhbGxlZCBkYXRhLiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGEgZGlzcGF0Y2gKKyAgICAgICAgZnVuY3Rpb24gY2FuIGJlIHByb3ZpZGVkIGFzIGFuIGFyZ3VtZW50IChzZWUgY29tbWVudCBpbgorICAgICAgICBTaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlci5kb19QT1NUKSBidXQgb3ZlcnJpZGluZyB0aGUKKyAgICAgICAgZXhpc3RpbmcgbWV0aG9kIHRocm91Z2ggc3ViY2xhc3NpbmcgaXMgdGhlIHByZWZlcnJlZCBtZWFucworICAgICAgICBvZiBjaGFuZ2luZyBtZXRob2QgZGlzcGF0Y2ggYmVoYXZpb3IuCisgICAgICAgICIiIgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcmFtcywgbWV0aG9kID0geG1scnBjbGliLmxvYWRzKGRhdGEpCisKKyAgICAgICAgICAgICMgZ2VuZXJhdGUgcmVzcG9uc2UKKyAgICAgICAgICAgIGlmIGRpc3BhdGNoX21ldGhvZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IGRpc3BhdGNoX21ldGhvZChtZXRob2QsIHBhcmFtcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9kaXNwYXRjaChtZXRob2QsIHBhcmFtcykKKyAgICAgICAgICAgICMgd3JhcCByZXNwb25zZSBpbiBhIHNpbmdsZXRvbiB0dXBsZQorICAgICAgICAgICAgcmVzcG9uc2UgPSAocmVzcG9uc2UsKQorICAgICAgICAgICAgcmVzcG9uc2UgPSB4bWxycGNsaWIuZHVtcHMocmVzcG9uc2UsIG1ldGhvZHJlc3BvbnNlPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19ub25lPXNlbGYuYWxsb3dfbm9uZSwgZW5jb2Rpbmc9c2VsZi5lbmNvZGluZykKKyAgICAgICAgZXhjZXB0IEZhdWx0LCBmYXVsdDoKKyAgICAgICAgICAgIHJlc3BvbnNlID0geG1scnBjbGliLmR1bXBzKGZhdWx0LCBhbGxvd19ub25lPXNlbGYuYWxsb3dfbm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPXNlbGYuZW5jb2RpbmcpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICMgcmVwb3J0IGV4Y2VwdGlvbiBiYWNrIHRvIHNlcnZlcgorICAgICAgICAgICAgZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIHJlc3BvbnNlID0geG1scnBjbGliLmR1bXBzKAorICAgICAgICAgICAgICAgIHhtbHJwY2xpYi5GYXVsdCgxLCAiJXM6JXMiICUgKGV4Y190eXBlLCBleGNfdmFsdWUpKSwKKyAgICAgICAgICAgICAgICBlbmNvZGluZz1zZWxmLmVuY29kaW5nLCBhbGxvd19ub25lPXNlbGYuYWxsb3dfbm9uZSwKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlCisKKyAgICBkZWYgc3lzdGVtX2xpc3RNZXRob2RzKHNlbGYpOgorICAgICAgICAiIiJzeXN0ZW0ubGlzdE1ldGhvZHMoKSA9PiBbJ2FkZCcsICdzdWJ0cmFjdCcsICdtdWx0aXBsZSddCisKKyAgICAgICAgUmV0dXJucyBhIGxpc3Qgb2YgdGhlIG1ldGhvZHMgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIuIiIiCisKKyAgICAgICAgbWV0aG9kcyA9IHNlbGYuZnVuY3Mua2V5cygpCisgICAgICAgIGlmIHNlbGYuaW5zdGFuY2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIEluc3RhbmNlIGNhbiBpbXBsZW1lbnQgX2xpc3RNZXRob2QgdG8gcmV0dXJuIGEgbGlzdCBvZgorICAgICAgICAgICAgIyBtZXRob2RzCisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuaW5zdGFuY2UsICdfbGlzdE1ldGhvZHMnKToKKyAgICAgICAgICAgICAgICBtZXRob2RzID0gcmVtb3ZlX2R1cGxpY2F0ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzICsgc2VsZi5pbnN0YW5jZS5fbGlzdE1ldGhvZHMoKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAjIGlmIHRoZSBpbnN0YW5jZSBoYXMgYSBfZGlzcGF0Y2ggbWV0aG9kIHRoZW4gd2UKKyAgICAgICAgICAgICMgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gcHJvdmlkZSBhIGxpc3QKKyAgICAgICAgICAgICMgb2YgbWV0aG9kcworICAgICAgICAgICAgZWxpZiBub3QgaGFzYXR0cihzZWxmLmluc3RhbmNlLCAnX2Rpc3BhdGNoJyk6CisgICAgICAgICAgICAgICAgbWV0aG9kcyA9IHJlbW92ZV9kdXBsaWNhdGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcyArIGxpc3RfcHVibGljX21ldGhvZHMoc2VsZi5pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBtZXRob2RzLnNvcnQoKQorICAgICAgICByZXR1cm4gbWV0aG9kcworCisgICAgZGVmIHN5c3RlbV9tZXRob2RTaWduYXR1cmUoc2VsZiwgbWV0aG9kX25hbWUpOgorICAgICAgICAiIiJzeXN0ZW0ubWV0aG9kU2lnbmF0dXJlKCdhZGQnKSA9PiBbZG91YmxlLCBpbnQsIGludF0KKworICAgICAgICBSZXR1cm5zIGEgbGlzdCBkZXNjcmliaW5nIHRoZSBzaWduYXR1cmUgb2YgdGhlIG1ldGhvZC4gSW4gdGhlCisgICAgICAgIGFib3ZlIGV4YW1wbGUsIHRoZSBhZGQgbWV0aG9kIHRha2VzIHR3byBpbnRlZ2VycyBhcyBhcmd1bWVudHMKKyAgICAgICAgYW5kIHJldHVybnMgYSBkb3VibGUgcmVzdWx0LgorCisgICAgICAgIFRoaXMgc2VydmVyIGRvZXMgTk9UIHN1cHBvcnQgc3lzdGVtLm1ldGhvZFNpZ25hdHVyZS4iIiIKKworICAgICAgICAjIFNlZSBodHRwOi8veG1scnBjLnVzZWZ1bGluYy5jb20vZG9jL3N5c21ldGhvZHNpZy5odG1sCisKKyAgICAgICAgcmV0dXJuICdzaWduYXR1cmVzIG5vdCBzdXBwb3J0ZWQnCisKKyAgICBkZWYgc3lzdGVtX21ldGhvZEhlbHAoc2VsZiwgbWV0aG9kX25hbWUpOgorICAgICAgICAiIiJzeXN0ZW0ubWV0aG9kSGVscCgnYWRkJykgPT4gIkFkZHMgdHdvIGludGVnZXJzIHRvZ2V0aGVyIgorCisgICAgICAgIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBkb2N1bWVudGF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG1ldGhvZC4iIiIKKworICAgICAgICBtZXRob2QgPSBOb25lCisgICAgICAgIGlmIG1ldGhvZF9uYW1lIGluIHNlbGYuZnVuY3M6CisgICAgICAgICAgICBtZXRob2QgPSBzZWxmLmZ1bmNzW21ldGhvZF9uYW1lXQorICAgICAgICBlbGlmIHNlbGYuaW5zdGFuY2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIEluc3RhbmNlIGNhbiBpbXBsZW1lbnQgX21ldGhvZEhlbHAgdG8gcmV0dXJuIGhlbHAgZm9yIGEgbWV0aG9kCisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuaW5zdGFuY2UsICdfbWV0aG9kSGVscCcpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbmNlLl9tZXRob2RIZWxwKG1ldGhvZF9uYW1lKQorICAgICAgICAgICAgIyBpZiB0aGUgaW5zdGFuY2UgaGFzIGEgX2Rpc3BhdGNoIG1ldGhvZCB0aGVuIHdlCisgICAgICAgICAgICAjIGRvbid0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHByb3ZpZGUgaGVscAorICAgICAgICAgICAgZWxpZiBub3QgaGFzYXR0cihzZWxmLmluc3RhbmNlLCAnX2Rpc3BhdGNoJyk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSByZXNvbHZlX2RvdHRlZF9hdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbG93X2RvdHRlZF9uYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBOb3RlIHRoYXQgd2UgYXJlbid0IGNoZWNraW5nIHRoYXQgdGhlIG1ldGhvZCBhY3R1YWxseQorICAgICAgICAjIGJlIGEgY2FsbGFibGUgb2JqZWN0IG9mIHNvbWUga2luZAorICAgICAgICBpZiBtZXRob2QgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW1wb3J0IHB5ZG9jCisgICAgICAgICAgICByZXR1cm4gcHlkb2MuZ2V0ZG9jKG1ldGhvZCkKKworICAgIGRlZiBzeXN0ZW1fbXVsdGljYWxsKHNlbGYsIGNhbGxfbGlzdCk6CisgICAgICAgICIiInN5c3RlbS5tdWx0aWNhbGwoW3snbWV0aG9kTmFtZSc6ICdhZGQnLCAncGFyYW1zJzogWzIsIDJdfSwgLi4uXSkgPT4gXAorW1s0XSwgLi4uXQorCisgICAgICAgIEFsbG93cyB0aGUgY2FsbGVyIHRvIHBhY2thZ2UgbXVsdGlwbGUgWE1MLVJQQyBjYWxscyBpbnRvIGEgc2luZ2xlCisgICAgICAgIHJlcXVlc3QuCisKKyAgICAgICAgU2VlIGh0dHA6Ly93d3cueG1scnBjLmNvbS9kaXNjdXNzL21zZ1JlYWRlciQxMjA4CisgICAgICAgICIiIgorCisgICAgICAgIHJlc3VsdHMgPSBbXQorICAgICAgICBmb3IgY2FsbCBpbiBjYWxsX2xpc3Q6CisgICAgICAgICAgICBtZXRob2RfbmFtZSA9IGNhbGxbJ21ldGhvZE5hbWUnXQorICAgICAgICAgICAgcGFyYW1zID0gY2FsbFsncGFyYW1zJ10KKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgWFhYIEEgbWFyc2hhbGxpbmcgZXJyb3IgaW4gYW55IHJlc3BvbnNlIHdpbGwgZmFpbCB0aGUgZW50aXJlCisgICAgICAgICAgICAgICAgIyBtdWx0aWNhbGwuIElmIHNvbWVvbmUgY2FyZXMgdGhleSBzaG91bGQgZml4IHRoaXMuCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoW3NlbGYuX2Rpc3BhdGNoKG1ldGhvZF9uYW1lLCBwYXJhbXMpXSkKKyAgICAgICAgICAgIGV4Y2VwdCBGYXVsdCwgZmF1bHQ6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgIHsnZmF1bHRDb2RlJyA6IGZhdWx0LmZhdWx0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICdmYXVsdFN0cmluZycgOiBmYXVsdC5mYXVsdFN0cmluZ30KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgIHsnZmF1bHRDb2RlJyA6IDEsCisgICAgICAgICAgICAgICAgICAgICAnZmF1bHRTdHJpbmcnIDogIiVzOiVzIiAlIChleGNfdHlwZSwgZXhjX3ZhbHVlKX0KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIF9kaXNwYXRjaChzZWxmLCBtZXRob2QsIHBhcmFtcyk6CisgICAgICAgICIiIkRpc3BhdGNoZXMgdGhlIFhNTC1SUEMgbWV0aG9kLgorCisgICAgICAgIFhNTC1SUEMgY2FsbHMgYXJlIGZvcndhcmRlZCB0byBhIHJlZ2lzdGVyZWQgZnVuY3Rpb24gdGhhdAorICAgICAgICBtYXRjaGVzIHRoZSBjYWxsZWQgWE1MLVJQQyBtZXRob2QgbmFtZS4gSWYgbm8gc3VjaCBmdW5jdGlvbgorICAgICAgICBleGlzdHMgdGhlbiB0aGUgY2FsbCBpcyBmb3J3YXJkZWQgdG8gdGhlIHJlZ2lzdGVyZWQgaW5zdGFuY2UsCisgICAgICAgIGlmIGF2YWlsYWJsZS4KKworICAgICAgICBJZiB0aGUgcmVnaXN0ZXJlZCBpbnN0YW5jZSBoYXMgYSBfZGlzcGF0Y2ggbWV0aG9kIHRoZW4gdGhhdAorICAgICAgICBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgWE1MLVJQQyBtZXRob2QgYW5kCisgICAgICAgIGl0cyBwYXJhbWV0ZXJzIGFzIGEgdHVwbGUKKyAgICAgICAgZS5nLiBpbnN0YW5jZS5fZGlzcGF0Y2goJ2FkZCcsKDIsMykpCisKKyAgICAgICAgSWYgdGhlIHJlZ2lzdGVyZWQgaW5zdGFuY2UgZG9lcyBub3QgaGF2ZSBhIF9kaXNwYXRjaCBtZXRob2QKKyAgICAgICAgdGhlbiB0aGUgaW5zdGFuY2Ugd2lsbCBiZSBzZWFyY2hlZCB0byBmaW5kIGEgbWF0Y2hpbmcgbWV0aG9kCisgICAgICAgIGFuZCwgaWYgZm91bmQsIHdpbGwgYmUgY2FsbGVkLgorCisgICAgICAgIE1ldGhvZHMgYmVnaW5uaW5nIHdpdGggYW4gJ18nIGFyZSBjb25zaWRlcmVkIHByaXZhdGUgYW5kIHdpbGwKKyAgICAgICAgbm90IGJlIGNhbGxlZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZnVuYyA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBjaGVjayB0byBzZWUgaWYgYSBtYXRjaGluZyBmdW5jdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkCisgICAgICAgICAgICBmdW5jID0gc2VsZi5mdW5jc1ttZXRob2RdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGlmIHNlbGYuaW5zdGFuY2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgYSBfZGlzcGF0Y2ggbWV0aG9kCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLmluc3RhbmNlLCAnX2Rpc3BhdGNoJyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbmNlLl9kaXNwYXRjaChtZXRob2QsIHBhcmFtcykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGNhbGwgaW5zdGFuY2UgbWV0aG9kIGRpcmVjdGx5CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSByZXNvbHZlX2RvdHRlZF9hdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hbGxvd19kb3R0ZWRfbmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBpZiBmdW5jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKnBhcmFtcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignbWV0aG9kICIlcyIgaXMgbm90IHN1cHBvcnRlZCcgJSBtZXRob2QpCisKK2NsYXNzIFNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyKEJhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOgorICAgICIiIlNpbXBsZSBYTUwtUlBDIHJlcXVlc3QgaGFuZGxlciBjbGFzcy4KKworICAgIEhhbmRsZXMgYWxsIEhUVFAgUE9TVCByZXF1ZXN0cyBhbmQgYXR0ZW1wdHMgdG8gZGVjb2RlIHRoZW0gYXMKKyAgICBYTUwtUlBDIHJlcXVlc3RzLgorICAgICIiIgorCisgICAgIyBDbGFzcyBhdHRyaWJ1dGUgbGlzdGluZyB0aGUgYWNjZXNzaWJsZSBwYXRoIGNvbXBvbmVudHM7CisgICAgIyBwYXRocyBub3Qgb24gdGhpcyBsaXN0IHdpbGwgcmVzdWx0IGluIGEgNDA0IGVycm9yLgorICAgIHJwY19wYXRocyA9ICgnLycsICcvUlBDMicpCisKKyAgICAjaWYgbm90IE5vbmUsIGVuY29kZSByZXNwb25zZXMgbGFyZ2VyIHRoYW4gdGhpcywgaWYgcG9zc2libGUKKyAgICBlbmNvZGVfdGhyZXNob2xkID0gMTQwMCAjYSBjb21tb24gTVRVCisKKyAgICAjT3ZlcnJpZGUgZm9ybSBTdHJlYW1SZXF1ZXN0SGFuZGxlcjogZnVsbCBidWZmZXJpbmcgb2Ygb3V0cHV0CisgICAgI2FuZCBubyBOYWdsZS4KKyAgICB3YnVmc2l6ZSA9IC0xCisgICAgZGlzYWJsZV9uYWdsZV9hbGdvcml0aG0gPSBUcnVlCisKKyAgICAjIGEgcmUgdG8gbWF0Y2ggYSBnemlwIEFjY2VwdC1FbmNvZGluZworICAgIGFlcGF0dGVybiA9IHJlLmNvbXBpbGUociIiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxzKiAoW15ccztdKykgXHMqICAgICAgICAgICAgI2NvbnRlbnQtY29kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDtccyogcSBccyo9XHMqIChbMC05XC5dKykpPyAjcQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIiwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCisKKyAgICBkZWYgYWNjZXB0X2VuY29kaW5ncyhzZWxmKToKKyAgICAgICAgciA9IHt9CisgICAgICAgIGFlID0gc2VsZi5oZWFkZXJzLmdldCgiQWNjZXB0LUVuY29kaW5nIiwgIiIpCisgICAgICAgIGZvciBlIGluIGFlLnNwbGl0KCIsIik6CisgICAgICAgICAgICBtYXRjaCA9IHNlbGYuYWVwYXR0ZXJuLm1hdGNoKGUpCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICB2ID0gbWF0Y2guZ3JvdXAoMykKKyAgICAgICAgICAgICAgICB2ID0gZmxvYXQodikgaWYgdiBlbHNlIDEuMAorICAgICAgICAgICAgICAgIHJbbWF0Y2guZ3JvdXAoMSldID0gdgorICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIGlzX3JwY19wYXRoX3ZhbGlkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnJwY19wYXRoczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhdGggaW4gc2VsZi5ycGNfcGF0aHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgSWYgLnJwY19wYXRocyBpcyBlbXB0eSwganVzdCBhc3N1bWUgYWxsIHBhdGhzIGFyZSBsZWdhbAorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBkb19QT1NUKHNlbGYpOgorICAgICAgICAiIiJIYW5kbGVzIHRoZSBIVFRQIFBPU1QgcmVxdWVzdC4KKworICAgICAgICBBdHRlbXB0cyB0byBpbnRlcnByZXQgYWxsIEhUVFAgUE9TVCByZXF1ZXN0cyBhcyBYTUwtUlBDIGNhbGxzLAorICAgICAgICB3aGljaCBhcmUgZm9yd2FyZGVkIHRvIHRoZSBzZXJ2ZXIncyBfZGlzcGF0Y2ggbWV0aG9kIGZvciBoYW5kbGluZy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBwYXRoIGlzIGxlZ2FsCisgICAgICAgIGlmIG5vdCBzZWxmLmlzX3JwY19wYXRoX3ZhbGlkKCk6CisgICAgICAgICAgICBzZWxmLnJlcG9ydF80MDQoKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBHZXQgYXJndW1lbnRzIGJ5IHJlYWRpbmcgYm9keSBvZiByZXF1ZXN0LgorICAgICAgICAgICAgIyBXZSByZWFkIHRoaXMgaW4gY2h1bmtzIHRvIGF2b2lkIHN0cmFpbmluZworICAgICAgICAgICAgIyBzb2NrZXQucmVhZCgpOyBhcm91bmQgdGhlIDEwIG9yIDE1TWIgbWFyaywgc29tZSBwbGF0Zm9ybXMKKyAgICAgICAgICAgICMgYmVnaW4gdG8gaGF2ZSBwcm9ibGVtcyAoYnVnICM3OTI1NzApLgorICAgICAgICAgICAgbWF4X2NodW5rX3NpemUgPSAxMCoxMDI0KjEwMjQKKyAgICAgICAgICAgIHNpemVfcmVtYWluaW5nID0gaW50KHNlbGYuaGVhZGVyc1siY29udGVudC1sZW5ndGgiXSkKKyAgICAgICAgICAgIEwgPSBbXQorICAgICAgICAgICAgd2hpbGUgc2l6ZV9yZW1haW5pbmc6CisgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IG1pbihzaXplX3JlbWFpbmluZywgbWF4X2NodW5rX3NpemUpCisgICAgICAgICAgICAgICAgY2h1bmsgPSBzZWxmLnJmaWxlLnJlYWQoY2h1bmtfc2l6ZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgY2h1bms6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgTC5hcHBlbmQoY2h1bmspCisgICAgICAgICAgICAgICAgc2l6ZV9yZW1haW5pbmcgLT0gbGVuKExbLTFdKQorICAgICAgICAgICAgZGF0YSA9ICcnLmpvaW4oTCkKKworICAgICAgICAgICAgZGF0YSA9IHNlbGYuZGVjb2RlX3JlcXVlc3RfY29udGVudChkYXRhKQorICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiAjcmVzcG9uc2UgaGFzIGJlZW4gc2VudAorCisgICAgICAgICAgICAjIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNpbXBsZVhNTFJQQ1NlcnZlciwgX2Rpc3BhdGNoCisgICAgICAgICAgICAjIGNvdWxkIGJlIG92ZXJyaWRkZW4gaW4gdGhpcyBjbGFzcywgaW5zdGVhZCBvZiBpbgorICAgICAgICAgICAgIyBTaW1wbGVYTUxSUENEaXNwYXRjaGVyLiBUbyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwKKyAgICAgICAgICAgICMgY2hlY2sgdG8gc2VlIGlmIGEgc3ViY2xhc3MgaW1wbGVtZW50cyBfZGlzcGF0Y2ggYW5kIGRpc3BhdGNoCisgICAgICAgICAgICAjIHVzaW5nIHRoYXQgbWV0aG9kIGlmIHByZXNlbnQuCisgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuc2VydmVyLl9tYXJzaGFsZWRfZGlzcGF0Y2goCisgICAgICAgICAgICAgICAgICAgIGRhdGEsIGdldGF0dHIoc2VsZiwgJ19kaXNwYXRjaCcsIE5vbmUpLCBzZWxmLnBhdGgKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6ICMgVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIG1vZHVsZSBpcyBidWdneQorICAgICAgICAgICAgIyBpbnRlcm5hbCBlcnJvciwgcmVwb3J0IGFzIEhUVFAgc2VydmVyIGVycm9yCisgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoNTAwKQorCisgICAgICAgICAgICAjIFNlbmQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4Y2VwdGlvbiBpZiByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5zZXJ2ZXIsICdfc2VuZF90cmFjZWJhY2tfaGVhZGVyJykgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuX3NlbmRfdHJhY2ViYWNrX2hlYWRlcjoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJYLWV4Y2VwdGlvbiIsIHN0cihlKSkKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJYLXRyYWNlYmFjayIsIHRyYWNlYmFjay5mb3JtYXRfZXhjKCkpCisKKyAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtbGVuZ3RoIiwgIjAiKQorICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGdvdCBhIHZhbGlkIFhNTCBSUEMgcmVzcG9uc2UKKyAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LXR5cGUiLCAidGV4dC94bWwiKQorICAgICAgICAgICAgaWYgc2VsZi5lbmNvZGVfdGhyZXNob2xkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlmIGxlbihyZXNwb25zZSkgPiBzZWxmLmVuY29kZV90aHJlc2hvbGQ6CisgICAgICAgICAgICAgICAgICAgIHEgPSBzZWxmLmFjY2VwdF9lbmNvZGluZ3MoKS5nZXQoImd6aXAiLCAwKQorICAgICAgICAgICAgICAgICAgICBpZiBxOgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0geG1scnBjbGliLmd6aXBfZW5jb2RlKHJlc3BvbnNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LWxlbmd0aCIsIHN0cihsZW4ocmVzcG9uc2UpKSkKKyAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZShyZXNwb25zZSkKKworICAgIGRlZiBkZWNvZGVfcmVxdWVzdF9jb250ZW50KHNlbGYsIGRhdGEpOgorICAgICAgICAjc3VwcG9ydCBnemlwIGVuY29kaW5nIG9mIHJlcXVlc3QKKyAgICAgICAgZW5jb2RpbmcgPSBzZWxmLmhlYWRlcnMuZ2V0KCJjb250ZW50LWVuY29kaW5nIiwgImlkZW50aXR5IikubG93ZXIoKQorICAgICAgICBpZiBlbmNvZGluZyA9PSAiaWRlbnRpdHkiOgorICAgICAgICAgICAgcmV0dXJuIGRhdGEKKyAgICAgICAgaWYgZW5jb2RpbmcgPT0gImd6aXAiOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiB4bWxycGNsaWIuZ3ppcF9kZWNvZGUoZGF0YSkKKyAgICAgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSg1MDEsICJlbmNvZGluZyAlciBub3Qgc3VwcG9ydGVkIiAlIGVuY29kaW5nKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDQwMCwgImVycm9yIGRlY29kaW5nIGd6aXAgY29udGVudCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoNTAxLCAiZW5jb2RpbmcgJXIgbm90IHN1cHBvcnRlZCIgJSBlbmNvZGluZykKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1sZW5ndGgiLCAiMCIpCisgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorCisgICAgZGVmIHJlcG9ydF80MDQgKHNlbGYpOgorICAgICAgICAgICAgIyBSZXBvcnQgYSA0MDQgZXJyb3IKKyAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDQwNCkKKyAgICAgICAgcmVzcG9uc2UgPSAnTm8gc3VjaCBwYWdlJworICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LXR5cGUiLCAidGV4dC9wbGFpbiIpCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtbGVuZ3RoIiwgc3RyKGxlbihyZXNwb25zZSkpKQorICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgc2VsZi53ZmlsZS53cml0ZShyZXNwb25zZSkKKworICAgIGRlZiBsb2dfcmVxdWVzdChzZWxmLCBjb2RlPSctJywgc2l6ZT0nLScpOgorICAgICAgICAiIiJTZWxlY3RpdmVseSBsb2cgYW4gYWNjZXB0ZWQgcmVxdWVzdC4iIiIKKworICAgICAgICBpZiBzZWxmLnNlcnZlci5sb2dSZXF1ZXN0czoKKyAgICAgICAgICAgIEJhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIubG9nX3JlcXVlc3Qoc2VsZiwgY29kZSwgc2l6ZSkKKworY2xhc3MgU2ltcGxlWE1MUlBDU2VydmVyKFNvY2tldFNlcnZlci5UQ1BTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlWE1MUlBDRGlzcGF0Y2hlcik6CisgICAgIiIiU2ltcGxlIFhNTC1SUEMgc2VydmVyLgorCisgICAgU2ltcGxlIFhNTC1SUEMgc2VydmVyIHRoYXQgYWxsb3dzIGZ1bmN0aW9ucyBhbmQgYSBzaW5nbGUgaW5zdGFuY2UKKyAgICB0byBiZSBpbnN0YWxsZWQgdG8gaGFuZGxlIHJlcXVlc3RzLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIGF0dGVtcHRzIHRvIGRpc3BhdGNoIFhNTC1SUEMgY2FsbHMgdG8gdGhlIGZ1bmN0aW9ucyBvciBpbnN0YW5jZQorICAgIGluc3RhbGxlZCBpbiB0aGUgc2VydmVyLiBPdmVycmlkZSB0aGUgX2Rpc3BhdGNoIG1ldGhvZCBpbmhlcmV0ZWQKKyAgICBmcm9tIFNpbXBsZVhNTFJQQ0Rpc3BhdGNoZXIgdG8gY2hhbmdlIHRoaXMgYmVoYXZpb3IuCisgICAgIiIiCisKKyAgICBhbGxvd19yZXVzZV9hZGRyZXNzID0gVHJ1ZQorCisgICAgIyBXYXJuaW5nOiB0aGlzIGlzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSEgTmV2ZXIgc2V0IHRoaXMgdG8gVHJ1ZSBpbgorICAgICMgcHJvZHVjdGlvbiBjb2RlLCBhcyB3aWxsIGJlIHNlbmRpbmcgb3V0IHNlbnNpdGl2ZSBpbmZvcm1hdGlvbiAoZXhjZXB0aW9uCisgICAgIyBhbmQgc3RhY2sgdHJhY2UgZGV0YWlscykgd2hlbiBleGNlcHRpb25zIGFyZSByYWlzZWQgaW5zaWRlCisgICAgIyBTaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlci5kb19QT1NUCisgICAgX3NlbmRfdHJhY2ViYWNrX2hlYWRlciA9IEZhbHNlCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkciwgcmVxdWVzdEhhbmRsZXI9U2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIsCisgICAgICAgICAgICAgICAgIGxvZ1JlcXVlc3RzPVRydWUsIGFsbG93X25vbmU9RmFsc2UsIGVuY29kaW5nPU5vbmUsIGJpbmRfYW5kX2FjdGl2YXRlPVRydWUpOgorICAgICAgICBzZWxmLmxvZ1JlcXVlc3RzID0gbG9nUmVxdWVzdHMKKworICAgICAgICBTaW1wbGVYTUxSUENEaXNwYXRjaGVyLl9faW5pdF9fKHNlbGYsIGFsbG93X25vbmUsIGVuY29kaW5nKQorICAgICAgICBTb2NrZXRTZXJ2ZXIuVENQU2VydmVyLl9faW5pdF9fKHNlbGYsIGFkZHIsIHJlcXVlc3RIYW5kbGVyLCBiaW5kX2FuZF9hY3RpdmF0ZSkKKworICAgICAgICAjIFtCdWcgIzEyMjI3OTBdIElmIHBvc3NpYmxlLCBzZXQgY2xvc2Utb24tZXhlYyBmbGFnOyBpZiBhCisgICAgICAgICMgbWV0aG9kIHNwYXducyBhIHN1YnByb2Nlc3MsIHRoZSBzdWJwcm9jZXNzIHNob3VsZG4ndCBoYXZlCisgICAgICAgICMgdGhlIGxpc3RlbmluZyBzb2NrZXQgb3Blbi4KKyAgICAgICAgaWYgZmNudGwgaXMgbm90IE5vbmUgYW5kIGhhc2F0dHIoZmNudGwsICdGRF9DTE9FWEVDJyk6CisgICAgICAgICAgICBmbGFncyA9IGZjbnRsLmZjbnRsKHNlbGYuZmlsZW5vKCksIGZjbnRsLkZfR0VURkQpCisgICAgICAgICAgICBmbGFncyB8PSBmY250bC5GRF9DTE9FWEVDCisgICAgICAgICAgICBmY250bC5mY250bChzZWxmLmZpbGVubygpLCBmY250bC5GX1NFVEZELCBmbGFncykKKworY2xhc3MgTXVsdGlQYXRoWE1MUlBDU2VydmVyKFNpbXBsZVhNTFJQQ1NlcnZlcik6CisgICAgIiIiTXVsdGlwYXRoIFhNTC1SUEMgU2VydmVyCisgICAgVGhpcyBzcGVjaWFsaXphdGlvbiBvZiBTaW1wbGVYTUxSUENTZXJ2ZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNyZWF0ZQorICAgIG11bHRpcGxlIERpc3BhdGNoZXIgaW5zdGFuY2VzIGFuZCBhc3NpZ24gdGhlbSB0byBkaWZmZXJlbnQKKyAgICBIVFRQIHJlcXVlc3QgcGF0aHMuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJ1biB0d28gb3IgbW9yZQorICAgICd2aXJ0dWFsIFhNTC1SUEMgc2VydmVycycgYXQgdGhlIHNhbWUgcG9ydC4KKyAgICBNYWtlIHN1cmUgdGhhdCB0aGUgcmVxdWVzdEhhbmRsZXIgYWNjZXB0cyB0aGUgcGF0aHMgaW4gcXVlc3Rpb24uCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHIsIHJlcXVlc3RIYW5kbGVyPVNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICBsb2dSZXF1ZXN0cz1UcnVlLCBhbGxvd19ub25lPUZhbHNlLCBlbmNvZGluZz1Ob25lLCBiaW5kX2FuZF9hY3RpdmF0ZT1UcnVlKToKKworICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIuX19pbml0X18oc2VsZiwgYWRkciwgcmVxdWVzdEhhbmRsZXIsIGxvZ1JlcXVlc3RzLCBhbGxvd19ub25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIGJpbmRfYW5kX2FjdGl2YXRlKQorICAgICAgICBzZWxmLmRpc3BhdGNoZXJzID0ge30KKyAgICAgICAgc2VsZi5hbGxvd19ub25lID0gYWxsb3dfbm9uZQorICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKworICAgIGRlZiBhZGRfZGlzcGF0Y2hlcihzZWxmLCBwYXRoLCBkaXNwYXRjaGVyKToKKyAgICAgICAgc2VsZi5kaXNwYXRjaGVyc1twYXRoXSA9IGRpc3BhdGNoZXIKKyAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXIKKworICAgIGRlZiBnZXRfZGlzcGF0Y2hlcihzZWxmLCBwYXRoKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGlzcGF0Y2hlcnNbcGF0aF0KKworICAgIGRlZiBfbWFyc2hhbGVkX2Rpc3BhdGNoKHNlbGYsIGRhdGEsIGRpc3BhdGNoX21ldGhvZCA9IE5vbmUsIHBhdGggPSBOb25lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmRpc3BhdGNoZXJzW3BhdGhdLl9tYXJzaGFsZWRfZGlzcGF0Y2goCisgICAgICAgICAgICAgICBkYXRhLCBkaXNwYXRjaF9tZXRob2QsIHBhdGgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICMgcmVwb3J0IGxvdyBsZXZlbCBleGNlcHRpb24gYmFjayB0byBzZXJ2ZXIKKyAgICAgICAgICAgICMgKGVhY2ggZGlzcGF0Y2hlciBzaG91bGQgaGF2ZSBoYW5kbGVkIHRoZWlyIG93bgorICAgICAgICAgICAgIyBleGNlcHRpb25zKQorICAgICAgICAgICAgZXhjX3R5cGUsIGV4Y192YWx1ZSA9IHN5cy5leGNfaW5mbygpWzoyXQorICAgICAgICAgICAgcmVzcG9uc2UgPSB4bWxycGNsaWIuZHVtcHMoCisgICAgICAgICAgICAgICAgeG1scnBjbGliLkZhdWx0KDEsICIlczolcyIgJSAoZXhjX3R5cGUsIGV4Y192YWx1ZSkpLAorICAgICAgICAgICAgICAgIGVuY29kaW5nPXNlbGYuZW5jb2RpbmcsIGFsbG93X25vbmU9c2VsZi5hbGxvd19ub25lKQorICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworY2xhc3MgQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXIoU2ltcGxlWE1MUlBDRGlzcGF0Y2hlcik6CisgICAgIiIiU2ltcGxlIGhhbmRsZXIgZm9yIFhNTC1SUEMgZGF0YSBwYXNzZWQgdGhyb3VnaCBDR0kuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWxsb3dfbm9uZT1GYWxzZSwgZW5jb2Rpbmc9Tm9uZSk6CisgICAgICAgIFNpbXBsZVhNTFJQQ0Rpc3BhdGNoZXIuX19pbml0X18oc2VsZiwgYWxsb3dfbm9uZSwgZW5jb2RpbmcpCisKKyAgICBkZWYgaGFuZGxlX3htbHJwYyhzZWxmLCByZXF1ZXN0X3RleHQpOgorICAgICAgICAiIiJIYW5kbGUgYSBzaW5nbGUgWE1MLVJQQyByZXF1ZXN0IiIiCisKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9tYXJzaGFsZWRfZGlzcGF0Y2gocmVxdWVzdF90ZXh0KQorCisgICAgICAgIHByaW50ICdDb250ZW50LVR5cGU6IHRleHQveG1sJworICAgICAgICBwcmludCAnQ29udGVudC1MZW5ndGg6ICVkJyAlIGxlbihyZXNwb25zZSkKKyAgICAgICAgcHJpbnQKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZShyZXNwb25zZSkKKworICAgIGRlZiBoYW5kbGVfZ2V0KHNlbGYpOgorICAgICAgICAiIiJIYW5kbGUgYSBzaW5nbGUgSFRUUCBHRVQgcmVxdWVzdC4KKworICAgICAgICBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGluZGljYXRlcyBhbiBlcnJvciBiZWNhdXNlCisgICAgICAgIFhNTC1SUEMgdXNlcyB0aGUgUE9TVCBtZXRob2QuCisgICAgICAgICIiIgorCisgICAgICAgIGNvZGUgPSA0MDAKKyAgICAgICAgbWVzc2FnZSwgZXhwbGFpbiA9IFwKKyAgICAgICAgICAgICAgICAgQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlci5yZXNwb25zZXNbY29kZV0KKworICAgICAgICByZXNwb25zZSA9IEJhc2VIVFRQU2VydmVyLkRFRkFVTFRfRVJST1JfTUVTU0FHRSAlIFwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAnY29kZScgOiBjb2RlLAorICAgICAgICAgICAgICdtZXNzYWdlJyA6IG1lc3NhZ2UsCisgICAgICAgICAgICAgJ2V4cGxhaW4nIDogZXhwbGFpbgorICAgICAgICAgICAgfQorICAgICAgICBwcmludCAnU3RhdHVzOiAlZCAlcycgJSAoY29kZSwgbWVzc2FnZSkKKyAgICAgICAgcHJpbnQgJ0NvbnRlbnQtVHlwZTogJXMnICUgQmFzZUhUVFBTZXJ2ZXIuREVGQVVMVF9FUlJPUl9DT05URU5UX1RZUEUKKyAgICAgICAgcHJpbnQgJ0NvbnRlbnQtTGVuZ3RoOiAlZCcgJSBsZW4ocmVzcG9uc2UpCisgICAgICAgIHByaW50CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUocmVzcG9uc2UpCisKKyAgICBkZWYgaGFuZGxlX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdF90ZXh0ID0gTm9uZSk6CisgICAgICAgICIiIkhhbmRsZSBhIHNpbmdsZSBYTUwtUlBDIHJlcXVlc3QgcGFzc2VkIHRocm91Z2ggYSBDR0kgcG9zdCBtZXRob2QuCisKKyAgICAgICAgSWYgbm8gWE1MIGRhdGEgaXMgZ2l2ZW4gdGhlbiBpdCBpcyByZWFkIGZyb20gc3RkaW4uIFRoZSByZXN1bHRpbmcKKyAgICAgICAgWE1MLVJQQyByZXNwb25zZSBpcyBwcmludGVkIHRvIHN0ZG91dCBhbG9uZyB3aXRoIHRoZSBjb3JyZWN0IEhUVFAKKyAgICAgICAgaGVhZGVycy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgcmVxdWVzdF90ZXh0IGlzIE5vbmUgYW5kIFwKKyAgICAgICAgICAgIG9zLmVudmlyb24uZ2V0KCdSRVFVRVNUX01FVEhPRCcsIE5vbmUpID09ICdHRVQnOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfZ2V0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgUE9TVCBkYXRhIGlzIG5vcm1hbGx5IGF2YWlsYWJsZSB0aHJvdWdoIHN0ZGluCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gaW50KG9zLmVudmlyb24uZ2V0KCdDT05URU5UX0xFTkdUSCcsIE5vbmUpKQorICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIGxlbmd0aCA9IC0xCisgICAgICAgICAgICBpZiByZXF1ZXN0X3RleHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXF1ZXN0X3RleHQgPSBzeXMuc3RkaW4ucmVhZChsZW5ndGgpCisKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX3htbHJwYyhyZXF1ZXN0X3RleHQpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcHJpbnQgJ1J1bm5pbmcgWE1MLVJQQyBzZXJ2ZXIgb24gcG9ydCA4MDAwJworICAgIHNlcnZlciA9IFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApKQorICAgIHNlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCisgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCisgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9TaW1wbGVYTUxSUENTZXJ2ZXIucHljIGIvbGliL3B5dGhvbjIuNy9TaW1wbGVYTUxSUENTZXJ2ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDE1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1NpbXBsZVhNTFJQQ1NlcnZlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9TaW1wbGVYTUxSUENTZXJ2ZXIucHlvIGIvbGliL3B5dGhvbjIuNy9TaW1wbGVYTUxSUENTZXJ2ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDE1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1NpbXBsZVhNTFJQQ1NlcnZlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9Tb2NrZXRTZXJ2ZXIucHkgYi9saWIvcHl0aG9uMi43L1NvY2tldFNlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjYxMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Tb2NrZXRTZXJ2ZXIucHkKQEAgLTAsMCArMSw3MzEgQEAKKyIiIkdlbmVyaWMgc29ja2V0IHNlcnZlciBjbGFzc2VzLgorCitUaGlzIG1vZHVsZSB0cmllcyB0byBjYXB0dXJlIHRoZSB2YXJpb3VzIGFzcGVjdHMgb2YgZGVmaW5pbmcgYSBzZXJ2ZXI6CisKK0ZvciBzb2NrZXQtYmFzZWQgc2VydmVyczoKKworLSBhZGRyZXNzIGZhbWlseToKKyAgICAgICAgLSBBRl9JTkVUeyw2fTogSVAgKEludGVybmV0IFByb3RvY29sKSBzb2NrZXRzIChkZWZhdWx0KQorICAgICAgICAtIEFGX1VOSVg6IFVuaXggZG9tYWluIHNvY2tldHMKKyAgICAgICAgLSBvdGhlcnMsIGUuZy4gQUZfREVDTkVUIGFyZSBjb25jZWl2YWJsZSAoc2VlIDxzb2NrZXQuaD4KKy0gc29ja2V0IHR5cGU6CisgICAgICAgIC0gU09DS19TVFJFQU0gKHJlbGlhYmxlIHN0cmVhbSwgZS5nLiBUQ1ApCisgICAgICAgIC0gU09DS19ER1JBTSAoZGF0YWdyYW1zLCBlLmcuIFVEUCkKKworRm9yIHJlcXVlc3QtYmFzZWQgc2VydmVycyAoaW5jbHVkaW5nIHNvY2tldC1iYXNlZCk6CisKKy0gY2xpZW50IGFkZHJlc3MgdmVyaWZpY2F0aW9uIGJlZm9yZSBmdXJ0aGVyIGxvb2tpbmcgYXQgdGhlIHJlcXVlc3QKKyAgICAgICAgKFRoaXMgaXMgYWN0dWFsbHkgYSBob29rIGZvciBhbnkgcHJvY2Vzc2luZyB0aGF0IG5lZWRzIHRvIGxvb2sKKyAgICAgICAgIGF0IHRoZSByZXF1ZXN0IGJlZm9yZSBhbnl0aGluZyBlbHNlLCBlLmcuIGxvZ2dpbmcpCistIGhvdyB0byBoYW5kbGUgbXVsdGlwbGUgcmVxdWVzdHM6CisgICAgICAgIC0gc3luY2hyb25vdXMgKG9uZSByZXF1ZXN0IGlzIGhhbmRsZWQgYXQgYSB0aW1lKQorICAgICAgICAtIGZvcmtpbmcgKGVhY2ggcmVxdWVzdCBpcyBoYW5kbGVkIGJ5IGEgbmV3IHByb2Nlc3MpCisgICAgICAgIC0gdGhyZWFkaW5nIChlYWNoIHJlcXVlc3QgaXMgaGFuZGxlZCBieSBhIG5ldyB0aHJlYWQpCisKK1RoZSBjbGFzc2VzIGluIHRoaXMgbW9kdWxlIGZhdm9yIHRoZSBzZXJ2ZXIgdHlwZSB0aGF0IGlzIHNpbXBsZXN0IHRvCit3cml0ZTogYSBzeW5jaHJvbm91cyBUQ1AvSVAgc2VydmVyLiAgVGhpcyBpcyBiYWQgY2xhc3MgZGVzaWduLCBidXQKK3NhdmUgc29tZSB0eXBpbmcuICAoVGhlcmUncyBhbHNvIHRoZSBpc3N1ZSB0aGF0IGEgZGVlcCBjbGFzcyBoaWVyYXJjaHkKK3Nsb3dzIGRvd24gbWV0aG9kIGxvb2t1cHMuKQorCitUaGVyZSBhcmUgZml2ZSBjbGFzc2VzIGluIGFuIGluaGVyaXRhbmNlIGRpYWdyYW0sIGZvdXIgb2Ygd2hpY2ggcmVwcmVzZW50CitzeW5jaHJvbm91cyBzZXJ2ZXJzIG9mIGZvdXIgdHlwZXM6CisKKyAgICAgICAgKy0tLS0tLS0tLS0tLSsKKyAgICAgICAgfCBCYXNlU2VydmVyIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICB2CisgICAgICAgICstLS0tLS0tLS0tLSsgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgIHwgVENQU2VydmVyIHwtLS0tLS0tPnwgVW5peFN0cmVhbVNlcnZlciB8CisgICAgICAgICstLS0tLS0tLS0tLSsgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgdgorICAgICAgICArLS0tLS0tLS0tLS0rICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgIHwgVURQU2VydmVyIHwtLS0tLS0tPnwgVW5peERhdGFncmFtU2VydmVyIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tKworCitOb3RlIHRoYXQgVW5peERhdGFncmFtU2VydmVyIGRlcml2ZXMgZnJvbSBVRFBTZXJ2ZXIsIG5vdCBmcm9tCitVbml4U3RyZWFtU2VydmVyIC0tIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBhbiBJUCBhbmQgYSBVbml4CitzdHJlYW0gc2VydmVyIGlzIHRoZSBhZGRyZXNzIGZhbWlseSwgd2hpY2ggaXMgc2ltcGx5IHJlcGVhdGVkIGluIGJvdGgKK3VuaXggc2VydmVyIGNsYXNzZXMuCisKK0ZvcmtpbmcgYW5kIHRocmVhZGluZyB2ZXJzaW9ucyBvZiBlYWNoIHR5cGUgb2Ygc2VydmVyIGNhbiBiZSBjcmVhdGVkCit1c2luZyB0aGUgRm9ya2luZ01peEluIGFuZCBUaHJlYWRpbmdNaXhJbiBtaXgtaW4gY2xhc3Nlcy4gIEZvcgoraW5zdGFuY2UsIGEgdGhyZWFkaW5nIFVEUCBzZXJ2ZXIgY2xhc3MgaXMgY3JlYXRlZCBhcyBmb2xsb3dzOgorCisgICAgICAgIGNsYXNzIFRocmVhZGluZ1VEUFNlcnZlcihUaHJlYWRpbmdNaXhJbiwgVURQU2VydmVyKTogcGFzcworCitUaGUgTWl4LWluIGNsYXNzIG11c3QgY29tZSBmaXJzdCwgc2luY2UgaXQgb3ZlcnJpZGVzIGEgbWV0aG9kIGRlZmluZWQKK2luIFVEUFNlcnZlciEgU2V0dGluZyB0aGUgdmFyaW91cyBtZW1iZXIgdmFyaWFibGVzIGFsc28gY2hhbmdlcwordGhlIGJlaGF2aW9yIG9mIHRoZSB1bmRlcmx5aW5nIHNlcnZlciBtZWNoYW5pc20uCisKK1RvIGltcGxlbWVudCBhIHNlcnZpY2UsIHlvdSBtdXN0IGRlcml2ZSBhIGNsYXNzIGZyb20KK0Jhc2VSZXF1ZXN0SGFuZGxlciBhbmQgcmVkZWZpbmUgaXRzIGhhbmRsZSgpIG1ldGhvZC4gIFlvdSBjYW4gdGhlbiBydW4KK3ZhcmlvdXMgdmVyc2lvbnMgb2YgdGhlIHNlcnZpY2UgYnkgY29tYmluaW5nIG9uZSBvZiB0aGUgc2VydmVyIGNsYXNzZXMKK3dpdGggeW91ciByZXF1ZXN0IGhhbmRsZXIgY2xhc3MuCisKK1RoZSByZXF1ZXN0IGhhbmRsZXIgY2xhc3MgbXVzdCBiZSBkaWZmZXJlbnQgZm9yIGRhdGFncmFtIG9yIHN0cmVhbQorc2VydmljZXMuICBUaGlzIGNhbiBiZSBoaWRkZW4gYnkgdXNpbmcgdGhlIHJlcXVlc3QgaGFuZGxlcgorc3ViY2xhc3NlcyBTdHJlYW1SZXF1ZXN0SGFuZGxlciBvciBEYXRhZ3JhbVJlcXVlc3RIYW5kbGVyLgorCitPZiBjb3Vyc2UsIHlvdSBzdGlsbCBoYXZlIHRvIHVzZSB5b3VyIGhlYWQhCisKK0ZvciBpbnN0YW5jZSwgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gdXNlIGEgZm9ya2luZyBzZXJ2ZXIgaWYgdGhlIHNlcnZpY2UKK2NvbnRhaW5zIHN0YXRlIGluIG1lbW9yeSB0aGF0IGNhbiBiZSBtb2RpZmllZCBieSByZXF1ZXN0cyAoc2luY2UgdGhlCittb2RpZmljYXRpb25zIGluIHRoZSBjaGlsZCBwcm9jZXNzIHdvdWxkIG5ldmVyIHJlYWNoIHRoZSBpbml0aWFsIHN0YXRlCitrZXB0IGluIHRoZSBwYXJlbnQgcHJvY2VzcyBhbmQgcGFzc2VkIHRvIGVhY2ggY2hpbGQpLiAgSW4gdGhpcyBjYXNlLAoreW91IGNhbiB1c2UgYSB0aHJlYWRpbmcgc2VydmVyLCBidXQgeW91IHdpbGwgcHJvYmFibHkgaGF2ZSB0byB1c2UKK2xvY2tzIHRvIGF2b2lkIHR3byByZXF1ZXN0cyB0aGF0IGNvbWUgaW4gbmVhcmx5IHNpbXVsdGFuZW91cyB0byBhcHBseQorY29uZmxpY3RpbmcgY2hhbmdlcyB0byB0aGUgc2VydmVyIHN0YXRlLgorCitPbiB0aGUgb3RoZXIgaGFuZCwgaWYgeW91IGFyZSBidWlsZGluZyBlLmcuIGFuIEhUVFAgc2VydmVyLCB3aGVyZSBhbGwKK2RhdGEgaXMgc3RvcmVkIGV4dGVybmFsbHkgKGUuZy4gaW4gdGhlIGZpbGUgc3lzdGVtKSwgYSBzeW5jaHJvbm91cworY2xhc3Mgd2lsbCBlc3NlbnRpYWxseSByZW5kZXIgdGhlIHNlcnZpY2UgImRlYWYiIHdoaWxlIG9uZSByZXF1ZXN0IGlzCitiZWluZyBoYW5kbGVkIC0tIHdoaWNoIG1heSBiZSBmb3IgYSB2ZXJ5IGxvbmcgdGltZSBpZiBhIGNsaWVudCBpcyBzbG93Cit0byByZWFkIGFsbCB0aGUgZGF0YSBpdCBoYXMgcmVxdWVzdGVkLiAgSGVyZSBhIHRocmVhZGluZyBvciBmb3JraW5nCitzZXJ2ZXIgaXMgYXBwcm9wcmlhdGUuCisKK0luIHNvbWUgY2FzZXMsIGl0IG1heSBiZSBhcHByb3ByaWF0ZSB0byBwcm9jZXNzIHBhcnQgb2YgYSByZXF1ZXN0CitzeW5jaHJvbm91c2x5LCBidXQgdG8gZmluaXNoIHByb2Nlc3NpbmcgaW4gYSBmb3JrZWQgY2hpbGQgZGVwZW5kaW5nIG9uCit0aGUgcmVxdWVzdCBkYXRhLiAgVGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgdXNpbmcgYSBzeW5jaHJvbm91cworc2VydmVyIGFuZCBkb2luZyBhbiBleHBsaWNpdCBmb3JrIGluIHRoZSByZXF1ZXN0IGhhbmRsZXIgY2xhc3MKK2hhbmRsZSgpIG1ldGhvZC4KKworQW5vdGhlciBhcHByb2FjaCB0byBoYW5kbGluZyBtdWx0aXBsZSBzaW11bHRhbmVvdXMgcmVxdWVzdHMgaW4gYW4KK2Vudmlyb25tZW50IHRoYXQgc3VwcG9ydHMgbmVpdGhlciB0aHJlYWRzIG5vciBmb3JrIChvciB3aGVyZSB0aGVzZSBhcmUKK3RvbyBleHBlbnNpdmUgb3IgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIHNlcnZpY2UpIGlzIHRvIG1haW50YWluIGFuCitleHBsaWNpdCB0YWJsZSBvZiBwYXJ0aWFsbHkgZmluaXNoZWQgcmVxdWVzdHMgYW5kIHRvIHVzZSBzZWxlY3QoKSB0bworZGVjaWRlIHdoaWNoIHJlcXVlc3QgdG8gd29yayBvbiBuZXh0IChvciB3aGV0aGVyIHRvIGhhbmRsZSBhIG5ldworaW5jb21pbmcgcmVxdWVzdCkuICBUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgZm9yIHN0cmVhbSBzZXJ2aWNlcword2hlcmUgZWFjaCBjbGllbnQgY2FuIHBvdGVudGlhbGx5IGJlIGNvbm5lY3RlZCBmb3IgYSBsb25nIHRpbWUgKGlmCit0aHJlYWRzIG9yIHN1YnByb2Nlc3NlcyBjYW5ub3QgYmUgdXNlZCkuCisKK0Z1dHVyZSB3b3JrOgorLSBTdGFuZGFyZCBjbGFzc2VzIGZvciBTdW4gUlBDICh3aGljaCB1c2VzIGVpdGhlciBVRFAgb3IgVENQKQorLSBTdGFuZGFyZCBtaXgtaW4gY2xhc3NlcyB0byBpbXBsZW1lbnQgdmFyaW91cyBhdXRoZW50aWNhdGlvbgorICBhbmQgZW5jcnlwdGlvbiBzY2hlbWVzCistIFN0YW5kYXJkIGZyYW1ld29yayBmb3Igc2VsZWN0LWJhc2VkIG11bHRpcGxleGluZworCitYWFggT3BlbiBwcm9ibGVtczoKKy0gV2hhdCB0byBkbyB3aXRoIG91dC1vZi1iYW5kIGRhdGE/CisKK0Jhc2VTZXJ2ZXI6CistIHNwbGl0IGdlbmVyaWMgInJlcXVlc3QiIGZ1bmN0aW9uYWxpdHkgb3V0IGludG8gQmFzZVNlcnZlciBjbGFzcy4KKyAgQ29weXJpZ2h0IChDKSAyMDAwICBMdWtlIEtlbm5ldGggQ2Fzc29uIExlaWdodG9uIDxsa2NsQHNhbWJhLm9yZz4KKworICBleGFtcGxlOiByZWFkIGVudHJpZXMgZnJvbSBhIFNRTCBkYXRhYmFzZSAocmVxdWlyZXMgb3ZlcnJpZGluZworICBnZXRfcmVxdWVzdCgpIHRvIHJldHVybiBhIHRhYmxlIGVudHJ5IGZyb20gdGhlIGRhdGFiYXNlKS4KKyAgZW50cnkgaXMgcHJvY2Vzc2VkIGJ5IGEgUmVxdWVzdEhhbmRsZXJDbGFzcy4KKworIiIiCisKKyMgQXV0aG9yIG9mIHRoZSBCYXNlU2VydmVyIHBhdGNoOiBMdWtlIEtlbm5ldGggQ2Fzc29uIExlaWdodG9uCisKKyMgWFhYIFdhcm5pbmchCisjIFRoZXJlIGlzIGEgdGVzdCBzdWl0ZSBmb3IgdGhpcyBtb2R1bGUsIGJ1dCBpdCBjYW5ub3QgYmUgcnVuIGJ5IHRoZQorIyBzdGFuZGFyZCByZWdyZXNzaW9uIHRlc3QuCisjIFRvIHJ1biBpdCBtYW51YWxseSwgcnVuIExpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5LgorCitfX3ZlcnNpb25fXyA9ICIwLjQiCisKKworaW1wb3J0IHNvY2tldAoraW1wb3J0IHNlbGVjdAoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgZXJybm8KK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IGR1bW15X3RocmVhZGluZyBhcyB0aHJlYWRpbmcKKworX19hbGxfXyA9IFsiVENQU2VydmVyIiwiVURQU2VydmVyIiwiRm9ya2luZ1VEUFNlcnZlciIsIkZvcmtpbmdUQ1BTZXJ2ZXIiLAorICAgICAgICAgICAiVGhyZWFkaW5nVURQU2VydmVyIiwiVGhyZWFkaW5nVENQU2VydmVyIiwiQmFzZVJlcXVlc3RIYW5kbGVyIiwKKyAgICAgICAgICAgIlN0cmVhbVJlcXVlc3RIYW5kbGVyIiwiRGF0YWdyYW1SZXF1ZXN0SGFuZGxlciIsCisgICAgICAgICAgICJUaHJlYWRpbmdNaXhJbiIsICJGb3JraW5nTWl4SW4iXQoraWYgaGFzYXR0cihzb2NrZXQsICJBRl9VTklYIik6CisgICAgX19hbGxfXy5leHRlbmQoWyJVbml4U3RyZWFtU2VydmVyIiwiVW5peERhdGFncmFtU2VydmVyIiwKKyAgICAgICAgICAgICAgICAgICAgIlRocmVhZGluZ1VuaXhTdHJlYW1TZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAiVGhyZWFkaW5nVW5peERhdGFncmFtU2VydmVyIl0pCisKK2RlZiBfZWludHJfcmV0cnkoZnVuYywgKmFyZ3MpOgorICAgICIiInJlc3RhcnQgYSBzeXN0ZW0gY2FsbCBpbnRlcnJ1cHRlZCBieSBFSU5UUiIiIgorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzKQorICAgICAgICBleGNlcHQgKE9TRXJyb3IsIHNlbGVjdC5lcnJvcikgYXMgZToKKyAgICAgICAgICAgIGlmIGUuYXJnc1swXSAhPSBlcnJuby5FSU5UUjoKKyAgICAgICAgICAgICAgICByYWlzZQorCitjbGFzcyBCYXNlU2VydmVyOgorCisgICAgIiIiQmFzZSBjbGFzcyBmb3Igc2VydmVyIGNsYXNzZXMuCisKKyAgICBNZXRob2RzIGZvciB0aGUgY2FsbGVyOgorCisgICAgLSBfX2luaXRfXyhzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRsZXJDbGFzcykKKyAgICAtIHNlcnZlX2ZvcmV2ZXIocG9sbF9pbnRlcnZhbD0wLjUpCisgICAgLSBzaHV0ZG93bigpCisgICAgLSBoYW5kbGVfcmVxdWVzdCgpICAjIGlmIHlvdSBkbyBub3QgdXNlIHNlcnZlX2ZvcmV2ZXIoKQorICAgIC0gZmlsZW5vKCkgLT4gaW50ICAgIyBmb3Igc2VsZWN0KCkKKworICAgIE1ldGhvZHMgdGhhdCBtYXkgYmUgb3ZlcnJpZGRlbjoKKworICAgIC0gc2VydmVyX2JpbmQoKQorICAgIC0gc2VydmVyX2FjdGl2YXRlKCkKKyAgICAtIGdldF9yZXF1ZXN0KCkgLT4gcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MKKyAgICAtIGhhbmRsZV90aW1lb3V0KCkKKyAgICAtIHZlcmlmeV9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgIC0gc2VydmVyX2Nsb3NlKCkKKyAgICAtIHByb2Nlc3NfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKKyAgICAtIHNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKKyAgICAtIGNsb3NlX3JlcXVlc3QocmVxdWVzdCkKKyAgICAtIGhhbmRsZV9lcnJvcigpCisKKyAgICBNZXRob2RzIGZvciBkZXJpdmVkIGNsYXNzZXM6CisKKyAgICAtIGZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorCisgICAgQ2xhc3MgdmFyaWFibGVzIHRoYXQgbWF5IGJlIG92ZXJyaWRkZW4gYnkgZGVyaXZlZCBjbGFzc2VzIG9yCisgICAgaW5zdGFuY2VzOgorCisgICAgLSB0aW1lb3V0CisgICAgLSBhZGRyZXNzX2ZhbWlseQorICAgIC0gc29ja2V0X3R5cGUKKyAgICAtIGFsbG93X3JldXNlX2FkZHJlc3MKKworICAgIEluc3RhbmNlIHZhcmlhYmxlczoKKworICAgIC0gUmVxdWVzdEhhbmRsZXJDbGFzcworICAgIC0gc29ja2V0CisKKyAgICAiIiIKKworICAgIHRpbWVvdXQgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kbGVyQ2xhc3MpOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4gIE1heSBiZSBleHRlbmRlZCwgZG8gbm90IG92ZXJyaWRlLiIiIgorICAgICAgICBzZWxmLnNlcnZlcl9hZGRyZXNzID0gc2VydmVyX2FkZHJlc3MKKyAgICAgICAgc2VsZi5SZXF1ZXN0SGFuZGxlckNsYXNzID0gUmVxdWVzdEhhbmRsZXJDbGFzcworICAgICAgICBzZWxmLl9faXNfc2h1dF9kb3duID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5fX3NodXRkb3duX3JlcXVlc3QgPSBGYWxzZQorCisgICAgZGVmIHNlcnZlcl9hY3RpdmF0ZShzZWxmKToKKyAgICAgICAgIiIiQ2FsbGVkIGJ5IGNvbnN0cnVjdG9yIHRvIGFjdGl2YXRlIHRoZSBzZXJ2ZXIuCisKKyAgICAgICAgTWF5IGJlIG92ZXJyaWRkZW4uCisKKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBzZXJ2ZV9mb3JldmVyKHNlbGYsIHBvbGxfaW50ZXJ2YWw9MC41KToKKyAgICAgICAgIiIiSGFuZGxlIG9uZSByZXF1ZXN0IGF0IGEgdGltZSB1bnRpbCBzaHV0ZG93bi4KKworICAgICAgICBQb2xscyBmb3Igc2h1dGRvd24gZXZlcnkgcG9sbF9pbnRlcnZhbCBzZWNvbmRzLiBJZ25vcmVzCisgICAgICAgIHNlbGYudGltZW91dC4gSWYgeW91IG5lZWQgdG8gZG8gcGVyaW9kaWMgdGFza3MsIGRvIHRoZW0gaW4KKyAgICAgICAgYW5vdGhlciB0aHJlYWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9faXNfc2h1dF9kb3duLmNsZWFyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYuX19zaHV0ZG93bl9yZXF1ZXN0OgorICAgICAgICAgICAgICAgICMgWFhYOiBDb25zaWRlciB1c2luZyBhbm90aGVyIGZpbGUgZGVzY3JpcHRvciBvcgorICAgICAgICAgICAgICAgICMgY29ubmVjdGluZyB0byB0aGUgc29ja2V0IHRvIHdha2UgdGhpcyB1cCBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgIyBwb2xsaW5nLiBQb2xsaW5nIHJlZHVjZXMgb3VyIHJlc3BvbnNpdmVuZXNzIHRvIGEKKyAgICAgICAgICAgICAgICAjIHNodXRkb3duIHJlcXVlc3QgYW5kIHdhc3RlcyBjcHUgYXQgYWxsIG90aGVyIHRpbWVzLgorICAgICAgICAgICAgICAgIHIsIHcsIGUgPSBfZWludHJfcmV0cnkoc2VsZWN0LnNlbGVjdCwgW3NlbGZdLCBbXSwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xsX2ludGVydmFsKQorICAgICAgICAgICAgICAgIGlmIHNlbGYgaW4gcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX3JlcXVlc3Rfbm9ibG9jaygpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9fc2h1dGRvd25fcmVxdWVzdCA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLl9faXNfc2h1dF9kb3duLnNldCgpCisKKyAgICBkZWYgc2h1dGRvd24oc2VsZik6CisgICAgICAgICIiIlN0b3BzIHRoZSBzZXJ2ZV9mb3JldmVyIGxvb3AuCisKKyAgICAgICAgQmxvY2tzIHVudGlsIHRoZSBsb29wIGhhcyBmaW5pc2hlZC4gVGhpcyBtdXN0IGJlIGNhbGxlZCB3aGlsZQorICAgICAgICBzZXJ2ZV9mb3JldmVyKCkgaXMgcnVubmluZyBpbiBhbm90aGVyIHRocmVhZCwgb3IgaXQgd2lsbAorICAgICAgICBkZWFkbG9jay4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX19zaHV0ZG93bl9yZXF1ZXN0ID0gVHJ1ZQorICAgICAgICBzZWxmLl9faXNfc2h1dF9kb3duLndhaXQoKQorCisgICAgIyBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBoYW5kbGluZywgZ2V0dGluZywgcHJvY2Vzc2luZyBhbmQKKyAgICAjIGZpbmlzaGluZyBhIHJlcXVlc3QgaXMgZmFpcmx5IGFyYml0cmFyeS4gIFJlbWVtYmVyOgorICAgICMKKyAgICAjIC0gaGFuZGxlX3JlcXVlc3QoKSBpcyB0aGUgdG9wLWxldmVsIGNhbGwuICBJdCBjYWxscworICAgICMgICBzZWxlY3QsIGdldF9yZXF1ZXN0KCksIHZlcmlmeV9yZXF1ZXN0KCkgYW5kIHByb2Nlc3NfcmVxdWVzdCgpCisgICAgIyAtIGdldF9yZXF1ZXN0KCkgaXMgZGlmZmVyZW50IGZvciBzdHJlYW0gb3IgZGF0YWdyYW0gc29ja2V0cworICAgICMgLSBwcm9jZXNzX3JlcXVlc3QoKSBpcyB0aGUgcGxhY2UgdGhhdCBtYXkgZm9yayBhIG5ldyBwcm9jZXNzCisgICAgIyAgIG9yIGNyZWF0ZSBhIG5ldyB0aHJlYWQgdG8gZmluaXNoIHRoZSByZXF1ZXN0CisgICAgIyAtIGZpbmlzaF9yZXF1ZXN0KCkgaW5zdGFudGlhdGVzIHRoZSByZXF1ZXN0IGhhbmRsZXIgY2xhc3M7CisgICAgIyAgIHRoaXMgY29uc3RydWN0b3Igd2lsbCBoYW5kbGUgdGhlIHJlcXVlc3QgYWxsIGJ5IGl0c2VsZgorCisgICAgZGVmIGhhbmRsZV9yZXF1ZXN0KHNlbGYpOgorICAgICAgICAiIiJIYW5kbGUgb25lIHJlcXVlc3QsIHBvc3NpYmx5IGJsb2NraW5nLgorCisgICAgICAgIFJlc3BlY3RzIHNlbGYudGltZW91dC4KKyAgICAgICAgIiIiCisgICAgICAgICMgU3VwcG9ydCBwZW9wbGUgd2hvIHVzZWQgc29ja2V0LnNldHRpbWVvdXQoKSB0byBlc2NhcGUKKyAgICAgICAgIyBoYW5kbGVfcmVxdWVzdCBiZWZvcmUgc2VsZi50aW1lb3V0IHdhcyBhdmFpbGFibGUuCisgICAgICAgIHRpbWVvdXQgPSBzZWxmLnNvY2tldC5nZXR0aW1lb3V0KCkKKyAgICAgICAgaWYgdGltZW91dCBpcyBOb25lOgorICAgICAgICAgICAgdGltZW91dCA9IHNlbGYudGltZW91dAorICAgICAgICBlbGlmIHNlbGYudGltZW91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRpbWVvdXQgPSBtaW4odGltZW91dCwgc2VsZi50aW1lb3V0KQorICAgICAgICBmZF9zZXRzID0gX2VpbnRyX3JldHJ5KHNlbGVjdC5zZWxlY3QsIFtzZWxmXSwgW10sIFtdLCB0aW1lb3V0KQorICAgICAgICBpZiBub3QgZmRfc2V0c1swXToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX3RpbWVvdXQoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2hhbmRsZV9yZXF1ZXN0X25vYmxvY2soKQorCisgICAgZGVmIF9oYW5kbGVfcmVxdWVzdF9ub2Jsb2NrKHNlbGYpOgorICAgICAgICAiIiJIYW5kbGUgb25lIHJlcXVlc3QsIHdpdGhvdXQgYmxvY2tpbmcuCisKKyAgICAgICAgSSBhc3N1bWUgdGhhdCBzZWxlY3Quc2VsZWN0IGhhcyByZXR1cm5lZCB0aGF0IHRoZSBzb2NrZXQgaXMKKyAgICAgICAgcmVhZGFibGUgYmVmb3JlIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZCwgc28gdGhlcmUgc2hvdWxkIGJlCisgICAgICAgIG5vIHJpc2sgb2YgYmxvY2tpbmcgaW4gZ2V0X3JlcXVlc3QoKS4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzID0gc2VsZi5nZXRfcmVxdWVzdCgpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi52ZXJpZnlfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZXJyb3IocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisgICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCisKKyAgICBkZWYgaGFuZGxlX3RpbWVvdXQoc2VsZik6CisgICAgICAgICIiIkNhbGxlZCBpZiBubyBuZXcgcmVxdWVzdCBhcnJpdmVzIHdpdGhpbiBzZWxmLnRpbWVvdXQuCisKKyAgICAgICAgT3ZlcnJpZGRlbiBieSBGb3JraW5nTWl4SW4uCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdmVyaWZ5X3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgorICAgICAgICAiIiJWZXJpZnkgdGhlIHJlcXVlc3QuICBNYXkgYmUgb3ZlcnJpZGRlbi4KKworICAgICAgICBSZXR1cm4gVHJ1ZSBpZiB3ZSBzaG91bGQgcHJvY2VlZCB3aXRoIHRoaXMgcmVxdWVzdC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBwcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgorICAgICAgICAiIiJDYWxsIGZpbmlzaF9yZXF1ZXN0LgorCisgICAgICAgIE92ZXJyaWRkZW4gYnkgRm9ya2luZ01peEluIGFuZCBUaHJlYWRpbmdNaXhJbi4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5maW5pc2hfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKKyAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCisKKyAgICBkZWYgc2VydmVyX2Nsb3NlKHNlbGYpOgorICAgICAgICAiIiJDYWxsZWQgdG8gY2xlYW4tdXAgdGhlIHNlcnZlci4KKworICAgICAgICBNYXkgYmUgb3ZlcnJpZGRlbi4KKworICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIGZpbmlzaF9yZXF1ZXN0KHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgIiIiRmluaXNoIG9uZSByZXF1ZXN0IGJ5IGluc3RhbnRpYXRpbmcgUmVxdWVzdEhhbmRsZXJDbGFzcy4iIiIKKyAgICAgICAgc2VsZi5SZXF1ZXN0SGFuZGxlckNsYXNzKHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzLCBzZWxmKQorCisgICAgZGVmIHNodXRkb3duX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CisgICAgICAgICIiIkNhbGxlZCB0byBzaHV0ZG93biBhbmQgY2xvc2UgYW4gaW5kaXZpZHVhbCByZXF1ZXN0LiIiIgorICAgICAgICBzZWxmLmNsb3NlX3JlcXVlc3QocmVxdWVzdCkKKworICAgIGRlZiBjbG9zZV9yZXF1ZXN0KHNlbGYsIHJlcXVlc3QpOgorICAgICAgICAiIiJDYWxsZWQgdG8gY2xlYW4gdXAgYW4gaW5kaXZpZHVhbCByZXF1ZXN0LiIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgIiIiSGFuZGxlIGFuIGVycm9yIGdyYWNlZnVsbHkuICBNYXkgYmUgb3ZlcnJpZGRlbi4KKworICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byBwcmludCBhIHRyYWNlYmFjayBhbmQgY29udGludWUuCisKKyAgICAgICAgIiIiCisgICAgICAgIHByaW50ICctJyo0MAorICAgICAgICBwcmludCAnRXhjZXB0aW9uIGhhcHBlbmVkIGR1cmluZyBwcm9jZXNzaW5nIG9mIHJlcXVlc3QgZnJvbScsCisgICAgICAgIHByaW50IGNsaWVudF9hZGRyZXNzCisgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpICMgWFhYIEJ1dCB0aGlzIGdvZXMgdG8gc3RkZXJyIQorICAgICAgICBwcmludCAnLScqNDAKKworCitjbGFzcyBUQ1BTZXJ2ZXIoQmFzZVNlcnZlcik6CisKKyAgICAiIiJCYXNlIGNsYXNzIGZvciB2YXJpb3VzIHNvY2tldC1iYXNlZCBzZXJ2ZXIgY2xhc3Nlcy4KKworICAgIERlZmF1bHRzIHRvIHN5bmNocm9ub3VzIElQIHN0cmVhbSAoaS5lLiwgVENQKS4KKworICAgIE1ldGhvZHMgZm9yIHRoZSBjYWxsZXI6CisKKyAgICAtIF9faW5pdF9fKHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzLCBiaW5kX2FuZF9hY3RpdmF0ZT1UcnVlKQorICAgIC0gc2VydmVfZm9yZXZlcihwb2xsX2ludGVydmFsPTAuNSkKKyAgICAtIHNodXRkb3duKCkKKyAgICAtIGhhbmRsZV9yZXF1ZXN0KCkgICMgaWYgeW91IGRvbid0IHVzZSBzZXJ2ZV9mb3JldmVyKCkKKyAgICAtIGZpbGVubygpIC0+IGludCAgICMgZm9yIHNlbGVjdCgpCisKKyAgICBNZXRob2RzIHRoYXQgbWF5IGJlIG92ZXJyaWRkZW46CisKKyAgICAtIHNlcnZlcl9iaW5kKCkKKyAgICAtIHNlcnZlcl9hY3RpdmF0ZSgpCisgICAgLSBnZXRfcmVxdWVzdCgpIC0+IHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzCisgICAgLSBoYW5kbGVfdGltZW91dCgpCisgICAgLSB2ZXJpZnlfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKKyAgICAtIHByb2Nlc3NfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKKyAgICAtIHNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKKyAgICAtIGNsb3NlX3JlcXVlc3QocmVxdWVzdCkKKyAgICAtIGhhbmRsZV9lcnJvcigpCisKKyAgICBNZXRob2RzIGZvciBkZXJpdmVkIGNsYXNzZXM6CisKKyAgICAtIGZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorCisgICAgQ2xhc3MgdmFyaWFibGVzIHRoYXQgbWF5IGJlIG92ZXJyaWRkZW4gYnkgZGVyaXZlZCBjbGFzc2VzIG9yCisgICAgaW5zdGFuY2VzOgorCisgICAgLSB0aW1lb3V0CisgICAgLSBhZGRyZXNzX2ZhbWlseQorICAgIC0gc29ja2V0X3R5cGUKKyAgICAtIHJlcXVlc3RfcXVldWVfc2l6ZSAob25seSBmb3Igc3RyZWFtIHNvY2tldHMpCisgICAgLSBhbGxvd19yZXVzZV9hZGRyZXNzCisKKyAgICBJbnN0YW5jZSB2YXJpYWJsZXM6CisKKyAgICAtIHNlcnZlcl9hZGRyZXNzCisgICAgLSBSZXF1ZXN0SGFuZGxlckNsYXNzCisgICAgLSBzb2NrZXQKKworICAgICIiIgorCisgICAgYWRkcmVzc19mYW1pbHkgPSBzb2NrZXQuQUZfSU5FVAorCisgICAgc29ja2V0X3R5cGUgPSBzb2NrZXQuU09DS19TVFJFQU0KKworICAgIHJlcXVlc3RfcXVldWVfc2l6ZSA9IDUKKworICAgIGFsbG93X3JldXNlX2FkZHJlc3MgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzLCBiaW5kX2FuZF9hY3RpdmF0ZT1UcnVlKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuICBNYXkgYmUgZXh0ZW5kZWQsIGRvIG5vdCBvdmVycmlkZS4iIiIKKyAgICAgICAgQmFzZVNlcnZlci5fX2luaXRfXyhzZWxmLCBzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRsZXJDbGFzcykKKyAgICAgICAgc2VsZi5zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNlbGYuYWRkcmVzc19mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNvY2tldF90eXBlKQorICAgICAgICBpZiBiaW5kX2FuZF9hY3RpdmF0ZToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyX2JpbmQoKQorICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfYWN0aXZhdGUoKQorCisgICAgZGVmIHNlcnZlcl9iaW5kKHNlbGYpOgorICAgICAgICAiIiJDYWxsZWQgYnkgY29uc3RydWN0b3IgdG8gYmluZCB0aGUgc29ja2V0LgorCisgICAgICAgIE1heSBiZSBvdmVycmlkZGVuLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmFsbG93X3JldXNlX2FkZHJlc3M6CisgICAgICAgICAgICBzZWxmLnNvY2tldC5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQorICAgICAgICBzZWxmLnNvY2tldC5iaW5kKHNlbGYuc2VydmVyX2FkZHJlc3MpCisgICAgICAgIHNlbGYuc2VydmVyX2FkZHJlc3MgPSBzZWxmLnNvY2tldC5nZXRzb2NrbmFtZSgpCisKKyAgICBkZWYgc2VydmVyX2FjdGl2YXRlKHNlbGYpOgorICAgICAgICAiIiJDYWxsZWQgYnkgY29uc3RydWN0b3IgdG8gYWN0aXZhdGUgdGhlIHNlcnZlci4KKworICAgICAgICBNYXkgYmUgb3ZlcnJpZGRlbi4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zb2NrZXQubGlzdGVuKHNlbGYucmVxdWVzdF9xdWV1ZV9zaXplKQorCisgICAgZGVmIHNlcnZlcl9jbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2FsbGVkIHRvIGNsZWFuLXVwIHRoZSBzZXJ2ZXIuCisKKyAgICAgICAgTWF5IGJlIG92ZXJyaWRkZW4uCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKKworICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgICIiIlJldHVybiBzb2NrZXQgZmlsZSBudW1iZXIuCisKKyAgICAgICAgSW50ZXJmYWNlIHJlcXVpcmVkIGJ5IHNlbGVjdCgpLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zb2NrZXQuZmlsZW5vKCkKKworICAgIGRlZiBnZXRfcmVxdWVzdChzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSByZXF1ZXN0IGFuZCBjbGllbnQgYWRkcmVzcyBmcm9tIHRoZSBzb2NrZXQuCisKKyAgICAgICAgTWF5IGJlIG92ZXJyaWRkZW4uCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5hY2NlcHQoKQorCisgICAgZGVmIHNodXRkb3duX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CisgICAgICAgICIiIkNhbGxlZCB0byBzaHV0ZG93biBhbmQgY2xvc2UgYW4gaW5kaXZpZHVhbCByZXF1ZXN0LiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjZXhwbGljaXRseSBzaHV0ZG93bi4gIHNvY2tldC5jbG9zZSgpIG1lcmVseSByZWxlYXNlcworICAgICAgICAgICAgI3RoZSBzb2NrZXQgYW5kIHdhaXRzIGZvciBHQyB0byBwZXJmb3JtIHRoZSBhY3R1YWwgY2xvc2UuCisgICAgICAgICAgICByZXF1ZXN0LnNodXRkb3duKHNvY2tldC5TSFVUX1dSKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgcGFzcyAjc29tZSBwbGF0Zm9ybXMgbWF5IHJhaXNlIEVOT1RDT05OIGhlcmUKKyAgICAgICAgc2VsZi5jbG9zZV9yZXF1ZXN0KHJlcXVlc3QpCisKKyAgICBkZWYgY2xvc2VfcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgIiIiQ2FsbGVkIHRvIGNsZWFuIHVwIGFuIGluZGl2aWR1YWwgcmVxdWVzdC4iIiIKKyAgICAgICAgcmVxdWVzdC5jbG9zZSgpCisKKworY2xhc3MgVURQU2VydmVyKFRDUFNlcnZlcik6CisKKyAgICAiIiJVRFAgc2VydmVyIGNsYXNzLiIiIgorCisgICAgYWxsb3dfcmV1c2VfYWRkcmVzcyA9IEZhbHNlCisKKyAgICBzb2NrZXRfdHlwZSA9IHNvY2tldC5TT0NLX0RHUkFNCisKKyAgICBtYXhfcGFja2V0X3NpemUgPSA4MTkyCisKKyAgICBkZWYgZ2V0X3JlcXVlc3Qoc2VsZik6CisgICAgICAgIGRhdGEsIGNsaWVudF9hZGRyID0gc2VsZi5zb2NrZXQucmVjdmZyb20oc2VsZi5tYXhfcGFja2V0X3NpemUpCisgICAgICAgIHJldHVybiAoZGF0YSwgc2VsZi5zb2NrZXQpLCBjbGllbnRfYWRkcgorCisgICAgZGVmIHNlcnZlcl9hY3RpdmF0ZShzZWxmKToKKyAgICAgICAgIyBObyBuZWVkIHRvIGNhbGwgbGlzdGVuKCkgZm9yIFVEUC4KKyAgICAgICAgcGFzcworCisgICAgZGVmIHNodXRkb3duX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CisgICAgICAgICMgTm8gbmVlZCB0byBzaHV0ZG93biBhbnl0aGluZy4KKyAgICAgICAgc2VsZi5jbG9zZV9yZXF1ZXN0KHJlcXVlc3QpCisKKyAgICBkZWYgY2xvc2VfcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgIyBObyBuZWVkIHRvIGNsb3NlIGFueXRoaW5nLgorICAgICAgICBwYXNzCisKK2NsYXNzIEZvcmtpbmdNaXhJbjoKKworICAgICIiIk1peC1pbiBjbGFzcyB0byBoYW5kbGUgZWFjaCByZXF1ZXN0IGluIGEgbmV3IHByb2Nlc3MuIiIiCisKKyAgICB0aW1lb3V0ID0gMzAwCisgICAgYWN0aXZlX2NoaWxkcmVuID0gTm9uZQorICAgIG1heF9jaGlsZHJlbiA9IDQwCisKKyAgICBkZWYgY29sbGVjdF9jaGlsZHJlbihzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgcm91dGluZSB0byB3YWl0IGZvciBjaGlsZHJlbiB0aGF0IGhhdmUgZXhpdGVkLiIiIgorICAgICAgICBpZiBzZWxmLmFjdGl2ZV9jaGlsZHJlbiBpcyBOb25lOiByZXR1cm4KKyAgICAgICAgd2hpbGUgbGVuKHNlbGYuYWN0aXZlX2NoaWxkcmVuKSA+PSBzZWxmLm1heF9jaGlsZHJlbjoKKyAgICAgICAgICAgICMgWFhYOiBUaGlzIHdpbGwgd2FpdCBmb3IgYW55IGNoaWxkIHByb2Nlc3MsIG5vdCBqdXN0IG9uZXMKKyAgICAgICAgICAgICMgc3Bhd25lZCBieSB0aGlzIGxpYnJhcnkuIFRoaXMgY291bGQgY29uZnVzZSBvdGhlcgorICAgICAgICAgICAgIyBsaWJyYXJpZXMgdGhhdCBleHBlY3QgdG8gYmUgYWJsZSB0byB3YWl0IGZvciB0aGVpciBvd24KKyAgICAgICAgICAgICMgY2hpbGRyZW4uCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKDAsIDApCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGlkID0gTm9uZQorICAgICAgICAgICAgaWYgcGlkIG5vdCBpbiBzZWxmLmFjdGl2ZV9jaGlsZHJlbjogY29udGludWUKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLnJlbW92ZShwaWQpCisKKyAgICAgICAgIyBYWFg6IFRoaXMgbG9vcCBydW5zIG1vcmUgc3lzdGVtIGNhbGxzIHRoYW4gaXQgb3VnaHQKKyAgICAgICAgIyB0by4gVGhlcmUgc2hvdWxkIGJlIGEgd2F5IHRvIHB1dCB0aGUgYWN0aXZlX2NoaWxkcmVuIGludG8gYQorICAgICAgICAjIHByb2Nlc3MgZ3JvdXAgYW5kIHRoZW4gdXNlIG9zLndhaXRwaWQoLXBnaWQpIHRvIHdhaXQgZm9yIGFueQorICAgICAgICAjIG9mIHRoYXQgc2V0LCBidXQgSSBjb3VsZG4ndCBmaW5kIGEgd2F5IHRvIGFsbG9jYXRlIHBnaWRzCisgICAgICAgICMgdGhhdCBjb3VsZG4ndCBjb2xsaWRlLgorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5hY3RpdmVfY2hpbGRyZW46CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKGNoaWxkLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBpZCA9IE5vbmUKKyAgICAgICAgICAgIGlmIG5vdCBwaWQ6IGNvbnRpbnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4ucmVtb3ZlKHBpZCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVzLiB4PSVkIGFuZCBsaXN0PSVyJyAlIChlLm1lc3NhZ2UsIHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4pKQorCisgICAgZGVmIGhhbmRsZV90aW1lb3V0KHNlbGYpOgorICAgICAgICAiIiJXYWl0IGZvciB6b21iaWVzIGFmdGVyIHNlbGYudGltZW91dCBzZWNvbmRzIG9mIGluYWN0aXZpdHkuCisKKyAgICAgICAgTWF5IGJlIGV4dGVuZGVkLCBkbyBub3Qgb3ZlcnJpZGUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQorCisgICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CisgICAgICAgICIiIkZvcmsgYSBuZXcgc3VicHJvY2VzcyB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LiIiIgorICAgICAgICBzZWxmLmNvbGxlY3RfY2hpbGRyZW4oKQorICAgICAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICAgICAgaWYgcGlkOgorICAgICAgICAgICAgIyBQYXJlbnQgcHJvY2VzcworICAgICAgICAgICAgaWYgc2VsZi5hY3RpdmVfY2hpbGRyZW4gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbiA9IFtdCisgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5hcHBlbmQocGlkKQorICAgICAgICAgICAgc2VsZi5jbG9zZV9yZXF1ZXN0KHJlcXVlc3QpICNjbG9zZSBoYW5kbGUgaW4gcGFyZW50IHByb2Nlc3MKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBDaGlsZCBwcm9jZXNzLgorICAgICAgICAgICAgIyBUaGlzIG11c3QgbmV2ZXIgcmV0dXJuLCBoZW5jZSBvcy5fZXhpdCgpIQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisgICAgICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICAgICAgICAgb3MuX2V4aXQoMCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yKHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBvcy5fZXhpdCgxKQorCisKK2NsYXNzIFRocmVhZGluZ01peEluOgorICAgICIiIk1peC1pbiBjbGFzcyB0byBoYW5kbGUgZWFjaCByZXF1ZXN0IGluIGEgbmV3IHRocmVhZC4iIiIKKworICAgICMgRGVjaWRlcyBob3cgdGhyZWFkcyB3aWxsIGFjdCB1cG9uIHRlcm1pbmF0aW9uIG9mIHRoZQorICAgICMgbWFpbiBwcm9jZXNzCisgICAgZGFlbW9uX3RocmVhZHMgPSBGYWxzZQorCisgICAgZGVmIHByb2Nlc3NfcmVxdWVzdF90aHJlYWQoc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgorICAgICAgICAiIiJTYW1lIGFzIGluIEJhc2VTZXJ2ZXIgYnV0IGFzIGEgdGhyZWFkLgorCisgICAgICAgIEluIGFkZGl0aW9uLCBleGNlcHRpb24gaGFuZGxpbmcgaXMgZG9uZSBoZXJlLgorCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yKHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgICAgICAgICAgc2VsZi5zaHV0ZG93bl9yZXF1ZXN0KHJlcXVlc3QpCisKKyAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgIiIiU3RhcnQgYSBuZXcgdGhyZWFkIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QuIiIiCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldCA9IHNlbGYucHJvY2Vzc19yZXF1ZXN0X3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykpCisgICAgICAgIHQuZGFlbW9uID0gc2VsZi5kYWVtb25fdGhyZWFkcworICAgICAgICB0LnN0YXJ0KCkKKworCitjbGFzcyBGb3JraW5nVURQU2VydmVyKEZvcmtpbmdNaXhJbiwgVURQU2VydmVyKTogcGFzcworY2xhc3MgRm9ya2luZ1RDUFNlcnZlcihGb3JraW5nTWl4SW4sIFRDUFNlcnZlcik6IHBhc3MKKworY2xhc3MgVGhyZWFkaW5nVURQU2VydmVyKFRocmVhZGluZ01peEluLCBVRFBTZXJ2ZXIpOiBwYXNzCitjbGFzcyBUaHJlYWRpbmdUQ1BTZXJ2ZXIoVGhyZWFkaW5nTWl4SW4sIFRDUFNlcnZlcik6IHBhc3MKKworaWYgaGFzYXR0cihzb2NrZXQsICdBRl9VTklYJyk6CisKKyAgICBjbGFzcyBVbml4U3RyZWFtU2VydmVyKFRDUFNlcnZlcik6CisgICAgICAgIGFkZHJlc3NfZmFtaWx5ID0gc29ja2V0LkFGX1VOSVgKKworICAgIGNsYXNzIFVuaXhEYXRhZ3JhbVNlcnZlcihVRFBTZXJ2ZXIpOgorICAgICAgICBhZGRyZXNzX2ZhbWlseSA9IHNvY2tldC5BRl9VTklYCisKKyAgICBjbGFzcyBUaHJlYWRpbmdVbml4U3RyZWFtU2VydmVyKFRocmVhZGluZ01peEluLCBVbml4U3RyZWFtU2VydmVyKTogcGFzcworCisgICAgY2xhc3MgVGhyZWFkaW5nVW5peERhdGFncmFtU2VydmVyKFRocmVhZGluZ01peEluLCBVbml4RGF0YWdyYW1TZXJ2ZXIpOiBwYXNzCisKK2NsYXNzIEJhc2VSZXF1ZXN0SGFuZGxlcjoKKworICAgICIiIkJhc2UgY2xhc3MgZm9yIHJlcXVlc3QgaGFuZGxlciBjbGFzc2VzLgorCisgICAgVGhpcyBjbGFzcyBpcyBpbnN0YW50aWF0ZWQgZm9yIGVhY2ggcmVxdWVzdCB0byBiZSBoYW5kbGVkLiAgVGhlCisgICAgY29uc3RydWN0b3Igc2V0cyB0aGUgaW5zdGFuY2UgdmFyaWFibGVzIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzCisgICAgYW5kIHNlcnZlciwgYW5kIHRoZW4gY2FsbHMgdGhlIGhhbmRsZSgpIG1ldGhvZC4gIFRvIGltcGxlbWVudCBhCisgICAgc3BlY2lmaWMgc2VydmljZSwgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIHRvIGRlcml2ZSBhIGNsYXNzIHdoaWNoCisgICAgZGVmaW5lcyBhIGhhbmRsZSgpIG1ldGhvZC4KKworICAgIFRoZSBoYW5kbGUoKSBtZXRob2QgY2FuIGZpbmQgdGhlIHJlcXVlc3QgYXMgc2VsZi5yZXF1ZXN0LCB0aGUKKyAgICBjbGllbnQgYWRkcmVzcyBhcyBzZWxmLmNsaWVudF9hZGRyZXNzLCBhbmQgdGhlIHNlcnZlciAoaW4gY2FzZSBpdAorICAgIG5lZWRzIGFjY2VzcyB0byBwZXItc2VydmVyIGluZm9ybWF0aW9uKSBhcyBzZWxmLnNlcnZlci4gIFNpbmNlIGEKKyAgICBzZXBhcmF0ZSBpbnN0YW5jZSBpcyBjcmVhdGVkIGZvciBlYWNoIHJlcXVlc3QsIHRoZSBoYW5kbGUoKSBtZXRob2QKKyAgICBjYW4gZGVmaW5lIGFyYml0cmFyeSBvdGhlciBpbnN0YW5jZSB2YXJpYXJpYWJsZXMuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcywgc2VydmVyKToKKyAgICAgICAgc2VsZi5yZXF1ZXN0ID0gcmVxdWVzdAorICAgICAgICBzZWxmLmNsaWVudF9hZGRyZXNzID0gY2xpZW50X2FkZHJlc3MKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBzZXJ2ZXIKKyAgICAgICAgc2VsZi5zZXR1cCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuZmluaXNoKCkKKworICAgIGRlZiBzZXR1cChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGZpbmlzaChzZWxmKToKKyAgICAgICAgcGFzcworCisKKyMgVGhlIGZvbGxvd2luZyB0d28gY2xhc3NlcyBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgc2FtZSBzZXJ2aWNlCisjIGNsYXNzIGZvciBzdHJlYW0gb3IgZGF0YWdyYW0gc2VydmVycy4KKyMgRWFjaCBjbGFzcyBzZXRzIHVwIHRoZXNlIGluc3RhbmNlIHZhcmlhYmxlczoKKyMgLSByZmlsZTogYSBmaWxlIG9iamVjdCBmcm9tIHdoaWNoIHJlY2VpdmVzIHRoZSByZXF1ZXN0IGlzIHJlYWQKKyMgLSB3ZmlsZTogYSBmaWxlIG9iamVjdCB0byB3aGljaCB0aGUgcmVwbHkgaXMgd3JpdHRlbgorIyBXaGVuIHRoZSBoYW5kbGUoKSBtZXRob2QgcmV0dXJucywgd2ZpbGUgaXMgZmx1c2hlZCBwcm9wZXJseQorCisKK2NsYXNzIFN0cmVhbVJlcXVlc3RIYW5kbGVyKEJhc2VSZXF1ZXN0SGFuZGxlcik6CisKKyAgICAiIiJEZWZpbmUgc2VsZi5yZmlsZSBhbmQgc2VsZi53ZmlsZSBmb3Igc3RyZWFtIHNvY2tldHMuIiIiCisKKyAgICAjIERlZmF1bHQgYnVmZmVyIHNpemVzIGZvciByZmlsZSwgd2ZpbGUuCisgICAgIyBXZSBkZWZhdWx0IHJmaWxlIHRvIGJ1ZmZlcmVkIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IGNvdWxkIGJlCisgICAgIyByZWFsbHkgc2xvdyBmb3IgbGFyZ2UgZGF0YSAoYSBnZXRjKCkgY2FsbCBwZXIgYnl0ZSk7IHdlIG1ha2UKKyAgICAjIHdmaWxlIHVuYnVmZmVyZWQgYmVjYXVzZSAoYSkgb2Z0ZW4gYWZ0ZXIgYSB3cml0ZSgpIHdlIHdhbnQgdG8KKyAgICAjIHJlYWQgYW5kIHdlIG5lZWQgdG8gZmx1c2ggdGhlIGxpbmU7IChiKSBiaWcgd3JpdGVzIHRvIHVuYnVmZmVyZWQKKyAgICAjIGZpbGVzIGFyZSB0eXBpY2FsbHkgb3B0aW1pemVkIGJ5IHN0ZGlvIGV2ZW4gd2hlbiBiaWcgcmVhZHMKKyAgICAjIGFyZW4ndC4KKyAgICByYnVmc2l6ZSA9IC0xCisgICAgd2J1ZnNpemUgPSAwCisKKyAgICAjIEEgdGltZW91dCB0byBhcHBseSB0byB0aGUgcmVxdWVzdCBzb2NrZXQsIGlmIG5vdCBOb25lLgorICAgIHRpbWVvdXQgPSBOb25lCisKKyAgICAjIERpc2FibGUgbmFnbGUgYWxnb3JpdGhtIGZvciB0aGlzIHNvY2tldCwgaWYgVHJ1ZS4KKyAgICAjIFVzZSBvbmx5IHdoZW4gd2J1ZnNpemUgIT0gMCwgdG8gYXZvaWQgc21hbGwgcGFja2V0cy4KKyAgICBkaXNhYmxlX25hZ2xlX2FsZ29yaXRobSA9IEZhbHNlCisKKyAgICBkZWYgc2V0dXAoc2VsZik6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IHNlbGYucmVxdWVzdAorICAgICAgICBpZiBzZWxmLnRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24uc2V0dGltZW91dChzZWxmLnRpbWVvdXQpCisgICAgICAgIGlmIHNlbGYuZGlzYWJsZV9uYWdsZV9hbGdvcml0aG06CisgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb24uc2V0c29ja29wdChzb2NrZXQuSVBQUk9UT19UQ1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuVENQX05PREVMQVksIFRydWUpCisgICAgICAgIHNlbGYucmZpbGUgPSBzZWxmLmNvbm5lY3Rpb24ubWFrZWZpbGUoJ3JiJywgc2VsZi5yYnVmc2l6ZSkKKyAgICAgICAgc2VsZi53ZmlsZSA9IHNlbGYuY29ubmVjdGlvbi5tYWtlZmlsZSgnd2InLCBzZWxmLndidWZzaXplKQorCisgICAgZGVmIGZpbmlzaChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYud2ZpbGUuY2xvc2VkOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYud2ZpbGUuZmx1c2goKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICAjIEFuIGZpbmFsIHNvY2tldCBlcnJvciBtYXkgaGF2ZSBvY2N1cnJlZCBoZXJlLCBzdWNoIGFzCisgICAgICAgICAgICAgICAgIyB0aGUgbG9jYWwgZXJyb3IgRUNPTk5BQk9SVEVELgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi53ZmlsZS5jbG9zZSgpCisgICAgICAgIHNlbGYucmZpbGUuY2xvc2UoKQorCisKK2NsYXNzIERhdGFncmFtUmVxdWVzdEhhbmRsZXIoQmFzZVJlcXVlc3RIYW5kbGVyKToKKworICAgICMgWFhYIFJlZ3JldHRhYmx5LCBJIGNhbm5vdCBnZXQgdGhpcyB3b3JraW5nIG9uIExpbnV4OworICAgICMgcy5yZWN2ZnJvbSgpIGRvZXNuJ3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCBjbGllbnQgYWRkcmVzcy4KKworICAgICIiIkRlZmluZSBzZWxmLnJmaWxlIGFuZCBzZWxmLndmaWxlIGZvciBkYXRhZ3JhbSBzb2NrZXRzLiIiIgorCisgICAgZGVmIHNldHVwKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgc2VsZi5wYWNrZXQsIHNlbGYuc29ja2V0ID0gc2VsZi5yZXF1ZXN0CisgICAgICAgIHNlbGYucmZpbGUgPSBTdHJpbmdJTyhzZWxmLnBhY2tldCkKKyAgICAgICAgc2VsZi53ZmlsZSA9IFN0cmluZ0lPKCkKKworICAgIGRlZiBmaW5pc2goc2VsZik6CisgICAgICAgIHNlbGYuc29ja2V0LnNlbmR0byhzZWxmLndmaWxlLmdldHZhbHVlKCksIHNlbGYuY2xpZW50X2FkZHJlc3MpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1NvY2tldFNlcnZlci5weWMgYi9saWIvcHl0aG9uMi43L1NvY2tldFNlcnZlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhNDg5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvU29ja2V0U2VydmVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1NvY2tldFNlcnZlci5weW8gYi9saWIvcHl0aG9uMi43L1NvY2tldFNlcnZlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhNDg5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvU29ja2V0U2VydmVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1N0cmluZ0lPLnB5IGIvbGliL3B5dGhvbjIuNy9TdHJpbmdJTy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjM1MjViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9TdHJpbmdJTy5weQpAQCAtMCwwICsxLDMyNCBAQAorciIiIkZpbGUtbGlrZSBvYmplY3RzIHRoYXQgcmVhZCBmcm9tIG9yIHdyaXRlIHRvIGEgc3RyaW5nIGJ1ZmZlci4KKworVGhpcyBpbXBsZW1lbnRzIChuZWFybHkpIGFsbCBzdGRpbyBtZXRob2RzLgorCitmID0gU3RyaW5nSU8oKSAgICAgICMgcmVhZHkgZm9yIHdyaXRpbmcKK2YgPSBTdHJpbmdJTyhidWYpICAgIyByZWFkeSBmb3IgcmVhZGluZworZi5jbG9zZSgpICAgICAgICAgICAjIGV4cGxpY2l0bHkgcmVsZWFzZSByZXNvdXJjZXMgaGVsZAorZmxhZyA9IGYuaXNhdHR5KCkgICAjIGFsd2F5cyBmYWxzZQorcG9zID0gZi50ZWxsKCkgICAgICAjIGdldCBjdXJyZW50IHBvc2l0aW9uCitmLnNlZWsocG9zKSAgICAgICAgICMgc2V0IGN1cnJlbnQgcG9zaXRpb24KK2Yuc2Vlayhwb3MsIG1vZGUpICAgIyBtb2RlIDA6IGFic29sdXRlOyAxOiByZWxhdGl2ZTsgMjogcmVsYXRpdmUgdG8gRU9GCitidWYgPSBmLnJlYWQoKSAgICAgICMgcmVhZCB1bnRpbCBFT0YKK2J1ZiA9IGYucmVhZChuKSAgICAgIyByZWFkIHVwIHRvIG4gYnl0ZXMKK2J1ZiA9IGYucmVhZGxpbmUoKSAgIyByZWFkIHVudGlsIGVuZCBvZiBsaW5lICgnXG4nKSBvciBFT0YKK2xpc3QgPSBmLnJlYWRsaW5lcygpIyBsaXN0IG9mIGYucmVhZGxpbmUoKSByZXN1bHRzIHVudGlsIEVPRgorZi50cnVuY2F0ZShbc2l6ZV0pICAjIHRydW5jYXRlIGZpbGUgYXQgdG8gYXQgbW9zdCBzaXplIChkZWZhdWx0OiBjdXJyZW50IHBvcykKK2Yud3JpdGUoYnVmKSAgICAgICAgIyB3cml0ZSBhdCBjdXJyZW50IHBvc2l0aW9uCitmLndyaXRlbGluZXMobGlzdCkgICMgZm9yIGxpbmUgaW4gbGlzdDogZi53cml0ZShsaW5lKQorZi5nZXR2YWx1ZSgpICAgICAgICAjIHJldHVybiB3aG9sZSBmaWxlJ3MgY29udGVudHMgYXMgYSBzdHJpbmcKKworTm90ZXM6CistIFVzaW5nIGEgcmVhbCBmaWxlIGlzIG9mdGVuIGZhc3RlciAoYnV0IGxlc3MgY29udmVuaWVudCkuCistIFRoZXJlJ3MgYWxzbyBhIG11Y2ggZmFzdGVyIGltcGxlbWVudGF0aW9uIGluIEMsIGNhbGxlZCBjU3RyaW5nSU8sIGJ1dAorICBpdCdzIG5vdCBzdWJjbGFzc2FibGUuCistIGZpbGVubygpIGlzIGxlZnQgdW5pbXBsZW1lbnRlZCBzbyB0aGF0IGNvZGUgd2hpY2ggdXNlcyBpdCB0cmlnZ2VycworICBhbiBleGNlcHRpb24gZWFybHkuCistIFNlZWtpbmcgZmFyIGJleW9uZCBFT0YgYW5kIHRoZW4gd3JpdGluZyB3aWxsIGluc2VydCByZWFsIG51bGwKKyAgYnl0ZXMgdGhhdCBvY2N1cHkgc3BhY2UgaW4gdGhlIGJ1ZmZlci4KKy0gVGhlcmUncyBhIHNpbXBsZSB0ZXN0IHNldCAoc2VlIGVuZCBvZiB0aGlzIGZpbGUpLgorIiIiCit0cnk6CisgICAgZnJvbSBlcnJubyBpbXBvcnQgRUlOVkFMCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgRUlOVkFMID0gMjIKKworX19hbGxfXyA9IFsiU3RyaW5nSU8iXQorCitkZWYgX2NvbXBsYWluX2lmY2xvc2VkKGNsb3NlZCk6CisgICAgaWYgY2xvc2VkOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKKworY2xhc3MgU3RyaW5nSU86CisgICAgIiIiY2xhc3MgU3RyaW5nSU8oW2J1ZmZlcl0pCisKKyAgICBXaGVuIGEgU3RyaW5nSU8gb2JqZWN0IGlzIGNyZWF0ZWQsIGl0IGNhbiBiZSBpbml0aWFsaXplZCB0byBhbiBleGlzdGluZworICAgIHN0cmluZyBieSBwYXNzaW5nIHRoZSBzdHJpbmcgdG8gdGhlIGNvbnN0cnVjdG9yLiBJZiBubyBzdHJpbmcgaXMgZ2l2ZW4sCisgICAgdGhlIFN0cmluZ0lPIHdpbGwgc3RhcnQgZW1wdHkuCisKKyAgICBUaGUgU3RyaW5nSU8gb2JqZWN0IGNhbiBhY2NlcHQgZWl0aGVyIFVuaWNvZGUgb3IgOC1iaXQgc3RyaW5ncywgYnV0CisgICAgbWl4aW5nIHRoZSB0d28gbWF5IHRha2Ugc29tZSBjYXJlLiBJZiBib3RoIGFyZSB1c2VkLCA4LWJpdCBzdHJpbmdzIHRoYXQKKyAgICBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgNy1iaXQgQVNDSUkgKHRoYXQgdXNlIHRoZSA4dGggYml0KSB3aWxsIGNhdXNlCisgICAgYSBVbmljb2RlRXJyb3IgdG8gYmUgcmFpc2VkIHdoZW4gZ2V0dmFsdWUoKSBpcyBjYWxsZWQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1ZiA9ICcnKToKKyAgICAgICAgIyBGb3JjZSBzZWxmLmJ1ZiB0byBiZSBhIHN0cmluZyBvciB1bmljb2RlCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJ1ZiwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBidWYgPSBzdHIoYnVmKQorICAgICAgICBzZWxmLmJ1ZiA9IGJ1ZgorICAgICAgICBzZWxmLmxlbiA9IGxlbihidWYpCisgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtdCisgICAgICAgIHNlbGYucG9zID0gMAorICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuc29mdHNwYWNlID0gMAorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICIiIkEgZmlsZSBvYmplY3QgaXMgaXRzIG93biBpdGVyYXRvciwgZm9yIGV4YW1wbGUgaXRlcihmKSByZXR1cm5zIGYKKyAgICAgICAgKHVubGVzcyBmIGlzIGNsb3NlZCkuIFdoZW4gYSBmaWxlIGlzIHVzZWQgYXMgYW4gaXRlcmF0b3IsIHR5cGljYWxseQorICAgICAgICBpbiBhIGZvciBsb29wIChmb3IgZXhhbXBsZSwgZm9yIGxpbmUgaW4gZjogcHJpbnQgbGluZSksIHRoZSBuZXh0KCkKKyAgICAgICAgbWV0aG9kIGlzIGNhbGxlZCByZXBlYXRlZGx5LiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBuZXh0IGlucHV0IGxpbmUsCisgICAgICAgIG9yIHJhaXNlcyBTdG9wSXRlcmF0aW9uIHdoZW4gRU9GIGlzIGhpdC4KKyAgICAgICAgIiIiCisgICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZCkKKyAgICAgICAgciA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgcjoKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiRnJlZSB0aGUgbWVtb3J5IGJ1ZmZlci4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQorICAgICAgICAgICAgZGVsIHNlbGYuYnVmLCBzZWxmLnBvcworCisgICAgZGVmIGlzYXR0eShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBGYWxzZSBiZWNhdXNlIFN0cmluZ0lPIG9iamVjdHMgYXJlIG5vdCBjb25uZWN0ZWQgdG8gYQorICAgICAgICB0dHktbGlrZSBkZXZpY2UuCisgICAgICAgICIiIgorICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zLCBtb2RlID0gMCk6CisgICAgICAgICIiIlNldCB0aGUgZmlsZSdzIGN1cnJlbnQgcG9zaXRpb24uCisKKyAgICAgICAgVGhlIG1vZGUgYXJndW1lbnQgaXMgb3B0aW9uYWwgYW5kIGRlZmF1bHRzIHRvIDAgKGFic29sdXRlIGZpbGUKKyAgICAgICAgcG9zaXRpb25pbmcpOyBvdGhlciB2YWx1ZXMgYXJlIDEgKHNlZWsgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQKKyAgICAgICAgcG9zaXRpb24pIGFuZCAyIChzZWVrIHJlbGF0aXZlIHRvIHRoZSBmaWxlJ3MgZW5kKS4KKworICAgICAgICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuCisgICAgICAgICIiIgorICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpCisgICAgICAgIGlmIHNlbGYuYnVmbGlzdDoKKyAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KQorICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW10KKyAgICAgICAgaWYgbW9kZSA9PSAxOgorICAgICAgICAgICAgcG9zICs9IHNlbGYucG9zCisgICAgICAgIGVsaWYgbW9kZSA9PSAyOgorICAgICAgICAgICAgcG9zICs9IHNlbGYubGVuCisgICAgICAgIHNlbGYucG9zID0gbWF4KDAsIHBvcykKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGZpbGUncyBjdXJyZW50IHBvc2l0aW9uLiIiIgorICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpCisgICAgICAgIHJldHVybiBzZWxmLnBvcworCisgICAgZGVmIHJlYWQoc2VsZiwgbiA9IC0xKToKKyAgICAgICAgIiIiUmVhZCBhdCBtb3N0IHNpemUgYnl0ZXMgZnJvbSB0aGUgZmlsZQorICAgICAgICAobGVzcyBpZiB0aGUgcmVhZCBoaXRzIEVPRiBiZWZvcmUgb2J0YWluaW5nIHNpemUgYnl0ZXMpLgorCisgICAgICAgIElmIHRoZSBzaXplIGFyZ3VtZW50IGlzIG5lZ2F0aXZlIG9yIG9taXR0ZWQsIHJlYWQgYWxsIGRhdGEgdW50aWwgRU9GCisgICAgICAgIGlzIHJlYWNoZWQuIFRoZSBieXRlcyBhcmUgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2JqZWN0LiBBbiBlbXB0eQorICAgICAgICBzdHJpbmcgaXMgcmV0dXJuZWQgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgaW1tZWRpYXRlbHkuCisgICAgICAgICIiIgorICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpCisgICAgICAgIGlmIHNlbGYuYnVmbGlzdDoKKyAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KQorICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW10KKyAgICAgICAgaWYgbiBpcyBOb25lIG9yIG4gPCAwOgorICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5sZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld3BvcyA9IG1pbihzZWxmLnBvcytuLCBzZWxmLmxlbikKKyAgICAgICAgciA9IHNlbGYuYnVmW3NlbGYucG9zOm5ld3Bvc10KKyAgICAgICAgc2VsZi5wb3MgPSBuZXdwb3MKKyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiByZWFkbGluZShzZWxmLCBsZW5ndGg9Tm9uZSk6CisgICAgICAgIHIiIiJSZWFkIG9uZSBlbnRpcmUgbGluZSBmcm9tIHRoZSBmaWxlLgorCisgICAgICAgIEEgdHJhaWxpbmcgbmV3bGluZSBjaGFyYWN0ZXIgaXMga2VwdCBpbiB0aGUgc3RyaW5nIChidXQgbWF5IGJlIGFic2VudAorICAgICAgICB3aGVuIGEgZmlsZSBlbmRzIHdpdGggYW4gaW5jb21wbGV0ZSBsaW5lKS4gSWYgdGhlIHNpemUgYXJndW1lbnQgaXMKKyAgICAgICAgcHJlc2VudCBhbmQgbm9uLW5lZ2F0aXZlLCBpdCBpcyBhIG1heGltdW0gYnl0ZSBjb3VudCAoaW5jbHVkaW5nIHRoZQorICAgICAgICB0cmFpbGluZyBuZXdsaW5lKSBhbmQgYW4gaW5jb21wbGV0ZSBsaW5lIG1heSBiZSByZXR1cm5lZC4KKworICAgICAgICBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgb25seSB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBpbW1lZGlhdGVseS4KKworICAgICAgICBOb3RlOiBVbmxpa2Ugc3RkaW8ncyBmZ2V0cygpLCB0aGUgcmV0dXJuZWQgc3RyaW5nIGNvbnRhaW5zIG51bGwKKyAgICAgICAgY2hhcmFjdGVycyAoJ1wwJykgaWYgdGhleSBvY2N1cnJlZCBpbiB0aGUgaW5wdXQuCisgICAgICAgICIiIgorICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpCisgICAgICAgIGlmIHNlbGYuYnVmbGlzdDoKKyAgICAgICAgICAgIHNlbGYuYnVmICs9ICcnLmpvaW4oc2VsZi5idWZsaXN0KQorICAgICAgICAgICAgc2VsZi5idWZsaXN0ID0gW10KKyAgICAgICAgaSA9IHNlbGYuYnVmLmZpbmQoJ1xuJywgc2VsZi5wb3MpCisgICAgICAgIGlmIGkgPCAwOgorICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5sZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld3BvcyA9IGkrMQorICAgICAgICBpZiBsZW5ndGggaXMgbm90IE5vbmUgYW5kIGxlbmd0aCA+PSAwOgorICAgICAgICAgICAgaWYgc2VsZi5wb3MgKyBsZW5ndGggPCBuZXdwb3M6CisgICAgICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5wb3MgKyBsZW5ndGgKKyAgICAgICAgciA9IHNlbGYuYnVmW3NlbGYucG9zOm5ld3Bvc10KKyAgICAgICAgc2VsZi5wb3MgPSBuZXdwb3MKKyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiByZWFkbGluZXMoc2VsZiwgc2l6ZWhpbnQgPSAwKToKKyAgICAgICAgIiIiUmVhZCB1bnRpbCBFT0YgdXNpbmcgcmVhZGxpbmUoKSBhbmQgcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIHRoZQorICAgICAgICBsaW5lcyB0aHVzIHJlYWQuCisKKyAgICAgICAgSWYgdGhlIG9wdGlvbmFsIHNpemVoaW50IGFyZ3VtZW50IGlzIHByZXNlbnQsIGluc3RlYWQgb2YgcmVhZGluZyB1cAorICAgICAgICB0byBFT0YsIHdob2xlIGxpbmVzIHRvdGFsbGluZyBhcHByb3hpbWF0ZWx5IHNpemVoaW50IGJ5dGVzIChvciBtb3JlCisgICAgICAgIHRvIGFjY29tbW9kYXRlIGEgZmluYWwgd2hvbGUgbGluZSkuCisgICAgICAgICIiIgorICAgICAgICB0b3RhbCA9IDAKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgIHdoaWxlIGxpbmU6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIHRvdGFsICs9IGxlbihsaW5lKQorICAgICAgICAgICAgaWYgMCA8IHNpemVoaW50IDw9IHRvdGFsOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgIHJldHVybiBsaW5lcworCisgICAgZGVmIHRydW5jYXRlKHNlbGYsIHNpemU9Tm9uZSk6CisgICAgICAgICIiIlRydW5jYXRlIHRoZSBmaWxlJ3Mgc2l6ZS4KKworICAgICAgICBJZiB0aGUgb3B0aW9uYWwgc2l6ZSBhcmd1bWVudCBpcyBwcmVzZW50LCB0aGUgZmlsZSBpcyB0cnVuY2F0ZWQgdG8KKyAgICAgICAgKGF0IG1vc3QpIHRoYXQgc2l6ZS4gVGhlIHNpemUgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICAgIFRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24gaXMgbm90IGNoYW5nZWQgdW5sZXNzIHRoZSBwb3NpdGlvbgorICAgICAgICBpcyBiZXlvbmQgdGhlIG5ldyBmaWxlIHNpemUuCisKKyAgICAgICAgSWYgdGhlIHNwZWNpZmllZCBzaXplIGV4Y2VlZHMgdGhlIGZpbGUncyBjdXJyZW50IHNpemUsIHRoZQorICAgICAgICBmaWxlIHJlbWFpbnMgdW5jaGFuZ2VkLgorICAgICAgICAiIiIKKyAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKQorICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBzaXplID0gc2VsZi5wb3MKKyAgICAgICAgZWxpZiBzaXplIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoRUlOVkFMLCAiTmVnYXRpdmUgc2l6ZSBub3QgYWxsb3dlZCIpCisgICAgICAgIGVsaWYgc2l6ZSA8IHNlbGYucG9zOgorICAgICAgICAgICAgc2VsZi5wb3MgPSBzaXplCisgICAgICAgIHNlbGYuYnVmID0gc2VsZi5nZXR2YWx1ZSgpWzpzaXplXQorICAgICAgICBzZWxmLmxlbiA9IHNpemUKKworICAgIGRlZiB3cml0ZShzZWxmLCBzKToKKyAgICAgICAgIiIiV3JpdGUgYSBzdHJpbmcgdG8gdGhlIGZpbGUuCisKKyAgICAgICAgVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlLgorICAgICAgICAiIiIKKyAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKQorICAgICAgICBpZiBub3QgczogcmV0dXJuCisgICAgICAgICMgRm9yY2UgcyB0byBiZSBhIHN0cmluZyBvciB1bmljb2RlCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgcyA9IHN0cihzKQorICAgICAgICBzcG9zID0gc2VsZi5wb3MKKyAgICAgICAgc2xlbiA9IHNlbGYubGVuCisgICAgICAgIGlmIHNwb3MgPT0gc2xlbjoKKyAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQocykKKyAgICAgICAgICAgIHNlbGYubGVuID0gc2VsZi5wb3MgPSBzcG9zICsgbGVuKHMpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc3BvcyA+IHNsZW46CisgICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKCdcMCcqKHNwb3MgLSBzbGVuKSkKKyAgICAgICAgICAgIHNsZW4gPSBzcG9zCisgICAgICAgIG5ld3BvcyA9IHNwb3MgKyBsZW4ocykKKyAgICAgICAgaWYgc3BvcyA8IHNsZW46CisgICAgICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpCisgICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbc2VsZi5idWZbOnNwb3NdLCBzLCBzZWxmLmJ1ZltuZXdwb3M6XV0KKyAgICAgICAgICAgIHNlbGYuYnVmID0gJycKKyAgICAgICAgICAgIGlmIG5ld3BvcyA+IHNsZW46CisgICAgICAgICAgICAgICAgc2xlbiA9IG5ld3BvcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5idWZsaXN0LmFwcGVuZChzKQorICAgICAgICAgICAgc2xlbiA9IG5ld3BvcworICAgICAgICBzZWxmLmxlbiA9IHNsZW4KKyAgICAgICAgc2VsZi5wb3MgPSBuZXdwb3MKKworICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGl0ZXJhYmxlKToKKyAgICAgICAgIiIiV3JpdGUgYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHRvIHRoZSBmaWxlLiBUaGUgc2VxdWVuY2UgY2FuIGJlIGFueQorICAgICAgICBpdGVyYWJsZSBvYmplY3QgcHJvZHVjaW5nIHN0cmluZ3MsIHR5cGljYWxseSBhIGxpc3Qgb2Ygc3RyaW5ncy4gVGhlcmUKKyAgICAgICAgaXMgbm8gcmV0dXJuIHZhbHVlLgorCisgICAgICAgIChUaGUgbmFtZSBpcyBpbnRlbmRlZCB0byBtYXRjaCByZWFkbGluZXMoKTsgd3JpdGVsaW5lcygpIGRvZXMgbm90IGFkZAorICAgICAgICBsaW5lIHNlcGFyYXRvcnMuKQorICAgICAgICAiIiIKKyAgICAgICAgd3JpdGUgPSBzZWxmLndyaXRlCisgICAgICAgIGZvciBsaW5lIGluIGl0ZXJhYmxlOgorICAgICAgICAgICAgd3JpdGUobGluZSkKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgIiIiRmx1c2ggdGhlIGludGVybmFsIGJ1ZmZlcgorICAgICAgICAiIiIKKyAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKQorCisgICAgZGVmIGdldHZhbHVlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0cmlldmUgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgImZpbGUiIGF0IGFueSB0aW1lIGJlZm9yZQorICAgICAgICB0aGUgU3RyaW5nSU8gb2JqZWN0J3MgY2xvc2UoKSBtZXRob2QgaXMgY2FsbGVkLgorCisgICAgICAgIFRoZSBTdHJpbmdJTyBvYmplY3QgY2FuIGFjY2VwdCBlaXRoZXIgVW5pY29kZSBvciA4LWJpdCBzdHJpbmdzLAorICAgICAgICBidXQgbWl4aW5nIHRoZSB0d28gbWF5IHRha2Ugc29tZSBjYXJlLiBJZiBib3RoIGFyZSB1c2VkLCA4LWJpdAorICAgICAgICBzdHJpbmdzIHRoYXQgY2Fubm90IGJlIGludGVycHJldGVkIGFzIDctYml0IEFTQ0lJICh0aGF0IHVzZSB0aGUKKyAgICAgICAgOHRoIGJpdCkgd2lsbCBjYXVzZSBhIFVuaWNvZGVFcnJvciB0byBiZSByYWlzZWQgd2hlbiBnZXR2YWx1ZSgpCisgICAgICAgIGlzIGNhbGxlZC4KKyAgICAgICAgIiIiCisgICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZCkKKyAgICAgICAgaWYgc2VsZi5idWZsaXN0OgorICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpCisgICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXQorICAgICAgICByZXR1cm4gc2VsZi5idWYKKworCisjIEEgbGl0dGxlIHRlc3Qgc3VpdGUKKworZGVmIHRlc3QoKToKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBmaWxlID0gc3lzLmFyZ3ZbMV0KKyAgICBlbHNlOgorICAgICAgICBmaWxlID0gJy9ldGMvcGFzc3dkJworICAgIGxpbmVzID0gb3BlbihmaWxlLCAncicpLnJlYWRsaW5lcygpCisgICAgdGV4dCA9IG9wZW4oZmlsZSwgJ3InKS5yZWFkKCkKKyAgICBmID0gU3RyaW5nSU8oKQorICAgIGZvciBsaW5lIGluIGxpbmVzWzotMl06CisgICAgICAgIGYud3JpdGUobGluZSkKKyAgICBmLndyaXRlbGluZXMobGluZXNbLTI6XSkKKyAgICBpZiBmLmdldHZhbHVlKCkgIT0gdGV4dDoKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAnd3JpdGUgZmFpbGVkJworICAgIGxlbmd0aCA9IGYudGVsbCgpCisgICAgcHJpbnQgJ0ZpbGUgbGVuZ3RoID0nLCBsZW5ndGgKKyAgICBmLnNlZWsobGVuKGxpbmVzWzBdKSkKKyAgICBmLndyaXRlKGxpbmVzWzFdKQorICAgIGYuc2VlaygwKQorICAgIHByaW50ICdGaXJzdCBsaW5lID0nLCByZXByKGYucmVhZGxpbmUoKSkKKyAgICBwcmludCAnUG9zaXRpb24gPScsIGYudGVsbCgpCisgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgIHByaW50ICdTZWNvbmQgbGluZSA9JywgcmVwcihsaW5lKQorICAgIGYuc2VlaygtbGVuKGxpbmUpLCAxKQorICAgIGxpbmUyID0gZi5yZWFkKGxlbihsaW5lKSkKKyAgICBpZiBsaW5lICE9IGxpbmUyOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICdiYWQgcmVzdWx0IGFmdGVyIHNlZWsgYmFjaycKKyAgICBmLnNlZWsobGVuKGxpbmUyKSwgMSkKKyAgICBsaXN0ID0gZi5yZWFkbGluZXMoKQorICAgIGxpbmUgPSBsaXN0Wy0xXQorICAgIGYuc2VlayhmLnRlbGwoKSAtIGxlbihsaW5lKSkKKyAgICBsaW5lMiA9IGYucmVhZCgpCisgICAgaWYgbGluZSAhPSBsaW5lMjoKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAnYmFkIHJlc3VsdCBhZnRlciBzZWVrIGJhY2sgZnJvbSBFT0YnCisgICAgcHJpbnQgJ1JlYWQnLCBsZW4obGlzdCksICdtb3JlIGxpbmVzJworICAgIHByaW50ICdGaWxlIGxlbmd0aCA9JywgZi50ZWxsKCkKKyAgICBpZiBmLnRlbGwoKSAhPSBsZW5ndGg6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ2JhZCBsZW5ndGgnCisgICAgZi50cnVuY2F0ZShsZW5ndGgvMikKKyAgICBmLnNlZWsoMCwgMikKKyAgICBwcmludCAnVHJ1bmNhdGVkIGxlbmd0aCA9JywgZi50ZWxsKCkKKyAgICBpZiBmLnRlbGwoKSAhPSBsZW5ndGgvMjoKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAndHJ1bmNhdGUgZGlkIG5vdCBhZGp1c3QgbGVuZ3RoJworICAgIGYuY2xvc2UoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9TdHJpbmdJTy5weWMgYi9saWIvcHl0aG9uMi43L1N0cmluZ0lPLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmUwODRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9TdHJpbmdJTy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9TdHJpbmdJTy5weW8gYi9saWIvcHl0aG9uMi43L1N0cmluZ0lPLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmUwODRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9TdHJpbmdJTy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9Vc2VyRGljdC5weSBiL2xpYi9weXRob24yLjcvVXNlckRpY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyMjE4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvVXNlckRpY3QucHkKQEAgLTAsMCArMSwxODAgQEAKKyIiIkEgbW9yZSBvciBsZXNzIGNvbXBsZXRlIHVzZXItZGVmaW5lZCB3cmFwcGVyIGFyb3VuZCBkaWN0aW9uYXJ5IG9iamVjdHMuIiIiCisKK2NsYXNzIFVzZXJEaWN0OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaWN0PU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5kYXRhID0ge30KKyAgICAgICAgaWYgZGljdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKGRpY3QpCisgICAgICAgIGlmIGxlbihrd2FyZ3MpOgorICAgICAgICAgICAgc2VsZi51cGRhdGUoa3dhcmdzKQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKTogcmV0dXJuIHJlcHIoc2VsZi5kYXRhKQorICAgIGRlZiBfX2NtcF9fKHNlbGYsIGRpY3QpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGRpY3QsIFVzZXJEaWN0KToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5kYXRhLCBkaWN0LmRhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZGF0YSwgZGljdCkKKyAgICBfX2hhc2hfXyA9IE5vbmUgIyBBdm9pZCBQeTNrIHdhcm5pbmcKKyAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIGxlbihzZWxmLmRhdGEpCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIGlmIGtleSBpbiBzZWxmLmRhdGE6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhW2tleV0KKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9fY2xhc3NfXywgIl9fbWlzc2luZ19fIik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19taXNzaW5nX18oc2VsZiwga2V5KQorICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgaXRlbSk6IHNlbGYuZGF0YVtrZXldID0gaXRlbQorICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOiBkZWwgc2VsZi5kYXRhW2tleV0KKyAgICBkZWYgY2xlYXIoc2VsZik6IHNlbGYuZGF0YS5jbGVhcigpCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX19jbGFzc19fIGlzIFVzZXJEaWN0OgorICAgICAgICAgICAgcmV0dXJuIFVzZXJEaWN0KHNlbGYuZGF0YS5jb3B5KCkpCisgICAgICAgIGltcG9ydCBjb3B5CisgICAgICAgIGRhdGEgPSBzZWxmLmRhdGEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kYXRhID0ge30KKyAgICAgICAgICAgIGMgPSBjb3B5LmNvcHkoc2VsZikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKyAgICAgICAgYy51cGRhdGUoc2VsZikKKyAgICAgICAgcmV0dXJuIGMKKyAgICBkZWYga2V5cyhzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5rZXlzKCkKKyAgICBkZWYgaXRlbXMoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXRlbXMoKQorICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXRlcml0ZW1zKCkKKyAgICBkZWYgaXRlcmtleXMoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXRlcmtleXMoKQorICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLml0ZXJ2YWx1ZXMoKQorICAgIGRlZiB2YWx1ZXMoc2VsZik6IHJldHVybiBzZWxmLmRhdGEudmFsdWVzKCkKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOiByZXR1cm4ga2V5IGluIHNlbGYuZGF0YQorICAgIGRlZiB1cGRhdGUoc2VsZiwgZGljdD1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgIGlmIGRpY3QgaXMgTm9uZToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGRpY3QsIFVzZXJEaWN0KToKKyAgICAgICAgICAgIHNlbGYuZGF0YS51cGRhdGUoZGljdC5kYXRhKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZGljdCwgdHlwZSh7fSkpIG9yIG5vdCBoYXNhdHRyKGRpY3QsICdpdGVtcycpOgorICAgICAgICAgICAgc2VsZi5kYXRhLnVwZGF0ZShkaWN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGssIHYgaW4gZGljdC5pdGVtcygpOgorICAgICAgICAgICAgICAgIHNlbGZba10gPSB2CisgICAgICAgIGlmIGxlbihrd2FyZ3MpOgorICAgICAgICAgICAgc2VsZi5kYXRhLnVwZGF0ZShrd2FyZ3MpCisgICAgZGVmIGdldChzZWxmLCBrZXksIGZhaWxvYmo9Tm9uZSk6CisgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCisgICAgICAgIHJldHVybiBzZWxmW2tleV0KKyAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLCBrZXksIGZhaWxvYmo9Tm9uZSk6CisgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgIHNlbGZba2V5XSA9IGZhaWxvYmoKKyAgICAgICAgcmV0dXJuIHNlbGZba2V5XQorICAgIGRlZiBwb3Aoc2VsZiwga2V5LCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEucG9wKGtleSwgKmFyZ3MpCisgICAgZGVmIHBvcGl0ZW0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEucG9waXRlbSgpCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuZGF0YQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9ta2V5cyhjbHMsIGl0ZXJhYmxlLCB2YWx1ZT1Ob25lKToKKyAgICAgICAgZCA9IGNscygpCisgICAgICAgIGZvciBrZXkgaW4gaXRlcmFibGU6CisgICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gZAorCitjbGFzcyBJdGVyYWJsZVVzZXJEaWN0KFVzZXJEaWN0KToKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBpdGVyKHNlbGYuZGF0YSkKKworaW1wb3J0IF9hYmNvbGwKK19hYmNvbGwuTXV0YWJsZU1hcHBpbmcucmVnaXN0ZXIoSXRlcmFibGVVc2VyRGljdCkKKworCitjbGFzcyBEaWN0TWl4aW46CisgICAgIyBNaXhpbiBkZWZpbmluZyBhbGwgZGljdGlvbmFyeSBtZXRob2RzIGZvciBjbGFzc2VzIHRoYXQgYWxyZWFkeSBoYXZlCisgICAgIyBhIG1pbmltdW0gZGljdGlvbmFyeSBpbnRlcmZhY2UgaW5jbHVkaW5nIGdldGl0ZW0sIHNldGl0ZW0sIGRlbGl0ZW0sCisgICAgIyBhbmQga2V5cy4gV2l0aG91dCBrbm93bGVkZ2Ugb2YgdGhlIHN1YmNsYXNzIGNvbnN0cnVjdG9yLCB0aGUgbWl4aW4KKyAgICAjIGRvZXMgbm90IGRlZmluZSBfX2luaXRfXygpIG9yIGNvcHkoKS4gIEluIGFkZGl0aW9uIHRvIHRoZSBmb3VyIGJhc2UKKyAgICAjIG1ldGhvZHMsIHByb2dyZXNzaXZlbHkgbW9yZSBlZmZpY2llbmN5IGNvbWVzIHdpdGggZGVmaW5pbmcKKyAgICAjIF9fY29udGFpbnNfXygpLCBfX2l0ZXJfXygpLCBhbmQgaXRlcml0ZW1zKCkuCisKKyAgICAjIHNlY29uZCBsZXZlbCBkZWZpbml0aW9ucyBzdXBwb3J0IGhpZ2hlciBsZXZlbHMKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIGZvciBrIGluIHNlbGYua2V5cygpOgorICAgICAgICAgICAgeWllbGQgaworICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGZba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBzZWxmLmhhc19rZXkoa2V5KQorCisgICAgIyB0aGlyZCBsZXZlbCB0YWtlcyBhZHZhbnRhZ2Ugb2Ygc2Vjb25kIGxldmVsIGRlZmluaXRpb25zCisgICAgZGVmIGl0ZXJpdGVtcyhzZWxmKToKKyAgICAgICAgZm9yIGsgaW4gc2VsZjoKKyAgICAgICAgICAgIHlpZWxkIChrLCBzZWxmW2tdKQorICAgIGRlZiBpdGVya2V5cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19pdGVyX18oKQorCisgICAgIyBmb3VydGggbGV2ZWwgdXNlcyBkZWZpbml0aW9ucyBmcm9tIGxvd2VyIGxldmVscworICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOgorICAgICAgICBmb3IgXywgdiBpbiBzZWxmLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgeWllbGQgdgorICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbdiBmb3IgXywgdiBpbiBzZWxmLml0ZXJpdGVtcygpXQorICAgIGRlZiBpdGVtcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyaXRlbXMoKSkKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzKCk6CisgICAgICAgICAgICBkZWwgc2VsZltrZXldCisgICAgZGVmIHNldGRlZmF1bHQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZltrZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHNlbGZba2V5XSA9IGRlZmF1bHQKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICBkZWYgcG9wKHNlbGYsIGtleSwgKmFyZ3MpOgorICAgICAgICBpZiBsZW4oYXJncykgPiAxOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAicG9wIGV4cGVjdGVkIGF0IG1vc3QgMiBhcmd1bWVudHMsIGdvdCAiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXByKDEgKyBsZW4oYXJncykpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZltrZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3NbMF0KKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGRlbCBzZWxmW2tleV0KKyAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgZGVmIHBvcGl0ZW0oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGssIHYgPSBzZWxmLml0ZXJpdGVtcygpLm5leHQoKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yLCAnY29udGFpbmVyIGlzIGVtcHR5JworICAgICAgICBkZWwgc2VsZltrXQorICAgICAgICByZXR1cm4gKGssIHYpCisgICAgZGVmIHVwZGF0ZShzZWxmLCBvdGhlcj1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgICMgTWFrZSBwcm9ncmVzc2l2ZWx5IHdlYWtlciBhc3N1bXB0aW9ucyBhYm91dCAib3RoZXIiCisgICAgICAgIGlmIG90aGVyIGlzIE5vbmU6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgJ2l0ZXJpdGVtcycpOiAgIyBpdGVyaXRlbXMgc2F2ZXMgbWVtb3J5IGFuZCBsb29rdXBzCisgICAgICAgICAgICBmb3IgaywgdiBpbiBvdGhlci5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZWxmW2tdID0gdgorICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsICdrZXlzJyk6CisgICAgICAgICAgICBmb3IgayBpbiBvdGhlci5rZXlzKCk6CisgICAgICAgICAgICAgICAgc2VsZltrXSA9IG90aGVyW2tdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgaywgdiBpbiBvdGhlcjoKKyAgICAgICAgICAgICAgICBzZWxmW2tdID0gdgorICAgICAgICBpZiBrd2FyZ3M6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZShrd2FyZ3MpCisgICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiByZXByKGRpY3Qoc2VsZi5pdGVyaXRlbXMoKSkpCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBvdGhlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgRGljdE1peGluKToKKyAgICAgICAgICAgIG90aGVyID0gZGljdChvdGhlci5pdGVyaXRlbXMoKSkKKyAgICAgICAgcmV0dXJuIGNtcChkaWN0KHNlbGYuaXRlcml0ZW1zKCkpLCBvdGhlcikKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmtleXMoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvVXNlckRpY3QucHljIGIvbGliL3B5dGhvbjIuNy9Vc2VyRGljdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkMzkzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvVXNlckRpY3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvVXNlckRpY3QucHlvIGIvbGliL3B5dGhvbjIuNy9Vc2VyRGljdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkMzkzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvVXNlckRpY3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvVXNlckxpc3QucHkgYi9saWIvcHl0aG9uMi43L1VzZXJMaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDU5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1VzZXJMaXN0LnB5CkBAIC0wLDAgKzEsODggQEAKKyIiIkEgbW9yZSBvciBsZXNzIGNvbXBsZXRlIHVzZXItZGVmaW5lZCB3cmFwcGVyIGFyb3VuZCBsaXN0IG9iamVjdHMuIiIiCisKK2ltcG9ydCBjb2xsZWN0aW9ucworCitjbGFzcyBVc2VyTGlzdChjb2xsZWN0aW9ucy5NdXRhYmxlU2VxdWVuY2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbml0bGlzdD1Ob25lKToKKyAgICAgICAgc2VsZi5kYXRhID0gW10KKyAgICAgICAgaWYgaW5pdGxpc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIFhYWCBzaG91bGQgdGhpcyBhY2NlcHQgYW4gYXJiaXRyYXJ5IHNlcXVlbmNlPworICAgICAgICAgICAgaWYgdHlwZShpbml0bGlzdCkgPT0gdHlwZShzZWxmLmRhdGEpOgorICAgICAgICAgICAgICAgIHNlbGYuZGF0YVs6XSA9IGluaXRsaXN0CisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaW5pdGxpc3QsIFVzZXJMaXN0KToKKyAgICAgICAgICAgICAgICBzZWxmLmRhdGFbOl0gPSBpbml0bGlzdC5kYXRhWzpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGxpc3QoaW5pdGxpc3QpCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOiByZXR1cm4gcmVwcihzZWxmLmRhdGEpCisgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6IHJldHVybiBzZWxmLmRhdGEgPCAgc2VsZi5fX2Nhc3Qob3RoZXIpCisgICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6IHJldHVybiBzZWxmLmRhdGEgPD0gc2VsZi5fX2Nhc3Qob3RoZXIpCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IHJldHVybiBzZWxmLmRhdGEgPT0gc2VsZi5fX2Nhc3Qob3RoZXIpCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6IHJldHVybiBzZWxmLmRhdGEgIT0gc2VsZi5fX2Nhc3Qob3RoZXIpCisgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6IHJldHVybiBzZWxmLmRhdGEgPiAgc2VsZi5fX2Nhc3Qob3RoZXIpCisgICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6IHJldHVybiBzZWxmLmRhdGEgPj0gc2VsZi5fX2Nhc3Qob3RoZXIpCisgICAgZGVmIF9fY2FzdChzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFVzZXJMaXN0KTogcmV0dXJuIG90aGVyLmRhdGEKKyAgICAgICAgZWxzZTogcmV0dXJuIG90aGVyCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gY21wKHNlbGYuZGF0YSwgc2VsZi5fX2Nhc3Qob3RoZXIpKQorICAgIF9faGFzaF9fID0gTm9uZSAjIE11dGFibGUgc2VxdWVuY2UsIHNvIG5vdCBoYXNoYWJsZQorICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6IHJldHVybiBpdGVtIGluIHNlbGYuZGF0YQorICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuZGF0YSkKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6IHJldHVybiBzZWxmLmRhdGFbaV0KKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaSwgaXRlbSk6IHNlbGYuZGF0YVtpXSA9IGl0ZW0KKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgaSk6IGRlbCBzZWxmLmRhdGFbaV0KKyAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOgorICAgICAgICBpID0gbWF4KGksIDApOyBqID0gbWF4KGosIDApCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGFbaTpqXSkKKyAgICBkZWYgX19zZXRzbGljZV9fKHNlbGYsIGksIGosIG90aGVyKToKKyAgICAgICAgaSA9IG1heChpLCAwKTsgaiA9IG1heChqLCAwKQorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBVc2VyTGlzdCk6CisgICAgICAgICAgICBzZWxmLmRhdGFbaTpqXSA9IG90aGVyLmRhdGEKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCB0eXBlKHNlbGYuZGF0YSkpOgorICAgICAgICAgICAgc2VsZi5kYXRhW2k6al0gPSBvdGhlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kYXRhW2k6al0gPSBsaXN0KG90aGVyKQorICAgIGRlZiBfX2RlbHNsaWNlX18oc2VsZiwgaSwgaik6CisgICAgICAgIGkgPSBtYXgoaSwgMCk7IGogPSBtYXgoaiwgMCkKKyAgICAgICAgZGVsIHNlbGYuZGF0YVtpOmpdCisgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBVc2VyTGlzdCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgb3RoZXIuZGF0YSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCB0eXBlKHNlbGYuZGF0YSkpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YSArIG90aGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YSArIGxpc3Qob3RoZXIpKQorICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFVzZXJMaXN0KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhvdGhlci5kYXRhICsgc2VsZi5kYXRhKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR5cGUoc2VsZi5kYXRhKSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18ob3RoZXIgKyBzZWxmLmRhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18obGlzdChvdGhlcikgKyBzZWxmLmRhdGEpCisgICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVXNlckxpc3QpOgorICAgICAgICAgICAgc2VsZi5kYXRhICs9IG90aGVyLmRhdGEKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCB0eXBlKHNlbGYuZGF0YSkpOgorICAgICAgICAgICAgc2VsZi5kYXRhICs9IG90aGVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRhdGEgKz0gbGlzdChvdGhlcikKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgX19tdWxfXyhzZWxmLCBuKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YSpuKQorICAgIF9fcm11bF9fID0gX19tdWxfXworICAgIGRlZiBfX2ltdWxfXyhzZWxmLCBuKToKKyAgICAgICAgc2VsZi5kYXRhICo9IG4KKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgYXBwZW5kKHNlbGYsIGl0ZW0pOiBzZWxmLmRhdGEuYXBwZW5kKGl0ZW0pCisgICAgZGVmIGluc2VydChzZWxmLCBpLCBpdGVtKTogc2VsZi5kYXRhLmluc2VydChpLCBpdGVtKQorICAgIGRlZiBwb3Aoc2VsZiwgaT0tMSk6IHJldHVybiBzZWxmLmRhdGEucG9wKGkpCisgICAgZGVmIHJlbW92ZShzZWxmLCBpdGVtKTogc2VsZi5kYXRhLnJlbW92ZShpdGVtKQorICAgIGRlZiBjb3VudChzZWxmLCBpdGVtKTogcmV0dXJuIHNlbGYuZGF0YS5jb3VudChpdGVtKQorICAgIGRlZiBpbmRleChzZWxmLCBpdGVtLCAqYXJncyk6IHJldHVybiBzZWxmLmRhdGEuaW5kZXgoaXRlbSwgKmFyZ3MpCisgICAgZGVmIHJldmVyc2Uoc2VsZik6IHNlbGYuZGF0YS5yZXZlcnNlKCkKKyAgICBkZWYgc29ydChzZWxmLCAqYXJncywgKiprd2RzKTogc2VsZi5kYXRhLnNvcnQoKmFyZ3MsICoqa3dkcykKKyAgICBkZWYgZXh0ZW5kKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVXNlckxpc3QpOgorICAgICAgICAgICAgc2VsZi5kYXRhLmV4dGVuZChvdGhlci5kYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kYXRhLmV4dGVuZChvdGhlcikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvVXNlckxpc3QucHljIGIvbGliL3B5dGhvbjIuNy9Vc2VyTGlzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhmMGM0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvVXNlckxpc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvVXNlckxpc3QucHlvIGIvbGliL3B5dGhvbjIuNy9Vc2VyTGlzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhmMGM0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvVXNlckxpc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvVXNlclN0cmluZy5weSBiL2xpYi9weXRob24yLjcvVXNlclN0cmluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MjZiM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Vc2VyU3RyaW5nLnB5CkBAIC0wLDAgKzEsMjI4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMjIHZpbTp0cz00OmV0Om5vd3JhcAorIiIiQSB1c2VyLWRlZmluZWQgd3JhcHBlciBhcm91bmQgc3RyaW5nIG9iamVjdHMKKworTm90ZTogc3RyaW5nIG9iamVjdHMgaGF2ZSBncm93biBtZXRob2RzIGluIFB5dGhvbiAxLjYKK1RoaXMgbW9kdWxlIHJlcXVpcmVzIFB5dGhvbiAxLjYgb3IgbGF0ZXIuCisiIiIKK2ltcG9ydCBzeXMKK2ltcG9ydCBjb2xsZWN0aW9ucworCitfX2FsbF9fID0gWyJVc2VyU3RyaW5nIiwiTXV0YWJsZVN0cmluZyJdCisKK2NsYXNzIFVzZXJTdHJpbmcoY29sbGVjdGlvbnMuU2VxdWVuY2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXEpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlcSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZXEKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlcSwgVXNlclN0cmluZyk6CisgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZXEuZGF0YVs6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kYXRhID0gc3RyKHNlcSkKKyAgICBkZWYgX19zdHJfXyhzZWxmKTogcmV0dXJuIHN0cihzZWxmLmRhdGEpCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOiByZXR1cm4gcmVwcihzZWxmLmRhdGEpCisgICAgZGVmIF9faW50X18oc2VsZik6IHJldHVybiBpbnQoc2VsZi5kYXRhKQorICAgIGRlZiBfX2xvbmdfXyhzZWxmKTogcmV0dXJuIGxvbmcoc2VsZi5kYXRhKQorICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6IHJldHVybiBmbG9hdChzZWxmLmRhdGEpCisgICAgZGVmIF9fY29tcGxleF9fKHNlbGYpOiByZXR1cm4gY29tcGxleChzZWxmLmRhdGEpCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOiByZXR1cm4gaGFzaChzZWxmLmRhdGEpCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBzdHJpbmcpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHN0cmluZywgVXNlclN0cmluZyk6CisgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZGF0YSwgc3RyaW5nLmRhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZGF0YSwgc3RyaW5nKQorICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgY2hhcik6CisgICAgICAgIHJldHVybiBjaGFyIGluIHNlbGYuZGF0YQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiBsZW4oc2VsZi5kYXRhKQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGFbaW5kZXhdKQorICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgc3RhcnQsIGVuZCk6CisgICAgICAgIHN0YXJ0ID0gbWF4KHN0YXJ0LCAwKTsgZW5kID0gbWF4KGVuZCwgMCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YVtzdGFydDplbmRdKQorCisgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBVc2VyU3RyaW5nKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEgKyBvdGhlci5kYXRhKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YSArIG90aGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YSArIHN0cihvdGhlcikpCisgICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18ob3RoZXIgKyBzZWxmLmRhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc3RyKG90aGVyKSArIHNlbGYuZGF0YSkKKyAgICBkZWYgX19tdWxfXyhzZWxmLCBuKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YSpuKQorICAgIF9fcm11bF9fID0gX19tdWxfXworICAgIGRlZiBfX21vZF9fKHNlbGYsIGFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICUgYXJncykKKworICAgICMgdGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBkZWZpbmVkIGluIGFscGhhYmV0aWNhbCBvcmRlcjoKKyAgICBkZWYgY2FwaXRhbGl6ZShzZWxmKTogcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5jYXBpdGFsaXplKCkpCisgICAgZGVmIGNlbnRlcihzZWxmLCB3aWR0aCwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLmNlbnRlcih3aWR0aCwgKmFyZ3MpKQorICAgIGRlZiBjb3VudChzZWxmLCBzdWIsIHN0YXJ0PTAsIGVuZD1zeXMubWF4aW50KToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5jb3VudChzdWIsIHN0YXJ0LCBlbmQpCisgICAgZGVmIGRlY29kZShzZWxmLCBlbmNvZGluZz1Ob25lLCBlcnJvcnM9Tm9uZSk6ICMgWFhYIGltcHJvdmUgdGhpcz8KKyAgICAgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgICAgICBpZiBlcnJvcnM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5kZWNvZGUoZW5jb2RpbmcsIGVycm9ycykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEuZGVjb2RlKGVuY29kaW5nKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEuZGVjb2RlKCkpCisgICAgZGVmIGVuY29kZShzZWxmLCBlbmNvZGluZz1Ob25lLCBlcnJvcnM9Tm9uZSk6ICMgWFhYIGltcHJvdmUgdGhpcz8KKyAgICAgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgICAgICBpZiBlcnJvcnM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5lbmNvZGUoZW5jb2RpbmcsIGVycm9ycykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEuZW5jb2RlKGVuY29kaW5nKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEuZW5jb2RlKCkpCisgICAgZGVmIGVuZHN3aXRoKHNlbGYsIHN1ZmZpeCwgc3RhcnQ9MCwgZW5kPXN5cy5tYXhpbnQpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmVuZHN3aXRoKHN1ZmZpeCwgc3RhcnQsIGVuZCkKKyAgICBkZWYgZXhwYW5kdGFicyhzZWxmLCB0YWJzaXplPTgpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLmV4cGFuZHRhYnModGFic2l6ZSkpCisgICAgZGVmIGZpbmQoc2VsZiwgc3ViLCBzdGFydD0wLCBlbmQ9c3lzLm1heGludCk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuZmluZChzdWIsIHN0YXJ0LCBlbmQpCisgICAgZGVmIGluZGV4KHNlbGYsIHN1Yiwgc3RhcnQ9MCwgZW5kPXN5cy5tYXhpbnQpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmluZGV4KHN1Yiwgc3RhcnQsIGVuZCkKKyAgICBkZWYgaXNhbHBoYShzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5pc2FscGhhKCkKKyAgICBkZWYgaXNhbG51bShzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5pc2FsbnVtKCkKKyAgICBkZWYgaXNkZWNpbWFsKHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLmlzZGVjaW1hbCgpCisgICAgZGVmIGlzZGlnaXQoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXNkaWdpdCgpCisgICAgZGVmIGlzbG93ZXIoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXNsb3dlcigpCisgICAgZGVmIGlzbnVtZXJpYyhzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5pc251bWVyaWMoKQorICAgIGRlZiBpc3NwYWNlKHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLmlzc3BhY2UoKQorICAgIGRlZiBpc3RpdGxlKHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLmlzdGl0bGUoKQorICAgIGRlZiBpc3VwcGVyKHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLmlzdXBwZXIoKQorICAgIGRlZiBqb2luKHNlbGYsIHNlcSk6IHJldHVybiBzZWxmLmRhdGEuam9pbihzZXEpCisgICAgZGVmIGxqdXN0KHNlbGYsIHdpZHRoLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEubGp1c3Qod2lkdGgsICphcmdzKSkKKyAgICBkZWYgbG93ZXIoc2VsZik6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEubG93ZXIoKSkKKyAgICBkZWYgbHN0cmlwKHNlbGYsIGNoYXJzPU5vbmUpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLmxzdHJpcChjaGFycykpCisgICAgZGVmIHBhcnRpdGlvbihzZWxmLCBzZXApOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnBhcnRpdGlvbihzZXApCisgICAgZGVmIHJlcGxhY2Uoc2VsZiwgb2xkLCBuZXcsIG1heHNwbGl0PS0xKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5yZXBsYWNlKG9sZCwgbmV3LCBtYXhzcGxpdCkpCisgICAgZGVmIHJmaW5kKHNlbGYsIHN1Yiwgc3RhcnQ9MCwgZW5kPXN5cy5tYXhpbnQpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnJmaW5kKHN1Yiwgc3RhcnQsIGVuZCkKKyAgICBkZWYgcmluZGV4KHNlbGYsIHN1Yiwgc3RhcnQ9MCwgZW5kPXN5cy5tYXhpbnQpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnJpbmRleChzdWIsIHN0YXJ0LCBlbmQpCisgICAgZGVmIHJqdXN0KHNlbGYsIHdpZHRoLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEucmp1c3Qod2lkdGgsICphcmdzKSkKKyAgICBkZWYgcnBhcnRpdGlvbihzZWxmLCBzZXApOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnJwYXJ0aXRpb24oc2VwKQorICAgIGRlZiByc3RyaXAoc2VsZiwgY2hhcnM9Tm9uZSk6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEucnN0cmlwKGNoYXJzKSkKKyAgICBkZWYgc3BsaXQoc2VsZiwgc2VwPU5vbmUsIG1heHNwbGl0PS0xKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5zcGxpdChzZXAsIG1heHNwbGl0KQorICAgIGRlZiByc3BsaXQoc2VsZiwgc2VwPU5vbmUsIG1heHNwbGl0PS0xKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5yc3BsaXQoc2VwLCBtYXhzcGxpdCkKKyAgICBkZWYgc3BsaXRsaW5lcyhzZWxmLCBrZWVwZW5kcz0wKTogcmV0dXJuIHNlbGYuZGF0YS5zcGxpdGxpbmVzKGtlZXBlbmRzKQorICAgIGRlZiBzdGFydHN3aXRoKHNlbGYsIHByZWZpeCwgc3RhcnQ9MCwgZW5kPXN5cy5tYXhpbnQpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnN0YXJ0c3dpdGgocHJlZml4LCBzdGFydCwgZW5kKQorICAgIGRlZiBzdHJpcChzZWxmLCBjaGFycz1Ob25lKTogcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5zdHJpcChjaGFycykpCisgICAgZGVmIHN3YXBjYXNlKHNlbGYpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLnN3YXBjYXNlKCkpCisgICAgZGVmIHRpdGxlKHNlbGYpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLnRpdGxlKCkpCisgICAgZGVmIHRyYW5zbGF0ZShzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEudHJhbnNsYXRlKCphcmdzKSkKKyAgICBkZWYgdXBwZXIoc2VsZik6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEudXBwZXIoKSkKKyAgICBkZWYgemZpbGwoc2VsZiwgd2lkdGgpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLnpmaWxsKHdpZHRoKSkKKworY2xhc3MgTXV0YWJsZVN0cmluZyhVc2VyU3RyaW5nLCBjb2xsZWN0aW9ucy5NdXRhYmxlU2VxdWVuY2UpOgorICAgICIiIm11dGFibGUgc3RyaW5nIG9iamVjdHMKKworICAgIFB5dGhvbiBzdHJpbmdzIGFyZSBpbW11dGFibGUgb2JqZWN0cy4gIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UsIHRoYXQKKyAgICBzdHJpbmdzIG1heSBiZSB1c2VkIGFzIGRpY3Rpb25hcnkga2V5cy4gIElmIHRoaXMgcHJvcGVydHkgaXNuJ3QgbmVlZGVkCisgICAgYW5kIHlvdSBpbnNpc3Qgb24gY2hhbmdpbmcgc3RyaW5nIHZhbHVlcyBpbiBwbGFjZSBpbnN0ZWFkLCB5b3UgbWF5IGNoZWF0CisgICAgYW5kIHVzZSBNdXRhYmxlU3RyaW5nLgorCisgICAgQnV0IHRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgYW4gZWR1Y2F0aW9uYWwgb25lOiB0byBwcmV2ZW50CisgICAgcGVvcGxlIGZyb20gaW52ZW50aW5nIHRoZWlyIG93biBtdXRhYmxlIHN0cmluZyBjbGFzcyBkZXJpdmVkCisgICAgZnJvbSBVc2VyU3RyaW5nIGFuZCB0aGFuIGZvcmdldCB0aGVyZWJ5IHRvIHJlbW92ZSAob3ZlcnJpZGUpIHRoZQorICAgIF9faGFzaF9fIG1ldGhvZCBpbmhlcml0ZWQgZnJvbSBVc2VyU3RyaW5nLiAgVGhpcyB3b3VsZCBsZWFkIHRvCisgICAgZXJyb3JzIHRoYXQgd291bGQgYmUgdmVyeSBoYXJkIHRvIHRyYWNrIGRvd24uCisKKyAgICBBIGZhc3RlciBhbmQgYmV0dGVyIHNvbHV0aW9uIGlzIHRvIHJld3JpdGUgeW91ciBwcm9ncmFtIHVzaW5nIGxpc3RzLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJpbmc9IiIpOgorICAgICAgICBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaworICAgICAgICB3YXJucHkzaygndGhlIGNsYXNzIFVzZXJTdHJpbmcuTXV0YWJsZVN0cmluZyBoYXMgYmVlbiByZW1vdmVkIGluICcKKyAgICAgICAgICAgICAgICAgICAgJ1B5dGhvbiAzLjAnLCBzdGFja2xldmVsPTIpCisgICAgICAgIHNlbGYuZGF0YSA9IHN0cmluZworCisgICAgIyBXZSBpbmhlcml0IG9iamVjdC5fX2hhc2hfXywgc28gd2UgbXVzdCBkZW55IHRoaXMgZXhwbGljaXRseQorICAgIF9faGFzaF9fID0gTm9uZQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCBzdWIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGluZGV4LCBzbGljZSk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHN1YiwgVXNlclN0cmluZyk6CisgICAgICAgICAgICAgICAgc3ViID0gc3ViLmRhdGEKKyAgICAgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc3ViLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICBzdWIgPSBzdHIoc3ViKQorICAgICAgICAgICAgc3RhcnQsIHN0b3AsIHN0ZXAgPSBpbmRleC5pbmRpY2VzKGxlbihzZWxmLmRhdGEpKQorICAgICAgICAgICAgaWYgc3RlcCA9PSAtMToKKyAgICAgICAgICAgICAgICBzdGFydCwgc3RvcCA9IHN0b3ArMSwgc3RhcnQrMQorICAgICAgICAgICAgICAgIHN1YiA9IHN1Yls6Oi0xXQorICAgICAgICAgICAgZWxpZiBzdGVwICE9IDE6CisgICAgICAgICAgICAgICAgIyBYWFgodHdvdXRlcnMpOiBJIGd1ZXNzIHdlIHNob3VsZCBiZSByZWltcGxlbWVudGluZworICAgICAgICAgICAgICAgICMgdGhlIGV4dGVuZGVkIHNsaWNlIGFzc2lnbm1lbnQvZGVsZXRpb24gYWxnb3JpdGhtIGhlcmUuLi4KKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJpbnZhbGlkIHN0ZXAgaW4gc2xpY2luZyBhc3NpZ25tZW50IgorICAgICAgICAgICAgc3RhcnQgPSBtaW4oc3RhcnQsIHN0b3ApCisgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFbOnN0YXJ0XSArIHN1YiArIHNlbGYuZGF0YVtzdG9wOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGluZGV4IDwgMDoKKyAgICAgICAgICAgICAgICBpbmRleCArPSBsZW4oc2VsZi5kYXRhKQorICAgICAgICAgICAgaWYgaW5kZXggPCAwIG9yIGluZGV4ID49IGxlbihzZWxmLmRhdGEpOiByYWlzZSBJbmRleEVycm9yCisgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFbOmluZGV4XSArIHN1YiArIHNlbGYuZGF0YVtpbmRleCsxOl0KKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGluZGV4LCBzbGljZSk6CisgICAgICAgICAgICBzdGFydCwgc3RvcCwgc3RlcCA9IGluZGV4LmluZGljZXMobGVuKHNlbGYuZGF0YSkpCisgICAgICAgICAgICBpZiBzdGVwID09IC0xOgorICAgICAgICAgICAgICAgIHN0YXJ0LCBzdG9wID0gc3RvcCsxLCBzdGFydCsxCisgICAgICAgICAgICBlbGlmIHN0ZXAgIT0gMToKKyAgICAgICAgICAgICAgICAjIFhYWCh0d291dGVycyk6IHNlZSBzYW1lIGJsb2NrIGluIF9fc2V0aXRlbV9fCisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiaW52YWxpZCBzdGVwIGluIHNsaWNpbmcgZGVsZXRpb24iCisgICAgICAgICAgICBzdGFydCA9IG1pbihzdGFydCwgc3RvcCkKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6c3RhcnRdICsgc2VsZi5kYXRhW3N0b3A6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgaW5kZXggPCAwOgorICAgICAgICAgICAgICAgIGluZGV4ICs9IGxlbihzZWxmLmRhdGEpCisgICAgICAgICAgICBpZiBpbmRleCA8IDAgb3IgaW5kZXggPj0gbGVuKHNlbGYuZGF0YSk6IHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6aW5kZXhdICsgc2VsZi5kYXRhW2luZGV4KzE6XQorICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgc3RhcnQsIGVuZCwgc3ViKToKKyAgICAgICAgc3RhcnQgPSBtYXgoc3RhcnQsIDApOyBlbmQgPSBtYXgoZW5kLCAwKQorICAgICAgICBpZiBpc2luc3RhbmNlKHN1YiwgVXNlclN0cmluZyk6CisgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFbOnN0YXJ0XStzdWIuZGF0YStzZWxmLmRhdGFbZW5kOl0KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN1YiwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFbOnN0YXJ0XStzdWIrc2VsZi5kYXRhW2VuZDpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRhdGEgPSAgc2VsZi5kYXRhWzpzdGFydF0rc3RyKHN1Yikrc2VsZi5kYXRhW2VuZDpdCisgICAgZGVmIF9fZGVsc2xpY2VfXyhzZWxmLCBzdGFydCwgZW5kKToKKyAgICAgICAgc3RhcnQgPSBtYXgoc3RhcnQsIDApOyBlbmQgPSBtYXgoZW5kLCAwKQorICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFbOnN0YXJ0XSArIHNlbGYuZGF0YVtlbmQ6XQorICAgIGRlZiBpbW11dGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBVc2VyU3RyaW5nKHNlbGYuZGF0YSkKKyAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBVc2VyU3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYuZGF0YSArPSBvdGhlci5kYXRhCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBzZWxmLmRhdGEgKz0gb3RoZXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSArPSBzdHIob3RoZXIpCisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIF9faW11bF9fKHNlbGYsIG4pOgorICAgICAgICBzZWxmLmRhdGEgKj0gbgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIHZhbHVlKToKKyAgICAgICAgc2VsZltpbmRleDppbmRleF0gPSB2YWx1ZQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICMgZXhlY3V0ZSB0aGUgcmVncmVzc2lvbiB0ZXN0IHRvIHN0ZG91dCwgaWYgY2FsbGVkIGFzIGEgc2NyaXB0OgorICAgIGltcG9ydCBvcworICAgIGNhbGxlZF9pbl9kaXIsIGNhbGxlZF9hcyA9IG9zLnBhdGguc3BsaXQoc3lzLmFyZ3ZbMF0pCisgICAgY2FsbGVkX2FzLCBweSA9IG9zLnBhdGguc3BsaXRleHQoY2FsbGVkX2FzKQorICAgIGlmICctcScgaW4gc3lzLmFyZ3Y6CisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisgICAgICAgIHRlc3Rfc3VwcG9ydC52ZXJib3NlID0gMAorICAgIF9faW1wb3J0X18oJ3Rlc3QudGVzdF8nICsgY2FsbGVkX2FzLmxvd2VyKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1VzZXJTdHJpbmcucHljIGIvbGliL3B5dGhvbjIuNy9Vc2VyU3RyaW5nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQ5ODliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Vc2VyU3RyaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1VzZXJTdHJpbmcucHlvIGIvbGliL3B5dGhvbjIuNy9Vc2VyU3RyaW5nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQ5ODliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Vc2VyU3RyaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19MV1BDb29raWVKYXIucHkgYi9saWIvcHl0aG9uMi43L19MV1BDb29raWVKYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjYzYzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX0xXUENvb2tpZUphci5weQpAQCAtMCwwICsxLDE3MCBAQAorIiIiTG9hZCAvIHNhdmUgdG8gbGlid3d3LXBlcmwgKExXUCkgZm9ybWF0IGZpbGVzLgorCitBY3R1YWxseSwgdGhlIGZvcm1hdCBpcyBzbGlnaHRseSBleHRlbmRlZCBmcm9tIHRoYXQgdXNlZCBieSBMV1AncworKGxpYnd3dy1wZXJsJ3MpIEhUVFA6OkNvb2tpZXMsIHRvIGF2b2lkIGxvc2luZyBzb21lIFJGQyAyOTY1IGluZm9ybWF0aW9uCitub3QgcmVjb3JkZWQgYnkgTFdQLgorCitJdCB1c2VzIHRoZSB2ZXJzaW9uIHN0cmluZyAiMi4wIiwgdGhvdWdoIHJlYWxseSB0aGVyZSBpc24ndCBhbiBMV1AgQ29va2llcworMi4wIGZvcm1hdC4gIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgZXh0cmEgaW5mb3JtYXRpb24gaW4gaGVyZQorKGRvbWFpbl9kb3QgYW5kICMgcG9ydF9zcGVjKSB3aGlsZSBzdGlsbCBiZWluZyBjb21wYXRpYmxlIHdpdGgKK2xpYnd3dy1wZXJsLCBJIGhvcGUuCisKKyIiIgorCitpbXBvcnQgdGltZSwgcmUKK2Zyb20gY29va2llbGliIGltcG9ydCAoX3dhcm5fdW5oYW5kbGVkX2V4Y2VwdGlvbiwgRmlsZUNvb2tpZUphciwgTG9hZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICBDb29raWUsIE1JU1NJTkdfRklMRU5BTUVfVEVYVCwKKyAgICAgICAgICAgICAgICAgICAgICAgam9pbl9oZWFkZXJfd29yZHMsIHNwbGl0X2hlYWRlcl93b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgaXNvMnRpbWUsIHRpbWUyaXNveikKKworZGVmIGx3cF9jb29raWVfc3RyKGNvb2tpZSk6CisgICAgIiIiUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBDb29raWUgaW4gYW4gdGhlIExXUCBjb29raWUgZmlsZSBmb3JtYXQuCisKKyAgICBBY3R1YWxseSwgdGhlIGZvcm1hdCBpcyBleHRlbmRlZCBhIGJpdCAtLSBzZWUgbW9kdWxlIGRvY3N0cmluZy4KKworICAgICIiIgorICAgIGggPSBbKGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUpLAorICAgICAgICAgKCJwYXRoIiwgY29va2llLnBhdGgpLAorICAgICAgICAgKCJkb21haW4iLCBjb29raWUuZG9tYWluKV0KKyAgICBpZiBjb29raWUucG9ydCBpcyBub3QgTm9uZTogaC5hcHBlbmQoKCJwb3J0IiwgY29va2llLnBvcnQpKQorICAgIGlmIGNvb2tpZS5wYXRoX3NwZWNpZmllZDogaC5hcHBlbmQoKCJwYXRoX3NwZWMiLCBOb25lKSkKKyAgICBpZiBjb29raWUucG9ydF9zcGVjaWZpZWQ6IGguYXBwZW5kKCgicG9ydF9zcGVjIiwgTm9uZSkpCisgICAgaWYgY29va2llLmRvbWFpbl9pbml0aWFsX2RvdDogaC5hcHBlbmQoKCJkb21haW5fZG90IiwgTm9uZSkpCisgICAgaWYgY29va2llLnNlY3VyZTogaC5hcHBlbmQoKCJzZWN1cmUiLCBOb25lKSkKKyAgICBpZiBjb29raWUuZXhwaXJlczogaC5hcHBlbmQoKCJleHBpcmVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lMmlzb3ooZmxvYXQoY29va2llLmV4cGlyZXMpKSkpCisgICAgaWYgY29va2llLmRpc2NhcmQ6IGguYXBwZW5kKCgiZGlzY2FyZCIsIE5vbmUpKQorICAgIGlmIGNvb2tpZS5jb21tZW50OiBoLmFwcGVuZCgoImNvbW1lbnQiLCBjb29raWUuY29tbWVudCkpCisgICAgaWYgY29va2llLmNvbW1lbnRfdXJsOiBoLmFwcGVuZCgoImNvbW1lbnR1cmwiLCBjb29raWUuY29tbWVudF91cmwpKQorCisgICAga2V5cyA9IGNvb2tpZS5fcmVzdC5rZXlzKCkKKyAgICBrZXlzLnNvcnQoKQorICAgIGZvciBrIGluIGtleXM6CisgICAgICAgIGguYXBwZW5kKChrLCBzdHIoY29va2llLl9yZXN0W2tdKSkpCisKKyAgICBoLmFwcGVuZCgoInZlcnNpb24iLCBzdHIoY29va2llLnZlcnNpb24pKSkKKworICAgIHJldHVybiBqb2luX2hlYWRlcl93b3JkcyhbaF0pCisKK2NsYXNzIExXUENvb2tpZUphcihGaWxlQ29va2llSmFyKToKKyAgICAiIiIKKyAgICBUaGUgTFdQQ29va2llSmFyIHNhdmVzIGEgc2VxdWVuY2Ugb2YgIlNldC1Db29raWUzIiBsaW5lcy4KKyAgICAiU2V0LUNvb2tpZTMiIGlzIHRoZSBmb3JtYXQgdXNlZCBieSB0aGUgbGlid3d3LXBlcmwgbGliYXJ5LCBub3Qga25vd24KKyAgICB0byBiZSBjb21wYXRpYmxlIHdpdGggYW55IGJyb3dzZXIsIGJ1dCB3aGljaCBpcyBlYXN5IHRvIHJlYWQgYW5kCisgICAgZG9lc24ndCBsb3NlIGluZm9ybWF0aW9uIGFib3V0IFJGQyAyOTY1IGNvb2tpZXMuCisKKyAgICBBZGRpdGlvbmFsIG1ldGhvZHMKKworICAgIGFzX2x3cF9zdHIoaWdub3JlX2Rpc2NhcmQ9VHJ1ZSwgaWdub3JlX2V4cGlyZWQ9VHJ1ZSkKKworICAgICIiIgorCisgICAgZGVmIGFzX2x3cF9zdHIoc2VsZiwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSwgaWdub3JlX2V4cGlyZXM9VHJ1ZSk6CisgICAgICAgICIiIlJldHVybiBjb29raWVzIGFzIGEgc3RyaW5nIG9mICJcXG4iLXNlcGFyYXRlZCAiU2V0LUNvb2tpZTMiIGhlYWRlcnMuCisKKyAgICAgICAgaWdub3JlX2Rpc2NhcmQgYW5kIGlnbm9yZV9leHBpcmVzOiBzZWUgZG9jc3RyaW5nIGZvciBGaWxlQ29va2llSmFyLnNhdmUKKworICAgICAgICAiIiIKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgciA9IFtdCisgICAgICAgIGZvciBjb29raWUgaW4gc2VsZjoKKyAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVfZGlzY2FyZCBhbmQgY29va2llLmRpc2NhcmQ6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVfZXhwaXJlcyBhbmQgY29va2llLmlzX2V4cGlyZWQobm93KToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgci5hcHBlbmQoIlNldC1Db29raWUzOiAlcyIgJSBsd3BfY29va2llX3N0cihjb29raWUpKQorICAgICAgICByZXR1cm4gIlxuIi5qb2luKHIrWyIiXSkKKworICAgIGRlZiBzYXZlKHNlbGYsIGZpbGVuYW1lPU5vbmUsIGlnbm9yZV9kaXNjYXJkPUZhbHNlLCBpZ25vcmVfZXhwaXJlcz1GYWxzZSk6CisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmZpbGVuYW1lIGlzIG5vdCBOb25lOiBmaWxlbmFtZSA9IHNlbGYuZmlsZW5hbWUKKyAgICAgICAgICAgIGVsc2U6IHJhaXNlIFZhbHVlRXJyb3IoTUlTU0lOR19GSUxFTkFNRV9URVhUKQorCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgVGhlcmUgcmVhbGx5IGlzbid0IGFuIExXUCBDb29raWVzIDIuMCBmb3JtYXQsIGJ1dCB0aGlzIGluZGljYXRlcworICAgICAgICAgICAgIyB0aGF0IHRoZXJlIGlzIGV4dHJhIGluZm9ybWF0aW9uIGluIGhlcmUgKGRvbWFpbl9kb3QgYW5kCisgICAgICAgICAgICAjIHBvcnRfc3BlYykgd2hpbGUgc3RpbGwgYmVpbmcgY29tcGF0aWJsZSB3aXRoIGxpYnd3dy1wZXJsLCBJIGhvcGUuCisgICAgICAgICAgICBmLndyaXRlKCIjTFdQLUNvb2tpZXMtMi4wXG4iKQorICAgICAgICAgICAgZi53cml0ZShzZWxmLmFzX2x3cF9zdHIoaWdub3JlX2Rpc2NhcmQsIGlnbm9yZV9leHBpcmVzKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIF9yZWFsbHlfbG9hZChzZWxmLCBmLCBmaWxlbmFtZSwgaWdub3JlX2Rpc2NhcmQsIGlnbm9yZV9leHBpcmVzKToKKyAgICAgICAgbWFnaWMgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IHJlLnNlYXJjaChzZWxmLm1hZ2ljX3JlLCBtYWdpYyk6CisgICAgICAgICAgICBtc2cgPSAoIiVyIGRvZXMgbm90IGxvb2sgbGlrZSBhIFNldC1Db29raWUzIChMV1ApIGZvcm1hdCAiCisgICAgICAgICAgICAgICAgICAgImZpbGUiICUgZmlsZW5hbWUpCisgICAgICAgICAgICByYWlzZSBMb2FkRXJyb3IobXNnKQorCisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisKKyAgICAgICAgaGVhZGVyID0gIlNldC1Db29raWUzOiIKKyAgICAgICAgYm9vbGVhbl9hdHRycyA9ICgicG9ydF9zcGVjIiwgInBhdGhfc3BlYyIsICJkb21haW5fZG90IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2VjdXJlIiwgImRpc2NhcmQiKQorICAgICAgICB2YWx1ZV9hdHRycyA9ICgidmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiwgInBhdGgiLCAiZG9tYWluIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGlyZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAiY29tbWVudCIsICJjb21tZW50dXJsIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICIiOiBicmVhaworICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoaGVhZGVyKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVtsZW4oaGVhZGVyKTpdLnN0cmlwKCkKKworICAgICAgICAgICAgICAgIGZvciBkYXRhIGluIHNwbGl0X2hlYWRlcl93b3JkcyhbbGluZV0pOgorICAgICAgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSA9IGRhdGFbMF0KKyAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgPSB7fQorICAgICAgICAgICAgICAgICAgICByZXN0ID0ge30KKyAgICAgICAgICAgICAgICAgICAgZm9yIGsgaW4gYm9vbGVhbl9hdHRyczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkW2tdID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gZGF0YVsxOl06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjID0gay5sb3dlcigpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBsb3NlIGNhc2UgZGlzdGluY3Rpb24gZm9yIHVua25vd24gZmllbGRzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGMgaW4gdmFsdWVfYXR0cnMpIG9yIChsYyBpbiBib29sZWFuX2F0dHJzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gbGMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGsgaW4gYm9vbGVhbl9hdHRyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB2IGlzIE5vbmU6IHYgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRba10gPSB2CisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGsgaW4gdmFsdWVfYXR0cnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRba10gPSB2CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3Rba10gPSB2CisKKyAgICAgICAgICAgICAgICAgICAgaCA9IHN0YW5kYXJkLmdldAorICAgICAgICAgICAgICAgICAgICBleHBpcmVzID0gaCgiZXhwaXJlcyIpCisgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSBoKCJkaXNjYXJkIikKKyAgICAgICAgICAgICAgICAgICAgaWYgZXhwaXJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMgPSBpc28ydGltZShleHBpcmVzKQorICAgICAgICAgICAgICAgICAgICBpZiBleHBpcmVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBkb21haW4gPSBoKCJkb21haW4iKQorICAgICAgICAgICAgICAgICAgICBkb21haW5fc3BlY2lmaWVkID0gZG9tYWluLnN0YXJ0c3dpdGgoIi4iKQorICAgICAgICAgICAgICAgICAgICBjID0gQ29va2llKGgoInZlcnNpb24iKSwgbmFtZSwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCgicG9ydCIpLCBoKCJwb3J0X3NwZWMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4sIGRvbWFpbl9zcGVjaWZpZWQsIGgoImRvbWFpbl9kb3QiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKCJwYXRoIiksIGgoInBhdGhfc3BlYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgoInNlY3VyZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKCJjb21tZW50IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCgiY29tbWVudHVybCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3QpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVfZGlzY2FyZCBhbmQgYy5kaXNjYXJkOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9leHBpcmVzIGFuZCBjLmlzX2V4cGlyZWQobm93KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0X2Nvb2tpZShjKQorCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIF93YXJuX3VuaGFuZGxlZF9leGNlcHRpb24oKQorICAgICAgICAgICAgcmFpc2UgTG9hZEVycm9yKCJpbnZhbGlkIFNldC1Db29raWUzIGZvcm1hdCBmaWxlICVyOiAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlbmFtZSwgbGluZSkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19MV1BDb29raWVKYXIucHljIGIvbGliL3B5dGhvbjIuNy9fTFdQQ29va2llSmFyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzhmZjMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fTFdQQ29va2llSmFyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19MV1BDb29raWVKYXIucHlvIGIvbGliL3B5dGhvbjIuNy9fTFdQQ29va2llSmFyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzhmZjMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fTFdQQ29va2llSmFyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19Nb3ppbGxhQ29va2llSmFyLnB5IGIvbGliL3B5dGhvbjIuNy9fTW96aWxsYUNvb2tpZUphci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGU4YmNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fTW96aWxsYUNvb2tpZUphci5weQpAQCAtMCwwICsxLDE0OSBAQAorIiIiTW96aWxsYSAvIE5ldHNjYXBlIGNvb2tpZSBsb2FkaW5nIC8gc2F2aW5nLiIiIgorCitpbXBvcnQgcmUsIHRpbWUKKworZnJvbSBjb29raWVsaWIgaW1wb3J0IChfd2Fybl91bmhhbmRsZWRfZXhjZXB0aW9uLCBGaWxlQ29va2llSmFyLCBMb2FkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgIENvb2tpZSwgTUlTU0lOR19GSUxFTkFNRV9URVhUKQorCitjbGFzcyBNb3ppbGxhQ29va2llSmFyKEZpbGVDb29raWVKYXIpOgorICAgICIiIgorCisgICAgV0FSTklORzogeW91IG1heSB3YW50IHRvIGJhY2t1cCB5b3VyIGJyb3dzZXIncyBjb29raWVzIGZpbGUgaWYgeW91IHVzZQorICAgIHRoaXMgY2xhc3MgdG8gc2F2ZSBjb29raWVzLiAgSSAqdGhpbmsqIGl0IHdvcmtzLCBidXQgdGhlcmUgaGF2ZSBiZWVuCisgICAgYnVncyBpbiB0aGUgcGFzdCEKKworICAgIFRoaXMgY2xhc3MgZGlmZmVycyBmcm9tIENvb2tpZUphciBvbmx5IGluIHRoZSBmb3JtYXQgaXQgdXNlcyB0byBzYXZlIGFuZAorICAgIGxvYWQgY29va2llcyB0byBhbmQgZnJvbSBhIGZpbGUuICBUaGlzIGNsYXNzIHVzZXMgdGhlIE1vemlsbGEvTmV0c2NhcGUKKyAgICBgY29va2llcy50eHQnIGZvcm1hdC4gIGx5bnggdXNlcyB0aGlzIGZpbGUgZm9ybWF0LCB0b28uCisKKyAgICBEb24ndCBleHBlY3QgY29va2llcyBzYXZlZCB3aGlsZSB0aGUgYnJvd3NlciBpcyBydW5uaW5nIHRvIGJlIG5vdGljZWQgYnkKKyAgICB0aGUgYnJvd3NlciAoaW4gZmFjdCwgTW96aWxsYSBvbiB1bml4IHdpbGwgb3ZlcndyaXRlIHlvdXIgc2F2ZWQgY29va2llcyBpZgorICAgIHlvdSBjaGFuZ2UgdGhlbSBvbiBkaXNrIHdoaWxlIGl0J3MgcnVubmluZzsgb24gV2luZG93cywgeW91IHByb2JhYmx5IGNhbid0CisgICAgc2F2ZSBhdCBhbGwgd2hpbGUgdGhlIGJyb3dzZXIgaXMgcnVubmluZykuCisKKyAgICBOb3RlIHRoYXQgdGhlIE1vemlsbGEvTmV0c2NhcGUgZm9ybWF0IHdpbGwgZG93bmdyYWRlIFJGQzI5NjUgY29va2llcyB0bworICAgIE5ldHNjYXBlIGNvb2tpZXMgb24gc2F2aW5nLgorCisgICAgSW4gcGFydGljdWxhciwgdGhlIGNvb2tpZSB2ZXJzaW9uIGFuZCBwb3J0IG51bWJlciBpbmZvcm1hdGlvbiBpcyBsb3N0LAorICAgIHRvZ2V0aGVyIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBvciBub3QgUGF0aCwgUG9ydCBhbmQgRGlzY2FyZCB3ZXJlCisgICAgc3BlY2lmaWVkIGJ5IHRoZSBTZXQtQ29va2llMiAob3IgU2V0LUNvb2tpZSkgaGVhZGVyLCBhbmQgd2hldGhlciBvciBub3QgdGhlCisgICAgZG9tYWluIGFzIHNldCBpbiB0aGUgSFRUUCBoZWFkZXIgc3RhcnRlZCB3aXRoIGEgZG90ICh5ZXMsIEknbSBhd2FyZSBzb21lCisgICAgZG9tYWlucyBpbiBOZXRzY2FwZSBmaWxlcyBzdGFydCB3aXRoIGEgZG90IGFuZCBzb21lIGRvbid0IC0tIHRydXN0IG1lLCB5b3UKKyAgICByZWFsbHkgZG9uJ3Qgd2FudCB0byBrbm93IGFueSBtb3JlIGFib3V0IHRoaXMpLgorCisgICAgTm90ZSB0aGF0IHRob3VnaCBNb3ppbGxhIGFuZCBOZXRzY2FwZSB1c2UgdGhlIHNhbWUgZm9ybWF0LCB0aGV5IHVzZQorICAgIHNsaWdodGx5IGRpZmZlcmVudCBoZWFkZXJzLiAgVGhlIGNsYXNzIHNhdmVzIGNvb2tpZXMgdXNpbmcgdGhlIE5ldHNjYXBlCisgICAgaGVhZGVyIGJ5IGRlZmF1bHQgKE1vemlsbGEgY2FuIGNvcGUgd2l0aCB0aGF0KS4KKworICAgICIiIgorICAgIG1hZ2ljX3JlID0gIiMoIE5ldHNjYXBlKT8gSFRUUCBDb29raWUgRmlsZSIKKyAgICBoZWFkZXIgPSAiIiJcCisjIE5ldHNjYXBlIEhUVFAgQ29va2llIEZpbGUKKyMgaHR0cDovL3d3dy5uZXRzY2FwZS5jb20vbmV3c3JlZi9zdGQvY29va2llX3NwZWMuaHRtbAorIyBUaGlzIGlzIGEgZ2VuZXJhdGVkIGZpbGUhICBEbyBub3QgZWRpdC4KKworIiIiCisKKyAgICBkZWYgX3JlYWxseV9sb2FkKHNlbGYsIGYsIGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZCwgaWdub3JlX2V4cGlyZXMpOgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorCisgICAgICAgIG1hZ2ljID0gZi5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCByZS5zZWFyY2goc2VsZi5tYWdpY19yZSwgbWFnaWMpOgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICByYWlzZSBMb2FkRXJyb3IoCisgICAgICAgICAgICAgICAgIiVyIGRvZXMgbm90IGxvb2sgbGlrZSBhIE5ldHNjYXBlIGZvcm1hdCBjb29raWVzIGZpbGUiICUKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICIiOiBicmVhaworCisgICAgICAgICAgICAgICAgIyBsYXN0IGZpZWxkIG1heSBiZSBhYnNlbnQsIHNvIGtlZXAgYW55IHRyYWlsaW5nIHRhYgorICAgICAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoIlxuIik6IGxpbmUgPSBsaW5lWzotMV0KKworICAgICAgICAgICAgICAgICMgc2tpcCBjb21tZW50cyBhbmQgYmxhbmsgbGluZXMgWFhYIHdoYXQgaXMgJCBmb3I/CisgICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RyaXAoKS5zdGFydHN3aXRoKCgiIyIsICIkIikpIG9yCisgICAgICAgICAgICAgICAgICAgIGxpbmUuc3RyaXAoKSA9PSAiIik6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBkb21haW4sIGRvbWFpbl9zcGVjaWZpZWQsIHBhdGgsIHNlY3VyZSwgZXhwaXJlcywgbmFtZSwgdmFsdWUgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnNwbGl0KCJcdCIpCisgICAgICAgICAgICAgICAgc2VjdXJlID0gKHNlY3VyZSA9PSAiVFJVRSIpCisgICAgICAgICAgICAgICAgZG9tYWluX3NwZWNpZmllZCA9IChkb21haW5fc3BlY2lmaWVkID09ICJUUlVFIikKKyAgICAgICAgICAgICAgICBpZiBuYW1lID09ICIiOgorICAgICAgICAgICAgICAgICAgICAjIGNvb2tpZXMudHh0IHJlZ2FyZHMgJ1NldC1Db29raWU6IGZvbycgYXMgYSBjb29raWUKKyAgICAgICAgICAgICAgICAgICAgIyB3aXRoIG5vIG5hbWUsIHdoZXJlYXMgY29va2llbGliIHJlZ2FyZHMgaXQgYXMgYQorICAgICAgICAgICAgICAgICAgICAjIGNvb2tpZSB3aXRoIG5vIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOb25lCisKKyAgICAgICAgICAgICAgICBpbml0aWFsX2RvdCA9IGRvbWFpbi5zdGFydHN3aXRoKCIuIikKKyAgICAgICAgICAgICAgICBhc3NlcnQgZG9tYWluX3NwZWNpZmllZCA9PSBpbml0aWFsX2RvdAorCisgICAgICAgICAgICAgICAgZGlzY2FyZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgaWYgZXhwaXJlcyA9PSAiIjoKKyAgICAgICAgICAgICAgICAgICAgZXhwaXJlcyA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgZGlzY2FyZCA9IFRydWUKKworICAgICAgICAgICAgICAgICMgYXNzdW1lIHBhdGhfc3BlY2lmaWVkIGlzIGZhbHNlCisgICAgICAgICAgICAgICAgYyA9IENvb2tpZSgwLCBuYW1lLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluLCBkb21haW5fc3BlY2lmaWVkLCBpbml0aWFsX2RvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9KQorICAgICAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVfZGlzY2FyZCBhbmQgYy5kaXNjYXJkOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVfZXhwaXJlcyBhbmQgYy5pc19leHBpcmVkKG5vdyk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5zZXRfY29va2llKGMpCisKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgX3dhcm5fdW5oYW5kbGVkX2V4Y2VwdGlvbigpCisgICAgICAgICAgICByYWlzZSBMb2FkRXJyb3IoImludmFsaWQgTmV0c2NhcGUgZm9ybWF0IGNvb2tpZXMgZmlsZSAlcjogJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZW5hbWUsIGxpbmUpKQorCisgICAgZGVmIHNhdmUoc2VsZiwgZmlsZW5hbWU9Tm9uZSwgaWdub3JlX2Rpc2NhcmQ9RmFsc2UsIGlnbm9yZV9leHBpcmVzPUZhbHNlKToKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZmlsZW5hbWUgaXMgbm90IE5vbmU6IGZpbGVuYW1lID0gc2VsZi5maWxlbmFtZQorICAgICAgICAgICAgZWxzZTogcmFpc2UgVmFsdWVFcnJvcihNSVNTSU5HX0ZJTEVOQU1FX1RFWFQpCisKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZShzZWxmLmhlYWRlcikKKyAgICAgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgICAgICBmb3IgY29va2llIGluIHNlbGY6CisgICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9kaXNjYXJkIGFuZCBjb29raWUuZGlzY2FyZDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBub3QgaWdub3JlX2V4cGlyZXMgYW5kIGNvb2tpZS5pc19leHBpcmVkKG5vdyk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgY29va2llLnNlY3VyZTogc2VjdXJlID0gIlRSVUUiCisgICAgICAgICAgICAgICAgZWxzZTogc2VjdXJlID0gIkZBTFNFIgorICAgICAgICAgICAgICAgIGlmIGNvb2tpZS5kb21haW4uc3RhcnRzd2l0aCgiLiIpOiBpbml0aWFsX2RvdCA9ICJUUlVFIgorICAgICAgICAgICAgICAgIGVsc2U6IGluaXRpYWxfZG90ID0gIkZBTFNFIgorICAgICAgICAgICAgICAgIGlmIGNvb2tpZS5leHBpcmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBleHBpcmVzID0gc3RyKGNvb2tpZS5leHBpcmVzKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMgPSAiIgorICAgICAgICAgICAgICAgIGlmIGNvb2tpZS52YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAjIGNvb2tpZXMudHh0IHJlZ2FyZHMgJ1NldC1Db29raWU6IGZvbycgYXMgYSBjb29raWUKKyAgICAgICAgICAgICAgICAgICAgIyB3aXRoIG5vIG5hbWUsIHdoZXJlYXMgY29va2llbGliIHJlZ2FyZHMgaXQgYXMgYQorICAgICAgICAgICAgICAgICAgICAjIGNvb2tpZSB3aXRoIG5vIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb29raWUubmFtZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBjb29raWUubmFtZQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvb2tpZS52YWx1ZQorICAgICAgICAgICAgICAgIGYud3JpdGUoCisgICAgICAgICAgICAgICAgICAgICJcdCIuam9pbihbY29va2llLmRvbWFpbiwgaW5pdGlhbF9kb3QsIGNvb2tpZS5wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZSwgZXhwaXJlcywgbmFtZSwgdmFsdWVdKSsKKyAgICAgICAgICAgICAgICAgICAgIlxuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fTW96aWxsYUNvb2tpZUphci5weWMgYi9saWIvcHl0aG9uMi43L19Nb3ppbGxhQ29va2llSmFyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDA2ODdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fTW96aWxsYUNvb2tpZUphci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fTW96aWxsYUNvb2tpZUphci5weW8gYi9saWIvcHl0aG9uMi43L19Nb3ppbGxhQ29va2llSmFyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjJiZmUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fTW96aWxsYUNvb2tpZUphci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fX2Z1dHVyZV9fLnB5IGIvbGliL3B5dGhvbjIuNy9fX2Z1dHVyZV9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOTk2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19fZnV0dXJlX18ucHkKQEAgLTAsMCArMSwxMjggQEAKKyIiIlJlY29yZCBvZiBwaGFzZWQtaW4gaW5jb21wYXRpYmxlIGxhbmd1YWdlIGNoYW5nZXMuCisKK0VhY2ggbGluZSBpcyBvZiB0aGUgZm9ybToKKworICAgIEZlYXR1cmVOYW1lID0gIl9GZWF0dXJlKCIgT3B0aW9uYWxSZWxlYXNlICIsIiBNYW5kYXRvcnlSZWxlYXNlICIsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZXJGbGFnICIpIgorCit3aGVyZSwgbm9ybWFsbHksIE9wdGlvbmFsUmVsZWFzZSA8IE1hbmRhdG9yeVJlbGVhc2UsIGFuZCBib3RoIGFyZSA1LXR1cGxlcworb2YgdGhlIHNhbWUgZm9ybSBhcyBzeXMudmVyc2lvbl9pbmZvOgorCisgICAgKFBZX01BSk9SX1ZFUlNJT04sICMgdGhlIDIgaW4gMi4xLjBhMzsgYW4gaW50CisgICAgIFBZX01JTk9SX1ZFUlNJT04sICMgdGhlIDE7IGFuIGludAorICAgICBQWV9NSUNST19WRVJTSU9OLCAjIHRoZSAwOyBhbiBpbnQKKyAgICAgUFlfUkVMRUFTRV9MRVZFTCwgIyAiYWxwaGEiLCAiYmV0YSIsICJjYW5kaWRhdGUiIG9yICJmaW5hbCI7IHN0cmluZworICAgICBQWV9SRUxFQVNFX1NFUklBTCAjIHRoZSAzOyBhbiBpbnQKKyAgICApCisKK09wdGlvbmFsUmVsZWFzZSByZWNvcmRzIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoCisKKyAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IEZlYXR1cmVOYW1lCisKK3dhcyBhY2NlcHRlZC4KKworSW4gdGhlIGNhc2Ugb2YgTWFuZGF0b3J5UmVsZWFzZXMgdGhhdCBoYXZlIG5vdCB5ZXQgb2NjdXJyZWQsCitNYW5kYXRvcnlSZWxlYXNlIHByZWRpY3RzIHRoZSByZWxlYXNlIGluIHdoaWNoIHRoZSBmZWF0dXJlIHdpbGwgYmVjb21lIHBhcnQKK29mIHRoZSBsYW5ndWFnZS4KKworRWxzZSBNYW5kYXRvcnlSZWxlYXNlIHJlY29yZHMgd2hlbiB0aGUgZmVhdHVyZSBiZWNhbWUgcGFydCBvZiB0aGUgbGFuZ3VhZ2U7CitpbiByZWxlYXNlcyBhdCBvciBhZnRlciB0aGF0LCBtb2R1bGVzIG5vIGxvbmdlciBuZWVkCisKKyAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IEZlYXR1cmVOYW1lCisKK3RvIHVzZSB0aGUgZmVhdHVyZSBpbiBxdWVzdGlvbiwgYnV0IG1heSBjb250aW51ZSB0byB1c2Ugc3VjaCBpbXBvcnRzLgorCitNYW5kYXRvcnlSZWxlYXNlIG1heSBhbHNvIGJlIE5vbmUsIG1lYW5pbmcgdGhhdCBhIHBsYW5uZWQgZmVhdHVyZSBnb3QKK2Ryb3BwZWQuCisKK0luc3RhbmNlcyBvZiBjbGFzcyBfRmVhdHVyZSBoYXZlIHR3byBjb3JyZXNwb25kaW5nIG1ldGhvZHMsCisuZ2V0T3B0aW9uYWxSZWxlYXNlKCkgYW5kIC5nZXRNYW5kYXRvcnlSZWxlYXNlKCkuCisKK0NvbXBpbGVyRmxhZyBpcyB0aGUgKGJpdGZpZWxkKSBmbGFnIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBpbiB0aGUgZm91cnRoCithcmd1bWVudCB0byB0aGUgYnVpbHRpbiBmdW5jdGlvbiBjb21waWxlKCkgdG8gZW5hYmxlIHRoZSBmZWF0dXJlIGluCitkeW5hbWljYWxseSBjb21waWxlZCBjb2RlLiAgVGhpcyBmbGFnIGlzIHN0b3JlZCBpbiB0aGUgLmNvbXBpbGVyX2ZsYWcKK2F0dHJpYnV0ZSBvbiBfRnV0dXJlIGluc3RhbmNlcy4gIFRoZXNlIHZhbHVlcyBtdXN0IG1hdGNoIHRoZSBhcHByb3ByaWF0ZQorI2RlZmluZXMgb2YgQ09feHh4IGZsYWdzIGluIEluY2x1ZGUvY29tcGlsZS5oLgorCitObyBmZWF0dXJlIGxpbmUgaXMgZXZlciB0byBiZSBkZWxldGVkIGZyb20gdGhpcyBmaWxlLgorIiIiCisKK2FsbF9mZWF0dXJlX25hbWVzID0gWworICAgICJuZXN0ZWRfc2NvcGVzIiwKKyAgICAiZ2VuZXJhdG9ycyIsCisgICAgImRpdmlzaW9uIiwKKyAgICAiYWJzb2x1dGVfaW1wb3J0IiwKKyAgICAid2l0aF9zdGF0ZW1lbnQiLAorICAgICJwcmludF9mdW5jdGlvbiIsCisgICAgInVuaWNvZGVfbGl0ZXJhbHMiLAorXQorCitfX2FsbF9fID0gWyJhbGxfZmVhdHVyZV9uYW1lcyJdICsgYWxsX2ZlYXR1cmVfbmFtZXMKKworIyBUaGUgQ09feHh4IHN5bWJvbHMgYXJlIGRlZmluZWQgaGVyZSB1bmRlciB0aGUgc2FtZSBuYW1lcyB1c2VkIGJ5CisjIGNvbXBpbGUuaCwgc28gdGhhdCBhbiBlZGl0b3Igc2VhcmNoIHdpbGwgZmluZCB0aGVtIGhlcmUuICBIb3dldmVyLAorIyB0aGV5J3JlIG5vdCBleHBvcnRlZCBpbiBfX2FsbF9fLCBiZWNhdXNlIHRoZXkgZG9uJ3QgcmVhbGx5IGJlbG9uZyB0bworIyB0aGlzIG1vZHVsZS4KK0NPX05FU1RFRCAgICAgICAgICAgID0gMHgwMDEwICAgIyBuZXN0ZWRfc2NvcGVzCitDT19HRU5FUkFUT1JfQUxMT1dFRCA9IDAgICAgICAgICMgZ2VuZXJhdG9ycyAob2Jzb2xldGUsIHdhcyAweDEwMDApCitDT19GVVRVUkVfRElWSVNJT04gICA9IDB4MjAwMCAgICMgZGl2aXNpb24KK0NPX0ZVVFVSRV9BQlNPTFVURV9JTVBPUlQgPSAweDQwMDAgIyBwZXJmb3JtIGFic29sdXRlIGltcG9ydHMgYnkgZGVmYXVsdAorQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UICA9IDB4ODAwMCAgICMgd2l0aCBzdGF0ZW1lbnQKK0NPX0ZVVFVSRV9QUklOVF9GVU5DVElPTiAgPSAweDEwMDAwICAgIyBwcmludCBmdW5jdGlvbgorQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFMgPSAweDIwMDAwICMgdW5pY29kZSBzdHJpbmcgbGl0ZXJhbHMKKworY2xhc3MgX0ZlYXR1cmU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbmFsUmVsZWFzZSwgbWFuZGF0b3J5UmVsZWFzZSwgY29tcGlsZXJfZmxhZyk6CisgICAgICAgIHNlbGYub3B0aW9uYWwgPSBvcHRpb25hbFJlbGVhc2UKKyAgICAgICAgc2VsZi5tYW5kYXRvcnkgPSBtYW5kYXRvcnlSZWxlYXNlCisgICAgICAgIHNlbGYuY29tcGlsZXJfZmxhZyA9IGNvbXBpbGVyX2ZsYWcKKworICAgIGRlZiBnZXRPcHRpb25hbFJlbGVhc2Uoc2VsZik6CisgICAgICAgICIiIlJldHVybiBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZmVhdHVyZSB3YXMgcmVjb2duaXplZC4KKworICAgICAgICBUaGlzIGlzIGEgNS10dXBsZSwgb2YgdGhlIHNhbWUgZm9ybSBhcyBzeXMudmVyc2lvbl9pbmZvLgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5vcHRpb25hbAorCisgICAgZGVmIGdldE1hbmRhdG9yeVJlbGVhc2Uoc2VsZik6CisgICAgICAgICIiIlJldHVybiByZWxlYXNlIGluIHdoaWNoIHRoaXMgZmVhdHVyZSB3aWxsIGJlY29tZSBtYW5kYXRvcnkuCisKKyAgICAgICAgVGhpcyBpcyBhIDUtdHVwbGUsIG9mIHRoZSBzYW1lIGZvcm0gYXMgc3lzLnZlcnNpb25faW5mbywgb3IsIGlmCisgICAgICAgIHRoZSBmZWF0dXJlIHdhcyBkcm9wcGVkLCBpcyBOb25lLgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5tYW5kYXRvcnkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJfRmVhdHVyZSIgKyByZXByKChzZWxmLm9wdGlvbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFuZGF0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXJfZmxhZykpCisKK25lc3RlZF9zY29wZXMgPSBfRmVhdHVyZSgoMiwgMSwgMCwgImJldGEiLCAgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKDIsIDIsIDAsICJhbHBoYSIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIENPX05FU1RFRCkKKworZ2VuZXJhdG9ycyA9IF9GZWF0dXJlKCgyLCAyLCAwLCAiYWxwaGEiLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAoMiwgMywgMCwgImZpbmFsIiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgQ09fR0VORVJBVE9SX0FMTE9XRUQpCisKK2RpdmlzaW9uID0gX0ZlYXR1cmUoKDIsIDIsIDAsICJhbHBoYSIsIDIpLAorICAgICAgICAgICAgICAgICAgICAoMywgMCwgMCwgImFscGhhIiwgMCksCisgICAgICAgICAgICAgICAgICAgIENPX0ZVVFVSRV9ESVZJU0lPTikKKworYWJzb2x1dGVfaW1wb3J0ID0gX0ZlYXR1cmUoKDIsIDUsIDAsICJhbHBoYSIsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsIDAsIDAsICJhbHBoYSIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09fRlVUVVJFX0FCU09MVVRFX0lNUE9SVCkKKword2l0aF9zdGF0ZW1lbnQgPSBfRmVhdHVyZSgoMiwgNSwgMCwgImFscGhhIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCA2LCAwLCAiYWxwaGEiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UKQorCitwcmludF9mdW5jdGlvbiA9IF9GZWF0dXJlKCgyLCA2LCAwLCAiYWxwaGEiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsIDAsIDAsICJhbHBoYSIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT04pCisKK3VuaWNvZGVfbGl0ZXJhbHMgPSBfRmVhdHVyZSgoMiwgNiwgMCwgImFscGhhIiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsIDAsIDAsICJhbHBoYSIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fX2Z1dHVyZV9fLnB5YyBiL2xpYi9weXRob24yLjcvX19mdXR1cmVfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1MzE3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX19mdXR1cmVfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fX2Z1dHVyZV9fLnB5byBiL2xpYi9weXRob24yLjcvX19mdXR1cmVfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1MzE3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX19mdXR1cmVfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fX3BoZWxsb19fLmZvby5weSBiL2xpYi9weXRob24yLjcvX19waGVsbG9fXy5mb28ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4NjIzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX19waGVsbG9fXy5mb28ucHkKQEAgLTAsMCArMSBAQAorIyBUaGlzIGZpbGUgZXhpc3RzIGFzIGEgaGVscGVyIGZvciB0aGUgdGVzdC50ZXN0X2Zyb3plbiBtb2R1bGUuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19fcGhlbGxvX18uZm9vLnB5YyBiL2xpYi9weXRob24yLjcvX19waGVsbG9fXy5mb28ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0N2E3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19fcGhlbGxvX18uZm9vLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19fcGhlbGxvX18uZm9vLnB5byBiL2xpYi9weXRob24yLjcvX19waGVsbG9fXy5mb28ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0N2E3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19fcGhlbGxvX18uZm9vLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19hYmNvbGwucHkgYi9saWIvcHl0aG9uMi43L19hYmNvbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzOGFmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX2FiY29sbC5weQpAQCAtMCwwICsxLDY3MSBAQAorIyBDb3B5cmlnaHQgMjAwNyBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJBYnN0cmFjdCBCYXNlIENsYXNzZXMgKEFCQ3MpIGZvciBjb2xsZWN0aW9ucywgYWNjb3JkaW5nIHRvIFBFUCAzMTE5LgorCitET04nVCBVU0UgVEhJUyBNT0RVTEUgRElSRUNUTFkhICBUaGUgY2xhc3NlcyBoZXJlIHNob3VsZCBiZSBpbXBvcnRlZAordmlhIGNvbGxlY3Rpb25zOyB0aGV5IGFyZSBkZWZpbmVkIGhlcmUgb25seSB0byBhbGxldmlhdGUgY2VydGFpbgorYm9vdHN0cmFwcGluZyBpc3N1ZXMuICBVbml0IHRlc3RzIGFyZSBpbiB0ZXN0X2NvbGxlY3Rpb25zLgorIiIiCisKK2Zyb20gYWJjIGltcG9ydCBBQkNNZXRhLCBhYnN0cmFjdG1ldGhvZAoraW1wb3J0IHN5cworCitfX2FsbF9fID0gWyJIYXNoYWJsZSIsICJJdGVyYWJsZSIsICJJdGVyYXRvciIsCisgICAgICAgICAgICJTaXplZCIsICJDb250YWluZXIiLCAiQ2FsbGFibGUiLAorICAgICAgICAgICAiU2V0IiwgIk11dGFibGVTZXQiLAorICAgICAgICAgICAiTWFwcGluZyIsICJNdXRhYmxlTWFwcGluZyIsCisgICAgICAgICAgICJNYXBwaW5nVmlldyIsICJLZXlzVmlldyIsICJJdGVtc1ZpZXciLCAiVmFsdWVzVmlldyIsCisgICAgICAgICAgICJTZXF1ZW5jZSIsICJNdXRhYmxlU2VxdWVuY2UiLAorICAgICAgICAgICBdCisKKyMjIyBPTkUtVFJJQ0sgUE9OSUVTICMjIworCitkZWYgX2hhc2F0dHIoQywgYXR0cik6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gYW55KGF0dHIgaW4gQi5fX2RpY3RfXyBmb3IgQiBpbiBDLl9fbXJvX18pCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAjIE9sZC1zdHlsZSBjbGFzcworICAgICAgICByZXR1cm4gaGFzYXR0cihDLCBhdHRyKQorCisKK2NsYXNzIEhhc2hhYmxlOgorICAgIF9fbWV0YWNsYXNzX18gPSBBQkNNZXRhCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiAwCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgorICAgICAgICBpZiBjbHMgaXMgSGFzaGFibGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9yIEIgaW4gQy5fX21yb19fOgorICAgICAgICAgICAgICAgICAgICBpZiAiX19oYXNoX18iIGluIEIuX19kaWN0X186CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBCLl9fZGljdF9fWyJfX2hhc2hfXyJdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICMgT2xkLXN0eWxlIGNsYXNzCisgICAgICAgICAgICAgICAgaWYgZ2V0YXR0cihDLCAiX19oYXNoX18iLCBOb25lKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKworY2xhc3MgSXRlcmFibGU6CisgICAgX19tZXRhY2xhc3NfXyA9IEFCQ01ldGEKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgd2hpbGUgRmFsc2U6CisgICAgICAgICAgICB5aWVsZCBOb25lCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgorICAgICAgICBpZiBjbHMgaXMgSXRlcmFibGU6CisgICAgICAgICAgICBpZiBfaGFzYXR0cihDLCAiX19pdGVyX18iKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworSXRlcmFibGUucmVnaXN0ZXIoc3RyKQorCisKK2NsYXNzIEl0ZXJhdG9yKEl0ZXJhYmxlKToKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAnUmV0dXJuIHRoZSBuZXh0IGl0ZW0gZnJvbSB0aGUgaXRlcmF0b3IuIFdoZW4gZXhoYXVzdGVkLCByYWlzZSBTdG9wSXRlcmF0aW9uJworICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgorICAgICAgICBpZiBjbHMgaXMgSXRlcmF0b3I6CisgICAgICAgICAgICBpZiBfaGFzYXR0cihDLCAibmV4dCIpIGFuZCBfaGFzYXR0cihDLCAiX19pdGVyX18iKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworCitjbGFzcyBTaXplZDoKKyAgICBfX21ldGFjbGFzc19fID0gQUJDTWV0YQorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiAwCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgorICAgICAgICBpZiBjbHMgaXMgU2l6ZWQ6CisgICAgICAgICAgICBpZiBfaGFzYXR0cihDLCAiX19sZW5fXyIpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisKK2NsYXNzIENvbnRhaW5lcjoKKyAgICBfX21ldGFjbGFzc19fID0gQUJDTWV0YQorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB4KToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgorICAgICAgICBpZiBjbHMgaXMgQ29udGFpbmVyOgorICAgICAgICAgICAgaWYgX2hhc2F0dHIoQywgIl9fY29udGFpbnNfXyIpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisKK2NsYXNzIENhbGxhYmxlOgorICAgIF9fbWV0YWNsYXNzX18gPSBBQkNNZXRhCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9fc3ViY2xhc3Nob29rX18oY2xzLCBDKToKKyAgICAgICAgaWYgY2xzIGlzIENhbGxhYmxlOgorICAgICAgICAgICAgaWYgX2hhc2F0dHIoQywgIl9fY2FsbF9fIik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKworIyMjIFNFVFMgIyMjCisKKworY2xhc3MgU2V0KFNpemVkLCBJdGVyYWJsZSwgQ29udGFpbmVyKToKKyAgICAiIiJBIHNldCBpcyBhIGZpbml0ZSwgaXRlcmFibGUgY29udGFpbmVyLgorCisgICAgVGhpcyBjbGFzcyBwcm92aWRlcyBjb25jcmV0ZSBnZW5lcmljIGltcGxlbWVudGF0aW9ucyBvZiBhbGwKKyAgICBtZXRob2RzIGV4Y2VwdCBmb3IgX19jb250YWluc19fLCBfX2l0ZXJfXyBhbmQgX19sZW5fXy4KKworICAgIFRvIG92ZXJyaWRlIHRoZSBjb21wYXJpc29ucyAocHJlc3VtYWJseSBmb3Igc3BlZWQsIGFzIHRoZQorICAgIHNlbWFudGljcyBhcmUgZml4ZWQpLCBhbGwgeW91IGhhdmUgdG8gZG8gaXMgcmVkZWZpbmUgX19sZV9fIGFuZAorICAgIHRoZW4gdGhlIG90aGVyIG9wZXJhdGlvbnMgd2lsbCBhdXRvbWF0aWNhbGx5IGZvbGxvdyBzdWl0LgorICAgICIiIgorCisgICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTZXQpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIGlmIGxlbihzZWxmKSA+IGxlbihvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZm9yIGVsZW0gaW4gc2VsZjoKKyAgICAgICAgICAgIGlmIGVsZW0gbm90IGluIG90aGVyOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTZXQpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBsZW4oc2VsZikgPCBsZW4ob3RoZXIpIGFuZCBzZWxmLl9fbGVfXyhvdGhlcikKKworICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU2V0KToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gb3RoZXIgPCBzZWxmCisKKyAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNldCk6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIG90aGVyIDw9IHNlbGYKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU2V0KToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gbGVuKHNlbGYpID09IGxlbihvdGhlcikgYW5kIHNlbGYuX19sZV9fKG90aGVyKQorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX2Zyb21faXRlcmFibGUoY2xzLCBpdCk6CisgICAgICAgICcnJ0NvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgZnJvbSBhbnkgaXRlcmFibGUgaW5wdXQuCisKKyAgICAgICAgTXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGUgY2xhc3MgY29uc3RydWN0b3Igc2lnbmF0dXJlCisgICAgICAgIGRvZXMgbm90IGFjY2VwdCBhbiBpdGVyYWJsZSBmb3IgYW4gaW5wdXQuCisgICAgICAgICcnJworICAgICAgICByZXR1cm4gY2xzKGl0KQorCisgICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgSXRlcmFibGUpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBzZWxmLl9mcm9tX2l0ZXJhYmxlKHZhbHVlIGZvciB2YWx1ZSBpbiBvdGhlciBpZiB2YWx1ZSBpbiBzZWxmKQorCisgICAgZGVmIGlzZGlzam9pbnQoc2VsZiwgb3RoZXIpOgorICAgICAgICAnUmV0dXJuIFRydWUgaWYgdHdvIHNldHMgaGF2ZSBhIG51bGwgaW50ZXJzZWN0aW9uLicKKyAgICAgICAgZm9yIHZhbHVlIGluIG90aGVyOgorICAgICAgICAgICAgaWYgdmFsdWUgaW4gc2VsZjoKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgSXRlcmFibGUpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIGNoYWluID0gKGUgZm9yIHMgaW4gKHNlbGYsIG90aGVyKSBmb3IgZSBpbiBzKQorICAgICAgICByZXR1cm4gc2VsZi5fZnJvbV9pdGVyYWJsZShjaGFpbikKKworICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNldCk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgSXRlcmFibGUpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9mcm9tX2l0ZXJhYmxlKG90aGVyKQorICAgICAgICByZXR1cm4gc2VsZi5fZnJvbV9pdGVyYWJsZSh2YWx1ZSBmb3IgdmFsdWUgaW4gc2VsZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSBub3QgaW4gb3RoZXIpCisKKyAgICBkZWYgX194b3JfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTZXQpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEl0ZXJhYmxlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgICAgIG90aGVyID0gc2VsZi5fZnJvbV9pdGVyYWJsZShvdGhlcikKKyAgICAgICAgcmV0dXJuIChzZWxmIC0gb3RoZXIpIHwgKG90aGVyIC0gc2VsZikKKworICAgICMgU2V0cyBhcmUgbm90IGhhc2hhYmxlIGJ5IGRlZmF1bHQsIGJ1dCBzdWJjbGFzc2VzIGNhbiBjaGFuZ2UgdGhpcworICAgIF9faGFzaF9fID0gTm9uZQorCisgICAgZGVmIF9oYXNoKHNlbGYpOgorICAgICAgICAiIiJDb21wdXRlIHRoZSBoYXNoIHZhbHVlIG9mIGEgc2V0LgorCisgICAgICAgIE5vdGUgdGhhdCB3ZSBkb24ndCBkZWZpbmUgX19oYXNoX186IG5vdCBhbGwgc2V0cyBhcmUgaGFzaGFibGUuCisgICAgICAgIEJ1dCBpZiB5b3UgZGVmaW5lIGEgaGFzaGFibGUgc2V0IHR5cGUsIGl0cyBfX2hhc2hfXyBzaG91bGQKKyAgICAgICAgY2FsbCB0aGlzIGZ1bmN0aW9uLgorCisgICAgICAgIFRoaXMgbXVzdCBiZSBjb21wYXRpYmxlIF9fZXFfXy4KKworICAgICAgICBBbGwgc2V0cyBvdWdodCB0byBjb21wYXJlIGVxdWFsIGlmIHRoZXkgY29udGFpbiB0aGUgc2FtZQorICAgICAgICBlbGVtZW50cywgcmVnYXJkbGVzcyBvZiBob3cgdGhleSBhcmUgaW1wbGVtZW50ZWQsIGFuZAorICAgICAgICByZWdhcmRsZXNzIG9mIHRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHM7IHNvIHRoZXJlJ3Mgbm90IG11Y2gKKyAgICAgICAgZnJlZWRvbSBmb3IgX19lcV9fIG9yIF9faGFzaF9fLiAgV2UgbWF0Y2ggdGhlIGFsZ29yaXRobSB1c2VkCisgICAgICAgIGJ5IHRoZSBidWlsdC1pbiBmcm96ZW5zZXQgdHlwZS4KKyAgICAgICAgIiIiCisgICAgICAgIE1BWCA9IHN5cy5tYXhpbnQKKyAgICAgICAgTUFTSyA9IDIgKiBNQVggKyAxCisgICAgICAgIG4gPSBsZW4oc2VsZikKKyAgICAgICAgaCA9IDE5Mjc4NjgyMzcgKiAobiArIDEpCisgICAgICAgIGggJj0gTUFTSworICAgICAgICBmb3IgeCBpbiBzZWxmOgorICAgICAgICAgICAgaHggPSBoYXNoKHgpCisgICAgICAgICAgICBoIF49IChoeCBeIChoeCA8PCAxNikgXiA4OTg2OTc0NykgICogMzY0NDc5ODE2NworICAgICAgICAgICAgaCAmPSBNQVNLCisgICAgICAgIGggPSBoICogNjkwNjkgKyA5MDcxMzM5MjMKKyAgICAgICAgaCAmPSBNQVNLCisgICAgICAgIGlmIGggPiBNQVg6CisgICAgICAgICAgICBoIC09IE1BU0sgKyAxCisgICAgICAgIGlmIGggPT0gLTE6CisgICAgICAgICAgICBoID0gNTkwOTIzNzEzCisgICAgICAgIHJldHVybiBoCisKK1NldC5yZWdpc3Rlcihmcm96ZW5zZXQpCisKKworY2xhc3MgTXV0YWJsZVNldChTZXQpOgorICAgICIiIkEgbXV0YWJsZSBzZXQgaXMgYSBmaW5pdGUsIGl0ZXJhYmxlIGNvbnRhaW5lci4KKworICAgIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29uY3JldGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbnMgb2YgYWxsCisgICAgbWV0aG9kcyBleGNlcHQgZm9yIF9fY29udGFpbnNfXywgX19pdGVyX18sIF9fbGVuX18sCisgICAgYWRkKCksIGFuZCBkaXNjYXJkKCkuCisKKyAgICBUbyBvdmVycmlkZSB0aGUgY29tcGFyaXNvbnMgKHByZXN1bWFibHkgZm9yIHNwZWVkLCBhcyB0aGUKKyAgICBzZW1hbnRpY3MgYXJlIGZpeGVkKSwgYWxsIHlvdSBoYXZlIHRvIGRvIGlzIHJlZGVmaW5lIF9fbGVfXyBhbmQKKyAgICB0aGVuIHRoZSBvdGhlciBvcGVyYXRpb25zIHdpbGwgYXV0b21hdGljYWxseSBmb2xsb3cgc3VpdC4KKyAgICAiIiIKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBhZGQoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiJBZGQgYW4gZWxlbWVudC4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIGRpc2NhcmQoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiJSZW1vdmUgYW4gZWxlbWVudC4gIERvIG5vdCByYWlzZSBhbiBleGNlcHRpb24gaWYgYWJzZW50LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIiUmVtb3ZlIGFuIGVsZW1lbnQuIElmIG5vdCBhIG1lbWJlciwgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgaWYgdmFsdWUgbm90IGluIHNlbGY6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcih2YWx1ZSkKKyAgICAgICAgc2VsZi5kaXNjYXJkKHZhbHVlKQorCisgICAgZGVmIHBvcChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBwb3BwZWQgdmFsdWUuICBSYWlzZSBLZXlFcnJvciBpZiBlbXB0eS4iIiIKKyAgICAgICAgaXQgPSBpdGVyKHNlbGYpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlID0gbmV4dChpdCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcgorICAgICAgICBzZWxmLmRpc2NhcmQodmFsdWUpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICAiIiJUaGlzIGlzIHNsb3cgKGNyZWF0ZXMgTiBuZXcgaXRlcmF0b3JzISkgYnV0IGVmZmVjdGl2ZS4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnBvcCgpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfX2lvcl9fKHNlbGYsIGl0KToKKyAgICAgICAgZm9yIHZhbHVlIGluIGl0OgorICAgICAgICAgICAgc2VsZi5hZGQodmFsdWUpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19pYW5kX18oc2VsZiwgaXQpOgorICAgICAgICBmb3IgdmFsdWUgaW4gKHNlbGYgLSBpdCk6CisgICAgICAgICAgICBzZWxmLmRpc2NhcmQodmFsdWUpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19peG9yX18oc2VsZiwgaXQpOgorICAgICAgICBpZiBpdCBpcyBzZWxmOgorICAgICAgICAgICAgc2VsZi5jbGVhcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdCwgU2V0KToKKyAgICAgICAgICAgICAgICBpdCA9IHNlbGYuX2Zyb21faXRlcmFibGUoaXQpCisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gaXQ6CisgICAgICAgICAgICAgICAgaWYgdmFsdWUgaW4gc2VsZjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNjYXJkKHZhbHVlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKHZhbHVlKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9faXN1Yl9fKHNlbGYsIGl0KToKKyAgICAgICAgaWYgaXQgaXMgc2VsZjoKKyAgICAgICAgICAgIHNlbGYuY2xlYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIHZhbHVlIGluIGl0OgorICAgICAgICAgICAgICAgIHNlbGYuZGlzY2FyZCh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworTXV0YWJsZVNldC5yZWdpc3RlcihzZXQpCisKKworIyMjIE1BUFBJTkdTICMjIworCisKK2NsYXNzIE1hcHBpbmcoU2l6ZWQsIEl0ZXJhYmxlLCBDb250YWluZXIpOgorCisgICAgIiIiQSBNYXBwaW5nIGlzIGEgZ2VuZXJpYyBjb250YWluZXIgZm9yIGFzc29jaWF0aW5nIGtleS92YWx1ZQorICAgIHBhaXJzLgorCisgICAgVGhpcyBjbGFzcyBwcm92aWRlcyBjb25jcmV0ZSBnZW5lcmljIGltcGxlbWVudGF0aW9ucyBvZiBhbGwKKyAgICBtZXRob2RzIGV4Y2VwdCBmb3IgX19nZXRpdGVtX18sIF9faXRlcl9fLCBhbmQgX19sZW5fXy4KKworICAgICIiIgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHJhaXNlIEtleUVycm9yCisKKyAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgJ0QuZ2V0KGtbLGRdKSAtPiBEW2tdIGlmIGsgaW4gRCwgZWxzZSBkLiAgZCBkZWZhdWx0cyB0byBOb25lLicKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGl0ZXJrZXlzKHNlbGYpOgorICAgICAgICAnRC5pdGVya2V5cygpIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgRCcKKyAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZikKKworICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOgorICAgICAgICAnRC5pdGVydmFsdWVzKCkgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgdmFsdWVzIG9mIEQnCisgICAgICAgIGZvciBrZXkgaW4gc2VsZjoKKyAgICAgICAgICAgIHlpZWxkIHNlbGZba2V5XQorCisgICAgZGVmIGl0ZXJpdGVtcyhzZWxmKToKKyAgICAgICAgJ0QuaXRlcml0ZW1zKCkgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIGl0ZW1zIG9mIEQnCisgICAgICAgIGZvciBrZXkgaW4gc2VsZjoKKyAgICAgICAgICAgIHlpZWxkIChrZXksIHNlbGZba2V5XSkKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAiRC5rZXlzKCkgLT4gbGlzdCBvZiBEJ3Mga2V5cyIKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZikKKworICAgIGRlZiBpdGVtcyhzZWxmKToKKyAgICAgICAgIkQuaXRlbXMoKSAtPiBsaXN0IG9mIEQncyAoa2V5LCB2YWx1ZSkgcGFpcnMsIGFzIDItdHVwbGVzIgorICAgICAgICByZXR1cm4gWyhrZXksIHNlbGZba2V5XSkgZm9yIGtleSBpbiBzZWxmXQorCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgIkQudmFsdWVzKCkgLT4gbGlzdCBvZiBEJ3MgdmFsdWVzIgorICAgICAgICByZXR1cm4gW3NlbGZba2V5XSBmb3Iga2V5IGluIHNlbGZdCisKKyAgICAjIE1hcHBpbmdzIGFyZSBub3QgaGFzaGFibGUgYnkgZGVmYXVsdCwgYnV0IHN1YmNsYXNzZXMgY2FuIGNoYW5nZSB0aGlzCisgICAgX19oYXNoX18gPSBOb25lCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIE1hcHBpbmcpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBkaWN0KHNlbGYuaXRlbXMoKSkgPT0gZGljdChvdGhlci5pdGVtcygpKQorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKK2NsYXNzIE1hcHBpbmdWaWV3KFNpemVkKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXBwaW5nKToKKyAgICAgICAgc2VsZi5fbWFwcGluZyA9IG1hcHBpbmcKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX21hcHBpbmcpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnezAuX19jbGFzc19fLl9fbmFtZV9ffSh7MC5fbWFwcGluZyFyfSknLmZvcm1hdChzZWxmKQorCisKK2NsYXNzIEtleXNWaWV3KE1hcHBpbmdWaWV3LCBTZXQpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9mcm9tX2l0ZXJhYmxlKHNlbGYsIGl0KToKKyAgICAgICAgcmV0dXJuIHNldChpdCkKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLl9tYXBwaW5nCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fbWFwcGluZzoKKyAgICAgICAgICAgIHlpZWxkIGtleQorCisKK2NsYXNzIEl0ZW1zVmlldyhNYXBwaW5nVmlldywgU2V0KToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfZnJvbV9pdGVyYWJsZShzZWxmLCBpdCk6CisgICAgICAgIHJldHVybiBzZXQoaXQpCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgorICAgICAgICBrZXksIHZhbHVlID0gaXRlbQorICAgICAgICB0cnk6CisgICAgICAgICAgICB2ID0gc2VsZi5fbWFwcGluZ1trZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHYgPT0gdmFsdWUKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9tYXBwaW5nOgorICAgICAgICAgICAgeWllbGQgKGtleSwgc2VsZi5fbWFwcGluZ1trZXldKQorCisKK2NsYXNzIFZhbHVlc1ZpZXcoTWFwcGluZ1ZpZXcpOgorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fbWFwcGluZzoKKyAgICAgICAgICAgIGlmIHZhbHVlID09IHNlbGYuX21hcHBpbmdba2V5XToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9tYXBwaW5nOgorICAgICAgICAgICAgeWllbGQgc2VsZi5fbWFwcGluZ1trZXldCisKKworY2xhc3MgTXV0YWJsZU1hcHBpbmcoTWFwcGluZyk6CisKKyAgICAiIiJBIE11dGFibGVNYXBwaW5nIGlzIGEgZ2VuZXJpYyBjb250YWluZXIgZm9yIGFzc29jaWF0aW5nCisgICAga2V5L3ZhbHVlIHBhaXJzLgorCisgICAgVGhpcyBjbGFzcyBwcm92aWRlcyBjb25jcmV0ZSBnZW5lcmljIGltcGxlbWVudGF0aW9ucyBvZiBhbGwKKyAgICBtZXRob2RzIGV4Y2VwdCBmb3IgX19nZXRpdGVtX18sIF9fc2V0aXRlbV9fLCBfX2RlbGl0ZW1fXywKKyAgICBfX2l0ZXJfXywgYW5kIF9fbGVuX18uCisKKyAgICAiIiIKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgcmFpc2UgS2V5RXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICByYWlzZSBLZXlFcnJvcgorCisgICAgX19tYXJrZXIgPSBvYmplY3QoKQorCisgICAgZGVmIHBvcChzZWxmLCBrZXksIGRlZmF1bHQ9X19tYXJrZXIpOgorICAgICAgICAnJydELnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS4KKyAgICAgICAgICBJZiBrZXkgaXMgbm90IGZvdW5kLCBkIGlzIHJldHVybmVkIGlmIGdpdmVuLCBvdGhlcndpc2UgS2V5RXJyb3IgaXMgcmFpc2VkLgorICAgICAgICAnJycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgZGVmYXVsdCBpcyBzZWxmLl9fbWFya2VyOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVsIHNlbGZba2V5XQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgcG9waXRlbShzZWxmKToKKyAgICAgICAgJycnRC5wb3BpdGVtKCkgLT4gKGssIHYpLCByZW1vdmUgYW5kIHJldHVybiBzb21lIChrZXksIHZhbHVlKSBwYWlyCisgICAgICAgICAgIGFzIGEgMi10dXBsZTsgYnV0IHJhaXNlIEtleUVycm9yIGlmIEQgaXMgZW1wdHkuCisgICAgICAgICcnJworICAgICAgICB0cnk6CisgICAgICAgICAgICBrZXkgPSBuZXh0KGl0ZXIoc2VsZikpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IKKyAgICAgICAgdmFsdWUgPSBzZWxmW2tleV0KKyAgICAgICAgZGVsIHNlbGZba2V5XQorICAgICAgICByZXR1cm4ga2V5LCB2YWx1ZQorCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICAnRC5jbGVhcigpIC0+IE5vbmUuICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gRC4nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5wb3BpdGVtKCkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHVwZGF0ZSgqYXJncywgKiprd2RzKToKKyAgICAgICAgJycnIEQudXBkYXRlKFtFLCBdKipGKSAtPiBOb25lLiAgVXBkYXRlIEQgZnJvbSBtYXBwaW5nL2l0ZXJhYmxlIEUgYW5kIEYuCisgICAgICAgICAgICBJZiBFIHByZXNlbnQgYW5kIGhhcyBhIC5rZXlzKCkgbWV0aG9kLCBkb2VzOiAgICAgZm9yIGsgaW4gRTogRFtrXSA9IEVba10KKyAgICAgICAgICAgIElmIEUgcHJlc2VudCBhbmQgbGFja3MgLmtleXMoKSBtZXRob2QsIGRvZXM6ICAgICBmb3IgKGssIHYpIGluIEU6IERba10gPSB2CisgICAgICAgICAgICBJbiBlaXRoZXIgY2FzZSwgdGhpcyBpcyBmb2xsb3dlZCBieTogZm9yIGssIHYgaW4gRi5pdGVtcygpOiBEW2tdID0gdgorICAgICAgICAnJycKKyAgICAgICAgaWYgbGVuKGFyZ3MpID4gMjoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidXBkYXRlKCkgdGFrZXMgYXQgbW9zdCAyIHBvc2l0aW9uYWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudHMgKHt9IGdpdmVuKSIuZm9ybWF0KGxlbihhcmdzKSkpCisgICAgICAgIGVsaWYgbm90IGFyZ3M6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInVwZGF0ZSgpIHRha2VzIGF0IGxlYXN0IDEgYXJndW1lbnQgKDAgZ2l2ZW4pIikKKyAgICAgICAgc2VsZiA9IGFyZ3NbMF0KKyAgICAgICAgb3RoZXIgPSBhcmdzWzFdIGlmIGxlbihhcmdzKSA+PSAyIGVsc2UgKCkKKworICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBNYXBwaW5nKToKKyAgICAgICAgICAgIGZvciBrZXkgaW4gb3RoZXI6CisgICAgICAgICAgICAgICAgc2VsZltrZXldID0gb3RoZXJba2V5XQorICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsICJrZXlzIik6CisgICAgICAgICAgICBmb3Iga2V5IGluIG90aGVyLmtleXMoKToKKyAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSBvdGhlcltrZXldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBvdGhlcjoKKyAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSB2YWx1ZQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBrd2RzLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmW2tleV0gPSB2YWx1ZQorCisgICAgZGVmIHNldGRlZmF1bHQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAnRC5zZXRkZWZhdWx0KGtbLGRdKSAtPiBELmdldChrLGQpLCBhbHNvIHNldCBEW2tdPWQgaWYgayBub3QgaW4gRCcKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmW2tleV0gPSBkZWZhdWx0CisgICAgICAgIHJldHVybiBkZWZhdWx0CisKK011dGFibGVNYXBwaW5nLnJlZ2lzdGVyKGRpY3QpCisKKworIyMjIFNFUVVFTkNFUyAjIyMKKworCitjbGFzcyBTZXF1ZW5jZShTaXplZCwgSXRlcmFibGUsIENvbnRhaW5lcik6CisgICAgIiIiQWxsIHRoZSBvcGVyYXRpb25zIG9uIGEgcmVhZC1vbmx5IHNlcXVlbmNlLgorCisgICAgQ29uY3JldGUgc3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIF9fbmV3X18gb3IgX19pbml0X18sCisgICAgX19nZXRpdGVtX18sIGFuZCBfX2xlbl9fLgorICAgICIiIgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBpID0gMAorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHYgPSBzZWxmW2ldCisgICAgICAgICAgICAgICAgeWllbGQgdgorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIGZvciB2IGluIHNlbGY6CisgICAgICAgICAgICBpZiB2ID09IHZhbHVlOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYpKSk6CisgICAgICAgICAgICB5aWVsZCBzZWxmW2ldCisKKyAgICBkZWYgaW5kZXgoc2VsZiwgdmFsdWUpOgorICAgICAgICAnJydTLmluZGV4KHZhbHVlKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBmaXJzdCBpbmRleCBvZiB2YWx1ZS4KKyAgICAgICAgICAgUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LgorICAgICAgICAnJycKKyAgICAgICAgZm9yIGksIHYgaW4gZW51bWVyYXRlKHNlbGYpOgorICAgICAgICAgICAgaWYgdiA9PSB2YWx1ZToKKyAgICAgICAgICAgICAgICByZXR1cm4gaQorICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisKKyAgICBkZWYgY291bnQoc2VsZiwgdmFsdWUpOgorICAgICAgICAnUy5jb3VudCh2YWx1ZSkgLT4gaW50ZWdlciAtLSByZXR1cm4gbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHZhbHVlJworICAgICAgICByZXR1cm4gc3VtKDEgZm9yIHYgaW4gc2VsZiBpZiB2ID09IHZhbHVlKQorCitTZXF1ZW5jZS5yZWdpc3Rlcih0dXBsZSkKK1NlcXVlbmNlLnJlZ2lzdGVyKGJhc2VzdHJpbmcpCitTZXF1ZW5jZS5yZWdpc3RlcihidWZmZXIpCitTZXF1ZW5jZS5yZWdpc3Rlcih4cmFuZ2UpCisKKworY2xhc3MgTXV0YWJsZVNlcXVlbmNlKFNlcXVlbmNlKToKKworICAgICIiIkFsbCB0aGUgb3BlcmF0aW9ucyBvbiBhIHJlYWQtb25seSBzZXF1ZW5jZS4KKworICAgIENvbmNyZXRlIHN1YmNsYXNzZXMgbXVzdCBwcm92aWRlIF9fbmV3X18gb3IgX19pbml0X18sCisgICAgX19nZXRpdGVtX18sIF9fc2V0aXRlbV9fLCBfX2RlbGl0ZW1fXywgX19sZW5fXywgYW5kIGluc2VydCgpLgorCisgICAgIiIiCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaW5kZXgsIHZhbHVlKToKKyAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgdmFsdWUpOgorICAgICAgICAnUy5pbnNlcnQoaW5kZXgsIG9iamVjdCkgLS0gaW5zZXJ0IG9iamVjdCBiZWZvcmUgaW5kZXgnCisgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKworICAgIGRlZiBhcHBlbmQoc2VsZiwgdmFsdWUpOgorICAgICAgICAnUy5hcHBlbmQob2JqZWN0KSAtLSBhcHBlbmQgb2JqZWN0IHRvIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlJworICAgICAgICBzZWxmLmluc2VydChsZW4oc2VsZiksIHZhbHVlKQorCisgICAgZGVmIHJldmVyc2Uoc2VsZik6CisgICAgICAgICdTLnJldmVyc2UoKSAtLSByZXZlcnNlICpJTiBQTEFDRSonCisgICAgICAgIG4gPSBsZW4oc2VsZikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobi8vMik6CisgICAgICAgICAgICBzZWxmW2ldLCBzZWxmW24taS0xXSA9IHNlbGZbbi1pLTFdLCBzZWxmW2ldCisKKyAgICBkZWYgZXh0ZW5kKHNlbGYsIHZhbHVlcyk6CisgICAgICAgICdTLmV4dGVuZChpdGVyYWJsZSkgLS0gZXh0ZW5kIHNlcXVlbmNlIGJ5IGFwcGVuZGluZyBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYWJsZScKKyAgICAgICAgZm9yIHYgaW4gdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hcHBlbmQodikKKworICAgIGRlZiBwb3Aoc2VsZiwgaW5kZXg9LTEpOgorICAgICAgICAnJydTLnBvcChbaW5kZXhdKSAtPiBpdGVtIC0tIHJlbW92ZSBhbmQgcmV0dXJuIGl0ZW0gYXQgaW5kZXggKGRlZmF1bHQgbGFzdCkuCisgICAgICAgICAgIFJhaXNlIEluZGV4RXJyb3IgaWYgbGlzdCBpcyBlbXB0eSBvciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCisgICAgICAgICcnJworICAgICAgICB2ID0gc2VsZltpbmRleF0KKyAgICAgICAgZGVsIHNlbGZbaW5kZXhdCisgICAgICAgIHJldHVybiB2CisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgJycnUy5yZW1vdmUodmFsdWUpIC0tIHJlbW92ZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHZhbHVlLgorICAgICAgICAgICBSYWlzZSBWYWx1ZUVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJlc2VudC4KKyAgICAgICAgJycnCisgICAgICAgIGRlbCBzZWxmW3NlbGYuaW5kZXgodmFsdWUpXQorCisgICAgZGVmIF9faWFkZF9fKHNlbGYsIHZhbHVlcyk6CisgICAgICAgIHNlbGYuZXh0ZW5kKHZhbHVlcykKKyAgICAgICAgcmV0dXJuIHNlbGYKKworTXV0YWJsZVNlcXVlbmNlLnJlZ2lzdGVyKGxpc3QpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19hYmNvbGwucHljIGIvbGliL3B5dGhvbjIuNy9fYWJjb2xsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTI4ZDQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fYWJjb2xsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19hYmNvbGwucHlvIGIvbGliL3B5dGhvbjIuNy9fYWJjb2xsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTI4ZDQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fYWJjb2xsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19vc3hfc3VwcG9ydC5weSBiL2xpYi9weXRob24yLjcvX29zeF9zdXBwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZGJkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19vc3hfc3VwcG9ydC5weQpAQCAtMCwwICsxLDQ4OCBAQAorIiIiU2hhcmVkIE9TIFggc3VwcG9ydCBmdW5jdGlvbnMuIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKK19fYWxsX18gPSBbCisgICAgJ2NvbXBpbGVyX2ZpeHVwJywKKyAgICAnY3VzdG9taXplX2NvbmZpZ192YXJzJywKKyAgICAnY3VzdG9taXplX2NvbXBpbGVyJywKKyAgICAnZ2V0X3BsYXRmb3JtX29zeCcsCitdCisKKyMgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgdGhhdCBtYXkgY29udGFpbiB1bml2ZXJzYWwgYnVpbGQgZmxhZ3MsCisjIGxpa2UgIi1hcmNoIiBvciAiLWlzZGtyb290IiwgdGhhdCBtYXkgbmVlZCBjdXN0b21pemF0aW9uIGZvcgorIyB0aGUgdXNlciBlbnZpcm9ubWVudAorX1VOSVZFUlNBTF9DT05GSUdfVkFSUyA9ICgnQ0ZMQUdTJywgJ0xERkxBR1MnLCAnQ1BQRkxBR1MnLCAnQkFTRUNGTEFHUycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0JMRFNIQVJFRCcsICdMRFNIQVJFRCcsICdDQycsICdDWFgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQWV9DRkxBR1MnLCAnUFlfTERGTEFHUycsICdQWV9DUFBGTEFHUycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BZX0NPUkVfQ0ZMQUdTJykKKworIyBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyB0aGF0IG1heSBjb250YWluIGNvbXBpbGVyIGNhbGxzCitfQ09NUElMRVJfQ09ORklHX1ZBUlMgPSAoJ0JMRFNIQVJFRCcsICdMRFNIQVJFRCcsICdDQycsICdDWFgnKQorCisjIHByZWZpeCBhZGRlZCB0byBvcmlnaW5hbCBjb25maWd1cmF0aW9uIHZhcmlhYmxlIG5hbWVzCitfSU5JVFBSRSA9ICdfT1NYX1NVUFBPUlRfSU5JVElBTF8nCisKKworZGVmIF9maW5kX2V4ZWN1dGFibGUoZXhlY3V0YWJsZSwgcGF0aD1Ob25lKToKKyAgICAiIiJUcmllcyB0byBmaW5kICdleGVjdXRhYmxlJyBpbiB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluICdwYXRoJy4KKworICAgIEEgc3RyaW5nIGxpc3RpbmcgZGlyZWN0b3JpZXMgc2VwYXJhdGVkIGJ5ICdvcy5wYXRoc2VwJzsgZGVmYXVsdHMgdG8KKyAgICBvcy5lbnZpcm9uWydQQVRIJ10uICBSZXR1cm5zIHRoZSBjb21wbGV0ZSBmaWxlbmFtZSBvciBOb25lIGlmIG5vdCBmb3VuZC4KKyAgICAiIiIKKyAgICBpZiBwYXRoIGlzIE5vbmU6CisgICAgICAgIHBhdGggPSBvcy5lbnZpcm9uWydQQVRIJ10KKworICAgIHBhdGhzID0gcGF0aC5zcGxpdChvcy5wYXRoc2VwKQorICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZXhlY3V0YWJsZSkKKworICAgIGlmIChzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBvciBvcy5uYW1lID09ICdvczInKSBhbmQgKGV4dCAhPSAnLmV4ZScpOgorICAgICAgICBleGVjdXRhYmxlID0gZXhlY3V0YWJsZSArICcuZXhlJworCisgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGV4ZWN1dGFibGUpOgorICAgICAgICBmb3IgcCBpbiBwYXRoczoKKyAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4ocCwgZXhlY3V0YWJsZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGYpOgorICAgICAgICAgICAgICAgICMgdGhlIGZpbGUgZXhpc3RzLCB3ZSBoYXZlIGEgc2hvdCBhdCBzcGF3biB3b3JraW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIGYKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gZXhlY3V0YWJsZQorCisKK2RlZiBfcmVhZF9vdXRwdXQoY29tbWFuZHN0cmluZyk6CisgICAgIiIiT3V0cHV0IGZyb20gc3VjY2VzZnVsIGNvbW1hbmQgZXhlY3V0aW9uIG9yIE5vbmUiIiIKKyAgICAjIFNpbWlsYXIgdG8gb3MucG9wZW4oY29tbWFuZHN0cmluZywgInIiKS5yZWFkKCksCisgICAgIyBidXQgd2l0aG91dCBhY3R1YWxseSB1c2luZyBvcy5wb3BlbiBiZWNhdXNlIHRoYXQKKyAgICAjIGZ1bmN0aW9uIGlzIG5vdCB1c2FibGUgZHVyaW5nIHB5dGhvbiBib290c3RyYXAuCisgICAgIyB0ZW1wZmlsZSBpcyBhbHNvIG5vdCBhdmFpbGFibGUgdGhlbi4KKyAgICBpbXBvcnQgY29udGV4dGxpYgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHRlbXBmaWxlCisgICAgICAgIGZwID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGZwID0gb3BlbigiL3RtcC9fb3N4X3N1cHBvcnQuJXMiJSgKKyAgICAgICAgICAgIG9zLmdldHBpZCgpLCksICJ3K2IiKQorCisgICAgd2l0aCBjb250ZXh0bGliLmNsb3NpbmcoZnApIGFzIGZwOgorICAgICAgICBjbWQgPSAiJXMgMj4vZGV2L251bGwgPiclcyciICUgKGNvbW1hbmRzdHJpbmcsIGZwLm5hbWUpCisgICAgICAgIHJldHVybiBmcC5yZWFkKCkuZGVjb2RlKCd1dGYtOCcpLnN0cmlwKCkgaWYgbm90IG9zLnN5c3RlbShjbWQpIGVsc2UgTm9uZQorCisKK2RlZiBfZmluZF9idWlsZF90b29sKHRvb2xuYW1lKToKKyAgICAiIiJGaW5kIGEgYnVpbGQgdG9vbCBvbiBjdXJyZW50IHBhdGggb3IgdXNpbmcgeGNydW4iIiIKKyAgICByZXR1cm4gKF9maW5kX2V4ZWN1dGFibGUodG9vbG5hbWUpCisgICAgICAgICAgICAgICAgb3IgX3JlYWRfb3V0cHV0KCIvdXNyL2Jpbi94Y3J1biAtZmluZCAlcyIgJSAodG9vbG5hbWUsKSkKKyAgICAgICAgICAgICAgICBvciAnJworICAgICAgICAgICAgKQorCitfU1lTVEVNX1ZFUlNJT04gPSBOb25lCisKK2RlZiBfZ2V0X3N5c3RlbV92ZXJzaW9uKCk6CisgICAgIiIiUmV0dXJuIHRoZSBPUyBYIHN5c3RlbSB2ZXJzaW9uIGFzIGEgc3RyaW5nIiIiCisgICAgIyBSZWFkaW5nIHRoaXMgcGxpc3QgaXMgYSBkb2N1bWVudGVkIHdheSB0byBnZXQgdGhlIHN5c3RlbQorICAgICMgdmVyc2lvbiAoc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgR2VzdGFsdCBNYW5hZ2VyKQorICAgICMgV2UgYXZvaWQgdXNpbmcgcGxhdGZvcm0ubWFjX3ZlciB0byBhdm9pZCBwb3NzaWJsZSBib290c3RyYXAgaXNzdWVzIGR1cmluZworICAgICMgdGhlIGJ1aWxkIG9mIFB5dGhvbiBpdHNlbGYgKGRpc3R1dGlscyBpcyB1c2VkIHRvIGJ1aWxkIHN0YW5kYXJkIGxpYnJhcnkKKyAgICAjIGV4dGVuc2lvbnMpLgorCisgICAgZ2xvYmFsIF9TWVNURU1fVkVSU0lPTgorCisgICAgaWYgX1NZU1RFTV9WRVJTSU9OIGlzIE5vbmU6CisgICAgICAgIF9TWVNURU1fVkVSU0lPTiA9ICcnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKCcvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbVZlcnNpb24ucGxpc3QnKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICMgV2UncmUgb24gYSBwbGFpbiBkYXJ3aW4gYm94LCBmYWxsIGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgICAgICMgYmVoYXZpb3VyLgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG0gPSByZS5zZWFyY2gocic8a2V5PlByb2R1Y3RVc2VyVmlzaWJsZVZlcnNpb248L2tleT5ccyonCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJzxzdHJpbmc+KC4qPyk8L3N0cmluZz4nLCBmLnJlYWQoKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIF9TWVNURU1fVkVSU0lPTiA9ICcuJy5qb2luKG0uZ3JvdXAoMSkuc3BsaXQoJy4nKVs6Ml0pCisgICAgICAgICAgICAjIGVsc2U6IGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCBiZWhhdmlvdXIKKworICAgIHJldHVybiBfU1lTVEVNX1ZFUlNJT04KKworZGVmIF9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKF9jb25maWdfdmFycyk6CisgICAgIiIiUmVtb3ZlIG9yaWdpbmFsIHVubW9kaWZpZWQgdmFsdWVzIGZvciB0ZXN0aW5nIiIiCisgICAgIyBUaGlzIGlzIG5lZWRlZCBmb3IgaGlnaGVyLWxldmVsIGNyb3NzLXBsYXRmb3JtIHRlc3RzIG9mIGdldF9wbGF0Zm9ybS4KKyAgICBmb3IgayBpbiBsaXN0KF9jb25maWdfdmFycyk6CisgICAgICAgIGlmIGsuc3RhcnRzd2l0aChfSU5JVFBSRSk6CisgICAgICAgICAgICBkZWwgX2NvbmZpZ192YXJzW2tdCisKK2RlZiBfc2F2ZV9tb2RpZmllZF92YWx1ZShfY29uZmlnX3ZhcnMsIGN2LCBuZXd2YWx1ZSk6CisgICAgIiIiU2F2ZSBtb2RpZmllZCBhbmQgb3JpZ2luYWwgdW5tb2RpZmllZCB2YWx1ZSBvZiBjb25maWd1cmF0aW9uIHZhciIiIgorCisgICAgb2xkdmFsdWUgPSBfY29uZmlnX3ZhcnMuZ2V0KGN2LCAnJykKKyAgICBpZiAob2xkdmFsdWUgIT0gbmV3dmFsdWUpIGFuZCAoX0lOSVRQUkUgKyBjdiBub3QgaW4gX2NvbmZpZ192YXJzKToKKyAgICAgICAgX2NvbmZpZ192YXJzW19JTklUUFJFICsgY3ZdID0gb2xkdmFsdWUKKyAgICBfY29uZmlnX3ZhcnNbY3ZdID0gbmV3dmFsdWUKKworZGVmIF9zdXBwb3J0c191bml2ZXJzYWxfYnVpbGRzKCk6CisgICAgIiIiUmV0dXJucyBUcnVlIGlmIHVuaXZlcnNhbCBidWlsZHMgYXJlIHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbSIiIgorICAgICMgQXMgYW4gYXBwcm94aW1hdGlvbiwgd2UgYXNzdW1lIHRoYXQgaWYgd2UgYXJlIHJ1bm5pbmcgb24gMTAuNCBvciBhYm92ZSwKKyAgICAjIHRoZW4gd2UgYXJlIHJ1bm5pbmcgd2l0aCBhbiBYY29kZSBlbnZpcm9ubWVudCB0aGF0IHN1cHBvcnRzIHVuaXZlcnNhbAorICAgICMgYnVpbGRzLCBpbiBwYXJ0aWN1bGFyIC1pc3lzcm9vdCBhbmQgLWFyY2ggYXJndW1lbnRzIHRvIHRoZSBjb21waWxlci4gVGhpcworICAgICMgaXMgaW4gc3VwcG9ydCBvZiBhbGxvd2luZyAxMC40IHVuaXZlcnNhbCBidWlsZHMgdG8gcnVuIG9uIDEwLjMueCBzeXN0ZW1zLgorCisgICAgb3N4X3ZlcnNpb24gPSBfZ2V0X3N5c3RlbV92ZXJzaW9uKCkKKyAgICBpZiBvc3hfdmVyc2lvbjoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3N4X3ZlcnNpb24gPSB0dXBsZShpbnQoaSkgZm9yIGkgaW4gb3N4X3ZlcnNpb24uc3BsaXQoJy4nKSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBvc3hfdmVyc2lvbiA9ICcnCisgICAgcmV0dXJuIGJvb2wob3N4X3ZlcnNpb24gPj0gKDEwLCA0KSkgaWYgb3N4X3ZlcnNpb24gZWxzZSBGYWxzZQorCisKK2RlZiBfZmluZF9hcHByb3ByaWF0ZV9jb21waWxlcihfY29uZmlnX3ZhcnMpOgorICAgICIiIkZpbmQgYXBwcm9wcmlhdGUgQyBjb21waWxlciBmb3IgZXh0ZW5zaW9uIG1vZHVsZSBidWlsZHMiIiIKKworICAgICMgSXNzdWUgIzEzNTkwOgorICAgICMgICAgVGhlIE9TWCBsb2NhdGlvbiBmb3IgdGhlIGNvbXBpbGVyIHZhcmllcyBiZXR3ZWVuIE9TWAorICAgICMgICAgKG9yIHJhdGhlciBYY29kZSkgcmVsZWFzZXMuICBXaXRoIG9sZGVyIHJlbGVhc2VzICh1cC10byAxMC41KQorICAgICMgICAgdGhlIGNvbXBpbGVyIGlzIGluIC91c3IvYmluLCB3aXRoIG5ld2VyIHJlbGVhc2VzIHRoZSBjb21waWxlcgorICAgICMgICAgY2FuIG9ubHkgYmUgZm91bmQgaW5zaWRlIFhjb2RlLmFwcCBpZiB0aGUgIkNvbW1hbmQgTGluZSBUb29scyIKKyAgICAjICAgIGFyZSBub3QgaW5zdGFsbGVkLgorICAgICMKKyAgICAjICAgIEZ1dGhlcm1vcmUsIHRoZSBjb21waWxlciB0aGF0IGNhbiBiZSB1c2VkIHZhcmllcyBiZXR3ZWVuCisgICAgIyAgICBYY29kZSByZWxlYXNlcy4gVXB0byBYY29kZSA0IGl0IHdhcyBwb3NzaWJsZSB0byB1c2UgJ2djYy00LjInCisgICAgIyAgICBhcyB0aGUgY29tcGlsZXIsIGFmdGVyIHRoYXQgJ2NsYW5nJyBzaG91bGQgYmUgdXNlZCBiZWNhdXNlCisgICAgIyAgICBnY2MtNC4yIGlzIGVpdGhlciBub3QgcHJlc2VudCwgb3IgYSBjb3B5IG9mICdsbHZtLWdjYycgdGhhdAorICAgICMgICAgbWlzY29tcGlsZXMgUHl0aG9uLgorCisgICAgIyBza2lwIGNoZWNrcyBpZiB0aGUgY29tcGlsZXIgd2FzIG92ZXJyaWRlbiB3aXRoIGEgQ0MgZW52IHZhcmlhYmxlCisgICAgaWYgJ0NDJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICByZXR1cm4gX2NvbmZpZ192YXJzCisKKyAgICAjIFRoZSBDQyBjb25maWcgdmFyIG1pZ2h0IGNvbnRhaW4gYWRkaXRpb25hbCBhcmd1bWVudHMuCisgICAgIyBJZ25vcmUgdGhlbSB3aGlsZSBzZWFyY2hpbmcuCisgICAgY2MgPSBvbGRjYyA9IF9jb25maWdfdmFyc1snQ0MnXS5zcGxpdCgpWzBdCisgICAgaWYgbm90IF9maW5kX2V4ZWN1dGFibGUoY2MpOgorICAgICAgICAjIENvbXBpbGVyIGlzIG5vdCBmb3VuZCBvbiB0aGUgc2hlbGwgc2VhcmNoIFBBVEguCisgICAgICAgICMgTm93IHNlYXJjaCBmb3IgY2xhbmcsIGZpcnN0IG9uIFBBVEggKGlmIHRoZSBDb21tYW5kIExJbmUKKyAgICAgICAgIyBUb29scyBoYXZlIGJlZW4gaW5zdGFsbGVkIGluIC8gb3IgaWYgdGhlIHVzZXIgaGFzIHByb3ZpZGVkCisgICAgICAgICMgYW5vdGhlciBsb2NhdGlvbiB2aWEgQ0MpLiAgSWYgbm90IGZvdW5kLCB0cnkgdXNpbmcgeGNydW4KKyAgICAgICAgIyB0byBmaW5kIGFuIHVuaW5zdGFsbGVkIGNsYW5nICh3aXRoaW4gYSBzZWxlY3RlZCBYY29kZSkuCisKKyAgICAgICAgIyBOT1RFOiBDYW5ub3QgdXNlIHN1YnByb2Nlc3MgaGVyZSBiZWNhdXNlIG9mIGJvb3RzdHJhcAorICAgICAgICAjIGlzc3VlcyB3aGVuIGJ1aWxkaW5nIFB5dGhvbiBpdHNlbGYgKGFuZCBvcy5wb3BlbiBpcworICAgICAgICAjIGltcGxlbWVudGVkIG9uIHRvcCBvZiBzdWJwcm9jZXNzIGFuZCBpcyB0aGVyZWZvcmUgbm90CisgICAgICAgICMgdXNhYmxlIGFzIHdlbGwpCisKKyAgICAgICAgY2MgPSBfZmluZF9idWlsZF90b29sKCdjbGFuZycpCisKKyAgICBlbGlmIG9zLnBhdGguYmFzZW5hbWUoY2MpLnN0YXJ0c3dpdGgoJ2djYycpOgorICAgICAgICAjIENvbXBpbGVyIGlzIEdDQywgY2hlY2sgaWYgaXQgaXMgTExWTS1HQ0MKKyAgICAgICAgZGF0YSA9IF9yZWFkX291dHB1dCgiJyVzJyAtLXZlcnNpb24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGNjLnJlcGxhY2UoIiciLCAiJ1wiJ1wiJyIpLCkpCisgICAgICAgIGlmICdsbHZtLWdjYycgaW4gZGF0YToKKyAgICAgICAgICAgICMgRm91bmQgTExWTS1HQ0MsIGZhbGwgYmFjayB0byBjbGFuZworICAgICAgICAgICAgY2MgPSBfZmluZF9idWlsZF90b29sKCdjbGFuZycpCisKKyAgICBpZiBub3QgY2M6CisgICAgICAgIHJhaXNlIFN5c3RlbUVycm9yKAorICAgICAgICAgICAgICAgIkNhbm5vdCBsb2NhdGUgd29ya2luZyBjb21waWxlciIpCisKKyAgICBpZiBjYyAhPSBvbGRjYzoKKyAgICAgICAgIyBGb3VuZCBhIHJlcGxhY2VtZW50IGNvbXBpbGVyLgorICAgICAgICAjIE1vZGlmeSBjb25maWcgdmFycyB1c2luZyBuZXcgY29tcGlsZXIsIGlmIG5vdCBhbHJlYWR5IGV4cGxpY3RseQorICAgICAgICAjIG92ZXJyaWRlbiBieSBhbiBlbnYgdmFyaWFibGUsIHByZXNlcnZpbmcgYWRkaXRpb25hbCBhcmd1bWVudHMuCisgICAgICAgIGZvciBjdiBpbiBfQ09NUElMRVJfQ09ORklHX1ZBUlM6CisgICAgICAgICAgICBpZiBjdiBpbiBfY29uZmlnX3ZhcnMgYW5kIGN2IG5vdCBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgICAgIGN2X3NwbGl0ID0gX2NvbmZpZ192YXJzW2N2XS5zcGxpdCgpCisgICAgICAgICAgICAgICAgY3Zfc3BsaXRbMF0gPSBjYyBpZiBjdiAhPSAnQ1hYJyBlbHNlIGNjICsgJysrJworICAgICAgICAgICAgICAgIF9zYXZlX21vZGlmaWVkX3ZhbHVlKF9jb25maWdfdmFycywgY3YsICcgJy5qb2luKGN2X3NwbGl0KSkKKworICAgIHJldHVybiBfY29uZmlnX3ZhcnMKKworCitkZWYgX3JlbW92ZV91bml2ZXJzYWxfZmxhZ3MoX2NvbmZpZ192YXJzKToKKyAgICAiIiJSZW1vdmUgYWxsIHVuaXZlcnNhbCBidWlsZCBhcmd1bWVudHMgZnJvbSBjb25maWcgdmFycyIiIgorCisgICAgZm9yIGN2IGluIF9VTklWRVJTQUxfQ09ORklHX1ZBUlM6CisgICAgICAgICMgRG8gbm90IGFsdGVyIGEgY29uZmlnIHZhciBleHBsaWNpdGx5IG92ZXJyaWRlbiBieSBlbnYgdmFyCisgICAgICAgIGlmIGN2IGluIF9jb25maWdfdmFycyBhbmQgY3Ygbm90IGluIG9zLmVudmlyb246CisgICAgICAgICAgICBmbGFncyA9IF9jb25maWdfdmFyc1tjdl0KKyAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctYXJjaFxzK1x3K1xzJywgJyAnLCBmbGFncykKKyAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctaXN5c3Jvb3QgW14gXHRdKicsICcgJywgZmxhZ3MpCisgICAgICAgICAgICBfc2F2ZV9tb2RpZmllZF92YWx1ZShfY29uZmlnX3ZhcnMsIGN2LCBmbGFncykKKworICAgIHJldHVybiBfY29uZmlnX3ZhcnMKKworCitkZWYgX3JlbW92ZV91bnN1cHBvcnRlZF9hcmNocyhfY29uZmlnX3ZhcnMpOgorICAgICIiIlJlbW92ZSBhbnkgdW5zdXBwb3J0ZWQgYXJjaHMgZnJvbSBjb25maWcgdmFycyIiIgorICAgICMgRGlmZmVyZW50IFhjb2RlIHJlbGVhc2VzIHN1cHBvcnQgZGlmZmVyZW50IHNldHMgZm9yICctYXJjaCcKKyAgICAjIGZsYWdzLiBJbiBwYXJ0aWN1bGFyLCBYY29kZSA0Lnggbm8gbG9uZ2VyIHN1cHBvcnRzIHRoZQorICAgICMgUFBDIGFyY2hpdGVjdHVyZXMuCisgICAgIworICAgICMgVGhpcyBjb2RlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlcyAnLWFyY2ggcHBjJyBhbmQgJy1hcmNoIHBwYzY0JworICAgICMgd2hlbiB0aGVzZSBhcmUgbm90IHN1cHBvcnRlZC4gVGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0bworICAgICMgYnVpbGQgZXh0ZW5zaW9ucyBvbiBPU1ggMTAuNyBhbmQgbGF0ZXIgd2l0aCB0aGUgcHJlYnVpbHQKKyAgICAjIDMyLWJpdCBpbnN0YWxsZXIgb24gdGhlIHB5dGhvbi5vcmcgd2Vic2l0ZS4KKworICAgICMgc2tpcCBjaGVja3MgaWYgdGhlIGNvbXBpbGVyIHdhcyBvdmVycmlkZW4gd2l0aCBhIENDIGVudiB2YXJpYWJsZQorICAgIGlmICdDQycgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgcmV0dXJuIF9jb25maWdfdmFycworCisgICAgaWYgcmUuc2VhcmNoKCctYXJjaFxzK3BwYycsIF9jb25maWdfdmFyc1snQ0ZMQUdTJ10pIGlzIG5vdCBOb25lOgorICAgICAgICAjIE5PVEU6IENhbm5vdCB1c2Ugc3VicHJvY2VzcyBoZXJlIGJlY2F1c2Ugb2YgYm9vdHN0cmFwCisgICAgICAgICMgaXNzdWVzIHdoZW4gYnVpbGRpbmcgUHl0aG9uIGl0c2VsZgorICAgICAgICBzdGF0dXMgPSBvcy5zeXN0ZW0oIiclcycgLWFyY2ggcHBjIC14IGMgL2Rldi9udWxsIDI+L2Rldi9udWxsIiUoCisgICAgICAgICAgICBfY29uZmlnX3ZhcnNbJ0NDJ10ucmVwbGFjZSgiJyIsICInXCInXCInIiksKSkKKyAgICAgICAgIyBUaGUgQXBwbGUgY29tcGlsZXIgZHJpdmVycyByZXR1cm4gc3RhdHVzIDI1NSBpZiBubyBQUEMKKyAgICAgICAgaWYgKHN0YXR1cyA+PiA4KSA9PSAyNTU6CisgICAgICAgICAgICAjIENvbXBpbGVyIGRvZXNuJ3Qgc3VwcG9ydCBQUEMsIHJlbW92ZSB0aGUgcmVsYXRlZAorICAgICAgICAgICAgIyAnLWFyY2gnIGZsYWdzIGlmIG5vdCBleHBsaWNpdGx5IG92ZXJyaWRkZW4gYnkgYW4KKyAgICAgICAgICAgICMgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICAgICAgICAgIGZvciBjdiBpbiBfVU5JVkVSU0FMX0NPTkZJR19WQVJTOgorICAgICAgICAgICAgICAgIGlmIGN2IGluIF9jb25maWdfdmFycyBhbmQgY3Ygbm90IGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gX2NvbmZpZ192YXJzW2N2XQorICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWFyY2hccytwcGNcdypccycsICcgJywgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgIF9zYXZlX21vZGlmaWVkX3ZhbHVlKF9jb25maWdfdmFycywgY3YsIGZsYWdzKQorCisgICAgcmV0dXJuIF9jb25maWdfdmFycworCisKK2RlZiBfb3ZlcnJpZGVfYWxsX2FyY2hzKF9jb25maWdfdmFycyk6CisgICAgIiIiQWxsb3cgb3ZlcnJpZGUgb2YgYWxsIGFyY2hzIHdpdGggQVJDSEZMQUdTIGVudiB2YXIiIiIKKyAgICAjIE5PVEU6IFRoaXMgbmFtZSB3YXMgaW50cm9kdWNlZCBieSBBcHBsZSBpbiBPU1ggMTAuNSBhbmQKKyAgICAjIGlzIHVzZWQgYnkgc2V2ZXJhbCBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGRpc3RyaWJ1dGVkIHdpdGgKKyAgICAjIHRoYXQgT1MgcmVsZWFzZS4KKyAgICBpZiAnQVJDSEZMQUdTJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICBhcmNoID0gb3MuZW52aXJvblsnQVJDSEZMQUdTJ10KKyAgICAgICAgZm9yIGN2IGluIF9VTklWRVJTQUxfQ09ORklHX1ZBUlM6CisgICAgICAgICAgICBpZiBjdiBpbiBfY29uZmlnX3ZhcnMgYW5kICctYXJjaCcgaW4gX2NvbmZpZ192YXJzW2N2XToKKyAgICAgICAgICAgICAgICBmbGFncyA9IF9jb25maWdfdmFyc1tjdl0KKyAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWFyY2hccytcdytccycsICcgJywgZmxhZ3MpCisgICAgICAgICAgICAgICAgZmxhZ3MgPSBmbGFncyArICcgJyArIGFyY2gKKyAgICAgICAgICAgICAgICBfc2F2ZV9tb2RpZmllZF92YWx1ZShfY29uZmlnX3ZhcnMsIGN2LCBmbGFncykKKworICAgIHJldHVybiBfY29uZmlnX3ZhcnMKKworCitkZWYgX2NoZWNrX2Zvcl91bmF2YWlsYWJsZV9zZGsoX2NvbmZpZ192YXJzKToKKyAgICAiIiJSZW1vdmUgcmVmZXJlbmNlcyB0byBhbnkgU0RLcyBub3QgYXZhaWxhYmxlIiIiCisgICAgIyBJZiB3ZSdyZSBvbiBPU1ggMTAuNSBvciBsYXRlciBhbmQgdGhlIHVzZXIgdHJpZXMgdG8KKyAgICAjIGNvbXBpbGUgYW4gZXh0ZW5zaW9uIHVzaW5nIGFuIFNESyB0aGF0IGlzIG5vdCBwcmVzZW50CisgICAgIyBvbiB0aGUgY3VycmVudCBtYWNoaW5lIGl0IGlzIGJldHRlciB0byBub3QgdXNlIGFuIFNESworICAgICMgdGhhbiB0byBmYWlsLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IHdpdGgKKyAgICAjIHRoZSBzdGFuZGFsb25nIENvbW1hbmQgTGluZSBUb29scyBhbHRlcm5hdGl2ZSB0byBhCisgICAgIyBmdWxsLWJsb3duIFhjb2RlIGluc3RhbGwgc2luY2UgdGhlIENMVCBwYWNrYWdlcyBkbyBub3QKKyAgICAjIHByb3ZpZGUgU0RLcy4gIElmIHRoZSBTREsgaXMgbm90IHByZXNlbnQsIGl0IGlzIGFzc3VtZWQKKyAgICAjIHRoYXQgdGhlIGhlYWRlciBmaWxlcyBhbmQgZGV2IGxpYnMgaGF2ZSBiZWVuIGluc3RhbGxlZAorICAgICMgdG8gL3VzciBhbmQgL1N5c3RlbS9MaWJyYXJ5IGJ5IGVpdGhlciBhIHN0YW5kYWxvbmUgQ0xUCisgICAgIyBwYWNrYWdlIG9yIHRoZSBDTFQgY29tcG9uZW50IHdpdGhpbiBYY29kZS4KKyAgICBjZmxhZ3MgPSBfY29uZmlnX3ZhcnMuZ2V0KCdDRkxBR1MnLCAnJykKKyAgICBtID0gcmUuc2VhcmNoKHInLWlzeXNyb290XHMrKFxTKyknLCBjZmxhZ3MpCisgICAgaWYgbSBpcyBub3QgTm9uZToKKyAgICAgICAgc2RrID0gbS5ncm91cCgxKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2RrKToKKyAgICAgICAgICAgIGZvciBjdiBpbiBfVU5JVkVSU0FMX0NPTkZJR19WQVJTOgorICAgICAgICAgICAgICAgICMgRG8gbm90IGFsdGVyIGEgY29uZmlnIHZhciBleHBsaWNpdGx5IG92ZXJyaWRlbiBieSBlbnYgdmFyCisgICAgICAgICAgICAgICAgaWYgY3YgaW4gX2NvbmZpZ192YXJzIGFuZCBjdiBub3QgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBfY29uZmlnX3ZhcnNbY3ZdCisgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKHInLWlzeXNyb290XHMrXFMrKD86XHN8JCknLCAnICcsIGZsYWdzKQorICAgICAgICAgICAgICAgICAgICBfc2F2ZV9tb2RpZmllZF92YWx1ZShfY29uZmlnX3ZhcnMsIGN2LCBmbGFncykKKworICAgIHJldHVybiBfY29uZmlnX3ZhcnMKKworCitkZWYgY29tcGlsZXJfZml4dXAoY29tcGlsZXJfc28sIGNjX2FyZ3MpOgorICAgICIiIgorICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBzdHJpcCAnLWlzeXNyb290IFBBVEgnIGFuZCAnLWFyY2ggQVJDSCcgZnJvbSB0aGUKKyAgICBjb21waWxlIGZsYWdzIGlmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgb25lIHRoZW0gaW4gZXh0cmFfY29tcGlsZV9mbGFncy4KKworICAgIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgJy1hcmNoIEFSQ0gnIGFkZHMgYW5vdGhlciBhcmNoaXRlY3R1cmUgdG8gdGhlCisgICAgYnVpbGQsIHdpdGhvdXQgYSB3YXkgdG8gcmVtb3ZlIGFuIGFyY2hpdGVjdHVyZS4gRnVydGhlcm1vcmUgR0NDIHdpbGwKKyAgICBiYXJmIGlmIG11bHRpcGxlICctaXN5c3Jvb3QnIGFyZ3VtZW50cyBhcmUgcHJlc2VudC4KKyAgICAiIiIKKyAgICBzdHJpcEFyY2ggPSBzdHJpcFN5c3Jvb3QgPSBGYWxzZQorCisgICAgY29tcGlsZXJfc28gPSBsaXN0KGNvbXBpbGVyX3NvKQorCisgICAgaWYgbm90IF9zdXBwb3J0c191bml2ZXJzYWxfYnVpbGRzKCk6CisgICAgICAgICMgT1NYIGJlZm9yZSAxMC40LjAsIHRoZXNlIGRvbid0IHN1cHBvcnQgLWFyY2ggYW5kIC1pc3lzcm9vdCBhdAorICAgICAgICAjIGFsbC4KKyAgICAgICAgc3RyaXBBcmNoID0gc3RyaXBTeXNyb290ID0gVHJ1ZQorICAgIGVsc2U6CisgICAgICAgIHN0cmlwQXJjaCA9ICctYXJjaCcgaW4gY2NfYXJncworICAgICAgICBzdHJpcFN5c3Jvb3QgPSAnLWlzeXNyb290JyBpbiBjY19hcmdzCisKKyAgICBpZiBzdHJpcEFyY2ggb3IgJ0FSQ0hGTEFHUycgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbmRleCA9IGNvbXBpbGVyX3NvLmluZGV4KCctYXJjaCcpCisgICAgICAgICAgICAgICAgIyBTdHJpcCB0aGlzIGFyZ3VtZW50IGFuZCB0aGUgbmV4dCBvbmU6CisgICAgICAgICAgICAgICAgZGVsIGNvbXBpbGVyX3NvW2luZGV4OmluZGV4KzJdCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgaWYgJ0FSQ0hGTEFHUycgaW4gb3MuZW52aXJvbiBhbmQgbm90IHN0cmlwQXJjaDoKKyAgICAgICAgIyBVc2VyIHNwZWNpZmllZCBkaWZmZXJlbnQgLWFyY2ggZmxhZ3MgaW4gdGhlIGVudmlyb24sCisgICAgICAgICMgc2VlIGFsc28gZGlzdHV0aWxzLnN5c2NvbmZpZworICAgICAgICBjb21waWxlcl9zbyA9IGNvbXBpbGVyX3NvICsgb3MuZW52aXJvblsnQVJDSEZMQUdTJ10uc3BsaXQoKQorCisgICAgaWYgc3RyaXBTeXNyb290OgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGluZGV4ID0gY29tcGlsZXJfc28uaW5kZXgoJy1pc3lzcm9vdCcpCisgICAgICAgICAgICAgICAgIyBTdHJpcCB0aGlzIGFyZ3VtZW50IGFuZCB0aGUgbmV4dCBvbmU6CisgICAgICAgICAgICAgICAgZGVsIGNvbXBpbGVyX3NvW2luZGV4OmluZGV4KzJdCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgIyBDaGVjayBpZiB0aGUgU0RLIHRoYXQgaXMgdXNlZCBkdXJpbmcgY29tcGlsYXRpb24gYWN0dWFsbHkgZXhpc3RzLAorICAgICMgdGhlIHVuaXZlcnNhbCBidWlsZCByZXF1aXJlcyB0aGUgdXNhZ2Ugb2YgYSB1bml2ZXJzYWwgU0RLIGFuZCBub3QgYWxsCisgICAgIyB1c2VycyBoYXZlIHRoYXQgaW5zdGFsbGVkIGJ5IGRlZmF1bHQuCisgICAgc3lzcm9vdCA9IE5vbmUKKyAgICBpZiAnLWlzeXNyb290JyBpbiBjY19hcmdzOgorICAgICAgICBpZHggPSBjY19hcmdzLmluZGV4KCctaXN5c3Jvb3QnKQorICAgICAgICBzeXNyb290ID0gY2NfYXJnc1tpZHgrMV0KKyAgICBlbGlmICctaXN5c3Jvb3QnIGluIGNvbXBpbGVyX3NvOgorICAgICAgICBpZHggPSBjb21waWxlcl9zby5pbmRleCgnLWlzeXNyb290JykKKyAgICAgICAgc3lzcm9vdCA9IGNvbXBpbGVyX3NvW2lkeCsxXQorCisgICAgaWYgc3lzcm9vdCBhbmQgbm90IG9zLnBhdGguaXNkaXIoc3lzcm9vdCk6CisgICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKyAgICAgICAgbG9nLndhcm4oIkNvbXBpbGluZyB3aXRoIGFuIFNESyB0aGF0IGRvZXNuJ3Qgc2VlbSB0byBleGlzdDogJXMiLAorICAgICAgICAgICAgICAgIHN5c3Jvb3QpCisgICAgICAgIGxvZy53YXJuKCJQbGVhc2UgY2hlY2sgeW91ciBYY29kZSBpbnN0YWxsYXRpb24iKQorCisgICAgcmV0dXJuIGNvbXBpbGVyX3NvCisKKworZGVmIGN1c3RvbWl6ZV9jb25maWdfdmFycyhfY29uZmlnX3ZhcnMpOgorICAgICIiIkN1c3RvbWl6ZSBQeXRob24gYnVpbGQgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMuCisKKyAgICBDYWxsZWQgaW50ZXJuYWxseSBmcm9tIHN5c2NvbmZpZyB3aXRoIGEgbXV0YWJsZSBtYXBwaW5nCisgICAgY29udGFpbmluZyBuYW1lL3ZhbHVlIHBhaXJzIHBhcnNlZCBmcm9tIHRoZSBjb25maWd1cmVkCisgICAgbWFrZWZpbGUgdXNlZCB0byBidWlsZCB0aGlzIGludGVycHJldGVyLiAgUmV0dXJucworICAgIHRoZSBtYXBwaW5nIHVwZGF0ZWQgYXMgbmVlZGVkIHRvIHJlZmxlY3QgdGhlIGVudmlyb25tZW50CisgICAgaW4gd2hpY2ggdGhlIGludGVycHJldGVyIGlzIHJ1bm5pbmc7IGluIHRoZSBjYXNlIG9mCisgICAgYSBQeXRob24gZnJvbSBhIGJpbmFyeSBpbnN0YWxsZXIsIHRoZSBpbnN0YWxsZWQKKyAgICBlbnZpcm9ubWVudCBtYXkgYmUgdmVyeSBkaWZmZXJlbnQgZnJvbSB0aGUgYnVpbGQKKyAgICBlbnZpcm9ubWVudCwgaS5lLiBkaWZmZXJlbnQgT1MgbGV2ZWxzLCBkaWZmZXJlbnQKKyAgICBidWlsdCB0b29scywgZGlmZmVyZW50IGF2YWlsYWJsZSBDUFUgYXJjaGl0ZWN0dXJlcy4KKworICAgIFRoaXMgY3VzdG9taXphdGlvbiBpcyBwZXJmb3JtZWQgd2hlbmV2ZXIKKyAgICBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdfdmFycygpIGlzIGZpcnN0CisgICAgY2FsbGVkLiAgSXQgbWF5IGJlIHVzZWQgaW4gZW52aXJvbm1lbnRzIHdoZXJlIG5vCisgICAgY29tcGlsZXJzIGFyZSBwcmVzZW50LCBpLmUuIHdoZW4gaW5zdGFsbGluZyBwdXJlCisgICAgUHl0aG9uIGRpc3RzLiAgQ3VzdG9taXphdGlvbiBvZiBjb21waWxlciBwYXRocworICAgIGFuZCBkZXRlY3Rpb24gb2YgdW5hdmFpbGFibGUgYXJjaHMgaXMgZGVmZXJyZWQKKyAgICB1bnRpbCB0aGUgZmlyc3QgZXh0ZW50aW9uIG1vZHVsZSBidWlsZCBpcworICAgIHJlcXVlc3RlZCAoaW4gZGlzdHV0aWxzLnN5c2NvbmZpZy5jdXN0b21pemVfY29tcGlsZXIpLgorCisgICAgQ3VycmVudGx5IGNhbGxlZCBmcm9tIGRpc3R1dGlscy5zeXNjb25maWcKKyAgICAiIiIKKworICAgIGlmIG5vdCBfc3VwcG9ydHNfdW5pdmVyc2FsX2J1aWxkcygpOgorICAgICAgICAjIE9uIE1hYyBPUyBYIGJlZm9yZSAxMC40LCBjaGVjayBpZiAtYXJjaCBhbmQgLWlzeXNyb290CisgICAgICAgICMgYXJlIGluIENGTEFHUyBvciBMREZMQUdTIGFuZCByZW1vdmUgdGhlbSBpZiB0aGV5IGFyZS4KKyAgICAgICAgIyBUaGlzIGlzIG5lZWRlZCB3aGVuIGJ1aWxkaW5nIGV4dGVuc2lvbnMgb24gYSAxMC4zIHN5c3RlbQorICAgICAgICAjIHVzaW5nIGEgdW5pdmVyc2FsIGJ1aWxkIG9mIHB5dGhvbi4KKyAgICAgICAgX3JlbW92ZV91bml2ZXJzYWxfZmxhZ3MoX2NvbmZpZ192YXJzKQorCisgICAgIyBBbGxvdyB1c2VyIHRvIG92ZXJyaWRlIGFsbCBhcmNocyB3aXRoIEFSQ0hGTEFHUyBlbnYgdmFyCisgICAgX292ZXJyaWRlX2FsbF9hcmNocyhfY29uZmlnX3ZhcnMpCisKKyAgICAjIFJlbW92ZSByZWZlcmVuY2VzIHRvIHNka3MgdGhhdCBhcmUgbm90IGZvdW5kCisgICAgX2NoZWNrX2Zvcl91bmF2YWlsYWJsZV9zZGsoX2NvbmZpZ192YXJzKQorCisgICAgcmV0dXJuIF9jb25maWdfdmFycworCisKK2RlZiBjdXN0b21pemVfY29tcGlsZXIoX2NvbmZpZ192YXJzKToKKyAgICAiIiJDdXN0b21pemUgY29tcGlsZXIgcGF0aCBhbmQgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMuCisKKyAgICBUaGlzIGN1c3RvbWl6YXRpb24gaXMgcGVyZm9ybWVkIHdoZW4gdGhlIGZpcnN0CisgICAgZXh0ZW5zaW9uIG1vZHVsZSBidWlsZCBpcyByZXF1ZXN0ZWQKKyAgICBpbiBkaXN0dXRpbHMuc3lzY29uZmlnLmN1c3RvbWl6ZV9jb21waWxlcikuCisgICAgIiIiCisKKyAgICAjIEZpbmQgYSBjb21waWxlciB0byB1c2UgZm9yIGV4dGVuc2lvbiBtb2R1bGUgYnVpbGRzCisgICAgX2ZpbmRfYXBwcm9wcmlhdGVfY29tcGlsZXIoX2NvbmZpZ192YXJzKQorCisgICAgIyBSZW1vdmUgcHBjIGFyY2ggZmxhZ3MgaWYgbm90IHN1cHBvcnRlZCBoZXJlCisgICAgX3JlbW92ZV91bnN1cHBvcnRlZF9hcmNocyhfY29uZmlnX3ZhcnMpCisKKyAgICAjIEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgYWxsIGFyY2hzIHdpdGggQVJDSEZMQUdTIGVudiB2YXIKKyAgICBfb3ZlcnJpZGVfYWxsX2FyY2hzKF9jb25maWdfdmFycykKKworICAgIHJldHVybiBfY29uZmlnX3ZhcnMKKworCitkZWYgZ2V0X3BsYXRmb3JtX29zeChfY29uZmlnX3ZhcnMsIG9zbmFtZSwgcmVsZWFzZSwgbWFjaGluZSk6CisgICAgIiIiRmlsdGVyIHZhbHVlcyBmb3IgZ2V0X3BsYXRmb3JtKCkiIiIKKyAgICAjIGNhbGxlZCBmcm9tIGdldF9wbGF0Zm9ybSgpIGluIHN5c2NvbmZpZyBhbmQgZGlzdHV0aWxzLnV0aWwKKyAgICAjCisgICAgIyBGb3Igb3VyIHB1cnBvc2VzLCB3ZSdsbCBhc3N1bWUgdGhhdCB0aGUgc3lzdGVtIHZlcnNpb24gZnJvbQorICAgICMgZGlzdHV0aWxzJyBwZXJzcGVjdGl2ZSBpcyB3aGF0IE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBpcyBzZXQKKyAgICAjIHRvLiBUaGlzIG1ha2VzIHRoZSBjb21wYXRpYmlsaXR5IHN0b3J5IGEgYml0IG1vcmUgc2FuZSBiZWNhdXNlIHRoZQorICAgICMgbWFjaGluZSBpcyBnb2luZyB0byBjb21waWxlIGFuZCBsaW5rIGFzIGlmIGl0IHdlcmUKKyAgICAjIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVC4KKworICAgIG1hY3ZlciA9IF9jb25maWdfdmFycy5nZXQoJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcsICcnKQorICAgIG1hY3JlbGVhc2UgPSBfZ2V0X3N5c3RlbV92ZXJzaW9uKCkgb3IgbWFjdmVyCisgICAgbWFjdmVyID0gbWFjdmVyIG9yIG1hY3JlbGVhc2UKKworICAgIGlmIG1hY3ZlcjoKKyAgICAgICAgcmVsZWFzZSA9IG1hY3ZlcgorICAgICAgICBvc25hbWUgPSAibWFjb3N4IgorCisgICAgICAgICMgVXNlIHRoZSBvcmlnaW5hbCBDRkxBR1MgdmFsdWUsIGlmIGF2YWlsYWJsZSwgc28gdGhhdCB3ZQorICAgICAgICAjIHJldHVybiB0aGUgc2FtZSBtYWNoaW5lIHR5cGUgZm9yIHRoZSBwbGF0Zm9ybSBzdHJpbmcuCisgICAgICAgICMgT3RoZXJ3aXNlLCBkaXN0dXRpbHMgbWF5IGNvbnNpZGVyIHRoaXMgYSBjcm9zcy1jb21waWxpbmcKKyAgICAgICAgIyBjYXNlIGFuZCBkaXNhbGxvdyBpbnN0YWxscy4KKyAgICAgICAgY2ZsYWdzID0gX2NvbmZpZ192YXJzLmdldChfSU5JVFBSRSsnQ0ZMQUdTJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jb25maWdfdmFycy5nZXQoJ0NGTEFHUycsICcnKSkKKyAgICAgICAgaWYgKChtYWNyZWxlYXNlICsgJy4nKSA+PSAnMTAuNC4nIGFuZAorICAgICAgICAgICAgJy1hcmNoJyBpbiBjZmxhZ3Muc3RyaXAoKSk6CisgICAgICAgICAgICAjIFRoZSB1bml2ZXJzYWwgYnVpbGQgd2lsbCBidWlsZCBmYXQgYmluYXJpZXMsIGJ1dCBub3Qgb24KKyAgICAgICAgICAgICMgc3lzdGVtcyBiZWZvcmUgMTAuNAorCisgICAgICAgICAgICBtYWNoaW5lID0gJ2ZhdCcKKworICAgICAgICAgICAgYXJjaHMgPSByZS5maW5kYWxsKCctYXJjaFxzKyhcUyspJywgY2ZsYWdzKQorICAgICAgICAgICAgYXJjaHMgPSB0dXBsZShzb3J0ZWQoc2V0KGFyY2hzKSkpCisKKyAgICAgICAgICAgIGlmIGxlbihhcmNocykgPT0gMToKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gYXJjaHNbMF0KKyAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3BwYycpOgorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0JworICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAneDg2XzY0Jyk6CisgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdpbnRlbCcKKyAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3BwYycsICd4ODZfNjQnKToKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ZhdDMnCisgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgncHBjNjQnLCAneDg2XzY0Jyk6CisgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdmYXQ2NCcKKyAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdpMzg2JywgJ3BwYycsICdwcGM2NCcsICd4ODZfNjQnKToKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3VuaXZlcnNhbCcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAiRG9uJ3Qga25vdyBtYWNoaW5lIHZhbHVlIGZvciBhcmNocz0lciIgJSAoYXJjaHMsKSkKKworICAgICAgICBlbGlmIG1hY2hpbmUgPT0gJ2kzODYnOgorICAgICAgICAgICAgIyBPbiBPU1ggdGhlIG1hY2hpbmUgdHlwZSByZXR1cm5lZCBieSB1bmFtZSBpcyBhbHdheXMgdGhlCisgICAgICAgICAgICAjIDMyLWJpdCB2YXJpYW50LCBldmVuIGlmIHRoZSBleGVjdXRhYmxlIGFyY2hpdGVjdHVyZSBpcworICAgICAgICAgICAgIyB0aGUgNjQtYml0IHZhcmlhbnQKKyAgICAgICAgICAgIGlmIHN5cy5tYXhpbnQgPj0gMioqMzI6CisgICAgICAgICAgICAgICAgbWFjaGluZSA9ICd4ODZfNjQnCisKKyAgICAgICAgZWxpZiBtYWNoaW5lIGluICgnUG93ZXJQQycsICdQb3dlcl9NYWNpbnRvc2gnKToKKyAgICAgICAgICAgICMgUGljayBhIHNhbmUgbmFtZSBmb3IgdGhlIFBQQyBhcmNoaXRlY3R1cmUuCisgICAgICAgICAgICAjIFNlZSAnaTM4NicgY2FzZQorICAgICAgICAgICAgaWYgc3lzLm1heGludCA+PSAyKiozMjoKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3BwYzY0JworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3BwYycKKworICAgIHJldHVybiAob3NuYW1lLCByZWxlYXNlLCBtYWNoaW5lKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fb3N4X3N1cHBvcnQucHljIGIvbGliL3B5dGhvbjIuNy9fb3N4X3N1cHBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjU4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19vc3hfc3VwcG9ydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fb3N4X3N1cHBvcnQucHlvIGIvbGliL3B5dGhvbjIuNy9fb3N4X3N1cHBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjU4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19vc3hfc3VwcG9ydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fcHlpby5weSBiL2xpYi9weXRob24yLjcvX3B5aW8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk4NmVkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX3B5aW8ucHkKQEAgLTAsMCArMSwyMDE3IEBACisiIiIKK1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW8gbW9kdWxlLgorIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgKHByaW50X2Z1bmN0aW9uLCB1bmljb2RlX2xpdGVyYWxzKQorCitpbXBvcnQgb3MKK2ltcG9ydCBhYmMKK2ltcG9ydCBjb2RlY3MKK2ltcG9ydCB3YXJuaW5ncworaW1wb3J0IGVycm5vCisjIEltcG9ydCB0aHJlYWQgaW5zdGVhZCBvZiB0aHJlYWRpbmcgdG8gcmVkdWNlIHN0YXJ0dXAgY29zdAordHJ5OgorICAgIGZyb20gdGhyZWFkIGltcG9ydCBhbGxvY2F0ZV9sb2NrIGFzIExvY2sKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIGR1bW15X3RocmVhZCBpbXBvcnQgYWxsb2NhdGVfbG9jayBhcyBMb2NrCisKK2ltcG9ydCBpbworZnJvbSBpbyBpbXBvcnQgKF9fYWxsX18sIFNFRUtfU0VULCBTRUVLX0NVUiwgU0VFS19FTkQpCitmcm9tIGVycm5vIGltcG9ydCBFSU5UUgorCitfX21ldGFjbGFzc19fID0gdHlwZQorCisjIG9wZW4oKSB1c2VzIHN0X2Jsa3NpemUgd2hlbmV2ZXIgd2UgY2FuCitERUZBVUxUX0JVRkZFUl9TSVpFID0gOCAqIDEwMjQgICMgYnl0ZXMKKworIyBOT1RFOiBCYXNlIGNsYXNzZXMgZGVmaW5lZCBoZXJlIGFyZSByZWdpc3RlcmVkIHdpdGggdGhlICJvZmZpY2lhbCIgQUJDcworIyBkZWZpbmVkIGluIGlvLnB5LiBXZSBkb24ndCB1c2UgcmVhbCBpbmhlcml0YW5jZSB0aG91Z2gsIGJlY2F1c2Ugd2UgZG9uJ3QKKyMgd2FudCB0byBpbmhlcml0IHRoZSBDIGltcGxlbWVudGF0aW9ucy4KKworCitjbGFzcyBCbG9ja2luZ0lPRXJyb3IoSU9FcnJvcik6CisKKyAgICAiIiJFeGNlcHRpb24gcmFpc2VkIHdoZW4gSS9PIHdvdWxkIGJsb2NrIG9uIGEgbm9uLWJsb2NraW5nIEkvTyBzdHJlYW0uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJybm8sIHN0cmVycm9yLCBjaGFyYWN0ZXJzX3dyaXR0ZW49MCk6CisgICAgICAgIHN1cGVyKElPRXJyb3IsIHNlbGYpLl9faW5pdF9fKGVycm5vLCBzdHJlcnJvcikKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2hhcmFjdGVyc193cml0dGVuLCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNoYXJhY3RlcnNfd3JpdHRlbiBtdXN0IGJlIGEgaW50ZWdlciIpCisgICAgICAgIHNlbGYuY2hhcmFjdGVyc193cml0dGVuID0gY2hhcmFjdGVyc193cml0dGVuCisKKworZGVmIG9wZW4oZmlsZSwgbW9kZT0iciIsIGJ1ZmZlcmluZz0tMSwKKyAgICAgICAgIGVuY29kaW5nPU5vbmUsIGVycm9ycz1Ob25lLAorICAgICAgICAgbmV3bGluZT1Ob25lLCBjbG9zZWZkPVRydWUpOgorCisgICAgciIiIk9wZW4gZmlsZSBhbmQgcmV0dXJuIGEgc3RyZWFtLiAgUmFpc2UgSU9FcnJvciB1cG9uIGZhaWx1cmUuCisKKyAgICBmaWxlIGlzIGVpdGhlciBhIHRleHQgb3IgYnl0ZSBzdHJpbmcgZ2l2aW5nIHRoZSBuYW1lIChhbmQgdGhlIHBhdGgKKyAgICBpZiB0aGUgZmlsZSBpc24ndCBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSkgb2YgdGhlIGZpbGUgdG8KKyAgICBiZSBvcGVuZWQgb3IgYW4gaW50ZWdlciBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGZpbGUgdG8gYmUKKyAgICB3cmFwcGVkLiAoSWYgYSBmaWxlIGRlc2NyaXB0b3IgaXMgZ2l2ZW4sIGl0IGlzIGNsb3NlZCB3aGVuIHRoZQorICAgIHJldHVybmVkIEkvTyBvYmplY3QgaXMgY2xvc2VkLCB1bmxlc3MgY2xvc2VmZCBpcyBzZXQgdG8gRmFsc2UuKQorCisgICAgbW9kZSBpcyBhbiBvcHRpb25hbCBzdHJpbmcgdGhhdCBzcGVjaWZpZXMgdGhlIG1vZGUgaW4gd2hpY2ggdGhlIGZpbGUKKyAgICBpcyBvcGVuZWQuIEl0IGRlZmF1bHRzIHRvICdyJyB3aGljaCBtZWFucyBvcGVuIGZvciByZWFkaW5nIGluIHRleHQKKyAgICBtb2RlLiAgT3RoZXIgY29tbW9uIHZhbHVlcyBhcmUgJ3cnIGZvciB3cml0aW5nICh0cnVuY2F0aW5nIHRoZSBmaWxlIGlmCisgICAgaXQgYWxyZWFkeSBleGlzdHMpLCBhbmQgJ2EnIGZvciBhcHBlbmRpbmcgKHdoaWNoIG9uIHNvbWUgVW5peCBzeXN0ZW1zLAorICAgIG1lYW5zIHRoYXQgYWxsIHdyaXRlcyBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSByZWdhcmRsZXNzIG9mIHRoZQorICAgIGN1cnJlbnQgc2VlayBwb3NpdGlvbikuIEluIHRleHQgbW9kZSwgaWYgZW5jb2RpbmcgaXMgbm90IHNwZWNpZmllZCB0aGUKKyAgICBlbmNvZGluZyB1c2VkIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4gKEZvciByZWFkaW5nIGFuZCB3cml0aW5nIHJhdworICAgIGJ5dGVzIHVzZSBiaW5hcnkgbW9kZSBhbmQgbGVhdmUgZW5jb2RpbmcgdW5zcGVjaWZpZWQuKSBUaGUgYXZhaWxhYmxlCisgICAgbW9kZXMgYXJlOgorCisgICAgPT09PT09PT09ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIENoYXJhY3RlciBNZWFuaW5nCisgICAgLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICdyJyAgICAgICBvcGVuIGZvciByZWFkaW5nIChkZWZhdWx0KQorICAgICd3JyAgICAgICBvcGVuIGZvciB3cml0aW5nLCB0cnVuY2F0aW5nIHRoZSBmaWxlIGZpcnN0CisgICAgJ2EnICAgICAgIG9wZW4gZm9yIHdyaXRpbmcsIGFwcGVuZGluZyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGlmIGl0IGV4aXN0cworICAgICdiJyAgICAgICBiaW5hcnkgbW9kZQorICAgICd0JyAgICAgICB0ZXh0IG1vZGUgKGRlZmF1bHQpCisgICAgJysnICAgICAgIG9wZW4gYSBkaXNrIGZpbGUgZm9yIHVwZGF0aW5nIChyZWFkaW5nIGFuZCB3cml0aW5nKQorICAgICdVJyAgICAgICB1bml2ZXJzYWwgbmV3bGluZSBtb2RlIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk7IHVubmVlZGVkCisgICAgICAgICAgICAgIGZvciBuZXcgY29kZSkKKyAgICA9PT09PT09PT0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBUaGUgZGVmYXVsdCBtb2RlIGlzICdydCcgKG9wZW4gZm9yIHJlYWRpbmcgdGV4dCkuIEZvciBiaW5hcnkgcmFuZG9tCisgICAgYWNjZXNzLCB0aGUgbW9kZSAndytiJyBvcGVucyBhbmQgdHJ1bmNhdGVzIHRoZSBmaWxlIHRvIDAgYnl0ZXMsIHdoaWxlCisgICAgJ3IrYicgb3BlbnMgdGhlIGZpbGUgd2l0aG91dCB0cnVuY2F0aW9uLgorCisgICAgUHl0aG9uIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBmaWxlcyBvcGVuZWQgaW4gYmluYXJ5IGFuZCB0ZXh0IG1vZGVzLAorICAgIGV2ZW4gd2hlbiB0aGUgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtIGRvZXNuJ3QuIEZpbGVzIG9wZW5lZCBpbgorICAgIGJpbmFyeSBtb2RlIChhcHBlbmRpbmcgJ2InIHRvIHRoZSBtb2RlIGFyZ3VtZW50KSByZXR1cm4gY29udGVudHMgYXMKKyAgICBieXRlcyBvYmplY3RzIHdpdGhvdXQgYW55IGRlY29kaW5nLiBJbiB0ZXh0IG1vZGUgKHRoZSBkZWZhdWx0LCBvciB3aGVuCisgICAgJ3QnIGlzIGFwcGVuZGVkIHRvIHRoZSBtb2RlIGFyZ3VtZW50KSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGFyZQorICAgIHJldHVybmVkIGFzIHN0cmluZ3MsIHRoZSBieXRlcyBoYXZpbmcgYmVlbiBmaXJzdCBkZWNvZGVkIHVzaW5nIGEKKyAgICBwbGF0Zm9ybS1kZXBlbmRlbnQgZW5jb2Rpbmcgb3IgdXNpbmcgdGhlIHNwZWNpZmllZCBlbmNvZGluZyBpZiBnaXZlbi4KKworICAgIGJ1ZmZlcmluZyBpcyBhbiBvcHRpb25hbCBpbnRlZ2VyIHVzZWQgdG8gc2V0IHRoZSBidWZmZXJpbmcgcG9saWN5LgorICAgIFBhc3MgMCB0byBzd2l0Y2ggYnVmZmVyaW5nIG9mZiAob25seSBhbGxvd2VkIGluIGJpbmFyeSBtb2RlKSwgMSB0byBzZWxlY3QKKyAgICBsaW5lIGJ1ZmZlcmluZyAob25seSB1c2FibGUgaW4gdGV4dCBtb2RlKSwgYW5kIGFuIGludGVnZXIgPiAxIHRvIGluZGljYXRlCisgICAgdGhlIHNpemUgb2YgYSBmaXhlZC1zaXplIGNodW5rIGJ1ZmZlci4gIFdoZW4gbm8gYnVmZmVyaW5nIGFyZ3VtZW50IGlzCisgICAgZ2l2ZW4sIHRoZSBkZWZhdWx0IGJ1ZmZlcmluZyBwb2xpY3kgd29ya3MgYXMgZm9sbG93czoKKworICAgICogQmluYXJ5IGZpbGVzIGFyZSBidWZmZXJlZCBpbiBmaXhlZC1zaXplIGNodW5rczsgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgorICAgICAgaXMgY2hvc2VuIHVzaW5nIGEgaGV1cmlzdGljIHRyeWluZyB0byBkZXRlcm1pbmUgdGhlIHVuZGVybHlpbmcgZGV2aWNlJ3MKKyAgICAgICJibG9jayBzaXplIiBhbmQgZmFsbGluZyBiYWNrIG9uIGBpby5ERUZBVUxUX0JVRkZFUl9TSVpFYC4KKyAgICAgIE9uIG1hbnkgc3lzdGVtcywgdGhlIGJ1ZmZlciB3aWxsIHR5cGljYWxseSBiZSA0MDk2IG9yIDgxOTIgYnl0ZXMgbG9uZy4KKworICAgICogIkludGVyYWN0aXZlIiB0ZXh0IGZpbGVzIChmaWxlcyBmb3Igd2hpY2ggaXNhdHR5KCkgcmV0dXJucyBUcnVlKQorICAgICAgdXNlIGxpbmUgYnVmZmVyaW5nLiAgT3RoZXIgdGV4dCBmaWxlcyB1c2UgdGhlIHBvbGljeSBkZXNjcmliZWQgYWJvdmUKKyAgICAgIGZvciBiaW5hcnkgZmlsZXMuCisKKyAgICBlbmNvZGluZyBpcyB0aGUgbmFtZSBvZiB0aGUgZW5jb2RpbmcgdXNlZCB0byBkZWNvZGUgb3IgZW5jb2RlIHRoZQorICAgIGZpbGUuIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiB0ZXh0IG1vZGUuIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzCisgICAgcGxhdGZvcm0gZGVwZW5kZW50LCBidXQgYW55IGVuY29kaW5nIHN1cHBvcnRlZCBieSBQeXRob24gY2FuIGJlCisgICAgcGFzc2VkLiAgU2VlIHRoZSBjb2RlY3MgbW9kdWxlIGZvciB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZW5jb2RpbmdzLgorCisgICAgZXJyb3JzIGlzIGFuIG9wdGlvbmFsIHN0cmluZyB0aGF0IHNwZWNpZmllcyBob3cgZW5jb2RpbmcgZXJyb3JzIGFyZSB0bworICAgIGJlIGhhbmRsZWQtLS10aGlzIGFyZ3VtZW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBiaW5hcnkgbW9kZS4gUGFzcworICAgICdzdHJpY3QnIHRvIHJhaXNlIGEgVmFsdWVFcnJvciBleGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZW5jb2RpbmcgZXJyb3IKKyAgICAodGhlIGRlZmF1bHQgb2YgTm9uZSBoYXMgdGhlIHNhbWUgZWZmZWN0KSwgb3IgcGFzcyAnaWdub3JlJyB0byBpZ25vcmUKKyAgICBlcnJvcnMuIChOb3RlIHRoYXQgaWdub3JpbmcgZW5jb2RpbmcgZXJyb3JzIGNhbiBsZWFkIHRvIGRhdGEgbG9zcy4pCisgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBjb2RlY3MucmVnaXN0ZXIgZm9yIGEgbGlzdCBvZiB0aGUgcGVybWl0dGVkCisgICAgZW5jb2RpbmcgZXJyb3Igc3RyaW5ncy4KKworICAgIG5ld2xpbmUgY29udHJvbHMgaG93IHVuaXZlcnNhbCBuZXdsaW5lcyB3b3JrcyAoaXQgb25seSBhcHBsaWVzIHRvIHRleHQKKyAgICBtb2RlKS4gSXQgY2FuIGJlIE5vbmUsICcnLCAnXG4nLCAnXHInLCBhbmQgJ1xyXG4nLiAgSXQgd29ya3MgYXMKKyAgICBmb2xsb3dzOgorCisgICAgKiBPbiBpbnB1dCwgaWYgbmV3bGluZSBpcyBOb25lLCB1bml2ZXJzYWwgbmV3bGluZXMgbW9kZSBpcworICAgICAgZW5hYmxlZC4gTGluZXMgaW4gdGhlIGlucHV0IGNhbiBlbmQgaW4gJ1xuJywgJ1xyJywgb3IgJ1xyXG4nLCBhbmQKKyAgICAgIHRoZXNlIGFyZSB0cmFuc2xhdGVkIGludG8gJ1xuJyBiZWZvcmUgYmVpbmcgcmV0dXJuZWQgdG8gdGhlCisgICAgICBjYWxsZXIuIElmIGl0IGlzICcnLCB1bml2ZXJzYWwgbmV3bGluZSBtb2RlIGlzIGVuYWJsZWQsIGJ1dCBsaW5lCisgICAgICBlbmRpbmdzIGFyZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyIHVudHJhbnNsYXRlZC4gSWYgaXQgaGFzIGFueSBvZgorICAgICAgdGhlIG90aGVyIGxlZ2FsIHZhbHVlcywgaW5wdXQgbGluZXMgYXJlIG9ubHkgdGVybWluYXRlZCBieSB0aGUgZ2l2ZW4KKyAgICAgIHN0cmluZywgYW5kIHRoZSBsaW5lIGVuZGluZyBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyIHVudHJhbnNsYXRlZC4KKworICAgICogT24gb3V0cHV0LCBpZiBuZXdsaW5lIGlzIE5vbmUsIGFueSAnXG4nIGNoYXJhY3RlcnMgd3JpdHRlbiBhcmUKKyAgICAgIHRyYW5zbGF0ZWQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IGxpbmUgc2VwYXJhdG9yLCBvcy5saW5lc2VwLiBJZgorICAgICAgbmV3bGluZSBpcyAnJywgbm8gdHJhbnNsYXRpb24gdGFrZXMgcGxhY2UuIElmIG5ld2xpbmUgaXMgYW55IG9mIHRoZQorICAgICAgb3RoZXIgbGVnYWwgdmFsdWVzLCBhbnkgJ1xuJyBjaGFyYWN0ZXJzIHdyaXR0ZW4gYXJlIHRyYW5zbGF0ZWQgdG8KKyAgICAgIHRoZSBnaXZlbiBzdHJpbmcuCisKKyAgICBJZiBjbG9zZWZkIGlzIEZhbHNlLCB0aGUgdW5kZXJseWluZyBmaWxlIGRlc2NyaXB0b3Igd2lsbCBiZSBrZXB0IG9wZW4KKyAgICB3aGVuIHRoZSBmaWxlIGlzIGNsb3NlZC4gVGhpcyBkb2VzIG5vdCB3b3JrIHdoZW4gYSBmaWxlIG5hbWUgaXMgZ2l2ZW4KKyAgICBhbmQgbXVzdCBiZSBUcnVlIGluIHRoYXQgY2FzZS4KKworICAgIG9wZW4oKSByZXR1cm5zIGEgZmlsZSBvYmplY3Qgd2hvc2UgdHlwZSBkZXBlbmRzIG9uIHRoZSBtb2RlLCBhbmQKKyAgICB0aHJvdWdoIHdoaWNoIHRoZSBzdGFuZGFyZCBmaWxlIG9wZXJhdGlvbnMgc3VjaCBhcyByZWFkaW5nIGFuZCB3cml0aW5nCisgICAgYXJlIHBlcmZvcm1lZC4gV2hlbiBvcGVuKCkgaXMgdXNlZCB0byBvcGVuIGEgZmlsZSBpbiBhIHRleHQgbW9kZSAoJ3cnLAorICAgICdyJywgJ3d0JywgJ3J0JywgZXRjLiksIGl0IHJldHVybnMgYSBUZXh0SU9XcmFwcGVyLiBXaGVuIHVzZWQgdG8gb3BlbgorICAgIGEgZmlsZSBpbiBhIGJpbmFyeSBtb2RlLCB0aGUgcmV0dXJuZWQgY2xhc3MgdmFyaWVzOiBpbiByZWFkIGJpbmFyeQorICAgIG1vZGUsIGl0IHJldHVybnMgYSBCdWZmZXJlZFJlYWRlcjsgaW4gd3JpdGUgYmluYXJ5IGFuZCBhcHBlbmQgYmluYXJ5CisgICAgbW9kZXMsIGl0IHJldHVybnMgYSBCdWZmZXJlZFdyaXRlciwgYW5kIGluIHJlYWQvd3JpdGUgbW9kZSwgaXQgcmV0dXJucworICAgIGEgQnVmZmVyZWRSYW5kb20uCisKKyAgICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBhIHN0cmluZyBvciBieXRlYXJyYXkgYXMgYSBmaWxlIGZvciBib3RoCisgICAgcmVhZGluZyBhbmQgd3JpdGluZy4gRm9yIHN0cmluZ3MgU3RyaW5nSU8gY2FuIGJlIHVzZWQgbGlrZSBhIGZpbGUKKyAgICBvcGVuZWQgaW4gYSB0ZXh0IG1vZGUsIGFuZCBmb3IgYnl0ZXMgYSBCeXRlc0lPIGNhbiBiZSB1c2VkIGxpa2UgYSBmaWxlCisgICAgb3BlbmVkIGluIGEgYmluYXJ5IG1vZGUuCisgICAgIiIiCisgICAgaWYgbm90IGlzaW5zdGFuY2UoZmlsZSwgKGJhc2VzdHJpbmcsIGludCwgbG9uZykpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQgZmlsZTogJXIiICUgZmlsZSkKKyAgICBpZiBub3QgaXNpbnN0YW5jZShtb2RlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnZhbGlkIG1vZGU6ICVyIiAlIG1vZGUpCisgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVmZmVyaW5nLCAoaW50LCBsb25nKSk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBidWZmZXJpbmc6ICVyIiAlIGJ1ZmZlcmluZykKKyAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UoZW5jb2RpbmcsIGJhc2VzdHJpbmcpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQgZW5jb2Rpbmc6ICVyIiAlIGVuY29kaW5nKQorICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UoZXJyb3JzLCBiYXNlc3RyaW5nKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnZhbGlkIGVycm9yczogJXIiICUgZXJyb3JzKQorICAgIG1vZGVzID0gc2V0KG1vZGUpCisgICAgaWYgbW9kZXMgLSBzZXQoImFyd2IrdFUiKSBvciBsZW4obW9kZSkgPiBsZW4obW9kZXMpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIG1vZGU6ICVyIiAlIG1vZGUpCisgICAgcmVhZGluZyA9ICJyIiBpbiBtb2RlcworICAgIHdyaXRpbmcgPSAidyIgaW4gbW9kZXMKKyAgICBhcHBlbmRpbmcgPSAiYSIgaW4gbW9kZXMKKyAgICB1cGRhdGluZyA9ICIrIiBpbiBtb2RlcworICAgIHRleHQgPSAidCIgaW4gbW9kZXMKKyAgICBiaW5hcnkgPSAiYiIgaW4gbW9kZXMKKyAgICBpZiAiVSIgaW4gbW9kZXM6CisgICAgICAgIGlmIHdyaXRpbmcgb3IgYXBwZW5kaW5nOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2FuJ3QgdXNlIFUgYW5kIHdyaXRpbmcgbW9kZSBhdCBvbmNlIikKKyAgICAgICAgcmVhZGluZyA9IFRydWUKKyAgICBpZiB0ZXh0IGFuZCBiaW5hcnk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbid0IGhhdmUgdGV4dCBhbmQgYmluYXJ5IG1vZGUgYXQgb25jZSIpCisgICAgaWYgcmVhZGluZyArIHdyaXRpbmcgKyBhcHBlbmRpbmcgPiAxOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW4ndCBoYXZlIHJlYWQvd3JpdGUvYXBwZW5kIG1vZGUgYXQgb25jZSIpCisgICAgaWYgbm90IChyZWFkaW5nIG9yIHdyaXRpbmcgb3IgYXBwZW5kaW5nKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibXVzdCBoYXZlIGV4YWN0bHkgb25lIG9mIHJlYWQvd3JpdGUvYXBwZW5kIG1vZGUiKQorICAgIGlmIGJpbmFyeSBhbmQgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImJpbmFyeSBtb2RlIGRvZXNuJ3QgdGFrZSBhbiBlbmNvZGluZyBhcmd1bWVudCIpCisgICAgaWYgYmluYXJ5IGFuZCBlcnJvcnMgaXMgbm90IE5vbmU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImJpbmFyeSBtb2RlIGRvZXNuJ3QgdGFrZSBhbiBlcnJvcnMgYXJndW1lbnQiKQorICAgIGlmIGJpbmFyeSBhbmQgbmV3bGluZSBpcyBub3QgTm9uZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYmluYXJ5IG1vZGUgZG9lc24ndCB0YWtlIGEgbmV3bGluZSBhcmd1bWVudCIpCisgICAgcmF3ID0gRmlsZUlPKGZpbGUsCisgICAgICAgICAgICAgICAgIChyZWFkaW5nIGFuZCAiciIgb3IgIiIpICsKKyAgICAgICAgICAgICAgICAgKHdyaXRpbmcgYW5kICJ3IiBvciAiIikgKworICAgICAgICAgICAgICAgICAoYXBwZW5kaW5nIGFuZCAiYSIgb3IgIiIpICsKKyAgICAgICAgICAgICAgICAgKHVwZGF0aW5nIGFuZCAiKyIgb3IgIiIpLAorICAgICAgICAgICAgICAgICBjbG9zZWZkKQorICAgIGxpbmVfYnVmZmVyaW5nID0gRmFsc2UKKyAgICBpZiBidWZmZXJpbmcgPT0gMSBvciBidWZmZXJpbmcgPCAwIGFuZCByYXcuaXNhdHR5KCk6CisgICAgICAgIGJ1ZmZlcmluZyA9IC0xCisgICAgICAgIGxpbmVfYnVmZmVyaW5nID0gVHJ1ZQorICAgIGlmIGJ1ZmZlcmluZyA8IDA6CisgICAgICAgIGJ1ZmZlcmluZyA9IERFRkFVTFRfQlVGRkVSX1NJWkUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnMgPSBvcy5mc3RhdChyYXcuZmlsZW5vKCkpLnN0X2Jsa3NpemUKKyAgICAgICAgZXhjZXB0IChvcy5lcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgYnMgPiAxOgorICAgICAgICAgICAgICAgIGJ1ZmZlcmluZyA9IGJzCisgICAgaWYgYnVmZmVyaW5nIDwgMDoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCBidWZmZXJpbmcgc2l6ZSIpCisgICAgaWYgYnVmZmVyaW5nID09IDA6CisgICAgICAgIGlmIGJpbmFyeToKKyAgICAgICAgICAgIHJldHVybiByYXcKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2FuJ3QgaGF2ZSB1bmJ1ZmZlcmVkIHRleHQgSS9PIikKKyAgICBpZiB1cGRhdGluZzoKKyAgICAgICAgYnVmZmVyID0gQnVmZmVyZWRSYW5kb20ocmF3LCBidWZmZXJpbmcpCisgICAgZWxpZiB3cml0aW5nIG9yIGFwcGVuZGluZzoKKyAgICAgICAgYnVmZmVyID0gQnVmZmVyZWRXcml0ZXIocmF3LCBidWZmZXJpbmcpCisgICAgZWxpZiByZWFkaW5nOgorICAgICAgICBidWZmZXIgPSBCdWZmZXJlZFJlYWRlcihyYXcsIGJ1ZmZlcmluZykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIG1vZGU6ICVyIiAlIG1vZGUpCisgICAgaWYgYmluYXJ5OgorICAgICAgICByZXR1cm4gYnVmZmVyCisgICAgdGV4dCA9IFRleHRJT1dyYXBwZXIoYnVmZmVyLCBlbmNvZGluZywgZXJyb3JzLCBuZXdsaW5lLCBsaW5lX2J1ZmZlcmluZykKKyAgICB0ZXh0Lm1vZGUgPSBtb2RlCisgICAgcmV0dXJuIHRleHQKKworCitjbGFzcyBEb2NEZXNjcmlwdG9yOgorICAgICIiIkhlbHBlciBmb3IgYnVpbHRpbnMub3Blbi5fX2RvY19fCisgICAgIiIiCisgICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCB0eXApOgorICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgIm9wZW4oZmlsZSwgbW9kZT0ncicsIGJ1ZmZlcmluZz0tMSwgZW5jb2Rpbmc9Tm9uZSwgIgorICAgICAgICAgICAgICAgICAiZXJyb3JzPU5vbmUsIG5ld2xpbmU9Tm9uZSwgY2xvc2VmZD1UcnVlKVxuXG4iICsKKyAgICAgICAgICAgIG9wZW4uX19kb2NfXykKKworY2xhc3MgT3BlbldyYXBwZXI6CisgICAgIiIiV3JhcHBlciBmb3IgYnVpbHRpbnMub3BlbgorCisgICAgVHJpY2sgc28gdGhhdCBvcGVuIHdvbid0IGJlY29tZSBhIGJvdW5kIG1ldGhvZCB3aGVuIHN0b3JlZAorICAgIGFzIGEgY2xhc3MgdmFyaWFibGUgKGFzIGRibS5kdW1iIGRvZXMpLgorCisgICAgU2VlIGluaXRzdGRpbygpIGluIFB5dGhvbi9weXRob25ydW4uYy4KKyAgICAiIiIKKyAgICBfX2RvY19fID0gRG9jRGVzY3JpcHRvcigpCisKKyAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBvcGVuKCphcmdzLCAqKmt3YXJncykKKworCitjbGFzcyBVbnN1cHBvcnRlZE9wZXJhdGlvbihWYWx1ZUVycm9yLCBJT0Vycm9yKToKKyAgICBwYXNzCisKKworY2xhc3MgSU9CYXNlOgorICAgIF9fbWV0YWNsYXNzX18gPSBhYmMuQUJDTWV0YQorCisgICAgIiIiVGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFsbCBJL08gY2xhc3NlcywgYWN0aW5nIG9uIHN0cmVhbXMgb2YKKyAgICBieXRlcy4gVGhlcmUgaXMgbm8gcHVibGljIGNvbnN0cnVjdG9yLgorCisgICAgVGhpcyBjbGFzcyBwcm92aWRlcyBkdW1teSBpbXBsZW1lbnRhdGlvbnMgZm9yIG1hbnkgbWV0aG9kcyB0aGF0CisgICAgZGVyaXZlZCBjbGFzc2VzIGNhbiBvdmVycmlkZSBzZWxlY3RpdmVseTsgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zCisgICAgcmVwcmVzZW50IGEgZmlsZSB0aGF0IGNhbm5vdCBiZSByZWFkLCB3cml0dGVuIG9yIHNlZWtlZC4KKworICAgIEV2ZW4gdGhvdWdoIElPQmFzZSBkb2VzIG5vdCBkZWNsYXJlIHJlYWQsIHJlYWRpbnRvLCBvciB3cml0ZSBiZWNhdXNlCisgICAgdGhlaXIgc2lnbmF0dXJlcyB3aWxsIHZhcnksIGltcGxlbWVudGF0aW9ucyBhbmQgY2xpZW50cyBzaG91bGQKKyAgICBjb25zaWRlciB0aG9zZSBtZXRob2RzIHBhcnQgb2YgdGhlIGludGVyZmFjZS4gQWxzbywgaW1wbGVtZW50YXRpb25zCisgICAgbWF5IHJhaXNlIGEgSU9FcnJvciB3aGVuIG9wZXJhdGlvbnMgdGhleSBkbyBub3Qgc3VwcG9ydCBhcmUgY2FsbGVkLgorCisgICAgVGhlIGJhc2ljIHR5cGUgdXNlZCBmb3IgYmluYXJ5IGRhdGEgcmVhZCBmcm9tIG9yIHdyaXR0ZW4gdG8gYSBmaWxlIGlzCisgICAgYnl0ZXMuIGJ5dGVhcnJheXMgYXJlIGFjY2VwdGVkIHRvbywgYW5kIGluIHNvbWUgY2FzZXMgKHN1Y2ggYXMKKyAgICByZWFkaW50bykgbmVlZGVkLiBUZXh0IEkvTyBjbGFzc2VzIHdvcmsgd2l0aCBzdHIgZGF0YS4KKworICAgIE5vdGUgdGhhdCBjYWxsaW5nIGFueSBtZXRob2QgKGV2ZW4gaW5xdWlyaWVzKSBvbiBhIGNsb3NlZCBzdHJlYW0gaXMKKyAgICB1bmRlZmluZWQuIEltcGxlbWVudGF0aW9ucyBtYXkgcmFpc2UgSU9FcnJvciBpbiB0aGlzIGNhc2UuCisKKyAgICBJT0Jhc2UgKGFuZCBpdHMgc3ViY2xhc3Nlcykgc3VwcG9ydCB0aGUgaXRlcmF0b3IgcHJvdG9jb2wsIG1lYW5pbmcKKyAgICB0aGF0IGFuIElPQmFzZSBvYmplY3QgY2FuIGJlIGl0ZXJhdGVkIG92ZXIgeWllbGRpbmcgdGhlIGxpbmVzIGluIGEKKyAgICBzdHJlYW0uCisKKyAgICBJT0Jhc2UgYWxzbyBzdXBwb3J0cyB0aGUgOmtleXdvcmQ6YHdpdGhgIHN0YXRlbWVudC4gSW4gdGhpcyBleGFtcGxlLAorICAgIGZwIGlzIGNsb3NlZCBhZnRlciB0aGUgc3VpdGUgb2YgdGhlIHdpdGggc3RhdGVtZW50IGlzIGNvbXBsZXRlOgorCisgICAgd2l0aCBvcGVuKCdzcGFtLnR4dCcsICdyJykgYXMgZnA6CisgICAgICAgIGZwLndyaXRlKCdTcGFtIGFuZCBlZ2dzIScpCisgICAgIiIiCisKKyAgICAjIyMgSW50ZXJuYWwgIyMjCisKKyAgICBkZWYgX3Vuc3VwcG9ydGVkKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJJbnRlcm5hbDogcmFpc2UgYW4gZXhjZXB0aW9uIGZvciB1bnN1cHBvcnRlZCBvcGVyYXRpb25zLiIiIgorICAgICAgICByYWlzZSBVbnN1cHBvcnRlZE9wZXJhdGlvbigiJXMuJXMoKSBub3Qgc3VwcG9ydGVkIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgbmFtZSkpCisKKyAgICAjIyMgUG9zaXRpb25pbmcgIyMjCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3MsIHdoZW5jZT0wKToKKyAgICAgICAgIiIiQ2hhbmdlIHN0cmVhbSBwb3NpdGlvbi4KKworICAgICAgICBDaGFuZ2UgdGhlIHN0cmVhbSBwb3NpdGlvbiB0byBieXRlIG9mZnNldCBwb3MuIEFyZ3VtZW50IHBvcyBpcworICAgICAgICBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgcG9zaXRpb24gaW5kaWNhdGVkIGJ5IHdoZW5jZS4gIFZhbHVlcworICAgICAgICBmb3Igd2hlbmNlIGFyZToKKworICAgICAgICAqIDAgLS0gc3RhcnQgb2Ygc3RyZWFtICh0aGUgZGVmYXVsdCk7IG9mZnNldCBzaG91bGQgYmUgemVybyBvciBwb3NpdGl2ZQorICAgICAgICAqIDEgLS0gY3VycmVudCBzdHJlYW0gcG9zaXRpb247IG9mZnNldCBtYXkgYmUgbmVnYXRpdmUKKyAgICAgICAgKiAyIC0tIGVuZCBvZiBzdHJlYW07IG9mZnNldCBpcyB1c3VhbGx5IG5lZ2F0aXZlCisKKyAgICAgICAgUmV0dXJuIHRoZSBuZXcgYWJzb2x1dGUgcG9zaXRpb24uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl91bnN1cHBvcnRlZCgic2VlayIpCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5zZWVrKDAsIDEpCisKKyAgICBkZWYgdHJ1bmNhdGUoc2VsZiwgcG9zPU5vbmUpOgorICAgICAgICAiIiJUcnVuY2F0ZSBmaWxlIHRvIHNpemUgYnl0ZXMuCisKKyAgICAgICAgU2l6ZSBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBJTyBwb3NpdGlvbiBhcyByZXBvcnRlZCBieSB0ZWxsKCkuICBSZXR1cm4KKyAgICAgICAgdGhlIG5ldyBzaXplLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fdW5zdXBwb3J0ZWQoInRydW5jYXRlIikKKworICAgICMjIyBGbHVzaCBhbmQgY2xvc2UgIyMjCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICIiIkZsdXNoIHdyaXRlIGJ1ZmZlcnMsIGlmIGFwcGxpY2FibGUuCisKKyAgICAgICAgVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIHJlYWQtb25seSBhbmQgbm9uLWJsb2NraW5nIHN0cmVhbXMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVja0Nsb3NlZCgpCisgICAgICAgICMgWFhYIFNob3VsZCB0aGlzIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4/Pz8KKworICAgIF9fY2xvc2VkID0gRmFsc2UKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiRmx1c2ggYW5kIGNsb3NlIHRoZSBJTyBvYmplY3QuCisKKyAgICAgICAgVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGNsb3NlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9fY2xvc2VkOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLl9fY2xvc2VkID0gVHJ1ZQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICIiIkRlc3RydWN0b3IuICBDYWxscyBjbG9zZSgpLiIiIgorICAgICAgICAjIFRoZSB0cnkvZXhjZXB0IGJsb2NrIGlzIGluIGNhc2UgdGhpcyBpcyBjYWxsZWQgYXQgcHJvZ3JhbQorICAgICAgICAjIGV4aXQgdGltZSwgd2hlbiBpdCdzIHBvc3NpYmxlIHRoYXQgZ2xvYmFscyBoYXZlIGFscmVhZHkgYmVlbgorICAgICAgICAjIGRlbGV0ZWQsIGFuZCB0aGVuIHRoZSBjbG9zZSgpIGNhbGwgbWlnaHQgZmFpbC4gIFNpbmNlCisgICAgICAgICMgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCBzdWNoIGZhaWx1cmVzIGFuZCB0aGV5IGFubm95CisgICAgICAgICMgdGhlIGVuZCB1c2Vycywgd2Ugc3VwcHJlc3MgdGhlIHRyYWNlYmFjay4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgICMjIyBJbnF1aXJpZXMgIyMjCisKKyAgICBkZWYgc2Vla2FibGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB3aGV0aGVyIG9iamVjdCBzdXBwb3J0cyByYW5kb20gYWNjZXNzLgorCisgICAgICAgIElmIEZhbHNlLCBzZWVrKCksIHRlbGwoKSBhbmQgdHJ1bmNhdGUoKSB3aWxsIHJhaXNlIElPRXJyb3IuCisgICAgICAgIFRoaXMgbWV0aG9kIG1heSBuZWVkIHRvIGRvIGEgdGVzdCBzZWVrKCkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfY2hlY2tTZWVrYWJsZShzZWxmLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkludGVybmFsOiByYWlzZSBhbiBJT0Vycm9yIGlmIGZpbGUgaXMgbm90IHNlZWthYmxlCisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi5zZWVrYWJsZSgpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiRmlsZSBvciBzdHJlYW0gaXMgbm90IHNlZWthYmxlLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbXNnIGlzIE5vbmUgZWxzZSBtc2cpCisKKworICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgb2JqZWN0IHdhcyBvcGVuZWQgZm9yIHJlYWRpbmcuCisKKyAgICAgICAgSWYgRmFsc2UsIHJlYWQoKSB3aWxsIHJhaXNlIElPRXJyb3IuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfY2hlY2tSZWFkYWJsZShzZWxmLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkludGVybmFsOiByYWlzZSBhbiBJT0Vycm9yIGlmIGZpbGUgaXMgbm90IHJlYWRhYmxlCisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi5yZWFkYWJsZSgpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiRmlsZSBvciBzdHJlYW0gaXMgbm90IHJlYWRhYmxlLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbXNnIGlzIE5vbmUgZWxzZSBtc2cpCisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB3aGV0aGVyIG9iamVjdCB3YXMgb3BlbmVkIGZvciB3cml0aW5nLgorCisgICAgICAgIElmIEZhbHNlLCB3cml0ZSgpIGFuZCB0cnVuY2F0ZSgpIHdpbGwgcmFpc2UgSU9FcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9jaGVja1dyaXRhYmxlKHNlbGYsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHJhaXNlIGFuIElPRXJyb3IgaWYgZmlsZSBpcyBub3Qgd3JpdGFibGUKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLndyaXRhYmxlKCk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJGaWxlIG9yIHN0cmVhbSBpcyBub3Qgd3JpdGFibGUuIgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtc2cgaXMgTm9uZSBlbHNlIG1zZykKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjbG9zZWQoc2VsZik6CisgICAgICAgICIiImNsb3NlZDogYm9vbC4gIFRydWUgaWZmIHRoZSBmaWxlIGhhcyBiZWVuIGNsb3NlZC4KKworICAgICAgICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHRoaXMgaXMgYSBwcm9wZXJ0eSwgbm90IGEgcHJlZGljYXRlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbG9zZWQKKworICAgIGRlZiBfY2hlY2tDbG9zZWQoc2VsZiwgbXNnPU5vbmUpOgorICAgICAgICAiIiJJbnRlcm5hbDogcmFpc2UgYW4gVmFsdWVFcnJvciBpZiBmaWxlIGlzIGNsb3NlZAorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbXNnIGlzIE5vbmUgZWxzZSBtc2cpCisKKyAgICAjIyMgQ29udGV4dCBtYW5hZ2VyICMjIworCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgIiIiQ29udGV4dCBtYW5hZ2VtZW50IHByb3RvY29sLiAgUmV0dXJucyBzZWxmLiIiIgorICAgICAgICBzZWxmLl9jaGVja0Nsb3NlZCgpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJDb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2wuICBDYWxscyBjbG9zZSgpIiIiCisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgIyMjIExvd2VyLWxldmVsIEFQSXMgIyMjCisKKyAgICAjIFhYWCBTaG91bGQgdGhlc2UgYmUgcHJlc2VudCBldmVuIGlmIHVuaW1wbGVtZW50ZWQ/CisKKyAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHVuZGVybHlpbmcgZmlsZSBkZXNjcmlwdG9yIGlmIG9uZSBleGlzdHMuCisKKyAgICAgICAgQW4gSU9FcnJvciBpcyByYWlzZWQgaWYgdGhlIElPIG9iamVjdCBkb2VzIG5vdCB1c2UgYSBmaWxlIGRlc2NyaXB0b3IuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl91bnN1cHBvcnRlZCgiZmlsZW5vIikKKworICAgIGRlZiBpc2F0dHkoc2VsZik6CisgICAgICAgICIiIlJldHVybiB3aGV0aGVyIHRoaXMgaXMgYW4gJ2ludGVyYWN0aXZlJyBzdHJlYW0uCisKKyAgICAgICAgUmV0dXJuIEZhbHNlIGlmIGl0IGNhbid0IGJlIGRldGVybWluZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVja0Nsb3NlZCgpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyMjIFJlYWRsaW5lW3NdIGFuZCB3cml0ZWxpbmVzICMjIworCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsIGxpbWl0PS0xKToKKyAgICAgICAgciIiIlJlYWQgYW5kIHJldHVybiBhIGxpbmUgZnJvbSB0aGUgc3RyZWFtLgorCisgICAgICAgIElmIGxpbWl0IGlzIHNwZWNpZmllZCwgYXQgbW9zdCBsaW1pdCBieXRlcyB3aWxsIGJlIHJlYWQuCisKKyAgICAgICAgVGhlIGxpbmUgdGVybWluYXRvciBpcyBhbHdheXMgYidcbicgZm9yIGJpbmFyeSBmaWxlczsgZm9yIHRleHQKKyAgICAgICAgZmlsZXMsIHRoZSBuZXdsaW5lcyBhcmd1bWVudCB0byBvcGVuIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB0aGUgbGluZQorICAgICAgICB0ZXJtaW5hdG9yKHMpIHJlY29nbml6ZWQuCisgICAgICAgICIiIgorICAgICAgICAjIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYSAoc2xvd2lzaCkgcmVhZGxpbmUoKS4KKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAicGVlayIpOgorICAgICAgICAgICAgZGVmIG5yZWFkYWhlYWQoKToKKyAgICAgICAgICAgICAgICByZWFkYWhlYWQgPSBzZWxmLnBlZWsoMSkKKyAgICAgICAgICAgICAgICBpZiBub3QgcmVhZGFoZWFkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgICAgIG4gPSAocmVhZGFoZWFkLmZpbmQoYiJcbiIpICsgMSkgb3IgbGVuKHJlYWRhaGVhZCkKKyAgICAgICAgICAgICAgICBpZiBsaW1pdCA+PSAwOgorICAgICAgICAgICAgICAgICAgICBuID0gbWluKG4sIGxpbWl0KQorICAgICAgICAgICAgICAgIHJldHVybiBuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZWYgbnJlYWRhaGVhZCgpOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGlmIGxpbWl0IGlzIE5vbmU6CisgICAgICAgICAgICBsaW1pdCA9IC0xCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UobGltaXQsIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigibGltaXQgbXVzdCBiZSBhbiBpbnRlZ2VyIikKKyAgICAgICAgcmVzID0gYnl0ZWFycmF5KCkKKyAgICAgICAgd2hpbGUgbGltaXQgPCAwIG9yIGxlbihyZXMpIDwgbGltaXQ6CisgICAgICAgICAgICBiID0gc2VsZi5yZWFkKG5yZWFkYWhlYWQoKSkKKyAgICAgICAgICAgIGlmIG5vdCBiOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZXMgKz0gYgorICAgICAgICAgICAgaWYgcmVzLmVuZHN3aXRoKGIiXG4iKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gYnl0ZXMocmVzKQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja0Nsb3NlZCgpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmV0dXJuIGxpbmUKKworICAgIGRlZiByZWFkbGluZXMoc2VsZiwgaGludD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBsaW5lcyBmcm9tIHRoZSBzdHJlYW0uCisKKyAgICAgICAgaGludCBjYW4gYmUgc3BlY2lmaWVkIHRvIGNvbnRyb2wgdGhlIG51bWJlciBvZiBsaW5lcyByZWFkOiBubyBtb3JlCisgICAgICAgIGxpbmVzIHdpbGwgYmUgcmVhZCBpZiB0aGUgdG90YWwgc2l6ZSAoaW4gYnl0ZXMvY2hhcmFjdGVycykgb2YgYWxsCisgICAgICAgIGxpbmVzIHNvIGZhciBleGNlZWRzIGhpbnQuCisgICAgICAgICIiIgorICAgICAgICBpZiBoaW50IGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShoaW50LCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludGVnZXIgb3IgTm9uZSBleHBlY3RlZCIpCisgICAgICAgIGlmIGhpbnQgaXMgTm9uZSBvciBoaW50IDw9IDA6CisgICAgICAgICAgICByZXR1cm4gbGlzdChzZWxmKQorICAgICAgICBuID0gMAorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGZvciBsaW5lIGluIHNlbGY6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIG4gKz0gbGVuKGxpbmUpCisgICAgICAgICAgICBpZiBuID49IGhpbnQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIGxpbmVzCisKKyAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBsaW5lcyk6CisgICAgICAgIHNlbGYuX2NoZWNrQ2xvc2VkKCkKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICBzZWxmLndyaXRlKGxpbmUpCisKK2lvLklPQmFzZS5yZWdpc3RlcihJT0Jhc2UpCisKKworY2xhc3MgUmF3SU9CYXNlKElPQmFzZSk6CisKKyAgICAiIiJCYXNlIGNsYXNzIGZvciByYXcgYmluYXJ5IEkvTy4iIiIKKworICAgICMgVGhlIHJlYWQoKSBtZXRob2QgaXMgaW1wbGVtZW50ZWQgYnkgY2FsbGluZyByZWFkaW50bygpOyBkZXJpdmVkCisgICAgIyBjbGFzc2VzIHRoYXQgd2FudCB0byBzdXBwb3J0IHJlYWQoKSBvbmx5IG5lZWQgdG8gaW1wbGVtZW50CisgICAgIyByZWFkaW50bygpIGFzIGEgcHJpbWl0aXZlIG9wZXJhdGlvbi4gIEluIGdlbmVyYWwsIHJlYWRpbnRvKCkgY2FuIGJlCisgICAgIyBtb3JlIGVmZmljaWVudCB0aGFuIHJlYWQoKS4KKworICAgICMgKEl0IHdvdWxkIGJlIHRlbXB0aW5nIHRvIGFsc28gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICAgICMgcmVhZGludG8oKSBpbiB0ZXJtcyBvZiByZWFkKCksIGluIGNhc2UgdGhlIGxhdHRlciBpcyBhIG1vcmUgc3VpdGFibGUKKyAgICAjIHByaW1pdGl2ZSBvcGVyYXRpb24sIGJ1dCB0aGF0IHdvdWxkIGxlYWQgdG8gbmFzdHkgcmVjdXJzaW9uIGluIGNhc2UKKyAgICAjIGEgc3ViY2xhc3MgZG9lc24ndCBpbXBsZW1lbnQgZWl0aGVyLikKKworICAgIGRlZiByZWFkKHNlbGYsIG49LTEpOgorICAgICAgICAiIiJSZWFkIGFuZCByZXR1cm4gdXAgdG8gbiBieXRlcy4KKworICAgICAgICBSZXR1cm5zIGFuIGVtcHR5IGJ5dGVzIG9iamVjdCBvbiBFT0YsIG9yIE5vbmUgaWYgdGhlIG9iamVjdCBpcworICAgICAgICBzZXQgbm90IHRvIGJsb2NrIGFuZCBoYXMgbm8gZGF0YSB0byByZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbiBpcyBOb25lOgorICAgICAgICAgICAgbiA9IC0xCisgICAgICAgIGlmIG4gPCAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVhZGFsbCgpCisgICAgICAgIGIgPSBieXRlYXJyYXkobi5fX2luZGV4X18oKSkKKyAgICAgICAgbiA9IHNlbGYucmVhZGludG8oYikKKyAgICAgICAgaWYgbiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZGVsIGJbbjpdCisgICAgICAgIHJldHVybiBieXRlcyhiKQorCisgICAgZGVmIHJlYWRhbGwoc2VsZik6CisgICAgICAgICIiIlJlYWQgdW50aWwgRU9GLCB1c2luZyBtdWx0aXBsZSByZWFkKCkgY2FsbC4iIiIKKyAgICAgICAgcmVzID0gYnl0ZWFycmF5KCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJlYWQoREVGQVVMVF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZXMgKz0gZGF0YQorICAgICAgICBpZiByZXM6CisgICAgICAgICAgICByZXR1cm4gYnl0ZXMocmVzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBiJycgb3IgTm9uZQorICAgICAgICAgICAgcmV0dXJuIGRhdGEKKworICAgIGRlZiByZWFkaW50byhzZWxmLCBiKToKKyAgICAgICAgIiIiUmVhZCB1cCB0byBsZW4oYikgYnl0ZXMgaW50byBiLgorCisgICAgICAgIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKDAgZm9yIEVPRiksIG9yIE5vbmUgaWYgdGhlIG9iamVjdAorICAgICAgICBpcyBzZXQgbm90IHRvIGJsb2NrIGFuZCBoYXMgbm8gZGF0YSB0byByZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fdW5zdXBwb3J0ZWQoInJlYWRpbnRvIikKKworICAgIGRlZiB3cml0ZShzZWxmLCBiKToKKyAgICAgICAgIiIiV3JpdGUgdGhlIGdpdmVuIGJ1ZmZlciB0byB0aGUgSU8gc3RyZWFtLgorCisgICAgICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCB3aGljaCBtYXkgYmUgbGVzcyB0aGFuIGxlbihiKS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3Vuc3VwcG9ydGVkKCJ3cml0ZSIpCisKK2lvLlJhd0lPQmFzZS5yZWdpc3RlcihSYXdJT0Jhc2UpCitmcm9tIF9pbyBpbXBvcnQgRmlsZUlPCitSYXdJT0Jhc2UucmVnaXN0ZXIoRmlsZUlPKQorCisKK2NsYXNzIEJ1ZmZlcmVkSU9CYXNlKElPQmFzZSk6CisKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBidWZmZXJlZCBJTyBvYmplY3RzLgorCisgICAgVGhlIG1haW4gZGlmZmVyZW5jZSB3aXRoIFJhd0lPQmFzZSBpcyB0aGF0IHRoZSByZWFkKCkgbWV0aG9kCisgICAgc3VwcG9ydHMgb21pdHRpbmcgdGhlIHNpemUgYXJndW1lbnQsIGFuZCBkb2VzIG5vdCBoYXZlIGEgZGVmYXVsdAorICAgIGltcGxlbWVudGF0aW9uIHRoYXQgZGVmZXJzIHRvIHJlYWRpbnRvKCkuCisKKyAgICBJbiBhZGRpdGlvbiwgcmVhZCgpLCByZWFkaW50bygpIGFuZCB3cml0ZSgpIG1heSByYWlzZQorICAgIEJsb2NraW5nSU9FcnJvciBpZiB0aGUgdW5kZXJseWluZyByYXcgc3RyZWFtIGlzIGluIG5vbi1ibG9ja2luZworICAgIG1vZGUgYW5kIG5vdCByZWFkeTsgdW5saWtlIHRoZWlyIHJhdyBjb3VudGVycGFydHMsIHRoZXkgd2lsbCBuZXZlcgorICAgIHJldHVybiBOb25lLgorCisgICAgQSB0eXBpY2FsIGltcGxlbWVudGF0aW9uIHNob3VsZCBub3QgaW5oZXJpdCBmcm9tIGEgUmF3SU9CYXNlCisgICAgaW1wbGVtZW50YXRpb24sIGJ1dCB3cmFwIG9uZS4KKyAgICAiIiIKKworICAgIGRlZiByZWFkKHNlbGYsIG49Tm9uZSk6CisgICAgICAgICIiIlJlYWQgYW5kIHJldHVybiB1cCB0byBuIGJ5dGVzLgorCisgICAgICAgIElmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkLCBOb25lLCBvciBuZWdhdGl2ZSwgcmVhZHMgYW5kCisgICAgICAgIHJldHVybnMgYWxsIGRhdGEgdW50aWwgRU9GLgorCisgICAgICAgIElmIHRoZSBhcmd1bWVudCBpcyBwb3NpdGl2ZSwgYW5kIHRoZSB1bmRlcmx5aW5nIHJhdyBzdHJlYW0gaXMKKyAgICAgICAgbm90ICdpbnRlcmFjdGl2ZScsIG11bHRpcGxlIHJhdyByZWFkcyBtYXkgYmUgaXNzdWVkIHRvIHNhdGlzZnkKKyAgICAgICAgdGhlIGJ5dGUgY291bnQgKHVubGVzcyBFT0YgaXMgcmVhY2hlZCBmaXJzdCkuICBCdXQgZm9yCisgICAgICAgIGludGVyYWN0aXZlIHJhdyBzdHJlYW1zIChYWFggYW5kIGZvciBwaXBlcz8pLCBhdCBtb3N0IG9uZSByYXcKKyAgICAgICAgcmVhZCB3aWxsIGJlIGlzc3VlZCwgYW5kIGEgc2hvcnQgcmVzdWx0IGRvZXMgbm90IGltcGx5IHRoYXQKKyAgICAgICAgRU9GIGlzIGltbWluZW50LgorCisgICAgICAgIFJldHVybnMgYW4gZW1wdHkgYnl0ZXMgYXJyYXkgb24gRU9GLgorCisgICAgICAgIFJhaXNlcyBCbG9ja2luZ0lPRXJyb3IgaWYgdGhlIHVuZGVybHlpbmcgcmF3IHN0cmVhbSBoYXMgbm8KKyAgICAgICAgZGF0YSBhdCB0aGUgbW9tZW50LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fdW5zdXBwb3J0ZWQoInJlYWQiKQorCisgICAgZGVmIHJlYWQxKHNlbGYsIG49Tm9uZSk6CisgICAgICAgICIiIlJlYWQgdXAgdG8gbiBieXRlcyB3aXRoIGF0IG1vc3Qgb25lIHJlYWQoKSBzeXN0ZW0gY2FsbC4iIiIKKyAgICAgICAgc2VsZi5fdW5zdXBwb3J0ZWQoInJlYWQxIikKKworICAgIGRlZiByZWFkaW50byhzZWxmLCBiKToKKyAgICAgICAgIiIiUmVhZCB1cCB0byBsZW4oYikgYnl0ZXMgaW50byBiLgorCisgICAgICAgIExpa2UgcmVhZCgpLCB0aGlzIG1heSBpc3N1ZSBtdWx0aXBsZSByZWFkcyB0byB0aGUgdW5kZXJseWluZyByYXcKKyAgICAgICAgc3RyZWFtLCB1bmxlc3MgdGhlIGxhdHRlciBpcyAnaW50ZXJhY3RpdmUnLgorCisgICAgICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkICgwIGZvciBFT0YpLgorCisgICAgICAgIFJhaXNlcyBCbG9ja2luZ0lPRXJyb3IgaWYgdGhlIHVuZGVybHlpbmcgcmF3IHN0cmVhbSBoYXMgbm8KKyAgICAgICAgZGF0YSBhdCB0aGUgbW9tZW50LgorICAgICAgICAiIiIKKyAgICAgICAgIyBYWFggVGhpcyBvdWdodCB0byB3b3JrIHdpdGggYW55dGhpbmcgdGhhdCBzdXBwb3J0cyB0aGUgYnVmZmVyIEFQSQorICAgICAgICBkYXRhID0gc2VsZi5yZWFkKGxlbihiKSkKKyAgICAgICAgbiA9IGxlbihkYXRhKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBiWzpuXSA9IGRhdGEKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBlcnI6CisgICAgICAgICAgICBpbXBvcnQgYXJyYXkKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGIsIGFycmF5LmFycmF5KToKKyAgICAgICAgICAgICAgICByYWlzZSBlcnIKKyAgICAgICAgICAgIGJbOm5dID0gYXJyYXkuYXJyYXkoYidiJywgZGF0YSkKKyAgICAgICAgcmV0dXJuIG4KKworICAgIGRlZiB3cml0ZShzZWxmLCBiKToKKyAgICAgICAgIiIiV3JpdGUgdGhlIGdpdmVuIGJ1ZmZlciB0byB0aGUgSU8gc3RyZWFtLgorCisgICAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIHdoaWNoIGlzIG5ldmVyIGxlc3MgdGhhbgorICAgICAgICBsZW4oYikuCisKKyAgICAgICAgUmFpc2VzIEJsb2NraW5nSU9FcnJvciBpZiB0aGUgYnVmZmVyIGlzIGZ1bGwgYW5kIHRoZQorICAgICAgICB1bmRlcmx5aW5nIHJhdyBzdHJlYW0gY2Fubm90IGFjY2VwdCBtb3JlIGRhdGEgYXQgdGhlIG1vbWVudC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3Vuc3VwcG9ydGVkKCJ3cml0ZSIpCisKKyAgICBkZWYgZGV0YWNoKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VwYXJhdGUgdGhlIHVuZGVybHlpbmcgcmF3IHN0cmVhbSBmcm9tIHRoZSBidWZmZXIgYW5kIHJldHVybiBpdC4KKworICAgICAgICBBZnRlciB0aGUgcmF3IHN0cmVhbSBoYXMgYmVlbiBkZXRhY2hlZCwgdGhlIGJ1ZmZlciBpcyBpbiBhbiB1bnVzYWJsZQorICAgICAgICBzdGF0ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3Vuc3VwcG9ydGVkKCJkZXRhY2giKQorCitpby5CdWZmZXJlZElPQmFzZS5yZWdpc3RlcihCdWZmZXJlZElPQmFzZSkKKworCitjbGFzcyBfQnVmZmVyZWRJT01peGluKEJ1ZmZlcmVkSU9CYXNlKToKKworICAgICIiIkEgbWl4aW4gaW1wbGVtZW50YXRpb24gb2YgQnVmZmVyZWRJT0Jhc2Ugd2l0aCBhbiB1bmRlcmx5aW5nIHJhdyBzdHJlYW0uCisKKyAgICBUaGlzIHBhc3NlcyBtb3N0IHJlcXVlc3RzIG9uIHRvIHRoZSB1bmRlcmx5aW5nIHJhdyBzdHJlYW0uICBJdAorICAgIGRvZXMgKm5vdCogcHJvdmlkZSBpbXBsZW1lbnRhdGlvbnMgb2YgcmVhZCgpLCByZWFkaW50bygpIG9yCisgICAgd3JpdGUoKS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByYXcpOgorICAgICAgICBzZWxmLl9yYXcgPSByYXcKKworICAgICMjIyBQb3NpdGlvbmluZyAjIyMKKworICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlPTApOgorICAgICAgICBuZXdfcG9zaXRpb24gPSBzZWxmLnJhdy5zZWVrKHBvcywgd2hlbmNlKQorICAgICAgICBpZiBuZXdfcG9zaXRpb24gPCAwOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigic2VlaygpIHJldHVybmVkIGFuIGludmFsaWQgcG9zaXRpb24iKQorICAgICAgICByZXR1cm4gbmV3X3Bvc2l0aW9uCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgcG9zID0gc2VsZi5yYXcudGVsbCgpCisgICAgICAgIGlmIHBvcyA8IDA6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJ0ZWxsKCkgcmV0dXJuZWQgYW4gaW52YWxpZCBwb3NpdGlvbiIpCisgICAgICAgIHJldHVybiBwb3MKKworICAgIGRlZiB0cnVuY2F0ZShzZWxmLCBwb3M9Tm9uZSk6CisgICAgICAgICMgRmx1c2ggdGhlIHN0cmVhbS4gIFdlJ3JlIG1peGluZyBidWZmZXJlZCBJL08gd2l0aCBsb3dlci1sZXZlbCBJL08sCisgICAgICAgICMgYW5kIGEgZmx1c2ggbWF5IGJlIG5lY2Vzc2FyeSB0byBzeW5jaCBib3RoIHZpZXdzIG9mIHRoZSBjdXJyZW50CisgICAgICAgICMgZmlsZSBzdGF0ZS4KKyAgICAgICAgc2VsZi5mbHVzaCgpCisKKyAgICAgICAgaWYgcG9zIGlzIE5vbmU6CisgICAgICAgICAgICBwb3MgPSBzZWxmLnRlbGwoKQorICAgICAgICAjIFhYWDogU2hvdWxkIHNlZWsoKSBiZSB1c2VkLCBpbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHBvc2l0aW9uCisgICAgICAgICMgWFhYICBkaXJlY3RseSB0byB0cnVuY2F0ZT8KKyAgICAgICAgcmV0dXJuIHNlbGYucmF3LnRydW5jYXRlKHBvcykKKworICAgICMjIyBGbHVzaCBhbmQgY2xvc2UgIyMjCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmx1c2ggb2YgY2xvc2VkIGZpbGUiKQorICAgICAgICBzZWxmLnJhdy5mbHVzaCgpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYucmF3IGlzIG5vdCBOb25lIGFuZCBub3Qgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBtYXkgcmFpc2UgQmxvY2tpbmdJT0Vycm9yIG9yIEJyb2tlblBpcGVFcnJvciBldGMKKyAgICAgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2VsZi5yYXcuY2xvc2UoKQorCisgICAgZGVmIGRldGFjaChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5yYXcgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInJhdyBzdHJlYW0gYWxyZWFkeSBkZXRhY2hlZCIpCisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICByYXcgPSBzZWxmLl9yYXcKKyAgICAgICAgc2VsZi5fcmF3ID0gTm9uZQorICAgICAgICByZXR1cm4gcmF3CisKKyAgICAjIyMgSW5xdWlyaWVzICMjIworCisgICAgZGVmIHNlZWthYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yYXcuc2Vla2FibGUoKQorCisgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yYXcucmVhZGFibGUoKQorCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yYXcud3JpdGFibGUoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHJhdyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JhdworCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNsb3NlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmF3LmNsb3NlZAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJhdy5uYW1lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbW9kZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmF3Lm1vZGUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgY2xzbmFtZSA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLm5hbWUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuICI8X3B5aW8uezB9PiIuZm9ybWF0KGNsc25hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIjxfcHlpby57MH0gbmFtZT17MSFyfT4iLmZvcm1hdChjbHNuYW1lLCBuYW1lKQorCisgICAgIyMjIExvd2VyLWxldmVsIEFQSXMgIyMjCisKKyAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yYXcuZmlsZW5vKCkKKworICAgIGRlZiBpc2F0dHkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJhdy5pc2F0dHkoKQorCisKK2NsYXNzIEJ5dGVzSU8oQnVmZmVyZWRJT0Jhc2UpOgorCisgICAgIiIiQnVmZmVyZWQgSS9PIGltcGxlbWVudGF0aW9uIHVzaW5nIGFuIGluLW1lbW9yeSBieXRlcyBidWZmZXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5pdGlhbF9ieXRlcz1Ob25lKToKKyAgICAgICAgYnVmID0gYnl0ZWFycmF5KCkKKyAgICAgICAgaWYgaW5pdGlhbF9ieXRlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGJ1Zi5leHRlbmQoaW5pdGlhbF9ieXRlcykKKyAgICAgICAgc2VsZi5fYnVmZmVyID0gYnVmCisgICAgICAgIHNlbGYuX3BvcyA9IDAKKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiX19nZXRzdGF0ZV9fIG9uIGNsb3NlZCBmaWxlIikKKyAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X18uY29weSgpCisKKyAgICBkZWYgZ2V0dmFsdWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgYnl0ZXMgdmFsdWUgKGNvbnRlbnRzKSBvZiB0aGUgYnVmZmVyCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImdldHZhbHVlIG9uIGNsb3NlZCBmaWxlIikKKyAgICAgICAgcmV0dXJuIGJ5dGVzKHNlbGYuX2J1ZmZlcikKKworICAgIGRlZiByZWFkKHNlbGYsIG49Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVhZCBmcm9tIGNsb3NlZCBmaWxlIikKKyAgICAgICAgaWYgbiBpcyBOb25lOgorICAgICAgICAgICAgbiA9IC0xCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG4sIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IHswIXJ9Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgdHlwZShuKSkpCisgICAgICAgIGlmIG4gPCAwOgorICAgICAgICAgICAgbiA9IGxlbihzZWxmLl9idWZmZXIpCisgICAgICAgIGlmIGxlbihzZWxmLl9idWZmZXIpIDw9IHNlbGYuX3BvczoKKyAgICAgICAgICAgIHJldHVybiBiIiIKKyAgICAgICAgbmV3cG9zID0gbWluKGxlbihzZWxmLl9idWZmZXIpLCBzZWxmLl9wb3MgKyBuKQorICAgICAgICBiID0gc2VsZi5fYnVmZmVyW3NlbGYuX3BvcyA6IG5ld3Bvc10KKyAgICAgICAgc2VsZi5fcG9zID0gbmV3cG9zCisgICAgICAgIHJldHVybiBieXRlcyhiKQorCisgICAgZGVmIHJlYWQxKHNlbGYsIG4pOgorICAgICAgICAiIiJUaGlzIGlzIHRoZSBzYW1lIGFzIHJlYWQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkKG4pCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYik6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigid3JpdGUgdG8gY2xvc2VkIGZpbGUiKQorICAgICAgICBpZiBpc2luc3RhbmNlKGIsIHVuaWNvZGUpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW4ndCB3cml0ZSB1bmljb2RlIHRvIGJpbmFyeSBzdHJlYW0iKQorICAgICAgICBuID0gbGVuKGIpCisgICAgICAgIGlmIG4gPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHBvcyA9IHNlbGYuX3BvcworICAgICAgICBpZiBwb3MgPiBsZW4oc2VsZi5fYnVmZmVyKToKKyAgICAgICAgICAgICMgSW5zZXJ0cyBudWxsIGJ5dGVzIGJldHdlZW4gdGhlIGN1cnJlbnQgZW5kIG9mIHRoZSBmaWxlCisgICAgICAgICAgICAjIGFuZCB0aGUgbmV3IHdyaXRlIHBvc2l0aW9uLgorICAgICAgICAgICAgcGFkZGluZyA9IGInXHgwMCcgKiAocG9zIC0gbGVuKHNlbGYuX2J1ZmZlcikpCisgICAgICAgICAgICBzZWxmLl9idWZmZXIgKz0gcGFkZGluZworICAgICAgICBzZWxmLl9idWZmZXJbcG9zOnBvcyArIG5dID0gYgorICAgICAgICBzZWxmLl9wb3MgKz0gbgorICAgICAgICByZXR1cm4gbgorCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zLCB3aGVuY2U9MCk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic2VlayBvbiBjbG9zZWQgZmlsZSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBvcy5fX2luZGV4X18KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIikKKyAgICAgICAgaWYgd2hlbmNlID09IDA6CisgICAgICAgICAgICBpZiBwb3MgPCAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5lZ2F0aXZlIHNlZWsgcG9zaXRpb24gJXIiICUgKHBvcywpKQorICAgICAgICAgICAgc2VsZi5fcG9zID0gcG9zCisgICAgICAgIGVsaWYgd2hlbmNlID09IDE6CisgICAgICAgICAgICBzZWxmLl9wb3MgPSBtYXgoMCwgc2VsZi5fcG9zICsgcG9zKQorICAgICAgICBlbGlmIHdoZW5jZSA9PSAyOgorICAgICAgICAgICAgc2VsZi5fcG9zID0gbWF4KDAsIGxlbihzZWxmLl9idWZmZXIpICsgcG9zKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCB3aGVuY2UgdmFsdWUiKQorICAgICAgICByZXR1cm4gc2VsZi5fcG9zCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ0ZWxsIG9uIGNsb3NlZCBmaWxlIikKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BvcworCisgICAgZGVmIHRydW5jYXRlKHNlbGYsIHBvcz1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ0cnVuY2F0ZSBvbiBjbG9zZWQgZmlsZSIpCisgICAgICAgIGlmIHBvcyBpcyBOb25lOgorICAgICAgICAgICAgcG9zID0gc2VsZi5fcG9zCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcG9zLl9faW5kZXhfXworICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYW4gaW50ZWdlciBpcyByZXF1aXJlZCIpCisgICAgICAgICAgICBpZiBwb3MgPCAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5lZ2F0aXZlIHRydW5jYXRlIHBvc2l0aW9uICVyIiAlIChwb3MsKSkKKyAgICAgICAgZGVsIHNlbGYuX2J1ZmZlcltwb3M6XQorICAgICAgICByZXR1cm4gcG9zCisKKyAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZS4iKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUuIikKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZWVrYWJsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlLiIpCisgICAgICAgIHJldHVybiBUcnVlCisKKworY2xhc3MgQnVmZmVyZWRSZWFkZXIoX0J1ZmZlcmVkSU9NaXhpbik6CisKKyAgICAiIiJCdWZmZXJlZFJlYWRlcihyYXdbLCBidWZmZXJfc2l6ZV0pCisKKyAgICBBIGJ1ZmZlciBmb3IgYSByZWFkYWJsZSwgc2VxdWVudGlhbCBCYXNlUmF3SU8gb2JqZWN0LgorCisgICAgVGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBCdWZmZXJlZFJlYWRlciBmb3IgdGhlIGdpdmVuIHJlYWRhYmxlIHJhdworICAgIHN0cmVhbSBhbmQgYnVmZmVyX3NpemUuIElmIGJ1ZmZlcl9zaXplIGlzIG9taXR0ZWQsIERFRkFVTFRfQlVGRkVSX1NJWkUKKyAgICBpcyB1c2VkLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJhdywgYnVmZmVyX3NpemU9REVGQVVMVF9CVUZGRVJfU0laRSk6CisgICAgICAgICIiIkNyZWF0ZSBhIG5ldyBidWZmZXJlZCByZWFkZXIgdXNpbmcgdGhlIGdpdmVuIHJlYWRhYmxlIHJhdyBJTyBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgcmF3LnJlYWRhYmxlKCk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCcicmF3IiBhcmd1bWVudCBtdXN0IGJlIHJlYWRhYmxlLicpCisKKyAgICAgICAgX0J1ZmZlcmVkSU9NaXhpbi5fX2luaXRfXyhzZWxmLCByYXcpCisgICAgICAgIGlmIGJ1ZmZlcl9zaXplIDw9IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGJ1ZmZlciBzaXplIikKKyAgICAgICAgc2VsZi5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplCisgICAgICAgIHNlbGYuX3Jlc2V0X3JlYWRfYnVmKCkKKyAgICAgICAgc2VsZi5fcmVhZF9sb2NrID0gTG9jaygpCisKKyAgICBkZWYgX3Jlc2V0X3JlYWRfYnVmKHNlbGYpOgorICAgICAgICBzZWxmLl9yZWFkX2J1ZiA9IGIiIgorICAgICAgICBzZWxmLl9yZWFkX3BvcyA9IDAKKworICAgIGRlZiByZWFkKHNlbGYsIG49Tm9uZSk6CisgICAgICAgICIiIlJlYWQgbiBieXRlcy4KKworICAgICAgICBSZXR1cm5zIGV4YWN0bHkgbiBieXRlcyBvZiBkYXRhIHVubGVzcyB0aGUgdW5kZXJseWluZyByYXcgSU8KKyAgICAgICAgc3RyZWFtIHJlYWNoZXMgRU9GIG9yIGlmIHRoZSBjYWxsIHdvdWxkIGJsb2NrIGluIG5vbi1ibG9ja2luZworICAgICAgICBtb2RlLiBJZiBuIGlzIG5lZ2F0aXZlLCByZWFkIHVudGlsIEVPRiBvciB1bnRpbCByZWFkKCkgd291bGQKKyAgICAgICAgYmxvY2suCisgICAgICAgICIiIgorICAgICAgICBpZiBuIGlzIG5vdCBOb25lIGFuZCBuIDwgLTE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIG51bWJlciBvZiBieXRlcyB0byByZWFkIikKKyAgICAgICAgd2l0aCBzZWxmLl9yZWFkX2xvY2s6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF91bmxvY2tlZChuKQorCisgICAgZGVmIF9yZWFkX3VubG9ja2VkKHNlbGYsIG49Tm9uZSk6CisgICAgICAgIG5vZGF0YV92YWwgPSBiIiIKKyAgICAgICAgZW1wdHlfdmFsdWVzID0gKGIiIiwgTm9uZSkKKyAgICAgICAgYnVmID0gc2VsZi5fcmVhZF9idWYKKyAgICAgICAgcG9zID0gc2VsZi5fcmVhZF9wb3MKKworICAgICAgICAjIFNwZWNpYWwgY2FzZSBmb3Igd2hlbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaXMgdW5zcGVjaWZpZWQuCisgICAgICAgIGlmIG4gaXMgTm9uZSBvciBuID09IC0xOgorICAgICAgICAgICAgc2VsZi5fcmVzZXRfcmVhZF9idWYoKQorICAgICAgICAgICAgY2h1bmtzID0gW2J1Zltwb3M6XV0gICMgU3RyaXAgdGhlIGNvbnN1bWVkIGJ5dGVzLgorICAgICAgICAgICAgY3VycmVudF9zaXplID0gMAorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAjIFJlYWQgdW50aWwgRU9GIG9yIHVudGlsIHJlYWQoKSB3b3VsZCBibG9jay4KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGNodW5rID0gc2VsZi5yYXcucmVhZCgpCisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBFSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgY2h1bmsgaW4gZW1wdHlfdmFsdWVzOgorICAgICAgICAgICAgICAgICAgICBub2RhdGFfdmFsID0gY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3NpemUgKz0gbGVuKGNodW5rKQorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoY2h1bmspCisgICAgICAgICAgICByZXR1cm4gYiIiLmpvaW4oY2h1bmtzKSBvciBub2RhdGFfdmFsCisKKyAgICAgICAgIyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgaXMgc3BlY2lmaWVkLCByZXR1cm4gYXQgbW9zdCBuIGJ5dGVzLgorICAgICAgICBhdmFpbCA9IGxlbihidWYpIC0gcG9zICAjIExlbmd0aCBvZiB0aGUgYXZhaWxhYmxlIGJ1ZmZlcmVkIGRhdGEuCisgICAgICAgIGlmIG4gPD0gYXZhaWw6CisgICAgICAgICAgICAjIEZhc3QgcGF0aDogdGhlIGRhdGEgdG8gcmVhZCBpcyBmdWxseSBidWZmZXJlZC4KKyAgICAgICAgICAgIHNlbGYuX3JlYWRfcG9zICs9IG4KKyAgICAgICAgICAgIHJldHVybiBidWZbcG9zOnBvcytuXQorICAgICAgICAjIFNsb3cgcGF0aDogcmVhZCBmcm9tIHRoZSBzdHJlYW0gdW50aWwgZW5vdWdoIGJ5dGVzIGFyZSByZWFkLAorICAgICAgICAjIG9yIHVudGlsIGFuIEVPRiBvY2N1cnMgb3IgdW50aWwgcmVhZCgpIHdvdWxkIGJsb2NrLgorICAgICAgICBjaHVua3MgPSBbYnVmW3BvczpdXQorICAgICAgICB3YW50ZWQgPSBtYXgoc2VsZi5idWZmZXJfc2l6ZSwgbikKKyAgICAgICAgd2hpbGUgYXZhaWwgPCBuOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNodW5rID0gc2VsZi5yYXcucmVhZCh3YW50ZWQpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gRUlOVFI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGNodW5rIGluIGVtcHR5X3ZhbHVlczoKKyAgICAgICAgICAgICAgICBub2RhdGFfdmFsID0gY2h1bmsKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgYXZhaWwgKz0gbGVuKGNodW5rKQorICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChjaHVuaykKKyAgICAgICAgIyBuIGlzIG1vcmUgdGhlbiBhdmFpbCBvbmx5IHdoZW4gYW4gRU9GIG9jY3VycmVkIG9yIHdoZW4KKyAgICAgICAgIyByZWFkKCkgd291bGQgaGF2ZSBibG9ja2VkLgorICAgICAgICBuID0gbWluKG4sIGF2YWlsKQorICAgICAgICBvdXQgPSBiIiIuam9pbihjaHVua3MpCisgICAgICAgIHNlbGYuX3JlYWRfYnVmID0gb3V0W246XSAgIyBTYXZlIHRoZSBleHRyYSBkYXRhIGluIHRoZSBidWZmZXIuCisgICAgICAgIHNlbGYuX3JlYWRfcG9zID0gMAorICAgICAgICByZXR1cm4gb3V0WzpuXSBpZiBvdXQgZWxzZSBub2RhdGFfdmFsCisKKyAgICBkZWYgcGVlayhzZWxmLCBuPTApOgorICAgICAgICAiIiJSZXR1cm5zIGJ1ZmZlcmVkIGJ5dGVzIHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBwb3NpdGlvbi4KKworICAgICAgICBUaGUgYXJndW1lbnQgaW5kaWNhdGVzIGEgZGVzaXJlZCBtaW5pbWFsIG51bWJlciBvZiBieXRlczsgd2UKKyAgICAgICAgZG8gYXQgbW9zdCBvbmUgcmF3IHJlYWQgdG8gc2F0aXNmeSBpdC4gIFdlIG5ldmVyIHJldHVybiBtb3JlCisgICAgICAgIHRoYW4gc2VsZi5idWZmZXJfc2l6ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHdpdGggc2VsZi5fcmVhZF9sb2NrOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BlZWtfdW5sb2NrZWQobikKKworICAgIGRlZiBfcGVla191bmxvY2tlZChzZWxmLCBuPTApOgorICAgICAgICB3YW50ID0gbWluKG4sIHNlbGYuYnVmZmVyX3NpemUpCisgICAgICAgIGhhdmUgPSBsZW4oc2VsZi5fcmVhZF9idWYpIC0gc2VsZi5fcmVhZF9wb3MKKyAgICAgICAgaWYgaGF2ZSA8IHdhbnQgb3IgaGF2ZSA8PSAwOgorICAgICAgICAgICAgdG9fcmVhZCA9IHNlbGYuYnVmZmVyX3NpemUgLSBoYXZlCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHNlbGYucmF3LnJlYWQodG9fcmVhZCkKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IEVJTlRSOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgY3VycmVudDoKKyAgICAgICAgICAgICAgICBzZWxmLl9yZWFkX2J1ZiA9IHNlbGYuX3JlYWRfYnVmW3NlbGYuX3JlYWRfcG9zOl0gKyBjdXJyZW50CisgICAgICAgICAgICAgICAgc2VsZi5fcmVhZF9wb3MgPSAwCisgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX2J1ZltzZWxmLl9yZWFkX3BvczpdCisKKyAgICBkZWYgcmVhZDEoc2VsZiwgbik6CisgICAgICAgICIiIlJlYWRzIHVwIHRvIG4gYnl0ZXMsIHdpdGggYXQgbW9zdCBvbmUgcmVhZCgpIHN5c3RlbSBjYWxsLiIiIgorICAgICAgICAjIFJldHVybnMgdXAgdG8gbiBieXRlcy4gIElmIGF0IGxlYXN0IG9uZSBieXRlIGlzIGJ1ZmZlcmVkLCB3ZQorICAgICAgICAjIG9ubHkgcmV0dXJuIGJ1ZmZlcmVkIGJ5dGVzLiAgT3RoZXJ3aXNlLCB3ZSBkbyBvbmUgcmF3IHJlYWQuCisgICAgICAgIGlmIG4gPCAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgbXVzdCBiZSBwb3NpdGl2ZSIpCisgICAgICAgIGlmIG4gPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBiIiIKKyAgICAgICAgd2l0aCBzZWxmLl9yZWFkX2xvY2s6CisgICAgICAgICAgICBzZWxmLl9wZWVrX3VubG9ja2VkKDEpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF91bmxvY2tlZCgKKyAgICAgICAgICAgICAgICBtaW4obiwgbGVuKHNlbGYuX3JlYWRfYnVmKSAtIHNlbGYuX3JlYWRfcG9zKSkKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gX0J1ZmZlcmVkSU9NaXhpbi50ZWxsKHNlbGYpIC0gbGVuKHNlbGYuX3JlYWRfYnVmKSArIHNlbGYuX3JlYWRfcG9zCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3MsIHdoZW5jZT0wKToKKyAgICAgICAgaWYgbm90ICgwIDw9IHdoZW5jZSA8PSAyKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgd2hlbmNlIHZhbHVlIikKKyAgICAgICAgd2l0aCBzZWxmLl9yZWFkX2xvY2s6CisgICAgICAgICAgICBpZiB3aGVuY2UgPT0gMToKKyAgICAgICAgICAgICAgICBwb3MgLT0gbGVuKHNlbGYuX3JlYWRfYnVmKSAtIHNlbGYuX3JlYWRfcG9zCisgICAgICAgICAgICBwb3MgPSBfQnVmZmVyZWRJT01peGluLnNlZWsoc2VsZiwgcG9zLCB3aGVuY2UpCisgICAgICAgICAgICBzZWxmLl9yZXNldF9yZWFkX2J1ZigpCisgICAgICAgICAgICByZXR1cm4gcG9zCisKK2NsYXNzIEJ1ZmZlcmVkV3JpdGVyKF9CdWZmZXJlZElPTWl4aW4pOgorCisgICAgIiIiQSBidWZmZXIgZm9yIGEgd3JpdGVhYmxlIHNlcXVlbnRpYWwgUmF3SU8gb2JqZWN0LgorCisgICAgVGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBCdWZmZXJlZFdyaXRlciBmb3IgdGhlIGdpdmVuIHdyaXRlYWJsZSByYXcKKyAgICBzdHJlYW0uIElmIHRoZSBidWZmZXJfc2l6ZSBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvCisgICAgREVGQVVMVF9CVUZGRVJfU0laRS4KKyAgICAiIiIKKworICAgIF93YXJuaW5nX3N0YWNrX29mZnNldCA9IDIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByYXcsCisgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplPURFRkFVTFRfQlVGRkVSX1NJWkUsIG1heF9idWZmZXJfc2l6ZT1Ob25lKToKKyAgICAgICAgaWYgbm90IHJhdy53cml0YWJsZSgpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignInJhdyIgYXJndW1lbnQgbXVzdCBiZSB3cml0YWJsZS4nKQorCisgICAgICAgIF9CdWZmZXJlZElPTWl4aW4uX19pbml0X18oc2VsZiwgcmF3KQorICAgICAgICBpZiBidWZmZXJfc2l6ZSA8PSAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCBidWZmZXIgc2l6ZSIpCisgICAgICAgIGlmIG1heF9idWZmZXJfc2l6ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm1heF9idWZmZXJfc2l6ZSBpcyBkZXByZWNhdGVkIiwgRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl93YXJuaW5nX3N0YWNrX29mZnNldCkKKyAgICAgICAgc2VsZi5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplCisgICAgICAgIHNlbGYuX3dyaXRlX2J1ZiA9IGJ5dGVhcnJheSgpCisgICAgICAgIHNlbGYuX3dyaXRlX2xvY2sgPSBMb2NrKCkKKworICAgIGRlZiB3cml0ZShzZWxmLCBiKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ3cml0ZSB0byBjbG9zZWQgZmlsZSIpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYiwgdW5pY29kZSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbid0IHdyaXRlIHVuaWNvZGUgdG8gYmluYXJ5IHN0cmVhbSIpCisgICAgICAgIHdpdGggc2VsZi5fd3JpdGVfbG9jazoKKyAgICAgICAgICAgICMgWFhYIHdlIGNhbiBpbXBsZW1lbnQgc29tZSBtb3JlIHRyaWNrcyB0byB0cnkgYW5kIGF2b2lkCisgICAgICAgICAgICAjIHBhcnRpYWwgd3JpdGVzCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5fd3JpdGVfYnVmKSA+IHNlbGYuYnVmZmVyX3NpemU6CisgICAgICAgICAgICAgICAgIyBXZSdyZSBmdWxsLCBzbyBsZXQncyBwcmUtZmx1c2ggdGhlIGJ1ZmZlci4gIChUaGlzIG1heQorICAgICAgICAgICAgICAgICMgcmFpc2UgQmxvY2tpbmdJT0Vycm9yIHdpdGggY2hhcmFjdGVyc193cml0dGVuID09IDAuKQorICAgICAgICAgICAgICAgIHNlbGYuX2ZsdXNoX3VubG9ja2VkKCkKKyAgICAgICAgICAgIGJlZm9yZSA9IGxlbihzZWxmLl93cml0ZV9idWYpCisgICAgICAgICAgICBzZWxmLl93cml0ZV9idWYuZXh0ZW5kKGIpCisgICAgICAgICAgICB3cml0dGVuID0gbGVuKHNlbGYuX3dyaXRlX2J1ZikgLSBiZWZvcmUKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLl93cml0ZV9idWYpID4gc2VsZi5idWZmZXJfc2l6ZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZsdXNoX3VubG9ja2VkKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgQmxvY2tpbmdJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihzZWxmLl93cml0ZV9idWYpID4gc2VsZi5idWZmZXJfc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgV2UndmUgaGl0IHRoZSBidWZmZXJfc2l6ZS4gV2UgaGF2ZSB0byBhY2NlcHQgYSBwYXJ0aWFsCisgICAgICAgICAgICAgICAgICAgICAgICAjIHdyaXRlIGFuZCBjdXQgYmFjayBvdXIgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmFnZSA9IGxlbihzZWxmLl93cml0ZV9idWYpIC0gc2VsZi5idWZmZXJfc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiAtPSBvdmVyYWdlCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV9idWYgPSBzZWxmLl93cml0ZV9idWZbOnNlbGYuYnVmZmVyX3NpemVdCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBCbG9ja2luZ0lPRXJyb3IoZS5lcnJubywgZS5zdHJlcnJvciwgd3JpdHRlbikKKyAgICAgICAgICAgIHJldHVybiB3cml0dGVuCisKKyAgICBkZWYgdHJ1bmNhdGUoc2VsZiwgcG9zPU5vbmUpOgorICAgICAgICB3aXRoIHNlbGYuX3dyaXRlX2xvY2s6CisgICAgICAgICAgICBzZWxmLl9mbHVzaF91bmxvY2tlZCgpCisgICAgICAgICAgICBpZiBwb3MgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwb3MgPSBzZWxmLnJhdy50ZWxsKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJhdy50cnVuY2F0ZShwb3MpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5fd3JpdGVfbG9jazoKKyAgICAgICAgICAgIHNlbGYuX2ZsdXNoX3VubG9ja2VkKCkKKworICAgIGRlZiBfZmx1c2hfdW5sb2NrZWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmx1c2ggb2YgY2xvc2VkIGZpbGUiKQorICAgICAgICB3aGlsZSBzZWxmLl93cml0ZV9idWY6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbiA9IHNlbGYucmF3LndyaXRlKHNlbGYuX3dyaXRlX2J1ZikKKyAgICAgICAgICAgIGV4Y2VwdCBCbG9ja2luZ0lPRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJzZWxmLnJhdyBzaG91bGQgaW1wbGVtZW50IFJhd0lPQmFzZTogaXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIG5vdCByYWlzZSBCbG9ja2luZ0lPRXJyb3IiKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IEVJTlRSOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBuIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgQmxvY2tpbmdJT0Vycm9yKAorICAgICAgICAgICAgICAgICAgICBlcnJuby5FQUdBSU4sCisgICAgICAgICAgICAgICAgICAgICJ3cml0ZSBjb3VsZCBub3QgY29tcGxldGUgd2l0aG91dCBibG9ja2luZyIsIDApCisgICAgICAgICAgICBpZiBuID4gbGVuKHNlbGYuX3dyaXRlX2J1Zikgb3IgbiA8IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigid3JpdGUoKSByZXR1cm5lZCBpbmNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIikKKyAgICAgICAgICAgIGRlbCBzZWxmLl93cml0ZV9idWZbOm5dCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgcmV0dXJuIF9CdWZmZXJlZElPTWl4aW4udGVsbChzZWxmKSArIGxlbihzZWxmLl93cml0ZV9idWYpCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3MsIHdoZW5jZT0wKToKKyAgICAgICAgaWYgbm90ICgwIDw9IHdoZW5jZSA8PSAyKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgd2hlbmNlIikKKyAgICAgICAgd2l0aCBzZWxmLl93cml0ZV9sb2NrOgorICAgICAgICAgICAgc2VsZi5fZmx1c2hfdW5sb2NrZWQoKQorICAgICAgICAgICAgcmV0dXJuIF9CdWZmZXJlZElPTWl4aW4uc2VlayhzZWxmLCBwb3MsIHdoZW5jZSkKKworCitjbGFzcyBCdWZmZXJlZFJXUGFpcihCdWZmZXJlZElPQmFzZSk6CisKKyAgICAiIiJBIGJ1ZmZlcmVkIHJlYWRlciBhbmQgd3JpdGVyIG9iamVjdCB0b2dldGhlci4KKworICAgIEEgYnVmZmVyZWQgcmVhZGVyIG9iamVjdCBhbmQgYnVmZmVyZWQgd3JpdGVyIG9iamVjdCBwdXQgdG9nZXRoZXIgdG8KKyAgICBmb3JtIGEgc2VxdWVudGlhbCBJTyBvYmplY3QgdGhhdCBjYW4gcmVhZCBhbmQgd3JpdGUuIFRoaXMgaXMgdHlwaWNhbGx5CisgICAgdXNlZCB3aXRoIGEgc29ja2V0IG9yIHR3by13YXkgcGlwZS4KKworICAgIHJlYWRlciBhbmQgd3JpdGVyIGFyZSBSYXdJT0Jhc2Ugb2JqZWN0cyB0aGF0IGFyZSByZWFkYWJsZSBhbmQKKyAgICB3cml0ZWFibGUgcmVzcGVjdGl2ZWx5LiBJZiB0aGUgYnVmZmVyX3NpemUgaXMgb21pdHRlZCBpdCBkZWZhdWx0cyB0bworICAgIERFRkFVTFRfQlVGRkVSX1NJWkUuCisgICAgIiIiCisKKyAgICAjIFhYWCBUaGUgdXNlZnVsbmVzcyBvZiB0aGlzIChjb21wYXJlZCB0byBoYXZpbmcgdHdvIHNlcGFyYXRlIElPCisgICAgIyBvYmplY3RzKSBpcyBxdWVzdGlvbmFibGUuCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVhZGVyLCB3cml0ZXIsCisgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplPURFRkFVTFRfQlVGRkVSX1NJWkUsIG1heF9idWZmZXJfc2l6ZT1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuCisKKyAgICAgICAgVGhlIGFyZ3VtZW50cyBhcmUgdHdvIFJhd0lPIGluc3RhbmNlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG1heF9idWZmZXJfc2l6ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIm1heF9idWZmZXJfc2l6ZSBpcyBkZXByZWNhdGVkIiwgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorCisgICAgICAgIGlmIG5vdCByZWFkZXIucmVhZGFibGUoKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJyJyZWFkZXIiIGFyZ3VtZW50IG11c3QgYmUgcmVhZGFibGUuJykKKworICAgICAgICBpZiBub3Qgd3JpdGVyLndyaXRhYmxlKCk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCcid3JpdGVyIiBhcmd1bWVudCBtdXN0IGJlIHdyaXRhYmxlLicpCisKKyAgICAgICAgc2VsZi5yZWFkZXIgPSBCdWZmZXJlZFJlYWRlcihyZWFkZXIsIGJ1ZmZlcl9zaXplKQorICAgICAgICBzZWxmLndyaXRlciA9IEJ1ZmZlcmVkV3JpdGVyKHdyaXRlciwgYnVmZmVyX3NpemUpCisKKyAgICBkZWYgcmVhZChzZWxmLCBuPU5vbmUpOgorICAgICAgICBpZiBuIGlzIE5vbmU6CisgICAgICAgICAgICBuID0gLTEKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZGVyLnJlYWQobikKKworICAgIGRlZiByZWFkaW50byhzZWxmLCBiKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZGVyLnJlYWRpbnRvKGIpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYik6CisgICAgICAgIHJldHVybiBzZWxmLndyaXRlci53cml0ZShiKQorCisgICAgZGVmIHBlZWsoc2VsZiwgbj0wKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZGVyLnBlZWsobikKKworICAgIGRlZiByZWFkMShzZWxmLCBuKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZGVyLnJlYWQxKG4pCisKKyAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlYWRlci5yZWFkYWJsZSgpCisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLndyaXRlci53cml0YWJsZSgpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLndyaXRlci5mbHVzaCgpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5yZWFkZXIuY2xvc2UoKQorCisgICAgZGVmIGlzYXR0eShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZGVyLmlzYXR0eSgpIG9yIHNlbGYud3JpdGVyLmlzYXR0eSgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY2xvc2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi53cml0ZXIuY2xvc2VkCisKKworY2xhc3MgQnVmZmVyZWRSYW5kb20oQnVmZmVyZWRXcml0ZXIsIEJ1ZmZlcmVkUmVhZGVyKToKKworICAgICIiIkEgYnVmZmVyZWQgaW50ZXJmYWNlIHRvIHJhbmRvbSBhY2Nlc3Mgc3RyZWFtcy4KKworICAgIFRoZSBjb25zdHJ1Y3RvciBjcmVhdGVzIGEgcmVhZGVyIGFuZCB3cml0ZXIgZm9yIGEgc2Vla2FibGUgc3RyZWFtLAorICAgIHJhdywgZ2l2ZW4gaW4gdGhlIGZpcnN0IGFyZ3VtZW50LiBJZiB0aGUgYnVmZmVyX3NpemUgaXMgb21pdHRlZCBpdAorICAgIGRlZmF1bHRzIHRvIERFRkFVTFRfQlVGRkVSX1NJWkUuCisgICAgIiIiCisKKyAgICBfd2FybmluZ19zdGFja19vZmZzZXQgPSAzCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmF3LAorICAgICAgICAgICAgICAgICBidWZmZXJfc2l6ZT1ERUZBVUxUX0JVRkZFUl9TSVpFLCBtYXhfYnVmZmVyX3NpemU9Tm9uZSk6CisgICAgICAgIHJhdy5fY2hlY2tTZWVrYWJsZSgpCisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyLl9faW5pdF9fKHNlbGYsIHJhdywgYnVmZmVyX3NpemUpCisgICAgICAgIEJ1ZmZlcmVkV3JpdGVyLl9faW5pdF9fKHNlbGYsIHJhdywgYnVmZmVyX3NpemUsIG1heF9idWZmZXJfc2l6ZSkKKworICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlPTApOgorICAgICAgICBpZiBub3QgKDAgPD0gd2hlbmNlIDw9IDIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCB3aGVuY2UiKQorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgaWYgc2VsZi5fcmVhZF9idWY6CisgICAgICAgICAgICAjIFVuZG8gcmVhZCBhaGVhZC4KKyAgICAgICAgICAgIHdpdGggc2VsZi5fcmVhZF9sb2NrOgorICAgICAgICAgICAgICAgIHNlbGYucmF3LnNlZWsoc2VsZi5fcmVhZF9wb3MgLSBsZW4oc2VsZi5fcmVhZF9idWYpLCAxKQorICAgICAgICAjIEZpcnN0IGRvIHRoZSByYXcgc2VlaywgdGhlbiBlbXB0eSB0aGUgcmVhZCBidWZmZXIsIHNvIHRoYXQKKyAgICAgICAgIyBpZiB0aGUgcmF3IHNlZWsgZmFpbHMsIHdlIGRvbid0IGxvc2UgYnVmZmVyZWQgZGF0YSBmb3JldmVyLgorICAgICAgICBwb3MgPSBzZWxmLnJhdy5zZWVrKHBvcywgd2hlbmNlKQorICAgICAgICB3aXRoIHNlbGYuX3JlYWRfbG9jazoKKyAgICAgICAgICAgIHNlbGYuX3Jlc2V0X3JlYWRfYnVmKCkKKyAgICAgICAgaWYgcG9zIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoInNlZWsoKSByZXR1cm5lZCBpbnZhbGlkIHBvc2l0aW9uIikKKyAgICAgICAgcmV0dXJuIHBvcworCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3dyaXRlX2J1ZjoKKyAgICAgICAgICAgIHJldHVybiBCdWZmZXJlZFdyaXRlci50ZWxsKHNlbGYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gQnVmZmVyZWRSZWFkZXIudGVsbChzZWxmKQorCisgICAgZGVmIHRydW5jYXRlKHNlbGYsIHBvcz1Ob25lKToKKyAgICAgICAgaWYgcG9zIGlzIE5vbmU6CisgICAgICAgICAgICBwb3MgPSBzZWxmLnRlbGwoKQorICAgICAgICAjIFVzZSBzZWVrIHRvIGZsdXNoIHRoZSByZWFkIGJ1ZmZlci4KKyAgICAgICAgcmV0dXJuIEJ1ZmZlcmVkV3JpdGVyLnRydW5jYXRlKHNlbGYsIHBvcykKKworICAgIGRlZiByZWFkKHNlbGYsIG49Tm9uZSk6CisgICAgICAgIGlmIG4gaXMgTm9uZToKKyAgICAgICAgICAgIG4gPSAtMQorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgcmV0dXJuIEJ1ZmZlcmVkUmVhZGVyLnJlYWQoc2VsZiwgbikKKworICAgIGRlZiByZWFkaW50byhzZWxmLCBiKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHJldHVybiBCdWZmZXJlZFJlYWRlci5yZWFkaW50byhzZWxmLCBiKQorCisgICAgZGVmIHBlZWsoc2VsZiwgbj0wKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHJldHVybiBCdWZmZXJlZFJlYWRlci5wZWVrKHNlbGYsIG4pCisKKyAgICBkZWYgcmVhZDEoc2VsZiwgbik6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICByZXR1cm4gQnVmZmVyZWRSZWFkZXIucmVhZDEoc2VsZiwgbikKKworICAgIGRlZiB3cml0ZShzZWxmLCBiKToKKyAgICAgICAgaWYgc2VsZi5fcmVhZF9idWY6CisgICAgICAgICAgICAjIFVuZG8gcmVhZGFoZWFkCisgICAgICAgICAgICB3aXRoIHNlbGYuX3JlYWRfbG9jazoKKyAgICAgICAgICAgICAgICBzZWxmLnJhdy5zZWVrKHNlbGYuX3JlYWRfcG9zIC0gbGVuKHNlbGYuX3JlYWRfYnVmKSwgMSkKKyAgICAgICAgICAgICAgICBzZWxmLl9yZXNldF9yZWFkX2J1ZigpCisgICAgICAgIHJldHVybiBCdWZmZXJlZFdyaXRlci53cml0ZShzZWxmLCBiKQorCisKK2NsYXNzIFRleHRJT0Jhc2UoSU9CYXNlKToKKworICAgICIiIkJhc2UgY2xhc3MgZm9yIHRleHQgSS9PLgorCisgICAgVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNoYXJhY3RlciBhbmQgbGluZSBiYXNlZCBpbnRlcmZhY2UgdG8gc3RyZWFtCisgICAgSS9PLiBUaGVyZSBpcyBubyByZWFkaW50byBtZXRob2QgYmVjYXVzZSBQeXRob24ncyBjaGFyYWN0ZXIgc3RyaW5ncworICAgIGFyZSBpbW11dGFibGUuIFRoZXJlIGlzIG5vIHB1YmxpYyBjb25zdHJ1Y3Rvci4KKyAgICAiIiIKKworICAgIGRlZiByZWFkKHNlbGYsIG49LTEpOgorICAgICAgICAiIiJSZWFkIGF0IG1vc3QgbiBjaGFyYWN0ZXJzIGZyb20gc3RyZWFtLgorCisgICAgICAgIFJlYWQgZnJvbSB1bmRlcmx5aW5nIGJ1ZmZlciB1bnRpbCB3ZSBoYXZlIG4gY2hhcmFjdGVycyBvciB3ZSBoaXQgRU9GLgorICAgICAgICBJZiBuIGlzIG5lZ2F0aXZlIG9yIG9taXR0ZWQsIHJlYWQgdW50aWwgRU9GLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fdW5zdXBwb3J0ZWQoInJlYWQiKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICAiIiJXcml0ZSBzdHJpbmcgcyB0byBzdHJlYW0uIiIiCisgICAgICAgIHNlbGYuX3Vuc3VwcG9ydGVkKCJ3cml0ZSIpCisKKyAgICBkZWYgdHJ1bmNhdGUoc2VsZiwgcG9zPU5vbmUpOgorICAgICAgICAiIiJUcnVuY2F0ZSBzaXplIHRvIHBvcy4iIiIKKyAgICAgICAgc2VsZi5fdW5zdXBwb3J0ZWQoInRydW5jYXRlIikKKworICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAgICAgIiIiUmVhZCB1bnRpbCBuZXdsaW5lIG9yIEVPRi4KKworICAgICAgICBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBpZiBFT0YgaXMgaGl0IGltbWVkaWF0ZWx5LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fdW5zdXBwb3J0ZWQoInJlYWRsaW5lIikKKworICAgIGRlZiBkZXRhY2goc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBTZXBhcmF0ZSB0aGUgdW5kZXJseWluZyBidWZmZXIgZnJvbSB0aGUgVGV4dElPQmFzZSBhbmQgcmV0dXJuIGl0LgorCisgICAgICAgIEFmdGVyIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBoYXMgYmVlbiBkZXRhY2hlZCwgdGhlIFRleHRJTyBpcyBpbiBhbgorICAgICAgICB1bnVzYWJsZSBzdGF0ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3Vuc3VwcG9ydGVkKCJkZXRhY2giKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGVuY29kaW5nKHNlbGYpOgorICAgICAgICAiIiJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZS4iIiIKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuZXdsaW5lcyhzZWxmKToKKyAgICAgICAgIiIiTGluZSBlbmRpbmdzIHRyYW5zbGF0ZWQgc28gZmFyLgorCisgICAgICAgIE9ubHkgbGluZSBlbmRpbmdzIHRyYW5zbGF0ZWQgZHVyaW5nIHJlYWRpbmcgYXJlIGNvbnNpZGVyZWQuCisKKyAgICAgICAgU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGVycm9ycyhzZWxmKToKKyAgICAgICAgIiIiRXJyb3Igc2V0dGluZyBvZiB0aGUgZGVjb2RlciBvciBlbmNvZGVyLgorCisgICAgICAgIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLiIiIgorICAgICAgICByZXR1cm4gTm9uZQorCitpby5UZXh0SU9CYXNlLnJlZ2lzdGVyKFRleHRJT0Jhc2UpCisKKworY2xhc3MgSW5jcmVtZW50YWxOZXdsaW5lRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICByIiIiQ29kZWMgdXNlZCB3aGVuIHJlYWRpbmcgYSBmaWxlIGluIHVuaXZlcnNhbCBuZXdsaW5lcyBtb2RlLiAgSXQgd3JhcHMKKyAgICBhbm90aGVyIGluY3JlbWVudGFsIGRlY29kZXIsIHRyYW5zbGF0aW5nIFxyXG4gYW5kIFxyIGludG8gXG4uICBJdCBhbHNvCisgICAgcmVjb3JkcyB0aGUgdHlwZXMgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQuICBXaGVuIHVzZWQgd2l0aAorICAgIHRyYW5zbGF0ZT1GYWxzZSwgaXQgZW5zdXJlcyB0aGF0IHRoZSBuZXdsaW5lIHNlcXVlbmNlIGlzIHJldHVybmVkIGluCisgICAgb25lIHBpZWNlLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWNvZGVyLCB0cmFuc2xhdGUsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIuX19pbml0X18oc2VsZiwgZXJyb3JzPWVycm9ycykKKyAgICAgICAgc2VsZi50cmFuc2xhdGUgPSB0cmFuc2xhdGUKKyAgICAgICAgc2VsZi5kZWNvZGVyID0gZGVjb2RlcgorICAgICAgICBzZWxmLnNlZW5ubCA9IDAKKyAgICAgICAgc2VsZi5wZW5kaW5nY3IgPSBGYWxzZQorCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICAjIGRlY29kZSBpbnB1dCAod2l0aCB0aGUgZXZlbnR1YWwgXHIgZnJvbSBhIHByZXZpb3VzIHBhc3MpCisgICAgICAgIGlmIHNlbGYuZGVjb2RlciBpcyBOb25lOgorICAgICAgICAgICAgb3V0cHV0ID0gaW5wdXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dHB1dCA9IHNlbGYuZGVjb2Rlci5kZWNvZGUoaW5wdXQsIGZpbmFsPWZpbmFsKQorICAgICAgICBpZiBzZWxmLnBlbmRpbmdjciBhbmQgKG91dHB1dCBvciBmaW5hbCk6CisgICAgICAgICAgICBvdXRwdXQgPSAiXHIiICsgb3V0cHV0CisgICAgICAgICAgICBzZWxmLnBlbmRpbmdjciA9IEZhbHNlCisKKyAgICAgICAgIyByZXRhaW4gbGFzdCBcciBldmVuIHdoZW4gbm90IHRyYW5zbGF0aW5nIGRhdGE6CisgICAgICAgICMgdGhlbiByZWFkbGluZSgpIGlzIHN1cmUgdG8gZ2V0IFxyXG4gaW4gb25lIHBhc3MKKyAgICAgICAgaWYgb3V0cHV0LmVuZHN3aXRoKCJcciIpIGFuZCBub3QgZmluYWw6CisgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXRbOi0xXQorICAgICAgICAgICAgc2VsZi5wZW5kaW5nY3IgPSBUcnVlCisKKyAgICAgICAgIyBSZWNvcmQgd2hpY2ggbmV3bGluZXMgYXJlIHJlYWQKKyAgICAgICAgY3JsZiA9IG91dHB1dC5jb3VudCgnXHJcbicpCisgICAgICAgIGNyID0gb3V0cHV0LmNvdW50KCdccicpIC0gY3JsZgorICAgICAgICBsZiA9IG91dHB1dC5jb3VudCgnXG4nKSAtIGNybGYKKyAgICAgICAgc2VsZi5zZWVubmwgfD0gKGxmIGFuZCBzZWxmLl9MRikgfCAoY3IgYW5kIHNlbGYuX0NSKSBcCisgICAgICAgICAgICAgICAgICAgIHwgKGNybGYgYW5kIHNlbGYuX0NSTEYpCisKKyAgICAgICAgaWYgc2VsZi50cmFuc2xhdGU6CisgICAgICAgICAgICBpZiBjcmxmOgorICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKCJcclxuIiwgIlxuIikKKyAgICAgICAgICAgIGlmIGNyOgorICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5yZXBsYWNlKCJcciIsICJcbiIpCisKKyAgICAgICAgcmV0dXJuIG91dHB1dAorCisgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRlY29kZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGJ1ZiA9IGIiIgorICAgICAgICAgICAgZmxhZyA9IDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJ1ZiwgZmxhZyA9IHNlbGYuZGVjb2Rlci5nZXRzdGF0ZSgpCisgICAgICAgIGZsYWcgPDw9IDEKKyAgICAgICAgaWYgc2VsZi5wZW5kaW5nY3I6CisgICAgICAgICAgICBmbGFnIHw9IDEKKyAgICAgICAgcmV0dXJuIGJ1ZiwgZmxhZworCisgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgYnVmLCBmbGFnID0gc3RhdGUKKyAgICAgICAgc2VsZi5wZW5kaW5nY3IgPSBib29sKGZsYWcgJiAxKQorICAgICAgICBpZiBzZWxmLmRlY29kZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmRlY29kZXIuc2V0c3RhdGUoKGJ1ZiwgZmxhZyA+PiAxKSkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZWVubmwgPSAwCisgICAgICAgIHNlbGYucGVuZGluZ2NyID0gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5kZWNvZGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5kZWNvZGVyLnJlc2V0KCkKKworICAgIF9MRiA9IDEKKyAgICBfQ1IgPSAyCisgICAgX0NSTEYgPSA0CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmV3bGluZXMoc2VsZik6CisgICAgICAgIHJldHVybiAoTm9uZSwKKyAgICAgICAgICAgICAgICAiXG4iLAorICAgICAgICAgICAgICAgICJcciIsCisgICAgICAgICAgICAgICAgKCJcciIsICJcbiIpLAorICAgICAgICAgICAgICAgICJcclxuIiwKKyAgICAgICAgICAgICAgICAoIlxuIiwgIlxyXG4iKSwKKyAgICAgICAgICAgICAgICAoIlxyIiwgIlxyXG4iKSwKKyAgICAgICAgICAgICAgICAoIlxyIiwgIlxuIiwgIlxyXG4iKQorICAgICAgICAgICAgICAgKVtzZWxmLnNlZW5ubF0KKworCitjbGFzcyBUZXh0SU9XcmFwcGVyKFRleHRJT0Jhc2UpOgorCisgICAgciIiIkNoYXJhY3RlciBhbmQgbGluZSBiYXNlZCBsYXllciBvdmVyIGEgQnVmZmVyZWRJT0Jhc2Ugb2JqZWN0LCBidWZmZXIuCisKKyAgICBlbmNvZGluZyBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgZW5jb2RpbmcgdGhhdCB0aGUgc3RyZWFtIHdpbGwgYmUKKyAgICBkZWNvZGVkIG9yIGVuY29kZWQgd2l0aC4gSXQgZGVmYXVsdHMgdG8gbG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nLgorCisgICAgZXJyb3JzIGRldGVybWluZXMgdGhlIHN0cmljdG5lc3Mgb2YgZW5jb2RpbmcgYW5kIGRlY29kaW5nIChzZWUgdGhlCisgICAgY29kZWNzLnJlZ2lzdGVyKSBhbmQgZGVmYXVsdHMgdG8gInN0cmljdCIuCisKKyAgICBuZXdsaW5lIGNhbiBiZSBOb25lLCAnJywgJ1xuJywgJ1xyJywgb3IgJ1xyXG4nLiAgSXQgY29udHJvbHMgdGhlCisgICAgaGFuZGxpbmcgb2YgbGluZSBlbmRpbmdzLiBJZiBpdCBpcyBOb25lLCB1bml2ZXJzYWwgbmV3bGluZXMgaXMKKyAgICBlbmFibGVkLiAgV2l0aCB0aGlzIGVuYWJsZWQsIG9uIGlucHV0LCB0aGUgbGluZXMgZW5kaW5ncyAnXG4nLCAnXHInLAorICAgIG9yICdcclxuJyBhcmUgdHJhbnNsYXRlZCB0byAnXG4nIGJlZm9yZSBiZWluZyByZXR1cm5lZCB0byB0aGUKKyAgICBjYWxsZXIuIENvbnZlcnNlbHksIG9uIG91dHB1dCwgJ1xuJyBpcyB0cmFuc2xhdGVkIHRvIHRoZSBzeXN0ZW0KKyAgICBkZWZhdWx0IGxpbmUgc2VwYXJhdG9yLCBvcy5saW5lc2VwLiBJZiBuZXdsaW5lIGlzIGFueSBvdGhlciBvZiBpdHMKKyAgICBsZWdhbCB2YWx1ZXMsIHRoYXQgbmV3bGluZSBiZWNvbWVzIHRoZSBuZXdsaW5lIHdoZW4gdGhlIGZpbGUgaXMgcmVhZAorICAgIGFuZCBpdCBpcyByZXR1cm5lZCB1bnRyYW5zbGF0ZWQuIE9uIG91dHB1dCwgJ1xuJyBpcyBjb252ZXJ0ZWQgdG8gdGhlCisgICAgbmV3bGluZS4KKworICAgIElmIGxpbmVfYnVmZmVyaW5nIGlzIFRydWUsIGEgY2FsbCB0byBmbHVzaCBpcyBpbXBsaWVkIHdoZW4gYSBjYWxsIHRvCisgICAgd3JpdGUgY29udGFpbnMgYSBuZXdsaW5lIGNoYXJhY3Rlci4KKyAgICAiIiIKKworICAgIF9DSFVOS19TSVpFID0gMjA0OAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1ZmZlciwgZW5jb2Rpbmc9Tm9uZSwgZXJyb3JzPU5vbmUsIG5ld2xpbmU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgbGluZV9idWZmZXJpbmc9RmFsc2UpOgorICAgICAgICBpZiBuZXdsaW5lIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShuZXdsaW5lLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaWxsZWdhbCBuZXdsaW5lIHR5cGU6ICVyIiAlICh0eXBlKG5ld2xpbmUpLCkpCisgICAgICAgIGlmIG5ld2xpbmUgbm90IGluIChOb25lLCAiIiwgIlxuIiwgIlxyIiwgIlxyXG4iKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImlsbGVnYWwgbmV3bGluZSB2YWx1ZTogJXIiICUgKG5ld2xpbmUsKSkKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgbG9jYWxlCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgIyBJbXBvcnRpbmcgbG9jYWxlIG1heSBmYWlsIGlmIFB5dGhvbiBpcyBiZWluZyBidWlsdAorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gImFzY2lpIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZygpCisKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZW5jb2RpbmcsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCBlbmNvZGluZzogJXIiICUgZW5jb2RpbmcpCisKKyAgICAgICAgaWYgZXJyb3JzIGlzIE5vbmU6CisgICAgICAgICAgICBlcnJvcnMgPSAic3RyaWN0IgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXJyb3JzLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGVycm9yczogJXIiICUgZXJyb3JzKQorCisgICAgICAgIHNlbGYuX2J1ZmZlciA9IGJ1ZmZlcgorICAgICAgICBzZWxmLl9saW5lX2J1ZmZlcmluZyA9IGxpbmVfYnVmZmVyaW5nCisgICAgICAgIHNlbGYuX2VuY29kaW5nID0gZW5jb2RpbmcKKyAgICAgICAgc2VsZi5fZXJyb3JzID0gZXJyb3JzCisgICAgICAgIHNlbGYuX3JlYWR1bml2ZXJzYWwgPSBub3QgbmV3bGluZQorICAgICAgICBzZWxmLl9yZWFkdHJhbnNsYXRlID0gbmV3bGluZSBpcyBOb25lCisgICAgICAgIHNlbGYuX3JlYWRubCA9IG5ld2xpbmUKKyAgICAgICAgc2VsZi5fd3JpdGV0cmFuc2xhdGUgPSBuZXdsaW5lICE9ICcnCisgICAgICAgIHNlbGYuX3dyaXRlbmwgPSBuZXdsaW5lIG9yIG9zLmxpbmVzZXAKKyAgICAgICAgc2VsZi5fZW5jb2RlciA9IE5vbmUKKyAgICAgICAgc2VsZi5fZGVjb2RlciA9IE5vbmUKKyAgICAgICAgc2VsZi5fZGVjb2RlZF9jaGFycyA9ICcnICAjIGJ1ZmZlciBmb3IgdGV4dCByZXR1cm5lZCBmcm9tIGRlY29kZXIKKyAgICAgICAgc2VsZi5fZGVjb2RlZF9jaGFyc191c2VkID0gMCAgIyBvZmZzZXQgaW50byBfZGVjb2RlZF9jaGFycyBmb3IgcmVhZCgpCisgICAgICAgIHNlbGYuX3NuYXBzaG90ID0gTm9uZSAgIyBpbmZvIGZvciByZWNvbnN0cnVjdGluZyBkZWNvZGVyIHN0YXRlCisgICAgICAgIHNlbGYuX3NlZWthYmxlID0gc2VsZi5fdGVsbGluZyA9IHNlbGYuYnVmZmVyLnNlZWthYmxlKCkKKworICAgICAgICBpZiBzZWxmLl9zZWVrYWJsZSBhbmQgc2VsZi53cml0YWJsZSgpOgorICAgICAgICAgICAgcG9zaXRpb24gPSBzZWxmLmJ1ZmZlci50ZWxsKCkKKyAgICAgICAgICAgIGlmIHBvc2l0aW9uICE9IDA6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9nZXRfZW5jb2RlcigpLnNldHN0YXRlKDApCisgICAgICAgICAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIFNvbWV0aW1lcyB0aGUgZW5jb2RlciBkb2Vzbid0IGV4aXN0CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICMgc2VsZi5fc25hcHNob3QgaXMgZWl0aGVyIE5vbmUsIG9yIGEgdHVwbGUgKGRlY19mbGFncywgbmV4dF9pbnB1dCkKKyAgICAjIHdoZXJlIGRlY19mbGFncyBpcyB0aGUgc2Vjb25kIChpbnRlZ2VyKSBpdGVtIG9mIHRoZSBkZWNvZGVyIHN0YXRlCisgICAgIyBhbmQgbmV4dF9pbnB1dCBpcyB0aGUgY2h1bmsgb2YgaW5wdXQgYnl0ZXMgdGhhdCBjb21lcyBuZXh0IGFmdGVyIHRoZQorICAgICMgc25hcHNob3QgcG9pbnQuICBXZSB1c2UgdGhpcyB0byByZWNvbnN0cnVjdCBkZWNvZGVyIHN0YXRlcyBpbiB0ZWxsKCkuCisKKyAgICAjIE5hbWluZyBjb252ZW50aW9uOgorICAgICMgICAtICJieXRlc18uLi4iIGZvciBpbnRlZ2VyIHZhcmlhYmxlcyB0aGF0IGNvdW50IGlucHV0IGJ5dGVzCisgICAgIyAgIC0gImNoYXJzXy4uLiIgZm9yIGludGVnZXIgdmFyaWFibGVzIHRoYXQgY291bnQgZGVjb2RlZCBjaGFyYWN0ZXJzCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLm5hbWUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuICI8X3B5aW8uVGV4dElPV3JhcHBlciBlbmNvZGluZz0nezB9Jz4iLmZvcm1hdChzZWxmLmVuY29kaW5nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICI8X3B5aW8uVGV4dElPV3JhcHBlciBuYW1lPXswIXJ9IGVuY29kaW5nPSd7MX0nPiIuZm9ybWF0KAorICAgICAgICAgICAgICAgIG5hbWUsIHNlbGYuZW5jb2RpbmcpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9lbmNvZGluZworCisgICAgQHByb3BlcnR5CisgICAgZGVmIGVycm9ycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Vycm9ycworCisgICAgQHByb3BlcnR5CisgICAgZGVmIGxpbmVfYnVmZmVyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbGluZV9idWZmZXJpbmcKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBidWZmZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9idWZmZXIKKworICAgIGRlZiBzZWVrYWJsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlLiIpCisgICAgICAgIHJldHVybiBzZWxmLl9zZWVrYWJsZQorCisgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5idWZmZXIucmVhZGFibGUoKQorCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5idWZmZXIud3JpdGFibGUoKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBzZWxmLmJ1ZmZlci5mbHVzaCgpCisgICAgICAgIHNlbGYuX3RlbGxpbmcgPSBzZWxmLl9zZWVrYWJsZQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmJ1ZmZlciBpcyBub3QgTm9uZSBhbmQgbm90IHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlci5jbG9zZSgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY2xvc2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5idWZmZXIuY2xvc2VkCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYnVmZmVyLm5hbWUKKworICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJ1ZmZlci5maWxlbm8oKQorCisgICAgZGVmIGlzYXR0eShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYnVmZmVyLmlzYXR0eSgpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigid3JpdGUgdG8gY2xvc2VkIGZpbGUiKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzLCB1bmljb2RlKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2FuJ3Qgd3JpdGUgJXMgdG8gdGV4dCBzdHJlYW0iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLl9fY2xhc3NfXy5fX25hbWVfXykKKyAgICAgICAgbGVuZ3RoID0gbGVuKHMpCisgICAgICAgIGhhc2xmID0gKHNlbGYuX3dyaXRldHJhbnNsYXRlIG9yIHNlbGYuX2xpbmVfYnVmZmVyaW5nKSBhbmQgIlxuIiBpbiBzCisgICAgICAgIGlmIGhhc2xmIGFuZCBzZWxmLl93cml0ZXRyYW5zbGF0ZSBhbmQgc2VsZi5fd3JpdGVubCAhPSAiXG4iOgorICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgiXG4iLCBzZWxmLl93cml0ZW5sKQorICAgICAgICBlbmNvZGVyID0gc2VsZi5fZW5jb2RlciBvciBzZWxmLl9nZXRfZW5jb2RlcigpCisgICAgICAgICMgWFhYIFdoYXQgaWYgd2Ugd2VyZSBqdXN0IHJlYWRpbmc/CisgICAgICAgIGIgPSBlbmNvZGVyLmVuY29kZShzKQorICAgICAgICBzZWxmLmJ1ZmZlci53cml0ZShiKQorICAgICAgICBpZiBzZWxmLl9saW5lX2J1ZmZlcmluZyBhbmQgKGhhc2xmIG9yICJcciIgaW4gcyk6CisgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgc2VsZi5fc25hcHNob3QgPSBOb25lCisgICAgICAgIGlmIHNlbGYuX2RlY29kZXI6CisgICAgICAgICAgICBzZWxmLl9kZWNvZGVyLnJlc2V0KCkKKyAgICAgICAgcmV0dXJuIGxlbmd0aAorCisgICAgZGVmIF9nZXRfZW5jb2RlcihzZWxmKToKKyAgICAgICAgbWFrZV9lbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcihzZWxmLl9lbmNvZGluZykKKyAgICAgICAgc2VsZi5fZW5jb2RlciA9IG1ha2VfZW5jb2RlcihzZWxmLl9lcnJvcnMpCisgICAgICAgIHJldHVybiBzZWxmLl9lbmNvZGVyCisKKyAgICBkZWYgX2dldF9kZWNvZGVyKHNlbGYpOgorICAgICAgICBtYWtlX2RlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKHNlbGYuX2VuY29kaW5nKQorICAgICAgICBkZWNvZGVyID0gbWFrZV9kZWNvZGVyKHNlbGYuX2Vycm9ycykKKyAgICAgICAgaWYgc2VsZi5fcmVhZHVuaXZlcnNhbDoKKyAgICAgICAgICAgIGRlY29kZXIgPSBJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyKGRlY29kZXIsIHNlbGYuX3JlYWR0cmFuc2xhdGUpCisgICAgICAgIHNlbGYuX2RlY29kZXIgPSBkZWNvZGVyCisgICAgICAgIHJldHVybiBkZWNvZGVyCisKKyAgICAjIFRoZSBmb2xsb3dpbmcgdGhyZWUgbWV0aG9kcyBpbXBsZW1lbnQgYW4gQURUIGZvciBfZGVjb2RlZF9jaGFycy4KKyAgICAjIFRleHQgcmV0dXJuZWQgZnJvbSB0aGUgZGVjb2RlciBpcyBidWZmZXJlZCBoZXJlIHVudGlsIHRoZSBjbGllbnQKKyAgICAjIHJlcXVlc3RzIGl0IGJ5IGNhbGxpbmcgb3VyIHJlYWQoKSBvciByZWFkbGluZSgpIG1ldGhvZC4KKyAgICBkZWYgX3NldF9kZWNvZGVkX2NoYXJzKHNlbGYsIGNoYXJzKToKKyAgICAgICAgIiIiU2V0IHRoZSBfZGVjb2RlZF9jaGFycyBidWZmZXIuIiIiCisgICAgICAgIHNlbGYuX2RlY29kZWRfY2hhcnMgPSBjaGFycworICAgICAgICBzZWxmLl9kZWNvZGVkX2NoYXJzX3VzZWQgPSAwCisKKyAgICBkZWYgX2dldF9kZWNvZGVkX2NoYXJzKHNlbGYsIG49Tm9uZSk6CisgICAgICAgICIiIkFkdmFuY2UgaW50byB0aGUgX2RlY29kZWRfY2hhcnMgYnVmZmVyLiIiIgorICAgICAgICBvZmZzZXQgPSBzZWxmLl9kZWNvZGVkX2NoYXJzX3VzZWQKKyAgICAgICAgaWYgbiBpcyBOb25lOgorICAgICAgICAgICAgY2hhcnMgPSBzZWxmLl9kZWNvZGVkX2NoYXJzW29mZnNldDpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjaGFycyA9IHNlbGYuX2RlY29kZWRfY2hhcnNbb2Zmc2V0Om9mZnNldCArIG5dCisgICAgICAgIHNlbGYuX2RlY29kZWRfY2hhcnNfdXNlZCArPSBsZW4oY2hhcnMpCisgICAgICAgIHJldHVybiBjaGFycworCisgICAgZGVmIF9yZXdpbmRfZGVjb2RlZF9jaGFycyhzZWxmLCBuKToKKyAgICAgICAgIiIiUmV3aW5kIHRoZSBfZGVjb2RlZF9jaGFycyBidWZmZXIuIiIiCisgICAgICAgIGlmIHNlbGYuX2RlY29kZWRfY2hhcnNfdXNlZCA8IG46CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigicmV3aW5kIGRlY29kZWRfY2hhcnMgb3V0IG9mIGJvdW5kcyIpCisgICAgICAgIHNlbGYuX2RlY29kZWRfY2hhcnNfdXNlZCAtPSBuCisKKyAgICBkZWYgX3JlYWRfY2h1bmsoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZWFkIGFuZCBkZWNvZGUgdGhlIG5leHQgY2h1bmsgb2YgZGF0YSBmcm9tIHRoZSBCdWZmZXJlZFJlYWRlci4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBUaGUgcmV0dXJuIHZhbHVlIGlzIFRydWUgdW5sZXNzIEVPRiB3YXMgcmVhY2hlZC4gIFRoZSBkZWNvZGVkCisgICAgICAgICMgc3RyaW5nIGlzIHBsYWNlZCBpbiBzZWxmLl9kZWNvZGVkX2NoYXJzIChyZXBsYWNpbmcgaXRzIHByZXZpb3VzCisgICAgICAgICMgdmFsdWUpLiAgVGhlIGVudGlyZSBpbnB1dCBjaHVuayBpcyBzZW50IHRvIHRoZSBkZWNvZGVyLCB0aG91Z2gKKyAgICAgICAgIyBzb21lIG9mIGl0IG1heSByZW1haW4gYnVmZmVyZWQgaW4gdGhlIGRlY29kZXIsIHlldCB0byBiZQorICAgICAgICAjIGNvbnZlcnRlZC4KKworICAgICAgICBpZiBzZWxmLl9kZWNvZGVyIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJubyBkZWNvZGVyIikKKworICAgICAgICBpZiBzZWxmLl90ZWxsaW5nOgorICAgICAgICAgICAgIyBUbyBwcmVwYXJlIGZvciB0ZWxsKCksIHdlIG5lZWQgdG8gc25hcHNob3QgYSBwb2ludCBpbiB0aGUKKyAgICAgICAgICAgICMgZmlsZSB3aGVyZSB0aGUgZGVjb2RlcidzIGlucHV0IGJ1ZmZlciBpcyBlbXB0eS4KKworICAgICAgICAgICAgZGVjX2J1ZmZlciwgZGVjX2ZsYWdzID0gc2VsZi5fZGVjb2Rlci5nZXRzdGF0ZSgpCisgICAgICAgICAgICAjIEdpdmVuIHRoaXMsIHdlIGtub3cgdGhlcmUgd2FzIGEgdmFsaWQgc25hcHNob3QgcG9pbnQKKyAgICAgICAgICAgICMgbGVuKGRlY19idWZmZXIpIGJ5dGVzIGFnbyB3aXRoIGRlY29kZXIgc3RhdGUgKGInJywgZGVjX2ZsYWdzKS4KKworICAgICAgICAjIFJlYWQgYSBjaHVuaywgZGVjb2RlIGl0LCBhbmQgcHV0IHRoZSByZXN1bHQgaW4gc2VsZi5fZGVjb2RlZF9jaGFycy4KKyAgICAgICAgaW5wdXRfY2h1bmsgPSBzZWxmLmJ1ZmZlci5yZWFkMShzZWxmLl9DSFVOS19TSVpFKQorICAgICAgICBlb2YgPSBub3QgaW5wdXRfY2h1bmsKKyAgICAgICAgc2VsZi5fc2V0X2RlY29kZWRfY2hhcnMoc2VsZi5fZGVjb2Rlci5kZWNvZGUoaW5wdXRfY2h1bmssIGVvZikpCisKKyAgICAgICAgaWYgc2VsZi5fdGVsbGluZzoKKyAgICAgICAgICAgICMgQXQgdGhlIHNuYXBzaG90IHBvaW50LCBsZW4oZGVjX2J1ZmZlcikgYnl0ZXMgYmVmb3JlIHRoZSByZWFkLAorICAgICAgICAgICAgIyB0aGUgbmV4dCBpbnB1dCB0byBiZSBkZWNvZGVkIGlzIGRlY19idWZmZXIgKyBpbnB1dF9jaHVuay4KKyAgICAgICAgICAgIHNlbGYuX3NuYXBzaG90ID0gKGRlY19mbGFncywgZGVjX2J1ZmZlciArIGlucHV0X2NodW5rKQorCisgICAgICAgIHJldHVybiBub3QgZW9mCisKKyAgICBkZWYgX3BhY2tfY29va2llKHNlbGYsIHBvc2l0aW9uLCBkZWNfZmxhZ3M9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3RvX2ZlZWQ9MCwgbmVlZF9lb2Y9MCwgY2hhcnNfdG9fc2tpcD0wKToKKyAgICAgICAgIyBUaGUgbWVhbmluZyBvZiBhIHRlbGwoKSBjb29raWUgaXM6IHNlZWsgdG8gcG9zaXRpb24sIHNldCB0aGUKKyAgICAgICAgIyBkZWNvZGVyIGZsYWdzIHRvIGRlY19mbGFncywgcmVhZCBieXRlc190b19mZWVkIGJ5dGVzLCBmZWVkIHRoZW0KKyAgICAgICAgIyBpbnRvIHRoZSBkZWNvZGVyIHdpdGggbmVlZF9lb2YgYXMgdGhlIEVPRiBmbGFnLCB0aGVuIHNraXAKKyAgICAgICAgIyBjaGFyc190b19za2lwIGNoYXJhY3RlcnMgb2YgdGhlIGRlY29kZWQgcmVzdWx0LiAgRm9yIG1vc3Qgc2ltcGxlCisgICAgICAgICMgZGVjb2RlcnMsIHRlbGwoKSB3aWxsIG9mdGVuIGp1c3QgZ2l2ZSBhIGJ5dGUgb2Zmc2V0IGluIHRoZSBmaWxlLgorICAgICAgICByZXR1cm4gKHBvc2l0aW9uIHwgKGRlY19mbGFnczw8NjQpIHwgKGJ5dGVzX3RvX2ZlZWQ8PDEyOCkgfAorICAgICAgICAgICAgICAgKGNoYXJzX3RvX3NraXA8PDE5MikgfCBib29sKG5lZWRfZW9mKTw8MjU2KQorCisgICAgZGVmIF91bnBhY2tfY29va2llKHNlbGYsIGJpZ2ludCk6CisgICAgICAgIHJlc3QsIHBvc2l0aW9uID0gZGl2bW9kKGJpZ2ludCwgMTw8NjQpCisgICAgICAgIHJlc3QsIGRlY19mbGFncyA9IGRpdm1vZChyZXN0LCAxPDw2NCkKKyAgICAgICAgcmVzdCwgYnl0ZXNfdG9fZmVlZCA9IGRpdm1vZChyZXN0LCAxPDw2NCkKKyAgICAgICAgbmVlZF9lb2YsIGNoYXJzX3RvX3NraXAgPSBkaXZtb2QocmVzdCwgMTw8NjQpCisgICAgICAgIHJldHVybiBwb3NpdGlvbiwgZGVjX2ZsYWdzLCBieXRlc190b19mZWVkLCBuZWVkX2VvZiwgY2hhcnNfdG9fc2tpcAorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9zZWVrYWJsZToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoInVuZGVybHlpbmcgc3RyZWFtIGlzIG5vdCBzZWVrYWJsZSIpCisgICAgICAgIGlmIG5vdCBzZWxmLl90ZWxsaW5nOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigidGVsbGluZyBwb3NpdGlvbiBkaXNhYmxlZCBieSBuZXh0KCkgY2FsbCIpCisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBwb3NpdGlvbiA9IHNlbGYuYnVmZmVyLnRlbGwoKQorICAgICAgICBkZWNvZGVyID0gc2VsZi5fZGVjb2RlcgorICAgICAgICBpZiBkZWNvZGVyIGlzIE5vbmUgb3Igc2VsZi5fc25hcHNob3QgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuX2RlY29kZWRfY2hhcnM6CisgICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCisgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoInBlbmRpbmcgZGVjb2RlZCB0ZXh0IikKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbgorCisgICAgICAgICMgU2tpcCBiYWNrd2FyZCB0byB0aGUgc25hcHNob3QgcG9pbnQgKHNlZSBfcmVhZF9jaHVuaykuCisgICAgICAgIGRlY19mbGFncywgbmV4dF9pbnB1dCA9IHNlbGYuX3NuYXBzaG90CisgICAgICAgIHBvc2l0aW9uIC09IGxlbihuZXh0X2lucHV0KQorCisgICAgICAgICMgSG93IG1hbnkgZGVjb2RlZCBjaGFyYWN0ZXJzIGhhdmUgYmVlbiB1c2VkIHVwIHNpbmNlIHRoZSBzbmFwc2hvdD8KKyAgICAgICAgY2hhcnNfdG9fc2tpcCA9IHNlbGYuX2RlY29kZWRfY2hhcnNfdXNlZAorICAgICAgICBpZiBjaGFyc190b19za2lwID09IDA6CisgICAgICAgICAgICAjIFdlIGhhdmVuJ3QgbW92ZWQgZnJvbSB0aGUgc25hcHNob3QgcG9pbnQuCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFja19jb29raWUocG9zaXRpb24sIGRlY19mbGFncykKKworICAgICAgICAjIFN0YXJ0aW5nIGZyb20gdGhlIHNuYXBzaG90IHBvc2l0aW9uLCB3ZSB3aWxsIHdhbGsgdGhlIGRlY29kZXIKKyAgICAgICAgIyBmb3J3YXJkIHVudGlsIGl0IGdpdmVzIHVzIGVub3VnaCBkZWNvZGVkIGNoYXJhY3RlcnMuCisgICAgICAgIHNhdmVkX3N0YXRlID0gZGVjb2Rlci5nZXRzdGF0ZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgTm90ZSBvdXIgaW5pdGlhbCBzdGFydCBwb2ludC4KKyAgICAgICAgICAgIGRlY29kZXIuc2V0c3RhdGUoKGInJywgZGVjX2ZsYWdzKSkKKyAgICAgICAgICAgIHN0YXJ0X3BvcyA9IHBvc2l0aW9uCisgICAgICAgICAgICBzdGFydF9mbGFncywgYnl0ZXNfZmVkLCBjaGFyc19kZWNvZGVkID0gZGVjX2ZsYWdzLCAwLCAwCisgICAgICAgICAgICBuZWVkX2VvZiA9IDAKKworICAgICAgICAgICAgIyBGZWVkIHRoZSBkZWNvZGVyIG9uZSBieXRlIGF0IGEgdGltZS4gIEFzIHdlIGdvLCBub3RlIHRoZQorICAgICAgICAgICAgIyBuZWFyZXN0ICJzYWZlIHN0YXJ0IHBvaW50IiBiZWZvcmUgdGhlIGN1cnJlbnQgbG9jYXRpb24KKyAgICAgICAgICAgICMgKGEgcG9pbnQgd2hlcmUgdGhlIGRlY29kZXIgaGFzIG5vdGhpbmcgYnVmZmVyZWQsIHNvIHNlZWsoKQorICAgICAgICAgICAgIyBjYW4gc2FmZWx5IHN0YXJ0IGZyb20gdGhlcmUgYW5kIGFkdmFuY2UgdG8gdGhpcyBsb2NhdGlvbikuCisgICAgICAgICAgICBmb3IgbmV4dF9ieXRlIGluIG5leHRfaW5wdXQ6CisgICAgICAgICAgICAgICAgYnl0ZXNfZmVkICs9IDEKKyAgICAgICAgICAgICAgICBjaGFyc19kZWNvZGVkICs9IGxlbihkZWNvZGVyLmRlY29kZShuZXh0X2J5dGUpKQorICAgICAgICAgICAgICAgIGRlY19idWZmZXIsIGRlY19mbGFncyA9IGRlY29kZXIuZ2V0c3RhdGUoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBkZWNfYnVmZmVyIGFuZCBjaGFyc19kZWNvZGVkIDw9IGNoYXJzX3RvX3NraXA6CisgICAgICAgICAgICAgICAgICAgICMgRGVjb2RlciBidWZmZXIgaXMgZW1wdHksIHNvIHRoaXMgaXMgYSBzYWZlIHN0YXJ0IHBvaW50LgorICAgICAgICAgICAgICAgICAgICBzdGFydF9wb3MgKz0gYnl0ZXNfZmVkCisgICAgICAgICAgICAgICAgICAgIGNoYXJzX3RvX3NraXAgLT0gY2hhcnNfZGVjb2RlZAorICAgICAgICAgICAgICAgICAgICBzdGFydF9mbGFncywgYnl0ZXNfZmVkLCBjaGFyc19kZWNvZGVkID0gZGVjX2ZsYWdzLCAwLCAwCisgICAgICAgICAgICAgICAgaWYgY2hhcnNfZGVjb2RlZCA+PSBjaGFyc190b19za2lwOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFdlIGRpZG4ndCBnZXQgZW5vdWdoIGRlY29kZWQgZGF0YTsgc2lnbmFsIEVPRiB0byBnZXQgbW9yZS4KKyAgICAgICAgICAgICAgICBjaGFyc19kZWNvZGVkICs9IGxlbihkZWNvZGVyLmRlY29kZShiJycsIGZpbmFsPVRydWUpKQorICAgICAgICAgICAgICAgIG5lZWRfZW9mID0gMQorICAgICAgICAgICAgICAgIGlmIGNoYXJzX2RlY29kZWQgPCBjaGFyc190b19za2lwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJjYW4ndCByZWNvbnN0cnVjdCBsb2dpY2FsIGZpbGUgcG9zaXRpb24iKQorCisgICAgICAgICAgICAjIFRoZSByZXR1cm5lZCBjb29raWUgY29ycmVzcG9uZHMgdG8gdGhlIGxhc3Qgc2FmZSBzdGFydCBwb2ludC4KKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYWNrX2Nvb2tpZSgKKyAgICAgICAgICAgICAgICBzdGFydF9wb3MsIHN0YXJ0X2ZsYWdzLCBieXRlc19mZWQsIG5lZWRfZW9mLCBjaGFyc190b19za2lwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVjb2Rlci5zZXRzdGF0ZShzYXZlZF9zdGF0ZSkKKworICAgIGRlZiB0cnVuY2F0ZShzZWxmLCBwb3M9Tm9uZSk6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBpZiBwb3MgaXMgTm9uZToKKyAgICAgICAgICAgIHBvcyA9IHNlbGYudGVsbCgpCisgICAgICAgIHJldHVybiBzZWxmLmJ1ZmZlci50cnVuY2F0ZShwb3MpCisKKyAgICBkZWYgZGV0YWNoKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmJ1ZmZlciBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYnVmZmVyIGlzIGFscmVhZHkgZGV0YWNoZWQiKQorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgYnVmZmVyID0gc2VsZi5fYnVmZmVyCisgICAgICAgIHNlbGYuX2J1ZmZlciA9IE5vbmUKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcgorCisgICAgZGVmIHNlZWsoc2VsZiwgY29va2llLCB3aGVuY2U9MCk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidGVsbCBvbiBjbG9zZWQgZmlsZSIpCisgICAgICAgIGlmIG5vdCBzZWxmLl9zZWVrYWJsZToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoInVuZGVybHlpbmcgc3RyZWFtIGlzIG5vdCBzZWVrYWJsZSIpCisgICAgICAgIGlmIHdoZW5jZSA9PSAxOiAjIHNlZWsgcmVsYXRpdmUgdG8gY3VycmVudCBwb3NpdGlvbgorICAgICAgICAgICAgaWYgY29va2llICE9IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiY2FuJ3QgZG8gbm9uemVybyBjdXItcmVsYXRpdmUgc2Vla3MiKQorICAgICAgICAgICAgIyBTZWVraW5nIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIHNob3VsZCBhdHRlbXB0IHRvCisgICAgICAgICAgICAjIHN5bmMgdGhlIHVuZGVybHlpbmcgYnVmZmVyIHdpdGggdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICAgICAgICB3aGVuY2UgPSAwCisgICAgICAgICAgICBjb29raWUgPSBzZWxmLnRlbGwoKQorICAgICAgICBpZiB3aGVuY2UgPT0gMjogIyBzZWVrIHJlbGF0aXZlIHRvIGVuZCBvZiBmaWxlCisgICAgICAgICAgICBpZiBjb29raWUgIT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJjYW4ndCBkbyBub256ZXJvIGVuZC1yZWxhdGl2ZSBzZWVrcyIpCisgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgICAgIHBvc2l0aW9uID0gc2VsZi5idWZmZXIuc2VlaygwLCAyKQorICAgICAgICAgICAgc2VsZi5fc2V0X2RlY29kZWRfY2hhcnMoJycpCisgICAgICAgICAgICBzZWxmLl9zbmFwc2hvdCA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNlbGYuX2RlY29kZXI6CisgICAgICAgICAgICAgICAgc2VsZi5fZGVjb2Rlci5yZXNldCgpCisgICAgICAgICAgICByZXR1cm4gcG9zaXRpb24KKyAgICAgICAgaWYgd2hlbmNlICE9IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIHdoZW5jZSAoJXIsIHNob3VsZCBiZSAwLCAxIG9yIDIpIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuY2UsKSkKKyAgICAgICAgaWYgY29va2llIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5lZ2F0aXZlIHNlZWsgcG9zaXRpb24gJXIiICUgKGNvb2tpZSwpKQorICAgICAgICBzZWxmLmZsdXNoKCkKKworICAgICAgICAjIFRoZSBzdHJhdGVneSBvZiBzZWVrKCkgaXMgdG8gZ28gYmFjayB0byB0aGUgc2FmZSBzdGFydCBwb2ludAorICAgICAgICAjIGFuZCByZXBsYXkgdGhlIGVmZmVjdCBvZiByZWFkKGNoYXJzX3RvX3NraXApIGZyb20gdGhlcmUuCisgICAgICAgIHN0YXJ0X3BvcywgZGVjX2ZsYWdzLCBieXRlc190b19mZWVkLCBuZWVkX2VvZiwgY2hhcnNfdG9fc2tpcCA9IFwKKyAgICAgICAgICAgIHNlbGYuX3VucGFja19jb29raWUoY29va2llKQorCisgICAgICAgICMgU2VlayBiYWNrIHRvIHRoZSBzYWZlIHN0YXJ0IHBvaW50LgorICAgICAgICBzZWxmLmJ1ZmZlci5zZWVrKHN0YXJ0X3BvcykKKyAgICAgICAgc2VsZi5fc2V0X2RlY29kZWRfY2hhcnMoJycpCisgICAgICAgIHNlbGYuX3NuYXBzaG90ID0gTm9uZQorCisgICAgICAgICMgUmVzdG9yZSB0aGUgZGVjb2RlciB0byBpdHMgc3RhdGUgZnJvbSB0aGUgc2FmZSBzdGFydCBwb2ludC4KKyAgICAgICAgaWYgY29va2llID09IDAgYW5kIHNlbGYuX2RlY29kZXI6CisgICAgICAgICAgICBzZWxmLl9kZWNvZGVyLnJlc2V0KCkKKyAgICAgICAgZWxpZiBzZWxmLl9kZWNvZGVyIG9yIGRlY19mbGFncyBvciBjaGFyc190b19za2lwOgorICAgICAgICAgICAgc2VsZi5fZGVjb2RlciA9IHNlbGYuX2RlY29kZXIgb3Igc2VsZi5fZ2V0X2RlY29kZXIoKQorICAgICAgICAgICAgc2VsZi5fZGVjb2Rlci5zZXRzdGF0ZSgoYicnLCBkZWNfZmxhZ3MpKQorICAgICAgICAgICAgc2VsZi5fc25hcHNob3QgPSAoZGVjX2ZsYWdzLCBiJycpCisKKyAgICAgICAgaWYgY2hhcnNfdG9fc2tpcDoKKyAgICAgICAgICAgICMgSnVzdCBsaWtlIF9yZWFkX2NodW5rLCBmZWVkIHRoZSBkZWNvZGVyIGFuZCBzYXZlIGEgc25hcHNob3QuCisgICAgICAgICAgICBpbnB1dF9jaHVuayA9IHNlbGYuYnVmZmVyLnJlYWQoYnl0ZXNfdG9fZmVlZCkKKyAgICAgICAgICAgIHNlbGYuX3NldF9kZWNvZGVkX2NoYXJzKAorICAgICAgICAgICAgICAgIHNlbGYuX2RlY29kZXIuZGVjb2RlKGlucHV0X2NodW5rLCBuZWVkX2VvZikpCisgICAgICAgICAgICBzZWxmLl9zbmFwc2hvdCA9IChkZWNfZmxhZ3MsIGlucHV0X2NodW5rKQorCisgICAgICAgICAgICAjIFNraXAgY2hhcnNfdG9fc2tpcCBvZiB0aGUgZGVjb2RlZCBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgaWYgbGVuKHNlbGYuX2RlY29kZWRfY2hhcnMpIDwgY2hhcnNfdG9fc2tpcDoKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJjYW4ndCByZXN0b3JlIGxvZ2ljYWwgZmlsZSBwb3NpdGlvbiIpCisgICAgICAgICAgICBzZWxmLl9kZWNvZGVkX2NoYXJzX3VzZWQgPSBjaGFyc190b19za2lwCisKKyAgICAgICAgIyBGaW5hbGx5LCByZXNldCB0aGUgZW5jb2RlciAobWVyZWx5IHVzZWZ1bCBmb3IgcHJvcGVyIEJPTSBoYW5kbGluZykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW5jb2RlciA9IHNlbGYuX2VuY29kZXIgb3Igc2VsZi5fZ2V0X2VuY29kZXIoKQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICAjIFNvbWV0aW1lcyB0aGUgZW5jb2RlciBkb2Vzbid0IGV4aXN0CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBjb29raWUgIT0gMDoKKyAgICAgICAgICAgICAgICBlbmNvZGVyLnNldHN0YXRlKDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVuY29kZXIucmVzZXQoKQorICAgICAgICByZXR1cm4gY29va2llCisKKyAgICBkZWYgcmVhZChzZWxmLCBuPU5vbmUpOgorICAgICAgICBzZWxmLl9jaGVja1JlYWRhYmxlKCkKKyAgICAgICAgaWYgbiBpcyBOb25lOgorICAgICAgICAgICAgbiA9IC0xCisgICAgICAgIGRlY29kZXIgPSBzZWxmLl9kZWNvZGVyIG9yIHNlbGYuX2dldF9kZWNvZGVyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbi5fX2luZGV4X18KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIikKKyAgICAgICAgaWYgbiA8IDA6CisgICAgICAgICAgICAjIFJlYWQgZXZlcnl0aGluZy4KKyAgICAgICAgICAgIHJlc3VsdCA9IChzZWxmLl9nZXRfZGVjb2RlZF9jaGFycygpICsKKyAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLmRlY29kZShzZWxmLmJ1ZmZlci5yZWFkKCksIGZpbmFsPVRydWUpKQorICAgICAgICAgICAgc2VsZi5fc2V0X2RlY29kZWRfY2hhcnMoJycpCisgICAgICAgICAgICBzZWxmLl9zbmFwc2hvdCA9IE5vbmUKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgS2VlcCByZWFkaW5nIGNodW5rcyB1bnRpbCB3ZSBoYXZlIG4gY2hhcmFjdGVycyB0byByZXR1cm4uCisgICAgICAgICAgICBlb2YgPSBGYWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZ2V0X2RlY29kZWRfY2hhcnMobikKKyAgICAgICAgICAgIHdoaWxlIGxlbihyZXN1bHQpIDwgbiBhbmQgbm90IGVvZjoKKyAgICAgICAgICAgICAgICBlb2YgPSBub3Qgc2VsZi5fcmVhZF9jaHVuaygpCisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNlbGYuX2dldF9kZWNvZGVkX2NoYXJzKG4gLSBsZW4ocmVzdWx0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBzZWxmLl90ZWxsaW5nID0gRmFsc2UKKyAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIHNlbGYuX3NuYXBzaG90ID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fdGVsbGluZyA9IHNlbGYuX3NlZWthYmxlCisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHJldHVybiBsaW5lCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgbGltaXQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVhZCBmcm9tIGNsb3NlZCBmaWxlIikKKyAgICAgICAgaWYgbGltaXQgaXMgTm9uZToKKyAgICAgICAgICAgIGxpbWl0ID0gLTEKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShsaW1pdCwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJsaW1pdCBtdXN0IGJlIGFuIGludGVnZXIiKQorCisgICAgICAgICMgR3JhYiBhbGwgdGhlIGRlY29kZWQgdGV4dCAod2Ugd2lsbCByZXdpbmQgYW55IGV4dHJhIGJpdHMgbGF0ZXIpLgorICAgICAgICBsaW5lID0gc2VsZi5fZ2V0X2RlY29kZWRfY2hhcnMoKQorCisgICAgICAgIHN0YXJ0ID0gMAorICAgICAgICAjIE1ha2UgdGhlIGRlY29kZXIgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgorICAgICAgICBpZiBub3Qgc2VsZi5fZGVjb2RlcjoKKyAgICAgICAgICAgIHNlbGYuX2dldF9kZWNvZGVyKCkKKworICAgICAgICBwb3MgPSBlbmRwb3MgPSBOb25lCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBzZWxmLl9yZWFkdHJhbnNsYXRlOgorICAgICAgICAgICAgICAgICMgTmV3bGluZXMgYXJlIGFscmVhZHkgdHJhbnNsYXRlZCwgb25seSBzZWFyY2ggZm9yIFxuCisgICAgICAgICAgICAgICAgcG9zID0gbGluZS5maW5kKCdcbicsIHN0YXJ0KQorICAgICAgICAgICAgICAgIGlmIHBvcyA+PSAwOgorICAgICAgICAgICAgICAgICAgICBlbmRwb3MgPSBwb3MgKyAxCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBsZW4obGluZSkKKworICAgICAgICAgICAgZWxpZiBzZWxmLl9yZWFkdW5pdmVyc2FsOgorICAgICAgICAgICAgICAgICMgVW5pdmVyc2FsIG5ld2xpbmUgc2VhcmNoLiBGaW5kIGFueSBvZiBcciwgXHJcbiwgXG4KKyAgICAgICAgICAgICAgICAjIFRoZSBkZWNvZGVyIGVuc3VyZXMgdGhhdCBcclxuIGFyZSBub3Qgc3BsaXQgaW4gdHdvIHBpZWNlcworCisgICAgICAgICAgICAgICAgIyBJbiBDIHdlJ2QgbG9vayBmb3IgdGhlc2UgaW4gcGFyYWxsZWwgb2YgY291cnNlLgorICAgICAgICAgICAgICAgIG5scG9zID0gbGluZS5maW5kKCJcbiIsIHN0YXJ0KQorICAgICAgICAgICAgICAgIGNycG9zID0gbGluZS5maW5kKCJcciIsIHN0YXJ0KQorICAgICAgICAgICAgICAgIGlmIGNycG9zID09IC0xOgorICAgICAgICAgICAgICAgICAgICBpZiBubHBvcyA9PSAtMToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgTm90aGluZyBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBsZW4obGluZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRm91bmQgXG4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHBvcyA9IG5scG9zICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIG5scG9zID09IC0xOgorICAgICAgICAgICAgICAgICAgICAjIEZvdW5kIGxvbmUgXHIKKyAgICAgICAgICAgICAgICAgICAgZW5kcG9zID0gY3Jwb3MgKyAxCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxpZiBubHBvcyA8IGNycG9zOgorICAgICAgICAgICAgICAgICAgICAjIEZvdW5kIFxuCisgICAgICAgICAgICAgICAgICAgIGVuZHBvcyA9IG5scG9zICsgMQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgbmxwb3MgPT0gY3Jwb3MgKyAxOgorICAgICAgICAgICAgICAgICAgICAjIEZvdW5kIFxyXG4KKyAgICAgICAgICAgICAgICAgICAgZW5kcG9zID0gY3Jwb3MgKyAyCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBGb3VuZCBccgorICAgICAgICAgICAgICAgICAgICBlbmRwb3MgPSBjcnBvcyArIDEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBub24tdW5pdmVyc2FsCisgICAgICAgICAgICAgICAgcG9zID0gbGluZS5maW5kKHNlbGYuX3JlYWRubCkKKyAgICAgICAgICAgICAgICBpZiBwb3MgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgZW5kcG9zID0gcG9zICsgbGVuKHNlbGYuX3JlYWRubCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgaWYgbGltaXQgPj0gMCBhbmQgbGVuKGxpbmUpID49IGxpbWl0OgorICAgICAgICAgICAgICAgIGVuZHBvcyA9IGxpbWl0ICAjIHJlYWNoZWQgbGVuZ3RoIGxpbWl0CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgIyBObyBsaW5lIGVuZGluZyBzZWVuIHlldCAtIGdldCBtb3JlIGRhdGEnCisgICAgICAgICAgICB3aGlsZSBzZWxmLl9yZWFkX2NodW5rKCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fZGVjb2RlZF9jaGFyczoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIHNlbGYuX2RlY29kZWRfY2hhcnM6CisgICAgICAgICAgICAgICAgbGluZSArPSBzZWxmLl9nZXRfZGVjb2RlZF9jaGFycygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgZW5kIG9mIGZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLl9zZXRfZGVjb2RlZF9jaGFycygnJykKKyAgICAgICAgICAgICAgICBzZWxmLl9zbmFwc2hvdCA9IE5vbmUKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZQorCisgICAgICAgIGlmIGxpbWl0ID49IDAgYW5kIGVuZHBvcyA+IGxpbWl0OgorICAgICAgICAgICAgZW5kcG9zID0gbGltaXQgICMgZG9uJ3QgZXhjZWVkIGxpbWl0CisKKyAgICAgICAgIyBSZXdpbmQgX2RlY29kZWRfY2hhcnMgdG8ganVzdCBhZnRlciB0aGUgbGluZSBlbmRpbmcgd2UgZm91bmQuCisgICAgICAgIHNlbGYuX3Jld2luZF9kZWNvZGVkX2NoYXJzKGxlbihsaW5lKSAtIGVuZHBvcykKKyAgICAgICAgcmV0dXJuIGxpbmVbOmVuZHBvc10KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuZXdsaW5lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RlY29kZXIubmV3bGluZXMgaWYgc2VsZi5fZGVjb2RlciBlbHNlIE5vbmUKKworCitjbGFzcyBTdHJpbmdJTyhUZXh0SU9XcmFwcGVyKToKKyAgICAiIiJUZXh0IEkvTyBpbXBsZW1lbnRhdGlvbiB1c2luZyBhbiBpbi1tZW1vcnkgYnVmZmVyLgorCisgICAgVGhlIGluaXRpYWxfdmFsdWUgYXJndW1lbnQgc2V0cyB0aGUgdmFsdWUgb2Ygb2JqZWN0LiAgVGhlIG5ld2xpbmUKKyAgICBhcmd1bWVudCBpcyBsaWtlIHRoZSBvbmUgb2YgVGV4dElPV3JhcHBlcidzIGNvbnN0cnVjdG9yLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluaXRpYWxfdmFsdWU9IiIsIG5ld2xpbmU9IlxuIik6CisgICAgICAgIHN1cGVyKFN0cmluZ0lPLCBzZWxmKS5fX2luaXRfXyhCeXRlc0lPKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz0idXRmLTgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzPSJzdHJpY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZT1uZXdsaW5lKQorICAgICAgICAjIElzc3VlICM1NjQ1OiBtYWtlIHVuaXZlcnNhbCBuZXdsaW5lcyBzZW1hbnRpY3MgdGhlIHNhbWUgYXMgaW4gdGhlCisgICAgICAgICMgQyB2ZXJzaW9uLCBldmVuIHVuZGVyIFdpbmRvd3MuCisgICAgICAgIGlmIG5ld2xpbmUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3dyaXRldHJhbnNsYXRlID0gRmFsc2UKKyAgICAgICAgaWYgaW5pdGlhbF92YWx1ZToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGluaXRpYWxfdmFsdWUsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIGluaXRpYWxfdmFsdWUgPSB1bmljb2RlKGluaXRpYWxfdmFsdWUpCisgICAgICAgICAgICBzZWxmLndyaXRlKGluaXRpYWxfdmFsdWUpCisgICAgICAgICAgICBzZWxmLnNlZWsoMCkKKworICAgIGRlZiBnZXR2YWx1ZShzZWxmKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHJldHVybiBzZWxmLmJ1ZmZlci5nZXR2YWx1ZSgpLmRlY29kZShzZWxmLl9lbmNvZGluZywgc2VsZi5fZXJyb3JzKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAjIFRleHRJT1dyYXBwZXIgdGVsbHMgdGhlIGVuY29kaW5nIGluIGl0cyByZXByLiBJbiBTdHJpbmdJTywKKyAgICAgICAgIyB0aGF0J3MgYSBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuCisgICAgICAgIHJldHVybiBvYmplY3QuX19yZXByX18oc2VsZikKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBlcnJvcnMoc2VsZik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZGV0YWNoKHNlbGYpOgorICAgICAgICAjIFRoaXMgZG9lc24ndCBtYWtlIHNlbnNlIG9uIFN0cmluZ0lPLgorICAgICAgICBzZWxmLl91bnN1cHBvcnRlZCgiZGV0YWNoIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX3B5aW8ucHljIGIvbGliL3B5dGhvbjIuNy9fcHlpby5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5Mzc2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX3B5aW8ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX3B5aW8ucHlvIGIvbGliL3B5dGhvbjIuNy9fcHlpby5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5Mzc2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX3B5aW8ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX3N0cnB0aW1lLnB5IGIvbGliL3B5dGhvbjIuNy9fc3RycHRpbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmMzBhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX3N0cnB0aW1lLnB5CkBAIC0wLDAgKzEsNDY3IEBACisiIiJTdHJwdGltZS1yZWxhdGVkIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucy4KKworQ0xBU1NFUzoKKyAgICBMb2NhbGVUaW1lIC0tIERpc2NvdmVycyBhbmQgc3RvcmVzIGxvY2FsZS1zcGVjaWZpYyB0aW1lIGluZm9ybWF0aW9uCisgICAgVGltZVJFIC0tIENyZWF0ZXMgcmVnZXhlcyBmb3IgcGF0dGVybiBtYXRjaGluZyBhIHN0cmluZyBvZiB0ZXh0IGNvbnRhaW5pbmcKKyAgICAgICAgICAgICAgICB0aW1lIGluZm9ybWF0aW9uCisKK0ZVTkNUSU9OUzoKKyAgICBfZ2V0bGFuZyAtLSBGaWd1cmUgb3V0IHdoYXQgbGFuZ3VhZ2UgaXMgYmVpbmcgdXNlZCBmb3IgdGhlIGxvY2FsZQorICAgIHN0cnB0aW1lIC0tIENhbGN1bGF0ZXMgdGhlIHRpbWUgc3RydWN0IHJlcHJlc2VudGVkIGJ5IHRoZSBwYXNzZWQtaW4gc3RyaW5nCisKKyIiIgoraW1wb3J0IHRpbWUKK2ltcG9ydCBsb2NhbGUKK2ltcG9ydCBjYWxlbmRhcgorZnJvbSByZSBpbXBvcnQgY29tcGlsZSBhcyByZV9jb21waWxlCitmcm9tIHJlIGltcG9ydCBJR05PUkVDQVNFCitmcm9tIHJlIGltcG9ydCBlc2NhcGUgYXMgcmVfZXNjYXBlCitmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRlIGFzIGRhdGV0aW1lX2RhdGUKK3RyeToKKyAgICBmcm9tIHRocmVhZCBpbXBvcnQgYWxsb2NhdGVfbG9jayBhcyBfdGhyZWFkX2FsbG9jYXRlX2xvY2sKK2V4Y2VwdDoKKyAgICBmcm9tIGR1bW15X3RocmVhZCBpbXBvcnQgYWxsb2NhdGVfbG9jayBhcyBfdGhyZWFkX2FsbG9jYXRlX2xvY2sKKworX19hbGxfXyA9IFtdCisKK2RlZiBfZ2V0bGFuZygpOgorICAgICMgRmlndXJlIG91dCB3aGF0IHRoZSBjdXJyZW50IGxhbmd1YWdlIGlzIHNldCB0by4KKyAgICByZXR1cm4gbG9jYWxlLmdldGxvY2FsZShsb2NhbGUuTENfVElNRSkKKworY2xhc3MgTG9jYWxlVGltZShvYmplY3QpOgorICAgICIiIlN0b3JlcyBhbmQgaGFuZGxlcyBsb2NhbGUtc3BlY2lmaWMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aW1lLgorCisgICAgQVRUUklCVVRFUzoKKyAgICAgICAgZl93ZWVrZGF5IC0tIGZ1bGwgd2Vla2RheSBuYW1lcyAoNy1pdGVtIGxpc3QpCisgICAgICAgIGFfd2Vla2RheSAtLSBhYmJyZXZpYXRlZCB3ZWVrZGF5IG5hbWVzICg3LWl0ZW0gbGlzdCkKKyAgICAgICAgZl9tb250aCAtLSBmdWxsIG1vbnRoIG5hbWVzICgxMy1pdGVtIGxpc3Q7IGR1bW15IHZhbHVlIGluIFswXSwgd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgaXMgYWRkZWQgYnkgY29kZSkKKyAgICAgICAgYV9tb250aCAtLSBhYmJyZXZpYXRlZCBtb250aCBuYW1lcyAoMTMtaXRlbSBsaXN0LCBkdW1teSB2YWx1ZSBpbgorICAgICAgICAgICAgICAgICAgICBbMF0sIHdoaWNoIGlzIGFkZGVkIGJ5IGNvZGUpCisgICAgICAgIGFtX3BtIC0tIEFNL1BNIHJlcHJlc2VudGF0aW9uICgyLWl0ZW0gbGlzdCkKKyAgICAgICAgTENfZGF0ZV90aW1lIC0tIGZvcm1hdCBzdHJpbmcgZm9yIGRhdGUvdGltZSByZXByZXNlbnRhdGlvbiAoc3RyaW5nKQorICAgICAgICBMQ19kYXRlIC0tIGZvcm1hdCBzdHJpbmcgZm9yIGRhdGUgcmVwcmVzZW50YXRpb24gKHN0cmluZykKKyAgICAgICAgTENfdGltZSAtLSBmb3JtYXQgc3RyaW5nIGZvciB0aW1lIHJlcHJlc2VudGF0aW9uIChzdHJpbmcpCisgICAgICAgIHRpbWV6b25lIC0tIGRheWxpZ2h0LSBhbmQgbm9uLWRheWxpZ2h0LXNhdmluZ3MgdGltZXpvbmUgcmVwcmVzZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgKDItaXRlbSBsaXN0IG9mIHNldHMpCisgICAgICAgIGxhbmcgLS0gTGFuZ3VhZ2UgdXNlZCBieSBpbnN0YW5jZSAoMi1pdGVtIHR1cGxlKQorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAiIiJTZXQgYWxsIGF0dHJpYnV0ZXMuCisKKyAgICAgICAgT3JkZXIgb2YgbWV0aG9kcyBjYWxsZWQgbWF0dGVycyBmb3IgZGVwZW5kZW5jeSByZWFzb25zLgorCisgICAgICAgIFRoZSBsb2NhbGUgbGFuZ3VhZ2UgaXMgc2V0IGF0IHRoZSBvZmZzZXQgYW5kIHRoZW4gY2hlY2tlZCBhZ2FpbiBiZWZvcmUKKyAgICAgICAgZXhpdGluZy4gIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGF0dHJpYnV0ZXMgd2VyZSBub3Qgc2V0IHdpdGggYQorICAgICAgICBtaXggb2YgaW5mb3JtYXRpb24gZnJvbSBtb3JlIHRoYW4gb25lIGxvY2FsZS4gIFRoaXMgd291bGQgbW9zdCBsaWtlbHkKKyAgICAgICAgaGFwcGVuIHdoZW4gdXNpbmcgdGhyZWFkcyB3aGVyZSBvbmUgdGhyZWFkIGNhbGxzIGEgbG9jYWxlLWRlcGVuZGVudAorICAgICAgICBmdW5jdGlvbiB3aGlsZSBhbm90aGVyIHRocmVhZCBjaGFuZ2VzIHRoZSBsb2NhbGUgd2hpbGUgdGhlIGZ1bmN0aW9uIGluCisgICAgICAgIHRoZSBvdGhlciB0aHJlYWQgaXMgc3RpbGwgcnVubmluZy4gIFByb3BlciBjb2Rpbmcgd291bGQgY2FsbCBmb3IKKyAgICAgICAgbG9ja3MgdG8gcHJldmVudCBjaGFuZ2luZyB0aGUgbG9jYWxlIHdoaWxlIGxvY2FsZS1kZXBlbmRlbnQgY29kZSBpcworICAgICAgICBydW5uaW5nLiAgVGhlIGNoZWNrIGhlcmUgaXMgZG9uZSBpbiBjYXNlIHNvbWVvbmUgZG9lcyBub3QgdGhpbmsgYWJvdXQKKyAgICAgICAgZG9pbmcgdGhpcy4KKworICAgICAgICBPbmx5IG90aGVyIHBvc3NpYmxlIGlzc3VlIGlzIGlmIHNvbWVvbmUgY2hhbmdlZCB0aGUgdGltZXpvbmUgYW5kIGRpZAorICAgICAgICBub3QgY2FsbCB0ei50enNldCAuICBUaGF0IGlzIGFuIGlzc3VlIGZvciB0aGUgcHJvZ3JhbW1lciwgdGhvdWdoLAorICAgICAgICBzaW5jZSBjaGFuZ2luZyB0aGUgdGltZXpvbmUgaXMgd29ydGhsZXNzIHdpdGhvdXQgdGhhdCBjYWxsLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmxhbmcgPSBfZ2V0bGFuZygpCisgICAgICAgIHNlbGYuX19jYWxjX3dlZWtkYXkoKQorICAgICAgICBzZWxmLl9fY2FsY19tb250aCgpCisgICAgICAgIHNlbGYuX19jYWxjX2FtX3BtKCkKKyAgICAgICAgc2VsZi5fX2NhbGNfdGltZXpvbmUoKQorICAgICAgICBzZWxmLl9fY2FsY19kYXRlX3RpbWUoKQorICAgICAgICBpZiBfZ2V0bGFuZygpICE9IHNlbGYubGFuZzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImxvY2FsZSBjaGFuZ2VkIGR1cmluZyBpbml0aWFsaXphdGlvbiIpCisKKyAgICBkZWYgX19wYWQoc2VsZiwgc2VxLCBmcm9udCk6CisgICAgICAgICMgQWRkICcnIHRvIHNlcSB0byBlaXRoZXIgdGhlIGZyb250IChpcyBUcnVlKSwgZWxzZSB0aGUgYmFjay4KKyAgICAgICAgc2VxID0gbGlzdChzZXEpCisgICAgICAgIGlmIGZyb250OgorICAgICAgICAgICAgc2VxLmluc2VydCgwLCAnJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcS5hcHBlbmQoJycpCisgICAgICAgIHJldHVybiBzZXEKKworICAgIGRlZiBfX2NhbGNfd2Vla2RheShzZWxmKToKKyAgICAgICAgIyBTZXQgc2VsZi5hX3dlZWtkYXkgYW5kIHNlbGYuZl93ZWVrZGF5IHVzaW5nIHRoZSBjYWxlbmRhcgorICAgICAgICAjIG1vZHVsZS4KKyAgICAgICAgYV93ZWVrZGF5ID0gW2NhbGVuZGFyLmRheV9hYmJyW2ldLmxvd2VyKCkgZm9yIGkgaW4gcmFuZ2UoNyldCisgICAgICAgIGZfd2Vla2RheSA9IFtjYWxlbmRhci5kYXlfbmFtZVtpXS5sb3dlcigpIGZvciBpIGluIHJhbmdlKDcpXQorICAgICAgICBzZWxmLmFfd2Vla2RheSA9IGFfd2Vla2RheQorICAgICAgICBzZWxmLmZfd2Vla2RheSA9IGZfd2Vla2RheQorCisgICAgZGVmIF9fY2FsY19tb250aChzZWxmKToKKyAgICAgICAgIyBTZXQgc2VsZi5mX21vbnRoIGFuZCBzZWxmLmFfbW9udGggdXNpbmcgdGhlIGNhbGVuZGFyIG1vZHVsZS4KKyAgICAgICAgYV9tb250aCA9IFtjYWxlbmRhci5tb250aF9hYmJyW2ldLmxvd2VyKCkgZm9yIGkgaW4gcmFuZ2UoMTMpXQorICAgICAgICBmX21vbnRoID0gW2NhbGVuZGFyLm1vbnRoX25hbWVbaV0ubG93ZXIoKSBmb3IgaSBpbiByYW5nZSgxMyldCisgICAgICAgIHNlbGYuYV9tb250aCA9IGFfbW9udGgKKyAgICAgICAgc2VsZi5mX21vbnRoID0gZl9tb250aAorCisgICAgZGVmIF9fY2FsY19hbV9wbShzZWxmKToKKyAgICAgICAgIyBTZXQgc2VsZi5hbV9wbSBieSB1c2luZyB0aW1lLnN0cmZ0aW1lKCkuCisKKyAgICAgICAgIyBUaGUgbWFnaWMgZGF0ZSAoMTk5OSwzLDE3LGhvdXIsNDQsNTUsMiw3NiwwKSBpcyBub3QgcmVhbGx5IHRoYXQKKyAgICAgICAgIyBtYWdpY2FsOyBqdXN0IGhhcHBlbmVkIHRvIGhhdmUgdXNlZCBpdCBldmVyeXdoZXJlIGVsc2Ugd2hlcmUgYQorICAgICAgICAjIHN0YXRpYyBkYXRlIHdhcyBuZWVkZWQuCisgICAgICAgIGFtX3BtID0gW10KKyAgICAgICAgZm9yIGhvdXIgaW4gKDAxLDIyKToKKyAgICAgICAgICAgIHRpbWVfdHVwbGUgPSB0aW1lLnN0cnVjdF90aW1lKCgxOTk5LDMsMTcsaG91ciw0NCw1NSwyLDc2LDApKQorICAgICAgICAgICAgYW1fcG0uYXBwZW5kKHRpbWUuc3RyZnRpbWUoIiVwIiwgdGltZV90dXBsZSkubG93ZXIoKSkKKyAgICAgICAgc2VsZi5hbV9wbSA9IGFtX3BtCisKKyAgICBkZWYgX19jYWxjX2RhdGVfdGltZShzZWxmKToKKyAgICAgICAgIyBTZXQgc2VsZi5kYXRlX3RpbWUsIHNlbGYuZGF0ZSwgJiBzZWxmLnRpbWUgYnkgdXNpbmcKKyAgICAgICAgIyB0aW1lLnN0cmZ0aW1lKCkuCisKKyAgICAgICAgIyBVc2UgKDE5OTksMywxNywyMiw0NCw1NSwyLDc2LDApIGZvciBtYWdpYyBkYXRlIGJlY2F1c2UgdGhlIGFtb3VudCBvZgorICAgICAgICAjIG92ZXJsb2FkZWQgbnVtYmVycyBpcyBtaW5pbWl6ZWQuICBUaGUgb3JkZXIgaW4gd2hpY2ggc2VhcmNoZXMgZm9yCisgICAgICAgICMgdmFsdWVzIHdpdGhpbiB0aGUgZm9ybWF0IHN0cmluZyBpcyB2ZXJ5IGltcG9ydGFudDsgaXQgZWxpbWluYXRlcworICAgICAgICAjIHBvc3NpYmxlIGFtYmlndWl0eSBmb3Igd2hhdCBzb21ldGhpbmcgcmVwcmVzZW50cy4KKyAgICAgICAgdGltZV90dXBsZSA9IHRpbWUuc3RydWN0X3RpbWUoKDE5OTksMywxNywyMiw0NCw1NSwyLDc2LDApKQorICAgICAgICBkYXRlX3RpbWUgPSBbTm9uZSwgTm9uZSwgTm9uZV0KKyAgICAgICAgZGF0ZV90aW1lWzBdID0gdGltZS5zdHJmdGltZSgiJWMiLCB0aW1lX3R1cGxlKS5sb3dlcigpCisgICAgICAgIGRhdGVfdGltZVsxXSA9IHRpbWUuc3RyZnRpbWUoIiV4IiwgdGltZV90dXBsZSkubG93ZXIoKQorICAgICAgICBkYXRlX3RpbWVbMl0gPSB0aW1lLnN0cmZ0aW1lKCIlWCIsIHRpbWVfdHVwbGUpLmxvd2VyKCkKKyAgICAgICAgcmVwbGFjZW1lbnRfcGFpcnMgPSBbKCclJywgJyUlJyksIChzZWxmLmZfd2Vla2RheVsyXSwgJyVBJyksCisgICAgICAgICAgICAgICAgICAgIChzZWxmLmZfbW9udGhbM10sICclQicpLCAoc2VsZi5hX3dlZWtkYXlbMl0sICclYScpLAorICAgICAgICAgICAgICAgICAgICAoc2VsZi5hX21vbnRoWzNdLCAnJWInKSwgKHNlbGYuYW1fcG1bMV0sICclcCcpLAorICAgICAgICAgICAgICAgICAgICAoJzE5OTknLCAnJVknKSwgKCc5OScsICcleScpLCAoJzIyJywgJyVIJyksCisgICAgICAgICAgICAgICAgICAgICgnNDQnLCAnJU0nKSwgKCc1NScsICclUycpLCAoJzc2JywgJyVqJyksCisgICAgICAgICAgICAgICAgICAgICgnMTcnLCAnJWQnKSwgKCcwMycsICclbScpLCAoJzMnLCAnJW0nKSwKKyAgICAgICAgICAgICAgICAgICAgIyAnMycgbmVlZGVkIGZvciB3aGVuIG5vIGxlYWRpbmcgemVyby4KKyAgICAgICAgICAgICAgICAgICAgKCcyJywgJyV3JyksICgnMTAnLCAnJUknKV0KKyAgICAgICAgcmVwbGFjZW1lbnRfcGFpcnMuZXh0ZW5kKFsodHosICIlWiIpIGZvciB0el92YWx1ZXMgaW4gc2VsZi50aW1lem9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHR6IGluIHR6X3ZhbHVlc10pCisgICAgICAgIGZvciBvZmZzZXQsZGlyZWN0aXZlIGluICgoMCwnJWMnKSwgKDEsJyV4JyksICgyLCclWCcpKToKKyAgICAgICAgICAgIGN1cnJlbnRfZm9ybWF0ID0gZGF0ZV90aW1lW29mZnNldF0KKyAgICAgICAgICAgIGZvciBvbGQsIG5ldyBpbiByZXBsYWNlbWVudF9wYWlyczoKKyAgICAgICAgICAgICAgICAjIE11c3QgZGVhbCB3aXRoIHBvc3NpYmxlIGxhY2sgb2YgbG9jYWxlIGluZm8KKyAgICAgICAgICAgICAgICAjIG1hbmlmZXN0aW5nIGl0c2VsZiBhcyB0aGUgZW1wdHkgc3RyaW5nIChlLmcuLCBTd2VkaXNoJ3MKKyAgICAgICAgICAgICAgICAjIGxhY2sgb2YgQU0vUE0gaW5mbykgb3IgYSBwbGF0Zm9ybSByZXR1cm5pbmcgYSB0dXBsZSBvZiBlbXB0eQorICAgICAgICAgICAgICAgICMgc3RyaW5ncyAoZS5nLiwgTWFjT1MgOSBoYXZpbmcgdGltZXpvbmUgYXMgKCcnLCcnKSkuCisgICAgICAgICAgICAgICAgaWYgb2xkOgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2Zvcm1hdCA9IGN1cnJlbnRfZm9ybWF0LnJlcGxhY2Uob2xkLCBuZXcpCisgICAgICAgICAgICAjIElmICVXIGlzIHVzZWQsIHRoZW4gU3VuZGF5LCAyMDA1LTAxLTAzIHdpbGwgZmFsbCBvbiB3ZWVrIDAgc2luY2UKKyAgICAgICAgICAgICMgMjAwNS0wMS0wMyBvY2N1cnMgYmVmb3JlIHRoZSBmaXJzdCBNb25kYXkgb2YgdGhlIHllYXIuICBPdGhlcndpc2UKKyAgICAgICAgICAgICMgJVUgaXMgdXNlZC4KKyAgICAgICAgICAgIHRpbWVfdHVwbGUgPSB0aW1lLnN0cnVjdF90aW1lKCgxOTk5LDEsMywxLDEsMSw2LDMsMCkpCisgICAgICAgICAgICBpZiAnMDAnIGluIHRpbWUuc3RyZnRpbWUoZGlyZWN0aXZlLCB0aW1lX3R1cGxlKToKKyAgICAgICAgICAgICAgICBVX1cgPSAnJVcnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFVfVyA9ICclVScKKyAgICAgICAgICAgIGRhdGVfdGltZVtvZmZzZXRdID0gY3VycmVudF9mb3JtYXQucmVwbGFjZSgnMTEnLCBVX1cpCisgICAgICAgIHNlbGYuTENfZGF0ZV90aW1lID0gZGF0ZV90aW1lWzBdCisgICAgICAgIHNlbGYuTENfZGF0ZSA9IGRhdGVfdGltZVsxXQorICAgICAgICBzZWxmLkxDX3RpbWUgPSBkYXRlX3RpbWVbMl0KKworICAgIGRlZiBfX2NhbGNfdGltZXpvbmUoc2VsZik6CisgICAgICAgICMgU2V0IHNlbGYudGltZXpvbmUgYnkgdXNpbmcgdGltZS50em5hbWUuCisgICAgICAgICMgRG8gbm90IHdvcnJ5IGFib3V0IHBvc3NpYmlsaXR5IG9mIHRpbWUudHpuYW1lWzBdID09IHRpbWV0em5hbWVbMV0KKyAgICAgICAgIyBhbmQgdGltZS5kYXlsaWdodDsgaGFuZGxlIHRoYXQgaW4gc3RycHRpbWUgLgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0aW1lLnR6c2V0KCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBub19zYXZpbmcgPSBmcm96ZW5zZXQoWyJ1dGMiLCAiZ210IiwgdGltZS50em5hbWVbMF0ubG93ZXIoKV0pCisgICAgICAgIGlmIHRpbWUuZGF5bGlnaHQ6CisgICAgICAgICAgICBoYXNfc2F2aW5nID0gZnJvemVuc2V0KFt0aW1lLnR6bmFtZVsxXS5sb3dlcigpXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhhc19zYXZpbmcgPSBmcm96ZW5zZXQoKQorICAgICAgICBzZWxmLnRpbWV6b25lID0gKG5vX3NhdmluZywgaGFzX3NhdmluZykKKworCitjbGFzcyBUaW1lUkUoZGljdCk6CisgICAgIiIiSGFuZGxlIGNvbnZlcnNpb24gZnJvbSBmb3JtYXQgZGlyZWN0aXZlcyB0byByZWdleGVzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2FsZV90aW1lPU5vbmUpOgorICAgICAgICAiIiJDcmVhdGUga2V5cy92YWx1ZXMuCisKKyAgICAgICAgT3JkZXIgb2YgZXhlY3V0aW9uIGlzIGltcG9ydGFudCBmb3IgZGVwZW5kZW5jeSByZWFzb25zLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBsb2NhbGVfdGltZToKKyAgICAgICAgICAgIHNlbGYubG9jYWxlX3RpbWUgPSBsb2NhbGVfdGltZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sb2NhbGVfdGltZSA9IExvY2FsZVRpbWUoKQorICAgICAgICBiYXNlID0gc3VwZXIoVGltZVJFLCBzZWxmKQorICAgICAgICBiYXNlLl9faW5pdF9fKHsKKyAgICAgICAgICAgICMgVGhlICIgXGQiIHBhcnQgb2YgdGhlIHJlZ2V4IGlzIHRvIG1ha2UgJWMgZnJvbSBBTlNJIEMgd29yaworICAgICAgICAgICAgJ2QnOiByIig/UDxkPjNbMC0xXXxbMS0yXVxkfDBbMS05XXxbMS05XXwgWzEtOV0pIiwKKyAgICAgICAgICAgICdmJzogciIoP1A8Zj5bMC05XXsxLDZ9KSIsCisgICAgICAgICAgICAnSCc6IHIiKD9QPEg+MlswLTNdfFswLTFdXGR8XGQpIiwKKyAgICAgICAgICAgICdJJzogciIoP1A8ST4xWzAtMl18MFsxLTldfFsxLTldKSIsCisgICAgICAgICAgICAnaic6IHIiKD9QPGo+MzZbMC02XXwzWzAtNV1cZHxbMS0yXVxkXGR8MFsxLTldXGR8MDBbMS05XXxbMS05XVxkfDBbMS05XXxbMS05XSkiLAorICAgICAgICAgICAgJ20nOiByIig/UDxtPjFbMC0yXXwwWzEtOV18WzEtOV0pIiwKKyAgICAgICAgICAgICdNJzogciIoP1A8TT5bMC01XVxkfFxkKSIsCisgICAgICAgICAgICAnUyc6IHIiKD9QPFM+NlswLTFdfFswLTVdXGR8XGQpIiwKKyAgICAgICAgICAgICdVJzogciIoP1A8VT41WzAtM118WzAtNF1cZHxcZCkiLAorICAgICAgICAgICAgJ3cnOiByIig/UDx3PlswLTZdKSIsCisgICAgICAgICAgICAjIFcgaXMgc2V0IGJlbG93IGJ5IHVzaW5nICdVJworICAgICAgICAgICAgJ3knOiByIig/UDx5PlxkXGQpIiwKKyAgICAgICAgICAgICNYWFg6IERvZXMgJ1knIG5lZWQgdG8gd29ycnkgYWJvdXQgaGF2aW5nIGxlc3Mgb3IgbW9yZSB0aGFuCisgICAgICAgICAgICAjICAgICA0IGRpZ2l0cz8KKyAgICAgICAgICAgICdZJzogciIoP1A8WT5cZFxkXGRcZCkiLAorICAgICAgICAgICAgJ0EnOiBzZWxmLl9fc2VxVG9SRShzZWxmLmxvY2FsZV90aW1lLmZfd2Vla2RheSwgJ0EnKSwKKyAgICAgICAgICAgICdhJzogc2VsZi5fX3NlcVRvUkUoc2VsZi5sb2NhbGVfdGltZS5hX3dlZWtkYXksICdhJyksCisgICAgICAgICAgICAnQic6IHNlbGYuX19zZXFUb1JFKHNlbGYubG9jYWxlX3RpbWUuZl9tb250aFsxOl0sICdCJyksCisgICAgICAgICAgICAnYic6IHNlbGYuX19zZXFUb1JFKHNlbGYubG9jYWxlX3RpbWUuYV9tb250aFsxOl0sICdiJyksCisgICAgICAgICAgICAncCc6IHNlbGYuX19zZXFUb1JFKHNlbGYubG9jYWxlX3RpbWUuYW1fcG0sICdwJyksCisgICAgICAgICAgICAnWic6IHNlbGYuX19zZXFUb1JFKCh0eiBmb3IgdHpfbmFtZXMgaW4gc2VsZi5sb2NhbGVfdGltZS50aW1lem9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0eiBpbiB0el9uYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdaJyksCisgICAgICAgICAgICAnJSc6ICclJ30pCisgICAgICAgIGJhc2UuX19zZXRpdGVtX18oJ1cnLCBiYXNlLl9fZ2V0aXRlbV9fKCdVJykucmVwbGFjZSgnVScsICdXJykpCisgICAgICAgIGJhc2UuX19zZXRpdGVtX18oJ2MnLCBzZWxmLnBhdHRlcm4oc2VsZi5sb2NhbGVfdGltZS5MQ19kYXRlX3RpbWUpKQorICAgICAgICBiYXNlLl9fc2V0aXRlbV9fKCd4Jywgc2VsZi5wYXR0ZXJuKHNlbGYubG9jYWxlX3RpbWUuTENfZGF0ZSkpCisgICAgICAgIGJhc2UuX19zZXRpdGVtX18oJ1gnLCBzZWxmLnBhdHRlcm4oc2VsZi5sb2NhbGVfdGltZS5MQ190aW1lKSkKKworICAgIGRlZiBfX3NlcVRvUkUoc2VsZiwgdG9fY29udmVydCwgZGlyZWN0aXZlKToKKyAgICAgICAgIiIiQ29udmVydCBhIGxpc3QgdG8gYSByZWdleCBzdHJpbmcgZm9yIG1hdGNoaW5nIGEgZGlyZWN0aXZlLgorCisgICAgICAgIFdhbnQgcG9zc2libGUgbWF0Y2hpbmcgdmFsdWVzIHRvIGJlIGZyb20gbG9uZ2VzdCB0byBzaG9ydGVzdC4gIFRoaXMKKyAgICAgICAgcHJldmVudHMgdGhlIHBvc3NpYmlsaXR5IG9mIGEgbWF0Y2ggb2NjdXJpbmcgZm9yIGEgdmFsdWUgdGhhdCBhbHNvCisgICAgICAgIGEgc3Vic3RyaW5nIG9mIGEgbGFyZ2VyIHZhbHVlIHRoYXQgc2hvdWxkIGhhdmUgbWF0Y2hlZCAoZS5nLiwgJ2FiYycKKyAgICAgICAgbWF0Y2hpbmcgd2hlbiAnYWJjZGVmJyBzaG91bGQgaGF2ZSBiZWVuIHRoZSBtYXRjaCkuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRvX2NvbnZlcnQgPSBzb3J0ZWQodG9fY29udmVydCwga2V5PWxlbiwgcmV2ZXJzZT1UcnVlKQorICAgICAgICBmb3IgdmFsdWUgaW4gdG9fY29udmVydDoKKyAgICAgICAgICAgIGlmIHZhbHVlICE9ICcnOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJycKKyAgICAgICAgcmVnZXggPSAnfCcuam9pbihyZV9lc2NhcGUoc3R1ZmYpIGZvciBzdHVmZiBpbiB0b19jb252ZXJ0KQorICAgICAgICByZWdleCA9ICcoP1A8JXM+JXMnICUgKGRpcmVjdGl2ZSwgcmVnZXgpCisgICAgICAgIHJldHVybiAnJXMpJyAlIHJlZ2V4CisKKyAgICBkZWYgcGF0dGVybihzZWxmLCBmb3JtYXQpOgorICAgICAgICAiIiJSZXR1cm4gcmVnZXggcGF0dGVybiBmb3IgdGhlIGZvcm1hdCBzdHJpbmcuCisKKyAgICAgICAgTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhbnkgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGJlIGludGVycHJldGVkIGFzCisgICAgICAgIHJlZ2V4IHN5bnRheCBhcmUgZXNjYXBlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgcHJvY2Vzc2VkX2Zvcm1hdCA9ICcnCisgICAgICAgICMgVGhlIHN1YigpIGNhbGwgZXNjYXBlcyBhbGwgY2hhcmFjdGVycyB0aGF0IG1pZ2h0IGJlIG1pc2NvbnN0cnVlZAorICAgICAgICAjIGFzIHJlZ2V4IHN5bnRheC4gIENhbm5vdCB1c2UgcmUuZXNjYXBlIHNpbmNlIHdlIGhhdmUgdG8gZGVhbCB3aXRoCisgICAgICAgICMgZm9ybWF0IGRpcmVjdGl2ZXMgKCVtLCBldGMuKS4KKyAgICAgICAgcmVnZXhfY2hhcnMgPSByZV9jb21waWxlKHIiKFtcXC5eJCorP1woXCl7fVxbXF18XSkiKQorICAgICAgICBmb3JtYXQgPSByZWdleF9jaGFycy5zdWIociJcXFwxIiwgZm9ybWF0KQorICAgICAgICB3aGl0ZXNwYWNlX3JlcGxhY2VtZW50ID0gcmVfY29tcGlsZSgnXHMrJykKKyAgICAgICAgZm9ybWF0ID0gd2hpdGVzcGFjZV9yZXBsYWNlbWVudC5zdWIoJ1xzKycsIGZvcm1hdCkKKyAgICAgICAgd2hpbGUgJyUnIGluIGZvcm1hdDoKKyAgICAgICAgICAgIGRpcmVjdGl2ZV9pbmRleCA9IGZvcm1hdC5pbmRleCgnJScpKzEKKyAgICAgICAgICAgIHByb2Nlc3NlZF9mb3JtYXQgPSAiJXMlcyVzIiAlIChwcm9jZXNzZWRfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdFs6ZGlyZWN0aXZlX2luZGV4LTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZbZm9ybWF0W2RpcmVjdGl2ZV9pbmRleF1dKQorICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0W2RpcmVjdGl2ZV9pbmRleCsxOl0KKyAgICAgICAgcmV0dXJuICIlcyVzIiAlIChwcm9jZXNzZWRfZm9ybWF0LCBmb3JtYXQpCisKKyAgICBkZWYgY29tcGlsZShzZWxmLCBmb3JtYXQpOgorICAgICAgICAiIiJSZXR1cm4gYSBjb21waWxlZCByZSBvYmplY3QgZm9yIHRoZSBmb3JtYXQgc3RyaW5nLiIiIgorICAgICAgICByZXR1cm4gcmVfY29tcGlsZShzZWxmLnBhdHRlcm4oZm9ybWF0KSwgSUdOT1JFQ0FTRSkKKworX2NhY2hlX2xvY2sgPSBfdGhyZWFkX2FsbG9jYXRlX2xvY2soKQorIyBETyBOT1QgbW9kaWZ5IF9UaW1lUkVfY2FjaGUgb3IgX3JlZ2V4X2NhY2hlIHdpdGhvdXQgYWNxdWlyaW5nIHRoZSBjYWNoZSBsb2NrCisjIGZpcnN0IQorX1RpbWVSRV9jYWNoZSA9IFRpbWVSRSgpCitfQ0FDSEVfTUFYX1NJWkUgPSA1ICMgTWF4IG51bWJlciBvZiByZWdleGVzIHN0b3JlZCBpbiBfcmVnZXhfY2FjaGUKK19yZWdleF9jYWNoZSA9IHt9CisKK2RlZiBfY2FsY19qdWxpYW5fZnJvbV9VX29yX1coeWVhciwgd2Vla19vZl95ZWFyLCBkYXlfb2Zfd2Vlaywgd2Vla19zdGFydHNfTW9uKToKKyAgICAiIiJDYWxjdWxhdGUgdGhlIEp1bGlhbiBkYXkgYmFzZWQgb24gdGhlIHllYXIsIHdlZWsgb2YgdGhlIHllYXIsIGFuZCBkYXkgb2YKKyAgICB0aGUgd2Vlaywgd2l0aCB3ZWVrX3N0YXJ0X2RheSByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgd2VlayBvZiB0aGUgeWVhcgorICAgIGFzc3VtZXMgdGhlIHdlZWsgc3RhcnRzIG9uIFN1bmRheSBvciBNb25kYXkgKDYgb3IgMCkuIiIiCisgICAgZmlyc3Rfd2Vla2RheSA9IGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkud2Vla2RheSgpCisgICAgIyBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIHRoZSAlVSBkaXJlY3RpdmUgKHdlZWsgc3RhcnRzIG9uIFN1bmRheSksIGl0J3MKKyAgICAjIGVhc2llciB0byBqdXN0IHNoaWZ0IHRoZSB2aWV3IHRvIFN1bmRheSBiZWluZyB0aGUgZmlyc3QgZGF5IG9mIHRoZQorICAgICMgd2Vlay4KKyAgICBpZiBub3Qgd2Vla19zdGFydHNfTW9uOgorICAgICAgICBmaXJzdF93ZWVrZGF5ID0gKGZpcnN0X3dlZWtkYXkgKyAxKSAlIDcKKyAgICAgICAgZGF5X29mX3dlZWsgPSAoZGF5X29mX3dlZWsgKyAxKSAlIDcKKyAgICAjIE5lZWQgdG8gd2F0Y2ggb3V0IGZvciBhIHdlZWsgMCAod2hlbiB0aGUgZmlyc3QgZGF5IG9mIHRoZSB5ZWFyIGlzIG5vdAorICAgICMgdGhlIHNhbWUgYXMgdGhhdCBzcGVjaWZpZWQgYnkgJVUgb3IgJVcpLgorICAgIHdlZWtfMF9sZW5ndGggPSAoNyAtIGZpcnN0X3dlZWtkYXkpICUgNworICAgIGlmIHdlZWtfb2ZfeWVhciA9PSAwOgorICAgICAgICByZXR1cm4gMSArIGRheV9vZl93ZWVrIC0gZmlyc3Rfd2Vla2RheQorICAgIGVsc2U6CisgICAgICAgIGRheXNfdG9fd2VlayA9IHdlZWtfMF9sZW5ndGggKyAoNyAqICh3ZWVrX29mX3llYXIgLSAxKSkKKyAgICAgICAgcmV0dXJuIDEgKyBkYXlzX3RvX3dlZWsgKyBkYXlfb2Zfd2VlaworCisKK2RlZiBfc3RycHRpbWUoZGF0YV9zdHJpbmcsIGZvcm1hdD0iJWEgJWIgJWQgJUg6JU06JVMgJVkiKToKKyAgICAiIiJSZXR1cm4gYSB0aW1lIHN0cnVjdCBiYXNlZCBvbiB0aGUgaW5wdXQgc3RyaW5nIGFuZCB0aGUgZm9ybWF0IHN0cmluZy4iIiIKKyAgICBnbG9iYWwgX1RpbWVSRV9jYWNoZSwgX3JlZ2V4X2NhY2hlCisgICAgd2l0aCBfY2FjaGVfbG9jazoKKyAgICAgICAgaWYgX2dldGxhbmcoKSAhPSBfVGltZVJFX2NhY2hlLmxvY2FsZV90aW1lLmxhbmc6CisgICAgICAgICAgICBfVGltZVJFX2NhY2hlID0gVGltZVJFKCkKKyAgICAgICAgICAgIF9yZWdleF9jYWNoZS5jbGVhcigpCisgICAgICAgIGlmIGxlbihfcmVnZXhfY2FjaGUpID4gX0NBQ0hFX01BWF9TSVpFOgorICAgICAgICAgICAgX3JlZ2V4X2NhY2hlLmNsZWFyKCkKKyAgICAgICAgbG9jYWxlX3RpbWUgPSBfVGltZVJFX2NhY2hlLmxvY2FsZV90aW1lCisgICAgICAgIGZvcm1hdF9yZWdleCA9IF9yZWdleF9jYWNoZS5nZXQoZm9ybWF0KQorICAgICAgICBpZiBub3QgZm9ybWF0X3JlZ2V4OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZvcm1hdF9yZWdleCA9IF9UaW1lUkVfY2FjaGUuY29tcGlsZShmb3JtYXQpCisgICAgICAgICAgICAjIEtleUVycm9yIHJhaXNlZCB3aGVuIGEgYmFkIGZvcm1hdCBpcyBmb3VuZDsgY2FuIGJlIHNwZWNpZmllZCBhcworICAgICAgICAgICAgIyBcXCwgaW4gd2hpY2ggY2FzZSBpdCB3YXMgYSBzdHJheSAlIGJ1dCB3aXRoIGEgc3BhY2UgYWZ0ZXIgaXQKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIGJhZF9kaXJlY3RpdmUgPSBlcnIuYXJnc1swXQorICAgICAgICAgICAgICAgIGlmIGJhZF9kaXJlY3RpdmUgPT0gIlxcIjoKKyAgICAgICAgICAgICAgICAgICAgYmFkX2RpcmVjdGl2ZSA9ICIlIgorICAgICAgICAgICAgICAgIGRlbCBlcnIKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCInJXMnIGlzIGEgYmFkIGRpcmVjdGl2ZSBpbiBmb3JtYXQgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhZF9kaXJlY3RpdmUsIGZvcm1hdCkpCisgICAgICAgICAgICAjIEluZGV4RXJyb3Igb25seSBvY2N1cnMgd2hlbiB0aGUgZm9ybWF0IHN0cmluZyBpcyAiJSIKKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInN0cmF5ICUlIGluIGZvcm1hdCAnJXMnIiAlIGZvcm1hdCkKKyAgICAgICAgICAgIF9yZWdleF9jYWNoZVtmb3JtYXRdID0gZm9ybWF0X3JlZ2V4CisgICAgZm91bmQgPSBmb3JtYXRfcmVnZXgubWF0Y2goZGF0YV9zdHJpbmcpCisgICAgaWYgbm90IGZvdW5kOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ0aW1lIGRhdGEgJXIgZG9lcyBub3QgbWF0Y2ggZm9ybWF0ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGFfc3RyaW5nLCBmb3JtYXQpKQorICAgIGlmIGxlbihkYXRhX3N0cmluZykgIT0gZm91bmQuZW5kKCk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuY29udmVydGVkIGRhdGEgcmVtYWluczogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zdHJpbmdbZm91bmQuZW5kKCk6XSkKKworICAgIHllYXIgPSBOb25lCisgICAgbW9udGggPSBkYXkgPSAxCisgICAgaG91ciA9IG1pbnV0ZSA9IHNlY29uZCA9IGZyYWN0aW9uID0gMAorICAgIHR6ID0gLTEKKyAgICAjIERlZmF1bHQgdG8gLTEgdG8gc2lnbmlmeSB0aGF0IHZhbHVlcyBub3Qga25vd247IG5vdCBjcml0aWNhbCB0byBoYXZlLAorICAgICMgdGhvdWdoCisgICAgd2Vla19vZl95ZWFyID0gLTEKKyAgICB3ZWVrX29mX3llYXJfc3RhcnQgPSAtMQorICAgICMgd2Vla2RheSBhbmQganVsaWFuIGRlZmF1bHRlZCB0byAtMSBzbyBhcyB0byBzaWduYWwgbmVlZCB0byBjYWxjdWxhdGUKKyAgICAjIHZhbHVlcworICAgIHdlZWtkYXkgPSBqdWxpYW4gPSAtMQorICAgIGZvdW5kX2RpY3QgPSBmb3VuZC5ncm91cGRpY3QoKQorICAgIGZvciBncm91cF9rZXkgaW4gZm91bmRfZGljdC5pdGVya2V5cygpOgorICAgICAgICAjIERpcmVjdGl2ZXMgbm90IGV4cGxpY2l0bHkgaGFuZGxlZCBiZWxvdzoKKyAgICAgICAgIyAgIGMsIHgsIFgKKyAgICAgICAgIyAgICAgIGhhbmRsZWQgYnkgbWFraW5nIG91dCBvZiBvdGhlciBkaXJlY3RpdmVzCisgICAgICAgICMgICBVLCBXCisgICAgICAgICMgICAgICB3b3J0aGxlc3Mgd2l0aG91dCBkYXkgb2YgdGhlIHdlZWsKKyAgICAgICAgaWYgZ3JvdXBfa2V5ID09ICd5JzoKKyAgICAgICAgICAgIHllYXIgPSBpbnQoZm91bmRfZGljdFsneSddKQorICAgICAgICAgICAgIyBPcGVuIEdyb3VwIHNwZWNpZmljYXRpb24gZm9yIHN0cnB0aW1lKCkgc3RhdGVzIHRoYXQgYSAleQorICAgICAgICAgICAgI3ZhbHVlIGluIHRoZSByYW5nZSBvZiBbMDAsIDY4XSBpcyBpbiB0aGUgY2VudHVyeSAyMDAwLCB3aGlsZQorICAgICAgICAgICAgI1s2OSw5OV0gaXMgaW4gdGhlIGNlbnR1cnkgMTkwMAorICAgICAgICAgICAgaWYgeWVhciA8PSA2ODoKKyAgICAgICAgICAgICAgICB5ZWFyICs9IDIwMDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWVhciArPSAxOTAwCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdZJzoKKyAgICAgICAgICAgIHllYXIgPSBpbnQoZm91bmRfZGljdFsnWSddKQorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnbSc6CisgICAgICAgICAgICBtb250aCA9IGludChmb3VuZF9kaWN0WydtJ10pCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdCJzoKKyAgICAgICAgICAgIG1vbnRoID0gbG9jYWxlX3RpbWUuZl9tb250aC5pbmRleChmb3VuZF9kaWN0WydCJ10ubG93ZXIoKSkKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ2InOgorICAgICAgICAgICAgbW9udGggPSBsb2NhbGVfdGltZS5hX21vbnRoLmluZGV4KGZvdW5kX2RpY3RbJ2InXS5sb3dlcigpKQorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnZCc6CisgICAgICAgICAgICBkYXkgPSBpbnQoZm91bmRfZGljdFsnZCddKQorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnSCc6CisgICAgICAgICAgICBob3VyID0gaW50KGZvdW5kX2RpY3RbJ0gnXSkKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ0knOgorICAgICAgICAgICAgaG91ciA9IGludChmb3VuZF9kaWN0WydJJ10pCisgICAgICAgICAgICBhbXBtID0gZm91bmRfZGljdC5nZXQoJ3AnLCAnJykubG93ZXIoKQorICAgICAgICAgICAgIyBJZiB0aGVyZSB3YXMgbm8gQU0vUE0gaW5kaWNhdG9yLCB3ZSdsbCB0cmVhdCB0aGlzIGxpa2UgQU0KKyAgICAgICAgICAgIGlmIGFtcG0gaW4gKCcnLCBsb2NhbGVfdGltZS5hbV9wbVswXSk6CisgICAgICAgICAgICAgICAgIyBXZSdyZSBpbiBBTSBzbyB0aGUgaG91ciBpcyBjb3JyZWN0IHVubGVzcyB3ZSdyZQorICAgICAgICAgICAgICAgICMgbG9va2luZyBhdCAxMiBtaWRuaWdodC4KKyAgICAgICAgICAgICAgICAjIDEyIG1pZG5pZ2h0ID09IDEyIEFNID09IGhvdXIgMAorICAgICAgICAgICAgICAgIGlmIGhvdXIgPT0gMTI6CisgICAgICAgICAgICAgICAgICAgIGhvdXIgPSAwCisgICAgICAgICAgICBlbGlmIGFtcG0gPT0gbG9jYWxlX3RpbWUuYW1fcG1bMV06CisgICAgICAgICAgICAgICAgIyBXZSdyZSBpbiBQTSBzbyB3ZSBuZWVkIHRvIGFkZCAxMiB0byB0aGUgaG91ciB1bmxlc3MKKyAgICAgICAgICAgICAgICAjIHdlJ3JlIGxvb2tpbmcgYXQgMTIgbm9vbi4KKyAgICAgICAgICAgICAgICAjIDEyIG5vb24gPT0gMTIgUE0gPT0gaG91ciAxMgorICAgICAgICAgICAgICAgIGlmIGhvdXIgIT0gMTI6CisgICAgICAgICAgICAgICAgICAgIGhvdXIgKz0gMTIKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ00nOgorICAgICAgICAgICAgbWludXRlID0gaW50KGZvdW5kX2RpY3RbJ00nXSkKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ1MnOgorICAgICAgICAgICAgc2Vjb25kID0gaW50KGZvdW5kX2RpY3RbJ1MnXSkKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ2YnOgorICAgICAgICAgICAgcyA9IGZvdW5kX2RpY3RbJ2YnXQorICAgICAgICAgICAgIyBQYWQgdG8gYWx3YXlzIHJldHVybiBtaWNyb3NlY29uZHMuCisgICAgICAgICAgICBzICs9ICIwIiAqICg2IC0gbGVuKHMpKQorICAgICAgICAgICAgZnJhY3Rpb24gPSBpbnQocykKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ0EnOgorICAgICAgICAgICAgd2Vla2RheSA9IGxvY2FsZV90aW1lLmZfd2Vla2RheS5pbmRleChmb3VuZF9kaWN0WydBJ10ubG93ZXIoKSkKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ2EnOgorICAgICAgICAgICAgd2Vla2RheSA9IGxvY2FsZV90aW1lLmFfd2Vla2RheS5pbmRleChmb3VuZF9kaWN0WydhJ10ubG93ZXIoKSkKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ3cnOgorICAgICAgICAgICAgd2Vla2RheSA9IGludChmb3VuZF9kaWN0Wyd3J10pCisgICAgICAgICAgICBpZiB3ZWVrZGF5ID09IDA6CisgICAgICAgICAgICAgICAgd2Vla2RheSA9IDYKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd2Vla2RheSAtPSAxCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdqJzoKKyAgICAgICAgICAgIGp1bGlhbiA9IGludChmb3VuZF9kaWN0WydqJ10pCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5IGluICgnVScsICdXJyk6CisgICAgICAgICAgICB3ZWVrX29mX3llYXIgPSBpbnQoZm91bmRfZGljdFtncm91cF9rZXldKQorICAgICAgICAgICAgaWYgZ3JvdXBfa2V5ID09ICdVJzoKKyAgICAgICAgICAgICAgICAjIFUgc3RhcnRzIHdlZWsgb24gU3VuZGF5LgorICAgICAgICAgICAgICAgIHdlZWtfb2ZfeWVhcl9zdGFydCA9IDYKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBXIHN0YXJ0cyB3ZWVrIG9uIE1vbmRheS4KKyAgICAgICAgICAgICAgICB3ZWVrX29mX3llYXJfc3RhcnQgPSAwCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdaJzoKKyAgICAgICAgICAgICMgU2luY2UgLTEgaXMgZGVmYXVsdCB2YWx1ZSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgc2V0dGluZyB0eiBpZgorICAgICAgICAgICAgIyBpdCBjYW4gYmUgc29tZXRoaW5nIG90aGVyIHRoYW4gLTEuCisgICAgICAgICAgICBmb3VuZF96b25lID0gZm91bmRfZGljdFsnWiddLmxvd2VyKCkKKyAgICAgICAgICAgIGZvciB2YWx1ZSwgdHpfdmFsdWVzIGluIGVudW1lcmF0ZShsb2NhbGVfdGltZS50aW1lem9uZSk6CisgICAgICAgICAgICAgICAgaWYgZm91bmRfem9uZSBpbiB0el92YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgICMgRGVhbCB3aXRoIGJhZCBsb2NhbGUgc2V0dXAgd2hlcmUgdGltZXpvbmUgbmFtZXMgYXJlIHRoZQorICAgICAgICAgICAgICAgICAgICAjIHNhbWUgYW5kIHlldCB0aW1lLmRheWxpZ2h0IGlzIHRydWU7IHRvbyBhbWJpZ3VvdXMgdG8KKyAgICAgICAgICAgICAgICAgICAgIyBiZSBhYmxlIHRvIHRlbGwgd2hhdCB0aW1lem9uZSBoYXMgZGF5bGlnaHQgc2F2aW5ncworICAgICAgICAgICAgICAgICAgICBpZiAodGltZS50em5hbWVbMF0gPT0gdGltZS50em5hbWVbMV0gYW5kCisgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuZGF5bGlnaHQgYW5kIGZvdW5kX3pvbmUgbm90IGluICgidXRjIiwgImdtdCIpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0eiA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgIGxlYXBfeWVhcl9maXggPSBGYWxzZQorICAgIGlmIHllYXIgaXMgTm9uZSBhbmQgbW9udGggPT0gMiBhbmQgZGF5ID09IDI5OgorICAgICAgICB5ZWFyID0gMTkwNCAgIyAxOTA0IGlzIGZpcnN0IGxlYXAgeWVhciBvZiAyMHRoIGNlbnR1cnkKKyAgICAgICAgbGVhcF95ZWFyX2ZpeCA9IFRydWUKKyAgICBlbGlmIHllYXIgaXMgTm9uZToKKyAgICAgICAgeWVhciA9IDE5MDAKKyAgICAjIElmIHdlIGtub3cgdGhlIHdlZWsgb2YgdGhlIHllYXIgYW5kIHdoYXQgZGF5IG9mIHRoYXQgd2Vlaywgd2UgY2FuIGZpZ3VyZQorICAgICMgb3V0IHRoZSBKdWxpYW4gZGF5IG9mIHRoZSB5ZWFyLgorICAgIGlmIGp1bGlhbiA9PSAtMSBhbmQgd2Vla19vZl95ZWFyICE9IC0xIGFuZCB3ZWVrZGF5ICE9IC0xOgorICAgICAgICB3ZWVrX3N0YXJ0c19Nb24gPSBUcnVlIGlmIHdlZWtfb2ZfeWVhcl9zdGFydCA9PSAwIGVsc2UgRmFsc2UKKyAgICAgICAganVsaWFuID0gX2NhbGNfanVsaWFuX2Zyb21fVV9vcl9XKHllYXIsIHdlZWtfb2ZfeWVhciwgd2Vla2RheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla19zdGFydHNfTW9uKQorICAgICMgQ2Fubm90IHByZS1jYWxjdWxhdGUgZGF0ZXRpbWVfZGF0ZSgpIHNpbmNlIGNhbiBjaGFuZ2UgaW4gSnVsaWFuCisgICAgIyBjYWxjdWxhdGlvbiBhbmQgdGh1cyBjb3VsZCBoYXZlIGRpZmZlcmVudCB2YWx1ZSBmb3IgdGhlIGRheSBvZiB0aGUgd2VlaworICAgICMgY2FsY3VsYXRpb24uCisgICAgaWYganVsaWFuID09IC0xOgorICAgICAgICAjIE5lZWQgdG8gYWRkIDEgdG8gcmVzdWx0IHNpbmNlIGZpcnN0IGRheSBvZiB0aGUgeWVhciBpcyAxLCBub3QgMC4KKyAgICAgICAganVsaWFuID0gZGF0ZXRpbWVfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KS50b29yZGluYWwoKSAtIFwKKyAgICAgICAgICAgICAgICAgIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkgKyAxCisgICAgZWxzZTogICMgQXNzdW1lIHRoYXQgaWYgdGhleSBib3RoZXJlZCB0byBpbmNsdWRlIEp1bGlhbiBkYXkgaXQgd2lsbAorICAgICAgICAgICAjIGJlIGFjY3VyYXRlLgorICAgICAgICBkYXRldGltZV9yZXN1bHQgPSBkYXRldGltZV9kYXRlLmZyb21vcmRpbmFsKChqdWxpYW4gLSAxKSArIGRhdGV0aW1lX2RhdGUoeWVhciwgMSwgMSkudG9vcmRpbmFsKCkpCisgICAgICAgIHllYXIgPSBkYXRldGltZV9yZXN1bHQueWVhcgorICAgICAgICBtb250aCA9IGRhdGV0aW1lX3Jlc3VsdC5tb250aAorICAgICAgICBkYXkgPSBkYXRldGltZV9yZXN1bHQuZGF5CisgICAgaWYgd2Vla2RheSA9PSAtMToKKyAgICAgICAgd2Vla2RheSA9IGRhdGV0aW1lX2RhdGUoeWVhciwgbW9udGgsIGRheSkud2Vla2RheSgpCisgICAgaWYgbGVhcF95ZWFyX2ZpeDoKKyAgICAgICAgIyB0aGUgY2FsbGVyIGRpZG4ndCBzdXBwbHkgYSB5ZWFyIGJ1dCBhc2tlZCBmb3IgRmViIDI5dGguIFdlIGNvdWxkbid0CisgICAgICAgICMgdXNlIHRoZSBkZWZhdWx0IG9mIDE5MDAgZm9yIGNvbXB1dGF0aW9ucy4gV2Ugc2V0IGl0IGJhY2sgdG8gZW5zdXJlCisgICAgICAgICMgdGhhdCBGZWJydWFyeSAyOXRoIGlzIHNtYWxsZXIgdGhhbiBNYXJjaCAxc3QuCisgICAgICAgIHllYXIgPSAxOTAwCisKKyAgICByZXR1cm4gKHRpbWUuc3RydWN0X3RpbWUoKHllYXIsIG1vbnRoLCBkYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtkYXksIGp1bGlhbiwgdHopKSwgZnJhY3Rpb24pCisKK2RlZiBfc3RycHRpbWVfdGltZShkYXRhX3N0cmluZywgZm9ybWF0PSIlYSAlYiAlZCAlSDolTTolUyAlWSIpOgorICAgIHJldHVybiBfc3RycHRpbWUoZGF0YV9zdHJpbmcsIGZvcm1hdClbMF0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX3N0cnB0aW1lLnB5YyBiL2xpYi9weXRob24yLjcvX3N0cnB0aW1lLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGY4MzM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fc3RycHRpbWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX3N0cnB0aW1lLnB5byBiL2xpYi9weXRob24yLjcvX3N0cnB0aW1lLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGY4MzM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fc3RycHRpbWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX3N5c2NvbmZpZ2RhdGEucHkgYi9saWIvcHl0aG9uMi43L19zeXNjb25maWdkYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjVjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19zeXNjb25maWdkYXRhLnB5CkBAIC0wLDAgKzEsNTMyIEBACisjIHN5c3RlbSBjb25maWd1cmF0aW9uIGdlbmVyYXRlZCBhbmQgdXNlZCBieSB0aGUgc3lzY29uZmlnIG1vZHVsZQorYnVpbGRfdGltZV92YXJzID0geydBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQnOiAwLAorICdBSVhfR0VOVUlORV9DUExVU1BMVVMnOiAwLAorICdBUic6ICd4ODZfNjQtYXBwbGUtZGFyd2luLWFyJywKKyAnQVJGTEFHUyc6ICdyYycsCisgJ0FTRExHRU4nOiAnL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNS9QYXJzZXIvYXNkbF9jLnB5JywKKyAnQVNETEdFTl9GSUxFUyc6ICcvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41L1BhcnNlci9hc2RsLnB5IC9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUvUGFyc2VyL2FzZGxfYy5weScsCisgJ0FTVF9BU0RMJzogJy9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUvUGFyc2VyL1B5dGhvbi5hc2RsJywKKyAnQVNUX0MnOiAnUHl0aG9uL1B5dGhvbi1hc3QuYycsCisgJ0FTVF9DX0RJUic6ICdQeXRob24nLAorICdBU1RfSCc6ICdJbmNsdWRlL1B5dGhvbi1hc3QuaCcsCisgJ0FTVF9IX0RJUic6ICdJbmNsdWRlJywKKyAnQVRIRU9TX1RIUkVBRFMnOiAwLAorICdCQVNFQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nJywKKyAnQkFTRU1PRExJQlMnOiAnJywKKyAnQkVPU19USFJFQURTJzogMCwKKyAnQklORElSJzogJy90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NC9iaW4nLAorICdCSU5MSUJERVNUJzogJy90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NC9saWIvcHl0aG9uMi43JywKKyAnQkxETElCUkFSWSc6ICdsaWJweXRob24yLjcuYScsCisgJ0JMRFNIQVJFRCc6ICd4ODZfNjQtYXBwbGUtZGFyd2luLWdjYyAtYnVuZGxlIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAnLAorICdCVUlMREVYRSc6ICcnLAorICdCVUlMRFBZVEhPTic6ICdweXRob24nLAorICdDQyc6ICd4ODZfNjQtYXBwbGUtZGFyd2luLWdjYycsCisgJ0NDU0hBUkVEJzogJycsCisgJ0NGTEFHUyc6ICctZm5vLXN0cmljdC1hbGlhc2luZyAtTzIgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1zIC1ETkRFQlVHIC1nIC1md3JhcHYgLU8zIC1XYWxsIC1Xc3RyaWN0LXByb3RvdHlwZXMnLAorICdDRkxBR1NGT1JTSEFSRUQnOiAnJywKKyAnQ09ORklHRklMRVMnOiAnY29uZmlndXJlIGNvbmZpZ3VyZS5hYyBhY2NvbmZpZy5oIHB5Y29uZmlnLmguaW4gTWFrZWZpbGUucHJlLmluJywKKyAnQ09ORklHX0FSR1MnOiAiJy0tcHJlZml4PS90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NCcgJy0tYnVpbGQ9eDg2XzY0LWFwcGxlLWRhcndpbicgJy0taG9zdD14ODZfNjQtYXBwbGUtZGFyd2luJyAnLS13aXRoLWJ1aWxkLXN5c3Jvb3QnICctLWRpc2FibGUtaXB2NicgJ2J1aWxkX2FsaWFzPXg4Nl82NC1hcHBsZS1kYXJ3aW4nICdob3N0X2FsaWFzPXg4Nl82NC1hcHBsZS1kYXJ3aW4nICdDQz14ODZfNjQtYXBwbGUtZGFyd2luLWdjYycgJ0NGTEFHUz0tTzIgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1zJyAnTERGTEFHUz0nIiwKKyAnQ09ORklOQ0xVREVESVInOiAnL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0L2luY2x1ZGUnLAorICdDT05GSU5DTFVERVBZJzogJy90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NC9pbmNsdWRlL3B5dGhvbjIuNycsCisgJ0NPUkVQWVRIT05QQVRIJzogJzpwbGF0LWRhcndpbjpwbGF0LW1hYzpwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXM6bGliLXRrOmxpYi1vbGQnLAorICdDUFBGTEFHUyc6ICctSS4gLUlJbmNsdWRlIC1JL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNS9JbmNsdWRlJywKKyAnQ1hYJzogJ3g4Nl82NC1hcHBsZS1kYXJ3aW4tZysrJywKKyAnQ19USFJFQURTJzogMCwKKyAnREVMSU0nOiAnOicsCisgJ0RFU1RESVJTJzogJy90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NCAvdG1wL25kay1Vc2VyL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2Rhcndpbi14ODZfNjQvbGliIC90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NC9saWIvcHl0aG9uMi43IC90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NC9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkJywKKyAnREVTVExJQic6ICcvdG1wL25kay1Vc2VyL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2Rhcndpbi14ODZfNjQvbGliL3B5dGhvbjIuNycsCisgJ0RFU1RQQVRIJzogJycsCisgJ0RFU1RTSEFSRUQnOiAnL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0L2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQnLAorICdESVJNT0RFJzogNzU1LAorICdESVNUJzogJ1JFQURNRSBDaGFuZ2VMb2cgY29uZmlndXJlIGNvbmZpZ3VyZS5hYyBhY2NvbmZpZy5oIHB5Y29uZmlnLmguaW4gTWFrZWZpbGUucHJlLmluIEluY2x1ZGUgTGliIE1pc2MgRGVtbyBFeHQtZHVtbXknLAorICdESVNURElSUyc6ICdJbmNsdWRlIExpYiBNaXNjIERlbW8gRXh0LWR1bW15JywKKyAnRElTVEZJTEVTJzogJ1JFQURNRSBDaGFuZ2VMb2cgY29uZmlndXJlIGNvbmZpZ3VyZS5hYyBhY2NvbmZpZy5oIHB5Y29uZmlnLmguaW4gTWFrZWZpbGUucHJlLmluJywKKyAnRExJTkNMRElSJzogJy4nLAorICdETExMSUJSQVJZJzogJycsCisgJ0RPVUJMRV9JU19BUk1fTUlYRURfRU5ESUFOX0lFRUU3NTQnOiAwLAorICdET1VCTEVfSVNfQklHX0VORElBTl9JRUVFNzU0JzogMCwKKyAnRE9VQkxFX0lTX0xJVFRMRV9FTkRJQU5fSUVFRTc1NCc6IDEsCisgJ0RZTkxPQURGSUxFJzogJ2R5bmxvYWRfc2hsaWIubycsCisgJ0VOQUJMRV9JUFY2JzogMCwKKyAnRVhFJzogJycsCisgJ0VYRU1PREUnOiA3NTUsCisgJ0VYVFJBTUFDSERFUFBBVEgnOiAnOnBsYXQtbWFjOnBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcycsCisgJ0VYVFJBUExBVERJUic6ICdwbGF0LW1hYyBwbGF0LW1hYy9DYXJib24gcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzIFxcJywKKyAnRVhUUkFURVNUT1BUUyc6ICcnLAorICdFWFRSQV9DRkxBR1MnOiAnJywKKyAnRklMRU1PREUnOiA2NDQsCisgJ0ZMT0NLX05FRURTX0xJQkJTRCc6IDAsCisgJ0dFVFBHUlBfSEFWRV9BUkcnOiAwLAorICdHRVRUSU1FT0ZEQVlfTk9fVFonOiAwLAorICdHTEhBQ0snOiAnLURjbGVhcj1fX0dMY2xlYXInLAorICdHTlVMRCc6ICdubycsCisgJ0dSQU1NQVJfQyc6ICdQeXRob24vZ3JhbWluaXQuYycsCisgJ0dSQU1NQVJfSCc6ICdJbmNsdWRlL2dyYW1pbml0LmgnLAorICdHUkFNTUFSX0lOUFVUJzogJy9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUvR3JhbW1hci9HcmFtbWFyJywKKyAnSEFWRV9BQ09TSCc6IDEsCisgJ0hBVkVfQUREUklORk8nOiAxLAorICdIQVZFX0FMQVJNJzogMSwKKyAnSEFWRV9BTFRaT05FJzogMCwKKyAnSEFWRV9BU0lOSCc6IDEsCisgJ0hBVkVfQVNNX1RZUEVTX0gnOiAwLAorICdIQVZFX0FUQU5IJzogMSwKKyAnSEFWRV9BVFRSSUJVVEVfRk9STUFUX1BBUlNFVFVQTEUnOiAwLAorICdIQVZFX0JJTkRfVEVYVERPTUFJTl9DT0RFU0VUJzogMCwKKyAnSEFWRV9CTFVFVE9PVEhfQkxVRVRPT1RIX0gnOiAwLAorICdIQVZFX0JMVUVUT09USF9IJzogMCwKKyAnSEFWRV9CUk9LRU5fTklDRSc6IDAsCisgJ0hBVkVfQlJPS0VOX1BJUEVfQlVGJzogMCwKKyAnSEFWRV9CUk9LRU5fUE9MTCc6IDAsCisgJ0hBVkVfQlJPS0VOX1BPU0lYX1NFTUFQSE9SRVMnOiAwLAorICdIQVZFX0JST0tFTl9QVEhSRUFEX1NJR01BU0snOiAwLAorICdIQVZFX0JST0tFTl9TRU1fR0VUVkFMVUUnOiAxLAorICdIQVZFX0JST0tFTl9VTlNFVEVOVic6IDAsCisgJ0hBVkVfQzk5X0JPT0wnOiAxLAorICdIQVZFX0NIRkxBR1MnOiAxLAorICdIQVZFX0NIT1dOJzogMSwKKyAnSEFWRV9DSFJPT1QnOiAxLAorICdIQVZFX0NMT0NLJzogMSwKKyAnSEFWRV9DT05GU1RSJzogMSwKKyAnSEFWRV9DT05JT19IJzogMCwKKyAnSEFWRV9DT1BZU0lHTic6IDEsCisgJ0hBVkVfQ1RFUk1JRCc6IDEsCisgJ0hBVkVfQ1RFUk1JRF9SJzogMSwKKyAnSEFWRV9DVVJTRVNfSCc6IDEsCisgJ0hBVkVfQ1VSU0VTX0lTX1RFUk1fUkVTSVpFRCc6IDEsCisgJ0hBVkVfQ1VSU0VTX1JFU0laRVRFUk0nOiAxLAorICdIQVZFX0NVUlNFU19SRVNJWkVfVEVSTSc6IDEsCisgJ0hBVkVfREVDTF9JU0ZJTklURSc6IDEsCisgJ0hBVkVfREVDTF9JU0lORic6IDEsCisgJ0hBVkVfREVDTF9JU05BTic6IDEsCisgJ0hBVkVfREVDTF9UWk5BTUUnOiAwLAorICdIQVZFX0RFVklDRV9NQUNST1MnOiAxLAorICdIQVZFX0RFVl9QVEMnOiAwLAorICdIQVZFX0RFVl9QVE1YJzogMSwKKyAnSEFWRV9ESVJFQ1RfSCc6IDAsCisgJ0hBVkVfRElSRU5UX0gnOiAxLAorICdIQVZFX0RMRkNOX0gnOiAxLAorICdIQVZFX0RMT1BFTic6IDEsCisgJ0hBVkVfRFVQMic6IDEsCisgJ0hBVkVfRFlOQU1JQ19MT0FESU5HJzogMSwKKyAnSEFWRV9FUE9MTCc6IDAsCisgJ0hBVkVfRVJGJzogMSwKKyAnSEFWRV9FUkZDJzogMSwKKyAnSEFWRV9FUlJOT19IJzogMSwKKyAnSEFWRV9FWEVDVic6IDEsCisgJ0hBVkVfRVhQTTEnOiAxLAorICdIQVZFX0ZDSERJUic6IDEsCisgJ0hBVkVfRkNITU9EJzogMSwKKyAnSEFWRV9GQ0hPV04nOiAxLAorICdIQVZFX0ZDTlRMX0gnOiAxLAorICdIQVZFX0ZEQVRBU1lOQyc6IDAsCisgJ0hBVkVfRklOSVRFJzogMSwKKyAnSEFWRV9GTE9DSyc6IDEsCisgJ0hBVkVfRk9SSyc6IDEsCisgJ0hBVkVfRk9SS1BUWSc6IDEsCisgJ0hBVkVfRlBBVEhDT05GJzogMSwKKyAnSEFWRV9GU0VFSzY0JzogMCwKKyAnSEFWRV9GU0VFS08nOiAxLAorICdIQVZFX0ZTVEFUVkZTJzogMSwKKyAnSEFWRV9GU1lOQyc6IDEsCisgJ0hBVkVfRlRFTEw2NCc6IDAsCisgJ0hBVkVfRlRFTExPJzogMSwKKyAnSEFWRV9GVElNRSc6IDEsCisgJ0hBVkVfRlRSVU5DQVRFJzogMSwKKyAnSEFWRV9HQUlfU1RSRVJST1InOiAxLAorICdIQVZFX0dBTU1BJzogMSwKKyAnSEFWRV9HQ0NfQVNNX0ZPUl9YODcnOiAxLAorICdIQVZFX0dFVEFERFJJTkZPJzogMSwKKyAnSEFWRV9HRVRDV0QnOiAxLAorICdIQVZFX0dFVENfVU5MT0NLRUQnOiAxLAorICdIQVZFX0dFVEdST1VQUyc6IDEsCisgJ0hBVkVfR0VUSE9TVEJZTkFNRSc6IDEsCisgJ0hBVkVfR0VUSE9TVEJZTkFNRV9SJzogMCwKKyAnSEFWRV9HRVRIT1NUQllOQU1FX1JfM19BUkcnOiAwLAorICdIQVZFX0dFVEhPU1RCWU5BTUVfUl81X0FSRyc6IDAsCisgJ0hBVkVfR0VUSE9TVEJZTkFNRV9SXzZfQVJHJzogMCwKKyAnSEFWRV9HRVRJVElNRVInOiAxLAorICdIQVZFX0dFVExPQURBVkcnOiAxLAorICdIQVZFX0dFVExPR0lOJzogMSwKKyAnSEFWRV9HRVROQU1FSU5GTyc6IDEsCisgJ0hBVkVfR0VUUEFHRVNJWkUnOiAxLAorICdIQVZFX0dFVFBFRVJOQU1FJzogMSwKKyAnSEFWRV9HRVRQR0lEJzogMSwKKyAnSEFWRV9HRVRQR1JQJzogMSwKKyAnSEFWRV9HRVRQSUQnOiAxLAorICdIQVZFX0dFVFBSSU9SSVRZJzogMSwKKyAnSEFWRV9HRVRQV0VOVCc6IDEsCisgJ0hBVkVfR0VUUkVTR0lEJzogMCwKKyAnSEFWRV9HRVRSRVNVSUQnOiAwLAorICdIQVZFX0dFVFNJRCc6IDEsCisgJ0hBVkVfR0VUU1BFTlQnOiAwLAorICdIQVZFX0dFVFNQTkFNJzogMCwKKyAnSEFWRV9HRVRUSU1FT0ZEQVknOiAxLAorICdIQVZFX0dFVFdEJzogMSwKKyAnSEFWRV9HUlBfSCc6IDEsCisgJ0hBVkVfSFNUUkVSUk9SJzogMSwKKyAnSEFWRV9IWVBPVCc6IDEsCisgJ0hBVkVfSUVFRUZQX0gnOiAwLAorICdIQVZFX0lORVRfQVRPTic6IDEsCisgJ0hBVkVfSU5FVF9QVE9OJzogMSwKKyAnSEFWRV9JTklUR1JPVVBTJzogMSwKKyAnSEFWRV9JTlQzMl9UJzogMSwKKyAnSEFWRV9JTlQ2NF9UJzogMSwKKyAnSEFWRV9JTlRUWVBFU19IJzogMSwKKyAnSEFWRV9JT19IJzogMCwKKyAnSEFWRV9LSUxMJzogMSwKKyAnSEFWRV9LSUxMUEcnOiAxLAorICdIQVZFX0tRVUVVRSc6IDEsCisgJ0hBVkVfTEFOR0lORk9fSCc6IDEsCisgJ0hBVkVfTEFSR0VGSUxFX1NVUFBPUlQnOiAwLAorICdIQVZFX0xDSEZMQUdTJzogMSwKKyAnSEFWRV9MQ0hNT0QnOiAxLAorICdIQVZFX0xDSE9XTic6IDEsCisgJ0hBVkVfTEdBTU1BJzogMSwKKyAnSEFWRV9MSUJETCc6IDEsCisgJ0hBVkVfTElCRExEJzogMCwKKyAnSEFWRV9MSUJJRUVFJzogMCwKKyAnSEFWRV9MSUJJTlRMX0gnOiAwLAorICdIQVZFX0xJQlJFQURMSU5FJzogMSwKKyAnSEFWRV9MSUJSRVNPTFYnOiAwLAorICdIQVZFX0xJQlVUSUxfSCc6IDAsCisgJ0hBVkVfTElOSyc6IDEsCisgJ0hBVkVfTElOVVhfTkVUTElOS19IJzogMCwKKyAnSEFWRV9MSU5VWF9USVBDX0gnOiAwLAorICdIQVZFX0xPRzFQJzogMSwKKyAnSEFWRV9MT05HX0RPVUJMRSc6IDEsCisgJ0hBVkVfTE9OR19MT05HJzogMSwKKyAnSEFWRV9MU1RBVCc6IDEsCisgJ0hBVkVfTUFLRURFVic6IDEsCisgJ0hBVkVfTUVNTU9WRSc6IDEsCisgJ0hBVkVfTUVNT1JZX0gnOiAxLAorICdIQVZFX01LRklGTyc6IDEsCisgJ0hBVkVfTUtOT0QnOiAxLAorICdIQVZFX01LVElNRSc6IDEsCisgJ0hBVkVfTVJFTUFQJzogMCwKKyAnSEFWRV9OQ1VSU0VTX0gnOiAxLAorICdIQVZFX05ESVJfSCc6IDAsCisgJ0hBVkVfTkVUUEFDS0VUX1BBQ0tFVF9IJzogMCwKKyAnSEFWRV9OSUNFJzogMSwKKyAnSEFWRV9PUEVOUFRZJzogMSwKKyAnSEFWRV9PU1gxMDVfU0RLJzogMSwKKyAnSEFWRV9QQVRIQ09ORic6IDEsCisgJ0hBVkVfUEFVU0UnOiAxLAorICdIQVZFX1BMT0NLJzogMCwKKyAnSEFWRV9QT0xMJzogMSwKKyAnSEFWRV9QT0xMX0gnOiAxLAorICdIQVZFX1BST0NFU1NfSCc6IDAsCisgJ0hBVkVfUFJPVE9UWVBFUyc6IDEsCisgJ0hBVkVfUFRIJzogMCwKKyAnSEFWRV9QVEhSRUFEX0RFU1RSVUNUT1InOiAwLAorICdIQVZFX1BUSFJFQURfSCc6IDEsCisgJ0hBVkVfUFRIUkVBRF9JTklUJzogMCwKKyAnSEFWRV9QVEhSRUFEX1NJR01BU0snOiAxLAorICdIQVZFX1BUWV9IJzogMCwKKyAnSEFWRV9QVVRFTlYnOiAxLAorICdIQVZFX1JFQURMSU5LJzogMSwKKyAnSEFWRV9SRUFMUEFUSCc6IDEsCisgJ0hBVkVfUkxfQ0FMTEJBQ0snOiAxLAorICdIQVZFX1JMX0NBVENIX1NJR05BTCc6IDAsCisgJ0hBVkVfUkxfQ09NUExFVElPTl9BUFBFTkRfQ0hBUkFDVEVSJzogMSwKKyAnSEFWRV9STF9DT01QTEVUSU9OX0RJU1BMQVlfTUFUQ0hFU19IT09LJzogMSwKKyAnSEFWRV9STF9DT01QTEVUSU9OX01BVENIRVMnOiAxLAorICdIQVZFX1JMX0NPTVBMRVRJT05fU1VQUFJFU1NfQVBQRU5EJzogMCwKKyAnSEFWRV9STF9QUkVfSU5QVVRfSE9PSyc6IDEsCisgJ0hBVkVfUk9VTkQnOiAxLAorICdIQVZFX1NFTEVDVCc6IDEsCisgJ0hBVkVfU0VNX0dFVFZBTFVFJzogMSwKKyAnSEFWRV9TRU1fT1BFTic6IDEsCisgJ0hBVkVfU0VNX1RJTUVEV0FJVCc6IDAsCisgJ0hBVkVfU0VNX1VOTElOSyc6IDEsCisgJ0hBVkVfU0VURUdJRCc6IDEsCisgJ0hBVkVfU0VURVVJRCc6IDEsCisgJ0hBVkVfU0VUR0lEJzogMSwKKyAnSEFWRV9TRVRHUk9VUFMnOiAxLAorICdIQVZFX1NFVElUSU1FUic6IDEsCisgJ0hBVkVfU0VUTE9DQUxFJzogMSwKKyAnSEFWRV9TRVRQR0lEJzogMSwKKyAnSEFWRV9TRVRQR1JQJzogMSwKKyAnSEFWRV9TRVRSRUdJRCc6IDEsCisgJ0hBVkVfU0VUUkVTR0lEJzogMCwKKyAnSEFWRV9TRVRSRVNVSUQnOiAwLAorICdIQVZFX1NFVFJFVUlEJzogMSwKKyAnSEFWRV9TRVRTSUQnOiAxLAorICdIQVZFX1NFVFVJRCc6IDEsCisgJ0hBVkVfU0VUVkJVRic6IDEsCisgJ0hBVkVfU0hBRE9XX0gnOiAwLAorICdIQVZFX1NJR0FDVElPTic6IDEsCisgJ0hBVkVfU0lHSU5URVJSVVBUJzogMSwKKyAnSEFWRV9TSUdOQUxfSCc6IDEsCisgJ0hBVkVfU0lHUkVMU0UnOiAxLAorICdIQVZFX1NOUFJJTlRGJzogMSwKKyAnSEFWRV9TT0NLQUREUl9TQV9MRU4nOiAxLAorICdIQVZFX1NPQ0tBRERSX1NUT1JBR0UnOiAxLAorICdIQVZFX1NPQ0tFVFBBSVInOiAxLAorICdIQVZFX1NQQVdOX0gnOiAxLAorICdIQVZFX1NTSVpFX1QnOiAxLAorICdIQVZFX1NUQVRWRlMnOiAxLAorICdIQVZFX1NUQVRfVFZfTlNFQyc6IDAsCisgJ0hBVkVfU1RBVF9UVl9OU0VDMic6IDEsCisgJ0hBVkVfU1REQVJHX1BST1RPVFlQRVMnOiAxLAorICdIQVZFX1NURElOVF9IJzogMSwKKyAnSEFWRV9TVERMSUJfSCc6IDEsCisgJ0hBVkVfU1RSRFVQJzogMSwKKyAnSEFWRV9TVFJGVElNRSc6IDEsCisgJ0hBVkVfU1RSSU5HU19IJzogMSwKKyAnSEFWRV9TVFJJTkdfSCc6IDEsCisgJ0hBVkVfU1RST1BUU19IJzogMCwKKyAnSEFWRV9TVFJVQ1RfU1RBVF9TVF9CSVJUSFRJTUUnOiAwLAorICdIQVZFX1NUUlVDVF9TVEFUX1NUX0JMS1NJWkUnOiAxLAorICdIQVZFX1NUUlVDVF9TVEFUX1NUX0JMT0NLUyc6IDEsCisgJ0hBVkVfU1RSVUNUX1NUQVRfU1RfRkxBR1MnOiAxLAorICdIQVZFX1NUUlVDVF9TVEFUX1NUX0dFTic6IDEsCisgJ0hBVkVfU1RSVUNUX1NUQVRfU1RfUkRFVic6IDEsCisgJ0hBVkVfU1RSVUNUX1RNX1RNX1pPTkUnOiAxLAorICdIQVZFX1NUX0JMT0NLUyc6IDEsCisgJ0hBVkVfU1lNTElOSyc6IDEsCisgJ0hBVkVfU1lTQ09ORic6IDEsCisgJ0hBVkVfU1lTRVhJVFNfSCc6IDEsCisgJ0hBVkVfU1lTX0FVRElPSU9fSCc6IDAsCisgJ0hBVkVfU1lTX0JTRFRUWV9IJzogMCwKKyAnSEFWRV9TWVNfRElSX0gnOiAwLAorICdIQVZFX1NZU19FUE9MTF9IJzogMCwKKyAnSEFWRV9TWVNfRVZFTlRfSCc6IDEsCisgJ0hBVkVfU1lTX0ZJTEVfSCc6IDEsCisgJ0hBVkVfU1lTX0xPQURBVkdfSCc6IDAsCisgJ0hBVkVfU1lTX0xPQ0tfSCc6IDEsCisgJ0hBVkVfU1lTX01LREVWX0gnOiAwLAorICdIQVZFX1NZU19NT0RFTV9IJzogMCwKKyAnSEFWRV9TWVNfTkRJUl9IJzogMCwKKyAnSEFWRV9TWVNfUEFSQU1fSCc6IDEsCisgJ0hBVkVfU1lTX1BPTExfSCc6IDEsCisgJ0hBVkVfU1lTX1JFU09VUkNFX0gnOiAxLAorICdIQVZFX1NZU19TRUxFQ1RfSCc6IDEsCisgJ0hBVkVfU1lTX1NPQ0tFVF9IJzogMSwKKyAnSEFWRV9TWVNfU1RBVFZGU19IJzogMSwKKyAnSEFWRV9TWVNfU1RBVF9IJzogMSwKKyAnSEFWRV9TWVNfVEVSTUlPX0gnOiAwLAorICdIQVZFX1NZU19USU1FU19IJzogMSwKKyAnSEFWRV9TWVNfVElNRV9IJzogMSwKKyAnSEFWRV9TWVNfVFlQRVNfSCc6IDEsCisgJ0hBVkVfU1lTX1VOX0gnOiAxLAorICdIQVZFX1NZU19VVFNOQU1FX0gnOiAxLAorICdIQVZFX1NZU19XQUlUX0gnOiAxLAorICdIQVZFX1RDR0VUUEdSUCc6IDEsCisgJ0hBVkVfVENTRVRQR1JQJzogMSwKKyAnSEFWRV9URU1QTkFNJzogMSwKKyAnSEFWRV9URVJNSU9TX0gnOiAxLAorICdIQVZFX1RFUk1fSCc6IDEsCisgJ0hBVkVfVEdBTU1BJzogMSwKKyAnSEFWRV9USFJFQURfSCc6IDAsCisgJ0hBVkVfVElNRUdNJzogMSwKKyAnSEFWRV9USU1FUyc6IDEsCisgJ0hBVkVfVE1QRklMRSc6IDEsCisgJ0hBVkVfVE1QTkFNJzogMSwKKyAnSEFWRV9UTVBOQU1fUic6IDAsCisgJ0hBVkVfVE1fWk9ORSc6IDEsCisgJ0hBVkVfVFJVTkNBVEUnOiAxLAorICdIQVZFX1RaTkFNRSc6IDAsCisgJ0hBVkVfVUNTNF9UQ0wnOiAwLAorICdIQVZFX1VJTlQzMl9UJzogMSwKKyAnSEFWRV9VSU5UNjRfVCc6IDEsCisgJ0hBVkVfVUlOVFBUUl9UJzogMSwKKyAnSEFWRV9VTkFNRSc6IDEsCisgJ0hBVkVfVU5JU1REX0gnOiAxLAorICdIQVZFX1VOU0VURU5WJzogMSwKKyAnSEFWRV9VU0FCTEVfV0NIQVJfVCc6IDAsCisgJ0hBVkVfVVRJTF9IJzogMSwKKyAnSEFWRV9VVElNRVMnOiAxLAorICdIQVZFX1VUSU1FX0gnOiAxLAorICdIQVZFX1dBSVQzJzogMSwKKyAnSEFWRV9XQUlUNCc6IDEsCisgJ0hBVkVfV0FJVFBJRCc6IDEsCisgJ0hBVkVfV0NIQVJfSCc6IDEsCisgJ0hBVkVfV0NTQ09MTCc6IDEsCisgJ0hBVkVfV0lOU09DSzJfSCc6IDAsCisgJ0hBVkVfV09SS0lOR19UWlNFVCc6IDEsCisgJ0hBVkVfWkxJQl9DT1BZJzogMSwKKyAnSEFWRV9fR0VUUFRZJzogMCwKKyAnSEdCUkFOQ0gnOiAnJywKKyAnSEdUQUcnOiAnJywKKyAnSEdWRVJTSU9OJzogJycsCisgJ0hPU1RfR05VX1RZUEUnOiAneDg2XzY0LWFwcGxlLWRhcndpbicsCisgJ0hVUkRfQ19USFJFQURTJzogMCwKKyAnSU5DTERJUlNUT01BS0UnOiAnL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0L2luY2x1ZGUgL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0L2luY2x1ZGUgL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0L2luY2x1ZGUvcHl0aG9uMi43IC90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NC9pbmNsdWRlL3B5dGhvbjIuNycsCisgJ0lOQ0xVREVESVInOiAnL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0L2luY2x1ZGUnLAorICdJTkNMVURFUFknOiAnL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0L2luY2x1ZGUvcHl0aG9uMi43JywKKyAnSU5TVEFMTCc6ICcvb3B0L2xvY2FsL2Jpbi9naW5zdGFsbCAtYycsCisgJ0lOU1RBTExfREFUQSc6ICcvb3B0L2xvY2FsL2Jpbi9naW5zdGFsbCAtYyAtbSA2NDQnLAorICdJTlNUQUxMX1BST0dSQU0nOiAnL29wdC9sb2NhbC9iaW4vZ2luc3RhbGwgLWMnLAorICdJTlNUQUxMX1NDUklQVCc6ICcvb3B0L2xvY2FsL2Jpbi9naW5zdGFsbCAtYycsCisgJ0lOU1RBTExfU0hBUkVEJzogJy9vcHQvbG9jYWwvYmluL2dpbnN0YWxsIC1jIC1tIDU1NScsCisgJ0lOU1RTT05BTUUnOiAnbGlicHl0aG9uMi43LmEnLAorICdMRENYWFNIQVJFRCc6ICd4ODZfNjQtYXBwbGUtZGFyd2luLWdjYyAtYnVuZGxlIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAnLAorICdMREZMQUdTJzogJycsCisgJ0xETEFTVCc6ICcnLAorICdMRExJQlJBUlknOiAnbGlicHl0aG9uMi43LmEnLAorICdMRExJQlJBUllESVInOiAnJywKKyAnTERTSEFSRUQnOiAneDg2XzY0LWFwcGxlLWRhcndpbi1nY2MgLWJ1bmRsZSAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwJywKKyAnTElCQyc6ICcnLAorICdMSUJERVNUJzogJy90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NC9saWIvcHl0aG9uMi43JywKKyAnTElCRElSJzogJy90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NC9saWInLAorICdMSUJGRklfSU5DTFVERURJUic6ICcnLAorICdMSUJNJzogJycsCisgJ0xJQk9CSkRJUic6ICdQeXRob24vJywKKyAnTElCT0JKUyc6ICcnLAorICdMSUJQJzogJy90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NC9saWIvcHl0aG9uMi43JywKKyAnTElCUEMnOiAnL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0L2xpYi9wa2djb25maWcnLAorICdMSUJQTCc6ICcvdG1wL25kay1Vc2VyL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2Rhcndpbi14ODZfNjQvbGliL3B5dGhvbjIuNy9jb25maWcnLAorICdMSUJSQVJZJzogJ2xpYnB5dGhvbjIuNy5hJywKKyAnTElCUkFSWV9PQkpTJzogJ1xcJywKKyAnTElCUyc6ICctbGRsICAtZnJhbWV3b3JrIENvcmVGb3VuZGF0aW9uJywKKyAnTElCU1VCRElSUyc6ICdsaWItdGsgbGliLXRrL3Rlc3QgbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyIFxcJywKKyAnTElOS0NDJzogJ3g4Nl82NC1hcHBsZS1kYXJ3aW4tZ2NjJywKKyAnTElOS0ZPUlNIQVJFRCc6ICctdSBfUHlNYWNfRXJyb3InLAorICdMTic6ICdsbicsCisgJ0xPQ0FMTU9ETElCUyc6ICcnLAorICdNQUNIREVQJzogJ2RhcndpbicsCisgJ01BQ0hERVBQQVRIJzogJzpwbGF0LWRhcndpbicsCisgJ01BQ0hERVBTJzogJ3BsYXQtZGFyd2luIHBsYXQtbWFjIHBsYXQtbWFjL0NhcmJvbiBwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMgXFwnLAorICdNQUNIREVQX09CSlMnOiAnUHl0aG9uL21hY3Rvb2xib3hnbHVlLm8nLAorICdNQUNIREVTVExJQic6ICcvdG1wL25kay1Vc2VyL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2Rhcndpbi14ODZfNjQvbGliL3B5dGhvbjIuNycsCisgJ01BQ0hfQ19USFJFQURTJzogMCwKKyAnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJzogJzEwLjQnLAorICdNQUlOQ0MnOiAneDg2XzY0LWFwcGxlLWRhcndpbi1nY2MnLAorICdNQUpPUl9JTl9NS0RFVic6IDAsCisgJ01BSk9SX0lOX1NZU01BQ1JPUyc6IDAsCisgJ01BS0VTRVRVUCc6ICcvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41L01vZHVsZXMvbWFrZXNldHVwJywKKyAnTUFORElSJzogJy90bXAvbmRrLVVzZXIvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvZGFyd2luLXg4Nl82NC9zaGFyZS9tYW4nLAorICdNRU1URVNUT1BUUyc6ICctbCAteCB0ZXN0X3N1YnByb2Nlc3MgdGVzdF9pbyB0ZXN0X2xpYjJ0bzMgXFwgLXggdGVzdF9kbCB0ZXN0X19fYWxsX18gdGVzdF9mb3JrMSBcXCcsCisgJ01LRElSX1AnOiAnL29wdC9sb2NhbC9iaW4vZ21rZGlyIC1wJywKKyAnTU9ETElCUyc6ICcnLAorICdNT0RPQkpTJzogJ01vZHVsZXMvcG9zaXhtb2R1bGUubyAgTW9kdWxlcy90aHJlYWRtb2R1bGUubyAgTW9kdWxlcy9zaWduYWxtb2R1bGUubyAgTW9kdWxlcy9lcnJub21vZHVsZS5vICBNb2R1bGVzL19zcmUubyAgTW9kdWxlcy9fY29kZWNzbW9kdWxlLm8gIE1vZHVsZXMvX3dlYWtyZWYubyAgTW9kdWxlcy96aXBpbXBvcnQubyAgTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5vICBNb2R1bGVzL3h4c3VidHlwZS5vJywKKyAnTU9EVUxFX09CSlMnOiAnXFwnLAorICdNU1lTVlBBVEgnOiAnL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNScsCisgJ01VTFRJQVJDSCc6ICcnLAorICdNVldERUxDSF9JU19FWFBSRVNTSU9OJzogMSwKKyAnTlRfVEhSRUFEUyc6IDAsCisgJ09CSkVDVF9PQkpTJzogJ1xcJywKKyAnT0xEUEFUSCc6ICc6bGliLW9sZCcsCisgJ09QVCc6ICctRE5ERUJVRyAtZyAtZndyYXB2IC1PMyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzJywKKyAnT1RIRVJfTElCVE9PTF9PUFQnOiAnJywKKyAnUEFDS0FHRV9CVUdSRVBPUlQnOiAwLAorICdQQUNLQUdFX05BTUUnOiAwLAorICdQQUNLQUdFX1NUUklORyc6IDAsCisgJ1BBQ0tBR0VfVEFSTkFNRSc6IDAsCisgJ1BBQ0tBR0VfVVJMJzogMCwKKyAnUEFDS0FHRV9WRVJTSU9OJzogMCwKKyAnUEFSU0VSX0hFQURFUlMnOiAnXFwnLAorICdQQVJTRVJfT0JKUyc6ICdcXCBQYXJzZXIvbXlyZWFkbGluZS5vIFBhcnNlci90b2tlbml6ZXIubycsCisgJ1BHRU4nOiAnUGFyc2VyL3BnZW4nLAorICdQR0VOT0JKUyc6ICdcXCBcXCcsCisgJ1BHRU5TUkNTJzogJ1xcIFxcJywKKyAnUEdPQkpTJzogJ1xcJywKKyAnUEdTUkNTJzogJ1xcJywKKyAnUExBVERJUic6ICdwbGF0LWRhcndpbicsCisgJ1BMQVRNQUNESVJTJzogJ3BsYXQtbWFjIHBsYXQtbWFjL0NhcmJvbiBwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMgXFwnLAorICdQTEFUTUFDUEFUSCc6ICc6cGxhdC1tYWM6cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzJywKKyAnUE9CSlMnOiAnXFwnLAorICdQT1NJWF9TRU1BUEhPUkVTX05PVF9FTkFCTEVEJzogMCwKKyAnUFJPRklMRV9UQVNLJzogJy9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUvVG9vbHMvcHliZW5jaC9weWJlbmNoLnB5IC1uIDIgLS13aXRoLWdjIC0td2l0aC1zeXNjaGVjaycsCisgJ1BTUkNTJzogJ1xcJywKKyAnUFRIUkVBRF9TWVNURU1fU0NIRURfU1VQUE9SVEVEJzogMSwKKyAnUFVSSUZZJzogJycsCisgJ1BZTE9OR19CSVRTX0lOX0RJR0lUJzogMCwKKyAnUFlUSE9OJzogJ3B5dGhvbicsCisgJ1BZVEhPTkZSQU1FV09SSyc6ICcnLAorICdQWVRIT05GUkFNRVdPUktESVInOiAnbm8tZnJhbWV3b3JrJywKKyAnUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUic6ICcnLAorICdQWVRIT05GUkFNRVdPUktQUkVGSVgnOiAnJywKKyAnUFlUSE9OUEFUSCc6ICc6cGxhdC1kYXJ3aW46cGxhdC1tYWM6cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzOmxpYi10azpsaWItb2xkJywKKyAnUFlUSE9OX0ZPUl9CVUlMRCc6ICcuL3B5dGhvbiAtRScsCisgJ1BZVEhPTl9IRUFERVJTJzogJ1xcJywKKyAnUFlUSE9OX09CSlMnOiAnXFwnLAorICdQWV9DRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgLU8yIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciAtcyAtRE5ERUJVRyAtZyAtZndyYXB2IC1PMyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1JLiAtSUluY2x1ZGUgLUkvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41L0luY2x1ZGUgIC1EUHlfQlVJTERfQ09SRScsCisgJ1BZX0ZPUk1BVF9MT05HX0xPTkcnOiAnImxsIicsCisgJ1BZX0ZPUk1BVF9TSVpFX1QnOiAnInoiJywKKyAnUFlfVU5JQ09ERV9UWVBFJzogJ3Vuc2lnbmVkIHNob3J0JywKKyAnUHlfREVCVUcnOiAwLAorICdQeV9FTkFCTEVfU0hBUkVEJzogMCwKKyAnUHlfVU5JQ09ERV9TSVpFJzogMiwKKyAnUHlfVVNJTkdfVU5JQ09ERSc6IDEsCisgJ1FVSUNLVEVTVE9QVFMnOiAnLWwgLXggdGVzdF9zdWJwcm9jZXNzIHRlc3RfaW8gdGVzdF9saWIydG8zIFxcJywKKyAnUkFOTElCJzogJ3g4Nl82NC1hcHBsZS1kYXJ3aW4tcmFubGliJywKKyAnUkVQQVJTRV9EQVRBX0JVRkZFUl9JTl9XSU5OVCc6IDAsCisgJ1JFU1NSQ0RJUic6ICdNYWMvUmVzb3VyY2VzL2ZyYW1ld29yaycsCisgJ1JFVFNJR1RZUEUnOiAndm9pZCcsCisgJ1JVTlNIQVJFRCc6ICcnLAorICdTQ1JJUFRESVInOiAnL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0L2xpYicsCisgJ1NFVFBHUlBfSEFWRV9BUkcnOiAwLAorICdTR0lfQUJJJzogJycsCisgJ1NIRUxMJzogJy9iaW4vc2gnLAorICdTSExJQlMnOiAnLWxkbCAgLWZyYW1ld29yayBDb3JlRm91bmRhdGlvbicsCisgJ1NITElCX0VYVCc6ICciLnNvIicsCisgJ1NJR05BTF9PQkpTJzogJycsCisgJ1NJR05FRF9SSUdIVF9TSElGVF9aRVJPX0ZJTExTJzogMCwKKyAnU0lURVBBVEgnOiAnJywKKyAnU0laRU9GX0RPVUJMRSc6IDgsCisgJ1NJWkVPRl9GTE9BVCc6IDQsCisgJ1NJWkVPRl9GUE9TX1QnOiA4LAorICdTSVpFT0ZfSU5UJzogNCwKKyAnU0laRU9GX0xPTkcnOiA4LAorICdTSVpFT0ZfTE9OR19ET1VCTEUnOiAxNiwKKyAnU0laRU9GX0xPTkdfTE9ORyc6IDgsCisgJ1NJWkVPRl9PRkZfVCc6IDgsCisgJ1NJWkVPRl9QSURfVCc6IDQsCisgJ1NJWkVPRl9QVEhSRUFEX1QnOiA4LAorICdTSVpFT0ZfU0hPUlQnOiAyLAorICdTSVpFT0ZfU0laRV9UJzogOCwKKyAnU0laRU9GX1RJTUVfVCc6IDgsCisgJ1NJWkVPRl9VSU5UUFRSX1QnOiA4LAorICdTSVpFT0ZfVk9JRF9QJzogOCwKKyAnU0laRU9GX1dDSEFSX1QnOiA0LAorICdTSVpFT0ZfX0JPT0wnOiAxLAorICdTTyc6ICcuc28nLAorICdTUkNESVJTJzogJ1BhcnNlciBHcmFtbWFyIE9iamVjdHMgUHl0aG9uIE1vZHVsZXMgTWFjJywKKyAnU1JDX0dEQl9IT09LUyc6ICcvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41L1Rvb2xzL2dkYi9saWJweXRob24ucHknLAorICdTVERDX0hFQURFUlMnOiAxLAorICdTVFJJQ1RfU1lTVl9DVVJTRVMnOiAiLyogRG9uJ3QgdXNlIG5jdXJzZXMgZXh0ZW5zaW9ucyAqLyIsCisgJ1NUUklOR0xJQl9IRUFERVJTJzogJ1xcJywKKyAnU1VCRElSUyc6ICcnLAorICdTVUJESVJTVE9PJzogJ0luY2x1ZGUgTGliIE1pc2MgRGVtbycsCisgJ1NWTlZFUlNJT04nOiAnc3ZudmVyc2lvbiAvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41JywKKyAnU1lTTElCUyc6ICcnLAorICdTWVNfU0VMRUNUX1dJVEhfU1lTX1RJTUUnOiAxLAorICdUQU5IX1BSRVNFUlZFU19aRVJPX1NJR04nOiAxLAorICdURVNUT1BUUyc6ICctbCcsCisgJ1RFU1RQQVRIJzogJycsCisgJ1RFU1RQUk9HJzogJy9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUvTGliL3Rlc3QvcmVncnRlc3QucHknLAorICdURVNUUFlUSE9OJzogJy4vcHl0aG9uIC1XZCAtMyAtRSAtdHQnLAorICdURVNUUFlUSE9OT1BUUyc6ICcnLAorICdUSFJFQURPQkonOiAnUHl0aG9uL3RocmVhZC5vJywKKyAnVElNRV9XSVRIX1NZU19USU1FJzogMSwKKyAnVEtQQVRIJzogJzpsaWItdGsnLAorICdUTV9JTl9TWVNfVElNRSc6IDAsCisgJ1VOSUNPREVfT0JKUyc6ICdPYmplY3RzL3VuaWNvZGVvYmplY3QubyBPYmplY3RzL3VuaWNvZGVjdHlwZS5vJywKKyAnVU5JVkVSU0FMU0RLJzogJycsCisgJ1VTRV9UT09MQk9YX09CSkVDVF9HTFVFJzogMSwKKyAnVkFfTElTVF9JU19BUlJBWSc6IDEsCisgJ1ZFUlNJT04nOiAnMi43JywKKyAnVlBBVEgnOiAnL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNScsCisgJ1dBTlRfU0lHRlBFX0hBTkRMRVInOiAwLAorICdXQU5UX1dDVFlQRV9GVU5DVElPTlMnOiAwLAorICdXSU5ET1dfSEFTX0ZMQUdTJzogMCwKKyAnV0lUSF9ET0NfU1RSSU5HUyc6IDEsCisgJ1dJVEhfRFlMRCc6IDEsCisgJ1dJVEhfTElCSU5UTCc6IDAsCisgJ1dJVEhfTkVYVF9GUkFNRVdPUksnOiAwLAorICdXSVRIX1BZTUFMTE9DJzogMSwKKyAnV0lUSF9TWVNURU1fTElCRkZJJzogMCwKKyAnV0lUSF9USFJFQUQnOiAxLAorICdXSVRIX1RTQyc6IDAsCisgJ1dJVEhfVkFMR1JJTkQnOiAwLAorICdYODdfRE9VQkxFX1JPVU5ESU5HJzogMCwKKyAnWE1MTElCU1VCRElSUyc6ICd4bWwgeG1sL2RvbSB4bWwvZXRyZWUgeG1sL3BhcnNlcnMgeG1sL3NheCcsCisgJ2Fic19idWlsZGRpcic6ICcvdG1wL25kay1Vc2VyL2J1aWxkaG9zdC9idWlsZC1weXRob24tZGFyd2luLXg4Nl82NC0yLjcuNScsCisgJ2Fic19zcmNkaXInOiAnL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNScsCisgJ2J1aWxkJzogJ3g4Nl82NC1hcHBsZS1kYXJ3aW4nLAorICdkYXRhcm9vdGRpcic6ICcvdG1wL25kay1Vc2VyL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2Rhcndpbi14ODZfNjQvc2hhcmUnLAorICdleGVjX3ByZWZpeCc6ICcvdG1wL25kay1Vc2VyL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2Rhcndpbi14ODZfNjQnLAorICdob3N0JzogJ3g4Nl82NC1hcHBsZS1kYXJ3aW4nLAorICdwcmVmaXgnOiAnL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0JywKKyAnc3JjZGlyJzogJy9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUnfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fc3lzY29uZmlnZGF0YS5weWMgYi9saWIvcHl0aG9uMi43L19zeXNjb25maWdkYXRhLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTU0MGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fc3lzY29uZmlnZGF0YS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fc3lzY29uZmlnZGF0YS5weW8gYi9saWIvcHl0aG9uMi43L19zeXNjb25maWdkYXRhLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTU0MGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fc3lzY29uZmlnZGF0YS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fdGhyZWFkaW5nX2xvY2FsLnB5IGIvbGliL3B5dGhvbjIuNy9fdGhyZWFkaW5nX2xvY2FsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTM1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L190aHJlYWRpbmdfbG9jYWwucHkKQEAgLTAsMCArMSwyNTEgQEAKKyIiIlRocmVhZC1sb2NhbCBvYmplY3RzLgorCisoTm90ZSB0aGF0IHRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgUHl0aG9uIHZlcnNpb24gb2YgdGhlIHRocmVhZGluZy5sb2NhbAorIGNsYXNzLiAgRGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB5b3UncmUgdXNpbmcsIHRoZXJlIG1heSBiZSBhCisgZmFzdGVyIG9uZSBhdmFpbGFibGUuICBZb3Ugc2hvdWxkIGFsd2F5cyBpbXBvcnQgdGhlIGBsb2NhbGAgY2xhc3MgZnJvbQorIGB0aHJlYWRpbmdgLikKKworVGhyZWFkLWxvY2FsIG9iamVjdHMgc3VwcG9ydCB0aGUgbWFuYWdlbWVudCBvZiB0aHJlYWQtbG9jYWwgZGF0YS4KK0lmIHlvdSBoYXZlIGRhdGEgdGhhdCB5b3Ugd2FudCB0byBiZSBsb2NhbCB0byBhIHRocmVhZCwgc2ltcGx5IGNyZWF0ZQorYSB0aHJlYWQtbG9jYWwgb2JqZWN0IGFuZCB1c2UgaXRzIGF0dHJpYnV0ZXM6CisKKyAgPj4+IG15ZGF0YSA9IGxvY2FsKCkKKyAgPj4+IG15ZGF0YS5udW1iZXIgPSA0MgorICA+Pj4gbXlkYXRhLm51bWJlcgorICA0MgorCitZb3UgY2FuIGFsc28gYWNjZXNzIHRoZSBsb2NhbC1vYmplY3QncyBkaWN0aW9uYXJ5OgorCisgID4+PiBteWRhdGEuX19kaWN0X18KKyAgeydudW1iZXInOiA0Mn0KKyAgPj4+IG15ZGF0YS5fX2RpY3RfXy5zZXRkZWZhdWx0KCd3aWRnZXRzJywgW10pCisgIFtdCisgID4+PiBteWRhdGEud2lkZ2V0cworICBbXQorCitXaGF0J3MgaW1wb3J0YW50IGFib3V0IHRocmVhZC1sb2NhbCBvYmplY3RzIGlzIHRoYXQgdGhlaXIgZGF0YSBhcmUKK2xvY2FsIHRvIGEgdGhyZWFkLiBJZiB3ZSBhY2Nlc3MgdGhlIGRhdGEgaW4gYSBkaWZmZXJlbnQgdGhyZWFkOgorCisgID4+PiBsb2cgPSBbXQorICA+Pj4gZGVmIGYoKToKKyAgLi4uICAgICBpdGVtcyA9IG15ZGF0YS5fX2RpY3RfXy5pdGVtcygpCisgIC4uLiAgICAgaXRlbXMuc29ydCgpCisgIC4uLiAgICAgbG9nLmFwcGVuZChpdGVtcykKKyAgLi4uICAgICBteWRhdGEubnVtYmVyID0gMTEKKyAgLi4uICAgICBsb2cuYXBwZW5kKG15ZGF0YS5udW1iZXIpCisKKyAgPj4+IGltcG9ydCB0aHJlYWRpbmcKKyAgPj4+IHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWYpCisgID4+PiB0aHJlYWQuc3RhcnQoKQorICA+Pj4gdGhyZWFkLmpvaW4oKQorICA+Pj4gbG9nCisgIFtbXSwgMTFdCisKK3dlIGdldCBkaWZmZXJlbnQgZGF0YS4gIEZ1cnRoZXJtb3JlLCBjaGFuZ2VzIG1hZGUgaW4gdGhlIG90aGVyIHRocmVhZAorZG9uJ3QgYWZmZWN0IGRhdGEgc2VlbiBpbiB0aGlzIHRocmVhZDoKKworICA+Pj4gbXlkYXRhLm51bWJlcgorICA0MgorCitPZiBjb3Vyc2UsIHZhbHVlcyB5b3UgZ2V0IGZyb20gYSBsb2NhbCBvYmplY3QsIGluY2x1ZGluZyBhIF9fZGljdF9fCithdHRyaWJ1dGUsIGFyZSBmb3Igd2hhdGV2ZXIgdGhyZWFkIHdhcyBjdXJyZW50IGF0IHRoZSB0aW1lIHRoZQorYXR0cmlidXRlIHdhcyByZWFkLiAgRm9yIHRoYXQgcmVhc29uLCB5b3UgZ2VuZXJhbGx5IGRvbid0IHdhbnQgdG8gc2F2ZQordGhlc2UgdmFsdWVzIGFjcm9zcyB0aHJlYWRzLCBhcyB0aGV5IGFwcGx5IG9ubHkgdG8gdGhlIHRocmVhZCB0aGV5CitjYW1lIGZyb20uCisKK1lvdSBjYW4gY3JlYXRlIGN1c3RvbSBsb2NhbCBvYmplY3RzIGJ5IHN1YmNsYXNzaW5nIHRoZSBsb2NhbCBjbGFzczoKKworICA+Pj4gY2xhc3MgTXlMb2NhbChsb2NhbCk6CisgIC4uLiAgICAgbnVtYmVyID0gMgorICAuLi4gICAgIGluaXRpYWxpemVkID0gRmFsc2UKKyAgLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgKiprdyk6CisgIC4uLiAgICAgICAgIGlmIHNlbGYuaW5pdGlhbGl6ZWQ6CisgIC4uLiAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FcnJvcignX19pbml0X18gY2FsbGVkIHRvbyBtYW55IHRpbWVzJykKKyAgLi4uICAgICAgICAgc2VsZi5pbml0aWFsaXplZCA9IFRydWUKKyAgLi4uICAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoa3cpCisgIC4uLiAgICAgZGVmIHNxdWFyZWQoc2VsZik6CisgIC4uLiAgICAgICAgIHJldHVybiBzZWxmLm51bWJlciAqKiAyCisKK1RoaXMgY2FuIGJlIHVzZWZ1bCB0byBzdXBwb3J0IGRlZmF1bHQgdmFsdWVzLCBtZXRob2RzIGFuZAoraW5pdGlhbGl6YXRpb24uICBOb3RlIHRoYXQgaWYgeW91IGRlZmluZSBhbiBfX2luaXRfXyBtZXRob2QsIGl0IHdpbGwgYmUKK2NhbGxlZCBlYWNoIHRpbWUgdGhlIGxvY2FsIG9iamVjdCBpcyB1c2VkIGluIGEgc2VwYXJhdGUgdGhyZWFkLiAgVGhpcworaXMgbmVjZXNzYXJ5IHRvIGluaXRpYWxpemUgZWFjaCB0aHJlYWQncyBkaWN0aW9uYXJ5LgorCitOb3cgaWYgd2UgY3JlYXRlIGEgbG9jYWwgb2JqZWN0OgorCisgID4+PiBteWRhdGEgPSBNeUxvY2FsKGNvbG9yPSdyZWQnKQorCitOb3cgd2UgaGF2ZSBhIGRlZmF1bHQgbnVtYmVyOgorCisgID4+PiBteWRhdGEubnVtYmVyCisgIDIKKworYW4gaW5pdGlhbCBjb2xvcjoKKworICA+Pj4gbXlkYXRhLmNvbG9yCisgICdyZWQnCisgID4+PiBkZWwgbXlkYXRhLmNvbG9yCisKK0FuZCBhIG1ldGhvZCB0aGF0IG9wZXJhdGVzIG9uIHRoZSBkYXRhOgorCisgID4+PiBteWRhdGEuc3F1YXJlZCgpCisgIDQKKworQXMgYmVmb3JlLCB3ZSBjYW4gYWNjZXNzIHRoZSBkYXRhIGluIGEgc2VwYXJhdGUgdGhyZWFkOgorCisgID4+PiBsb2cgPSBbXQorICA+Pj4gdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZikKKyAgPj4+IHRocmVhZC5zdGFydCgpCisgID4+PiB0aHJlYWQuam9pbigpCisgID4+PiBsb2cKKyAgW1soJ2NvbG9yJywgJ3JlZCcpLCAoJ2luaXRpYWxpemVkJywgVHJ1ZSldLCAxMV0KKword2l0aG91dCBhZmZlY3RpbmcgdGhpcyB0aHJlYWQncyBkYXRhOgorCisgID4+PiBteWRhdGEubnVtYmVyCisgIDIKKyAgPj4+IG15ZGF0YS5jb2xvcgorICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorICBBdHRyaWJ1dGVFcnJvcjogJ015TG9jYWwnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdjb2xvcicKKworTm90ZSB0aGF0IHN1YmNsYXNzZXMgY2FuIGRlZmluZSBzbG90cywgYnV0IHRoZXkgYXJlIG5vdCB0aHJlYWQKK2xvY2FsLiBUaGV5IGFyZSBzaGFyZWQgYWNyb3NzIHRocmVhZHM6CisKKyAgPj4+IGNsYXNzIE15TG9jYWwobG9jYWwpOgorICAuLi4gICAgIF9fc2xvdHNfXyA9ICdudW1iZXInCisKKyAgPj4+IG15ZGF0YSA9IE15TG9jYWwoKQorICA+Pj4gbXlkYXRhLm51bWJlciA9IDQyCisgID4+PiBteWRhdGEuY29sb3IgPSAncmVkJworCitTbywgdGhlIHNlcGFyYXRlIHRocmVhZDoKKworICA+Pj4gdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZikKKyAgPj4+IHRocmVhZC5zdGFydCgpCisgID4+PiB0aHJlYWQuam9pbigpCisKK2FmZmVjdHMgd2hhdCB3ZSBzZWU6CisKKyAgPj4+IG15ZGF0YS5udW1iZXIKKyAgMTEKKworPj4+IGRlbCBteWRhdGEKKyIiIgorCitfX2FsbF9fID0gWyJsb2NhbCJdCisKKyMgV2UgbmVlZCB0byB1c2Ugb2JqZWN0cyBmcm9tIHRoZSB0aHJlYWRpbmcgbW9kdWxlLCBidXQgdGhlIHRocmVhZGluZworIyBtb2R1bGUgbWF5IGFsc28gd2FudCB0byB1c2Ugb3VyIGBsb2NhbGAgY2xhc3MsIGlmIHN1cHBvcnQgZm9yIGxvY2FscworIyBpc24ndCBjb21waWxlZCBpbiB0byB0aGUgYHRocmVhZGAgbW9kdWxlLiAgVGhpcyBjcmVhdGVzIHBvdGVudGlhbCBwcm9ibGVtcworIyB3aXRoIGNpcmN1bGFyIGltcG9ydHMuICBGb3IgdGhhdCByZWFzb24sIHdlIGRvbid0IGltcG9ydCBgdGhyZWFkaW5nYAorIyB1bnRpbCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZSAoYSBoYWNrIHN1ZmZpY2llbnQgdG8gd29ybSBhcm91bmQgdGhlCisjIHBvdGVudGlhbCBwcm9ibGVtcykuICBOb3RlIHRoYXQgYWxtb3N0IGFsbCBwbGF0Zm9ybXMgZG8gaGF2ZSBzdXBwb3J0IGZvcgorIyBsb2NhbHMgaW4gdGhlIGB0aHJlYWRgIG1vZHVsZSwgYW5kIHRoZXJlIGlzIG5vIGNpcmN1bGFyIGltcG9ydCBwcm9ibGVtCisjIHRoZW4sIHNvIHByb2JsZW1zIGludHJvZHVjZWQgYnkgZmlkZGxpbmcgdGhlIG9yZGVyIG9mIGltcG9ydHMgaGVyZSB3b24ndAorIyBtYW5pZmVzdCBvbiBtb3N0IGJveGVzLgorCitjbGFzcyBfbG9jYWxiYXNlKG9iamVjdCk6CisgICAgX19zbG90c19fID0gJ19sb2NhbF9fa2V5JywgJ19sb2NhbF9fYXJncycsICdfbG9jYWxfX2xvY2snCisKKyAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzLCAqKmt3KToKKyAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscykKKyAgICAgICAga2V5ID0gJ19sb2NhbF9fa2V5JywgJ3RocmVhZC5sb2NhbC4nICsgc3RyKGlkKHNlbGYpKQorICAgICAgICBvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgJ19sb2NhbF9fa2V5Jywga2V5KQorICAgICAgICBvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgJ19sb2NhbF9fYXJncycsIChhcmdzLCBrdykpCisgICAgICAgIG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCAnX2xvY2FsX19sb2NrJywgUkxvY2soKSkKKworICAgICAgICBpZiAoYXJncyBvciBrdykgYW5kIChjbHMuX19pbml0X18gaXMgb2JqZWN0Ll9faW5pdF9fKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiSW5pdGlhbGl6YXRpb24gYXJndW1lbnRzIGFyZSBub3Qgc3VwcG9ydGVkIikKKworICAgICAgICAjIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSB0aHJlYWQgZGljdCBpbiBhbnRpY2lwYXRpb24gb2YKKyAgICAgICAgIyBfX2luaXRfXyBiZWluZyBjYWxsZWQsIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBjYWxsIGl0CisgICAgICAgICMgYWdhaW4gb3Vyc2VsdmVzLgorICAgICAgICBkaWN0ID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ19fZGljdF9fJykKKyAgICAgICAgY3VycmVudF90aHJlYWQoKS5fX2RpY3RfX1trZXldID0gZGljdAorCisgICAgICAgIHJldHVybiBzZWxmCisKK2RlZiBfcGF0Y2goc2VsZik6CisgICAga2V5ID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ19sb2NhbF9fa2V5JykKKyAgICBkID0gY3VycmVudF90aHJlYWQoKS5fX2RpY3RfXy5nZXQoa2V5KQorICAgIGlmIGQgaXMgTm9uZToKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGN1cnJlbnRfdGhyZWFkKCkuX19kaWN0X19ba2V5XSA9IGQKKyAgICAgICAgb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsICdfX2RpY3RfXycsIGQpCisKKyAgICAgICAgIyB3ZSBoYXZlIGEgbmV3IGluc3RhbmNlIGRpY3QsIHNvIGNhbGwgb3V0IF9faW5pdF9fIGlmIHdlIGhhdmUKKyAgICAgICAgIyBvbmUKKyAgICAgICAgY2xzID0gdHlwZShzZWxmKQorICAgICAgICBpZiBjbHMuX19pbml0X18gaXMgbm90IG9iamVjdC5fX2luaXRfXzoKKyAgICAgICAgICAgIGFyZ3MsIGt3ID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ19sb2NhbF9fYXJncycpCisgICAgICAgICAgICBjbHMuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCisgICAgZWxzZToKKyAgICAgICAgb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsICdfX2RpY3RfXycsIGQpCisKK2NsYXNzIGxvY2FsKF9sb2NhbGJhc2UpOgorCisgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGxvY2sgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnX2xvY2FsX19sb2NrJykKKyAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX3BhdGNoKHNlbGYpCisgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICBpZiBuYW1lID09ICdfX2RpY3RfXyc6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigKKyAgICAgICAgICAgICAgICAiJXIgb2JqZWN0IGF0dHJpYnV0ZSAnX19kaWN0X18nIGlzIHJlYWQtb25seSIKKyAgICAgICAgICAgICAgICAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKQorICAgICAgICBsb2NrID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ19sb2NhbF9fbG9jaycpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9wYXRjaChzZWxmKQorICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgX19kZWxhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgPT0gJ19fZGljdF9fJzoKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKAorICAgICAgICAgICAgICAgICIlciBvYmplY3QgYXR0cmlidXRlICdfX2RpY3RfXycgaXMgcmVhZC1vbmx5IgorICAgICAgICAgICAgICAgICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCisgICAgICAgIGxvY2sgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnX2xvY2FsX19sb2NrJykKKyAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX3BhdGNoKHNlbGYpCisgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBsb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGltcG9ydCB0aHJlYWRpbmcKKworICAgICAgICBrZXkgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnX2xvY2FsX19rZXknKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgV2UgdXNlIHRoZSBub24tbG9ja2luZyBBUEkgc2luY2Ugd2UgbWlnaHQgYWxyZWFkeSBob2xkIHRoZSBsb2NrCisgICAgICAgICAgICAjIChfX2RlbF9fIGNhbiBiZSBjYWxsZWQgYXQgYW55IHBvaW50IGJ5IHRoZSBjeWNsaWMgR0MpLgorICAgICAgICAgICAgdGhyZWFkcyA9IHRocmVhZGluZy5fZW51bWVyYXRlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgIyBJZiBlbnVtZXJhdGluZyB0aGUgY3VycmVudCB0aHJlYWRzIGZhaWxzLCBhcyBpdCBzZWVtcyB0byBkbworICAgICAgICAgICAgIyBkdXJpbmcgc2h1dGRvd24sIHdlJ2xsIHNraXAgY2xlYW51cCB1bmRlciB0aGUgYXNzdW1wdGlvbgorICAgICAgICAgICAgIyB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgdG8gY2xlYW4gdXAuCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmb3IgdGhyZWFkIGluIHRocmVhZHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX19kaWN0X18gPSB0aHJlYWQuX19kaWN0X18KKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFRocmVhZCBpcyBkeWluZywgcmVzdCBpbiBwZWFjZS4KKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBrZXkgaW4gX19kaWN0X186CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkZWwgX19kaWN0X19ba2V5XQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcyAjIGRpZG4ndCBoYXZlIGFueXRoaW5nIGluIHRoaXMgdGhyZWFkCisKK2Zyb20gdGhyZWFkaW5nIGltcG9ydCBjdXJyZW50X3RocmVhZCwgUkxvY2sKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX3RocmVhZGluZ19sb2NhbC5weWMgYi9saWIvcHl0aG9uMi43L190aHJlYWRpbmdfbG9jYWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTRmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L190aHJlYWRpbmdfbG9jYWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX3RocmVhZGluZ19sb2NhbC5weW8gYi9saWIvcHl0aG9uMi43L190aHJlYWRpbmdfbG9jYWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMTRmNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L190aHJlYWRpbmdfbG9jYWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX3dlYWtyZWZzZXQucHkgYi9saWIvcHl0aG9uMi43L193ZWFrcmVmc2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjlhNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L193ZWFrcmVmc2V0LnB5CkBAIC0wLDAgKzEsMTk2IEBACisjIEFjY2VzcyBXZWFrU2V0IHRocm91Z2ggdGhlIHdlYWtyZWYgbW9kdWxlLgorIyBUaGlzIGNvZGUgaXMgc2VwYXJhdGVkLW91dCBiZWNhdXNlIGl0IGlzIG5lZWRlZAorIyBieSBhYmMucHkgdG8gbG9hZCBldmVyeXRoaW5nIGVsc2UgYXQgc3RhcnR1cC4KKworZnJvbSBfd2Vha3JlZiBpbXBvcnQgcmVmCisKK19fYWxsX18gPSBbJ1dlYWtTZXQnXQorCisKK2NsYXNzIF9JdGVyYXRpb25HdWFyZChvYmplY3QpOgorICAgICMgVGhpcyBjb250ZXh0IG1hbmFnZXIgcmVnaXN0ZXJzIGl0c2VsZiBpbiB0aGUgY3VycmVudCBpdGVyYXRvcnMgb2YgdGhlCisgICAgIyB3ZWFrIGNvbnRhaW5lciwgc3VjaCBhcyB0byBkZWxheSBhbGwgcmVtb3ZhbHMgdW50aWwgdGhlIGNvbnRleHQgbWFuYWdlcgorICAgICMgZXhpdHMuCisgICAgIyBUaGlzIHRlY2huaXF1ZSBzaG91bGQgYmUgcmVsYXRpdmVseSB0aHJlYWQtc2FmZSAoc2luY2Ugc2V0cyBhcmUpLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdlYWtjb250YWluZXIpOgorICAgICAgICAjIERvbid0IGNyZWF0ZSBjeWNsZXMKKyAgICAgICAgc2VsZi53ZWFrY29udGFpbmVyID0gcmVmKHdlYWtjb250YWluZXIpCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICB3ID0gc2VsZi53ZWFrY29udGFpbmVyKCkKKyAgICAgICAgaWYgdyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHcuX2l0ZXJhdGluZy5hZGQoc2VsZikKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBlLCB0LCBiKToKKyAgICAgICAgdyA9IHNlbGYud2Vha2NvbnRhaW5lcigpCisgICAgICAgIGlmIHcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzID0gdy5faXRlcmF0aW5nCisgICAgICAgICAgICBzLnJlbW92ZShzZWxmKQorICAgICAgICAgICAgaWYgbm90IHM6CisgICAgICAgICAgICAgICAgdy5fY29tbWl0X3JlbW92YWxzKCkKKworCitjbGFzcyBXZWFrU2V0KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGE9Tm9uZSk6CisgICAgICAgIHNlbGYuZGF0YSA9IHNldCgpCisgICAgICAgIGRlZiBfcmVtb3ZlKGl0ZW0sIHNlbGZyZWY9cmVmKHNlbGYpKToKKyAgICAgICAgICAgIHNlbGYgPSBzZWxmcmVmKCkKKyAgICAgICAgICAgIGlmIHNlbGYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5faXRlcmF0aW5nOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9wZW5kaW5nX3JlbW92YWxzLmFwcGVuZChpdGVtKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5kaXNjYXJkKGl0ZW0pCisgICAgICAgIHNlbGYuX3JlbW92ZSA9IF9yZW1vdmUKKyAgICAgICAgIyBBIGxpc3Qgb2Yga2V5cyB0byBiZSByZW1vdmVkCisgICAgICAgIHNlbGYuX3BlbmRpbmdfcmVtb3ZhbHMgPSBbXQorICAgICAgICBzZWxmLl9pdGVyYXRpbmcgPSBzZXQoKQorICAgICAgICBpZiBkYXRhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi51cGRhdGUoZGF0YSkKKworICAgIGRlZiBfY29tbWl0X3JlbW92YWxzKHNlbGYpOgorICAgICAgICBsID0gc2VsZi5fcGVuZGluZ19yZW1vdmFscworICAgICAgICBkaXNjYXJkID0gc2VsZi5kYXRhLmRpc2NhcmQKKyAgICAgICAgd2hpbGUgbDoKKyAgICAgICAgICAgIGRpc2NhcmQobC5wb3AoKSkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgd2l0aCBfSXRlcmF0aW9uR3VhcmQoc2VsZik6CisgICAgICAgICAgICBmb3IgaXRlbXJlZiBpbiBzZWxmLmRhdGE6CisgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW1yZWYoKQorICAgICAgICAgICAgICAgIGlmIGl0ZW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGl0ZW0KKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuZGF0YSkgLSBsZW4oc2VsZi5fcGVuZGluZ19yZW1vdmFscykKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyID0gcmVmKGl0ZW0pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIHdyIGluIHNlbGYuZGF0YQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi5fX2NsYXNzX18sIChsaXN0KHNlbGYpLCksCisgICAgICAgICAgICAgICAgZ2V0YXR0cihzZWxmLCAnX19kaWN0X18nLCBOb25lKSkKKworICAgIF9faGFzaF9fID0gTm9uZQorCisgICAgZGVmIGFkZChzZWxmLCBpdGVtKToKKyAgICAgICAgaWYgc2VsZi5fcGVuZGluZ19yZW1vdmFsczoKKyAgICAgICAgICAgIHNlbGYuX2NvbW1pdF9yZW1vdmFscygpCisgICAgICAgIHNlbGYuZGF0YS5hZGQocmVmKGl0ZW0sIHNlbGYuX3JlbW92ZSkpCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3BlbmRpbmdfcmVtb3ZhbHM6CisgICAgICAgICAgICBzZWxmLl9jb21taXRfcmVtb3ZhbHMoKQorICAgICAgICBzZWxmLmRhdGEuY2xlYXIoKQorCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmKQorCisgICAgZGVmIHBvcChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcGVuZGluZ19yZW1vdmFsczoKKyAgICAgICAgICAgIHNlbGYuX2NvbW1pdF9yZW1vdmFscygpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXRlbXJlZiA9IHNlbGYuZGF0YS5wb3AoKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdwb3AgZnJvbSBlbXB0eSBXZWFrU2V0JykKKyAgICAgICAgICAgIGl0ZW0gPSBpdGVtcmVmKCkKKyAgICAgICAgICAgIGlmIGl0ZW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0KKworICAgIGRlZiByZW1vdmUoc2VsZiwgaXRlbSk6CisgICAgICAgIGlmIHNlbGYuX3BlbmRpbmdfcmVtb3ZhbHM6CisgICAgICAgICAgICBzZWxmLl9jb21taXRfcmVtb3ZhbHMoKQorICAgICAgICBzZWxmLmRhdGEucmVtb3ZlKHJlZihpdGVtKSkKKworICAgIGRlZiBkaXNjYXJkKHNlbGYsIGl0ZW0pOgorICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3JlbW92YWxzOgorICAgICAgICAgICAgc2VsZi5fY29tbWl0X3JlbW92YWxzKCkKKyAgICAgICAgc2VsZi5kYXRhLmRpc2NhcmQocmVmKGl0ZW0pKQorCisgICAgZGVmIHVwZGF0ZShzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHNlbGYuX3BlbmRpbmdfcmVtb3ZhbHM6CisgICAgICAgICAgICBzZWxmLl9jb21taXRfcmVtb3ZhbHMoKQorICAgICAgICBmb3IgZWxlbWVudCBpbiBvdGhlcjoKKyAgICAgICAgICAgIHNlbGYuYWRkKGVsZW1lbnQpCisKKyAgICBkZWYgX19pb3JfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHNlbGYudXBkYXRlKG90aGVyKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGRpZmZlcmVuY2Uoc2VsZiwgb3RoZXIpOgorICAgICAgICBuZXdzZXQgPSBzZWxmLmNvcHkoKQorICAgICAgICBuZXdzZXQuZGlmZmVyZW5jZV91cGRhdGUob3RoZXIpCisgICAgICAgIHJldHVybiBuZXdzZXQKKyAgICBfX3N1Yl9fID0gZGlmZmVyZW5jZQorCisgICAgZGVmIGRpZmZlcmVuY2VfdXBkYXRlKHNlbGYsIG90aGVyKToKKyAgICAgICAgc2VsZi5fX2lzdWJfXyhvdGhlcikKKyAgICBkZWYgX19pc3ViX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3JlbW92YWxzOgorICAgICAgICAgICAgc2VsZi5fY29tbWl0X3JlbW92YWxzKCkKKyAgICAgICAgaWYgc2VsZiBpcyBvdGhlcjoKKyAgICAgICAgICAgIHNlbGYuZGF0YS5jbGVhcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRhdGEuZGlmZmVyZW5jZV91cGRhdGUocmVmKGl0ZW0pIGZvciBpdGVtIGluIG90aGVyKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGludGVyc2VjdGlvbihzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhpdGVtIGZvciBpdGVtIGluIG90aGVyIGlmIGl0ZW0gaW4gc2VsZikKKyAgICBfX2FuZF9fID0gaW50ZXJzZWN0aW9uCisKKyAgICBkZWYgaW50ZXJzZWN0aW9uX3VwZGF0ZShzZWxmLCBvdGhlcik6CisgICAgICAgIHNlbGYuX19pYW5kX18ob3RoZXIpCisgICAgZGVmIF9faWFuZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgc2VsZi5fcGVuZGluZ19yZW1vdmFsczoKKyAgICAgICAgICAgIHNlbGYuX2NvbW1pdF9yZW1vdmFscygpCisgICAgICAgIHNlbGYuZGF0YS5pbnRlcnNlY3Rpb25fdXBkYXRlKHJlZihpdGVtKSBmb3IgaXRlbSBpbiBvdGhlcikKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBpc3N1YnNldChzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuaXNzdWJzZXQocmVmKGl0ZW0pIGZvciBpdGVtIGluIG90aGVyKQorICAgIF9fbGVfXyA9IGlzc3Vic2V0CisKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YSA8IHNldChyZWYoaXRlbSkgZm9yIGl0ZW0gaW4gb3RoZXIpCisKKyAgICBkZWYgaXNzdXBlcnNldChzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuaXNzdXBlcnNldChyZWYoaXRlbSkgZm9yIGl0ZW0gaW4gb3RoZXIpCisgICAgX19nZV9fID0gaXNzdXBlcnNldAorCisgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEgPiBzZXQocmVmKGl0ZW0pIGZvciBpdGVtIGluIG90aGVyKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YSA9PSBzZXQocmVmKGl0ZW0pIGZvciBpdGVtIGluIG90aGVyKQorCisgICAgZGVmIHN5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYsIG90aGVyKToKKyAgICAgICAgbmV3c2V0ID0gc2VsZi5jb3B5KCkKKyAgICAgICAgbmV3c2V0LnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShvdGhlcikKKyAgICAgICAgcmV0dXJuIG5ld3NldAorICAgIF9feG9yX18gPSBzeW1tZXRyaWNfZGlmZmVyZW5jZQorCisgICAgZGVmIHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShzZWxmLCBvdGhlcik6CisgICAgICAgIHNlbGYuX19peG9yX18ob3RoZXIpCisgICAgZGVmIF9faXhvcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgc2VsZi5fcGVuZGluZ19yZW1vdmFsczoKKyAgICAgICAgICAgIHNlbGYuX2NvbW1pdF9yZW1vdmFscygpCisgICAgICAgIGlmIHNlbGYgaXMgb3RoZXI6CisgICAgICAgICAgICBzZWxmLmRhdGEuY2xlYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kYXRhLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShyZWYoaXRlbSwgc2VsZi5fcmVtb3ZlKSBmb3IgaXRlbSBpbiBvdGhlcikKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiB1bmlvbihzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhlIGZvciBzIGluIChzZWxmLCBvdGhlcikgZm9yIGUgaW4gcykKKyAgICBfX29yX18gPSB1bmlvbgorCisgICAgZGVmIGlzZGlzam9pbnQoc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuaW50ZXJzZWN0aW9uKG90aGVyKSkgPT0gMApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fd2Vha3JlZnNldC5weWMgYi9saWIvcHl0aG9uMi43L193ZWFrcmVmc2V0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjFhOTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fd2Vha3JlZnNldC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fd2Vha3JlZnNldC5weW8gYi9saWIvcHl0aG9uMi43L193ZWFrcmVmc2V0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjFhOTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fd2Vha3JlZnNldC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hYmMucHkgYi9saWIvcHl0aG9uMi43L2FiYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmU0OGExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hYmMucHkKQEAgLTAsMCArMSwxODUgQEAKKyMgQ29weXJpZ2h0IDIwMDcgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChBQkNzKSBhY2NvcmRpbmcgdG8gUEVQIDMxMTkuIiIiCisKK2ltcG9ydCB0eXBlcworCitmcm9tIF93ZWFrcmVmc2V0IGltcG9ydCBXZWFrU2V0CisKKyMgSW5zdGFuY2Ugb2Ygb2xkLXN0eWxlIGNsYXNzCitjbGFzcyBfQzogcGFzcworX0luc3RhbmNlVHlwZSA9IHR5cGUoX0MoKSkKKworCitkZWYgYWJzdHJhY3RtZXRob2QoZnVuY29iaik6CisgICAgIiIiQSBkZWNvcmF0b3IgaW5kaWNhdGluZyBhYnN0cmFjdCBtZXRob2RzLgorCisgICAgUmVxdWlyZXMgdGhhdCB0aGUgbWV0YWNsYXNzIGlzIEFCQ01ldGEgb3IgZGVyaXZlZCBmcm9tIGl0LiAgQQorICAgIGNsYXNzIHRoYXQgaGFzIGEgbWV0YWNsYXNzIGRlcml2ZWQgZnJvbSBBQkNNZXRhIGNhbm5vdCBiZQorICAgIGluc3RhbnRpYXRlZCB1bmxlc3MgYWxsIG9mIGl0cyBhYnN0cmFjdCBtZXRob2RzIGFyZSBvdmVycmlkZGVuLgorICAgIFRoZSBhYnN0cmFjdCBtZXRob2RzIGNhbiBiZSBjYWxsZWQgdXNpbmcgYW55IG9mIHRoZSBub3JtYWwKKyAgICAnc3VwZXInIGNhbGwgbWVjaGFuaXNtcy4KKworICAgIFVzYWdlOgorCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gQUJDTWV0YQorICAgICAgICAgICAgQGFic3RyYWN0bWV0aG9kCisgICAgICAgICAgICBkZWYgbXlfYWJzdHJhY3RfbWV0aG9kKHNlbGYsIC4uLik6CisgICAgICAgICAgICAgICAgLi4uCisgICAgIiIiCisgICAgZnVuY29iai5fX2lzYWJzdHJhY3RtZXRob2RfXyA9IFRydWUKKyAgICByZXR1cm4gZnVuY29iagorCisKK2NsYXNzIGFic3RyYWN0cHJvcGVydHkocHJvcGVydHkpOgorICAgICIiIkEgZGVjb3JhdG9yIGluZGljYXRpbmcgYWJzdHJhY3QgcHJvcGVydGllcy4KKworICAgIFJlcXVpcmVzIHRoYXQgdGhlIG1ldGFjbGFzcyBpcyBBQkNNZXRhIG9yIGRlcml2ZWQgZnJvbSBpdC4gIEEKKyAgICBjbGFzcyB0aGF0IGhhcyBhIG1ldGFjbGFzcyBkZXJpdmVkIGZyb20gQUJDTWV0YSBjYW5ub3QgYmUKKyAgICBpbnN0YW50aWF0ZWQgdW5sZXNzIGFsbCBvZiBpdHMgYWJzdHJhY3QgcHJvcGVydGllcyBhcmUgb3ZlcnJpZGRlbi4KKyAgICBUaGUgYWJzdHJhY3QgcHJvcGVydGllcyBjYW4gYmUgY2FsbGVkIHVzaW5nIGFueSBvZiB0aGUgbm9ybWFsCisgICAgJ3N1cGVyJyBjYWxsIG1lY2hhbmlzbXMuCisKKyAgICBVc2FnZToKKworICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IEFCQ01ldGEKKyAgICAgICAgICAgIEBhYnN0cmFjdHByb3BlcnR5CisgICAgICAgICAgICBkZWYgbXlfYWJzdHJhY3RfcHJvcGVydHkoc2VsZik6CisgICAgICAgICAgICAgICAgLi4uCisKKyAgICBUaGlzIGRlZmluZXMgYSByZWFkLW9ubHkgcHJvcGVydHk7IHlvdSBjYW4gYWxzbyBkZWZpbmUgYSByZWFkLXdyaXRlCisgICAgYWJzdHJhY3QgcHJvcGVydHkgdXNpbmcgdGhlICdsb25nJyBmb3JtIG9mIHByb3BlcnR5IGRlY2xhcmF0aW9uOgorCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gQUJDTWV0YQorICAgICAgICAgICAgZGVmIGdldHgoc2VsZik6IC4uLgorICAgICAgICAgICAgZGVmIHNldHgoc2VsZiwgdmFsdWUpOiAuLi4KKyAgICAgICAgICAgIHggPSBhYnN0cmFjdHByb3BlcnR5KGdldHgsIHNldHgpCisgICAgIiIiCisgICAgX19pc2Fic3RyYWN0bWV0aG9kX18gPSBUcnVlCisKKworY2xhc3MgQUJDTWV0YSh0eXBlKToKKworICAgICIiIk1ldGFjbGFzcyBmb3IgZGVmaW5pbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChBQkNzKS4KKworICAgIFVzZSB0aGlzIG1ldGFjbGFzcyB0byBjcmVhdGUgYW4gQUJDLiAgQW4gQUJDIGNhbiBiZSBzdWJjbGFzc2VkCisgICAgZGlyZWN0bHksIGFuZCB0aGVuIGFjdHMgYXMgYSBtaXgtaW4gY2xhc3MuICBZb3UgY2FuIGFsc28gcmVnaXN0ZXIKKyAgICB1bnJlbGF0ZWQgY29uY3JldGUgY2xhc3NlcyAoZXZlbiBidWlsdC1pbiBjbGFzc2VzKSBhbmQgdW5yZWxhdGVkCisgICAgQUJDcyBhcyAndmlydHVhbCBzdWJjbGFzc2VzJyAtLSB0aGVzZSBhbmQgdGhlaXIgZGVzY2VuZGFudHMgd2lsbAorICAgIGJlIGNvbnNpZGVyZWQgc3ViY2xhc3NlcyBvZiB0aGUgcmVnaXN0ZXJpbmcgQUJDIGJ5IHRoZSBidWlsdC1pbgorICAgIGlzc3ViY2xhc3MoKSBmdW5jdGlvbiwgYnV0IHRoZSByZWdpc3RlcmluZyBBQkMgd29uJ3Qgc2hvdyB1cCBpbgorICAgIHRoZWlyIE1STyAoTWV0aG9kIFJlc29sdXRpb24gT3JkZXIpIG5vciB3aWxsIG1ldGhvZAorICAgIGltcGxlbWVudGF0aW9ucyBkZWZpbmVkIGJ5IHRoZSByZWdpc3RlcmluZyBBQkMgYmUgY2FsbGFibGUgKG5vdAorICAgIGV2ZW4gdmlhIHN1cGVyKCkpLgorCisgICAgIiIiCisKKyAgICAjIEEgZ2xvYmFsIGNvdW50ZXIgdGhhdCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSBjbGFzcyBpcworICAgICMgcmVnaXN0ZXJlZCBhcyBhIHZpcnR1YWwgc3ViY2xhc3Mgb2YgYW55dGhpbmcuICBJdCBmb3JjZXMgdGhlCisgICAgIyBuZWdhdGl2ZSBjYWNoZSB0byBiZSBjbGVhcmVkIGJlZm9yZSBpdHMgbmV4dCB1c2UuCisgICAgX2FiY19pbnZhbGlkYXRpb25fY291bnRlciA9IDAKKworICAgIGRlZiBfX25ld19fKG1jbHMsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UpOgorICAgICAgICBjbHMgPSBzdXBlcihBQkNNZXRhLCBtY2xzKS5fX25ld19fKG1jbHMsIG5hbWUsIGJhc2VzLCBuYW1lc3BhY2UpCisgICAgICAgICMgQ29tcHV0ZSBzZXQgb2YgYWJzdHJhY3QgbWV0aG9kIG5hbWVzCisgICAgICAgIGFic3RyYWN0cyA9IHNldChuYW1lCisgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gbmFtZXNwYWNlLml0ZW1zKCkKKyAgICAgICAgICAgICAgICAgICAgIGlmIGdldGF0dHIodmFsdWUsICJfX2lzYWJzdHJhY3RtZXRob2RfXyIsIEZhbHNlKSkKKyAgICAgICAgZm9yIGJhc2UgaW4gYmFzZXM6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBnZXRhdHRyKGJhc2UsICJfX2Fic3RyYWN0bWV0aG9kc19fIiwgc2V0KCkpOgorICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihjbHMsIG5hbWUsIE5vbmUpCisgICAgICAgICAgICAgICAgaWYgZ2V0YXR0cih2YWx1ZSwgIl9faXNhYnN0cmFjdG1ldGhvZF9fIiwgRmFsc2UpOgorICAgICAgICAgICAgICAgICAgICBhYnN0cmFjdHMuYWRkKG5hbWUpCisgICAgICAgIGNscy5fX2Fic3RyYWN0bWV0aG9kc19fID0gZnJvemVuc2V0KGFic3RyYWN0cykKKyAgICAgICAgIyBTZXQgdXAgaW5oZXJpdGFuY2UgcmVnaXN0cnkKKyAgICAgICAgY2xzLl9hYmNfcmVnaXN0cnkgPSBXZWFrU2V0KCkKKyAgICAgICAgY2xzLl9hYmNfY2FjaGUgPSBXZWFrU2V0KCkKKyAgICAgICAgY2xzLl9hYmNfbmVnYXRpdmVfY2FjaGUgPSBXZWFrU2V0KCkKKyAgICAgICAgY2xzLl9hYmNfbmVnYXRpdmVfY2FjaGVfdmVyc2lvbiA9IEFCQ01ldGEuX2FiY19pbnZhbGlkYXRpb25fY291bnRlcgorICAgICAgICByZXR1cm4gY2xzCisKKyAgICBkZWYgcmVnaXN0ZXIoY2xzLCBzdWJjbGFzcyk6CisgICAgICAgICIiIlJlZ2lzdGVyIGEgdmlydHVhbCBzdWJjbGFzcyBvZiBhbiBBQkMuIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHN1YmNsYXNzLCAodHlwZSwgdHlwZXMuQ2xhc3NUeXBlKSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbiBvbmx5IHJlZ2lzdGVyIGNsYXNzZXMiKQorICAgICAgICBpZiBpc3N1YmNsYXNzKHN1YmNsYXNzLCBjbHMpOgorICAgICAgICAgICAgcmV0dXJuICAjIEFscmVhZHkgYSBzdWJjbGFzcworICAgICAgICAjIFN1YnRsZTogdGVzdCBmb3IgY3ljbGVzICphZnRlciogdGVzdGluZyBmb3IgImFscmVhZHkgYSBzdWJjbGFzcyI7CisgICAgICAgICMgdGhpcyBtZWFucyB3ZSBhbGxvdyBYLnJlZ2lzdGVyKFgpIGFuZCBpbnRlcnByZXQgaXQgYXMgYSBuby1vcC4KKyAgICAgICAgaWYgaXNzdWJjbGFzcyhjbHMsIHN1YmNsYXNzKToKKyAgICAgICAgICAgICMgVGhpcyB3b3VsZCBjcmVhdGUgYSBjeWNsZSwgd2hpY2ggaXMgYmFkIGZvciB0aGUgYWxnb3JpdGhtIGJlbG93CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlJlZnVzaW5nIHRvIGNyZWF0ZSBhbiBpbmhlcml0YW5jZSBjeWNsZSIpCisgICAgICAgIGNscy5fYWJjX3JlZ2lzdHJ5LmFkZChzdWJjbGFzcykKKyAgICAgICAgQUJDTWV0YS5fYWJjX2ludmFsaWRhdGlvbl9jb3VudGVyICs9IDEgICMgSW52YWxpZGF0ZSBuZWdhdGl2ZSBjYWNoZQorCisgICAgZGVmIF9kdW1wX3JlZ2lzdHJ5KGNscywgZmlsZT1Ob25lKToKKyAgICAgICAgIiIiRGVidWcgaGVscGVyIHRvIHByaW50IHRoZSBBQkMgcmVnaXN0cnkuIiIiCisgICAgICAgIHByaW50ID4+IGZpbGUsICJDbGFzczogJXMuJXMiICUgKGNscy5fX21vZHVsZV9fLCBjbHMuX19uYW1lX18pCisgICAgICAgIHByaW50ID4+IGZpbGUsICJJbnYuY291bnRlcjogJXMiICUgQUJDTWV0YS5fYWJjX2ludmFsaWRhdGlvbl9jb3VudGVyCisgICAgICAgIGZvciBuYW1lIGluIHNvcnRlZChjbHMuX19kaWN0X18ua2V5cygpKToKKyAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgiX2FiY18iKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoY2xzLCBuYW1lKQorICAgICAgICAgICAgICAgIHByaW50ID4+IGZpbGUsICIlczogJXIiICUgKG5hbWUsIHZhbHVlKQorCisgICAgZGVmIF9faW5zdGFuY2VjaGVja19fKGNscywgaW5zdGFuY2UpOgorICAgICAgICAiIiJPdmVycmlkZSBmb3IgaXNpbnN0YW5jZShpbnN0YW5jZSwgY2xzKS4iIiIKKyAgICAgICAgIyBJbmxpbmUgdGhlIGNhY2hlIGNoZWNraW5nIHdoZW4gaXQncyBzaW1wbGUuCisgICAgICAgIHN1YmNsYXNzID0gZ2V0YXR0cihpbnN0YW5jZSwgJ19fY2xhc3NfXycsIE5vbmUpCisgICAgICAgIGlmIHN1YmNsYXNzIGlzIG5vdCBOb25lIGFuZCBzdWJjbGFzcyBpbiBjbHMuX2FiY19jYWNoZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHN1YnR5cGUgPSB0eXBlKGluc3RhbmNlKQorICAgICAgICAjIE9sZC1zdHlsZSBpbnN0YW5jZXMKKyAgICAgICAgaWYgc3VidHlwZSBpcyBfSW5zdGFuY2VUeXBlOgorICAgICAgICAgICAgc3VidHlwZSA9IHN1YmNsYXNzCisgICAgICAgIGlmIHN1YnR5cGUgaXMgc3ViY2xhc3Mgb3Igc3ViY2xhc3MgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIChjbHMuX2FiY19uZWdhdGl2ZV9jYWNoZV92ZXJzaW9uID09CisgICAgICAgICAgICAgICAgQUJDTWV0YS5fYWJjX2ludmFsaWRhdGlvbl9jb3VudGVyIGFuZAorICAgICAgICAgICAgICAgIHN1YnR5cGUgaW4gY2xzLl9hYmNfbmVnYXRpdmVfY2FjaGUpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgIyBGYWxsIGJhY2sgdG8gdGhlIHN1YmNsYXNzIGNoZWNrLgorICAgICAgICAgICAgcmV0dXJuIGNscy5fX3N1YmNsYXNzY2hlY2tfXyhzdWJ0eXBlKQorICAgICAgICByZXR1cm4gKGNscy5fX3N1YmNsYXNzY2hlY2tfXyhzdWJjbGFzcykgb3IKKyAgICAgICAgICAgICAgICBjbHMuX19zdWJjbGFzc2NoZWNrX18oc3VidHlwZSkpCisKKyAgICBkZWYgX19zdWJjbGFzc2NoZWNrX18oY2xzLCBzdWJjbGFzcyk6CisgICAgICAgICIiIk92ZXJyaWRlIGZvciBpc3N1YmNsYXNzKHN1YmNsYXNzLCBjbHMpLiIiIgorICAgICAgICAjIENoZWNrIGNhY2hlCisgICAgICAgIGlmIHN1YmNsYXNzIGluIGNscy5fYWJjX2NhY2hlOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgIyBDaGVjayBuZWdhdGl2ZSBjYWNoZTsgbWF5IGhhdmUgdG8gaW52YWxpZGF0ZQorICAgICAgICBpZiBjbHMuX2FiY19uZWdhdGl2ZV9jYWNoZV92ZXJzaW9uIDwgQUJDTWV0YS5fYWJjX2ludmFsaWRhdGlvbl9jb3VudGVyOgorICAgICAgICAgICAgIyBJbnZhbGlkYXRlIHRoZSBuZWdhdGl2ZSBjYWNoZQorICAgICAgICAgICAgY2xzLl9hYmNfbmVnYXRpdmVfY2FjaGUgPSBXZWFrU2V0KCkKKyAgICAgICAgICAgIGNscy5fYWJjX25lZ2F0aXZlX2NhY2hlX3ZlcnNpb24gPSBBQkNNZXRhLl9hYmNfaW52YWxpZGF0aW9uX2NvdW50ZXIKKyAgICAgICAgZWxpZiBzdWJjbGFzcyBpbiBjbHMuX2FiY19uZWdhdGl2ZV9jYWNoZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAjIENoZWNrIHRoZSBzdWJjbGFzcyBob29rCisgICAgICAgIG9rID0gY2xzLl9fc3ViY2xhc3Nob29rX18oc3ViY2xhc3MpCisgICAgICAgIGlmIG9rIGlzIG5vdCBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG9rLCBib29sKQorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgY2xzLl9hYmNfY2FjaGUuYWRkKHN1YmNsYXNzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjbHMuX2FiY19uZWdhdGl2ZV9jYWNoZS5hZGQoc3ViY2xhc3MpCisgICAgICAgICAgICByZXR1cm4gb2sKKyAgICAgICAgIyBDaGVjayBpZiBpdCdzIGEgZGlyZWN0IHN1YmNsYXNzCisgICAgICAgIGlmIGNscyBpbiBnZXRhdHRyKHN1YmNsYXNzLCAnX19tcm9fXycsICgpKToKKyAgICAgICAgICAgIGNscy5fYWJjX2NhY2hlLmFkZChzdWJjbGFzcykKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgQ2hlY2sgaWYgaXQncyBhIHN1YmNsYXNzIG9mIGEgcmVnaXN0ZXJlZCBjbGFzcyAocmVjdXJzaXZlKQorICAgICAgICBmb3IgcmNscyBpbiBjbHMuX2FiY19yZWdpc3RyeToKKyAgICAgICAgICAgIGlmIGlzc3ViY2xhc3Moc3ViY2xhc3MsIHJjbHMpOgorICAgICAgICAgICAgICAgIGNscy5fYWJjX2NhY2hlLmFkZChzdWJjbGFzcykKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAjIENoZWNrIGlmIGl0J3MgYSBzdWJjbGFzcyBvZiBhIHN1YmNsYXNzIChyZWN1cnNpdmUpCisgICAgICAgIGZvciBzY2xzIGluIGNscy5fX3N1YmNsYXNzZXNfXygpOgorICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyhzdWJjbGFzcywgc2Nscyk6CisgICAgICAgICAgICAgICAgY2xzLl9hYmNfY2FjaGUuYWRkKHN1YmNsYXNzKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgTm8gZGljZTsgdXBkYXRlIG5lZ2F0aXZlIGNhY2hlCisgICAgICAgIGNscy5fYWJjX25lZ2F0aXZlX2NhY2hlLmFkZChzdWJjbGFzcykKKyAgICAgICAgcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FiYy5weWMgYi9saWIvcHl0aG9uMi43L2FiYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliYmEwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYWJjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FiYy5weW8gYi9saWIvcHl0aG9uMi43L2FiYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjYThjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYWJjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FpZmMucHkgYi9saWIvcHl0aG9uMi43L2FpZmMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBjZmU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYWlmYy5weQpAQCAtMCwwICsxLDk3NSBAQAorIiIiU3R1ZmYgdG8gcGFyc2UgQUlGRi1DIGFuZCBBSUZGIGZpbGVzLgorCitVbmxlc3MgZXhwbGljaXRseSBzdGF0ZWQgb3RoZXJ3aXNlLCB0aGUgZGVzY3JpcHRpb24gYmVsb3cgaXMgdHJ1ZQorYm90aCBmb3IgQUlGRi1DIGZpbGVzIGFuZCBBSUZGIGZpbGVzLgorCitBbiBBSUZGLUMgZmlsZSBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmUuCisKKyAgKy0tLS0tLS0tLS0tLS0tLS0tKworICB8IEZPUk0gICAgICAgICAgICB8CisgICstLS0tLS0tLS0tLS0tLS0tLSsKKyAgfCA8c2l6ZT4gICAgICAgICAgfAorICArLS0tLSstLS0tLS0tLS0tLS0rCisgIHwgICAgfCBBSUZDICAgICAgIHwKKyAgfCAgICArLS0tLS0tLS0tLS0tKworICB8ICAgIHwgPGNodW5rcz4gICB8CisgIHwgICAgfCAgICAuICAgICAgIHwKKyAgfCAgICB8ICAgIC4gICAgICAgfAorICB8ICAgIHwgICAgLiAgICAgICB8CisgICstLS0tKy0tLS0tLS0tLS0tLSsKKworQW4gQUlGRiBmaWxlIGhhcyB0aGUgc3RyaW5nICJBSUZGIiBpbnN0ZWFkIG9mICJBSUZDIi4KKworQSBjaHVuayBjb25zaXN0cyBvZiBhbiBpZGVudGlmaWVyICg0IGJ5dGVzKSBmb2xsb3dlZCBieSBhIHNpemUgKDQgYnl0ZXMsCitiaWcgZW5kaWFuIG9yZGVyKSwgZm9sbG93ZWQgYnkgdGhlIGRhdGEuICBUaGUgc2l6ZSBmaWVsZCBkb2VzIG5vdCBpbmNsdWRlCit0aGUgc2l6ZSBvZiB0aGUgOCBieXRlIGhlYWRlci4KKworVGhlIGZvbGxvd2luZyBjaHVuayB0eXBlcyBhcmUgcmVjb2duaXplZC4KKworICBGVkVSCisgICAgICA8dmVyc2lvbiBudW1iZXIgb2YgQUlGRi1DIGRlZmluaW5nIGRvY3VtZW50PiAoQUlGRi1DIG9ubHkpLgorICBNQVJLCisgICAgICA8IyBvZiBtYXJrZXJzPiAoMiBieXRlcykKKyAgICAgIGxpc3Qgb2YgbWFya2VyczoKKyAgICAgICAgICA8bWFya2VyIElEPiAoMiBieXRlcywgbXVzdCBiZSA+IDApCisgICAgICAgICAgPHBvc2l0aW9uPiAoNCBieXRlcykKKyAgICAgICAgICA8bWFya2VyIG5hbWU+ICgicHN0cmluZyIpCisgIENPTU0KKyAgICAgIDwjIG9mIGNoYW5uZWxzPiAoMiBieXRlcykKKyAgICAgIDwjIG9mIHNvdW5kIGZyYW1lcz4gKDQgYnl0ZXMpCisgICAgICA8c2l6ZSBvZiB0aGUgc2FtcGxlcz4gKDIgYnl0ZXMpCisgICAgICA8c2FtcGxpbmcgZnJlcXVlbmN5PiAoMTAgYnl0ZXMsIElFRUUgODAtYml0IGV4dGVuZGVkCisgICAgICAgICAgZmxvYXRpbmcgcG9pbnQpCisgICAgICBpbiBBSUZGLUMgZmlsZXMgb25seToKKyAgICAgIDxjb21wcmVzc2lvbiB0eXBlPiAoNCBieXRlcykKKyAgICAgIDxodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIGNvbXByZXNzaW9uIHR5cGU+ICgicHN0cmluZyIpCisgIFNTTkQKKyAgICAgIDxvZmZzZXQ+ICg0IGJ5dGVzLCBub3QgdXNlZCBieSB0aGlzIHByb2dyYW0pCisgICAgICA8YmxvY2tzaXplPiAoNCBieXRlcywgbm90IHVzZWQgYnkgdGhpcyBwcm9ncmFtKQorICAgICAgPHNvdW5kIGRhdGE+CisKK0EgcHN0cmluZyBjb25zaXN0cyBvZiAxIGJ5dGUgbGVuZ3RoLCBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzLCBhbmQgMCBvciAxCitieXRlIHBhZCB0byBtYWtlIHRoZSB0b3RhbCBsZW5ndGggZXZlbi4KKworVXNhZ2UuCisKK1JlYWRpbmcgQUlGRiBmaWxlczoKKyAgZiA9IGFpZmMub3BlbihmaWxlLCAncicpCit3aGVyZSBmaWxlIGlzIGVpdGhlciB0aGUgbmFtZSBvZiBhIGZpbGUgb3IgYW4gb3BlbiBmaWxlIHBvaW50ZXIuCitUaGUgb3BlbiBmaWxlIHBvaW50ZXIgbXVzdCBoYXZlIG1ldGhvZHMgcmVhZCgpLCBzZWVrKCksIGFuZCBjbG9zZSgpLgorSW4gc29tZSB0eXBlcyBvZiBhdWRpbyBmaWxlcywgaWYgdGhlIHNldHBvcygpIG1ldGhvZCBpcyBub3QgdXNlZCwKK3RoZSBzZWVrKCkgbWV0aG9kIGlzIG5vdCBuZWNlc3NhcnkuCisKK1RoaXMgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHdpdGggdGhlIGZvbGxvd2luZyBwdWJsaWMgbWV0aG9kczoKKyAgZ2V0bmNoYW5uZWxzKCkgIC0tIHJldHVybnMgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzICgxIGZvcgorICAgICAgICAgICAgIG1vbm8sIDIgZm9yIHN0ZXJlbykKKyAgZ2V0c2FtcHdpZHRoKCkgIC0tIHJldHVybnMgc2FtcGxlIHdpZHRoIGluIGJ5dGVzCisgIGdldGZyYW1lcmF0ZSgpICAtLSByZXR1cm5zIHNhbXBsaW5nIGZyZXF1ZW5jeQorICBnZXRuZnJhbWVzKCkgICAgLS0gcmV0dXJucyBudW1iZXIgb2YgYXVkaW8gZnJhbWVzCisgIGdldGNvbXB0eXBlKCkgICAtLSByZXR1cm5zIGNvbXByZXNzaW9uIHR5cGUgKCdOT05FJyBmb3IgQUlGRiBmaWxlcykKKyAgZ2V0Y29tcG5hbWUoKSAgIC0tIHJldHVybnMgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZgorICAgICAgICAgICAgIGNvbXByZXNzaW9uIHR5cGUgKCdub3QgY29tcHJlc3NlZCcgZm9yIEFJRkYgZmlsZXMpCisgIGdldHBhcmFtcygpIC0tIHJldHVybnMgYSB0dXBsZSBjb25zaXN0aW5nIG9mIGFsbCBvZiB0aGUKKyAgICAgICAgICAgICBhYm92ZSBpbiB0aGUgYWJvdmUgb3JkZXIKKyAgZ2V0bWFya2VycygpICAgIC0tIGdldCB0aGUgbGlzdCBvZiBtYXJrcyBpbiB0aGUgYXVkaW8gZmlsZSBvciBOb25lCisgICAgICAgICAgICAgaWYgdGhlcmUgYXJlIG5vIG1hcmtzCisgIGdldG1hcmsoaWQpIC0tIGdldCBtYXJrIHdpdGggdGhlIHNwZWNpZmllZCBpZCAocmFpc2VzIGFuIGVycm9yCisgICAgICAgICAgICAgaWYgdGhlIG1hcmsgZG9lcyBub3QgZXhpc3QpCisgIHJlYWRmcmFtZXMobikgICAtLSByZXR1cm5zIGF0IG1vc3QgbiBmcmFtZXMgb2YgYXVkaW8KKyAgcmV3aW5kKCkgICAgLS0gcmV3aW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHN0cmVhbQorICBzZXRwb3MocG9zKSAtLSBzZWVrIHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KKyAgdGVsbCgpICAgICAgLS0gcmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uCisgIGNsb3NlKCkgICAgIC0tIGNsb3NlIHRoZSBpbnN0YW5jZSAobWFrZSBpdCB1bnVzYWJsZSkKK1RoZSBwb3NpdGlvbiByZXR1cm5lZCBieSB0ZWxsKCksIHRoZSBwb3NpdGlvbiBnaXZlbiB0byBzZXRwb3MoKSBhbmQKK3RoZSBwb3NpdGlvbiBvZiBtYXJrcyBhcmUgYWxsIGNvbXBhdGlibGUgYW5kIGhhdmUgbm90aGluZyB0byBkbyB3aXRoCit0aGUgYWN0dWFsIHBvc2l0aW9uIGluIHRoZSBmaWxlLgorVGhlIGNsb3NlKCkgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGNsYXNzIGluc3RhbmNlCitpcyBkZXN0cm95ZWQuCisKK1dyaXRpbmcgQUlGRiBmaWxlczoKKyAgZiA9IGFpZmMub3BlbihmaWxlLCAndycpCit3aGVyZSBmaWxlIGlzIGVpdGhlciB0aGUgbmFtZSBvZiBhIGZpbGUgb3IgYW4gb3BlbiBmaWxlIHBvaW50ZXIuCitUaGUgb3BlbiBmaWxlIHBvaW50ZXIgbXVzdCBoYXZlIG1ldGhvZHMgd3JpdGUoKSwgdGVsbCgpLCBzZWVrKCksIGFuZAorY2xvc2UoKS4KKworVGhpcyByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEgY2xhc3Mgd2l0aCB0aGUgZm9sbG93aW5nIHB1YmxpYyBtZXRob2RzOgorICBhaWZmKCkgICAgICAtLSBjcmVhdGUgYW4gQUlGRiBmaWxlIChBSUZGLUMgZGVmYXVsdCkKKyAgYWlmYygpICAgICAgLS0gY3JlYXRlIGFuIEFJRkYtQyBmaWxlCisgIHNldG5jaGFubmVscyhuKSAtLSBzZXQgdGhlIG51bWJlciBvZiBjaGFubmVscworICBzZXRzYW1wd2lkdGgobikgLS0gc2V0IHRoZSBzYW1wbGUgd2lkdGgKKyAgc2V0ZnJhbWVyYXRlKG4pIC0tIHNldCB0aGUgZnJhbWUgcmF0ZQorICBzZXRuZnJhbWVzKG4pICAgLS0gc2V0IHRoZSBudW1iZXIgb2YgZnJhbWVzCisgIHNldGNvbXB0eXBlKHR5cGUsIG5hbWUpCisgICAgICAgICAgLS0gc2V0IHRoZSBjb21wcmVzc2lvbiB0eXBlIGFuZCB0aGUKKyAgICAgICAgICAgICBodW1hbi1yZWFkYWJsZSBjb21wcmVzc2lvbiB0eXBlCisgIHNldHBhcmFtcyh0dXBsZSkKKyAgICAgICAgICAtLSBzZXQgYWxsIHBhcmFtZXRlcnMgYXQgb25jZQorICBzZXRtYXJrKGlkLCBwb3MsIG5hbWUpCisgICAgICAgICAgLS0gYWRkIHNwZWNpZmllZCBtYXJrIHRvIHRoZSBsaXN0IG9mIG1hcmtzCisgIHRlbGwoKSAgICAgIC0tIHJldHVybiBjdXJyZW50IHBvc2l0aW9uIGluIG91dHB1dCBmaWxlICh1c2VmdWwKKyAgICAgICAgICAgICBpbiBjb21iaW5hdGlvbiB3aXRoIHNldG1hcmsoKSkKKyAgd3JpdGVmcmFtZXNyYXcoZGF0YSkKKyAgICAgICAgICAtLSB3cml0ZSBhdWRpbyBmcmFtZXMgd2l0aG91dCBwYXRoaW5nIHVwIHRoZQorICAgICAgICAgICAgIGZpbGUgaGVhZGVyCisgIHdyaXRlZnJhbWVzKGRhdGEpCisgICAgICAgICAgLS0gd3JpdGUgYXVkaW8gZnJhbWVzIGFuZCBwYXRjaCB1cCB0aGUgZmlsZSBoZWFkZXIKKyAgY2xvc2UoKSAgICAgLS0gcGF0Y2ggdXAgdGhlIGZpbGUgaGVhZGVyIGFuZCBjbG9zZSB0aGUKKyAgICAgICAgICAgICBvdXRwdXQgZmlsZQorWW91IHNob3VsZCBzZXQgdGhlIHBhcmFtZXRlcnMgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZWZyYW1lc3JhdyBvcgord3JpdGVmcmFtZXMuICBUaGUgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldCwKK2J1dCB3aGVuIGl0IGlzIHNldCB0byB0aGUgY29ycmVjdCB2YWx1ZSwgdGhlIGhlYWRlciBkb2VzIG5vdCBoYXZlIHRvCitiZSBwYXRjaGVkIHVwLgorSXQgaXMgYmVzdCB0byBmaXJzdCBzZXQgYWxsIHBhcmFtZXRlcnMsIHBlcmhhcHMgcG9zc2libHkgdGhlCitjb21wcmVzc2lvbiB0eXBlLCBhbmQgdGhlbiB3cml0ZSBhdWRpbyBmcmFtZXMgdXNpbmcgd3JpdGVmcmFtZXNyYXcuCitXaGVuIGFsbCBmcmFtZXMgaGF2ZSBiZWVuIHdyaXR0ZW4sIGVpdGhlciBjYWxsIHdyaXRlZnJhbWVzKCcnKSBvcgorY2xvc2UoKSB0byBwYXRjaCB1cCB0aGUgc2l6ZXMgaW4gdGhlIGhlYWRlci4KK01hcmtzIGNhbiBiZSBhZGRlZCBhbnl0aW1lLiAgSWYgdGhlcmUgYXJlIGFueSBtYXJrcywgeXB1IG11c3QgY2FsbAorY2xvc2UoKSBhZnRlciBhbGwgZnJhbWVzIGhhdmUgYmVlbiB3cml0dGVuLgorVGhlIGNsb3NlKCkgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGNsYXNzIGluc3RhbmNlCitpcyBkZXN0cm95ZWQuCisKK1doZW4gYSBmaWxlIGlzIG9wZW5lZCB3aXRoIHRoZSBleHRlbnNpb24gJy5haWZmJywgYW4gQUlGRiBmaWxlIGlzCit3cml0dGVuLCBvdGhlcndpc2UgYW4gQUlGRi1DIGZpbGUgaXMgd3JpdHRlbi4gIFRoaXMgZGVmYXVsdCBjYW4gYmUKK2NoYW5nZWQgYnkgY2FsbGluZyBhaWZmKCkgb3IgYWlmYygpIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGVmcmFtZXMgb3IKK3dyaXRlZnJhbWVzcmF3LgorIiIiCisKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBfX2J1aWx0aW5fXworCitfX2FsbF9fID0gWyJFcnJvciIsIm9wZW4iLCJvcGVuZnAiXQorCitjbGFzcyBFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworX0FJRkNfdmVyc2lvbiA9IDB4QTI4MDUxNDBMICAgICAjIFZlcnNpb24gMSBvZiBBSUZGLUMKKworZGVmIF9yZWFkX2xvbmcoZmlsZSk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPmwnLCBmaWxlLnJlYWQoNCkpWzBdCisgICAgZXhjZXB0IHN0cnVjdC5lcnJvcjoKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IKKworZGVmIF9yZWFkX3Vsb25nKGZpbGUpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJz5MJywgZmlsZS5yZWFkKDQpKVswXQorICAgIGV4Y2VwdCBzdHJ1Y3QuZXJyb3I6CisgICAgICAgIHJhaXNlIEVPRkVycm9yCisKK2RlZiBfcmVhZF9zaG9ydChmaWxlKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCc+aCcsIGZpbGUucmVhZCgyKSlbMF0KKyAgICBleGNlcHQgc3RydWN0LmVycm9yOgorICAgICAgICByYWlzZSBFT0ZFcnJvcgorCitkZWYgX3JlYWRfdXNob3J0KGZpbGUpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJz5IJywgZmlsZS5yZWFkKDIpKVswXQorICAgIGV4Y2VwdCBzdHJ1Y3QuZXJyb3I6CisgICAgICAgIHJhaXNlIEVPRkVycm9yCisKK2RlZiBfcmVhZF9zdHJpbmcoZmlsZSk6CisgICAgbGVuZ3RoID0gb3JkKGZpbGUucmVhZCgxKSkKKyAgICBpZiBsZW5ndGggPT0gMDoKKyAgICAgICAgZGF0YSA9ICcnCisgICAgZWxzZToKKyAgICAgICAgZGF0YSA9IGZpbGUucmVhZChsZW5ndGgpCisgICAgaWYgbGVuZ3RoICYgMSA9PSAwOgorICAgICAgICBkdW1teSA9IGZpbGUucmVhZCgxKQorICAgIHJldHVybiBkYXRhCisKK19IVUdFX1ZBTCA9IDEuNzk3NjkzMTM0ODYyMzFlKzMwOCAjIFNlZSA8bGltaXRzLmg+CisKK2RlZiBfcmVhZF9mbG9hdChmKTogIyAxMCBieXRlcworICAgIGV4cG9uID0gX3JlYWRfc2hvcnQoZikgIyAyIGJ5dGVzCisgICAgc2lnbiA9IDEKKyAgICBpZiBleHBvbiA8IDA6CisgICAgICAgIHNpZ24gPSAtMQorICAgICAgICBleHBvbiA9IGV4cG9uICsgMHg4MDAwCisgICAgaGltYW50ID0gX3JlYWRfdWxvbmcoZikgIyA0IGJ5dGVzCisgICAgbG9tYW50ID0gX3JlYWRfdWxvbmcoZikgIyA0IGJ5dGVzCisgICAgaWYgZXhwb24gPT0gaGltYW50ID09IGxvbWFudCA9PSAwOgorICAgICAgICBmID0gMC4wCisgICAgZWxpZiBleHBvbiA9PSAweDdGRkY6CisgICAgICAgIGYgPSBfSFVHRV9WQUwKKyAgICBlbHNlOgorICAgICAgICBleHBvbiA9IGV4cG9uIC0gMTYzODMKKyAgICAgICAgZiA9IChoaW1hbnQgKiAweDEwMDAwMDAwMEwgKyBsb21hbnQpICogcG93KDIuMCwgZXhwb24gLSA2MykKKyAgICByZXR1cm4gc2lnbiAqIGYKKworZGVmIF93cml0ZV9zaG9ydChmLCB4KToKKyAgICBmLndyaXRlKHN0cnVjdC5wYWNrKCc+aCcsIHgpKQorCitkZWYgX3dyaXRlX3VzaG9ydChmLCB4KToKKyAgICBmLndyaXRlKHN0cnVjdC5wYWNrKCc+SCcsIHgpKQorCitkZWYgX3dyaXRlX2xvbmcoZiwgeCk6CisgICAgZi53cml0ZShzdHJ1Y3QucGFjaygnPmwnLCB4KSkKKworZGVmIF93cml0ZV91bG9uZyhmLCB4KToKKyAgICBmLndyaXRlKHN0cnVjdC5wYWNrKCc+TCcsIHgpKQorCitkZWYgX3dyaXRlX3N0cmluZyhmLCBzKToKKyAgICBpZiBsZW4ocykgPiAyNTU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInN0cmluZyBleGNlZWRzIG1heGltdW0gcHN0cmluZyBsZW5ndGgiKQorICAgIGYud3JpdGUoc3RydWN0LnBhY2soJ0InLCBsZW4ocykpKQorICAgIGYud3JpdGUocykKKyAgICBpZiBsZW4ocykgJiAxID09IDA6CisgICAgICAgIGYud3JpdGUoY2hyKDApKQorCitkZWYgX3dyaXRlX2Zsb2F0KGYsIHgpOgorICAgIGltcG9ydCBtYXRoCisgICAgaWYgeCA8IDA6CisgICAgICAgIHNpZ24gPSAweDgwMDAKKyAgICAgICAgeCA9IHggKiAtMQorICAgIGVsc2U6CisgICAgICAgIHNpZ24gPSAwCisgICAgaWYgeCA9PSAwOgorICAgICAgICBleHBvbiA9IDAKKyAgICAgICAgaGltYW50ID0gMAorICAgICAgICBsb21hbnQgPSAwCisgICAgZWxzZToKKyAgICAgICAgZm1hbnQsIGV4cG9uID0gbWF0aC5mcmV4cCh4KQorICAgICAgICBpZiBleHBvbiA+IDE2Mzg0IG9yIGZtYW50ID49IDEgb3IgZm1hbnQgIT0gZm1hbnQ6ICMgSW5maW5pdHkgb3IgTmFOCisgICAgICAgICAgICBleHBvbiA9IHNpZ258MHg3RkZGCisgICAgICAgICAgICBoaW1hbnQgPSAwCisgICAgICAgICAgICBsb21hbnQgPSAwCisgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICMgRmluaXRlCisgICAgICAgICAgICBleHBvbiA9IGV4cG9uICsgMTYzODIKKyAgICAgICAgICAgIGlmIGV4cG9uIDwgMDogICAgICAgICAgICMgZGVub3JtYWxpemVkCisgICAgICAgICAgICAgICAgZm1hbnQgPSBtYXRoLmxkZXhwKGZtYW50LCBleHBvbikKKyAgICAgICAgICAgICAgICBleHBvbiA9IDAKKyAgICAgICAgICAgIGV4cG9uID0gZXhwb24gfCBzaWduCisgICAgICAgICAgICBmbWFudCA9IG1hdGgubGRleHAoZm1hbnQsIDMyKQorICAgICAgICAgICAgZnNtYW50ID0gbWF0aC5mbG9vcihmbWFudCkKKyAgICAgICAgICAgIGhpbWFudCA9IGxvbmcoZnNtYW50KQorICAgICAgICAgICAgZm1hbnQgPSBtYXRoLmxkZXhwKGZtYW50IC0gZnNtYW50LCAzMikKKyAgICAgICAgICAgIGZzbWFudCA9IG1hdGguZmxvb3IoZm1hbnQpCisgICAgICAgICAgICBsb21hbnQgPSBsb25nKGZzbWFudCkKKyAgICBfd3JpdGVfdXNob3J0KGYsIGV4cG9uKQorICAgIF93cml0ZV91bG9uZyhmLCBoaW1hbnQpCisgICAgX3dyaXRlX3Vsb25nKGYsIGxvbWFudCkKKworZnJvbSBjaHVuayBpbXBvcnQgQ2h1bmsKKworY2xhc3MgQWlmY19yZWFkOgorICAgICMgVmFyaWFibGVzIHVzZWQgaW4gdGhpcyBjbGFzczoKKyAgICAjCisgICAgIyBUaGVzZSB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSB0byB0aGUgdXNlciB0aG91Z2ggYXBwcm9wcmlhdGUKKyAgICAjIG1ldGhvZHMgb2YgdGhpcyBjbGFzczoKKyAgICAjIF9maWxlIC0tIHRoZSBvcGVuIGZpbGUgd2l0aCBtZXRob2RzIHJlYWQoKSwgY2xvc2UoKSwgYW5kIHNlZWsoKQorICAgICMgICAgICAgc2V0IHRocm91Z2ggdGhlIF9faW5pdF9fKCkgbWV0aG9kCisgICAgIyBfbmNoYW5uZWxzIC0tIHRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMKKyAgICAjICAgICAgIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBnZXRuY2hhbm5lbHMoKSBtZXRob2QKKyAgICAjIF9uZnJhbWVzIC0tIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzCisgICAgIyAgICAgICBhdmFpbGFibGUgdGhyb3VnaCB0aGUgZ2V0bmZyYW1lcygpIG1ldGhvZAorICAgICMgX3NhbXB3aWR0aCAtLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBhdWRpbyBzYW1wbGUKKyAgICAjICAgICAgIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBnZXRzYW1wd2lkdGgoKSBtZXRob2QKKyAgICAjIF9mcmFtZXJhdGUgLS0gdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeQorICAgICMgICAgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGdldGZyYW1lcmF0ZSgpIG1ldGhvZAorICAgICMgX2NvbXB0eXBlIC0tIHRoZSBBSUZGLUMgY29tcHJlc3Npb24gdHlwZSAoJ05PTkUnIGlmIEFJRkYpCisgICAgIyAgICAgICBhdmFpbGFibGUgdGhyb3VnaCB0aGUgZ2V0Y29tcHR5cGUoKSBtZXRob2QKKyAgICAjIF9jb21wbmFtZSAtLSB0aGUgaHVtYW4tcmVhZGFibGUgQUlGRi1DIGNvbXByZXNzaW9uIHR5cGUKKyAgICAjICAgICAgIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBnZXRjb21wdHlwZSgpIG1ldGhvZAorICAgICMgX21hcmtlcnMgLS0gdGhlIG1hcmtzIGluIHRoZSBhdWRpbyBmaWxlCisgICAgIyAgICAgICBhdmFpbGFibGUgdGhyb3VnaCB0aGUgZ2V0bWFya2VycygpIGFuZCBnZXRtYXJrKCkKKyAgICAjICAgICAgIG1ldGhvZHMKKyAgICAjIF9zb3VuZHBvcyAtLSB0aGUgcG9zaXRpb24gaW4gdGhlIGF1ZGlvIHN0cmVhbQorICAgICMgICAgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHRlbGwoKSBtZXRob2QsIHNldCB0aHJvdWdoIHRoZQorICAgICMgICAgICAgc2V0cG9zKCkgbWV0aG9kCisgICAgIworICAgICMgVGhlc2UgdmFyaWFibGVzIGFyZSB1c2VkIGludGVybmFsbHkgb25seToKKyAgICAjIF92ZXJzaW9uIC0tIHRoZSBBSUZGLUMgdmVyc2lvbiBudW1iZXIKKyAgICAjIF9kZWNvbXAgLS0gdGhlIGRlY29tcHJlc3NvciBmcm9tIGJ1aWx0aW4gbW9kdWxlIGNsCisgICAgIyBfY29tbV9jaHVua19yZWFkIC0tIDEgaWZmIHRoZSBDT01NIGNodW5rIGhhcyBiZWVuIHJlYWQKKyAgICAjIF9haWZjIC0tIDEgaWZmIHJlYWRpbmcgYW4gQUlGRi1DIGZpbGUKKyAgICAjIF9zc25kX3NlZWtfbmVlZGVkIC0tIDEgaWZmIHBvc2l0aW9uZWQgY29ycmVjdGx5IGluIGF1ZGlvCisgICAgIyAgICAgICBmaWxlIGZvciByZWFkZnJhbWVzKCkKKyAgICAjIF9zc25kX2NodW5rIC0tIGluc3RhbnRpYXRpb24gb2YgYSBjaHVuayBjbGFzcyBmb3IgdGhlIFNTTkQgY2h1bmsKKyAgICAjIF9mcmFtZXNpemUgLS0gc2l6ZSBvZiBvbmUgZnJhbWUgaW4gdGhlIGZpbGUKKworICAgIGRlZiBpbml0ZnAoc2VsZiwgZmlsZSk6CisgICAgICAgIHNlbGYuX3ZlcnNpb24gPSAwCisgICAgICAgIHNlbGYuX2RlY29tcCA9IE5vbmUKKyAgICAgICAgc2VsZi5fY29udmVydCA9IE5vbmUKKyAgICAgICAgc2VsZi5fbWFya2VycyA9IFtdCisgICAgICAgIHNlbGYuX3NvdW5kcG9zID0gMAorICAgICAgICBzZWxmLl9maWxlID0gZmlsZQorICAgICAgICBjaHVuayA9IENodW5rKGZpbGUpCisgICAgICAgIGlmIGNodW5rLmdldG5hbWUoKSAhPSAnRk9STSc6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2ZpbGUgZG9lcyBub3Qgc3RhcnQgd2l0aCBGT1JNIGlkJworICAgICAgICBmb3JtZGF0YSA9IGNodW5rLnJlYWQoNCkKKyAgICAgICAgaWYgZm9ybWRhdGEgPT0gJ0FJRkYnOgorICAgICAgICAgICAgc2VsZi5fYWlmYyA9IDAKKyAgICAgICAgZWxpZiBmb3JtZGF0YSA9PSAnQUlGQyc6CisgICAgICAgICAgICBzZWxmLl9haWZjID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdub3QgYW4gQUlGRiBvciBBSUZGLUMgZmlsZScKKyAgICAgICAgc2VsZi5fY29tbV9jaHVua19yZWFkID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgc2VsZi5fc3NuZF9zZWVrX25lZWRlZCA9IDEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjaHVuayA9IENodW5rKHNlbGYuX2ZpbGUpCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNodW5rbmFtZSA9IGNodW5rLmdldG5hbWUoKQorICAgICAgICAgICAgaWYgY2h1bmtuYW1lID09ICdDT01NJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9yZWFkX2NvbW1fY2h1bmsoY2h1bmspCisgICAgICAgICAgICAgICAgc2VsZi5fY29tbV9jaHVua19yZWFkID0gMQorICAgICAgICAgICAgZWxpZiBjaHVua25hbWUgPT0gJ1NTTkQnOgorICAgICAgICAgICAgICAgIHNlbGYuX3NzbmRfY2h1bmsgPSBjaHVuaworICAgICAgICAgICAgICAgIGR1bW15ID0gY2h1bmsucmVhZCg4KQorICAgICAgICAgICAgICAgIHNlbGYuX3NzbmRfc2Vla19uZWVkZWQgPSAwCisgICAgICAgICAgICBlbGlmIGNodW5rbmFtZSA9PSAnRlZFUic6CisgICAgICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IF9yZWFkX3Vsb25nKGNodW5rKQorICAgICAgICAgICAgZWxpZiBjaHVua25hbWUgPT0gJ01BUksnOgorICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRtYXJrKGNodW5rKQorICAgICAgICAgICAgY2h1bmsuc2tpcCgpCisgICAgICAgIGlmIG5vdCBzZWxmLl9jb21tX2NodW5rX3JlYWQgb3Igbm90IHNlbGYuX3NzbmRfY2h1bms6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ0NPTU0gY2h1bmsgYW5kL29yIFNTTkQgY2h1bmsgbWlzc2luZycKKyAgICAgICAgaWYgc2VsZi5fYWlmYyBhbmQgc2VsZi5fZGVjb21wOgorICAgICAgICAgICAgaW1wb3J0IGNsCisgICAgICAgICAgICBwYXJhbXMgPSBbY2wuT1JJR0lOQUxfRk9STUFULCAwLAorICAgICAgICAgICAgICAgICAgY2wuQklUU19QRVJfQ09NUE9ORU5ULCBzZWxmLl9zYW1wd2lkdGggKiA4LAorICAgICAgICAgICAgICAgICAgY2wuRlJBTUVfUkFURSwgc2VsZi5fZnJhbWVyYXRlXQorICAgICAgICAgICAgaWYgc2VsZi5fbmNoYW5uZWxzID09IDE6CisgICAgICAgICAgICAgICAgcGFyYW1zWzFdID0gY2wuTU9OTworICAgICAgICAgICAgZWxpZiBzZWxmLl9uY2hhbm5lbHMgPT0gMjoKKyAgICAgICAgICAgICAgICBwYXJhbXNbMV0gPSBjbC5TVEVSRU9fSU5URVJMRUFWRUQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY29tcHJlc3MgbW9yZSB0aGFuIDIgY2hhbm5lbHMnCisgICAgICAgICAgICBzZWxmLl9kZWNvbXAuU2V0UGFyYW1zKHBhcmFtcykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmKToKKyAgICAgICAgaWYgdHlwZShmKSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgIGYgPSBfX2J1aWx0aW5fXy5vcGVuKGYsICdyYicpCisgICAgICAgICMgZWxzZSwgYXNzdW1lIGl0IGlzIGFuIG9wZW4gZmlsZSBvYmplY3QgYWxyZWFkeQorICAgICAgICBzZWxmLmluaXRmcChmKQorCisgICAgIworICAgICMgVXNlciB2aXNpYmxlIG1ldGhvZHMuCisgICAgIworICAgIGRlZiBnZXRmcChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUKKworICAgIGRlZiByZXdpbmQoc2VsZik6CisgICAgICAgIHNlbGYuX3NzbmRfc2Vla19uZWVkZWQgPSAxCisgICAgICAgIHNlbGYuX3NvdW5kcG9zID0gMAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9kZWNvbXA6CisgICAgICAgICAgICBzZWxmLl9kZWNvbXAuQ2xvc2VEZWNvbXByZXNzb3IoKQorICAgICAgICAgICAgc2VsZi5fZGVjb21wID0gTm9uZQorICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc291bmRwb3MKKworICAgIGRlZiBnZXRuY2hhbm5lbHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uY2hhbm5lbHMKKworICAgIGRlZiBnZXRuZnJhbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmZyYW1lcworCisgICAgZGVmIGdldHNhbXB3aWR0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NhbXB3aWR0aAorCisgICAgZGVmIGdldGZyYW1lcmF0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZyYW1lcmF0ZQorCisgICAgZGVmIGdldGNvbXB0eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29tcHR5cGUKKworICAgIGRlZiBnZXRjb21wbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBuYW1lCisKKyMjICBkZWYgZ2V0dmVyc2lvbihzZWxmKToKKyMjICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KKworICAgIGRlZiBnZXRwYXJhbXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmdldG5jaGFubmVscygpLCBzZWxmLmdldHNhbXB3aWR0aCgpLCBcCisgICAgICAgICAgICAgIHNlbGYuZ2V0ZnJhbWVyYXRlKCksIHNlbGYuZ2V0bmZyYW1lcygpLCBcCisgICAgICAgICAgICAgIHNlbGYuZ2V0Y29tcHR5cGUoKSwgc2VsZi5nZXRjb21wbmFtZSgpCisKKyAgICBkZWYgZ2V0bWFya2VycyhzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX21hcmtlcnMpID09IDA6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5fbWFya2VycworCisgICAgZGVmIGdldG1hcmsoc2VsZiwgaWQpOgorICAgICAgICBmb3IgbWFya2VyIGluIHNlbGYuX21hcmtlcnM6CisgICAgICAgICAgICBpZiBpZCA9PSBtYXJrZXJbMF06CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcmtlcgorICAgICAgICByYWlzZSBFcnJvciwgJ21hcmtlciAlciBkb2VzIG5vdCBleGlzdCcgJSAoaWQsKQorCisgICAgZGVmIHNldHBvcyhzZWxmLCBwb3MpOgorICAgICAgICBpZiBwb3MgPCAwIG9yIHBvcyA+IHNlbGYuX25mcmFtZXM6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3Bvc2l0aW9uIG5vdCBpbiByYW5nZScKKyAgICAgICAgc2VsZi5fc291bmRwb3MgPSBwb3MKKyAgICAgICAgc2VsZi5fc3NuZF9zZWVrX25lZWRlZCA9IDEKKworICAgIGRlZiByZWFkZnJhbWVzKHNlbGYsIG5mcmFtZXMpOgorICAgICAgICBpZiBzZWxmLl9zc25kX3NlZWtfbmVlZGVkOgorICAgICAgICAgICAgc2VsZi5fc3NuZF9jaHVuay5zZWVrKDApCisgICAgICAgICAgICBkdW1teSA9IHNlbGYuX3NzbmRfY2h1bmsucmVhZCg4KQorICAgICAgICAgICAgcG9zID0gc2VsZi5fc291bmRwb3MgKiBzZWxmLl9mcmFtZXNpemUKKyAgICAgICAgICAgIGlmIHBvczoKKyAgICAgICAgICAgICAgICBzZWxmLl9zc25kX2NodW5rLnNlZWsocG9zICsgOCkKKyAgICAgICAgICAgIHNlbGYuX3NzbmRfc2Vla19uZWVkZWQgPSAwCisgICAgICAgIGlmIG5mcmFtZXMgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICBkYXRhID0gc2VsZi5fc3NuZF9jaHVuay5yZWFkKG5mcmFtZXMgKiBzZWxmLl9mcmFtZXNpemUpCisgICAgICAgIGlmIHNlbGYuX2NvbnZlcnQgYW5kIGRhdGE6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5fY29udmVydChkYXRhKQorICAgICAgICBzZWxmLl9zb3VuZHBvcyA9IHNlbGYuX3NvdW5kcG9zICsgbGVuKGRhdGEpIC8vIChzZWxmLl9uY2hhbm5lbHMgKiBzZWxmLl9zYW1wd2lkdGgpCisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICAjCisgICAgIyBJbnRlcm5hbCBtZXRob2RzLgorICAgICMKKworICAgIGRlZiBfZGVjb21wX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIGltcG9ydCBjbAorICAgICAgICBkdW1teSA9IHNlbGYuX2RlY29tcC5TZXRQYXJhbShjbC5GUkFNRV9CVUZGRVJfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGRhdGEpICogMikKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RlY29tcC5EZWNvbXByZXNzKGxlbihkYXRhKSAvLyBzZWxmLl9uY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKQorCisgICAgZGVmIF91bGF3MmxpbihzZWxmLCBkYXRhKToKKyAgICAgICAgaW1wb3J0IGF1ZGlvb3AKKyAgICAgICAgcmV0dXJuIGF1ZGlvb3AudWxhdzJsaW4oZGF0YSwgMikKKworICAgIGRlZiBfYWRwY20ybGluKHNlbGYsIGRhdGEpOgorICAgICAgICBpbXBvcnQgYXVkaW9vcAorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnX2FkcGNtc3RhdGUnKToKKyAgICAgICAgICAgICMgZmlyc3QgdGltZQorICAgICAgICAgICAgc2VsZi5fYWRwY21zdGF0ZSA9IE5vbmUKKyAgICAgICAgZGF0YSwgc2VsZi5fYWRwY21zdGF0ZSA9IGF1ZGlvb3AuYWRwY20ybGluKGRhdGEsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYWRwY21zdGF0ZSkKKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgIGRlZiBfcmVhZF9jb21tX2NodW5rKHNlbGYsIGNodW5rKToKKyAgICAgICAgc2VsZi5fbmNoYW5uZWxzID0gX3JlYWRfc2hvcnQoY2h1bmspCisgICAgICAgIHNlbGYuX25mcmFtZXMgPSBfcmVhZF9sb25nKGNodW5rKQorICAgICAgICBzZWxmLl9zYW1wd2lkdGggPSAoX3JlYWRfc2hvcnQoY2h1bmspICsgNykgLy8gOAorICAgICAgICBzZWxmLl9mcmFtZXJhdGUgPSBpbnQoX3JlYWRfZmxvYXQoY2h1bmspKQorICAgICAgICBzZWxmLl9mcmFtZXNpemUgPSBzZWxmLl9uY2hhbm5lbHMgKiBzZWxmLl9zYW1wd2lkdGgKKyAgICAgICAgaWYgc2VsZi5fYWlmYzoKKyAgICAgICAgICAgICNERUJVRzogU0dJJ3Mgc291bmRlZGl0b3IgcHJvZHVjZXMgYSBiYWQgc2l6ZSA6LSgKKyAgICAgICAgICAgIGtsdWRnZSA9IDAKKyAgICAgICAgICAgIGlmIGNodW5rLmNodW5rc2l6ZSA9PSAxODoKKyAgICAgICAgICAgICAgICBrbHVkZ2UgPSAxCisgICAgICAgICAgICAgICAgcHJpbnQgJ1dhcm5pbmc6IGJhZCBDT01NIGNodW5rIHNpemUnCisgICAgICAgICAgICAgICAgY2h1bmsuY2h1bmtzaXplID0gMjMKKyAgICAgICAgICAgICNERUJVRyBlbmQKKyAgICAgICAgICAgIHNlbGYuX2NvbXB0eXBlID0gY2h1bmsucmVhZCg0KQorICAgICAgICAgICAgI0RFQlVHIHN0YXJ0CisgICAgICAgICAgICBpZiBrbHVkZ2U6CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gb3JkKGNodW5rLmZpbGUucmVhZCgxKSkKKyAgICAgICAgICAgICAgICBpZiBsZW5ndGggJiAxID09IDA6CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCArIDEKKyAgICAgICAgICAgICAgICBjaHVuay5jaHVua3NpemUgPSBjaHVuay5jaHVua3NpemUgKyBsZW5ndGgKKyAgICAgICAgICAgICAgICBjaHVuay5maWxlLnNlZWsoLTEsIDEpCisgICAgICAgICAgICAjREVCVUcgZW5kCisgICAgICAgICAgICBzZWxmLl9jb21wbmFtZSA9IF9yZWFkX3N0cmluZyhjaHVuaykKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlICE9ICdOT05FJzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9jb21wdHlwZSA9PSAnRzcyMic6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBhdWRpb29wCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbnZlcnQgPSBzZWxmLl9hZHBjbTJsaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX2ZyYW1lc2l6ZSAvLyA0CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAjIGZvciBVTEFXIGFuZCBBTEFXIHRyeSBDb21wcmVzc2lvbiBMaWJyYXJ5CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgY2wKKyAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlID09ICdVTEFXJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYXVkaW9vcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbnZlcnQgPSBzZWxmLl91bGF3MmxpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX2ZyYW1lc2l6ZSAvLyAyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCByZWFkIGNvbXByZXNzZWQgQUlGRi1DIGZpbGVzJworICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlID09ICdVTEFXJzoKKyAgICAgICAgICAgICAgICAgICAgc2NoZW1lID0gY2wuRzcxMV9VTEFXCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX2ZyYW1lc2l6ZSAvLyAyCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLl9jb21wdHlwZSA9PSAnQUxBVyc6CisgICAgICAgICAgICAgICAgICAgIHNjaGVtZSA9IGNsLkc3MTFfQUxBVworICAgICAgICAgICAgICAgICAgICBzZWxmLl9mcmFtZXNpemUgPSBzZWxmLl9mcmFtZXNpemUgLy8gMgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAndW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gdHlwZScKKyAgICAgICAgICAgICAgICBzZWxmLl9kZWNvbXAgPSBjbC5PcGVuRGVjb21wcmVzc29yKHNjaGVtZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9jb252ZXJ0ID0gc2VsZi5fZGVjb21wX2RhdGEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2NvbXB0eXBlID0gJ05PTkUnCisgICAgICAgICAgICBzZWxmLl9jb21wbmFtZSA9ICdub3QgY29tcHJlc3NlZCcKKworICAgIGRlZiBfcmVhZG1hcmsoc2VsZiwgY2h1bmspOgorICAgICAgICBubWFya2VycyA9IF9yZWFkX3Nob3J0KGNodW5rKQorICAgICAgICAjIFNvbWUgZmlsZXMgYXBwZWFyIHRvIGNvbnRhaW4gaW52YWxpZCBjb3VudHMuCisgICAgICAgICMgQ29wZSB3aXRoIHRoaXMgYnkgdGVzdGluZyBmb3IgRU9GLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShubWFya2Vycyk6CisgICAgICAgICAgICAgICAgaWQgPSBfcmVhZF9zaG9ydChjaHVuaykKKyAgICAgICAgICAgICAgICBwb3MgPSBfcmVhZF9sb25nKGNodW5rKQorICAgICAgICAgICAgICAgIG5hbWUgPSBfcmVhZF9zdHJpbmcoY2h1bmspCisgICAgICAgICAgICAgICAgaWYgcG9zIG9yIG5hbWU6CisgICAgICAgICAgICAgICAgICAgICMgc29tZSBmaWxlcyBhcHBlYXIgdG8gaGF2ZQorICAgICAgICAgICAgICAgICAgICAjIGR1bW15IG1hcmtlcnMgY29uc2lzdGluZyBvZgorICAgICAgICAgICAgICAgICAgICAjIGEgcG9zaXRpb24gMCBhbmQgbmFtZSAnJworICAgICAgICAgICAgICAgICAgICBzZWxmLl9tYXJrZXJzLmFwcGVuZCgoaWQsIHBvcywgbmFtZSkpCisgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgIHByaW50ICdXYXJuaW5nOiBNQVJLIGNodW5rIGNvbnRhaW5zIG9ubHknLAorICAgICAgICAgICAgcHJpbnQgbGVuKHNlbGYuX21hcmtlcnMpLAorICAgICAgICAgICAgaWYgbGVuKHNlbGYuX21hcmtlcnMpID09IDE6IHByaW50ICdtYXJrZXInLAorICAgICAgICAgICAgZWxzZTogcHJpbnQgJ21hcmtlcnMnLAorICAgICAgICAgICAgcHJpbnQgJ2luc3RlYWQgb2YnLCBubWFya2VycworCitjbGFzcyBBaWZjX3dyaXRlOgorICAgICMgVmFyaWFibGVzIHVzZWQgaW4gdGhpcyBjbGFzczoKKyAgICAjCisgICAgIyBUaGVzZSB2YXJpYWJsZXMgYXJlIHVzZXIgc2V0dGFibGUgdGhyb3VnaCBhcHByb3ByaWF0ZSBtZXRob2RzCisgICAgIyBvZiB0aGlzIGNsYXNzOgorICAgICMgX2ZpbGUgLS0gdGhlIG9wZW4gZmlsZSB3aXRoIG1ldGhvZHMgd3JpdGUoKSwgY2xvc2UoKSwgdGVsbCgpLCBzZWVrKCkKKyAgICAjICAgICAgIHNldCB0aHJvdWdoIHRoZSBfX2luaXRfXygpIG1ldGhvZAorICAgICMgX2NvbXB0eXBlIC0tIHRoZSBBSUZGLUMgY29tcHJlc3Npb24gdHlwZSAoJ05PTkUnIGluIEFJRkYpCisgICAgIyAgICAgICBzZXQgdGhyb3VnaCB0aGUgc2V0Y29tcHR5cGUoKSBvciBzZXRwYXJhbXMoKSBtZXRob2QKKyAgICAjIF9jb21wbmFtZSAtLSB0aGUgaHVtYW4tcmVhZGFibGUgQUlGRi1DIGNvbXByZXNzaW9uIHR5cGUKKyAgICAjICAgICAgIHNldCB0aHJvdWdoIHRoZSBzZXRjb21wdHlwZSgpIG9yIHNldHBhcmFtcygpIG1ldGhvZAorICAgICMgX25jaGFubmVscyAtLSB0aGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzCisgICAgIyAgICAgICBzZXQgdGhyb3VnaCB0aGUgc2V0bmNoYW5uZWxzKCkgb3Igc2V0cGFyYW1zKCkgbWV0aG9kCisgICAgIyBfc2FtcHdpZHRoIC0tIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGF1ZGlvIHNhbXBsZQorICAgICMgICAgICAgc2V0IHRocm91Z2ggdGhlIHNldHNhbXB3aWR0aCgpIG9yIHNldHBhcmFtcygpIG1ldGhvZAorICAgICMgX2ZyYW1lcmF0ZSAtLSB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5CisgICAgIyAgICAgICBzZXQgdGhyb3VnaCB0aGUgc2V0ZnJhbWVyYXRlKCkgb3Igc2V0cGFyYW1zKCkgbWV0aG9kCisgICAgIyBfbmZyYW1lcyAtLSB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIHRvIHRoZSBoZWFkZXIKKyAgICAjICAgICAgIHNldCB0aHJvdWdoIHRoZSBzZXRuZnJhbWVzKCkgb3Igc2V0cGFyYW1zKCkgbWV0aG9kCisgICAgIyBfYWlmYyAtLSB3aGV0aGVyIHdlJ3JlIHdyaXRpbmcgYW4gQUlGRi1DIGZpbGUgb3IgYW4gQUlGRiBmaWxlCisgICAgIyAgICAgICBzZXQgdGhyb3VnaCB0aGUgYWlmYygpIG1ldGhvZCwgcmVzZXQgdGhyb3VnaCB0aGUKKyAgICAjICAgICAgIGFpZmYoKSBtZXRob2QKKyAgICAjCisgICAgIyBUaGVzZSB2YXJpYWJsZXMgYXJlIHVzZWQgaW50ZXJuYWxseSBvbmx5OgorICAgICMgX3ZlcnNpb24gLS0gdGhlIEFJRkYtQyB2ZXJzaW9uIG51bWJlcgorICAgICMgX2NvbXAgLS0gdGhlIGNvbXByZXNzb3IgZnJvbSBidWlsdGluIG1vZHVsZSBjbAorICAgICMgX25mcmFtZXN3cml0dGVuIC0tIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIGFjdHVhbGx5IHdyaXR0ZW4KKyAgICAjIF9kYXRhbGVuZ3RoIC0tIHRoZSBzaXplIG9mIHRoZSBhdWRpbyBzYW1wbGVzIHdyaXR0ZW4gdG8gdGhlIGhlYWRlcgorICAgICMgX2RhdGF3cml0dGVuIC0tIHRoZSBzaXplIG9mIHRoZSBhdWRpbyBzYW1wbGVzIGFjdHVhbGx5IHdyaXR0ZW4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmKToKKyAgICAgICAgaWYgdHlwZShmKSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZgorICAgICAgICAgICAgZiA9IF9fYnVpbHRpbl9fLm9wZW4oZiwgJ3diJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZWxzZSwgYXNzdW1lIGl0IGlzIGFuIG9wZW4gZmlsZSBvYmplY3QgYWxyZWFkeQorICAgICAgICAgICAgZmlsZW5hbWUgPSAnPz8/JworICAgICAgICBzZWxmLmluaXRmcChmKQorICAgICAgICBpZiBmaWxlbmFtZVstNTpdID09ICcuYWlmZic6CisgICAgICAgICAgICBzZWxmLl9haWZjID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fYWlmYyA9IDEKKworICAgIGRlZiBpbml0ZnAoc2VsZiwgZmlsZSk6CisgICAgICAgIHNlbGYuX2ZpbGUgPSBmaWxlCisgICAgICAgIHNlbGYuX3ZlcnNpb24gPSBfQUlGQ192ZXJzaW9uCisgICAgICAgIHNlbGYuX2NvbXB0eXBlID0gJ05PTkUnCisgICAgICAgIHNlbGYuX2NvbXBuYW1lID0gJ25vdCBjb21wcmVzc2VkJworICAgICAgICBzZWxmLl9jb21wID0gTm9uZQorICAgICAgICBzZWxmLl9jb252ZXJ0ID0gTm9uZQorICAgICAgICBzZWxmLl9uY2hhbm5lbHMgPSAwCisgICAgICAgIHNlbGYuX3NhbXB3aWR0aCA9IDAKKyAgICAgICAgc2VsZi5fZnJhbWVyYXRlID0gMAorICAgICAgICBzZWxmLl9uZnJhbWVzID0gMAorICAgICAgICBzZWxmLl9uZnJhbWVzd3JpdHRlbiA9IDAKKyAgICAgICAgc2VsZi5fZGF0YXdyaXR0ZW4gPSAwCisgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSAwCisgICAgICAgIHNlbGYuX21hcmtlcnMgPSBbXQorICAgICAgICBzZWxmLl9tYXJrbGVuZ3RoID0gMAorICAgICAgICBzZWxmLl9haWZjID0gMSAgICAgICMgQUlGRi1DIGlzIGRlZmF1bHQKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9maWxlOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICAjCisgICAgIyBVc2VyIHZpc2libGUgbWV0aG9kcy4KKyAgICAjCisgICAgZGVmIGFpZmYoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY2hhbmdlIHBhcmFtZXRlcnMgYWZ0ZXIgc3RhcnRpbmcgdG8gd3JpdGUnCisgICAgICAgIHNlbGYuX2FpZmMgPSAwCisKKyAgICBkZWYgYWlmYyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fbmZyYW1lc3dyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgc2VsZi5fYWlmYyA9IDEKKworICAgIGRlZiBzZXRuY2hhbm5lbHMoc2VsZiwgbmNoYW5uZWxzKToKKyAgICAgICAgaWYgc2VsZi5fbmZyYW1lc3dyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgaWYgbmNoYW5uZWxzIDwgMToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnYmFkICMgb2YgY2hhbm5lbHMnCisgICAgICAgIHNlbGYuX25jaGFubmVscyA9IG5jaGFubmVscworCisgICAgZGVmIGdldG5jaGFubmVscyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX25jaGFubmVsczoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnbnVtYmVyIG9mIGNoYW5uZWxzIG5vdCBzZXQnCisgICAgICAgIHJldHVybiBzZWxmLl9uY2hhbm5lbHMKKworICAgIGRlZiBzZXRzYW1wd2lkdGgoc2VsZiwgc2FtcHdpZHRoKToKKyAgICAgICAgaWYgc2VsZi5fbmZyYW1lc3dyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgaWYgc2FtcHdpZHRoIDwgMSBvciBzYW1wd2lkdGggPiA0OgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdiYWQgc2FtcGxlIHdpZHRoJworICAgICAgICBzZWxmLl9zYW1wd2lkdGggPSBzYW1wd2lkdGgKKworICAgIGRlZiBnZXRzYW1wd2lkdGgoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9zYW1wd2lkdGg6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3NhbXBsZSB3aWR0aCBub3Qgc2V0JworICAgICAgICByZXR1cm4gc2VsZi5fc2FtcHdpZHRoCisKKyAgICBkZWYgc2V0ZnJhbWVyYXRlKHNlbGYsIGZyYW1lcmF0ZSk6CisgICAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY2hhbmdlIHBhcmFtZXRlcnMgYWZ0ZXIgc3RhcnRpbmcgdG8gd3JpdGUnCisgICAgICAgIGlmIGZyYW1lcmF0ZSA8PSAwOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdiYWQgZnJhbWUgcmF0ZScKKyAgICAgICAgc2VsZi5fZnJhbWVyYXRlID0gZnJhbWVyYXRlCisKKyAgICBkZWYgZ2V0ZnJhbWVyYXRlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZnJhbWVyYXRlOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdmcmFtZSByYXRlIG5vdCBzZXQnCisgICAgICAgIHJldHVybiBzZWxmLl9mcmFtZXJhdGUKKworICAgIGRlZiBzZXRuZnJhbWVzKHNlbGYsIG5mcmFtZXMpOgorICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBzZWxmLl9uZnJhbWVzID0gbmZyYW1lcworCisgICAgZGVmIGdldG5mcmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uZnJhbWVzd3JpdHRlbgorCisgICAgZGVmIHNldGNvbXB0eXBlKHNlbGYsIGNvbXB0eXBlLCBjb21wbmFtZSk6CisgICAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY2hhbmdlIHBhcmFtZXRlcnMgYWZ0ZXIgc3RhcnRpbmcgdG8gd3JpdGUnCisgICAgICAgIGlmIGNvbXB0eXBlIG5vdCBpbiAoJ05PTkUnLCAnVUxBVycsICdBTEFXJywgJ0c3MjInKToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAndW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gdHlwZScKKyAgICAgICAgc2VsZi5fY29tcHR5cGUgPSBjb21wdHlwZQorICAgICAgICBzZWxmLl9jb21wbmFtZSA9IGNvbXBuYW1lCisKKyAgICBkZWYgZ2V0Y29tcHR5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb21wdHlwZQorCisgICAgZGVmIGdldGNvbXBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29tcG5hbWUKKworIyMgIGRlZiBzZXR2ZXJzaW9uKHNlbGYsIHZlcnNpb24pOgorIyMgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbjoKKyMjICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworIyMgICAgICBzZWxmLl92ZXJzaW9uID0gdmVyc2lvbgorCisgICAgZGVmIHNldHBhcmFtcyhzZWxmLCBpbmZvKToKKyAgICAgICAgbmNoYW5uZWxzLCBzYW1wd2lkdGgsIGZyYW1lcmF0ZSwgbmZyYW1lcywgY29tcHR5cGUsIGNvbXBuYW1lID0gaW5mbworICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBpZiBjb21wdHlwZSBub3QgaW4gKCdOT05FJywgJ1VMQVcnLCAnQUxBVycsICdHNzIyJyk6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3Vuc3VwcG9ydGVkIGNvbXByZXNzaW9uIHR5cGUnCisgICAgICAgIHNlbGYuc2V0bmNoYW5uZWxzKG5jaGFubmVscykKKyAgICAgICAgc2VsZi5zZXRzYW1wd2lkdGgoc2FtcHdpZHRoKQorICAgICAgICBzZWxmLnNldGZyYW1lcmF0ZShmcmFtZXJhdGUpCisgICAgICAgIHNlbGYuc2V0bmZyYW1lcyhuZnJhbWVzKQorICAgICAgICBzZWxmLnNldGNvbXB0eXBlKGNvbXB0eXBlLCBjb21wbmFtZSkKKworICAgIGRlZiBnZXRwYXJhbXMoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9uY2hhbm5lbHMgb3Igbm90IHNlbGYuX3NhbXB3aWR0aCBvciBub3Qgc2VsZi5fZnJhbWVyYXRlOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdub3QgYWxsIHBhcmFtZXRlcnMgc2V0JworICAgICAgICByZXR1cm4gc2VsZi5fbmNoYW5uZWxzLCBzZWxmLl9zYW1wd2lkdGgsIHNlbGYuX2ZyYW1lcmF0ZSwgXAorICAgICAgICAgICAgICBzZWxmLl9uZnJhbWVzLCBzZWxmLl9jb21wdHlwZSwgc2VsZi5fY29tcG5hbWUKKworICAgIGRlZiBzZXRtYXJrKHNlbGYsIGlkLCBwb3MsIG5hbWUpOgorICAgICAgICBpZiBpZCA8PSAwOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdtYXJrZXIgSUQgbXVzdCBiZSA+IDAnCisgICAgICAgIGlmIHBvcyA8IDA6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ21hcmtlciBwb3NpdGlvbiBtdXN0IGJlID49IDAnCisgICAgICAgIGlmIHR5cGUobmFtZSkgIT0gdHlwZSgnJyk6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ21hcmtlciBuYW1lIG11c3QgYmUgYSBzdHJpbmcnCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLl9tYXJrZXJzKSk6CisgICAgICAgICAgICBpZiBpZCA9PSBzZWxmLl9tYXJrZXJzW2ldWzBdOgorICAgICAgICAgICAgICAgIHNlbGYuX21hcmtlcnNbaV0gPSBpZCwgcG9zLCBuYW1lCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX21hcmtlcnMuYXBwZW5kKChpZCwgcG9zLCBuYW1lKSkKKworICAgIGRlZiBnZXRtYXJrKHNlbGYsIGlkKToKKyAgICAgICAgZm9yIG1hcmtlciBpbiBzZWxmLl9tYXJrZXJzOgorICAgICAgICAgICAgaWYgaWQgPT0gbWFya2VyWzBdOgorICAgICAgICAgICAgICAgIHJldHVybiBtYXJrZXIKKyAgICAgICAgcmFpc2UgRXJyb3IsICdtYXJrZXIgJXIgZG9lcyBub3QgZXhpc3QnICUgKGlkLCkKKworICAgIGRlZiBnZXRtYXJrZXJzKHNlbGYpOgorICAgICAgICBpZiBsZW4oc2VsZi5fbWFya2VycykgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLl9tYXJrZXJzCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25mcmFtZXN3cml0dGVuCisKKyAgICBkZWYgd3JpdGVmcmFtZXNyYXcoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX2Vuc3VyZV9oZWFkZXJfd3JpdHRlbihsZW4oZGF0YSkpCisgICAgICAgIG5mcmFtZXMgPSBsZW4oZGF0YSkgLy8gKHNlbGYuX3NhbXB3aWR0aCAqIHNlbGYuX25jaGFubmVscykKKyAgICAgICAgaWYgc2VsZi5fY29udmVydDoKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9jb252ZXJ0KGRhdGEpCisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoZGF0YSkKKyAgICAgICAgc2VsZi5fbmZyYW1lc3dyaXR0ZW4gPSBzZWxmLl9uZnJhbWVzd3JpdHRlbiArIG5mcmFtZXMKKyAgICAgICAgc2VsZi5fZGF0YXdyaXR0ZW4gPSBzZWxmLl9kYXRhd3JpdHRlbiArIGxlbihkYXRhKQorCisgICAgZGVmIHdyaXRlZnJhbWVzKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLndyaXRlZnJhbWVzcmF3KGRhdGEpCisgICAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuICE9IHNlbGYuX25mcmFtZXMgb3IgXAorICAgICAgICAgICAgICBzZWxmLl9kYXRhbGVuZ3RoICE9IHNlbGYuX2RhdGF3cml0dGVuOgorICAgICAgICAgICAgc2VsZi5fcGF0Y2hoZWFkZXIoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9maWxlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fZW5zdXJlX2hlYWRlcl93cml0dGVuKDApCisgICAgICAgICAgICBpZiBzZWxmLl9kYXRhd3JpdHRlbiAmIDE6CisgICAgICAgICAgICAgICAgIyBxdWljayBwYWQgdG8gZXZlbiBzaXplCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShjaHIoMCkpCisgICAgICAgICAgICAgICAgc2VsZi5fZGF0YXdyaXR0ZW4gPSBzZWxmLl9kYXRhd3JpdHRlbiArIDEKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlbWFya2VycygpCisgICAgICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbiAhPSBzZWxmLl9uZnJhbWVzIG9yIFwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggIT0gc2VsZi5fZGF0YXdyaXR0ZW4gb3IgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fbWFya2xlbmd0aDoKKyAgICAgICAgICAgICAgICBzZWxmLl9wYXRjaGhlYWRlcigpCisgICAgICAgICAgICBpZiBzZWxmLl9jb21wOgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbXAuQ2xvc2VDb21wcmVzc29yKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9jb21wID0gTm9uZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgIyBQcmV2ZW50IHJlZiBjeWNsZXMKKyAgICAgICAgICAgIHNlbGYuX2NvbnZlcnQgPSBOb25lCisgICAgICAgICAgICBmID0gc2VsZi5fZmlsZQorICAgICAgICAgICAgc2VsZi5fZmlsZSA9IE5vbmUKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgIworICAgICMgSW50ZXJuYWwgbWV0aG9kcy4KKyAgICAjCisKKyAgICBkZWYgX2NvbXBfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgaW1wb3J0IGNsCisgICAgICAgIGR1bW15ID0gc2VsZi5fY29tcC5TZXRQYXJhbShjbC5GUkFNRV9CVUZGRVJfU0laRSwgbGVuKGRhdGEpKQorICAgICAgICBkdW1teSA9IHNlbGYuX2NvbXAuU2V0UGFyYW0oY2wuQ09NUFJFU1NFRF9CVUZGRVJfU0laRSwgbGVuKGRhdGEpKQorICAgICAgICByZXR1cm4gc2VsZi5fY29tcC5Db21wcmVzcyhzZWxmLl9uZnJhbWVzLCBkYXRhKQorCisgICAgZGVmIF9saW4ydWxhdyhzZWxmLCBkYXRhKToKKyAgICAgICAgaW1wb3J0IGF1ZGlvb3AKKyAgICAgICAgcmV0dXJuIGF1ZGlvb3AubGluMnVsYXcoZGF0YSwgMikKKworICAgIGRlZiBfbGluMmFkcGNtKHNlbGYsIGRhdGEpOgorICAgICAgICBpbXBvcnQgYXVkaW9vcAorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnX2FkcGNtc3RhdGUnKToKKyAgICAgICAgICAgIHNlbGYuX2FkcGNtc3RhdGUgPSBOb25lCisgICAgICAgIGRhdGEsIHNlbGYuX2FkcGNtc3RhdGUgPSBhdWRpb29wLmxpbjJhZHBjbShkYXRhLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2FkcGNtc3RhdGUpCisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICBkZWYgX2Vuc3VyZV9oZWFkZXJfd3JpdHRlbihzZWxmLCBkYXRhc2l6ZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9uZnJhbWVzd3JpdHRlbjoKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlIGluICgnVUxBVycsICdBTEFXJyk6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX3NhbXB3aWR0aDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2FtcHdpZHRoID0gMgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3NhbXB3aWR0aCAhPSAyOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3NhbXBsZSB3aWR0aCBtdXN0IGJlIDIgd2hlbiBjb21wcmVzc2luZyB3aXRoIFVMQVcgb3IgQUxBVycKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlID09ICdHNzIyJzoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fc2FtcHdpZHRoOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zYW1wd2lkdGggPSAyCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fc2FtcHdpZHRoICE9IDI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnc2FtcGxlIHdpZHRoIG11c3QgYmUgMiB3aGVuIGNvbXByZXNzaW5nIHdpdGggRzcuMjIgKEFEUENNKScKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9uY2hhbm5lbHM6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICcjIGNoYW5uZWxzIG5vdCBzcGVjaWZpZWQnCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fc2FtcHdpZHRoOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnc2FtcGxlIHdpZHRoIG5vdCBzcGVjaWZpZWQnCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZnJhbWVyYXRlOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnc2FtcGxpbmcgcmF0ZSBub3Qgc3BlY2lmaWVkJworICAgICAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVyKGRhdGFzaXplKQorCisgICAgZGVmIF9pbml0X2NvbXByZXNzaW9uKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jb21wdHlwZSA9PSAnRzcyMic6CisgICAgICAgICAgICBzZWxmLl9jb252ZXJ0ID0gc2VsZi5fbGluMmFkcGNtCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGNsCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlID09ICdVTEFXJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBhdWRpb29wCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbnZlcnQgPSBzZWxmLl9saW4ydWxhdworICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IHdyaXRlIGNvbXByZXNzZWQgQUlGRi1DIGZpbGVzJworICAgICAgICBpZiBzZWxmLl9jb21wdHlwZSA9PSAnVUxBVyc6CisgICAgICAgICAgICBzY2hlbWUgPSBjbC5HNzExX1VMQVcKKyAgICAgICAgZWxpZiBzZWxmLl9jb21wdHlwZSA9PSAnQUxBVyc6CisgICAgICAgICAgICBzY2hlbWUgPSBjbC5HNzExX0FMQVcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAndW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gdHlwZScKKyAgICAgICAgc2VsZi5fY29tcCA9IGNsLk9wZW5Db21wcmVzc29yKHNjaGVtZSkKKyAgICAgICAgcGFyYW1zID0gW2NsLk9SSUdJTkFMX0ZPUk1BVCwgMCwKKyAgICAgICAgICAgICAgY2wuQklUU19QRVJfQ09NUE9ORU5ULCBzZWxmLl9zYW1wd2lkdGggKiA4LAorICAgICAgICAgICAgICBjbC5GUkFNRV9SQVRFLCBzZWxmLl9mcmFtZXJhdGUsCisgICAgICAgICAgICAgIGNsLkZSQU1FX0JVRkZFUl9TSVpFLCAxMDAsCisgICAgICAgICAgICAgIGNsLkNPTVBSRVNTRURfQlVGRkVSX1NJWkUsIDEwMF0KKyAgICAgICAgaWYgc2VsZi5fbmNoYW5uZWxzID09IDE6CisgICAgICAgICAgICBwYXJhbXNbMV0gPSBjbC5NT05PCisgICAgICAgIGVsaWYgc2VsZi5fbmNoYW5uZWxzID09IDI6CisgICAgICAgICAgICBwYXJhbXNbMV0gPSBjbC5TVEVSRU9fSU5URVJMRUFWRUQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNvbXByZXNzIG1vcmUgdGhhbiAyIGNoYW5uZWxzJworICAgICAgICBzZWxmLl9jb21wLlNldFBhcmFtcyhwYXJhbXMpCisgICAgICAgICMgdGhlIGNvbXByZXNzb3IgcHJvZHVjZXMgYSBoZWFkZXIgd2hpY2ggd2UgaWdub3JlCisgICAgICAgIGR1bW15ID0gc2VsZi5fY29tcC5Db21wcmVzcygwLCAnJykKKyAgICAgICAgc2VsZi5fY29udmVydCA9IHNlbGYuX2NvbXBfZGF0YQorCisgICAgZGVmIF93cml0ZV9oZWFkZXIoc2VsZiwgaW5pdGxlbmd0aCk6CisgICAgICAgIGlmIHNlbGYuX2FpZmMgYW5kIHNlbGYuX2NvbXB0eXBlICE9ICdOT05FJzoKKyAgICAgICAgICAgIHNlbGYuX2luaXRfY29tcHJlc3Npb24oKQorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdGT1JNJykKKyAgICAgICAgaWYgbm90IHNlbGYuX25mcmFtZXM6CisgICAgICAgICAgICBzZWxmLl9uZnJhbWVzID0gaW5pdGxlbmd0aCAvLyAoc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fc2FtcHdpZHRoKQorICAgICAgICBzZWxmLl9kYXRhbGVuZ3RoID0gc2VsZi5fbmZyYW1lcyAqIHNlbGYuX25jaGFubmVscyAqIHNlbGYuX3NhbXB3aWR0aAorICAgICAgICBpZiBzZWxmLl9kYXRhbGVuZ3RoICYgMToKKyAgICAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBzZWxmLl9kYXRhbGVuZ3RoICsgMQorICAgICAgICBpZiBzZWxmLl9haWZjOgorICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgaW4gKCdVTEFXJywgJ0FMQVcnKToKKyAgICAgICAgICAgICAgICBzZWxmLl9kYXRhbGVuZ3RoID0gc2VsZi5fZGF0YWxlbmd0aCAvLyAyCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fZGF0YWxlbmd0aCAmIDE6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBzZWxmLl9kYXRhbGVuZ3RoICsgMQorICAgICAgICAgICAgZWxpZiBzZWxmLl9jb21wdHlwZSA9PSAnRzcyMic6CisgICAgICAgICAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCA9IChzZWxmLl9kYXRhbGVuZ3RoICsgMykgLy8gNAorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2RhdGFsZW5ndGggJiAxOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhbGVuZ3RoID0gc2VsZi5fZGF0YWxlbmd0aCArIDEKKyAgICAgICAgc2VsZi5fZm9ybV9sZW5ndGhfcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgY29tbWxlbmd0aCA9IHNlbGYuX3dyaXRlX2Zvcm1fbGVuZ3RoKHNlbGYuX2RhdGFsZW5ndGgpCisgICAgICAgIGlmIHNlbGYuX2FpZmM6CisgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdBSUZDJykKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ0ZWRVInKQorICAgICAgICAgICAgX3dyaXRlX3Vsb25nKHNlbGYuX2ZpbGUsIDQpCisgICAgICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgc2VsZi5fdmVyc2lvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ0FJRkYnKQorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdDT01NJykKKyAgICAgICAgX3dyaXRlX3Vsb25nKHNlbGYuX2ZpbGUsIGNvbW1sZW5ndGgpCisgICAgICAgIF93cml0ZV9zaG9ydChzZWxmLl9maWxlLCBzZWxmLl9uY2hhbm5lbHMpCisgICAgICAgIHNlbGYuX25mcmFtZXNfcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgX3dyaXRlX3Vsb25nKHNlbGYuX2ZpbGUsIHNlbGYuX25mcmFtZXMpCisgICAgICAgIF93cml0ZV9zaG9ydChzZWxmLl9maWxlLCBzZWxmLl9zYW1wd2lkdGggKiA4KQorICAgICAgICBfd3JpdGVfZmxvYXQoc2VsZi5fZmlsZSwgc2VsZi5fZnJhbWVyYXRlKQorICAgICAgICBpZiBzZWxmLl9haWZjOgorICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShzZWxmLl9jb21wdHlwZSkKKyAgICAgICAgICAgIF93cml0ZV9zdHJpbmcoc2VsZi5fZmlsZSwgc2VsZi5fY29tcG5hbWUpCisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ1NTTkQnKQorICAgICAgICBzZWxmLl9zc25kX2xlbmd0aF9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgc2VsZi5fZGF0YWxlbmd0aCArIDgpCisgICAgICAgIF93cml0ZV91bG9uZyhzZWxmLl9maWxlLCAwKQorICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgMCkKKworICAgIGRlZiBfd3JpdGVfZm9ybV9sZW5ndGgoc2VsZiwgZGF0YWxlbmd0aCk6CisgICAgICAgIGlmIHNlbGYuX2FpZmM6CisgICAgICAgICAgICBjb21tbGVuZ3RoID0gMTggKyA1ICsgbGVuKHNlbGYuX2NvbXBuYW1lKQorICAgICAgICAgICAgaWYgY29tbWxlbmd0aCAmIDE6CisgICAgICAgICAgICAgICAgY29tbWxlbmd0aCA9IGNvbW1sZW5ndGggKyAxCisgICAgICAgICAgICB2ZXJzbGVuZ3RoID0gMTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbW1sZW5ndGggPSAxOAorICAgICAgICAgICAgdmVyc2xlbmd0aCA9IDAKKyAgICAgICAgX3dyaXRlX3Vsb25nKHNlbGYuX2ZpbGUsIDQgKyB2ZXJzbGVuZ3RoICsgc2VsZi5fbWFya2xlbmd0aCArIFwKKyAgICAgICAgICAgICAgICAgICAgIDggKyBjb21tbGVuZ3RoICsgMTYgKyBkYXRhbGVuZ3RoKQorICAgICAgICByZXR1cm4gY29tbWxlbmd0aAorCisgICAgZGVmIF9wYXRjaGhlYWRlcihzZWxmKToKKyAgICAgICAgY3VycG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgaWYgc2VsZi5fZGF0YXdyaXR0ZW4gJiAxOgorICAgICAgICAgICAgZGF0YWxlbmd0aCA9IHNlbGYuX2RhdGF3cml0dGVuICsgMQorICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShjaHIoMCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhbGVuZ3RoID0gc2VsZi5fZGF0YXdyaXR0ZW4KKyAgICAgICAgaWYgZGF0YWxlbmd0aCA9PSBzZWxmLl9kYXRhbGVuZ3RoIGFuZCBcCisgICAgICAgICAgICAgIHNlbGYuX25mcmFtZXMgPT0gc2VsZi5fbmZyYW1lc3dyaXR0ZW4gYW5kIFwKKyAgICAgICAgICAgICAgc2VsZi5fbWFya2xlbmd0aCA9PSAwOgorICAgICAgICAgICAgc2VsZi5fZmlsZS5zZWVrKGN1cnBvcywgMCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9maWxlLnNlZWsoc2VsZi5fZm9ybV9sZW5ndGhfcG9zLCAwKQorICAgICAgICBkdW1teSA9IHNlbGYuX3dyaXRlX2Zvcm1fbGVuZ3RoKGRhdGFsZW5ndGgpCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzZWxmLl9uZnJhbWVzX3BvcywgMCkKKyAgICAgICAgX3dyaXRlX3Vsb25nKHNlbGYuX2ZpbGUsIHNlbGYuX25mcmFtZXN3cml0dGVuKQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoc2VsZi5fc3NuZF9sZW5ndGhfcG9zLCAwKQorICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgZGF0YWxlbmd0aCArIDgpCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhjdXJwb3MsIDApCisgICAgICAgIHNlbGYuX25mcmFtZXMgPSBzZWxmLl9uZnJhbWVzd3JpdHRlbgorICAgICAgICBzZWxmLl9kYXRhbGVuZ3RoID0gZGF0YWxlbmd0aAorCisgICAgZGVmIF93cml0ZW1hcmtlcnMoc2VsZik6CisgICAgICAgIGlmIGxlbihzZWxmLl9tYXJrZXJzKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ01BUksnKQorICAgICAgICBsZW5ndGggPSAyCisgICAgICAgIGZvciBtYXJrZXIgaW4gc2VsZi5fbWFya2VyczoKKyAgICAgICAgICAgIGlkLCBwb3MsIG5hbWUgPSBtYXJrZXIKKyAgICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCArIGxlbihuYW1lKSArIDEgKyA2CisgICAgICAgICAgICBpZiBsZW4obmFtZSkgJiAxID09IDA6CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoICsgMQorICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgbGVuZ3RoKQorICAgICAgICBzZWxmLl9tYXJrbGVuZ3RoID0gbGVuZ3RoICsgOAorICAgICAgICBfd3JpdGVfc2hvcnQoc2VsZi5fZmlsZSwgbGVuKHNlbGYuX21hcmtlcnMpKQorICAgICAgICBmb3IgbWFya2VyIGluIHNlbGYuX21hcmtlcnM6CisgICAgICAgICAgICBpZCwgcG9zLCBuYW1lID0gbWFya2VyCisgICAgICAgICAgICBfd3JpdGVfc2hvcnQoc2VsZi5fZmlsZSwgaWQpCisgICAgICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgcG9zKQorICAgICAgICAgICAgX3dyaXRlX3N0cmluZyhzZWxmLl9maWxlLCBuYW1lKQorCitkZWYgb3BlbihmLCBtb2RlPU5vbmUpOgorICAgIGlmIG1vZGUgaXMgTm9uZToKKyAgICAgICAgaWYgaGFzYXR0cihmLCAnbW9kZScpOgorICAgICAgICAgICAgbW9kZSA9IGYubW9kZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbW9kZSA9ICdyYicKKyAgICBpZiBtb2RlIGluICgncicsICdyYicpOgorICAgICAgICByZXR1cm4gQWlmY19yZWFkKGYpCisgICAgZWxpZiBtb2RlIGluICgndycsICd3YicpOgorICAgICAgICByZXR1cm4gQWlmY193cml0ZShmKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEVycm9yLCAibW9kZSBtdXN0IGJlICdyJywgJ3JiJywgJ3cnLCBvciAnd2InIgorCitvcGVuZnAgPSBvcGVuICMgQi9XIGNvbXBhdGliaWxpdHkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgbm90IHN5cy5hcmd2WzE6XToKKyAgICAgICAgc3lzLmFyZ3YuYXBwZW5kKCcvdXNyL2RlbW9zL2RhdGEvYXVkaW8vYmFjaC5haWZmJykKKyAgICBmbiA9IHN5cy5hcmd2WzFdCisgICAgZiA9IG9wZW4oZm4sICdyJykKKyAgICBwcmludCAiUmVhZGluZyIsIGZuCisgICAgcHJpbnQgIm5jaGFubmVscyA9IiwgZi5nZXRuY2hhbm5lbHMoKQorICAgIHByaW50ICJuZnJhbWVzICAgPSIsIGYuZ2V0bmZyYW1lcygpCisgICAgcHJpbnQgInNhbXB3aWR0aCA9IiwgZi5nZXRzYW1wd2lkdGgoKQorICAgIHByaW50ICJmcmFtZXJhdGUgPSIsIGYuZ2V0ZnJhbWVyYXRlKCkKKyAgICBwcmludCAiY29tcHR5cGUgID0iLCBmLmdldGNvbXB0eXBlKCkKKyAgICBwcmludCAiY29tcG5hbWUgID0iLCBmLmdldGNvbXBuYW1lKCkKKyAgICBpZiBzeXMuYXJndlsyOl06CisgICAgICAgIGduID0gc3lzLmFyZ3ZbMl0KKyAgICAgICAgcHJpbnQgIldyaXRpbmciLCBnbgorICAgICAgICBnID0gb3BlbihnbiwgJ3cnKQorICAgICAgICBnLnNldHBhcmFtcyhmLmdldHBhcmFtcygpKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgZGF0YSA9IGYucmVhZGZyYW1lcygxMDI0KQorICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGcud3JpdGVmcmFtZXMoZGF0YSkKKyAgICAgICAgZy5jbG9zZSgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBwcmludCAiRG9uZS4iCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FpZmMucHljIGIvbGliL3B5dGhvbjIuNy9haWZjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWEyNTVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9haWZjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FpZmMucHlvIGIvbGliL3B5dGhvbjIuNy9haWZjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWEyNTVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9haWZjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FudGlncmF2aXR5LnB5IGIvbGliL3B5dGhvbjIuNy9hbnRpZ3Jhdml0eS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmI3ZDgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hbnRpZ3Jhdml0eS5weQpAQCAtMCwwICsxLDQgQEAKKworaW1wb3J0IHdlYmJyb3dzZXIKKword2ViYnJvd3Nlci5vcGVuKCJodHRwOi8veGtjZC5jb20vMzUzLyIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FudGlncmF2aXR5LnB5YyBiL2xpYi9weXRob24yLjcvYW50aWdyYXZpdHkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OTIxMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FudGlncmF2aXR5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FudGlncmF2aXR5LnB5byBiL2xpYi9weXRob24yLjcvYW50aWdyYXZpdHkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OTIxMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FudGlncmF2aXR5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FueWRibS5weSBiL2xpYi9weXRob24yLjcvYW55ZGJtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhN2U5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FueWRibS5weQpAQCAtMCwwICsxLDg1IEBACisiIiJHZW5lcmljIGludGVyZmFjZSB0byBhbGwgZGJtIGNsb25lcy4KKworSW5zdGVhZCBvZgorCisgICAgICAgIGltcG9ydCBkYm0KKyAgICAgICAgZCA9IGRibS5vcGVuKGZpbGUsICd3JywgMDY2NikKKwordXNlCisKKyAgICAgICAgaW1wb3J0IGFueWRibQorICAgICAgICBkID0gYW55ZGJtLm9wZW4oZmlsZSwgJ3cnKQorCitUaGUgcmV0dXJuZWQgb2JqZWN0IGlzIGEgZGJoYXNoLCBnZGJtLCBkYm0gb3IgZHVtYmRibSBvYmplY3QsCitkZXBlbmRlbnQgb24gdGhlIHR5cGUgb2YgZGF0YWJhc2UgYmVpbmcgb3BlbmVkIChkZXRlcm1pbmVkIGJ5IHdoaWNoZGIKK21vZHVsZSkgaW4gdGhlIGNhc2Ugb2YgYW4gZXhpc3RpbmcgZGJtLiBJZiB0aGUgZGJtIGRvZXMgbm90IGV4aXN0IGFuZAordGhlIGNyZWF0ZSBvciBuZXcgZmxhZyAoJ2MnIG9yICduJykgd2FzIHNwZWNpZmllZCwgdGhlIGRibSB0eXBlIHdpbGwKK2JlIGRldGVybWluZWQgYnkgdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUgbW9kdWxlcyAodGVzdGVkIGluIHRoZSBhYm92ZQorb3JkZXIpLgorCitJdCBoYXMgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2UgKGtleSBhbmQgZGF0YSBhcmUgc3RyaW5ncyk6CisKKyAgICAgICAgZFtrZXldID0gZGF0YSAgICMgc3RvcmUgZGF0YSBhdCBrZXkgKG1heSBvdmVycmlkZSBkYXRhIGF0CisgICAgICAgICAgICAgICAgICAgICAgICAjIGV4aXN0aW5nIGtleSkKKyAgICAgICAgZGF0YSA9IGRba2V5XSAgICMgcmV0cmlldmUgZGF0YSBhdCBrZXkgKHJhaXNlIEtleUVycm9yIGlmIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAjIHN1Y2gga2V5KQorICAgICAgICBkZWwgZFtrZXldICAgICAgIyBkZWxldGUgZGF0YSBzdG9yZWQgYXQga2V5IChyYWlzZXMgS2V5RXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbm8gc3VjaCBrZXkpCisgICAgICAgIGZsYWcgPSBrZXkgaW4gZCAgICMgdHJ1ZSBpZiB0aGUga2V5IGV4aXN0cworICAgICAgICBsaXN0ID0gZC5rZXlzKCkgIyByZXR1cm4gYSBsaXN0IG9mIGFsbCBleGlzdGluZyBrZXlzIChzbG93ISkKKworRnV0dXJlIHZlcnNpb25zIG1heSBjaGFuZ2UgdGhlIG9yZGVyIGluIHdoaWNoIGltcGxlbWVudGF0aW9ucyBhcmUKK3Rlc3RlZCBmb3IgZXhpc3RlbmNlLCBhbmQgYWRkIGludGVyZmFjZXMgdG8gb3RoZXIgZGJtLWxpa2UKK2ltcGxlbWVudGF0aW9ucy4KKyIiIgorCitjbGFzcyBlcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworX25hbWVzID0gWydkYmhhc2gnLCAnZ2RibScsICdkYm0nLCAnZHVtYmRibSddCitfZXJyb3JzID0gW2Vycm9yXQorX2RlZmF1bHRtb2QgPSBOb25lCisKK2ZvciBfbmFtZSBpbiBfbmFtZXM6CisgICAgdHJ5OgorICAgICAgICBfbW9kID0gX19pbXBvcnRfXyhfbmFtZSkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGNvbnRpbnVlCisgICAgaWYgbm90IF9kZWZhdWx0bW9kOgorICAgICAgICBfZGVmYXVsdG1vZCA9IF9tb2QKKyAgICBfZXJyb3JzLmFwcGVuZChfbW9kLmVycm9yKQorCitpZiBub3QgX2RlZmF1bHRtb2Q6CisgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJubyBkYm0gY2xvbmUgZm91bmQ7IHRyaWVkICVzIiAlIF9uYW1lcworCitlcnJvciA9IHR1cGxlKF9lcnJvcnMpCisKK2RlZiBvcGVuKGZpbGUsIGZsYWc9J3InLCBtb2RlPTA2NjYpOgorICAgICIiIk9wZW4gb3IgY3JlYXRlIGRhdGFiYXNlIGF0IHBhdGggZ2l2ZW4gYnkgKmZpbGUqLgorCisgICAgT3B0aW9uYWwgYXJndW1lbnQgKmZsYWcqIGNhbiBiZSAncicgKGRlZmF1bHQpIGZvciByZWFkLW9ubHkgYWNjZXNzLCAndycKKyAgICBmb3IgcmVhZC13cml0ZSBhY2Nlc3Mgb2YgYW4gZXhpc3RpbmcgZGF0YWJhc2UsICdjJyBmb3IgcmVhZC13cml0ZSBhY2Nlc3MKKyAgICB0byBhIG5ldyBvciBleGlzdGluZyBkYXRhYmFzZSwgYW5kICduJyBmb3IgcmVhZC13cml0ZSBhY2Nlc3MgdG8gYSBuZXcKKyAgICBkYXRhYmFzZS4KKworICAgIE5vdGU6ICdyJyBhbmQgJ3cnIGZhaWwgaWYgdGhlIGRhdGFiYXNlIGRvZXNuJ3QgZXhpc3Q7ICdjJyBjcmVhdGVzIGl0CisgICAgb25seSBpZiBpdCBkb2Vzbid0IGV4aXN0OyBhbmQgJ24nIGFsd2F5cyBjcmVhdGVzIGEgbmV3IGRhdGFiYXNlLgorICAgICIiIgorCisgICAgIyBndWVzcyB0aGUgdHlwZSBvZiBhbiBleGlzdGluZyBkYXRhYmFzZQorICAgIGZyb20gd2hpY2hkYiBpbXBvcnQgd2hpY2hkYgorICAgIHJlc3VsdD13aGljaGRiKGZpbGUpCisgICAgaWYgcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICMgZGIgZG9lc24ndCBleGlzdAorICAgICAgICBpZiAnYycgaW4gZmxhZyBvciAnbicgaW4gZmxhZzoKKyAgICAgICAgICAgICMgZmlsZSBkb2Vzbid0IGV4aXN0IGFuZCB0aGUgbmV3CisgICAgICAgICAgICAjIGZsYWcgd2FzIHVzZWQgc28gdXNlIGRlZmF1bHQgdHlwZQorICAgICAgICAgICAgbW9kID0gX2RlZmF1bHRtb2QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCAibmVlZCAnYycgb3IgJ24nIGZsYWcgdG8gb3BlbiBuZXcgZGIiCisgICAgZWxpZiByZXN1bHQgPT0gIiI6CisgICAgICAgICMgZGIgdHlwZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZAorICAgICAgICByYWlzZSBlcnJvciwgImRiIHR5cGUgY291bGQgbm90IGJlIGRldGVybWluZWQiCisgICAgZWxzZToKKyAgICAgICAgbW9kID0gX19pbXBvcnRfXyhyZXN1bHQpCisgICAgcmV0dXJuIG1vZC5vcGVuKGZpbGUsIGZsYWcsIG1vZGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FueWRibS5weWMgYi9saWIvcHl0aG9uMi43L2FueWRibS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2N2Y3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYW55ZGJtLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FueWRibS5weW8gYi9saWIvcHl0aG9uMi43L2FueWRibS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2N2Y3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYW55ZGJtLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FyZ3BhcnNlLnB5IGIvbGliL3B5dGhvbjIuNy9hcmdwYXJzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGJhZTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hcmdwYXJzZS5weQpAQCAtMCwwICsxLDIzNjEgQEAKKyMgQXV0aG9yOiBTdGV2ZW4gSi4gQmV0aGFyZCA8c3RldmVuLmJldGhhcmRAZ21haWwuY29tPi4KKworIiIiQ29tbWFuZC1saW5lIHBhcnNpbmcgbGlicmFyeQorCitUaGlzIG1vZHVsZSBpcyBhbiBvcHRwYXJzZS1pbnNwaXJlZCBjb21tYW5kLWxpbmUgcGFyc2luZyBsaWJyYXJ5IHRoYXQ6CisKKyAgICAtIGhhbmRsZXMgYm90aCBvcHRpb25hbCBhbmQgcG9zaXRpb25hbCBhcmd1bWVudHMKKyAgICAtIHByb2R1Y2VzIGhpZ2hseSBpbmZvcm1hdGl2ZSB1c2FnZSBtZXNzYWdlcworICAgIC0gc3VwcG9ydHMgcGFyc2VycyB0aGF0IGRpc3BhdGNoIHRvIHN1Yi1wYXJzZXJzCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBzaW1wbGUgdXNhZ2UgZXhhbXBsZSB0aGF0IHN1bXMgaW50ZWdlcnMgZnJvbSB0aGUKK2NvbW1hbmQtbGluZSBhbmQgd3JpdGVzIHRoZSByZXN1bHQgdG8gYSBmaWxlOjoKKworICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAorICAgICAgICBkZXNjcmlwdGlvbj0nc3VtIHRoZSBpbnRlZ2VycyBhdCB0aGUgY29tbWFuZCBsaW5lJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnaW50ZWdlcnMnLCBtZXRhdmFyPSdpbnQnLCBuYXJncz0nKycsIHR5cGU9aW50LAorICAgICAgICBoZWxwPSdhbiBpbnRlZ2VyIHRvIGJlIHN1bW1lZCcpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgJy0tbG9nJywgZGVmYXVsdD1zeXMuc3Rkb3V0LCB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCd3JyksCisgICAgICAgIGhlbHA9J3RoZSBmaWxlIHdoZXJlIHRoZSBzdW0gc2hvdWxkIGJlIHdyaXR0ZW4nKQorICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisgICAgYXJncy5sb2cud3JpdGUoJyVzJyAlIHN1bShhcmdzLmludGVnZXJzKSkKKyAgICBhcmdzLmxvZy5jbG9zZSgpCisKK1RoZSBtb2R1bGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBwdWJsaWMgY2xhc3NlczoKKworICAgIC0gQXJndW1lbnRQYXJzZXIgLS0gVGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIGNvbW1hbmQtbGluZSBwYXJzaW5nLiBBcyB0aGUKKyAgICAgICAgZXhhbXBsZSBhYm92ZSBzaG93cywgdGhlIGFkZF9hcmd1bWVudCgpIG1ldGhvZCBpcyB1c2VkIHRvIHBvcHVsYXRlCisgICAgICAgIHRoZSBwYXJzZXIgd2l0aCBhY3Rpb25zIGZvciBvcHRpb25hbCBhbmQgcG9zaXRpb25hbCBhcmd1bWVudHMuIFRoZW4KKyAgICAgICAgdGhlIHBhcnNlX2FyZ3MoKSBtZXRob2QgaXMgaW52b2tlZCB0byBjb252ZXJ0IHRoZSBhcmdzIGF0IHRoZQorICAgICAgICBjb21tYW5kLWxpbmUgaW50byBhbiBvYmplY3Qgd2l0aCBhdHRyaWJ1dGVzLgorCisgICAgLSBBcmd1bWVudEVycm9yIC0tIFRoZSBleGNlcHRpb24gcmFpc2VkIGJ5IEFyZ3VtZW50UGFyc2VyIG9iamVjdHMgd2hlbgorICAgICAgICB0aGVyZSBhcmUgZXJyb3JzIHdpdGggdGhlIHBhcnNlcidzIGFjdGlvbnMuIEVycm9ycyByYWlzZWQgd2hpbGUKKyAgICAgICAgcGFyc2luZyB0aGUgY29tbWFuZC1saW5lIGFyZSBjYXVnaHQgYnkgQXJndW1lbnRQYXJzZXIgYW5kIGVtaXR0ZWQKKyAgICAgICAgYXMgY29tbWFuZC1saW5lIG1lc3NhZ2VzLgorCisgICAgLSBGaWxlVHlwZSAtLSBBIGZhY3RvcnkgZm9yIGRlZmluaW5nIHR5cGVzIG9mIGZpbGVzIHRvIGJlIGNyZWF0ZWQuIEFzIHRoZQorICAgICAgICBleGFtcGxlIGFib3ZlIHNob3dzLCBpbnN0YW5jZXMgb2YgRmlsZVR5cGUgYXJlIHR5cGljYWxseSBwYXNzZWQgYXMKKyAgICAgICAgdGhlIHR5cGU9IGFyZ3VtZW50IG9mIGFkZF9hcmd1bWVudCgpIGNhbGxzLgorCisgICAgLSBBY3Rpb24gLS0gVGhlIGJhc2UgY2xhc3MgZm9yIHBhcnNlciBhY3Rpb25zLiBUeXBpY2FsbHkgYWN0aW9ucyBhcmUKKyAgICAgICAgc2VsZWN0ZWQgYnkgcGFzc2luZyBzdHJpbmdzIGxpa2UgJ3N0b3JlX3RydWUnIG9yICdhcHBlbmRfY29uc3QnIHRvCisgICAgICAgIHRoZSBhY3Rpb249IGFyZ3VtZW50IG9mIGFkZF9hcmd1bWVudCgpLiBIb3dldmVyLCBmb3IgZ3JlYXRlcgorICAgICAgICBjdXN0b21pemF0aW9uIG9mIEFyZ3VtZW50UGFyc2VyIGFjdGlvbnMsIHN1YmNsYXNzZXMgb2YgQWN0aW9uIG1heQorICAgICAgICBiZSBkZWZpbmVkIGFuZCBwYXNzZWQgYXMgdGhlIGFjdGlvbj0gYXJndW1lbnQuCisKKyAgICAtIEhlbHBGb3JtYXR0ZXIsIFJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlciwgUmF3VGV4dEhlbHBGb3JtYXR0ZXIsCisgICAgICAgIEFyZ3VtZW50RGVmYXVsdHNIZWxwRm9ybWF0dGVyIC0tIEZvcm1hdHRlciBjbGFzc2VzIHdoaWNoCisgICAgICAgIG1heSBiZSBwYXNzZWQgYXMgdGhlIGZvcm1hdHRlcl9jbGFzcz0gYXJndW1lbnQgdG8gdGhlCisgICAgICAgIEFyZ3VtZW50UGFyc2VyIGNvbnN0cnVjdG9yLiBIZWxwRm9ybWF0dGVyIGlzIHRoZSBkZWZhdWx0LAorICAgICAgICBSYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIgYW5kIFJhd1RleHRIZWxwRm9ybWF0dGVyIHRlbGwgdGhlIHBhcnNlcgorICAgICAgICBub3QgdG8gY2hhbmdlIHRoZSBmb3JtYXR0aW5nIGZvciBoZWxwIHRleHQsIGFuZAorICAgICAgICBBcmd1bWVudERlZmF1bHRzSGVscEZvcm1hdHRlciBhZGRzIGluZm9ybWF0aW9uIGFib3V0IGFyZ3VtZW50IGRlZmF1bHRzCisgICAgICAgIHRvIHRoZSBoZWxwLgorCitBbGwgb3RoZXIgY2xhc3NlcyBpbiB0aGlzIG1vZHVsZSBhcmUgY29uc2lkZXJlZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgorKEFsc28gbm90ZSB0aGF0IEhlbHBGb3JtYXR0ZXIgYW5kIFJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlciBhcmUgb25seQorY29uc2lkZXJlZCBwdWJsaWMgYXMgb2JqZWN0IG5hbWVzIC0tIHRoZSBBUEkgb2YgdGhlIGZvcm1hdHRlciBvYmplY3RzIGlzCitzdGlsbCBjb25zaWRlcmVkIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4pCisiIiIKKworX192ZXJzaW9uX18gPSAnMS4xJworX19hbGxfXyA9IFsKKyAgICAnQXJndW1lbnRQYXJzZXInLAorICAgICdBcmd1bWVudEVycm9yJywKKyAgICAnQXJndW1lbnRUeXBlRXJyb3InLAorICAgICdGaWxlVHlwZScsCisgICAgJ0hlbHBGb3JtYXR0ZXInLAorICAgICdBcmd1bWVudERlZmF1bHRzSGVscEZvcm1hdHRlcicsCisgICAgJ1Jhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlcicsCisgICAgJ1Jhd1RleHRIZWxwRm9ybWF0dGVyJywKKyAgICAnTmFtZXNwYWNlJywKKyAgICAnQWN0aW9uJywKKyAgICAnT05FX09SX01PUkUnLAorICAgICdPUFRJT05BTCcsCisgICAgJ1BBUlNFUicsCisgICAgJ1JFTUFJTkRFUicsCisgICAgJ1NVUFBSRVNTJywKKyAgICAnWkVST19PUl9NT1JFJywKK10KKworCitpbXBvcnQgY29sbGVjdGlvbnMgYXMgX2NvbGxlY3Rpb25zCitpbXBvcnQgY29weSBhcyBfY29weQoraW1wb3J0IG9zIGFzIF9vcworaW1wb3J0IHJlIGFzIF9yZQoraW1wb3J0IHN5cyBhcyBfc3lzCitpbXBvcnQgdGV4dHdyYXAgYXMgX3RleHR3cmFwCisKK2Zyb20gZ2V0dGV4dCBpbXBvcnQgZ2V0dGV4dCBhcyBfCisKKworZGVmIF9jYWxsYWJsZShvYmopOgorICAgIHJldHVybiBoYXNhdHRyKG9iaiwgJ19fY2FsbF9fJykgb3IgaGFzYXR0cihvYmosICdfX2Jhc2VzX18nKQorCisKK1NVUFBSRVNTID0gJz09U1VQUFJFU1M9PScKKworT1BUSU9OQUwgPSAnPycKK1pFUk9fT1JfTU9SRSA9ICcqJworT05FX09SX01PUkUgPSAnKycKK1BBUlNFUiA9ICdBLi4uJworUkVNQUlOREVSID0gJy4uLicKK19VTlJFQ09HTklaRURfQVJHU19BVFRSID0gJ191bnJlY29nbml6ZWRfYXJncycKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBVdGlsaXR5IGZ1bmN0aW9ucyBhbmQgY2xhc3NlcworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBfQXR0cmlidXRlSG9sZGVyKG9iamVjdCk6CisgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIF9fcmVwcl9fLgorCisgICAgVGhlIF9fcmVwcl9fIG1ldGhvZCByZXR1cm5zIGEgc3RyaW5nIGluIHRoZSBmb3JtYXQ6OgorICAgICAgICBDbGFzc05hbWUoYXR0cj1uYW1lLCBhdHRyPW5hbWUsIC4uLikKKyAgICBUaGUgYXR0cmlidXRlcyBhcmUgZGV0ZXJtaW5lZCBlaXRoZXIgYnkgYSBjbGFzcy1sZXZlbCBhdHRyaWJ1dGUsCisgICAgJ19rd2FyZ19uYW1lcycsIG9yIGJ5IGluc3BlY3RpbmcgdGhlIGluc3RhbmNlIF9fZGljdF9fLgorICAgICIiIgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICB0eXBlX25hbWUgPSB0eXBlKHNlbGYpLl9fbmFtZV9fCisgICAgICAgIGFyZ19zdHJpbmdzID0gW10KKyAgICAgICAgZm9yIGFyZyBpbiBzZWxmLl9nZXRfYXJncygpOgorICAgICAgICAgICAgYXJnX3N0cmluZ3MuYXBwZW5kKHJlcHIoYXJnKSkKKyAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNlbGYuX2dldF9rd2FyZ3MoKToKKyAgICAgICAgICAgIGFyZ19zdHJpbmdzLmFwcGVuZCgnJXM9JXInICUgKG5hbWUsIHZhbHVlKSkKKyAgICAgICAgcmV0dXJuICclcyglcyknICUgKHR5cGVfbmFtZSwgJywgJy5qb2luKGFyZ19zdHJpbmdzKSkKKworICAgIGRlZiBfZ2V0X2t3YXJncyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNvcnRlZChzZWxmLl9fZGljdF9fLml0ZW1zKCkpCisKKyAgICBkZWYgX2dldF9hcmdzKHNlbGYpOgorICAgICAgICByZXR1cm4gW10KKworCitkZWYgX2Vuc3VyZV92YWx1ZShuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKToKKyAgICBpZiBnZXRhdHRyKG5hbWVzcGFjZSwgbmFtZSwgTm9uZSkgaXMgTm9uZToKKyAgICAgICAgc2V0YXR0cihuYW1lc3BhY2UsIG5hbWUsIHZhbHVlKQorICAgIHJldHVybiBnZXRhdHRyKG5hbWVzcGFjZSwgbmFtZSkKKworCisjID09PT09PT09PT09PT09PQorIyBGb3JtYXR0aW5nIEhlbHAKKyMgPT09PT09PT09PT09PT09CisKK2NsYXNzIEhlbHBGb3JtYXR0ZXIob2JqZWN0KToKKyAgICAiIiJGb3JtYXR0ZXIgZm9yIGdlbmVyYXRpbmcgdXNhZ2UgbWVzc2FnZXMgYW5kIGFyZ3VtZW50IGhlbHAgc3RyaW5ncy4KKworICAgIE9ubHkgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBpcyBjb25zaWRlcmVkIGEgcHVibGljIEFQSS4gQWxsIHRoZSBtZXRob2RzCisgICAgcHJvdmlkZWQgYnkgdGhlIGNsYXNzIGFyZSBjb25zaWRlcmVkIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBwcm9nLAorICAgICAgICAgICAgICAgICBpbmRlbnRfaW5jcmVtZW50PTIsCisgICAgICAgICAgICAgICAgIG1heF9oZWxwX3Bvc2l0aW9uPTI0LAorICAgICAgICAgICAgICAgICB3aWR0aD1Ob25lKToKKworICAgICAgICAjIGRlZmF1bHQgc2V0dGluZyBmb3Igd2lkdGgKKyAgICAgICAgaWYgd2lkdGggaXMgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aWR0aCA9IGludChfb3MuZW52aXJvblsnQ09MVU1OUyddKQorICAgICAgICAgICAgZXhjZXB0IChLZXlFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgd2lkdGggPSA4MAorICAgICAgICAgICAgd2lkdGggLT0gMgorCisgICAgICAgIHNlbGYuX3Byb2cgPSBwcm9nCisgICAgICAgIHNlbGYuX2luZGVudF9pbmNyZW1lbnQgPSBpbmRlbnRfaW5jcmVtZW50CisgICAgICAgIHNlbGYuX21heF9oZWxwX3Bvc2l0aW9uID0gbWF4X2hlbHBfcG9zaXRpb24KKyAgICAgICAgc2VsZi5fd2lkdGggPSB3aWR0aAorCisgICAgICAgIHNlbGYuX2N1cnJlbnRfaW5kZW50ID0gMAorICAgICAgICBzZWxmLl9sZXZlbCA9IDAKKyAgICAgICAgc2VsZi5fYWN0aW9uX21heF9sZW5ndGggPSAwCisKKyAgICAgICAgc2VsZi5fcm9vdF9zZWN0aW9uID0gc2VsZi5fU2VjdGlvbihzZWxmLCBOb25lKQorICAgICAgICBzZWxmLl9jdXJyZW50X3NlY3Rpb24gPSBzZWxmLl9yb290X3NlY3Rpb24KKworICAgICAgICBzZWxmLl93aGl0ZXNwYWNlX21hdGNoZXIgPSBfcmUuY29tcGlsZShyJ1xzKycpCisgICAgICAgIHNlbGYuX2xvbmdfYnJlYWtfbWF0Y2hlciA9IF9yZS5jb21waWxlKHInXG5cblxuKycpCisKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIFNlY3Rpb24gYW5kIGluZGVudGF0aW9uIG1ldGhvZHMKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBkZWYgX2luZGVudChzZWxmKToKKyAgICAgICAgc2VsZi5fY3VycmVudF9pbmRlbnQgKz0gc2VsZi5faW5kZW50X2luY3JlbWVudAorICAgICAgICBzZWxmLl9sZXZlbCArPSAxCisKKyAgICBkZWYgX2RlZGVudChzZWxmKToKKyAgICAgICAgc2VsZi5fY3VycmVudF9pbmRlbnQgLT0gc2VsZi5faW5kZW50X2luY3JlbWVudAorICAgICAgICBhc3NlcnQgc2VsZi5fY3VycmVudF9pbmRlbnQgPj0gMCwgJ0luZGVudCBkZWNyZWFzZWQgYmVsb3cgMC4nCisgICAgICAgIHNlbGYuX2xldmVsIC09IDEKKworICAgIGNsYXNzIF9TZWN0aW9uKG9iamVjdCk6CisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvcm1hdHRlciwgcGFyZW50LCBoZWFkaW5nPU5vbmUpOgorICAgICAgICAgICAgc2VsZi5mb3JtYXR0ZXIgPSBmb3JtYXR0ZXIKKyAgICAgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CisgICAgICAgICAgICBzZWxmLmhlYWRpbmcgPSBoZWFkaW5nCisgICAgICAgICAgICBzZWxmLml0ZW1zID0gW10KKworICAgICAgICBkZWYgZm9ybWF0X2hlbHAoc2VsZik6CisgICAgICAgICAgICAjIGZvcm1hdCB0aGUgaW5kZW50ZWQgc2VjdGlvbgorICAgICAgICAgICAgaWYgc2VsZi5wYXJlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5mb3JtYXR0ZXIuX2luZGVudCgpCisgICAgICAgICAgICBqb2luID0gc2VsZi5mb3JtYXR0ZXIuX2pvaW5fcGFydHMKKyAgICAgICAgICAgIGZvciBmdW5jLCBhcmdzIGluIHNlbGYuaXRlbXM6CisgICAgICAgICAgICAgICAgZnVuYygqYXJncykKKyAgICAgICAgICAgIGl0ZW1faGVscCA9IGpvaW4oW2Z1bmMoKmFyZ3MpIGZvciBmdW5jLCBhcmdzIGluIHNlbGYuaXRlbXNdKQorICAgICAgICAgICAgaWYgc2VsZi5wYXJlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5mb3JtYXR0ZXIuX2RlZGVudCgpCisKKyAgICAgICAgICAgICMgcmV0dXJuIG5vdGhpbmcgaWYgdGhlIHNlY3Rpb24gd2FzIGVtcHR5CisgICAgICAgICAgICBpZiBub3QgaXRlbV9oZWxwOgorICAgICAgICAgICAgICAgIHJldHVybiAnJworCisgICAgICAgICAgICAjIGFkZCB0aGUgaGVhZGluZyBpZiB0aGUgc2VjdGlvbiB3YXMgbm9uLWVtcHR5CisgICAgICAgICAgICBpZiBzZWxmLmhlYWRpbmcgaXMgbm90IFNVUFBSRVNTIGFuZCBzZWxmLmhlYWRpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgY3VycmVudF9pbmRlbnQgPSBzZWxmLmZvcm1hdHRlci5fY3VycmVudF9pbmRlbnQKKyAgICAgICAgICAgICAgICBoZWFkaW5nID0gJyUqcyVzOlxuJyAlIChjdXJyZW50X2luZGVudCwgJycsIHNlbGYuaGVhZGluZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaGVhZGluZyA9ICcnCisKKyAgICAgICAgICAgICMgam9pbiB0aGUgc2VjdGlvbi1pbml0aWFsIG5ld2xpbmUsIHRoZSBoZWFkaW5nIGFuZCB0aGUgaGVscAorICAgICAgICAgICAgcmV0dXJuIGpvaW4oWydcbicsIGhlYWRpbmcsIGl0ZW1faGVscCwgJ1xuJ10pCisKKyAgICBkZWYgX2FkZF9pdGVtKHNlbGYsIGZ1bmMsIGFyZ3MpOgorICAgICAgICBzZWxmLl9jdXJyZW50X3NlY3Rpb24uaXRlbXMuYXBwZW5kKChmdW5jLCBhcmdzKSkKKworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIyBNZXNzYWdlIGJ1aWxkaW5nIG1ldGhvZHMKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGRlZiBzdGFydF9zZWN0aW9uKHNlbGYsIGhlYWRpbmcpOgorICAgICAgICBzZWxmLl9pbmRlbnQoKQorICAgICAgICBzZWN0aW9uID0gc2VsZi5fU2VjdGlvbihzZWxmLCBzZWxmLl9jdXJyZW50X3NlY3Rpb24sIGhlYWRpbmcpCisgICAgICAgIHNlbGYuX2FkZF9pdGVtKHNlY3Rpb24uZm9ybWF0X2hlbHAsIFtdKQorICAgICAgICBzZWxmLl9jdXJyZW50X3NlY3Rpb24gPSBzZWN0aW9uCisKKyAgICBkZWYgZW5kX3NlY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuX2N1cnJlbnRfc2VjdGlvbiA9IHNlbGYuX2N1cnJlbnRfc2VjdGlvbi5wYXJlbnQKKyAgICAgICAgc2VsZi5fZGVkZW50KCkKKworICAgIGRlZiBhZGRfdGV4dChzZWxmLCB0ZXh0KToKKyAgICAgICAgaWYgdGV4dCBpcyBub3QgU1VQUFJFU1MgYW5kIHRleHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9hZGRfaXRlbShzZWxmLl9mb3JtYXRfdGV4dCwgW3RleHRdKQorCisgICAgZGVmIGFkZF91c2FnZShzZWxmLCB1c2FnZSwgYWN0aW9ucywgZ3JvdXBzLCBwcmVmaXg9Tm9uZSk6CisgICAgICAgIGlmIHVzYWdlIGlzIG5vdCBTVVBQUkVTUzoKKyAgICAgICAgICAgIGFyZ3MgPSB1c2FnZSwgYWN0aW9ucywgZ3JvdXBzLCBwcmVmaXgKKyAgICAgICAgICAgIHNlbGYuX2FkZF9pdGVtKHNlbGYuX2Zvcm1hdF91c2FnZSwgYXJncykKKworICAgIGRlZiBhZGRfYXJndW1lbnQoc2VsZiwgYWN0aW9uKToKKyAgICAgICAgaWYgYWN0aW9uLmhlbHAgaXMgbm90IFNVUFBSRVNTOgorCisgICAgICAgICAgICAjIGZpbmQgYWxsIGludm9jYXRpb25zCisgICAgICAgICAgICBnZXRfaW52b2NhdGlvbiA9IHNlbGYuX2Zvcm1hdF9hY3Rpb25faW52b2NhdGlvbgorICAgICAgICAgICAgaW52b2NhdGlvbnMgPSBbZ2V0X2ludm9jYXRpb24oYWN0aW9uKV0KKyAgICAgICAgICAgIGZvciBzdWJhY3Rpb24gaW4gc2VsZi5faXRlcl9pbmRlbnRlZF9zdWJhY3Rpb25zKGFjdGlvbik6CisgICAgICAgICAgICAgICAgaW52b2NhdGlvbnMuYXBwZW5kKGdldF9pbnZvY2F0aW9uKHN1YmFjdGlvbikpCisKKyAgICAgICAgICAgICMgdXBkYXRlIHRoZSBtYXhpbXVtIGl0ZW0gbGVuZ3RoCisgICAgICAgICAgICBpbnZvY2F0aW9uX2xlbmd0aCA9IG1heChbbGVuKHMpIGZvciBzIGluIGludm9jYXRpb25zXSkKKyAgICAgICAgICAgIGFjdGlvbl9sZW5ndGggPSBpbnZvY2F0aW9uX2xlbmd0aCArIHNlbGYuX2N1cnJlbnRfaW5kZW50CisgICAgICAgICAgICBzZWxmLl9hY3Rpb25fbWF4X2xlbmd0aCA9IG1heChzZWxmLl9hY3Rpb25fbWF4X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl9sZW5ndGgpCisKKyAgICAgICAgICAgICMgYWRkIHRoZSBpdGVtIHRvIHRoZSBsaXN0CisgICAgICAgICAgICBzZWxmLl9hZGRfaXRlbShzZWxmLl9mb3JtYXRfYWN0aW9uLCBbYWN0aW9uXSkKKworICAgIGRlZiBhZGRfYXJndW1lbnRzKHNlbGYsIGFjdGlvbnMpOgorICAgICAgICBmb3IgYWN0aW9uIGluIGFjdGlvbnM6CisgICAgICAgICAgICBzZWxmLmFkZF9hcmd1bWVudChhY3Rpb24pCisKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09CisgICAgIyBIZWxwLWZvcm1hdHRpbmcgbWV0aG9kcworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBkZWYgZm9ybWF0X2hlbHAoc2VsZik6CisgICAgICAgIGhlbHAgPSBzZWxmLl9yb290X3NlY3Rpb24uZm9ybWF0X2hlbHAoKQorICAgICAgICBpZiBoZWxwOgorICAgICAgICAgICAgaGVscCA9IHNlbGYuX2xvbmdfYnJlYWtfbWF0Y2hlci5zdWIoJ1xuXG4nLCBoZWxwKQorICAgICAgICAgICAgaGVscCA9IGhlbHAuc3RyaXAoJ1xuJykgKyAnXG4nCisgICAgICAgIHJldHVybiBoZWxwCisKKyAgICBkZWYgX2pvaW5fcGFydHMoc2VsZiwgcGFydF9zdHJpbmdzKToKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oW3BhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBwYXJ0IGluIHBhcnRfc3RyaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGFydCBhbmQgcGFydCBpcyBub3QgU1VQUFJFU1NdKQorCisgICAgZGVmIF9mb3JtYXRfdXNhZ2Uoc2VsZiwgdXNhZ2UsIGFjdGlvbnMsIGdyb3VwcywgcHJlZml4KToKKyAgICAgICAgaWYgcHJlZml4IGlzIE5vbmU6CisgICAgICAgICAgICBwcmVmaXggPSBfKCd1c2FnZTogJykKKworICAgICAgICAjIGlmIHVzYWdlIGlzIHNwZWNpZmllZCwgdXNlIHRoYXQKKyAgICAgICAgaWYgdXNhZ2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB1c2FnZSA9IHVzYWdlICUgZGljdChwcm9nPXNlbGYuX3Byb2cpCisKKyAgICAgICAgIyBpZiBubyBvcHRpb25hbHMgb3IgcG9zaXRpb25hbHMgYXJlIGF2YWlsYWJsZSwgdXNhZ2UgaXMganVzdCBwcm9nCisgICAgICAgIGVsaWYgdXNhZ2UgaXMgTm9uZSBhbmQgbm90IGFjdGlvbnM6CisgICAgICAgICAgICB1c2FnZSA9ICclKHByb2cpcycgJSBkaWN0KHByb2c9c2VsZi5fcHJvZykKKworICAgICAgICAjIGlmIG9wdGlvbmFscyBhbmQgcG9zaXRpb25hbHMgYXJlIGF2YWlsYWJsZSwgY2FsY3VsYXRlIHVzYWdlCisgICAgICAgIGVsaWYgdXNhZ2UgaXMgTm9uZToKKyAgICAgICAgICAgIHByb2cgPSAnJShwcm9nKXMnICUgZGljdChwcm9nPXNlbGYuX3Byb2cpCisKKyAgICAgICAgICAgICMgc3BsaXQgb3B0aW9uYWxzIGZyb20gcG9zaXRpb25hbHMKKyAgICAgICAgICAgIG9wdGlvbmFscyA9IFtdCisgICAgICAgICAgICBwb3NpdGlvbmFscyA9IFtdCisgICAgICAgICAgICBmb3IgYWN0aW9uIGluIGFjdGlvbnM6CisgICAgICAgICAgICAgICAgaWYgYWN0aW9uLm9wdGlvbl9zdHJpbmdzOgorICAgICAgICAgICAgICAgICAgICBvcHRpb25hbHMuYXBwZW5kKGFjdGlvbikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbmFscy5hcHBlbmQoYWN0aW9uKQorCisgICAgICAgICAgICAjIGJ1aWxkIGZ1bGwgdXNhZ2Ugc3RyaW5nCisgICAgICAgICAgICBmb3JtYXQgPSBzZWxmLl9mb3JtYXRfYWN0aW9uc191c2FnZQorICAgICAgICAgICAgYWN0aW9uX3VzYWdlID0gZm9ybWF0KG9wdGlvbmFscyArIHBvc2l0aW9uYWxzLCBncm91cHMpCisgICAgICAgICAgICB1c2FnZSA9ICcgJy5qb2luKFtzIGZvciBzIGluIFtwcm9nLCBhY3Rpb25fdXNhZ2VdIGlmIHNdKQorCisgICAgICAgICAgICAjIHdyYXAgdGhlIHVzYWdlIHBhcnRzIGlmIGl0J3MgdG9vIGxvbmcKKyAgICAgICAgICAgIHRleHRfd2lkdGggPSBzZWxmLl93aWR0aCAtIHNlbGYuX2N1cnJlbnRfaW5kZW50CisgICAgICAgICAgICBpZiBsZW4ocHJlZml4KSArIGxlbih1c2FnZSkgPiB0ZXh0X3dpZHRoOgorCisgICAgICAgICAgICAgICAgIyBicmVhayB1c2FnZSBpbnRvIHdyYXBwYWJsZSBwYXJ0cworICAgICAgICAgICAgICAgIHBhcnRfcmVnZXhwID0gcidcKC4qP1wpK3xcWy4qP1xdK3xcUysnCisgICAgICAgICAgICAgICAgb3B0X3VzYWdlID0gZm9ybWF0KG9wdGlvbmFscywgZ3JvdXBzKQorICAgICAgICAgICAgICAgIHBvc191c2FnZSA9IGZvcm1hdChwb3NpdGlvbmFscywgZ3JvdXBzKQorICAgICAgICAgICAgICAgIG9wdF9wYXJ0cyA9IF9yZS5maW5kYWxsKHBhcnRfcmVnZXhwLCBvcHRfdXNhZ2UpCisgICAgICAgICAgICAgICAgcG9zX3BhcnRzID0gX3JlLmZpbmRhbGwocGFydF9yZWdleHAsIHBvc191c2FnZSkKKyAgICAgICAgICAgICAgICBhc3NlcnQgJyAnLmpvaW4ob3B0X3BhcnRzKSA9PSBvcHRfdXNhZ2UKKyAgICAgICAgICAgICAgICBhc3NlcnQgJyAnLmpvaW4ocG9zX3BhcnRzKSA9PSBwb3NfdXNhZ2UKKworICAgICAgICAgICAgICAgICMgaGVscGVyIGZvciB3cmFwcGluZyBsaW5lcworICAgICAgICAgICAgICAgIGRlZiBnZXRfbGluZXMocGFydHMsIGluZGVudCwgcHJlZml4PU5vbmUpOgorICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBbXQorICAgICAgICAgICAgICAgICAgICBpZiBwcmVmaXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX2xlbiA9IGxlbihwcmVmaXgpIC0gMQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9sZW4gPSBsZW4oaW5kZW50KSAtIDEKKyAgICAgICAgICAgICAgICAgICAgZm9yIHBhcnQgaW4gcGFydHM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lX2xlbiArIDEgKyBsZW4ocGFydCkgPiB0ZXh0X3dpZHRoOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChpbmRlbnQgKyAnICcuam9pbihsaW5lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX2xlbiA9IGxlbihpbmRlbnQpIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5hcHBlbmQocGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbGVuICs9IGxlbihwYXJ0KSArIDEKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChpbmRlbnQgKyAnICcuam9pbihsaW5lKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJlZml4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbMF0gPSBsaW5lc1swXVtsZW4oaW5kZW50KTpdCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lcworCisgICAgICAgICAgICAgICAgIyBpZiBwcm9nIGlzIHNob3J0LCBmb2xsb3cgaXQgd2l0aCBvcHRpb25hbHMgb3IgcG9zaXRpb25hbHMKKyAgICAgICAgICAgICAgICBpZiBsZW4ocHJlZml4KSArIGxlbihwcm9nKSA8PSAwLjc1ICogdGV4dF93aWR0aDoKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gJyAnICogKGxlbihwcmVmaXgpICsgbGVuKHByb2cpICsgMSkKKyAgICAgICAgICAgICAgICAgICAgaWYgb3B0X3BhcnRzOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBnZXRfbGluZXMoW3Byb2ddICsgb3B0X3BhcnRzLCBpbmRlbnQsIHByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmV4dGVuZChnZXRfbGluZXMocG9zX3BhcnRzLCBpbmRlbnQpKQorICAgICAgICAgICAgICAgICAgICBlbGlmIHBvc19wYXJ0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gZ2V0X2xpbmVzKFtwcm9nXSArIHBvc19wYXJ0cywgaW5kZW50LCBwcmVmaXgpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IFtwcm9nXQorCisgICAgICAgICAgICAgICAgIyBpZiBwcm9nIGlzIGxvbmcsIHB1dCBpdCBvbiBpdHMgb3duIGxpbmUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAnICcgKiBsZW4ocHJlZml4KQorICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IG9wdF9wYXJ0cyArIHBvc19wYXJ0cworICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IGdldF9saW5lcyhwYXJ0cywgaW5kZW50KQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4obGluZXMpID4gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzLmV4dGVuZChnZXRfbGluZXMob3B0X3BhcnRzLCBpbmRlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuZXh0ZW5kKGdldF9saW5lcyhwb3NfcGFydHMsIGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gW3Byb2ddICsgbGluZXMKKworICAgICAgICAgICAgICAgICMgam9pbiBsaW5lcyBpbnRvIHVzYWdlCisgICAgICAgICAgICAgICAgdXNhZ2UgPSAnXG4nLmpvaW4obGluZXMpCisKKyAgICAgICAgIyBwcmVmaXggd2l0aCAndXNhZ2U6JworICAgICAgICByZXR1cm4gJyVzJXNcblxuJyAlIChwcmVmaXgsIHVzYWdlKQorCisgICAgZGVmIF9mb3JtYXRfYWN0aW9uc191c2FnZShzZWxmLCBhY3Rpb25zLCBncm91cHMpOgorICAgICAgICAjIGZpbmQgZ3JvdXAgaW5kaWNlcyBhbmQgaWRlbnRpZnkgYWN0aW9ucyBpbiBncm91cHMKKyAgICAgICAgZ3JvdXBfYWN0aW9ucyA9IHNldCgpCisgICAgICAgIGluc2VydHMgPSB7fQorICAgICAgICBmb3IgZ3JvdXAgaW4gZ3JvdXBzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN0YXJ0ID0gYWN0aW9ucy5pbmRleChncm91cC5fZ3JvdXBfYWN0aW9uc1swXSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgbGVuKGdyb3VwLl9ncm91cF9hY3Rpb25zKQorICAgICAgICAgICAgICAgIGlmIGFjdGlvbnNbc3RhcnQ6ZW5kXSA9PSBncm91cC5fZ3JvdXBfYWN0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGFjdGlvbiBpbiBncm91cC5fZ3JvdXBfYWN0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX2FjdGlvbnMuYWRkKGFjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGdyb3VwLnJlcXVpcmVkOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3RhcnQgaW4gaW5zZXJ0czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRzW3N0YXJ0XSArPSAnIFsnCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydHNbc3RhcnRdID0gJ1snCisgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRzW2VuZF0gPSAnXScKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN0YXJ0IGluIGluc2VydHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0c1tzdGFydF0gKz0gJyAoJworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRzW3N0YXJ0XSA9ICcoJworICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0c1tlbmRdID0gJyknCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0ICsgMSwgZW5kKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydHNbaV0gPSAnfCcKKworICAgICAgICAjIGNvbGxlY3QgYWxsIGFjdGlvbnMgZm9ybWF0IHN0cmluZ3MKKyAgICAgICAgcGFydHMgPSBbXQorICAgICAgICBmb3IgaSwgYWN0aW9uIGluIGVudW1lcmF0ZShhY3Rpb25zKToKKworICAgICAgICAgICAgIyBzdXBwcmVzc2VkIGFyZ3VtZW50cyBhcmUgbWFya2VkIHdpdGggTm9uZQorICAgICAgICAgICAgIyByZW1vdmUgfCBzZXBhcmF0b3JzIGZvciBzdXBwcmVzc2VkIGFyZ3VtZW50cworICAgICAgICAgICAgaWYgYWN0aW9uLmhlbHAgaXMgU1VQUFJFU1M6CisgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKE5vbmUpCisgICAgICAgICAgICAgICAgaWYgaW5zZXJ0cy5nZXQoaSkgPT0gJ3wnOgorICAgICAgICAgICAgICAgICAgICBpbnNlcnRzLnBvcChpKQorICAgICAgICAgICAgICAgIGVsaWYgaW5zZXJ0cy5nZXQoaSArIDEpID09ICd8JzoKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0cy5wb3AoaSArIDEpCisKKyAgICAgICAgICAgICMgcHJvZHVjZSBhbGwgYXJnIHN0cmluZ3MKKyAgICAgICAgICAgIGVsaWYgbm90IGFjdGlvbi5vcHRpb25fc3RyaW5nczoKKyAgICAgICAgICAgICAgICBwYXJ0ID0gc2VsZi5fZm9ybWF0X2FyZ3MoYWN0aW9uLCBhY3Rpb24uZGVzdCkKKworICAgICAgICAgICAgICAgICMgaWYgaXQncyBpbiBhIGdyb3VwLCBzdHJpcCB0aGUgb3V0ZXIgW10KKyAgICAgICAgICAgICAgICBpZiBhY3Rpb24gaW4gZ3JvdXBfYWN0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgaWYgcGFydFswXSA9PSAnWycgYW5kIHBhcnRbLTFdID09ICddJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSBwYXJ0WzE6LTFdCisKKyAgICAgICAgICAgICAgICAjIGFkZCB0aGUgYWN0aW9uIHN0cmluZyB0byB0aGUgbGlzdAorICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChwYXJ0KQorCisgICAgICAgICAgICAjIHByb2R1Y2UgdGhlIGZpcnN0IHdheSB0byBpbnZva2UgdGhlIG9wdGlvbiBpbiBicmFja2V0cworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcHRpb25fc3RyaW5nID0gYWN0aW9uLm9wdGlvbl9zdHJpbmdzWzBdCisKKyAgICAgICAgICAgICAgICAjIGlmIHRoZSBPcHRpb25hbCBkb2Vzbid0IHRha2UgYSB2YWx1ZSwgZm9ybWF0IGlzOgorICAgICAgICAgICAgICAgICMgICAgLXMgb3IgLS1sb25nCisgICAgICAgICAgICAgICAgaWYgYWN0aW9uLm5hcmdzID09IDA6CisgICAgICAgICAgICAgICAgICAgIHBhcnQgPSAnJXMnICUgb3B0aW9uX3N0cmluZworCisgICAgICAgICAgICAgICAgIyBpZiB0aGUgT3B0aW9uYWwgdGFrZXMgYSB2YWx1ZSwgZm9ybWF0IGlzOgorICAgICAgICAgICAgICAgICMgICAgLXMgQVJHUyBvciAtLWxvbmcgQVJHUworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgPSBhY3Rpb24uZGVzdC51cHBlcigpCisgICAgICAgICAgICAgICAgICAgIGFyZ3Nfc3RyaW5nID0gc2VsZi5fZm9ybWF0X2FyZ3MoYWN0aW9uLCBkZWZhdWx0KQorICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gJyVzICVzJyAlIChvcHRpb25fc3RyaW5nLCBhcmdzX3N0cmluZykKKworICAgICAgICAgICAgICAgICMgbWFrZSBpdCBsb29rIG9wdGlvbmFsIGlmIGl0J3Mgbm90IHJlcXVpcmVkIG9yIGluIGEgZ3JvdXAKKyAgICAgICAgICAgICAgICBpZiBub3QgYWN0aW9uLnJlcXVpcmVkIGFuZCBhY3Rpb24gbm90IGluIGdyb3VwX2FjdGlvbnM6CisgICAgICAgICAgICAgICAgICAgIHBhcnQgPSAnWyVzXScgJSBwYXJ0CisKKyAgICAgICAgICAgICAgICAjIGFkZCB0aGUgYWN0aW9uIHN0cmluZyB0byB0aGUgbGlzdAorICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChwYXJ0KQorCisgICAgICAgICMgaW5zZXJ0IHRoaW5ncyBhdCB0aGUgbmVjZXNzYXJ5IGluZGljZXMKKyAgICAgICAgZm9yIGkgaW4gc29ydGVkKGluc2VydHMsIHJldmVyc2U9VHJ1ZSk6CisgICAgICAgICAgICBwYXJ0c1tpOmldID0gW2luc2VydHNbaV1dCisKKyAgICAgICAgIyBqb2luIGFsbCB0aGUgYWN0aW9uIGl0ZW1zIHdpdGggc3BhY2VzCisgICAgICAgIHRleHQgPSAnICcuam9pbihbaXRlbSBmb3IgaXRlbSBpbiBwYXJ0cyBpZiBpdGVtIGlzIG5vdCBOb25lXSkKKworICAgICAgICAjIGNsZWFuIHVwIHNlcGFyYXRvcnMgZm9yIG11dHVhbGx5IGV4Y2x1c2l2ZSBncm91cHMKKyAgICAgICAgb3BlbiA9IHInW1xbKF0nCisgICAgICAgIGNsb3NlID0gcidbXF0pXScKKyAgICAgICAgdGV4dCA9IF9yZS5zdWIocicoJXMpICcgJSBvcGVuLCByJ1wxJywgdGV4dCkKKyAgICAgICAgdGV4dCA9IF9yZS5zdWIocicgKCVzKScgJSBjbG9zZSwgcidcMScsIHRleHQpCisgICAgICAgIHRleHQgPSBfcmUuc3ViKHInJXMgKiVzJyAlIChvcGVuLCBjbG9zZSksIHInJywgdGV4dCkKKyAgICAgICAgdGV4dCA9IF9yZS5zdWIocidcKChbXnxdKilcKScsIHInXDEnLCB0ZXh0KQorICAgICAgICB0ZXh0ID0gdGV4dC5zdHJpcCgpCisKKyAgICAgICAgIyByZXR1cm4gdGhlIHRleHQKKyAgICAgICAgcmV0dXJuIHRleHQKKworICAgIGRlZiBfZm9ybWF0X3RleHQoc2VsZiwgdGV4dCk6CisgICAgICAgIGlmICclKHByb2cpJyBpbiB0ZXh0OgorICAgICAgICAgICAgdGV4dCA9IHRleHQgJSBkaWN0KHByb2c9c2VsZi5fcHJvZykKKyAgICAgICAgdGV4dF93aWR0aCA9IHNlbGYuX3dpZHRoIC0gc2VsZi5fY3VycmVudF9pbmRlbnQKKyAgICAgICAgaW5kZW50ID0gJyAnICogc2VsZi5fY3VycmVudF9pbmRlbnQKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGxfdGV4dCh0ZXh0LCB0ZXh0X3dpZHRoLCBpbmRlbnQpICsgJ1xuXG4nCisKKyAgICBkZWYgX2Zvcm1hdF9hY3Rpb24oc2VsZiwgYWN0aW9uKToKKyAgICAgICAgIyBkZXRlcm1pbmUgdGhlIHJlcXVpcmVkIHdpZHRoIGFuZCB0aGUgZW50cnkgbGFiZWwKKyAgICAgICAgaGVscF9wb3NpdGlvbiA9IG1pbihzZWxmLl9hY3Rpb25fbWF4X2xlbmd0aCArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWF4X2hlbHBfcG9zaXRpb24pCisgICAgICAgIGhlbHBfd2lkdGggPSBzZWxmLl93aWR0aCAtIGhlbHBfcG9zaXRpb24KKyAgICAgICAgYWN0aW9uX3dpZHRoID0gaGVscF9wb3NpdGlvbiAtIHNlbGYuX2N1cnJlbnRfaW5kZW50IC0gMgorICAgICAgICBhY3Rpb25faGVhZGVyID0gc2VsZi5fZm9ybWF0X2FjdGlvbl9pbnZvY2F0aW9uKGFjdGlvbikKKworICAgICAgICAjIGhvIG5lbHA7IHN0YXJ0IG9uIHNhbWUgbGluZSBhbmQgYWRkIGEgZmluYWwgbmV3bGluZQorICAgICAgICBpZiBub3QgYWN0aW9uLmhlbHA6CisgICAgICAgICAgICB0dXAgPSBzZWxmLl9jdXJyZW50X2luZGVudCwgJycsIGFjdGlvbl9oZWFkZXIKKyAgICAgICAgICAgIGFjdGlvbl9oZWFkZXIgPSAnJSpzJXNcbicgJSB0dXAKKworICAgICAgICAjIHNob3J0IGFjdGlvbiBuYW1lOyBzdGFydCBvbiB0aGUgc2FtZSBsaW5lIGFuZCBwYWQgdHdvIHNwYWNlcworICAgICAgICBlbGlmIGxlbihhY3Rpb25faGVhZGVyKSA8PSBhY3Rpb25fd2lkdGg6CisgICAgICAgICAgICB0dXAgPSBzZWxmLl9jdXJyZW50X2luZGVudCwgJycsIGFjdGlvbl93aWR0aCwgYWN0aW9uX2hlYWRlcgorICAgICAgICAgICAgYWN0aW9uX2hlYWRlciA9ICclKnMlLSpzICAnICUgdHVwCisgICAgICAgICAgICBpbmRlbnRfZmlyc3QgPSAwCisKKyAgICAgICAgIyBsb25nIGFjdGlvbiBuYW1lOyBzdGFydCBvbiB0aGUgbmV4dCBsaW5lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0dXAgPSBzZWxmLl9jdXJyZW50X2luZGVudCwgJycsIGFjdGlvbl9oZWFkZXIKKyAgICAgICAgICAgIGFjdGlvbl9oZWFkZXIgPSAnJSpzJXNcbicgJSB0dXAKKyAgICAgICAgICAgIGluZGVudF9maXJzdCA9IGhlbHBfcG9zaXRpb24KKworICAgICAgICAjIGNvbGxlY3QgdGhlIHBpZWNlcyBvZiB0aGUgYWN0aW9uIGhlbHAKKyAgICAgICAgcGFydHMgPSBbYWN0aW9uX2hlYWRlcl0KKworICAgICAgICAjIGlmIHRoZXJlIHdhcyBoZWxwIGZvciB0aGUgYWN0aW9uLCBhZGQgbGluZXMgb2YgaGVscCB0ZXh0CisgICAgICAgIGlmIGFjdGlvbi5oZWxwOgorICAgICAgICAgICAgaGVscF90ZXh0ID0gc2VsZi5fZXhwYW5kX2hlbHAoYWN0aW9uKQorICAgICAgICAgICAgaGVscF9saW5lcyA9IHNlbGYuX3NwbGl0X2xpbmVzKGhlbHBfdGV4dCwgaGVscF93aWR0aCkKKyAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnJSpzJXNcbicgJSAoaW5kZW50X2ZpcnN0LCAnJywgaGVscF9saW5lc1swXSkpCisgICAgICAgICAgICBmb3IgbGluZSBpbiBoZWxwX2xpbmVzWzE6XToKKyAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoJyUqcyVzXG4nICUgKGhlbHBfcG9zaXRpb24sICcnLCBsaW5lKSkKKworICAgICAgICAjIG9yIGFkZCBhIG5ld2xpbmUgaWYgdGhlIGRlc2NyaXB0aW9uIGRvZXNuJ3QgZW5kIHdpdGggb25lCisgICAgICAgIGVsaWYgbm90IGFjdGlvbl9oZWFkZXIuZW5kc3dpdGgoJ1xuJyk6CisgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoJ1xuJykKKworICAgICAgICAjIGlmIHRoZXJlIGFyZSBhbnkgc3ViLWFjdGlvbnMsIGFkZCB0aGVpciBoZWxwIGFzIHdlbGwKKyAgICAgICAgZm9yIHN1YmFjdGlvbiBpbiBzZWxmLl9pdGVyX2luZGVudGVkX3N1YmFjdGlvbnMoYWN0aW9uKToKKyAgICAgICAgICAgIHBhcnRzLmFwcGVuZChzZWxmLl9mb3JtYXRfYWN0aW9uKHN1YmFjdGlvbikpCisKKyAgICAgICAgIyByZXR1cm4gYSBzaW5nbGUgc3RyaW5nCisgICAgICAgIHJldHVybiBzZWxmLl9qb2luX3BhcnRzKHBhcnRzKQorCisgICAgZGVmIF9mb3JtYXRfYWN0aW9uX2ludm9jYXRpb24oc2VsZiwgYWN0aW9uKToKKyAgICAgICAgaWYgbm90IGFjdGlvbi5vcHRpb25fc3RyaW5nczoKKyAgICAgICAgICAgIG1ldGF2YXIsID0gc2VsZi5fbWV0YXZhcl9mb3JtYXR0ZXIoYWN0aW9uLCBhY3Rpb24uZGVzdCkoMSkKKyAgICAgICAgICAgIHJldHVybiBtZXRhdmFyCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcnRzID0gW10KKworICAgICAgICAgICAgIyBpZiB0aGUgT3B0aW9uYWwgZG9lc24ndCB0YWtlIGEgdmFsdWUsIGZvcm1hdCBpczoKKyAgICAgICAgICAgICMgICAgLXMsIC0tbG9uZworICAgICAgICAgICAgaWYgYWN0aW9uLm5hcmdzID09IDA6CisgICAgICAgICAgICAgICAgcGFydHMuZXh0ZW5kKGFjdGlvbi5vcHRpb25fc3RyaW5ncykKKworICAgICAgICAgICAgIyBpZiB0aGUgT3B0aW9uYWwgdGFrZXMgYSB2YWx1ZSwgZm9ybWF0IGlzOgorICAgICAgICAgICAgIyAgICAtcyBBUkdTLCAtLWxvbmcgQVJHUworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWZhdWx0ID0gYWN0aW9uLmRlc3QudXBwZXIoKQorICAgICAgICAgICAgICAgIGFyZ3Nfc3RyaW5nID0gc2VsZi5fZm9ybWF0X2FyZ3MoYWN0aW9uLCBkZWZhdWx0KQorICAgICAgICAgICAgICAgIGZvciBvcHRpb25fc3RyaW5nIGluIGFjdGlvbi5vcHRpb25fc3RyaW5nczoKKyAgICAgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKCclcyAlcycgJSAob3B0aW9uX3N0cmluZywgYXJnc19zdHJpbmcpKQorCisgICAgICAgICAgICByZXR1cm4gJywgJy5qb2luKHBhcnRzKQorCisgICAgZGVmIF9tZXRhdmFyX2Zvcm1hdHRlcihzZWxmLCBhY3Rpb24sIGRlZmF1bHRfbWV0YXZhcik6CisgICAgICAgIGlmIGFjdGlvbi5tZXRhdmFyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmVzdWx0ID0gYWN0aW9uLm1ldGF2YXIKKyAgICAgICAgZWxpZiBhY3Rpb24uY2hvaWNlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNob2ljZV9zdHJzID0gW3N0cihjaG9pY2UpIGZvciBjaG9pY2UgaW4gYWN0aW9uLmNob2ljZXNdCisgICAgICAgICAgICByZXN1bHQgPSAneyVzfScgJSAnLCcuam9pbihjaG9pY2Vfc3RycykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdCA9IGRlZmF1bHRfbWV0YXZhcgorCisgICAgICAgIGRlZiBmb3JtYXQodHVwbGVfc2l6ZSk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlc3VsdCwgdHVwbGUpOgorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQsICkgKiB0dXBsZV9zaXplCisgICAgICAgIHJldHVybiBmb3JtYXQKKworICAgIGRlZiBfZm9ybWF0X2FyZ3Moc2VsZiwgYWN0aW9uLCBkZWZhdWx0X21ldGF2YXIpOgorICAgICAgICBnZXRfbWV0YXZhciA9IHNlbGYuX21ldGF2YXJfZm9ybWF0dGVyKGFjdGlvbiwgZGVmYXVsdF9tZXRhdmFyKQorICAgICAgICBpZiBhY3Rpb24ubmFyZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIHJlc3VsdCA9ICclcycgJSBnZXRfbWV0YXZhcigxKQorICAgICAgICBlbGlmIGFjdGlvbi5uYXJncyA9PSBPUFRJT05BTDoKKyAgICAgICAgICAgIHJlc3VsdCA9ICdbJXNdJyAlIGdldF9tZXRhdmFyKDEpCisgICAgICAgIGVsaWYgYWN0aW9uLm5hcmdzID09IFpFUk9fT1JfTU9SRToKKyAgICAgICAgICAgIHJlc3VsdCA9ICdbJXMgWyVzIC4uLl1dJyAlIGdldF9tZXRhdmFyKDIpCisgICAgICAgIGVsaWYgYWN0aW9uLm5hcmdzID09IE9ORV9PUl9NT1JFOgorICAgICAgICAgICAgcmVzdWx0ID0gJyVzIFslcyAuLi5dJyAlIGdldF9tZXRhdmFyKDIpCisgICAgICAgIGVsaWYgYWN0aW9uLm5hcmdzID09IFJFTUFJTkRFUjoKKyAgICAgICAgICAgIHJlc3VsdCA9ICcuLi4nCisgICAgICAgIGVsaWYgYWN0aW9uLm5hcmdzID09IFBBUlNFUjoKKyAgICAgICAgICAgIHJlc3VsdCA9ICclcyAuLi4nICUgZ2V0X21ldGF2YXIoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvcm1hdHMgPSBbJyVzJyBmb3IgXyBpbiByYW5nZShhY3Rpb24ubmFyZ3MpXQorICAgICAgICAgICAgcmVzdWx0ID0gJyAnLmpvaW4oZm9ybWF0cykgJSBnZXRfbWV0YXZhcihhY3Rpb24ubmFyZ3MpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfZXhwYW5kX2hlbHAoc2VsZiwgYWN0aW9uKToKKyAgICAgICAgcGFyYW1zID0gZGljdCh2YXJzKGFjdGlvbiksIHByb2c9c2VsZi5fcHJvZykKKyAgICAgICAgZm9yIG5hbWUgaW4gbGlzdChwYXJhbXMpOgorICAgICAgICAgICAgaWYgcGFyYW1zW25hbWVdIGlzIFNVUFBSRVNTOgorICAgICAgICAgICAgICAgIGRlbCBwYXJhbXNbbmFtZV0KKyAgICAgICAgZm9yIG5hbWUgaW4gbGlzdChwYXJhbXMpOgorICAgICAgICAgICAgaWYgaGFzYXR0cihwYXJhbXNbbmFtZV0sICdfX25hbWVfXycpOgorICAgICAgICAgICAgICAgIHBhcmFtc1tuYW1lXSA9IHBhcmFtc1tuYW1lXS5fX25hbWVfXworICAgICAgICBpZiBwYXJhbXMuZ2V0KCdjaG9pY2VzJykgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjaG9pY2VzX3N0ciA9ICcsICcuam9pbihbc3RyKGMpIGZvciBjIGluIHBhcmFtc1snY2hvaWNlcyddXSkKKyAgICAgICAgICAgIHBhcmFtc1snY2hvaWNlcyddID0gY2hvaWNlc19zdHIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9oZWxwX3N0cmluZyhhY3Rpb24pICUgcGFyYW1zCisKKyAgICBkZWYgX2l0ZXJfaW5kZW50ZWRfc3ViYWN0aW9ucyhzZWxmLCBhY3Rpb24pOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBnZXRfc3ViYWN0aW9ucyA9IGFjdGlvbi5fZ2V0X3N1YmFjdGlvbnMKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5faW5kZW50KCkKKyAgICAgICAgICAgIGZvciBzdWJhY3Rpb24gaW4gZ2V0X3N1YmFjdGlvbnMoKToKKyAgICAgICAgICAgICAgICB5aWVsZCBzdWJhY3Rpb24KKyAgICAgICAgICAgIHNlbGYuX2RlZGVudCgpCisKKyAgICBkZWYgX3NwbGl0X2xpbmVzKHNlbGYsIHRleHQsIHdpZHRoKToKKyAgICAgICAgdGV4dCA9IHNlbGYuX3doaXRlc3BhY2VfbWF0Y2hlci5zdWIoJyAnLCB0ZXh0KS5zdHJpcCgpCisgICAgICAgIHJldHVybiBfdGV4dHdyYXAud3JhcCh0ZXh0LCB3aWR0aCkKKworICAgIGRlZiBfZmlsbF90ZXh0KHNlbGYsIHRleHQsIHdpZHRoLCBpbmRlbnQpOgorICAgICAgICB0ZXh0ID0gc2VsZi5fd2hpdGVzcGFjZV9tYXRjaGVyLnN1YignICcsIHRleHQpLnN0cmlwKCkKKyAgICAgICAgcmV0dXJuIF90ZXh0d3JhcC5maWxsKHRleHQsIHdpZHRoLCBpbml0aWFsX2luZGVudD1pbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VxdWVudF9pbmRlbnQ9aW5kZW50KQorCisgICAgZGVmIF9nZXRfaGVscF9zdHJpbmcoc2VsZiwgYWN0aW9uKToKKyAgICAgICAgcmV0dXJuIGFjdGlvbi5oZWxwCisKKworY2xhc3MgUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyKEhlbHBGb3JtYXR0ZXIpOgorICAgICIiIkhlbHAgbWVzc2FnZSBmb3JtYXR0ZXIgd2hpY2ggcmV0YWlucyBhbnkgZm9ybWF0dGluZyBpbiBkZXNjcmlwdGlvbnMuCisKKyAgICBPbmx5IHRoZSBuYW1lIG9mIHRoaXMgY2xhc3MgaXMgY29uc2lkZXJlZCBhIHB1YmxpYyBBUEkuIEFsbCB0aGUgbWV0aG9kcworICAgIHByb3ZpZGVkIGJ5IHRoZSBjbGFzcyBhcmUgY29uc2lkZXJlZCBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuCisgICAgIiIiCisKKyAgICBkZWYgX2ZpbGxfdGV4dChzZWxmLCB0ZXh0LCB3aWR0aCwgaW5kZW50KToKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oW2luZGVudCArIGxpbmUgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdGxpbmVzKFRydWUpXSkKKworCitjbGFzcyBSYXdUZXh0SGVscEZvcm1hdHRlcihSYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIpOgorICAgICIiIkhlbHAgbWVzc2FnZSBmb3JtYXR0ZXIgd2hpY2ggcmV0YWlucyBmb3JtYXR0aW5nIG9mIGFsbCBoZWxwIHRleHQuCisKKyAgICBPbmx5IHRoZSBuYW1lIG9mIHRoaXMgY2xhc3MgaXMgY29uc2lkZXJlZCBhIHB1YmxpYyBBUEkuIEFsbCB0aGUgbWV0aG9kcworICAgIHByb3ZpZGVkIGJ5IHRoZSBjbGFzcyBhcmUgY29uc2lkZXJlZCBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuCisgICAgIiIiCisKKyAgICBkZWYgX3NwbGl0X2xpbmVzKHNlbGYsIHRleHQsIHdpZHRoKToKKyAgICAgICAgcmV0dXJuIHRleHQuc3BsaXRsaW5lcygpCisKKworY2xhc3MgQXJndW1lbnREZWZhdWx0c0hlbHBGb3JtYXR0ZXIoSGVscEZvcm1hdHRlcik6CisgICAgIiIiSGVscCBtZXNzYWdlIGZvcm1hdHRlciB3aGljaCBhZGRzIGRlZmF1bHQgdmFsdWVzIHRvIGFyZ3VtZW50IGhlbHAuCisKKyAgICBPbmx5IHRoZSBuYW1lIG9mIHRoaXMgY2xhc3MgaXMgY29uc2lkZXJlZCBhIHB1YmxpYyBBUEkuIEFsbCB0aGUgbWV0aG9kcworICAgIHByb3ZpZGVkIGJ5IHRoZSBjbGFzcyBhcmUgY29uc2lkZXJlZCBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuCisgICAgIiIiCisKKyAgICBkZWYgX2dldF9oZWxwX3N0cmluZyhzZWxmLCBhY3Rpb24pOgorICAgICAgICBoZWxwID0gYWN0aW9uLmhlbHAKKyAgICAgICAgaWYgJyUoZGVmYXVsdCknIG5vdCBpbiBhY3Rpb24uaGVscDoKKyAgICAgICAgICAgIGlmIGFjdGlvbi5kZWZhdWx0IGlzIG5vdCBTVVBQUkVTUzoKKyAgICAgICAgICAgICAgICBkZWZhdWx0aW5nX25hcmdzID0gW09QVElPTkFMLCBaRVJPX09SX01PUkVdCisgICAgICAgICAgICAgICAgaWYgYWN0aW9uLm9wdGlvbl9zdHJpbmdzIG9yIGFjdGlvbi5uYXJncyBpbiBkZWZhdWx0aW5nX25hcmdzOgorICAgICAgICAgICAgICAgICAgICBoZWxwICs9ICcgKGRlZmF1bHQ6ICUoZGVmYXVsdClzKScKKyAgICAgICAgcmV0dXJuIGhlbHAKKworCisjID09PT09PT09PT09PT09PT09PT09PQorIyBPcHRpb25zIGFuZCBBcmd1bWVudHMKKyMgPT09PT09PT09PT09PT09PT09PT09CisKK2RlZiBfZ2V0X2FjdGlvbl9uYW1lKGFyZ3VtZW50KToKKyAgICBpZiBhcmd1bWVudCBpcyBOb25lOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGVsaWYgYXJndW1lbnQub3B0aW9uX3N0cmluZ3M6CisgICAgICAgIHJldHVybiAgJy8nLmpvaW4oYXJndW1lbnQub3B0aW9uX3N0cmluZ3MpCisgICAgZWxpZiBhcmd1bWVudC5tZXRhdmFyIG5vdCBpbiAoTm9uZSwgU1VQUFJFU1MpOgorICAgICAgICByZXR1cm4gYXJndW1lbnQubWV0YXZhcgorICAgIGVsaWYgYXJndW1lbnQuZGVzdCBub3QgaW4gKE5vbmUsIFNVUFBSRVNTKToKKyAgICAgICAgcmV0dXJuIGFyZ3VtZW50LmRlc3QKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIEFyZ3VtZW50RXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJBbiBlcnJvciBmcm9tIGNyZWF0aW5nIG9yIHVzaW5nIGFuIGFyZ3VtZW50IChvcHRpb25hbCBvciBwb3NpdGlvbmFsKS4KKworICAgIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhpcyBleGNlcHRpb24gaXMgdGhlIG1lc3NhZ2UsIGF1Z21lbnRlZCB3aXRoCisgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFyZ3VtZW50IHRoYXQgY2F1c2VkIGl0LgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3VtZW50LCBtZXNzYWdlKToKKyAgICAgICAgc2VsZi5hcmd1bWVudF9uYW1lID0gX2dldF9hY3Rpb25fbmFtZShhcmd1bWVudCkKKyAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuYXJndW1lbnRfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgZm9ybWF0ID0gJyUobWVzc2FnZSlzJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9ybWF0ID0gJ2FyZ3VtZW50ICUoYXJndW1lbnRfbmFtZSlzOiAlKG1lc3NhZ2UpcycKKyAgICAgICAgcmV0dXJuIGZvcm1hdCAlIGRpY3QobWVzc2FnZT1zZWxmLm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50X25hbWU9c2VsZi5hcmd1bWVudF9uYW1lKQorCisKK2NsYXNzIEFyZ3VtZW50VHlwZUVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiQW4gZXJyb3IgZnJvbSB0cnlpbmcgdG8gY29udmVydCBhIGNvbW1hbmQgbGluZSBzdHJpbmcgdG8gYSB0eXBlLiIiIgorICAgIHBhc3MKKworCisjID09PT09PT09PT09PT09CisjIEFjdGlvbiBjbGFzc2VzCisjID09PT09PT09PT09PT09CisKK2NsYXNzIEFjdGlvbihfQXR0cmlidXRlSG9sZGVyKToKKyAgICAiIiJJbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gY29udmVydCBjb21tYW5kIGxpbmUgc3RyaW5ncyB0byBQeXRob24gb2JqZWN0cy4KKworICAgIEFjdGlvbiBvYmplY3RzIGFyZSB1c2VkIGJ5IGFuIEFyZ3VtZW50UGFyc2VyIHRvIHJlcHJlc2VudCB0aGUgaW5mb3JtYXRpb24KKyAgICBuZWVkZWQgdG8gcGFyc2UgYSBzaW5nbGUgYXJndW1lbnQgZnJvbSBvbmUgb3IgbW9yZSBzdHJpbmdzIGZyb20gdGhlCisgICAgY29tbWFuZCBsaW5lLiBUaGUga2V5d29yZCBhcmd1bWVudHMgdG8gdGhlIEFjdGlvbiBjb25zdHJ1Y3RvciBhcmUgYWxzbworICAgIGFsbCBhdHRyaWJ1dGVzIG9mIEFjdGlvbiBpbnN0YW5jZXMuCisKKyAgICBLZXl3b3JkIEFyZ3VtZW50czoKKworICAgICAgICAtIG9wdGlvbl9zdHJpbmdzIC0tIEEgbGlzdCBvZiBjb21tYW5kLWxpbmUgb3B0aW9uIHN0cmluZ3Mgd2hpY2gKKyAgICAgICAgICAgIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY3Rpb24uCisKKyAgICAgICAgLSBkZXN0IC0tIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gaG9sZCB0aGUgY3JlYXRlZCBvYmplY3QocykKKworICAgICAgICAtIG5hcmdzIC0tIFRoZSBudW1iZXIgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0aGF0IHNob3VsZCBiZQorICAgICAgICAgICAgY29uc3VtZWQuIEJ5IGRlZmF1bHQsIG9uZSBhcmd1bWVudCB3aWxsIGJlIGNvbnN1bWVkIGFuZCBhIHNpbmdsZQorICAgICAgICAgICAgdmFsdWUgd2lsbCBiZSBwcm9kdWNlZC4gIE90aGVyIHZhbHVlcyBpbmNsdWRlOgorICAgICAgICAgICAgICAgIC0gTiAoYW4gaW50ZWdlcikgY29uc3VtZXMgTiBhcmd1bWVudHMgKGFuZCBwcm9kdWNlcyBhIGxpc3QpCisgICAgICAgICAgICAgICAgLSAnPycgY29uc3VtZXMgemVybyBvciBvbmUgYXJndW1lbnRzCisgICAgICAgICAgICAgICAgLSAnKicgY29uc3VtZXMgemVybyBvciBtb3JlIGFyZ3VtZW50cyAoYW5kIHByb2R1Y2VzIGEgbGlzdCkKKyAgICAgICAgICAgICAgICAtICcrJyBjb25zdW1lcyBvbmUgb3IgbW9yZSBhcmd1bWVudHMgKGFuZCBwcm9kdWNlcyBhIGxpc3QpCisgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZGVmYXVsdCBhbmQgbmFyZ3M9MSBpcyB0aGF0CisgICAgICAgICAgICB3aXRoIHRoZSBkZWZhdWx0LCBhIHNpbmdsZSB2YWx1ZSB3aWxsIGJlIHByb2R1Y2VkLCB3aGlsZSB3aXRoCisgICAgICAgICAgICBuYXJncz0xLCBhIGxpc3QgY29udGFpbmluZyBhIHNpbmdsZSB2YWx1ZSB3aWxsIGJlIHByb2R1Y2VkLgorCisgICAgICAgIC0gY29uc3QgLS0gVGhlIHZhbHVlIHRvIGJlIHByb2R1Y2VkIGlmIHRoZSBvcHRpb24gaXMgc3BlY2lmaWVkIGFuZCB0aGUKKyAgICAgICAgICAgIG9wdGlvbiB1c2VzIGFuIGFjdGlvbiB0aGF0IHRha2VzIG5vIHZhbHVlcy4KKworICAgICAgICAtIGRlZmF1bHQgLS0gVGhlIHZhbHVlIHRvIGJlIHByb2R1Y2VkIGlmIHRoZSBvcHRpb24gaXMgbm90IHNwZWNpZmllZC4KKworICAgICAgICAtIHR5cGUgLS0gQSBjYWxsYWJsZSB0aGF0IGFjY2VwdHMgYSBzaW5nbGUgc3RyaW5nIGFyZ3VtZW50LCBhbmQKKyAgICAgICAgICAgIHJldHVybnMgdGhlIGNvbnZlcnRlZCB2YWx1ZS4gIFRoZSBzdGFuZGFyZCBQeXRob24gdHlwZXMgc3RyLCBpbnQsCisgICAgICAgICAgICBmbG9hdCwgYW5kIGNvbXBsZXggYXJlIHVzZWZ1bCBleGFtcGxlcyBvZiBzdWNoIGNhbGxhYmxlcy4gIElmIE5vbmUsCisgICAgICAgICAgICBzdHIgaXMgdXNlZC4KKworICAgICAgICAtIGNob2ljZXMgLS0gQSBjb250YWluZXIgb2YgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGFsbG93ZWQuIElmIG5vdCBOb25lLAorICAgICAgICAgICAgYWZ0ZXIgYSBjb21tYW5kLWxpbmUgYXJndW1lbnQgaGFzIGJlZW4gY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZQorICAgICAgICAgICAgdHlwZSwgYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIGlmIGl0IGlzIG5vdCBhIG1lbWJlciBvZiB0aGlzCisgICAgICAgICAgICBjb2xsZWN0aW9uLgorCisgICAgICAgIC0gcmVxdWlyZWQgLS0gVHJ1ZSBpZiB0aGUgYWN0aW9uIG11c3QgYWx3YXlzIGJlIHNwZWNpZmllZCBhdCB0aGUKKyAgICAgICAgICAgIGNvbW1hbmQgbGluZS4gVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIG9wdGlvbmFsIGNvbW1hbmQtbGluZQorICAgICAgICAgICAgYXJndW1lbnRzLgorCisgICAgICAgIC0gaGVscCAtLSBUaGUgaGVscCBzdHJpbmcgZGVzY3JpYmluZyB0aGUgYXJndW1lbnQuCisKKyAgICAgICAgLSBtZXRhdmFyIC0tIFRoZSBuYW1lIHRvIGJlIHVzZWQgZm9yIHRoZSBvcHRpb24ncyBhcmd1bWVudCB3aXRoIHRoZQorICAgICAgICAgICAgaGVscCBzdHJpbmcuIElmIE5vbmUsIHRoZSAnZGVzdCcgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIHRoZSBuYW1lLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgICAgICBkZXN0LAorICAgICAgICAgICAgICAgICBuYXJncz1Ob25lLAorICAgICAgICAgICAgICAgICBjb25zdD1Ob25lLAorICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgIHR5cGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY2hvaWNlcz1Ob25lLAorICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgaGVscD1Ob25lLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPU5vbmUpOgorICAgICAgICBzZWxmLm9wdGlvbl9zdHJpbmdzID0gb3B0aW9uX3N0cmluZ3MKKyAgICAgICAgc2VsZi5kZXN0ID0gZGVzdAorICAgICAgICBzZWxmLm5hcmdzID0gbmFyZ3MKKyAgICAgICAgc2VsZi5jb25zdCA9IGNvbnN0CisgICAgICAgIHNlbGYuZGVmYXVsdCA9IGRlZmF1bHQKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICBzZWxmLmNob2ljZXMgPSBjaG9pY2VzCisgICAgICAgIHNlbGYucmVxdWlyZWQgPSByZXF1aXJlZAorICAgICAgICBzZWxmLmhlbHAgPSBoZWxwCisgICAgICAgIHNlbGYubWV0YXZhciA9IG1ldGF2YXIKKworICAgIGRlZiBfZ2V0X2t3YXJncyhzZWxmKToKKyAgICAgICAgbmFtZXMgPSBbCisgICAgICAgICAgICAnb3B0aW9uX3N0cmluZ3MnLAorICAgICAgICAgICAgJ2Rlc3QnLAorICAgICAgICAgICAgJ25hcmdzJywKKyAgICAgICAgICAgICdjb25zdCcsCisgICAgICAgICAgICAnZGVmYXVsdCcsCisgICAgICAgICAgICAndHlwZScsCisgICAgICAgICAgICAnY2hvaWNlcycsCisgICAgICAgICAgICAnaGVscCcsCisgICAgICAgICAgICAnbWV0YXZhcicsCisgICAgICAgIF0KKyAgICAgICAgcmV0dXJuIFsobmFtZSwgZ2V0YXR0cihzZWxmLCBuYW1lKSkgZm9yIG5hbWUgaW4gbmFtZXNdCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcGFyc2VyLCBuYW1lc3BhY2UsIHZhbHVlcywgb3B0aW9uX3N0cmluZz1Ob25lKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcihfKCcuX19jYWxsX18oKSBub3QgZGVmaW5lZCcpKQorCisKK2NsYXNzIF9TdG9yZUFjdGlvbihBY3Rpb24pOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgICAgICBkZXN0LAorICAgICAgICAgICAgICAgICBuYXJncz1Ob25lLAorICAgICAgICAgICAgICAgICBjb25zdD1Ob25lLAorICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgIHR5cGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY2hvaWNlcz1Ob25lLAorICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgaGVscD1Ob25lLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPU5vbmUpOgorICAgICAgICBpZiBuYXJncyA9PSAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbmFyZ3MgZm9yIHN0b3JlIGFjdGlvbnMgbXVzdCBiZSA+IDA7IGlmIHlvdSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYXZlIG5vdGhpbmcgdG8gc3RvcmUsIGFjdGlvbnMgc3VjaCBhcyBzdG9yZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cnVlIG9yIHN0b3JlIGNvbnN0IG1heSBiZSBtb3JlIGFwcHJvcHJpYXRlJykKKyAgICAgICAgaWYgY29uc3QgaXMgbm90IE5vbmUgYW5kIG5hcmdzICE9IE9QVElPTkFMOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbmFyZ3MgbXVzdCBiZSAlciB0byBzdXBwbHkgY29uc3QnICUgT1BUSU9OQUwpCisgICAgICAgIHN1cGVyKF9TdG9yZUFjdGlvbiwgc2VsZikuX19pbml0X18oCisgICAgICAgICAgICBvcHRpb25fc3RyaW5ncz1vcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgIGRlc3Q9ZGVzdCwKKyAgICAgICAgICAgIG5hcmdzPW5hcmdzLAorICAgICAgICAgICAgY29uc3Q9Y29uc3QsCisgICAgICAgICAgICBkZWZhdWx0PWRlZmF1bHQsCisgICAgICAgICAgICB0eXBlPXR5cGUsCisgICAgICAgICAgICBjaG9pY2VzPWNob2ljZXMsCisgICAgICAgICAgICByZXF1aXJlZD1yZXF1aXJlZCwKKyAgICAgICAgICAgIGhlbHA9aGVscCwKKyAgICAgICAgICAgIG1ldGF2YXI9bWV0YXZhcikKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBwYXJzZXIsIG5hbWVzcGFjZSwgdmFsdWVzLCBvcHRpb25fc3RyaW5nPU5vbmUpOgorICAgICAgICBzZXRhdHRyKG5hbWVzcGFjZSwgc2VsZi5kZXN0LCB2YWx1ZXMpCisKKworY2xhc3MgX1N0b3JlQ29uc3RBY3Rpb24oQWN0aW9uKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBvcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgZGVzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QsCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9RmFsc2UsCisgICAgICAgICAgICAgICAgIGhlbHA9Tm9uZSwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj1Ob25lKToKKyAgICAgICAgc3VwZXIoX1N0b3JlQ29uc3RBY3Rpb24sIHNlbGYpLl9faW5pdF9fKAorICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3M9b3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICBkZXN0PWRlc3QsCisgICAgICAgICAgICBuYXJncz0wLAorICAgICAgICAgICAgY29uc3Q9Y29uc3QsCisgICAgICAgICAgICBkZWZhdWx0PWRlZmF1bHQsCisgICAgICAgICAgICByZXF1aXJlZD1yZXF1aXJlZCwKKyAgICAgICAgICAgIGhlbHA9aGVscCkKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBwYXJzZXIsIG5hbWVzcGFjZSwgdmFsdWVzLCBvcHRpb25fc3RyaW5nPU5vbmUpOgorICAgICAgICBzZXRhdHRyKG5hbWVzcGFjZSwgc2VsZi5kZXN0LCBzZWxmLmNvbnN0KQorCisKK2NsYXNzIF9TdG9yZVRydWVBY3Rpb24oX1N0b3JlQ29uc3RBY3Rpb24pOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgICAgICBkZXN0LAorICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgaGVscD1Ob25lKToKKyAgICAgICAgc3VwZXIoX1N0b3JlVHJ1ZUFjdGlvbiwgc2VsZikuX19pbml0X18oCisgICAgICAgICAgICBvcHRpb25fc3RyaW5ncz1vcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgIGRlc3Q9ZGVzdCwKKyAgICAgICAgICAgIGNvbnN0PVRydWUsCisgICAgICAgICAgICBkZWZhdWx0PWRlZmF1bHQsCisgICAgICAgICAgICByZXF1aXJlZD1yZXF1aXJlZCwKKyAgICAgICAgICAgIGhlbHA9aGVscCkKKworCitjbGFzcyBfU3RvcmVGYWxzZUFjdGlvbihfU3RvcmVDb25zdEFjdGlvbik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICAgICAgIGRlc3QsCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9RmFsc2UsCisgICAgICAgICAgICAgICAgIGhlbHA9Tm9uZSk6CisgICAgICAgIHN1cGVyKF9TdG9yZUZhbHNlQWN0aW9uLCBzZWxmKS5fX2luaXRfXygKKyAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzPW9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgZGVzdD1kZXN0LAorICAgICAgICAgICAgY29uc3Q9RmFsc2UsCisgICAgICAgICAgICBkZWZhdWx0PWRlZmF1bHQsCisgICAgICAgICAgICByZXF1aXJlZD1yZXF1aXJlZCwKKyAgICAgICAgICAgIGhlbHA9aGVscCkKKworCitjbGFzcyBfQXBwZW5kQWN0aW9uKEFjdGlvbik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICAgICAgIGRlc3QsCisgICAgICAgICAgICAgICAgIG5hcmdzPU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnN0PU5vbmUsCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgdHlwZT1Ob25lLAorICAgICAgICAgICAgICAgICBjaG9pY2VzPU5vbmUsCisgICAgICAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlLAorICAgICAgICAgICAgICAgICBoZWxwPU5vbmUsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9Tm9uZSk6CisgICAgICAgIGlmIG5hcmdzID09IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCduYXJncyBmb3IgYXBwZW5kIGFjdGlvbnMgbXVzdCBiZSA+IDA7IGlmIGFyZyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmdzIGFyZSBub3Qgc3VwcGx5aW5nIHRoZSB2YWx1ZSB0byBhcHBlbmQsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoZSBhcHBlbmQgY29uc3QgYWN0aW9uIG1heSBiZSBtb3JlIGFwcHJvcHJpYXRlJykKKyAgICAgICAgaWYgY29uc3QgaXMgbm90IE5vbmUgYW5kIG5hcmdzICE9IE9QVElPTkFMOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbmFyZ3MgbXVzdCBiZSAlciB0byBzdXBwbHkgY29uc3QnICUgT1BUSU9OQUwpCisgICAgICAgIHN1cGVyKF9BcHBlbmRBY3Rpb24sIHNlbGYpLl9faW5pdF9fKAorICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3M9b3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICBkZXN0PWRlc3QsCisgICAgICAgICAgICBuYXJncz1uYXJncywKKyAgICAgICAgICAgIGNvbnN0PWNvbnN0LAorICAgICAgICAgICAgZGVmYXVsdD1kZWZhdWx0LAorICAgICAgICAgICAgdHlwZT10eXBlLAorICAgICAgICAgICAgY2hvaWNlcz1jaG9pY2VzLAorICAgICAgICAgICAgcmVxdWlyZWQ9cmVxdWlyZWQsCisgICAgICAgICAgICBoZWxwPWhlbHAsCisgICAgICAgICAgICBtZXRhdmFyPW1ldGF2YXIpCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcGFyc2VyLCBuYW1lc3BhY2UsIHZhbHVlcywgb3B0aW9uX3N0cmluZz1Ob25lKToKKyAgICAgICAgaXRlbXMgPSBfY29weS5jb3B5KF9lbnN1cmVfdmFsdWUobmFtZXNwYWNlLCBzZWxmLmRlc3QsIFtdKSkKKyAgICAgICAgaXRlbXMuYXBwZW5kKHZhbHVlcykKKyAgICAgICAgc2V0YXR0cihuYW1lc3BhY2UsIHNlbGYuZGVzdCwgaXRlbXMpCisKKworY2xhc3MgX0FwcGVuZENvbnN0QWN0aW9uKEFjdGlvbik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICAgICAgIGRlc3QsCisgICAgICAgICAgICAgICAgIGNvbnN0LAorICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlLAorICAgICAgICAgICAgICAgICBoZWxwPU5vbmUsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9Tm9uZSk6CisgICAgICAgIHN1cGVyKF9BcHBlbmRDb25zdEFjdGlvbiwgc2VsZikuX19pbml0X18oCisgICAgICAgICAgICBvcHRpb25fc3RyaW5ncz1vcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgIGRlc3Q9ZGVzdCwKKyAgICAgICAgICAgIG5hcmdzPTAsCisgICAgICAgICAgICBjb25zdD1jb25zdCwKKyAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdCwKKyAgICAgICAgICAgIHJlcXVpcmVkPXJlcXVpcmVkLAorICAgICAgICAgICAgaGVscD1oZWxwLAorICAgICAgICAgICAgbWV0YXZhcj1tZXRhdmFyKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHBhcnNlciwgbmFtZXNwYWNlLCB2YWx1ZXMsIG9wdGlvbl9zdHJpbmc9Tm9uZSk6CisgICAgICAgIGl0ZW1zID0gX2NvcHkuY29weShfZW5zdXJlX3ZhbHVlKG5hbWVzcGFjZSwgc2VsZi5kZXN0LCBbXSkpCisgICAgICAgIGl0ZW1zLmFwcGVuZChzZWxmLmNvbnN0KQorICAgICAgICBzZXRhdHRyKG5hbWVzcGFjZSwgc2VsZi5kZXN0LCBpdGVtcykKKworCitjbGFzcyBfQ291bnRBY3Rpb24oQWN0aW9uKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBvcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgZGVzdCwKKyAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgaGVscD1Ob25lKToKKyAgICAgICAgc3VwZXIoX0NvdW50QWN0aW9uLCBzZWxmKS5fX2luaXRfXygKKyAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzPW9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgZGVzdD1kZXN0LAorICAgICAgICAgICAgbmFyZ3M9MCwKKyAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdCwKKyAgICAgICAgICAgIHJlcXVpcmVkPXJlcXVpcmVkLAorICAgICAgICAgICAgaGVscD1oZWxwKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHBhcnNlciwgbmFtZXNwYWNlLCB2YWx1ZXMsIG9wdGlvbl9zdHJpbmc9Tm9uZSk6CisgICAgICAgIG5ld19jb3VudCA9IF9lbnN1cmVfdmFsdWUobmFtZXNwYWNlLCBzZWxmLmRlc3QsIDApICsgMQorICAgICAgICBzZXRhdHRyKG5hbWVzcGFjZSwgc2VsZi5kZXN0LCBuZXdfY291bnQpCisKKworY2xhc3MgX0hlbHBBY3Rpb24oQWN0aW9uKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBvcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgZGVzdD1TVVBQUkVTUywKKyAgICAgICAgICAgICAgICAgZGVmYXVsdD1TVVBQUkVTUywKKyAgICAgICAgICAgICAgICAgaGVscD1Ob25lKToKKyAgICAgICAgc3VwZXIoX0hlbHBBY3Rpb24sIHNlbGYpLl9faW5pdF9fKAorICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3M9b3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICBkZXN0PWRlc3QsCisgICAgICAgICAgICBkZWZhdWx0PWRlZmF1bHQsCisgICAgICAgICAgICBuYXJncz0wLAorICAgICAgICAgICAgaGVscD1oZWxwKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHBhcnNlciwgbmFtZXNwYWNlLCB2YWx1ZXMsIG9wdGlvbl9zdHJpbmc9Tm9uZSk6CisgICAgICAgIHBhcnNlci5wcmludF9oZWxwKCkKKyAgICAgICAgcGFyc2VyLmV4aXQoKQorCisKK2NsYXNzIF9WZXJzaW9uQWN0aW9uKEFjdGlvbik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICAgICAgIHZlcnNpb249Tm9uZSwKKyAgICAgICAgICAgICAgICAgZGVzdD1TVVBQUkVTUywKKyAgICAgICAgICAgICAgICAgZGVmYXVsdD1TVVBQUkVTUywKKyAgICAgICAgICAgICAgICAgaGVscD0ic2hvdyBwcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQiKToKKyAgICAgICAgc3VwZXIoX1ZlcnNpb25BY3Rpb24sIHNlbGYpLl9faW5pdF9fKAorICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3M9b3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICBkZXN0PWRlc3QsCisgICAgICAgICAgICBkZWZhdWx0PWRlZmF1bHQsCisgICAgICAgICAgICBuYXJncz0wLAorICAgICAgICAgICAgaGVscD1oZWxwKQorICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcGFyc2VyLCBuYW1lc3BhY2UsIHZhbHVlcywgb3B0aW9uX3N0cmluZz1Ob25lKToKKyAgICAgICAgdmVyc2lvbiA9IHNlbGYudmVyc2lvbgorICAgICAgICBpZiB2ZXJzaW9uIGlzIE5vbmU6CisgICAgICAgICAgICB2ZXJzaW9uID0gcGFyc2VyLnZlcnNpb24KKyAgICAgICAgZm9ybWF0dGVyID0gcGFyc2VyLl9nZXRfZm9ybWF0dGVyKCkKKyAgICAgICAgZm9ybWF0dGVyLmFkZF90ZXh0KHZlcnNpb24pCisgICAgICAgIHBhcnNlci5leGl0KG1lc3NhZ2U9Zm9ybWF0dGVyLmZvcm1hdF9oZWxwKCkpCisKKworY2xhc3MgX1N1YlBhcnNlcnNBY3Rpb24oQWN0aW9uKToKKworICAgIGNsYXNzIF9DaG9pY2VzUHNldWRvQWN0aW9uKEFjdGlvbik6CisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGhlbHApOgorICAgICAgICAgICAgc3VwID0gc3VwZXIoX1N1YlBhcnNlcnNBY3Rpb24uX0Nob2ljZXNQc2V1ZG9BY3Rpb24sIHNlbGYpCisgICAgICAgICAgICBzdXAuX19pbml0X18ob3B0aW9uX3N0cmluZ3M9W10sIGRlc3Q9bmFtZSwgaGVscD1oZWxwKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgICAgICBwcm9nLAorICAgICAgICAgICAgICAgICBwYXJzZXJfY2xhc3MsCisgICAgICAgICAgICAgICAgIGRlc3Q9U1VQUFJFU1MsCisgICAgICAgICAgICAgICAgIGhlbHA9Tm9uZSwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj1Ob25lKToKKworICAgICAgICBzZWxmLl9wcm9nX3ByZWZpeCA9IHByb2cKKyAgICAgICAgc2VsZi5fcGFyc2VyX2NsYXNzID0gcGFyc2VyX2NsYXNzCisgICAgICAgIHNlbGYuX25hbWVfcGFyc2VyX21hcCA9IF9jb2xsZWN0aW9ucy5PcmRlcmVkRGljdCgpCisgICAgICAgIHNlbGYuX2Nob2ljZXNfYWN0aW9ucyA9IFtdCisKKyAgICAgICAgc3VwZXIoX1N1YlBhcnNlcnNBY3Rpb24sIHNlbGYpLl9faW5pdF9fKAorICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3M9b3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICBkZXN0PWRlc3QsCisgICAgICAgICAgICBuYXJncz1QQVJTRVIsCisgICAgICAgICAgICBjaG9pY2VzPXNlbGYuX25hbWVfcGFyc2VyX21hcCwKKyAgICAgICAgICAgIGhlbHA9aGVscCwKKyAgICAgICAgICAgIG1ldGF2YXI9bWV0YXZhcikKKworICAgIGRlZiBhZGRfcGFyc2VyKHNlbGYsIG5hbWUsICoqa3dhcmdzKToKKyAgICAgICAgIyBzZXQgcHJvZyBmcm9tIHRoZSBleGlzdGluZyBwcmVmaXgKKyAgICAgICAgaWYga3dhcmdzLmdldCgncHJvZycpIGlzIE5vbmU6CisgICAgICAgICAgICBrd2FyZ3NbJ3Byb2cnXSA9ICclcyAlcycgJSAoc2VsZi5fcHJvZ19wcmVmaXgsIG5hbWUpCisKKyAgICAgICAgIyBjcmVhdGUgYSBwc2V1ZG8tYWN0aW9uIHRvIGhvbGQgdGhlIGNob2ljZSBoZWxwCisgICAgICAgIGlmICdoZWxwJyBpbiBrd2FyZ3M6CisgICAgICAgICAgICBoZWxwID0ga3dhcmdzLnBvcCgnaGVscCcpCisgICAgICAgICAgICBjaG9pY2VfYWN0aW9uID0gc2VsZi5fQ2hvaWNlc1BzZXVkb0FjdGlvbihuYW1lLCBoZWxwKQorICAgICAgICAgICAgc2VsZi5fY2hvaWNlc19hY3Rpb25zLmFwcGVuZChjaG9pY2VfYWN0aW9uKQorCisgICAgICAgICMgY3JlYXRlIHRoZSBwYXJzZXIgYW5kIGFkZCBpdCB0byB0aGUgbWFwCisgICAgICAgIHBhcnNlciA9IHNlbGYuX3BhcnNlcl9jbGFzcygqKmt3YXJncykKKyAgICAgICAgc2VsZi5fbmFtZV9wYXJzZXJfbWFwW25hbWVdID0gcGFyc2VyCisgICAgICAgIHJldHVybiBwYXJzZXIKKworICAgIGRlZiBfZ2V0X3N1YmFjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jaG9pY2VzX2FjdGlvbnMKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBwYXJzZXIsIG5hbWVzcGFjZSwgdmFsdWVzLCBvcHRpb25fc3RyaW5nPU5vbmUpOgorICAgICAgICBwYXJzZXJfbmFtZSA9IHZhbHVlc1swXQorICAgICAgICBhcmdfc3RyaW5ncyA9IHZhbHVlc1sxOl0KKworICAgICAgICAjIHNldCB0aGUgcGFyc2VyIG5hbWUgaWYgcmVxdWVzdGVkCisgICAgICAgIGlmIHNlbGYuZGVzdCBpcyBub3QgU1VQUFJFU1M6CisgICAgICAgICAgICBzZXRhdHRyKG5hbWVzcGFjZSwgc2VsZi5kZXN0LCBwYXJzZXJfbmFtZSkKKworICAgICAgICAjIHNlbGVjdCB0aGUgcGFyc2VyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlciA9IHNlbGYuX25hbWVfcGFyc2VyX21hcFtwYXJzZXJfbmFtZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgdHVwID0gcGFyc2VyX25hbWUsICcsICcuam9pbihzZWxmLl9uYW1lX3BhcnNlcl9tYXApCisgICAgICAgICAgICBtc2cgPSBfKCd1bmtub3duIHBhcnNlciAlciAoY2hvaWNlczogJXMpJykgJSB0dXAKKyAgICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3Ioc2VsZiwgbXNnKQorCisgICAgICAgICMgcGFyc2UgYWxsIHRoZSByZW1haW5pbmcgb3B0aW9ucyBpbnRvIHRoZSBuYW1lc3BhY2UKKyAgICAgICAgIyBzdG9yZSBhbnkgdW5yZWNvZ25pemVkIG9wdGlvbnMgb24gdGhlIG9iamVjdCwgc28gdGhhdCB0aGUgdG9wCisgICAgICAgICMgbGV2ZWwgcGFyc2VyIGNhbiBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIHRoZW0KKyAgICAgICAgbmFtZXNwYWNlLCBhcmdfc3RyaW5ncyA9IHBhcnNlci5wYXJzZV9rbm93bl9hcmdzKGFyZ19zdHJpbmdzLCBuYW1lc3BhY2UpCisgICAgICAgIGlmIGFyZ19zdHJpbmdzOgorICAgICAgICAgICAgdmFycyhuYW1lc3BhY2UpLnNldGRlZmF1bHQoX1VOUkVDT0dOSVpFRF9BUkdTX0FUVFIsIFtdKQorICAgICAgICAgICAgZ2V0YXR0cihuYW1lc3BhY2UsIF9VTlJFQ09HTklaRURfQVJHU19BVFRSKS5leHRlbmQoYXJnX3N0cmluZ3MpCisKKworIyA9PT09PT09PT09PT09PQorIyBUeXBlIGNsYXNzZXMKKyMgPT09PT09PT09PT09PT0KKworY2xhc3MgRmlsZVR5cGUob2JqZWN0KToKKyAgICAiIiJGYWN0b3J5IGZvciBjcmVhdGluZyBmaWxlIG9iamVjdCB0eXBlcworCisgICAgSW5zdGFuY2VzIG9mIEZpbGVUeXBlIGFyZSB0eXBpY2FsbHkgcGFzc2VkIGFzIHR5cGU9IGFyZ3VtZW50cyB0byB0aGUKKyAgICBBcmd1bWVudFBhcnNlciBhZGRfYXJndW1lbnQoKSBtZXRob2QuCisKKyAgICBLZXl3b3JkIEFyZ3VtZW50czoKKyAgICAgICAgLSBtb2RlIC0tIEEgc3RyaW5nIGluZGljYXRpbmcgaG93IHRoZSBmaWxlIGlzIHRvIGJlIG9wZW5lZC4gQWNjZXB0cyB0aGUKKyAgICAgICAgICAgIHNhbWUgdmFsdWVzIGFzIHRoZSBidWlsdGluIG9wZW4oKSBmdW5jdGlvbi4KKyAgICAgICAgLSBidWZzaXplIC0tIFRoZSBmaWxlJ3MgZGVzaXJlZCBidWZmZXIgc2l6ZS4gQWNjZXB0cyB0aGUgc2FtZSB2YWx1ZXMgYXMKKyAgICAgICAgICAgIHRoZSBidWlsdGluIG9wZW4oKSBmdW5jdGlvbi4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2RlPSdyJywgYnVmc2l6ZT0tMSk6CisgICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCisgICAgICAgIHNlbGYuX2J1ZnNpemUgPSBidWZzaXplCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgc3RyaW5nKToKKyAgICAgICAgIyB0aGUgc3BlY2lhbCBhcmd1bWVudCAiLSIgbWVhbnMgc3lzLnN0ZHtpbixvdXR9CisgICAgICAgIGlmIHN0cmluZyA9PSAnLSc6CisgICAgICAgICAgICBpZiAncicgaW4gc2VsZi5fbW9kZToKKyAgICAgICAgICAgICAgICByZXR1cm4gX3N5cy5zdGRpbgorICAgICAgICAgICAgZWxpZiAndycgaW4gc2VsZi5fbW9kZToKKyAgICAgICAgICAgICAgICByZXR1cm4gX3N5cy5zdGRvdXQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbXNnID0gXygnYXJndW1lbnQgIi0iIHdpdGggbW9kZSAlcicpICUgc2VsZi5fbW9kZQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnKQorCisgICAgICAgICMgYWxsIG90aGVyIGFyZ3VtZW50cyBhcmUgdXNlZCBhcyBmaWxlIG5hbWVzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBvcGVuKHN0cmluZywgc2VsZi5fbW9kZSwgc2VsZi5fYnVmc2l6ZSkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBfKCJjYW4ndCBvcGVuICclcyc6ICVzIikKKyAgICAgICAgICAgIHJhaXNlIEFyZ3VtZW50VHlwZUVycm9yKG1lc3NhZ2UgJSAoc3RyaW5nLCBlKSkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgYXJncyA9IHNlbGYuX21vZGUsIHNlbGYuX2J1ZnNpemUKKyAgICAgICAgYXJnc19zdHIgPSAnLCAnLmpvaW4ocmVwcihhcmcpIGZvciBhcmcgaW4gYXJncyBpZiBhcmcgIT0gLTEpCisgICAgICAgIHJldHVybiAnJXMoJXMpJyAlICh0eXBlKHNlbGYpLl9fbmFtZV9fLCBhcmdzX3N0cikKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgT3B0aW9uYWwgYW5kIFBvc2l0aW9uYWwgUGFyc2luZworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgTmFtZXNwYWNlKF9BdHRyaWJ1dGVIb2xkZXIpOgorICAgICIiIlNpbXBsZSBvYmplY3QgZm9yIHN0b3JpbmcgYXR0cmlidXRlcy4KKworICAgIEltcGxlbWVudHMgZXF1YWxpdHkgYnkgYXR0cmlidXRlIG5hbWVzIGFuZCB2YWx1ZXMsIGFuZCBwcm92aWRlcyBhIHNpbXBsZQorICAgIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIGZvciBuYW1lIGluIGt3YXJnczoKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwga3dhcmdzW25hbWVdKQorCisgICAgX19oYXNoX18gPSBOb25lCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHZhcnMoc2VsZikgPT0gdmFycyhvdGhlcikKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX19kaWN0X18KKworCitjbGFzcyBfQWN0aW9uc0NvbnRhaW5lcihvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICBwcmVmaXhfY2hhcnMsCisgICAgICAgICAgICAgICAgIGFyZ3VtZW50X2RlZmF1bHQsCisgICAgICAgICAgICAgICAgIGNvbmZsaWN0X2hhbmRsZXIpOgorICAgICAgICBzdXBlcihfQWN0aW9uc0NvbnRhaW5lciwgc2VsZikuX19pbml0X18oKQorCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbgorICAgICAgICBzZWxmLmFyZ3VtZW50X2RlZmF1bHQgPSBhcmd1bWVudF9kZWZhdWx0CisgICAgICAgIHNlbGYucHJlZml4X2NoYXJzID0gcHJlZml4X2NoYXJzCisgICAgICAgIHNlbGYuY29uZmxpY3RfaGFuZGxlciA9IGNvbmZsaWN0X2hhbmRsZXIKKworICAgICAgICAjIHNldCB1cCByZWdpc3RyaWVzCisgICAgICAgIHNlbGYuX3JlZ2lzdHJpZXMgPSB7fQorCisgICAgICAgICMgcmVnaXN0ZXIgYWN0aW9ucworICAgICAgICBzZWxmLnJlZ2lzdGVyKCdhY3Rpb24nLCBOb25lLCBfU3RvcmVBY3Rpb24pCisgICAgICAgIHNlbGYucmVnaXN0ZXIoJ2FjdGlvbicsICdzdG9yZScsIF9TdG9yZUFjdGlvbikKKyAgICAgICAgc2VsZi5yZWdpc3RlcignYWN0aW9uJywgJ3N0b3JlX2NvbnN0JywgX1N0b3JlQ29uc3RBY3Rpb24pCisgICAgICAgIHNlbGYucmVnaXN0ZXIoJ2FjdGlvbicsICdzdG9yZV90cnVlJywgX1N0b3JlVHJ1ZUFjdGlvbikKKyAgICAgICAgc2VsZi5yZWdpc3RlcignYWN0aW9uJywgJ3N0b3JlX2ZhbHNlJywgX1N0b3JlRmFsc2VBY3Rpb24pCisgICAgICAgIHNlbGYucmVnaXN0ZXIoJ2FjdGlvbicsICdhcHBlbmQnLCBfQXBwZW5kQWN0aW9uKQorICAgICAgICBzZWxmLnJlZ2lzdGVyKCdhY3Rpb24nLCAnYXBwZW5kX2NvbnN0JywgX0FwcGVuZENvbnN0QWN0aW9uKQorICAgICAgICBzZWxmLnJlZ2lzdGVyKCdhY3Rpb24nLCAnY291bnQnLCBfQ291bnRBY3Rpb24pCisgICAgICAgIHNlbGYucmVnaXN0ZXIoJ2FjdGlvbicsICdoZWxwJywgX0hlbHBBY3Rpb24pCisgICAgICAgIHNlbGYucmVnaXN0ZXIoJ2FjdGlvbicsICd2ZXJzaW9uJywgX1ZlcnNpb25BY3Rpb24pCisgICAgICAgIHNlbGYucmVnaXN0ZXIoJ2FjdGlvbicsICdwYXJzZXJzJywgX1N1YlBhcnNlcnNBY3Rpb24pCisKKyAgICAgICAgIyByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGNvbmZsaWN0IGhhbmRsZXIgaXMgaW52YWxpZAorICAgICAgICBzZWxmLl9nZXRfaGFuZGxlcigpCisKKyAgICAgICAgIyBhY3Rpb24gc3RvcmFnZQorICAgICAgICBzZWxmLl9hY3Rpb25zID0gW10KKyAgICAgICAgc2VsZi5fb3B0aW9uX3N0cmluZ19hY3Rpb25zID0ge30KKworICAgICAgICAjIGdyb3VwcworICAgICAgICBzZWxmLl9hY3Rpb25fZ3JvdXBzID0gW10KKyAgICAgICAgc2VsZi5fbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwcyA9IFtdCisKKyAgICAgICAgIyBkZWZhdWx0cyBzdG9yYWdlCisgICAgICAgIHNlbGYuX2RlZmF1bHRzID0ge30KKworICAgICAgICAjIGRldGVybWluZXMgd2hldGhlciBhbiAib3B0aW9uIiBsb29rcyBsaWtlIGEgbmVnYXRpdmUgbnVtYmVyCisgICAgICAgIHNlbGYuX25lZ2F0aXZlX251bWJlcl9tYXRjaGVyID0gX3JlLmNvbXBpbGUocideLVxkKyR8Xi1cZCpcLlxkKyQnKQorCisgICAgICAgICMgd2hldGhlciBvciBub3QgdGhlcmUgYXJlIGFueSBvcHRpb25hbHMgdGhhdCBsb29rIGxpa2UgbmVnYXRpdmUKKyAgICAgICAgIyBudW1iZXJzIC0tIHVzZXMgYSBsaXN0IHNvIGl0IGNhbiBiZSBzaGFyZWQgYW5kIGVkaXRlZAorICAgICAgICBzZWxmLl9oYXNfbmVnYXRpdmVfbnVtYmVyX29wdGlvbmFscyA9IFtdCisKKyAgICAjID09PT09PT09PT09PT09PT09PT09CisgICAgIyBSZWdpc3RyYXRpb24gbWV0aG9kcworICAgICMgPT09PT09PT09PT09PT09PT09PT0KKyAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgcmVnaXN0cnlfbmFtZSwgdmFsdWUsIG9iamVjdCk6CisgICAgICAgIHJlZ2lzdHJ5ID0gc2VsZi5fcmVnaXN0cmllcy5zZXRkZWZhdWx0KHJlZ2lzdHJ5X25hbWUsIHt9KQorICAgICAgICByZWdpc3RyeVt2YWx1ZV0gPSBvYmplY3QKKworICAgIGRlZiBfcmVnaXN0cnlfZ2V0KHNlbGYsIHJlZ2lzdHJ5X25hbWUsIHZhbHVlLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVnaXN0cmllc1tyZWdpc3RyeV9uYW1lXS5nZXQodmFsdWUsIGRlZmF1bHQpCisKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIE5hbWVzcGFjZSBkZWZhdWx0IGFjY2Vzc29yIG1ldGhvZHMKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBkZWYgc2V0X2RlZmF1bHRzKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5fZGVmYXVsdHMudXBkYXRlKGt3YXJncykKKworICAgICAgICAjIGlmIHRoZXNlIGRlZmF1bHRzIG1hdGNoIGFueSBleGlzdGluZyBhcmd1bWVudHMsIHJlcGxhY2UKKyAgICAgICAgIyB0aGUgcHJldmlvdXMgZGVmYXVsdCBvbiB0aGUgb2JqZWN0IHdpdGggdGhlIG5ldyBvbmUKKyAgICAgICAgZm9yIGFjdGlvbiBpbiBzZWxmLl9hY3Rpb25zOgorICAgICAgICAgICAgaWYgYWN0aW9uLmRlc3QgaW4ga3dhcmdzOgorICAgICAgICAgICAgICAgIGFjdGlvbi5kZWZhdWx0ID0ga3dhcmdzW2FjdGlvbi5kZXN0XQorCisgICAgZGVmIGdldF9kZWZhdWx0KHNlbGYsIGRlc3QpOgorICAgICAgICBmb3IgYWN0aW9uIGluIHNlbGYuX2FjdGlvbnM6CisgICAgICAgICAgICBpZiBhY3Rpb24uZGVzdCA9PSBkZXN0IGFuZCBhY3Rpb24uZGVmYXVsdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uLmRlZmF1bHQKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RlZmF1bHRzLmdldChkZXN0LCBOb25lKQorCisKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09CisgICAgIyBBZGRpbmcgYXJndW1lbnQgYWN0aW9ucworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBkZWYgYWRkX2FyZ3VtZW50KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBhZGRfYXJndW1lbnQoZGVzdCwgLi4uLCBuYW1lPXZhbHVlLCAuLi4pCisgICAgICAgIGFkZF9hcmd1bWVudChvcHRpb25fc3RyaW5nLCBvcHRpb25fc3RyaW5nLCAuLi4sIG5hbWU9dmFsdWUsIC4uLikKKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBpZiBubyBwb3NpdGlvbmFsIGFyZ3MgYXJlIHN1cHBsaWVkIG9yIG9ubHkgb25lIGlzIHN1cHBsaWVkIGFuZAorICAgICAgICAjIGl0IGRvZXNuJ3QgbG9vayBsaWtlIGFuIG9wdGlvbiBzdHJpbmcsIHBhcnNlIGEgcG9zaXRpb25hbAorICAgICAgICAjIGFyZ3VtZW50CisgICAgICAgIGNoYXJzID0gc2VsZi5wcmVmaXhfY2hhcnMKKyAgICAgICAgaWYgbm90IGFyZ3Mgb3IgbGVuKGFyZ3MpID09IDEgYW5kIGFyZ3NbMF1bMF0gbm90IGluIGNoYXJzOgorICAgICAgICAgICAgaWYgYXJncyBhbmQgJ2Rlc3QnIGluIGt3YXJnczoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdkZXN0IHN1cHBsaWVkIHR3aWNlIGZvciBwb3NpdGlvbmFsIGFyZ3VtZW50JykKKyAgICAgICAgICAgIGt3YXJncyA9IHNlbGYuX2dldF9wb3NpdGlvbmFsX2t3YXJncygqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgIyBvdGhlcndpc2UsIHdlJ3JlIGFkZGluZyBhbiBvcHRpb25hbCBhcmd1bWVudAorICAgICAgICBlbHNlOgorICAgICAgICAgICAga3dhcmdzID0gc2VsZi5fZ2V0X29wdGlvbmFsX2t3YXJncygqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgIyBpZiBubyBkZWZhdWx0IHdhcyBzdXBwbGllZCwgdXNlIHRoZSBwYXJzZXItbGV2ZWwgZGVmYXVsdAorICAgICAgICBpZiAnZGVmYXVsdCcgbm90IGluIGt3YXJnczoKKyAgICAgICAgICAgIGRlc3QgPSBrd2FyZ3NbJ2Rlc3QnXQorICAgICAgICAgICAgaWYgZGVzdCBpbiBzZWxmLl9kZWZhdWx0czoKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ2RlZmF1bHQnXSA9IHNlbGYuX2RlZmF1bHRzW2Rlc3RdCisgICAgICAgICAgICBlbGlmIHNlbGYuYXJndW1lbnRfZGVmYXVsdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBrd2FyZ3NbJ2RlZmF1bHQnXSA9IHNlbGYuYXJndW1lbnRfZGVmYXVsdAorCisgICAgICAgICMgY3JlYXRlIHRoZSBhY3Rpb24gb2JqZWN0LCBhbmQgYWRkIGl0IHRvIHRoZSBwYXJzZXIKKyAgICAgICAgYWN0aW9uX2NsYXNzID0gc2VsZi5fcG9wX2FjdGlvbl9jbGFzcyhrd2FyZ3MpCisgICAgICAgIGlmIG5vdCBfY2FsbGFibGUoYWN0aW9uX2NsYXNzKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Vua25vd24gYWN0aW9uICIlcyInICUgKGFjdGlvbl9jbGFzcywpKQorICAgICAgICBhY3Rpb24gPSBhY3Rpb25fY2xhc3MoKiprd2FyZ3MpCisKKyAgICAgICAgIyByYWlzZSBhbiBlcnJvciBpZiB0aGUgYWN0aW9uIHR5cGUgaXMgbm90IGNhbGxhYmxlCisgICAgICAgIHR5cGVfZnVuYyA9IHNlbGYuX3JlZ2lzdHJ5X2dldCgndHlwZScsIGFjdGlvbi50eXBlLCBhY3Rpb24udHlwZSkKKyAgICAgICAgaWYgbm90IF9jYWxsYWJsZSh0eXBlX2Z1bmMpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXIgaXMgbm90IGNhbGxhYmxlJyAlICh0eXBlX2Z1bmMsKSkKKworICAgICAgICAjIHJhaXNlIGFuIGVycm9yIGlmIHRoZSBtZXRhdmFyIGRvZXMgbm90IG1hdGNoIHRoZSB0eXBlCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgIl9nZXRfZm9ybWF0dGVyIik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X2Zvcm1hdHRlcigpLl9mb3JtYXRfYXJncyhhY3Rpb24sIE5vbmUpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImxlbmd0aCBvZiBtZXRhdmFyIHR1cGxlIGRvZXMgbm90IG1hdGNoIG5hcmdzIikKKworICAgICAgICByZXR1cm4gc2VsZi5fYWRkX2FjdGlvbihhY3Rpb24pCisKKyAgICBkZWYgYWRkX2FyZ3VtZW50X2dyb3VwKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGdyb3VwID0gX0FyZ3VtZW50R3JvdXAoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLl9hY3Rpb25fZ3JvdXBzLmFwcGVuZChncm91cCkKKyAgICAgICAgcmV0dXJuIGdyb3VwCisKKyAgICBkZWYgYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cChzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIGdyb3VwID0gX011dHVhbGx5RXhjbHVzaXZlR3JvdXAoc2VsZiwgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cHMuYXBwZW5kKGdyb3VwKQorICAgICAgICByZXR1cm4gZ3JvdXAKKworICAgIGRlZiBfYWRkX2FjdGlvbihzZWxmLCBhY3Rpb24pOgorICAgICAgICAjIHJlc29sdmUgYW55IGNvbmZsaWN0cworICAgICAgICBzZWxmLl9jaGVja19jb25mbGljdChhY3Rpb24pCisKKyAgICAgICAgIyBhZGQgdG8gYWN0aW9ucyBsaXN0CisgICAgICAgIHNlbGYuX2FjdGlvbnMuYXBwZW5kKGFjdGlvbikKKyAgICAgICAgYWN0aW9uLmNvbnRhaW5lciA9IHNlbGYKKworICAgICAgICAjIGluZGV4IHRoZSBhY3Rpb24gYnkgYW55IG9wdGlvbiBzdHJpbmdzIGl0IGhhcworICAgICAgICBmb3Igb3B0aW9uX3N0cmluZyBpbiBhY3Rpb24ub3B0aW9uX3N0cmluZ3M6CisgICAgICAgICAgICBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnNbb3B0aW9uX3N0cmluZ10gPSBhY3Rpb24KKworICAgICAgICAjIHNldCB0aGUgZmxhZyBpZiBhbnkgb3B0aW9uIHN0cmluZ3MgbG9vayBsaWtlIG5lZ2F0aXZlIG51bWJlcnMKKyAgICAgICAgZm9yIG9wdGlvbl9zdHJpbmcgaW4gYWN0aW9uLm9wdGlvbl9zdHJpbmdzOgorICAgICAgICAgICAgaWYgc2VsZi5fbmVnYXRpdmVfbnVtYmVyX21hdGNoZXIubWF0Y2gob3B0aW9uX3N0cmluZyk6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2hhc19uZWdhdGl2ZV9udW1iZXJfb3B0aW9uYWxzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYXNfbmVnYXRpdmVfbnVtYmVyX29wdGlvbmFscy5hcHBlbmQoVHJ1ZSkKKworICAgICAgICAjIHJldHVybiB0aGUgY3JlYXRlZCBhY3Rpb24KKyAgICAgICAgcmV0dXJuIGFjdGlvbgorCisgICAgZGVmIF9yZW1vdmVfYWN0aW9uKHNlbGYsIGFjdGlvbik6CisgICAgICAgIHNlbGYuX2FjdGlvbnMucmVtb3ZlKGFjdGlvbikKKworICAgIGRlZiBfYWRkX2NvbnRhaW5lcl9hY3Rpb25zKHNlbGYsIGNvbnRhaW5lcik6CisgICAgICAgICMgY29sbGVjdCBncm91cHMgYnkgdGl0bGVzCisgICAgICAgIHRpdGxlX2dyb3VwX21hcCA9IHt9CisgICAgICAgIGZvciBncm91cCBpbiBzZWxmLl9hY3Rpb25fZ3JvdXBzOgorICAgICAgICAgICAgaWYgZ3JvdXAudGl0bGUgaW4gdGl0bGVfZ3JvdXBfbWFwOgorICAgICAgICAgICAgICAgIG1zZyA9IF8oJ2Nhbm5vdCBtZXJnZSBhY3Rpb25zIC0gdHdvIGdyb3VwcyBhcmUgbmFtZWQgJXInKQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgKGdyb3VwLnRpdGxlKSkKKyAgICAgICAgICAgIHRpdGxlX2dyb3VwX21hcFtncm91cC50aXRsZV0gPSBncm91cAorCisgICAgICAgICMgbWFwIGVhY2ggYWN0aW9uIHRvIGl0cyBncm91cAorICAgICAgICBncm91cF9tYXAgPSB7fQorICAgICAgICBmb3IgZ3JvdXAgaW4gY29udGFpbmVyLl9hY3Rpb25fZ3JvdXBzOgorCisgICAgICAgICAgICAjIGlmIGEgZ3JvdXAgd2l0aCB0aGUgdGl0bGUgZXhpc3RzLCB1c2UgdGhhdCwgb3RoZXJ3aXNlCisgICAgICAgICAgICAjIGNyZWF0ZSBhIG5ldyBncm91cCBtYXRjaGluZyB0aGUgY29udGFpbmVyJ3MgZ3JvdXAKKyAgICAgICAgICAgIGlmIGdyb3VwLnRpdGxlIG5vdCBpbiB0aXRsZV9ncm91cF9tYXA6CisgICAgICAgICAgICAgICAgdGl0bGVfZ3JvdXBfbWFwW2dyb3VwLnRpdGxlXSA9IHNlbGYuYWRkX2FyZ3VtZW50X2dyb3VwKAorICAgICAgICAgICAgICAgICAgICB0aXRsZT1ncm91cC50aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Z3JvdXAuZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0X2hhbmRsZXI9Z3JvdXAuY29uZmxpY3RfaGFuZGxlcikKKworICAgICAgICAgICAgIyBtYXAgdGhlIGFjdGlvbnMgdG8gdGhlaXIgbmV3IGdyb3VwCisgICAgICAgICAgICBmb3IgYWN0aW9uIGluIGdyb3VwLl9ncm91cF9hY3Rpb25zOgorICAgICAgICAgICAgICAgIGdyb3VwX21hcFthY3Rpb25dID0gdGl0bGVfZ3JvdXBfbWFwW2dyb3VwLnRpdGxlXQorCisgICAgICAgICMgYWRkIGNvbnRhaW5lcidzIG11dHVhbGx5IGV4Y2x1c2l2ZSBncm91cHMKKyAgICAgICAgIyBOT1RFOiBpZiBhZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwIGV2ZXIgZ2FpbnMgdGl0bGU9IGFuZAorICAgICAgICAjIGRlc2NyaXB0aW9uPSB0aGVuIHRoaXMgY29kZSB3aWxsIG5lZWQgdG8gYmUgZXhwYW5kZWQgYXMgYWJvdmUKKyAgICAgICAgZm9yIGdyb3VwIGluIGNvbnRhaW5lci5fbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwczoKKyAgICAgICAgICAgIG11dGV4X2dyb3VwID0gc2VsZi5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKAorICAgICAgICAgICAgICAgIHJlcXVpcmVkPWdyb3VwLnJlcXVpcmVkKQorCisgICAgICAgICAgICAjIG1hcCB0aGUgYWN0aW9ucyB0byB0aGVpciBuZXcgbXV0ZXggZ3JvdXAKKyAgICAgICAgICAgIGZvciBhY3Rpb24gaW4gZ3JvdXAuX2dyb3VwX2FjdGlvbnM6CisgICAgICAgICAgICAgICAgZ3JvdXBfbWFwW2FjdGlvbl0gPSBtdXRleF9ncm91cAorCisgICAgICAgICMgYWRkIGFsbCBhY3Rpb25zIHRvIHRoaXMgY29udGFpbmVyIG9yIHRoZWlyIGdyb3VwCisgICAgICAgIGZvciBhY3Rpb24gaW4gY29udGFpbmVyLl9hY3Rpb25zOgorICAgICAgICAgICAgZ3JvdXBfbWFwLmdldChhY3Rpb24sIHNlbGYpLl9hZGRfYWN0aW9uKGFjdGlvbikKKworICAgIGRlZiBfZ2V0X3Bvc2l0aW9uYWxfa3dhcmdzKHNlbGYsIGRlc3QsICoqa3dhcmdzKToKKyAgICAgICAgIyBtYWtlIHN1cmUgcmVxdWlyZWQgaXMgbm90IHNwZWNpZmllZAorICAgICAgICBpZiAncmVxdWlyZWQnIGluIGt3YXJnczoKKyAgICAgICAgICAgIG1zZyA9IF8oIidyZXF1aXJlZCcgaXMgYW4gaW52YWxpZCBhcmd1bWVudCBmb3IgcG9zaXRpb25hbHMiKQorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKG1zZykKKworICAgICAgICAjIG1hcmsgcG9zaXRpb25hbCBhcmd1bWVudHMgYXMgcmVxdWlyZWQgaWYgYXQgbGVhc3Qgb25lIGlzCisgICAgICAgICMgYWx3YXlzIHJlcXVpcmVkCisgICAgICAgIGlmIGt3YXJncy5nZXQoJ25hcmdzJykgbm90IGluIFtPUFRJT05BTCwgWkVST19PUl9NT1JFXToKKyAgICAgICAgICAgIGt3YXJnc1sncmVxdWlyZWQnXSA9IFRydWUKKyAgICAgICAgaWYga3dhcmdzLmdldCgnbmFyZ3MnKSA9PSBaRVJPX09SX01PUkUgYW5kICdkZWZhdWx0JyBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAga3dhcmdzWydyZXF1aXJlZCddID0gVHJ1ZQorCisgICAgICAgICMgcmV0dXJuIHRoZSBrZXl3b3JkIGFyZ3VtZW50cyB3aXRoIG5vIG9wdGlvbiBzdHJpbmdzCisgICAgICAgIHJldHVybiBkaWN0KGt3YXJncywgZGVzdD1kZXN0LCBvcHRpb25fc3RyaW5ncz1bXSkKKworICAgIGRlZiBfZ2V0X29wdGlvbmFsX2t3YXJncyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAjIGRldGVybWluZSBzaG9ydCBhbmQgbG9uZyBvcHRpb24gc3RyaW5ncworICAgICAgICBvcHRpb25fc3RyaW5ncyA9IFtdCisgICAgICAgIGxvbmdfb3B0aW9uX3N0cmluZ3MgPSBbXQorICAgICAgICBmb3Igb3B0aW9uX3N0cmluZyBpbiBhcmdzOgorICAgICAgICAgICAgIyBlcnJvciBvbiBzdHJpbmdzIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCBhbiBhcHByb3ByaWF0ZSBwcmVmaXgKKyAgICAgICAgICAgIGlmIG5vdCBvcHRpb25fc3RyaW5nWzBdIGluIHNlbGYucHJlZml4X2NoYXJzOgorICAgICAgICAgICAgICAgIG1zZyA9IF8oJ2ludmFsaWQgb3B0aW9uIHN0cmluZyAlcjogJworICAgICAgICAgICAgICAgICAgICAgICAgJ211c3Qgc3RhcnQgd2l0aCBhIGNoYXJhY3RlciAlcicpCisgICAgICAgICAgICAgICAgdHVwID0gb3B0aW9uX3N0cmluZywgc2VsZi5wcmVmaXhfY2hhcnMKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1zZyAlIHR1cCkKKworICAgICAgICAgICAgIyBzdHJpbmdzIHN0YXJ0aW5nIHdpdGggdHdvIHByZWZpeCBjaGFyYWN0ZXJzIGFyZSBsb25nIG9wdGlvbnMKKyAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzLmFwcGVuZChvcHRpb25fc3RyaW5nKQorICAgICAgICAgICAgaWYgb3B0aW9uX3N0cmluZ1swXSBpbiBzZWxmLnByZWZpeF9jaGFyczoKKyAgICAgICAgICAgICAgICBpZiBsZW4ob3B0aW9uX3N0cmluZykgPiAxOgorICAgICAgICAgICAgICAgICAgICBpZiBvcHRpb25fc3RyaW5nWzFdIGluIHNlbGYucHJlZml4X2NoYXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ19vcHRpb25fc3RyaW5ncy5hcHBlbmQob3B0aW9uX3N0cmluZykKKworICAgICAgICAjIGluZmVyIGRlc3RpbmF0aW9uLCAnLS1mb28tYmFyJyAtPiAnZm9vX2JhcicgYW5kICcteCcgLT4gJ3gnCisgICAgICAgIGRlc3QgPSBrd2FyZ3MucG9wKCdkZXN0JywgTm9uZSkKKyAgICAgICAgaWYgZGVzdCBpcyBOb25lOgorICAgICAgICAgICAgaWYgbG9uZ19vcHRpb25fc3RyaW5nczoKKyAgICAgICAgICAgICAgICBkZXN0X29wdGlvbl9zdHJpbmcgPSBsb25nX29wdGlvbl9zdHJpbmdzWzBdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlc3Rfb3B0aW9uX3N0cmluZyA9IG9wdGlvbl9zdHJpbmdzWzBdCisgICAgICAgICAgICBkZXN0ID0gZGVzdF9vcHRpb25fc3RyaW5nLmxzdHJpcChzZWxmLnByZWZpeF9jaGFycykKKyAgICAgICAgICAgIGlmIG5vdCBkZXN0OgorICAgICAgICAgICAgICAgIG1zZyA9IF8oJ2Rlc3Q9IGlzIHJlcXVpcmVkIGZvciBvcHRpb25zIGxpa2UgJXInKQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgb3B0aW9uX3N0cmluZykKKyAgICAgICAgICAgIGRlc3QgPSBkZXN0LnJlcGxhY2UoJy0nLCAnXycpCisKKyAgICAgICAgIyByZXR1cm4gdGhlIHVwZGF0ZWQga2V5d29yZCBhcmd1bWVudHMKKyAgICAgICAgcmV0dXJuIGRpY3Qoa3dhcmdzLCBkZXN0PWRlc3QsIG9wdGlvbl9zdHJpbmdzPW9wdGlvbl9zdHJpbmdzKQorCisgICAgZGVmIF9wb3BfYWN0aW9uX2NsYXNzKHNlbGYsIGt3YXJncywgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgYWN0aW9uID0ga3dhcmdzLnBvcCgnYWN0aW9uJywgZGVmYXVsdCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlZ2lzdHJ5X2dldCgnYWN0aW9uJywgYWN0aW9uLCBhY3Rpb24pCisKKyAgICBkZWYgX2dldF9oYW5kbGVyKHNlbGYpOgorICAgICAgICAjIGRldGVybWluZSBmdW5jdGlvbiBmcm9tIGNvbmZsaWN0IGhhbmRsZXIgc3RyaW5nCisgICAgICAgIGhhbmRsZXJfZnVuY19uYW1lID0gJ19oYW5kbGVfY29uZmxpY3RfJXMnICUgc2VsZi5jb25mbGljdF9oYW5kbGVyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIGhhbmRsZXJfZnVuY19uYW1lKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBtc2cgPSBfKCdpbnZhbGlkIGNvbmZsaWN0X3Jlc29sdXRpb24gdmFsdWU6ICVyJykKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgc2VsZi5jb25mbGljdF9oYW5kbGVyKQorCisgICAgZGVmIF9jaGVja19jb25mbGljdChzZWxmLCBhY3Rpb24pOgorCisgICAgICAgICMgZmluZCBhbGwgb3B0aW9ucyB0aGF0IGNvbmZsaWN0IHdpdGggdGhpcyBvcHRpb24KKyAgICAgICAgY29uZmxfb3B0aW9uYWxzID0gW10KKyAgICAgICAgZm9yIG9wdGlvbl9zdHJpbmcgaW4gYWN0aW9uLm9wdGlvbl9zdHJpbmdzOgorICAgICAgICAgICAgaWYgb3B0aW9uX3N0cmluZyBpbiBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnM6CisgICAgICAgICAgICAgICAgY29uZmxfb3B0aW9uYWwgPSBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnNbb3B0aW9uX3N0cmluZ10KKyAgICAgICAgICAgICAgICBjb25mbF9vcHRpb25hbHMuYXBwZW5kKChvcHRpb25fc3RyaW5nLCBjb25mbF9vcHRpb25hbCkpCisKKyAgICAgICAgIyByZXNvbHZlIGFueSBjb25mbGljdHMKKyAgICAgICAgaWYgY29uZmxfb3B0aW9uYWxzOgorICAgICAgICAgICAgY29uZmxpY3RfaGFuZGxlciA9IHNlbGYuX2dldF9oYW5kbGVyKCkKKyAgICAgICAgICAgIGNvbmZsaWN0X2hhbmRsZXIoYWN0aW9uLCBjb25mbF9vcHRpb25hbHMpCisKKyAgICBkZWYgX2hhbmRsZV9jb25mbGljdF9lcnJvcihzZWxmLCBhY3Rpb24sIGNvbmZsaWN0aW5nX2FjdGlvbnMpOgorICAgICAgICBtZXNzYWdlID0gXygnY29uZmxpY3Rpbmcgb3B0aW9uIHN0cmluZyhzKTogJXMnKQorICAgICAgICBjb25mbGljdF9zdHJpbmcgPSAnLCAnLmpvaW4oW29wdGlvbl9zdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igb3B0aW9uX3N0cmluZywgYWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY29uZmxpY3RpbmdfYWN0aW9uc10pCisgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IoYWN0aW9uLCBtZXNzYWdlICUgY29uZmxpY3Rfc3RyaW5nKQorCisgICAgZGVmIF9oYW5kbGVfY29uZmxpY3RfcmVzb2x2ZShzZWxmLCBhY3Rpb24sIGNvbmZsaWN0aW5nX2FjdGlvbnMpOgorCisgICAgICAgICMgcmVtb3ZlIGFsbCBjb25mbGljdGluZyBvcHRpb25zCisgICAgICAgIGZvciBvcHRpb25fc3RyaW5nLCBhY3Rpb24gaW4gY29uZmxpY3RpbmdfYWN0aW9uczoKKworICAgICAgICAgICAgIyByZW1vdmUgdGhlIGNvbmZsaWN0aW5nIG9wdGlvbgorICAgICAgICAgICAgYWN0aW9uLm9wdGlvbl9zdHJpbmdzLnJlbW92ZShvcHRpb25fc3RyaW5nKQorICAgICAgICAgICAgc2VsZi5fb3B0aW9uX3N0cmluZ19hY3Rpb25zLnBvcChvcHRpb25fc3RyaW5nLCBOb25lKQorCisgICAgICAgICAgICAjIGlmIHRoZSBvcHRpb24gbm93IGhhcyBubyBvcHRpb24gc3RyaW5nLCByZW1vdmUgaXQgZnJvbSB0aGUKKyAgICAgICAgICAgICMgY29udGFpbmVyIGhvbGRpbmcgaXQKKyAgICAgICAgICAgIGlmIG5vdCBhY3Rpb24ub3B0aW9uX3N0cmluZ3M6CisgICAgICAgICAgICAgICAgYWN0aW9uLmNvbnRhaW5lci5fcmVtb3ZlX2FjdGlvbihhY3Rpb24pCisKKworY2xhc3MgX0FyZ3VtZW50R3JvdXAoX0FjdGlvbnNDb250YWluZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbnRhaW5lciwgdGl0bGU9Tm9uZSwgZGVzY3JpcHRpb249Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICAjIGFkZCBhbnkgbWlzc2luZyBrZXl3b3JkIGFyZ3VtZW50cyBieSBjaGVja2luZyB0aGUgY29udGFpbmVyCisgICAgICAgIHVwZGF0ZSA9IGt3YXJncy5zZXRkZWZhdWx0CisgICAgICAgIHVwZGF0ZSgnY29uZmxpY3RfaGFuZGxlcicsIGNvbnRhaW5lci5jb25mbGljdF9oYW5kbGVyKQorICAgICAgICB1cGRhdGUoJ3ByZWZpeF9jaGFycycsIGNvbnRhaW5lci5wcmVmaXhfY2hhcnMpCisgICAgICAgIHVwZGF0ZSgnYXJndW1lbnRfZGVmYXVsdCcsIGNvbnRhaW5lci5hcmd1bWVudF9kZWZhdWx0KQorICAgICAgICBzdXBlcl9pbml0ID0gc3VwZXIoX0FyZ3VtZW50R3JvdXAsIHNlbGYpLl9faW5pdF9fCisgICAgICAgIHN1cGVyX2luaXQoZGVzY3JpcHRpb249ZGVzY3JpcHRpb24sICoqa3dhcmdzKQorCisgICAgICAgICMgZ3JvdXAgYXR0cmlidXRlcworICAgICAgICBzZWxmLnRpdGxlID0gdGl0bGUKKyAgICAgICAgc2VsZi5fZ3JvdXBfYWN0aW9ucyA9IFtdCisKKyAgICAgICAgIyBzaGFyZSBtb3N0IGF0dHJpYnV0ZXMgd2l0aCB0aGUgY29udGFpbmVyCisgICAgICAgIHNlbGYuX3JlZ2lzdHJpZXMgPSBjb250YWluZXIuX3JlZ2lzdHJpZXMKKyAgICAgICAgc2VsZi5fYWN0aW9ucyA9IGNvbnRhaW5lci5fYWN0aW9ucworICAgICAgICBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnMgPSBjb250YWluZXIuX29wdGlvbl9zdHJpbmdfYWN0aW9ucworICAgICAgICBzZWxmLl9kZWZhdWx0cyA9IGNvbnRhaW5lci5fZGVmYXVsdHMKKyAgICAgICAgc2VsZi5faGFzX25lZ2F0aXZlX251bWJlcl9vcHRpb25hbHMgPSBcCisgICAgICAgICAgICBjb250YWluZXIuX2hhc19uZWdhdGl2ZV9udW1iZXJfb3B0aW9uYWxzCisgICAgICAgIHNlbGYuX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cHMgPSBjb250YWluZXIuX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cHMKKworICAgIGRlZiBfYWRkX2FjdGlvbihzZWxmLCBhY3Rpb24pOgorICAgICAgICBhY3Rpb24gPSBzdXBlcihfQXJndW1lbnRHcm91cCwgc2VsZikuX2FkZF9hY3Rpb24oYWN0aW9uKQorICAgICAgICBzZWxmLl9ncm91cF9hY3Rpb25zLmFwcGVuZChhY3Rpb24pCisgICAgICAgIHJldHVybiBhY3Rpb24KKworICAgIGRlZiBfcmVtb3ZlX2FjdGlvbihzZWxmLCBhY3Rpb24pOgorICAgICAgICBzdXBlcihfQXJndW1lbnRHcm91cCwgc2VsZikuX3JlbW92ZV9hY3Rpb24oYWN0aW9uKQorICAgICAgICBzZWxmLl9ncm91cF9hY3Rpb25zLnJlbW92ZShhY3Rpb24pCisKKworY2xhc3MgX011dHVhbGx5RXhjbHVzaXZlR3JvdXAoX0FyZ3VtZW50R3JvdXApOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbnRhaW5lciwgcmVxdWlyZWQ9RmFsc2UpOgorICAgICAgICBzdXBlcihfTXV0dWFsbHlFeGNsdXNpdmVHcm91cCwgc2VsZikuX19pbml0X18oY29udGFpbmVyKQorICAgICAgICBzZWxmLnJlcXVpcmVkID0gcmVxdWlyZWQKKyAgICAgICAgc2VsZi5fY29udGFpbmVyID0gY29udGFpbmVyCisKKyAgICBkZWYgX2FkZF9hY3Rpb24oc2VsZiwgYWN0aW9uKToKKyAgICAgICAgaWYgYWN0aW9uLnJlcXVpcmVkOgorICAgICAgICAgICAgbXNnID0gXygnbXV0dWFsbHkgZXhjbHVzaXZlIGFyZ3VtZW50cyBtdXN0IGJlIG9wdGlvbmFsJykKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnKQorICAgICAgICBhY3Rpb24gPSBzZWxmLl9jb250YWluZXIuX2FkZF9hY3Rpb24oYWN0aW9uKQorICAgICAgICBzZWxmLl9ncm91cF9hY3Rpb25zLmFwcGVuZChhY3Rpb24pCisgICAgICAgIHJldHVybiBhY3Rpb24KKworICAgIGRlZiBfcmVtb3ZlX2FjdGlvbihzZWxmLCBhY3Rpb24pOgorICAgICAgICBzZWxmLl9jb250YWluZXIuX3JlbW92ZV9hY3Rpb24oYWN0aW9uKQorICAgICAgICBzZWxmLl9ncm91cF9hY3Rpb25zLnJlbW92ZShhY3Rpb24pCisKKworY2xhc3MgQXJndW1lbnRQYXJzZXIoX0F0dHJpYnV0ZUhvbGRlciwgX0FjdGlvbnNDb250YWluZXIpOgorICAgICIiIk9iamVjdCBmb3IgcGFyc2luZyBjb21tYW5kIGxpbmUgc3RyaW5ncyBpbnRvIFB5dGhvbiBvYmplY3RzLgorCisgICAgS2V5d29yZCBBcmd1bWVudHM6CisgICAgICAgIC0gcHJvZyAtLSBUaGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSAoZGVmYXVsdDogc3lzLmFyZ3ZbMF0pCisgICAgICAgIC0gdXNhZ2UgLS0gQSB1c2FnZSBtZXNzYWdlIChkZWZhdWx0OiBhdXRvLWdlbmVyYXRlZCBmcm9tIGFyZ3VtZW50cykKKyAgICAgICAgLSBkZXNjcmlwdGlvbiAtLSBBIGRlc2NyaXB0aW9uIG9mIHdoYXQgdGhlIHByb2dyYW0gZG9lcworICAgICAgICAtIGVwaWxvZyAtLSBUZXh0IGZvbGxvd2luZyB0aGUgYXJndW1lbnQgZGVzY3JpcHRpb25zCisgICAgICAgIC0gcGFyZW50cyAtLSBQYXJzZXJzIHdob3NlIGFyZ3VtZW50cyBzaG91bGQgYmUgY29waWVkIGludG8gdGhpcyBvbmUKKyAgICAgICAgLSBmb3JtYXR0ZXJfY2xhc3MgLS0gSGVscEZvcm1hdHRlciBjbGFzcyBmb3IgcHJpbnRpbmcgaGVscCBtZXNzYWdlcworICAgICAgICAtIHByZWZpeF9jaGFycyAtLSBDaGFyYWN0ZXJzIHRoYXQgcHJlZml4IG9wdGlvbmFsIGFyZ3VtZW50cworICAgICAgICAtIGZyb21maWxlX3ByZWZpeF9jaGFycyAtLSBDaGFyYWN0ZXJzIHRoYXQgcHJlZml4IGZpbGVzIGNvbnRhaW5pbmcKKyAgICAgICAgICAgIGFkZGl0aW9uYWwgYXJndW1lbnRzCisgICAgICAgIC0gYXJndW1lbnRfZGVmYXVsdCAtLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgYWxsIGFyZ3VtZW50cworICAgICAgICAtIGNvbmZsaWN0X2hhbmRsZXIgLS0gU3RyaW5nIGluZGljYXRpbmcgaG93IHRvIGhhbmRsZSBjb25mbGljdHMKKyAgICAgICAgLSBhZGRfaGVscCAtLSBBZGQgYSAtaC8taGVscCBvcHRpb24KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBwcm9nPU5vbmUsCisgICAgICAgICAgICAgICAgIHVzYWdlPU5vbmUsCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPU5vbmUsCisgICAgICAgICAgICAgICAgIGVwaWxvZz1Ob25lLAorICAgICAgICAgICAgICAgICB2ZXJzaW9uPU5vbmUsCisgICAgICAgICAgICAgICAgIHBhcmVudHM9W10sCisgICAgICAgICAgICAgICAgIGZvcm1hdHRlcl9jbGFzcz1IZWxwRm9ybWF0dGVyLAorICAgICAgICAgICAgICAgICBwcmVmaXhfY2hhcnM9Jy0nLAorICAgICAgICAgICAgICAgICBmcm9tZmlsZV9wcmVmaXhfY2hhcnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgYXJndW1lbnRfZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICBjb25mbGljdF9oYW5kbGVyPSdlcnJvcicsCisgICAgICAgICAgICAgICAgIGFkZF9oZWxwPVRydWUpOgorCisgICAgICAgIGlmIHZlcnNpb24gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIiIiVGhlICJ2ZXJzaW9uIiBhcmd1bWVudCB0byBBcmd1bWVudFBhcnNlciBpcyBkZXByZWNhdGVkLiAiIiIKKyAgICAgICAgICAgICAgICAiIiJQbGVhc2UgdXNlICIiIgorICAgICAgICAgICAgICAgICIiIiJhZGRfYXJndW1lbnQoLi4uLCBhY3Rpb249J3ZlcnNpb24nLCB2ZXJzaW9uPSJOIiwgLi4uKSIgIiIiCisgICAgICAgICAgICAgICAgIiIiaW5zdGVhZCIiIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorCisgICAgICAgIHN1cGVyaW5pdCA9IHN1cGVyKEFyZ3VtZW50UGFyc2VyLCBzZWxmKS5fX2luaXRfXworICAgICAgICBzdXBlcmluaXQoZGVzY3JpcHRpb249ZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICBwcmVmaXhfY2hhcnM9cHJlZml4X2NoYXJzLAorICAgICAgICAgICAgICAgICAgYXJndW1lbnRfZGVmYXVsdD1hcmd1bWVudF9kZWZhdWx0LAorICAgICAgICAgICAgICAgICAgY29uZmxpY3RfaGFuZGxlcj1jb25mbGljdF9oYW5kbGVyKQorCisgICAgICAgICMgZGVmYXVsdCBzZXR0aW5nIGZvciBwcm9nCisgICAgICAgIGlmIHByb2cgaXMgTm9uZToKKyAgICAgICAgICAgIHByb2cgPSBfb3MucGF0aC5iYXNlbmFtZShfc3lzLmFyZ3ZbMF0pCisKKyAgICAgICAgc2VsZi5wcm9nID0gcHJvZworICAgICAgICBzZWxmLnVzYWdlID0gdXNhZ2UKKyAgICAgICAgc2VsZi5lcGlsb2cgPSBlcGlsb2cKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICBzZWxmLmZvcm1hdHRlcl9jbGFzcyA9IGZvcm1hdHRlcl9jbGFzcworICAgICAgICBzZWxmLmZyb21maWxlX3ByZWZpeF9jaGFycyA9IGZyb21maWxlX3ByZWZpeF9jaGFycworICAgICAgICBzZWxmLmFkZF9oZWxwID0gYWRkX2hlbHAKKworICAgICAgICBhZGRfZ3JvdXAgPSBzZWxmLmFkZF9hcmd1bWVudF9ncm91cAorICAgICAgICBzZWxmLl9wb3NpdGlvbmFscyA9IGFkZF9ncm91cChfKCdwb3NpdGlvbmFsIGFyZ3VtZW50cycpKQorICAgICAgICBzZWxmLl9vcHRpb25hbHMgPSBhZGRfZ3JvdXAoXygnb3B0aW9uYWwgYXJndW1lbnRzJykpCisgICAgICAgIHNlbGYuX3N1YnBhcnNlcnMgPSBOb25lCisKKyAgICAgICAgIyByZWdpc3RlciB0eXBlcworICAgICAgICBkZWYgaWRlbnRpdHkoc3RyaW5nKToKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcKKyAgICAgICAgc2VsZi5yZWdpc3RlcigndHlwZScsIE5vbmUsIGlkZW50aXR5KQorCisgICAgICAgICMgYWRkIGhlbHAgYW5kIHZlcnNpb24gYXJndW1lbnRzIGlmIG5lY2Vzc2FyeQorICAgICAgICAjICh1c2luZyBleHBsaWNpdCBkZWZhdWx0IHRvIG92ZXJyaWRlIGdsb2JhbCBhcmd1bWVudF9kZWZhdWx0KQorICAgICAgICBkZWZhdWx0X3ByZWZpeCA9ICctJyBpZiAnLScgaW4gcHJlZml4X2NoYXJzIGVsc2UgcHJlZml4X2NoYXJzWzBdCisgICAgICAgIGlmIHNlbGYuYWRkX2hlbHA6CisgICAgICAgICAgICBzZWxmLmFkZF9hcmd1bWVudCgKKyAgICAgICAgICAgICAgICBkZWZhdWx0X3ByZWZpeCsnaCcsIGRlZmF1bHRfcHJlZml4KjIrJ2hlbHAnLAorICAgICAgICAgICAgICAgIGFjdGlvbj0naGVscCcsIGRlZmF1bHQ9U1VQUFJFU1MsCisgICAgICAgICAgICAgICAgaGVscD1fKCdzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0JykpCisgICAgICAgIGlmIHNlbGYudmVyc2lvbjoKKyAgICAgICAgICAgIHNlbGYuYWRkX2FyZ3VtZW50KAorICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJlZml4Kyd2JywgZGVmYXVsdF9wcmVmaXgqMisndmVyc2lvbicsCisgICAgICAgICAgICAgICAgYWN0aW9uPSd2ZXJzaW9uJywgZGVmYXVsdD1TVVBQUkVTUywKKyAgICAgICAgICAgICAgICB2ZXJzaW9uPXNlbGYudmVyc2lvbiwKKyAgICAgICAgICAgICAgICBoZWxwPV8oInNob3cgcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0IikpCisKKyAgICAgICAgIyBhZGQgcGFyZW50IGFyZ3VtZW50cyBhbmQgZGVmYXVsdHMKKyAgICAgICAgZm9yIHBhcmVudCBpbiBwYXJlbnRzOgorICAgICAgICAgICAgc2VsZi5fYWRkX2NvbnRhaW5lcl9hY3Rpb25zKHBhcmVudCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZWZhdWx0cyA9IHBhcmVudC5fZGVmYXVsdHMKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2RlZmF1bHRzLnVwZGF0ZShkZWZhdWx0cykKKworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIFByZXR0eSBfX3JlcHJfXyBtZXRob2RzCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PQorICAgIGRlZiBfZ2V0X2t3YXJncyhzZWxmKToKKyAgICAgICAgbmFtZXMgPSBbCisgICAgICAgICAgICAncHJvZycsCisgICAgICAgICAgICAndXNhZ2UnLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJywKKyAgICAgICAgICAgICd2ZXJzaW9uJywKKyAgICAgICAgICAgICdmb3JtYXR0ZXJfY2xhc3MnLAorICAgICAgICAgICAgJ2NvbmZsaWN0X2hhbmRsZXInLAorICAgICAgICAgICAgJ2FkZF9oZWxwJywKKyAgICAgICAgXQorICAgICAgICByZXR1cm4gWyhuYW1lLCBnZXRhdHRyKHNlbGYsIG5hbWUpKSBmb3IgbmFtZSBpbiBuYW1lc10KKworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICMgT3B0aW9uYWwvUG9zaXRpb25hbCBhZGRpbmcgbWV0aG9kcworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGRlZiBhZGRfc3VicGFyc2VycyhzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIGlmIHNlbGYuX3N1YnBhcnNlcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmVycm9yKF8oJ2Nhbm5vdCBoYXZlIG11bHRpcGxlIHN1YnBhcnNlciBhcmd1bWVudHMnKSkKKworICAgICAgICAjIGFkZCB0aGUgcGFyc2VyIGNsYXNzIHRvIHRoZSBhcmd1bWVudHMgaWYgaXQncyBub3QgcHJlc2VudAorICAgICAgICBrd2FyZ3Muc2V0ZGVmYXVsdCgncGFyc2VyX2NsYXNzJywgdHlwZShzZWxmKSkKKworICAgICAgICBpZiAndGl0bGUnIGluIGt3YXJncyBvciAnZGVzY3JpcHRpb24nIGluIGt3YXJnczoKKyAgICAgICAgICAgIHRpdGxlID0gXyhrd2FyZ3MucG9wKCd0aXRsZScsICdzdWJjb21tYW5kcycpKQorICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBfKGt3YXJncy5wb3AoJ2Rlc2NyaXB0aW9uJywgTm9uZSkpCisgICAgICAgICAgICBzZWxmLl9zdWJwYXJzZXJzID0gc2VsZi5hZGRfYXJndW1lbnRfZ3JvdXAodGl0bGUsIGRlc2NyaXB0aW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fc3VicGFyc2VycyA9IHNlbGYuX3Bvc2l0aW9uYWxzCisKKyAgICAgICAgIyBwcm9nIGRlZmF1bHRzIHRvIHRoZSB1c2FnZSBtZXNzYWdlIG9mIHRoaXMgcGFyc2VyLCBza2lwcGluZworICAgICAgICAjIG9wdGlvbmFsIGFyZ3VtZW50cyBhbmQgd2l0aCBubyAidXNhZ2U6IiBwcmVmaXgKKyAgICAgICAgaWYga3dhcmdzLmdldCgncHJvZycpIGlzIE5vbmU6CisgICAgICAgICAgICBmb3JtYXR0ZXIgPSBzZWxmLl9nZXRfZm9ybWF0dGVyKCkKKyAgICAgICAgICAgIHBvc2l0aW9uYWxzID0gc2VsZi5fZ2V0X3Bvc2l0aW9uYWxfYWN0aW9ucygpCisgICAgICAgICAgICBncm91cHMgPSBzZWxmLl9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXBzCisgICAgICAgICAgICBmb3JtYXR0ZXIuYWRkX3VzYWdlKHNlbGYudXNhZ2UsIHBvc2l0aW9uYWxzLCBncm91cHMsICcnKQorICAgICAgICAgICAga3dhcmdzWydwcm9nJ10gPSBmb3JtYXR0ZXIuZm9ybWF0X2hlbHAoKS5zdHJpcCgpCisKKyAgICAgICAgIyBjcmVhdGUgdGhlIHBhcnNlcnMgYWN0aW9uIGFuZCBhZGQgaXQgdG8gdGhlIHBvc2l0aW9uYWxzIGxpc3QKKyAgICAgICAgcGFyc2Vyc19jbGFzcyA9IHNlbGYuX3BvcF9hY3Rpb25fY2xhc3Moa3dhcmdzLCAncGFyc2VycycpCisgICAgICAgIGFjdGlvbiA9IHBhcnNlcnNfY2xhc3Mob3B0aW9uX3N0cmluZ3M9W10sICoqa3dhcmdzKQorICAgICAgICBzZWxmLl9zdWJwYXJzZXJzLl9hZGRfYWN0aW9uKGFjdGlvbikKKworICAgICAgICAjIHJldHVybiB0aGUgY3JlYXRlZCBwYXJzZXJzIGFjdGlvbgorICAgICAgICByZXR1cm4gYWN0aW9uCisKKyAgICBkZWYgX2FkZF9hY3Rpb24oc2VsZiwgYWN0aW9uKToKKyAgICAgICAgaWYgYWN0aW9uLm9wdGlvbl9zdHJpbmdzOgorICAgICAgICAgICAgc2VsZi5fb3B0aW9uYWxzLl9hZGRfYWN0aW9uKGFjdGlvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3Bvc2l0aW9uYWxzLl9hZGRfYWN0aW9uKGFjdGlvbikKKyAgICAgICAgcmV0dXJuIGFjdGlvbgorCisgICAgZGVmIF9nZXRfb3B0aW9uYWxfYWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFthY3Rpb24KKyAgICAgICAgICAgICAgICBmb3IgYWN0aW9uIGluIHNlbGYuX2FjdGlvbnMKKyAgICAgICAgICAgICAgICBpZiBhY3Rpb24ub3B0aW9uX3N0cmluZ3NdCisKKyAgICBkZWYgX2dldF9wb3NpdGlvbmFsX2FjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbYWN0aW9uCisgICAgICAgICAgICAgICAgZm9yIGFjdGlvbiBpbiBzZWxmLl9hY3Rpb25zCisgICAgICAgICAgICAgICAgaWYgbm90IGFjdGlvbi5vcHRpb25fc3RyaW5nc10KKworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICMgQ29tbWFuZCBsaW5lIGFyZ3VtZW50IHBhcnNpbmcgbWV0aG9kcworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGRlZiBwYXJzZV9hcmdzKHNlbGYsIGFyZ3M9Tm9uZSwgbmFtZXNwYWNlPU5vbmUpOgorICAgICAgICBhcmdzLCBhcmd2ID0gc2VsZi5wYXJzZV9rbm93bl9hcmdzKGFyZ3MsIG5hbWVzcGFjZSkKKyAgICAgICAgaWYgYXJndjoKKyAgICAgICAgICAgIG1zZyA9IF8oJ3VucmVjb2duaXplZCBhcmd1bWVudHM6ICVzJykKKyAgICAgICAgICAgIHNlbGYuZXJyb3IobXNnICUgJyAnLmpvaW4oYXJndikpCisgICAgICAgIHJldHVybiBhcmdzCisKKyAgICBkZWYgcGFyc2Vfa25vd25fYXJncyhzZWxmLCBhcmdzPU5vbmUsIG5hbWVzcGFjZT1Ob25lKToKKyAgICAgICAgaWYgYXJncyBpcyBOb25lOgorICAgICAgICAgICAgIyBhcmdzIGRlZmF1bHQgdG8gdGhlIHN5c3RlbSBhcmdzCisgICAgICAgICAgICBhcmdzID0gX3N5cy5hcmd2WzE6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCBhcmdzIGFyZSBtdXRhYmxlCisgICAgICAgICAgICBhcmdzID0gbGlzdChhcmdzKQorCisgICAgICAgICMgZGVmYXVsdCBOYW1lc3BhY2UgYnVpbHQgZnJvbSBwYXJzZXIgZGVmYXVsdHMKKyAgICAgICAgaWYgbmFtZXNwYWNlIGlzIE5vbmU6CisgICAgICAgICAgICBuYW1lc3BhY2UgPSBOYW1lc3BhY2UoKQorCisgICAgICAgICMgYWRkIGFueSBhY3Rpb24gZGVmYXVsdHMgdGhhdCBhcmVuJ3QgcHJlc2VudAorICAgICAgICBmb3IgYWN0aW9uIGluIHNlbGYuX2FjdGlvbnM6CisgICAgICAgICAgICBpZiBhY3Rpb24uZGVzdCBpcyBub3QgU1VQUFJFU1M6CisgICAgICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIobmFtZXNwYWNlLCBhY3Rpb24uZGVzdCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGFjdGlvbi5kZWZhdWx0IGlzIG5vdCBTVVBQUkVTUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIobmFtZXNwYWNlLCBhY3Rpb24uZGVzdCwgYWN0aW9uLmRlZmF1bHQpCisKKyAgICAgICAgIyBhZGQgYW55IHBhcnNlciBkZWZhdWx0cyB0aGF0IGFyZW4ndCBwcmVzZW50CisgICAgICAgIGZvciBkZXN0IGluIHNlbGYuX2RlZmF1bHRzOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIobmFtZXNwYWNlLCBkZXN0KToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKG5hbWVzcGFjZSwgZGVzdCwgc2VsZi5fZGVmYXVsdHNbZGVzdF0pCisKKyAgICAgICAgIyBwYXJzZSB0aGUgYXJndW1lbnRzIGFuZCBleGl0IGlmIHRoZXJlIGFyZSBhbnkgZXJyb3JzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWVzcGFjZSwgYXJncyA9IHNlbGYuX3BhcnNlX2tub3duX2FyZ3MoYXJncywgbmFtZXNwYWNlKQorICAgICAgICAgICAgaWYgaGFzYXR0cihuYW1lc3BhY2UsIF9VTlJFQ09HTklaRURfQVJHU19BVFRSKToKKyAgICAgICAgICAgICAgICBhcmdzLmV4dGVuZChnZXRhdHRyKG5hbWVzcGFjZSwgX1VOUkVDT0dOSVpFRF9BUkdTX0FUVFIpKQorICAgICAgICAgICAgICAgIGRlbGF0dHIobmFtZXNwYWNlLCBfVU5SRUNPR05JWkVEX0FSR1NfQVRUUikKKyAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2UsIGFyZ3MKKyAgICAgICAgZXhjZXB0IEFyZ3VtZW50RXJyb3I6CisgICAgICAgICAgICBlcnIgPSBfc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgICAgIHNlbGYuZXJyb3Ioc3RyKGVycikpCisKKyAgICBkZWYgX3BhcnNlX2tub3duX2FyZ3Moc2VsZiwgYXJnX3N0cmluZ3MsIG5hbWVzcGFjZSk6CisgICAgICAgICMgcmVwbGFjZSBhcmcgc3RyaW5ncyB0aGF0IGFyZSBmaWxlIHJlZmVyZW5jZXMKKyAgICAgICAgaWYgc2VsZi5mcm9tZmlsZV9wcmVmaXhfY2hhcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhcmdfc3RyaW5ncyA9IHNlbGYuX3JlYWRfYXJnc19mcm9tX2ZpbGVzKGFyZ19zdHJpbmdzKQorCisgICAgICAgICMgbWFwIGFsbCBtdXR1YWxseSBleGNsdXNpdmUgYXJndW1lbnRzIHRvIHRoZSBvdGhlciBhcmd1bWVudHMKKyAgICAgICAgIyB0aGV5IGNhbid0IG9jY3VyIHdpdGgKKyAgICAgICAgYWN0aW9uX2NvbmZsaWN0cyA9IHt9CisgICAgICAgIGZvciBtdXRleF9ncm91cCBpbiBzZWxmLl9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXBzOgorICAgICAgICAgICAgZ3JvdXBfYWN0aW9ucyA9IG11dGV4X2dyb3VwLl9ncm91cF9hY3Rpb25zCisgICAgICAgICAgICBmb3IgaSwgbXV0ZXhfYWN0aW9uIGluIGVudW1lcmF0ZShtdXRleF9ncm91cC5fZ3JvdXBfYWN0aW9ucyk6CisgICAgICAgICAgICAgICAgY29uZmxpY3RzID0gYWN0aW9uX2NvbmZsaWN0cy5zZXRkZWZhdWx0KG11dGV4X2FjdGlvbiwgW10pCisgICAgICAgICAgICAgICAgY29uZmxpY3RzLmV4dGVuZChncm91cF9hY3Rpb25zWzppXSkKKyAgICAgICAgICAgICAgICBjb25mbGljdHMuZXh0ZW5kKGdyb3VwX2FjdGlvbnNbaSArIDE6XSkKKworICAgICAgICAjIGZpbmQgYWxsIG9wdGlvbiBpbmRpY2VzLCBhbmQgZGV0ZXJtaW5lIHRoZSBhcmdfc3RyaW5nX3BhdHRlcm4KKyAgICAgICAgIyB3aGljaCBoYXMgYW4gJ08nIGlmIHRoZXJlIGlzIGFuIG9wdGlvbiBhdCBhbiBpbmRleCwKKyAgICAgICAgIyBhbiAnQScgaWYgdGhlcmUgaXMgYW4gYXJndW1lbnQsIG9yIGEgJy0nIGlmIHRoZXJlIGlzIGEgJy0tJworICAgICAgICBvcHRpb25fc3RyaW5nX2luZGljZXMgPSB7fQorICAgICAgICBhcmdfc3RyaW5nX3BhdHRlcm5fcGFydHMgPSBbXQorICAgICAgICBhcmdfc3RyaW5nc19pdGVyID0gaXRlcihhcmdfc3RyaW5ncykKKyAgICAgICAgZm9yIGksIGFyZ19zdHJpbmcgaW4gZW51bWVyYXRlKGFyZ19zdHJpbmdzX2l0ZXIpOgorCisgICAgICAgICAgICAjIGFsbCBhcmdzIGFmdGVyIC0tIGFyZSBub24tb3B0aW9ucworICAgICAgICAgICAgaWYgYXJnX3N0cmluZyA9PSAnLS0nOgorICAgICAgICAgICAgICAgIGFyZ19zdHJpbmdfcGF0dGVybl9wYXJ0cy5hcHBlbmQoJy0nKQorICAgICAgICAgICAgICAgIGZvciBhcmdfc3RyaW5nIGluIGFyZ19zdHJpbmdzX2l0ZXI6CisgICAgICAgICAgICAgICAgICAgIGFyZ19zdHJpbmdfcGF0dGVybl9wYXJ0cy5hcHBlbmQoJ0EnKQorCisgICAgICAgICAgICAjIG90aGVyd2lzZSwgYWRkIHRoZSBhcmcgdG8gdGhlIGFyZyBzdHJpbmdzCisgICAgICAgICAgICAjIGFuZCBub3RlIHRoZSBpbmRleCBpZiBpdCB3YXMgYW4gb3B0aW9uCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9wdGlvbl90dXBsZSA9IHNlbGYuX3BhcnNlX29wdGlvbmFsKGFyZ19zdHJpbmcpCisgICAgICAgICAgICAgICAgaWYgb3B0aW9uX3R1cGxlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAnQScKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvcHRpb25fc3RyaW5nX2luZGljZXNbaV0gPSBvcHRpb25fdHVwbGUKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdPJworICAgICAgICAgICAgICAgIGFyZ19zdHJpbmdfcGF0dGVybl9wYXJ0cy5hcHBlbmQocGF0dGVybikKKworICAgICAgICAjIGpvaW4gdGhlIHBpZWNlcyB0b2dldGhlciB0byBmb3JtIHRoZSBwYXR0ZXJuCisgICAgICAgIGFyZ19zdHJpbmdzX3BhdHRlcm4gPSAnJy5qb2luKGFyZ19zdHJpbmdfcGF0dGVybl9wYXJ0cykKKworICAgICAgICAjIGNvbnZlcnRzIGFyZyBzdHJpbmdzIHRvIHRoZSBhcHByb3ByaWF0ZSBhbmQgdGhlbiB0YWtlcyB0aGUgYWN0aW9uCisgICAgICAgIHNlZW5fYWN0aW9ucyA9IHNldCgpCisgICAgICAgIHNlZW5fbm9uX2RlZmF1bHRfYWN0aW9ucyA9IHNldCgpCisKKyAgICAgICAgZGVmIHRha2VfYWN0aW9uKGFjdGlvbiwgYXJndW1lbnRfc3RyaW5ncywgb3B0aW9uX3N0cmluZz1Ob25lKToKKyAgICAgICAgICAgIHNlZW5fYWN0aW9ucy5hZGQoYWN0aW9uKQorICAgICAgICAgICAgYXJndW1lbnRfdmFsdWVzID0gc2VsZi5fZ2V0X3ZhbHVlcyhhY3Rpb24sIGFyZ3VtZW50X3N0cmluZ3MpCisKKyAgICAgICAgICAgICMgZXJyb3IgaWYgdGhpcyBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCB3aXRoIG90aGVyIHByZXZpb3VzbHkKKyAgICAgICAgICAgICMgc2VlbiBhcmd1bWVudHMsIGFzc3VtaW5nIHRoYXQgYWN0aW9ucyB0aGF0IHVzZSB0aGUgZGVmYXVsdAorICAgICAgICAgICAgIyB2YWx1ZSBkb24ndCByZWFsbHkgY291bnQgYXMgInByZXNlbnQiCisgICAgICAgICAgICBpZiBhcmd1bWVudF92YWx1ZXMgaXMgbm90IGFjdGlvbi5kZWZhdWx0OgorICAgICAgICAgICAgICAgIHNlZW5fbm9uX2RlZmF1bHRfYWN0aW9ucy5hZGQoYWN0aW9uKQorICAgICAgICAgICAgICAgIGZvciBjb25mbGljdF9hY3Rpb24gaW4gYWN0aW9uX2NvbmZsaWN0cy5nZXQoYWN0aW9uLCBbXSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGNvbmZsaWN0X2FjdGlvbiBpbiBzZWVuX25vbl9kZWZhdWx0X2FjdGlvbnM6CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBfKCdub3QgYWxsb3dlZCB3aXRoIGFyZ3VtZW50ICVzJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbl9uYW1lID0gX2dldF9hY3Rpb25fbmFtZShjb25mbGljdF9hY3Rpb24pCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yKGFjdGlvbiwgbXNnICUgYWN0aW9uX25hbWUpCisKKyAgICAgICAgICAgICMgdGFrZSB0aGUgYWN0aW9uIGlmIHdlIGRpZG4ndCByZWNlaXZlIGEgU1VQUFJFU1MgdmFsdWUKKyAgICAgICAgICAgICMgKGUuZy4gZnJvbSBhIGRlZmF1bHQpCisgICAgICAgICAgICBpZiBhcmd1bWVudF92YWx1ZXMgaXMgbm90IFNVUFBSRVNTOgorICAgICAgICAgICAgICAgIGFjdGlvbihzZWxmLCBuYW1lc3BhY2UsIGFyZ3VtZW50X3ZhbHVlcywgb3B0aW9uX3N0cmluZykKKworICAgICAgICAjIGZ1bmN0aW9uIHRvIGNvbnZlcnQgYXJnX3N0cmluZ3MgaW50byBhbiBvcHRpb25hbCBhY3Rpb24KKyAgICAgICAgZGVmIGNvbnN1bWVfb3B0aW9uYWwoc3RhcnRfaW5kZXgpOgorCisgICAgICAgICAgICAjIGdldCB0aGUgb3B0aW9uYWwgaWRlbnRpZmllZCBhdCB0aGlzIGluZGV4CisgICAgICAgICAgICBvcHRpb25fdHVwbGUgPSBvcHRpb25fc3RyaW5nX2luZGljZXNbc3RhcnRfaW5kZXhdCisgICAgICAgICAgICBhY3Rpb24sIG9wdGlvbl9zdHJpbmcsIGV4cGxpY2l0X2FyZyA9IG9wdGlvbl90dXBsZQorCisgICAgICAgICAgICAjIGlkZW50aWZ5IGFkZGl0aW9uYWwgb3B0aW9uYWxzIGluIHRoZSBzYW1lIGFyZyBzdHJpbmcKKyAgICAgICAgICAgICMgKGUuZy4gLXh5eiBpcyB0aGUgc2FtZSBhcyAteCAteSAteiBpZiBubyBhcmdzIGFyZSByZXF1aXJlZCkKKyAgICAgICAgICAgIG1hdGNoX2FyZ3VtZW50ID0gc2VsZi5fbWF0Y2hfYXJndW1lbnQKKyAgICAgICAgICAgIGFjdGlvbl90dXBsZXMgPSBbXQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKworICAgICAgICAgICAgICAgICMgaWYgd2UgZm91bmQgbm8gb3B0aW9uYWwgYWN0aW9uLCBza2lwIGl0CisgICAgICAgICAgICAgICAgaWYgYWN0aW9uIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhcy5hcHBlbmQoYXJnX3N0cmluZ3Nbc3RhcnRfaW5kZXhdKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnRfaW5kZXggKyAxCisKKyAgICAgICAgICAgICAgICAjIGlmIHRoZXJlIGlzIGFuIGV4cGxpY2l0IGFyZ3VtZW50LCB0cnkgdG8gbWF0Y2ggdGhlCisgICAgICAgICAgICAgICAgIyBvcHRpb25hbCdzIHN0cmluZyBhcmd1bWVudHMgdG8gb25seSB0aGlzCisgICAgICAgICAgICAgICAgaWYgZXhwbGljaXRfYXJnIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBhcmdfY291bnQgPSBtYXRjaF9hcmd1bWVudChhY3Rpb24sICdBJykKKworICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBhY3Rpb24gaXMgYSBzaW5nbGUtZGFzaCBvcHRpb24gYW5kIHRha2VzIG5vCisgICAgICAgICAgICAgICAgICAgICMgYXJndW1lbnRzLCB0cnkgdG8gcGFyc2UgbW9yZSBzaW5nbGUtZGFzaCBvcHRpb25zIG91dAorICAgICAgICAgICAgICAgICAgICAjIG9mIHRoZSB0YWlsIG9mIHRoZSBvcHRpb24gc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIGNoYXJzID0gc2VsZi5wcmVmaXhfY2hhcnMKKyAgICAgICAgICAgICAgICAgICAgaWYgYXJnX2NvdW50ID09IDAgYW5kIG9wdGlvbl9zdHJpbmdbMV0gbm90IGluIGNoYXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R1cGxlcy5hcHBlbmQoKGFjdGlvbiwgW10sIG9wdGlvbl9zdHJpbmcpKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciA9IG9wdGlvbl9zdHJpbmdbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9zdHJpbmcgPSBjaGFyICsgZXhwbGljaXRfYXJnWzBdCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfZXhwbGljaXRfYXJnID0gZXhwbGljaXRfYXJnWzE6XSBvciBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbHNfbWFwID0gc2VsZi5fb3B0aW9uX3N0cmluZ19hY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcHRpb25fc3RyaW5nIGluIG9wdGlvbmFsc19tYXA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gb3B0aW9uYWxzX21hcFtvcHRpb25fc3RyaW5nXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxpY2l0X2FyZyA9IG5ld19leHBsaWNpdF9hcmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gXygnaWdub3JlZCBleHBsaWNpdCBhcmd1bWVudCAlcicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvcihhY3Rpb24sIG1zZyAlIGV4cGxpY2l0X2FyZykKKworICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBhY3Rpb24gZXhwZWN0IGV4YWN0bHkgb25lIGFyZ3VtZW50LCB3ZSd2ZQorICAgICAgICAgICAgICAgICAgICAjIHN1Y2Nlc3NmdWxseSBtYXRjaGVkIHRoZSBvcHRpb247IGV4aXQgdGhlIGxvb3AKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBhcmdfY291bnQgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3AgPSBzdGFydF9pbmRleCArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBbZXhwbGljaXRfYXJnXQorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R1cGxlcy5hcHBlbmQoKGFjdGlvbiwgYXJncywgb3B0aW9uX3N0cmluZykpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgICAgICMgZXJyb3IgaWYgYSBkb3VibGUtZGFzaCBvcHRpb24gZGlkIG5vdCB1c2UgdGhlCisgICAgICAgICAgICAgICAgICAgICMgZXhwbGljaXQgYXJndW1lbnQKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IF8oJ2lnbm9yZWQgZXhwbGljaXQgYXJndW1lbnQgJXInKQorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvcihhY3Rpb24sIG1zZyAlIGV4cGxpY2l0X2FyZykKKworICAgICAgICAgICAgICAgICMgaWYgdGhlcmUgaXMgbm8gZXhwbGljaXQgYXJndW1lbnQsIHRyeSB0byBtYXRjaCB0aGUKKyAgICAgICAgICAgICAgICAjIG9wdGlvbmFsJ3Mgc3RyaW5nIGFyZ3VtZW50cyB3aXRoIHRoZSBmb2xsb3dpbmcgc3RyaW5ncworICAgICAgICAgICAgICAgICMgaWYgc3VjY2Vzc2Z1bCwgZXhpdCB0aGUgbG9vcAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnRfaW5kZXggKyAxCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX3BhdHRlcm5zID0gYXJnX3N0cmluZ3NfcGF0dGVybltzdGFydDpdCisgICAgICAgICAgICAgICAgICAgIGFyZ19jb3VudCA9IG1hdGNoX2FyZ3VtZW50KGFjdGlvbiwgc2VsZWN0ZWRfcGF0dGVybnMpCisgICAgICAgICAgICAgICAgICAgIHN0b3AgPSBzdGFydCArIGFyZ19jb3VudAorICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnX3N0cmluZ3Nbc3RhcnQ6c3RvcF0KKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uX3R1cGxlcy5hcHBlbmQoKGFjdGlvbiwgYXJncywgb3B0aW9uX3N0cmluZykpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICMgYWRkIHRoZSBPcHRpb25hbCB0byB0aGUgbGlzdCBhbmQgcmV0dXJuIHRoZSBpbmRleCBhdCB3aGljaAorICAgICAgICAgICAgIyB0aGUgT3B0aW9uYWwncyBzdHJpbmcgYXJncyBzdG9wcGVkCisgICAgICAgICAgICBhc3NlcnQgYWN0aW9uX3R1cGxlcworICAgICAgICAgICAgZm9yIGFjdGlvbiwgYXJncywgb3B0aW9uX3N0cmluZyBpbiBhY3Rpb25fdHVwbGVzOgorICAgICAgICAgICAgICAgIHRha2VfYWN0aW9uKGFjdGlvbiwgYXJncywgb3B0aW9uX3N0cmluZykKKyAgICAgICAgICAgIHJldHVybiBzdG9wCisKKyAgICAgICAgIyB0aGUgbGlzdCBvZiBQb3NpdGlvbmFscyBsZWZ0IHRvIGJlIHBhcnNlZDsgdGhpcyBpcyBtb2RpZmllZAorICAgICAgICAjIGJ5IGNvbnN1bWVfcG9zaXRpb25hbHMoKQorICAgICAgICBwb3NpdGlvbmFscyA9IHNlbGYuX2dldF9wb3NpdGlvbmFsX2FjdGlvbnMoKQorCisgICAgICAgICMgZnVuY3Rpb24gdG8gY29udmVydCBhcmdfc3RyaW5ncyBpbnRvIHBvc2l0aW9uYWwgYWN0aW9ucworICAgICAgICBkZWYgY29uc3VtZV9wb3NpdGlvbmFscyhzdGFydF9pbmRleCk6CisgICAgICAgICAgICAjIG1hdGNoIGFzIG1hbnkgUG9zaXRpb25hbHMgYXMgcG9zc2libGUKKyAgICAgICAgICAgIG1hdGNoX3BhcnRpYWwgPSBzZWxmLl9tYXRjaF9hcmd1bWVudHNfcGFydGlhbAorICAgICAgICAgICAgc2VsZWN0ZWRfcGF0dGVybiA9IGFyZ19zdHJpbmdzX3BhdHRlcm5bc3RhcnRfaW5kZXg6XQorICAgICAgICAgICAgYXJnX2NvdW50cyA9IG1hdGNoX3BhcnRpYWwocG9zaXRpb25hbHMsIHNlbGVjdGVkX3BhdHRlcm4pCisKKyAgICAgICAgICAgICMgc2xpY2Ugb2ZmIHRoZSBhcHByb3ByaWF0ZSBhcmcgc3RyaW5ncyBmb3IgZWFjaCBQb3NpdGlvbmFsCisgICAgICAgICAgICAjIGFuZCBhZGQgdGhlIFBvc2l0aW9uYWwgYW5kIGl0cyBhcmdzIHRvIHRoZSBsaXN0CisgICAgICAgICAgICBmb3IgYWN0aW9uLCBhcmdfY291bnQgaW4gemlwKHBvc2l0aW9uYWxzLCBhcmdfY291bnRzKToKKyAgICAgICAgICAgICAgICBhcmdzID0gYXJnX3N0cmluZ3Nbc3RhcnRfaW5kZXg6IHN0YXJ0X2luZGV4ICsgYXJnX2NvdW50XQorICAgICAgICAgICAgICAgIHN0YXJ0X2luZGV4ICs9IGFyZ19jb3VudAorICAgICAgICAgICAgICAgIHRha2VfYWN0aW9uKGFjdGlvbiwgYXJncykKKworICAgICAgICAgICAgIyBzbGljZSBvZmYgdGhlIFBvc2l0aW9uYWxzIHRoYXQgd2UganVzdCBwYXJzZWQgYW5kIHJldHVybiB0aGUKKyAgICAgICAgICAgICMgaW5kZXggYXQgd2hpY2ggdGhlIFBvc2l0aW9uYWxzJyBzdHJpbmcgYXJncyBzdG9wcGVkCisgICAgICAgICAgICBwb3NpdGlvbmFsc1s6XSA9IHBvc2l0aW9uYWxzW2xlbihhcmdfY291bnRzKTpdCisgICAgICAgICAgICByZXR1cm4gc3RhcnRfaW5kZXgKKworICAgICAgICAjIGNvbnN1bWUgUG9zaXRpb25hbHMgYW5kIE9wdGlvbmFscyBhbHRlcm5hdGVseSwgdW50aWwgd2UgaGF2ZQorICAgICAgICAjIHBhc3NlZCB0aGUgbGFzdCBvcHRpb24gc3RyaW5nCisgICAgICAgIGV4dHJhcyA9IFtdCisgICAgICAgIHN0YXJ0X2luZGV4ID0gMAorICAgICAgICBpZiBvcHRpb25fc3RyaW5nX2luZGljZXM6CisgICAgICAgICAgICBtYXhfb3B0aW9uX3N0cmluZ19pbmRleCA9IG1heChvcHRpb25fc3RyaW5nX2luZGljZXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtYXhfb3B0aW9uX3N0cmluZ19pbmRleCA9IC0xCisgICAgICAgIHdoaWxlIHN0YXJ0X2luZGV4IDw9IG1heF9vcHRpb25fc3RyaW5nX2luZGV4OgorCisgICAgICAgICAgICAjIGNvbnN1bWUgYW55IFBvc2l0aW9uYWxzIHByZWNlZGluZyB0aGUgbmV4dCBvcHRpb24KKyAgICAgICAgICAgIG5leHRfb3B0aW9uX3N0cmluZ19pbmRleCA9IG1pbihbCisgICAgICAgICAgICAgICAgaW5kZXgKKyAgICAgICAgICAgICAgICBmb3IgaW5kZXggaW4gb3B0aW9uX3N0cmluZ19pbmRpY2VzCisgICAgICAgICAgICAgICAgaWYgaW5kZXggPj0gc3RhcnRfaW5kZXhdKQorICAgICAgICAgICAgaWYgc3RhcnRfaW5kZXggIT0gbmV4dF9vcHRpb25fc3RyaW5nX2luZGV4OgorICAgICAgICAgICAgICAgIHBvc2l0aW9uYWxzX2VuZF9pbmRleCA9IGNvbnN1bWVfcG9zaXRpb25hbHMoc3RhcnRfaW5kZXgpCisKKyAgICAgICAgICAgICAgICAjIG9ubHkgdHJ5IHRvIHBhcnNlIHRoZSBuZXh0IG9wdGlvbmFsIGlmIHdlIGRpZG4ndCBjb25zdW1lCisgICAgICAgICAgICAgICAgIyB0aGUgb3B0aW9uIHN0cmluZyBkdXJpbmcgdGhlIHBvc2l0aW9uYWxzIHBhcnNpbmcKKyAgICAgICAgICAgICAgICBpZiBwb3NpdGlvbmFsc19lbmRfaW5kZXggPiBzdGFydF9pbmRleDoKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfaW5kZXggPSBwb3NpdGlvbmFsc19lbmRfaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzdGFydF9pbmRleCA9IHBvc2l0aW9uYWxzX2VuZF9pbmRleAorCisgICAgICAgICAgICAjIGlmIHdlIGNvbnN1bWVkIGFsbCB0aGUgcG9zaXRpb25hbHMgd2UgY291bGQgYW5kIHdlJ3JlIG5vdAorICAgICAgICAgICAgIyBhdCB0aGUgaW5kZXggb2YgYW4gb3B0aW9uIHN0cmluZywgdGhlcmUgd2VyZSBleHRyYSBhcmd1bWVudHMKKyAgICAgICAgICAgIGlmIHN0YXJ0X2luZGV4IG5vdCBpbiBvcHRpb25fc3RyaW5nX2luZGljZXM6CisgICAgICAgICAgICAgICAgc3RyaW5ncyA9IGFyZ19zdHJpbmdzW3N0YXJ0X2luZGV4Om5leHRfb3B0aW9uX3N0cmluZ19pbmRleF0KKyAgICAgICAgICAgICAgICBleHRyYXMuZXh0ZW5kKHN0cmluZ3MpCisgICAgICAgICAgICAgICAgc3RhcnRfaW5kZXggPSBuZXh0X29wdGlvbl9zdHJpbmdfaW5kZXgKKworICAgICAgICAgICAgIyBjb25zdW1lIHRoZSBuZXh0IG9wdGlvbmFsIGFuZCBhbnkgYXJndW1lbnRzIGZvciBpdAorICAgICAgICAgICAgc3RhcnRfaW5kZXggPSBjb25zdW1lX29wdGlvbmFsKHN0YXJ0X2luZGV4KQorCisgICAgICAgICMgY29uc3VtZSBhbnkgcG9zaXRpb25hbHMgZm9sbG93aW5nIHRoZSBsYXN0IE9wdGlvbmFsCisgICAgICAgIHN0b3BfaW5kZXggPSBjb25zdW1lX3Bvc2l0aW9uYWxzKHN0YXJ0X2luZGV4KQorCisgICAgICAgICMgaWYgd2UgZGlkbid0IGNvbnN1bWUgYWxsIHRoZSBhcmd1bWVudCBzdHJpbmdzLCB0aGVyZSB3ZXJlIGV4dHJhcworICAgICAgICBleHRyYXMuZXh0ZW5kKGFyZ19zdHJpbmdzW3N0b3BfaW5kZXg6XSkKKworICAgICAgICAjIGlmIHdlIGRpZG4ndCB1c2UgYWxsIHRoZSBQb3NpdGlvbmFsIG9iamVjdHMsIHRoZXJlIHdlcmUgdG9vIGZldworICAgICAgICAjIGFyZyBzdHJpbmdzIHN1cHBsaWVkLgorICAgICAgICBpZiBwb3NpdGlvbmFsczoKKyAgICAgICAgICAgIHNlbGYuZXJyb3IoXygndG9vIGZldyBhcmd1bWVudHMnKSkKKworICAgICAgICAjIG1ha2Ugc3VyZSBhbGwgcmVxdWlyZWQgYWN0aW9ucyB3ZXJlIHByZXNlbnQsIGFuZCBjb252ZXJ0IGRlZmF1bHRzLgorICAgICAgICBmb3IgYWN0aW9uIGluIHNlbGYuX2FjdGlvbnM6CisgICAgICAgICAgICBpZiBhY3Rpb24gbm90IGluIHNlZW5fYWN0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBhY3Rpb24ucmVxdWlyZWQ6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBfZ2V0X2FjdGlvbl9uYW1lKGFjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcihfKCdhcmd1bWVudCAlcyBpcyByZXF1aXJlZCcpICUgbmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIENvbnZlcnQgYWN0aW9uIGRlZmF1bHQgbm93IGluc3RlYWQgb2YgZG9pbmcgaXQgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICMgcGFyc2luZyBhcmd1bWVudHMgdG8gYXZvaWQgY2FsbGluZyBjb252ZXJ0IGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICAjIHR3aWNlICh3aGljaCBtYXkgZmFpbCkgaWYgdGhlIGFyZ3VtZW50IHdhcyBnaXZlbiwgYnV0CisgICAgICAgICAgICAgICAgICAgICMgb25seSBpZiBpdCB3YXMgZGVmaW5lZCBhbHJlYWR5IGluIHRoZSBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5kZWZhdWx0IGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoYWN0aW9uLmRlZmF1bHQsIGJhc2VzdHJpbmcpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2F0dHIobmFtZXNwYWNlLCBhY3Rpb24uZGVzdCkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLmRlZmF1bHQgaXMgZ2V0YXR0cihuYW1lc3BhY2UsIGFjdGlvbi5kZXN0KSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKG5hbWVzcGFjZSwgYWN0aW9uLmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF92YWx1ZShhY3Rpb24sIGFjdGlvbi5kZWZhdWx0KSkKKworICAgICAgICAjIG1ha2Ugc3VyZSBhbGwgcmVxdWlyZWQgZ3JvdXBzIGhhZCBvbmUgb3B0aW9uIHByZXNlbnQKKyAgICAgICAgZm9yIGdyb3VwIGluIHNlbGYuX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cHM6CisgICAgICAgICAgICBpZiBncm91cC5yZXF1aXJlZDoKKyAgICAgICAgICAgICAgICBmb3IgYWN0aW9uIGluIGdyb3VwLl9ncm91cF9hY3Rpb25zOgorICAgICAgICAgICAgICAgICAgICBpZiBhY3Rpb24gaW4gc2Vlbl9ub25fZGVmYXVsdF9hY3Rpb25zOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgICMgaWYgbm8gYWN0aW9ucyB3ZXJlIHVzZWQsIHJlcG9ydCB0aGUgZXJyb3IKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBuYW1lcyA9IFtfZ2V0X2FjdGlvbl9uYW1lKGFjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFjdGlvbiBpbiBncm91cC5fZ3JvdXBfYWN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhY3Rpb24uaGVscCBpcyBub3QgU1VQUFJFU1NdCisgICAgICAgICAgICAgICAgICAgIG1zZyA9IF8oJ29uZSBvZiB0aGUgYXJndW1lbnRzICVzIGlzIHJlcXVpcmVkJykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcihtc2cgJSAnICcuam9pbihuYW1lcykpCisKKyAgICAgICAgIyByZXR1cm4gdGhlIHVwZGF0ZWQgbmFtZXNwYWNlIGFuZCB0aGUgZXh0cmEgYXJndW1lbnRzCisgICAgICAgIHJldHVybiBuYW1lc3BhY2UsIGV4dHJhcworCisgICAgZGVmIF9yZWFkX2FyZ3NfZnJvbV9maWxlcyhzZWxmLCBhcmdfc3RyaW5ncyk6CisgICAgICAgICMgZXhwYW5kIGFyZ3VtZW50cyByZWZlcmVuY2luZyBmaWxlcworICAgICAgICBuZXdfYXJnX3N0cmluZ3MgPSBbXQorICAgICAgICBmb3IgYXJnX3N0cmluZyBpbiBhcmdfc3RyaW5nczoKKworICAgICAgICAgICAgIyBmb3IgcmVndWxhciBhcmd1bWVudHMsIGp1c3QgYWRkIHRoZW0gYmFjayBpbnRvIHRoZSBsaXN0CisgICAgICAgICAgICBpZiBub3QgYXJnX3N0cmluZyBvciBhcmdfc3RyaW5nWzBdIG5vdCBpbiBzZWxmLmZyb21maWxlX3ByZWZpeF9jaGFyczoKKyAgICAgICAgICAgICAgICBuZXdfYXJnX3N0cmluZ3MuYXBwZW5kKGFyZ19zdHJpbmcpCisKKyAgICAgICAgICAgICMgcmVwbGFjZSBhcmd1bWVudHMgcmVmZXJlbmNpbmcgZmlsZXMgd2l0aCB0aGUgZmlsZSBjb250ZW50CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYXJnc19maWxlID0gb3Blbihhcmdfc3RyaW5nWzE6XSkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgYXJnX3N0cmluZ3MgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFyZ19saW5lIGluIGFyZ3NfZmlsZS5yZWFkKCkuc3BsaXRsaW5lcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhcmcgaW4gc2VsZi5jb252ZXJ0X2FyZ19saW5lX3RvX2FyZ3MoYXJnX2xpbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdfc3RyaW5ncy5hcHBlbmQoYXJnKQorICAgICAgICAgICAgICAgICAgICAgICAgYXJnX3N0cmluZ3MgPSBzZWxmLl9yZWFkX2FyZ3NfZnJvbV9maWxlcyhhcmdfc3RyaW5ncykKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19hcmdfc3RyaW5ncy5leHRlbmQoYXJnX3N0cmluZ3MpCisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzX2ZpbGUuY2xvc2UoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBlcnIgPSBfc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcihzdHIoZXJyKSkKKworICAgICAgICAjIHJldHVybiB0aGUgbW9kaWZpZWQgYXJndW1lbnQgbGlzdAorICAgICAgICByZXR1cm4gbmV3X2FyZ19zdHJpbmdzCisKKyAgICBkZWYgY29udmVydF9hcmdfbGluZV90b19hcmdzKHNlbGYsIGFyZ19saW5lKToKKyAgICAgICAgcmV0dXJuIFthcmdfbGluZV0KKworICAgIGRlZiBfbWF0Y2hfYXJndW1lbnQoc2VsZiwgYWN0aW9uLCBhcmdfc3RyaW5nc19wYXR0ZXJuKToKKyAgICAgICAgIyBtYXRjaCB0aGUgcGF0dGVybiBmb3IgdGhpcyBhY3Rpb24gdG8gdGhlIGFyZyBzdHJpbmdzCisgICAgICAgIG5hcmdzX3BhdHRlcm4gPSBzZWxmLl9nZXRfbmFyZ3NfcGF0dGVybihhY3Rpb24pCisgICAgICAgIG1hdGNoID0gX3JlLm1hdGNoKG5hcmdzX3BhdHRlcm4sIGFyZ19zdHJpbmdzX3BhdHRlcm4pCisKKyAgICAgICAgIyByYWlzZSBhbiBleGNlcHRpb24gaWYgd2Ugd2VyZW4ndCBhYmxlIHRvIGZpbmQgYSBtYXRjaAorICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgbmFyZ3NfZXJyb3JzID0geworICAgICAgICAgICAgICAgIE5vbmU6IF8oJ2V4cGVjdGVkIG9uZSBhcmd1bWVudCcpLAorICAgICAgICAgICAgICAgIE9QVElPTkFMOiBfKCdleHBlY3RlZCBhdCBtb3N0IG9uZSBhcmd1bWVudCcpLAorICAgICAgICAgICAgICAgIE9ORV9PUl9NT1JFOiBfKCdleHBlY3RlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQnKSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQgPSBfKCdleHBlY3RlZCAlcyBhcmd1bWVudChzKScpICUgYWN0aW9uLm5hcmdzCisgICAgICAgICAgICBtc2cgPSBuYXJnc19lcnJvcnMuZ2V0KGFjdGlvbi5uYXJncywgZGVmYXVsdCkKKyAgICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IoYWN0aW9uLCBtc2cpCisKKyAgICAgICAgIyByZXR1cm4gdGhlIG51bWJlciBvZiBhcmd1bWVudHMgbWF0Y2hlZAorICAgICAgICByZXR1cm4gbGVuKG1hdGNoLmdyb3VwKDEpKQorCisgICAgZGVmIF9tYXRjaF9hcmd1bWVudHNfcGFydGlhbChzZWxmLCBhY3Rpb25zLCBhcmdfc3RyaW5nc19wYXR0ZXJuKToKKyAgICAgICAgIyBwcm9ncmVzc2l2ZWx5IHNob3J0ZW4gdGhlIGFjdGlvbnMgbGlzdCBieSBzbGljaW5nIG9mZiB0aGUKKyAgICAgICAgIyBmaW5hbCBhY3Rpb25zIHVudGlsIHdlIGZpbmQgYSBtYXRjaAorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYWN0aW9ucyksIDAsIC0xKToKKyAgICAgICAgICAgIGFjdGlvbnNfc2xpY2UgPSBhY3Rpb25zWzppXQorICAgICAgICAgICAgcGF0dGVybiA9ICcnLmpvaW4oW3NlbGYuX2dldF9uYXJnc19wYXR0ZXJuKGFjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWN0aW9uIGluIGFjdGlvbnNfc2xpY2VdKQorICAgICAgICAgICAgbWF0Y2ggPSBfcmUubWF0Y2gocGF0dGVybiwgYXJnX3N0cmluZ3NfcGF0dGVybikKKyAgICAgICAgICAgIGlmIG1hdGNoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoW2xlbihzdHJpbmcpIGZvciBzdHJpbmcgaW4gbWF0Y2guZ3JvdXBzKCldKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgIyByZXR1cm4gdGhlIGxpc3Qgb2YgYXJnIHN0cmluZyBjb3VudHMKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9wYXJzZV9vcHRpb25hbChzZWxmLCBhcmdfc3RyaW5nKToKKyAgICAgICAgIyBpZiBpdCdzIGFuIGVtcHR5IHN0cmluZywgaXQgd2FzIG1lYW50IHRvIGJlIGEgcG9zaXRpb25hbAorICAgICAgICBpZiBub3QgYXJnX3N0cmluZzoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBpZiBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggYSBwcmVmaXgsIGl0IHdhcyBtZWFudCB0byBiZSBwb3NpdGlvbmFsCisgICAgICAgIGlmIG5vdCBhcmdfc3RyaW5nWzBdIGluIHNlbGYucHJlZml4X2NoYXJzOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIGlmIHRoZSBvcHRpb24gc3RyaW5nIGlzIHByZXNlbnQgaW4gdGhlIHBhcnNlciwgcmV0dXJuIHRoZSBhY3Rpb24KKyAgICAgICAgaWYgYXJnX3N0cmluZyBpbiBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnM6CisgICAgICAgICAgICBhY3Rpb24gPSBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnNbYXJnX3N0cmluZ10KKyAgICAgICAgICAgIHJldHVybiBhY3Rpb24sIGFyZ19zdHJpbmcsIE5vbmUKKworICAgICAgICAjIGlmIGl0J3MganVzdCBhIHNpbmdsZSBjaGFyYWN0ZXIsIGl0IHdhcyBtZWFudCB0byBiZSBwb3NpdGlvbmFsCisgICAgICAgIGlmIGxlbihhcmdfc3RyaW5nKSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIGlmIHRoZSBvcHRpb24gc3RyaW5nIGJlZm9yZSB0aGUgIj0iIGlzIHByZXNlbnQsIHJldHVybiB0aGUgYWN0aW9uCisgICAgICAgIGlmICc9JyBpbiBhcmdfc3RyaW5nOgorICAgICAgICAgICAgb3B0aW9uX3N0cmluZywgZXhwbGljaXRfYXJnID0gYXJnX3N0cmluZy5zcGxpdCgnPScsIDEpCisgICAgICAgICAgICBpZiBvcHRpb25fc3RyaW5nIGluIHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9uczoKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnNbb3B0aW9uX3N0cmluZ10KKyAgICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uLCBvcHRpb25fc3RyaW5nLCBleHBsaWNpdF9hcmcKKworICAgICAgICAjIHNlYXJjaCB0aHJvdWdoIGFsbCBwb3NzaWJsZSBwcmVmaXhlcyBvZiB0aGUgb3B0aW9uIHN0cmluZworICAgICAgICAjIGFuZCBhbGwgYWN0aW9ucyBpbiB0aGUgcGFyc2VyIGZvciBwb3NzaWJsZSBpbnRlcnByZXRhdGlvbnMKKyAgICAgICAgb3B0aW9uX3R1cGxlcyA9IHNlbGYuX2dldF9vcHRpb25fdHVwbGVzKGFyZ19zdHJpbmcpCisKKyAgICAgICAgIyBpZiBtdWx0aXBsZSBhY3Rpb25zIG1hdGNoLCB0aGUgb3B0aW9uIHN0cmluZyB3YXMgYW1iaWd1b3VzCisgICAgICAgIGlmIGxlbihvcHRpb25fdHVwbGVzKSA+IDE6CisgICAgICAgICAgICBvcHRpb25zID0gJywgJy5qb2luKFtvcHRpb25fc3RyaW5nCisgICAgICAgICAgICAgICAgZm9yIGFjdGlvbiwgb3B0aW9uX3N0cmluZywgZXhwbGljaXRfYXJnIGluIG9wdGlvbl90dXBsZXNdKQorICAgICAgICAgICAgdHVwID0gYXJnX3N0cmluZywgb3B0aW9ucworICAgICAgICAgICAgc2VsZi5lcnJvcihfKCdhbWJpZ3VvdXMgb3B0aW9uOiAlcyBjb3VsZCBtYXRjaCAlcycpICUgdHVwKQorCisgICAgICAgICMgaWYgZXhhY3RseSBvbmUgYWN0aW9uIG1hdGNoZWQsIHRoaXMgc2VnbWVudGF0aW9uIGlzIGdvb2QsCisgICAgICAgICMgc28gcmV0dXJuIHRoZSBwYXJzZWQgYWN0aW9uCisgICAgICAgIGVsaWYgbGVuKG9wdGlvbl90dXBsZXMpID09IDE6CisgICAgICAgICAgICBvcHRpb25fdHVwbGUsID0gb3B0aW9uX3R1cGxlcworICAgICAgICAgICAgcmV0dXJuIG9wdGlvbl90dXBsZQorCisgICAgICAgICMgaWYgaXQgd2FzIG5vdCBmb3VuZCBhcyBhbiBvcHRpb24sIGJ1dCBpdCBsb29rcyBsaWtlIGEgbmVnYXRpdmUKKyAgICAgICAgIyBudW1iZXIsIGl0IHdhcyBtZWFudCB0byBiZSBwb3NpdGlvbmFsCisgICAgICAgICMgdW5sZXNzIHRoZXJlIGFyZSBuZWdhdGl2ZS1udW1iZXItbGlrZSBvcHRpb25zCisgICAgICAgIGlmIHNlbGYuX25lZ2F0aXZlX251bWJlcl9tYXRjaGVyLm1hdGNoKGFyZ19zdHJpbmcpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2hhc19uZWdhdGl2ZV9udW1iZXJfb3B0aW9uYWxzOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBpZiBpdCBjb250YWlucyBhIHNwYWNlLCBpdCB3YXMgbWVhbnQgdG8gYmUgYSBwb3NpdGlvbmFsCisgICAgICAgIGlmICcgJyBpbiBhcmdfc3RyaW5nOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIGl0IHdhcyBtZWFudCB0byBiZSBhbiBvcHRpb25hbCBidXQgdGhlcmUgaXMgbm8gc3VjaCBvcHRpb24KKyAgICAgICAgIyBpbiB0aGlzIHBhcnNlciAodGhvdWdoIGl0IG1pZ2h0IGJlIGEgdmFsaWQgb3B0aW9uIGluIGEgc3VicGFyc2VyKQorICAgICAgICByZXR1cm4gTm9uZSwgYXJnX3N0cmluZywgTm9uZQorCisgICAgZGVmIF9nZXRfb3B0aW9uX3R1cGxlcyhzZWxmLCBvcHRpb25fc3RyaW5nKToKKyAgICAgICAgcmVzdWx0ID0gW10KKworICAgICAgICAjIG9wdGlvbiBzdHJpbmdzIHN0YXJ0aW5nIHdpdGggdHdvIHByZWZpeCBjaGFyYWN0ZXJzIGFyZSBvbmx5CisgICAgICAgICMgc3BsaXQgYXQgdGhlICc9JworICAgICAgICBjaGFycyA9IHNlbGYucHJlZml4X2NoYXJzCisgICAgICAgIGlmIG9wdGlvbl9zdHJpbmdbMF0gaW4gY2hhcnMgYW5kIG9wdGlvbl9zdHJpbmdbMV0gaW4gY2hhcnM6CisgICAgICAgICAgICBpZiAnPScgaW4gb3B0aW9uX3N0cmluZzoKKyAgICAgICAgICAgICAgICBvcHRpb25fcHJlZml4LCBleHBsaWNpdF9hcmcgPSBvcHRpb25fc3RyaW5nLnNwbGl0KCc9JywgMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3B0aW9uX3ByZWZpeCA9IG9wdGlvbl9zdHJpbmcKKyAgICAgICAgICAgICAgICBleHBsaWNpdF9hcmcgPSBOb25lCisgICAgICAgICAgICBmb3Igb3B0aW9uX3N0cmluZyBpbiBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnM6CisgICAgICAgICAgICAgICAgaWYgb3B0aW9uX3N0cmluZy5zdGFydHN3aXRoKG9wdGlvbl9wcmVmaXgpOgorICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnNbb3B0aW9uX3N0cmluZ10KKyAgICAgICAgICAgICAgICAgICAgdHVwID0gYWN0aW9uLCBvcHRpb25fc3RyaW5nLCBleHBsaWNpdF9hcmcKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0dXApCisKKyAgICAgICAgIyBzaW5nbGUgY2hhcmFjdGVyIG9wdGlvbnMgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIHRoZWlyIGFyZ3VtZW50cworICAgICAgICAjIGJ1dCBtdWx0aXBsZSBjaGFyYWN0ZXIgb3B0aW9ucyBhbHdheXMgaGF2ZSB0byBoYXZlIHRoZWlyIGFyZ3VtZW50CisgICAgICAgICMgc2VwYXJhdGUKKyAgICAgICAgZWxpZiBvcHRpb25fc3RyaW5nWzBdIGluIGNoYXJzIGFuZCBvcHRpb25fc3RyaW5nWzFdIG5vdCBpbiBjaGFyczoKKyAgICAgICAgICAgIG9wdGlvbl9wcmVmaXggPSBvcHRpb25fc3RyaW5nCisgICAgICAgICAgICBleHBsaWNpdF9hcmcgPSBOb25lCisgICAgICAgICAgICBzaG9ydF9vcHRpb25fcHJlZml4ID0gb3B0aW9uX3N0cmluZ1s6Ml0KKyAgICAgICAgICAgIHNob3J0X2V4cGxpY2l0X2FyZyA9IG9wdGlvbl9zdHJpbmdbMjpdCisKKyAgICAgICAgICAgIGZvciBvcHRpb25fc3RyaW5nIGluIHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBvcHRpb25fc3RyaW5nID09IHNob3J0X29wdGlvbl9wcmVmaXg6CisgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9uc1tvcHRpb25fc3RyaW5nXQorICAgICAgICAgICAgICAgICAgICB0dXAgPSBhY3Rpb24sIG9wdGlvbl9zdHJpbmcsIHNob3J0X2V4cGxpY2l0X2FyZworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHR1cCkKKyAgICAgICAgICAgICAgICBlbGlmIG9wdGlvbl9zdHJpbmcuc3RhcnRzd2l0aChvcHRpb25fcHJlZml4KToKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gc2VsZi5fb3B0aW9uX3N0cmluZ19hY3Rpb25zW29wdGlvbl9zdHJpbmddCisgICAgICAgICAgICAgICAgICAgIHR1cCA9IGFjdGlvbiwgb3B0aW9uX3N0cmluZywgZXhwbGljaXRfYXJnCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodHVwKQorCisgICAgICAgICMgc2hvdWxkbid0IGV2ZXIgZ2V0IGhlcmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZXJyb3IoXygndW5leHBlY3RlZCBvcHRpb24gc3RyaW5nOiAlcycpICUgb3B0aW9uX3N0cmluZykKKworICAgICAgICAjIHJldHVybiB0aGUgY29sbGVjdGVkIG9wdGlvbiB0dXBsZXMKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9nZXRfbmFyZ3NfcGF0dGVybihzZWxmLCBhY3Rpb24pOgorICAgICAgICAjIGluIGFsbCBleGFtcGxlcyBiZWxvdywgd2UgaGF2ZSB0byBhbGxvdyBmb3IgJy0tJyBhcmdzCisgICAgICAgICMgd2hpY2ggYXJlIHJlcHJlc2VudGVkIGFzICctJyBpbiB0aGUgcGF0dGVybgorICAgICAgICBuYXJncyA9IGFjdGlvbi5uYXJncworCisgICAgICAgICMgdGhlIGRlZmF1bHQgKE5vbmUpIGlzIGFzc3VtZWQgdG8gYmUgYSBzaW5nbGUgYXJndW1lbnQKKyAgICAgICAgaWYgbmFyZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIG5hcmdzX3BhdHRlcm4gPSAnKC0qQS0qKScKKworICAgICAgICAjIGFsbG93IHplcm8gb3Igb25lIGFyZ3VtZW50cworICAgICAgICBlbGlmIG5hcmdzID09IE9QVElPTkFMOgorICAgICAgICAgICAgbmFyZ3NfcGF0dGVybiA9ICcoLSpBPy0qKScKKworICAgICAgICAjIGFsbG93IHplcm8gb3IgbW9yZSBhcmd1bWVudHMKKyAgICAgICAgZWxpZiBuYXJncyA9PSBaRVJPX09SX01PUkU6CisgICAgICAgICAgICBuYXJnc19wYXR0ZXJuID0gJygtKltBLV0qKScKKworICAgICAgICAjIGFsbG93IG9uZSBvciBtb3JlIGFyZ3VtZW50cworICAgICAgICBlbGlmIG5hcmdzID09IE9ORV9PUl9NT1JFOgorICAgICAgICAgICAgbmFyZ3NfcGF0dGVybiA9ICcoLSpBW0EtXSopJworCisgICAgICAgICMgYWxsb3cgYW55IG51bWJlciBvZiBvcHRpb25zIG9yIGFyZ3VtZW50cworICAgICAgICBlbGlmIG5hcmdzID09IFJFTUFJTkRFUjoKKyAgICAgICAgICAgIG5hcmdzX3BhdHRlcm4gPSAnKFstQU9dKiknCisKKyAgICAgICAgIyBhbGxvdyBvbmUgYXJndW1lbnQgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBvcHRpb25zIG9yIGFyZ3VtZW50cworICAgICAgICBlbGlmIG5hcmdzID09IFBBUlNFUjoKKyAgICAgICAgICAgIG5hcmdzX3BhdHRlcm4gPSAnKC0qQVstQU9dKiknCisKKyAgICAgICAgIyBhbGwgb3RoZXJzIHNob3VsZCBiZSBpbnRlZ2VycworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFyZ3NfcGF0dGVybiA9ICcoLSolcy0qKScgJSAnLSonLmpvaW4oJ0EnICogbmFyZ3MpCisKKyAgICAgICAgIyBpZiB0aGlzIGlzIGFuIG9wdGlvbmFsIGFjdGlvbiwgLS0gaXMgbm90IGFsbG93ZWQKKyAgICAgICAgaWYgYWN0aW9uLm9wdGlvbl9zdHJpbmdzOgorICAgICAgICAgICAgbmFyZ3NfcGF0dGVybiA9IG5hcmdzX3BhdHRlcm4ucmVwbGFjZSgnLSonLCAnJykKKyAgICAgICAgICAgIG5hcmdzX3BhdHRlcm4gPSBuYXJnc19wYXR0ZXJuLnJlcGxhY2UoJy0nLCAnJykKKworICAgICAgICAjIHJldHVybiB0aGUgcGF0dGVybgorICAgICAgICByZXR1cm4gbmFyZ3NfcGF0dGVybgorCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIFZhbHVlIGNvbnZlcnNpb24gbWV0aG9kcworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09CisgICAgZGVmIF9nZXRfdmFsdWVzKHNlbGYsIGFjdGlvbiwgYXJnX3N0cmluZ3MpOgorICAgICAgICAjIGZvciBldmVyeXRoaW5nIGJ1dCBQQVJTRVIsIFJFTUFJTkRFUiBhcmdzLCBzdHJpcCBvdXQgZmlyc3QgJy0tJworICAgICAgICBpZiBhY3Rpb24ubmFyZ3Mgbm90IGluIFtQQVJTRVIsIFJFTUFJTkRFUl06CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYXJnX3N0cmluZ3MucmVtb3ZlKCctLScpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBvcHRpb25hbCBhcmd1bWVudCBwcm9kdWNlcyBhIGRlZmF1bHQgd2hlbiBub3QgcHJlc2VudAorICAgICAgICBpZiBub3QgYXJnX3N0cmluZ3MgYW5kIGFjdGlvbi5uYXJncyA9PSBPUFRJT05BTDoKKyAgICAgICAgICAgIGlmIGFjdGlvbi5vcHRpb25fc3RyaW5nczoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGFjdGlvbi5jb25zdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGFjdGlvbi5kZWZhdWx0CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX2dldF92YWx1ZShhY3Rpb24sIHZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX3ZhbHVlKGFjdGlvbiwgdmFsdWUpCisKKyAgICAgICAgIyB3aGVuIG5hcmdzPScqJyBvbiBhIHBvc2l0aW9uYWwsIGlmIHRoZXJlIHdlcmUgbm8gY29tbWFuZC1saW5lCisgICAgICAgICMgYXJncywgdXNlIHRoZSBkZWZhdWx0IGlmIGl0IGlzIGFueXRoaW5nIG90aGVyIHRoYW4gTm9uZQorICAgICAgICBlbGlmIChub3QgYXJnX3N0cmluZ3MgYW5kIGFjdGlvbi5uYXJncyA9PSBaRVJPX09SX01PUkUgYW5kCisgICAgICAgICAgICAgIG5vdCBhY3Rpb24ub3B0aW9uX3N0cmluZ3MpOgorICAgICAgICAgICAgaWYgYWN0aW9uLmRlZmF1bHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBhY3Rpb24uZGVmYXVsdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGFyZ19zdHJpbmdzCisgICAgICAgICAgICBzZWxmLl9jaGVja192YWx1ZShhY3Rpb24sIHZhbHVlKQorCisgICAgICAgICMgc2luZ2xlIGFyZ3VtZW50IG9yIG9wdGlvbmFsIGFyZ3VtZW50IHByb2R1Y2VzIGEgc2luZ2xlIHZhbHVlCisgICAgICAgIGVsaWYgbGVuKGFyZ19zdHJpbmdzKSA9PSAxIGFuZCBhY3Rpb24ubmFyZ3MgaW4gW05vbmUsIE9QVElPTkFMXToKKyAgICAgICAgICAgIGFyZ19zdHJpbmcsID0gYXJnX3N0cmluZ3MKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZ2V0X3ZhbHVlKGFjdGlvbiwgYXJnX3N0cmluZykKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3ZhbHVlKGFjdGlvbiwgdmFsdWUpCisKKyAgICAgICAgIyBSRU1BSU5ERVIgYXJndW1lbnRzIGNvbnZlcnQgYWxsIHZhbHVlcywgY2hlY2tpbmcgbm9uZQorICAgICAgICBlbGlmIGFjdGlvbi5uYXJncyA9PSBSRU1BSU5ERVI6CisgICAgICAgICAgICB2YWx1ZSA9IFtzZWxmLl9nZXRfdmFsdWUoYWN0aW9uLCB2KSBmb3IgdiBpbiBhcmdfc3RyaW5nc10KKworICAgICAgICAjIFBBUlNFUiBhcmd1bWVudHMgY29udmVydCBhbGwgdmFsdWVzLCBidXQgY2hlY2sgb25seSB0aGUgZmlyc3QKKyAgICAgICAgZWxpZiBhY3Rpb24ubmFyZ3MgPT0gUEFSU0VSOgorICAgICAgICAgICAgdmFsdWUgPSBbc2VsZi5fZ2V0X3ZhbHVlKGFjdGlvbiwgdikgZm9yIHYgaW4gYXJnX3N0cmluZ3NdCisgICAgICAgICAgICBzZWxmLl9jaGVja192YWx1ZShhY3Rpb24sIHZhbHVlWzBdKQorCisgICAgICAgICMgYWxsIG90aGVyIHR5cGVzIG9mIG5hcmdzIHByb2R1Y2UgYSBsaXN0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWx1ZSA9IFtzZWxmLl9nZXRfdmFsdWUoYWN0aW9uLCB2KSBmb3IgdiBpbiBhcmdfc3RyaW5nc10KKyAgICAgICAgICAgIGZvciB2IGluIHZhbHVlOgorICAgICAgICAgICAgICAgIHNlbGYuX2NoZWNrX3ZhbHVlKGFjdGlvbiwgdikKKworICAgICAgICAjIHJldHVybiB0aGUgY29udmVydGVkIHZhbHVlCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIF9nZXRfdmFsdWUoc2VsZiwgYWN0aW9uLCBhcmdfc3RyaW5nKToKKyAgICAgICAgdHlwZV9mdW5jID0gc2VsZi5fcmVnaXN0cnlfZ2V0KCd0eXBlJywgYWN0aW9uLnR5cGUsIGFjdGlvbi50eXBlKQorICAgICAgICBpZiBub3QgX2NhbGxhYmxlKHR5cGVfZnVuYyk6CisgICAgICAgICAgICBtc2cgPSBfKCclciBpcyBub3QgY2FsbGFibGUnKQorICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvcihhY3Rpb24sIG1zZyAlIHR5cGVfZnVuYykKKworICAgICAgICAjIGNvbnZlcnQgdGhlIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IHR5cGVfZnVuYyhhcmdfc3RyaW5nKQorCisgICAgICAgICMgQXJndW1lbnRUeXBlRXJyb3JzIGluZGljYXRlIGVycm9ycworICAgICAgICBleGNlcHQgQXJndW1lbnRUeXBlRXJyb3I6CisgICAgICAgICAgICBuYW1lID0gZ2V0YXR0cihhY3Rpb24udHlwZSwgJ19fbmFtZV9fJywgcmVwcihhY3Rpb24udHlwZSkpCisgICAgICAgICAgICBtc2cgPSBzdHIoX3N5cy5leGNfaW5mbygpWzFdKQorICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvcihhY3Rpb24sIG1zZykKKworICAgICAgICAjIFR5cGVFcnJvcnMgb3IgVmFsdWVFcnJvcnMgYWxzbyBpbmRpY2F0ZSBlcnJvcnMKKyAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgbmFtZSA9IGdldGF0dHIoYWN0aW9uLnR5cGUsICdfX25hbWVfXycsIHJlcHIoYWN0aW9uLnR5cGUpKQorICAgICAgICAgICAgbXNnID0gXygnaW52YWxpZCAlcyB2YWx1ZTogJXInKQorICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvcihhY3Rpb24sIG1zZyAlIChuYW1lLCBhcmdfc3RyaW5nKSkKKworICAgICAgICAjIHJldHVybiB0aGUgY29udmVydGVkIHZhbHVlCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfY2hlY2tfdmFsdWUoc2VsZiwgYWN0aW9uLCB2YWx1ZSk6CisgICAgICAgICMgY29udmVydGVkIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBjaG9pY2VzIChpZiBzcGVjaWZpZWQpCisgICAgICAgIGlmIGFjdGlvbi5jaG9pY2VzIGlzIG5vdCBOb25lIGFuZCB2YWx1ZSBub3QgaW4gYWN0aW9uLmNob2ljZXM6CisgICAgICAgICAgICB0dXAgPSB2YWx1ZSwgJywgJy5qb2luKG1hcChyZXByLCBhY3Rpb24uY2hvaWNlcykpCisgICAgICAgICAgICBtc2cgPSBfKCdpbnZhbGlkIGNob2ljZTogJXIgKGNob29zZSBmcm9tICVzKScpICUgdHVwCisgICAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yKGFjdGlvbiwgbXNnKQorCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PQorICAgICMgSGVscC1mb3JtYXR0aW5nIG1ldGhvZHMKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09CisgICAgZGVmIGZvcm1hdF91c2FnZShzZWxmKToKKyAgICAgICAgZm9ybWF0dGVyID0gc2VsZi5fZ2V0X2Zvcm1hdHRlcigpCisgICAgICAgIGZvcm1hdHRlci5hZGRfdXNhZ2Uoc2VsZi51c2FnZSwgc2VsZi5fYWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXBzKQorICAgICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdF9oZWxwKCkKKworICAgIGRlZiBmb3JtYXRfaGVscChzZWxmKToKKyAgICAgICAgZm9ybWF0dGVyID0gc2VsZi5fZ2V0X2Zvcm1hdHRlcigpCisKKyAgICAgICAgIyB1c2FnZQorICAgICAgICBmb3JtYXR0ZXIuYWRkX3VzYWdlKHNlbGYudXNhZ2UsIHNlbGYuX2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwcykKKworICAgICAgICAjIGRlc2NyaXB0aW9uCisgICAgICAgIGZvcm1hdHRlci5hZGRfdGV4dChzZWxmLmRlc2NyaXB0aW9uKQorCisgICAgICAgICMgcG9zaXRpb25hbHMsIG9wdGlvbmFscyBhbmQgdXNlci1kZWZpbmVkIGdyb3VwcworICAgICAgICBmb3IgYWN0aW9uX2dyb3VwIGluIHNlbGYuX2FjdGlvbl9ncm91cHM6CisgICAgICAgICAgICBmb3JtYXR0ZXIuc3RhcnRfc2VjdGlvbihhY3Rpb25fZ3JvdXAudGl0bGUpCisgICAgICAgICAgICBmb3JtYXR0ZXIuYWRkX3RleHQoYWN0aW9uX2dyb3VwLmRlc2NyaXB0aW9uKQorICAgICAgICAgICAgZm9ybWF0dGVyLmFkZF9hcmd1bWVudHMoYWN0aW9uX2dyb3VwLl9ncm91cF9hY3Rpb25zKQorICAgICAgICAgICAgZm9ybWF0dGVyLmVuZF9zZWN0aW9uKCkKKworICAgICAgICAjIGVwaWxvZworICAgICAgICBmb3JtYXR0ZXIuYWRkX3RleHQoc2VsZi5lcGlsb2cpCisKKyAgICAgICAgIyBkZXRlcm1pbmUgaGVscCBmcm9tIGZvcm1hdCBhYm92ZQorICAgICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdF9oZWxwKCkKKworICAgIGRlZiBmb3JtYXRfdmVyc2lvbihzZWxmKToKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAnVGhlIGZvcm1hdF92ZXJzaW9uIG1ldGhvZCBpcyBkZXByZWNhdGVkIC0tIHRoZSAidmVyc2lvbiIgJworICAgICAgICAgICAgJ2FyZ3VtZW50IHRvIEFyZ3VtZW50UGFyc2VyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuJywKKyAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgZm9ybWF0dGVyID0gc2VsZi5fZ2V0X2Zvcm1hdHRlcigpCisgICAgICAgIGZvcm1hdHRlci5hZGRfdGV4dChzZWxmLnZlcnNpb24pCisgICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0X2hlbHAoKQorCisgICAgZGVmIF9nZXRfZm9ybWF0dGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXR0ZXJfY2xhc3MocHJvZz1zZWxmLnByb2cpCisKKyAgICAjID09PT09PT09PT09PT09PT09PT09PQorICAgICMgSGVscC1wcmludGluZyBtZXRob2RzCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT0KKyAgICBkZWYgcHJpbnRfdXNhZ2Uoc2VsZiwgZmlsZT1Ob25lKToKKyAgICAgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgZmlsZSA9IF9zeXMuc3Rkb3V0CisgICAgICAgIHNlbGYuX3ByaW50X21lc3NhZ2Uoc2VsZi5mb3JtYXRfdXNhZ2UoKSwgZmlsZSkKKworICAgIGRlZiBwcmludF9oZWxwKHNlbGYsIGZpbGU9Tm9uZSk6CisgICAgICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgIGZpbGUgPSBfc3lzLnN0ZG91dAorICAgICAgICBzZWxmLl9wcmludF9tZXNzYWdlKHNlbGYuZm9ybWF0X2hlbHAoKSwgZmlsZSkKKworICAgIGRlZiBwcmludF92ZXJzaW9uKHNlbGYsIGZpbGU9Tm9uZSk6CisgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgJ1RoZSBwcmludF92ZXJzaW9uIG1ldGhvZCBpcyBkZXByZWNhdGVkIC0tIHRoZSAidmVyc2lvbiIgJworICAgICAgICAgICAgJ2FyZ3VtZW50IHRvIEFyZ3VtZW50UGFyc2VyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuJywKKyAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgc2VsZi5fcHJpbnRfbWVzc2FnZShzZWxmLmZvcm1hdF92ZXJzaW9uKCksIGZpbGUpCisKKyAgICBkZWYgX3ByaW50X21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSwgZmlsZT1Ob25lKToKKyAgICAgICAgaWYgbWVzc2FnZToKKyAgICAgICAgICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBmaWxlID0gX3N5cy5zdGRlcnIKKyAgICAgICAgICAgIGZpbGUud3JpdGUobWVzc2FnZSkKKworICAgICMgPT09PT09PT09PT09PT09CisgICAgIyBFeGl0aW5nIG1ldGhvZHMKKyAgICAjID09PT09PT09PT09PT09PQorICAgIGRlZiBleGl0KHNlbGYsIHN0YXR1cz0wLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICBpZiBtZXNzYWdlOgorICAgICAgICAgICAgc2VsZi5fcHJpbnRfbWVzc2FnZShtZXNzYWdlLCBfc3lzLnN0ZGVycikKKyAgICAgICAgX3N5cy5leGl0KHN0YXR1cykKKworICAgIGRlZiBlcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiZXJyb3IobWVzc2FnZTogc3RyaW5nKQorCisgICAgICAgIFByaW50cyBhIHVzYWdlIG1lc3NhZ2UgaW5jb3Jwb3JhdGluZyB0aGUgbWVzc2FnZSB0byBzdGRlcnIgYW5kCisgICAgICAgIGV4aXRzLgorCisgICAgICAgIElmIHlvdSBvdmVycmlkZSB0aGlzIGluIGEgc3ViY2xhc3MsIGl0IHNob3VsZCBub3QgcmV0dXJuIC0tIGl0CisgICAgICAgIHNob3VsZCBlaXRoZXIgZXhpdCBvciByYWlzZSBhbiBleGNlcHRpb24uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnByaW50X3VzYWdlKF9zeXMuc3RkZXJyKQorICAgICAgICBzZWxmLmV4aXQoMiwgXygnJXM6IGVycm9yOiAlc1xuJykgJSAoc2VsZi5wcm9nLCBtZXNzYWdlKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYXJncGFyc2UucHljIGIvbGliL3B5dGhvbjIuNy9hcmdwYXJzZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1NzVjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYXJncGFyc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYXJncGFyc2UucHlvIGIvbGliL3B5dGhvbjIuNy9hcmdwYXJzZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyNWEwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYXJncGFyc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYXN0LnB5IGIvbGliL3B5dGhvbjIuNy9hc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1ZGZkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYXN0LnB5CkBAIC0wLDAgKzEsMzExIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIiIiCisgICAgYXN0CisgICAgfn5+CisKKyAgICBUaGUgYGFzdGAgbW9kdWxlIGhlbHBzIFB5dGhvbiBhcHBsaWNhdGlvbnMgdG8gcHJvY2VzcyB0cmVlcyBvZiB0aGUgUHl0aG9uCisgICAgYWJzdHJhY3Qgc3ludGF4IGdyYW1tYXIuICBUaGUgYWJzdHJhY3Qgc3ludGF4IGl0c2VsZiBtaWdodCBjaGFuZ2Ugd2l0aAorICAgIGVhY2ggUHl0aG9uIHJlbGVhc2U7IHRoaXMgbW9kdWxlIGhlbHBzIHRvIGZpbmQgb3V0IHByb2dyYW1tYXRpY2FsbHkgd2hhdAorICAgIHRoZSBjdXJyZW50IGdyYW1tYXIgbG9va3MgbGlrZSBhbmQgYWxsb3dzIG1vZGlmaWNhdGlvbnMgb2YgaXQuCisKKyAgICBBbiBhYnN0cmFjdCBzeW50YXggdHJlZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IHBhc3NpbmcgYGFzdC5QeUNGX09OTFlfQVNUYCBhcworICAgIGEgZmxhZyB0byB0aGUgYGNvbXBpbGUoKWAgYnVpbHRpbiBmdW5jdGlvbiBvciBieSB1c2luZyB0aGUgYHBhcnNlKClgCisgICAgZnVuY3Rpb24gZnJvbSB0aGlzIG1vZHVsZS4gIFRoZSByZXN1bHQgd2lsbCBiZSBhIHRyZWUgb2Ygb2JqZWN0cyB3aG9zZQorICAgIGNsYXNzZXMgYWxsIGluaGVyaXQgZnJvbSBgYXN0LkFTVGAuCisKKyAgICBBIG1vZGlmaWVkIGFic3RyYWN0IHN5bnRheCB0cmVlIGNhbiBiZSBjb21waWxlZCBpbnRvIGEgUHl0aG9uIGNvZGUgb2JqZWN0CisgICAgdXNpbmcgdGhlIGJ1aWx0LWluIGBjb21waWxlKClgIGZ1bmN0aW9uLgorCisgICAgQWRkaXRpb25hbGx5IHZhcmlvdXMgaGVscGVyIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQgdGhhdCBtYWtlIHdvcmtpbmcgd2l0aAorICAgIHRoZSB0cmVlcyBzaW1wbGVyLiAgVGhlIG1haW4gaW50ZW50aW9uIG9mIHRoZSBoZWxwZXIgZnVuY3Rpb25zIGFuZCB0aGlzCisgICAgbW9kdWxlIGluIGdlbmVyYWwgaXMgdG8gcHJvdmlkZSBhbiBlYXN5IHRvIHVzZSBpbnRlcmZhY2UgZm9yIGxpYnJhcmllcworICAgIHRoYXQgd29yayB0aWdodGx5IHdpdGggdGhlIHB5dGhvbiBzeW50YXggKHRlbXBsYXRlIGVuZ2luZXMgZm9yIGV4YW1wbGUpLgorCisKKyAgICA6Y29weXJpZ2h0OiBDb3B5cmlnaHQgMjAwOCBieSBBcm1pbiBSb25hY2hlci4KKyAgICA6bGljZW5zZTogUHl0aG9uIExpY2Vuc2UuCisiIiIKK2Zyb20gX2FzdCBpbXBvcnQgKgorZnJvbSBfYXN0IGltcG9ydCBfX3ZlcnNpb25fXworCisKK2RlZiBwYXJzZShzb3VyY2UsIGZpbGVuYW1lPSc8dW5rbm93bj4nLCBtb2RlPSdleGVjJyk6CisgICAgIiIiCisgICAgUGFyc2UgdGhlIHNvdXJjZSBpbnRvIGFuIEFTVCBub2RlLgorICAgIEVxdWl2YWxlbnQgdG8gY29tcGlsZShzb3VyY2UsIGZpbGVuYW1lLCBtb2RlLCBQeUNGX09OTFlfQVNUKS4KKyAgICAiIiIKKyAgICByZXR1cm4gY29tcGlsZShzb3VyY2UsIGZpbGVuYW1lLCBtb2RlLCBQeUNGX09OTFlfQVNUKQorCisKK2RlZiBsaXRlcmFsX2V2YWwobm9kZV9vcl9zdHJpbmcpOgorICAgICIiIgorICAgIFNhZmVseSBldmFsdWF0ZSBhbiBleHByZXNzaW9uIG5vZGUgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhIFB5dGhvbgorICAgIGV4cHJlc3Npb24uICBUaGUgc3RyaW5nIG9yIG5vZGUgcHJvdmlkZWQgbWF5IG9ubHkgY29uc2lzdCBvZiB0aGUgZm9sbG93aW5nCisgICAgUHl0aG9uIGxpdGVyYWwgc3RydWN0dXJlczogc3RyaW5ncywgbnVtYmVycywgdHVwbGVzLCBsaXN0cywgZGljdHMsIGJvb2xlYW5zLAorICAgIGFuZCBOb25lLgorICAgICIiIgorICAgIF9zYWZlX25hbWVzID0geydOb25lJzogTm9uZSwgJ1RydWUnOiBUcnVlLCAnRmFsc2UnOiBGYWxzZX0KKyAgICBpZiBpc2luc3RhbmNlKG5vZGVfb3Jfc3RyaW5nLCBiYXNlc3RyaW5nKToKKyAgICAgICAgbm9kZV9vcl9zdHJpbmcgPSBwYXJzZShub2RlX29yX3N0cmluZywgbW9kZT0nZXZhbCcpCisgICAgaWYgaXNpbnN0YW5jZShub2RlX29yX3N0cmluZywgRXhwcmVzc2lvbik6CisgICAgICAgIG5vZGVfb3Jfc3RyaW5nID0gbm9kZV9vcl9zdHJpbmcuYm9keQorICAgIGRlZiBfY29udmVydChub2RlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBTdHIpOgorICAgICAgICAgICAgcmV0dXJuIG5vZGUucworICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgTnVtKToKKyAgICAgICAgICAgIHJldHVybiBub2RlLm4KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIFR1cGxlKToKKyAgICAgICAgICAgIHJldHVybiB0dXBsZShtYXAoX2NvbnZlcnQsIG5vZGUuZWx0cykpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBMaXN0KToKKyAgICAgICAgICAgIHJldHVybiBsaXN0KG1hcChfY29udmVydCwgbm9kZS5lbHRzKSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIERpY3QpOgorICAgICAgICAgICAgcmV0dXJuIGRpY3QoKF9jb252ZXJ0KGspLCBfY29udmVydCh2KSkgZm9yIGssIHYKKyAgICAgICAgICAgICAgICAgICAgICAgIGluIHppcChub2RlLmtleXMsIG5vZGUudmFsdWVzKSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIE5hbWUpOgorICAgICAgICAgICAgaWYgbm9kZS5pZCBpbiBfc2FmZV9uYW1lczoKKyAgICAgICAgICAgICAgICByZXR1cm4gX3NhZmVfbmFtZXNbbm9kZS5pZF0KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIEJpbk9wKSBhbmQgXAorICAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZS5vcCwgKEFkZCwgU3ViKSkgYW5kIFwKKyAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUucmlnaHQsIE51bSkgYW5kIFwKKyAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUucmlnaHQubiwgY29tcGxleCkgYW5kIFwKKyAgICAgICAgICAgICBpc2luc3RhbmNlKG5vZGUubGVmdCwgTnVtKSBhbmQgXAorICAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZS5sZWZ0Lm4sIChpbnQsIGxvbmcsIGZsb2F0KSk6CisgICAgICAgICAgICBsZWZ0ID0gbm9kZS5sZWZ0Lm4KKyAgICAgICAgICAgIHJpZ2h0ID0gbm9kZS5yaWdodC5uCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUub3AsIEFkZCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQgKyByaWdodAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCAtIHJpZ2h0CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21hbGZvcm1lZCBzdHJpbmcnKQorICAgIHJldHVybiBfY29udmVydChub2RlX29yX3N0cmluZykKKworCitkZWYgZHVtcChub2RlLCBhbm5vdGF0ZV9maWVsZHM9VHJ1ZSwgaW5jbHVkZV9hdHRyaWJ1dGVzPUZhbHNlKToKKyAgICAiIiIKKyAgICBSZXR1cm4gYSBmb3JtYXR0ZWQgZHVtcCBvZiB0aGUgdHJlZSBpbiAqbm9kZSouICBUaGlzIGlzIG1haW5seSB1c2VmdWwgZm9yCisgICAgZGVidWdnaW5nIHB1cnBvc2VzLiAgVGhlIHJldHVybmVkIHN0cmluZyB3aWxsIHNob3cgdGhlIG5hbWVzIGFuZCB0aGUgdmFsdWVzCisgICAgZm9yIGZpZWxkcy4gIFRoaXMgbWFrZXMgdGhlIGNvZGUgaW1wb3NzaWJsZSB0byBldmFsdWF0ZSwgc28gaWYgZXZhbHVhdGlvbiBpcworICAgIHdhbnRlZCAqYW5ub3RhdGVfZmllbGRzKiBtdXN0IGJlIHNldCB0byBGYWxzZS4gIEF0dHJpYnV0ZXMgc3VjaCBhcyBsaW5lCisgICAgbnVtYmVycyBhbmQgY29sdW1uIG9mZnNldHMgYXJlIG5vdCBkdW1wZWQgYnkgZGVmYXVsdC4gIElmIHRoaXMgaXMgd2FudGVkLAorICAgICppbmNsdWRlX2F0dHJpYnV0ZXMqIGNhbiBiZSBzZXQgdG8gVHJ1ZS4KKyAgICAiIiIKKyAgICBkZWYgX2Zvcm1hdChub2RlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBBU1QpOgorICAgICAgICAgICAgZmllbGRzID0gWyhhLCBfZm9ybWF0KGIpKSBmb3IgYSwgYiBpbiBpdGVyX2ZpZWxkcyhub2RlKV0KKyAgICAgICAgICAgIHJ2ID0gJyVzKCVzJyAlIChub2RlLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKAorICAgICAgICAgICAgICAgICgnJXM9JXMnICUgZmllbGQgZm9yIGZpZWxkIGluIGZpZWxkcykKKyAgICAgICAgICAgICAgICBpZiBhbm5vdGF0ZV9maWVsZHMgZWxzZQorICAgICAgICAgICAgICAgIChiIGZvciBhLCBiIGluIGZpZWxkcykKKyAgICAgICAgICAgICkpCisgICAgICAgICAgICBpZiBpbmNsdWRlX2F0dHJpYnV0ZXMgYW5kIG5vZGUuX2F0dHJpYnV0ZXM6CisgICAgICAgICAgICAgICAgcnYgKz0gZmllbGRzIGFuZCAnLCAnIG9yICcgJworICAgICAgICAgICAgICAgIHJ2ICs9ICcsICcuam9pbignJXM9JXMnICUgKGEsIF9mb3JtYXQoZ2V0YXR0cihub2RlLCBhKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhIGluIG5vZGUuX2F0dHJpYnV0ZXMpCisgICAgICAgICAgICByZXR1cm4gcnYgKyAnKScKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIGxpc3QpOgorICAgICAgICAgICAgcmV0dXJuICdbJXNdJyAlICcsICcuam9pbihfZm9ybWF0KHgpIGZvciB4IGluIG5vZGUpCisgICAgICAgIHJldHVybiByZXByKG5vZGUpCisgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZSwgQVNUKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHBlY3RlZCBBU1QsIGdvdCAlcicgJSBub2RlLl9fY2xhc3NfXy5fX25hbWVfXykKKyAgICByZXR1cm4gX2Zvcm1hdChub2RlKQorCisKK2RlZiBjb3B5X2xvY2F0aW9uKG5ld19ub2RlLCBvbGRfbm9kZSk6CisgICAgIiIiCisgICAgQ29weSBzb3VyY2UgbG9jYXRpb24gKGBsaW5lbm9gIGFuZCBgY29sX29mZnNldGAgYXR0cmlidXRlcykgZnJvbQorICAgICpvbGRfbm9kZSogdG8gKm5ld19ub2RlKiBpZiBwb3NzaWJsZSwgYW5kIHJldHVybiAqbmV3X25vZGUqLgorICAgICIiIgorICAgIGZvciBhdHRyIGluICdsaW5lbm8nLCAnY29sX29mZnNldCc6CisgICAgICAgIGlmIGF0dHIgaW4gb2xkX25vZGUuX2F0dHJpYnV0ZXMgYW5kIGF0dHIgaW4gbmV3X25vZGUuX2F0dHJpYnV0ZXMgXAorICAgICAgICAgICBhbmQgaGFzYXR0cihvbGRfbm9kZSwgYXR0cik6CisgICAgICAgICAgICBzZXRhdHRyKG5ld19ub2RlLCBhdHRyLCBnZXRhdHRyKG9sZF9ub2RlLCBhdHRyKSkKKyAgICByZXR1cm4gbmV3X25vZGUKKworCitkZWYgZml4X21pc3NpbmdfbG9jYXRpb25zKG5vZGUpOgorICAgICIiIgorICAgIFdoZW4geW91IGNvbXBpbGUgYSBub2RlIHRyZWUgd2l0aCBjb21waWxlKCksIHRoZSBjb21waWxlciBleHBlY3RzIGxpbmVubyBhbmQKKyAgICBjb2xfb2Zmc2V0IGF0dHJpYnV0ZXMgZm9yIGV2ZXJ5IG5vZGUgdGhhdCBzdXBwb3J0cyB0aGVtLiAgVGhpcyBpcyByYXRoZXIKKyAgICB0ZWRpb3VzIHRvIGZpbGwgaW4gZm9yIGdlbmVyYXRlZCBub2Rlcywgc28gdGhpcyBoZWxwZXIgYWRkcyB0aGVzZSBhdHRyaWJ1dGVzCisgICAgcmVjdXJzaXZlbHkgd2hlcmUgbm90IGFscmVhZHkgc2V0LCBieSBzZXR0aW5nIHRoZW0gdG8gdGhlIHZhbHVlcyBvZiB0aGUKKyAgICBwYXJlbnQgbm9kZS4gIEl0IHdvcmtzIHJlY3Vyc2l2ZWx5IHN0YXJ0aW5nIGF0ICpub2RlKi4KKyAgICAiIiIKKyAgICBkZWYgX2ZpeChub2RlLCBsaW5lbm8sIGNvbF9vZmZzZXQpOgorICAgICAgICBpZiAnbGluZW5vJyBpbiBub2RlLl9hdHRyaWJ1dGVzOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIobm9kZSwgJ2xpbmVubycpOgorICAgICAgICAgICAgICAgIG5vZGUubGluZW5vID0gbGluZW5vCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpbmVubyA9IG5vZGUubGluZW5vCisgICAgICAgIGlmICdjb2xfb2Zmc2V0JyBpbiBub2RlLl9hdHRyaWJ1dGVzOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIobm9kZSwgJ2NvbF9vZmZzZXQnKToKKyAgICAgICAgICAgICAgICBub2RlLmNvbF9vZmZzZXQgPSBjb2xfb2Zmc2V0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQgPSBub2RlLmNvbF9vZmZzZXQKKyAgICAgICAgZm9yIGNoaWxkIGluIGl0ZXJfY2hpbGRfbm9kZXMobm9kZSk6CisgICAgICAgICAgICBfZml4KGNoaWxkLCBsaW5lbm8sIGNvbF9vZmZzZXQpCisgICAgX2ZpeChub2RlLCAxLCAwKQorICAgIHJldHVybiBub2RlCisKKworZGVmIGluY3JlbWVudF9saW5lbm8obm9kZSwgbj0xKToKKyAgICAiIiIKKyAgICBJbmNyZW1lbnQgdGhlIGxpbmUgbnVtYmVyIG9mIGVhY2ggbm9kZSBpbiB0aGUgdHJlZSBzdGFydGluZyBhdCAqbm9kZSogYnkgKm4qLgorICAgIFRoaXMgaXMgdXNlZnVsIHRvICJtb3ZlIGNvZGUiIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uIGluIGEgZmlsZS4KKyAgICAiIiIKKyAgICBmb3IgY2hpbGQgaW4gd2Fsayhub2RlKToKKyAgICAgICAgaWYgJ2xpbmVubycgaW4gY2hpbGQuX2F0dHJpYnV0ZXM6CisgICAgICAgICAgICBjaGlsZC5saW5lbm8gPSBnZXRhdHRyKGNoaWxkLCAnbGluZW5vJywgMCkgKyBuCisgICAgcmV0dXJuIG5vZGUKKworCitkZWYgaXRlcl9maWVsZHMobm9kZSk6CisgICAgIiIiCisgICAgWWllbGQgYSB0dXBsZSBvZiBgYChmaWVsZG5hbWUsIHZhbHVlKWBgIGZvciBlYWNoIGZpZWxkIGluIGBgbm9kZS5fZmllbGRzYGAKKyAgICB0aGF0IGlzIHByZXNlbnQgb24gKm5vZGUqLgorICAgICIiIgorICAgIGZvciBmaWVsZCBpbiBub2RlLl9maWVsZHM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkIGZpZWxkLCBnZXRhdHRyKG5vZGUsIGZpZWxkKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKworZGVmIGl0ZXJfY2hpbGRfbm9kZXMobm9kZSk6CisgICAgIiIiCisgICAgWWllbGQgYWxsIGRpcmVjdCBjaGlsZCBub2RlcyBvZiAqbm9kZSosIHRoYXQgaXMsIGFsbCBmaWVsZHMgdGhhdCBhcmUgbm9kZXMKKyAgICBhbmQgYWxsIGl0ZW1zIG9mIGZpZWxkcyB0aGF0IGFyZSBsaXN0cyBvZiBub2Rlcy4KKyAgICAiIiIKKyAgICBmb3IgbmFtZSwgZmllbGQgaW4gaXRlcl9maWVsZHMobm9kZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoZmllbGQsIEFTVCk6CisgICAgICAgICAgICB5aWVsZCBmaWVsZAorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZmllbGQsIGxpc3QpOgorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZmllbGQ6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBBU1QpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBpdGVtCisKKworZGVmIGdldF9kb2NzdHJpbmcobm9kZSwgY2xlYW49VHJ1ZSk6CisgICAgIiIiCisgICAgUmV0dXJuIHRoZSBkb2NzdHJpbmcgZm9yIHRoZSBnaXZlbiBub2RlIG9yIE5vbmUgaWYgbm8gZG9jc3RyaW5nIGNhbgorICAgIGJlIGZvdW5kLiAgSWYgdGhlIG5vZGUgcHJvdmlkZWQgZG9lcyBub3QgaGF2ZSBkb2NzdHJpbmdzIGEgVHlwZUVycm9yCisgICAgd2lsbCBiZSByYWlzZWQuCisgICAgIiIiCisgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZSwgKEZ1bmN0aW9uRGVmLCBDbGFzc0RlZiwgTW9kdWxlKSk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXIgY2FuJ3QgaGF2ZSBkb2NzdHJpbmdzIiAlIG5vZGUuX19jbGFzc19fLl9fbmFtZV9fKQorICAgIGlmIG5vZGUuYm9keSBhbmQgaXNpbnN0YW5jZShub2RlLmJvZHlbMF0sIEV4cHIpIGFuZCBcCisgICAgICAgaXNpbnN0YW5jZShub2RlLmJvZHlbMF0udmFsdWUsIFN0cik6CisgICAgICAgIGlmIGNsZWFuOgorICAgICAgICAgICAgaW1wb3J0IGluc3BlY3QKKyAgICAgICAgICAgIHJldHVybiBpbnNwZWN0LmNsZWFuZG9jKG5vZGUuYm9keVswXS52YWx1ZS5zKQorICAgICAgICByZXR1cm4gbm9kZS5ib2R5WzBdLnZhbHVlLnMKKworCitkZWYgd2Fsayhub2RlKToKKyAgICAiIiIKKyAgICBSZWN1cnNpdmVseSB5aWVsZCBhbGwgZGVzY2VuZGFudCBub2RlcyBpbiB0aGUgdHJlZSBzdGFydGluZyBhdCAqbm9kZSoKKyAgICAoaW5jbHVkaW5nICpub2RlKiBpdHNlbGYpLCBpbiBubyBzcGVjaWZpZWQgb3JkZXIuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UKKyAgICBvbmx5IHdhbnQgdG8gbW9kaWZ5IG5vZGVzIGluIHBsYWNlIGFuZCBkb24ndCBjYXJlIGFib3V0IHRoZSBjb250ZXh0LgorICAgICIiIgorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCisgICAgdG9kbyA9IGRlcXVlKFtub2RlXSkKKyAgICB3aGlsZSB0b2RvOgorICAgICAgICBub2RlID0gdG9kby5wb3BsZWZ0KCkKKyAgICAgICAgdG9kby5leHRlbmQoaXRlcl9jaGlsZF9ub2Rlcyhub2RlKSkKKyAgICAgICAgeWllbGQgbm9kZQorCisKK2NsYXNzIE5vZGVWaXNpdG9yKG9iamVjdCk6CisgICAgIiIiCisgICAgQSBub2RlIHZpc2l0b3IgYmFzZSBjbGFzcyB0aGF0IHdhbGtzIHRoZSBhYnN0cmFjdCBzeW50YXggdHJlZSBhbmQgY2FsbHMgYQorICAgIHZpc2l0b3IgZnVuY3Rpb24gZm9yIGV2ZXJ5IG5vZGUgZm91bmQuICBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gYSB2YWx1ZQorICAgIHdoaWNoIGlzIGZvcndhcmRlZCBieSB0aGUgYHZpc2l0YCBtZXRob2QuCisKKyAgICBUaGlzIGNsYXNzIGlzIG1lYW50IHRvIGJlIHN1YmNsYXNzZWQsIHdpdGggdGhlIHN1YmNsYXNzIGFkZGluZyB2aXNpdG9yCisgICAgbWV0aG9kcy4KKworICAgIFBlciBkZWZhdWx0IHRoZSB2aXNpdG9yIGZ1bmN0aW9ucyBmb3IgdGhlIG5vZGVzIGFyZSBgYCd2aXNpdF8nYGAgKworICAgIGNsYXNzIG5hbWUgb2YgdGhlIG5vZGUuICBTbyBhIGBUcnlGaW5hbGx5YCBub2RlIHZpc2l0IGZ1bmN0aW9uIHdvdWxkCisgICAgYmUgYHZpc2l0X1RyeUZpbmFsbHlgLiAgVGhpcyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZCBieSBvdmVycmlkaW5nCisgICAgdGhlIGB2aXNpdGAgbWV0aG9kLiAgSWYgbm8gdmlzaXRvciBmdW5jdGlvbiBleGlzdHMgZm9yIGEgbm9kZQorICAgIChyZXR1cm4gdmFsdWUgYE5vbmVgKSB0aGUgYGdlbmVyaWNfdmlzaXRgIHZpc2l0b3IgaXMgdXNlZCBpbnN0ZWFkLgorCisgICAgRG9uJ3QgdXNlIHRoZSBgTm9kZVZpc2l0b3JgIGlmIHlvdSB3YW50IHRvIGFwcGx5IGNoYW5nZXMgdG8gbm9kZXMgZHVyaW5nCisgICAgdHJhdmVyc2luZy4gIEZvciB0aGlzIGEgc3BlY2lhbCB2aXNpdG9yIGV4aXN0cyAoYE5vZGVUcmFuc2Zvcm1lcmApIHRoYXQKKyAgICBhbGxvd3MgbW9kaWZpY2F0aW9ucy4KKyAgICAiIiIKKworICAgIGRlZiB2aXNpdChzZWxmLCBub2RlKToKKyAgICAgICAgIiIiVmlzaXQgYSBub2RlLiIiIgorICAgICAgICBtZXRob2QgPSAndmlzaXRfJyArIG5vZGUuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgIHZpc2l0b3IgPSBnZXRhdHRyKHNlbGYsIG1ldGhvZCwgc2VsZi5nZW5lcmljX3Zpc2l0KQorICAgICAgICByZXR1cm4gdmlzaXRvcihub2RlKQorCisgICAgZGVmIGdlbmVyaWNfdmlzaXQoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkNhbGxlZCBpZiBubyBleHBsaWNpdCB2aXNpdG9yIGZ1bmN0aW9uIGV4aXN0cyBmb3IgYSBub2RlLiIiIgorICAgICAgICBmb3IgZmllbGQsIHZhbHVlIGluIGl0ZXJfZmllbGRzKG5vZGUpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CisgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmlzaXQoaXRlbSkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgQVNUKToKKyAgICAgICAgICAgICAgICBzZWxmLnZpc2l0KHZhbHVlKQorCisKK2NsYXNzIE5vZGVUcmFuc2Zvcm1lcihOb2RlVmlzaXRvcik6CisgICAgIiIiCisgICAgQSA6Y2xhc3M6YE5vZGVWaXNpdG9yYCBzdWJjbGFzcyB0aGF0IHdhbGtzIHRoZSBhYnN0cmFjdCBzeW50YXggdHJlZSBhbmQKKyAgICBhbGxvd3MgbW9kaWZpY2F0aW9uIG9mIG5vZGVzLgorCisgICAgVGhlIGBOb2RlVHJhbnNmb3JtZXJgIHdpbGwgd2FsayB0aGUgQVNUIGFuZCB1c2UgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUKKyAgICB2aXNpdG9yIG1ldGhvZHMgdG8gcmVwbGFjZSBvciByZW1vdmUgdGhlIG9sZCBub2RlLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBvZgorICAgIHRoZSB2aXNpdG9yIG1ldGhvZCBpcyBgYE5vbmVgYCwgdGhlIG5vZGUgd2lsbCBiZSByZW1vdmVkIGZyb20gaXRzIGxvY2F0aW9uLAorICAgIG90aGVyd2lzZSBpdCBpcyByZXBsYWNlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUuICBUaGUgcmV0dXJuIHZhbHVlIG1heSBiZSB0aGUKKyAgICBvcmlnaW5hbCBub2RlIGluIHdoaWNoIGNhc2Ugbm8gcmVwbGFjZW1lbnQgdGFrZXMgcGxhY2UuCisKKyAgICBIZXJlIGlzIGFuIGV4YW1wbGUgdHJhbnNmb3JtZXIgdGhhdCByZXdyaXRlcyBhbGwgb2NjdXJyZW5jZXMgb2YgbmFtZSBsb29rdXBzCisgICAgKGBgZm9vYGApIHRvIGBgZGF0YVsnZm9vJ11gYDo6CisKKyAgICAgICBjbGFzcyBSZXdyaXRlTmFtZShOb2RlVHJhbnNmb3JtZXIpOgorCisgICAgICAgICAgIGRlZiB2aXNpdF9OYW1lKHNlbGYsIG5vZGUpOgorICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlfbG9jYXRpb24oU3Vic2NyaXB0KAorICAgICAgICAgICAgICAgICAgIHZhbHVlPU5hbWUoaWQ9J2RhdGEnLCBjdHg9TG9hZCgpKSwKKyAgICAgICAgICAgICAgICAgICBzbGljZT1JbmRleCh2YWx1ZT1TdHIocz1ub2RlLmlkKSksCisgICAgICAgICAgICAgICAgICAgY3R4PW5vZGUuY3R4CisgICAgICAgICAgICAgICApLCBub2RlKQorCisgICAgS2VlcCBpbiBtaW5kIHRoYXQgaWYgdGhlIG5vZGUgeW91J3JlIG9wZXJhdGluZyBvbiBoYXMgY2hpbGQgbm9kZXMgeW91IG11c3QKKyAgICBlaXRoZXIgdHJhbnNmb3JtIHRoZSBjaGlsZCBub2RlcyB5b3Vyc2VsZiBvciBjYWxsIHRoZSA6bWV0aDpgZ2VuZXJpY192aXNpdGAKKyAgICBtZXRob2QgZm9yIHRoZSBub2RlIGZpcnN0LgorCisgICAgRm9yIG5vZGVzIHRoYXQgd2VyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbiBvZiBzdGF0ZW1lbnRzICh0aGF0IGFwcGxpZXMgdG8gYWxsCisgICAgc3RhdGVtZW50IG5vZGVzKSwgdGhlIHZpc2l0b3IgbWF5IGFsc28gcmV0dXJuIGEgbGlzdCBvZiBub2RlcyByYXRoZXIgdGhhbgorICAgIGp1c3QgYSBzaW5nbGUgbm9kZS4KKworICAgIFVzdWFsbHkgeW91IHVzZSB0aGUgdHJhbnNmb3JtZXIgbGlrZSB0aGlzOjoKKworICAgICAgIG5vZGUgPSBZb3VyVHJhbnNmb3JtZXIoKS52aXNpdChub2RlKQorICAgICIiIgorCisgICAgZGVmIGdlbmVyaWNfdmlzaXQoc2VsZiwgbm9kZSk6CisgICAgICAgIGZvciBmaWVsZCwgb2xkX3ZhbHVlIGluIGl0ZXJfZmllbGRzKG5vZGUpOgorICAgICAgICAgICAgb2xkX3ZhbHVlID0gZ2V0YXR0cihub2RlLCBmaWVsZCwgTm9uZSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2xkX3ZhbHVlLCBsaXN0KToKKyAgICAgICAgICAgICAgICBuZXdfdmFsdWVzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gb2xkX3ZhbHVlOgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBBU1QpOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLnZpc2l0KHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQVNUKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVzLmV4dGVuZCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBuZXdfdmFsdWVzLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBvbGRfdmFsdWVbOl0gPSBuZXdfdmFsdWVzCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2xkX3ZhbHVlLCBBU1QpOgorICAgICAgICAgICAgICAgIG5ld19ub2RlID0gc2VsZi52aXNpdChvbGRfdmFsdWUpCisgICAgICAgICAgICAgICAgaWYgbmV3X25vZGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZGVsYXR0cihub2RlLCBmaWVsZCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKG5vZGUsIGZpZWxkLCBuZXdfbm9kZSkKKyAgICAgICAgcmV0dXJuIG5vZGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYXN0LnB5YyBiL2xpYi9weXRob24yLjcvYXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjk4YTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYXN0LnB5byBiL2xpYi9weXRob24yLjcvYXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Zjk4YTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYXN5bmNoYXQucHkgYi9saWIvcHl0aG9uMi43L2FzeW5jaGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTgzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FzeW5jaGF0LnB5CkBAIC0wLDAgKzEsMzE0IEBACisjIC0qLSBNb2RlOiBQeXRob247IHRhYi13aWR0aDogNCAtKi0KKyMgICAgICAgSWQ6IGFzeW5jaGF0LnB5LHYgMi4yNiAyMDAwLzA5LzA3IDIyOjI5OjI2IHJ1c2hpbmcgRXhwCisjICAgICAgIEF1dGhvcjogU2FtIFJ1c2hpbmcgPHJ1c2hpbmdAbmlnaHRtYXJlLmNvbT4KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIENvcHlyaWdodCAxOTk2IGJ5IFNhbSBSdXNoaW5nCisjCisjICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKKyMgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkKKyMgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsCisjIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uCisjIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTYW0KKyMgUnVzaGluZyBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bworIyBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IKKyMgcGVybWlzc2lvbi4KKyMKKyMgU0FNIFJVU0hJTkcgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisjIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4KKyMgTk8gRVZFTlQgU0hBTEwgU0FNIFJVU0hJTkcgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUworIyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisjIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorIyBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3IiIiJBIGNsYXNzIHN1cHBvcnRpbmcgY2hhdC1zdHlsZSAoY29tbWFuZC9yZXNwb25zZSkgcHJvdG9jb2xzLgorCitUaGlzIGNsYXNzIGFkZHMgc3VwcG9ydCBmb3IgJ2NoYXQnIHN0eWxlIHByb3RvY29scyAtIHdoZXJlIG9uZSBzaWRlCitzZW5kcyBhICdjb21tYW5kJywgYW5kIHRoZSBvdGhlciBzZW5kcyBhIHJlc3BvbnNlIChleGFtcGxlcyB3b3VsZCBiZQordGhlIGNvbW1vbiBpbnRlcm5ldCBwcm90b2NvbHMgLSBzbXRwLCBubnRwLCBmdHAsIGV0Yy4uKS4KKworVGhlIGhhbmRsZV9yZWFkKCkgbWV0aG9kIGxvb2tzIGF0IHRoZSBpbnB1dCBzdHJlYW0gZm9yIHRoZSBjdXJyZW50CisndGVybWluYXRvcicgKHVzdWFsbHkgJ1xyXG4nIGZvciBzaW5nbGUtbGluZSByZXNwb25zZXMsICdcclxuLlxyXG4nCitmb3IgbXVsdGktbGluZSBvdXRwdXQpLCBjYWxsaW5nIHNlbGYuZm91bmRfdGVybWluYXRvcigpIG9uIGl0cworcmVjZWlwdC4KKworZm9yIGV4YW1wbGU6CitTYXkgeW91IGJ1aWxkIGFuIGFzeW5jIG5udHAgY2xpZW50IHVzaW5nIHRoaXMgY2xhc3MuICBBdCB0aGUgc3RhcnQKK29mIHRoZSBjb25uZWN0aW9uLCB5b3UnbGwgaGF2ZSBzZWxmLnRlcm1pbmF0b3Igc2V0IHRvICdcclxuJywgaW4KK29yZGVyIHRvIHByb2Nlc3MgdGhlIHNpbmdsZS1saW5lIGdyZWV0aW5nLiAgSnVzdCBiZWZvcmUgaXNzdWluZyBhCisnTElTVCcgY29tbWFuZCB5b3UnbGwgc2V0IGl0IHRvICdcclxuLlxyXG4nLiAgVGhlIG91dHB1dCBvZiB0aGUgTElTVAorY29tbWFuZCB3aWxsIGJlIGFjY3VtdWxhdGVkICh1c2luZyB5b3VyIG93biAnY29sbGVjdF9pbmNvbWluZ19kYXRhJworbWV0aG9kKSB1cCB0byB0aGUgdGVybWluYXRvciwgYW5kIHRoZW4gY29udHJvbCB3aWxsIGJlIHJldHVybmVkIHRvCit5b3UgLSBieSBjYWxsaW5nIHlvdXIgc2VsZi5mb3VuZF90ZXJtaW5hdG9yKCkgbWV0aG9kLgorIiIiCisKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBhc3luY29yZQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2Zyb20gc3lzIGltcG9ydCBweTNrd2FybmluZworZnJvbSB3YXJuaW5ncyBpbXBvcnQgZmlsdGVyd2FybmluZ3MsIGNhdGNoX3dhcm5pbmdzCisKK2NsYXNzIGFzeW5jX2NoYXQgKGFzeW5jb3JlLmRpc3BhdGNoZXIpOgorICAgICIiIlRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MuICBZb3UgbXVzdCBkZXJpdmUgZnJvbSB0aGlzIGNsYXNzLCBhbmQgYWRkCisgICAgdGhlIHR3byBtZXRob2RzIGNvbGxlY3RfaW5jb21pbmdfZGF0YSgpIGFuZCBmb3VuZF90ZXJtaW5hdG9yKCkiIiIKKworICAgICMgdGhlc2UgYXJlIG92ZXJyaWRhYmxlIGRlZmF1bHRzCisKKyAgICBhY19pbl9idWZmZXJfc2l6ZSAgICAgICA9IDQwOTYKKyAgICBhY19vdXRfYnVmZmVyX3NpemUgICAgICA9IDQwOTYKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgc29jaz1Ob25lLCBtYXA9Tm9uZSk6CisgICAgICAgICMgZm9yIHN0cmluZyB0ZXJtaW5hdG9yIG1hdGNoaW5nCisgICAgICAgIHNlbGYuYWNfaW5fYnVmZmVyID0gJycKKworICAgICAgICAjIHdlIHVzZSBhIGxpc3QgaGVyZSByYXRoZXIgdGhhbiBjU3RyaW5nSU8gZm9yIGEgZmV3IHJlYXNvbnMuLi4KKyAgICAgICAgIyBkZWwgbHN0WzpdIGlzIGZhc3RlciB0aGFuIHNpby50cnVuY2F0ZSgwKQorICAgICAgICAjIGxzdCA9IFtdIGlzIGZhc3RlciB0aGFuIHNpby50cnVuY2F0ZSgwKQorICAgICAgICAjIGNTdHJpbmdJTyB3aWxsIGJlIGdhaW5pbmcgdW5pY29kZSBzdXBwb3J0IGluIHB5M2ssIHdoaWNoCisgICAgICAgICMgd2lsbCBuZWdhdGl2ZWx5IGFmZmVjdCB0aGUgcGVyZm9ybWFuY2Ugb2YgYnl0ZXMgY29tcGFyZWQgdG8KKyAgICAgICAgIyBhICcnLmpvaW4oKSBlcXVpdmFsZW50CisgICAgICAgIHNlbGYuaW5jb21pbmcgPSBbXQorCisgICAgICAgICMgd2UgdG9zcyB0aGUgdXNlIG9mIHRoZSAic2ltcGxlIHByb2R1Y2VyIiBhbmQgcmVwbGFjZSBpdCB3aXRoCisgICAgICAgICMgYSBwdXJlIGRlcXVlLCB3aGljaCB0aGUgb3JpZ2luYWwgZmlmbyB3YXMgYSB3cmFwcGluZyBvZgorICAgICAgICBzZWxmLnByb2R1Y2VyX2ZpZm8gPSBkZXF1ZSgpCisgICAgICAgIGFzeW5jb3JlLmRpc3BhdGNoZXIuX19pbml0X18gKHNlbGYsIHNvY2ssIG1hcCkKKworICAgIGRlZiBjb2xsZWN0X2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIm11c3QgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MiKQorCisgICAgZGVmIF9jb2xsZWN0X2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuaW5jb21pbmcuYXBwZW5kKGRhdGEpCisKKyAgICBkZWYgX2dldF9kYXRhKHNlbGYpOgorICAgICAgICBkID0gJycuam9pbihzZWxmLmluY29taW5nKQorICAgICAgICBkZWwgc2VsZi5pbmNvbWluZ1s6XQorICAgICAgICByZXR1cm4gZAorCisgICAgZGVmIGZvdW5kX3Rlcm1pbmF0b3Ioc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIm11c3QgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MiKQorCisgICAgZGVmIHNldF90ZXJtaW5hdG9yIChzZWxmLCB0ZXJtKToKKyAgICAgICAgIlNldCB0aGUgaW5wdXQgZGVsaW1pdGVyLiAgQ2FuIGJlIGEgZml4ZWQgc3RyaW5nIG9mIGFueSBsZW5ndGgsIGFuIGludGVnZXIsIG9yIE5vbmUiCisgICAgICAgIHNlbGYudGVybWluYXRvciA9IHRlcm0KKworICAgIGRlZiBnZXRfdGVybWluYXRvciAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRlcm1pbmF0b3IKKworICAgICMgZ3JhYiBzb21lIG1vcmUgZGF0YSBmcm9tIHRoZSBzb2NrZXQsCisgICAgIyB0aHJvdyBpdCB0byB0aGUgY29sbGVjdG9yIG1ldGhvZCwKKyAgICAjIGNoZWNrIGZvciB0aGUgdGVybWluYXRvciwKKyAgICAjIGlmIGZvdW5kLCB0cmFuc2l0aW9uIHRvIHRoZSBuZXh0IHN0YXRlLgorCisgICAgZGVmIGhhbmRsZV9yZWFkIChzZWxmKToKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5yZWN2IChzZWxmLmFjX2luX2J1ZmZlcl9zaXplKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCB3aHk6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9lcnJvcigpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLmFjX2luX2J1ZmZlciA9IHNlbGYuYWNfaW5fYnVmZmVyICsgZGF0YQorCisgICAgICAgICMgQ29udGludWUgdG8gc2VhcmNoIGZvciBzZWxmLnRlcm1pbmF0b3IgaW4gc2VsZi5hY19pbl9idWZmZXIsCisgICAgICAgICMgd2hpbGUgY2FsbGluZyBzZWxmLmNvbGxlY3RfaW5jb21pbmdfZGF0YS4gIFRoZSB3aGlsZSBsb29wCisgICAgICAgICMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgbWlnaHQgcmVhZCBzZXZlcmFsIGRhdGErdGVybWluYXRvcgorICAgICAgICAjIGNvbWJvcyB3aXRoIGEgc2luZ2xlIHJlY3YoNDA5NikuCisKKyAgICAgICAgd2hpbGUgc2VsZi5hY19pbl9idWZmZXI6CisgICAgICAgICAgICBsYiA9IGxlbihzZWxmLmFjX2luX2J1ZmZlcikKKyAgICAgICAgICAgIHRlcm1pbmF0b3IgPSBzZWxmLmdldF90ZXJtaW5hdG9yKCkKKyAgICAgICAgICAgIGlmIG5vdCB0ZXJtaW5hdG9yOgorICAgICAgICAgICAgICAgICMgbm8gdGVybWluYXRvciwgY29sbGVjdCBpdCBhbGwKKyAgICAgICAgICAgICAgICBzZWxmLmNvbGxlY3RfaW5jb21pbmdfZGF0YSAoc2VsZi5hY19pbl9idWZmZXIpCisgICAgICAgICAgICAgICAgc2VsZi5hY19pbl9idWZmZXIgPSAnJworICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRlcm1pbmF0b3IsIGludCkgb3IgaXNpbnN0YW5jZSh0ZXJtaW5hdG9yLCBsb25nKToKKyAgICAgICAgICAgICAgICAjIG51bWVyaWMgdGVybWluYXRvcgorICAgICAgICAgICAgICAgIG4gPSB0ZXJtaW5hdG9yCisgICAgICAgICAgICAgICAgaWYgbGIgPCBuOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbGxlY3RfaW5jb21pbmdfZGF0YSAoc2VsZi5hY19pbl9idWZmZXIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWNfaW5fYnVmZmVyID0gJycKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXJtaW5hdG9yID0gc2VsZi50ZXJtaW5hdG9yIC0gbGIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbGxlY3RfaW5jb21pbmdfZGF0YSAoc2VsZi5hY19pbl9idWZmZXJbOm5dKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFjX2luX2J1ZmZlciA9IHNlbGYuYWNfaW5fYnVmZmVyW246XQorICAgICAgICAgICAgICAgICAgICBzZWxmLnRlcm1pbmF0b3IgPSAwCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZm91bmRfdGVybWluYXRvcigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgMyBjYXNlczoKKyAgICAgICAgICAgICAgICAjIDEpIGVuZCBvZiBidWZmZXIgbWF0Y2hlcyB0ZXJtaW5hdG9yIGV4YWN0bHk6CisgICAgICAgICAgICAgICAgIyAgICBjb2xsZWN0IGRhdGEsIHRyYW5zaXRpb24KKyAgICAgICAgICAgICAgICAjIDIpIGVuZCBvZiBidWZmZXIgbWF0Y2hlcyBzb21lIHByZWZpeDoKKyAgICAgICAgICAgICAgICAjICAgIGNvbGxlY3QgZGF0YSB0byB0aGUgcHJlZml4CisgICAgICAgICAgICAgICAgIyAzKSBlbmQgb2YgYnVmZmVyIGRvZXMgbm90IG1hdGNoIGFueSBwcmVmaXg6CisgICAgICAgICAgICAgICAgIyAgICBjb2xsZWN0IGRhdGEKKyAgICAgICAgICAgICAgICB0ZXJtaW5hdG9yX2xlbiA9IGxlbih0ZXJtaW5hdG9yKQorICAgICAgICAgICAgICAgIGluZGV4ID0gc2VsZi5hY19pbl9idWZmZXIuZmluZCh0ZXJtaW5hdG9yKQorICAgICAgICAgICAgICAgIGlmIGluZGV4ICE9IC0xOgorICAgICAgICAgICAgICAgICAgICAjIHdlIGZvdW5kIHRoZSB0ZXJtaW5hdG9yCisgICAgICAgICAgICAgICAgICAgIGlmIGluZGV4ID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgYm90aGVyIHJlcG9ydGluZyB0aGUgZW1wdHkgc3RyaW5nIChzb3VyY2Ugb2Ygc3VidGxlIGJ1Z3MpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbGxlY3RfaW5jb21pbmdfZGF0YSAoc2VsZi5hY19pbl9idWZmZXJbOmluZGV4XSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY19pbl9idWZmZXIgPSBzZWxmLmFjX2luX2J1ZmZlcltpbmRleCt0ZXJtaW5hdG9yX2xlbjpdCisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBkb2VzIHRoZSBSaWdodCBUaGluZyBpZiB0aGUgdGVybWluYXRvciBpcyBjaGFuZ2VkIGhlcmUuCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZm91bmRfdGVybWluYXRvcigpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgYSBwcmVmaXggb2YgdGhlIHRlcm1pbmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBmaW5kX3ByZWZpeF9hdF9lbmQgKHNlbGYuYWNfaW5fYnVmZmVyLCB0ZXJtaW5hdG9yKQorICAgICAgICAgICAgICAgICAgICBpZiBpbmRleDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluZGV4ICE9IGxiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2UgZm91bmQgYSBwcmVmaXgsIGNvbGxlY3QgdXAgdG8gdGhlIHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sbGVjdF9pbmNvbWluZ19kYXRhIChzZWxmLmFjX2luX2J1ZmZlcls6LWluZGV4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFjX2luX2J1ZmZlciA9IHNlbGYuYWNfaW5fYnVmZmVyWy1pbmRleDpdCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBwcmVmaXgsIGNvbGxlY3QgaXQgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbGxlY3RfaW5jb21pbmdfZGF0YSAoc2VsZi5hY19pbl9idWZmZXIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFjX2luX2J1ZmZlciA9ICcnCisKKyAgICBkZWYgaGFuZGxlX3dyaXRlIChzZWxmKToKKyAgICAgICAgc2VsZi5pbml0aWF0ZV9zZW5kKCkKKworICAgIGRlZiBoYW5kbGVfY2xvc2UgKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBwdXNoIChzZWxmLCBkYXRhKToKKyAgICAgICAgc2FicyA9IHNlbGYuYWNfb3V0X2J1ZmZlcl9zaXplCisgICAgICAgIGlmIGxlbihkYXRhKSA+IHNhYnM6CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKGRhdGEpLCBzYWJzKToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2R1Y2VyX2ZpZm8uYXBwZW5kKGRhdGFbaTppK3NhYnNdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wcm9kdWNlcl9maWZvLmFwcGVuZChkYXRhKQorICAgICAgICBzZWxmLmluaXRpYXRlX3NlbmQoKQorCisgICAgZGVmIHB1c2hfd2l0aF9wcm9kdWNlciAoc2VsZiwgcHJvZHVjZXIpOgorICAgICAgICBzZWxmLnByb2R1Y2VyX2ZpZm8uYXBwZW5kKHByb2R1Y2VyKQorICAgICAgICBzZWxmLmluaXRpYXRlX3NlbmQoKQorCisgICAgZGVmIHJlYWRhYmxlIChzZWxmKToKKyAgICAgICAgInByZWRpY2F0ZSBmb3IgaW5jbHVzaW9uIGluIHRoZSByZWFkYWJsZSBmb3Igc2VsZWN0KCkiCisgICAgICAgICMgY2Fubm90IHVzZSB0aGUgb2xkIHByZWRpY2F0ZSwgaXQgdmlvbGF0ZXMgdGhlIGNsYWltIG9mIHRoZQorICAgICAgICAjIHNldF90ZXJtaW5hdG9yIG1ldGhvZC4KKworICAgICAgICAjIHJldHVybiAobGVuKHNlbGYuYWNfaW5fYnVmZmVyKSA8PSBzZWxmLmFjX2luX2J1ZmZlcl9zaXplKQorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIHdyaXRhYmxlIChzZWxmKToKKyAgICAgICAgInByZWRpY2F0ZSBmb3IgaW5jbHVzaW9uIGluIHRoZSB3cml0YWJsZSBmb3Igc2VsZWN0KCkiCisgICAgICAgIHJldHVybiBzZWxmLnByb2R1Y2VyX2ZpZm8gb3IgKG5vdCBzZWxmLmNvbm5lY3RlZCkKKworICAgIGRlZiBjbG9zZV93aGVuX2RvbmUgKHNlbGYpOgorICAgICAgICAiYXV0b21hdGljYWxseSBjbG9zZSB0aGlzIGNoYW5uZWwgb25jZSB0aGUgb3V0Z29pbmcgcXVldWUgaXMgZW1wdHkiCisgICAgICAgIHNlbGYucHJvZHVjZXJfZmlmby5hcHBlbmQoTm9uZSkKKworICAgIGRlZiBpbml0aWF0ZV9zZW5kKHNlbGYpOgorICAgICAgICB3aGlsZSBzZWxmLnByb2R1Y2VyX2ZpZm8gYW5kIHNlbGYuY29ubmVjdGVkOgorICAgICAgICAgICAgZmlyc3QgPSBzZWxmLnByb2R1Y2VyX2ZpZm9bMF0KKyAgICAgICAgICAgICMgaGFuZGxlIGVtcHR5IHN0cmluZy9idWZmZXIgb3IgTm9uZSBlbnRyeQorICAgICAgICAgICAgaWYgbm90IGZpcnN0OgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnByb2R1Y2VyX2ZpZm9bMF0KKyAgICAgICAgICAgICAgICBpZiBmaXJzdCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAjIGhhbmRsZSBjbGFzc2ljIHByb2R1Y2VyIGJlaGF2aW9yCisgICAgICAgICAgICBvYnMgPSBzZWxmLmFjX291dF9idWZmZXJfc2l6ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgcHkza3dhcm5pbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgIi4qYnVmZmVyIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgICAgICAgICBkYXRhID0gYnVmZmVyKGZpcnN0LCAwLCBvYnMpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIGRhdGEgPSBmaXJzdC5tb3JlKCkKKyAgICAgICAgICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2R1Y2VyX2ZpZm8uYXBwZW5kbGVmdChkYXRhKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLnByb2R1Y2VyX2ZpZm9bMF0KKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIHNlbmQgdGhlIGRhdGEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBudW1fc2VudCA9IHNlbGYuc2VuZChkYXRhKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lcnJvcigpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGlmIG51bV9zZW50OgorICAgICAgICAgICAgICAgIGlmIG51bV9zZW50IDwgbGVuKGRhdGEpIG9yIG9icyA8IGxlbihmaXJzdCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvZHVjZXJfZmlmb1swXSA9IGZpcnN0W251bV9zZW50Ol0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5wcm9kdWNlcl9maWZvWzBdCisgICAgICAgICAgICAjIHdlIHRyaWVkIHRvIHNlbmQgc29tZSBhY3R1YWwgZGF0YQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgZGlzY2FyZF9idWZmZXJzIChzZWxmKToKKyAgICAgICAgIyBFbWVyZ2VuY2llcyBvbmx5IQorICAgICAgICBzZWxmLmFjX2luX2J1ZmZlciA9ICcnCisgICAgICAgIGRlbCBzZWxmLmluY29taW5nWzpdCisgICAgICAgIHNlbGYucHJvZHVjZXJfZmlmby5jbGVhcigpCisKK2NsYXNzIHNpbXBsZV9wcm9kdWNlcjoKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgZGF0YSwgYnVmZmVyX3NpemU9NTEyKToKKyAgICAgICAgc2VsZi5kYXRhID0gZGF0YQorICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemUKKworICAgIGRlZiBtb3JlIChzZWxmKToKKyAgICAgICAgaWYgbGVuIChzZWxmLmRhdGEpID4gc2VsZi5idWZmZXJfc2l6ZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZGF0YVs6c2VsZi5idWZmZXJfc2l6ZV0KKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVtzZWxmLmJ1ZmZlcl9zaXplOl0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZGF0YQorICAgICAgICAgICAgc2VsZi5kYXRhID0gJycKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworY2xhc3MgZmlmbzoKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIGxpc3Q9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBsaXN0OgorICAgICAgICAgICAgc2VsZi5saXN0ID0gZGVxdWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5saXN0ID0gZGVxdWUobGlzdCkKKworICAgIGRlZiBfX2xlbl9fIChzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmxpc3QpCisKKyAgICBkZWYgaXNfZW1wdHkgKHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYubGlzdAorCisgICAgZGVmIGZpcnN0IChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGlzdFswXQorCisgICAgZGVmIHB1c2ggKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmxpc3QuYXBwZW5kKGRhdGEpCisKKyAgICBkZWYgcG9wIChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5saXN0OgorICAgICAgICAgICAgcmV0dXJuICgxLCBzZWxmLmxpc3QucG9wbGVmdCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICgwLCBOb25lKQorCisjIEdpdmVuICdoYXlzdGFjaycsIHNlZSBpZiBhbnkgcHJlZml4IG9mICduZWVkbGUnIGlzIGF0IGl0cyBlbmQuICBUaGlzCisjIGFzc3VtZXMgYW4gZXhhY3QgbWF0Y2ggaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YKKyMgY2hhcmFjdGVycyBtYXRjaGVkLgorIyBmb3IgZXhhbXBsZToKKyMgZl9wX2FfZSAoInF3ZXJ0eVxyIiwgIlxyXG4iKSA9PiAxCisjIGZfcF9hX2UgKCJxd2VydHlka2pmIiwgIlxyXG4iKSA9PiAwCisjIGZfcF9hX2UgKCJxd2VydHlcclxuIiwgIlxyXG4iKSA9PiA8dW5kZWZpbmVkPgorCisjIHRoaXMgY291bGQgbWF5YmUgYmUgbWFkZSBmYXN0ZXIgd2l0aCBhIGNvbXB1dGVkIHJlZ2V4PworIyBbYW5zd2VyOiBubzsgY2lyY2EgUHl0aG9uLTIuMCwgSmFuIDIwMDFdCisjIG5ldyBweXRob246ICAgMjg5NjEvcworIyBvbGQgcHl0aG9uOiAgIDE4MzA3L3MKKyMgcmU6ICAgICAgICAxMjgyMC9zCisjIHJlZ2V4OiAgICAgMTQwMzUvcworCitkZWYgZmluZF9wcmVmaXhfYXRfZW5kIChoYXlzdGFjaywgbmVlZGxlKToKKyAgICBsID0gbGVuKG5lZWRsZSkgLSAxCisgICAgd2hpbGUgbCBhbmQgbm90IGhheXN0YWNrLmVuZHN3aXRoKG5lZWRsZVs6bF0pOgorICAgICAgICBsIC09IDEKKyAgICByZXR1cm4gbApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hc3luY2hhdC5weWMgYi9saWIvcHl0aG9uMi43L2FzeW5jaGF0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJmMWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hc3luY2hhdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hc3luY2hhdC5weW8gYi9saWIvcHl0aG9uMi43L2FzeW5jaGF0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWJmMWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hc3luY2hhdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hc3luY29yZS5weSBiL2xpYi9weXRob24yLjcvYXN5bmNvcmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwOTliZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYXN5bmNvcmUucHkKQEAgLTAsMCArMSw2NTkgQEAKKyMgLSotIE1vZGU6IFB5dGhvbiAtKi0KKyMgICBJZDogYXN5bmNvcmUucHksdiAyLjUxIDIwMDAvMDkvMDcgMjI6Mjk6MjYgcnVzaGluZyBFeHAKKyMgICBBdXRob3I6IFNhbSBSdXNoaW5nIDxydXNoaW5nQG5pZ2h0bWFyZS5jb20+CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBDb3B5cmlnaHQgMTk5NiBieSBTYW0gUnVzaGluZworIworIyAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisjCisjIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisjIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5CisjIGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbAorIyBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbgorIyBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2FtCisjIFJ1c2hpbmcgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KKyMgZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yCisjIHBlcm1pc3Npb24uCisjCisjIFNBTSBSVVNISU5HIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorIyBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOCisjIE5PIEVWRU5UIFNIQUxMIFNBTSBSVVNISU5HIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MKKyMgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorIyBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyMgQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisiIiJCYXNpYyBpbmZyYXN0cnVjdHVyZSBmb3IgYXN5bmNocm9ub3VzIHNvY2tldCBzZXJ2aWNlIGNsaWVudHMgYW5kIHNlcnZlcnMuCisKK1RoZXJlIGFyZSBvbmx5IHR3byB3YXlzIHRvIGhhdmUgYSBwcm9ncmFtIG9uIGEgc2luZ2xlIHByb2Nlc3NvciBkbyAibW9yZQordGhhbiBvbmUgdGhpbmcgYXQgYSB0aW1lIi4gIE11bHRpLXRocmVhZGVkIHByb2dyYW1taW5nIGlzIHRoZSBzaW1wbGVzdCBhbmQKK21vc3QgcG9wdWxhciB3YXkgdG8gZG8gaXQsIGJ1dCB0aGVyZSBpcyBhbm90aGVyIHZlcnkgZGlmZmVyZW50IHRlY2huaXF1ZSwKK3RoYXQgbGV0cyB5b3UgaGF2ZSBuZWFybHkgYWxsIHRoZSBhZHZhbnRhZ2VzIG9mIG11bHRpLXRocmVhZGluZywgd2l0aG91dAorYWN0dWFsbHkgdXNpbmcgbXVsdGlwbGUgdGhyZWFkcy4gaXQncyByZWFsbHkgb25seSBwcmFjdGljYWwgaWYgeW91ciBwcm9ncmFtCitpcyBsYXJnZWx5IEkvTyBib3VuZC4gSWYgeW91ciBwcm9ncmFtIGlzIENQVSBib3VuZCwgdGhlbiBwcmUtZW1wdGl2ZQorc2NoZWR1bGVkIHRocmVhZHMgYXJlIHByb2JhYmx5IHdoYXQgeW91IHJlYWxseSBuZWVkLiBOZXR3b3JrIHNlcnZlcnMgYXJlCityYXJlbHkgQ1BVLWJvdW5kLCBob3dldmVyLgorCitJZiB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydHMgdGhlIHNlbGVjdCgpIHN5c3RlbSBjYWxsIGluIGl0cyBJL08KK2xpYnJhcnkgKGFuZCBuZWFybHkgYWxsIGRvKSwgdGhlbiB5b3UgY2FuIHVzZSBpdCB0byBqdWdnbGUgbXVsdGlwbGUKK2NvbW11bmljYXRpb24gY2hhbm5lbHMgYXQgb25jZTsgZG9pbmcgb3RoZXIgd29yayB3aGlsZSB5b3VyIEkvTyBpcyB0YWtpbmcKK3BsYWNlIGluIHRoZSAiYmFja2dyb3VuZC4iICBBbHRob3VnaCB0aGlzIHN0cmF0ZWd5IGNhbiBzZWVtIHN0cmFuZ2UgYW5kCitjb21wbGV4LCBlc3BlY2lhbGx5IGF0IGZpcnN0LCBpdCBpcyBpbiBtYW55IHdheXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgYW5kCitjb250cm9sIHRoYW4gbXVsdGktdGhyZWFkZWQgcHJvZ3JhbW1pbmcuIFRoZSBtb2R1bGUgZG9jdW1lbnRlZCBoZXJlIHNvbHZlcworbWFueSBvZiB0aGUgZGlmZmljdWx0IHByb2JsZW1zIGZvciB5b3UsIG1ha2luZyB0aGUgdGFzayBvZiBidWlsZGluZworc29waGlzdGljYXRlZCBoaWdoLXBlcmZvcm1hbmNlIG5ldHdvcmsgc2VydmVycyBhbmQgY2xpZW50cyBhIHNuYXAuCisiIiIKKworaW1wb3J0IHNlbGVjdAoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB3YXJuaW5ncworCitpbXBvcnQgb3MKK2Zyb20gZXJybm8gaW1wb3J0IEVBTFJFQURZLCBFSU5QUk9HUkVTUywgRVdPVUxEQkxPQ0ssIEVDT05OUkVTRVQsIEVJTlZBTCwgXAorICAgICBFTk9UQ09OTiwgRVNIVVRET1dOLCBFSU5UUiwgRUlTQ09OTiwgRUJBREYsIEVDT05OQUJPUlRFRCwgRVBJUEUsIEVBR0FJTiwgXAorICAgICBlcnJvcmNvZGUKKworX0RJU0NPTk5FQ1RFRCA9IGZyb3plbnNldCgoRUNPTk5SRVNFVCwgRU5PVENPTk4sIEVTSFVURE9XTiwgRUNPTk5BQk9SVEVELCBFUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVCQURGKSkKKwordHJ5OgorICAgIHNvY2tldF9tYXAKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgc29ja2V0X21hcCA9IHt9CisKK2RlZiBfc3RyZXJyb3IoZXJyKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBvcy5zdHJlcnJvcihlcnIpCisgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yLCBOYW1lRXJyb3IpOgorICAgICAgICBpZiBlcnIgaW4gZXJyb3Jjb2RlOgorICAgICAgICAgICAgcmV0dXJuIGVycm9yY29kZVtlcnJdCisgICAgICAgIHJldHVybiAiVW5rbm93biBlcnJvciAlcyIgJWVycgorCitjbGFzcyBFeGl0Tm93KEV4Y2VwdGlvbik6CisgICAgcGFzcworCitfcmVyYWlzZWRfZXhjZXB0aW9ucyA9IChFeGl0Tm93LCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCkKKworZGVmIHJlYWQob2JqKToKKyAgICB0cnk6CisgICAgICAgIG9iai5oYW5kbGVfcmVhZF9ldmVudCgpCisgICAgZXhjZXB0IF9yZXJhaXNlZF9leGNlcHRpb25zOgorICAgICAgICByYWlzZQorICAgIGV4Y2VwdDoKKyAgICAgICAgb2JqLmhhbmRsZV9lcnJvcigpCisKK2RlZiB3cml0ZShvYmopOgorICAgIHRyeToKKyAgICAgICAgb2JqLmhhbmRsZV93cml0ZV9ldmVudCgpCisgICAgZXhjZXB0IF9yZXJhaXNlZF9leGNlcHRpb25zOgorICAgICAgICByYWlzZQorICAgIGV4Y2VwdDoKKyAgICAgICAgb2JqLmhhbmRsZV9lcnJvcigpCisKK2RlZiBfZXhjZXB0aW9uKG9iaik6CisgICAgdHJ5OgorICAgICAgICBvYmouaGFuZGxlX2V4cHRfZXZlbnQoKQorICAgIGV4Y2VwdCBfcmVyYWlzZWRfZXhjZXB0aW9uczoKKyAgICAgICAgcmFpc2UKKyAgICBleGNlcHQ6CisgICAgICAgIG9iai5oYW5kbGVfZXJyb3IoKQorCitkZWYgcmVhZHdyaXRlKG9iaiwgZmxhZ3MpOgorICAgIHRyeToKKyAgICAgICAgaWYgZmxhZ3MgJiBzZWxlY3QuUE9MTElOOgorICAgICAgICAgICAgb2JqLmhhbmRsZV9yZWFkX2V2ZW50KCkKKyAgICAgICAgaWYgZmxhZ3MgJiBzZWxlY3QuUE9MTE9VVDoKKyAgICAgICAgICAgIG9iai5oYW5kbGVfd3JpdGVfZXZlbnQoKQorICAgICAgICBpZiBmbGFncyAmIHNlbGVjdC5QT0xMUFJJOgorICAgICAgICAgICAgb2JqLmhhbmRsZV9leHB0X2V2ZW50KCkKKyAgICAgICAgaWYgZmxhZ3MgJiAoc2VsZWN0LlBPTExIVVAgfCBzZWxlY3QuUE9MTEVSUiB8IHNlbGVjdC5QT0xMTlZBTCk6CisgICAgICAgICAgICBvYmouaGFuZGxlX2Nsb3NlKCkKKyAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgorICAgICAgICBpZiBlLmFyZ3NbMF0gbm90IGluIF9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICBvYmouaGFuZGxlX2Vycm9yKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9iai5oYW5kbGVfY2xvc2UoKQorICAgIGV4Y2VwdCBfcmVyYWlzZWRfZXhjZXB0aW9uczoKKyAgICAgICAgcmFpc2UKKyAgICBleGNlcHQ6CisgICAgICAgIG9iai5oYW5kbGVfZXJyb3IoKQorCitkZWYgcG9sbCh0aW1lb3V0PTAuMCwgbWFwPU5vbmUpOgorICAgIGlmIG1hcCBpcyBOb25lOgorICAgICAgICBtYXAgPSBzb2NrZXRfbWFwCisgICAgaWYgbWFwOgorICAgICAgICByID0gW107IHcgPSBbXTsgZSA9IFtdCisgICAgICAgIGZvciBmZCwgb2JqIGluIG1hcC5pdGVtcygpOgorICAgICAgICAgICAgaXNfciA9IG9iai5yZWFkYWJsZSgpCisgICAgICAgICAgICBpc193ID0gb2JqLndyaXRhYmxlKCkKKyAgICAgICAgICAgIGlmIGlzX3I6CisgICAgICAgICAgICAgICAgci5hcHBlbmQoZmQpCisgICAgICAgICAgICAjIGFjY2VwdGluZyBzb2NrZXRzIHNob3VsZCBub3QgYmUgd3JpdGFibGUKKyAgICAgICAgICAgIGlmIGlzX3cgYW5kIG5vdCBvYmouYWNjZXB0aW5nOgorICAgICAgICAgICAgICAgIHcuYXBwZW5kKGZkKQorICAgICAgICAgICAgaWYgaXNfciBvciBpc193OgorICAgICAgICAgICAgICAgIGUuYXBwZW5kKGZkKQorICAgICAgICBpZiBbXSA9PSByID09IHcgPT0gZToKKyAgICAgICAgICAgIHRpbWUuc2xlZXAodGltZW91dCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHIsIHcsIGUgPSBzZWxlY3Quc2VsZWN0KHIsIHcsIGUsIHRpbWVvdXQpCisgICAgICAgIGV4Y2VwdCBzZWxlY3QuZXJyb3IsIGVycjoKKyAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdICE9IEVJTlRSOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBmZCBpbiByOgorICAgICAgICAgICAgb2JqID0gbWFwLmdldChmZCkKKyAgICAgICAgICAgIGlmIG9iaiBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICByZWFkKG9iaikKKworICAgICAgICBmb3IgZmQgaW4gdzoKKyAgICAgICAgICAgIG9iaiA9IG1hcC5nZXQoZmQpCisgICAgICAgICAgICBpZiBvYmogaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgd3JpdGUob2JqKQorCisgICAgICAgIGZvciBmZCBpbiBlOgorICAgICAgICAgICAgb2JqID0gbWFwLmdldChmZCkKKyAgICAgICAgICAgIGlmIG9iaiBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBfZXhjZXB0aW9uKG9iaikKKworZGVmIHBvbGwyKHRpbWVvdXQ9MC4wLCBtYXA9Tm9uZSk6CisgICAgIyBVc2UgdGhlIHBvbGwoKSBzdXBwb3J0IGFkZGVkIHRvIHRoZSBzZWxlY3QgbW9kdWxlIGluIFB5dGhvbiAyLjAKKyAgICBpZiBtYXAgaXMgTm9uZToKKyAgICAgICAgbWFwID0gc29ja2V0X21hcAorICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICMgdGltZW91dCBpcyBpbiBtaWxsaXNlY29uZHMKKyAgICAgICAgdGltZW91dCA9IGludCh0aW1lb3V0KjEwMDApCisgICAgcG9sbHN0ZXIgPSBzZWxlY3QucG9sbCgpCisgICAgaWYgbWFwOgorICAgICAgICBmb3IgZmQsIG9iaiBpbiBtYXAuaXRlbXMoKToKKyAgICAgICAgICAgIGZsYWdzID0gMAorICAgICAgICAgICAgaWYgb2JqLnJlYWRhYmxlKCk6CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gc2VsZWN0LlBPTExJTiB8IHNlbGVjdC5QT0xMUFJJCisgICAgICAgICAgICAjIGFjY2VwdGluZyBzb2NrZXRzIHNob3VsZCBub3QgYmUgd3JpdGFibGUKKyAgICAgICAgICAgIGlmIG9iai53cml0YWJsZSgpIGFuZCBub3Qgb2JqLmFjY2VwdGluZzoKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBzZWxlY3QuUE9MTE9VVAorICAgICAgICAgICAgaWYgZmxhZ3M6CisgICAgICAgICAgICAgICAgIyBPbmx5IGNoZWNrIGZvciBleGNlcHRpb25zIGlmIG9iamVjdCB3YXMgZWl0aGVyIHJlYWRhYmxlCisgICAgICAgICAgICAgICAgIyBvciB3cml0YWJsZS4KKyAgICAgICAgICAgICAgICBmbGFncyB8PSBzZWxlY3QuUE9MTEVSUiB8IHNlbGVjdC5QT0xMSFVQIHwgc2VsZWN0LlBPTExOVkFMCisgICAgICAgICAgICAgICAgcG9sbHN0ZXIucmVnaXN0ZXIoZmQsIGZsYWdzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByID0gcG9sbHN0ZXIucG9sbCh0aW1lb3V0KQorICAgICAgICBleGNlcHQgc2VsZWN0LmVycm9yLCBlcnI6CisgICAgICAgICAgICBpZiBlcnIuYXJnc1swXSAhPSBFSU5UUjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgciA9IFtdCisgICAgICAgIGZvciBmZCwgZmxhZ3MgaW4gcjoKKyAgICAgICAgICAgIG9iaiA9IG1hcC5nZXQoZmQpCisgICAgICAgICAgICBpZiBvYmogaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcmVhZHdyaXRlKG9iaiwgZmxhZ3MpCisKK3BvbGwzID0gcG9sbDIgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFsaWFzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisKK2RlZiBsb29wKHRpbWVvdXQ9MzAuMCwgdXNlX3BvbGw9RmFsc2UsIG1hcD1Ob25lLCBjb3VudD1Ob25lKToKKyAgICBpZiBtYXAgaXMgTm9uZToKKyAgICAgICAgbWFwID0gc29ja2V0X21hcAorCisgICAgaWYgdXNlX3BvbGwgYW5kIGhhc2F0dHIoc2VsZWN0LCAncG9sbCcpOgorICAgICAgICBwb2xsX2Z1biA9IHBvbGwyCisgICAgZWxzZToKKyAgICAgICAgcG9sbF9mdW4gPSBwb2xsCisKKyAgICBpZiBjb3VudCBpcyBOb25lOgorICAgICAgICB3aGlsZSBtYXA6CisgICAgICAgICAgICBwb2xsX2Z1bih0aW1lb3V0LCBtYXApCisKKyAgICBlbHNlOgorICAgICAgICB3aGlsZSBtYXAgYW5kIGNvdW50ID4gMDoKKyAgICAgICAgICAgIHBvbGxfZnVuKHRpbWVvdXQsIG1hcCkKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgLSAxCisKK2NsYXNzIGRpc3BhdGNoZXI6CisKKyAgICBkZWJ1ZyA9IEZhbHNlCisgICAgY29ubmVjdGVkID0gRmFsc2UKKyAgICBhY2NlcHRpbmcgPSBGYWxzZQorICAgIGNvbm5lY3RpbmcgPSBGYWxzZQorICAgIGNsb3NpbmcgPSBGYWxzZQorICAgIGFkZHIgPSBOb25lCisgICAgaWdub3JlX2xvZ190eXBlcyA9IGZyb3plbnNldChbJ3dhcm5pbmcnXSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NrPU5vbmUsIG1hcD1Ob25lKToKKyAgICAgICAgaWYgbWFwIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9tYXAgPSBzb2NrZXRfbWFwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9tYXAgPSBtYXAKKworICAgICAgICBzZWxmLl9maWxlbm8gPSBOb25lCisKKyAgICAgICAgaWYgc29jazoKKyAgICAgICAgICAgICMgU2V0IHRvIG5vbmJsb2NraW5nIGp1c3QgdG8gbWFrZSBzdXJlIGZvciBjYXNlcyB3aGVyZSB3ZQorICAgICAgICAgICAgIyBnZXQgYSBzb2NrZXQgZnJvbSBhIGJsb2NraW5nIHNvdXJjZS4KKyAgICAgICAgICAgIHNvY2suc2V0YmxvY2tpbmcoMCkKKyAgICAgICAgICAgIHNlbGYuc2V0X3NvY2tldChzb2NrLCBtYXApCisgICAgICAgICAgICBzZWxmLmNvbm5lY3RlZCA9IFRydWUKKyAgICAgICAgICAgICMgVGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZXF1aXJlcyB0aGF0IHRoZSBzb2NrZXQKKyAgICAgICAgICAgICMgcGFzc2VkIGJlIGNvbm5lY3RlZC4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZHIgPSBzb2NrLmdldHBlZXJuYW1lKCkKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBpZiBlcnIuYXJnc1swXSBpbiAoRU5PVENPTk4sIEVJTlZBTCk6CisgICAgICAgICAgICAgICAgICAgICMgVG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHdlIGdvdCBhbiB1bmNvbm5lY3RlZAorICAgICAgICAgICAgICAgICAgICAjIHNvY2tldC4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25uZWN0ZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgVGhlIHNvY2tldCBpcyBicm9rZW4gaW4gc29tZSB1bmtub3duIHdheSwgYWxlcnQKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgdXNlciBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIG1hcCAodG8gcHJldmVudAorICAgICAgICAgICAgICAgICAgICAjIHBvbGxpbmcgb2YgYnJva2VuIHNvY2tldHMpLgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbF9jaGFubmVsKG1hcCkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc29ja2V0ID0gTm9uZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBzdGF0dXMgPSBbc2VsZi5fX2NsYXNzX18uX19tb2R1bGVfXysiLiIrc2VsZi5fX2NsYXNzX18uX19uYW1lX19dCisgICAgICAgIGlmIHNlbGYuYWNjZXB0aW5nIGFuZCBzZWxmLmFkZHI6CisgICAgICAgICAgICBzdGF0dXMuYXBwZW5kKCdsaXN0ZW5pbmcnKQorICAgICAgICBlbGlmIHNlbGYuY29ubmVjdGVkOgorICAgICAgICAgICAgc3RhdHVzLmFwcGVuZCgnY29ubmVjdGVkJykKKyAgICAgICAgaWYgc2VsZi5hZGRyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN0YXR1cy5hcHBlbmQoJyVzOiVkJyAlIHNlbGYuYWRkcikKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgc3RhdHVzLmFwcGVuZChyZXByKHNlbGYuYWRkcikpCisgICAgICAgIHJldHVybiAnPCVzIGF0ICUjeD4nICUgKCcgJy5qb2luKHN0YXR1cyksIGlkKHNlbGYpKQorCisgICAgX19zdHJfXyA9IF9fcmVwcl9fCisKKyAgICBkZWYgYWRkX2NoYW5uZWwoc2VsZiwgbWFwPU5vbmUpOgorICAgICAgICAjc2VsZi5sb2dfaW5mbygnYWRkaW5nIGNoYW5uZWwgJXMnICUgc2VsZikKKyAgICAgICAgaWYgbWFwIGlzIE5vbmU6CisgICAgICAgICAgICBtYXAgPSBzZWxmLl9tYXAKKyAgICAgICAgbWFwW3NlbGYuX2ZpbGVub10gPSBzZWxmCisKKyAgICBkZWYgZGVsX2NoYW5uZWwoc2VsZiwgbWFwPU5vbmUpOgorICAgICAgICBmZCA9IHNlbGYuX2ZpbGVubworICAgICAgICBpZiBtYXAgaXMgTm9uZToKKyAgICAgICAgICAgIG1hcCA9IHNlbGYuX21hcAorICAgICAgICBpZiBmZCBpbiBtYXA6CisgICAgICAgICAgICAjc2VsZi5sb2dfaW5mbygnY2xvc2luZyBjaGFubmVsICVkOiVzJyAlIChmZCwgc2VsZikpCisgICAgICAgICAgICBkZWwgbWFwW2ZkXQorICAgICAgICBzZWxmLl9maWxlbm8gPSBOb25lCisKKyAgICBkZWYgY3JlYXRlX3NvY2tldChzZWxmLCBmYW1pbHksIHR5cGUpOgorICAgICAgICBzZWxmLmZhbWlseV9hbmRfdHlwZSA9IGZhbWlseSwgdHlwZQorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChmYW1pbHksIHR5cGUpCisgICAgICAgIHNvY2suc2V0YmxvY2tpbmcoMCkKKyAgICAgICAgc2VsZi5zZXRfc29ja2V0KHNvY2spCisKKyAgICBkZWYgc2V0X3NvY2tldChzZWxmLCBzb2NrLCBtYXA9Tm9uZSk6CisgICAgICAgIHNlbGYuc29ja2V0ID0gc29jaworIyMgICAgICAgIHNlbGYuX19kaWN0X19bJ3NvY2tldCddID0gc29jaworICAgICAgICBzZWxmLl9maWxlbm8gPSBzb2NrLmZpbGVubygpCisgICAgICAgIHNlbGYuYWRkX2NoYW5uZWwobWFwKQorCisgICAgZGVmIHNldF9yZXVzZV9hZGRyKHNlbGYpOgorICAgICAgICAjIHRyeSB0byByZS11c2UgYSBzZXJ2ZXIgcG9ydCBpZiBwb3NzaWJsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNvY2tldC5zZXRzb2Nrb3B0KAorICAgICAgICAgICAgICAgIHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLAorICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0LmdldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuU09fUkVVU0VBRERSKSB8IDEKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIyBwcmVkaWNhdGVzIGZvciBzZWxlY3QoKQorICAgICMgdGhlc2UgYXJlIHVzZWQgYXMgZmlsdGVycyBmb3IgdGhlIGxpc3RzIG9mIHNvY2tldHMKKyAgICAjIHRvIHBhc3MgdG8gc2VsZWN0KCkuCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICMgc29ja2V0IG9iamVjdCBtZXRob2RzLgorICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIGRlZiBsaXN0ZW4oc2VsZiwgbnVtKToKKyAgICAgICAgc2VsZi5hY2NlcHRpbmcgPSBUcnVlCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JyBhbmQgbnVtID4gNToKKyAgICAgICAgICAgIG51bSA9IDUKKyAgICAgICAgcmV0dXJuIHNlbGYuc29ja2V0Lmxpc3RlbihudW0pCisKKyAgICBkZWYgYmluZChzZWxmLCBhZGRyKToKKyAgICAgICAgc2VsZi5hZGRyID0gYWRkcgorICAgICAgICByZXR1cm4gc2VsZi5zb2NrZXQuYmluZChhZGRyKQorCisgICAgZGVmIGNvbm5lY3Qoc2VsZiwgYWRkcmVzcyk6CisgICAgICAgIHNlbGYuY29ubmVjdGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5jb25uZWN0aW5nID0gVHJ1ZQorICAgICAgICBlcnIgPSBzZWxmLnNvY2tldC5jb25uZWN0X2V4KGFkZHJlc3MpCisgICAgICAgIGlmIGVyciBpbiAoRUlOUFJPR1JFU1MsIEVBTFJFQURZLCBFV09VTERCTE9DSykgXAorICAgICAgICBvciBlcnIgPT0gRUlOVkFMIGFuZCBvcy5uYW1lIGluICgnbnQnLCAnY2UnKToKKyAgICAgICAgICAgIHNlbGYuYWRkciA9IGFkZHJlc3MKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBlcnIgaW4gKDAsIEVJU0NPTk4pOgorICAgICAgICAgICAgc2VsZi5hZGRyID0gYWRkcmVzcworICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdF9ldmVudCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IoZXJyLCBlcnJvcmNvZGVbZXJyXSkKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgICMgWFhYIGNhbiByZXR1cm4gZWl0aGVyIGFuIGFkZHJlc3MgcGFpciBvciBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLnNvY2tldC5hY2NlcHQoKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyB3aHk6CisgICAgICAgICAgICBpZiB3aHkuYXJnc1swXSBpbiAoRVdPVUxEQkxPQ0ssIEVDT05OQUJPUlRFRCwgRUFHQUlOKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGNvbm4sIGFkZHIKKworICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLnNvY2tldC5zZW5kKGRhdGEpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIHdoeToKKyAgICAgICAgICAgIGlmIHdoeS5hcmdzWzBdID09IEVXT1VMREJMT0NLOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbGlmIHdoeS5hcmdzWzBdIGluIF9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY2xvc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgcmVjdihzZWxmLCBidWZmZXJfc2l6ZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLnNvY2tldC5yZWN2KGJ1ZmZlcl9zaXplKQorICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgIyBhIGNsb3NlZCBjb25uZWN0aW9uIGlzIGluZGljYXRlZCBieSBzaWduYWxpbmcKKyAgICAgICAgICAgICAgICAjIGEgcmVhZCBjb25kaXRpb24sIGFuZCBoYXZpbmcgcmVjdigpIHJldHVybiAwLgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Nsb3NlKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gJycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgd2h5OgorICAgICAgICAgICAgIyB3aW5zb2NrIHNvbWV0aW1lcyByYWlzZXMgRU5PVENPTk4KKyAgICAgICAgICAgIGlmIHdoeS5hcmdzWzBdIGluIF9ESVNDT05ORUNURUQ6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY2xvc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmNvbm5lY3RlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuYWNjZXB0aW5nID0gRmFsc2UKKyAgICAgICAgc2VsZi5jb25uZWN0aW5nID0gRmFsc2UKKyAgICAgICAgc2VsZi5kZWxfY2hhbm5lbCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgd2h5OgorICAgICAgICAgICAgaWYgd2h5LmFyZ3NbMF0gbm90IGluIChFTk9UQ09OTiwgRUJBREYpOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAjIGNoZWFwIGluaGVyaXRhbmNlLCB1c2VkIHRvIHBhc3MgYWxsIG90aGVyIGF0dHJpYnV0ZQorICAgICMgcmVmZXJlbmNlcyB0byB0aGUgdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0LgorICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0YXR0ciA9IGdldGF0dHIoc2VsZi5zb2NrZXQsIGF0dHIpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCIlcyBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICclcyciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBhdHRyKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZyA9ICIlKG1lKXMuJShhdHRyKXMgaXMgZGVwcmVjYXRlZC4gVXNlICUobWUpcy5zb2NrZXQuJShhdHRyKXMgIiBcCisgICAgICAgICAgICAgICAgICAiaW5zdGVhZC4iICUgeydtZSc6IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnYXR0cic6YXR0cn0KKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgIHJldHVybiByZXRhdHRyCisKKyAgICAjIGxvZyBhbmQgbG9nX2luZm8gbWF5IGJlIG92ZXJyaWRkZW4gdG8gcHJvdmlkZSBtb3JlIHNvcGhpc3RpY2F0ZWQKKyAgICAjIGxvZ2dpbmcgYW5kIHdhcm5pbmcgbWV0aG9kcy4gSW4gZ2VuZXJhbCwgbG9nIGlzIGZvciAnaGl0JyBsb2dnaW5nCisgICAgIyBhbmQgJ2xvZ19pbmZvJyBpcyBmb3IgaW5mb3JtYXRpb25hbCwgd2FybmluZyBhbmQgZXJyb3IgbG9nZ2luZy4KKworICAgIGRlZiBsb2coc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ2xvZzogJXNcbicgJSBzdHIobWVzc2FnZSkpCisKKyAgICBkZWYgbG9nX2luZm8oc2VsZiwgbWVzc2FnZSwgdHlwZT0naW5mbycpOgorICAgICAgICBpZiB0eXBlIG5vdCBpbiBzZWxmLmlnbm9yZV9sb2dfdHlwZXM6CisgICAgICAgICAgICBwcmludCAnJXM6ICVzJyAlICh0eXBlLCBtZXNzYWdlKQorCisgICAgZGVmIGhhbmRsZV9yZWFkX2V2ZW50KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmFjY2VwdGluZzoKKyAgICAgICAgICAgICMgYWNjZXB0aW5nIHNvY2tldHMgYXJlIG5ldmVyIGNvbm5lY3RlZCwgdGhleSAic3Bhd24iIG5ldworICAgICAgICAgICAgIyBzb2NrZXRzIHRoYXQgYXJlIGNvbm5lY3RlZAorICAgICAgICAgICAgc2VsZi5oYW5kbGVfYWNjZXB0KCkKKyAgICAgICAgZWxpZiBub3Qgc2VsZi5jb25uZWN0ZWQ6CisgICAgICAgICAgICBpZiBzZWxmLmNvbm5lY3Rpbmc6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdF9ldmVudCgpCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZWFkKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX3JlYWQoKQorCisgICAgZGVmIGhhbmRsZV9jb25uZWN0X2V2ZW50KHNlbGYpOgorICAgICAgICBlcnIgPSBzZWxmLnNvY2tldC5nZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fRVJST1IpCisgICAgICAgIGlmIGVyciAhPSAwOgorICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmVycm9yKGVyciwgX3N0cmVycm9yKGVycikpCisgICAgICAgIHNlbGYuaGFuZGxlX2Nvbm5lY3QoKQorICAgICAgICBzZWxmLmNvbm5lY3RlZCA9IFRydWUKKyAgICAgICAgc2VsZi5jb25uZWN0aW5nID0gRmFsc2UKKworICAgIGRlZiBoYW5kbGVfd3JpdGVfZXZlbnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYWNjZXB0aW5nOgorICAgICAgICAgICAgIyBBY2NlcHRpbmcgc29ja2V0cyBzaG91bGRuJ3QgZ2V0IGEgd3JpdGUgZXZlbnQuCisgICAgICAgICAgICAjIFdlIHdpbGwgcHJldGVuZCBpdCBkaWRuJ3QgaGFwcGVuLgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbm90IHNlbGYuY29ubmVjdGVkOgorICAgICAgICAgICAgaWYgc2VsZi5jb25uZWN0aW5nOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Nvbm5lY3RfZXZlbnQoKQorICAgICAgICBzZWxmLmhhbmRsZV93cml0ZSgpCisKKyAgICBkZWYgaGFuZGxlX2V4cHRfZXZlbnQoc2VsZik6CisgICAgICAgICMgaGFuZGxlX2V4cHRfZXZlbnQoKSBpcyBjYWxsZWQgaWYgdGhlcmUgbWlnaHQgYmUgYW4gZXJyb3Igb24gdGhlCisgICAgICAgICMgc29ja2V0LCBvciBpZiB0aGVyZSBpcyBPT0IgZGF0YQorICAgICAgICAjIGNoZWNrIGZvciB0aGUgZXJyb3IgY29uZGl0aW9uIGZpcnN0CisgICAgICAgIGVyciA9IHNlbGYuc29ja2V0LmdldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19FUlJPUikKKyAgICAgICAgaWYgZXJyICE9IDA6CisgICAgICAgICAgICAjIHdlIGNhbiBnZXQgaGVyZSB3aGVuIHNlbGVjdC5zZWxlY3QoKSBzYXlzIHRoYXQgdGhlcmUgaXMgYW4KKyAgICAgICAgICAgICMgZXhjZXB0aW9uYWwgY29uZGl0aW9uIG9uIHRoZSBzb2NrZXQKKyAgICAgICAgICAgICMgc2luY2UgdGhlcmUgaXMgYW4gZXJyb3IsIHdlJ2xsIGdvIGFoZWFkIGFuZCBjbG9zZSB0aGUgc29ja2V0CisgICAgICAgICAgICAjIGxpa2Ugd2Ugd291bGQgaW4gYSBzdWJjbGFzc2VkIGhhbmRsZV9yZWFkKCkgdGhhdCByZWNlaXZlZCBubworICAgICAgICAgICAgIyBkYXRhCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9jbG9zZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9leHB0KCkKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgIG5pbCwgdCwgdiwgdGJpbmZvID0gY29tcGFjdF90cmFjZWJhY2soKQorCisgICAgICAgICMgc29tZXRpbWVzIGEgdXNlciByZXByIG1ldGhvZCB3aWxsIGNyYXNoLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmX3JlcHIgPSByZXByKHNlbGYpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGZfcmVwciA9ICc8X19yZXByX18oc2VsZikgZmFpbGVkIGZvciBvYmplY3QgYXQgJTB4PicgJSBpZChzZWxmKQorCisgICAgICAgIHNlbGYubG9nX2luZm8oCisgICAgICAgICAgICAndW5jYXB0dXJlZCBweXRob24gZXhjZXB0aW9uLCBjbG9zaW5nIGNoYW5uZWwgJXMgKCVzOiVzICVzKScgJSAoCisgICAgICAgICAgICAgICAgc2VsZl9yZXByLAorICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgdiwKKyAgICAgICAgICAgICAgICB0YmluZm8KKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgJ2Vycm9yJworICAgICAgICAgICAgKQorICAgICAgICBzZWxmLmhhbmRsZV9jbG9zZSgpCisKKyAgICBkZWYgaGFuZGxlX2V4cHQoc2VsZik6CisgICAgICAgIHNlbGYubG9nX2luZm8oJ3VuaGFuZGxlZCBpbmNvbWluZyBwcmlvcml0eSBldmVudCcsICd3YXJuaW5nJykKKworICAgIGRlZiBoYW5kbGVfcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5sb2dfaW5mbygndW5oYW5kbGVkIHJlYWQgZXZlbnQnLCAnd2FybmluZycpCisKKyAgICBkZWYgaGFuZGxlX3dyaXRlKHNlbGYpOgorICAgICAgICBzZWxmLmxvZ19pbmZvKCd1bmhhbmRsZWQgd3JpdGUgZXZlbnQnLCAnd2FybmluZycpCisKKyAgICBkZWYgaGFuZGxlX2Nvbm5lY3Qoc2VsZik6CisgICAgICAgIHNlbGYubG9nX2luZm8oJ3VuaGFuZGxlZCBjb25uZWN0IGV2ZW50JywgJ3dhcm5pbmcnKQorCisgICAgZGVmIGhhbmRsZV9hY2NlcHQoc2VsZik6CisgICAgICAgIHNlbGYubG9nX2luZm8oJ3VuaGFuZGxlZCBhY2NlcHQgZXZlbnQnLCAnd2FybmluZycpCisKKyAgICBkZWYgaGFuZGxlX2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmxvZ19pbmZvKCd1bmhhbmRsZWQgY2xvc2UgZXZlbnQnLCAnd2FybmluZycpCisgICAgICAgIHNlbGYuY2xvc2UoKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBhZGRzIHNpbXBsZSBidWZmZXJlZCBvdXRwdXQgY2FwYWJpbGl0eSwgdXNlZnVsIGZvciBzaW1wbGUgY2xpZW50cy4KKyMgW2ZvciBtb3JlIHNvcGhpc3RpY2F0ZWQgdXNhZ2UgdXNlIGFzeW5jaGF0LmFzeW5jX2NoYXRdCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBkaXNwYXRjaGVyX3dpdGhfc2VuZChkaXNwYXRjaGVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NrPU5vbmUsIG1hcD1Ob25lKToKKyAgICAgICAgZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmLCBzb2NrLCBtYXApCisgICAgICAgIHNlbGYub3V0X2J1ZmZlciA9ICcnCisKKyAgICBkZWYgaW5pdGlhdGVfc2VuZChzZWxmKToKKyAgICAgICAgbnVtX3NlbnQgPSAwCisgICAgICAgIG51bV9zZW50ID0gZGlzcGF0Y2hlci5zZW5kKHNlbGYsIHNlbGYub3V0X2J1ZmZlcls6NTEyXSkKKyAgICAgICAgc2VsZi5vdXRfYnVmZmVyID0gc2VsZi5vdXRfYnVmZmVyW251bV9zZW50Ol0KKworICAgIGRlZiBoYW5kbGVfd3JpdGUoc2VsZik6CisgICAgICAgIHNlbGYuaW5pdGlhdGVfc2VuZCgpCisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiAobm90IHNlbGYuY29ubmVjdGVkKSBvciBsZW4oc2VsZi5vdXRfYnVmZmVyKQorCisgICAgZGVmIHNlbmQoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICBzZWxmLmxvZ19pbmZvKCdzZW5kaW5nICVzJyAlIHJlcHIoZGF0YSkpCisgICAgICAgIHNlbGYub3V0X2J1ZmZlciA9IHNlbGYub3V0X2J1ZmZlciArIGRhdGEKKyAgICAgICAgc2VsZi5pbml0aWF0ZV9zZW5kKCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdXNlZCBmb3IgZGVidWdnaW5nLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIGNvbXBhY3RfdHJhY2ViYWNrKCk6CisgICAgdCwgdiwgdGIgPSBzeXMuZXhjX2luZm8oKQorICAgIHRiaW5mbyA9IFtdCisgICAgaWYgbm90IHRiOiAjIE11c3QgaGF2ZSBhIHRyYWNlYmFjaworICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigidHJhY2ViYWNrIGRvZXMgbm90IGV4aXN0IikKKyAgICB3aGlsZSB0YjoKKyAgICAgICAgdGJpbmZvLmFwcGVuZCgoCisgICAgICAgICAgICB0Yi50Yl9mcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUsCisgICAgICAgICAgICB0Yi50Yl9mcmFtZS5mX2NvZGUuY29fbmFtZSwKKyAgICAgICAgICAgIHN0cih0Yi50Yl9saW5lbm8pCisgICAgICAgICAgICApKQorICAgICAgICB0YiA9IHRiLnRiX25leHQKKworICAgICMganVzdCB0byBiZSBzYWZlCisgICAgZGVsIHRiCisKKyAgICBmaWxlLCBmdW5jdGlvbiwgbGluZSA9IHRiaW5mb1stMV0KKyAgICBpbmZvID0gJyAnLmpvaW4oWydbJXN8JXN8JXNdJyAlIHggZm9yIHggaW4gdGJpbmZvXSkKKyAgICByZXR1cm4gKGZpbGUsIGZ1bmN0aW9uLCBsaW5lKSwgdCwgdiwgaW5mbworCitkZWYgY2xvc2VfYWxsKG1hcD1Ob25lLCBpZ25vcmVfYWxsPUZhbHNlKToKKyAgICBpZiBtYXAgaXMgTm9uZToKKyAgICAgICAgbWFwID0gc29ja2V0X21hcAorICAgIGZvciB4IGluIG1hcC52YWx1ZXMoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeC5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCB4OgorICAgICAgICAgICAgaWYgeC5hcmdzWzBdID09IEVCQURGOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsaWYgbm90IGlnbm9yZV9hbGw6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IF9yZXJhaXNlZF9leGNlcHRpb25zOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9hbGw6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICBtYXAuY2xlYXIoKQorCisjIEFzeW5jaHJvbm91cyBGaWxlIEkvTzoKKyMKKyMgQWZ0ZXIgYSBsaXR0bGUgcmVzZWFyY2ggKHJlYWRpbmcgbWFuIHBhZ2VzIG9uIHZhcmlvdXMgdW5peGVuLCBhbmQKKyMgZGlnZ2luZyB0aHJvdWdoIHRoZSBsaW51eCBrZXJuZWwpLCBJJ3ZlIGRldGVybWluZWQgdGhhdCBzZWxlY3QoKQorIyBpc24ndCBtZWFudCBmb3IgZG9pbmcgYXN5bmNocm9ub3VzIGZpbGUgaS9vLgorIyBIZWFydGVuaW5nLCB0aG91Z2ggLSByZWFkaW5nIGxpbnV4L21tL2ZpbGVtYXAuYyBzaG93cyB0aGF0IGxpbnV4CisjIHN1cHBvcnRzIGFzeW5jaHJvbm91cyByZWFkLWFoZWFkLiAgU28gX01PU1RfIG9mIHRoZSB0aW1lLCB0aGUgZGF0YQorIyB3aWxsIGJlIHNpdHRpbmcgaW4gbWVtb3J5IGZvciB1cyBhbHJlYWR5IHdoZW4gd2UgZ28gdG8gcmVhZCBpdC4KKyMKKyMgV2hhdCBvdGhlciBPUydzIChiZXNpZGVzIE5UKSBzdXBwb3J0IGFzeW5jIGZpbGUgaS9vPyAgW1ZNUz9dCisjCisjIFJlZ2FyZGxlc3MsIHRoaXMgaXMgdXNlZnVsIGZvciBwaXBlcywgYW5kIHN0ZGluL3N0ZG91dC4uLgorCitpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgaW1wb3J0IGZjbnRsCisKKyAgICBjbGFzcyBmaWxlX3dyYXBwZXI6CisgICAgICAgICMgSGVyZSB3ZSBvdmVycmlkZSBqdXN0IGVub3VnaCB0byBtYWtlIGEgZmlsZQorICAgICAgICAjIGxvb2sgbGlrZSBhIHNvY2tldCBmb3IgdGhlIHB1cnBvc2VzIG9mIGFzeW5jb3JlLgorICAgICAgICAjIFRoZSBwYXNzZWQgZmQgaXMgYXV0b21hdGljYWxseSBvcy5kdXAoKSdkCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZkKToKKyAgICAgICAgICAgIHNlbGYuZmQgPSBvcy5kdXAoZmQpCisKKyAgICAgICAgZGVmIHJlY3Yoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIG9zLnJlYWQoc2VsZi5mZCwgKmFyZ3MpCisKKyAgICAgICAgZGVmIHNlbmQoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIG9zLndyaXRlKHNlbGYuZmQsICphcmdzKQorCisgICAgICAgIGRlZiBnZXRzb2Nrb3B0KHNlbGYsIGxldmVsLCBvcHRuYW1lLCBidWZsZW49Tm9uZSk6CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gc29ja2V0LlNPTF9TT0NLRVQgYW5kCisgICAgICAgICAgICAgICAgb3B0bmFtZSA9PSBzb2NrZXQuU09fRVJST1IgYW5kCisgICAgICAgICAgICAgICAgbm90IGJ1Zmxlbik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIk9ubHkgYXN5bmNvcmUgc3BlY2lmaWMgYmVoYXZpb3VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcGxlbWVudGVkLiIpCisKKyAgICAgICAgcmVhZCA9IHJlY3YKKyAgICAgICAgd3JpdGUgPSBzZW5kCisKKyAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgb3MuY2xvc2Uoc2VsZi5mZCkKKworICAgICAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmQKKworICAgIGNsYXNzIGZpbGVfZGlzcGF0Y2hlcihkaXNwYXRjaGVyKToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZmQsIG1hcD1Ob25lKToKKyAgICAgICAgICAgIGRpc3BhdGNoZXIuX19pbml0X18oc2VsZiwgTm9uZSwgbWFwKQorICAgICAgICAgICAgc2VsZi5jb25uZWN0ZWQgPSBUcnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmQgPSBmZC5maWxlbm8oKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuc2V0X2ZpbGUoZmQpCisgICAgICAgICAgICAjIHNldCBpdCB0byBub24tYmxvY2tpbmcgbW9kZQorICAgICAgICAgICAgZmxhZ3MgPSBmY250bC5mY250bChmZCwgZmNudGwuRl9HRVRGTCwgMCkKKyAgICAgICAgICAgIGZsYWdzID0gZmxhZ3MgfCBvcy5PX05PTkJMT0NLCisgICAgICAgICAgICBmY250bC5mY250bChmZCwgZmNudGwuRl9TRVRGTCwgZmxhZ3MpCisKKyAgICAgICAgZGVmIHNldF9maWxlKHNlbGYsIGZkKToKKyAgICAgICAgICAgIHNlbGYuc29ja2V0ID0gZmlsZV93cmFwcGVyKGZkKQorICAgICAgICAgICAgc2VsZi5fZmlsZW5vID0gc2VsZi5zb2NrZXQuZmlsZW5vKCkKKyAgICAgICAgICAgIHNlbGYuYWRkX2NoYW5uZWwoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hc3luY29yZS5weWMgYi9saWIvcHl0aG9uMi43L2FzeW5jb3JlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2U3MDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hc3luY29yZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hc3luY29yZS5weW8gYi9saWIvcHl0aG9uMi43L2FzeW5jb3JlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2U3MDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hc3luY29yZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hdGV4aXQucHkgYi9saWIvcHl0aG9uMi43L2F0ZXhpdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2ZkZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hdGV4aXQucHkKQEAgLTAsMCArMSw2NSBAQAorIiIiCithdGV4aXQucHkgLSBhbGxvdyBwcm9ncmFtbWVyIHRvIGRlZmluZSBtdWx0aXBsZSBleGl0IGZ1bmN0aW9ucyB0byBiZSBleGVjdXRlZAordXBvbiBub3JtYWwgcHJvZ3JhbSB0ZXJtaW5hdGlvbi4KKworT25lIHB1YmxpYyBmdW5jdGlvbiwgcmVnaXN0ZXIsIGlzIGRlZmluZWQuCisiIiIKKworX19hbGxfXyA9IFsicmVnaXN0ZXIiXQorCitpbXBvcnQgc3lzCisKK19leGl0aGFuZGxlcnMgPSBbXQorZGVmIF9ydW5fZXhpdGZ1bmNzKCk6CisgICAgIiIicnVuIGFueSByZWdpc3RlcmVkIGV4aXQgZnVuY3Rpb25zCisKKyAgICBfZXhpdGhhbmRsZXJzIGlzIHRyYXZlcnNlZCBpbiByZXZlcnNlIG9yZGVyIHNvIGZ1bmN0aW9ucyBhcmUgZXhlY3V0ZWQKKyAgICBsYXN0IGluLCBmaXJzdCBvdXQuCisgICAgIiIiCisKKyAgICBleGNfaW5mbyA9IE5vbmUKKyAgICB3aGlsZSBfZXhpdGhhbmRsZXJzOgorICAgICAgICBmdW5jLCB0YXJncywga2FyZ3MgPSBfZXhpdGhhbmRsZXJzLnBvcCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMoKnRhcmdzLCAqKmthcmdzKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgIGV4Y19pbmZvID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIkVycm9yIGluIGF0ZXhpdC5fcnVuX2V4aXRmdW5jczoiCisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgICAgIGV4Y19pbmZvID0gc3lzLmV4Y19pbmZvKCkKKworICAgIGlmIGV4Y19pbmZvIGlzIG5vdCBOb25lOgorICAgICAgICByYWlzZSBleGNfaW5mb1swXSwgZXhjX2luZm9bMV0sIGV4Y19pbmZvWzJdCisKKworZGVmIHJlZ2lzdGVyKGZ1bmMsICp0YXJncywgKiprYXJncyk6CisgICAgIiIicmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBleGVjdXRlZCB1cG9uIG5vcm1hbCBwcm9ncmFtIHRlcm1pbmF0aW9uCisKKyAgICBmdW5jIC0gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGF0IGV4aXQKKyAgICB0YXJncyAtIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIGZ1bmMKKyAgICBrYXJncyAtIG9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzIHRvIHBhc3MgdG8gZnVuYworCisgICAgZnVuYyBpcyByZXR1cm5lZCB0byBmYWNpbGl0YXRlIHVzYWdlIGFzIGEgZGVjb3JhdG9yLgorICAgICIiIgorICAgIF9leGl0aGFuZGxlcnMuYXBwZW5kKChmdW5jLCB0YXJncywga2FyZ3MpKQorICAgIHJldHVybiBmdW5jCisKK2lmIGhhc2F0dHIoc3lzLCAiZXhpdGZ1bmMiKToKKyAgICAjIEFzc3VtZSBpdCdzIGFub3RoZXIgcmVnaXN0ZXJlZCBleGl0IGZ1bmN0aW9uIC0gYXBwZW5kIGl0IHRvIG91ciBsaXN0CisgICAgcmVnaXN0ZXIoc3lzLmV4aXRmdW5jKQorc3lzLmV4aXRmdW5jID0gX3J1bl9leGl0ZnVuY3MKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBkZWYgeDEoKToKKyAgICAgICAgcHJpbnQgInJ1bm5pbmcgeDEiCisgICAgZGVmIHgyKG4pOgorICAgICAgICBwcmludCAicnVubmluZyB4MiglcikiICUgKG4sKQorICAgIGRlZiB4MyhuLCBrd2Q9Tm9uZSk6CisgICAgICAgIHByaW50ICJydW5uaW5nIHgzKCVyLCBrd2Q9JXIpIiAlIChuLCBrd2QpCisKKyAgICByZWdpc3Rlcih4MSkKKyAgICByZWdpc3Rlcih4MiwgMTIpCisgICAgcmVnaXN0ZXIoeDMsIDUsICJiYXIiKQorICAgIHJlZ2lzdGVyKHgzLCAibm8ga3dkIGFyZ3MiKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hdGV4aXQucHljIGIvbGliL3B5dGhvbjIuNy9hdGV4aXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjUwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2F0ZXhpdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hdGV4aXQucHlvIGIvbGliL3B5dGhvbjIuNy9hdGV4aXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjUwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2F0ZXhpdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hdWRpb2Rldi5weSBiL2xpYi9weXRob24yLjcvYXVkaW9kZXYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4MzFhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYXVkaW9kZXYucHkKQEAgLTAsMCArMSwyNjAgQEAKKyIiIkNsYXNzZXMgZm9yIG1hbmlwdWxhdGluZyBhdWRpbyBkZXZpY2VzIChjdXJyZW50bHkgb25seSBmb3IgU3VuIGFuZCBTR0kpIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSBhdWRpb2RldiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKK19fYWxsX18gPSBbImVycm9yIiwiQXVkaW9EZXYiXQorCitjbGFzcyBlcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgUGxheV9BdWRpb19zZ2k6CisgICAgIyBQcml2YXRlIGluc3RhbmNlIHZhcmlhYmxlcworIyMgICAgICBpZiAwOiBhY2Nlc3MgZnJhbWVyYXRlbGlzdCwgbmNoYW5uZWxzbGlzdCwgc2FtcHdpZHRobGlzdCwgb2xkcGFyYW1zLCBcCisjIyAgICAgICAgICAgICAgICBwYXJhbXMsIGNvbmZpZywgaW5pdGVkX291dHJhdGUsIGluaXRlZF93aWR0aCwgXAorIyMgICAgICAgICAgICAgICAgaW5pdGVkX25jaGFubmVscywgcG9ydCwgY29udmVydGVyLCBjbGFzc2luaXRlZDogcHJpdmF0ZQorCisgICAgY2xhc3Npbml0ZWQgPSAwCisgICAgZnJhbWVyYXRlbGlzdCA9IG5jaGFubmVsc2xpc3QgPSBzYW1wd2lkdGhsaXN0ID0gTm9uZQorCisgICAgZGVmIGluaXRjbGFzcyhzZWxmKToKKyAgICAgICAgaW1wb3J0IEFMCisgICAgICAgIHNlbGYuZnJhbWVyYXRlbGlzdCA9IFsKKyAgICAgICAgICAgICAgICAgICg0ODAwMCwgQUwuUkFURV80ODAwMCksCisgICAgICAgICAgICAgICAgICAoNDQxMDAsIEFMLlJBVEVfNDQxMDApLAorICAgICAgICAgICAgICAgICAgKDMyMDAwLCBBTC5SQVRFXzMyMDAwKSwKKyAgICAgICAgICAgICAgICAgICgyMjA1MCwgQUwuUkFURV8yMjA1MCksCisgICAgICAgICAgICAgICAgICAoMTYwMDAsIEFMLlJBVEVfMTYwMDApLAorICAgICAgICAgICAgICAgICAgKDExMDI1LCBBTC5SQVRFXzExMDI1KSwKKyAgICAgICAgICAgICAgICAgICggODAwMCwgIEFMLlJBVEVfODAwMCksCisgICAgICAgICAgICAgICAgICBdCisgICAgICAgIHNlbGYubmNoYW5uZWxzbGlzdCA9IFsKKyAgICAgICAgICAgICAgICAgICgxLCBBTC5NT05PKSwKKyAgICAgICAgICAgICAgICAgICgyLCBBTC5TVEVSRU8pLAorICAgICAgICAgICAgICAgICAgKDQsIEFMLlFVQURSTyksCisgICAgICAgICAgICAgICAgICBdCisgICAgICAgIHNlbGYuc2FtcHdpZHRobGlzdCA9IFsKKyAgICAgICAgICAgICAgICAgICgxLCBBTC5TQU1QTEVfOCksCisgICAgICAgICAgICAgICAgICAoMiwgQUwuU0FNUExFXzE2KSwKKyAgICAgICAgICAgICAgICAgICgzLCBBTC5TQU1QTEVfMjQpLAorICAgICAgICAgICAgICAgICAgXQorICAgICAgICBzZWxmLmNsYXNzaW5pdGVkID0gMQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBpbXBvcnQgYWwsIEFMCisgICAgICAgIGlmIG5vdCBzZWxmLmNsYXNzaW5pdGVkOgorICAgICAgICAgICAgc2VsZi5pbml0Y2xhc3MoKQorICAgICAgICBzZWxmLm9sZHBhcmFtcyA9IFtdCisgICAgICAgIHNlbGYucGFyYW1zID0gW0FMLk9VVFBVVF9SQVRFLCAwXQorICAgICAgICBzZWxmLmNvbmZpZyA9IGFsLm5ld2NvbmZpZygpCisgICAgICAgIHNlbGYuaW5pdGVkX291dHJhdGUgPSAwCisgICAgICAgIHNlbGYuaW5pdGVkX3dpZHRoID0gMAorICAgICAgICBzZWxmLmluaXRlZF9uY2hhbm5lbHMgPSAwCisgICAgICAgIHNlbGYuY29udmVydGVyID0gTm9uZQorICAgICAgICBzZWxmLnBvcnQgPSBOb25lCisgICAgICAgIHJldHVybgorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYucG9ydDoKKyAgICAgICAgICAgIHNlbGYuc3RvcCgpCisgICAgICAgIGlmIHNlbGYub2xkcGFyYW1zOgorICAgICAgICAgICAgaW1wb3J0IGFsLCBBTAorICAgICAgICAgICAgYWwuc2V0cGFyYW1zKEFMLkRFRkFVTFRfREVWSUNFLCBzZWxmLm9sZHBhcmFtcykKKyAgICAgICAgICAgIHNlbGYub2xkcGFyYW1zID0gW10KKworICAgIGRlZiB3YWl0KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5wb3J0OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIHdoaWxlIHNlbGYucG9ydC5nZXRmaWxsZWQoKSA+IDA6CisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAgICAgc2VsZi5zdG9wKCkKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnBvcnQ6CisgICAgICAgICAgICBzZWxmLnBvcnQuY2xvc2Vwb3J0KCkKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5vbGRwYXJhbXM6CisgICAgICAgICAgICBpbXBvcnQgYWwsIEFMCisgICAgICAgICAgICBhbC5zZXRwYXJhbXMoQUwuREVGQVVMVF9ERVZJQ0UsIHNlbGYub2xkcGFyYW1zKQorICAgICAgICAgICAgc2VsZi5vbGRwYXJhbXMgPSBbXQorCisgICAgZGVmIHNldG91dHJhdGUoc2VsZiwgcmF0ZSk6CisgICAgICAgIGZvciAocmF3LCBjb29rZWQpIGluIHNlbGYuZnJhbWVyYXRlbGlzdDoKKyAgICAgICAgICAgIGlmIHJhdGUgPT0gcmF3OgorICAgICAgICAgICAgICAgIHNlbGYucGFyYW1zWzFdID0gY29va2VkCisgICAgICAgICAgICAgICAgc2VsZi5pbml0ZWRfb3V0cmF0ZSA9IDEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsICdiYWQgb3V0cHV0IHJhdGUnCisKKyAgICBkZWYgc2V0c2FtcHdpZHRoKHNlbGYsIHdpZHRoKToKKyAgICAgICAgZm9yIChyYXcsIGNvb2tlZCkgaW4gc2VsZi5zYW1wd2lkdGhsaXN0OgorICAgICAgICAgICAgaWYgd2lkdGggPT0gcmF3OgorICAgICAgICAgICAgICAgIHNlbGYuY29uZmlnLnNldHdpZHRoKGNvb2tlZCkKKyAgICAgICAgICAgICAgICBzZWxmLmluaXRlZF93aWR0aCA9IDEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgd2lkdGggPT0gMDoKKyAgICAgICAgICAgICAgICBpbXBvcnQgQUwKKyAgICAgICAgICAgICAgICBzZWxmLmluaXRlZF93aWR0aCA9IDAKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5zZXR3aWR0aChBTC5TQU1QTEVfMTYpCisgICAgICAgICAgICAgICAgc2VsZi5jb252ZXJ0ZXIgPSBzZWxmLnVsYXcybGluCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAnYmFkIHNhbXBsZSB3aWR0aCcKKworICAgIGRlZiBzZXRuY2hhbm5lbHMoc2VsZiwgbmNoYW5uZWxzKToKKyAgICAgICAgZm9yIChyYXcsIGNvb2tlZCkgaW4gc2VsZi5uY2hhbm5lbHNsaXN0OgorICAgICAgICAgICAgaWYgbmNoYW5uZWxzID09IHJhdzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZy5zZXRjaGFubmVscyhjb29rZWQpCisgICAgICAgICAgICAgICAgc2VsZi5pbml0ZWRfbmNoYW5uZWxzID0gMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgJ2JhZCAjIG9mIGNoYW5uZWxzJworCisgICAgZGVmIHdyaXRlZnJhbWVzKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBub3QgKHNlbGYuaW5pdGVkX291dHJhdGUgYW5kIHNlbGYuaW5pdGVkX25jaGFubmVscyk6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgJ3BhcmFtcyBub3Qgc3BlY2lmaWVkJworICAgICAgICBpZiBub3Qgc2VsZi5wb3J0OgorICAgICAgICAgICAgaW1wb3J0IGFsLCBBTAorICAgICAgICAgICAgc2VsZi5wb3J0ID0gYWwub3BlbnBvcnQoJ1B5dGhvbicsICd3Jywgc2VsZi5jb25maWcpCisgICAgICAgICAgICBzZWxmLm9sZHBhcmFtcyA9IHNlbGYucGFyYW1zWzpdCisgICAgICAgICAgICBhbC5nZXRwYXJhbXMoQUwuREVGQVVMVF9ERVZJQ0UsIHNlbGYub2xkcGFyYW1zKQorICAgICAgICAgICAgYWwuc2V0cGFyYW1zKEFMLkRFRkFVTFRfREVWSUNFLCBzZWxmLnBhcmFtcykKKyAgICAgICAgaWYgc2VsZi5jb252ZXJ0ZXI6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5jb252ZXJ0ZXIoZGF0YSkKKyAgICAgICAgc2VsZi5wb3J0LndyaXRlc2FtcHMoZGF0YSkKKworICAgIGRlZiBnZXRmaWxsZWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYucG9ydDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBvcnQuZ2V0ZmlsbGVkKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgZ2V0ZmlsbGFibGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYucG9ydDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBvcnQuZ2V0ZmlsbGFibGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlnLmdldHF1ZXVlc2l6ZSgpCisKKyAgICAjIHByaXZhdGUgbWV0aG9kcworIyMgICAgICBpZiAwOiBhY2Nlc3MgKjogcHJpdmF0ZQorCisgICAgZGVmIHVsYXcybGluKHNlbGYsIGRhdGEpOgorICAgICAgICBpbXBvcnQgYXVkaW9vcAorICAgICAgICByZXR1cm4gYXVkaW9vcC51bGF3MmxpbihkYXRhLCAyKQorCitjbGFzcyBQbGF5X0F1ZGlvX3N1bjoKKyMjICAgICAgaWYgMDogYWNjZXNzIG91dHJhdGUsIHNhbXB3aWR0aCwgbmNoYW5uZWxzLCBpbml0ZWRfb3V0cmF0ZSwgaW5pdGVkX3dpZHRoLCBcCisjIyAgICAgICAgICAgICAgICBpbml0ZWRfbmNoYW5uZWxzLCBjb252ZXJ0ZXI6IHByaXZhdGUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5vdXRyYXRlID0gMAorICAgICAgICBzZWxmLnNhbXB3aWR0aCA9IDAKKyAgICAgICAgc2VsZi5uY2hhbm5lbHMgPSAwCisgICAgICAgIHNlbGYuaW5pdGVkX291dHJhdGUgPSAwCisgICAgICAgIHNlbGYuaW5pdGVkX3dpZHRoID0gMAorICAgICAgICBzZWxmLmluaXRlZF9uY2hhbm5lbHMgPSAwCisgICAgICAgIHNlbGYuY29udmVydGVyID0gTm9uZQorICAgICAgICBzZWxmLnBvcnQgPSBOb25lCisgICAgICAgIHJldHVybgorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHNlbGYuc3RvcCgpCisKKyAgICBkZWYgc2V0b3V0cmF0ZShzZWxmLCByYXRlKToKKyAgICAgICAgc2VsZi5vdXRyYXRlID0gcmF0ZQorICAgICAgICBzZWxmLmluaXRlZF9vdXRyYXRlID0gMQorCisgICAgZGVmIHNldHNhbXB3aWR0aChzZWxmLCB3aWR0aCk6CisgICAgICAgIHNlbGYuc2FtcHdpZHRoID0gd2lkdGgKKyAgICAgICAgc2VsZi5pbml0ZWRfd2lkdGggPSAxCisKKyAgICBkZWYgc2V0bmNoYW5uZWxzKHNlbGYsIG5jaGFubmVscyk6CisgICAgICAgIHNlbGYubmNoYW5uZWxzID0gbmNoYW5uZWxzCisgICAgICAgIHNlbGYuaW5pdGVkX25jaGFubmVscyA9IDEKKworICAgIGRlZiB3cml0ZWZyYW1lcyhzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgbm90IChzZWxmLmluaXRlZF9vdXRyYXRlIGFuZCBzZWxmLmluaXRlZF93aWR0aCBhbmQgc2VsZi5pbml0ZWRfbmNoYW5uZWxzKToKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCAncGFyYW1zIG5vdCBzcGVjaWZpZWQnCisgICAgICAgIGlmIG5vdCBzZWxmLnBvcnQ6CisgICAgICAgICAgICBpbXBvcnQgc3VuYXVkaW9kZXYsIFNVTkFVRElPREVWCisgICAgICAgICAgICBzZWxmLnBvcnQgPSBzdW5hdWRpb2Rldi5vcGVuKCd3JykKKyAgICAgICAgICAgIGluZm8gPSBzZWxmLnBvcnQuZ2V0aW5mbygpCisgICAgICAgICAgICBpbmZvLm9fc2FtcGxlX3JhdGUgPSBzZWxmLm91dHJhdGUKKyAgICAgICAgICAgIGluZm8ub19jaGFubmVscyA9IHNlbGYubmNoYW5uZWxzCisgICAgICAgICAgICBpZiBzZWxmLnNhbXB3aWR0aCA9PSAwOgorICAgICAgICAgICAgICAgIGluZm8ub19wcmVjaXNpb24gPSA4CisgICAgICAgICAgICAgICAgc2VsZi5vX2VuY29kaW5nID0gU1VOQVVESU9ERVYuRU5DT0RJTkdfVUxBVworICAgICAgICAgICAgICAgICMgWFhYIEhhY2ssIGhhY2sgLS0gbGVhdmUgZGVmYXVsdHMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaW5mby5vX3ByZWNpc2lvbiA9IDggKiBzZWxmLnNhbXB3aWR0aAorICAgICAgICAgICAgICAgIGluZm8ub19lbmNvZGluZyA9IFNVTkFVRElPREVWLkVOQ09ESU5HX0xJTkVBUgorICAgICAgICAgICAgICAgIHNlbGYucG9ydC5zZXRpbmZvKGluZm8pCisgICAgICAgIGlmIHNlbGYuY29udmVydGVyOgorICAgICAgICAgICAgZGF0YSA9IHNlbGYuY29udmVydGVyKGRhdGEpCisgICAgICAgIHNlbGYucG9ydC53cml0ZShkYXRhKQorCisgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnBvcnQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5wb3J0LmRyYWluKCkKKyAgICAgICAgc2VsZi5zdG9wKCkKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnBvcnQ6CisgICAgICAgICAgICBzZWxmLnBvcnQuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5wb3J0LmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IE5vbmUKKworICAgIGRlZiBnZXRmaWxsZWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYucG9ydDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBvcnQub2J1ZmNvdW50KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAwCisKKyMjICAgICMgTm9ib2R5IHJlbWVtYmVycyB3aGF0IHRoaXMgbWV0aG9kIGRvZXMsIGFuZCBpdCdzIGJyb2tlbi4gOi0oCisjIyAgICBkZWYgZ2V0ZmlsbGFibGUoc2VsZik6CisjIyAgICAgICAgcmV0dXJuIEJVRkZFUlNJWkUgLSBzZWxmLmdldGZpbGxlZCgpCisKK2RlZiBBdWRpb0RldigpOgorICAgICMgRHluYW1pY2FsbHkgdHJ5IHRvIGltcG9ydCBhbmQgdXNlIGEgcGxhdGZvcm0gc3BlY2lmaWMgbW9kdWxlLgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGFsCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgc3VuYXVkaW9kZXYKKyAgICAgICAgICAgIHJldHVybiBQbGF5X0F1ZGlvX3N1bigpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgQXVkaW9fbWFjCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICdubyBhdWRpbyBkZXZpY2UnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBBdWRpb19tYWMuUGxheV9BdWRpb19tYWMoKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBQbGF5X0F1ZGlvX3NnaSgpCisKK2RlZiB0ZXN0KGZuID0gTm9uZSk6CisgICAgaW1wb3J0IHN5cworICAgIGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgZm4gPSBzeXMuYXJndlsxXQorICAgIGVsc2U6CisgICAgICAgIGZuID0gJ2Y6anVzdCBzYW1wbGVzOmp1c3QuYWlmJworICAgIGltcG9ydCBhaWZjCisgICAgYWYgPSBhaWZjLm9wZW4oZm4sICdyJykKKyAgICBwcmludCBmbiwgYWYuZ2V0cGFyYW1zKCkKKyAgICBwID0gQXVkaW9EZXYoKQorICAgIHAuc2V0b3V0cmF0ZShhZi5nZXRmcmFtZXJhdGUoKSkKKyAgICBwLnNldHNhbXB3aWR0aChhZi5nZXRzYW1wd2lkdGgoKSkKKyAgICBwLnNldG5jaGFubmVscyhhZi5nZXRuY2hhbm5lbHMoKSkKKyAgICBCVUZTSVogPSBhZi5nZXRmcmFtZXJhdGUoKS9hZi5nZXRzYW1wd2lkdGgoKS9hZi5nZXRuY2hhbm5lbHMoKQorICAgIHdoaWxlIDE6CisgICAgICAgIGRhdGEgPSBhZi5yZWFkZnJhbWVzKEJVRlNJWikKKyAgICAgICAgaWYgbm90IGRhdGE6IGJyZWFrCisgICAgICAgIHByaW50IGxlbihkYXRhKQorICAgICAgICBwLndyaXRlZnJhbWVzKGRhdGEpCisgICAgcC53YWl0KCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYXVkaW9kZXYucHljIGIvbGliL3B5dGhvbjIuNy9hdWRpb2Rldi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxZDQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYXVkaW9kZXYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYXVkaW9kZXYucHlvIGIvbGliL3B5dGhvbjIuNy9hdWRpb2Rldi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIxZDQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYXVkaW9kZXYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYmFzZTY0LnB5IGIvbGliL3B5dGhvbjIuNy9iYXNlNjQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODUyMDRkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYmFzZTY0LnB5CkBAIC0wLDAgKzEsMzYwIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIlJGQyAzNTQ4OiBCYXNlMTYsIEJhc2UzMiwgQmFzZTY0IERhdGEgRW5jb2RpbmdzIiIiCisKKyMgTW9kaWZpZWQgMDQtT2N0LTE5OTUgYnkgSmFjayBKYW5zZW4gdG8gdXNlIGJpbmFzY2lpIG1vZHVsZQorIyBNb2RpZmllZCAzMC1EZWMtMjAwMyBieSBCYXJyeSBXYXJzYXcgdG8gYWRkIGZ1bGwgUkZDIDM1NDggc3VwcG9ydAorCitpbXBvcnQgcmUKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBiaW5hc2NpaQorCisKK19fYWxsX18gPSBbCisgICAgIyBMZWdhY3kgaW50ZXJmYWNlIGV4cG9ydHMgdHJhZGl0aW9uYWwgUkZDIDE1MjEgQmFzZTY0IGVuY29kaW5ncworICAgICdlbmNvZGUnLCAnZGVjb2RlJywgJ2VuY29kZXN0cmluZycsICdkZWNvZGVzdHJpbmcnLAorICAgICMgR2VuZXJhbGl6ZWQgaW50ZXJmYWNlIGZvciBvdGhlciBlbmNvZGluZ3MKKyAgICAnYjY0ZW5jb2RlJywgJ2I2NGRlY29kZScsICdiMzJlbmNvZGUnLCAnYjMyZGVjb2RlJywKKyAgICAnYjE2ZW5jb2RlJywgJ2IxNmRlY29kZScsCisgICAgIyBTdGFuZGFyZCBCYXNlNjQgZW5jb2RpbmcKKyAgICAnc3RhbmRhcmRfYjY0ZW5jb2RlJywgJ3N0YW5kYXJkX2I2NGRlY29kZScsCisgICAgIyBTb21lIGNvbW1vbiBCYXNlNjQgYWx0ZXJuYXRpdmVzLiAgQXMgcmVmZXJlbmNlZCBieSBSRkMgMzQ1OCwgc2VlIHRocmVhZAorICAgICMgc3RhcnRpbmcgYXQ6CisgICAgIworICAgICMgaHR0cDovL3pncC5vcmcvcGlwZXJtYWlsL3AycC1oYWNrZXJzLzIwMDEtU2VwdGVtYmVyLzAwMDMxNi5odG1sCisgICAgJ3VybHNhZmVfYjY0ZW5jb2RlJywgJ3VybHNhZmVfYjY0ZGVjb2RlJywKKyAgICBdCisKK190cmFuc2xhdGlvbiA9IFtjaHIoX3gpIGZvciBfeCBpbiByYW5nZSgyNTYpXQorRU1QVFlTVFJJTkcgPSAnJworCisKK2RlZiBfdHJhbnNsYXRlKHMsIGFsdGNoYXJzKToKKyAgICB0cmFuc2xhdGlvbiA9IF90cmFuc2xhdGlvbls6XQorICAgIGZvciBrLCB2IGluIGFsdGNoYXJzLml0ZW1zKCk6CisgICAgICAgIHRyYW5zbGF0aW9uW29yZChrKV0gPSB2CisgICAgcmV0dXJuIHMudHJhbnNsYXRlKCcnLmpvaW4odHJhbnNsYXRpb24pKQorCisKKwwKKyMgQmFzZTY0IGVuY29kaW5nL2RlY29kaW5nIHVzZXMgYmluYXNjaWkKKworZGVmIGI2NGVuY29kZShzLCBhbHRjaGFycz1Ob25lKToKKyAgICAiIiJFbmNvZGUgYSBzdHJpbmcgdXNpbmcgQmFzZTY0LgorCisgICAgcyBpcyB0aGUgc3RyaW5nIHRvIGVuY29kZS4gIE9wdGlvbmFsIGFsdGNoYXJzIG11c3QgYmUgYSBzdHJpbmcgb2YgYXQgbGVhc3QKKyAgICBsZW5ndGggMiAoYWRkaXRpb25hbCBjaGFyYWN0ZXJzIGFyZSBpZ25vcmVkKSB3aGljaCBzcGVjaWZpZXMgYW4KKyAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldCBmb3IgdGhlICcrJyBhbmQgJy8nIGNoYXJhY3RlcnMuICBUaGlzIGFsbG93cyBhbgorICAgIGFwcGxpY2F0aW9uIHRvIGUuZy4gZ2VuZXJhdGUgdXJsIG9yIGZpbGVzeXN0ZW0gc2FmZSBCYXNlNjQgc3RyaW5ncy4KKworICAgIFRoZSBlbmNvZGVkIHN0cmluZyBpcyByZXR1cm5lZC4KKyAgICAiIiIKKyAgICAjIFN0cmlwIG9mZiB0aGUgdHJhaWxpbmcgbmV3bGluZQorICAgIGVuY29kZWQgPSBiaW5hc2NpaS5iMmFfYmFzZTY0KHMpWzotMV0KKyAgICBpZiBhbHRjaGFycyBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIF90cmFuc2xhdGUoZW5jb2RlZCwgeycrJzogYWx0Y2hhcnNbMF0sICcvJzogYWx0Y2hhcnNbMV19KQorICAgIHJldHVybiBlbmNvZGVkCisKKworZGVmIGI2NGRlY29kZShzLCBhbHRjaGFycz1Ob25lKToKKyAgICAiIiJEZWNvZGUgYSBCYXNlNjQgZW5jb2RlZCBzdHJpbmcuCisKKyAgICBzIGlzIHRoZSBzdHJpbmcgdG8gZGVjb2RlLiAgT3B0aW9uYWwgYWx0Y2hhcnMgbXVzdCBiZSBhIHN0cmluZyBvZiBhdCBsZWFzdAorICAgIGxlbmd0aCAyIChhZGRpdGlvbmFsIGNoYXJhY3RlcnMgYXJlIGlnbm9yZWQpIHdoaWNoIHNwZWNpZmllcyB0aGUKKyAgICBhbHRlcm5hdGl2ZSBhbHBoYWJldCB1c2VkIGluc3RlYWQgb2YgdGhlICcrJyBhbmQgJy8nIGNoYXJhY3RlcnMuCisKKyAgICBUaGUgZGVjb2RlZCBzdHJpbmcgaXMgcmV0dXJuZWQuICBBIFR5cGVFcnJvciBpcyByYWlzZWQgaWYgcyB3ZXJlCisgICAgaW5jb3JyZWN0bHkgcGFkZGVkIG9yIGlmIHRoZXJlIGFyZSBub24tYWxwaGFiZXQgY2hhcmFjdGVycyBwcmVzZW50IGluIHRoZQorICAgIHN0cmluZy4KKyAgICAiIiIKKyAgICBpZiBhbHRjaGFycyBpcyBub3QgTm9uZToKKyAgICAgICAgcyA9IF90cmFuc2xhdGUocywge2FsdGNoYXJzWzBdOiAnKycsIGFsdGNoYXJzWzFdOiAnLyd9KQorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGJpbmFzY2lpLmEyYl9iYXNlNjQocykKKyAgICBleGNlcHQgYmluYXNjaWkuRXJyb3IsIG1zZzoKKyAgICAgICAgIyBUcmFuc2Zvcm0gdGhpcyBleGNlcHRpb24gZm9yIGNvbnNpc3RlbmN5CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcihtc2cpCisKKworZGVmIHN0YW5kYXJkX2I2NGVuY29kZShzKToKKyAgICAiIiJFbmNvZGUgYSBzdHJpbmcgdXNpbmcgdGhlIHN0YW5kYXJkIEJhc2U2NCBhbHBoYWJldC4KKworICAgIHMgaXMgdGhlIHN0cmluZyB0byBlbmNvZGUuICBUaGUgZW5jb2RlZCBzdHJpbmcgaXMgcmV0dXJuZWQuCisgICAgIiIiCisgICAgcmV0dXJuIGI2NGVuY29kZShzKQorCitkZWYgc3RhbmRhcmRfYjY0ZGVjb2RlKHMpOgorICAgICIiIkRlY29kZSBhIHN0cmluZyBlbmNvZGVkIHdpdGggdGhlIHN0YW5kYXJkIEJhc2U2NCBhbHBoYWJldC4KKworICAgIHMgaXMgdGhlIHN0cmluZyB0byBkZWNvZGUuICBUaGUgZGVjb2RlZCBzdHJpbmcgaXMgcmV0dXJuZWQuICBBIFR5cGVFcnJvcgorICAgIGlzIHJhaXNlZCBpZiB0aGUgc3RyaW5nIGlzIGluY29ycmVjdGx5IHBhZGRlZCBvciBpZiB0aGVyZSBhcmUgbm9uLWFscGhhYmV0CisgICAgY2hhcmFjdGVycyBwcmVzZW50IGluIHRoZSBzdHJpbmcuCisgICAgIiIiCisgICAgcmV0dXJuIGI2NGRlY29kZShzKQorCitkZWYgdXJsc2FmZV9iNjRlbmNvZGUocyk6CisgICAgIiIiRW5jb2RlIGEgc3RyaW5nIHVzaW5nIGEgdXJsLXNhZmUgQmFzZTY0IGFscGhhYmV0LgorCisgICAgcyBpcyB0aGUgc3RyaW5nIHRvIGVuY29kZS4gIFRoZSBlbmNvZGVkIHN0cmluZyBpcyByZXR1cm5lZC4gIFRoZSBhbHBoYWJldAorICAgIHVzZXMgJy0nIGluc3RlYWQgb2YgJysnIGFuZCAnXycgaW5zdGVhZCBvZiAnLycuCisgICAgIiIiCisgICAgcmV0dXJuIGI2NGVuY29kZShzLCAnLV8nKQorCitkZWYgdXJsc2FmZV9iNjRkZWNvZGUocyk6CisgICAgIiIiRGVjb2RlIGEgc3RyaW5nIGVuY29kZWQgd2l0aCB0aGUgc3RhbmRhcmQgQmFzZTY0IGFscGhhYmV0LgorCisgICAgcyBpcyB0aGUgc3RyaW5nIHRvIGRlY29kZS4gIFRoZSBkZWNvZGVkIHN0cmluZyBpcyByZXR1cm5lZC4gIEEgVHlwZUVycm9yCisgICAgaXMgcmFpc2VkIGlmIHRoZSBzdHJpbmcgaXMgaW5jb3JyZWN0bHkgcGFkZGVkIG9yIGlmIHRoZXJlIGFyZSBub24tYWxwaGFiZXQKKyAgICBjaGFyYWN0ZXJzIHByZXNlbnQgaW4gdGhlIHN0cmluZy4KKworICAgIFRoZSBhbHBoYWJldCB1c2VzICctJyBpbnN0ZWFkIG9mICcrJyBhbmQgJ18nIGluc3RlYWQgb2YgJy8nLgorICAgICIiIgorICAgIHJldHVybiBiNjRkZWNvZGUocywgJy1fJykKKworCisMCisjIEJhc2UzMiBlbmNvZGluZy9kZWNvZGluZyBtdXN0IGJlIGRvbmUgaW4gUHl0aG9uCitfYjMyYWxwaGFiZXQgPSB7CisgICAgMDogJ0EnLCAgOTogJ0onLCAxODogJ1MnLCAyNzogJzMnLAorICAgIDE6ICdCJywgMTA6ICdLJywgMTk6ICdUJywgMjg6ICc0JywKKyAgICAyOiAnQycsIDExOiAnTCcsIDIwOiAnVScsIDI5OiAnNScsCisgICAgMzogJ0QnLCAxMjogJ00nLCAyMTogJ1YnLCAzMDogJzYnLAorICAgIDQ6ICdFJywgMTM6ICdOJywgMjI6ICdXJywgMzE6ICc3JywKKyAgICA1OiAnRicsIDE0OiAnTycsIDIzOiAnWCcsCisgICAgNjogJ0cnLCAxNTogJ1AnLCAyNDogJ1knLAorICAgIDc6ICdIJywgMTY6ICdRJywgMjU6ICdaJywKKyAgICA4OiAnSScsIDE3OiAnUicsIDI2OiAnMicsCisgICAgfQorCitfYjMydGFiID0gX2IzMmFscGhhYmV0Lml0ZW1zKCkKK19iMzJ0YWIuc29ydCgpCitfYjMydGFiID0gW3YgZm9yIGssIHYgaW4gX2IzMnRhYl0KK19iMzJyZXYgPSBkaWN0KFsodiwgbG9uZyhrKSkgZm9yIGssIHYgaW4gX2IzMmFscGhhYmV0Lml0ZW1zKCldKQorCisKK2RlZiBiMzJlbmNvZGUocyk6CisgICAgIiIiRW5jb2RlIGEgc3RyaW5nIHVzaW5nIEJhc2UzMi4KKworICAgIHMgaXMgdGhlIHN0cmluZyB0byBlbmNvZGUuICBUaGUgZW5jb2RlZCBzdHJpbmcgaXMgcmV0dXJuZWQuCisgICAgIiIiCisgICAgcGFydHMgPSBbXQorICAgIHF1YW50YSwgbGVmdG92ZXIgPSBkaXZtb2QobGVuKHMpLCA1KQorICAgICMgUGFkIHRoZSBsYXN0IHF1YW50dW0gd2l0aCB6ZXJvIGJpdHMgaWYgbmVjZXNzYXJ5CisgICAgaWYgbGVmdG92ZXI6CisgICAgICAgIHMgKz0gKCdcMCcgKiAoNSAtIGxlZnRvdmVyKSkKKyAgICAgICAgcXVhbnRhICs9IDEKKyAgICBmb3IgaSBpbiByYW5nZShxdWFudGEpOgorICAgICAgICAjIGMxIGFuZCBjMiBhcmUgMTYgYml0cyB3aWRlLCBjMyBpcyA4IGJpdHMgd2lkZS4gIFRoZSBpbnRlbnQgb2YgdGhpcworICAgICAgICAjIGNvZGUgaXMgdG8gcHJvY2VzcyB0aGUgNDAgYml0cyBpbiB1bml0cyBvZiA1IGJpdHMuICBTbyB3ZSB0YWtlIHRoZSAxCisgICAgICAgICMgbGVmdG92ZXIgYml0IG9mIGMxIGFuZCB0YWNrIGl0IG9udG8gYzIuICBUaGVuIHdlIHRha2UgdGhlIDIgbGVmdG92ZXIKKyAgICAgICAgIyBiaXRzIG9mIGMyIGFuZCB0YWNrIHRoZW0gb250byBjMy4gIFRoZSBzaGlmdHMgYW5kIG1hc2tzIGFyZSBpbnRlbmRlZAorICAgICAgICAjIHRvIGdpdmUgdXMgdmFsdWVzIG9mIGV4YWN0bHkgNSBiaXRzIGluIHdpZHRoLgorICAgICAgICBjMSwgYzIsIGMzID0gc3RydWN0LnVucGFjaygnIUhIQicsIHNbaSo1OihpKzEpKjVdKQorICAgICAgICBjMiArPSAoYzEgJiAxKSA8PCAxNiAjIDE3IGJpdHMgd2lkZQorICAgICAgICBjMyArPSAoYzIgJiAzKSA8PCA4ICAjIDEwIGJpdHMgd2lkZQorICAgICAgICBwYXJ0cy5leHRlbmQoW19iMzJ0YWJbYzEgPj4gMTFdLCAgICAgICAgICMgYml0cyAxIC0gNQorICAgICAgICAgICAgICAgICAgICAgIF9iMzJ0YWJbKGMxID4+IDYpICYgMHgxZl0sICMgYml0cyA2IC0gMTAKKyAgICAgICAgICAgICAgICAgICAgICBfYjMydGFiWyhjMSA+PiAxKSAmIDB4MWZdLCAjIGJpdHMgMTEgLSAxNQorICAgICAgICAgICAgICAgICAgICAgIF9iMzJ0YWJbYzIgPj4gMTJdLCAgICAgICAgICMgYml0cyAxNiAtIDIwICgxIC0gNSkKKyAgICAgICAgICAgICAgICAgICAgICBfYjMydGFiWyhjMiA+PiA3KSAmIDB4MWZdLCAjIGJpdHMgMjEgLSAyNSAoNiAtIDEwKQorICAgICAgICAgICAgICAgICAgICAgIF9iMzJ0YWJbKGMyID4+IDIpICYgMHgxZl0sICMgYml0cyAyNiAtIDMwICgxMSAtIDE1KQorICAgICAgICAgICAgICAgICAgICAgIF9iMzJ0YWJbYzMgPj4gNV0sICAgICAgICAgICMgYml0cyAzMSAtIDM1ICgxIC0gNSkKKyAgICAgICAgICAgICAgICAgICAgICBfYjMydGFiW2MzICYgMHgxZl0sICAgICAgICAjIGJpdHMgMzYgLSA0MCAoMSAtIDUpCisgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICBlbmNvZGVkID0gRU1QVFlTVFJJTkcuam9pbihwYXJ0cykKKyAgICAjIEFkanVzdCBmb3IgYW55IGxlZnRvdmVyIHBhcnRpYWwgcXVhbnRhCisgICAgaWYgbGVmdG92ZXIgPT0gMToKKyAgICAgICAgcmV0dXJuIGVuY29kZWRbOi02XSArICc9PT09PT0nCisgICAgZWxpZiBsZWZ0b3ZlciA9PSAyOgorICAgICAgICByZXR1cm4gZW5jb2RlZFs6LTRdICsgJz09PT0nCisgICAgZWxpZiBsZWZ0b3ZlciA9PSAzOgorICAgICAgICByZXR1cm4gZW5jb2RlZFs6LTNdICsgJz09PScKKyAgICBlbGlmIGxlZnRvdmVyID09IDQ6CisgICAgICAgIHJldHVybiBlbmNvZGVkWzotMV0gKyAnPScKKyAgICByZXR1cm4gZW5jb2RlZAorCisKK2RlZiBiMzJkZWNvZGUocywgY2FzZWZvbGQ9RmFsc2UsIG1hcDAxPU5vbmUpOgorICAgICIiIkRlY29kZSBhIEJhc2UzMiBlbmNvZGVkIHN0cmluZy4KKworICAgIHMgaXMgdGhlIHN0cmluZyB0byBkZWNvZGUuICBPcHRpb25hbCBjYXNlZm9sZCBpcyBhIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyCisgICAgYSBsb3dlcmNhc2UgYWxwaGFiZXQgaXMgYWNjZXB0YWJsZSBhcyBpbnB1dC4gIEZvciBzZWN1cml0eSBwdXJwb3NlcywgdGhlCisgICAgZGVmYXVsdCBpcyBGYWxzZS4KKworICAgIFJGQyAzNTQ4IGFsbG93cyBmb3Igb3B0aW9uYWwgbWFwcGluZyBvZiB0aGUgZGlnaXQgMCAoemVybykgdG8gdGhlIGxldHRlciBPCisgICAgKG9oKSwgYW5kIGZvciBvcHRpb25hbCBtYXBwaW5nIG9mIHRoZSBkaWdpdCAxIChvbmUpIHRvIGVpdGhlciB0aGUgbGV0dGVyIEkKKyAgICAoZXllKSBvciBsZXR0ZXIgTCAoZWwpLiAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IG1hcDAxIHdoZW4gbm90IE5vbmUsCisgICAgc3BlY2lmaWVzIHdoaWNoIGxldHRlciB0aGUgZGlnaXQgMSBzaG91bGQgYmUgbWFwcGVkIHRvICh3aGVuIG1hcDAxIGlzIG5vdAorICAgIE5vbmUsIHRoZSBkaWdpdCAwIGlzIGFsd2F5cyBtYXBwZWQgdG8gdGhlIGxldHRlciBPKS4gIEZvciBzZWN1cml0eQorICAgIHB1cnBvc2VzIHRoZSBkZWZhdWx0IGlzIE5vbmUsIHNvIHRoYXQgMCBhbmQgMSBhcmUgbm90IGFsbG93ZWQgaW4gdGhlCisgICAgaW5wdXQuCisKKyAgICBUaGUgZGVjb2RlZCBzdHJpbmcgaXMgcmV0dXJuZWQuICBBIFR5cGVFcnJvciBpcyByYWlzZWQgaWYgcyB3ZXJlCisgICAgaW5jb3JyZWN0bHkgcGFkZGVkIG9yIGlmIHRoZXJlIGFyZSBub24tYWxwaGFiZXQgY2hhcmFjdGVycyBwcmVzZW50IGluIHRoZQorICAgIHN0cmluZy4KKyAgICAiIiIKKyAgICBxdWFudGEsIGxlZnRvdmVyID0gZGl2bW9kKGxlbihzKSwgOCkKKyAgICBpZiBsZWZ0b3ZlcjoKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdJbmNvcnJlY3QgcGFkZGluZycpCisgICAgIyBIYW5kbGUgc2VjdGlvbiAyLjQgemVybyBhbmQgb25lIG1hcHBpbmcuICBUaGUgZmxhZyBtYXAwMSB3aWxsIGJlIGVpdGhlcgorICAgICMgRmFsc2UsIG9yIHRoZSBjaGFyYWN0ZXIgdG8gbWFwIHRoZSBkaWdpdCAxIChvbmUpIHRvLiAgSXQgc2hvdWxkIGJlCisgICAgIyBlaXRoZXIgTCAoZWwpIG9yIEkgKGV5ZSkuCisgICAgaWYgbWFwMDE6CisgICAgICAgIHMgPSBfdHJhbnNsYXRlKHMsIHsnMCc6ICdPJywgJzEnOiBtYXAwMX0pCisgICAgaWYgY2FzZWZvbGQ6CisgICAgICAgIHMgPSBzLnVwcGVyKCkKKyAgICAjIFN0cmlwIG9mZiBwYWQgY2hhcmFjdGVycyBmcm9tIHRoZSByaWdodC4gIFdlIG5lZWQgdG8gY291bnQgdGhlIHBhZAorICAgICMgY2hhcmFjdGVycyBiZWNhdXNlIHRoaXMgd2lsbCB0ZWxsIHVzIGhvdyBtYW55IG51bGwgYnl0ZXMgdG8gcmVtb3ZlIGZyb20KKyAgICAjIHRoZSBlbmQgb2YgdGhlIGRlY29kZWQgc3RyaW5nLgorICAgIHBhZGNoYXJzID0gMAorICAgIG1vID0gcmUuc2VhcmNoKCcoP1A8cGFkPls9XSopJCcsIHMpCisgICAgaWYgbW86CisgICAgICAgIHBhZGNoYXJzID0gbGVuKG1vLmdyb3VwKCdwYWQnKSkKKyAgICAgICAgaWYgcGFkY2hhcnMgPiAwOgorICAgICAgICAgICAgcyA9IHNbOi1wYWRjaGFyc10KKyAgICAjIE5vdyBkZWNvZGUgdGhlIGZ1bGwgcXVhbnRhCisgICAgcGFydHMgPSBbXQorICAgIGFjYyA9IDAKKyAgICBzaGlmdCA9IDM1CisgICAgZm9yIGMgaW4gczoKKyAgICAgICAgdmFsID0gX2IzMnJldi5nZXQoYykKKyAgICAgICAgaWYgdmFsIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ05vbi1iYXNlMzIgZGlnaXQgZm91bmQnKQorICAgICAgICBhY2MgKz0gX2IzMnJldltjXSA8PCBzaGlmdAorICAgICAgICBzaGlmdCAtPSA1CisgICAgICAgIGlmIHNoaWZ0IDwgMDoKKyAgICAgICAgICAgIHBhcnRzLmFwcGVuZChiaW5hc2NpaS51bmhleGxpZnkoJyUwMTB4JyAlIGFjYykpCisgICAgICAgICAgICBhY2MgPSAwCisgICAgICAgICAgICBzaGlmdCA9IDM1CisgICAgIyBQcm9jZXNzIHRoZSBsYXN0LCBwYXJ0aWFsIHF1YW50YQorICAgIGxhc3QgPSBiaW5hc2NpaS51bmhleGxpZnkoJyUwMTB4JyAlIGFjYykKKyAgICBpZiBwYWRjaGFycyA9PSAwOgorICAgICAgICBsYXN0ID0gJycgICAgICAgICAgICAgICAgICAgICAgICMgTm8gY2hhcmFjdGVycworICAgIGVsaWYgcGFkY2hhcnMgPT0gMToKKyAgICAgICAgbGFzdCA9IGxhc3RbOi0xXQorICAgIGVsaWYgcGFkY2hhcnMgPT0gMzoKKyAgICAgICAgbGFzdCA9IGxhc3RbOi0yXQorICAgIGVsaWYgcGFkY2hhcnMgPT0gNDoKKyAgICAgICAgbGFzdCA9IGxhc3RbOi0zXQorICAgIGVsaWYgcGFkY2hhcnMgPT0gNjoKKyAgICAgICAgbGFzdCA9IGxhc3RbOi00XQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignSW5jb3JyZWN0IHBhZGRpbmcnKQorICAgIHBhcnRzLmFwcGVuZChsYXN0KQorICAgIHJldHVybiBFTVBUWVNUUklORy5qb2luKHBhcnRzKQorCisKKwwKKyMgUkZDIDM1NDgsIEJhc2UgMTYgQWxwaGFiZXQgc3BlY2lmaWVzIHVwcGVyY2FzZSwgYnV0IGhleGxpZnkoKSByZXR1cm5zCisjIGxvd2VyY2FzZS4gIFRoZSBSRkMgYWxzbyByZWNvbW1lbmRzIGFnYWluc3QgYWNjZXB0aW5nIGlucHV0IGNhc2UKKyMgaW5zZW5zaXRpdmVseS4KK2RlZiBiMTZlbmNvZGUocyk6CisgICAgIiIiRW5jb2RlIGEgc3RyaW5nIHVzaW5nIEJhc2UxNi4KKworICAgIHMgaXMgdGhlIHN0cmluZyB0byBlbmNvZGUuICBUaGUgZW5jb2RlZCBzdHJpbmcgaXMgcmV0dXJuZWQuCisgICAgIiIiCisgICAgcmV0dXJuIGJpbmFzY2lpLmhleGxpZnkocykudXBwZXIoKQorCisKK2RlZiBiMTZkZWNvZGUocywgY2FzZWZvbGQ9RmFsc2UpOgorICAgICIiIkRlY29kZSBhIEJhc2UxNiBlbmNvZGVkIHN0cmluZy4KKworICAgIHMgaXMgdGhlIHN0cmluZyB0byBkZWNvZGUuICBPcHRpb25hbCBjYXNlZm9sZCBpcyBhIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyCisgICAgYSBsb3dlcmNhc2UgYWxwaGFiZXQgaXMgYWNjZXB0YWJsZSBhcyBpbnB1dC4gIEZvciBzZWN1cml0eSBwdXJwb3NlcywgdGhlCisgICAgZGVmYXVsdCBpcyBGYWxzZS4KKworICAgIFRoZSBkZWNvZGVkIHN0cmluZyBpcyByZXR1cm5lZC4gIEEgVHlwZUVycm9yIGlzIHJhaXNlZCBpZiBzIHdlcmUKKyAgICBpbmNvcnJlY3RseSBwYWRkZWQgb3IgaWYgdGhlcmUgYXJlIG5vbi1hbHBoYWJldCBjaGFyYWN0ZXJzIHByZXNlbnQgaW4gdGhlCisgICAgc3RyaW5nLgorICAgICIiIgorICAgIGlmIGNhc2Vmb2xkOgorICAgICAgICBzID0gcy51cHBlcigpCisgICAgaWYgcmUuc2VhcmNoKCdbXjAtOUEtRl0nLCBzKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdOb24tYmFzZTE2IGRpZ2l0IGZvdW5kJykKKyAgICByZXR1cm4gYmluYXNjaWkudW5oZXhsaWZ5KHMpCisKKworDAorIyBMZWdhY3kgaW50ZXJmYWNlLiAgVGhpcyBjb2RlIGNvdWxkIGJlIGNsZWFuZWQgdXAgc2luY2UgSSBkb24ndCBiZWxpZXZlCisjIGJpbmFzY2lpIGhhcyBhbnkgbGluZSBsZW5ndGggbGltaXRhdGlvbnMuICBJdCBqdXN0IGRvZXNuJ3Qgc2VlbSB3b3J0aCBpdAorIyB0aG91Z2guCisKK01BWExJTkVTSVpFID0gNzYgIyBFeGNsdWRpbmcgdGhlIENSTEYKK01BWEJJTlNJWkUgPSAoTUFYTElORVNJWkUvLzQpKjMKKworZGVmIGVuY29kZShpbnB1dCwgb3V0cHV0KToKKyAgICAiIiJFbmNvZGUgYSBmaWxlLiIiIgorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHMgPSBpbnB1dC5yZWFkKE1BWEJJTlNJWkUpCisgICAgICAgIGlmIG5vdCBzOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgd2hpbGUgbGVuKHMpIDwgTUFYQklOU0laRToKKyAgICAgICAgICAgIG5zID0gaW5wdXQucmVhZChNQVhCSU5TSVpFLWxlbihzKSkKKyAgICAgICAgICAgIGlmIG5vdCBuczoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcyArPSBucworICAgICAgICBsaW5lID0gYmluYXNjaWkuYjJhX2Jhc2U2NChzKQorICAgICAgICBvdXRwdXQud3JpdGUobGluZSkKKworCitkZWYgZGVjb2RlKGlucHV0LCBvdXRwdXQpOgorICAgICIiIkRlY29kZSBhIGZpbGUuIiIiCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgbGluZSA9IGlucHV0LnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBzID0gYmluYXNjaWkuYTJiX2Jhc2U2NChsaW5lKQorICAgICAgICBvdXRwdXQud3JpdGUocykKKworCitkZWYgZW5jb2Rlc3RyaW5nKHMpOgorICAgICIiIkVuY29kZSBhIHN0cmluZyBpbnRvIG11bHRpcGxlIGxpbmVzIG9mIGJhc2UtNjQgZGF0YS4iIiIKKyAgICBwaWVjZXMgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihzKSwgTUFYQklOU0laRSk6CisgICAgICAgIGNodW5rID0gc1tpIDogaSArIE1BWEJJTlNJWkVdCisgICAgICAgIHBpZWNlcy5hcHBlbmQoYmluYXNjaWkuYjJhX2Jhc2U2NChjaHVuaykpCisgICAgcmV0dXJuICIiLmpvaW4ocGllY2VzKQorCisKK2RlZiBkZWNvZGVzdHJpbmcocyk6CisgICAgIiIiRGVjb2RlIGEgc3RyaW5nLiIiIgorICAgIHJldHVybiBiaW5hc2NpaS5hMmJfYmFzZTY0KHMpCisKKworDAorIyBVc2VhYmxlIGFzIGEgc2NyaXB0Li4uCitkZWYgdGVzdCgpOgorICAgICIiIlNtYWxsIHRlc3QgcHJvZ3JhbSIiIgorICAgIGltcG9ydCBzeXMsIGdldG9wdAorICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnZGV1dCcpCisgICAgZXhjZXB0IGdldG9wdC5lcnJvciwgbXNnOgorICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLnN0ZGVycgorICAgICAgICBwcmludCBtc2cKKyAgICAgICAgcHJpbnQgIiIidXNhZ2U6ICVzIFstZHwtZXwtdXwtdF0gW2ZpbGV8LV0KKyAgICAgICAgLWQsIC11OiBkZWNvZGUKKyAgICAgICAgLWU6IGVuY29kZSAoZGVmYXVsdCkKKyAgICAgICAgLXQ6IGVuY29kZSBhbmQgZGVjb2RlIHN0cmluZyAnQWxhZGRpbjpvcGVuIHNlc2FtZSciIiIlc3lzLmFyZ3ZbMF0KKyAgICAgICAgc3lzLmV4aXQoMikKKyAgICBmdW5jID0gZW5jb2RlCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyA9PSAnLWUnOiBmdW5jID0gZW5jb2RlCisgICAgICAgIGlmIG8gPT0gJy1kJzogZnVuYyA9IGRlY29kZQorICAgICAgICBpZiBvID09ICctdSc6IGZ1bmMgPSBkZWNvZGUKKyAgICAgICAgaWYgbyA9PSAnLXQnOiB0ZXN0MSgpOyByZXR1cm4KKyAgICBpZiBhcmdzIGFuZCBhcmdzWzBdICE9ICctJzoKKyAgICAgICAgd2l0aCBvcGVuKGFyZ3NbMF0sICdyYicpIGFzIGY6CisgICAgICAgICAgICBmdW5jKGYsIHN5cy5zdGRvdXQpCisgICAgZWxzZToKKyAgICAgICAgZnVuYyhzeXMuc3RkaW4sIHN5cy5zdGRvdXQpCisKKworZGVmIHRlc3QxKCk6CisgICAgczAgPSAiQWxhZGRpbjpvcGVuIHNlc2FtZSIKKyAgICBzMSA9IGVuY29kZXN0cmluZyhzMCkKKyAgICBzMiA9IGRlY29kZXN0cmluZyhzMSkKKyAgICBwcmludCBzMCwgcmVwcihzMSksIHMyCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYmFzZTY0LnB5YyBiL2xpYi9weXRob24yLjcvYmFzZTY0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDE3MTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9iYXNlNjQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYmFzZTY0LnB5byBiL2xpYi9weXRob24yLjcvYmFzZTY0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDE3MTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9iYXNlNjQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYmRiLnB5IGIvbGliL3B5dGhvbjIuNy9iZGIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0NDBhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYmRiLnB5CkBAIC0wLDAgKzEsNjQ1IEBACisiIiJEZWJ1Z2dlciBiYXNpY3MiIiIKKworaW1wb3J0IGZubWF0Y2gKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHR5cGVzCisKK19fYWxsX18gPSBbIkJkYlF1aXQiLCJCZGIiLCJCcmVha3BvaW50Il0KKworY2xhc3MgQmRiUXVpdChFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiB0byBnaXZlIHVwIGNvbXBsZXRlbHkiIiIKKworCitjbGFzcyBCZGI6CisKKyAgICAiIiJHZW5lcmljIFB5dGhvbiBkZWJ1Z2dlciBiYXNlIGNsYXNzLgorCisgICAgVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mIGRldGFpbHMgb2YgdGhlIHRyYWNlIGZhY2lsaXR5OworICAgIGEgZGVyaXZlZCBjbGFzcyBzaG91bGQgaW1wbGVtZW50IHVzZXIgaW50ZXJhY3Rpb24uCisgICAgVGhlIHN0YW5kYXJkIGRlYnVnZ2VyIGNsYXNzIChwZGIuUGRiKSBpcyBhbiBleGFtcGxlLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNraXA9Tm9uZSk6CisgICAgICAgIHNlbGYuc2tpcCA9IHNldChza2lwKSBpZiBza2lwIGVsc2UgTm9uZQorICAgICAgICBzZWxmLmJyZWFrcyA9IHt9CisgICAgICAgIHNlbGYuZm5jYWNoZSA9IHt9CisgICAgICAgIHNlbGYuZnJhbWVfcmV0dXJuaW5nID0gTm9uZQorCisgICAgZGVmIGNhbm9uaWMoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBpZiBmaWxlbmFtZSA9PSAiPCIgKyBmaWxlbmFtZVsxOi0xXSArICI+IjoKKyAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQorICAgICAgICBjYW5vbmljID0gc2VsZi5mbmNhY2hlLmdldChmaWxlbmFtZSkKKyAgICAgICAgaWYgbm90IGNhbm9uaWM6CisgICAgICAgICAgICBjYW5vbmljID0gb3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKQorICAgICAgICAgICAgY2Fub25pYyA9IG9zLnBhdGgubm9ybWNhc2UoY2Fub25pYykKKyAgICAgICAgICAgIHNlbGYuZm5jYWNoZVtmaWxlbmFtZV0gPSBjYW5vbmljCisgICAgICAgIHJldHVybiBjYW5vbmljCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGltcG9ydCBsaW5lY2FjaGUKKyAgICAgICAgbGluZWNhY2hlLmNoZWNrY2FjaGUoKQorICAgICAgICBzZWxmLmJvdGZyYW1lID0gTm9uZQorICAgICAgICBzZWxmLl9zZXRfc3RvcGluZm8oTm9uZSwgTm9uZSkKKworICAgIGRlZiB0cmFjZV9kaXNwYXRjaChzZWxmLCBmcmFtZSwgZXZlbnQsIGFyZyk6CisgICAgICAgIGlmIHNlbGYucXVpdHRpbmc6CisgICAgICAgICAgICByZXR1cm4gIyBOb25lCisgICAgICAgIGlmIGV2ZW50ID09ICdsaW5lJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRpc3BhdGNoX2xpbmUoZnJhbWUpCisgICAgICAgIGlmIGV2ZW50ID09ICdjYWxsJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRpc3BhdGNoX2NhbGwoZnJhbWUsIGFyZykKKyAgICAgICAgaWYgZXZlbnQgPT0gJ3JldHVybic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNwYXRjaF9yZXR1cm4oZnJhbWUsIGFyZykKKyAgICAgICAgaWYgZXZlbnQgPT0gJ2V4Y2VwdGlvbic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNwYXRjaF9leGNlcHRpb24oZnJhbWUsIGFyZykKKyAgICAgICAgaWYgZXZlbnQgPT0gJ2NfY2FsbCc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAorICAgICAgICBpZiBldmVudCA9PSAnY19leGNlcHRpb24nOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhY2VfZGlzcGF0Y2gKKyAgICAgICAgaWYgZXZlbnQgPT0gJ2NfcmV0dXJuJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCisgICAgICAgIHByaW50ICdiZGIuQmRiLmRpc3BhdGNoOiB1bmtub3duIGRlYnVnZ2luZyBldmVudDonLCByZXByKGV2ZW50KQorICAgICAgICByZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAorCisgICAgZGVmIGRpc3BhdGNoX2xpbmUoc2VsZiwgZnJhbWUpOgorICAgICAgICBpZiBzZWxmLnN0b3BfaGVyZShmcmFtZSkgb3Igc2VsZi5icmVha19oZXJlKGZyYW1lKToKKyAgICAgICAgICAgIHNlbGYudXNlcl9saW5lKGZyYW1lKQorICAgICAgICAgICAgaWYgc2VsZi5xdWl0dGluZzogcmFpc2UgQmRiUXVpdAorICAgICAgICByZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAorCisgICAgZGVmIGRpc3BhdGNoX2NhbGwoc2VsZiwgZnJhbWUsIGFyZyk6CisgICAgICAgICMgWFhYICdhcmcnIGlzIG5vIGxvbmdlciB1c2VkCisgICAgICAgIGlmIHNlbGYuYm90ZnJhbWUgaXMgTm9uZToKKyAgICAgICAgICAgICMgRmlyc3QgY2FsbCBvZiBkaXNwYXRjaCBzaW5jZSByZXNldCgpCisgICAgICAgICAgICBzZWxmLmJvdGZyYW1lID0gZnJhbWUuZl9iYWNrICMgKENUKSBOb3RlIHRoYXQgdGhpcyBtYXkgYWxzbyBiZSBOb25lIQorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhY2VfZGlzcGF0Y2gKKyAgICAgICAgaWYgbm90IChzZWxmLnN0b3BfaGVyZShmcmFtZSkgb3Igc2VsZi5icmVha19hbnl3aGVyZShmcmFtZSkpOgorICAgICAgICAgICAgIyBObyBuZWVkIHRvIHRyYWNlIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAgIHJldHVybiAjIE5vbmUKKyAgICAgICAgc2VsZi51c2VyX2NhbGwoZnJhbWUsIGFyZykKKyAgICAgICAgaWYgc2VsZi5xdWl0dGluZzogcmFpc2UgQmRiUXVpdAorICAgICAgICByZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAorCisgICAgZGVmIGRpc3BhdGNoX3JldHVybihzZWxmLCBmcmFtZSwgYXJnKToKKyAgICAgICAgaWYgc2VsZi5zdG9wX2hlcmUoZnJhbWUpIG9yIGZyYW1lID09IHNlbGYucmV0dXJuZnJhbWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5mcmFtZV9yZXR1cm5pbmcgPSBmcmFtZQorICAgICAgICAgICAgICAgIHNlbGYudXNlcl9yZXR1cm4oZnJhbWUsIGFyZykKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2VsZi5mcmFtZV9yZXR1cm5pbmcgPSBOb25lCisgICAgICAgICAgICBpZiBzZWxmLnF1aXR0aW5nOiByYWlzZSBCZGJRdWl0CisgICAgICAgIHJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCisKKyAgICBkZWYgZGlzcGF0Y2hfZXhjZXB0aW9uKHNlbGYsIGZyYW1lLCBhcmcpOgorICAgICAgICBpZiBzZWxmLnN0b3BfaGVyZShmcmFtZSk6CisgICAgICAgICAgICBzZWxmLnVzZXJfZXhjZXB0aW9uKGZyYW1lLCBhcmcpCisgICAgICAgICAgICBpZiBzZWxmLnF1aXR0aW5nOiByYWlzZSBCZGJRdWl0CisgICAgICAgIHJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCisKKyAgICAjIE5vcm1hbGx5IGRlcml2ZWQgY2xhc3NlcyBkb24ndCBvdmVycmlkZSB0aGUgZm9sbG93aW5nCisgICAgIyBtZXRob2RzLCBidXQgdGhleSBtYXkgaWYgdGhleSB3YW50IHRvIHJlZGVmaW5lIHRoZQorICAgICMgZGVmaW5pdGlvbiBvZiBzdG9wcGluZyBhbmQgYnJlYWtwb2ludHMuCisKKyAgICBkZWYgaXNfc2tpcHBlZF9tb2R1bGUoc2VsZiwgbW9kdWxlX25hbWUpOgorICAgICAgICBmb3IgcGF0dGVybiBpbiBzZWxmLnNraXA6CisgICAgICAgICAgICBpZiBmbm1hdGNoLmZubWF0Y2gobW9kdWxlX25hbWUsIHBhdHRlcm4pOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHN0b3BfaGVyZShzZWxmLCBmcmFtZSk6CisgICAgICAgICMgKENUKSBzdG9wZnJhbWUgbWF5IG5vdyBhbHNvIGJlIE5vbmUsIHNlZSBkaXNwYXRjaF9jYWxsLgorICAgICAgICAjIChDVCkgdGhlIGZvcm1lciB0ZXN0IGZvciBOb25lIGlzIHRoZXJlZm9yZSByZW1vdmVkIGZyb20gaGVyZS4KKyAgICAgICAgaWYgc2VsZi5za2lwIGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLmlzX3NraXBwZWRfbW9kdWxlKGZyYW1lLmZfZ2xvYmFscy5nZXQoJ19fbmFtZV9fJykpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGZyYW1lIGlzIHNlbGYuc3RvcGZyYW1lOgorICAgICAgICAgICAgaWYgc2VsZi5zdG9wbGluZW5vID09IC0xOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIGZyYW1lLmZfbGluZW5vID49IHNlbGYuc3RvcGxpbmVubworICAgICAgICB3aGlsZSBmcmFtZSBpcyBub3QgTm9uZSBhbmQgZnJhbWUgaXMgbm90IHNlbGYuc3RvcGZyYW1lOgorICAgICAgICAgICAgaWYgZnJhbWUgaXMgc2VsZi5ib3RmcmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZnJhbWUgPSBmcmFtZS5mX2JhY2sKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgYnJlYWtfaGVyZShzZWxmLCBmcmFtZSk6CisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5jYW5vbmljKGZyYW1lLmZfY29kZS5jb19maWxlbmFtZSkKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lIGluIHNlbGYuYnJlYWtzOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGxpbmVubyA9IGZyYW1lLmZfbGluZW5vCisgICAgICAgIGlmIG5vdCBsaW5lbm8gaW4gc2VsZi5icmVha3NbZmlsZW5hbWVdOgorICAgICAgICAgICAgIyBUaGUgbGluZSBpdHNlbGYgaGFzIG5vIGJyZWFrcG9pbnQsIGJ1dCBtYXliZSB0aGUgbGluZSBpcyB0aGUKKyAgICAgICAgICAgICMgZmlyc3QgbGluZSBvZiBhIGZ1bmN0aW9uIHdpdGggYnJlYWtwb2ludCBzZXQgYnkgZnVuY3Rpb24gbmFtZS4KKyAgICAgICAgICAgIGxpbmVubyA9IGZyYW1lLmZfY29kZS5jb19maXJzdGxpbmVubworICAgICAgICAgICAgaWYgbm90IGxpbmVubyBpbiBzZWxmLmJyZWFrc1tmaWxlbmFtZV06CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgIyBmbGFnIHNheXMgb2sgdG8gZGVsZXRlIHRlbXAuIGJwCisgICAgICAgIChicCwgZmxhZykgPSBlZmZlY3RpdmUoZmlsZW5hbWUsIGxpbmVubywgZnJhbWUpCisgICAgICAgIGlmIGJwOgorICAgICAgICAgICAgc2VsZi5jdXJyZW50YnAgPSBicC5udW1iZXIKKyAgICAgICAgICAgIGlmIChmbGFnIGFuZCBicC50ZW1wb3JhcnkpOgorICAgICAgICAgICAgICAgIHNlbGYuZG9fY2xlYXIoc3RyKGJwLm51bWJlcikpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZG9fY2xlYXIoc2VsZiwgYXJnKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzIG9mIGJkYiBtdXN0IGltcGxlbWVudCBkb19jbGVhcigpIgorCisgICAgZGVmIGJyZWFrX2FueXdoZXJlKHNlbGYsIGZyYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2Fub25pYyhmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUpIGluIHNlbGYuYnJlYWtzCisKKyAgICAjIERlcml2ZWQgY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhlIHVzZXJfKiBtZXRob2RzCisgICAgIyB0byBnYWluIGNvbnRyb2wuCisKKyAgICBkZWYgdXNlcl9jYWxsKHNlbGYsIGZyYW1lLCBhcmd1bWVudF9saXN0KToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgdGhlIHJlbW90ZSBwb3NzaWJpbGl0eQorICAgICAgICB0aGF0IHdlIGV2ZXIgbmVlZCB0byBzdG9wIGluIHRoaXMgZnVuY3Rpb24uIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiB1c2VyX2xpbmUoc2VsZiwgZnJhbWUpOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB3ZSBzdG9wIG9yIGJyZWFrIGF0IHRoaXMgbGluZS4iIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIHVzZXJfcmV0dXJuKHNlbGYsIGZyYW1lLCByZXR1cm5fdmFsdWUpOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIHJldHVybiB0cmFwIGlzIHNldCBoZXJlLiIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdXNlcl9leGNlcHRpb24oc2VsZiwgZnJhbWUsIGV4Y19pbmZvKToKKyAgICAgICAgZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RyYWNlYmFjayA9IGV4Y19pbmZvCisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGNhbGxlZCBpZiBhbiBleGNlcHRpb24gb2NjdXJzLAorICAgICAgICBidXQgb25seSBpZiB3ZSBhcmUgdG8gc3RvcCBhdCBvciBqdXN0IGJlbG93IHRoaXMgbGV2ZWwuIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBfc2V0X3N0b3BpbmZvKHNlbGYsIHN0b3BmcmFtZSwgcmV0dXJuZnJhbWUsIHN0b3BsaW5lbm89MCk6CisgICAgICAgIHNlbGYuc3RvcGZyYW1lID0gc3RvcGZyYW1lCisgICAgICAgIHNlbGYucmV0dXJuZnJhbWUgPSByZXR1cm5mcmFtZQorICAgICAgICBzZWxmLnF1aXR0aW5nID0gMAorICAgICAgICAjIHN0b3BsaW5lbm8gPj0gMCBtZWFuczogc3RvcCBhdCBsaW5lID49IHRoZSBzdG9wbGluZW5vCisgICAgICAgICMgc3RvcGxpbmVubyAtMSBtZWFuczogZG9uJ3Qgc3RvcCBhdCBhbGwKKyAgICAgICAgc2VsZi5zdG9wbGluZW5vID0gc3RvcGxpbmVubworCisgICAgIyBEZXJpdmVkIGNsYXNzZXMgYW5kIGNsaWVudHMgY2FuIGNhbGwgdGhlIGZvbGxvd2luZyBtZXRob2RzCisgICAgIyB0byBhZmZlY3QgdGhlIHN0ZXBwaW5nIHN0YXRlLgorCisgICAgZGVmIHNldF91bnRpbChzZWxmLCBmcmFtZSk6ICN0aGUgbmFtZSAidW50aWwiIGlzIGJvcnJvd2VkIGZyb20gZ2RiCisgICAgICAgICIiIlN0b3Agd2hlbiB0aGUgbGluZSB3aXRoIHRoZSBsaW5lIG5vIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBvbmUgaXMKKyAgICAgICAgcmVhY2hlZCBvciB3aGVuIHJldHVybmluZyBmcm9tIGN1cnJlbnQgZnJhbWUiIiIKKyAgICAgICAgc2VsZi5fc2V0X3N0b3BpbmZvKGZyYW1lLCBmcmFtZSwgZnJhbWUuZl9saW5lbm8rMSkKKworICAgIGRlZiBzZXRfc3RlcChzZWxmKToKKyAgICAgICAgIiIiU3RvcCBhZnRlciBvbmUgbGluZSBvZiBjb2RlLiIiIgorICAgICAgICAjIElzc3VlICMxMzE4MzogcGRiIHNraXBzIGZyYW1lcyBhZnRlciBoaXR0aW5nIGEgYnJlYWtwb2ludCBhbmQgcnVubmluZworICAgICAgICAjIHN0ZXAgY29tbWFuZHMuCisgICAgICAgICMgUmVzdG9yZSB0aGUgdHJhY2UgZnVuY3Rpb24gaW4gdGhlIGNhbGxlciAodGhhdCBtYXkgbm90IGhhdmUgYmVlbiBzZXQKKyAgICAgICAgIyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucykgd2hlbiByZXR1cm5pbmcgZnJvbSB0aGUgY3VycmVudCBmcmFtZS4KKyAgICAgICAgaWYgc2VsZi5mcmFtZV9yZXR1cm5pbmc6CisgICAgICAgICAgICBjYWxsZXJfZnJhbWUgPSBzZWxmLmZyYW1lX3JldHVybmluZy5mX2JhY2sKKyAgICAgICAgICAgIGlmIGNhbGxlcl9mcmFtZSBhbmQgbm90IGNhbGxlcl9mcmFtZS5mX3RyYWNlOgorICAgICAgICAgICAgICAgIGNhbGxlcl9mcmFtZS5mX3RyYWNlID0gc2VsZi50cmFjZV9kaXNwYXRjaAorICAgICAgICBzZWxmLl9zZXRfc3RvcGluZm8oTm9uZSwgTm9uZSkKKworICAgIGRlZiBzZXRfbmV4dChzZWxmLCBmcmFtZSk6CisgICAgICAgICIiIlN0b3Agb24gdGhlIG5leHQgbGluZSBpbiBvciBiZWxvdyB0aGUgZ2l2ZW4gZnJhbWUuIiIiCisgICAgICAgIHNlbGYuX3NldF9zdG9waW5mbyhmcmFtZSwgTm9uZSkKKworICAgIGRlZiBzZXRfcmV0dXJuKHNlbGYsIGZyYW1lKToKKyAgICAgICAgIiIiU3RvcCB3aGVuIHJldHVybmluZyBmcm9tIHRoZSBnaXZlbiBmcmFtZS4iIiIKKyAgICAgICAgc2VsZi5fc2V0X3N0b3BpbmZvKGZyYW1lLmZfYmFjaywgZnJhbWUpCisKKyAgICBkZWYgc2V0X3RyYWNlKHNlbGYsIGZyYW1lPU5vbmUpOgorICAgICAgICAiIiJTdGFydCBkZWJ1Z2dpbmcgZnJvbSBgZnJhbWVgLgorCisgICAgICAgIElmIGZyYW1lIGlzIG5vdCBzcGVjaWZpZWQsIGRlYnVnZ2luZyBzdGFydHMgZnJvbSBjYWxsZXIncyBmcmFtZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZyYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoKS5mX2JhY2sKKyAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgIHdoaWxlIGZyYW1lOgorICAgICAgICAgICAgZnJhbWUuZl90cmFjZSA9IHNlbGYudHJhY2VfZGlzcGF0Y2gKKyAgICAgICAgICAgIHNlbGYuYm90ZnJhbWUgPSBmcmFtZQorICAgICAgICAgICAgZnJhbWUgPSBmcmFtZS5mX2JhY2sKKyAgICAgICAgc2VsZi5zZXRfc3RlcCgpCisgICAgICAgIHN5cy5zZXR0cmFjZShzZWxmLnRyYWNlX2Rpc3BhdGNoKQorCisgICAgZGVmIHNldF9jb250aW51ZShzZWxmKToKKyAgICAgICAgIyBEb24ndCBzdG9wIGV4Y2VwdCBhdCBicmVha3BvaW50cyBvciB3aGVuIGZpbmlzaGVkCisgICAgICAgIHNlbGYuX3NldF9zdG9waW5mbyhzZWxmLmJvdGZyYW1lLCBOb25lLCAtMSkKKyAgICAgICAgaWYgbm90IHNlbGYuYnJlYWtzOgorICAgICAgICAgICAgIyBubyBicmVha3BvaW50czsgcnVuIHdpdGhvdXQgZGVidWdnZXIgb3ZlcmhlYWQKKyAgICAgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKCkuZl9iYWNrCisgICAgICAgICAgICB3aGlsZSBmcmFtZSBhbmQgZnJhbWUgaXMgbm90IHNlbGYuYm90ZnJhbWU6CisgICAgICAgICAgICAgICAgZGVsIGZyYW1lLmZfdHJhY2UKKyAgICAgICAgICAgICAgICBmcmFtZSA9IGZyYW1lLmZfYmFjaworCisgICAgZGVmIHNldF9xdWl0KHNlbGYpOgorICAgICAgICBzZWxmLnN0b3BmcmFtZSA9IHNlbGYuYm90ZnJhbWUKKyAgICAgICAgc2VsZi5yZXR1cm5mcmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5xdWl0dGluZyA9IDEKKyAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCisKKyAgICAjIERlcml2ZWQgY2xhc3NlcyBhbmQgY2xpZW50cyBjYW4gY2FsbCB0aGUgZm9sbG93aW5nIG1ldGhvZHMKKyAgICAjIHRvIG1hbmlwdWxhdGUgYnJlYWtwb2ludHMuICBUaGVzZSBtZXRob2RzIHJldHVybiBhbgorICAgICMgZXJyb3IgbWVzc2FnZSBpcyBzb21ldGhpbmcgd2VudCB3cm9uZywgTm9uZSBpZiBhbGwgaXMgd2VsbC4KKyAgICAjIFNldF9icmVhayBwcmludHMgb3V0IHRoZSBicmVha3BvaW50IGxpbmUgYW5kIGZpbGU6bGluZW5vLgorICAgICMgQ2FsbCBzZWxmLmdldF8qYnJlYWsqKCkgdG8gc2VlIHRoZSBicmVha3BvaW50cyBvciBiZXR0ZXIKKyAgICAjIGZvciBicCBpbiBCcmVha3BvaW50LmJwYnludW1iZXI6IGlmIGJwOiBicC5icHByaW50KCkuCisKKyAgICBkZWYgc2V0X2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8sIHRlbXBvcmFyeT0wLCBjb25kID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgIGZ1bmNuYW1lPU5vbmUpOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY2Fub25pYyhmaWxlbmFtZSkKKyAgICAgICAgaW1wb3J0IGxpbmVjYWNoZSAjIEltcG9ydCBhcyBsYXRlIGFzIHBvc3NpYmxlCisgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIHJldHVybiAnTGluZSAlczolZCBkb2VzIG5vdCBleGlzdCcgJSAoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubykKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lIGluIHNlbGYuYnJlYWtzOgorICAgICAgICAgICAgc2VsZi5icmVha3NbZmlsZW5hbWVdID0gW10KKyAgICAgICAgbGlzdCA9IHNlbGYuYnJlYWtzW2ZpbGVuYW1lXQorICAgICAgICBpZiBub3QgbGluZW5vIGluIGxpc3Q6CisgICAgICAgICAgICBsaXN0LmFwcGVuZChsaW5lbm8pCisgICAgICAgIGJwID0gQnJlYWtwb2ludChmaWxlbmFtZSwgbGluZW5vLCB0ZW1wb3JhcnksIGNvbmQsIGZ1bmNuYW1lKQorCisgICAgZGVmIF9wcnVuZV9icmVha3Moc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgICAgIGlmIChmaWxlbmFtZSwgbGluZW5vKSBub3QgaW4gQnJlYWtwb2ludC5icGxpc3Q6CisgICAgICAgICAgICBzZWxmLmJyZWFrc1tmaWxlbmFtZV0ucmVtb3ZlKGxpbmVubykKKyAgICAgICAgaWYgbm90IHNlbGYuYnJlYWtzW2ZpbGVuYW1lXToKKyAgICAgICAgICAgIGRlbCBzZWxmLmJyZWFrc1tmaWxlbmFtZV0KKworICAgIGRlZiBjbGVhcl9icmVhayhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmNhbm9uaWMoZmlsZW5hbWUpCisgICAgICAgIGlmIG5vdCBmaWxlbmFtZSBpbiBzZWxmLmJyZWFrczoKKyAgICAgICAgICAgIHJldHVybiAnVGhlcmUgYXJlIG5vIGJyZWFrcG9pbnRzIGluICVzJyAlIGZpbGVuYW1lCisgICAgICAgIGlmIGxpbmVubyBub3QgaW4gc2VsZi5icmVha3NbZmlsZW5hbWVdOgorICAgICAgICAgICAgcmV0dXJuICdUaGVyZSBpcyBubyBicmVha3BvaW50IGF0ICVzOiVkJyAlIChmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubykKKyAgICAgICAgIyBJZiB0aGVyZSdzIG9ubHkgb25lIGJwIGluIHRoZSBsaXN0IGZvciB0aGF0IGZpbGUsbGluZQorICAgICAgICAjIHBhaXIsIHRoZW4gcmVtb3ZlIHRoZSBicmVha3MgZW50cnkKKyAgICAgICAgZm9yIGJwIGluIEJyZWFrcG9pbnQuYnBsaXN0W2ZpbGVuYW1lLCBsaW5lbm9dWzpdOgorICAgICAgICAgICAgYnAuZGVsZXRlTWUoKQorICAgICAgICBzZWxmLl9wcnVuZV9icmVha3MoZmlsZW5hbWUsIGxpbmVubykKKworICAgIGRlZiBjbGVhcl9icGJ5bnVtYmVyKHNlbGYsIGFyZyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG51bWJlciA9IGludChhcmcpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiAnTm9uLW51bWVyaWMgYnJlYWtwb2ludCBudW1iZXIgKCVzKScgJSBhcmcKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnAgPSBCcmVha3BvaW50LmJwYnludW1iZXJbbnVtYmVyXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAnQnJlYWtwb2ludCBudW1iZXIgKCVkKSBvdXQgb2YgcmFuZ2UnICUgbnVtYmVyCisgICAgICAgIGlmIG5vdCBicDoKKyAgICAgICAgICAgIHJldHVybiAnQnJlYWtwb2ludCAoJWQpIGFscmVhZHkgZGVsZXRlZCcgJSBudW1iZXIKKyAgICAgICAgYnAuZGVsZXRlTWUoKQorICAgICAgICBzZWxmLl9wcnVuZV9icmVha3MoYnAuZmlsZSwgYnAubGluZSkKKworICAgIGRlZiBjbGVhcl9hbGxfZmlsZV9icmVha3Moc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY2Fub25pYyhmaWxlbmFtZSkKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lIGluIHNlbGYuYnJlYWtzOgorICAgICAgICAgICAgcmV0dXJuICdUaGVyZSBhcmUgbm8gYnJlYWtwb2ludHMgaW4gJXMnICUgZmlsZW5hbWUKKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5icmVha3NbZmlsZW5hbWVdOgorICAgICAgICAgICAgYmxpc3QgPSBCcmVha3BvaW50LmJwbGlzdFtmaWxlbmFtZSwgbGluZV0KKyAgICAgICAgICAgIGZvciBicCBpbiBibGlzdDoKKyAgICAgICAgICAgICAgICBicC5kZWxldGVNZSgpCisgICAgICAgIGRlbCBzZWxmLmJyZWFrc1tmaWxlbmFtZV0KKworICAgIGRlZiBjbGVhcl9hbGxfYnJlYWtzKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5icmVha3M6CisgICAgICAgICAgICByZXR1cm4gJ1RoZXJlIGFyZSBubyBicmVha3BvaW50cycKKyAgICAgICAgZm9yIGJwIGluIEJyZWFrcG9pbnQuYnBieW51bWJlcjoKKyAgICAgICAgICAgIGlmIGJwOgorICAgICAgICAgICAgICAgIGJwLmRlbGV0ZU1lKCkKKyAgICAgICAgc2VsZi5icmVha3MgPSB7fQorCisgICAgZGVmIGdldF9icmVhayhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmNhbm9uaWMoZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBmaWxlbmFtZSBpbiBzZWxmLmJyZWFrcyBhbmQgXAorICAgICAgICAgICAgbGluZW5vIGluIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXQorCisgICAgZGVmIGdldF9icmVha3Moc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5jYW5vbmljKGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gZmlsZW5hbWUgaW4gc2VsZi5icmVha3MgYW5kIFwKKyAgICAgICAgICAgIGxpbmVubyBpbiBzZWxmLmJyZWFrc1tmaWxlbmFtZV0gYW5kIFwKKyAgICAgICAgICAgIEJyZWFrcG9pbnQuYnBsaXN0W2ZpbGVuYW1lLCBsaW5lbm9dIG9yIFtdCisKKyAgICBkZWYgZ2V0X2ZpbGVfYnJlYWtzKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmNhbm9uaWMoZmlsZW5hbWUpCisgICAgICAgIGlmIGZpbGVuYW1lIGluIHNlbGYuYnJlYWtzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICBkZWYgZ2V0X2FsbF9icmVha3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJyZWFrcworCisgICAgIyBEZXJpdmVkIGNsYXNzZXMgYW5kIGNsaWVudHMgY2FuIGNhbGwgdGhlIGZvbGxvd2luZyBtZXRob2QKKyAgICAjIHRvIGdldCBhIGRhdGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhIHN0YWNrIHRyYWNlLgorCisgICAgZGVmIGdldF9zdGFjayhzZWxmLCBmLCB0KToKKyAgICAgICAgc3RhY2sgPSBbXQorICAgICAgICBpZiB0IGFuZCB0LnRiX2ZyYW1lIGlzIGY6CisgICAgICAgICAgICB0ID0gdC50Yl9uZXh0CisgICAgICAgIHdoaWxlIGYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzdGFjay5hcHBlbmQoKGYsIGYuZl9saW5lbm8pKQorICAgICAgICAgICAgaWYgZiBpcyBzZWxmLmJvdGZyYW1lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmID0gZi5mX2JhY2sKKyAgICAgICAgc3RhY2sucmV2ZXJzZSgpCisgICAgICAgIGkgPSBtYXgoMCwgbGVuKHN0YWNrKSAtIDEpCisgICAgICAgIHdoaWxlIHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzdGFjay5hcHBlbmQoKHQudGJfZnJhbWUsIHQudGJfbGluZW5vKSkKKyAgICAgICAgICAgIHQgPSB0LnRiX25leHQKKyAgICAgICAgaWYgZiBpcyBOb25lOgorICAgICAgICAgICAgaSA9IG1heCgwLCBsZW4oc3RhY2spIC0gMSkKKyAgICAgICAgcmV0dXJuIHN0YWNrLCBpCisKKyAgICAjCisKKyAgICBkZWYgZm9ybWF0X3N0YWNrX2VudHJ5KHNlbGYsIGZyYW1lX2xpbmVubywgbHByZWZpeD0nOiAnKToKKyAgICAgICAgaW1wb3J0IGxpbmVjYWNoZSwgcmVwcgorICAgICAgICBmcmFtZSwgbGluZW5vID0gZnJhbWVfbGluZW5vCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5jYW5vbmljKGZyYW1lLmZfY29kZS5jb19maWxlbmFtZSkKKyAgICAgICAgcyA9ICclcyglciknICUgKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIGlmIGZyYW1lLmZfY29kZS5jb19uYW1lOgorICAgICAgICAgICAgcyA9IHMgKyBmcmFtZS5mX2NvZGUuY29fbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9IHMgKyAiPGxhbWJkYT4iCisgICAgICAgIGlmICdfX2FyZ3NfXycgaW4gZnJhbWUuZl9sb2NhbHM6CisgICAgICAgICAgICBhcmdzID0gZnJhbWUuZl9sb2NhbHNbJ19fYXJnc19fJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZ3MgPSBOb25lCisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBzID0gcyArIHJlcHIucmVwcihhcmdzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9IHMgKyAnKCknCisgICAgICAgIGlmICdfX3JldHVybl9fJyBpbiBmcmFtZS5mX2xvY2FsczoKKyAgICAgICAgICAgIHJ2ID0gZnJhbWUuZl9sb2NhbHNbJ19fcmV0dXJuX18nXQorICAgICAgICAgICAgcyA9IHMgKyAnLT4nCisgICAgICAgICAgICBzID0gcyArIHJlcHIucmVwcihydikKKyAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8sIGZyYW1lLmZfZ2xvYmFscykKKyAgICAgICAgaWYgbGluZTogcyA9IHMgKyBscHJlZml4ICsgbGluZS5zdHJpcCgpCisgICAgICAgIHJldHVybiBzCisKKyAgICAjIFRoZSBmb2xsb3dpbmcgdHdvIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBieSBjbGllbnRzIHRvIHVzZQorICAgICMgYSBkZWJ1Z2dlciB0byBkZWJ1ZyBhIHN0YXRlbWVudCwgZ2l2ZW4gYXMgYSBzdHJpbmcuCisKKyAgICBkZWYgcnVuKHNlbGYsIGNtZCwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSk6CisgICAgICAgIGlmIGdsb2JhbHMgaXMgTm9uZToKKyAgICAgICAgICAgIGltcG9ydCBfX21haW5fXworICAgICAgICAgICAgZ2xvYmFscyA9IF9fbWFpbl9fLl9fZGljdF9fCisgICAgICAgIGlmIGxvY2FscyBpcyBOb25lOgorICAgICAgICAgICAgbG9jYWxzID0gZ2xvYmFscworICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICAgICAgc3lzLnNldHRyYWNlKHNlbGYudHJhY2VfZGlzcGF0Y2gpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNtZCwgdHlwZXMuQ29kZVR5cGUpOgorICAgICAgICAgICAgY21kID0gY21kKydcbicKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYyBjbWQgaW4gZ2xvYmFscywgbG9jYWxzCisgICAgICAgIGV4Y2VwdCBCZGJRdWl0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5xdWl0dGluZyA9IDEKKyAgICAgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorCisgICAgZGVmIHJ1bmV2YWwoc2VsZiwgZXhwciwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSk6CisgICAgICAgIGlmIGdsb2JhbHMgaXMgTm9uZToKKyAgICAgICAgICAgIGltcG9ydCBfX21haW5fXworICAgICAgICAgICAgZ2xvYmFscyA9IF9fbWFpbl9fLl9fZGljdF9fCisgICAgICAgIGlmIGxvY2FscyBpcyBOb25lOgorICAgICAgICAgICAgbG9jYWxzID0gZ2xvYmFscworICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICAgICAgc3lzLnNldHRyYWNlKHNlbGYudHJhY2VfZGlzcGF0Y2gpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4cHIsIHR5cGVzLkNvZGVUeXBlKToKKyAgICAgICAgICAgIGV4cHIgPSBleHByKydcbicKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGV2YWwoZXhwciwgZ2xvYmFscywgbG9jYWxzKQorICAgICAgICBleGNlcHQgQmRiUXVpdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucXVpdHRpbmcgPSAxCisgICAgICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKworICAgIGRlZiBydW5jdHgoc2VsZiwgY21kLCBnbG9iYWxzLCBsb2NhbHMpOgorICAgICAgICAjIEIvVyBjb21wYXRpYmlsaXR5CisgICAgICAgIHNlbGYucnVuKGNtZCwgZ2xvYmFscywgbG9jYWxzKQorCisgICAgIyBUaGlzIG1ldGhvZCBpcyBtb3JlIHVzZWZ1bCB0byBkZWJ1ZyBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsLgorCisgICAgZGVmIHJ1bmNhbGwoc2VsZiwgZnVuYywgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICBzeXMuc2V0dHJhY2Uoc2VsZi50cmFjZV9kaXNwYXRjaCkKKyAgICAgICAgcmVzID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXMgPSBmdW5jKCphcmdzLCAqKmt3ZHMpCisgICAgICAgIGV4Y2VwdCBCZGJRdWl0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5xdWl0dGluZyA9IDEKKyAgICAgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorICAgICAgICByZXR1cm4gcmVzCisKKworZGVmIHNldF90cmFjZSgpOgorICAgIEJkYigpLnNldF90cmFjZSgpCisKKworY2xhc3MgQnJlYWtwb2ludDoKKworICAgICIiIkJyZWFrcG9pbnQgY2xhc3MKKworICAgIEltcGxlbWVudHMgdGVtcG9yYXJ5IGJyZWFrcG9pbnRzLCBpZ25vcmUgY291bnRzLCBkaXNhYmxpbmcgYW5kCisgICAgKHJlKS1lbmFibGluZywgYW5kIGNvbmRpdGlvbmFscy4KKworICAgIEJyZWFrcG9pbnRzIGFyZSBpbmRleGVkIGJ5IG51bWJlciB0aHJvdWdoIGJwYnludW1iZXIgYW5kIGJ5CisgICAgdGhlIGZpbGUsbGluZSB0dXBsZSB1c2luZyBicGxpc3QuICBUaGUgZm9ybWVyIHBvaW50cyB0byBhCisgICAgc2luZ2xlIGluc3RhbmNlIG9mIGNsYXNzIEJyZWFrcG9pbnQuICBUaGUgbGF0dGVyIHBvaW50cyB0byBhCisgICAgbGlzdCBvZiBzdWNoIGluc3RhbmNlcyBzaW5jZSB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZQorICAgIGJyZWFrcG9pbnQgcGVyIGxpbmUuCisKKyAgICAiIiIKKworICAgICMgWFhYIEtlZXBpbmcgc3RhdGUgaW4gdGhlIGNsYXNzIGlzIGEgbWlzdGFrZSAtLSB0aGlzIG1lYW5zCisgICAgIyB5b3UgY2Fubm90IGhhdmUgbW9yZSB0aGFuIG9uZSBhY3RpdmUgQmRiIGluc3RhbmNlLgorCisgICAgbmV4dCA9IDEgICAgICAgICMgTmV4dCBicCB0byBiZSBhc3NpZ25lZAorICAgIGJwbGlzdCA9IHt9ICAgICAjIGluZGV4ZWQgYnkgKGZpbGUsIGxpbmVubykgdHVwbGUKKyAgICBicGJ5bnVtYmVyID0gW05vbmVdICMgRWFjaCBlbnRyeSBpcyBOb25lIG9yIGFuIGluc3RhbmNlIG9mIEJwdAorICAgICAgICAgICAgICAgICMgaW5kZXggMCBpcyB1bnVzZWQsIGV4Y2VwdCBmb3IgbWFya2luZyBhbgorICAgICAgICAgICAgICAgICMgZWZmZWN0aXZlIGJyZWFrIC4uLi4gc2VlIGVmZmVjdGl2ZSgpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgbGluZSwgdGVtcG9yYXJ5PTAsIGNvbmQ9Tm9uZSwgZnVuY25hbWU9Tm9uZSk6CisgICAgICAgIHNlbGYuZnVuY25hbWUgPSBmdW5jbmFtZQorICAgICAgICAjIE5lZWRlZCBpZiBmdW5jbmFtZSBpcyBub3QgTm9uZS4KKyAgICAgICAgc2VsZi5mdW5jX2ZpcnN0X2V4ZWN1dGFibGVfbGluZSA9IE5vbmUKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZSAgICAjIFRoaXMgYmV0dGVyIGJlIGluIGNhbm9uaWNhbCBmb3JtIQorICAgICAgICBzZWxmLmxpbmUgPSBsaW5lCisgICAgICAgIHNlbGYudGVtcG9yYXJ5ID0gdGVtcG9yYXJ5CisgICAgICAgIHNlbGYuY29uZCA9IGNvbmQKKyAgICAgICAgc2VsZi5lbmFibGVkID0gMQorICAgICAgICBzZWxmLmlnbm9yZSA9IDAKKyAgICAgICAgc2VsZi5oaXRzID0gMAorICAgICAgICBzZWxmLm51bWJlciA9IEJyZWFrcG9pbnQubmV4dAorICAgICAgICBCcmVha3BvaW50Lm5leHQgPSBCcmVha3BvaW50Lm5leHQgKyAxCisgICAgICAgICMgQnVpbGQgdGhlIHR3byBsaXN0cworICAgICAgICBzZWxmLmJwYnludW1iZXIuYXBwZW5kKHNlbGYpCisgICAgICAgIGlmIChmaWxlLCBsaW5lKSBpbiBzZWxmLmJwbGlzdDoKKyAgICAgICAgICAgIHNlbGYuYnBsaXN0W2ZpbGUsIGxpbmVdLmFwcGVuZChzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5icGxpc3RbZmlsZSwgbGluZV0gPSBbc2VsZl0KKworCisgICAgZGVmIGRlbGV0ZU1lKHNlbGYpOgorICAgICAgICBpbmRleCA9IChzZWxmLmZpbGUsIHNlbGYubGluZSkKKyAgICAgICAgc2VsZi5icGJ5bnVtYmVyW3NlbGYubnVtYmVyXSA9IE5vbmUgICAjIE5vIGxvbmdlciBpbiBsaXN0CisgICAgICAgIHNlbGYuYnBsaXN0W2luZGV4XS5yZW1vdmUoc2VsZikKKyAgICAgICAgaWYgbm90IHNlbGYuYnBsaXN0W2luZGV4XToKKyAgICAgICAgICAgICMgTm8gbW9yZSBicCBmb3IgdGhpcyBmOmwgY29tYm8KKyAgICAgICAgICAgIGRlbCBzZWxmLmJwbGlzdFtpbmRleF0KKworICAgIGRlZiBlbmFibGUoc2VsZik6CisgICAgICAgIHNlbGYuZW5hYmxlZCA9IDEKKworICAgIGRlZiBkaXNhYmxlKHNlbGYpOgorICAgICAgICBzZWxmLmVuYWJsZWQgPSAwCisKKyAgICBkZWYgYnBwcmludChzZWxmLCBvdXQ9Tm9uZSk6CisgICAgICAgIGlmIG91dCBpcyBOb25lOgorICAgICAgICAgICAgb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBpZiBzZWxmLnRlbXBvcmFyeToKKyAgICAgICAgICAgIGRpc3AgPSAnZGVsICAnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkaXNwID0gJ2tlZXAgJworICAgICAgICBpZiBzZWxmLmVuYWJsZWQ6CisgICAgICAgICAgICBkaXNwID0gZGlzcCArICd5ZXMgICcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRpc3AgPSBkaXNwICsgJ25vICAgJworICAgICAgICBwcmludCA+Pm91dCwgJyUtNGRicmVha3BvaW50ICAgJXMgYXQgJXM6JWQnICUgKHNlbGYubnVtYmVyLCBkaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZSwgc2VsZi5saW5lKQorICAgICAgICBpZiBzZWxmLmNvbmQ6CisgICAgICAgICAgICBwcmludCA+Pm91dCwgJ1x0c3RvcCBvbmx5IGlmICVzJyAlIChzZWxmLmNvbmQsKQorICAgICAgICBpZiBzZWxmLmlnbm9yZToKKyAgICAgICAgICAgIHByaW50ID4+b3V0LCAnXHRpZ25vcmUgbmV4dCAlZCBoaXRzJyAlIChzZWxmLmlnbm9yZSkKKyAgICAgICAgaWYgKHNlbGYuaGl0cyk6CisgICAgICAgICAgICBpZiAoc2VsZi5oaXRzID4gMSk6IHNzID0gJ3MnCisgICAgICAgICAgICBlbHNlOiBzcyA9ICcnCisgICAgICAgICAgICBwcmludCA+Pm91dCwgKCdcdGJyZWFrcG9pbnQgYWxyZWFkeSBoaXQgJWQgdGltZSVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmhpdHMsIHNzKSkKKworIyAtLS0tLS0tLS0tLWVuZCBvZiBCcmVha3BvaW50IGNsYXNzLS0tLS0tLS0tLQorCitkZWYgY2hlY2tmdW5jbmFtZShiLCBmcmFtZSk6CisgICAgIiIiQ2hlY2sgd2hldGhlciB3ZSBzaG91bGQgYnJlYWsgaGVyZSBiZWNhdXNlIG9mIGBiLmZ1bmNuYW1lYC4iIiIKKyAgICBpZiBub3QgYi5mdW5jbmFtZToKKyAgICAgICAgIyBCcmVha3BvaW50IHdhcyBzZXQgdmlhIGxpbmUgbnVtYmVyLgorICAgICAgICBpZiBiLmxpbmUgIT0gZnJhbWUuZl9saW5lbm86CisgICAgICAgICAgICAjIEJyZWFrcG9pbnQgd2FzIHNldCBhdCBhIGxpbmUgd2l0aCBhIGRlZiBzdGF0ZW1lbnQgYW5kIHRoZSBmdW5jdGlvbgorICAgICAgICAgICAgIyBkZWZpbmVkIGlzIGNhbGxlZDogZG9uJ3QgYnJlYWsuCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgICMgQnJlYWtwb2ludCBzZXQgdmlhIGZ1bmN0aW9uIG5hbWUuCisKKyAgICBpZiBmcmFtZS5mX2NvZGUuY29fbmFtZSAhPSBiLmZ1bmNuYW1lOgorICAgICAgICAjIEl0J3Mgbm90IGEgZnVuY3Rpb24gY2FsbCwgYnV0IHJhdGhlciBleGVjdXRpb24gb2YgZGVmIHN0YXRlbWVudC4KKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIFdlIGFyZSBpbiB0aGUgcmlnaHQgZnJhbWUuCisgICAgaWYgbm90IGIuZnVuY19maXJzdF9leGVjdXRhYmxlX2xpbmU6CisgICAgICAgICMgVGhlIGZ1bmN0aW9uIGlzIGVudGVyZWQgZm9yIHRoZSAxc3QgdGltZS4KKyAgICAgICAgYi5mdW5jX2ZpcnN0X2V4ZWN1dGFibGVfbGluZSA9IGZyYW1lLmZfbGluZW5vCisKKyAgICBpZiAgYi5mdW5jX2ZpcnN0X2V4ZWN1dGFibGVfbGluZSAhPSBmcmFtZS5mX2xpbmVubzoKKyAgICAgICAgIyBCdXQgd2UgYXJlIG5vdCBhdCB0aGUgZmlyc3QgbGluZSBudW1iZXI6IGRvbid0IGJyZWFrLgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCisjIERldGVybWluZXMgaWYgdGhlcmUgaXMgYW4gZWZmZWN0aXZlIChhY3RpdmUpIGJyZWFrcG9pbnQgYXQgdGhpcworIyBsaW5lIG9mIGNvZGUuICBSZXR1cm5zIGJyZWFrcG9pbnQgbnVtYmVyIG9yIDAgaWYgbm9uZQorZGVmIGVmZmVjdGl2ZShmaWxlLCBsaW5lLCBmcmFtZSk6CisgICAgIiIiRGV0ZXJtaW5lIHdoaWNoIGJyZWFrcG9pbnQgZm9yIHRoaXMgZmlsZTpsaW5lIGlzIHRvIGJlIGFjdGVkIHVwb24uCisKKyAgICBDYWxsZWQgb25seSBpZiB3ZSBrbm93IHRoZXJlIGlzIGEgYnB0IGF0IHRoaXMKKyAgICBsb2NhdGlvbi4gIFJldHVybnMgYnJlYWtwb2ludCB0aGF0IHdhcyB0cmlnZ2VyZWQgYW5kIGEgZmxhZworICAgIHRoYXQgaW5kaWNhdGVzIGlmIGl0IGlzIG9rIHRvIGRlbGV0ZSBhIHRlbXBvcmFyeSBicC4KKworICAgICIiIgorICAgIHBvc3NpYmxlcyA9IEJyZWFrcG9pbnQuYnBsaXN0W2ZpbGUsbGluZV0KKyAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4ocG9zc2libGVzKSk6CisgICAgICAgIGIgPSBwb3NzaWJsZXNbaV0KKyAgICAgICAgaWYgYi5lbmFibGVkID09IDA6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBub3QgY2hlY2tmdW5jbmFtZShiLCBmcmFtZSk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAjIENvdW50IGV2ZXJ5IGhpdCB3aGVuIGJwIGlzIGVuYWJsZWQKKyAgICAgICAgYi5oaXRzID0gYi5oaXRzICsgMQorICAgICAgICBpZiBub3QgYi5jb25kOgorICAgICAgICAgICAgIyBJZiB1bmNvbmRpdGlvbmFsLCBhbmQgaWdub3JpbmcsCisgICAgICAgICAgICAjIGdvIG9uIHRvIG5leHQsIGVsc2UgYnJlYWsKKyAgICAgICAgICAgIGlmIGIuaWdub3JlID4gMDoKKyAgICAgICAgICAgICAgICBiLmlnbm9yZSA9IGIuaWdub3JlIC0xCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBicmVha3BvaW50IGFuZCBtYXJrZXIgdGhhdCdzIG9rCisgICAgICAgICAgICAgICAgIyB0byBkZWxldGUgaWYgdGVtcG9yYXJ5CisgICAgICAgICAgICAgICAgcmV0dXJuIChiLDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIENvbmRpdGlvbmFsIGJwLgorICAgICAgICAgICAgIyBJZ25vcmUgY291bnQgYXBwbGllcyBvbmx5IHRvIHRob3NlIGJwdCBoaXRzIHdoZXJlIHRoZQorICAgICAgICAgICAgIyBjb25kaXRpb24gZXZhbHVhdGVzIHRvIHRydWUuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsID0gZXZhbChiLmNvbmQsIGZyYW1lLmZfZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuZl9sb2NhbHMpCisgICAgICAgICAgICAgICAgaWYgdmFsOgorICAgICAgICAgICAgICAgICAgICBpZiBiLmlnbm9yZSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBiLmlnbm9yZSA9IGIuaWdub3JlIC0xCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGIsMSkKKyAgICAgICAgICAgICAgICAjIGVsc2U6CisgICAgICAgICAgICAgICAgIyAgIGNvbnRpbnVlCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBpZiBldmFsIGZhaWxzLCBtb3N0IGNvbnNlcnZhdGl2ZQorICAgICAgICAgICAgICAgICMgdGhpbmcgaXMgdG8gc3RvcCBvbiBicmVha3BvaW50CisgICAgICAgICAgICAgICAgIyByZWdhcmRsZXNzIG9mIGlnbm9yZSBjb3VudC4KKyAgICAgICAgICAgICAgICAjIERvbid0IGRlbGV0ZSB0ZW1wb3JhcnksCisgICAgICAgICAgICAgICAgIyBhcyBhbm90aGVyIGhpbnQgdG8gdXNlci4KKyAgICAgICAgICAgICAgICByZXR1cm4gKGIsMCkKKyAgICByZXR1cm4gKE5vbmUsIE5vbmUpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gdGVzdGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZGIoQmRiKToKKyAgICBkZWYgdXNlcl9jYWxsKHNlbGYsIGZyYW1lLCBhcmdzKToKKyAgICAgICAgbmFtZSA9IGZyYW1lLmZfY29kZS5jb19uYW1lCisgICAgICAgIGlmIG5vdCBuYW1lOiBuYW1lID0gJz8/PycKKyAgICAgICAgcHJpbnQgJysrKyBjYWxsJywgbmFtZSwgYXJncworICAgIGRlZiB1c2VyX2xpbmUoc2VsZiwgZnJhbWUpOgorICAgICAgICBpbXBvcnQgbGluZWNhY2hlCisgICAgICAgIG5hbWUgPSBmcmFtZS5mX2NvZGUuY29fbmFtZQorICAgICAgICBpZiBub3QgbmFtZTogbmFtZSA9ICc/Pz8nCisgICAgICAgIGZuID0gc2VsZi5jYW5vbmljKGZyYW1lLmZfY29kZS5jb19maWxlbmFtZSkKKyAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZuLCBmcmFtZS5mX2xpbmVubywgZnJhbWUuZl9nbG9iYWxzKQorICAgICAgICBwcmludCAnKysrJywgZm4sIGZyYW1lLmZfbGluZW5vLCBuYW1lLCAnOicsIGxpbmUuc3RyaXAoKQorICAgIGRlZiB1c2VyX3JldHVybihzZWxmLCBmcmFtZSwgcmV0dmFsKToKKyAgICAgICAgcHJpbnQgJysrKyByZXR1cm4nLCByZXR2YWwKKyAgICBkZWYgdXNlcl9leGNlcHRpb24oc2VsZiwgZnJhbWUsIGV4Y19zdHVmZik6CisgICAgICAgIHByaW50ICcrKysgZXhjZXB0aW9uJywgZXhjX3N0dWZmCisgICAgICAgIHNlbGYuc2V0X2NvbnRpbnVlKCkKKworZGVmIGZvbyhuKToKKyAgICBwcmludCAnZm9vKCcsIG4sICcpJworICAgIHggPSBiYXIobioxMCkKKyAgICBwcmludCAnYmFyIHJldHVybmVkJywgeAorCitkZWYgYmFyKGEpOgorICAgIHByaW50ICdiYXIoJywgYSwgJyknCisgICAgcmV0dXJuIGEvMgorCitkZWYgdGVzdCgpOgorICAgIHQgPSBUZGIoKQorICAgIHQucnVuKCdpbXBvcnQgYmRiOyBiZGIuZm9vKDEwKScpCisKKyMgZW5kCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JkYi5weWMgYi9saWIvcHl0aG9uMi43L2JkYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlZWNmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYmRiLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JkYi5weW8gYi9saWIvcHl0aG9uMi43L2JkYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlZWNmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYmRiLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JpbmhleC5weSBiL2xpYi9weXRob24yLjcvYmluaGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYmM5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JpbmhleC5weQpAQCAtMCwwICsxLDUwOCBAQAorIiIiTWFjaW50b3NoIGJpbmhleCBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uLgorCitlYXN5IGludGVyZmFjZToKK2JpbmhleChpbnB1dGZpbGVuYW1lLCBvdXRwdXRmaWxlbmFtZSkKK2hleGJpbihpbnB1dGZpbGVuYW1lLCBvdXRwdXRmaWxlbmFtZSkKKyIiIgorCisjCisjIEphY2sgSmFuc2VuLCBDV0ksIEF1Z3VzdCAxOTk1LgorIworIyBUaGUgbW9kdWxlIGlzIHN1cHBvc2VkIHRvIGJlIGFzIGNvbXBhdGlibGUgYXMgcG9zc2libGUuIEVzcGVjaWFsbHkgdGhlCisjIGVhc3kgaW50ZXJmYWNlIHNob3VsZCB3b3JrICJhcyBleHBlY3RlZCIgb24gYW55IHBsYXRmb3JtLgorIyBYWFhYIE5vdGU6IGN1cnJlbnRseSwgdGV4dGZpbGVzIGFwcGVhciBpbiBtYWMtZm9ybSBvbiBhbGwgcGxhdGZvcm1zLgorIyBXZSBzZWVtIHRvIGxhY2sgYSBzaW1wbGUgY2hhcmFjdGVyLXRyYW5zbGF0ZSBpbiBweXRob24uCisjICh3ZSBzaG91bGQgcHJvYmFibHkgdXNlIElTTy1MYXRpbi0xIG9uIGFsbCBidXQgdGhlIG1hYyBwbGF0Zm9ybSkuCisjIFhYWFggVGhlIHNpbXBsZSByb3V0aW5lcyBhcmUgdG9vIHNpbXBsZTogdGhleSBleHBlY3QgdG8gaG9sZCB0aGUgY29tcGxldGUKKyMgZmlsZXMgaW4tY29yZS4gU2hvdWxkIGJlIGZpeGVkLgorIyBYWFhYIEl0IHdvdWxkIGJlIG5pY2UgdG8gaGFuZGxlIEFwcGxlRG91YmxlIGZvcm1hdCBvbiB1bml4CisjIChmb3Igc2VydmVycyBzZXJ2aW5nIG1hY3MpLgorIyBYWFhYIEkgZG9uJ3QgdW5kZXJzdGFuZCB3aGF0IGhhcHBlbnMgd2hlbiB5b3UgZ2V0IDB4OTAgdGltZXMgdGhlIHNhbWUgYnl0ZSBvbgorIyBpbnB1dC4gVGhlIHJlc3VsdGluZyBjb2RlICh4eCA5MCA5MCkgd291bGQgYXBwZWFyIHRvIGJlIGludGVycHJldGVkIGFzIGFuCisjIGVzY2FwZWQgKnZhbHVlKiBvZiAweDkwLiBBbGwgY29kZXJzIEkndmUgc2VlbiBhcHBlYXIgdG8gaWdub3JlIHRoaXMgbmljZXR5Li4uCisjCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBiaW5hc2NpaQorCitfX2FsbF9fID0gWyJiaW5oZXgiLCJoZXhiaW4iLCJFcnJvciJdCisKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisjIFN0YXRlcyAod2hhdCBoYXZlIHdlIHdyaXR0ZW4pCitbX0RJRF9IRUFERVIsIF9ESURfREFUQSwgX0RJRF9SU1JDXSA9IHJhbmdlKDMpCisKKyMgVmFyaW91cyBjb25zdGFudHMKK1JFQVNPTkFCTFlfTEFSR0U9MzI3NjggICMgTWluaW1hbCBhbW91bnQgd2UgcGFzcyB0aGUgcmxlLWNvZGVyCitMSU5FTEVOPTY0CitSVU5DSEFSPWNocigweDkwKSAgICMgcnVuLWxlbmd0aCBpbnRyb2R1Y2VyCisKKyMKKyMgVGhpcyBjb2RlIGlzIG5vIGxvbmdlciBieXRlLW9yZGVyIGRlcGVuZGVudAorCisjCisjIFdvcmthcm91bmRzIGZvciBub24tbWFjIG1hY2hpbmVzLgordHJ5OgorICAgIGZyb20gQ2FyYm9uLkZpbGUgaW1wb3J0IEZTU3BlYywgRkluZm8KKyAgICBmcm9tIE1hY09TIGltcG9ydCBvcGVucmYKKworICAgIGRlZiBnZXRmaWxlaW5mbyhuYW1lKToKKyAgICAgICAgZmluZm8gPSBGU1NwZWMobmFtZSkuRlNwR2V0RkluZm8oKQorICAgICAgICBkaXIsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KG5hbWUpCisgICAgICAgICMgWFhYIEdldCByZXNvdXJjZS9kYXRhIHNpemVzCisgICAgICAgIGZwID0gb3BlbihuYW1lLCAncmInKQorICAgICAgICBmcC5zZWVrKDAsIDIpCisgICAgICAgIGRsZW4gPSBmcC50ZWxsKCkKKyAgICAgICAgZnAgPSBvcGVucmYobmFtZSwgJypyYicpCisgICAgICAgIGZwLnNlZWsoMCwgMikKKyAgICAgICAgcmxlbiA9IGZwLnRlbGwoKQorICAgICAgICByZXR1cm4gZmlsZSwgZmluZm8sIGRsZW4sIHJsZW4KKworICAgIGRlZiBvcGVucnNyYyhuYW1lLCAqbW9kZSk6CisgICAgICAgIGlmIG5vdCBtb2RlOgorICAgICAgICAgICAgbW9kZSA9ICcqcmInCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2RlID0gJyonICsgbW9kZVswXQorICAgICAgICByZXR1cm4gb3BlbnJmKG5hbWUsIG1vZGUpCisKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjCisgICAgIyBHbHVlIGNvZGUgZm9yIG5vbi1tYWNpbnRvc2ggdXNhZ2UKKyAgICAjCisKKyAgICBjbGFzcyBGSW5mbzoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5UeXBlID0gJz8/Pz8nCisgICAgICAgICAgICBzZWxmLkNyZWF0b3IgPSAnPz8/PycKKyAgICAgICAgICAgIHNlbGYuRmxhZ3MgPSAwCisKKyAgICBkZWYgZ2V0ZmlsZWluZm8obmFtZSk6CisgICAgICAgIGZpbmZvID0gRkluZm8oKQorICAgICAgICAjIFF1aWNrIGNoZWNrIGZvciB0ZXh0ZmlsZQorICAgICAgICBmcCA9IG9wZW4obmFtZSkKKyAgICAgICAgZGF0YSA9IG9wZW4obmFtZSkucmVhZCgyNTYpCisgICAgICAgIGZvciBjIGluIGRhdGE6CisgICAgICAgICAgICBpZiBub3QgYy5pc3NwYWNlKCkgYW5kIChjPCcgJyBvciBvcmQoYykgPiAweDdmKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmluZm8uVHlwZSA9ICdURVhUJworICAgICAgICBmcC5zZWVrKDAsIDIpCisgICAgICAgIGRzaXplID0gZnAudGVsbCgpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZGlyLCBmaWxlID0gb3MucGF0aC5zcGxpdChuYW1lKQorICAgICAgICBmaWxlID0gZmlsZS5yZXBsYWNlKCc6JywgJy0nLCAxKQorICAgICAgICByZXR1cm4gZmlsZSwgZmluZm8sIGRzaXplLCAwCisKKyAgICBjbGFzcyBvcGVucnNyYzoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgcmVhZChzZWxmLCAqYXJncyk6CisgICAgICAgICAgICByZXR1cm4gJycKKworICAgICAgICBkZWYgd3JpdGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgX0hxeGNvZGVyZW5naW5lOgorICAgICIiIldyaXRlIGRhdGEgdG8gdGhlIGNvZGVyIGluIDMtYnl0ZSBjaHVua3MiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZnApOgorICAgICAgICBzZWxmLm9mcCA9IG9mcAorICAgICAgICBzZWxmLmRhdGEgPSAnJworICAgICAgICBzZWxmLmhxeGRhdGEgPSAnJworICAgICAgICBzZWxmLmxpbmVsZW4gPSBMSU5FTEVOLTEKKworICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhICsgZGF0YQorICAgICAgICBkYXRhbGVuID0gbGVuKHNlbGYuZGF0YSkKKyAgICAgICAgdG9kbyA9IChkYXRhbGVuLy8zKSozCisgICAgICAgIGRhdGEgPSBzZWxmLmRhdGFbOnRvZG9dCisgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVt0b2RvOl0KKyAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5ocXhkYXRhID0gc2VsZi5ocXhkYXRhICsgYmluYXNjaWkuYjJhX2hxeChkYXRhKQorICAgICAgICBzZWxmLl9mbHVzaCgwKQorCisgICAgZGVmIF9mbHVzaChzZWxmLCBmb3JjZSk6CisgICAgICAgIGZpcnN0ID0gMAorICAgICAgICB3aGlsZSBmaXJzdCA8PSBsZW4oc2VsZi5ocXhkYXRhKS1zZWxmLmxpbmVsZW46CisgICAgICAgICAgICBsYXN0ID0gZmlyc3QgKyBzZWxmLmxpbmVsZW4KKyAgICAgICAgICAgIHNlbGYub2ZwLndyaXRlKHNlbGYuaHF4ZGF0YVtmaXJzdDpsYXN0XSsnXG4nKQorICAgICAgICAgICAgc2VsZi5saW5lbGVuID0gTElORUxFTgorICAgICAgICAgICAgZmlyc3QgPSBsYXN0CisgICAgICAgIHNlbGYuaHF4ZGF0YSA9IHNlbGYuaHF4ZGF0YVtmaXJzdDpdCisgICAgICAgIGlmIGZvcmNlOgorICAgICAgICAgICAgc2VsZi5vZnAud3JpdGUoc2VsZi5ocXhkYXRhICsgJzpcbicpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZGF0YToKKyAgICAgICAgICAgIHNlbGYuaHF4ZGF0YSA9IFwKKyAgICAgICAgICAgICAgICAgc2VsZi5ocXhkYXRhICsgYmluYXNjaWkuYjJhX2hxeChzZWxmLmRhdGEpCisgICAgICAgIHNlbGYuX2ZsdXNoKDEpCisgICAgICAgIHNlbGYub2ZwLmNsb3NlKCkKKyAgICAgICAgZGVsIHNlbGYub2ZwCisKK2NsYXNzIF9SbGVjb2RlcmVuZ2luZToKKyAgICAiIiJXcml0ZSBkYXRhIHRvIHRoZSBSTEUtY29kZXIgaW4gc3VpdGFibHkgbGFyZ2UgY2h1bmtzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb2ZwKToKKyAgICAgICAgc2VsZi5vZnAgPSBvZnAKKyAgICAgICAgc2VsZi5kYXRhID0gJycKKworICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhICsgZGF0YQorICAgICAgICBpZiBsZW4oc2VsZi5kYXRhKSA8IFJFQVNPTkFCTFlfTEFSR0U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcmxlZGF0YSA9IGJpbmFzY2lpLnJsZWNvZGVfaHF4KHNlbGYuZGF0YSkKKyAgICAgICAgc2VsZi5vZnAud3JpdGUocmxlZGF0YSkKKyAgICAgICAgc2VsZi5kYXRhID0gJycKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kYXRhOgorICAgICAgICAgICAgcmxlZGF0YSA9IGJpbmFzY2lpLnJsZWNvZGVfaHF4KHNlbGYuZGF0YSkKKyAgICAgICAgICAgIHNlbGYub2ZwLndyaXRlKHJsZWRhdGEpCisgICAgICAgIHNlbGYub2ZwLmNsb3NlKCkKKyAgICAgICAgZGVsIHNlbGYub2ZwCisKK2NsYXNzIEJpbkhleDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZV9maW5mb19kbGVuX3JsZW4sIG9mcCk6CisgICAgICAgIG5hbWUsIGZpbmZvLCBkbGVuLCBybGVuID0gbmFtZV9maW5mb19kbGVuX3JsZW4KKyAgICAgICAgaWYgdHlwZShvZnApID09IHR5cGUoJycpOgorICAgICAgICAgICAgb2ZuYW1lID0gb2ZwCisgICAgICAgICAgICBvZnAgPSBvcGVuKG9mbmFtZSwgJ3cnKQorICAgICAgICBvZnAud3JpdGUoJyhUaGlzIGZpbGUgbXVzdCBiZSBjb252ZXJ0ZWQgd2l0aCBCaW5IZXggNC4wKVxuXG46JykKKyAgICAgICAgaHF4ZXIgPSBfSHF4Y29kZXJlbmdpbmUob2ZwKQorICAgICAgICBzZWxmLm9mcCA9IF9SbGVjb2RlcmVuZ2luZShocXhlcikKKyAgICAgICAgc2VsZi5jcmMgPSAwCisgICAgICAgIGlmIGZpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICBmaW5mbyA9IEZJbmZvKCkKKyAgICAgICAgc2VsZi5kbGVuID0gZGxlbgorICAgICAgICBzZWxmLnJsZW4gPSBybGVuCisgICAgICAgIHNlbGYuX3dyaXRlaW5mbyhuYW1lLCBmaW5mbykKKyAgICAgICAgc2VsZi5zdGF0ZSA9IF9ESURfSEVBREVSCisKKyAgICBkZWYgX3dyaXRlaW5mbyhzZWxmLCBuYW1lLCBmaW5mbyk6CisgICAgICAgIG5sID0gbGVuKG5hbWUpCisgICAgICAgIGlmIG5sID4gNjM6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ0ZpbGVuYW1lIHRvbyBsb25nJworICAgICAgICBkID0gY2hyKG5sKSArIG5hbWUgKyAnXDAnCisgICAgICAgIGQyID0gZmluZm8uVHlwZSArIGZpbmZvLkNyZWF0b3IKKworICAgICAgICAjIEZvcmNlIGFsbCBzdHJ1Y3RzIHRvIGJlIHBhY2tlZCB3aXRoIGJpZy1lbmRpYW4KKyAgICAgICAgZDMgPSBzdHJ1Y3QucGFjaygnPmgnLCBmaW5mby5GbGFncykKKyAgICAgICAgZDQgPSBzdHJ1Y3QucGFjaygnPmlpJywgc2VsZi5kbGVuLCBzZWxmLnJsZW4pCisgICAgICAgIGluZm8gPSBkICsgZDIgKyBkMyArIGQ0CisgICAgICAgIHNlbGYuX3dyaXRlKGluZm8pCisgICAgICAgIHNlbGYuX3dyaXRlY3JjKCkKKworICAgIGRlZiBfd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuY3JjID0gYmluYXNjaWkuY3JjX2hxeChkYXRhLCBzZWxmLmNyYykKKyAgICAgICAgc2VsZi5vZnAud3JpdGUoZGF0YSkKKworICAgIGRlZiBfd3JpdGVjcmMoc2VsZik6CisgICAgICAgICMgWFhYWCBTaG91bGQgdGhpcyBiZSBoZXJlPz8KKyAgICAgICAgIyBzZWxmLmNyYyA9IGJpbmFzY2lpLmNyY19ocXgoJ1wwXDAnLCBzZWxmLmNyYykKKyAgICAgICAgaWYgc2VsZi5jcmMgPCAwOgorICAgICAgICAgICAgZm10ID0gJz5oJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm10ID0gJz5IJworICAgICAgICBzZWxmLm9mcC53cml0ZShzdHJ1Y3QucGFjayhmbXQsIHNlbGYuY3JjKSkKKyAgICAgICAgc2VsZi5jcmMgPSAwCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgIT0gX0RJRF9IRUFERVI6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ1dyaXRpbmcgZGF0YSBhdCB0aGUgd3JvbmcgdGltZScKKyAgICAgICAgc2VsZi5kbGVuID0gc2VsZi5kbGVuIC0gbGVuKGRhdGEpCisgICAgICAgIHNlbGYuX3dyaXRlKGRhdGEpCisKKyAgICBkZWYgY2xvc2VfZGF0YShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kbGVuICE9IDA6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ0luY29ycmVjdCBkYXRhIHNpemUsIGRpZmY9JXInICUgKHNlbGYucmxlbiwpCisgICAgICAgIHNlbGYuX3dyaXRlY3JjKCkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IF9ESURfREFUQQorCisgICAgZGVmIHdyaXRlX3JzcmMoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgPCBfRElEX0RBVEE6CisgICAgICAgICAgICBzZWxmLmNsb3NlX2RhdGEoKQorICAgICAgICBpZiBzZWxmLnN0YXRlICE9IF9ESURfREFUQToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnV3JpdGluZyByZXNvdXJjZSBkYXRhIGF0IHRoZSB3cm9uZyB0aW1lJworICAgICAgICBzZWxmLnJsZW4gPSBzZWxmLnJsZW4gLSBsZW4oZGF0YSkKKyAgICAgICAgc2VsZi5fd3JpdGUoZGF0YSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSA8IF9ESURfREFUQToKKyAgICAgICAgICAgIHNlbGYuY2xvc2VfZGF0YSgpCisgICAgICAgIGlmIHNlbGYuc3RhdGUgIT0gX0RJRF9EQVRBOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdDbG9zZSBhdCB0aGUgd3JvbmcgdGltZScKKyAgICAgICAgaWYgc2VsZi5ybGVuICE9IDA6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgXAorICAgICAgICAgICAgICAgICAgIkluY29ycmVjdCByZXNvdXJjZS1kYXRhc2l6ZSwgZGlmZj0lciIgJSAoc2VsZi5ybGVuLCkKKyAgICAgICAgc2VsZi5fd3JpdGVjcmMoKQorICAgICAgICBzZWxmLm9mcC5jbG9zZSgpCisgICAgICAgIHNlbGYuc3RhdGUgPSBOb25lCisgICAgICAgIGRlbCBzZWxmLm9mcAorCitkZWYgYmluaGV4KGlucCwgb3V0KToKKyAgICAiIiIoaW5maWxlbmFtZSwgb3V0ZmlsZW5hbWUpIC0gQ3JlYXRlIGJpbmhleC1lbmNvZGVkIGNvcHkgb2YgYSBmaWxlIiIiCisgICAgZmluZm8gPSBnZXRmaWxlaW5mbyhpbnApCisgICAgb2ZwID0gQmluSGV4KGZpbmZvLCBvdXQpCisKKyAgICBpZnAgPSBvcGVuKGlucCwgJ3JiJykKKyAgICAjIFhYWFggRG8gdGV4dGZpbGUgdHJhbnNsYXRpb24gb24gbm9uLW1hYyBzeXN0ZW1zCisgICAgd2hpbGUgMToKKyAgICAgICAgZCA9IGlmcC5yZWFkKDEyODAwMCkKKyAgICAgICAgaWYgbm90IGQ6IGJyZWFrCisgICAgICAgIG9mcC53cml0ZShkKQorICAgIG9mcC5jbG9zZV9kYXRhKCkKKyAgICBpZnAuY2xvc2UoKQorCisgICAgaWZwID0gb3BlbnJzcmMoaW5wLCAncmInKQorICAgIHdoaWxlIDE6CisgICAgICAgIGQgPSBpZnAucmVhZCgxMjgwMDApCisgICAgICAgIGlmIG5vdCBkOiBicmVhaworICAgICAgICBvZnAud3JpdGVfcnNyYyhkKQorICAgIG9mcC5jbG9zZSgpCisgICAgaWZwLmNsb3NlKCkKKworY2xhc3MgX0hxeGRlY29kZXJlbmdpbmU6CisgICAgIiIiUmVhZCBkYXRhIHZpYSB0aGUgZGVjb2RlciBpbiA0LWJ5dGUgY2h1bmtzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaWZwKToKKyAgICAgICAgc2VsZi5pZnAgPSBpZnAKKyAgICAgICAgc2VsZi5lb2YgPSAwCisKKyAgICBkZWYgcmVhZChzZWxmLCB0b3RhbHd0ZCk6CisgICAgICAgICIiIlJlYWQgYXQgbGVhc3Qgd3RkIGJ5dGVzIChvciB1bnRpbCBFT0YpIiIiCisgICAgICAgIGRlY2RhdGEgPSAnJworICAgICAgICB3dGQgPSB0b3RhbHd0ZAorICAgICAgICAjCisgICAgICAgICMgVGhlIGxvb3AgaGVyZSBpcyBjb252b2x1dGVkLCBzaW5jZSB3ZSBkb24ndCByZWFsbHkgbm93IGhvdworICAgICAgICAjIG11Y2ggdG8gZGVjb2RlOiB0aGVyZSBtYXkgYmUgbmV3bGluZXMgaW4gdGhlIGluY29taW5nIGRhdGEuCisgICAgICAgIHdoaWxlIHd0ZCA+IDA6CisgICAgICAgICAgICBpZiBzZWxmLmVvZjogcmV0dXJuIGRlY2RhdGEKKyAgICAgICAgICAgIHd0ZCA9ICgod3RkKzIpLy8zKSo0CisgICAgICAgICAgICBkYXRhID0gc2VsZi5pZnAucmVhZCh3dGQpCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIE5leHQgcHJvYmxlbTogdGhlcmUgbWF5IG5vdCBiZSBhIGNvbXBsZXRlIG51bWJlciBvZgorICAgICAgICAgICAgIyBieXRlcyBpbiB3aGF0IHdlIHBhc3MgdG8gYTJiLiBTb2x2ZSBieSB5ZXQgYW5vdGhlcgorICAgICAgICAgICAgIyBsb29wLgorICAgICAgICAgICAgIworICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRlY2RhdGFjdXIsIHNlbGYuZW9mID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmFzY2lpLmEyYl9ocXgoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBleGNlcHQgYmluYXNjaWkuSW5jb21wbGV0ZToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIG5ld2RhdGEgPSBzZWxmLmlmcC5yZWFkKDEpCisgICAgICAgICAgICAgICAgaWYgbm90IG5ld2RhdGE6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICdQcmVtYXR1cmUgRU9GIG9uIGJpbmhleCBmaWxlJworICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhICsgbmV3ZGF0YQorICAgICAgICAgICAgZGVjZGF0YSA9IGRlY2RhdGEgKyBkZWNkYXRhY3VyCisgICAgICAgICAgICB3dGQgPSB0b3RhbHd0ZCAtIGxlbihkZWNkYXRhKQorICAgICAgICAgICAgaWYgbm90IGRlY2RhdGEgYW5kIG5vdCBzZWxmLmVvZjoKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ1ByZW1hdHVyZSBFT0Ygb24gYmluaGV4IGZpbGUnCisgICAgICAgIHJldHVybiBkZWNkYXRhCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuaWZwLmNsb3NlKCkKKworY2xhc3MgX1JsZWRlY29kZXJlbmdpbmU6CisgICAgIiIiUmVhZCBkYXRhIHZpYSB0aGUgUkxFLWNvZGVyIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaWZwKToKKyAgICAgICAgc2VsZi5pZnAgPSBpZnAKKyAgICAgICAgc2VsZi5wcmVfYnVmZmVyID0gJycKKyAgICAgICAgc2VsZi5wb3N0X2J1ZmZlciA9ICcnCisgICAgICAgIHNlbGYuZW9mID0gMAorCisgICAgZGVmIHJlYWQoc2VsZiwgd3RkKToKKyAgICAgICAgaWYgd3RkID4gbGVuKHNlbGYucG9zdF9idWZmZXIpOgorICAgICAgICAgICAgc2VsZi5fZmlsbCh3dGQtbGVuKHNlbGYucG9zdF9idWZmZXIpKQorICAgICAgICBydiA9IHNlbGYucG9zdF9idWZmZXJbOnd0ZF0KKyAgICAgICAgc2VsZi5wb3N0X2J1ZmZlciA9IHNlbGYucG9zdF9idWZmZXJbd3RkOl0KKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgX2ZpbGwoc2VsZiwgd3RkKToKKyAgICAgICAgc2VsZi5wcmVfYnVmZmVyID0gc2VsZi5wcmVfYnVmZmVyICsgc2VsZi5pZnAucmVhZCh3dGQrNCkKKyAgICAgICAgaWYgc2VsZi5pZnAuZW9mOgorICAgICAgICAgICAgc2VsZi5wb3N0X2J1ZmZlciA9IHNlbGYucG9zdF9idWZmZXIgKyBcCisgICAgICAgICAgICAgICAgYmluYXNjaWkucmxlZGVjb2RlX2hxeChzZWxmLnByZV9idWZmZXIpCisgICAgICAgICAgICBzZWxmLnByZV9idWZmZXIgPSAnJworICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIworICAgICAgICAjIE9iZnVzY2F0ZWQgY29kZSBhaGVhZC4gV2UgaGF2ZSB0byB0YWtlIGNhcmUgdGhhdCB3ZSBkb24ndAorICAgICAgICAjIGVuZCB1cCB3aXRoIGFuIG9ycGhhbmVkIFJVTkNIQVIgbGF0ZXIgb24uIFNvLCB3ZSBrZWVwIGEgY291cGxlCisgICAgICAgICMgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciwgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIGVuZCBvZgorICAgICAgICAjIHRoZSBidWZmZXIgbG9va3MgbGlrZToKKyAgICAgICAgIyAnXDIyMFwwXDIyMCcgLSBLZWVwIDMgYnl0ZXM6IHJlcGVhdGVkIFwyMjAgKGVzY2FwZWQgYXMgXDIyMFwwKQorICAgICAgICAjICc/XDIyMCcgLSBLZWVwIDIgYnl0ZXM6IHJlcGVhdGVkIHNvbWV0aGluZy1lbHNlCisgICAgICAgICMgJ1wyMjBcMCcgLSBFc2NhcGVkIFwyMjA6IEtlZXAgMiBieXRlcy4KKyAgICAgICAgIyAnP1wyMjA/JyAtIENvbXBsZXRlIHJlcGVhdCBzZXF1ZW5jZTogZGVjb2RlIGFsbAorICAgICAgICAjIG90aGVyd2lzZToga2VlcCAxIGJ5dGUuCisgICAgICAgICMKKyAgICAgICAgbWFyayA9IGxlbihzZWxmLnByZV9idWZmZXIpCisgICAgICAgIGlmIHNlbGYucHJlX2J1ZmZlclstMzpdID09IFJVTkNIQVIgKyAnXDAnICsgUlVOQ0hBUjoKKyAgICAgICAgICAgIG1hcmsgPSBtYXJrIC0gMworICAgICAgICBlbGlmIHNlbGYucHJlX2J1ZmZlclstMV0gPT0gUlVOQ0hBUjoKKyAgICAgICAgICAgIG1hcmsgPSBtYXJrIC0gMgorICAgICAgICBlbGlmIHNlbGYucHJlX2J1ZmZlclstMjpdID09IFJVTkNIQVIgKyAnXDAnOgorICAgICAgICAgICAgbWFyayA9IG1hcmsgLSAyCisgICAgICAgIGVsaWYgc2VsZi5wcmVfYnVmZmVyWy0yXSA9PSBSVU5DSEFSOgorICAgICAgICAgICAgcGFzcyAjIERlY29kZSBhbGwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hcmsgPSBtYXJrIC0gMQorCisgICAgICAgIHNlbGYucG9zdF9idWZmZXIgPSBzZWxmLnBvc3RfYnVmZmVyICsgXAorICAgICAgICAgICAgYmluYXNjaWkucmxlZGVjb2RlX2hxeChzZWxmLnByZV9idWZmZXJbOm1hcmtdKQorICAgICAgICBzZWxmLnByZV9idWZmZXIgPSBzZWxmLnByZV9idWZmZXJbbWFyazpdCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuaWZwLmNsb3NlKCkKKworY2xhc3MgSGV4QmluOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpZnApOgorICAgICAgICBpZiB0eXBlKGlmcCkgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICBpZnAgPSBvcGVuKGlmcCkKKyAgICAgICAgIworICAgICAgICAjIEZpbmQgaW5pdGlhbCBjb2xvbi4KKyAgICAgICAgIworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgY2ggPSBpZnAucmVhZCgxKQorICAgICAgICAgICAgaWYgbm90IGNoOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAiTm8gYmluaGV4IGRhdGEgZm91bmQiCisgICAgICAgICAgICAjIENhdGVyIGZvciBcclxuIHRlcm1pbmF0ZWQgbGluZXMgKHdoaWNoIHNob3cgdXAgYXMgXG5cciwgaGVuY2UKKyAgICAgICAgICAgICMgYWxsIGxpbmVzIHN0YXJ0IHdpdGggXHIpCisgICAgICAgICAgICBpZiBjaCA9PSAnXHInOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBjaCA9PSAnOic6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGNoICE9ICdcbic6CisgICAgICAgICAgICAgICAgZHVtbXkgPSBpZnAucmVhZGxpbmUoKQorCisgICAgICAgIGhxeGlmcCA9IF9IcXhkZWNvZGVyZW5naW5lKGlmcCkKKyAgICAgICAgc2VsZi5pZnAgPSBfUmxlZGVjb2RlcmVuZ2luZShocXhpZnApCisgICAgICAgIHNlbGYuY3JjID0gMAorICAgICAgICBzZWxmLl9yZWFkaGVhZGVyKCkKKworICAgIGRlZiBfcmVhZChzZWxmLCBsZW4pOgorICAgICAgICBkYXRhID0gc2VsZi5pZnAucmVhZChsZW4pCisgICAgICAgIHNlbGYuY3JjID0gYmluYXNjaWkuY3JjX2hxeChkYXRhLCBzZWxmLmNyYykKKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgIGRlZiBfY2hlY2tjcmMoc2VsZik6CisgICAgICAgIGZpbGVjcmMgPSBzdHJ1Y3QudW5wYWNrKCc+aCcsIHNlbGYuaWZwLnJlYWQoMikpWzBdICYgMHhmZmZmCisgICAgICAgICNzZWxmLmNyYyA9IGJpbmFzY2lpLmNyY19ocXgoJ1wwXDAnLCBzZWxmLmNyYykKKyAgICAgICAgIyBYWFhYIElzIHRoaXMgbmVlZGVkPz8KKyAgICAgICAgc2VsZi5jcmMgPSBzZWxmLmNyYyAmIDB4ZmZmZgorICAgICAgICBpZiBmaWxlY3JjICE9IHNlbGYuY3JjOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdDUkMgZXJyb3IsIGNvbXB1dGVkICV4LCByZWFkICV4JyBcCisgICAgICAgICAgICAgICAgICAlKHNlbGYuY3JjLCBmaWxlY3JjKQorICAgICAgICBzZWxmLmNyYyA9IDAKKworICAgIGRlZiBfcmVhZGhlYWRlcihzZWxmKToKKyAgICAgICAgbGVuID0gc2VsZi5fcmVhZCgxKQorICAgICAgICBmbmFtZSA9IHNlbGYuX3JlYWQob3JkKGxlbikpCisgICAgICAgIHJlc3QgPSBzZWxmLl9yZWFkKDErNCs0KzIrNCs0KQorICAgICAgICBzZWxmLl9jaGVja2NyYygpCisKKyAgICAgICAgdHlwZSA9IHJlc3RbMTo1XQorICAgICAgICBjcmVhdG9yID0gcmVzdFs1OjldCisgICAgICAgIGZsYWdzID0gc3RydWN0LnVucGFjaygnPmgnLCByZXN0Wzk6MTFdKVswXQorICAgICAgICBzZWxmLmRsZW4gPSBzdHJ1Y3QudW5wYWNrKCc+bCcsIHJlc3RbMTE6MTVdKVswXQorICAgICAgICBzZWxmLnJsZW4gPSBzdHJ1Y3QudW5wYWNrKCc+bCcsIHJlc3RbMTU6MTldKVswXQorCisgICAgICAgIHNlbGYuRk5hbWUgPSBmbmFtZQorICAgICAgICBzZWxmLkZJbmZvID0gRkluZm8oKQorICAgICAgICBzZWxmLkZJbmZvLkNyZWF0b3IgPSBjcmVhdG9yCisgICAgICAgIHNlbGYuRkluZm8uVHlwZSA9IHR5cGUKKyAgICAgICAgc2VsZi5GSW5mby5GbGFncyA9IGZsYWdzCisKKyAgICAgICAgc2VsZi5zdGF0ZSA9IF9ESURfSEVBREVSCisKKyAgICBkZWYgcmVhZChzZWxmLCAqbik6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgIT0gX0RJRF9IRUFERVI6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ1JlYWQgZGF0YSBhdCB3cm9uZyB0aW1lJworICAgICAgICBpZiBuOgorICAgICAgICAgICAgbiA9IG5bMF0KKyAgICAgICAgICAgIG4gPSBtaW4obiwgc2VsZi5kbGVuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbiA9IHNlbGYuZGxlbgorICAgICAgICBydiA9ICcnCisgICAgICAgIHdoaWxlIGxlbihydikgPCBuOgorICAgICAgICAgICAgcnYgPSBydiArIHNlbGYuX3JlYWQobi1sZW4ocnYpKQorICAgICAgICBzZWxmLmRsZW4gPSBzZWxmLmRsZW4gLSBuCisgICAgICAgIHJldHVybiBydgorCisgICAgZGVmIGNsb3NlX2RhdGEoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgIT0gX0RJRF9IRUFERVI6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nsb3NlX2RhdGEgYXQgd3JvbmcgdGltZScKKyAgICAgICAgaWYgc2VsZi5kbGVuOgorICAgICAgICAgICAgZHVtbXkgPSBzZWxmLl9yZWFkKHNlbGYuZGxlbikKKyAgICAgICAgc2VsZi5fY2hlY2tjcmMoKQorICAgICAgICBzZWxmLnN0YXRlID0gX0RJRF9EQVRBCisKKyAgICBkZWYgcmVhZF9yc3JjKHNlbGYsICpuKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSBfRElEX0hFQURFUjoKKyAgICAgICAgICAgIHNlbGYuY2xvc2VfZGF0YSgpCisgICAgICAgIGlmIHNlbGYuc3RhdGUgIT0gX0RJRF9EQVRBOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdSZWFkIHJlc291cmNlIGRhdGEgYXQgd3JvbmcgdGltZScKKyAgICAgICAgaWYgbjoKKyAgICAgICAgICAgIG4gPSBuWzBdCisgICAgICAgICAgICBuID0gbWluKG4sIHNlbGYucmxlbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG4gPSBzZWxmLnJsZW4KKyAgICAgICAgc2VsZi5ybGVuID0gc2VsZi5ybGVuIC0gbgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZChuKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnJsZW46CisgICAgICAgICAgICBkdW1teSA9IHNlbGYucmVhZF9yc3JjKHNlbGYucmxlbikKKyAgICAgICAgc2VsZi5fY2hlY2tjcmMoKQorICAgICAgICBzZWxmLnN0YXRlID0gX0RJRF9SU1JDCisgICAgICAgIHNlbGYuaWZwLmNsb3NlKCkKKworZGVmIGhleGJpbihpbnAsIG91dCk6CisgICAgIiIiKGluZmlsZW5hbWUsIG91dGZpbGVuYW1lKSAtIERlY29kZSBiaW5oZXhlZCBmaWxlIiIiCisgICAgaWZwID0gSGV4QmluKGlucCkKKyAgICBmaW5mbyA9IGlmcC5GSW5mbworICAgIGlmIG5vdCBvdXQ6CisgICAgICAgIG91dCA9IGlmcC5GTmFtZQorCisgICAgb2ZwID0gb3BlbihvdXQsICd3YicpCisgICAgIyBYWFhYIERvIHRyYW5zbGF0aW9uIG9uIG5vbi1tYWMgc3lzdGVtcworICAgIHdoaWxlIDE6CisgICAgICAgIGQgPSBpZnAucmVhZCgxMjgwMDApCisgICAgICAgIGlmIG5vdCBkOiBicmVhaworICAgICAgICBvZnAud3JpdGUoZCkKKyAgICBvZnAuY2xvc2UoKQorICAgIGlmcC5jbG9zZV9kYXRhKCkKKworICAgIGQgPSBpZnAucmVhZF9yc3JjKDEyODAwMCkKKyAgICBpZiBkOgorICAgICAgICBvZnAgPSBvcGVucnNyYyhvdXQsICd3YicpCisgICAgICAgIG9mcC53cml0ZShkKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgZCA9IGlmcC5yZWFkX3JzcmMoMTI4MDAwKQorICAgICAgICAgICAgaWYgbm90IGQ6IGJyZWFrCisgICAgICAgICAgICBvZnAud3JpdGUoZCkKKyAgICAgICAgb2ZwLmNsb3NlKCkKKworICAgIGlmcC5jbG9zZSgpCisKK2RlZiBfdGVzdCgpOgorICAgIGZuYW1lID0gc3lzLmFyZ3ZbMV0KKyAgICBiaW5oZXgoZm5hbWUsIGZuYW1lKycuaHF4JykKKyAgICBoZXhiaW4oZm5hbWUrJy5ocXgnLCBmbmFtZSsnLnZpYWhxeCcpCisgICAgI2hleGJpbihmbmFtZSwgZm5hbWUrJy51bnBhY2tlZCcpCisgICAgc3lzLmV4aXQoMSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JpbmhleC5weWMgYi9saWIvcHl0aG9uMi43L2JpbmhleC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxMjgzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYmluaGV4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JpbmhleC5weW8gYi9saWIvcHl0aG9uMi43L2JpbmhleC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxMjgzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYmluaGV4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Jpc2VjdC5weSBiL2xpYi9weXRob24yLjcvYmlzZWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNGQwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Jpc2VjdC5weQpAQCAtMCwwICsxLDkyIEBACisiIiJCaXNlY3Rpb24gYWxnb3JpdGhtcy4iIiIKKworZGVmIGluc29ydF9yaWdodChhLCB4LCBsbz0wLCBoaT1Ob25lKToKKyAgICAiIiJJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLgorCisgICAgSWYgeCBpcyBhbHJlYWR5IGluIGEsIGluc2VydCBpdCB0byB0aGUgcmlnaHQgb2YgdGhlIHJpZ2h0bW9zdCB4LgorCisgICAgT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgbGVuKGEpKSBib3VuZCB0aGUKKyAgICBzbGljZSBvZiBhIHRvIGJlIHNlYXJjaGVkLgorICAgICIiIgorCisgICAgaWYgbG8gPCAwOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpCisgICAgaWYgaGkgaXMgTm9uZToKKyAgICAgICAgaGkgPSBsZW4oYSkKKyAgICB3aGlsZSBsbyA8IGhpOgorICAgICAgICBtaWQgPSAobG8raGkpLy8yCisgICAgICAgIGlmIHggPCBhW21pZF06IGhpID0gbWlkCisgICAgICAgIGVsc2U6IGxvID0gbWlkKzEKKyAgICBhLmluc2VydChsbywgeCkKKworaW5zb3J0ID0gaW5zb3J0X3JpZ2h0ICAgIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisKK2RlZiBiaXNlY3RfcmlnaHQoYSwgeCwgbG89MCwgaGk9Tm9uZSk6CisgICAgIiIiUmV0dXJuIHRoZSBpbmRleCB3aGVyZSB0byBpbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuCisKKyAgICBUaGUgcmV0dXJuIHZhbHVlIGkgaXMgc3VjaCB0aGF0IGFsbCBlIGluIGFbOmldIGhhdmUgZSA8PSB4LCBhbmQgYWxsIGUgaW4KKyAgICBhW2k6XSBoYXZlIGUgPiB4LiAgU28gaWYgeCBhbHJlYWR5IGFwcGVhcnMgaW4gdGhlIGxpc3QsIGEuaW5zZXJ0KHgpIHdpbGwKKyAgICBpbnNlcnQganVzdCBhZnRlciB0aGUgcmlnaHRtb3N0IHggYWxyZWFkeSB0aGVyZS4KKworICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlCisgICAgc2xpY2Ugb2YgYSB0byBiZSBzZWFyY2hlZC4KKyAgICAiIiIKKworICAgIGlmIGxvIDwgMDoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKQorICAgIGlmIGhpIGlzIE5vbmU6CisgICAgICAgIGhpID0gbGVuKGEpCisgICAgd2hpbGUgbG8gPCBoaToKKyAgICAgICAgbWlkID0gKGxvK2hpKS8vMgorICAgICAgICBpZiB4IDwgYVttaWRdOiBoaSA9IG1pZAorICAgICAgICBlbHNlOiBsbyA9IG1pZCsxCisgICAgcmV0dXJuIGxvCisKK2Jpc2VjdCA9IGJpc2VjdF9yaWdodCAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorCitkZWYgaW5zb3J0X2xlZnQoYSwgeCwgbG89MCwgaGk9Tm9uZSk6CisgICAgIiIiSW5zZXJ0IGl0ZW0geCBpbiBsaXN0IGEsIGFuZCBrZWVwIGl0IHNvcnRlZCBhc3N1bWluZyBhIGlzIHNvcnRlZC4KKworICAgIElmIHggaXMgYWxyZWFkeSBpbiBhLCBpbnNlcnQgaXQgdG8gdGhlIGxlZnQgb2YgdGhlIGxlZnRtb3N0IHguCisKKyAgICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBsZW4oYSkpIGJvdW5kIHRoZQorICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuCisgICAgIiIiCisKKyAgICBpZiBsbyA8IDA6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xvIG11c3QgYmUgbm9uLW5lZ2F0aXZlJykKKyAgICBpZiBoaSBpcyBOb25lOgorICAgICAgICBoaSA9IGxlbihhKQorICAgIHdoaWxlIGxvIDwgaGk6CisgICAgICAgIG1pZCA9IChsbytoaSkvLzIKKyAgICAgICAgaWYgYVttaWRdIDwgeDogbG8gPSBtaWQrMQorICAgICAgICBlbHNlOiBoaSA9IG1pZAorICAgIGEuaW5zZXJ0KGxvLCB4KQorCisKK2RlZiBiaXNlY3RfbGVmdChhLCB4LCBsbz0wLCBoaT1Ob25lKToKKyAgICAiIiJSZXR1cm4gdGhlIGluZGV4IHdoZXJlIHRvIGluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhc3N1bWluZyBhIGlzIHNvcnRlZC4KKworICAgIFRoZSByZXR1cm4gdmFsdWUgaSBpcyBzdWNoIHRoYXQgYWxsIGUgaW4gYVs6aV0gaGF2ZSBlIDwgeCwgYW5kIGFsbCBlIGluCisgICAgYVtpOl0gaGF2ZSBlID49IHguICBTbyBpZiB4IGFscmVhZHkgYXBwZWFycyBpbiB0aGUgbGlzdCwgYS5pbnNlcnQoeCkgd2lsbAorICAgIGluc2VydCBqdXN0IGJlZm9yZSB0aGUgbGVmdG1vc3QgeCBhbHJlYWR5IHRoZXJlLgorCisgICAgT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgbGVuKGEpKSBib3VuZCB0aGUKKyAgICBzbGljZSBvZiBhIHRvIGJlIHNlYXJjaGVkLgorICAgICIiIgorCisgICAgaWYgbG8gPCAwOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpCisgICAgaWYgaGkgaXMgTm9uZToKKyAgICAgICAgaGkgPSBsZW4oYSkKKyAgICB3aGlsZSBsbyA8IGhpOgorICAgICAgICBtaWQgPSAobG8raGkpLy8yCisgICAgICAgIGlmIGFbbWlkXSA8IHg6IGxvID0gbWlkKzEKKyAgICAgICAgZWxzZTogaGkgPSBtaWQKKyAgICByZXR1cm4gbG8KKworIyBPdmVyd3JpdGUgYWJvdmUgZGVmaW5pdGlvbnMgd2l0aCBhIGZhc3QgQyBpbXBsZW1lbnRhdGlvbgordHJ5OgorICAgIGZyb20gX2Jpc2VjdCBpbXBvcnQgKgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYmlzZWN0LnB5YyBiL2xpYi9weXRob24yLjcvYmlzZWN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzc5ZTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9iaXNlY3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYmlzZWN0LnB5byBiL2xpYi9weXRob24yLjcvYmlzZWN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzc5ZTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9iaXNlY3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYzljMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNDU1IEBACisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEsIERpZ2l0YWwgQ3JlYXRpb25zLCBGcmVkZXJpY2tzYnVyZywgVkEsIFVTQQorIyAgYW5kIEFuZHJldyBLdWNobGluZy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyAgbWV0OgorIworIyAgICBvIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cy4KKyMKKyMgICAgbyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyMgICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjICAgICAgZGlzdHJpYnV0aW9uLgorIworIyAgICBvIE5laXRoZXIgdGhlIG5hbWUgb2YgRGlnaXRhbCBDcmVhdGlvbnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyMgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIERJR0lUQUwgQ1JFQVRJT05TIEFORCBDT05UUklCVVRPUlMgKkFTCisjICBJUyogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyMgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorIyAgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRElHSVRBTAorIyAgQ1JFQVRJT05TIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIyAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyMgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworIyAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisjICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisjICBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisjICBEQU1BR0UuCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyIiIlN1cHBvcnQgZm9yIEJlcmtlbGV5IERCIDQuMyB0aHJvdWdoIDUuMyB3aXRoIGEgc2ltcGxlIGludGVyZmFjZS4KKworRm9yIHRoZSBmdWxsIGZlYXR1cmVkIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2UgdXNlIHRoZSBic2RkYi5kYiBtb2R1bGUKK2luc3RlYWQuICBJdCBtaXJyb3JzIHRoZSBPcmFjbGUgQmVya2VsZXkgREIgQyBBUEkuCisiIiIKKworaW1wb3J0IHN5cworYWJzb2x1dGVfaW1wb3J0ID0gKHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMykKKworaWYgKHN5cy52ZXJzaW9uX2luZm8gPj0gKDIsIDYpKSBhbmQgKHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCkpIDoKKyAgICBpbXBvcnQgd2FybmluZ3MKKyAgICBpZiBzeXMucHkza3dhcm5pbmcgYW5kIChfX25hbWVfXyAhPSAnYnNkZGIzJykgOgorICAgICAgICB3YXJuaW5ncy53YXJucHkzaygiaW4gMy54LCB0aGUgYnNkZGIgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInBsZWFzZSB1c2UgdGhlIHB5YnNkZGIgcHJvamVjdCBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLipDT2JqZWN0LioiLCBEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJzZGRiLl9faW5pdF9fIikKKwordHJ5OgorICAgIGlmIF9fbmFtZV9fID09ICdic2RkYjMnOgorICAgICAgICAjIGltcG9ydCBfcHlic2RkYiBiaW5hcnkgYXMgaXQgc2hvdWxkIGJlIHRoZSBtb3JlIHJlY2VudCB2ZXJzaW9uIGZyb20KKyAgICAgICAgIyBhIHN0YW5kYWxvbmUgcHlic2RkYiBhZGRvbiBwYWNrYWdlIHRoYW4gdGhlIHZlcnNpb24gaW5jbHVkZWQgd2l0aAorICAgICAgICAjIHB5dGhvbiBhcyBic2RkYi5fYnNkZGIuCisgICAgICAgIGlmIGFic29sdXRlX2ltcG9ydCA6CisgICAgICAgICAgICAjIEJlY2F1c2UgdGhpcyBzeW50YXhpcyBpcyBub3QgdmFsaWQgYmVmb3JlIFB5dGhvbiAyLjUKKyAgICAgICAgICAgIGV4ZWMoImZyb20gLiBpbXBvcnQgX3B5YnNkZGIiKQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIGltcG9ydCBfcHlic2RkYgorICAgICAgICBfYnNkZGIgPSBfcHlic2RkYgorICAgICAgICBmcm9tIGJzZGRiMy5kYnV0aWxzIGltcG9ydCBEZWFkbG9ja1dyYXAgYXMgX0RlYWRsb2NrV3JhcAorICAgIGVsc2U6CisgICAgICAgIGltcG9ydCBfYnNkZGIKKyAgICAgICAgZnJvbSBic2RkYi5kYnV0aWxzIGltcG9ydCBEZWFkbG9ja1dyYXAgYXMgX0RlYWRsb2NrV3JhcAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgUmVtb3ZlIG91cnNlbHZlcyBmcm9tIHN5cy5tb2R1bGVzCisgICAgaW1wb3J0IHN5cworICAgIGRlbCBzeXMubW9kdWxlc1tfX25hbWVfX10KKyAgICByYWlzZQorCisjIGJzZGRiMyBjYWxscyBpdCBkYiwgYnV0IHByb3ZpZGUgX2RiIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorZGIgPSBfZGIgPSBfYnNkZGIKK19fdmVyc2lvbl9fID0gZGIuX192ZXJzaW9uX18KKworZXJyb3IgPSBkYi5EQkVycm9yICAjIFNvIGJzZGRiLmVycm9yIHdpbGwgbWVhbiBzb21ldGhpbmcuLi4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW1wb3J0IHN5cywgb3MKKworZnJvbSB3ZWFrcmVmIGltcG9ydCByZWYKKworaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgaW1wb3J0IFVzZXJEaWN0CisgICAgTXV0YWJsZU1hcHBpbmcgPSBVc2VyRGljdC5EaWN0TWl4aW4KK2Vsc2UgOgorICAgIGltcG9ydCBjb2xsZWN0aW9ucworICAgIE11dGFibGVNYXBwaW5nID0gY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcKKworY2xhc3MgX2l0ZXJfbWl4aW4oTXV0YWJsZU1hcHBpbmcpOgorICAgIGRlZiBfbWFrZV9pdGVyX2N1cnNvcihzZWxmKToKKyAgICAgICAgY3VyID0gX0RlYWRsb2NrV3JhcChzZWxmLmRiLmN1cnNvcikKKyAgICAgICAga2V5ID0gaWQoY3VyKQorICAgICAgICBzZWxmLl9jdXJzb3JfcmVmc1trZXldID0gcmVmKGN1ciwgc2VsZi5fZ2VuX2NyZWZfY2xlYW5lcihrZXkpKQorICAgICAgICByZXR1cm4gY3VyCisKKyAgICBkZWYgX2dlbl9jcmVmX2NsZWFuZXIoc2VsZiwga2V5KToKKyAgICAgICAgIyB1c2UgZ2VuZXJhdGUgdGhlIGZ1bmN0aW9uIGZvciB0aGUgd2Vha3JlZiBjYWxsYmFjayBoZXJlCisgICAgICAgICMgdG8gZW5zdXJlIHRoYXQgd2UgZG8gbm90IGhvbGQgYSBzdHJpY3QgcmVmZXJlbmNlIHRvIGN1cgorICAgICAgICAjIGluIHRoZSBjYWxsYmFjay4KKyAgICAgICAgcmV0dXJuIGxhbWJkYSByZWY6IHNlbGYuX2N1cnNvcl9yZWZzLnBvcChrZXksIE5vbmUpCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuX2tpbGxfaXRlcmF0aW9uID0gRmFsc2UKKyAgICAgICAgc2VsZi5faW5faXRlciArPSAxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXIgPSBzZWxmLl9tYWtlX2l0ZXJfY3Vyc29yKCkKKworICAgICAgICAgICAgICAgICMgRklYTUUtMjAwMzExMDItZ3JlZzogcmFjZSBjb25kaXRpb24uICBjdXJzb3IgY291bGQKKyAgICAgICAgICAgICAgICAjIGJlIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBiZWZvcmUgdGhpcyBjYWxsLgorCisgICAgICAgICAgICAgICAgIyBzaW5jZSB3ZSdyZSBvbmx5IHJldHVybmluZyBrZXlzLCB3ZSBjYWxsIHRoZSBjdXJzb3IKKyAgICAgICAgICAgICAgICAjIG1ldGhvZHMgd2l0aCBmbGFncz0wLCBkbGVuPTAsIGRvZnM9MAorICAgICAgICAgICAgICAgIGtleSA9IF9EZWFkbG9ja1dyYXAoY3VyLmZpcnN0LCAwLDAsMClbMF0KKyAgICAgICAgICAgICAgICB5aWVsZCBrZXkKKworICAgICAgICAgICAgICAgIG5leHQgPSBnZXRhdHRyKGN1ciwgIm5leHQiKQorICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IF9EZWFkbG9ja1dyYXAobmV4dCwgMCwwLDApWzBdCisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBrZXkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQkN1cnNvckNsb3NlZEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fa2lsbF9pdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdEYXRhYmFzZSBjaGFuZ2VkIHNpemUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHVyaW5nIGl0ZXJhdGlvbi4nKQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gc2VsZi5fbWFrZV9pdGVyX2N1cnNvcigpCisgICAgICAgICAgICAgICAgICAgICAgICAjIEZJWE1FLTIwMDMxMTAxLWdyZWc6IHJhY2UgY29uZGl0aW9uLiAgY3Vyc29yIGNvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAjIGJlIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBiZWZvcmUgdGhpcyBjYWxsLgorICAgICAgICAgICAgICAgICAgICAgICAgX0RlYWRsb2NrV3JhcChjdXIuc2V0LCBrZXksMCwwLDApCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gZ2V0YXR0cihjdXIsICJuZXh0IikKKyAgICAgICAgICAgIGV4Y2VwdCBfYnNkZGIuREJOb3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBfYnNkZGIuREJDdXJzb3JDbG9zZWRFcnJvcjoKKyAgICAgICAgICAgICAgICAjIHRoZSBkYXRhYmFzZSB3YXMgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi4gIGFib3J0LgorICAgICAgICAgICAgICAgIHBhc3MKKyMgV2hlbiBQeXRob24gMi40IG5vdCBzdXBwb3J0ZWQgaW4gYnNkZGIzLCB3ZSBjYW4gY2hhbmdlIHRoaXMgdG8gImZpbmFsbHkiCisgICAgICAgIGV4Y2VwdCA6CisgICAgICAgICAgICBzZWxmLl9pbl9pdGVyIC09IDEKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgc2VsZi5faW5faXRlciAtPSAxCisKKyAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5kYjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9raWxsX2l0ZXJhdGlvbiA9IEZhbHNlCisgICAgICAgIHNlbGYuX2luX2l0ZXIgKz0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3VyID0gc2VsZi5fbWFrZV9pdGVyX2N1cnNvcigpCisKKyAgICAgICAgICAgICAgICAjIEZJWE1FLTIwMDMxMTAyLWdyZWc6IHJhY2UgY29uZGl0aW9uLiAgY3Vyc29yIGNvdWxkCisgICAgICAgICAgICAgICAgIyBiZSBjbG9zZWQgYnkgYW5vdGhlciB0aHJlYWQgYmVmb3JlIHRoaXMgY2FsbC4KKworICAgICAgICAgICAgICAgIGt2ID0gX0RlYWRsb2NrV3JhcChjdXIuZmlyc3QpCisgICAgICAgICAgICAgICAga2V5ID0ga3ZbMF0KKyAgICAgICAgICAgICAgICB5aWVsZCBrdgorCisgICAgICAgICAgICAgICAgbmV4dCA9IGdldGF0dHIoY3VyLCAibmV4dCIpCisgICAgICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAga3YgPSBfRGVhZGxvY2tXcmFwKG5leHQpCisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrdlswXQorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQga3YKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQkN1cnNvckNsb3NlZEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fa2lsbF9pdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdEYXRhYmFzZSBjaGFuZ2VkIHNpemUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHVyaW5nIGl0ZXJhdGlvbi4nKQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gc2VsZi5fbWFrZV9pdGVyX2N1cnNvcigpCisgICAgICAgICAgICAgICAgICAgICAgICAjIEZJWE1FLTIwMDMxMTAxLWdyZWc6IHJhY2UgY29uZGl0aW9uLiAgY3Vyc29yIGNvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAjIGJlIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBiZWZvcmUgdGhpcyBjYWxsLgorICAgICAgICAgICAgICAgICAgICAgICAgX0RlYWRsb2NrV3JhcChjdXIuc2V0LCBrZXksMCwwLDApCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gZ2V0YXR0cihjdXIsICJuZXh0IikKKyAgICAgICAgICAgIGV4Y2VwdCBfYnNkZGIuREJOb3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBfYnNkZGIuREJDdXJzb3JDbG9zZWRFcnJvcjoKKyAgICAgICAgICAgICAgICAjIHRoZSBkYXRhYmFzZSB3YXMgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi4gIGFib3J0LgorICAgICAgICAgICAgICAgIHBhc3MKKyMgV2hlbiBQeXRob24gMi40IG5vdCBzdXBwb3J0ZWQgaW4gYnNkZGIzLCB3ZSBjYW4gY2hhbmdlIHRoaXMgdG8gImZpbmFsbHkiCisgICAgICAgIGV4Y2VwdCA6CisgICAgICAgICAgICBzZWxmLl9pbl9pdGVyIC09IDEKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgc2VsZi5faW5faXRlciAtPSAxCisKKworY2xhc3MgX0RCV2l0aEN1cnNvcihfaXRlcl9taXhpbik6CisgICAgIiIiCisgICAgQSBzaW1wbGUgd3JhcHBlciBhcm91bmQgREIgdGhhdCBtYWtlcyBpdCBsb29rIGxpa2UgdGhlIGJzZGRib2JqZWN0IGluCisgICAgdGhlIG9sZCBtb2R1bGUuICBJdCB1c2VzIGEgY3Vyc29yIGFzIG5lZWRlZCB0byBwcm92aWRlIERCIHRyYXZlcnNhbC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGIpOgorICAgICAgICBzZWxmLmRiID0gZGIKKyAgICAgICAgc2VsZi5kYi5zZXRfZ2V0X3JldHVybnNfbm9uZSgwKQorCisgICAgICAgICMgRklYTUUtMjAwMzExMDEtZ3JlZzogSSBiZWxpZXZlIHRoZXJlIGlzIHN0aWxsIHRoZSBwb3RlbnRpYWwKKyAgICAgICAgIyBmb3IgZGVhZGxvY2tzIGluIGEgbXVsdGl0aHJlYWRlZCBlbnZpcm9ubWVudCBpZiBzb21lb25lCisgICAgICAgICMgYXR0ZW1wdHMgdG8gdXNlIHRoZSBhbnkgb2YgdGhlIGN1cnNvciBpbnRlcmZhY2VzIGluIG9uZQorICAgICAgICAjIHRocmVhZCB3aGlsZSBkb2luZyBhIHB1dCBvciBkZWxldGUgaW4gYW5vdGhlciB0aHJlYWQuICBUaGUKKyAgICAgICAgIyByZWFzb24gaXMgdGhhdCBfY2hlY2tDdXJzb3IgYW5kIF9jbG9zZUN1cnNvcnMgYXJlIG5vdCBhdG9taWMKKyAgICAgICAgIyBvcGVyYXRpb25zLiAgRG9pbmcgb3VyIG93biBsb2NraW5nIGFyb3VuZCBzZWxmLmRiYywKKyAgICAgICAgIyBzZWxmLnNhdmVkX2RiY19rZXkgYW5kIHNlbGYuX2N1cnNvcl9yZWZzIGNvdWxkIHByZXZlbnQgdGhpcy4KKyAgICAgICAgIyBUT0RPOiBBIHRlc3QgY2FzZSBkZW1vbnN0cmF0aW5nIHRoZSBwcm9ibGVtIG5lZWRzIHRvIGJlIHdyaXR0ZW4uCisKKyAgICAgICAgIyBzZWxmLmRiYyBpcyBhIERCQ3Vyc29yIG9iamVjdCB1c2VkIHRvIGltcGxlbWVudCB0aGUKKyAgICAgICAgIyBmaXJzdC9uZXh0L3ByZXZpb3VzL2xhc3Qvc2V0X2xvY2F0aW9uIG1ldGhvZHMuCisgICAgICAgIHNlbGYuZGJjID0gTm9uZQorICAgICAgICBzZWxmLnNhdmVkX2RiY19rZXkgPSBOb25lCisKKyAgICAgICAgIyBhIGNvbGxlY3Rpb24gb2YgYWxsIERCQ3Vyc29yIG9iamVjdHMgY3VycmVudGx5IGFsbG9jYXRlZAorICAgICAgICAjIGJ5IHRoZSBfaXRlcl9taXhpbiBpbnRlcmZhY2UuCisgICAgICAgIHNlbGYuX2N1cnNvcl9yZWZzID0ge30KKyAgICAgICAgc2VsZi5faW5faXRlciA9IDAKKyAgICAgICAgc2VsZi5fa2lsbF9pdGVyYXRpb24gPSBGYWxzZQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIF9jaGVja0N1cnNvcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kYmMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGJjID0gX0RlYWRsb2NrV3JhcChzZWxmLmRiLmN1cnNvcikKKyAgICAgICAgICAgIGlmIHNlbGYuc2F2ZWRfZGJjX2tleSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLnNldCwgc2VsZi5zYXZlZF9kYmNfa2V5KQorICAgICAgICAgICAgICAgIHNlbGYuc2F2ZWRfZGJjX2tleSA9IE5vbmUKKworICAgICMgVGhpcyBtZXRob2QgaXMgbmVlZGVkIGZvciBhbGwgbm9uLWN1cnNvciBEQiBjYWxscyB0byBhdm9pZAorICAgICMgQmVya2VsZXkgREIgZGVhZGxvY2tzIChkdWUgdG8gYmVpbmcgb3BlbmVkIHdpdGggREJfSU5JVF9MT0NLCisgICAgIyBhbmQgREJfVEhSRUFEIHRvIGJlIHRocmVhZCBzYWZlKSB3aGVuIGludGVybWl4aW5nIGRhdGFiYXNlCisgICAgIyBvcGVyYXRpb25zIHRoYXQgdXNlIHRoZSBjdXJzb3IgaW50ZXJuYWxseSB3aXRoIHRob3NlIHRoYXQgZG9uJ3QuCisgICAgZGVmIF9jbG9zZUN1cnNvcnMoc2VsZiwgc2F2ZT0xKToKKyAgICAgICAgaWYgc2VsZi5kYmM6CisgICAgICAgICAgICBjID0gc2VsZi5kYmMKKyAgICAgICAgICAgIHNlbGYuZGJjID0gTm9uZQorICAgICAgICAgICAgaWYgc2F2ZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2F2ZWRfZGJjX2tleSA9IF9EZWFkbG9ja1dyYXAoYy5jdXJyZW50LCAwLDAsMClbMF0KKyAgICAgICAgICAgICAgICBleGNlcHQgZGIuREJFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgX0RlYWRsb2NrV3JhcChjLmNsb3NlKQorICAgICAgICAgICAgZGVsIGMKKyAgICAgICAgZm9yIGNyZWYgaW4gc2VsZi5fY3Vyc29yX3JlZnMudmFsdWVzKCk6CisgICAgICAgICAgICBjID0gY3JlZigpCisgICAgICAgICAgICBpZiBjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIF9EZWFkbG9ja1dyYXAoYy5jbG9zZSkKKworICAgIGRlZiBfY2hlY2tPcGVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRiIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgIkJTRERCIG9iamVjdCBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCIKKworICAgIGRlZiBpc09wZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRiIGlzIG5vdCBOb25lCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKKyAgICAgICAgcmV0dXJuIF9EZWFkbG9ja1dyYXAobGFtYmRhOiBsZW4oc2VsZi5kYikpICAjIGxlbihzZWxmLmRiKQorCisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMiwgNikgOgorICAgICAgICBkZWYgX19yZXByX18oc2VsZikgOgorICAgICAgICAgICAgaWYgc2VsZi5pc09wZW4oKSA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcHIoZGljdChfRGVhZGxvY2tXcmFwKHNlbGYuZGIuaXRlbXMpKSkKKyAgICAgICAgICAgIHJldHVybiByZXByKGRpY3QoKSkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBzZWxmLl9jaGVja09wZW4oKQorICAgICAgICByZXR1cm4gX0RlYWRsb2NrV3JhcChsYW1iZGE6IHNlbGYuZGJba2V5XSkgICMgc2VsZi5kYltrZXldCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCisgICAgICAgIHNlbGYuX2Nsb3NlQ3Vyc29ycygpCisgICAgICAgIGlmIHNlbGYuX2luX2l0ZXIgYW5kIGtleSBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgIHNlbGYuX2tpbGxfaXRlcmF0aW9uID0gVHJ1ZQorICAgICAgICBkZWYgd3JhcEYoKToKKyAgICAgICAgICAgIHNlbGYuZGJba2V5XSA9IHZhbHVlCisgICAgICAgIF9EZWFkbG9ja1dyYXAod3JhcEYpICAjIHNlbGYuZGJba2V5XSA9IHZhbHVlCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKKyAgICAgICAgc2VsZi5fY2xvc2VDdXJzb3JzKCkKKyAgICAgICAgaWYgc2VsZi5faW5faXRlciBhbmQga2V5IGluIHNlbGY6CisgICAgICAgICAgICBzZWxmLl9raWxsX2l0ZXJhdGlvbiA9IFRydWUKKyAgICAgICAgZGVmIHdyYXBGKCk6CisgICAgICAgICAgICBkZWwgc2VsZi5kYltrZXldCisgICAgICAgIF9EZWFkbG9ja1dyYXAod3JhcEYpICAjIGRlbCBzZWxmLmRiW2tleV0KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fY2xvc2VDdXJzb3JzKHNhdmU9MCkKKyAgICAgICAgaWYgc2VsZi5kYmMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLmNsb3NlKQorICAgICAgICB2ID0gMAorICAgICAgICBpZiBzZWxmLmRiIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdiA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYi5jbG9zZSkKKyAgICAgICAgc2VsZi5kYmMgPSBOb25lCisgICAgICAgIHNlbGYuZGIgPSBOb25lCisgICAgICAgIHJldHVybiB2CisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKKyAgICAgICAgcmV0dXJuIF9EZWFkbG9ja1dyYXAoc2VsZi5kYi5rZXlzKQorCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKKyAgICAgICAgcmV0dXJuIF9EZWFkbG9ja1dyYXAoc2VsZi5kYi5oYXNfa2V5LCBrZXkpCisKKyAgICBkZWYgc2V0X2xvY2F0aW9uKHNlbGYsIGtleSk6CisgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCisgICAgICAgIHNlbGYuX2NoZWNrQ3Vyc29yKCkKKyAgICAgICAgcmV0dXJuIF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMuc2V0X3JhbmdlLCBrZXkpCisKKyAgICBkZWYgbmV4dChzZWxmKTogICMgUmVuYW1lZCBieSAiMnRvMyIKKyAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKKyAgICAgICAgc2VsZi5fY2hlY2tDdXJzb3IoKQorICAgICAgICBydiA9IF9EZWFkbG9ja1dyYXAoZ2V0YXR0cihzZWxmLmRiYywgIm5leHQiKSkKKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDMgOiAgIyBGb3IgIjJ0bzMiIGNvbnZlcnNpb24KKyAgICAgICAgbmV4dCA9IF9fbmV4dF9fCisKKyAgICBkZWYgcHJldmlvdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCisgICAgICAgIHNlbGYuX2NoZWNrQ3Vyc29yKCkKKyAgICAgICAgcnYgPSBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLnByZXYpCisgICAgICAgIHJldHVybiBydgorCisgICAgZGVmIGZpcnN0KHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja09wZW4oKQorICAgICAgICAjIGZpeCAxNzI1ODU2OiBkb24ndCBuZWVkbGVzc2x5IHRyeSB0byByZXN0b3JlIG91ciBjdXJzb3IgcG9zaXRpb24KKyAgICAgICAgc2VsZi5zYXZlZF9kYmNfa2V5ID0gTm9uZQorICAgICAgICBzZWxmLl9jaGVja0N1cnNvcigpCisgICAgICAgIHJ2ID0gX0RlYWRsb2NrV3JhcChzZWxmLmRiYy5maXJzdCkKKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgbGFzdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKKyAgICAgICAgIyBmaXggMTcyNTg1NjogZG9uJ3QgbmVlZGxlc3NseSB0cnkgdG8gcmVzdG9yZSBvdXIgY3Vyc29yIHBvc2l0aW9uCisgICAgICAgIHNlbGYuc2F2ZWRfZGJjX2tleSA9IE5vbmUKKyAgICAgICAgc2VsZi5fY2hlY2tDdXJzb3IoKQorICAgICAgICBydiA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMubGFzdCkKKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgc3luYyhzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKKyAgICAgICAgcmV0dXJuIF9EZWFkbG9ja1dyYXAoc2VsZi5kYi5zeW5jKQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbXBhdGliaWxpdHkgb2JqZWN0IGZhY3RvcnkgZnVuY3Rpb25zCisKK2RlZiBoYXNob3BlbihmaWxlLCBmbGFnPSdjJywgbW9kZT0wNjY2LCBwZ3NpemU9Tm9uZSwgZmZhY3Rvcj1Ob25lLCBuZWxlbT1Ob25lLAorICAgICAgICAgICAgY2FjaGVzaXplPU5vbmUsIGxvcmRlcj1Ob25lLCBoZmxhZ3M9MCk6CisKKyAgICBmbGFncyA9IF9jaGVja2ZsYWcoZmxhZywgZmlsZSkKKyAgICBlID0gX29wZW5EQkVudihjYWNoZXNpemUpCisgICAgZCA9IGRiLkRCKGUpCisgICAgZC5zZXRfZmxhZ3MoaGZsYWdzKQorICAgIGlmIHBnc2l6ZSBpcyBub3QgTm9uZTogICAgZC5zZXRfcGFnZXNpemUocGdzaXplKQorICAgIGlmIGxvcmRlciBpcyBub3QgTm9uZTogICAgZC5zZXRfbG9yZGVyKGxvcmRlcikKKyAgICBpZiBmZmFjdG9yIGlzIG5vdCBOb25lOiAgIGQuc2V0X2hfZmZhY3RvcihmZmFjdG9yKQorICAgIGlmIG5lbGVtIGlzIG5vdCBOb25lOiAgICAgZC5zZXRfaF9uZWxlbShuZWxlbSkKKyAgICBkLm9wZW4oZmlsZSwgZGIuREJfSEFTSCwgZmxhZ3MsIG1vZGUpCisgICAgcmV0dXJuIF9EQldpdGhDdXJzb3IoZCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIGJ0b3BlbihmaWxlLCBmbGFnPSdjJywgbW9kZT0wNjY2LAorICAgICAgICAgICAgYnRmbGFncz0wLCBjYWNoZXNpemU9Tm9uZSwgbWF4a2V5cGFnZT1Ob25lLCBtaW5rZXlwYWdlPU5vbmUsCisgICAgICAgICAgICBwZ3NpemU9Tm9uZSwgbG9yZGVyPU5vbmUpOgorCisgICAgZmxhZ3MgPSBfY2hlY2tmbGFnKGZsYWcsIGZpbGUpCisgICAgZSA9IF9vcGVuREJFbnYoY2FjaGVzaXplKQorICAgIGQgPSBkYi5EQihlKQorICAgIGlmIHBnc2l6ZSBpcyBub3QgTm9uZTogZC5zZXRfcGFnZXNpemUocGdzaXplKQorICAgIGlmIGxvcmRlciBpcyBub3QgTm9uZTogZC5zZXRfbG9yZGVyKGxvcmRlcikKKyAgICBkLnNldF9mbGFncyhidGZsYWdzKQorICAgIGlmIG1pbmtleXBhZ2UgaXMgbm90IE5vbmU6IGQuc2V0X2J0X21pbmtleShtaW5rZXlwYWdlKQorICAgIGlmIG1heGtleXBhZ2UgaXMgbm90IE5vbmU6IGQuc2V0X2J0X21heGtleShtYXhrZXlwYWdlKQorICAgIGQub3BlbihmaWxlLCBkYi5EQl9CVFJFRSwgZmxhZ3MsIG1vZGUpCisgICAgcmV0dXJuIF9EQldpdGhDdXJzb3IoZCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitkZWYgcm5vcGVuKGZpbGUsIGZsYWc9J2MnLCBtb2RlPTA2NjYsCisgICAgICAgICAgICBybmZsYWdzPTAsIGNhY2hlc2l6ZT1Ob25lLCBwZ3NpemU9Tm9uZSwgbG9yZGVyPU5vbmUsCisgICAgICAgICAgICBybGVuPU5vbmUsIGRlbGltPU5vbmUsIHNvdXJjZT1Ob25lLCBwYWQ9Tm9uZSk6CisKKyAgICBmbGFncyA9IF9jaGVja2ZsYWcoZmxhZywgZmlsZSkKKyAgICBlID0gX29wZW5EQkVudihjYWNoZXNpemUpCisgICAgZCA9IGRiLkRCKGUpCisgICAgaWYgcGdzaXplIGlzIG5vdCBOb25lOiBkLnNldF9wYWdlc2l6ZShwZ3NpemUpCisgICAgaWYgbG9yZGVyIGlzIG5vdCBOb25lOiBkLnNldF9sb3JkZXIobG9yZGVyKQorICAgIGQuc2V0X2ZsYWdzKHJuZmxhZ3MpCisgICAgaWYgZGVsaW0gaXMgbm90IE5vbmU6IGQuc2V0X3JlX2RlbGltKGRlbGltKQorICAgIGlmIHJsZW4gaXMgbm90IE5vbmU6IGQuc2V0X3JlX2xlbihybGVuKQorICAgIGlmIHNvdXJjZSBpcyBub3QgTm9uZTogZC5zZXRfcmVfc291cmNlKHNvdXJjZSkKKyAgICBpZiBwYWQgaXMgbm90IE5vbmU6IGQuc2V0X3JlX3BhZChwYWQpCisgICAgZC5vcGVuKGZpbGUsIGRiLkRCX1JFQ05PLCBmbGFncywgbW9kZSkKKyAgICByZXR1cm4gX0RCV2l0aEN1cnNvcihkKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgX29wZW5EQkVudihjYWNoZXNpemUpOgorICAgIGUgPSBkYi5EQkVudigpCisgICAgaWYgY2FjaGVzaXplIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBjYWNoZXNpemUgPj0gMjA0ODA6CisgICAgICAgICAgICBlLnNldF9jYWNoZXNpemUoMCwgY2FjaGVzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJjYWNoZXNpemUgbXVzdCBiZSA+PSAyMDQ4MCIKKyAgICBlLnNldF9sa19kZXRlY3QoZGIuREJfTE9DS19ERUZBVUxUKQorICAgIGUub3BlbignLicsIGRiLkRCX1BSSVZBVEUgfCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQgfCBkYi5EQl9JTklUX0xPQ0sgfCBkYi5EQl9JTklUX01QT09MKQorICAgIHJldHVybiBlCisKK2RlZiBfY2hlY2tmbGFnKGZsYWcsIGZpbGUpOgorICAgIGlmIGZsYWcgPT0gJ3InOgorICAgICAgICBmbGFncyA9IGRiLkRCX1JET05MWQorICAgIGVsaWYgZmxhZyA9PSAncncnOgorICAgICAgICBmbGFncyA9IDAKKyAgICBlbGlmIGZsYWcgPT0gJ3cnOgorICAgICAgICBmbGFncyA9ICBkYi5EQl9DUkVBVEUKKyAgICBlbGlmIGZsYWcgPT0gJ2MnOgorICAgICAgICBmbGFncyA9ICBkYi5EQl9DUkVBVEUKKyAgICBlbGlmIGZsYWcgPT0gJ24nOgorICAgICAgICBmbGFncyA9IGRiLkRCX0NSRUFURQorICAgICAgICAjZmxhZ3MgPSBkYi5EQl9DUkVBVEUgfCBkYi5EQl9UUlVOQ0FURQorICAgICAgICAjIHdlIHVzZWQgZGIuREJfVFJVTkNBVEUgZmxhZyBmb3IgdGhpcyBiZWZvcmUgYnV0IEJlcmtlbGV5IERCCisgICAgICAgICMgNC4yLjUyIGNoYW5nZWQgdG8gZGlzYWxsb3dlZCB0cnVuY2F0ZSB3aXRoIHR4biBlbnZpcm9ubWVudHMuCisgICAgICAgIGlmIGZpbGUgaXMgbm90IE5vbmUgYW5kIG9zLnBhdGguaXNmaWxlKGZpbGUpOgorICAgICAgICAgICAgb3MudW5saW5rKGZpbGUpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgZXJyb3IsICJmbGFncyBzaG91bGQgYmUgb25lIG9mICdyJywgJ3cnLCAnYycgb3IgJ24nIgorICAgIHJldHVybiBmbGFncyB8IGRiLkRCX1RIUkVBRAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyMgVGhpcyBpcyBhIHNpbGx5IGxpdHRsZSBoYWNrIHRoYXQgYWxsb3dzIGFwcHMgdG8gY29udGludWUgdG8gdXNlIHRoZQorIyBEQl9USFJFQUQgZmxhZyBldmVuIG9uIHN5c3RlbXMgd2l0aG91dCB0aHJlYWRzIHdpdGhvdXQgZnJlYWtpbmcgb3V0CisjIEJlcmtlbGV5IERCLgorIworIyBUaGlzIGFzc3VtZXMgdGhhdCBpZiBQeXRob24gd2FzIGJ1aWx0IHdpdGggdGhyZWFkIHN1cHBvcnQgdGhlbgorIyBCZXJrZWxleSBEQiB3YXMgdG9vLgorCit0cnk6CisgICAgIyAydG8zIGF1dG9tYXRpY2FsbHkgY2hhbmdlcyAiaW1wb3J0IHRocmVhZCIgdG8gImltcG9ydCBfdGhyZWFkIgorICAgIGltcG9ydCB0aHJlYWQgYXMgVAorICAgIGRlbCBUCisKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBkYi5EQl9USFJFQUQgPSAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzY2ZhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzY2ZhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL2RiLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2FlZTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYi5weQpAQCAtMCwwICsxLDYwIEBACisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDEsIERpZ2l0YWwgQ3JlYXRpb25zLCBGcmVkZXJpY2tzYnVyZywgVkEsIFVTQQorIyAgYW5kIEFuZHJldyBLdWNobGluZy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorIyAgbWV0OgorIworIyAgICBvIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBkaXNjbGFpbWVyIHRoYXQgZm9sbG93cy4KKyMKKyMgICAgbyBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyMgICAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisjICAgICAgZGlzdHJpYnV0aW9uLgorIworIyAgICBvIE5laXRoZXIgdGhlIG5hbWUgb2YgRGlnaXRhbCBDcmVhdGlvbnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyMgICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyMgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIERJR0lUQUwgQ1JFQVRJT05TIEFORCBDT05UUklCVVRPUlMgKkFTCisjICBJUyogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKKyMgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorIyAgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgRElHSVRBTAorIyAgQ1JFQVRJT05TIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorIyAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywKKyMgIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUworIyAgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorIyAgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SCisjICBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFCisjICBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICisjICBEQU1BR0UuCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyMgVGhpcyBtb2R1bGUgaXMganVzdCBhIHBsYWNlaG9sZGVyIGZvciBwb3NzaWJsZSBmdXR1cmUgZXhwYW5zaW9uLCBpbgorIyBjYXNlIHdlIGV2ZXIgd2FudCB0byBhdWdtZW50IHRoZSBzdHVmZiBpbiBfZGIgaW4gYW55IHdheS4gIEZvciBub3cKKyMgaXQganVzdCBzaW1wbHkgaW1wb3J0cyBldmVyeXRoaW5nIGZyb20gX2RiLgorCitpbXBvcnQgc3lzCithYnNvbHV0ZV9pbXBvcnQgPSAoc3lzLnZlcnNpb25faW5mb1swXSA+PSAzKQorCitpZiBub3QgYWJzb2x1dGVfaW1wb3J0IDoKKyAgICBpZiBfX25hbWVfXy5zdGFydHN3aXRoKCdic2RkYjMuJykgOgorICAgICAgICAjIGltcG9ydCBfcHlic2RkYiBiaW5hcnkgYXMgaXQgc2hvdWxkIGJlIHRoZSBtb3JlIHJlY2VudCB2ZXJzaW9uIGZyb20KKyAgICAgICAgIyBhIHN0YW5kYWxvbmUgcHlic2RkYiBhZGRvbiBwYWNrYWdlIHRoYW4gdGhlIHZlcnNpb24gaW5jbHVkZWQgd2l0aAorICAgICAgICAjIHB5dGhvbiBhcyBic2RkYi5fYnNkZGIuCisgICAgICAgIGZyb20gX3B5YnNkZGIgaW1wb3J0ICoKKyAgICAgICAgZnJvbSBfcHlic2RkYiBpbXBvcnQgX192ZXJzaW9uX18KKyAgICBlbHNlOgorICAgICAgICBmcm9tIF9ic2RkYiBpbXBvcnQgKgorICAgICAgICBmcm9tIF9ic2RkYiBpbXBvcnQgX192ZXJzaW9uX18KK2Vsc2UgOgorICAgICMgQmVjYXVzZSB0aGlzIHN5bnRheGlzIGlzIG5vdCB2YWxpZCBiZWZvcmUgUHl0aG9uIDIuNQorICAgIGlmIF9fbmFtZV9fLnN0YXJ0c3dpdGgoJ2JzZGRiMy4nKSA6CisgICAgICAgIGV4ZWMoImZyb20gLl9weWJzZGRiIGltcG9ydCAqIikKKyAgICAgICAgZXhlYygiZnJvbSAuX3B5YnNkZGIgaW1wb3J0IF9fdmVyc2lvbl9fIikKKyAgICBlbHNlIDoKKyAgICAgICAgZXhlYygiZnJvbSAuX2JzZGRiIGltcG9ydCAqIikKKyAgICAgICAgZXhlYygiZnJvbSAuX2JzZGRiIGltcG9ydCBfX3ZlcnNpb25fXyIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL2RiLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTI2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL2RiLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL2RiLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvZGIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTI2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL2RiLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL2Rib2JqLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYm9iai5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDAwZmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYm9iai5weQpAQCAtMCwwICsxLDI2NiBAQAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgIFRoaXMgZmlsZSBjb250YWlucyByZWFsIFB5dGhvbiBvYmplY3Qgd3JhcHBlcnMgZm9yIERCIGFuZCBEQkVudgorIyAgQyAib2JqZWN0cyIgdGhhdCBjYW4gYmUgdXNlZnVsbHkgc3ViY2xhc3NlZC4gIFRoZSBwcmV2aW91cyBTV0lHCisjICBiYXNlZCBpbnRlcmZhY2UgYWxsb3dlZCB0aGlzIHRoYW5rcyB0byBTV0lHJ3Mgc2hhZG93IGNsYXNzZXMuCisjICAgLS0gIEdyZWdvcnkgUC4gU21pdGgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIChDKSBDb3B5cmlnaHQgMjAwMSAgQXV0b25vbW91cyBab25lIEluZHVzdHJpZXMKKyMKKyMgTGljZW5zZTogIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZS4gIFlvdSBtYXkgdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorIyAgICAgICAgICAgcHVycG9zZSBpbmNsdWRpbmcgbW9kaWZpY2F0aW9uL3JlZGlzdHJpYnV0aW9uLCBzbyBsb25nIGFzCisjICAgICAgICAgICB0aGlzIGhlYWRlciByZW1haW5zIGludGFjdCBhbmQgdGhhdCB5b3UgZG8gbm90IGNsYWltIGFueQorIyAgICAgICAgICAgcmlnaHRzIG9mIG93bmVyc2hpcCBvciBhdXRob3JzaGlwIG9mIHRoaXMgc29mdHdhcmUuICBUaGlzCisjICAgICAgICAgICBzb2Z0d2FyZSBoYXMgYmVlbiB0ZXN0ZWQsIGJ1dCBubyB3YXJyYW50eSBpcyBleHByZXNzZWQgb3IKKyMgICAgICAgICAgIGltcGxpZWQuCisjCisKKyMKKyMgVE9ETyBpdCB3b3VsZCBiZSAqcmVhbGx5IG5pY2UqIHRvIGhhdmUgYW4gYXV0b21hdGljIHNoYWRvdyBjbGFzcyBwb3B1bGF0b3IKKyMgc28gdGhhdCBuZXcgbWV0aG9kcyBkb24ndCBuZWVkIHRvIGJlIGFkZGVkICBoZXJlIG1hbnVhbGx5IGFmdGVyIGJlaW5nCisjIGFkZGVkIHRvIF9ic2RkYi5jLgorIworCitpbXBvcnQgc3lzCithYnNvbHV0ZV9pbXBvcnQgPSAoc3lzLnZlcnNpb25faW5mb1swXSA+PSAzKQoraWYgYWJzb2x1dGVfaW1wb3J0IDoKKyAgICAjIEJlY2F1c2UgdGhpcyBzeW50YXhpcyBpcyBub3QgdmFsaWQgYmVmb3JlIFB5dGhvbiAyLjUKKyAgICBleGVjKCJmcm9tIC4gaW1wb3J0IGRiIikKK2Vsc2UgOgorICAgIGltcG9ydCBkYgorCitpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICBmcm9tIFVzZXJEaWN0IGltcG9ydCBEaWN0TWl4aW4gYXMgTXV0YWJsZU1hcHBpbmcKK2Vsc2UgOgorICAgIGltcG9ydCBjb2xsZWN0aW9ucworICAgIE11dGFibGVNYXBwaW5nID0gY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcKKworY2xhc3MgREJFbnY6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuX2NvYmogPSBkYi5EQkVudigqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouY2xvc2UoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBvcGVuKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLm9wZW4oKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiByZW1vdmUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoucmVtb3ZlKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X3NobV9rZXkoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X3NobV9rZXkoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfY2FjaGVzaXplKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9jYWNoZXNpemUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfZGF0YV9kaXIoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2RhdGFfZGlyKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X2ZsYWdzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9mbGFncygqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9sZ19ic2l6ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfbGdfYnNpemUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfbGdfZGlyKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9sZ19kaXIoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfbGdfbWF4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9sZ19tYXgoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfbGtfZGV0ZWN0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9sa19kZXRlY3QoKmFyZ3MsICoqa3dhcmdzKQorICAgIGlmIGRiLnZlcnNpb24oKSA8ICg0LDUpOgorICAgICAgICBkZWYgc2V0X2xrX21heChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2xrX21heCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9sa19tYXhfbG9ja3Moc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2xrX21heF9sb2NrcygqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9sa19tYXhfbG9ja2VycyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfbGtfbWF4X2xvY2tlcnMoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfbGtfbWF4X29iamVjdHMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2xrX21heF9vYmplY3RzKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X21wX21tYXBzaXplKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9tcF9tbWFwc2l6ZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF90aW1lb3V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF90aW1lb3V0KCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X3RtcF9kaXIoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X3RtcF9kaXIoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiB0eG5fYmVnaW4oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoudHhuX2JlZ2luKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgdHhuX2NoZWNrcG9pbnQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoudHhuX2NoZWNrcG9pbnQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiB0eG5fc3RhdChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai50eG5fc3RhdCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF90eF9tYXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X3R4X21heCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF90eF90aW1lc3RhbXAoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X3R4X3RpbWVzdGFtcCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGxvY2tfZGV0ZWN0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmxvY2tfZGV0ZWN0KCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgbG9ja19nZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoubG9ja19nZXQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBsb2NrX2lkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmxvY2tfaWQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBsb2NrX3B1dChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5sb2NrX3B1dCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGxvY2tfc3RhdChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5sb2NrX3N0YXQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBsb2dfYXJjaGl2ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5sb2dfYXJjaGl2ZSgqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgc2V0X2dldF9yZXR1cm5zX25vbmUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2dldF9yZXR1cm5zX25vbmUoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGxvZ19zdGF0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmxvZ19zdGF0KCphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBkYnJlbW92ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5kYnJlbW92ZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGRicmVuYW1lKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmRicmVuYW1lKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X2VuY3J5cHQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2VuY3J5cHQoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LDQpOgorICAgICAgICBkZWYgZmlsZWlkX3Jlc2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29iai5maWxlaWRfcmVzZXQoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIGRlZiBsc25fcmVzZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmxzbl9yZXNldCgqYXJncywgKiprd2FyZ3MpCisKKworY2xhc3MgREIoTXV0YWJsZU1hcHBpbmcpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYmVudiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIyBnaXZlIGl0IHRoZSBwcm9wZXIgREJFbnYgQyBvYmplY3QgdGhhdCBpdHMgZXhwZWN0aW5nCisgICAgICAgIHNlbGYuX2NvYmogPSBkYi5EQigqKChkYmVudi5fY29iaiwpICsgYXJncyksICoqa3dhcmdzKQorCisgICAgIyBUT0RPIGFyZSB0aGVyZSBvdGhlciBkaWN0IG1ldGhvZHMgdGhhdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4/CisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fY29iaikKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgYXJnKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmpbYXJnXQorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgc2VsZi5fY29ialtrZXldID0gdmFsdWUKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgYXJnKToKKyAgICAgICAgZGVsIHNlbGYuX2NvYmpbYXJnXQorCisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMiwgNikgOgorICAgICAgICBkZWYgX19pdGVyX18oc2VsZikgOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouX19pdGVyX18oKQorCisgICAgZGVmIGFwcGVuZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5hcHBlbmQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBhc3NvY2lhdGUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouYXNzb2NpYXRlKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgY2xvc2Uoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouY2xvc2UoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBjb25zdW1lKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmNvbnN1bWUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBjb25zdW1lX3dhaXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouY29uc3VtZV93YWl0KCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgY3Vyc29yKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmN1cnNvcigqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGRlbGV0ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5kZWxldGUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBmZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5mZCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGdldChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5nZXQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBwZ2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnBnZXQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBnZXRfYm90aChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5nZXRfYm90aCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGdldF9ieXRlc3dhcHBlZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5nZXRfYnl0ZXN3YXBwZWQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBnZXRfc2l6ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5nZXRfc2l6ZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGdldF90eXBlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmdldF90eXBlKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgam9pbihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5qb2luKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYga2V5X3JhbmdlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmtleV9yYW5nZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGhhc19rZXkoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouaGFzX2tleSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGl0ZW1zKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLml0ZW1zKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYga2V5cyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5rZXlzKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgb3BlbihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5vcGVuKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgcHV0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnB1dCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHJlbW92ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5yZW1vdmUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiByZW5hbWUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoucmVuYW1lKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X2J0X21pbmtleShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfYnRfbWlua2V5KCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X2J0X2NvbXBhcmUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2J0X2NvbXBhcmUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfY2FjaGVzaXplKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9jYWNoZXNpemUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfZHVwX2NvbXBhcmUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKSA6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9kdXBfY29tcGFyZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9mbGFncyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfZmxhZ3MoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfaF9mZmFjdG9yKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9oX2ZmYWN0b3IoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfaF9uZWxlbShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfaF9uZWxlbSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9sb3JkZXIoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2xvcmRlcigqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9wYWdlc2l6ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfcGFnZXNpemUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfcmVfZGVsaW0oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X3JlX2RlbGltKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X3JlX2xlbihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfcmVfbGVuKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X3JlX3BhZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfcmVfcGFkKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X3JlX3NvdXJjZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfcmVfc291cmNlKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X3FfZXh0ZW50c2l6ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfcV9leHRlbnRzaXplKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc3RhdChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zdGF0KCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc3luYyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zeW5jKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgdHlwZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai50eXBlKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgdXBncmFkZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai51cGdyYWRlKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgdmFsdWVzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnZhbHVlcygqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHZlcmlmeShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai52ZXJpZnkoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfZ2V0X3JldHVybnNfbm9uZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfZ2V0X3JldHVybnNfbm9uZSgqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgc2V0X2VuY3J5cHQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2VuY3J5cHQoKmFyZ3MsICoqa3dhcmdzKQorCisKK2NsYXNzIERCU2VxdWVuY2U6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuX2NvYmogPSBkYi5EQlNlcXVlbmNlKCphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBjbG9zZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5jbG9zZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGdldChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5nZXQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBnZXRfZGJwKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmdldF9kYnAoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBnZXRfa2V5KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmdldF9rZXkoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBpbml0X3ZhbHVlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmluaXRfdmFsdWUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBvcGVuKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLm9wZW4oKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiByZW1vdmUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoucmVtb3ZlKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc3RhdChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zdGF0KCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X2NhY2hlc2l6ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfY2FjaGVzaXplKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X2ZsYWdzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9mbGFncygqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9yYW5nZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfcmFuZ2UoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBnZXRfY2FjaGVzaXplKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmdldF9jYWNoZXNpemUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBnZXRfZmxhZ3Moc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouZ2V0X2ZsYWdzKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgZ2V0X3JhbmdlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmdldF9yYW5nZSgqYXJncywgKiprd2FyZ3MpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL2Rib2JqLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJvYmoucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MThlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL2Rib2JqLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL2Rib2JqLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJvYmoucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MThlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL2Rib2JqLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL2RicmVjaW8ucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL2RicmVjaW8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzOWYzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJyZWNpby5weQpAQCAtMCwwICsxLDE5MCBAQAorCisiIiIKK0ZpbGUtbGlrZSBvYmplY3RzIHRoYXQgcmVhZCBmcm9tIG9yIHdyaXRlIHRvIGEgYnNkZGIgcmVjb3JkLgorCitUaGlzIGltcGxlbWVudHMgKG5lYXJseSkgYWxsIHN0ZGlvIG1ldGhvZHMuCisKK2YgPSBEQlJlY0lPKGRiLCBrZXksIHR4bj1Ob25lKQorZi5jbG9zZSgpICAgICAgICAgICAjIGV4cGxpY2l0bHkgcmVsZWFzZSByZXNvdXJjZXMgaGVsZAorZmxhZyA9IGYuaXNhdHR5KCkgICAjIGFsd2F5cyBmYWxzZQorcG9zID0gZi50ZWxsKCkgICAgICAjIGdldCBjdXJyZW50IHBvc2l0aW9uCitmLnNlZWsocG9zKSAgICAgICAgICMgc2V0IGN1cnJlbnQgcG9zaXRpb24KK2Yuc2Vlayhwb3MsIG1vZGUpICAgIyBtb2RlIDA6IGFic29sdXRlOyAxOiByZWxhdGl2ZTsgMjogcmVsYXRpdmUgdG8gRU9GCitidWYgPSBmLnJlYWQoKSAgICAgICMgcmVhZCB1bnRpbCBFT0YKK2J1ZiA9IGYucmVhZChuKSAgICAgIyByZWFkIHVwIHRvIG4gYnl0ZXMKK2YudHJ1bmNhdGUoW3NpemVdKSAgIyB0cnVuY2F0ZSBmaWxlIGF0IHRvIGF0IG1vc3Qgc2l6ZSAoZGVmYXVsdDogY3VycmVudCBwb3MpCitmLndyaXRlKGJ1ZikgICAgICAgICMgd3JpdGUgYXQgY3VycmVudCBwb3NpdGlvbgorZi53cml0ZWxpbmVzKGxpc3QpICAjIGZvciBsaW5lIGluIGxpc3Q6IGYud3JpdGUobGluZSkKKworTm90ZXM6CistIGZpbGVubygpIGlzIGxlZnQgdW5pbXBsZW1lbnRlZCBzbyB0aGF0IGNvZGUgd2hpY2ggdXNlcyBpdCB0cmlnZ2VycworICBhbiBleGNlcHRpb24gZWFybHkuCistIFRoZXJlJ3MgYSBzaW1wbGUgdGVzdCBzZXQgKHNlZSBlbmQgb2YgdGhpcyBmaWxlKSAtIG5vdCB5ZXQgdXBkYXRlZAorICBmb3IgREJSZWNJTy4KKy0gcmVhZGxpbmUoKSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LgorCisKK0Zyb206CisgICAgSXRhbWFyIFNodHVsbC1UcmF1cmluZyA8aXRhbWFyQG1heG5tLmNvbT4KKyIiIgorCitpbXBvcnQgZXJybm8KK2ltcG9ydCBzdHJpbmcKKworY2xhc3MgREJSZWNJTzoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGIsIGtleSwgdHhuPU5vbmUpOgorICAgICAgICBzZWxmLmRiID0gZGIKKyAgICAgICAgc2VsZi5rZXkgPSBrZXkKKyAgICAgICAgc2VsZi50eG4gPSB0eG4KKyAgICAgICAgc2VsZi5sZW4gPSBOb25lCisgICAgICAgIHNlbGYucG9zID0gMAorICAgICAgICBzZWxmLmNsb3NlZCA9IDAKKyAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSAwCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gMQorICAgICAgICAgICAgZGVsIHNlbGYuZGIsIHNlbGYudHhuCisKKyAgICBkZWYgaXNhdHR5KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIgorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zLCBtb2RlID0gMCk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiCisgICAgICAgIGlmIG1vZGUgPT0gMToKKyAgICAgICAgICAgIHBvcyA9IHBvcyArIHNlbGYucG9zCisgICAgICAgIGVsaWYgbW9kZSA9PSAyOgorICAgICAgICAgICAgcG9zID0gcG9zICsgc2VsZi5sZW4KKyAgICAgICAgc2VsZi5wb3MgPSBtYXgoMCwgcG9zKQorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiCisgICAgICAgIHJldHVybiBzZWxmLnBvcworCisgICAgZGVmIHJlYWQoc2VsZiwgbiA9IC0xKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKKyAgICAgICAgaWYgbiA8IDA6CisgICAgICAgICAgICBuZXdwb3MgPSBzZWxmLmxlbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV3cG9zID0gbWluKHNlbGYucG9zK24sIHNlbGYubGVuKQorCisgICAgICAgIGRsZW4gPSBuZXdwb3MgLSBzZWxmLnBvcworCisgICAgICAgIHIgPSBzZWxmLmRiLmdldChzZWxmLmtleSwgdHhuPXNlbGYudHhuLCBkbGVuPWRsZW4sIGRvZmY9c2VsZi5wb3MpCisgICAgICAgIHNlbGYucG9zID0gbmV3cG9zCisgICAgICAgIHJldHVybiByCisKKyAgICBfX2ZpeG1lID0gIiIiCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsIGxlbmd0aD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKKyAgICAgICAgaWYgc2VsZi5idWZsaXN0OgorICAgICAgICAgICAgc2VsZi5idWYgPSBzZWxmLmJ1ZiArIHN0cmluZy5qb2luZmllbGRzKHNlbGYuYnVmbGlzdCwgJycpCisgICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXQorICAgICAgICBpID0gc3RyaW5nLmZpbmQoc2VsZi5idWYsICdcbicsIHNlbGYucG9zKQorICAgICAgICBpZiBpIDwgMDoKKyAgICAgICAgICAgIG5ld3BvcyA9IHNlbGYubGVuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXdwb3MgPSBpKzEKKyAgICAgICAgaWYgbGVuZ3RoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5wb3MgKyBsZW5ndGggPCBuZXdwb3M6CisgICAgICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5wb3MgKyBsZW5ndGgKKyAgICAgICAgciA9IHNlbGYuYnVmW3NlbGYucG9zOm5ld3Bvc10KKyAgICAgICAgc2VsZi5wb3MgPSBuZXdwb3MKKyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiByZWFkbGluZXMoc2VsZiwgc2l6ZWhpbnQgPSAwKToKKyAgICAgICAgdG90YWwgPSAwCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICB3aGlsZSBsaW5lOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICB0b3RhbCArPSBsZW4obGluZSkKKyAgICAgICAgICAgIGlmIDAgPCBzaXplaGludCA8PSB0b3RhbDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICByZXR1cm4gbGluZXMKKyAgICAiIiIKKworICAgIGRlZiB0cnVuY2F0ZShzZWxmLCBzaXplPU5vbmUpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIgorICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBzaXplID0gc2VsZi5wb3MKKyAgICAgICAgZWxpZiBzaXplIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoZXJybm8uRUlOVkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmVnYXRpdmUgc2l6ZSBub3QgYWxsb3dlZCIpCisgICAgICAgIGVsaWYgc2l6ZSA8IHNlbGYucG9zOgorICAgICAgICAgICAgc2VsZi5wb3MgPSBzaXplCisgICAgICAgIHNlbGYuZGIucHV0KHNlbGYua2V5LCAiIiwgdHhuPXNlbGYudHhuLCBkbGVuPXNlbGYubGVuLXNpemUsIGRvZmY9c2l6ZSkKKworICAgIGRlZiB3cml0ZShzZWxmLCBzKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKKyAgICAgICAgaWYgbm90IHM6IHJldHVybgorICAgICAgICBpZiBzZWxmLnBvcyA+IHNlbGYubGVuOgorICAgICAgICAgICAgc2VsZi5idWZsaXN0LmFwcGVuZCgnXDAnKihzZWxmLnBvcyAtIHNlbGYubGVuKSkKKyAgICAgICAgICAgIHNlbGYubGVuID0gc2VsZi5wb3MKKyAgICAgICAgbmV3cG9zID0gc2VsZi5wb3MgKyBsZW4ocykKKyAgICAgICAgc2VsZi5kYi5wdXQoc2VsZi5rZXksIHMsIHR4bj1zZWxmLnR4biwgZGxlbj1sZW4ocyksIGRvZmY9c2VsZi5wb3MpCisgICAgICAgIHNlbGYucG9zID0gbmV3cG9zCisKKyAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBsaXN0KToKKyAgICAgICAgc2VsZi53cml0ZShzdHJpbmcuam9pbmZpZWxkcyhsaXN0LCAnJykpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiCisKKworIiIiCisjIEEgbGl0dGxlIHRlc3Qgc3VpdGUKKworZGVmIF90ZXN0KCk6CisgICAgaW1wb3J0IHN5cworICAgIGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgZmlsZSA9IHN5cy5hcmd2WzFdCisgICAgZWxzZToKKyAgICAgICAgZmlsZSA9ICcvZXRjL3Bhc3N3ZCcKKyAgICBsaW5lcyA9IG9wZW4oZmlsZSwgJ3InKS5yZWFkbGluZXMoKQorICAgIHRleHQgPSBvcGVuKGZpbGUsICdyJykucmVhZCgpCisgICAgZiA9IFN0cmluZ0lPKCkKKyAgICBmb3IgbGluZSBpbiBsaW5lc1s6LTJdOgorICAgICAgICBmLndyaXRlKGxpbmUpCisgICAgZi53cml0ZWxpbmVzKGxpbmVzWy0yOl0pCisgICAgaWYgZi5nZXR2YWx1ZSgpICE9IHRleHQ6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ3dyaXRlIGZhaWxlZCcKKyAgICBsZW5ndGggPSBmLnRlbGwoKQorICAgIHByaW50ICdGaWxlIGxlbmd0aCA9JywgbGVuZ3RoCisgICAgZi5zZWVrKGxlbihsaW5lc1swXSkpCisgICAgZi53cml0ZShsaW5lc1sxXSkKKyAgICBmLnNlZWsoMCkKKyAgICBwcmludCAnRmlyc3QgbGluZSA9JywgcmVwcihmLnJlYWRsaW5lKCkpCisgICAgaGVyZSA9IGYudGVsbCgpCisgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgIHByaW50ICdTZWNvbmQgbGluZSA9JywgcmVwcihsaW5lKQorICAgIGYuc2VlaygtbGVuKGxpbmUpLCAxKQorICAgIGxpbmUyID0gZi5yZWFkKGxlbihsaW5lKSkKKyAgICBpZiBsaW5lICE9IGxpbmUyOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICdiYWQgcmVzdWx0IGFmdGVyIHNlZWsgYmFjaycKKyAgICBmLnNlZWsobGVuKGxpbmUyKSwgMSkKKyAgICBsaXN0ID0gZi5yZWFkbGluZXMoKQorICAgIGxpbmUgPSBsaXN0Wy0xXQorICAgIGYuc2VlayhmLnRlbGwoKSAtIGxlbihsaW5lKSkKKyAgICBsaW5lMiA9IGYucmVhZCgpCisgICAgaWYgbGluZSAhPSBsaW5lMjoKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAnYmFkIHJlc3VsdCBhZnRlciBzZWVrIGJhY2sgZnJvbSBFT0YnCisgICAgcHJpbnQgJ1JlYWQnLCBsZW4obGlzdCksICdtb3JlIGxpbmVzJworICAgIHByaW50ICdGaWxlIGxlbmd0aCA9JywgZi50ZWxsKCkKKyAgICBpZiBmLnRlbGwoKSAhPSBsZW5ndGg6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ2JhZCBsZW5ndGgnCisgICAgZi5jbG9zZSgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgX3Rlc3QoKQorIiIiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL2RicmVjaW8ucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnJlY2lvLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmM0MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnJlY2lvLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL2RicmVjaW8ucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnJlY2lvLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmM0MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnJlY2lvLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL2Ric2hlbHZlLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnNoZWx2ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWRlYjEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnNoZWx2ZS5weQpAQCAtMCwwICsxLDM4MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMSBieSBUb3RhbCBDb250cm9sIFNvZnR3YXJlCisjICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgTW9kdWxlIE5hbWU6ICBkYlNoZWx2ZS5weQorIworIyBEZXNjcmlwdGlvbjogIEEgcmVpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc3RhbmRhcmQgc2hlbHZlLnB5IHRoYXQKKyMgICAgICAgICAgICAgICBmb3JjZXMgdGhlIHVzZSBvZiBjUGlja2xlLCBhbmQgREIuCisjCisjIENyZWF0aW9uIERhdGU6ICAgIDExLzMvOTcgMzozOTowNFBNCisjCisjIExpY2Vuc2U6ICAgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLiAgWW91IG1heSB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisjICAgICAgICAgICAgICAgcHVycG9zZSBpbmNsdWRpbmcgbW9kaWZpY2F0aW9uL3JlZGlzdHJpYnV0aW9uLCBzbyBsb25nIGFzCisjICAgICAgICAgICAgICAgdGhpcyBoZWFkZXIgcmVtYWlucyBpbnRhY3QgYW5kIHRoYXQgeW91IGRvIG5vdCBjbGFpbSBhbnkKKyMgICAgICAgICAgICAgICByaWdodHMgb2Ygb3duZXJzaGlwIG9yIGF1dGhvcnNoaXAgb2YgdGhpcyBzb2Z0d2FyZS4gIFRoaXMKKyMgICAgICAgICAgICAgICBzb2Z0d2FyZSBoYXMgYmVlbiB0ZXN0ZWQsIGJ1dCBubyB3YXJyYW50eSBpcyBleHByZXNzZWQgb3IKKyMgICAgICAgICAgICAgICBpbXBsaWVkLgorIworIyAxMy1EZWMtMjAwMDogIFVwZGF0ZWQgdG8gYmUgdXNlZCB3aXRoIHRoZSBuZXcgYnNkZGIzIHBhY2thZ2UuCisjICAgICAgICAgICAgICAgQWRkZWQgREJTaGVsZkN1cnNvciBjbGFzcy4KKyMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIiIiTWFuYWdlIHNoZWx2ZXMgb2YgcGlja2xlZCBvYmplY3RzIHVzaW5nIGJzZGRiIGRhdGFiYXNlIGZpbGVzIGZvciB0aGUKK3N0b3JhZ2UuCisiIiIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbXBvcnQgc3lzCithYnNvbHV0ZV9pbXBvcnQgPSAoc3lzLnZlcnNpb25faW5mb1swXSA+PSAzKQoraWYgYWJzb2x1dGVfaW1wb3J0IDoKKyAgICAjIEJlY2F1c2UgdGhpcyBzeW50YXhpcyBpcyBub3QgdmFsaWQgYmVmb3JlIFB5dGhvbiAyLjUKKyAgICBleGVjKCJmcm9tIC4gaW1wb3J0IGRiIikKK2Vsc2UgOgorICAgIGltcG9ydCBkYgorCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDMgOgorICAgIGltcG9ydCBjUGlja2xlICAjIFdpbGwgYmUgY29udmVydGVkIHRvICJwaWNrbGUiIGJ5ICIydG8zIgorZWxzZSA6CisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgIGltcG9ydCBjUGlja2xlCisgICAgZWxzZSA6CisgICAgICAgICMgV2hlbiB3ZSBkcm9wIHN1cHBvcnQgZm9yIHB5dGhvbiAyLjQKKyAgICAgICAgIyB3ZSBjb3VsZCB1c2U6IChpbiAyLjUgd2UgbmVlZCBhIF9fZnV0dXJlX18gc3RhdGVtZW50KQorICAgICAgICAjCisgICAgICAgICMgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAjICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncyguLi4pCisgICAgICAgICMgICAgICAgIC4uLgorICAgICAgICAjCisgICAgICAgICMgV2UgY2FuIG5vdCB1c2UgIndpdGgiIGFzIGlzLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGludmFsaWQgc3ludGF4CisgICAgICAgICMgaW4gcHl0aG9uIDIuNCBhbmQgKHdpdGggbm8gX19mdXR1cmVfXykgMi41LgorICAgICAgICAjIEhlcmUgd2Ugc2ltdWxhdGUgIndpdGgiIGZvbGxvd2luZyBQRVAgMzQzIDoKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIHcgPSB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpCisgICAgICAgIHcuX19lbnRlcl9fKCkKKyAgICAgICAgdHJ5IDoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U9J3RoZSBjUGlja2xlIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAnLAorICAgICAgICAgICAgICAgIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgIGltcG9ydCBjUGlja2xlCisgICAgICAgIGZpbmFsbHkgOgorICAgICAgICAgICAgdy5fX2V4aXRfXygpCisgICAgICAgIGRlbCB3CisKK0hJR0hFU1RfUFJPVE9DT0wgPSBjUGlja2xlLkhJR0hFU1RfUFJPVE9DT0wKK2RlZiBfZHVtcHMob2JqZWN0LCBwcm90b2NvbCk6CisgICAgcmV0dXJuIGNQaWNrbGUuZHVtcHMob2JqZWN0LCBwcm90b2NvbD1wcm90b2NvbCkKKworaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgZnJvbSBVc2VyRGljdCBpbXBvcnQgRGljdE1peGluIGFzIE11dGFibGVNYXBwaW5nCitlbHNlIDoKKyAgICBpbXBvcnQgY29sbGVjdGlvbnMKKyAgICBNdXRhYmxlTWFwcGluZyA9IGNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitkZWYgb3BlbihmaWxlbmFtZSwgZmxhZ3M9ZGIuREJfQ1JFQVRFLCBtb2RlPTA2NjAsIGZpbGV0eXBlPWRiLkRCX0hBU0gsCisgICAgICAgICBkYmVudj1Ob25lLCBkYm5hbWU9Tm9uZSk6CisgICAgIiIiCisgICAgQSBzaW1wbGUgZmFjdG9yeSBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBzdGFuZGFyZAorICAgIHNobGV2ZS5weSBtb2R1bGUuICBJdCBjYW4gYmUgdXNlZCBsaWtlIHRoaXMsIHdoZXJlIGtleSBpcyBhIHN0cmluZworICAgIGFuZCBkYXRhIGlzIGEgcGlja2xlYWJsZSBvYmplY3Q6CisKKyAgICAgICAgZnJvbSBic2RkYiBpbXBvcnQgZGJzaGVsdmUKKyAgICAgICAgZGIgPSBkYnNoZWx2ZS5vcGVuKGZpbGVuYW1lKQorCisgICAgICAgIGRiW2tleV0gPSBkYXRhCisKKyAgICAgICAgZGIuY2xvc2UoKQorICAgICIiIgorICAgIGlmIHR5cGUoZmxhZ3MpID09IHR5cGUoJycpOgorICAgICAgICBzZmxhZyA9IGZsYWdzCisgICAgICAgIGlmIHNmbGFnID09ICdyJzoKKyAgICAgICAgICAgIGZsYWdzID0gZGIuREJfUkRPTkxZCisgICAgICAgIGVsaWYgc2ZsYWcgPT0gJ3J3JzoKKyAgICAgICAgICAgIGZsYWdzID0gMAorICAgICAgICBlbGlmIHNmbGFnID09ICd3JzoKKyAgICAgICAgICAgIGZsYWdzID0gIGRiLkRCX0NSRUFURQorICAgICAgICBlbGlmIHNmbGFnID09ICdjJzoKKyAgICAgICAgICAgIGZsYWdzID0gIGRiLkRCX0NSRUFURQorICAgICAgICBlbGlmIHNmbGFnID09ICduJzoKKyAgICAgICAgICAgIGZsYWdzID0gZGIuREJfVFJVTkNBVEUgfCBkYi5EQl9DUkVBVEUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIGRiLkRCRXJyb3IsICJmbGFncyBzaG91bGQgYmUgb25lIG9mICdyJywgJ3cnLCAnYycgb3IgJ24nIG9yIHVzZSB0aGUgYnNkZGIuZGIuREJfKiBmbGFncyIKKworICAgIGQgPSBEQlNoZWxmKGRiZW52KQorICAgIGQub3BlbihmaWxlbmFtZSwgZGJuYW1lLCBmaWxldHlwZSwgZmxhZ3MsIG1vZGUpCisgICAgcmV0dXJuIGQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBEQlNoZWx2ZUVycm9yKGRiLkRCRXJyb3IpOiBwYXNzCisKKworY2xhc3MgREJTaGVsZihNdXRhYmxlTWFwcGluZyk6CisgICAgIiIiQSBzaGVsZiB0byBob2xkIHBpY2tsZWQgb2JqZWN0cywgYnVpbHQgdXBvbiBhIGJzZGRiIERCIG9iamVjdC4gIEl0CisgICAgYXV0b21hdGljYWxseSBwaWNrbGVzL3VucGlja2xlcyBkYXRhIG9iamVjdHMgZ29pbmcgdG8vZnJvbSB0aGUgREIuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiZW52PU5vbmUpOgorICAgICAgICBzZWxmLmRiID0gZGIuREIoZGJlbnYpCisgICAgICAgIHNlbGYuX2Nsb3NlZCA9IFRydWUKKyAgICAgICAgaWYgSElHSEVTVF9QUk9UT0NPTDoKKyAgICAgICAgICAgIHNlbGYucHJvdG9jb2wgPSBISUdIRVNUX1BST1RPQ09MCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnByb3RvY29sID0gMQorCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiTWFueSBtZXRob2RzIHdlIGNhbiBqdXN0IHBhc3MgdGhyb3VnaCB0byB0aGUgREIgb2JqZWN0LgorICAgICAgICAoU2VlIGJlbG93KQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5kYiwgbmFtZSkKKworCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBEaWN0aW9uYXJ5IGFjY2VzcyBtZXRob2RzCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmRiKQorCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgZGF0YSA9IHNlbGYuZGJba2V5XQorICAgICAgICByZXR1cm4gY1BpY2tsZS5sb2FkcyhkYXRhKQorCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIGRhdGEgPSBfZHVtcHModmFsdWUsIHNlbGYucHJvdG9jb2wpCisgICAgICAgIHNlbGYuZGJba2V5XSA9IGRhdGEKKworCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIGRlbCBzZWxmLmRiW2tleV0KKworCisgICAgZGVmIGtleXMoc2VsZiwgdHhuPU5vbmUpOgorICAgICAgICBpZiB0eG4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kYi5rZXlzKHR4bikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRiLmtleXMoKQorCisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMiwgNikgOgorICAgICAgICBkZWYgX19pdGVyX18oc2VsZikgOiAgIyBYWFg6IExvYWQgYWxsIGtleXMgaW4gbWVtb3J5IDotKAorICAgICAgICAgICAgZm9yIGsgaW4gc2VsZi5kYi5rZXlzKCkgOgorICAgICAgICAgICAgICAgIHlpZWxkIGsKKworICAgICAgICAjIERvIHRoaXMgd2hlbiAiREIiICBzdXBwb3J0IGl0ZXJhdGlvbgorICAgICAgICAjIE9yIGlzIGl0IGVub3VnaCB0byBwYXNzIHRocnUgImdldGF0dHIiPworICAgICAgICAjCisgICAgICAgICMgZGVmIF9faXRlcl9fKHNlbGYpIDoKKyAgICAgICAgIyAgICByZXR1cm4gc2VsZi5kYi5fX2l0ZXJfXygpCisKKworICAgIGRlZiBvcGVuKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuZGIub3BlbigqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuX2Nsb3NlZCA9IEZhbHNlCisKKworICAgIGRlZiBjbG9zZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmRiLmNsb3NlKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5fY2xvc2VkID0gVHJ1ZQorCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2Nsb3NlZDoKKyAgICAgICAgICAgIHJldHVybiAnPERCU2hlbGYgQCAweCV4IC0gY2xvc2VkPicgJSAoaWQoc2VsZikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcmVwcihkaWN0KHNlbGYuaXRlcml0ZW1zKCkpKQorCisKKyAgICBkZWYgaXRlbXMoc2VsZiwgdHhuPU5vbmUpOgorICAgICAgICBpZiB0eG4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpdGVtcyA9IHNlbGYuZGIuaXRlbXModHhuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaXRlbXMgPSBzZWxmLmRiLml0ZW1zKCkKKyAgICAgICAgbmV3aXRlbXMgPSBbXQorCisgICAgICAgIGZvciBrLCB2IGluIGl0ZW1zOgorICAgICAgICAgICAgbmV3aXRlbXMuYXBwZW5kKCAoaywgY1BpY2tsZS5sb2Fkcyh2KSkgKQorICAgICAgICByZXR1cm4gbmV3aXRlbXMKKworICAgIGRlZiB2YWx1ZXMoc2VsZiwgdHhuPU5vbmUpOgorICAgICAgICBpZiB0eG4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICB2YWx1ZXMgPSBzZWxmLmRiLnZhbHVlcyh0eG4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWx1ZXMgPSBzZWxmLmRiLnZhbHVlcygpCisKKyAgICAgICAgcmV0dXJuIG1hcChjUGlja2xlLmxvYWRzLCB2YWx1ZXMpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIE90aGVyIG1ldGhvZHMKKworICAgIGRlZiBfX2FwcGVuZChzZWxmLCB2YWx1ZSwgdHhuPU5vbmUpOgorICAgICAgICBkYXRhID0gX2R1bXBzKHZhbHVlLCBzZWxmLnByb3RvY29sKQorICAgICAgICByZXR1cm4gc2VsZi5kYi5hcHBlbmQoZGF0YSwgdHhuKQorCisgICAgZGVmIGFwcGVuZChzZWxmLCB2YWx1ZSwgdHhuPU5vbmUpOgorICAgICAgICBpZiBzZWxmLmdldF90eXBlKCkgPT0gZGIuREJfUkVDTk86CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2FwcGVuZCh2YWx1ZSwgdHhuPXR4bikKKyAgICAgICAgcmFpc2UgREJTaGVsdmVFcnJvciwgImFwcGVuZCgpIG9ubHkgc3VwcG9ydGVkIHdoZW4gZGJzaGVsdmUgb3BlbmVkIHdpdGggZmlsZXR5cGU9ZGJzaGVsdmUuZGIuREJfUkVDTk8iCisKKworICAgIGRlZiBhc3NvY2lhdGUoc2VsZiwgc2Vjb25kYXJ5REIsIGNhbGxiYWNrLCBmbGFncz0wKToKKyAgICAgICAgZGVmIF9zaGVsZl9jYWxsYmFjayhwcmlLZXksIHByaURhdGEsIHJlYWxDYWxsYmFjaz1jYWxsYmFjayk6CisgICAgICAgICAgICAjIFNhZmUgaW4gUHl0aG9uIDIueCBiZWNhdXNlIGV4cHJlc2lvbiBzaG9ydCBjaXJjdWl0CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyBvciBpc2luc3RhbmNlKHByaURhdGEsIGJ5dGVzKSA6CisgICAgICAgICAgICAgICAgZGF0YSA9IGNQaWNrbGUubG9hZHMocHJpRGF0YSkKKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIGRhdGEgPSBjUGlja2xlLmxvYWRzKGJ5dGVzKHByaURhdGEsICJpc284ODU5LTEiKSkgICMgOCBiaXRzCisgICAgICAgICAgICByZXR1cm4gcmVhbENhbGxiYWNrKHByaUtleSwgZGF0YSkKKworICAgICAgICByZXR1cm4gc2VsZi5kYi5hc3NvY2lhdGUoc2Vjb25kYXJ5REIsIF9zaGVsZl9jYWxsYmFjaywgZmxhZ3MpCisKKworICAgICNkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lLCB0eG49Tm9uZSwgZmxhZ3M9MCk6CisgICAgZGVmIGdldChzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgICMgV2UgZG8gaXQgd2l0aCAqYXJncyBhbmQgKiprdyBzbyBpZiB0aGUgZGVmYXVsdCB2YWx1ZSB3YXNuJ3QKKyAgICAgICAgIyBnaXZlbiBub3RoaW5nIGlzIHBhc3NlZCB0byB0aGUgZXh0ZW5zaW9uIG1vZHVsZS4gIFRoYXQgd2F5CisgICAgICAgICMgYW4gZXhjZXB0aW9uIGNhbiBiZSByYWlzZWQgaWYgc2V0X2dldF9yZXR1cm5zX25vbmUgaXMgdHVybmVkCisgICAgICAgICMgb2ZmLgorICAgICAgICBkYXRhID0gc2VsZi5kYi5nZXQoKmFyZ3MsICoqa3cpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBjUGlja2xlLmxvYWRzKGRhdGEpCisgICAgICAgIGV4Y2VwdCAoRU9GRXJyb3IsIFR5cGVFcnJvciwgY1BpY2tsZS5VbnBpY2tsaW5nRXJyb3IpOgorICAgICAgICAgICAgcmV0dXJuIGRhdGEgICMgd2UgbWF5IGJlIGdldHRpbmcgdGhlIGRlZmF1bHQgdmFsdWUsIG9yIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIyBzbyBpdCBkb2Vzbid0IG5lZWQgdW5waWNrbGVkLgorCisgICAgZGVmIGdldF9ib3RoKHNlbGYsIGtleSwgdmFsdWUsIHR4bj1Ob25lLCBmbGFncz0wKToKKyAgICAgICAgZGF0YSA9IF9kdW1wcyh2YWx1ZSwgc2VsZi5wcm90b2NvbCkKKyAgICAgICAgZGF0YSA9IHNlbGYuZGIuZ2V0KGtleSwgZGF0YSwgdHhuLCBmbGFncykKKyAgICAgICAgcmV0dXJuIGNQaWNrbGUubG9hZHMoZGF0YSkKKworCisgICAgZGVmIGN1cnNvcihzZWxmLCB0eG49Tm9uZSwgZmxhZ3M9MCk6CisgICAgICAgIGMgPSBEQlNoZWxmQ3Vyc29yKHNlbGYuZGIuY3Vyc29yKHR4biwgZmxhZ3MpKQorICAgICAgICBjLnByb3RvY29sID0gc2VsZi5wcm90b2NvbAorICAgICAgICByZXR1cm4gYworCisKKyAgICBkZWYgcHV0KHNlbGYsIGtleSwgdmFsdWUsIHR4bj1Ob25lLCBmbGFncz0wKToKKyAgICAgICAgZGF0YSA9IF9kdW1wcyh2YWx1ZSwgc2VsZi5wcm90b2NvbCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZGIucHV0KGtleSwgZGF0YSwgdHhuLCBmbGFncykKKworCisgICAgZGVmIGpvaW4oc2VsZiwgY3Vyc29yTGlzdCwgZmxhZ3M9MCk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIE1ldGhvZHMgYWxsb3dlZCB0byBwYXNzLXRocm91Z2ggdG8gc2VsZi5kYgorICAgICMKKyAgICAjICAgIGNsb3NlLCAgZGVsZXRlLCBmZCwgZ2V0X2J5dGVzd2FwcGVkLCBnZXRfdHlwZSwgaGFzX2tleSwKKyAgICAjICAgIGtleV9yYW5nZSwgb3BlbiwgcmVtb3ZlLCByZW5hbWUsIHN0YXQsIHN5bmMsCisgICAgIyAgICB1cGdyYWRlLCB2ZXJpZnksIGFuZCBhbGwgc2V0XyogbWV0aG9kcy4KKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIERCU2hlbGZDdXJzb3I6CisgICAgIiIiCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGN1cnNvcik6CisgICAgICAgIHNlbGYuZGJjID0gY3Vyc29yCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiU29tZSBtZXRob2RzIHdlIGNhbiBqdXN0IHBhc3MgdGhyb3VnaCB0byB0aGUgY3Vyc29yIG9iamVjdC4gIChTZWUgYmVsb3cpIiIiCisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuZGJjLCBuYW1lKQorCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGR1cChzZWxmLCBmbGFncz0wKToKKyAgICAgICAgYyA9IERCU2hlbGZDdXJzb3Ioc2VsZi5kYmMuZHVwKGZsYWdzKSkKKyAgICAgICAgYy5wcm90b2NvbCA9IHNlbGYucHJvdG9jb2wKKyAgICAgICAgcmV0dXJuIGMKKworCisgICAgZGVmIHB1dChzZWxmLCBrZXksIHZhbHVlLCBmbGFncz0wKToKKyAgICAgICAgZGF0YSA9IF9kdW1wcyh2YWx1ZSwgc2VsZi5wcm90b2NvbCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZGJjLnB1dChrZXksIGRhdGEsIGZsYWdzKQorCisKKyAgICBkZWYgZ2V0KHNlbGYsICphcmdzKToKKyAgICAgICAgY291bnQgPSBsZW4oYXJncykgICMgYSBtZXRob2Qgb3ZlcmxvYWRpbmcgaGFjaworICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdnZXRfJWQnICUgY291bnQpCisgICAgICAgIG1ldGhvZCgqYXJncykKKworICAgIGRlZiBnZXRfMShzZWxmLCBmbGFncyk6CisgICAgICAgIHJlYyA9IHNlbGYuZGJjLmdldChmbGFncykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4dHJhY3QocmVjKQorCisgICAgZGVmIGdldF8yKHNlbGYsIGtleSwgZmxhZ3MpOgorICAgICAgICByZWMgPSBzZWxmLmRiYy5nZXQoa2V5LCBmbGFncykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4dHJhY3QocmVjKQorCisgICAgZGVmIGdldF8zKHNlbGYsIGtleSwgdmFsdWUsIGZsYWdzKToKKyAgICAgICAgZGF0YSA9IF9kdW1wcyh2YWx1ZSwgc2VsZi5wcm90b2NvbCkKKyAgICAgICAgcmVjID0gc2VsZi5kYmMuZ2V0KGtleSwgZmxhZ3MpCisgICAgICAgIHJldHVybiBzZWxmLl9leHRyYWN0KHJlYykKKworCisgICAgZGVmIGN1cnJlbnQoc2VsZiwgZmxhZ3M9MCk6IHJldHVybiBzZWxmLmdldF8xKGZsYWdzfGRiLkRCX0NVUlJFTlQpCisgICAgZGVmIGZpcnN0KHNlbGYsIGZsYWdzPTApOiByZXR1cm4gc2VsZi5nZXRfMShmbGFnc3xkYi5EQl9GSVJTVCkKKyAgICBkZWYgbGFzdChzZWxmLCBmbGFncz0wKTogcmV0dXJuIHNlbGYuZ2V0XzEoZmxhZ3N8ZGIuREJfTEFTVCkKKyAgICBkZWYgbmV4dChzZWxmLCBmbGFncz0wKTogcmV0dXJuIHNlbGYuZ2V0XzEoZmxhZ3N8ZGIuREJfTkVYVCkKKyAgICBkZWYgcHJldihzZWxmLCBmbGFncz0wKTogcmV0dXJuIHNlbGYuZ2V0XzEoZmxhZ3N8ZGIuREJfUFJFVikKKyAgICBkZWYgY29uc3VtZShzZWxmLCBmbGFncz0wKTogcmV0dXJuIHNlbGYuZ2V0XzEoZmxhZ3N8ZGIuREJfQ09OU1VNRSkKKyAgICBkZWYgbmV4dF9kdXAoc2VsZiwgZmxhZ3M9MCk6IHJldHVybiBzZWxmLmdldF8xKGZsYWdzfGRiLkRCX05FWFRfRFVQKQorICAgIGRlZiBuZXh0X25vZHVwKHNlbGYsIGZsYWdzPTApOiByZXR1cm4gc2VsZi5nZXRfMShmbGFnc3xkYi5EQl9ORVhUX05PRFVQKQorICAgIGRlZiBwcmV2X25vZHVwKHNlbGYsIGZsYWdzPTApOiByZXR1cm4gc2VsZi5nZXRfMShmbGFnc3xkYi5EQl9QUkVWX05PRFVQKQorCisKKyAgICBkZWYgZ2V0X2JvdGgoc2VsZiwga2V5LCB2YWx1ZSwgZmxhZ3M9MCk6CisgICAgICAgIGRhdGEgPSBfZHVtcHModmFsdWUsIHNlbGYucHJvdG9jb2wpCisgICAgICAgIHJlYyA9IHNlbGYuZGJjLmdldF9ib3RoKGtleSwgZmxhZ3MpCisgICAgICAgIHJldHVybiBzZWxmLl9leHRyYWN0KHJlYykKKworCisgICAgZGVmIHNldChzZWxmLCBrZXksIGZsYWdzPTApOgorICAgICAgICByZWMgPSBzZWxmLmRiYy5zZXQoa2V5LCBmbGFncykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4dHJhY3QocmVjKQorCisgICAgZGVmIHNldF9yYW5nZShzZWxmLCBrZXksIGZsYWdzPTApOgorICAgICAgICByZWMgPSBzZWxmLmRiYy5zZXRfcmFuZ2Uoa2V5LCBmbGFncykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4dHJhY3QocmVjKQorCisgICAgZGVmIHNldF9yZWNubyhzZWxmLCByZWNubywgZmxhZ3M9MCk6CisgICAgICAgIHJlYyA9IHNlbGYuZGJjLnNldF9yZWNubyhyZWNubywgZmxhZ3MpCisgICAgICAgIHJldHVybiBzZWxmLl9leHRyYWN0KHJlYykKKworICAgIHNldF9ib3RoID0gZ2V0X2JvdGgKKworICAgIGRlZiBfZXh0cmFjdChzZWxmLCByZWMpOgorICAgICAgICBpZiByZWMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBrZXksIGRhdGEgPSByZWMKKyAgICAgICAgICAgICMgU2FmZSBpbiBQeXRob24gMi54IGJlY2F1c2UgZXhwcmVzaW9uIHNob3J0IGNpcmN1aXQKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIG9yIGlzaW5zdGFuY2UoZGF0YSwgYnl0ZXMpIDoKKyAgICAgICAgICAgICAgICByZXR1cm4ga2V5LCBjUGlja2xlLmxvYWRzKGRhdGEpCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICByZXR1cm4ga2V5LCBjUGlja2xlLmxvYWRzKGJ5dGVzKGRhdGEsICJpc284ODU5LTEiKSkgICMgOCBiaXRzCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgTWV0aG9kcyBhbGxvd2VkIHRvIHBhc3MtdGhyb3VnaCB0byBzZWxmLmRiYworICAgICMKKyAgICAjIGNsb3NlLCBjb3VudCwgZGVsZXRlLCBnZXRfcmVjbm8sIGpvaW5faXRlbQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJzaGVsdmUucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnNoZWx2ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzYTdlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJzaGVsdmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJzaGVsdmUucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnNoZWx2ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzYTdlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJzaGVsdmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJ0YWJsZXMucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL2RidGFibGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YWNkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL2RidGFibGVzLnB5CkBAIC0wLDAgKzEsODQzIEBACisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxIGJ5IEF1dG9ub21vdXMgWm9uZSBJbmR1c3RyaWVzCisjIENvcHlyaWdodCAoQykgMjAwMiBHcmVnb3J5IFAuIFNtaXRoCisjCisjIExpY2Vuc2U6ICAgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLiAgWW91IG1heSB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisjICAgICAgICAgICAgICAgcHVycG9zZSBpbmNsdWRpbmcgbW9kaWZpY2F0aW9uL3JlZGlzdHJpYnV0aW9uLCBzbyBsb25nIGFzCisjICAgICAgICAgICAgICAgdGhpcyBoZWFkZXIgcmVtYWlucyBpbnRhY3QgYW5kIHRoYXQgeW91IGRvIG5vdCBjbGFpbSBhbnkKKyMgICAgICAgICAgICAgICByaWdodHMgb2Ygb3duZXJzaGlwIG9yIGF1dGhvcnNoaXAgb2YgdGhpcyBzb2Z0d2FyZS4gIFRoaXMKKyMgICAgICAgICAgICAgICBzb2Z0d2FyZSBoYXMgYmVlbiB0ZXN0ZWQsIGJ1dCBubyB3YXJyYW50eSBpcyBleHByZXNzZWQgb3IKKyMgICAgICAgICAgICAgICBpbXBsaWVkLgorIworIyAgIC0tICBHcmVnb3J5IFAuIFNtaXRoIDxncmVnQGtyeXB0by5vcmc+CisKKyMgVGhpcyBwcm92aWRlcyBhIHNpbXBsZSBkYXRhYmFzZSB0YWJsZSBpbnRlcmZhY2UgYnVpbHQgb24gdG9wIG9mCisjIHRoZSBQeXRob24gQmVya2VsZXkgREIgMyBpbnRlcmZhY2UuCisjCitfY3ZzaWQgPSAnJElkJCcKKworaW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgY29weQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHN0cnVjdAorCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMyA6CisgICAgaW1wb3J0IHBpY2tsZQorZWxzZSA6CisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorICAgIGVsc2UgOgorICAgICAgICAjIFdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciBweXRob24gMi40CisgICAgICAgICMgd2UgY291bGQgdXNlOiAoaW4gMi41IHdlIG5lZWQgYSBfX2Z1dHVyZV9fIHN0YXRlbWVudCkKKyAgICAgICAgIworICAgICAgICAjICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgIyAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoLi4uKQorICAgICAgICAjICAgICAgICAuLi4KKyAgICAgICAgIworICAgICAgICAjIFdlIGNhbiBub3QgdXNlICJ3aXRoIiBhcyBpcywgYmVjYXVzZSBpdCB3b3VsZCBiZSBpbnZhbGlkIHN5bnRheAorICAgICAgICAjIGluIHB5dGhvbiAyLjQgYW5kICh3aXRoIG5vIF9fZnV0dXJlX18pIDIuNS4KKyAgICAgICAgIyBIZXJlIHdlIHNpbXVsYXRlICJ3aXRoIiBmb2xsb3dpbmcgUEVQIDM0MyA6CisgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICB3ID0gd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKQorICAgICAgICB3Ll9fZW50ZXJfXygpCisgICAgICAgIHRyeSA6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJywKKyAgICAgICAgICAgICAgICBtZXNzYWdlPSd0aGUgY1BpY2tsZSBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wJywKKyAgICAgICAgICAgICAgICBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICBpbXBvcnQgY1BpY2tsZSBhcyBwaWNrbGUKKyAgICAgICAgZmluYWxseSA6CisgICAgICAgICAgICB3Ll9fZXhpdF9fKCkKKyAgICAgICAgZGVsIHcKKwordHJ5OgorICAgICMgRm9yIFB5dGhvbnMgdy9kaXN0dXRpbHMgcHlic2RkYgorICAgIGZyb20gYnNkZGIzIGltcG9ydCBkYgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgRm9yIFB5dGhvbiAyLjMKKyAgICBmcm9tIGJzZGRiIGltcG9ydCBkYgorCitjbGFzcyBUYWJsZURCRXJyb3IoU3RhbmRhcmRFcnJvcik6CisgICAgcGFzcworY2xhc3MgVGFibGVBbHJlYWR5RXhpc3RzKFRhYmxlREJFcnJvcik6CisgICAgcGFzcworCisKK2NsYXNzIENvbmQ6CisgICAgIiIiVGhpcyBjb25kaXRpb24gbWF0Y2hlcyBldmVyeXRoaW5nIiIiCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHMpOgorICAgICAgICByZXR1cm4gMQorCitjbGFzcyBFeGFjdENvbmQoQ29uZCk6CisgICAgIiIiQWN0cyBhcyBhbiBleGFjdCBtYXRjaCBjb25kaXRpb24gZnVuY3Rpb24iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RydG9tYXRjaCk6CisgICAgICAgIHNlbGYuc3RydG9tYXRjaCA9IHN0cnRvbWF0Y2gKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcyk6CisgICAgICAgIHJldHVybiBzID09IHNlbGYuc3RydG9tYXRjaAorCitjbGFzcyBQcmVmaXhDb25kKENvbmQpOgorICAgICIiIkFjdHMgYXMgYSBjb25kaXRpb24gZnVuY3Rpb24gZm9yIG1hdGNoaW5nIGEgc3RyaW5nIHByZWZpeCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcmVmaXgpOgorICAgICAgICBzZWxmLnByZWZpeCA9IHByZWZpeAorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBzKToKKyAgICAgICAgcmV0dXJuIHNbOmxlbihzZWxmLnByZWZpeCldID09IHNlbGYucHJlZml4CisKK2NsYXNzIFBvc3RmaXhDb25kKENvbmQpOgorICAgICIiIkFjdHMgYXMgYSBjb25kaXRpb24gZnVuY3Rpb24gZm9yIG1hdGNoaW5nIGEgc3RyaW5nIHBvc3RmaXgiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zdGZpeCk6CisgICAgICAgIHNlbGYucG9zdGZpeCA9IHBvc3RmaXgKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcyk6CisgICAgICAgIHJldHVybiBzWy1sZW4oc2VsZi5wb3N0Zml4KTpdID09IHNlbGYucG9zdGZpeAorCitjbGFzcyBMaWtlQ29uZChDb25kKToKKyAgICAiIiIKKyAgICBBY3RzIGFzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIG1hdGNoIHVzaW5nIGFuIFNRTCAnTElLRScgc3R5bGUKKyAgICBzdHJpbmcuICBDYXNlIGluc2Vuc2l0aXZlIGFuZCAlIHNpZ25zIGFyZSB3aWxkIGNhcmRzLgorICAgIFRoaXMgaXNuJ3QgcGVyZmVjdCBidXQgaXQgc2hvdWxkIHdvcmsgZm9yIHRoZSBzaW1wbGUgY29tbW9uIGNhc2VzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaWtlc3RyLCByZV9mbGFncz1yZS5JR05PUkVDQVNFKToKKyAgICAgICAgIyBlc2NhcGUgcHl0aG9uIHJlIGNoYXJhY3RlcnMKKyAgICAgICAgY2hhcnNfdG9fZXNjYXBlID0gJy4qKygpW10/JworICAgICAgICBmb3IgY2hhciBpbiBjaGFyc190b19lc2NhcGUgOgorICAgICAgICAgICAgbGlrZXN0ciA9IGxpa2VzdHIucmVwbGFjZShjaGFyLCAnXFwnK2NoYXIpCisgICAgICAgICMgY29udmVydCAlcyB0byB3aWxkY2FyZHMKKyAgICAgICAgc2VsZi5saWtlc3RyID0gbGlrZXN0ci5yZXBsYWNlKCclJywgJy4qJykKKyAgICAgICAgc2VsZi5yZSA9IHJlLmNvbXBpbGUoJ14nK3NlbGYubGlrZXN0cisnJCcsIHJlX2ZsYWdzKQorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBzKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmUubWF0Y2gocykKKworIworIyBrZXlzIHVzZWQgdG8gc3RvcmUgZGF0YWJhc2UgbWV0YWRhdGEKKyMKK190YWJsZV9uYW1lc19rZXkgPSAnX19UQUJMRV9OQU1FU19fJyAgIyBsaXN0IG9mIHRoZSB0YWJsZXMgaW4gdGhpcyBkYgorX2NvbHVtbnMgPSAnLl9DT0xVTU5TX18nICAjIHRhYmxlX25hbWUrdGhpcyBrZXkgY29udGFpbnMgYSBsaXN0IG9mIGNvbHVtbnMKKworZGVmIF9jb2x1bW5zX2tleSh0YWJsZSk6CisgICAgcmV0dXJuIHRhYmxlICsgX2NvbHVtbnMKKworIworIyB0aGVzZSBrZXlzIGFyZSBmb3VuZCB3aXRoaW4gdGFibGUgc3ViIGRhdGFiYXNlcworIworX2RhdGEgPSAgJy5fREFUQV8uJyAgIyB0aGlzK2NvbHVtbit0aGlzK3Jvd2lkIGtleSBjb250YWlucyB0YWJsZSBkYXRhCitfcm93aWQgPSAnLl9ST1dJRF8uJyAjIHRoaXMrcm93aWQrdGhpcyBrZXkgY29udGFpbnMgYSB1bmlxdWUgZW50cnkgZm9yIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgICMgcm93IGluIHRoZSB0YWJsZS4gIChubyBkYXRhIGlzIHN0b3JlZCkKK19yb3dpZF9zdHJfbGVuID0gOCAgICMgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSB1bmlxdWUgcm93aWQgc3RyaW5ncworCisKK2RlZiBfZGF0YV9rZXkodGFibGUsIGNvbCwgcm93aWQpOgorICAgIHJldHVybiB0YWJsZSArIF9kYXRhICsgY29sICsgX2RhdGEgKyByb3dpZAorCitkZWYgX3NlYXJjaF9jb2xfZGF0YV9rZXkodGFibGUsIGNvbCk6CisgICAgcmV0dXJuIHRhYmxlICsgX2RhdGEgKyBjb2wgKyBfZGF0YQorCitkZWYgX3NlYXJjaF9hbGxfZGF0YV9rZXkodGFibGUpOgorICAgIHJldHVybiB0YWJsZSArIF9kYXRhCisKK2RlZiBfcm93aWRfa2V5KHRhYmxlLCByb3dpZCk6CisgICAgcmV0dXJuIHRhYmxlICsgX3Jvd2lkICsgcm93aWQgKyBfcm93aWQKKworZGVmIF9zZWFyY2hfcm93aWRfa2V5KHRhYmxlKToKKyAgICByZXR1cm4gdGFibGUgKyBfcm93aWQKKworZGVmIGNvbnRhaW5zX21ldGFzdHJpbmdzKHMpIDoKKyAgICAiIiJWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gc3RyaW5nIGRvZXMgbm90IGNvbnRhaW4gYW55CisgICAgbWV0YWRhdGEgc3RyaW5ncyB0aGF0IG1pZ2h0IGludGVyZmVyZSB3aXRoIGRidGFibGVzIGRhdGFiYXNlIG9wZXJhdGlvbi4KKyAgICAiIiIKKyAgICBpZiAocy5maW5kKF90YWJsZV9uYW1lc19rZXkpID49IDAgb3IKKyAgICAgICAgcy5maW5kKF9jb2x1bW5zKSA+PSAwIG9yCisgICAgICAgIHMuZmluZChfZGF0YSkgPj0gMCBvcgorICAgICAgICBzLmZpbmQoX3Jvd2lkKSA+PSAwKToKKyAgICAgICAgIyBUaGVuCisgICAgICAgIHJldHVybiAxCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIDAKKworCitjbGFzcyBic2RUYWJsZURCIDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGRiaG9tZSwgY3JlYXRlPTAsIHRydW5jYXRlPTAsIG1vZGU9MDYwMCwKKyAgICAgICAgICAgICAgICAgcmVjb3Zlcj0wLCBkYmZsYWdzPTApOgorICAgICAgICAiIiJic2RUYWJsZURCKGZpbGVuYW1lLCBkYmhvbWUsIGNyZWF0ZT0wLCB0cnVuY2F0ZT0wLCBtb2RlPTA2MDApCisKKyAgICAgICAgT3BlbiBkYXRhYmFzZSBuYW1lIGluIHRoZSBkYmhvbWUgQmVya2VsZXkgREIgZGlyZWN0b3J5LgorICAgICAgICBVc2Uga2V5d29yZCBhcmd1bWVudHMgd2hlbiBjYWxsaW5nIHRoaXMgY29uc3RydWN0b3IuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmRiID0gTm9uZQorICAgICAgICBteWZsYWdzID0gZGIuREJfVEhSRUFECisgICAgICAgIGlmIGNyZWF0ZToKKyAgICAgICAgICAgIG15ZmxhZ3MgfD0gZGIuREJfQ1JFQVRFCisgICAgICAgIGZsYWdzZm9yZW52ID0gKGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sgfCBkYi5EQl9JTklUX0xPRyB8CisgICAgICAgICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfVFhOIHwgZGJmbGFncykKKyAgICAgICAgIyBEQl9BVVRPX0NPTU1JVCBpc24ndCBhIHZhbGlkIGZsYWcgZm9yIGVudi5vcGVuKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGJmbGFncyB8PSBkYi5EQl9BVVRPX0NPTU1JVAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIHJlY292ZXI6CisgICAgICAgICAgICBmbGFnc2ZvcmVudiA9IGZsYWdzZm9yZW52IHwgZGIuREJfUkVDT1ZFUgorICAgICAgICBzZWxmLmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgIyBlbmFibGUgYXV0byBkZWFkbG9jayBhdm9pZGFuY2UKKyAgICAgICAgc2VsZi5lbnYuc2V0X2xrX2RldGVjdChkYi5EQl9MT0NLX0RFRkFVTFQpCisgICAgICAgIHNlbGYuZW52Lm9wZW4oZGJob21lLCBteWZsYWdzIHwgZmxhZ3Nmb3JlbnYpCisgICAgICAgIGlmIHRydW5jYXRlOgorICAgICAgICAgICAgbXlmbGFncyB8PSBkYi5EQl9UUlVOQ0FURQorICAgICAgICBzZWxmLmRiID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgICMgdGhpcyBjb2RlIHJlbGllcyBvbiBEQkN1cnNvci5zZXQqIG1ldGhvZHMgdG8gcmFpc2UgZXhjZXB0aW9ucworICAgICAgICAjIHJhdGhlciB0aGFuIHJldHVybmluZyBOb25lCisgICAgICAgIHNlbGYuZGIuc2V0X2dldF9yZXR1cm5zX25vbmUoMSkKKyAgICAgICAgIyBhbGxvdyBkdXBsaWNhdGUgZW50cmllcyBbd2FybmluZzogYmUgY2FyZWZ1bCB3LyBtZXRhZGF0YV0KKyAgICAgICAgc2VsZi5kYi5zZXRfZmxhZ3MoZGIuREJfRFVQKQorICAgICAgICBzZWxmLmRiLm9wZW4oZmlsZW5hbWUsIGRiLkRCX0JUUkVFLCBkYmZsYWdzIHwgbXlmbGFncywgbW9kZSkKKyAgICAgICAgc2VsZi5kYmZpbGVuYW1lID0gZmlsZW5hbWUKKworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDMgOgorICAgICAgICAgICAgY2xhc3MgY3Vyc29yX3B5M2sob2JqZWN0KSA6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiY3Vyc29yKSA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiY3Vyc29yID0gZGJjdXJzb3IKKworICAgICAgICAgICAgICAgIGRlZiBjbG9zZShzZWxmKSA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYmN1cnNvci5jbG9zZSgpCisKKyAgICAgICAgICAgICAgICBkZWYgc2V0X3JhbmdlKHNlbGYsIHNlYXJjaCkgOgorICAgICAgICAgICAgICAgICAgICB2ID0gc2VsZi5fZGJjdXJzb3Iuc2V0X3JhbmdlKGJ5dGVzKHNlYXJjaCwgImlzbzg4NTktMSIpKQorICAgICAgICAgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAodlswXS5kZWNvZGUoImlzbzg4NTktMSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2WzFdLmRlY29kZSgiaXNvODg1OS0xIikpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2CisKKyAgICAgICAgICAgICAgICBkZWYgX19uZXh0X18oc2VsZikgOgorICAgICAgICAgICAgICAgICAgICB2ID0gZ2V0YXR0cihzZWxmLl9kYmN1cnNvciwgIm5leHQiKSgpCisgICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmUgOgorICAgICAgICAgICAgICAgICAgICAgICAgdiA9ICh2WzBdLmRlY29kZSgiaXNvODg1OS0xIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0uZGVjb2RlKCJpc284ODU5LTEiKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYKKworICAgICAgICAgICAgY2xhc3MgZGJfcHkzayhvYmplY3QpIDoKKyAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZGIpIDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGIgPSBkYgorCisgICAgICAgICAgICAgICAgZGVmIGN1cnNvcihzZWxmLCB0eG49Tm9uZSkgOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yX3B5M2soc2VsZi5fZGIuY3Vyc29yKHR4bj10eG4pKQorCisgICAgICAgICAgICAgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5LCB0eG49Tm9uZSkgOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9kYiwiaGFzX2tleSIpKGJ5dGVzKGtleSwgImlzbzg4NTktMSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4bj10eG4pCisKKyAgICAgICAgICAgICAgICBkZWYgcHV0KHNlbGYsIGtleSwgdmFsdWUsIGZsYWdzPTAsIHR4bj1Ob25lKSA6CisgICAgICAgICAgICAgICAgICAgIGtleSA9IGJ5dGVzKGtleSwgImlzbzg4NTktMSIpCisgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYnl0ZXModmFsdWUsICJpc284ODU5LTEiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGIucHV0KGtleSwgdmFsdWUsIGZsYWdzPWZsYWdzLCB0eG49dHhuKQorCisgICAgICAgICAgICAgICAgZGVmIHB1dF9ieXRlcyhzZWxmLCBrZXksIHZhbHVlLCB0eG49Tm9uZSkgOgorICAgICAgICAgICAgICAgICAgICBrZXkgPSBieXRlcyhrZXksICJpc284ODU5LTEiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGIucHV0KGtleSwgdmFsdWUsIHR4bj10eG4pCisKKyAgICAgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSwgdHhuPU5vbmUsIGZsYWdzPTApIDoKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gYnl0ZXMoa2V5LCAiaXNvODg1OS0xIikKKyAgICAgICAgICAgICAgICAgICAgdiA9IHNlbGYuX2RiLmdldChrZXksIHR4bj10eG4sIGZsYWdzPWZsYWdzKQorICAgICAgICAgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2LmRlY29kZSgiaXNvODg1OS0xIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYKKworICAgICAgICAgICAgICAgIGRlZiBnZXRfYnl0ZXMoc2VsZiwga2V5LCB0eG49Tm9uZSwgZmxhZ3M9MCkgOgorICAgICAgICAgICAgICAgICAgICBrZXkgPSBieXRlcyhrZXksICJpc284ODU5LTEiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGIuZ2V0KGtleSwgdHhuPXR4biwgZmxhZ3M9ZmxhZ3MpCisKKyAgICAgICAgICAgICAgICBkZWYgZGVsZXRlKHNlbGYsIGtleSwgdHhuPU5vbmUpIDoKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gYnl0ZXMoa2V5LCAiaXNvODg1OS0xIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RiLmRlbGV0ZShrZXksIHR4bj10eG4pCisKKyAgICAgICAgICAgICAgICBkZWYgY2xvc2UgKHNlbGYpIDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RiLmNsb3NlKCkKKworICAgICAgICAgICAgc2VsZi5kYiA9IGRiX3B5M2soc2VsZi5kYikKKyAgICAgICAgZWxzZSA6ICAjIFB5dGhvbiAyLngKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIEluaXRpYWxpemUgdGhlIHRhYmxlIG5hbWVzIGxpc3QgaWYgdGhpcyBpcyBhIG5ldyBkYXRhYmFzZQorICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3QgZ2V0YXR0cihzZWxmLmRiLCAiaGFzX2tleSIpKF90YWJsZV9uYW1lc19rZXksIHR4bik6CisgICAgICAgICAgICAgICAgZ2V0YXR0cihzZWxmLmRiLCAicHV0X2J5dGVzIiwgc2VsZi5kYi5wdXQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChfdGFibGVfbmFtZXNfa2V5LCBwaWNrbGUuZHVtcHMoW10sIDEpLCB0eG49dHhuKQorICAgICAgICAjIFllcywgYmFyZSBleGNlcHQKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdHhuLmFib3J0KCkKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgIyBUT0RPIHZlcmlmeSBtb3JlIG9mIHRoZSBkYXRhYmFzZSdzIG1ldGFkYXRhPworICAgICAgICBzZWxmLl9fdGFibGVjb2x1bW5zID0ge30KKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kYiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGIuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5kYiA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5lbnYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmVudi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmVudiA9IE5vbmUKKworICAgIGRlZiBjaGVja3BvaW50KHNlbGYsIG1pbnM9MCk6CisgICAgICAgIHNlbGYuZW52LnR4bl9jaGVja3BvaW50KG1pbnMpCisKKyAgICBkZWYgc3luYyhzZWxmKToKKyAgICAgICAgc2VsZi5kYi5zeW5jKCkKKworICAgIGRlZiBfZGJfcHJpbnQoc2VsZikgOgorICAgICAgICAiIiJQcmludCB0aGUgZGF0YWJhc2UgdG8gc3Rkb3V0IGZvciBkZWJ1Z2dpbmciIiIKKyAgICAgICAgcHJpbnQgIioqKioqKioqIFByaW50aW5nIHJhdyBkYXRhYmFzZSBmb3IgZGVidWdnaW5nICoqKioqKioqIgorICAgICAgICBjdXIgPSBzZWxmLmRiLmN1cnNvcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGtleSwgZGF0YSA9IGN1ci5maXJzdCgpCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHByaW50IHJlcHIoe2tleTogZGF0YX0pCisgICAgICAgICAgICAgICAgbmV4dCA9IGN1ci5uZXh0KCkKKyAgICAgICAgICAgICAgICBpZiBuZXh0OgorICAgICAgICAgICAgICAgICAgICBrZXksIGRhdGEgPSBuZXh0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY3VyLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdCBkYi5EQk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICBjdXIuY2xvc2UoKQorCisKKyAgICBkZWYgQ3JlYXRlVGFibGUoc2VsZiwgdGFibGUsIGNvbHVtbnMpOgorICAgICAgICAiIiJDcmVhdGVUYWJsZSh0YWJsZSwgY29sdW1ucykgLSBDcmVhdGUgYSBuZXcgdGFibGUgaW4gdGhlIGRhdGFiYXNlLgorCisgICAgICAgIHJhaXNlcyBUYWJsZURCRXJyb3IgaWYgaXQgYWxyZWFkeSBleGlzdHMgb3IgZm9yIG90aGVyIERCIGVycm9ycy4KKyAgICAgICAgIiIiCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGNvbHVtbnMsIGxpc3QpCisKKyAgICAgICAgdHhuID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIGNoZWNraW5nIHNhbml0eSBvZiB0aGUgdGFibGUgYW5kIGNvbHVtbiBuYW1lcyBoZXJlIG9uCisgICAgICAgICAgICAjIHRhYmxlIGNyZWF0aW9uIHdpbGwgcHJldmVudCBwcm9ibGVtcyBlbHNld2hlcmUuCisgICAgICAgICAgICBpZiBjb250YWluc19tZXRhc3RyaW5ncyh0YWJsZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImJhZCB0YWJsZSBuYW1lOiBjb250YWlucyByZXNlcnZlZCBtZXRhc3RyaW5ncyIpCisgICAgICAgICAgICBmb3IgY29sdW1uIGluIGNvbHVtbnMgOgorICAgICAgICAgICAgICAgIGlmIGNvbnRhaW5zX21ldGFzdHJpbmdzKGNvbHVtbik6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIGNvbHVtbiBuYW1lOiBjb250YWlucyByZXNlcnZlZCBtZXRhc3RyaW5ncyIpCisKKyAgICAgICAgICAgIGNvbHVtbmxpc3Rfa2V5ID0gX2NvbHVtbnNfa2V5KHRhYmxlKQorICAgICAgICAgICAgaWYgZ2V0YXR0cihzZWxmLmRiLCAiaGFzX2tleSIpKGNvbHVtbmxpc3Rfa2V5KToKKyAgICAgICAgICAgICAgICByYWlzZSBUYWJsZUFscmVhZHlFeGlzdHMsICJ0YWJsZSBhbHJlYWR5IGV4aXN0cyIKKworICAgICAgICAgICAgdHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKCkKKyAgICAgICAgICAgICMgc3RvcmUgdGhlIHRhYmxlJ3MgY29sdW1uIGluZm8KKyAgICAgICAgICAgIGdldGF0dHIoc2VsZi5kYiwgInB1dF9ieXRlcyIsIHNlbGYuZGIucHV0KShjb2x1bW5saXN0X2tleSwKKyAgICAgICAgICAgICAgICAgICAgcGlja2xlLmR1bXBzKGNvbHVtbnMsIDEpLCB0eG49dHhuKQorCisgICAgICAgICAgICAjIGFkZCB0aGUgdGFibGUgbmFtZSB0byB0aGUgdGFibGVsaXN0CisgICAgICAgICAgICB0YWJsZWxpc3QgPSBwaWNrbGUubG9hZHMoZ2V0YXR0cihzZWxmLmRiLCAiZ2V0X2J5dGVzIiwKKyAgICAgICAgICAgICAgICBzZWxmLmRiLmdldCkgKF90YWJsZV9uYW1lc19rZXksIHR4bj10eG4sIGZsYWdzPWRiLkRCX1JNVykpCisgICAgICAgICAgICB0YWJsZWxpc3QuYXBwZW5kKHRhYmxlKQorICAgICAgICAgICAgIyBkZWxldGUgMXN0LCBpbiBjYXNlIHdlIG9wZW5lZCB3aXRoIERCX0RVUAorICAgICAgICAgICAgc2VsZi5kYi5kZWxldGUoX3RhYmxlX25hbWVzX2tleSwgdHhuPXR4bikKKyAgICAgICAgICAgIGdldGF0dHIoc2VsZi5kYiwgInB1dF9ieXRlcyIsIHNlbGYuZGIucHV0KShfdGFibGVfbmFtZXNfa2V5LAorICAgICAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcHModGFibGVsaXN0LCAxKSwgdHhuPXR4bikKKworICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgICAgICB0eG4gPSBOb25lCisgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCBkYmVycm9yOgorICAgICAgICAgICAgaWYgdHhuOgorICAgICAgICAgICAgICAgIHR4bi5hYm9ydCgpCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICByYWlzZSBUYWJsZURCRXJyb3IsIGRiZXJyb3JbMV0KKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgZGJlcnJvci5hcmdzWzFdCisKKworICAgIGRlZiBMaXN0VGFibGVDb2x1bW5zKHNlbGYsIHRhYmxlKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb2x1bW5zIGluIHRoZSBnaXZlbiB0YWJsZS4KKyAgICAgICAgW10gaWYgdGhlIHRhYmxlIGRvZXNuJ3QgZXhpc3QuCisgICAgICAgICIiIgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0YWJsZSwgc3RyKQorICAgICAgICBpZiBjb250YWluc19tZXRhc3RyaW5ncyh0YWJsZSk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiYmFkIHRhYmxlIG5hbWU6IGNvbnRhaW5zIHJlc2VydmVkIG1ldGFzdHJpbmdzIgorCisgICAgICAgIGNvbHVtbmxpc3Rfa2V5ID0gX2NvbHVtbnNfa2V5KHRhYmxlKQorICAgICAgICBpZiBub3QgZ2V0YXR0cihzZWxmLmRiLCAiaGFzX2tleSIpKGNvbHVtbmxpc3Rfa2V5KToKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBwaWNrbGVkY29sdW1ubGlzdCA9IGdldGF0dHIoc2VsZi5kYiwgImdldF9ieXRlcyIsCisgICAgICAgICAgICAgICAgc2VsZi5kYi5nZXQpKGNvbHVtbmxpc3Rfa2V5KQorICAgICAgICBpZiBwaWNrbGVkY29sdW1ubGlzdDoKKyAgICAgICAgICAgIHJldHVybiBwaWNrbGUubG9hZHMocGlja2xlZGNvbHVtbmxpc3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gW10KKworICAgIGRlZiBMaXN0VGFibGVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHRhYmxlcyBpbiB0aGlzIGRhdGFiYXNlLiIiIgorICAgICAgICBwaWNrbGVkdGFibGVsaXN0ID0gc2VsZi5kYi5nZXRfZ2V0KF90YWJsZV9uYW1lc19rZXkpCisgICAgICAgIGlmIHBpY2tsZWR0YWJsZWxpc3Q6CisgICAgICAgICAgICByZXR1cm4gcGlja2xlLmxvYWRzKHBpY2tsZWR0YWJsZWxpc3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gW10KKworICAgIGRlZiBDcmVhdGVPckV4dGVuZFRhYmxlKHNlbGYsIHRhYmxlLCBjb2x1bW5zKToKKyAgICAgICAgIiIiQ3JlYXRlT3JFeHRlbmRUYWJsZSh0YWJsZSwgY29sdW1ucykKKworICAgICAgICBDcmVhdGUgYSBuZXcgdGFibGUgaW4gdGhlIGRhdGFiYXNlLgorCisgICAgICAgIElmIGEgdGFibGUgb2YgdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLCBleHRlbmQgaXQgdG8gaGF2ZSBhbnkKKyAgICAgICAgYWRkaXRpb25hbCBjb2x1bW5zIHByZXNlbnQgaW4gdGhlIGdpdmVuIGxpc3QgYXMgd2VsbCBhcworICAgICAgICBhbGwgb2YgaXRzIGN1cnJlbnQgY29sdW1ucy4KKyAgICAgICAgIiIiCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGNvbHVtbnMsIGxpc3QpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5DcmVhdGVUYWJsZSh0YWJsZSwgY29sdW1ucykKKyAgICAgICAgZXhjZXB0IFRhYmxlQWxyZWFkeUV4aXN0czoKKyAgICAgICAgICAgICMgdGhlIHRhYmxlIGFscmVhZHkgZXhpc3RlZCwgYWRkIGFueSBuZXcgY29sdW1ucworICAgICAgICAgICAgdHhuID0gTm9uZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbHVtbmxpc3Rfa2V5ID0gX2NvbHVtbnNfa2V5KHRhYmxlKQorICAgICAgICAgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisKKyAgICAgICAgICAgICAgICAjIGxvYWQgdGhlIGN1cnJlbnQgY29sdW1uIGxpc3QKKyAgICAgICAgICAgICAgICBvbGRjb2x1bW5saXN0ID0gcGlja2xlLmxvYWRzKAorICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHNlbGYuZGIsICJnZXRfYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYi5nZXQpKGNvbHVtbmxpc3Rfa2V5LCB0eG49dHhuLCBmbGFncz1kYi5EQl9STVcpKQorICAgICAgICAgICAgICAgICMgY3JlYXRlIGEgaGFzaCB0YWJsZSBmb3IgZmFzdCBsb29rdXBzIG9mIGNvbHVtbiBuYW1lcyBpbiB0aGUKKyAgICAgICAgICAgICAgICAjIGxvb3AgYmVsb3cKKyAgICAgICAgICAgICAgICBvbGRjb2x1bW5oYXNoID0ge30KKyAgICAgICAgICAgICAgICBmb3IgYyBpbiBvbGRjb2x1bW5saXN0OgorICAgICAgICAgICAgICAgICAgICBvbGRjb2x1bW5oYXNoW2NdID0gYworCisgICAgICAgICAgICAgICAgIyBjcmVhdGUgYSBuZXcgY29sdW1uIGxpc3QgY29udGFpbmluZyBib3RoIHRoZSBvbGQgYW5kIG5ldworICAgICAgICAgICAgICAgICMgY29sdW1uIG5hbWVzCisgICAgICAgICAgICAgICAgbmV3Y29sdW1ubGlzdCA9IGNvcHkuY29weShvbGRjb2x1bW5saXN0KQorICAgICAgICAgICAgICAgIGZvciBjIGluIGNvbHVtbnM6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjIGluIG9sZGNvbHVtbmhhc2g6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdjb2x1bW5saXN0LmFwcGVuZChjKQorCisgICAgICAgICAgICAgICAgIyBzdG9yZSB0aGUgdGFibGUncyBuZXcgZXh0ZW5kZWQgY29sdW1uIGxpc3QKKyAgICAgICAgICAgICAgICBpZiBuZXdjb2x1bW5saXN0ICE9IG9sZGNvbHVtbmxpc3QgOgorICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgb2xkIG9uZSBmaXJzdCBzaW5jZSB3ZSBvcGVuZWQgd2l0aCBEQl9EVVAKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kYi5kZWxldGUoY29sdW1ubGlzdF9rZXksIHR4bj10eG4pCisgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoc2VsZi5kYiwgInB1dF9ieXRlcyIsIHNlbGYuZGIucHV0KShjb2x1bW5saXN0X2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlLmR1bXBzKG5ld2NvbHVtbmxpc3QsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eG49dHhuKQorCisgICAgICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgICAgICAgICAgdHhuID0gTm9uZQorCisgICAgICAgICAgICAgICAgc2VsZi5fX2xvYWRfY29sdW1uX2luZm8odGFibGUpCisgICAgICAgICAgICBleGNlcHQgZGIuREJFcnJvciwgZGJlcnJvcjoKKyAgICAgICAgICAgICAgICBpZiB0eG46CisgICAgICAgICAgICAgICAgICAgIHR4bi5hYm9ydCgpCisgICAgICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgZGJlcnJvclsxXQorICAgICAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUYWJsZURCRXJyb3IsIGRiZXJyb3IuYXJnc1sxXQorCisKKyAgICBkZWYgX19sb2FkX2NvbHVtbl9pbmZvKHNlbGYsIHRhYmxlKSA6CisgICAgICAgICIiImluaXRpYWxpemUgdGhlIHNlbGYuX190YWJsZWNvbHVtbnMgZGljdCIiIgorICAgICAgICAjIGNoZWNrIHRoZSBjb2x1bW4gbmFtZXMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGNvbHBpY2tsZXMgPSBnZXRhdHRyKHNlbGYuZGIsICJnZXRfYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmRiLmdldCkoX2NvbHVtbnNfa2V5KHRhYmxlKSkKKyAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgInVua25vd24gdGFibGU6ICVyIiAlICh0YWJsZSwpCisgICAgICAgIGlmIG5vdCB0Y29scGlja2xlczoKKyAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgInVua25vd24gdGFibGU6ICVyIiAlICh0YWJsZSwpCisgICAgICAgIHNlbGYuX190YWJsZWNvbHVtbnNbdGFibGVdID0gcGlja2xlLmxvYWRzKHRjb2xwaWNrbGVzKQorCisgICAgZGVmIF9fbmV3X3Jvd2lkKHNlbGYsIHRhYmxlLCB0eG4pIDoKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IHVuaXF1ZSByb3cgaWRlbnRpZmllciIiIgorICAgICAgICB1bmlxdWUgPSAwCisgICAgICAgIHdoaWxlIG5vdCB1bmlxdWU6CisgICAgICAgICAgICAjIEdlbmVyYXRlIGEgcmFuZG9tIDY0LWJpdCByb3cgSUQgc3RyaW5nCisgICAgICAgICAgICAjIChub3RlOiBtaWdodCBoYXZlIDw2NCBiaXRzIG9mIHRydWUgcmFuZG9tbmVzcworICAgICAgICAgICAgIyBidXQgaXQncyBwbGVudHkgZm9yIG91ciBkYXRhYmFzZSBpZCBuZWVkcyEpCisgICAgICAgICAgICBibGlzdCA9IFtdCisgICAgICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoX3Jvd2lkX3N0cl9sZW4pOgorICAgICAgICAgICAgICAgIGJsaXN0LmFwcGVuZChyYW5kb20ucmFuZGludCgwLDI1NSkpCisgICAgICAgICAgICBuZXdpZCA9IHN0cnVjdC5wYWNrKCdCJypfcm93aWRfc3RyX2xlbiwgKmJsaXN0KQorCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDMgOgorICAgICAgICAgICAgICAgIG5ld2lkID0gbmV3aWQuZGVjb2RlKCJpc284ODU5LTEiKSAgIyA4IGJpdHMKKworICAgICAgICAgICAgIyBHdWFyYW50ZWUgdW5pcXVlbmVzcyBieSBhZGRpbmcgdGhpcyBrZXkgdG8gdGhlIGRhdGFiYXNlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5kYi5wdXQoX3Jvd2lkX2tleSh0YWJsZSwgbmV3aWQpLCBOb25lLCB0eG49dHhuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzPWRiLkRCX05PT1ZFUldSSVRFKQorICAgICAgICAgICAgZXhjZXB0IGRiLkRCS2V5RXhpc3RFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHVuaXF1ZSA9IDEKKworICAgICAgICByZXR1cm4gbmV3aWQKKworCisgICAgZGVmIEluc2VydChzZWxmLCB0YWJsZSwgcm93ZGljdCkgOgorICAgICAgICAiIiJJbnNlcnQodGFibGUsIGRhdGFkaWN0KSAtIEluc2VydCBhIG5ldyByb3cgaW50byB0aGUgdGFibGUKKyAgICAgICAgdXNpbmcgdGhlIGtleXMrdmFsdWVzIGZyb20gcm93ZGljdCBhcyB0aGUgY29sdW1uIHZhbHVlcy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgdHhuID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3QgZ2V0YXR0cihzZWxmLmRiLCAiaGFzX2tleSIpKF9jb2x1bW5zX2tleSh0YWJsZSkpOgorICAgICAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgInVua25vd24gdGFibGUiCisKKyAgICAgICAgICAgICMgY2hlY2sgdGhlIHZhbGlkaXR5IG9mIGVhY2ggY29sdW1uIG5hbWUKKyAgICAgICAgICAgIGlmIG5vdCB0YWJsZSBpbiBzZWxmLl9fdGFibGVjb2x1bW5zOgorICAgICAgICAgICAgICAgIHNlbGYuX19sb2FkX2NvbHVtbl9pbmZvKHRhYmxlKQorICAgICAgICAgICAgZm9yIGNvbHVtbiBpbiByb3dkaWN0LmtleXMoKSA6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX190YWJsZWNvbHVtbnNbdGFibGVdLmNvdW50KGNvbHVtbik6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgInVua25vd24gY29sdW1uOiAlciIgJSAoY29sdW1uLCkKKworICAgICAgICAgICAgIyBnZXQgYSB1bmlxdWUgcm93IGlkZW50aWZpZXIgZm9yIHRoaXMgcm93CisgICAgICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICAgICAgcm93aWQgPSBzZWxmLl9fbmV3X3Jvd2lkKHRhYmxlLCB0eG49dHhuKQorCisgICAgICAgICAgICAjIGluc2VydCB0aGUgcm93IHZhbHVlcyBpbnRvIHRoZSB0YWJsZSBkYXRhYmFzZQorICAgICAgICAgICAgZm9yIGNvbHVtbiwgZGF0YWl0ZW0gaW4gcm93ZGljdC5pdGVtcygpOgorICAgICAgICAgICAgICAgICMgc3RvcmUgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgc2VsZi5kYi5wdXQoX2RhdGFfa2V5KHRhYmxlLCBjb2x1bW4sIHJvd2lkKSwgZGF0YWl0ZW0sIHR4bj10eG4pCisKKyAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgdHhuID0gTm9uZQorCisgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCBkYmVycm9yOgorICAgICAgICAgICAgIyBXSUJOSSB3ZSBjb3VsZCBqdXN0IGFib3J0IHRoZSB0eG4gYW5kIHJlLXJhaXNlIHRoZSBleGNlcHRpb24/CisgICAgICAgICAgICAjIEJ1dCBubywgYmVjYXVzZSBUYWJsZURCRXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gREJFcnJvciB2aWEKKyAgICAgICAgICAgICMgaW5oZXJpdGFuY2UsIHNvIGl0IHdvdWxkIGJlIGJhY2t3YXJkcyBpbmNvbXBhdGlibGUuICBEbyB0aGUgbmV4dAorICAgICAgICAgICAgIyBiZXN0IHRoaW5nLgorICAgICAgICAgICAgaW5mbyA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBpZiB0eG46CisgICAgICAgICAgICAgICAgdHhuLmFib3J0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmRiLmRlbGV0ZShfcm93aWRfa2V5KHRhYmxlLCByb3dpZCkpCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICByYWlzZSBUYWJsZURCRXJyb3IsIGRiZXJyb3JbMV0sIGluZm9bMl0KKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgZGJlcnJvci5hcmdzWzFdLCBpbmZvWzJdCisKKworICAgIGRlZiBNb2RpZnkoc2VsZiwgdGFibGUsIGNvbmRpdGlvbnM9e30sIG1hcHBpbmdzPXt9KToKKyAgICAgICAgIiIiTW9kaWZ5KHRhYmxlLCBjb25kaXRpb25zPXt9LCBtYXBwaW5ncz17fSkgLSBNb2RpZnkgaXRlbXMgaW4gcm93cyBtYXRjaGluZyAnY29uZGl0aW9ucycgdXNpbmcgbWFwcGluZyBmdW5jdGlvbnMgaW4gJ21hcHBpbmdzJworCisgICAgICAgICogdGFibGUgLSB0aGUgdGFibGUgbmFtZQorICAgICAgICAqIGNvbmRpdGlvbnMgLSBhIGRpY3Rpb25hcnkga2V5ZWQgb24gY29sdW1uIG5hbWVzIGNvbnRhaW5pbmcKKyAgICAgICAgICBhIGNvbmRpdGlvbiBjYWxsYWJsZSBleHBlY3RpbmcgdGhlIGRhdGEgc3RyaW5nIGFzIGFuCisgICAgICAgICAgYXJndW1lbnQgYW5kIHJldHVybmluZyBhIGJvb2xlYW4uCisgICAgICAgICogbWFwcGluZ3MgLSBhIGRpY3Rpb25hcnkga2V5ZWQgb24gY29sdW1uIG5hbWVzIGNvbnRhaW5pbmcgYQorICAgICAgICAgIGNvbmRpdGlvbiBjYWxsYWJsZSBleHBlY3RpbmcgdGhlIGRhdGEgc3RyaW5nIGFzIGFuIGFyZ3VtZW50IGFuZAorICAgICAgICAgIHJldHVybmluZyB0aGUgbmV3IHN0cmluZyBmb3IgdGhhdCBjb2x1bW4uCisgICAgICAgICIiIgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1hdGNoaW5nX3Jvd2lkcyA9IHNlbGYuX19TZWxlY3QodGFibGUsIFtdLCBjb25kaXRpb25zKQorCisgICAgICAgICAgICAjIG1vZGlmeSBvbmx5IHJlcXVlc3RlZCBjb2x1bW5zCisgICAgICAgICAgICBjb2x1bW5zID0gbWFwcGluZ3Mua2V5cygpCisgICAgICAgICAgICBmb3Igcm93aWQgaW4gbWF0Y2hpbmdfcm93aWRzLmtleXMoKToKKyAgICAgICAgICAgICAgICB0eG4gPSBOb25lCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmb3IgY29sdW1uIGluIGNvbHVtbnM6CisgICAgICAgICAgICAgICAgICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBtb2RpZnkgdGhlIHJlcXVlc3RlZCBjb2x1bW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhaXRlbSA9IHNlbGYuZGIuZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGF0YV9rZXkodGFibGUsIGNvbHVtbiwgcm93aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eG49dHhuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGIuZGVsZXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGF0YV9rZXkodGFibGUsIGNvbHVtbiwgcm93aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eG49dHhuKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFhYWFhYIHJvdyBrZXkgc29tZWhvdyBkaWRuJ3QgZXhpc3QsIGFzc3VtZSBubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWl0ZW0gPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhaXRlbSA9IG1hcHBpbmdzW2NvbHVtbl0oZGF0YWl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkYXRhaXRlbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRiLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RhdGFfa2V5KHRhYmxlLCBjb2x1bW4sIHJvd2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWl0ZW0sIHR4bj10eG4pCisgICAgICAgICAgICAgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4biA9IE5vbmUKKworICAgICAgICAgICAgICAgICMgY2F0Y2ggYWxsIGV4Y2VwdGlvbnMgaGVyZSBzaW5jZSB3ZSBjYWxsIHVua25vd24gY2FsbGFibGVzCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBpZiB0eG46CisgICAgICAgICAgICAgICAgICAgICAgICB0eG4uYWJvcnQoKQorICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCBkYmVycm9yOgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCBkYmVycm9yWzFdCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICByYWlzZSBUYWJsZURCRXJyb3IsIGRiZXJyb3IuYXJnc1sxXQorCisgICAgZGVmIERlbGV0ZShzZWxmLCB0YWJsZSwgY29uZGl0aW9ucz17fSk6CisgICAgICAgICIiIkRlbGV0ZSh0YWJsZSwgY29uZGl0aW9ucykgLSBEZWxldGUgaXRlbXMgbWF0Y2hpbmcgdGhlIGdpdmVuCisgICAgICAgIGNvbmRpdGlvbnMgZnJvbSB0aGUgdGFibGUuCisKKyAgICAgICAgKiBjb25kaXRpb25zIC0gYSBkaWN0aW9uYXJ5IGtleWVkIG9uIGNvbHVtbiBuYW1lcyBjb250YWluaW5nCisgICAgICAgICAgY29uZGl0aW9uIGZ1bmN0aW9ucyBleHBlY3RpbmcgdGhlIGRhdGEgc3RyaW5nIGFzIGFuCisgICAgICAgICAgYXJndW1lbnQgYW5kIHJldHVybmluZyBhIGJvb2xlYW4uCisgICAgICAgICIiIgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1hdGNoaW5nX3Jvd2lkcyA9IHNlbGYuX19TZWxlY3QodGFibGUsIFtdLCBjb25kaXRpb25zKQorCisgICAgICAgICAgICAjIGRlbGV0ZSByb3cgZGF0YSBmcm9tIGFsbCBjb2x1bW5zCisgICAgICAgICAgICBjb2x1bW5zID0gc2VsZi5fX3RhYmxlY29sdW1uc1t0YWJsZV0KKyAgICAgICAgICAgIGZvciByb3dpZCBpbiBtYXRjaGluZ19yb3dpZHMua2V5cygpOgorICAgICAgICAgICAgICAgIHR4biA9IE5vbmUKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgICAgICAgICAgICAgIGZvciBjb2x1bW4gaW4gY29sdW1uczoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBkYXRhIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGIuZGVsZXRlKF9kYXRhX2tleSh0YWJsZSwgY29sdW1uLCByb3dpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuPXR4bikKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBkYi5EQk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFhYWFhYIGNvbHVtbiBtYXkgbm90IGV4aXN0LCBhc3N1bWUgbm8gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYi5kZWxldGUoX3Jvd2lkX2tleSh0YWJsZSwgcm93aWQpLCB0eG49dHhuKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgZGIuREJOb3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFhYWFhYIHJvdyBrZXkgc29tZWhvdyBkaWRuJ3QgZXhpc3QsIGFzc3VtZSBubyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgICAgICAgICAgdHhuID0gTm9uZQorICAgICAgICAgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCBkYmVycm9yOgorICAgICAgICAgICAgICAgICAgICBpZiB0eG46CisgICAgICAgICAgICAgICAgICAgICAgICB0eG4uYWJvcnQoKQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgZGIuREJFcnJvciwgZGJlcnJvcjoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgZGJlcnJvclsxXQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCBkYmVycm9yLmFyZ3NbMV0KKworCisgICAgZGVmIFNlbGVjdChzZWxmLCB0YWJsZSwgY29sdW1ucywgY29uZGl0aW9ucz17fSk6CisgICAgICAgICIiIlNlbGVjdCh0YWJsZSwgY29sdW1ucywgY29uZGl0aW9ucykgLSByZXRyaWV2ZSBzcGVjaWZpYyByb3cgZGF0YQorICAgICAgICBSZXR1cm5zIGEgbGlzdCBvZiByb3cgY29sdW1uLT52YWx1ZSBtYXBwaW5nIGRpY3Rpb25hcmllcy4KKworICAgICAgICAqIGNvbHVtbnMgLSBhIGxpc3Qgb2Ygd2hpY2ggY29sdW1uIGRhdGEgdG8gcmV0dXJuLiAgSWYKKyAgICAgICAgICBjb2x1bW5zIGlzIE5vbmUsIGFsbCBjb2x1bW5zIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICAgICogY29uZGl0aW9ucyAtIGEgZGljdGlvbmFyeSBrZXllZCBvbiBjb2x1bW4gbmFtZXMKKyAgICAgICAgICBjb250YWluaW5nIGNhbGxhYmxlIGNvbmRpdGlvbnMgZXhwZWN0aW5nIHRoZSBkYXRhIHN0cmluZyBhcyBhbgorICAgICAgICAgIGFyZ3VtZW50IGFuZCByZXR1cm5pbmcgYSBib29sZWFuLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHRhYmxlIGluIHNlbGYuX190YWJsZWNvbHVtbnM6CisgICAgICAgICAgICAgICAgc2VsZi5fX2xvYWRfY29sdW1uX2luZm8odGFibGUpCisgICAgICAgICAgICBpZiBjb2x1bW5zIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29sdW1ucyA9IHNlbGYuX190YWJsZWNvbHVtbnNbdGFibGVdCisgICAgICAgICAgICBtYXRjaGluZ19yb3dpZHMgPSBzZWxmLl9fU2VsZWN0KHRhYmxlLCBjb2x1bW5zLCBjb25kaXRpb25zKQorICAgICAgICBleGNlcHQgZGIuREJFcnJvciwgZGJlcnJvcjoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgZGJlcnJvclsxXQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCBkYmVycm9yLmFyZ3NbMV0KKyAgICAgICAgIyByZXR1cm4gdGhlIG1hdGNoZXMgYXMgYSBsaXN0IG9mIGRpY3Rpb25hcmllcworICAgICAgICByZXR1cm4gbWF0Y2hpbmdfcm93aWRzLnZhbHVlcygpCisKKworICAgIGRlZiBfX1NlbGVjdChzZWxmLCB0YWJsZSwgY29sdW1ucywgY29uZGl0aW9ucyk6CisgICAgICAgICIiIl9fU2VsZWN0KCkgLSBVc2VkIHRvIGltcGxlbWVudCBTZWxlY3QgYW5kIERlbGV0ZSAoYWJvdmUpCisgICAgICAgIFJldHVybnMgYSBkaWN0aW9uYXJ5IGtleWVkIG9uIHJvd2lkcyBjb250YWluaW5nIGRpY3RzCisgICAgICAgIGhvbGRpbmcgdGhlIHJvdyBkYXRhIGZvciBjb2x1bW5zIGxpc3RlZCBpbiB0aGUgY29sdW1ucyBwYXJhbQorICAgICAgICB0aGF0IG1hdGNoIHRoZSBnaXZlbiBjb25kaXRpb25zLgorICAgICAgICAqIGNvbmRpdGlvbnMgaXMgYSBkaWN0aW9uYXJ5IGtleWVkIG9uIGNvbHVtbiBuYW1lcworICAgICAgICBjb250YWluaW5nIGNhbGxhYmxlIGNvbmRpdGlvbnMgZXhwZWN0aW5nIHRoZSBkYXRhIHN0cmluZyBhcyBhbgorICAgICAgICBhcmd1bWVudCBhbmQgcmV0dXJuaW5nIGEgYm9vbGVhbi4KKyAgICAgICAgIiIiCisgICAgICAgICMgY2hlY2sgdGhlIHZhbGlkaXR5IG9mIGVhY2ggY29sdW1uIG5hbWUKKyAgICAgICAgaWYgbm90IHRhYmxlIGluIHNlbGYuX190YWJsZWNvbHVtbnM6CisgICAgICAgICAgICBzZWxmLl9fbG9hZF9jb2x1bW5faW5mbyh0YWJsZSkKKyAgICAgICAgaWYgY29sdW1ucyBpcyBOb25lOgorICAgICAgICAgICAgY29sdW1ucyA9IHNlbGYudGFibGVjb2x1bW5zW3RhYmxlXQorICAgICAgICBmb3IgY29sdW1uIGluIChjb2x1bW5zICsgY29uZGl0aW9ucy5rZXlzKCkpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX190YWJsZWNvbHVtbnNbdGFibGVdLmNvdW50KGNvbHVtbik6CisgICAgICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCAidW5rbm93biBjb2x1bW46ICVyIiAlIChjb2x1bW4sKQorCisgICAgICAgICMga2V5ZWQgb24gcm93cyB0aGF0IG1hdGNoIHNvIGZhciwgY29udGFpbmluZ3MgZGljdHMga2V5ZWQgb24KKyAgICAgICAgIyBjb2x1bW4gbmFtZXMgY29udGFpbmluZyB0aGUgZGF0YSBmb3IgdGhhdCByb3cgYW5kIGNvbHVtbi4KKyAgICAgICAgbWF0Y2hpbmdfcm93aWRzID0ge30KKyAgICAgICAgIyBrZXlzIGFyZSByb3dpZHMgdGhhdCBkbyBub3QgbWF0Y2gKKyAgICAgICAgcmVqZWN0ZWRfcm93aWRzID0ge30KKworICAgICAgICAjIGF0dGVtcHQgdG8gc29ydCB0aGUgY29uZGl0aW9ucyBpbiBzdWNoIGEgd2F5IGFzIHRvIG1pbmltaXplIGZ1bGwKKyAgICAgICAgIyBjb2x1bW4gbG9va3VwcworICAgICAgICBkZWYgY21wX2NvbmRpdGlvbnMoYXR1cGxlLCBidHVwbGUpOgorICAgICAgICAgICAgYSA9IGF0dXBsZVsxXQorICAgICAgICAgICAgYiA9IGJ0dXBsZVsxXQorICAgICAgICAgICAgaWYgdHlwZShhKSBpcyB0eXBlKGIpOgorCisgICAgICAgICAgICAgICAgIyBOZWVkZWQgZm9yIHB5dGhvbiAzLiAiY21wIiB2YW5pc2hlZCBpbiAzLjAuMQorICAgICAgICAgICAgICAgIGRlZiBjbXAoYSwgYikgOgorICAgICAgICAgICAgICAgICAgICBpZiBhPT1iIDogcmV0dXJuIDAKKyAgICAgICAgICAgICAgICAgICAgaWYgYTxiIDogcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGEsIFByZWZpeENvbmQpIGFuZCBpc2luc3RhbmNlKGIsIFByZWZpeENvbmQpOgorICAgICAgICAgICAgICAgICAgICAjIGxvbmdlc3QgcHJlZml4IGZpcnN0CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbXAobGVuKGIucHJlZml4KSwgbGVuKGEucHJlZml4KSkKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGEsIExpa2VDb25kKSBhbmQgaXNpbnN0YW5jZShiLCBMaWtlQ29uZCk6CisgICAgICAgICAgICAgICAgICAgICMgbG9uZ2VzdCBsaWtlc3RyIGZpcnN0CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbXAobGVuKGIubGlrZXN0ciksIGxlbihhLmxpa2VzdHIpKQorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGEsIEV4YWN0Q29uZCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGIsIEV4YWN0Q29uZCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYSwgUHJlZml4Q29uZCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGIsIFByZWZpeENvbmQpOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICAjIGxlYXZlIGFsbCB1bmtub3duIGNvbmRpdGlvbiBjYWxsYWJsZXMgYWxvbmUgYXMgZXF1YWxzCisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgY29uZGl0aW9ubGlzdCA9IGNvbmRpdGlvbnMuaXRlbXMoKQorICAgICAgICAgICAgY29uZGl0aW9ubGlzdC5zb3J0KGNtcF9jb25kaXRpb25zKQorICAgICAgICBlbHNlIDogICMgSW5zZXJ0aW9uIFNvcnQuIFBsZWFzZSwgaW1wcm92ZQorICAgICAgICAgICAgY29uZGl0aW9ubGlzdCA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiBjb25kaXRpb25zLml0ZW1zKCkgOgorICAgICAgICAgICAgICAgIGZvciBqLCBrIGluIGVudW1lcmF0ZShjb25kaXRpb25saXN0KSA6CisgICAgICAgICAgICAgICAgICAgIHIgPSBjbXBfY29uZGl0aW9ucyhrLCBpKQorICAgICAgICAgICAgICAgICAgICBpZiByID09IDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ubGlzdC5pbnNlcnQoaiwgaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbmxpc3QuYXBwZW5kKGkpCisKKyAgICAgICAgIyBBcHBseSBjb25kaXRpb25zIHRvIGNvbHVtbiBkYXRhIHRvIGZpbmQgd2hhdCB3ZSB3YW50CisgICAgICAgIGN1ciA9IHNlbGYuZGIuY3Vyc29yKCkKKyAgICAgICAgY29sdW1uX251bSA9IC0xCisgICAgICAgIGZvciBjb2x1bW4sIGNvbmRpdGlvbiBpbiBjb25kaXRpb25saXN0OgorICAgICAgICAgICAgY29sdW1uX251bSA9IGNvbHVtbl9udW0gKyAxCisgICAgICAgICAgICBzZWFyY2hrZXkgPSBfc2VhcmNoX2NvbF9kYXRhX2tleSh0YWJsZSwgY29sdW1uKQorICAgICAgICAgICAgIyBzcGVlZHVwOiBkb24ndCBsaW5lYXIgc2VhcmNoIGNvbHVtbnMgd2l0aGluIGxvb3AKKyAgICAgICAgICAgIGlmIGNvbHVtbiBpbiBjb2x1bW5zOgorICAgICAgICAgICAgICAgIHNhdmV0aGlzY29sdW1uZGF0YSA9IDEgICMgc2F2ZSB0aGUgZGF0YSBmb3IgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNhdmV0aGlzY29sdW1uZGF0YSA9IDAgICMgZGF0YSBvbmx5IHVzZWQgZm9yIHNlbGVjdGlvbgorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAga2V5LCBkYXRhID0gY3VyLnNldF9yYW5nZShzZWFyY2hrZXkpCisgICAgICAgICAgICAgICAgd2hpbGUga2V5WzpsZW4oc2VhcmNoa2V5KV0gPT0gc2VhcmNoa2V5OgorICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdGhlIHJvd2lkIGZyb20gdGhlIGtleQorICAgICAgICAgICAgICAgICAgICByb3dpZCA9IGtleVstX3Jvd2lkX3N0cl9sZW46XQorCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByb3dpZCBpbiByZWplY3RlZF9yb3dpZHM6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5vIGNvbmRpdGlvbiB3YXMgc3BlY2lmaWVkIG9yIHRoZSBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3VjY2VlZHMsIGFkZCByb3cgdG8gb3VyIG1hdGNoIGxpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY29uZGl0aW9uIG9yIGNvbmRpdGlvbihkYXRhKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgcm93aWQgaW4gbWF0Y2hpbmdfcm93aWRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ19yb3dpZHNbcm93aWRdID0ge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzYXZldGhpc2NvbHVtbmRhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nX3Jvd2lkc1tyb3dpZF1bY29sdW1uXSA9IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcm93aWQgaW4gbWF0Y2hpbmdfcm93aWRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWwgbWF0Y2hpbmdfcm93aWRzW3Jvd2lkXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGVkX3Jvd2lkc1tyb3dpZF0gPSByb3dpZAorCisgICAgICAgICAgICAgICAgICAgIGtleSwgZGF0YSA9IGN1ci5uZXh0KCkKKworICAgICAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3IsIGRiZXJyb3I6CisgICAgICAgICAgICAgICAgaWYgZGJlcnJvci5hcmdzWzBdICE9IGRiLkRCX05PVEZPVU5EOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgY3VyLmNsb3NlKCkKKworICAgICAgICAjIHdlJ3JlIGRvbmUgc2VsZWN0aW5nIHJvd3MsIGdhcmJhZ2UgY29sbGVjdCB0aGUgcmVqZWN0IGxpc3QKKyAgICAgICAgZGVsIHJlamVjdGVkX3Jvd2lkcworCisgICAgICAgICMgZXh0cmFjdCBhbnkgcmVtYWluaW5nIGRlc2lyZWQgY29sdW1uIGRhdGEgZnJvbSB0aGUKKyAgICAgICAgIyBkYXRhYmFzZSBmb3IgdGhlIG1hdGNoaW5nIHJvd3MuCisgICAgICAgIGlmIGxlbihjb2x1bW5zKSA+IDA6CisgICAgICAgICAgICBmb3Igcm93aWQsIHJvd2RhdGEgaW4gbWF0Y2hpbmdfcm93aWRzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgZm9yIGNvbHVtbiBpbiBjb2x1bW5zOgorICAgICAgICAgICAgICAgICAgICBpZiBjb2x1bW4gaW4gcm93ZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd2RhdGFbY29sdW1uXSA9IHNlbGYuZGIuZ2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYXRhX2tleSh0YWJsZSwgY29sdW1uLCByb3dpZCkpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCBkYmVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGJlcnJvclswXSAhPSBkYi5EQl9OT1RGT1VORDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRiZXJyb3IuYXJnc1swXSAhPSBkYi5EQl9OT1RGT1VORDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd2RhdGFbY29sdW1uXSA9IE5vbmUKKworICAgICAgICAjIHJldHVybiB0aGUgbWF0Y2hlcworICAgICAgICByZXR1cm4gbWF0Y2hpbmdfcm93aWRzCisKKworICAgIGRlZiBEcm9wKHNlbGYsIHRhYmxlKToKKyAgICAgICAgIiIiUmVtb3ZlIGFuIGVudGlyZSB0YWJsZSBmcm9tIHRoZSBkYXRhYmFzZSIiIgorICAgICAgICB0eG4gPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisKKyAgICAgICAgICAgICMgZGVsZXRlIHRoZSBjb2x1bW4gbGlzdAorICAgICAgICAgICAgc2VsZi5kYi5kZWxldGUoX2NvbHVtbnNfa2V5KHRhYmxlKSwgdHhuPXR4bikKKworICAgICAgICAgICAgY3VyID0gc2VsZi5kYi5jdXJzb3IodHhuKQorCisgICAgICAgICAgICAjIGRlbGV0ZSBhbGwga2V5cyBjb250YWluaW5nIHRoaXMgdGFibGVzIGNvbHVtbiBhbmQgcm93IGluZm8KKyAgICAgICAgICAgIHRhYmxlX2tleSA9IF9zZWFyY2hfYWxsX2RhdGFfa2V5KHRhYmxlKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGtleSwgZGF0YSA9IGN1ci5zZXRfcmFuZ2UodGFibGVfa2V5KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBkYi5EQk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgIyBvbmx5IGRlbGV0ZSBpdGVtcyBpbiB0aGlzIHRhYmxlCisgICAgICAgICAgICAgICAgaWYga2V5WzpsZW4odGFibGVfa2V5KV0gIT0gdGFibGVfa2V5OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGN1ci5kZWxldGUoKQorCisgICAgICAgICAgICAjIGRlbGV0ZSBhbGwgcm93aWRzIHVzZWQgYnkgdGhpcyB0YWJsZQorICAgICAgICAgICAgdGFibGVfa2V5ID0gX3NlYXJjaF9yb3dpZF9rZXkodGFibGUpCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAga2V5LCBkYXRhID0gY3VyLnNldF9yYW5nZSh0YWJsZV9rZXkpCisgICAgICAgICAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAjIG9ubHkgZGVsZXRlIGl0ZW1zIGluIHRoaXMgdGFibGUKKyAgICAgICAgICAgICAgICBpZiBrZXlbOmxlbih0YWJsZV9rZXkpXSAhPSB0YWJsZV9rZXk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgY3VyLmRlbGV0ZSgpCisKKyAgICAgICAgICAgIGN1ci5jbG9zZSgpCisKKyAgICAgICAgICAgICMgZGVsZXRlIHRoZSB0YWJsZW5hbWUgZnJvbSB0aGUgdGFibGUgbmFtZSBsaXN0CisgICAgICAgICAgICB0YWJsZWxpc3QgPSBwaWNrbGUubG9hZHMoCisgICAgICAgICAgICAgICAgZ2V0YXR0cihzZWxmLmRiLCAiZ2V0X2J5dGVzIiwgc2VsZi5kYi5nZXQpKF90YWJsZV9uYW1lc19rZXksCisgICAgICAgICAgICAgICAgICAgIHR4bj10eG4sIGZsYWdzPWRiLkRCX1JNVykpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFibGVsaXN0LnJlbW92ZSh0YWJsZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICMgaG1tLCBpdCB3YXNuJ3QgdGhlcmUsIG9oIHdlbGwsIHRoYXQncyB3aGF0IHdlIHdhbnQuCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBkZWxldGUgMXN0LCBpbmNhc2Ugd2Ugb3BlbmVkIHdpdGggREJfRFVQCisgICAgICAgICAgICBzZWxmLmRiLmRlbGV0ZShfdGFibGVfbmFtZXNfa2V5LCB0eG49dHhuKQorICAgICAgICAgICAgZ2V0YXR0cihzZWxmLmRiLCAicHV0X2J5dGVzIiwgc2VsZi5kYi5wdXQpKF90YWJsZV9uYW1lc19rZXksCisgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wcyh0YWJsZWxpc3QsIDEpLCB0eG49dHhuKQorCisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgIHR4biA9IE5vbmUKKworICAgICAgICAgICAgaWYgdGFibGUgaW4gc2VsZi5fX3RhYmxlY29sdW1uczoKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fX3RhYmxlY29sdW1uc1t0YWJsZV0KKworICAgICAgICBleGNlcHQgZGIuREJFcnJvciwgZGJlcnJvcjoKKyAgICAgICAgICAgIGlmIHR4bjoKKyAgICAgICAgICAgICAgICB0eG4uYWJvcnQoKQorICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yKGRiZXJyb3IuYXJnc1sxXSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJ0YWJsZXMucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnRhYmxlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5YmQxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJ0YWJsZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJ0YWJsZXMucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnRhYmxlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcyMjM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJ0YWJsZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJ1dGlscy5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJ1dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmE2ODZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnV0aWxzLnB5CkBAIC0wLDAgKzEsODMgQEAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAwIEF1dG9ub21vdXMgWm9uZSBJbmR1c3RyaWVzCisjCisjIExpY2Vuc2U6ICAgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLiAgWW91IG1heSB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisjICAgICAgICAgICAgICAgcHVycG9zZSBpbmNsdWRpbmcgbW9kaWZpY2F0aW9uL3JlZGlzdHJpYnV0aW9uLCBzbyBsb25nIGFzCisjICAgICAgICAgICAgICAgdGhpcyBoZWFkZXIgcmVtYWlucyBpbnRhY3QgYW5kIHRoYXQgeW91IGRvIG5vdCBjbGFpbSBhbnkKKyMgICAgICAgICAgICAgICByaWdodHMgb2Ygb3duZXJzaGlwIG9yIGF1dGhvcnNoaXAgb2YgdGhpcyBzb2Z0d2FyZS4gIFRoaXMKKyMgICAgICAgICAgICAgICBzb2Z0d2FyZSBoYXMgYmVlbiB0ZXN0ZWQsIGJ1dCBubyB3YXJyYW50eSBpcyBleHByZXNzZWQgb3IKKyMgICAgICAgICAgICAgICBpbXBsaWVkLgorIworIyBBdXRob3I6IEdyZWdvcnkgUC4gU21pdGggPGdyZWdAa3J5cHRvLm9yZz4KKyMKKyMgTm90ZTogSSBkb24ndCBrbm93IGhvdyB1c2VmdWwgdGhpcyBpcyBpbiByZWFsaXR5IHNpbmNlIHdoZW4gYQorIyAgICAgICBEQkxvY2tEZWFkbG9ja0Vycm9yIGhhcHBlbnMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgc3VwcG9zZWQgdG8gYmUKKyMgICAgICAgYWJvcnRlZC4gIElmIGl0IGRvZXNuJ3QgdGhlbiB3aGVuIHRoZSBvcGVyYXRpb24gaXMgYXR0ZW1wdGVkIGFnYWluCisjICAgICAgIHRoZSBkZWFkbG9jayBpcyBzdGlsbCBoYXBwZW5pbmcuLi4KKyMgICAgICAgLS1Sb2JpbgorIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyMKKyMgaW1wb3J0IHRoZSB0aW1lLnNsZWVwIGZ1bmN0aW9uIGluIGEgbmFtZXNwYWNlIHNhZmUgd2F5IHRvIGFsbG93CisjICJmcm9tIGJzZGRiLmRidXRpbHMgaW1wb3J0ICoiCisjCitmcm9tIHRpbWUgaW1wb3J0IHNsZWVwIGFzIF9zbGVlcAorCitpbXBvcnQgc3lzCithYnNvbHV0ZV9pbXBvcnQgPSAoc3lzLnZlcnNpb25faW5mb1swXSA+PSAzKQoraWYgYWJzb2x1dGVfaW1wb3J0IDoKKyAgICAjIEJlY2F1c2UgdGhpcyBzeW50YXhpcyBpcyBub3QgdmFsaWQgYmVmb3JlIFB5dGhvbiAyLjUKKyAgICBleGVjKCJmcm9tIC4gaW1wb3J0IGRiIikKK2Vsc2UgOgorICAgIGltcG9ydCBkYgorCisjIGFsd2F5cyBzbGVlcCBhdCBsZWFzdCBOIHNlY29uZHMgYmV0d2VlbiByZXRyeXMKK19kZWFkbG9ja19NaW5TbGVlcFRpbWUgPSAxLjAvMTI4CisjIG5ldmVyIHNsZWVwIG1vcmUgdGhhbiBOIHNlY29uZHMgYmV0d2VlbiByZXRyeXMKK19kZWFkbG9ja19NYXhTbGVlcFRpbWUgPSAzLjE0MTU5CisKKyMgQXNzaWduIGEgZmlsZSBvYmplY3QgdG8gdGhpcyBmb3IgYSAic2xlZXBpbmciIG1lc3NhZ2UgdG8gYmUgd3JpdHRlbiB0byBpdAorIyBlYWNoIHJldHJ5CitfZGVhZGxvY2tfVmVyYm9zZUZpbGUgPSBOb25lCisKKworZGVmIERlYWRsb2NrV3JhcChmdW5jdGlvbiwgKl9hcmdzLCAqKl9rd2FyZ3MpOgorICAgICIiIkRlYWRsb2NrV3JhcChmdW5jdGlvbiwgKl9hcmdzLCAqKl9rd2FyZ3MpIC0gYXV0b21hdGljYWxseSByZXRyaWVzCisgICAgZnVuY3Rpb24gaW4gY2FzZSBvZiBhIGRhdGFiYXNlIGRlYWRsb2NrLgorCisgICAgVGhpcyBpcyBhIGZ1bmN0aW9uIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gd3JhcCBkYXRhYmFzZSBjYWxscyBzdWNoCisgICAgdGhhdCB0aGV5IHBlcmZvcm0gcmV0cnlzIHdpdGggZXhwb25lbnRpYWxseSBiYWNraW5nIG9mZiBzbGVlcHMgaW4KKyAgICBiZXR3ZWVuIHdoZW4gYSBEQkxvY2tEZWFkbG9ja0Vycm9yIGV4Y2VwdGlvbiBpcyByYWlzZWQuCisKKyAgICBBICdtYXhfcmV0cmllcycgcGFyYW1ldGVyIG1heSBvcHRpb25hbGx5IGJlIHBhc3NlZCB0byBwcmV2ZW50IGl0CisgICAgZnJvbSByZXRyeWluZyBmb3JldmVyIChpbiB3aGljaCBjYXNlIHRoZSBleGNlcHRpb24gd2lsbCBiZSByZXJhaXNlZCkuCisKKyAgICAgICAgZCA9IERCKC4uLikKKyAgICAgICAgZC5vcGVuKC4uLikKKyAgICAgICAgRGVhZGxvY2tXcmFwKGQucHV0LCAiZm9vIiwgZGF0YT0iYmFyIikgICMgc2V0IGtleSAiZm9vIiB0byAiYmFyIgorICAgICIiIgorICAgIHNsZWVwdGltZSA9IF9kZWFkbG9ja19NaW5TbGVlcFRpbWUKKyAgICBtYXhfcmV0cmllcyA9IF9rd2FyZ3MuZ2V0KCdtYXhfcmV0cmllcycsIC0xKQorICAgIGlmICdtYXhfcmV0cmllcycgaW4gX2t3YXJnczoKKyAgICAgICAgZGVsIF9rd2FyZ3NbJ21heF9yZXRyaWVzJ10KKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKl9hcmdzLCAqKl9rd2FyZ3MpCisgICAgICAgIGV4Y2VwdCBkYi5EQkxvY2tEZWFkbG9ja0Vycm9yOgorICAgICAgICAgICAgaWYgX2RlYWRsb2NrX1ZlcmJvc2VGaWxlOgorICAgICAgICAgICAgICAgIF9kZWFkbG9ja19WZXJib3NlRmlsZS53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgJ2RidXRpbHMuRGVhZGxvY2tXcmFwOiBzbGVlcGluZyAlMS4zZlxuJyAlIHNsZWVwdGltZSkKKyAgICAgICAgICAgIF9zbGVlcChzbGVlcHRpbWUpCisgICAgICAgICAgICAjIGV4cG9uZW50aWFsIGJhY2tvZmYgaW4gdGhlIHNsZWVwIHRpbWUKKyAgICAgICAgICAgIHNsZWVwdGltZSAqPSAyCisgICAgICAgICAgICBpZiBzbGVlcHRpbWUgPiBfZGVhZGxvY2tfTWF4U2xlZXBUaW1lOgorICAgICAgICAgICAgICAgIHNsZWVwdGltZSA9IF9kZWFkbG9ja19NYXhTbGVlcFRpbWUKKyAgICAgICAgICAgIG1heF9yZXRyaWVzIC09IDEKKyAgICAgICAgICAgIGlmIG1heF9yZXRyaWVzID09IC0xOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnV0aWxzLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJ1dGlscy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwMWVhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJ1dGlscy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnV0aWxzLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJ1dGlscy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwMWVhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJ1dGlscy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MWFmZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MWFmZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2FsbC5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2FsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWVmMWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYWxsLnB5CkBAIC0wLDAgKzEsNjIzIEBACisiIiJSdW4gYWxsIHRlc3QgY2FzZXMuCisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK3RyeToKKyAgICAjIEZvciBQeXRob25zIHcvZGlzdHV0aWxzIHB5YnNkZGIKKyAgICBpbXBvcnQgYnNkZGIzIGFzIGJzZGRiCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBGb3IgUHl0aG9uIDIuMworICAgIGltcG9ydCBic2RkYgorCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMyA6CisgICAgY2hhcnNldCA9ICJpc284ODU5LTEiICAjIEZ1bGwgOCBiaXQKKworICAgIGNsYXNzIGxvZ2N1cnNvcl9weTNrKG9iamVjdCkgOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZW52KSA6CisgICAgICAgICAgICBzZWxmLl9sb2djdXJzb3IgPSBlbnYubG9nX2N1cnNvcigpCisKKyAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIHYpIDoKKyAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX2xvZ2N1cnNvciwgdikKKworICAgICAgICBkZWYgX19uZXh0X18oc2VsZikgOgorICAgICAgICAgICAgdiA9IGdldGF0dHIoc2VsZi5fbG9nY3Vyc29yLCAibmV4dCIpKCkKKyAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmUgOgorICAgICAgICAgICAgICAgIHYgPSAodlswXSwgdlsxXS5kZWNvZGUoY2hhcnNldCkpCisgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgIG5leHQgPSBfX25leHRfXworCisgICAgICAgIGRlZiBmaXJzdChzZWxmKSA6CisgICAgICAgICAgICB2ID0gc2VsZi5fbG9nY3Vyc29yLmZpcnN0KCkKKyAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmUgOgorICAgICAgICAgICAgICAgIHYgPSAodlswXSwgdlsxXS5kZWNvZGUoY2hhcnNldCkpCisgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgIGRlZiBsYXN0KHNlbGYpIDoKKyAgICAgICAgICAgIHYgPSBzZWxmLl9sb2djdXJzb3IubGFzdCgpCisgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lIDoKKyAgICAgICAgICAgICAgICB2ID0gKHZbMF0sIHZbMV0uZGVjb2RlKGNoYXJzZXQpKQorICAgICAgICAgICAgcmV0dXJuIHYKKworICAgICAgICBkZWYgcHJldihzZWxmKSA6CisgICAgICAgICAgICB2ID0gc2VsZi5fbG9nY3Vyc29yLnByZXYoKQorICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZSA6CisgICAgICAgICAgICAgICAgdiA9ICh2WzBdLCB2WzFdLmRlY29kZShjaGFyc2V0KSkKKyAgICAgICAgICAgIHJldHVybiB2CisKKyAgICAgICAgZGVmIGN1cnJlbnQoc2VsZikgOgorICAgICAgICAgICAgdiA9IHNlbGYuX2xvZ2N1cnNvci5jdXJyZW50KCkKKyAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmUgOgorICAgICAgICAgICAgICAgIHYgPSAodlswXSwgdlsxXS5kZWNvZGUoY2hhcnNldCkpCisgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgIGRlZiBzZXQoc2VsZiwgbHNuKSA6CisgICAgICAgICAgICB2ID0gc2VsZi5fbG9nY3Vyc29yLnNldChsc24pCisgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lIDoKKyAgICAgICAgICAgICAgICB2ID0gKHZbMF0sIHZbMV0uZGVjb2RlKGNoYXJzZXQpKQorICAgICAgICAgICAgcmV0dXJuIHYKKworICAgIGNsYXNzIGN1cnNvcl9weTNrKG9iamVjdCkgOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZGIsICphcmdzLCAqKmt3YXJncykgOgorICAgICAgICAgICAgc2VsZi5fZGJjdXJzb3IgPSBkYi5jdXJzb3IoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCB2KSA6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9kYmN1cnNvciwgdikKKworICAgICAgICBkZWYgX2ZpeChzZWxmLCB2KSA6CisgICAgICAgICAgICBpZiB2IGlzIE5vbmUgOiByZXR1cm4gTm9uZQorICAgICAgICAgICAga2V5LCB2YWx1ZSA9IHYKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBieXRlcykgOgorICAgICAgICAgICAgICAgIGtleSA9IGtleS5kZWNvZGUoY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiAoa2V5LCB2YWx1ZS5kZWNvZGUoY2hhcnNldCkpCisKKyAgICAgICAgZGVmIF9fbmV4dF9fKHNlbGYpIDoKKyAgICAgICAgICAgIHYgPSBnZXRhdHRyKHNlbGYuX2RiY3Vyc29yLCAibmV4dCIpKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXgodikKKworICAgICAgICBuZXh0ID0gX19uZXh0X18KKworICAgICAgICBkZWYgcHJldmlvdXMoc2VsZikgOgorICAgICAgICAgICAgdiA9IHNlbGYuX2RiY3Vyc29yLnByZXZpb3VzKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXgodikKKworICAgICAgICBkZWYgbGFzdChzZWxmKSA6CisgICAgICAgICAgICB2ID0gc2VsZi5fZGJjdXJzb3IubGFzdCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZml4KHYpCisKKyAgICAgICAgZGVmIHNldChzZWxmLCBrKSA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGssIHN0cikgOgorICAgICAgICAgICAgICAgIGsgPSBieXRlcyhrLCBjaGFyc2V0KQorICAgICAgICAgICAgdiA9IHNlbGYuX2RiY3Vyc29yLnNldChrKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeCh2KQorCisgICAgICAgIGRlZiBzZXRfcmVjbm8oc2VsZiwgbnVtKSA6CisgICAgICAgICAgICB2ID0gc2VsZi5fZGJjdXJzb3Iuc2V0X3JlY25vKG51bSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXgodikKKworICAgICAgICBkZWYgc2V0X3JhbmdlKHNlbGYsIGssIGRsZW49LTEsIGRvZmY9LTEpIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoaywgc3RyKSA6CisgICAgICAgICAgICAgICAgayA9IGJ5dGVzKGssIGNoYXJzZXQpCisgICAgICAgICAgICB2ID0gc2VsZi5fZGJjdXJzb3Iuc2V0X3JhbmdlKGssIGRsZW49ZGxlbiwgZG9mZj1kb2ZmKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeCh2KQorCisgICAgICAgIGRlZiBkdXAoc2VsZiwgZmxhZ3M9MCkgOgorICAgICAgICAgICAgY3Vyc29yID0gc2VsZi5fZGJjdXJzb3IuZHVwKGZsYWdzKQorICAgICAgICAgICAgcmV0dXJuIGR1cF9jdXJzb3JfcHkzayhjdXJzb3IpCisKKyAgICAgICAgZGVmIG5leHRfZHVwKHNlbGYpIDoKKyAgICAgICAgICAgIHYgPSBzZWxmLl9kYmN1cnNvci5uZXh0X2R1cCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZml4KHYpCisKKyAgICAgICAgZGVmIG5leHRfbm9kdXAoc2VsZikgOgorICAgICAgICAgICAgdiA9IHNlbGYuX2RiY3Vyc29yLm5leHRfbm9kdXAoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeCh2KQorCisgICAgICAgIGRlZiBwdXQoc2VsZiwga2V5LCBkYXRhLCBmbGFncz0wLCBkbGVuPS0xLCBkb2ZmPS0xKSA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgc3RyKSA6CisgICAgICAgICAgICAgICAga2V5ID0gYnl0ZXMoa2V5LCBjaGFyc2V0KQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBzdHIpIDoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGJ5dGVzKGRhdGEsIGNoYXJzZXQpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGJjdXJzb3IucHV0KGtleSwgZGF0YSwgZmxhZ3M9ZmxhZ3MsIGRsZW49ZGxlbiwKKyAgICAgICAgICAgICAgICAgICAgZG9mZj1kb2ZmKQorCisgICAgICAgIGRlZiBjdXJyZW50KHNlbGYsIGZsYWdzPTAsIGRsZW49LTEsIGRvZmY9LTEpIDoKKyAgICAgICAgICAgIHYgPSBzZWxmLl9kYmN1cnNvci5jdXJyZW50KGZsYWdzPWZsYWdzLCBkbGVuPWRsZW4sIGRvZmY9ZG9mZikKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXgodikKKworICAgICAgICBkZWYgZmlyc3Qoc2VsZikgOgorICAgICAgICAgICAgdiA9IHNlbGYuX2RiY3Vyc29yLmZpcnN0KCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXgodikKKworICAgICAgICBkZWYgcGdldChzZWxmLCBrZXk9Tm9uZSwgZGF0YT1Ob25lLCBmbGFncz0wKSA6CisgICAgICAgICAgICAjIEluY29ycmVjdCBiZWNhdXNlIGtleSBjYW4gYmUgYSBiYXJlIG51bWJlciwKKyAgICAgICAgICAgICMgYnV0IGVub3VnaCB0byBwYXNzIHRlc3RzdWl0ZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIGludCkgYW5kIChkYXRhIGlzIE5vbmUpIGFuZCAoZmxhZ3MgPT0gMCkgOgorICAgICAgICAgICAgICAgIGZsYWdzID0ga2V5CisgICAgICAgICAgICAgICAga2V5ID0gTm9uZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHN0cikgOgorICAgICAgICAgICAgICAgIGtleSA9IGJ5dGVzKGtleSwgY2hhcnNldCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgaW50KSBhbmQgKGZsYWdzPT0wKSA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBkYXRhCisgICAgICAgICAgICAgICAgZGF0YSA9IE5vbmUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgc3RyKSA6CisgICAgICAgICAgICAgICAgZGF0YSA9IGJ5dGVzKGRhdGEsIGNoYXJzZXQpCisgICAgICAgICAgICB2PXNlbGYuX2RiY3Vyc29yLnBnZXQoa2V5PWtleSwgZGF0YT1kYXRhLCBmbGFncz1mbGFncykKKyAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmUgOgorICAgICAgICAgICAgICAgIHYxLCB2MiwgdjMgPSB2CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2MSwgYnl0ZXMpIDoKKyAgICAgICAgICAgICAgICAgICAgdjEgPSB2MS5kZWNvZGUoY2hhcnNldCkKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYyLCBieXRlcykgOgorICAgICAgICAgICAgICAgICAgICB2MiA9IHYyLmRlY29kZShjaGFyc2V0KQorCisgICAgICAgICAgICAgICAgdiA9ICh2MSwgdjIsIHYzLmRlY29kZShjaGFyc2V0KSkKKworICAgICAgICAgICAgcmV0dXJuIHYKKworICAgICAgICBkZWYgam9pbl9pdGVtKHNlbGYpIDoKKyAgICAgICAgICAgIHYgPSBzZWxmLl9kYmN1cnNvci5qb2luX2l0ZW0oKQorICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZSA6CisgICAgICAgICAgICAgICAgdiA9IHYuZGVjb2RlKGNoYXJzZXQpCisgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgIGRlZiBnZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKSA6CisgICAgICAgICAgICBsID0gbGVuKGFyZ3MpCisgICAgICAgICAgICBpZiBsID09IDIgOgorICAgICAgICAgICAgICAgIGssIGYgPSBhcmdzCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBzdHIpIDoKKyAgICAgICAgICAgICAgICAgICAgayA9IGJ5dGVzKGssICJpc284ODU5LTEiKQorICAgICAgICAgICAgICAgIGFyZ3MgPSAoaywgZikKKyAgICAgICAgICAgIGVsaWYgbCA9PSAzIDoKKyAgICAgICAgICAgICAgICBrLCBkLCBmID0gYXJncworICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoaywgc3RyKSA6CisgICAgICAgICAgICAgICAgICAgIGsgPSBieXRlcyhrLCBjaGFyc2V0KQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZCwgc3RyKSA6CisgICAgICAgICAgICAgICAgICAgIGQgPSBieXRlcyhkLCBjaGFyc2V0KQorICAgICAgICAgICAgICAgIGFyZ3MgPShrLCBkLCBmKQorCisgICAgICAgICAgICB2ID0gc2VsZi5fZGJjdXJzb3IuZ2V0KCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmUgOgorICAgICAgICAgICAgICAgIGssIHYgPSB2CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBieXRlcykgOgorICAgICAgICAgICAgICAgICAgICBrID0gay5kZWNvZGUoY2hhcnNldCkKKyAgICAgICAgICAgICAgICB2ID0gKGssIHYuZGVjb2RlKGNoYXJzZXQpKQorICAgICAgICAgICAgcmV0dXJuIHYKKworICAgICAgICBkZWYgZ2V0X2JvdGgoc2VsZiwga2V5LCB2YWx1ZSkgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHN0cikgOgorICAgICAgICAgICAgICAgIGtleSA9IGJ5dGVzKGtleSwgY2hhcnNldCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cikgOgorICAgICAgICAgICAgICAgIHZhbHVlID0gYnl0ZXModmFsdWUsIGNoYXJzZXQpCisgICAgICAgICAgICB2PXNlbGYuX2RiY3Vyc29yLmdldF9ib3RoKGtleSwgdmFsdWUpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZml4KHYpCisKKyAgICBjbGFzcyBkdXBfY3Vyc29yX3B5M2soY3Vyc29yX3B5M2spIDoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiY3Vyc29yKSA6CisgICAgICAgICAgICBzZWxmLl9kYmN1cnNvciA9IGRiY3Vyc29yCisKKyAgICBjbGFzcyBEQl9weTNrKG9iamVjdCkgOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKSA6CisgICAgICAgICAgICBhcmdzMj1bXQorICAgICAgICAgICAgZm9yIGkgaW4gYXJncyA6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpLCBEQkVudl9weTNrKSA6CisgICAgICAgICAgICAgICAgICAgIGkgPSBpLl9kYmVudgorICAgICAgICAgICAgICAgIGFyZ3MyLmFwcGVuZChpKQorICAgICAgICAgICAgYXJncyA9IHR1cGxlKGFyZ3MyKQorICAgICAgICAgICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZW1zKCkgOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodiwgREJFbnZfcHkzaykgOgorICAgICAgICAgICAgICAgICAgICBrd2FyZ3Nba10gPSB2Ll9kYmVudgorCisgICAgICAgICAgICBzZWxmLl9kYiA9IGJzZGRiLl9kYi5EQl9vcmlnKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGspIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoaywgc3RyKSA6CisgICAgICAgICAgICAgICAgayA9IGJ5dGVzKGssIGNoYXJzZXQpCisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9kYiwgImhhc19rZXkiKShrKQorCisgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrKSA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGssIHN0cikgOgorICAgICAgICAgICAgICAgIGsgPSBieXRlcyhrLCBjaGFyc2V0KQorICAgICAgICAgICAgdiA9IHNlbGYuX2RiW2tdCisgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lIDoKKyAgICAgICAgICAgICAgICB2ID0gdi5kZWNvZGUoY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiB2CisKKyAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGssIHYpIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoaywgc3RyKSA6CisgICAgICAgICAgICAgICAgayA9IGJ5dGVzKGssIGNoYXJzZXQpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsIHN0cikgOgorICAgICAgICAgICAgICAgIHYgPSBieXRlcyh2LCBjaGFyc2V0KQorICAgICAgICAgICAgc2VsZi5fZGJba10gPSB2CisKKyAgICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGspIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoaywgc3RyKSA6CisgICAgICAgICAgICAgICAgayA9IGJ5dGVzKGssIGNoYXJzZXQpCisgICAgICAgICAgICBkZWwgc2VsZi5fZGJba10KKworICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgdikgOgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fZGIsIHYpCisKKyAgICAgICAgZGVmIF9fbGVuX18oc2VsZikgOgorICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9kYikKKworICAgICAgICBkZWYgaGFzX2tleShzZWxmLCBrLCB0eG49Tm9uZSkgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBzdHIpIDoKKyAgICAgICAgICAgICAgICBrID0gYnl0ZXMoaywgY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYi5oYXNfa2V5KGssIHR4bj10eG4pCisKKyAgICAgICAgZGVmIHNldF9yZV9kZWxpbShzZWxmLCBjKSA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGMsIHN0cikgOiAgIyBXZSBjYW4gdXNlIGEgbnVtZXJpYyB2YWx1ZSBieXRlIHRvbworICAgICAgICAgICAgICAgIGMgPSBieXRlcyhjLCBjaGFyc2V0KQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RiLnNldF9yZV9kZWxpbShjKQorCisgICAgICAgIGRlZiBzZXRfcmVfcGFkKHNlbGYsIGMpIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYywgc3RyKSA6ICAjIFdlIGNhbiB1c2UgYSBudW1lcmljIHZhbHVlIGJ5dGUgdG9vCisgICAgICAgICAgICAgICAgYyA9IGJ5dGVzKGMsIGNoYXJzZXQpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGIuc2V0X3JlX3BhZChjKQorCisgICAgICAgIGRlZiBnZXRfcmVfc291cmNlKHNlbGYpIDoKKyAgICAgICAgICAgIHNvdXJjZSA9IHNlbGYuX2RiLmdldF9yZV9zb3VyY2UoKQorICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5kZWNvZGUoY2hhcnNldCkKKworICAgICAgICBkZWYgcHV0KHNlbGYsIGtleSwgZGF0YSwgdHhuPU5vbmUsIGZsYWdzPTAsIGRsZW49LTEsIGRvZmY9LTEpIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBzdHIpIDoKKyAgICAgICAgICAgICAgICBrZXkgPSBieXRlcyhrZXksIGNoYXJzZXQpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIHN0cikgOgorICAgICAgICAgICAgICAgIHZhbHVlID0gYnl0ZXMoZGF0YSwgY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYi5wdXQoa2V5LCBkYXRhLCBmbGFncz1mbGFncywgdHhuPXR4biwgZGxlbj1kbGVuLAorICAgICAgICAgICAgICAgICAgICBkb2ZmPWRvZmYpCisKKyAgICAgICAgZGVmIGFwcGVuZChzZWxmLCB2YWx1ZSwgdHhuPU5vbmUpIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cikgOgorICAgICAgICAgICAgICAgIHZhbHVlID0gYnl0ZXModmFsdWUsIGNoYXJzZXQpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGIuYXBwZW5kKHZhbHVlLCB0eG49dHhuKQorCisgICAgICAgIGRlZiBnZXRfc2l6ZShzZWxmLCBrZXkpIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBzdHIpIDoKKyAgICAgICAgICAgICAgICBrZXkgPSBieXRlcyhrZXksIGNoYXJzZXQpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGIuZ2V0X3NpemUoa2V5KQorCisgICAgICAgIGRlZiBleGlzdHMoc2VsZiwga2V5LCAqYXJncywgKiprd2FyZ3MpIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBzdHIpIDoKKyAgICAgICAgICAgICAgICBrZXkgPSBieXRlcyhrZXksIGNoYXJzZXQpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGIuZXhpc3RzKGtleSwgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PSJNYWdpY0Nvb2tpZSIsIHR4bj1Ob25lLCBmbGFncz0wLCBkbGVuPS0xLCBkb2ZmPS0xKSA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgc3RyKSA6CisgICAgICAgICAgICAgICAga2V5ID0gYnl0ZXMoa2V5LCBjaGFyc2V0KQorICAgICAgICAgICAgaWYgZGVmYXVsdCAhPSAiTWFnaWNDb29raWUiIDogICMgTWFnaWMgZm9yICd0ZXN0X2dldF9ub25lLnB5JworICAgICAgICAgICAgICAgIHY9c2VsZi5fZGIuZ2V0KGtleSwgZGVmYXVsdD1kZWZhdWx0LCB0eG49dHhuLCBmbGFncz1mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRsZW49ZGxlbiwgZG9mZj1kb2ZmKQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgdj1zZWxmLl9kYi5nZXQoa2V5LCB0eG49dHhuLCBmbGFncz1mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRsZW49ZGxlbiwgZG9mZj1kb2ZmKQorICAgICAgICAgICAgaWYgKHYgaXMgbm90IE5vbmUpIGFuZCBpc2luc3RhbmNlKHYsIGJ5dGVzKSA6CisgICAgICAgICAgICAgICAgdiA9IHYuZGVjb2RlKGNoYXJzZXQpCisgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgIGRlZiBwZ2V0KHNlbGYsIGtleSwgdHhuPU5vbmUpIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBzdHIpIDoKKyAgICAgICAgICAgICAgICBrZXkgPSBieXRlcyhrZXksIGNoYXJzZXQpCisgICAgICAgICAgICB2PXNlbGYuX2RiLnBnZXQoa2V5LCB0eG49dHhuKQorICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZSA6CisgICAgICAgICAgICAgICAgdjEsIHYyID0gdgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodjEsIGJ5dGVzKSA6CisgICAgICAgICAgICAgICAgICAgIHYxID0gdjEuZGVjb2RlKGNoYXJzZXQpCisKKyAgICAgICAgICAgICAgICB2ID0gKHYxLCB2Mi5kZWNvZGUoY2hhcnNldCkpCisgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgIGRlZiBnZXRfYm90aChzZWxmLCBrZXksIHZhbHVlLCB0eG49Tm9uZSwgZmxhZ3M9MCkgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHN0cikgOgorICAgICAgICAgICAgICAgIGtleSA9IGJ5dGVzKGtleSwgY2hhcnNldCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cikgOgorICAgICAgICAgICAgICAgIHZhbHVlID0gYnl0ZXModmFsdWUsIGNoYXJzZXQpCisgICAgICAgICAgICB2PXNlbGYuX2RiLmdldF9ib3RoKGtleSwgdmFsdWUsIHR4bj10eG4sIGZsYWdzPWZsYWdzKQorICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZSA6CisgICAgICAgICAgICAgICAgdiA9IHYuZGVjb2RlKGNoYXJzZXQpCisgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgIGRlZiBkZWxldGUoc2VsZiwga2V5LCB0eG49Tm9uZSkgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHN0cikgOgorICAgICAgICAgICAgICAgIGtleSA9IGJ5dGVzKGtleSwgY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYi5kZWxldGUoa2V5LCB0eG49dHhuKQorCisgICAgICAgIGRlZiBrZXlzKHNlbGYpIDoKKyAgICAgICAgICAgIGsgPSBzZWxmLl9kYi5rZXlzKCkKKyAgICAgICAgICAgIGlmIGxlbihrKSBhbmQgaXNpbnN0YW5jZShrWzBdLCBieXRlcykgOgorICAgICAgICAgICAgICAgIHJldHVybiBbaS5kZWNvZGUoY2hhcnNldCkgZm9yIGkgaW4gc2VsZi5fZGIua2V5cygpXQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGsKKworICAgICAgICBkZWYgaXRlbXMoc2VsZikgOgorICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2RiLml0ZW1zKCkKKyAgICAgICAgICAgIGlmIG5vdCBsZW4oZGF0YSkgOiByZXR1cm4gZGF0YQorICAgICAgICAgICAgZGF0YTIgPSBbXQorICAgICAgICAgICAgZm9yIGssIHYgaW4gZGF0YSA6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBieXRlcykgOgorICAgICAgICAgICAgICAgICAgICBrID0gay5kZWNvZGUoY2hhcnNldCkKKyAgICAgICAgICAgICAgICBkYXRhMi5hcHBlbmQoKGssIHYuZGVjb2RlKGNoYXJzZXQpKSkKKyAgICAgICAgICAgIHJldHVybiBkYXRhMgorCisgICAgICAgIGRlZiBhc3NvY2lhdGUoc2VsZiwgc2Vjb25kYXJ5ZGIsIGNhbGxiYWNrLCBmbGFncz0wLCB0eG49Tm9uZSkgOgorICAgICAgICAgICAgY2xhc3MgYXNzb2NpYXRlX2NhbGxiYWNrKG9iamVjdCkgOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWxsYmFjaykgOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jYWxsYmFjayA9IGNhbGxiYWNrCisKKyAgICAgICAgICAgICAgICBkZWYgY2FsbGJhY2soc2VsZiwga2V5LCBkYXRhKSA6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBzdHIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleS5kZWNvZGUoY2hhcnNldCkKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuZGVjb2RlKGNoYXJzZXQpCisgICAgICAgICAgICAgICAgICAgIGtleSA9IHNlbGYuX2NhbGxiYWNrKGtleSwgZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPSBic2RkYi5fZGIuREJfRE9OT1RJTkRFWCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHN0cikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGJ5dGVzKGtleSwgY2hhcnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShrZXksIGxpc3QpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkyID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBrZXkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGksIHN0cikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGJ5dGVzKGksIGNoYXJzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTIuYXBwZW5kKGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5MgorICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5CisKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYi5hc3NvY2lhdGUoc2Vjb25kYXJ5ZGIuX2RiLAorICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVfY2FsbGJhY2soY2FsbGJhY2spLmNhbGxiYWNrLCBmbGFncz1mbGFncywKKyAgICAgICAgICAgICAgICAgICAgdHhuPXR4bikKKworICAgICAgICBkZWYgY3Vyc29yKHNlbGYsIHR4bj1Ob25lLCBmbGFncz0wKSA6CisgICAgICAgICAgICByZXR1cm4gY3Vyc29yX3B5M2soc2VsZi5fZGIsIHR4bj10eG4sIGZsYWdzPWZsYWdzKQorCisgICAgICAgIGRlZiBqb2luKHNlbGYsIGN1cnNvcl9saXN0KSA6CisgICAgICAgICAgICBjdXJzb3JfbGlzdCA9IFtpLl9kYmN1cnNvciBmb3IgaSBpbiBjdXJzb3JfbGlzdF0KKyAgICAgICAgICAgIHJldHVybiBkdXBfY3Vyc29yX3B5M2soc2VsZi5fZGIuam9pbihjdXJzb3JfbGlzdCkpCisKKyAgICBjbGFzcyBEQkVudl9weTNrKG9iamVjdCkgOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKSA6CisgICAgICAgICAgICBzZWxmLl9kYmVudiA9IGJzZGRiLl9kYi5EQkVudl9vcmlnKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgdikgOgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fZGJlbnYsIHYpCisKKyAgICAgICAgZGVmIGxvZ19jdXJzb3Ioc2VsZiwgZmxhZ3M9MCkgOgorICAgICAgICAgICAgcmV0dXJuIGxvZ2N1cnNvcl9weTNrKHNlbGYuX2RiZW52KQorCisgICAgICAgIGRlZiBnZXRfbGdfZGlyKHNlbGYpIDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYmVudi5nZXRfbGdfZGlyKCkuZGVjb2RlKGNoYXJzZXQpCisKKyAgICAgICAgZGVmIGdldF90bXBfZGlyKHNlbGYpIDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYmVudi5nZXRfdG1wX2RpcigpLmRlY29kZShjaGFyc2V0KQorCisgICAgICAgIGRlZiBnZXRfZGF0YV9kaXJzKHNlbGYpIDoKKyAgICAgICAgICAgIHJldHVybiB0dXBsZSgKKyAgICAgICAgICAgICAgICAoaS5kZWNvZGUoY2hhcnNldCkgZm9yIGkgaW4gc2VsZi5fZGJlbnYuZ2V0X2RhdGFfZGlycygpKSkKKworICAgIGNsYXNzIERCU2VxdWVuY2VfcHkzayhvYmplY3QpIDoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiLCAqYXJncywgKiprd2FyZ3MpIDoKKyAgICAgICAgICAgIHNlbGYuX2RiPWRiCisgICAgICAgICAgICBzZWxmLl9kYnNlcXVlbmNlID0gYnNkZGIuX2RiLkRCU2VxdWVuY2Vfb3JpZyhkYi5fZGIsICphcmdzLCAqKmt3YXJncykKKworICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgdikgOgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fZGJzZXF1ZW5jZSwgdikKKworICAgICAgICBkZWYgb3BlbihzZWxmLCBrZXksICphcmdzLCAqKmt3YXJncykgOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Ric2VxdWVuY2Uub3BlbihieXRlcyhrZXksIGNoYXJzZXQpLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgZGVmIGdldF9rZXkoc2VsZikgOgorICAgICAgICAgICAgcmV0dXJuICBzZWxmLl9kYnNlcXVlbmNlLmdldF9rZXkoKS5kZWNvZGUoY2hhcnNldCkKKworICAgICAgICBkZWYgZ2V0X2RicChzZWxmKSA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGIKKworICAgIGltcG9ydCBzdHJpbmcKKyAgICBzdHJpbmcubGV0dGVycz1bY2hyKGkpIGZvciBpIGluIHhyYW5nZSg2NSw5MSldCisKKyAgICBic2RkYi5fZGIuREJFbnZfb3JpZyA9IGJzZGRiLl9kYi5EQkVudgorICAgIGJzZGRiLl9kYi5EQl9vcmlnID0gYnNkZGIuX2RiLkRCCisgICAgaWYgYnNkZGIuZGIudmVyc2lvbigpIDw9ICg0LCAzKSA6CisgICAgICAgIGJzZGRiLl9kYi5EQlNlcXVlbmNlX29yaWcgPSBOb25lCisgICAgZWxzZSA6CisgICAgICAgIGJzZGRiLl9kYi5EQlNlcXVlbmNlX29yaWcgPSBic2RkYi5fZGIuREJTZXF1ZW5jZQorCisgICAgZGVmIGRvX3Byb3h5X2RiX3B5M2soZmxhZykgOgorICAgICAgICBmbGFnMiA9IGRvX3Byb3h5X2RiX3B5M2suZmxhZworICAgICAgICBkb19wcm94eV9kYl9weTNrLmZsYWcgPSBmbGFnCisgICAgICAgIGlmIGZsYWcgOgorICAgICAgICAgICAgYnNkZGIuREJFbnYgPSBic2RkYi5kYi5EQkVudiA9IGJzZGRiLl9kYi5EQkVudiA9IERCRW52X3B5M2sKKyAgICAgICAgICAgIGJzZGRiLkRCID0gYnNkZGIuZGIuREIgPSBic2RkYi5fZGIuREIgPSBEQl9weTNrCisgICAgICAgICAgICBic2RkYi5fZGIuREJTZXF1ZW5jZSA9IERCU2VxdWVuY2VfcHkzaworICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIGJzZGRiLkRCRW52ID0gYnNkZGIuZGIuREJFbnYgPSBic2RkYi5fZGIuREJFbnYgPSBic2RkYi5fZGIuREJFbnZfb3JpZworICAgICAgICAgICAgYnNkZGIuREIgPSBic2RkYi5kYi5EQiA9IGJzZGRiLl9kYi5EQiA9IGJzZGRiLl9kYi5EQl9vcmlnCisgICAgICAgICAgICBic2RkYi5fZGIuREJTZXF1ZW5jZSA9IGJzZGRiLl9kYi5EQlNlcXVlbmNlX29yaWcKKyAgICAgICAgcmV0dXJuIGZsYWcyCisKKyAgICBkb19wcm94eV9kYl9weTNrLmZsYWcgPSBGYWxzZQorICAgIGRvX3Byb3h5X2RiX3B5M2soVHJ1ZSkKKwordHJ5OgorICAgICMgRm9yIFB5dGhvbnMgdy9kaXN0dXRpbHMgcHlic2RkYgorICAgIGZyb20gYnNkZGIzIGltcG9ydCBkYiwgZGJ0YWJsZXMsIGRidXRpbHMsIGRic2hlbHZlLCBcCisgICAgICAgICAgICBoYXNob3BlbiwgYnRvcGVuLCBybm9wZW4sIGRib2JqCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBGb3IgUHl0aG9uIDIuMworICAgIGZyb20gYnNkZGIgaW1wb3J0IGRiLCBkYnRhYmxlcywgZGJ1dGlscywgZGJzaGVsdmUsIFwKKyAgICAgICAgICAgIGhhc2hvcGVuLCBidG9wZW4sIHJub3BlbiwgZGJvYmoKKwordHJ5OgorICAgIGZyb20gYnNkZGIzIGltcG9ydCB0ZXN0X3N1cHBvcnQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisgICAgZWxzZSA6CisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgc3VwcG9ydCBhcyB0ZXN0X3N1cHBvcnQKKworCit0cnk6CisgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkLCBjdXJyZW50VGhyZWFkCisgICAgICAgIGRlbCBUaHJlYWQsIGN1cnJlbnRUaHJlYWQKKyAgICBlbHNlIDoKKyAgICAgICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRocmVhZCwgY3VycmVudF90aHJlYWQKKyAgICAgICAgZGVsIFRocmVhZCwgY3VycmVudF90aHJlYWQKKyAgICBoYXZlX3RocmVhZHMgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaGF2ZV90aHJlYWRzID0gRmFsc2UKKwordmVyYm9zZSA9IDAKK2lmICd2ZXJib3NlJyBpbiBzeXMuYXJndjoKKyAgICB2ZXJib3NlID0gMQorICAgIHN5cy5hcmd2LnJlbW92ZSgndmVyYm9zZScpCisKK2lmICdzaWxlbnQnIGluIHN5cy5hcmd2OiAgIyB0YWtlIGNhcmUgb2Ygb2xkIGZsYWcsIGp1c3QgaW4gY2FzZQorICAgIHZlcmJvc2UgPSAwCisgICAgc3lzLmFyZ3YucmVtb3ZlKCdzaWxlbnQnKQorCisKK2RlZiBwcmludF92ZXJzaW9ucygpOgorICAgIHByaW50CisgICAgcHJpbnQgJy09JyAqIDM4CisgICAgcHJpbnQgZGIuREJfVkVSU0lPTl9TVFJJTkcKKyAgICBwcmludCAnYnNkZGIuZGIudmVyc2lvbigpOiAgICVzJyAlIChkYi52ZXJzaW9uKCksICkKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDUsIDApIDoKKyAgICAgICAgcHJpbnQgJ2JzZGRiLmRiLmZ1bGxfdmVyc2lvbigpOiAlcycgJXJlcHIoZGIuZnVsbF92ZXJzaW9uKCkpCisgICAgcHJpbnQgJ2JzZGRiLmRiLl9fdmVyc2lvbl9fOiAlcycgJSBkYi5fX3ZlcnNpb25fXworICAgIHByaW50ICdic2RkYi5kYi5jdnNpZDogICAgICAgJXMnICUgZGIuY3ZzaWQKKworICAgICMgV29ya2Fyb3VuZCBmb3IgYWxsb3dpbmcgZ2VuZXJhdGluZyBhbiBFR0dzIGFzIGEgWklQIGZpbGVzLgorICAgIHN1ZmZpeD0iX18iCisgICAgcHJpbnQgJ3B5IG1vZHVsZTogICAgICAgICAgICAlcycgJSBnZXRhdHRyKGJzZGRiLCAiX19maWxlIitzdWZmaXgpCisgICAgcHJpbnQgJ2V4dGVuc2lvbiBtb2R1bGU6ICAgICAlcycgJSBnZXRhdHRyKGJzZGRiLCAiX19maWxlIitzdWZmaXgpCisKKyAgICBwcmludCAncHl0aG9uIHZlcnNpb246ICAgICAgICVzJyAlIHN5cy52ZXJzaW9uCisgICAgcHJpbnQgJ015IHBpZDogICAgICAgICAgICAgICAlcycgJSBvcy5nZXRwaWQoKQorICAgIHByaW50ICctPScgKiAzOAorCisKK2RlZiBnZXRfbmV3X3BhdGgobmFtZSkgOgorICAgIGdldF9uZXdfcGF0aC5tdXRleC5hY3F1aXJlKCkKKyAgICB0cnkgOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgcGF0aD1vcy5wYXRoLmpvaW4oZ2V0X25ld19wYXRoLnByZWZpeCwKKyAgICAgICAgICAgICAgICBuYW1lKyJfIitzdHIob3MuZ2V0cGlkKCkpKyJfIitzdHIoZ2V0X25ld19wYXRoLm51bSkpCisgICAgICAgIGdldF9uZXdfcGF0aC5udW0rPTEKKyAgICBmaW5hbGx5IDoKKyAgICAgICAgZ2V0X25ld19wYXRoLm11dGV4LnJlbGVhc2UoKQorICAgIHJldHVybiBwYXRoCisKK2RlZiBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKSA6CisgICAgcGF0aD1nZXRfbmV3X3BhdGgoImVudmlyb25tZW50IikKKyAgICBpbXBvcnQgb3MKKyAgICB0cnk6CisgICAgICAgIG9zLm1ha2VkaXJzKHBhdGgsbW9kZT0wNzAwKQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShwYXRoKQorICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQorICAgIHJldHVybiBwYXRoCisKK2RlZiBnZXRfbmV3X2RhdGFiYXNlX3BhdGgoKSA6CisgICAgcGF0aD1nZXRfbmV3X3BhdGgoImRhdGFiYXNlIikKKyAgICBpbXBvcnQgb3MKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKSA6CisgICAgICAgIG9zLnJlbW92ZShwYXRoKQorICAgIHJldHVybiBwYXRoCisKKworIyBUaGlzIHBhdGggY2FuIGJlIG92ZXJyaWRlbiB2aWEgInNldF90ZXN0X3BhdGhfcHJlZml4KCkiLgoraW1wb3J0IG9zLCBvcy5wYXRoCitnZXRfbmV3X3BhdGgucHJlZml4PW9zLnBhdGguam9pbihvcy5lbnZpcm9uLmdldCgiVE1QRElSIiwKKyAgICBvcy5wYXRoLmpvaW4ob3Muc2VwLCJ0bXAiKSksICJ6LUJlcmtlbGV5X0RCIikKK2dldF9uZXdfcGF0aC5udW09MAorCitkZWYgZ2V0X3Rlc3RfcGF0aF9wcmVmaXgoKSA6CisgICAgcmV0dXJuIGdldF9uZXdfcGF0aC5wcmVmaXgKKworZGVmIHNldF90ZXN0X3BhdGhfcHJlZml4KHBhdGgpIDoKKyAgICBnZXRfbmV3X3BhdGgucHJlZml4PXBhdGgKKworZGVmIHJlbW92ZV90ZXN0X3BhdGhfZGlyZWN0b3J5KCkgOgorICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoZ2V0X25ld19wYXRoLnByZWZpeCkKKworaWYgaGF2ZV90aHJlYWRzIDoKKyAgICBpbXBvcnQgdGhyZWFkaW5nCisgICAgZ2V0X25ld19wYXRoLm11dGV4PXRocmVhZGluZy5Mb2NrKCkKKyAgICBkZWwgdGhyZWFkaW5nCitlbHNlIDoKKyAgICBjbGFzcyBMb2NrKG9iamVjdCkgOgorICAgICAgICBkZWYgYWNxdWlyZShzZWxmKSA6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlZiByZWxlYXNlKHNlbGYpIDoKKyAgICAgICAgICAgIHBhc3MKKyAgICBnZXRfbmV3X3BhdGgubXV0ZXg9TG9jaygpCisgICAgZGVsIExvY2sKKworCisKK2NsYXNzIFByaW50SW5mb0Zha2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdFByaW50VmVyc2lvbnMoc2VsZik6CisgICAgICAgIHByaW50X3ZlcnNpb25zKCkKKworCisjIFRoaXMgbGl0dGxlIGhhY2sgaXMgZm9yIHdoZW4gdGhpcyBtb2R1bGUgaXMgcnVuIGFzIG1haW4gYW5kIGFsbCB0aGUKKyMgb3RoZXIgbW9kdWxlcyBpbXBvcnQgaXQgc28gdGhleSB3aWxsIHN0aWxsIGJlIGFibGUgdG8gZ2V0IHRoZSByaWdodAorIyB2ZXJib3NlIHNldHRpbmcuICBJdCdzIGNvbmZ1c2luZyBidXQgaXQgd29ya3MuCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgaW1wb3J0IHRlc3RfYWxsCisgICAgdGVzdF9hbGwudmVyYm9zZSA9IHZlcmJvc2UKK2Vsc2UgOgorICAgIGltcG9ydCBzeXMKKyAgICBwcmludCA+PnN5cy5zdGRlcnIsICJXb3JrIHRvIGRvISIKKworCitkZWYgc3VpdGUobW9kdWxlX3ByZWZpeD0nJywgdGltaW5nX2NoZWNrPU5vbmUpOgorICAgIHRlc3RfbW9kdWxlcyA9IFsKKyAgICAgICAgJ3Rlc3RfYXNzb2NpYXRlJywKKyAgICAgICAgJ3Rlc3RfYmFzaWNzJywKKyAgICAgICAgJ3Rlc3RfZGJlbnYnLAorICAgICAgICAndGVzdF9kYicsCisgICAgICAgICd0ZXN0X2NvbXBhcmUnLAorICAgICAgICAndGVzdF9jb21wYXQnLAorICAgICAgICAndGVzdF9jdXJzb3JfcGdldF9idWcnLAorICAgICAgICAndGVzdF9kYm9iaicsCisgICAgICAgICd0ZXN0X2Ric2hlbHZlJywKKyAgICAgICAgJ3Rlc3RfZGJ0YWJsZXMnLAorICAgICAgICAndGVzdF9kaXN0cmlidXRlZF90cmFuc2FjdGlvbnMnLAorICAgICAgICAndGVzdF9lYXJseV9jbG9zZScsCisgICAgICAgICd0ZXN0X2ZpbGVpZCcsCisgICAgICAgICd0ZXN0X2dldF9ub25lJywKKyAgICAgICAgJ3Rlc3Rfam9pbicsCisgICAgICAgICd0ZXN0X2xvY2snLAorICAgICAgICAndGVzdF9taXNjJywKKyAgICAgICAgJ3Rlc3RfcGlja2xlJywKKyAgICAgICAgJ3Rlc3RfcXVldWUnLAorICAgICAgICAndGVzdF9yZWNubycsCisgICAgICAgICd0ZXN0X3JlcGxpY2F0aW9uJywKKyAgICAgICAgJ3Rlc3Rfc2VxdWVuY2UnLAorICAgICAgICAndGVzdF90aHJlYWQnLAorICAgICAgICBdCisKKyAgICBhbGx0ZXN0cyA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgZm9yIG5hbWUgaW4gdGVzdF9tb2R1bGVzOgorICAgICAgICAjbW9kdWxlID0gX19pbXBvcnRfXyhuYW1lKQorICAgICAgICAjIERvIGl0IHRoaXMgd2F5IHNvIHRoYXQgc3VpdGUgbWF5IGJlIGNhbGxlZCBleHRlcm5hbGx5IHZpYQorICAgICAgICAjIHB5dGhvbidzIExpYi90ZXN0L3Rlc3RfYnNkZGIzLgorICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKG1vZHVsZV9wcmVmaXgrbmFtZSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgbmFtZSkKKworICAgICAgICBhbGx0ZXN0cy5hZGRUZXN0KG1vZHVsZS50ZXN0X3N1aXRlKCkpCisgICAgICAgIGlmIHRpbWluZ19jaGVjazoKKyAgICAgICAgICAgIGFsbHRlc3RzLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKHRpbWluZ19jaGVjaykpCisgICAgcmV0dXJuIGFsbHRlc3RzCisKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoUHJpbnRJbmZvRmFrZVRlc3QpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcHJpbnRfdmVyc2lvbnMoKQorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2FsbC5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9hbGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmU0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9hbGwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2FsbC5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9hbGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZmU0ODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9hbGwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Fzc29jaWF0ZS5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Fzc29jaWF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQ5ZTExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYXNzb2NpYXRlLnB5CkBAIC0wLDAgKzEsNDY1IEBACisiIiIKK1Rlc3RDYXNlcyBmb3IgREIuYXNzb2NpYXRlLgorIiIiCisKK2ltcG9ydCBzeXMsIG9zLCBzdHJpbmcKK2ltcG9ydCB0aW1lCitmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIGRic2hlbHZlLCB0ZXN0X3N1cHBvcnQsIHZlcmJvc2UsIGhhdmVfdGhyZWFkcywgXAorICAgICAgICBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK211c2ljZGF0YSA9IHsKKzEgOiAoIkJhZCBFbmdsaXNoIiwgIlRoZSBQcmljZSBPZiBMb3ZlIiwgIlJvY2siKSwKKzIgOiAoIkROQSBmZWF0dXJpbmcgU3V6YW5uZSBWZWdhIiwgIlRvbSdzIERpbmVyIiwgIlJvY2siKSwKKzMgOiAoIkdlb3JnZSBNaWNoYWVsIiwgIlByYXlpbmcgRm9yIFRpbWUiLCAiUm9jayIpLAorNCA6ICgiR2xvcmlhIEVzdGVmYW4iLCAiSGVyZSBXZSBBcmUiLCAiUm9jayIpLAorNSA6ICgiTGluZGEgUm9uc3RhZHQiLCAiRG9uJ3QgS25vdyBNdWNoIiwgIlJvY2siKSwKKzYgOiAoIk1pY2hhZWwgQm9sdG9uIiwgIkhvdyBBbSBJIFN1cHBvc2VkIFRvIExpdmUgV2l0aG91dCBZb3UiLCAiQmx1ZXMiKSwKKzcgOiAoIlBhdWwgWW91bmciLCAiT2ggR2lybCIsICJSb2NrIiksCis4IDogKCJQYXVsYSBBYmR1bCIsICJPcHBvc2l0ZXMgQXR0cmFjdCIsICJSb2NrIiksCis5IDogKCJSaWNoYXJkIE1hcngiLCAiU2hvdWxkJ3ZlIEtub3duIEJldHRlciIsICJSb2NrIiksCisxMDogKCJSb2QgU3Rld2FydCIsICJGb3JldmVyIFlvdW5nIiwgIlJvY2siKSwKKzExOiAoIlJveGV0dGUiLCAiRGFuZ2Vyb3VzIiwgIlJvY2siKSwKKzEyOiAoIlNoZWVuYSBFYXN0b24iLCAiVGhlIExvdmVyIEluIE1lIiwgIlJvY2siKSwKKzEzOiAoIlNpbmVhZCBPJ0Nvbm5vciIsICJOb3RoaW5nIENvbXBhcmVzIDIgVSIsICJSb2NrIiksCisxNDogKCJTdGV2aWUgQi4iLCAiQmVjYXVzZSBJIExvdmUgWW91IiwgIlJvY2siKSwKKzE1OiAoIlRheWxvciBEYXluZSIsICJMb3ZlIFdpbGwgTGVhZCBZb3UgQmFjayIsICJSb2NrIiksCisxNjogKCJUaGUgQmFuZ2xlcyIsICJFdGVybmFsIEZsYW1lIiwgIlJvY2siKSwKKzE3OiAoIldpbHNvbiBQaGlsbGlwcyIsICJSZWxlYXNlIE1lIiwgIlJvY2siKSwKKzE4OiAoIkJpbGx5IEpvZWwiLCAiQmxvbmRlIE92ZXIgQmx1ZSIsICJSb2NrIiksCisxOTogKCJCaWxseSBKb2VsIiwgIkZhbW91cyBMYXN0IFdvcmRzIiwgIlJvY2siKSwKKzIwOiAoIkJpbGx5IEpvZWwiLCAiTHVsbGFieWUgKEdvb2RuaWdodCwgTXkgQW5nZWwpIiwgIlJvY2siKSwKKzIxOiAoIkJpbGx5IEpvZWwiLCAiVGhlIFJpdmVyIE9mIERyZWFtcyIsICJSb2NrIiksCisyMjogKCJCaWxseSBKb2VsIiwgIlR3byBUaG91c2FuZCBZZWFycyIsICJSb2NrIiksCisyMzogKCJKYW5ldCBKYWNrc29uIiwgIkFscmlnaHQiLCAiUm9jayIpLAorMjQ6ICgiSmFuZXQgSmFja3NvbiIsICJCbGFjayBDYXQiLCAiUm9jayIpLAorMjU6ICgiSmFuZXQgSmFja3NvbiIsICJDb21lIEJhY2sgVG8gTWUiLCAiUm9jayIpLAorMjY6ICgiSmFuZXQgSmFja3NvbiIsICJFc2NhcGFkZSIsICJSb2NrIiksCisyNzogKCJKYW5ldCBKYWNrc29uIiwgIkxvdmUgV2lsbCBOZXZlciBEbyAoV2l0aG91dCBZb3UpIiwgIlJvY2siKSwKKzI4OiAoIkphbmV0IEphY2tzb24iLCAiTWlzcyBZb3UgTXVjaCIsICJSb2NrIiksCisyOTogKCJKYW5ldCBKYWNrc29uIiwgIlJoeXRobSBOYXRpb24iLCAiUm9jayIpLAorMzA6ICgiSmFuZXQgSmFja3NvbiIsICJTdGF0ZSBPZiBUaGUgV29ybGQiLCAiUm9jayIpLAorMzE6ICgiSmFuZXQgSmFja3NvbiIsICJUaGUgS25vd2xlZGdlIiwgIlJvY2siKSwKKzMyOiAoIlNweXJvIEd5cmEiLCAiRW5kIG9mIFJvbWFudGljaXNtIiwgIkphenoiKSwKKzMzOiAoIlNweXJvIEd5cmEiLCAiSGVsaW9wb2xpcyIsICJKYXp6IiksCiszNDogKCJTcHlybyBHeXJhIiwgIkp1YmlsZWUiLCAiSmF6eiIpLAorMzU6ICgiU3B5cm8gR3lyYSIsICJMaXR0bGUgTGluZGEiLCAiSmF6eiIpLAorMzY6ICgiU3B5cm8gR3lyYSIsICJNb3JuaW5nIERhbmNlIiwgIkphenoiKSwKKzM3OiAoIlNweXJvIEd5cmEiLCAiU29uZyBmb3IgTG9ycmFpbmUiLCAiSmF6eiIpLAorMzg6ICgiWWVzIiwgIk93bmVyIE9mIEEgTG9uZWx5IEhlYXJ0IiwgIlJvY2siKSwKKzM5OiAoIlllcyIsICJSaHl0aG0gT2YgTG92ZSIsICJSb2NrIiksCis0MDogKCJDdXNjbyIsICJEcmVhbSBDYXRjaGVyIiwgIk5ldyBBZ2UiKSwKKzQxOiAoIkN1c2NvIiwgIkdlcm9uaW1vcyBMYXVnaHRlciIsICJOZXcgQWdlIiksCis0MjogKCJDdXNjbyIsICJHaG9zdCBEYW5jZSIsICJOZXcgQWdlIiksCis0MzogKCJCbHVlIE1hbiBHcm91cCIsICJEcnVtYm9uZSIsICJOZXcgQWdlIiksCis0NDogKCJCbHVlIE1hbiBHcm91cCIsICJFbmRsZXNzIENvbHVtbiIsICJOZXcgQWdlIiksCis0NTogKCJCbHVlIE1hbiBHcm91cCIsICJLbGVpbiBNYW5kZWxicm90IiwgIk5ldyBBZ2UiKSwKKzQ2OiAoIktlbm55IEciLCAiU2lsaG91ZXR0ZSIsICJKYXp6IiksCis0NzogKCJTYWRlIiwgIlNtb290aCBPcGVyYXRvciIsICJKYXp6IiksCis0ODogKCJEYXZpZCBBcmtlbnN0b25lIiwgIlBhcGlsbG9uIChPbiBUaGUgV2luZ3MgT2YgVGhlIEJ1dHRlcmZseSkiLAorICAgICAiTmV3IEFnZSIpLAorNDk6ICgiRGF2aWQgQXJrZW5zdG9uZSIsICJTdGVwcGluZyBTdGFycyIsICJOZXcgQWdlIiksCis1MDogKCJEYXZpZCBBcmtlbnN0b25lIiwgIkNhcm5hdGlvbiBMaWx5IExpbHkgUm9zZSIsICJOZXcgQWdlIiksCis1MTogKCJEYXZpZCBMYW56IiwgIkJlaGluZCBUaGUgV2F0ZXJmYWxsIiwgIk5ldyBBZ2UiKSwKKzUyOiAoIkRhdmlkIExhbnoiLCAiQ3Jpc3RvZm9yaSdzIERyZWFtIiwgIk5ldyBBZ2UiKSwKKzUzOiAoIkRhdmlkIExhbnoiLCAiSGVhcnRzb3VuZHMiLCAiTmV3IEFnZSIpLAorNTQ6ICgiRGF2aWQgTGFueiIsICJMZWF2ZXMgb24gdGhlIFNlaW5lIiwgIk5ldyBBZ2UiKSwKKzk5OiAoInVua25vd24gYXJ0aXN0IiwgIlVubmFtZWQgc29uZyIsICJVbmtub3duIiksCit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEFzc29jaWF0ZUVycm9yVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgJy5kYicKKyAgICAgICAgc2VsZi5ob21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKyAgICAgICAgc2VsZi5lbnYgPSBkYi5EQkVudigpCisgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmVudi5jbG9zZSgpCisgICAgICAgIHNlbGYuZW52ID0gTm9uZQorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKworICAgIGRlZiB0ZXN0MDBfYXNzb2NpYXRlREJFcnJvcihzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAwX2Fzc29jaWF0ZURCRXJyb3IuLi4iICUgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBkdXBEQiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBkdXBEQi5zZXRfZmxhZ3MoZGIuREJfRFVQKQorICAgICAgICBkdXBEQi5vcGVuKHNlbGYuZmlsZW5hbWUsICJwcmltYXJ5IiwgZGIuREJfQlRSRUUsIGRiLkRCX0NSRUFURSkKKworICAgICAgICBzZWNEQiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBzZWNEQi5vcGVuKHNlbGYuZmlsZW5hbWUsICJzZWNvbmRhcnkiLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFKQorCisgICAgICAgICMgZHVwREIgaGFzIGJlZW4gY29uZmlndXJlZCB0byBhbGxvdyBkdXBsaWNhdGVzLCBpdCBjYW4ndAorICAgICAgICAjIGFzc29jaWF0ZSB3aXRoIGEgc2Vjb25kYXJ5LiAgQmVya2VsZXkgREIgd2lsbCByZXR1cm4gYW4gZXJyb3IuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlZiBmKGEsYik6IHJldHVybiBhK2IKKyAgICAgICAgICAgIGR1cERCLmFzc29jaWF0ZShzZWNEQiwgZikKKyAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3I6CisgICAgICAgICAgICAjIGdvb2QKKyAgICAgICAgICAgIHNlY0RCLmNsb3NlKCkKKyAgICAgICAgICAgIGR1cERCLmNsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlY0RCLmNsb3NlKCkKKyAgICAgICAgICAgIGR1cERCLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiREJFcnJvciBleGNlcHRpb24gd2FzIGV4cGVjdGVkIikKKworCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworY2xhc3MgQXNzb2NpYXRlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGtleXR5cGUgPSAnJworICAgIGVudkZsYWdzID0gMAorICAgIGRiRmxhZ3MgPSAwCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICcuZGInCisgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisgICAgICAgIHNlbGYuZW52ID0gZGIuREJFbnYoKQorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9MT0NLIHwgZGIuREJfVEhSRUFEIHwgc2VsZi5lbnZGbGFncykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZURCKCkKKyAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorICAgICAgICBzZWxmLmVudiA9IE5vbmUKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCisKKyAgICBkZWYgYWRkRGF0YVRvREIoc2VsZiwgZCwgdHhuPU5vbmUpOgorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBtdXNpY2RhdGEuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHR5cGUoc2VsZi5rZXl0eXBlKSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgICAgICBrZXkgPSAiJTAyZCIgJSBrZXkKKyAgICAgICAgICAgIGQucHV0KGtleSwgJ3wnLmpvaW4odmFsdWUpLCB0eG49dHhuKQorCisgICAgZGVmIGNyZWF0ZURCKHNlbGYsIHR4bj1Ob25lKToKKyAgICAgICAgc2VsZi5jdXIgPSBOb25lCisgICAgICAgIHNlbGYuc2VjREIgPSBOb25lCisgICAgICAgIHNlbGYucHJpbWFyeSA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBzZWxmLnByaW1hcnkuc2V0X2dldF9yZXR1cm5zX25vbmUoMikKKyAgICAgICAgc2VsZi5wcmltYXJ5Lm9wZW4oc2VsZi5maWxlbmFtZSwgInByaW1hcnkiLCBzZWxmLmRidHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQgfCBzZWxmLmRiRmxhZ3MsIHR4bj10eG4pCisKKyAgICBkZWYgY2xvc2VEQihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jdXI6CisgICAgICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmN1ciA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5zZWNEQjoKKyAgICAgICAgICAgIHNlbGYuc2VjREIuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5zZWNEQiA9IE5vbmUKKyAgICAgICAgc2VsZi5wcmltYXJ5LmNsb3NlKCkKKyAgICAgICAgc2VsZi5wcmltYXJ5ID0gTm9uZQorCisgICAgZGVmIGdldERCKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wcmltYXJ5CisKKworICAgIGRlZiBfYXNzb2NpYXRlV2l0aERCKHNlbGYsIGdldEdlbnJlKToKKyAgICAgICAgc2VsZi5jcmVhdGVEQigpCisKKyAgICAgICAgc2VsZi5zZWNEQiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBzZWxmLnNlY0RCLnNldF9mbGFncyhkYi5EQl9EVVApCisgICAgICAgIHNlbGYuc2VjREIuc2V0X2dldF9yZXR1cm5zX25vbmUoMikKKyAgICAgICAgc2VsZi5zZWNEQi5vcGVuKHNlbGYuZmlsZW5hbWUsICJzZWNvbmRhcnkiLCBkYi5EQl9CVFJFRSwKKyAgICAgICAgICAgICAgICAgICBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQgfCBzZWxmLmRiRmxhZ3MpCisgICAgICAgIHNlbGYuZ2V0REIoKS5hc3NvY2lhdGUoc2VsZi5zZWNEQiwgZ2V0R2VucmUpCisKKyAgICAgICAgc2VsZi5hZGREYXRhVG9EQihzZWxmLmdldERCKCkpCisKKyAgICAgICAgc2VsZi5maW5pc2hfdGVzdChzZWxmLnNlY0RCKQorCisgICAgZGVmIHRlc3QwMV9hc3NvY2lhdGVXaXRoREIoc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwMV9hc3NvY2lhdGVXaXRoREIuLi4iICUgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICByZXR1cm4gc2VsZi5fYXNzb2NpYXRlV2l0aERCKHNlbGYuZ2V0R2VucmUpCisKKyAgICBkZWYgX2Fzc29jaWF0ZUFmdGVyREIoc2VsZiwgZ2V0R2VucmUpIDoKKyAgICAgICAgc2VsZi5jcmVhdGVEQigpCisgICAgICAgIHNlbGYuYWRkRGF0YVRvREIoc2VsZi5nZXREQigpKQorCisgICAgICAgIHNlbGYuc2VjREIgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgc2VsZi5zZWNEQi5zZXRfZmxhZ3MoZGIuREJfRFVQKQorICAgICAgICBzZWxmLnNlY0RCLm9wZW4oc2VsZi5maWxlbmFtZSwgInNlY29uZGFyeSIsIGRiLkRCX0JUUkVFLAorICAgICAgICAgICAgICAgICAgIGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCB8IHNlbGYuZGJGbGFncykKKworICAgICAgICAjIGFkZGluZyB0aGUgREJfQ1JFQVRFIGZsYWcgd2lsbCBjYXVzZSBpdCB0byBpbmRleCBleGlzdGluZyByZWNvcmRzCisgICAgICAgIHNlbGYuZ2V0REIoKS5hc3NvY2lhdGUoc2VsZi5zZWNEQiwgZ2V0R2VucmUsIGRiLkRCX0NSRUFURSkKKworICAgICAgICBzZWxmLmZpbmlzaF90ZXN0KHNlbGYuc2VjREIpCisKKyAgICBkZWYgdGVzdDAyX2Fzc29jaWF0ZUFmdGVyREIoc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwMl9hc3NvY2lhdGVBZnRlckRCLi4uIiAlIFwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Fzc29jaWF0ZUFmdGVyREIoc2VsZi5nZXRHZW5yZSkKKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNik6CisgICAgICAgIGRlZiB0ZXN0MDNfYXNzb2NpYXRlV2l0aERCKHNlbGYpOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDNfYXNzb2NpYXRlV2l0aERCLi4uIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYXNzb2NpYXRlV2l0aERCKHNlbGYuZ2V0R2VucmVMaXN0KQorCisgICAgICAgIGRlZiB0ZXN0MDRfYXNzb2NpYXRlQWZ0ZXJEQihzZWxmKToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDA0X2Fzc29jaWF0ZUFmdGVyREIuLi4iICUgXAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9hc3NvY2lhdGVBZnRlckRCKHNlbGYuZ2V0R2VucmVMaXN0KQorCisKKyAgICBkZWYgZmluaXNoX3Rlc3Qoc2VsZiwgc2VjREIsIHR4bj1Ob25lKToKKyAgICAgICAgIyAnQmx1ZXMnIHNob3VsZCBub3QgYmUgaW4gdGhlIHNlY29uZGFyeSBkYXRhYmFzZQorICAgICAgICB2YWxzID0gc2VjREIucGdldCgnQmx1ZXMnLCB0eG49dHhuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHMsIE5vbmUsIHZhbHMpCisKKyAgICAgICAgdmFscyA9IHNlY0RCLnBnZXQoJ1Vua25vd24nLCB0eG49dHhuKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsc1swXSA9PSA5OSBvciB2YWxzWzBdID09ICc5OScsIHZhbHMpCisgICAgICAgIHZhbHNbMV0uaW5kZXgoJ1Vua25vd24nKQorICAgICAgICB2YWxzWzFdLmluZGV4KCdVbm5hbWVkJykKKyAgICAgICAgdmFsc1sxXS5pbmRleCgndW5rbm93bicpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJQcmltYXJ5IGtleSB0cmF2ZXJzYWw6IgorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuZ2V0REIoKS5jdXJzb3IodHhuKQorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgcmVjID0gc2VsZi5jdXIuZmlyc3QoKQorICAgICAgICB3aGlsZSByZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiB0eXBlKHNlbGYua2V5dHlwZSkgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludChyZWNbMF0pKSAgIyBmb3IgcHJpbWFyeSBkYiwga2V5IGlzIGEgbnVtYmVyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWNbMF0gYW5kIHR5cGUocmVjWzBdKSA9PSB0eXBlKDApKQorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjCisgICAgICAgICAgICByZWMgPSBnZXRhdHRyKHNlbGYuY3VyLCAibmV4dCIpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgbGVuKG11c2ljZGF0YSkpICAjIGFsbCBpdGVtcyBhY2NvdW50ZWQgZm9yCisKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIlNlY29uZGFyeSBrZXkgdHJhdmVyc2FsOiIKKyAgICAgICAgc2VsZi5jdXIgPSBzZWNEQi5jdXJzb3IodHhuKQorICAgICAgICBjb3VudCA9IDAKKworICAgICAgICAjIHRlc3QgY3Vyc29yIHBnZXQKKyAgICAgICAgdmFscyA9IHNlbGYuY3VyLnBnZXQoJ1Vua25vd24nLCBmbGFncz1kYi5EQl9MQVNUKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsc1sxXSA9PSA5OSBvciB2YWxzWzFdID09ICc5OScsIHZhbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsc1swXSwgJ1Vua25vd24nKQorICAgICAgICB2YWxzWzJdLmluZGV4KCdVbmtub3duJykKKyAgICAgICAgdmFsc1syXS5pbmRleCgnVW5uYW1lZCcpCisgICAgICAgIHZhbHNbMl0uaW5kZXgoJ3Vua25vd24nKQorCisgICAgICAgIHZhbHMgPSBzZWxmLmN1ci5wZ2V0KCdVbmtub3duJywgZGF0YT0nd3JvbmcgdmFsdWUnLCBmbGFncz1kYi5EQl9HRVRfQk9USCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxzLCBOb25lLCB2YWxzKQorCisgICAgICAgIHJlYyA9IHNlbGYuY3VyLmZpcnN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNbMF0sICJKYXp6IikKKyAgICAgICAgd2hpbGUgcmVjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjCisgICAgICAgICAgICByZWMgPSBnZXRhdHRyKHNlbGYuY3VyLCAibmV4dCIpKCkKKyAgICAgICAgIyBhbGwgaXRlbXMgYWNjb3VudGVkIGZvciBFWENFUFQgZm9yIDEgd2l0aCAiQmx1ZXMiIGdlbnJlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIGxlbihtdXNpY2RhdGEpLTEpCisKKyAgICAgICAgc2VsZi5jdXIgPSBOb25lCisKKyAgICBkZWYgZ2V0R2VucmUoc2VsZiwgcHJpS2V5LCBwcmlEYXRhKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHByaURhdGEpLCB0eXBlKCIiKSkKKyAgICAgICAgZ2VucmUgPSBwcmlEYXRhLnNwbGl0KCd8JylbMl0KKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ2dldEdlbnJlIGtleTogJXIgZGF0YTogJXInICUgKHByaUtleSwgcHJpRGF0YSkKKworICAgICAgICBpZiBnZW5yZSA9PSAnQmx1ZXMnOgorICAgICAgICAgICAgcmV0dXJuIGRiLkRCX0RPTk9USU5ERVgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBnZW5yZQorCisgICAgZGVmIGdldEdlbnJlTGlzdChzZWxmLCBwcmlLZXksIFByaURhdGEpIDoKKyAgICAgICAgdiA9IHNlbGYuZ2V0R2VucmUocHJpS2V5LCBQcmlEYXRhKQorICAgICAgICBpZiB0eXBlKHYpID09IHR5cGUoIiIpIDoKKyAgICAgICAgICAgIHYgPSBbdl0KKyAgICAgICAgcmV0dXJuIHYKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NsYXNzIEFzc29jaWF0ZUhhc2hUZXN0Q2FzZShBc3NvY2lhdGVUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorCitjbGFzcyBBc3NvY2lhdGVCVHJlZVRlc3RDYXNlKEFzc29jaWF0ZVRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorCitjbGFzcyBBc3NvY2lhdGVSZWNub1Rlc3RDYXNlKEFzc29jaWF0ZVRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9SRUNOTworICAgIGtleXR5cGUgPSAwCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEFzc29jaWF0ZUJUcmVlVHhuVGVzdENhc2UoQXNzb2NpYXRlQlRyZWVUZXN0Q2FzZSk6CisgICAgZW52RmxhZ3MgPSBkYi5EQl9JTklUX1RYTgorICAgIGRiRmxhZ3MgPSAwCisKKyAgICBkZWYgdHhuX2ZpbmlzaF90ZXN0KHNlbGYsIHNEQiwgdHhuKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5maW5pc2hfdGVzdChzREIsIHR4bj10eG4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBzZWxmLmN1cjoKKyAgICAgICAgICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5jdXIgPSBOb25lCisgICAgICAgICAgICBpZiB0eG46CisgICAgICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisKKyAgICBkZWYgdGVzdDEzX2Fzc29jaWF0ZV9pbl90cmFuc2FjdGlvbihzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDEzX2Fzc29jaWF0ZUF1dG9Db21taXQuLi4iICUgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNyZWF0ZURCKHR4bj10eG4pCisKKyAgICAgICAgICAgIHNlbGYuc2VjREIgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgICAgIHNlbGYuc2VjREIuc2V0X2ZsYWdzKGRiLkRCX0RVUCkKKyAgICAgICAgICAgIHNlbGYuc2VjREIuc2V0X2dldF9yZXR1cm5zX25vbmUoMikKKyAgICAgICAgICAgIHNlbGYuc2VjREIub3BlbihzZWxmLmZpbGVuYW1lLCAic2Vjb25kYXJ5IiwgZGIuREJfQlRSRUUsCisgICAgICAgICAgICAgICAgICAgICAgIGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCwgdHhuPXR4bikKKyAgICAgICAgICAgIHNlbGYuZ2V0REIoKS5hc3NvY2lhdGUoc2VsZi5zZWNEQiwgc2VsZi5nZXRHZW5yZSwgdHhuPXR4bikKKworICAgICAgICAgICAgc2VsZi5hZGREYXRhVG9EQihzZWxmLmdldERCKCksIHR4bj10eG4pCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHR4bi5hYm9ydCgpCisgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHNlbGYudHhuX2ZpbmlzaF90ZXN0KHNlbGYuc2VjREIsIHR4bj10eG4pCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgU2hlbHZlQXNzb2NpYXRlVGVzdENhc2UoQXNzb2NpYXRlVGVzdENhc2UpOgorCisgICAgZGVmIGNyZWF0ZURCKHNlbGYpOgorICAgICAgICBzZWxmLnByaW1hcnkgPSBkYnNoZWx2ZS5vcGVuKHNlbGYuZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGJuYW1lPSJwcmltYXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYmVudj1zZWxmLmVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxldHlwZT1zZWxmLmRidHlwZSkKKworICAgIGRlZiBhZGREYXRhVG9EQihzZWxmLCBkKToKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gbXVzaWNkYXRhLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB0eXBlKHNlbGYua2V5dHlwZSkgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICAgICAga2V5ID0gIiUwMmQiICUga2V5CisgICAgICAgICAgICBkLnB1dChrZXksIHZhbHVlKSAgICAjIHNhdmUgdGhlIHZhbHVlIGFzIGlzIHRoaXMgdGltZQorCisKKyAgICBkZWYgZ2V0R2VucmUoc2VsZiwgcHJpS2V5LCBwcmlEYXRhKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHByaURhdGEpLCB0eXBlKCgpKSkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdnZXRHZW5yZSBrZXk6ICVyIGRhdGE6ICVyJyAlIChwcmlLZXksIHByaURhdGEpCisgICAgICAgIGdlbnJlID0gcHJpRGF0YVsyXQorICAgICAgICBpZiBnZW5yZSA9PSAnQmx1ZXMnOgorICAgICAgICAgICAgcmV0dXJuIGRiLkRCX0RPTk9USU5ERVgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBnZW5yZQorCisKK2NsYXNzIFNoZWx2ZUFzc29jaWF0ZUhhc2hUZXN0Q2FzZShTaGVsdmVBc3NvY2lhdGVUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorCitjbGFzcyBTaGVsdmVBc3NvY2lhdGVCVHJlZVRlc3RDYXNlKFNoZWx2ZUFzc29jaWF0ZVRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorCitjbGFzcyBTaGVsdmVBc3NvY2lhdGVSZWNub1Rlc3RDYXNlKFNoZWx2ZUFzc29jaWF0ZVRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9SRUNOTworICAgIGtleXR5cGUgPSAwCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGhyZWFkZWRBc3NvY2lhdGVUZXN0Q2FzZShBc3NvY2lhdGVUZXN0Q2FzZSk6CisKKyAgICBkZWYgYWRkRGF0YVRvREIoc2VsZiwgZCk6CisgICAgICAgIHQxID0gVGhyZWFkKHRhcmdldCA9IHNlbGYud3JpdGVyMSwKKyAgICAgICAgICAgICAgICAgICAgYXJncyA9IChkLCApKQorICAgICAgICB0MiA9IFRocmVhZCh0YXJnZXQgPSBzZWxmLndyaXRlcjIsCisgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSAoZCwgKSkKKworICAgICAgICB0MS5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgdDIuc2V0RGFlbW9uKFRydWUpCisgICAgICAgIHQxLnN0YXJ0KCkKKyAgICAgICAgdDIuc3RhcnQoKQorICAgICAgICB0MS5qb2luKCkKKyAgICAgICAgdDIuam9pbigpCisKKyAgICBkZWYgd3JpdGVyMShzZWxmLCBkKToKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gbXVzaWNkYXRhLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB0eXBlKHNlbGYua2V5dHlwZSkgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICAgICAga2V5ID0gIiUwMmQiICUga2V5CisgICAgICAgICAgICBkLnB1dChrZXksICd8Jy5qb2luKHZhbHVlKSkKKworICAgIGRlZiB3cml0ZXIyKHNlbGYsIGQpOgorICAgICAgICBmb3IgeCBpbiByYW5nZSgxMDAsIDYwMCk6CisgICAgICAgICAgICBrZXkgPSAneiUyZCcgJSB4CisgICAgICAgICAgICB2YWx1ZSA9IFtrZXldICogNAorICAgICAgICAgICAgZC5wdXQoa2V5LCAnfCcuam9pbih2YWx1ZSkpCisKKworY2xhc3MgVGhyZWFkZWRBc3NvY2lhdGVIYXNoVGVzdENhc2UoU2hlbHZlQXNzb2NpYXRlVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKKworY2xhc3MgVGhyZWFkZWRBc3NvY2lhdGVCVHJlZVRlc3RDYXNlKFNoZWx2ZUFzc29jaWF0ZVRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorCitjbGFzcyBUaHJlYWRlZEFzc29jaWF0ZVJlY25vVGVzdENhc2UoU2hlbHZlQXNzb2NpYXRlVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX1JFQ05PCisgICAga2V5dHlwZSA9IDAKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEFzc29jaWF0ZUVycm9yVGVzdENhc2UpKQorCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQXNzb2NpYXRlSGFzaFRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShBc3NvY2lhdGVCVHJlZVRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShBc3NvY2lhdGVSZWNub1Rlc3RDYXNlKSkKKworICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEFzc29jaWF0ZUJUcmVlVHhuVGVzdENhc2UpKQorCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoU2hlbHZlQXNzb2NpYXRlSGFzaFRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShTaGVsdmVBc3NvY2lhdGVCVHJlZVRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShTaGVsdmVBc3NvY2lhdGVSZWNub1Rlc3RDYXNlKSkKKworICAgIGlmIGhhdmVfdGhyZWFkczoKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGhyZWFkZWRBc3NvY2lhdGVIYXNoVGVzdENhc2UpKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUaHJlYWRlZEFzc29jaWF0ZUJUcmVlVGVzdENhc2UpKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUaHJlYWRlZEFzc29jaWF0ZVJlY25vVGVzdENhc2UpKQorCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Fzc29jaWF0ZS5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9hc3NvY2lhdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZjE1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9hc3NvY2lhdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Fzc29jaWF0ZS5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9hc3NvY2lhdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZjE1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9hc3NvY2lhdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzU3YmU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYmFzaWNzLnB5CkBAIC0wLDAgKzEsMTE1OCBAQAorIiIiCitCYXNpYyBUZXN0Q2FzZXMgZm9yIEJUcmVlIGFuZCBoYXNoIERCcywgd2l0aCBhbmQgd2l0aG91dCBhIERCRW52LCB3aXRoCit2YXJpb3VzIERCIGZsYWdzLCBldGMuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgZXJybm8KK2ltcG9ydCBzdHJpbmcKK2Zyb20gcHByaW50IGltcG9ydCBwcHJpbnQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRpbWUKK2ltcG9ydCBzeXMKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIHRlc3Rfc3VwcG9ydCwgdmVyYm9zZSwgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBcCisgICAgICAgIGdldF9uZXdfZGF0YWJhc2VfcGF0aAorCitEQVNIID0gJy0nCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVmVyc2lvblRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdDAwX3ZlcnNpb24oc2VsZik6CisgICAgICAgIGluZm8gPSBkYi52ZXJzaW9uKCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAyMAorICAgICAgICAgICAgcHJpbnQgJ2JzZGRiLmRiLnZlcnNpb24oKTogJXMnICUgKGluZm8sICkKKyAgICAgICAgICAgIHByaW50IGRiLkRCX1ZFUlNJT05fU1RSSU5HCisgICAgICAgICAgICBwcmludCAnLT0nICogMjAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvLCAoZGIuREJfVkVSU0lPTl9NQUpPUiwgZGIuREJfVkVSU0lPTl9NSU5PUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRiLkRCX1ZFUlNJT05fUEFUQ0gpKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCYXNpY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkYnR5cGUgICAgICAgPSBkYi5EQl9VTktOT1dOICAjIG11c3QgYmUgc2V0IGluIGRlcml2ZWQgY2xhc3MKKyAgICBjYWNoZXNpemUgICAgPSAoMCwgMTAyNCoxMDI0LCAxKQorICAgIGRib3BlbmZsYWdzICA9IDAKKyAgICBkYnNldGZsYWdzICAgPSAwCisgICAgZGJtb2RlICAgICAgID0gMDY2MAorICAgIGRibmFtZSAgICAgICA9IE5vbmUKKyAgICB1c2VFbnYgICAgICAgPSAwCisgICAgZW52ZmxhZ3MgICAgID0gMAorICAgIGVudnNldGZsYWdzICA9IDAKKworICAgIF9udW1LZXlzICAgICAgPSAxMDAyICAgICMgUFJJVkFURS4gIE5PVEU6IG11c3QgYmUgYW4gZXZlbiB2YWx1ZQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnVzZUVudjoKKyAgICAgICAgICAgIHNlbGYuaG9tZURpcj1nZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZW52ID0gZGIuREJFbnYoKQorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9sZ19tYXgoMTAyNCoxMDI0KQorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF90eF9tYXgoMzApCisgICAgICAgICAgICAgICAgc2VsZi5fdCA9IGludCh0aW1lLnRpbWUoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfdHhfdGltZXN0YW1wKHNlbGYuX3QpCisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2ZsYWdzKHNlbGYuZW52c2V0ZmxhZ3MsIDEpCisgICAgICAgICAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIHNlbGYuZW52ZmxhZ3MgfCBkYi5EQl9DUkVBVEUpCisgICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZSA9ICJ0ZXN0IgorICAgICAgICAgICAgIyBZZXMsIGEgYmFyZSBleGNlcHQgaXMgaW50ZW5kZWQsIHNpbmNlIHdlJ3JlIHJlLXJhaXNpbmcgdGhlIGV4Yy4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lbnYgPSBOb25lCisgICAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gZ2V0X25ld19kYXRhYmFzZV9wYXRoKCkKKworICAgICAgICAjIGNyZWF0ZSBhbmQgb3BlbiB0aGUgREIKKyAgICAgICAgc2VsZi5kID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIGlmIG5vdCBzZWxmLnVzZUVudiA6CisgICAgICAgICAgICBzZWxmLmQuc2V0X2NhY2hlc2l6ZSgqc2VsZi5jYWNoZXNpemUpCisgICAgICAgICAgICBjYWNoZXNpemUgPSBzZWxmLmQuZ2V0X2NhY2hlc2l6ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhY2hlc2l6ZVswXSwgc2VsZi5jYWNoZXNpemVbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhY2hlc2l6ZVsyXSwgc2VsZi5jYWNoZXNpemVbMl0pCisgICAgICAgICAgICAjIEJlcmtlbGV5IERCIGV4cGFuZHMgdGhlIGNhY2hlIDI1JSBhY2NvdW50aW5nIG92ZXJoZWFkLAorICAgICAgICAgICAgIyBpZiB0aGUgY2FjaGUgaXMgc21hbGwuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEyNSwgaW50KDEwMC4wKmNhY2hlc2l6ZVsxXS9zZWxmLmNhY2hlc2l6ZVsxXSkpCisgICAgICAgIHNlbGYuZC5zZXRfZmxhZ3Moc2VsZi5kYnNldGZsYWdzKQorICAgICAgICBpZiBzZWxmLmRibmFtZToKKyAgICAgICAgICAgIHNlbGYuZC5vcGVuKHNlbGYuZmlsZW5hbWUsIHNlbGYuZGJuYW1lLCBzZWxmLmRidHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGJvcGVuZmxhZ3N8ZGIuREJfQ1JFQVRFLCBzZWxmLmRibW9kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZC5vcGVuKHNlbGYuZmlsZW5hbWUsICAgIyB0cnkgb3V0IGtleXdvcmQgYXJncworICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IHNlbGYuZGJtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgZGJ0eXBlID0gc2VsZi5kYnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHNlbGYuZGJvcGVuZmxhZ3N8ZGIuREJfQ1JFQVRFKQorCisgICAgICAgIGlmIG5vdCBzZWxmLnVzZUVudjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmQuc2V0X2NhY2hlc2l6ZSwgKnNlbGYuY2FjaGVzaXplKQorCisgICAgICAgIHNlbGYucG9wdWxhdGVEQigpCisKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5kLmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5lbnYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmVudi5jbG9zZSgpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLmZpbGVuYW1lKQorCisKKworICAgIGRlZiBwb3B1bGF0ZURCKHNlbGYsIF90eG49Tm9uZSk6CisgICAgICAgIGQgPSBzZWxmLmQKKworICAgICAgICBmb3IgeCBpbiByYW5nZShzZWxmLl9udW1LZXlzLy8yKToKKyAgICAgICAgICAgIGtleSA9ICclMDRkJyAlIChzZWxmLl9udW1LZXlzIC0geCkgICMgaW5zZXJ0IGtleXMgaW4gcmV2ZXJzZSBvcmRlcgorICAgICAgICAgICAgZGF0YSA9IHNlbGYubWFrZURhdGEoa2V5KQorICAgICAgICAgICAgZC5wdXQoa2V5LCBkYXRhLCBfdHhuKQorCisgICAgICAgIGQucHV0KCdlbXB0eSB2YWx1ZScsICcnLCBfdHhuKQorCisgICAgICAgIGZvciB4IGluIHJhbmdlKHNlbGYuX251bUtleXMvLzItMSk6CisgICAgICAgICAgICBrZXkgPSAnJTA0ZCcgJSB4ICAjIGFuZCBub3cgc29tZSBpbiBmb3J3YXJkIG9yZGVyCisgICAgICAgICAgICBkYXRhID0gc2VsZi5tYWtlRGF0YShrZXkpCisgICAgICAgICAgICBkLnB1dChrZXksIGRhdGEsIF90eG4pCisKKyAgICAgICAgaWYgX3R4bjoKKyAgICAgICAgICAgIF90eG4uY29tbWl0KCkKKworICAgICAgICBudW0gPSBsZW4oZCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJjcmVhdGVkICVkIHJlY29yZHMiICUgbnVtCisKKworICAgIGRlZiBtYWtlRGF0YShzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gREFTSC5qb2luKFtrZXldICogNSkKKworCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHRlc3QwMV9HZXRzQW5kUHV0cyhzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuZAorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwMV9HZXRzQW5kUHV0cy4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGZvciBrZXkgaW4gWycwMDAxJywgJzAxMDAnLCAnMDQwMCcsICcwNzAwJywgJzA5OTknXToKKyAgICAgICAgICAgIGRhdGEgPSBkLmdldChrZXkpCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IGRhdGEKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCcwMzIxJyksICcwMzIxLTAzMjEtMDMyMS0wMzIxLTAzMjEnKQorCisgICAgICAgICMgQnkgZGVmYXVsdCBub24tZXhpc3RlbnQga2V5cyByZXR1cm4gTm9uZS4uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdhYmNkJyksIE5vbmUpCisKKyAgICAgICAgIyAuLi5idXQgdGhleSByYWlzZSBleGNlcHRpb25zIGluIG90aGVyIHNpdHVhdGlvbnMuICBDYWxsCisgICAgICAgICMgc2V0X2dldF9yZXR1cm5zX25vbmUoKSB0byBjaGFuZ2UgaXQuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGQuZGVsZXRlKCdhYmNkJykKKyAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvciwgdmFsOgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxbMF0sIGRiLkRCX05PVEZPVU5EKQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwuYXJnc1swXSwgZGIuREJfTk9URk9VTkQpCisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCB2YWwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIikKKworCisgICAgICAgIGQucHV0KCdhYmNkJywgJ2EgbmV3IHJlY29yZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2FiY2QnKSwgJ2EgbmV3IHJlY29yZCcpCisKKyAgICAgICAgZC5wdXQoJ2FiY2QnLCAnc2FtZSBrZXknKQorICAgICAgICBpZiBzZWxmLmRic2V0ZmxhZ3MgJiBkYi5EQl9EVVA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdhYmNkJyksICdhIG5ldyByZWNvcmQnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYWJjZCcpLCAnc2FtZSBrZXknKQorCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZC5wdXQoJ2FiY2QnLCAndGhpcyBzaG91bGQgZmFpbCcsIGZsYWdzPWRiLkRCX05PT1ZFUldSSVRFKQorICAgICAgICBleGNlcHQgZGIuREJLZXlFeGlzdEVycm9yLCB2YWw6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgZGIuREJfS0VZRVhJU1QpCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbC5hcmdzWzBdLCBkYi5EQl9LRVlFWElTVCkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50IHZhbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24iKQorCisgICAgICAgIGlmIHNlbGYuZGJzZXRmbGFncyAmIGRiLkRCX0RVUDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2FiY2QnKSwgJ2EgbmV3IHJlY29yZCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdhYmNkJyksICdzYW1lIGtleScpCisKKworICAgICAgICBkLnN5bmMoKQorICAgICAgICBkLmNsb3NlKCkKKyAgICAgICAgZGVsIGQKKworICAgICAgICBzZWxmLmQgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgaWYgc2VsZi5kYm5hbWU6CisgICAgICAgICAgICBzZWxmLmQub3BlbihzZWxmLmZpbGVuYW1lLCBzZWxmLmRibmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZC5vcGVuKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGQgPSBzZWxmLmQKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCcwMzIxJyksICcwMzIxLTAzMjEtMDMyMS0wMzIxLTAzMjEnKQorICAgICAgICBpZiBzZWxmLmRic2V0ZmxhZ3MgJiBkYi5EQl9EVVA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdhYmNkJyksICdhIG5ldyByZWNvcmQnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYWJjZCcpLCAnc2FtZSBrZXknKQorCisgICAgICAgIHJlYyA9IGQuZ2V0X2JvdGgoJzA1NTUnLCAnMDU1NS0wNTU1LTA1NTUtMDU1NS0wNTU1JykKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50IHJlYworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRfYm90aCgnMDU1NScsICdiYWQgZGF0YScpLCBOb25lKQorCisgICAgICAgICMgdGVzdCBkZWZhdWx0IHZhbHVlCisgICAgICAgIGRhdGEgPSBkLmdldCgnYmFkIGtleScsICdiYWQgZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJ2JhZCBkYXRhJykKKworICAgICAgICAjIGFueSBvYmplY3QgY2FuIHBhc3MgdGhyb3VnaAorICAgICAgICBkYXRhID0gZC5nZXQoJ2JhZCBrZXknLCBzZWxmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNlbGYpCisKKyAgICAgICAgcyA9IGQuc3RhdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgdHlwZSh7fSkpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnZC5zdGF0KCkgcmV0dXJuZWQgdGhpcyBkaWN0aW9uYXJ5OicKKyAgICAgICAgICAgIHBwcmludChzKQorCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHRlc3QwMl9EaWN0aW9uYXJ5TWV0aG9kcyhzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuZAorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwMl9EaWN0aW9uYXJ5TWV0aG9kcy4uLiIgJSBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGZvciBrZXkgaW4gWycwMDAyJywgJzAxMDEnLCAnMDQwMScsICcwNzAxJywgJzA5OTgnXToKKyAgICAgICAgICAgIGRhdGEgPSBkW2tleV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgc2VsZi5tYWtlRGF0YShrZXkpKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCBkYXRhCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIHNlbGYuX251bUtleXMpCisgICAgICAgIGtleXMgPSBkLmtleXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihrZXlzKSwgc2VsZi5fbnVtS2V5cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGtleXMpLCB0eXBlKFtdKSkKKworICAgICAgICBkWyduZXcgcmVjb3JkJ10gPSAnYSBuZXcgcmVjb3JkJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgc2VsZi5fbnVtS2V5cysxKQorICAgICAgICBrZXlzID0gZC5rZXlzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oa2V5cyksIHNlbGYuX251bUtleXMrMSkKKworICAgICAgICBkWyduZXcgcmVjb3JkJ10gPSAnYSByZXBsYWNlbWVudCByZWNvcmQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCBzZWxmLl9udW1LZXlzKzEpCisgICAgICAgIGtleXMgPSBkLmtleXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihrZXlzKSwgc2VsZi5fbnVtS2V5cysxKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAidGhlIGZpcnN0IDEwIGtleXMgYXJlOiIKKyAgICAgICAgICAgIHBwcmludChrZXlzWzoxMF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWyduZXcgcmVjb3JkJ10sICdhIHJlcGxhY2VtZW50IHJlY29yZCcpCisKKyMgV2UgY2hlY2sgYWxzbyB0aGUgcG9zaXRpb25hbCBwYXJhbWV0ZXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmhhc19rZXkoJzAwMDEnLCBOb25lKSwgMSkKKyMgV2UgY2hlY2sgYWxzbyB0aGUga2V5d29yZCBwYXJhbWV0ZXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmhhc19rZXkoJ3NwYW0nLCB0eG49Tm9uZSksIDApCisKKyAgICAgICAgaXRlbXMgPSBkLml0ZW1zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXRlbXMpLCBzZWxmLl9udW1LZXlzKzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShpdGVtcyksIHR5cGUoW10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoaXRlbXNbMF0pLCB0eXBlKCgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXRlbXNbMF0pLCAyKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAidGhlIGZpcnN0IDEwIGl0ZW1zIGFyZToiCisgICAgICAgICAgICBwcHJpbnQoaXRlbXNbOjEwXSkKKworICAgICAgICB2YWx1ZXMgPSBkLnZhbHVlcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlcyksIHNlbGYuX251bUtleXMrMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbHVlcyksIHR5cGUoW10pKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAidGhlIGZpcnN0IDEwIHZhbHVlcyBhcmU6IgorICAgICAgICAgICAgcHByaW50KHZhbHVlc1s6MTBdKQorCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHRlc3QwMmJfU2VxdWVuY2VNZXRob2RzKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5kCisKKyAgICAgICAgZm9yIGtleSBpbiBbJzAwMDInLCAnMDEwMScsICcwNDAxJywgJzA3MDEnLCAnMDk5OCddOgorICAgICAgICAgICAgZGF0YSA9IGRba2V5XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzZWxmLm1ha2VEYXRhKGtleSkpCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IGRhdGEKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihkLCAiX19jb250YWluc19fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiMDQwMSIgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgiMTIzNCIgaW4gZCkKKworCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB0ZXN0MDNfU2ltcGxlQ3Vyc29yU3R1ZmYoc2VsZiwgZ2V0X3JhaXNlc19lcnJvcj0wLCBzZXRfcmFpc2VzX2Vycm9yPTApOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDNfU2ltcGxlQ3Vyc29yU3R1ZmYgKGdldF9lcnJvciAlcywgc2V0X2Vycm9yICVzKS4uLiIgJSBcCisgICAgICAgICAgICAgICAgICAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGdldF9yYWlzZXNfZXJyb3IsIHNldF9yYWlzZXNfZXJyb3IpCisKKyAgICAgICAgaWYgc2VsZi5lbnYgYW5kIHNlbGYuZGJvcGVuZmxhZ3MgJiBkYi5EQl9BVVRPX0NPTU1JVDoKKyAgICAgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0eG4gPSBOb25lCisgICAgICAgIGMgPSBzZWxmLmQuY3Vyc29yKHR4bj10eG4pCisKKyAgICAgICAgcmVjID0gYy5maXJzdCgpCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICB3aGlsZSByZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgaWYgdmVyYm9zZSBhbmQgY291bnQgJSAxMDAgPT0gMDoKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWMgPSBjLm5leHQoKQorICAgICAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvciwgdmFsOgorICAgICAgICAgICAgICAgIGlmIGdldF9yYWlzZXNfZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxbMF0sIGRiLkRCX05PVEZPVU5EKQorICAgICAgICAgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLmFyZ3NbMF0sIGRiLkRCX05PVEZPVU5EKQorICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCB2YWwKKyAgICAgICAgICAgICAgICAgICAgcmVjID0gTm9uZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidW5leHBlY3RlZCBEQk5vdEZvdW5kRXJyb3IiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmdldF9jdXJyZW50X3NpemUoKSwgbGVuKGMuY3VycmVudCgpWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgIiVzICE9IGxlbiglcikiICUgKGMuZ2V0X2N1cnJlbnRfc2l6ZSgpLCBjLmN1cnJlbnQoKVsxXSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgc2VsZi5fbnVtS2V5cykKKworCisgICAgICAgIHJlYyA9IGMubGFzdCgpCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICB3aGlsZSByZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgaWYgdmVyYm9zZSBhbmQgY291bnQgJSAxMDAgPT0gMDoKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWMgPSBjLnByZXYoKQorICAgICAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvciwgdmFsOgorICAgICAgICAgICAgICAgIGlmIGdldF9yYWlzZXNfZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxbMF0sIGRiLkRCX05PVEZPVU5EKQorICAgICAgICAgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLmFyZ3NbMF0sIGRiLkRCX05PVEZPVU5EKQorICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCB2YWwKKyAgICAgICAgICAgICAgICAgICAgcmVjID0gTm9uZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidW5leHBlY3RlZCBEQk5vdEZvdW5kRXJyb3IiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIHNlbGYuX251bUtleXMpCisKKyAgICAgICAgcmVjID0gYy5zZXQoJzA1MDUnKQorICAgICAgICByZWMyID0gYy5jdXJyZW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWMsIHJlYzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjWzBdLCAnMDUwNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjWzFdLCBzZWxmLm1ha2VEYXRhKCcwNTA1JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5nZXRfY3VycmVudF9zaXplKCksIGxlbihyZWNbMV0pKQorCisgICAgICAgICMgbWFrZSBzdXJlIHdlIGdldCBlbXB0eSB2YWx1ZXMgcHJvcGVybHkKKyAgICAgICAgcmVjID0gYy5zZXQoJ2VtcHR5IHZhbHVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNbMV0sICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZ2V0X2N1cnJlbnRfc2l6ZSgpLCAwKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG4gPSBjLnNldCgnYmFkIGtleScpCisgICAgICAgIGV4Y2VwdCBkYi5EQk5vdEZvdW5kRXJyb3IsIHZhbDoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsWzBdLCBkYi5EQl9OT1RGT1VORCkKKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLmFyZ3NbMF0sIGRiLkRCX05PVEZPVU5EKQorICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgdmFsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZXRfcmFpc2VzX2Vycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgICAgICAgICAgIGlmIG4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBOb25lOiAlciIgJSAobiwpKQorCisgICAgICAgIHJlYyA9IGMuZ2V0X2JvdGgoJzA0MDQnLCBzZWxmLm1ha2VEYXRhKCcwNDA0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjLCAoJzA0MDQnLCBzZWxmLm1ha2VEYXRhKCcwNDA0JykpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG4gPSBjLmdldF9ib3RoKCcwNDA0JywgJ2JhZCBkYXRhJykKKyAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvciwgdmFsOgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxbMF0sIGRiLkRCX05PVEZPVU5EKQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwuYXJnc1swXSwgZGIuREJfTk9URk9VTkQpCisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCB2YWwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGdldF9yYWlzZXNfZXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24iKQorICAgICAgICAgICAgaWYgbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIE5vbmU6ICVyIiAlIChuLCkpCisKKyAgICAgICAgaWYgc2VsZi5kLmdldF90eXBlKCkgPT0gZGIuREJfQlRSRUU6CisgICAgICAgICAgICByZWMgPSBjLnNldF9yYW5nZSgnMDExJykKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgInNlYXJjaGVkIGZvciAnMDExJywgZm91bmQ6ICIsIHJlYworCisgICAgICAgICAgICByZWMgPSBjLnNldF9yYW5nZSgnMDExJyxkbGVuPTAsZG9mZj0wKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAic2VhcmNoZWQgKHBhcnRpYWwpIGZvciAnMDExJywgZm91bmQ6ICIsIHJlYworICAgICAgICAgICAgaWYgcmVjWzFdICE9ICcnOiBzZWxmLmZhaWwoJ2V4cGVjdGVkIGVtcHR5IGRhdGEgcG9ydGlvbicpCisKKyAgICAgICAgICAgIGV2ID0gYy5zZXRfcmFuZ2UoJ2VtcHR5IHZhbHVlJykKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgInNlYXJjaCBmb3IgJ2VtcHR5IHZhbHVlJyByZXR1cm5lZCIsIGV2CisgICAgICAgICAgICBpZiBldlsxXSAhPSAnJzogc2VsZi5mYWlsKCdlbXB0eSB2YWx1ZSBsb29rdXAgZmFpbGVkJykKKworICAgICAgICBjLnNldCgnMDQ5OScpCisgICAgICAgIGMuZGVsZXRlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVjID0gYy5jdXJyZW50KCkKKyAgICAgICAgZXhjZXB0IGRiLkRCS2V5RW1wdHlFcnJvciwgdmFsOgorICAgICAgICAgICAgaWYgZ2V0X3JhaXNlc19lcnJvcjoKKyAgICAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxbMF0sIGRiLkRCX0tFWUVNUFRZKQorICAgICAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbC5hcmdzWzBdLCBkYi5EQl9LRVlFTVBUWSkKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCB2YWwKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmV4cGVjdGVkIERCS2V5RW1wdHlFcnJvciIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBnZXRfcmFpc2VzX2Vycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnREJLZXlFbXB0eUVycm9yIGV4Y2VwdGlvbiBleHBlY3RlZCcpCisKKyAgICAgICAgYy5uZXh0KCkKKyAgICAgICAgYzIgPSBjLmR1cChkYi5EQl9QT1NJVElPTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmN1cnJlbnQoKSwgYzIuY3VycmVudCgpKQorCisgICAgICAgIGMyLnB1dCgnJywgJ2EgbmV3IHZhbHVlJywgZGIuREJfQ1VSUkVOVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmN1cnJlbnQoKSwgYzIuY3VycmVudCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY3VycmVudCgpWzFdLCAnYSBuZXcgdmFsdWUnKQorCisgICAgICAgIGMyLnB1dCgnJywgJ2VyJywgZGIuREJfQ1VSUkVOVCwgZGxlbj0wLCBkb2ZmPTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYzIuY3VycmVudCgpWzFdLCAnYSBuZXdlciB2YWx1ZScpCisKKyAgICAgICAgYy5jbG9zZSgpCisgICAgICAgIGMyLmNsb3NlKCkKKyAgICAgICAgaWYgdHhuOgorICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisKKyAgICAgICAgIyB0aW1lIHRvIGFidXNlIHRoZSBjbG9zZWQgY3Vyc29ycyBhbmQgaG9wZSB3ZSBkb24ndCBjcmFzaAorICAgICAgICBtZXRob2RzX3RvX3Rlc3QgPSB7CisgICAgICAgICAgICAnY3VycmVudCc6ICgpLAorICAgICAgICAgICAgJ2RlbGV0ZSc6ICgpLAorICAgICAgICAgICAgJ2R1cCc6IChkYi5EQl9QT1NJVElPTiwpLAorICAgICAgICAgICAgJ2ZpcnN0JzogKCksCisgICAgICAgICAgICAnZ2V0JzogKDAsKSwKKyAgICAgICAgICAgICduZXh0JzogKCksCisgICAgICAgICAgICAncHJldic6ICgpLAorICAgICAgICAgICAgJ2xhc3QnOiAoKSwKKyAgICAgICAgICAgICdwdXQnOignJywgJ3NwYW0nLCBkYi5EQl9DVVJSRU5UKSwKKyAgICAgICAgICAgICdzZXQnOiAoIjA1MDUiLCksCisgICAgICAgIH0KKyAgICAgICAgZm9yIG1ldGhvZCwgYXJncyBpbiBtZXRob2RzX3RvX3Rlc3QuaXRlbXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiYXR0ZW1wdGluZyB0byB1c2UgYSBjbG9zZWQgY3Vyc29yJ3MgJXMgbWV0aG9kIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kCisgICAgICAgICAgICAgICAgIyBhIGJ1ZyBtYXkgY2F1c2UgYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UuLi4KKyAgICAgICAgICAgICAgICBnZXRhdHRyKGMsIG1ldGhvZCkoKmFyZ3MpCisgICAgICAgICAgICBleGNlcHQgZGIuREJFcnJvciwgdmFsOgorICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgMCkKKyAgICAgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwuYXJnc1swXSwgMCkKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCB2YWwKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBleGNlcHRpb24gcmFpc2VkIHdoZW4gdXNpbmcgYSBidWdneSBjdXJzb3IncyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG1ldGhvZCIgJSBtZXRob2QpCisKKyAgICAgICAgIworICAgICAgICAjIGZyZWUgY3Vyc29yIHJlZmVyZW5jaW5nIGEgY2xvc2VkIGRhdGFiYXNlLCBpdCBzaG91bGQgbm90IGJhcmY6CisgICAgICAgICMKKyAgICAgICAgb2xkY3Vyc29yID0gc2VsZi5kLmN1cnNvcih0eG49dHhuKQorICAgICAgICBzZWxmLmQuY2xvc2UoKQorCisgICAgICAgICMgdGhpcyB3b3VsZCBvcmlnaW5hbGx5IGNhdXNlIGEgc2VnZmF1bHQgd2hlbiB0aGUgY3Vyc29yIGZvciBhCisgICAgICAgICMgY2xvc2VkIGRhdGFiYXNlIHdhcyBjbGVhbmVkIHVwLiAgaXQgc2hvdWxkIG5vdCBhbnltb3JlLgorICAgICAgICAjIFNGIHB5YnNkZGIgYnVnIGlkIDY2NzM0MworICAgICAgICBkZWwgb2xkY3Vyc29yCisKKyAgICBkZWYgdGVzdDAzYl9TaW1wbGVDdXJzb3JXaXRob3V0R2V0UmV0dXJuc05vbmUwKHNlbGYpOgorICAgICAgICAjIHNhbWUgdGVzdCBidXQgcmFpc2UgZXhjZXB0aW9ucyBpbnN0ZWFkIG9mIHJldHVybmluZyBOb25lCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwM2JfU2ltcGxlQ3Vyc29yU3R1ZmZXaXRob3V0R2V0UmV0dXJuc05vbmUuLi4iICUgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBvbGQgPSBzZWxmLmQuc2V0X2dldF9yZXR1cm5zX25vbmUoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvbGQsIDIpCisgICAgICAgIHNlbGYudGVzdDAzX1NpbXBsZUN1cnNvclN0dWZmKGdldF9yYWlzZXNfZXJyb3I9MSwgc2V0X3JhaXNlc19lcnJvcj0xKQorCisgICAgZGVmIHRlc3QwM2JfU2ltcGxlQ3Vyc29yV2l0aEdldFJldHVybnNOb25lMShzZWxmKToKKyAgICAgICAgIyBzYW1lIHRlc3QgYnV0IHJhaXNlIGV4Y2VwdGlvbnMgaW5zdGVhZCBvZiByZXR1cm5pbmcgTm9uZQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDNiX1NpbXBsZUN1cnNvclN0dWZmV2l0aG91dEdldFJldHVybnNOb25lLi4uIiAlIFwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgb2xkID0gc2VsZi5kLnNldF9nZXRfcmV0dXJuc19ub25lKDEpCisgICAgICAgIHNlbGYudGVzdDAzX1NpbXBsZUN1cnNvclN0dWZmKGdldF9yYWlzZXNfZXJyb3I9MCwgc2V0X3JhaXNlc19lcnJvcj0xKQorCisKKyAgICBkZWYgdGVzdDAzY19TaW1wbGVDdXJzb3JHZXRSZXR1cm5zTm9uZTIoc2VsZik6CisgICAgICAgICMgc2FtZSB0ZXN0IGJ1dCByYWlzZSBleGNlcHRpb25zIGluc3RlYWQgb2YgcmV0dXJuaW5nIE5vbmUKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAzY19TaW1wbGVDdXJzb3JTdHVmZldpdGhvdXRTZXRSZXR1cm5zTm9uZS4uLiIgJSBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIG9sZCA9IHNlbGYuZC5zZXRfZ2V0X3JldHVybnNfbm9uZSgxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9sZCwgMikKKyAgICAgICAgb2xkID0gc2VsZi5kLnNldF9nZXRfcmV0dXJuc19ub25lKDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2xkLCAxKQorICAgICAgICBzZWxmLnRlc3QwM19TaW1wbGVDdXJzb3JTdHVmZihnZXRfcmFpc2VzX2Vycm9yPTAsIHNldF9yYWlzZXNfZXJyb3I9MCkKKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNik6CisgICAgICAgIGRlZiB0ZXN0MDNkX1NpbXBsZUN1cnNvclByaW9yaXR5KHNlbGYpIDoKKyAgICAgICAgICAgIGMgPSBzZWxmLmQuY3Vyc29yKCkKKyAgICAgICAgICAgIGMuc2V0X3ByaW9yaXR5KGRiLkRCX1BSSU9SSVRZX1ZFUllfTE9XKSAgIyBQb3NpdGlvbmFsCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRiLkRCX1BSSU9SSVRZX1ZFUllfTE9XLCBjLmdldF9wcmlvcml0eSgpKQorICAgICAgICAgICAgYy5zZXRfcHJpb3JpdHkocHJpb3JpdHk9ZGIuREJfUFJJT1JJVFlfSElHSCkgICMgS2V5d29yZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYi5EQl9QUklPUklUWV9ISUdILCBjLmdldF9wcmlvcml0eSgpKQorICAgICAgICAgICAgYy5jbG9zZSgpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHRlc3QwNF9QYXJ0aWFsR2V0QW5kUHV0KHNlbGYpOgorICAgICAgICBkID0gc2VsZi5kCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwNF9QYXJ0aWFsR2V0QW5kUHV0Li4uIiAlIFwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAga2V5ID0gInBhcnRpYWxUZXN0IgorICAgICAgICBkYXRhID0gIjEiICogMTAwMCArICIyIiAqIDEwMDAKKyAgICAgICAgZC5wdXQoa2V5LCBkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KGtleSksIGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoa2V5LCBkbGVuPTIwLCBkb2ZmPTk5MCksCisgICAgICAgICAgICAgICAgKCIxIiAqIDEwKSArICgiMiIgKiAxMCkpCisKKyAgICAgICAgZC5wdXQoInBhcnRpYWx0ZXN0MiIsICgiMSIgKiAzMDAwMCkgKyAicm9iaW4iICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgicGFydGlhbHRlc3QyIiwgZGxlbj01LCBkb2ZmPTMwMDAwKSwgInJvYmluIikKKworICAgICAgICAjIFRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIERCIGhlcmUuLi4gIENvbW1lbnRlZCBvdXQgdGhlIHRlc3QgZm9yCisgICAgICAgICMgbm93LgorICAgICAgICAjI3NlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoInBhcnRpYWx0ZXN0MiIsIGRsZW49NSwgZG9mZj0zMDAxMCksICIiKQorCisgICAgICAgIGlmIHNlbGYuZGJzZXRmbGFncyAhPSBkYi5EQl9EVVA6CisgICAgICAgICAgICAjIFBhcnRpYWwgcHV0IHdpdGggZHVwbGljYXRlIHJlY29yZHMgcmVxdWlyZXMgYSBjdXJzb3IKKyAgICAgICAgICAgIGQucHV0KGtleSwgIjAwMDAiLCBkbGVuPTIwMDAsIGRvZmY9MCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoa2V5KSwgIjAwMDAiKQorCisgICAgICAgICAgICBkLnB1dChrZXksICIxMTExIiwgZGxlbj0xLCBkb2ZmPTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KGtleSksICIwMDExMTEwIikKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdGVzdDA1X0dldFNpemUoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLmQKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDA1X0dldFNpemUuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCA1MDAwMCwgNTAwKToKKyAgICAgICAgICAgIGtleSA9ICJzaXplJXMiICUgaQorICAgICAgICAgICAgI3ByaW50ICJiZWZvcmUgIiwgaSwKKyAgICAgICAgICAgIGQucHV0KGtleSwgIjEiICogaSkKKyAgICAgICAgICAgICNwcmludCAiYWZ0ZXIiLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldF9zaXplKGtleSksIGkpCisgICAgICAgICAgICAjcHJpbnQgImRvbmUiCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHRlc3QwNl9UcnVuY2F0ZShzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuZAorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDZfVHJ1bmNhdGUuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBkLnB1dCgiYWJjZGUiLCAiQUJDREUiKTsKKyAgICAgICAgbnVtID0gZC50cnVuY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShudW0gPj0gMSwgInRydW5jYXRlIHJldHVybmVkIDw9IDAgb24gbm9uLWVtcHR5IGRhdGFiYXNlIikKKyAgICAgICAgbnVtID0gZC50cnVuY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtLCAwLAorICAgICAgICAgICAgICAgICJ0cnVuY2F0ZSBvbiBlbXB0eSBEQiByZXR1cm5lZCBub256ZXJvICglcikiICUgKG51bSwpKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB0ZXN0MDdfdmVyaWZ5KHNlbGYpOgorICAgICAgICAjIFZlcmlmeSBidWcgc29sdmVkIGluIDQuNy4zcHJlOAorICAgICAgICBzZWxmLmQuY2xvc2UoKQorICAgICAgICBkID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIGQudmVyaWZ5KHNlbGYuZmlsZW5hbWUpCisKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDYpOgorICAgICAgICBkZWYgdGVzdDA4X2V4aXN0cyhzZWxmKSA6CisgICAgICAgICAgICBzZWxmLmQucHV0KCJhYmNkZSIsICJBQkNERSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kLmV4aXN0cygiYWJjZGUiKSA9PSBUcnVlLAorICAgICAgICAgICAgICAgICAgICAiREItPmV4aXN0cygpIHJldHVybnMgd3JvbmcgdmFsdWUiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZC5leGlzdHMoIngiKSA9PSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIkRCLT5leGlzdHMoKSByZXR1cm5zIHdyb25nIHZhbHVlIikKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDcpOgorICAgICAgICBkZWYgdGVzdF9jb21wYWN0KHNlbGYpIDoKKyAgICAgICAgICAgIGQgPSBzZWxmLmQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZC5jb21wYWN0KGZsYWdzPWRiLkRCX0ZSRUVMSVNUX09OTFkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBkLmNvbXBhY3QoZmxhZ3M9ZGIuREJfRlJFRUxJU1RfT05MWSkpCisgICAgICAgICAgICBkLnB1dCgiYWJjZGUiLCAiQUJDREUiKTsKKyAgICAgICAgICAgIGQucHV0KCJiY2RlIiwgIkJDREUiKTsKKyAgICAgICAgICAgIGQucHV0KCJhYmMiLCAiQUJDIik7CisgICAgICAgICAgICBkLnB1dCgibW9udHkiLCAicHl0aG9uIik7CisgICAgICAgICAgICBkLmRlbGV0ZSgiYWJjIikKKyAgICAgICAgICAgIGQuZGVsZXRlKCJiY2RlIikKKyAgICAgICAgICAgIGQuY29tcGFjdChzdGFydD0nYWJjZGUnLCBzdG9wPSdtb250eScsIHR4bj1Ob25lLAorICAgICAgICAgICAgICAgICAgICBjb21wYWN0X2ZpbGxwZXJjZW50PTQyLCBjb21wYWN0X3BhZ2VzPTEsCisgICAgICAgICAgICAgICAgICAgIGNvbXBhY3RfdGltZW91dD01MDAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3M9ZGIuREJfRlJFRUxJU1RfT05MWXxkYi5EQl9GUkVFX1NQQUNFKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitjbGFzcyBCYXNpY0JUcmVlVGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKworCitjbGFzcyBCYXNpY0hhc2hUZXN0Q2FzZShCYXNpY1Rlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9IQVNICisKKworY2xhc3MgQmFzaWNCVHJlZVdpdGhUaHJlYWRGbGFnVGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKyAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAorCisKK2NsYXNzIEJhc2ljSGFzaFdpdGhUaHJlYWRGbGFnVGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorICAgIGRib3BlbmZsYWdzID0gZGIuREJfVEhSRUFECisKKworY2xhc3MgQmFzaWNXaXRoRW52VGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CisgICAgZGJvcGVuZmxhZ3MgPSBkYi5EQl9USFJFQUQKKyAgICB1c2VFbnYgPSAxCisgICAgZW52ZmxhZ3MgPSBkYi5EQl9USFJFQUQgfCBkYi5EQl9JTklUX01QT09MIHwgZGIuREJfSU5JVF9MT0NLCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHRlc3QwOV9FbnZSZW1vdmVBbmRSZW5hbWUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmVudjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwOV9FbnZSZW1vdmVBbmRSZW5hbWUuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICAjIGNhbid0IHJlbmFtZSBvciByZW1vdmUgYW4gb3BlbiBEQgorICAgICAgICBzZWxmLmQuY2xvc2UoKQorCisgICAgICAgIG5ld25hbWUgPSBzZWxmLmZpbGVuYW1lICsgJy5yZW5hbWVkJworICAgICAgICBzZWxmLmVudi5kYnJlbmFtZShzZWxmLmZpbGVuYW1lLCBOb25lLCBuZXduYW1lKQorICAgICAgICBzZWxmLmVudi5kYnJlbW92ZShuZXduYW1lKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQmFzaWNCVHJlZVdpdGhFbnZUZXN0Q2FzZShCYXNpY1dpdGhFbnZUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKworCitjbGFzcyBCYXNpY0hhc2hXaXRoRW52VGVzdENhc2UoQmFzaWNXaXRoRW52VGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCYXNpY1RyYW5zYWN0aW9uVGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CisgICAgaWYgKHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNykpIG9yICgoc3lzLnZlcnNpb25faW5mbyA+PSAoMywgMCkpIGFuZAorICAgICAgICAgICAgKHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMikpKSA6CisgICAgICAgIGRlZiBhc3NlcnRJbihzZWxmLCBhLCBiLCBtc2c9Tm9uZSkgOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXNzZXJ0VHJ1ZShhIGluIGIsIG1zZz1tc2cpCisKKyAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0FVVE9fQ09NTUlUCisgICAgdXNlRW52ID0gMQorICAgIGVudmZsYWdzID0gKGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sgfAorICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfVFhOKQorICAgIGVudnNldGZsYWdzID0gZGIuREJfQVVUT19DT01NSVQKKworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnR4bi5jb21taXQoKQorICAgICAgICBCYXNpY1Rlc3RDYXNlLnRlYXJEb3duKHNlbGYpCisKKworICAgIGRlZiBwb3B1bGF0ZURCKHNlbGYpOgorICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICBCYXNpY1Rlc3RDYXNlLnBvcHVsYXRlREIoc2VsZiwgX3R4bj10eG4pCisKKyAgICAgICAgc2VsZi50eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorCisKKyAgICBkZWYgdGVzdDA2X1RyYW5zYWN0aW9ucyhzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuZAorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDZfVHJhbnNhY3Rpb25zLi4uIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnbmV3IHJlYycsIHR4bj1zZWxmLnR4biksIE5vbmUpCisgICAgICAgIGQucHV0KCduZXcgcmVjJywgJ3RoaXMgaXMgYSBuZXcgcmVjb3JkJywgc2VsZi50eG4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ25ldyByZWMnLCB0eG49c2VsZi50eG4pLAorICAgICAgICAgICAgICAgICd0aGlzIGlzIGEgbmV3IHJlY29yZCcpCisgICAgICAgIHNlbGYudHhuLmFib3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnbmV3IHJlYycpLCBOb25lKQorCisgICAgICAgIHNlbGYudHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCduZXcgcmVjJywgdHhuPXNlbGYudHhuKSwgTm9uZSkKKyAgICAgICAgZC5wdXQoJ25ldyByZWMnLCAndGhpcyBpcyBhIG5ldyByZWNvcmQnLCBzZWxmLnR4bikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnbmV3IHJlYycsIHR4bj1zZWxmLnR4biksCisgICAgICAgICAgICAgICAgJ3RoaXMgaXMgYSBuZXcgcmVjb3JkJykKKyAgICAgICAgc2VsZi50eG4uY29tbWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnbmV3IHJlYycpLCAndGhpcyBpcyBhIG5ldyByZWNvcmQnKQorCisgICAgICAgIHNlbGYudHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKCkKKyAgICAgICAgYyA9IGQuY3Vyc29yKHNlbGYudHhuKQorICAgICAgICByZWMgPSBjLmZpcnN0KCkKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHdoaWxlIHJlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgICBpZiB2ZXJib3NlIGFuZCBjb3VudCAlIDEwMCA9PSAwOgorICAgICAgICAgICAgICAgIHByaW50IHJlYworICAgICAgICAgICAgcmVjID0gYy5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgc2VsZi5fbnVtS2V5cysxKQorCisgICAgICAgIGMuY2xvc2UoKSAgICAgICAgICAgICAgICAjIEN1cnNvcnMgKk1VU1QqIGJlIGNsb3NlZCBiZWZvcmUgY29tbWl0IQorICAgICAgICBzZWxmLnR4bi5jb21taXQoKQorCisgICAgICAgICMgZmx1c2ggcGVuZGluZyB1cGRhdGVzCisgICAgICAgIHNlbGYuZW52LnR4bl9jaGVja3BvaW50ICgwLCAwLCAwKQorCisgICAgICAgIHN0YXREaWN0ID0gc2VsZi5lbnYubG9nX3N0YXQoMCk7CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ21hZ2ljJywgc3RhdERpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3ZlcnNpb24nLCBzdGF0RGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignY3VyX2ZpbGUnLCBzdGF0RGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigncmVnaW9uX25vd2FpdCcsIHN0YXREaWN0KQorCisgICAgICAgICMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBsb2cgZmlsZSBwcmVzZW50OgorICAgICAgICBsb2dzID0gc2VsZi5lbnYubG9nX2FyY2hpdmUoZGIuREJfQVJDSF9BQlMgfCBkYi5EQl9BUkNIX0xPRykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChsb2dzLCBOb25lKQorICAgICAgICBmb3IgbG9nIGluIGxvZ3M6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICdsb2cgZmlsZTogJyArIGxvZworICAgICAgICAgICAgbG9ncyA9IHNlbGYuZW52LmxvZ19hcmNoaXZlKGRiLkRCX0FSQ0hfUkVNT1ZFKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBsb2dzKQorCisgICAgICAgIHNlbGYudHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKCkKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDYpOgorICAgICAgICBkZWYgdGVzdDA4X2V4aXN0cyhzZWxmKSA6CisgICAgICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICAgICAgc2VsZi5kLnB1dCgiYWJjZGUiLCAiQUJDREUiLCB0eG49dHhuKQorICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZC5leGlzdHMoImFiY2RlIiwgdHhuPXR4bikgPT0gVHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgIkRCLT5leGlzdHMoKSByZXR1cm5zIHdyb25nIHZhbHVlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmQuZXhpc3RzKCJ4IiwgdHhuPXR4bikgPT0gRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICJEQi0+ZXhpc3RzKCkgcmV0dXJucyB3cm9uZyB2YWx1ZSIpCisgICAgICAgICAgICB0eG4uYWJvcnQoKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB0ZXN0MDlfVHhuVHJ1bmNhdGUoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLmQKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDA5X1R4blRydW5jYXRlLi4uIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgZC5wdXQoImFiY2RlIiwgIkFCQ0RFIik7CisgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgIG51bSA9IGQudHJ1bmNhdGUodHhuKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobnVtID49IDEsICJ0cnVuY2F0ZSByZXR1cm5lZCA8PSAwIG9uIG5vbi1lbXB0eSBkYXRhYmFzZSIpCisgICAgICAgIG51bSA9IGQudHJ1bmNhdGUodHhuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG51bSwgMCwKKyAgICAgICAgICAgICAgICAidHJ1bmNhdGUgb24gZW1wdHkgREIgcmV0dXJuZWQgbm9uemVybyAoJXIpIiAlIChudW0sKSkKKyAgICAgICAgdHhuLmNvbW1pdCgpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHRlc3QxMF9UeG5MYXRlVXNlKHNlbGYpOgorICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICB0eG4uYWJvcnQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0eG4uYWJvcnQoKQorICAgICAgICBleGNlcHQgZGIuREJFcnJvciwgZToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkRCVHhuLmFib3J0KCkgY2FsbGVkIGFmdGVyIERCX1RYTiBubyBsb25nZXIgdmFsaWQgdy9vIGFuIGV4Y2VwdGlvbiIKKworICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCBlOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiREJUeG4uY29tbWl0KCkgY2FsbGVkIGFmdGVyIERCX1RYTiBubyBsb25nZXIgdmFsaWQgdy9vIGFuIGV4Y2VwdGlvbiIKKworCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LCA0KToKKyAgICAgICAgZGVmIHRlc3RfdHhuX25hbWUoc2VsZikgOgorICAgICAgICAgICAgdHhuPXNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR4bi5nZXRfbmFtZSgpLCAiIikKKyAgICAgICAgICAgIHR4bi5zZXRfbmFtZSgiWFhZWSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR4bi5nZXRfbmFtZSgpLCAiWFhZWSIpCisgICAgICAgICAgICB0eG4uc2V0X25hbWUoIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR4bi5nZXRfbmFtZSgpLCAiIikKKyAgICAgICAgICAgIHR4bi5hYm9ydCgpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICAgICAgZGVmIHRlc3RfdHhuX3NldF90aW1lb3V0KHNlbGYpIDoKKyAgICAgICAgICAgIHR4bj1zZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICAgICAgdHhuLnNldF90aW1lb3V0KDEyMzQ1NjcsIGRiLkRCX1NFVF9MT0NLX1RJTUVPVVQpCisgICAgICAgICAgICB0eG4uc2V0X3RpbWVvdXQoMjM0NTY3OCwgZmxhZ3M9ZGIuREJfU0VUX1RYTl9USU1FT1VUKQorICAgICAgICAgICAgdHhuLmFib3J0KCkKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgZGVmIHRlc3RfZ2V0X3R4X21heChzZWxmKSA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW52LmdldF90eF9tYXgoKSwgMzApCisKKyAgICAgICAgZGVmIHRlc3RfZ2V0X3R4X3RpbWVzdGFtcChzZWxmKSA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW52LmdldF90eF90aW1lc3RhbXAoKSwgc2VsZi5fdCkKKworCisKK2NsYXNzIEJUcmVlVHJhbnNhY3Rpb25UZXN0Q2FzZShCYXNpY1RyYW5zYWN0aW9uVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0JUUkVFCisKK2NsYXNzIEhhc2hUcmFuc2FjdGlvblRlc3RDYXNlKEJhc2ljVHJhbnNhY3Rpb25UZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQlRyZWVSZWNub1Rlc3RDYXNlKEJhc2ljVGVzdENhc2UpOgorICAgIGRidHlwZSAgICAgPSBkYi5EQl9CVFJFRQorICAgIGRic2V0ZmxhZ3MgPSBkYi5EQl9SRUNOVU0KKworICAgIGRlZiB0ZXN0MDlfUmVjbm9JbkJUcmVlKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5kCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwOV9SZWNub0luQlRyZWUuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICByZWMgPSBkLmdldCgyMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZWMpLCB0eXBlKCgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVjKSwgMikKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJSZWNvcmQgIzIwMCBpcyAiLCByZWMKKworICAgICAgICBjID0gZC5jdXJzb3IoKQorICAgICAgICBjLnNldCgnMDIwMCcpCisgICAgICAgIG51bSA9IGMuZ2V0X3JlY25vKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKG51bSksIHR5cGUoMSkpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAicmVjbm8gb2YgZFsnMDIwMCddIGlzICIsIG51bQorCisgICAgICAgIHJlYyA9IGMuY3VycmVudCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zZXRfcmVjbm8obnVtKSwgcmVjKQorCisgICAgICAgIGMuY2xvc2UoKQorCisKKworY2xhc3MgQlRyZWVSZWNub1dpdGhUaHJlYWRGbGFnVGVzdENhc2UoQlRyZWVSZWNub1Rlc3RDYXNlKToKKyAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCYXNpY0RVUFRlc3RDYXNlKEJhc2ljVGVzdENhc2UpOgorICAgIGRic2V0ZmxhZ3MgPSBkYi5EQl9EVVAKKworICAgIGRlZiB0ZXN0MTBfRHVwbGljYXRlS2V5cyhzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuZAorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MTBfRHVwbGljYXRlS2V5cy4uLiIgJSBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGQucHV0KCJkdXAwIiwgImJlZm9yZSIpCisgICAgICAgIGZvciB4IGluICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5IGRvZy4iLnNwbGl0KCk6CisgICAgICAgICAgICBkLnB1dCgiZHVwMSIsIHgpCisgICAgICAgIGQucHV0KCJkdXAyIiwgImFmdGVyIikKKworICAgICAgICBkYXRhID0gZC5nZXQoImR1cDEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICJUaGUiKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgZGF0YQorCisgICAgICAgIGMgPSBkLmN1cnNvcigpCisgICAgICAgIHJlYyA9IGMuc2V0KCJkdXAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWMsICgnZHVwMScsICdUaGUnKSkKKworICAgICAgICBuZXh0X3JlZyA9IGMubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dF9yZWcsICgnZHVwMScsICdxdWljaycpKQorCisgICAgICAgIHJlYyA9IGMuc2V0KCJkdXAxIikKKyAgICAgICAgY291bnQgPSBjLmNvdW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgOSkKKworICAgICAgICBuZXh0X2R1cCA9IGMubmV4dF9kdXAoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHRfZHVwLCAoJ2R1cDEnLCAncXVpY2snKSkKKworICAgICAgICByZWMgPSBjLnNldCgnZHVwMScpCisgICAgICAgIHdoaWxlIHJlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjCisgICAgICAgICAgICByZWMgPSBjLm5leHRfZHVwKCkKKworICAgICAgICBjLnNldCgnZHVwMScpCisgICAgICAgIHJlYyA9IGMubmV4dF9ub2R1cCgpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmVjWzBdLCAnZHVwMScpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCByZWMKKworICAgICAgICBjLmNsb3NlKCkKKworCisKK2NsYXNzIEJUcmVlRFVQVGVzdENhc2UoQmFzaWNEVVBUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKworY2xhc3MgSGFzaERVUFRlc3RDYXNlKEJhc2ljRFVQVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKKworY2xhc3MgQlRyZWVEVVBXaXRoVGhyZWFkVGVzdENhc2UoQmFzaWNEVVBUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKyAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAorCitjbGFzcyBIYXNoRFVQV2l0aFRocmVhZFRlc3RDYXNlKEJhc2ljRFVQVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKKyAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJhc2ljTXVsdGlEQlRlc3RDYXNlKEJhc2ljVGVzdENhc2UpOgorICAgIGRibmFtZSA9ICdmaXJzdCcKKworICAgIGRlZiBvdGhlclR5cGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZGJ0eXBlID09IGRiLkRCX0JUUkVFOgorICAgICAgICAgICAgcmV0dXJuIGRiLkRCX0hBU0gKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBkYi5EQl9CVFJFRQorCisgICAgZGVmIHRlc3QxMV9NdWx0aURCKHNlbGYpOgorICAgICAgICBkMSA9IHNlbGYuZAorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MTFfTXVsdGlEQi4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGQyID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIGQyLm9wZW4oc2VsZi5maWxlbmFtZSwgInNlY29uZCIsIHNlbGYuZGJ0eXBlLAorICAgICAgICAgICAgICAgIHNlbGYuZGJvcGVuZmxhZ3N8ZGIuREJfQ1JFQVRFKQorICAgICAgICBkMyA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBkMy5vcGVuKHNlbGYuZmlsZW5hbWUsICJ0aGlyZCIsIHNlbGYub3RoZXJUeXBlKCksCisgICAgICAgICAgICAgICAgc2VsZi5kYm9wZW5mbGFnc3xkYi5EQl9DUkVBVEUpCisKKyAgICAgICAgZm9yIHggaW4gIlRoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgZG9nIi5zcGxpdCgpOgorICAgICAgICAgICAgZDIucHV0KHgsIHNlbGYubWFrZURhdGEoeCkpCisKKyAgICAgICAgZm9yIHggaW4gc3RyaW5nLmxldHRlcnM6CisgICAgICAgICAgICBkMy5wdXQoeCwgeCo3MCkKKworICAgICAgICBkMS5zeW5jKCkKKyAgICAgICAgZDIuc3luYygpCisgICAgICAgIGQzLnN5bmMoKQorICAgICAgICBkMS5jbG9zZSgpCisgICAgICAgIGQyLmNsb3NlKCkKKyAgICAgICAgZDMuY2xvc2UoKQorCisgICAgICAgIHNlbGYuZCA9IGQxID0gZDIgPSBkMyA9IE5vbmUKKworICAgICAgICBzZWxmLmQgPSBkMSA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBkMS5vcGVuKHNlbGYuZmlsZW5hbWUsIHNlbGYuZGJuYW1lLCBmbGFncyA9IHNlbGYuZGJvcGVuZmxhZ3MpCisgICAgICAgIGQyID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIGQyLm9wZW4oc2VsZi5maWxlbmFtZSwgInNlY29uZCIsICBmbGFncyA9IHNlbGYuZGJvcGVuZmxhZ3MpCisgICAgICAgIGQzID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIGQzLm9wZW4oc2VsZi5maWxlbmFtZSwgInRoaXJkIiwgZmxhZ3MgPSBzZWxmLmRib3BlbmZsYWdzKQorCisgICAgICAgIGMxID0gZDEuY3Vyc29yKCkKKyAgICAgICAgYzIgPSBkMi5jdXJzb3IoKQorICAgICAgICBjMyA9IGQzLmN1cnNvcigpCisKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHJlYyA9IGMxLmZpcnN0KCkKKyAgICAgICAgd2hpbGUgcmVjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICAgIGlmIHZlcmJvc2UgYW5kIChjb3VudCAlIDUwKSA9PSAwOgorICAgICAgICAgICAgICAgIHByaW50IHJlYworICAgICAgICAgICAgcmVjID0gYzEubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIHNlbGYuX251bUtleXMpCisKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHJlYyA9IGMyLmZpcnN0KCkKKyAgICAgICAgd2hpbGUgcmVjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjCisgICAgICAgICAgICByZWMgPSBjMi5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgOSkKKworICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgcmVjID0gYzMuZmlyc3QoKQorICAgICAgICB3aGlsZSByZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIHJlYyA9IGMzLm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBsZW4oc3RyaW5nLmxldHRlcnMpKQorCisKKyAgICAgICAgYzEuY2xvc2UoKQorICAgICAgICBjMi5jbG9zZSgpCisgICAgICAgIGMzLmNsb3NlKCkKKworICAgICAgICBkMi5jbG9zZSgpCisgICAgICAgIGQzLmNsb3NlKCkKKworCisKKyMgU3RyYW5nZSB0aGluZ3MgaGFwcGVuIGlmIHlvdSB0cnkgdG8gdXNlIE11bHRpcGxlIERCcyBwZXIgZmlsZSB3aXRob3V0IGEKKyMgREJFbnYgd2l0aCBNUE9PTCBhbmQgTE9DS2luZy4uLgorCitjbGFzcyBCVHJlZU11bHRpREJUZXN0Q2FzZShCYXNpY011bHRpREJUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKyAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAorICAgIHVzZUVudiA9IDEKKyAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sKKworY2xhc3MgSGFzaE11bHRpREJUZXN0Q2FzZShCYXNpY011bHRpREJUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorICAgIGRib3BlbmZsYWdzID0gZGIuREJfVEhSRUFECisgICAgdXNlRW52ID0gMQorICAgIGVudmZsYWdzID0gZGIuREJfVEhSRUFEIHwgZGIuREJfSU5JVF9NUE9PTCB8IGRiLkRCX0lOSVRfTE9DSworCisKK2NsYXNzIFByaXZhdGVPYmplY3QodW5pdHRlc3QuVGVzdENhc2UpIDoKKyAgICBkZWYgdGVhckRvd24oc2VsZikgOgorICAgICAgICBkZWwgc2VsZi5vYmoKKworICAgIGRlZiB0ZXN0MDFfRGVmYXVsdElzTm9uZShzZWxmKSA6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5vYmouZ2V0X3ByaXZhdGUoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0MDJfYXNzaWdubWVudChzZWxmKSA6CisgICAgICAgIGEgPSAiZXhhbXBsZSBvZiBwcml2YXRlIG9iamVjdCIKKyAgICAgICAgc2VsZi5vYmouc2V0X3ByaXZhdGUoYSkKKyAgICAgICAgYiA9IHNlbGYub2JqLmdldF9wcml2YXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikgICMgT2JqZWN0IGlkZW50aXR5CisKKyAgICBkZWYgdGVzdDAzX2xlYWtfYXNzaWdubWVudChzZWxmKSA6CisgICAgICAgIGEgPSAiZXhhbXBsZSBvZiBwcml2YXRlIG9iamVjdCIKKyAgICAgICAgcmVmY291bnQgPSBzeXMuZ2V0cmVmY291bnQoYSkKKyAgICAgICAgc2VsZi5vYmouc2V0X3ByaXZhdGUoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWZjb3VudCsxLCBzeXMuZ2V0cmVmY291bnQoYSkpCisgICAgICAgIHNlbGYub2JqLnNldF9wcml2YXRlKE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmY291bnQsIHN5cy5nZXRyZWZjb3VudChhKSkKKworICAgIGRlZiB0ZXN0MDRfbGVha19HQyhzZWxmKSA6CisgICAgICAgIGEgPSAiZXhhbXBsZSBvZiBwcml2YXRlIG9iamVjdCIKKyAgICAgICAgcmVmY291bnQgPSBzeXMuZ2V0cmVmY291bnQoYSkKKyAgICAgICAgc2VsZi5vYmouc2V0X3ByaXZhdGUoYSkKKyAgICAgICAgc2VsZi5vYmogPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmY291bnQsIHN5cy5nZXRyZWZjb3VudChhKSkKKworY2xhc3MgREJFbnZQcml2YXRlT2JqZWN0KFByaXZhdGVPYmplY3QpIDoKKyAgICBkZWYgc2V0VXAoc2VsZikgOgorICAgICAgICBzZWxmLm9iaiA9IGRiLkRCRW52KCkKKworY2xhc3MgREJQcml2YXRlT2JqZWN0KFByaXZhdGVPYmplY3QpIDoKKyAgICBkZWYgc2V0VXAoc2VsZikgOgorICAgICAgICBzZWxmLm9iaiA9IGRiLkRCKCkKKworY2xhc3MgQ3Jhc2hBbmRCdXJuKHVuaXR0ZXN0LlRlc3RDYXNlKSA6CisgICAgI2RlZiB0ZXN0MDFfT3BlbkNyYXNoKHNlbGYpIDoKKyAgICAjICAgICMgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUzMzA3CisgICAgIyAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwgZGIuREIsIE5vbmUsIDY1NTM1KQorCisgICAgaWYgZGIudmVyc2lvbigpIDwgKDQsIDgpIDoKKyAgICAgICAgZGVmIHRlc3QwMl9EQkVudl9kZWFsbG9jKHNlbGYpOgorICAgICAgICAgICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMzg4NQorICAgICAgICAgICAgaW1wb3J0IGdjCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwgZGIuREJFbnYsIH5kYi5EQl9SUENDTElFTlQpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShWZXJzaW9uVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJhc2ljQlRyZWVUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQmFzaWNIYXNoVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJhc2ljQlRyZWVXaXRoVGhyZWFkRmxhZ1Rlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShCYXNpY0hhc2hXaXRoVGhyZWFkRmxhZ1Rlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShCYXNpY0JUcmVlV2l0aEVudlRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShCYXNpY0hhc2hXaXRoRW52VGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJUcmVlVHJhbnNhY3Rpb25UZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoSGFzaFRyYW5zYWN0aW9uVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJUcmVlUmVjbm9UZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQlRyZWVSZWNub1dpdGhUaHJlYWRGbGFnVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJUcmVlRFVQVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEhhc2hEVVBUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQlRyZWVEVVBXaXRoVGhyZWFkVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEhhc2hEVVBXaXRoVGhyZWFkVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJUcmVlTXVsdGlEQlRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShIYXNoTXVsdGlEQlRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEQkVudlByaXZhdGVPYmplY3QpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCUHJpdmF0ZU9iamVjdCkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQ3Jhc2hBbmRCdXJuKSkKKworICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYmFzaWNzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODgzMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYmFzaWNzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYmFzaWNzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODgzMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYmFzaWNzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jb21wYXJlLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGFyZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjNiNDYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGFyZS5weQpAQCAtMCwwICsxLDQ0NyBAQAorIiIiCitUZXN0Q2FzZXMgZm9yIHB5dGhvbiBEQiBkdXBsaWNhdGUgYW5kIEJ0cmVlIGtleSBjb21wYXJpc29uIGZ1bmN0aW9uLgorIiIiCisKK2ltcG9ydCBzeXMsIG9zLCByZQoraW1wb3J0IHRlc3RfYWxsCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCBkYnNoZWx2ZSwgdGVzdF9zdXBwb3J0LCBcCisgICAgICAgIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKKworIyBOZWVkZWQgZm9yIHB5dGhvbiAzLiAiY21wIiB2YW5pc2hlZCBpbiAzLjAuMQorZGVmIGNtcChhLCBiKSA6CisgICAgaWYgYT09YiA6IHJldHVybiAwCisgICAgaWYgYTxiIDogcmV0dXJuIC0xCisgICAgcmV0dXJuIDEKKworbGV4aWNhbF9jbXAgPSBjbXAKKworZGVmIGxvd2VyY2FzZV9jbXAobGVmdCwgcmlnaHQpIDoKKyAgICByZXR1cm4gY21wKGxlZnQubG93ZXIoKSwgcmlnaHQubG93ZXIoKSkKKworZGVmIG1ha2VfcmV2ZXJzZV9jb21wYXJhdG9yKGNtcCkgOgorICAgIGRlZiByZXZlcnNlKGxlZnQsIHJpZ2h0LCBkZWxlZ2F0ZT1jbXApIDoKKyAgICAgICAgcmV0dXJuIC0gZGVsZWdhdGUobGVmdCwgcmlnaHQpCisgICAgcmV0dXJuIHJldmVyc2UKKworX2V4cGVjdGVkX2xleGljYWxfdGVzdF9kYXRhID0gWycnLCAnQ0NDUCcsICdhJywgJ2FhYScsICdiJywgJ2MnLCAnY2NjY2UnLCAnY2NjY2YnXQorX2V4cGVjdGVkX2xvd2VyY2FzZV90ZXN0X2RhdGEgPSBbJycsICdhJywgJ2FhYScsICdiJywgJ2MnLCAnQ0MnLCAnY2NjY2UnLCAnY2NjY2YnLCAnQ0NDUCddCisKK2NsYXNzIENvbXBhcmF0b3JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSkgOgorICAgIGRlZiBjb21wYXJhdG9yX3Rlc3RfaGVscGVyKHNlbGYsIGNvbXBhcmF0b3IsIGV4cGVjdGVkX2RhdGEpIDoKKyAgICAgICAgZGF0YSA9IGV4cGVjdGVkX2RhdGFbOl0KKworICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgZGF0YS5zb3J0KGNtcD1jb21wYXJhdG9yKQorICAgICAgICBlbHNlIDogICMgSW5zZXJ0aW9uIFNvcnQuIFBsZWFzZSwgaW1wcm92ZQorICAgICAgICAgICAgZGF0YTIgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gZGF0YSA6CisgICAgICAgICAgICAgICAgZm9yIGosIGsgaW4gZW51bWVyYXRlKGRhdGEyKSA6CisgICAgICAgICAgICAgICAgICAgIHIgPSBjb21wYXJhdG9yKGssIGkpCisgICAgICAgICAgICAgICAgICAgIGlmIHIgPT0gMSA6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMi5pbnNlcnQoaiwgaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgICAgIGRhdGEyLmFwcGVuZChpKQorICAgICAgICAgICAgZGF0YSA9IGRhdGEyCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBleHBlY3RlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wYXJhdG9yIGAlcycgaXMgbm90IHJpZ2h0OiAlcyB2cy4gJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgJSAoY29tcGFyYXRvciwgZXhwZWN0ZWRfZGF0YSwgZGF0YSkpCisgICAgZGVmIHRlc3RfbGV4aWNhbF9jb21wYXJhdG9yKHNlbGYpIDoKKyAgICAgICAgc2VsZi5jb21wYXJhdG9yX3Rlc3RfaGVscGVyKGxleGljYWxfY21wLCBfZXhwZWN0ZWRfbGV4aWNhbF90ZXN0X2RhdGEpCisgICAgZGVmIHRlc3RfcmV2ZXJzZV9sZXhpY2FsX2NvbXBhcmF0b3Ioc2VsZikgOgorICAgICAgICByZXYgPSBfZXhwZWN0ZWRfbGV4aWNhbF90ZXN0X2RhdGFbOl0KKyAgICAgICAgcmV2LnJldmVyc2UoKQorICAgICAgICBzZWxmLmNvbXBhcmF0b3JfdGVzdF9oZWxwZXIobWFrZV9yZXZlcnNlX2NvbXBhcmF0b3IobGV4aWNhbF9jbXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldikKKyAgICBkZWYgdGVzdF9sb3dlcmNhc2VfY29tcGFyYXRvcihzZWxmKSA6CisgICAgICAgIHNlbGYuY29tcGFyYXRvcl90ZXN0X2hlbHBlcihsb3dlcmNhc2VfY21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9leHBlY3RlZF9sb3dlcmNhc2VfdGVzdF9kYXRhKQorCitjbGFzcyBBYnN0cmFjdEJ0cmVlS2V5Q29tcGFyZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKSA6CisgICAgZW52ID0gTm9uZQorICAgIGRiID0gTm9uZQorCisgICAgaWYgKHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNykpIG9yICgoc3lzLnZlcnNpb25faW5mbyA+PSAoMywwKSkgYW5kCisgICAgICAgICAgICAoc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyKSkpIDoKKyAgICAgICAgZGVmIGFzc2VydExlc3Moc2VsZiwgYSwgYiwgbXNnPU5vbmUpIDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFzc2VydFRydWUoYTxiLCBtc2c9bXNnKQorCisgICAgZGVmIHNldFVwKHNlbGYpIDoKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgJy5kYicKKyAgICAgICAgc2VsZi5ob21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKyAgICAgICAgZW52ID0gZGIuREJFbnYoKQorICAgICAgICBlbnYub3BlbihzZWxmLmhvbWVEaXIsCisgICAgICAgICAgICAgICAgICBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MCisgICAgICAgICAgICAgICAgICB8IGRiLkRCX0lOSVRfTE9DSyB8IGRiLkRCX1RIUkVBRCkKKyAgICAgICAgc2VsZi5lbnYgPSBlbnYKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKSA6CisgICAgICAgIHNlbGYuY2xvc2VEQigpCisgICAgICAgIGlmIHNlbGYuZW52IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5lbnYgPSBOb25lCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCisgICAgZGVmIGFkZERhdGFUb0RCKHNlbGYsIGRhdGEpIDoKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIGl0ZW0gaW4gZGF0YToKKyAgICAgICAgICAgIHNlbGYuZGIucHV0KGl0ZW0sIHN0cihpKSkKKyAgICAgICAgICAgIGkgPSBpICsgMQorCisgICAgZGVmIGNyZWF0ZURCKHNlbGYsIGtleV9jb21wYXJhdG9yKSA6CisgICAgICAgIHNlbGYuZGIgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgc2VsZi5zZXR1cERCKGtleV9jb21wYXJhdG9yKQorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5maWxlbmFtZSwgInRlc3QiLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFKQorCisgICAgZGVmIHNldHVwREIoc2VsZiwga2V5X2NvbXBhcmF0b3IpIDoKKyAgICAgICAgc2VsZi5kYi5zZXRfYnRfY29tcGFyZShrZXlfY29tcGFyYXRvcikKKworICAgIGRlZiBjbG9zZURCKHNlbGYpIDoKKyAgICAgICAgaWYgc2VsZi5kYiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGIuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5kYiA9IE5vbmUKKworICAgIGRlZiBzdGFydFRlc3Qoc2VsZikgOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZmluaXNoVGVzdChzZWxmLCBleHBlY3RlZCA9IE5vbmUpIDoKKyAgICAgICAgaWYgZXhwZWN0ZWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3Jlc3VsdHMoZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuY2xvc2VEQigpCisKKyAgICBkZWYgY2hlY2tfcmVzdWx0cyhzZWxmLCBleHBlY3RlZCkgOgorICAgICAgICBjdXJzID0gc2VsZi5kYi5jdXJzb3IoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgICAgIHJlYyA9IGN1cnMuZmlyc3QoKQorICAgICAgICAgICAgd2hpbGUgcmVjOgorICAgICAgICAgICAgICAgIGtleSwgaWdub3JlID0gcmVjCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzKGluZGV4LCBsZW4oZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIG1hbnkgdmFsdWVzIHJldHVybmVkIGZyb20gY3Vyc29yIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkW2luZGV4XSwga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHZhbHVlIGAlcycgYXQgJWQgYnV0IGdvdCBgJXMnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZXhwZWN0ZWRbaW5kZXhdLCBpbmRleCwga2V5KSkKKyAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMQorICAgICAgICAgICAgICAgIHJlYyA9IGN1cnMubmV4dCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZGV4LCBsZW4oZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGVub3VnaCB2YWx1ZXMgcmV0dXJuZWQgZnJvbSBjdXJzb3IiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgY3Vycy5jbG9zZSgpCisKK2NsYXNzIEJ0cmVlS2V5Q29tcGFyZVRlc3RDYXNlKEFic3RyYWN0QnRyZWVLZXlDb21wYXJlVGVzdENhc2UpIDoKKyAgICBkZWYgcnVuQ29tcGFyZVRlc3Qoc2VsZiwgY29tcGFyYXRvciwgZGF0YSkgOgorICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIHNlbGYuY3JlYXRlREIoY29tcGFyYXRvcikKKyAgICAgICAgc2VsZi5hZGREYXRhVG9EQihkYXRhKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoZGF0YSkKKworICAgIGRlZiB0ZXN0X2xleGljYWxfb3JkZXJpbmcoc2VsZikgOgorICAgICAgICBzZWxmLnJ1bkNvbXBhcmVUZXN0KGxleGljYWxfY21wLCBfZXhwZWN0ZWRfbGV4aWNhbF90ZXN0X2RhdGEpCisKKyAgICBkZWYgdGVzdF9yZXZlcnNlX2xleGljYWxfb3JkZXJpbmcoc2VsZikgOgorICAgICAgICBleHBlY3RlZF9yZXZfZGF0YSA9IF9leHBlY3RlZF9sZXhpY2FsX3Rlc3RfZGF0YVs6XQorICAgICAgICBleHBlY3RlZF9yZXZfZGF0YS5yZXZlcnNlKCkKKyAgICAgICAgc2VsZi5ydW5Db21wYXJlVGVzdChtYWtlX3JldmVyc2VfY29tcGFyYXRvcihsZXhpY2FsX2NtcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jldl9kYXRhKQorCisgICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl91c2VsZXNzKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgc29jaWFsaXN0X2NvbXBhcmF0b3IobCwgcikgOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgc2VsZi5jcmVhdGVEQihzb2NpYWxpc3RfY29tcGFyYXRvcikKKyAgICAgICAgc2VsZi5hZGREYXRhVG9EQihbJ2InLCAnYScsICdkJ10pCisgICAgICAgICMgYWxsIHRoaW5ncyBiZWluZyBlcXVhbCB0aGUgZmlyc3Qga2V5IHdpbGwgYmUgdGhlIG9ubHkga2V5CisgICAgICAgICMgaW4gdGhlIGRhdGFiYXNlLi4uICAod2l0aCB0aGUgbGFzdCBrZXkncyB2YWx1ZSBmd2l3KQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoWydiJ10pCisKKworY2xhc3MgQnRyZWVFeGNlcHRpb25zVGVzdENhc2UoQWJzdHJhY3RCdHJlZUtleUNvbXBhcmVUZXN0Q2FzZSkgOgorICAgIGRlZiB0ZXN0X3JhaXNlc19ub25fY2FsbGFibGUoc2VsZikgOgorICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5jcmVhdGVEQiwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5jcmVhdGVEQiwgTm9uZSkKKyAgICAgICAgc2VsZi5maW5pc2hUZXN0KCkKKworICAgIGRlZiB0ZXN0X3NldF9idF9jb21wYXJlX3dpdGhfZnVuY3Rpb24oc2VsZikgOgorICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIHNlbGYuY3JlYXRlREIobGV4aWNhbF9jbXApCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCisKKyAgICBkZWYgY2hlY2tfcmVzdWx0cyhzZWxmLCByZXN1bHRzKSA6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2NvbXBhcmVfZnVuY3Rpb25faW5jb3JyZWN0KHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgYmFkX2NvbXBhcmF0b3IobCwgcikgOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgIyB2ZXJpZnkgdGhhdCBzZXRfYnRfY29tcGFyZSBjaGVja3MgdGhhdCBjb21wYXJhdG9yKCcnLCAnJykgPT0gMAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuY3JlYXRlREIsIGJhZF9jb21wYXJhdG9yKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoKQorCisgICAgZGVmIHZlcmlmeVN0ZGVycihzZWxmLCBtZXRob2QsIHN1Y2Nlc3NSZSkgOgorICAgICAgICAiIiIKKyAgICAgICAgQ2FsbCBtZXRob2QoKSB3aGlsZSBjYXB0dXJpbmcgc3lzLnN0ZGVyciBvdXRwdXQgaW50ZXJuYWxseSBhbmQKKyAgICAgICAgY2FsbCBzZWxmLmZhaWwoKSBpZiBzdWNjZXNzUmUuc2VhcmNoKCkgZG9lcyBub3QgbWF0Y2ggdGhlIHN0ZGVycgorICAgICAgICBvdXRwdXQuICBUaGlzIGlzIHVzZWQgdG8gdGVzdCBmb3IgdW5jYXRjaGFibGUgZXhjZXB0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIHN0ZEVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgc3lzLnN0ZGVyciA9IFN0cmluZ0lPKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWV0aG9kKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRlbXAgPSBzeXMuc3RkZXJyCisgICAgICAgICAgICBzeXMuc3RkZXJyID0gc3RkRXJyCisgICAgICAgICAgICBlcnJvck91dCA9IHRlbXAuZ2V0dmFsdWUoKQorICAgICAgICAgICAgaWYgbm90IHN1Y2Nlc3NSZS5zZWFyY2goZXJyb3JPdXQpIDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuZXhwZWN0ZWQgc3RkZXJyIG91dHB1dDpcbiIrZXJyb3JPdXQpCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCkgOiAgIyBYWFg6IEhvdyB0byBkbyB0aGlzIGluIFB5M2sgPz8/CisgICAgICAgICAgICBzeXMuZXhjX3RyYWNlYmFjayA9IHN5cy5sYXN0X3RyYWNlYmFjayA9IE5vbmUKKworICAgIGRlZiBfdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2V4Y2VwdGlvbihzZWxmKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgZGVmIGJhZF9jb21wYXJhdG9yKGwsIHIpIDoKKyAgICAgICAgICAgIGlmIGwgPT0gcjoKKyAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNldF9idF9jb21wYXJlIHRlc3QKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiaSdtIGEgbmF1Z2h0eSBjb21wYXJpc29uIGZ1bmN0aW9uIgorICAgICAgICBzZWxmLmNyZWF0ZURCKGJhZF9jb21wYXJhdG9yKQorICAgICAgICAjcHJpbnQgIlxuKioqIHRlc3Qgc2hvdWxkIHByaW50IDIgdW5jYXRjaGFibGUgdHJhY2ViYWNrcyAqKioiCisgICAgICAgIHNlbGYuYWRkRGF0YVRvREIoWydhJywgJ2InLCAnYyddKSAgIyB0aGlzIHNob3VsZCByYWlzZSwgYnV0Li4uCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCisKKyAgICBkZWYgdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2V4Y2VwdGlvbihzZWxmKSA6CisgICAgICAgIHNlbGYudmVyaWZ5U3RkZXJyKAorICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3RfY29tcGFyZV9mdW5jdGlvbl9leGNlcHRpb24sCisgICAgICAgICAgICAgICAgcmUuY29tcGlsZSgnKF5SdW50aW1lRXJyb3I6LiogbmF1Z2h0eS4qKXsyfScsIHJlLk18cmUuUykKKyAgICAgICAgKQorCisgICAgZGVmIF90ZXN0X2NvbXBhcmVfZnVuY3Rpb25fYmFkX3JldHVybihzZWxmKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgZGVmIGJhZF9jb21wYXJhdG9yKGwsIHIpIDoKKyAgICAgICAgICAgIGlmIGwgPT0gcjoKKyAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNldF9idF9jb21wYXJlIHRlc3QKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgcmV0dXJuIGwKKyAgICAgICAgc2VsZi5jcmVhdGVEQihiYWRfY29tcGFyYXRvcikKKyAgICAgICAgI3ByaW50ICJcbioqKiB0ZXN0IHNob3VsZCBwcmludCAyIGVycm9ycyBhYm91dCByZXR1cm5pbmcgYW4gaW50ICoqKiIKKyAgICAgICAgc2VsZi5hZGREYXRhVG9EQihbJ2EnLCAnYicsICdjJ10pICAjIHRoaXMgc2hvdWxkIHJhaXNlLCBidXQuLi4KKyAgICAgICAgc2VsZi5maW5pc2hUZXN0KCkKKworICAgIGRlZiB0ZXN0X2NvbXBhcmVfZnVuY3Rpb25fYmFkX3JldHVybihzZWxmKSA6CisgICAgICAgIHNlbGYudmVyaWZ5U3RkZXJyKAorICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3RfY29tcGFyZV9mdW5jdGlvbl9iYWRfcmV0dXJuLAorICAgICAgICAgICAgICAgIHJlLmNvbXBpbGUoJyheVHlwZUVycm9yOi4qIHJldHVybiBhbiBpbnQuKil7Mn0nLCByZS5NfHJlLlMpCisgICAgICAgICkKKworCisgICAgZGVmIHRlc3RfY2Fubm90X2Fzc2lnbl90d2ljZShzZWxmKSA6CisKKyAgICAgICAgZGVmIG15X2NvbXBhcmUoYSwgYikgOgorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIHNlbGYuY3JlYXRlREIobXlfY29tcGFyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzZWxmLmRiLnNldF9idF9jb21wYXJlLCBteV9jb21wYXJlKQorCitjbGFzcyBBYnN0cmFjdER1cGxpY2F0ZUNvbXBhcmVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSkgOgorICAgIGVudiA9IE5vbmUKKyAgICBkYiA9IE5vbmUKKworICAgIGlmIChzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcpKSBvciAoKHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsMCkpIGFuZAorICAgICAgICAgICAgKHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMikpKSA6CisgICAgICAgIGRlZiBhc3NlcnRMZXNzKHNlbGYsIGEsIGIsIG1zZz1Ob25lKSA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hc3NlcnRUcnVlKGE8YiwgbXNnPW1zZykKKworICAgIGRlZiBzZXRVcChzZWxmKSA6CisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICcuZGInCisgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisgICAgICAgIGVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgZW52Lm9wZW4oc2VsZi5ob21lRGlyLAorICAgICAgICAgICAgICAgICAgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTAorICAgICAgICAgICAgICAgICAgfCBkYi5EQl9JTklUX0xPQ0sgfCBkYi5EQl9USFJFQUQpCisgICAgICAgIHNlbGYuZW52ID0gZW52CisKKyAgICBkZWYgdGVhckRvd24oc2VsZikgOgorICAgICAgICBzZWxmLmNsb3NlREIoKQorICAgICAgICBpZiBzZWxmLmVudiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZW52LmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuZW52ID0gTm9uZQorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKworICAgIGRlZiBhZGREYXRhVG9EQihzZWxmLCBkYXRhKSA6CisgICAgICAgIGZvciBpdGVtIGluIGRhdGE6CisgICAgICAgICAgICBzZWxmLmRiLnB1dCgia2V5IiwgaXRlbSkKKworICAgIGRlZiBjcmVhdGVEQihzZWxmLCBkdXBfY29tcGFyYXRvcikgOgorICAgICAgICBzZWxmLmRiID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIHNlbGYuc2V0dXBEQihkdXBfY29tcGFyYXRvcikKKyAgICAgICAgc2VsZi5kYi5vcGVuKHNlbGYuZmlsZW5hbWUsICJ0ZXN0IiwgZGIuREJfQlRSRUUsIGRiLkRCX0NSRUFURSkKKworICAgIGRlZiBzZXR1cERCKHNlbGYsIGR1cF9jb21wYXJhdG9yKSA6CisgICAgICAgIHNlbGYuZGIuc2V0X2ZsYWdzKGRiLkRCX0RVUFNPUlQpCisgICAgICAgIHNlbGYuZGIuc2V0X2R1cF9jb21wYXJlKGR1cF9jb21wYXJhdG9yKQorCisgICAgZGVmIGNsb3NlREIoc2VsZikgOgorICAgICAgICBpZiBzZWxmLmRiIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5kYi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmRiID0gTm9uZQorCisgICAgZGVmIHN0YXJ0VGVzdChzZWxmKSA6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBmaW5pc2hUZXN0KHNlbGYsIGV4cGVjdGVkID0gTm9uZSkgOgorICAgICAgICBpZiBleHBlY3RlZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0cyhleHBlY3RlZCkKKyAgICAgICAgc2VsZi5jbG9zZURCKCkKKworICAgIGRlZiBjaGVja19yZXN1bHRzKHNlbGYsIGV4cGVjdGVkKSA6CisgICAgICAgIGN1cnMgPSBzZWxmLmRiLmN1cnNvcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGluZGV4ID0gMAorICAgICAgICAgICAgcmVjID0gY3Vycy5maXJzdCgpCisgICAgICAgICAgICB3aGlsZSByZWM6CisgICAgICAgICAgICAgICAgaWdub3JlLCBkYXRhID0gcmVjCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzKGluZGV4LCBsZW4oZXhwZWN0ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIG1hbnkgdmFsdWVzIHJldHVybmVkIGZyb20gY3Vyc29yIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkW2luZGV4XSwgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCB2YWx1ZSBgJXMnIGF0ICVkIGJ1dCBnb3QgYCVzJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGV4cGVjdGVkW2luZGV4XSwgaW5kZXgsIGRhdGEpKQorICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCisgICAgICAgICAgICAgICAgcmVjID0gY3Vycy5uZXh0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5kZXgsIGxlbihleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIHZhbHVlcyByZXR1cm5lZCBmcm9tIGN1cnNvciIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBjdXJzLmNsb3NlKCkKKworY2xhc3MgRHVwbGljYXRlQ29tcGFyZVRlc3RDYXNlKEFic3RyYWN0RHVwbGljYXRlQ29tcGFyZVRlc3RDYXNlKSA6CisgICAgZGVmIHJ1bkNvbXBhcmVUZXN0KHNlbGYsIGNvbXBhcmF0b3IsIGRhdGEpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBzZWxmLmNyZWF0ZURCKGNvbXBhcmF0b3IpCisgICAgICAgIHNlbGYuYWRkRGF0YVRvREIoZGF0YSkKKyAgICAgICAgc2VsZi5maW5pc2hUZXN0KGRhdGEpCisKKyAgICBkZWYgdGVzdF9sZXhpY2FsX29yZGVyaW5nKHNlbGYpIDoKKyAgICAgICAgc2VsZi5ydW5Db21wYXJlVGVzdChsZXhpY2FsX2NtcCwgX2V4cGVjdGVkX2xleGljYWxfdGVzdF9kYXRhKQorCisgICAgZGVmIHRlc3RfcmV2ZXJzZV9sZXhpY2FsX29yZGVyaW5nKHNlbGYpIDoKKyAgICAgICAgZXhwZWN0ZWRfcmV2X2RhdGEgPSBfZXhwZWN0ZWRfbGV4aWNhbF90ZXN0X2RhdGFbOl0KKyAgICAgICAgZXhwZWN0ZWRfcmV2X2RhdGEucmV2ZXJzZSgpCisgICAgICAgIHNlbGYucnVuQ29tcGFyZVRlc3QobWFrZV9yZXZlcnNlX2NvbXBhcmF0b3IobGV4aWNhbF9jbXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXZfZGF0YSkKKworY2xhc3MgRHVwbGljYXRlRXhjZXB0aW9uc1Rlc3RDYXNlKEFic3RyYWN0RHVwbGljYXRlQ29tcGFyZVRlc3RDYXNlKSA6CisgICAgZGVmIHRlc3RfcmFpc2VzX25vbl9jYWxsYWJsZShzZWxmKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmNyZWF0ZURCLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmNyZWF0ZURCLCBOb25lKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoKQorCisgICAgZGVmIHRlc3Rfc2V0X2R1cF9jb21wYXJlX3dpdGhfZnVuY3Rpb24oc2VsZikgOgorICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIHNlbGYuY3JlYXRlREIobGV4aWNhbF9jbXApCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCisKKyAgICBkZWYgY2hlY2tfcmVzdWx0cyhzZWxmLCByZXN1bHRzKSA6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2NvbXBhcmVfZnVuY3Rpb25faW5jb3JyZWN0KHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgYmFkX2NvbXBhcmF0b3IobCwgcikgOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgIyB2ZXJpZnkgdGhhdCBzZXRfZHVwX2NvbXBhcmUgY2hlY2tzIHRoYXQgY29tcGFyYXRvcignJywgJycpID09IDAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmNyZWF0ZURCLCBiYWRfY29tcGFyYXRvcikKKyAgICAgICAgc2VsZi5maW5pc2hUZXN0KCkKKworICAgIGRlZiB0ZXN0X2NvbXBhcmVfZnVuY3Rpb25fdXNlbGVzcyhzZWxmKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgZGVmIHNvY2lhbGlzdF9jb21wYXJhdG9yKGwsIHIpIDoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHNlbGYuY3JlYXRlREIoc29jaWFsaXN0X2NvbXBhcmF0b3IpCisgICAgICAgICMgRFVQU09SVCBkb2VzIG5vdCBhbGxvdyAiZHVwbGljYXRlIGR1cGxpY2F0ZXMiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCS2V5RXhpc3RFcnJvciwgc2VsZi5hZGREYXRhVG9EQiwgWydiJywgJ2EnLCAnZCddKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoKQorCisgICAgZGVmIHZlcmlmeVN0ZGVycihzZWxmLCBtZXRob2QsIHN1Y2Nlc3NSZSkgOgorICAgICAgICAiIiIKKyAgICAgICAgQ2FsbCBtZXRob2QoKSB3aGlsZSBjYXB0dXJpbmcgc3lzLnN0ZGVyciBvdXRwdXQgaW50ZXJuYWxseSBhbmQKKyAgICAgICAgY2FsbCBzZWxmLmZhaWwoKSBpZiBzdWNjZXNzUmUuc2VhcmNoKCkgZG9lcyBub3QgbWF0Y2ggdGhlIHN0ZGVycgorICAgICAgICBvdXRwdXQuICBUaGlzIGlzIHVzZWQgdG8gdGVzdCBmb3IgdW5jYXRjaGFibGUgZXhjZXB0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIHN0ZEVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgc3lzLnN0ZGVyciA9IFN0cmluZ0lPKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWV0aG9kKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRlbXAgPSBzeXMuc3RkZXJyCisgICAgICAgICAgICBzeXMuc3RkZXJyID0gc3RkRXJyCisgICAgICAgICAgICBlcnJvck91dCA9IHRlbXAuZ2V0dmFsdWUoKQorICAgICAgICAgICAgaWYgbm90IHN1Y2Nlc3NSZS5zZWFyY2goZXJyb3JPdXQpIDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuZXhwZWN0ZWQgc3RkZXJyIG91dHB1dDpcbiIrZXJyb3JPdXQpCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCkgOiAgIyBYWFg6IEhvdyB0byBkbyB0aGlzIGluIFB5M2sgPz8/CisgICAgICAgICAgICBzeXMuZXhjX3RyYWNlYmFjayA9IHN5cy5sYXN0X3RyYWNlYmFjayA9IE5vbmUKKworICAgIGRlZiBfdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2V4Y2VwdGlvbihzZWxmKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgZGVmIGJhZF9jb21wYXJhdG9yKGwsIHIpIDoKKyAgICAgICAgICAgIGlmIGwgPT0gcjoKKyAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNldF9kdXBfY29tcGFyZSB0ZXN0CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgImknbSBhIG5hdWdodHkgY29tcGFyaXNvbiBmdW5jdGlvbiIKKyAgICAgICAgc2VsZi5jcmVhdGVEQihiYWRfY29tcGFyYXRvcikKKyAgICAgICAgI3ByaW50ICJcbioqKiB0ZXN0IHNob3VsZCBwcmludCAyIHVuY2F0Y2hhYmxlIHRyYWNlYmFja3MgKioqIgorICAgICAgICBzZWxmLmFkZERhdGFUb0RCKFsnYScsICdiJywgJ2MnXSkgICMgdGhpcyBzaG91bGQgcmFpc2UsIGJ1dC4uLgorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoKQorCisgICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl9leGNlcHRpb24oc2VsZikgOgorICAgICAgICBzZWxmLnZlcmlmeVN0ZGVycigKKyAgICAgICAgICAgICAgICBzZWxmLl90ZXN0X2NvbXBhcmVfZnVuY3Rpb25fZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIHJlLmNvbXBpbGUoJyheUnVudGltZUVycm9yOi4qIG5hdWdodHkuKil7Mn0nLCByZS5NfHJlLlMpCisgICAgICAgICkKKworICAgIGRlZiBfdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2JhZF9yZXR1cm4oc2VsZikgOgorICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIGRlZiBiYWRfY29tcGFyYXRvcihsLCByKSA6CisgICAgICAgICAgICBpZiBsID09IHI6CisgICAgICAgICAgICAgICAgIyBwYXNzIHRoZSBzZXRfZHVwX2NvbXBhcmUgdGVzdAorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICByZXR1cm4gbAorICAgICAgICBzZWxmLmNyZWF0ZURCKGJhZF9jb21wYXJhdG9yKQorICAgICAgICAjcHJpbnQgIlxuKioqIHRlc3Qgc2hvdWxkIHByaW50IDIgZXJyb3JzIGFib3V0IHJldHVybmluZyBhbiBpbnQgKioqIgorICAgICAgICBzZWxmLmFkZERhdGFUb0RCKFsnYScsICdiJywgJ2MnXSkgICMgdGhpcyBzaG91bGQgcmFpc2UsIGJ1dC4uLgorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoKQorCisgICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl9iYWRfcmV0dXJuKHNlbGYpIDoKKyAgICAgICAgc2VsZi52ZXJpZnlTdGRlcnIoCisgICAgICAgICAgICAgICAgc2VsZi5fdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2JhZF9yZXR1cm4sCisgICAgICAgICAgICAgICAgcmUuY29tcGlsZSgnKF5UeXBlRXJyb3I6LiogcmV0dXJuIGFuIGludC4qKXsyfScsIHJlLk18cmUuUykKKyAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdF9jYW5ub3RfYXNzaWduX3R3aWNlKHNlbGYpIDoKKworICAgICAgICBkZWYgbXlfY29tcGFyZShhLCBiKSA6CisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgc2VsZi5jcmVhdGVEQihteV9jb21wYXJlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNlbGYuZGIuc2V0X2R1cF9jb21wYXJlLCBteV9jb21wYXJlKQorCitkZWYgdGVzdF9zdWl0ZSgpIDoKKyAgICByZXMgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgcmVzLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKENvbXBhcmF0b3JUZXN0cykpCisgICAgcmVzLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJ0cmVlRXhjZXB0aW9uc1Rlc3RDYXNlKSkKKyAgICByZXMuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQnRyZWVLZXlDb21wYXJlVGVzdENhc2UpKQorICAgIHJlcy5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEdXBsaWNhdGVFeGNlcHRpb25zVGVzdENhc2UpKQorICAgIHJlcy5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEdXBsaWNhdGVDb21wYXJlVGVzdENhc2UpKQorICAgIHJldHVybiByZXMKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0ID0gJ3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2NvbXBhcmUucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGFyZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNDU4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2NvbXBhcmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2NvbXBhcmUucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGFyZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNDU4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2NvbXBhcmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2NvbXBhdC5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2NvbXBhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc5ZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGF0LnB5CkBAIC0wLDAgKzEsMTg0IEBACisiIiIKK1Rlc3QgY2FzZXMgYWRhcHRlZCBmcm9tIHRoZSB0ZXN0X2JzZGRiLnB5IG1vZHVsZSBpbiBQeXRob24ncworcmVncmVzc2lvbiB0ZXN0IHN1aXRlLgorIiIiCisKK2ltcG9ydCBvcywgc3RyaW5nCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIGhhc2hvcGVuLCBidG9wZW4sIHJub3BlbiwgdmVyYm9zZSwgXAorICAgICAgICBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworCitjbGFzcyBDb21wYXRpYmlsaXR5VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGdldF9uZXdfZGF0YWJhc2VfcGF0aCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLmZpbGVuYW1lKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKworICAgIGRlZiB0ZXN0MDFfYnRvcGVuKHNlbGYpOgorICAgICAgICBzZWxmLmRvX2J0aGFzaF90ZXN0KGJ0b3BlbiwgJ2J0b3BlbicpCisKKyAgICBkZWYgdGVzdDAyX2hhc2hvcGVuKHNlbGYpOgorICAgICAgICBzZWxmLmRvX2J0aGFzaF90ZXN0KGhhc2hvcGVuLCAnaGFzaG9wZW4nKQorCisgICAgZGVmIHRlc3QwM19ybm9wZW4oc2VsZik6CisgICAgICAgIGRhdGEgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cuIi5zcGxpdCgpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiXG5UZXN0aW5nOiBybm9wZW4iCisKKyAgICAgICAgZiA9IHJub3BlbihzZWxmLmZpbGVuYW1lLCAnYycpCisgICAgICAgIGZvciB4IGluIHJhbmdlKGxlbihkYXRhKSk6CisgICAgICAgICAgICBmW3grMV0gPSBkYXRhW3hdCisKKyAgICAgICAgZ2V0VGVzdCA9IChmWzFdLCBmWzJdLCBmWzNdKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJyVzICVzICVzJyAlIGdldFRlc3QKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldFRlc3RbMV0sICdxdWljaycsICdkYXRhIG1pc21hdGNoIScpCisKKyAgICAgICAgcnYgPSBmLnNldF9sb2NhdGlvbigzKQorICAgICAgICBpZiBydiAhPSAoMywgJ2Jyb3duJyk6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3JlY25vIGRhdGFiYXNlIHNldF9sb2NhdGlvbiBmYWlsZWQ6ICcrcmVwcihydikpCisKKyAgICAgICAgZlsyNV0gPSAndHdlbnR5LWZpdmUnCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBkZWwgZgorCisgICAgICAgIGYgPSBybm9wZW4oc2VsZi5maWxlbmFtZSwgJ3cnKQorICAgICAgICBmWzIwXSA9ICd0d2VudHknCisKKyAgICAgICAgZGVmIG5vUmVjKGYpOgorICAgICAgICAgICAgcmVjID0gZlsxNV0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIG5vUmVjLCBmKQorCisgICAgICAgIGRlZiBiYWRLZXkoZik6CisgICAgICAgICAgICByZWMgPSBmWydhIHN0cmluZyddCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmFkS2V5LCBmKQorCisgICAgICAgIGRlbCBmWzNdCisKKyAgICAgICAgcmVjID0gZi5maXJzdCgpCisgICAgICAgIHdoaWxlIHJlYzoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVjID0gZi5uZXh0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIGYuY2xvc2UoKQorCisKKyAgICBkZWYgdGVzdDA0X25fZmxhZyhzZWxmKToKKyAgICAgICAgZiA9IGhhc2hvcGVuKHNlbGYuZmlsZW5hbWUsICduJykKKyAgICAgICAgZi5jbG9zZSgpCisKKworICAgIGRlZiBkb19idGhhc2hfdGVzdChzZWxmLCBmYWN0b3J5LCB3aGF0KToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcblRlc3Rpbmc6ICcsIHdoYXQKKworICAgICAgICBmID0gZmFjdG9yeShzZWxmLmZpbGVuYW1lLCAnYycpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnY3JlYXRpb24uLi4nCisKKyAgICAgICAgIyB0cnV0aCB0ZXN0CisgICAgICAgIGlmIGY6CisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAidHJ1dGggdGVzdDogdHJ1ZSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJ0cnV0aCB0ZXN0OiBmYWxzZSIKKworICAgICAgICBmWycwJ10gPSAnJworICAgICAgICBmWydhJ10gPSAnR3VpZG8nCisgICAgICAgIGZbJ2InXSA9ICd2YW4nCisgICAgICAgIGZbJ2MnXSA9ICdSb3NzdW0nCisgICAgICAgIGZbJ2QnXSA9ICdpbnZlbnRlZCcKKyAgICAgICAgIyAnZScgaW50ZW50aW9uYWxseSBsZWZ0IG91dAorICAgICAgICBmWydmJ10gPSAnUHl0aG9uJworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJyVzICVzICVzJyAlIChmWydhJ10sIGZbJ2InXSwgZlsnYyddKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAna2V5IG9yZGVyaW5nLi4uJworICAgICAgICBzdGFydCA9IGYuc2V0X2xvY2F0aW9uKGYuZmlyc3QoKVswXSkKKyAgICAgICAgaWYgc3RhcnQgIT0gKCcwJywgJycpOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJpbmNvcnJlY3QgZmlyc3QoKSByZXN1bHQ6ICIrcmVwcihzdGFydCkpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVjID0gZi5uZXh0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYywgZi5sYXN0KCksICdFcnJvciwgbGFzdCA8PiBsYXN0IScpCisgICAgICAgICAgICAgICAgZi5wcmV2aW91cygpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuaGFzX2tleSgnZicpLCAnRXJyb3IsIG1pc3Npbmcga2V5IScpCisKKyAgICAgICAgIyB0ZXN0IHRoYXQgc2V0X2xvY2F0aW9uKCkgcmV0dXJucyB0aGUgbmV4dCBuZWFyZXN0IGtleSwgdmFsdWUKKyAgICAgICAgIyBvbiBidHJlZSBkYXRhYmFzZXMgYW5kIHJhaXNlcyBLZXlFcnJvciBvbiBvdGhlcnMuCisgICAgICAgIGlmIGZhY3RvcnkgPT0gYnRvcGVuOgorICAgICAgICAgICAgZSA9IGYuc2V0X2xvY2F0aW9uKCdlJykKKyAgICAgICAgICAgIGlmIGUgIT0gKCdmJywgJ1B5dGhvbicpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnd3Jvbmcga2V5LHZhbHVlIHJldHVybmVkOiAnK3JlcHIoZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZSA9IGYuc2V0X2xvY2F0aW9uKCdlJykKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic2V0X2xvY2F0aW9uIG9uIG5vbi1leGlzdGVudCBrZXkgZGlkIG5vdCByYWlzZSBLZXlFcnJvciIpCisKKyAgICAgICAgZi5zeW5jKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICMgdHJ1dGggdGVzdAorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBmOgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJ0cnV0aCB0ZXN0OiB0cnVlIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAidHJ1dGggdGVzdDogZmFsc2UiCisgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJFeGNlcHRpb24gZXhwZWN0ZWQiKQorCisgICAgICAgIGRlbCBmCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdtb2RpZmljYXRpb24uLi4nCisgICAgICAgIGYgPSBmYWN0b3J5KHNlbGYuZmlsZW5hbWUsICd3JykKKyAgICAgICAgZlsnZCddID0gJ2Rpc2NvdmVyZWQnCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdhY2Nlc3MuLi4nCisgICAgICAgIGZvciBrZXkgaW4gZi5rZXlzKCk6CisgICAgICAgICAgICB3b3JkID0gZltrZXldCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IHdvcmQKKworICAgICAgICBkZWYgbm9SZWMoZik6CisgICAgICAgICAgICByZWMgPSBmWydubyBzdWNoIGtleSddCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBub1JlYywgZikKKworICAgICAgICBkZWYgYmFkS2V5KGYpOgorICAgICAgICAgICAgcmVjID0gZlsxNV0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiYWRLZXksIGYpCisKKyAgICAgICAgZi5jbG9zZSgpCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQ29tcGF0aWJpbGl0eVRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jb21wYXQucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGF0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDE1ZDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGF0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jb21wYXQucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGF0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDE1ZDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGF0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jdXJzb3JfcGdldF9idWcucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jdXJzb3JfcGdldF9idWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkM2RjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2N1cnNvcl9wZ2V0X2J1Zy5weQpAQCAtMCwwICsxLDU0IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcywgZ2xvYgorCitmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgdGVzdF9zdXBwb3J0LCBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgsIFwKKyAgICAgICAgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIHBnZXRfYnVnVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlZlcmlmeSB0aGF0IGN1cnNvci5wZ2V0IHdvcmtzIHByb3Blcmx5IiIiCisgICAgZGJfbmFtZSA9ICd0ZXN0LWN1cnNvcl9wZ2V0LmRiJworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICBzZWxmLmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wpCisgICAgICAgIHNlbGYucHJpbWFyeV9kYiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBzZWxmLnByaW1hcnlfZGIub3BlbihzZWxmLmRiX25hbWUsICdwcmltYXJ5JywgZGIuREJfQlRSRUUsIGRiLkRCX0NSRUFURSkKKyAgICAgICAgc2VsZi5zZWNvbmRhcnlfZGIgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgc2VsZi5zZWNvbmRhcnlfZGIuc2V0X2ZsYWdzKGRiLkRCX0RVUCkKKyAgICAgICAgc2VsZi5zZWNvbmRhcnlfZGIub3BlbihzZWxmLmRiX25hbWUsICdzZWNvbmRhcnknLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFKQorICAgICAgICBzZWxmLnByaW1hcnlfZGIuYXNzb2NpYXRlKHNlbGYuc2Vjb25kYXJ5X2RiLCBsYW1iZGEga2V5LCBkYXRhOiBkYXRhKQorICAgICAgICBzZWxmLnByaW1hcnlfZGIucHV0KCdzYWxhZCcsICdlZ2dzJykKKyAgICAgICAgc2VsZi5wcmltYXJ5X2RiLnB1dCgnc3BhbScsICdoYW0nKQorICAgICAgICBzZWxmLnByaW1hcnlfZGIucHV0KCdvbWVsZXQnLCAnZWdncycpCisKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5zZWNvbmRhcnlfZGIuY2xvc2UoKQorICAgICAgICBzZWxmLnByaW1hcnlfZGIuY2xvc2UoKQorICAgICAgICBzZWxmLmVudi5jbG9zZSgpCisgICAgICAgIGRlbCBzZWxmLnNlY29uZGFyeV9kYgorICAgICAgICBkZWwgc2VsZi5wcmltYXJ5X2RiCisgICAgICAgIGRlbCBzZWxmLmVudgorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKworICAgIGRlZiB0ZXN0X3BnZXQoc2VsZik6CisgICAgICAgIGN1cnNvciA9IHNlbGYuc2Vjb25kYXJ5X2RiLmN1cnNvcigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ2VnZ3MnLCAnc2FsYWQnLCAnZWdncycpLCBjdXJzb3IucGdldChrZXk9J2VnZ3MnLCBmbGFncz1kYi5EQl9TRVQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgnZWdncycsICdvbWVsZXQnLCAnZWdncycpLCBjdXJzb3IucGdldChkYi5EQl9ORVhUX0RVUCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgY3Vyc29yLnBnZXQoZGIuREJfTkVYVF9EVVApKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCdoYW0nLCAnc3BhbScsICdoYW0nKSwgY3Vyc29yLnBnZXQoJ2hhbScsICdzcGFtJywgZmxhZ3M9ZGIuREJfU0VUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBjdXJzb3IucGdldChkYi5EQl9ORVhUX0RVUCkpCisKKyAgICAgICAgY3Vyc29yLmNsb3NlKCkKKworCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUocGdldF9idWdUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2N1cnNvcl9wZ2V0X2J1Zy5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jdXJzb3JfcGdldF9idWcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzUwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jdXJzb3JfcGdldF9idWcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2N1cnNvcl9wZ2V0X2J1Zy5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jdXJzb3JfcGdldF9idWcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzUwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jdXJzb3JfcGdldF9idWcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RiLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjMTA5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RiLnB5CkBAIC0wLDAgKzEsMTYzIEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcywgZ2xvYgorCitmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgdGVzdF9zdXBwb3J0LCBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgsIFwKKyAgICAgICAgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIERCKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucGF0aCA9IGdldF9uZXdfZGF0YWJhc2VfcGF0aCgpCisgICAgICAgIHNlbGYuZGIgPSBkYi5EQigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZGIuY2xvc2UoKQorICAgICAgICBkZWwgc2VsZi5kYgorICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYucGF0aCkKKworY2xhc3MgREJfZ2VuZXJhbChEQikgOgorICAgIGRlZiB0ZXN0X2dldF9vcGVuX2ZsYWdzKHNlbGYpIDoKKyAgICAgICAgc2VsZi5kYi5vcGVuKHNlbGYucGF0aCwgZGJ0eXBlPWRiLkRCX0hBU0gsIGZsYWdzID0gZGIuREJfQ1JFQVRFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRiLkRCX0NSRUFURSwgc2VsZi5kYi5nZXRfb3Blbl9mbGFncygpKQorCisgICAgZGVmIHRlc3RfZ2V0X29wZW5fZmxhZ3MyKHNlbGYpIDoKKyAgICAgICAgc2VsZi5kYi5vcGVuKHNlbGYucGF0aCwgZGJ0eXBlPWRiLkRCX0hBU0gsIGZsYWdzID0gZGIuREJfQ1JFQVRFIHwKKyAgICAgICAgICAgICAgICBkYi5EQl9USFJFQUQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFELCBzZWxmLmRiLmdldF9vcGVuX2ZsYWdzKCkpCisKKyAgICBkZWYgdGVzdF9nZXRfZGJuYW1lX2ZpbGVuYW1lKHNlbGYpIDoKKyAgICAgICAgc2VsZi5kYi5vcGVuKHNlbGYucGF0aCwgZGJ0eXBlPWRiLkRCX0hBU0gsIGZsYWdzID0gZGIuREJfQ1JFQVRFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzZWxmLnBhdGgsIE5vbmUpLCBzZWxmLmRiLmdldF9kYm5hbWUoKSkKKworICAgIGRlZiB0ZXN0X2dldF9kYm5hbWVfZmlsZW5hbWVfZGF0YWJhc2Uoc2VsZikgOgorICAgICAgICBuYW1lID0gImpjZWEtcmFuZG9tLW5hbWUiCisgICAgICAgIHNlbGYuZGIub3BlbihzZWxmLnBhdGgsIGRibmFtZT1uYW1lLCBkYnR5cGU9ZGIuREJfSEFTSCwKKyAgICAgICAgICAgICAgICBmbGFncyA9IGRiLkRCX0NSRUFURSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoc2VsZi5wYXRoLCBuYW1lKSwgc2VsZi5kYi5nZXRfZGJuYW1lKCkpCisKKyAgICAgICAgZGVmIHRlc3RfYnRfbWlua2V5KHNlbGYpIDoKKyAgICAgICAgICAgIGZvciBpIGluIFsxNywgMTA4LCAxMDMwXSA6CisgICAgICAgICAgICAgICAgc2VsZi5kYi5zZXRfYnRfbWlua2V5KGkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmRiLmdldF9idF9taW5rZXkoKSkKKworICAgICAgICBkZWYgdGVzdF9sb3JkZXIoc2VsZikgOgorICAgICAgICAgICAgc2VsZi5kYi5zZXRfbG9yZGVyKDEyMzQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEyMzQsIHNlbGYuZGIuZ2V0X2xvcmRlcigpKQorICAgICAgICAgICAgc2VsZi5kYi5zZXRfbG9yZGVyKDQzMjEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQzMjEsIHNlbGYuZGIuZ2V0X2xvcmRlcigpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsIHNlbGYuZGIuc2V0X2xvcmRlciwgOTE4MikKKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNikgOgorICAgICAgICBkZWYgdGVzdF9wcmlvcml0eShzZWxmKSA6CisgICAgICAgICAgICBmbGFncyA9IFtkYi5EQl9QUklPUklUWV9WRVJZX0xPVywgZGIuREJfUFJJT1JJVFlfTE9XLAorICAgICAgICAgICAgICAgICAgICBkYi5EQl9QUklPUklUWV9ERUZBVUxULCBkYi5EQl9QUklPUklUWV9ISUdILAorICAgICAgICAgICAgICAgICAgICBkYi5EQl9QUklPUklUWV9WRVJZX0hJR0hdCisgICAgICAgICAgICBmb3IgZmxhZyBpbiBmbGFncyA6CisgICAgICAgICAgICAgICAgc2VsZi5kYi5zZXRfcHJpb3JpdHkoZmxhZykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWcsIHNlbGYuZGIuZ2V0X3ByaW9yaXR5KCkpCisKKyAgICBkZWYgdGVzdF9nZXRfdHJhbnNhY3Rpb25hbChzZWxmKSA6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5kYi5nZXRfdHJhbnNhY3Rpb25hbCgpKQorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5wYXRoLCBkYnR5cGU9ZGIuREJfSEFTSCwgZmxhZ3MgPSBkYi5EQl9DUkVBVEUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5kYi5nZXRfdHJhbnNhY3Rpb25hbCgpKQorCitjbGFzcyBEQl9oYXNoKERCKSA6CisgICAgZGVmIHRlc3RfaF9mZmFjdG9yKHNlbGYpIDoKKyAgICAgICAgZm9yIGZmYWN0b3IgaW4gWzQsIDE2LCAyNTZdIDoKKyAgICAgICAgICAgIHNlbGYuZGIuc2V0X2hfZmZhY3RvcihmZmFjdG9yKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmZmFjdG9yLCBzZWxmLmRiLmdldF9oX2ZmYWN0b3IoKSkKKworICAgIGRlZiB0ZXN0X2hfbmVsZW0oc2VsZikgOgorICAgICAgICBmb3IgbmVsZW0gaW4gWzEsIDIsIDRdIDoKKyAgICAgICAgICAgIG5lbGVtID0gbmVsZW0qMTAyNCoxMDI0ICAjIE1pbGxpb25zCisgICAgICAgICAgICBzZWxmLmRiLnNldF9oX25lbGVtKG5lbGVtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZWxlbSwgc2VsZi5kYi5nZXRfaF9uZWxlbSgpKQorCisgICAgZGVmIHRlc3RfcGFnZXNpemUoc2VsZikgOgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoOSwgMTcpIDogICMgRnJvbSA1MTIgdG8gNjU1MzYKKyAgICAgICAgICAgIGkgPSAxPDxpCisgICAgICAgICAgICBzZWxmLmRiLnNldF9wYWdlc2l6ZShpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmRiLmdldF9wYWdlc2l6ZSgpKQorCisgICAgICAgICMgVGhlIHZhbGlkIHZhbHVlcyBnb2VzIGZyb20gNTEyIHRvIDY1NTM2CisgICAgICAgICMgVGVzdCAxMzEwNzIgYnl0ZXMuLi4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsIHNlbGYuZGIuc2V0X3BhZ2VzaXplLCAxPDwxNykKKyAgICAgICAgIyBUZXN0IDI1NiBieXRlcy4uLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwgc2VsZi5kYi5zZXRfcGFnZXNpemUsIDE8PDgpCisKK2NsYXNzIERCX3R4bihEQikgOgorICAgIGRlZiBzZXRVcChzZWxmKSA6CisgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisgICAgICAgIHNlbGYuZW52ID0gZGIuREJFbnYoKQorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCB8CisgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9MT0cgfCBkYi5EQl9JTklUX1RYTikKKyAgICAgICAgc2VsZi5kYiA9IGRiLkRCKHNlbGYuZW52KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpIDoKKyAgICAgICAgc2VsZi5kYi5jbG9zZSgpCisgICAgICAgIGRlbCBzZWxmLmRiCisgICAgICAgIHNlbGYuZW52LmNsb3NlKCkKKyAgICAgICAgZGVsIHNlbGYuZW52CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCisgICAgICAgIGRlZiB0ZXN0X2ZsYWdzKHNlbGYpIDoKKyAgICAgICAgICAgIHNlbGYuZGIuc2V0X2ZsYWdzKGRiLkRCX0NIS1NVTSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGIuREJfQ0hLU1VNLCBzZWxmLmRiLmdldF9mbGFncygpKQorICAgICAgICAgICAgc2VsZi5kYi5zZXRfZmxhZ3MoZGIuREJfVFhOX05PVF9EVVJBQkxFKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYi5EQl9UWE5fTk9UX0RVUkFCTEUgfCBkYi5EQl9DSEtTVU0sCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGIuZ2V0X2ZsYWdzKCkpCisKKyAgICBkZWYgdGVzdF9nZXRfdHJhbnNhY3Rpb25hbChzZWxmKSA6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5kYi5nZXRfdHJhbnNhY3Rpb25hbCgpKQorICAgICAgICAjIERCX0FVVE9fQ09NTUlUID0gSW1wbGljaXQgdHJhbnNhY3Rpb24KKyAgICAgICAgc2VsZi5kYi5vcGVuKCJYWFgiLCBkYnR5cGU9ZGIuREJfSEFTSCwKKyAgICAgICAgICAgICAgICBmbGFncyA9IGRiLkRCX0NSRUFURSB8IGRiLkRCX0FVVE9fQ09NTUlUKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kYi5nZXRfdHJhbnNhY3Rpb25hbCgpKQorCitjbGFzcyBEQl9yZWNubyhEQikgOgorICAgIGRlZiB0ZXN0X3JlX3BhZChzZWxmKSA6CisgICAgICAgIGZvciBpIGluIFsnICcsICcqJ10gOiAgIyBDaGVjayBjaGFycworICAgICAgICAgICAgc2VsZi5kYi5zZXRfcmVfcGFkKGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yZChpKSwgc2VsZi5kYi5nZXRfcmVfcGFkKCkpCisgICAgICAgIGZvciBpIGluIFs5NywgNjVdIDogICMgQ2hlY2sgaW50ZWdlcnMKKyAgICAgICAgICAgIHNlbGYuZGIuc2V0X3JlX3BhZChpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmRiLmdldF9yZV9wYWQoKSkKKworICAgIGRlZiB0ZXN0X3JlX2RlbGltKHNlbGYpIDoKKyAgICAgICAgZm9yIGkgaW4gWycgJywgJyonXSA6ICAjIENoZWNrIGNoYXJzCisgICAgICAgICAgICBzZWxmLmRiLnNldF9yZV9kZWxpbShpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmQoaSksIHNlbGYuZGIuZ2V0X3JlX2RlbGltKCkpCisgICAgICAgIGZvciBpIGluIFs5NywgNjVdIDogICMgQ2hlY2sgaW50ZWdlcnMKKyAgICAgICAgICAgIHNlbGYuZGIuc2V0X3JlX2RlbGltKGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZGIuZ2V0X3JlX2RlbGltKCkpCisKKyAgICBkZWYgdGVzdF9yZV9zb3VyY2Uoc2VsZikgOgorICAgICAgICBmb3IgaSBpbiBbInRlc3QiLCAidGVzdDIiLCAidGVzdDMiXSA6CisgICAgICAgICAgICBzZWxmLmRiLnNldF9yZV9zb3VyY2UoaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgc2VsZi5kYi5nZXRfcmVfc291cmNlKCkpCisKK2NsYXNzIERCX3F1ZXVlKERCKSA6CisgICAgZGVmIHRlc3RfcmVfbGVuKHNlbGYpIDoKKyAgICAgICAgZm9yIGkgaW4gWzMzLCA2NSwgMzAwLCAyMDAwXSA6CisgICAgICAgICAgICBzZWxmLmRiLnNldF9yZV9sZW4oaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgc2VsZi5kYi5nZXRfcmVfbGVuKCkpCisKKyAgICBkZWYgdGVzdF9xX2V4dGVudHNpemUoc2VsZikgOgorICAgICAgICBmb3IgaSBpbiBbMSwgNjAsIDEwMF0gOgorICAgICAgICAgICAgc2VsZi5kYi5zZXRfcV9leHRlbnRzaXplKGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZGIuZ2V0X3FfZXh0ZW50c2l6ZSgpKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCX2dlbmVyYWwpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCX3R4bikpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJfaGFzaCkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJfcmVjbm8pKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCX3F1ZXVlKSkKKworICAgIHJldHVybiBzdWl0ZQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGIucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NzJhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGIucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NzJhMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJlbnYucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYmVudi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmVmN2RiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJlbnYucHkKQEAgLTAsMCArMSw1MjUgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zLCBnbG9iCisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCB0ZXN0X3N1cHBvcnQsIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgXAorICAgICAgICBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgREJFbnYodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5ob21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKyAgICAgICAgc2VsZi5lbnYgPSBkYi5EQkVudigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZW52LmNsb3NlKCkKKyAgICAgICAgZGVsIHNlbGYuZW52CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCitjbGFzcyBEQkVudl9nZW5lcmFsKERCRW52KSA6CisgICAgZGVmIHRlc3RfZ2V0X29wZW5fZmxhZ3Moc2VsZikgOgorICAgICAgICBmbGFncyA9IGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGZsYWdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWdzLCBzZWxmLmVudi5nZXRfb3Blbl9mbGFncygpKQorCisgICAgZGVmIHRlc3RfZ2V0X29wZW5fZmxhZ3MyKHNlbGYpIDoKKyAgICAgICAgZmxhZ3MgPSBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MIHwgXAorICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfTE9DSyB8IGRiLkRCX1RIUkVBRAorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZmxhZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhZ3MsIHNlbGYuZW52LmdldF9vcGVuX2ZsYWdzKCkpCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDcpIDoKKyAgICAgICAgZGVmIHRlc3RfbGtfcGFydGl0aW9ucyhzZWxmKSA6CisgICAgICAgICAgICBmb3IgaSBpbiBbMTAsIDIwLCA0MF0gOgorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9sa19wYXJ0aXRpb25zKGkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfbGtfcGFydGl0aW9ucygpKQorCisgICAgICAgIGRlZiB0ZXN0X2dldHNldF9pbnRlcm1lZGlhdGVfZGlyX21vZGUoc2VsZikgOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLmVudi5nZXRfaW50ZXJtZWRpYXRlX2Rpcl9tb2RlKCkpCisgICAgICAgICAgICBmb3IgbW9kZSBpbiBbInJ3eC0tLS0tLSIsICJydy1ydy1ydy0iLCAicnctci0tci0tIl0gOgorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9pbnRlcm1lZGlhdGVfZGlyX21vZGUobW9kZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZGUsIHNlbGYuZW52LmdldF9pbnRlcm1lZGlhdGVfZGlyX21vZGUoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfaW50ZXJtZWRpYXRlX2Rpcl9tb2RlLCAiYWJjZGUiKQorCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LCA2KSA6CisgICAgICAgIGRlZiB0ZXN0X3RocmVhZChzZWxmKSA6CisgICAgICAgICAgICBmb3IgaSBpbiBbMTYsIDEwMCwgMTAwMF0gOgorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF90aHJlYWRfY291bnQoaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZW52LmdldF90aHJlYWRfY291bnQoKSkKKworICAgICAgICBkZWYgdGVzdF9jYWNoZV9tYXgoc2VsZikgOgorICAgICAgICAgICAgZm9yIHNpemUgaW4gWzY0LCAxMjhdIDoKKyAgICAgICAgICAgICAgICBzaXplID0gc2l6ZSoxMDI0KjEwMjQgICMgTWVnYWJ5dGVzCisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2NhY2hlX21heCgwLCBzaXplKQorICAgICAgICAgICAgICAgIHNpemUyID0gc2VsZi5lbnYuZ2V0X2NhY2hlX21heCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzaXplMlswXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2l6ZSA8PSBzaXplMlsxXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMipzaXplID4gc2l6ZTJbMV0pCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDQpIDoKKyAgICAgICAgZGVmIHRlc3RfbXV0ZXhfc3RhdChzZWxmKSA6CisgICAgICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCB8CisgICAgICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfTE9DSykKKyAgICAgICAgICAgIHN0YXQgPSBzZWxmLmVudi5tdXRleF9zdGF0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgibXV0ZXhfaW51c2VfbWF4IiBpbiBzdGF0KQorCisgICAgICAgIGRlZiB0ZXN0X2xnX2ZpbGVtb2RlKHNlbGYpIDoKKyAgICAgICAgICAgIGZvciBpIGluIFswNjAwLCAwNjYwLCAwNjY2XSA6CisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2xnX2ZpbGVtb2RlKGkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfbGdfZmlsZW1vZGUoKSkKKworICAgIGRlZiB0ZXN0X21wX21heF9vcGVuZmQoc2VsZikgOgorICAgICAgICBmb3IgaSBpbiBbMTcsIDMxLCA0Ml0gOgorICAgICAgICAgICAgc2VsZi5lbnYuc2V0X21wX21heF9vcGVuZmQoaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgc2VsZi5lbnYuZ2V0X21wX21heF9vcGVuZmQoKSkKKworICAgIGRlZiB0ZXN0X21wX21heF93cml0ZShzZWxmKSA6CisgICAgICAgIGZvciBpIGluIFsxMDAsIDIwMCwgMzAwXSA6CisgICAgICAgICAgICBmb3IgaiBpbiBbMSwgMiwgM10gOgorICAgICAgICAgICAgICAgIGogKj0gMTAwMDAwMAorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9tcF9tYXhfd3JpdGUoaSwgaikKKyAgICAgICAgICAgICAgICB2PXNlbGYuZW52LmdldF9tcF9tYXhfd3JpdGUoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGksIGopLCB2KQorCisgICAgICAgIGRlZiB0ZXN0X2ludmFsaWRfdHhuKHNlbGYpIDoKKyAgICAgICAgICAgICMgVGhpcyBlbnZpcm9ubWVudCBkb2Vzbid0IHN1cHBvcnQgdHJhbnNhY3Rpb25zCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwgc2VsZi5lbnYudHhuX2JlZ2luKQorCisgICAgICAgIGRlZiB0ZXN0X21wX21tYXBzaXplKHNlbGYpIDoKKyAgICAgICAgICAgIGZvciBpIGluIFsxNiwgMzIsIDY0XSA6CisgICAgICAgICAgICAgICAgaSAqPSAxMDI0KjEwMjQKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfbXBfbW1hcHNpemUoaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZW52LmdldF9tcF9tbWFwc2l6ZSgpKQorCisgICAgICAgIGRlZiB0ZXN0X3RtcF9kaXIoc2VsZikgOgorICAgICAgICAgICAgZm9yIGkgaW4gWyJhIiwgImJiIiwgImNjYyJdIDoKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfdG1wX2RpcihpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgc2VsZi5lbnYuZ2V0X3RtcF9kaXIoKSkKKworICAgICAgICBkZWYgdGVzdF9mbGFncyhzZWxmKSA6CisgICAgICAgICAgICBzZWxmLmVudi5zZXRfZmxhZ3MoZGIuREJfQVVUT19DT01NSVQsIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRiLkRCX0FVVE9fQ09NTUlULCBzZWxmLmVudi5nZXRfZmxhZ3MoKSkKKyAgICAgICAgICAgIHNlbGYuZW52LnNldF9mbGFncyhkYi5EQl9UWE5fTk9TWU5DLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYi5EQl9BVVRPX0NPTU1JVCB8IGRiLkRCX1RYTl9OT1NZTkMsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW52LmdldF9mbGFncygpKQorICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2ZsYWdzKGRiLkRCX0FVVE9fQ09NTUlULCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYi5EQl9UWE5fTk9TWU5DLCBzZWxmLmVudi5nZXRfZmxhZ3MoKSkKKyAgICAgICAgICAgIHNlbGYuZW52LnNldF9mbGFncyhkYi5EQl9UWE5fTk9TWU5DLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLmVudi5nZXRfZmxhZ3MoKSkKKworICAgICAgICBkZWYgdGVzdF9sa19tYXhfb2JqZWN0cyhzZWxmKSA6CisgICAgICAgICAgICBmb3IgaSBpbiBbMTAwMCwgMjAwMCwgMzAwMF0gOgorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9sa19tYXhfb2JqZWN0cyhpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgc2VsZi5lbnYuZ2V0X2xrX21heF9vYmplY3RzKCkpCisKKyAgICAgICAgZGVmIHRlc3RfbGtfbWF4X2xvY2tzKHNlbGYpIDoKKyAgICAgICAgICAgIGZvciBpIGluIFsxMDAwLCAyMDAwLCAzMDAwXSA6CisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2xrX21heF9sb2NrcyhpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgc2VsZi5lbnYuZ2V0X2xrX21heF9sb2NrcygpKQorCisgICAgICAgIGRlZiB0ZXN0X2xrX21heF9sb2NrZXJzKHNlbGYpIDoKKyAgICAgICAgICAgIGZvciBpIGluIFsxMDAwLCAyMDAwLCAzMDAwXSA6CisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2xrX21heF9sb2NrZXJzKGkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfbGtfbWF4X2xvY2tlcnMoKSkKKworICAgICAgICBkZWYgdGVzdF9sZ19yZWdpb25tYXgoc2VsZikgOgorICAgICAgICAgICAgZm9yIGkgaW4gWzEyOCwgMjU2LCAxMDAwXSA6CisgICAgICAgICAgICAgICAgaSA9IGkqMTAyNCoxMDI0CisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2xnX3JlZ2lvbm1heChpKQorICAgICAgICAgICAgICAgIGogPSBzZWxmLmVudi5nZXRfbGdfcmVnaW9ubWF4KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaSA8PSBqKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyKmkgPiBqKQorCisgICAgICAgIGRlZiB0ZXN0X2xrX2RldGVjdChzZWxmKSA6CisgICAgICAgICAgICBmbGFncz0gW2RiLkRCX0xPQ0tfREVGQVVMVCwgZGIuREJfTE9DS19FWFBJUkUsIGRiLkRCX0xPQ0tfTUFYTE9DS1MsCisgICAgICAgICAgICAgICAgICAgIGRiLkRCX0xPQ0tfTUlOTE9DS1MsIGRiLkRCX0xPQ0tfTUlOV1JJVEUsCisgICAgICAgICAgICAgICAgICAgIGRiLkRCX0xPQ0tfT0xERVNULCBkYi5EQl9MT0NLX1JBTkRPTSwgZGIuREJfTE9DS19ZT1VOR0VTVF0KKworICAgICAgICAgICAgZmxhZ3MuYXBwZW5kKGRiLkRCX0xPQ0tfTUFYV1JJVEUpCisKKyAgICAgICAgICAgIGZvciBpIGluIGZsYWdzIDoKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfbGtfZGV0ZWN0KGkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfbGtfZGV0ZWN0KCkpCisKKyAgICAgICAgZGVmIHRlc3RfbGdfZGlyKHNlbGYpIDoKKyAgICAgICAgICAgIGZvciBpIGluIFsiYSIsICJiYiIsICJjY2MiLCAiZGRkZCJdIDoKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfbGdfZGlyKGkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfbGdfZGlyKCkpCisKKyAgICAgICAgZGVmIHRlc3RfbGdfYnNpemUoc2VsZikgOgorICAgICAgICAgICAgbG9nX3NpemUgPSA3MCoxMDI0CisgICAgICAgICAgICBzZWxmLmVudi5zZXRfbGdfYnNpemUobG9nX3NpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5lbnYuZ2V0X2xnX2JzaXplKCkgPj0gbG9nX3NpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5lbnYuZ2V0X2xnX2JzaXplKCkgPCA0KmxvZ19zaXplKQorICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2xnX2JzaXplKDQqbG9nX3NpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5lbnYuZ2V0X2xnX2JzaXplKCkgPj0gNCpsb2dfc2l6ZSkKKworICAgICAgICBkZWYgdGVzdF9zZXRnZXRfZGF0YV9kaXJzKHNlbGYpIDoKKyAgICAgICAgICAgIGRpcnMgPSAoImEiLCAiYiIsICJjIiwgImQiKQorICAgICAgICAgICAgZm9yIGkgaW4gZGlycyA6CisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2RhdGFfZGlyKGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcnMsIHNlbGYuZW52LmdldF9kYXRhX2RpcnMoKSkKKworICAgICAgICBkZWYgdGVzdF9zZXRnZXRfY2FjaGVzaXplKHNlbGYpIDoKKyAgICAgICAgICAgIGNhY2hlc2l6ZSA9ICgwLCA1MTIqMTAyNCoxMDI0LCAzKQorICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2NhY2hlc2l6ZSgqY2FjaGVzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWNoZXNpemUsIHNlbGYuZW52LmdldF9jYWNoZXNpemUoKSkKKworICAgICAgICAgICAgY2FjaGVzaXplID0gKDAsIDEqMTAyNCoxMDI0LCA1KQorICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2NhY2hlc2l6ZSgqY2FjaGVzaXplKQorICAgICAgICAgICAgY2FjaGVzaXplMiA9IHNlbGYuZW52LmdldF9jYWNoZXNpemUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWNoZXNpemVbMF0sIGNhY2hlc2l6ZTJbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhY2hlc2l6ZVsyXSwgY2FjaGVzaXplMlsyXSkKKyAgICAgICAgICAgICMgQmVya2VsZXkgREIgZXhwYW5kcyB0aGUgY2FjaGUgMjUlIGFjY291bnRpbmcgb3ZlcmhlYWQsCisgICAgICAgICAgICAjIGlmIHRoZSBjYWNoZSBpcyBzbWFsbC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTI1LCBpbnQoMTAwLjAqY2FjaGVzaXplMlsxXS9jYWNoZXNpemVbMV0pKQorCisgICAgICAgICAgICAjIFlvdSBjYW4gbm90IGNoYW5nZSBjb25maWd1cmF0aW9uIGFmdGVyIG9wZW5pbmcKKyAgICAgICAgICAgICMgdGhlIGVudmlyb25tZW50LgorICAgICAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wpCisgICAgICAgICAgICBjYWNoZXNpemUgPSAoMCwgMioxMDI0KjEwMjQsIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9jYWNoZXNpemUsICpjYWNoZXNpemUpCisgICAgICAgICAgICBjYWNoZXNpemUzID0gc2VsZi5lbnYuZ2V0X2NhY2hlc2l6ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhY2hlc2l6ZTJbMF0sIGNhY2hlc2l6ZTNbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhY2hlc2l6ZTJbMl0sIGNhY2hlc2l6ZTNbMl0pCisgICAgICAgICAgICAjIEluIEJlcmtlbGV5IERCIDUuMSwgdGhlIGNhY2hlc2l6ZSBjYW4gY2hhbmdlIHdoZW4gb3BlbmluZyB0aGUgRW52CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2FjaGVzaXplMlsxXSA8PSBjYWNoZXNpemUzWzFdKQorCisgICAgICAgIGRlZiB0ZXN0X3NldF9jYWNoZXNpemVfZGJlbnZfZGIoc2VsZikgOgorICAgICAgICAgICAgIyBZb3UgY2FuIG5vdCBjb25maWd1cmUgdGhlIGNhY2hlc2l6ZSB1c2luZworICAgICAgICAgICAgIyB0aGUgZGF0YWJhc2UgaGFuZGxlLCBpZiB5b3UgYXJlIHVzaW5nIGFuIGVudmlyb25tZW50LgorICAgICAgICAgICAgZCA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsCisgICAgICAgICAgICAgICAgZC5zZXRfY2FjaGVzaXplLCAwLCAxMDI0KjEwMjQsIDEpCisKKyAgICAgICAgZGVmIHRlc3Rfc2V0Z2V0X3NobV9rZXkoc2VsZikgOgorICAgICAgICAgICAgc2htX2tleT0xMzcKKyAgICAgICAgICAgIHNlbGYuZW52LnNldF9zaG1fa2V5KHNobV9rZXkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNobV9rZXksIHNlbGYuZW52LmdldF9zaG1fa2V5KCkpCisgICAgICAgICAgICBzZWxmLmVudi5zZXRfc2htX2tleShzaG1fa2V5KzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNobV9rZXkrMSwgc2VsZi5lbnYuZ2V0X3NobV9rZXkoKSkKKworICAgICAgICAgICAgIyBZb3UgY2FuIG5vdCBjaGFuZ2UgY29uZmlndXJhdGlvbiBhZnRlciBvcGVuaW5nCisgICAgICAgICAgICAjIHRoZSBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MKQorICAgICAgICAgICAgIyBJZiB3ZSB0cnkgdG8gcmVjb25maWd1cmUgY2FjaGUgYWZ0ZXIgb3BlbmluZyB0aGUKKyAgICAgICAgICAgICMgZW52aXJvbm1lbnQsIGNvcmUgZHVtcC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLAorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9zaG1fa2V5LCBzaG1fa2V5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG1fa2V5KzEsIHNlbGYuZW52LmdldF9zaG1fa2V5KCkpCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDQpIDoKKyAgICAgICAgZGVmIHRlc3RfbXV0ZXhfc2V0Z2V0X21heChzZWxmKSA6CisgICAgICAgICAgICB2ID0gc2VsZi5lbnYubXV0ZXhfZ2V0X21heCgpCisgICAgICAgICAgICB2MiA9IHYqMisxCisKKyAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF9tYXgodjIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYyLCBzZWxmLmVudi5tdXRleF9nZXRfbWF4KCkpCisKKyAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF9tYXgodikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgc2VsZi5lbnYubXV0ZXhfZ2V0X21heCgpKQorCisgICAgICAgICAgICAjIFlvdSBjYW4gbm90IGNoYW5nZSBjb25maWd1cmF0aW9uIGFmdGVyIG9wZW5pbmcKKyAgICAgICAgICAgICMgdGhlIGVudmlyb25tZW50LgorICAgICAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmVudi5tdXRleF9zZXRfbWF4LCB2MikKKworICAgICAgICBkZWYgdGVzdF9tdXRleF9zZXRnZXRfaW5jcmVtZW50KHNlbGYpIDoKKyAgICAgICAgICAgIHYgPSBzZWxmLmVudi5tdXRleF9nZXRfaW5jcmVtZW50KCkKKyAgICAgICAgICAgIHYyID0gMTI3CisKKyAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF9pbmNyZW1lbnQodjIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYyLCBzZWxmLmVudi5tdXRleF9nZXRfaW5jcmVtZW50KCkpCisKKyAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF9pbmNyZW1lbnQodikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgc2VsZi5lbnYubXV0ZXhfZ2V0X2luY3JlbWVudCgpKQorCisgICAgICAgICAgICAjIFlvdSBjYW4gbm90IGNoYW5nZSBjb25maWd1cmF0aW9uIGFmdGVyIG9wZW5pbmcKKyAgICAgICAgICAgICMgdGhlIGVudmlyb25tZW50LgorICAgICAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmVudi5tdXRleF9zZXRfaW5jcmVtZW50LCB2MikKKworICAgICAgICBkZWYgdGVzdF9tdXRleF9zZXRnZXRfdGFzX3NwaW5zKHNlbGYpIDoKKyAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF90YXNfc3BpbnMoMCkgICMgRGVmYXVsdCA9IEJEQiBkZWNpZGVzCisgICAgICAgICAgICB2ID0gc2VsZi5lbnYubXV0ZXhfZ2V0X3Rhc19zcGlucygpCisgICAgICAgICAgICB2MiA9IHYqMisxCisKKyAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF90YXNfc3BpbnModjIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYyLCBzZWxmLmVudi5tdXRleF9nZXRfdGFzX3NwaW5zKCkpCisKKyAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF90YXNfc3BpbnModikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgc2VsZi5lbnYubXV0ZXhfZ2V0X3Rhc19zcGlucygpKQorCisgICAgICAgICAgICAjIEluIHRoaXMgY2FzZSwgeW91IGNhbiBjaGFuZ2UgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgIyBhZnRlciBvcGVuaW5nIHRoZSBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUpCisgICAgICAgICAgICBzZWxmLmVudi5tdXRleF9zZXRfdGFzX3NwaW5zKHYyKQorCisgICAgICAgIGRlZiB0ZXN0X211dGV4X3NldGdldF9hbGlnbihzZWxmKSA6CisgICAgICAgICAgICB2ID0gc2VsZi5lbnYubXV0ZXhfZ2V0X2FsaWduKCkKKyAgICAgICAgICAgIHYyID0gNjQKKyAgICAgICAgICAgIGlmIHYgPT0gNjQgOgorICAgICAgICAgICAgICAgIHYyID0gMTI4CisKKyAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF9hbGlnbih2MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodjIsIHNlbGYuZW52Lm11dGV4X2dldF9hbGlnbigpKQorCisgICAgICAgICAgICAjIFJlcXVpcmVzIGEgbm9uemVybyBwb3dlciBvZiB0d28KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmVudi5tdXRleF9zZXRfYWxpZ24sIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnYubXV0ZXhfc2V0X2FsaWduLCAxNykKKworICAgICAgICAgICAgc2VsZi5lbnYubXV0ZXhfc2V0X2FsaWduKDIqdjIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIqdjIsIHNlbGYuZW52Lm11dGV4X2dldF9hbGlnbigpKQorCisgICAgICAgICAgICAjIFlvdSBjYW4gbm90IGNoYW5nZSBjb25maWd1cmF0aW9uIGFmdGVyIG9wZW5pbmcKKyAgICAgICAgICAgICMgdGhlIGVudmlyb25tZW50LgorICAgICAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmVudi5tdXRleF9zZXRfYWxpZ24sIHYyKQorCisKK2NsYXNzIERCRW52X2xvZyhEQkVudikgOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgREJFbnYuc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPRykKKworICAgIGRlZiB0ZXN0X2xvZ19maWxlKHNlbGYpIDoKKyAgICAgICAgbG9nX2ZpbGUgPSBzZWxmLmVudi5sb2dfZmlsZSgoMSwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImxvZy4wMDAwMDAwMDAxIiwgbG9nX2ZpbGVbLTE0Ol0pCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDQpIDoKKyAgICAgICAgIyBUaGUgdmVyc2lvbiB3aXRoIHRyYW5zYWN0aW9ucyBpcyBjaGVja2VkIGluIG90aGVyIHRlc3Qgb2JqZWN0CisgICAgICAgIGRlZiB0ZXN0X2xvZ19wcmludGYoc2VsZikgOgorICAgICAgICAgICAgbXNnID0gIlRoaXMgaXMgYSB0ZXN0Li4uIgorICAgICAgICAgICAgc2VsZi5lbnYubG9nX3ByaW50Zihtc2cpCisgICAgICAgICAgICBsb2djID0gc2VsZi5lbnYubG9nX2N1cnNvcigpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnIGluIChsb2djLmxhc3QoKVsxXSkpCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDcpIDoKKyAgICAgICAgZGVmIHRlc3RfbG9nX2NvbmZpZyhzZWxmKSA6CisgICAgICAgICAgICBzZWxmLmVudi5sb2dfc2V0X2NvbmZpZyhkYi5EQl9MT0dfRFNZTkMgfCBkYi5EQl9MT0dfWkVSTywgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmVudi5sb2dfZ2V0X2NvbmZpZyhkYi5EQl9MT0dfRFNZTkMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZW52LmxvZ19nZXRfY29uZmlnKGRiLkRCX0xPR19aRVJPKSkKKyAgICAgICAgICAgIHNlbGYuZW52LmxvZ19zZXRfY29uZmlnKGRiLkRCX0xPR19aRVJPLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZW52LmxvZ19nZXRfY29uZmlnKGRiLkRCX0xPR19EU1lOQykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZW52LmxvZ19nZXRfY29uZmlnKGRiLkRCX0xPR19aRVJPKSkKKworCitjbGFzcyBEQkVudl9sb2dfdHhuKERCRW52KSA6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBEQkVudi5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCB8CisgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9MT0cgfCBkYi5EQl9JTklUX1RYTikKKworICAgIGlmIChkYi52ZXJzaW9uKCkgPj0gKDQsIDUpKSBhbmQgKGRiLnZlcnNpb24oKSA8ICg1LCAyKSkgOgorICAgICAgICBkZWYgdGVzdF90eF9tYXgoc2VsZikgOgorICAgICAgICAgICAgdHhucz1bXQorICAgICAgICAgICAgZGVmIHR4KCkgOgorICAgICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLmVudi5nZXRfdHhfbWF4KCkpIDoKKyAgICAgICAgICAgICAgICAgICAgdHhucy5hcHBlbmQoc2VsZi5lbnYudHhuX2JlZ2luKCkpCisKKyAgICAgICAgICAgIHR4KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE1lbW9yeUVycm9yLCB0eCkKKworICAgICAgICAgICAgIyBBYm9ydCB0aGUgdHJhbnNhY3Rpb25zIGJlZm9yZSBnYXJiYWdlIGNvbGxlY3Rpb24sCisgICAgICAgICAgICAjIHRvIGF2b2lkICJ3YXJuaW5ncyIuCisgICAgICAgICAgICBmb3IgaSBpbiB0eG5zIDoKKyAgICAgICAgICAgICAgICBpLmFib3J0KCkKKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNCkgOgorICAgICAgICAjIFRoZSB2ZXJzaW9uIHdpdGhvdXQgdHJhbnNhY3Rpb25zIGlzIGNoZWNrZWQgaW4gb3RoZXIgdGVzdCBvYmplY3QKKyAgICAgICAgZGVmIHRlc3RfbG9nX3ByaW50ZihzZWxmKSA6CisgICAgICAgICAgICBtc2cgPSAiVGhpcyBpcyBhIHRlc3QuLi4iCisgICAgICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICAgICAgc2VsZi5lbnYubG9nX3ByaW50Zihtc2csIHR4bj10eG4pCisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgIGxvZ2MgPSBzZWxmLmVudi5sb2dfY3Vyc29yKCkKKyAgICAgICAgICAgIGxvZ2MubGFzdCgpICAjIFNraXAgdGhlIGNvbW1pdAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZyBpbiAobG9nYy5wcmV2KClbMV0pKQorCisgICAgICAgICAgICBtc2cgPSAiVGhpcyBpcyBhbm90aGVyIHRlc3QuLi4iCisgICAgICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICAgICAgc2VsZi5lbnYubG9nX3ByaW50Zihtc2csIHR4bj10eG4pCisgICAgICAgICAgICB0eG4uYWJvcnQoKSAgIyBEbyBub3Qgc3RvcmUgdGhlIG5ldyBtZXNzYWdlCisgICAgICAgICAgICBsb2djLmxhc3QoKSAgIyBTa2lwIHRoZSBhYm9ydAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZyBub3QgaW4gKGxvZ2MucHJldigpWzFdKSkKKworICAgICAgICAgICAgbXNnID0gIlRoaXMgaXMgYSB0aGlyZCB0ZXN0Li4uIgorICAgICAgICAgICAgdHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKCkKKyAgICAgICAgICAgIHNlbGYuZW52LmxvZ19wcmludGYobXNnLCB0eG49dHhuKQorICAgICAgICAgICAgdHhuLmNvbW1pdCgpICAjIERvIG5vdCBzdG9yZSB0aGUgbmV3IG1lc3NhZ2UKKyAgICAgICAgICAgIGxvZ2MubGFzdCgpICAjIFNraXAgdGhlIGNvbW1pdAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZyBpbiAobG9nYy5wcmV2KClbMV0pKQorCisKK2NsYXNzIERCRW52X21lbXAoREJFbnYpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgREJFbnYuc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPRykKKyAgICAgICAgc2VsZi5kYiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBzZWxmLmRiLm9wZW4oInRlc3QiLCBkYi5EQl9IQVNILCBkYi5EQl9DUkVBVEUsIDA2NjApCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZGIuY2xvc2UoKQorICAgICAgICBkZWwgc2VsZi5kYgorICAgICAgICBEQkVudi50ZWFyRG93bihzZWxmKQorCisgICAgZGVmIHRlc3RfbWVtcF8xX3RyaWNrbGUoc2VsZikgOgorICAgICAgICBzZWxmLmRiLnB1dCgiaGkiLCAiYnllIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZW52Lm1lbXBfdHJpY2tsZSgxMDApID4gMCkKKworIyBQcmVzZXJ2ZSB0aGUgb3JkZXIsIGRvICJtZW1wX3RyaWNrbGUiIHRlc3QgZmlyc3QKKyAgICBkZWYgdGVzdF9tZW1wXzJfc3luYyhzZWxmKSA6CisgICAgICAgIHNlbGYuZGIucHV0KCJoaSIsICJieWUiKQorICAgICAgICBzZWxmLmVudi5tZW1wX3N5bmMoKSAgIyBGdWxsIGZsdXNoCisgICAgICAgICMgTm90aGluZyB0byBkby4uLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5lbnYubWVtcF90cmlja2xlKDEwMCkgPT0gMCkKKworICAgICAgICBzZWxmLmRiLnB1dCgiaGkiLCAiYnllMiIpCisgICAgICAgIHNlbGYuZW52Lm1lbXBfc3luYygoMSwgMCkpICAjIE5PUCwgcHJvYmFibHkKKyAgICAgICAgIyBTb21ldGhpbmcgdG8gZG8uLi4gb3Igbm90CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmVudi5tZW1wX3RyaWNrbGUoMTAwKSA+PSAwKQorCisgICAgICAgIHNlbGYuZGIucHV0KCJoaSIsICJieWUzIikKKyAgICAgICAgc2VsZi5lbnYubWVtcF9zeW5jKCgxMjMsIDk5KSkgICMgRnVsbCBmbHVzaAorICAgICAgICAjIE5vdGhpbmcgdG8gZG8uLi4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZW52Lm1lbXBfdHJpY2tsZSgxMDApID09IDApCisKKyAgICBkZWYgdGVzdF9tZW1wX3N0YXRfMShzZWxmKSA6CisgICAgICAgIHN0YXRzID0gc2VsZi5lbnYubWVtcF9zdGF0KCkgICMgTm8gcGFyYW0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzdGF0cyk9PTIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiY2FjaGVfbWlzcyIgaW4gc3RhdHNbMF0pCisgICAgICAgIHN0YXRzID0gc2VsZi5lbnYubWVtcF9zdGF0KGRiLkRCX1NUQVRfQ0xFQVIpICAjIFBvc2l0aW9uYWwgcGFyYW0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJjYWNoZV9taXNzIiBpbiBzdGF0c1swXSkKKyAgICAgICAgc3RhdHMgPSBzZWxmLmVudi5tZW1wX3N0YXQoZmxhZ3M9MCkgICMgS2V5d29yZCBwYXJhbQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImNhY2hlX21pc3MiIGluIHN0YXRzWzBdKQorCisgICAgZGVmIHRlc3RfbWVtcF9zdGF0XzIoc2VsZikgOgorICAgICAgICBzdGF0cz1zZWxmLmVudi5tZW1wX3N0YXQoKVsxXQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHN0YXRzKSk9PTEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJ0ZXN0IiBpbiBzdGF0cykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJwYWdlX2luIiBpbiBzdGF0c1sidGVzdCJdKQorCitjbGFzcyBEQkVudl9sb2djdXJzb3IoREJFbnYpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgREJFbnYuc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wgfAorICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfTE9HIHwgZGIuREJfSU5JVF9UWE4pCisgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgIHNlbGYuZGIgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgc2VsZi5kYi5vcGVuKCJ0ZXN0IiwgZGIuREJfSEFTSCwgZGIuREJfQ1JFQVRFLCAwNjYwLCB0eG49dHhuKQorICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgZm9yIGkgaW4gWyIyIiwgIjgiLCAiMjAiXSA6CisgICAgICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICAgICAgc2VsZi5kYi5wdXQoa2V5ID0gaSwgZGF0YSA9IGkqaW50KGkpLCB0eG49dHhuKQorICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZGIuY2xvc2UoKQorICAgICAgICBkZWwgc2VsZi5kYgorICAgICAgICBEQkVudi50ZWFyRG93bihzZWxmKQorCisgICAgZGVmIF9jaGVja19yZXR1cm4oc2VsZiwgdmFsdWUpIDoKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWUpLCAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2YWx1ZVswXSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZVswXSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZhbHVlWzBdWzBdLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2YWx1ZVswXVsxXSwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmFsdWVbMV0sIHN0cikpCisKKyAgICAjIFByZXNlcnZlIHRlc3Qgb3JkZXIKKyAgICBkZWYgdGVzdF8xX2ZpcnN0KHNlbGYpIDoKKyAgICAgICAgbG9nYyA9IHNlbGYuZW52LmxvZ19jdXJzb3IoKQorICAgICAgICB2ID0gbG9nYy5maXJzdCgpCisgICAgICAgIHNlbGYuX2NoZWNrX3JldHVybih2KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKDEsIDEpIDwgdlswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih2WzFdKT4wKQorCisgICAgZGVmIHRlc3RfMl9sYXN0KHNlbGYpIDoKKyAgICAgICAgbG9nYyA9IHNlbGYuZW52LmxvZ19jdXJzb3IoKQorICAgICAgICBsc25fZmlyc3QgPSBsb2djLmZpcnN0KClbMF0KKyAgICAgICAgdiA9IGxvZ2MubGFzdCgpCisgICAgICAgIHNlbGYuX2NoZWNrX3JldHVybih2KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobHNuX2ZpcnN0IDwgdlswXSkKKworICAgIGRlZiB0ZXN0XzNfbmV4dChzZWxmKSA6CisgICAgICAgIGxvZ2MgPSBzZWxmLmVudi5sb2dfY3Vyc29yKCkKKyAgICAgICAgbHNuX2xhc3QgPSBsb2djLmxhc3QoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZ2MubmV4dCgpLCBOb25lKQorICAgICAgICBsc25fZmlyc3QgPSBsb2djLmZpcnN0KClbMF0KKyAgICAgICAgdiA9IGxvZ2MubmV4dCgpCisgICAgICAgIHNlbGYuX2NoZWNrX3JldHVybih2KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobHNuX2ZpcnN0IDwgdlswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxzbl9sYXN0ID4gdlswXSkKKworICAgICAgICB2MiA9IGxvZ2MubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2MlswXSA+IHZbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsc25fbGFzdCA+IHYyWzBdKQorCisgICAgICAgIHYzID0gbG9nYy5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYzWzBdID4gdjJbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsc25fbGFzdCA+IHYzWzBdKQorCisgICAgZGVmIHRlc3RfNF9wcmV2KHNlbGYpIDoKKyAgICAgICAgbG9nYyA9IHNlbGYuZW52LmxvZ19jdXJzb3IoKQorICAgICAgICBsc25fZmlyc3QgPSBsb2djLmZpcnN0KClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2djLnByZXYoKSwgTm9uZSkKKyAgICAgICAgbHNuX2xhc3QgPSBsb2djLmxhc3QoKVswXQorICAgICAgICB2ID0gbG9nYy5wcmV2KCkKKyAgICAgICAgc2VsZi5fY2hlY2tfcmV0dXJuKHYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsc25fZmlyc3QgPCB2WzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobHNuX2xhc3QgPiB2WzBdKQorCisgICAgICAgIHYyID0gbG9nYy5wcmV2KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYyWzBdIDwgdlswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxzbl9maXJzdCA8IHYyWzBdKQorCisgICAgICAgIHYzID0gbG9nYy5wcmV2KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYzWzBdIDwgdjJbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsc25fZmlyc3QgPCB2M1swXSkKKworICAgIGRlZiB0ZXN0XzVfY3VycmVudChzZWxmKSA6CisgICAgICAgIGxvZ2MgPSBzZWxmLmVudi5sb2dfY3Vyc29yKCkKKyAgICAgICAgbG9nYy5maXJzdCgpCisgICAgICAgIHYgPSBsb2djLm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIGxvZ2MuY3VycmVudCgpKQorCisgICAgZGVmIHRlc3RfNl9zZXQoc2VsZikgOgorICAgICAgICBsb2djID0gc2VsZi5lbnYubG9nX2N1cnNvcigpCisgICAgICAgIGxvZ2MuZmlyc3QoKQorICAgICAgICB2ID0gbG9nYy5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh2LCBsb2djLm5leHQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh2LCBsb2djLm5leHQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCBsb2djLnNldCh2WzBdKSkKKworICAgIGRlZiB0ZXN0X2V4cGxpY2l0X2Nsb3NlKHNlbGYpIDoKKyAgICAgICAgbG9nYyA9IHNlbGYuZW52LmxvZ19jdXJzb3IoKQorICAgICAgICBsb2djLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJDdXJzb3JDbG9zZWRFcnJvciwgbG9nYy5uZXh0KQorCisgICAgZGVmIHRlc3RfaW1wbGljaXRfY2xvc2Uoc2VsZikgOgorICAgICAgICBsb2djID0gIFtzZWxmLmVudi5sb2dfY3Vyc29yKCkgZm9yIGkgaW4geHJhbmdlKDEwKV0KKyAgICAgICAgc2VsZi5lbnYuY2xvc2UoKSAgIyBUaGlzIGNsb3NlIHNob3VsZCBjbG9zZSB0b28gYWxsIGl0cyB0cmVlCisgICAgICAgIGZvciBpIGluIGxvZ2MgOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJDdXJzb3JDbG9zZWRFcnJvciwgaS5uZXh0KQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCRW52X2dlbmVyYWwpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCRW52X21lbXApKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCRW52X2xvZ2N1cnNvcikpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJFbnZfbG9nKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEQkVudl9sb2dfdHhuKSkKKworICAgIHJldHVybiBzdWl0ZQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJlbnYucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJlbnYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmQ4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYmVudi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJlbnYucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJlbnYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NmQ4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYmVudi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJvYmoucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYm9iai5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzAxYTVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJvYmoucHkKQEAgLTAsMCArMSw3MCBAQAorCitpbXBvcnQgb3MsIHN0cmluZworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCBkYm9iaiwgdGVzdF9zdXBwb3J0LCBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgsIFwKKyAgICAgICAgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIGRib2JqVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlZlcmlmeSB0aGF0IGRib2JqLkRCIGFuZCBkYm9iai5EQkVudiB3b3JrIHByb3Blcmx5IiIiCisgICAgZGJfbmFtZSA9ICd0ZXN0LWRib2JqLmRiJworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdkYicpOgorICAgICAgICAgICAgZGVsIHNlbGYuZGIKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnZW52Jyk6CisgICAgICAgICAgICBkZWwgc2VsZi5lbnYKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCisKKyAgICBkZWYgdGVzdDAxX2JvdGgoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3REQkVudihkYm9iai5EQkVudik6IHBhc3MKKyAgICAgICAgY2xhc3MgVGVzdERCKGRib2JqLkRCKToKKyAgICAgICAgICAgIGRlZiBwdXQoc2VsZiwga2V5LCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIGtleSA9IGtleS51cHBlcigpCisgICAgICAgICAgICAgICAgIyBjYWxsIG91ciBwYXJlbnQgY2xhc3NlcyBwdXQgbWV0aG9kIHdpdGggYW4gdXBwZXIgY2FzZSBrZXkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGJvYmouREIucHV0KHNlbGYsIGtleSwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLmVudiA9IFRlc3REQkVudigpCisgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MKQorICAgICAgICBzZWxmLmRiID0gVGVzdERCKHNlbGYuZW52KQorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5kYl9uYW1lLCBkYi5EQl9IQVNILCBkYi5EQl9DUkVBVEUpCisgICAgICAgIHNlbGYuZGIucHV0KCdzcGFtJywgJ2VnZ3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuZ2V0KCdzcGFtJyksIE5vbmUsCisgICAgICAgICAgICAgICAib3ZlcnJpZGRlbiBkYm9iai5EQi5wdXQoKSBtZXRob2QgZmFpbGVkIFsxXSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5nZXQoJ1NQQU0nKSwgJ2VnZ3MnLAorICAgICAgICAgICAgICAgIm92ZXJyaWRkZW4gZGJvYmouREIucHV0KCkgbWV0aG9kIGZhaWxlZCBbMl0iKQorICAgICAgICBzZWxmLmRiLmNsb3NlKCkKKyAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorCisgICAgZGVmIHRlc3QwMl9kYm9ial9kaWN0X2ludGVyZmFjZShzZWxmKToKKyAgICAgICAgc2VsZi5lbnYgPSBkYm9iai5EQkVudigpCisgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MKQorICAgICAgICBzZWxmLmRiID0gZGJvYmouREIoc2VsZi5lbnYpCisgICAgICAgIHNlbGYuZGIub3BlbihzZWxmLmRiX25hbWUrJzAyJywgZGIuREJfSEFTSCwgZGIuREJfQ1JFQVRFKQorICAgICAgICAjIF9fc2V0aXRlbV9fCisgICAgICAgIHNlbGYuZGJbJ3NwYW0nXSA9ICdlZ2dzJworICAgICAgICAjIF9fbGVuX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5kYiksIDEpCisgICAgICAgICMgX19nZXRpdGVtX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiWydzcGFtJ10sICdlZ2dzJykKKyAgICAgICAgIyBfX2RlbF9fCisgICAgICAgIGRlbCBzZWxmLmRiWydzcGFtJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmdldCgnc3BhbScpLCBOb25lLCAiZGJvYmogX19kZWxfXyBmYWlsZWQiKQorICAgICAgICBzZWxmLmRiLmNsb3NlKCkKKyAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorCisgICAgZGVmIHRlc3QwM19kYm9ial90eXBlX2JlZm9yZV9vcGVuKHNlbGYpOgorICAgICAgICAjIEVuc3VyZSB0aGlzIGRvZXNuJ3QgY2F1c2UgYSBzZWdmYXVsdC4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsIGRiLkRCKCkudHlwZSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKGRib2JqVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYm9iai5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYm9iai5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlYzc5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rib2JqLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYm9iai5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYm9iai5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlYzc5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rib2JqLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnNoZWx2ZS5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Ric2hlbHZlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNzAxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnNoZWx2ZS5weQpAQCAtMCwwICsxLDM5OCBAQAorIiIiCitUZXN0Q2FzZXMgZm9yIGNoZWNraW5nIGRiU2hlbHZlIG9iamVjdHMuCisiIiIKKworaW1wb3J0IG9zLCBzdHJpbmcsIHN5cworaW1wb3J0IHJhbmRvbQoraW1wb3J0IHVuaXR0ZXN0CisKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIGRic2hlbHZlLCB0ZXN0X3N1cHBvcnQsIHZlcmJvc2UsIFwKKyAgICAgICAgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworCisKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFdlIHdhbnQgdGhlIG9iamVjdHMgdG8gYmUgY29tcGFyYWJsZSBzbyB3ZSBjYW4gdGVzdCBkYnNoZWx2ZS52YWx1ZXMKKyMgbGF0ZXIgb24uCitjbGFzcyBEYXRhQ2xhc3M6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbHVlID0gcmFuZG9tLnJhbmRvbSgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZikgOiAgIyBGb3IgUHl0aG9uIDMuMCBjb21wYXJpc29uCisgICAgICAgIHJldHVybiAiRGF0YUNsYXNzICVmIiAlc2VsZi52YWx1ZQorCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOiAgIyBGb3IgUHl0aG9uIDIueCBjb21wYXJpc29uCisgICAgICAgIHJldHVybiBjbXAoc2VsZi52YWx1ZSwgb3RoZXIpCisKKworY2xhc3MgREJTaGVsdmVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgaWYgKHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNykpIG9yICgoc3lzLnZlcnNpb25faW5mbyA+PSAoMywgMCkpIGFuZAorICAgICAgICAgICAgKHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMikpKSA6CisgICAgICAgIGRlZiBhc3NlcnRJbihzZWxmLCBhLCBiLCBtc2c9Tm9uZSkgOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXNzZXJ0VHJ1ZShhIGluIGIsIG1zZz1tc2cpCisKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzIDoKKyAgICAgICAgICAgIGZyb20gdGVzdF9hbGwgaW1wb3J0IGRvX3Byb3h5X2RiX3B5M2sKKyAgICAgICAgICAgIHNlbGYuX2ZsYWdfcHJveHlfZGJfcHkzayA9IGRvX3Byb3h5X2RiX3B5M2soRmFsc2UpCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBnZXRfbmV3X2RhdGFiYXNlX3BhdGgoKQorICAgICAgICBzZWxmLmRvX29wZW4oKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDMgOgorICAgICAgICAgICAgZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZG9fcHJveHlfZGJfcHkzaworICAgICAgICAgICAgZG9fcHJveHlfZGJfcHkzayhzZWxmLl9mbGFnX3Byb3h5X2RiX3B5M2spCisgICAgICAgIHNlbGYuZG9fY2xvc2UoKQorICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYuZmlsZW5hbWUpCisKKyAgICBkZWYgbWsoc2VsZiwga2V5KToKKyAgICAgICAgIiIiVHVybiBrZXkgaW50byBhbiBhcHByb3ByaWF0ZSBrZXkgdHlwZSBmb3IgdGhpcyBkYiIiIgorICAgICAgICAjIG92ZXJyaWRlIGluIGNoaWxkIGNsYXNzIGZvciBSRUNOTworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICByZXR1cm4ga2V5CisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzKGtleSwgImlzbzg4NTktMSIpICAjIDggYml0cworCisgICAgZGVmIHBvcHVsYXRlREIoc2VsZiwgZCk6CisgICAgICAgIGZvciB4IGluIHN0cmluZy5sZXR0ZXJzOgorICAgICAgICAgICAgZFtzZWxmLm1rKCdTJyArIHgpXSA9IDEwICogeCAgICAgICAgICAgIyBhZGQgYSBzdHJpbmcKKyAgICAgICAgICAgIGRbc2VsZi5taygnSScgKyB4KV0gPSBvcmQoeCkgICAgICAgICAgICMgYWRkIGFuIGludGVnZXIKKyAgICAgICAgICAgIGRbc2VsZi5taygnTCcgKyB4KV0gPSBbeF0gKiAxMCAgICAgICAgICMgYWRkIGEgbGlzdAorCisgICAgICAgICAgICBpbnN0ID0gRGF0YUNsYXNzKCkgICAgICAgICAgICAjIGFkZCBhbiBpbnN0YW5jZQorICAgICAgICAgICAgaW5zdC5TID0gMTAgKiB4CisgICAgICAgICAgICBpbnN0LkkgPSBvcmQoeCkKKyAgICAgICAgICAgIGluc3QuTCA9IFt4XSAqIDEwCisgICAgICAgICAgICBkW3NlbGYubWsoJ08nICsgeCldID0gaW5zdAorCisKKyAgICAjIG92ZXJyaWRhYmxlIGluIGRlcml2ZWQgY2xhc3NlcyB0byBhZmZlY3QgaG93IHRoZSBzaGVsZiBpcyBjcmVhdGVkL29wZW5lZAorICAgIGRlZiBkb19vcGVuKHNlbGYpOgorICAgICAgICBzZWxmLmQgPSBkYnNoZWx2ZS5vcGVuKHNlbGYuZmlsZW5hbWUpCisKKyAgICAjIGFuZCBjbG9zZWQuLi4KKyAgICBkZWYgZG9fY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZC5jbG9zZSgpCisKKworCisgICAgZGVmIHRlc3QwMV9iYXNpY3Moc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwMV9iYXNpY3MuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBzZWxmLnBvcHVsYXRlREIoc2VsZi5kKQorICAgICAgICBzZWxmLmQuc3luYygpCisgICAgICAgIHNlbGYuZG9fY2xvc2UoKQorICAgICAgICBzZWxmLmRvX29wZW4oKQorICAgICAgICBkID0gc2VsZi5kCisKKyAgICAgICAgbCA9IGxlbihkKQorICAgICAgICBrID0gZC5rZXlzKCkKKyAgICAgICAgcyA9IGQuc3RhdCgpCisgICAgICAgIGYgPSBkLmZkKCkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgImxlbmd0aDoiLCBsCisgICAgICAgICAgICBwcmludCAia2V5czoiLCBrCisgICAgICAgICAgICBwcmludCAic3RhdHM6IiwgcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZC5oYXNfa2V5KHNlbGYubWsoJ2JhZCBrZXknKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgZC5oYXNfa2V5KHNlbGYubWsoJ0lBJykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGQuaGFzX2tleShzZWxmLm1rKCdPQScpKSkKKworICAgICAgICBkLmRlbGV0ZShzZWxmLm1rKCdJQScpKQorICAgICAgICBkZWwgZFtzZWxmLm1rKCdPQScpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGQuaGFzX2tleShzZWxmLm1rKCdJQScpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBkLmhhc19rZXkoc2VsZi5taygnT0EnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCBsLTIpCisKKyAgICAgICAgdmFsdWVzID0gW10KKyAgICAgICAgZm9yIGtleSBpbiBkLmtleXMoKToKKyAgICAgICAgICAgIHZhbHVlID0gZFtrZXldCisgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHZhbHVlKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiJXM6ICVzIiAlIChrZXksIHZhbHVlKQorICAgICAgICAgICAgc2VsZi5jaGVja3JlYyhrZXksIHZhbHVlKQorCisgICAgICAgIGRidmFsdWVzID0gZC52YWx1ZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkYnZhbHVlcyksIGxlbihkLmtleXMoKSkpCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgdmFsdWVzLnNvcnQoKQorICAgICAgICAgICAgZGJ2YWx1ZXMuc29ydCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgZGJ2YWx1ZXMpCisgICAgICAgIGVsc2UgOiAgIyBYWFg6IENvbnZlcnQgYWxsIHRvIHN0cmluZ3MuIFBsZWFzZSwgaW1wcm92ZQorICAgICAgICAgICAgdmFsdWVzLnNvcnQoa2V5PWxhbWJkYSB4IDogc3RyKHgpKQorICAgICAgICAgICAgZGJ2YWx1ZXMuc29ydChrZXk9bGFtYmRhIHggOiBzdHIoeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodmFsdWVzKSwgcmVwcihkYnZhbHVlcykpCisKKyAgICAgICAgaXRlbXMgPSBkLml0ZW1zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXRlbXMpLCBsZW4odmFsdWVzKSkKKworICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBpdGVtczoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tyZWMoa2V5LCB2YWx1ZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KHNlbGYubWsoJ2JhZCBrZXknKSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoc2VsZi5taygnYmFkIGtleScpLCBOb25lKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChzZWxmLm1rKCdiYWQga2V5JyksICdhIHN0cmluZycpLCAnYSBzdHJpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KHNlbGYubWsoJ2JhZCBrZXknKSwgWzEsIDIsIDNdKSwgWzEsIDIsIDNdKQorCisgICAgICAgIGQuc2V0X2dldF9yZXR1cm5zX25vbmUoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJOb3RGb3VuZEVycm9yLCBkLmdldCwgc2VsZi5taygnYmFkIGtleScpKQorICAgICAgICBkLnNldF9nZXRfcmV0dXJuc19ub25lKDEpCisKKyAgICAgICAgZC5wdXQoc2VsZi5taygnbmV3IGtleScpLCAnbmV3IGRhdGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KHNlbGYubWsoJ25ldyBrZXknKSksICduZXcgZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFtzZWxmLm1rKCduZXcga2V5JyldLCAnbmV3IGRhdGEnKQorCisKKworICAgIGRlZiB0ZXN0MDJfY3Vyc29ycyhzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAyX2N1cnNvcnMuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBzZWxmLnBvcHVsYXRlREIoc2VsZi5kKQorICAgICAgICBkID0gc2VsZi5kCisKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGMgPSBkLmN1cnNvcigpCisgICAgICAgIHJlYyA9IGMuZmlyc3QoKQorICAgICAgICB3aGlsZSByZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIGtleSwgdmFsdWUgPSByZWMKKyAgICAgICAgICAgIHNlbGYuY2hlY2tyZWMoa2V5LCB2YWx1ZSkKKyAgICAgICAgICAgICMgSGFjayB0byBhdm9pZCBjb252ZXJzaW9uIGJ5IDJ0bzMgdG9vbAorICAgICAgICAgICAgcmVjID0gZ2V0YXR0cihjLCAibmV4dCIpKCkKKyAgICAgICAgZGVsIGMKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBsZW4oZCkpCisKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGMgPSBkLmN1cnNvcigpCisgICAgICAgIHJlYyA9IGMubGFzdCgpCisgICAgICAgIHdoaWxlIHJlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IHJlYworICAgICAgICAgICAga2V5LCB2YWx1ZSA9IHJlYworICAgICAgICAgICAgc2VsZi5jaGVja3JlYyhrZXksIHZhbHVlKQorICAgICAgICAgICAgcmVjID0gYy5wcmV2KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBsZW4oZCkpCisKKyAgICAgICAgYy5zZXQoc2VsZi5taygnU1MnKSkKKyAgICAgICAga2V5LCB2YWx1ZSA9IGMuY3VycmVudCgpCisgICAgICAgIHNlbGYuY2hlY2tyZWMoa2V5LCB2YWx1ZSkKKyAgICAgICAgZGVsIGMKKworCisgICAgZGVmIHRlc3QwM19hcHBlbmQoc2VsZik6CisgICAgICAgICMgTk9URTogdGhpcyBpcyBvdmVycmlkZGVuIGluIFJFQ05PIHN1YmNsYXNzLCBkb24ndCBjaGFuZ2UgaXRzIG5hbWUuCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwM19hcHBlbmQuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYnNoZWx2ZS5EQlNoZWx2ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmQuYXBwZW5kLCAndW5pdCB0ZXN0IHdhcyBoZXJlJykKKworCisgICAgZGVmIHRlc3QwNF9pdGVyYWJsZShzZWxmKSA6CisgICAgICAgIHNlbGYucG9wdWxhdGVEQihzZWxmLmQpCisgICAgICAgIGQgPSBzZWxmLmQKKyAgICAgICAga2V5cyA9IGQua2V5cygpCisgICAgICAgIGtleXNldCA9IHNldChrZXlzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihrZXlzZXQpLCBsZW4oa2V5cykpCisKKyAgICAgICAgZm9yIGtleSBpbiBkIDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oa2V5LCBrZXlzZXQpCisgICAgICAgICAgICBrZXlzZXQucmVtb3ZlKGtleSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oa2V5c2V0KSwgMCkKKworICAgIGRlZiBjaGVja3JlYyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgIyBvdmVycmlkZSB0aGlzIGluIGEgc3ViY2xhc3MgaWYgdGhlIGtleSB0eXBlIGlzIGRpZmZlcmVudAorCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMyA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgYnl0ZXMpIDoKKyAgICAgICAgICAgICAgICBrZXkgPSBrZXkuZGVjb2RlKCJpc284ODU5LTEiKSAgIyA4IGJpdHMKKworICAgICAgICB4ID0ga2V5WzFdCisgICAgICAgIGlmIGtleVswXSA9PSAnUyc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWUpLCBzdHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCAxMCAqIHgpCisKKyAgICAgICAgZWxpZiBrZXlbMF0gPT0gJ0knOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbHVlKSwgaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgb3JkKHgpKQorCisgICAgICAgIGVsaWYga2V5WzBdID09ICdMJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWx1ZSksIGxpc3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCBbeF0gKiAxMCkKKworICAgICAgICBlbGlmIGtleVswXSA9PSAnTyc6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICAgICAgZnJvbSB0eXBlcyBpbXBvcnQgSW5zdGFuY2VUeXBlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbHVlKSwgSW5zdGFuY2VUeXBlKQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbHVlKSwgRGF0YUNsYXNzKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLlMsIDEwICogeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUuSSwgb3JkKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZS5MLCBbeF0gKiAxMCkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAsICdVbmtub3duIGtleSB0eXBlLCBmaXggdGhlIHRlc3QnKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCYXNpY1NoZWx2ZVRlc3RDYXNlKERCU2hlbHZlVGVzdENhc2UpOgorICAgIGRlZiBkb19vcGVuKHNlbGYpOgorICAgICAgICBzZWxmLmQgPSBkYnNoZWx2ZS5EQlNoZWxmKCkKKyAgICAgICAgc2VsZi5kLm9wZW4oc2VsZi5maWxlbmFtZSwgc2VsZi5kYnR5cGUsIHNlbGYuZGJmbGFncykKKworICAgIGRlZiBkb19jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5kLmNsb3NlKCkKKworCitjbGFzcyBCVHJlZVNoZWx2ZVRlc3RDYXNlKEJhc2ljU2hlbHZlVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0JUUkVFCisgICAgZGJmbGFncyA9IGRiLkRCX0NSRUFURQorCisKK2NsYXNzIEhhc2hTaGVsdmVUZXN0Q2FzZShCYXNpY1NoZWx2ZVRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9IQVNICisgICAgZGJmbGFncyA9IGRiLkRCX0NSRUFURQorCisKK2NsYXNzIFRocmVhZEJUcmVlU2hlbHZlVGVzdENhc2UoQmFzaWNTaGVsdmVUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKyAgICBkYmZsYWdzID0gZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFECisKKworY2xhc3MgVGhyZWFkSGFzaFNoZWx2ZVRlc3RDYXNlKEJhc2ljU2hlbHZlVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKKyAgICBkYmZsYWdzID0gZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFECisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQmFzaWNFbnZTaGVsdmVUZXN0Q2FzZShEQlNoZWx2ZVRlc3RDYXNlKToKKyAgICBkZWYgZG9fb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5lbnYgPSBkYi5EQkVudigpCisgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLAorICAgICAgICAgICAgICAgIHNlbGYuZW52ZmxhZ3MgfCBkYi5EQl9JTklUX01QT09MIHwgZGIuREJfQ1JFQVRFKQorCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYuZmlsZW5hbWUpWzFdCisgICAgICAgIHNlbGYuZCA9IGRic2hlbHZlLkRCU2hlbGYoc2VsZi5lbnYpCisgICAgICAgIHNlbGYuZC5vcGVuKHNlbGYuZmlsZW5hbWUsIHNlbGYuZGJ0eXBlLCBzZWxmLmRiZmxhZ3MpCisKKworICAgIGRlZiBkb19jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5kLmNsb3NlKCkKKyAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorCisKKyAgICBkZWYgc2V0VXAoc2VsZikgOgorICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICBEQlNoZWx2ZVRlc3RDYXNlLnNldFVwKHNlbGYpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMyA6CisgICAgICAgICAgICBmcm9tIHRlc3RfYWxsIGltcG9ydCBkb19wcm94eV9kYl9weTNrCisgICAgICAgICAgICBkb19wcm94eV9kYl9weTNrKHNlbGYuX2ZsYWdfcHJveHlfZGJfcHkzaykKKyAgICAgICAgc2VsZi5kb19jbG9zZSgpCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCisKK2NsYXNzIEVudkJUcmVlU2hlbHZlVGVzdENhc2UoQmFzaWNFbnZTaGVsdmVUZXN0Q2FzZSk6CisgICAgZW52ZmxhZ3MgPSAwCisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKyAgICBkYmZsYWdzID0gZGIuREJfQ1JFQVRFCisKKworY2xhc3MgRW52SGFzaFNoZWx2ZVRlc3RDYXNlKEJhc2ljRW52U2hlbHZlVGVzdENhc2UpOgorICAgIGVudmZsYWdzID0gMAorICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKKyAgICBkYmZsYWdzID0gZGIuREJfQ1JFQVRFCisKKworY2xhc3MgRW52VGhyZWFkQlRyZWVTaGVsdmVUZXN0Q2FzZShCYXNpY0VudlNoZWx2ZVRlc3RDYXNlKToKKyAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRAorICAgIGRidHlwZSA9IGRiLkRCX0JUUkVFCisgICAgZGJmbGFncyA9IGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRAorCisKK2NsYXNzIEVudlRocmVhZEhhc2hTaGVsdmVUZXN0Q2FzZShCYXNpY0VudlNoZWx2ZVRlc3RDYXNlKToKKyAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRAorICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKKyAgICBkYmZsYWdzID0gZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFECisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdGVzdCBjYXNlcyBmb3IgYSBEQlNoZWxmIGluIGEgUkVDTk8gREIuCisKK2NsYXNzIFJlY05vU2hlbHZlVGVzdENhc2UoQmFzaWNTaGVsdmVUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfUkVDTk8KKyAgICBkYmZsYWdzID0gZGIuREJfQ1JFQVRFCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIEJhc2ljU2hlbHZlVGVzdENhc2Uuc2V0VXAoc2VsZikKKworICAgICAgICAjIHBvb2wgdG8gYXNzaWduIGludGVnZXIga2V5IHZhbHVlcyBvdXQgb2YKKyAgICAgICAgc2VsZi5rZXlfcG9vbCA9IGxpc3QocmFuZ2UoMSwgNTAwMCkpCisgICAgICAgIHNlbGYua2V5X21hcCA9IHt9ICAgICAjIG1hcCBzdHJpbmcga2V5cyB0byB0aGUgbnVtYmVyIHdlIGdhdmUgdGhlbQorICAgICAgICBzZWxmLmludGtleV9tYXAgPSB7fSAgIyByZXZlcnNlIG1hcCBvZiBhYm92ZQorCisgICAgZGVmIG1rKHNlbGYsIGtleSk6CisgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZi5rZXlfbWFwOgorICAgICAgICAgICAgc2VsZi5rZXlfbWFwW2tleV0gPSBzZWxmLmtleV9wb29sLnBvcCgwKQorICAgICAgICAgICAgc2VsZi5pbnRrZXlfbWFwW3NlbGYua2V5X21hcFtrZXldXSA9IGtleQorICAgICAgICByZXR1cm4gc2VsZi5rZXlfbWFwW2tleV0KKworICAgIGRlZiBjaGVja3JlYyhzZWxmLCBpbnRrZXksIHZhbHVlKToKKyAgICAgICAga2V5ID0gc2VsZi5pbnRrZXlfbWFwW2ludGtleV0KKyAgICAgICAgQmFzaWNTaGVsdmVUZXN0Q2FzZS5jaGVja3JlYyhzZWxmLCBrZXksIHZhbHVlKQorCisgICAgZGVmIHRlc3QwM19hcHBlbmQoc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwM19hcHBlbmQuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBzZWxmLmRbMV0gPSAnc3BhbScKKyAgICAgICAgc2VsZi5kWzVdID0gJ2VnZ3MnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNiwgc2VsZi5kLmFwcGVuZCgnc3BhbScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDcsIHNlbGYuZC5hcHBlbmQoJ2Jha2VkIGJlYW5zJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3NwYW0nLCBzZWxmLmQuZ2V0KDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdzcGFtJywgc2VsZi5kLmdldCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYmFrZWQgYmVhbnMnLCBzZWxmLmQuZ2V0KDcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdlZ2dzJywgc2VsZi5kLmdldCg1KSkKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCU2hlbHZlVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJUcmVlU2hlbHZlVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEhhc2hTaGVsdmVUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGhyZWFkQlRyZWVTaGVsdmVUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGhyZWFkSGFzaFNoZWx2ZVRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShFbnZCVHJlZVNoZWx2ZVRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShFbnZIYXNoU2hlbHZlVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEVudlRocmVhZEJUcmVlU2hlbHZlVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEVudlRocmVhZEhhc2hTaGVsdmVUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoUmVjTm9TaGVsdmVUZXN0Q2FzZSkpCisKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJzaGVsdmUucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJzaGVsdmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWI4NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnNoZWx2ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJzaGVsdmUucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJzaGVsdmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWI4NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnNoZWx2ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJ0YWJsZXMucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnRhYmxlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjMxMzgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJ0YWJsZXMucHkKQEAgLTAsMCArMSw0MDkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEEgdGVzdCBzdWl0ZSBmb3IgdGhlIHRhYmxlIGludGVyZmFjZSBidWlsdCBvbiBic2RkYi5kYgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSBieSBBdXRvbm9tb3VzIFpvbmUgSW5kdXN0cmllcworIyBDb3B5cmlnaHQgKEMpIDIwMDIgR3JlZ29yeSBQLiBTbWl0aAorIworIyBNYXJjaCAyMCwgMjAwMAorIworIyBMaWNlbnNlOiAgICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZS4gIFlvdSBtYXkgdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorIyAgICAgICAgICAgICAgIHB1cnBvc2UgaW5jbHVkaW5nIG1vZGlmaWNhdGlvbi9yZWRpc3RyaWJ1dGlvbiwgc28gbG9uZyBhcworIyAgICAgICAgICAgICAgIHRoaXMgaGVhZGVyIHJlbWFpbnMgaW50YWN0IGFuZCB0aGF0IHlvdSBkbyBub3QgY2xhaW0gYW55CisjICAgICAgICAgICAgICAgcmlnaHRzIG9mIG93bmVyc2hpcCBvciBhdXRob3JzaGlwIG9mIHRoaXMgc29mdHdhcmUuICBUaGlzCisjICAgICAgICAgICAgICAgc29mdHdhcmUgaGFzIGJlZW4gdGVzdGVkLCBidXQgbm8gd2FycmFudHkgaXMgZXhwcmVzc2VkIG9yCisjICAgICAgICAgICAgICAgaW1wbGllZC4KKyMKKyMgICAtLSAgR3JlZ29yeSBQLiBTbWl0aCA8Z3JlZ0BrcnlwdG8ub3JnPgorIworIyAkSWQkCisKK2ltcG9ydCBvcywgcmUsIHN5cworCitpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgY1BpY2tsZQorICAgICAgICBwaWNrbGUgPSBjUGlja2xlCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBpbXBvcnQgcGlja2xlCitlbHNlIDoKKyAgICBpbXBvcnQgcGlja2xlCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIGRidGFibGVzLCB0ZXN0X3N1cHBvcnQsIHZlcmJvc2UsIFwKKyAgICAgICAgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGFibGVEQlRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkYl9uYW1lID0gJ3Rlc3QtdGFibGUuZGInCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzIDoKKyAgICAgICAgICAgIGZyb20gdGVzdF9hbGwgaW1wb3J0IGRvX3Byb3h5X2RiX3B5M2sKKyAgICAgICAgICAgIHNlbGYuX2ZsYWdfcHJveHlfZGJfcHkzayA9IGRvX3Byb3h5X2RiX3B5M2soRmFsc2UpCisKKyAgICAgICAgc2VsZi50ZXN0SG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisgICAgICAgIHNlbGYudGRiID0gZGJ0YWJsZXMuYnNkVGFibGVEQigKKyAgICAgICAgICAgIGZpbGVuYW1lPSd0YWJsZXRlc3QuZGInLCBkYmhvbWU9c2VsZi50ZXN0SG9tZURpciwgY3JlYXRlPTEpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGRiLmNsb3NlKCkKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDMgOgorICAgICAgICAgICAgZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZG9fcHJveHlfZGJfcHkzaworICAgICAgICAgICAgZG9fcHJveHlfZGJfcHkzayhzZWxmLl9mbGFnX3Byb3h5X2RiX3B5M2spCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi50ZXN0SG9tZURpcikKKworICAgIGRlZiB0ZXN0MDEoc2VsZik6CisgICAgICAgIHRhYm5hbWUgPSAidGVzdDAxIgorICAgICAgICBjb2xuYW1lID0gJ2Nvb2wgbnVtYmVycycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ZGIuRHJvcCh0YWJuYW1lKQorICAgICAgICBleGNlcHQgZGJ0YWJsZXMuVGFibGVEQkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLnRkYi5DcmVhdGVUYWJsZSh0YWJuYW1lLCBbY29sbmFtZV0pCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsIHtjb2xuYW1lOiBwaWNrbGUuZHVtcHMoMy4xNDE1OSwgMSl9KQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7Y29sbmFtZTogcGlja2xlLmR1bXBzKDMuMTQxNTksCisgICAgICAgICAgICAgICAgMSkuZGVjb2RlKCJpc284ODU5LTEiKX0pICAjIDggYml0cworCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBzZWxmLnRkYi5fZGJfcHJpbnQoKQorCisgICAgICAgIHZhbHVlcyA9IHNlbGYudGRiLlNlbGVjdCgKKyAgICAgICAgICAgIHRhYm5hbWUsIFtjb2xuYW1lXSwgY29uZGl0aW9ucz17Y29sbmFtZTogTm9uZX0pCisKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICBjb2x2YWwgPSBwaWNrbGUubG9hZHModmFsdWVzWzBdW2NvbG5hbWVdKQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIGNvbHZhbCA9IHBpY2tsZS5sb2FkcyhieXRlcyh2YWx1ZXNbMF1bY29sbmFtZV0sICJpc284ODU5LTEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbHZhbCA+IDMuMTQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sdmFsIDwgMy4xNDIpCisKKworICAgIGRlZiB0ZXN0MDIoc2VsZik6CisgICAgICAgIHRhYm5hbWUgPSAidGVzdDAyIgorICAgICAgICBjb2wwID0gJ2Nvb2xuZXNzIGZhY3RvcicKKyAgICAgICAgY29sMSA9ICdidXQgY2FuIGl0IGZseT8nCisgICAgICAgIGNvbDIgPSAnU3BlY2llcycKKworICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgIHRlc3RpbmZvID0gWworICAgICAgICAgICAgICAgIHtjb2wwOiBwaWNrbGUuZHVtcHMoOCwgMSksIGNvbDE6ICdubycsIGNvbDI6ICdQZW5ndWluJ30sCisgICAgICAgICAgICAgICAge2NvbDA6IHBpY2tsZS5kdW1wcygtMSwgMSksIGNvbDE6ICdubycsIGNvbDI6ICdUdXJrZXknfSwKKyAgICAgICAgICAgICAgICB7Y29sMDogcGlja2xlLmR1bXBzKDksIDEpLCBjb2wxOiAneWVzJywgY29sMjogJ1NSLTcxQSBCbGFja2JpcmQnfQorICAgICAgICAgICAgXQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIHRlc3RpbmZvID0gWworICAgICAgICAgICAgICAgIHtjb2wwOiBwaWNrbGUuZHVtcHMoOCwgMSkuZGVjb2RlKCJpc284ODU5LTEiKSwKKyAgICAgICAgICAgICAgICAgICAgY29sMTogJ25vJywgY29sMjogJ1Blbmd1aW4nfSwKKyAgICAgICAgICAgICAgICB7Y29sMDogcGlja2xlLmR1bXBzKC0xLCAxKS5kZWNvZGUoImlzbzg4NTktMSIpLAorICAgICAgICAgICAgICAgICAgICBjb2wxOiAnbm8nLCBjb2wyOiAnVHVya2V5J30sCisgICAgICAgICAgICAgICAge2NvbDA6IHBpY2tsZS5kdW1wcyg5LCAxKS5kZWNvZGUoImlzbzg4NTktMSIpLAorICAgICAgICAgICAgICAgICAgICBjb2wxOiAneWVzJywgY29sMjogJ1NSLTcxQSBCbGFja2JpcmQnfQorICAgICAgICAgICAgXQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGRiLkRyb3AodGFibmFtZSkKKyAgICAgICAgZXhjZXB0IGRidGFibGVzLlRhYmxlREJFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi50ZGIuQ3JlYXRlVGFibGUodGFibmFtZSwgW2NvbDAsIGNvbDEsIGNvbDJdKQorICAgICAgICBmb3Igcm93IGluIHRlc3RpbmZvIDoKKyAgICAgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCByb3cpCisKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICB2YWx1ZXMgPSBzZWxmLnRkYi5TZWxlY3QodGFibmFtZSwgW2NvbDJdLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM9e2NvbDA6IGxhbWJkYSB4OiBwaWNrbGUubG9hZHMoeCkgPj0gOH0pCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgdmFsdWVzID0gc2VsZi50ZGIuU2VsZWN0KHRhYm5hbWUsIFtjb2wyXSwKKyAgICAgICAgICAgICAgICBjb25kaXRpb25zPXtjb2wwOiBsYW1iZGEgeDoKKyAgICAgICAgICAgICAgICAgICAgcGlja2xlLmxvYWRzKGJ5dGVzKHgsICJpc284ODU5LTEiKSkgPj0gOH0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgMikKKyAgICAgICAgaWYgdmFsdWVzWzBdWydTcGVjaWVzJ10gPT0gJ1Blbmd1aW4nIDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzWzFdWydTcGVjaWVzJ10sICdTUi03MUEgQmxhY2tiaXJkJykKKyAgICAgICAgZWxpZiB2YWx1ZXNbMF1bJ1NwZWNpZXMnXSA9PSAnU1ItNzFBIEJsYWNrYmlyZCcgOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXNbMV1bJ1NwZWNpZXMnXSwgJ1Blbmd1aW4nKQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgInZhbHVlcz0gJXIiICUgKHZhbHVlcywpCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIldyb25nIHZhbHVlcyByZXR1cm5lZCEiKQorCisgICAgZGVmIHRlc3QwMyhzZWxmKToKKyAgICAgICAgdGFibmFtZSA9ICJ0ZXN0MDMiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGRiLkRyb3AodGFibmFtZSkKKyAgICAgICAgZXhjZXB0IGRidGFibGVzLlRhYmxlREJFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICcuLi5iZWZvcmUgQ3JlYXRlVGFibGUuLi4nCisgICAgICAgICAgICBzZWxmLnRkYi5fZGJfcHJpbnQoKQorICAgICAgICBzZWxmLnRkYi5DcmVhdGVUYWJsZSh0YWJuYW1lLCBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJy4uLmFmdGVyIENyZWF0ZVRhYmxlLi4uJworICAgICAgICAgICAgc2VsZi50ZGIuX2RiX3ByaW50KCkKKyAgICAgICAgc2VsZi50ZGIuRHJvcCh0YWJuYW1lKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJy4uLmFmdGVyIERyb3AuLi4nCisgICAgICAgICAgICBzZWxmLnRkYi5fZGJfcHJpbnQoKQorICAgICAgICBzZWxmLnRkYi5DcmVhdGVUYWJsZSh0YWJuYW1lLCBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZSc6IHBpY2tsZS5kdW1wcyhbezQ6NSwgNjo3fSwgJ2ZvbyddLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnOiAiWmVybyJ9KQorICAgICAgICAgICAgc2VsZi5mYWlsKCdFeHBlY3RlZCBhbiBleGNlcHRpb24nKQorICAgICAgICBleGNlcHQgZGJ0YWJsZXMuVGFibGVEQkVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGRiLlNlbGVjdCh0YWJuYW1lLCBbXSwgY29uZGl0aW9ucz17J2Zvbyc6ICcxMjMnfSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnRXhwZWN0ZWQgYW4gZXhjZXB0aW9uJykKKyAgICAgICAgZXhjZXB0IGRidGFibGVzLlRhYmxlREJFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLnRkYi5JbnNlcnQodGFibmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6ICc0MicsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2InOiAiYmFkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYyc6ICJtZWVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZSc6ICdGdXp6eSB3dXp6eSB3YXMgYSBiZWFyJ30pCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogJzU4MTc1MCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2InOiAiZ29vZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnOiAiYmxhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYyc6ICJibGFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnOiAnZnV6enkgd2FzIGhlcmUnfSkKKyAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAnODAwMDAwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYic6ICJnb29kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZCc6ICJibGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICdjJzogImJsYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZSc6ICdGdXp6eSB3dXp6eSBpcyBhIGJlYXInfSkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgc2VsZi50ZGIuX2RiX3ByaW50KCkKKworICAgICAgICAjIHRoaXMgc2hvdWxkIHJldHVybiB0d28gcm93cworICAgICAgICB2YWx1ZXMgPSBzZWxmLnRkYi5TZWxlY3QodGFibmFtZSwgWydiJywgJ2EnLCAnZCddLAorICAgICAgICAgICAgY29uZGl0aW9ucz17J2UnOiByZS5jb21waWxlKCd3dXp6eScpLnNlYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICdhJzogcmUuY29tcGlsZSgnXlswLTldKyQnKS5tYXRjaH0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlcyksIDIpCisKKyAgICAgICAgIyBub3cgbGV0cyBkZWxldGUgb25lIG9mIHRoZW0gYW5kIHRyeSBhZ2FpbgorICAgICAgICBzZWxmLnRkYi5EZWxldGUodGFibmFtZSwgY29uZGl0aW9ucz17J2InOiBkYnRhYmxlcy5FeGFjdENvbmQoJ2dvb2QnKX0pCisgICAgICAgIHZhbHVlcyA9IHNlbGYudGRiLlNlbGVjdCgKKyAgICAgICAgICAgIHRhYm5hbWUsIFsnYScsICdkJywgJ2InXSwKKyAgICAgICAgICAgIGNvbmRpdGlvbnM9eydlJzogZGJ0YWJsZXMuUHJlZml4Q29uZCgnRnV6enknKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzWzBdWydkJ10sIE5vbmUpCisKKyAgICAgICAgdmFsdWVzID0gc2VsZi50ZGIuU2VsZWN0KHRhYm5hbWUsIFsnYiddLAorICAgICAgICAgICAgY29uZGl0aW9ucz17J2MnOiBsYW1iZGEgYzogYyA9PSAnbWVlcCd9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlc1swXVsnYiddLCAiYmFkIikKKworCisgICAgZGVmIHRlc3QwNF9NdWx0aUNvbmRTZWxlY3Qoc2VsZik6CisgICAgICAgIHRhYm5hbWUgPSAidGVzdDA0X011bHRpQ29uZFNlbGVjdCIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ZGIuRHJvcCh0YWJuYW1lKQorICAgICAgICBleGNlcHQgZGJ0YWJsZXMuVGFibGVEQkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLnRkYi5DcmVhdGVUYWJsZSh0YWJuYW1lLCBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZSc6IHBpY2tsZS5kdW1wcyhbezQ6NSwgNjo3fSwgJ2ZvbyddLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnOiAiWmVybyJ9KQorICAgICAgICAgICAgc2VsZi5mYWlsKCdFeHBlY3RlZCBhbiBleGNlcHRpb24nKQorICAgICAgICBleGNlcHQgZGJ0YWJsZXMuVGFibGVEQkVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7J2EnOiAiQSIsICdiJzogIkIiLCAnYyc6ICJDIiwgJ2QnOiAiRCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnOiAiRSJ9KQorICAgICAgICBzZWxmLnRkYi5JbnNlcnQodGFibmFtZSwgeydhJzogIi1BIiwgJ2InOiAiLUIiLCAnYyc6ICItQyIsICdkJzogIi1EIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZSc6ICItRSJ9KQorICAgICAgICBzZWxmLnRkYi5JbnNlcnQodGFibmFtZSwgeydhJzogIkEtIiwgJ2InOiAiQi0iLCAnYyc6ICJDLSIsICdkJzogIkQtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZSc6ICJFLSJ9KQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBzZWxmLnRkYi5fZGJfcHJpbnQoKQorCisgICAgICAgICMgVGhpcyBzZWxlY3Qgc2hvdWxkIHJldHVybiAwIHJvd3MuICBpdCBpcyBkZXNpZ25lZCB0byB0ZXN0CisgICAgICAgICMgdGhlIGJ1ZyBpZGVudGlmaWVkIGFuZCBmaXhlZCBpbiBzb3VyY2Vmb3JnZSBidWcgIyA1OTA0NDkKKyAgICAgICAgIyAoQmlnIFRoYW5rcyB0byAiUm9iIFRpbGxvdHNvbiAobjltdGIpIiBmb3IgdHJhY2tpbmcgdGhpcyBkb3duCisgICAgICAgICMgYW5kIHN1cHBseWluZyBhIGZpeCEhICBUaGlzIG9uZSBjYXVzZWQgbWFueSBoZWFkYWNoZXMgdG8gc2F5CisgICAgICAgICMgdGhlIGxlYXN0Li4uKQorICAgICAgICB2YWx1ZXMgPSBzZWxmLnRkYi5TZWxlY3QodGFibmFtZSwgWydiJywgJ2EnLCAnZCddLAorICAgICAgICAgICAgY29uZGl0aW9ucz17J2UnOiBkYnRhYmxlcy5FeGFjdENvbmQoJ0UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdhJzogZGJ0YWJsZXMuRXhhY3RDb25kKCdBJyksCisgICAgICAgICAgICAgICAgICAgICAgICAnZCc6IGRidGFibGVzLlByZWZpeENvbmQoJy0nKQorICAgICAgICAgICAgICAgICAgICAgICB9ICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgMCwgdmFsdWVzKQorCisKKyAgICBkZWYgdGVzdF9DcmVhdGVPckV4dGVuZChzZWxmKToKKyAgICAgICAgdGFibmFtZSA9ICJ0ZXN0X0NyZWF0ZU9yRXh0ZW5kIgorCisgICAgICAgIHNlbGYudGRiLkNyZWF0ZU9yRXh0ZW5kVGFibGUoCisgICAgICAgICAgICB0YWJuYW1lLCBbJ25hbWUnLCAndGFzdGUnLCAnZmlsbGluZycsICdhbGNvaG9sIGNvbnRlbnQnLCAncHJpY2UnXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyd0YXN0ZSc6ICdjcmFwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGxpbmcnOiAnbm8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgaXQgR3Vpbm5lc3M/JzogJ25vJ30pCisgICAgICAgICAgICBzZWxmLmZhaWwoIkluc2VydCBzaG91bGQndmUgZmFpbGVkIGR1ZSB0byBiYWQgY29sdW1uIG5hbWUiKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYudGRiLkNyZWF0ZU9yRXh0ZW5kVGFibGUodGFibmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ25hbWUnLCAndGFzdGUnLCAnaXMgaXQgR3Vpbm5lc3M/J10pCisKKyAgICAgICAgIyB0aGVzZSBzaG91bGQgYm90aCBzdWNjZWVkIGFzIHRoZSB0YWJsZSBzaG91bGQgY29udGFpbiB0aGUgdW5pb24gb2YgYm90aCBzZXRzIG9mIGNvbHVtbnMuCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7J3Rhc3RlJzogJ2NyYXAnLCAnZmlsbGluZyc6ICdubycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIGl0IEd1aW5uZXNzPyc6ICdubyd9KQorICAgICAgICBzZWxmLnRkYi5JbnNlcnQodGFibmFtZSwgeyd0YXN0ZSc6ICdncmVhdCcsICdmaWxsaW5nJzogJ3llcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIGl0IEd1aW5uZXNzPyc6ICd5ZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ0d1aW5uZXNzJ30pCisKKworICAgIGRlZiB0ZXN0X0NvbmRPYmpzKHNlbGYpOgorICAgICAgICB0YWJuYW1lID0gInRlc3RfQ29uZE9ianMiCisKKyAgICAgICAgc2VsZi50ZGIuQ3JlYXRlVGFibGUodGFibmFtZSwgWydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAncCddKQorCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7J2EnOiAidGhlIGxldHRlciBBIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYic6ICJ0aGUgbGV0dGVyIEIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJzogImlzIGZvciBjb29raWUifSkKKyAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsIHsnYSc6ICJpcyBmb3IgYWFyZHZhcmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJzogInRoZSBsZXR0ZXIgRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnOiAiaXMgZm9yIGNvb2tpZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnOiAiaXMgZm9yIGRvZyJ9KQorICAgICAgICBzZWxmLnRkYi5JbnNlcnQodGFibmFtZSwgeydhJzogInRoZSBsZXR0ZXIgQSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnOiAidGhlIGxldHRlciBFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYyc6ICJpcyBmb3IgY29va2llIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCc6ICJpcyBmb3IgUHl0aG9uIn0pCisKKyAgICAgICAgdmFsdWVzID0gc2VsZi50ZGIuU2VsZWN0KAorICAgICAgICAgICAgdGFibmFtZSwgWydwJywgJ2UnXSwKKyAgICAgICAgICAgIGNvbmRpdGlvbnM9eydlJzogZGJ0YWJsZXMuUHJlZml4Q29uZCgndGhlIGwnKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlcyksIDIsIHZhbHVlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXNbMF1bJ2UnXSwgdmFsdWVzWzFdWydlJ10sIHZhbHVlcykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh2YWx1ZXNbMF1bJ3AnXSwgdmFsdWVzWzFdWydwJ10sIHZhbHVlcykKKworICAgICAgICB2YWx1ZXMgPSBzZWxmLnRkYi5TZWxlY3QoCisgICAgICAgICAgICB0YWJuYW1lLCBbJ2QnLCAnYSddLAorICAgICAgICAgICAgY29uZGl0aW9ucz17J2EnOiBkYnRhYmxlcy5MaWtlQ29uZCgnJWFhcmR2YXJrJScpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgMSwgdmFsdWVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlc1swXVsnZCddLCAiaXMgZm9yIGRvZyIsIHZhbHVlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXNbMF1bJ2EnXSwgImlzIGZvciBhYXJkdmFyayIsIHZhbHVlcykKKworICAgICAgICB2YWx1ZXMgPSBzZWxmLnRkYi5TZWxlY3QodGFibmFtZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYic6IGRidGFibGVzLkNvbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZSc6ZGJ0YWJsZXMuTGlrZUNvbmQoJyVsZXR0ZXIlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EnOmRidGFibGVzLlByZWZpeENvbmQoJ2lzJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2QnOmRidGFibGVzLkV4YWN0Q29uZCgnaXMgZm9yIGRvZycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJzpkYnRhYmxlcy5QcmVmaXhDb25kKCdpcyBmb3InKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncCc6bGFtYmRhIHM6IG5vdCBzfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgMSwgdmFsdWVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlc1swXVsnZCddLCAiaXMgZm9yIGRvZyIsIHZhbHVlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXNbMF1bJ2EnXSwgImlzIGZvciBhYXJkdmFyayIsIHZhbHVlcykKKworICAgIGRlZiB0ZXN0X0RlbGV0ZShzZWxmKToKKyAgICAgICAgdGFibmFtZSA9ICJ0ZXN0X0RlbGV0ZSIKKyAgICAgICAgc2VsZi50ZGIuQ3JlYXRlVGFibGUodGFibmFtZSwgWyd4JywgJ3knLCAneiddKQorCisgICAgICAgICMgcHJpb3IgdG8gMjAwMS0wNS0wOSB0aGVyZSB3YXMgYSBidWcgd2hlcmUgRGVsZXRlKCkgd291bGQKKyAgICAgICAgIyBmYWlsIGlmIGl0IGVuY291bnRlcmVkIGFueSByb3dzIHRoYXQgZGlkIG5vdCBoYXZlIHZhbHVlcyBpbgorICAgICAgICAjIGV2ZXJ5IGNvbHVtbi4KKyAgICAgICAgIyBIdW50ZWQgYW5kIFNxdWFzaGVkIGJ5IDxEb253dWxmZj4gKEp1a2thIFNhbnRhbGEgLSBkb253dWxmZkBuaWMuZmkpCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7J3gnOiAnWDEnLCAneSc6J1kxJ30pCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7J3gnOiAnWDInLCAneSc6J1kyJywgJ3onOiAnWjInfSkKKworICAgICAgICBzZWxmLnRkYi5EZWxldGUodGFibmFtZSwgY29uZGl0aW9ucz17J3gnOiBkYnRhYmxlcy5QcmVmaXhDb25kKCdYJyl9KQorICAgICAgICB2YWx1ZXMgPSBzZWxmLnRkYi5TZWxlY3QodGFibmFtZSwgWyd5J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zPXsneCc6IGRidGFibGVzLlByZWZpeENvbmQoJ1gnKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlcyksIDApCisKKyAgICBkZWYgdGVzdF9Nb2RpZnkoc2VsZik6CisgICAgICAgIHRhYm5hbWUgPSAidGVzdF9Nb2RpZnkiCisgICAgICAgIHNlbGYudGRiLkNyZWF0ZVRhYmxlKHRhYm5hbWUsIFsnTmFtZScsICdUeXBlJywgJ0FjY2VzcyddKQorCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7J05hbWUnOiAnSW5kZXggdG8gTVAzIGZpbGVzLmRvYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1R5cGUnOiAnV29yZCcsICdBY2Nlc3MnOiAnOCd9KQorICAgICAgICBzZWxmLnRkYi5JbnNlcnQodGFibmFtZSwgeydOYW1lJzogJ05pZnR5Lk1QMycsICdBY2Nlc3MnOiAnMSd9KQorICAgICAgICBzZWxmLnRkYi5JbnNlcnQodGFibmFtZSwgeydUeXBlJzogJ1Vua25vd24nLCAnQWNjZXNzJzogJzAnfSkKKworICAgICAgICBkZWYgc2V0X3R5cGUodHlwZSk6CisgICAgICAgICAgICBpZiB0eXBlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuICdNUDMnCisgICAgICAgICAgICByZXR1cm4gdHlwZQorCisgICAgICAgIGRlZiBpbmNyZW1lbnRfYWNjZXNzKGNvdW50KToKKyAgICAgICAgICAgIHJldHVybiBzdHIoaW50KGNvdW50KSsxKQorCisgICAgICAgIGRlZiByZW1vdmVfdmFsdWUodmFsdWUpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBzZWxmLnRkYi5Nb2RpZnkodGFibmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM9eydBY2Nlc3MnOiBkYnRhYmxlcy5FeGFjdENvbmQoJzAnKX0sCisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5ncz17J0FjY2Vzcyc6IHJlbW92ZV92YWx1ZX0pCisgICAgICAgIHNlbGYudGRiLk1vZGlmeSh0YWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucz17J05hbWUnOiBkYnRhYmxlcy5MaWtlQ29uZCgnJU1QMyUnKX0sCisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5ncz17J1R5cGUnOiBzZXRfdHlwZX0pCisgICAgICAgIHNlbGYudGRiLk1vZGlmeSh0YWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucz17J05hbWUnOiBkYnRhYmxlcy5MaWtlQ29uZCgnJScpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzPXsnQWNjZXNzJzogaW5jcmVtZW50X2FjY2Vzc30pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ZGIuTW9kaWZ5KHRhYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucz17J05hbWUnOiBkYnRhYmxlcy5MaWtlQ29uZCgnJScpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5ncz17J0FjY2Vzcyc6ICdXaGF0IGlzIHlvdXIgcXVlc3Q/J30pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAjIHN1Y2Nlc3MsIHRoZSBzdHJpbmcgdmFsdWUgaW4gbWFwcGluZ3MgaXNuJ3QgY2FsbGFibGUKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIndoeSB3YXMgVHlwZUVycm9yIG5vdCByYWlzZWQgZm9yIGJhZCBjYWxsYWJsZT8iCisKKyAgICAgICAgIyBEZWxldGUga2V5IGluIHNlbGVjdCBjb25kaXRpb25zCisgICAgICAgIHZhbHVlcyA9IHNlbGYudGRiLlNlbGVjdCgKKyAgICAgICAgICAgIHRhYm5hbWUsIE5vbmUsCisgICAgICAgICAgICBjb25kaXRpb25zPXsnVHlwZSc6IGRidGFibGVzLkV4YWN0Q29uZCgnVW5rbm93bicpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgMSwgdmFsdWVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlc1swXVsnTmFtZSddLCBOb25lLCB2YWx1ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzWzBdWydBY2Nlc3MnXSwgTm9uZSwgdmFsdWVzKQorCisgICAgICAgICMgTW9kaWZ5IHZhbHVlIGJ5IHNlbGVjdCBjb25kaXRpb25zCisgICAgICAgIHZhbHVlcyA9IHNlbGYudGRiLlNlbGVjdCgKKyAgICAgICAgICAgIHRhYm5hbWUsIE5vbmUsCisgICAgICAgICAgICBjb25kaXRpb25zPXsnTmFtZSc6IGRidGFibGVzLkV4YWN0Q29uZCgnTmlmdHkuTVAzJyl9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCAxLCB2YWx1ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzWzBdWydUeXBlJ10sICJNUDMiLCB2YWx1ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzWzBdWydBY2Nlc3MnXSwgIjIiLCB2YWx1ZXMpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgY2hhbmdlIGFwcGxpZWQgb25seSB0byBzZWxlY3QgY29uZGl0aW9ucworICAgICAgICB2YWx1ZXMgPSBzZWxmLnRkYi5TZWxlY3QoCisgICAgICAgICAgICB0YWJuYW1lLCBOb25lLCBjb25kaXRpb25zPXsnTmFtZSc6IGRidGFibGVzLkxpa2VDb25kKCclZG9jJScpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgMSwgdmFsdWVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlc1swXVsnVHlwZSddLCAiV29yZCIsIHZhbHVlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXNbMF1bJ0FjY2VzcyddLCAiOSIsIHZhbHVlcykKKworCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUYWJsZURCVGVzdENhc2UpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnRhYmxlcy5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnRhYmxlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5ODMxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RidGFibGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnRhYmxlcy5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnRhYmxlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5ODMxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RidGFibGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kaXN0cmlidXRlZF90cmFuc2FjdGlvbnMucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kaXN0cmlidXRlZF90cmFuc2FjdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1ODU3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rpc3RyaWJ1dGVkX3RyYW5zYWN0aW9ucy5weQpAQCAtMCwwICsxLDE1MiBAQAorIiIiVGVzdENhc2VzIGZvciBkaXN0cmlidXRlZCB0cmFuc2FjdGlvbnMuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIHRlc3Rfc3VwcG9ydCwgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBcCisgICAgICAgIGdldF9uZXdfZGF0YWJhc2VfcGF0aAorCitmcm9tIHRlc3RfYWxsIGltcG9ydCB2ZXJib3NlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIERCVHhuX2Rpc3RyaWJ1dGVkKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBudW1fdHhucz0xMjM0CisgICAgbm9zeW5jPVRydWUKKyAgICBtdXN0X29wZW5fZGI9RmFsc2UKKyAgICBkZWYgX2NyZWF0ZV9lbnYoc2VsZiwgbXVzdF9vcGVuX2RiKSA6CisgICAgICAgIHNlbGYuZGJlbnYgPSBkYi5EQkVudigpCisgICAgICAgIHNlbGYuZGJlbnYuc2V0X3R4X21heChzZWxmLm51bV90eG5zKQorICAgICAgICBzZWxmLmRiZW52LnNldF9sa19tYXhfbG9ja2VycyhzZWxmLm51bV90eG5zKjIpCisgICAgICAgIHNlbGYuZGJlbnYuc2V0X2xrX21heF9sb2NrcyhzZWxmLm51bV90eG5zKjIpCisgICAgICAgIHNlbGYuZGJlbnYuc2V0X2xrX21heF9vYmplY3RzKHNlbGYubnVtX3R4bnMqMikKKyAgICAgICAgaWYgc2VsZi5ub3N5bmMgOgorICAgICAgICAgICAgc2VsZi5kYmVudi5zZXRfZmxhZ3MoZGIuREJfVFhOX05PU1lOQyxUcnVlKQorICAgICAgICBzZWxmLmRiZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQgfAorICAgICAgICAgICAgICAgIGRiLkRCX1JFQ09WRVIgfAorICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfVFhOIHwgZGIuREJfSU5JVF9MT0cgfCBkYi5EQl9JTklUX01QT09MIHwKKyAgICAgICAgICAgICAgICBkYi5EQl9JTklUX0xPQ0ssIDA2NjYpCisgICAgICAgIHNlbGYuZGIgPSBkYi5EQihzZWxmLmRiZW52KQorICAgICAgICBzZWxmLmRiLnNldF9yZV9sZW4oZGIuREJfR0lEX1NJWkUpCisgICAgICAgIGlmIG11c3Rfb3Blbl9kYiA6CisgICAgICAgICAgICB0eG49c2VsZi5kYmVudi50eG5fYmVnaW4oKQorICAgICAgICAgICAgc2VsZi5kYi5vcGVuKHNlbGYuZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgIGRiLkRCX1FVRVVFLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQsIDA2NjYsCisgICAgICAgICAgICAgICAgICAgIHR4bj10eG4pCisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKworICAgIGRlZiBzZXRVcChzZWxmKSA6CisgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSAidGVzdCIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NyZWF0ZV9lbnYobXVzdF9vcGVuX2RiPVRydWUpCisKKyAgICBkZWYgX2Rlc3Ryb3lfZW52KHNlbGYpOgorICAgICAgICBpZiBzZWxmLm5vc3luYyBvciAoZGIudmVyc2lvbigpWzoyXSA9PSAoNCw2KSk6ICAjIEtub3duIGJ1ZworICAgICAgICAgICAgc2VsZi5kYmVudi5sb2dfZmx1c2goKQorICAgICAgICBzZWxmLmRiLmNsb3NlKCkKKyAgICAgICAgc2VsZi5kYmVudi5jbG9zZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuX2Rlc3Ryb3lfZW52KCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCisKKyAgICBkZWYgX3JlY3JlYXRlX2VudihzZWxmLG11c3Rfb3Blbl9kYikgOgorICAgICAgICBzZWxmLl9kZXN0cm95X2VudigpCisgICAgICAgIHNlbGYuX2NyZWF0ZV9lbnYobXVzdF9vcGVuX2RiKQorCisgICAgZGVmIHRlc3QwMV9kaXN0cmlidXRlZF90cmFuc2FjdGlvbnMoc2VsZikgOgorICAgICAgICB0eG5zPXNldCgpCisgICAgICAgIGFkYXB0ID0gbGFtYmRhIHggOiB4CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzIDoKKyAgICAgICAgICAgIGFkYXB0ID0gbGFtYmRhIHggOiBieXRlcyh4LCAiYXNjaWkiKQorICAgICMgQ3JlYXRlIHRyYW5zYWN0aW9ucywgInByZXBhcmUiIHRoZW0sIGFuZAorICAgICMgbGV0IHRoZW0gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLm51bV90eG5zKSA6CisgICAgICAgICAgICB0eG4gPSBzZWxmLmRiZW52LnR4bl9iZWdpbigpCisgICAgICAgICAgICBnaWQgPSAiJSUlZGQiICVkYi5EQl9HSURfU0laRQorICAgICAgICAgICAgZ2lkID0gYWRhcHQoZ2lkICVpKQorICAgICAgICAgICAgc2VsZi5kYi5wdXQoaSwgZ2lkLCB0eG49dHhuLCBmbGFncz1kYi5EQl9BUFBFTkQpCisgICAgICAgICAgICB0eG5zLmFkZChnaWQpCisgICAgICAgICAgICB0eG4ucHJlcGFyZShnaWQpCisgICAgICAgIGRlbCB0eG4KKworICAgICAgICBzZWxmLl9yZWNyZWF0ZV9lbnYoc2VsZi5tdXN0X29wZW5fZGIpCisKKyAgICAjIEdldCAidG8gYmUgcmVjb3ZlcmVkIiB0cmFuc2FjdGlvbnMgYnV0CisgICAgIyBsZXQgdGhlbSBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgICAgICAgcmVjb3ZlcmVkX3R4bnM9c2VsZi5kYmVudi50eG5fcmVjb3ZlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5udW1fdHhucyxsZW4ocmVjb3ZlcmVkX3R4bnMpKQorICAgICAgICBmb3IgZ2lkLHR4biBpbiByZWNvdmVyZWRfdHhucyA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2lkIGluIHR4bnMpCisgICAgICAgIGRlbCB0eG4KKyAgICAgICAgZGVsIHJlY292ZXJlZF90eG5zCisKKyAgICAgICAgc2VsZi5fcmVjcmVhdGVfZW52KHNlbGYubXVzdF9vcGVuX2RiKQorCisgICAgIyBHZXQgInRvIGJlIHJlY292ZXJlZCIgdHJhbnNhY3Rpb25zLiBDb21taXQsIGFib3J0IGFuZAorICAgICMgZGlzY2FyZCB0aGVtLgorICAgICAgICByZWNvdmVyZWRfdHhucz1zZWxmLmRiZW52LnR4bl9yZWNvdmVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm51bV90eG5zLGxlbihyZWNvdmVyZWRfdHhucykpCisgICAgICAgIGRpc2NhcmRfdHhucz1zZXQoKQorICAgICAgICBjb21taXR0ZWRfdHhucz1zZXQoKQorICAgICAgICBzdGF0ZT0wCisgICAgICAgIGZvciBnaWQsdHhuIGluIHJlY292ZXJlZF90eG5zIDoKKyAgICAgICAgICAgIGlmIHN0YXRlPT0wIG9yIHN0YXRlPT0xOgorICAgICAgICAgICAgICAgIGNvbW1pdHRlZF90eG5zLmFkZChnaWQpCisgICAgICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgICAgICBlbGlmIHN0YXRlPT0yIDoKKyAgICAgICAgICAgICAgICB0eG4uYWJvcnQoKQorICAgICAgICAgICAgZWxpZiBzdGF0ZT09MyA6CisgICAgICAgICAgICAgICAgdHhuLmRpc2NhcmQoKQorICAgICAgICAgICAgICAgIGRpc2NhcmRfdHhucy5hZGQoZ2lkKQorICAgICAgICAgICAgICAgIHN0YXRlPS0xCisgICAgICAgICAgICBzdGF0ZSs9MQorICAgICAgICBkZWwgdHhuCisgICAgICAgIGRlbCByZWNvdmVyZWRfdHhucworCisgICAgICAgIHNlbGYuX3JlY3JlYXRlX2VudihzZWxmLm11c3Rfb3Blbl9kYikKKworICAgICMgVmVyaWZ5IHRoZSBkaXNjYXJkZWQgdHJhbnNhY3Rpb25zIGFyZSBzdGlsbAorICAgICMgYXJvdW5kLCBhbmQgZGlzcG9zZSB0aGVtLgorICAgICAgICByZWNvdmVyZWRfdHhucz1zZWxmLmRiZW52LnR4bl9yZWNvdmVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGlzY2FyZF90eG5zKSxsZW4ocmVjb3ZlcmVkX3R4bnMpKQorICAgICAgICBmb3IgZ2lkLHR4biBpbiByZWNvdmVyZWRfdHhucyA6CisgICAgICAgICAgICB0eG4uYWJvcnQoKQorICAgICAgICBkZWwgdHhuCisgICAgICAgIGRlbCByZWNvdmVyZWRfdHhucworCisgICAgICAgIHNlbGYuX3JlY3JlYXRlX2VudihtdXN0X29wZW5fZGI9VHJ1ZSkKKworICAgICMgQmUgc3VyZSB0aGVyZSBhcmUgbm90IHBlbmRpbmcgdHJhbnNhY3Rpb25zLgorICAgICMgQ2hlY2sgYWxzbyBkYXRhYmFzZSBzaXplLgorICAgICAgICByZWNvdmVyZWRfdHhucz1zZWxmLmRiZW52LnR4bl9yZWNvdmVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZWNvdmVyZWRfdHhucyk9PTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNvbW1pdHRlZF90eG5zKSxzZWxmLmRiLnN0YXQoKVsibmtleXMiXSkKKworY2xhc3MgREJUeG5fZGlzdHJpYnV0ZWRTWU5DKERCVHhuX2Rpc3RyaWJ1dGVkKToKKyAgICBub3N5bmM9RmFsc2UKKworY2xhc3MgREJUeG5fZGlzdHJpYnV0ZWRfbXVzdF9vcGVuX2RiKERCVHhuX2Rpc3RyaWJ1dGVkKToKKyAgICBtdXN0X29wZW5fZGI9VHJ1ZQorCitjbGFzcyBEQlR4bl9kaXN0cmlidXRlZFNZTkNfbXVzdF9vcGVuX2RiKERCVHhuX2Rpc3RyaWJ1dGVkKToKKyAgICBub3N5bmM9RmFsc2UKKyAgICBtdXN0X29wZW5fZGI9VHJ1ZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsNSkgOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEQlR4bl9kaXN0cmlidXRlZCkpCisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCVHhuX2Rpc3RyaWJ1dGVkU1lOQykpCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LDYpIDoKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJUeG5fZGlzdHJpYnV0ZWRfbXVzdF9vcGVuX2RiKSkKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJUeG5fZGlzdHJpYnV0ZWRTWU5DX211c3Rfb3Blbl9kYikpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rpc3RyaWJ1dGVkX3RyYW5zYWN0aW9ucy5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kaXN0cmlidXRlZF90cmFuc2FjdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmE1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kaXN0cmlidXRlZF90cmFuc2FjdGlvbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rpc3RyaWJ1dGVkX3RyYW5zYWN0aW9ucy5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kaXN0cmlidXRlZF90cmFuc2FjdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmE1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kaXN0cmlidXRlZF90cmFuc2FjdGlvbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Vhcmx5X2Nsb3NlLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZWFybHlfY2xvc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyNTI3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Vhcmx5X2Nsb3NlLnB5CkBAIC0wLDAgKzEsMjE1IEBACisiIiJUZXN0Q2FzZXMgZm9yIGNoZWNraW5nIHRoYXQgaXQgZG9lcyBub3Qgc2VnZmF1bHQgd2hlbiBhIERCRW52IG9iamVjdAoraXMgY2xvc2VkIGJlZm9yZSBpdHMgREIgb2JqZWN0cy4KKyIiIgorCitpbXBvcnQgb3MsIHN5cworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCB0ZXN0X3N1cHBvcnQsIHZlcmJvc2UsIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKKyMgV2UncmUgZ29pbmcgdG8gZ2V0IHdhcm5pbmdzIGluIHRoaXMgbW9kdWxlIGFib3V0IHRyeWluZyB0byBjbG9zZSB0aGUgZGIgd2hlbgorIyBpdHMgZW52IGlzIGFscmVhZHkgY2xvc2VkLiAgTGV0J3MganVzdCBpZ25vcmUgdGhvc2UuCit0cnk6CisgICAgaW1wb3J0IHdhcm5pbmdzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdEQiBjb3VsZCBub3QgYmUgY2xvc2VkIGluJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT1SdW50aW1lV2FybmluZykKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBEQkVudkNsb3NlZEVhcmx5Q3Jhc2godW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5ob21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9ICJ0ZXN0IgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKworICAgIGRlZiB0ZXN0MDFfY2xvc2VfZGJlbnZfYmVmb3JlX2RiKHNlbGYpOgorICAgICAgICBkYmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgZGJlbnYub3BlbihzZWxmLmhvbWVEaXIsCisgICAgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9DREJ8IGRiLkRCX0NSRUFURSB8ZGIuREJfVEhSRUFEfGRiLkRCX0lOSVRfTVBPT0wsCisgICAgICAgICAgICAgICAgICAgMDY2NikKKworICAgICAgICBkID0gZGIuREIoZGJlbnYpCisgICAgICAgIGQyID0gZGIuREIoZGJlbnYpCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFELCAwNjY2KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCTm9TdWNoRmlsZUVycm9yLCBkMi5vcGVuLAorICAgICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUrIjIiLCBkYi5EQl9CVFJFRSwgZGIuREJfVEhSRUFELCAwNjY2KQorCisgICAgICAgIGQucHV0KCJ0ZXN0IiwidGhpcyBpcyBhIHRlc3QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCJ0ZXN0IiksICJ0aGlzIGlzIGEgdGVzdCIsICJwdXQhPWdldCIpCisgICAgICAgIGRiZW52LmNsb3NlKCkgICMgVGhpcyAiY2xvc2UiIHNob3VsZCBjbG9zZSB0aGUgY2hpbGQgZGIgaGFuZGxlIGFsc28KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJFcnJvciwgZC5nZXQsICJ0ZXN0IikKKworICAgIGRlZiB0ZXN0MDJfY2xvc2VfZGJlbnZfYmVmb3JlX2RiY3Vyc29yKHNlbGYpOgorICAgICAgICBkYmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgZGJlbnYub3BlbihzZWxmLmhvbWVEaXIsCisgICAgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9DREJ8IGRiLkRCX0NSRUFURSB8ZGIuREJfVEhSRUFEfGRiLkRCX0lOSVRfTVBPT0wsCisgICAgICAgICAgICAgICAgICAgMDY2NikKKworICAgICAgICBkID0gZGIuREIoZGJlbnYpCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFELCAwNjY2KQorCisgICAgICAgIGQucHV0KCJ0ZXN0IiwidGhpcyBpcyBhIHRlc3QiKQorICAgICAgICBkLnB1dCgidGVzdDIiLCJhbm90aGVyIHRlc3QiKQorICAgICAgICBkLnB1dCgidGVzdDMiLCJhbm90aGVyIG9uZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoInRlc3QiKSwgInRoaXMgaXMgYSB0ZXN0IiwgInB1dCE9Z2V0IikKKyAgICAgICAgYz1kLmN1cnNvcigpCisgICAgICAgIGMuZmlyc3QoKQorICAgICAgICBjLm5leHQoKQorICAgICAgICBkLmNsb3NlKCkgICMgVGhpcyAiY2xvc2UiIHNob3VsZCBjbG9zZSB0aGUgY2hpbGQgZGIgaGFuZGxlIGFsc28KKyAgICAgIyBkYi5jbG9zZSBzaG91bGQgY2xvc2UgdGhlIGNoaWxkIGN1cnNvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkVycm9yLGMubmV4dCkKKworICAgICAgICBkID0gZGIuREIoZGJlbnYpCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFELCAwNjY2KQorICAgICAgICBjPWQuY3Vyc29yKCkKKyAgICAgICAgYy5maXJzdCgpCisgICAgICAgIGMubmV4dCgpCisgICAgICAgIGRiZW52LmNsb3NlKCkKKyAgICAjIFRoZSAiY2xvc2UiIHNob3VsZCBjbG9zZSB0aGUgY2hpbGQgZGIgaGFuZGxlIGFsc28sIHdpdGggY3Vyc29ycworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkVycm9yLCBjLm5leHQpCisKKyAgICBkZWYgdGVzdDAzX2Nsb3NlX2RiX2JlZm9yZV9kYmN1cnNvcl93aXRob3V0X2VudihzZWxmKToKKyAgICAgICAgaW1wb3J0IG9zLnBhdGgKKyAgICAgICAgcGF0aD1vcy5wYXRoLmpvaW4oc2VsZi5ob21lRGlyLHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGQgPSBkYi5EQigpCisgICAgICAgIGQub3BlbihwYXRoLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFELCAwNjY2KQorCisgICAgICAgIGQucHV0KCJ0ZXN0IiwidGhpcyBpcyBhIHRlc3QiKQorICAgICAgICBkLnB1dCgidGVzdDIiLCJhbm90aGVyIHRlc3QiKQorICAgICAgICBkLnB1dCgidGVzdDMiLCJhbm90aGVyIG9uZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoInRlc3QiKSwgInRoaXMgaXMgYSB0ZXN0IiwgInB1dCE9Z2V0IikKKyAgICAgICAgYz1kLmN1cnNvcigpCisgICAgICAgIGMuZmlyc3QoKQorICAgICAgICBjLm5leHQoKQorICAgICAgICBkLmNsb3NlKCkKKyAgICAjIFRoZSAiY2xvc2UiIHNob3VsZCBjbG9zZSB0aGUgY2hpbGQgZGIgaGFuZGxlIGFsc28KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJFcnJvciwgYy5uZXh0KQorCisgICAgZGVmIHRlc3QwNF9jbG9zZV9tYXNzaXZlKHNlbGYpOgorICAgICAgICBkYmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgZGJlbnYub3BlbihzZWxmLmhvbWVEaXIsCisgICAgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9DREJ8IGRiLkRCX0NSRUFURSB8ZGIuREJfVEhSRUFEfGRiLkRCX0lOSVRfTVBPT0wsCisgICAgICAgICAgICAgICAgICAgMDY2NikKKworICAgICAgICBkYnM9W2RiLkRCKGRiZW52KSBmb3IgaSBpbiB4cmFuZ2UoMTYpXQorICAgICAgICBjdXJzb3JzPVtdCisgICAgICAgIGZvciBpIGluIGRicyA6CisgICAgICAgICAgICBpLm9wZW4oc2VsZi5maWxlbmFtZSwgZGIuREJfQlRSRUUsIGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCwgMDY2NikKKworICAgICAgICBkYnNbMTBdLnB1dCgidGVzdCIsInRoaXMgaXMgYSB0ZXN0IikKKyAgICAgICAgZGJzWzEwXS5wdXQoInRlc3QyIiwiYW5vdGhlciB0ZXN0IikKKyAgICAgICAgZGJzWzEwXS5wdXQoInRlc3QzIiwiYW5vdGhlciBvbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRic1s0XS5nZXQoInRlc3QiKSwgInRoaXMgaXMgYSB0ZXN0IiwgInB1dCE9Z2V0IikKKworICAgICAgICBmb3IgaSBpbiBkYnMgOgorICAgICAgICAgICAgY3Vyc29ycy5leHRlbmQoW2kuY3Vyc29yKCkgZm9yIGogaW4geHJhbmdlKDMyKV0pCisKKyAgICAgICAgZm9yIGkgaW4gZGJzWzo6M10gOgorICAgICAgICAgICAgaS5jbG9zZSgpCisgICAgICAgIGZvciBpIGluIGN1cnNvcnNbOjozXSA6CisgICAgICAgICAgICBpLmNsb3NlKCkKKworICAgICMgQ2hlY2sgZm9yIG1pc3NpbmcgZXhjZXB0aW9uIGluIERCISAoYWZ0ZXIgREIgY2xvc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCRXJyb3IsIGRic1s5XS5nZXQsICJ0ZXN0IikKKworICAgICMgQ2hlY2sgZm9yIG1pc3NpbmcgZXhjZXB0aW9uIGluIERCQ3Vyc29yISAoYWZ0ZXIgREIgY2xvc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCRXJyb3IsIGN1cnNvcnNbMTAxXS5maXJzdCkKKworICAgICAgICBjdXJzb3JzWzgwXS5maXJzdCgpCisgICAgICAgIGN1cnNvcnNbODBdLm5leHQoKQorICAgICAgICBkYmVudi5jbG9zZSgpICAjIFRoaXMgImNsb3NlIiBzaG91bGQgY2xvc2UgdGhlIGNoaWxkIGRiIGhhbmRsZSBhbHNvCisgICAgIyBDaGVjayBmb3IgbWlzc2luZyBleGNlcHRpb24hIChhZnRlciBEQkVudiBjbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJFcnJvciwgY3Vyc29yc1s4MF0ubmV4dCkKKworICAgIGRlZiB0ZXN0MDVfY2xvc2VfZGJlbnZfZGVsZXRlX2RiX3N1Y2Nlc3Moc2VsZik6CisgICAgICAgIGRiZW52ID0gZGIuREJFbnYoKQorICAgICAgICBkYmVudi5vcGVuKHNlbGYuaG9tZURpciwKKyAgICAgICAgICAgICAgICAgICBkYi5EQl9JTklUX0NEQnwgZGIuREJfQ1JFQVRFIHxkYi5EQl9USFJFQUR8ZGIuREJfSU5JVF9NUE9PTCwKKyAgICAgICAgICAgICAgICAgICAwNjY2KQorCisgICAgICAgIGQgPSBkYi5EQihkYmVudikKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUsIGRiLkRCX0JUUkVFLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQsIDA2NjYpCisKKyAgICAgICAgZGJlbnYuY2xvc2UoKSAgIyBUaGlzICJjbG9zZSIgc2hvdWxkIGNsb3NlIHRoZSBjaGlsZCBkYiBoYW5kbGUgYWxzbworCisgICAgICAgIGRlbCBkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBnYworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBnYyA9IE5vbmUKKyAgICAgICAgaWYgZ2M6CisgICAgICAgICAgICAjIGZvcmNlIGQuX19kZWxfXyBbREJfZGVhbGxvY10gdG8gYmUgY2FsbGVkCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKworICAgIGRlZiB0ZXN0MDZfY2xvc2VfdHhuX2JlZm9yZV9kdXBfY3Vyc29yKHNlbGYpIDoKKyAgICAgICAgZGJlbnYgPSBkYi5EQkVudigpCisgICAgICAgIGRiZW52Lm9wZW4oc2VsZi5ob21lRGlyLGRiLkRCX0lOSVRfVFhOIHwgZGIuREJfSU5JVF9NUE9PTCB8CisgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9MT0cgfCBkYi5EQl9DUkVBVEUpCisgICAgICAgIGQgPSBkYi5EQihkYmVudikKKyAgICAgICAgdHhuID0gZGJlbnYudHhuX2JlZ2luKCkKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUsIGRidHlwZSA9IGRiLkRCX0hBU0gsIGZsYWdzID0gZGIuREJfQ1JFQVRFLAorICAgICAgICAgICAgICAgIHR4bj10eG4pCisgICAgICAgIGQucHV0KCJYWFgiLCAieXl5IiwgdHhuPXR4bikKKyAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgIHR4biA9IGRiZW52LnR4bl9iZWdpbigpCisgICAgICAgIGMxID0gZC5jdXJzb3IodHhuKQorICAgICAgICBjMiA9IGMxLmR1cCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCJYWFgiLCAieXl5IiksIGMxLmZpcnN0KCkpCisKKyAgICAgICAgIyBOb3QgaW50ZXJlc3RlZCBpbiB3YXJuaW5ncyBhYm91dCBpbXBsaWNpdCBjbG9zZS4KKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgIyBDb21wbGV0ZWx5IHJlc2V0dGluZyB0aGUgd2FybmluZyBzdGF0ZSBpcworICAgICAgICAgICAgIyBwcm9ibGVtYXRpYyB3aXRoIHB5dGhvbiA+PTIuNiB3aXRoIC0zIChweTNrIHdhcm5pbmcpLAorICAgICAgICAgICAgIyBiZWNhdXNlIHNvbWUgc3RkbGliIG1vZHVsZXMgc2VsZWN0aXZlbHkgaWdub3JlcyB3YXJuaW5ncy4KKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKKyAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgd2FybmluZ3MucmVzZXR3YXJuaW5ncygpCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgIyBXaGVuIHdlIGRyb3Agc3VwcG9ydCBmb3IgcHl0aG9uIDIuNAorICAgICAgICAgICAgIyB3ZSBjb3VsZCB1c2U6IChpbiAyLjUgd2UgbmVlZCBhIF9fZnV0dXJlX18gc3RhdGVtZW50KQorICAgICAgICAgICAgIworICAgICAgICAgICAgIyAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAjICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIpCisgICAgICAgICAgICAjICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgV2UgY2FuIG5vdCB1c2UgIndpdGgiIGFzIGlzLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGludmFsaWQgc3ludGF4CisgICAgICAgICAgICAjIGluIHB5dGhvbiAyLjQgYW5kICh3aXRoIG5vIF9fZnV0dXJlX18pIDIuNS4KKyAgICAgICAgICAgICMgSGVyZSB3ZSBzaW11bGF0ZSAid2l0aCIgZm9sbG93aW5nIFBFUCAzNDMgOgorICAgICAgICAgICAgdyA9IHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCkKKyAgICAgICAgICAgIHcuX19lbnRlcl9fKCkKKyAgICAgICAgICAgIHRyeSA6CisgICAgICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiKQorICAgICAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgZmluYWxseSA6CisgICAgICAgICAgICAgICAgdy5fX2V4aXRfXygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJDdXJzb3JDbG9zZWRFcnJvciwgYzIuZmlyc3QpCisKKyAgICBkZWYgdGVzdDA3X2Nsb3NlX2RiX2JlZm9yZV9zZXF1ZW5jZShzZWxmKToKKyAgICAgICAgaW1wb3J0IG9zLnBhdGgKKyAgICAgICAgcGF0aD1vcy5wYXRoLmpvaW4oc2VsZi5ob21lRGlyLHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGQgPSBkYi5EQigpCisgICAgICAgIGQub3BlbihwYXRoLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFELCAwNjY2KQorICAgICAgICBkYnM9ZGIuREJTZXF1ZW5jZShkKQorICAgICAgICBkLmNsb3NlKCkgICMgVGhpcyAiY2xvc2UiIHNob3VsZCBjbG9zZSB0aGUgY2hpbGQgREJTZXF1ZW5jZSBhbHNvCisgICAgICAgIGRicy5jbG9zZSgpICAjIElmIG5vdCBjbG9zZWQsIGNvcmUgZHVtcCAoaW4gQmVya2VsZXkgREIgNC42LiopCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCRW52Q2xvc2VkRWFybHlDcmFzaCkpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Vhcmx5X2Nsb3NlLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Vhcmx5X2Nsb3NlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjIzNzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZWFybHlfY2xvc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Vhcmx5X2Nsb3NlLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Vhcmx5X2Nsb3NlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjIzNzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZWFybHlfY2xvc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2ZpbGVpZC5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2ZpbGVpZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTVlYzgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZmlsZWlkLnB5CkBAIC0wLDAgKzEsNjEgQEAKKyIiIlRlc3RDYXNlIGZvciByZXNldGluZyBGaWxlIElELgorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCB0ZXN0X3N1cHBvcnQsIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKK2NsYXNzIEZpbGVpZFJlc2V0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kYl9wYXRoXzEgPSBnZXRfbmV3X2RhdGFiYXNlX3BhdGgoKQorICAgICAgICBzZWxmLmRiX3BhdGhfMiA9IGdldF9uZXdfZGF0YWJhc2VfcGF0aCgpCisgICAgICAgIHNlbGYuZGJfZW52X3BhdGggPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorCisgICAgZGVmIHRlc3RfZmlsZWlkX3Jlc2V0KHNlbGYpOgorICAgICAgICAjIGNyZWF0ZSBEQiAxCisgICAgICAgIHNlbGYuZGIxID0gZGIuREIoKQorICAgICAgICBzZWxmLmRiMS5vcGVuKHNlbGYuZGJfcGF0aF8xLCBkYnR5cGU9ZGIuREJfSEFTSCwgZmxhZ3M9KGRiLkRCX0NSRUFURXxkYi5EQl9FWENMKSkKKyAgICAgICAgc2VsZi5kYjEucHV0KCdzcGFtJywgJ2VnZ3MnKQorICAgICAgICBzZWxmLmRiMS5jbG9zZSgpCisKKyAgICAgICAgc2h1dGlsLmNvcHkoc2VsZi5kYl9wYXRoXzEsIHNlbGYuZGJfcGF0aF8yKQorCisgICAgICAgIHNlbGYuZGIyID0gZGIuREIoKQorICAgICAgICBzZWxmLmRiMi5vcGVuKHNlbGYuZGJfcGF0aF8yLCBkYnR5cGU9ZGIuREJfSEFTSCkKKyAgICAgICAgc2VsZi5kYjIucHV0KCdzcGFtJywgJ3NwYW0nKQorICAgICAgICBzZWxmLmRiMi5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5kYl9lbnYgPSBkYi5EQkVudigpCisgICAgICAgIHNlbGYuZGJfZW52Lm9wZW4oc2VsZi5kYl9lbnZfcGF0aCwgZGIuREJfQ1JFQVRFfGRiLkRCX0lOSVRfTVBPT0wpCisKKyAgICAgICAgIyB1c2UgZmlsZWlkX3Jlc2V0KCkgaGVyZQorICAgICAgICBzZWxmLmRiX2Vudi5maWxlaWRfcmVzZXQoc2VsZi5kYl9wYXRoXzIpCisKKyAgICAgICAgc2VsZi5kYjEgPSBkYi5EQihzZWxmLmRiX2VudikKKyAgICAgICAgc2VsZi5kYjEub3BlbihzZWxmLmRiX3BhdGhfMSwgZGJ0eXBlPWRiLkRCX0hBU0gsIGZsYWdzPWRiLkRCX1JET05MWSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiMS5nZXQoJ3NwYW0nKSwgJ2VnZ3MnKQorCisgICAgICAgIHNlbGYuZGIyID0gZGIuREIoc2VsZi5kYl9lbnYpCisgICAgICAgIHNlbGYuZGIyLm9wZW4oc2VsZi5kYl9wYXRoXzIsIGRidHlwZT1kYi5EQl9IQVNILCBmbGFncz1kYi5EQl9SRE9OTFkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYjIuZ2V0KCdzcGFtJyksICdzcGFtJykKKworICAgICAgICBzZWxmLmRiMS5jbG9zZSgpCisgICAgICAgIHNlbGYuZGIyLmNsb3NlKCkKKworICAgICAgICBzZWxmLmRiX2Vudi5jbG9zZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5kYl9wYXRoXzEpCisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5kYl9wYXRoXzIpCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5kYl9lbnZfcGF0aCkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LCA0KToKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoRmlsZWlkUmVzZXRUZXN0Q2FzZSkpCisgICAgcmV0dXJuIHN1aXRlCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9maWxlaWQucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZmlsZWlkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGNkYWFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZmlsZWlkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9maWxlaWQucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZmlsZWlkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGNkYWFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZmlsZWlkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9nZXRfbm9uZS5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2dldF9ub25lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NjNiNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9nZXRfbm9uZS5weQpAQCAtMCwwICsxLDkyIEBACisiIiIKK1Rlc3RDYXNlcyBmb3IgY2hlY2tpbmcgc2V0X2dldF9yZXR1cm5zX25vbmUuCisiIiIKKworaW1wb3J0IG9zLCBzdHJpbmcKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgdmVyYm9zZSwgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgR2V0UmV0dXJuc05vbmVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZ2V0X25ld19kYXRhYmFzZV9wYXRoKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworCisgICAgZGVmIHRlc3QwMV9nZXRfcmV0dXJuc19ub25lKHNlbGYpOgorICAgICAgICBkID0gZGIuREIoKQorICAgICAgICBkLm9wZW4oc2VsZi5maWxlbmFtZSwgZGIuREJfQlRSRUUsIGRiLkRCX0NSRUFURSkKKyAgICAgICAgZC5zZXRfZ2V0X3JldHVybnNfbm9uZSgxKQorCisgICAgICAgIGZvciB4IGluIHN0cmluZy5sZXR0ZXJzOgorICAgICAgICAgICAgZC5wdXQoeCwgeCAqIDQwKQorCisgICAgICAgIGRhdGEgPSBkLmdldCgnYmFkIGtleScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgTm9uZSkKKworICAgICAgICBkYXRhID0gZC5nZXQoc3RyaW5nLmxldHRlcnNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgc3RyaW5nLmxldHRlcnNbMF0qNDApCisKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGMgPSBkLmN1cnNvcigpCisgICAgICAgIHJlYyA9IGMuZmlyc3QoKQorICAgICAgICB3aGlsZSByZWM6CisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgcmVjID0gYy5uZXh0KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgbGVuKHN0cmluZy5sZXR0ZXJzKSkKKworICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgZC5jbG9zZSgpCisKKworICAgIGRlZiB0ZXN0MDJfZ2V0X3JhaXNlc19leGNlcHRpb24oc2VsZik6CisgICAgICAgIGQgPSBkYi5EQigpCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFKQorICAgICAgICBkLnNldF9nZXRfcmV0dXJuc19ub25lKDApCisKKyAgICAgICAgZm9yIHggaW4gc3RyaW5nLmxldHRlcnM6CisgICAgICAgICAgICBkLnB1dCh4LCB4ICogNDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJOb3RGb3VuZEVycm9yLCBkLmdldCwgJ2JhZCBrZXknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5nZXQsICdiYWQga2V5JykKKworICAgICAgICBkYXRhID0gZC5nZXQoc3RyaW5nLmxldHRlcnNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgc3RyaW5nLmxldHRlcnNbMF0qNDApCisKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGV4Y2VwdGlvbkhhcHBlbmVkID0gMAorICAgICAgICBjID0gZC5jdXJzb3IoKQorICAgICAgICByZWMgPSBjLmZpcnN0KCkKKyAgICAgICAgd2hpbGUgcmVjOgorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWMgPSBjLm5leHQoKQorICAgICAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvcjogICMgZW5kIG9mIHRoZSByZWNvcmRzCisgICAgICAgICAgICAgICAgZXhjZXB0aW9uSGFwcGVuZWQgPSAxCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlYywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4Y2VwdGlvbkhhcHBlbmVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBsZW4oc3RyaW5nLmxldHRlcnMpKQorCisgICAgICAgIGMuY2xvc2UoKQorICAgICAgICBkLmNsb3NlKCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEdldFJldHVybnNOb25lVGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2dldF9ub25lLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2dldF9ub25lLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFkYTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZ2V0X25vbmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2dldF9ub25lLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2dldF9ub25lLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGFkYTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZ2V0X25vbmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2pvaW4ucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9qb2luLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMGRmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9qb2luLnB5CkBAIC0wLDAgKzEsOTkgQEAKKyIiIlRlc3RDYXNlcyBmb3IgdXNpbmcgdGhlIERCLmpvaW4gYW5kIERCQ3Vyc29yLmpvaW5faXRlbSBtZXRob2RzLgorIiIiCisKK2ltcG9ydCBvcworCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIGRic2hlbHZlLCB0ZXN0X3N1cHBvcnQsIHZlcmJvc2UsIFwKKyAgICAgICAgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUHJvZHVjdEluZGV4ID0gWworICAgICgnYXBwbGUnLCAiQ29udmVuaWVuY2UgU3RvcmUiKSwKKyAgICAoJ2JsdWViZXJyeScsICJGYXJtZXIncyBNYXJrZXQiKSwKKyAgICAoJ3Nob3RndW4nLCAiUy1NYXJ0IiksICAgICAgICAgICAgICAjIEFpc2xlIDEyCisgICAgKCdwZWFyJywgIkZhcm1lcidzIE1hcmtldCIpLAorICAgICgnY2hhaW5zYXcnLCAiUy1NYXJ0IiksICAgICAgICAgICAgICMgIlNob3Agc21hcnQuICBTaG9wIFMtTWFydCEiCisgICAgKCdzdHJhd2JlcnJ5JywgIkZhcm1lcidzIE1hcmtldCIpLAorXQorCitDb2xvckluZGV4ID0gWworICAgICgnYmx1ZScsICJibHVlYmVycnkiKSwKKyAgICAoJ3JlZCcsICJhcHBsZSIpLAorICAgICgncmVkJywgImNoYWluc2F3IiksCisgICAgKCdyZWQnLCAic3RyYXdiZXJyeSIpLAorICAgICgneWVsbG93JywgInBlYWNoIiksCisgICAgKCd5ZWxsb3cnLCAicGVhciIpLAorICAgICgnYmxhY2snLCAic2hvdGd1biIpLAorXQorCitjbGFzcyBKb2luVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGtleXR5cGUgPSAnJworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAnLmRiJworICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICBzZWxmLmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sgKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmVudi5jbG9zZSgpCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCisgICAgZGVmIHRlc3QwMV9qb2luKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDFfam9pbi4uLiIgJSBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgICMgY3JlYXRlIGFuZCBwb3B1bGF0ZSBwcmltYXJ5IGluZGV4CisgICAgICAgIHByaURCID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIHByaURCLm9wZW4oc2VsZi5maWxlbmFtZSwgInByaW1hcnkiLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFKQorICAgICAgICBtYXAobGFtYmRhIHQsIHByaURCPXByaURCOiBwcmlEQi5wdXQoKnQpLCBQcm9kdWN0SW5kZXgpCisKKyAgICAgICAgIyBjcmVhdGUgYW5kIHBvcHVsYXRlIHNlY29uZGFyeSBpbmRleAorICAgICAgICBzZWNEQiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBzZWNEQi5zZXRfZmxhZ3MoZGIuREJfRFVQIHwgZGIuREJfRFVQU09SVCkKKyAgICAgICAgc2VjREIub3BlbihzZWxmLmZpbGVuYW1lLCAic2Vjb25kYXJ5IiwgZGIuREJfQlRSRUUsIGRiLkRCX0NSRUFURSkKKyAgICAgICAgbWFwKGxhbWJkYSB0LCBzZWNEQj1zZWNEQjogc2VjREIucHV0KCp0KSwgQ29sb3JJbmRleCkKKworICAgICAgICBzQ3Vyc29yID0gTm9uZQorICAgICAgICBqQ3Vyc29yID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIGxldHMgbG9vayB1cCBhbGwgb2YgdGhlIHJlZCBQcm9kdWN0cworICAgICAgICAgICAgc0N1cnNvciA9IHNlY0RCLmN1cnNvcigpCisgICAgICAgICAgICAjIERvbid0IGRvIHRoZSAuc2V0KCkgaW4gYW4gYXNzZXJ0LCBvciB5b3UgY2FuIGdldCBhIGJvZ3VzIGZhaWx1cmUKKyAgICAgICAgICAgICMgd2hlbiBydW5uaW5nIHB5dGhvbiAtTworICAgICAgICAgICAgdG1wID0gc0N1cnNvci5zZXQoJ3JlZCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodG1wKQorCisgICAgICAgICAgICAjIEZJWE1FOiBqQ3Vyc29yIGRvZXNuJ3QgcHJvcGVybHkgaG9sZCBhIHJlZmVyZW5jZSB0byBpdHMKKyAgICAgICAgICAgICMgY3Vyc29ycywgaWYgdGhleSBhcmUgY2xvc2VkIGJlZm9yZSBqY3Vyc29yIGlzIHVzZWQgaXQKKyAgICAgICAgICAgICMgY2FuIGNhdXNlIGEgY3Jhc2guCisgICAgICAgICAgICBqQ3Vyc29yID0gcHJpREIuam9pbihbc0N1cnNvcl0pCisKKyAgICAgICAgICAgIGlmIGpDdXJzb3IuZ2V0KDApICE9ICgnYXBwbGUnLCAiQ29udmVuaWVuY2UgU3RvcmUiKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImpvaW4gY3Vyc29yIHBvc2l0aW9uZWQgd3JvbmciKQorICAgICAgICAgICAgaWYgakN1cnNvci5qb2luX2l0ZW0oKSAhPSAnY2hhaW5zYXcnOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiREJDdXJzb3Iuam9pbl9pdGVtIHJldHVybmVkIHdyb25nIGl0ZW0iKQorICAgICAgICAgICAgaWYgakN1cnNvci5nZXQoMClbMF0gIT0gJ3N0cmF3YmVycnknOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiam9pbiBjdXJzb3IgcmV0dXJuZWQgd3JvbmcgdGhpbmciKQorICAgICAgICAgICAgaWYgakN1cnNvci5nZXQoMCk6ICAjIHRoZXJlIHdlcmUgb25seSB0aHJlZSByZWQgaXRlbXMgdG8gcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJqb2luIGN1cnNvciByZXR1cm5lZCB0b28gbWFueSBpdGVtcyIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBqQ3Vyc29yOgorICAgICAgICAgICAgICAgIGpDdXJzb3IuY2xvc2UoKQorICAgICAgICAgICAgaWYgc0N1cnNvcjoKKyAgICAgICAgICAgICAgICBzQ3Vyc29yLmNsb3NlKCkKKyAgICAgICAgICAgIHByaURCLmNsb3NlKCkKKyAgICAgICAgICAgIHNlY0RCLmNsb3NlKCkKKworCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEpvaW5UZXN0Q2FzZSkpCisKKyAgICByZXR1cm4gc3VpdGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2pvaW4ucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3Rfam9pbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUwMjFkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2pvaW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2pvaW4ucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3Rfam9pbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUwMjFkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2pvaW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2xvY2sucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9sb2NrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwY2E4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9sb2NrLnB5CkBAIC0wLDAgKzEsMTg0IEBACisiIiIKK1Rlc3RDYXNlcyBmb3IgdGVzdGluZyB0aGUgbG9ja2luZyBzdWItc3lzdGVtLgorIiIiCisKK2ltcG9ydCB0aW1lCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIHRlc3Rfc3VwcG9ydCwgdmVyYm9zZSwgaGF2ZV90aHJlYWRzLCBcCisgICAgICAgIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKK2lmIGhhdmVfdGhyZWFkcyA6CisgICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRocmVhZAorICAgIGltcG9ydCBzeXMKKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBjdXJyZW50VGhyZWFkCisgICAgZWxzZSA6CisgICAgICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBjdXJyZW50X3RocmVhZCBhcyBjdXJyZW50VGhyZWFkCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExvY2tpbmdUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICBzZWxmLmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9MT0NLIHwgZGIuREJfQ1JFQVRFKQorCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZW52LmNsb3NlKCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCisKKworICAgIGRlZiB0ZXN0MDFfc2ltcGxlKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDFfc2ltcGxlLi4uIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgYW5JRCA9IHNlbGYuZW52LmxvY2tfaWQoKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgImxvY2tlciBJRDogJXMiICUgYW5JRAorICAgICAgICBsb2NrID0gc2VsZi5lbnYubG9ja19nZXQoYW5JRCwgInNvbWUgbG9ja2VkIHRoaW5nIiwgZGIuREJfTE9DS19XUklURSkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJBcXVpcmVkIGxvY2s6ICVzIiAlIGxvY2sKKyAgICAgICAgc2VsZi5lbnYubG9ja19wdXQobG9jaykKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJSZWxlYXNlZCBsb2NrOiAlcyIgJSBsb2NrCisgICAgICAgIHNlbGYuZW52LmxvY2tfaWRfZnJlZShhbklEKQorCisKKyAgICBkZWYgdGVzdDAyX3RocmVhZGVkKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDJfdGhyZWFkZWQuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICB0aHJlYWRzID0gW10KKyAgICAgICAgdGhyZWFkcy5hcHBlbmQoVGhyZWFkKHRhcmdldCA9IHNlbGYudGhlVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oZGIuREJfTE9DS19XUklURSwpKSkKKyAgICAgICAgdGhyZWFkcy5hcHBlbmQoVGhyZWFkKHRhcmdldCA9IHNlbGYudGhlVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oZGIuREJfTE9DS19SRUFELCkpKQorICAgICAgICB0aHJlYWRzLmFwcGVuZChUaHJlYWQodGFyZ2V0ID0gc2VsZi50aGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShkYi5EQl9MT0NLX1JFQUQsKSkpCisgICAgICAgIHRocmVhZHMuYXBwZW5kKFRocmVhZCh0YXJnZXQgPSBzZWxmLnRoZVRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGRiLkRCX0xPQ0tfV1JJVEUsKSkpCisgICAgICAgIHRocmVhZHMuYXBwZW5kKFRocmVhZCh0YXJnZXQgPSBzZWxmLnRoZVRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGRiLkRCX0xPQ0tfUkVBRCwpKSkKKyAgICAgICAgdGhyZWFkcy5hcHBlbmQoVGhyZWFkKHRhcmdldCA9IHNlbGYudGhlVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oZGIuREJfTE9DS19SRUFELCkpKQorICAgICAgICB0aHJlYWRzLmFwcGVuZChUaHJlYWQodGFyZ2V0ID0gc2VsZi50aGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShkYi5EQl9MT0NLX1dSSVRFLCkpKQorICAgICAgICB0aHJlYWRzLmFwcGVuZChUaHJlYWQodGFyZ2V0ID0gc2VsZi50aGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShkYi5EQl9MT0NLX1dSSVRFLCkpKQorICAgICAgICB0aHJlYWRzLmFwcGVuZChUaHJlYWQodGFyZ2V0ID0gc2VsZi50aGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShkYi5EQl9MT0NLX1dSSVRFLCkpKQorCisgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICAgICAgdC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHQuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICB0LmpvaW4oKQorCisgICAgICAgIGRlZiB0ZXN0MDNfbG9ja190aW1lb3V0KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5lbnYuc2V0X3RpbWVvdXQoMCwgZGIuREJfU0VUX0xPQ0tfVElNRU9VVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnYuZ2V0X3RpbWVvdXQoZGIuREJfU0VUX0xPQ0tfVElNRU9VVCksIDApCisgICAgICAgICAgICBzZWxmLmVudi5zZXRfdGltZW91dCgwLCBkYi5EQl9TRVRfVFhOX1RJTUVPVVQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW52LmdldF90aW1lb3V0KGRiLkRCX1NFVF9UWE5fVElNRU9VVCksIDApCisgICAgICAgICAgICBzZWxmLmVudi5zZXRfdGltZW91dCgxMjM0NTYsIGRiLkRCX1NFVF9MT0NLX1RJTUVPVVQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW52LmdldF90aW1lb3V0KGRiLkRCX1NFVF9MT0NLX1RJTUVPVVQpLCAxMjM0NTYpCisgICAgICAgICAgICBzZWxmLmVudi5zZXRfdGltZW91dCg3ODkwMTIzLCBkYi5EQl9TRVRfVFhOX1RJTUVPVVQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW52LmdldF90aW1lb3V0KGRiLkRCX1NFVF9UWE5fVElNRU9VVCksIDc4OTAxMjMpCisKKyAgICBkZWYgdGVzdDA0X2xvY2tfdGltZW91dDIoc2VsZik6CisgICAgICAgIHNlbGYuZW52LnNldF90aW1lb3V0KDAsIGRiLkRCX1NFVF9MT0NLX1RJTUVPVVQpCisgICAgICAgIHNlbGYuZW52LnNldF90aW1lb3V0KDAsIGRiLkRCX1NFVF9UWE5fVElNRU9VVCkKKyAgICAgICAgc2VsZi5lbnYuc2V0X3RpbWVvdXQoMTIzNDU2LCBkYi5EQl9TRVRfTE9DS19USU1FT1VUKQorICAgICAgICBzZWxmLmVudi5zZXRfdGltZW91dCg3ODkwMTIzLCBkYi5EQl9TRVRfVFhOX1RJTUVPVVQpCisKKyAgICAgICAgZGVmIGRlYWRsb2NrX2RldGVjdGlvbigpIDoKKyAgICAgICAgICAgIHdoaWxlIG5vdCBkZWFkbG9ja19kZXRlY3Rpb24uZW5kIDoKKyAgICAgICAgICAgICAgICBkZWFkbG9ja19kZXRlY3Rpb24uY291bnQgPSBcCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW52LmxvY2tfZGV0ZWN0KGRiLkRCX0xPQ0tfRVhQSVJFKQorICAgICAgICAgICAgICAgIGlmIGRlYWRsb2NrX2RldGVjdGlvbi5jb3VudCA6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBkZWFkbG9ja19kZXRlY3Rpb24uZW5kIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDEpCisKKyAgICAgICAgZGVhZGxvY2tfZGV0ZWN0aW9uLmVuZD1GYWxzZQorICAgICAgICBkZWFkbG9ja19kZXRlY3Rpb24uY291bnQ9MAorICAgICAgICB0PVRocmVhZCh0YXJnZXQ9ZGVhZGxvY2tfZGV0ZWN0aW9uKQorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgIHQuc2V0RGFlbW9uKFRydWUpCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgdC5kYWVtb24gPSBUcnVlCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICBzZWxmLmVudi5zZXRfdGltZW91dCgxMDAwMDAsIGRiLkRCX1NFVF9MT0NLX1RJTUVPVVQpCisgICAgICAgIGFuSUQgPSBzZWxmLmVudi5sb2NrX2lkKCkKKyAgICAgICAgYW5JRDIgPSBzZWxmLmVudi5sb2NrX2lkKCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChhbklELCBhbklEMikKKyAgICAgICAgbG9jayA9IHNlbGYuZW52LmxvY2tfZ2V0KGFuSUQsICJzaGFyZWQgbG9jayIsIGRiLkRCX0xPQ0tfV1JJVEUpCisgICAgICAgIHN0YXJ0X3RpbWU9dGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJMb2NrTm90R3JhbnRlZEVycm9yLAorICAgICAgICAgICAgICAgIHNlbGYuZW52LmxvY2tfZ2V0LGFuSUQyLCAic2hhcmVkIGxvY2siLCBkYi5EQl9MT0NLX1JFQUQpCisgICAgICAgIGVuZF90aW1lPXRpbWUudGltZSgpCisgICAgICAgIGRlYWRsb2NrX2RldGVjdGlvbi5lbmQ9VHJ1ZQorICAgICAgICAjIEZsb2F0aW5nIHBvaW50IHJvdW5kaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoZW5kX3RpbWUtc3RhcnRfdGltZSkgPj0gMC4wOTk5KQorICAgICAgICBzZWxmLmVudi5sb2NrX3B1dChsb2NrKQorICAgICAgICB0LmpvaW4oKQorCisgICAgICAgIHNlbGYuZW52LmxvY2tfaWRfZnJlZShhbklEKQorICAgICAgICBzZWxmLmVudi5sb2NrX2lkX2ZyZWUoYW5JRDIpCisKKyAgICAgICAgaWYgZGIudmVyc2lvbigpID49ICg0LDYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRlYWRsb2NrX2RldGVjdGlvbi5jb3VudD4wKQorCisgICAgZGVmIHRoZVRocmVhZChzZWxmLCBsb2NrVHlwZSk6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgbmFtZSA9IGN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkKKyAgICAgICAgZWxzZSA6CisgICAgICAgICAgICBuYW1lID0gY3VycmVudFRocmVhZCgpLm5hbWUKKworICAgICAgICBpZiBsb2NrVHlwZSA9PSAgZGIuREJfTE9DS19XUklURToKKyAgICAgICAgICAgIGx0ID0gIndyaXRlIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbHQgPSAicmVhZCIKKworICAgICAgICBhbklEID0gc2VsZi5lbnYubG9ja19pZCgpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXM6IGxvY2tlciBJRDogJXMiICUgKG5hbWUsIGFuSUQpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMDApIDoKKyAgICAgICAgICAgIGxvY2sgPSBzZWxmLmVudi5sb2NrX2dldChhbklELCAic29tZSBsb2NrZWQgdGhpbmciLCBsb2NrVHlwZSkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiBBcXVpcmVkICVzIGxvY2s6ICVzIiAlIChuYW1lLCBsdCwgbG9jaykKKworICAgICAgICAgICAgc2VsZi5lbnYubG9ja19wdXQobG9jaykKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiBSZWxlYXNlZCAlcyBsb2NrOiAlcyIgJSAobmFtZSwgbHQsIGxvY2spCisKKyAgICAgICAgc2VsZi5lbnYubG9ja19pZF9mcmVlKGFuSUQpCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisKKyAgICBpZiBoYXZlX3RocmVhZHM6CisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKExvY2tpbmdUZXN0Q2FzZSkpCisgICAgZWxzZToKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoTG9ja2luZ1Rlc3RDYXNlLCAndGVzdDAxJykpCisKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbG9jay5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9sb2NrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTdjYWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbG9jay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbG9jay5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9sb2NrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTdjYWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbG9jay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbWlzYy5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X21pc2MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlOTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X21pc2MucHkKQEAgLTAsMCArMSwxMzggQEAKKyIiIk1pc2NlbGxhbmVvdXMgYnNkZGIgbW9kdWxlIHRlc3QgY2FzZXMKKyIiIgorCitpbXBvcnQgb3MsIHN5cworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCBkYnNoZWx2ZSwgaGFzaG9wZW4sIHRlc3Rfc3VwcG9ydCwgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTWlzY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBnZXRfbmV3X2RhdGFiYXNlX3BhdGgoKQorICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCisgICAgZGVmIHRlc3QwMV9iYWRwb2ludGVyKHNlbGYpOgorICAgICAgICBkYnMgPSBkYnNoZWx2ZS5vcGVuKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGRicy5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCRXJyb3IsIGRicy5nZXQsICJmb28iKQorCisgICAgZGVmIHRlc3QwMl9kYl9ob21lKHNlbGYpOgorICAgICAgICBlbnYgPSBkYi5EQkVudigpCisgICAgICAgICMgY2hlY2sgZm9yIGNyYXNoIGZpeGVkIHdoZW4gZGJfaG9tZSBpcyB1c2VkIGJlZm9yZSBvcGVuKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVudi5kYl9ob21lIGlzIE5vbmUpCisgICAgICAgIGVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFKQorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaG9tZURpciwgZW52LmRiX2hvbWUpCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhzZWxmLmhvbWVEaXIsICJhc2NpaSIpLCBlbnYuZGJfaG9tZSkKKworICAgIGRlZiB0ZXN0MDNfcmVwcl9jbG9zZWRfZGIoc2VsZik6CisgICAgICAgIGRiID0gaGFzaG9wZW4oc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZGIuY2xvc2UoKQorICAgICAgICBycCA9IHJlcHIoZGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnAsICJ7fSIpCisKKyAgICBkZWYgdGVzdDA0X3JlcHJfZGIoc2VsZikgOgorICAgICAgICBkYiA9IGhhc2hvcGVuKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGQgPSB7fQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKSA6CisgICAgICAgICAgICBkYltyZXByKGkpXSA9IHJlcHIoMTAwKmkpCisgICAgICAgICAgICBkW3JlcHIoaSldID0gcmVwcigxMDAqaSkKKyAgICAgICAgZGIuY2xvc2UoKQorICAgICAgICBkYiA9IGhhc2hvcGVuKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIHJwID0gcmVwcihkYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChycCwgcmVwcihkKSkKKyAgICAgICAgZGIuY2xvc2UoKQorCisgICAgIyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvaW5kZXgucGhwP2Z1bmM9ZGV0YWlsJmFpZD0xNzA4ODY4Jmdyb3VwX2lkPTEzOTAwJmF0aWQ9MzEzOTAwCisgICAgIworICAgICMgU2VlIHRoZSBidWcgcmVwb3J0IGZvciBkZXRhaWxzLgorICAgICMKKyAgICAjIFRoZSBwcm9ibGVtIHdhcyB0aGF0IG1ha2Vfa2V5X2RidCgpIHdhcyBub3QgYWxsb2NhdGluZyBhIGNvcHkgb2YKKyAgICAjIHN0cmluZyBrZXlzIGJ1dCBGUkVFX0RCVCgpIHdhcyBhbHdheXMgYmVpbmcgdG9sZCB0byBmcmVlIGl0IHdoZW4gdGhlCisgICAgIyBkYXRhYmFzZSB3YXMgb3BlbmVkIHdpdGggREJfVEhSRUFELgorICAgIGRlZiB0ZXN0MDVfZG91YmxlX2ZyZWVfbWFrZV9rZXlfZGJ0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYjEgPSBkYi5EQigpCisgICAgICAgICAgICBkYjEub3BlbihzZWxmLmZpbGVuYW1lLCBOb25lLCBkYi5EQl9CVFJFRSwKKyAgICAgICAgICAgICAgICAgICAgIGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCkKKworICAgICAgICAgICAgY3VycyA9IGRiMS5jdXJzb3IoKQorICAgICAgICAgICAgdCA9IGN1cnMuZ2V0KCIvZm9vIiwgZGIuREJfU0VUKQorICAgICAgICAgICAgIyBkb3VibGUgZnJlZSBoYXBwZW5lZCBkdXJpbmcgZXhpdCBmcm9tIERCQ19nZXQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRiMS5jbG9zZSgpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYuZmlsZW5hbWUpCisKKyAgICBkZWYgdGVzdDA2X2tleV93aXRoX251bGxfYnl0ZXMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRiMSA9IGRiLkRCKCkKKyAgICAgICAgICAgIGRiMS5vcGVuKHNlbGYuZmlsZW5hbWUsIE5vbmUsIGRiLkRCX0hBU0gsIGRiLkRCX0NSRUFURSkKKyAgICAgICAgICAgIGRiMVsnYSddID0gJ2VoPycKKyAgICAgICAgICAgIGRiMVsnYVx4MDAnXSA9ICdlaCB6ZWQuJworICAgICAgICAgICAgZGIxWydhXHgwMGEnXSA9ICdlaCB6ZWQgZWg/JworICAgICAgICAgICAgZGIxWydhYWEnXSA9ICdlaCBlaCBlaCEnCisgICAgICAgICAgICBrZXlzID0gZGIxLmtleXMoKQorICAgICAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydhJywgJ2FceDAwJywgJ2FceDAwYScsICdhYWEnXSwga2V5cykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGIxWydhJ10sICdlaD8nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYjFbJ2FceDAwJ10sICdlaCB6ZWQuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGIxWydhXHgwMGEnXSwgJ2VoIHplZCBlaD8nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYjFbJ2FhYSddLCAnZWggZWggZWghJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRiMS5jbG9zZSgpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYuZmlsZW5hbWUpCisKKyAgICBkZWYgdGVzdDA3X0RCX3NldF9mbGFnc19wZXJzaXN0cyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGIxID0gZGIuREIoKQorICAgICAgICAgICAgZGIxLnNldF9mbGFncyhkYi5EQl9EVVBTT1JUKQorICAgICAgICAgICAgZGIxLm9wZW4oc2VsZi5maWxlbmFtZSwgZGIuREJfSEFTSCwgZGIuREJfQ1JFQVRFKQorICAgICAgICAgICAgZGIxWydhJ10gPSAnZWgnCisgICAgICAgICAgICBkYjFbJ2EnXSA9ICdBJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKCdhJywgJ0EnKV0sIGRiMS5pdGVtcygpKQorICAgICAgICAgICAgZGIxLnB1dCgnYScsICdBYScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoJ2EnLCAnQScpLCAoJ2EnLCAnQWEnKV0sIGRiMS5pdGVtcygpKQorICAgICAgICAgICAgZGIxLmNsb3NlKCkKKyAgICAgICAgICAgIGRiMSA9IGRiLkRCKCkKKyAgICAgICAgICAgICMgbm8gc2V0X2ZsYWdzIGNhbGwsIHdlJ3JlIHRlc3RpbmcgdGhhdCBpdCByZWFkcyBhbmQgb2JleXMKKyAgICAgICAgICAgICMgdGhlIGZsYWdzIG9uIG9wZW4uCisgICAgICAgICAgICBkYjEub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9IQVNIKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKCdhJywgJ0EnKSwgKCdhJywgJ0FhJyldLCBkYjEuaXRlbXMoKSkKKyAgICAgICAgICAgICMgaWYgaXQgcmVhZCB0aGUgZmxhZ3MgcmlnaHQgdGhpcyB3aWxsIHJlcGxhY2UgYWxsIHZhbHVlcworICAgICAgICAgICAgIyBmb3Iga2V5ICdhJyBpbnN0ZWFkIG9mIGFkZGluZyBhIG5ldyBvbmUuICAoYXMgYSBkaWN0IHNob3VsZCkKKyAgICAgICAgICAgIGRiMVsnYSddID0gJ25ldyBBJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKCdhJywgJ25ldyBBJyldLCBkYjEuaXRlbXMoKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRiMS5jbG9zZSgpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYuZmlsZW5hbWUpCisKKworICAgIGRlZiB0ZXN0MDhfRXhjZXB0aW9uVHlwZXMoc2VsZikgOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhkYi5EQkVycm9yLCBFeGNlcHRpb24pKQorICAgICAgICBmb3IgaSwgaiBpbiBkYi5fX2RpY3RfXy5pdGVtcygpIDoKKyAgICAgICAgICAgIGlmIGkuc3RhcnRzd2l0aCgiREIiKSBhbmQgaS5lbmRzd2l0aCgiRXJyb3IiKSA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoaiwgZGIuREJFcnJvciksIG1zZz1pKQorICAgICAgICAgICAgICAgIGlmIGkgbm90IGluICgiREJLZXlFbXB0eUVycm9yIiwgIkRCTm90Rm91bmRFcnJvciIpIDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGosIEtleUVycm9yKSwgbXNnPWkpCisKKyAgICAgICAgIyBUaGlzIHR3byBleGNlcHRpb25zIGhhdmUgdHdvIGJhc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGRiLkRCS2V5RW1wdHlFcnJvciwgS2V5RXJyb3IpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhkYi5EQk5vdEZvdW5kRXJyb3IsIEtleUVycm9yKSkKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShNaXNjVGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X21pc2MucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbWlzYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1NWI4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X21pc2MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X21pc2MucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbWlzYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1NWI4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X21pc2MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3BpY2tsZS5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3BpY2tsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTg0NzhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcGlja2xlLnB5CkBAIC0wLDAgKzEsNjggQEAKKworaW1wb3J0IG9zCitpbXBvcnQgcGlja2xlCitpbXBvcnQgc3lzCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBjUGlja2xlCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBjUGlja2xlID0gTm9uZQorZWxzZSA6CisgICAgY1BpY2tsZSA9IE5vbmUKKworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCB0ZXN0X3N1cHBvcnQsIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIHBpY2tsZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJWZXJpZnkgdGhhdCBEQkVycm9yIGNhbiBiZSBwaWNrbGVkIGFuZCB1bnBpY2tsZWQiIiIKKyAgICBkYl9uYW1lID0gJ3Rlc3QtZGJvYmouZGInCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2RiJyk6CisgICAgICAgICAgICBkZWwgc2VsZi5kYgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdlbnYnKToKKyAgICAgICAgICAgIGRlbCBzZWxmLmVudgorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKworICAgIGRlZiBfYmFzZV90ZXN0X3BpY2tsZV9EQkVycm9yKHNlbGYsIHBpY2tsZSk6CisgICAgICAgIHNlbGYuZW52ID0gZGIuREJFbnYoKQorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCkKKyAgICAgICAgc2VsZi5kYiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5kYl9uYW1lLCBkYi5EQl9IQVNILCBkYi5EQl9DUkVBVEUpCisgICAgICAgIHNlbGYuZGIucHV0KCdzcGFtJywgJ2VnZ3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJbJ3NwYW0nXSwgJ2VnZ3MnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRiLnB1dCgnc3BhbScsICdoYW0nLCBmbGFncz1kYi5EQl9OT09WRVJXUklURSkKKyAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3IsIGVnZzoKKyAgICAgICAgICAgIHBpY2tsZWRFZ2cgPSBwaWNrbGUuZHVtcHMoZWdnKQorICAgICAgICAgICAgI3ByaW50IHJlcHIocGlja2xlZEVnZykKKyAgICAgICAgICAgIHJvdHRlbkVnZyA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkRWdnKQorICAgICAgICAgICAgaWYgcm90dGVuRWdnLmFyZ3MgIT0gZWdnLmFyZ3Mgb3IgdHlwZShyb3R0ZW5FZ2cpICE9IHR5cGUoZWdnKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sIChyb3R0ZW5FZ2csICchPScsIGVnZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiwgIndoZXJlJ3MgbXkgREJFcnJvciBleGNlcHRpb24/IT8iCisKKyAgICAgICAgc2VsZi5kYi5jbG9zZSgpCisgICAgICAgIHNlbGYuZW52LmNsb3NlKCkKKworICAgIGRlZiB0ZXN0MDFfcGlja2xlX0RCRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuX2Jhc2VfdGVzdF9waWNrbGVfREJFcnJvcihwaWNrbGU9cGlja2xlKQorCisgICAgaWYgY1BpY2tsZToKKyAgICAgICAgZGVmIHRlc3QwMl9jUGlja2xlX0RCRXJyb3Ioc2VsZik6CisgICAgICAgICAgICBzZWxmLl9iYXNlX3Rlc3RfcGlja2xlX0RCRXJyb3IocGlja2xlPWNQaWNrbGUpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShwaWNrbGVUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3BpY2tsZS5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9waWNrbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTY1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9waWNrbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3BpY2tsZS5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9waWNrbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTY1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9waWNrbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3F1ZXVlLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcXVldWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIxM2ZmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3F1ZXVlLnB5CkBAIC0wLDAgKzEsMTYzIEBACisiIiIKK1Rlc3RDYXNlcyBmb3IgZXhlcmNpc2luZyBhIFF1ZXVlIERCLgorIiIiCisKK2ltcG9ydCBvcywgc3RyaW5nCitmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIHZlcmJvc2UsIGdldF9uZXdfZGF0YWJhc2VfcGF0aAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBTaW1wbGVRdWV1ZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBnZXRfbmV3X2RhdGFiYXNlX3BhdGgoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgcGFzcworCisKKyAgICBkZWYgdGVzdDAxX2Jhc2ljKHNlbGYpOgorICAgICAgICAjIEJhc2ljIFF1ZXVlIHRlc3RzIHVzaW5nIHRoZSBkZXByZWNhdGVkIERCQ3Vyc29yLmNvbnN1bWUgbWV0aG9kLgorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwMV9iYXNpYy4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGQgPSBkYi5EQigpCisgICAgICAgIGQuc2V0X3JlX2xlbig0MCkgICMgUXVldWVzIG11c3QgYmUgZml4ZWQgbGVuZ3RoCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9RVUVVRSwgZGIuREJfQ1JFQVRFKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiYmVmb3JlIGFwcGVuZHMiICsgJy0nICogMzAKKyAgICAgICAgICAgIHBwcmludChkLnN0YXQoKSkKKworICAgICAgICBmb3IgeCBpbiBzdHJpbmcubGV0dGVyczoKKyAgICAgICAgICAgIGQuYXBwZW5kKHggKiA0MCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgbGVuKHN0cmluZy5sZXR0ZXJzKSkKKworICAgICAgICBkLnB1dCgxMDAsICJzb21lIG1vcmUgZGF0YSIpCisgICAgICAgIGQucHV0KDEwMSwgImFuZCBzb21lIG1vcmUgIikKKyAgICAgICAgZC5wdXQoNzUsICAib3V0IG9mIG9yZGVyIikKKyAgICAgICAgZC5wdXQoMSwgICAicmVwbGFjZW1lbnQgZGF0YSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIGxlbihzdHJpbmcubGV0dGVycykrMykKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgImJlZm9yZSBjbG9zZSIgKyAnLScgKiAzMAorICAgICAgICAgICAgcHByaW50KGQuc3RhdCgpKQorCisgICAgICAgIGQuY2xvc2UoKQorICAgICAgICBkZWwgZAorICAgICAgICBkID0gZGIuREIoKQorICAgICAgICBkLm9wZW4oc2VsZi5maWxlbmFtZSkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgImFmdGVyIG9wZW4iICsgJy0nICogMzAKKyAgICAgICAgICAgIHBwcmludChkLnN0YXQoKSkKKworICAgICAgICAjIFRlc3QgInR4biIgYXMgYSBwb3NpdGlvbmFsIHBhcmFtZXRlcgorICAgICAgICBkLmFwcGVuZCgib25lIG1vcmUiLCBOb25lKQorICAgICAgICAjIFRlc3QgInR4biIgYXMgYSBrZXl3b3JkIHBhcmFtZXRlcgorICAgICAgICBkLmFwcGVuZCgiYW5vdGhlciBvbmUiLCB0eG49Tm9uZSkKKworICAgICAgICBjID0gZC5jdXJzb3IoKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiYWZ0ZXIgYXBwZW5kIiArICctJyAqIDMwCisgICAgICAgICAgICBwcHJpbnQoZC5zdGF0KCkpCisKKyAgICAgICAgcmVjID0gYy5jb25zdW1lKCkKKyAgICAgICAgd2hpbGUgcmVjOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIHJlYyA9IGMuY29uc3VtZSgpCisgICAgICAgIGMuY2xvc2UoKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiYWZ0ZXIgY29uc3VtZSBsb29wIiArICctJyAqIDMwCisgICAgICAgICAgICBwcHJpbnQoZC5zdGF0KCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDAsIFwKKyAgICAgICAgICAgICAgICJpZiB5b3Ugc2VlIHRoaXMgbWVzc2FnZSB0aGVuIHlvdSBuZWVkIHRvIHJlYnVpbGQgIiBcCisgICAgICAgICAgICAgICAiQmVya2VsZXkgREIgMy4xLjE3IHdpdGggdGhlIHBhdGNoIGluIHBhdGNoZXMvcWFtX3N0YXQuZGlmZiIpCisKKyAgICAgICAgZC5jbG9zZSgpCisKKworCisgICAgZGVmIHRlc3QwMl9iYXNpY1Bvc3QzMihzZWxmKToKKyAgICAgICAgIyBCYXNpYyBRdWV1ZSB0ZXN0cyB1c2luZyB0aGUgbmV3IERCLmNvbnN1bWUgbWV0aG9kIGluIERCIDMuMisKKyAgICAgICAgIyAoTm8gY3Vyc29yIG5lZWRlZCkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDJfYmFzaWNQb3N0MzIuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBkID0gZGIuREIoKQorICAgICAgICBkLnNldF9yZV9sZW4oNDApICAjIFF1ZXVlcyBtdXN0IGJlIGZpeGVkIGxlbmd0aAorICAgICAgICBkLm9wZW4oc2VsZi5maWxlbmFtZSwgZGIuREJfUVVFVUUsIGRiLkRCX0NSRUFURSkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgImJlZm9yZSBhcHBlbmRzIiArICctJyAqIDMwCisgICAgICAgICAgICBwcHJpbnQoZC5zdGF0KCkpCisKKyAgICAgICAgZm9yIHggaW4gc3RyaW5nLmxldHRlcnM6CisgICAgICAgICAgICBkLmFwcGVuZCh4ICogNDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIGxlbihzdHJpbmcubGV0dGVycykpCisKKyAgICAgICAgZC5wdXQoMTAwLCAic29tZSBtb3JlIGRhdGEiKQorICAgICAgICBkLnB1dCgxMDEsICJhbmQgc29tZSBtb3JlICIpCisgICAgICAgIGQucHV0KDc1LCAgIm91dCBvZiBvcmRlciIpCisgICAgICAgIGQucHV0KDEsICAgInJlcGxhY2VtZW50IGRhdGEiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCBsZW4oc3RyaW5nLmxldHRlcnMpKzMpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJiZWZvcmUgY2xvc2UiICsgJy0nICogMzAKKyAgICAgICAgICAgIHBwcmludChkLnN0YXQoKSkKKworICAgICAgICBkLmNsb3NlKCkKKyAgICAgICAgZGVsIGQKKyAgICAgICAgZCA9IGRiLkRCKCkKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUpCisgICAgICAgICNkLnNldF9nZXRfcmV0dXJuc19ub25lKHRydWUpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJhZnRlciBvcGVuIiArICctJyAqIDMwCisgICAgICAgICAgICBwcHJpbnQoZC5zdGF0KCkpCisKKyAgICAgICAgZC5hcHBlbmQoIm9uZSBtb3JlIikKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgImFmdGVyIGFwcGVuZCIgKyAnLScgKiAzMAorICAgICAgICAgICAgcHByaW50KGQuc3RhdCgpKQorCisgICAgICAgIHJlYyA9IGQuY29uc3VtZSgpCisgICAgICAgIHdoaWxlIHJlYzoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjCisgICAgICAgICAgICByZWMgPSBkLmNvbnN1bWUoKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiYWZ0ZXIgY29uc3VtZSBsb29wIiArICctJyAqIDMwCisgICAgICAgICAgICBwcHJpbnQoZC5zdGF0KCkpCisKKyAgICAgICAgZC5jbG9zZSgpCisKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoU2ltcGxlUXVldWVUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcXVldWUucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcXVldWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjIzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9xdWV1ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcXVldWUucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcXVldWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjIzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9xdWV1ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcmVjbm8ucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZWNuby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY5NTZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcmVjbm8ucHkKQEAgLTAsMCArMSwzMjAgQEAKKyIiIlRlc3RDYXNlcyBmb3IgZXhlcmNpc2luZyBhIFJlY25vIERCLgorIiIiCisKK2ltcG9ydCBvcywgc3lzCitpbXBvcnQgZXJybm8KK2Zyb20gcHByaW50IGltcG9ydCBwcHJpbnQKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgdGVzdF9zdXBwb3J0LCB2ZXJib3NlLCBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgsIGdldF9uZXdfZGF0YWJhc2VfcGF0aAorCitsZXR0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgU2ltcGxlUmVjbm9UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgaWYgKHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNykpIG9yICgoc3lzLnZlcnNpb25faW5mbyA+PSAoMywgMCkpIGFuZAorICAgICAgICAgICAgKHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMikpKSA6CisgICAgICAgIGRlZiBhc3NlcnRJc0luc3RhbmNlKHNlbGYsIG9iaiwgZGF0YXR5cGUsIG1zZz1Ob25lKSA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hc3NlcnRFcXVhbCh0eXBlKG9iaiksIGRhdGF0eXBlLCBtc2c9bXNnKQorICAgICAgICBkZWYgYXNzZXJ0R3JlYXRlckVxdWFsKHNlbGYsIGEsIGIsIG1zZz1Ob25lKSA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hc3NlcnRUcnVlKGE+PWIsIG1zZz1tc2cpCisKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGdldF9uZXdfZGF0YWJhc2VfcGF0aCgpCisgICAgICAgIHNlbGYuaG9tZURpciA9IE5vbmUKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhzZWxmLmZpbGVuYW1lKQorICAgICAgICBpZiBzZWxmLmhvbWVEaXI6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKworICAgIGRlZiB0ZXN0MDFfYmFzaWMoc2VsZik6CisgICAgICAgIGQgPSBkYi5EQigpCisKKyAgICAgICAgZ2V0X3JldHVybnNfbm9uZSA9IGQuc2V0X2dldF9yZXR1cm5zX25vbmUoMikKKyAgICAgICAgZC5zZXRfZ2V0X3JldHVybnNfbm9uZShnZXRfcmV0dXJuc19ub25lKQorCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9SRUNOTywgZGIuREJfQ1JFQVRFKQorCisgICAgICAgIGZvciB4IGluIGxldHRlcnM6CisgICAgICAgICAgICByZWNubyA9IGQuYXBwZW5kKHggKiA2MCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyZWNubywgaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwocmVjbm8sIDEpCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IHJlY25vLAorCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50CisKKyAgICAgICAgc3RhdCA9IGQuc3RhdCgpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcHJpbnQoc3RhdCkKKworICAgICAgICBmb3IgcmVjbm8gaW4gcmFuZ2UoMSwgbGVuKGQpKzEpOgorICAgICAgICAgICAgZGF0YSA9IGRbcmVjbm9dCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IGRhdGEKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGRhdGEsIHN0cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZC5nZXQocmVjbm8pKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBkWzBdICAjIFRoaXMgc2hvdWxkIHJhaXNlIGEgS2V5RXJyb3IhPyE/IQorICAgICAgICBleGNlcHQgZGIuREJJbnZhbGlkQXJnRXJyb3IsIHZhbDoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsWzBdLCBkYi5FSU5WQUwpCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbC5hcmdzWzBdLCBkYi5FSU5WQUwpCisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCB2YWwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIikKKworICAgICAgICAjIHRlc3QgdGhhdCBoYXNfa2V5IHJhaXNlcyBEQiBleGNlcHRpb25zIChmaXhlZCBpbiBweWJzZGRiIDQuMy4yKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkLmhhc19rZXkoMCkKKyAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3IsIHZhbDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiaGFzX2tleSBkaWQgbm90IHJhaXNlIGEgcHJvcGVyIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IGRbMTAwXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IGQuZ2V0KDEwMCkKKyAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvciwgdmFsOgorICAgICAgICAgICAgaWYgZ2V0X3JldHVybnNfbm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgTm9uZSkKKworICAgICAgICBrZXlzID0gZC5rZXlzKCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50IGtleXMKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGtleXMsIGxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShrZXlzWzBdLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGtleXMpLCBsZW4oZCkpCisKKyAgICAgICAgaXRlbXMgPSBkLml0ZW1zKCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHBwcmludChpdGVtcykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGl0ZW1zLCBsaXN0KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaXRlbXNbMF0sIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdGVtc1swXSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShpdGVtc1swXVswXSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaXRlbXNbMF1bMV0sIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXRlbXMpLCBsZW4oZCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaGFzX2tleSgyNSkpCisKKyAgICAgICAgZGVsIGRbMjVdCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZC5oYXNfa2V5KDI1KSkKKworICAgICAgICBkLmRlbGV0ZSgxMykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkLmhhc19rZXkoMTMpKQorCisgICAgICAgIGRhdGEgPSBkLmdldF9ib3RoKDI2LCAieiIgKiA2MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAieiIgKiA2MCwgJ3dhcyAlcicgJSBkYXRhKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgZGF0YQorCisgICAgICAgIGZkID0gZC5mZCgpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCBmZAorCisgICAgICAgIGMgPSBkLmN1cnNvcigpCisgICAgICAgIHJlYyA9IGMuZmlyc3QoKQorICAgICAgICB3aGlsZSByZWM6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IHJlYworICAgICAgICAgICAgcmVjID0gYy5uZXh0KCkKKworICAgICAgICBjLnNldCg1MCkKKyAgICAgICAgcmVjID0gYy5jdXJyZW50KCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50IHJlYworCisgICAgICAgIGMucHV0KC0xLCAiYSByZXBsYWNlbWVudCByZWNvcmQiLCBkYi5EQl9DVVJSRU5UKQorCisgICAgICAgIGMuc2V0KDUwKQorICAgICAgICByZWMgPSBjLmN1cnJlbnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYywgKDUwLCAiYSByZXBsYWNlbWVudCByZWNvcmQiKSkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50IHJlYworCisgICAgICAgIHJlYyA9IGMuc2V0X3JhbmdlKDMwKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgcmVjCisKKyAgICAgICAgIyB0ZXN0IHRoYXQgbm9uLWV4aXN0ZW50IGtleSBsb29rdXBzIHdvcmsgKGFuZCB0aGF0CisgICAgICAgICMgREJDX3NldF9yYW5nZSBkb2Vzbid0IGhhdmUgYSBtZW1sZWFrIHVuZGVyIHZhbGdyaW5kKQorICAgICAgICByZWMgPSBjLnNldF9yYW5nZSg5OTk5OTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjLCBOb25lKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgcmVjCisKKyAgICAgICAgYy5jbG9zZSgpCisgICAgICAgIGQuY2xvc2UoKQorCisgICAgICAgIGQgPSBkYi5EQigpCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lKQorICAgICAgICBjID0gZC5jdXJzb3IoKQorCisgICAgICAgICMgcHV0IGEgcmVjb3JkIGJleW9uZCB0aGUgY29uc2VjdXRpdmUgZW5kIG9mIHRoZSByZWNubydzCisgICAgICAgIGRbMTAwXSA9ICJ3YXkgb3V0IHRoZXJlIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMTAwXSwgIndheSBvdXQgdGhlcmUiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBkWzk5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZC5nZXQoOTkpCisgICAgICAgIGV4Y2VwdCBkYi5EQktleUVtcHR5RXJyb3IsIHZhbDoKKyAgICAgICAgICAgIGlmIGdldF9yZXR1cm5zX25vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmV4cGVjdGVkIERCS2V5RW1wdHlFcnJvciBleGNlcHRpb24iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxbMF0sIGRiLkRCX0tFWUVNUFRZKQorICAgICAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbC5hcmdzWzBdLCBkYi5EQl9LRVlFTVBUWSkKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCB2YWwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBnZXRfcmV0dXJuc19ub25lOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIikKKworICAgICAgICByZWMgPSBjLnNldCg0MCkKKyAgICAgICAgd2hpbGUgcmVjOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIHJlYyA9IGMubmV4dCgpCisKKyAgICAgICAgYy5jbG9zZSgpCisgICAgICAgIGQuY2xvc2UoKQorCisgICAgZGVmIHRlc3QwMl9XaXRoU291cmNlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQSBSZWNubyBmaWxlIHRoYXQgaXMgZ2l2ZW4gYSAiYmFja2luZyBzb3VyY2UgZmlsZSIgaXMgZXNzZW50aWFsbHkgYQorICAgICAgICBzaW1wbGUgQVNDSUkgZmlsZS4gIE5vcm1hbGx5IGVhY2ggcmVjb3JkIGlzIGRlbGltaXRlZCBieSBcbiBhbmQgc28gaXMKKyAgICAgICAganVzdCBhIGxpbmUgaW4gdGhlIGZpbGUsIGJ1dCB5b3UgY2FuIHNldCBhIGRpZmZlcmVudCByZWNvcmQgZGVsaW1pdGVyCisgICAgICAgIGlmIG5lZWRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICBzZWxmLmhvbWVEaXIgPSBob21lRGlyCisgICAgICAgIHNvdXJjZSA9IG9zLnBhdGguam9pbihob21lRGlyLCAndGVzdF9yZWNuby50eHQnKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcihob21lRGlyKToKKyAgICAgICAgICAgIG9zLm1rZGlyKGhvbWVEaXIpCisgICAgICAgIGYgPSBvcGVuKHNvdXJjZSwgJ3cnKSAjIGNyZWF0ZSB0aGUgZmlsZQorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBkID0gZGIuREIoKQorICAgICAgICAjIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUsIGp1c3QgY2hlY2tpbmcgaWYgYm90aCBpbnQKKyAgICAgICAgZC5zZXRfcmVfZGVsaW0oMHgwQSkKKyAgICAgICAgZC5zZXRfcmVfZGVsaW0oJ1xuJykgICMgYW5kIGNoYXIgY2FuIGJlIHVzZWQuLi4KKyAgICAgICAgZC5zZXRfcmVfc291cmNlKHNvdXJjZSkKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUsIGRiLkRCX1JFQ05PLCBkYi5EQl9DUkVBVEUpCisKKyAgICAgICAgZGF0YSA9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5IGRvZyIuc3BsaXQoKQorICAgICAgICBmb3IgZGF0dW0gaW4gZGF0YToKKyAgICAgICAgICAgIGQuYXBwZW5kKGRhdHVtKQorICAgICAgICBkLnN5bmMoKQorICAgICAgICBkLmNsb3NlKCkKKworICAgICAgICAjIGdldCB0aGUgdGV4dCBmcm9tIHRoZSBiYWNraW5nIHNvdXJjZQorICAgICAgICBmID0gb3Blbihzb3VyY2UsICdyJykKKyAgICAgICAgdGV4dCA9IGYucmVhZCgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICB0ZXh0ID0gdGV4dC5zdHJpcCgpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCB0ZXh0CisgICAgICAgICAgICBwcmludCBkYXRhCisgICAgICAgICAgICBwcmludCB0ZXh0LnNwbGl0KCdcbicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LnNwbGl0KCdcbicpLCBkYXRhKQorCisgICAgICAgICMgb3BlbiBhcyBhIERCIGFnYWluCisgICAgICAgIGQgPSBkYi5EQigpCisgICAgICAgIGQuc2V0X3JlX3NvdXJjZShzb3VyY2UpCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9SRUNOTykKKworICAgICAgICBkWzNdID0gJ3JlZGRpc2gtYnJvd24nCisgICAgICAgIGRbOF0gPSAnY29tYXRvc2UnCisKKyAgICAgICAgZC5zeW5jKCkKKyAgICAgICAgZC5jbG9zZSgpCisKKyAgICAgICAgZiA9IG9wZW4oc291cmNlLCAncicpCisgICAgICAgIHRleHQgPSBmLnJlYWQoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgdGV4dCA9IHRleHQuc3RyaXAoKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgdGV4dAorICAgICAgICAgICAgcHJpbnQgdGV4dC5zcGxpdCgnXG4nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zcGxpdCgnXG4nKSwKKyAgICAgICAgICAgIlRoZSBxdWljayByZWRkaXNoLWJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgY29tYXRvc2UgZG9nIi5zcGxpdCgpKQorCisgICAgZGVmIHRlc3QwM19GaXhlZExlbmd0aChzZWxmKToKKyAgICAgICAgZCA9IGRiLkRCKCkKKyAgICAgICAgZC5zZXRfcmVfbGVuKDQwKSAgIyBmaXhlZCBsZW5ndGggcmVjb3JkcywgNDAgYnl0ZXMgbG9uZworICAgICAgICBkLnNldF9yZV9wYWQoJy0nKSAjIHNldHMgdGhlIHBhZCBjaGFyYWN0ZXIuLi4KKyAgICAgICAgZC5zZXRfcmVfcGFkKDQ1KSAgIyAuLi50ZXN0IGJvdGggaW50IGFuZCBjaGFyCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9SRUNOTywgZGIuREJfQ1JFQVRFKQorCisgICAgICAgIGZvciB4IGluIGxldHRlcnM6CisgICAgICAgICAgICBkLmFwcGVuZCh4ICogMzUpICAgICMgVGhlc2Ugd2lsbCBiZSBwYWRkZWQKKworICAgICAgICBkLmFwcGVuZCgnLicgKiA0MCkgICAgICAjIHRoaXMgb25lIHdpbGwgYmUgZXhhY3QKKworICAgICAgICB0cnk6ICAgICAgICAgICAgICAgICAgICAjIHRoaXMgb25lIHdpbGwgZmFpbAorICAgICAgICAgICAgZC5hcHBlbmQoJ2JhZCcgKiAyMCkKKyAgICAgICAgZXhjZXB0IGRiLkRCSW52YWxpZEFyZ0Vycm9yLCB2YWw6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgZGIuRUlOVkFMKQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwuYXJnc1swXSwgZGIuRUlOVkFMKQorICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgdmFsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgYyA9IGQuY3Vyc29yKCkKKyAgICAgICAgcmVjID0gYy5maXJzdCgpCisgICAgICAgIHdoaWxlIHJlYzoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjCisgICAgICAgICAgICByZWMgPSBjLm5leHQoKQorCisgICAgICAgIGMuY2xvc2UoKQorICAgICAgICBkLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0MDRfZ2V0X3NpemVfZW1wdHkoc2VsZikgOgorICAgICAgICBkID0gZGIuREIoKQorICAgICAgICBkLm9wZW4oc2VsZi5maWxlbmFtZSwgZGJ0eXBlPWRiLkRCX1JFQ05PLCBmbGFncz1kYi5EQl9DUkVBVEUpCisKKyAgICAgICAgcm93X2lkID0gZC5hcHBlbmQoJyAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGQuZ2V0X3NpemUoa2V5PXJvd19pZCkpCisgICAgICAgIHJvd19pZCA9IGQuYXBwZW5kKCcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGQuZ2V0X3NpemUoa2V5PXJvd19pZCkpCisKKworCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoU2ltcGxlUmVjbm9UZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcmVjbm8ucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcmVjbm8ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYTg2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZWNuby5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcmVjbm8ucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcmVjbm8ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYTg2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZWNuby5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcmVwbGljYXRpb24ucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZXBsaWNhdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmFiMmRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcmVwbGljYXRpb24ucHkKQEAgLTAsMCArMSw1NDMgQEAKKyIiIlRlc3RDYXNlcyBmb3IgZGlzdHJpYnV0ZWQgdHJhbnNhY3Rpb25zLgorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgdGVzdF9zdXBwb3J0LCBoYXZlX3RocmVhZHMsIHZlcmJvc2UsIFwKKyAgICAgICAgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBEQlJlcGxpY2F0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKSA6CisgICAgZGVmIHNldFVwKHNlbGYpIDoKKyAgICAgICAgc2VsZi5ob21lRGlyTWFzdGVyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKyAgICAgICAgc2VsZi5ob21lRGlyQ2xpZW50ID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKworICAgICAgICBzZWxmLmRiZW52TWFzdGVyID0gZGIuREJFbnYoKQorICAgICAgICBzZWxmLmRiZW52Q2xpZW50ID0gZGIuREJFbnYoKQorCisgICAgICAgICMgTXVzdCB1c2UgIkRCX1RIUkVBRCIgYmVjYXVzZSB0aGUgUmVwbGljYXRpb24gTWFuYWdlciB3aWxsCisgICAgICAgICMgYmUgZXhlY3V0ZWQgaW4gb3RoZXIgdGhyZWFkcyBidXQgd2lsbCB1c2UgdGhlIHNhbWUgZW52aXJvbm1lbnQuCisgICAgICAgICMgaHR0cDovL2ZvcnVtcy5vcmFjbGUuY29tL2ZvcnVtcy90aHJlYWQuanNwYT90aHJlYWRJRD02NDU3ODgmdHN0YXJ0PTAKKyAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5vcGVuKHNlbGYuaG9tZURpck1hc3RlciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9UWE4KKyAgICAgICAgICAgICAgICB8IGRiLkRCX0lOSVRfTE9HIHwgZGIuREJfSU5JVF9NUE9PTCB8IGRiLkRCX0lOSVRfTE9DSyB8CisgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9SRVAgfCBkYi5EQl9SRUNPVkVSIHwgZGIuREJfVEhSRUFELCAwNjY2KQorICAgICAgICBzZWxmLmRiZW52Q2xpZW50Lm9wZW4oc2VsZi5ob21lRGlyQ2xpZW50LCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX1RYTgorICAgICAgICAgICAgICAgIHwgZGIuREJfSU5JVF9MT0cgfCBkYi5EQl9JTklUX01QT09MIHwgZGIuREJfSU5JVF9MT0NLIHwKKyAgICAgICAgICAgICAgICBkYi5EQl9JTklUX1JFUCB8IGRiLkRCX1JFQ09WRVIgfCBkYi5EQl9USFJFQUQsIDA2NjYpCisKKyAgICAgICAgc2VsZi5jb25maXJtZWRfbWFzdGVyPXNlbGYuY2xpZW50X3N0YXJ0dXBkb25lPUZhbHNlCisgICAgICAgIGRlZiBjb25maXJtZWRfbWFzdGVyKGEsYixjKSA6CisgICAgICAgICAgICBpZiBiPT1kYi5EQl9FVkVOVF9SRVBfTUFTVEVSIDoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpcm1lZF9tYXN0ZXI9VHJ1ZQorCisgICAgICAgIGRlZiBjbGllbnRfc3RhcnR1cGRvbmUoYSxiLGMpIDoKKyAgICAgICAgICAgIGlmIGI9PWRiLkRCX0VWRU5UX1JFUF9TVEFSVFVQRE9ORSA6CisgICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc3RhcnR1cGRvbmU9VHJ1ZQorCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIuc2V0X2V2ZW50X25vdGlmeShjb25maXJtZWRfbWFzdGVyKQorICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnNldF9ldmVudF9ub3RpZnkoY2xpZW50X3N0YXJ0dXBkb25lKQorCisgICAgICAgICNzZWxmLmRiZW52TWFzdGVyLnNldF92ZXJib3NlKGRiLkRCX1ZFUkJfUkVQTElDQVRJT04sIFRydWUpCisgICAgICAgICNzZWxmLmRiZW52TWFzdGVyLnNldF92ZXJib3NlKGRiLkRCX1ZFUkJfRklMRU9QU19BTEwsIFRydWUpCisgICAgICAgICNzZWxmLmRiZW52Q2xpZW50LnNldF92ZXJib3NlKGRiLkRCX1ZFUkJfUkVQTElDQVRJT04sIFRydWUpCisgICAgICAgICNzZWxmLmRiZW52Q2xpZW50LnNldF92ZXJib3NlKGRiLkRCX1ZFUkJfRklMRU9QU19BTEwsIFRydWUpCisKKyAgICAgICAgc2VsZi5kYk1hc3RlciA9IHNlbGYuZGJDbGllbnQgPSBOb25lCisKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kYkNsaWVudCA6CisgICAgICAgICAgICBzZWxmLmRiQ2xpZW50LmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5kYk1hc3RlciA6CisgICAgICAgICAgICBzZWxmLmRiTWFzdGVyLmNsb3NlKCkKKworICAgICAgICAjIEhlcmUgd2UgYXNzaWduIGR1bW15IGV2ZW50IGhhbmRsZXJzIHRvIGFsbG93IEdDIG9mIHRoZSB0ZXN0IG9iamVjdC4KKyAgICAgICAgIyBTaW5jZSB0aGUgZHVtbXkgaGFuZGxlciBkb2Vzbid0IHVzZSBhbnkgb3V0ZXIgc2NvcGUgdmFyaWFibGUsIGl0CisgICAgICAgICMgZG9lc24ndCBrZWVwIGFueSByZWZlcmVuY2UgdG8gdGhlIHRlc3Qgb2JqZWN0LgorICAgICAgICBkZWYgZHVtbXkoKmFyZ3MpIDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5zZXRfZXZlbnRfbm90aWZ5KGR1bW15KQorICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnNldF9ldmVudF9ub3RpZnkoZHVtbXkpCisKKyAgICAgICAgc2VsZi5kYmVudkNsaWVudC5jbG9zZSgpCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIuY2xvc2UoKQorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpckNsaWVudCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXJNYXN0ZXIpCisKK2NsYXNzIERCUmVwbGljYXRpb25NYW5hZ2VyKERCUmVwbGljYXRpb24pIDoKKyAgICBkZWYgdGVzdDAxX2Jhc2ljX3JlcGxpY2F0aW9uKHNlbGYpIDoKKyAgICAgICAgbWFzdGVyX3BvcnQgPSB0ZXN0X3N1cHBvcnQuZmluZF91bnVzZWRfcG9ydCgpCisgICAgICAgIGNsaWVudF9wb3J0ID0gdGVzdF9zdXBwb3J0LmZpbmRfdW51c2VkX3BvcnQoKQorICAgICAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDUsIDIpIDoKKyAgICAgICAgICAgIHNlbGYuc2l0ZSA9IHNlbGYuZGJlbnZNYXN0ZXIucmVwbWdyX3NpdGUoIjEyNy4wLjAuMSIsIG1hc3Rlcl9wb3J0KQorICAgICAgICAgICAgc2VsZi5zaXRlLnNldF9jb25maWcoZGIuREJfR1JPVVBfQ1JFQVRPUiwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuc2l0ZS5zZXRfY29uZmlnKGRiLkRCX0xPQ0FMX1NJVEUsIFRydWUpCisgICAgICAgICAgICBzZWxmLnNpdGUyID0gc2VsZi5kYmVudk1hc3Rlci5yZXBtZ3Jfc2l0ZSgiMTI3LjAuMC4xIiwgY2xpZW50X3BvcnQpCisKKyAgICAgICAgICAgIHNlbGYuc2l0ZTMgPSBzZWxmLmRiZW52Q2xpZW50LnJlcG1ncl9zaXRlKCIxMjcuMC4wLjEiLCBtYXN0ZXJfcG9ydCkKKyAgICAgICAgICAgIHNlbGYuc2l0ZTMuc2V0X2NvbmZpZyhkYi5EQl9CT09UU1RSQVBfSEVMUEVSLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5zaXRlNCA9IHNlbGYuZGJlbnZDbGllbnQucmVwbWdyX3NpdGUoIjEyNy4wLjAuMSIsIGNsaWVudF9wb3J0KQorICAgICAgICAgICAgc2VsZi5zaXRlNC5zZXRfY29uZmlnKGRiLkRCX0xPQ0FMX1NJVEUsIFRydWUpCisKKyAgICAgICAgICAgIGQgPSB7CisgICAgICAgICAgICAgICAgICAgIGRiLkRCX0JPT1RTVFJBUF9IRUxQRVI6IFtGYWxzZSwgRmFsc2UsIFRydWUsIEZhbHNlXSwKKyAgICAgICAgICAgICAgICAgICAgZGIuREJfR1JPVVBfQ1JFQVRPUjogW1RydWUsIEZhbHNlLCBGYWxzZSwgRmFsc2VdLAorICAgICAgICAgICAgICAgICAgICBkYi5EQl9MRUdBQ1k6IFtGYWxzZSwgRmFsc2UsIEZhbHNlLCBGYWxzZV0sCisgICAgICAgICAgICAgICAgICAgIGRiLkRCX0xPQ0FMX1NJVEU6IFtUcnVlLCBGYWxzZSwgRmFsc2UsIFRydWVdLAorICAgICAgICAgICAgICAgICAgICBkYi5EQl9SRVBNR1JfUEVFUjogW0ZhbHNlLCBGYWxzZSwgRmFsc2UsIEZhbHNlIF0sCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgaSwgaiBpbiBkLml0ZW1zKCkgOgorICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHppcChbc2VsZi5zaXRlLCBzZWxmLnNpdGUyLCBzZWxmLnNpdGUzLCBzZWxmLnNpdGU0XSwgaikgOgorICAgICAgICAgICAgICAgICAgICBpZiB2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrLmdldF9jb25maWcoaSkpCisgICAgICAgICAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShrLmdldF9jb25maWcoaSkpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5zaXRlLmdldF9laWQoKSwgc2VsZi5zaXRlMi5nZXRfZWlkKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuc2l0ZTMuZ2V0X2VpZCgpLCBzZWxmLnNpdGU0LmdldF9laWQoKSkKKworICAgICAgICAgICAgZm9yIGksIGogaW4gemlwKFtzZWxmLnNpdGUsIHNlbGYuc2l0ZTIsIHNlbGYuc2l0ZTMsIHNlbGYuc2l0ZTRdLCBcCisgICAgICAgICAgICAgICAgICAgIFttYXN0ZXJfcG9ydCwgY2xpZW50X3BvcnQsIG1hc3Rlcl9wb3J0LCBjbGllbnRfcG9ydF0pIDoKKyAgICAgICAgICAgICAgICBhZGRyID0gaS5nZXRfYWRkcmVzcygpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZGRyLCAoIjEyNy4wLjAuMSIsIGopKQorCisgICAgICAgICAgICBmb3IgaSBpbiBbc2VsZi5zaXRlLCBzZWxmLnNpdGUyXSA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLmdldF9hZGRyZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcG1ncl9zaXRlX2J5X2VpZChpLmdldF9laWQoKSkuZ2V0X2FkZHJlc3MoKSkKKyAgICAgICAgICAgIGZvciBpIGluIFtzZWxmLnNpdGUzLCBzZWxmLnNpdGU0XSA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLmdldF9hZGRyZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcG1ncl9zaXRlX2J5X2VpZChpLmdldF9laWQoKSkuZ2V0X2FkZHJlc3MoKSkKKyAgICAgICAgZWxzZSA6CisgICAgICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcG1ncl9zZXRfbG9jYWxfc2l0ZSgiMTI3LjAuMC4xIiwgbWFzdGVyX3BvcnQpCisgICAgICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcG1ncl9zZXRfbG9jYWxfc2l0ZSgiMTI3LjAuMC4xIiwgY2xpZW50X3BvcnQpCisgICAgICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcG1ncl9hZGRfcmVtb3RlX3NpdGUoIjEyNy4wLjAuMSIsIGNsaWVudF9wb3J0KQorICAgICAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBtZ3JfYWRkX3JlbW90ZV9zaXRlKCIxMjcuMC4wLjEiLCBtYXN0ZXJfcG9ydCkKKworICAgICAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBfc2V0X25zaXRlcygyKQorICAgICAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBfc2V0X25zaXRlcygyKQorCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwX3NldF9wcmlvcml0eSgxMCkKKyAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBfc2V0X3ByaW9yaXR5KDApCisKKyAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBfc2V0X3RpbWVvdXQoZGIuREJfUkVQX0NPTk5FQ1RJT05fUkVUUlksMTAwMTIzKQorICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcF9zZXRfdGltZW91dChkYi5EQl9SRVBfQ09OTkVDVElPTl9SRVRSWSwxMDAzMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYmVudk1hc3Rlci5yZXBfZ2V0X3RpbWVvdXQoCisgICAgICAgICAgICBkYi5EQl9SRVBfQ09OTkVDVElPTl9SRVRSWSksIDEwMDEyMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52Q2xpZW50LnJlcF9nZXRfdGltZW91dCgKKyAgICAgICAgICAgIGRiLkRCX1JFUF9DT05ORUNUSU9OX1JFVFJZKSwgMTAwMzIxKQorCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwX3NldF90aW1lb3V0KGRiLkRCX1JFUF9FTEVDVElPTl9USU1FT1VULCAxMDAyMzQpCisgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwX3NldF90aW1lb3V0KGRiLkRCX1JFUF9FTEVDVElPTl9USU1FT1VULCAxMDA0MzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYmVudk1hc3Rlci5yZXBfZ2V0X3RpbWVvdXQoCisgICAgICAgICAgICBkYi5EQl9SRVBfRUxFQ1RJT05fVElNRU9VVCksIDEwMDIzNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52Q2xpZW50LnJlcF9nZXRfdGltZW91dCgKKyAgICAgICAgICAgIGRiLkRCX1JFUF9FTEVDVElPTl9USU1FT1VUKSwgMTAwNDMyKQorCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwX3NldF90aW1lb3V0KGRiLkRCX1JFUF9FTEVDVElPTl9SRVRSWSwgMTAwMzQ1KQorICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcF9zZXRfdGltZW91dChkYi5EQl9SRVBfRUxFQ1RJT05fUkVUUlksIDEwMDU0MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52TWFzdGVyLnJlcF9nZXRfdGltZW91dCgKKyAgICAgICAgICAgIGRiLkRCX1JFUF9FTEVDVElPTl9SRVRSWSksIDEwMDM0NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52Q2xpZW50LnJlcF9nZXRfdGltZW91dCgKKyAgICAgICAgICAgIGRiLkRCX1JFUF9FTEVDVElPTl9SRVRSWSksIDEwMDU0MykKKworICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcG1ncl9zZXRfYWNrX3BvbGljeShkYi5EQl9SRVBNR1JfQUNLU19BTEwpCisgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwbWdyX3NldF9hY2tfcG9saWN5KGRiLkRCX1JFUE1HUl9BQ0tTX0FMTCkKKworICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcG1ncl9zdGFydCgxLCBkYi5EQl9SRVBfTUFTVEVSKTsKKyAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBtZ3Jfc3RhcnQoMSwgZGIuREJfUkVQX0NMSUVOVCk7CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52TWFzdGVyLnJlcF9nZXRfbnNpdGVzKCksMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52Q2xpZW50LnJlcF9nZXRfbnNpdGVzKCksMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52TWFzdGVyLnJlcF9nZXRfcHJpb3JpdHkoKSwxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52Q2xpZW50LnJlcF9nZXRfcHJpb3JpdHkoKSwwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJlbnZNYXN0ZXIucmVwbWdyX2dldF9hY2tfcG9saWN5KCksCisgICAgICAgICAgICAgICAgZGIuREJfUkVQTUdSX0FDS1NfQUxMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJlbnZDbGllbnQucmVwbWdyX2dldF9hY2tfcG9saWN5KCksCisgICAgICAgICAgICAgICAgZGIuREJfUkVQTUdSX0FDS1NfQUxMKQorCisgICAgICAgICMgVGhlIHRpbWVvdXQgaXMgbmVjZXNzYXJ5IGluIEJEQiA0LjUsIHNpbmNlIERCX0VWRU5UX1JFUF9TVEFSVFVQRE9ORQorICAgICAgICAjIGlzIG5vdCBnZW5lcmF0ZWQgaWYgdGhlIG1hc3RlciBoYXMgbm8gbmV3IHRyYW5zYWN0aW9ucy4KKyAgICAgICAgIyBUaGlzIGlzIHNvbHZlZCBpbiBCREIgNC42ICgjMTU1NDIpLgorICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICB0aW1lb3V0ID0gdGltZS50aW1lKCkrNjAKKyAgICAgICAgd2hpbGUgKHRpbWUudGltZSgpPHRpbWVvdXQpIGFuZCBub3QgKHNlbGYuY29uZmlybWVkX21hc3RlciBhbmQgc2VsZi5jbGllbnRfc3RhcnR1cGRvbmUpIDoKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMikKKyAgICAgICAgIyBzZWxmLmNsaWVudF9zdGFydHVwZG9uZSBkb2VzIG5vdCBhbHdheXMgZ2V0IHNldCB0byBUcnVlIHdpdGhpbgorICAgICAgICAjIHRoZSB0aW1lb3V0LiAgT24gd2luZG93cyB0aGlzIG1heSBiZSBhIGRlZXAgaXNzdWUsIG9uIG90aGVyCisgICAgICAgICMgcGxhdGZvcm1zIGl0IGlzIGxpa2VseSBqdXN0IGEgdGltaW5nIGlzc3VlLCBlc3BlY2lhbGx5IG9uIHNsb3cKKyAgICAgICAgIyB2aXJ0aG9zdCBidWlsZGJvdHMgKHNlZSBpc3N1ZSAzODkyIGZvciBtb3JlKS4gIEV2ZW4gdGhvdWdoCisgICAgICAgICMgdGhlIHRpbWVvdXQgdHJpZ2dlcnMsIHRoZSByZXN0IG9mIHRoaXMgdGVzdCBtZXRob2QgdXN1YWxseSBwYXNzZXMKKyAgICAgICAgIyAoYnV0IG5vdCBhbGwgb2YgaXQgYWx3YXlzLCBzZWUgYmVsb3cpLiAgU28gd2UganVzdCBub3RlIHRoZQorICAgICAgICAjIHRpbWVvdXQgb24gc3RkZXJyIGFuZCBrZWVwIHNvbGRlcmluZyBvbi4KKyAgICAgICAgaWYgdGltZS50aW1lKCk+dGltZW91dDoKKyAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICgiWFhYOiB0aW1lb3V0IGhhcHBlbmVkIGJlZm9yZSIKKyAgICAgICAgICAgICAgICAic3RhcnR1cCB3YXMgY29uZmlybWVkIC0gc2VlIGlzc3VlIDM4OTIiKQorICAgICAgICAgICAgc3RhcnR1cF90aW1lb3V0ID0gVHJ1ZQorCisgICAgICAgIGQgPSBzZWxmLmRiZW52TWFzdGVyLnJlcG1ncl9zaXRlX2xpc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMSkKKyAgICAgICAgZCA9IGQudmFsdWVzKClbMF0gICMgVGhlcmUgaXMgb25seSBvbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzBdLCAiMTI3LjAuMC4xIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzFdLCBjbGllbnRfcG9ydCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChkWzJdPT1kYi5EQl9SRVBNR1JfQ09OTkVDVEVEKSBvciBcCisgICAgICAgICAgICAgICAgKGRbMl09PWRiLkRCX1JFUE1HUl9ESVNDT05ORUNURUQpKQorCisgICAgICAgIGQgPSBzZWxmLmRiZW52Q2xpZW50LnJlcG1ncl9zaXRlX2xpc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMSkKKyAgICAgICAgZCA9IGQudmFsdWVzKClbMF0gICMgVGhlcmUgaXMgb25seSBvbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzBdLCAiMTI3LjAuMC4xIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzFdLCBtYXN0ZXJfcG9ydCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChkWzJdPT1kYi5EQl9SRVBNR1JfQ09OTkVDVEVEKSBvciBcCisgICAgICAgICAgICAgICAgKGRbMl09PWRiLkRCX1JFUE1HUl9ESVNDT05ORUNURUQpKQorCisgICAgICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCw2KSA6CisgICAgICAgICAgICBkID0gc2VsZi5kYmVudk1hc3Rlci5yZXBtZ3Jfc3RhdChmbGFncz1kYi5EQl9TVEFUX0NMRUFSKTsKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgibXNnc19xdWV1ZWQiIGluIGQpCisKKyAgICAgICAgc2VsZi5kYk1hc3Rlcj1kYi5EQihzZWxmLmRiZW52TWFzdGVyKQorICAgICAgICB0eG49c2VsZi5kYmVudk1hc3Rlci50eG5fYmVnaW4oKQorICAgICAgICBzZWxmLmRiTWFzdGVyLm9wZW4oInRlc3QiLCBkYi5EQl9IQVNILCBkYi5EQl9DUkVBVEUsIDA2NjYsIHR4bj10eG4pCisgICAgICAgIHR4bi5jb21taXQoKQorCisgICAgICAgIGltcG9ydCB0aW1lLG9zLnBhdGgKKyAgICAgICAgdGltZW91dD10aW1lLnRpbWUoKSsxMAorICAgICAgICB3aGlsZSAodGltZS50aW1lKCk8dGltZW91dCkgYW5kIFwKKyAgICAgICAgICBub3QgKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmhvbWVEaXJDbGllbnQsInRlc3QiKSkpIDoKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKKworICAgICAgICBzZWxmLmRiQ2xpZW50PWRiLkRCKHNlbGYuZGJlbnZDbGllbnQpCisgICAgICAgIHdoaWxlIFRydWUgOgorICAgICAgICAgICAgdHhuPXNlbGYuZGJlbnZDbGllbnQudHhuX2JlZ2luKCkKKyAgICAgICAgICAgIHRyeSA6CisgICAgICAgICAgICAgICAgc2VsZi5kYkNsaWVudC5vcGVuKCJ0ZXN0IiwgZGIuREJfSEFTSCwgZmxhZ3M9ZGIuREJfUkRPTkxZLAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZT0wNjY2LCB0eG49dHhuKQorICAgICAgICAgICAgZXhjZXB0IGRiLkRCUmVwSGFuZGxlRGVhZEVycm9yIDoKKyAgICAgICAgICAgICAgICB0eG4uYWJvcnQoKQorICAgICAgICAgICAgICAgIHNlbGYuZGJDbGllbnQuY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuZGJDbGllbnQ9ZGIuREIoc2VsZi5kYmVudkNsaWVudCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgdHhuPXNlbGYuZGJlbnZNYXN0ZXIudHhuX2JlZ2luKCkKKyAgICAgICAgc2VsZi5kYk1hc3Rlci5wdXQoIkFCQyIsICIxMjMiLCB0eG49dHhuKQorICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgdGltZW91dD10aW1lLnRpbWUoKSsxMAorICAgICAgICB2PU5vbmUKKyAgICAgICAgd2hpbGUgKHRpbWUudGltZSgpPHRpbWVvdXQpIGFuZCAodiBpcyBOb25lKSA6CisgICAgICAgICAgICB0eG49c2VsZi5kYmVudkNsaWVudC50eG5fYmVnaW4oKQorICAgICAgICAgICAgdj1zZWxmLmRiQ2xpZW50LmdldCgiQUJDIiwgdHhuPXR4bikKKyAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgaWYgdiBpcyBOb25lIDoKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDIpCisgICAgICAgICMgSWYgc3RhcnR1cCBkaWQgbm90IGhhcHBlbiBiZWZvcmUgdGhlIHRpbWVvdXQgYWJvdmUsIHRoZW4gdGhpcyB0ZXN0CisgICAgICAgICMgc29tZXRpbWVzIGZhaWxzLiAgVGhpcyBoYXBwZW5zIHJhbmRvbWx5LCB3aGljaCBjYXVzZXMgYnVpbGRib3QKKyAgICAgICAgIyBpbnN0YWJpbGl0eSwgYnV0IGFsbCB0aGUgb3RoZXIgYnNkZGIgdGVzdHMgcGFzcy4gIFNpbmNlIGJzZGRiMyBpbiB0aGUKKyAgICAgICAgIyBzdGRsaWIgaXMgY3VycmVudGx5IG5vdCBnZXR0aW5nIGFjdGl2ZSBtYWludGVuYW5jZSwgYW5kIGlzIGdvbmUgaW4KKyAgICAgICAgIyBweTNrLCB3ZSBqdXN0IHNraXAgdGhlIGVuZCBvZiB0aGUgdGVzdCBpbiB0aGF0IGNhc2UuCisgICAgICAgIGlmIHRpbWUudGltZSgpPj10aW1lb3V0IGFuZCBzdGFydHVwX3RpbWVvdXQ6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJyZXBsaWNhdGlvbiB0ZXN0IHNraXBwZWQgZHVlIHRvIHJhbmRvbSBmYWlsdXJlLCAiCisgICAgICAgICAgICAgICAgInNlZSBpc3N1ZSAzODkyIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWUudGltZSgpPHRpbWVvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIHYpCisKKyAgICAgICAgdHhuPXNlbGYuZGJlbnZNYXN0ZXIudHhuX2JlZ2luKCkKKyAgICAgICAgc2VsZi5kYk1hc3Rlci5kZWxldGUoIkFCQyIsIHR4bj10eG4pCisgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICB0aW1lb3V0PXRpbWUudGltZSgpKzEwCisgICAgICAgIHdoaWxlICh0aW1lLnRpbWUoKTx0aW1lb3V0KSBhbmQgKHYgaXMgbm90IE5vbmUpIDoKKyAgICAgICAgICAgIHR4bj1zZWxmLmRiZW52Q2xpZW50LnR4bl9iZWdpbigpCisgICAgICAgICAgICB2PXNlbGYuZGJDbGllbnQuZ2V0KCJBQkMiLCB0eG49dHhuKQorICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgICAgICBpZiB2IGlzIE5vbmUgOgorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWUudGltZSgpPHRpbWVvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgdikKKworY2xhc3MgREJCYXNlUmVwbGljYXRpb24oREJSZXBsaWNhdGlvbikgOgorICAgIGRlZiBzZXRVcChzZWxmKSA6CisgICAgICAgIERCUmVwbGljYXRpb24uc2V0VXAoc2VsZikKKyAgICAgICAgZGVmIGNvbmZpcm1lZF9tYXN0ZXIoYSxiLGMpIDoKKyAgICAgICAgICAgIGlmIChiID09IGRiLkRCX0VWRU5UX1JFUF9NQVNURVIpIG9yIChiID09IGRiLkRCX0VWRU5UX1JFUF9FTEVDVEVEKSA6CisgICAgICAgICAgICAgICAgc2VsZi5jb25maXJtZWRfbWFzdGVyID0gVHJ1ZQorCisgICAgICAgIGRlZiBjbGllbnRfc3RhcnR1cGRvbmUoYSxiLGMpIDoKKyAgICAgICAgICAgIGlmIGIgPT0gZGIuREJfRVZFTlRfUkVQX1NUQVJUVVBET05FIDoKKyAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zdGFydHVwZG9uZSA9IFRydWUKKworICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnNldF9ldmVudF9ub3RpZnkoY29uZmlybWVkX21hc3RlcikKKyAgICAgICAgc2VsZi5kYmVudkNsaWVudC5zZXRfZXZlbnRfbm90aWZ5KGNsaWVudF9zdGFydHVwZG9uZSkKKworICAgICAgICBpbXBvcnQgUXVldWUKKyAgICAgICAgc2VsZi5tMmMgPSBRdWV1ZS5RdWV1ZSgpCisgICAgICAgIHNlbGYuYzJtID0gUXVldWUuUXVldWUoKQorCisgICAgICAgICMgVGhlcmUgYXJlIG9ubHkgdHdvIG5vZGVzLCBzbyB3ZSBkb24ndCBuZWVkIHRvCisgICAgICAgICMgZG8gYW55IHJvdXRpbmcgZGVjaXNpb24KKyAgICAgICAgZGVmIG0yYyhkYmVudiwgY29udHJvbCwgcmVjLCBsc25wLCBlbnZpZCwgZmxhZ3MpIDoKKyAgICAgICAgICAgIHNlbGYubTJjLnB1dCgoY29udHJvbCwgcmVjKSkKKworICAgICAgICBkZWYgYzJtKGRiZW52LCBjb250cm9sLCByZWMsIGxzbnAsIGVudmlkLCBmbGFncykgOgorICAgICAgICAgICAgc2VsZi5jMm0ucHV0KChjb250cm9sLCByZWMpKQorCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwX3NldF90cmFuc3BvcnQoMTMsbTJjKQorICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcF9zZXRfcHJpb3JpdHkoMTApCisgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwX3NldF90cmFuc3BvcnQoMyxjMm0pCisgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwX3NldF9wcmlvcml0eSgwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYmVudk1hc3Rlci5yZXBfZ2V0X3ByaW9yaXR5KCksMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYmVudkNsaWVudC5yZXBfZ2V0X3ByaW9yaXR5KCksMCkKKworICAgICAgICAjc2VsZi5kYmVudk1hc3Rlci5zZXRfdmVyYm9zZShkYi5EQl9WRVJCX1JFUExJQ0FUSU9OLCBUcnVlKQorICAgICAgICAjc2VsZi5kYmVudk1hc3Rlci5zZXRfdmVyYm9zZShkYi5EQl9WRVJCX0ZJTEVPUFNfQUxMLCBUcnVlKQorICAgICAgICAjc2VsZi5kYmVudkNsaWVudC5zZXRfdmVyYm9zZShkYi5EQl9WRVJCX1JFUExJQ0FUSU9OLCBUcnVlKQorICAgICAgICAjc2VsZi5kYmVudkNsaWVudC5zZXRfdmVyYm9zZShkYi5EQl9WRVJCX0ZJTEVPUFNfQUxMLCBUcnVlKQorCisgICAgICAgIGRlZiB0aHJlYWRfbWFzdGVyKCkgOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGhyZWFkX2RvKHNlbGYuZGJlbnZNYXN0ZXIsIHNlbGYuYzJtLCAzLAorICAgICAgICAgICAgICAgICAgICBzZWxmLm1hc3Rlcl9kb2luZ19lbGVjdGlvbiwgVHJ1ZSkKKworICAgICAgICBkZWYgdGhyZWFkX2NsaWVudCgpIDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRocmVhZF9kbyhzZWxmLmRiZW52Q2xpZW50LCBzZWxmLm0yYywgMTMsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X2RvaW5nX2VsZWN0aW9uLCBGYWxzZSkKKworICAgICAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCisgICAgICAgIHRfbT1UaHJlYWQodGFyZ2V0PXRocmVhZF9tYXN0ZXIpCisgICAgICAgIHRfYz1UaHJlYWQodGFyZ2V0PXRocmVhZF9jbGllbnQpCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgdF9tLnNldERhZW1vbihUcnVlKQorICAgICAgICAgICAgdF9jLnNldERhZW1vbihUcnVlKQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIHRfbS5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICB0X2MuZGFlbW9uID0gVHJ1ZQorCisgICAgICAgIHNlbGYudF9tID0gdF9tCisgICAgICAgIHNlbGYudF9jID0gdF9jCisKKyAgICAgICAgc2VsZi5kYk1hc3RlciA9IHNlbGYuZGJDbGllbnQgPSBOb25lCisKKyAgICAgICAgc2VsZi5tYXN0ZXJfZG9pbmdfZWxlY3Rpb249W0ZhbHNlXQorICAgICAgICBzZWxmLmNsaWVudF9kb2luZ19lbGVjdGlvbj1bRmFsc2VdCisKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kYkNsaWVudCA6CisgICAgICAgICAgICBzZWxmLmRiQ2xpZW50LmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5kYk1hc3RlciA6CisgICAgICAgICAgICBzZWxmLmRiTWFzdGVyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5tMmMucHV0KE5vbmUpCisgICAgICAgIHNlbGYuYzJtLnB1dChOb25lKQorICAgICAgICBzZWxmLnRfbS5qb2luKCkKKyAgICAgICAgc2VsZi50X2Muam9pbigpCisKKyAgICAgICAgIyBIZXJlIHdlIGFzc2lnbiBkdW1teSBldmVudCBoYW5kbGVycyB0byBhbGxvdyBHQyBvZiB0aGUgdGVzdCBvYmplY3QuCisgICAgICAgICMgU2luY2UgdGhlIGR1bW15IGhhbmRsZXIgZG9lc24ndCB1c2UgYW55IG91dGVyIHNjb3BlIHZhcmlhYmxlLCBpdAorICAgICAgICAjIGRvZXNuJ3Qga2VlcCBhbnkgcmVmZXJlbmNlIHRvIHRoZSB0ZXN0IG9iamVjdC4KKyAgICAgICAgZGVmIGR1bW15KCphcmdzKSA6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIuc2V0X2V2ZW50X25vdGlmeShkdW1teSkKKyAgICAgICAgc2VsZi5kYmVudkNsaWVudC5zZXRfZXZlbnRfbm90aWZ5KGR1bW15KQorICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcF9zZXRfdHJhbnNwb3J0KDEzLGR1bW15KQorICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcF9zZXRfdHJhbnNwb3J0KDMsZHVtbXkpCisKKyAgICAgICAgc2VsZi5kYmVudkNsaWVudC5jbG9zZSgpCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIuY2xvc2UoKQorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpckNsaWVudCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXJNYXN0ZXIpCisKKyAgICBkZWYgYmFzaWNfcmVwX3RocmVhZGluZyhzZWxmKSA6CisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwX3N0YXJ0KGZsYWdzPWRiLkRCX1JFUF9NQVNURVIpCisgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwX3N0YXJ0KGZsYWdzPWRiLkRCX1JFUF9DTElFTlQpCisKKyAgICAgICAgZGVmIHRocmVhZF9kbyhlbnYsIHEsIGVudmlkLCBlbGVjdGlvbl9zdGF0dXMsIG11c3RfYmVfbWFzdGVyKSA6CisgICAgICAgICAgICB3aGlsZSBUcnVlIDoKKyAgICAgICAgICAgICAgICB2PXEuZ2V0KCkKKyAgICAgICAgICAgICAgICBpZiB2IGlzIE5vbmUgOiByZXR1cm4KKyAgICAgICAgICAgICAgICBlbnYucmVwX3Byb2Nlc3NfbWVzc2FnZSh2WzBdLCB2WzFdLCBlbnZpZCkKKworICAgICAgICBzZWxmLnRocmVhZF9kbyA9IHRocmVhZF9kbworCisgICAgICAgIHNlbGYudF9tLnN0YXJ0KCkKKyAgICAgICAgc2VsZi50X2Muc3RhcnQoKQorCisgICAgZGVmIHRlc3QwMV9iYXNpY19yZXBsaWNhdGlvbihzZWxmKSA6CisgICAgICAgIHNlbGYuYmFzaWNfcmVwX3RocmVhZGluZygpCisKKyAgICAgICAgIyBUaGUgdGltZW91dCBpcyBuZWNlc3NhcnkgaW4gQkRCIDQuNSwgc2luY2UgREJfRVZFTlRfUkVQX1NUQVJUVVBET05FCisgICAgICAgICMgaXMgbm90IGdlbmVyYXRlZCBpZiB0aGUgbWFzdGVyIGhhcyBubyBuZXcgdHJhbnNhY3Rpb25zLgorICAgICAgICAjIFRoaXMgaXMgc29sdmVkIGluIEJEQiA0LjYgKCMxNTU0MikuCisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIHRpbWVvdXQgPSB0aW1lLnRpbWUoKSs2MAorICAgICAgICB3aGlsZSAodGltZS50aW1lKCk8dGltZW91dCkgYW5kIG5vdCAoc2VsZi5jb25maXJtZWRfbWFzdGVyIGFuZAorICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3N0YXJ0dXBkb25lKSA6CisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lLnRpbWUoKTx0aW1lb3V0KQorCisgICAgICAgIHNlbGYuZGJNYXN0ZXI9ZGIuREIoc2VsZi5kYmVudk1hc3RlcikKKyAgICAgICAgdHhuPXNlbGYuZGJlbnZNYXN0ZXIudHhuX2JlZ2luKCkKKyAgICAgICAgc2VsZi5kYk1hc3Rlci5vcGVuKCJ0ZXN0IiwgZGIuREJfSEFTSCwgZGIuREJfQ1JFQVRFLCAwNjY2LCB0eG49dHhuKQorICAgICAgICB0eG4uY29tbWl0KCkKKworICAgICAgICBpbXBvcnQgdGltZSxvcy5wYXRoCisgICAgICAgIHRpbWVvdXQ9dGltZS50aW1lKCkrMTAKKyAgICAgICAgd2hpbGUgKHRpbWUudGltZSgpPHRpbWVvdXQpIGFuZCBcCisgICAgICAgICAgbm90IChvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5ob21lRGlyQ2xpZW50LCJ0ZXN0IikpKSA6CisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDEpCisKKyAgICAgICAgc2VsZi5kYkNsaWVudD1kYi5EQihzZWxmLmRiZW52Q2xpZW50KQorICAgICAgICB3aGlsZSBUcnVlIDoKKyAgICAgICAgICAgIHR4bj1zZWxmLmRiZW52Q2xpZW50LnR4bl9iZWdpbigpCisgICAgICAgICAgICB0cnkgOgorICAgICAgICAgICAgICAgIHNlbGYuZGJDbGllbnQub3BlbigidGVzdCIsIGRiLkRCX0hBU0gsIGZsYWdzPWRiLkRCX1JET05MWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9MDY2NiwgdHhuPXR4bikKKyAgICAgICAgICAgIGV4Y2VwdCBkYi5EQlJlcEhhbmRsZURlYWRFcnJvciA6CisgICAgICAgICAgICAgICAgdHhuLmFib3J0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmRiQ2xpZW50LmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmRiQ2xpZW50PWRiLkRCKHNlbGYuZGJlbnZDbGllbnQpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgICAgICBicmVhaworCisgICAgICAgIGQgPSBzZWxmLmRiZW52TWFzdGVyLnJlcF9zdGF0KGZsYWdzPWRiLkRCX1NUQVRfQ0xFQVIpOworICAgICAgICBzZWxmLmFzc2VydFRydWUoIm1hc3Rlcl9jaGFuZ2VzIiBpbiBkKQorCisgICAgICAgIHR4bj1zZWxmLmRiZW52TWFzdGVyLnR4bl9iZWdpbigpCisgICAgICAgIHNlbGYuZGJNYXN0ZXIucHV0KCJBQkMiLCAiMTIzIiwgdHhuPXR4bikKKyAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIHRpbWVvdXQ9dGltZS50aW1lKCkrMTAKKyAgICAgICAgdj1Ob25lCisgICAgICAgIHdoaWxlICh0aW1lLnRpbWUoKTx0aW1lb3V0KSBhbmQgKHYgaXMgTm9uZSkgOgorICAgICAgICAgICAgdHhuPXNlbGYuZGJlbnZDbGllbnQudHhuX2JlZ2luKCkKKyAgICAgICAgICAgIHY9c2VsZi5kYkNsaWVudC5nZXQoIkFCQyIsIHR4bj10eG4pCisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgIGlmIHYgaXMgTm9uZSA6CisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZS50aW1lKCk8dGltZW91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgdikKKworICAgICAgICB0eG49c2VsZi5kYmVudk1hc3Rlci50eG5fYmVnaW4oKQorICAgICAgICBzZWxmLmRiTWFzdGVyLmRlbGV0ZSgiQUJDIiwgdHhuPXR4bikKKyAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgIHRpbWVvdXQ9dGltZS50aW1lKCkrMTAKKyAgICAgICAgd2hpbGUgKHRpbWUudGltZSgpPHRpbWVvdXQpIGFuZCAodiBpcyBub3QgTm9uZSkgOgorICAgICAgICAgICAgdHhuPXNlbGYuZGJlbnZDbGllbnQudHhuX2JlZ2luKCkKKyAgICAgICAgICAgIHY9c2VsZi5kYkNsaWVudC5nZXQoIkFCQyIsIHR4bj10eG4pCisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgIGlmIHYgaXMgTm9uZSA6CisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZS50aW1lKCk8dGltZW91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCB2KQorCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LDcpIDoKKyAgICAgICAgZGVmIHRlc3QwMl90ZXN0X3JlcXVlc3Qoc2VsZikgOgorICAgICAgICAgICAgc2VsZi5iYXNpY19yZXBfdGhyZWFkaW5nKCkKKyAgICAgICAgICAgIChtaW5pbXVtLCBtYXhpbXVtKSA9IHNlbGYuZGJlbnZDbGllbnQucmVwX2dldF9yZXF1ZXN0KCkKKyAgICAgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwX3NldF9yZXF1ZXN0KG1pbmltdW0tMSwgbWF4aW11bSsxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52Q2xpZW50LnJlcF9nZXRfcmVxdWVzdCgpLAorICAgICAgICAgICAgICAgICAgICAobWluaW11bS0xLCBtYXhpbXVtKzEpKQorCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LDYpIDoKKyAgICAgICAgZGVmIHRlc3QwM19tYXN0ZXJfZWxlY3Rpb24oc2VsZikgOgorICAgICAgICAgICAgIyBHZXQgcmVhZHkgdG8gaG9sZCBhbiBlbGVjdGlvbgorICAgICAgICAgICAgI3NlbGYuZGJlbnZNYXN0ZXIucmVwX3N0YXJ0KGZsYWdzPWRiLkRCX1JFUF9NQVNURVIpCisgICAgICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcF9zdGFydChmbGFncz1kYi5EQl9SRVBfQ0xJRU5UKQorICAgICAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBfc3RhcnQoZmxhZ3M9ZGIuREJfUkVQX0NMSUVOVCkKKworICAgICAgICAgICAgZGVmIHRocmVhZF9kbyhlbnYsIHEsIGVudmlkLCBlbGVjdGlvbl9zdGF0dXMsIG11c3RfYmVfbWFzdGVyKSA6CisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZSA6CisgICAgICAgICAgICAgICAgICAgIHY9cS5nZXQoKQorICAgICAgICAgICAgICAgICAgICBpZiB2IGlzIE5vbmUgOiByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgciA9IGVudi5yZXBfcHJvY2Vzc19tZXNzYWdlKHZbMF0sdlsxXSxlbnZpZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbXVzdF9iZV9tYXN0ZXIgYW5kIHNlbGYuY29uZmlybWVkX21hc3RlciA6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcF9zdGFydChmbGFncyA9IGRiLkRCX1JFUF9NQVNURVIpCisgICAgICAgICAgICAgICAgICAgICAgICBtdXN0X2JlX21hc3RlciA9IEZhbHNlCisKKyAgICAgICAgICAgICAgICAgICAgaWYgclswXSA9PSBkYi5EQl9SRVBfSE9MREVMRUNUSU9OIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBlbGVjdCgpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi5yZXBfZWxlY3QoMiwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZWN0aW9uX3N0YXR1c1swXSA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZGIuREJSZXBVbmF2YWlsRXJyb3IgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGVsZWN0aW9uX3N0YXR1c1swXSBhbmQgbm90IHNlbGYuY29uZmlybWVkX21hc3RlciA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZWN0aW9uX3N0YXR1c1swXSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0PVRocmVhZCh0YXJnZXQ9ZWxlY3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5zdGFydCgpCisKKyAgICAgICAgICAgIHNlbGYudGhyZWFkX2RvID0gdGhyZWFkX2RvCisKKyAgICAgICAgICAgIHNlbGYudF9tLnN0YXJ0KCkKKyAgICAgICAgICAgIHNlbGYudF9jLnN0YXJ0KCkKKworICAgICAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBfc2V0X3RpbWVvdXQoZGIuREJfUkVQX0VMRUNUSU9OX1RJTUVPVVQsIDUwMDAwKQorICAgICAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBfc2V0X3RpbWVvdXQoZGIuREJfUkVQX0VMRUNUSU9OX1RJTUVPVVQsIDUwMDAwKQorICAgICAgICAgICAgc2VsZi5jbGllbnRfZG9pbmdfZWxlY3Rpb25bMF0gPSBUcnVlCisgICAgICAgICAgICB3aGlsZSBUcnVlIDoKKyAgICAgICAgICAgICAgICB0cnkgOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcF9lbGVjdCgyLCAxKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9kb2luZ19lbGVjdGlvblswXSA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXhjZXB0IGRiLkRCUmVwVW5hdmFpbEVycm9yIDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5jb25maXJtZWRfbWFzdGVyKQorCisgICAgICAgICAgICAjIFJhY2UgY29uZGl0aW9uIHNob3dlZCB1cCBhZnRlciB1cGdyYWRpbmcgdG8gU29sYXJpcyAxMCBVcGRhdGUgMTAKKyAgICAgICAgICAgICMgaHR0cHM6Ly9mb3J1bXMub3JhY2xlLmNvbS9mb3J1bXMvdGhyZWFkLmpzcGE/bWVzc2FnZUlEPTk5MDI4NjAKKyAgICAgICAgICAgICMgamNlYUBqY2VhLmVzOiBTZWUgcHJpdmF0ZSBlbWFpbCBmcm9tIFBhdWxhIEJpbmdoYW0gKE9yYWNsZSksCisgICAgICAgICAgICAjIGluIDIwMTEwOTI5LgorICAgICAgICAgICAgd2hpbGUgbm90IChzZWxmLmRiZW52Q2xpZW50LnJlcF9zdGF0KClbInN0YXJ0dXBfY29tcGxldGUiXSkgOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCw3KSA6CisgICAgICAgIGRlZiB0ZXN0MDRfdGVzdF9jbG9ja3NrZXcoc2VsZikgOgorICAgICAgICAgICAgZmFzdCwgc2xvdyA9IDEyMzQsIDEyMzAKKyAgICAgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwX3NldF9jbG9ja3NrZXcoZmFzdCwgc2xvdykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGZhc3QsIHNsb3cpLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcF9nZXRfY2xvY2tza2V3KCkpCisgICAgICAgICAgICBzZWxmLmJhc2ljX3JlcF90aHJlYWRpbmcoKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDYpIDoKKyAgICAgICAgZGJlbnYgPSBkYi5EQkVudigpCisgICAgICAgIHRyeSA6CisgICAgICAgICAgICBkYmVudi5yZXBtZ3JfZ2V0X2Fja19wb2xpY3koKQorICAgICAgICAgICAgUmVwbGljYXRpb25NYW5hZ2VyX2F2YWlsYWJsZT1UcnVlCisgICAgICAgIGV4Y2VwdCA6CisgICAgICAgICAgICBSZXBsaWNhdGlvbk1hbmFnZXJfYXZhaWxhYmxlPUZhbHNlCisgICAgICAgIGRiZW52LmNsb3NlKCkKKyAgICAgICAgZGVsIGRiZW52CisgICAgICAgIGlmIFJlcGxpY2F0aW9uTWFuYWdlcl9hdmFpbGFibGUgOgorICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJSZXBsaWNhdGlvbk1hbmFnZXIpKQorCisgICAgICAgIGlmIGhhdmVfdGhyZWFkcyA6CisgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEQkJhc2VSZXBsaWNhdGlvbikpCisKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcmVwbGljYXRpb24ucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcmVwbGljYXRpb24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDVkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZXBsaWNhdGlvbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcmVwbGljYXRpb24ucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcmVwbGljYXRpb24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NDVkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZXBsaWNhdGlvbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3Rfc2VxdWVuY2UucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9zZXF1ZW5jZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGFhMTJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3Rfc2VxdWVuY2UucHkKQEAgLTAsMCArMSwxMzYgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCB0ZXN0X3N1cHBvcnQsIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKKworY2xhc3MgREJTZXF1ZW5jZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5pbnRfMzJfbWF4ID0gMHgxMDAwMDAwMDAKKyAgICAgICAgc2VsZi5ob21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9ICJ0ZXN0IgorCisgICAgICAgIHNlbGYuZGJlbnYgPSBkYi5EQkVudigpCisgICAgICAgIHNlbGYuZGJlbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wsIDA2NjYpCisgICAgICAgIHNlbGYuZCA9IGRiLkRCKHNlbGYuZGJlbnYpCisgICAgICAgIHNlbGYuZC5vcGVuKHNlbGYuZmlsZW5hbWUsIGRiLkRCX0JUUkVFLCBkYi5EQl9DUkVBVEUsIDA2NjYpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ3NlcScpOgorICAgICAgICAgICAgc2VsZi5zZXEuY2xvc2UoKQorICAgICAgICAgICAgZGVsIHNlbGYuc2VxCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2QnKToKKyAgICAgICAgICAgIHNlbGYuZC5jbG9zZSgpCisgICAgICAgICAgICBkZWwgc2VsZi5kCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2RiZW52Jyk6CisgICAgICAgICAgICBzZWxmLmRiZW52LmNsb3NlKCkKKyAgICAgICAgICAgIGRlbCBzZWxmLmRiZW52CisKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCisKKyAgICBkZWYgdGVzdF9nZXQoc2VsZik6CisgICAgICAgIHNlbGYuc2VxID0gZGIuREJTZXF1ZW5jZShzZWxmLmQsIGZsYWdzPTApCisgICAgICAgIHN0YXJ0X3ZhbHVlID0gMTAgKiBzZWxmLmludF8zMl9tYXgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgweEEwMDAwMDAwMCwgc3RhcnRfdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5zZXEuaW5pdGlhbF92YWx1ZShzdGFydF92YWx1ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5zZXEub3BlbihrZXk9J2lkJywgdHhuPU5vbmUsIGZsYWdzPWRiLkRCX0NSRUFURSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhcnRfdmFsdWUsIHNlbGYuc2VxLmdldCg1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGFydF92YWx1ZSArIDUsIHNlbGYuc2VxLmdldCgpKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgorICAgICAgICBzZWxmLnNlcSA9IGRiLkRCU2VxdWVuY2Uoc2VsZi5kLCBmbGFncz0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuc2VxLm9wZW4oa2V5PSdmb28nLCB0eG49Tm9uZSwgZmxhZ3M9ZGIuREJfQ1JFQVRFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLnNlcS5yZW1vdmUodHhuPU5vbmUsIGZsYWdzPTApKQorICAgICAgICBkZWwgc2VsZi5zZXEKKworICAgIGRlZiB0ZXN0X2dldF9rZXkoc2VsZik6CisgICAgICAgIHNlbGYuc2VxID0gZGIuREJTZXF1ZW5jZShzZWxmLmQsIGZsYWdzPTApCisgICAgICAgIGtleSA9ICdmb28nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5zZXEub3BlbihrZXk9a2V5LCB0eG49Tm9uZSwgZmxhZ3M9ZGIuREJfQ1JFQVRFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrZXksIHNlbGYuc2VxLmdldF9rZXkoKSkKKworICAgIGRlZiB0ZXN0X2dldF9kYnAoc2VsZik6CisgICAgICAgIHNlbGYuc2VxID0gZGIuREJTZXF1ZW5jZShzZWxmLmQsIGZsYWdzPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5zZXEub3BlbihrZXk9J2ZvbycsIHR4bj1Ob25lLCBmbGFncz1kYi5EQl9DUkVBVEUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZCwgc2VsZi5zZXEuZ2V0X2RicCgpKQorCisgICAgZGVmIHRlc3RfY2FjaGVzaXplKHNlbGYpOgorICAgICAgICBzZWxmLnNlcSA9IGRiLkRCU2VxdWVuY2Uoc2VsZi5kLCBmbGFncz0wKQorICAgICAgICBjYXNoZV9zaXplID0gMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLnNlcS5zZXRfY2FjaGVzaXplKGNhc2hlX3NpemUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuc2VxLm9wZW4oa2V5PSdmb28nLCB0eG49Tm9uZSwgZmxhZ3M9ZGIuREJfQ1JFQVRFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXNoZV9zaXplLCBzZWxmLnNlcS5nZXRfY2FjaGVzaXplKCkpCisKKyAgICBkZWYgdGVzdF9mbGFncyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXEgPSBkYi5EQlNlcXVlbmNlKHNlbGYuZCwgZmxhZ3M9MCkKKyAgICAgICAgZmxhZyA9IGRiLkRCX1NFUV9XUkFQOworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuc2VxLnNldF9mbGFncyhmbGFnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLnNlcS5vcGVuKGtleT0nZm9vJywgdHhuPU5vbmUsIGZsYWdzPWRiLkRCX0NSRUFURSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhZywgc2VsZi5zZXEuZ2V0X2ZsYWdzKCkgJiBmbGFnKQorCisgICAgZGVmIHRlc3RfcmFuZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuc2VxID0gZGIuREJTZXF1ZW5jZShzZWxmLmQsIGZsYWdzPTApCisgICAgICAgIHNlcV9yYW5nZSA9ICgxMCAqIHNlbGYuaW50XzMyX21heCwgMTEgKiBzZWxmLmludF8zMl9tYXggLSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuc2VxLnNldF9yYW5nZShzZXFfcmFuZ2UpKQorICAgICAgICBzZWxmLnNlcS5pbml0aWFsX3ZhbHVlKHNlcV9yYW5nZVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLnNlcS5vcGVuKGtleT0nZm9vJywgdHhuPU5vbmUsIGZsYWdzPWRiLkRCX0NSRUFURSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VxX3JhbmdlLCBzZWxmLnNlcS5nZXRfcmFuZ2UoKSkKKworICAgIGRlZiB0ZXN0X3N0YXQoc2VsZik6CisgICAgICAgIHNlbGYuc2VxID0gZGIuREJTZXF1ZW5jZShzZWxmLmQsIGZsYWdzPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5zZXEub3BlbihrZXk9J2ZvbycsIHR4bj1Ob25lLCBmbGFncz1kYi5EQl9DUkVBVEUpKQorICAgICAgICBzdGF0ID0gc2VsZi5zZXEuc3RhdCgpCisgICAgICAgIGZvciBwYXJhbSBpbiAoJ25vd2FpdCcsICdtaW4nLCAnbWF4JywgJ3ZhbHVlJywgJ2N1cnJlbnQnLAorICAgICAgICAgICAgICAgICAgICAgICdmbGFncycsICdjYWNoZV9zaXplJywgJ2xhc3RfdmFsdWUnLCAnd2FpdCcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcmFtIGluIHN0YXQsICJwYXJhbWV0ZXIgJXMgaXNuJ3QgaW4gc3RhdCBpbmZvIiAlIHBhcmFtKQorCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LDcpIDoKKyAgICAgICAgIyBUaGlzIGNvZGUgY2hlY2tzIGEgY3Jhc2ggc29sdmVkIGluIEJlcmtlbGV5IERCIDQuNworICAgICAgICBkZWYgdGVzdF9zdGF0X2NyYXNoKHNlbGYpIDoKKyAgICAgICAgICAgIGQ9ZGIuREIoKQorICAgICAgICAgICAgZC5vcGVuKE5vbmUsZGJ0eXBlPWRiLkRCX0hBU0gsZmxhZ3M9ZGIuREJfQ1JFQVRFKSAgIyBJbiBSQU0KKyAgICAgICAgICAgIHNlcSA9IGRiLkRCU2VxdWVuY2UoZCwgZmxhZ3M9MCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJOb3RGb3VuZEVycm9yLCBzZXEub3BlbiwKKyAgICAgICAgICAgICAgICAgICAga2V5PSdpZCcsIHR4bj1Ob25lLCBmbGFncz0wKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwgc2VxLnN0YXQpCisKKyAgICAgICAgICAgIGQuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfNjRiaXRzKHNlbGYpIDoKKyAgICAgICAgIyBXZSBkb24ndCB1c2UgYm90aCBleHRyZW1lcyBiZWNhdXNlIHRoZXkgYXJlIHByb2JsZW1hdGljCisgICAgICAgIHZhbHVlX3BsdXM9KDFMPDw2MyktMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDkyMjMzNzIwMzY4NTQ3NzU4MDZMLHZhbHVlX3BsdXMpCisgICAgICAgIHZhbHVlX21pbnVzPSgtMUw8PDYzKSsxICAjIFR3byBjb21wbGVtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMLHZhbHVlX21pbnVzKQorICAgICAgICBzZWxmLnNlcSA9IGRiLkRCU2VxdWVuY2Uoc2VsZi5kLCBmbGFncz0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuc2VxLmluaXRpYWxfdmFsdWUodmFsdWVfcGx1cy0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLnNlcS5vcGVuKGtleT0naWQnLCB0eG49Tm9uZSwKKyAgICAgICAgICAgIGZsYWdzPWRiLkRCX0NSRUFURSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVfcGx1cy0xLCBzZWxmLnNlcS5nZXQoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVfcGx1cywgc2VsZi5zZXEuZ2V0KDEpKQorCisgICAgICAgIHNlbGYuc2VxLnJlbW92ZSh0eG49Tm9uZSwgZmxhZ3M9MCkKKworICAgICAgICBzZWxmLnNlcSA9IGRiLkRCU2VxdWVuY2Uoc2VsZi5kLCBmbGFncz0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuc2VxLmluaXRpYWxfdmFsdWUodmFsdWVfbWludXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuc2VxLm9wZW4oa2V5PSdpZCcsIHR4bj1Ob25lLAorICAgICAgICAgICAgZmxhZ3M9ZGIuREJfQ1JFQVRFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZV9taW51cywgc2VsZi5zZXEuZ2V0KDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlX21pbnVzKzEsIHNlbGYuc2VxLmdldCgxKSkKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLnNlcSA9IGRiLkRCU2VxdWVuY2Uoc2VsZi5kKQorICAgICAgICBzZWxmLnNlcS5jbG9zZSgpICAjIFlvdSBjYW4gY2xvc2UgYSBTZXF1ZW5jZSBtdWx0aXBsZSB0aW1lcworICAgICAgICBzZWxmLnNlcS5jbG9zZSgpCisgICAgICAgIHNlbGYuc2VxLmNsb3NlKCkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJTZXF1ZW5jZVRlc3QpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9zZXF1ZW5jZS5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9zZXF1ZW5jZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2Yzk3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3NlcXVlbmNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9zZXF1ZW5jZS5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9zZXF1ZW5jZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE2Yzk3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3NlcXVlbmNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF90aHJlYWQucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF90aHJlYWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyMTJlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3RocmVhZC5weQpAQCAtMCwwICsxLDUxNyBAQAorIiIiVGVzdENhc2VzIGZvciBtdWx0aS10aHJlYWRlZCBhY2Nlc3MgdG8gYSBEQi4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgZXJybm8KK2Zyb20gcmFuZG9tIGltcG9ydCByYW5kb20KKworREFTSCA9ICctJworCit0cnk6CisgICAgV2luZG93c0Vycm9yCitleGNlcHQgTmFtZUVycm9yOgorICAgIGNsYXNzIFdpbmRvd3NFcnJvcihFeGNlcHRpb24pOgorICAgICAgICBwYXNzCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIGRidXRpbHMsIHRlc3Rfc3VwcG9ydCwgdmVyYm9zZSwgaGF2ZV90aHJlYWRzLCBcCisgICAgICAgIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKK2lmIGhhdmVfdGhyZWFkcyA6CisgICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRocmVhZAorICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IGN1cnJlbnRUaHJlYWQKKyAgICBlbHNlIDoKKyAgICAgICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IGN1cnJlbnRfdGhyZWFkIGFzIGN1cnJlbnRUaHJlYWQKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCYXNlVGhyZWFkZWRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGJ0eXBlICAgICAgID0gZGIuREJfVU5LTk9XTiAgIyBtdXN0IGJlIHNldCBpbiBkZXJpdmVkIGNsYXNzCisgICAgZGJvcGVuZmxhZ3MgID0gMAorICAgIGRic2V0ZmxhZ3MgICA9IDAKKyAgICBlbnZmbGFncyAgICAgPSAwCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBkYnV0aWxzLl9kZWFkbG9ja19WZXJib3NlRmlsZSA9IHN5cy5zdGRvdXQKKworICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICBzZWxmLmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgc2VsZi5zZXRFbnZPcHRzKCkKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIHNlbGYuZW52ZmxhZ3MgfCBkYi5EQl9DUkVBVEUpCisKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgJy5kYicKKyAgICAgICAgc2VsZi5kID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIGlmIHNlbGYuZGJzZXRmbGFnczoKKyAgICAgICAgICAgIHNlbGYuZC5zZXRfZmxhZ3Moc2VsZi5kYnNldGZsYWdzKQorICAgICAgICBzZWxmLmQub3BlbihzZWxmLmZpbGVuYW1lLCBzZWxmLmRidHlwZSwgc2VsZi5kYm9wZW5mbGFnc3xkYi5EQl9DUkVBVEUpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZC5jbG9zZSgpCisgICAgICAgIHNlbGYuZW52LmNsb3NlKCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCisKKyAgICBkZWYgc2V0RW52T3B0cyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIG1ha2VEYXRhKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBEQVNILmpvaW4oW2tleV0gKiA1KQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworY2xhc3MgQ29uY3VycmVudERhdGFTdG9yZUJhc2UoQmFzZVRocmVhZGVkVGVzdENhc2UpOgorICAgIGRib3BlbmZsYWdzID0gZGIuREJfVEhSRUFECisgICAgZW52ZmxhZ3MgICAgPSBkYi5EQl9USFJFQUQgfCBkYi5EQl9JTklUX0NEQiB8IGRiLkRCX0lOSVRfTVBPT0wKKyAgICByZWFkZXJzICAgICA9IDAgIyBkZXJpdmVkIGNsYXNzIHNob3VsZCBzZXQKKyAgICB3cml0ZXJzICAgICA9IDAKKyAgICByZWNvcmRzICAgICA9IDEwMDAKKworICAgIGRlZiB0ZXN0MDFfMVdyaXRlck11bHRpUmVhZGVycyhzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAxXzFXcml0ZXJNdWx0aVJlYWRlcnMuLi4iICUgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBrZXlzPXJhbmdlKHNlbGYucmVjb3JkcykKKyAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICByYW5kb20uc2h1ZmZsZShrZXlzKQorICAgICAgICByZWNvcmRzX3Blcl93cml0ZXI9c2VsZi5yZWNvcmRzLy9zZWxmLndyaXRlcnMKKyAgICAgICAgcmVhZGVyc19wZXJfd3JpdGVyPXNlbGYucmVhZGVycy8vc2VsZi53cml0ZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWNvcmRzLHNlbGYud3JpdGVycypyZWNvcmRzX3Blcl93cml0ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWFkZXJzLHNlbGYud3JpdGVycypyZWFkZXJzX3Blcl93cml0ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocmVjb3Jkc19wZXJfd3JpdGVyJXJlYWRlcnNfcGVyX3dyaXRlcik9PTApCisgICAgICAgIHJlYWRlcnMgPSBbXQorCisgICAgICAgIGZvciB4IGluIHhyYW5nZShzZWxmLnJlYWRlcnMpOgorICAgICAgICAgICAgcnQgPSBUaHJlYWQodGFyZ2V0ID0gc2VsZi5yZWFkZXJUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gKHNlbGYuZCwgeCksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gJ3JlYWRlciAlZCcgJSB4LAorICAgICAgICAgICAgICAgICAgICAgICAgKSN2ZXJib3NlID0gdmVyYm9zZSkKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgICAgICBydC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHJ0LmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHJlYWRlcnMuYXBwZW5kKHJ0KQorCisgICAgICAgIHdyaXRlcnM9W10KKyAgICAgICAgZm9yIHggaW4geHJhbmdlKHNlbGYud3JpdGVycyk6CisgICAgICAgICAgICBhPWtleXNbcmVjb3Jkc19wZXJfd3JpdGVyKng6cmVjb3Jkc19wZXJfd3JpdGVyKih4KzEpXQorICAgICAgICAgICAgYS5zb3J0KCkgICMgR2VuZXJhdGUgY29uZmxpY3RzCisgICAgICAgICAgICBiPXJlYWRlcnNbcmVhZGVyc19wZXJfd3JpdGVyKng6cmVhZGVyc19wZXJfd3JpdGVyKih4KzEpXQorICAgICAgICAgICAgd3QgPSBUaHJlYWQodGFyZ2V0ID0gc2VsZi53cml0ZXJUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gKHNlbGYuZCwgYSwgYiksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gJ3dyaXRlciAlZCcgJSB4LAorICAgICAgICAgICAgICAgICAgICAgICAgKSN2ZXJib3NlID0gdmVyYm9zZSkKKyAgICAgICAgICAgIHdyaXRlcnMuYXBwZW5kKHd0KQorCisgICAgICAgIGZvciB0IGluIHdyaXRlcnM6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICAgICAgdC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHQuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgdC5zdGFydCgpCisKKyAgICAgICAgZm9yIHQgaW4gd3JpdGVyczoKKyAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgIGZvciB0IGluIHJlYWRlcnM6CisgICAgICAgICAgICB0LmpvaW4oKQorCisgICAgZGVmIHdyaXRlclRocmVhZChzZWxmLCBkLCBrZXlzLCByZWFkZXJzKToKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgbmFtZSA9IGN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkKKyAgICAgICAgZWxzZSA6CisgICAgICAgICAgICBuYW1lID0gY3VycmVudFRocmVhZCgpLm5hbWUKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiVzOiBjcmVhdGluZyByZWNvcmRzICVkIC0gJWQiICUgKG5hbWUsIHN0YXJ0LCBzdG9wKQorCisgICAgICAgIGNvdW50PWxlbihrZXlzKS8vbGVuKHJlYWRlcnMpCisgICAgICAgIGNvdW50Mj1jb3VudAorICAgICAgICBmb3IgeCBpbiBrZXlzIDoKKyAgICAgICAgICAgIGtleSA9ICclMDRkJyAlIHgKKyAgICAgICAgICAgIGRidXRpbHMuRGVhZGxvY2tXcmFwKGQucHV0LCBrZXksIHNlbGYubWFrZURhdGEoa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9yZXRyaWVzPTEyKQorICAgICAgICAgICAgaWYgdmVyYm9zZSBhbmQgeCAlIDEwMCA9PSAwOgorICAgICAgICAgICAgICAgIHByaW50ICIlczogcmVjb3JkcyAlZCAtICVkIGZpbmlzaGVkIiAlIChuYW1lLCBzdGFydCwgeCkKKworICAgICAgICAgICAgY291bnQyLT0xCisgICAgICAgICAgICBpZiBub3QgY291bnQyIDoKKyAgICAgICAgICAgICAgICByZWFkZXJzLnBvcCgpLnN0YXJ0KCkKKyAgICAgICAgICAgICAgICBjb3VudDI9Y291bnQKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiVzOiBmaW5pc2hlZCBjcmVhdGluZyByZWNvcmRzIiAlIG5hbWUKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiVzOiB0aHJlYWQgZmluaXNoZWQiICUgbmFtZQorCisgICAgZGVmIHJlYWRlclRocmVhZChzZWxmLCBkLCByZWFkZXJOdW0pOgorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICBuYW1lID0gY3VycmVudFRocmVhZCgpLmdldE5hbWUoKQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50VGhyZWFkKCkubmFtZQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZSg1KSA6CisgICAgICAgICAgICBjID0gZC5jdXJzb3IoKQorICAgICAgICAgICAgY291bnQgPSAwCisgICAgICAgICAgICByZWMgPSBjLmZpcnN0KCkKKyAgICAgICAgICAgIHdoaWxlIHJlYzoKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAga2V5LCBkYXRhID0gcmVjCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1ha2VEYXRhKGtleSksIGRhdGEpCisgICAgICAgICAgICAgICAgcmVjID0gYy5uZXh0KCkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiBmb3VuZCAlZCByZWNvcmRzIiAlIChuYW1lLCBjb3VudCkKKyAgICAgICAgICAgIGMuY2xvc2UoKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXM6IHRocmVhZCBmaW5pc2hlZCIgJSBuYW1lCisKKworY2xhc3MgQlRyZWVDb25jdXJyZW50RGF0YVN0b3JlKENvbmN1cnJlbnREYXRhU3RvcmVCYXNlKToKKyAgICBkYnR5cGUgID0gZGIuREJfQlRSRUUKKyAgICB3cml0ZXJzID0gMgorICAgIHJlYWRlcnMgPSAxMAorICAgIHJlY29yZHMgPSAxMDAwCisKKworY2xhc3MgSGFzaENvbmN1cnJlbnREYXRhU3RvcmUoQ29uY3VycmVudERhdGFTdG9yZUJhc2UpOgorICAgIGRidHlwZSAgPSBkYi5EQl9IQVNICisgICAgd3JpdGVycyA9IDIKKyAgICByZWFkZXJzID0gMTAKKyAgICByZWNvcmRzID0gMTAwMAorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFNpbXBsZVRocmVhZGVkQmFzZShCYXNlVGhyZWFkZWRUZXN0Q2FzZSk6CisgICAgZGJvcGVuZmxhZ3MgPSBkYi5EQl9USFJFQUQKKyAgICBlbnZmbGFncyAgICA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sKKyAgICByZWFkZXJzID0gMTAKKyAgICB3cml0ZXJzID0gMgorICAgIHJlY29yZHMgPSAxMDAwCisKKyAgICBkZWYgc2V0RW52T3B0cyhzZWxmKToKKyAgICAgICAgc2VsZi5lbnYuc2V0X2xrX2RldGVjdChkYi5EQl9MT0NLX0RFRkFVTFQpCisKKyAgICBkZWYgdGVzdDAyX1NpbXBsZUxvY2tzKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDJfU2ltcGxlTG9ja3MuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworCisgICAgICAgIGtleXM9cmFuZ2Uoc2VsZi5yZWNvcmRzKQorICAgICAgICBpbXBvcnQgcmFuZG9tCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKGtleXMpCisgICAgICAgIHJlY29yZHNfcGVyX3dyaXRlcj1zZWxmLnJlY29yZHMvL3NlbGYud3JpdGVycworICAgICAgICByZWFkZXJzX3Blcl93cml0ZXI9c2VsZi5yZWFkZXJzLy9zZWxmLndyaXRlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlY29yZHMsc2VsZi53cml0ZXJzKnJlY29yZHNfcGVyX3dyaXRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlYWRlcnMsc2VsZi53cml0ZXJzKnJlYWRlcnNfcGVyX3dyaXRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChyZWNvcmRzX3Blcl93cml0ZXIlcmVhZGVyc19wZXJfd3JpdGVyKT09MCkKKworICAgICAgICByZWFkZXJzID0gW10KKyAgICAgICAgZm9yIHggaW4geHJhbmdlKHNlbGYucmVhZGVycyk6CisgICAgICAgICAgICBydCA9IFRocmVhZCh0YXJnZXQgPSBzZWxmLnJlYWRlclRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSAoc2VsZi5kLCB4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAncmVhZGVyICVkJyAlIHgsCisgICAgICAgICAgICAgICAgICAgICAgICApI3ZlcmJvc2UgPSB2ZXJib3NlKQorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgICAgIHJ0LnNldERhZW1vbihUcnVlKQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgcnQuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgcmVhZGVycy5hcHBlbmQocnQpCisKKyAgICAgICAgd3JpdGVycyA9IFtdCisgICAgICAgIGZvciB4IGluIHhyYW5nZShzZWxmLndyaXRlcnMpOgorICAgICAgICAgICAgYT1rZXlzW3JlY29yZHNfcGVyX3dyaXRlcip4OnJlY29yZHNfcGVyX3dyaXRlciooeCsxKV0KKyAgICAgICAgICAgIGEuc29ydCgpICAjIEdlbmVyYXRlIGNvbmZsaWN0cworICAgICAgICAgICAgYj1yZWFkZXJzW3JlYWRlcnNfcGVyX3dyaXRlcip4OnJlYWRlcnNfcGVyX3dyaXRlciooeCsxKV0KKyAgICAgICAgICAgIHd0ID0gVGhyZWFkKHRhcmdldCA9IHNlbGYud3JpdGVyVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IChzZWxmLmQsIGEsIGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICd3cml0ZXIgJWQnICUgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICkjdmVyYm9zZSA9IHZlcmJvc2UpCisgICAgICAgICAgICB3cml0ZXJzLmFwcGVuZCh3dCkKKworICAgICAgICBmb3IgdCBpbiB3cml0ZXJzOgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgICAgIHQuc2V0RGFlbW9uKFRydWUpCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICB0LmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHQuc3RhcnQoKQorCisgICAgICAgIGZvciB0IGluIHdyaXRlcnM6CisgICAgICAgICAgICB0LmpvaW4oKQorICAgICAgICBmb3IgdCBpbiByZWFkZXJzOgorICAgICAgICAgICAgdC5qb2luKCkKKworICAgIGRlZiB3cml0ZXJUaHJlYWQoc2VsZiwgZCwga2V5cywgcmVhZGVycyk6CisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgbmFtZSA9IGN1cnJlbnRUaHJlYWQoKS5uYW1lCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXM6IGNyZWF0aW5nIHJlY29yZHMgJWQgLSAlZCIgJSAobmFtZSwgc3RhcnQsIHN0b3ApCisKKyAgICAgICAgY291bnQ9bGVuKGtleXMpLy9sZW4ocmVhZGVycykKKyAgICAgICAgY291bnQyPWNvdW50CisgICAgICAgIGZvciB4IGluIGtleXMgOgorICAgICAgICAgICAga2V5ID0gJyUwNGQnICUgeAorICAgICAgICAgICAgZGJ1dGlscy5EZWFkbG9ja1dyYXAoZC5wdXQsIGtleSwgc2VsZi5tYWtlRGF0YShrZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3JldHJpZXM9MTIpCisKKyAgICAgICAgICAgIGlmIHZlcmJvc2UgYW5kIHggJSAxMDAgPT0gMDoKKyAgICAgICAgICAgICAgICBwcmludCAiJXM6IHJlY29yZHMgJWQgLSAlZCBmaW5pc2hlZCIgJSAobmFtZSwgc3RhcnQsIHgpCisKKyAgICAgICAgICAgIGNvdW50Mi09MQorICAgICAgICAgICAgaWYgbm90IGNvdW50MiA6CisgICAgICAgICAgICAgICAgcmVhZGVycy5wb3AoKS5zdGFydCgpCisgICAgICAgICAgICAgICAgY291bnQyPWNvdW50CisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIlczogdGhyZWFkIGZpbmlzaGVkIiAlIG5hbWUKKworICAgIGRlZiByZWFkZXJUaHJlYWQoc2VsZiwgZCwgcmVhZGVyTnVtKToKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgbmFtZSA9IGN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkKKyAgICAgICAgZWxzZSA6CisgICAgICAgICAgICBuYW1lID0gY3VycmVudFRocmVhZCgpLm5hbWUKKworICAgICAgICBjID0gZC5jdXJzb3IoKQorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgcmVjID0gZGJ1dGlscy5EZWFkbG9ja1dyYXAoYy5maXJzdCwgbWF4X3JldHJpZXM9MTApCisgICAgICAgIHdoaWxlIHJlYzoKKyAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgIGtleSwgZGF0YSA9IHJlYworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1ha2VEYXRhKGtleSksIGRhdGEpCisgICAgICAgICAgICByZWMgPSBkYnV0aWxzLkRlYWRsb2NrV3JhcChjLm5leHQsIG1heF9yZXRyaWVzPTEwKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiVzOiBmb3VuZCAlZCByZWNvcmRzIiAlIChuYW1lLCBjb3VudCkKKyAgICAgICAgYy5jbG9zZSgpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIlczogdGhyZWFkIGZpbmlzaGVkIiAlIG5hbWUKKworCitjbGFzcyBCVHJlZVNpbXBsZVRocmVhZGVkKFNpbXBsZVRocmVhZGVkQmFzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKworCitjbGFzcyBIYXNoU2ltcGxlVGhyZWFkZWQoU2ltcGxlVGhyZWFkZWRCYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9IQVNICisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitjbGFzcyBUaHJlYWRlZFRyYW5zYWN0aW9uc0Jhc2UoQmFzZVRocmVhZGVkVGVzdENhc2UpOgorICAgIGRib3BlbmZsYWdzID0gZGIuREJfVEhSRUFEIHwgZGIuREJfQVVUT19DT01NSVQKKyAgICBlbnZmbGFncyAgICA9IChkYi5EQl9USFJFQUQgfAorICAgICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfTVBPT0wgfAorICAgICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfTE9DSyB8CisgICAgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9MT0cgfAorICAgICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfVFhOCisgICAgICAgICAgICAgICAgICAgKQorICAgIHJlYWRlcnMgPSAwCisgICAgd3JpdGVycyA9IDAKKyAgICByZWNvcmRzID0gMjAwMAorICAgIHR4bkZsYWcgPSAwCisKKyAgICBkZWYgc2V0RW52T3B0cyhzZWxmKToKKyAgICAgICAgI3NlbGYuZW52LnNldF9sa19kZXRlY3QoZGIuREJfTE9DS19ERUZBVUxUKQorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdDAzX1RocmVhZGVkVHJhbnNhY3Rpb25zKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDNfVGhyZWFkZWRUcmFuc2FjdGlvbnMuLi4iICUgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBrZXlzPXJhbmdlKHNlbGYucmVjb3JkcykKKyAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICByYW5kb20uc2h1ZmZsZShrZXlzKQorICAgICAgICByZWNvcmRzX3Blcl93cml0ZXI9c2VsZi5yZWNvcmRzLy9zZWxmLndyaXRlcnMKKyAgICAgICAgcmVhZGVyc19wZXJfd3JpdGVyPXNlbGYucmVhZGVycy8vc2VsZi53cml0ZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWNvcmRzLHNlbGYud3JpdGVycypyZWNvcmRzX3Blcl93cml0ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZWFkZXJzLHNlbGYud3JpdGVycypyZWFkZXJzX3Blcl93cml0ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocmVjb3Jkc19wZXJfd3JpdGVyJXJlYWRlcnNfcGVyX3dyaXRlcik9PTApCisKKyAgICAgICAgcmVhZGVycz1bXQorICAgICAgICBmb3IgeCBpbiB4cmFuZ2Uoc2VsZi5yZWFkZXJzKToKKyAgICAgICAgICAgIHJ0ID0gVGhyZWFkKHRhcmdldCA9IHNlbGYucmVhZGVyVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IChzZWxmLmQsIHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICdyZWFkZXIgJWQnICUgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICkjdmVyYm9zZSA9IHZlcmJvc2UpCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICAgICAgcnQuc2V0RGFlbW9uKFRydWUpCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICBydC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICByZWFkZXJzLmFwcGVuZChydCkKKworICAgICAgICB3cml0ZXJzID0gW10KKyAgICAgICAgZm9yIHggaW4geHJhbmdlKHNlbGYud3JpdGVycyk6CisgICAgICAgICAgICBhPWtleXNbcmVjb3Jkc19wZXJfd3JpdGVyKng6cmVjb3Jkc19wZXJfd3JpdGVyKih4KzEpXQorICAgICAgICAgICAgYj1yZWFkZXJzW3JlYWRlcnNfcGVyX3dyaXRlcip4OnJlYWRlcnNfcGVyX3dyaXRlciooeCsxKV0KKyAgICAgICAgICAgIHd0ID0gVGhyZWFkKHRhcmdldCA9IHNlbGYud3JpdGVyVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IChzZWxmLmQsIGEsIGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICd3cml0ZXIgJWQnICUgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICkjdmVyYm9zZSA9IHZlcmJvc2UpCisgICAgICAgICAgICB3cml0ZXJzLmFwcGVuZCh3dCkKKworICAgICAgICBkdCA9IFRocmVhZCh0YXJnZXQgPSBzZWxmLmRlYWRsb2NrVGhyZWFkKQorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICBkdC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgZWxzZSA6CisgICAgICAgICAgICBkdC5kYWVtb24gPSBUcnVlCisgICAgICAgIGR0LnN0YXJ0KCkKKworICAgICAgICBmb3IgdCBpbiB3cml0ZXJzOgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgICAgIHQuc2V0RGFlbW9uKFRydWUpCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICB0LmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHQuc3RhcnQoKQorCisgICAgICAgIGZvciB0IGluIHdyaXRlcnM6CisgICAgICAgICAgICB0LmpvaW4oKQorICAgICAgICBmb3IgdCBpbiByZWFkZXJzOgorICAgICAgICAgICAgdC5qb2luKCkKKworICAgICAgICBzZWxmLmRvTG9ja0RldGVjdCA9IEZhbHNlCisgICAgICAgIGR0LmpvaW4oKQorCisgICAgZGVmIHdyaXRlclRocmVhZChzZWxmLCBkLCBrZXlzLCByZWFkZXJzKToKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgbmFtZSA9IGN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkKKyAgICAgICAgZWxzZSA6CisgICAgICAgICAgICBuYW1lID0gY3VycmVudFRocmVhZCgpLm5hbWUKKworICAgICAgICBjb3VudD1sZW4oa2V5cykvL2xlbihyZWFkZXJzKQorICAgICAgICB3aGlsZSBsZW4oa2V5cyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKE5vbmUsIHNlbGYudHhuRmxhZykKKyAgICAgICAgICAgICAgICBrZXlzMj1rZXlzWzpjb3VudF0KKyAgICAgICAgICAgICAgICBmb3IgeCBpbiBrZXlzMiA6CisgICAgICAgICAgICAgICAgICAgIGtleSA9ICclMDRkJyAlIHgKKyAgICAgICAgICAgICAgICAgICAgZC5wdXQoa2V5LCBzZWxmLm1ha2VEYXRhKGtleSksIHR4bikKKyAgICAgICAgICAgICAgICAgICAgaWYgdmVyYm9zZSBhbmQgeCAlIDEwMCA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiByZWNvcmRzICVkIC0gJWQgZmluaXNoZWQiICUgKG5hbWUsIHN0YXJ0LCB4KQorICAgICAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgICAgIGtleXM9a2V5c1tjb3VudDpdCisgICAgICAgICAgICAgICAgcmVhZGVycy5wb3AoKS5zdGFydCgpCisgICAgICAgICAgICBleGNlcHQgKGRiLkRCTG9ja0RlYWRsb2NrRXJyb3IsIGRiLkRCTG9ja05vdEdyYW50ZWRFcnJvciksIHZhbDoKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIlczogQWJvcnRpbmcgdHJhbnNhY3Rpb24gKCVzKSIgJSAobmFtZSwgdmFsWzFdKQorICAgICAgICAgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIlczogQWJvcnRpbmcgdHJhbnNhY3Rpb24gKCVzKSIgJSAobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmFyZ3NbMV0pCisgICAgICAgICAgICAgICAgdHhuLmFib3J0KCkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiVzOiB0aHJlYWQgZmluaXNoZWQiICUgbmFtZQorCisgICAgZGVmIHJlYWRlclRocmVhZChzZWxmLCBkLCByZWFkZXJOdW0pOgorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICBuYW1lID0gY3VycmVudFRocmVhZCgpLmdldE5hbWUoKQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50VGhyZWFkKCkubmFtZQorCisgICAgICAgIGZpbmlzaGVkID0gRmFsc2UKKyAgICAgICAgd2hpbGUgbm90IGZpbmlzaGVkOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbihOb25lLCBzZWxmLnR4bkZsYWcpCisgICAgICAgICAgICAgICAgYyA9IGQuY3Vyc29yKHR4bikKKyAgICAgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgICAgICByZWMgPSBjLmZpcnN0KCkKKyAgICAgICAgICAgICAgICB3aGlsZSByZWM6CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICAgICAga2V5LCBkYXRhID0gcmVjCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5tYWtlRGF0YShrZXkpLCBkYXRhKQorICAgICAgICAgICAgICAgICAgICByZWMgPSBjLm5leHQoKQorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICIlczogZm91bmQgJWQgcmVjb3JkcyIgJSAobmFtZSwgY291bnQpCisgICAgICAgICAgICAgICAgYy5jbG9zZSgpCisgICAgICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgICAgICAgICAgZmluaXNoZWQgPSBUcnVlCisgICAgICAgICAgICBleGNlcHQgKGRiLkRCTG9ja0RlYWRsb2NrRXJyb3IsIGRiLkRCTG9ja05vdEdyYW50ZWRFcnJvciksIHZhbDoKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIlczogQWJvcnRpbmcgdHJhbnNhY3Rpb24gKCVzKSIgJSAobmFtZSwgdmFsWzFdKQorICAgICAgICAgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIlczogQWJvcnRpbmcgdHJhbnNhY3Rpb24gKCVzKSIgJSAobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmFyZ3NbMV0pCisgICAgICAgICAgICAgICAgYy5jbG9zZSgpCisgICAgICAgICAgICAgICAgdHhuLmFib3J0KCkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiVzOiB0aHJlYWQgZmluaXNoZWQiICUgbmFtZQorCisgICAgZGVmIGRlYWRsb2NrVGhyZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmRvTG9ja0RldGVjdCA9IFRydWUKKyAgICAgICAgd2hpbGUgc2VsZi5kb0xvY2tEZXRlY3Q6CisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYWJvcnRlZCA9IHNlbGYuZW52LmxvY2tfZGV0ZWN0KAorICAgICAgICAgICAgICAgICAgICBkYi5EQl9MT0NLX1JBTkRPTSwgZGIuREJfTE9DS19DT05GTElDVCkKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlIGFuZCBhYm9ydGVkOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiZGVhZGxvY2s6IEFib3J0ZWQgJWQgZGVhZGxvY2tlZCB0cmFuc2FjdGlvbihzKSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAlIGFib3J0ZWQKKyAgICAgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworCitjbGFzcyBCVHJlZVRocmVhZGVkVHJhbnNhY3Rpb25zKFRocmVhZGVkVHJhbnNhY3Rpb25zQmFzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKyAgICB3cml0ZXJzID0gMgorICAgIHJlYWRlcnMgPSAxMAorICAgIHJlY29yZHMgPSAxMDAwCisKK2NsYXNzIEhhc2hUaHJlYWRlZFRyYW5zYWN0aW9ucyhUaHJlYWRlZFRyYW5zYWN0aW9uc0Jhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKKyAgICB3cml0ZXJzID0gMgorICAgIHJlYWRlcnMgPSAxMAorICAgIHJlY29yZHMgPSAxMDAwCisKK2NsYXNzIEJUcmVlVGhyZWFkZWROb1dhaXRUcmFuc2FjdGlvbnMoVGhyZWFkZWRUcmFuc2FjdGlvbnNCYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorICAgIHdyaXRlcnMgPSAyCisgICAgcmVhZGVycyA9IDEwCisgICAgcmVjb3JkcyA9IDEwMDAKKyAgICB0eG5GbGFnID0gZGIuREJfVFhOX05PV0FJVAorCitjbGFzcyBIYXNoVGhyZWFkZWROb1dhaXRUcmFuc2FjdGlvbnMoVGhyZWFkZWRUcmFuc2FjdGlvbnNCYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9IQVNICisgICAgd3JpdGVycyA9IDIKKyAgICByZWFkZXJzID0gMTAKKyAgICByZWNvcmRzID0gMTAwMAorICAgIHR4bkZsYWcgPSBkYi5EQl9UWE5fTk9XQUlUCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisKKyAgICBpZiBoYXZlX3RocmVhZHM6CisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJUcmVlQ29uY3VycmVudERhdGFTdG9yZSkpCisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEhhc2hDb25jdXJyZW50RGF0YVN0b3JlKSkKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQlRyZWVTaW1wbGVUaHJlYWRlZCkpCisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEhhc2hTaW1wbGVUaHJlYWRlZCkpCisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJUcmVlVGhyZWFkZWRUcmFuc2FjdGlvbnMpKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShIYXNoVGhyZWFkZWRUcmFuc2FjdGlvbnMpKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShCVHJlZVRocmVhZGVkTm9XYWl0VHJhbnNhY3Rpb25zKSkKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoSGFzaFRocmVhZGVkTm9XYWl0VHJhbnNhY3Rpb25zKSkKKworICAgIGVsc2U6CisgICAgICAgIHByaW50ICJUaHJlYWRzIG5vdCBhdmFpbGFibGUsIHNraXBwaW5nIHRocmVhZCB0ZXN0cy4iCisKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3RocmVhZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcyZTMzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3RocmVhZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3RocmVhZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcyZTMzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3RocmVhZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jUHJvZmlsZS5weSBiL2xpYi9weXRob24yLjcvY1Byb2ZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjJlZmQwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY1Byb2ZpbGUucHkKQEAgLTAsMCArMSwxOTkgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiUHl0aG9uIGludGVyZmFjZSBmb3IgdGhlICdsc3Byb2YnIHByb2ZpbGVyLgorICAgQ29tcGF0aWJsZSB3aXRoIHRoZSAncHJvZmlsZScgbW9kdWxlLgorIiIiCisKK19fYWxsX18gPSBbInJ1biIsICJydW5jdHgiLCAiaGVscCIsICJQcm9maWxlIl0KKworaW1wb3J0IF9sc3Byb2YKKworIyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKyMgU2ltcGxlIGludGVyZmFjZQorCitkZWYgcnVuKHN0YXRlbWVudCwgZmlsZW5hbWU9Tm9uZSwgc29ydD0tMSk6CisgICAgIiIiUnVuIHN0YXRlbWVudCB1bmRlciBwcm9maWxlciBvcHRpb25hbGx5IHNhdmluZyByZXN1bHRzIGluIGZpbGVuYW1lCisKKyAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0aGUKKyAgICAiZXhlYyIgc3RhdGVtZW50LCBhbmQgYW4gb3B0aW9uYWwgZmlsZSBuYW1lLiAgSW4gYWxsIGNhc2VzIHRoaXMKKyAgICByb3V0aW5lIGF0dGVtcHRzIHRvICJleGVjIiBpdHMgZmlyc3QgYXJndW1lbnQgYW5kIGdhdGhlciBwcm9maWxpbmcKKyAgICBzdGF0aXN0aWNzIGZyb20gdGhlIGV4ZWN1dGlvbi4gSWYgbm8gZmlsZSBuYW1lIGlzIHByZXNlbnQsIHRoZW4gdGhpcworICAgIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgcHJpbnRzIGEgc2ltcGxlIHByb2ZpbGluZyByZXBvcnQsIHNvcnRlZCBieSB0aGUKKyAgICBzdGFuZGFyZCBuYW1lIHN0cmluZyAoZmlsZS9saW5lL2Z1bmN0aW9uLW5hbWUpIHRoYXQgaXMgcHJlc2VudGVkIGluCisgICAgZWFjaCBsaW5lLgorICAgICIiIgorICAgIHByb2YgPSBQcm9maWxlKCkKKyAgICByZXN1bHQgPSBOb25lCisgICAgdHJ5OgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm9mID0gcHJvZi5ydW4oc3RhdGVtZW50KQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBmaWxlbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByb2YuZHVtcF9zdGF0cyhmaWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHByb2YucHJpbnRfc3RhdHMoc29ydCkKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBydW5jdHgoc3RhdGVtZW50LCBnbG9iYWxzLCBsb2NhbHMsIGZpbGVuYW1lPU5vbmUsIHNvcnQ9LTEpOgorICAgICIiIlJ1biBzdGF0ZW1lbnQgdW5kZXIgcHJvZmlsZXIsIHN1cHBseWluZyB5b3VyIG93biBnbG9iYWxzIGFuZCBsb2NhbHMsCisgICAgb3B0aW9uYWxseSBzYXZpbmcgcmVzdWx0cyBpbiBmaWxlbmFtZS4KKworICAgIHN0YXRlbWVudCBhbmQgZmlsZW5hbWUgaGF2ZSB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgcHJvZmlsZS5ydW4KKyAgICAiIiIKKyAgICBwcm9mID0gUHJvZmlsZSgpCisgICAgcmVzdWx0ID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJvZiA9IHByb2YucnVuY3R4KHN0YXRlbWVudCwgZ2xvYmFscywgbG9jYWxzKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBmaWxlbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByb2YuZHVtcF9zdGF0cyhmaWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHByb2YucHJpbnRfc3RhdHMoc29ydCkKKyAgICByZXR1cm4gcmVzdWx0CisKKyMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCitkZWYgaGVscCgpOgorICAgIHByaW50ICJEb2N1bWVudGF0aW9uIGZvciB0aGUgcHJvZmlsZS9jUHJvZmlsZSBtb2R1bGVzIGNhbiBiZSBmb3VuZCAiCisgICAgcHJpbnQgImluIHRoZSBQeXRob24gTGlicmFyeSBSZWZlcmVuY2UsIHNlY3Rpb24gJ1RoZSBQeXRob24gUHJvZmlsZXInLiIKKworIyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworY2xhc3MgUHJvZmlsZShfbHNwcm9mLlByb2ZpbGVyKToKKyAgICAiIiJQcm9maWxlKGN1c3RvbV90aW1lcj1Ob25lLCB0aW1lX3VuaXQ9Tm9uZSwgc3ViY2FsbHM9VHJ1ZSwgYnVpbHRpbnM9VHJ1ZSkKKworICAgIEJ1aWxkcyBhIHByb2ZpbGVyIG9iamVjdCB1c2luZyB0aGUgc3BlY2lmaWVkIHRpbWVyIGZ1bmN0aW9uLgorICAgIFRoZSBkZWZhdWx0IHRpbWVyIGlzIGEgZmFzdCBidWlsdC1pbiBvbmUgYmFzZWQgb24gcmVhbCB0aW1lLgorICAgIEZvciBjdXN0b20gdGltZXIgZnVuY3Rpb25zIHJldHVybmluZyBpbnRlZ2VycywgdGltZV91bml0IGNhbgorICAgIGJlIGEgZmxvYXQgc3BlY2lmeWluZyBhIHNjYWxlIChpLmUuIGhvdyBsb25nIGVhY2ggaW50ZWdlciB1bml0CisgICAgaXMsIGluIHNlY29uZHMpLgorICAgICIiIgorCisgICAgIyBNb3N0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IGlzIGluIHRoZSBiYXNlIGNsYXNzLgorICAgICMgVGhpcyBzdWJjbGFzcyBvbmx5IGFkZHMgY29udmVuaWVudCBhbmQgYmFja3dhcmQtY29tcGF0aWJsZSBtZXRob2RzLgorCisgICAgZGVmIHByaW50X3N0YXRzKHNlbGYsIHNvcnQ9LTEpOgorICAgICAgICBpbXBvcnQgcHN0YXRzCisgICAgICAgIHBzdGF0cy5TdGF0cyhzZWxmKS5zdHJpcF9kaXJzKCkuc29ydF9zdGF0cyhzb3J0KS5wcmludF9zdGF0cygpCisKKyAgICBkZWYgZHVtcF9zdGF0cyhzZWxmLCBmaWxlKToKKyAgICAgICAgaW1wb3J0IG1hcnNoYWwKKyAgICAgICAgZiA9IG9wZW4oZmlsZSwgJ3diJykKKyAgICAgICAgc2VsZi5jcmVhdGVfc3RhdHMoKQorICAgICAgICBtYXJzaGFsLmR1bXAoc2VsZi5zdGF0cywgZikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgY3JlYXRlX3N0YXRzKHNlbGYpOgorICAgICAgICBzZWxmLmRpc2FibGUoKQorICAgICAgICBzZWxmLnNuYXBzaG90X3N0YXRzKCkKKworICAgIGRlZiBzbmFwc2hvdF9zdGF0cyhzZWxmKToKKyAgICAgICAgZW50cmllcyA9IHNlbGYuZ2V0c3RhdHMoKQorICAgICAgICBzZWxmLnN0YXRzID0ge30KKyAgICAgICAgY2FsbGVyc2RpY3RzID0ge30KKyAgICAgICAgIyBjYWxsIGluZm9ybWF0aW9uCisgICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzOgorICAgICAgICAgICAgZnVuYyA9IGxhYmVsKGVudHJ5LmNvZGUpCisgICAgICAgICAgICBuYyA9IGVudHJ5LmNhbGxjb3VudCAgICAgICAgICMgbmNhbGxzIGNvbHVtbiBvZiBwc3RhdHMgKGJlZm9yZSAnLycpCisgICAgICAgICAgICBjYyA9IG5jIC0gZW50cnkucmVjY2FsbGNvdW50ICMgbmNhbGxzIGNvbHVtbiBvZiBwc3RhdHMgKGFmdGVyICcvJykKKyAgICAgICAgICAgIHR0ID0gZW50cnkuaW5saW5ldGltZSAgICAgICAgIyB0b3R0aW1lIGNvbHVtbiBvZiBwc3RhdHMKKyAgICAgICAgICAgIGN0ID0gZW50cnkudG90YWx0aW1lICAgICAgICAgIyBjdW10aW1lIGNvbHVtbiBvZiBwc3RhdHMKKyAgICAgICAgICAgIGNhbGxlcnMgPSB7fQorICAgICAgICAgICAgY2FsbGVyc2RpY3RzW2lkKGVudHJ5LmNvZGUpXSA9IGNhbGxlcnMKKyAgICAgICAgICAgIHNlbGYuc3RhdHNbZnVuY10gPSBjYywgbmMsIHR0LCBjdCwgY2FsbGVycworICAgICAgICAjIHN1YmNhbGwgaW5mb3JtYXRpb24KKyAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CisgICAgICAgICAgICBpZiBlbnRyeS5jYWxsczoKKyAgICAgICAgICAgICAgICBmdW5jID0gbGFiZWwoZW50cnkuY29kZSkKKyAgICAgICAgICAgICAgICBmb3Igc3ViZW50cnkgaW4gZW50cnkuY2FsbHM6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnMgPSBjYWxsZXJzZGljdHNbaWQoc3ViZW50cnkuY29kZSldCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIG5jID0gc3ViZW50cnkuY2FsbGNvdW50CisgICAgICAgICAgICAgICAgICAgIGNjID0gbmMgLSBzdWJlbnRyeS5yZWNjYWxsY291bnQKKyAgICAgICAgICAgICAgICAgICAgdHQgPSBzdWJlbnRyeS5pbmxpbmV0aW1lCisgICAgICAgICAgICAgICAgICAgIGN0ID0gc3ViZW50cnkudG90YWx0aW1lCisgICAgICAgICAgICAgICAgICAgIGlmIGZ1bmMgaW4gY2FsbGVyczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPSBjYWxsZXJzW2Z1bmNdCisgICAgICAgICAgICAgICAgICAgICAgICBuYyArPSBwcmV2WzBdCisgICAgICAgICAgICAgICAgICAgICAgICBjYyArPSBwcmV2WzFdCisgICAgICAgICAgICAgICAgICAgICAgICB0dCArPSBwcmV2WzJdCisgICAgICAgICAgICAgICAgICAgICAgICBjdCArPSBwcmV2WzNdCisgICAgICAgICAgICAgICAgICAgIGNhbGxlcnNbZnVuY10gPSBuYywgY2MsIHR0LCBjdAorCisgICAgIyBUaGUgZm9sbG93aW5nIHR3byBtZXRob2RzIGNhbiBiZSBjYWxsZWQgYnkgY2xpZW50cyB0byB1c2UKKyAgICAjIGEgcHJvZmlsZXIgdG8gcHJvZmlsZSBhIHN0YXRlbWVudCwgZ2l2ZW4gYXMgYSBzdHJpbmcuCisKKyAgICBkZWYgcnVuKHNlbGYsIGNtZCk6CisgICAgICAgIGltcG9ydCBfX21haW5fXworICAgICAgICBkaWN0ID0gX19tYWluX18uX19kaWN0X18KKyAgICAgICAgcmV0dXJuIHNlbGYucnVuY3R4KGNtZCwgZGljdCwgZGljdCkKKworICAgIGRlZiBydW5jdHgoc2VsZiwgY21kLCBnbG9iYWxzLCBsb2NhbHMpOgorICAgICAgICBzZWxmLmVuYWJsZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgY21kIGluIGdsb2JhbHMsIGxvY2FscworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5kaXNhYmxlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICMgVGhpcyBtZXRob2QgaXMgbW9yZSB1c2VmdWwgdG8gcHJvZmlsZSBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsLgorICAgIGRlZiBydW5jYWxsKHNlbGYsIGZ1bmMsICphcmdzLCAqKmt3KToKKyAgICAgICAgc2VsZi5lbmFibGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprdykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuZGlzYWJsZSgpCisKKyMgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKK2RlZiBsYWJlbChjb2RlKToKKyAgICBpZiBpc2luc3RhbmNlKGNvZGUsIHN0cik6CisgICAgICAgIHJldHVybiAoJ34nLCAwLCBjb2RlKSAgICAjIGJ1aWx0LWluIGZ1bmN0aW9ucyAoJ34nIHNvcnRzIGF0IHRoZSBlbmQpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIChjb2RlLmNvX2ZpbGVuYW1lLCBjb2RlLmNvX2ZpcnN0bGluZW5vLCBjb2RlLmNvX25hbWUpCisKKyMgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKK2RlZiBtYWluKCk6CisgICAgaW1wb3J0IG9zLCBzeXMKKyAgICBmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKKyAgICB1c2FnZSA9ICJjUHJvZmlsZS5weSBbLW8gb3V0cHV0X2ZpbGVfcGF0aF0gWy1zIHNvcnRdIHNjcmlwdGZpbGUgW2FyZ10gLi4uIgorICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT11c2FnZSkKKyAgICBwYXJzZXIuYWxsb3dfaW50ZXJzcGVyc2VkX2FyZ3MgPSBGYWxzZQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctbycsICctLW91dGZpbGUnLCBkZXN0PSJvdXRmaWxlIiwKKyAgICAgICAgaGVscD0iU2F2ZSBzdGF0cyB0byA8b3V0ZmlsZT4iLCBkZWZhdWx0PU5vbmUpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1zJywgJy0tc29ydCcsIGRlc3Q9InNvcnQiLAorICAgICAgICBoZWxwPSJTb3J0IG9yZGVyIHdoZW4gcHJpbnRpbmcgdG8gc3Rkb3V0LCBiYXNlZCBvbiBwc3RhdHMuU3RhdHMgY2xhc3MiLAorICAgICAgICBkZWZhdWx0PS0xKQorCisgICAgaWYgbm90IHN5cy5hcmd2WzE6XToKKyAgICAgICAgcGFyc2VyLnByaW50X3VzYWdlKCkKKyAgICAgICAgc3lzLmV4aXQoMikKKworICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgICBzeXMuYXJndls6XSA9IGFyZ3MKKworICAgIGlmIGxlbihhcmdzKSA+IDA6CisgICAgICAgIHByb2duYW1lID0gYXJnc1swXQorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5kaXJuYW1lKHByb2duYW1lKSkKKyAgICAgICAgd2l0aCBvcGVuKHByb2duYW1lLCAncmInKSBhcyBmcDoKKyAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGZwLnJlYWQoKSwgcHJvZ25hbWUsICdleGVjJykKKyAgICAgICAgZ2xvYnMgPSB7CisgICAgICAgICAgICAnX19maWxlX18nOiBwcm9nbmFtZSwKKyAgICAgICAgICAgICdfX25hbWVfXyc6ICdfX21haW5fXycsCisgICAgICAgICAgICAnX19wYWNrYWdlX18nOiBOb25lLAorICAgICAgICB9CisgICAgICAgIHJ1bmN0eChjb2RlLCBnbG9icywgTm9uZSwgb3B0aW9ucy5vdXRmaWxlLCBvcHRpb25zLnNvcnQpCisgICAgZWxzZToKKyAgICAgICAgcGFyc2VyLnByaW50X3VzYWdlKCkKKyAgICByZXR1cm4gcGFyc2VyCisKKyMgV2hlbiBpbnZva2VkIGFzIG1haW4gcHJvZ3JhbSwgaW52b2tlIHRoZSBwcm9maWxlciBvbiBhIHNjcmlwdAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY1Byb2ZpbGUucHljIGIvbGliL3B5dGhvbjIuNy9jUHJvZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjODliNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY1Byb2ZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY1Byb2ZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy9jUHJvZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjODliNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY1Byb2ZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY2FsZW5kYXIucHkgYi9saWIvcHl0aG9uMi43L2NhbGVuZGFyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MWIyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NhbGVuZGFyLnB5CkBAIC0wLDAgKzEsNzEzIEBACisiIiJDYWxlbmRhciBwcmludGluZyBmdW5jdGlvbnMKKworTm90ZSB3aGVuIGNvbXBhcmluZyB0aGVzZSBjYWxlbmRhcnMgdG8gdGhlIG9uZXMgcHJpbnRlZCBieSBjYWwoMSk6IEJ5CitkZWZhdWx0LCB0aGVzZSBjYWxlbmRhcnMgaGF2ZSBNb25kYXkgYXMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlaywgYW5kCitTdW5kYXkgYXMgdGhlIGxhc3QgKHRoZSBFdXJvcGVhbiBjb252ZW50aW9uKS4gVXNlIHNldGZpcnN0d2Vla2RheSgpIHRvCitzZXQgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMD1Nb25kYXksIDY9U3VuZGF5KS4iIiIKKworaW1wb3J0IHN5cworaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgbG9jYWxlIGFzIF9sb2NhbGUKKworX19hbGxfXyA9IFsiSWxsZWdhbE1vbnRoRXJyb3IiLCAiSWxsZWdhbFdlZWtkYXlFcnJvciIsICJzZXRmaXJzdHdlZWtkYXkiLAorICAgICAgICAgICAiZmlyc3R3ZWVrZGF5IiwgImlzbGVhcCIsICJsZWFwZGF5cyIsICJ3ZWVrZGF5IiwgIm1vbnRocmFuZ2UiLAorICAgICAgICAgICAibW9udGhjYWxlbmRhciIsICJwcm1vbnRoIiwgIm1vbnRoIiwgInByY2FsIiwgImNhbGVuZGFyIiwKKyAgICAgICAgICAgInRpbWVnbSIsICJtb250aF9uYW1lIiwgIm1vbnRoX2FiYnIiLCAiZGF5X25hbWUiLCAiZGF5X2FiYnIiXQorCisjIEV4Y2VwdGlvbiByYWlzZWQgZm9yIGJhZCBpbnB1dCAod2l0aCBzdHJpbmcgcGFyYW1ldGVyIGZvciBkZXRhaWxzKQorZXJyb3IgPSBWYWx1ZUVycm9yCisKKyMgRXhjZXB0aW9ucyByYWlzZWQgZm9yIGJhZCBpbnB1dAorY2xhc3MgSWxsZWdhbE1vbnRoRXJyb3IoVmFsdWVFcnJvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vbnRoKToKKyAgICAgICAgc2VsZi5tb250aCA9IG1vbnRoCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiYmFkIG1vbnRoIG51bWJlciAlcjsgbXVzdCBiZSAxLTEyIiAlIHNlbGYubW9udGgKKworCitjbGFzcyBJbGxlZ2FsV2Vla2RheUVycm9yKFZhbHVlRXJyb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3ZWVrZGF5KToKKyAgICAgICAgc2VsZi53ZWVrZGF5ID0gd2Vla2RheQorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gImJhZCB3ZWVrZGF5IG51bWJlciAlcjsgbXVzdCBiZSAwIChNb25kYXkpIHRvIDYgKFN1bmRheSkiICUgc2VsZi53ZWVrZGF5CisKKworIyBDb25zdGFudHMgZm9yIG1vbnRocyByZWZlcmVuY2VkIGxhdGVyCitKYW51YXJ5ID0gMQorRmVicnVhcnkgPSAyCisKKyMgTnVtYmVyIG9mIGRheXMgcGVyIG1vbnRoIChleGNlcHQgZm9yIEZlYnJ1YXJ5IGluIGxlYXAgeWVhcnMpCittZGF5cyA9IFswLCAzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXQorCisjIFRoaXMgbW9kdWxlIHVzZWQgdG8gaGF2ZSBoYXJkLWNvZGVkIGxpc3RzIG9mIGRheSBhbmQgbW9udGggbmFtZXMsIGFzCisjIEVuZ2xpc2ggc3RyaW5ncy4gIFRoZSBjbGFzc2VzIGZvbGxvd2luZyBlbXVsYXRlIGEgcmVhZC1vbmx5IHZlcnNpb24gb2YKKyMgdGhhdCwgYnV0IHN1cHBseSBsb2NhbGl6ZWQgbmFtZXMuICBOb3RlIHRoYXQgdGhlIHZhbHVlcyBhcmUgY29tcHV0ZWQKKyMgZnJlc2ggb24gZWFjaCBjYWxsLCBpbiBjYXNlIHRoZSB1c2VyIGNoYW5nZXMgbG9jYWxlIGJldHdlZW4gY2FsbHMuCisKK2NsYXNzIF9sb2NhbGl6ZWRfbW9udGg6CisKKyAgICBfbW9udGhzID0gW2RhdGV0aW1lLmRhdGUoMjAwMSwgaSsxLCAxKS5zdHJmdGltZSBmb3IgaSBpbiByYW5nZSgxMildCisgICAgX21vbnRocy5pbnNlcnQoMCwgbGFtYmRhIHg6ICIiKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvcm1hdCk6CisgICAgICAgIHNlbGYuZm9ybWF0ID0gZm9ybWF0CisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgIGZ1bmNzID0gc2VsZi5fbW9udGhzW2ldCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaSwgc2xpY2UpOgorICAgICAgICAgICAgcmV0dXJuIFtmKHNlbGYuZm9ybWF0KSBmb3IgZiBpbiBmdW5jc10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBmdW5jcyhzZWxmLmZvcm1hdCkKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gMTMKKworCitjbGFzcyBfbG9jYWxpemVkX2RheToKKworICAgICMgSmFudWFyeSAxLCAyMDAxLCB3YXMgYSBNb25kYXkuCisgICAgX2RheXMgPSBbZGF0ZXRpbWUuZGF0ZSgyMDAxLCAxLCBpKzEpLnN0cmZ0aW1lIGZvciBpIGluIHJhbmdlKDcpXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvcm1hdCk6CisgICAgICAgIHNlbGYuZm9ybWF0ID0gZm9ybWF0CisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgIGZ1bmNzID0gc2VsZi5fZGF5c1tpXQorICAgICAgICBpZiBpc2luc3RhbmNlKGksIHNsaWNlKToKKyAgICAgICAgICAgIHJldHVybiBbZihzZWxmLmZvcm1hdCkgZm9yIGYgaW4gZnVuY3NdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZnVuY3Moc2VsZi5mb3JtYXQpCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDcKKworCisjIEZ1bGwgYW5kIGFiYnJldmlhdGVkIG5hbWVzIG9mIHdlZWtkYXlzCitkYXlfbmFtZSA9IF9sb2NhbGl6ZWRfZGF5KCclQScpCitkYXlfYWJiciA9IF9sb2NhbGl6ZWRfZGF5KCclYScpCisKKyMgRnVsbCBhbmQgYWJicmV2aWF0ZWQgbmFtZXMgb2YgbW9udGhzICgxLWJhc2VkIGFycmF5cyEhISkKK21vbnRoX25hbWUgPSBfbG9jYWxpemVkX21vbnRoKCclQicpCittb250aF9hYmJyID0gX2xvY2FsaXplZF9tb250aCgnJWInKQorCisjIENvbnN0YW50cyBmb3Igd2Vla2RheXMKKyhNT05EQVksIFRVRVNEQVksIFdFRE5FU0RBWSwgVEhVUlNEQVksIEZSSURBWSwgU0FUVVJEQVksIFNVTkRBWSkgPSByYW5nZSg3KQorCisKK2RlZiBpc2xlYXAoeWVhcik6CisgICAgIiIiUmV0dXJuIFRydWUgZm9yIGxlYXAgeWVhcnMsIEZhbHNlIGZvciBub24tbGVhcCB5ZWFycy4iIiIKKyAgICByZXR1cm4geWVhciAlIDQgPT0gMCBhbmQgKHllYXIgJSAxMDAgIT0gMCBvciB5ZWFyICUgNDAwID09IDApCisKKworZGVmIGxlYXBkYXlzKHkxLCB5Mik6CisgICAgIiIiUmV0dXJuIG51bWJlciBvZiBsZWFwIHllYXJzIGluIHJhbmdlIFt5MSwgeTIpLgorICAgICAgIEFzc3VtZSB5MSA8PSB5Mi4iIiIKKyAgICB5MSAtPSAxCisgICAgeTIgLT0gMQorICAgIHJldHVybiAoeTIvLzQgLSB5MS8vNCkgLSAoeTIvLzEwMCAtIHkxLy8xMDApICsgKHkyLy80MDAgLSB5MS8vNDAwKQorCisKK2RlZiB3ZWVrZGF5KHllYXIsIG1vbnRoLCBkYXkpOgorICAgICIiIlJldHVybiB3ZWVrZGF5ICgwLTYgfiBNb24tU3VuKSBmb3IgeWVhciAoMTk3MC0uLi4pLCBtb250aCAoMS0xMiksCisgICAgICAgZGF5ICgxLTMxKS4iIiIKKyAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZSh5ZWFyLCBtb250aCwgZGF5KS53ZWVrZGF5KCkKKworCitkZWYgbW9udGhyYW5nZSh5ZWFyLCBtb250aCk6CisgICAgIiIiUmV0dXJuIHdlZWtkYXkgKDAtNiB+IE1vbi1TdW4pIGFuZCBudW1iZXIgb2YgZGF5cyAoMjgtMzEpIGZvcgorICAgICAgIHllYXIsIG1vbnRoLiIiIgorICAgIGlmIG5vdCAxIDw9IG1vbnRoIDw9IDEyOgorICAgICAgICByYWlzZSBJbGxlZ2FsTW9udGhFcnJvcihtb250aCkKKyAgICBkYXkxID0gd2Vla2RheSh5ZWFyLCBtb250aCwgMSkKKyAgICBuZGF5cyA9IG1kYXlzW21vbnRoXSArIChtb250aCA9PSBGZWJydWFyeSBhbmQgaXNsZWFwKHllYXIpKQorICAgIHJldHVybiBkYXkxLCBuZGF5cworCisKK2NsYXNzIENhbGVuZGFyKG9iamVjdCk6CisgICAgIiIiCisgICAgQmFzZSBjYWxlbmRhciBjbGFzcy4gVGhpcyBjbGFzcyBkb2Vzbid0IGRvIGFueSBmb3JtYXR0aW5nLiBJdCBzaW1wbHkKKyAgICBwcm92aWRlcyBkYXRhIHRvIHN1YmNsYXNzZXMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlyc3R3ZWVrZGF5PTApOgorICAgICAgICBzZWxmLmZpcnN0d2Vla2RheSA9IGZpcnN0d2Vla2RheSAjIDAgPSBNb25kYXksIDYgPSBTdW5kYXkKKworICAgIGRlZiBnZXRmaXJzdHdlZWtkYXkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maXJzdHdlZWtkYXkgJSA3CisKKyAgICBkZWYgc2V0Zmlyc3R3ZWVrZGF5KHNlbGYsIGZpcnN0d2Vla2RheSk6CisgICAgICAgIHNlbGYuX2ZpcnN0d2Vla2RheSA9IGZpcnN0d2Vla2RheQorCisgICAgZmlyc3R3ZWVrZGF5ID0gcHJvcGVydHkoZ2V0Zmlyc3R3ZWVrZGF5LCBzZXRmaXJzdHdlZWtkYXkpCisKKyAgICBkZWYgaXRlcndlZWtkYXlzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgaXRlcmF0b3IgZm9yIG9uZSB3ZWVrIG9mIHdlZWtkYXkgbnVtYmVycyBzdGFydGluZyB3aXRoIHRoZQorICAgICAgICBjb25maWd1cmVkIGZpcnN0IG9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuZmlyc3R3ZWVrZGF5LCBzZWxmLmZpcnN0d2Vla2RheSArIDcpOgorICAgICAgICAgICAgeWllbGQgaSU3CisKKyAgICBkZWYgaXRlcm1vbnRoZGF0ZXMoc2VsZiwgeWVhciwgbW9udGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIGZvciBvbmUgbW9udGguIFRoZSBpdGVyYXRvciB3aWxsIHlpZWxkIGRhdGV0aW1lLmRhdGUKKyAgICAgICAgdmFsdWVzIGFuZCB3aWxsIGFsd2F5cyBpdGVyYXRlIHRocm91Z2ggY29tcGxldGUgd2Vla3MsIHNvIGl0IHdpbGwgeWllbGQKKyAgICAgICAgZGF0ZXMgb3V0c2lkZSB0aGUgc3BlY2lmaWVkIG1vbnRoLgorICAgICAgICAiIiIKKyAgICAgICAgZGF0ZSA9IGRhdGV0aW1lLmRhdGUoeWVhciwgbW9udGgsIDEpCisgICAgICAgICMgR28gYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3ZWVrCisgICAgICAgIGRheXMgPSAoZGF0ZS53ZWVrZGF5KCkgLSBzZWxmLmZpcnN0d2Vla2RheSkgJSA3CisgICAgICAgIGRhdGUgLT0gZGF0ZXRpbWUudGltZWRlbHRhKGRheXM9ZGF5cykKKyAgICAgICAgb25lZGF5ID0gZGF0ZXRpbWUudGltZWRlbHRhKGRheXM9MSkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHlpZWxkIGRhdGUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkYXRlICs9IG9uZWRheQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgIyBBZGRpbmcgb25lIGRheSBjb3VsZCBmYWlsIGFmdGVyIGRhdGV0aW1lLk1BWFlFQVIKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgZGF0ZS5tb250aCAhPSBtb250aCBhbmQgZGF0ZS53ZWVrZGF5KCkgPT0gc2VsZi5maXJzdHdlZWtkYXk6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiBpdGVybW9udGhkYXlzMihzZWxmLCB5ZWFyLCBtb250aCk6CisgICAgICAgICIiIgorICAgICAgICBMaWtlIGl0ZXJtb250aGRhdGVzKCksIGJ1dCB3aWxsIHlpZWxkIChkYXkgbnVtYmVyLCB3ZWVrZGF5IG51bWJlcikKKyAgICAgICAgdHVwbGVzLiBGb3IgZGF5cyBvdXRzaWRlIHRoZSBzcGVjaWZpZWQgbW9udGggdGhlIGRheSBudW1iZXIgaXMgMC4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBkYXRlIGluIHNlbGYuaXRlcm1vbnRoZGF0ZXMoeWVhciwgbW9udGgpOgorICAgICAgICAgICAgaWYgZGF0ZS5tb250aCAhPSBtb250aDoKKyAgICAgICAgICAgICAgICB5aWVsZCAoMCwgZGF0ZS53ZWVrZGF5KCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIChkYXRlLmRheSwgZGF0ZS53ZWVrZGF5KCkpCisKKyAgICBkZWYgaXRlcm1vbnRoZGF5cyhzZWxmLCB5ZWFyLCBtb250aCk6CisgICAgICAgICIiIgorICAgICAgICBMaWtlIGl0ZXJtb250aGRhdGVzKCksIGJ1dCB3aWxsIHlpZWxkIGRheSBudW1iZXJzLiBGb3IgZGF5cyBvdXRzaWRlCisgICAgICAgIHRoZSBzcGVjaWZpZWQgbW9udGggdGhlIGRheSBudW1iZXIgaXMgMC4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBkYXRlIGluIHNlbGYuaXRlcm1vbnRoZGF0ZXMoeWVhciwgbW9udGgpOgorICAgICAgICAgICAgaWYgZGF0ZS5tb250aCAhPSBtb250aDoKKyAgICAgICAgICAgICAgICB5aWVsZCAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIGRhdGUuZGF5CisKKyAgICBkZWYgbW9udGhkYXRlc2NhbGVuZGFyKHNlbGYsIHllYXIsIG1vbnRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIG1hdHJpeCAobGlzdCBvZiBsaXN0cykgcmVwcmVzZW50aW5nIGEgbW9udGgncyBjYWxlbmRhci4KKyAgICAgICAgRWFjaCByb3cgcmVwcmVzZW50cyBhIHdlZWs7IHdlZWsgZW50cmllcyBhcmUgZGF0ZXRpbWUuZGF0ZSB2YWx1ZXMuCisgICAgICAgICIiIgorICAgICAgICBkYXRlcyA9IGxpc3Qoc2VsZi5pdGVybW9udGhkYXRlcyh5ZWFyLCBtb250aCkpCisgICAgICAgIHJldHVybiBbIGRhdGVzW2k6aSs3XSBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZGF0ZXMpLCA3KSBdCisKKyAgICBkZWYgbW9udGhkYXlzMmNhbGVuZGFyKHNlbGYsIHllYXIsIG1vbnRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIG1hdHJpeCByZXByZXNlbnRpbmcgYSBtb250aCdzIGNhbGVuZGFyLgorICAgICAgICBFYWNoIHJvdyByZXByZXNlbnRzIGEgd2Vlazsgd2VlayBlbnRyaWVzIGFyZQorICAgICAgICAoZGF5IG51bWJlciwgd2Vla2RheSBudW1iZXIpIHR1cGxlcy4gRGF5IG51bWJlcnMgb3V0c2lkZSB0aGlzIG1vbnRoCisgICAgICAgIGFyZSB6ZXJvLgorICAgICAgICAiIiIKKyAgICAgICAgZGF5cyA9IGxpc3Qoc2VsZi5pdGVybW9udGhkYXlzMih5ZWFyLCBtb250aCkpCisgICAgICAgIHJldHVybiBbIGRheXNbaTppKzddIGZvciBpIGluIHJhbmdlKDAsIGxlbihkYXlzKSwgNykgXQorCisgICAgZGVmIG1vbnRoZGF5c2NhbGVuZGFyKHNlbGYsIHllYXIsIG1vbnRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIG1hdHJpeCByZXByZXNlbnRpbmcgYSBtb250aCdzIGNhbGVuZGFyLgorICAgICAgICBFYWNoIHJvdyByZXByZXNlbnRzIGEgd2VlazsgZGF5cyBvdXRzaWRlIHRoaXMgbW9udGggYXJlIHplcm8uCisgICAgICAgICIiIgorICAgICAgICBkYXlzID0gbGlzdChzZWxmLml0ZXJtb250aGRheXMoeWVhciwgbW9udGgpKQorICAgICAgICByZXR1cm4gWyBkYXlzW2k6aSs3XSBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZGF5cyksIDcpIF0KKworICAgIGRlZiB5ZWFyZGF0ZXNjYWxlbmRhcihzZWxmLCB5ZWFyLCB3aWR0aD0zKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB5ZWFyIHJlYWR5IGZvciBmb3JtYXR0aW5nLiBUaGUgcmV0dXJuCisgICAgICAgIHZhbHVlIGlzIGEgbGlzdCBvZiBtb250aCByb3dzLiBFYWNoIG1vbnRoIHJvdyBjb250YWlucyB1cHRvIHdpZHRoIG1vbnRocy4KKyAgICAgICAgRWFjaCBtb250aCBjb250YWlucyBiZXR3ZWVuIDQgYW5kIDYgd2Vla3MgYW5kIGVhY2ggd2VlayBjb250YWlucyAxLTcKKyAgICAgICAgZGF5cy4gRGF5cyBhcmUgZGF0ZXRpbWUuZGF0ZSBvYmplY3RzLgorICAgICAgICAiIiIKKyAgICAgICAgbW9udGhzID0gWworICAgICAgICAgICAgc2VsZi5tb250aGRhdGVzY2FsZW5kYXIoeWVhciwgaSkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKEphbnVhcnksIEphbnVhcnkrMTIpCisgICAgICAgIF0KKyAgICAgICAgcmV0dXJuIFttb250aHNbaTppK3dpZHRoXSBmb3IgaSBpbiByYW5nZSgwLCBsZW4obW9udGhzKSwgd2lkdGgpIF0KKworICAgIGRlZiB5ZWFyZGF5czJjYWxlbmRhcihzZWxmLCB5ZWFyLCB3aWR0aD0zKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgZGF0YSBmb3IgdGhlIHNwZWNpZmllZCB5ZWFyIHJlYWR5IGZvciBmb3JtYXR0aW5nIChzaW1pbGFyIHRvCisgICAgICAgIHllYXJkYXRlc2NhbGVuZGFyKCkpLiBFbnRyaWVzIGluIHRoZSB3ZWVrIGxpc3RzIGFyZQorICAgICAgICAoZGF5IG51bWJlciwgd2Vla2RheSBudW1iZXIpIHR1cGxlcy4gRGF5IG51bWJlcnMgb3V0c2lkZSB0aGlzIG1vbnRoIGFyZQorICAgICAgICB6ZXJvLgorICAgICAgICAiIiIKKyAgICAgICAgbW9udGhzID0gWworICAgICAgICAgICAgc2VsZi5tb250aGRheXMyY2FsZW5kYXIoeWVhciwgaSkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKEphbnVhcnksIEphbnVhcnkrMTIpCisgICAgICAgIF0KKyAgICAgICAgcmV0dXJuIFttb250aHNbaTppK3dpZHRoXSBmb3IgaSBpbiByYW5nZSgwLCBsZW4obW9udGhzKSwgd2lkdGgpIF0KKworICAgIGRlZiB5ZWFyZGF5c2NhbGVuZGFyKHNlbGYsIHllYXIsIHdpZHRoPTMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHllYXIgcmVhZHkgZm9yIGZvcm1hdHRpbmcgKHNpbWlsYXIgdG8KKyAgICAgICAgeWVhcmRhdGVzY2FsZW5kYXIoKSkuIEVudHJpZXMgaW4gdGhlIHdlZWsgbGlzdHMgYXJlIGRheSBudW1iZXJzLgorICAgICAgICBEYXkgbnVtYmVycyBvdXRzaWRlIHRoaXMgbW9udGggYXJlIHplcm8uCisgICAgICAgICIiIgorICAgICAgICBtb250aHMgPSBbCisgICAgICAgICAgICBzZWxmLm1vbnRoZGF5c2NhbGVuZGFyKHllYXIsIGkpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShKYW51YXJ5LCBKYW51YXJ5KzEyKQorICAgICAgICBdCisgICAgICAgIHJldHVybiBbbW9udGhzW2k6aSt3aWR0aF0gZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKG1vbnRocyksIHdpZHRoKSBdCisKKworY2xhc3MgVGV4dENhbGVuZGFyKENhbGVuZGFyKToKKyAgICAiIiIKKyAgICBTdWJjbGFzcyBvZiBDYWxlbmRhciB0aGF0IG91dHB1dHMgYSBjYWxlbmRhciBhcyBhIHNpbXBsZSBwbGFpbiB0ZXh0CisgICAgc2ltaWxhciB0byB0aGUgVU5JWCBwcm9ncmFtIGNhbC4KKyAgICAiIiIKKworICAgIGRlZiBwcndlZWsoc2VsZiwgdGhld2Vlaywgd2lkdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUHJpbnQgYSBzaW5nbGUgd2VlayAobm8gbmV3bGluZSkuCisgICAgICAgICIiIgorICAgICAgICBwcmludCBzZWxmLmZvcm1hdHdlZWsodGhld2Vlaywgd2lkdGgpLAorCisgICAgZGVmIGZvcm1hdGRheShzZWxmLCBkYXksIHdlZWtkYXksIHdpZHRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgYSBmb3JtYXR0ZWQgZGF5LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZGF5ID09IDA6CisgICAgICAgICAgICBzID0gJycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHMgPSAnJTJpJyAlIGRheSAgICAgICAgICAgICAjIHJpZ2h0LWFsaWduIHNpbmdsZS1kaWdpdCBkYXlzCisgICAgICAgIHJldHVybiBzLmNlbnRlcih3aWR0aCkKKworICAgIGRlZiBmb3JtYXR3ZWVrKHNlbGYsIHRoZXdlZWssIHdpZHRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgYSBzaW5nbGUgd2VlayBpbiBhIHN0cmluZyAobm8gbmV3bGluZSkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gJyAnLmpvaW4oc2VsZi5mb3JtYXRkYXkoZCwgd2QsIHdpZHRoKSBmb3IgKGQsIHdkKSBpbiB0aGV3ZWVrKQorCisgICAgZGVmIGZvcm1hdHdlZWtkYXkoc2VsZiwgZGF5LCB3aWR0aCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIGEgZm9ybWF0dGVkIHdlZWsgZGF5IG5hbWUuCisgICAgICAgICIiIgorICAgICAgICBpZiB3aWR0aCA+PSA5OgorICAgICAgICAgICAgbmFtZXMgPSBkYXlfbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZXMgPSBkYXlfYWJicgorICAgICAgICByZXR1cm4gbmFtZXNbZGF5XVs6d2lkdGhdLmNlbnRlcih3aWR0aCkKKworICAgIGRlZiBmb3JtYXR3ZWVraGVhZGVyKHNlbGYsIHdpZHRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGhlYWRlciBmb3IgYSB3ZWVrLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICcgJy5qb2luKHNlbGYuZm9ybWF0d2Vla2RheShpLCB3aWR0aCkgZm9yIGkgaW4gc2VsZi5pdGVyd2Vla2RheXMoKSkKKworICAgIGRlZiBmb3JtYXRtb250aG5hbWUoc2VsZiwgdGhleWVhciwgdGhlbW9udGgsIHdpZHRoLCB3aXRoeWVhcj1UcnVlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGZvcm1hdHRlZCBtb250aCBuYW1lLgorICAgICAgICAiIiIKKyAgICAgICAgcyA9IG1vbnRoX25hbWVbdGhlbW9udGhdCisgICAgICAgIGlmIHdpdGh5ZWFyOgorICAgICAgICAgICAgcyA9ICIlcyAlciIgJSAocywgdGhleWVhcikKKyAgICAgICAgcmV0dXJuIHMuY2VudGVyKHdpZHRoKQorCisgICAgZGVmIHBybW9udGgoc2VsZiwgdGhleWVhciwgdGhlbW9udGgsIHc9MCwgbD0wKToKKyAgICAgICAgIiIiCisgICAgICAgIFByaW50IGEgbW9udGgncyBjYWxlbmRhci4KKyAgICAgICAgIiIiCisgICAgICAgIHByaW50IHNlbGYuZm9ybWF0bW9udGgodGhleWVhciwgdGhlbW9udGgsIHcsIGwpLAorCisgICAgZGVmIGZvcm1hdG1vbnRoKHNlbGYsIHRoZXllYXIsIHRoZW1vbnRoLCB3PTAsIGw9MCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBtb250aCdzIGNhbGVuZGFyIHN0cmluZyAobXVsdGktbGluZSkuCisgICAgICAgICIiIgorICAgICAgICB3ID0gbWF4KDIsIHcpCisgICAgICAgIGwgPSBtYXgoMSwgbCkKKyAgICAgICAgcyA9IHNlbGYuZm9ybWF0bW9udGhuYW1lKHRoZXllYXIsIHRoZW1vbnRoLCA3ICogKHcgKyAxKSAtIDEpCisgICAgICAgIHMgPSBzLnJzdHJpcCgpCisgICAgICAgIHMgKz0gJ1xuJyAqIGwKKyAgICAgICAgcyArPSBzZWxmLmZvcm1hdHdlZWtoZWFkZXIodykucnN0cmlwKCkKKyAgICAgICAgcyArPSAnXG4nICogbAorICAgICAgICBmb3Igd2VlayBpbiBzZWxmLm1vbnRoZGF5czJjYWxlbmRhcih0aGV5ZWFyLCB0aGVtb250aCk6CisgICAgICAgICAgICBzICs9IHNlbGYuZm9ybWF0d2Vlayh3ZWVrLCB3KS5yc3RyaXAoKQorICAgICAgICAgICAgcyArPSAnXG4nICogbAorICAgICAgICByZXR1cm4gcworCisgICAgZGVmIGZvcm1hdHllYXIoc2VsZiwgdGhleWVhciwgdz0yLCBsPTEsIGM9NiwgbT0zKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgYSB5ZWFyJ3MgY2FsZW5kYXIgYXMgYSBtdWx0aS1saW5lIHN0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHcgPSBtYXgoMiwgdykKKyAgICAgICAgbCA9IG1heCgxLCBsKQorICAgICAgICBjID0gbWF4KDIsIGMpCisgICAgICAgIGNvbHdpZHRoID0gKHcgKyAxKSAqIDcgLSAxCisgICAgICAgIHYgPSBbXQorICAgICAgICBhID0gdi5hcHBlbmQKKyAgICAgICAgYShyZXByKHRoZXllYXIpLmNlbnRlcihjb2x3aWR0aCptK2MqKG0tMSkpLnJzdHJpcCgpKQorICAgICAgICBhKCdcbicqbCkKKyAgICAgICAgaGVhZGVyID0gc2VsZi5mb3JtYXR3ZWVraGVhZGVyKHcpCisgICAgICAgIGZvciAoaSwgcm93KSBpbiBlbnVtZXJhdGUoc2VsZi55ZWFyZGF5czJjYWxlbmRhcih0aGV5ZWFyLCBtKSk6CisgICAgICAgICAgICAjIG1vbnRocyBpbiB0aGlzIHJvdworICAgICAgICAgICAgbW9udGhzID0gcmFuZ2UobSppKzEsIG1pbihtKihpKzEpKzEsIDEzKSkKKyAgICAgICAgICAgIGEoJ1xuJypsKQorICAgICAgICAgICAgbmFtZXMgPSAoc2VsZi5mb3JtYXRtb250aG5hbWUodGhleWVhciwgaywgY29sd2lkdGgsIEZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgZm9yIGsgaW4gbW9udGhzKQorICAgICAgICAgICAgYShmb3JtYXRzdHJpbmcobmFtZXMsIGNvbHdpZHRoLCBjKS5yc3RyaXAoKSkKKyAgICAgICAgICAgIGEoJ1xuJypsKQorICAgICAgICAgICAgaGVhZGVycyA9IChoZWFkZXIgZm9yIGsgaW4gbW9udGhzKQorICAgICAgICAgICAgYShmb3JtYXRzdHJpbmcoaGVhZGVycywgY29sd2lkdGgsIGMpLnJzdHJpcCgpKQorICAgICAgICAgICAgYSgnXG4nKmwpCisgICAgICAgICAgICAjIG1heCBudW1iZXIgb2Ygd2Vla3MgZm9yIHRoaXMgcm93CisgICAgICAgICAgICBoZWlnaHQgPSBtYXgobGVuKGNhbCkgZm9yIGNhbCBpbiByb3cpCisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZShoZWlnaHQpOgorICAgICAgICAgICAgICAgIHdlZWtzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgY2FsIGluIHJvdzoKKyAgICAgICAgICAgICAgICAgICAgaWYgaiA+PSBsZW4oY2FsKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtzLmFwcGVuZCgnJykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtzLmFwcGVuZChzZWxmLmZvcm1hdHdlZWsoY2FsW2pdLCB3KSkKKyAgICAgICAgICAgICAgICBhKGZvcm1hdHN0cmluZyh3ZWVrcywgY29sd2lkdGgsIGMpLnJzdHJpcCgpKQorICAgICAgICAgICAgICAgIGEoJ1xuJyAqIGwpCisgICAgICAgIHJldHVybiAnJy5qb2luKHYpCisKKyAgICBkZWYgcHJ5ZWFyKHNlbGYsIHRoZXllYXIsIHc9MCwgbD0wLCBjPTYsIG09Myk6CisgICAgICAgICIiIlByaW50IGEgeWVhcidzIGNhbGVuZGFyLiIiIgorICAgICAgICBwcmludCBzZWxmLmZvcm1hdHllYXIodGhleWVhciwgdywgbCwgYywgbSkKKworCitjbGFzcyBIVE1MQ2FsZW5kYXIoQ2FsZW5kYXIpOgorICAgICIiIgorICAgIFRoaXMgY2FsZW5kYXIgcmV0dXJucyBjb21wbGV0ZSBIVE1MIHBhZ2VzLgorICAgICIiIgorCisgICAgIyBDU1MgY2xhc3NlcyBmb3IgdGhlIGRheSA8dGQ+cworICAgIGNzc2NsYXNzZXMgPSBbIm1vbiIsICJ0dWUiLCAid2VkIiwgInRodSIsICJmcmkiLCAic2F0IiwgInN1biJdCisKKyAgICBkZWYgZm9ybWF0ZGF5KHNlbGYsIGRheSwgd2Vla2RheSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBkYXkgYXMgYSB0YWJsZSBjZWxsLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZGF5ID09IDA6CisgICAgICAgICAgICByZXR1cm4gJzx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+JyAjIGRheSBvdXRzaWRlIG1vbnRoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJzx0ZCBjbGFzcz0iJXMiPiVkPC90ZD4nICUgKHNlbGYuY3NzY2xhc3Nlc1t3ZWVrZGF5XSwgZGF5KQorCisgICAgZGVmIGZvcm1hdHdlZWsoc2VsZiwgdGhld2Vlayk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBjb21wbGV0ZSB3ZWVrIGFzIGEgdGFibGUgcm93LgorICAgICAgICAiIiIKKyAgICAgICAgcyA9ICcnLmpvaW4oc2VsZi5mb3JtYXRkYXkoZCwgd2QpIGZvciAoZCwgd2QpIGluIHRoZXdlZWspCisgICAgICAgIHJldHVybiAnPHRyPiVzPC90cj4nICUgcworCisgICAgZGVmIGZvcm1hdHdlZWtkYXkoc2VsZiwgZGF5KToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIHdlZWtkYXkgbmFtZSBhcyBhIHRhYmxlIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAnPHRoIGNsYXNzPSIlcyI+JXM8L3RoPicgJSAoc2VsZi5jc3NjbGFzc2VzW2RheV0sIGRheV9hYmJyW2RheV0pCisKKyAgICBkZWYgZm9ybWF0d2Vla2hlYWRlcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGhlYWRlciBmb3IgYSB3ZWVrIGFzIGEgdGFibGUgcm93LgorICAgICAgICAiIiIKKyAgICAgICAgcyA9ICcnLmpvaW4oc2VsZi5mb3JtYXR3ZWVrZGF5KGkpIGZvciBpIGluIHNlbGYuaXRlcndlZWtkYXlzKCkpCisgICAgICAgIHJldHVybiAnPHRyPiVzPC90cj4nICUgcworCisgICAgZGVmIGZvcm1hdG1vbnRobmFtZShzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgd2l0aHllYXI9VHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBtb250aCBuYW1lIGFzIGEgdGFibGUgcm93LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgd2l0aHllYXI6CisgICAgICAgICAgICBzID0gJyVzICVzJyAlIChtb250aF9uYW1lW3RoZW1vbnRoXSwgdGhleWVhcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHMgPSAnJXMnICUgbW9udGhfbmFtZVt0aGVtb250aF0KKyAgICAgICAgcmV0dXJuICc8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+JXM8L3RoPjwvdHI+JyAlIHMKKworICAgIGRlZiBmb3JtYXRtb250aChzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgd2l0aHllYXI9VHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBmb3JtYXR0ZWQgbW9udGggYXMgYSB0YWJsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHYgPSBbXQorICAgICAgICBhID0gdi5hcHBlbmQKKyAgICAgICAgYSgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPicpCisgICAgICAgIGEoJ1xuJykKKyAgICAgICAgYShzZWxmLmZvcm1hdG1vbnRobmFtZSh0aGV5ZWFyLCB0aGVtb250aCwgd2l0aHllYXI9d2l0aHllYXIpKQorICAgICAgICBhKCdcbicpCisgICAgICAgIGEoc2VsZi5mb3JtYXR3ZWVraGVhZGVyKCkpCisgICAgICAgIGEoJ1xuJykKKyAgICAgICAgZm9yIHdlZWsgaW4gc2VsZi5tb250aGRheXMyY2FsZW5kYXIodGhleWVhciwgdGhlbW9udGgpOgorICAgICAgICAgICAgYShzZWxmLmZvcm1hdHdlZWsod2VlaykpCisgICAgICAgICAgICBhKCdcbicpCisgICAgICAgIGEoJzwvdGFibGU+JykKKyAgICAgICAgYSgnXG4nKQorICAgICAgICByZXR1cm4gJycuam9pbih2KQorCisgICAgZGVmIGZvcm1hdHllYXIoc2VsZiwgdGhleWVhciwgd2lkdGg9Myk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBmb3JtYXR0ZWQgeWVhciBhcyBhIHRhYmxlIG9mIHRhYmxlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHYgPSBbXQorICAgICAgICBhID0gdi5hcHBlbmQKKyAgICAgICAgd2lkdGggPSBtYXgod2lkdGgsIDEpCisgICAgICAgIGEoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InllYXIiPicpCisgICAgICAgIGEoJ1xuJykKKyAgICAgICAgYSgnPHRyPjx0aCBjb2xzcGFuPSIlZCIgY2xhc3M9InllYXIiPiVzPC90aD48L3RyPicgJSAod2lkdGgsIHRoZXllYXIpKQorICAgICAgICBmb3IgaSBpbiByYW5nZShKYW51YXJ5LCBKYW51YXJ5KzEyLCB3aWR0aCk6CisgICAgICAgICAgICAjIG1vbnRocyBpbiB0aGlzIHJvdworICAgICAgICAgICAgbW9udGhzID0gcmFuZ2UoaSwgbWluKGkrd2lkdGgsIDEzKSkKKyAgICAgICAgICAgIGEoJzx0cj4nKQorICAgICAgICAgICAgZm9yIG0gaW4gbW9udGhzOgorICAgICAgICAgICAgICAgIGEoJzx0ZD4nKQorICAgICAgICAgICAgICAgIGEoc2VsZi5mb3JtYXRtb250aCh0aGV5ZWFyLCBtLCB3aXRoeWVhcj1GYWxzZSkpCisgICAgICAgICAgICAgICAgYSgnPC90ZD4nKQorICAgICAgICAgICAgYSgnPC90cj4nKQorICAgICAgICBhKCc8L3RhYmxlPicpCisgICAgICAgIHJldHVybiAnJy5qb2luKHYpCisKKyAgICBkZWYgZm9ybWF0eWVhcnBhZ2Uoc2VsZiwgdGhleWVhciwgd2lkdGg9MywgY3NzPSdjYWxlbmRhci5jc3MnLCBlbmNvZGluZz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGZvcm1hdHRlZCB5ZWFyIGFzIGEgY29tcGxldGUgSFRNTCBwYWdlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gc3lzLmdldGRlZmF1bHRlbmNvZGluZygpCisgICAgICAgIHYgPSBbXQorICAgICAgICBhID0gdi5hcHBlbmQKKyAgICAgICAgYSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJXMiPz5cbicgJSBlbmNvZGluZykKKyAgICAgICAgYSgnPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPlxuJykKKyAgICAgICAgYSgnPGh0bWw+XG4nKQorICAgICAgICBhKCc8aGVhZD5cbicpCisgICAgICAgIGEoJzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSVzIiAvPlxuJyAlIGVuY29kaW5nKQorICAgICAgICBpZiBjc3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhKCc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIlcyIgLz5cbicgJSBjc3MpCisgICAgICAgIGEoJzx0aXRsZT5DYWxlbmRhciBmb3IgJWQ8L3RpdGxlPlxuJyAlIHRoZXllYXIpCisgICAgICAgIGEoJzwvaGVhZD5cbicpCisgICAgICAgIGEoJzxib2R5PlxuJykKKyAgICAgICAgYShzZWxmLmZvcm1hdHllYXIodGhleWVhciwgd2lkdGgpKQorICAgICAgICBhKCc8L2JvZHk+XG4nKQorICAgICAgICBhKCc8L2h0bWw+XG4nKQorICAgICAgICByZXR1cm4gJycuam9pbih2KS5lbmNvZGUoZW5jb2RpbmcsICJ4bWxjaGFycmVmcmVwbGFjZSIpCisKKworY2xhc3MgVGltZUVuY29kaW5nOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2NhbGUpOgorICAgICAgICBzZWxmLmxvY2FsZSA9IGxvY2FsZQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgc2VsZi5vbGRsb2NhbGUgPSBfbG9jYWxlLmdldGxvY2FsZShfbG9jYWxlLkxDX1RJTUUpCisgICAgICAgIF9sb2NhbGUuc2V0bG9jYWxlKF9sb2NhbGUuTENfVElNRSwgc2VsZi5sb2NhbGUpCisgICAgICAgIHJldHVybiBfbG9jYWxlLmdldGxvY2FsZShfbG9jYWxlLkxDX1RJTUUpWzFdCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBfbG9jYWxlLnNldGxvY2FsZShfbG9jYWxlLkxDX1RJTUUsIHNlbGYub2xkbG9jYWxlKQorCisKK2NsYXNzIExvY2FsZVRleHRDYWxlbmRhcihUZXh0Q2FsZW5kYXIpOgorICAgICIiIgorICAgIFRoaXMgY2xhc3MgY2FuIGJlIHBhc3NlZCBhIGxvY2FsZSBuYW1lIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgd2lsbCByZXR1cm4KKyAgICBtb250aCBhbmQgd2Vla2RheSBuYW1lcyBpbiB0aGUgc3BlY2lmaWVkIGxvY2FsZS4gSWYgdGhpcyBsb2NhbGUgaW5jbHVkZXMKKyAgICBhbiBlbmNvZGluZyBhbGwgc3RyaW5ncyBjb250YWluaW5nIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIHdpbGwgYmUgcmV0dXJuZWQKKyAgICBhcyB1bmljb2RlLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpcnN0d2Vla2RheT0wLCBsb2NhbGU9Tm9uZSk6CisgICAgICAgIFRleHRDYWxlbmRhci5fX2luaXRfXyhzZWxmLCBmaXJzdHdlZWtkYXkpCisgICAgICAgIGlmIGxvY2FsZSBpcyBOb25lOgorICAgICAgICAgICAgbG9jYWxlID0gX2xvY2FsZS5nZXRkZWZhdWx0bG9jYWxlKCkKKyAgICAgICAgc2VsZi5sb2NhbGUgPSBsb2NhbGUKKworICAgIGRlZiBmb3JtYXR3ZWVrZGF5KHNlbGYsIGRheSwgd2lkdGgpOgorICAgICAgICB3aXRoIFRpbWVFbmNvZGluZyhzZWxmLmxvY2FsZSkgYXMgZW5jb2Rpbmc6CisgICAgICAgICAgICBpZiB3aWR0aCA+PSA5OgorICAgICAgICAgICAgICAgIG5hbWVzID0gZGF5X25hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmFtZXMgPSBkYXlfYWJicgorICAgICAgICAgICAgbmFtZSA9IG5hbWVzW2RheV0KKyAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIHJldHVybiBuYW1lWzp3aWR0aF0uY2VudGVyKHdpZHRoKQorCisgICAgZGVmIGZvcm1hdG1vbnRobmFtZShzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgd2lkdGgsIHdpdGh5ZWFyPVRydWUpOgorICAgICAgICB3aXRoIFRpbWVFbmNvZGluZyhzZWxmLmxvY2FsZSkgYXMgZW5jb2Rpbmc6CisgICAgICAgICAgICBzID0gbW9udGhfbmFtZVt0aGVtb250aF0KKyAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHMgPSBzLmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIGlmIHdpdGh5ZWFyOgorICAgICAgICAgICAgICAgIHMgPSAiJXMgJXIiICUgKHMsIHRoZXllYXIpCisgICAgICAgICAgICByZXR1cm4gcy5jZW50ZXIod2lkdGgpCisKKworY2xhc3MgTG9jYWxlSFRNTENhbGVuZGFyKEhUTUxDYWxlbmRhcik6CisgICAgIiIiCisgICAgVGhpcyBjbGFzcyBjYW4gYmUgcGFzc2VkIGEgbG9jYWxlIG5hbWUgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB3aWxsIHJldHVybgorICAgIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLiBJZiB0aGlzIGxvY2FsZSBpbmNsdWRlcworICAgIGFuIGVuY29kaW5nIGFsbCBzdHJpbmdzIGNvbnRhaW5pbmcgbW9udGggYW5kIHdlZWtkYXkgbmFtZXMgd2lsbCBiZSByZXR1cm5lZAorICAgIGFzIHVuaWNvZGUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpcnN0d2Vla2RheT0wLCBsb2NhbGU9Tm9uZSk6CisgICAgICAgIEhUTUxDYWxlbmRhci5fX2luaXRfXyhzZWxmLCBmaXJzdHdlZWtkYXkpCisgICAgICAgIGlmIGxvY2FsZSBpcyBOb25lOgorICAgICAgICAgICAgbG9jYWxlID0gX2xvY2FsZS5nZXRkZWZhdWx0bG9jYWxlKCkKKyAgICAgICAgc2VsZi5sb2NhbGUgPSBsb2NhbGUKKworICAgIGRlZiBmb3JtYXR3ZWVrZGF5KHNlbGYsIGRheSk6CisgICAgICAgIHdpdGggVGltZUVuY29kaW5nKHNlbGYubG9jYWxlKSBhcyBlbmNvZGluZzoKKyAgICAgICAgICAgIHMgPSBkYXlfYWJicltkYXldCisgICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzID0gcy5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICByZXR1cm4gJzx0aCBjbGFzcz0iJXMiPiVzPC90aD4nICUgKHNlbGYuY3NzY2xhc3Nlc1tkYXldLCBzKQorCisgICAgZGVmIGZvcm1hdG1vbnRobmFtZShzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgd2l0aHllYXI9VHJ1ZSk6CisgICAgICAgIHdpdGggVGltZUVuY29kaW5nKHNlbGYubG9jYWxlKSBhcyBlbmNvZGluZzoKKyAgICAgICAgICAgIHMgPSBtb250aF9uYW1lW3RoZW1vbnRoXQorICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcyA9IHMuZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgaWYgd2l0aHllYXI6CisgICAgICAgICAgICAgICAgcyA9ICclcyAlcycgJSAocywgdGhleWVhcikKKyAgICAgICAgICAgIHJldHVybiAnPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPiVzPC90aD48L3RyPicgJSBzCisKKworIyBTdXBwb3J0IGZvciBvbGQgbW9kdWxlIGxldmVsIGludGVyZmFjZQorYyA9IFRleHRDYWxlbmRhcigpCisKK2ZpcnN0d2Vla2RheSA9IGMuZ2V0Zmlyc3R3ZWVrZGF5CisKK2RlZiBzZXRmaXJzdHdlZWtkYXkoZmlyc3R3ZWVrZGF5KToKKyAgICB0cnk6CisgICAgICAgIGZpcnN0d2Vla2RheS5fX2luZGV4X18KKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHJhaXNlIElsbGVnYWxXZWVrZGF5RXJyb3IoZmlyc3R3ZWVrZGF5KQorICAgIGlmIG5vdCBNT05EQVkgPD0gZmlyc3R3ZWVrZGF5IDw9IFNVTkRBWToKKyAgICAgICAgcmFpc2UgSWxsZWdhbFdlZWtkYXlFcnJvcihmaXJzdHdlZWtkYXkpCisgICAgYy5maXJzdHdlZWtkYXkgPSBmaXJzdHdlZWtkYXkKKworbW9udGhjYWxlbmRhciA9IGMubW9udGhkYXlzY2FsZW5kYXIKK3Byd2VlayA9IGMucHJ3ZWVrCit3ZWVrID0gYy5mb3JtYXR3ZWVrCit3ZWVraGVhZGVyID0gYy5mb3JtYXR3ZWVraGVhZGVyCitwcm1vbnRoID0gYy5wcm1vbnRoCittb250aCA9IGMuZm9ybWF0bW9udGgKK2NhbGVuZGFyID0gYy5mb3JtYXR5ZWFyCitwcmNhbCA9IGMucHJ5ZWFyCisKKworIyBTcGFjaW5nIG9mIG1vbnRoIGNvbHVtbnMgZm9yIG11bHRpLWNvbHVtbiB5ZWFyIGNhbGVuZGFyCitfY29sd2lkdGggPSA3KjMgLSAxICAgICAgICAgIyBBbW91bnQgcHJpbnRlZCBieSBwcndlZWsoKQorX3NwYWNpbmcgPSA2ICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIHNwYWNlcyBiZXR3ZWVuIGNvbHVtbnMKKworCitkZWYgZm9ybWF0KGNvbHMsIGNvbHdpZHRoPV9jb2x3aWR0aCwgc3BhY2luZz1fc3BhY2luZyk6CisgICAgIiIiUHJpbnRzIG11bHRpLWNvbHVtbiBmb3JtYXR0aW5nIGZvciB5ZWFyIGNhbGVuZGFycyIiIgorICAgIHByaW50IGZvcm1hdHN0cmluZyhjb2xzLCBjb2x3aWR0aCwgc3BhY2luZykKKworCitkZWYgZm9ybWF0c3RyaW5nKGNvbHMsIGNvbHdpZHRoPV9jb2x3aWR0aCwgc3BhY2luZz1fc3BhY2luZyk6CisgICAgIiIiUmV0dXJucyBhIHN0cmluZyBmb3JtYXR0ZWQgZnJvbSBuIHN0cmluZ3MsIGNlbnRlcmVkIHdpdGhpbiBuIGNvbHVtbnMuIiIiCisgICAgc3BhY2luZyAqPSAnICcKKyAgICByZXR1cm4gc3BhY2luZy5qb2luKGMuY2VudGVyKGNvbHdpZHRoKSBmb3IgYyBpbiBjb2xzKQorCisKK0VQT0NIID0gMTk3MAorX0VQT0NIX09SRCA9IGRhdGV0aW1lLmRhdGUoRVBPQ0gsIDEsIDEpLnRvb3JkaW5hbCgpCisKKworZGVmIHRpbWVnbSh0dXBsZSk6CisgICAgIiIiVW5yZWxhdGVkIGJ1dCBoYW5keSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgVW5peCB0aW1lc3RhbXAgZnJvbSBHTVQuIiIiCisgICAgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQgPSB0dXBsZVs6Nl0KKyAgICBkYXlzID0gZGF0ZXRpbWUuZGF0ZSh5ZWFyLCBtb250aCwgMSkudG9vcmRpbmFsKCkgLSBfRVBPQ0hfT1JEICsgZGF5IC0gMQorICAgIGhvdXJzID0gZGF5cyoyNCArIGhvdXIKKyAgICBtaW51dGVzID0gaG91cnMqNjAgKyBtaW51dGUKKyAgICBzZWNvbmRzID0gbWludXRlcyo2MCArIHNlY29uZAorICAgIHJldHVybiBzZWNvbmRzCisKKworZGVmIG1haW4oYXJncyk6CisgICAgaW1wb3J0IG9wdHBhcnNlCisgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSJ1c2FnZTogJXByb2cgW29wdGlvbnNdIFt5ZWFyIFttb250aF1dIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi13IiwgIi0td2lkdGgiLAorICAgICAgICBkZXN0PSJ3aWR0aCIsIHR5cGU9ImludCIsIGRlZmF1bHQ9MiwKKyAgICAgICAgaGVscD0id2lkdGggb2YgZGF0ZSBjb2x1bW4gKGRlZmF1bHQgMiwgdGV4dCBvbmx5KSIKKyAgICApCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICItbCIsICItLWxpbmVzIiwKKyAgICAgICAgZGVzdD0ibGluZXMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTEsCisgICAgICAgIGhlbHA9Im51bWJlciBvZiBsaW5lcyBmb3IgZWFjaCB3ZWVrIChkZWZhdWx0IDEsIHRleHQgb25seSkiCisgICAgKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLXMiLCAiLS1zcGFjaW5nIiwKKyAgICAgICAgZGVzdD0ic3BhY2luZyIsIHR5cGU9ImludCIsIGRlZmF1bHQ9NiwKKyAgICAgICAgaGVscD0ic3BhY2luZyBiZXR3ZWVuIG1vbnRocyAoZGVmYXVsdCA2LCB0ZXh0IG9ubHkpIgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi1tIiwgIi0tbW9udGhzIiwKKyAgICAgICAgZGVzdD0ibW9udGhzIiwgdHlwZT0iaW50IiwgZGVmYXVsdD0zLAorICAgICAgICBoZWxwPSJtb250aHMgcGVyIHJvdyAoZGVmYXVsdCAzLCB0ZXh0IG9ubHkpIgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi1jIiwgIi0tY3NzIiwKKyAgICAgICAgZGVzdD0iY3NzIiwgZGVmYXVsdD0iY2FsZW5kYXIuY3NzIiwKKyAgICAgICAgaGVscD0iQ1NTIHRvIHVzZSBmb3IgcGFnZSAoaHRtbCBvbmx5KSIKKyAgICApCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICItTCIsICItLWxvY2FsZSIsCisgICAgICAgIGRlc3Q9ImxvY2FsZSIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgaGVscD0ibG9jYWxlIHRvIGJlIHVzZWQgZnJvbSBtb250aCBhbmQgd2Vla2RheSBuYW1lcyIKKyAgICApCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICItZSIsICItLWVuY29kaW5nIiwKKyAgICAgICAgZGVzdD0iZW5jb2RpbmciLCBkZWZhdWx0PU5vbmUsCisgICAgICAgIGhlbHA9IkVuY29kaW5nIHRvIHVzZSBmb3Igb3V0cHV0IgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi10IiwgIi0tdHlwZSIsCisgICAgICAgIGRlc3Q9InR5cGUiLCBkZWZhdWx0PSJ0ZXh0IiwKKyAgICAgICAgY2hvaWNlcz0oInRleHQiLCAiaHRtbCIpLAorICAgICAgICBoZWxwPSJvdXRwdXQgdHlwZSAodGV4dCBvciBodG1sKSIKKyAgICApCisKKyAgICAob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdzKQorCisgICAgaWYgb3B0aW9ucy5sb2NhbGUgYW5kIG5vdCBvcHRpb25zLmVuY29kaW5nOgorICAgICAgICBwYXJzZXIuZXJyb3IoImlmIC0tbG9jYWxlIGlzIHNwZWNpZmllZCAtLWVuY29kaW5nIGlzIHJlcXVpcmVkIikKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGxvY2FsZSA9IG9wdGlvbnMubG9jYWxlLCBvcHRpb25zLmVuY29kaW5nCisKKyAgICBpZiBvcHRpb25zLnR5cGUgPT0gImh0bWwiOgorICAgICAgICBpZiBvcHRpb25zLmxvY2FsZToKKyAgICAgICAgICAgIGNhbCA9IExvY2FsZUhUTUxDYWxlbmRhcihsb2NhbGU9bG9jYWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2FsID0gSFRNTENhbGVuZGFyKCkKKyAgICAgICAgZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nCisgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQorICAgICAgICBvcHRkaWN0ID0gZGljdChlbmNvZGluZz1lbmNvZGluZywgY3NzPW9wdGlvbnMuY3NzKQorICAgICAgICBpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgICAgIHByaW50IGNhbC5mb3JtYXR5ZWFycGFnZShkYXRldGltZS5kYXRlLnRvZGF5KCkueWVhciwgKipvcHRkaWN0KQorICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAyOgorICAgICAgICAgICAgcHJpbnQgY2FsLmZvcm1hdHllYXJwYWdlKGludChhcmdzWzFdKSwgKipvcHRkaWN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyc2VyLmVycm9yKCJpbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyIpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgIGVsc2U6CisgICAgICAgIGlmIG9wdGlvbnMubG9jYWxlOgorICAgICAgICAgICAgY2FsID0gTG9jYWxlVGV4dENhbGVuZGFyKGxvY2FsZT1sb2NhbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjYWwgPSBUZXh0Q2FsZW5kYXIoKQorICAgICAgICBvcHRkaWN0ID0gZGljdCh3PW9wdGlvbnMud2lkdGgsIGw9b3B0aW9ucy5saW5lcykKKyAgICAgICAgaWYgbGVuKGFyZ3MpICE9IDM6CisgICAgICAgICAgICBvcHRkaWN0WyJjIl0gPSBvcHRpb25zLnNwYWNpbmcKKyAgICAgICAgICAgIG9wdGRpY3RbIm0iXSA9IG9wdGlvbnMubW9udGhzCisgICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdHllYXIoZGF0ZXRpbWUuZGF0ZS50b2RheSgpLnllYXIsICoqb3B0ZGljdCkKKyAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKKyAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXR5ZWFyKGludChhcmdzWzFdKSwgKipvcHRkaWN0KQorICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAzOgorICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdG1vbnRoKGludChhcmdzWzFdKSwgaW50KGFyZ3NbMl0pLCAqKm9wdGRpY3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJzZXIuZXJyb3IoImluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIikKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIGlmIG9wdGlvbnMuZW5jb2Rpbmc6CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuZW5jb2RlKG9wdGlvbnMuZW5jb2RpbmcpCisgICAgICAgIHByaW50IHJlc3VsdAorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY2FsZW5kYXIucHljIGIvbGliL3B5dGhvbjIuNy9jYWxlbmRhci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2YWE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY2FsZW5kYXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY2FsZW5kYXIucHlvIGIvbGliL3B5dGhvbjIuNy9jYWxlbmRhci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2YWE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY2FsZW5kYXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY2dpLnB5IGIvbGliL3B5dGhvbjIuNy9jZ2kucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjcwNzlkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY2dpLnB5CkBAIC0wLDAgKzEsMTA1MCBAQAorIyEgL3Vzci9sb2NhbC9iaW4vcHl0aG9uCisKKyMgTk9URTogdGhlIGFib3ZlICIvdXNyL2xvY2FsL2Jpbi9weXRob24iIGlzIE5PVCBhIG1pc3Rha2UuICBJdCBpcworIyBpbnRlbnRpb25hbGx5IE5PVCAiL3Vzci9iaW4vZW52IHB5dGhvbiIuICBPbiBtYW55IHN5c3RlbXMKKyMgKGUuZy4gU29sYXJpcyksIC91c3IvbG9jYWwvYmluIGlzIG5vdCBpbiAkUEFUSCBhcyBwYXNzZWQgdG8gQ0dJCisjIHNjcmlwdHMsIGFuZCAvdXNyL2xvY2FsL2JpbiBpcyB0aGUgZGVmYXVsdCBkaXJlY3Rvcnkgd2hlcmUgUHl0aG9uIGlzCisjIGluc3RhbGxlZCwgc28gL3Vzci9iaW4vZW52IHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHB5dGhvbi4gIEdyYW50ZWQsCisjIGJpbmFyeSBpbnN0YWxsYXRpb25zIGJ5IExpbnV4IHZlbmRvcnMgb2Z0ZW4gaW5zdGFsbCBQeXRob24gaW4KKyMgL3Vzci9iaW4uICBTbyBsZXQgdGhvc2UgdmVuZG9ycyBwYXRjaCBjZ2kucHkgdG8gbWF0Y2ggdGhlaXIgY2hvaWNlCisjIG9mIGluc3RhbGxhdGlvbi4KKworIiIiU3VwcG9ydCBtb2R1bGUgZm9yIENHSSAoQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlKSBzY3JpcHRzLgorCitUaGlzIG1vZHVsZSBkZWZpbmVzIGEgbnVtYmVyIG9mIHV0aWxpdGllcyBmb3IgdXNlIGJ5IENHSSBzY3JpcHRzCit3cml0dGVuIGluIFB5dGhvbi4KKyIiIgorCisjIFhYWCBQZXJoYXBzIHRoZXJlIHNob3VsZCBiZSBhIHNsaW1tZWQgdmVyc2lvbiB0aGF0IGRvZXNuJ3QgY29udGFpbgorIyBhbGwgdGhvc2UgYmFja3dhcmRzIGNvbXBhdGlibGUgYW5kIGRlYnVnZ2luZyBjbGFzc2VzIGFuZCBmdW5jdGlvbnM/CisKKyMgSGlzdG9yeQorIyAtLS0tLS0tCisjCisjIE1pY2hhZWwgTWNMYXkgc3RhcnRlZCB0aGlzIG1vZHVsZS4gIFN0ZXZlIE1hamV3c2tpIGNoYW5nZWQgdGhlCisjIGludGVyZmFjZSB0byBTdkZvcm1Db250ZW50RGljdCBhbmQgRm9ybUNvbnRlbnREaWN0LiAgVGhlIG11bHRpcGFydAorIyBwYXJzaW5nIHdhcyBpbnNwaXJlZCBieSBjb2RlIHN1Ym1pdHRlZCBieSBBbmRyZWFzIFBhZXBja2UuICBHdWlkbyB2YW4KKyMgUm9zc3VtIHJld3JvdGUsIHJlZm9ybWF0dGVkIGFuZCBkb2N1bWVudGVkIHRoZSBtb2R1bGUgYW5kIGlzIGN1cnJlbnRseQorIyByZXNwb25zaWJsZSBmb3IgaXRzIG1haW50ZW5hbmNlLgorIworCitfX3ZlcnNpb25fXyA9ICIyLjYiCisKKworIyBJbXBvcnRzCisjID09PT09PT0KKworZnJvbSBvcGVyYXRvciBpbXBvcnQgYXR0cmdldHRlcgoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgVXNlckRpY3QKK2ltcG9ydCB1cmxwYXJzZQorCitmcm9tIHdhcm5pbmdzIGltcG9ydCBmaWx0ZXJ3YXJuaW5ncywgY2F0Y2hfd2FybmluZ3MsIHdhcm4KK3dpdGggY2F0Y2hfd2FybmluZ3MoKToKKyAgICBpZiBzeXMucHkza3dhcm5pbmc6CisgICAgICAgIGZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLiptaW1ldG9vbHMgaGFzIGJlZW4gcmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuKnJmYzgyMiBoYXMgYmVlbiByZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgIGltcG9ydCBtaW1ldG9vbHMKKyAgICBpbXBvcnQgcmZjODIyCisKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitfX2FsbF9fID0gWyJNaW5pRmllbGRTdG9yYWdlIiwgIkZpZWxkU3RvcmFnZSIsICJGb3JtQ29udGVudERpY3QiLAorICAgICAgICAgICAiU3ZGb3JtQ29udGVudERpY3QiLCAiSW50ZXJwRm9ybUNvbnRlbnREaWN0IiwgIkZvcm1Db250ZW50IiwKKyAgICAgICAgICAgInBhcnNlIiwgInBhcnNlX3FzIiwgInBhcnNlX3FzbCIsICJwYXJzZV9tdWx0aXBhcnQiLAorICAgICAgICAgICAicGFyc2VfaGVhZGVyIiwgInByaW50X2V4Y2VwdGlvbiIsICJwcmludF9lbnZpcm9uIiwKKyAgICAgICAgICAgInByaW50X2Zvcm0iLCAicHJpbnRfZGlyZWN0b3J5IiwgInByaW50X2FyZ3VtZW50cyIsCisgICAgICAgICAgICJwcmludF9lbnZpcm9uX3VzYWdlIiwgImVzY2FwZSJdCisKKyMgTG9nZ2luZyBzdXBwb3J0CisjID09PT09PT09PT09PT09PQorCitsb2dmaWxlID0gIiIgICAgICAgICAgICAjIEZpbGVuYW1lIHRvIGxvZyB0bywgaWYgbm90IGVtcHR5Citsb2dmcCA9IE5vbmUgICAgICAgICAgICAjIEZpbGUgb2JqZWN0IHRvIGxvZyB0bywgaWYgbm90IE5vbmUKKworZGVmIGluaXRsb2coKmFsbGFyZ3MpOgorICAgICIiIldyaXRlIGEgbG9nIG1lc3NhZ2UsIGlmIHRoZXJlIGlzIGEgbG9nIGZpbGUuCisKKyAgICBFdmVuIHRob3VnaCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbml0bG9nKCksIHlvdSBzaG91bGQgYWx3YXlzCisgICAgdXNlIGxvZygpOyBsb2cgaXMgYSB2YXJpYWJsZSB0aGF0IGlzIHNldCBlaXRoZXIgdG8gaW5pdGxvZworICAgIChpbml0aWFsbHkpLCB0byBkb2xvZyAob25jZSB0aGUgbG9nIGZpbGUgaGFzIGJlZW4gb3BlbmVkKSwgb3IgdG8KKyAgICBub2xvZyAod2hlbiBsb2dnaW5nIGlzIGRpc2FibGVkKS4KKworICAgIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIGZvcm1hdCBzdHJpbmc7IHRoZSByZW1haW5pbmcgYXJndW1lbnRzIChpZgorICAgIGFueSkgYXJlIGFyZ3VtZW50cyB0byB0aGUgJSBvcGVyYXRvciwgc28gZS5nLgorICAgICAgICBsb2coIiVzOiAlcyIsICJhIiwgImIiKQorICAgIHdpbGwgd3JpdGUgImE6IGIiIHRvIHRoZSBsb2cgZmlsZSwgZm9sbG93ZWQgYnkgYSBuZXdsaW5lLgorCisgICAgSWYgdGhlIGdsb2JhbCBsb2dmcCBpcyBub3QgTm9uZSwgaXQgc2hvdWxkIGJlIGEgZmlsZSBvYmplY3QgdG8KKyAgICB3aGljaCBsb2cgZGF0YSBpcyB3cml0dGVuLgorCisgICAgSWYgdGhlIGdsb2JhbCBsb2dmcCBpcyBOb25lLCB0aGUgZ2xvYmFsIGxvZ2ZpbGUgbWF5IGJlIGEgc3RyaW5nCisgICAgZ2l2aW5nIGEgZmlsZW5hbWUgdG8gb3BlbiwgaW4gYXBwZW5kIG1vZGUuICBUaGlzIGZpbGUgc2hvdWxkIGJlCisgICAgd29ybGQgd3JpdGFibGUhISEgIElmIHRoZSBmaWxlIGNhbid0IGJlIG9wZW5lZCwgbG9nZ2luZyBpcworICAgIHNpbGVudGx5IGRpc2FibGVkIChzaW5jZSB0aGVyZSBpcyBubyBzYWZlIHBsYWNlIHdoZXJlIHdlIGNvdWxkCisgICAgc2VuZCBhbiBlcnJvciBtZXNzYWdlKS4KKworICAgICIiIgorICAgIGdsb2JhbCBsb2dmcCwgbG9nCisgICAgaWYgbG9nZmlsZSBhbmQgbm90IGxvZ2ZwOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2dmcCA9IG9wZW4obG9nZmlsZSwgImEiKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICBpZiBub3QgbG9nZnA6CisgICAgICAgIGxvZyA9IG5vbG9nCisgICAgZWxzZToKKyAgICAgICAgbG9nID0gZG9sb2cKKyAgICBsb2coKmFsbGFyZ3MpCisKK2RlZiBkb2xvZyhmbXQsICphcmdzKToKKyAgICAiIiJXcml0ZSBhIGxvZyBtZXNzYWdlIHRvIHRoZSBsb2cgZmlsZS4gIFNlZSBpbml0bG9nKCkgZm9yIGRvY3MuIiIiCisgICAgbG9nZnAud3JpdGUoZm10JWFyZ3MgKyAiXG4iKQorCitkZWYgbm9sb2coKmFsbGFyZ3MpOgorICAgICIiIkR1bW15IGZ1bmN0aW9uLCBhc3NpZ25lZCB0byBsb2cgd2hlbiBsb2dnaW5nIGlzIGRpc2FibGVkLiIiIgorICAgIHBhc3MKKworbG9nID0gaW5pdGxvZyAgICAgICAgICAgIyBUaGUgY3VycmVudCBsb2dnaW5nIGZ1bmN0aW9uCisKKworIyBQYXJzaW5nIGZ1bmN0aW9ucworIyA9PT09PT09PT09PT09PT09PQorCisjIE1heGltdW0gaW5wdXQgd2Ugd2lsbCBhY2NlcHQgd2hlbiBSRVFVRVNUX01FVEhPRCBpcyBQT1NUCisjIDAgPT0+IHVubGltaXRlZCBpbnB1dAorbWF4bGVuID0gMAorCitkZWYgcGFyc2UoZnA9Tm9uZSwgZW52aXJvbj1vcy5lbnZpcm9uLCBrZWVwX2JsYW5rX3ZhbHVlcz0wLCBzdHJpY3RfcGFyc2luZz0wKToKKyAgICAiIiJQYXJzZSBhIHF1ZXJ5IGluIHRoZSBlbnZpcm9ubWVudCBvciBmcm9tIGEgZmlsZSAoZGVmYXVsdCBzdGRpbikKKworICAgICAgICBBcmd1bWVudHMsIGFsbCBvcHRpb25hbDoKKworICAgICAgICBmcCAgICAgICAgICAgICAgOiBmaWxlIHBvaW50ZXI7IGRlZmF1bHQ6IHN5cy5zdGRpbgorCisgICAgICAgIGVudmlyb24gICAgICAgICA6IGVudmlyb25tZW50IGRpY3Rpb25hcnk7IGRlZmF1bHQ6IG9zLmVudmlyb24KKworICAgICAgICBrZWVwX2JsYW5rX3ZhbHVlczogZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYmxhbmsgdmFsdWVzIGluCisgICAgICAgICAgICBwZXJjZW50LWVuY29kZWQgZm9ybXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYmxhbmsgc3RyaW5ncy4KKyAgICAgICAgICAgIEEgdHJ1ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBibGFua3Mgc2hvdWxkIGJlIHJldGFpbmVkIGFzCisgICAgICAgICAgICBibGFuayBzdHJpbmdzLiAgVGhlIGRlZmF1bHQgZmFsc2UgdmFsdWUgaW5kaWNhdGVzIHRoYXQKKyAgICAgICAgICAgIGJsYW5rIHZhbHVlcyBhcmUgdG8gYmUgaWdub3JlZCBhbmQgdHJlYXRlZCBhcyBpZiB0aGV5IHdlcmUKKyAgICAgICAgICAgIG5vdCBpbmNsdWRlZC4KKworICAgICAgICBzdHJpY3RfcGFyc2luZzogZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gZG8gd2l0aCBwYXJzaW5nIGVycm9ycy4KKyAgICAgICAgICAgIElmIGZhbHNlICh0aGUgZGVmYXVsdCksIGVycm9ycyBhcmUgc2lsZW50bHkgaWdub3JlZC4KKyAgICAgICAgICAgIElmIHRydWUsIGVycm9ycyByYWlzZSBhIFZhbHVlRXJyb3IgZXhjZXB0aW9uLgorICAgICIiIgorICAgIGlmIGZwIGlzIE5vbmU6CisgICAgICAgIGZwID0gc3lzLnN0ZGluCisgICAgaWYgbm90ICdSRVFVRVNUX01FVEhPRCcgaW4gZW52aXJvbjoKKyAgICAgICAgZW52aXJvblsnUkVRVUVTVF9NRVRIT0QnXSA9ICdHRVQnICAgICAgICMgRm9yIHRlc3Rpbmcgc3RhbmQtYWxvbmUKKyAgICBpZiBlbnZpcm9uWydSRVFVRVNUX01FVEhPRCddID09ICdQT1NUJzoKKyAgICAgICAgY3R5cGUsIHBkaWN0ID0gcGFyc2VfaGVhZGVyKGVudmlyb25bJ0NPTlRFTlRfVFlQRSddKQorICAgICAgICBpZiBjdHlwZSA9PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YSc6CisgICAgICAgICAgICByZXR1cm4gcGFyc2VfbXVsdGlwYXJ0KGZwLCBwZGljdCkKKyAgICAgICAgZWxpZiBjdHlwZSA9PSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJzoKKyAgICAgICAgICAgIGNsZW5ndGggPSBpbnQoZW52aXJvblsnQ09OVEVOVF9MRU5HVEgnXSkKKyAgICAgICAgICAgIGlmIG1heGxlbiBhbmQgY2xlbmd0aCA+IG1heGxlbjoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnTWF4aW11bSBjb250ZW50IGxlbmd0aCBleGNlZWRlZCcKKyAgICAgICAgICAgIHFzID0gZnAucmVhZChjbGVuZ3RoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcXMgPSAnJyAgICAgICAgICAgICAgICAgICAgICMgVW5rbm93biBjb250ZW50LXR5cGUKKyAgICAgICAgaWYgJ1FVRVJZX1NUUklORycgaW4gZW52aXJvbjoKKyAgICAgICAgICAgIGlmIHFzOiBxcyA9IHFzICsgJyYnCisgICAgICAgICAgICBxcyA9IHFzICsgZW52aXJvblsnUVVFUllfU1RSSU5HJ10KKyAgICAgICAgZWxpZiBzeXMuYXJndlsxOl06CisgICAgICAgICAgICBpZiBxczogcXMgPSBxcyArICcmJworICAgICAgICAgICAgcXMgPSBxcyArIHN5cy5hcmd2WzFdCisgICAgICAgIGVudmlyb25bJ1FVRVJZX1NUUklORyddID0gcXMgICAgIyBYWFggU2hvdWxkbid0LCByZWFsbHkKKyAgICBlbGlmICdRVUVSWV9TVFJJTkcnIGluIGVudmlyb246CisgICAgICAgIHFzID0gZW52aXJvblsnUVVFUllfU1RSSU5HJ10KKyAgICBlbHNlOgorICAgICAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgICAgICBxcyA9IHN5cy5hcmd2WzFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBxcyA9ICIiCisgICAgICAgIGVudmlyb25bJ1FVRVJZX1NUUklORyddID0gcXMgICAgIyBYWFggU2hvdWxkbid0LCByZWFsbHkKKyAgICByZXR1cm4gdXJscGFyc2UucGFyc2VfcXMocXMsIGtlZXBfYmxhbmtfdmFsdWVzLCBzdHJpY3RfcGFyc2luZykKKworCisjIHBhcnNlIHF1ZXJ5IHN0cmluZyBmdW5jdGlvbiBjYWxsZWQgZnJvbSB1cmxwYXJzZSwKKyMgdGhpcyBpcyBkb25lIGluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkIGNvbXBhdGlibGl0eS4KKworZGVmIHBhcnNlX3FzKHFzLCBrZWVwX2JsYW5rX3ZhbHVlcz0wLCBzdHJpY3RfcGFyc2luZz0wKToKKyAgICAiIiJQYXJzZSBhIHF1ZXJ5IGdpdmVuIGFzIGEgc3RyaW5nIGFyZ3VtZW50LiIiIgorICAgIHdhcm4oImNnaS5wYXJzZV9xcyBpcyBkZXByZWNhdGVkLCB1c2UgdXJscGFyc2UucGFyc2VfcXMgaW5zdGVhZCIsCisgICAgICAgICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgIHJldHVybiB1cmxwYXJzZS5wYXJzZV9xcyhxcywga2VlcF9ibGFua192YWx1ZXMsIHN0cmljdF9wYXJzaW5nKQorCisKK2RlZiBwYXJzZV9xc2wocXMsIGtlZXBfYmxhbmtfdmFsdWVzPTAsIHN0cmljdF9wYXJzaW5nPTApOgorICAgICIiIlBhcnNlIGEgcXVlcnkgZ2l2ZW4gYXMgYSBzdHJpbmcgYXJndW1lbnQuIiIiCisgICAgd2FybigiY2dpLnBhcnNlX3FzbCBpcyBkZXByZWNhdGVkLCB1c2UgdXJscGFyc2UucGFyc2VfcXNsIGluc3RlYWQiLAorICAgICAgICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgMikKKyAgICByZXR1cm4gdXJscGFyc2UucGFyc2VfcXNsKHFzLCBrZWVwX2JsYW5rX3ZhbHVlcywgc3RyaWN0X3BhcnNpbmcpCisKK2RlZiBwYXJzZV9tdWx0aXBhcnQoZnAsIHBkaWN0KToKKyAgICAiIiJQYXJzZSBtdWx0aXBhcnQgaW5wdXQuCisKKyAgICBBcmd1bWVudHM6CisgICAgZnAgICA6IGlucHV0IGZpbGUKKyAgICBwZGljdDogZGljdGlvbmFyeSBjb250YWluaW5nIG90aGVyIHBhcmFtZXRlcnMgb2YgY29udGVudC10eXBlIGhlYWRlcgorCisgICAgUmV0dXJucyBhIGRpY3Rpb25hcnkganVzdCBsaWtlIHBhcnNlX3FzKCk6IGtleXMgYXJlIHRoZSBmaWVsZCBuYW1lcywgZWFjaAorICAgIHZhbHVlIGlzIGEgbGlzdCBvZiB2YWx1ZXMgZm9yIHRoYXQgZmllbGQuICBUaGlzIGlzIGVhc3kgdG8gdXNlIGJ1dCBub3QKKyAgICBtdWNoIGdvb2QgaWYgeW91IGFyZSBleHBlY3RpbmcgbWVnYWJ5dGVzIHRvIGJlIHVwbG9hZGVkIC0tIGluIHRoYXQgY2FzZSwKKyAgICB1c2UgdGhlIEZpZWxkU3RvcmFnZSBjbGFzcyBpbnN0ZWFkIHdoaWNoIGlzIG11Y2ggbW9yZSBmbGV4aWJsZS4gIE5vdGUKKyAgICB0aGF0IGNvbnRlbnQtdHlwZSBpcyB0aGUgcmF3LCB1bnBhcnNlZCBjb250ZW50cyBvZiB0aGUgY29udGVudC10eXBlCisgICAgaGVhZGVyLgorCisgICAgWFhYIFRoaXMgZG9lcyBub3QgcGFyc2UgbmVzdGVkIG11bHRpcGFydCBwYXJ0cyAtLSB1c2UgRmllbGRTdG9yYWdlIGZvcgorICAgIHRoYXQuCisKKyAgICBYWFggVGhpcyBzaG91bGQgcmVhbGx5IGJlIHN1YnN1bWVkIGJ5IEZpZWxkU3RvcmFnZSBhbHRvZ2V0aGVyIC0tIG5vCisgICAgcG9pbnQgaW4gaGF2aW5nIHR3byBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHNhbWUgcGFyc2luZyBhbGdvcml0aG0uCisgICAgQWxzbywgRmllbGRTdG9yYWdlIHByb3RlY3RzIGl0c2VsZiBiZXR0ZXIgYWdhaW5zdCBjZXJ0YWluIERvUyBhdHRhY2tzCisgICAgYnkgbGltaXRpbmcgdGhlIHNpemUgb2YgdGhlIGRhdGEgcmVhZCBpbiBvbmUgY2h1bmsuICBUaGUgQVBJIGhlcmUKKyAgICBkb2VzIG5vdCBzdXBwb3J0IHRoYXQga2luZCBvZiBwcm90ZWN0aW9uLiAgVGhpcyBhbHNvIGFmZmVjdHMgcGFyc2UoKQorICAgIHNpbmNlIGl0IGNhbiBjYWxsIHBhcnNlX211bHRpcGFydCgpLgorCisgICAgIiIiCisgICAgYm91bmRhcnkgPSAiIgorICAgIGlmICdib3VuZGFyeScgaW4gcGRpY3Q6CisgICAgICAgIGJvdW5kYXJ5ID0gcGRpY3RbJ2JvdW5kYXJ5J10KKyAgICBpZiBub3QgdmFsaWRfYm91bmRhcnkoYm91bmRhcnkpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAgKCdJbnZhbGlkIGJvdW5kYXJ5IGluIG11bHRpcGFydCBmb3JtOiAlcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChib3VuZGFyeSwpKQorCisgICAgbmV4dHBhcnQgPSAiLS0iICsgYm91bmRhcnkKKyAgICBsYXN0cGFydCA9ICItLSIgKyBib3VuZGFyeSArICItLSIKKyAgICBwYXJ0ZGljdCA9IHt9CisgICAgdGVybWluYXRvciA9ICIiCisKKyAgICB3aGlsZSB0ZXJtaW5hdG9yICE9IGxhc3RwYXJ0OgorICAgICAgICBieXRlcyA9IC0xCisgICAgICAgIGRhdGEgPSBOb25lCisgICAgICAgIGlmIHRlcm1pbmF0b3I6CisgICAgICAgICAgICAjIEF0IHN0YXJ0IG9mIG5leHQgcGFydC4gIFJlYWQgaGVhZGVycyBmaXJzdC4KKyAgICAgICAgICAgIGhlYWRlcnMgPSBtaW1ldG9vbHMuTWVzc2FnZShmcCkKKyAgICAgICAgICAgIGNsZW5ndGggPSBoZWFkZXJzLmdldGhlYWRlcignY29udGVudC1sZW5ndGgnKQorICAgICAgICAgICAgaWYgY2xlbmd0aDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzID0gaW50KGNsZW5ndGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIGJ5dGVzID4gMDoKKyAgICAgICAgICAgICAgICBpZiBtYXhsZW4gYW5kIGJ5dGVzID4gbWF4bGVuOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnTWF4aW11bSBjb250ZW50IGxlbmd0aCBleGNlZWRlZCcKKyAgICAgICAgICAgICAgICBkYXRhID0gZnAucmVhZChieXRlcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGF0YSA9ICIiCisgICAgICAgICMgUmVhZCBsaW5lcyB1bnRpbCBlbmQgb2YgcGFydC4KKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHRlcm1pbmF0b3IgPSBsYXN0cGFydCAjIEVuZCBvdXRlciBsb29wCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGxpbmVbOjJdID09ICItLSI6CisgICAgICAgICAgICAgICAgdGVybWluYXRvciA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgICAgIGlmIHRlcm1pbmF0b3IgaW4gKG5leHRwYXJ0LCBsYXN0cGFydCk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgIyBEb25lIHdpdGggcGFydC4KKyAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgYnl0ZXMgPCAwOgorICAgICAgICAgICAgaWYgbGluZXM6CisgICAgICAgICAgICAgICAgIyBTdHJpcCBmaW5hbCBsaW5lIHRlcm1pbmF0b3IKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZXNbLTFdCisgICAgICAgICAgICAgICAgaWYgbGluZVstMjpdID09ICJcclxuIjoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0yXQorICAgICAgICAgICAgICAgIGVsaWYgbGluZVstMTpdID09ICJcbiI6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgICAgICAgICBsaW5lc1stMV0gPSBsaW5lCisgICAgICAgICAgICAgICAgZGF0YSA9ICIiLmpvaW4obGluZXMpCisgICAgICAgIGxpbmUgPSBoZWFkZXJzWydjb250ZW50LWRpc3Bvc2l0aW9uJ10KKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBrZXksIHBhcmFtcyA9IHBhcnNlX2hlYWRlcihsaW5lKQorICAgICAgICBpZiBrZXkgIT0gJ2Zvcm0tZGF0YSc6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiAnbmFtZScgaW4gcGFyYW1zOgorICAgICAgICAgICAgbmFtZSA9IHBhcmFtc1snbmFtZSddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBuYW1lIGluIHBhcnRkaWN0OgorICAgICAgICAgICAgcGFydGRpY3RbbmFtZV0uYXBwZW5kKGRhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJ0ZGljdFtuYW1lXSA9IFtkYXRhXQorCisgICAgcmV0dXJuIHBhcnRkaWN0CisKKworZGVmIF9wYXJzZXBhcmFtKHMpOgorICAgIHdoaWxlIHNbOjFdID09ICc7JzoKKyAgICAgICAgcyA9IHNbMTpdCisgICAgICAgIGVuZCA9IHMuZmluZCgnOycpCisgICAgICAgIHdoaWxlIGVuZCA+IDAgYW5kIChzLmNvdW50KCciJywgMCwgZW5kKSAtIHMuY291bnQoJ1xcIicsIDAsIGVuZCkpICUgMjoKKyAgICAgICAgICAgIGVuZCA9IHMuZmluZCgnOycsIGVuZCArIDEpCisgICAgICAgIGlmIGVuZCA8IDA6CisgICAgICAgICAgICBlbmQgPSBsZW4ocykKKyAgICAgICAgZiA9IHNbOmVuZF0KKyAgICAgICAgeWllbGQgZi5zdHJpcCgpCisgICAgICAgIHMgPSBzW2VuZDpdCisKK2RlZiBwYXJzZV9oZWFkZXIobGluZSk6CisgICAgIiIiUGFyc2UgYSBDb250ZW50LXR5cGUgbGlrZSBoZWFkZXIuCisKKyAgICBSZXR1cm4gdGhlIG1haW4gY29udGVudC10eXBlIGFuZCBhIGRpY3Rpb25hcnkgb2Ygb3B0aW9ucy4KKworICAgICIiIgorICAgIHBhcnRzID0gX3BhcnNlcGFyYW0oJzsnICsgbGluZSkKKyAgICBrZXkgPSBwYXJ0cy5uZXh0KCkKKyAgICBwZGljdCA9IHt9CisgICAgZm9yIHAgaW4gcGFydHM6CisgICAgICAgIGkgPSBwLmZpbmQoJz0nKQorICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICBuYW1lID0gcFs6aV0uc3RyaXAoKS5sb3dlcigpCisgICAgICAgICAgICB2YWx1ZSA9IHBbaSsxOl0uc3RyaXAoKQorICAgICAgICAgICAgaWYgbGVuKHZhbHVlKSA+PSAyIGFuZCB2YWx1ZVswXSA9PSB2YWx1ZVstMV0gPT0gJyInOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbMTotMV0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ1xcXFwnLCAnXFwnKS5yZXBsYWNlKCdcXCInLCAnIicpCisgICAgICAgICAgICBwZGljdFtuYW1lXSA9IHZhbHVlCisgICAgcmV0dXJuIGtleSwgcGRpY3QKKworCisjIENsYXNzZXMgZm9yIGZpZWxkIHN0b3JhZ2UKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBNaW5pRmllbGRTdG9yYWdlOgorCisgICAgIiIiTGlrZSBGaWVsZFN0b3JhZ2UsIGZvciB1c2Ugd2hlbiBubyBmaWxlIHVwbG9hZHMgYXJlIHBvc3NpYmxlLiIiIgorCisgICAgIyBEdW1teSBhdHRyaWJ1dGVzCisgICAgZmlsZW5hbWUgPSBOb25lCisgICAgbGlzdCA9IE5vbmUKKyAgICB0eXBlID0gTm9uZQorICAgIGZpbGUgPSBOb25lCisgICAgdHlwZV9vcHRpb25zID0ge30KKyAgICBkaXNwb3NpdGlvbiA9IE5vbmUKKyAgICBkaXNwb3NpdGlvbl9vcHRpb25zID0ge30KKyAgICBoZWFkZXJzID0ge30KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgICIiIkNvbnN0cnVjdG9yIGZyb20gZmllbGQgbmFtZSBhbmQgdmFsdWUuIiIiCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgICMgc2VsZi5maWxlID0gU3RyaW5nSU8odmFsdWUpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiBwcmludGFibGUgcmVwcmVzZW50YXRpb24uIiIiCisgICAgICAgIHJldHVybiAiTWluaUZpZWxkU3RvcmFnZSglciwgJXIpIiAlIChzZWxmLm5hbWUsIHNlbGYudmFsdWUpCisKKworY2xhc3MgRmllbGRTdG9yYWdlOgorCisgICAgIiIiU3RvcmUgYSBzZXF1ZW5jZSBvZiBmaWVsZHMsIHJlYWRpbmcgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KKworICAgIFRoaXMgY2xhc3MgcHJvdmlkZXMgbmFtaW5nLCB0eXBpbmcsIGZpbGVzIHN0b3JlZCBvbiBkaXNrLCBhbmQKKyAgICBtb3JlLiAgQXQgdGhlIHRvcCBsZXZlbCwgaXQgaXMgYWNjZXNzaWJsZSBsaWtlIGEgZGljdGlvbmFyeSwgd2hvc2UKKyAgICBrZXlzIGFyZSB0aGUgZmllbGQgbmFtZXMuICAoTm90ZTogTm9uZSBjYW4gb2NjdXIgYXMgYSBmaWVsZCBuYW1lLikKKyAgICBUaGUgaXRlbXMgYXJlIGVpdGhlciBhIFB5dGhvbiBsaXN0IChpZiB0aGVyZSdzIG11bHRpcGxlIHZhbHVlcykgb3IKKyAgICBhbm90aGVyIEZpZWxkU3RvcmFnZSBvciBNaW5pRmllbGRTdG9yYWdlIG9iamVjdC4gIElmIGl0J3MgYSBzaW5nbGUKKyAgICBvYmplY3QsIGl0IGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisKKyAgICBuYW1lOiB0aGUgZmllbGQgbmFtZSwgaWYgc3BlY2lmaWVkOyBvdGhlcndpc2UgTm9uZQorCisgICAgZmlsZW5hbWU6IHRoZSBmaWxlbmFtZSwgaWYgc3BlY2lmaWVkOyBvdGhlcndpc2UgTm9uZTsgdGhpcyBpcyB0aGUKKyAgICAgICAgY2xpZW50IHNpZGUgZmlsZW5hbWUsICpub3QqIHRoZSBmaWxlIG5hbWUgb24gd2hpY2ggaXQgaXMKKyAgICAgICAgc3RvcmVkICh0aGF0J3MgYSB0ZW1wb3JhcnkgZmlsZSB5b3UgZG9uJ3QgZGVhbCB3aXRoKQorCisgICAgdmFsdWU6IHRoZSB2YWx1ZSBhcyBhICpzdHJpbmcqOyBmb3IgZmlsZSB1cGxvYWRzLCB0aGlzCisgICAgICAgIHRyYW5zcGFyZW50bHkgcmVhZHMgdGhlIGZpbGUgZXZlcnkgdGltZSB5b3UgcmVxdWVzdCB0aGUgdmFsdWUKKworICAgIGZpbGU6IHRoZSBmaWxlKC1saWtlKSBvYmplY3QgZnJvbSB3aGljaCB5b3UgY2FuIHJlYWQgdGhlIGRhdGE7CisgICAgICAgIE5vbmUgaWYgdGhlIGRhdGEgaXMgc3RvcmVkIGEgc2ltcGxlIHN0cmluZworCisgICAgdHlwZTogdGhlIGNvbnRlbnQtdHlwZSwgb3IgTm9uZSBpZiBub3Qgc3BlY2lmaWVkCisKKyAgICB0eXBlX29wdGlvbnM6IGRpY3Rpb25hcnkgb2Ygb3B0aW9ucyBzcGVjaWZpZWQgb24gdGhlIGNvbnRlbnQtdHlwZQorICAgICAgICBsaW5lCisKKyAgICBkaXNwb3NpdGlvbjogY29udGVudC1kaXNwb3NpdGlvbiwgb3IgTm9uZSBpZiBub3Qgc3BlY2lmaWVkCisKKyAgICBkaXNwb3NpdGlvbl9vcHRpb25zOiBkaWN0aW9uYXJ5IG9mIGNvcnJlc3BvbmRpbmcgb3B0aW9ucworCisgICAgaGVhZGVyczogYSBkaWN0aW9uYXJ5KC1saWtlKSBvYmplY3QgKHNvbWV0aW1lcyByZmM4MjIuTWVzc2FnZSBvciBhCisgICAgICAgIHN1YmNsYXNzIHRoZXJlb2YpIGNvbnRhaW5pbmcgKmFsbCogaGVhZGVycworCisgICAgVGhlIGNsYXNzIGlzIHN1YmNsYXNzYWJsZSwgbW9zdGx5IGZvciB0aGUgcHVycG9zZSBvZiBvdmVycmlkaW5nCisgICAgdGhlIG1ha2VfZmlsZSgpIG1ldGhvZCwgd2hpY2ggaXMgY2FsbGVkIGludGVybmFsbHkgdG8gY29tZSB1cCB3aXRoCisgICAgYSBmaWxlIG9wZW4gZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvCisgICAgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY2hvaWNlIG9mIHN0b3JpbmcgYWxsIGZpbGVzIGluIGEgdGVtcG9yYXJ5CisgICAgZGlyZWN0b3J5IGFuZCB1bmxpbmtpbmcgdGhlbSBhcyBzb29uIGFzIHRoZXkgaGF2ZSBiZWVuIG9wZW5lZC4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZwPU5vbmUsIGhlYWRlcnM9Tm9uZSwgb3V0ZXJib3VuZGFyeT0iIiwKKyAgICAgICAgICAgICAgICAgZW52aXJvbj1vcy5lbnZpcm9uLCBrZWVwX2JsYW5rX3ZhbHVlcz0wLCBzdHJpY3RfcGFyc2luZz0wKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuICBSZWFkIG11bHRpcGFydC8qIHVudGlsIGxhc3QgcGFydC4KKworICAgICAgICBBcmd1bWVudHMsIGFsbCBvcHRpb25hbDoKKworICAgICAgICBmcCAgICAgICAgICAgICAgOiBmaWxlIHBvaW50ZXI7IGRlZmF1bHQ6IHN5cy5zdGRpbgorICAgICAgICAgICAgKG5vdCB1c2VkIHdoZW4gdGhlIHJlcXVlc3QgbWV0aG9kIGlzIEdFVCkKKworICAgICAgICBoZWFkZXJzICAgICAgICAgOiBoZWFkZXIgZGljdGlvbmFyeS1saWtlIG9iamVjdDsgZGVmYXVsdDoKKyAgICAgICAgICAgIHRha2VuIGZyb20gZW52aXJvbiBhcyBwZXIgQ0dJIHNwZWMKKworICAgICAgICBvdXRlcmJvdW5kYXJ5ICAgOiB0ZXJtaW5hdGluZyBtdWx0aXBhcnQgYm91bmRhcnkKKyAgICAgICAgICAgIChmb3IgaW50ZXJuYWwgdXNlIG9ubHkpCisKKyAgICAgICAgZW52aXJvbiAgICAgICAgIDogZW52aXJvbm1lbnQgZGljdGlvbmFyeTsgZGVmYXVsdDogb3MuZW52aXJvbgorCisgICAgICAgIGtlZXBfYmxhbmtfdmFsdWVzOiBmbGFnIGluZGljYXRpbmcgd2hldGhlciBibGFuayB2YWx1ZXMgaW4KKyAgICAgICAgICAgIHBlcmNlbnQtZW5jb2RlZCBmb3JtcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBibGFuayBzdHJpbmdzLgorICAgICAgICAgICAgQSB0cnVlIHZhbHVlIGluZGljYXRlcyB0aGF0IGJsYW5rcyBzaG91bGQgYmUgcmV0YWluZWQgYXMKKyAgICAgICAgICAgIGJsYW5rIHN0cmluZ3MuICBUaGUgZGVmYXVsdCBmYWxzZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdAorICAgICAgICAgICAgYmxhbmsgdmFsdWVzIGFyZSB0byBiZSBpZ25vcmVkIGFuZCB0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZQorICAgICAgICAgICAgbm90IGluY2x1ZGVkLgorCisgICAgICAgIHN0cmljdF9wYXJzaW5nOiBmbGFnIGluZGljYXRpbmcgd2hhdCB0byBkbyB3aXRoIHBhcnNpbmcgZXJyb3JzLgorICAgICAgICAgICAgSWYgZmFsc2UgKHRoZSBkZWZhdWx0KSwgZXJyb3JzIGFyZSBzaWxlbnRseSBpZ25vcmVkLgorICAgICAgICAgICAgSWYgdHJ1ZSwgZXJyb3JzIHJhaXNlIGEgVmFsdWVFcnJvciBleGNlcHRpb24uCisKKyAgICAgICAgIiIiCisgICAgICAgIG1ldGhvZCA9ICdHRVQnCisgICAgICAgIHNlbGYua2VlcF9ibGFua192YWx1ZXMgPSBrZWVwX2JsYW5rX3ZhbHVlcworICAgICAgICBzZWxmLnN0cmljdF9wYXJzaW5nID0gc3RyaWN0X3BhcnNpbmcKKyAgICAgICAgaWYgJ1JFUVVFU1RfTUVUSE9EJyBpbiBlbnZpcm9uOgorICAgICAgICAgICAgbWV0aG9kID0gZW52aXJvblsnUkVRVUVTVF9NRVRIT0QnXS51cHBlcigpCisgICAgICAgIHNlbGYucXNfb25fcG9zdCA9IE5vbmUKKyAgICAgICAgaWYgbWV0aG9kID09ICdHRVQnIG9yIG1ldGhvZCA9PSAnSEVBRCc6CisgICAgICAgICAgICBpZiAnUVVFUllfU1RSSU5HJyBpbiBlbnZpcm9uOgorICAgICAgICAgICAgICAgIHFzID0gZW52aXJvblsnUVVFUllfU1RSSU5HJ10KKyAgICAgICAgICAgIGVsaWYgc3lzLmFyZ3ZbMTpdOgorICAgICAgICAgICAgICAgIHFzID0gc3lzLmFyZ3ZbMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcXMgPSAiIgorICAgICAgICAgICAgZnAgPSBTdHJpbmdJTyhxcykKKyAgICAgICAgICAgIGlmIGhlYWRlcnMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBoZWFkZXJzID0geydjb250ZW50LXR5cGUnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9CisgICAgICAgIGlmIGhlYWRlcnMgaXMgTm9uZToKKyAgICAgICAgICAgIGhlYWRlcnMgPSB7fQorICAgICAgICAgICAgaWYgbWV0aG9kID09ICdQT1NUJzoKKyAgICAgICAgICAgICAgICAjIFNldCBkZWZhdWx0IGNvbnRlbnQtdHlwZSBmb3IgUE9TVCB0byB3aGF0J3MgdHJhZGl0aW9uYWwKKyAgICAgICAgICAgICAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiCisgICAgICAgICAgICBpZiAnQ09OVEVOVF9UWVBFJyBpbiBlbnZpcm9uOgorICAgICAgICAgICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gZW52aXJvblsnQ09OVEVOVF9UWVBFJ10KKyAgICAgICAgICAgIGlmICdRVUVSWV9TVFJJTkcnIGluIGVudmlyb246CisgICAgICAgICAgICAgICAgc2VsZi5xc19vbl9wb3N0ID0gZW52aXJvblsnUVVFUllfU1RSSU5HJ10KKyAgICAgICAgICAgIGlmICdDT05URU5UX0xFTkdUSCcgaW4gZW52aXJvbjoKKyAgICAgICAgICAgICAgICBoZWFkZXJzWydjb250ZW50LWxlbmd0aCddID0gZW52aXJvblsnQ09OVEVOVF9MRU5HVEgnXQorICAgICAgICBzZWxmLmZwID0gZnAgb3Igc3lzLnN0ZGluCisgICAgICAgIHNlbGYuaGVhZGVycyA9IGhlYWRlcnMKKyAgICAgICAgc2VsZi5vdXRlcmJvdW5kYXJ5ID0gb3V0ZXJib3VuZGFyeQorCisgICAgICAgICMgUHJvY2VzcyBjb250ZW50LWRpc3Bvc2l0aW9uIGhlYWRlcgorICAgICAgICBjZGlzcCwgcGRpY3QgPSAiIiwge30KKyAgICAgICAgaWYgJ2NvbnRlbnQtZGlzcG9zaXRpb24nIGluIHNlbGYuaGVhZGVyczoKKyAgICAgICAgICAgIGNkaXNwLCBwZGljdCA9IHBhcnNlX2hlYWRlcihzZWxmLmhlYWRlcnNbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSkKKyAgICAgICAgc2VsZi5kaXNwb3NpdGlvbiA9IGNkaXNwCisgICAgICAgIHNlbGYuZGlzcG9zaXRpb25fb3B0aW9ucyA9IHBkaWN0CisgICAgICAgIHNlbGYubmFtZSA9IE5vbmUKKyAgICAgICAgaWYgJ25hbWUnIGluIHBkaWN0OgorICAgICAgICAgICAgc2VsZi5uYW1lID0gcGRpY3RbJ25hbWUnXQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gTm9uZQorICAgICAgICBpZiAnZmlsZW5hbWUnIGluIHBkaWN0OgorICAgICAgICAgICAgc2VsZi5maWxlbmFtZSA9IHBkaWN0WydmaWxlbmFtZSddCisKKyAgICAgICAgIyBQcm9jZXNzIGNvbnRlbnQtdHlwZSBoZWFkZXIKKyAgICAgICAgIworICAgICAgICAjIEhvbm9yIGFueSBleGlzdGluZyBjb250ZW50LXR5cGUgaGVhZGVyLiAgQnV0IGlmIHRoZXJlIGlzIG5vCisgICAgICAgICMgY29udGVudC10eXBlIGhlYWRlciwgdXNlIHNvbWUgc2Vuc2libGUgZGVmYXVsdHMuICBBc3N1bWUKKyAgICAgICAgIyBvdXRlcmJvdW5kYXJ5IGlzICIiIGF0IHRoZSBvdXRlciBsZXZlbCwgYnV0IHNvbWV0aGluZyBub24tZmFsc2UKKyAgICAgICAgIyBpbnNpZGUgYSBtdWx0aS1wYXJ0LiAgVGhlIGRlZmF1bHQgZm9yIGFuIGlubmVyIHBhcnQgaXMgdGV4dC9wbGFpbiwKKyAgICAgICAgIyBidXQgZm9yIGFuIG91dGVyIHBhcnQgaXQgc2hvdWxkIGJlIHVybGVuY29kZWQuICBUaGlzIHNob3VsZCBjYXRjaAorICAgICAgICAjIGJvZ3VzIGNsaWVudHMgd2hpY2ggZXJyb25lb3VzbHkgZm9yZ2V0IHRvIGluY2x1ZGUgYSBjb250ZW50LXR5cGUKKyAgICAgICAgIyBoZWFkZXIuCisgICAgICAgICMKKyAgICAgICAgIyBTZWUgYmVsb3cgZm9yIHdoYXQgd2UgZG8gaWYgdGhlcmUgZG9lcyBleGlzdCBhIGNvbnRlbnQtdHlwZSBoZWFkZXIsCisgICAgICAgICMgYnV0IGl0IGhhcHBlbnMgdG8gYmUgc29tZXRoaW5nIHdlIGRvbid0IHVuZGVyc3RhbmQuCisgICAgICAgIGlmICdjb250ZW50LXR5cGUnIGluIHNlbGYuaGVhZGVyczoKKyAgICAgICAgICAgIGN0eXBlLCBwZGljdCA9IHBhcnNlX2hlYWRlcihzZWxmLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddKQorICAgICAgICBlbGlmIHNlbGYub3V0ZXJib3VuZGFyeSBvciBtZXRob2QgIT0gJ1BPU1QnOgorICAgICAgICAgICAgY3R5cGUsIHBkaWN0ID0gInRleHQvcGxhaW4iLCB7fQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3R5cGUsIHBkaWN0ID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsIHt9CisgICAgICAgIHNlbGYudHlwZSA9IGN0eXBlCisgICAgICAgIHNlbGYudHlwZV9vcHRpb25zID0gcGRpY3QKKyAgICAgICAgc2VsZi5pbm5lcmJvdW5kYXJ5ID0gIiIKKyAgICAgICAgaWYgJ2JvdW5kYXJ5JyBpbiBwZGljdDoKKyAgICAgICAgICAgIHNlbGYuaW5uZXJib3VuZGFyeSA9IHBkaWN0Wydib3VuZGFyeSddCisgICAgICAgIGNsZW4gPSAtMQorICAgICAgICBpZiAnY29udGVudC1sZW5ndGgnIGluIHNlbGYuaGVhZGVyczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbGVuID0gaW50KHNlbGYuaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIG1heGxlbiBhbmQgY2xlbiA+IG1heGxlbjoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnTWF4aW11bSBjb250ZW50IGxlbmd0aCBleGNlZWRlZCcKKyAgICAgICAgc2VsZi5sZW5ndGggPSBjbGVuCisKKyAgICAgICAgc2VsZi5saXN0ID0gc2VsZi5maWxlID0gTm9uZQorICAgICAgICBzZWxmLmRvbmUgPSAwCisgICAgICAgIGlmIGN0eXBlID09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOgorICAgICAgICAgICAgc2VsZi5yZWFkX3VybGVuY29kZWQoKQorICAgICAgICBlbGlmIGN0eXBlWzoxMF0gPT0gJ211bHRpcGFydC8nOgorICAgICAgICAgICAgc2VsZi5yZWFkX211bHRpKGVudmlyb24sIGtlZXBfYmxhbmtfdmFsdWVzLCBzdHJpY3RfcGFyc2luZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucmVhZF9zaW5nbGUoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBwcmludGFibGUgcmVwcmVzZW50YXRpb24uIiIiCisgICAgICAgIHJldHVybiAiRmllbGRTdG9yYWdlKCVyLCAlciwgJXIpIiAlICgKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYuZmlsZW5hbWUsIHNlbGYudmFsdWUpCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBpdGVyKHNlbGYua2V5cygpKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBuYW1lICE9ICd2YWx1ZSc6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgbmFtZQorICAgICAgICBpZiBzZWxmLmZpbGU6CisgICAgICAgICAgICBzZWxmLmZpbGUuc2VlaygwKQorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmZpbGUucmVhZCgpCisgICAgICAgICAgICBzZWxmLmZpbGUuc2VlaygwKQorICAgICAgICBlbGlmIHNlbGYubGlzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5saXN0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWx1ZSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgIiIiRGljdGlvbmFyeSBzdHlsZSBpbmRleGluZy4iIiIKKyAgICAgICAgaWYgc2VsZi5saXN0IGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJub3QgaW5kZXhhYmxlIgorICAgICAgICBmb3VuZCA9IFtdCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYubGlzdDoKKyAgICAgICAgICAgIGlmIGl0ZW0ubmFtZSA9PSBrZXk6IGZvdW5kLmFwcGVuZChpdGVtKQorICAgICAgICBpZiBub3QgZm91bmQ6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvciwga2V5CisgICAgICAgIGlmIGxlbihmb3VuZCkgPT0gMToKKyAgICAgICAgICAgIHJldHVybiBmb3VuZFswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGZvdW5kCisKKyAgICBkZWYgZ2V0dmFsdWUoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAiIiJEaWN0aW9uYXJ5IHN0eWxlIGdldCgpIG1ldGhvZCwgaW5jbHVkaW5nICd2YWx1ZScgbG9va3VwLiIiIgorICAgICAgICBpZiBrZXkgaW4gc2VsZjoKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZltrZXldCisgICAgICAgICAgICBpZiB0eXBlKHZhbHVlKSBpcyB0eXBlKFtdKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwKGF0dHJnZXR0ZXIoJ3ZhbHVlJyksIHZhbHVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CisKKyAgICBkZWYgZ2V0Zmlyc3Qoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAiIiIgUmV0dXJuIHRoZSBmaXJzdCB2YWx1ZSByZWNlaXZlZC4iIiIKKyAgICAgICAgaWYga2V5IGluIHNlbGY6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGZba2V5XQorICAgICAgICAgICAgaWYgdHlwZSh2YWx1ZSkgaXMgdHlwZShbXSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlWzBdLnZhbHVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworICAgIGRlZiBnZXRsaXN0KHNlbGYsIGtleSk6CisgICAgICAgICIiIiBSZXR1cm4gbGlzdCBvZiByZWNlaXZlZCB2YWx1ZXMuIiIiCisgICAgICAgIGlmIGtleSBpbiBzZWxmOgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmW2tleV0KKyAgICAgICAgICAgIGlmIHR5cGUodmFsdWUpIGlzIHR5cGUoW10pOgorICAgICAgICAgICAgICAgIHJldHVybiBtYXAoYXR0cmdldHRlcigndmFsdWUnKSwgdmFsdWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBbdmFsdWUudmFsdWVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gW10KKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAiIiJEaWN0aW9uYXJ5IHN0eWxlIGtleXMoKSBtZXRob2QuIiIiCisgICAgICAgIGlmIHNlbGYubGlzdCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAibm90IGluZGV4YWJsZSIKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2V0KGl0ZW0ubmFtZSBmb3IgaXRlbSBpbiBzZWxmLmxpc3QpKQorCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgIiIiRGljdGlvbmFyeSBzdHlsZSBoYXNfa2V5KCkgbWV0aG9kLiIiIgorICAgICAgICBpZiBzZWxmLmxpc3QgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIm5vdCBpbmRleGFibGUiCisgICAgICAgIHJldHVybiBhbnkoaXRlbS5uYW1lID09IGtleSBmb3IgaXRlbSBpbiBzZWxmLmxpc3QpCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgICIiIkRpY3Rpb25hcnkgc3R5bGUgX19jb250YWluc19fIG1ldGhvZC4iIiIKKyAgICAgICAgaWYgc2VsZi5saXN0IGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJub3QgaW5kZXhhYmxlIgorICAgICAgICByZXR1cm4gYW55KGl0ZW0ubmFtZSA9PSBrZXkgZm9yIGl0ZW0gaW4gc2VsZi5saXN0KQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICIiIkRpY3Rpb25hcnkgc3R5bGUgbGVuKHgpIHN1cHBvcnQuIiIiCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5rZXlzKCkpCisKKyAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYubGlzdCkKKworICAgIGRlZiByZWFkX3VybGVuY29kZWQoc2VsZik6CisgICAgICAgICIiIkludGVybmFsOiByZWFkIGRhdGEgaW4gcXVlcnkgc3RyaW5nIGZvcm1hdC4iIiIKKyAgICAgICAgcXMgPSBzZWxmLmZwLnJlYWQoc2VsZi5sZW5ndGgpCisgICAgICAgIGlmIHNlbGYucXNfb25fcG9zdDoKKyAgICAgICAgICAgIHFzICs9ICcmJyArIHNlbGYucXNfb25fcG9zdAorICAgICAgICBzZWxmLmxpc3QgPSBsaXN0ID0gW10KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gdXJscGFyc2UucGFyc2VfcXNsKHFzLCBzZWxmLmtlZXBfYmxhbmtfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmljdF9wYXJzaW5nKToKKyAgICAgICAgICAgIGxpc3QuYXBwZW5kKE1pbmlGaWVsZFN0b3JhZ2Uoa2V5LCB2YWx1ZSkpCisgICAgICAgIHNlbGYuc2tpcF9saW5lcygpCisKKyAgICBGaWVsZFN0b3JhZ2VDbGFzcyA9IE5vbmUKKworICAgIGRlZiByZWFkX211bHRpKHNlbGYsIGVudmlyb24sIGtlZXBfYmxhbmtfdmFsdWVzLCBzdHJpY3RfcGFyc2luZyk6CisgICAgICAgICIiIkludGVybmFsOiByZWFkIGEgcGFydCB0aGF0IGlzIGl0c2VsZiBtdWx0aXBhcnQuIiIiCisgICAgICAgIGliID0gc2VsZi5pbm5lcmJvdW5kYXJ5CisgICAgICAgIGlmIG5vdCB2YWxpZF9ib3VuZGFyeShpYik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnSW52YWxpZCBib3VuZGFyeSBpbiBtdWx0aXBhcnQgZm9ybTogJXInICUgKGliLCkKKyAgICAgICAgc2VsZi5saXN0ID0gW10KKyAgICAgICAgaWYgc2VsZi5xc19vbl9wb3N0OgorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gdXJscGFyc2UucGFyc2VfcXNsKHNlbGYucXNfb25fcG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5rZWVwX2JsYW5rX3ZhbHVlcywgc2VsZi5zdHJpY3RfcGFyc2luZyk6CisgICAgICAgICAgICAgICAgc2VsZi5saXN0LmFwcGVuZChNaW5pRmllbGRTdG9yYWdlKGtleSwgdmFsdWUpKQorICAgICAgICAgICAgRmllbGRTdG9yYWdlQ2xhc3MgPSBOb25lCisKKyAgICAgICAga2xhc3MgPSBzZWxmLkZpZWxkU3RvcmFnZUNsYXNzIG9yIHNlbGYuX19jbGFzc19fCisgICAgICAgIHBhcnQgPSBrbGFzcyhzZWxmLmZwLCB7fSwgaWIsCisgICAgICAgICAgICAgICAgICAgICBlbnZpcm9uLCBrZWVwX2JsYW5rX3ZhbHVlcywgc3RyaWN0X3BhcnNpbmcpCisgICAgICAgICMgVGhyb3cgZmlyc3QgcGFydCBhd2F5CisgICAgICAgIHdoaWxlIG5vdCBwYXJ0LmRvbmU6CisgICAgICAgICAgICBoZWFkZXJzID0gcmZjODIyLk1lc3NhZ2Uoc2VsZi5mcCkKKyAgICAgICAgICAgIHBhcnQgPSBrbGFzcyhzZWxmLmZwLCBoZWFkZXJzLCBpYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9uLCBrZWVwX2JsYW5rX3ZhbHVlcywgc3RyaWN0X3BhcnNpbmcpCisgICAgICAgICAgICBzZWxmLmxpc3QuYXBwZW5kKHBhcnQpCisgICAgICAgIHNlbGYuc2tpcF9saW5lcygpCisKKyAgICBkZWYgcmVhZF9zaW5nbGUoc2VsZik6CisgICAgICAgICIiIkludGVybmFsOiByZWFkIGFuIGF0b21pYyBwYXJ0LiIiIgorICAgICAgICBpZiBzZWxmLmxlbmd0aCA+PSAwOgorICAgICAgICAgICAgc2VsZi5yZWFkX2JpbmFyeSgpCisgICAgICAgICAgICBzZWxmLnNraXBfbGluZXMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yZWFkX2xpbmVzKCkKKyAgICAgICAgc2VsZi5maWxlLnNlZWsoMCkKKworICAgIGJ1ZnNpemUgPSA4KjEwMjQgICAgICAgICAgICAjIEkvTyBidWZmZXJpbmcgc2l6ZSBmb3IgY29weSB0byBmaWxlCisKKyAgICBkZWYgcmVhZF9iaW5hcnkoc2VsZik6CisgICAgICAgICIiIkludGVybmFsOiByZWFkIGJpbmFyeSBkYXRhLiIiIgorICAgICAgICBzZWxmLmZpbGUgPSBzZWxmLm1ha2VfZmlsZSgnYicpCisgICAgICAgIHRvZG8gPSBzZWxmLmxlbmd0aAorICAgICAgICBpZiB0b2RvID49IDA6CisgICAgICAgICAgICB3aGlsZSB0b2RvID4gMDoKKyAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5mcC5yZWFkKG1pbih0b2RvLCBzZWxmLmJ1ZnNpemUpKQorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRvbmUgPSAtMQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuZmlsZS53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIHRvZG8gPSB0b2RvIC0gbGVuKGRhdGEpCisKKyAgICBkZWYgcmVhZF9saW5lcyhzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHJlYWQgbGluZXMgdW50aWwgRU9GIG9yIG91dGVyYm91bmRhcnkuIiIiCisgICAgICAgIHNlbGYuZmlsZSA9IHNlbGYuX19maWxlID0gU3RyaW5nSU8oKQorICAgICAgICBpZiBzZWxmLm91dGVyYm91bmRhcnk6CisgICAgICAgICAgICBzZWxmLnJlYWRfbGluZXNfdG9fb3V0ZXJib3VuZGFyeSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJlYWRfbGluZXNfdG9fZW9mKCkKKworICAgIGRlZiBfX3dyaXRlKHNlbGYsIGxpbmUpOgorICAgICAgICBpZiBzZWxmLl9fZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuX19maWxlLnRlbGwoKSArIGxlbihsaW5lKSA+IDEwMDA6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlID0gc2VsZi5tYWtlX2ZpbGUoJycpCisgICAgICAgICAgICAgICAgc2VsZi5maWxlLndyaXRlKHNlbGYuX19maWxlLmdldHZhbHVlKCkpCisgICAgICAgICAgICAgICAgc2VsZi5fX2ZpbGUgPSBOb25lCisgICAgICAgIHNlbGYuZmlsZS53cml0ZShsaW5lKQorCisgICAgZGVmIHJlYWRfbGluZXNfdG9fZW9mKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbDogcmVhZCBsaW5lcyB1bnRpbCBFT0YuIiIiCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5mcC5yZWFkbGluZSgxPDwxNikKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYuZG9uZSA9IC0xCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuX193cml0ZShsaW5lKQorCisgICAgZGVmIHJlYWRfbGluZXNfdG9fb3V0ZXJib3VuZGFyeShzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHJlYWQgbGluZXMgdW50aWwgb3V0ZXJib3VuZGFyeS4iIiIKKyAgICAgICAgbmV4dCA9ICItLSIgKyBzZWxmLm91dGVyYm91bmRhcnkKKyAgICAgICAgbGFzdCA9IG5leHQgKyAiLS0iCisgICAgICAgIGRlbGltID0gIiIKKyAgICAgICAgbGFzdF9saW5lX2xmZW5kID0gVHJ1ZQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IHNlbGYuZnAucmVhZGxpbmUoMTw8MTYpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBzZWxmLmRvbmUgPSAtMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lWzoyXSA9PSAiLS0iIGFuZCBsYXN0X2xpbmVfbGZlbmQ6CisgICAgICAgICAgICAgICAgc3RyaXBwZWRsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgICAgICAgICAgaWYgc3RyaXBwZWRsaW5lID09IG5leHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgc3RyaXBwZWRsaW5lID09IGxhc3Q6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZG9uZSA9IDEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG9kZWxpbSA9IGRlbGltCisgICAgICAgICAgICBpZiBsaW5lWy0yOl0gPT0gIlxyXG4iOgorICAgICAgICAgICAgICAgIGRlbGltID0gIlxyXG4iCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0yXQorICAgICAgICAgICAgICAgIGxhc3RfbGluZV9sZmVuZCA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgbGluZVstMV0gPT0gIlxuIjoKKyAgICAgICAgICAgICAgICBkZWxpbSA9ICJcbiIKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCisgICAgICAgICAgICAgICAgbGFzdF9saW5lX2xmZW5kID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWxpbSA9ICIiCisgICAgICAgICAgICAgICAgbGFzdF9saW5lX2xmZW5kID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuX193cml0ZShvZGVsaW0gKyBsaW5lKQorCisgICAgZGVmIHNraXBfbGluZXMoc2VsZik6CisgICAgICAgICIiIkludGVybmFsOiBza2lwIGxpbmVzIHVudGlsIG91dGVyIGJvdW5kYXJ5IGlmIGRlZmluZWQuIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLm91dGVyYm91bmRhcnkgb3Igc2VsZi5kb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG5leHQgPSAiLS0iICsgc2VsZi5vdXRlcmJvdW5kYXJ5CisgICAgICAgIGxhc3QgPSBuZXh0ICsgIi0tIgorICAgICAgICBsYXN0X2xpbmVfbGZlbmQgPSBUcnVlCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5mcC5yZWFkbGluZSgxPDwxNikKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYuZG9uZSA9IC0xCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGxpbmVbOjJdID09ICItLSIgYW5kIGxhc3RfbGluZV9sZmVuZDoKKyAgICAgICAgICAgICAgICBzdHJpcHBlZGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBzdHJpcHBlZGxpbmUgPT0gbmV4dDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBzdHJpcHBlZGxpbmUgPT0gbGFzdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kb25lID0gMQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgbGFzdF9saW5lX2xmZW5kID0gbGluZS5lbmRzd2l0aCgnXG4nKQorCisgICAgZGVmIG1ha2VfZmlsZShzZWxmLCBiaW5hcnk9Tm9uZSk6CisgICAgICAgICIiIk92ZXJyaWRhYmxlOiByZXR1cm4gYSByZWFkYWJsZSAmIHdyaXRhYmxlIGZpbGUuCisKKyAgICAgICAgVGhlIGZpbGUgd2lsbCBiZSB1c2VkIGFzIGZvbGxvd3M6CisgICAgICAgIC0gZGF0YSBpcyB3cml0dGVuIHRvIGl0CisgICAgICAgIC0gc2VlaygwKQorICAgICAgICAtIGRhdGEgaXMgcmVhZCBmcm9tIGl0CisKKyAgICAgICAgVGhlICdiaW5hcnknIGFyZ3VtZW50IGlzIHVudXNlZCAtLSB0aGUgZmlsZSBpcyBhbHdheXMgb3BlbmVkCisgICAgICAgIGluIGJpbmFyeSBtb2RlLgorCisgICAgICAgIFRoaXMgdmVyc2lvbiBvcGVucyBhIHRlbXBvcmFyeSBmaWxlIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLAorICAgICAgICBhbmQgaW1tZWRpYXRlbHkgZGVsZXRlcyAodW5saW5rcykgaXQuICBUaGUgdHJpY2sgKG9uIFVuaXghKSBpcworICAgICAgICB0aGF0IHRoZSBmaWxlIGNhbiBzdGlsbCBiZSB1c2VkLCBidXQgaXQgY2FuJ3QgYmUgb3BlbmVkIGJ5CisgICAgICAgIGFub3RoZXIgcHJvY2VzcywgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBiZSBkZWxldGVkIHdoZW4gaXQKKyAgICAgICAgaXMgY2xvc2VkIG9yIHdoZW4gdGhlIGN1cnJlbnQgcHJvY2VzcyB0ZXJtaW5hdGVzLgorCisgICAgICAgIElmIHlvdSB3YW50IGEgbW9yZSBwZXJtYW5lbnQgZmlsZSwgeW91IGRlcml2ZSBhIGNsYXNzIHdoaWNoCisgICAgICAgIG92ZXJyaWRlcyB0aGlzIG1ldGhvZC4gIElmIHlvdSB3YW50IGEgdmlzaWJsZSB0ZW1wb3JhcnkgZmlsZQorICAgICAgICB0aGF0IGlzIG5ldmVydGhlbGVzcyBhdXRvbWF0aWNhbGx5IGRlbGV0ZWQgd2hlbiB0aGUgc2NyaXB0CisgICAgICAgIHRlcm1pbmF0ZXMsIHRyeSBkZWZpbmluZyBhIF9fZGVsX18gbWV0aG9kIGluIGEgZGVyaXZlZCBjbGFzcworICAgICAgICB3aGljaCB1bmxpbmtzIHRoZSB0ZW1wb3JhcnkgZmlsZXMgeW91IGhhdmUgY3JlYXRlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IHRlbXBmaWxlCisgICAgICAgIHJldHVybiB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCJ3K2IiKQorCisKKworIyBCYWNrd2FyZHMgQ29tcGF0aWJpbGl0eSBDbGFzc2VzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgRm9ybUNvbnRlbnREaWN0KFVzZXJEaWN0LlVzZXJEaWN0KToKKyAgICAiIiJGb3JtIGNvbnRlbnQgYXMgZGljdGlvbmFyeSB3aXRoIGEgbGlzdCBvZiB2YWx1ZXMgcGVyIGZpZWxkLgorCisgICAgZm9ybSA9IEZvcm1Db250ZW50RGljdCgpCisKKyAgICBmb3JtW2tleV0gLT4gW3ZhbHVlLCB2YWx1ZSwgLi4uXQorICAgIGtleSBpbiBmb3JtIC0+IEJvb2xlYW4KKyAgICBmb3JtLmtleXMoKSAtPiBba2V5LCBrZXksIC4uLl0KKyAgICBmb3JtLnZhbHVlcygpIC0+IFtbdmFsLCB2YWwsIC4uLl0sIFt2YWwsIHZhbCwgLi4uXSwgLi4uXQorICAgIGZvcm0uaXRlbXMoKSAtPiAgWyhrZXksIFt2YWwsIHZhbCwgLi4uXSksIChrZXksIFt2YWwsIHZhbCwgLi4uXSksIC4uLl0KKyAgICBmb3JtLmRpY3QgPT0ge2tleTogW3ZhbCwgdmFsLCAuLi5dLCAuLi59CisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZW52aXJvbj1vcy5lbnZpcm9uLCBrZWVwX2JsYW5rX3ZhbHVlcz0wLCBzdHJpY3RfcGFyc2luZz0wKToKKyAgICAgICAgc2VsZi5kaWN0ID0gc2VsZi5kYXRhID0gcGFyc2UoZW52aXJvbj1lbnZpcm9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwX2JsYW5rX3ZhbHVlcz1rZWVwX2JsYW5rX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0X3BhcnNpbmc9c3RyaWN0X3BhcnNpbmcpCisgICAgICAgIHNlbGYucXVlcnlfc3RyaW5nID0gZW52aXJvblsnUVVFUllfU1RSSU5HJ10KKworCitjbGFzcyBTdkZvcm1Db250ZW50RGljdChGb3JtQ29udGVudERpY3QpOgorICAgICIiIkZvcm0gY29udGVudCBhcyBkaWN0aW9uYXJ5IGV4cGVjdGluZyBhIHNpbmdsZSB2YWx1ZSBwZXIgZmllbGQuCisKKyAgICBJZiB5b3Ugb25seSBleHBlY3QgYSBzaW5nbGUgdmFsdWUgZm9yIGVhY2ggZmllbGQsIHRoZW4gZm9ybVtrZXldCisgICAgd2lsbCByZXR1cm4gdGhhdCBzaW5nbGUgdmFsdWUuICBJdCB3aWxsIHJhaXNlIGFuIEluZGV4RXJyb3IgaWYKKyAgICB0aGF0IGV4cGVjdGF0aW9uIGlzIG5vdCB0cnVlLiAgSWYgeW91IGV4cGVjdCBhIGZpZWxkIHRvIGhhdmUKKyAgICBwb3NzaWJsZSBtdWx0aXBsZSB2YWx1ZXMsIHRoYW4geW91IGNhbiB1c2UgZm9ybS5nZXRsaXN0KGtleSkgdG8KKyAgICBnZXQgYWxsIG9mIHRoZSB2YWx1ZXMuICB2YWx1ZXMoKSBhbmQgaXRlbXMoKSBhcmUgYSBjb21wcm9taXNlOgorICAgIHRoZXkgcmV0dXJuIHNpbmdsZSBzdHJpbmdzIHdoZXJlIHRoZXJlIGlzIGEgc2luZ2xlIHZhbHVlLCBhbmQKKyAgICBsaXN0cyBvZiBzdHJpbmdzIG90aGVyd2lzZS4KKworICAgICIiIgorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBsZW4oc2VsZi5kaWN0W2tleV0pID4gMToKKyAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IsICdleHBlY3RpbmcgYSBzaW5nbGUgdmFsdWUnCisgICAgICAgIHJldHVybiBzZWxmLmRpY3Rba2V5XVswXQorICAgIGRlZiBnZXRsaXN0KHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBzZWxmLmRpY3Rba2V5XQorICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciB2YWx1ZSBpbiBzZWxmLmRpY3QudmFsdWVzKCk6CisgICAgICAgICAgICBpZiBsZW4odmFsdWUpID09IDE6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh2YWx1ZVswXSkKKyAgICAgICAgICAgIGVsc2U6IHJlc3VsdC5hcHBlbmQodmFsdWUpCisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuZGljdC5pdGVtcygpOgorICAgICAgICAgICAgaWYgbGVuKHZhbHVlKSA9PSAxOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKGtleSwgdmFsdWVbMF0pKQorICAgICAgICAgICAgZWxzZTogcmVzdWx0LmFwcGVuZCgoa2V5LCB2YWx1ZSkpCisgICAgICAgIHJldHVybiByZXN1bHQKKworCitjbGFzcyBJbnRlcnBGb3JtQ29udGVudERpY3QoU3ZGb3JtQ29udGVudERpY3QpOgorICAgICIiIlRoaXMgY2xhc3MgaXMgcHJlc2VudCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seS4iIiIKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgdiA9IFN2Rm9ybUNvbnRlbnREaWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKKyAgICAgICAgaWYgdlswXSBpbiAnMDEyMzQ1Njc4OSstLic6CisgICAgICAgICAgICB0cnk6IHJldHVybiBpbnQodikKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHRyeTogcmV0dXJuIGZsb2F0KHYpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgcmV0dXJuIHYuc3RyaXAoKQorICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzZWxmW2tleV0pCisgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHNlbGYuZGljdFtrZXldKQorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5cygpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKGtleSwgc2VsZltrZXldKSkKKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKGtleSwgc2VsZi5kaWN0W2tleV0pKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKworY2xhc3MgRm9ybUNvbnRlbnQoRm9ybUNvbnRlbnREaWN0KToKKyAgICAiIiJUaGlzIGNsYXNzIGlzIHByZXNlbnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHkuIiIiCisgICAgZGVmIHZhbHVlcyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBrZXkgaW4gc2VsZi5kaWN0IDpyZXR1cm4gc2VsZi5kaWN0W2tleV0KKyAgICAgICAgZWxzZTogcmV0dXJuIE5vbmUKKyAgICBkZWYgaW5kZXhlZF92YWx1ZShzZWxmLCBrZXksIGxvY2F0aW9uKToKKyAgICAgICAgaWYga2V5IGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmRpY3Rba2V5XSkgPiBsb2NhdGlvbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kaWN0W2tleV1bbG9jYXRpb25dCisgICAgICAgICAgICBlbHNlOiByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOiByZXR1cm4gTm9uZQorICAgIGRlZiB2YWx1ZShzZWxmLCBrZXkpOgorICAgICAgICBpZiBrZXkgaW4gc2VsZi5kaWN0OiByZXR1cm4gc2VsZi5kaWN0W2tleV1bMF0KKyAgICAgICAgZWxzZTogcmV0dXJuIE5vbmUKKyAgICBkZWYgbGVuZ3RoKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5kaWN0W2tleV0pCisgICAgZGVmIHN0cmlwcGVkKHNlbGYsIGtleSk6CisgICAgICAgIGlmIGtleSBpbiBzZWxmLmRpY3Q6IHJldHVybiBzZWxmLmRpY3Rba2V5XVswXS5zdHJpcCgpCisgICAgICAgIGVsc2U6IHJldHVybiBOb25lCisgICAgZGVmIHBhcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRpY3QKKworCisjIFRlc3QvZGVidWcgY29kZQorIyA9PT09PT09PT09PT09PT0KKworZGVmIHRlc3QoZW52aXJvbj1vcy5lbnZpcm9uKToKKyAgICAiIiJSb2J1c3QgdGVzdCBDR0kgc2NyaXB0LCB1c2FibGUgYXMgbWFpbiBwcm9ncmFtLgorCisgICAgV3JpdGUgbWluaW1hbCBIVFRQIGhlYWRlcnMgYW5kIGR1bXAgYWxsIGluZm9ybWF0aW9uIHByb3ZpZGVkIHRvCisgICAgdGhlIHNjcmlwdCBpbiBIVE1MIGZvcm0uCisKKyAgICAiIiIKKyAgICBwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWwiCisgICAgcHJpbnQKKyAgICBzeXMuc3RkZXJyID0gc3lzLnN0ZG91dAorICAgIHRyeToKKyAgICAgICAgZm9ybSA9IEZpZWxkU3RvcmFnZSgpICAgIyBSZXBsYWNlIHdpdGggb3RoZXIgY2xhc3NlcyB0byB0ZXN0IHRob3NlCisgICAgICAgIHByaW50X2RpcmVjdG9yeSgpCisgICAgICAgIHByaW50X2FyZ3VtZW50cygpCisgICAgICAgIHByaW50X2Zvcm0oZm9ybSkKKyAgICAgICAgcHJpbnRfZW52aXJvbihlbnZpcm9uKQorICAgICAgICBwcmludF9lbnZpcm9uX3VzYWdlKCkKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGV4ZWMgInRlc3RpbmcgcHJpbnRfZXhjZXB0aW9uKCkgLS0gPEk+aXRhbGljcz88L0k+IgorICAgICAgICBkZWYgZyhmPWYpOgorICAgICAgICAgICAgZigpCisgICAgICAgIHByaW50ICI8SDM+V2hhdCBmb2xsb3dzIGlzIGEgdGVzdCwgbm90IGFuIGFjdHVhbCBleGNlcHRpb246PC9IMz4iCisgICAgICAgIGcoKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcHJpbnRfZXhjZXB0aW9uKCkKKworICAgIHByaW50ICI8SDE+U2Vjb25kIHRyeSB3aXRoIGEgc21hbGwgbWF4bGVuLi4uPC9IMT4iCisKKyAgICBnbG9iYWwgbWF4bGVuCisgICAgbWF4bGVuID0gNTAKKyAgICB0cnk6CisgICAgICAgIGZvcm0gPSBGaWVsZFN0b3JhZ2UoKSAgICMgUmVwbGFjZSB3aXRoIG90aGVyIGNsYXNzZXMgdG8gdGVzdCB0aG9zZQorICAgICAgICBwcmludF9kaXJlY3RvcnkoKQorICAgICAgICBwcmludF9hcmd1bWVudHMoKQorICAgICAgICBwcmludF9mb3JtKGZvcm0pCisgICAgICAgIHByaW50X2Vudmlyb24oZW52aXJvbikKKyAgICBleGNlcHQ6CisgICAgICAgIHByaW50X2V4Y2VwdGlvbigpCisKK2RlZiBwcmludF9leGNlcHRpb24odHlwZT1Ob25lLCB2YWx1ZT1Ob25lLCB0Yj1Ob25lLCBsaW1pdD1Ob25lKToKKyAgICBpZiB0eXBlIGlzIE5vbmU6CisgICAgICAgIHR5cGUsIHZhbHVlLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgaW1wb3J0IHRyYWNlYmFjaworICAgIHByaW50CisgICAgcHJpbnQgIjxIMz5UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6PC9IMz4iCisgICAgbGlzdCA9IHRyYWNlYmFjay5mb3JtYXRfdGIodGIsIGxpbWl0KSArIFwKKyAgICAgICAgICAgdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seSh0eXBlLCB2YWx1ZSkKKyAgICBwcmludCAiPFBSRT4lczxCPiVzPC9CPjwvUFJFPiIgJSAoCisgICAgICAgIGVzY2FwZSgiIi5qb2luKGxpc3RbOi0xXSkpLAorICAgICAgICBlc2NhcGUobGlzdFstMV0pLAorICAgICAgICApCisgICAgZGVsIHRiCisKK2RlZiBwcmludF9lbnZpcm9uKGVudmlyb249b3MuZW52aXJvbik6CisgICAgIiIiRHVtcCB0aGUgc2hlbGwgZW52aXJvbm1lbnQgYXMgSFRNTC4iIiIKKyAgICBrZXlzID0gZW52aXJvbi5rZXlzKCkKKyAgICBrZXlzLnNvcnQoKQorICAgIHByaW50CisgICAgcHJpbnQgIjxIMz5TaGVsbCBFbnZpcm9ubWVudDo8L0gzPiIKKyAgICBwcmludCAiPERMPiIKKyAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgIHByaW50ICI8RFQ+IiwgZXNjYXBlKGtleSksICI8REQ+IiwgZXNjYXBlKGVudmlyb25ba2V5XSkKKyAgICBwcmludCAiPC9ETD4iCisgICAgcHJpbnQKKworZGVmIHByaW50X2Zvcm0oZm9ybSk6CisgICAgIiIiRHVtcCB0aGUgY29udGVudHMgb2YgYSBmb3JtIGFzIEhUTUwuIiIiCisgICAga2V5cyA9IGZvcm0ua2V5cygpCisgICAga2V5cy5zb3J0KCkKKyAgICBwcmludAorICAgIHByaW50ICI8SDM+Rm9ybSBDb250ZW50czo8L0gzPiIKKyAgICBpZiBub3Qga2V5czoKKyAgICAgICAgcHJpbnQgIjxQPk5vIGZvcm0gZmllbGRzLiIKKyAgICBwcmludCAiPERMPiIKKyAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgIHByaW50ICI8RFQ+IiArIGVzY2FwZShrZXkpICsgIjoiLAorICAgICAgICB2YWx1ZSA9IGZvcm1ba2V5XQorICAgICAgICBwcmludCAiPGk+IiArIGVzY2FwZShyZXByKHR5cGUodmFsdWUpKSkgKyAiPC9pPiIKKyAgICAgICAgcHJpbnQgIjxERD4iICsgZXNjYXBlKHJlcHIodmFsdWUpKQorICAgIHByaW50ICI8L0RMPiIKKyAgICBwcmludAorCitkZWYgcHJpbnRfZGlyZWN0b3J5KCk6CisgICAgIiIiRHVtcCB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXMgSFRNTC4iIiIKKyAgICBwcmludAorICAgIHByaW50ICI8SDM+Q3VycmVudCBXb3JraW5nIERpcmVjdG9yeTo8L0gzPiIKKyAgICB0cnk6CisgICAgICAgIHB3ZCA9IG9zLmdldGN3ZCgpCisgICAgZXhjZXB0IG9zLmVycm9yLCBtc2c6CisgICAgICAgIHByaW50ICJvcy5lcnJvcjoiLCBlc2NhcGUoc3RyKG1zZykpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgZXNjYXBlKHB3ZCkKKyAgICBwcmludAorCitkZWYgcHJpbnRfYXJndW1lbnRzKCk6CisgICAgcHJpbnQKKyAgICBwcmludCAiPEgzPkNvbW1hbmQgTGluZSBBcmd1bWVudHM6PC9IMz4iCisgICAgcHJpbnQKKyAgICBwcmludCBzeXMuYXJndgorICAgIHByaW50CisKK2RlZiBwcmludF9lbnZpcm9uX3VzYWdlKCk6CisgICAgIiIiRHVtcCBhIGxpc3Qgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgYnkgQ0dJIGFzIEhUTUwuIiIiCisgICAgcHJpbnQgIiIiCis8SDM+VGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNvdWxkIGhhdmUgYmVlbiBzZXQ6PC9IMz4KKzxVTD4KKzxMST5BVVRIX1RZUEUKKzxMST5DT05URU5UX0xFTkdUSAorPExJPkNPTlRFTlRfVFlQRQorPExJPkRBVEVfR01UCis8TEk+REFURV9MT0NBTAorPExJPkRPQ1VNRU5UX05BTUUKKzxMST5ET0NVTUVOVF9ST09UCis8TEk+RE9DVU1FTlRfVVJJCis8TEk+R0FURVdBWV9JTlRFUkZBQ0UKKzxMST5MQVNUX01PRElGSUVECis8TEk+UEFUSAorPExJPlBBVEhfSU5GTworPExJPlBBVEhfVFJBTlNMQVRFRAorPExJPlFVRVJZX1NUUklORworPExJPlJFTU9URV9BRERSCis8TEk+UkVNT1RFX0hPU1QKKzxMST5SRU1PVEVfSURFTlQKKzxMST5SRU1PVEVfVVNFUgorPExJPlJFUVVFU1RfTUVUSE9ECis8TEk+U0NSSVBUX05BTUUKKzxMST5TRVJWRVJfTkFNRQorPExJPlNFUlZFUl9QT1JUCis8TEk+U0VSVkVSX1BST1RPQ09MCis8TEk+U0VSVkVSX1JPT1QKKzxMST5TRVJWRVJfU09GVFdBUkUKKzwvVUw+CitJbiBhZGRpdGlvbiwgSFRUUCBoZWFkZXJzIHNlbnQgYnkgdGhlIHNlcnZlciBtYXkgYmUgcGFzc2VkIGluIHRoZQorZW52aXJvbm1lbnQgYXMgd2VsbC4gIEhlcmUgYXJlIHNvbWUgY29tbW9uIHZhcmlhYmxlIG5hbWVzOgorPFVMPgorPExJPkhUVFBfQUNDRVBUCis8TEk+SFRUUF9DT05ORUNUSU9OCis8TEk+SFRUUF9IT1NUCis8TEk+SFRUUF9QUkFHTUEKKzxMST5IVFRQX1JFRkVSRVIKKzxMST5IVFRQX1VTRVJfQUdFTlQKKzwvVUw+CisiIiIKKworCisjIFV0aWxpdGllcworIyA9PT09PT09PT0KKworZGVmIGVzY2FwZShzLCBxdW90ZT1Ob25lKToKKyAgICAnJydSZXBsYWNlIHNwZWNpYWwgY2hhcmFjdGVycyAiJiIsICI8IiBhbmQgIj4iIHRvIEhUTUwtc2FmZSBzZXF1ZW5jZXMuCisgICAgSWYgdGhlIG9wdGlvbmFsIGZsYWcgcXVvdGUgaXMgdHJ1ZSwgdGhlIHF1b3RhdGlvbiBtYXJrIGNoYXJhY3RlciAoIikKKyAgICBpcyBhbHNvIHRyYW5zbGF0ZWQuJycnCisgICAgcyA9IHMucmVwbGFjZSgiJiIsICImYW1wOyIpICMgTXVzdCBiZSBkb25lIGZpcnN0IQorICAgIHMgPSBzLnJlcGxhY2UoIjwiLCAiJmx0OyIpCisgICAgcyA9IHMucmVwbGFjZSgiPiIsICImZ3Q7IikKKyAgICBpZiBxdW90ZToKKyAgICAgICAgcyA9IHMucmVwbGFjZSgnIicsICImcXVvdDsiKQorICAgIHJldHVybiBzCisKK2RlZiB2YWxpZF9ib3VuZGFyeShzLCBfdmJfcGF0dGVybj0iXlsgLX5dezAsMjAwfVshLX5dJCIpOgorICAgIGltcG9ydCByZQorICAgIHJldHVybiByZS5tYXRjaChfdmJfcGF0dGVybiwgcykKKworIyBJbnZva2UgbWFpbmxpbmUKKyMgPT09PT09PT09PT09PT09CisKKyMgQ2FsbCB0ZXN0KCkgd2hlbiB0aGlzIGZpbGUgaXMgcnVuIGFzIGEgc2NyaXB0IChub3QgaW1wb3J0ZWQgYXMgYSBtb2R1bGUpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jZ2kucHljIGIvbGliL3B5dGhvbjIuNy9jZ2kucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNjUxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NnaS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jZ2kucHlvIGIvbGliL3B5dGhvbjIuNy9jZ2kucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNjUxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NnaS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jZ2l0Yi5weSBiL2xpYi9weXRob24yLjcvY2dpdGIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjYzRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY2dpdGIucHkKQEAgLTAsMCArMSwzMjMgQEAKKyIiIk1vcmUgY29tcHJlaGVuc2l2ZSB0cmFjZWJhY2sgZm9ybWF0dGluZyBmb3IgUHl0aG9uIHNjcmlwdHMuCisKK1RvIGVuYWJsZSB0aGlzIG1vZHVsZSwgZG86CisKKyAgICBpbXBvcnQgY2dpdGI7IGNnaXRiLmVuYWJsZSgpCisKK2F0IHRoZSB0b3Agb2YgeW91ciBzY3JpcHQuICBUaGUgb3B0aW9uYWwgYXJndW1lbnRzIHRvIGVuYWJsZSgpIGFyZToKKworICAgIGRpc3BsYXkgICAgIC0gaWYgdHJ1ZSwgdHJhY2ViYWNrcyBhcmUgZGlzcGxheWVkIGluIHRoZSB3ZWIgYnJvd3NlcgorICAgIGxvZ2RpciAgICAgIC0gaWYgc2V0LCB0cmFjZWJhY2tzIGFyZSB3cml0dGVuIHRvIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5CisgICAgY29udGV4dCAgICAgLSBudW1iZXIgb2YgbGluZXMgb2Ygc291cmNlIGNvZGUgdG8gc2hvdyBmb3IgZWFjaCBzdGFjayBmcmFtZQorICAgIGZvcm1hdCAgICAgIC0gJ3RleHQnIG9yICdodG1sJyBjb250cm9scyB0aGUgb3V0cHV0IGZvcm1hdAorCitCeSBkZWZhdWx0LCB0cmFjZWJhY2tzIGFyZSBkaXNwbGF5ZWQgYnV0IG5vdCBzYXZlZCwgdGhlIGNvbnRleHQgaXMgNSBsaW5lcworYW5kIHRoZSBvdXRwdXQgZm9ybWF0IGlzICdodG1sJyAoZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggdGhlCitvcmlnaW5hbCB1c2Ugb2YgdGhpcyBtb2R1bGUpCisKK0FsdGVybmF0aXZlbHksIGlmIHlvdSBoYXZlIGNhdWdodCBhbiBleGNlcHRpb24gYW5kIHdhbnQgY2dpdGIgdG8gZGlzcGxheSBpdAorZm9yIHlvdSwgY2FsbCBjZ2l0Yi5oYW5kbGVyKCkuICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgdG8gaGFuZGxlcigpIGlzIGEKKzMtaXRlbSB0dXBsZSAoZXR5cGUsIGV2YWx1ZSwgZXRiKSBqdXN0IGxpa2UgdGhlIHZhbHVlIG9mIHN5cy5leGNfaW5mbygpLgorVGhlIGRlZmF1bHQgaGFuZGxlciBkaXNwbGF5cyBvdXRwdXQgYXMgSFRNTC4KKworIiIiCitpbXBvcnQgaW5zcGVjdAoraW1wb3J0IGtleXdvcmQKK2ltcG9ydCBsaW5lY2FjaGUKK2ltcG9ydCBvcworaW1wb3J0IHB5ZG9jCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCitpbXBvcnQgdG9rZW5pemUKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCB0eXBlcworCitkZWYgcmVzZXQoKToKKyAgICAiIiJSZXR1cm4gYSBzdHJpbmcgdGhhdCByZXNldHMgdGhlIENHSSBhbmQgYnJvd3NlciB0byBhIGtub3duIHN0YXRlLiIiIgorICAgIHJldHVybiAnJyc8IS0tOiBzcGFtCitDb250ZW50LVR5cGU6IHRleHQvaHRtbAorCis8Ym9keSBiZ2NvbG9yPSIjZjBmMGY4Ij48Zm9udCBjb2xvcj0iI2YwZjBmOCIgc2l6ZT0iLTUiPiAtLT4KKzxib2R5IGJnY29sb3I9IiNmMGYwZjgiPjxmb250IGNvbG9yPSIjZjBmMGY4IiBzaXplPSItNSI+IC0tPiAtLT4KKzwvZm9udD4gPC9mb250PiA8L2ZvbnQ+IDwvc2NyaXB0PiA8L29iamVjdD4gPC9ibG9ja3F1b3RlPiA8L3ByZT4KKzwvdGFibGU+IDwvdGFibGU+IDwvdGFibGU+IDwvdGFibGU+IDwvdGFibGU+IDwvZm9udD4gPC9mb250PiA8L2ZvbnQ+JycnCisKK19fVU5ERUZfXyA9IFtdICAgICAgICAgICAgICAgICAgICAgICAgICAjIGEgc3BlY2lhbCBzZW50aW5lbCBvYmplY3QKK2RlZiBzbWFsbCh0ZXh0KToKKyAgICBpZiB0ZXh0OgorICAgICAgICByZXR1cm4gJzxzbWFsbD4nICsgdGV4dCArICc8L3NtYWxsPicKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gJycKKworZGVmIHN0cm9uZyh0ZXh0KToKKyAgICBpZiB0ZXh0OgorICAgICAgICByZXR1cm4gJzxzdHJvbmc+JyArIHRleHQgKyAnPC9zdHJvbmc+JworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnJworCitkZWYgZ3JleSh0ZXh0KToKKyAgICBpZiB0ZXh0OgorICAgICAgICByZXR1cm4gJzxmb250IGNvbG9yPSIjOTA5MDkwIj4nICsgdGV4dCArICc8L2ZvbnQ+JworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnJworCitkZWYgbG9va3VwKG5hbWUsIGZyYW1lLCBsb2NhbHMpOgorICAgICIiIkZpbmQgdGhlIHZhbHVlIGZvciBhIGdpdmVuIG5hbWUgaW4gdGhlIGdpdmVuIGVudmlyb25tZW50LiIiIgorICAgIGlmIG5hbWUgaW4gbG9jYWxzOgorICAgICAgICByZXR1cm4gJ2xvY2FsJywgbG9jYWxzW25hbWVdCisgICAgaWYgbmFtZSBpbiBmcmFtZS5mX2dsb2JhbHM6CisgICAgICAgIHJldHVybiAnZ2xvYmFsJywgZnJhbWUuZl9nbG9iYWxzW25hbWVdCisgICAgaWYgJ19fYnVpbHRpbnNfXycgaW4gZnJhbWUuZl9nbG9iYWxzOgorICAgICAgICBidWlsdGlucyA9IGZyYW1lLmZfZ2xvYmFsc1snX19idWlsdGluc19fJ10KKyAgICAgICAgaWYgdHlwZShidWlsdGlucykgaXMgdHlwZSh7fSk6CisgICAgICAgICAgICBpZiBuYW1lIGluIGJ1aWx0aW5zOgorICAgICAgICAgICAgICAgIHJldHVybiAnYnVpbHRpbicsIGJ1aWx0aW5zW25hbWVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBoYXNhdHRyKGJ1aWx0aW5zLCBuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2J1aWx0aW4nLCBnZXRhdHRyKGJ1aWx0aW5zLCBuYW1lKQorICAgIHJldHVybiBOb25lLCBfX1VOREVGX18KKworZGVmIHNjYW52YXJzKHJlYWRlciwgZnJhbWUsIGxvY2Fscyk6CisgICAgIiIiU2NhbiBvbmUgbG9naWNhbCBsaW5lIG9mIFB5dGhvbiBhbmQgbG9vayB1cCB2YWx1ZXMgb2YgdmFyaWFibGVzIHVzZWQuIiIiCisgICAgdmFycywgbGFzdHRva2VuLCBwYXJlbnQsIHByZWZpeCwgdmFsdWUgPSBbXSwgTm9uZSwgTm9uZSwgJycsIF9fVU5ERUZfXworICAgIGZvciB0dHlwZSwgdG9rZW4sIHN0YXJ0LCBlbmQsIGxpbmUgaW4gdG9rZW5pemUuZ2VuZXJhdGVfdG9rZW5zKHJlYWRlcik6CisgICAgICAgIGlmIHR0eXBlID09IHRva2VuaXplLk5FV0xJTkU6IGJyZWFrCisgICAgICAgIGlmIHR0eXBlID09IHRva2VuaXplLk5BTUUgYW5kIHRva2VuIG5vdCBpbiBrZXl3b3JkLmt3bGlzdDoKKyAgICAgICAgICAgIGlmIGxhc3R0b2tlbiA9PSAnLic6CisgICAgICAgICAgICAgICAgaWYgcGFyZW50IGlzIG5vdCBfX1VOREVGX186CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihwYXJlbnQsIHRva2VuLCBfX1VOREVGX18pCisgICAgICAgICAgICAgICAgICAgIHZhcnMuYXBwZW5kKChwcmVmaXggKyB0b2tlbiwgcHJlZml4LCB2YWx1ZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdoZXJlLCB2YWx1ZSA9IGxvb2t1cCh0b2tlbiwgZnJhbWUsIGxvY2FscykKKyAgICAgICAgICAgICAgICB2YXJzLmFwcGVuZCgodG9rZW4sIHdoZXJlLCB2YWx1ZSkpCisgICAgICAgIGVsaWYgdG9rZW4gPT0gJy4nOgorICAgICAgICAgICAgcHJlZml4ICs9IGxhc3R0b2tlbiArICcuJworICAgICAgICAgICAgcGFyZW50ID0gdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcmVudCwgcHJlZml4ID0gTm9uZSwgJycKKyAgICAgICAgbGFzdHRva2VuID0gdG9rZW4KKyAgICByZXR1cm4gdmFycworCitkZWYgaHRtbChlaW5mbywgY29udGV4dD01KToKKyAgICAiIiJSZXR1cm4gYSBuaWNlIEhUTUwgZG9jdW1lbnQgZGVzY3JpYmluZyBhIGdpdmVuIHRyYWNlYmFjay4iIiIKKyAgICBldHlwZSwgZXZhbHVlLCBldGIgPSBlaW5mbworICAgIGlmIHR5cGUoZXR5cGUpIGlzIHR5cGVzLkNsYXNzVHlwZToKKyAgICAgICAgZXR5cGUgPSBldHlwZS5fX25hbWVfXworICAgIHB5dmVyID0gJ1B5dGhvbiAnICsgc3lzLnZlcnNpb24uc3BsaXQoKVswXSArICc6ICcgKyBzeXMuZXhlY3V0YWJsZQorICAgIGRhdGUgPSB0aW1lLmN0aW1lKHRpbWUudGltZSgpKQorICAgIGhlYWQgPSAnPGJvZHkgYmdjb2xvcj0iI2YwZjBmOCI+JyArIHB5ZG9jLmh0bWwuaGVhZGluZygKKyAgICAgICAgJzxiaWc+PGJpZz4lczwvYmlnPjwvYmlnPicgJQorICAgICAgICBzdHJvbmcocHlkb2MuaHRtbC5lc2NhcGUoc3RyKGV0eXBlKSkpLAorICAgICAgICAnI2ZmZmZmZicsICcjNjYyMmFhJywgcHl2ZXIgKyAnPGJyPicgKyBkYXRlKSArICcnJworPHA+QSBwcm9ibGVtIG9jY3VycmVkIGluIGEgUHl0aG9uIHNjcmlwdC4gIEhlcmUgaXMgdGhlIHNlcXVlbmNlIG9mCitmdW5jdGlvbiBjYWxscyBsZWFkaW5nIHVwIHRvIHRoZSBlcnJvciwgaW4gdGhlIG9yZGVyIHRoZXkgb2NjdXJyZWQuPC9wPicnJworCisgICAgaW5kZW50ID0gJzx0dD4nICsgc21hbGwoJyZuYnNwOycgKiA1KSArICcmbmJzcDs8L3R0PicKKyAgICBmcmFtZXMgPSBbXQorICAgIHJlY29yZHMgPSBpbnNwZWN0LmdldGlubmVyZnJhbWVzKGV0YiwgY29udGV4dCkKKyAgICBmb3IgZnJhbWUsIGZpbGUsIGxudW0sIGZ1bmMsIGxpbmVzLCBpbmRleCBpbiByZWNvcmRzOgorICAgICAgICBpZiBmaWxlOgorICAgICAgICAgICAgZmlsZSA9IG9zLnBhdGguYWJzcGF0aChmaWxlKQorICAgICAgICAgICAgbGluayA9ICc8YSBocmVmPSJmaWxlOi8vJXMiPiVzPC9hPicgJSAoZmlsZSwgcHlkb2MuaHRtbC5lc2NhcGUoZmlsZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlID0gbGluayA9ICc/JworICAgICAgICBhcmdzLCB2YXJhcmdzLCB2YXJrdywgbG9jYWxzID0gaW5zcGVjdC5nZXRhcmd2YWx1ZXMoZnJhbWUpCisgICAgICAgIGNhbGwgPSAnJworICAgICAgICBpZiBmdW5jICE9ICc/JzoKKyAgICAgICAgICAgIGNhbGwgPSAnaW4gJyArIHN0cm9uZyhmdW5jKSArIFwKKyAgICAgICAgICAgICAgICBpbnNwZWN0LmZvcm1hdGFyZ3ZhbHVlcyhhcmdzLCB2YXJhcmdzLCB2YXJrdywgbG9jYWxzLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXR2YWx1ZT1sYW1iZGEgdmFsdWU6ICc9JyArIHB5ZG9jLmh0bWwucmVwcih2YWx1ZSkpCisKKyAgICAgICAgaGlnaGxpZ2h0ID0ge30KKyAgICAgICAgZGVmIHJlYWRlcihsbnVtPVtsbnVtXSk6CisgICAgICAgICAgICBoaWdobGlnaHRbbG51bVswXV0gPSAxCisgICAgICAgICAgICB0cnk6IHJldHVybiBsaW5lY2FjaGUuZ2V0bGluZShmaWxlLCBsbnVtWzBdKQorICAgICAgICAgICAgZmluYWxseTogbG51bVswXSArPSAxCisgICAgICAgIHZhcnMgPSBzY2FudmFycyhyZWFkZXIsIGZyYW1lLCBsb2NhbHMpCisKKyAgICAgICAgcm93cyA9IFsnPHRyPjx0ZCBiZ2NvbG9yPSIjZDhiYmZmIj4lcyVzICVzPC90ZD48L3RyPicgJQorICAgICAgICAgICAgICAgICgnPGJpZz4mbmJzcDs8L2JpZz4nLCBsaW5rLCBjYWxsKV0KKyAgICAgICAgaWYgaW5kZXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpID0gbG51bSAtIGluZGV4CisgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgICAgICBudW0gPSBzbWFsbCgnJm5ic3A7JyAqICg1LWxlbihzdHIoaSkpKSArIHN0cihpKSkgKyAnJm5ic3A7JworICAgICAgICAgICAgICAgIGlmIGkgaW4gaGlnaGxpZ2h0OgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gJzx0dD49Jmd0OyVzJXM8L3R0PicgJSAobnVtLCBweWRvYy5odG1sLnByZWZvcm1hdChsaW5lKSkKKyAgICAgICAgICAgICAgICAgICAgcm93cy5hcHBlbmQoJzx0cj48dGQgYmdjb2xvcj0iI2ZmY2NlZSI+JXM8L3RkPjwvdHI+JyAlIGxpbmUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9ICc8dHQ+Jm5ic3A7Jm5ic3A7JXMlczwvdHQ+JyAlIChudW0sIHB5ZG9jLmh0bWwucHJlZm9ybWF0KGxpbmUpKQorICAgICAgICAgICAgICAgICAgICByb3dzLmFwcGVuZCgnPHRyPjx0ZD4lczwvdGQ+PC90cj4nICUgZ3JleShsaW5lKSkKKyAgICAgICAgICAgICAgICBpICs9IDEKKworICAgICAgICBkb25lLCBkdW1wID0ge30sIFtdCisgICAgICAgIGZvciBuYW1lLCB3aGVyZSwgdmFsdWUgaW4gdmFyczoKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gZG9uZTogY29udGludWUKKyAgICAgICAgICAgIGRvbmVbbmFtZV0gPSAxCisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgX19VTkRFRl9fOgorICAgICAgICAgICAgICAgIGlmIHdoZXJlIGluICgnZ2xvYmFsJywgJ2J1aWx0aW4nKToKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICgnPGVtPiVzPC9lbT4gJyAlIHdoZXJlKSArIHN0cm9uZyhuYW1lKQorICAgICAgICAgICAgICAgIGVsaWYgd2hlcmUgPT0gJ2xvY2FsJzoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHN0cm9uZyhuYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB3aGVyZSArIHN0cm9uZyhuYW1lLnNwbGl0KCcuJylbLTFdKQorICAgICAgICAgICAgICAgIGR1bXAuYXBwZW5kKCclcyZuYnNwOz0gJXMnICUgKG5hbWUsIHB5ZG9jLmh0bWwucmVwcih2YWx1ZSkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkdW1wLmFwcGVuZChuYW1lICsgJyA8ZW0+dW5kZWZpbmVkPC9lbT4nKQorCisgICAgICAgIHJvd3MuYXBwZW5kKCc8dHI+PHRkPiVzPC90ZD48L3RyPicgJSBzbWFsbChncmV5KCcsICcuam9pbihkdW1wKSkpKQorICAgICAgICBmcmFtZXMuYXBwZW5kKCcnJworPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0wIGJvcmRlcj0wPgorJXM8L3RhYmxlPicnJyAlICdcbicuam9pbihyb3dzKSkKKworICAgIGV4Y2VwdGlvbiA9IFsnPHA+JXM6ICVzJyAlIChzdHJvbmcocHlkb2MuaHRtbC5lc2NhcGUoc3RyKGV0eXBlKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweWRvYy5odG1sLmVzY2FwZShzdHIoZXZhbHVlKSkpXQorICAgIGlmIGlzaW5zdGFuY2UoZXZhbHVlLCBCYXNlRXhjZXB0aW9uKToKKyAgICAgICAgZm9yIG5hbWUgaW4gZGlyKGV2YWx1ZSk6CisgICAgICAgICAgICBpZiBuYW1lWzoxXSA9PSAnXyc6IGNvbnRpbnVlCisgICAgICAgICAgICB2YWx1ZSA9IHB5ZG9jLmh0bWwucmVwcihnZXRhdHRyKGV2YWx1ZSwgbmFtZSkpCisgICAgICAgICAgICBleGNlcHRpb24uYXBwZW5kKCdcbjxicj4lcyVzJm5ic3A7PVxuJXMnICUgKGluZGVudCwgbmFtZSwgdmFsdWUpKQorCisgICAgcmV0dXJuIGhlYWQgKyAnJy5qb2luKGZyYW1lcykgKyAnJy5qb2luKGV4Y2VwdGlvbikgKyAnJycKKworCis8IS0tIFRoZSBhYm92ZSBpcyBhIGRlc2NyaXB0aW9uIG9mIGFuIGVycm9yIGluIGEgUHl0aG9uIHByb2dyYW0sIGZvcm1hdHRlZAorICAgICBmb3IgYSBXZWIgYnJvd3NlciBiZWNhdXNlIHRoZSAnY2dpdGInIG1vZHVsZSB3YXMgZW5hYmxlZC4gIEluIGNhc2UgeW91CisgICAgIGFyZSBub3QgcmVhZGluZyB0aGlzIGluIGEgV2ViIGJyb3dzZXIsIGhlcmUgaXMgdGhlIG9yaWdpbmFsIHRyYWNlYmFjazoKKworJXMKKy0tPgorJycnICUgcHlkb2MuaHRtbC5lc2NhcGUoCisgICAgICAgICAgJycuam9pbih0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbihldHlwZSwgZXZhbHVlLCBldGIpKSkKKworZGVmIHRleHQoZWluZm8sIGNvbnRleHQ9NSk6CisgICAgIiIiUmV0dXJuIGEgcGxhaW4gdGV4dCBkb2N1bWVudCBkZXNjcmliaW5nIGEgZ2l2ZW4gdHJhY2ViYWNrLiIiIgorICAgIGV0eXBlLCBldmFsdWUsIGV0YiA9IGVpbmZvCisgICAgaWYgdHlwZShldHlwZSkgaXMgdHlwZXMuQ2xhc3NUeXBlOgorICAgICAgICBldHlwZSA9IGV0eXBlLl9fbmFtZV9fCisgICAgcHl2ZXIgPSAnUHl0aG9uICcgKyBzeXMudmVyc2lvbi5zcGxpdCgpWzBdICsgJzogJyArIHN5cy5leGVjdXRhYmxlCisgICAgZGF0ZSA9IHRpbWUuY3RpbWUodGltZS50aW1lKCkpCisgICAgaGVhZCA9ICIlc1xuJXNcbiVzXG4iICUgKHN0cihldHlwZSksIHB5dmVyLCBkYXRlKSArICcnJworQSBwcm9ibGVtIG9jY3VycmVkIGluIGEgUHl0aG9uIHNjcmlwdC4gIEhlcmUgaXMgdGhlIHNlcXVlbmNlIG9mCitmdW5jdGlvbiBjYWxscyBsZWFkaW5nIHVwIHRvIHRoZSBlcnJvciwgaW4gdGhlIG9yZGVyIHRoZXkgb2NjdXJyZWQuCisnJycKKworICAgIGZyYW1lcyA9IFtdCisgICAgcmVjb3JkcyA9IGluc3BlY3QuZ2V0aW5uZXJmcmFtZXMoZXRiLCBjb250ZXh0KQorICAgIGZvciBmcmFtZSwgZmlsZSwgbG51bSwgZnVuYywgbGluZXMsIGluZGV4IGluIHJlY29yZHM6CisgICAgICAgIGZpbGUgPSBmaWxlIGFuZCBvcy5wYXRoLmFic3BhdGgoZmlsZSkgb3IgJz8nCisgICAgICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBsb2NhbHMgPSBpbnNwZWN0LmdldGFyZ3ZhbHVlcyhmcmFtZSkKKyAgICAgICAgY2FsbCA9ICcnCisgICAgICAgIGlmIGZ1bmMgIT0gJz8nOgorICAgICAgICAgICAgY2FsbCA9ICdpbiAnICsgZnVuYyArIFwKKyAgICAgICAgICAgICAgICBpbnNwZWN0LmZvcm1hdGFyZ3ZhbHVlcyhhcmdzLCB2YXJhcmdzLCB2YXJrdywgbG9jYWxzLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXR2YWx1ZT1sYW1iZGEgdmFsdWU6ICc9JyArIHB5ZG9jLnRleHQucmVwcih2YWx1ZSkpCisKKyAgICAgICAgaGlnaGxpZ2h0ID0ge30KKyAgICAgICAgZGVmIHJlYWRlcihsbnVtPVtsbnVtXSk6CisgICAgICAgICAgICBoaWdobGlnaHRbbG51bVswXV0gPSAxCisgICAgICAgICAgICB0cnk6IHJldHVybiBsaW5lY2FjaGUuZ2V0bGluZShmaWxlLCBsbnVtWzBdKQorICAgICAgICAgICAgZmluYWxseTogbG51bVswXSArPSAxCisgICAgICAgIHZhcnMgPSBzY2FudmFycyhyZWFkZXIsIGZyYW1lLCBsb2NhbHMpCisKKyAgICAgICAgcm93cyA9IFsnICVzICVzJyAlIChmaWxlLCBjYWxsKV0KKyAgICAgICAgaWYgaW5kZXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpID0gbG51bSAtIGluZGV4CisgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgICAgICBudW0gPSAnJTVkICcgJSBpCisgICAgICAgICAgICAgICAgcm93cy5hcHBlbmQobnVtK2xpbmUucnN0cmlwKCkpCisgICAgICAgICAgICAgICAgaSArPSAxCisKKyAgICAgICAgZG9uZSwgZHVtcCA9IHt9LCBbXQorICAgICAgICBmb3IgbmFtZSwgd2hlcmUsIHZhbHVlIGluIHZhcnM6CisgICAgICAgICAgICBpZiBuYW1lIGluIGRvbmU6IGNvbnRpbnVlCisgICAgICAgICAgICBkb25lW25hbWVdID0gMQorICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IF9fVU5ERUZfXzoKKyAgICAgICAgICAgICAgICBpZiB3aGVyZSA9PSAnZ2xvYmFsJzogbmFtZSA9ICdnbG9iYWwgJyArIG5hbWUKKyAgICAgICAgICAgICAgICBlbGlmIHdoZXJlICE9ICdsb2NhbCc6IG5hbWUgPSB3aGVyZSArIG5hbWUuc3BsaXQoJy4nKVstMV0KKyAgICAgICAgICAgICAgICBkdW1wLmFwcGVuZCgnJXMgPSAlcycgJSAobmFtZSwgcHlkb2MudGV4dC5yZXByKHZhbHVlKSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGR1bXAuYXBwZW5kKG5hbWUgKyAnIHVuZGVmaW5lZCcpCisKKyAgICAgICAgcm93cy5hcHBlbmQoJ1xuJy5qb2luKGR1bXApKQorICAgICAgICBmcmFtZXMuYXBwZW5kKCdcbiVzXG4nICUgJ1xuJy5qb2luKHJvd3MpKQorCisgICAgZXhjZXB0aW9uID0gWyclczogJXMnICUgKHN0cihldHlwZSksIHN0cihldmFsdWUpKV0KKyAgICBpZiBpc2luc3RhbmNlKGV2YWx1ZSwgQmFzZUV4Y2VwdGlvbik6CisgICAgICAgIGZvciBuYW1lIGluIGRpcihldmFsdWUpOgorICAgICAgICAgICAgdmFsdWUgPSBweWRvYy50ZXh0LnJlcHIoZ2V0YXR0cihldmFsdWUsIG5hbWUpKQorICAgICAgICAgICAgZXhjZXB0aW9uLmFwcGVuZCgnXG4lcyVzID0gJXMnICUgKCIgIio0LCBuYW1lLCB2YWx1ZSkpCisKKyAgICByZXR1cm4gaGVhZCArICcnLmpvaW4oZnJhbWVzKSArICcnLmpvaW4oZXhjZXB0aW9uKSArICcnJworCitUaGUgYWJvdmUgaXMgYSBkZXNjcmlwdGlvbiBvZiBhbiBlcnJvciBpbiBhIFB5dGhvbiBwcm9ncmFtLiAgSGVyZSBpcwordGhlIG9yaWdpbmFsIHRyYWNlYmFjazoKKworJXMKKycnJyAlICcnLmpvaW4odHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb24oZXR5cGUsIGV2YWx1ZSwgZXRiKSkKKworY2xhc3MgSG9vazoKKyAgICAiIiJBIGhvb2sgdG8gcmVwbGFjZSBzeXMuZXhjZXB0aG9vayB0aGF0IHNob3dzIHRyYWNlYmFja3MgaW4gSFRNTC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXNwbGF5PTEsIGxvZ2Rpcj1Ob25lLCBjb250ZXh0PTUsIGZpbGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZm9ybWF0PSJodG1sIik6CisgICAgICAgIHNlbGYuZGlzcGxheSA9IGRpc3BsYXkgICAgICAgICAgIyBzZW5kIHRyYWNlYmFja3MgdG8gYnJvd3NlciBpZiB0cnVlCisgICAgICAgIHNlbGYubG9nZGlyID0gbG9nZGlyICAgICAgICAgICAgIyBsb2cgdHJhY2ViYWNrcyB0byBmaWxlcyBpZiBub3QgTm9uZQorICAgICAgICBzZWxmLmNvbnRleHQgPSBjb250ZXh0ICAgICAgICAgICMgbnVtYmVyIG9mIHNvdXJjZSBjb2RlIGxpbmVzIHBlciBmcmFtZQorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlIG9yIHN5cy5zdGRvdXQgICMgcGxhY2UgdG8gc2VuZCB0aGUgb3V0cHV0CisgICAgICAgIHNlbGYuZm9ybWF0ID0gZm9ybWF0CisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgZXR5cGUsIGV2YWx1ZSwgZXRiKToKKyAgICAgICAgc2VsZi5oYW5kbGUoKGV0eXBlLCBldmFsdWUsIGV0YikpCisKKyAgICBkZWYgaGFuZGxlKHNlbGYsIGluZm89Tm9uZSk6CisgICAgICAgIGluZm8gPSBpbmZvIG9yIHN5cy5leGNfaW5mbygpCisgICAgICAgIGlmIHNlbGYuZm9ybWF0ID09ICJodG1sIjoKKyAgICAgICAgICAgIHNlbGYuZmlsZS53cml0ZShyZXNldCgpKQorCisgICAgICAgIGZvcm1hdHRlciA9IChzZWxmLmZvcm1hdD09Imh0bWwiKSBhbmQgaHRtbCBvciB0ZXh0CisgICAgICAgIHBsYWluID0gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZG9jID0gZm9ybWF0dGVyKGluZm8sIHNlbGYuY29udGV4dCkKKyAgICAgICAgZXhjZXB0OiAgICAgICAgICAgICAgICAgICAgICAgICAjIGp1c3QgaW4gY2FzZSBzb21ldGhpbmcgZ29lcyB3cm9uZworICAgICAgICAgICAgZG9jID0gJycuam9pbih0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbigqaW5mbykpCisgICAgICAgICAgICBwbGFpbiA9IFRydWUKKworICAgICAgICBpZiBzZWxmLmRpc3BsYXk6CisgICAgICAgICAgICBpZiBwbGFpbjoKKyAgICAgICAgICAgICAgICBkb2MgPSBkb2MucmVwbGFjZSgnJicsICcmYW1wOycpLnJlcGxhY2UoJzwnLCAnJmx0OycpCisgICAgICAgICAgICAgICAgc2VsZi5maWxlLndyaXRlKCc8cHJlPicgKyBkb2MgKyAnPC9wcmU+XG4nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUud3JpdGUoZG9jICsgJ1xuJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmlsZS53cml0ZSgnPHA+QSBwcm9ibGVtIG9jY3VycmVkIGluIGEgUHl0aG9uIHNjcmlwdC5cbicpCisKKyAgICAgICAgaWYgc2VsZi5sb2dkaXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzdWZmaXggPSBbJy50eHQnLCAnLmh0bWwnXVtzZWxmLmZvcm1hdD09Imh0bWwiXQorICAgICAgICAgICAgKGZkLCBwYXRoKSA9IHRlbXBmaWxlLm1rc3RlbXAoc3VmZml4PXN1ZmZpeCwgZGlyPXNlbGYubG9nZGlyKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmlsZSA9IG9zLmZkb3BlbihmZCwgJ3cnKQorICAgICAgICAgICAgICAgIGZpbGUud3JpdGUoZG9jKQorICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICAgICAgICAgIG1zZyA9ICclcyBjb250YWlucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBlcnJvci4nICUgcGF0aAorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIG1zZyA9ICdUcmllZCB0byBzYXZlIHRyYWNlYmFjayB0byAlcywgYnV0IGZhaWxlZC4nICUgcGF0aAorCisgICAgICAgICAgICBpZiBzZWxmLmZvcm1hdCA9PSAnaHRtbCc6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlLndyaXRlKCc8cD4lczwvcD5cbicgJSBtc2cpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZS53cml0ZShtc2cgKyAnXG4nKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmZpbGUuZmx1c2goKQorICAgICAgICBleGNlcHQ6IHBhc3MKKworaGFuZGxlciA9IEhvb2soKS5oYW5kbGUKK2RlZiBlbmFibGUoZGlzcGxheT0xLCBsb2dkaXI9Tm9uZSwgY29udGV4dD01LCBmb3JtYXQ9Imh0bWwiKToKKyAgICAiIiJJbnN0YWxsIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRoYXQgZm9ybWF0cyB0cmFjZWJhY2tzIGFzIEhUTUwuCisKKyAgICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgJ2Rpc3BsYXknIGNhbiBiZSBzZXQgdG8gMCB0byBzdXBwcmVzcyBzZW5kaW5nIHRoZQorICAgIHRyYWNlYmFjayB0byB0aGUgYnJvd3NlciwgYW5kICdsb2dkaXInIGNhbiBiZSBzZXQgdG8gYSBkaXJlY3RvcnkgdG8gY2F1c2UKKyAgICB0cmFjZWJhY2tzIHRvIGJlIHdyaXR0ZW4gdG8gZmlsZXMgdGhlcmUuIiIiCisgICAgc3lzLmV4Y2VwdGhvb2sgPSBIb29rKGRpc3BsYXk9ZGlzcGxheSwgbG9nZGlyPWxvZ2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dD1jb250ZXh0LCBmb3JtYXQ9Zm9ybWF0KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jZ2l0Yi5weWMgYi9saWIvcHl0aG9uMi43L2NnaXRiLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDU4NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jZ2l0Yi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jZ2l0Yi5weW8gYi9saWIvcHl0aG9uMi43L2NnaXRiLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDU4NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jZ2l0Yi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jaHVuay5weSBiL2xpYi9weXRob24yLjcvY2h1bmsucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmYmMxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY2h1bmsucHkKQEAgLTAsMCArMSwxNjcgQEAKKyIiIlNpbXBsZSBjbGFzcyB0byByZWFkIElGRiBjaHVua3MuCisKK0FuIElGRiBjaHVuayAodXNlZCBpbiBmb3JtYXRzIHN1Y2ggYXMgQUlGRiwgVElGRiwgUk1GRiAoUmVhbE1lZGlhIEZpbGUKK0Zvcm1hdCkpIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKworKy0tLS0tLS0tLS0tLS0tLS0rCit8IElEICg0IGJ5dGVzKSAgIHwKKystLS0tLS0tLS0tLS0tLS0tKworfCBzaXplICg0IGJ5dGVzKSB8CisrLS0tLS0tLS0tLS0tLS0tLSsKK3wgZGF0YSAgICAgICAgICAgfAorfCAuLi4gICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0tLS0tLSsKKworVGhlIElEIGlzIGEgNC1ieXRlIHN0cmluZyB3aGljaCBpZGVudGlmaWVzIHRoZSB0eXBlIG9mIGNodW5rLgorCitUaGUgc2l6ZSBmaWVsZCAoYSAzMi1iaXQgdmFsdWUsIGVuY29kZWQgdXNpbmcgYmlnLWVuZGlhbiBieXRlIG9yZGVyKQorZ2l2ZXMgdGhlIHNpemUgb2YgdGhlIHdob2xlIGNodW5rLCBpbmNsdWRpbmcgdGhlIDgtYnl0ZSBoZWFkZXIuCisKK1VzdWFsbHkgYW4gSUZGLXR5cGUgZmlsZSBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBjaHVua3MuICBUaGUgcHJvcG9zZWQKK3VzYWdlIG9mIHRoZSBDaHVuayBjbGFzcyBkZWZpbmVkIGhlcmUgaXMgdG8gaW5zdGFudGlhdGUgYW4gaW5zdGFuY2UgYXQKK3RoZSBzdGFydCBvZiBlYWNoIGNodW5rIGFuZCByZWFkIGZyb20gdGhlIGluc3RhbmNlIHVudGlsIGl0IHJlYWNoZXMKK3RoZSBlbmQsIGFmdGVyIHdoaWNoIGEgbmV3IGluc3RhbmNlIGNhbiBiZSBpbnN0YW50aWF0ZWQuICBBdCB0aGUgZW5kCitvZiB0aGUgZmlsZSwgY3JlYXRpbmcgYSBuZXcgaW5zdGFuY2Ugd2lsbCBmYWlsIHdpdGggYSBFT0ZFcnJvcgorZXhjZXB0aW9uLgorCitVc2FnZToKK3doaWxlIFRydWU6CisgICAgdHJ5OgorICAgICAgICBjaHVuayA9IENodW5rKGZpbGUpCisgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICBicmVhaworICAgIGNodW5rdHlwZSA9IGNodW5rLmdldG5hbWUoKQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIGRhdGEgPSBjaHVuay5yZWFkKG5ieXRlcykKKyAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgZG8gc29tZXRoaW5nIHdpdGggZGF0YQorCitUaGUgaW50ZXJmYWNlIGlzIGZpbGUtbGlrZS4gIFRoZSBpbXBsZW1lbnRlZCBtZXRob2RzIGFyZToKK3JlYWQsIGNsb3NlLCBzZWVrLCB0ZWxsLCBpc2F0dHkuCitFeHRyYSBtZXRob2RzIGFyZTogc2tpcCgpIChjYWxsZWQgYnkgY2xvc2UsIHNraXBzIHRvIHRoZSBlbmQgb2YgdGhlIGNodW5rKSwKK2dldG5hbWUoKSAocmV0dXJucyB0aGUgbmFtZSAoSUQpIG9mIHRoZSBjaHVuaykKKworVGhlIF9faW5pdF9fIG1ldGhvZCBoYXMgb25lIHJlcXVpcmVkIGFyZ3VtZW50LCBhIGZpbGUtbGlrZSBvYmplY3QKKyhpbmNsdWRpbmcgYSBjaHVuayBpbnN0YW5jZSksIGFuZCBvbmUgb3B0aW9uYWwgYXJndW1lbnQsIGEgZmxhZyB3aGljaAorc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IGNodW5rcyBhcmUgYWxpZ25lZCBvbiAyLWJ5dGUgYm91bmRhcmllcy4gIFRoZQorZGVmYXVsdCBpcyAxLCBpLmUuIGFsaWduZWQuCisiIiIKKworY2xhc3MgQ2h1bms6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIGFsaWduPVRydWUsIGJpZ2VuZGlhbj1UcnVlLCBpbmNsaGVhZGVyPUZhbHNlKToKKyAgICAgICAgaW1wb3J0IHN0cnVjdAorICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuYWxpZ24gPSBhbGlnbiAgICAgICMgd2hldGhlciB0byBhbGlnbiB0byB3b3JkICgyLWJ5dGUpIGJvdW5kYXJpZXMKKyAgICAgICAgaWYgYmlnZW5kaWFuOgorICAgICAgICAgICAgc3RyZmxhZyA9ICc+JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RyZmxhZyA9ICc8JworICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisgICAgICAgIHNlbGYuY2h1bmtuYW1lID0gZmlsZS5yZWFkKDQpCisgICAgICAgIGlmIGxlbihzZWxmLmNodW5rbmFtZSkgPCA0OgorICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jaHVua3NpemUgPSBzdHJ1Y3QudW5wYWNrKHN0cmZsYWcrJ0wnLCBmaWxlLnJlYWQoNCkpWzBdCisgICAgICAgIGV4Y2VwdCBzdHJ1Y3QuZXJyb3I6CisgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICBpZiBpbmNsaGVhZGVyOgorICAgICAgICAgICAgc2VsZi5jaHVua3NpemUgPSBzZWxmLmNodW5rc2l6ZSAtIDggIyBzdWJ0cmFjdCBoZWFkZXIKKyAgICAgICAgc2VsZi5zaXplX3JlYWQgPSAwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYub2Zmc2V0ID0gc2VsZi5maWxlLnRlbGwoKQorICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBJT0Vycm9yKToKKyAgICAgICAgICAgIHNlbGYuc2Vla2FibGUgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZWVrYWJsZSA9IFRydWUKKworICAgIGRlZiBnZXRuYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgKElEKSBvZiB0aGUgY3VycmVudCBjaHVuay4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuY2h1bmtuYW1lCisKKyAgICBkZWYgZ2V0c2l6ZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGNodW5rLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5jaHVua3NpemUKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgc2VsZi5za2lwKCkKKyAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQorCisgICAgZGVmIGlzYXR0eShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3MsIHdoZW5jZT0wKToKKyAgICAgICAgIiIiU2VlayB0byBzcGVjaWZpZWQgcG9zaXRpb24gaW50byB0aGUgY2h1bmsuCisgICAgICAgIERlZmF1bHQgcG9zaXRpb24gaXMgMCAoc3RhcnQgb2YgY2h1bmspLgorICAgICAgICBJZiB0aGUgZmlsZSBpcyBub3Qgc2Vla2FibGUsIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiCisgICAgICAgIGlmIG5vdCBzZWxmLnNlZWthYmxlOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgImNhbm5vdCBzZWVrIgorICAgICAgICBpZiB3aGVuY2UgPT0gMToKKyAgICAgICAgICAgIHBvcyA9IHBvcyArIHNlbGYuc2l6ZV9yZWFkCisgICAgICAgIGVsaWYgd2hlbmNlID09IDI6CisgICAgICAgICAgICBwb3MgPSBwb3MgKyBzZWxmLmNodW5rc2l6ZQorICAgICAgICBpZiBwb3MgPCAwIG9yIHBvcyA+IHNlbGYuY2h1bmtzaXplOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgIHNlbGYuZmlsZS5zZWVrKHNlbGYub2Zmc2V0ICsgcG9zLCAwKQorICAgICAgICBzZWxmLnNpemVfcmVhZCA9IHBvcworCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiCisgICAgICAgIHJldHVybiBzZWxmLnNpemVfcmVhZAorCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT0tMSk6CisgICAgICAgICIiIlJlYWQgYXQgbW9zdCBzaXplIGJ5dGVzIGZyb20gdGhlIGNodW5rLgorICAgICAgICBJZiBzaXplIGlzIG9taXR0ZWQgb3IgbmVnYXRpdmUsIHJlYWQgdW50aWwgdGhlIGVuZAorICAgICAgICBvZiB0aGUgY2h1bmsuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiCisgICAgICAgIGlmIHNlbGYuc2l6ZV9yZWFkID49IHNlbGYuY2h1bmtzaXplOgorICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIGlmIHNpemUgPCAwOgorICAgICAgICAgICAgc2l6ZSA9IHNlbGYuY2h1bmtzaXplIC0gc2VsZi5zaXplX3JlYWQKKyAgICAgICAgaWYgc2l6ZSA+IHNlbGYuY2h1bmtzaXplIC0gc2VsZi5zaXplX3JlYWQ6CisgICAgICAgICAgICBzaXplID0gc2VsZi5jaHVua3NpemUgLSBzZWxmLnNpemVfcmVhZAorICAgICAgICBkYXRhID0gc2VsZi5maWxlLnJlYWQoc2l6ZSkKKyAgICAgICAgc2VsZi5zaXplX3JlYWQgPSBzZWxmLnNpemVfcmVhZCArIGxlbihkYXRhKQorICAgICAgICBpZiBzZWxmLnNpemVfcmVhZCA9PSBzZWxmLmNodW5rc2l6ZSBhbmQgXAorICAgICAgICAgICBzZWxmLmFsaWduIGFuZCBcCisgICAgICAgICAgIChzZWxmLmNodW5rc2l6ZSAmIDEpOgorICAgICAgICAgICAgZHVtbXkgPSBzZWxmLmZpbGUucmVhZCgxKQorICAgICAgICAgICAgc2VsZi5zaXplX3JlYWQgPSBzZWxmLnNpemVfcmVhZCArIGxlbihkdW1teSkKKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgIGRlZiBza2lwKHNlbGYpOgorICAgICAgICAiIiJTa2lwIHRoZSByZXN0IG9mIHRoZSBjaHVuay4KKyAgICAgICAgSWYgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiB0aGUgY29udGVudHMgb2YgdGhlIGNodW5rLAorICAgICAgICB0aGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIHNvIHRoYXQgdGhlIGZpbGUgcG9pbnRzIHRvCisgICAgICAgIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBjaHVuay4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKKyAgICAgICAgaWYgc2VsZi5zZWVrYWJsZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuID0gc2VsZi5jaHVua3NpemUgLSBzZWxmLnNpemVfcmVhZAorICAgICAgICAgICAgICAgICMgbWF5YmUgZml4IGFsaWdubWVudAorICAgICAgICAgICAgICAgIGlmIHNlbGYuYWxpZ24gYW5kIChzZWxmLmNodW5rc2l6ZSAmIDEpOgorICAgICAgICAgICAgICAgICAgICBuID0gbiArIDEKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUuc2VlayhuLCAxKQorICAgICAgICAgICAgICAgIHNlbGYuc2l6ZV9yZWFkID0gc2VsZi5zaXplX3JlYWQgKyBuCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHdoaWxlIHNlbGYuc2l6ZV9yZWFkIDwgc2VsZi5jaHVua3NpemU6CisgICAgICAgICAgICBuID0gbWluKDgxOTIsIHNlbGYuY2h1bmtzaXplIC0gc2VsZi5zaXplX3JlYWQpCisgICAgICAgICAgICBkdW1teSA9IHNlbGYucmVhZChuKQorICAgICAgICAgICAgaWYgbm90IGR1bW15OgorICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NodW5rLnB5YyBiL2xpYi9weXRob24yLjcvY2h1bmsucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NGU5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NodW5rLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NodW5rLnB5byBiL2xpYi9weXRob24yLjcvY2h1bmsucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NGU5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NodW5rLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NtZC5weSBiL2xpYi9weXRob24yLjcvY21kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YmE3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NtZC5weQpAQCAtMCwwICsxLDQwNCBAQAorIiIiQSBnZW5lcmljIGNsYXNzIHRvIGJ1aWxkIGxpbmUtb3JpZW50ZWQgY29tbWFuZCBpbnRlcnByZXRlcnMuCisKK0ludGVycHJldGVycyBjb25zdHJ1Y3RlZCB3aXRoIHRoaXMgY2xhc3Mgb2JleSB0aGUgZm9sbG93aW5nIGNvbnZlbnRpb25zOgorCisxLiBFbmQgb2YgZmlsZSBvbiBpbnB1dCBpcyBwcm9jZXNzZWQgYXMgdGhlIGNvbW1hbmQgJ0VPRicuCisyLiBBIGNvbW1hbmQgaXMgcGFyc2VkIG91dCBvZiBlYWNoIGxpbmUgYnkgY29sbGVjdGluZyB0aGUgcHJlZml4IGNvbXBvc2VkCisgICBvZiBjaGFyYWN0ZXJzIGluIHRoZSBpZGVudGNoYXJzIG1lbWJlci4KKzMuIEEgY29tbWFuZCBgZm9vJyBpcyBkaXNwYXRjaGVkIHRvIGEgbWV0aG9kICdkb19mb28oKSc7IHRoZSBkb18gbWV0aG9kCisgICBpcyBwYXNzZWQgYSBzaW5nbGUgYXJndW1lbnQgY29uc2lzdGluZyBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSBsaW5lLgorNC4gVHlwaW5nIGFuIGVtcHR5IGxpbmUgcmVwZWF0cyB0aGUgbGFzdCBjb21tYW5kLiAgKEFjdHVhbGx5LCBpdCBjYWxscyB0aGUKKyAgIG1ldGhvZCBgZW1wdHlsaW5lJywgd2hpY2ggbWF5IGJlIG92ZXJyaWRkZW4gaW4gYSBzdWJjbGFzcy4pCis1LiBUaGVyZSBpcyBhIHByZWRlZmluZWQgYGhlbHAnIG1ldGhvZC4gIEdpdmVuIGFuIGFyZ3VtZW50IGB0b3BpYycsIGl0CisgICBjYWxscyB0aGUgY29tbWFuZCBgaGVscF90b3BpYycuICBXaXRoIG5vIGFyZ3VtZW50cywgaXQgbGlzdHMgYWxsIHRvcGljcworICAgd2l0aCBkZWZpbmVkIGhlbHBfIGZ1bmN0aW9ucywgYnJva2VuIGludG8gdXAgdG8gdGhyZWUgdG9waWNzOyBkb2N1bWVudGVkCisgICBjb21tYW5kcywgbWlzY2VsbGFuZW91cyBoZWxwIHRvcGljcywgYW5kIHVuZG9jdW1lbnRlZCBjb21tYW5kcy4KKzYuIFRoZSBjb21tYW5kICc/JyBpcyBhIHN5bm9ueW0gZm9yIGBoZWxwJy4gIFRoZSBjb21tYW5kICchJyBpcyBhIHN5bm9ueW0KKyAgIGZvciBgc2hlbGwnLCBpZiBhIGRvX3NoZWxsIG1ldGhvZCBleGlzdHMuCis3LiBJZiBjb21wbGV0aW9uIGlzIGVuYWJsZWQsIGNvbXBsZXRpbmcgY29tbWFuZHMgd2lsbCBiZSBkb25lIGF1dG9tYXRpY2FsbHksCisgICBhbmQgY29tcGxldGluZyBvZiBjb21tYW5kcyBhcmdzIGlzIGRvbmUgYnkgY2FsbGluZyBjb21wbGV0ZV9mb28oKSB3aXRoCisgICBhcmd1bWVudHMgdGV4dCwgbGluZSwgYmVnaWR4LCBlbmRpZHguICB0ZXh0IGlzIHN0cmluZyB3ZSBhcmUgbWF0Y2hpbmcKKyAgIGFnYWluc3QsIGFsbCByZXR1cm5lZCBtYXRjaGVzIG11c3QgYmVnaW4gd2l0aCBpdC4gIGxpbmUgaXMgdGhlIGN1cnJlbnQKKyAgIGlucHV0IGxpbmUgKGxzdHJpcHBlZCksIGJlZ2lkeCBhbmQgZW5kaWR4IGFyZSB0aGUgYmVnaW5uaW5nIGFuZCBlbmQKKyAgIGluZGV4ZXMgb2YgdGhlIHRleHQgYmVpbmcgbWF0Y2hlZCwgd2hpY2ggY291bGQgYmUgdXNlZCB0byBwcm92aWRlCisgICBkaWZmZXJlbnQgY29tcGxldGlvbiBkZXBlbmRpbmcgdXBvbiB3aGljaCBwb3NpdGlvbiB0aGUgYXJndW1lbnQgaXMgaW4uCisKK1RoZSBgZGVmYXVsdCcgbWV0aG9kIG1heSBiZSBvdmVycmlkZGVuIHRvIGludGVyY2VwdCBjb21tYW5kcyBmb3Igd2hpY2ggdGhlcmUKK2lzIG5vIGRvXyBtZXRob2QuCisKK1RoZSBgY29tcGxldGVkZWZhdWx0JyBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4gdG8gaW50ZXJjZXB0IGNvbXBsZXRpb25zIGZvcgorY29tbWFuZHMgdGhhdCBoYXZlIG5vIGNvbXBsZXRlXyBtZXRob2QuCisKK1RoZSBkYXRhIG1lbWJlciBgc2VsZi5ydWxlcicgc2V0cyB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gZHJhdyBzZXBhcmF0b3IgbGluZXMKK2luIHRoZSBoZWxwIG1lc3NhZ2VzLiAgSWYgZW1wdHksIG5vIHJ1bGVyIGxpbmUgaXMgZHJhd24uICBJdCBkZWZhdWx0cyB0byAiPSIuCisKK0lmIHRoZSB2YWx1ZSBvZiBgc2VsZi5pbnRybycgaXMgbm9uZW1wdHkgd2hlbiB0aGUgY21kbG9vcCBtZXRob2QgaXMgY2FsbGVkLAoraXQgaXMgcHJpbnRlZCBvdXQgb24gaW50ZXJwcmV0ZXIgc3RhcnR1cC4gIFRoaXMgdmFsdWUgbWF5IGJlIG92ZXJyaWRkZW4KK3ZpYSBhbiBvcHRpb25hbCBhcmd1bWVudCB0byB0aGUgY21kbG9vcCgpIG1ldGhvZC4KKworVGhlIGRhdGEgbWVtYmVycyBgc2VsZi5kb2NfaGVhZGVyJywgYHNlbGYubWlzY19oZWFkZXInLCBhbmQKK2BzZWxmLnVuZG9jX2hlYWRlcicgc2V0IHRoZSBoZWFkZXJzIHVzZWQgZm9yIHRoZSBoZWxwIGZ1bmN0aW9uJ3MKK2xpc3RpbmdzIG9mIGRvY3VtZW50ZWQgZnVuY3Rpb25zLCBtaXNjZWxsYW5lb3VzIHRvcGljcywgYW5kIHVuZG9jdW1lbnRlZAorZnVuY3Rpb25zIHJlc3BlY3RpdmVseS4KKworVGhlc2UgaW50ZXJwcmV0ZXJzIHVzZSByYXdfaW5wdXQ7IHRodXMsIGlmIHRoZSByZWFkbGluZSBtb2R1bGUgaXMgbG9hZGVkLAordGhleSBhdXRvbWF0aWNhbGx5IHN1cHBvcnQgRW1hY3MtbGlrZSBjb21tYW5kIGhpc3RvcnkgYW5kIGVkaXRpbmcgZmVhdHVyZXMuCisiIiIKKworaW1wb3J0IHN0cmluZworCitfX2FsbF9fID0gWyJDbWQiXQorCitQUk9NUFQgPSAnKENtZCkgJworSURFTlRDSEFSUyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICdfJworCitjbGFzcyBDbWQ6CisgICAgIiIiQSBzaW1wbGUgZnJhbWV3b3JrIGZvciB3cml0aW5nIGxpbmUtb3JpZW50ZWQgY29tbWFuZCBpbnRlcnByZXRlcnMuCisKKyAgICBUaGVzZSBhcmUgb2Z0ZW4gdXNlZnVsIGZvciB0ZXN0IGhhcm5lc3NlcywgYWRtaW5pc3RyYXRpdmUgdG9vbHMsIGFuZAorICAgIHByb3RvdHlwZXMgdGhhdCB3aWxsIGxhdGVyIGJlIHdyYXBwZWQgaW4gYSBtb3JlIHNvcGhpc3RpY2F0ZWQgaW50ZXJmYWNlLgorCisgICAgQSBDbWQgaW5zdGFuY2Ugb3Igc3ViY2xhc3MgaW5zdGFuY2UgaXMgYSBsaW5lLW9yaWVudGVkIGludGVycHJldGVyCisgICAgZnJhbWV3b3JrLiAgVGhlcmUgaXMgbm8gZ29vZCByZWFzb24gdG8gaW5zdGFudGlhdGUgQ21kIGl0c2VsZjsgcmF0aGVyLAorICAgIGl0J3MgdXNlZnVsIGFzIGEgc3VwZXJjbGFzcyBvZiBhbiBpbnRlcnByZXRlciBjbGFzcyB5b3UgZGVmaW5lIHlvdXJzZWxmCisgICAgaW4gb3JkZXIgdG8gaW5oZXJpdCBDbWQncyBtZXRob2RzIGFuZCBlbmNhcHN1bGF0ZSBhY3Rpb24gbWV0aG9kcy4KKworICAgICIiIgorICAgIHByb21wdCA9IFBST01QVAorICAgIGlkZW50Y2hhcnMgPSBJREVOVENIQVJTCisgICAgcnVsZXIgPSAnPScKKyAgICBsYXN0Y21kID0gJycKKyAgICBpbnRybyA9IE5vbmUKKyAgICBkb2NfbGVhZGVyID0gIiIKKyAgICBkb2NfaGVhZGVyID0gIkRvY3VtZW50ZWQgY29tbWFuZHMgKHR5cGUgaGVscCA8dG9waWM+KToiCisgICAgbWlzY19oZWFkZXIgPSAiTWlzY2VsbGFuZW91cyBoZWxwIHRvcGljczoiCisgICAgdW5kb2NfaGVhZGVyID0gIlVuZG9jdW1lbnRlZCBjb21tYW5kczoiCisgICAgbm9oZWxwID0gIioqKiBObyBoZWxwIG9uICVzIgorICAgIHVzZV9yYXdpbnB1dCA9IDEKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21wbGV0ZWtleT0ndGFiJywgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUpOgorICAgICAgICAiIiJJbnN0YW50aWF0ZSBhIGxpbmUtb3JpZW50ZWQgaW50ZXJwcmV0ZXIgZnJhbWV3b3JrLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBhcmd1bWVudCAnY29tcGxldGVrZXknIGlzIHRoZSByZWFkbGluZSBuYW1lIG9mIGEKKyAgICAgICAgY29tcGxldGlvbiBrZXk7IGl0IGRlZmF1bHRzIHRvIHRoZSBUYWIga2V5LiBJZiBjb21wbGV0ZWtleSBpcworICAgICAgICBub3QgTm9uZSBhbmQgdGhlIHJlYWRsaW5lIG1vZHVsZSBpcyBhdmFpbGFibGUsIGNvbW1hbmQgY29tcGxldGlvbgorICAgICAgICBpcyBkb25lIGF1dG9tYXRpY2FsbHkuIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgc3RkaW4gYW5kIHN0ZG91dAorICAgICAgICBzcGVjaWZ5IGFsdGVybmF0ZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgb2JqZWN0czsgaWYgbm90IHNwZWNpZmllZCwKKyAgICAgICAgc3lzLnN0ZGluIGFuZCBzeXMuc3Rkb3V0IGFyZSB1c2VkLgorCisgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGlmIHN0ZGluIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zdGRpbiA9IHN0ZGluCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0ZGluID0gc3lzLnN0ZGluCisgICAgICAgIGlmIHN0ZG91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc3Rkb3V0ID0gc3Rkb3V0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5jbWRxdWV1ZSA9IFtdCisgICAgICAgIHNlbGYuY29tcGxldGVrZXkgPSBjb21wbGV0ZWtleQorCisgICAgZGVmIGNtZGxvb3Aoc2VsZiwgaW50cm89Tm9uZSk6CisgICAgICAgICIiIlJlcGVhdGVkbHkgaXNzdWUgYSBwcm9tcHQsIGFjY2VwdCBpbnB1dCwgcGFyc2UgYW4gaW5pdGlhbCBwcmVmaXgKKyAgICAgICAgb2ZmIHRoZSByZWNlaXZlZCBpbnB1dCwgYW5kIGRpc3BhdGNoIHRvIGFjdGlvbiBtZXRob2RzLCBwYXNzaW5nIHRoZW0KKyAgICAgICAgdGhlIHJlbWFpbmRlciBvZiB0aGUgbGluZSBhcyBhcmd1bWVudC4KKworICAgICAgICAiIiIKKworICAgICAgICBzZWxmLnByZWxvb3AoKQorICAgICAgICBpZiBzZWxmLnVzZV9yYXdpbnB1dCBhbmQgc2VsZi5jb21wbGV0ZWtleToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgcmVhZGxpbmUKKyAgICAgICAgICAgICAgICBzZWxmLm9sZF9jb21wbGV0ZXIgPSByZWFkbGluZS5nZXRfY29tcGxldGVyKCkKKyAgICAgICAgICAgICAgICByZWFkbGluZS5zZXRfY29tcGxldGVyKHNlbGYuY29tcGxldGUpCisgICAgICAgICAgICAgICAgcmVhZGxpbmUucGFyc2VfYW5kX2JpbmQoc2VsZi5jb21wbGV0ZWtleSsiOiBjb21wbGV0ZSIpCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBpbnRybyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmludHJvID0gaW50cm8KKyAgICAgICAgICAgIGlmIHNlbGYuaW50cm86CisgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoc3RyKHNlbGYuaW50cm8pKyJcbiIpCisgICAgICAgICAgICBzdG9wID0gTm9uZQorICAgICAgICAgICAgd2hpbGUgbm90IHN0b3A6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5jbWRxdWV1ZToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuY21kcXVldWUucG9wKDApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi51c2VfcmF3aW5wdXQ6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHJhd19pbnB1dChzZWxmLnByb21wdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gJ0VPRicKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LndyaXRlKHNlbGYucHJvbXB0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuc3RkaW4ucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxlbihsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gJ0VPRicKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCdcclxuJykKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5wcmVjbWQobGluZSkKKyAgICAgICAgICAgICAgICBzdG9wID0gc2VsZi5vbmVjbWQobGluZSkKKyAgICAgICAgICAgICAgICBzdG9wID0gc2VsZi5wb3N0Y21kKHN0b3AsIGxpbmUpCisgICAgICAgICAgICBzZWxmLnBvc3Rsb29wKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHNlbGYudXNlX3Jhd2lucHV0IGFuZCBzZWxmLmNvbXBsZXRla2V5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHJlYWRsaW5lCisgICAgICAgICAgICAgICAgICAgIHJlYWRsaW5lLnNldF9jb21wbGV0ZXIoc2VsZi5vbGRfY29tcGxldGVyKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisKKyAgICBkZWYgcHJlY21kKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJIb29rIG1ldGhvZCBleGVjdXRlZCBqdXN0IGJlZm9yZSB0aGUgY29tbWFuZCBsaW5lIGlzCisgICAgICAgIGludGVycHJldGVkLCBidXQgYWZ0ZXIgdGhlIGlucHV0IHByb21wdCBpcyBnZW5lcmF0ZWQgYW5kIGlzc3VlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGxpbmUKKworICAgIGRlZiBwb3N0Y21kKHNlbGYsIHN0b3AsIGxpbmUpOgorICAgICAgICAiIiJIb29rIG1ldGhvZCBleGVjdXRlZCBqdXN0IGFmdGVyIGEgY29tbWFuZCBkaXNwYXRjaCBpcyBmaW5pc2hlZC4iIiIKKyAgICAgICAgcmV0dXJuIHN0b3AKKworICAgIGRlZiBwcmVsb29wKHNlbGYpOgorICAgICAgICAiIiJIb29rIG1ldGhvZCBleGVjdXRlZCBvbmNlIHdoZW4gdGhlIGNtZGxvb3AoKSBtZXRob2QgaXMgY2FsbGVkLiIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcG9zdGxvb3Aoc2VsZik6CisgICAgICAgICIiIkhvb2sgbWV0aG9kIGV4ZWN1dGVkIG9uY2Ugd2hlbiB0aGUgY21kbG9vcCgpIG1ldGhvZCBpcyBhYm91dCB0bworICAgICAgICByZXR1cm4uCisKKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBwYXJzZWxpbmUoc2VsZiwgbGluZSk6CisgICAgICAgICIiIlBhcnNlIHRoZSBsaW5lIGludG8gYSBjb21tYW5kIG5hbWUgYW5kIGEgc3RyaW5nIGNvbnRhaW5pbmcKKyAgICAgICAgdGhlIGFyZ3VtZW50cy4gIFJldHVybnMgYSB0dXBsZSBjb250YWluaW5nIChjb21tYW5kLCBhcmdzLCBsaW5lKS4KKyAgICAgICAgJ2NvbW1hbmQnIGFuZCAnYXJncycgbWF5IGJlIE5vbmUgaWYgdGhlIGxpbmUgY291bGRuJ3QgYmUgcGFyc2VkLgorICAgICAgICAiIiIKKyAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lLCBsaW5lCisgICAgICAgIGVsaWYgbGluZVswXSA9PSAnPyc6CisgICAgICAgICAgICBsaW5lID0gJ2hlbHAgJyArIGxpbmVbMTpdCisgICAgICAgIGVsaWYgbGluZVswXSA9PSAnISc6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdkb19zaGVsbCcpOgorICAgICAgICAgICAgICAgIGxpbmUgPSAnc2hlbGwgJyArIGxpbmVbMTpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lLCBsaW5lCisgICAgICAgIGksIG4gPSAwLCBsZW4obGluZSkKKyAgICAgICAgd2hpbGUgaSA8IG4gYW5kIGxpbmVbaV0gaW4gc2VsZi5pZGVudGNoYXJzOiBpID0gaSsxCisgICAgICAgIGNtZCwgYXJnID0gbGluZVs6aV0sIGxpbmVbaTpdLnN0cmlwKCkKKyAgICAgICAgcmV0dXJuIGNtZCwgYXJnLCBsaW5lCisKKyAgICBkZWYgb25lY21kKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJJbnRlcnByZXQgdGhlIGFyZ3VtZW50IGFzIHRob3VnaCBpdCBoYWQgYmVlbiB0eXBlZCBpbiByZXNwb25zZQorICAgICAgICB0byB0aGUgcHJvbXB0LgorCisgICAgICAgIFRoaXMgbWF5IGJlIG92ZXJyaWRkZW4sIGJ1dCBzaG91bGQgbm90IG5vcm1hbGx5IG5lZWQgdG8gYmU7CisgICAgICAgIHNlZSB0aGUgcHJlY21kKCkgYW5kIHBvc3RjbWQoKSBtZXRob2RzIGZvciB1c2VmdWwgZXhlY3V0aW9uIGhvb2tzLgorICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgaW50ZXJwcmV0YXRpb24gb2YKKyAgICAgICAgY29tbWFuZHMgYnkgdGhlIGludGVycHJldGVyIHNob3VsZCBzdG9wLgorCisgICAgICAgICIiIgorICAgICAgICBjbWQsIGFyZywgbGluZSA9IHNlbGYucGFyc2VsaW5lKGxpbmUpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW1wdHlsaW5lKCkKKyAgICAgICAgaWYgY21kIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0KGxpbmUpCisgICAgICAgIHNlbGYubGFzdGNtZCA9IGxpbmUKKyAgICAgICAgaWYgbGluZSA9PSAnRU9GJyA6CisgICAgICAgICAgICBzZWxmLmxhc3RjbWQgPSAnJworICAgICAgICBpZiBjbWQgPT0gJyc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0KGxpbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoc2VsZiwgJ2RvXycgKyBjbWQpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVmYXVsdChsaW5lKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoYXJnKQorCisgICAgZGVmIGVtcHR5bGluZShzZWxmKToKKyAgICAgICAgIiIiQ2FsbGVkIHdoZW4gYW4gZW1wdHkgbGluZSBpcyBlbnRlcmVkIGluIHJlc3BvbnNlIHRvIHRoZSBwcm9tcHQuCisKKyAgICAgICAgSWYgdGhpcyBtZXRob2QgaXMgbm90IG92ZXJyaWRkZW4sIGl0IHJlcGVhdHMgdGhlIGxhc3Qgbm9uZW1wdHkKKyAgICAgICAgY29tbWFuZCBlbnRlcmVkLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmxhc3RjbWQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vbmVjbWQoc2VsZi5sYXN0Y21kKQorCisgICAgZGVmIGRlZmF1bHQoc2VsZiwgbGluZSk6CisgICAgICAgICIiIkNhbGxlZCBvbiBhbiBpbnB1dCBsaW5lIHdoZW4gdGhlIGNvbW1hbmQgcHJlZml4IGlzIG5vdCByZWNvZ25pemVkLgorCisgICAgICAgIElmIHRoaXMgbWV0aG9kIGlzIG5vdCBvdmVycmlkZGVuLCBpdCBwcmludHMgYW4gZXJyb3IgbWVzc2FnZSBhbmQKKyAgICAgICAgcmV0dXJucy4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoJyoqKiBVbmtub3duIHN5bnRheDogJXNcbiclbGluZSkKKworICAgIGRlZiBjb21wbGV0ZWRlZmF1bHQoc2VsZiwgKmlnbm9yZWQpOgorICAgICAgICAiIiJNZXRob2QgY2FsbGVkIHRvIGNvbXBsZXRlIGFuIGlucHV0IGxpbmUgd2hlbiBubyBjb21tYW5kLXNwZWNpZmljCisgICAgICAgIGNvbXBsZXRlXyooKSBtZXRob2QgaXMgYXZhaWxhYmxlLgorCisgICAgICAgIEJ5IGRlZmF1bHQsIGl0IHJldHVybnMgYW4gZW1wdHkgbGlzdC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFtdCisKKyAgICBkZWYgY29tcGxldGVuYW1lcyhzZWxmLCB0ZXh0LCAqaWdub3JlZCk6CisgICAgICAgIGRvdGV4dCA9ICdkb18nK3RleHQKKyAgICAgICAgcmV0dXJuIFthWzM6XSBmb3IgYSBpbiBzZWxmLmdldF9uYW1lcygpIGlmIGEuc3RhcnRzd2l0aChkb3RleHQpXQorCisgICAgZGVmIGNvbXBsZXRlKHNlbGYsIHRleHQsIHN0YXRlKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IHBvc3NpYmxlIGNvbXBsZXRpb24gZm9yICd0ZXh0Jy4KKworICAgICAgICBJZiBhIGNvbW1hbmQgaGFzIG5vdCBiZWVuIGVudGVyZWQsIHRoZW4gY29tcGxldGUgYWdhaW5zdCBjb21tYW5kIGxpc3QuCisgICAgICAgIE90aGVyd2lzZSB0cnkgdG8gY2FsbCBjb21wbGV0ZV88Y29tbWFuZD4gdG8gZ2V0IGxpc3Qgb2YgY29tcGxldGlvbnMuCisgICAgICAgICIiIgorICAgICAgICBpZiBzdGF0ZSA9PSAwOgorICAgICAgICAgICAgaW1wb3J0IHJlYWRsaW5lCisgICAgICAgICAgICBvcmlnbGluZSA9IHJlYWRsaW5lLmdldF9saW5lX2J1ZmZlcigpCisgICAgICAgICAgICBsaW5lID0gb3JpZ2xpbmUubHN0cmlwKCkKKyAgICAgICAgICAgIHN0cmlwcGVkID0gbGVuKG9yaWdsaW5lKSAtIGxlbihsaW5lKQorICAgICAgICAgICAgYmVnaWR4ID0gcmVhZGxpbmUuZ2V0X2JlZ2lkeCgpIC0gc3RyaXBwZWQKKyAgICAgICAgICAgIGVuZGlkeCA9IHJlYWRsaW5lLmdldF9lbmRpZHgoKSAtIHN0cmlwcGVkCisgICAgICAgICAgICBpZiBiZWdpZHg+MDoKKyAgICAgICAgICAgICAgICBjbWQsIGFyZ3MsIGZvbyA9IHNlbGYucGFyc2VsaW5lKGxpbmUpCisgICAgICAgICAgICAgICAgaWYgY21kID09ICcnOgorICAgICAgICAgICAgICAgICAgICBjb21wZnVuYyA9IHNlbGYuY29tcGxldGVkZWZhdWx0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGZ1bmMgPSBnZXRhdHRyKHNlbGYsICdjb21wbGV0ZV8nICsgY21kKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wZnVuYyA9IHNlbGYuY29tcGxldGVkZWZhdWx0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbXBmdW5jID0gc2VsZi5jb21wbGV0ZW5hbWVzCisgICAgICAgICAgICBzZWxmLmNvbXBsZXRpb25fbWF0Y2hlcyA9IGNvbXBmdW5jKHRleHQsIGxpbmUsIGJlZ2lkeCwgZW5kaWR4KQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21wbGV0aW9uX21hdGNoZXNbc3RhdGVdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBnZXRfbmFtZXMoc2VsZik6CisgICAgICAgICMgVGhpcyBtZXRob2QgdXNlZCB0byBwdWxsIGluIGJhc2UgY2xhc3MgYXR0cmlidXRlcworICAgICAgICAjIGF0IGEgdGltZSBkaXIoKSBkaWRuJ3QgZG8gaXQgeWV0LgorICAgICAgICByZXR1cm4gZGlyKHNlbGYuX19jbGFzc19fKQorCisgICAgZGVmIGNvbXBsZXRlX2hlbHAoc2VsZiwgKmFyZ3MpOgorICAgICAgICBjb21tYW5kcyA9IHNldChzZWxmLmNvbXBsZXRlbmFtZXMoKmFyZ3MpKQorICAgICAgICB0b3BpY3MgPSBzZXQoYVs1Ol0gZm9yIGEgaW4gc2VsZi5nZXRfbmFtZXMoKQorICAgICAgICAgICAgICAgICAgICAgaWYgYS5zdGFydHN3aXRoKCdoZWxwXycgKyBhcmdzWzBdKSkKKyAgICAgICAgcmV0dXJuIGxpc3QoY29tbWFuZHMgfCB0b3BpY3MpCisKKyAgICBkZWYgZG9faGVscChzZWxmLCBhcmcpOgorICAgICAgICAnTGlzdCBhdmFpbGFibGUgY29tbWFuZHMgd2l0aCAiaGVscCIgb3IgZGV0YWlsZWQgaGVscCB3aXRoICJoZWxwIGNtZCIuJworICAgICAgICBpZiBhcmc6CisgICAgICAgICAgICAjIFhYWCBjaGVjayBhcmcgc3ludGF4CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoc2VsZiwgJ2hlbHBfJyArIGFyZykKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRvYz1nZXRhdHRyKHNlbGYsICdkb18nICsgYXJnKS5fX2RvY19fCisgICAgICAgICAgICAgICAgICAgIGlmIGRvYzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LndyaXRlKCIlc1xuIiVzdHIoZG9jKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LndyaXRlKCIlc1xuIiVzdHIoc2VsZi5ub2hlbHAgJSAoYXJnLCkpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZnVuYygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lcyA9IHNlbGYuZ2V0X25hbWVzKCkKKyAgICAgICAgICAgIGNtZHNfZG9jID0gW10KKyAgICAgICAgICAgIGNtZHNfdW5kb2MgPSBbXQorICAgICAgICAgICAgaGVscCA9IHt9CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgICAgICBpZiBuYW1lWzo1XSA9PSAnaGVscF8nOgorICAgICAgICAgICAgICAgICAgICBoZWxwW25hbWVbNTpdXT0xCisgICAgICAgICAgICBuYW1lcy5zb3J0KCkKKyAgICAgICAgICAgICMgVGhlcmUgY2FuIGJlIGR1cGxpY2F0ZXMgaWYgcm91dGluZXMgb3ZlcnJpZGRlbgorICAgICAgICAgICAgcHJldm5hbWUgPSAnJworICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICAgICAgaWYgbmFtZVs6M10gPT0gJ2RvXyc6CisgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gcHJldm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBwcmV2bmFtZSA9IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgY21kPW5hbWVbMzpdCisgICAgICAgICAgICAgICAgICAgIGlmIGNtZCBpbiBoZWxwOgorICAgICAgICAgICAgICAgICAgICAgICAgY21kc19kb2MuYXBwZW5kKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBoZWxwW2NtZF0KKyAgICAgICAgICAgICAgICAgICAgZWxpZiBnZXRhdHRyKHNlbGYsIG5hbWUpLl9fZG9jX186CisgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2RvYy5hcHBlbmQoY21kKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY21kc191bmRvYy5hcHBlbmQoY21kKQorICAgICAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoIiVzXG4iJXN0cihzZWxmLmRvY19sZWFkZXIpKQorICAgICAgICAgICAgc2VsZi5wcmludF90b3BpY3Moc2VsZi5kb2NfaGVhZGVyLCAgIGNtZHNfZG9jLCAgIDE1LDgwKQorICAgICAgICAgICAgc2VsZi5wcmludF90b3BpY3Moc2VsZi5taXNjX2hlYWRlciwgIGhlbHAua2V5cygpLDE1LDgwKQorICAgICAgICAgICAgc2VsZi5wcmludF90b3BpY3Moc2VsZi51bmRvY19oZWFkZXIsIGNtZHNfdW5kb2MsIDE1LDgwKQorCisgICAgZGVmIHByaW50X3RvcGljcyhzZWxmLCBoZWFkZXIsIGNtZHMsIGNtZGxlbiwgbWF4Y29sKToKKyAgICAgICAgaWYgY21kczoKKyAgICAgICAgICAgIHNlbGYuc3Rkb3V0LndyaXRlKCIlc1xuIiVzdHIoaGVhZGVyKSkKKyAgICAgICAgICAgIGlmIHNlbGYucnVsZXI6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoIiVzXG4iJXN0cihzZWxmLnJ1bGVyICogbGVuKGhlYWRlcikpKQorICAgICAgICAgICAgc2VsZi5jb2x1bW5pemUoY21kcywgbWF4Y29sLTEpCisgICAgICAgICAgICBzZWxmLnN0ZG91dC53cml0ZSgiXG4iKQorCisgICAgZGVmIGNvbHVtbml6ZShzZWxmLCBsaXN0LCBkaXNwbGF5d2lkdGg9ODApOgorICAgICAgICAiIiJEaXNwbGF5IGEgbGlzdCBvZiBzdHJpbmdzIGFzIGEgY29tcGFjdCBzZXQgb2YgY29sdW1ucy4KKworICAgICAgICBFYWNoIGNvbHVtbiBpcyBvbmx5IGFzIHdpZGUgYXMgbmVjZXNzYXJ5LgorICAgICAgICBDb2x1bW5zIGFyZSBzZXBhcmF0ZWQgYnkgdHdvIHNwYWNlcyAob25lIHdhcyBub3QgbGVnaWJsZSBlbm91Z2gpLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGxpc3Q6CisgICAgICAgICAgICBzZWxmLnN0ZG91dC53cml0ZSgiPGVtcHR5PlxuIikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBub25zdHJpbmdzID0gW2kgZm9yIGkgaW4gcmFuZ2UobGVuKGxpc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobGlzdFtpXSwgc3RyKV0KKyAgICAgICAgaWYgbm9uc3RyaW5nczoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgKCJsaXN0W2ldIG5vdCBhIHN0cmluZyBmb3IgaSBpbiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgIi5qb2luKG1hcChzdHIsIG5vbnN0cmluZ3MpKSkKKyAgICAgICAgc2l6ZSA9IGxlbihsaXN0KQorICAgICAgICBpZiBzaXplID09IDE6CisgICAgICAgICAgICBzZWxmLnN0ZG91dC53cml0ZSgnJXNcbiclc3RyKGxpc3RbMF0pKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgVHJ5IGV2ZXJ5IHJvdyBjb3VudCBmcm9tIDEgdXB3YXJkcworICAgICAgICBmb3IgbnJvd3MgaW4gcmFuZ2UoMSwgbGVuKGxpc3QpKToKKyAgICAgICAgICAgIG5jb2xzID0gKHNpemUrbnJvd3MtMSkgLy8gbnJvd3MKKyAgICAgICAgICAgIGNvbHdpZHRocyA9IFtdCisgICAgICAgICAgICB0b3R3aWR0aCA9IC0yCisgICAgICAgICAgICBmb3IgY29sIGluIHJhbmdlKG5jb2xzKToKKyAgICAgICAgICAgICAgICBjb2x3aWR0aCA9IDAKKyAgICAgICAgICAgICAgICBmb3Igcm93IGluIHJhbmdlKG5yb3dzKToKKyAgICAgICAgICAgICAgICAgICAgaSA9IHJvdyArIG5yb3dzKmNvbAorICAgICAgICAgICAgICAgICAgICBpZiBpID49IHNpemU6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICB4ID0gbGlzdFtpXQorICAgICAgICAgICAgICAgICAgICBjb2x3aWR0aCA9IG1heChjb2x3aWR0aCwgbGVuKHgpKQorICAgICAgICAgICAgICAgIGNvbHdpZHRocy5hcHBlbmQoY29sd2lkdGgpCisgICAgICAgICAgICAgICAgdG90d2lkdGggKz0gY29sd2lkdGggKyAyCisgICAgICAgICAgICAgICAgaWYgdG90d2lkdGggPiBkaXNwbGF5d2lkdGg6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiB0b3R3aWR0aCA8PSBkaXNwbGF5d2lkdGg6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5yb3dzID0gbGVuKGxpc3QpCisgICAgICAgICAgICBuY29scyA9IDEKKyAgICAgICAgICAgIGNvbHdpZHRocyA9IFswXQorICAgICAgICBmb3Igcm93IGluIHJhbmdlKG5yb3dzKToKKyAgICAgICAgICAgIHRleHRzID0gW10KKyAgICAgICAgICAgIGZvciBjb2wgaW4gcmFuZ2UobmNvbHMpOgorICAgICAgICAgICAgICAgIGkgPSByb3cgKyBucm93cypjb2wKKyAgICAgICAgICAgICAgICBpZiBpID49IHNpemU6CisgICAgICAgICAgICAgICAgICAgIHggPSAiIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHggPSBsaXN0W2ldCisgICAgICAgICAgICAgICAgdGV4dHMuYXBwZW5kKHgpCisgICAgICAgICAgICB3aGlsZSB0ZXh0cyBhbmQgbm90IHRleHRzWy0xXToKKyAgICAgICAgICAgICAgICBkZWwgdGV4dHNbLTFdCisgICAgICAgICAgICBmb3IgY29sIGluIHJhbmdlKGxlbih0ZXh0cykpOgorICAgICAgICAgICAgICAgIHRleHRzW2NvbF0gPSB0ZXh0c1tjb2xdLmxqdXN0KGNvbHdpZHRoc1tjb2xdKQorICAgICAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoIiVzXG4iJXN0cigiICAiLmpvaW4odGV4dHMpKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY21kLnB5YyBiL2xpYi9weXRob24yLjcvY21kLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2VhNDdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jbWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY21kLnB5byBiL2xpYi9weXRob24yLjcvY21kLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2VhNDdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jbWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29kZS5weSBiL2xpYi9weXRob24yLjcvY29kZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM5ZDFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb2RlLnB5CkBAIC0wLDAgKzEsMzEwIEBACisiIiJVdGlsaXRpZXMgbmVlZGVkIHRvIGVtdWxhdGUgUHl0aG9uJ3MgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIuCisKKyIiIgorCisjIEluc3BpcmVkIGJ5IHNpbWlsYXIgY29kZSBieSBKZWZmIEVwbGVyIGFuZCBGcmVkcmlrIEx1bmRoLgorCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB0cmFjZWJhY2sKK2Zyb20gY29kZW9wIGltcG9ydCBDb21tYW5kQ29tcGlsZXIsIGNvbXBpbGVfY29tbWFuZAorCitfX2FsbF9fID0gWyJJbnRlcmFjdGl2ZUludGVycHJldGVyIiwgIkludGVyYWN0aXZlQ29uc29sZSIsICJpbnRlcmFjdCIsCisgICAgICAgICAgICJjb21waWxlX2NvbW1hbmQiXQorCitkZWYgc29mdHNwYWNlKGZpbGUsIG5ld3ZhbHVlKToKKyAgICBvbGR2YWx1ZSA9IDAKKyAgICB0cnk6CisgICAgICAgIG9sZHZhbHVlID0gZmlsZS5zb2Z0c3BhY2UKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICB0cnk6CisgICAgICAgIGZpbGUuc29mdHNwYWNlID0gbmV3dmFsdWUKKyAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAjICJhdHRyaWJ1dGUtbGVzcyBvYmplY3QiIG9yICJyZWFkLW9ubHkgYXR0cmlidXRlcyIKKyAgICAgICAgcGFzcworICAgIHJldHVybiBvbGR2YWx1ZQorCitjbGFzcyBJbnRlcmFjdGl2ZUludGVycHJldGVyOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIEludGVyYWN0aXZlQ29uc29sZS4KKworICAgIFRoaXMgY2xhc3MgZGVhbHMgd2l0aCBwYXJzaW5nIGFuZCBpbnRlcnByZXRlciBzdGF0ZSAodGhlIHVzZXIncworICAgIG5hbWVzcGFjZSk7IGl0IGRvZXNuJ3QgZGVhbCB3aXRoIGlucHV0IGJ1ZmZlcmluZyBvciBwcm9tcHRpbmcgb3IKKyAgICBpbnB1dCBmaWxlIG5hbWluZyAodGhlIGZpbGVuYW1lIGlzIGFsd2F5cyBwYXNzZWQgaW4gZXhwbGljaXRseSkuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2NhbHM9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdG9yLgorCisgICAgICAgIFRoZSBvcHRpb25hbCAnbG9jYWxzJyBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGRpY3Rpb25hcnkgaW4KKyAgICAgICAgd2hpY2ggY29kZSB3aWxsIGJlIGV4ZWN1dGVkOyBpdCBkZWZhdWx0cyB0byBhIG5ld2x5IGNyZWF0ZWQKKyAgICAgICAgZGljdGlvbmFyeSB3aXRoIGtleSAiX19uYW1lX18iIHNldCB0byAiX19jb25zb2xlX18iIGFuZCBrZXkKKyAgICAgICAgIl9fZG9jX18iIHNldCB0byBOb25lLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBsb2NhbHMgaXMgTm9uZToKKyAgICAgICAgICAgIGxvY2FscyA9IHsiX19uYW1lX18iOiAiX19jb25zb2xlX18iLCAiX19kb2NfXyI6IE5vbmV9CisgICAgICAgIHNlbGYubG9jYWxzID0gbG9jYWxzCisgICAgICAgIHNlbGYuY29tcGlsZSA9IENvbW1hbmRDb21waWxlcigpCisKKyAgICBkZWYgcnVuc291cmNlKHNlbGYsIHNvdXJjZSwgZmlsZW5hbWU9IjxpbnB1dD4iLCBzeW1ib2w9InNpbmdsZSIpOgorICAgICAgICAiIiJDb21waWxlIGFuZCBydW4gc29tZSBzb3VyY2UgaW4gdGhlIGludGVycHJldGVyLgorCisgICAgICAgIEFyZ3VtZW50cyBhcmUgYXMgZm9yIGNvbXBpbGVfY29tbWFuZCgpLgorCisgICAgICAgIE9uZSBzZXZlcmFsIHRoaW5ncyBjYW4gaGFwcGVuOgorCisgICAgICAgIDEpIFRoZSBpbnB1dCBpcyBpbmNvcnJlY3Q7IGNvbXBpbGVfY29tbWFuZCgpIHJhaXNlZCBhbgorICAgICAgICBleGNlcHRpb24gKFN5bnRheEVycm9yIG9yIE92ZXJmbG93RXJyb3IpLiAgQSBzeW50YXggdHJhY2ViYWNrCisgICAgICAgIHdpbGwgYmUgcHJpbnRlZCBieSBjYWxsaW5nIHRoZSBzaG93c3ludGF4ZXJyb3IoKSBtZXRob2QuCisKKyAgICAgICAgMikgVGhlIGlucHV0IGlzIGluY29tcGxldGUsIGFuZCBtb3JlIGlucHV0IGlzIHJlcXVpcmVkOworICAgICAgICBjb21waWxlX2NvbW1hbmQoKSByZXR1cm5lZCBOb25lLiAgTm90aGluZyBoYXBwZW5zLgorCisgICAgICAgIDMpIFRoZSBpbnB1dCBpcyBjb21wbGV0ZTsgY29tcGlsZV9jb21tYW5kKCkgcmV0dXJuZWQgYSBjb2RlCisgICAgICAgIG9iamVjdC4gIFRoZSBjb2RlIGlzIGV4ZWN1dGVkIGJ5IGNhbGxpbmcgc2VsZi5ydW5jb2RlKCkgKHdoaWNoCisgICAgICAgIGFsc28gaGFuZGxlcyBydW4tdGltZSBleGNlcHRpb25zLCBleGNlcHQgZm9yIFN5c3RlbUV4aXQpLgorCisgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgVHJ1ZSBpbiBjYXNlIDIsIEZhbHNlIGluIHRoZSBvdGhlciBjYXNlcyAodW5sZXNzCisgICAgICAgIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQpLiAgVGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgdXNlZCB0bworICAgICAgICBkZWNpZGUgd2hldGhlciB0byB1c2Ugc3lzLnBzMSBvciBzeXMucHMyIHRvIHByb21wdCB0aGUgbmV4dAorICAgICAgICBsaW5lLgorCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb2RlID0gc2VsZi5jb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsIHN5bWJvbCkKKyAgICAgICAgZXhjZXB0IChPdmVyZmxvd0Vycm9yLCBTeW50YXhFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAjIENhc2UgMQorICAgICAgICAgICAgc2VsZi5zaG93c3ludGF4ZXJyb3IoZmlsZW5hbWUpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBjb2RlIGlzIE5vbmU6CisgICAgICAgICAgICAjIENhc2UgMgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAjIENhc2UgMworICAgICAgICBzZWxmLnJ1bmNvZGUoY29kZSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgcnVuY29kZShzZWxmLCBjb2RlKToKKyAgICAgICAgIiIiRXhlY3V0ZSBhIGNvZGUgb2JqZWN0LgorCisgICAgICAgIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3Vycywgc2VsZi5zaG93dHJhY2ViYWNrKCkgaXMgY2FsbGVkIHRvCisgICAgICAgIGRpc3BsYXkgYSB0cmFjZWJhY2suICBBbGwgZXhjZXB0aW9ucyBhcmUgY2F1Z2h0IGV4Y2VwdAorICAgICAgICBTeXN0ZW1FeGl0LCB3aGljaCBpcyByZXJhaXNlZC4KKworICAgICAgICBBIG5vdGUgYWJvdXQgS2V5Ym9hcmRJbnRlcnJ1cHQ6IHRoaXMgZXhjZXB0aW9uIG1heSBvY2N1cgorICAgICAgICBlbHNld2hlcmUgaW4gdGhpcyBjb2RlLCBhbmQgbWF5IG5vdCBhbHdheXMgYmUgY2F1Z2h0LiAgVGhlCisgICAgICAgIGNhbGxlciBzaG91bGQgYmUgcHJlcGFyZWQgdG8gZGVhbCB3aXRoIGl0LgorCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjIGNvZGUgaW4gc2VsZi5sb2NhbHMKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQ6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLnNob3d0cmFjZWJhY2soKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc29mdHNwYWNlKHN5cy5zdGRvdXQsIDApOgorICAgICAgICAgICAgICAgIHByaW50CisKKyAgICBkZWYgc2hvd3N5bnRheGVycm9yKHNlbGYsIGZpbGVuYW1lPU5vbmUpOgorICAgICAgICAiIiJEaXNwbGF5IHRoZSBzeW50YXggZXJyb3IgdGhhdCBqdXN0IG9jY3VycmVkLgorCisgICAgICAgIFRoaXMgZG9lc24ndCBkaXNwbGF5IGEgc3RhY2sgdHJhY2UgYmVjYXVzZSB0aGVyZSBpc24ndCBvbmUuCisKKyAgICAgICAgSWYgYSBmaWxlbmFtZSBpcyBnaXZlbiwgaXQgaXMgc3R1ZmZlZCBpbiB0aGUgZXhjZXB0aW9uIGluc3RlYWQKKyAgICAgICAgb2Ygd2hhdCB3YXMgdGhlcmUgYmVmb3JlIChiZWNhdXNlIFB5dGhvbidzIHBhcnNlciBhbHdheXMgdXNlcworICAgICAgICAiPHN0cmluZz4iIHdoZW4gcmVhZGluZyBmcm9tIGEgc3RyaW5nKS4KKworICAgICAgICBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gYnkgc2VsZi53cml0ZSgpLCBiZWxvdy4KKworICAgICAgICAiIiIKKyAgICAgICAgdHlwZSwgdmFsdWUsIHN5cy5sYXN0X3RyYWNlYmFjayA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIHN5cy5sYXN0X3R5cGUgPSB0eXBlCisgICAgICAgIHN5cy5sYXN0X3ZhbHVlID0gdmFsdWUKKyAgICAgICAgaWYgZmlsZW5hbWUgYW5kIHR5cGUgaXMgU3ludGF4RXJyb3I6CisgICAgICAgICAgICAjIFdvcmsgaGFyZCB0byBzdHVmZiB0aGUgY29ycmVjdCBmaWxlbmFtZSBpbiB0aGUgZXhjZXB0aW9uCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbXNnLCAoZHVtbXlfZmlsZW5hbWUsIGxpbmVubywgb2Zmc2V0LCBsaW5lKSA9IHZhbHVlCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBOb3QgdGhlIGZvcm1hdCB3ZSBleHBlY3Q7IGxlYXZlIGl0IGFsb25lCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFN0dWZmIGluIHRoZSByaWdodCBmaWxlbmFtZQorICAgICAgICAgICAgICAgIHZhbHVlID0gU3ludGF4RXJyb3IobXNnLCAoZmlsZW5hbWUsIGxpbmVubywgb2Zmc2V0LCBsaW5lKSkKKyAgICAgICAgICAgICAgICBzeXMubGFzdF92YWx1ZSA9IHZhbHVlCisgICAgICAgIGxpc3QgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KHR5cGUsIHZhbHVlKQorICAgICAgICBtYXAoc2VsZi53cml0ZSwgbGlzdCkKKworICAgIGRlZiBzaG93dHJhY2ViYWNrKHNlbGYpOgorICAgICAgICAiIiJEaXNwbGF5IHRoZSBleGNlcHRpb24gdGhhdCBqdXN0IG9jY3VycmVkLgorCisgICAgICAgIFdlIHJlbW92ZSB0aGUgZmlyc3Qgc3RhY2sgaXRlbSBiZWNhdXNlIGl0IGlzIG91ciBvd24gY29kZS4KKworICAgICAgICBUaGUgb3V0cHV0IGlzIHdyaXR0ZW4gYnkgc2VsZi53cml0ZSgpLCBiZWxvdy4KKworICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHlwZSwgdmFsdWUsIHRiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIHN5cy5sYXN0X3R5cGUgPSB0eXBlCisgICAgICAgICAgICBzeXMubGFzdF92YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICBzeXMubGFzdF90cmFjZWJhY2sgPSB0YgorICAgICAgICAgICAgdGJsaXN0ID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIpCisgICAgICAgICAgICBkZWwgdGJsaXN0WzoxXQorICAgICAgICAgICAgbGlzdCA9IHRyYWNlYmFjay5mb3JtYXRfbGlzdCh0Ymxpc3QpCisgICAgICAgICAgICBpZiBsaXN0OgorICAgICAgICAgICAgICAgIGxpc3QuaW5zZXJ0KDAsICJUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4iKQorICAgICAgICAgICAgbGlzdFtsZW4obGlzdCk6XSA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkodHlwZSwgdmFsdWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0Ymxpc3QgPSB0YiA9IE5vbmUKKyAgICAgICAgbWFwKHNlbGYud3JpdGUsIGxpc3QpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgICIiIldyaXRlIGEgc3RyaW5nLgorCisgICAgICAgIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIHdyaXRlcyB0byBzeXMuc3RkZXJyOyBhIHN1YmNsYXNzIG1heQorICAgICAgICByZXBsYWNlIHRoaXMgd2l0aCBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KKworICAgICAgICAiIiIKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShkYXRhKQorCisKK2NsYXNzIEludGVyYWN0aXZlQ29uc29sZShJbnRlcmFjdGl2ZUludGVycHJldGVyKToKKyAgICAiIiJDbG9zZWx5IGVtdWxhdGUgdGhlIGJlaGF2aW9yIG9mIHRoZSBpbnRlcmFjdGl2ZSBQeXRob24gaW50ZXJwcmV0ZXIuCisKKyAgICBUaGlzIGNsYXNzIGJ1aWxkcyBvbiBJbnRlcmFjdGl2ZUludGVycHJldGVyIGFuZCBhZGRzIHByb21wdGluZworICAgIHVzaW5nIHRoZSBmYW1pbGlhciBzeXMucHMxIGFuZCBzeXMucHMyLCBhbmQgaW5wdXQgYnVmZmVyaW5nLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jYWxzPU5vbmUsIGZpbGVuYW1lPSI8Y29uc29sZT4iKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIGxvY2FscyBhcmd1bWVudCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKKyAgICAgICAgSW50ZXJhY3RpdmVJbnRlcnByZXRlciBiYXNlIGNsYXNzLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBmaWxlbmFtZSBhcmd1bWVudCBzaG91bGQgc3BlY2lmeSB0aGUgKGZpbGUpbmFtZQorICAgICAgICBvZiB0aGUgaW5wdXQgc3RyZWFtOyBpdCB3aWxsIHNob3cgdXAgaW4gdHJhY2ViYWNrcy4KKworICAgICAgICAiIiIKKyAgICAgICAgSW50ZXJhY3RpdmVJbnRlcnByZXRlci5fX2luaXRfXyhzZWxmLCBsb2NhbHMpCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLnJlc2V0YnVmZmVyKCkKKworICAgIGRlZiByZXNldGJ1ZmZlcihzZWxmKToKKyAgICAgICAgIiIiUmVzZXQgdGhlIGlucHV0IGJ1ZmZlci4iIiIKKyAgICAgICAgc2VsZi5idWZmZXIgPSBbXQorCisgICAgZGVmIGludGVyYWN0KHNlbGYsIGJhbm5lcj1Ob25lKToKKyAgICAgICAgIiIiQ2xvc2VseSBlbXVsYXRlIHRoZSBpbnRlcmFjdGl2ZSBQeXRob24gY29uc29sZS4KKworICAgICAgICBUaGUgb3B0aW9uYWwgYmFubmVyIGFyZ3VtZW50IHNwZWNpZnkgdGhlIGJhbm5lciB0byBwcmludAorICAgICAgICBiZWZvcmUgdGhlIGZpcnN0IGludGVyYWN0aW9uOyBieSBkZWZhdWx0IGl0IHByaW50cyBhIGJhbm5lcgorICAgICAgICBzaW1pbGFyIHRvIHRoZSBvbmUgcHJpbnRlZCBieSB0aGUgcmVhbCBQeXRob24gaW50ZXJwcmV0ZXIsCisgICAgICAgIGZvbGxvd2VkIGJ5IHRoZSBjdXJyZW50IGNsYXNzIG5hbWUgaW4gcGFyZW50aGVzZXMgKHNvIGFzIG5vdAorICAgICAgICB0byBjb25mdXNlIHRoaXMgd2l0aCB0aGUgcmVhbCBpbnRlcnByZXRlciAtLSBzaW5jZSBpdCdzIHNvCisgICAgICAgIGNsb3NlISkuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5wczEKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc3lzLnBzMSA9ICI+Pj4gIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMucHMyCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHN5cy5wczIgPSAiLi4uICIKKyAgICAgICAgY3BydCA9ICdUeXBlICJoZWxwIiwgImNvcHlyaWdodCIsICJjcmVkaXRzIiBvciAibGljZW5zZSIgZm9yIG1vcmUgaW5mb3JtYXRpb24uJworICAgICAgICBpZiBiYW5uZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIlB5dGhvbiAlcyBvbiAlc1xuJXNcbiglcylcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAoc3lzLnZlcnNpb24sIHN5cy5wbGF0Zm9ybSwgY3BydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoIiVzXG4iICUgc3RyKGJhbm5lcikpCisgICAgICAgIG1vcmUgPSAwCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgbW9yZToKKyAgICAgICAgICAgICAgICAgICAgcHJvbXB0ID0gc3lzLnBzMgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByb21wdCA9IHN5cy5wczEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJhd19pbnB1dChwcm9tcHQpCisgICAgICAgICAgICAgICAgICAgICMgQ2FuIGJlIE5vbmUgaWYgc3lzLnN0ZGluIHdhcyByZWRlZmluZWQKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBnZXRhdHRyKHN5cy5zdGRpbiwgImVuY29kaW5nIiwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZW5jb2RpbmcgYW5kIG5vdCBpc2luc3RhbmNlKGxpbmUsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiXG4iKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1vcmUgPSBzZWxmLnB1c2gobGluZSkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCJcbktleWJvYXJkSW50ZXJydXB0XG4iKQorICAgICAgICAgICAgICAgIHNlbGYucmVzZXRidWZmZXIoKQorICAgICAgICAgICAgICAgIG1vcmUgPSAwCisKKyAgICBkZWYgcHVzaChzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiUHVzaCBhIGxpbmUgdG8gdGhlIGludGVycHJldGVyLgorCisgICAgICAgIFRoZSBsaW5lIHNob3VsZCBub3QgaGF2ZSBhIHRyYWlsaW5nIG5ld2xpbmU7IGl0IG1heSBoYXZlCisgICAgICAgIGludGVybmFsIG5ld2xpbmVzLiAgVGhlIGxpbmUgaXMgYXBwZW5kZWQgdG8gYSBidWZmZXIgYW5kIHRoZQorICAgICAgICBpbnRlcnByZXRlcidzIHJ1bnNvdXJjZSgpIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCB0aGUKKyAgICAgICAgY29uY2F0ZW5hdGVkIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgYXMgc291cmNlLiAgSWYgdGhpcworICAgICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZCB3YXMgZXhlY3V0ZWQgb3IgaW52YWxpZCwgdGhlIGJ1ZmZlcgorICAgICAgICBpcyByZXNldDsgb3RoZXJ3aXNlLCB0aGUgY29tbWFuZCBpcyBpbmNvbXBsZXRlLCBhbmQgdGhlIGJ1ZmZlcgorICAgICAgICBpcyBsZWZ0IGFzIGl0IHdhcyBhZnRlciB0aGUgbGluZSB3YXMgYXBwZW5kZWQuICBUaGUgcmV0dXJuCisgICAgICAgIHZhbHVlIGlzIDEgaWYgbW9yZSBpbnB1dCBpcyByZXF1aXJlZCwgMCBpZiB0aGUgbGluZSB3YXMgZGVhbHQKKyAgICAgICAgd2l0aCBpbiBzb21lIHdheSAodGhpcyBpcyB0aGUgc2FtZSBhcyBydW5zb3VyY2UoKSkuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYnVmZmVyLmFwcGVuZChsaW5lKQorICAgICAgICBzb3VyY2UgPSAiXG4iLmpvaW4oc2VsZi5idWZmZXIpCisgICAgICAgIG1vcmUgPSBzZWxmLnJ1bnNvdXJjZShzb3VyY2UsIHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGlmIG5vdCBtb3JlOgorICAgICAgICAgICAgc2VsZi5yZXNldGJ1ZmZlcigpCisgICAgICAgIHJldHVybiBtb3JlCisKKyAgICBkZWYgcmF3X2lucHV0KHNlbGYsIHByb21wdD0iIik6CisgICAgICAgICIiIldyaXRlIGEgcHJvbXB0IGFuZCByZWFkIGEgbGluZS4KKworICAgICAgICBUaGUgcmV0dXJuZWQgbGluZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSB0cmFpbGluZyBuZXdsaW5lLgorICAgICAgICBXaGVuIHRoZSB1c2VyIGVudGVycyB0aGUgRU9GIGtleSBzZXF1ZW5jZSwgRU9GRXJyb3IgaXMgcmFpc2VkLgorCisgICAgICAgIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uCisgICAgICAgIHJhd19pbnB1dCgpOyBhIHN1YmNsYXNzIG1heSByZXBsYWNlIHRoaXMgd2l0aCBhIGRpZmZlcmVudAorICAgICAgICBpbXBsZW1lbnRhdGlvbi4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHJhd19pbnB1dChwcm9tcHQpCisKKworZGVmIGludGVyYWN0KGJhbm5lcj1Ob25lLCByZWFkZnVuYz1Ob25lLCBsb2NhbD1Ob25lKToKKyAgICAiIiJDbG9zZWx5IGVtdWxhdGUgdGhlIGludGVyYWN0aXZlIFB5dGhvbiBpbnRlcnByZXRlci4KKworICAgIFRoaXMgaXMgYSBiYWNrd2FyZHMgY29tcGF0aWJsZSBpbnRlcmZhY2UgdG8gdGhlIEludGVyYWN0aXZlQ29uc29sZQorICAgIGNsYXNzLiAgV2hlbiByZWFkZnVuYyBpcyBub3Qgc3BlY2lmaWVkLCBpdCBhdHRlbXB0cyB0byBpbXBvcnQgdGhlCisgICAgcmVhZGxpbmUgbW9kdWxlIHRvIGVuYWJsZSBHTlUgcmVhZGxpbmUgaWYgaXQgaXMgYXZhaWxhYmxlLgorCisgICAgQXJndW1lbnRzIChhbGwgb3B0aW9uYWwsIGFsbCBkZWZhdWx0IHRvIE5vbmUpOgorCisgICAgYmFubmVyIC0tIHBhc3NlZCB0byBJbnRlcmFjdGl2ZUNvbnNvbGUuaW50ZXJhY3QoKQorICAgIHJlYWRmdW5jIC0tIGlmIG5vdCBOb25lLCByZXBsYWNlcyBJbnRlcmFjdGl2ZUNvbnNvbGUucmF3X2lucHV0KCkKKyAgICBsb2NhbCAtLSBwYXNzZWQgdG8gSW50ZXJhY3RpdmVJbnRlcnByZXRlci5fX2luaXRfXygpCisKKyAgICAiIiIKKyAgICBjb25zb2xlID0gSW50ZXJhY3RpdmVDb25zb2xlKGxvY2FsKQorICAgIGlmIHJlYWRmdW5jIGlzIG5vdCBOb25lOgorICAgICAgICBjb25zb2xlLnJhd19pbnB1dCA9IHJlYWRmdW5jCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHJlYWRsaW5lCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICBjb25zb2xlLmludGVyYWN0KGJhbm5lcikKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGludGVyYWN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29kZS5weWMgYi9saWIvcHl0aG9uMi43L2NvZGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNzI3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvZGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29kZS5weW8gYi9saWIvcHl0aG9uMi43L2NvZGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNzI3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvZGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29kZWNzLnB5IGIvbGliL3B5dGhvbjIuNy9jb2RlY3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjZDYwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29kZWNzLnB5CkBAIC0wLDAgKzEsMTA5OCBAQAorIiIiIGNvZGVjcyAtLSBQeXRob24gQ29kZWMgUmVnaXN0cnksIEFQSSBhbmQgaGVscGVycy4KKworCitXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KKworIiIiIyIKKworaW1wb3J0IF9fYnVpbHRpbl9fLCBzeXMKKworIyMjIFJlZ2lzdHJ5IGFuZCBidWlsdGluIHN0YXRlbGVzcyBjb2RlYyBmdW5jdGlvbnMKKwordHJ5OgorICAgIGZyb20gX2NvZGVjcyBpbXBvcnQgKgorZXhjZXB0IEltcG9ydEVycm9yLCB3aHk6CisgICAgcmFpc2UgU3lzdGVtRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIHRoZSBidWlsdGluIGNvZGVjczogJXMnICUgd2h5KQorCitfX2FsbF9fID0gWyJyZWdpc3RlciIsICJsb29rdXAiLCAib3BlbiIsICJFbmNvZGVkRmlsZSIsICJCT00iLCAiQk9NX0JFIiwKKyAgICAgICAgICAgIkJPTV9MRSIsICJCT00zMl9CRSIsICJCT00zMl9MRSIsICJCT002NF9CRSIsICJCT002NF9MRSIsCisgICAgICAgICAgICJCT01fVVRGOCIsICJCT01fVVRGMTYiLCAiQk9NX1VURjE2X0xFIiwgIkJPTV9VVEYxNl9CRSIsCisgICAgICAgICAgICJCT01fVVRGMzIiLCAiQk9NX1VURjMyX0xFIiwgIkJPTV9VVEYzMl9CRSIsCisgICAgICAgICAgICJzdHJpY3RfZXJyb3JzIiwgImlnbm9yZV9lcnJvcnMiLCAicmVwbGFjZV9lcnJvcnMiLAorICAgICAgICAgICAieG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzIiwKKyAgICAgICAgICAgInJlZ2lzdGVyX2Vycm9yIiwgImxvb2t1cF9lcnJvciJdCisKKyMjIyBDb25zdGFudHMKKworIworIyBCeXRlIE9yZGVyIE1hcmsgKEJPTSA9IFpFUk8gV0lEVEggTk8tQlJFQUsgU1BBQ0UgPSBVK0ZFRkYpCisjIGFuZCBpdHMgcG9zc2libGUgYnl0ZSBzdHJpbmcgdmFsdWVzCisjIGZvciBVVEY4L1VURjE2L1VURjMyIG91dHB1dCBhbmQgbGl0dGxlL2JpZyBlbmRpYW4gbWFjaGluZXMKKyMKKworIyBVVEYtOAorQk9NX1VURjggPSAnXHhlZlx4YmJceGJmJworCisjIFVURi0xNiwgbGl0dGxlIGVuZGlhbgorQk9NX0xFID0gQk9NX1VURjE2X0xFID0gJ1x4ZmZceGZlJworCisjIFVURi0xNiwgYmlnIGVuZGlhbgorQk9NX0JFID0gQk9NX1VURjE2X0JFID0gJ1x4ZmVceGZmJworCisjIFVURi0zMiwgbGl0dGxlIGVuZGlhbgorQk9NX1VURjMyX0xFID0gJ1x4ZmZceGZlXHgwMFx4MDAnCisKKyMgVVRGLTMyLCBiaWcgZW5kaWFuCitCT01fVVRGMzJfQkUgPSAnXHgwMFx4MDBceGZlXHhmZicKKworaWYgc3lzLmJ5dGVvcmRlciA9PSAnbGl0dGxlJzoKKworICAgICMgVVRGLTE2LCBuYXRpdmUgZW5kaWFubmVzcworICAgIEJPTSA9IEJPTV9VVEYxNiA9IEJPTV9VVEYxNl9MRQorCisgICAgIyBVVEYtMzIsIG5hdGl2ZSBlbmRpYW5uZXNzCisgICAgQk9NX1VURjMyID0gQk9NX1VURjMyX0xFCisKK2Vsc2U6CisKKyAgICAjIFVURi0xNiwgbmF0aXZlIGVuZGlhbm5lc3MKKyAgICBCT00gPSBCT01fVVRGMTYgPSBCT01fVVRGMTZfQkUKKworICAgICMgVVRGLTMyLCBuYXRpdmUgZW5kaWFubmVzcworICAgIEJPTV9VVEYzMiA9IEJPTV9VVEYzMl9CRQorCisjIE9sZCBicm9rZW4gbmFtZXMgKGRvbid0IHVzZSBpbiBuZXcgY29kZSkKK0JPTTMyX0xFID0gQk9NX1VURjE2X0xFCitCT00zMl9CRSA9IEJPTV9VVEYxNl9CRQorQk9NNjRfTEUgPSBCT01fVVRGMzJfTEUKK0JPTTY0X0JFID0gQk9NX1VURjMyX0JFCisKKworIyMjIENvZGVjIGJhc2UgY2xhc3NlcyAoZGVmaW5pbmcgdGhlIEFQSSkKKworY2xhc3MgQ29kZWNJbmZvKHR1cGxlKToKKworICAgIGRlZiBfX25ld19fKGNscywgZW5jb2RlLCBkZWNvZGUsIHN0cmVhbXJlYWRlcj1Ob25lLCBzdHJlYW13cml0ZXI9Tm9uZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPU5vbmUsIGluY3JlbWVudGFsZGVjb2Rlcj1Ob25lLCBuYW1lPU5vbmUpOgorICAgICAgICBzZWxmID0gdHVwbGUuX19uZXdfXyhjbHMsIChlbmNvZGUsIGRlY29kZSwgc3RyZWFtcmVhZGVyLCBzdHJlYW13cml0ZXIpKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZW5jb2RlID0gZW5jb2RlCisgICAgICAgIHNlbGYuZGVjb2RlID0gZGVjb2RlCisgICAgICAgIHNlbGYuaW5jcmVtZW50YWxlbmNvZGVyID0gaW5jcmVtZW50YWxlbmNvZGVyCisgICAgICAgIHNlbGYuaW5jcmVtZW50YWxkZWNvZGVyID0gaW5jcmVtZW50YWxkZWNvZGVyCisgICAgICAgIHNlbGYuc3RyZWFtd3JpdGVyID0gc3RyZWFtd3JpdGVyCisgICAgICAgIHNlbGYuc3RyZWFtcmVhZGVyID0gc3RyZWFtcmVhZGVyCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPCVzLiVzIG9iamVjdCBmb3IgZW5jb2RpbmcgJXMgYXQgMHgleD4iICUgKHNlbGYuX19jbGFzc19fLl9fbW9kdWxlX18sIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLm5hbWUsIGlkKHNlbGYpKQorCitjbGFzcyBDb2RlYzoKKworICAgICIiIiBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIHN0YXRlbGVzcyBlbmNvZGVycy9kZWNvZGVycy4KKworICAgICAgICBUaGUgLmVuY29kZSgpLy5kZWNvZGUoKSBtZXRob2RzIG1heSB1c2UgZGlmZmVyZW50IGVycm9yCisgICAgICAgIGhhbmRsaW5nIHNjaGVtZXMgYnkgcHJvdmlkaW5nIHRoZSBlcnJvcnMgYXJndW1lbnQuIFRoZXNlCisgICAgICAgIHN0cmluZyB2YWx1ZXMgYXJlIHByZWRlZmluZWQ6CisKKyAgICAgICAgICdzdHJpY3QnIC0gcmFpc2UgYSBWYWx1ZUVycm9yIGVycm9yIChvciBhIHN1YmNsYXNzKQorICAgICAgICAgJ2lnbm9yZScgLSBpZ25vcmUgdGhlIGNoYXJhY3RlciBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dAorICAgICAgICAgJ3JlcGxhY2UnIC0gcmVwbGFjZSB3aXRoIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyOworICAgICAgICAgICAgICAgICAgICBQeXRob24gd2lsbCB1c2UgdGhlIG9mZmljaWFsIFUrRkZGRCBSRVBMQUNFTUVOVAorICAgICAgICAgICAgICAgICAgICBDSEFSQUNURVIgZm9yIHRoZSBidWlsdGluIFVuaWNvZGUgY29kZWNzIG9uCisgICAgICAgICAgICAgICAgICAgIGRlY29kaW5nIGFuZCAnPycgb24gZW5jb2RpbmcuCisgICAgICAgICAneG1sY2hhcnJlZnJlcGxhY2UnIC0gUmVwbGFjZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBYTUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgcmVmZXJlbmNlIChvbmx5IGZvciBlbmNvZGluZykuCisgICAgICAgICAnYmFja3NsYXNocmVwbGFjZScgIC0gUmVwbGFjZSB3aXRoIGJhY2tzbGFzaGVkIGVzY2FwZSBzZXF1ZW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSBmb3IgZW5jb2RpbmcpLgorCisgICAgICAgIFRoZSBzZXQgb2YgYWxsb3dlZCB2YWx1ZXMgY2FuIGJlIGV4dGVuZGVkIHZpYSByZWdpc3Rlcl9lcnJvci4KKworICAgICIiIgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAgICAgIiIiIEVuY29kZXMgdGhlIG9iamVjdCBpbnB1dCBhbmQgcmV0dXJucyBhIHR1cGxlIChvdXRwdXQKKyAgICAgICAgICAgIG9iamVjdCwgbGVuZ3RoIGNvbnN1bWVkKS4KKworICAgICAgICAgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bworICAgICAgICAgICAgJ3N0cmljdCcgaGFuZGxpbmcuCisKKyAgICAgICAgICAgIFRoZSBtZXRob2QgbWF5IG5vdCBzdG9yZSBzdGF0ZSBpbiB0aGUgQ29kZWMgaW5zdGFuY2UuIFVzZQorICAgICAgICAgICAgU3RyZWFtQ29kZWMgZm9yIGNvZGVjcyB3aGljaCBoYXZlIHRvIGtlZXAgc3RhdGUgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgIG1ha2UgZW5jb2RpbmcvZGVjb2RpbmcgZWZmaWNpZW50LgorCisgICAgICAgICAgICBUaGUgZW5jb2RlciBtdXN0IGJlIGFibGUgdG8gaGFuZGxlIHplcm8gbGVuZ3RoIGlucHV0IGFuZAorICAgICAgICAgICAgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCBvZiB0aGUgb3V0cHV0IG9iamVjdCB0eXBlIGluIHRoaXMKKyAgICAgICAgICAgIHNpdHVhdGlvbi4KKworICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKworICAgICAgICAiIiIgRGVjb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAorICAgICAgICAgICAgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgorCisgICAgICAgICAgICBpbnB1dCBtdXN0IGJlIGFuIG9iamVjdCB3aGljaCBwcm92aWRlcyB0aGUgYmZfZ2V0cmVhZGJ1ZgorICAgICAgICAgICAgYnVmZmVyIHNsb3QuIFB5dGhvbiBzdHJpbmdzLCBidWZmZXIgb2JqZWN0cyBhbmQgbWVtb3J5CisgICAgICAgICAgICBtYXBwZWQgZmlsZXMgYXJlIGV4YW1wbGVzIG9mIG9iamVjdHMgcHJvdmlkaW5nIHRoaXMgc2xvdC4KKworICAgICAgICAgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bworICAgICAgICAgICAgJ3N0cmljdCcgaGFuZGxpbmcuCisKKyAgICAgICAgICAgIFRoZSBtZXRob2QgbWF5IG5vdCBzdG9yZSBzdGF0ZSBpbiB0aGUgQ29kZWMgaW5zdGFuY2UuIFVzZQorICAgICAgICAgICAgU3RyZWFtQ29kZWMgZm9yIGNvZGVjcyB3aGljaCBoYXZlIHRvIGtlZXAgc3RhdGUgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgIG1ha2UgZW5jb2RpbmcvZGVjb2RpbmcgZWZmaWNpZW50LgorCisgICAgICAgICAgICBUaGUgZGVjb2RlciBtdXN0IGJlIGFibGUgdG8gaGFuZGxlIHplcm8gbGVuZ3RoIGlucHV0IGFuZAorICAgICAgICAgICAgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCBvZiB0aGUgb3V0cHV0IG9iamVjdCB0eXBlIGluIHRoaXMKKyAgICAgICAgICAgIHNpdHVhdGlvbi4KKworICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIob2JqZWN0KToKKyAgICAiIiIKKyAgICBBbiBJbmNyZW1lbnRhbEVuY29kZXIgZW5jb2RlcyBhbiBpbnB1dCBpbiBtdWx0aXBsZSBzdGVwcy4gVGhlIGlucHV0IGNhbiBiZQorICAgIHBhc3NlZCBwaWVjZSBieSBwaWVjZSB0byB0aGUgZW5jb2RlKCkgbWV0aG9kLiBUaGUgSW5jcmVtZW50YWxFbmNvZGVyIHJlbWVtYmVycworICAgIHRoZSBzdGF0ZSBvZiB0aGUgRW5jb2RpbmcgcHJvY2VzcyBiZXR3ZWVuIGNhbGxzIHRvIGVuY29kZSgpLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlcyBhbiBJbmNyZW1lbnRhbEVuY29kZXIgaW5zdGFuY2UuCisKKyAgICAgICAgVGhlIEluY3JlbWVudGFsRW5jb2RlciBtYXkgdXNlIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWVzIGJ5CisgICAgICAgIHByb3ZpZGluZyB0aGUgZXJyb3JzIGtleXdvcmQgYXJndW1lbnQuIFNlZSB0aGUgbW9kdWxlIGRvY3N0cmluZworICAgICAgICBmb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisgICAgICAgIHNlbGYuYnVmZmVyID0gIiIKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgIiIiCisgICAgICAgIEVuY29kZXMgaW5wdXQgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXNldHMgdGhlIGVuY29kZXIgdG8gdGhlIGluaXRpYWwgc3RhdGUuCisgICAgICAgICIiIgorCisgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBlbmNvZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBzZXRzdGF0ZShzZWxmLCBzdGF0ZSk6CisgICAgICAgICIiIgorICAgICAgICBTZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGVuY29kZXIuIHN0YXRlIG11c3QgaGF2ZSBiZWVuCisgICAgICAgIHJldHVybmVkIGJ5IGdldHN0YXRlKCkuCisgICAgICAgICIiIgorCitjbGFzcyBCdWZmZXJlZEluY3JlbWVudGFsRW5jb2RlcihJbmNyZW1lbnRhbEVuY29kZXIpOgorICAgICIiIgorICAgIFRoaXMgc3ViY2xhc3Mgb2YgSW5jcmVtZW50YWxFbmNvZGVyIGNhbiBiZSB1c2VkIGFzIHRoZSBiYXNlY2xhc3MgZm9yIGFuCisgICAgaW5jcmVtZW50YWwgZW5jb2RlciBpZiB0aGUgZW5jb2RlciBtdXN0IGtlZXAgc29tZSBvZiB0aGUgb3V0cHV0IGluIGEKKyAgICBidWZmZXIgYmV0d2VlbiBjYWxscyB0byBlbmNvZGUoKS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgSW5jcmVtZW50YWxFbmNvZGVyLl9faW5pdF9fKHNlbGYsIGVycm9ycykKKyAgICAgICAgc2VsZi5idWZmZXIgPSAiIiAjIHVuZW5jb2RlZCBpbnB1dCB0aGF0IGlzIGtlcHQgYmV0d2VlbiBjYWxscyB0byBlbmNvZGUoKQorCisgICAgZGVmIF9idWZmZXJfZW5jb2RlKHNlbGYsIGlucHV0LCBlcnJvcnMsIGZpbmFsKToKKyAgICAgICAgIyBPdmVyd3JpdGUgdGhpcyBtZXRob2QgaW4gc3ViY2xhc3NlczogSXQgbXVzdCBlbmNvZGUgaW5wdXQKKyAgICAgICAgIyBhbmQgcmV0dXJuIGFuIChvdXRwdXQsIGxlbmd0aCBjb25zdW1lZCkgdHVwbGUKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICAjIGVuY29kZSBpbnB1dCAodGFraW5nIHRoZSBidWZmZXIgaW50byBhY2NvdW50KQorICAgICAgICBkYXRhID0gc2VsZi5idWZmZXIgKyBpbnB1dAorICAgICAgICAocmVzdWx0LCBjb25zdW1lZCkgPSBzZWxmLl9idWZmZXJfZW5jb2RlKGRhdGEsIHNlbGYuZXJyb3JzLCBmaW5hbCkKKyAgICAgICAgIyBrZWVwIHVuZW5jb2RlZCBpbnB1dCB1bnRpbCB0aGUgbmV4dCBjYWxsCisgICAgICAgIHNlbGYuYnVmZmVyID0gZGF0YVtjb25zdW1lZDpdCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgSW5jcmVtZW50YWxFbmNvZGVyLnJlc2V0KHNlbGYpCisgICAgICAgIHNlbGYuYnVmZmVyID0gIiIKKworICAgIGRlZiBnZXRzdGF0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYnVmZmVyIG9yIDAKKworICAgIGRlZiBzZXRzdGF0ZShzZWxmLCBzdGF0ZSk6CisgICAgICAgIHNlbGYuYnVmZmVyID0gc3RhdGUgb3IgIiIKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG9iamVjdCk6CisgICAgIiIiCisgICAgQW4gSW5jcmVtZW50YWxEZWNvZGVyIGRlY29kZXMgYW4gaW5wdXQgaW4gbXVsdGlwbGUgc3RlcHMuIFRoZSBpbnB1dCBjYW4gYmUKKyAgICBwYXNzZWQgcGllY2UgYnkgcGllY2UgdG8gdGhlIGRlY29kZSgpIG1ldGhvZC4gVGhlIEluY3JlbWVudGFsRGVjb2RlcgorICAgIHJlbWVtYmVycyB0aGUgc3RhdGUgb2YgdGhlIGRlY29kaW5nIHByb2Nlc3MgYmV0d2VlbiBjYWxscyB0byBkZWNvZGUoKS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZXMgYSBJbmNyZW1lbnRhbERlY29kZXIgaW5zdGFuY2UuCisKKyAgICAgICAgVGhlIEluY3JlbWVudGFsRGVjb2RlciBtYXkgdXNlIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWVzIGJ5CisgICAgICAgIHByb3ZpZGluZyB0aGUgZXJyb3JzIGtleXdvcmQgYXJndW1lbnQuIFNlZSB0aGUgbW9kdWxlIGRvY3N0cmluZworICAgICAgICBmb3IgYSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgICIiIgorICAgICAgICBEZWNvZGVzIGlucHV0IGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2JqZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVzZXRzIHRoZSBkZWNvZGVyIHRvIHRoZSBpbml0aWFsIHN0YXRlLgorICAgICAgICAiIiIKKworICAgIGRlZiBnZXRzdGF0ZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGVjb2Rlci4KKworICAgICAgICBUaGlzIG11c3QgYmUgYSAoYnVmZmVyZWRfaW5wdXQsIGFkZGl0aW9uYWxfc3RhdGVfaW5mbykgdHVwbGUuCisgICAgICAgIGJ1ZmZlcmVkX2lucHV0IG11c3QgYmUgYSBieXRlcyBvYmplY3QgY29udGFpbmluZyBieXRlcyB0aGF0CisgICAgICAgIHdlcmUgcGFzc2VkIHRvIGRlY29kZSgpIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gY29udmVydGVkLgorICAgICAgICBhZGRpdGlvbmFsX3N0YXRlX2luZm8gbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyCisgICAgICAgIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgdGhlIGRlY29kZXIgV0lUSE9VVCB5ZXQgaGF2aW5nCisgICAgICAgIHByb2Nlc3NlZCB0aGUgY29udGVudHMgb2YgYnVmZmVyZWRfaW5wdXQuICBJbiB0aGUgaW5pdGlhbCBzdGF0ZQorICAgICAgICBhbmQgYWZ0ZXIgcmVzZXQoKSwgZ2V0c3RhdGUoKSBtdXN0IHJldHVybiAoYiIiLCAwKS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAoYiIiLCAwKQorCisgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgIiIiCisgICAgICAgIFNldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGVjb2Rlci4KKworICAgICAgICBzdGF0ZSBtdXN0IGhhdmUgYmVlbiByZXR1cm5lZCBieSBnZXRzdGF0ZSgpLiAgVGhlIGVmZmVjdCBvZgorICAgICAgICBzZXRzdGF0ZSgoYiIiLCAwKSkgbXVzdCBiZSBlcXVpdmFsZW50IHRvIHJlc2V0KCkuCisgICAgICAgICIiIgorCitjbGFzcyBCdWZmZXJlZEluY3JlbWVudGFsRGVjb2RlcihJbmNyZW1lbnRhbERlY29kZXIpOgorICAgICIiIgorICAgIFRoaXMgc3ViY2xhc3Mgb2YgSW5jcmVtZW50YWxEZWNvZGVyIGNhbiBiZSB1c2VkIGFzIHRoZSBiYXNlY2xhc3MgZm9yIGFuCisgICAgaW5jcmVtZW50YWwgZGVjb2RlciBpZiB0aGUgZGVjb2RlciBtdXN0IGJlIGFibGUgdG8gaGFuZGxlIGluY29tcGxldGUgYnl0ZQorICAgIHNlcXVlbmNlcy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgSW5jcmVtZW50YWxEZWNvZGVyLl9faW5pdF9fKHNlbGYsIGVycm9ycykKKyAgICAgICAgc2VsZi5idWZmZXIgPSAiIiAjIHVuZGVjb2RlZCBpbnB1dCB0aGF0IGlzIGtlcHQgYmV0d2VlbiBjYWxscyB0byBkZWNvZGUoKQorCisgICAgZGVmIF9idWZmZXJfZGVjb2RlKHNlbGYsIGlucHV0LCBlcnJvcnMsIGZpbmFsKToKKyAgICAgICAgIyBPdmVyd3JpdGUgdGhpcyBtZXRob2QgaW4gc3ViY2xhc3NlczogSXQgbXVzdCBkZWNvZGUgaW5wdXQKKyAgICAgICAgIyBhbmQgcmV0dXJuIGFuIChvdXRwdXQsIGxlbmd0aCBjb25zdW1lZCkgdHVwbGUKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICAjIGRlY29kZSBpbnB1dCAodGFraW5nIHRoZSBidWZmZXIgaW50byBhY2NvdW50KQorICAgICAgICBkYXRhID0gc2VsZi5idWZmZXIgKyBpbnB1dAorICAgICAgICAocmVzdWx0LCBjb25zdW1lZCkgPSBzZWxmLl9idWZmZXJfZGVjb2RlKGRhdGEsIHNlbGYuZXJyb3JzLCBmaW5hbCkKKyAgICAgICAgIyBrZWVwIHVuZGVjb2RlZCBpbnB1dCB1bnRpbCB0aGUgbmV4dCBjYWxsCisgICAgICAgIHNlbGYuYnVmZmVyID0gZGF0YVtjb25zdW1lZDpdCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgSW5jcmVtZW50YWxEZWNvZGVyLnJlc2V0KHNlbGYpCisgICAgICAgIHNlbGYuYnVmZmVyID0gIiIKKworICAgIGRlZiBnZXRzdGF0ZShzZWxmKToKKyAgICAgICAgIyBhZGRpdGlvbmFsIHN0YXRlIGluZm8gaXMgYWx3YXlzIDAKKyAgICAgICAgcmV0dXJuIChzZWxmLmJ1ZmZlciwgMCkKKworICAgIGRlZiBzZXRzdGF0ZShzZWxmLCBzdGF0ZSk6CisgICAgICAgICMgaWdub3JlIGFkZGl0aW9uYWwgc3RhdGUgaW5mbworICAgICAgICBzZWxmLmJ1ZmZlciA9IHN0YXRlWzBdCisKKyMKKyMgVGhlIFN0cmVhbVdyaXRlciBhbmQgU3RyZWFtUmVhZGVyIGNsYXNzIHByb3ZpZGUgZ2VuZXJpYyB3b3JraW5nCisjIGludGVyZmFjZXMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IG5ldyBlbmNvZGluZyBzdWJtb2R1bGVzCisjIHZlcnkgZWFzaWx5LiBTZWUgZW5jb2RpbmdzL3V0Zl84LnB5IGZvciBhbiBleGFtcGxlIG9uIGhvdyB0aGlzIGlzCisjIGRvbmUuCisjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgorCisgICAgICAgICIiIiBDcmVhdGVzIGEgU3RyZWFtV3JpdGVyIGluc3RhbmNlLgorCisgICAgICAgICAgICBzdHJlYW0gbXVzdCBiZSBhIGZpbGUtbGlrZSBvYmplY3Qgb3BlbiBmb3Igd3JpdGluZworICAgICAgICAgICAgKGJpbmFyeSkgZGF0YS4KKworICAgICAgICAgICAgVGhlIFN0cmVhbVdyaXRlciBtYXkgdXNlIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZworICAgICAgICAgICAgc2NoZW1lcyBieSBwcm92aWRpbmcgdGhlIGVycm9ycyBrZXl3b3JkIGFyZ3VtZW50LiBUaGVzZQorICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgcHJlZGVmaW5lZDoKKworICAgICAgICAgICAgICdzdHJpY3QnIC0gcmFpc2UgYSBWYWx1ZUVycm9yIChvciBhIHN1YmNsYXNzKQorICAgICAgICAgICAgICdpZ25vcmUnIC0gaWdub3JlIHRoZSBjaGFyYWN0ZXIgYW5kIGNvbnRpbnVlIHdpdGggdGhlIG5leHQKKyAgICAgICAgICAgICAncmVwbGFjZSctIHJlcGxhY2Ugd2l0aCBhIHN1aXRhYmxlIHJlcGxhY2VtZW50IGNoYXJhY3RlcgorICAgICAgICAgICAgICd4bWxjaGFycmVmcmVwbGFjZScgLSBSZXBsYWNlIHdpdGggdGhlIGFwcHJvcHJpYXRlIFhNTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgcmVmZXJlbmNlLgorICAgICAgICAgICAgICdiYWNrc2xhc2hyZXBsYWNlJyAgLSBSZXBsYWNlIHdpdGggYmFja3NsYXNoZWQgZXNjYXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlcyAob25seSBmb3IgZW5jb2RpbmcpLgorCisgICAgICAgICAgICBUaGUgc2V0IG9mIGFsbG93ZWQgcGFyYW1ldGVyIHZhbHVlcyBjYW4gYmUgZXh0ZW5kZWQgdmlhCisgICAgICAgICAgICByZWdpc3Rlcl9lcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCisgICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgb2JqZWN0KToKKworICAgICAgICAiIiIgV3JpdGVzIHRoZSBvYmplY3QncyBjb250ZW50cyBlbmNvZGVkIHRvIHNlbGYuc3RyZWFtLgorICAgICAgICAiIiIKKyAgICAgICAgZGF0YSwgY29uc3VtZWQgPSBzZWxmLmVuY29kZShvYmplY3QsIHNlbGYuZXJyb3JzKQorICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShkYXRhKQorCisgICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgbGlzdCk6CisKKyAgICAgICAgIiIiIFdyaXRlcyB0aGUgY29uY2F0ZW5hdGVkIGxpc3Qgb2Ygc3RyaW5ncyB0byB0aGUgc3RyZWFtCisgICAgICAgICAgICB1c2luZyAud3JpdGUoKS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYud3JpdGUoJycuam9pbihsaXN0KSkKKworICAgIGRlZiByZXNldChzZWxmKToKKworICAgICAgICAiIiIgRmx1c2hlcyBhbmQgcmVzZXRzIHRoZSBjb2RlYyBidWZmZXJzIHVzZWQgZm9yIGtlZXBpbmcgc3RhdGUuCisKKyAgICAgICAgICAgIENhbGxpbmcgdGhpcyBtZXRob2Qgc2hvdWxkIGVuc3VyZSB0aGF0IHRoZSBkYXRhIG9uIHRoZQorICAgICAgICAgICAgb3V0cHV0IGlzIHB1dCBpbnRvIGEgY2xlYW4gc3RhdGUsIHRoYXQgYWxsb3dzIGFwcGVuZGluZworICAgICAgICAgICAgb2YgbmV3IGZyZXNoIGRhdGEgd2l0aG91dCBoYXZpbmcgdG8gcmVzY2FuIHRoZSB3aG9sZQorICAgICAgICAgICAgc3RyZWFtIHRvIHJlY292ZXIgc3RhdGUuCisKKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBzZWVrKHNlbGYsIG9mZnNldCwgd2hlbmNlPTApOgorICAgICAgICBzZWxmLnN0cmVhbS5zZWVrKG9mZnNldCwgd2hlbmNlKQorICAgICAgICBpZiB3aGVuY2UgPT0gMCBhbmQgb2Zmc2V0ID09IDA6CisgICAgICAgICAgICBzZWxmLnJlc2V0KCkKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICBnZXRhdHRyPWdldGF0dHIpOgorCisgICAgICAgICIiIiBJbmhlcml0IGFsbCBvdGhlciBtZXRob2RzIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5zdHJlYW0sIG5hbWUpCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0Yik6CisgICAgICAgIHNlbGYuc3RyZWFtLmNsb3NlKCkKKworIyMjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgorCisgICAgICAgICIiIiBDcmVhdGVzIGEgU3RyZWFtUmVhZGVyIGluc3RhbmNlLgorCisgICAgICAgICAgICBzdHJlYW0gbXVzdCBiZSBhIGZpbGUtbGlrZSBvYmplY3Qgb3BlbiBmb3IgcmVhZGluZworICAgICAgICAgICAgKGJpbmFyeSkgZGF0YS4KKworICAgICAgICAgICAgVGhlIFN0cmVhbVJlYWRlciBtYXkgdXNlIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZworICAgICAgICAgICAgc2NoZW1lcyBieSBwcm92aWRpbmcgdGhlIGVycm9ycyBrZXl3b3JkIGFyZ3VtZW50LiBUaGVzZQorICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgcHJlZGVmaW5lZDoKKworICAgICAgICAgICAgICdzdHJpY3QnIC0gcmFpc2UgYSBWYWx1ZUVycm9yIChvciBhIHN1YmNsYXNzKQorICAgICAgICAgICAgICdpZ25vcmUnIC0gaWdub3JlIHRoZSBjaGFyYWN0ZXIgYW5kIGNvbnRpbnVlIHdpdGggdGhlIG5leHQKKyAgICAgICAgICAgICAncmVwbGFjZSctIHJlcGxhY2Ugd2l0aCBhIHN1aXRhYmxlIHJlcGxhY2VtZW50IGNoYXJhY3RlcjsKKworICAgICAgICAgICAgVGhlIHNldCBvZiBhbGxvd2VkIHBhcmFtZXRlciB2YWx1ZXMgY2FuIGJlIGV4dGVuZGVkIHZpYQorICAgICAgICAgICAgcmVnaXN0ZXJfZXJyb3IuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQorICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycworICAgICAgICBzZWxmLmJ5dGVidWZmZXIgPSAiIgorICAgICAgICAjIEZvciBzdHItPnN0ciBkZWNvZGluZyB0aGlzIHdpbGwgc3RheSBhIHN0cgorICAgICAgICAjIEZvciBzdHItPnVuaWNvZGUgZGVjb2RpbmcgdGhlIGZpcnN0IHJlYWQgd2lsbCBwcm9tb3RlIGl0IHRvIHVuaWNvZGUKKyAgICAgICAgc2VsZi5jaGFyYnVmZmVyID0gIiIKKyAgICAgICAgc2VsZi5saW5lYnVmZmVyID0gTm9uZQorCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT0tMSwgY2hhcnM9LTEsIGZpcnN0bGluZT1GYWxzZSk6CisKKyAgICAgICAgIiIiIERlY29kZXMgZGF0YSBmcm9tIHRoZSBzdHJlYW0gc2VsZi5zdHJlYW0gYW5kIHJldHVybnMgdGhlCisgICAgICAgICAgICByZXN1bHRpbmcgb2JqZWN0LgorCisgICAgICAgICAgICBjaGFycyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQgZnJvbSB0aGUKKyAgICAgICAgICAgIHN0cmVhbS4gcmVhZCgpIHdpbGwgbmV2ZXIgcmV0dXJuIG1vcmUgdGhhbiBjaGFycworICAgICAgICAgICAgY2hhcmFjdGVycywgYnV0IGl0IG1pZ2h0IHJldHVybiBsZXNzLCBpZiB0aGVyZSBhcmUgbm90IGVub3VnaAorICAgICAgICAgICAgY2hhcmFjdGVycyBhdmFpbGFibGUuCisKKyAgICAgICAgICAgIHNpemUgaW5kaWNhdGVzIHRoZSBhcHByb3hpbWF0ZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0bworICAgICAgICAgICAgcmVhZCBmcm9tIHRoZSBzdHJlYW0gZm9yIGRlY29kaW5nIHB1cnBvc2VzLiBUaGUgZGVjb2RlcgorICAgICAgICAgICAgY2FuIG1vZGlmeSB0aGlzIHNldHRpbmcgYXMgYXBwcm9wcmlhdGUuIFRoZSBkZWZhdWx0IHZhbHVlCisgICAgICAgICAgICAtMSBpbmRpY2F0ZXMgdG8gcmVhZCBhbmQgZGVjb2RlIGFzIG11Y2ggYXMgcG9zc2libGUuICBzaXplCisgICAgICAgICAgICBpcyBpbnRlbmRlZCB0byBwcmV2ZW50IGhhdmluZyB0byBkZWNvZGUgaHVnZSBmaWxlcyBpbiBvbmUKKyAgICAgICAgICAgIHN0ZXAuCisKKyAgICAgICAgICAgIElmIGZpcnN0bGluZSBpcyB0cnVlLCBhbmQgYSBVbmljb2RlRGVjb2RlRXJyb3IgaGFwcGVucworICAgICAgICAgICAgYWZ0ZXIgdGhlIGZpcnN0IGxpbmUgdGVybWluYXRvciBpbiB0aGUgaW5wdXQgb25seSB0aGUgZmlyc3QgbGluZQorICAgICAgICAgICAgd2lsbCBiZSByZXR1cm5lZCwgdGhlIHJlc3Qgb2YgdGhlIGlucHV0IHdpbGwgYmUga2VwdCB1bnRpbCB0aGUKKyAgICAgICAgICAgIG5leHQgY2FsbCB0byByZWFkKCkuCisKKyAgICAgICAgICAgIFRoZSBtZXRob2Qgc2hvdWxkIHVzZSBhIGdyZWVkeSByZWFkIHN0cmF0ZWd5IG1lYW5pbmcgdGhhdAorICAgICAgICAgICAgaXQgc2hvdWxkIHJlYWQgYXMgbXVjaCBkYXRhIGFzIGlzIGFsbG93ZWQgd2l0aGluIHRoZQorICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiB0aGUgZW5jb2RpbmcgYW5kIHRoZSBnaXZlbiBzaXplLCBlLmcuICBpZgorICAgICAgICAgICAgb3B0aW9uYWwgZW5jb2RpbmcgZW5kaW5ncyBvciBzdGF0ZSBtYXJrZXJzIGFyZSBhdmFpbGFibGUKKyAgICAgICAgICAgIG9uIHRoZSBzdHJlYW0sIHRoZXNlIHNob3VsZCBiZSByZWFkIHRvby4KKyAgICAgICAgIiIiCisgICAgICAgICMgSWYgd2UgaGF2ZSBsaW5lcyBjYWNoZWQsIGZpcnN0IG1lcmdlIHRoZW0gYmFjayBpbnRvIGNoYXJhY3RlcnMKKyAgICAgICAgaWYgc2VsZi5saW5lYnVmZmVyOgorICAgICAgICAgICAgc2VsZi5jaGFyYnVmZmVyID0gIiIuam9pbihzZWxmLmxpbmVidWZmZXIpCisgICAgICAgICAgICBzZWxmLmxpbmVidWZmZXIgPSBOb25lCisKKyAgICAgICAgIyByZWFkIHVudGlsIHdlIGdldCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKGlmIGF2YWlsYWJsZSkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICMgY2FuIHRoZSByZXF1ZXN0IGNhbiBiZSBzYXRpc2ZpZWQgZnJvbSB0aGUgY2hhcmFjdGVyIGJ1ZmZlcj8KKyAgICAgICAgICAgIGlmIGNoYXJzIDwgMDoKKyAgICAgICAgICAgICAgICBpZiBzaXplIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jaGFyYnVmZmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIGxlbihzZWxmLmNoYXJidWZmZXIpID49IHNpemU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGxlbihzZWxmLmNoYXJidWZmZXIpID49IGNoYXJzOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIyB3ZSBuZWVkIG1vcmUgZGF0YQorICAgICAgICAgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgICAgICAgICAgbmV3ZGF0YSA9IHNlbGYuc3RyZWFtLnJlYWQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdkYXRhID0gc2VsZi5zdHJlYW0ucmVhZChzaXplKQorICAgICAgICAgICAgIyBkZWNvZGUgYnl0ZXMgKHRob3NlIHJlbWFpbmluZyBmcm9tIHRoZSBsYXN0IGNhbGwgaW5jbHVkZWQpCisgICAgICAgICAgICBkYXRhID0gc2VsZi5ieXRlYnVmZmVyICsgbmV3ZGF0YQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG5ld2NoYXJzLCBkZWNvZGVkYnl0ZXMgPSBzZWxmLmRlY29kZShkYXRhLCBzZWxmLmVycm9ycykKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3IsIGV4YzoKKyAgICAgICAgICAgICAgICBpZiBmaXJzdGxpbmU6CisgICAgICAgICAgICAgICAgICAgIG5ld2NoYXJzLCBkZWNvZGVkYnl0ZXMgPSBzZWxmLmRlY29kZShkYXRhWzpleGMuc3RhcnRdLCBzZWxmLmVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBuZXdjaGFycy5zcGxpdGxpbmVzKFRydWUpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lcyk8PTE6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAjIGtlZXAgdW5kZWNvZGVkIGJ5dGVzIHVudGlsIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgICAgIHNlbGYuYnl0ZWJ1ZmZlciA9IGRhdGFbZGVjb2RlZGJ5dGVzOl0KKyAgICAgICAgICAgICMgcHV0IG5ldyBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyYWN0ZXIgYnVmZmVyCisgICAgICAgICAgICBzZWxmLmNoYXJidWZmZXIgKz0gbmV3Y2hhcnMKKyAgICAgICAgICAgICMgdGhlcmUgd2FzIG5vIGRhdGEgYXZhaWxhYmxlCisgICAgICAgICAgICBpZiBub3QgbmV3ZGF0YToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBjaGFycyA8IDA6CisgICAgICAgICAgICAjIFJldHVybiBldmVyeXRoaW5nIHdlJ3ZlIGdvdAorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jaGFyYnVmZmVyCisgICAgICAgICAgICBzZWxmLmNoYXJidWZmZXIgPSAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBSZXR1cm4gdGhlIGZpcnN0IGNoYXJzIGNoYXJhY3RlcnMKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY2hhcmJ1ZmZlcls6Y2hhcnNdCisgICAgICAgICAgICBzZWxmLmNoYXJidWZmZXIgPSBzZWxmLmNoYXJidWZmZXJbY2hhcnM6XQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT1Ob25lLCBrZWVwZW5kcz1UcnVlKToKKworICAgICAgICAiIiIgUmVhZCBvbmUgbGluZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gYW5kIHJldHVybiB0aGUKKyAgICAgICAgICAgIGRlY29kZWQgZGF0YS4KKworICAgICAgICAgICAgc2l6ZSwgaWYgZ2l2ZW4sIGlzIHBhc3NlZCBhcyBzaXplIGFyZ3VtZW50IHRvIHRoZQorICAgICAgICAgICAgcmVhZCgpIG1ldGhvZC4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBJZiB3ZSBoYXZlIGxpbmVzIGNhY2hlZCBmcm9tIGFuIGVhcmxpZXIgcmVhZCwgcmV0dXJuCisgICAgICAgICMgdGhlbSB1bmNvbmRpdGlvbmFsbHkKKyAgICAgICAgaWYgc2VsZi5saW5lYnVmZmVyOgorICAgICAgICAgICAgbGluZSA9IHNlbGYubGluZWJ1ZmZlclswXQorICAgICAgICAgICAgZGVsIHNlbGYubGluZWJ1ZmZlclswXQorICAgICAgICAgICAgaWYgbGVuKHNlbGYubGluZWJ1ZmZlcikgPT0gMToKKyAgICAgICAgICAgICAgICAjIHJldmVydCB0byBjaGFyYnVmZmVyIG1vZGU7IHdlIG1pZ2h0IG5lZWQgbW9yZSBkYXRhCisgICAgICAgICAgICAgICAgIyBuZXh0IHRpbWUKKyAgICAgICAgICAgICAgICBzZWxmLmNoYXJidWZmZXIgPSBzZWxmLmxpbmVidWZmZXJbMF0KKyAgICAgICAgICAgICAgICBzZWxmLmxpbmVidWZmZXIgPSBOb25lCisgICAgICAgICAgICBpZiBub3Qga2VlcGVuZHM6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3BsaXRsaW5lcyhGYWxzZSlbMF0KKyAgICAgICAgICAgIHJldHVybiBsaW5lCisKKyAgICAgICAgcmVhZHNpemUgPSBzaXplIG9yIDcyCisgICAgICAgIGxpbmUgPSAiIgorICAgICAgICAjIElmIHNpemUgaXMgZ2l2ZW4sIHdlIGNhbGwgcmVhZCgpIG9ubHkgb25jZQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgZGF0YSA9IHNlbGYucmVhZChyZWFkc2l6ZSwgZmlyc3RsaW5lPVRydWUpCisgICAgICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgICAgICMgSWYgd2UncmUgYXQgYSAiXHIiIHJlYWQgb25lIGV4dHJhIGNoYXJhY3RlciAod2hpY2ggbWlnaHQKKyAgICAgICAgICAgICAgICAjIGJlIGEgIlxuIikgdG8gZ2V0IGEgcHJvcGVyIGxpbmUgZW5kaW5nLiBJZiB0aGUgc3RyZWFtIGlzCisgICAgICAgICAgICAgICAgIyB0ZW1wb3JhcmlseSBleGhhdXN0ZWQgd2UgcmV0dXJuIHRoZSB3cm9uZyBsaW5lIGVuZGluZy4KKyAgICAgICAgICAgICAgICBpZiBkYXRhLmVuZHN3aXRoKCJcciIpOgorICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHNlbGYucmVhZChzaXplPTEsIGNoYXJzPTEpCisKKyAgICAgICAgICAgIGxpbmUgKz0gZGF0YQorICAgICAgICAgICAgbGluZXMgPSBsaW5lLnNwbGl0bGluZXMoVHJ1ZSkKKyAgICAgICAgICAgIGlmIGxpbmVzOgorICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lcykgPiAxOgorICAgICAgICAgICAgICAgICAgICAjIE1vcmUgdGhhbiBvbmUgbGluZSByZXN1bHQ7IHRoZSBmaXJzdCBsaW5lIGlzIGEgZnVsbCBsaW5lCisgICAgICAgICAgICAgICAgICAgICMgdG8gcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lc1swXQorICAgICAgICAgICAgICAgICAgICBkZWwgbGluZXNbMF0KKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGxpbmVzKSA+IDE6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGNhY2hlIHRoZSByZW1haW5pbmcgbGluZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzWy0xXSArPSBzZWxmLmNoYXJidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZWJ1ZmZlciA9IGxpbmVzCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYXJidWZmZXIgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgb25lIHJlbWFpbmluZyBsaW5lLCBwdXQgaXQgYmFjayBpbnRvIGNoYXJidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhcmJ1ZmZlciA9IGxpbmVzWzBdICsgc2VsZi5jaGFyYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBrZWVwZW5kczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNwbGl0bGluZXMoRmFsc2UpWzBdCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgbGluZTB3aXRoZW5kID0gbGluZXNbMF0KKyAgICAgICAgICAgICAgICBsaW5lMHdpdGhvdXRlbmQgPSBsaW5lc1swXS5zcGxpdGxpbmVzKEZhbHNlKVswXQorICAgICAgICAgICAgICAgIGlmIGxpbmUwd2l0aGVuZCAhPSBsaW5lMHdpdGhvdXRlbmQ6ICMgV2UgcmVhbGx5IGhhdmUgYSBsaW5lIGVuZAorICAgICAgICAgICAgICAgICAgICAjIFB1dCB0aGUgcmVzdCBiYWNrIHRvZ2V0aGVyIGFuZCBrZWVwIGl0IHVudGlsIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGFyYnVmZmVyID0gIiIuam9pbihsaW5lc1sxOl0pICsgc2VsZi5jaGFyYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGlmIGtlZXBlbmRzOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUwd2l0aGVuZAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUwd2l0aG91dGVuZAorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIyB3ZSBkaWRuJ3QgZ2V0IGFueXRoaW5nIG9yIHRoaXMgd2FzIG91ciBvbmx5IHRyeQorICAgICAgICAgICAgaWYgbm90IGRhdGEgb3Igc2l6ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBsaW5lIGFuZCBub3Qga2VlcGVuZHM6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNwbGl0bGluZXMoRmFsc2UpWzBdCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIHJlYWRzaXplPDgwMDA6CisgICAgICAgICAgICAgICAgcmVhZHNpemUgKj0gMgorICAgICAgICByZXR1cm4gbGluZQorCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmLCBzaXplaGludD1Ob25lLCBrZWVwZW5kcz1UcnVlKToKKworICAgICAgICAiIiIgUmVhZCBhbGwgbGluZXMgYXZhaWxhYmxlIG9uIHRoZSBpbnB1dCBzdHJlYW0KKyAgICAgICAgICAgIGFuZCByZXR1cm4gdGhlbSBhcyBsaXN0IG9mIGxpbmVzLgorCisgICAgICAgICAgICBMaW5lIGJyZWFrcyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIGNvZGVjJ3MgZGVjb2RlcgorICAgICAgICAgICAgbWV0aG9kIGFuZCBhcmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QgZW50cmllcy4KKworICAgICAgICAgICAgc2l6ZWhpbnQsIGlmIGdpdmVuLCBpcyBpZ25vcmVkIHNpbmNlIHRoZXJlIGlzIG5vIGVmZmljaWVudAorICAgICAgICAgICAgd2F5IHRvIGZpbmRpbmcgdGhlIHRydWUgZW5kLW9mLWxpbmUuCisKKyAgICAgICAgIiIiCisgICAgICAgIGRhdGEgPSBzZWxmLnJlYWQoKQorICAgICAgICByZXR1cm4gZGF0YS5zcGxpdGxpbmVzKGtlZXBlbmRzKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorCisgICAgICAgICIiIiBSZXNldHMgdGhlIGNvZGVjIGJ1ZmZlcnMgdXNlZCBmb3Iga2VlcGluZyBzdGF0ZS4KKworICAgICAgICAgICAgTm90ZSB0aGF0IG5vIHN0cmVhbSByZXBvc2l0aW9uaW5nIHNob3VsZCB0YWtlIHBsYWNlLgorICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGJlIGFibGUgdG8gcmVjb3ZlcgorICAgICAgICAgICAgZnJvbSBkZWNvZGluZyBlcnJvcnMuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYnl0ZWJ1ZmZlciA9ICIiCisgICAgICAgIHNlbGYuY2hhcmJ1ZmZlciA9IHUiIgorICAgICAgICBzZWxmLmxpbmVidWZmZXIgPSBOb25lCisKKyAgICBkZWYgc2VlayhzZWxmLCBvZmZzZXQsIHdoZW5jZT0wKToKKyAgICAgICAgIiIiIFNldCB0aGUgaW5wdXQgc3RyZWFtJ3MgY3VycmVudCBwb3NpdGlvbi4KKworICAgICAgICAgICAgUmVzZXRzIHRoZSBjb2RlYyBidWZmZXJzIHVzZWQgZm9yIGtlZXBpbmcgc3RhdGUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnN0cmVhbS5zZWVrKG9mZnNldCwgd2hlbmNlKQorICAgICAgICBzZWxmLnJlc2V0KCkKKworICAgIGRlZiBuZXh0KHNlbGYpOgorCisgICAgICAgICIiIiBSZXR1cm4gdGhlIG5leHQgZGVjb2RlZCBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmVhbS4iIiIKKyAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgcmV0dXJuIGxpbmUKKyAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGdldGF0dHI9Z2V0YXR0cik6CisKKyAgICAgICAgIiIiIEluaGVyaXQgYWxsIG90aGVyIG1ldGhvZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnN0cmVhbSwgbmFtZSkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRiKToKKyAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQorCisjIyMKKworY2xhc3MgU3RyZWFtUmVhZGVyV3JpdGVyOgorCisgICAgIiIiIFN0cmVhbVJlYWRlcldyaXRlciBpbnN0YW5jZXMgYWxsb3cgd3JhcHBpbmcgc3RyZWFtcyB3aGljaAorICAgICAgICB3b3JrIGluIGJvdGggcmVhZCBhbmQgd3JpdGUgbW9kZXMuCisKKyAgICAgICAgVGhlIGRlc2lnbiBpcyBzdWNoIHRoYXQgb25lIGNhbiB1c2UgdGhlIGZhY3RvcnkgZnVuY3Rpb25zCisgICAgICAgIHJldHVybmVkIGJ5IHRoZSBjb2RlYy5sb29rdXAoKSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgdGhlCisgICAgICAgIGluc3RhbmNlLgorCisgICAgIiIiCisgICAgIyBPcHRpb25hbCBhdHRyaWJ1dGVzIHNldCBieSB0aGUgZmlsZSB3cmFwcGVycyBiZWxvdworICAgIGVuY29kaW5nID0gJ3Vua25vd24nCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBSZWFkZXIsIFdyaXRlciwgZXJyb3JzPSdzdHJpY3QnKToKKworICAgICAgICAiIiIgQ3JlYXRlcyBhIFN0cmVhbVJlYWRlcldyaXRlciBpbnN0YW5jZS4KKworICAgICAgICAgICAgc3RyZWFtIG11c3QgYmUgYSBTdHJlYW0tbGlrZSBvYmplY3QuCisKKyAgICAgICAgICAgIFJlYWRlciwgV3JpdGVyIG11c3QgYmUgZmFjdG9yeSBmdW5jdGlvbnMgb3IgY2xhc3NlcworICAgICAgICAgICAgcHJvdmlkaW5nIHRoZSBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlciBpbnRlcmZhY2UgcmVzcC4KKworICAgICAgICAgICAgRXJyb3IgaGFuZGxpbmcgaXMgZG9uZSBpbiB0aGUgc2FtZSB3YXkgYXMgZGVmaW5lZCBmb3IgdGhlCisgICAgICAgICAgICBTdHJlYW1Xcml0ZXIvUmVhZGVycy4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKyAgICAgICAgc2VsZi5yZWFkZXIgPSBSZWFkZXIoc3RyZWFtLCBlcnJvcnMpCisgICAgICAgIHNlbGYud3JpdGVyID0gV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQorICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycworCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT0tMSk6CisKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZGVyLnJlYWQoc2l6ZSkKKworICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPU5vbmUpOgorCisgICAgICAgIHJldHVybiBzZWxmLnJlYWRlci5yZWFkbGluZShzaXplKQorCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmLCBzaXplaGludD1Ob25lKToKKworICAgICAgICByZXR1cm4gc2VsZi5yZWFkZXIucmVhZGxpbmVzKHNpemVoaW50KQorCisgICAgZGVmIG5leHQoc2VsZik6CisKKyAgICAgICAgIiIiIFJldHVybiB0aGUgbmV4dCBkZWNvZGVkIGxpbmUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkZXIubmV4dCgpCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisKKyAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVyLndyaXRlKGRhdGEpCisKKyAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBsaXN0KToKKworICAgICAgICByZXR1cm4gc2VsZi53cml0ZXIud3JpdGVsaW5lcyhsaXN0KQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorCisgICAgICAgIHNlbGYucmVhZGVyLnJlc2V0KCkKKyAgICAgICAgc2VsZi53cml0ZXIucmVzZXQoKQorCisgICAgZGVmIHNlZWsoc2VsZiwgb2Zmc2V0LCB3aGVuY2U9MCk6CisgICAgICAgIHNlbGYuc3RyZWFtLnNlZWsob2Zmc2V0LCB3aGVuY2UpCisgICAgICAgIHNlbGYucmVhZGVyLnJlc2V0KCkKKyAgICAgICAgaWYgd2hlbmNlID09IDAgYW5kIG9mZnNldCA9PSAwOgorICAgICAgICAgICAgc2VsZi53cml0ZXIucmVzZXQoKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGdldGF0dHI9Z2V0YXR0cik6CisKKyAgICAgICAgIiIiIEluaGVyaXQgYWxsIG90aGVyIG1ldGhvZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnN0cmVhbSwgbmFtZSkKKworICAgICMgdGhlc2UgYXJlIG5lZWRlZCB0byBtYWtlICJ3aXRoIGNvZGVjcy5vcGVuKC4uLikiIHdvcmsgcHJvcGVybHkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRiKToKKyAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQorCisjIyMKKworY2xhc3MgU3RyZWFtUmVjb2RlcjoKKworICAgICIiIiBTdHJlYW1SZWNvZGVyIGluc3RhbmNlcyBwcm92aWRlIGEgZnJvbnRlbmQgLSBiYWNrZW5kCisgICAgICAgIHZpZXcgb2YgZW5jb2RpbmcgZGF0YS4KKworICAgICAgICBUaGV5IHVzZSB0aGUgY29tcGxldGUgc2V0IG9mIEFQSXMgcmV0dXJuZWQgYnkgdGhlCisgICAgICAgIGNvZGVjcy5sb29rdXAoKSBmdW5jdGlvbiB0byBpbXBsZW1lbnQgdGhlaXIgdGFzay4KKworICAgICAgICBEYXRhIHdyaXR0ZW4gdG8gdGhlIHN0cmVhbSBpcyBmaXJzdCBkZWNvZGVkIGludG8gYW4KKyAgICAgICAgaW50ZXJtZWRpYXRlIGZvcm1hdCAod2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBnaXZlbiBjb2RlYworICAgICAgICBjb21iaW5hdGlvbikgYW5kIHRoZW4gd3JpdHRlbiB0byB0aGUgc3RyZWFtIHVzaW5nIGFuIGluc3RhbmNlCisgICAgICAgIG9mIHRoZSBwcm92aWRlZCBXcml0ZXIgY2xhc3MuCisKKyAgICAgICAgSW4gdGhlIG90aGVyIGRpcmVjdGlvbiwgZGF0YSBpcyByZWFkIGZyb20gdGhlIHN0cmVhbSB1c2luZyBhCisgICAgICAgIFJlYWRlciBpbnN0YW5jZSBhbmQgdGhlbiByZXR1cm4gZW5jb2RlZCBkYXRhIHRvIHRoZSBjYWxsZXIuCisKKyAgICAiIiIKKyAgICAjIE9wdGlvbmFsIGF0dHJpYnV0ZXMgc2V0IGJ5IHRoZSBmaWxlIHdyYXBwZXJzIGJlbG93CisgICAgZGF0YV9lbmNvZGluZyA9ICd1bmtub3duJworICAgIGZpbGVfZW5jb2RpbmcgPSAndW5rbm93bicKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVuY29kZSwgZGVjb2RlLCBSZWFkZXIsIFdyaXRlciwKKyAgICAgICAgICAgICAgICAgZXJyb3JzPSdzdHJpY3QnKToKKworICAgICAgICAiIiIgQ3JlYXRlcyBhIFN0cmVhbVJlY29kZXIgaW5zdGFuY2Ugd2hpY2ggaW1wbGVtZW50cyBhIHR3by13YXkKKyAgICAgICAgICAgIGNvbnZlcnNpb246IGVuY29kZSBhbmQgZGVjb2RlIHdvcmsgb24gdGhlIGZyb250ZW5kICh0aGUKKyAgICAgICAgICAgIGlucHV0IHRvIC5yZWFkKCkgYW5kIG91dHB1dCBvZiAud3JpdGUoKSkgd2hpbGUKKyAgICAgICAgICAgIFJlYWRlciBhbmQgV3JpdGVyIHdvcmsgb24gdGhlIGJhY2tlbmQgKHJlYWRpbmcgYW5kCisgICAgICAgICAgICB3cml0aW5nIHRvIHRoZSBzdHJlYW0pLgorCisgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGVzZSBvYmplY3RzIHRvIGRvIHRyYW5zcGFyZW50IGRpcmVjdAorICAgICAgICAgICAgcmVjb2RpbmdzIGZyb20gZS5nLiBsYXRpbi0xIHRvIHV0Zi04IGFuZCBiYWNrLgorCisgICAgICAgICAgICBzdHJlYW0gbXVzdCBiZSBhIGZpbGUtbGlrZSBvYmplY3QuCisKKyAgICAgICAgICAgIGVuY29kZSwgZGVjb2RlIG11c3QgYWRoZXJlIHRvIHRoZSBDb2RlYyBpbnRlcmZhY2UsIFJlYWRlciwKKyAgICAgICAgICAgIFdyaXRlciBtdXN0IGJlIGZhY3RvcnkgZnVuY3Rpb25zIG9yIGNsYXNzZXMgcHJvdmlkaW5nIHRoZQorICAgICAgICAgICAgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIgaW50ZXJmYWNlIHJlc3AuCisKKyAgICAgICAgICAgIGVuY29kZSBhbmQgZGVjb2RlIGFyZSBuZWVkZWQgZm9yIHRoZSBmcm9udGVuZCB0cmFuc2xhdGlvbiwKKyAgICAgICAgICAgIFJlYWRlciBhbmQgV3JpdGVyIGZvciB0aGUgYmFja2VuZCB0cmFuc2xhdGlvbi4gVW5pY29kZSBpcworICAgICAgICAgICAgdXNlZCBhcyBpbnRlcm1lZGlhdGUgZW5jb2RpbmcuCisKKyAgICAgICAgICAgIEVycm9yIGhhbmRsaW5nIGlzIGRvbmUgaW4gdGhlIHNhbWUgd2F5IGFzIGRlZmluZWQgZm9yIHRoZQorICAgICAgICAgICAgU3RyZWFtV3JpdGVyL1JlYWRlcnMuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCisgICAgICAgIHNlbGYuZW5jb2RlID0gZW5jb2RlCisgICAgICAgIHNlbGYuZGVjb2RlID0gZGVjb2RlCisgICAgICAgIHNlbGYucmVhZGVyID0gUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQorICAgICAgICBzZWxmLndyaXRlciA9IFdyaXRlcihzdHJlYW0sIGVycm9ycykKKyAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemU9LTEpOgorCisgICAgICAgIGRhdGEgPSBzZWxmLnJlYWRlci5yZWFkKHNpemUpCisgICAgICAgIGRhdGEsIGJ5dGVzZW5jb2RlZCA9IHNlbGYuZW5jb2RlKGRhdGEsIHNlbGYuZXJyb3JzKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9Tm9uZSk6CisKKyAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgZGF0YSA9IHNlbGYucmVhZGVyLnJlYWRsaW5lKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJlYWRlci5yZWFkbGluZShzaXplKQorICAgICAgICBkYXRhLCBieXRlc2VuY29kZWQgPSBzZWxmLmVuY29kZShkYXRhLCBzZWxmLmVycm9ycykKKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgIGRlZiByZWFkbGluZXMoc2VsZiwgc2l6ZWhpbnQ9Tm9uZSk6CisKKyAgICAgICAgZGF0YSA9IHNlbGYucmVhZGVyLnJlYWQoKQorICAgICAgICBkYXRhLCBieXRlc2VuY29kZWQgPSBzZWxmLmVuY29kZShkYXRhLCBzZWxmLmVycm9ycykKKyAgICAgICAgcmV0dXJuIGRhdGEuc3BsaXRsaW5lcygxKQorCisgICAgZGVmIG5leHQoc2VsZik6CisKKyAgICAgICAgIiIiIFJldHVybiB0aGUgbmV4dCBkZWNvZGVkIGxpbmUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiIiIgorICAgICAgICBkYXRhID0gc2VsZi5yZWFkZXIubmV4dCgpCisgICAgICAgIGRhdGEsIGJ5dGVzZW5jb2RlZCA9IHNlbGYuZW5jb2RlKGRhdGEsIHNlbGYuZXJyb3JzKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorCisgICAgICAgIGRhdGEsIGJ5dGVzZGVjb2RlZCA9IHNlbGYuZGVjb2RlKGRhdGEsIHNlbGYuZXJyb3JzKQorICAgICAgICByZXR1cm4gc2VsZi53cml0ZXIud3JpdGUoZGF0YSkKKworICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGxpc3QpOgorCisgICAgICAgIGRhdGEgPSAnJy5qb2luKGxpc3QpCisgICAgICAgIGRhdGEsIGJ5dGVzZGVjb2RlZCA9IHNlbGYuZGVjb2RlKGRhdGEsIHNlbGYuZXJyb3JzKQorICAgICAgICByZXR1cm4gc2VsZi53cml0ZXIud3JpdGUoZGF0YSkKKworICAgIGRlZiByZXNldChzZWxmKToKKworICAgICAgICBzZWxmLnJlYWRlci5yZXNldCgpCisgICAgICAgIHNlbGYud3JpdGVyLnJlc2V0KCkKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICBnZXRhdHRyPWdldGF0dHIpOgorCisgICAgICAgICIiIiBJbmhlcml0IGFsbCBvdGhlciBtZXRob2RzIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5zdHJlYW0sIG5hbWUpCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0Yik6CisgICAgICAgIHNlbGYuc3RyZWFtLmNsb3NlKCkKKworIyMjIFNob3J0Y3V0cworCitkZWYgb3BlbihmaWxlbmFtZSwgbW9kZT0ncmInLCBlbmNvZGluZz1Ob25lLCBlcnJvcnM9J3N0cmljdCcsIGJ1ZmZlcmluZz0xKToKKworICAgICIiIiBPcGVuIGFuIGVuY29kZWQgZmlsZSB1c2luZyB0aGUgZ2l2ZW4gbW9kZSBhbmQgcmV0dXJuCisgICAgICAgIGEgd3JhcHBlZCB2ZXJzaW9uIHByb3ZpZGluZyB0cmFuc3BhcmVudCBlbmNvZGluZy9kZWNvZGluZy4KKworICAgICAgICBOb3RlOiBUaGUgd3JhcHBlZCB2ZXJzaW9uIHdpbGwgb25seSBhY2NlcHQgdGhlIG9iamVjdCBmb3JtYXQKKyAgICAgICAgZGVmaW5lZCBieSB0aGUgY29kZWNzLCBpLmUuIFVuaWNvZGUgb2JqZWN0cyBmb3IgbW9zdCBidWlsdGluCisgICAgICAgIGNvZGVjcy4gT3V0cHV0IGlzIGFsc28gY29kZWMgZGVwZW5kZW50IGFuZCB3aWxsIHVzdWFsbHkgYmUKKyAgICAgICAgVW5pY29kZSBhcyB3ZWxsLgorCisgICAgICAgIEZpbGVzIGFyZSBhbHdheXMgb3BlbmVkIGluIGJpbmFyeSBtb2RlLCBldmVuIGlmIG5vIGJpbmFyeSBtb2RlCisgICAgICAgIHdhcyBzcGVjaWZpZWQuIFRoaXMgaXMgZG9uZSB0byBhdm9pZCBkYXRhIGxvc3MgZHVlIHRvIGVuY29kaW5ncworICAgICAgICB1c2luZyA4LWJpdCB2YWx1ZXMuIFRoZSBkZWZhdWx0IGZpbGUgbW9kZSBpcyAncmInIG1lYW5pbmcgdG8KKyAgICAgICAgb3BlbiB0aGUgZmlsZSBpbiBiaW5hcnkgcmVhZCBtb2RlLgorCisgICAgICAgIGVuY29kaW5nIHNwZWNpZmllcyB0aGUgZW5jb2Rpbmcgd2hpY2ggaXMgdG8gYmUgdXNlZCBmb3IgdGhlCisgICAgICAgIGZpbGUuCisKKyAgICAgICAgZXJyb3JzIG1heSBiZSBnaXZlbiB0byBkZWZpbmUgdGhlIGVycm9yIGhhbmRsaW5nLiBJdCBkZWZhdWx0cworICAgICAgICB0byAnc3RyaWN0JyB3aGljaCBjYXVzZXMgVmFsdWVFcnJvcnMgdG8gYmUgcmFpc2VkIGluIGNhc2UgYW4KKyAgICAgICAgZW5jb2RpbmcgZXJyb3Igb2NjdXJzLgorCisgICAgICAgIGJ1ZmZlcmluZyBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3IgdGhlIGJ1aWx0aW4gb3BlbigpIEFQSS4KKyAgICAgICAgSXQgZGVmYXVsdHMgdG8gbGluZSBidWZmZXJlZC4KKworICAgICAgICBUaGUgcmV0dXJuZWQgd3JhcHBlZCBmaWxlIG9iamVjdCBwcm92aWRlcyBhbiBleHRyYSBhdHRyaWJ1dGUKKyAgICAgICAgLmVuY29kaW5nIHdoaWNoIGFsbG93cyBxdWVyeWluZyB0aGUgdXNlZCBlbmNvZGluZy4gVGhpcworICAgICAgICBhdHRyaWJ1dGUgaXMgb25seSBhdmFpbGFibGUgaWYgYW4gZW5jb2Rpbmcgd2FzIHNwZWNpZmllZCBhcworICAgICAgICBwYXJhbWV0ZXIuCisKKyAgICAiIiIKKyAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgJ1UnIGluIG1vZGU6CisgICAgICAgICAgICAjIE5vIGF1dG9tYXRpYyBjb252ZXJzaW9uIG9mICdcbicgaXMgZG9uZSBvbiByZWFkaW5nIGFuZCB3cml0aW5nCisgICAgICAgICAgICBtb2RlID0gbW9kZS5zdHJpcCgpLnJlcGxhY2UoJ1UnLCAnJykKKyAgICAgICAgICAgIGlmIG1vZGVbOjFdIG5vdCBpbiBzZXQoJ3J3YScpOgorICAgICAgICAgICAgICAgIG1vZGUgPSAncicgKyBtb2RlCisgICAgICAgIGlmICdiJyBub3QgaW4gbW9kZToKKyAgICAgICAgICAgICMgRm9yY2Ugb3BlbmluZyBvZiB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZQorICAgICAgICAgICAgbW9kZSA9IG1vZGUgKyAnYicKKyAgICBmaWxlID0gX19idWlsdGluX18ub3BlbihmaWxlbmFtZSwgbW9kZSwgYnVmZmVyaW5nKQorICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBmaWxlCisgICAgaW5mbyA9IGxvb2t1cChlbmNvZGluZykKKyAgICBzcncgPSBTdHJlYW1SZWFkZXJXcml0ZXIoZmlsZSwgaW5mby5zdHJlYW1yZWFkZXIsIGluZm8uc3RyZWFtd3JpdGVyLCBlcnJvcnMpCisgICAgIyBBZGQgYXR0cmlidXRlcyB0byBzaW1wbGlmeSBpbnRyb3NwZWN0aW9uCisgICAgc3J3LmVuY29kaW5nID0gZW5jb2RpbmcKKyAgICByZXR1cm4gc3J3CisKK2RlZiBFbmNvZGVkRmlsZShmaWxlLCBkYXRhX2VuY29kaW5nLCBmaWxlX2VuY29kaW5nPU5vbmUsIGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAiIiIgUmV0dXJuIGEgd3JhcHBlZCB2ZXJzaW9uIG9mIGZpbGUgd2hpY2ggcHJvdmlkZXMgdHJhbnNwYXJlbnQKKyAgICAgICAgZW5jb2RpbmcgdHJhbnNsYXRpb24uCisKKyAgICAgICAgU3RyaW5ncyB3cml0dGVuIHRvIHRoZSB3cmFwcGVkIGZpbGUgYXJlIGludGVycHJldGVkIGFjY29yZGluZworICAgICAgICB0byB0aGUgZ2l2ZW4gZGF0YV9lbmNvZGluZyBhbmQgdGhlbiB3cml0dGVuIHRvIHRoZSBvcmlnaW5hbAorICAgICAgICBmaWxlIGFzIHN0cmluZyB1c2luZyBmaWxlX2VuY29kaW5nLiBUaGUgaW50ZXJtZWRpYXRlIGVuY29kaW5nCisgICAgICAgIHdpbGwgdXN1YWxseSBiZSBVbmljb2RlIGJ1dCBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpZWQgY29kZWNzLgorCisgICAgICAgIFN0cmluZ3MgYXJlIHJlYWQgZnJvbSB0aGUgZmlsZSB1c2luZyBmaWxlX2VuY29kaW5nIGFuZCB0aGVuCisgICAgICAgIHBhc3NlZCBiYWNrIHRvIHRoZSBjYWxsZXIgYXMgc3RyaW5nIHVzaW5nIGRhdGFfZW5jb2RpbmcuCisKKyAgICAgICAgSWYgZmlsZV9lbmNvZGluZyBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvIGRhdGFfZW5jb2RpbmcuCisKKyAgICAgICAgZXJyb3JzIG1heSBiZSBnaXZlbiB0byBkZWZpbmUgdGhlIGVycm9yIGhhbmRsaW5nLiBJdCBkZWZhdWx0cworICAgICAgICB0byAnc3RyaWN0JyB3aGljaCBjYXVzZXMgVmFsdWVFcnJvcnMgdG8gYmUgcmFpc2VkIGluIGNhc2UgYW4KKyAgICAgICAgZW5jb2RpbmcgZXJyb3Igb2NjdXJzLgorCisgICAgICAgIFRoZSByZXR1cm5lZCB3cmFwcGVkIGZpbGUgb2JqZWN0IHByb3ZpZGVzIHR3byBleHRyYSBhdHRyaWJ1dGVzCisgICAgICAgIC5kYXRhX2VuY29kaW5nIGFuZCAuZmlsZV9lbmNvZGluZyB3aGljaCByZWZsZWN0IHRoZSBnaXZlbgorICAgICAgICBwYXJhbWV0ZXJzIG9mIHRoZSBzYW1lIG5hbWUuIFRoZSBhdHRyaWJ1dGVzIGNhbiBiZSB1c2VkIGZvcgorICAgICAgICBpbnRyb3NwZWN0aW9uIGJ5IFB5dGhvbiBwcm9ncmFtcy4KKworICAgICIiIgorICAgIGlmIGZpbGVfZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgZmlsZV9lbmNvZGluZyA9IGRhdGFfZW5jb2RpbmcKKyAgICBkYXRhX2luZm8gPSBsb29rdXAoZGF0YV9lbmNvZGluZykKKyAgICBmaWxlX2luZm8gPSBsb29rdXAoZmlsZV9lbmNvZGluZykKKyAgICBzciA9IFN0cmVhbVJlY29kZXIoZmlsZSwgZGF0YV9pbmZvLmVuY29kZSwgZGF0YV9pbmZvLmRlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9pbmZvLnN0cmVhbXJlYWRlciwgZmlsZV9pbmZvLnN0cmVhbXdyaXRlciwgZXJyb3JzKQorICAgICMgQWRkIGF0dHJpYnV0ZXMgdG8gc2ltcGxpZnkgaW50cm9zcGVjdGlvbgorICAgIHNyLmRhdGFfZW5jb2RpbmcgPSBkYXRhX2VuY29kaW5nCisgICAgc3IuZmlsZV9lbmNvZGluZyA9IGZpbGVfZW5jb2RpbmcKKyAgICByZXR1cm4gc3IKKworIyMjIEhlbHBlcnMgZm9yIGNvZGVjIGxvb2t1cAorCitkZWYgZ2V0ZW5jb2RlcihlbmNvZGluZyk6CisKKyAgICAiIiIgTG9va3VwIHVwIHRoZSBjb2RlYyBmb3IgdGhlIGdpdmVuIGVuY29kaW5nIGFuZCByZXR1cm4KKyAgICAgICAgaXRzIGVuY29kZXIgZnVuY3Rpb24uCisKKyAgICAgICAgUmFpc2VzIGEgTG9va3VwRXJyb3IgaW4gY2FzZSB0aGUgZW5jb2RpbmcgY2Fubm90IGJlIGZvdW5kLgorCisgICAgIiIiCisgICAgcmV0dXJuIGxvb2t1cChlbmNvZGluZykuZW5jb2RlCisKK2RlZiBnZXRkZWNvZGVyKGVuY29kaW5nKToKKworICAgICIiIiBMb29rdXAgdXAgdGhlIGNvZGVjIGZvciB0aGUgZ2l2ZW4gZW5jb2RpbmcgYW5kIHJldHVybgorICAgICAgICBpdHMgZGVjb2RlciBmdW5jdGlvbi4KKworICAgICAgICBSYWlzZXMgYSBMb29rdXBFcnJvciBpbiBjYXNlIHRoZSBlbmNvZGluZyBjYW5ub3QgYmUgZm91bmQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gbG9va3VwKGVuY29kaW5nKS5kZWNvZGUKKworZGVmIGdldGluY3JlbWVudGFsZW5jb2RlcihlbmNvZGluZyk6CisKKyAgICAiIiIgTG9va3VwIHVwIHRoZSBjb2RlYyBmb3IgdGhlIGdpdmVuIGVuY29kaW5nIGFuZCByZXR1cm4KKyAgICAgICAgaXRzIEluY3JlbWVudGFsRW5jb2RlciBjbGFzcyBvciBmYWN0b3J5IGZ1bmN0aW9uLgorCisgICAgICAgIFJhaXNlcyBhIExvb2t1cEVycm9yIGluIGNhc2UgdGhlIGVuY29kaW5nIGNhbm5vdCBiZSBmb3VuZAorICAgICAgICBvciB0aGUgY29kZWNzIGRvZXNuJ3QgcHJvdmlkZSBhbiBpbmNyZW1lbnRhbCBlbmNvZGVyLgorCisgICAgIiIiCisgICAgZW5jb2RlciA9IGxvb2t1cChlbmNvZGluZykuaW5jcmVtZW50YWxlbmNvZGVyCisgICAgaWYgZW5jb2RlciBpcyBOb25lOgorICAgICAgICByYWlzZSBMb29rdXBFcnJvcihlbmNvZGluZykKKyAgICByZXR1cm4gZW5jb2RlcgorCitkZWYgZ2V0aW5jcmVtZW50YWxkZWNvZGVyKGVuY29kaW5nKToKKworICAgICIiIiBMb29rdXAgdXAgdGhlIGNvZGVjIGZvciB0aGUgZ2l2ZW4gZW5jb2RpbmcgYW5kIHJldHVybgorICAgICAgICBpdHMgSW5jcmVtZW50YWxEZWNvZGVyIGNsYXNzIG9yIGZhY3RvcnkgZnVuY3Rpb24uCisKKyAgICAgICAgUmFpc2VzIGEgTG9va3VwRXJyb3IgaW4gY2FzZSB0aGUgZW5jb2RpbmcgY2Fubm90IGJlIGZvdW5kCisgICAgICAgIG9yIHRoZSBjb2RlY3MgZG9lc24ndCBwcm92aWRlIGFuIGluY3JlbWVudGFsIGRlY29kZXIuCisKKyAgICAiIiIKKyAgICBkZWNvZGVyID0gbG9va3VwKGVuY29kaW5nKS5pbmNyZW1lbnRhbGRlY29kZXIKKyAgICBpZiBkZWNvZGVyIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIExvb2t1cEVycm9yKGVuY29kaW5nKQorICAgIHJldHVybiBkZWNvZGVyCisKK2RlZiBnZXRyZWFkZXIoZW5jb2RpbmcpOgorCisgICAgIiIiIExvb2t1cCB1cCB0aGUgY29kZWMgZm9yIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgcmV0dXJuCisgICAgICAgIGl0cyBTdHJlYW1SZWFkZXIgY2xhc3Mgb3IgZmFjdG9yeSBmdW5jdGlvbi4KKworICAgICAgICBSYWlzZXMgYSBMb29rdXBFcnJvciBpbiBjYXNlIHRoZSBlbmNvZGluZyBjYW5ub3QgYmUgZm91bmQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gbG9va3VwKGVuY29kaW5nKS5zdHJlYW1yZWFkZXIKKworZGVmIGdldHdyaXRlcihlbmNvZGluZyk6CisKKyAgICAiIiIgTG9va3VwIHVwIHRoZSBjb2RlYyBmb3IgdGhlIGdpdmVuIGVuY29kaW5nIGFuZCByZXR1cm4KKyAgICAgICAgaXRzIFN0cmVhbVdyaXRlciBjbGFzcyBvciBmYWN0b3J5IGZ1bmN0aW9uLgorCisgICAgICAgIFJhaXNlcyBhIExvb2t1cEVycm9yIGluIGNhc2UgdGhlIGVuY29kaW5nIGNhbm5vdCBiZSBmb3VuZC4KKworICAgICIiIgorICAgIHJldHVybiBsb29rdXAoZW5jb2RpbmcpLnN0cmVhbXdyaXRlcgorCitkZWYgaXRlcmVuY29kZShpdGVyYXRvciwgZW5jb2RpbmcsIGVycm9ycz0nc3RyaWN0JywgKiprd2FyZ3MpOgorICAgICIiIgorICAgIEVuY29kaW5nIGl0ZXJhdG9yLgorCisgICAgRW5jb2RlcyB0aGUgaW5wdXQgc3RyaW5ncyBmcm9tIHRoZSBpdGVyYXRvciB1c2luZyBhIEluY3JlbWVudGFsRW5jb2Rlci4KKworICAgIGVycm9ycyBhbmQga3dhcmdzIGFyZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgSW5jcmVtZW50YWxFbmNvZGVyCisgICAgY29uc3RydWN0b3IuCisgICAgIiIiCisgICAgZW5jb2RlciA9IGdldGluY3JlbWVudGFsZW5jb2RlcihlbmNvZGluZykoZXJyb3JzLCAqKmt3YXJncykKKyAgICBmb3IgaW5wdXQgaW4gaXRlcmF0b3I6CisgICAgICAgIG91dHB1dCA9IGVuY29kZXIuZW5jb2RlKGlucHV0KQorICAgICAgICBpZiBvdXRwdXQ6CisgICAgICAgICAgICB5aWVsZCBvdXRwdXQKKyAgICBvdXRwdXQgPSBlbmNvZGVyLmVuY29kZSgiIiwgVHJ1ZSkKKyAgICBpZiBvdXRwdXQ6CisgICAgICAgIHlpZWxkIG91dHB1dAorCitkZWYgaXRlcmRlY29kZShpdGVyYXRvciwgZW5jb2RpbmcsIGVycm9ycz0nc3RyaWN0JywgKiprd2FyZ3MpOgorICAgICIiIgorICAgIERlY29kaW5nIGl0ZXJhdG9yLgorCisgICAgRGVjb2RlcyB0aGUgaW5wdXQgc3RyaW5ncyBmcm9tIHRoZSBpdGVyYXRvciB1c2luZyBhIEluY3JlbWVudGFsRGVjb2Rlci4KKworICAgIGVycm9ycyBhbmQga3dhcmdzIGFyZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgSW5jcmVtZW50YWxEZWNvZGVyCisgICAgY29uc3RydWN0b3IuCisgICAgIiIiCisgICAgZGVjb2RlciA9IGdldGluY3JlbWVudGFsZGVjb2RlcihlbmNvZGluZykoZXJyb3JzLCAqKmt3YXJncykKKyAgICBmb3IgaW5wdXQgaW4gaXRlcmF0b3I6CisgICAgICAgIG91dHB1dCA9IGRlY29kZXIuZGVjb2RlKGlucHV0KQorICAgICAgICBpZiBvdXRwdXQ6CisgICAgICAgICAgICB5aWVsZCBvdXRwdXQKKyAgICBvdXRwdXQgPSBkZWNvZGVyLmRlY29kZSgiIiwgVHJ1ZSkKKyAgICBpZiBvdXRwdXQ6CisgICAgICAgIHlpZWxkIG91dHB1dAorCisjIyMgSGVscGVycyBmb3IgY2hhcm1hcC1iYXNlZCBjb2RlY3MKKworZGVmIG1ha2VfaWRlbnRpdHlfZGljdChybmcpOgorCisgICAgIiIiIG1ha2VfaWRlbnRpdHlfZGljdChybmcpIC0+IGRpY3QKKworICAgICAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IHdoZXJlIGVsZW1lbnRzIG9mIHRoZSBybmcgc2VxdWVuY2UgYXJlCisgICAgICAgIG1hcHBlZCB0byB0aGVtc2VsdmVzLgorCisgICAgIiIiCisgICAgcmVzID0ge30KKyAgICBmb3IgaSBpbiBybmc6CisgICAgICAgIHJlc1tpXT1pCisgICAgcmV0dXJuIHJlcworCitkZWYgbWFrZV9lbmNvZGluZ19tYXAoZGVjb2RpbmdfbWFwKToKKworICAgICIiIiBDcmVhdGVzIGFuIGVuY29kaW5nIG1hcCBmcm9tIGEgZGVjb2RpbmcgbWFwLgorCisgICAgICAgIElmIGEgdGFyZ2V0IG1hcHBpbmcgaW4gdGhlIGRlY29kaW5nIG1hcCBvY2N1cnMgbXVsdGlwbGUKKyAgICAgICAgdGltZXMsIHRoZW4gdGhhdCB0YXJnZXQgaXMgbWFwcGVkIHRvIE5vbmUgKHVuZGVmaW5lZCBtYXBwaW5nKSwKKyAgICAgICAgY2F1c2luZyBhbiBleGNlcHRpb24gd2hlbiBlbmNvdW50ZXJlZCBieSB0aGUgY2hhcm1hcCBjb2RlYworICAgICAgICBkdXJpbmcgdHJhbnNsYXRpb24uCisKKyAgICAgICAgT25lIGV4YW1wbGUgd2hlcmUgdGhpcyBoYXBwZW5zIGlzIGNwODc1LnB5IHdoaWNoIGRlY29kZXMKKyAgICAgICAgbXVsdGlwbGUgY2hhcmFjdGVyIHRvIFx1MDAxYS4KKworICAgICIiIgorICAgIG0gPSB7fQorICAgIGZvciBrLHYgaW4gZGVjb2RpbmdfbWFwLml0ZW1zKCk6CisgICAgICAgIGlmIG5vdCB2IGluIG06CisgICAgICAgICAgICBtW3ZdID0gaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbVt2XSA9IE5vbmUKKyAgICByZXR1cm4gbQorCisjIyMgZXJyb3IgaGFuZGxlcnMKKwordHJ5OgorICAgIHN0cmljdF9lcnJvcnMgPSBsb29rdXBfZXJyb3IoInN0cmljdCIpCisgICAgaWdub3JlX2Vycm9ycyA9IGxvb2t1cF9lcnJvcigiaWdub3JlIikKKyAgICByZXBsYWNlX2Vycm9ycyA9IGxvb2t1cF9lcnJvcigicmVwbGFjZSIpCisgICAgeG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzID0gbG9va3VwX2Vycm9yKCJ4bWxjaGFycmVmcmVwbGFjZSIpCisgICAgYmFja3NsYXNocmVwbGFjZV9lcnJvcnMgPSBsb29rdXBfZXJyb3IoImJhY2tzbGFzaHJlcGxhY2UiKQorZXhjZXB0IExvb2t1cEVycm9yOgorICAgICMgSW4gLS1kaXNhYmxlLXVuaWNvZGUgYnVpbGRzLCB0aGVzZSBlcnJvciBoYW5kbGVyIGFyZSBtaXNzaW5nCisgICAgc3RyaWN0X2Vycm9ycyA9IE5vbmUKKyAgICBpZ25vcmVfZXJyb3JzID0gTm9uZQorICAgIHJlcGxhY2VfZXJyb3JzID0gTm9uZQorICAgIHhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycyA9IE5vbmUKKyAgICBiYWNrc2xhc2hyZXBsYWNlX2Vycm9ycyA9IE5vbmUKKworIyBUZWxsIG1vZHVsZWZpbmRlciB0aGF0IHVzaW5nIGNvZGVjcyBwcm9iYWJseSBuZWVkcyB0aGUgZW5jb2RpbmdzCisjIHBhY2thZ2UKK19mYWxzZSA9IDAKK2lmIF9mYWxzZToKKyAgICBpbXBvcnQgZW5jb2RpbmdzCisKKyMjIyBUZXN0cworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorCisgICAgIyBNYWtlIHN0ZG91dCB0cmFuc2xhdGUgTGF0aW4tMSBvdXRwdXQgaW50byBVVEYtOCBvdXRwdXQKKyAgICBzeXMuc3Rkb3V0ID0gRW5jb2RlZEZpbGUoc3lzLnN0ZG91dCwgJ2xhdGluLTEnLCAndXRmLTgnKQorCisgICAgIyBIYXZlIHN0ZGluIHRyYW5zbGF0ZSBMYXRpbi0xIGlucHV0IGludG8gVVRGLTggaW5wdXQKKyAgICBzeXMuc3RkaW4gPSBFbmNvZGVkRmlsZShzeXMuc3RkaW4sICd1dGYtOCcsICdsYXRpbi0xJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29kZWNzLnB5YyBiL2xpYi9weXRob24yLjcvY29kZWNzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzg3ZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb2RlY3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29kZWNzLnB5byBiL2xpYi9weXRob24yLjcvY29kZWNzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzg3ZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb2RlY3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29kZW9wLnB5IGIvbGliL3B5dGhvbjIuNy9jb2Rlb3AucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxNmQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29kZW9wLnB5CkBAIC0wLDAgKzEsMTY4IEBACityIiIiVXRpbGl0aWVzIHRvIGNvbXBpbGUgcG9zc2libHkgaW5jb21wbGV0ZSBQeXRob24gc291cmNlIGNvZGUuCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIHR3byBpbnRlcmZhY2VzLCBicm9hZGx5IHNpbWlsYXIgdG8gdGhlIGJ1aWx0aW4KK2Z1bmN0aW9uIGNvbXBpbGUoKSwgd2hpY2ggdGFrZSBwcm9ncmFtIHRleHQsIGEgZmlsZW5hbWUgYW5kIGEgJ21vZGUnCithbmQ6CisKKy0gUmV0dXJuIGNvZGUgb2JqZWN0IGlmIHRoZSBjb21tYW5kIGlzIGNvbXBsZXRlIGFuZCB2YWxpZAorLSBSZXR1cm4gTm9uZSBpZiB0aGUgY29tbWFuZCBpcyBpbmNvbXBsZXRlCistIFJhaXNlIFN5bnRheEVycm9yLCBWYWx1ZUVycm9yIG9yIE92ZXJmbG93RXJyb3IgaWYgdGhlIGNvbW1hbmQgaXMgYQorICBzeW50YXggZXJyb3IgKE92ZXJmbG93RXJyb3IgYW5kIFZhbHVlRXJyb3IgY2FuIGJlIHByb2R1Y2VkIGJ5CisgIG1hbGZvcm1lZCBsaXRlcmFscykuCisKK0FwcHJvYWNoOgorCitGaXJzdCwgY2hlY2sgaWYgdGhlIHNvdXJjZSBjb25zaXN0cyBlbnRpcmVseSBvZiBibGFuayBsaW5lcyBhbmQKK2NvbW1lbnRzOyBpZiBzbywgcmVwbGFjZSBpdCB3aXRoICdwYXNzJywgYmVjYXVzZSB0aGUgYnVpbHQtaW4KK3BhcnNlciBkb2Vzbid0IGFsd2F5cyBkbyB0aGUgcmlnaHQgdGhpbmcgZm9yIHRoZXNlLgorCitDb21waWxlIHRocmVlIHRpbWVzOiBhcyBpcywgd2l0aCBcbiwgYW5kIHdpdGggXG5cbiBhcHBlbmRlZC4gIElmIGl0Citjb21waWxlcyBhcyBpcywgaXQncyBjb21wbGV0ZS4gIElmIGl0IGNvbXBpbGVzIHdpdGggb25lIFxuIGFwcGVuZGVkLAord2UgZXhwZWN0IG1vcmUuICBJZiBpdCBkb2Vzbid0IGNvbXBpbGUgZWl0aGVyIHdheSwgd2UgY29tcGFyZSB0aGUKK2Vycm9yIHdlIGdldCB3aGVuIGNvbXBpbGluZyB3aXRoIFxuIG9yIFxuXG4gYXBwZW5kZWQuICBJZiB0aGUgZXJyb3JzCithcmUgdGhlIHNhbWUsIHRoZSBjb2RlIGlzIGJyb2tlbi4gIEJ1dCBpZiB0aGUgZXJyb3JzIGFyZSBkaWZmZXJlbnQsIHdlCitleHBlY3QgbW9yZS4gIE5vdCBpbnR1aXRpdmU7IG5vdCBldmVuIGd1YXJhbnRlZWQgdG8gaG9sZCBpbiBmdXR1cmUKK3JlbGVhc2VzOyBidXQgdGhpcyBtYXRjaGVzIHRoZSBjb21waWxlcidzIGJlaGF2aW9yIGZyb20gUHl0aG9uIDEuNAordGhyb3VnaCAyLjIsIGF0IGxlYXN0LgorCitDYXZlYXQ6CisKK0l0IGlzIHBvc3NpYmxlIChidXQgbm90IGxpa2VseSkgdGhhdCB0aGUgcGFyc2VyIHN0b3BzIHBhcnNpbmcgd2l0aCBhCitzdWNjZXNzZnVsIG91dGNvbWUgYmVmb3JlIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIHNvdXJjZTsgaW4gdGhpcworY2FzZSwgdHJhaWxpbmcgc3ltYm9scyBtYXkgYmUgaWdub3JlZCBpbnN0ZWFkIG9mIGNhdXNpbmcgYW4gZXJyb3IuCitGb3IgZXhhbXBsZSwgYSBiYWNrc2xhc2ggZm9sbG93ZWQgYnkgdHdvIG5ld2xpbmVzIG1heSBiZSBmb2xsb3dlZCBieQorYXJiaXRyYXJ5IGdhcmJhZ2UuICBUaGlzIHdpbGwgYmUgZml4ZWQgb25jZSB0aGUgQVBJIGZvciB0aGUgcGFyc2VyIGlzCitiZXR0ZXIuCisKK1RoZSB0d28gaW50ZXJmYWNlcyBhcmU6CisKK2NvbXBpbGVfY29tbWFuZChzb3VyY2UsIGZpbGVuYW1lLCBzeW1ib2wpOgorCisgICAgQ29tcGlsZXMgYSBzaW5nbGUgY29tbWFuZCBpbiB0aGUgbWFubmVyIGRlc2NyaWJlZCBhYm92ZS4KKworQ29tbWFuZENvbXBpbGVyKCk6CisKKyAgICBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBoYXZlIF9fY2FsbF9fIG1ldGhvZHMgaWRlbnRpY2FsIGluCisgICAgc2lnbmF0dXJlIHRvIGNvbXBpbGVfY29tbWFuZDsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBpZiB0aGUKKyAgICBpbnN0YW5jZSBjb21waWxlcyBwcm9ncmFtIHRleHQgY29udGFpbmluZyBhIF9fZnV0dXJlX18gc3RhdGVtZW50LAorICAgIHRoZSBpbnN0YW5jZSAncmVtZW1iZXJzJyBhbmQgY29tcGlsZXMgYWxsIHN1YnNlcXVlbnQgcHJvZ3JhbSB0ZXh0cworICAgIHdpdGggdGhlIHN0YXRlbWVudCBpbiBmb3JjZS4KKworVGhlIG1vZHVsZSBhbHNvIHByb3ZpZGVzIGFub3RoZXIgY2xhc3M6CisKK0NvbXBpbGUoKToKKworICAgIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFjdCBsaWtlIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBjb21waWxlLAorICAgIGJ1dCB3aXRoICdtZW1vcnknIGluIHRoZSBzZW5zZSBkZXNjcmliZWQgYWJvdmUuCisiIiIKKworaW1wb3J0IF9fZnV0dXJlX18KKworX2ZlYXR1cmVzID0gW2dldGF0dHIoX19mdXR1cmVfXywgZm5hbWUpCisgICAgICAgICAgICAgZm9yIGZuYW1lIGluIF9fZnV0dXJlX18uYWxsX2ZlYXR1cmVfbmFtZXNdCisKK19fYWxsX18gPSBbImNvbXBpbGVfY29tbWFuZCIsICJDb21waWxlIiwgIkNvbW1hbmRDb21waWxlciJdCisKK1B5Q0ZfRE9OVF9JTVBMWV9ERURFTlQgPSAweDIwMCAgICAgICAgICAjIE1hdGNoZXMgcHl0aG9ucnVuLmgKKworZGVmIF9tYXliZV9jb21waWxlKGNvbXBpbGVyLCBzb3VyY2UsIGZpbGVuYW1lLCBzeW1ib2wpOgorICAgICMgQ2hlY2sgZm9yIHNvdXJjZSBjb25zaXN0aW5nIG9mIG9ubHkgYmxhbmsgbGluZXMgYW5kIGNvbW1lbnRzCisgICAgZm9yIGxpbmUgaW4gc291cmNlLnNwbGl0KCJcbiIpOgorICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgIGlmIGxpbmUgYW5kIGxpbmVbMF0gIT0gJyMnOgorICAgICAgICAgICAgYnJlYWsgICAgICAgICAgICAgICAjIExlYXZlIGl0IGFsb25lCisgICAgZWxzZToKKyAgICAgICAgaWYgc3ltYm9sICE9ICJldmFsIjoKKyAgICAgICAgICAgIHNvdXJjZSA9ICJwYXNzIiAgICAgIyBSZXBsYWNlIGl0IHdpdGggYSAncGFzcycgc3RhdGVtZW50CisKKyAgICBlcnIgPSBlcnIxID0gZXJyMiA9IE5vbmUKKyAgICBjb2RlID0gY29kZTEgPSBjb2RlMiA9IE5vbmUKKworICAgIHRyeToKKyAgICAgICAgY29kZSA9IGNvbXBpbGVyKHNvdXJjZSwgZmlsZW5hbWUsIHN5bWJvbCkKKyAgICBleGNlcHQgU3ludGF4RXJyb3IsIGVycjoKKyAgICAgICAgcGFzcworCisgICAgdHJ5OgorICAgICAgICBjb2RlMSA9IGNvbXBpbGVyKHNvdXJjZSArICJcbiIsIGZpbGVuYW1lLCBzeW1ib2wpCisgICAgZXhjZXB0IFN5bnRheEVycm9yLCBlcnIxOgorICAgICAgICBwYXNzCisKKyAgICB0cnk6CisgICAgICAgIGNvZGUyID0gY29tcGlsZXIoc291cmNlICsgIlxuXG4iLCBmaWxlbmFtZSwgc3ltYm9sKQorICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgZXJyMjoKKyAgICAgICAgcGFzcworCisgICAgaWYgY29kZToKKyAgICAgICAgcmV0dXJuIGNvZGUKKyAgICBpZiBub3QgY29kZTEgYW5kIHJlcHIoZXJyMSkgPT0gcmVwcihlcnIyKToKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsIGVycjEKKworZGVmIF9jb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsIHN5bWJvbCk6CisgICAgcmV0dXJuIGNvbXBpbGUoc291cmNlLCBmaWxlbmFtZSwgc3ltYm9sLCBQeUNGX0RPTlRfSU1QTFlfREVERU5UKQorCitkZWYgY29tcGlsZV9jb21tYW5kKHNvdXJjZSwgZmlsZW5hbWU9IjxpbnB1dD4iLCBzeW1ib2w9InNpbmdsZSIpOgorICAgIHIiIiJDb21waWxlIGEgY29tbWFuZCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgaW5jb21wbGV0ZS4KKworICAgIEFyZ3VtZW50czoKKworICAgIHNvdXJjZSAtLSB0aGUgc291cmNlIHN0cmluZzsgbWF5IGNvbnRhaW4gXG4gY2hhcmFjdGVycworICAgIGZpbGVuYW1lIC0tIG9wdGlvbmFsIGZpbGVuYW1lIGZyb20gd2hpY2ggc291cmNlIHdhcyByZWFkOyBkZWZhdWx0CisgICAgICAgICAgICAgICAgIjxpbnB1dD4iCisgICAgc3ltYm9sIC0tIG9wdGlvbmFsIGdyYW1tYXIgc3RhcnQgc3ltYm9sOyAic2luZ2xlIiAoZGVmYXVsdCkgb3IgImV2YWwiCisKKyAgICBSZXR1cm4gdmFsdWUgLyBleGNlcHRpb25zIHJhaXNlZDoKKworICAgIC0gUmV0dXJuIGEgY29kZSBvYmplY3QgaWYgdGhlIGNvbW1hbmQgaXMgY29tcGxldGUgYW5kIHZhbGlkCisgICAgLSBSZXR1cm4gTm9uZSBpZiB0aGUgY29tbWFuZCBpcyBpbmNvbXBsZXRlCisgICAgLSBSYWlzZSBTeW50YXhFcnJvciwgVmFsdWVFcnJvciBvciBPdmVyZmxvd0Vycm9yIGlmIHRoZSBjb21tYW5kIGlzIGEKKyAgICAgIHN5bnRheCBlcnJvciAoT3ZlcmZsb3dFcnJvciBhbmQgVmFsdWVFcnJvciBjYW4gYmUgcHJvZHVjZWQgYnkKKyAgICAgIG1hbGZvcm1lZCBsaXRlcmFscykuCisgICAgIiIiCisgICAgcmV0dXJuIF9tYXliZV9jb21waWxlKF9jb21waWxlLCBzb3VyY2UsIGZpbGVuYW1lLCBzeW1ib2wpCisKK2NsYXNzIENvbXBpbGU6CisgICAgIiIiSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYmVoYXZlIG11Y2ggbGlrZSB0aGUgYnVpbHQtaW4gY29tcGlsZQorICAgIGZ1bmN0aW9uLCBidXQgaWYgb25lIGlzIHVzZWQgdG8gY29tcGlsZSB0ZXh0IGNvbnRhaW5pbmcgYSBmdXR1cmUKKyAgICBzdGF0ZW1lbnQsIGl0ICJyZW1lbWJlcnMiIGFuZCBjb21waWxlcyBhbGwgc3Vic2VxdWVudCBwcm9ncmFtIHRleHRzCisgICAgd2l0aCB0aGUgc3RhdGVtZW50IGluIGZvcmNlLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5mbGFncyA9IFB5Q0ZfRE9OVF9JTVBMWV9ERURFTlQKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBzb3VyY2UsIGZpbGVuYW1lLCBzeW1ib2wpOgorICAgICAgICBjb2Rlb2IgPSBjb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsIHN5bWJvbCwgc2VsZi5mbGFncywgMSkKKyAgICAgICAgZm9yIGZlYXR1cmUgaW4gX2ZlYXR1cmVzOgorICAgICAgICAgICAgaWYgY29kZW9iLmNvX2ZsYWdzICYgZmVhdHVyZS5jb21waWxlcl9mbGFnOgorICAgICAgICAgICAgICAgIHNlbGYuZmxhZ3MgfD0gZmVhdHVyZS5jb21waWxlcl9mbGFnCisgICAgICAgIHJldHVybiBjb2Rlb2IKKworY2xhc3MgQ29tbWFuZENvbXBpbGVyOgorICAgICIiIkluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGhhdmUgX19jYWxsX18gbWV0aG9kcyBpZGVudGljYWwgaW4KKyAgICBzaWduYXR1cmUgdG8gY29tcGlsZV9jb21tYW5kOyB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0IGlmIHRoZQorICAgIGluc3RhbmNlIGNvbXBpbGVzIHByb2dyYW0gdGV4dCBjb250YWluaW5nIGEgX19mdXR1cmVfXyBzdGF0ZW1lbnQsCisgICAgdGhlIGluc3RhbmNlICdyZW1lbWJlcnMnIGFuZCBjb21waWxlcyBhbGwgc3Vic2VxdWVudCBwcm9ncmFtIHRleHRzCisgICAgd2l0aCB0aGUgc3RhdGVtZW50IGluIGZvcmNlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsKToKKyAgICAgICAgc2VsZi5jb21waWxlciA9IENvbXBpbGUoKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHNvdXJjZSwgZmlsZW5hbWU9IjxpbnB1dD4iLCBzeW1ib2w9InNpbmdsZSIpOgorICAgICAgICByIiIiQ29tcGlsZSBhIGNvbW1hbmQgYW5kIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIGluY29tcGxldGUuCisKKyAgICAgICAgQXJndW1lbnRzOgorCisgICAgICAgIHNvdXJjZSAtLSB0aGUgc291cmNlIHN0cmluZzsgbWF5IGNvbnRhaW4gXG4gY2hhcmFjdGVycworICAgICAgICBmaWxlbmFtZSAtLSBvcHRpb25hbCBmaWxlbmFtZSBmcm9tIHdoaWNoIHNvdXJjZSB3YXMgcmVhZDsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCAiPGlucHV0PiIKKyAgICAgICAgc3ltYm9sIC0tIG9wdGlvbmFsIGdyYW1tYXIgc3RhcnQgc3ltYm9sOyAic2luZ2xlIiAoZGVmYXVsdCkgb3IKKyAgICAgICAgICAgICAgICAgICJldmFsIgorCisgICAgICAgIFJldHVybiB2YWx1ZSAvIGV4Y2VwdGlvbnMgcmFpc2VkOgorCisgICAgICAgIC0gUmV0dXJuIGEgY29kZSBvYmplY3QgaWYgdGhlIGNvbW1hbmQgaXMgY29tcGxldGUgYW5kIHZhbGlkCisgICAgICAgIC0gUmV0dXJuIE5vbmUgaWYgdGhlIGNvbW1hbmQgaXMgaW5jb21wbGV0ZQorICAgICAgICAtIFJhaXNlIFN5bnRheEVycm9yLCBWYWx1ZUVycm9yIG9yIE92ZXJmbG93RXJyb3IgaWYgdGhlIGNvbW1hbmQgaXMgYQorICAgICAgICAgIHN5bnRheCBlcnJvciAoT3ZlcmZsb3dFcnJvciBhbmQgVmFsdWVFcnJvciBjYW4gYmUgcHJvZHVjZWQgYnkKKyAgICAgICAgICBtYWxmb3JtZWQgbGl0ZXJhbHMpLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIF9tYXliZV9jb21waWxlKHNlbGYuY29tcGlsZXIsIHNvdXJjZSwgZmlsZW5hbWUsIHN5bWJvbCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29kZW9wLnB5YyBiL2xpYi9weXRob24yLjcvY29kZW9wLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDM0ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb2Rlb3AucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29kZW9wLnB5byBiL2xpYi9weXRob24yLjcvY29kZW9wLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDM0ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb2Rlb3AucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29sbGVjdGlvbnMucHkgYi9saWIvcHl0aG9uMi43L2NvbGxlY3Rpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMzJlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbGxlY3Rpb25zLnB5CkBAIC0wLDAgKzEsNjkzIEBACitfX2FsbF9fID0gWydDb3VudGVyJywgJ2RlcXVlJywgJ2RlZmF1bHRkaWN0JywgJ25hbWVkdHVwbGUnLCAnT3JkZXJlZERpY3QnXQorIyBGb3IgYm9vdHN0cmFwcGluZyByZWFzb25zLCB0aGUgY29sbGVjdGlvbiBBQkNzIGFyZSBkZWZpbmVkIGluIF9hYmNvbGwucHkuCisjIFRoZXkgc2hvdWxkIGhvd2V2ZXIgYmUgY29uc2lkZXJlZCBhbiBpbnRlZ3JhbCBwYXJ0IG9mIGNvbGxlY3Rpb25zLnB5LgorZnJvbSBfYWJjb2xsIGltcG9ydCAqCitpbXBvcnQgX2FiY29sbAorX19hbGxfXyArPSBfYWJjb2xsLl9fYWxsX18KKworZnJvbSBfY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlLCBkZWZhdWx0ZGljdAorZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlciBhcyBfaXRlbWdldHRlciwgZXEgYXMgX2VxCitmcm9tIGtleXdvcmQgaW1wb3J0IGlza2V5d29yZCBhcyBfaXNrZXl3b3JkCitpbXBvcnQgc3lzIGFzIF9zeXMKK2ltcG9ydCBoZWFwcSBhcyBfaGVhcHEKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCByZXBlYXQgYXMgX3JlcGVhdCwgY2hhaW4gYXMgX2NoYWluLCBzdGFybWFwIGFzIF9zdGFybWFwCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaW1hcCBhcyBfaW1hcAorCit0cnk6CisgICAgZnJvbSB0aHJlYWQgaW1wb3J0IGdldF9pZGVudCBhcyBfZ2V0X2lkZW50CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBkdW1teV90aHJlYWQgaW1wb3J0IGdldF9pZGVudCBhcyBfZ2V0X2lkZW50CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBPcmRlcmVkRGljdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgT3JkZXJlZERpY3QoZGljdCk6CisgICAgJ0RpY3Rpb25hcnkgdGhhdCByZW1lbWJlcnMgaW5zZXJ0aW9uIG9yZGVyJworICAgICMgQW4gaW5oZXJpdGVkIGRpY3QgbWFwcyBrZXlzIHRvIHZhbHVlcy4KKyAgICAjIFRoZSBpbmhlcml0ZWQgZGljdCBwcm92aWRlcyBfX2dldGl0ZW1fXywgX19sZW5fXywgX19jb250YWluc19fLCBhbmQgZ2V0LgorICAgICMgVGhlIHJlbWFpbmluZyBtZXRob2RzIGFyZSBvcmRlci1hd2FyZS4KKyAgICAjIEJpZy1PIHJ1bm5pbmcgdGltZXMgZm9yIGFsbCBtZXRob2RzIGFyZSB0aGUgc2FtZSBhcyByZWd1bGFyIGRpY3Rpb25hcmllcy4KKworICAgICMgVGhlIGludGVybmFsIHNlbGYuX19tYXAgZGljdCBtYXBzIGtleXMgdG8gbGlua3MgaW4gYSBkb3VibHkgbGlua2VkIGxpc3QuCisgICAgIyBUaGUgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IHN0YXJ0cyBhbmQgZW5kcyB3aXRoIGEgc2VudGluZWwgZWxlbWVudC4KKyAgICAjIFRoZSBzZW50aW5lbCBlbGVtZW50IG5ldmVyIGdldHMgZGVsZXRlZCAodGhpcyBzaW1wbGlmaWVzIHRoZSBhbGdvcml0aG0pLgorICAgICMgRWFjaCBsaW5rIGlzIHN0b3JlZCBhcyBhIGxpc3Qgb2YgbGVuZ3RoIHRocmVlOiAgW1BSRVYsIE5FWFQsIEtFWV0uCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICcnJ0luaXRpYWxpemUgYW4gb3JkZXJlZCBkaWN0aW9uYXJ5LiAgVGhlIHNpZ25hdHVyZSBpcyB0aGUgc2FtZSBhcworICAgICAgICByZWd1bGFyIGRpY3Rpb25hcmllcywgYnV0IGtleXdvcmQgYXJndW1lbnRzIGFyZSBub3QgcmVjb21tZW5kZWQgYmVjYXVzZQorICAgICAgICB0aGVpciBpbnNlcnRpb24gb3JkZXIgaXMgYXJiaXRyYXJ5LgorCisgICAgICAgICcnJworICAgICAgICBpZiBsZW4oYXJncykgPiAxOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHBlY3RlZCBhdCBtb3N0IDEgYXJndW1lbnRzLCBnb3QgJWQnICUgbGVuKGFyZ3MpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9fcm9vdAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBzZWxmLl9fcm9vdCA9IHJvb3QgPSBbXSAgICAgICAgICAgICAgICAgICAgICMgc2VudGluZWwgbm9kZQorICAgICAgICAgICAgcm9vdFs6XSA9IFtyb290LCByb290LCBOb25lXQorICAgICAgICAgICAgc2VsZi5fX21hcCA9IHt9CisgICAgICAgIHNlbGYuX191cGRhdGUoKmFyZ3MsICoqa3dkcykKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlLCBkaWN0X3NldGl0ZW09ZGljdC5fX3NldGl0ZW1fXyk6CisgICAgICAgICdvZC5fX3NldGl0ZW1fXyhpLCB5KSA8PT0+IG9kW2ldPXknCisgICAgICAgICMgU2V0dGluZyBhIG5ldyBpdGVtIGNyZWF0ZXMgYSBuZXcgbGluayBhdCB0aGUgZW5kIG9mIHRoZSBsaW5rZWQgbGlzdCwKKyAgICAgICAgIyBhbmQgdGhlIGluaGVyaXRlZCBkaWN0aW9uYXJ5IGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGtleS92YWx1ZSBwYWlyLgorICAgICAgICBpZiBrZXkgbm90IGluIHNlbGY6CisgICAgICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKKyAgICAgICAgICAgIGxhc3QgPSByb290WzBdCisgICAgICAgICAgICBsYXN0WzFdID0gcm9vdFswXSA9IHNlbGYuX19tYXBba2V5XSA9IFtsYXN0LCByb290LCBrZXldCisgICAgICAgIHJldHVybiBkaWN0X3NldGl0ZW0oc2VsZiwga2V5LCB2YWx1ZSkKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXksIGRpY3RfZGVsaXRlbT1kaWN0Ll9fZGVsaXRlbV9fKToKKyAgICAgICAgJ29kLl9fZGVsaXRlbV9fKHkpIDw9PT4gZGVsIG9kW3ldJworICAgICAgICAjIERlbGV0aW5nIGFuIGV4aXN0aW5nIGl0ZW0gdXNlcyBzZWxmLl9fbWFwIHRvIGZpbmQgdGhlIGxpbmsgd2hpY2ggZ2V0cworICAgICAgICAjIHJlbW92ZWQgYnkgdXBkYXRpbmcgdGhlIGxpbmtzIGluIHRoZSBwcmVkZWNlc3NvciBhbmQgc3VjY2Vzc29yIG5vZGVzLgorICAgICAgICBkaWN0X2RlbGl0ZW0oc2VsZiwga2V5KQorICAgICAgICBsaW5rX3ByZXYsIGxpbmtfbmV4dCwgXyA9IHNlbGYuX19tYXAucG9wKGtleSkKKyAgICAgICAgbGlua19wcmV2WzFdID0gbGlua19uZXh0ICAgICAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgbGlua19wcmV2W05FWFRdCisgICAgICAgIGxpbmtfbmV4dFswXSA9IGxpbmtfcHJldiAgICAgICAgICAgICAgICAgICAgICAgICMgdXBkYXRlIGxpbmtfbmV4dFtQUkVWXQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAnb2QuX19pdGVyX18oKSA8PT0+IGl0ZXIob2QpJworICAgICAgICAjIFRyYXZlcnNlIHRoZSBsaW5rZWQgbGlzdCBpbiBvcmRlci4KKyAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CisgICAgICAgIGN1cnIgPSByb290WzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RhcnQgYXQgdGhlIGZpcnN0IG5vZGUKKyAgICAgICAgd2hpbGUgY3VyciBpcyBub3Qgcm9vdDoKKyAgICAgICAgICAgIHlpZWxkIGN1cnJbMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5aWVsZCB0aGUgY3VycltLRVldCisgICAgICAgICAgICBjdXJyID0gY3VyclsxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW92ZSB0byBuZXh0IG5vZGUKKworICAgIGRlZiBfX3JldmVyc2VkX18oc2VsZik6CisgICAgICAgICdvZC5fX3JldmVyc2VkX18oKSA8PT0+IHJldmVyc2VkKG9kKScKKyAgICAgICAgIyBUcmF2ZXJzZSB0aGUgbGlua2VkIGxpc3QgaW4gcmV2ZXJzZSBvcmRlci4KKyAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CisgICAgICAgIGN1cnIgPSByb290WzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RhcnQgYXQgdGhlIGxhc3Qgbm9kZQorICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCByb290OgorICAgICAgICAgICAgeWllbGQgY3VyclsyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlpZWxkIHRoZSBjdXJyW0tFWV0KKyAgICAgICAgICAgIGN1cnIgPSBjdXJyWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRvIHByZXZpb3VzIG5vZGUKKworICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgJ29kLmNsZWFyKCkgLT4gTm9uZS4gIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSBvZC4nCisgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAorICAgICAgICByb290WzpdID0gW3Jvb3QsIHJvb3QsIE5vbmVdCisgICAgICAgIHNlbGYuX19tYXAuY2xlYXIoKQorICAgICAgICBkaWN0LmNsZWFyKHNlbGYpCisKKyAgICAjIC0tIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgLS0KKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAnb2Qua2V5cygpIC0+IGxpc3Qgb2Yga2V5cyBpbiBvZCcKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZikKKworICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgICdvZC52YWx1ZXMoKSAtPiBsaXN0IG9mIHZhbHVlcyBpbiBvZCcKKyAgICAgICAgcmV0dXJuIFtzZWxmW2tleV0gZm9yIGtleSBpbiBzZWxmXQorCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICAnb2QuaXRlbXMoKSAtPiBsaXN0IG9mIChrZXksIHZhbHVlKSBwYWlycyBpbiBvZCcKKyAgICAgICAgcmV0dXJuIFsoa2V5LCBzZWxmW2tleV0pIGZvciBrZXkgaW4gc2VsZl0KKworICAgIGRlZiBpdGVya2V5cyhzZWxmKToKKyAgICAgICAgJ29kLml0ZXJrZXlzKCkgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBpbiBvZCcKKyAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZikKKworICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOgorICAgICAgICAnb2QuaXRlcnZhbHVlcyAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgaW4gb2QnCisgICAgICAgIGZvciBrIGluIHNlbGY6CisgICAgICAgICAgICB5aWVsZCBzZWxmW2tdCisKKyAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgorICAgICAgICAnb2QuaXRlcml0ZW1zIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIChrZXksIHZhbHVlKSBwYWlycyBpbiBvZCcKKyAgICAgICAgZm9yIGsgaW4gc2VsZjoKKyAgICAgICAgICAgIHlpZWxkIChrLCBzZWxmW2tdKQorCisgICAgdXBkYXRlID0gTXV0YWJsZU1hcHBpbmcudXBkYXRlCisKKyAgICBfX3VwZGF0ZSA9IHVwZGF0ZSAjIGxldCBzdWJjbGFzc2VzIG92ZXJyaWRlIHVwZGF0ZSB3aXRob3V0IGJyZWFraW5nIF9faW5pdF9fCisKKyAgICBfX21hcmtlciA9IG9iamVjdCgpCisKKyAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1fX21hcmtlcik6CisgICAgICAgICcnJ29kLnBvcChrWyxkXSkgLT4gdiwgcmVtb3ZlIHNwZWNpZmllZCBrZXkgYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZworICAgICAgICB2YWx1ZS4gIElmIGtleSBpcyBub3QgZm91bmQsIGQgaXMgcmV0dXJuZWQgaWYgZ2l2ZW4sIG90aGVyd2lzZSBLZXlFcnJvcgorICAgICAgICBpcyByYWlzZWQuCisKKyAgICAgICAgJycnCisgICAgICAgIGlmIGtleSBpbiBzZWxmOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltrZXldCisgICAgICAgICAgICBkZWwgc2VsZltrZXldCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIGlmIGRlZmF1bHQgaXMgc2VsZi5fX21hcmtlcjoKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKGtleSkKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworICAgIGRlZiBzZXRkZWZhdWx0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgJ29kLnNldGRlZmF1bHQoa1ssZF0pIC0+IG9kLmdldChrLGQpLCBhbHNvIHNldCBvZFtrXT1kIGlmIGsgbm90IGluIG9kJworICAgICAgICBpZiBrZXkgaW4gc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0KKyAgICAgICAgc2VsZltrZXldID0gZGVmYXVsdAorICAgICAgICByZXR1cm4gZGVmYXVsdAorCisgICAgZGVmIHBvcGl0ZW0oc2VsZiwgbGFzdD1UcnVlKToKKyAgICAgICAgJycnb2QucG9waXRlbSgpIC0+IChrLCB2KSwgcmV0dXJuIGFuZCByZW1vdmUgYSAoa2V5LCB2YWx1ZSkgcGFpci4KKyAgICAgICAgUGFpcnMgYXJlIHJldHVybmVkIGluIExJRk8gb3JkZXIgaWYgbGFzdCBpcyB0cnVlIG9yIEZJRk8gb3JkZXIgaWYgZmFsc2UuCisKKyAgICAgICAgJycnCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ2RpY3Rpb25hcnkgaXMgZW1wdHknKQorICAgICAgICBrZXkgPSBuZXh0KHJldmVyc2VkKHNlbGYpIGlmIGxhc3QgZWxzZSBpdGVyKHNlbGYpKQorICAgICAgICB2YWx1ZSA9IHNlbGYucG9wKGtleSkKKyAgICAgICAgcmV0dXJuIGtleSwgdmFsdWUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmLCBfcmVwcl9ydW5uaW5nPXt9KToKKyAgICAgICAgJ29kLl9fcmVwcl9fKCkgPD09PiByZXByKG9kKScKKyAgICAgICAgY2FsbF9rZXkgPSBpZChzZWxmKSwgX2dldF9pZGVudCgpCisgICAgICAgIGlmIGNhbGxfa2V5IGluIF9yZXByX3J1bm5pbmc6CisgICAgICAgICAgICByZXR1cm4gJy4uLicKKyAgICAgICAgX3JlcHJfcnVubmluZ1tjYWxsX2tleV0gPSAxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgICAgIHJldHVybiAnJXMoKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sKQorICAgICAgICAgICAgcmV0dXJuICclcyglciknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLml0ZW1zKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWwgX3JlcHJfcnVubmluZ1tjYWxsX2tleV0KKworICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICAnUmV0dXJuIHN0YXRlIGluZm9ybWF0aW9uIGZvciBwaWNrbGluZycKKyAgICAgICAgaXRlbXMgPSBbW2ssIHNlbGZba11dIGZvciBrIGluIHNlbGZdCisgICAgICAgIGluc3RfZGljdCA9IHZhcnMoc2VsZikuY29weSgpCisgICAgICAgIGZvciBrIGluIHZhcnMoT3JkZXJlZERpY3QoKSk6CisgICAgICAgICAgICBpbnN0X2RpY3QucG9wKGssIE5vbmUpCisgICAgICAgIGlmIGluc3RfZGljdDoKKyAgICAgICAgICAgIHJldHVybiAoc2VsZi5fX2NsYXNzX18sIChpdGVtcywpLCBpbnN0X2RpY3QpCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCkKKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICAnb2QuY29weSgpIC0+IGEgc2hhbGxvdyBjb3B5IG9mIG9kJworICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9ta2V5cyhjbHMsIGl0ZXJhYmxlLCB2YWx1ZT1Ob25lKToKKyAgICAgICAgJycnT0QuZnJvbWtleXMoU1ssIHZdKSAtPiBOZXcgb3JkZXJlZCBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tIFMuCisgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBkZWZhdWx0cyB0byBOb25lLgorCisgICAgICAgICcnJworICAgICAgICBzZWxmID0gY2xzKCkKKyAgICAgICAgZm9yIGtleSBpbiBpdGVyYWJsZToKKyAgICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgJycnb2QuX19lcV9fKHkpIDw9PT4gb2Q9PXkuICBDb21wYXJpc29uIHRvIGFub3RoZXIgT0QgaXMgb3JkZXItc2Vuc2l0aXZlCisgICAgICAgIHdoaWxlIGNvbXBhcmlzb24gdG8gYSByZWd1bGFyIG1hcHBpbmcgaXMgb3JkZXItaW5zZW5zaXRpdmUuCisKKyAgICAgICAgJycnCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE9yZGVyZWREaWN0KToKKyAgICAgICAgICAgIHJldHVybiBkaWN0Ll9fZXFfXyhzZWxmLCBvdGhlcikgYW5kIGFsbChfaW1hcChfZXEsIHNlbGYsIG90aGVyKSkKKyAgICAgICAgcmV0dXJuIGRpY3QuX19lcV9fKHNlbGYsIG90aGVyKQorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICdvZC5fX25lX18oeSkgPD09PiBvZCE9eScKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgICAjIC0tIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBzdXBwb3J0IHB5dGhvbiAzLnggc3R5bGUgZGljdGlvbmFyeSB2aWV3cyAtLQorCisgICAgZGVmIHZpZXdrZXlzKHNlbGYpOgorICAgICAgICAib2Qudmlld2tleXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIG9kJ3Mga2V5cyIKKyAgICAgICAgcmV0dXJuIEtleXNWaWV3KHNlbGYpCisKKyAgICBkZWYgdmlld3ZhbHVlcyhzZWxmKToKKyAgICAgICAgIm9kLnZpZXd2YWx1ZXMoKSAtPiBhbiBvYmplY3QgcHJvdmlkaW5nIGEgdmlldyBvbiBvZCdzIHZhbHVlcyIKKyAgICAgICAgcmV0dXJuIFZhbHVlc1ZpZXcoc2VsZikKKworICAgIGRlZiB2aWV3aXRlbXMoc2VsZik6CisgICAgICAgICJvZC52aWV3aXRlbXMoKSAtPiBhIHNldC1saWtlIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIG9kJ3MgaXRlbXMiCisgICAgICAgIHJldHVybiBJdGVtc1ZpZXcoc2VsZikKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIG5hbWVkdHVwbGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK19jbGFzc190ZW1wbGF0ZSA9ICcnJ1wKK2NsYXNzIHt0eXBlbmFtZX0odHVwbGUpOgorICAgICd7dHlwZW5hbWV9KHthcmdfbGlzdH0pJworCisgICAgX19zbG90c19fID0gKCkKKworICAgIF9maWVsZHMgPSB7ZmllbGRfbmFtZXMhcn0KKworICAgIGRlZiBfX25ld19fKF9jbHMsIHthcmdfbGlzdH0pOgorICAgICAgICAnQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiB7dHlwZW5hbWV9KHthcmdfbGlzdH0pJworICAgICAgICByZXR1cm4gX3R1cGxlLl9fbmV3X18oX2NscywgKHthcmdfbGlzdH0pKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9tYWtlKGNscywgaXRlcmFibGUsIG5ldz10dXBsZS5fX25ld19fLCBsZW49bGVuKToKKyAgICAgICAgJ01ha2UgYSBuZXcge3R5cGVuYW1lfSBvYmplY3QgZnJvbSBhIHNlcXVlbmNlIG9yIGl0ZXJhYmxlJworICAgICAgICByZXN1bHQgPSBuZXcoY2xzLCBpdGVyYWJsZSkKKyAgICAgICAgaWYgbGVuKHJlc3VsdCkgIT0ge251bV9maWVsZHM6ZH06CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0V4cGVjdGVkIHtudW1fZmllbGRzOmR9IGFyZ3VtZW50cywgZ290ICVkJyAlIGxlbihyZXN1bHQpKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICdSZXR1cm4gYSBuaWNlbHkgZm9ybWF0dGVkIHJlcHJlc2VudGF0aW9uIHN0cmluZycKKyAgICAgICAgcmV0dXJuICd7dHlwZW5hbWV9KHtyZXByX2ZtdH0pJyAlIHNlbGYKKworICAgIGRlZiBfYXNkaWN0KHNlbGYpOgorICAgICAgICAnUmV0dXJuIGEgbmV3IE9yZGVyZWREaWN0IHdoaWNoIG1hcHMgZmllbGQgbmFtZXMgdG8gdGhlaXIgdmFsdWVzJworICAgICAgICByZXR1cm4gT3JkZXJlZERpY3QoemlwKHNlbGYuX2ZpZWxkcywgc2VsZikpCisKKyAgICBkZWYgX3JlcGxhY2UoX3NlbGYsICoqa3dkcyk6CisgICAgICAgICdSZXR1cm4gYSBuZXcge3R5cGVuYW1lfSBvYmplY3QgcmVwbGFjaW5nIHNwZWNpZmllZCBmaWVsZHMgd2l0aCBuZXcgdmFsdWVzJworICAgICAgICByZXN1bHQgPSBfc2VsZi5fbWFrZShtYXAoa3dkcy5wb3AsIHtmaWVsZF9uYW1lcyFyfSwgX3NlbGYpKQorICAgICAgICBpZiBrd2RzOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignR290IHVuZXhwZWN0ZWQgZmllbGQgbmFtZXM6ICVyJyAlIGt3ZHMua2V5cygpKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6CisgICAgICAgICdSZXR1cm4gc2VsZiBhcyBhIHBsYWluIHR1cGxlLiAgVXNlZCBieSBjb3B5IGFuZCBwaWNrbGUuJworICAgICAgICByZXR1cm4gdHVwbGUoc2VsZikKKwore2ZpZWxkX2RlZnN9CisnJycKKworX3JlcHJfdGVtcGxhdGUgPSAne25hbWV9PSVyJworCitfZmllbGRfdGVtcGxhdGUgPSAnJydcCisgICAge25hbWV9ID0gX3Byb3BlcnR5KF9pdGVtZ2V0dGVyKHtpbmRleDpkfSksIGRvYz0nQWxpYXMgZm9yIGZpZWxkIG51bWJlciB7aW5kZXg6ZH0nKQorJycnCisKK2RlZiBuYW1lZHR1cGxlKHR5cGVuYW1lLCBmaWVsZF9uYW1lcywgdmVyYm9zZT1GYWxzZSwgcmVuYW1lPUZhbHNlKToKKyAgICAiIiJSZXR1cm5zIGEgbmV3IHN1YmNsYXNzIG9mIHR1cGxlIHdpdGggbmFtZWQgZmllbGRzLgorCisgICAgPj4+IFBvaW50ID0gbmFtZWR0dXBsZSgnUG9pbnQnLCBbJ3gnLCAneSddKQorICAgID4+PiBQb2ludC5fX2RvY19fICAgICAgICAgICAgICAgICAgICMgZG9jc3RyaW5nIGZvciB0aGUgbmV3IGNsYXNzCisgICAgJ1BvaW50KHgsIHkpJworICAgID4+PiBwID0gUG9pbnQoMTEsIHk9MjIpICAgICAgICAgICAgICMgaW5zdGFudGlhdGUgd2l0aCBwb3NpdGlvbmFsIGFyZ3Mgb3Iga2V5d29yZHMKKyAgICA+Pj4gcFswXSArIHBbMV0gICAgICAgICAgICAgICAgICAgICAjIGluZGV4YWJsZSBsaWtlIGEgcGxhaW4gdHVwbGUKKyAgICAzMworICAgID4+PiB4LCB5ID0gcCAgICAgICAgICAgICAgICAgICAgICAgICMgdW5wYWNrIGxpa2UgYSByZWd1bGFyIHR1cGxlCisgICAgPj4+IHgsIHkKKyAgICAoMTEsIDIyKQorICAgID4+PiBwLnggKyBwLnkgICAgICAgICAgICAgICAgICAgICAgICMgZmllbGRzIGFsc28gYWNjZXNzYWJsZSBieSBuYW1lCisgICAgMzMKKyAgICA+Pj4gZCA9IHAuX2FzZGljdCgpICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgdG8gYSBkaWN0aW9uYXJ5CisgICAgPj4+IGRbJ3gnXQorICAgIDExCisgICAgPj4+IFBvaW50KCoqZCkgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IGZyb20gYSBkaWN0aW9uYXJ5CisgICAgUG9pbnQoeD0xMSwgeT0yMikKKyAgICA+Pj4gcC5fcmVwbGFjZSh4PTEwMCkgICAgICAgICAgICAgICAjIF9yZXBsYWNlKCkgaXMgbGlrZSBzdHIucmVwbGFjZSgpIGJ1dCB0YXJnZXRzIG5hbWVkIGZpZWxkcworICAgIFBvaW50KHg9MTAwLCB5PTIyKQorCisgICAgIiIiCisKKyAgICAjIFZhbGlkYXRlIHRoZSBmaWVsZCBuYW1lcy4gIEF0IHRoZSB1c2VyJ3Mgb3B0aW9uLCBlaXRoZXIgZ2VuZXJhdGUgYW4gZXJyb3IKKyAgICAjIG1lc3NhZ2Ugb3IgYXV0b21hdGljYWxseSByZXBsYWNlIHRoZSBmaWVsZCBuYW1lIHdpdGggYSB2YWxpZCBuYW1lLgorICAgIGlmIGlzaW5zdGFuY2UoZmllbGRfbmFtZXMsIGJhc2VzdHJpbmcpOgorICAgICAgICBmaWVsZF9uYW1lcyA9IGZpZWxkX25hbWVzLnJlcGxhY2UoJywnLCAnICcpLnNwbGl0KCkKKyAgICBmaWVsZF9uYW1lcyA9IG1hcChzdHIsIGZpZWxkX25hbWVzKQorICAgIGlmIHJlbmFtZToKKyAgICAgICAgc2VlbiA9IHNldCgpCisgICAgICAgIGZvciBpbmRleCwgbmFtZSBpbiBlbnVtZXJhdGUoZmllbGRfbmFtZXMpOgorICAgICAgICAgICAgaWYgKG5vdCBhbGwoYy5pc2FsbnVtKCkgb3IgYz09J18nIGZvciBjIGluIG5hbWUpCisgICAgICAgICAgICAgICAgb3IgX2lza2V5d29yZChuYW1lKQorICAgICAgICAgICAgICAgIG9yIG5vdCBuYW1lCisgICAgICAgICAgICAgICAgb3IgbmFtZVswXS5pc2RpZ2l0KCkKKyAgICAgICAgICAgICAgICBvciBuYW1lLnN0YXJ0c3dpdGgoJ18nKQorICAgICAgICAgICAgICAgIG9yIG5hbWUgaW4gc2Vlbik6CisgICAgICAgICAgICAgICAgZmllbGRfbmFtZXNbaW5kZXhdID0gJ18lZCcgJSBpbmRleAorICAgICAgICAgICAgc2Vlbi5hZGQobmFtZSkKKyAgICBmb3IgbmFtZSBpbiBbdHlwZW5hbWVdICsgZmllbGRfbmFtZXM6CisgICAgICAgIGlmIG5vdCBhbGwoYy5pc2FsbnVtKCkgb3IgYz09J18nIGZvciBjIGluIG5hbWUpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgY2FuIG9ubHkgY29udGFpbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdW5kZXJzY29yZXM6ICVyJyAlIG5hbWUpCisgICAgICAgIGlmIF9pc2tleXdvcmQobmFtZSk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW5ub3QgYmUgYSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrZXl3b3JkOiAlcicgJSBuYW1lKQorICAgICAgICBpZiBuYW1lWzBdLmlzZGlnaXQoKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1R5cGUgbmFtZXMgYW5kIGZpZWxkIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EgbnVtYmVyOiAlcicgJSBuYW1lKQorICAgIHNlZW4gPSBzZXQoKQorICAgIGZvciBuYW1lIGluIGZpZWxkX25hbWVzOgorICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ18nKSBhbmQgbm90IHJlbmFtZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ZpZWxkIG5hbWVzIGNhbm5vdCBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmU6ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyJyAlIG5hbWUpCisgICAgICAgIGlmIG5hbWUgaW4gc2VlbjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0VuY291bnRlcmVkIGR1cGxpY2F0ZSBmaWVsZCBuYW1lOiAlcicgJSBuYW1lKQorICAgICAgICBzZWVuLmFkZChuYW1lKQorCisgICAgIyBGaWxsLWluIHRoZSBjbGFzcyB0ZW1wbGF0ZQorICAgIGNsYXNzX2RlZmluaXRpb24gPSBfY2xhc3NfdGVtcGxhdGUuZm9ybWF0KAorICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lLAorICAgICAgICBmaWVsZF9uYW1lcyA9IHR1cGxlKGZpZWxkX25hbWVzKSwKKyAgICAgICAgbnVtX2ZpZWxkcyA9IGxlbihmaWVsZF9uYW1lcyksCisgICAgICAgIGFyZ19saXN0ID0gcmVwcih0dXBsZShmaWVsZF9uYW1lcykpLnJlcGxhY2UoIiciLCAiIilbMTotMV0sCisgICAgICAgIHJlcHJfZm10ID0gJywgJy5qb2luKF9yZXByX3RlbXBsYXRlLmZvcm1hdChuYW1lPW5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpZWxkX25hbWVzKSwKKyAgICAgICAgZmllbGRfZGVmcyA9ICdcbicuam9pbihfZmllbGRfdGVtcGxhdGUuZm9ybWF0KGluZGV4PWluZGV4LCBuYW1lPW5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGluZGV4LCBuYW1lIGluIGVudW1lcmF0ZShmaWVsZF9uYW1lcykpCisgICAgKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50IGNsYXNzX2RlZmluaXRpb24KKworICAgICMgRXhlY3V0ZSB0aGUgdGVtcGxhdGUgc3RyaW5nIGluIGEgdGVtcG9yYXJ5IG5hbWVzcGFjZSBhbmQgc3VwcG9ydAorICAgICMgdHJhY2luZyB1dGlsaXRpZXMgYnkgc2V0dGluZyBhIHZhbHVlIGZvciBmcmFtZS5mX2dsb2JhbHNbJ19fbmFtZV9fJ10KKyAgICBuYW1lc3BhY2UgPSBkaWN0KF9pdGVtZ2V0dGVyPV9pdGVtZ2V0dGVyLCBfX25hbWVfXz0nbmFtZWR0dXBsZV8lcycgJSB0eXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIE9yZGVyZWREaWN0PU9yZGVyZWREaWN0LCBfcHJvcGVydHk9cHJvcGVydHksIF90dXBsZT10dXBsZSkKKyAgICB0cnk6CisgICAgICAgIGV4ZWMgY2xhc3NfZGVmaW5pdGlvbiBpbiBuYW1lc3BhY2UKKyAgICBleGNlcHQgU3ludGF4RXJyb3IgYXMgZToKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoZS5tZXNzYWdlICsgJzpcbicgKyBjbGFzc19kZWZpbml0aW9uKQorICAgIHJlc3VsdCA9IG5hbWVzcGFjZVt0eXBlbmFtZV0KKworICAgICMgRm9yIHBpY2tsaW5nIHRvIHdvcmssIHRoZSBfX21vZHVsZV9fIHZhcmlhYmxlIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgZnJhbWUKKyAgICAjIHdoZXJlIHRoZSBuYW1lZCB0dXBsZSBpcyBjcmVhdGVkLiAgQnlwYXNzIHRoaXMgc3RlcCBpbiBlbnZpcm9tZW50cyB3aGVyZQorICAgICMgc3lzLl9nZXRmcmFtZSBpcyBub3QgZGVmaW5lZCAoSnl0aG9uIGZvciBleGFtcGxlKSBvciBzeXMuX2dldGZyYW1lIGlzIG5vdAorICAgICMgZGVmaW5lZCBmb3IgYXJndW1lbnRzIGdyZWF0ZXIgdGhhbiAwIChJcm9uUHl0aG9uKS4KKyAgICB0cnk6CisgICAgICAgIHJlc3VsdC5fX21vZHVsZV9fID0gX3N5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzLmdldCgnX19uYW1lX18nLCAnX19tYWluX18nKQorICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICBwYXNzCisKKyAgICByZXR1cm4gcmVzdWx0CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgIENvdW50ZXIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBDb3VudGVyKGRpY3QpOgorICAgICcnJ0RpY3Qgc3ViY2xhc3MgZm9yIGNvdW50aW5nIGhhc2hhYmxlIGl0ZW1zLiAgU29tZXRpbWVzIGNhbGxlZCBhIGJhZworICAgIG9yIG11bHRpc2V0LiAgRWxlbWVudHMgYXJlIHN0b3JlZCBhcyBkaWN0aW9uYXJ5IGtleXMgYW5kIHRoZWlyIGNvdW50cworICAgIGFyZSBzdG9yZWQgYXMgZGljdGlvbmFyeSB2YWx1ZXMuCisKKyAgICA+Pj4gYyA9IENvdW50ZXIoJ2FiY2RlYWJjZGFiY2FiYScpICAjIGNvdW50IGVsZW1lbnRzIGZyb20gYSBzdHJpbmcKKworICAgID4+PiBjLm1vc3RfY29tbW9uKDMpICAgICAgICAgICAgICAgICMgdGhyZWUgbW9zdCBjb21tb24gZWxlbWVudHMKKyAgICBbKCdhJywgNSksICgnYicsIDQpLCAoJ2MnLCAzKV0KKyAgICA+Pj4gc29ydGVkKGMpICAgICAgICAgICAgICAgICAgICAgICAjIGxpc3QgYWxsIHVuaXF1ZSBlbGVtZW50cworICAgIFsnYScsICdiJywgJ2MnLCAnZCcsICdlJ10KKyAgICA+Pj4gJycuam9pbihzb3J0ZWQoYy5lbGVtZW50cygpKSkgICAjIGxpc3QgZWxlbWVudHMgd2l0aCByZXBldGl0aW9ucworICAgICdhYWFhYWJiYmJjY2NkZGUnCisgICAgPj4+IHN1bShjLnZhbHVlcygpKSAgICAgICAgICAgICAgICAgIyB0b3RhbCBvZiBhbGwgY291bnRzCisgICAgMTUKKworICAgID4+PiBjWydhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgY291bnQgb2YgbGV0dGVyICdhJworICAgIDUKKyAgICA+Pj4gZm9yIGVsZW0gaW4gJ3NoYXphbSc6ICAgICAgICAgICAjIHVwZGF0ZSBjb3VudHMgZnJvbSBhbiBpdGVyYWJsZQorICAgIC4uLiAgICAgY1tlbGVtXSArPSAxICAgICAgICAgICAgICAgICMgYnkgYWRkaW5nIDEgdG8gZWFjaCBlbGVtZW50J3MgY291bnQKKyAgICA+Pj4gY1snYSddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgc2V2ZW4gJ2EnCisgICAgNworICAgID4+PiBkZWwgY1snYiddICAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGFsbCAnYicKKyAgICA+Pj4gY1snYiddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgemVybyAnYicKKyAgICAwCisKKyAgICA+Pj4gZCA9IENvdW50ZXIoJ3NpbXNhbGFiaW0nKSAgICAgICAjIG1ha2UgYW5vdGhlciBjb3VudGVyCisgICAgPj4+IGMudXBkYXRlKGQpICAgICAgICAgICAgICAgICAgICAgIyBhZGQgaW4gdGhlIHNlY29uZCBjb3VudGVyCisgICAgPj4+IGNbJ2EnXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBub3cgdGhlcmUgYXJlIG5pbmUgJ2EnCisgICAgOQorCisgICAgPj4+IGMuY2xlYXIoKSAgICAgICAgICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgY291bnRlcgorICAgID4+PiBjCisgICAgQ291bnRlcigpCisKKyAgICBOb3RlOiAgSWYgYSBjb3VudCBpcyBzZXQgdG8gemVybyBvciByZWR1Y2VkIHRvIHplcm8sIGl0IHdpbGwgcmVtYWluCisgICAgaW4gdGhlIGNvdW50ZXIgdW50aWwgdGhlIGVudHJ5IGlzIGRlbGV0ZWQgb3IgdGhlIGNvdW50ZXIgaXMgY2xlYXJlZDoKKworICAgID4+PiBjID0gQ291bnRlcignYWFhYmJjJykKKyAgICA+Pj4gY1snYiddIC09IDIgICAgICAgICAgICAgICAgICAgICAjIHJlZHVjZSB0aGUgY291bnQgb2YgJ2InIGJ5IHR3bworICAgID4+PiBjLm1vc3RfY29tbW9uKCkgICAgICAgICAgICAgICAgICMgJ2InIGlzIHN0aWxsIGluLCBidXQgaXRzIGNvdW50IGlzIHplcm8KKyAgICBbKCdhJywgMyksICgnYycsIDEpLCAoJ2InLCAwKV0KKworICAgICcnJworICAgICMgUmVmZXJlbmNlczoKKyAgICAjICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NdWx0aXNldAorICAgICMgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvc21hbGx0YWxrL21hbnVhbC1iYXNlL2h0bWxfbm9kZS9CYWcuaHRtbAorICAgICMgICBodHRwOi8vd3d3LmRlbW8ycy5jb20vVHV0b3JpYWwvQ3BwLzAzODBfX3NldC1tdWx0aXNldC9DYXRhbG9nMDM4MF9fc2V0LW11bHRpc2V0Lmh0bQorICAgICMgICBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy8yNTkxNzQvCisgICAgIyAgIEtudXRoLCBUQU9DUCBWb2wuIElJIHNlY3Rpb24gNC42LjMKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdGVyYWJsZT1Ob25lLCAqKmt3ZHMpOgorICAgICAgICAnJydDcmVhdGUgYSBuZXcsIGVtcHR5IENvdW50ZXIgb2JqZWN0LiAgQW5kIGlmIGdpdmVuLCBjb3VudCBlbGVtZW50cworICAgICAgICBmcm9tIGFuIGlucHV0IGl0ZXJhYmxlLiAgT3IsIGluaXRpYWxpemUgdGhlIGNvdW50IGZyb20gYW5vdGhlciBtYXBwaW5nCisgICAgICAgIG9mIGVsZW1lbnRzIHRvIHRoZWlyIGNvdW50cy4KKworICAgICAgICA+Pj4gYyA9IENvdW50ZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBuZXcsIGVtcHR5IGNvdW50ZXIKKyAgICAgICAgPj4+IGMgPSBDb3VudGVyKCdnYWxsYWhhZCcpICAgICAgICAgICAgICAgICAjIGEgbmV3IGNvdW50ZXIgZnJvbSBhbiBpdGVyYWJsZQorICAgICAgICA+Pj4gYyA9IENvdW50ZXIoeydhJzogNCwgJ2InOiAyfSkgICAgICAgICAgICMgYSBuZXcgY291bnRlciBmcm9tIGEgbWFwcGluZworICAgICAgICA+Pj4gYyA9IENvdW50ZXIoYT00LCBiPTIpICAgICAgICAgICAgICAgICAgICMgYSBuZXcgY291bnRlciBmcm9tIGtleXdvcmQgYXJncworCisgICAgICAgICcnJworICAgICAgICBzdXBlcihDb3VudGVyLCBzZWxmKS5fX2luaXRfXygpCisgICAgICAgIHNlbGYudXBkYXRlKGl0ZXJhYmxlLCAqKmt3ZHMpCisKKyAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KToKKyAgICAgICAgJ1RoZSBjb3VudCBvZiBlbGVtZW50cyBub3QgaW4gdGhlIENvdW50ZXIgaXMgemVyby4nCisgICAgICAgICMgTmVlZGVkIHNvIHRoYXQgc2VsZlttaXNzaW5nX2l0ZW1dIGRvZXMgbm90IHJhaXNlIEtleUVycm9yCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgbW9zdF9jb21tb24oc2VsZiwgbj1Ob25lKToKKyAgICAgICAgJycnTGlzdCB0aGUgbiBtb3N0IGNvbW1vbiBlbGVtZW50cyBhbmQgdGhlaXIgY291bnRzIGZyb20gdGhlIG1vc3QKKyAgICAgICAgY29tbW9uIHRvIHRoZSBsZWFzdC4gIElmIG4gaXMgTm9uZSwgdGhlbiBsaXN0IGFsbCBlbGVtZW50IGNvdW50cy4KKworICAgICAgICA+Pj4gQ291bnRlcignYWJjZGVhYmNkYWJjYWJhJykubW9zdF9jb21tb24oMykKKyAgICAgICAgWygnYScsIDUpLCAoJ2InLCA0KSwgKCdjJywgMyldCisKKyAgICAgICAgJycnCisgICAgICAgICMgRW11bGF0ZSBCYWcuc29ydGVkQnlDb3VudCBmcm9tIFNtYWxsdGFsaworICAgICAgICBpZiBuIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc29ydGVkKHNlbGYuaXRlcml0ZW1zKCksIGtleT1faXRlbWdldHRlcigxKSwgcmV2ZXJzZT1UcnVlKQorICAgICAgICByZXR1cm4gX2hlYXBxLm5sYXJnZXN0KG4sIHNlbGYuaXRlcml0ZW1zKCksIGtleT1faXRlbWdldHRlcigxKSkKKworICAgIGRlZiBlbGVtZW50cyhzZWxmKToKKyAgICAgICAgJycnSXRlcmF0b3Igb3ZlciBlbGVtZW50cyByZXBlYXRpbmcgZWFjaCBhcyBtYW55IHRpbWVzIGFzIGl0cyBjb3VudC4KKworICAgICAgICA+Pj4gYyA9IENvdW50ZXIoJ0FCQ0FCQycpCisgICAgICAgID4+PiBzb3J0ZWQoYy5lbGVtZW50cygpKQorICAgICAgICBbJ0EnLCAnQScsICdCJywgJ0InLCAnQycsICdDJ10KKworICAgICAgICAjIEtudXRoJ3MgZXhhbXBsZSBmb3IgcHJpbWUgZmFjdG9ycyBvZiAxODM2OiAgMioqMiAqIDMqKjMgKiAxNyoqMQorICAgICAgICA+Pj4gcHJpbWVfZmFjdG9ycyA9IENvdW50ZXIoezI6IDIsIDM6IDMsIDE3OiAxfSkKKyAgICAgICAgPj4+IHByb2R1Y3QgPSAxCisgICAgICAgID4+PiBmb3IgZmFjdG9yIGluIHByaW1lX2ZhY3RvcnMuZWxlbWVudHMoKTogICAgICMgbG9vcCBvdmVyIGZhY3RvcnMKKyAgICAgICAgLi4uICAgICBwcm9kdWN0ICo9IGZhY3RvciAgICAgICAgICAgICAgICAgICAgICAgIyBhbmQgbXVsdGlwbHkgdGhlbQorICAgICAgICA+Pj4gcHJvZHVjdAorICAgICAgICAxODM2CisKKyAgICAgICAgTm90ZSwgaWYgYW4gZWxlbWVudCdzIGNvdW50IGhhcyBiZWVuIHNldCB0byB6ZXJvIG9yIGlzIGEgbmVnYXRpdmUKKyAgICAgICAgbnVtYmVyLCBlbGVtZW50cygpIHdpbGwgaWdub3JlIGl0LgorCisgICAgICAgICcnJworICAgICAgICAjIEVtdWxhdGUgQmFnLmRvIGZyb20gU21hbGx0YWxrIGFuZCBNdWx0aXNldC5iZWdpbiBmcm9tIEMrKy4KKyAgICAgICAgcmV0dXJuIF9jaGFpbi5mcm9tX2l0ZXJhYmxlKF9zdGFybWFwKF9yZXBlYXQsIHNlbGYuaXRlcml0ZW1zKCkpKQorCisgICAgIyBPdmVycmlkZSBkaWN0IG1ldGhvZHMgd2hlcmUgbmVjZXNzYXJ5CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbWtleXMoY2xzLCBpdGVyYWJsZSwgdj1Ob25lKToKKyAgICAgICAgIyBUaGVyZSBpcyBubyBlcXVpdmFsZW50IG1ldGhvZCBmb3IgY291bnRlcnMgYmVjYXVzZSBzZXR0aW5nIHY9MQorICAgICAgICAjIG1lYW5zIHRoYXQgbm8gZWxlbWVudCBjYW4gaGF2ZSBhIGNvdW50IGdyZWF0ZXIgdGhhbiBvbmUuCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICAgICAnQ291bnRlci5mcm9ta2V5cygpIGlzIHVuZGVmaW5lZC4gIFVzZSBDb3VudGVyKGl0ZXJhYmxlKSBpbnN0ZWFkLicpCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIGl0ZXJhYmxlPU5vbmUsICoqa3dkcyk6CisgICAgICAgICcnJ0xpa2UgZGljdC51cGRhdGUoKSBidXQgYWRkIGNvdW50cyBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGVtLgorCisgICAgICAgIFNvdXJjZSBjYW4gYmUgYW4gaXRlcmFibGUsIGEgZGljdGlvbmFyeSwgb3IgYW5vdGhlciBDb3VudGVyIGluc3RhbmNlLgorCisgICAgICAgID4+PiBjID0gQ291bnRlcignd2hpY2gnKQorICAgICAgICA+Pj4gYy51cGRhdGUoJ3dpdGNoJykgICAgICAgICAgICMgYWRkIGVsZW1lbnRzIGZyb20gYW5vdGhlciBpdGVyYWJsZQorICAgICAgICA+Pj4gZCA9IENvdW50ZXIoJ3dhdGNoJykKKyAgICAgICAgPj4+IGMudXBkYXRlKGQpICAgICAgICAgICAgICAgICAjIGFkZCBlbGVtZW50cyBmcm9tIGFub3RoZXIgY291bnRlcgorICAgICAgICA+Pj4gY1snaCddICAgICAgICAgICAgICAgICAgICAgICMgZm91ciAnaCcgaW4gd2hpY2gsIHdpdGNoLCBhbmQgd2F0Y2gKKyAgICAgICAgNAorCisgICAgICAgICcnJworICAgICAgICAjIFRoZSByZWd1bGFyIGRpY3QudXBkYXRlKCkgb3BlcmF0aW9uIG1ha2VzIG5vIHNlbnNlIGhlcmUgYmVjYXVzZSB0aGUKKyAgICAgICAgIyByZXBsYWNlIGJlaGF2aW9yIHJlc3VsdHMgaW4gdGhlIHNvbWUgb2Ygb3JpZ2luYWwgdW50b3VjaGVkIGNvdW50cworICAgICAgICAjIGJlaW5nIG1peGVkLWluIHdpdGggYWxsIG9mIHRoZSBvdGhlciBjb3VudHMgZm9yIGEgbWlzbWFzaCB0aGF0CisgICAgICAgICMgZG9lc24ndCBoYXZlIGEgc3RyYWlnaHQtZm9yd2FyZCBpbnRlcnByZXRhdGlvbiBpbiBtb3N0IGNvdW50aW5nCisgICAgICAgICMgY29udGV4dHMuICBJbnN0ZWFkLCB3ZSBpbXBsZW1lbnQgc3RyYWlnaHQtYWRkaXRpb24uICBCb3RoIHRoZSBpbnB1dHMKKyAgICAgICAgIyBhbmQgb3V0cHV0cyBhcmUgYWxsb3dlZCB0byBjb250YWluIHplcm8gYW5kIG5lZ2F0aXZlIGNvdW50cy4KKworICAgICAgICBpZiBpdGVyYWJsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlcmFibGUsIE1hcHBpbmcpOgorICAgICAgICAgICAgICAgIGlmIHNlbGY6CisgICAgICAgICAgICAgICAgICAgIHNlbGZfZ2V0ID0gc2VsZi5nZXQKKyAgICAgICAgICAgICAgICAgICAgZm9yIGVsZW0sIGNvdW50IGluIGl0ZXJhYmxlLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltlbGVtXSA9IHNlbGZfZ2V0KGVsZW0sIDApICsgY291bnQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzdXBlcihDb3VudGVyLCBzZWxmKS51cGRhdGUoaXRlcmFibGUpICMgZmFzdCBwYXRoIHdoZW4gY291bnRlciBpcyBlbXB0eQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmX2dldCA9IHNlbGYuZ2V0CisgICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gaXRlcmFibGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGZbZWxlbV0gPSBzZWxmX2dldChlbGVtLCAwKSArIDEKKyAgICAgICAgaWYga3dkczoKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKGt3ZHMpCisKKyAgICBkZWYgc3VidHJhY3Qoc2VsZiwgaXRlcmFibGU9Tm9uZSwgKiprd2RzKToKKyAgICAgICAgJycnTGlrZSBkaWN0LnVwZGF0ZSgpIGJ1dCBzdWJ0cmFjdHMgY291bnRzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZW0uCisgICAgICAgIENvdW50cyBjYW4gYmUgcmVkdWNlZCBiZWxvdyB6ZXJvLiAgQm90aCB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzIGFyZQorICAgICAgICBhbGxvd2VkIHRvIGNvbnRhaW4gemVybyBhbmQgbmVnYXRpdmUgY291bnRzLgorCisgICAgICAgIFNvdXJjZSBjYW4gYmUgYW4gaXRlcmFibGUsIGEgZGljdGlvbmFyeSwgb3IgYW5vdGhlciBDb3VudGVyIGluc3RhbmNlLgorCisgICAgICAgID4+PiBjID0gQ291bnRlcignd2hpY2gnKQorICAgICAgICA+Pj4gYy5zdWJ0cmFjdCgnd2l0Y2gnKSAgICAgICAgICAgICAjIHN1YnRyYWN0IGVsZW1lbnRzIGZyb20gYW5vdGhlciBpdGVyYWJsZQorICAgICAgICA+Pj4gYy5zdWJ0cmFjdChDb3VudGVyKCd3YXRjaCcpKSAgICAjIHN1YnRyYWN0IGVsZW1lbnRzIGZyb20gYW5vdGhlciBjb3VudGVyCisgICAgICAgID4+PiBjWydoJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgMiBpbiB3aGljaCwgbWludXMgMSBpbiB3aXRjaCwgbWludXMgMSBpbiB3YXRjaAorICAgICAgICAwCisgICAgICAgID4+PiBjWyd3J10gICAgICAgICAgICAgICAgICAgICAgICAgICMgMSBpbiB3aGljaCwgbWludXMgMSBpbiB3aXRjaCwgbWludXMgMSBpbiB3YXRjaAorICAgICAgICAtMQorCisgICAgICAgICcnJworICAgICAgICBpZiBpdGVyYWJsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGZfZ2V0ID0gc2VsZi5nZXQKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlcmFibGUsIE1hcHBpbmcpOgorICAgICAgICAgICAgICAgIGZvciBlbGVtLCBjb3VudCBpbiBpdGVyYWJsZS5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBzZWxmW2VsZW1dID0gc2VsZl9nZXQoZWxlbSwgMCkgLSBjb3VudAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBpdGVyYWJsZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZltlbGVtXSA9IHNlbGZfZ2V0KGVsZW0sIDApIC0gMQorICAgICAgICBpZiBrd2RzOgorICAgICAgICAgICAgc2VsZi5zdWJ0cmFjdChrd2RzKQorCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgICdSZXR1cm4gYSBzaGFsbG93IGNvcHkuJworICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZikKKworICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sIChkaWN0KHNlbGYpLCkKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBlbGVtKToKKyAgICAgICAgJ0xpa2UgZGljdC5fX2RlbGl0ZW1fXygpIGJ1dCBkb2VzIG5vdCByYWlzZSBLZXlFcnJvciBmb3IgbWlzc2luZyB2YWx1ZXMuJworICAgICAgICBpZiBlbGVtIGluIHNlbGY6CisgICAgICAgICAgICBzdXBlcihDb3VudGVyLCBzZWxmKS5fX2RlbGl0ZW1fXyhlbGVtKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiAnJXMoKScgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworICAgICAgICBpdGVtcyA9ICcsICcuam9pbihtYXAoJyVyOiAlcicuX19tb2RfXywgc2VsZi5tb3N0X2NvbW1vbigpKSkKKyAgICAgICAgcmV0dXJuICclcyh7JXN9KScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGl0ZW1zKQorCisgICAgIyBNdWx0aXNldC1zdHlsZSBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBkaXNjdXNzZWQgaW46CisgICAgIyAgICAgICBLbnV0aCBUQU9DUCBWb2x1bWUgSUkgc2VjdGlvbiA0LjYuMyBleGVyY2lzZSAxOQorICAgICMgICAgICAgYW5kIGF0IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTXVsdGlzZXQKKyAgICAjCisgICAgIyBPdXRwdXRzIGd1YXJhbnRlZWQgdG8gb25seSBpbmNsdWRlIHBvc2l0aXZlIGNvdW50cy4KKyAgICAjCisgICAgIyBUbyBzdHJpcCBuZWdhdGl2ZSBhbmQgemVybyBjb3VudHMsIGFkZC1pbiBhbiBlbXB0eSBjb3VudGVyOgorICAgICMgICAgICAgYyArPSBDb3VudGVyKCkKKworICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgJycnQWRkIGNvdW50cyBmcm9tIHR3byBjb3VudGVycy4KKworICAgICAgICA+Pj4gQ291bnRlcignYWJiYicpICsgQ291bnRlcignYmNjJykKKyAgICAgICAgQ291bnRlcih7J2InOiA0LCAnYyc6IDIsICdhJzogMX0pCisKKyAgICAgICAgJycnCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBDb3VudGVyKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXN1bHQgPSBDb3VudGVyKCkKKyAgICAgICAgZm9yIGVsZW0sIGNvdW50IGluIHNlbGYuaXRlbXMoKToKKyAgICAgICAgICAgIG5ld2NvdW50ID0gY291bnQgKyBvdGhlcltlbGVtXQorICAgICAgICAgICAgaWYgbmV3Y291bnQgPiAwOgorICAgICAgICAgICAgICAgIHJlc3VsdFtlbGVtXSA9IG5ld2NvdW50CisgICAgICAgIGZvciBlbGVtLCBjb3VudCBpbiBvdGhlci5pdGVtcygpOgorICAgICAgICAgICAgaWYgZWxlbSBub3QgaW4gc2VsZiBhbmQgY291bnQgPiAwOgorICAgICAgICAgICAgICAgIHJlc3VsdFtlbGVtXSA9IGNvdW50CisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgJycnIFN1YnRyYWN0IGNvdW50LCBidXQga2VlcCBvbmx5IHJlc3VsdHMgd2l0aCBwb3NpdGl2ZSBjb3VudHMuCisKKyAgICAgICAgPj4+IENvdW50ZXIoJ2FiYmJjJykgLSBDb3VudGVyKCdiY2NkJykKKyAgICAgICAgQ291bnRlcih7J2InOiAyLCAnYSc6IDF9KQorCisgICAgICAgICcnJworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQ291bnRlcik6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmVzdWx0ID0gQ291bnRlcigpCisgICAgICAgIGZvciBlbGVtLCBjb3VudCBpbiBzZWxmLml0ZW1zKCk6CisgICAgICAgICAgICBuZXdjb3VudCA9IGNvdW50IC0gb3RoZXJbZWxlbV0KKyAgICAgICAgICAgIGlmIG5ld2NvdW50ID4gMDoKKyAgICAgICAgICAgICAgICByZXN1bHRbZWxlbV0gPSBuZXdjb3VudAorICAgICAgICBmb3IgZWxlbSwgY291bnQgaW4gb3RoZXIuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGVsZW0gbm90IGluIHNlbGYgYW5kIGNvdW50IDwgMDoKKyAgICAgICAgICAgICAgICByZXN1bHRbZWxlbV0gPSAwIC0gY291bnQKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9fb3JfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICcnJ1VuaW9uIGlzIHRoZSBtYXhpbXVtIG9mIHZhbHVlIGluIGVpdGhlciBvZiB0aGUgaW5wdXQgY291bnRlcnMuCisKKyAgICAgICAgPj4+IENvdW50ZXIoJ2FiYmInKSB8IENvdW50ZXIoJ2JjYycpCisgICAgICAgIENvdW50ZXIoeydiJzogMywgJ2MnOiAyLCAnYSc6IDF9KQorCisgICAgICAgICcnJworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQ291bnRlcik6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmVzdWx0ID0gQ291bnRlcigpCisgICAgICAgIGZvciBlbGVtLCBjb3VudCBpbiBzZWxmLml0ZW1zKCk6CisgICAgICAgICAgICBvdGhlcl9jb3VudCA9IG90aGVyW2VsZW1dCisgICAgICAgICAgICBuZXdjb3VudCA9IG90aGVyX2NvdW50IGlmIGNvdW50IDwgb3RoZXJfY291bnQgZWxzZSBjb3VudAorICAgICAgICAgICAgaWYgbmV3Y291bnQgPiAwOgorICAgICAgICAgICAgICAgIHJlc3VsdFtlbGVtXSA9IG5ld2NvdW50CisgICAgICAgIGZvciBlbGVtLCBjb3VudCBpbiBvdGhlci5pdGVtcygpOgorICAgICAgICAgICAgaWYgZWxlbSBub3QgaW4gc2VsZiBhbmQgY291bnQgPiAwOgorICAgICAgICAgICAgICAgIHJlc3VsdFtlbGVtXSA9IGNvdW50CisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgJycnIEludGVyc2VjdGlvbiBpcyB0aGUgbWluaW11bSBvZiBjb3JyZXNwb25kaW5nIGNvdW50cy4KKworICAgICAgICA+Pj4gQ291bnRlcignYWJiYicpICYgQ291bnRlcignYmNjJykKKyAgICAgICAgQ291bnRlcih7J2InOiAxfSkKKworICAgICAgICAnJycKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIENvdW50ZXIpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJlc3VsdCA9IENvdW50ZXIoKQorICAgICAgICBmb3IgZWxlbSwgY291bnQgaW4gc2VsZi5pdGVtcygpOgorICAgICAgICAgICAgb3RoZXJfY291bnQgPSBvdGhlcltlbGVtXQorICAgICAgICAgICAgbmV3Y291bnQgPSBjb3VudCBpZiBjb3VudCA8IG90aGVyX2NvdW50IGVsc2Ugb3RoZXJfY291bnQKKyAgICAgICAgICAgIGlmIG5ld2NvdW50ID4gMDoKKyAgICAgICAgICAgICAgICByZXN1bHRbZWxlbV0gPSBuZXdjb3VudAorICAgICAgICByZXR1cm4gcmVzdWx0CisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAjIHZlcmlmeSB0aGF0IGluc3RhbmNlcyBjYW4gYmUgcGlja2xlZAorICAgIGZyb20gY1BpY2tsZSBpbXBvcnQgbG9hZHMsIGR1bXBzCisgICAgUG9pbnQgPSBuYW1lZHR1cGxlKCdQb2ludCcsICd4LCB5JywgVHJ1ZSkKKyAgICBwID0gUG9pbnQoeD0xMCwgeT0yMCkKKyAgICBhc3NlcnQgcCA9PSBsb2FkcyhkdW1wcyhwKSkKKworICAgICMgdGVzdCBhbmQgZGVtb25zdHJhdGUgYWJpbGl0eSB0byBvdmVycmlkZSBtZXRob2RzCisgICAgY2xhc3MgUG9pbnQobmFtZWR0dXBsZSgnUG9pbnQnLCAneCB5JykpOgorICAgICAgICBfX3Nsb3RzX18gPSAoKQorICAgICAgICBAcHJvcGVydHkKKyAgICAgICAgZGVmIGh5cG90KHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIChzZWxmLnggKiogMiArIHNlbGYueSAqKiAyKSAqKiAwLjUKKyAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gJ1BvaW50OiB4PSU2LjNmICB5PSU2LjNmICBoeXBvdD0lNi4zZicgJSAoc2VsZi54LCBzZWxmLnksIHNlbGYuaHlwb3QpCisKKyAgICBmb3IgcCBpbiBQb2ludCgzLCA0KSwgUG9pbnQoMTQsIDUvNy4pOgorICAgICAgICBwcmludCBwCisKKyAgICBjbGFzcyBQb2ludChuYW1lZHR1cGxlKCdQb2ludCcsICd4IHknKSk6CisgICAgICAgICdQb2ludCBjbGFzcyB3aXRoIG9wdGltaXplZCBfbWFrZSgpIGFuZCBfcmVwbGFjZSgpIHdpdGhvdXQgZXJyb3ItY2hlY2tpbmcnCisgICAgICAgIF9fc2xvdHNfXyA9ICgpCisgICAgICAgIF9tYWtlID0gY2xhc3NtZXRob2QodHVwbGUuX19uZXdfXykKKyAgICAgICAgZGVmIF9yZXBsYWNlKHNlbGYsIF9tYXA9bWFwLCAqKmt3ZHMpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21ha2UoX21hcChrd2RzLmdldCwgKCd4JywgJ3knKSwgc2VsZikpCisKKyAgICBwcmludCBQb2ludCgxMSwgMjIpLl9yZXBsYWNlKHg9MTAwKQorCisgICAgUG9pbnQzRCA9IG5hbWVkdHVwbGUoJ1BvaW50M0QnLCBQb2ludC5fZmllbGRzICsgKCd6JywpKQorICAgIHByaW50IFBvaW50M0QuX19kb2NfXworCisgICAgaW1wb3J0IGRvY3Rlc3QKKyAgICBUZXN0UmVzdWx0cyA9IG5hbWVkdHVwbGUoJ1Rlc3RSZXN1bHRzJywgJ2ZhaWxlZCBhdHRlbXB0ZWQnKQorICAgIHByaW50IFRlc3RSZXN1bHRzKCpkb2N0ZXN0LnRlc3Rtb2QoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29sbGVjdGlvbnMucHljIGIvbGliL3B5dGhvbjIuNy9jb2xsZWN0aW9ucy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzYWVjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29sbGVjdGlvbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29sbGVjdGlvbnMucHlvIGIvbGliL3B5dGhvbjIuNy9jb2xsZWN0aW9ucy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1OTk0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29sbGVjdGlvbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29sb3JzeXMucHkgYi9saWIvcHl0aG9uMi43L2NvbG9yc3lzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YzBjZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbG9yc3lzLnB5CkBAIC0wLDAgKzEsMTU2IEBACisiIiJDb252ZXJzaW9uIGZ1bmN0aW9ucyBiZXR3ZWVuIFJHQiBhbmQgb3RoZXIgY29sb3Igc3lzdGVtcy4KKworVGhpcyBtb2R1bGVzIHByb3ZpZGVzIHR3byBmdW5jdGlvbnMgZm9yIGVhY2ggY29sb3Igc3lzdGVtIEFCQzoKKworICByZ2JfdG9fYWJjKHIsIGcsIGIpIC0tPiBhLCBiLCBjCisgIGFiY190b19yZ2IoYSwgYiwgYykgLS0+IHIsIGcsIGIKKworQWxsIGlucHV0cyBhbmQgb3V0cHV0cyBhcmUgdHJpcGxlcyBvZiBmbG9hdHMgaW4gdGhlIHJhbmdlIFswLjAuLi4xLjBdCisod2l0aCB0aGUgZXhjZXB0aW9uIG9mIEkgYW5kIFEsIHdoaWNoIGNvdmVycyBhIHNsaWdodGx5IGxhcmdlciByYW5nZSkuCitJbnB1dHMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UgbWF5IGNhdXNlIGV4Y2VwdGlvbnMgb3IgaW52YWxpZCBvdXRwdXRzLgorCitTdXBwb3J0ZWQgY29sb3Igc3lzdGVtczoKK1JHQjogUmVkLCBHcmVlbiwgQmx1ZSBjb21wb25lbnRzCitZSVE6IEx1bWluYW5jZSwgQ2hyb21pbmFuY2UgKHVzZWQgYnkgY29tcG9zaXRlIHZpZGVvIHNpZ25hbHMpCitITFM6IEh1ZSwgTHVtaW5hbmNlLCBTYXR1cmF0aW9uCitIU1Y6IEh1ZSwgU2F0dXJhdGlvbiwgVmFsdWUKKyIiIgorCisjIFJlZmVyZW5jZXM6CisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWUlRCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSExTX2NvbG9yX3NwYWNlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSFNWX2NvbG9yX3NwYWNlCisKK19fYWxsX18gPSBbInJnYl90b195aXEiLCJ5aXFfdG9fcmdiIiwicmdiX3RvX2hscyIsImhsc190b19yZ2IiLAorICAgICAgICAgICAicmdiX3RvX2hzdiIsImhzdl90b19yZ2IiXQorCisjIFNvbWUgZmxvYXRpbmcgcG9pbnQgY29uc3RhbnRzCisKK09ORV9USElSRCA9IDEuMC8zLjAKK09ORV9TSVhUSCA9IDEuMC82LjAKK1RXT19USElSRCA9IDIuMC8zLjAKKworIyBZSVE6IHVzZWQgYnkgY29tcG9zaXRlIHZpZGVvIHNpZ25hbHMgKGxpbmVhciBjb21iaW5hdGlvbnMgb2YgUkdCKQorIyBZOiBwZXJjZWl2ZWQgZ3JleSBsZXZlbCAoMC4wID09IGJsYWNrLCAxLjAgPT0gd2hpdGUpCisjIEksIFE6IGNvbG9yIGNvbXBvbmVudHMKKworZGVmIHJnYl90b195aXEociwgZywgYik6CisgICAgeSA9IDAuMzAqciArIDAuNTkqZyArIDAuMTEqYgorICAgIGkgPSAwLjYwKnIgLSAwLjI4KmcgLSAwLjMyKmIKKyAgICBxID0gMC4yMSpyIC0gMC41MipnICsgMC4zMSpiCisgICAgcmV0dXJuICh5LCBpLCBxKQorCitkZWYgeWlxX3RvX3JnYih5LCBpLCBxKToKKyAgICByID0geSArIDAuOTQ4MjYyKmkgKyAwLjYyNDAxMypxCisgICAgZyA9IHkgLSAwLjI3NjA2NippIC0gMC42Mzk4MTAqcQorICAgIGIgPSB5IC0gMS4xMDU0NTAqaSArIDEuNzI5ODYwKnEKKyAgICBpZiByIDwgMC4wOgorICAgICAgICByID0gMC4wCisgICAgaWYgZyA8IDAuMDoKKyAgICAgICAgZyA9IDAuMAorICAgIGlmIGIgPCAwLjA6CisgICAgICAgIGIgPSAwLjAKKyAgICBpZiByID4gMS4wOgorICAgICAgICByID0gMS4wCisgICAgaWYgZyA+IDEuMDoKKyAgICAgICAgZyA9IDEuMAorICAgIGlmIGIgPiAxLjA6CisgICAgICAgIGIgPSAxLjAKKyAgICByZXR1cm4gKHIsIGcsIGIpCisKKworIyBITFM6IEh1ZSwgTHVtaW5hbmNlLCBTYXR1cmF0aW9uCisjIEg6IHBvc2l0aW9uIGluIHRoZSBzcGVjdHJ1bQorIyBMOiBjb2xvciBsaWdodG5lc3MKKyMgUzogY29sb3Igc2F0dXJhdGlvbgorCitkZWYgcmdiX3RvX2hscyhyLCBnLCBiKToKKyAgICBtYXhjID0gbWF4KHIsIGcsIGIpCisgICAgbWluYyA9IG1pbihyLCBnLCBiKQorICAgICMgWFhYIENhbiBvcHRpbWl6ZSAobWF4YyttaW5jKSBhbmQgKG1heGMtbWluYykKKyAgICBsID0gKG1pbmMrbWF4YykvMi4wCisgICAgaWYgbWluYyA9PSBtYXhjOgorICAgICAgICByZXR1cm4gMC4wLCBsLCAwLjAKKyAgICBpZiBsIDw9IDAuNToKKyAgICAgICAgcyA9IChtYXhjLW1pbmMpIC8gKG1heGMrbWluYykKKyAgICBlbHNlOgorICAgICAgICBzID0gKG1heGMtbWluYykgLyAoMi4wLW1heGMtbWluYykKKyAgICByYyA9IChtYXhjLXIpIC8gKG1heGMtbWluYykKKyAgICBnYyA9IChtYXhjLWcpIC8gKG1heGMtbWluYykKKyAgICBiYyA9IChtYXhjLWIpIC8gKG1heGMtbWluYykKKyAgICBpZiByID09IG1heGM6CisgICAgICAgIGggPSBiYy1nYworICAgIGVsaWYgZyA9PSBtYXhjOgorICAgICAgICBoID0gMi4wK3JjLWJjCisgICAgZWxzZToKKyAgICAgICAgaCA9IDQuMCtnYy1yYworICAgIGggPSAoaC82LjApICUgMS4wCisgICAgcmV0dXJuIGgsIGwsIHMKKworZGVmIGhsc190b19yZ2IoaCwgbCwgcyk6CisgICAgaWYgcyA9PSAwLjA6CisgICAgICAgIHJldHVybiBsLCBsLCBsCisgICAgaWYgbCA8PSAwLjU6CisgICAgICAgIG0yID0gbCAqICgxLjArcykKKyAgICBlbHNlOgorICAgICAgICBtMiA9IGwrcy0obCpzKQorICAgIG0xID0gMi4wKmwgLSBtMgorICAgIHJldHVybiAoX3YobTEsIG0yLCBoK09ORV9USElSRCksIF92KG0xLCBtMiwgaCksIF92KG0xLCBtMiwgaC1PTkVfVEhJUkQpKQorCitkZWYgX3YobTEsIG0yLCBodWUpOgorICAgIGh1ZSA9IGh1ZSAlIDEuMAorICAgIGlmIGh1ZSA8IE9ORV9TSVhUSDoKKyAgICAgICAgcmV0dXJuIG0xICsgKG0yLW0xKSpodWUqNi4wCisgICAgaWYgaHVlIDwgMC41OgorICAgICAgICByZXR1cm4gbTIKKyAgICBpZiBodWUgPCBUV09fVEhJUkQ6CisgICAgICAgIHJldHVybiBtMSArIChtMi1tMSkqKFRXT19USElSRC1odWUpKjYuMAorICAgIHJldHVybiBtMQorCisKKyMgSFNWOiBIdWUsIFNhdHVyYXRpb24sIFZhbHVlCisjIEg6IHBvc2l0aW9uIGluIHRoZSBzcGVjdHJ1bQorIyBTOiBjb2xvciBzYXR1cmF0aW9uICgicHVyaXR5IikKKyMgVjogY29sb3IgYnJpZ2h0bmVzcworCitkZWYgcmdiX3RvX2hzdihyLCBnLCBiKToKKyAgICBtYXhjID0gbWF4KHIsIGcsIGIpCisgICAgbWluYyA9IG1pbihyLCBnLCBiKQorICAgIHYgPSBtYXhjCisgICAgaWYgbWluYyA9PSBtYXhjOgorICAgICAgICByZXR1cm4gMC4wLCAwLjAsIHYKKyAgICBzID0gKG1heGMtbWluYykgLyBtYXhjCisgICAgcmMgPSAobWF4Yy1yKSAvIChtYXhjLW1pbmMpCisgICAgZ2MgPSAobWF4Yy1nKSAvIChtYXhjLW1pbmMpCisgICAgYmMgPSAobWF4Yy1iKSAvIChtYXhjLW1pbmMpCisgICAgaWYgciA9PSBtYXhjOgorICAgICAgICBoID0gYmMtZ2MKKyAgICBlbGlmIGcgPT0gbWF4YzoKKyAgICAgICAgaCA9IDIuMCtyYy1iYworICAgIGVsc2U6CisgICAgICAgIGggPSA0LjArZ2MtcmMKKyAgICBoID0gKGgvNi4wKSAlIDEuMAorICAgIHJldHVybiBoLCBzLCB2CisKK2RlZiBoc3ZfdG9fcmdiKGgsIHMsIHYpOgorICAgIGlmIHMgPT0gMC4wOgorICAgICAgICByZXR1cm4gdiwgdiwgdgorICAgIGkgPSBpbnQoaCo2LjApICMgWFhYIGFzc3VtZSBpbnQoKSB0cnVuY2F0ZXMhCisgICAgZiA9IChoKjYuMCkgLSBpCisgICAgcCA9IHYqKDEuMCAtIHMpCisgICAgcSA9IHYqKDEuMCAtIHMqZikKKyAgICB0ID0gdiooMS4wIC0gcyooMS4wLWYpKQorICAgIGkgPSBpJTYKKyAgICBpZiBpID09IDA6CisgICAgICAgIHJldHVybiB2LCB0LCBwCisgICAgaWYgaSA9PSAxOgorICAgICAgICByZXR1cm4gcSwgdiwgcAorICAgIGlmIGkgPT0gMjoKKyAgICAgICAgcmV0dXJuIHAsIHYsIHQKKyAgICBpZiBpID09IDM6CisgICAgICAgIHJldHVybiBwLCBxLCB2CisgICAgaWYgaSA9PSA0OgorICAgICAgICByZXR1cm4gdCwgcCwgdgorICAgIGlmIGkgPT0gNToKKyAgICAgICAgcmV0dXJuIHYsIHAsIHEKKyAgICAjIENhbm5vdCBnZXQgaGVyZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2xvcnN5cy5weWMgYi9saWIvcHl0aG9uMi43L2NvbG9yc3lzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWY4YzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb2xvcnN5cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2xvcnN5cy5weW8gYi9saWIvcHl0aG9uMi43L2NvbG9yc3lzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWY4YzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb2xvcnN5cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21tYW5kcy5weSBiL2xpYi9weXRob24yLjcvY29tbWFuZHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlOGRkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tbWFuZHMucHkKQEAgLTAsMCArMSw5MCBAQAorIiIiRXhlY3V0ZSBzaGVsbCBjb21tYW5kcyB2aWEgb3MucG9wZW4oKSBhbmQgcmV0dXJuIHN0YXR1cywgb3V0cHV0LgorCitJbnRlcmZhY2Ugc3VtbWFyeToKKworICAgICAgIGltcG9ydCBjb21tYW5kcworCisgICAgICAgb3V0dGV4dCA9IGNvbW1hbmRzLmdldG91dHB1dChjbWQpCisgICAgICAgKGV4aXRzdGF0dXMsIG91dHRleHQpID0gY29tbWFuZHMuZ2V0c3RhdHVzb3V0cHV0KGNtZCkKKyAgICAgICBvdXR0ZXh0ID0gY29tbWFuZHMuZ2V0c3RhdHVzKGZpbGUpICAjIHJldHVybnMgb3V0cHV0IG9mICJscyAtbGQgZmlsZSIKKworQSB0cmFpbGluZyBuZXdsaW5lIGlzIHJlbW92ZWQgZnJvbSB0aGUgb3V0cHV0IHN0cmluZy4KKworRW5jYXBzdWxhdGVzIHRoZSBiYXNpYyBvcGVyYXRpb246CisKKyAgICAgIHBpcGUgPSBvcy5wb3BlbigneyAnICsgY21kICsgJzsgfSAyPiYxJywgJ3InKQorICAgICAgdGV4dCA9IHBpcGUucmVhZCgpCisgICAgICBzdHMgPSBwaXBlLmNsb3NlKCkKKworIFtOb3RlOiAgaXQgd291bGQgYmUgbmljZSB0byBhZGQgZnVuY3Rpb25zIHRvIGludGVycHJldCB0aGUgZXhpdCBzdGF0dXMuXQorIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSBjb21tYW5kcyBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wOyAiCisgICAgICAgICAidXNlIHRoZSBzdWJwcm9jZXNzIG1vZHVsZSBpbnN0ZWFkIiwgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKK19fYWxsX18gPSBbImdldHN0YXR1c291dHB1dCIsImdldG91dHB1dCIsImdldHN0YXR1cyJdCisKKyMgTW9kdWxlICdjb21tYW5kcycKKyMKKyMgVmFyaW91cyB0b29scyBmb3IgZXhlY3V0aW5nIGNvbW1hbmRzIGFuZCBsb29raW5nIGF0IHRoZWlyIG91dHB1dCBhbmQgc3RhdHVzLgorIworIyBOQiBUaGlzIG9ubHkgd29ya3MgKGFuZCBpcyBvbmx5IHJlbGV2YW50KSBmb3IgVU5JWC4KKworCisjIEdldCAnbHMgLWwnIHN0YXR1cyBmb3IgYW4gb2JqZWN0IGludG8gYSBzdHJpbmcKKyMKK2RlZiBnZXRzdGF0dXMoZmlsZSk6CisgICAgIiIiUmV0dXJuIG91dHB1dCBvZiAibHMgLWxkIDxmaWxlPiIgaW4gYSBzdHJpbmcuIiIiCisgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgd2FybmluZ3Mud2FybigiY29tbWFuZHMuZ2V0c3RhdHVzKCkgaXMgZGVwcmVjYXRlZCIsIERlcHJlY2F0aW9uV2FybmluZywgMikKKyAgICByZXR1cm4gZ2V0b3V0cHV0KCdscyAtbGQnICsgbWthcmcoZmlsZSkpCisKKworIyBHZXQgdGhlIG91dHB1dCBmcm9tIGEgc2hlbGwgY29tbWFuZCBpbnRvIGEgc3RyaW5nLgorIyBUaGUgZXhpdCBzdGF0dXMgaXMgaWdub3JlZDsgYSB0cmFpbGluZyBuZXdsaW5lIGlzIHN0cmlwcGVkLgorIyBBc3N1bWUgdGhlIGNvbW1hbmQgd2lsbCB3b3JrIHdpdGggJ3sgLi4uIDsgfSAyPiYxJyBhcm91bmQgaXQuLgorIworZGVmIGdldG91dHB1dChjbWQpOgorICAgICIiIlJldHVybiBvdXRwdXQgKHN0ZG91dCBvciBzdGRlcnIpIG9mIGV4ZWN1dGluZyBjbWQgaW4gYSBzaGVsbC4iIiIKKyAgICByZXR1cm4gZ2V0c3RhdHVzb3V0cHV0KGNtZClbMV0KKworCisjIERpdHRvIGJ1dCBwcmVzZXJ2aW5nIHRoZSBleGl0IHN0YXR1cy4KKyMgUmV0dXJucyBhIHBhaXIgKHN0cywgb3V0cHV0KQorIworZGVmIGdldHN0YXR1c291dHB1dChjbWQpOgorICAgICIiIlJldHVybiAoc3RhdHVzLCBvdXRwdXQpIG9mIGV4ZWN1dGluZyBjbWQgaW4gYSBzaGVsbC4iIiIKKyAgICBpbXBvcnQgb3MKKyAgICBwaXBlID0gb3MucG9wZW4oJ3sgJyArIGNtZCArICc7IH0gMj4mMScsICdyJykKKyAgICB0ZXh0ID0gcGlwZS5yZWFkKCkKKyAgICBzdHMgPSBwaXBlLmNsb3NlKCkKKyAgICBpZiBzdHMgaXMgTm9uZTogc3RzID0gMAorICAgIGlmIHRleHRbLTE6XSA9PSAnXG4nOiB0ZXh0ID0gdGV4dFs6LTFdCisgICAgcmV0dXJuIHN0cywgdGV4dAorCisKKyMgTWFrZSBjb21tYW5kIGFyZ3VtZW50IGZyb20gZGlyZWN0b3J5IGFuZCBwYXRobmFtZSAocHJlZml4IHNwYWNlLCBhZGQgcXVvdGVzKS4KKyMKK2RlZiBtazJhcmcoaGVhZCwgeCk6CisgICAgaW1wb3J0IG9zCisgICAgcmV0dXJuIG1rYXJnKG9zLnBhdGguam9pbihoZWFkLCB4KSkKKworCisjIE1ha2UgYSBzaGVsbCBjb21tYW5kIGFyZ3VtZW50IGZyb20gYSBzdHJpbmcuCisjIFJldHVybiBhIHN0cmluZyBiZWdpbm5pbmcgd2l0aCBhIHNwYWNlIGZvbGxvd2VkIGJ5IGEgc2hlbGwtcXVvdGVkCisjIHZlcnNpb24gb2YgdGhlIGFyZ3VtZW50LgorIyBUd28gc3RyYXRlZ2llczogZW5jbG9zZSBpbiBzaW5nbGUgcXVvdGVzIGlmIGl0IGNvbnRhaW5zIG5vbmU7CisjIG90aGVyd2lzZSwgZW5jbG9zZSBpbiBkb3VibGUgcXVvdGVzIGFuZCBwcmVmaXggcXVvdGFibGUgY2hhcmFjdGVycworIyB3aXRoIGJhY2tzbGFzaC4KKyMKK2RlZiBta2FyZyh4KToKKyAgICBpZiAnXCcnIG5vdCBpbiB4OgorICAgICAgICByZXR1cm4gJyBcJycgKyB4ICsgJ1wnJworICAgIHMgPSAnICInCisgICAgZm9yIGMgaW4geDoKKyAgICAgICAgaWYgYyBpbiAnXFwkImAnOgorICAgICAgICAgICAgcyA9IHMgKyAnXFwnCisgICAgICAgIHMgPSBzICsgYworICAgIHMgPSBzICsgJyInCisgICAgcmV0dXJuIHMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tbWFuZHMucHljIGIvbGliL3B5dGhvbjIuNy9jb21tYW5kcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhYWVjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tbWFuZHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tbWFuZHMucHlvIGIvbGliL3B5dGhvbjIuNy9jb21tYW5kcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhYWVjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tbWFuZHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZWFsbC5weSBiL2xpYi9weXRob24yLjcvY29tcGlsZWFsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWJjYjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlYWxsLnB5CkBAIC0wLDAgKzEsMjI5IEBACisiIiJNb2R1bGUvc2NyaXB0IHRvIGJ5dGUtY29tcGlsZSBhbGwgLnB5IGZpbGVzIHRvIC5weWMgKG9yIC5weW8pIGZpbGVzLgorCitXaGVuIGNhbGxlZCBhcyBhIHNjcmlwdCB3aXRoIGFyZ3VtZW50cywgdGhpcyBjb21waWxlcyB0aGUgZGlyZWN0b3JpZXMKK2dpdmVuIGFzIGFyZ3VtZW50cyByZWN1cnNpdmVseTsgdGhlIC1sIG9wdGlvbiBwcmV2ZW50cyBpdCBmcm9tCityZWN1cnNpbmcgaW50byBkaXJlY3Rvcmllcy4KKworV2l0aG91dCBhcmd1bWVudHMsIGlmIGNvbXBpbGVzIGFsbCBtb2R1bGVzIG9uIHN5cy5wYXRoLCB3aXRob3V0CityZWN1cnNpbmcgaW50byBzdWJkaXJlY3Rvcmllcy4gIChFdmVuIHRob3VnaCBpdCBzaG91bGQgZG8gc28gZm9yCitwYWNrYWdlcyAtLSBmb3Igbm93LCB5b3UnbGwgaGF2ZSB0byBkZWFsIHdpdGggcGFja2FnZXMgc2VwYXJhdGVseS4pCisKK1NlZSBtb2R1bGUgcHlfY29tcGlsZSBmb3IgZGV0YWlscyBvZiB0aGUgYWN0dWFsIGJ5dGUtY29tcGlsYXRpb24uCisiIiIKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHB5X2NvbXBpbGUKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBpbXAKKworX19hbGxfXyA9IFsiY29tcGlsZV9kaXIiLCJjb21waWxlX2ZpbGUiLCJjb21waWxlX3BhdGgiXQorCitkZWYgY29tcGlsZV9kaXIoZGlyLCBtYXhsZXZlbHM9MTAsIGRkaXI9Tm9uZSwKKyAgICAgICAgICAgICAgICBmb3JjZT0wLCByeD1Ob25lLCBxdWlldD0wKToKKyAgICAiIiJCeXRlLWNvbXBpbGUgYWxsIG1vZHVsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSB0cmVlLgorCisgICAgQXJndW1lbnRzIChvbmx5IGRpciBpcyByZXF1aXJlZCk6CisKKyAgICBkaXI6ICAgICAgIHRoZSBkaXJlY3RvcnkgdG8gYnl0ZS1jb21waWxlCisgICAgbWF4bGV2ZWxzOiBtYXhpbXVtIHJlY3Vyc2lvbiBsZXZlbCAoZGVmYXVsdCAxMCkKKyAgICBkZGlyOiAgICAgIHRoZSBkaXJlY3RvcnkgdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byB0aGUgcGF0aCB0byB0aGUKKyAgICAgICAgICAgICAgIGZpbGUgYXMgaXQgaXMgY29tcGlsZWQgaW50byBlYWNoIGJ5dGUtY29kZSBmaWxlLgorICAgIGZvcmNlOiAgICAgaWYgMSwgZm9yY2UgY29tcGlsYXRpb24sIGV2ZW4gaWYgdGltZXN0YW1wcyBhcmUgdXAtdG8tZGF0ZQorICAgIHF1aWV0OiAgICAgaWYgMSwgYmUgcXVpZXQgZHVyaW5nIGNvbXBpbGF0aW9uCisgICAgIiIiCisgICAgaWYgbm90IHF1aWV0OgorICAgICAgICBwcmludCAnTGlzdGluZycsIGRpciwgJy4uLicKKyAgICB0cnk6CisgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXIpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICBwcmludCAiQ2FuJ3QgbGlzdCIsIGRpcgorICAgICAgICBuYW1lcyA9IFtdCisgICAgbmFtZXMuc29ydCgpCisgICAgc3VjY2VzcyA9IDEKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyLCBuYW1lKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIiBhbmQgc3lzLnZlcnNpb24uZmluZCgiR0NDIikgPj0gMDoKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gZnVsbG5hbWUucmVwbGFjZSgnXFwnLCcvJykKKyAgICAgICAgaWYgZGRpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRmaWxlID0gb3MucGF0aC5qb2luKGRkaXIsIG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZmlsZSA9IE5vbmUKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZnVsbG5hbWUpOgorICAgICAgICAgICAgaWYgbm90IGNvbXBpbGVfZmlsZShmdWxsbmFtZSwgZGRpciwgZm9yY2UsIHJ4LCBxdWlldCk6CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IDAKKyAgICAgICAgZWxpZiBtYXhsZXZlbHMgPiAwIGFuZCBcCisgICAgICAgICAgICAgbmFtZSAhPSBvcy5jdXJkaXIgYW5kIG5hbWUgIT0gb3MucGFyZGlyIGFuZCBcCisgICAgICAgICAgICAgb3MucGF0aC5pc2RpcihmdWxsbmFtZSkgYW5kIFwKKyAgICAgICAgICAgICBub3Qgb3MucGF0aC5pc2xpbmsoZnVsbG5hbWUpOgorICAgICAgICAgICAgaWYgbm90IGNvbXBpbGVfZGlyKGZ1bGxuYW1lLCBtYXhsZXZlbHMgLSAxLCBkZmlsZSwgZm9yY2UsIHJ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0KToKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgIHJldHVybiBzdWNjZXNzCisKK2RlZiBjb21waWxlX2ZpbGUoZnVsbG5hbWUsIGRkaXI9Tm9uZSwgZm9yY2U9MCwgcng9Tm9uZSwgcXVpZXQ9MCk6CisgICAgIiIiQnl0ZS1jb21waWxlIG9uZSBmaWxlLgorCisgICAgQXJndW1lbnRzIChvbmx5IGZ1bGxuYW1lIGlzIHJlcXVpcmVkKToKKworICAgIGZ1bGxuYW1lOiAgdGhlIGZpbGUgdG8gYnl0ZS1jb21waWxlCisgICAgZGRpcjogICAgICBpZiBnaXZlbiwgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbXBpbGVkIGluIHRvIHRoZQorICAgICAgICAgICAgICAgYnl0ZS1jb2RlIGZpbGUuCisgICAgZm9yY2U6ICAgICBpZiAxLCBmb3JjZSBjb21waWxhdGlvbiwgZXZlbiBpZiB0aW1lc3RhbXBzIGFyZSB1cC10by1kYXRlCisgICAgcXVpZXQ6ICAgICBpZiAxLCBiZSBxdWlldCBkdXJpbmcgY29tcGlsYXRpb24KKyAgICAiIiIKKyAgICBzdWNjZXNzID0gMQorICAgIG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZ1bGxuYW1lKQorICAgIGlmIGRkaXIgaXMgbm90IE5vbmU6CisgICAgICAgIGRmaWxlID0gb3MucGF0aC5qb2luKGRkaXIsIG5hbWUpCisgICAgZWxzZToKKyAgICAgICAgZGZpbGUgPSBOb25lCisgICAgaWYgcnggaXMgbm90IE5vbmU6CisgICAgICAgIG1vID0gcnguc2VhcmNoKGZ1bGxuYW1lKQorICAgICAgICBpZiBtbzoKKyAgICAgICAgICAgIHJldHVybiBzdWNjZXNzCisgICAgaWYgb3MucGF0aC5pc2ZpbGUoZnVsbG5hbWUpOgorICAgICAgICBoZWFkLCB0YWlsID0gbmFtZVs6LTNdLCBuYW1lWy0zOl0KKyAgICAgICAgaWYgdGFpbCA9PSAnLnB5JzoKKyAgICAgICAgICAgIGlmIG5vdCBmb3JjZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG10aW1lID0gaW50KG9zLnN0YXQoZnVsbG5hbWUpLnN0X210aW1lKQorICAgICAgICAgICAgICAgICAgICBleHBlY3QgPSBzdHJ1Y3QucGFjaygnPDRzbCcsIGltcC5nZXRfbWFnaWMoKSwgbXRpbWUpCisgICAgICAgICAgICAgICAgICAgIGNmaWxlID0gZnVsbG5hbWUgKyAoX19kZWJ1Z19fIGFuZCAnYycgb3IgJ28nKQorICAgICAgICAgICAgICAgICAgICB3aXRoIG9wZW4oY2ZpbGUsICdyYicpIGFzIGNoYW5kbGU6CisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSBjaGFuZGxlLnJlYWQoOCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZXhwZWN0ID09IGFjdHVhbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWNjZXNzCisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIG5vdCBxdWlldDoKKyAgICAgICAgICAgICAgICBwcmludCAnQ29tcGlsaW5nJywgZnVsbG5hbWUsICcuLi4nCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb2sgPSBweV9jb21waWxlLmNvbXBpbGUoZnVsbG5hbWUsIE5vbmUsIGRmaWxlLCBUcnVlKQorICAgICAgICAgICAgZXhjZXB0IHB5X2NvbXBpbGUuUHlDb21waWxlRXJyb3IsZXJyOgorICAgICAgICAgICAgICAgIGlmIHF1aWV0OgorICAgICAgICAgICAgICAgICAgICBwcmludCAnQ29tcGlsaW5nJywgZnVsbG5hbWUsICcuLi4nCisgICAgICAgICAgICAgICAgcHJpbnQgZXJyLm1zZworICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgICAgICBwcmludCAiU29ycnkiLCBlCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgb2sgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IDAKKyAgICByZXR1cm4gc3VjY2VzcworCitkZWYgY29tcGlsZV9wYXRoKHNraXBfY3VyZGlyPTEsIG1heGxldmVscz0wLCBmb3JjZT0wLCBxdWlldD0wKToKKyAgICAiIiJCeXRlLWNvbXBpbGUgYWxsIG1vZHVsZSBvbiBzeXMucGF0aC4KKworICAgIEFyZ3VtZW50cyAoYWxsIG9wdGlvbmFsKToKKworICAgIHNraXBfY3VyZGlyOiBpZiB0cnVlLCBza2lwIGN1cnJlbnQgZGlyZWN0b3J5IChkZWZhdWx0IHRydWUpCisgICAgbWF4bGV2ZWxzOiAgIG1heCByZWN1cnNpb24gbGV2ZWwgKGRlZmF1bHQgMCkKKyAgICBmb3JjZTogYXMgZm9yIGNvbXBpbGVfZGlyKCkgKGRlZmF1bHQgMCkKKyAgICBxdWlldDogYXMgZm9yIGNvbXBpbGVfZGlyKCkgKGRlZmF1bHQgMCkKKyAgICAiIiIKKyAgICBzdWNjZXNzID0gMQorICAgIGZvciBkaXIgaW4gc3lzLnBhdGg6CisgICAgICAgIGlmIChub3QgZGlyIG9yIGRpciA9PSBvcy5jdXJkaXIpIGFuZCBza2lwX2N1cmRpcjoKKyAgICAgICAgICAgIHByaW50ICdTa2lwcGluZyBjdXJyZW50IGRpcmVjdG9yeScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBjb21waWxlX2RpcihkaXIsIG1heGxldmVscywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZSwgcXVpZXQ9cXVpZXQpCisgICAgcmV0dXJuIHN1Y2Nlc3MKKworZGVmIGV4cGFuZF9hcmdzKGFyZ3MsIGZsaXN0KToKKyAgICAiIiJyZWFkIG5hbWVzIGluIGZsaXN0IGFuZCBhcHBlbmQgdG8gYXJncyIiIgorICAgIGV4cGFuZGVkID0gYXJnc1s6XQorICAgIGlmIGZsaXN0OgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBmbGlzdCA9PSAnLSc6CisgICAgICAgICAgICAgICAgZmQgPSBzeXMuc3RkaW4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmQgPSBvcGVuKGZsaXN0KQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBsaW5lID0gZmQucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4cGFuZGVkLmFwcGVuZChsaW5lWzotMV0pCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcHJpbnQgIkVycm9yIHJlYWRpbmcgZmlsZSBsaXN0ICVzIiAlIGZsaXN0CisgICAgICAgICAgICByYWlzZQorICAgIHJldHVybiBleHBhbmRlZAorCitkZWYgbWFpbigpOgorICAgICIiIlNjcmlwdCBtYWluIHByb2dyYW0uIiIiCisgICAgaW1wb3J0IGdldG9wdAorICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnbGZxZDp4Omk6JykKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgIHByaW50IG1zZworICAgICAgICBwcmludCAidXNhZ2U6IHB5dGhvbiBjb21waWxlYWxsLnB5IFstbF0gWy1mXSBbLXFdIFstZCBkZXN0ZGlyXSAiIFwKKyAgICAgICAgICAgICAgIlsteCByZWdleHBdIFstaSBsaXN0XSBbZGlyZWN0b3J5fGZpbGUgLi4uXSIKKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgImFyZ3VtZW50czogemVybyBvciBtb3JlIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyB0byBjb21waWxlOyAiIFwKKyAgICAgICAgICAgICAgImlmIG5vIGFyZ3VtZW50cyBnaXZlbiwgIgorICAgICAgICBwcmludCAiICAgICAgICAgICBkZWZhdWx0cyB0byB0aGUgZXF1aXZhbGVudCBvZiAtbCBzeXMucGF0aCIKKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgIm9wdGlvbnM6IgorICAgICAgICBwcmludCAiLWw6IGRvbid0IHJlY3Vyc2UgaW50byBzdWJkaXJlY3RvcmllcyIKKyAgICAgICAgcHJpbnQgIi1mOiBmb3JjZSByZWJ1aWxkIGV2ZW4gaWYgdGltZXN0YW1wcyBhcmUgdXAtdG8tZGF0ZSIKKyAgICAgICAgcHJpbnQgIi1xOiBvdXRwdXQgb25seSBlcnJvciBtZXNzYWdlcyIKKyAgICAgICAgcHJpbnQgIi1kIGRlc3RkaXI6IGRpcmVjdG9yeSB0byBwcmVwZW5kIHRvIGZpbGUgcGF0aHMgZm9yIHVzZSBpbiAiIFwKKyAgICAgICAgICAgICAgImNvbXBpbGUtdGltZSB0cmFjZWJhY2tzIGFuZCBpbiIKKyAgICAgICAgcHJpbnQgIiAgICAgICAgICAgIHJ1bnRpbWUgdHJhY2ViYWNrcyBpbiBjYXNlcyB3aGVyZSB0aGUgc291cmNlICIgXAorICAgICAgICAgICAgICAiZmlsZSBpcyB1bmF2YWlsYWJsZSIKKyAgICAgICAgcHJpbnQgIi14IHJlZ2V4cDogc2tpcCBmaWxlcyBtYXRjaGluZyB0aGUgcmVndWxhciBleHByZXNzaW9uIHJlZ2V4cDsgIiBcCisgICAgICAgICAgICAgICJ0aGUgcmVnZXhwIGlzIHNlYXJjaGVkIGZvciIKKyAgICAgICAgcHJpbnQgIiAgICAgICAgICAgaW4gdGhlIGZ1bGwgcGF0aCBvZiBlYWNoIGZpbGUgY29uc2lkZXJlZCBmb3IgIiBcCisgICAgICAgICAgICAgICJjb21waWxhdGlvbiIKKyAgICAgICAgcHJpbnQgIi1pIGZpbGU6IGFkZCBhbGwgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gZmlsZSB0byAiIFwKKyAgICAgICAgICAgICAgInRoZSBsaXN0IGNvbnNpZGVyZWQgZm9yIgorICAgICAgICBwcmludCAnICAgICAgICAgY29tcGlsYXRpb247IGlmICItIiwgbmFtZXMgYXJlIHJlYWQgZnJvbSBzdGRpbicKKworICAgICAgICBzeXMuZXhpdCgyKQorICAgIG1heGxldmVscyA9IDEwCisgICAgZGRpciA9IE5vbmUKKyAgICBmb3JjZSA9IDAKKyAgICBxdWlldCA9IDAKKyAgICByeCA9IE5vbmUKKyAgICBmbGlzdCA9IE5vbmUKKyAgICBmb3IgbywgYSBpbiBvcHRzOgorICAgICAgICBpZiBvID09ICctbCc6IG1heGxldmVscyA9IDAKKyAgICAgICAgaWYgbyA9PSAnLWQnOiBkZGlyID0gYQorICAgICAgICBpZiBvID09ICctZic6IGZvcmNlID0gMQorICAgICAgICBpZiBvID09ICctcSc6IHF1aWV0ID0gMQorICAgICAgICBpZiBvID09ICcteCc6CisgICAgICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgICAgIHJ4ID0gcmUuY29tcGlsZShhKQorICAgICAgICBpZiBvID09ICctaSc6IGZsaXN0ID0gYQorICAgIGlmIGRkaXI6CisgICAgICAgIGlmIGxlbihhcmdzKSAhPSAxIGFuZCBub3Qgb3MucGF0aC5pc2RpcihhcmdzWzBdKToKKyAgICAgICAgICAgIHByaW50ICItZCBkZXN0ZGlyIHJlcXVpcmUgZXhhY3RseSBvbmUgZGlyZWN0b3J5IGFyZ3VtZW50IgorICAgICAgICAgICAgc3lzLmV4aXQoMikKKyAgICBzdWNjZXNzID0gMQorICAgIHRyeToKKyAgICAgICAgaWYgYXJncyBvciBmbGlzdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBmbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgYXJncyA9IGV4cGFuZF9hcmdzKGFyZ3MsIGZsaXN0KQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IDAKKyAgICAgICAgICAgIGlmIHN1Y2Nlc3M6CisgICAgICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGFyZyk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY29tcGlsZV9kaXIoYXJnLCBtYXhsZXZlbHMsIGRkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2UsIHJ4LCBxdWlldCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IDAKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjb21waWxlX2ZpbGUoYXJnLCBkZGlyLCBmb3JjZSwgcngsIHF1aWV0KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3VjY2VzcyA9IGNvbXBpbGVfcGF0aCgpCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICBwcmludCAiXG5baW50ZXJydXB0ZWRdIgorICAgICAgICBzdWNjZXNzID0gMAorICAgIHJldHVybiBzdWNjZXNzCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgZXhpdF9zdGF0dXMgPSBpbnQobm90IG1haW4oKSkKKyAgICBzeXMuZXhpdChleGl0X3N0YXR1cykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZWFsbC5weWMgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVhbGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmY2IwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVhbGwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZWFsbC5weW8gYi9saWIvcHl0aG9uMi43L2NvbXBpbGVhbGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmY2IwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVhbGwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNmY2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMzEgQEAKKyIiIlBhY2thZ2UgZm9yIHBhcnNpbmcgYW5kIGNvbXBpbGluZyBQeXRob24gc291cmNlIGNvZGUKKworVGhlcmUgYXJlIHNldmVyYWwgZnVuY3Rpb25zIGRlZmluZWQgYXQgdGhlIHRvcCBsZXZlbCB0aGF0IGFyZSBpbXBvcnRlZAorZnJvbSBtb2R1bGVzIGNvbnRhaW5lZCBpbiB0aGUgcGFja2FnZS4KKworcGFyc2UoYnVmLCBtb2RlPSJleGVjIikgLT4gQVNUCisgICAgQ29udmVydHMgYSBzdHJpbmcgY29udGFpbmluZyBQeXRob24gc291cmNlIGNvZGUgdG8gYW4gYWJzdHJhY3QKKyAgICBzeW50YXggdHJlZSAoQVNUKS4gIFRoZSBBU1QgaXMgZGVmaW5lZCBpbiBjb21waWxlci5hc3QuCisKK3BhcnNlRmlsZShwYXRoKSAtPiBBU1QKKyAgICBUaGUgc2FtZSBhcyBwYXJzZShvcGVuKHBhdGgpKQorCit3YWxrKGFzdCwgdmlzaXRvciwgdmVyYm9zZT1Ob25lKQorICAgIERvZXMgYSBwcmUtb3JkZXIgd2FsayBvdmVyIHRoZSBhc3QgdXNpbmcgdGhlIHZpc2l0b3IgaW5zdGFuY2UuCisgICAgU2VlIGNvbXBpbGVyLnZpc2l0b3IgZm9yIGRldGFpbHMuCisKK2NvbXBpbGUoc291cmNlLCBmaWxlbmFtZSwgbW9kZSwgZmxhZ3M9Tm9uZSwgZG9udF9pbmhlcml0PU5vbmUpCisgICAgUmV0dXJucyBhIGNvZGUgb2JqZWN0LiAgQSByZXBsYWNlbWVudCBmb3IgdGhlIGJ1aWx0aW4gY29tcGlsZSgpIGZ1bmN0aW9uLgorCitjb21waWxlRmlsZShmaWxlbmFtZSkKKyAgICBHZW5lcmF0ZXMgYSAucHljIGZpbGUgYnkgY29tcGlsaW5nIGZpbGVuYW1lLgorIiIiCisKK2ltcG9ydCB3YXJuaW5ncworCit3YXJuaW5ncy53YXJuKCJUaGUgY29tcGlsZXIgcGFja2FnZSBpcyBkZXByZWNhdGVkIGFuZCByZW1vdmVkIGluIFB5dGhvbiAzLnguIiwKKyAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisKK2Zyb20gY29tcGlsZXIudHJhbnNmb3JtZXIgaW1wb3J0IHBhcnNlLCBwYXJzZUZpbGUKK2Zyb20gY29tcGlsZXIudmlzaXRvciBpbXBvcnQgd2FsaworZnJvbSBjb21waWxlci5weWNvZGVnZW4gaW1wb3J0IGNvbXBpbGUsIGNvbXBpbGVGaWxlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NmI1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NmI1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2FzdC5weSBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvYXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjM2ZjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2FzdC5weQpAQCAtMCwwICsxLDE0MTkgQEAKKyIiIlB5dGhvbiBhYnN0cmFjdCBzeW50YXggbm9kZSBkZWZpbml0aW9ucworCitUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgVG9vbHMvY29tcGlsZXIvYXN0Z2VuLnB5CisiIiIKK2Zyb20gY29tcGlsZXIuY29uc3RzIGltcG9ydCBDT19WQVJBUkdTLCBDT19WQVJLRVlXT1JEUworCitkZWYgZmxhdHRlbihzZXEpOgorICAgIGwgPSBbXQorICAgIGZvciBlbHQgaW4gc2VxOgorICAgICAgICB0ID0gdHlwZShlbHQpCisgICAgICAgIGlmIHQgaXMgdHVwbGUgb3IgdCBpcyBsaXN0OgorICAgICAgICAgICAgZm9yIGVsdDIgaW4gZmxhdHRlbihlbHQpOgorICAgICAgICAgICAgICAgIGwuYXBwZW5kKGVsdDIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsLmFwcGVuZChlbHQpCisgICAgcmV0dXJuIGwKKworZGVmIGZsYXR0ZW5fbm9kZXMoc2VxKToKKyAgICByZXR1cm4gW24gZm9yIG4gaW4gZmxhdHRlbihzZXEpIGlmIGlzaW5zdGFuY2UobiwgTm9kZSldCisKK25vZGVzID0ge30KKworY2xhc3MgTm9kZToKKyAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhc3Qgbm9kZXMuIiIiCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBwYXNzICMgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgZm9yIG4gaW4gc2VsZi5nZXRDaGlsZHJlbigpOgorICAgICAgICAgICAgeWllbGQgbgorICAgIGRlZiBhc0xpc3Qoc2VsZik6ICMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgICAgIHJldHVybiBzZWxmLmdldENoaWxkcmVuKCkKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcGFzcyAjIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMKKworY2xhc3MgRW1wdHlOb2RlKE5vZGUpOgorICAgIHBhc3MKKworY2xhc3MgRXhwcmVzc2lvbihOb2RlKToKKyAgICAjIEV4cHJlc3Npb24gaXMgYW4gYXJ0aWZpY2lhbCBub2RlIGNsYXNzIHRvIHN1cHBvcnQgImV2YWwiCisgICAgbm9kZXNbImV4cHJlc3Npb24iXSA9ICJFeHByZXNzaW9uIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5ub2RlID0gbm9kZQorCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ub2RlLAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5vZGUsCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiRXhwcmVzc2lvbiglcykiICUgKHJlcHIoc2VsZi5ub2RlKSkKKworY2xhc3MgQWRkKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWZ0cmlnaHQsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdHJpZ2h0WzBdCisgICAgICAgIHNlbGYucmlnaHQgPSBsZWZ0cmlnaHRbMV0KKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJBZGQoKCVzLCAlcykpIiAlIChyZXByKHNlbGYubGVmdCksIHJlcHIoc2VsZi5yaWdodCkpCisKK2NsYXNzIEFuZChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZShmbGF0dGVuKHNlbGYubm9kZXMpKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJBbmQoJXMpIiAlIChyZXByKHNlbGYubm9kZXMpLCkKKworY2xhc3MgQXNzQXR0cihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwciwgYXR0cm5hbWUsIGZsYWdzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5hdHRybmFtZSA9IGF0dHJuYW1lCisgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHByLCBzZWxmLmF0dHJuYW1lLCBzZWxmLmZsYWdzCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJBc3NBdHRyKCVzLCAlcywgJXMpIiAlIChyZXByKHNlbGYuZXhwciksIHJlcHIoc2VsZi5hdHRybmFtZSksIHJlcHIoc2VsZi5mbGFncykpCisKK2NsYXNzIEFzc0xpc3QoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGVzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubm9kZXMgPSBub2RlcworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gdHVwbGUoZmxhdHRlbihzZWxmLm5vZGVzKSkKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYubm9kZXMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQXNzTGlzdCglcykiICUgKHJlcHIoc2VsZi5ub2RlcyksKQorCitjbGFzcyBBc3NOYW1lKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBmbGFncywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lLCBzZWxmLmZsYWdzCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQXNzTmFtZSglcywgJXMpIiAlIChyZXByKHNlbGYubmFtZSksIHJlcHIoc2VsZi5mbGFncykpCisKK2NsYXNzIEFzc1R1cGxlKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5vZGVzID0gbm9kZXMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHR1cGxlKGZsYXR0ZW4oc2VsZi5ub2RlcykpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLm5vZGVzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkFzc1R1cGxlKCVzKSIgJSAocmVwcihzZWxmLm5vZGVzKSwpCisKK2NsYXNzIEFzc2VydChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdCwgZmFpbCwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLnRlc3QgPSB0ZXN0CisgICAgICAgIHNlbGYuZmFpbCA9IGZhaWwKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi50ZXN0KQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5mYWlsKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi50ZXN0KQorICAgICAgICBpZiBzZWxmLmZhaWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5mYWlsKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQXNzZXJ0KCVzLCAlcykiICUgKHJlcHIoc2VsZi50ZXN0KSwgcmVwcihzZWxmLmZhaWwpKQorCitjbGFzcyBBc3NpZ24oTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGVzLCBleHByLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubm9kZXMgPSBub2RlcworICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uZXh0ZW5kKGZsYXR0ZW4oc2VsZi5ub2RlcykpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmV4cHIpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYubm9kZXMpKQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQXNzaWduKCVzLCAlcykiICUgKHJlcHIoc2VsZi5ub2RlcyksIHJlcHIoc2VsZi5leHByKSkKKworY2xhc3MgQXVnQXNzaWduKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlLCBvcCwgZXhwciwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5vZGUgPSBub2RlCisgICAgICAgIHNlbGYub3AgPSBvcAorICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5vZGUsIHNlbGYub3AsIHNlbGYuZXhwcgorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5vZGUsIHNlbGYuZXhwcgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkF1Z0Fzc2lnbiglcywgJXMsICVzKSIgJSAocmVwcihzZWxmLm5vZGUpLCByZXByKHNlbGYub3ApLCByZXByKHNlbGYuZXhwcikpCisKK2NsYXNzIEJhY2txdW90ZShOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwciwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cHIsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJCYWNrcXVvdGUoJXMpIiAlIChyZXByKHNlbGYuZXhwciksKQorCitjbGFzcyBCaXRhbmQoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGVzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubm9kZXMgPSBub2RlcworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gdHVwbGUoZmxhdHRlbihzZWxmLm5vZGVzKSkKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYubm9kZXMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQml0YW5kKCVzKSIgJSAocmVwcihzZWxmLm5vZGVzKSwpCisKK2NsYXNzIEJpdG9yKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5vZGVzID0gbm9kZXMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHR1cGxlKGZsYXR0ZW4oc2VsZi5ub2RlcykpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLm5vZGVzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkJpdG9yKCVzKSIgJSAocmVwcihzZWxmLm5vZGVzKSwpCisKK2NsYXNzIEJpdHhvcihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZShmbGF0dGVuKHNlbGYubm9kZXMpKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJCaXR4b3IoJXMpIiAlIChyZXByKHNlbGYubm9kZXMpLCkKKworY2xhc3MgQnJlYWsoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQnJlYWsoKSIKKworY2xhc3MgQ2FsbEZ1bmMoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGUsIGFyZ3MsIHN0YXJfYXJncyA9IE5vbmUsIGRzdGFyX2FyZ3MgPSBOb25lLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubm9kZSA9IG5vZGUKKyAgICAgICAgc2VsZi5hcmdzID0gYXJncworICAgICAgICBzZWxmLnN0YXJfYXJncyA9IHN0YXJfYXJncworICAgICAgICBzZWxmLmRzdGFyX2FyZ3MgPSBkc3Rhcl9hcmdzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYubm9kZSkKKyAgICAgICAgY2hpbGRyZW4uZXh0ZW5kKGZsYXR0ZW4oc2VsZi5hcmdzKSkKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuc3Rhcl9hcmdzKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5kc3Rhcl9hcmdzKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5ub2RlKQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLmFyZ3MpKQorICAgICAgICBpZiBzZWxmLnN0YXJfYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLnN0YXJfYXJncykKKyAgICAgICAgaWYgc2VsZi5kc3Rhcl9hcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZHN0YXJfYXJncykKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkNhbGxGdW5jKCVzLCAlcywgJXMsICVzKSIgJSAocmVwcihzZWxmLm5vZGUpLCByZXByKHNlbGYuYXJncyksIHJlcHIoc2VsZi5zdGFyX2FyZ3MpLCByZXByKHNlbGYuZHN0YXJfYXJncykpCisKK2NsYXNzIENsYXNzKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBiYXNlcywgZG9jLCBjb2RlLCBkZWNvcmF0b3JzID0gTm9uZSwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuYmFzZXMgPSBiYXNlcworICAgICAgICBzZWxmLmRvYyA9IGRvYworICAgICAgICBzZWxmLmNvZGUgPSBjb2RlCisgICAgICAgIHNlbGYuZGVjb3JhdG9ycyA9IGRlY29yYXRvcnMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5uYW1lKQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLmJhc2VzKSkKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZG9jKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5jb2RlKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5kZWNvcmF0b3JzKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLmJhc2VzKSkKKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuY29kZSkKKyAgICAgICAgaWYgc2VsZi5kZWNvcmF0b3JzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZGVjb3JhdG9ycykKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkNsYXNzKCVzLCAlcywgJXMsICVzLCAlcykiICUgKHJlcHIoc2VsZi5uYW1lKSwgcmVwcihzZWxmLmJhc2VzKSwgcmVwcihzZWxmLmRvYyksIHJlcHIoc2VsZi5jb2RlKSwgcmVwcihzZWxmLmRlY29yYXRvcnMpKQorCitjbGFzcyBDb21wYXJlKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByLCBvcHMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5leHByID0gZXhwcgorICAgICAgICBzZWxmLm9wcyA9IG9wcworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmV4cHIpCisgICAgICAgIGNoaWxkcmVuLmV4dGVuZChmbGF0dGVuKHNlbGYub3BzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5vcHMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQ29tcGFyZSglcywgJXMpIiAlIChyZXByKHNlbGYuZXhwciksIHJlcHIoc2VsZi5vcHMpKQorCitjbGFzcyBDb25zdChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlLAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiAoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkNvbnN0KCVzKSIgJSAocmVwcihzZWxmLnZhbHVlKSwpCisKK2NsYXNzIENvbnRpbnVlKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiAoKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiAoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkNvbnRpbnVlKCkiCisKK2NsYXNzIERlY29yYXRvcnMoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGVzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubm9kZXMgPSBub2RlcworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gdHVwbGUoZmxhdHRlbihzZWxmLm5vZGVzKSkKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYubm9kZXMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiRGVjb3JhdG9ycyglcykiICUgKHJlcHIoc2VsZi5ub2RlcyksKQorCitjbGFzcyBEaWN0KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdGVtcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLml0ZW1zID0gaXRlbXMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHR1cGxlKGZsYXR0ZW4oc2VsZi5pdGVtcykpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLml0ZW1zKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkRpY3QoJXMpIiAlIChyZXByKHNlbGYuaXRlbXMpLCkKKworY2xhc3MgRGlzY2FyZChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwciwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cHIsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJEaXNjYXJkKCVzKSIgJSAocmVwcihzZWxmLmV4cHIpLCkKKworY2xhc3MgRGl2KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWZ0cmlnaHQsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdHJpZ2h0WzBdCisgICAgICAgIHNlbGYucmlnaHQgPSBsZWZ0cmlnaHRbMV0KKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJEaXYoKCVzLCAlcykpIiAlIChyZXByKHNlbGYubGVmdCksIHJlcHIoc2VsZi5yaWdodCkpCisKK2NsYXNzIEVsbGlwc2lzKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiAoKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiAoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkVsbGlwc2lzKCkiCisKK2NsYXNzIEV4ZWMoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cHIsIGxvY2FscywgZ2xvYmFscywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYubG9jYWxzID0gbG9jYWxzCisgICAgICAgIHNlbGYuZ2xvYmFscyA9IGdsb2JhbHMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5sb2NhbHMpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmdsb2JhbHMpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmV4cHIpCisgICAgICAgIGlmIHNlbGYubG9jYWxzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYubG9jYWxzKQorICAgICAgICBpZiBzZWxmLmdsb2JhbHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5nbG9iYWxzKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiRXhlYyglcywgJXMsICVzKSIgJSAocmVwcihzZWxmLmV4cHIpLCByZXByKHNlbGYubG9jYWxzKSwgcmVwcihzZWxmLmdsb2JhbHMpKQorCitjbGFzcyBGbG9vckRpdihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGVmdHJpZ2h0LCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubGVmdCA9IGxlZnRyaWdodFswXQorICAgICAgICBzZWxmLnJpZ2h0ID0gbGVmdHJpZ2h0WzFdCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sZWZ0LCBzZWxmLnJpZ2h0CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiRmxvb3JEaXYoKCVzLCAlcykpIiAlIChyZXByKHNlbGYubGVmdCksIHJlcHIoc2VsZi5yaWdodCkpCisKK2NsYXNzIEZvcihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXNzaWduLCBsaXN0LCBib2R5LCBlbHNlXywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmFzc2lnbiA9IGFzc2lnbgorICAgICAgICBzZWxmLmxpc3QgPSBsaXN0CisgICAgICAgIHNlbGYuYm9keSA9IGJvZHkKKyAgICAgICAgc2VsZi5lbHNlXyA9IGVsc2VfCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuYXNzaWduKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5saXN0KQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5ib2R5KQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5lbHNlXykKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuYXNzaWduKQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5saXN0KQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5ib2R5KQorICAgICAgICBpZiBzZWxmLmVsc2VfIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZWxzZV8pCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJGb3IoJXMsICVzLCAlcywgJXMpIiAlIChyZXByKHNlbGYuYXNzaWduKSwgcmVwcihzZWxmLmxpc3QpLCByZXByKHNlbGYuYm9keSksIHJlcHIoc2VsZi5lbHNlXykpCisKK2NsYXNzIEZyb20oTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZG5hbWUsIG5hbWVzLCBsZXZlbCwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm1vZG5hbWUgPSBtb2RuYW1lCisgICAgICAgIHNlbGYubmFtZXMgPSBuYW1lcworICAgICAgICBzZWxmLmxldmVsID0gbGV2ZWwKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubW9kbmFtZSwgc2VsZi5uYW1lcywgc2VsZi5sZXZlbAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiAoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkZyb20oJXMsICVzLCAlcykiICUgKHJlcHIoc2VsZi5tb2RuYW1lKSwgcmVwcihzZWxmLm5hbWVzKSwgcmVwcihzZWxmLmxldmVsKSkKKworY2xhc3MgRnVuY3Rpb24oTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlY29yYXRvcnMsIG5hbWUsIGFyZ25hbWVzLCBkZWZhdWx0cywgZmxhZ3MsIGRvYywgY29kZSwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5hcmduYW1lcyA9IGFyZ25hbWVzCisgICAgICAgIHNlbGYuZGVmYXVsdHMgPSBkZWZhdWx0cworICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MKKyAgICAgICAgc2VsZi5kb2MgPSBkb2MKKyAgICAgICAgc2VsZi5jb2RlID0gY29kZQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworICAgICAgICBzZWxmLnZhcmFyZ3MgPSBzZWxmLmt3YXJncyA9IE5vbmUKKyAgICAgICAgaWYgZmxhZ3MgJiBDT19WQVJBUkdTOgorICAgICAgICAgICAgc2VsZi52YXJhcmdzID0gMQorICAgICAgICBpZiBmbGFncyAmIENPX1ZBUktFWVdPUkRTOgorICAgICAgICAgICAgc2VsZi5rd2FyZ3MgPSAxCisKKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5kZWNvcmF0b3JzKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5uYW1lKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5hcmduYW1lcykKKyAgICAgICAgY2hpbGRyZW4uZXh0ZW5kKGZsYXR0ZW4oc2VsZi5kZWZhdWx0cykpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmZsYWdzKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5kb2MpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmNvZGUpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIGlmIHNlbGYuZGVjb3JhdG9ycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmRlY29yYXRvcnMpCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYuZGVmYXVsdHMpKQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5jb2RlKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiRnVuY3Rpb24oJXMsICVzLCAlcywgJXMsICVzLCAlcywgJXMpIiAlIChyZXByKHNlbGYuZGVjb3JhdG9ycyksIHJlcHIoc2VsZi5uYW1lKSwgcmVwcihzZWxmLmFyZ25hbWVzKSwgcmVwcihzZWxmLmRlZmF1bHRzKSwgcmVwcihzZWxmLmZsYWdzKSwgcmVwcihzZWxmLmRvYyksIHJlcHIoc2VsZi5jb2RlKSkKKworY2xhc3MgR2VuRXhwcihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29kZSwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmNvZGUgPSBjb2RlCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisgICAgICAgIHNlbGYuYXJnbmFtZXMgPSBbJy4wJ10KKyAgICAgICAgc2VsZi52YXJhcmdzID0gc2VsZi5rd2FyZ3MgPSBOb25lCisKKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29kZSwKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb2RlLAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkdlbkV4cHIoJXMpIiAlIChyZXByKHNlbGYuY29kZSksKQorCitjbGFzcyBHZW5FeHByRm9yKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhc3NpZ24sIGl0ZXIsIGlmcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmFzc2lnbiA9IGFzc2lnbgorICAgICAgICBzZWxmLml0ZXIgPSBpdGVyCisgICAgICAgIHNlbGYuaWZzID0gaWZzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisgICAgICAgIHNlbGYuaXNfb3V0bW9zdCA9IEZhbHNlCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuYXNzaWduKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5pdGVyKQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLmlmcykpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmFzc2lnbikKKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuaXRlcikKKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5pZnMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiR2VuRXhwckZvciglcywgJXMsICVzKSIgJSAocmVwcihzZWxmLmFzc2lnbiksIHJlcHIoc2VsZi5pdGVyKSwgcmVwcihzZWxmLmlmcykpCisKK2NsYXNzIEdlbkV4cHJJZihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdCwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLnRlc3QgPSB0ZXN0CisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRlc3QsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGVzdCwKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJHZW5FeHBySWYoJXMpIiAlIChyZXByKHNlbGYudGVzdCksKQorCitjbGFzcyBHZW5FeHBySW5uZXIoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cHIsIHF1YWxzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5xdWFscyA9IHF1YWxzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgY2hpbGRyZW4uZXh0ZW5kKGZsYXR0ZW4oc2VsZi5xdWFscykpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmV4cHIpCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYucXVhbHMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiR2VuRXhwcklubmVyKCVzLCAlcykiICUgKHJlcHIoc2VsZi5leHByKSwgcmVwcihzZWxmLnF1YWxzKSkKKworY2xhc3MgR2V0YXR0cihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwciwgYXR0cm5hbWUsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5leHByID0gZXhwcgorICAgICAgICBzZWxmLmF0dHJuYW1lID0gYXR0cm5hbWUKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwgc2VsZi5hdHRybmFtZQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cHIsCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiR2V0YXR0ciglcywgJXMpIiAlIChyZXByKHNlbGYuZXhwciksIHJlcHIoc2VsZi5hdHRybmFtZSkpCisKK2NsYXNzIEdsb2JhbChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZXMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5uYW1lcyA9IG5hbWVzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWVzLAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiAoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkdsb2JhbCglcykiICUgKHJlcHIoc2VsZi5uYW1lcyksKQorCitjbGFzcyBJZihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdHMsIGVsc2VfLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYudGVzdHMgPSB0ZXN0cworICAgICAgICBzZWxmLmVsc2VfID0gZWxzZV8KKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLnRlc3RzKSkKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZWxzZV8pCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYudGVzdHMpKQorICAgICAgICBpZiBzZWxmLmVsc2VfIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZWxzZV8pCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJJZiglcywgJXMpIiAlIChyZXByKHNlbGYudGVzdHMpLCByZXByKHNlbGYuZWxzZV8pKQorCitjbGFzcyBJZkV4cChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdCwgdGhlbiwgZWxzZV8sIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi50ZXN0ID0gdGVzdAorICAgICAgICBzZWxmLnRoZW4gPSB0aGVuCisgICAgICAgIHNlbGYuZWxzZV8gPSBlbHNlXworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXN0LCBzZWxmLnRoZW4sIHNlbGYuZWxzZV8KKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXN0LCBzZWxmLnRoZW4sIHNlbGYuZWxzZV8KKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJJZkV4cCglcywgJXMsICVzKSIgJSAocmVwcihzZWxmLnRlc3QpLCByZXByKHNlbGYudGhlbiksIHJlcHIoc2VsZi5lbHNlXykpCisKK2NsYXNzIEltcG9ydChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZXMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5uYW1lcyA9IG5hbWVzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWVzLAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiAoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkltcG9ydCglcykiICUgKHJlcHIoc2VsZi5uYW1lcyksKQorCitjbGFzcyBJbnZlcnQoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cHIsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5leHByID0gZXhwcgorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHByLAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cHIsCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiSW52ZXJ0KCVzKSIgJSAocmVwcihzZWxmLmV4cHIpLCkKKworY2xhc3MgS2V5d29yZChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZXhwciwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZSwgc2VsZi5leHByCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJLZXl3b3JkKCVzLCAlcykiICUgKHJlcHIoc2VsZi5uYW1lKSwgcmVwcihzZWxmLmV4cHIpKQorCitjbGFzcyBMYW1iZGEoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ25hbWVzLCBkZWZhdWx0cywgZmxhZ3MsIGNvZGUsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5hcmduYW1lcyA9IGFyZ25hbWVzCisgICAgICAgIHNlbGYuZGVmYXVsdHMgPSBkZWZhdWx0cworICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MKKyAgICAgICAgc2VsZi5jb2RlID0gY29kZQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworICAgICAgICBzZWxmLnZhcmFyZ3MgPSBzZWxmLmt3YXJncyA9IE5vbmUKKyAgICAgICAgaWYgZmxhZ3MgJiBDT19WQVJBUkdTOgorICAgICAgICAgICAgc2VsZi52YXJhcmdzID0gMQorICAgICAgICBpZiBmbGFncyAmIENPX1ZBUktFWVdPUkRTOgorICAgICAgICAgICAgc2VsZi5rd2FyZ3MgPSAxCisKKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5hcmduYW1lcykKKyAgICAgICAgY2hpbGRyZW4uZXh0ZW5kKGZsYXR0ZW4oc2VsZi5kZWZhdWx0cykpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmZsYWdzKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5jb2RlKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLmRlZmF1bHRzKSkKKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuY29kZSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkxhbWJkYSglcywgJXMsICVzLCAlcykiICUgKHJlcHIoc2VsZi5hcmduYW1lcyksIHJlcHIoc2VsZi5kZWZhdWx0cyksIHJlcHIoc2VsZi5mbGFncyksIHJlcHIoc2VsZi5jb2RlKSkKKworY2xhc3MgTGVmdFNoaWZ0KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWZ0cmlnaHQsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdHJpZ2h0WzBdCisgICAgICAgIHNlbGYucmlnaHQgPSBsZWZ0cmlnaHRbMV0KKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJMZWZ0U2hpZnQoKCVzLCAlcykpIiAlIChyZXByKHNlbGYubGVmdCksIHJlcHIoc2VsZi5yaWdodCkpCisKK2NsYXNzIExpc3QoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGVzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubm9kZXMgPSBub2RlcworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gdHVwbGUoZmxhdHRlbihzZWxmLm5vZGVzKSkKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYubm9kZXMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTGlzdCglcykiICUgKHJlcHIoc2VsZi5ub2RlcyksKQorCitjbGFzcyBMaXN0Q29tcChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwciwgcXVhbHMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5leHByID0gZXhwcgorICAgICAgICBzZWxmLnF1YWxzID0gcXVhbHMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLnF1YWxzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5xdWFscykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJMaXN0Q29tcCglcywgJXMpIiAlIChyZXByKHNlbGYuZXhwciksIHJlcHIoc2VsZi5xdWFscykpCisKK2NsYXNzIExpc3RDb21wRm9yKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhc3NpZ24sIGxpc3QsIGlmcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmFzc2lnbiA9IGFzc2lnbgorICAgICAgICBzZWxmLmxpc3QgPSBsaXN0CisgICAgICAgIHNlbGYuaWZzID0gaWZzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuYXNzaWduKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5saXN0KQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLmlmcykpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmFzc2lnbikKKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYubGlzdCkKKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5pZnMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTGlzdENvbXBGb3IoJXMsICVzLCAlcykiICUgKHJlcHIoc2VsZi5hc3NpZ24pLCByZXByKHNlbGYubGlzdCksIHJlcHIoc2VsZi5pZnMpKQorCitjbGFzcyBMaXN0Q29tcElmKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0LCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYudGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGVzdCwKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXN0LAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkxpc3RDb21wSWYoJXMpIiAlIChyZXByKHNlbGYudGVzdCksKQorCitjbGFzcyBTZXRDb21wKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByLCBxdWFscywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYucXVhbHMgPSBxdWFscworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmV4cHIpCisgICAgICAgIGNoaWxkcmVuLmV4dGVuZChmbGF0dGVuKHNlbGYucXVhbHMpKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLnF1YWxzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlNldENvbXAoJXMsICVzKSIgJSAocmVwcihzZWxmLmV4cHIpLCByZXByKHNlbGYucXVhbHMpKQorCitjbGFzcyBEaWN0Q29tcChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwga2V5LCB2YWx1ZSwgcXVhbHMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5rZXkgPSBrZXkKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYucXVhbHMgPSBxdWFscworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmtleSkKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYudmFsdWUpCisgICAgICAgIGNoaWxkcmVuLmV4dGVuZChmbGF0dGVuKHNlbGYucXVhbHMpKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5rZXkpCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLnZhbHVlKQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLnF1YWxzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkRpY3RDb21wKCVzLCAlcywgJXMpIiAlIChyZXByKHNlbGYua2V5KSwgcmVwcihzZWxmLnZhbHVlKSwgcmVwcihzZWxmLnF1YWxzKSkKKworY2xhc3MgTW9kKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWZ0cmlnaHQsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdHJpZ2h0WzBdCisgICAgICAgIHNlbGYucmlnaHQgPSBsZWZ0cmlnaHRbMV0KKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJNb2QoKCVzLCAlcykpIiAlIChyZXByKHNlbGYubGVmdCksIHJlcHIoc2VsZi5yaWdodCkpCisKK2NsYXNzIE1vZHVsZShOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZG9jLCBub2RlLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZG9jID0gZG9jCisgICAgICAgIHNlbGYubm9kZSA9IG5vZGUKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZG9jLCBzZWxmLm5vZGUKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ub2RlLAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIk1vZHVsZSglcywgJXMpIiAlIChyZXByKHNlbGYuZG9jKSwgcmVwcihzZWxmLm5vZGUpKQorCitjbGFzcyBNdWwoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxlZnRyaWdodCwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmxlZnQgPSBsZWZ0cmlnaHRbMF0KKyAgICAgICAgc2VsZi5yaWdodCA9IGxlZnRyaWdodFsxXQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sZWZ0LCBzZWxmLnJpZ2h0CisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIk11bCgoJXMsICVzKSkiICUgKHJlcHIoc2VsZi5sZWZ0KSwgcmVwcihzZWxmLnJpZ2h0KSkKKworY2xhc3MgTmFtZShOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTmFtZSglcykiICUgKHJlcHIoc2VsZi5uYW1lKSwpCisKK2NsYXNzIE5vdChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwciwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cHIsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJOb3QoJXMpIiAlIChyZXByKHNlbGYuZXhwciksKQorCitjbGFzcyBPcihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZShmbGF0dGVuKHNlbGYubm9kZXMpKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJPciglcykiICUgKHJlcHIoc2VsZi5ub2RlcyksKQorCitjbGFzcyBQYXNzKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiAoKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiAoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlBhc3MoKSIKKworY2xhc3MgUG93ZXIoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxlZnRyaWdodCwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmxlZnQgPSBsZWZ0cmlnaHRbMF0KKyAgICAgICAgc2VsZi5yaWdodCA9IGxlZnRyaWdodFsxXQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sZWZ0LCBzZWxmLnJpZ2h0CisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlBvd2VyKCglcywgJXMpKSIgJSAocmVwcihzZWxmLmxlZnQpLCByZXByKHNlbGYucmlnaHQpKQorCitjbGFzcyBQcmludChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGRlc3QsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYuZGVzdCA9IGRlc3QKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLm5vZGVzKSkKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZGVzdCkKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIGlmIHNlbGYuZGVzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmRlc3QpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJQcmludCglcywgJXMpIiAlIChyZXByKHNlbGYubm9kZXMpLCByZXByKHNlbGYuZGVzdCkpCisKK2NsYXNzIFByaW50bmwoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGVzLCBkZXN0LCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubm9kZXMgPSBub2RlcworICAgICAgICBzZWxmLmRlc3QgPSBkZXN0CisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uZXh0ZW5kKGZsYXR0ZW4oc2VsZi5ub2RlcykpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmRlc3QpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYubm9kZXMpKQorICAgICAgICBpZiBzZWxmLmRlc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5kZXN0KQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiUHJpbnRubCglcywgJXMpIiAlIChyZXByKHNlbGYubm9kZXMpLCByZXByKHNlbGYuZGVzdCkpCisKK2NsYXNzIFJhaXNlKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByMSwgZXhwcjIsIGV4cHIzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwcjEgPSBleHByMQorICAgICAgICBzZWxmLmV4cHIyID0gZXhwcjIKKyAgICAgICAgc2VsZi5leHByMyA9IGV4cHIzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZXhwcjEpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmV4cHIyKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5leHByMykKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgaWYgc2VsZi5leHByMSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmV4cHIxKQorICAgICAgICBpZiBzZWxmLmV4cHIyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZXhwcjIpCisgICAgICAgIGlmIHNlbGYuZXhwcjMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5leHByMykKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlJhaXNlKCVzLCAlcywgJXMpIiAlIChyZXByKHNlbGYuZXhwcjEpLCByZXByKHNlbGYuZXhwcjIpLCByZXByKHNlbGYuZXhwcjMpKQorCitjbGFzcyBSZXR1cm4oTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSwKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSwKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJSZXR1cm4oJXMpIiAlIChyZXByKHNlbGYudmFsdWUpLCkKKworY2xhc3MgUmlnaHRTaGlmdChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGVmdHJpZ2h0LCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubGVmdCA9IGxlZnRyaWdodFswXQorICAgICAgICBzZWxmLnJpZ2h0ID0gbGVmdHJpZ2h0WzFdCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sZWZ0LCBzZWxmLnJpZ2h0CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiUmlnaHRTaGlmdCgoJXMsICVzKSkiICUgKHJlcHIoc2VsZi5sZWZ0KSwgcmVwcihzZWxmLnJpZ2h0KSkKKworY2xhc3MgU2V0KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5vZGVzID0gbm9kZXMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHR1cGxlKGZsYXR0ZW4oc2VsZi5ub2RlcykpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLm5vZGVzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlNldCglcykiICUgKHJlcHIoc2VsZi5ub2RlcyksKQorCitjbGFzcyBTbGljZShOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwciwgZmxhZ3MsIGxvd2VyLCB1cHBlciwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncworICAgICAgICBzZWxmLmxvd2VyID0gbG93ZXIKKyAgICAgICAgc2VsZi51cHBlciA9IHVwcGVyCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZmxhZ3MpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmxvd2VyKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi51cHBlcikKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgaWYgc2VsZi5sb3dlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmxvd2VyKQorICAgICAgICBpZiBzZWxmLnVwcGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYudXBwZXIpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJTbGljZSglcywgJXMsICVzLCAlcykiICUgKHJlcHIoc2VsZi5leHByKSwgcmVwcihzZWxmLmZsYWdzKSwgcmVwcihzZWxmLmxvd2VyKSwgcmVwcihzZWxmLnVwcGVyKSkKKworY2xhc3MgU2xpY2VvYmooTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGVzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubm9kZXMgPSBub2RlcworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gdHVwbGUoZmxhdHRlbihzZWxmLm5vZGVzKSkKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYubm9kZXMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiU2xpY2VvYmooJXMpIiAlIChyZXByKHNlbGYubm9kZXMpLCkKKworY2xhc3MgU3RtdChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZShmbGF0dGVuKHNlbGYubm9kZXMpKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJTdG10KCVzKSIgJSAocmVwcihzZWxmLm5vZGVzKSwpCisKK2NsYXNzIFN1YihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGVmdHJpZ2h0LCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubGVmdCA9IGxlZnRyaWdodFswXQorICAgICAgICBzZWxmLnJpZ2h0ID0gbGVmdHJpZ2h0WzFdCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sZWZ0LCBzZWxmLnJpZ2h0CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiU3ViKCglcywgJXMpKSIgJSAocmVwcihzZWxmLmxlZnQpLCByZXByKHNlbGYucmlnaHQpKQorCitjbGFzcyBTdWJzY3JpcHQoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cHIsIGZsYWdzLCBzdWJzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzCisgICAgICAgIHNlbGYuc3VicyA9IHN1YnMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5mbGFncykKKyAgICAgICAgY2hpbGRyZW4uZXh0ZW5kKGZsYXR0ZW4oc2VsZi5zdWJzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5zdWJzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlN1YnNjcmlwdCglcywgJXMsICVzKSIgJSAocmVwcihzZWxmLmV4cHIpLCByZXByKHNlbGYuZmxhZ3MpLCByZXByKHNlbGYuc3VicykpCisKK2NsYXNzIFRyeUV4Y2VwdChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYm9keSwgaGFuZGxlcnMsIGVsc2VfLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuYm9keSA9IGJvZHkKKyAgICAgICAgc2VsZi5oYW5kbGVycyA9IGhhbmRsZXJzCisgICAgICAgIHNlbGYuZWxzZV8gPSBlbHNlXworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmJvZHkpCisgICAgICAgIGNoaWxkcmVuLmV4dGVuZChmbGF0dGVuKHNlbGYuaGFuZGxlcnMpKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5lbHNlXykKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuYm9keSkKKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5oYW5kbGVycykpCisgICAgICAgIGlmIHNlbGYuZWxzZV8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5lbHNlXykKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlRyeUV4Y2VwdCglcywgJXMsICVzKSIgJSAocmVwcihzZWxmLmJvZHkpLCByZXByKHNlbGYuaGFuZGxlcnMpLCByZXByKHNlbGYuZWxzZV8pKQorCitjbGFzcyBUcnlGaW5hbGx5KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBib2R5LCBmaW5hbCwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmJvZHkgPSBib2R5CisgICAgICAgIHNlbGYuZmluYWwgPSBmaW5hbAorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ib2R5LCBzZWxmLmZpbmFsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYm9keSwgc2VsZi5maW5hbAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlRyeUZpbmFsbHkoJXMsICVzKSIgJSAocmVwcihzZWxmLmJvZHkpLCByZXByKHNlbGYuZmluYWwpKQorCitjbGFzcyBUdXBsZShOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZShmbGF0dGVuKHNlbGYubm9kZXMpKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJUdXBsZSglcykiICUgKHJlcHIoc2VsZi5ub2RlcyksKQorCitjbGFzcyBVbmFyeUFkZChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwciwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cHIsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJVbmFyeUFkZCglcykiICUgKHJlcHIoc2VsZi5leHByKSwpCisKK2NsYXNzIFVuYXJ5U3ViKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHByLAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlVuYXJ5U3ViKCVzKSIgJSAocmVwcihzZWxmLmV4cHIpLCkKKworY2xhc3MgV2hpbGUoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3QsIGJvZHksIGVsc2VfLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYudGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5ib2R5ID0gYm9keQorICAgICAgICBzZWxmLmVsc2VfID0gZWxzZV8KKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi50ZXN0KQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5ib2R5KQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5lbHNlXykKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYudGVzdCkKKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuYm9keSkKKyAgICAgICAgaWYgc2VsZi5lbHNlXyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmVsc2VfKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiV2hpbGUoJXMsICVzLCAlcykiICUgKHJlcHIoc2VsZi50ZXN0KSwgcmVwcihzZWxmLmJvZHkpLCByZXByKHNlbGYuZWxzZV8pKQorCitjbGFzcyBXaXRoKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByLCB2YXJzLCBib2R5LCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi52YXJzID0gdmFycworICAgICAgICBzZWxmLmJvZHkgPSBib2R5CisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYudmFycykKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuYm9keSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgaWYgc2VsZi52YXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYudmFycykKKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuYm9keSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIldpdGgoJXMsICVzLCAlcykiICUgKHJlcHIoc2VsZi5leHByKSwgcmVwcihzZWxmLnZhcnMpLCByZXByKHNlbGYuYm9keSkpCisKK2NsYXNzIFlpZWxkKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUsCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiWWllbGQoJXMpIiAlIChyZXByKHNlbGYudmFsdWUpLCkKKworZm9yIG5hbWUsIG9iaiBpbiBnbG9iYWxzKCkuaXRlbXMoKToKKyAgICBpZiBpc2luc3RhbmNlKG9iaiwgdHlwZSkgYW5kIGlzc3ViY2xhc3Mob2JqLCBOb2RlKToKKyAgICAgICAgbm9kZXNbbmFtZS5sb3dlcigpXSA9IG9iagpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci9hc3QucHljIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9hc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMjM1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2FzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci9hc3QucHlvIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9hc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMjM1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2FzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci9jb25zdHMucHkgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2NvbnN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjBiMWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9jb25zdHMucHkKQEAgLTAsMCArMSwyMyBAQAorIyBvcGVyYXRpb24gZmxhZ3MKK09QX0FTU0lHTiA9ICdPUF9BU1NJR04nCitPUF9ERUxFVEUgPSAnT1BfREVMRVRFJworT1BfQVBQTFkgPSAnT1BfQVBQTFknCisKK1NDX0xPQ0FMID0gMQorU0NfR0xPQkFMX0lNUExJQ0lUID0gMgorU0NfR0xPQkFMX0VYUExJQ0lUID0gMworU0NfRlJFRSA9IDQKK1NDX0NFTEwgPSA1CitTQ19VTktOT1dOID0gNgorCitDT19PUFRJTUlaRUQgPSAweDAwMDEKK0NPX05FV0xPQ0FMUyA9IDB4MDAwMgorQ09fVkFSQVJHUyA9IDB4MDAwNAorQ09fVkFSS0VZV09SRFMgPSAweDAwMDgKK0NPX05FU1RFRCA9IDB4MDAxMAorQ09fR0VORVJBVE9SID0gMHgwMDIwCitDT19HRU5FUkFUT1JfQUxMT1dFRCA9IDAKK0NPX0ZVVFVSRV9ESVZJU0lPTiA9IDB4MjAwMAorQ09fRlVUVVJFX0FCU0lNUE9SVCA9IDB4NDAwMAorQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UID0gMHg4MDAwCitDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT04gPSAweDEwMDAwCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2NvbnN0cy5weWMgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2NvbnN0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzN2I0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvY29uc3RzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2NvbnN0cy5weW8gYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2NvbnN0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzN2I0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvY29uc3RzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2Z1dHVyZS5weSBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvZnV0dXJlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNWU1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2Z1dHVyZS5weQpAQCAtMCwwICsxLDc0IEBACisiIiJQYXJzZXIgZm9yIGZ1dHVyZSBzdGF0ZW1lbnRzCisKKyIiIgorCitmcm9tIGNvbXBpbGVyIGltcG9ydCBhc3QsIHdhbGsKKworZGVmIGlzX2Z1dHVyZShzdG10KToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBzdGF0ZW1lbnQgaXMgYSB3ZWxsLWZvcm1lZCBmdXR1cmUgc3RhdGVtZW50IiIiCisgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3RtdCwgYXN0LkZyb20pOgorICAgICAgICByZXR1cm4gMAorICAgIGlmIHN0bXQubW9kbmFtZSA9PSAiX19mdXR1cmVfXyI6CisgICAgICAgIHJldHVybiAxCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIDAKKworY2xhc3MgRnV0dXJlUGFyc2VyOgorCisgICAgZmVhdHVyZXMgPSAoIm5lc3RlZF9zY29wZXMiLCAiZ2VuZXJhdG9ycyIsICJkaXZpc2lvbiIsCisgICAgICAgICAgICAgICAgImFic29sdXRlX2ltcG9ydCIsICJ3aXRoX3N0YXRlbWVudCIsICJwcmludF9mdW5jdGlvbiIsCisgICAgICAgICAgICAgICAgInVuaWNvZGVfbGl0ZXJhbHMiKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmZvdW5kID0ge30gIyBzZXQKKworICAgIGRlZiB2aXNpdE1vZHVsZShzZWxmLCBub2RlKToKKyAgICAgICAgc3RtdCA9IG5vZGUubm9kZQorICAgICAgICBmb3IgcyBpbiBzdG10Lm5vZGVzOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfc3RtdChzKToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIGNoZWNrX3N0bXQoc2VsZiwgc3RtdCk6CisgICAgICAgIGlmIGlzX2Z1dHVyZShzdG10KToKKyAgICAgICAgICAgIGZvciBuYW1lLCBhc25hbWUgaW4gc3RtdC5uYW1lczoKKyAgICAgICAgICAgICAgICBpZiBuYW1lIGluIHNlbGYuZmVhdHVyZXM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZm91bmRbbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1dHVyZSBmZWF0dXJlICVzIGlzIG5vdCBkZWZpbmVkIiAlIG5hbWUKKyAgICAgICAgICAgIHN0bXQudmFsaWRfZnV0dXJlID0gMQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBnZXRfZmVhdHVyZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBsaXN0IG9mIGZlYXR1cmVzIGVuYWJsZWQgYnkgZnV0dXJlIHN0YXRlbWVudHMiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZm91bmQua2V5cygpCisKK2NsYXNzIEJhZEZ1dHVyZVBhcnNlcjoKKyAgICAiIiJDaGVjayBmb3IgaW52YWxpZCBmdXR1cmUgc3RhdGVtZW50cyIiIgorCisgICAgZGVmIHZpc2l0RnJvbShzZWxmLCBub2RlKToKKyAgICAgICAgaWYgaGFzYXR0cihub2RlLCAndmFsaWRfZnV0dXJlJyk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm9kZS5tb2RuYW1lICE9ICJfX2Z1dHVyZV9fIjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgImludmFsaWQgZnV0dXJlIHN0YXRlbWVudCAiICsgcmVwcihub2RlKQorCitkZWYgZmluZF9mdXR1cmVzKG5vZGUpOgorICAgIHAxID0gRnV0dXJlUGFyc2VyKCkKKyAgICBwMiA9IEJhZEZ1dHVyZVBhcnNlcigpCisgICAgd2Fsayhub2RlLCBwMSkKKyAgICB3YWxrKG5vZGUsIHAyKQorICAgIHJldHVybiBwMS5nZXRfZmVhdHVyZXMoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGltcG9ydCBzeXMKKyAgICBmcm9tIGNvbXBpbGVyIGltcG9ydCBwYXJzZUZpbGUsIHdhbGsKKworICAgIGZvciBmaWxlIGluIHN5cy5hcmd2WzE6XToKKyAgICAgICAgcHJpbnQgZmlsZQorICAgICAgICB0cmVlID0gcGFyc2VGaWxlKGZpbGUpCisgICAgICAgIHYgPSBGdXR1cmVQYXJzZXIoKQorICAgICAgICB3YWxrKHRyZWUsIHYpCisgICAgICAgIHByaW50IHYuZm91bmQKKyAgICAgICAgcHJpbnQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvZnV0dXJlLnB5YyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvZnV0dXJlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDhkYWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9mdXR1cmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvZnV0dXJlLnB5byBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvZnV0dXJlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDhkYWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9mdXR1cmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvbWlzYy5weSBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvbWlzYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODhjN2ZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9taXNjLnB5CkBAIC0wLDAgKzEsNzMgQEAKKworZGVmIGZsYXR0ZW4odHVwKToKKyAgICBlbHRzID0gW10KKyAgICBmb3IgZWx0IGluIHR1cDoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShlbHQsIHR1cGxlKToKKyAgICAgICAgICAgIGVsdHMgPSBlbHRzICsgZmxhdHRlbihlbHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbHRzLmFwcGVuZChlbHQpCisgICAgcmV0dXJuIGVsdHMKKworY2xhc3MgU2V0OgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5lbHRzID0ge30KKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmVsdHMpCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBlbHQpOgorICAgICAgICByZXR1cm4gZWx0IGluIHNlbGYuZWx0cworICAgIGRlZiBhZGQoc2VsZiwgZWx0KToKKyAgICAgICAgc2VsZi5lbHRzW2VsdF0gPSBlbHQKKyAgICBkZWYgZWxlbWVudHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmVsdHMua2V5cygpCisgICAgZGVmIGhhc19lbHQoc2VsZiwgZWx0KToKKyAgICAgICAgcmV0dXJuIGVsdCBpbiBzZWxmLmVsdHMKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGVsdCk6CisgICAgICAgIGRlbCBzZWxmLmVsdHNbZWx0XQorICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICBjID0gU2V0KCkKKyAgICAgICAgYy5lbHRzLnVwZGF0ZShzZWxmLmVsdHMpCisgICAgICAgIHJldHVybiBjCisKK2NsYXNzIFN0YWNrOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zdGFjayA9IFtdCisgICAgICAgIHNlbGYucG9wID0gc2VsZi5zdGFjay5wb3AKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLnN0YWNrKQorICAgIGRlZiBwdXNoKHNlbGYsIGVsdCk6CisgICAgICAgIHNlbGYuc3RhY2suYXBwZW5kKGVsdCkKKyAgICBkZWYgdG9wKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdGFja1stMV0KKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOiAjIG5lZWRlZCBieSB2aXNpdENvbnRpbnVlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RhY2tbaW5kZXhdCisKK01BTkdMRV9MRU4gPSAyNTYgIyBtYWdpYyBjb25zdGFudCBmcm9tIGNvbXBpbGUuYworCitkZWYgbWFuZ2xlKG5hbWUsIGtsYXNzKToKKyAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfXycpOgorICAgICAgICByZXR1cm4gbmFtZQorICAgIGlmIGxlbihuYW1lKSArIDIgPj0gTUFOR0xFX0xFTjoKKyAgICAgICAgcmV0dXJuIG5hbWUKKyAgICBpZiBuYW1lLmVuZHN3aXRoKCdfXycpOgorICAgICAgICByZXR1cm4gbmFtZQorICAgIHRyeToKKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUga2xhc3NbaV0gPT0gJ18nOgorICAgICAgICAgICAgaSA9IGkgKyAxCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIHJldHVybiBuYW1lCisgICAga2xhc3MgPSBrbGFzc1tpOl0KKworICAgIHRsZW4gPSBsZW4oa2xhc3MpICsgbGVuKG5hbWUpCisgICAgaWYgdGxlbiA+IE1BTkdMRV9MRU46CisgICAgICAgIGtsYXNzID0ga2xhc3NbOk1BTkdMRV9MRU4tdGxlbl0KKworICAgIHJldHVybiAiXyVzJXMiICUgKGtsYXNzLCBuYW1lKQorCitkZWYgc2V0X2ZpbGVuYW1lKGZpbGVuYW1lLCB0cmVlKToKKyAgICAiIiJTZXQgdGhlIGZpbGVuYW1lIGF0dHJpYnV0ZSB0byBmaWxlbmFtZSBvbiBldmVyeSBub2RlIGluIHRyZWUiIiIKKyAgICB3b3JrbGlzdCA9IFt0cmVlXQorICAgIHdoaWxlIHdvcmtsaXN0OgorICAgICAgICBub2RlID0gd29ya2xpc3QucG9wKDApCisgICAgICAgIG5vZGUuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICB3b3JrbGlzdC5leHRlbmQobm9kZS5nZXRDaGlsZE5vZGVzKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL21pc2MucHljIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9taXNjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTA4ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9taXNjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL21pc2MucHlvIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9taXNjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTA4ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9taXNjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3B5YXNzZW0ucHkgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3B5YXNzZW0ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2YmUwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHlhc3NlbS5weQpAQCAtMCwwICsxLDc2MyBAQAorIiIiQSBmbG93IGdyYXBoIHJlcHJlc2VudGF0aW9uIGZvciBQeXRob24gYnl0ZWNvZGUiIiIKKworaW1wb3J0IGRpcworaW1wb3J0IHR5cGVzCitpbXBvcnQgc3lzCisKK2Zyb20gY29tcGlsZXIgaW1wb3J0IG1pc2MKK2Zyb20gY29tcGlsZXIuY29uc3RzIFwKKyAgICAgaW1wb3J0IENPX09QVElNSVpFRCwgQ09fTkVXTE9DQUxTLCBDT19WQVJBUkdTLCBDT19WQVJLRVlXT1JEUworCitjbGFzcyBGbG93R3JhcGg6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmN1cnJlbnQgPSBzZWxmLmVudHJ5ID0gQmxvY2soKQorICAgICAgICBzZWxmLmV4aXQgPSBCbG9jaygiZXhpdCIpCisgICAgICAgIHNlbGYuYmxvY2tzID0gbWlzYy5TZXQoKQorICAgICAgICBzZWxmLmJsb2Nrcy5hZGQoc2VsZi5lbnRyeSkKKyAgICAgICAgc2VsZi5ibG9ja3MuYWRkKHNlbGYuZXhpdCkKKworICAgIGRlZiBzdGFydEJsb2NrKHNlbGYsIGJsb2NrKToKKyAgICAgICAgaWYgc2VsZi5fZGVidWc6CisgICAgICAgICAgICBpZiBzZWxmLmN1cnJlbnQ6CisgICAgICAgICAgICAgICAgcHJpbnQgImVuZCIsIHJlcHIoc2VsZi5jdXJyZW50KQorICAgICAgICAgICAgICAgIHByaW50ICIgICAgbmV4dCIsIHNlbGYuY3VycmVudC5uZXh0CisgICAgICAgICAgICAgICAgcHJpbnQgIiAgICBwcmV2Iiwgc2VsZi5jdXJyZW50LnByZXYKKyAgICAgICAgICAgICAgICBwcmludCAiICAgIiwgc2VsZi5jdXJyZW50LmdldF9jaGlsZHJlbigpCisgICAgICAgICAgICBwcmludCByZXByKGJsb2NrKQorICAgICAgICBzZWxmLmN1cnJlbnQgPSBibG9jaworCisgICAgZGVmIG5leHRCbG9jayhzZWxmLCBibG9jaz1Ob25lKToKKyAgICAgICAgIyBYWFggdGhpbmsgd2UgbmVlZCB0byBzcGVjaWZ5IHdoZW4gdGhlcmUgaXMgaW1wbGljaXQgdHJhbnNmZXIKKyAgICAgICAgIyBmcm9tIG9uZSBibG9jayB0byB0aGUgbmV4dC4gIG1pZ2h0IGJlIGJldHRlciB0byByZXByZXNlbnQgdGhpcworICAgICAgICAjIHdpdGggZXhwbGljaXQgSlVNUF9BQlNPTFVURSBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgb3B0aW1pemVkCisgICAgICAgICMgb3V0IHdoZW4gdGhleSBhcmUgdW5uZWNlc3NhcnkuCisgICAgICAgICMKKyAgICAgICAgIyBJIHRoaW5rIHRoaXMgc3RyYXRlZ3kgd29ya3M6IGVhY2ggYmxvY2sgaGFzIGEgY2hpbGQKKyAgICAgICAgIyBkZXNpZ25hdGVkIGFzICJuZXh0IiB3aGljaCBpcyByZXR1cm5lZCBhcyB0aGUgbGFzdCBvZiB0aGUKKyAgICAgICAgIyBjaGlsZHJlbi4gIGJlY2F1c2UgdGhlIG5vZGVzIGluIGEgZ3JhcGggYXJlIGVtaXR0ZWQgaW4KKyAgICAgICAgIyByZXZlcnNlIHBvc3Qgb3JkZXIsIHRoZSAibmV4dCIgYmxvY2sgd2lsbCBhbHdheXMgYmUgZW1pdHRlZAorICAgICAgICAjIGltbWVkaWF0ZWx5IGFmdGVyIGl0cyBwYXJlbnQuCisgICAgICAgICMgV29ycnk6IG1haW50YWluaW5nIHRoaXMgaW52YXJpYW50IGNvdWxkIGJlIHRyaWNreQorICAgICAgICBpZiBibG9jayBpcyBOb25lOgorICAgICAgICAgICAgYmxvY2sgPSBzZWxmLm5ld0Jsb2NrKCkKKworICAgICAgICAjIE5vdGU6IElmIHRoZSBjdXJyZW50IGJsb2NrIGVuZHMgd2l0aCBhbiB1bmNvbmRpdGlvbmFsIGNvbnRyb2wKKyAgICAgICAgIyB0cmFuc2ZlciwgdGhlbiBpdCBpcyB0ZWNoaWNhbGx5IGluY29ycmVjdCB0byBhZGQgYW4gaW1wbGljaXQKKyAgICAgICAgIyB0cmFuc2ZlciB0byB0aGUgYmxvY2sgZ3JhcGguIERvaW5nIHNvIHJlc3VsdHMgaW4gY29kZSBnZW5lcmF0aW9uCisgICAgICAgICMgZm9yIHVucmVhY2hhYmxlIGJsb2Nrcy4gIFRoYXQgZG9lc24ndCBhcHBlYXIgdG8gYmUgdmVyeSBjb21tb24KKyAgICAgICAgIyB3aXRoIFB5dGhvbiBjb2RlIGFuZCBzaW5jZSB0aGUgYnVpbHQtaW4gY29tcGlsZXIgZG9lc24ndCBvcHRpbWl6ZQorICAgICAgICAjIGl0IG91dCB3ZSBkb24ndCBlaXRoZXIuCisgICAgICAgIHNlbGYuY3VycmVudC5hZGROZXh0KGJsb2NrKQorICAgICAgICBzZWxmLnN0YXJ0QmxvY2soYmxvY2spCisKKyAgICBkZWYgbmV3QmxvY2soc2VsZik6CisgICAgICAgIGIgPSBCbG9jaygpCisgICAgICAgIHNlbGYuYmxvY2tzLmFkZChiKQorICAgICAgICByZXR1cm4gYgorCisgICAgZGVmIHN0YXJ0RXhpdEJsb2NrKHNlbGYpOgorICAgICAgICBzZWxmLnN0YXJ0QmxvY2soc2VsZi5leGl0KQorCisgICAgX2RlYnVnID0gMAorCisgICAgZGVmIF9lbmFibGVfZGVidWcoc2VsZik6CisgICAgICAgIHNlbGYuX2RlYnVnID0gMQorCisgICAgZGVmIF9kaXNhYmxlX2RlYnVnKHNlbGYpOgorICAgICAgICBzZWxmLl9kZWJ1ZyA9IDAKKworICAgIGRlZiBlbWl0KHNlbGYsICppbnN0KToKKyAgICAgICAgaWYgc2VsZi5fZGVidWc6CisgICAgICAgICAgICBwcmludCAiXHQiLCBpbnN0CisgICAgICAgIGlmIGxlbihpbnN0KSA9PSAyIGFuZCBpc2luc3RhbmNlKGluc3RbMV0sIEJsb2NrKToKKyAgICAgICAgICAgIHNlbGYuY3VycmVudC5hZGRPdXRFZGdlKGluc3RbMV0pCisgICAgICAgIHNlbGYuY3VycmVudC5lbWl0KGluc3QpCisKKyAgICBkZWYgZ2V0QmxvY2tzSW5PcmRlcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBibG9ja3MgaW4gcmV2ZXJzZSBwb3N0b3JkZXIKKworICAgICAgICBpLmUuIGVhY2ggbm9kZSBhcHBlYXJzIGJlZm9yZSBhbGwgb2YgaXRzIHN1Y2Nlc3NvcnMKKyAgICAgICAgIiIiCisgICAgICAgIG9yZGVyID0gb3JkZXJfYmxvY2tzKHNlbGYuZW50cnksIHNlbGYuZXhpdCkKKyAgICAgICAgcmV0dXJuIG9yZGVyCisKKyAgICBkZWYgZ2V0QmxvY2tzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ibG9ja3MuZWxlbWVudHMoKQorCisgICAgZGVmIGdldFJvb3Qoc2VsZik6CisgICAgICAgICIiIlJldHVybiBub2RlcyBhcHByb3ByaWF0ZSBmb3IgdXNlIHdpdGggZG9taW5hdG9yIiIiCisgICAgICAgIHJldHVybiBzZWxmLmVudHJ5CisKKyAgICBkZWYgZ2V0Q29udGFpbmVkR3JhcGhzKHNlbGYpOgorICAgICAgICBsID0gW10KKyAgICAgICAgZm9yIGIgaW4gc2VsZi5nZXRCbG9ja3MoKToKKyAgICAgICAgICAgIGwuZXh0ZW5kKGIuZ2V0Q29udGFpbmVkR3JhcGhzKCkpCisgICAgICAgIHJldHVybiBsCisKKworZGVmIG9yZGVyX2Jsb2NrcyhzdGFydF9ibG9jaywgZXhpdF9ibG9jayk6CisgICAgIiIiT3JkZXIgYmxvY2tzIHNvIHRoYXQgdGhleSBhcmUgZW1pdHRlZCBpbiB0aGUgcmlnaHQgb3JkZXIiIiIKKyAgICAjIFJ1bGVzOgorICAgICMgLSB3aGVuIGEgYmxvY2sgaGFzIGEgbmV4dCBibG9jaywgdGhlIG5leHQgYmxvY2sgbXVzdCBiZSBlbWl0dGVkIGp1c3QgYWZ0ZXIKKyAgICAjIC0gd2hlbiBhIGJsb2NrIGhhcyBmb2xsb3dlcnMgKHJlbGF0aXZlIGp1bXBzKSwgaXQgbXVzdCBiZSBlbWl0dGVkIGJlZm9yZQorICAgICMgICB0aGVtCisgICAgIyAtIGFsbCByZWFjaGFibGUgYmxvY2tzIG11c3QgYmUgZW1pdHRlZAorICAgIG9yZGVyID0gW10KKworICAgICMgRmluZCBhbGwgdGhlIGJsb2NrcyB0byBiZSBlbWl0dGVkLgorICAgIHJlbWFpbmluZyA9IHNldCgpCisgICAgdG9kbyA9IFtzdGFydF9ibG9ja10KKyAgICB3aGlsZSB0b2RvOgorICAgICAgICBiID0gdG9kby5wb3AoKQorICAgICAgICBpZiBiIGluIHJlbWFpbmluZzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHJlbWFpbmluZy5hZGQoYikKKyAgICAgICAgZm9yIGMgaW4gYi5nZXRfY2hpbGRyZW4oKToKKyAgICAgICAgICAgIGlmIGMgbm90IGluIHJlbWFpbmluZzoKKyAgICAgICAgICAgICAgICB0b2RvLmFwcGVuZChjKQorCisgICAgIyBBIGJsb2NrIGlzIGRvbWluYXRlZCBieSBhbm90aGVyIGJsb2NrIGlmIHRoYXQgYmxvY2sgbXVzdCBiZSBlbWl0dGVkCisgICAgIyBiZWZvcmUgaXQuCisgICAgZG9taW5hdG9ycyA9IHt9CisgICAgZm9yIGIgaW4gcmVtYWluaW5nOgorICAgICAgICBpZiBfX2RlYnVnX18gYW5kIGIubmV4dDoKKyAgICAgICAgICAgIGFzc2VydCBiIGlzIGIubmV4dFswXS5wcmV2WzBdLCAoYiwgYi5uZXh0KQorICAgICAgICAjIE1ha2Ugc3VyZSBldmVyeSBibG9jayBhcHBlYXJzIGluIGRvbWluYXRvcnMsIGV2ZW4gaWYgbm8KKyAgICAgICAgIyBvdGhlciBibG9jayBtdXN0IHByZWNlZGUgaXQuCisgICAgICAgIGRvbWluYXRvcnMuc2V0ZGVmYXVsdChiLCBzZXQoKSkKKyAgICAgICAgIyBwcmVjZWVkaW5nIGJsb2NrcyBkb21pbmF0ZSBmb2xsb3dpbmcgYmxvY2tzCisgICAgICAgIGZvciBjIGluIGIuZ2V0X2ZvbGxvd2VycygpOgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBkb21pbmF0b3JzLnNldGRlZmF1bHQoYywgc2V0KCkpLmFkZChiKQorICAgICAgICAgICAgICAgICMgQW55IGJsb2NrIHRoYXQgaGFzIGEgbmV4dCBwb2ludGVyIGxlYWRpbmcgdG8gYyBpcyBhbHNvCisgICAgICAgICAgICAgICAgIyBkb21pbmF0ZWQgYmVjYXVzZSB0aGUgd2hvbGUgY2hhaW4gd2lsbCBiZSBlbWl0dGVkIGF0IG9uY2UuCisgICAgICAgICAgICAgICAgIyBXYWxrIGJhY2t3YXJkcyBhbmQgYWRkIHRoZW0gYWxsLgorICAgICAgICAgICAgICAgIGlmIGMucHJldiBhbmQgYy5wcmV2WzBdIGlzIG5vdCBiOgorICAgICAgICAgICAgICAgICAgICBjID0gYy5wcmV2WzBdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiBmaW5kX25leHQoKToKKyAgICAgICAgIyBGaW5kIGEgYmxvY2sgdGhhdCBjYW4gYmUgZW1pdHRlZCBuZXh0LgorICAgICAgICBmb3IgYiBpbiByZW1haW5pbmc6CisgICAgICAgICAgICBmb3IgYyBpbiBkb21pbmF0b3JzW2JdOgorICAgICAgICAgICAgICAgIGlmIGMgaW4gcmVtYWluaW5nOgorICAgICAgICAgICAgICAgICAgICBicmVhayAjIGNhbid0IGVtaXQgeWV0LCBkb21pbmF0ZWQgYnkgYSByZW1haW5pbmcgYmxvY2sKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGIKKyAgICAgICAgYXNzZXJ0IDAsICdjaXJjdWxhciBkZXBlbmRlbmN5LCBjYW5ub3QgZmluZCBuZXh0IGJsb2NrJworCisgICAgYiA9IHN0YXJ0X2Jsb2NrCisgICAgd2hpbGUgMToKKyAgICAgICAgb3JkZXIuYXBwZW5kKGIpCisgICAgICAgIHJlbWFpbmluZy5kaXNjYXJkKGIpCisgICAgICAgIGlmIGIubmV4dDoKKyAgICAgICAgICAgIGIgPSBiLm5leHRbMF0KKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGVsaWYgYiBpcyBub3QgZXhpdF9ibG9jayBhbmQgbm90IGIuaGFzX3VuY29uZGl0aW9uYWxfdHJhbnNmZXIoKToKKyAgICAgICAgICAgIG9yZGVyLmFwcGVuZChleGl0X2Jsb2NrKQorICAgICAgICBpZiBub3QgcmVtYWluaW5nOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgYiA9IGZpbmRfbmV4dCgpCisgICAgcmV0dXJuIG9yZGVyCisKKworY2xhc3MgQmxvY2s6CisgICAgX2NvdW50ID0gMAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhYmVsPScnKToKKyAgICAgICAgc2VsZi5pbnN0cyA9IFtdCisgICAgICAgIHNlbGYub3V0RWRnZXMgPSBzZXQoKQorICAgICAgICBzZWxmLmxhYmVsID0gbGFiZWwKKyAgICAgICAgc2VsZi5iaWQgPSBCbG9jay5fY291bnQKKyAgICAgICAgc2VsZi5uZXh0ID0gW10KKyAgICAgICAgc2VsZi5wcmV2ID0gW10KKyAgICAgICAgQmxvY2suX2NvdW50ID0gQmxvY2suX2NvdW50ICsgMQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmxhYmVsOgorICAgICAgICAgICAgcmV0dXJuICI8YmxvY2sgJXMgaWQ9JWQ+IiAlIChzZWxmLmxhYmVsLCBzZWxmLmJpZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiPGJsb2NrIGlkPSVkPiIgJSAoc2VsZi5iaWQpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaW5zdHMgPSBtYXAoc3RyLCBzZWxmLmluc3RzKQorICAgICAgICByZXR1cm4gIjxibG9jayAlcyAlZDpcbiVzPiIgJSAoc2VsZi5sYWJlbCwgc2VsZi5iaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nLmpvaW4oaW5zdHMpKQorCisgICAgZGVmIGVtaXQoc2VsZiwgaW5zdCk6CisgICAgICAgIG9wID0gaW5zdFswXQorICAgICAgICBzZWxmLmluc3RzLmFwcGVuZChpbnN0KQorCisgICAgZGVmIGdldEluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5zdHMKKworICAgIGRlZiBhZGRPdXRFZGdlKHNlbGYsIGJsb2NrKToKKyAgICAgICAgc2VsZi5vdXRFZGdlcy5hZGQoYmxvY2spCisKKyAgICBkZWYgYWRkTmV4dChzZWxmLCBibG9jayk6CisgICAgICAgIHNlbGYubmV4dC5hcHBlbmQoYmxvY2spCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5uZXh0KSA9PSAxLCBtYXAoc3RyLCBzZWxmLm5leHQpCisgICAgICAgIGJsb2NrLnByZXYuYXBwZW5kKHNlbGYpCisgICAgICAgIGFzc2VydCBsZW4oYmxvY2sucHJldikgPT0gMSwgbWFwKHN0ciwgYmxvY2sucHJldikKKworICAgIF91bmNvbmRfdHJhbnNmZXIgPSAoJ1JFVFVSTl9WQUxVRScsICdSQUlTRV9WQVJBUkdTJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdKVU1QX0FCU09MVVRFJywgJ0pVTVBfRk9SV0FSRCcsICdDT05USU5VRV9MT09QJywKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBoYXNfdW5jb25kaXRpb25hbF90cmFuc2ZlcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBUcnVlIGlmIHRoZXJlIGlzIGFuIHVuY29uZGl0aW9uYWwgdHJhbnNmZXIgdG8gYW4gb3RoZXIgYmxvY2sKKyAgICAgICAgYXQgdGhlIGVuZCBvZiB0aGlzIGJsb2NrLiBUaGlzIG1lYW5zIHRoZXJlIGlzIG5vIHJpc2sgZm9yIHRoZSBieXRlY29kZQorICAgICAgICBleGVjdXRlciB0byBnbyBwYXN0IHRoaXMgYmxvY2sncyBieXRlY29kZS4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3AsIGFyZyA9IHNlbGYuaW5zdHNbLTFdCisgICAgICAgIGV4Y2VwdCAoSW5kZXhFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcmV0dXJuIG9wIGluIHNlbGYuX3VuY29uZF90cmFuc2ZlcgorCisgICAgZGVmIGdldF9jaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5vdXRFZGdlcykgKyBzZWxmLm5leHQKKworICAgIGRlZiBnZXRfZm9sbG93ZXJzKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIHdob2xlIGxpc3Qgb2YgZm9sbG93ZXJzLCBpbmNsdWRpbmcgdGhlIG5leHQgYmxvY2suIiIiCisgICAgICAgIGZvbGxvd2VycyA9IHNldChzZWxmLm5leHQpCisgICAgICAgICMgQmxvY2tzIHRoYXQgbXVzdCBiZSBlbWl0dGVkICphZnRlciogdGhpcyBvbmUsIGJlY2F1c2Ugb2YKKyAgICAgICAgIyBieXRlY29kZSBvZmZzZXRzIChlLmcuIHJlbGF0aXZlIGp1bXBzKSBwb2ludGluZyB0byB0aGVtLgorICAgICAgICBmb3IgaW5zdCBpbiBzZWxmLmluc3RzOgorICAgICAgICAgICAgaWYgaW5zdFswXSBpbiBQeUZsb3dHcmFwaC5oYXNqcmVsOgorICAgICAgICAgICAgICAgIGZvbGxvd2Vycy5hZGQoaW5zdFsxXSkKKyAgICAgICAgcmV0dXJuIGZvbGxvd2VycworCisgICAgZGVmIGdldENvbnRhaW5lZEdyYXBocyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFsbCBncmFwaHMgY29udGFpbmVkIHdpdGhpbiB0aGlzIGJsb2NrLgorCisgICAgICAgIEZvciBleGFtcGxlLCBhIE1BS0VfRlVOQ1RJT04gYmxvY2sgd2lsbCBjb250YWluIGEgcmVmZXJlbmNlIHRvCisgICAgICAgIHRoZSBncmFwaCBmb3IgdGhlIGZ1bmN0aW9uIGJvZHkuCisgICAgICAgICIiIgorICAgICAgICBjb250YWluZWQgPSBbXQorICAgICAgICBmb3IgaW5zdCBpbiBzZWxmLmluc3RzOgorICAgICAgICAgICAgaWYgbGVuKGluc3QpID09IDE6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG9wID0gaW5zdFsxXQorICAgICAgICAgICAgaWYgaGFzYXR0cihvcCwgJ2dyYXBoJyk6CisgICAgICAgICAgICAgICAgY29udGFpbmVkLmFwcGVuZChvcC5ncmFwaCkKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lZAorCisjIGZsYWdzIGZvciBjb2RlIG9iamVjdHMKKworIyB0aGUgRmxvd0dyYXBoIGlzIHRyYW5zZm9ybWVkIGluIHBsYWNlOyBpdCBleGlzdHMgaW4gb25lIG9mIHRoZXNlIHN0YXRlcworUkFXID0gIlJBVyIKK0ZMQVQgPSAiRkxBVCIKK0NPTlYgPSAiQ09OViIKK0RPTkUgPSAiRE9ORSIKKworY2xhc3MgUHlGbG93R3JhcGgoRmxvd0dyYXBoKToKKyAgICBzdXBlcl9pbml0ID0gRmxvd0dyYXBoLl9faW5pdF9fCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZmlsZW5hbWUsIGFyZ3M9KCksIG9wdGltaXplZD0wLCBrbGFzcz1Ob25lKToKKyAgICAgICAgc2VsZi5zdXBlcl9pbml0KCkKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5kb2NzdHJpbmcgPSBOb25lCisgICAgICAgIHNlbGYuYXJncyA9IGFyZ3MgIyBYWFgKKyAgICAgICAgc2VsZi5hcmdjb3VudCA9IGdldEFyZ0NvdW50KGFyZ3MpCisgICAgICAgIHNlbGYua2xhc3MgPSBrbGFzcworICAgICAgICBpZiBvcHRpbWl6ZWQ6CisgICAgICAgICAgICBzZWxmLmZsYWdzID0gQ09fT1BUSU1JWkVEIHwgQ09fTkVXTE9DQUxTCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZsYWdzID0gMAorICAgICAgICBzZWxmLmNvbnN0cyA9IFtdCisgICAgICAgIHNlbGYubmFtZXMgPSBbXQorICAgICAgICAjIEZyZWUgdmFyaWFibGVzIGZvdW5kIGJ5IHRoZSBzeW1ib2wgdGFibGUgc2NhbiwgaW5jbHVkaW5nCisgICAgICAgICMgdmFyaWFibGVzIHVzZWQgb25seSBpbiBuZXN0ZWQgc2NvcGVzLCBhcmUgaW5jbHVkZWQgaGVyZS4KKyAgICAgICAgc2VsZi5mcmVldmFycyA9IFtdCisgICAgICAgIHNlbGYuY2VsbHZhcnMgPSBbXQorICAgICAgICAjIFRoZSBjbG9zdXJlIGxpc3QgaXMgdXNlZCB0byB0cmFjayB0aGUgb3JkZXIgb2YgY2VsbAorICAgICAgICAjIHZhcmlhYmxlcyBhbmQgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIHJlc3VsdGluZyBjb2RlIG9iamVjdC4KKyAgICAgICAgIyBUaGUgb2Zmc2V0cyB1c2VkIGJ5IExPQURfQ0xPU1VSRS9MT0FEX0RFUkVGIHJlZmVyIHRvIGJvdGgKKyAgICAgICAgIyBraW5kcyBvZiB2YXJpYWJsZXMuCisgICAgICAgIHNlbGYuY2xvc3VyZSA9IFtdCisgICAgICAgIHNlbGYudmFybmFtZXMgPSBsaXN0KGFyZ3MpIG9yIFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnZhcm5hbWVzKSk6CisgICAgICAgICAgICB2YXIgPSBzZWxmLnZhcm5hbWVzW2ldCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhciwgVHVwbGVBcmcpOgorICAgICAgICAgICAgICAgIHNlbGYudmFybmFtZXNbaV0gPSB2YXIuZ2V0TmFtZSgpCisgICAgICAgIHNlbGYuc3RhZ2UgPSBSQVcKKworICAgIGRlZiBzZXREb2NzdHJpbmcoc2VsZiwgZG9jKToKKyAgICAgICAgc2VsZi5kb2NzdHJpbmcgPSBkb2MKKworICAgIGRlZiBzZXRGbGFnKHNlbGYsIGZsYWcpOgorICAgICAgICBzZWxmLmZsYWdzID0gc2VsZi5mbGFncyB8IGZsYWcKKyAgICAgICAgaWYgZmxhZyA9PSBDT19WQVJBUkdTOgorICAgICAgICAgICAgc2VsZi5hcmdjb3VudCA9IHNlbGYuYXJnY291bnQgLSAxCisKKyAgICBkZWYgY2hlY2tGbGFnKHNlbGYsIGZsYWcpOgorICAgICAgICBpZiBzZWxmLmZsYWdzICYgZmxhZzoKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgc2V0RnJlZVZhcnMoc2VsZiwgbmFtZXMpOgorICAgICAgICBzZWxmLmZyZWV2YXJzID0gbGlzdChuYW1lcykKKworICAgIGRlZiBzZXRDZWxsVmFycyhzZWxmLCBuYW1lcyk6CisgICAgICAgIHNlbGYuY2VsbHZhcnMgPSBuYW1lcworCisgICAgZGVmIGdldENvZGUoc2VsZik6CisgICAgICAgICIiIkdldCBhIFB5dGhvbiBjb2RlIG9iamVjdCIiIgorICAgICAgICBhc3NlcnQgc2VsZi5zdGFnZSA9PSBSQVcKKyAgICAgICAgc2VsZi5jb21wdXRlU3RhY2tEZXB0aCgpCisgICAgICAgIHNlbGYuZmxhdHRlbkdyYXBoKCkKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhZ2UgPT0gRkxBVAorICAgICAgICBzZWxmLmNvbnZlcnRBcmdzKCkKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhZ2UgPT0gQ09OVgorICAgICAgICBzZWxmLm1ha2VCeXRlQ29kZSgpCisgICAgICAgIGFzc2VydCBzZWxmLnN0YWdlID09IERPTkUKKyAgICAgICAgcmV0dXJuIHNlbGYubmV3Q29kZU9iamVjdCgpCisKKyAgICBkZWYgZHVtcChzZWxmLCBpbz1Ob25lKToKKyAgICAgICAgaWYgaW86CisgICAgICAgICAgICBzYXZlID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IGlvCisgICAgICAgIHBjID0gMAorICAgICAgICBmb3IgdCBpbiBzZWxmLmluc3RzOgorICAgICAgICAgICAgb3BuYW1lID0gdFswXQorICAgICAgICAgICAgaWYgb3BuYW1lID09ICJTRVRfTElORU5PIjoKKyAgICAgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgaWYgbGVuKHQpID09IDE6CisgICAgICAgICAgICAgICAgcHJpbnQgIlx0IiwgIiUzZCIgJSBwYywgb3BuYW1lCisgICAgICAgICAgICAgICAgcGMgPSBwYyArIDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIlx0IiwgIiUzZCIgJSBwYywgb3BuYW1lLCB0WzFdCisgICAgICAgICAgICAgICAgcGMgPSBwYyArIDMKKyAgICAgICAgaWYgaW86CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZQorCisgICAgZGVmIGNvbXB1dGVTdGFja0RlcHRoKHNlbGYpOgorICAgICAgICAiIiJDb21wdXRlIHRoZSBtYXggc3RhY2sgZGVwdGguCisKKyAgICAgICAgQXBwcm9hY2ggaXMgdG8gY29tcHV0ZSB0aGUgc3RhY2sgZWZmZWN0IG9mIGVhY2ggYmFzaWMgYmxvY2suCisgICAgICAgIFRoZW4gZmluZCB0aGUgcGF0aCB0aHJvdWdoIHRoZSBjb2RlIHdpdGggdGhlIGxhcmdlc3QgdG90YWwKKyAgICAgICAgZWZmZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgZGVwdGggPSB7fQorICAgICAgICBleGl0ID0gTm9uZQorICAgICAgICBmb3IgYiBpbiBzZWxmLmdldEJsb2NrcygpOgorICAgICAgICAgICAgZGVwdGhbYl0gPSBmaW5kRGVwdGgoYi5nZXRJbnN0cnVjdGlvbnMoKSkKKworICAgICAgICBzZWVuID0ge30KKworICAgICAgICBkZWYgbWF4X2RlcHRoKGIsIGQpOgorICAgICAgICAgICAgaWYgYiBpbiBzZWVuOgorICAgICAgICAgICAgICAgIHJldHVybiBkCisgICAgICAgICAgICBzZWVuW2JdID0gMQorICAgICAgICAgICAgZCA9IGQgKyBkZXB0aFtiXQorICAgICAgICAgICAgY2hpbGRyZW4gPSBiLmdldF9jaGlsZHJlbigpCisgICAgICAgICAgICBpZiBjaGlsZHJlbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF4KFttYXhfZGVwdGgoYywgZCkgZm9yIGMgaW4gY2hpbGRyZW5dKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBub3QgYi5sYWJlbCA9PSAiZXhpdCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXhfZGVwdGgoc2VsZi5leGl0LCBkKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkCisKKyAgICAgICAgc2VsZi5zdGFja3NpemUgPSBtYXhfZGVwdGgoc2VsZi5lbnRyeSwgMCkKKworICAgIGRlZiBmbGF0dGVuR3JhcGgoc2VsZik6CisgICAgICAgICIiIkFycmFuZ2UgdGhlIGJsb2NrcyBpbiBvcmRlciBhbmQgcmVzb2x2ZSBqdW1wcyIiIgorICAgICAgICBhc3NlcnQgc2VsZi5zdGFnZSA9PSBSQVcKKyAgICAgICAgc2VsZi5pbnN0cyA9IGluc3RzID0gW10KKyAgICAgICAgcGMgPSAwCisgICAgICAgIGJlZ2luID0ge30KKyAgICAgICAgZW5kID0ge30KKyAgICAgICAgZm9yIGIgaW4gc2VsZi5nZXRCbG9ja3NJbk9yZGVyKCk6CisgICAgICAgICAgICBiZWdpbltiXSA9IHBjCisgICAgICAgICAgICBmb3IgaW5zdCBpbiBiLmdldEluc3RydWN0aW9ucygpOgorICAgICAgICAgICAgICAgIGluc3RzLmFwcGVuZChpbnN0KQorICAgICAgICAgICAgICAgIGlmIGxlbihpbnN0KSA9PSAxOgorICAgICAgICAgICAgICAgICAgICBwYyA9IHBjICsgMQorICAgICAgICAgICAgICAgIGVsaWYgaW5zdFswXSAhPSAiU0VUX0xJTkVOTyI6CisgICAgICAgICAgICAgICAgICAgICMgYXJnIHRha2VzIDIgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgcGMgPSBwYyArIDMKKyAgICAgICAgICAgIGVuZFtiXSA9IHBjCisgICAgICAgIHBjID0gMAorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oaW5zdHMpKToKKyAgICAgICAgICAgIGluc3QgPSBpbnN0c1tpXQorICAgICAgICAgICAgaWYgbGVuKGluc3QpID09IDE6CisgICAgICAgICAgICAgICAgcGMgPSBwYyArIDEKKyAgICAgICAgICAgIGVsaWYgaW5zdFswXSAhPSAiU0VUX0xJTkVOTyI6CisgICAgICAgICAgICAgICAgcGMgPSBwYyArIDMKKyAgICAgICAgICAgIG9wbmFtZSA9IGluc3RbMF0KKyAgICAgICAgICAgIGlmIG9wbmFtZSBpbiBzZWxmLmhhc2pyZWw6CisgICAgICAgICAgICAgICAgb3BhcmcgPSBpbnN0WzFdCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gYmVnaW5bb3BhcmddIC0gcGMKKyAgICAgICAgICAgICAgICBpbnN0c1tpXSA9IG9wbmFtZSwgb2Zmc2V0CisgICAgICAgICAgICBlbGlmIG9wbmFtZSBpbiBzZWxmLmhhc2phYnM6CisgICAgICAgICAgICAgICAgaW5zdHNbaV0gPSBvcG5hbWUsIGJlZ2luW2luc3RbMV1dCisgICAgICAgIHNlbGYuc3RhZ2UgPSBGTEFUCisKKyAgICBoYXNqcmVsID0gc2V0KCkKKyAgICBmb3IgaSBpbiBkaXMuaGFzanJlbDoKKyAgICAgICAgaGFzanJlbC5hZGQoZGlzLm9wbmFtZVtpXSkKKyAgICBoYXNqYWJzID0gc2V0KCkKKyAgICBmb3IgaSBpbiBkaXMuaGFzamFiczoKKyAgICAgICAgaGFzamFicy5hZGQoZGlzLm9wbmFtZVtpXSkKKworICAgIGRlZiBjb252ZXJ0QXJncyhzZWxmKToKKyAgICAgICAgIiIiQ29udmVydCBhcmd1bWVudHMgZnJvbSBzeW1ib2xpYyB0byBjb25jcmV0ZSBmb3JtIiIiCisgICAgICAgIGFzc2VydCBzZWxmLnN0YWdlID09IEZMQVQKKyAgICAgICAgc2VsZi5jb25zdHMuaW5zZXJ0KDAsIHNlbGYuZG9jc3RyaW5nKQorICAgICAgICBzZWxmLnNvcnRfY2VsbHZhcnMoKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5pbnN0cykpOgorICAgICAgICAgICAgdCA9IHNlbGYuaW5zdHNbaV0KKyAgICAgICAgICAgIGlmIGxlbih0KSA9PSAyOgorICAgICAgICAgICAgICAgIG9wbmFtZSwgb3BhcmcgPSB0CisgICAgICAgICAgICAgICAgY29udiA9IHNlbGYuX2NvbnZlcnRlcnMuZ2V0KG9wbmFtZSwgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiBjb252OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RzW2ldID0gb3BuYW1lLCBjb252KHNlbGYsIG9wYXJnKQorICAgICAgICBzZWxmLnN0YWdlID0gQ09OVgorCisgICAgZGVmIHNvcnRfY2VsbHZhcnMoc2VsZik6CisgICAgICAgICIiIlNvcnQgY2VsbHZhcnMgaW4gdGhlIG9yZGVyIG9mIHZhcm5hbWVzIGFuZCBwcnVuZSBmcm9tIGZyZWV2YXJzLgorICAgICAgICAiIiIKKyAgICAgICAgY2VsbHMgPSB7fQorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmNlbGx2YXJzOgorICAgICAgICAgICAgY2VsbHNbbmFtZV0gPSAxCisgICAgICAgIHNlbGYuY2VsbHZhcnMgPSBbbmFtZSBmb3IgbmFtZSBpbiBzZWxmLnZhcm5hbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBpbiBjZWxsc10KKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5jZWxsdmFyczoKKyAgICAgICAgICAgIGRlbCBjZWxsc1tuYW1lXQorICAgICAgICBzZWxmLmNlbGx2YXJzID0gc2VsZi5jZWxsdmFycyArIGNlbGxzLmtleXMoKQorICAgICAgICBzZWxmLmNsb3N1cmUgPSBzZWxmLmNlbGx2YXJzICsgc2VsZi5mcmVldmFycworCisgICAgZGVmIF9sb29rdXBOYW1lKHNlbGYsIG5hbWUsIGxpc3QpOgorICAgICAgICAiIiJSZXR1cm4gaW5kZXggb2YgbmFtZSBpbiBsaXN0LCBhcHBlbmRpbmcgaWYgbmVjZXNzYXJ5CisKKyAgICAgICAgVGhpcyByb3V0aW5lIHVzZXMgYSBsaXN0IGluc3RlYWQgb2YgYSBkaWN0aW9uYXJ5LCBiZWNhdXNlIGEKKyAgICAgICAgZGljdGlvbmFyeSBjYW4ndCBzdG9yZSB0d28gZGlmZmVyZW50IGtleXMgaWYgdGhlIGtleXMgaGF2ZSB0aGUKKyAgICAgICAgc2FtZSB2YWx1ZSBidXQgZGlmZmVyZW50IHR5cGVzLCBlLmcuIDIgYW5kIDJMLiAgVGhlIGNvbXBpbGVyCisgICAgICAgIG11c3QgdHJlYXQgdGhlc2UgdHdvIHNlcGFyYXRlbHksIHNvIGl0IGRvZXMgYW4gZXhwbGljaXQgdHlwZQorICAgICAgICBjb21wYXJpc29uIGJlZm9yZSBjb21wYXJpbmcgdGhlIHZhbHVlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHQgPSB0eXBlKG5hbWUpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihsaXN0KSk6CisgICAgICAgICAgICBpZiB0ID09IHR5cGUobGlzdFtpXSkgYW5kIGxpc3RbaV0gPT0gbmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gaQorICAgICAgICBlbmQgPSBsZW4obGlzdCkKKyAgICAgICAgbGlzdC5hcHBlbmQobmFtZSkKKyAgICAgICAgcmV0dXJuIGVuZAorCisgICAgX2NvbnZlcnRlcnMgPSB7fQorICAgIGRlZiBfY29udmVydF9MT0FEX0NPTlNUKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIGhhc2F0dHIoYXJnLCAnZ2V0Q29kZScpOgorICAgICAgICAgICAgYXJnID0gYXJnLmdldENvZGUoKQorICAgICAgICByZXR1cm4gc2VsZi5fbG9va3VwTmFtZShhcmcsIHNlbGYuY29uc3RzKQorCisgICAgZGVmIF9jb252ZXJ0X0xPQURfRkFTVChzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLl9sb29rdXBOYW1lKGFyZywgc2VsZi5uYW1lcykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xvb2t1cE5hbWUoYXJnLCBzZWxmLnZhcm5hbWVzKQorICAgIF9jb252ZXJ0X1NUT1JFX0ZBU1QgPSBfY29udmVydF9MT0FEX0ZBU1QKKyAgICBfY29udmVydF9ERUxFVEVfRkFTVCA9IF9jb252ZXJ0X0xPQURfRkFTVAorCisgICAgZGVmIF9jb252ZXJ0X0xPQURfTkFNRShzZWxmLCBhcmcpOgorICAgICAgICBpZiBzZWxmLmtsYXNzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9sb29rdXBOYW1lKGFyZywgc2VsZi52YXJuYW1lcykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xvb2t1cE5hbWUoYXJnLCBzZWxmLm5hbWVzKQorCisgICAgZGVmIF9jb252ZXJ0X05BTUUoc2VsZiwgYXJnKToKKyAgICAgICAgaWYgc2VsZi5rbGFzcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fbG9va3VwTmFtZShhcmcsIHNlbGYudmFybmFtZXMpCisgICAgICAgIHJldHVybiBzZWxmLl9sb29rdXBOYW1lKGFyZywgc2VsZi5uYW1lcykKKyAgICBfY29udmVydF9TVE9SRV9OQU1FID0gX2NvbnZlcnRfTkFNRQorICAgIF9jb252ZXJ0X0RFTEVURV9OQU1FID0gX2NvbnZlcnRfTkFNRQorICAgIF9jb252ZXJ0X0lNUE9SVF9OQU1FID0gX2NvbnZlcnRfTkFNRQorICAgIF9jb252ZXJ0X0lNUE9SVF9GUk9NID0gX2NvbnZlcnRfTkFNRQorICAgIF9jb252ZXJ0X1NUT1JFX0FUVFIgPSBfY29udmVydF9OQU1FCisgICAgX2NvbnZlcnRfTE9BRF9BVFRSID0gX2NvbnZlcnRfTkFNRQorICAgIF9jb252ZXJ0X0RFTEVURV9BVFRSID0gX2NvbnZlcnRfTkFNRQorICAgIF9jb252ZXJ0X0xPQURfR0xPQkFMID0gX2NvbnZlcnRfTkFNRQorICAgIF9jb252ZXJ0X1NUT1JFX0dMT0JBTCA9IF9jb252ZXJ0X05BTUUKKyAgICBfY29udmVydF9ERUxFVEVfR0xPQkFMID0gX2NvbnZlcnRfTkFNRQorCisgICAgZGVmIF9jb252ZXJ0X0RFUkVGKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuX2xvb2t1cE5hbWUoYXJnLCBzZWxmLm5hbWVzKQorICAgICAgICBzZWxmLl9sb29rdXBOYW1lKGFyZywgc2VsZi52YXJuYW1lcykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xvb2t1cE5hbWUoYXJnLCBzZWxmLmNsb3N1cmUpCisgICAgX2NvbnZlcnRfTE9BRF9ERVJFRiA9IF9jb252ZXJ0X0RFUkVGCisgICAgX2NvbnZlcnRfU1RPUkVfREVSRUYgPSBfY29udmVydF9ERVJFRgorCisgICAgZGVmIF9jb252ZXJ0X0xPQURfQ0xPU1VSRShzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLl9sb29rdXBOYW1lKGFyZywgc2VsZi52YXJuYW1lcykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xvb2t1cE5hbWUoYXJnLCBzZWxmLmNsb3N1cmUpCisKKyAgICBfY21wID0gbGlzdChkaXMuY21wX29wKQorICAgIGRlZiBfY29udmVydF9DT01QQVJFX09QKHNlbGYsIGFyZyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jbXAuaW5kZXgoYXJnKQorCisgICAgIyBzaW1pbGFybHkgZm9yIG90aGVyIG9wY29kZXMuLi4KKworICAgIGZvciBuYW1lLCBvYmogaW4gbG9jYWxzKCkuaXRlbXMoKToKKyAgICAgICAgaWYgbmFtZVs6OV0gPT0gIl9jb252ZXJ0XyI6CisgICAgICAgICAgICBvcG5hbWUgPSBuYW1lWzk6XQorICAgICAgICAgICAgX2NvbnZlcnRlcnNbb3BuYW1lXSA9IG9iagorICAgIGRlbCBuYW1lLCBvYmosIG9wbmFtZQorCisgICAgZGVmIG1ha2VCeXRlQ29kZShzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhZ2UgPT0gQ09OVgorICAgICAgICBzZWxmLmxub3RhYiA9IGxub3RhYiA9IExpbmVBZGRyVGFibGUoKQorICAgICAgICBmb3IgdCBpbiBzZWxmLmluc3RzOgorICAgICAgICAgICAgb3BuYW1lID0gdFswXQorICAgICAgICAgICAgaWYgbGVuKHQpID09IDE6CisgICAgICAgICAgICAgICAgbG5vdGFiLmFkZENvZGUoc2VsZi5vcG51bVtvcG5hbWVdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcGFyZyA9IHRbMV0KKyAgICAgICAgICAgICAgICBpZiBvcG5hbWUgPT0gIlNFVF9MSU5FTk8iOgorICAgICAgICAgICAgICAgICAgICBsbm90YWIubmV4dExpbmUob3BhcmcpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaGksIGxvID0gdHdvYnl0ZShvcGFyZykKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGxub3RhYi5hZGRDb2RlKHNlbGYub3BudW1bb3BuYW1lXSwgbG8sIGhpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwcmludCBvcG5hbWUsIG9wYXJnCisgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYub3BudW1bb3BuYW1lXSwgbG8sIGhpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHNlbGYuc3RhZ2UgPSBET05FCisKKyAgICBvcG51bSA9IHt9CisgICAgZm9yIG51bSBpbiByYW5nZShsZW4oZGlzLm9wbmFtZSkpOgorICAgICAgICBvcG51bVtkaXMub3BuYW1lW251bV1dID0gbnVtCisgICAgZGVsIG51bQorCisgICAgZGVmIG5ld0NvZGVPYmplY3Qoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLnN0YWdlID09IERPTkUKKyAgICAgICAgaWYgKHNlbGYuZmxhZ3MgJiBDT19ORVdMT0NBTFMpID09IDA6CisgICAgICAgICAgICBubG9jYWxzID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmxvY2FscyA9IGxlbihzZWxmLnZhcm5hbWVzKQorICAgICAgICBhcmdjb3VudCA9IHNlbGYuYXJnY291bnQKKyAgICAgICAgaWYgc2VsZi5mbGFncyAmIENPX1ZBUktFWVdPUkRTOgorICAgICAgICAgICAgYXJnY291bnQgPSBhcmdjb3VudCAtIDEKKyAgICAgICAgcmV0dXJuIHR5cGVzLkNvZGVUeXBlKGFyZ2NvdW50LCBubG9jYWxzLCBzZWxmLnN0YWNrc2l6ZSwgc2VsZi5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG5vdGFiLmdldENvZGUoKSwgc2VsZi5nZXRDb25zdHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlKHNlbGYubmFtZXMpLCB0dXBsZShzZWxmLnZhcm5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUsIHNlbGYubmFtZSwgc2VsZi5sbm90YWIuZmlyc3RsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sbm90YWIuZ2V0VGFibGUoKSwgdHVwbGUoc2VsZi5mcmVldmFycyksCisgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZShzZWxmLmNlbGx2YXJzKSkKKworICAgIGRlZiBnZXRDb25zdHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIHR1cGxlIGZvciB0aGUgY29uc3Qgc2xvdCBvZiB0aGUgY29kZSBvYmplY3QKKworICAgICAgICBNdXN0IGNvbnZlcnQgcmVmZXJlbmNlcyB0byBjb2RlIChNQUtFX0ZVTkNUSU9OKSB0byBjb2RlCisgICAgICAgIG9iamVjdHMgcmVjdXJzaXZlbHkuCisgICAgICAgICIiIgorICAgICAgICBsID0gW10KKyAgICAgICAgZm9yIGVsdCBpbiBzZWxmLmNvbnN0czoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZWx0LCBQeUZsb3dHcmFwaCk6CisgICAgICAgICAgICAgICAgZWx0ID0gZWx0LmdldENvZGUoKQorICAgICAgICAgICAgbC5hcHBlbmQoZWx0KQorICAgICAgICByZXR1cm4gdHVwbGUobCkKKworZGVmIGlzSnVtcChvcG5hbWUpOgorICAgIGlmIG9wbmFtZVs6NF0gPT0gJ0pVTVAnOgorICAgICAgICByZXR1cm4gMQorCitjbGFzcyBUdXBsZUFyZzoKKyAgICAiIiJIZWxwZXIgZm9yIG1hcmtpbmcgZnVuYyBkZWZzIHdpdGggbmVzdGVkIHR1cGxlcyBpbiBhcmdsaXN0IiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvdW50LCBuYW1lcyk6CisgICAgICAgIHNlbGYuY291bnQgPSBjb3VudAorICAgICAgICBzZWxmLm5hbWVzID0gbmFtZXMKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiVHVwbGVBcmcoJXMsICVzKSIgJSAoc2VsZi5jb3VudCwgc2VsZi5uYW1lcykKKyAgICBkZWYgZ2V0TmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuICIuJWQiICUgc2VsZi5jb3VudAorCitkZWYgZ2V0QXJnQ291bnQoYXJncyk6CisgICAgYXJnY291bnQgPSBsZW4oYXJncykKKyAgICBpZiBhcmdzOgorICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgVHVwbGVBcmcpOgorICAgICAgICAgICAgICAgIG51bU5hbWVzID0gbGVuKG1pc2MuZmxhdHRlbihhcmcubmFtZXMpKQorICAgICAgICAgICAgICAgIGFyZ2NvdW50ID0gYXJnY291bnQgLSBudW1OYW1lcworICAgIHJldHVybiBhcmdjb3VudAorCitkZWYgdHdvYnl0ZSh2YWwpOgorICAgICIiIkNvbnZlcnQgYW4gaW50IGFyZ3VtZW50IGludG8gaGlnaCBhbmQgbG93IGJ5dGVzIiIiCisgICAgYXNzZXJ0IGlzaW5zdGFuY2UodmFsLCBpbnQpCisgICAgcmV0dXJuIGRpdm1vZCh2YWwsIDI1NikKKworY2xhc3MgTGluZUFkZHJUYWJsZToKKyAgICAiIiJsbm90YWIKKworICAgIFRoaXMgY2xhc3MgYnVpbGRzIHRoZSBsbm90YWIsIHdoaWNoIGlzIGRvY3VtZW50ZWQgaW4gY29tcGlsZS5jLgorICAgIEhlcmUncyBhIGJyaWVmIHJlY2FwOgorCisgICAgRm9yIGVhY2ggU0VUX0xJTkVOTyBpbnN0cnVjdGlvbiBhZnRlciB0aGUgZmlyc3Qgb25lLCB0d28gYnl0ZXMgYXJlCisgICAgYWRkZWQgdG8gbG5vdGFiLiAgKEluIHNvbWUgY2FzZXMsIG11bHRpcGxlIHR3by1ieXRlIGVudHJpZXMgYXJlCisgICAgYWRkZWQuKSAgVGhlIGZpcnN0IGJ5dGUgaXMgdGhlIGRpc3RhbmNlIGluIGJ5dGVzIGJldHdlZW4gdGhlCisgICAgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBsYXN0IFNFVF9MSU5FTk8gYW5kIHRoZSBjdXJyZW50IFNFVF9MSU5FTk8uCisgICAgVGhlIHNlY29uZCBieXRlIGlzIG9mZnNldCBpbiBsaW5lIG51bWJlcnMuICBJZiBlaXRoZXIgb2Zmc2V0IGlzCisgICAgZ3JlYXRlciB0aGFuIDI1NSwgbXVsdGlwbGUgdHdvLWJ5dGUgZW50cmllcyBhcmUgYWRkZWQgLS0gc2VlCisgICAgY29tcGlsZS5jIGZvciB0aGUgZGVsaWNhdGUgZGV0YWlscy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jb2RlID0gW10KKyAgICAgICAgc2VsZi5jb2RlT2Zmc2V0ID0gMAorICAgICAgICBzZWxmLmZpcnN0bGluZSA9IDAKKyAgICAgICAgc2VsZi5sYXN0bGluZSA9IDAKKyAgICAgICAgc2VsZi5sYXN0b2ZmID0gMAorICAgICAgICBzZWxmLmxub3RhYiA9IFtdCisKKyAgICBkZWYgYWRkQ29kZShzZWxmLCAqYXJncyk6CisgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgIHNlbGYuY29kZS5hcHBlbmQoY2hyKGFyZykpCisgICAgICAgIHNlbGYuY29kZU9mZnNldCA9IHNlbGYuY29kZU9mZnNldCArIGxlbihhcmdzKQorCisgICAgZGVmIG5leHRMaW5lKHNlbGYsIGxpbmVubyk6CisgICAgICAgIGlmIHNlbGYuZmlyc3RsaW5lID09IDA6CisgICAgICAgICAgICBzZWxmLmZpcnN0bGluZSA9IGxpbmVubworICAgICAgICAgICAgc2VsZi5sYXN0bGluZSA9IGxpbmVubworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBjb21wdXRlIGRlbHRhcworICAgICAgICAgICAgYWRkciA9IHNlbGYuY29kZU9mZnNldCAtIHNlbGYubGFzdG9mZgorICAgICAgICAgICAgbGluZSA9IGxpbmVubyAtIHNlbGYubGFzdGxpbmUKKyAgICAgICAgICAgICMgUHl0aG9uIGFzc3VtZXMgdGhhdCBsaW5lbm8gYWx3YXlzIGluY3JlYXNlcyB3aXRoCisgICAgICAgICAgICAjIGluY3JlYXNpbmcgYnl0ZWNvZGUgYWRkcmVzcyAobG5vdGFiIGlzIHVuc2lnbmVkIGNoYXIpLgorICAgICAgICAgICAgIyBEZXBlbmRpbmcgb24gd2hlbiBTRVRfTElORU5PIGluc3RydWN0aW9ucyBhcmUgZW1pdHRlZAorICAgICAgICAgICAgIyB0aGlzIGlzIG5vdCBhbHdheXMgdHJ1ZS4gIENvbnNpZGVyIHRoZSBjb2RlOgorICAgICAgICAgICAgIyAgICAgYSA9ICgxLAorICAgICAgICAgICAgIyAgICAgICAgICBiKQorICAgICAgICAgICAgIyBJbiB0aGUgYnl0ZWNvZGUgc3RyZWFtLCB0aGUgYXNzaWdubWVudCB0byAiYSIgb2NjdXJzCisgICAgICAgICAgICAjIGFmdGVyIHRoZSBsb2FkaW5nIG9mICJiIi4gIFRoaXMgd29ya3Mgd2l0aCB0aGUgQyBQeXRob24KKyAgICAgICAgICAgICMgY29tcGlsZXIgYmVjYXVzZSBpdCBvbmx5IGdlbmVyYXRlcyBhIFNFVF9MSU5FTk8gaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICMgZm9yIHRoZSBhc3NpZ25tZW50LgorICAgICAgICAgICAgaWYgbGluZSA+PSAwOgorICAgICAgICAgICAgICAgIHB1c2ggPSBzZWxmLmxub3RhYi5hcHBlbmQKKyAgICAgICAgICAgICAgICB3aGlsZSBhZGRyID4gMjU1OgorICAgICAgICAgICAgICAgICAgICBwdXNoKDI1NSk7IHB1c2goMCkKKyAgICAgICAgICAgICAgICAgICAgYWRkciAtPSAyNTUKKyAgICAgICAgICAgICAgICB3aGlsZSBsaW5lID4gMjU1OgorICAgICAgICAgICAgICAgICAgICBwdXNoKGFkZHIpOyBwdXNoKDI1NSkKKyAgICAgICAgICAgICAgICAgICAgbGluZSAtPSAyNTUKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IDAKKyAgICAgICAgICAgICAgICBpZiBhZGRyID4gMCBvciBsaW5lID4gMDoKKyAgICAgICAgICAgICAgICAgICAgcHVzaChhZGRyKTsgcHVzaChsaW5lKQorICAgICAgICAgICAgICAgIHNlbGYubGFzdGxpbmUgPSBsaW5lbm8KKyAgICAgICAgICAgICAgICBzZWxmLmxhc3RvZmYgPSBzZWxmLmNvZGVPZmZzZXQKKworICAgIGRlZiBnZXRDb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gJycuam9pbihzZWxmLmNvZGUpCisKKyAgICBkZWYgZ2V0VGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiAnJy5qb2luKG1hcChjaHIsIHNlbGYubG5vdGFiKSkKKworY2xhc3MgU3RhY2tEZXB0aFRyYWNrZXI6CisgICAgIyBYWFggMS4gbmVlZCB0byBrZWVwIHRyYWNrIG9mIHN0YWNrIGRlcHRoIG9uIGp1bXBzCisgICAgIyBYWFggMi4gYXQgbGVhc3QgcGFydGx5IGFzIGEgcmVzdWx0LCB0aGlzIGNvZGUgaXMgYnJva2VuCisKKyAgICBkZWYgZmluZERlcHRoKHNlbGYsIGluc3RzLCBkZWJ1Zz0wKToKKyAgICAgICAgZGVwdGggPSAwCisgICAgICAgIG1heERlcHRoID0gMAorICAgICAgICBmb3IgaSBpbiBpbnN0czoKKyAgICAgICAgICAgIG9wbmFtZSA9IGlbMF0KKyAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgIHByaW50IGksCisgICAgICAgICAgICBkZWx0YSA9IHNlbGYuZWZmZWN0LmdldChvcG5hbWUsIE5vbmUpCisgICAgICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBkZXB0aCA9IGRlcHRoICsgZGVsdGEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBub3cgY2hlY2sgcGF0dGVybnMKKyAgICAgICAgICAgICAgICBmb3IgcGF0LCBwYXRfZGVsdGEgaW4gc2VsZi5wYXR0ZXJuczoKKyAgICAgICAgICAgICAgICAgICAgaWYgb3BuYW1lWzpsZW4ocGF0KV0gPT0gcGF0OgorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBwYXRfZGVsdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyBkZWx0YQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAjIGlmIHdlIHN0aWxsIGhhdmVuJ3QgZm91bmQgYSBtYXRjaAorICAgICAgICAgICAgICAgIGlmIGRlbHRhIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYsIG9wbmFtZSwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbWV0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyBtZXRoKGlbMV0pCisgICAgICAgICAgICBpZiBkZXB0aCA+IG1heERlcHRoOgorICAgICAgICAgICAgICAgIG1heERlcHRoID0gZGVwdGgKKyAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgIHByaW50IGRlcHRoLCBtYXhEZXB0aAorICAgICAgICByZXR1cm4gbWF4RGVwdGgKKworICAgIGVmZmVjdCA9IHsKKyAgICAgICAgJ1BPUF9UT1AnOiAtMSwKKyAgICAgICAgJ0RVUF9UT1AnOiAxLAorICAgICAgICAnTElTVF9BUFBFTkQnOiAtMSwKKyAgICAgICAgJ1NFVF9BREQnOiAtMSwKKyAgICAgICAgJ01BUF9BREQnOiAtMiwKKyAgICAgICAgJ1NMSUNFKzEnOiAtMSwKKyAgICAgICAgJ1NMSUNFKzInOiAtMSwKKyAgICAgICAgJ1NMSUNFKzMnOiAtMiwKKyAgICAgICAgJ1NUT1JFX1NMSUNFKzAnOiAtMSwKKyAgICAgICAgJ1NUT1JFX1NMSUNFKzEnOiAtMiwKKyAgICAgICAgJ1NUT1JFX1NMSUNFKzInOiAtMiwKKyAgICAgICAgJ1NUT1JFX1NMSUNFKzMnOiAtMywKKyAgICAgICAgJ0RFTEVURV9TTElDRSswJzogLTEsCisgICAgICAgICdERUxFVEVfU0xJQ0UrMSc6IC0yLAorICAgICAgICAnREVMRVRFX1NMSUNFKzInOiAtMiwKKyAgICAgICAgJ0RFTEVURV9TTElDRSszJzogLTMsCisgICAgICAgICdTVE9SRV9TVUJTQ1InOiAtMywKKyAgICAgICAgJ0RFTEVURV9TVUJTQ1InOiAtMiwKKyAgICAgICAgIyBQUklOVF9FWFBSPworICAgICAgICAnUFJJTlRfSVRFTSc6IC0xLAorICAgICAgICAnUkVUVVJOX1ZBTFVFJzogLTEsCisgICAgICAgICdZSUVMRF9WQUxVRSc6IC0xLAorICAgICAgICAnRVhFQ19TVE1UJzogLTMsCisgICAgICAgICdCVUlMRF9DTEFTUyc6IC0yLAorICAgICAgICAnU1RPUkVfTkFNRSc6IC0xLAorICAgICAgICAnU1RPUkVfQVRUUic6IC0yLAorICAgICAgICAnREVMRVRFX0FUVFInOiAtMSwKKyAgICAgICAgJ1NUT1JFX0dMT0JBTCc6IC0xLAorICAgICAgICAnQlVJTERfTUFQJzogMSwKKyAgICAgICAgJ0NPTVBBUkVfT1AnOiAtMSwKKyAgICAgICAgJ1NUT1JFX0ZBU1QnOiAtMSwKKyAgICAgICAgJ0lNUE9SVF9TVEFSJzogLTEsCisgICAgICAgICdJTVBPUlRfTkFNRSc6IC0xLAorICAgICAgICAnSU1QT1JUX0ZST00nOiAxLAorICAgICAgICAnTE9BRF9BVFRSJzogMCwgIyB1bmxpa2Ugb3RoZXIgbG9hZHMKKyAgICAgICAgIyBjbG9zZSBlbm91Z2guLi4KKyAgICAgICAgJ1NFVFVQX0VYQ0VQVCc6IDMsCisgICAgICAgICdTRVRVUF9GSU5BTExZJzogMywKKyAgICAgICAgJ0ZPUl9JVEVSJzogMSwKKyAgICAgICAgJ1dJVEhfQ0xFQU5VUCc6IC0xLAorICAgICAgICB9CisgICAgIyB1c2UgcGF0dGVybiBtYXRjaAorICAgIHBhdHRlcm5zID0gWworICAgICAgICAoJ0JJTkFSWV8nLCAtMSksCisgICAgICAgICgnTE9BRF8nLCAxKSwKKyAgICAgICAgXQorCisgICAgZGVmIFVOUEFDS19TRVFVRU5DRShzZWxmLCBjb3VudCk6CisgICAgICAgIHJldHVybiBjb3VudC0xCisgICAgZGVmIEJVSUxEX1RVUExFKHNlbGYsIGNvdW50KToKKyAgICAgICAgcmV0dXJuIC1jb3VudCsxCisgICAgZGVmIEJVSUxEX0xJU1Qoc2VsZiwgY291bnQpOgorICAgICAgICByZXR1cm4gLWNvdW50KzEKKyAgICBkZWYgQlVJTERfU0VUKHNlbGYsIGNvdW50KToKKyAgICAgICAgcmV0dXJuIC1jb3VudCsxCisgICAgZGVmIENBTExfRlVOQ1RJT04oc2VsZiwgYXJnYyk6CisgICAgICAgIGhpLCBsbyA9IGRpdm1vZChhcmdjLCAyNTYpCisgICAgICAgIHJldHVybiAtKGxvICsgaGkgKiAyKQorICAgIGRlZiBDQUxMX0ZVTkNUSU9OX1ZBUihzZWxmLCBhcmdjKToKKyAgICAgICAgcmV0dXJuIHNlbGYuQ0FMTF9GVU5DVElPTihhcmdjKS0xCisgICAgZGVmIENBTExfRlVOQ1RJT05fS1coc2VsZiwgYXJnYyk6CisgICAgICAgIHJldHVybiBzZWxmLkNBTExfRlVOQ1RJT04oYXJnYyktMQorICAgIGRlZiBDQUxMX0ZVTkNUSU9OX1ZBUl9LVyhzZWxmLCBhcmdjKToKKyAgICAgICAgcmV0dXJuIHNlbGYuQ0FMTF9GVU5DVElPTihhcmdjKS0yCisgICAgZGVmIE1BS0VfRlVOQ1RJT04oc2VsZiwgYXJnYyk6CisgICAgICAgIHJldHVybiAtYXJnYworICAgIGRlZiBNQUtFX0NMT1NVUkUoc2VsZiwgYXJnYyk6CisgICAgICAgICMgWFhYIG5lZWQgdG8gYWNjb3VudCBmb3IgZnJlZSB2YXJpYWJsZXMgdG9vIQorICAgICAgICByZXR1cm4gLWFyZ2MKKyAgICBkZWYgQlVJTERfU0xJQ0Uoc2VsZiwgYXJnYyk6CisgICAgICAgIGlmIGFyZ2MgPT0gMjoKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBlbGlmIGFyZ2MgPT0gMzoKKyAgICAgICAgICAgIHJldHVybiAtMgorICAgIGRlZiBEVVBfVE9QWChzZWxmLCBhcmdjKToKKyAgICAgICAgcmV0dXJuIGFyZ2MKKworZmluZERlcHRoID0gU3RhY2tEZXB0aFRyYWNrZXIoKS5maW5kRGVwdGgKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHlhc3NlbS5weWMgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3B5YXNzZW0ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YjA0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3B5YXNzZW0ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHlhc3NlbS5weW8gYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3B5YXNzZW0ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDhmMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3B5YXNzZW0ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHljb2RlZ2VuLnB5IGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9weWNvZGVnZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxNTk0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHljb2RlZ2VuLnB5CkBAIC0wLDAgKzEsMTU1NSBAQAoraW1wb3J0IGltcAoraW1wb3J0IG9zCitpbXBvcnQgbWFyc2hhbAoraW1wb3J0IHN0cnVjdAoraW1wb3J0IHN5cworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2Zyb20gY29tcGlsZXIgaW1wb3J0IGFzdCwgcGFyc2UsIHdhbGssIHN5bnRheAorZnJvbSBjb21waWxlciBpbXBvcnQgcHlhc3NlbSwgbWlzYywgZnV0dXJlLCBzeW1ib2xzCitmcm9tIGNvbXBpbGVyLmNvbnN0cyBpbXBvcnQgU0NfTE9DQUwsIFNDX0dMT0JBTF9JTVBMSUNJVCwgU0NfR0xPQkFMX0VYUExJQ0lULCBcCisgICAgIFNDX0ZSRUUsIFNDX0NFTEwKK2Zyb20gY29tcGlsZXIuY29uc3RzIGltcG9ydCAoQ09fVkFSQVJHUywgQ09fVkFSS0VZV09SRFMsIENPX05FV0xPQ0FMUywKKyAgICAgQ09fTkVTVEVELCBDT19HRU5FUkFUT1IsIENPX0ZVVFVSRV9ESVZJU0lPTiwKKyAgICAgQ09fRlVUVVJFX0FCU0lNUE9SVCwgQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5ULCBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT04pCitmcm9tIGNvbXBpbGVyLnB5YXNzZW0gaW1wb3J0IFR1cGxlQXJnCisKKyMgWFhYIFRoZSB2ZXJzaW9uLXNwZWNpZmljIGNvZGUgY2FuIGdvLCBzaW5jZSB0aGlzIGNvZGUgb25seSB3b3JrcyB3aXRoIDIueC4KKyMgRG8gd2UgaGF2ZSBQeXRob24gMS54IG9yIFB5dGhvbiAyLng/Cit0cnk6CisgICAgVkVSU0lPTiA9IHN5cy52ZXJzaW9uX2luZm9bMF0KK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICBWRVJTSU9OID0gMQorCitjYWxsZnVuY19vcGNvZGVfaW5mbyA9IHsKKyAgICAjIChIYXZlICphcmdzLCBIYXZlICoqYXJncykgOiBvcGNvZGUKKyAgICAoMCwwKSA6ICJDQUxMX0ZVTkNUSU9OIiwKKyAgICAoMSwwKSA6ICJDQUxMX0ZVTkNUSU9OX1ZBUiIsCisgICAgKDAsMSkgOiAiQ0FMTF9GVU5DVElPTl9LVyIsCisgICAgKDEsMSkgOiAiQ0FMTF9GVU5DVElPTl9WQVJfS1ciLAorfQorCitMT09QID0gMQorRVhDRVBUID0gMgorVFJZX0ZJTkFMTFkgPSAzCitFTkRfRklOQUxMWSA9IDQKKworZGVmIGNvbXBpbGVGaWxlKGZpbGVuYW1lLCBkaXNwbGF5PTApOgorICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAnVScpCisgICAgYnVmID0gZi5yZWFkKCkKKyAgICBmLmNsb3NlKCkKKyAgICBtb2QgPSBNb2R1bGUoYnVmLCBmaWxlbmFtZSkKKyAgICB0cnk6CisgICAgICAgIG1vZC5jb21waWxlKGRpc3BsYXkpCisgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICByYWlzZQorICAgIGVsc2U6CisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lICsgImMiLCAid2IiKQorICAgICAgICBtb2QuZHVtcChmKQorICAgICAgICBmLmNsb3NlKCkKKworZGVmIGNvbXBpbGUoc291cmNlLCBmaWxlbmFtZSwgbW9kZSwgZmxhZ3M9Tm9uZSwgZG9udF9pbmhlcml0PU5vbmUpOgorICAgICIiIlJlcGxhY2VtZW50IGZvciBidWlsdGluIGNvbXBpbGUoKSBmdW5jdGlvbiIiIgorICAgIGlmIGZsYWdzIGlzIG5vdCBOb25lIG9yIGRvbnRfaW5oZXJpdCBpcyBub3QgTm9uZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm90IGltcGxlbWVudGVkIHlldCIKKworICAgIGlmIG1vZGUgPT0gInNpbmdsZSI6CisgICAgICAgIGdlbiA9IEludGVyYWN0aXZlKHNvdXJjZSwgZmlsZW5hbWUpCisgICAgZWxpZiBtb2RlID09ICJleGVjIjoKKyAgICAgICAgZ2VuID0gTW9kdWxlKHNvdXJjZSwgZmlsZW5hbWUpCisgICAgZWxpZiBtb2RlID09ICJldmFsIjoKKyAgICAgICAgZ2VuID0gRXhwcmVzc2lvbihzb3VyY2UsIGZpbGVuYW1lKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNvbXBpbGUoKSAzcmQgYXJnIG11c3QgYmUgJ2V4ZWMnIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJ2V2YWwnIG9yICdzaW5nbGUnIikKKyAgICBnZW4uY29tcGlsZSgpCisgICAgcmV0dXJuIGdlbi5jb2RlCisKK2NsYXNzIEFic3RyYWN0Q29tcGlsZU1vZGU6CisKKyAgICBtb2RlID0gTm9uZSAjIGRlZmluZWQgYnkgc3ViY2xhc3MKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5zb3VyY2UgPSBzb3VyY2UKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuY29kZSA9IE5vbmUKKworICAgIGRlZiBfZ2V0X3RyZWUoc2VsZik6CisgICAgICAgIHRyZWUgPSBwYXJzZShzZWxmLnNvdXJjZSwgc2VsZi5tb2RlKQorICAgICAgICBtaXNjLnNldF9maWxlbmFtZShzZWxmLmZpbGVuYW1lLCB0cmVlKQorICAgICAgICBzeW50YXguY2hlY2sodHJlZSkKKyAgICAgICAgcmV0dXJuIHRyZWUKKworICAgIGRlZiBjb21waWxlKHNlbGYpOgorICAgICAgICBwYXNzICMgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MKKworICAgIGRlZiBnZXRDb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb2RlCisKK2NsYXNzIEV4cHJlc3Npb24oQWJzdHJhY3RDb21waWxlTW9kZSk6CisKKyAgICBtb2RlID0gImV2YWwiCisKKyAgICBkZWYgY29tcGlsZShzZWxmKToKKyAgICAgICAgdHJlZSA9IHNlbGYuX2dldF90cmVlKCkKKyAgICAgICAgZ2VuID0gRXhwcmVzc2lvbkNvZGVHZW5lcmF0b3IodHJlZSkKKyAgICAgICAgc2VsZi5jb2RlID0gZ2VuLmdldENvZGUoKQorCitjbGFzcyBJbnRlcmFjdGl2ZShBYnN0cmFjdENvbXBpbGVNb2RlKToKKworICAgIG1vZGUgPSAic2luZ2xlIgorCisgICAgZGVmIGNvbXBpbGUoc2VsZik6CisgICAgICAgIHRyZWUgPSBzZWxmLl9nZXRfdHJlZSgpCisgICAgICAgIGdlbiA9IEludGVyYWN0aXZlQ29kZUdlbmVyYXRvcih0cmVlKQorICAgICAgICBzZWxmLmNvZGUgPSBnZW4uZ2V0Q29kZSgpCisKK2NsYXNzIE1vZHVsZShBYnN0cmFjdENvbXBpbGVNb2RlKToKKworICAgIG1vZGUgPSAiZXhlYyIKKworICAgIGRlZiBjb21waWxlKHNlbGYsIGRpc3BsYXk9MCk6CisgICAgICAgIHRyZWUgPSBzZWxmLl9nZXRfdHJlZSgpCisgICAgICAgIGdlbiA9IE1vZHVsZUNvZGVHZW5lcmF0b3IodHJlZSkKKyAgICAgICAgaWYgZGlzcGxheToKKyAgICAgICAgICAgIGltcG9ydCBwcHJpbnQKKyAgICAgICAgICAgIHByaW50IHBwcmludC5wcHJpbnQodHJlZSkKKyAgICAgICAgc2VsZi5jb2RlID0gZ2VuLmdldENvZGUoKQorCisgICAgZGVmIGR1bXAoc2VsZiwgZik6CisgICAgICAgIGYud3JpdGUoc2VsZi5nZXRQeWNIZWFkZXIoKSkKKyAgICAgICAgbWFyc2hhbC5kdW1wKHNlbGYuY29kZSwgZikKKworICAgIE1BR0lDID0gaW1wLmdldF9tYWdpYygpCisKKyAgICBkZWYgZ2V0UHljSGVhZGVyKHNlbGYpOgorICAgICAgICAjIGNvbXBpbGUuYyB1c2VzIG1hcnNoYWwgdG8gd3JpdGUgYSBsb25nIGRpcmVjdGx5LCB3aXRoCisgICAgICAgICMgY2FsbGluZyB0aGUgaW50ZXJmYWNlIHRoYXQgd291bGQgYWxzbyBnZW5lcmF0ZSBhIDEtYnl0ZSBjb2RlCisgICAgICAgICMgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgdGhlIHZhbHVlLiAgc2ltcGxlc3Qgd2F5IHRvIGdldCB0aGUKKyAgICAgICAgIyBzYW1lIGVmZmVjdCBpcyB0byBjYWxsIG1hcnNoYWwgYW5kIHRoZW4gc2tpcCB0aGUgY29kZS4KKyAgICAgICAgbXRpbWUgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIG10aW1lID0gc3RydWN0LnBhY2soJzxpJywgbXRpbWUpCisgICAgICAgIHJldHVybiBzZWxmLk1BR0lDICsgbXRpbWUKKworY2xhc3MgTG9jYWxOYW1lRmluZGVyOgorICAgICIiIkZpbmQgbG9jYWwgbmFtZXMgaW4gc2NvcGUiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZXM9KCkpOgorICAgICAgICBzZWxmLm5hbWVzID0gbWlzYy5TZXQoKQorICAgICAgICBzZWxmLmdsb2JhbHMgPSBtaXNjLlNldCgpCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgc2VsZi5uYW1lcy5hZGQobmFtZSkKKworICAgICMgWFhYIGxpc3QgY29tcHJlaGVuc2lvbnMgYW5kIGZvciBsb29wcworCisgICAgZGVmIGdldExvY2FscyhzZWxmKToKKyAgICAgICAgZm9yIGVsdCBpbiBzZWxmLmdsb2JhbHMuZWxlbWVudHMoKToKKyAgICAgICAgICAgIGlmIHNlbGYubmFtZXMuaGFzX2VsdChlbHQpOgorICAgICAgICAgICAgICAgIHNlbGYubmFtZXMucmVtb3ZlKGVsdCkKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZXMKKworICAgIGRlZiB2aXNpdERpY3Qoc2VsZiwgbm9kZSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB2aXNpdEdsb2JhbChzZWxmLCBub2RlKToKKyAgICAgICAgZm9yIG5hbWUgaW4gbm9kZS5uYW1lczoKKyAgICAgICAgICAgIHNlbGYuZ2xvYmFscy5hZGQobmFtZSkKKworICAgIGRlZiB2aXNpdEZ1bmN0aW9uKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5hbWVzLmFkZChub2RlLm5hbWUpCisKKyAgICBkZWYgdmlzaXRMYW1iZGEoc2VsZiwgbm9kZSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB2aXNpdEltcG9ydChzZWxmLCBub2RlKToKKyAgICAgICAgZm9yIG5hbWUsIGFsaWFzIGluIG5vZGUubmFtZXM6CisgICAgICAgICAgICBzZWxmLm5hbWVzLmFkZChhbGlhcyBvciBuYW1lKQorCisgICAgZGVmIHZpc2l0RnJvbShzZWxmLCBub2RlKToKKyAgICAgICAgZm9yIG5hbWUsIGFsaWFzIGluIG5vZGUubmFtZXM6CisgICAgICAgICAgICBzZWxmLm5hbWVzLmFkZChhbGlhcyBvciBuYW1lKQorCisgICAgZGVmIHZpc2l0Q2xhc3Moc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmFtZXMuYWRkKG5vZGUubmFtZSkKKworICAgIGRlZiB2aXNpdEFzc05hbWUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmFtZXMuYWRkKG5vZGUubmFtZSkKKworZGVmIGlzX2NvbnN0YW50X2ZhbHNlKG5vZGUpOgorICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgYXN0LkNvbnN0KToKKyAgICAgICAgaWYgbm90IG5vZGUudmFsdWU6CisgICAgICAgICAgICByZXR1cm4gMQorICAgIHJldHVybiAwCisKK2NsYXNzIENvZGVHZW5lcmF0b3I6CisgICAgIiIiRGVmaW5lcyBiYXNpYyBjb2RlIGdlbmVyYXRvciBmb3IgUHl0aG9uIGJ5dGVjb2RlCisKKyAgICBUaGlzIGNsYXNzIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MuICBDb25jcmV0ZSBzdWJjbGFzc2VzIG11c3QKKyAgICBkZWZpbmUgYW4gX19pbml0X18oKSB0aGF0IGRlZmluZXMgc2VsZi5ncmFwaCBhbmQgdGhlbiBjYWxscyB0aGUKKyAgICBfX2luaXRfXygpIGRlZmluZWQgaW4gdGhpcyBjbGFzcy4KKworICAgIFRoZSBjb25jcmV0ZSBjbGFzcyBtdXN0IGFsc28gZGVmaW5lIHRoZSBjbGFzcyBhdHRyaWJ1dGVzCisgICAgTmFtZUZpbmRlciwgRnVuY3Rpb25HZW4sIGFuZCBDbGFzc0dlbi4gIFRoZXNlIGF0dHJpYnV0ZXMgY2FuIGJlCisgICAgZGVmaW5lZCBpbiB0aGUgaW5pdENsYXNzKCkgbWV0aG9kLCB3aGljaCBpcyBhIGhvb2sgZm9yCisgICAgaW5pdGlhbGl6aW5nIHRoZXNlIG1ldGhvZHMgYWZ0ZXIgYWxsIHRoZSBjbGFzc2VzIGhhdmUgYmVlbgorICAgIGRlZmluZWQuCisgICAgIiIiCisKKyAgICBvcHRpbWl6ZWQgPSAwICMgaXMgbmFtZXNwYWNlIGFjY2VzcyBvcHRpbWl6ZWQ/CisgICAgX19pbml0aWFsaXplZCA9IE5vbmUKKyAgICBjbGFzc19uYW1lID0gTm9uZSAjIHByb3ZpZGUgZGVmYXVsdCBmb3IgaW5zdGFuY2UgdmFyaWFibGUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fX2luaXRpYWxpemVkIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmluaXRDbGFzcygpCisgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX2luaXRpYWxpemVkID0gMQorICAgICAgICBzZWxmLmNoZWNrQ2xhc3MoKQorICAgICAgICBzZWxmLmxvY2FscyA9IG1pc2MuU3RhY2soKQorICAgICAgICBzZWxmLnNldHVwcyA9IG1pc2MuU3RhY2soKQorICAgICAgICBzZWxmLmxhc3RfbGluZW5vID0gTm9uZQorICAgICAgICBzZWxmLl9zZXR1cEdyYXBoRGVsZWdhdGlvbigpCisgICAgICAgIHNlbGYuX2Rpdl9vcCA9ICJCSU5BUllfRElWSURFIgorCisgICAgICAgICMgWFhYIHNldCBmbGFncyBiYXNlZCBvbiBmdXR1cmUgZmVhdHVyZXMKKyAgICAgICAgZnV0dXJlcyA9IHNlbGYuZ2V0X21vZHVsZSgpLmZ1dHVyZXMKKyAgICAgICAgZm9yIGZlYXR1cmUgaW4gZnV0dXJlczoKKyAgICAgICAgICAgIGlmIGZlYXR1cmUgPT0gImRpdmlzaW9uIjoKKyAgICAgICAgICAgICAgICBzZWxmLmdyYXBoLnNldEZsYWcoQ09fRlVUVVJFX0RJVklTSU9OKQorICAgICAgICAgICAgICAgIHNlbGYuX2Rpdl9vcCA9ICJCSU5BUllfVFJVRV9ESVZJREUiCisgICAgICAgICAgICBlbGlmIGZlYXR1cmUgPT0gImFic29sdXRlX2ltcG9ydCI6CisgICAgICAgICAgICAgICAgc2VsZi5ncmFwaC5zZXRGbGFnKENPX0ZVVFVSRV9BQlNJTVBPUlQpCisgICAgICAgICAgICBlbGlmIGZlYXR1cmUgPT0gIndpdGhfc3RhdGVtZW50IjoKKyAgICAgICAgICAgICAgICBzZWxmLmdyYXBoLnNldEZsYWcoQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UKQorICAgICAgICAgICAgZWxpZiBmZWF0dXJlID09ICJwcmludF9mdW5jdGlvbiI6CisgICAgICAgICAgICAgICAgc2VsZi5ncmFwaC5zZXRGbGFnKENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTikKKworICAgIGRlZiBpbml0Q2xhc3Moc2VsZik6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIGNsYXNzIiIiCisKKyAgICBkZWYgY2hlY2tDbGFzcyhzZWxmKToKKyAgICAgICAgIiIiVmVyaWZ5IHRoYXQgY2xhc3MgaXMgY29uc3RydWN0ZWQgY29ycmVjdGx5IiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFzc2VydCBoYXNhdHRyKHNlbGYsICdncmFwaCcpCisgICAgICAgICAgICBhc3NlcnQgZ2V0YXR0cihzZWxmLCAnTmFtZUZpbmRlcicpCisgICAgICAgICAgICBhc3NlcnQgZ2V0YXR0cihzZWxmLCAnRnVuY3Rpb25HZW4nKQorICAgICAgICAgICAgYXNzZXJ0IGdldGF0dHIoc2VsZiwgJ0NsYXNzR2VuJykKKyAgICAgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yLCBtc2c6CisgICAgICAgICAgICBpbnRybyA9ICJCYWQgY2xhc3MgY29uc3RydWN0aW9uIGZvciAlcyIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IsIGludHJvCisKKyAgICBkZWYgX3NldHVwR3JhcGhEZWxlZ2F0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmVtaXQgPSBzZWxmLmdyYXBoLmVtaXQKKyAgICAgICAgc2VsZi5uZXdCbG9jayA9IHNlbGYuZ3JhcGgubmV3QmxvY2sKKyAgICAgICAgc2VsZi5zdGFydEJsb2NrID0gc2VsZi5ncmFwaC5zdGFydEJsb2NrCisgICAgICAgIHNlbGYubmV4dEJsb2NrID0gc2VsZi5ncmFwaC5uZXh0QmxvY2sKKyAgICAgICAgc2VsZi5zZXREb2NzdHJpbmcgPSBzZWxmLmdyYXBoLnNldERvY3N0cmluZworCisgICAgZGVmIGdldENvZGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGNvZGUgb2JqZWN0IiIiCisgICAgICAgIHJldHVybiBzZWxmLmdyYXBoLmdldENvZGUoKQorCisgICAgZGVmIG1hbmdsZShzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgc2VsZi5jbGFzc19uYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIG1pc2MubWFuZ2xlKG5hbWUsIHNlbGYuY2xhc3NfbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBuYW1lCisKKyAgICBkZWYgcGFyc2VTeW1ib2xzKHNlbGYsIHRyZWUpOgorICAgICAgICBzID0gc3ltYm9scy5TeW1ib2xWaXNpdG9yKCkKKyAgICAgICAgd2Fsayh0cmVlLCBzKQorICAgICAgICByZXR1cm4gcy5zY29wZXMKKworICAgIGRlZiBnZXRfbW9kdWxlKHNlbGYpOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyIKKworICAgICMgTmV4dCBmaXZlIG1ldGhvZHMgaGFuZGxlIG5hbWUgYWNjZXNzCisKKyAgICBkZWYgaXNMb2NhbE5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLmxvY2Fscy50b3AoKS5oYXNfZWx0KG5hbWUpCisKKyAgICBkZWYgc3RvcmVOYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLl9uYW1lT3AoJ1NUT1JFJywgbmFtZSkKKworICAgIGRlZiBsb2FkTmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5fbmFtZU9wKCdMT0FEJywgbmFtZSkKKworICAgIGRlZiBkZWxOYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLl9uYW1lT3AoJ0RFTEVURScsIG5hbWUpCisKKyAgICBkZWYgX25hbWVPcChzZWxmLCBwcmVmaXgsIG5hbWUpOgorICAgICAgICBuYW1lID0gc2VsZi5tYW5nbGUobmFtZSkKKyAgICAgICAgc2NvcGUgPSBzZWxmLnNjb3BlLmNoZWNrX25hbWUobmFtZSkKKyAgICAgICAgaWYgc2NvcGUgPT0gU0NfTE9DQUw6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5vcHRpbWl6ZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KHByZWZpeCArICdfTkFNRScsIG5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdChwcmVmaXggKyAnX0ZBU1QnLCBuYW1lKQorICAgICAgICBlbGlmIHNjb3BlID09IFNDX0dMT0JBTF9FWFBMSUNJVDoKKyAgICAgICAgICAgIHNlbGYuZW1pdChwcmVmaXggKyAnX0dMT0JBTCcsIG5hbWUpCisgICAgICAgIGVsaWYgc2NvcGUgPT0gU0NfR0xPQkFMX0lNUExJQ0lUOgorICAgICAgICAgICAgaWYgbm90IHNlbGYub3B0aW1pemVkOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdChwcmVmaXggKyAnX05BTUUnLCBuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQocHJlZml4ICsgJ19HTE9CQUwnLCBuYW1lKQorICAgICAgICBlbGlmIHNjb3BlID09IFNDX0ZSRUUgb3Igc2NvcGUgPT0gU0NfQ0VMTDoKKyAgICAgICAgICAgIHNlbGYuZW1pdChwcmVmaXggKyAnX0RFUkVGJywgbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgInVuc3VwcG9ydGVkIHNjb3BlIGZvciB2YXIgJXM6ICVkIiAlIFwKKyAgICAgICAgICAgICAgICAgIChuYW1lLCBzY29wZSkKKworICAgIGRlZiBfaW1wbGljaXROYW1lT3Aoc2VsZiwgcHJlZml4LCBuYW1lKToKKyAgICAgICAgIiIiRW1pdCBuYW1lIG9wcyBmb3IgbmFtZXMgZ2VuZXJhdGVkIGltcGxpY2l0bHkgYnkgZm9yIGxvb3BzCisKKyAgICAgICAgVGhlIGludGVycHJldGVyIGdlbmVyYXRlcyBuYW1lcyB0aGF0IHN0YXJ0IHdpdGggYSBwZXJpb2Qgb3IKKyAgICAgICAgZG9sbGFyIHNpZ24uICBUaGUgc3ltYm9sIHRhYmxlIGlnbm9yZXMgdGhlc2UgbmFtZXMgYmVjYXVzZQorICAgICAgICB0aGV5IGFyZW4ndCBwcmVzZW50IGluIHRoZSBwcm9ncmFtIHRleHQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLm9wdGltaXplZDoKKyAgICAgICAgICAgIHNlbGYuZW1pdChwcmVmaXggKyAnX0ZBU1QnLCBuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lbWl0KHByZWZpeCArICdfTkFNRScsIG5hbWUpCisKKyAgICAjIFRoZSBzZXRfbGluZW5vKCkgZnVuY3Rpb24gYW5kIHRoZSBleHBsaWNpdCBlbWl0KCkgY2FsbHMgZm9yCisgICAgIyBTRVRfTElORU5PIGJlbG93IGFyZSBvbmx5IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGxpbmUgbnVtYmVyIHRhYmxlLgorICAgICMgQXMgb2YgUHl0aG9uIDIuMywgdGhlIGludGVycHJldGVyIGRvZXMgbm90IGhhdmUgYSBTRVRfTElORU5PCisgICAgIyBpbnN0cnVjdGlvbi4gIHB5YXNzZW0gdHJlYXRzIFNFVF9MSU5FTk8gb3Bjb2RlcyBhcyBhIHNwZWNpYWwgY2FzZS4KKworICAgIGRlZiBzZXRfbGluZW5vKHNlbGYsIG5vZGUsIGZvcmNlPUZhbHNlKToKKyAgICAgICAgIiIiRW1pdCBTRVRfTElORU5PIGlmIG5lY2Vzc2FyeS4KKworICAgICAgICBUaGUgaW5zdHJ1Y3Rpb24gaXMgY29uc2lkZXJlZCBuZWNlc3NhcnkgaWYgdGhlIG5vZGUgaGFzIGEKKyAgICAgICAgbGluZW5vIGF0dHJpYnV0ZSBhbmQgaXQgaXMgZGlmZmVyZW50IHRoYW4gdGhlIGxhc3QgbGluZW5vCisgICAgICAgIGVtaXR0ZWQuCisKKyAgICAgICAgUmV0dXJucyB0cnVlIGlmIFNFVF9MSU5FTk8gd2FzIGVtaXR0ZWQuCisKKyAgICAgICAgVGhlcmUgYXJlIG5vIHJ1bGVzIGZvciB3aGVuIGFuIEFTVCBub2RlIHNob3VsZCBoYXZlIGEgbGluZW5vCisgICAgICAgIGF0dHJpYnV0ZS4gIFRoZSB0cmFuc2Zvcm1lciBhbmQgQVNUIGNvZGUgbmVlZCB0byBiZSByZXZpZXdlZAorICAgICAgICBhbmQgYSBjb25zaXN0ZW50IHBvbGljeSBpbXBsZW1lbnRlZCBhbmQgZG9jdW1lbnRlZC4gIFVudGlsCisgICAgICAgIHRoZW4sIHRoaXMgbWV0aG9kIHdvcmtzIGFyb3VuZCBtaXNzaW5nIGxpbmUgbnVtYmVycy4KKyAgICAgICAgIiIiCisgICAgICAgIGxpbmVubyA9IGdldGF0dHIobm9kZSwgJ2xpbmVubycsIE5vbmUpCisgICAgICAgIGlmIGxpbmVubyBpcyBub3QgTm9uZSBhbmQgKGxpbmVubyAhPSBzZWxmLmxhc3RfbGluZW5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGZvcmNlKToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnU0VUX0xJTkVOTycsIGxpbmVubykKKyAgICAgICAgICAgIHNlbGYubGFzdF9saW5lbm8gPSBsaW5lbm8KKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBUaGUgZmlyc3QgZmV3IHZpc2l0b3IgbWV0aG9kcyBoYW5kbGUgbm9kZXMgdGhhdCBnZW5lcmF0b3IgbmV3CisgICAgIyBjb2RlIG9iamVjdHMuICBUaGV5IHVzZSBjbGFzcyBhdHRyaWJ1dGVzIHRvIGRldGVybWluZSB3aGF0CisgICAgIyBzcGVjaWFsaXplZCBjb2RlIGdlbmVyYXRvcnMgdG8gdXNlLgorCisgICAgTmFtZUZpbmRlciA9IExvY2FsTmFtZUZpbmRlcgorICAgIEZ1bmN0aW9uR2VuID0gTm9uZQorICAgIENsYXNzR2VuID0gTm9uZQorCisgICAgZGVmIHZpc2l0TW9kdWxlKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNjb3BlcyA9IHNlbGYucGFyc2VTeW1ib2xzKG5vZGUpCisgICAgICAgIHNlbGYuc2NvcGUgPSBzZWxmLnNjb3Blc1tub2RlXQorICAgICAgICBzZWxmLmVtaXQoJ1NFVF9MSU5FTk8nLCAwKQorICAgICAgICBpZiBub2RlLmRvYzoKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIG5vZGUuZG9jKQorICAgICAgICAgICAgc2VsZi5zdG9yZU5hbWUoJ19fZG9jX18nKQorICAgICAgICBsbmYgPSB3YWxrKG5vZGUubm9kZSwgc2VsZi5OYW1lRmluZGVyKCksIHZlcmJvc2U9MCkKKyAgICAgICAgc2VsZi5sb2NhbHMucHVzaChsbmYuZ2V0TG9jYWxzKCkpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5ub2RlKQorICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBOb25lKQorICAgICAgICBzZWxmLmVtaXQoJ1JFVFVSTl9WQUxVRScpCisKKyAgICBkZWYgdmlzaXRFeHByZXNzaW9uKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgc2VsZi5zY29wZXMgPSBzZWxmLnBhcnNlU3ltYm9scyhub2RlKQorICAgICAgICBzZWxmLnNjb3BlID0gc2VsZi5zY29wZXNbbm9kZV0KKyAgICAgICAgc2VsZi52aXNpdChub2RlLm5vZGUpCisgICAgICAgIHNlbGYuZW1pdCgnUkVUVVJOX1ZBTFVFJykKKworICAgIGRlZiB2aXNpdEZ1bmN0aW9uKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLl92aXNpdEZ1bmNPckxhbWJkYShub2RlLCBpc0xhbWJkYT0wKQorICAgICAgICBpZiBub2RlLmRvYzoKKyAgICAgICAgICAgIHNlbGYuc2V0RG9jc3RyaW5nKG5vZGUuZG9jKQorICAgICAgICBzZWxmLnN0b3JlTmFtZShub2RlLm5hbWUpCisKKyAgICBkZWYgdmlzaXRMYW1iZGEoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuX3Zpc2l0RnVuY09yTGFtYmRhKG5vZGUsIGlzTGFtYmRhPTEpCisKKyAgICBkZWYgX3Zpc2l0RnVuY09yTGFtYmRhKHNlbGYsIG5vZGUsIGlzTGFtYmRhPTApOgorICAgICAgICBpZiBub3QgaXNMYW1iZGEgYW5kIG5vZGUuZGVjb3JhdG9yczoKKyAgICAgICAgICAgIGZvciBkZWNvcmF0b3IgaW4gbm9kZS5kZWNvcmF0b3JzLm5vZGVzOgorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQoZGVjb3JhdG9yKQorICAgICAgICAgICAgbmRlY29yYXRvcnMgPSBsZW4obm9kZS5kZWNvcmF0b3JzLm5vZGVzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmRlY29yYXRvcnMgPSAwCisKKyAgICAgICAgZ2VuID0gc2VsZi5GdW5jdGlvbkdlbihub2RlLCBzZWxmLnNjb3BlcywgaXNMYW1iZGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGFzc19uYW1lLCBzZWxmLmdldF9tb2R1bGUoKSkKKyAgICAgICAgd2Fsayhub2RlLmNvZGUsIGdlbikKKyAgICAgICAgZ2VuLmZpbmlzaCgpCisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBmb3IgZGVmYXVsdCBpbiBub2RlLmRlZmF1bHRzOgorICAgICAgICAgICAgc2VsZi52aXNpdChkZWZhdWx0KQorICAgICAgICBzZWxmLl9tYWtlQ2xvc3VyZShnZW4sIGxlbihub2RlLmRlZmF1bHRzKSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobmRlY29yYXRvcnMpOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdDQUxMX0ZVTkNUSU9OJywgMSkKKworICAgIGRlZiB2aXNpdENsYXNzKHNlbGYsIG5vZGUpOgorICAgICAgICBnZW4gPSBzZWxmLkNsYXNzR2VuKG5vZGUsIHNlbGYuc2NvcGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X21vZHVsZSgpKQorICAgICAgICB3YWxrKG5vZGUuY29kZSwgZ2VuKQorICAgICAgICBnZW4uZmluaXNoKCkKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIG5vZGUubmFtZSkKKyAgICAgICAgZm9yIGJhc2UgaW4gbm9kZS5iYXNlczoKKyAgICAgICAgICAgIHNlbGYudmlzaXQoYmFzZSkKKyAgICAgICAgc2VsZi5lbWl0KCdCVUlMRF9UVVBMRScsIGxlbihub2RlLmJhc2VzKSkKKyAgICAgICAgc2VsZi5fbWFrZUNsb3N1cmUoZ2VuLCAwKQorICAgICAgICBzZWxmLmVtaXQoJ0NBTExfRlVOQ1RJT04nLCAwKQorICAgICAgICBzZWxmLmVtaXQoJ0JVSUxEX0NMQVNTJykKKyAgICAgICAgc2VsZi5zdG9yZU5hbWUobm9kZS5uYW1lKQorCisgICAgIyBUaGUgcmVzdCBhcmUgc3RhbmRhcmQgdmlzaXRvciBtZXRob2RzCisKKyAgICAjIFRoZSBuZXh0IGZldyBpbXBsZW1lbnQgY29udHJvbC1mbG93IHN0YXRlbWVudHMKKworICAgIGRlZiB2aXNpdElmKHNlbGYsIG5vZGUpOgorICAgICAgICBlbmQgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgbnVtdGVzdHMgPSBsZW4obm9kZS50ZXN0cykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobnVtdGVzdHMpOgorICAgICAgICAgICAgdGVzdCwgc3VpdGUgPSBub2RlLnRlc3RzW2ldCisgICAgICAgICAgICBpZiBpc19jb25zdGFudF9mYWxzZSh0ZXN0KToKKyAgICAgICAgICAgICAgICAjIFhYWCB3aWxsIG5lZWQgdG8gY2hlY2sgZ2VuZXJhdG9yIHN0dWZmIGhlcmUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5zZXRfbGluZW5vKHRlc3QpCisgICAgICAgICAgICBzZWxmLnZpc2l0KHRlc3QpCisgICAgICAgICAgICBuZXh0VGVzdCA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdQT1BfSlVNUF9JRl9GQUxTRScsIG5leHRUZXN0KQorICAgICAgICAgICAgc2VsZi5uZXh0QmxvY2soKQorICAgICAgICAgICAgc2VsZi52aXNpdChzdWl0ZSkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnSlVNUF9GT1JXQVJEJywgZW5kKQorICAgICAgICAgICAgc2VsZi5zdGFydEJsb2NrKG5leHRUZXN0KQorICAgICAgICBpZiBub2RlLmVsc2VfOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmVsc2VfKQorICAgICAgICBzZWxmLm5leHRCbG9jayhlbmQpCisKKyAgICBkZWYgdmlzaXRXaGlsZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisKKyAgICAgICAgbG9vcCA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBlbHNlXyA9IHNlbGYubmV3QmxvY2soKQorCisgICAgICAgIGFmdGVyID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIHNlbGYuZW1pdCgnU0VUVVBfTE9PUCcsIGFmdGVyKQorCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGxvb3ApCisgICAgICAgIHNlbGYuc2V0dXBzLnB1c2goKExPT1AsIGxvb3ApKQorCisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlLCBmb3JjZT1UcnVlKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudGVzdCkKKyAgICAgICAgc2VsZi5lbWl0KCdQT1BfSlVNUF9JRl9GQUxTRScsIGVsc2VfIG9yIGFmdGVyKQorCisgICAgICAgIHNlbGYubmV4dEJsb2NrKCkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmJvZHkpCisgICAgICAgIHNlbGYuZW1pdCgnSlVNUF9BQlNPTFVURScsIGxvb3ApCisKKyAgICAgICAgc2VsZi5zdGFydEJsb2NrKGVsc2VfKSAjIG9yIGp1c3QgdGhlIFBPUHMgaWYgbm90IGVsc2UgY2xhdXNlCisgICAgICAgIHNlbGYuZW1pdCgnUE9QX0JMT0NLJykKKyAgICAgICAgc2VsZi5zZXR1cHMucG9wKCkKKyAgICAgICAgaWYgbm9kZS5lbHNlXzoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5lbHNlXykKKyAgICAgICAgc2VsZi5uZXh0QmxvY2soYWZ0ZXIpCisKKyAgICBkZWYgdmlzaXRGb3Ioc2VsZiwgbm9kZSk6CisgICAgICAgIHN0YXJ0ID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIGFuY2hvciA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBhZnRlciA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBzZWxmLnNldHVwcy5wdXNoKChMT09QLCBzdGFydCkpCisKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIHNlbGYuZW1pdCgnU0VUVVBfTE9PUCcsIGFmdGVyKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUubGlzdCkKKyAgICAgICAgc2VsZi5lbWl0KCdHRVRfSVRFUicpCisKKyAgICAgICAgc2VsZi5uZXh0QmxvY2soc3RhcnQpCisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlLCBmb3JjZT0xKQorICAgICAgICBzZWxmLmVtaXQoJ0ZPUl9JVEVSJywgYW5jaG9yKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuYXNzaWduKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuYm9keSkKKyAgICAgICAgc2VsZi5lbWl0KCdKVU1QX0FCU09MVVRFJywgc3RhcnQpCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGFuY2hvcikKKyAgICAgICAgc2VsZi5lbWl0KCdQT1BfQkxPQ0snKQorICAgICAgICBzZWxmLnNldHVwcy5wb3AoKQorICAgICAgICBpZiBub2RlLmVsc2VfOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmVsc2VfKQorICAgICAgICBzZWxmLm5leHRCbG9jayhhZnRlcikKKworICAgIGRlZiB2aXNpdEJyZWFrKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3Qgc2VsZi5zZXR1cHM6CisgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgIidicmVhaycgb3V0c2lkZSBsb29wICglcywgJWQpIiAlIFwKKyAgICAgICAgICAgICAgICAgIChub2RlLmZpbGVuYW1lLCBub2RlLmxpbmVubykKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIHNlbGYuZW1pdCgnQlJFQUtfTE9PUCcpCisKKyAgICBkZWYgdmlzaXRDb250aW51ZShzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm90IHNlbGYuc2V0dXBzOgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICInY29udGludWUnIG91dHNpZGUgbG9vcCAoJXMsICVkKSIgJSBcCisgICAgICAgICAgICAgICAgICAobm9kZS5maWxlbmFtZSwgbm9kZS5saW5lbm8pCisgICAgICAgIGtpbmQsIGJsb2NrID0gc2VsZi5zZXR1cHMudG9wKCkKKyAgICAgICAgaWYga2luZCA9PSBMT09QOgorICAgICAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0pVTVBfQUJTT0xVVEUnLCBibG9jaykKKyAgICAgICAgICAgIHNlbGYubmV4dEJsb2NrKCkKKyAgICAgICAgZWxpZiBraW5kID09IEVYQ0VQVCBvciBraW5kID09IFRSWV9GSU5BTExZOgorICAgICAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgICAgICAjIGZpbmQgdGhlIGJsb2NrIHRoYXQgc3RhcnRzIHRoZSBsb29wCisgICAgICAgICAgICB0b3AgPSBsZW4oc2VsZi5zZXR1cHMpCisgICAgICAgICAgICB3aGlsZSB0b3AgPiAwOgorICAgICAgICAgICAgICAgIHRvcCA9IHRvcCAtIDEKKyAgICAgICAgICAgICAgICBraW5kLCBsb29wX2Jsb2NrID0gc2VsZi5zZXR1cHNbdG9wXQorICAgICAgICAgICAgICAgIGlmIGtpbmQgPT0gTE9PUDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGtpbmQgIT0gTE9PUDoKKyAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgIidjb250aW51ZScgb3V0c2lkZSBsb29wICglcywgJWQpIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAobm9kZS5maWxlbmFtZSwgbm9kZS5saW5lbm8pCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0NPTlRJTlVFX0xPT1AnLCBsb29wX2Jsb2NrKQorICAgICAgICAgICAgc2VsZi5uZXh0QmxvY2soKQorICAgICAgICBlbGlmIGtpbmQgPT0gRU5EX0ZJTkFMTFk6CisgICAgICAgICAgICBtc2cgPSAiJ2NvbnRpbnVlJyBub3QgYWxsb3dlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZSAoJXMsICVkKSIKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCBtc2cgJSAobm9kZS5maWxlbmFtZSwgbm9kZS5saW5lbm8pCisKKyAgICBkZWYgdmlzaXRUZXN0KHNlbGYsIG5vZGUsIGp1bXApOgorICAgICAgICBlbmQgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUubm9kZXNbOi0xXToKKyAgICAgICAgICAgIHNlbGYudmlzaXQoY2hpbGQpCisgICAgICAgICAgICBzZWxmLmVtaXQoanVtcCwgZW5kKQorICAgICAgICAgICAgc2VsZi5uZXh0QmxvY2soKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUubm9kZXNbLTFdKQorICAgICAgICBzZWxmLm5leHRCbG9jayhlbmQpCisKKyAgICBkZWYgdmlzaXRBbmQoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYudmlzaXRUZXN0KG5vZGUsICdKVU1QX0lGX0ZBTFNFX09SX1BPUCcpCisKKyAgICBkZWYgdmlzaXRPcihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi52aXNpdFRlc3Qobm9kZSwgJ0pVTVBfSUZfVFJVRV9PUl9QT1AnKQorCisgICAgZGVmIHZpc2l0SWZFeHAoc2VsZiwgbm9kZSk6CisgICAgICAgIGVuZGJsb2NrID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIGVsc2VibG9jayA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudGVzdCkKKyAgICAgICAgc2VsZi5lbWl0KCdQT1BfSlVNUF9JRl9GQUxTRScsIGVsc2VibG9jaykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnRoZW4pCisgICAgICAgIHNlbGYuZW1pdCgnSlVNUF9GT1JXQVJEJywgZW5kYmxvY2spCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGVsc2VibG9jaykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmVsc2VfKQorICAgICAgICBzZWxmLm5leHRCbG9jayhlbmRibG9jaykKKworICAgIGRlZiB2aXNpdENvbXBhcmUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByKQorICAgICAgICBjbGVhbnVwID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIGZvciBvcCwgY29kZSBpbiBub2RlLm9wc1s6LTFdOgorICAgICAgICAgICAgc2VsZi52aXNpdChjb2RlKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdEVVBfVE9QJykKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnUk9UX1RIUkVFJykKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnQ09NUEFSRV9PUCcsIG9wKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdKVU1QX0lGX0ZBTFNFX09SX1BPUCcsIGNsZWFudXApCisgICAgICAgICAgICBzZWxmLm5leHRCbG9jaygpCisgICAgICAgICMgbm93IGRvIHRoZSBsYXN0IGNvbXBhcmlzb24KKyAgICAgICAgaWYgbm9kZS5vcHM6CisgICAgICAgICAgICBvcCwgY29kZSA9IG5vZGUub3BzWy0xXQorICAgICAgICAgICAgc2VsZi52aXNpdChjb2RlKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdDT01QQVJFX09QJywgb3ApCisgICAgICAgIGlmIGxlbihub2RlLm9wcykgPiAxOgorICAgICAgICAgICAgZW5kID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0pVTVBfRk9SV0FSRCcsIGVuZCkKKyAgICAgICAgICAgIHNlbGYuc3RhcnRCbG9jayhjbGVhbnVwKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdST1RfVFdPJykKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnUE9QX1RPUCcpCisgICAgICAgICAgICBzZWxmLm5leHRCbG9jayhlbmQpCisKKyAgICAjIGxpc3QgY29tcHJlaGVuc2lvbnMKKyAgICBkZWYgdmlzaXRMaXN0Q29tcChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgICMgc2V0dXAgbGlzdAorICAgICAgICBzZWxmLmVtaXQoJ0JVSUxEX0xJU1QnLCAwKQorCisgICAgICAgIHN0YWNrID0gW10KKyAgICAgICAgZm9yIGksIGZvcl8gaW4gemlwKHJhbmdlKGxlbihub2RlLnF1YWxzKSksIG5vZGUucXVhbHMpOgorICAgICAgICAgICAgc3RhcnQsIGFuY2hvciA9IHNlbGYudmlzaXQoZm9yXykKKyAgICAgICAgICAgIGNvbnQgPSBOb25lCisgICAgICAgICAgICBmb3IgaWZfIGluIGZvcl8uaWZzOgorICAgICAgICAgICAgICAgIGlmIGNvbnQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgY29udCA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQoaWZfLCBjb250KQorICAgICAgICAgICAgc3RhY2suaW5zZXJ0KDAsIChzdGFydCwgY29udCwgYW5jaG9yKSkKKworICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwcikKKyAgICAgICAgc2VsZi5lbWl0KCdMSVNUX0FQUEVORCcsIGxlbihub2RlLnF1YWxzKSArIDEpCisKKyAgICAgICAgZm9yIHN0YXJ0LCBjb250LCBhbmNob3IgaW4gc3RhY2s6CisgICAgICAgICAgICBpZiBjb250OgorICAgICAgICAgICAgICAgIHNlbGYubmV4dEJsb2NrKGNvbnQpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0pVTVBfQUJTT0xVVEUnLCBzdGFydCkKKyAgICAgICAgICAgIHNlbGYuc3RhcnRCbG9jayhhbmNob3IpCisKKyAgICBkZWYgdmlzaXRTZXRDb21wKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgIyBzZXR1cCBsaXN0CisgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfU0VUJywgMCkKKworICAgICAgICBzdGFjayA9IFtdCisgICAgICAgIGZvciBpLCBmb3JfIGluIHppcChyYW5nZShsZW4obm9kZS5xdWFscykpLCBub2RlLnF1YWxzKToKKyAgICAgICAgICAgIHN0YXJ0LCBhbmNob3IgPSBzZWxmLnZpc2l0KGZvcl8pCisgICAgICAgICAgICBjb250ID0gTm9uZQorICAgICAgICAgICAgZm9yIGlmXyBpbiBmb3JfLmlmczoKKyAgICAgICAgICAgICAgICBpZiBjb250IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnQgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgICAgICAgICBzZWxmLnZpc2l0KGlmXywgY29udCkKKyAgICAgICAgICAgIHN0YWNrLmluc2VydCgwLCAoc3RhcnQsIGNvbnQsIGFuY2hvcikpCisKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisgICAgICAgIHNlbGYuZW1pdCgnU0VUX0FERCcsIGxlbihub2RlLnF1YWxzKSArIDEpCisKKyAgICAgICAgZm9yIHN0YXJ0LCBjb250LCBhbmNob3IgaW4gc3RhY2s6CisgICAgICAgICAgICBpZiBjb250OgorICAgICAgICAgICAgICAgIHNlbGYubmV4dEJsb2NrKGNvbnQpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0pVTVBfQUJTT0xVVEUnLCBzdGFydCkKKyAgICAgICAgICAgIHNlbGYuc3RhcnRCbG9jayhhbmNob3IpCisKKyAgICBkZWYgdmlzaXREaWN0Q29tcChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgICMgc2V0dXAgbGlzdAorICAgICAgICBzZWxmLmVtaXQoJ0JVSUxEX01BUCcsIDApCisKKyAgICAgICAgc3RhY2sgPSBbXQorICAgICAgICBmb3IgaSwgZm9yXyBpbiB6aXAocmFuZ2UobGVuKG5vZGUucXVhbHMpKSwgbm9kZS5xdWFscyk6CisgICAgICAgICAgICBzdGFydCwgYW5jaG9yID0gc2VsZi52aXNpdChmb3JfKQorICAgICAgICAgICAgY29udCA9IE5vbmUKKyAgICAgICAgICAgIGZvciBpZl8gaW4gZm9yXy5pZnM6CisgICAgICAgICAgICAgICAgaWYgY29udCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBjb250ID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChpZl8sIGNvbnQpCisgICAgICAgICAgICBzdGFjay5pbnNlcnQoMCwgKHN0YXJ0LCBjb250LCBhbmNob3IpKQorCisgICAgICAgIHNlbGYudmlzaXQobm9kZS52YWx1ZSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmtleSkKKyAgICAgICAgc2VsZi5lbWl0KCdNQVBfQUREJywgbGVuKG5vZGUucXVhbHMpICsgMSkKKworICAgICAgICBmb3Igc3RhcnQsIGNvbnQsIGFuY2hvciBpbiBzdGFjazoKKyAgICAgICAgICAgIGlmIGNvbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5uZXh0QmxvY2soY29udCkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnSlVNUF9BQlNPTFVURScsIHN0YXJ0KQorICAgICAgICAgICAgc2VsZi5zdGFydEJsb2NrKGFuY2hvcikKKworICAgIGRlZiB2aXNpdExpc3RDb21wRm9yKHNlbGYsIG5vZGUpOgorICAgICAgICBzdGFydCA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBhbmNob3IgPSBzZWxmLm5ld0Jsb2NrKCkKKworICAgICAgICBzZWxmLnZpc2l0KG5vZGUubGlzdCkKKyAgICAgICAgc2VsZi5lbWl0KCdHRVRfSVRFUicpCisgICAgICAgIHNlbGYubmV4dEJsb2NrKHN0YXJ0KQorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSwgZm9yY2U9VHJ1ZSkKKyAgICAgICAgc2VsZi5lbWl0KCdGT1JfSVRFUicsIGFuY2hvcikKKyAgICAgICAgc2VsZi5uZXh0QmxvY2soKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuYXNzaWduKQorICAgICAgICByZXR1cm4gc3RhcnQsIGFuY2hvcgorCisgICAgZGVmIHZpc2l0TGlzdENvbXBJZihzZWxmLCBub2RlLCBicmFuY2gpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSwgZm9yY2U9VHJ1ZSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnRlc3QpCisgICAgICAgIHNlbGYuZW1pdCgnUE9QX0pVTVBfSUZfRkFMU0UnLCBicmFuY2gpCisgICAgICAgIHNlbGYubmV3QmxvY2soKQorCisgICAgZGVmIF9tYWtlQ2xvc3VyZShzZWxmLCBnZW4sIGFyZ3MpOgorICAgICAgICBmcmVlcyA9IGdlbi5zY29wZS5nZXRfZnJlZV92YXJzKCkKKyAgICAgICAgaWYgZnJlZXM6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBmcmVlczoKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ0xPU1VSRScsIG5hbWUpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0JVSUxEX1RVUExFJywgbGVuKGZyZWVzKSkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIGdlbikKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9DTE9TVVJFJywgYXJncykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIGdlbikKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9GVU5DVElPTicsIGFyZ3MpCisKKyAgICBkZWYgdmlzaXRHZW5FeHByKHNlbGYsIG5vZGUpOgorICAgICAgICBnZW4gPSBHZW5FeHByQ29kZUdlbmVyYXRvcihub2RlLCBzZWxmLnNjb3Blcywgc2VsZi5jbGFzc19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9tb2R1bGUoKSkKKyAgICAgICAgd2Fsayhub2RlLmNvZGUsIGdlbikKKyAgICAgICAgZ2VuLmZpbmlzaCgpCisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBzZWxmLl9tYWtlQ2xvc3VyZShnZW4sIDApCisgICAgICAgICMgcHJlY29tcHV0YXRpb24gb2Ygb3V0bW9zdCBpdGVyYWJsZQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuY29kZS5xdWFsc1swXS5pdGVyKQorICAgICAgICBzZWxmLmVtaXQoJ0dFVF9JVEVSJykKKyAgICAgICAgc2VsZi5lbWl0KCdDQUxMX0ZVTkNUSU9OJywgMSkKKworICAgIGRlZiB2aXNpdEdlbkV4cHJJbm5lcihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgICMgc2V0dXAgbGlzdAorCisgICAgICAgIHN0YWNrID0gW10KKyAgICAgICAgZm9yIGksIGZvcl8gaW4gemlwKHJhbmdlKGxlbihub2RlLnF1YWxzKSksIG5vZGUucXVhbHMpOgorICAgICAgICAgICAgc3RhcnQsIGFuY2hvciwgZW5kID0gc2VsZi52aXNpdChmb3JfKQorICAgICAgICAgICAgY29udCA9IE5vbmUKKyAgICAgICAgICAgIGZvciBpZl8gaW4gZm9yXy5pZnM6CisgICAgICAgICAgICAgICAgaWYgY29udCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBjb250ID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChpZl8sIGNvbnQpCisgICAgICAgICAgICBzdGFjay5pbnNlcnQoMCwgKHN0YXJ0LCBjb250LCBhbmNob3IsIGVuZCkpCisKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisgICAgICAgIHNlbGYuZW1pdCgnWUlFTERfVkFMVUUnKQorICAgICAgICBzZWxmLmVtaXQoJ1BPUF9UT1AnKQorCisgICAgICAgIGZvciBzdGFydCwgY29udCwgYW5jaG9yLCBlbmQgaW4gc3RhY2s6CisgICAgICAgICAgICBpZiBjb250OgorICAgICAgICAgICAgICAgIHNlbGYubmV4dEJsb2NrKGNvbnQpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0pVTVBfQUJTT0xVVEUnLCBzdGFydCkKKyAgICAgICAgICAgIHNlbGYuc3RhcnRCbG9jayhhbmNob3IpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ1BPUF9CTE9DSycpCisgICAgICAgICAgICBzZWxmLnNldHVwcy5wb3AoKQorICAgICAgICAgICAgc2VsZi5uZXh0QmxvY2soZW5kKQorCisgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIE5vbmUpCisKKyAgICBkZWYgdmlzaXRHZW5FeHByRm9yKHNlbGYsIG5vZGUpOgorICAgICAgICBzdGFydCA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBhbmNob3IgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgZW5kID0gc2VsZi5uZXdCbG9jaygpCisKKyAgICAgICAgc2VsZi5zZXR1cHMucHVzaCgoTE9PUCwgc3RhcnQpKQorICAgICAgICBzZWxmLmVtaXQoJ1NFVFVQX0xPT1AnLCBlbmQpCisKKyAgICAgICAgaWYgbm9kZS5pc19vdXRtb3N0OgorICAgICAgICAgICAgc2VsZi5sb2FkTmFtZSgnLjAnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLml0ZXIpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0dFVF9JVEVSJykKKworICAgICAgICBzZWxmLm5leHRCbG9jayhzdGFydCkKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUsIGZvcmNlPVRydWUpCisgICAgICAgIHNlbGYuZW1pdCgnRk9SX0lURVInLCBhbmNob3IpCisgICAgICAgIHNlbGYubmV4dEJsb2NrKCkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmFzc2lnbikKKyAgICAgICAgcmV0dXJuIHN0YXJ0LCBhbmNob3IsIGVuZAorCisgICAgZGVmIHZpc2l0R2VuRXhwcklmKHNlbGYsIG5vZGUsIGJyYW5jaCk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlLCBmb3JjZT1UcnVlKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudGVzdCkKKyAgICAgICAgc2VsZi5lbWl0KCdQT1BfSlVNUF9JRl9GQUxTRScsIGJyYW5jaCkKKyAgICAgICAgc2VsZi5uZXdCbG9jaygpCisKKyAgICAjIGV4Y2VwdGlvbiByZWxhdGVkCisKKyAgICBkZWYgdmlzaXRBc3NlcnQoc2VsZiwgbm9kZSk6CisgICAgICAgICMgWFhYIHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIGltcGxlbWVudCB0aGlzIHZpYSBhCisgICAgICAgICMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIEFTVCBiZWZvcmUgdGhpcyBzdGFnZQorICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICBlbmQgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICAgICAgIyBYWFggQXNzZXJ0aW9uRXJyb3IgYXBwZWFycyB0byBiZSBzcGVjaWFsIGNhc2UgLS0gaXQgaXMgYWx3YXlzCisgICAgICAgICAgICAjIGxvYWRlZCBhcyBhIGdsb2JhbCBldmVuIGlmIHRoZXJlIGlzIGEgbG9jYWwgbmFtZS4gIEkgZ3Vlc3MgdGhpcworICAgICAgICAgICAgIyBpcyBhIHNvcnQgb2YgcmVuYW1pbmcgb3AuCisgICAgICAgICAgICBzZWxmLm5leHRCbG9jaygpCisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUudGVzdCkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnUE9QX0pVTVBfSUZfVFJVRScsIGVuZCkKKyAgICAgICAgICAgIHNlbGYubmV4dEJsb2NrKCkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9HTE9CQUwnLCAnQXNzZXJ0aW9uRXJyb3InKQorICAgICAgICAgICAgaWYgbm9kZS5mYWlsOgorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5mYWlsKQorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnUkFJU0VfVkFSQVJHUycsIDIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnUkFJU0VfVkFSQVJHUycsIDEpCisgICAgICAgICAgICBzZWxmLm5leHRCbG9jayhlbmQpCisKKyAgICBkZWYgdmlzaXRSYWlzZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIG4gPSAwCisgICAgICAgIGlmIG5vZGUuZXhwcjE6CisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwcjEpCisgICAgICAgICAgICBuID0gbiArIDEKKyAgICAgICAgaWYgbm9kZS5leHByMjoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByMikKKyAgICAgICAgICAgIG4gPSBuICsgMQorICAgICAgICBpZiBub2RlLmV4cHIzOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIzKQorICAgICAgICAgICAgbiA9IG4gKyAxCisgICAgICAgIHNlbGYuZW1pdCgnUkFJU0VfVkFSQVJHUycsIG4pCisKKyAgICBkZWYgdmlzaXRUcnlFeGNlcHQoc2VsZiwgbm9kZSk6CisgICAgICAgIGJvZHkgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgaGFuZGxlcnMgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgZW5kID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIGlmIG5vZGUuZWxzZV86CisgICAgICAgICAgICBsRWxzZSA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbEVsc2UgPSBlbmQKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIHNlbGYuZW1pdCgnU0VUVVBfRVhDRVBUJywgaGFuZGxlcnMpCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGJvZHkpCisgICAgICAgIHNlbGYuc2V0dXBzLnB1c2goKEVYQ0VQVCwgYm9keSkpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5ib2R5KQorICAgICAgICBzZWxmLmVtaXQoJ1BPUF9CTE9DSycpCisgICAgICAgIHNlbGYuc2V0dXBzLnBvcCgpCisgICAgICAgIHNlbGYuZW1pdCgnSlVNUF9GT1JXQVJEJywgbEVsc2UpCisgICAgICAgIHNlbGYuc3RhcnRCbG9jayhoYW5kbGVycykKKworICAgICAgICBsYXN0ID0gbGVuKG5vZGUuaGFuZGxlcnMpIC0gMQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obm9kZS5oYW5kbGVycykpOgorICAgICAgICAgICAgZXhwciwgdGFyZ2V0LCBib2R5ID0gbm9kZS5oYW5kbGVyc1tpXQorICAgICAgICAgICAgc2VsZi5zZXRfbGluZW5vKGV4cHIpCisgICAgICAgICAgICBpZiBleHByOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnRFVQX1RPUCcpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChleHByKQorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnQ09NUEFSRV9PUCcsICdleGNlcHRpb24gbWF0Y2gnKQorICAgICAgICAgICAgICAgIG5leHQgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ1BPUF9KVU1QX0lGX0ZBTFNFJywgbmV4dCkKKyAgICAgICAgICAgICAgICBzZWxmLm5leHRCbG9jaygpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ1BPUF9UT1AnKQorICAgICAgICAgICAgaWYgdGFyZ2V0OgorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQodGFyZ2V0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ1BPUF9UT1AnKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdQT1BfVE9QJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQoYm9keSkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnSlVNUF9GT1JXQVJEJywgZW5kKQorICAgICAgICAgICAgaWYgZXhwcjoKKyAgICAgICAgICAgICAgICBzZWxmLm5leHRCbG9jayhuZXh0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLm5leHRCbG9jaygpCisgICAgICAgIHNlbGYuZW1pdCgnRU5EX0ZJTkFMTFknKQorICAgICAgICBpZiBub2RlLmVsc2VfOgorICAgICAgICAgICAgc2VsZi5uZXh0QmxvY2sobEVsc2UpCisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZWxzZV8pCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGVuZCkKKworICAgIGRlZiB2aXNpdFRyeUZpbmFsbHkoc2VsZiwgbm9kZSk6CisgICAgICAgIGJvZHkgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgZmluYWwgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIHNlbGYuZW1pdCgnU0VUVVBfRklOQUxMWScsIGZpbmFsKQorICAgICAgICBzZWxmLm5leHRCbG9jayhib2R5KQorICAgICAgICBzZWxmLnNldHVwcy5wdXNoKChUUllfRklOQUxMWSwgYm9keSkpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5ib2R5KQorICAgICAgICBzZWxmLmVtaXQoJ1BPUF9CTE9DSycpCisgICAgICAgIHNlbGYuc2V0dXBzLnBvcCgpCisgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIE5vbmUpCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGZpbmFsKQorICAgICAgICBzZWxmLnNldHVwcy5wdXNoKChFTkRfRklOQUxMWSwgZmluYWwpKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZmluYWwpCisgICAgICAgIHNlbGYuZW1pdCgnRU5EX0ZJTkFMTFknKQorICAgICAgICBzZWxmLnNldHVwcy5wb3AoKQorCisgICAgX193aXRoX2NvdW50ID0gMAorCisgICAgZGVmIHZpc2l0V2l0aChzZWxmLCBub2RlKToKKyAgICAgICAgYm9keSA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBmaW5hbCA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBzZWxmLl9fd2l0aF9jb3VudCArPSAxCisgICAgICAgIHZhbHVldmFyID0gIl9bJWRdIiAlIHNlbGYuX193aXRoX2NvdW50CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwcikKKyAgICAgICAgc2VsZi5lbWl0KCdEVVBfVE9QJykKKyAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0FUVFInLCAnX19leGl0X18nKQorICAgICAgICBzZWxmLmVtaXQoJ1JPVF9UV08nKQorICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQVRUUicsICdfX2VudGVyX18nKQorICAgICAgICBzZWxmLmVtaXQoJ0NBTExfRlVOQ1RJT04nLCAwKQorICAgICAgICBpZiBub2RlLnZhcnMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnUE9QX1RPUCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9pbXBsaWNpdE5hbWVPcCgnU1RPUkUnLCB2YWx1ZXZhcikKKyAgICAgICAgc2VsZi5lbWl0KCdTRVRVUF9GSU5BTExZJywgZmluYWwpCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGJvZHkpCisgICAgICAgIHNlbGYuc2V0dXBzLnB1c2goKFRSWV9GSU5BTExZLCBib2R5KSkKKyAgICAgICAgaWYgbm9kZS52YXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5faW1wbGljaXROYW1lT3AoJ0xPQUQnLCB2YWx1ZXZhcikKKyAgICAgICAgICAgIHNlbGYuX2ltcGxpY2l0TmFtZU9wKCdERUxFVEUnLCB2YWx1ZXZhcikKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS52YXJzKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuYm9keSkKKyAgICAgICAgc2VsZi5lbWl0KCdQT1BfQkxPQ0snKQorICAgICAgICBzZWxmLnNldHVwcy5wb3AoKQorICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBOb25lKQorICAgICAgICBzZWxmLm5leHRCbG9jayhmaW5hbCkKKyAgICAgICAgc2VsZi5zZXR1cHMucHVzaCgoRU5EX0ZJTkFMTFksIGZpbmFsKSkKKyAgICAgICAgc2VsZi5lbWl0KCdXSVRIX0NMRUFOVVAnKQorICAgICAgICBzZWxmLmVtaXQoJ0VORF9GSU5BTExZJykKKyAgICAgICAgc2VsZi5zZXR1cHMucG9wKCkKKyAgICAgICAgc2VsZi5fX3dpdGhfY291bnQgLT0gMQorCisgICAgIyBtaXNjCisKKyAgICBkZWYgdmlzaXREaXNjYXJkKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisgICAgICAgIHNlbGYuZW1pdCgnUE9QX1RPUCcpCisKKyAgICBkZWYgdmlzaXRDb25zdChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgbm9kZS52YWx1ZSkKKworICAgIGRlZiB2aXNpdEtleXdvcmQoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIG5vZGUubmFtZSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisKKyAgICBkZWYgdmlzaXRHbG9iYWwoc2VsZiwgbm9kZSk6CisgICAgICAgICMgbm8gY29kZSB0byBnZW5lcmF0ZQorICAgICAgICBwYXNzCisKKyAgICBkZWYgdmlzaXROYW1lKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgc2VsZi5sb2FkTmFtZShub2RlLm5hbWUpCisKKyAgICBkZWYgdmlzaXRQYXNzKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKworICAgIGRlZiB2aXNpdEltcG9ydChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIGxldmVsID0gMCBpZiBzZWxmLmdyYXBoLmNoZWNrRmxhZyhDT19GVVRVUkVfQUJTSU1QT1JUKSBlbHNlIC0xCisgICAgICAgIGZvciBuYW1lLCBhbGlhcyBpbiBub2RlLm5hbWVzOgorICAgICAgICAgICAgaWYgVkVSU0lPTiA+IDE6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgbGV2ZWwpCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnSU1QT1JUX05BTUUnLCBuYW1lKQorICAgICAgICAgICAgbW9kID0gbmFtZS5zcGxpdCgiLiIpWzBdCisgICAgICAgICAgICBpZiBhbGlhczoKKyAgICAgICAgICAgICAgICBzZWxmLl9yZXNvbHZlRG90cyhuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuc3RvcmVOYW1lKGFsaWFzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnN0b3JlTmFtZShtb2QpCisKKyAgICBkZWYgdmlzaXRGcm9tKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgbGV2ZWwgPSBub2RlLmxldmVsCisgICAgICAgIGlmIGxldmVsID09IDAgYW5kIG5vdCBzZWxmLmdyYXBoLmNoZWNrRmxhZyhDT19GVVRVUkVfQUJTSU1QT1JUKToKKyAgICAgICAgICAgIGxldmVsID0gLTEKKyAgICAgICAgZnJvbWxpc3QgPSB0dXBsZShuYW1lIGZvciAobmFtZSwgYWxpYXMpIGluIG5vZGUubmFtZXMpCisgICAgICAgIGlmIFZFUlNJT04gPiAxOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgbGV2ZWwpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBmcm9tbGlzdCkKKyAgICAgICAgc2VsZi5lbWl0KCdJTVBPUlRfTkFNRScsIG5vZGUubW9kbmFtZSkKKyAgICAgICAgZm9yIG5hbWUsIGFsaWFzIGluIG5vZGUubmFtZXM6CisgICAgICAgICAgICBpZiBWRVJTSU9OID4gMToKKyAgICAgICAgICAgICAgICBpZiBuYW1lID09ICcqJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5uYW1lc3BhY2UgPSAwCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnSU1QT1JUX1NUQVInKQorICAgICAgICAgICAgICAgICAgICAjIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBuYW1lIHcvIGZyb20gLi4uIGltcG9ydCAqCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBsZW4obm9kZS5uYW1lcykgPT0gMQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0lNUE9SVF9GUk9NJywgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVzb2x2ZURvdHMobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdG9yZU5hbWUoYWxpYXMgb3IgbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdJTVBPUlRfRlJPTScsIG5hbWUpCisgICAgICAgIHNlbGYuZW1pdCgnUE9QX1RPUCcpCisKKyAgICBkZWYgX3Jlc29sdmVEb3RzKHNlbGYsIG5hbWUpOgorICAgICAgICBlbHRzID0gbmFtZS5zcGxpdCgiLiIpCisgICAgICAgIGlmIGxlbihlbHRzKSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZvciBlbHQgaW4gZWx0c1sxOl06CisgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQVRUUicsIGVsdCkKKworICAgIGRlZiB2aXNpdEdldGF0dHIoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByKQorICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQVRUUicsIHNlbGYubWFuZ2xlKG5vZGUuYXR0cm5hbWUpKQorCisgICAgIyBuZXh0IGZpdmUgaW1wbGVtZW50IGFzc2lnbm1lbnRzCisKKyAgICBkZWYgdmlzaXRBc3NpZ24oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwcikKKyAgICAgICAgZHVwcyA9IGxlbihub2RlLm5vZGVzKSAtIDEKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKG5vZGUubm9kZXMpKToKKyAgICAgICAgICAgIGVsdCA9IG5vZGUubm9kZXNbaV0KKyAgICAgICAgICAgIGlmIGkgPCBkdXBzOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnRFVQX1RPUCcpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVsdCwgYXN0Lk5vZGUpOgorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQoZWx0KQorCisgICAgZGVmIHZpc2l0QXNzTmFtZShzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm9kZS5mbGFncyA9PSAnT1BfQVNTSUdOJzoKKyAgICAgICAgICAgIHNlbGYuc3RvcmVOYW1lKG5vZGUubmFtZSkKKyAgICAgICAgZWxpZiBub2RlLmZsYWdzID09ICdPUF9ERUxFVEUnOgorICAgICAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgICAgICBzZWxmLmRlbE5hbWUobm9kZS5uYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgIm9vcHMiLCBub2RlLmZsYWdzCisKKyAgICBkZWYgdmlzaXRBc3NBdHRyKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwcikKKyAgICAgICAgaWYgbm9kZS5mbGFncyA9PSAnT1BfQVNTSUdOJzoKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnU1RPUkVfQVRUUicsIHNlbGYubWFuZ2xlKG5vZGUuYXR0cm5hbWUpKQorICAgICAgICBlbGlmIG5vZGUuZmxhZ3MgPT0gJ09QX0RFTEVURSc6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ0RFTEVURV9BVFRSJywgc2VsZi5tYW5nbGUobm9kZS5hdHRybmFtZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAid2FybmluZzogdW5leHBlY3RlZCBmbGFnczoiLCBub2RlLmZsYWdzCisgICAgICAgICAgICBwcmludCBub2RlCisKKyAgICBkZWYgX3Zpc2l0QXNzU2VxdWVuY2Uoc2VsZiwgbm9kZSwgb3A9J1VOUEFDS19TRVFVRU5DRScpOgorICAgICAgICBpZiBmaW5kT3Aobm9kZSkgIT0gJ09QX0RFTEVURSc6CisgICAgICAgICAgICBzZWxmLmVtaXQob3AsIGxlbihub2RlLm5vZGVzKSkKKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUubm9kZXM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KGNoaWxkKQorCisgICAgaWYgVkVSU0lPTiA+IDE6CisgICAgICAgIHZpc2l0QXNzVHVwbGUgPSBfdmlzaXRBc3NTZXF1ZW5jZQorICAgICAgICB2aXNpdEFzc0xpc3QgPSBfdmlzaXRBc3NTZXF1ZW5jZQorICAgIGVsc2U6CisgICAgICAgIGRlZiB2aXNpdEFzc1R1cGxlKHNlbGYsIG5vZGUpOgorICAgICAgICAgICAgc2VsZi5fdmlzaXRBc3NTZXF1ZW5jZShub2RlLCAnVU5QQUNLX1RVUExFJykKKworICAgICAgICBkZWYgdmlzaXRBc3NMaXN0KHNlbGYsIG5vZGUpOgorICAgICAgICAgICAgc2VsZi5fdmlzaXRBc3NTZXF1ZW5jZShub2RlLCAnVU5QQUNLX0xJU1QnKQorCisgICAgIyBhdWdtZW50ZWQgYXNzaWdubWVudAorCisgICAgZGVmIHZpc2l0QXVnQXNzaWduKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgYXVnX25vZGUgPSB3cmFwX2F1Zyhub2RlLm5vZGUpCisgICAgICAgIHNlbGYudmlzaXQoYXVnX25vZGUsICJsb2FkIikKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisgICAgICAgIHNlbGYuZW1pdChzZWxmLl9hdWdtZW50ZWRfb3Bjb2RlW25vZGUub3BdKQorICAgICAgICBzZWxmLnZpc2l0KGF1Z19ub2RlLCAic3RvcmUiKQorCisgICAgX2F1Z21lbnRlZF9vcGNvZGUgPSB7CisgICAgICAgICcrPScgOiAnSU5QTEFDRV9BREQnLAorICAgICAgICAnLT0nIDogJ0lOUExBQ0VfU1VCVFJBQ1QnLAorICAgICAgICAnKj0nIDogJ0lOUExBQ0VfTVVMVElQTFknLAorICAgICAgICAnLz0nIDogJ0lOUExBQ0VfRElWSURFJywKKyAgICAgICAgJy8vPSc6ICdJTlBMQUNFX0ZMT09SX0RJVklERScsCisgICAgICAgICclPScgOiAnSU5QTEFDRV9NT0RVTE8nLAorICAgICAgICAnKio9JzogJ0lOUExBQ0VfUE9XRVInLAorICAgICAgICAnPj49JzogJ0lOUExBQ0VfUlNISUZUJywKKyAgICAgICAgJzw8PSc6ICdJTlBMQUNFX0xTSElGVCcsCisgICAgICAgICcmPScgOiAnSU5QTEFDRV9BTkQnLAorICAgICAgICAnXj0nIDogJ0lOUExBQ0VfWE9SJywKKyAgICAgICAgJ3w9JyA6ICdJTlBMQUNFX09SJywKKyAgICAgICAgfQorCisgICAgZGVmIHZpc2l0QXVnTmFtZShzZWxmLCBub2RlLCBtb2RlKToKKyAgICAgICAgaWYgbW9kZSA9PSAibG9hZCI6CisgICAgICAgICAgICBzZWxmLmxvYWROYW1lKG5vZGUubmFtZSkKKyAgICAgICAgZWxpZiBtb2RlID09ICJzdG9yZSI6CisgICAgICAgICAgICBzZWxmLnN0b3JlTmFtZShub2RlLm5hbWUpCisKKyAgICBkZWYgdmlzaXRBdWdHZXRhdHRyKHNlbGYsIG5vZGUsIG1vZGUpOgorICAgICAgICBpZiBtb2RlID09ICJsb2FkIjoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdEVVBfVE9QJykKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9BVFRSJywgc2VsZi5tYW5nbGUobm9kZS5hdHRybmFtZSkpCisgICAgICAgIGVsaWYgbW9kZSA9PSAic3RvcmUiOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdST1RfVFdPJykKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnU1RPUkVfQVRUUicsIHNlbGYubWFuZ2xlKG5vZGUuYXR0cm5hbWUpKQorCisgICAgZGVmIHZpc2l0QXVnU2xpY2Uoc2VsZiwgbm9kZSwgbW9kZSk6CisgICAgICAgIGlmIG1vZGUgPT0gImxvYWQiOgorICAgICAgICAgICAgc2VsZi52aXNpdFNsaWNlKG5vZGUsIDEpCisgICAgICAgIGVsaWYgbW9kZSA9PSAic3RvcmUiOgorICAgICAgICAgICAgc2xpY2UgPSAwCisgICAgICAgICAgICBpZiBub2RlLmxvd2VyOgorICAgICAgICAgICAgICAgIHNsaWNlID0gc2xpY2UgfCAxCisgICAgICAgICAgICBpZiBub2RlLnVwcGVyOgorICAgICAgICAgICAgICAgIHNsaWNlID0gc2xpY2UgfCAyCisgICAgICAgICAgICBpZiBzbGljZSA9PSAwOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnUk9UX1RXTycpCisgICAgICAgICAgICBlbGlmIHNsaWNlID09IDM6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdST1RfRk9VUicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnUk9UX1RIUkVFJykKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnU1RPUkVfU0xJQ0UrJWQnICUgc2xpY2UpCisKKyAgICBkZWYgdmlzaXRBdWdTdWJzY3JpcHQoc2VsZiwgbm9kZSwgbW9kZSk6CisgICAgICAgIGlmIG1vZGUgPT0gImxvYWQiOgorICAgICAgICAgICAgc2VsZi52aXNpdFN1YnNjcmlwdChub2RlLCAxKQorICAgICAgICBlbGlmIG1vZGUgPT0gInN0b3JlIjoKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnUk9UX1RIUkVFJykKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnU1RPUkVfU1VCU0NSJykKKworICAgIGRlZiB2aXNpdEV4ZWMoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByKQorICAgICAgICBpZiBub2RlLmxvY2FscyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5sb2NhbHMpCisgICAgICAgIGlmIG5vZGUuZ2xvYmFscyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdEVVBfVE9QJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5nbG9iYWxzKQorICAgICAgICBzZWxmLmVtaXQoJ0VYRUNfU1RNVCcpCisKKyAgICBkZWYgdmlzaXRDYWxsRnVuYyhzZWxmLCBub2RlKToKKyAgICAgICAgcG9zID0gMAorICAgICAgICBrdyA9IDAKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5ub2RlKQorICAgICAgICBmb3IgYXJnIGluIG5vZGUuYXJnczoKKyAgICAgICAgICAgIHNlbGYudmlzaXQoYXJnKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIGFzdC5LZXl3b3JkKToKKyAgICAgICAgICAgICAgICBrdyA9IGt3ICsgMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwb3MgPSBwb3MgKyAxCisgICAgICAgIGlmIG5vZGUuc3Rhcl9hcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLnN0YXJfYXJncykKKyAgICAgICAgaWYgbm9kZS5kc3Rhcl9hcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmRzdGFyX2FyZ3MpCisgICAgICAgIGhhdmVfc3RhciA9IG5vZGUuc3Rhcl9hcmdzIGlzIG5vdCBOb25lCisgICAgICAgIGhhdmVfZHN0YXIgPSBub2RlLmRzdGFyX2FyZ3MgaXMgbm90IE5vbmUKKyAgICAgICAgb3Bjb2RlID0gY2FsbGZ1bmNfb3Bjb2RlX2luZm9baGF2ZV9zdGFyLCBoYXZlX2RzdGFyXQorICAgICAgICBzZWxmLmVtaXQob3Bjb2RlLCBrdyA8PCA4IHwgcG9zKQorCisgICAgZGVmIHZpc2l0UHJpbnQoc2VsZiwgbm9kZSwgbmV3bGluZT0wKToKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIGlmIG5vZGUuZGVzdDoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5kZXN0KQorICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5ub2RlczoKKyAgICAgICAgICAgIGlmIG5vZGUuZGVzdDoKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0RVUF9UT1AnKQorICAgICAgICAgICAgc2VsZi52aXNpdChjaGlsZCkKKyAgICAgICAgICAgIGlmIG5vZGUuZGVzdDoKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ1JPVF9UV08nKQorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnUFJJTlRfSVRFTV9UTycpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnUFJJTlRfSVRFTScpCisgICAgICAgIGlmIG5vZGUuZGVzdCBhbmQgbm90IG5ld2xpbmU6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ1BPUF9UT1AnKQorCisgICAgZGVmIHZpc2l0UHJpbnRubChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi52aXNpdFByaW50KG5vZGUsIG5ld2xpbmU9MSkKKyAgICAgICAgaWYgbm9kZS5kZXN0OgorICAgICAgICAgICAgc2VsZi5lbWl0KCdQUklOVF9ORVdMSU5FX1RPJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnUFJJTlRfTkVXTElORScpCisKKyAgICBkZWYgdmlzaXRSZXR1cm4oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudmFsdWUpCisgICAgICAgIHNlbGYuZW1pdCgnUkVUVVJOX1ZBTFVFJykKKworICAgIGRlZiB2aXNpdFlpZWxkKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnZhbHVlKQorICAgICAgICBzZWxmLmVtaXQoJ1lJRUxEX1ZBTFVFJykKKworICAgICMgc2xpY2UgYW5kIHN1YnNjcmlwdCBzdHVmZgorCisgICAgZGVmIHZpc2l0U2xpY2Uoc2VsZiwgbm9kZSwgYXVnX2ZsYWc9Tm9uZSk6CisgICAgICAgICMgYXVnX2ZsYWcgaXMgdXNlZCBieSB2aXNpdEF1Z1NsaWNlCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByKQorICAgICAgICBzbGljZSA9IDAKKyAgICAgICAgaWYgbm9kZS5sb3dlcjoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5sb3dlcikKKyAgICAgICAgICAgIHNsaWNlID0gc2xpY2UgfCAxCisgICAgICAgIGlmIG5vZGUudXBwZXI6CisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUudXBwZXIpCisgICAgICAgICAgICBzbGljZSA9IHNsaWNlIHwgMgorICAgICAgICBpZiBhdWdfZmxhZzoKKyAgICAgICAgICAgIGlmIHNsaWNlID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdEVVBfVE9QJykKKyAgICAgICAgICAgIGVsaWYgc2xpY2UgPT0gMzoKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0RVUF9UT1BYJywgMykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdEVVBfVE9QWCcsIDIpCisgICAgICAgIGlmIG5vZGUuZmxhZ3MgPT0gJ09QX0FQUExZJzoKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnU0xJQ0UrJWQnICUgc2xpY2UpCisgICAgICAgIGVsaWYgbm9kZS5mbGFncyA9PSAnT1BfQVNTSUdOJzoKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnU1RPUkVfU0xJQ0UrJWQnICUgc2xpY2UpCisgICAgICAgIGVsaWYgbm9kZS5mbGFncyA9PSAnT1BfREVMRVRFJzoKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnREVMRVRFX1NMSUNFKyVkJyAlIHNsaWNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgIndlaXJkIHNsaWNlIiwgbm9kZS5mbGFncworICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiB2aXNpdFN1YnNjcmlwdChzZWxmLCBub2RlLCBhdWdfZmxhZz1Ob25lKToKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisgICAgICAgIGZvciBzdWIgaW4gbm9kZS5zdWJzOgorICAgICAgICAgICAgc2VsZi52aXNpdChzdWIpCisgICAgICAgIGlmIGxlbihub2RlLnN1YnMpID4gMToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfVFVQTEUnLCBsZW4obm9kZS5zdWJzKSkKKyAgICAgICAgaWYgYXVnX2ZsYWc6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ0RVUF9UT1BYJywgMikKKyAgICAgICAgaWYgbm9kZS5mbGFncyA9PSAnT1BfQVBQTFknOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdCSU5BUllfU1VCU0NSJykKKyAgICAgICAgZWxpZiBub2RlLmZsYWdzID09ICdPUF9BU1NJR04nOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdTVE9SRV9TVUJTQ1InKQorICAgICAgICBlbGlmIG5vZGUuZmxhZ3MgPT0gJ09QX0RFTEVURSc6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ0RFTEVURV9TVUJTQ1InKQorCisgICAgIyBiaW5hcnkgb3BzCisKKyAgICBkZWYgYmluYXJ5T3Aoc2VsZiwgbm9kZSwgb3ApOgorICAgICAgICBzZWxmLnZpc2l0KG5vZGUubGVmdCkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnJpZ2h0KQorICAgICAgICBzZWxmLmVtaXQob3ApCisKKyAgICBkZWYgdmlzaXRBZGQoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJpbmFyeU9wKG5vZGUsICdCSU5BUllfQUREJykKKworICAgIGRlZiB2aXNpdFN1YihzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmluYXJ5T3Aobm9kZSwgJ0JJTkFSWV9TVUJUUkFDVCcpCisKKyAgICBkZWYgdmlzaXRNdWwoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJpbmFyeU9wKG5vZGUsICdCSU5BUllfTVVMVElQTFknKQorCisgICAgZGVmIHZpc2l0RGl2KHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5iaW5hcnlPcChub2RlLCBzZWxmLl9kaXZfb3ApCisKKyAgICBkZWYgdmlzaXRGbG9vckRpdihzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmluYXJ5T3Aobm9kZSwgJ0JJTkFSWV9GTE9PUl9ESVZJREUnKQorCisgICAgZGVmIHZpc2l0TW9kKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5iaW5hcnlPcChub2RlLCAnQklOQVJZX01PRFVMTycpCisKKyAgICBkZWYgdmlzaXRQb3dlcihzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmluYXJ5T3Aobm9kZSwgJ0JJTkFSWV9QT1dFUicpCisKKyAgICBkZWYgdmlzaXRMZWZ0U2hpZnQoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJpbmFyeU9wKG5vZGUsICdCSU5BUllfTFNISUZUJykKKworICAgIGRlZiB2aXNpdFJpZ2h0U2hpZnQoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJpbmFyeU9wKG5vZGUsICdCSU5BUllfUlNISUZUJykKKworICAgICMgdW5hcnkgb3BzCisKKyAgICBkZWYgdW5hcnlPcChzZWxmLCBub2RlLCBvcCk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByKQorICAgICAgICBzZWxmLmVtaXQob3ApCisKKyAgICBkZWYgdmlzaXRJbnZlcnQoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLnVuYXJ5T3Aobm9kZSwgJ1VOQVJZX0lOVkVSVCcpCisKKyAgICBkZWYgdmlzaXRVbmFyeVN1YihzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYudW5hcnlPcChub2RlLCAnVU5BUllfTkVHQVRJVkUnKQorCisgICAgZGVmIHZpc2l0VW5hcnlBZGQoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLnVuYXJ5T3Aobm9kZSwgJ1VOQVJZX1BPU0lUSVZFJykKKworICAgIGRlZiB2aXNpdFVuYXJ5SW52ZXJ0KHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi51bmFyeU9wKG5vZGUsICdVTkFSWV9JTlZFUlQnKQorCisgICAgZGVmIHZpc2l0Tm90KHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi51bmFyeU9wKG5vZGUsICdVTkFSWV9OT1QnKQorCisgICAgZGVmIHZpc2l0QmFja3F1b3RlKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi51bmFyeU9wKG5vZGUsICdVTkFSWV9DT05WRVJUJykKKworICAgICMgYml0IG9wcworCisgICAgZGVmIGJpdE9wKHNlbGYsIG5vZGVzLCBvcCk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZXNbMF0pCisgICAgICAgIGZvciBub2RlIGluIG5vZGVzWzE6XToKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZSkKKyAgICAgICAgICAgIHNlbGYuZW1pdChvcCkKKworICAgIGRlZiB2aXNpdEJpdGFuZChzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYml0T3Aobm9kZS5ub2RlcywgJ0JJTkFSWV9BTkQnKQorCisgICAgZGVmIHZpc2l0Qml0b3Ioc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJpdE9wKG5vZGUubm9kZXMsICdCSU5BUllfT1InKQorCisgICAgZGVmIHZpc2l0Qml0eG9yKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5iaXRPcChub2RlLm5vZGVzLCAnQklOQVJZX1hPUicpCisKKyAgICAjIG9iamVjdCBjb25zdHJ1Y3RvcnMKKworICAgIGRlZiB2aXNpdEVsbGlwc2lzKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBFbGxpcHNpcykKKworICAgIGRlZiB2aXNpdFR1cGxlKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgZm9yIGVsdCBpbiBub2RlLm5vZGVzOgorICAgICAgICAgICAgc2VsZi52aXNpdChlbHQpCisgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfVFVQTEUnLCBsZW4obm9kZS5ub2RlcykpCisKKyAgICBkZWYgdmlzaXRMaXN0KHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgZm9yIGVsdCBpbiBub2RlLm5vZGVzOgorICAgICAgICAgICAgc2VsZi52aXNpdChlbHQpCisgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfTElTVCcsIGxlbihub2RlLm5vZGVzKSkKKworICAgIGRlZiB2aXNpdFNldChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIGZvciBlbHQgaW4gbm9kZS5ub2RlczoKKyAgICAgICAgICAgIHNlbGYudmlzaXQoZWx0KQorICAgICAgICBzZWxmLmVtaXQoJ0JVSUxEX1NFVCcsIGxlbihub2RlLm5vZGVzKSkKKworICAgIGRlZiB2aXNpdFNsaWNlb2JqKHNlbGYsIG5vZGUpOgorICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5ub2RlczoKKyAgICAgICAgICAgIHNlbGYudmlzaXQoY2hpbGQpCisgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfU0xJQ0UnLCBsZW4obm9kZS5ub2RlcykpCisKKyAgICBkZWYgdmlzaXREaWN0KHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgc2VsZi5lbWl0KCdCVUlMRF9NQVAnLCAwKQorICAgICAgICBmb3IgaywgdiBpbiBub2RlLml0ZW1zOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdEVVBfVE9QJykKKyAgICAgICAgICAgIHNlbGYudmlzaXQoaykKKyAgICAgICAgICAgIHNlbGYudmlzaXQodikKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnUk9UX1RIUkVFJykKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnU1RPUkVfU1VCU0NSJykKKworY2xhc3MgTmVzdGVkU2NvcGVNaXhpbjoKKyAgICAiIiJEZWZpbmVzIGluaXRDbGFzcygpIGZvciBuZXN0ZWQgc2NvcGluZyAoUHl0aG9uIDIuMi1jb21wYXRpYmxlKSIiIgorICAgIGRlZiBpbml0Q2xhc3Moc2VsZik6CisgICAgICAgIHNlbGYuX19jbGFzc19fLk5hbWVGaW5kZXIgPSBMb2NhbE5hbWVGaW5kZXIKKyAgICAgICAgc2VsZi5fX2NsYXNzX18uRnVuY3Rpb25HZW4gPSBGdW5jdGlvbkNvZGVHZW5lcmF0b3IKKyAgICAgICAgc2VsZi5fX2NsYXNzX18uQ2xhc3NHZW4gPSBDbGFzc0NvZGVHZW5lcmF0b3IKKworY2xhc3MgTW9kdWxlQ29kZUdlbmVyYXRvcihOZXN0ZWRTY29wZU1peGluLCBDb2RlR2VuZXJhdG9yKToKKyAgICBfX3N1cGVyX2luaXQgPSBDb2RlR2VuZXJhdG9yLl9faW5pdF9fCisKKyAgICBzY29wZXMgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJlZSk6CisgICAgICAgIHNlbGYuZ3JhcGggPSBweWFzc2VtLlB5Rmxvd0dyYXBoKCI8bW9kdWxlPiIsIHRyZWUuZmlsZW5hbWUpCisgICAgICAgIHNlbGYuZnV0dXJlcyA9IGZ1dHVyZS5maW5kX2Z1dHVyZXModHJlZSkKKyAgICAgICAgc2VsZi5fX3N1cGVyX2luaXQoKQorICAgICAgICB3YWxrKHRyZWUsIHNlbGYpCisKKyAgICBkZWYgZ2V0X21vZHVsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworY2xhc3MgRXhwcmVzc2lvbkNvZGVHZW5lcmF0b3IoTmVzdGVkU2NvcGVNaXhpbiwgQ29kZUdlbmVyYXRvcik6CisgICAgX19zdXBlcl9pbml0ID0gQ29kZUdlbmVyYXRvci5fX2luaXRfXworCisgICAgc2NvcGVzID0gTm9uZQorICAgIGZ1dHVyZXMgPSAoKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyZWUpOgorICAgICAgICBzZWxmLmdyYXBoID0gcHlhc3NlbS5QeUZsb3dHcmFwaCgiPGV4cHJlc3Npb24+IiwgdHJlZS5maWxlbmFtZSkKKyAgICAgICAgc2VsZi5fX3N1cGVyX2luaXQoKQorICAgICAgICB3YWxrKHRyZWUsIHNlbGYpCisKKyAgICBkZWYgZ2V0X21vZHVsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworY2xhc3MgSW50ZXJhY3RpdmVDb2RlR2VuZXJhdG9yKE5lc3RlZFNjb3BlTWl4aW4sIENvZGVHZW5lcmF0b3IpOgorCisgICAgX19zdXBlcl9pbml0ID0gQ29kZUdlbmVyYXRvci5fX2luaXRfXworCisgICAgc2NvcGVzID0gTm9uZQorICAgIGZ1dHVyZXMgPSAoKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRyZWUpOgorICAgICAgICBzZWxmLmdyYXBoID0gcHlhc3NlbS5QeUZsb3dHcmFwaCgiPGludGVyYWN0aXZlPiIsIHRyZWUuZmlsZW5hbWUpCisgICAgICAgIHNlbGYuX19zdXBlcl9pbml0KCkKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKHRyZWUpCisgICAgICAgIHdhbGsodHJlZSwgc2VsZikKKyAgICAgICAgc2VsZi5lbWl0KCdSRVRVUk5fVkFMVUUnKQorCisgICAgZGVmIGdldF9tb2R1bGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgdmlzaXREaXNjYXJkKHNlbGYsIG5vZGUpOgorICAgICAgICAjIFhYWCBEaXNjYXJkIG1lYW5zIGl0J3MgYW4gZXhwcmVzc2lvbi4gIFBlcmhhcHMgdGhpcyBpcyBhIGJhZAorICAgICAgICAjIG5hbWUuCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByKQorICAgICAgICBzZWxmLmVtaXQoJ1BSSU5UX0VYUFInKQorCitjbGFzcyBBYnN0cmFjdEZ1bmN0aW9uQ29kZToKKyAgICBvcHRpbWl6ZWQgPSAxCisgICAgbGFtYmRhQ291bnQgPSAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnVuYywgc2NvcGVzLCBpc0xhbWJkYSwgY2xhc3NfbmFtZSwgbW9kKToKKyAgICAgICAgc2VsZi5jbGFzc19uYW1lID0gY2xhc3NfbmFtZQorICAgICAgICBzZWxmLm1vZHVsZSA9IG1vZAorICAgICAgICBpZiBpc0xhbWJkYToKKyAgICAgICAgICAgIGtsYXNzID0gRnVuY3Rpb25Db2RlR2VuZXJhdG9yCisgICAgICAgICAgICBuYW1lID0gIjxsYW1iZGEuJWQ+IiAlIGtsYXNzLmxhbWJkYUNvdW50CisgICAgICAgICAgICBrbGFzcy5sYW1iZGFDb3VudCA9IGtsYXNzLmxhbWJkYUNvdW50ICsgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9IGZ1bmMubmFtZQorCisgICAgICAgIGFyZ3MsIGhhc1R1cGxlQXJnID0gZ2VuZXJhdGVBcmdMaXN0KGZ1bmMuYXJnbmFtZXMpCisgICAgICAgIHNlbGYuZ3JhcGggPSBweWFzc2VtLlB5Rmxvd0dyYXBoKG5hbWUsIGZ1bmMuZmlsZW5hbWUsIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXplZD0xKQorICAgICAgICBzZWxmLmlzTGFtYmRhID0gaXNMYW1iZGEKKyAgICAgICAgc2VsZi5zdXBlcl9pbml0KCkKKworICAgICAgICBpZiBub3QgaXNMYW1iZGEgYW5kIGZ1bmMuZG9jOgorICAgICAgICAgICAgc2VsZi5zZXREb2NzdHJpbmcoZnVuYy5kb2MpCisKKyAgICAgICAgbG5mID0gd2FsayhmdW5jLmNvZGUsIHNlbGYuTmFtZUZpbmRlcihhcmdzKSwgdmVyYm9zZT0wKQorICAgICAgICBzZWxmLmxvY2Fscy5wdXNoKGxuZi5nZXRMb2NhbHMoKSkKKyAgICAgICAgaWYgZnVuYy52YXJhcmdzOgorICAgICAgICAgICAgc2VsZi5ncmFwaC5zZXRGbGFnKENPX1ZBUkFSR1MpCisgICAgICAgIGlmIGZ1bmMua3dhcmdzOgorICAgICAgICAgICAgc2VsZi5ncmFwaC5zZXRGbGFnKENPX1ZBUktFWVdPUkRTKQorICAgICAgICBzZWxmLnNldF9saW5lbm8oZnVuYykKKyAgICAgICAgaWYgaGFzVHVwbGVBcmc6CisgICAgICAgICAgICBzZWxmLmdlbmVyYXRlQXJnVW5wYWNrKGZ1bmMuYXJnbmFtZXMpCisKKyAgICBkZWYgZ2V0X21vZHVsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubW9kdWxlCisKKyAgICBkZWYgZmluaXNoKHNlbGYpOgorICAgICAgICBzZWxmLmdyYXBoLnN0YXJ0RXhpdEJsb2NrKCkKKyAgICAgICAgaWYgbm90IHNlbGYuaXNMYW1iZGE6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBOb25lKQorICAgICAgICBzZWxmLmVtaXQoJ1JFVFVSTl9WQUxVRScpCisKKyAgICBkZWYgZ2VuZXJhdGVBcmdVbnBhY2soc2VsZiwgYXJncyk6CisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihhcmdzKSk6CisgICAgICAgICAgICBhcmcgPSBhcmdzW2ldCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgdHVwbGUpOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9GQVNUJywgJy4lZCcgJSAoaSAqIDIpKQorICAgICAgICAgICAgICAgIHNlbGYudW5wYWNrU2VxdWVuY2UoYXJnKQorCisgICAgZGVmIHVucGFja1NlcXVlbmNlKHNlbGYsIHR1cCk6CisgICAgICAgIGlmIFZFUlNJT04gPiAxOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdVTlBBQ0tfU0VRVUVOQ0UnLCBsZW4odHVwKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnVU5QQUNLX1RVUExFJywgbGVuKHR1cCkpCisgICAgICAgIGZvciBlbHQgaW4gdHVwOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbHQsIHR1cGxlKToKKyAgICAgICAgICAgICAgICBzZWxmLnVucGFja1NlcXVlbmNlKGVsdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fbmFtZU9wKCdTVE9SRScsIGVsdCkKKworICAgIHVucGFja1R1cGxlID0gdW5wYWNrU2VxdWVuY2UKKworY2xhc3MgRnVuY3Rpb25Db2RlR2VuZXJhdG9yKE5lc3RlZFNjb3BlTWl4aW4sIEFic3RyYWN0RnVuY3Rpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5lcmF0b3IpOgorICAgIHN1cGVyX2luaXQgPSBDb2RlR2VuZXJhdG9yLl9faW5pdF9fICMgY2FsbCBiZSBvdGhlciBpbml0CisgICAgc2NvcGVzID0gTm9uZQorCisgICAgX19zdXBlcl9pbml0ID0gQWJzdHJhY3RGdW5jdGlvbkNvZGUuX19pbml0X18KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jLCBzY29wZXMsIGlzTGFtYmRhLCBjbGFzc19uYW1lLCBtb2QpOgorICAgICAgICBzZWxmLnNjb3BlcyA9IHNjb3BlcworICAgICAgICBzZWxmLnNjb3BlID0gc2NvcGVzW2Z1bmNdCisgICAgICAgIHNlbGYuX19zdXBlcl9pbml0KGZ1bmMsIHNjb3BlcywgaXNMYW1iZGEsIGNsYXNzX25hbWUsIG1vZCkKKyAgICAgICAgc2VsZi5ncmFwaC5zZXRGcmVlVmFycyhzZWxmLnNjb3BlLmdldF9mcmVlX3ZhcnMoKSkKKyAgICAgICAgc2VsZi5ncmFwaC5zZXRDZWxsVmFycyhzZWxmLnNjb3BlLmdldF9jZWxsX3ZhcnMoKSkKKyAgICAgICAgaWYgc2VsZi5zY29wZS5nZW5lcmF0b3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmdyYXBoLnNldEZsYWcoQ09fR0VORVJBVE9SKQorCitjbGFzcyBHZW5FeHByQ29kZUdlbmVyYXRvcihOZXN0ZWRTY29wZU1peGluLCBBYnN0cmFjdEZ1bmN0aW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5lcmF0b3IpOgorICAgIHN1cGVyX2luaXQgPSBDb2RlR2VuZXJhdG9yLl9faW5pdF9fICMgY2FsbCBiZSBvdGhlciBpbml0CisgICAgc2NvcGVzID0gTm9uZQorCisgICAgX19zdXBlcl9pbml0ID0gQWJzdHJhY3RGdW5jdGlvbkNvZGUuX19pbml0X18KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZXhwLCBzY29wZXMsIGNsYXNzX25hbWUsIG1vZCk6CisgICAgICAgIHNlbGYuc2NvcGVzID0gc2NvcGVzCisgICAgICAgIHNlbGYuc2NvcGUgPSBzY29wZXNbZ2V4cF0KKyAgICAgICAgc2VsZi5fX3N1cGVyX2luaXQoZ2V4cCwgc2NvcGVzLCAxLCBjbGFzc19uYW1lLCBtb2QpCisgICAgICAgIHNlbGYuZ3JhcGguc2V0RnJlZVZhcnMoc2VsZi5zY29wZS5nZXRfZnJlZV92YXJzKCkpCisgICAgICAgIHNlbGYuZ3JhcGguc2V0Q2VsbFZhcnMoc2VsZi5zY29wZS5nZXRfY2VsbF92YXJzKCkpCisgICAgICAgIHNlbGYuZ3JhcGguc2V0RmxhZyhDT19HRU5FUkFUT1IpCisKK2NsYXNzIEFic3RyYWN0Q2xhc3NDb2RlOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGtsYXNzLCBzY29wZXMsIG1vZHVsZSk6CisgICAgICAgIHNlbGYuY2xhc3NfbmFtZSA9IGtsYXNzLm5hbWUKKyAgICAgICAgc2VsZi5tb2R1bGUgPSBtb2R1bGUKKyAgICAgICAgc2VsZi5ncmFwaCA9IHB5YXNzZW0uUHlGbG93R3JhcGgoa2xhc3MubmFtZSwga2xhc3MuZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVkPTAsIGtsYXNzPTEpCisgICAgICAgIHNlbGYuc3VwZXJfaW5pdCgpCisgICAgICAgIGxuZiA9IHdhbGsoa2xhc3MuY29kZSwgc2VsZi5OYW1lRmluZGVyKCksIHZlcmJvc2U9MCkKKyAgICAgICAgc2VsZi5sb2NhbHMucHVzaChsbmYuZ2V0TG9jYWxzKCkpCisgICAgICAgIHNlbGYuZ3JhcGguc2V0RmxhZyhDT19ORVdMT0NBTFMpCisgICAgICAgIGlmIGtsYXNzLmRvYzoKKyAgICAgICAgICAgIHNlbGYuc2V0RG9jc3RyaW5nKGtsYXNzLmRvYykKKworICAgIGRlZiBnZXRfbW9kdWxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5tb2R1bGUKKworICAgIGRlZiBmaW5pc2goc2VsZik6CisgICAgICAgIHNlbGYuZ3JhcGguc3RhcnRFeGl0QmxvY2soKQorICAgICAgICBzZWxmLmVtaXQoJ0xPQURfTE9DQUxTJykKKyAgICAgICAgc2VsZi5lbWl0KCdSRVRVUk5fVkFMVUUnKQorCitjbGFzcyBDbGFzc0NvZGVHZW5lcmF0b3IoTmVzdGVkU2NvcGVNaXhpbiwgQWJzdHJhY3RDbGFzc0NvZGUsIENvZGVHZW5lcmF0b3IpOgorICAgIHN1cGVyX2luaXQgPSBDb2RlR2VuZXJhdG9yLl9faW5pdF9fCisgICAgc2NvcGVzID0gTm9uZQorCisgICAgX19zdXBlcl9pbml0ID0gQWJzdHJhY3RDbGFzc0NvZGUuX19pbml0X18KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrbGFzcywgc2NvcGVzLCBtb2R1bGUpOgorICAgICAgICBzZWxmLnNjb3BlcyA9IHNjb3BlcworICAgICAgICBzZWxmLnNjb3BlID0gc2NvcGVzW2tsYXNzXQorICAgICAgICBzZWxmLl9fc3VwZXJfaW5pdChrbGFzcywgc2NvcGVzLCBtb2R1bGUpCisgICAgICAgIHNlbGYuZ3JhcGguc2V0RnJlZVZhcnMoc2VsZi5zY29wZS5nZXRfZnJlZV92YXJzKCkpCisgICAgICAgIHNlbGYuZ3JhcGguc2V0Q2VsbFZhcnMoc2VsZi5zY29wZS5nZXRfY2VsbF92YXJzKCkpCisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhrbGFzcykKKyAgICAgICAgc2VsZi5lbWl0KCJMT0FEX0dMT0JBTCIsICJfX25hbWVfXyIpCisgICAgICAgIHNlbGYuc3RvcmVOYW1lKCJfX21vZHVsZV9fIikKKyAgICAgICAgaWYga2xhc3MuZG9jOgorICAgICAgICAgICAgc2VsZi5lbWl0KCJMT0FEX0NPTlNUIiwga2xhc3MuZG9jKQorICAgICAgICAgICAgc2VsZi5zdG9yZU5hbWUoJ19fZG9jX18nKQorCitkZWYgZ2VuZXJhdGVBcmdMaXN0KGFyZ2xpc3QpOgorICAgICIiIkdlbmVyYXRlIGFuIGFyZyBsaXN0IG1hcmtpbmcgVHVwbGVBcmdzIiIiCisgICAgYXJncyA9IFtdCisgICAgZXh0cmEgPSBbXQorICAgIGNvdW50ID0gMAorICAgIGZvciBpIGluIHJhbmdlKGxlbihhcmdsaXN0KSk6CisgICAgICAgIGVsdCA9IGFyZ2xpc3RbaV0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShlbHQsIHN0cik6CisgICAgICAgICAgICBhcmdzLmFwcGVuZChlbHQpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlbHQsIHR1cGxlKToKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKFR1cGxlQXJnKGkgKiAyLCBlbHQpKQorICAgICAgICAgICAgZXh0cmEuZXh0ZW5kKG1pc2MuZmxhdHRlbihlbHQpKQorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bmV4cGVjdCBhcmd1bWVudCB0eXBlOiIsIGVsdAorICAgIHJldHVybiBhcmdzICsgZXh0cmEsIGNvdW50CisKK2RlZiBmaW5kT3Aobm9kZSk6CisgICAgIiIiRmluZCB0aGUgb3AgKERFTEVURSwgTE9BRCwgU1RPUkUpIGluIGFuIEFzc1R1cGxlIHRyZWUiIiIKKyAgICB2ID0gT3BGaW5kZXIoKQorICAgIHdhbGsobm9kZSwgdiwgdmVyYm9zZT0wKQorICAgIHJldHVybiB2Lm9wCisKK2NsYXNzIE9wRmluZGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5vcCA9IE5vbmUKKyAgICBkZWYgdmlzaXRBc3NOYW1lKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBzZWxmLm9wIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLm9wID0gbm9kZS5mbGFncworICAgICAgICBlbGlmIHNlbGYub3AgIT0gbm9kZS5mbGFnczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtaXhlZCBvcHMgaW4gc3RtdCIKKyAgICB2aXNpdEFzc0F0dHIgPSB2aXNpdEFzc05hbWUKKyAgICB2aXNpdFN1YnNjcmlwdCA9IHZpc2l0QXNzTmFtZQorCitjbGFzcyBEZWxlZ2F0b3I6CisgICAgIiIiQmFzZSBjbGFzcyB0byBzdXBwb3J0IGRlbGVnYXRpb24gZm9yIGF1Z21lbnRlZCBhc3NpZ25tZW50IG5vZGVzCisKKyAgICBUbyBnZW5lcmF0b3IgY29kZSBmb3IgYXVnbWVudGVkIGFzc2lnbm1lbnRzLCB3ZSB1c2UgdGhlIGZvbGxvd2luZworICAgIHdyYXBwZXIgY2xhc3Nlcy4gIEluIHZpc2l0QXVnQXNzaWduLCB0aGUgbGVmdC1oYW5kIGV4cHJlc3Npb24gbm9kZQorICAgIGlzIHZpc2l0ZWQgdHdpY2UuICBUaGUgZmlyc3QgdGltZSB0aGUgdmlzaXQgdXNlcyB0aGUgbm9ybWFsIG1ldGhvZAorICAgIGZvciB0aGF0IG5vZGUgLiAgVGhlIHNlY29uZCB0aW1lIHRoZSB2aXNpdCB1c2VzIGEgZGlmZmVyZW50IG1ldGhvZAorICAgIHRoYXQgZ2VuZXJhdGVzIHRoZSBhcHByb3ByaWF0ZSBjb2RlIHRvIHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQuCisgICAgVGhlc2UgZGVsZWdhdG9yIGNsYXNzZXMgd3JhcCB0aGUgb3JpZ2luYWwgQVNUIG5vZGVzIGluIG9yZGVyIHRvCisgICAgc3VwcG9ydCB0aGUgdmFyaWFudCB2aXNpdCBtZXRob2RzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYmopOgorICAgICAgICBzZWxmLm9iaiA9IG9iagorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLm9iaiwgYXR0cikKKworY2xhc3MgQXVnR2V0YXR0cihEZWxlZ2F0b3IpOgorICAgIHBhc3MKKworY2xhc3MgQXVnTmFtZShEZWxlZ2F0b3IpOgorICAgIHBhc3MKKworY2xhc3MgQXVnU2xpY2UoRGVsZWdhdG9yKToKKyAgICBwYXNzCisKK2NsYXNzIEF1Z1N1YnNjcmlwdChEZWxlZ2F0b3IpOgorICAgIHBhc3MKKword3JhcHBlciA9IHsKKyAgICBhc3QuR2V0YXR0cjogQXVnR2V0YXR0ciwKKyAgICBhc3QuTmFtZTogQXVnTmFtZSwKKyAgICBhc3QuU2xpY2U6IEF1Z1NsaWNlLAorICAgIGFzdC5TdWJzY3JpcHQ6IEF1Z1N1YnNjcmlwdCwKKyAgICB9CisKK2RlZiB3cmFwX2F1Zyhub2RlKToKKyAgICByZXR1cm4gd3JhcHBlcltub2RlLl9fY2xhc3NfX10obm9kZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBmb3IgZmlsZSBpbiBzeXMuYXJndlsxOl06CisgICAgICAgIGNvbXBpbGVGaWxlKGZpbGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3B5Y29kZWdlbi5weWMgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3B5Y29kZWdlbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyZWQ0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHljb2RlZ2VuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3B5Y29kZWdlbi5weW8gYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3B5Y29kZWdlbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIwNmY5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHljb2RlZ2VuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3N5bWJvbHMucHkgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3N5bWJvbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlZWM1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvc3ltYm9scy5weQpAQCAtMCwwICsxLDQ2MiBAQAorIiIiTW9kdWxlIHN5bWJvbC10YWJsZSBnZW5lcmF0b3IiIiIKKworZnJvbSBjb21waWxlciBpbXBvcnQgYXN0Citmcm9tIGNvbXBpbGVyLmNvbnN0cyBpbXBvcnQgU0NfTE9DQUwsIFNDX0dMT0JBTF9JTVBMSUNJVCwgU0NfR0xPQkFMX0VYUExJQ0lULCBcCisgICAgU0NfRlJFRSwgU0NfQ0VMTCwgU0NfVU5LTk9XTgorZnJvbSBjb21waWxlci5taXNjIGltcG9ydCBtYW5nbGUKK2ltcG9ydCB0eXBlcworCisKK2ltcG9ydCBzeXMKKworTUFOR0xFX0xFTiA9IDI1NgorCitjbGFzcyBTY29wZToKKyAgICAjIFhYWCBob3cgbXVjaCBpbmZvcm1hdGlvbiBkbyBJIG5lZWQgYWJvdXQgZWFjaCBuYW1lPworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2R1bGUsIGtsYXNzPU5vbmUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYubW9kdWxlID0gbW9kdWxlCisgICAgICAgIHNlbGYuZGVmcyA9IHt9CisgICAgICAgIHNlbGYudXNlcyA9IHt9CisgICAgICAgIHNlbGYuZ2xvYmFscyA9IHt9CisgICAgICAgIHNlbGYucGFyYW1zID0ge30KKyAgICAgICAgc2VsZi5mcmVlcyA9IHt9CisgICAgICAgIHNlbGYuY2VsbHMgPSB7fQorICAgICAgICBzZWxmLmNoaWxkcmVuID0gW10KKyAgICAgICAgIyBuZXN0ZWQgaXMgdHJ1ZSBpZiB0aGUgY2xhc3MgY291bGQgY29udGFpbiBmcmVlIHZhcmlhYmxlcywKKyAgICAgICAgIyBpLmUuIGlmIGl0IGlzIG5lc3RlZCB3aXRoaW4gYW5vdGhlciBmdW5jdGlvbi4KKyAgICAgICAgc2VsZi5uZXN0ZWQgPSBOb25lCisgICAgICAgIHNlbGYuZ2VuZXJhdG9yID0gTm9uZQorICAgICAgICBzZWxmLmtsYXNzID0gTm9uZQorICAgICAgICBpZiBrbGFzcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihrbGFzcykpOgorICAgICAgICAgICAgICAgIGlmIGtsYXNzW2ldICE9ICdfJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5rbGFzcyA9IGtsYXNzW2k6XQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIjwlczogJXM+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5uYW1lKQorCisgICAgZGVmIG1hbmdsZShzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgc2VsZi5rbGFzcyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIG5hbWUKKyAgICAgICAgcmV0dXJuIG1hbmdsZShuYW1lLCBzZWxmLmtsYXNzKQorCisgICAgZGVmIGFkZF9kZWYoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuZGVmc1tzZWxmLm1hbmdsZShuYW1lKV0gPSAxCisKKyAgICBkZWYgYWRkX3VzZShzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi51c2VzW3NlbGYubWFuZ2xlKG5hbWUpXSA9IDEKKworICAgIGRlZiBhZGRfZ2xvYmFsKHNlbGYsIG5hbWUpOgorICAgICAgICBuYW1lID0gc2VsZi5tYW5nbGUobmFtZSkKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLnVzZXMgb3IgbmFtZSBpbiBzZWxmLmRlZnM6CisgICAgICAgICAgICBwYXNzICMgWFhYIHdhcm4gYWJvdXQgZ2xvYmFsIGZvbGxvd2luZyBkZWYvdXNlCisgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5wYXJhbXM6CisgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgIiVzIGluICVzIGlzIGdsb2JhbCBhbmQgcGFyYW1ldGVyIiAlIFwKKyAgICAgICAgICAgICAgICAgIChuYW1lLCBzZWxmLm5hbWUpCisgICAgICAgIHNlbGYuZ2xvYmFsc1tuYW1lXSA9IDEKKyAgICAgICAgc2VsZi5tb2R1bGUuYWRkX2RlZihuYW1lKQorCisgICAgZGVmIGFkZF9wYXJhbShzZWxmLCBuYW1lKToKKyAgICAgICAgbmFtZSA9IHNlbGYubWFuZ2xlKG5hbWUpCisgICAgICAgIHNlbGYuZGVmc1tuYW1lXSA9IDEKKyAgICAgICAgc2VsZi5wYXJhbXNbbmFtZV0gPSAxCisKKyAgICBkZWYgZ2V0X25hbWVzKHNlbGYpOgorICAgICAgICBkID0ge30KKyAgICAgICAgZC51cGRhdGUoc2VsZi5kZWZzKQorICAgICAgICBkLnVwZGF0ZShzZWxmLnVzZXMpCisgICAgICAgIGQudXBkYXRlKHNlbGYuZ2xvYmFscykKKyAgICAgICAgcmV0dXJuIGQua2V5cygpCisKKyAgICBkZWYgYWRkX2NoaWxkKHNlbGYsIGNoaWxkKToKKyAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQoY2hpbGQpCisKKyAgICBkZWYgZ2V0X2NoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jaGlsZHJlbgorCisgICAgZGVmIERFQlVHKHNlbGYpOgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBzZWxmLm5hbWUsIHNlbGYubmVzdGVkIGFuZCAibmVzdGVkIiBvciAiIgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiXHRnbG9iYWxzOiAiLCBzZWxmLmdsb2JhbHMKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIlx0Y2VsbHM6ICIsIHNlbGYuY2VsbHMKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIlx0ZGVmczogIiwgc2VsZi5kZWZzCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJcdHVzZXM6ICIsIHNlbGYudXNlcworICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiXHRmcmVlczoiLCBzZWxmLmZyZWVzCisKKyAgICBkZWYgY2hlY2tfbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHNjb3BlIG9mIG5hbWUuCisKKyAgICAgICAgVGhlIHNjb3BlIG9mIGEgbmFtZSBjb3VsZCBiZSBMT0NBTCwgR0xPQkFMLCBGUkVFLCBvciBDRUxMLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLmdsb2JhbHM6CisgICAgICAgICAgICByZXR1cm4gU0NfR0xPQkFMX0VYUExJQ0lUCisgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5jZWxsczoKKyAgICAgICAgICAgIHJldHVybiBTQ19DRUxMCisgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5kZWZzOgorICAgICAgICAgICAgcmV0dXJuIFNDX0xPQ0FMCisgICAgICAgIGlmIHNlbGYubmVzdGVkIGFuZCAobmFtZSBpbiBzZWxmLmZyZWVzIG9yIG5hbWUgaW4gc2VsZi51c2VzKToKKyAgICAgICAgICAgIHJldHVybiBTQ19GUkVFCisgICAgICAgIGlmIHNlbGYubmVzdGVkOgorICAgICAgICAgICAgcmV0dXJuIFNDX1VOS05PV04KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBTQ19HTE9CQUxfSU1QTElDSVQKKworICAgIGRlZiBnZXRfZnJlZV92YXJzKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5uZXN0ZWQ6CisgICAgICAgICAgICByZXR1cm4gKCkKKyAgICAgICAgZnJlZSA9IHt9CisgICAgICAgIGZyZWUudXBkYXRlKHNlbGYuZnJlZXMpCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYudXNlcy5rZXlzKCk6CisgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLmRlZnMgYW5kIG5hbWUgbm90IGluIHNlbGYuZ2xvYmFsczoKKyAgICAgICAgICAgICAgICBmcmVlW25hbWVdID0gMQorICAgICAgICByZXR1cm4gZnJlZS5rZXlzKCkKKworICAgIGRlZiBoYW5kbGVfY2hpbGRyZW4oc2VsZik6CisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgZnJlZXMgPSBjaGlsZC5nZXRfZnJlZV92YXJzKCkKKyAgICAgICAgICAgIGdsb2JhbHMgPSBzZWxmLmFkZF9mcmVlcyhmcmVlcykKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGdsb2JhbHM6CisgICAgICAgICAgICAgICAgY2hpbGQuZm9yY2VfZ2xvYmFsKG5hbWUpCisKKyAgICBkZWYgZm9yY2VfZ2xvYmFsKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJGb3JjZSBuYW1lIHRvIGJlIGdsb2JhbCBpbiBzY29wZS4KKworICAgICAgICBTb21lIGNoaWxkIG9mIHRoZSBjdXJyZW50IG5vZGUgaGFkIGEgZnJlZSByZWZlcmVuY2UgdG8gbmFtZS4KKyAgICAgICAgV2hlbiB0aGUgY2hpbGQgd2FzIHByb2Nlc3NlZCwgaXQgd2FzIGxhYmVsbGVkIGEgZnJlZQorICAgICAgICB2YXJpYWJsZS4gIE5vdyB0aGF0IGFsbCBpdHMgZW5jbG9zaW5nIHNjb3BlIGhhdmUgYmVlbgorICAgICAgICBwcm9jZXNzZWQsIHRoZSBuYW1lIGlzIGtub3duIHRvIGJlIGEgZ2xvYmFsIG9yIGJ1aWx0aW4uICBTbworICAgICAgICB3YWxrIGJhY2sgZG93biB0aGUgY2hpbGQgY2hhaW4gYW5kIHNldCB0aGUgbmFtZSB0byBiZSBnbG9iYWwKKyAgICAgICAgcmF0aGVyIHRoYW4gZnJlZS4KKworICAgICAgICBCZSBjYXJlZnVsIHRvIHN0b3AgaWYgYSBjaGlsZCBkb2VzIG5vdCB0aGluayB0aGUgbmFtZSBpcworICAgICAgICBmcmVlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5nbG9iYWxzW25hbWVdID0gMQorICAgICAgICBpZiBuYW1lIGluIHNlbGYuZnJlZXM6CisgICAgICAgICAgICBkZWwgc2VsZi5mcmVlc1tuYW1lXQorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIGlmIGNoaWxkLmNoZWNrX25hbWUobmFtZSkgPT0gU0NfRlJFRToKKyAgICAgICAgICAgICAgICBjaGlsZC5mb3JjZV9nbG9iYWwobmFtZSkKKworICAgIGRlZiBhZGRfZnJlZXMoc2VsZiwgbmFtZXMpOgorICAgICAgICAiIiJQcm9jZXNzIGxpc3Qgb2YgZnJlZSB2YXJzIGZyb20gbmVzdGVkIHNjb3BlLgorCisgICAgICAgIFJldHVybnMgYSBsaXN0IG9mIG5hbWVzIHRoYXQgYXJlIGVpdGhlciAxKSBkZWNsYXJlZCBnbG9iYWwgaW4gdGhlCisgICAgICAgIHBhcmVudCBvciAyKSB1bmRlZmluZWQgaW4gYSB0b3AtbGV2ZWwgcGFyZW50LiAgSW4gZWl0aGVyIGNhc2UsCisgICAgICAgIHRoZSBuZXN0ZWQgc2NvcGUgc2hvdWxkIHRyZWF0IHRoZW0gYXMgZ2xvYmFscy4KKyAgICAgICAgIiIiCisgICAgICAgIGNoaWxkX2dsb2JhbHMgPSBbXQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIHNjID0gc2VsZi5jaGVja19uYW1lKG5hbWUpCisgICAgICAgICAgICBpZiBzZWxmLm5lc3RlZDoKKyAgICAgICAgICAgICAgICBpZiBzYyA9PSBTQ19VTktOT1dOIG9yIHNjID09IFNDX0ZSRUUgXAorICAgICAgICAgICAgICAgICAgIG9yIGlzaW5zdGFuY2Uoc2VsZiwgQ2xhc3NTY29wZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnJlZXNbbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgZWxpZiBzYyA9PSBTQ19HTE9CQUxfSU1QTElDSVQ6CisgICAgICAgICAgICAgICAgICAgIGNoaWxkX2dsb2JhbHMuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYsIEZ1bmN0aW9uU2NvcGUpIGFuZCBzYyA9PSBTQ19MT0NBTDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jZWxsc1tuYW1lXSA9IDEKKyAgICAgICAgICAgICAgICBlbGlmIHNjICE9IFNDX0NFTEw6CisgICAgICAgICAgICAgICAgICAgIGNoaWxkX2dsb2JhbHMuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNjID09IFNDX0xPQ0FMOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNlbGxzW25hbWVdID0gMQorICAgICAgICAgICAgICAgIGVsaWYgc2MgIT0gU0NfQ0VMTDoKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRfZ2xvYmFscy5hcHBlbmQobmFtZSkKKyAgICAgICAgcmV0dXJuIGNoaWxkX2dsb2JhbHMKKworICAgIGRlZiBnZXRfY2VsbF92YXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jZWxscy5rZXlzKCkKKworY2xhc3MgTW9kdWxlU2NvcGUoU2NvcGUpOgorICAgIF9fc3VwZXJfaW5pdCA9IFNjb3BlLl9faW5pdF9fCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX19zdXBlcl9pbml0KCJnbG9iYWwiLCBzZWxmKQorCitjbGFzcyBGdW5jdGlvblNjb3BlKFNjb3BlKToKKyAgICBwYXNzCisKK2NsYXNzIEdlbkV4cHJTY29wZShTY29wZSk6CisgICAgX19zdXBlcl9pbml0ID0gU2NvcGUuX19pbml0X18KKworICAgIF9fY291bnRlciA9IDEKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUsIGtsYXNzPU5vbmUpOgorICAgICAgICBpID0gc2VsZi5fX2NvdW50ZXIKKyAgICAgICAgc2VsZi5fX2NvdW50ZXIgKz0gMQorICAgICAgICBzZWxmLl9fc3VwZXJfaW5pdCgiZ2VuZXJhdG9yIGV4cHJlc3Npb248JWQ+IiVpLCBtb2R1bGUsIGtsYXNzKQorICAgICAgICBzZWxmLmFkZF9wYXJhbSgnLjAnKQorCisgICAgZGVmIGdldF9uYW1lcyhzZWxmKToKKyAgICAgICAga2V5cyA9IFNjb3BlLmdldF9uYW1lcyhzZWxmKQorICAgICAgICByZXR1cm4ga2V5cworCitjbGFzcyBMYW1iZGFTY29wZShGdW5jdGlvblNjb3BlKToKKyAgICBfX3N1cGVyX2luaXQgPSBTY29wZS5fX2luaXRfXworCisgICAgX19jb3VudGVyID0gMQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSwga2xhc3M9Tm9uZSk6CisgICAgICAgIGkgPSBzZWxmLl9fY291bnRlcgorICAgICAgICBzZWxmLl9fY291bnRlciArPSAxCisgICAgICAgIHNlbGYuX19zdXBlcl9pbml0KCJsYW1iZGEuJWQiICUgaSwgbW9kdWxlLCBrbGFzcykKKworY2xhc3MgQ2xhc3NTY29wZShTY29wZSk6CisgICAgX19zdXBlcl9pbml0ID0gU2NvcGUuX19pbml0X18KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2R1bGUpOgorICAgICAgICBzZWxmLl9fc3VwZXJfaW5pdChuYW1lLCBtb2R1bGUsIG5hbWUpCisKK2NsYXNzIFN5bWJvbFZpc2l0b3I6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnNjb3BlcyA9IHt9CisgICAgICAgIHNlbGYua2xhc3MgPSBOb25lCisKKyAgICAjIG5vZGUgdGhhdCBkZWZpbmUgbmV3IHNjb3BlcworCisgICAgZGVmIHZpc2l0TW9kdWxlKHNlbGYsIG5vZGUpOgorICAgICAgICBzY29wZSA9IHNlbGYubW9kdWxlID0gc2VsZi5zY29wZXNbbm9kZV0gPSBNb2R1bGVTY29wZSgpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5ub2RlLCBzY29wZSkKKworICAgIHZpc2l0RXhwcmVzc2lvbiA9IHZpc2l0TW9kdWxlCisKKyAgICBkZWYgdmlzaXRGdW5jdGlvbihzZWxmLCBub2RlLCBwYXJlbnQpOgorICAgICAgICBpZiBub2RlLmRlY29yYXRvcnM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZGVjb3JhdG9ycywgcGFyZW50KQorICAgICAgICBwYXJlbnQuYWRkX2RlZihub2RlLm5hbWUpCisgICAgICAgIGZvciBuIGluIG5vZGUuZGVmYXVsdHM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KG4sIHBhcmVudCkKKyAgICAgICAgc2NvcGUgPSBGdW5jdGlvblNjb3BlKG5vZGUubmFtZSwgc2VsZi5tb2R1bGUsIHNlbGYua2xhc3MpCisgICAgICAgIGlmIHBhcmVudC5uZXN0ZWQgb3IgaXNpbnN0YW5jZShwYXJlbnQsIEZ1bmN0aW9uU2NvcGUpOgorICAgICAgICAgICAgc2NvcGUubmVzdGVkID0gMQorICAgICAgICBzZWxmLnNjb3Blc1tub2RlXSA9IHNjb3BlCisgICAgICAgIHNlbGYuX2RvX2FyZ3Moc2NvcGUsIG5vZGUuYXJnbmFtZXMpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5jb2RlLCBzY29wZSkKKyAgICAgICAgc2VsZi5oYW5kbGVfZnJlZV92YXJzKHNjb3BlLCBwYXJlbnQpCisKKyAgICBkZWYgdmlzaXRHZW5FeHByKHNlbGYsIG5vZGUsIHBhcmVudCk6CisgICAgICAgIHNjb3BlID0gR2VuRXhwclNjb3BlKHNlbGYubW9kdWxlLCBzZWxmLmtsYXNzKTsKKyAgICAgICAgaWYgcGFyZW50Lm5lc3RlZCBvciBpc2luc3RhbmNlKHBhcmVudCwgRnVuY3Rpb25TY29wZSkgXAorICAgICAgICAgICAgICAgIG9yIGlzaW5zdGFuY2UocGFyZW50LCBHZW5FeHByU2NvcGUpOgorICAgICAgICAgICAgc2NvcGUubmVzdGVkID0gMQorCisgICAgICAgIHNlbGYuc2NvcGVzW25vZGVdID0gc2NvcGUKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmNvZGUsIHNjb3BlKQorCisgICAgICAgIHNlbGYuaGFuZGxlX2ZyZWVfdmFycyhzY29wZSwgcGFyZW50KQorCisgICAgZGVmIHZpc2l0R2VuRXhwcklubmVyKHNlbGYsIG5vZGUsIHNjb3BlKToKKyAgICAgICAgZm9yIGdlbmZvciBpbiBub2RlLnF1YWxzOgorICAgICAgICAgICAgc2VsZi52aXNpdChnZW5mb3IsIHNjb3BlKQorCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByLCBzY29wZSkKKworICAgIGRlZiB2aXNpdEdlbkV4cHJGb3Ioc2VsZiwgbm9kZSwgc2NvcGUpOgorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuYXNzaWduLCBzY29wZSwgMSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLml0ZXIsIHNjb3BlKQorICAgICAgICBmb3IgaWZfIGluIG5vZGUuaWZzOgorICAgICAgICAgICAgc2VsZi52aXNpdChpZl8sIHNjb3BlKQorCisgICAgZGVmIHZpc2l0R2VuRXhwcklmKHNlbGYsIG5vZGUsIHNjb3BlKToKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnRlc3QsIHNjb3BlKQorCisgICAgZGVmIHZpc2l0TGFtYmRhKHNlbGYsIG5vZGUsIHBhcmVudCwgYXNzaWduPTApOgorICAgICAgICAjIExhbWJkYSBpcyBhbiBleHByZXNzaW9uLCBzbyBpdCBjb3VsZCBhcHBlYXIgaW4gYW4gZXhwcmVzc2lvbgorICAgICAgICAjIGNvbnRleHQgd2hlcmUgYXNzaWduIGlzIHBhc3NlZC4gIFRoZSB0cmFuc2Zvcm1lciBzaG91bGQgY2F0Y2gKKyAgICAgICAgIyBhbnkgY29kZSB0aGF0IGhhcyBhIGxhbWJkYSBvbiB0aGUgbGVmdC1oYW5kIHNpZGUuCisgICAgICAgIGFzc2VydCBub3QgYXNzaWduCisKKyAgICAgICAgZm9yIG4gaW4gbm9kZS5kZWZhdWx0czoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobiwgcGFyZW50KQorICAgICAgICBzY29wZSA9IExhbWJkYVNjb3BlKHNlbGYubW9kdWxlLCBzZWxmLmtsYXNzKQorICAgICAgICBpZiBwYXJlbnQubmVzdGVkIG9yIGlzaW5zdGFuY2UocGFyZW50LCBGdW5jdGlvblNjb3BlKToKKyAgICAgICAgICAgIHNjb3BlLm5lc3RlZCA9IDEKKyAgICAgICAgc2VsZi5zY29wZXNbbm9kZV0gPSBzY29wZQorICAgICAgICBzZWxmLl9kb19hcmdzKHNjb3BlLCBub2RlLmFyZ25hbWVzKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuY29kZSwgc2NvcGUpCisgICAgICAgIHNlbGYuaGFuZGxlX2ZyZWVfdmFycyhzY29wZSwgcGFyZW50KQorCisgICAgZGVmIF9kb19hcmdzKHNlbGYsIHNjb3BlLCBhcmdzKToKKyAgICAgICAgZm9yIG5hbWUgaW4gYXJnczoKKyAgICAgICAgICAgIGlmIHR5cGUobmFtZSkgPT0gdHlwZXMuVHVwbGVUeXBlOgorICAgICAgICAgICAgICAgIHNlbGYuX2RvX2FyZ3Moc2NvcGUsIG5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNjb3BlLmFkZF9wYXJhbShuYW1lKQorCisgICAgZGVmIGhhbmRsZV9mcmVlX3ZhcnMoc2VsZiwgc2NvcGUsIHBhcmVudCk6CisgICAgICAgIHBhcmVudC5hZGRfY2hpbGQoc2NvcGUpCisgICAgICAgIHNjb3BlLmhhbmRsZV9jaGlsZHJlbigpCisKKyAgICBkZWYgdmlzaXRDbGFzcyhzZWxmLCBub2RlLCBwYXJlbnQpOgorICAgICAgICBwYXJlbnQuYWRkX2RlZihub2RlLm5hbWUpCisgICAgICAgIGZvciBuIGluIG5vZGUuYmFzZXM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KG4sIHBhcmVudCkKKyAgICAgICAgc2NvcGUgPSBDbGFzc1Njb3BlKG5vZGUubmFtZSwgc2VsZi5tb2R1bGUpCisgICAgICAgIGlmIHBhcmVudC5uZXN0ZWQgb3IgaXNpbnN0YW5jZShwYXJlbnQsIEZ1bmN0aW9uU2NvcGUpOgorICAgICAgICAgICAgc2NvcGUubmVzdGVkID0gMQorICAgICAgICBpZiBub2RlLmRvYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNjb3BlLmFkZF9kZWYoJ19fZG9jX18nKQorICAgICAgICBzY29wZS5hZGRfZGVmKCdfX21vZHVsZV9fJykKKyAgICAgICAgc2VsZi5zY29wZXNbbm9kZV0gPSBzY29wZQorICAgICAgICBwcmV2ID0gc2VsZi5rbGFzcworICAgICAgICBzZWxmLmtsYXNzID0gbm9kZS5uYW1lCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5jb2RlLCBzY29wZSkKKyAgICAgICAgc2VsZi5rbGFzcyA9IHByZXYKKyAgICAgICAgc2VsZi5oYW5kbGVfZnJlZV92YXJzKHNjb3BlLCBwYXJlbnQpCisKKyAgICAjIG5hbWUgY2FuIGJlIGEgZGVmIG9yIGEgdXNlCisKKyAgICAjIFhYWCBhIGZldyBjYWxscyBhbmQgbm9kZXMgZXhwZWN0IGEgdGhpcmQgImFzc2lnbiIgYXJnIHRoYXQgaXMKKyAgICAjIHRydWUgaWYgdGhlIG5hbWUgaXMgYmVpbmcgdXNlZCBhcyBhbiBhc3NpZ25tZW50LiAgb25seQorICAgICMgZXhwcmVzc2lvbnMgY29udGFpbmVkIHdpdGhpbiBzdGF0ZW1lbnRzIG1heSBoYXZlIHRoZSBhc3NpZ24gYXJnLgorCisgICAgZGVmIHZpc2l0TmFtZShzZWxmLCBub2RlLCBzY29wZSwgYXNzaWduPTApOgorICAgICAgICBpZiBhc3NpZ246CisgICAgICAgICAgICBzY29wZS5hZGRfZGVmKG5vZGUubmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNjb3BlLmFkZF91c2Uobm9kZS5uYW1lKQorCisgICAgIyBvcGVyYXRpb25zIHRoYXQgYmluZCBuZXcgbmFtZXMKKworICAgIGRlZiB2aXNpdEZvcihzZWxmLCBub2RlLCBzY29wZSk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5hc3NpZ24sIHNjb3BlLCAxKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUubGlzdCwgc2NvcGUpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5ib2R5LCBzY29wZSkKKyAgICAgICAgaWYgbm9kZS5lbHNlXzoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5lbHNlXywgc2NvcGUpCisKKyAgICBkZWYgdmlzaXRGcm9tKHNlbGYsIG5vZGUsIHNjb3BlKToKKyAgICAgICAgZm9yIG5hbWUsIGFzbmFtZSBpbiBub2RlLm5hbWVzOgorICAgICAgICAgICAgaWYgbmFtZSA9PSAiKiI6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNjb3BlLmFkZF9kZWYoYXNuYW1lIG9yIG5hbWUpCisKKyAgICBkZWYgdmlzaXRJbXBvcnQoc2VsZiwgbm9kZSwgc2NvcGUpOgorICAgICAgICBmb3IgbmFtZSwgYXNuYW1lIGluIG5vZGUubmFtZXM6CisgICAgICAgICAgICBpID0gbmFtZS5maW5kKCIuIikKKyAgICAgICAgICAgIGlmIGkgPiAtMToKKyAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVs6aV0KKyAgICAgICAgICAgIHNjb3BlLmFkZF9kZWYoYXNuYW1lIG9yIG5hbWUpCisKKyAgICBkZWYgdmlzaXRHbG9iYWwoc2VsZiwgbm9kZSwgc2NvcGUpOgorICAgICAgICBmb3IgbmFtZSBpbiBub2RlLm5hbWVzOgorICAgICAgICAgICAgc2NvcGUuYWRkX2dsb2JhbChuYW1lKQorCisgICAgZGVmIHZpc2l0QXNzaWduKHNlbGYsIG5vZGUsIHNjb3BlKToKKyAgICAgICAgIiIiUHJvcGFnYXRlIGFzc2lnbm1lbnQgZmxhZyBkb3duIHRvIGNoaWxkIG5vZGVzLgorCisgICAgICAgIFRoZSBBc3NpZ24gbm9kZSBkb2Vzbid0IGl0c2VsZiBjb250YWlucyB0aGUgdmFyaWFibGVzIGJlaW5nCisgICAgICAgIGFzc2lnbmVkIHRvLiAgSW5zdGVhZCwgdGhlIGNoaWxkcmVuIGluIG5vZGUubm9kZXMgYXJlIHZpc2l0ZWQKKyAgICAgICAgd2l0aCB0aGUgYXNzaWduIGZsYWcgc2V0IHRvIHRydWUuICBXaGVuIHRoZSBuYW1lcyBvY2N1ciBpbgorICAgICAgICB0aG9zZSBub2RlcywgdGhleSBhcmUgbWFya2VkIGFzIGRlZnMuCisKKyAgICAgICAgU29tZSBuYW1lcyB0aGF0IG9jY3VyIGluIGFuIGFzc2lnbm1lbnQgdGFyZ2V0IGFyZSBub3QgYm91bmQgYnkKKyAgICAgICAgdGhlIGFzc2lnbm1lbnQsIGUuZy4gYSBuYW1lIG9jY3VycmluZyBpbnNpZGUgYSBzbGljZS4gIFRoZQorICAgICAgICB2aXNpdG9yIGhhbmRsZXMgdGhlc2Ugbm9kZXMgc3BlY2lhbGx5OyB0aGV5IGRvIG5vdCBwcm9wYWdhdGUKKyAgICAgICAgdGhlIGFzc2lnbiBmbGFnIHRvIHRoZWlyIGNoaWxkcmVuLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIG4gaW4gbm9kZS5ub2RlczoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobiwgc2NvcGUsIDEpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByLCBzY29wZSkKKworICAgIGRlZiB2aXNpdEFzc05hbWUoc2VsZiwgbm9kZSwgc2NvcGUsIGFzc2lnbj0xKToKKyAgICAgICAgc2NvcGUuYWRkX2RlZihub2RlLm5hbWUpCisKKyAgICBkZWYgdmlzaXRBc3NBdHRyKHNlbGYsIG5vZGUsIHNjb3BlLCBhc3NpZ249MCk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByLCBzY29wZSwgMCkKKworICAgIGRlZiB2aXNpdFN1YnNjcmlwdChzZWxmLCBub2RlLCBzY29wZSwgYXNzaWduPTApOgorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwciwgc2NvcGUsIDApCisgICAgICAgIGZvciBuIGluIG5vZGUuc3ViczoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobiwgc2NvcGUsIDApCisKKyAgICBkZWYgdmlzaXRTbGljZShzZWxmLCBub2RlLCBzY29wZSwgYXNzaWduPTApOgorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwciwgc2NvcGUsIDApCisgICAgICAgIGlmIG5vZGUubG93ZXI6CisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUubG93ZXIsIHNjb3BlLCAwKQorICAgICAgICBpZiBub2RlLnVwcGVyOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLnVwcGVyLCBzY29wZSwgMCkKKworICAgIGRlZiB2aXNpdEF1Z0Fzc2lnbihzZWxmLCBub2RlLCBzY29wZSk6CisgICAgICAgICMgSWYgdGhlIExIUyBpcyBhIG5hbWUsIHRoZW4gdGhpcyBjb3VudHMgYXMgYXNzaWdubWVudC4KKyAgICAgICAgIyBPdGhlcndpc2UsIGl0J3MganVzdCB1c2UuCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5ub2RlLCBzY29wZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLm5vZGUsIGFzdC5OYW1lKToKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5ub2RlLCBzY29wZSwgMSkgIyBYWFggd29ycnkgYWJvdXQgdGhpcworICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwciwgc2NvcGUpCisKKyAgICAjIHBydW5lIGlmIHN0YXRlbWVudHMgaWYgdGVzdHMgYXJlIGZhbHNlCisKKyAgICBfY29uc3RfdHlwZXMgPSB0eXBlcy5TdHJpbmdUeXBlLCB0eXBlcy5JbnRUeXBlLCB0eXBlcy5GbG9hdFR5cGUKKworICAgIGRlZiB2aXNpdElmKHNlbGYsIG5vZGUsIHNjb3BlKToKKyAgICAgICAgZm9yIHRlc3QsIGJvZHkgaW4gbm9kZS50ZXN0czoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodGVzdCwgYXN0LkNvbnN0KToKKyAgICAgICAgICAgICAgICBpZiB0eXBlKHRlc3QudmFsdWUpIGluIHNlbGYuX2NvbnN0X3R5cGVzOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgdGVzdC52YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLnZpc2l0KHRlc3QsIHNjb3BlKQorICAgICAgICAgICAgc2VsZi52aXNpdChib2R5LCBzY29wZSkKKyAgICAgICAgaWYgbm9kZS5lbHNlXzoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5lbHNlXywgc2NvcGUpCisKKyAgICAjIGEgeWllbGQgc3RhdGVtZW50IHNpZ25hbHMgYSBnZW5lcmF0b3IKKworICAgIGRlZiB2aXNpdFlpZWxkKHNlbGYsIG5vZGUsIHNjb3BlKToKKyAgICAgICAgc2NvcGUuZ2VuZXJhdG9yID0gMQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudmFsdWUsIHNjb3BlKQorCitkZWYgbGlzdF9lcShsMSwgbDIpOgorICAgIHJldHVybiBzb3J0ZWQobDEpID09IHNvcnRlZChsMikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBpbXBvcnQgc3lzCisgICAgZnJvbSBjb21waWxlciBpbXBvcnQgcGFyc2VGaWxlLCB3YWxrCisgICAgaW1wb3J0IHN5bXRhYmxlCisKKyAgICBkZWYgZ2V0X25hbWVzKHN5bXMpOgorICAgICAgICByZXR1cm4gW3MgZm9yIHMgaW4gW3MuZ2V0X25hbWUoKSBmb3IgcyBpbiBzeW1zLmdldF9zeW1ib2xzKCldCisgICAgICAgICAgICAgICAgaWYgbm90IChzLnN0YXJ0c3dpdGgoJ19bJykgb3Igcy5zdGFydHN3aXRoKCcuJykpXQorCisgICAgZm9yIGZpbGUgaW4gc3lzLmFyZ3ZbMTpdOgorICAgICAgICBwcmludCBmaWxlCisgICAgICAgIGYgPSBvcGVuKGZpbGUpCisgICAgICAgIGJ1ZiA9IGYucmVhZCgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzeW1zID0gc3ltdGFibGUuc3ltdGFibGUoYnVmLCBmaWxlLCAiZXhlYyIpCisgICAgICAgIG1vZF9uYW1lcyA9IGdldF9uYW1lcyhzeW1zKQorICAgICAgICB0cmVlID0gcGFyc2VGaWxlKGZpbGUpCisgICAgICAgIHMgPSBTeW1ib2xWaXNpdG9yKCkKKyAgICAgICAgd2Fsayh0cmVlLCBzKQorCisgICAgICAgICMgY29tcGFyZSBtb2R1bGUtbGV2ZWwgc3ltYm9scworICAgICAgICBuYW1lczIgPSBzLnNjb3Blc1t0cmVlXS5nZXRfbmFtZXMoKQorCisgICAgICAgIGlmIG5vdCBsaXN0X2VxKG1vZF9uYW1lcywgbmFtZXMyKToKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAib29wcyIsIGZpbGUKKyAgICAgICAgICAgIHByaW50IHNvcnRlZChtb2RfbmFtZXMpCisgICAgICAgICAgICBwcmludCBzb3J0ZWQobmFtZXMyKQorICAgICAgICAgICAgc3lzLmV4aXQoLTEpCisKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGQudXBkYXRlKHMuc2NvcGVzKQorICAgICAgICBkZWwgZFt0cmVlXQorICAgICAgICBzY29wZXMgPSBkLnZhbHVlcygpCisgICAgICAgIGRlbCBkCisKKyAgICAgICAgZm9yIHMgaW4gc3ltcy5nZXRfc3ltYm9scygpOgorICAgICAgICAgICAgaWYgcy5pc19uYW1lc3BhY2UoKToKKyAgICAgICAgICAgICAgICBsID0gW3NjIGZvciBzYyBpbiBzY29wZXMKKyAgICAgICAgICAgICAgICAgICAgIGlmIHNjLm5hbWUgPT0gcy5nZXRfbmFtZSgpXQorICAgICAgICAgICAgICAgIGlmIGxlbihsKSA+IDE6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJza2lwcGluZyIsIHMuZ2V0X25hbWUoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaXN0X2VxKGdldF9uYW1lcyhzLmdldF9uYW1lc3BhY2UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxbMF0uZ2V0X25hbWVzKCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgcy5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBzb3J0ZWQoZ2V0X25hbWVzKHMuZ2V0X25hbWVzcGFjZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHNvcnRlZChsWzBdLmdldF9uYW1lcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmV4aXQoLTEpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3N5bWJvbHMucHljIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9zeW1ib2xzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRjZDQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9zeW1ib2xzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3N5bWJvbHMucHlvIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9zeW1ib2xzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjBkMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9zeW1ib2xzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3N5bnRheC5weSBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvc3ludGF4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NWQ5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3N5bnRheC5weQpAQCAtMCwwICsxLDQ2IEBACisiIiJDaGVjayBmb3IgZXJycyBpbiB0aGUgQVNULgorCitUaGUgUHl0aG9uIHBhcnNlciBkb2VzIG5vdCBjYXRjaCBhbGwgc3ludGF4IGVycm9ycy4gIE90aGVycywgbGlrZQorYXNzaWdubWVudHMgd2l0aCBpbnZhbGlkIHRhcmdldHMsIGFyZSBjYXVnaHQgaW4gdGhlIGNvZGUgZ2VuZXJhdGlvbgorcGhhc2UuCisKK1RoZSBjb21waWxlciBwYWNrYWdlIGNhdGNoZXMgc29tZSBlcnJvcnMgaW4gdGhlIHRyYW5zZm9ybWVyIG1vZHVsZS4KK0J1dCBpdCBzZWVtcyBjbGVhcmVyIHRvIHdyaXRlIGNoZWNrZXJzIHRoYXQgdXNlIHRoZSBBU1QgdG8gZGV0ZWN0CitlcnJvcnMuCisiIiIKKworZnJvbSBjb21waWxlciBpbXBvcnQgYXN0LCB3YWxrCisKK2RlZiBjaGVjayh0cmVlLCBtdWx0aT1Ob25lKToKKyAgICB2ID0gU3ludGF4RXJyb3JDaGVja2VyKG11bHRpKQorICAgIHdhbGsodHJlZSwgdikKKyAgICByZXR1cm4gdi5lcnJvcnMKKworY2xhc3MgU3ludGF4RXJyb3JDaGVja2VyOgorICAgICIiIkEgdmlzaXRvciB0byBmaW5kIHN5bnRheCBlcnJvcnMgaW4gdGhlIEFTVC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtdWx0aT1Ob25lKToKKyAgICAgICAgIiIiQ3JlYXRlIG5ldyB2aXNpdG9yIG9iamVjdC4KKworICAgICAgICBJZiBvcHRpb25hbCBhcmd1bWVudCBtdWx0aSBpcyBub3QgTm9uZSwgdGhlbiBwcmludCBtZXNzYWdlcworICAgICAgICBmb3IgZWFjaCBlcnJvciByYXRoZXIgdGhhbiByYWlzaW5nIGEgU3ludGF4RXJyb3IgZm9yIHRoZQorICAgICAgICBmaXJzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubXVsdGkgPSBtdWx0aQorICAgICAgICBzZWxmLmVycm9ycyA9IDAKKworICAgIGRlZiBlcnJvcihzZWxmLCBub2RlLCBtc2cpOgorICAgICAgICBzZWxmLmVycm9ycyA9IHNlbGYuZXJyb3JzICsgMQorICAgICAgICBpZiBzZWxmLm11bHRpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQgIiVzOiVzOiAlcyIgJSAobm9kZS5maWxlbmFtZSwgbm9kZS5saW5lbm8sIG1zZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiJXMgKCVzOiVzKSIgJSAobXNnLCBub2RlLmZpbGVuYW1lLCBub2RlLmxpbmVubykKKworICAgIGRlZiB2aXNpdEFzc2lnbihzZWxmLCBub2RlKToKKyAgICAgICAgIyB0aGUgdHJhbnNmb3JtZXIgbW9kdWxlIGhhbmRsZXMgbWFueSBvZiB0aGVzZQorICAgICAgICBwYXNzCisjIyAgICAgICAgZm9yIHRhcmdldCBpbiBub2RlLm5vZGVzOgorIyMgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRhcmdldCwgYXN0LkFzc0xpc3QpOgorIyMgICAgICAgICAgICAgICAgaWYgdGFyZ2V0LmxpbmVubyBpcyBOb25lOgorIyMgICAgICAgICAgICAgICAgICAgIHRhcmdldC5saW5lbm8gPSBub2RlLmxpbmVubworIyMgICAgICAgICAgICAgICAgc2VsZi5lcnJvcih0YXJnZXQsICJjYW4ndCBhc3NpZ24gdG8gbGlzdCBjb21wcmVoZW5zaW9uIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvc3ludGF4LnB5YyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvc3ludGF4LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDE3ZjYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9zeW50YXgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvc3ludGF4LnB5byBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvc3ludGF4LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDE3ZjYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9zeW50YXgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvdHJhbnNmb3JtZXIucHkgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3RyYW5zZm9ybWVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjQ2MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3RyYW5zZm9ybWVyLnB5CkBAIC0wLDAgKzEsMTUzNSBAQAorIiIiUGFyc2UgdHJlZSB0cmFuc2Zvcm1hdGlvbiBtb2R1bGUuCisKK1RyYW5zZm9ybXMgUHl0aG9uIHNvdXJjZSBjb2RlIGludG8gYW4gYWJzdHJhY3Qgc3ludGF4IHRyZWUgKEFTVCkKK2RlZmluZWQgaW4gdGhlIGFzdCBtb2R1bGUuCisKK1RoZSBzaW1wbGVzdCB3YXlzIHRvIGludm9rZSB0aGlzIG1vZHVsZSBhcmUgdmlhIHBhcnNlIGFuZCBwYXJzZUZpbGUuCitwYXJzZShidWYpIC0+IEFTVAorcGFyc2VGaWxlKHBhdGgpIC0+IEFTVAorIiIiCisKKyMgT3JpZ2luYWwgdmVyc2lvbiB3cml0dGVuIGJ5IEdyZWcgU3RlaW4gKGdzdGVpbkBseXJhLm9yZykKKyMgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIEJpbGwgVHV0dCAocmFzc2lsb25AbGltYS5tdWRsaWIub3JnKQorIyBGZWJydWFyeSAxOTk3LgorIworIyBNb2RpZmljYXRpb25zIGFuZCBpbXByb3ZlbWVudHMgZm9yIFB5dGhvbiAyLjAgYnkgSmVyZW15IEh5bHRvbiBhbmQKKyMgTWFyayBIYW1tb25kCisjCisjIFNvbWUgZml4ZXMgdG8gdHJ5IHRvIGhhdmUgY29ycmVjdCBsaW5lIG51bWJlciBvbiBhbG1vc3QgYWxsIG5vZGVzCisjIChleGNlcHQgTW9kdWxlLCBEaXNjYXJkIGFuZCBTdG10KSBhZGRlZCBieSBTeWx2YWluIFRoZW5hdWx0CisjCisjIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmU6CisjIENvcHlyaWdodCAoQykgMTk5Ny0xOTk4IEdyZWcgU3RlaW4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFRoaXMgbW9kdWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgQlNELWlzaCBsaWNlbnNlLiBTZWUKKyMgICBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWwKKyMgYW5kIHJlcGxhY2UgT1dORVIsIE9SR0FOSVpBVElPTiwgYW5kIFlFQVIgYXMgYXBwcm9wcmlhdGUuCisKK2Zyb20gY29tcGlsZXIuYXN0IGltcG9ydCAqCitpbXBvcnQgcGFyc2VyCitpbXBvcnQgc3ltYm9sCitpbXBvcnQgdG9rZW4KKworY2xhc3MgV2Fsa2VyRXJyb3IoU3RhbmRhcmRFcnJvcik6CisgICAgcGFzcworCitmcm9tIGNvbXBpbGVyLmNvbnN0cyBpbXBvcnQgQ09fVkFSQVJHUywgQ09fVkFSS0VZV09SRFMKK2Zyb20gY29tcGlsZXIuY29uc3RzIGltcG9ydCBPUF9BU1NJR04sIE9QX0RFTEVURSwgT1BfQVBQTFkKKworZGVmIHBhcnNlRmlsZShwYXRoKToKKyAgICBmID0gb3BlbihwYXRoLCAiVSIpCisgICAgIyBYWFggVGhlIHBhcnNlciBBUEkgdG9sZXJhdGVzIGZpbGVzIHdpdGhvdXQgYSB0cmFpbGluZyBuZXdsaW5lLAorICAgICMgYnV0IG5vdCBzdHJpbmdzIHdpdGhvdXQgYSB0cmFpbGluZyBuZXdsaW5lLiAgQWx3YXlzIGFkZCBhbiBleHRyYQorICAgICMgbmV3bGluZSB0byB0aGUgZmlsZSBjb250ZW50cywgc2luY2Ugd2UncmUgZ29pbmcgdGhyb3VnaCB0aGUgc3RyaW5nCisgICAgIyB2ZXJzaW9uIG9mIHRoZSBBUEkuCisgICAgc3JjID0gZi5yZWFkKCkgKyAiXG4iCisgICAgZi5jbG9zZSgpCisgICAgcmV0dXJuIHBhcnNlKHNyYykKKworZGVmIHBhcnNlKGJ1ZiwgbW9kZT0iZXhlYyIpOgorICAgIGlmIG1vZGUgPT0gImV4ZWMiIG9yIG1vZGUgPT0gInNpbmdsZSI6CisgICAgICAgIHJldHVybiBUcmFuc2Zvcm1lcigpLnBhcnNlc3VpdGUoYnVmKQorICAgIGVsaWYgbW9kZSA9PSAiZXZhbCI6CisgICAgICAgIHJldHVybiBUcmFuc2Zvcm1lcigpLnBhcnNlZXhwcihidWYpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY29tcGlsZSgpIGFyZyAzIG11c3QgYmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAnZXhlYycgb3IgJ2V2YWwnIG9yICdzaW5nbGUnIikKKworZGVmIGFzTGlzdChub2Rlcyk6CisgICAgbCA9IFtdCisgICAgZm9yIGl0ZW0gaW4gbm9kZXM6CisgICAgICAgIGlmIGhhc2F0dHIoaXRlbSwgImFzTGlzdCIpOgorICAgICAgICAgICAgbC5hcHBlbmQoaXRlbS5hc0xpc3QoKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHR5cGUoaXRlbSkgaXMgdHlwZSggKE5vbmUsIE5vbmUpICk6CisgICAgICAgICAgICAgICAgbC5hcHBlbmQodHVwbGUoYXNMaXN0KGl0ZW0pKSkKKyAgICAgICAgICAgIGVsaWYgdHlwZShpdGVtKSBpcyB0eXBlKCBbXSApOgorICAgICAgICAgICAgICAgIGwuYXBwZW5kKGFzTGlzdChpdGVtKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbC5hcHBlbmQoaXRlbSkKKyAgICByZXR1cm4gbAorCitkZWYgZXh0cmFjdExpbmVObyhhc3QpOgorICAgIGlmIG5vdCBpc2luc3RhbmNlKGFzdFsxXSwgdHVwbGUpOgorICAgICAgICAjIGdldCBhIHRlcm1pbmFsIG5vZGUKKyAgICAgICAgcmV0dXJuIGFzdFsyXQorICAgIGZvciBjaGlsZCBpbiBhc3RbMTpdOgorICAgICAgICBpZiBpc2luc3RhbmNlKGNoaWxkLCB0dXBsZSk6CisgICAgICAgICAgICBsaW5lbm8gPSBleHRyYWN0TGluZU5vKGNoaWxkKQorICAgICAgICAgICAgaWYgbGluZW5vIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBsaW5lbm8KKworZGVmIE5vZGUoKmFyZ3MpOgorICAgIGtpbmQgPSBhcmdzWzBdCisgICAgaWYga2luZCBpbiBub2RlczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIG5vZGVzW2tpbmRdKCphcmdzWzE6XSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHByaW50IG5vZGVzW2tpbmRdLCBsZW4oYXJncyksIGFyZ3MKKyAgICAgICAgICAgIHJhaXNlCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgV2Fsa2VyRXJyb3IsICJDYW4ndCBmaW5kIGFwcHJvcHJpYXRlIE5vZGUgdHlwZTogJXMiICUgc3RyKGFyZ3MpCisgICAgICAgICNyZXR1cm4gYXBwbHkoYXN0Lk5vZGUsIGFyZ3MpCisKK2NsYXNzIFRyYW5zZm9ybWVyOgorICAgICIiIlV0aWxpdHkgb2JqZWN0IGZvciB0cmFuc2Zvcm1pbmcgUHl0aG9uIHBhcnNlIHRyZWVzLgorCisgICAgRXhwb3NlcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisgICAgICAgIHRyZWUgPSB0cmFuc2Zvcm0oYXN0X3RyZWUpCisgICAgICAgIHRyZWUgPSBwYXJzZXN1aXRlKHRleHQpCisgICAgICAgIHRyZWUgPSBwYXJzZWV4cHIodGV4dCkKKyAgICAgICAgdHJlZSA9IHBhcnNlZmlsZShmaWxlb2IgfCBmaWxlbmFtZSkKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGlzcGF0Y2ggPSB7fQorICAgICAgICBmb3IgdmFsdWUsIG5hbWUgaW4gc3ltYm9sLnN5bV9uYW1lLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIHNlbGYuX2Rpc3BhdGNoW3ZhbHVlXSA9IGdldGF0dHIoc2VsZiwgbmFtZSkKKyAgICAgICAgc2VsZi5fZGlzcGF0Y2hbdG9rZW4uTkVXTElORV0gPSBzZWxmLmNvbV9ORVdMSU5FCisgICAgICAgIHNlbGYuX2F0b21fZGlzcGF0Y2ggPSB7dG9rZW4uTFBBUjogc2VsZi5hdG9tX2xwYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uTFNRQjogc2VsZi5hdG9tX2xzcWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uTEJSQUNFOiBzZWxmLmF0b21fbGJyYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLkJBQ0tRVU9URTogc2VsZi5hdG9tX2JhY2txdW90ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5OVU1CRVI6IHNlbGYuYXRvbV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uU1RSSU5HOiBzZWxmLmF0b21fc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLk5BTUU6IHNlbGYuYXRvbV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgc2VsZi5lbmNvZGluZyA9IE5vbmUKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgdHJlZSk6CisgICAgICAgICIiIlRyYW5zZm9ybSBhbiBBU1QgaW50byBhIG1vZGlmaWVkIHBhcnNlIHRyZWUuIiIiCisgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZSh0cmVlLCB0dXBsZSkgb3IgaXNpbnN0YW5jZSh0cmVlLCBsaXN0KSk6CisgICAgICAgICAgICB0cmVlID0gcGFyc2VyLnN0MnR1cGxlKHRyZWUsIGxpbmVfaW5mbz0xKQorICAgICAgICByZXR1cm4gc2VsZi5jb21waWxlX25vZGUodHJlZSkKKworICAgIGRlZiBwYXJzZXN1aXRlKHNlbGYsIHRleHQpOgorICAgICAgICAiIiJSZXR1cm4gYSBtb2RpZmllZCBwYXJzZSB0cmVlIGZvciB0aGUgZ2l2ZW4gc3VpdGUgdGV4dC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudHJhbnNmb3JtKHBhcnNlci5zdWl0ZSh0ZXh0KSkKKworICAgIGRlZiBwYXJzZWV4cHIoc2VsZiwgdGV4dCk6CisgICAgICAgICIiIlJldHVybiBhIG1vZGlmaWVkIHBhcnNlIHRyZWUgZm9yIHRoZSBnaXZlbiBleHByZXNzaW9uIHRleHQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRyYW5zZm9ybShwYXJzZXIuZXhwcih0ZXh0KSkKKworICAgIGRlZiBwYXJzZWZpbGUoc2VsZiwgZmlsZSk6CisgICAgICAgICIiIlJldHVybiBhIG1vZGlmaWVkIHBhcnNlIHRyZWUgZm9yIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gZmlsZS4iIiIKKyAgICAgICAgaWYgdHlwZShmaWxlKSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgIGZpbGUgPSBvcGVuKGZpbGUpCisgICAgICAgIHJldHVybiBzZWxmLnBhcnNlc3VpdGUoZmlsZS5yZWFkKCkpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIworICAgICMgUFJJVkFURSBNRVRIT0RTCisgICAgIworCisgICAgZGVmIGNvbXBpbGVfbm9kZShzZWxmLCBub2RlKToKKyAgICAgICAgIyMjIGVtaXQgYSBsaW5lLW51bWJlciBub2RlPworICAgICAgICBuID0gbm9kZVswXQorCisgICAgICAgIGlmIG4gPT0gc3ltYm9sLmVuY29kaW5nX2RlY2w6CisgICAgICAgICAgICBzZWxmLmVuY29kaW5nID0gbm9kZVsyXQorICAgICAgICAgICAgbm9kZSA9IG5vZGVbMV0KKyAgICAgICAgICAgIG4gPSBub2RlWzBdCisKKyAgICAgICAgaWYgbiA9PSBzeW1ib2wuc2luZ2xlX2lucHV0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2luZ2xlX2lucHV0KG5vZGVbMTpdKQorICAgICAgICBpZiBuID09IHN5bWJvbC5maWxlX2lucHV0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZV9pbnB1dChub2RlWzE6XSkKKyAgICAgICAgaWYgbiA9PSBzeW1ib2wuZXZhbF9pbnB1dDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmV2YWxfaW5wdXQobm9kZVsxOl0pCisgICAgICAgIGlmIG4gPT0gc3ltYm9sLmxhbWJkZWY6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5sYW1iZGVmKG5vZGVbMTpdKQorICAgICAgICBpZiBuID09IHN5bWJvbC5mdW5jZGVmOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZnVuY2RlZihub2RlWzE6XSkKKyAgICAgICAgaWYgbiA9PSBzeW1ib2wuY2xhc3NkZWY6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jbGFzc2RlZihub2RlWzE6XSkKKworICAgICAgICByYWlzZSBXYWxrZXJFcnJvciwgKCd1bmV4cGVjdGVkIG5vZGUgdHlwZScsIG4pCisKKyAgICBkZWYgc2luZ2xlX2lucHV0KHNlbGYsIG5vZGUpOgorICAgICAgICAjIyMgZG8gd2Ugd2FudCB0byBkbyBhbnl0aGluZyBhYm91dCBiZWluZyAiaW50ZXJhY3RpdmUiID8KKworICAgICAgICAjIE5FV0xJTkUgfCBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQgTkVXTElORQorICAgICAgICBuID0gbm9kZVswXVswXQorICAgICAgICBpZiBuICE9IHRva2VuLk5FV0xJTkU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fc3RtdChub2RlWzBdKQorCisgICAgICAgIHJldHVybiBQYXNzKCkKKworICAgIGRlZiBmaWxlX2lucHV0KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgZG9jID0gc2VsZi5nZXRfZG9jc3RyaW5nKG5vZGVsaXN0LCBzeW1ib2wuZmlsZV9pbnB1dCkKKyAgICAgICAgaWYgZG9jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaSA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGkgPSAwCisgICAgICAgIHN0bXRzID0gW10KKyAgICAgICAgZm9yIG5vZGUgaW4gbm9kZWxpc3RbaTpdOgorICAgICAgICAgICAgaWYgbm9kZVswXSAhPSB0b2tlbi5FTkRNQVJLRVIgYW5kIG5vZGVbMF0gIT0gdG9rZW4uTkVXTElORToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbV9hcHBlbmRfc3RtdChzdG10cywgbm9kZSkKKyAgICAgICAgcmV0dXJuIE1vZHVsZShkb2MsIFN0bXQoc3RtdHMpKQorCisgICAgZGVmIGV2YWxfaW5wdXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGZyb20gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGlucHV0KCkKKyAgICAgICAgIyMjIGlzIHRoaXMgc3VmZmljaWVudD8KKyAgICAgICAgcmV0dXJuIEV4cHJlc3Npb24oc2VsZi5jb21fbm9kZShub2RlbGlzdFswXSkpCisKKyAgICBkZWYgZGVjb3JhdG9yX25hbWUoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICBsaXN0bGVuID0gbGVuKG5vZGVsaXN0KQorICAgICAgICBhc3NlcnQgbGlzdGxlbiA+PSAxIGFuZCBsaXN0bGVuICUgMiA9PSAxCisKKyAgICAgICAgaXRlbSA9IHNlbGYuYXRvbV9uYW1lKG5vZGVsaXN0KQorICAgICAgICBpID0gMQorICAgICAgICB3aGlsZSBpIDwgbGlzdGxlbjoKKyAgICAgICAgICAgIGFzc2VydCBub2RlbGlzdFtpXVswXSA9PSB0b2tlbi5ET1QKKyAgICAgICAgICAgIGFzc2VydCBub2RlbGlzdFtpICsgMV1bMF0gPT0gdG9rZW4uTkFNRQorICAgICAgICAgICAgaXRlbSA9IEdldGF0dHIoaXRlbSwgbm9kZWxpc3RbaSArIDFdWzFdKQorICAgICAgICAgICAgaSArPSAyCisKKyAgICAgICAgcmV0dXJuIGl0ZW0KKworICAgIGRlZiBkZWNvcmF0b3Ioc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjICdAJyBkb3R0ZWRfbmFtZSBbICcoJyBbYXJnbGlzdF0gJyknIF0KKyAgICAgICAgYXNzZXJ0IGxlbihub2RlbGlzdCkgaW4gKDMsIDUsIDYpCisgICAgICAgIGFzc2VydCBub2RlbGlzdFswXVswXSA9PSB0b2tlbi5BVAorICAgICAgICBhc3NlcnQgbm9kZWxpc3RbLTFdWzBdID09IHRva2VuLk5FV0xJTkUKKworICAgICAgICBhc3NlcnQgbm9kZWxpc3RbMV1bMF0gPT0gc3ltYm9sLmRvdHRlZF9uYW1lCisgICAgICAgIGZ1bmNuYW1lID0gc2VsZi5kZWNvcmF0b3JfbmFtZShub2RlbGlzdFsxXVsxOl0pCisKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA+IDM6CisgICAgICAgICAgICBhc3NlcnQgbm9kZWxpc3RbMl1bMF0gPT0gdG9rZW4uTFBBUgorICAgICAgICAgICAgZXhwciA9IHNlbGYuY29tX2NhbGxfZnVuY3Rpb24oZnVuY25hbWUsIG5vZGVsaXN0WzNdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhwciA9IGZ1bmNuYW1lCisKKyAgICAgICAgcmV0dXJuIGV4cHIKKworICAgIGRlZiBkZWNvcmF0b3JzKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBkZWNvcmF0b3JzOiBkZWNvcmF0b3IgKFtORVdMSU5FXSBkZWNvcmF0b3IpKiBORVdMSU5FCisgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgZm9yIGRlY19ub2RlbGlzdCBpbiBub2RlbGlzdDoKKyAgICAgICAgICAgIGFzc2VydCBkZWNfbm9kZWxpc3RbMF0gPT0gc3ltYm9sLmRlY29yYXRvcgorICAgICAgICAgICAgaXRlbXMuYXBwZW5kKHNlbGYuZGVjb3JhdG9yKGRlY19ub2RlbGlzdFsxOl0pKQorICAgICAgICByZXR1cm4gRGVjb3JhdG9ycyhpdGVtcykKKworICAgIGRlZiBkZWNvcmF0ZWQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICBhc3NlcnQgbm9kZWxpc3RbMF1bMF0gPT0gc3ltYm9sLmRlY29yYXRvcnMKKyAgICAgICAgaWYgbm9kZWxpc3RbMV1bMF0gPT0gc3ltYm9sLmZ1bmNkZWY6CisgICAgICAgICAgICBuID0gW25vZGVsaXN0WzBdXSArIGxpc3Qobm9kZWxpc3RbMV1bMTpdKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZnVuY2RlZihuKQorICAgICAgICBlbGlmIG5vZGVsaXN0WzFdWzBdID09IHN5bWJvbC5jbGFzc2RlZjoKKyAgICAgICAgICAgIGRlY29yYXRvcnMgPSBzZWxmLmRlY29yYXRvcnMobm9kZWxpc3RbMF1bMTpdKQorICAgICAgICAgICAgY2xzID0gc2VsZi5jbGFzc2RlZihub2RlbGlzdFsxXVsxOl0pCisgICAgICAgICAgICBjbHMuZGVjb3JhdG9ycyA9IGRlY29yYXRvcnMKKyAgICAgICAgICAgIHJldHVybiBjbHMKKyAgICAgICAgcmFpc2UgV2Fsa2VyRXJyb3IoKQorCisgICAgZGVmIGZ1bmNkZWYoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAtNiAgIC01ICAgIC00ICAgICAgICAgLTMgIC0yICAgIC0xCisgICAgICAgICMgZnVuY2RlZjogW2RlY29yYXRvcnNdICdkZWYnIE5BTUUgcGFyYW1ldGVycyAnOicgc3VpdGUKKyAgICAgICAgIyBwYXJhbWV0ZXJzOiAnKCcgW3ZhcmFyZ3NsaXN0XSAnKScKKworICAgICAgICBpZiBsZW4obm9kZWxpc3QpID09IDY6CisgICAgICAgICAgICBhc3NlcnQgbm9kZWxpc3RbMF1bMF0gPT0gc3ltYm9sLmRlY29yYXRvcnMKKyAgICAgICAgICAgIGRlY29yYXRvcnMgPSBzZWxmLmRlY29yYXRvcnMobm9kZWxpc3RbMF1bMTpdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IGxlbihub2RlbGlzdCkgPT0gNQorICAgICAgICAgICAgZGVjb3JhdG9ycyA9IE5vbmUKKworICAgICAgICBsaW5lbm8gPSBub2RlbGlzdFstNF1bMl0KKyAgICAgICAgbmFtZSA9IG5vZGVsaXN0Wy00XVsxXQorICAgICAgICBhcmdzID0gbm9kZWxpc3RbLTNdWzJdCisKKyAgICAgICAgaWYgYXJnc1swXSA9PSBzeW1ib2wudmFyYXJnc2xpc3Q6CisgICAgICAgICAgICBuYW1lcywgZGVmYXVsdHMsIGZsYWdzID0gc2VsZi5jb21fYXJnbGlzdChhcmdzWzE6XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWVzID0gZGVmYXVsdHMgPSAoKQorICAgICAgICAgICAgZmxhZ3MgPSAwCisgICAgICAgIGRvYyA9IHNlbGYuZ2V0X2RvY3N0cmluZyhub2RlbGlzdFstMV0pCisKKyAgICAgICAgIyBjb2RlIGZvciBmdW5jdGlvbgorICAgICAgICBjb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFstMV0pCisKKyAgICAgICAgaWYgZG9jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoY29kZSwgU3RtdCkKKyAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGNvZGUubm9kZXNbMF0sIERpc2NhcmQpCisgICAgICAgICAgICBkZWwgY29kZS5ub2Rlc1swXQorICAgICAgICByZXR1cm4gRnVuY3Rpb24oZGVjb3JhdG9ycywgbmFtZSwgbmFtZXMsIGRlZmF1bHRzLCBmbGFncywgZG9jLCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgbGluZW5vPWxpbmVubykKKworICAgIGRlZiBsYW1iZGVmKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBsYW1iZGVmOiAnbGFtYmRhJyBbdmFyYXJnc2xpc3RdICc6JyB0ZXN0CisgICAgICAgIGlmIG5vZGVsaXN0WzJdWzBdID09IHN5bWJvbC52YXJhcmdzbGlzdDoKKyAgICAgICAgICAgIG5hbWVzLCBkZWZhdWx0cywgZmxhZ3MgPSBzZWxmLmNvbV9hcmdsaXN0KG5vZGVsaXN0WzJdWzE6XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWVzID0gZGVmYXVsdHMgPSAoKQorICAgICAgICAgICAgZmxhZ3MgPSAwCisKKyAgICAgICAgIyBjb2RlIGZvciBsYW1iZGEKKyAgICAgICAgY29kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbLTFdKQorCisgICAgICAgIHJldHVybiBMYW1iZGEobmFtZXMsIGRlZmF1bHRzLCBmbGFncywgY29kZSwgbGluZW5vPW5vZGVsaXN0WzFdWzJdKQorICAgIG9sZF9sYW1iZGVmID0gbGFtYmRlZgorCisgICAgZGVmIGNsYXNzZGVmKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBjbGFzc2RlZjogJ2NsYXNzJyBOQU1FIFsnKCcgW3Rlc3RsaXN0XSAnKSddICc6JyBzdWl0ZQorCisgICAgICAgIG5hbWUgPSBub2RlbGlzdFsxXVsxXQorICAgICAgICBkb2MgPSBzZWxmLmdldF9kb2NzdHJpbmcobm9kZWxpc3RbLTFdKQorICAgICAgICBpZiBub2RlbGlzdFsyXVswXSA9PSB0b2tlbi5DT0xPTjoKKyAgICAgICAgICAgIGJhc2VzID0gW10KKyAgICAgICAgZWxpZiBub2RlbGlzdFszXVswXSA9PSB0b2tlbi5SUEFSOgorICAgICAgICAgICAgYmFzZXMgPSBbXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzZXMgPSBzZWxmLmNvbV9iYXNlcyhub2RlbGlzdFszXSkKKworICAgICAgICAjIGNvZGUgZm9yIGNsYXNzCisgICAgICAgIGNvZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0Wy0xXSkKKworICAgICAgICBpZiBkb2MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShjb2RlLCBTdG10KQorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoY29kZS5ub2Rlc1swXSwgRGlzY2FyZCkKKyAgICAgICAgICAgIGRlbCBjb2RlLm5vZGVzWzBdCisKKyAgICAgICAgcmV0dXJuIENsYXNzKG5hbWUsIGJhc2VzLCBkb2MsIGNvZGUsIGxpbmVubz1ub2RlbGlzdFsxXVsyXSkKKworICAgIGRlZiBzdG10KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tX3N0bXQobm9kZWxpc3RbMF0pCisKKyAgICBzbWFsbF9zdG10ID0gc3RtdAorICAgIGZsb3dfc3RtdCA9IHN0bXQKKyAgICBjb21wb3VuZF9zdG10ID0gc3RtdAorCisgICAgZGVmIHNpbXBsZV9zdG10KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBzbWFsbF9zdG10ICgnOycgc21hbGxfc3RtdCkqIFsnOyddIE5FV0xJTkUKKyAgICAgICAgc3RtdHMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4obm9kZWxpc3QpLCAyKToKKyAgICAgICAgICAgIHNlbGYuY29tX2FwcGVuZF9zdG10KHN0bXRzLCBub2RlbGlzdFtpXSkKKyAgICAgICAgcmV0dXJuIFN0bXQoc3RtdHMpCisKKyAgICBkZWYgcGFyYW1ldGVycyhzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIHJhaXNlIFdhbGtlckVycm9yCisKKyAgICBkZWYgdmFyYXJnc2xpc3Qoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByYWlzZSBXYWxrZXJFcnJvcgorCisgICAgZGVmIGZwZGVmKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgcmFpc2UgV2Fsa2VyRXJyb3IKKworICAgIGRlZiBmcGxpc3Qoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByYWlzZSBXYWxrZXJFcnJvcgorCisgICAgZGVmIGRvdHRlZF9uYW1lKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgcmFpc2UgV2Fsa2VyRXJyb3IKKworICAgIGRlZiBjb21wX29wKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgcmFpc2UgV2Fsa2VyRXJyb3IKKworICAgIGRlZiB0cmFpbGVyKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgcmFpc2UgV2Fsa2VyRXJyb3IKKworICAgIGRlZiBzbGljZW9wKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgcmFpc2UgV2Fsa2VyRXJyb3IKKworICAgIGRlZiBhcmd1bWVudChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIHJhaXNlIFdhbGtlckVycm9yCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIworICAgICMgU1RBVEVNRU5UIE5PREVTICAoaW52b2tlZCBieSBjb21fbm9kZSgpKQorICAgICMKKworICAgIGRlZiBleHByX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGF1Z2Fzc2lnbiB0ZXN0bGlzdCB8IHRlc3RsaXN0ICgnPScgdGVzdGxpc3QpKgorICAgICAgICBlbiA9IG5vZGVsaXN0Wy0xXQorICAgICAgICBleHByTm9kZSA9IHNlbGYubG9va3VwX25vZGUoZW4pKGVuWzE6XSkKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIERpc2NhcmQoZXhwck5vZGUsIGxpbmVubz1leHByTm9kZS5saW5lbm8pCisgICAgICAgIGlmIG5vZGVsaXN0WzFdWzBdID09IHRva2VuLkVRVUFMOgorICAgICAgICAgICAgbm9kZXNsID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihub2RlbGlzdCkgLSAyLCAyKToKKyAgICAgICAgICAgICAgICBub2Rlc2wuYXBwZW5kKHNlbGYuY29tX2Fzc2lnbihub2RlbGlzdFtpXSwgT1BfQVNTSUdOKSkKKyAgICAgICAgICAgIHJldHVybiBBc3NpZ24obm9kZXNsLCBleHByTm9kZSwgbGluZW5vPW5vZGVsaXN0WzFdWzJdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbHZhbCA9IHNlbGYuY29tX2F1Z2Fzc2lnbihub2RlbGlzdFswXSkKKyAgICAgICAgICAgIG9wID0gc2VsZi5jb21fYXVnYXNzaWduX29wKG5vZGVsaXN0WzFdKQorICAgICAgICAgICAgcmV0dXJuIEF1Z0Fzc2lnbihsdmFsLCBvcFsxXSwgZXhwck5vZGUsIGxpbmVubz1vcFsyXSkKKyAgICAgICAgcmFpc2UgV2Fsa2VyRXJyb3IsICJjYW4ndCBnZXQgaGVyZSIKKworICAgIGRlZiBwcmludF9zdG10KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBwcmludCAoWyB0ZXN0ICgnLCcgdGVzdCkqIFsnLCddIF0gfCAnPj4nIHRlc3QgWyAoJywnIHRlc3QpKyBbJywnXSBdKQorICAgICAgICBpdGVtcyA9IFtdCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPT0gMToKKyAgICAgICAgICAgIHN0YXJ0ID0gMQorICAgICAgICAgICAgZGVzdCA9IE5vbmUKKyAgICAgICAgZWxpZiBub2RlbGlzdFsxXVswXSA9PSB0b2tlbi5SSUdIVFNISUZUOgorICAgICAgICAgICAgYXNzZXJ0IGxlbihub2RlbGlzdCkgPT0gMyBcCisgICAgICAgICAgICAgICAgICAgb3Igbm9kZWxpc3RbM11bMF0gPT0gdG9rZW4uQ09NTUEKKyAgICAgICAgICAgIGRlc3QgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzJdKQorICAgICAgICAgICAgc3RhcnQgPSA0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZXN0ID0gTm9uZQorICAgICAgICAgICAgc3RhcnQgPSAxCisgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YXJ0LCBsZW4obm9kZWxpc3QpLCAyKToKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2ldKSkKKyAgICAgICAgaWYgbm9kZWxpc3RbLTFdWzBdID09IHRva2VuLkNPTU1BOgorICAgICAgICAgICAgcmV0dXJuIFByaW50KGl0ZW1zLCBkZXN0LCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgIHJldHVybiBQcmludG5sKGl0ZW1zLCBkZXN0LCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgZGVsX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByZXR1cm4gc2VsZi5jb21fYXNzaWduKG5vZGVsaXN0WzFdLCBPUF9ERUxFVEUpCisKKyAgICBkZWYgcGFzc19zdG10KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgcmV0dXJuIFBhc3MobGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIGJyZWFrX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByZXR1cm4gQnJlYWsobGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIGNvbnRpbnVlX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByZXR1cm4gQ29udGludWUobGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIHJldHVybl9zdG10KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyByZXR1cm46IFt0ZXN0bGlzdF0KKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA8IDI6CisgICAgICAgICAgICByZXR1cm4gUmV0dXJuKENvbnN0KE5vbmUpLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgIHJldHVybiBSZXR1cm4oc2VsZi5jb21fbm9kZShub2RlbGlzdFsxXSksIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKworICAgIGRlZiB5aWVsZF9zdG10KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgZXhwciA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMF0pCisgICAgICAgIHJldHVybiBEaXNjYXJkKGV4cHIsIGxpbmVubz1leHByLmxpbmVubykKKworICAgIGRlZiB5aWVsZF9leHByKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA+IDE6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWx1ZSA9IENvbnN0KE5vbmUpCisgICAgICAgIHJldHVybiBZaWVsZCh2YWx1ZSwgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIHJhaXNlX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIHJhaXNlOiBbdGVzdCBbJywnIHRlc3QgWycsJyB0ZXN0XV1dCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPiA1OgorICAgICAgICAgICAgZXhwcjMgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzVdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhwcjMgPSBOb25lCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPiAzOgorICAgICAgICAgICAgZXhwcjIgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzNdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhwcjIgPSBOb25lCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPiAxOgorICAgICAgICAgICAgZXhwcjEgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzFdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhwcjEgPSBOb25lCisgICAgICAgIHJldHVybiBSYWlzZShleHByMSwgZXhwcjIsIGV4cHIzLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgaW1wb3J0X3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGltcG9ydF9zdG10OiBpbXBvcnRfbmFtZSB8IGltcG9ydF9mcm9tCisgICAgICAgIGFzc2VydCBsZW4obm9kZWxpc3QpID09IDEKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tX25vZGUobm9kZWxpc3RbMF0pCisKKyAgICBkZWYgaW1wb3J0X25hbWUoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGltcG9ydF9uYW1lOiAnaW1wb3J0JyBkb3R0ZWRfYXNfbmFtZXMKKyAgICAgICAgcmV0dXJuIEltcG9ydChzZWxmLmNvbV9kb3R0ZWRfYXNfbmFtZXMobm9kZWxpc3RbMV0pLAorICAgICAgICAgICAgICAgICAgICAgIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKworICAgIGRlZiBpbXBvcnRfZnJvbShzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgaW1wb3J0X2Zyb206ICdmcm9tJyAoJy4nKiBkb3R0ZWRfbmFtZSB8ICcuJykgJ2ltcG9ydCcgKCcqJyB8CisgICAgICAgICMgICAgJygnIGltcG9ydF9hc19uYW1lcyAnKScgfCBpbXBvcnRfYXNfbmFtZXMpCisgICAgICAgIGFzc2VydCBub2RlbGlzdFswXVsxXSA9PSAnZnJvbScKKyAgICAgICAgaWR4ID0gMQorICAgICAgICB3aGlsZSBub2RlbGlzdFtpZHhdWzFdID09ICcuJzoKKyAgICAgICAgICAgIGlkeCArPSAxCisgICAgICAgIGxldmVsID0gaWR4IC0gMQorICAgICAgICBpZiBub2RlbGlzdFtpZHhdWzBdID09IHN5bWJvbC5kb3R0ZWRfbmFtZToKKyAgICAgICAgICAgIGZyb21uYW1lID0gc2VsZi5jb21fZG90dGVkX25hbWUobm9kZWxpc3RbaWR4XSkKKyAgICAgICAgICAgIGlkeCArPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmcm9tbmFtZSA9ICIiCisgICAgICAgIGFzc2VydCBub2RlbGlzdFtpZHhdWzFdID09ICdpbXBvcnQnCisgICAgICAgIGlmIG5vZGVsaXN0W2lkeCArIDFdWzBdID09IHRva2VuLlNUQVI6CisgICAgICAgICAgICByZXR1cm4gRnJvbShmcm9tbmFtZSwgWygnKicsIE5vbmUpXSwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBub2RlID0gbm9kZWxpc3RbaWR4ICsgMSArIChub2RlbGlzdFtpZHggKyAxXVswXSA9PSB0b2tlbi5MUEFSKV0KKyAgICAgICAgICAgIHJldHVybiBGcm9tKGZyb21uYW1lLCBzZWxmLmNvbV9pbXBvcnRfYXNfbmFtZXMobm9kZSksIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIGdsb2JhbF9zdG10KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBnbG9iYWw6IE5BTUUgKCcsJyBOQU1FKSoKKyAgICAgICAgbmFtZXMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obm9kZWxpc3QpLCAyKToKKyAgICAgICAgICAgIG5hbWVzLmFwcGVuZChub2RlbGlzdFtpXVsxXSkKKyAgICAgICAgcmV0dXJuIEdsb2JhbChuYW1lcywgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIGV4ZWNfc3RtdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgZXhlY19zdG10OiAnZXhlYycgZXhwciBbJ2luJyBleHByIFsnLCcgZXhwcl1dCisgICAgICAgIGV4cHIxID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFsxXSkKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA+PSA0OgorICAgICAgICAgICAgZXhwcjIgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzNdKQorICAgICAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA+PSA2OgorICAgICAgICAgICAgICAgIGV4cHIzID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFs1XSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhwcjMgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleHByMiA9IGV4cHIzID0gTm9uZQorCisgICAgICAgIHJldHVybiBFeGVjKGV4cHIxLCBleHByMiwgZXhwcjMsIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKworICAgIGRlZiBhc3NlcnRfc3RtdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgJ2Fzc2VydCc6IHRlc3QsIFsnLCcgdGVzdF0KKyAgICAgICAgZXhwcjEgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzFdKQorICAgICAgICBpZiAobGVuKG5vZGVsaXN0KSA9PSA0KToKKyAgICAgICAgICAgIGV4cHIyID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFszXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV4cHIyID0gTm9uZQorICAgICAgICByZXR1cm4gQXNzZXJ0KGV4cHIxLCBleHByMiwgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIGlmX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGlmOiB0ZXN0ICc6JyBzdWl0ZSAoJ2VsaWYnIHRlc3QgJzonIHN1aXRlKSogWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgIHRlc3RzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKG5vZGVsaXN0KSAtIDMsIDQpOgorICAgICAgICAgICAgdGVzdE5vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2kgKyAxXSkKKyAgICAgICAgICAgIHN1aXRlTm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbaSArIDNdKQorICAgICAgICAgICAgdGVzdHMuYXBwZW5kKCh0ZXN0Tm9kZSwgc3VpdGVOb2RlKSkKKworICAgICAgICBpZiBsZW4obm9kZWxpc3QpICUgNCA9PSAzOgorICAgICAgICAgICAgZWxzZU5vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0Wy0xXSkKKyMjICAgICAgZWxzZU5vZGUubGluZW5vID0gbm9kZWxpc3RbLTFdWzFdWzJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbHNlTm9kZSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIElmKHRlc3RzLCBlbHNlTm9kZSwgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIHdoaWxlX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjICd3aGlsZScgdGVzdCAnOicgc3VpdGUgWydlbHNlJyAnOicgc3VpdGVdCisKKyAgICAgICAgdGVzdE5vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzFdKQorICAgICAgICBib2R5Tm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbM10pCisKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA+IDQ6CisgICAgICAgICAgICBlbHNlTm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbNl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbHNlTm9kZSA9IE5vbmUKKworICAgICAgICByZXR1cm4gV2hpbGUodGVzdE5vZGUsIGJvZHlOb2RlLCBlbHNlTm9kZSwgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIGZvcl9zdG10KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyAnZm9yJyBleHBybGlzdCAnaW4nIGV4cHJsaXN0ICc6JyBzdWl0ZSBbJ2Vsc2UnICc6JyBzdWl0ZV0KKworICAgICAgICBhc3NpZ25Ob2RlID0gc2VsZi5jb21fYXNzaWduKG5vZGVsaXN0WzFdLCBPUF9BU1NJR04pCisgICAgICAgIGxpc3ROb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFszXSkKKyAgICAgICAgYm9keU5vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzVdKQorCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPiA4OgorICAgICAgICAgICAgZWxzZU5vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzhdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZWxzZU5vZGUgPSBOb25lCisKKyAgICAgICAgcmV0dXJuIEZvcihhc3NpZ25Ob2RlLCBsaXN0Tm9kZSwgYm9keU5vZGUsIGVsc2VOb2RlLAorICAgICAgICAgICAgICAgICAgIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKworICAgIGRlZiB0cnlfc3RtdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIHJldHVybiBzZWxmLmNvbV90cnlfZXhjZXB0X2ZpbmFsbHkobm9kZWxpc3QpCisKKyAgICBkZWYgd2l0aF9zdG10KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tX3dpdGgobm9kZWxpc3QpCisKKyAgICBkZWYgd2l0aF92YXIoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByZXR1cm4gc2VsZi5jb21fd2l0aF92YXIobm9kZWxpc3QpCisKKyAgICBkZWYgc3VpdGUoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIHNpbXBsZV9zdG10IHwgTkVXTElORSBJTkRFTlQgTkVXTElORSogKHN0bXQgTkVXTElORSopKyBERURFTlQKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX3N0bXQobm9kZWxpc3RbMF0pCisKKyAgICAgICAgc3RtdHMgPSBbXQorICAgICAgICBmb3Igbm9kZSBpbiBub2RlbGlzdDoKKyAgICAgICAgICAgIGlmIG5vZGVbMF0gPT0gc3ltYm9sLnN0bXQ6CisgICAgICAgICAgICAgICAgc2VsZi5jb21fYXBwZW5kX3N0bXQoc3RtdHMsIG5vZGUpCisgICAgICAgIHJldHVybiBTdG10KHN0bXRzKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMKKyAgICAjIEVYUFJFU1NJT04gTk9ERVMgIChpbnZva2VkIGJ5IGNvbV9ub2RlKCkpCisgICAgIworCisgICAgZGVmIHRlc3RsaXN0KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyB0ZXN0bGlzdDogZXhwciAoJywnIGV4cHIpKiBbJywnXQorICAgICAgICAjIHRlc3RsaXN0X3NhZmU6IHRlc3QgWygnLCcgdGVzdCkrIFsnLCddXQorICAgICAgICAjIGV4cHJsaXN0OiBleHByICgnLCcgZXhwcikqIFsnLCddCisgICAgICAgIHJldHVybiBzZWxmLmNvbV9iaW5hcnkoVHVwbGUsIG5vZGVsaXN0KQorCisgICAgdGVzdGxpc3Rfc2FmZSA9IHRlc3RsaXN0ICMgWFhYCisgICAgdGVzdGxpc3QxID0gdGVzdGxpc3QKKyAgICBleHBybGlzdCA9IHRlc3RsaXN0CisKKyAgICBkZWYgdGVzdGxpc3RfY29tcChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgdGVzdCAoIGNvbXBfZm9yIHwgKCcsJyB0ZXN0KSogWycsJ10gKQorICAgICAgICBhc3NlcnQgbm9kZWxpc3RbMF1bMF0gPT0gc3ltYm9sLnRlc3QKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA9PSAyIGFuZCBub2RlbGlzdFsxXVswXSA9PSBzeW1ib2wuY29tcF9mb3I6CisgICAgICAgICAgICB0ZXN0ID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFswXSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbV9nZW5lcmF0b3JfZXhwcmVzc2lvbih0ZXN0LCBub2RlbGlzdFsxXSkKKyAgICAgICAgcmV0dXJuIHNlbGYudGVzdGxpc3Qobm9kZWxpc3QpCisKKyAgICBkZWYgdGVzdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgb3JfdGVzdCBbJ2lmJyBvcl90ZXN0ICdlbHNlJyB0ZXN0XSB8IGxhbWJkZWYKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA9PSAxIGFuZCBub2RlbGlzdFswXVswXSA9PSBzeW1ib2wubGFtYmRlZjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxhbWJkZWYobm9kZWxpc3RbMF0pCisgICAgICAgIHRoZW4gPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzBdKQorICAgICAgICBpZiBsZW4obm9kZWxpc3QpID4gMToKKyAgICAgICAgICAgIGFzc2VydCBsZW4obm9kZWxpc3QpID09IDUKKyAgICAgICAgICAgIGFzc2VydCBub2RlbGlzdFsxXVsxXSA9PSAnaWYnCisgICAgICAgICAgICBhc3NlcnQgbm9kZWxpc3RbM11bMV0gPT0gJ2Vsc2UnCisgICAgICAgICAgICB0ZXN0ID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFsyXSkKKyAgICAgICAgICAgIGVsc2VfID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFs0XSkKKyAgICAgICAgICAgIHJldHVybiBJZkV4cCh0ZXN0LCB0aGVuLCBlbHNlXywgbGluZW5vPW5vZGVsaXN0WzFdWzJdKQorICAgICAgICByZXR1cm4gdGhlbgorCisgICAgZGVmIG9yX3Rlc3Qoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGFuZF90ZXN0ICgnb3InIGFuZF90ZXN0KSogfCBsYW1iZGVmCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPT0gMSBhbmQgbm9kZWxpc3RbMF1bMF0gPT0gc3ltYm9sLmxhbWJkZWY6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5sYW1iZGVmKG5vZGVsaXN0WzBdKQorICAgICAgICByZXR1cm4gc2VsZi5jb21fYmluYXJ5KE9yLCBub2RlbGlzdCkKKyAgICBvbGRfdGVzdCA9IG9yX3Rlc3QKKworICAgIGRlZiBhbmRfdGVzdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgbm90X3Rlc3QgKCdhbmQnIG5vdF90ZXN0KSoKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tX2JpbmFyeShBbmQsIG5vZGVsaXN0KQorCisgICAgZGVmIG5vdF90ZXN0KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyAnbm90JyBub3RfdGVzdCB8IGNvbXBhcmlzb24KKyAgICAgICAgcmVzdWx0ID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFstMV0pCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPT0gMjoKKyAgICAgICAgICAgIHJldHVybiBOb3QocmVzdWx0LCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBjb21wYXJpc29uKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBjb21wYXJpc29uOiBleHByIChjb21wX29wIGV4cHIpKgorICAgICAgICBub2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFswXSkKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIG5vZGUKKworICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMiwgbGVuKG5vZGVsaXN0KSwgMik6CisgICAgICAgICAgICBubCA9IG5vZGVsaXN0W2ktMV0KKworICAgICAgICAgICAgIyBjb21wX29wOiAnPCcgfCAnPicgfCAnPScgfCAnPj0nIHwgJzw9JyB8ICc8PicgfCAnIT0nIHwgJz09JworICAgICAgICAgICAgIyAgICAgICAgICB8ICdpbicgfCAnbm90JyAnaW4nIHwgJ2lzJyB8ICdpcycgJ25vdCcKKyAgICAgICAgICAgIG4gPSBubFsxXQorICAgICAgICAgICAgaWYgblswXSA9PSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgICAgIHR5cGUgPSBuWzFdCisgICAgICAgICAgICAgICAgaWYgbGVuKG5sKSA9PSAzOgorICAgICAgICAgICAgICAgICAgICBpZiB0eXBlID09ICdub3QnOgorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdub3QgaW4nCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ2lzIG5vdCcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHlwZSA9IF9jbXBfdHlwZXNbblswXV0KKworICAgICAgICAgICAgbGluZW5vID0gbmxbMV1bMl0KKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCh0eXBlLCBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2ldKSkpCisKKyAgICAgICAgIyB3ZSBuZWVkIGEgc3BlY2lhbCAiY29tcGFyZSIgbm9kZSBzbyB0aGF0IHdlIGNhbiBkaXN0aW5ndWlzaAorICAgICAgICAjICAgMyA8IHggPCA1ICAgZnJvbSAgICAoMyA8IHgpIDwgNQorICAgICAgICAjIHRoZSB0d28gaGF2ZSB2ZXJ5IGRpZmZlcmVudCBzZW1hbnRpY3MgYW5kIHJlc3VsdHMgKG5vdGUgdGhhdCB0aGUKKyAgICAgICAgIyBsYXR0ZXIgZm9ybSBpcyBhbHdheXMgdHJ1ZSkKKworICAgICAgICByZXR1cm4gQ29tcGFyZShub2RlLCByZXN1bHRzLCBsaW5lbm89bGluZW5vKQorCisgICAgZGVmIGV4cHIoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIHhvcl9leHByICgnfCcgeG9yX2V4cHIpKgorICAgICAgICByZXR1cm4gc2VsZi5jb21fYmluYXJ5KEJpdG9yLCBub2RlbGlzdCkKKworICAgIGRlZiB4b3JfZXhwcihzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgeG9yX2V4cHIgKCdeJyB4b3JfZXhwcikqCisgICAgICAgIHJldHVybiBzZWxmLmNvbV9iaW5hcnkoQml0eG9yLCBub2RlbGlzdCkKKworICAgIGRlZiBhbmRfZXhwcihzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgeG9yX2V4cHIgKCcmJyB4b3JfZXhwcikqCisgICAgICAgIHJldHVybiBzZWxmLmNvbV9iaW5hcnkoQml0YW5kLCBub2RlbGlzdCkKKworICAgIGRlZiBzaGlmdF9leHByKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBzaGlmdF9leHByICgnPDwnfCc+Picgc2hpZnRfZXhwcikqCisgICAgICAgIG5vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzBdKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCBsZW4obm9kZWxpc3QpLCAyKToKKyAgICAgICAgICAgIHJpZ2h0ID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpXSkKKyAgICAgICAgICAgIGlmIG5vZGVsaXN0W2ktMV1bMF0gPT0gdG9rZW4uTEVGVFNISUZUOgorICAgICAgICAgICAgICAgIG5vZGUgPSBMZWZ0U2hpZnQoW25vZGUsIHJpZ2h0XSwgbGluZW5vPW5vZGVsaXN0WzFdWzJdKQorICAgICAgICAgICAgZWxpZiBub2RlbGlzdFtpLTFdWzBdID09IHRva2VuLlJJR0hUU0hJRlQ6CisgICAgICAgICAgICAgICAgbm9kZSA9IFJpZ2h0U2hpZnQoW25vZGUsIHJpZ2h0XSwgbGluZW5vPW5vZGVsaXN0WzFdWzJdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidW5leHBlY3RlZCB0b2tlbjogJXMiICUgbm9kZWxpc3RbaS0xXVswXQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIGFyaXRoX2V4cHIoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICBub2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFswXSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMiwgbGVuKG5vZGVsaXN0KSwgMik6CisgICAgICAgICAgICByaWdodCA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbaV0pCisgICAgICAgICAgICBpZiBub2RlbGlzdFtpLTFdWzBdID09IHRva2VuLlBMVVM6CisgICAgICAgICAgICAgICAgbm9kZSA9IEFkZChbbm9kZSwgcmlnaHRdLCBsaW5lbm89bm9kZWxpc3RbMV1bMl0pCisgICAgICAgICAgICBlbGlmIG5vZGVsaXN0W2ktMV1bMF0gPT0gdG9rZW4uTUlOVVM6CisgICAgICAgICAgICAgICAgbm9kZSA9IFN1Yihbbm9kZSwgcmlnaHRdLCBsaW5lbm89bm9kZWxpc3RbMV1bMl0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bmV4cGVjdGVkIHRva2VuOiAlcyIgJSBub2RlbGlzdFtpLTFdWzBdCisgICAgICAgIHJldHVybiBub2RlCisKKyAgICBkZWYgdGVybShzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIG5vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzBdKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCBsZW4obm9kZWxpc3QpLCAyKToKKyAgICAgICAgICAgIHJpZ2h0ID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpXSkKKyAgICAgICAgICAgIHQgPSBub2RlbGlzdFtpLTFdWzBdCisgICAgICAgICAgICBpZiB0ID09IHRva2VuLlNUQVI6CisgICAgICAgICAgICAgICAgbm9kZSA9IE11bChbbm9kZSwgcmlnaHRdKQorICAgICAgICAgICAgZWxpZiB0ID09IHRva2VuLlNMQVNIOgorICAgICAgICAgICAgICAgIG5vZGUgPSBEaXYoW25vZGUsIHJpZ2h0XSkKKyAgICAgICAgICAgIGVsaWYgdCA9PSB0b2tlbi5QRVJDRU5UOgorICAgICAgICAgICAgICAgIG5vZGUgPSBNb2QoW25vZGUsIHJpZ2h0XSkKKyAgICAgICAgICAgIGVsaWYgdCA9PSB0b2tlbi5ET1VCTEVTTEFTSDoKKyAgICAgICAgICAgICAgICBub2RlID0gRmxvb3JEaXYoW25vZGUsIHJpZ2h0XSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVuZXhwZWN0ZWQgdG9rZW46ICVzIiAlIHQKKyAgICAgICAgICAgIG5vZGUubGluZW5vID0gbm9kZWxpc3RbMV1bMl0KKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiBmYWN0b3Ioc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICBlbHQgPSBub2RlbGlzdFswXQorICAgICAgICB0ID0gZWx0WzBdCisgICAgICAgIG5vZGUgPSBzZWxmLmxvb2t1cF9ub2RlKG5vZGVsaXN0Wy0xXSkobm9kZWxpc3RbLTFdWzE6XSkKKyAgICAgICAgIyBuZWVkIHRvIGhhbmRsZSAodW5hcnkgb3ApY29uc3RhbnQgaGVyZS4uLgorICAgICAgICBpZiB0ID09IHRva2VuLlBMVVM6CisgICAgICAgICAgICByZXR1cm4gVW5hcnlBZGQobm9kZSwgbGluZW5vPWVsdFsyXSkKKyAgICAgICAgZWxpZiB0ID09IHRva2VuLk1JTlVTOgorICAgICAgICAgICAgcmV0dXJuIFVuYXJ5U3ViKG5vZGUsIGxpbmVubz1lbHRbMl0pCisgICAgICAgIGVsaWYgdCA9PSB0b2tlbi5USUxERToKKyAgICAgICAgICAgIG5vZGUgPSBJbnZlcnQobm9kZSwgbGluZW5vPWVsdFsyXSkKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiBwb3dlcihzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgcG93ZXI6IGF0b20gdHJhaWxlciogKCcqKicgZmFjdG9yKSoKKyAgICAgICAgbm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMF0pCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihub2RlbGlzdCkpOgorICAgICAgICAgICAgZWx0ID0gbm9kZWxpc3RbaV0KKyAgICAgICAgICAgIGlmIGVsdFswXSA9PSB0b2tlbi5ET1VCTEVTVEFSOgorICAgICAgICAgICAgICAgIHJldHVybiBQb3dlcihbbm9kZSwgc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzFdKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubz1lbHRbMl0pCisKKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLmNvbV9hcHBseV90cmFpbGVyKG5vZGUsIGVsdCkKKworICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIGF0b20oc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXRvbV9kaXNwYXRjaFtub2RlbGlzdFswXVswXV0obm9kZWxpc3QpCisKKyAgICBkZWYgYXRvbV9scGFyKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgaWYgbm9kZWxpc3RbMV1bMF0gPT0gdG9rZW4uUlBBUjoKKyAgICAgICAgICAgIHJldHVybiBUdXBsZSgoKSwgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorICAgICAgICByZXR1cm4gc2VsZi5jb21fbm9kZShub2RlbGlzdFsxXSkKKworICAgIGRlZiBhdG9tX2xzcWIoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICBpZiBub2RlbGlzdFsxXVswXSA9PSB0b2tlbi5SU1FCOgorICAgICAgICAgICAgcmV0dXJuIExpc3QoKCksIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tX2xpc3RfY29uc3RydWN0b3Iobm9kZWxpc3RbMV0pCisKKyAgICBkZWYgYXRvbV9sYnJhY2Uoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICBpZiBub2RlbGlzdFsxXVswXSA9PSB0b2tlbi5SQlJBQ0U6CisgICAgICAgICAgICByZXR1cm4gRGljdCgoKSwgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorICAgICAgICByZXR1cm4gc2VsZi5jb21fZGljdG9yc2V0bWFrZXIobm9kZWxpc3RbMV0pCisKKyAgICBkZWYgYXRvbV9iYWNrcXVvdGUoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByZXR1cm4gQmFja3F1b3RlKHNlbGYuY29tX25vZGUobm9kZWxpc3RbMV0pKQorCisgICAgZGVmIGF0b21fbnVtYmVyKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyMjIG5lZWQgdG8gdmVyaWZ5IHRoaXMgbWF0Y2hlcyBjb21waWxlLmMKKyAgICAgICAgayA9IGV2YWwobm9kZWxpc3RbMF1bMV0pCisgICAgICAgIHJldHVybiBDb25zdChrLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgZGVjb2RlX2xpdGVyYWwoc2VsZiwgbGl0KToKKyAgICAgICAgaWYgc2VsZi5lbmNvZGluZzoKKyAgICAgICAgICAgICMgdGhpcyBpcyBwYXJ0aWN1bGFybHkgZnJhZ2lsZSAmIGEgYml0IG9mIGEKKyAgICAgICAgICAgICMgaGFjay4uLiBjaGFuZ2VzIGluIGNvbXBpbGUuYzpwYXJzZXN0ciBhbmQKKyAgICAgICAgICAgICMgdG9rZW5pemVyLmMgbXVzdCBiZSByZWZsZWN0ZWQgaGVyZS4KKyAgICAgICAgICAgIGlmIHNlbGYuZW5jb2Rpbmcgbm90IGluIFsndXRmLTgnLCAnaXNvLTg4NTktMSddOgorICAgICAgICAgICAgICAgIGxpdCA9IHVuaWNvZGUobGl0LCAndXRmLTgnKS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgIHJldHVybiBldmFsKCIjIGNvZGluZzogJXNcbiVzIiAlIChzZWxmLmVuY29kaW5nLCBsaXQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGV2YWwobGl0KQorCisgICAgZGVmIGF0b21fc3RyaW5nKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgayA9ICcnCisgICAgICAgIGZvciBub2RlIGluIG5vZGVsaXN0OgorICAgICAgICAgICAgayArPSBzZWxmLmRlY29kZV9saXRlcmFsKG5vZGVbMV0pCisgICAgICAgIHJldHVybiBDb25zdChrLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgYXRvbV9uYW1lKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgcmV0dXJuIE5hbWUobm9kZWxpc3RbMF1bMV0sIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjCisgICAgIyBJTlRFUk5BTCBQQVJTSU5HIFVUSUxJVElFUworICAgICMKKworICAgICMgVGhlIHVzZSBvZiBjb21fbm9kZSgpIGludHJvZHVjZXMgYSBsb3Qgb2YgZXh0cmEgc3RhY2sgZnJhbWVzLAorICAgICMgZW5vdWdoIHRvIGNhdXNlIGEgc3RhY2sgb3ZlcmZsb3cgY29tcGlsaW5nIHRlc3QudGVzdF9wYXJzZXIgd2l0aAorICAgICMgdGhlIHN0YW5kYXJkIGludGVycHJldGVyIHJlY3Vyc2lvbmxpbWl0LiAgVGhlIGNvbV9ub2RlKCkgaXMgYQorICAgICMgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBoaWRlcyB0aGUgZGlzcGF0Y2ggZGV0YWlscywgYnV0IGNvbWVzCisgICAgIyBhdCBhIHZlcnkgaGlnaCBjb3N0LiAgSXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gZGlzcGF0Y2ggZGlyZWN0bHkKKyAgICAjIGluIHRoZSBjYWxsZXJzLiAgSW4gdGhlc2UgY2FzZXMsIHVzZSBsb29rdXBfbm9kZSgpIGFuZCBjYWxsIHRoZQorICAgICMgZGlzcGF0Y2hlZCBub2RlIGRpcmVjdGx5LgorCisgICAgZGVmIGxvb2t1cF9ub2RlKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5fZGlzcGF0Y2hbbm9kZVswXV0KKworICAgIGRlZiBjb21fbm9kZShzZWxmLCBub2RlKToKKyAgICAgICAgIyBOb3RlOiBjb21waWxlLmMgaGFzIGhhbmRsaW5nIGluIGNvbV9ub2RlIGZvciBkZWxfc3RtdCwgcGFzc19zdG10LAorICAgICAgICAjICAgICAgIGJyZWFrX3N0bXQsIHN0bXQsIHNtYWxsX3N0bXQsIGZsb3dfc3RtdCwgc2ltcGxlX3N0bXQsCisgICAgICAgICMgICAgICAgYW5kIGNvbXBvdW5kX3N0bXQuCisgICAgICAgICMgICAgICAgV2UnbGwganVzdCBkaXNwYXRjaCB0aGVtLgorICAgICAgICByZXR1cm4gc2VsZi5fZGlzcGF0Y2hbbm9kZVswXV0obm9kZVsxOl0pCisKKyAgICBkZWYgY29tX05FV0xJTkUoc2VsZiwgKmFyZ3MpOgorICAgICAgICAjIEEgJzsnIGF0IHRoZSBlbmQgb2YgYSBsaW5lIGNhbiBtYWtlIGEgTkVXTElORSB0b2tlbiBhcHBlYXIKKyAgICAgICAgIyBoZXJlLCBSZW5kZXIgaXQgaGFybWxlc3MuIChnZW5jIGRpc2NhcmRzICgnZGlzY2FyZCcsCisgICAgICAgICMgKCdjb25zdCcsIHh4eHgpKSBOb2RlcykKKyAgICAgICAgcmV0dXJuIERpc2NhcmQoQ29uc3QoTm9uZSkpCisKKyAgICBkZWYgY29tX2FyZ2xpc3Qoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIHZhcmFyZ3NsaXN0OgorICAgICAgICAjICAgICAoZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKiAoJyonIE5BTUUgWycsJyAnKionIE5BTUVdIHwgJyoqJyBOQU1FKQorICAgICAgICAjICAgfCBmcGRlZiBbJz0nIHRlc3RdICgnLCcgZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddCisgICAgICAgICMgZnBkZWY6IE5BTUUgfCAnKCcgZnBsaXN0ICcpJworICAgICAgICAjIGZwbGlzdDogZnBkZWYgKCcsJyBmcGRlZikqIFsnLCddCisgICAgICAgIG5hbWVzID0gW10KKyAgICAgICAgZGVmYXVsdHMgPSBbXQorICAgICAgICBmbGFncyA9IDAKKworICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSBpIDwgbGVuKG5vZGVsaXN0KToKKyAgICAgICAgICAgIG5vZGUgPSBub2RlbGlzdFtpXQorICAgICAgICAgICAgaWYgbm9kZVswXSA9PSB0b2tlbi5TVEFSIG9yIG5vZGVbMF0gPT0gdG9rZW4uRE9VQkxFU1RBUjoKKyAgICAgICAgICAgICAgICBpZiBub2RlWzBdID09IHRva2VuLlNUQVI6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlbGlzdFtpKzFdCisgICAgICAgICAgICAgICAgICAgIGlmIG5vZGVbMF0gPT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFwcGVuZChub2RlWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBmbGFncyB8IENPX1ZBUkFSR1MKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMworCisgICAgICAgICAgICAgICAgaWYgaSA8IGxlbihub2RlbGlzdCk6CisgICAgICAgICAgICAgICAgICAgICMgc2hvdWxkIGJlIERPVUJMRVNUQVIKKyAgICAgICAgICAgICAgICAgICAgdCA9IG5vZGVsaXN0W2ldWzBdCisgICAgICAgICAgICAgICAgICAgIGlmIHQgPT0gdG9rZW4uRE9VQkxFU1RBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlbGlzdFtpKzFdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidW5leHBlY3RlZCB0b2tlbjogJXMiICUgdAorICAgICAgICAgICAgICAgICAgICBuYW1lcy5hcHBlbmQobm9kZVsxXSkKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBmbGFncyB8IENPX1ZBUktFWVdPUkRTCisKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAjIGZwZGVmOiBOQU1FIHwgJygnIGZwbGlzdCAnKScKKyAgICAgICAgICAgIG5hbWVzLmFwcGVuZChzZWxmLmNvbV9mcGRlZihub2RlKSkKKworICAgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgICAgICBpZiBpIDwgbGVuKG5vZGVsaXN0KSBhbmQgbm9kZWxpc3RbaV1bMF0gPT0gdG9rZW4uRVFVQUw6CisgICAgICAgICAgICAgICAgZGVmYXVsdHMuYXBwZW5kKHNlbGYuY29tX25vZGUobm9kZWxpc3RbaSArIDFdKSkKKyAgICAgICAgICAgICAgICBpID0gaSArIDIKKyAgICAgICAgICAgIGVsaWYgbGVuKGRlZmF1bHRzKToKKyAgICAgICAgICAgICAgICAjIHdlIGhhdmUgYWxyZWFkeSBzZWVuIGFuIGFyZ3VtZW50IHdpdGggZGVmYXVsdCwgYnV0IGhlcmUKKyAgICAgICAgICAgICAgICAjIGNhbWUgb25lIHdpdGhvdXQKKyAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgIm5vbi1kZWZhdWx0IGFyZ3VtZW50IGZvbGxvd3MgZGVmYXVsdCBhcmd1bWVudCIKKworICAgICAgICAgICAgIyBza2lwIHRoZSBjb21tYQorICAgICAgICAgICAgaSA9IGkgKyAxCisKKyAgICAgICAgcmV0dXJuIG5hbWVzLCBkZWZhdWx0cywgZmxhZ3MKKworICAgIGRlZiBjb21fZnBkZWYoc2VsZiwgbm9kZSk6CisgICAgICAgICMgZnBkZWY6IE5BTUUgfCAnKCcgZnBsaXN0ICcpJworICAgICAgICBpZiBub2RlWzFdWzBdID09IHRva2VuLkxQQVI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fZnBsaXN0KG5vZGVbMl0pCisgICAgICAgIHJldHVybiBub2RlWzFdWzFdCisKKyAgICBkZWYgY29tX2ZwbGlzdChzZWxmLCBub2RlKToKKyAgICAgICAgIyBmcGxpc3Q6IGZwZGVmICgnLCcgZnBkZWYpKiBbJywnXQorICAgICAgICBpZiBsZW4obm9kZSkgPT0gMjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbV9mcGRlZihub2RlWzFdKQorICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKG5vZGUpLCAyKToKKyAgICAgICAgICAgIGxpc3QuYXBwZW5kKHNlbGYuY29tX2ZwZGVmKG5vZGVbaV0pKQorICAgICAgICByZXR1cm4gdHVwbGUobGlzdCkKKworICAgIGRlZiBjb21fZG90dGVkX25hbWUoc2VsZiwgbm9kZSk6CisgICAgICAgICMgU3RyaW5nIHRvZ2V0aGVyIHRoZSBkb3R0ZWQgbmFtZXMgYW5kIHJldHVybiB0aGUgc3RyaW5nCisgICAgICAgIG5hbWUgPSAiIgorICAgICAgICBmb3IgbiBpbiBub2RlOgorICAgICAgICAgICAgaWYgdHlwZShuKSA9PSB0eXBlKCgpKSBhbmQgblswXSA9PSAxOgorICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgblsxXSArICcuJworICAgICAgICByZXR1cm4gbmFtZVs6LTFdCisKKyAgICBkZWYgY29tX2RvdHRlZF9hc19uYW1lKHNlbGYsIG5vZGUpOgorICAgICAgICBhc3NlcnQgbm9kZVswXSA9PSBzeW1ib2wuZG90dGVkX2FzX25hbWUKKyAgICAgICAgbm9kZSA9IG5vZGVbMTpdCisgICAgICAgIGRvdCA9IHNlbGYuY29tX2RvdHRlZF9uYW1lKG5vZGVbMF1bMTpdKQorICAgICAgICBpZiBsZW4obm9kZSkgPT0gMToKKyAgICAgICAgICAgIHJldHVybiBkb3QsIE5vbmUKKyAgICAgICAgYXNzZXJ0IG5vZGVbMV1bMV0gPT0gJ2FzJworICAgICAgICBhc3NlcnQgbm9kZVsyXVswXSA9PSB0b2tlbi5OQU1FCisgICAgICAgIHJldHVybiBkb3QsIG5vZGVbMl1bMV0KKworICAgIGRlZiBjb21fZG90dGVkX2FzX25hbWVzKHNlbGYsIG5vZGUpOgorICAgICAgICBhc3NlcnQgbm9kZVswXSA9PSBzeW1ib2wuZG90dGVkX2FzX25hbWVzCisgICAgICAgIG5vZGUgPSBub2RlWzE6XQorICAgICAgICBuYW1lcyA9IFtzZWxmLmNvbV9kb3R0ZWRfYXNfbmFtZShub2RlWzBdKV0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMiwgbGVuKG5vZGUpLCAyKToKKyAgICAgICAgICAgIG5hbWVzLmFwcGVuZChzZWxmLmNvbV9kb3R0ZWRfYXNfbmFtZShub2RlW2ldKSkKKyAgICAgICAgcmV0dXJuIG5hbWVzCisKKyAgICBkZWYgY29tX2ltcG9ydF9hc19uYW1lKHNlbGYsIG5vZGUpOgorICAgICAgICBhc3NlcnQgbm9kZVswXSA9PSBzeW1ib2wuaW1wb3J0X2FzX25hbWUKKyAgICAgICAgbm9kZSA9IG5vZGVbMTpdCisgICAgICAgIGFzc2VydCBub2RlWzBdWzBdID09IHRva2VuLk5BTUUKKyAgICAgICAgaWYgbGVuKG5vZGUpID09IDE6CisgICAgICAgICAgICByZXR1cm4gbm9kZVswXVsxXSwgTm9uZQorICAgICAgICBhc3NlcnQgbm9kZVsxXVsxXSA9PSAnYXMnLCBub2RlCisgICAgICAgIGFzc2VydCBub2RlWzJdWzBdID09IHRva2VuLk5BTUUKKyAgICAgICAgcmV0dXJuIG5vZGVbMF1bMV0sIG5vZGVbMl1bMV0KKworICAgIGRlZiBjb21faW1wb3J0X2FzX25hbWVzKHNlbGYsIG5vZGUpOgorICAgICAgICBhc3NlcnQgbm9kZVswXSA9PSBzeW1ib2wuaW1wb3J0X2FzX25hbWVzCisgICAgICAgIG5vZGUgPSBub2RlWzE6XQorICAgICAgICBuYW1lcyA9IFtzZWxmLmNvbV9pbXBvcnRfYXNfbmFtZShub2RlWzBdKV0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMiwgbGVuKG5vZGUpLCAyKToKKyAgICAgICAgICAgIG5hbWVzLmFwcGVuZChzZWxmLmNvbV9pbXBvcnRfYXNfbmFtZShub2RlW2ldKSkKKyAgICAgICAgcmV0dXJuIG5hbWVzCisKKyAgICBkZWYgY29tX2Jhc2VzKHNlbGYsIG5vZGUpOgorICAgICAgICBiYXNlcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihub2RlKSwgMik6CisgICAgICAgICAgICBiYXNlcy5hcHBlbmQoc2VsZi5jb21fbm9kZShub2RlW2ldKSkKKyAgICAgICAgcmV0dXJuIGJhc2VzCisKKyAgICBkZWYgY29tX3RyeV9leGNlcHRfZmluYWxseShzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgKCd0cnknICc6JyBzdWl0ZQorICAgICAgICAjICAoKGV4Y2VwdF9jbGF1c2UgJzonIHN1aXRlKSsgWydlbHNlJyAnOicgc3VpdGVdIFsnZmluYWxseScgJzonIHN1aXRlXQorICAgICAgICAjICAgfCAnZmluYWxseScgJzonIHN1aXRlKSkKKworICAgICAgICBpZiBub2RlbGlzdFszXVswXSA9PSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgIyBmaXJzdCBjbGF1c2UgaXMgYSBmaW5hbGx5IGNsYXVzZTogb25seSB0cnktZmluYWxseQorICAgICAgICAgICAgcmV0dXJuIFRyeUZpbmFsbHkoc2VsZi5jb21fbm9kZShub2RlbGlzdFsyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKworICAgICAgICAjdHJ5ZXhjZXB0OiAgW1RyeU5vZGUsIFtleGNlcHRfY2xhdXNlc10sIGVsc2VOb2RlKV0KKyAgICAgICAgY2xhdXNlcyA9IFtdCisgICAgICAgIGVsc2VOb2RlID0gTm9uZQorICAgICAgICBmaW5hbGx5Tm9kZSA9IE5vbmUKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMywgbGVuKG5vZGVsaXN0KSwgMyk6CisgICAgICAgICAgICBub2RlID0gbm9kZWxpc3RbaV0KKyAgICAgICAgICAgIGlmIG5vZGVbMF0gPT0gc3ltYm9sLmV4Y2VwdF9jbGF1c2U6CisgICAgICAgICAgICAgICAgIyBleGNlcHRfY2xhdXNlOiAnZXhjZXB0JyBbZXhwciBbKCcsJyB8ICdhcycpIGV4cHJdXSAqLworICAgICAgICAgICAgICAgIGlmIGxlbihub2RlKSA+IDI6CisgICAgICAgICAgICAgICAgICAgIGV4cHIxID0gc2VsZi5jb21fbm9kZShub2RlWzJdKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4obm9kZSkgPiA0OgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwcjIgPSBzZWxmLmNvbV9hc3NpZ24obm9kZVs0XSwgT1BfQVNTSUdOKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwcjIgPSBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZXhwcjEgPSBleHByMiA9IE5vbmUKKyAgICAgICAgICAgICAgICBjbGF1c2VzLmFwcGVuZCgoZXhwcjEsIGV4cHIyLCBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2krMl0pKSkKKworICAgICAgICAgICAgaWYgbm9kZVswXSA9PSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgICAgIGlmIG5vZGVbMV0gPT0gJ2Vsc2UnOgorICAgICAgICAgICAgICAgICAgICBlbHNlTm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbaSsyXSkKKyAgICAgICAgICAgICAgICBlbGlmIG5vZGVbMV0gPT0gJ2ZpbmFsbHknOgorICAgICAgICAgICAgICAgICAgICBmaW5hbGx5Tm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbaSsyXSkKKyAgICAgICAgdHJ5X2V4Y2VwdCA9IFRyeUV4Y2VwdChzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzJdKSwgY2xhdXNlcywgZWxzZU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorICAgICAgICBpZiBmaW5hbGx5Tm9kZToKKyAgICAgICAgICAgIHJldHVybiBUcnlGaW5hbGx5KHRyeV9leGNlcHQsIGZpbmFsbHlOb2RlLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gdHJ5X2V4Y2VwdAorCisgICAgZGVmIGNvbV93aXRoKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyB3aXRoX3N0bXQ6ICd3aXRoJyB3aXRoX2l0ZW0gKCcsJyB3aXRoX2l0ZW0pKiAnOicgc3VpdGUKKyAgICAgICAgYm9keSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbLTFdKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obm9kZWxpc3QpIC0gMywgMCwgLTIpOgorICAgICAgICAgICAgcmV0ID0gc2VsZi5jb21fd2l0aF9pdGVtKG5vZGVsaXN0W2ldLCBib2R5LCBub2RlbGlzdFswXVsyXSkKKyAgICAgICAgICAgIGlmIGkgPT0gMToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0CisgICAgICAgICAgICBib2R5ID0gcmV0CisKKyAgICBkZWYgY29tX3dpdGhfaXRlbShzZWxmLCBub2RlbGlzdCwgYm9keSwgbGluZW5vKToKKyAgICAgICAgIyB3aXRoX2l0ZW06IHRlc3QgWydhcycgZXhwcl0KKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA9PSA0OgorICAgICAgICAgICAgdmFyID0gc2VsZi5jb21fYXNzaWduKG5vZGVsaXN0WzNdLCBPUF9BU1NJR04pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YXIgPSBOb25lCisgICAgICAgIGV4cHIgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzFdKQorICAgICAgICByZXR1cm4gV2l0aChleHByLCB2YXIsIGJvZHksIGxpbmVubz1saW5lbm8pCisKKyAgICBkZWYgY29tX2F1Z2Fzc2lnbl9vcChzZWxmLCBub2RlKToKKyAgICAgICAgYXNzZXJ0IG5vZGVbMF0gPT0gc3ltYm9sLmF1Z2Fzc2lnbgorICAgICAgICByZXR1cm4gbm9kZVsxXQorCisgICAgZGVmIGNvbV9hdWdhc3NpZ24oc2VsZiwgbm9kZSk6CisgICAgICAgICIiIlJldHVybiBub2RlIHN1aXRhYmxlIGZvciBsdmFsdWUgb2YgYXVnbWVudGVkIGFzc2lnbm1lbnQKKworICAgICAgICBOYW1lcywgc2xpY2VzLCBhbmQgYXR0cmlidXRlcyBhcmUgdGhlIG9ubHkgYWxsb3dhYmxlIG5vZGVzLgorICAgICAgICAiIiIKKyAgICAgICAgbCA9IHNlbGYuY29tX25vZGUobm9kZSkKKyAgICAgICAgaWYgbC5fX2NsYXNzX18gaW4gKE5hbWUsIFNsaWNlLCBTdWJzY3JpcHQsIEdldGF0dHIpOgorICAgICAgICAgICAgcmV0dXJuIGwKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICJjYW4ndCBhc3NpZ24gdG8gJXMiICUgbC5fX2NsYXNzX18uX19uYW1lX18KKworICAgIGRlZiBjb21fYXNzaWduKHNlbGYsIG5vZGUsIGFzc2lnbmluZyk6CisgICAgICAgICMgcmV0dXJuIGEgbm9kZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGFuICJsdmFsdWUiCisgICAgICAgICMgbG9vcCB0byBhdm9pZCB0cml2aWFsIHJlY3Vyc2lvbgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdCA9IG5vZGVbMF0KKyAgICAgICAgICAgIGlmIHQgaW4gKHN5bWJvbC5leHBybGlzdCwgc3ltYm9sLnRlc3RsaXN0LCBzeW1ib2wudGVzdGxpc3Rfc2FmZSwgc3ltYm9sLnRlc3RsaXN0X2NvbXApOgorICAgICAgICAgICAgICAgIGlmIGxlbihub2RlKSA+IDI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbV9hc3NpZ25fdHVwbGUobm9kZSwgYXNzaWduaW5nKQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlWzFdCisgICAgICAgICAgICBlbGlmIHQgaW4gX2Fzc2lnbl90eXBlczoKKyAgICAgICAgICAgICAgICBpZiBsZW4obm9kZSkgPiAyOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgImNhbid0IGFzc2lnbiB0byBvcGVyYXRvciIKKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZVsxXQorICAgICAgICAgICAgZWxpZiB0ID09IHN5bWJvbC5wb3dlcjoKKyAgICAgICAgICAgICAgICBpZiBub2RlWzFdWzBdICE9IHN5bWJvbC5hdG9tOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgImNhbid0IGFzc2lnbiB0byBvcGVyYXRvciIKKyAgICAgICAgICAgICAgICBpZiBsZW4obm9kZSkgPiAyOgorICAgICAgICAgICAgICAgICAgICBwcmltYXJ5ID0gc2VsZi5jb21fbm9kZShub2RlWzFdKQorICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCBsZW4obm9kZSktMSk6CisgICAgICAgICAgICAgICAgICAgICAgICBjaCA9IG5vZGVbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoWzBdID09IHRva2VuLkRPVUJMRVNUQVI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICJjYW4ndCBhc3NpZ24gdG8gb3BlcmF0b3IiCisgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5ID0gc2VsZi5jb21fYXBwbHlfdHJhaWxlcihwcmltYXJ5LCBjaCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX2Fzc2lnbl90cmFpbGVyKHByaW1hcnksIG5vZGVbLTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduaW5nKQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlWzFdCisgICAgICAgICAgICBlbGlmIHQgPT0gc3ltYm9sLmF0b206CisgICAgICAgICAgICAgICAgdCA9IG5vZGVbMV1bMF0KKyAgICAgICAgICAgICAgICBpZiB0ID09IHRva2VuLkxQQVI6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlWzJdCisgICAgICAgICAgICAgICAgICAgIGlmIG5vZGVbMF0gPT0gdG9rZW4uUlBBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiY2FuJ3QgYXNzaWduIHRvICgpIgorICAgICAgICAgICAgICAgIGVsaWYgdCA9PSB0b2tlbi5MU1FCOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZVsyXQorICAgICAgICAgICAgICAgICAgICBpZiBub2RlWzBdID09IHRva2VuLlJTUUI6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgImNhbid0IGFzc2lnbiB0byBbXSIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX2Fzc2lnbl9saXN0KG5vZGUsIGFzc2lnbmluZykKKyAgICAgICAgICAgICAgICBlbGlmIHQgPT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX2Fzc2lnbl9uYW1lKG5vZGVbMV0sIGFzc2lnbmluZykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgImNhbid0IGFzc2lnbiB0byBsaXRlcmFsIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgImJhZCBhc3NpZ25tZW50ICglcykiICUgdAorCisgICAgZGVmIGNvbV9hc3NpZ25fdHVwbGUoc2VsZiwgbm9kZSwgYXNzaWduaW5nKToKKyAgICAgICAgYXNzaWducyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihub2RlKSwgMik6CisgICAgICAgICAgICBhc3NpZ25zLmFwcGVuZChzZWxmLmNvbV9hc3NpZ24obm9kZVtpXSwgYXNzaWduaW5nKSkKKyAgICAgICAgcmV0dXJuIEFzc1R1cGxlKGFzc2lnbnMsIGxpbmVubz1leHRyYWN0TGluZU5vKG5vZGUpKQorCisgICAgZGVmIGNvbV9hc3NpZ25fbGlzdChzZWxmLCBub2RlLCBhc3NpZ25pbmcpOgorICAgICAgICBhc3NpZ25zID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKG5vZGUpLCAyKToKKyAgICAgICAgICAgIGlmIGkgKyAxIDwgbGVuKG5vZGUpOgorICAgICAgICAgICAgICAgIGlmIG5vZGVbaSArIDFdWzBdID09IHN5bWJvbC5saXN0X2ZvcjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICJjYW4ndCBhc3NpZ24gdG8gbGlzdCBjb21wcmVoZW5zaW9uIgorICAgICAgICAgICAgICAgIGFzc2VydCBub2RlW2kgKyAxXVswXSA9PSB0b2tlbi5DT01NQSwgbm9kZVtpICsgMV0KKyAgICAgICAgICAgIGFzc2lnbnMuYXBwZW5kKHNlbGYuY29tX2Fzc2lnbihub2RlW2ldLCBhc3NpZ25pbmcpKQorICAgICAgICByZXR1cm4gQXNzTGlzdChhc3NpZ25zLCBsaW5lbm89ZXh0cmFjdExpbmVObyhub2RlKSkKKworICAgIGRlZiBjb21fYXNzaWduX25hbWUoc2VsZiwgbm9kZSwgYXNzaWduaW5nKToKKyAgICAgICAgcmV0dXJuIEFzc05hbWUobm9kZVsxXSwgYXNzaWduaW5nLCBsaW5lbm89bm9kZVsyXSkKKworICAgIGRlZiBjb21fYXNzaWduX3RyYWlsZXIoc2VsZiwgcHJpbWFyeSwgbm9kZSwgYXNzaWduaW5nKToKKyAgICAgICAgdCA9IG5vZGVbMV1bMF0KKyAgICAgICAgaWYgdCA9PSB0b2tlbi5ET1Q6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fYXNzaWduX2F0dHIocHJpbWFyeSwgbm9kZVsyXSwgYXNzaWduaW5nKQorICAgICAgICBpZiB0ID09IHRva2VuLkxTUUI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fc3Vic2NyaXB0bGlzdChwcmltYXJ5LCBub2RlWzJdLCBhc3NpZ25pbmcpCisgICAgICAgIGlmIHQgPT0gdG9rZW4uTFBBUjoKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiY2FuJ3QgYXNzaWduIHRvIGZ1bmN0aW9uIGNhbGwiCisgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAidW5rbm93biB0cmFpbGVyIHR5cGU6ICVzIiAlIHQKKworICAgIGRlZiBjb21fYXNzaWduX2F0dHIoc2VsZiwgcHJpbWFyeSwgbm9kZSwgYXNzaWduaW5nKToKKyAgICAgICAgcmV0dXJuIEFzc0F0dHIocHJpbWFyeSwgbm9kZVsxXSwgYXNzaWduaW5nLCBsaW5lbm89bm9kZVstMV0pCisKKyAgICBkZWYgY29tX2JpbmFyeShzZWxmLCBjb25zdHJ1Y3Rvciwgbm9kZWxpc3QpOgorICAgICAgICAiQ29tcGlsZSAnTk9ERSAoT1AgTk9ERSkqJyBpbnRvICh0eXBlLCBbIG5vZGUxLCAuLi4sIG5vZGVOIF0pLiIKKyAgICAgICAgbCA9IGxlbihub2RlbGlzdCkKKyAgICAgICAgaWYgbCA9PSAxOgorICAgICAgICAgICAgbiA9IG5vZGVsaXN0WzBdCisgICAgICAgICAgICByZXR1cm4gc2VsZi5sb29rdXBfbm9kZShuKShuWzE6XSkKKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsLCAyKToKKyAgICAgICAgICAgIG4gPSBub2RlbGlzdFtpXQorICAgICAgICAgICAgaXRlbXMuYXBwZW5kKHNlbGYubG9va3VwX25vZGUobikoblsxOl0pKQorICAgICAgICByZXR1cm4gY29uc3RydWN0b3IoaXRlbXMsIGxpbmVubz1leHRyYWN0TGluZU5vKG5vZGVsaXN0KSkKKworICAgIGRlZiBjb21fc3RtdChzZWxmLCBub2RlKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5sb29rdXBfbm9kZShub2RlKShub2RlWzE6XSkKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCBpcyBub3QgTm9uZQorICAgICAgICBpZiBpc2luc3RhbmNlKHJlc3VsdCwgU3RtdCk6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHJldHVybiBTdG10KFtyZXN1bHRdKQorCisgICAgZGVmIGNvbV9hcHBlbmRfc3RtdChzZWxmLCBzdG10cywgbm9kZSk6CisgICAgICAgIHJlc3VsdCA9IHNlbGYubG9va3VwX25vZGUobm9kZSkobm9kZVsxOl0pCisgICAgICAgIGFzc2VydCByZXN1bHQgaXMgbm90IE5vbmUKKyAgICAgICAgaWYgaXNpbnN0YW5jZShyZXN1bHQsIFN0bXQpOgorICAgICAgICAgICAgc3RtdHMuZXh0ZW5kKHJlc3VsdC5ub2RlcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0bXRzLmFwcGVuZChyZXN1bHQpCisKKyAgICBkZWYgY29tX2xpc3RfY29uc3RydWN0b3Ioc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGxpc3RtYWtlcjogdGVzdCAoIGxpc3RfZm9yIHwgKCcsJyB0ZXN0KSogWycsJ10gKQorICAgICAgICB2YWx1ZXMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obm9kZWxpc3QpKToKKyAgICAgICAgICAgIGlmIG5vZGVsaXN0W2ldWzBdID09IHN5bWJvbC5saXN0X2ZvcjoKKyAgICAgICAgICAgICAgICBhc3NlcnQgbGVuKG5vZGVsaXN0W2k6XSkgPT0gMQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbV9saXN0X2NvbXByZWhlbnNpb24odmFsdWVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZWxpc3RbaV0pCisgICAgICAgICAgICBlbGlmIG5vZGVsaXN0W2ldWzBdID09IHRva2VuLkNPTU1BOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHNlbGYuY29tX25vZGUobm9kZWxpc3RbaV0pKQorICAgICAgICByZXR1cm4gTGlzdCh2YWx1ZXMsIGxpbmVubz12YWx1ZXNbMF0ubGluZW5vKQorCisgICAgZGVmIGNvbV9saXN0X2NvbXByZWhlbnNpb24oc2VsZiwgZXhwciwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmNvbV9jb21wcmVoZW5zaW9uKGV4cHIsIE5vbmUsIG5vZGUsICdsaXN0JykKKworICAgIGRlZiBjb21fY29tcHJlaGVuc2lvbihzZWxmLCBleHByMSwgZXhwcjIsIG5vZGUsIHR5cGUpOgorICAgICAgICAjIGxpc3RfaXRlcjogbGlzdF9mb3IgfCBsaXN0X2lmCisgICAgICAgICMgbGlzdF9mb3I6ICdmb3InIGV4cHJsaXN0ICdpbicgdGVzdGxpc3QgW2xpc3RfaXRlcl0KKyAgICAgICAgIyBsaXN0X2lmOiAnaWYnIHRlc3QgW2xpc3RfaXRlcl0KKworICAgICAgICAjIFhYWCBzaG91bGQgcmFpc2UgU3ludGF4RXJyb3IgZm9yIGFzc2lnbm1lbnQKKyAgICAgICAgIyBYWFgoYXZhc3NhbG90dGkpIFNldCBhbmQgZGljdCBjb21wcmVoZW5zaW9ucyBzaG91bGQgaGF2ZSBnZW5lcmF0b3IKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIHNlbWFudGljcy4gSW4gb3RoZXIgd29yZHMsIHRoZXkgc2hvdWxkbid0IGxlYWsKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyBvdXRzaWRlIG9mIHRoZSBjb21wcmVoZW5zaW9uJ3Mgc2NvcGUuCisKKyAgICAgICAgbGluZW5vID0gbm9kZVsxXVsyXQorICAgICAgICBmb3JzID0gW10KKyAgICAgICAgd2hpbGUgbm9kZToKKyAgICAgICAgICAgIHQgPSBub2RlWzFdWzFdCisgICAgICAgICAgICBpZiB0ID09ICdmb3InOgorICAgICAgICAgICAgICAgIGFzc2lnbk5vZGUgPSBzZWxmLmNvbV9hc3NpZ24obm9kZVsyXSwgT1BfQVNTSUdOKQorICAgICAgICAgICAgICAgIGNvbXBOb2RlID0gc2VsZi5jb21fbm9kZShub2RlWzRdKQorICAgICAgICAgICAgICAgIG5ld2ZvciA9IExpc3RDb21wRm9yKGFzc2lnbk5vZGUsIGNvbXBOb2RlLCBbXSkKKyAgICAgICAgICAgICAgICBuZXdmb3IubGluZW5vID0gbm9kZVsxXVsyXQorICAgICAgICAgICAgICAgIGZvcnMuYXBwZW5kKG5ld2ZvcikKKyAgICAgICAgICAgICAgICBpZiBsZW4obm9kZSkgPT0gNToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbGlmIHR5cGUgPT0gJ2xpc3QnOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5jb21fbGlzdF9pdGVyKG5vZGVbNV0pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYuY29tX2NvbXBfaXRlcihub2RlWzVdKQorICAgICAgICAgICAgZWxpZiB0ID09ICdpZic6CisgICAgICAgICAgICAgICAgdGVzdCA9IHNlbGYuY29tX25vZGUobm9kZVsyXSkKKyAgICAgICAgICAgICAgICBuZXdpZiA9IExpc3RDb21wSWYodGVzdCwgbGluZW5vPW5vZGVbMV1bMl0pCisgICAgICAgICAgICAgICAgbmV3Zm9yLmlmcy5hcHBlbmQobmV3aWYpCisgICAgICAgICAgICAgICAgaWYgbGVuKG5vZGUpID09IDM6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBOb25lCisgICAgICAgICAgICAgICAgZWxpZiB0eXBlID09ICdsaXN0JzoKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYuY29tX2xpc3RfaXRlcihub2RlWzNdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLmNvbV9jb21wX2l0ZXIobm9kZVszXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoInVuZXhwZWN0ZWQgY29tcHJlaGVuc2lvbiBlbGVtZW50OiAlcyAlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgJSAobm9kZSwgbGluZW5vKSkKKyAgICAgICAgaWYgdHlwZSA9PSAnbGlzdCc6CisgICAgICAgICAgICByZXR1cm4gTGlzdENvbXAoZXhwcjEsIGZvcnMsIGxpbmVubz1saW5lbm8pCisgICAgICAgIGVsaWYgdHlwZSA9PSAnc2V0JzoKKyAgICAgICAgICAgIHJldHVybiBTZXRDb21wKGV4cHIxLCBmb3JzLCBsaW5lbm89bGluZW5vKQorICAgICAgICBlbGlmIHR5cGUgPT0gJ2RpY3QnOgorICAgICAgICAgICAgcmV0dXJuIERpY3RDb21wKGV4cHIxLCBleHByMiwgZm9ycywgbGluZW5vPWxpbmVubykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuZXhwZWN0ZWQgY29tcHJlaGVuc2lvbiB0eXBlOiAiICsgcmVwcih0eXBlKSkKKworICAgIGRlZiBjb21fbGlzdF9pdGVyKHNlbGYsIG5vZGUpOgorICAgICAgICBhc3NlcnQgbm9kZVswXSA9PSBzeW1ib2wubGlzdF9pdGVyCisgICAgICAgIHJldHVybiBub2RlWzFdCisKKyAgICBkZWYgY29tX2NvbXBfaXRlcihzZWxmLCBub2RlKToKKyAgICAgICAgYXNzZXJ0IG5vZGVbMF0gPT0gc3ltYm9sLmNvbXBfaXRlcgorICAgICAgICByZXR1cm4gbm9kZVsxXQorCisgICAgZGVmIGNvbV9nZW5lcmF0b3JfZXhwcmVzc2lvbihzZWxmLCBleHByLCBub2RlKToKKyAgICAgICAgIyBjb21wX2l0ZXI6IGNvbXBfZm9yIHwgY29tcF9pZgorICAgICAgICAjIGNvbXBfZm9yOiAnZm9yJyBleHBybGlzdCAnaW4nIHRlc3QgW2NvbXBfaXRlcl0KKyAgICAgICAgIyBjb21wX2lmOiAnaWYnIHRlc3QgW2NvbXBfaXRlcl0KKworICAgICAgICBsaW5lbm8gPSBub2RlWzFdWzJdCisgICAgICAgIGZvcnMgPSBbXQorICAgICAgICB3aGlsZSBub2RlOgorICAgICAgICAgICAgdCA9IG5vZGVbMV1bMV0KKyAgICAgICAgICAgIGlmIHQgPT0gJ2Zvcic6CisgICAgICAgICAgICAgICAgYXNzaWduTm9kZSA9IHNlbGYuY29tX2Fzc2lnbihub2RlWzJdLCBPUF9BU1NJR04pCisgICAgICAgICAgICAgICAgZ2VuTm9kZSA9IHNlbGYuY29tX25vZGUobm9kZVs0XSkKKyAgICAgICAgICAgICAgICBuZXdmb3IgPSBHZW5FeHByRm9yKGFzc2lnbk5vZGUsIGdlbk5vZGUsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPW5vZGVbMV1bMl0pCisgICAgICAgICAgICAgICAgZm9ycy5hcHBlbmQobmV3Zm9yKQorICAgICAgICAgICAgICAgIGlmIChsZW4obm9kZSkpID09IDU6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYuY29tX2NvbXBfaXRlcihub2RlWzVdKQorICAgICAgICAgICAgZWxpZiB0ID09ICdpZic6CisgICAgICAgICAgICAgICAgdGVzdCA9IHNlbGYuY29tX25vZGUobm9kZVsyXSkKKyAgICAgICAgICAgICAgICBuZXdpZiA9IEdlbkV4cHJJZih0ZXN0LCBsaW5lbm89bm9kZVsxXVsyXSkKKyAgICAgICAgICAgICAgICBuZXdmb3IuaWZzLmFwcGVuZChuZXdpZikKKyAgICAgICAgICAgICAgICBpZiBsZW4obm9kZSkgPT0gMzoKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5jb21fY29tcF9pdGVyKG5vZGVbM10pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAoInVuZXhwZWN0ZWQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gZWxlbWVudDogJXMgJWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgJSAobm9kZSwgbGluZW5vKSkKKyAgICAgICAgZm9yc1swXS5pc19vdXRtb3N0ID0gVHJ1ZQorICAgICAgICByZXR1cm4gR2VuRXhwcihHZW5FeHBySW5uZXIoZXhwciwgZm9ycyksIGxpbmVubz1saW5lbm8pCisKKyAgICBkZWYgY29tX2RpY3RvcnNldG1ha2VyKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBkaWN0b3JzZXRtYWtlcjogKCAodGVzdCAnOicgdGVzdCAoY29tcF9mb3IgfCAoJywnIHRlc3QgJzonIHRlc3QpKiBbJywnXSkpIHwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAodGVzdCAoY29tcF9mb3IgfCAoJywnIHRlc3QpKiBbJywnXSkpICkKKyAgICAgICAgYXNzZXJ0IG5vZGVsaXN0WzBdID09IHN5bWJvbC5kaWN0b3JzZXRtYWtlcgorICAgICAgICBub2RlbGlzdCA9IG5vZGVsaXN0WzE6XQorICAgICAgICBpZiBsZW4obm9kZWxpc3QpID09IDEgb3Igbm9kZWxpc3RbMV1bMF0gPT0gdG9rZW4uQ09NTUE6CisgICAgICAgICAgICAjIHNldCBsaXRlcmFsCisgICAgICAgICAgICBpdGVtcyA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4obm9kZWxpc3QpLCAyKToKKyAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoc2VsZi5jb21fbm9kZShub2RlbGlzdFtpXSkpCisgICAgICAgICAgICByZXR1cm4gU2V0KGl0ZW1zLCBsaW5lbm89aXRlbXNbMF0ubGluZW5vKQorICAgICAgICBlbGlmIG5vZGVsaXN0WzFdWzBdID09IHN5bWJvbC5jb21wX2ZvcjoKKyAgICAgICAgICAgICMgc2V0IGNvbXByZWhlbnNpb24KKyAgICAgICAgICAgIGV4cHIgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzBdKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX2NvbXByZWhlbnNpb24oZXhwciwgTm9uZSwgbm9kZWxpc3RbMV0sICdzZXQnKQorICAgICAgICBlbGlmIGxlbihub2RlbGlzdCkgPiAzIGFuZCBub2RlbGlzdFszXVswXSA9PSBzeW1ib2wuY29tcF9mb3I6CisgICAgICAgICAgICAjIGRpY3QgY29tcHJlaGVuc2lvbgorICAgICAgICAgICAgYXNzZXJ0IG5vZGVsaXN0WzFdWzBdID09IHRva2VuLkNPTE9OCisgICAgICAgICAgICBrZXkgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzBdKQorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzJdKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX2NvbXByZWhlbnNpb24oa2V5LCB2YWx1ZSwgbm9kZWxpc3RbM10sICdkaWN0JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZGljdCBsaXRlcmFsCisgICAgICAgICAgICBpdGVtcyA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4obm9kZWxpc3QpLCA0KToKKyAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoKHNlbGYuY29tX25vZGUobm9kZWxpc3RbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKSkpCisgICAgICAgICAgICByZXR1cm4gRGljdChpdGVtcywgbGluZW5vPWl0ZW1zWzBdWzBdLmxpbmVubykKKworICAgIGRlZiBjb21fYXBwbHlfdHJhaWxlcihzZWxmLCBwcmltYXJ5Tm9kZSwgbm9kZWxpc3QpOgorICAgICAgICB0ID0gbm9kZWxpc3RbMV1bMF0KKyAgICAgICAgaWYgdCA9PSB0b2tlbi5MUEFSOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX2NhbGxfZnVuY3Rpb24ocHJpbWFyeU5vZGUsIG5vZGVsaXN0WzJdKQorICAgICAgICBpZiB0ID09IHRva2VuLkRPVDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbV9zZWxlY3RfbWVtYmVyKHByaW1hcnlOb2RlLCBub2RlbGlzdFsyXSkKKyAgICAgICAgaWYgdCA9PSB0b2tlbi5MU1FCOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX3N1YnNjcmlwdGxpc3QocHJpbWFyeU5vZGUsIG5vZGVsaXN0WzJdLCBPUF9BUFBMWSkKKworICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgJ3Vua25vd24gbm9kZSB0eXBlOiAlcycgJSB0CisKKyAgICBkZWYgY29tX3NlbGVjdF9tZW1iZXIoc2VsZiwgcHJpbWFyeU5vZGUsIG5vZGVsaXN0KToKKyAgICAgICAgaWYgbm9kZWxpc3RbMF0gIT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAibWVtYmVyIG11c3QgYmUgYSBuYW1lIgorICAgICAgICByZXR1cm4gR2V0YXR0cihwcmltYXJ5Tm9kZSwgbm9kZWxpc3RbMV0sIGxpbmVubz1ub2RlbGlzdFsyXSkKKworICAgIGRlZiBjb21fY2FsbF9mdW5jdGlvbihzZWxmLCBwcmltYXJ5Tm9kZSwgbm9kZWxpc3QpOgorICAgICAgICBpZiBub2RlbGlzdFswXSA9PSB0b2tlbi5SUEFSOgorICAgICAgICAgICAgcmV0dXJuIENhbGxGdW5jKHByaW1hcnlOb2RlLCBbXSwgbGluZW5vPWV4dHJhY3RMaW5lTm8obm9kZWxpc3QpKQorICAgICAgICBhcmdzID0gW10KKyAgICAgICAga3cgPSAwCisgICAgICAgIHN0YXJfbm9kZSA9IGRzdGFyX25vZGUgPSBOb25lCisgICAgICAgIGxlbl9ub2RlbGlzdCA9IGxlbihub2RlbGlzdCkKKyAgICAgICAgaSA9IDEKKyAgICAgICAgd2hpbGUgaSA8IGxlbl9ub2RlbGlzdDoKKyAgICAgICAgICAgIG5vZGUgPSBub2RlbGlzdFtpXQorCisgICAgICAgICAgICBpZiBub2RlWzBdPT10b2tlbi5TVEFSOgorICAgICAgICAgICAgICAgIGlmIHN0YXJfbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICdhbHJlYWR5IGhhdmUgdGhlIHZhcmFyZ3MgaW5kZW50aWZpZXInCisgICAgICAgICAgICAgICAgc3Rhcl9ub2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzFdKQorICAgICAgICAgICAgICAgIGkgPSBpICsgMworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIG5vZGVbMF09PXRva2VuLkRPVUJMRVNUQVI6CisgICAgICAgICAgICAgICAgaWYgZHN0YXJfbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICdhbHJlYWR5IGhhdmUgdGhlIGt3YXJncyBpbmRlbnRpZmllcicKKyAgICAgICAgICAgICAgICBkc3Rhcl9ub2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzFdKQorICAgICAgICAgICAgICAgIGkgPSBpICsgMworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgcG9zaXRpb25hbCBvciBuYW1lZCBwYXJhbWV0ZXJzCisgICAgICAgICAgICBrdywgcmVzdWx0ID0gc2VsZi5jb21fYXJndW1lbnQobm9kZSwga3csIHN0YXJfbm9kZSkKKworICAgICAgICAgICAgaWYgbGVuX25vZGVsaXN0ICE9IDIgYW5kIGlzaW5zdGFuY2UocmVzdWx0LCBHZW5FeHByKSBcCisgICAgICAgICAgICAgICBhbmQgbGVuKG5vZGUpID09IDMgYW5kIG5vZGVbMl1bMF0gPT0gc3ltYm9sLmNvbXBfZm9yOgorICAgICAgICAgICAgICAgICMgYWxsb3cgZih4IGZvciB4IGluIHkpLCBidXQgcmVqZWN0IGYoeCBmb3IgeCBpbiB5LCAxKQorICAgICAgICAgICAgICAgICMgc2hvdWxkIHVzZSBmKCh4IGZvciB4IGluIHkpLCAxKSBpbnN0ZWFkIG9mIGYoeCBmb3IgeCBpbiB5LCAxKQorICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAnZ2VuZXJhdG9yIGV4cHJlc3Npb24gbmVlZHMgcGFyZW50aGVzaXMnCisKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKHJlc3VsdCkKKyAgICAgICAgICAgIGkgPSBpICsgMgorCisgICAgICAgIHJldHVybiBDYWxsRnVuYyhwcmltYXJ5Tm9kZSwgYXJncywgc3Rhcl9ub2RlLCBkc3Rhcl9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPWV4dHJhY3RMaW5lTm8obm9kZWxpc3QpKQorCisgICAgZGVmIGNvbV9hcmd1bWVudChzZWxmLCBub2RlbGlzdCwga3csIHN0YXJfbm9kZSk6CisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPT0gMyBhbmQgbm9kZWxpc3RbMl1bMF0gPT0gc3ltYm9sLmNvbXBfZm9yOgorICAgICAgICAgICAgdGVzdCA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMV0pCisgICAgICAgICAgICByZXR1cm4gMCwgc2VsZi5jb21fZ2VuZXJhdG9yX2V4cHJlc3Npb24odGVzdCwgbm9kZWxpc3RbMl0pCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPT0gMjoKKyAgICAgICAgICAgIGlmIGt3OgorICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAibm9uLWtleXdvcmQgYXJnIGFmdGVyIGtleXdvcmQgYXJnIgorICAgICAgICAgICAgaWYgc3Rhcl9ub2RlOgorICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAib25seSBuYW1lZCBhcmd1bWVudHMgbWF5IGZvbGxvdyAqZXhwcmVzc2lvbiIKKyAgICAgICAgICAgIHJldHVybiAwLCBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzFdKQorICAgICAgICByZXN1bHQgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzNdKQorICAgICAgICBuID0gbm9kZWxpc3RbMV0KKyAgICAgICAgd2hpbGUgbGVuKG4pID09IDIgYW5kIG5bMF0gIT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgIG4gPSBuWzFdCisgICAgICAgIGlmIG5bMF0gIT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAia2V5d29yZCBjYW4ndCBiZSBhbiBleHByZXNzaW9uICglcykiJW5bMF0KKyAgICAgICAgbm9kZSA9IEtleXdvcmQoblsxXSwgcmVzdWx0LCBsaW5lbm89blsyXSkKKyAgICAgICAgcmV0dXJuIDEsIG5vZGUKKworICAgIGRlZiBjb21fc3Vic2NyaXB0bGlzdChzZWxmLCBwcmltYXJ5LCBub2RlbGlzdCwgYXNzaWduaW5nKToKKyAgICAgICAgIyBzbGljaW5nOiAgICAgIHNpbXBsZV9zbGljaW5nIHwgZXh0ZW5kZWRfc2xpY2luZworICAgICAgICAjIHNpbXBsZV9zbGljaW5nOiAgIHByaW1hcnkgIlsiIHNob3J0X3NsaWNlICJdIgorICAgICAgICAjIGV4dGVuZGVkX3NsaWNpbmc6IHByaW1hcnkgIlsiIHNsaWNlX2xpc3QgIl0iCisgICAgICAgICMgc2xpY2VfbGlzdDogICBzbGljZV9pdGVtICgiLCIgc2xpY2VfaXRlbSkqIFsiLCJdCisKKyAgICAgICAgIyBiYWNrd2FyZHMgY29tcGF0IHNsaWNlIGZvciAnW2k6al0nCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPT0gMjoKKyAgICAgICAgICAgIHN1YiA9IG5vZGVsaXN0WzFdCisgICAgICAgICAgICBpZiAoc3ViWzFdWzBdID09IHRva2VuLkNPTE9OIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuKHN1YikgPiAyIGFuZCBzdWJbMl1bMF0gPT0gdG9rZW4uQ09MT04pKSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YlstMV1bMF0gIT0gc3ltYm9sLnNsaWNlb3A6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX3NsaWNlKHByaW1hcnksIHN1YiwgYXNzaWduaW5nKQorCisgICAgICAgIHN1YnNjcmlwdHMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obm9kZWxpc3QpLCAyKToKKyAgICAgICAgICAgIHN1YnNjcmlwdHMuYXBwZW5kKHNlbGYuY29tX3N1YnNjcmlwdChub2RlbGlzdFtpXSkpCisgICAgICAgIHJldHVybiBTdWJzY3JpcHQocHJpbWFyeSwgYXNzaWduaW5nLCBzdWJzY3JpcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubz1leHRyYWN0TGluZU5vKG5vZGVsaXN0KSkKKworICAgIGRlZiBjb21fc3Vic2NyaXB0KHNlbGYsIG5vZGUpOgorICAgICAgICAjIHNsaWNlX2l0ZW06IGV4cHJlc3Npb24gfCBwcm9wZXJfc2xpY2UgfCBlbGxpcHNpcworICAgICAgICBjaCA9IG5vZGVbMV0KKyAgICAgICAgdCA9IGNoWzBdCisgICAgICAgIGlmIHQgPT0gdG9rZW4uRE9UIGFuZCBub2RlWzJdWzBdID09IHRva2VuLkRPVDoKKyAgICAgICAgICAgIHJldHVybiBFbGxpcHNpcygpCisgICAgICAgIGlmIHQgPT0gdG9rZW4uQ09MT04gb3IgbGVuKG5vZGUpID4gMjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbV9zbGljZW9iaihub2RlKQorICAgICAgICByZXR1cm4gc2VsZi5jb21fbm9kZShjaCkKKworICAgIGRlZiBjb21fc2xpY2VvYmooc2VsZiwgbm9kZSk6CisgICAgICAgICMgcHJvcGVyX3NsaWNlOiBzaG9ydF9zbGljZSB8IGxvbmdfc2xpY2UKKyAgICAgICAgIyBzaG9ydF9zbGljZTogIFtsb3dlcl9ib3VuZF0gIjoiIFt1cHBlcl9ib3VuZF0KKyAgICAgICAgIyBsb25nX3NsaWNlOiAgIHNob3J0X3NsaWNlICI6IiBbc3RyaWRlXQorICAgICAgICAjIGxvd2VyX2JvdW5kOiAgZXhwcmVzc2lvbgorICAgICAgICAjIHVwcGVyX2JvdW5kOiAgZXhwcmVzc2lvbgorICAgICAgICAjIHN0cmlkZTogICAgICAgZXhwcmVzc2lvbgorICAgICAgICAjCisgICAgICAgICMgTm90ZTogYSBzdHJpZGUgbWF5IGJlIGZ1cnRoZXIgc2xpY2luZy4uLgorCisgICAgICAgIGl0ZW1zID0gW10KKworICAgICAgICBpZiBub2RlWzFdWzBdID09IHRva2VuLkNPTE9OOgorICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnN0KE5vbmUpKQorICAgICAgICAgICAgaSA9IDIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChzZWxmLmNvbV9ub2RlKG5vZGVbMV0pKQorICAgICAgICAgICAgIyBpID09IDIgaXMgYSBDT0xPTgorICAgICAgICAgICAgaSA9IDMKKworICAgICAgICBpZiBpIDwgbGVuKG5vZGUpIGFuZCBub2RlW2ldWzBdID09IHN5bWJvbC50ZXN0OgorICAgICAgICAgICAgaXRlbXMuYXBwZW5kKHNlbGYuY29tX25vZGUobm9kZVtpXSkpCisgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChDb25zdChOb25lKSkKKworICAgICAgICAjIGEgc2hvcnRfc2xpY2UgaGFzIGJlZW4gYnVpbHQuIGxvb2sgZm9yIGxvbmdfc2xpY2Ugbm93IGJ5IGxvb2tpbmcKKyAgICAgICAgIyBmb3Igc3RyaWRlcy4uLgorICAgICAgICBmb3IgaiBpbiByYW5nZShpLCBsZW4obm9kZSkpOgorICAgICAgICAgICAgY2ggPSBub2RlW2pdCisgICAgICAgICAgICBpZiBsZW4oY2gpID09IDI6CisgICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnN0KE5vbmUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoc2VsZi5jb21fbm9kZShjaFsyXSkpCisgICAgICAgIHJldHVybiBTbGljZW9iaihpdGVtcywgbGluZW5vPWV4dHJhY3RMaW5lTm8obm9kZSkpCisKKyAgICBkZWYgY29tX3NsaWNlKHNlbGYsIHByaW1hcnksIG5vZGUsIGFzc2lnbmluZyk6CisgICAgICAgICMgc2hvcnRfc2xpY2U6ICBbbG93ZXJfYm91bmRdICI6IiBbdXBwZXJfYm91bmRdCisgICAgICAgIGxvd2VyID0gdXBwZXIgPSBOb25lCisgICAgICAgIGlmIGxlbihub2RlKSA9PSAzOgorICAgICAgICAgICAgaWYgbm9kZVsxXVswXSA9PSB0b2tlbi5DT0xPTjoKKyAgICAgICAgICAgICAgICB1cHBlciA9IHNlbGYuY29tX25vZGUobm9kZVsyXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG93ZXIgPSBzZWxmLmNvbV9ub2RlKG5vZGVbMV0pCisgICAgICAgIGVsaWYgbGVuKG5vZGUpID09IDQ6CisgICAgICAgICAgICBsb3dlciA9IHNlbGYuY29tX25vZGUobm9kZVsxXSkKKyAgICAgICAgICAgIHVwcGVyID0gc2VsZi5jb21fbm9kZShub2RlWzNdKQorICAgICAgICByZXR1cm4gU2xpY2UocHJpbWFyeSwgYXNzaWduaW5nLCBsb3dlciwgdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICBsaW5lbm89ZXh0cmFjdExpbmVObyhub2RlKSkKKworICAgIGRlZiBnZXRfZG9jc3RyaW5nKHNlbGYsIG5vZGUsIG49Tm9uZSk6CisgICAgICAgIGlmIG4gaXMgTm9uZToKKyAgICAgICAgICAgIG4gPSBub2RlWzBdCisgICAgICAgICAgICBub2RlID0gbm9kZVsxOl0KKyAgICAgICAgaWYgbiA9PSBzeW1ib2wuc3VpdGU6CisgICAgICAgICAgICBpZiBsZW4obm9kZSkgPT0gMToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfZG9jc3RyaW5nKG5vZGVbMF0pCisgICAgICAgICAgICBmb3Igc3ViIGluIG5vZGU6CisgICAgICAgICAgICAgICAgaWYgc3ViWzBdID09IHN5bWJvbC5zdG10OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfZG9jc3RyaW5nKHN1YikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIG4gPT0gc3ltYm9sLmZpbGVfaW5wdXQ6CisgICAgICAgICAgICBmb3Igc3ViIGluIG5vZGU6CisgICAgICAgICAgICAgICAgaWYgc3ViWzBdID09IHN5bWJvbC5zdG10OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfZG9jc3RyaW5nKHN1YikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIG4gPT0gc3ltYm9sLmF0b206CisgICAgICAgICAgICBpZiBub2RlWzBdWzBdID09IHRva2VuLlNUUklORzoKKyAgICAgICAgICAgICAgICBzID0gJycKKyAgICAgICAgICAgICAgICBmb3IgdCBpbiBub2RlOgorICAgICAgICAgICAgICAgICAgICBzID0gcyArIGV2YWwodFsxXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcworICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgbiA9PSBzeW1ib2wuc3RtdCBvciBuID09IHN5bWJvbC5zaW1wbGVfc3RtdCBcCisgICAgICAgICAgIG9yIG4gPT0gc3ltYm9sLnNtYWxsX3N0bXQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfZG9jc3RyaW5nKG5vZGVbMF0pCisgICAgICAgIGlmIG4gaW4gX2RvY19ub2RlcyBhbmQgbGVuKG5vZGUpID09IDE6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfZG9jc3RyaW5nKG5vZGVbMF0pCisgICAgICAgIHJldHVybiBOb25lCisKKworX2RvY19ub2RlcyA9IFsKKyAgICBzeW1ib2wuZXhwcl9zdG10LAorICAgIHN5bWJvbC50ZXN0bGlzdCwKKyAgICBzeW1ib2wudGVzdGxpc3Rfc2FmZSwKKyAgICBzeW1ib2wudGVzdCwKKyAgICBzeW1ib2wub3JfdGVzdCwKKyAgICBzeW1ib2wuYW5kX3Rlc3QsCisgICAgc3ltYm9sLm5vdF90ZXN0LAorICAgIHN5bWJvbC5jb21wYXJpc29uLAorICAgIHN5bWJvbC5leHByLAorICAgIHN5bWJvbC54b3JfZXhwciwKKyAgICBzeW1ib2wuYW5kX2V4cHIsCisgICAgc3ltYm9sLnNoaWZ0X2V4cHIsCisgICAgc3ltYm9sLmFyaXRoX2V4cHIsCisgICAgc3ltYm9sLnRlcm0sCisgICAgc3ltYm9sLmZhY3RvciwKKyAgICBzeW1ib2wucG93ZXIsCisgICAgXQorCisjIGNvbXBfb3A6ICc8JyB8ICc+JyB8ICc9JyB8ICc+PScgfCAnPD0nIHwgJzw+JyB8ICchPScgfCAnPT0nCisjICAgICAgICAgICAgIHwgJ2luJyB8ICdub3QnICdpbicgfCAnaXMnIHwgJ2lzJyAnbm90JworX2NtcF90eXBlcyA9IHsKKyAgICB0b2tlbi5MRVNTIDogJzwnLAorICAgIHRva2VuLkdSRUFURVIgOiAnPicsCisgICAgdG9rZW4uRVFFUVVBTCA6ICc9PScsCisgICAgdG9rZW4uRVFVQUwgOiAnPT0nLAorICAgIHRva2VuLkxFU1NFUVVBTCA6ICc8PScsCisgICAgdG9rZW4uR1JFQVRFUkVRVUFMIDogJz49JywKKyAgICB0b2tlbi5OT1RFUVVBTCA6ICchPScsCisgICAgfQorCitfbGVnYWxfbm9kZV90eXBlcyA9IFsKKyAgICBzeW1ib2wuZnVuY2RlZiwKKyAgICBzeW1ib2wuY2xhc3NkZWYsCisgICAgc3ltYm9sLnN0bXQsCisgICAgc3ltYm9sLnNtYWxsX3N0bXQsCisgICAgc3ltYm9sLmZsb3dfc3RtdCwKKyAgICBzeW1ib2wuc2ltcGxlX3N0bXQsCisgICAgc3ltYm9sLmNvbXBvdW5kX3N0bXQsCisgICAgc3ltYm9sLmV4cHJfc3RtdCwKKyAgICBzeW1ib2wucHJpbnRfc3RtdCwKKyAgICBzeW1ib2wuZGVsX3N0bXQsCisgICAgc3ltYm9sLnBhc3Nfc3RtdCwKKyAgICBzeW1ib2wuYnJlYWtfc3RtdCwKKyAgICBzeW1ib2wuY29udGludWVfc3RtdCwKKyAgICBzeW1ib2wucmV0dXJuX3N0bXQsCisgICAgc3ltYm9sLnJhaXNlX3N0bXQsCisgICAgc3ltYm9sLmltcG9ydF9zdG10LAorICAgIHN5bWJvbC5nbG9iYWxfc3RtdCwKKyAgICBzeW1ib2wuZXhlY19zdG10LAorICAgIHN5bWJvbC5hc3NlcnRfc3RtdCwKKyAgICBzeW1ib2wuaWZfc3RtdCwKKyAgICBzeW1ib2wud2hpbGVfc3RtdCwKKyAgICBzeW1ib2wuZm9yX3N0bXQsCisgICAgc3ltYm9sLnRyeV9zdG10LAorICAgIHN5bWJvbC53aXRoX3N0bXQsCisgICAgc3ltYm9sLnN1aXRlLAorICAgIHN5bWJvbC50ZXN0bGlzdCwKKyAgICBzeW1ib2wudGVzdGxpc3Rfc2FmZSwKKyAgICBzeW1ib2wudGVzdCwKKyAgICBzeW1ib2wuYW5kX3Rlc3QsCisgICAgc3ltYm9sLm5vdF90ZXN0LAorICAgIHN5bWJvbC5jb21wYXJpc29uLAorICAgIHN5bWJvbC5leHBybGlzdCwKKyAgICBzeW1ib2wuZXhwciwKKyAgICBzeW1ib2wueG9yX2V4cHIsCisgICAgc3ltYm9sLmFuZF9leHByLAorICAgIHN5bWJvbC5zaGlmdF9leHByLAorICAgIHN5bWJvbC5hcml0aF9leHByLAorICAgIHN5bWJvbC50ZXJtLAorICAgIHN5bWJvbC5mYWN0b3IsCisgICAgc3ltYm9sLnBvd2VyLAorICAgIHN5bWJvbC5hdG9tLAorICAgIF0KKworaWYgaGFzYXR0cihzeW1ib2wsICd5aWVsZF9zdG10Jyk6CisgICAgX2xlZ2FsX25vZGVfdHlwZXMuYXBwZW5kKHN5bWJvbC55aWVsZF9zdG10KQoraWYgaGFzYXR0cihzeW1ib2wsICd5aWVsZF9leHByJyk6CisgICAgX2xlZ2FsX25vZGVfdHlwZXMuYXBwZW5kKHN5bWJvbC55aWVsZF9leHByKQorCitfYXNzaWduX3R5cGVzID0gWworICAgIHN5bWJvbC50ZXN0LAorICAgIHN5bWJvbC5vcl90ZXN0LAorICAgIHN5bWJvbC5hbmRfdGVzdCwKKyAgICBzeW1ib2wubm90X3Rlc3QsCisgICAgc3ltYm9sLmNvbXBhcmlzb24sCisgICAgc3ltYm9sLmV4cHIsCisgICAgc3ltYm9sLnhvcl9leHByLAorICAgIHN5bWJvbC5hbmRfZXhwciwKKyAgICBzeW1ib2wuc2hpZnRfZXhwciwKKyAgICBzeW1ib2wuYXJpdGhfZXhwciwKKyAgICBzeW1ib2wudGVybSwKKyAgICBzeW1ib2wuZmFjdG9yLAorICAgIF0KKworX25hbWVzID0ge30KK2ZvciBrLCB2IGluIHN5bWJvbC5zeW1fbmFtZS5pdGVtcygpOgorICAgIF9uYW1lc1trXSA9IHYKK2ZvciBrLCB2IGluIHRva2VuLnRva19uYW1lLml0ZW1zKCk6CisgICAgX25hbWVzW2tdID0gdgorCitkZWYgZGVidWdfdHJlZSh0cmVlKToKKyAgICBsID0gW10KKyAgICBmb3IgZWx0IGluIHRyZWU6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoZWx0LCBpbnQpOgorICAgICAgICAgICAgbC5hcHBlbmQoX25hbWVzLmdldChlbHQsIGVsdCkpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlbHQsIHN0cik6CisgICAgICAgICAgICBsLmFwcGVuZChlbHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsLmFwcGVuZChkZWJ1Z190cmVlKGVsdCkpCisgICAgcmV0dXJuIGwKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvdHJhbnNmb3JtZXIucHljIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci90cmFuc2Zvcm1lci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxMjJkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvdHJhbnNmb3JtZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvdHJhbnNmb3JtZXIucHlvIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci90cmFuc2Zvcm1lci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhMGYzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvdHJhbnNmb3JtZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvdmlzaXRvci5weSBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvdmlzaXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTBmNTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci92aXNpdG9yLnB5CkBAIC0wLDAgKzEsMTEzIEBACitmcm9tIGNvbXBpbGVyIGltcG9ydCBhc3QKKworIyBYWFggc2hvdWxkIHByb2JhYmx5IHJlbmFtZSBBU1RWaXNpdG9yIHRvIEFTVFdhbGtlcgorIyBYWFggY2FuIGl0IGJlIG1hZGUgZXZlbiBtb3JlIGdlbmVyaWM/CisKK2NsYXNzIEFTVFZpc2l0b3I6CisgICAgIiIiUGVyZm9ybXMgYSBkZXB0aC1maXJzdCB3YWxrIG9mIHRoZSBBU1QKKworICAgIFRoZSBBU1RWaXNpdG9yIHdpbGwgd2FsayB0aGUgQVNULCBwZXJmb3JtaW5nIGVpdGhlciBhIHByZW9yZGVyIG9yCisgICAgcG9zdG9yZGVyIHRyYXZlcnNhbCBkZXBlbmRpbmcgb24gd2hpY2ggbWV0aG9kIGlzIGNhbGxlZC4KKworICAgIG1ldGhvZHM6CisgICAgcHJlb3JkZXIodHJlZSwgdmlzaXRvcikKKyAgICBwb3N0b3JkZXIodHJlZSwgdmlzaXRvcikKKyAgICAgICAgdHJlZTogYW4gaW5zdGFuY2Ugb2YgYXN0Lk5vZGUKKyAgICAgICAgdmlzaXRvcjogYW4gaW5zdGFuY2Ugd2l0aCB2aXNpdFhYWCBtZXRob2RzCisKKyAgICBUaGUgQVNUVmlzaXRvciBpcyByZXNwb25zaWJsZSBmb3Igd2Fsa2luZyBvdmVyIHRoZSB0cmVlIGluIHRoZQorICAgIGNvcnJlY3Qgb3JkZXIuICBGb3IgZWFjaCBub2RlLCBpdCBjaGVja3MgdGhlIHZpc2l0b3IgYXJndW1lbnQgZm9yCisgICAgYSBtZXRob2QgbmFtZWQgJ3Zpc2l0Tm9kZVR5cGUnIHdoZXJlIE5vZGVUeXBlIGlzIHRoZSBuYW1lIG9mIHRoZQorICAgIG5vZGUncyBjbGFzcywgZS5nLiBDbGFzcy4gIElmIHRoZSBtZXRob2QgZXhpc3RzLCBpdCBpcyBjYWxsZWQKKyAgICB3aXRoIHRoZSBub2RlIGFzIGl0cyBzb2xlIGFyZ3VtZW50LgorCisgICAgVGhlIHZpc2l0b3IgbWV0aG9kIGZvciBhIHBhcnRpY3VsYXIgbm9kZSB0eXBlIGNhbiBjb250cm9sIGhvdworICAgIGNoaWxkIG5vZGVzIGFyZSB2aXNpdGVkIGR1cmluZyBhIHByZW9yZGVyIHdhbGsuICAoSXQgY2FuJ3QgY29udHJvbAorICAgIHRoZSBvcmRlciBkdXJpbmcgYSBwb3N0b3JkZXIgd2FsaywgYmVjYXVzZSBpdCBpcyBjYWxsZWQgX2FmdGVyXworICAgIHRoZSB3YWxrIGhhcyBvY2N1cnJlZC4pICBUaGUgQVNUVmlzaXRvciBtb2RpZmllcyB0aGUgdmlzaXRvcgorICAgIGFyZ3VtZW50IGJ5IGFkZGluZyBhIHZpc2l0IG1ldGhvZCB0byB0aGUgdmlzaXRvcjsgdGhpcyBtZXRob2QgY2FuCisgICAgYmUgdXNlZCB0byB2aXNpdCBhIGNoaWxkIG5vZGUgb2YgYXJiaXRyYXJ5IHR5cGUuCisgICAgIiIiCisKKyAgICBWRVJCT1NFID0gMAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm5vZGUgPSBOb25lCisgICAgICAgIHNlbGYuX2NhY2hlID0ge30KKworICAgIGRlZiBkZWZhdWx0KHNlbGYsIG5vZGUsICphcmdzKToKKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuZ2V0Q2hpbGROb2RlcygpOgorICAgICAgICAgICAgc2VsZi5kaXNwYXRjaChjaGlsZCwgKmFyZ3MpCisKKyAgICBkZWYgZGlzcGF0Y2goc2VsZiwgbm9kZSwgKmFyZ3MpOgorICAgICAgICBzZWxmLm5vZGUgPSBub2RlCisgICAgICAgIGtsYXNzID0gbm9kZS5fX2NsYXNzX18KKyAgICAgICAgbWV0aCA9IHNlbGYuX2NhY2hlLmdldChrbGFzcywgTm9uZSkKKyAgICAgICAgaWYgbWV0aCBpcyBOb25lOgorICAgICAgICAgICAgY2xhc3NOYW1lID0ga2xhc3MuX19uYW1lX18KKyAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYudmlzaXRvciwgJ3Zpc2l0JyArIGNsYXNzTmFtZSwgc2VsZi5kZWZhdWx0KQorICAgICAgICAgICAgc2VsZi5fY2FjaGVba2xhc3NdID0gbWV0aAorIyMgICAgICAgIGlmIHNlbGYuVkVSQk9TRSA+IDA6CisjIyAgICAgICAgICAgIGNsYXNzTmFtZSA9IGtsYXNzLl9fbmFtZV9fCisjIyAgICAgICAgICAgIGlmIHNlbGYuVkVSQk9TRSA9PSAxOgorIyMgICAgICAgICAgICAgICAgaWYgbWV0aCA9PSAwOgorIyMgICAgICAgICAgICAgICAgICAgIHByaW50ICJkaXNwYXRjaCIsIGNsYXNzTmFtZQorIyMgICAgICAgICAgICBlbHNlOgorIyMgICAgICAgICAgICAgICAgcHJpbnQgImRpc3BhdGNoIiwgY2xhc3NOYW1lLCAobWV0aCBhbmQgbWV0aC5fX25hbWVfXyBvciAnJykKKyAgICAgICAgcmV0dXJuIG1ldGgobm9kZSwgKmFyZ3MpCisKKyAgICBkZWYgcHJlb3JkZXIoc2VsZiwgdHJlZSwgdmlzaXRvciwgKmFyZ3MpOgorICAgICAgICAiIiJEbyBwcmVvcmRlciB3YWxrIG9mIHRyZWUgdXNpbmcgdmlzaXRvciIiIgorICAgICAgICBzZWxmLnZpc2l0b3IgPSB2aXNpdG9yCisgICAgICAgIHZpc2l0b3IudmlzaXQgPSBzZWxmLmRpc3BhdGNoCisgICAgICAgIHNlbGYuZGlzcGF0Y2godHJlZSwgKmFyZ3MpICMgWFhYICphcmdzIG1ha2Ugc2Vuc2U/CisKK2NsYXNzIEV4YW1wbGVBU1RWaXNpdG9yKEFTVFZpc2l0b3IpOgorICAgICIiIlByaW50cyBleGFtcGxlcyBvZiB0aGUgbm9kZXMgdGhhdCBhcmVuJ3QgdmlzaXRlZAorCisgICAgVGhpcyB2aXNpdG9yLWRyaXZlciBpcyBvbmx5IHVzZWZ1bCBmb3IgZGV2ZWxvcG1lbnQsIHdoZW4gaXQncworICAgIGhlbHBmdWwgdG8gZGV2ZWxvcCBhIHZpc2l0b3IgaW5jcmVtZW50YWxseSwgYW5kIGdldCBmZWVkYmFjayBvbiB3aGF0CisgICAgeW91IHN0aWxsIGhhdmUgdG8gZG8uCisgICAgIiIiCisgICAgZXhhbXBsZXMgPSB7fQorCisgICAgZGVmIGRpc3BhdGNoKHNlbGYsIG5vZGUsICphcmdzKToKKyAgICAgICAgc2VsZi5ub2RlID0gbm9kZQorICAgICAgICBtZXRoID0gc2VsZi5fY2FjaGUuZ2V0KG5vZGUuX19jbGFzc19fLCBOb25lKQorICAgICAgICBjbGFzc05hbWUgPSBub2RlLl9fY2xhc3NfXy5fX25hbWVfXworICAgICAgICBpZiBtZXRoIGlzIE5vbmU6CisgICAgICAgICAgICBtZXRoID0gZ2V0YXR0cihzZWxmLnZpc2l0b3IsICd2aXNpdCcgKyBjbGFzc05hbWUsIDApCisgICAgICAgICAgICBzZWxmLl9jYWNoZVtub2RlLl9fY2xhc3NfX10gPSBtZXRoCisgICAgICAgIGlmIHNlbGYuVkVSQk9TRSA+IDE6CisgICAgICAgICAgICBwcmludCAiZGlzcGF0Y2giLCBjbGFzc05hbWUsIChtZXRoIGFuZCBtZXRoLl9fbmFtZV9fIG9yICcnKQorICAgICAgICBpZiBtZXRoOgorICAgICAgICAgICAgbWV0aChub2RlLCAqYXJncykKKyAgICAgICAgZWxpZiBzZWxmLlZFUkJPU0UgPiAwOgorICAgICAgICAgICAga2xhc3MgPSBub2RlLl9fY2xhc3NfXworICAgICAgICAgICAgaWYga2xhc3Mgbm90IGluIHNlbGYuZXhhbXBsZXM6CisgICAgICAgICAgICAgICAgc2VsZi5leGFtcGxlc1trbGFzc10gPSBrbGFzcworICAgICAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi52aXNpdG9yCisgICAgICAgICAgICAgICAgcHJpbnQga2xhc3MKKyAgICAgICAgICAgICAgICBmb3IgYXR0ciBpbiBkaXIobm9kZSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGF0dHJbMF0gIT0gJ18nOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlx0IiwgIiUtMTIuMTJzIiAlIGF0dHIsIGdldGF0dHIobm9kZSwgYXR0cikKKyAgICAgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVmYXVsdChub2RlLCAqYXJncykKKworIyBYWFggdGhpcyBpcyBhbiBBUEkgY2hhbmdlCisKK193YWxrZXIgPSBBU1RWaXNpdG9yCitkZWYgd2Fsayh0cmVlLCB2aXNpdG9yLCB3YWxrZXI9Tm9uZSwgdmVyYm9zZT1Ob25lKToKKyAgICBpZiB3YWxrZXIgaXMgTm9uZToKKyAgICAgICAgd2Fsa2VyID0gX3dhbGtlcigpCisgICAgaWYgdmVyYm9zZSBpcyBub3QgTm9uZToKKyAgICAgICAgd2Fsa2VyLlZFUkJPU0UgPSB2ZXJib3NlCisgICAgd2Fsa2VyLnByZW9yZGVyKHRyZWUsIHZpc2l0b3IpCisgICAgcmV0dXJuIHdhbGtlci52aXNpdG9yCisKK2RlZiBkdW1wTm9kZShub2RlKToKKyAgICBwcmludCBub2RlLl9fY2xhc3NfXworICAgIGZvciBhdHRyIGluIGRpcihub2RlKToKKyAgICAgICAgaWYgYXR0clswXSAhPSAnXyc6CisgICAgICAgICAgICBwcmludCAiXHQiLCAiJS0xMC4xMHMiICUgYXR0ciwgZ2V0YXR0cihub2RlLCBhdHRyKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci92aXNpdG9yLnB5YyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvdmlzaXRvci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlZDhjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvdmlzaXRvci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci92aXNpdG9yLnB5byBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvdmlzaXRvci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlZDhjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvdmlzaXRvci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb25maWcvTWFrZWZpbGUgYi9saWIvcHl0aG9uMi43L2NvbmZpZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjhlYTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb25maWcvTWFrZWZpbGUKQEAgLTAsMCArMSwxNDA2IEBACisjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gTWFrZWZpbGUucHJlIGJ5IG1ha2VzZXR1cC4KKyMgVG9wLWxldmVsIE1ha2VmaWxlIGZvciBQeXRob24KKyMKKyMgQXMgZGlzdHJpYnV0ZWQsIHRoaXMgZmlsZSBpcyBjYWxsZWQgTWFrZWZpbGUucHJlLmluOyBpdCBpcyBwcm9jZXNzZWQKKyMgaW50byB0aGUgcmVhbCBNYWtlZmlsZSBieSBydW5uaW5nIHRoZSBzY3JpcHQgLi9jb25maWd1cmUsIHdoaWNoCisjIHJlcGxhY2VzIHRoaW5ncyBsaWtlIEBzcGFtQCB3aXRoIHZhbHVlcyBhcHByb3ByaWF0ZSBmb3IgeW91ciBzeXN0ZW0uCisjIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgZWRpdCBNYWtlZmlsZSwgeW91ciBjaGFuZ2VzIGdldCBsb3N0IHRoZSBuZXh0CisjIHRpbWUgeW91IHJ1biB0aGUgY29uZmlndXJlIHNjcmlwdC4gIElkZWFsbHksIHlvdSBjYW4gZG86CisjCisjCS4vY29uZmlndXJlCisjCW1ha2UKKyMJbWFrZSB0ZXN0CisjCW1ha2UgaW5zdGFsbAorIworIyBJZiB5b3UgaGF2ZSBhIHByZXZpb3VzIHZlcnNpb24gb2YgUHl0aG9uIGluc3RhbGxlZCB0aGF0IHlvdSBkb24ndAorIyB3YW50IHRvIG92ZXJ3cml0ZSwgeW91IGNhbiB1c2UgIm1ha2UgYWx0aW5zdGFsbCIgaW5zdGVhZCBvZiAibWFrZQorIyBpbnN0YWxsIi4gIFJlZmVyIHRvIHRoZSAiSW5zdGFsbGluZyIgc2VjdGlvbiBpbiB0aGUgUkVBRE1FIGZpbGUgZm9yCisjIGFkZGl0aW9uYWwgZGV0YWlscy4KKyMKKyMgU2VlIGFsc28gdGhlIHNlY3Rpb24gIkJ1aWxkIGluc3RydWN0aW9ucyIgaW4gdGhlIFJFQURNRSBmaWxlLgorCisjID09PSBWYXJpYWJsZXMgc2V0IGJ5IG1ha2VzZXR1cCA9PT0KKworTU9ET0JKUz0gICAgICAgICAgTW9kdWxlcy9wb3NpeG1vZHVsZS5vICBNb2R1bGVzL3RocmVhZG1vZHVsZS5vICBNb2R1bGVzL3NpZ25hbG1vZHVsZS5vICBNb2R1bGVzL2Vycm5vbW9kdWxlLm8gIE1vZHVsZXMvX3NyZS5vICBNb2R1bGVzL19jb2RlY3Ntb2R1bGUubyAgTW9kdWxlcy9fd2Vha3JlZi5vICBNb2R1bGVzL3ppcGltcG9ydC5vICBNb2R1bGVzL3N5bXRhYmxlbW9kdWxlLm8gIE1vZHVsZXMveHhzdWJ0eXBlLm8KK01PRExJQlM9ICAgICAgICAkKExPQ0FMTU9ETElCUykgJChCQVNFTU9ETElCUykKKworIyA9PT0gVmFyaWFibGVzIHNldCBieSBjb25maWd1cmUKK1ZFUlNJT049CTIuNworc3JjZGlyPQkJL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNQorVlBBVEg9CQkvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41CitNU1lTVlBBVEg9CS9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUKK2Fic19zcmNkaXI9CS9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUKK2Fic19idWlsZGRpcj0JL3RtcC9uZGstVXNlci9idWlsZGhvc3QvYnVpbGQtcHl0aG9uLWRhcndpbi14ODZfNjQtMi43LjUKK2J1aWxkPQkJeDg2XzY0LWFwcGxlLWRhcndpbgoraG9zdD0JCXg4Nl82NC1hcHBsZS1kYXJ3aW4KKworQ0M9CQl4ODZfNjQtYXBwbGUtZGFyd2luLWdjYworQ1hYPQkJeDg2XzY0LWFwcGxlLWRhcndpbi1nKysKK01BSU5DQz0JCSQoQ0MpCitMSU5LQ0M9CQkkKFBVUklGWSkgJChNQUlOQ0MpCitBUj0JCXg4Nl82NC1hcHBsZS1kYXJ3aW4tYXIKK1JBTkxJQj0JCXg4Nl82NC1hcHBsZS1kYXJ3aW4tcmFubGliCitTVk5WRVJTSU9OPQlzdm52ZXJzaW9uICQoc3JjZGlyKQorSEdWRVJTSU9OPQkKK0hHVEFHPQkJCitIR0JSQU5DSD0JCisKK0dOVUxEPSAgICAgICAgICBubworCisjIFNoZWxsIHVzZWQgYnkgbWFrZSAoc29tZSB2ZXJzaW9ucyBkZWZhdWx0IHRvIHRoZSBsb2dpbiBzaGVsbCwgd2hpY2ggaXMgYmFkKQorU0hFTEw9CQkvYmluL3NoCisKKyMgVXNlIHRoaXMgdG8gbWFrZSBhIGxpbmsgYmV0d2VlbiBweXRob24kKFZFUlNJT04pIGFuZCBweXRob24gaW4gJChCSU5ESVIpCitMTj0JCWxuCisKKyMgUG9ydGFibGUgaW5zdGFsbCBzY3JpcHQgKGNvbmZpZ3VyZSBkb2Vzbid0IGFsd2F5cyBndWVzcyByaWdodCkKK0lOU1RBTEw9CS9vcHQvbG9jYWwvYmluL2dpbnN0YWxsIC1jCitJTlNUQUxMX1BST0dSQU09JHtJTlNUQUxMfQorSU5TVEFMTF9TQ1JJUFQ9ICR7SU5TVEFMTH0KK0lOU1RBTExfREFUQT0JJHtJTlNUQUxMfSAtbSA2NDQKKyMgU2hhcmVkIGxpYnJhcmllcyBtdXN0IGJlIGluc3RhbGxlZCB3aXRoIGV4ZWN1dGFibGUgbW9kZSBvbiBzb21lIHN5c3RlbXM7CisjIHJhdGhlciB0aGFuIGZpZ3VyaW5nIG91dCBleGFjdGx5IHdoaWNoLCB3ZSBhbHdheXMgZ2l2ZSB0aGVtIGV4ZWN1dGFibGUgbW9kZS4KKyMgQWxzbywgbWFraW5nIHRoZW0gcmVhZC1vbmx5IHNlZW1zIHRvIGJlIGEgZ29vZCBpZGVhLi4uCitJTlNUQUxMX1NIQVJFRD0gJHtJTlNUQUxMfSAtbSA1NTUKKworTUtESVJfUD0JL29wdC9sb2NhbC9iaW4vZ21rZGlyIC1wCisKK01BS0VTRVRVUD0gICAgICAkKHNyY2RpcikvTW9kdWxlcy9tYWtlc2V0dXAKKworIyBDb21waWxlciBvcHRpb25zCitPUFQ9CQktRE5ERUJVRyAtZyAtZndyYXB2IC1PMyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzCitCQVNFQ0ZMQUdTPQkgLWZuby1zdHJpY3QtYWxpYXNpbmcKK0NGTEFHUz0JCSQoQkFTRUNGTEFHUykgLU8yIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciAtcyAkKE9QVCkgJChFWFRSQV9DRkxBR1MpCisjIEJvdGggQ1BQRkxBR1MgYW5kIExERkxBR1MgbmVlZCB0byBjb250YWluIHRoZSBzaGVsbCdzIHZhbHVlIGZvciBzZXR1cC5weSB0bworIyBiZSBhYmxlIHRvIGJ1aWxkIGV4dGVuc2lvbiBtb2R1bGVzIHVzaW5nIHRoZSBkaXJlY3RvcmllcyBzcGVjaWZpZWQgaW4gdGhlCisjIGVudmlyb25tZW50IHZhcmlhYmxlcworQ1BQRkxBR1M9CS1JLiAtSUluY2x1ZGUgLUkkKHNyY2RpcikvSW5jbHVkZSAKK0xERkxBR1M9CQorTERMQVNUPQkJCitTR0lfQUJJPQkKK0NDU0hBUkVEPQkKK0xJTktGT1JTSEFSRUQ9CS11IF9QeU1hY19FcnJvcgorQVJGTEFHUz0JcmMKKyMgRXh0cmEgQyBmbGFncyBhZGRlZCBmb3IgYnVpbGRpbmcgdGhlIGludGVycHJldGVyIG9iamVjdCBmaWxlcy4KK0NGTEFHU0ZPUlNIQVJFRD0KKyMgQyBmbGFncyB1c2VkIGZvciBidWlsZGluZyB0aGUgaW50ZXJwcmV0ZXIgb2JqZWN0IGZpbGVzCitQWV9DRkxBR1M9CSQoQ0ZMQUdTKSAkKENQUEZMQUdTKSAkKENGTEFHU0ZPUlNIQVJFRCkgLURQeV9CVUlMRF9DT1JFCisKKyMgOyBvbiBXaW5kb3dzIG90aGVyd2lzZSA6CitERUxJTT0JCToKKyMgTWFjaGluZS1kZXBlbmRlbnQgc3ViZGlyZWN0b3JpZXMKK01BQ0hERVA9CWRhcndpbgorCisjIE11bHRpYXJjaCBkaXJlY3RvcnkgKG1heSBiZSBlbXB0eSkKK01VTFRJQVJDSD0JCisKKyMgSW5zdGFsbCBwcmVmaXggZm9yIGFyY2hpdGVjdHVyZS1pbmRlcGVuZGVudCBmaWxlcworcHJlZml4PQkJL3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0CisKKyMgSW5zdGFsbCBwcmVmaXggZm9yIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgZmlsZXMKK2V4ZWNfcHJlZml4PQkke3ByZWZpeH0KKworIyBJbnN0YWxsIHByZWZpeCBmb3IgZGF0YSBmaWxlcworZGF0YXJvb3RkaXI9ICAgICR7cHJlZml4fS9zaGFyZQorCisjIEV4cGFuZGVkIGRpcmVjdG9yaWVzCitCSU5ESVI9CQkke2V4ZWNfcHJlZml4fS9iaW4KK0xJQkRJUj0JCSR7ZXhlY19wcmVmaXh9L2xpYgorTUFORElSPQkJJHtkYXRhcm9vdGRpcn0vbWFuCitJTkNMVURFRElSPQkke3ByZWZpeH0vaW5jbHVkZQorQ09ORklOQ0xVREVESVI9CSQoZXhlY19wcmVmaXgpL2luY2x1ZGUKK1NDUklQVERJUj0JJChwcmVmaXgpL2xpYgorCisjIERldGFpbGVkIGRlc3RpbmF0aW9uIGRpcmVjdG9yaWVzCitCSU5MSUJERVNUPQkkKExJQkRJUikvcHl0aG9uJChWRVJTSU9OKQorTElCREVTVD0JJChTQ1JJUFRESVIpL3B5dGhvbiQoVkVSU0lPTikKK0lOQ0xVREVQWT0JJChJTkNMVURFRElSKS9weXRob24kKFZFUlNJT04pCitDT05GSU5DTFVERVBZPQkkKENPTkZJTkNMVURFRElSKS9weXRob24kKFZFUlNJT04pCitMSUJQPQkJJChMSUJESVIpL3B5dGhvbiQoVkVSU0lPTikKKworIyBTeW1ib2xzIHVzZWQgZm9yIHVzaW5nIHNoYXJlZCBsaWJyYXJpZXMKK1NPPQkJLnNvCitMRFNIQVJFRD0JeDg2XzY0LWFwcGxlLWRhcndpbi1nY2MgLWJ1bmRsZSAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwICQoTERGTEFHUykKK0JMRFNIQVJFRD0JeDg2XzY0LWFwcGxlLWRhcndpbi1nY2MgLWJ1bmRsZSAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwICQoTERGTEFHUykKK0xEQ1hYU0hBUkVEPQl4ODZfNjQtYXBwbGUtZGFyd2luLWdjYyAtYnVuZGxlIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAKK0RFU1RTSEFSRUQ9CSQoQklOTElCREVTVCkvbGliLWR5bmxvYWQKKworIyBFeGVjdXRhYmxlIHN1ZmZpeCAoLmV4ZSBvbiBXaW5kb3dzIGFuZCBNYWMgT1MgWCkKK0VYRT0JCQorQlVJTERFWEU9CQorCisjIFNob3J0IG5hbWUgYW5kIGxvY2F0aW9uIGZvciBNYWMgT1MgWCBQeXRob24gZnJhbWV3b3JrCitVTklWRVJTQUxTREs9CitQWVRIT05GUkFNRVdPUks9CQorUFlUSE9ORlJBTUVXT1JLRElSPQluby1mcmFtZXdvcmsKK1BZVEhPTkZSQU1FV09SS1BSRUZJWD0JCitQWVRIT05GUkFNRVdPUktJTlNUQUxMRElSPSAKKyMgRGVwbG95bWVudCB0YXJnZXQgc2VsZWN0ZWQgZHVyaW5nIGNvbmZpZ3VyZSwgdG8gYmUgY2hlY2tlZAorIyBieSBkaXN0dXRpbHMuIFRoZSBleHBvcnQgc3RhdGVtZW50IGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCB0aGUKKyMgZGVwbG95bWVudCB0YXJnZXQgaXMgYWN0aXZlIGR1cmluZyBidWlsZC4KK01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVD0xMC40CitleHBvcnQgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUCisKKyMgT3B0aW9ucyB0byBlbmFibGUgcHJlYmluZGluZyAoZm9yIGZhc3Qgc3RhcnR1cCBwcmlvciB0byBNYWMgT1MgWCAxMC4zKQorT1RIRVJfTElCVE9PTF9PUFQ9CisKKyMgRW52aXJvbm1lbnQgdG8gcnVuIHNoYXJlZCBweXRob24gd2l0aG91dCBpbnN0YWxsZWQgbGlicmFyaWVzCitSVU5TSEFSRUQ9ICAgICAgIAorCisjIE1vZGVzIGZvciBkaXJlY3RvcmllcywgZXhlY3V0YWJsZXMgYW5kIGRhdGEgZmlsZXMgY3JlYXRlZCBieSB0aGUKKyMgaW5zdGFsbCBwcm9jZXNzLiAgRGVmYXVsdCB0byB1c2VyLW9ubHktd3JpdGFibGUgZm9yIGFsbCBmaWxlIHR5cGVzLgorRElSTU9ERT0JNzU1CitFWEVNT0RFPQk3NTUKK0ZJTEVNT0RFPQk2NDQKKworIyBjb25maWd1cmUgc2NyaXB0IGFyZ3VtZW50cworQ09ORklHX0FSR1M9CSAnLS1wcmVmaXg9L3RtcC9uZGstVXNlci9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9kYXJ3aW4teDg2XzY0JyAnLS1idWlsZD14ODZfNjQtYXBwbGUtZGFyd2luJyAnLS1ob3N0PXg4Nl82NC1hcHBsZS1kYXJ3aW4nICctLXdpdGgtYnVpbGQtc3lzcm9vdCcgJy0tZGlzYWJsZS1pcHY2JyAnYnVpbGRfYWxpYXM9eDg2XzY0LWFwcGxlLWRhcndpbicgJ2hvc3RfYWxpYXM9eDg2XzY0LWFwcGxlLWRhcndpbicgJ0NDPXg4Nl82NC1hcHBsZS1kYXJ3aW4tZ2NjJyAnQ0ZMQUdTPS1PMiAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLXMnICdMREZMQUdTPScKKworCisjIFN1YmRpcmVjdG9yaWVzIHdpdGggY29kZQorU1JDRElSUz0gCVBhcnNlciBHcmFtbWFyIE9iamVjdHMgUHl0aG9uIE1vZHVsZXMgTWFjCisKKyMgT3RoZXIgc3ViZGlyZWN0b3JpZXMKK1NVQkRJUlNUT089CUluY2x1ZGUgTGliIE1pc2MgRGVtbworCisjIEZpbGVzIGFuZCBkaXJlY3RvcmllcyB0byBiZSBkaXN0cmlidXRlZAorQ09ORklHRklMRVM9CWNvbmZpZ3VyZSBjb25maWd1cmUuYWMgYWNjb25maWcuaCBweWNvbmZpZy5oLmluIE1ha2VmaWxlLnByZS5pbgorRElTVEZJTEVTPQlSRUFETUUgQ2hhbmdlTG9nICQoQ09ORklHRklMRVMpCitESVNURElSUz0JJChTVUJESVJTKSAkKFNVQkRJUlNUT08pIEV4dC1kdW1teQorRElTVD0JCSQoRElTVEZJTEVTKSAkKERJU1RESVJTKQorCisKK0xJQlJBUlk9CWxpYnB5dGhvbiQoVkVSU0lPTikuYQorTERMSUJSQVJZPSAgICAgIGxpYnB5dGhvbiQoVkVSU0lPTikuYQorQkxETElCUkFSWT0gICAgICQoTERMSUJSQVJZKQorRExMTElCUkFSWT0JCitMRExJQlJBUllESVI9ICAgCitJTlNUU09OQU1FPQkkKExETElCUkFSWSkKKworCitMSUJTPQkJLWxkbCAgLWZyYW1ld29yayBDb3JlRm91bmRhdGlvbgorTElCTT0JCQorTElCQz0JCQorU1lTTElCUz0JJChMSUJNKSAkKExJQkMpCitTSExJQlM9CQkkKExJQlMpCisKK1RIUkVBRE9CSj0JUHl0aG9uL3RocmVhZC5vCitETElOQ0xESVI9CS4KK0RZTkxPQURGSUxFPQlkeW5sb2FkX3NobGliLm8KK01BQ0hERVBfT0JKUz0JUHl0aG9uL21hY3Rvb2xib3hnbHVlLm8KK0xJQk9CSkRJUj0JUHl0aG9uLworTElCT0JKUz0JCitVTklDT0RFX09CSlM9ICAgT2JqZWN0cy91bmljb2Rlb2JqZWN0Lm8gT2JqZWN0cy91bmljb2RlY3R5cGUubworCitQWVRIT049CQlweXRob24kKEVYRSkKK0JVSUxEUFlUSE9OPQlweXRob24kKEJVSUxERVhFKQorCitQWVRIT05fRk9SX0JVSUxEPS4vJChCVUlMRFBZVEhPTikgLUUKK19QWVRIT05fSE9TVF9QTEFURk9STT0KK0hPU1RfR05VX1RZUEU9ICB4ODZfNjQtYXBwbGUtZGFyd2luCisKKyMgVGhlIHRhc2sgdG8gcnVuIHdoaWxlIGluc3RydW1lbnQgd2hlbiBidWlsZGluZyB0aGUgcHJvZmlsZS1vcHQgdGFyZ2V0CitQUk9GSUxFX1RBU0s9CSQoc3JjZGlyKS9Ub29scy9weWJlbmNoL3B5YmVuY2gucHkgLW4gMiAtLXdpdGgtZ2MgLS13aXRoLXN5c2NoZWNrCisjUFJPRklMRV9UQVNLPQkkKHNyY2RpcikvTGliL3Rlc3QvcmVncnRlc3QucHkKKworIyA9PT0gRGVmaW5pdGlvbnMgYWRkZWQgYnkgbWFrZXNldHVwID09PQorCitMT0NBTE1PRExJQlM9ICAgICAgICAgIAorQkFTRU1PRExJQlM9CitHTEhBQ0s9LURjbGVhcj1fX0dMY2xlYXIKK1BZVEhPTlBBVEg9JChDT1JFUFlUSE9OUEFUSCkKK0NPUkVQWVRIT05QQVRIPSQoREVTVFBBVEgpJChTSVRFUEFUSCkkKFRFU1RQQVRIKSQoTUFDSERFUFBBVEgpJChFWFRSQU1BQ0hERVBQQVRIKSQoVEtQQVRIKSQoT0xEUEFUSCkKK09MRFBBVEg9JChERUxJTSlsaWItb2xkCitUS1BBVEg9JChERUxJTSlsaWItdGsKK0VYVFJBTUFDSERFUFBBVEg9CitNQUNIREVQUEFUSD0kKERFTElNKXBsYXQtJChNQUNIREVQKQorVEVTVFBBVEg9CitTSVRFUEFUSD0KK0RFU1RQQVRIPQorTUFDSERFU1RMSUI9JChCSU5MSUJERVNUKQorREVTVExJQj0kKExJQkRFU1QpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgTW9kdWxlcworTU9EVUxFX09CSlM9CVwKKwkJTW9kdWxlcy9jb25maWcubyBcCisJCU1vZHVsZXMvZ2V0cGF0aC5vIFwKKwkJTW9kdWxlcy9tYWluLm8gXAorCQlNb2R1bGVzL2djbW9kdWxlLm8KKworIyBVc2VkIG9mIHNpZ25hbG1vZHVsZS5vIGlzIG5vdCBhdmFpbGFibGUKK1NJR05BTF9PQkpTPQkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBHcmFtbWFyCitHUkFNTUFSX0g9CUluY2x1ZGUvZ3JhbWluaXQuaAorR1JBTU1BUl9DPQlQeXRob24vZ3JhbWluaXQuYworR1JBTU1BUl9JTlBVVD0JJChzcmNkaXIpL0dyYW1tYXIvR3JhbW1hcgorCisKK0xJQkZGSV9JTkNMVURFRElSPQkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUGFyc2VyCitQR0VOPQkJUGFyc2VyL3BnZW4kKEVYRSkKKworUFNSQ1M9CQlcCisJCVBhcnNlci9hY2NlbGVyLmMgXAorCQlQYXJzZXIvZ3JhbW1hcjEuYyBcCisJCVBhcnNlci9saXN0bm9kZS5jIFwKKwkJUGFyc2VyL25vZGUuYyBcCisJCVBhcnNlci9wYXJzZXIuYyBcCisJCVBhcnNlci9wYXJzZXRvay5jIFwKKwkJUGFyc2VyL2JpdHNldC5jIFwKKwkJUGFyc2VyL21ldGFncmFtbWFyLmMgXAorCQlQYXJzZXIvZmlyc3RzZXRzLmMgXAorCQlQYXJzZXIvZ3JhbW1hci5jIFwKKwkJUGFyc2VyL3BnZW4uYworCitQT0JKUz0JCVwKKwkJUGFyc2VyL2FjY2VsZXIubyBcCisJCVBhcnNlci9ncmFtbWFyMS5vIFwKKwkJUGFyc2VyL2xpc3Rub2RlLm8gXAorCQlQYXJzZXIvbm9kZS5vIFwKKwkJUGFyc2VyL3BhcnNlci5vIFwKKwkJUGFyc2VyL3BhcnNldG9rLm8gXAorCQlQYXJzZXIvYml0c2V0Lm8gXAorCQlQYXJzZXIvbWV0YWdyYW1tYXIubyBcCisJCVBhcnNlci9maXJzdHNldHMubyBcCisJCVBhcnNlci9ncmFtbWFyLm8gXAorCQlQYXJzZXIvcGdlbi5vCisKK1BBUlNFUl9PQkpTPQkkKFBPQkpTKSBQYXJzZXIvbXlyZWFkbGluZS5vIFBhcnNlci90b2tlbml6ZXIubworCitQR1NSQ1M9CQlcCisJCU9iamVjdHMvb2JtYWxsb2MuYyBcCisJCVB5dGhvbi9teXNucHJpbnRmLmMgXAorCQlQeXRob24vcHljdHlwZS5jIFwKKwkJUGFyc2VyL3Rva2VuaXplcl9wZ2VuLmMgXAorCQlQYXJzZXIvcHJpbnRncmFtbWFyLmMgXAorCQlQYXJzZXIvcGdlbm1haW4uYworCitQR09CSlM9CQlcCisJCU9iamVjdHMvb2JtYWxsb2MubyBcCisJCVB5dGhvbi9teXNucHJpbnRmLm8gXAorCQlQeXRob24vcHljdHlwZS5vIFwKKwkJUGFyc2VyL3Rva2VuaXplcl9wZ2VuLm8gXAorCQlQYXJzZXIvcHJpbnRncmFtbWFyLm8gXAorCQlQYXJzZXIvcGdlbm1haW4ubworCitQQVJTRVJfSEVBREVSUz0gXAorCQlQYXJzZXIvcGFyc2VyLmggXAorCQlQYXJzZXIvdG9rZW5pemVyLmgKKworUEdFTlNSQ1M9CSQoUFNSQ1MpICQoUEdTUkNTKQorUEdFTk9CSlM9CSQoUE9CSlMpICQoUEdPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBU1QKK0FTVF9IX0RJUj0JSW5jbHVkZQorQVNUX0g9CQkkKEFTVF9IX0RJUikvUHl0aG9uLWFzdC5oCitBU1RfQ19ESVI9CVB5dGhvbgorQVNUX0M9CQkkKEFTVF9DX0RJUikvUHl0aG9uLWFzdC5jCitBU1RfQVNETD0JJChzcmNkaXIpL1BhcnNlci9QeXRob24uYXNkbAorCitBU0RMR0VOX0ZJTEVTPQkkKHNyY2RpcikvUGFyc2VyL2FzZGwucHkgJChzcmNkaXIpL1BhcnNlci9hc2RsX2MucHkKKyMgWFhYIE5vdGUgdGhhdCBhIGJ1aWxkIG5vdyByZXF1aXJlcyBQeXRob24gZXhpc3QgYmVmb3JlIHRoZSBidWlsZCBzdGFydHMKK0FTRExHRU49CSQoc3JjZGlyKS9QYXJzZXIvYXNkbF9jLnB5CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFB5dGhvbgorUFlUSE9OX09CSlM9CVwKKwkJUHl0aG9uL193YXJuaW5ncy5vIFwKKwkJUHl0aG9uL1B5dGhvbi1hc3QubyBcCisJCVB5dGhvbi9hc2RsLm8gXAorCQlQeXRob24vYXN0Lm8gXAorCQlQeXRob24vYmx0aW5tb2R1bGUubyBcCisJCVB5dGhvbi9jZXZhbC5vIFwKKwkJUHl0aG9uL2NvbXBpbGUubyBcCisJCVB5dGhvbi9jb2RlY3MubyBcCisJCVB5dGhvbi9lcnJvcnMubyBcCisJCVB5dGhvbi9mcm96ZW4ubyBcCisJCVB5dGhvbi9mcm96ZW5tYWluLm8gXAorCQlQeXRob24vZnV0dXJlLm8gXAorCQlQeXRob24vZ2V0YXJncy5vIFwKKwkJUHl0aG9uL2dldGNvbXBpbGVyLm8gXAorCQlQeXRob24vZ2V0Y29weXJpZ2h0Lm8gXAorCQlQeXRob24vZ2V0cGxhdGZvcm0ubyBcCisJCVB5dGhvbi9nZXR2ZXJzaW9uLm8gXAorCQlQeXRob24vZ3JhbWluaXQubyBcCisJCVB5dGhvbi9pbXBvcnQubyBcCisJCVB5dGhvbi9pbXBvcnRkbC5vIFwKKwkJUHl0aG9uL21hcnNoYWwubyBcCisJCVB5dGhvbi9tb2RzdXBwb3J0Lm8gXAorCQlQeXRob24vbXlzdHJ0b3VsLm8gXAorCQlQeXRob24vbXlzbnByaW50Zi5vIFwKKwkJUHl0aG9uL3BlZXBob2xlLm8gXAorCQlQeXRob24vcHlhcmVuYS5vIFwKKwkJUHl0aG9uL3B5Y3R5cGUubyBcCisJCVB5dGhvbi9weWZwZS5vIFwKKwkJUHl0aG9uL3B5bWF0aC5vIFwKKwkJUHl0aG9uL3B5c3RhdGUubyBcCisJCVB5dGhvbi9weXRob25ydW4ubyBcCisgICAgICAgICAgICAgICAgUHl0aG9uL3JhbmRvbS5vIFwKKwkJUHl0aG9uL3N0cnVjdG1lbWJlci5vIFwKKwkJUHl0aG9uL3N5bXRhYmxlLm8gXAorCQlQeXRob24vc3lzbW9kdWxlLm8gXAorCQlQeXRob24vdHJhY2ViYWNrLm8gXAorCQlQeXRob24vZ2V0b3B0Lm8gXAorCQlQeXRob24vcHlzdHJjbXAubyBcCisJCVB5dGhvbi9weXN0cnRvZC5vIFwKKwkJUHl0aG9uL2R0b2EubyBcCisJCVB5dGhvbi9mb3JtYXR0ZXJfdW5pY29kZS5vIFwKKwkJUHl0aG9uL2Zvcm1hdHRlcl9zdHJpbmcubyBcCisJCVB5dGhvbi8kKERZTkxPQURGSUxFKSBcCisJCSQoTElCT0JKUykgXAorCQkkKE1BQ0hERVBfT0JKUykgXAorCQkkKFRIUkVBRE9CSikKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBPYmplY3RzCitPQkpFQ1RfT0JKUz0JXAorCQlPYmplY3RzL2Fic3RyYWN0Lm8gXAorCQlPYmplY3RzL2Jvb2xvYmplY3QubyBcCisJCU9iamVjdHMvYnVmZmVyb2JqZWN0Lm8gXAorCQlPYmplY3RzL2J5dGVzX21ldGhvZHMubyBcCisJCU9iamVjdHMvYnl0ZWFycmF5b2JqZWN0Lm8gXAorCQlPYmplY3RzL2NhcHN1bGUubyBcCisJCU9iamVjdHMvY2VsbG9iamVjdC5vIFwKKwkJT2JqZWN0cy9jbGFzc29iamVjdC5vIFwKKwkJT2JqZWN0cy9jb2JqZWN0Lm8gXAorCQlPYmplY3RzL2NvZGVvYmplY3QubyBcCisJCU9iamVjdHMvY29tcGxleG9iamVjdC5vIFwKKwkJT2JqZWN0cy9kZXNjcm9iamVjdC5vIFwKKwkJT2JqZWN0cy9lbnVtb2JqZWN0Lm8gXAorCQlPYmplY3RzL2V4Y2VwdGlvbnMubyBcCisJCU9iamVjdHMvZ2Vub2JqZWN0Lm8gXAorCQlPYmplY3RzL2ZpbGVvYmplY3QubyBcCisJCU9iamVjdHMvZmxvYXRvYmplY3QubyBcCisJCU9iamVjdHMvZnJhbWVvYmplY3QubyBcCisJCU9iamVjdHMvZnVuY29iamVjdC5vIFwKKwkJT2JqZWN0cy9pbnRvYmplY3QubyBcCisJCU9iamVjdHMvaXRlcm9iamVjdC5vIFwKKwkJT2JqZWN0cy9saXN0b2JqZWN0Lm8gXAorCQlPYmplY3RzL2xvbmdvYmplY3QubyBcCisJCU9iamVjdHMvZGljdG9iamVjdC5vIFwKKwkJT2JqZWN0cy9tZW1vcnlvYmplY3QubyBcCisJCU9iamVjdHMvbWV0aG9kb2JqZWN0Lm8gXAorCQlPYmplY3RzL21vZHVsZW9iamVjdC5vIFwKKwkJT2JqZWN0cy9vYmplY3QubyBcCisJCU9iamVjdHMvb2JtYWxsb2MubyBcCisJCU9iamVjdHMvcmFuZ2VvYmplY3QubyBcCisJCU9iamVjdHMvc2V0b2JqZWN0Lm8gXAorCQlPYmplY3RzL3NsaWNlb2JqZWN0Lm8gXAorCQlPYmplY3RzL3N0cmluZ29iamVjdC5vIFwKKwkJT2JqZWN0cy9zdHJ1Y3RzZXEubyBcCisJCU9iamVjdHMvdHVwbGVvYmplY3QubyBcCisJCU9iamVjdHMvdHlwZW9iamVjdC5vIFwKKwkJT2JqZWN0cy93ZWFrcmVmb2JqZWN0Lm8gXAorCQkkKFVOSUNPREVfT0JKUykKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBvYmplY3RzIHRoYXQgZ2V0IGxpbmtlZCBpbnRvIHRoZSBQeXRob24gbGlicmFyeQorTElCUkFSWV9PQkpTPQlcCisJCU1vZHVsZXMvZ2V0YnVpbGRpbmZvLm8gXAorCQkkKFBBUlNFUl9PQkpTKSBcCisJCSQoT0JKRUNUX09CSlMpIFwKKwkJJChQWVRIT05fT0JKUykgXAorCQkkKE1PRFVMRV9PQkpTKSBcCisJCSQoU0lHTkFMX09CSlMpIFwKKwkJJChNT0RPQkpTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJ1bGVzCisKKyMgRGVmYXVsdCB0YXJnZXQKK2FsbDoJCWJ1aWxkX2FsbAorYnVpbGRfYWxsOgkkKEJVSUxEUFlUSE9OKSBvbGRzaGFyZWRtb2RzIHNoYXJlZG1vZHMgZ2RiaG9va3MKKworIyBDb21waWxlIGEgYmluYXJ5IHdpdGggZ2NjIHByb2ZpbGUgZ3VpZGVkIG9wdGltaXphdGlvbi4KK3Byb2ZpbGUtb3B0OgorCUBlY2hvICJCdWlsZGluZyB3aXRoIHN1cHBvcnQgZm9yIHByb2ZpbGUgZ2VuZXJhdGlvbjoiCisJJChNQUtFKSBjbGVhbgorCSQoTUFLRSkgYnVpbGRfYWxsX2dlbmVyYXRlX3Byb2ZpbGUKKwlAZWNobyAiUnVubmluZyBiZW5jaG1hcmsgdG8gZ2VuZXJhdGUgcHJvZmlsZSBkYXRhOiIKKwkkKE1BS0UpIHByb2ZpbGUtcmVtb3ZhbAorCSQoTUFLRSkgcnVuX3Byb2ZpbGVfdGFzaworCUBlY2hvICJSZWJ1aWxkaW5nIHdpdGggcHJvZmlsZSBndWlkZWQgb3B0aW1pemF0aW9uczoiCisJJChNQUtFKSBjbGVhbgorCSQoTUFLRSkgYnVpbGRfYWxsX3VzZV9wcm9maWxlCisKK2J1aWxkX2FsbF9nZW5lcmF0ZV9wcm9maWxlOgorCSQoTUFLRSkgYWxsIENGTEFHUz0iJChDRkxBR1MpIC1mcHJvZmlsZS1nZW5lcmF0ZSIgTElCUz0iJChMSUJTKSAtbGdjb3YiCisKK3J1bl9wcm9maWxlX3Rhc2s6CisJOiAjIEZJWE1FOiBjYW4ndCBydW4gZm9yIGEgY3Jvc3MgYnVpbGQKKwkuLyQoQlVJTERQWVRIT04pICQoUFJPRklMRV9UQVNLKQorCitidWlsZF9hbGxfdXNlX3Byb2ZpbGU6CisJJChNQUtFKSBhbGwgQ0ZMQUdTPSIkKENGTEFHUykgLWZwcm9maWxlLXVzZSIKKworY292ZXJhZ2U6CisJQGVjaG8gIkJ1aWxkaW5nIHdpdGggc3VwcG9ydCBmb3IgY292ZXJhZ2UgY2hlY2tpbmc6IgorCSQoTUFLRSkgY2xlYW4KKwkkKE1BS0UpIGFsbCBDRkxBR1M9IiQoQ0ZMQUdTKSAtTzAgLXBnIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZSIgTElCUz0iJChMSUJTKSAtbGdjb3YiCisKKworIyBCdWlsZCB0aGUgaW50ZXJwcmV0ZXIKKyQoQlVJTERQWVRIT04pOglNb2R1bGVzL3B5dGhvbi5vICQoTElCUkFSWSkgJChMRExJQlJBUlkpCisJCSQoTElOS0NDKSAkKExERkxBR1MpICQoTElOS0ZPUlNIQVJFRCkgLW8gJEAgXAorCQkJTW9kdWxlcy9weXRob24ubyBcCisJCQkkKEJMRExJQlJBUlkpICQoTElCUykgJChNT0RMSUJTKSAkKFNZU0xJQlMpICQoTERMQVNUKQorCitwbGF0Zm9ybTogJChCVUlMRFBZVEhPTikgcHlidWlsZGRpci50eHQKKwkkKFJVTlNIQVJFRCkgJChQWVRIT05fRk9SX0JVSUxEKSAtYyAnaW1wb3J0IHN5cyA7IGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcGxhdGZvcm0gOyBwcmludCBnZXRfcGxhdGZvcm0oKSsiLSIrc3lzLnZlcnNpb25bMDozXScgPnBsYXRmb3JtCisKKyMgQ3JlYXRlIGJ1aWxkIGRpcmVjdG9yeSBhbmQgZ2VuZXJhdGUgdGhlIHN5c2NvbmZpZyBidWlsZC10aW1lIGRhdGEgdGhlcmUuCisjIHB5YnVpbGRkaXIudHh0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBkaXIgYW5kIGlzIHVzZWQgZm9yCisjIHN5cy5wYXRoIGZpeHVwIC0tIHNlZSBNb2R1bGVzL2dldHBhdGguYy4KK3B5YnVpbGRkaXIudHh0OiAkKEJVSUxEUFlUSE9OKQorCQkkKFJVTlNIQVJFRCkgJChQWVRIT05fRk9SX0JVSUxEKSAtUyAtbSBzeXNjb25maWcgLS1nZW5lcmF0ZS1wb3NpeC12YXJzCisKKyMgQnVpbGQgdGhlIHNoYXJlZCBtb2R1bGVzCisjIFVuZGVyIEdOVSBtYWtlLCBNQUtFRkxBR1MgYXJlIHNvcnRlZCBhbmQgbm9ybWFsaXplZDsgdGhlICdzJyBmb3IKKyMgLXMsIC0tc2lsZW50IG9yIC0tcXVpZXQgaXMgYWx3YXlzIHRoZSBmaXJzdCBjaGFyLgorIyBVbmRlciBCU0QgbWFrZSwgTUFLRUZMQUdTIG1pZ2h0IGJlICIgLXMgLXYgeD15Ii4KK3NoYXJlZG1vZHM6ICQoQlVJTERQWVRIT04pIHB5YnVpbGRkaXIudHh0CisJQGNhc2UgIiQkTUFLRUZMQUdTIiBpbiBcCisJICAgICpcIC1zKnxzKikgcXVpZXQ9Ii1xIjs7IFwKKwkgICAgKikgcXVpZXQ9IiI7OyBcCisJZXNhYzsgXAorCSQoUlVOU0hBUkVEKSBDQz0nJChDQyknIExEU0hBUkVEPSckKEJMRFNIQVJFRCknIE9QVD0nJChPUFQpJyBcCisJCSQoUFlUSE9OX0ZPUl9CVUlMRCkgJChzcmNkaXIpL3NldHVwLnB5ICQkcXVpZXQgYnVpbGQKKworIyBCdWlsZCBzdGF0aWMgbGlicmFyeQorIyBhdm9pZCBsb25nIGNvbW1hbmQgbGluZXMsIHNhbWUgYXMgTElCUkFSWV9PQkpTCiskKExJQlJBUlkpOiAkKExJQlJBUllfT0JKUykKKwktcm0gLWYgJEAKKwkkKEFSKSAkKEFSRkxBR1MpICRAIE1vZHVsZXMvZ2V0YnVpbGRpbmZvLm8KKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoUEFSU0VSX09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE9CSkVDVF9PQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChQWVRIT05fT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoTU9EVUxFX09CSlMpICQoU0lHTkFMX09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE1PRE9CSlMpCisJJChSQU5MSUIpICRACisKK2xpYnB5dGhvbiQoVkVSU0lPTikuc286ICQoTElCUkFSWV9PQkpTKQorCWlmIHRlc3QgJChJTlNUU09OQU1FKSAhPSAkKExETElCUkFSWSk7IHRoZW4gXAorCQkkKEJMRFNIQVJFRCkgLVdsLC1oJChJTlNUU09OQU1FKSAtbyAkKElOU1RTT05BTUUpICQoTElCUkFSWV9PQkpTKSAkKE1PRExJQlMpICQoU0hMSUJTKSAkKExJQkMpICQoTElCTSkgJChMRExBU1QpOyBcCisJCSQoTE4pIC1mICQoSU5TVFNPTkFNRSkgJEA7IFwKKwllbHNlIFwKKwkJJChCTERTSEFSRUQpIC1vICRAICQoTElCUkFSWV9PQkpTKSAkKE1PRExJQlMpICQoU0hMSUJTKSAkKExJQkMpICQoTElCTSkgJChMRExBU1QpOyBcCisJZmkKKworbGlicHl0aG9uJChWRVJTSU9OKS5keWxpYjogJChMSUJSQVJZX09CSlMpCisJICQoQ0MpIC1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSAkKExERkxBR1MpIC11bmRlZmluZWQgZHluYW1pY19sb29rdXAgLVdsLC1pbnN0YWxsX25hbWUsJChwcmVmaXgpL2xpYi9saWJweXRob24kKFZFUlNJT04pLmR5bGliIC1XbCwtY29tcGF0aWJpbGl0eV92ZXJzaW9uLCQoVkVSU0lPTikgLVdsLC1jdXJyZW50X3ZlcnNpb24sJChWRVJTSU9OKSAtbyAkQCAkKExJQlJBUllfT0JKUykgJChTSExJQlMpICQoTElCQykgJChMSUJNKSAkKExETEFTVCk7IFwKKworCitsaWJweXRob24kKFZFUlNJT04pLnNsOiAkKExJQlJBUllfT0JKUykKKwkkKExEU0hBUkVEKSAtbyAkQCAkKExJQlJBUllfT0JKUykgJChNT0RMSUJTKSAkKFNITElCUykgJChMSUJDKSAkKExJQk0pICQoTERMQVNUKQorCisjIENvcHkgdXAgdGhlIGdkYiBweXRob24gaG9va3MgaW50byBhIHBvc2l0aW9uIHdoZXJlIHRoZXkgY2FuIGJlIGF1dG9tYXRpY2FsbHkKKyMgbG9hZGVkIGJ5IGdkYiBkdXJpbmcgTGliL3Rlc3QvdGVzdF9nZGIucHkKKyMKKyMgRGlzdHJpYnV0b3JzIGFyZSBsaWtlbHkgdG8gd2FudCB0byBpbnN0YWxsIHRoaXMgc29tZXdoZXJlIGVsc2UgZS5nLiByZWxhdGl2ZQorIyB0byB0aGUgc3RyaXBwZWQgRFdBUkYgZGF0YSBmb3IgdGhlIHNoYXJlZCBsaWJyYXJ5LgorZ2RiaG9va3M6ICQoQlVJTERQWVRIT04pLWdkYi5weQorCitTUkNfR0RCX0hPT0tTPSQoc3JjZGlyKS9Ub29scy9nZGIvbGlicHl0aG9uLnB5CiskKEJVSUxEUFlUSE9OKS1nZGIucHk6ICQoU1JDX0dEQl9IT09LUykKKwkkKElOU1RBTExfREFUQSkgJChTUkNfR0RCX0hPT0tTKSAkKEJVSUxEUFlUSE9OKS1nZGIucHkKKworIyBUaGlzIHJ1bGUgaXMgaGVyZSBmb3IgT1BFTlNURVAvUmhhcHNvZHkvTWFjT1NYLiBJdCBidWlsZHMgYSB0ZW1wb3JhcnkKKyMgbWluaW1hbCBmcmFtZXdvcmsgKG5vdCBpbmNsdWRpbmcgdGhlIExpYiBkaXJlY3RvcnkgYW5kIHN1Y2gpIGluIHRoZSBjdXJyZW50CisjIGRpcmVjdG9yeS4KK1JFU1NSQ0RJUj1NYWMvUmVzb3VyY2VzL2ZyYW1ld29yaworJChQWVRIT05GUkFNRVdPUktESVIpL1ZlcnNpb25zLyQoVkVSU0lPTikvJChQWVRIT05GUkFNRVdPUkspOiBcCisJCSQoTElCUkFSWSkgXAorCQkkKFJFU1NSQ0RJUikvSW5mby5wbGlzdAorCSQoSU5TVEFMTCkgLWQgLW0gJChESVJNT0RFKSAkKFBZVEhPTkZSQU1FV09SS0RJUikvVmVyc2lvbnMvJChWRVJTSU9OKQorCSQoQ0MpIC1vICQoTERMSUJSQVJZKSAkKExERkxBR1MpICAtZHluYW1pY2xpYiBcCisJCS1hbGxfbG9hZCAkKExJQlJBUlkpIC1XbCwtc2luZ2xlX21vZHVsZSBcCisJCS1pbnN0YWxsX25hbWUgJChERVNURElSKSQoUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUikvVmVyc2lvbnMvJChWRVJTSU9OKS8kKFBZVEhPTkZSQU1FV09SSykgXAorCQktY29tcGF0aWJpbGl0eV92ZXJzaW9uICQoVkVSU0lPTikgXAorCQktY3VycmVudF92ZXJzaW9uICQoVkVSU0lPTik7CisJJChJTlNUQUxMKSAtZCAtbSAkKERJUk1PREUpICBcCisJCSQoUFlUSE9ORlJBTUVXT1JLRElSKS9WZXJzaW9ucy8kKFZFUlNJT04pL1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qCisJJChJTlNUQUxMX0RBVEEpICQoUkVTU1JDRElSKS9JbmZvLnBsaXN0IFwKKwkJJChQWVRIT05GUkFNRVdPUktESVIpL1ZlcnNpb25zLyQoVkVSU0lPTikvUmVzb3VyY2VzL0luZm8ucGxpc3QKKwkkKExOKSAtZnNuICQoVkVSU0lPTikgJChQWVRIT05GUkFNRVdPUktESVIpL1ZlcnNpb25zL0N1cnJlbnQKKwkkKExOKSAtZnNuIFZlcnNpb25zL0N1cnJlbnQvJChQWVRIT05GUkFNRVdPUkspICQoUFlUSE9ORlJBTUVXT1JLRElSKS8kKFBZVEhPTkZSQU1FV09SSykKKwkkKExOKSAtZnNuIFZlcnNpb25zL0N1cnJlbnQvSGVhZGVycyAkKFBZVEhPTkZSQU1FV09SS0RJUikvSGVhZGVycworCSQoTE4pIC1mc24gVmVyc2lvbnMvQ3VycmVudC9SZXNvdXJjZXMgJChQWVRIT05GUkFNRVdPUktESVIpL1Jlc291cmNlcworCisjIFRoaXMgcnVsZSBidWlsZHMgdGhlIEN5Z3dpbiBQeXRob24gRExMIGFuZCBpbXBvcnQgbGlicmFyeSBpZiBjb25maWd1cmVkCisjIGZvciBhIHNoYXJlZCBjb3JlIGxpYnJhcnk7IG90aGVyd2lzZSwgdGhpcyBydWxlIGlzIGEgbm9vcC4KKyQoRExMTElCUkFSWSkgbGlicHl0aG9uJChWRVJTSU9OKS5kbGwuYTogJChMSUJSQVJZX09CSlMpCisJaWYgdGVzdCAtbiAiJChETExMSUJSQVJZKSI7IHRoZW4gXAorCQkkKExEU0hBUkVEKSAtV2wsLS1vdXQtaW1wbGliPSRAIC1vICQoRExMTElCUkFSWSkgJF4gXAorCQkJJChMSUJTKSAkKE1PRExJQlMpICQoU1lTTElCUykgJChMRExBU1QpOyBcCisJZWxzZSB0cnVlOyBcCisJZmkKKworCitvbGRzaGFyZWRtb2RzOiAkKFNIQVJFRE1PRFMpCisKKworTWFrZWZpbGUgTW9kdWxlcy9jb25maWcuYzogTWFrZWZpbGUucHJlIFwKKwkJCQkkKHNyY2RpcikvTW9kdWxlcy9jb25maWcuYy5pbiBcCisJCQkJJChNQUtFU0VUVVApIFwKKwkJCQlNb2R1bGVzL1NldHVwLmNvbmZpZyBcCisJCQkJTW9kdWxlcy9TZXR1cCBcCisJCQkJTW9kdWxlcy9TZXR1cC5sb2NhbAorCSQoU0hFTEwpICQoTUFLRVNFVFVQKSAtYyAkKHNyY2RpcikvTW9kdWxlcy9jb25maWcuYy5pbiBcCisJCQkJLXMgTW9kdWxlcyBcCisJCQkJTW9kdWxlcy9TZXR1cC5jb25maWcgXAorCQkJCU1vZHVsZXMvU2V0dXAubG9jYWwgXAorCQkJCU1vZHVsZXMvU2V0dXAKKwlAbXYgY29uZmlnLmMgTW9kdWxlcworCUBlY2hvICJUaGUgTWFrZWZpbGUgd2FzIHVwZGF0ZWQsIHlvdSBtYXkgbmVlZCB0byByZS1ydW4gbWFrZS4iCisKKworTW9kdWxlcy9TZXR1cDogJChzcmNkaXIpL01vZHVsZXMvU2V0dXAuZGlzdAorCUBpZiB0ZXN0IC1mIE1vZHVsZXMvU2V0dXA7IHRoZW4gXAorCQllY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSI7IFwKKwkJZWNobyAiTW9kdWxlcy9TZXR1cC5kaXN0IGlzIG5ld2VyIHRoYW4gTW9kdWxlcy9TZXR1cDsiOyBcCisJCWVjaG8gImNoZWNrIHRvIG1ha2Ugc3VyZSB5b3UgaGF2ZSBhbGwgdGhlIHVwZGF0ZXMgeW91IjsgXAorCQllY2hvICJuZWVkIGluIHlvdXIgTW9kdWxlcy9TZXR1cCBmaWxlLiI7IFwKKwkJZWNobyAiVXN1YWxseSwgY29weWluZyBNb2R1bGVzL1NldHVwLmRpc3QgdG8gTW9kdWxlcy9TZXR1cCB3aWxsIHdvcmsuIjsgXAorCQllY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSI7IFwKKwlmaQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNwZWNpYWwgcnVsZXMgZm9yIG9iamVjdCBmaWxlcworCitNb2R1bGVzL2dldGJ1aWxkaW5mby5vOiAkKFBBUlNFUl9PQkpTKSBcCisJCSQoT0JKRUNUX09CSlMpIFwKKwkJJChQWVRIT05fT0JKUykgXAorCQkkKE1PRFVMRV9PQkpTKSBcCisJCSQoU0lHTkFMX09CSlMpIFwKKwkJJChNT0RPQkpTKSBcCisJCSQoc3JjZGlyKS9Nb2R1bGVzL2dldGJ1aWxkaW5mby5jCisJJChDQykgLWMgJChQWV9DRkxBR1MpIFwKKwkgICAgICAtRFNWTlZFUlNJT049IlwiYExDX0FMTD1DICQoU1ZOVkVSU0lPTilgXCIiIFwKKwkgICAgICAtREhHVkVSU0lPTj0iXCJgTENfQUxMPUMgJChIR1ZFUlNJT04pYFwiIiBcCisJICAgICAgLURIR1RBRz0iXCJgTENfQUxMPUMgJChIR1RBRylgXCIiIFwKKwkgICAgICAtREhHQlJBTkNIPSJcImBMQ19BTEw9QyAkKEhHQlJBTkNIKWBcIiIgXAorCSAgICAgIC1vICRAICQoc3JjZGlyKS9Nb2R1bGVzL2dldGJ1aWxkaW5mby5jCisKKyMgZGVmYXVsdCBzeXMucGF0aCBjYWxjdWxhdGlvbnMKK01vZHVsZXMvZ2V0cGF0aC5vOiAkKHNyY2RpcikvTW9kdWxlcy9nZXRwYXRoLmMgTWFrZWZpbGUKKwkkKENDKSAtYyAkKFBZX0NGTEFHUykgLURQWVRIT05QQVRIPSciJChQWVRIT05QQVRIKSInIFwKKwkJLURQUkVGSVg9JyIkKHByZWZpeCkiJyBcCisJCS1ERVhFQ19QUkVGSVg9JyIkKGV4ZWNfcHJlZml4KSInIFwKKwkJLURWRVJTSU9OPSciJChWRVJTSU9OKSInIFwKKwkJLURWUEFUSD0nIiQoTVNZU1ZQQVRIKSInIFwKKwkJLW8gJEAgJChzcmNkaXIpL01vZHVsZXMvZ2V0cGF0aC5jCisKKyMgZGVmYXVsdCBzeXMucGF0aCBjYWxjdWxhdGlvbnMgZm9yIHdpbmRvd3MgcGxhdGZvcm1zCitQQy9nZXRwYXRocC5vOiAkKHNyY2RpcikvUEMvZ2V0cGF0aHAuYworCSQoQ0MpIC1jICQoUFlfQ0ZMQUdTKSAtbyAkQCAkKHNyY2RpcikvUEMvZ2V0cGF0aHAuYworCitNb2R1bGVzL3B5dGhvbi5vOiAkKHNyY2RpcikvTW9kdWxlcy9weXRob24uYworCSQoTUFJTkNDKSAtYyAkKFBZX0NGTEFHUykgLW8gJEAgJChzcmNkaXIpL01vZHVsZXMvcHl0aG9uLmMKKworTW9kdWxlcy9wb3NpeG1vZHVsZS5vOiAkKHNyY2RpcikvTW9kdWxlcy9wb3NpeG1vZHVsZS5jICQoc3JjZGlyKS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmgKKworTW9kdWxlcy9ncnBtb2R1bGUubzogJChzcmNkaXIpL01vZHVsZXMvZ3JwbW9kdWxlLmMgJChzcmNkaXIpL01vZHVsZXMvcG9zaXhtb2R1bGUuaAorCitNb2R1bGVzL3B3ZG1vZHVsZS5vOiAkKHNyY2RpcikvTW9kdWxlcy9wd2Rtb2R1bGUuYyAkKHNyY2RpcikvTW9kdWxlcy9wb3NpeG1vZHVsZS5oCisKKyQoR1JBTU1BUl9IKTogJChHUkFNTUFSX0lOUFVUKSAkKFBHRU5TUkNTKQorCQlAJChNS0RJUl9QKSBJbmNsdWRlCisJCSQoTUFLRSkgJChQR0VOKQorCQkkKFBHRU4pICQoR1JBTU1BUl9JTlBVVCkgJChHUkFNTUFSX0gpICQoR1JBTU1BUl9DKQorJChHUkFNTUFSX0MpOiAkKEdSQU1NQVJfSCkgJChHUkFNTUFSX0lOUFVUKSAkKFBHRU5TUkNTKQorCQkkKE1BS0UpICQoR1JBTU1BUl9IKQorCQl0b3VjaCAkKEdSQU1NQVJfQykKKworJChQR0VOKToJJChQR0VOT0JKUykKKwkJJChDQykgJChPUFQpICQoTERGTEFHUykgJChQR0VOT0JKUykgJChMSUJTKSAtbyAkKFBHRU4pCisKK1BhcnNlci9ncmFtbWFyLm86CSQoc3JjZGlyKS9QYXJzZXIvZ3JhbW1hci5jIFwKKwkJCQkkKHNyY2RpcikvSW5jbHVkZS90b2tlbi5oIFwKKwkJCQkkKHNyY2RpcikvSW5jbHVkZS9ncmFtbWFyLmgKK1BhcnNlci9tZXRhZ3JhbW1hci5vOgkkKHNyY2RpcikvUGFyc2VyL21ldGFncmFtbWFyLmMKKworUGFyc2VyL3Rva2VuaXplcl9wZ2VuLm86CSQoc3JjZGlyKS9QYXJzZXIvdG9rZW5pemVyLmMKKworUGFyc2VyL3BnZW5tYWluLm86CSQoc3JjZGlyKS9JbmNsdWRlL3BhcnNldG9rLmgKKworJChBU1RfSCk6ICQoQVNUX0FTREwpICQoQVNETEdFTl9GSUxFUykKKwkkKE1LRElSX1ApICQoQVNUX0hfRElSKQorCSQoQVNETEdFTikgLWggJChBU1RfSF9ESVIpICQoQVNUX0FTREwpCisKKyQoQVNUX0MpOiAkKEFTVF9BU0RMKSAkKEFTRExHRU5fRklMRVMpCisJJChNS0RJUl9QKSAkKEFTVF9DX0RJUikKKwkkKEFTRExHRU4pIC1jICQoQVNUX0NfRElSKSAkKEFTVF9BU0RMKQorCitQeXRob24vY29tcGlsZS5vIFB5dGhvbi9zeW10YWJsZS5vIFB5dGhvbi9hc3QubzogJChHUkFNTUFSX0gpICQoQVNUX0gpCisKK1B5dGhvbi9nZXRwbGF0Zm9ybS5vOiAkKHNyY2RpcikvUHl0aG9uL2dldHBsYXRmb3JtLmMKKwkJJChDQykgLWMgJChQWV9DRkxBR1MpIC1EUExBVEZPUk09JyIkKE1BQ0hERVApIicgLW8gJEAgJChzcmNkaXIpL1B5dGhvbi9nZXRwbGF0Zm9ybS5jCisKK1B5dGhvbi9pbXBvcnRkbC5vOiAkKHNyY2RpcikvUHl0aG9uL2ltcG9ydGRsLmMKKwkJJChDQykgLWMgJChQWV9DRkxBR1MpIC1JJChETElOQ0xESVIpIC1vICRAICQoc3JjZGlyKS9QeXRob24vaW1wb3J0ZGwuYworCitPYmplY3RzL3VuaWNvZGVjdHlwZS5vOgkkKHNyY2RpcikvT2JqZWN0cy91bmljb2RlY3R5cGUuYyBcCisJCQkJJChzcmNkaXIpL09iamVjdHMvdW5pY29kZXR5cGVfZGIuaAorCitTVFJJTkdMSUJfSEVBREVSUz0gXAorCQkkKHNyY2RpcikvSW5jbHVkZS9ieXRlc19tZXRob2RzLmggXAorCQkkKHNyY2RpcikvT2JqZWN0cy9zdHJpbmdsaWIvY291bnQuaCBcCisJCSQoc3JjZGlyKS9PYmplY3RzL3N0cmluZ2xpYi9jdHlwZS5oIFwKKwkJJChzcmNkaXIpL09iamVjdHMvc3RyaW5nbGliL2Zhc3RzZWFyY2guaCBcCisJCSQoc3JjZGlyKS9PYmplY3RzL3N0cmluZ2xpYi9maW5kLmggXAorCQkkKHNyY2RpcikvT2JqZWN0cy9zdHJpbmdsaWIvZm9ybWF0dGVyLmggXAorCQkkKHNyY2RpcikvT2JqZWN0cy9zdHJpbmdsaWIvcGFydGl0aW9uLmggXAorCQkkKHNyY2RpcikvT2JqZWN0cy9zdHJpbmdsaWIvc3BsaXQuaCBcCisJCSQoc3JjZGlyKS9PYmplY3RzL3N0cmluZ2xpYi9zdHJpbmdkZWZzLmggXAorCQkkKHNyY2RpcikvT2JqZWN0cy9zdHJpbmdsaWIvc3RyaW5nX2Zvcm1hdC5oIFwKKwkJJChzcmNkaXIpL09iamVjdHMvc3RyaW5nbGliL3RyYW5zbW9ncmlmeS5oIFwKKwkJJChzcmNkaXIpL09iamVjdHMvc3RyaW5nbGliL3VuaWNvZGVkZWZzLmggXAorCQkkKHNyY2RpcikvT2JqZWN0cy9zdHJpbmdsaWIvbG9jYWxldXRpbC5oCisKK09iamVjdHMvdW5pY29kZW9iamVjdC5vOiAkKHNyY2RpcikvT2JqZWN0cy91bmljb2Rlb2JqZWN0LmMgXAorCQkJCSQoU1RSSU5HTElCX0hFQURFUlMpCisKK09iamVjdHMvYnl0ZWFycmF5b2JqZWN0Lm86ICQoc3JjZGlyKS9PYmplY3RzL2J5dGVhcnJheW9iamVjdC5jIFwKKwkJCQkkKFNUUklOR0xJQl9IRUFERVJTKQorCitPYmplY3RzL3N0cmluZ29iamVjdC5vOiAkKHNyY2RpcikvT2JqZWN0cy9zdHJpbmdvYmplY3QuYyBcCisJCQkJJChTVFJJTkdMSUJfSEVBREVSUykKKworUHl0aG9uL2Zvcm1hdHRlcl91bmljb2RlLm86ICQoc3JjZGlyKS9QeXRob24vZm9ybWF0dGVyX3VuaWNvZGUuYyBcCisJCQkJJChTVFJJTkdMSUJfSEVBREVSUykKKworUHl0aG9uL2Zvcm1hdHRlcl9zdHJpbmcubzogJChzcmNkaXIpL1B5dGhvbi9mb3JtYXR0ZXJfc3RyaW5nLmMgXAorCQkJCSQoU1RSSU5HTElCX0hFQURFUlMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgSGVhZGVyIGZpbGVzCisKK1BZVEhPTl9IRUFERVJTPSBcCisJCUluY2x1ZGUvUHl0aG9uLWFzdC5oIFwKKwkJSW5jbHVkZS9QeXRob24uaCBcCisJCUluY2x1ZGUvYWJzdHJhY3QuaCBcCisJCUluY2x1ZGUvYXNkbC5oIFwKKwkJSW5jbHVkZS9hc3QuaCBcCisJCUluY2x1ZGUvYml0c2V0LmggXAorCQlJbmNsdWRlL2Jvb2xvYmplY3QuaCBcCisJCUluY2x1ZGUvYnl0ZWFycmF5b2JqZWN0LmggXAorCQlJbmNsdWRlL2J5dGVzX21ldGhvZHMuaCBcCisJCUluY2x1ZGUvYnl0ZXNvYmplY3QuaCBcCisJCUluY2x1ZGUvYnVmZmVyb2JqZWN0LmggXAorCQlJbmNsdWRlL2NlbGxvYmplY3QuaCBcCisJCUluY2x1ZGUvY2V2YWwuaCBcCisJCUluY2x1ZGUvY2xhc3NvYmplY3QuaCBcCisJCUluY2x1ZGUvY29iamVjdC5oIFwKKwkJSW5jbHVkZS9jb2RlLmggXAorCQlJbmNsdWRlL2NvZGVjcy5oIFwKKwkJSW5jbHVkZS9jb21waWxlLmggXAorCQlJbmNsdWRlL2NvbXBsZXhvYmplY3QuaCBcCisJCUluY2x1ZGUvZGVzY3JvYmplY3QuaCBcCisJCUluY2x1ZGUvZGljdG9iamVjdC5oIFwKKwkJSW5jbHVkZS9kdG9hLmggXAorCQlJbmNsdWRlL2VudW1vYmplY3QuaCBcCisJCUluY2x1ZGUvZXJyY29kZS5oIFwKKwkJSW5jbHVkZS9ldmFsLmggXAorCQlJbmNsdWRlL2ZpbGVvYmplY3QuaCBcCisJCUluY2x1ZGUvZmxvYXRvYmplY3QuaCBcCisJCUluY2x1ZGUvZnJhbWVvYmplY3QuaCBcCisJCUluY2x1ZGUvZnVuY29iamVjdC5oIFwKKwkJSW5jbHVkZS9nZW5vYmplY3QuaCBcCisJCUluY2x1ZGUvaW1wb3J0LmggXAorCQlJbmNsdWRlL2ludG9iamVjdC5oIFwKKwkJSW5jbHVkZS9pbnRyY2hlY2suaCBcCisJCUluY2x1ZGUvaXRlcm9iamVjdC5oIFwKKwkJSW5jbHVkZS9saXN0b2JqZWN0LmggXAorCQlJbmNsdWRlL2xvbmdpbnRyZXByLmggXAorCQlJbmNsdWRlL2xvbmdvYmplY3QuaCBcCisJCUluY2x1ZGUvbWFyc2hhbC5oIFwKKwkJSW5jbHVkZS9tZW1vcnlvYmplY3QuaCBcCisJCUluY2x1ZGUvbWV0YWdyYW1tYXIuaCBcCisJCUluY2x1ZGUvbWV0aG9kb2JqZWN0LmggXAorCQlJbmNsdWRlL21vZHN1cHBvcnQuaCBcCisJCUluY2x1ZGUvbW9kdWxlb2JqZWN0LmggXAorCQlJbmNsdWRlL25vZGUuaCBcCisJCUluY2x1ZGUvb2JqZWN0LmggXAorCQlJbmNsdWRlL29iamltcGwuaCBcCisJCUluY2x1ZGUvb3Bjb2RlLmggXAorCQlJbmNsdWRlL29zZGVmcy5oIFwKKwkJSW5jbHVkZS9wYXJzZXRvay5oIFwKKwkJSW5jbHVkZS9wYXRjaGxldmVsLmggXAorCQlJbmNsdWRlL3BnZW4uaCBcCisJCUluY2x1ZGUvcGdlbmhlYWRlcnMuaCBcCisJCUluY2x1ZGUvcHlhcmVuYS5oIFwKKwkJSW5jbHVkZS9weWNhcHN1bGUuaCBcCisJCUluY2x1ZGUvcHljdHlwZS5oIFwKKwkJSW5jbHVkZS9weWRlYnVnLmggXAorCQlJbmNsdWRlL3B5ZXJyb3JzLmggXAorCQlJbmNsdWRlL3B5ZnBlLmggXAorCQlJbmNsdWRlL3B5bWF0aC5oIFwKKwkJSW5jbHVkZS9weWdldG9wdC5oIFwKKwkJSW5jbHVkZS9weW1lbS5oIFwKKwkJSW5jbHVkZS9weXBvcnQuaCBcCisJCUluY2x1ZGUvcHlzdGF0ZS5oIFwKKwkJSW5jbHVkZS9weXN0cmNtcC5oIFwKKwkJSW5jbHVkZS9weXN0cnRvZC5oIFwKKwkJSW5jbHVkZS9weXRob25ydW4uaCBcCisJCUluY2x1ZGUvcHl0aHJlYWQuaCBcCisJCUluY2x1ZGUvcmFuZ2VvYmplY3QuaCBcCisJCUluY2x1ZGUvc2V0b2JqZWN0LmggXAorCQlJbmNsdWRlL3NsaWNlb2JqZWN0LmggXAorCQlJbmNsdWRlL3N0cmluZ29iamVjdC5oIFwKKwkJSW5jbHVkZS9zdHJ1Y3RtZW1iZXIuaCBcCisJCUluY2x1ZGUvc3RydWN0c2VxLmggXAorCQlJbmNsdWRlL3N5bXRhYmxlLmggXAorCQlJbmNsdWRlL3N5c21vZHVsZS5oIFwKKwkJSW5jbHVkZS90cmFjZWJhY2suaCBcCisJCUluY2x1ZGUvdHVwbGVvYmplY3QuaCBcCisJCUluY2x1ZGUvdWNuaGFzaC5oIFwKKwkJSW5jbHVkZS91bmljb2Rlb2JqZWN0LmggXAorCQlJbmNsdWRlL3dhcm5pbmdzLmggXAorCQlJbmNsdWRlL3dlYWtyZWZvYmplY3QuaCBcCisJCXB5Y29uZmlnLmggXAorCQkkKFBBUlNFUl9IRUFERVJTKQorCiskKExJQlJBUllfT0JKUykgJChNT0RPQkpTKSBNb2R1bGVzL3B5dGhvbi5vOiAkKFBZVEhPTl9IRUFERVJTKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUZXN0IHRoZSBpbnRlcnByZXRlciAodHdpY2UsIG9uY2Ugd2l0aG91dCAucHljIGZpbGVzLCBvbmNlIHdpdGgpCisjIEluIHRoZSBwYXN0LCB3ZSd2ZSBoYWQgcHJvYmxlbXMgd2hlcmUgYnVncyBpbiB0aGUgbWFyc2hhbGxpbmcgb3IKKyMgZWxzZXdoZXJlIGNhdXNlZCBieXRlY29kZSByZWFkIGZyb20gLnB5YyBmaWxlcyB0byBiZWhhdmUgZGlmZmVyZW50bHkKKyMgdGhhbiBieXRlY29kZSBnZW5lcmF0ZWQgZGlyZWN0bHkgZnJvbSBhIC5weSBzb3VyY2UgZmlsZS4gIFNvbWV0aW1lcworIyB0aGUgYnl0ZWNvZGUgcmVhZCBmcm9tIGEgLnB5YyBmaWxlIGhhZCB0aGUgYnVnLCBzb21ldGltZXMgdGhlIGRpcmVjdGx5CisjIGdlbmVyYXRlZCBieXRlY29kZS4gIFRoaXMgaXMgc29tZXRpbWVzIGEgdmVyeSBzaHkgYnVnIG5lZWRpbmcgYSBsb3Qgb2YKKyMgc2FtcGxlIGRhdGEuCisKK1RFU1RPUFRTPQktbCAkKEVYVFJBVEVTVE9QVFMpCitURVNUUFJPRz0JJChzcmNkaXIpL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CitURVNUUFlUSE9OPQkkKFJVTlNIQVJFRCkgLi8kKEJVSUxEUFlUSE9OKSAtV2QgLTMgLUUgLXR0ICQoVEVTVFBZVEhPTk9QVFMpCit0ZXN0OgkJYWxsIHBsYXRmb3JtCisJCS1maW5kICQoc3JjZGlyKS9MaWIgLW5hbWUgJyoucHlbY29dJyAtcHJpbnQgfCB4YXJncyBybSAtZgorCQktJChURVNUUFlUSE9OKSAkKFRFU1RQUk9HKSAkKFRFU1RPUFRTKQorCQkkKFRFU1RQWVRIT04pICQoVEVTVFBST0cpICQoVEVTVE9QVFMpCisKK3Rlc3RhbGw6CWFsbCBwbGF0Zm9ybQorCQktZmluZCAkKHNyY2RpcikvTGliIC1uYW1lICcqLnB5W2NvXScgLXByaW50IHwgeGFyZ3Mgcm0gLWYKKwkJJChURVNUUFlUSE9OKSAkKHNyY2RpcikvTGliL2NvbXBpbGVhbGwucHkKKwkJLWZpbmQgJChzcmNkaXIpL0xpYiAtbmFtZSAnKi5weVtjb10nIC1wcmludCB8IHhhcmdzIHJtIC1mCisJCS0kKFRFU1RQWVRIT04pICQoVEVTVFBST0cpIC11YWxsICQoVEVTVE9QVFMpCisJCSQoVEVTVFBZVEhPTikgJChURVNUUFJPRykgLXVhbGwgJChURVNUT1BUUykKKworIyAgUnVuIHRoZSB1bml0ZXN0cyBmb3IgYm90aCBhcmNoaXRlY3R1cmVzIGluIGEgVW5pdmVyc2FsIGJ1aWxkIG9uIE9TWAorIyAgTXVzdCBiZSBydW4gb24gYW4gSW50ZWwgYm94LgordGVzdHVuaXZlcnNhbDoJYWxsIHBsYXRmb3JtCisJCWlmIFsgYGFyY2hgICE9ICdpMzg2JyBdO3RoZW4gXAorCQkJZWNobyAiVGhpcyBjYW4gb25seSBiZSB1c2VkIG9uIE9TWC9pMzg2IiA7XAorCQkJZXhpdCAxIDtcCisJCWZpCisJCS1maW5kICQoc3JjZGlyKS9MaWIgLW5hbWUgJyoucHlbY29dJyAtcHJpbnQgfCB4YXJncyBybSAtZgorCQktJChURVNUUFlUSE9OKSAkKFRFU1RQUk9HKSAtdWFsbCAkKFRFU1RPUFRTKQorCQkkKFRFU1RQWVRIT04pICQoVEVTVFBST0cpIC11YWxsICQoVEVTVE9QVFMpCisJCSQoUlVOU0hBUkVEKSAvdXNyL2xpYmV4ZWMvb2FoL3RyYW5zbGF0ZSAuLyQoQlVJTERQWVRIT04pIC1FIC10dCAkKFRFU1RQUk9HKSAtdWFsbCAkKFRFU1RPUFRTKQorCisKKyMgTGlrZSB0ZXN0YWxsLCBidXQgd2l0aCBhIHNpbmdsZSBwYXNzIG9ubHkKKyMgcnVuIGFuIG9wdGlvbmFsIHNjcmlwdCB0byBpbmNsdWRlIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJ1aWxkIGVudmlyb25tZW50CitidWlsZGJvdHRlc3Q6CWFsbCBwbGF0Zm9ybQorCQktQGlmIHdoaWNoIHB5YnVpbGRib3QuaWRlbnRpZnkgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkJCXB5YnVpbGRib3QuaWRlbnRpZnkgIkNDPSckKENDKSciICJDWFg9JyQoQ1hYKSciOyBcCisJCWZpCisJCSQoVEVTVFBZVEhPTikgLVIgJChURVNUUFJPRykgLXVhbGwgLXJ3VyAkKFRFU1RPUFRTKQorCitRVUlDS1RFU1RPUFRTPQkkKFRFU1RPUFRTKSAteCB0ZXN0X3N1YnByb2Nlc3MgdGVzdF9pbyB0ZXN0X2xpYjJ0bzMgXAorCQl0ZXN0X211bHRpYnl0ZWNvZGVjIHRlc3RfdXJsbGliMl9sb2NhbG5ldCB0ZXN0X2l0ZXJ0b29scyBcCisJCXRlc3RfbXVsdGlwcm9jZXNzaW5nIHRlc3RfbWFpbGJveCB0ZXN0X3NvY2tldCB0ZXN0X3BvbGwgXAorCQl0ZXN0X3NlbGVjdCB0ZXN0X3ppcGZpbGUKK3F1aWNrdGVzdDoJYWxsIHBsYXRmb3JtCisJCS1maW5kICQoc3JjZGlyKS9MaWIgLW5hbWUgJyoucHlbY29dJyAtcHJpbnQgfCB4YXJncyBybSAtZgorCQktJChURVNUUFlUSE9OKSAkKFRFU1RQUk9HKSAkKFFVSUNLVEVTVE9QVFMpCisJCSQoVEVTVFBZVEhPTikgJChURVNUUFJPRykgJChRVUlDS1RFU1RPUFRTKQorCitNRU1URVNUT1BUUz0gICAgJChRVUlDS1RFU1RPUFRTKSAteCB0ZXN0X2RsIHRlc3RfX19hbGxfXyB0ZXN0X2ZvcmsxIFwKKwkJdGVzdF9sb25nZXhwCittZW10ZXN0OglhbGwgcGxhdGZvcm0KKwkJLXJtIC1mICQoc3JjZGlyKS9MaWIvdGVzdC8qLnB5W2NvXQorCQktJChURVNUUFlUSE9OKSAkKFRFU1RQUk9HKSAkKE1FTVRFU1RPUFRTKQorCQkkKFRFU1RQWVRIT04pICQoVEVTVFBST0cpICQoTUVNVEVTVE9QVFMpCisKKyMgSW5zdGFsbCBldmVyeXRoaW5nCitpbnN0YWxsOgkgYWx0aW5zdGFsbCBiaW5pbnN0YWxsIG1hbmluc3RhbGwgCisKKyMgSW5zdGFsbCBhbG1vc3QgZXZlcnl0aGluZyB3aXRob3V0IGRpc3R1cmJpbmcgcHJldmlvdXMgdmVyc2lvbnMKK2FsdGluc3RhbGw6CSBhbHRiaW5pbnN0YWxsIGxpYmluc3RhbGwgaW5jbGluc3RhbGwgXAorCQkJCWxpYmFpbnN0YWxsIGFsdG1hbmluc3RhbGwgXAorICAgICAgICAgICAgICAgIHNoYXJlZGluc3RhbGwgb2xkc2hhcmVkaW5zdGFsbCAKKworIyBJbnN0YWxsIHNoYXJlZCBsaWJyYXJpZXMgZW5hYmxlZCBieSBTZXR1cAorREVTVERJUlM9CSQoZXhlY19wcmVmaXgpICQoTElCRElSKSAkKEJJTkxJQkRFU1QpICQoREVTVFNIQVJFRCkKKworb2xkc2hhcmVkaW5zdGFsbDogJChERVNUU0hBUkVEKSAkKFNIQVJFRE1PRFMpCisJCUBmb3IgaSBpbiBYICQoU0hBUkVETU9EUyk7IGRvIFwKKwkJICBpZiB0ZXN0ICQkaSAhPSBYOyB0aGVuIFwKKwkJICAgIGVjaG8gJChJTlNUQUxMX1NIQVJFRCkgJCRpICQoREVTVFNIQVJFRCkvYGJhc2VuYW1lICQkaWA7IFwKKwkJICAgICQoSU5TVEFMTF9TSEFSRUQpICQkaSAkKERFU1RESVIpJChERVNUU0hBUkVEKS9gYmFzZW5hbWUgJCRpYDsgXAorCQkgIGZpOyBcCisJCWRvbmUKKworJChERVNUU0hBUkVEKToKKwkJQGZvciBpIGluICQoREVTVERJUlMpOyBcCisJCWRvIFwKKwkJCWlmIHRlc3QgISAtZCAkKERFU1RESVIpJCRpOyB0aGVuIFwKKwkJCQllY2hvICJDcmVhdGluZyBkaXJlY3RvcnkgJCRpIjsgXAorCQkJCSQoSU5TVEFMTCkgLWQgLW0gJChESVJNT0RFKSAkKERFU1RESVIpJCRpOyBcCisJCQllbHNlICAgIHRydWU7IFwKKwkJCWZpOyBcCisJCWRvbmUKKworCisjIEluc3RhbGwgdGhlIGludGVycHJldGVyIGJ5IGNyZWF0aW5nIGEgc3ltbGluayBjaGFpbjoKKyMgICQoUFlUSE9OKSAtPiBweXRob24yIC0+IHB5dGhvbiQoVkVSU0lPTikpCisjIEFsc28gY3JlYXRlIGVxdWl2YWxlbnQgY2hhaW5zIGZvciBvdGhlciBpbnN0YWxsZWQgZmlsZXMKK2Jpbmluc3RhbGw6CWFsdGJpbmluc3RhbGwKKwktaWYgdGVzdCAtZiAkKERFU1RESVIpJChCSU5ESVIpLyQoUFlUSE9OKSAtbyAtaCAkKERFU1RESVIpJChCSU5ESVIpLyQoUFlUSE9OKTsgXAorCXRoZW4gcm0gLWYgJChERVNURElSKSQoQklORElSKS8kKFBZVEhPTik7IFwKKwllbHNlIHRydWU7IFwKKwlmaQorCS1ybSAtZiAkKERFU1RESVIpJChCSU5ESVIpL3B5dGhvbjIkKEVYRSkKKwkoY2QgJChERVNURElSKSQoQklORElSKTsgJChMTikgLXMgcHl0aG9uJChWRVJTSU9OKSQoRVhFKSBweXRob24yJChFWEUpKQorCShjZCAkKERFU1RESVIpJChCSU5ESVIpOyAkKExOKSAtcyBweXRob24yJChFWEUpICQoUFlUSE9OKSkKKwktcm0gLWYgJChERVNURElSKSQoQklORElSKS9weXRob24yLWNvbmZpZworCShjZCAkKERFU1RESVIpJChCSU5ESVIpOyAkKExOKSAtcyBweXRob24kKFZFUlNJT04pLWNvbmZpZyBweXRob24yLWNvbmZpZykKKwktcm0gLWYgJChERVNURElSKSQoQklORElSKS9weXRob24tY29uZmlnCisJKGNkICQoREVTVERJUikkKEJJTkRJUik7ICQoTE4pIC1zIHB5dGhvbjItY29uZmlnIHB5dGhvbi1jb25maWcpCisJLXRlc3QgLWQgJChERVNURElSKSQoTElCUEMpIHx8ICQoSU5TVEFMTCkgLWQgLW0gJChESVJNT0RFKSAkKERFU1RESVIpJChMSUJQQykKKwktcm0gLWYgJChERVNURElSKSQoTElCUEMpL3B5dGhvbjIucGMKKwkoY2QgJChERVNURElSKSQoTElCUEMpOyAkKExOKSAtcyBweXRob24tJChWRVJTSU9OKS5wYyBweXRob24yLnBjKQorCS1ybSAtZiAkKERFU1RESVIpJChMSUJQQykvcHl0aG9uLnBjCisJKGNkICQoREVTVERJUikkKExJQlBDKTsgJChMTikgLXMgcHl0aG9uMi5wYyBweXRob24ucGMpCisKKyMgSW5zdGFsbCB0aGUgaW50ZXJwcmV0ZXIgd2l0aCAkKFZFUlNJT04pIGFmZml4ZWQKKyMgVGhpcyBnb2VzIGludG8gJChleGVjX3ByZWZpeCkKK2FsdGJpbmluc3RhbGw6CSQoQlVJTERQWVRIT04pCisJQGZvciBpIGluICQoQklORElSKSAkKExJQkRJUik7IFwKKwlkbyBcCisJCWlmIHRlc3QgISAtZCAkKERFU1RESVIpJCRpOyB0aGVuIFwKKwkJCWVjaG8gIkNyZWF0aW5nIGRpcmVjdG9yeSAkJGkiOyBcCisJCQkkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgJChERVNURElSKSQkaTsgXAorCQllbHNlCXRydWU7IFwKKwkJZmk7IFwKKwlkb25lCisJJChJTlNUQUxMX1BST0dSQU0pICQoQlVJTERQWVRIT04pICQoREVTVERJUikkKEJJTkRJUikvcHl0aG9uJChWRVJTSU9OKSQoRVhFKQorCWlmIHRlc3QgLWYgJChMRExJQlJBUlkpOyB0aGVuIFwKKwkJaWYgdGVzdCAtbiAiJChETExMSUJSQVJZKSIgOyB0aGVuIFwKKwkJCSQoSU5TVEFMTF9TSEFSRUQpICQoRExMTElCUkFSWSkgJChERVNURElSKSQoQklORElSKTsgXAorCQkJbWtkaXIgLXAgJChERVNURElSKSQoTElCUEwpOyAkKElOU1RBTExfU0hBUkVEKSAkKExETElCUkFSWSkgJChERVNURElSKSQoTElCUEwpOyBcCisJCWVsc2UgXAorCQkJJChJTlNUQUxMX1NIQVJFRCkgJChMRExJQlJBUlkpICQoREVTVERJUikkKExJQkRJUikvJChJTlNUU09OQU1FKTsgXAorCQkJaWYgdGVzdCAkKExETElCUkFSWSkgIT0gJChJTlNUU09OQU1FKTsgdGhlbiBcCisJCQkJKGNkICQoREVTVERJUikkKExJQkRJUik7ICQoTE4pIC1zZiAkKElOU1RTT05BTUUpICQoTERMSUJSQVJZKSkgXAorCQkJZmkgXAorCQlmaTsgXAorCWVsc2UJdHJ1ZTsgXAorCWZpCisKKyMgSW5zdGFsbCB0aGUgdmVyc2lvbmVkIG1hbnVhbCBwYWdlCithbHRtYW5pbnN0YWxsOgorCUBmb3IgaSBpbiAkKE1BTkRJUikgJChNQU5ESVIpL21hbjE7IFwKKwlkbyBcCisJCWlmIHRlc3QgISAtZCAkKERFU1RESVIpJCRpOyB0aGVuIFwKKwkJCWVjaG8gIkNyZWF0aW5nIGRpcmVjdG9yeSAkJGkiOyBcCisJCQkkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgJChERVNURElSKSQkaTsgXAorCQllbHNlCXRydWU7IFwKKwkJZmk7IFwKKwlkb25lCisJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9NaXNjL3B5dGhvbi5tYW4gXAorCQkkKERFU1RESVIpJChNQU5ESVIpL21hbjEvcHl0aG9uJChWRVJTSU9OKS4xCisKKyMgSW5zdGFsbCB0aGUgdW52ZXJzaW9uZWQgbWFudWFsIHBhZ2VzCittYW5pbnN0YWxsOglhbHRtYW5pbnN0YWxsCisJLXJtIC1mICQoREVTVERJUikkKE1BTkRJUikvbWFuMS9weXRob24yLjEKKwkoY2QgJChERVNURElSKSQoTUFORElSKS9tYW4xOyAkKExOKSAtcyBweXRob24kKFZFUlNJT04pLjEgcHl0aG9uMi4xKQorCS1ybSAtZiAkKERFU1RESVIpJChNQU5ESVIpL21hbjEvcHl0aG9uLjEKKwkoY2QgJChERVNURElSKSQoTUFORElSKS9tYW4xOyAkKExOKSAtcyBweXRob24yLjEgcHl0aG9uLjEpCisKKyMgSW5zdGFsbCB0aGUgbGlicmFyeQorUExBVERJUj0JcGxhdC0kKE1BQ0hERVApCitFWFRSQVBMQVRESVI9ICQoUExBVE1BQ0RJUlMpCitFWFRSQU1BQ0hERVBQQVRIPSQoUExBVE1BQ1BBVEgpCitNQUNIREVQUz0JJChQTEFURElSKSAkKEVYVFJBUExBVERJUikKK1hNTExJQlNVQkRJUlM9ICB4bWwgeG1sL2RvbSB4bWwvZXRyZWUgeG1sL3BhcnNlcnMgeG1sL3NheAorUExBVE1BQ0RJUlM9IHBsYXQtbWFjIHBsYXQtbWFjL0NhcmJvbiBwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMgXAorCXBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcyBcCisJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yIFwKKwlwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIgXAorCXBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIgXAorCXBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZSBcCisJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcyBcCisJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cyBcCisJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsCitQTEFUTUFDUEFUSD06cGxhdC1tYWM6cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzCitMSUJTVUJESVJTPQlsaWItdGsgbGliLXRrL3Rlc3QgbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyIFwKKwkJbGliLXRrL3Rlc3QvdGVzdF90dGsgc2l0ZS1wYWNrYWdlcyB0ZXN0IHRlc3QvZGF0YSBcCisJCXRlc3QvY2prZW5jb2RpbmdzIHRlc3QvZGVjaW1hbHRlc3RkYXRhIHRlc3QveG1sdGVzdGRhdGEgdGVzdC9zdWJwcm9jZXNzZGF0YSBcCisJCXRlc3QvdHJhY2VkbW9kdWxlcyBcCisJCWVuY29kaW5ncyBjb21waWxlciBob3RzaG90IFwKKwkJZW1haWwgZW1haWwvbWltZSBlbWFpbC90ZXN0IGVtYWlsL3Rlc3QvZGF0YSBcCisJCWpzb24ganNvbi90ZXN0cyBcCisJCXNxbGl0ZTMgc3FsaXRlMy90ZXN0IFwKKwkJbG9nZ2luZyBic2RkYiBic2RkYi90ZXN0IGNzdiBpbXBvcnRsaWIgd3NnaXJlZiBcCisJCWxpYjJ0bzMgbGliMnRvMy9maXhlcyBsaWIydG8zL3BnZW4yIGxpYjJ0bzMvdGVzdHMgXAorCQlsaWIydG8zL3Rlc3RzL2RhdGEgbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycyBsaWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL215Zml4ZXMgXAorCQljdHlwZXMgY3R5cGVzL3Rlc3QgY3R5cGVzL21hY2hvbGliIGlkbGVsaWIgaWRsZWxpYi9JY29ucyBcCisJCWRpc3R1dGlscyBkaXN0dXRpbHMvY29tbWFuZCBkaXN0dXRpbHMvdGVzdHMgJChYTUxMSUJTVUJESVJTKSBcCisJCW11bHRpcHJvY2Vzc2luZyBtdWx0aXByb2Nlc3NpbmcvZHVtbXkgXAorCQl1bml0dGVzdCB1bml0dGVzdC90ZXN0IFwKKwkJbGliLW9sZCBcCisJCWN1cnNlcyBweWRvY19kYXRhICQoTUFDSERFUFMpCitsaWJpbnN0YWxsOglidWlsZF9hbGwgJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpICQoc3JjZGlyKS9Nb2R1bGVzL3h4bW9kdWxlLmMKKwlAZm9yIGkgaW4gJChTQ1JJUFRESVIpICQoTElCREVTVCk7IFwKKwlkbyBcCisJCWlmIHRlc3QgISAtZCAkKERFU1RESVIpJCRpOyB0aGVuIFwKKwkJCWVjaG8gIkNyZWF0aW5nIGRpcmVjdG9yeSAkJGkiOyBcCisJCQkkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgJChERVNURElSKSQkaTsgXAorCQllbHNlCXRydWU7IFwKKwkJZmk7IFwKKwlkb25lCisJQGZvciBkIGluICQoTElCU1VCRElSUyk7IFwKKwlkbyBcCisJCWE9JChzcmNkaXIpL0xpYi8kJGQ7IFwKKwkJaWYgdGVzdCAhIC1kICQkYTsgdGhlbiBjb250aW51ZTsgZWxzZSB0cnVlOyBmaTsgXAorCQliPSQoTElCREVTVCkvJCRkOyBcCisJCWlmIHRlc3QgISAtZCAkKERFU1RESVIpJCRiOyB0aGVuIFwKKwkJCWVjaG8gIkNyZWF0aW5nIGRpcmVjdG9yeSAkJGIiOyBcCisJCQkkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgJChERVNURElSKSQkYjsgXAorCQllbHNlCXRydWU7IFwKKwkJZmk7IFwKKwlkb25lCisJQGZvciBpIGluICQoc3JjZGlyKS9MaWIvKi5weSBgY2F0IHB5YnVpbGRkaXIudHh0YC9fc3lzY29uZmlnZGF0YS5weSAkKHNyY2RpcikvTGliLyouZG9jICQoc3JjZGlyKS9MaWIvKi5lZ2ctaW5mbyA7IFwKKwlkbyBcCisJCWlmIHRlc3QgLXggJCRpOyB0aGVuIFwKKwkJCSQoSU5TVEFMTF9TQ1JJUFQpICQkaSAkKERFU1RESVIpJChMSUJERVNUKTsgXAorCQkJZWNobyAkKElOU1RBTExfU0NSSVBUKSAkJGkgJChMSUJERVNUKTsgXAorCQllbHNlIFwKKwkJCSQoSU5TVEFMTF9EQVRBKSAkJGkgJChERVNURElSKSQoTElCREVTVCk7IFwKKwkJCWVjaG8gJChJTlNUQUxMX0RBVEEpICQkaSAkKExJQkRFU1QpOyBcCisJCWZpOyBcCisJZG9uZQorCUBmb3IgZCBpbiAkKExJQlNVQkRJUlMpOyBcCisJZG8gXAorCQlhPSQoc3JjZGlyKS9MaWIvJCRkOyBcCisJCWlmIHRlc3QgISAtZCAkJGE7IHRoZW4gY29udGludWU7IGVsc2UgdHJ1ZTsgZmk7IFwKKwkJaWYgdGVzdCBgbHMgJCRhIHwgd2MgLWxgIC1sdCAxOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQliPSQoTElCREVTVCkvJCRkOyBcCisJCWZvciBpIGluICQkYS8qOyBcCisJCWRvIFwKKwkJCWNhc2UgJCRpIGluIFwKKwkJCSpDVlMpIDs7IFwKKwkJCSoucHlbY29dKSA7OyBcCisJCQkqLm9yaWcpIDs7IFwKKwkJCSp+KSA7OyBcCisJCQkqKSBcCisJCQkJaWYgdGVzdCAtZCAkJGk7IHRoZW4gY29udGludWU7IGZpOyBcCisJCQkJaWYgdGVzdCAteCAkJGk7IHRoZW4gXAorCQkJCSAgICBlY2hvICQoSU5TVEFMTF9TQ1JJUFQpICQkaSAkJGI7IFwKKwkJCQkgICAgJChJTlNUQUxMX1NDUklQVCkgJCRpICQoREVTVERJUikkJGI7IFwKKwkJCQllbHNlIFwKKwkJCQkgICAgZWNobyAkKElOU1RBTExfREFUQSkgJCRpICQkYjsgXAorCQkJCSAgICAkKElOU1RBTExfREFUQSkgJCRpICQoREVTVERJUikkJGI7IFwKKwkJCQlmaTs7IFwKKwkJCWVzYWM7IFwKKwkJZG9uZTsgXAorCWRvbmUKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL0xJQ0VOU0UgJChERVNURElSKSQoTElCREVTVCkvTElDRU5TRS50eHQKKwlpZiB0ZXN0IC1kICQoREVTVERJUikkKExJQkRFU1QpL2Rpc3R1dGlscy90ZXN0czsgdGhlbiBcCisJCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTW9kdWxlcy94eG1vZHVsZS5jIFwKKwkJCSQoREVTVERJUikkKExJQkRFU1QpL2Rpc3R1dGlscy90ZXN0cyA7IFwKKwlmaQorCVBZVEhPTlBBVEg9JChERVNURElSKSQoTElCREVTVCkgICQoUlVOU0hBUkVEKSBcCisJCSQoUFlUSE9OX0ZPUl9CVUlMRCkgLVdpIC10dCAkKERFU1RESVIpJChMSUJERVNUKS9jb21waWxlYWxsLnB5IFwKKwkJLWQgJChMSUJERVNUKSAtZiBcCisJCS14ICdiYWRfY29kaW5nfGJhZHN5bnRheHxzaXRlLXBhY2thZ2VzfGxpYjJ0bzMvdGVzdHMvZGF0YScgXAorCQkkKERFU1RESVIpJChMSUJERVNUKQorCVBZVEhPTlBBVEg9JChERVNURElSKSQoTElCREVTVCkgJChSVU5TSEFSRUQpIFwKKwkJJChQWVRIT05fRk9SX0JVSUxEKSAtV2kgLXR0IC1PICQoREVTVERJUikkKExJQkRFU1QpL2NvbXBpbGVhbGwucHkgXAorCQktZCAkKExJQkRFU1QpIC1mIFwKKwkJLXggJ2JhZF9jb2Rpbmd8YmFkc3ludGF4fHNpdGUtcGFja2FnZXN8bGliMnRvMy90ZXN0cy9kYXRhJyBcCisJCSQoREVTVERJUikkKExJQkRFU1QpCisJLVBZVEhPTlBBVEg9JChERVNURElSKSQoTElCREVTVCkgICQoUlVOU0hBUkVEKSBcCisJCSQoUFlUSE9OX0ZPUl9CVUlMRCkgLVdpIC10ICQoREVTVERJUikkKExJQkRFU1QpL2NvbXBpbGVhbGwucHkgXAorCQktZCAkKExJQkRFU1QpL3NpdGUtcGFja2FnZXMgLWYgXAorCQkteCBiYWRzeW50YXggJChERVNURElSKSQoTElCREVTVCkvc2l0ZS1wYWNrYWdlcworCS1QWVRIT05QQVRIPSQoREVTVERJUikkKExJQkRFU1QpICQoUlVOU0hBUkVEKSBcCisJCSQoUFlUSE9OX0ZPUl9CVUlMRCkgLVdpIC10IC1PICQoREVTVERJUikkKExJQkRFU1QpL2NvbXBpbGVhbGwucHkgXAorCQktZCAkKExJQkRFU1QpL3NpdGUtcGFja2FnZXMgLWYgXAorCQkteCBiYWRzeW50YXggJChERVNURElSKSQoTElCREVTVCkvc2l0ZS1wYWNrYWdlcworCS1QWVRIT05QQVRIPSQoREVTVERJUikkKExJQkRFU1QpICQoUlVOU0hBUkVEKSBcCisJCSQoUFlUSE9OX0ZPUl9CVUlMRCkgLW0gbGliMnRvMy5wZ2VuMi5kcml2ZXIgJChERVNURElSKSQoTElCREVTVCkvbGliMnRvMy9HcmFtbWFyLnR4dAorCS1QWVRIT05QQVRIPSQoREVTVERJUikkKExJQkRFU1QpICQoUlVOU0hBUkVEKSBcCisJCSQoUFlUSE9OX0ZPUl9CVUlMRCkgLW0gbGliMnRvMy5wZ2VuMi5kcml2ZXIgJChERVNURElSKSQoTElCREVTVCkvbGliMnRvMy9QYXR0ZXJuR3JhbW1hci50eHQKKworIyBDcmVhdGUgdGhlIFBMQVRESVIgc291cmNlIGRpcmVjdG9yeSwgaWYgb25lIHdhc24ndCBkaXN0cmlidXRlZC4uCiskKHNyY2RpcikvTGliLyQoUExBVERJUik6CisJbWtkaXIgJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpCisJY3AgJChzcmNkaXIpL0xpYi9wbGF0LWdlbmVyaWMvcmVnZW4gJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpL3JlZ2VuCisJZXhwb3J0IFBBVEg7IFBBVEg9ImBwd2RgOiQkUEFUSCI7IFwKKwlleHBvcnQgUFlUSE9OUEFUSDsgUFlUSE9OUEFUSD0iJChzcmNkaXIpL0xpYjokKGFic19idWlsZGRpcikvYGNhdCBweWJ1aWxkZGlyLnR4dGAiOyBcCisJZXhwb3J0IERZTERfRlJBTUVXT1JLX1BBVEg7IERZTERfRlJBTUVXT1JLX1BBVEg9ImBwd2RgIjsgXAorCWV4cG9ydCBFWEU7IEVYRT0iJChCVUlMREVYRSkiOyBcCisJaWYgWyAtbiAiJChNVUxUSUFSQ0gpIiBdOyB0aGVuIGV4cG9ydCBNVUxUSUFSQ0g7IE1VTFRJQVJDSD0kKE1VTFRJQVJDSCk7IGZpOyBcCisJZXhwb3J0IFBZVEhPTl9GT1JfQlVJTEQ7IFwKKwlpZiBbICIkKGJ1aWxkKSIgPSAiJChob3N0KSIgXTsgdGhlbiBcCisJICBQWVRIT05fRk9SX0JVSUxEPSIkKEJVSUxEUFlUSE9OKSI7IFwKKwllbHNlIFwKKwkgIFBZVEhPTl9GT1JfQlVJTEQ9IiQoUFlUSE9OX0ZPUl9CVUlMRCkiOyBcCisJZmk7IFwKKwljZCAkKHNyY2RpcikvTGliLyQoUExBVERJUik7ICQoUlVOU0hBUkVEKSAuL3JlZ2VuICIkKENDKSIKKworcHl0aG9uLWNvbmZpZzogJChzcmNkaXIpL01pc2MvcHl0aG9uLWNvbmZpZy5pbgorCSMgU3Vic3RpdHV0aW9uIGhhcHBlbnMgaGVyZSwgYXMgdGhlIGNvbXBsZXRlbHktZXhwYW5kZWQgQklORElSCisJIyBpcyBub3QgYXZhaWxhYmxlIGluIGNvbmZpZ3VyZQorCXNlZCAtZSAicyxARVhFTkFNRUAsJChCSU5ESVIpL3B5dGhvbiQoVkVSU0lPTikkKEVYRSksIiA8ICQoc3JjZGlyKS9NaXNjL3B5dGhvbi1jb25maWcuaW4gPnB5dGhvbi1jb25maWcKKwkjIFJlcGxhY2UgbWFrZWZpbGUgY29tcGF0LiB2YXJpYWJsZSByZWZlcmVuY2VzIHdpdGggc2hlbGwgc2NyaXB0IGNvbXBhdC4gb25lczsgJChWQVIpIC0+ICR7VkFSfQorCXNlZCAtZSAicyxcJCQoXChbQS1aYS16MC05X10qXCkpLFwkJFx7XDFcfSxnIiA8IE1pc2MvcHl0aG9uLWNvbmZpZy5zaCA+cHl0aG9uLWNvbmZpZy5zaAorCisjIEluc3RhbGwgdGhlIGluY2x1ZGUgZmlsZXMKK0lOQ0xESVJTVE9NQUtFPSQoSU5DTFVERURJUikgJChDT05GSU5DTFVERURJUikgJChJTkNMVURFUFkpICQoQ09ORklOQ0xVREVQWSkKK2luY2xpbnN0YWxsOgorCUBmb3IgaSBpbiAkKElOQ0xESVJTVE9NQUtFKTsgXAorCWRvIFwKKwkJaWYgdGVzdCAhIC1kICQoREVTVERJUikkJGk7IHRoZW4gXAorCQkJZWNobyAiQ3JlYXRpbmcgZGlyZWN0b3J5ICQkaSI7IFwKKwkJCSQoSU5TVEFMTCkgLWQgLW0gJChESVJNT0RFKSAkKERFU1RESVIpJCRpOyBcCisJCWVsc2UJdHJ1ZTsgXAorCQlmaTsgXAorCWRvbmUKKwlAZm9yIGkgaW4gJChzcmNkaXIpL0luY2x1ZGUvKi5oOyBcCisJZG8gXAorCQllY2hvICQoSU5TVEFMTF9EQVRBKSAkJGkgJChJTkNMVURFUFkpOyBcCisJCSQoSU5TVEFMTF9EQVRBKSAkJGkgJChERVNURElSKSQoSU5DTFVERVBZKTsgXAorCWRvbmUKKwkkKElOU1RBTExfREFUQSkgcHljb25maWcuaCAkKERFU1RESVIpJChDT05GSU5DTFVERVBZKS9weWNvbmZpZy5oCisKKyMgSW5zdGFsbCB0aGUgbGlicmFyeSBhbmQgbWlzY2VsbGFuZW91cyBzdHVmZiBuZWVkZWQgZm9yIGV4dGVuZGluZy9lbWJlZGRpbmcKKyMgVGhpcyBnb2VzIGludG8gJChleGVjX3ByZWZpeCkKK0xJQlBMPQkJJChMSUJQKS9jb25maWcKKworIyBwa2djb25maWcgZGlyZWN0b3J5CitMSUJQQz0JCSQoTElCRElSKS9wa2djb25maWcKKworbGliYWluc3RhbGw6CWFsbCBweXRob24tY29uZmlnCisJQGZvciBpIGluICQoTElCRElSKSAkKExJQlApICQoTElCUEwpICQoTElCUEMpOyBcCisJZG8gXAorCQlpZiB0ZXN0ICEgLWQgJChERVNURElSKSQkaTsgdGhlbiBcCisJCQllY2hvICJDcmVhdGluZyBkaXJlY3RvcnkgJCRpIjsgXAorCQkJJChJTlNUQUxMKSAtZCAtbSAkKERJUk1PREUpICQoREVTVERJUikkJGk7IFwKKwkJZWxzZQl0cnVlOyBcCisJCWZpOyBcCisJZG9uZQorCUBpZiB0ZXN0IC1kICQoTElCUkFSWSk7IHRoZW4gOjsgZWxzZSBcCisJCWlmIHRlc3QgIiQoUFlUSE9ORlJBTUVXT1JLRElSKSIgPSBuby1mcmFtZXdvcms7IHRoZW4gXAorCQkJaWYgdGVzdCAiJChTTykiID0gLmRsbDsgdGhlbiBcCisJCQkJJChJTlNUQUxMX0RBVEEpICQoTERMSUJSQVJZKSAkKERFU1RESVIpJChMSUJQTCkgOyBcCisJCQllbHNlIFwKKwkJCQkkKElOU1RBTExfREFUQSkgJChMSUJSQVJZKSAkKERFU1RESVIpJChMSUJQTCkvJChMSUJSQVJZKSA7IFwKKwkJCQkkKFJBTkxJQikgJChERVNURElSKSQoTElCUEwpLyQoTElCUkFSWSkgOyBcCisJCQlmaTsgXAorCQllbHNlIFwKKwkJCWVjaG8gU2tpcCBpbnN0YWxsIG9mICQoTElCUkFSWSkgLSB1c2UgbWFrZSBmcmFtZXdvcmtpbnN0YWxsOyBcCisJCWZpOyBcCisJZmkKKwkkKElOU1RBTExfREFUQSkgTW9kdWxlcy9jb25maWcuYyAkKERFU1RESVIpJChMSUJQTCkvY29uZmlnLmMKKwkkKElOU1RBTExfREFUQSkgTW9kdWxlcy9weXRob24ubyAkKERFU1RESVIpJChMSUJQTCkvcHl0aG9uLm8KKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01vZHVsZXMvY29uZmlnLmMuaW4gJChERVNURElSKSQoTElCUEwpL2NvbmZpZy5jLmluCisJJChJTlNUQUxMX0RBVEEpIE1ha2VmaWxlICQoREVTVERJUikkKExJQlBMKS9NYWtlZmlsZQorCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL1NldHVwICQoREVTVERJUikkKExJQlBMKS9TZXR1cAorCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL1NldHVwLmxvY2FsICQoREVTVERJUikkKExJQlBMKS9TZXR1cC5sb2NhbAorCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL1NldHVwLmNvbmZpZyAkKERFU1RESVIpJChMSUJQTCkvU2V0dXAuY29uZmlnCisJJChJTlNUQUxMX0RBVEEpIE1pc2MvcHl0aG9uLnBjICQoREVTVERJUikkKExJQlBDKS9weXRob24tJChWRVJTSU9OKS5wYworCSQoSU5TVEFMTF9TQ1JJUFQpICQoc3JjZGlyKS9Nb2R1bGVzL21ha2VzZXR1cCAkKERFU1RESVIpJChMSUJQTCkvbWFrZXNldHVwCisJJChJTlNUQUxMX1NDUklQVCkgJChzcmNkaXIpL2luc3RhbGwtc2ggJChERVNURElSKSQoTElCUEwpL2luc3RhbGwtc2gKKwkkKElOU1RBTExfU0NSSVBUKSBweXRob24tY29uZmlnICQoREVTVERJUikkKEJJTkRJUikvcHl0aG9uJChWRVJTSU9OKS1jb25maWcKKwkkKElOU1RBTExfU0NSSVBUKSBweXRob24tY29uZmlnLnNoICQoREVTVERJUikkKEJJTkRJUikvcHl0aG9uLWNvbmZpZy5zaAorCXJtIHB5dGhvbi1jb25maWcKKwlAaWYgWyAtcyBNb2R1bGVzL3B5dGhvbi5leHAgLWEgXAorCQkiYGVjaG8gJChNQUNIREVQKSB8IHNlZCAncy9eXCguLi5cKS4qL1wxLydgIiA9ICJhaXgiIF07IHRoZW4gXAorCQllY2hvOyBlY2hvICJJbnN0YWxsaW5nIHN1cHBvcnQgZmlsZXMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBleHRlbnNpb24gbW9kdWxlcyBvbiBBSVg6IjsgXAorCQkkKElOU1RBTExfREFUQSkgTW9kdWxlcy9weXRob24uZXhwCQlcCisJCQkJJChERVNURElSKSQoTElCUEwpL3B5dGhvbi5leHA7CQlcCisJCWVjaG87IGVjaG8gIiQoTElCUEwpL3B5dGhvbi5leHAiOwkJXAorCQkkKElOU1RBTExfU0NSSVBUKSAkKHNyY2RpcikvTW9kdWxlcy9tYWtleHBfYWl4CVwKKwkJCQkkKERFU1RESVIpJChMSUJQTCkvbWFrZXhwX2FpeDsJCVwKKwkJZWNobyAiJChMSUJQTCkvbWFrZXhwX2FpeCI7CQkJXAorCQkkKElOU1RBTExfU0NSSVBUKSAkKHNyY2RpcikvTW9kdWxlcy9sZF9zb19haXgJXAorCQkJCSQoREVTVERJUikkKExJQlBMKS9sZF9zb19haXg7CQlcCisJCWVjaG8gIiQoTElCUEwpL2xkX3NvX2FpeCI7CQkJXAorCQllY2hvOyBlY2hvICJTZWUgTWlzYy9BSVgtTk9URVMgZm9yIGRldGFpbHMuIjsJXAorCWVsc2UgdHJ1ZTsgXAorCWZpCisJQGNhc2UgIiQoTUFDSERFUCkiIGluIGJlb3MqKSBcCisJCWVjaG87IGVjaG8gIkluc3RhbGxpbmcgc3VwcG9ydCBmaWxlcyBmb3IgYnVpbGRpbmcgc2hhcmVkIGV4dGVuc2lvbiBtb2R1bGVzIG9uIEJlT1M6IjsgXAorCQkkKElOU1RBTExfREFUQSkgTWlzYy9CZU9TLU5PVEVTICQoREVTVERJUikkKExJQlBMKS9SRUFETUU7CVwKKwkJZWNobzsgZWNobyAiJChMSUJQTCkvUkVBRE1FIjsJCQlcCisJCSQoSU5TVEFMTF9TQ1JJUFQpIE1vZHVsZXMvYXJfYmVvcyAkKERFU1RESVIpJChMSUJQTCkvYXJfYmVvczsgXAorCQllY2hvICIkKExJQlBMKS9hcl9iZW9zIjsJCQlcCisJCSQoSU5TVEFMTF9TQ1JJUFQpIE1vZHVsZXMvbGRfc29fYmVvcyAkKERFU1RESVIpJChMSUJQTCkvbGRfc29fYmVvczsgXAorCQllY2hvICIkKExJQlBMKS9sZF9zb19iZW9zIjsJCQlcCisJCWVjaG87IGVjaG8gIlNlZSBNaXNjL0JlT1MtTk9URVMgZm9yIGRldGFpbHMuIjsJXAorCQk7OyBcCisJZXNhYworCisjIEluc3RhbGwgdGhlIGR5bmFtaWNhbGx5IGxvYWRhYmxlIG1vZHVsZXMKKyMgVGhpcyBnb2VzIGludG8gJChleGVjX3ByZWZpeCkKK3NoYXJlZGluc3RhbGw6IHNoYXJlZG1vZHMKKwkkKFJVTlNIQVJFRCkgJChQWVRIT05fRk9SX0JVSUxEKSAkKHNyY2Rpcikvc2V0dXAucHkgaW5zdGFsbCBcCisJICAgCS0tcHJlZml4PSQocHJlZml4KSBcCisJCS0taW5zdGFsbC1zY3JpcHRzPSQoQklORElSKSBcCisJCS0taW5zdGFsbC1wbGF0bGliPSQoREVTVFNIQVJFRCkgXAorCQktLXJvb3Q9JChERVNURElSKS8KKwktcm0gJChERVNURElSKSQoREVTVFNIQVJFRCkvX3N5c2NvbmZpZ2RhdGEucHkqCisKKyMgSGVyZSBhcmUgYSBjb3VwbGUgb2YgdGFyZ2V0cyBmb3IgTWFjT1NYIGFnYWluLCB0byBpbnN0YWxsIGEgZnVsbAorIyBmcmFtZXdvcmstYmFzZWQgUHl0aG9uLiBmcmFtZXdvcmtpbnN0YWxsIGluc3RhbGxzIGV2ZXJ5dGhpbmcsIHRoZQorIyBzdWJ0YXJnZXRzIGluc3RhbGwgc3BlY2lmaWMgcGFydHMuIE11Y2ggb2YgdGhlIGFjdHVhbCB3b3JrIGlzIG9mZmxvYWRlZCB0bworIyB0aGUgTWFrZWZpbGUgaW4gTWFjCisjCisjCisjIFRoaXMgdGFyZ2V0IGlzIGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGl0eSwgcHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uCisjIGhhZG4ndCBpbnRlZ3JhdGVkIGZyYW1ld29yayBpbnN0YWxsYXRpb24gaW4gdGhlIG5vcm1hbCBpbnN0YWxsIHByb2Nlc3MuCitmcmFtZXdvcmtpbnN0YWxsOiBpbnN0YWxsCisKKyMgT24gaW5zdGFsbCwgd2UgcmUtbWFrZSB0aGUgZnJhbWV3b3JrCisjIHN0cnVjdHVyZSBpbiB0aGUgaW5zdGFsbCBsb2NhdGlvbiwgL0xpYnJhcnkvRnJhbWV3b3Jrcy8gb3IgdGhlIGFyZ3VtZW50IHRvCisjIC0tZW5hYmxlLWZyYW1ld29yay4gSWYgLS1lbmFibGUtZnJhbWV3b3JrIGhhcyBiZWVuIHNwZWNpZmllZCB0aGVuIHdlIGhhdmUKKyMgYXV0b21hdGljYWxseSBzZXQgcHJlZml4IHRvIHRoZSBsb2NhdGlvbiBkZWVwIGRvd24gaW4gdGhlIGZyYW1ld29yaywgc28gd2UKKyMgb25seSBoYXZlIHRvIGNhdGVyIGZvciB0aGUgc3RydWN0dXJhbCBiaXRzIG9mIHRoZSBmcmFtZXdvcmsuCisKK2ZyYW1ld29ya2luc3RhbGxmcmFtZXdvcms6IGZyYW1ld29ya2luc3RhbGxzdHJ1Y3R1cmUgaW5zdGFsbCBmcmFtZXdvcmtpbnN0YWxsbWFjbGliCisKK2ZyYW1ld29ya2luc3RhbGxzdHJ1Y3R1cmU6CSQoTERMSUJSQVJZKQorCUBpZiB0ZXN0ICIkKFBZVEhPTkZSQU1FV09SS0RJUikiID0gbm8tZnJhbWV3b3JrOyB0aGVuIFwKKwkJZWNobyBOb3QgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLWZyYW1ld29yazsgXAorCQlleGl0IDE7IFwKKwllbHNlIHRydWU7IFwKKwlmaQorCUBmb3IgaSBpbiAkKHByZWZpeCkvUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ogJChwcmVmaXgpL2xpYjsgZG9cCisJCWlmIHRlc3QgISAtZCAkKERFU1RESVIpJCRpOyB0aGVuIFwKKwkJCWVjaG8gIkNyZWF0aW5nIGRpcmVjdG9yeSAkKERFU1RESVIpJCRpIjsgXAorCQkJJChJTlNUQUxMKSAtZCAtbSAkKERJUk1PREUpICQoREVTVERJUikkJGk7IFwKKwkJZWxzZQl0cnVlOyBcCisJCWZpOyBcCisJZG9uZQorCSQoTE4pIC1mc24gaW5jbHVkZS9weXRob24kKFZFUlNJT04pICQoREVTVERJUikkKHByZWZpeCkvSGVhZGVycworCXNlZCAncy8lVkVSU0lPTiUvJyJgJChSVU5TSEFSRUQpIC4vJChCVUlMRFBZVEhPTikgLWMgJ2ltcG9ydCBwbGF0Zm9ybTsgcHJpbnQgcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSdgIicvZycgPCAkKFJFU1NSQ0RJUikvSW5mby5wbGlzdCA+ICQoREVTVERJUikkKHByZWZpeCkvUmVzb3VyY2VzL0luZm8ucGxpc3QKKwkkKExOKSAtZnNuICQoVkVSU0lPTikgJChERVNURElSKSQoUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUikvVmVyc2lvbnMvQ3VycmVudAorCSQoTE4pIC1mc24gVmVyc2lvbnMvQ3VycmVudC8kKFBZVEhPTkZSQU1FV09SSykgJChERVNURElSKSQoUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUikvJChQWVRIT05GUkFNRVdPUkspCisJJChMTikgLWZzbiBWZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMgJChERVNURElSKSQoUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUikvSGVhZGVycworCSQoTE4pIC1mc24gVmVyc2lvbnMvQ3VycmVudC9SZXNvdXJjZXMgJChERVNURElSKSQoUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUikvUmVzb3VyY2VzCisJJChJTlNUQUxMX1NIQVJFRCkgJChMRExJQlJBUlkpICQoREVTVERJUikkKFBZVEhPTkZSQU1FV09SS1BSRUZJWCkvJChMRExJQlJBUlkpCisKKyMgVGhpcyBpbnN0YWxscyBNYWMvTGliIGludG8gdGhlIGZyYW1ld29yaworIyBJbnN0YWxsIGEgbnVtYmVyIG9mIHN5bWxpbmtzIHRvIGtlZXAgc29mdHdhcmUgdGhhdCBleHBlY3RzIGEgbm9ybWFsIHVuaXgKKyMgaW5zdGFsbCAod2hpY2ggaW5jbHVkZXMgcHl0aG9uLWNvbmZpZykgaGFwcHkuCitmcmFtZXdvcmtpbnN0YWxsbWFjbGliOgorCWxuIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQocHJlZml4KS9saWIvcHl0aG9uJChWRVJTSU9OKS9jb25maWcvbGlicHl0aG9uJChWRVJTSU9OKS5hIgorCWxuIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQocHJlZml4KS9saWIvcHl0aG9uJChWRVJTSU9OKS9jb25maWcvbGlicHl0aG9uJChWRVJTSU9OKS5keWxpYiIKKwlsbiAtZnMgIi4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKHByZWZpeCkvbGliL2xpYnB5dGhvbiQoVkVSU0lPTikuZHlsaWIiCisJY2QgTWFjICYmICQoTUFLRSkgaW5zdGFsbG1hY3N1YnRyZWUgREVTVERJUj0iJChERVNURElSKSIKKworIyBUaGlzIGluc3RhbGxzIHRoZSBJREUsIHRoZSBMYXVuY2hlciBhbmQgb3RoZXIgYXBwcyBpbnRvIC9BcHBsaWNhdGlvbnMKK2ZyYW1ld29ya2luc3RhbGxhcHBzOgorCWNkIE1hYyAmJiAkKE1BS0UpIGluc3RhbGxhcHBzIERFU1RESVI9IiQoREVTVERJUikiCisKKyMgVGhpcyBpbnN0YWxsIHRoZSB1bml4IHB5dGhvbiBhbmQgcHl0aG9udyB0b29scyBpbiAvdXNyL2xvY2FsL2JpbgorZnJhbWV3b3JraW5zdGFsbHVuaXh0b29sczoKKwljZCBNYWMgJiYgJChNQUtFKSBpbnN0YWxsdW5peHRvb2xzIERFU1RESVI9IiQoREVTVERJUikiCisKK2ZyYW1ld29ya2FsdGluc3RhbGx1bml4dG9vbHM6CisJY2QgTWFjICYmICQoTUFLRSkgYWx0aW5zdGFsbHVuaXh0b29scyBERVNURElSPSIkKERFU1RESVIpIgorCisjIFRoaXMgaW5zdGFsbHMgdGhlIERlbW9zIGFuZCBUb29scyBpbnRvIHRoZSBhcHBsaWNhdGlvbnMgZGlyZWN0b3J5LgorIyBJdCBpcyBub3QgcGFydCBvZiBhIG5vcm1hbCBmcmFtZXdvcmtpbnN0YWxsCitmcmFtZXdvcmtpbnN0YWxsZXh0cmFzOgorCWNkIE1hYyAmJiAkKE1BS0UpIGluc3RhbGxleHRyYXMgREVTVERJUj0iJChERVNURElSKSIKKworIyBUaGlzIGluc3RhbGxzIGEgZmV3IG9mIHRoZSB1c2VmdWwgc2NyaXB0cyBpbiBUb29scy9zY3JpcHRzCitzY3JpcHRzaW5zdGFsbDoKKwlTUkNESVI9JChzcmNkaXIpICQoUlVOU0hBUkVEKSBcCisJJChQWVRIT05fRk9SX0JVSUxEKSAkKHNyY2RpcikvVG9vbHMvc2NyaXB0cy9zZXR1cC5weSBpbnN0YWxsIFwKKwktLXByZWZpeD0kKHByZWZpeCkgXAorCS0taW5zdGFsbC1zY3JpcHRzPSQoQklORElSKSBcCisJLS1yb290PSQoREVTVERJUikvCisKKyMgQnVpbGQgdGhlIHRvcGxldmVsIE1ha2VmaWxlCitNYWtlZmlsZS5wcmU6IE1ha2VmaWxlLnByZS5pbiBjb25maWcuc3RhdHVzCisJQ09ORklHX0ZJTEVTPU1ha2VmaWxlLnByZSBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgY29uZmlnLnN0YXR1cworCSQoTUFLRSkgLWYgTWFrZWZpbGUucHJlIE1ha2VmaWxlCisKKyMgUnVuIHRoZSBjb25maWd1cmUgc2NyaXB0LgorY29uZmlnLnN0YXR1czoJJChzcmNkaXIpL2NvbmZpZ3VyZQorCSQoU0hFTEwpICQoc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfQVJHUykKKworLlBSRUNJT1VTOiBjb25maWcuc3RhdHVzICQoQlVJTERQWVRIT04pIE1ha2VmaWxlIE1ha2VmaWxlLnByZQorCisjIFNvbWUgbWFrZSdzIHB1dCB0aGUgb2JqZWN0IGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisuYy5vOgorCSQoQ0MpIC1jICQoUFlfQ0ZMQUdTKSAtbyAkQCAkPAorCisjIFJ1biByZWluZGVudCBvbiB0aGUgbGlicmFyeQorcmVpbmRlbnQ6CisJLi8kKEJVSUxEUFlUSE9OKSAkKHNyY2RpcikvVG9vbHMvc2NyaXB0cy9yZWluZGVudC5weSAtciAkKHNyY2RpcikvTGliCisKKyMgUmVydW4gY29uZmlndXJlIHdpdGggdGhlIHNhbWUgb3B0aW9ucyBhcyBpdCB3YXMgcnVuIGxhc3QgdGltZSwKKyMgcHJvdmlkZWQgdGhlIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGV4aXN0cworcmVjaGVjazoKKwkkKFNIRUxMKSBjb25maWcuc3RhdHVzIC0tcmVjaGVjaworCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMKKworIyBSZWJ1aWxkIHRoZSBjb25maWd1cmUgc2NyaXB0IGZyb20gY29uZmlndXJlLmFjOyBhbHNvIHJlYnVpbGQgcHljb25maWcuaC5pbgorYXV0b2NvbmY6CisJKGNkICQoc3JjZGlyKTsgYXV0b2NvbmYpCisJKGNkICQoc3JjZGlyKTsgYXV0b2hlYWRlcikKKworIyBDcmVhdGUgYSB0YWdzIGZpbGUgZm9yIHZpCit0YWdzOjoKKwljZCAkKHNyY2Rpcik7IFwKKwljdGFncyAtdyAtdCBJbmNsdWRlLyouaDsgXAorCWZvciBpIGluICQoU1JDRElSUyk7IGRvIGN0YWdzIC13IC10IC1hICQkaS8qLltjaF07IFwKKwlkb25lOyBcCisJc29ydCAtbyB0YWdzIHRhZ3MKKworIyBDcmVhdGUgYSB0YWdzIGZpbGUgZm9yIEdOVSBFbWFjcworVEFHUzo6CisJY2QgJChzcmNkaXIpOyBcCisJZXRhZ3MgSW5jbHVkZS8qLmg7IFwKKwlmb3IgaSBpbiAkKFNSQ0RJUlMpOyBkbyBldGFncyAtYSAkJGkvKi5bY2hdOyBkb25lCisKKyMgVG91Y2ggZ2VuZXJhdGVkIGZpbGVzCit0b3VjaDoKKwl0b3VjaCBJbmNsdWRlL1B5dGhvbi1hc3QuaCBQeXRob24vUHl0aG9uLWFzdC5jCisKKyMgU2FuaXRhdGlvbiB0YXJnZXRzIC0tIGNsZWFuIGxlYXZlcyBsaWJyYXJpZXMsIGV4ZWN1dGFibGVzIGFuZCB0YWdzCisjIGZpbGVzLCB3aGljaCBjbG9iYmVyIHJlbW92ZXMgYXMgd2VsbAorcHljcmVtb3ZhbDoKKwlmaW5kICQoc3JjZGlyKSAtbmFtZSAnKi5weVtjb10nIC1leGVjIHJtIC1mIHt9ICc7JworCitjbGVhbjogcHljcmVtb3ZhbAorCWZpbmQgLiAtbmFtZSAnKi5bb2FdJyAtZXhlYyBybSAtZiB7fSAnOycKKwlmaW5kIC4gLW5hbWUgJyouc1tvbF0nIC1leGVjIHJtIC1mIHt9ICc7JworCWZpbmQgLiAtbmFtZSAnKi5zby5bMC05XSouWzAtOV0qJyAtZXhlYyBybSAtZiB7fSAnOycKKwlmaW5kIGJ1aWxkIC1uYW1lICdmZmljb25maWcuaCcgLWV4ZWMgcm0gLWYge30gJzsnIHx8IHRydWUKKwlmaW5kIGJ1aWxkIC1uYW1lICdmZmljb25maWcucHknIC1leGVjIHJtIC1mIHt9ICc7JyB8fCB0cnVlCisJLXJtIC1mIExpYi9saWIydG8zLypHcmFtbWFyKi5waWNrbGUKKworcHJvZmlsZS1yZW1vdmFsOgorCWZpbmQgLiAtbmFtZSAnKi5nYz8/JyAtZXhlYyBybSAtZiB7fSAnOycKKworY2xvYmJlcjogY2xlYW4gcHJvZmlsZS1yZW1vdmFsCisJLXJtIC1mICQoQlVJTERQWVRIT04pICQoUEdFTikgJChMSUJSQVJZKSAkKExETElCUkFSWSkgJChETExMSUJSQVJZKSBcCisJCXRhZ3MgVEFHUyBcCisJCWNvbmZpZy5jYWNoZSBjb25maWcubG9nIHB5Y29uZmlnLmggTW9kdWxlcy9jb25maWcuYworCS1ybSAtcmYgYnVpbGQgcGxhdGZvcm0KKwktcm0gLXJmICQoUFlUSE9ORlJBTUVXT1JLRElSKQorCisjIE1ha2UgdGhpbmdzIGV4dHJhIGNsZWFuLCBiZWZvcmUgbWFraW5nIGEgZGlzdHJpYnV0aW9uOgorIyByZW1vdmUgYWxsIGdlbmVyYXRlZCBmaWxlcywgZXZlbiBNYWtlZmlsZVsucHJlXQorIyBLZWVwIGNvbmZpZ3VyZSBhbmQgUHl0aG9uLWFzdC5bY2hdLCBpdCdzIHBvc3NpYmxlIHRoZXkgY2FuJ3QgYmUgZ2VuZXJhdGVkCitkaXN0Y2xlYW46IGNsb2JiZXIKKwlmb3IgZmlsZSBpbiBMaWIvdGVzdC9kYXRhLyogOyBkbyBcCisJICAgIGlmIHRlc3QgIiQkZmlsZSIgIT0gIkxpYi90ZXN0L2RhdGEvUkVBRE1FIjsgdGhlbiBybSAiJCRmaWxlIjsgZmk7IFwKKwlkb25lCisJLXJtIC1mIGNvcmUgTWFrZWZpbGUgTWFrZWZpbGUucHJlIGNvbmZpZy5zdGF0dXMgXAorCQlNb2R1bGVzL1NldHVwIE1vZHVsZXMvU2V0dXAubG9jYWwgTW9kdWxlcy9TZXR1cC5jb25maWcgXAorCQlNb2R1bGVzL2xkX3NvX2FpeCBNb2R1bGVzL3B5dGhvbi5leHAgTWlzYy9weXRob24ucGMKKwktcm0gLWYgcHl0aG9uKi1nZGIucHkKKwktcm0gLWYgcHlidWlsZGRpci50eHQKKwlmaW5kICQoc3JjZGlyKSAnKCcgLW5hbWUgJyouZmRjJyAtbyAtbmFtZSAnKn4nIFwKKwkJCSAgIC1vIC1uYW1lICdbQCwjXSonIC1vIC1uYW1lICcqLm9sZCcgXAorCQkJICAgLW8gLW5hbWUgJyoub3JpZycgLW8gLW5hbWUgJyoucmVqJyBcCisJCQkgICAtbyAtbmFtZSAnKi5iYWsnICcpJyBcCisJCQkgICAtZXhlYyBybSAtZiB7fSAnOycKKworIyBDaGVjayBmb3Igc21lbGx5IGV4cG9ydGVkIHN5bWJvbHMgKG5vdCBzdGFydGluZyB3aXRoIFB5L19QeSkKK3NtZWxseTogYWxsCisJbm0gLXAgJChMSUJSQVJZKSB8IFwKKwkJc2VkIC1uICIvIFtUREJdIC9zLy4qIC8vcCIgfCBncmVwIC12ICJeXypQeSIgfCBzb3J0IC11OyBcCisKKyMgRmluZCBmaWxlcyB3aXRoIGZ1bm55IG5hbWVzCitmdW5ueToKKwlmaW5kICQoU1VCRElSUykgJChTVUJESVJTVE9PKSAtdHlwZSBkIFwKKwkJLW8gLW5hbWUgJyouW2Noc10nIFwKKwkJLW8gLW5hbWUgJyoucHknIFwKKwkJLW8gLW5hbWUgJyouZG9jJyBcCisJCS1vIC1uYW1lICcqLnN0eScgXAorCQktbyAtbmFtZSAnKi5iaWInIFwKKwkJLW8gLW5hbWUgJyouZGF0JyBcCisJCS1vIC1uYW1lICcqLmVsJyBcCisJCS1vIC1uYW1lICcqLmZkJyBcCisJCS1vIC1uYW1lICcqLmluJyBcCisJCS1vIC1uYW1lICcqLnRleCcgXAorCQktbyAtbmFtZSAnKixbdnB0XScgXAorCQktbyAtbmFtZSAnU2V0dXAnIFwKKwkJLW8gLW5hbWUgJ1NldHVwLionIFwKKwkJLW8gLW5hbWUgUkVBRE1FIFwKKwkJLW8gLW5hbWUgTWFrZWZpbGUgXAorCQktbyAtbmFtZSBDaGFuZ2VMb2cgXAorCQktbyAtbmFtZSBSZXBvc2l0b3J5IFwKKwkJLW8gLW5hbWUgUm9vdCBcCisJCS1vIC1uYW1lIEVudHJpZXMgXAorCQktbyAtbmFtZSBUYWcgXAorCQktbyAtbmFtZSB0YWdzIFwKKwkJLW8gLW5hbWUgVEFHUyBcCisJCS1vIC1uYW1lIC5jdnNpZ25vcmUgXAorCQktbyAtbmFtZSBNQU5JRkVTVCBcCisJCS1vIC1wcmludAorCisjIFBlcmZvcm0gc29tZSB2ZXJpZmljYXRpb24gY2hlY2tzIG9uIGFueSBtb2RpZmllZCBmaWxlcy4KK3BhdGNoY2hlY2s6CisJJChSVU5TSEFSRUQpIC4vJChCVUlMRFBZVEhPTikgJChzcmNkaXIpL1Rvb2xzL3NjcmlwdHMvcGF0Y2hjaGVjay5weQorCisjIERlcGVuZGVuY2llcworCitQeXRob24vdGhyZWFkLm86ICAkKHNyY2RpcikvUHl0aG9uL3RocmVhZF9hdGhlb3MuaCAkKHNyY2RpcikvUHl0aG9uL3RocmVhZF9iZW9zLmggJChzcmNkaXIpL1B5dGhvbi90aHJlYWRfY3RocmVhZC5oICQoc3JjZGlyKS9QeXRob24vdGhyZWFkX2Zvb2Jhci5oICQoc3JjZGlyKS9QeXRob24vdGhyZWFkX2x3cC5oICQoc3JjZGlyKS9QeXRob24vdGhyZWFkX250LmggJChzcmNkaXIpL1B5dGhvbi90aHJlYWRfb3MyLmggJChzcmNkaXIpL1B5dGhvbi90aHJlYWRfcHRoLmggJChzcmNkaXIpL1B5dGhvbi90aHJlYWRfcHRocmVhZC5oICQoc3JjZGlyKS9QeXRob24vdGhyZWFkX3NnaS5oICQoc3JjZGlyKS9QeXRob24vdGhyZWFkX3NvbGFyaXMuaCAkKHNyY2RpcikvUHl0aG9uL3RocmVhZF93aW5jZS5oCisKKyMgRGVjbGFyZSB0YXJnZXRzIHRoYXQgYXJlbid0IHJlYWwgZmlsZXMKKy5QSE9OWTogYWxsIGJ1aWxkX2FsbCBzaGFyZWRtb2RzIG9sZHNoYXJlZG1vZHMgdGVzdCBxdWlja3Rlc3QgbWVtdGVzdAorLlBIT05ZOiBpbnN0YWxsIGFsdGluc3RhbGwgb2xkc2hhcmVkaW5zdGFsbCBiaW5pbnN0YWxsIGFsdGJpbmluc3RhbGwKKy5QSE9OWTogbWFuaW5zdGFsbCBsaWJpbnN0YWxsIGluY2xpbnN0YWxsIGxpYmFpbnN0YWxsIHNoYXJlZGluc3RhbGwKKy5QSE9OWTogZnJhbWV3b3JraW5zdGFsbCBmcmFtZXdvcmtpbnN0YWxsZnJhbWV3b3JrIGZyYW1ld29ya2luc3RhbGxzdHJ1Y3R1cmUKKy5QSE9OWTogZnJhbWV3b3JraW5zdGFsbG1hY2xpYiBmcmFtZXdvcmtpbnN0YWxsYXBwcyBmcmFtZXdvcmtpbnN0YWxsdW5peHRvb2xzCisuUEhPTlk6IGZyYW1ld29ya2FsdGluc3RhbGx1bml4dG9vbHMgcmVjaGVjayBhdXRvY29uZiBjbGVhbiBjbG9iYmVyIGRpc3RjbGVhbgorLlBIT05ZOiBzbWVsbHkgZnVubnkgcGF0Y2hjaGVjayB0b3VjaCBhbHRtYW5pbnN0YWxsCisuUEhPTlk6IGdkYmhvb2tzCisKKyMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQorCisjIFJ1bGVzIGFwcGVuZGVkIGJ5IG1ha2VkZXBlbmQKKworTW9kdWxlcy9wb3NpeG1vZHVsZS5vOiAkKHNyY2RpcikvTW9kdWxlcy9wb3NpeG1vZHVsZS5jOyAkKENDKSAkKFBZX0NGTEFHUykgIC1jICQoc3JjZGlyKS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMgLW8gTW9kdWxlcy9wb3NpeG1vZHVsZS5vCitNb2R1bGVzL3Bvc2l4bW9kdWxlJChTTyk6ICBNb2R1bGVzL3Bvc2l4bW9kdWxlLm87ICQoQkxEU0hBUkVEKSAgTW9kdWxlcy9wb3NpeG1vZHVsZS5vICAgLW8gTW9kdWxlcy9wb3NpeG1vZHVsZSQoU08pCitNb2R1bGVzL3RocmVhZG1vZHVsZS5vOiAkKHNyY2RpcikvTW9kdWxlcy90aHJlYWRtb2R1bGUuYzsgJChDQykgJChQWV9DRkxBR1MpICAtYyAkKHNyY2RpcikvTW9kdWxlcy90aHJlYWRtb2R1bGUuYyAtbyBNb2R1bGVzL3RocmVhZG1vZHVsZS5vCitNb2R1bGVzL3RocmVhZG1vZHVsZSQoU08pOiAgTW9kdWxlcy90aHJlYWRtb2R1bGUubzsgJChCTERTSEFSRUQpICBNb2R1bGVzL3RocmVhZG1vZHVsZS5vICAgLW8gTW9kdWxlcy90aHJlYWRtb2R1bGUkKFNPKQorTW9kdWxlcy9zaWduYWxtb2R1bGUubzogJChzcmNkaXIpL01vZHVsZXMvc2lnbmFsbW9kdWxlLmM7ICQoQ0MpICQoUFlfQ0ZMQUdTKSAgLWMgJChzcmNkaXIpL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMgLW8gTW9kdWxlcy9zaWduYWxtb2R1bGUubworTW9kdWxlcy9zaWduYWxtb2R1bGUkKFNPKTogIE1vZHVsZXMvc2lnbmFsbW9kdWxlLm87ICQoQkxEU0hBUkVEKSAgTW9kdWxlcy9zaWduYWxtb2R1bGUubyAgIC1vIE1vZHVsZXMvc2lnbmFsbW9kdWxlJChTTykKK01vZHVsZXMvZXJybm9tb2R1bGUubzogJChzcmNkaXIpL01vZHVsZXMvZXJybm9tb2R1bGUuYzsgJChDQykgJChQWV9DRkxBR1MpICAtYyAkKHNyY2RpcikvTW9kdWxlcy9lcnJub21vZHVsZS5jIC1vIE1vZHVsZXMvZXJybm9tb2R1bGUubworTW9kdWxlcy9lcnJub21vZHVsZSQoU08pOiAgTW9kdWxlcy9lcnJub21vZHVsZS5vOyAkKEJMRFNIQVJFRCkgIE1vZHVsZXMvZXJybm9tb2R1bGUubyAgIC1vIE1vZHVsZXMvZXJybm9tb2R1bGUkKFNPKQorTW9kdWxlcy9fc3JlLm86ICQoc3JjZGlyKS9Nb2R1bGVzL19zcmUuYzsgJChDQykgJChQWV9DRkxBR1MpICAtYyAkKHNyY2RpcikvTW9kdWxlcy9fc3JlLmMgLW8gTW9kdWxlcy9fc3JlLm8KK01vZHVsZXMvX3NyZSQoU08pOiAgTW9kdWxlcy9fc3JlLm87ICQoQkxEU0hBUkVEKSAgTW9kdWxlcy9fc3JlLm8gICAtbyBNb2R1bGVzL19zcmUkKFNPKQorTW9kdWxlcy9fY29kZWNzbW9kdWxlLm86ICQoc3JjZGlyKS9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYzsgJChDQykgJChQWV9DRkxBR1MpICAtYyAkKHNyY2RpcikvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMgLW8gTW9kdWxlcy9fY29kZWNzbW9kdWxlLm8KK01vZHVsZXMvX2NvZGVjc21vZHVsZSQoU08pOiAgTW9kdWxlcy9fY29kZWNzbW9kdWxlLm87ICQoQkxEU0hBUkVEKSAgTW9kdWxlcy9fY29kZWNzbW9kdWxlLm8gICAtbyBNb2R1bGVzL19jb2RlY3Ntb2R1bGUkKFNPKQorTW9kdWxlcy9fd2Vha3JlZi5vOiAkKHNyY2RpcikvTW9kdWxlcy9fd2Vha3JlZi5jOyAkKENDKSAkKFBZX0NGTEFHUykgIC1jICQoc3JjZGlyKS9Nb2R1bGVzL193ZWFrcmVmLmMgLW8gTW9kdWxlcy9fd2Vha3JlZi5vCitNb2R1bGVzL193ZWFrcmVmJChTTyk6ICBNb2R1bGVzL193ZWFrcmVmLm87ICQoQkxEU0hBUkVEKSAgTW9kdWxlcy9fd2Vha3JlZi5vICAgLW8gTW9kdWxlcy9fd2Vha3JlZiQoU08pCitNb2R1bGVzL3ppcGltcG9ydC5vOiAkKHNyY2RpcikvTW9kdWxlcy96aXBpbXBvcnQuYzsgJChDQykgJChQWV9DRkxBR1MpICAtYyAkKHNyY2RpcikvTW9kdWxlcy96aXBpbXBvcnQuYyAtbyBNb2R1bGVzL3ppcGltcG9ydC5vCitNb2R1bGVzL3ppcGltcG9ydCQoU08pOiAgTW9kdWxlcy96aXBpbXBvcnQubzsgJChCTERTSEFSRUQpICBNb2R1bGVzL3ppcGltcG9ydC5vICAgLW8gTW9kdWxlcy96aXBpbXBvcnQkKFNPKQorTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5vOiAkKHNyY2RpcikvTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5jOyAkKENDKSAkKFBZX0NGTEFHUykgIC1jICQoc3JjZGlyKS9Nb2R1bGVzL3N5bXRhYmxlbW9kdWxlLmMgLW8gTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5vCitNb2R1bGVzL19zeW10YWJsZW1vZHVsZSQoU08pOiAgTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5vOyAkKEJMRFNIQVJFRCkgIE1vZHVsZXMvc3ltdGFibGVtb2R1bGUubyAgIC1vIE1vZHVsZXMvX3N5bXRhYmxlbW9kdWxlJChTTykKK01vZHVsZXMveHhzdWJ0eXBlLm86ICQoc3JjZGlyKS9Nb2R1bGVzL3h4c3VidHlwZS5jOyAkKENDKSAkKFBZX0NGTEFHUykgIC1jICQoc3JjZGlyKS9Nb2R1bGVzL3h4c3VidHlwZS5jIC1vIE1vZHVsZXMveHhzdWJ0eXBlLm8KK01vZHVsZXMveHhzdWJ0eXBlJChTTyk6ICBNb2R1bGVzL3h4c3VidHlwZS5vOyAkKEJMRFNIQVJFRCkgIE1vZHVsZXMveHhzdWJ0eXBlLm8gICAtbyBNb2R1bGVzL3h4c3VidHlwZSQoU08pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbmZpZy9TZXR1cCBiL2xpYi9weXRob24yLjcvY29uZmlnL1NldHVwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MjBmZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbmZpZy9TZXR1cApAQCAtMCwwICsxLDUwMCBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjIFRoZSBmaWxlIFNldHVwIGlzIHVzZWQgYnkgdGhlIG1ha2VzZXR1cCBzY3JpcHQgdG8gY29uc3RydWN0IHRoZSBmaWxlcworIyBNYWtlZmlsZSBhbmQgY29uZmlnLmMsIGZyb20gTWFrZWZpbGUucHJlIGFuZCBjb25maWcuYy5pbiwKKyMgcmVzcGVjdGl2ZWx5LiAgVGhlIGZpbGUgU2V0dXAgaXRzZWxmIGlzIGluaXRpYWxseSBjb3BpZWQgZnJvbQorIyBTZXR1cC5kaXN0OyBvbmNlIGl0IGV4aXN0cyBpdCB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbiwgc28geW91IGNhbiBlZGl0CisjIFNldHVwIHRvIHlvdXIgaGVhcnQncyBjb250ZW50LiAgTm90ZSB0aGF0IE1ha2VmaWxlLnByZSBpcyBjcmVhdGVkCisjIGZyb20gTWFrZWZpbGUucHJlLmluIGJ5IHRoZSB0b3BsZXZlbCBjb25maWd1cmUgc2NyaXB0LgorCisjIChWUEFUSCBub3RlczogU2V0dXAgYW5kIE1ha2VmaWxlLnByZSBhcmUgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSwgYXMKKyMgYXJlIE1ha2VmaWxlIGFuZCBjb25maWcuYzsgdGhlICouaW4gYW5kICouZGlzdCBmaWxlcyBhcmUgaW4gdGhlIHNvdXJjZQorIyBkaXJlY3RvcnkuKQorCisjIEVhY2ggbGluZSBpbiB0aGlzIGZpbGUgZGVzY3JpYmVzIG9uZSBvciBtb3JlIG9wdGlvbmFsIG1vZHVsZXMuCisjIE1vZHVsZXMgZW5hYmxlZCBoZXJlIHdpbGwgbm90IGJlIGNvbXBpbGVkIGJ5IHRoZSBzZXR1cC5weSBzY3JpcHQsCisjIHNvIHRoZSBmaWxlIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHNldHVwLnB5J3MgYmVoYXZpb3IuCisKKyMgTGluZXMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKyMKKyMgPG1vZHVsZT4gLi4uIFs8c291cmNlZmlsZT4gLi4uXSBbPGNwcGFyZz4gLi4uXSBbPGxpYnJhcnk+IC4uLl0KKyMKKyMgPHNvdXJjZWZpbGU+IGlzIGFueXRoaW5nIGVuZGluZyBpbiAuYyAoLkMsIC5jYywgLmMrKyBhcmUgQysrIGZpbGVzKQorIyA8Y3BwYXJnPiBpcyBhbnl0aGluZyBzdGFydGluZyB3aXRoIC1JLCAtRCwgLVUgb3IgLUMKKyMgPGxpYnJhcnk+IGlzIGFueXRoaW5nIGVuZGluZyBpbiAuYSBvciBiZWdpbm5pbmcgd2l0aCAtbCBvciAtTAorIyA8bW9kdWxlPiBpcyBhbnl0aGluZyBlbHNlIGJ1dCBzaG91bGQgYmUgYSB2YWxpZCBQeXRob24KKyMgaWRlbnRpZmllciAobGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywgYmVnaW5uaW5nIHdpdGggbm9uLWRpZ2l0KQorIworIyAoQXMgdGhlIG1ha2VzZXR1cCBzY3JpcHQgY2hhbmdlcywgaXQgbWF5IHJlY29nbml6ZSBzb21lIG90aGVyCisjIGFyZ3VtZW50cyBhcyB3ZWxsLCBlLmcuICouc28gYW5kICouc2wgYXMgbGlicmFyaWVzLiAgU2VlIHRoZSBiaWcKKyMgY2FzZSBzdGF0ZW1lbnQgaW4gdGhlIG1ha2VzZXR1cCBzY3JpcHQuKQorIworIyBMaW5lcyBjYW4gYWxzbyBoYXZlIHRoZSBmb3JtCisjCisjIDxuYW1lPiA9IDx2YWx1ZT4KKyMKKyMgd2hpY2ggZGVmaW5lcyBhIE1ha2UgdmFyaWFibGUgZGVmaW5pdGlvbiBpbnNlcnRlZCBpbnRvIE1ha2VmaWxlLmluCisjCisjIEZpbmFsbHksIGlmIGEgbGluZSBjb250YWlucyBqdXN0IHRoZSB3b3JkICIqc2hhcmVkKiIgKHdpdGhvdXQgdGhlCisjIHF1b3RlcyBidXQgd2l0aCB0aGUgc3RhcnMpLCB0aGVuIHRoZSBmb2xsb3dpbmcgbW9kdWxlcyB3aWxsIG5vdCBiZQorIyBidWlsdCBzdGF0aWNhbGx5LiAgVGhlIGJ1aWxkIHByb2Nlc3Mgd29ya3MgbGlrZSB0aGlzOgorIworIyAxLiBCdWlsZCBhbGwgbW9kdWxlcyB0aGF0IGFyZSBkZWNsYXJlZCBhcyBzdGF0aWMgaW4gTW9kdWxlcy9TZXR1cCwKKyMgICAgY29tYmluZSB0aGVtIGludG8gbGlicHl0aG9ueHkuYSwgY29tYmluZSB0aGF0IGludG8gcHl0aG9uLgorIyAyLiBCdWlsZCBhbGwgbW9kdWxlcyB0aGF0IGFyZSBsaXN0ZWQgYXMgc2hhcmVkIGluIE1vZHVsZXMvU2V0dXAuCisjIDMuIEludm9rZSBzZXR1cC5weS4gVGhhdCBidWlsZHMgYWxsIG1vZHVsZXMgdGhhdAorIyAgICBhKSBhcmUgbm90IGJ1aWx0aW4sIGFuZAorIyAgICBiKSBhcmUgbm90IGxpc3RlZCBpbiBNb2R1bGVzL1NldHVwLCBhbmQKKyMgICAgYykgY2FuIGJlIGJ1aWxkIG9uIHRoZSB0YXJnZXQKKyMKKyMgVGhlcmVmb3JlLCBtb2R1bGVzIGRlY2xhcmVkIHRvIGJlIHNoYXJlZCB3aWxsIG5vdCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgY29uZmlnLmMgZmlsZSwgbm9yIGluIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUKKyMgYWRkZWQgdG8gdGhlIGxpYnJhcnkgYXJjaGl2ZSwgYW5kIHRoZWlyIGxpbmtlciBvcHRpb25zIHdvbid0IGJlCisjIGFkZGVkIHRvIHRoZSBsaW5rZXIgb3B0aW9ucy4gUnVsZXMgdG8gY3JlYXRlIHRoZWlyIC5vIGZpbGVzIGFuZAorIyB0aGVpciBzaGFyZWQgbGlicmFyaWVzIHdpbGwgc3RpbGwgYmUgYWRkZWQgdG8gdGhlIE1ha2VmaWxlLCBhbmQKKyMgdGhlaXIgbmFtZXMgd2lsbCBiZSBjb2xsZWN0ZWQgaW4gdGhlIE1ha2UgdmFyaWFibGUgU0hBUkVETU9EUy4gIFRoaXMKKyMgaXMgdXNlZCB0byBidWlsZCBtb2R1bGVzIGFzIHNoYXJlZCBsaWJyYXJpZXMuICAoVGhleSBjYW4gYmUKKyMgaW5zdGFsbGVkIHVzaW5nICJtYWtlIHNoYXJlZGluc3RhbGwiLCB3aGljaCBpcyBpbXBsaWVkIGJ5IHRoZQorIyB0b3BsZXZlbCAibWFrZSBpbnN0YWxsIiB0YXJnZXQuKSAgKEZvciBjb21wYXRpYmlsaXR5LAorIyAqbm9jb25maWcqIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgKnNoYXJlZCouKQorIworIyBJbiBhZGRpdGlvbiwgKnN0YXRpYyogZXhwbGljaXRseSBkZWNsYXJlcyB0aGUgZm9sbG93aW5nIG1vZHVsZXMgdG8KKyMgYmUgc3RhdGljLiAgTGluZXMgY29udGFpbmluZyAiKnN0YXRpYyoiIGFuZCAiKnNoYXJlZCoiIG1heSB0aHVzCisjIGFsdGVybmF0ZSB0aHJvdWdob3V0IHRoaXMgZmlsZS4KKworIyBOT1RFOiBBcyBhIHN0YW5kYXJkIHBvbGljeSwgYXMgbWFueSBtb2R1bGVzIGFzIGNhbiBiZSBzdXBwb3J0ZWQgYnkgYQorIyBwbGF0Zm9ybSBzaG91bGQgYmUgcHJlc2VudC4gIFRoZSBkaXN0cmlidXRpb24gY29tZXMgd2l0aCBhbGwgbW9kdWxlcworIyBlbmFibGVkIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBtb3N0IHBsYXRmb3JtcyBhbmQgZG9uJ3QgcmVxdWlyZSB5b3UKKyMgdG8gZnRwIHNvdXJjZXMgZnJvbSBlbHNld2hlcmUuCisKKworIyBTb21lIHNwZWNpYWwgcnVsZXMgdG8gZGVmaW5lIFBZVEhPTlBBVEguCisjIEVkaXQgdGhlIGRlZmluaXRpb25zIGJlbG93IHRvIGluZGljYXRlIHdoaWNoIG9wdGlvbnMgeW91IGFyZSB1c2luZy4KKyMgRG9uJ3QgYWRkIGFueSB3aGl0ZXNwYWNlIG9yIGNvbW1lbnRzIQorCisjIERpcmVjdG9yaWVzIHdoZXJlIGxpYnJhcnkgZmlsZXMgZ2V0IGluc3RhbGxlZC4KKyMgREVTVExJQiBpcyBmb3IgUHl0aG9uIG1vZHVsZXM7IE1BQ0hERVNUTElCIGZvciBzaGFyZWQgbGlicmFyaWVzLgorREVTVExJQj0kKExJQkRFU1QpCitNQUNIREVTVExJQj0kKEJJTkxJQkRFU1QpCisKKyMgTk9URTogYWxsIHRoZSBwYXRocyBhcmUgbm93IHJlbGF0aXZlIHRvIHRoZSBwcmVmaXggdGhhdCBpcyBjb21wdXRlZAorIyBhdCBydW4gdGltZSEKKworIyBTdGFuZGFyZCBwYXRoIC0tIGRvbid0IGVkaXQuCisjIE5vIGxlYWRpbmcgY29sb24gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZW50cnkuCisjIEVtcHR5IHNpbmNlIHRoaXMgaXMgbm93IGp1c3QgdGhlIHJ1bnRpbWUgcHJlZml4LgorREVTVFBBVEg9CisKKyMgU2l0ZSBzcGVjaWZpYyBwYXRoIGNvbXBvbmVudHMgLS0gc2hvdWxkIGJlZ2luIHdpdGggJChERUxJTSkgaWYgbm9uLWVtcHR5CitTSVRFUEFUSD0KKworIyBTdGFuZGFyZCBwYXRoIGNvbXBvbmVudHMgZm9yIHRlc3QgbW9kdWxlcworVEVTVFBBVEg9CisKKyMgUGF0aCBjb21wb25lbnRzIGZvciBtYWNoaW5lLSBvciBzeXN0ZW0tZGVwZW5kZW50IG1vZHVsZXMgYW5kIHNoYXJlZCBsaWJyYXJpZXMKK01BQ0hERVBQQVRIPSQoREVMSU0pcGxhdC0kKE1BQ0hERVApCitFWFRSQU1BQ0hERVBQQVRIPQorCisjIFBhdGggY29tcG9uZW50IGZvciB0aGUgVGtpbnRlci1yZWxhdGVkIG1vZHVsZXMKKyMgVGhlIFRLUEFUSCB2YXJpYWJsZSBpcyBhbHdheXMgZW5hYmxlZCwgdG8gc2F2ZSB5b3UgdGhlIGVmZm9ydC4KK1RLUEFUSD0kKERFTElNKWxpYi10aworCisjIFBhdGggY29tcG9uZW50IGZvciBvbGQgbW9kdWxlcy4KK09MRFBBVEg9JChERUxJTSlsaWItb2xkCisKK0NPUkVQWVRIT05QQVRIPSQoREVTVFBBVEgpJChTSVRFUEFUSCkkKFRFU1RQQVRIKSQoTUFDSERFUFBBVEgpJChFWFRSQU1BQ0hERVBQQVRIKSQoVEtQQVRIKSQoT0xEUEFUSCkKK1BZVEhPTlBBVEg9JChDT1JFUFlUSE9OUEFUSCkKKworCisjIFRoZSBtb2R1bGVzIGxpc3RlZCBoZXJlIGNhbid0IGJlIGJ1aWx0IGFzIHNoYXJlZCBsaWJyYXJpZXMgZm9yCisjIHZhcmlvdXMgcmVhc29uczsgdGhlcmVmb3JlIHRoZXkgYXJlIGxpc3RlZCBoZXJlIGluc3RlYWQgb2YgaW4gdGhlCisjIG5vcm1hbCBvcmRlci4KKworIyBUaGlzIG9ubHkgY29udGFpbnMgdGhlIG1pbmltYWwgc2V0IG9mIG1vZHVsZXMgcmVxdWlyZWQgdG8gcnVuIHRoZSAKKyMgc2V0dXAucHkgc2NyaXB0IGluIHRoZSByb290IG9mIHRoZSBQeXRob24gc291cmNlIHRyZWUuCisKK2Vycm5vIGVycm5vbW9kdWxlLmMJCSMgcG9zaXggKFVOSVgpIGVycm5vIHZhbHVlcworI0ZJWE1FOiBzZXR1cC5weSBkZXRlY3QgdGhpcyBtb2R1bGUgYWxvbmcgd2l0aCBncnAgYW5kIHNwd2QuCisjRklYTUU6IHdoYXQgYWJvdXQgdG8gY29tbWVudCA/CisjcHdkIHB3ZG1vZHVsZS5jCQkJIyB0aGlzIGlzIG5lZWRlZCB0byBmaW5kIG91dCB0aGUgdXNlcidzIGhvbWUgZGlyCisJCQkJIyBpZiAkSE9NRSBpcyBub3Qgc2V0Citfc3JlIF9zcmUuYwkJCSMgRnJlZHJpayBMdW5kaCdzIG5ldyByZWd1bGFyIGV4cHJlc3Npb25zCitfY29kZWNzIF9jb2RlY3Ntb2R1bGUuYwkJIyBhY2Nlc3MgdG8gdGhlIGJ1aWx0aW4gY29kZWNzIGFuZCBjb2RlYyByZWdpc3RyeQorX3dlYWtyZWYgX3dlYWtyZWYuYyAgICAgICAgICAgICAjIHdlYWsgcmVmZXJlbmNlcworCisjIFRoZSB6aXBpbXBvcnQgbW9kdWxlIGlzIGFsd2F5cyBpbXBvcnRlZCBhdCBzdGFydHVwLiBIYXZpbmcgaXQgYXMgYQorIyBidWlsdGluIG1vZHVsZSBhdm9pZHMgc29tZSBib290c3RyYXBwaW5nIHByb2JsZW1zIGFuZCByZWR1Y2VzIG92ZXJoZWFkLgoremlwaW1wb3J0IHppcGltcG9ydC5jCisKKyMgVGhlIHJlc3Qgb2YgdGhlIG1vZHVsZXMgbGlzdGVkIGluIHRoaXMgZmlsZSBhcmUgYWxsIGNvbW1lbnRlZCBvdXQgYnkKKyMgZGVmYXVsdC4gIFVzdWFsbHkgdGhleSBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGJ1aWx0IGFzIGR5bmFtaWNhbGx5CisjIGxvYWRlZCBtb2R1bGVzIGJ5IHRoZSBuZXcgc2V0dXAucHkgc2NyaXB0IGFkZGVkIGluIFB5dGhvbiAyLjEuICBJZgorIyB5b3UncmUgb24gYSBwbGF0Zm9ybSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBkeW5hbWljIGxvYWRpbmcsIHdhbnQgdG8gCisjIGNvbXBpbGUgbW9kdWxlcyBzdGF0aWNhbGx5IGludG8gdGhlIFB5dGhvbiBiaW5hcnksIG9yIG5lZWQgdG8gCisjIHNwZWNpZnkgc29tZSBvZGQgc2V0IG9mIGNvbXBpbGVyIHN3aXRjaGVzLCB5b3UgY2FuIHVuY29tbWVudCB0aGUgCisjIGFwcHJvcHJpYXRlIGxpbmVzIGJlbG93LgorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBUaGUgUHl0aG9uIHN5bXRhYmxlIG1vZHVsZSBkZXBlbmRzIG9uIC5oIGZpbGVzIHRoYXQgc2V0dXAucHkgZG9lc24ndCB0cmFjaworX3N5bXRhYmxlIHN5bXRhYmxlbW9kdWxlLmMKKworIyBUaGUgU0dJIHNwZWNpZmljIEdMIG1vZHVsZToKKworR0xIQUNLPS1EY2xlYXI9X19HTGNsZWFyCisjZ2wgZ2xtb2R1bGUuYyBjZ2Vuc3VwcG9ydC5jIC1JJChzcmNkaXIpICQoR0xIQUNLKSAtbGdsIC1sWDExCisKKyMgUHVyZSBtb2R1bGUuICBDYW5ub3QgYmUgbGlua2VkIGR5bmFtaWNhbGx5LgorIyAtRFdJVEhfUVVBTlRJRlksIC1EV0lUSF9QVVJJRlksIG9yIC1EV0lUSF9BTExfUFVSRQorI1dISUNIX1BVUkVfUFJPRFVDVFM9LURXSVRIX0FMTF9QVVJFCisjUFVSRV9JTkNMUz0tSS91c3IvbG9jYWwvaW5jbHVkZQorI1BVUkVfU1RVQkxJQlM9LUwvdXNyL2xvY2FsL2xpYiAtbHB1cmlmeV9zdHVicyAtbHF1YW50aWZ5X3N0dWJzCisjcHVyZSBwdXJlbW9kdWxlLmMgJChXSElDSF9QVVJFX1BST0RVQ1RTKSAkKFBVUkVfSU5DTFMpICQoUFVSRV9TVFVCTElCUykKKworIyBVbmNvbW1lbnRpbmcgdGhlIGZvbGxvd2luZyBsaW5lIHRlbGxzIG1ha2VzZXR1cCB0aGF0IGFsbCBmb2xsb3dpbmcKKyMgbW9kdWxlcyBhcmUgdG8gYmUgYnVpbHQgYXMgc2hhcmVkIGxpYnJhcmllcyAoc2VlIGFib3ZlIGZvciBtb3JlCisjIGRldGFpbDsgYWxzbyBub3RlIHRoYXQgKnN0YXRpYyogcmV2ZXJzZXMgdGhpcyBlZmZlY3QpOgorCisjKnNoYXJlZCoKKworIyBHTlUgcmVhZGxpbmUuICBVbmxpa2UgcHJldmlvdXMgUHl0aG9uIGluY2FybmF0aW9ucywgR05VIHJlYWRsaW5lIGlzCisjIG5vdyBpbmNvcnBvcmF0ZWQgaW4gYW4gb3B0aW9uYWwgbW9kdWxlLCBjb25maWd1cmVkIGluIHRoZSBTZXR1cCBmaWxlCisjIGluc3RlYWQgb2YgYnkgYSBjb25maWd1cmUgc2NyaXB0IHN3aXRjaC4gIFlvdSBtYXkgaGF2ZSB0byBpbnNlcnQgYQorIyAtTCBvcHRpb24gcG9pbnRpbmcgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBsaWJyZWFkbGluZS4qIGxpdmVzLAorIyBhbmQgeW91IG1heSBoYXZlIHRvIGNoYW5nZSAtbHRlcm1jYXAgdG8gLWx0ZXJtbGliIG9yIHBlcmhhcHMgcmVtb3ZlCisjIGl0LCBkZXBlbmRpbmcgb24geW91ciBzeXN0ZW0gLS0gc2VlIHRoZSBHTlUgcmVhZGxpbmUgaW5zdHJ1Y3Rpb25zLgorIyBJdCdzIG9rYXkgZm9yIHRoaXMgdG8gYmUgYSBzaGFyZWQgbGlicmFyeSwgdG9vLgorCisjcmVhZGxpbmUgcmVhZGxpbmUuYyAtbHJlYWRsaW5lIC1sdGVybWNhcAorCisKKyMgTW9kdWxlcyB0aGF0IHNob3VsZCBhbHdheXMgYmUgcHJlc2VudCAobm9uIFVOSVggZGVwZW5kZW50KToKKworI2FycmF5IGFycmF5bW9kdWxlLmMJIyBhcnJheSBvYmplY3RzCisjY21hdGggY21hdGhtb2R1bGUuYyBfbWF0aC5jICMgLWxtICMgY29tcGxleCBtYXRoIGxpYnJhcnkgZnVuY3Rpb25zCisjbWF0aCBtYXRobW9kdWxlLmMgX21hdGguYyAjIC1sbSAjIG1hdGggbGlicmFyeSBmdW5jdGlvbnMsIGUuZy4gc2luKCkKKyNfc3RydWN0IF9zdHJ1Y3QuYwkjIGJpbmFyeSBzdHJ1Y3R1cmUgcGFja2luZy91bnBhY2tpbmcKKyN0aW1lIHRpbWVtb2R1bGUuYyAjIC1sbSAjIHRpbWUgb3BlcmF0aW9ucyBhbmQgdmFyaWFibGVzCisjb3BlcmF0b3Igb3BlcmF0b3IuYwkjIG9wZXJhdG9yLmFkZCgpIGFuZCBzaW1pbGFyIGdvb2RpZXMKKyNfdGVzdGNhcGkgX3Rlc3RjYXBpbW9kdWxlLmMgICAgIyBQeXRob24gQyBBUEkgdGVzdCBtb2R1bGUKKyNfcmFuZG9tIF9yYW5kb21tb2R1bGUuYwkjIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisjX2NvbGxlY3Rpb25zIF9jb2xsZWN0aW9uc21vZHVsZS5jICMgQ29udGFpbmVyIHR5cGVzCisjX2hlYXBxIF9oZWFwcW1vZHVsZS5jCQkjIEhlYXBxIHR5cGUKKyNpdGVydG9vbHMgaXRlcnRvb2xzbW9kdWxlLmMJIyBGdW5jdGlvbnMgY3JlYXRpbmcgaXRlcmF0b3JzIGZvciBlZmZpY2llbnQgbG9vcGluZyAKKyNzdHJvcCBzdHJvcG1vZHVsZS5jCQkjIFN0cmluZyBtYW5pcHVsYXRpb25zCisjX2Z1bmN0b29scyBfZnVuY3Rvb2xzbW9kdWxlLmMJIyBUb29scyBmb3Igd29ya2luZyB3aXRoIGZ1bmN0aW9ucyBhbmQgY2FsbGFibGUgb2JqZWN0cworI19lbGVtZW50dHJlZSAtSSQoc3JjZGlyKS9Nb2R1bGVzL2V4cGF0IC1ESEFWRV9FWFBBVF9DT05GSUdfSCAtRFVTRV9QWUVYUEFUX0NBUEkgX2VsZW1lbnR0cmVlLmMJIyBlbGVtZW50dHJlZSBhY2NlbGVyYXRvcgorI19waWNrbGUgX3BpY2tsZS5jCSMgcGlja2xlIGFjY2VsZXJhdG9yCisjZGF0ZXRpbWUgZGF0ZXRpbWVtb2R1bGUuYwkjIGRhdGUvdGltZSB0eXBlCisjX2Jpc2VjdCBfYmlzZWN0bW9kdWxlLmMJIyBCaXNlY3Rpb24gYWxnb3JpdGhtcworCisjdW5pY29kZWRhdGEgdW5pY29kZWRhdGEuYyAgICAjIHN0YXRpYyBVbmljb2RlIGNoYXJhY3RlciBkYXRhYmFzZQorCisjIGFjY2VzcyB0byBJU08gQyBsb2NhbGUgc3VwcG9ydAorI19sb2NhbGUgX2xvY2FsZW1vZHVsZS5jICAjIC1saW50bAorCisjIFN0YW5kYXJkIEkvTyBiYXNlbGluZQorI19pbyAtSSQoc3JjZGlyKS9Nb2R1bGVzL19pbyBfaW8vYnVmZmVyZWRpby5jIF9pby9ieXRlc2lvLmMgX2lvL2ZpbGVpby5jIF9pby9pb2Jhc2UuYyBfaW8vX2lvbW9kdWxlLmMgX2lvL3N0cmluZ2lvLmMgX2lvL3RleHRpby5jCisKKworIyBNb2R1bGVzIHdpdGggc29tZSBVTklYIGRlcGVuZGVuY2llcyAtLSBvbiBieSBkZWZhdWx0OgorIyAoSWYgeW91IGhhdmUgYSByZWFsbHkgYmFja3dhcmQgVU5JWCwgc2VsZWN0IGFuZCBzb2NrZXQgbWF5IG5vdCBiZQorIyBzdXBwb3J0ZWQuLi4pCisKKyNmY250bCBmY250bG1vZHVsZS5jCSMgZmNudGwoMikgYW5kIGlvY3RsKDIpCisjc3B3ZCBzcHdkbW9kdWxlLmMJCSMgc3B3ZCgzKSAKKyNncnAgZ3JwbW9kdWxlLmMJCSMgZ3JwKDMpCisjc2VsZWN0IHNlbGVjdG1vZHVsZS5jCSMgc2VsZWN0KDIpOyBub3Qgb24gYW5jaWVudCBTeXN0ZW0gVgorCisjIE1lbW9yeS1tYXBwZWQgZmlsZXMgKGFsc28gd29ya3Mgb24gV2luMzIpLgorI21tYXAgbW1hcG1vZHVsZS5jCisKKyMgQ1NWIGZpbGUgaGVscGVyCisjX2NzdiBfY3N2LmMKKworIyBTb2NrZXQgbW9kdWxlIGhlbHBlciBmb3Igc29ja2V0KDIpCisjX3NvY2tldCBzb2NrZXRtb2R1bGUuYyB0aW1lbW9kdWxlLmMKKworIyBTb2NrZXQgbW9kdWxlIGhlbHBlciBmb3IgU1NMIHN1cHBvcnQ7IHlvdSBtdXN0IGNvbW1lbnQgb3V0IHRoZSBvdGhlcgorIyBzb2NrZXQgbGluZSBhYm92ZSwgYW5kIHBvc3NpYmx5IGVkaXQgdGhlIFNTTCB2YXJpYWJsZToKKyNTU0w9L3Vzci9sb2NhbC9zc2wKKyNfc3NsIF9zc2wuYyBcCisjCS1EVVNFX1NTTCAtSSQoU1NMKS9pbmNsdWRlIC1JJChTU0wpL2luY2x1ZGUvb3BlbnNzbCBcCisjCS1MJChTU0wpL2xpYiAtbHNzbCAtbGNyeXB0bworCisjIFRoZSBjcnlwdCBtb2R1bGUgaXMgbm93IGRpc2FibGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSBpdCBicmVha3MgYnVpbGRzCisjIG9uIG1hbnkgc3lzdGVtcyAod2hlcmUgLWxjcnlwdCBpcyBuZWVkZWQpLCBlLmcuIExpbnV4IChJIGJlbGlldmUpLgorIworIyBGaXJzdCwgbG9vayBhdCBTZXR1cC5jb25maWc7IGNvbmZpZ3VyZSBtYXkgaGF2ZSBzZXQgdGhpcyBmb3IgeW91LgorCisjY3J5cHQgY3J5cHRtb2R1bGUuYyAjIC1sY3J5cHQJIyBjcnlwdCgzKTsgbmVlZHMgLWxjcnlwdCBvbiBzb21lIHN5c3RlbXMKKworCisjIFNvbWUgbW9yZSBVTklYIGRlcGVuZGVudCBtb2R1bGVzIC0tIG9mZiBieSBkZWZhdWx0LCBzaW5jZSB0aGVzZQorIyBhcmUgbm90IHN1cHBvcnRlZCBieSBhbGwgVU5JWCBzeXN0ZW1zOgorCisjbmlzIG5pc21vZHVsZS5jIC1sbnNsCSMgU3VuIHllbGxvdyBwYWdlcyAtLSBub3QgZXZlcnl3aGVyZQorI3Rlcm1pb3MgdGVybWlvcy5jCSMgU3RlZW4gTHVtaG9sdCdzIHRlcm1pb3MgbW9kdWxlCisjcmVzb3VyY2UgcmVzb3VyY2UuYwkjIEplcmVteSBIeWx0b24ncyBybGltaXQgaW50ZXJmYWNlCisKKworIyBNdWx0aW1lZGlhIG1vZHVsZXMgLS0gb2ZmIGJ5IGRlZmF1bHQuCisjIFRoZXNlIGRvbid0IHdvcmsgZm9yIDY0LWJpdCBwbGF0Zm9ybXMhISEKKyMgIzk5MzE3MyBzYXlzIGF1ZGlvb3Agd29ya3Mgb24gNjQtYml0IHBsYXRmb3JtcywgdGhvdWdoLgorIyBUaGVzZSByZXByZXNlbnQgYXVkaW8gc2FtcGxlcyBvciBpbWFnZXMgYXMgc3RyaW5nczoKKworI2F1ZGlvb3AgYXVkaW9vcC5jCSMgT3BlcmF0aW9ucyBvbiBhdWRpbyBzYW1wbGVzCisjaW1hZ2VvcCBpbWFnZW9wLmMJIyBPcGVyYXRpb25zIG9uIGltYWdlcworCisKKyMgTm90ZSB0aGF0IHRoZSBfbWQ1IGFuZCBfc2hhIG1vZHVsZXMgYXJlIG5vcm1hbGx5IG9ubHkgYnVpbHQgaWYgdGhlCisjIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZSBPcGVuU1NMIGxpYnMgY29udGFpbmluZyBhbiBvcHRpbWl6ZWQgdmVyc2lvbi4KKworIyBUaGUgX21kNSBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1CisjIE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSwgZGVzY3JpYmVkIGluIFJGQyAxMzIxLiAgVGhlIG5lY2Vzc2FyeSBmaWxlcworIyBtZDUuYyBhbmQgbWQ1LmggYXJlIGluY2x1ZGVkIGhlcmUuCisKKyNfbWQ1IG1kNW1vZHVsZS5jIG1kNS5jCisKKworIyBUaGUgX3NoYSBtb2R1bGUgaW1wbGVtZW50cyB0aGUgU0hBIGNoZWNrc3VtIGFsZ29yaXRobXMuCisjIChOSVNUJ3MgU2VjdXJlIEhhc2ggQWxnb3JpdGhtcy4pCisjX3NoYSBzaGFtb2R1bGUuYworI19zaGEyNTYgc2hhMjU2bW9kdWxlLmMKKyNfc2hhNTEyIHNoYTUxMm1vZHVsZS5jCisKKworIyBTR0kgSVJJWCBzcGVjaWZpYyBtb2R1bGVzIC0tIG9mZiBieSBkZWZhdWx0LgorCisjIFRoZXNlIG1vZHVsZSB3b3JrIG9uIGFueSBTR0kgbWFjaGluZToKKworIyAqKiogZ2wgbXVzdCBiZSBlbmFibGVkIGhpZ2hlciB1cCBpbiB0aGlzIGZpbGUgKioqCisjZm0gZm1tb2R1bGUuYyAkKEdMSEFDSykgLWxmbSAtbGdsCQkjIEZvbnQgTWFuYWdlcgorI3NnaSBzZ2ltb2R1bGUuYwkJCSMgc2dpLm5hcCgpIGFuZCBhIGZldyBtb3JlCisKKyMgVGhpcyBtb2R1bGUgcmVxdWlyZXMgdGhlIGhlYWRlciBmaWxlCisjIC91c3IvcGVvcGxlLzREZ2lmdHMvaXJpc3Rvb2xzL2luY2x1ZGUvaXpvb20uaDoKKyNpbWdmaWxlIGltZ2ZpbGUuYyAtbGltYWdlIC1sZ3V0aWwgLWxnbCAtbG0JIyBJbWFnZSBQcm9jZXNzaW5nIFV0aWxpdGllcworCisKKyMgVGhlc2UgbW9kdWxlcyByZXF1aXJlIHRoZSBNdWx0aW1lZGlhIERldmVsb3BtZW50IE9wdGlvbiAoSSB0aGluayk6CisKKyNhbCBhbG1vZHVsZS5jIC1sYXVkaW8JCQkjIEF1ZGlvIExpYnJhcnkKKyNjZCBjZG1vZHVsZS5jIC1sY2RhdWRpbyAtbGRzIC1sbWVkaWFkCSMgQ0QgQXVkaW8gTGlicmFyeQorI2NsIGNsbW9kdWxlLmMgLWxjbCAtbGF3YXJlYXVkaW8JIyBDb21wcmVzc2lvbiBMaWJyYXJ5Cisjc3Ygc3Ztb2R1bGUuYyB5dXZjb252ZXJ0LmMgLWxzdmlkZW8gLWxYZXh0IC1sWDExCSMgU3RhcnRlciBWaWRlbworCisKKyMgVGhlIEZPUk1TIGxpYnJhcnksIGJ5IE1hcmsgT3Zlcm1hcnMsIGltcGxlbWVudHMgdXNlciBpbnRlcmZhY2UKKyMgY29tcG9uZW50cyBzdWNoIGFzIGRpYWxvZ3MgYW5kIGJ1dHRvbnMgdXNpbmcgU0dJJ3MgR0wgYW5kIEZNCisjIGxpYnJhcmllcy4gIFlvdSBtdXN0IGZ0cCB0aGUgRk9STVMgbGlicmFyeSBzZXBhcmF0ZWx5IGZyb20KKyMgZnRwOi8vZnRwLmNzLnJ1dS5ubC9wdWIvU0dJL0ZPUk1TLiAgSXQgd2FzIHRlc3RlZCB3aXRoIEZPUk1TIDIuMmEuCisjIE5PVEU6IGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gdXNlIEZPUk1TIGFuZCBjdXJzZXMgc2ltdWx0YW5lb3VzbHkKKyMgKG9yIGJvdGggbGluayB0aGVtIHN0YXRpY2FsbHkgaW50byB0aGUgc2FtZSBiaW5hcnkpLCB5b3UgbXVzdAorIyBjb21waWxlIGFsbCBvZiBGT1JNUyB3aXRoIHRoZSBjYyBvcHRpb24gIi1EY2xlYXI9X19HTGNsZWFyIi4KKworIyBUaGUgRk9STVMgdmFyaWFibGUgbXVzdCBwb2ludCB0byB0aGUgRk9STVMgc3ViZGlyZWN0b3J5IG9mIHRoZSBmb3JtcworIyB0b3BsZXZlbCBkaXJlY3Rvcnk6CisKKyNGT1JNUz0vdWZzL2d1aWRvL3NyYy9mb3Jtcy9GT1JNUworI2ZsIGZsbW9kdWxlLmMgLUkkKEZPUk1TKSAkKEdMSEFDSykgJChGT1JNUykvbGliZm9ybXMuYSAtbGZtIC1sZ2wKKworCisjIFN1bk9TIHNwZWNpZmljIG1vZHVsZXMgLS0gb2ZmIGJ5IGRlZmF1bHQ6CisKKyNzdW5hdWRpb2RldiBzdW5hdWRpb2Rldi5jCisKKworIyBBIExpbnV4IHNwZWNpZmljIG1vZHVsZSAtLSBvZmYgYnkgZGVmYXVsdDsgdGhpcyBtYXkgYWxzbyB3b3JrIG9uIAorIyBzb21lICpCU0RzLgorCisjbGludXhhdWRpb2RldiBsaW51eGF1ZGlvZGV2LmMKKworCisjIEdlb3JnZSBOZXZpbGxlLU5laWwncyB0aW1pbmcgbW9kdWxlOgorCisjdGltaW5nIHRpbWluZ21vZHVsZS5jCisKKworIyBUaGUgX3RraW50ZXIgbW9kdWxlLgorIworIyBUaGUgY29tbWFuZCBmb3IgX3RraW50ZXIgaXMgbG9uZyBhbmQgc2l0ZSBzcGVjaWZpYy4gIFBsZWFzZQorIyB1bmNvbW1lbnQgYW5kL29yIGVkaXQgdGhvc2UgcGFydHMgYXMgaW5kaWNhdGVkLiAgSWYgeW91IGRvbid0IGhhdmUgYQorIyBzcGVjaWZpYyBleHRlbnNpb24gKGUuZy4gVGl4IG9yIEJMVCksIGxlYXZlIHRoZSBjb3JyZXNwb25kaW5nIGxpbmUKKyMgY29tbWVudGVkIG91dC4gIChMZWF2ZSB0aGUgdHJhaWxpbmcgYmFja3NsYXNoZXMgaW4hICBJZiB5b3UKKyMgZXhwZXJpZW5jZSBzdHJhbmdlIGVycm9ycywgeW91IG1heSB3YW50IHRvIGpvaW4gYWxsIHVuY29tbWVudGVkCisjIGxpbmVzIGFuZCByZW1vdmUgdGhlIGJhY2tzbGFzaGVzIC0tIHRoZSBiYWNrc2xhc2ggaW50ZXJwcmV0YXRpb24gaXMKKyMgZG9uZSBieSB0aGUgc2hlbGwncyAicmVhZCIgY29tbWFuZCBhbmQgaXQgbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBvbgorIyBldmVyeSBzeXN0ZW0uCisKKyMgKioqIEFsd2F5cyB1bmNvbW1lbnQgdGhpcyAobGVhdmUgdGhlIGxlYWRpbmcgdW5kZXJzY29yZSBpbiEpOgorIyBfdGtpbnRlciBfdGtpbnRlci5jIHRrYXBwaW5pdC5jIC1EV0lUSF9BUFBJTklUIFwKKyMgKioqIFVuY29tbWVudCBhbmQgZWRpdCB0byByZWZsZWN0IHdoZXJlIHlvdXIgVGNsL1RrIGxpYnJhcmllcyBhcmU6CisjCS1ML3Vzci9sb2NhbC9saWIgXAorIyAqKiogVW5jb21tZW50IGFuZCBlZGl0IHRvIHJlZmxlY3Qgd2hlcmUgeW91ciBUY2wvVGsgaGVhZGVycyBhcmU6CisjCS1JL3Vzci9sb2NhbC9pbmNsdWRlIFwKKyMgKioqIFVuY29tbWVudCBhbmQgZWRpdCB0byByZWZsZWN0IHdoZXJlIHlvdXIgWDExIGhlYWRlciBmaWxlcyBhcmU6CisjCS1JL3Vzci9YMTFSNi9pbmNsdWRlIFwKKyMgKioqIE9yIHVuY29tbWVudCB0aGlzIGZvciBTb2xhcmlzOgorIwktSS91c3Ivb3Blbndpbi9pbmNsdWRlIFwKKyMgKioqIFVuY29tbWVudCBhbmQgZWRpdCBmb3IgVGl4IGV4dGVuc2lvbiBvbmx5OgorIwktRFdJVEhfVElYIC1sdGl4OC4xLjguMiBcCisjICoqKiBVbmNvbW1lbnQgYW5kIGVkaXQgZm9yIEJMVCBleHRlbnNpb24gb25seToKKyMJLURXSVRIX0JMVCAtSS91c3IvbG9jYWwvYmx0L2JsdDguMC11bm9mZi9pbmNsdWRlIC1sQkxUOC4wIFwKKyMgKioqIFVuY29tbWVudCBhbmQgZWRpdCBmb3IgUElMIChUa0ltYWdpbmcpIGV4dGVuc2lvbiBvbmx5OgorIyAgICAgKFNlZSBodHRwOi8vd3d3LnB5dGhvbndhcmUuY29tL3Byb2R1Y3RzL3BpbC8gZm9yIG1vcmUgaW5mbykKKyMJLURXSVRIX1BJTCAtSS4uL0V4dGVuc2lvbnMvSW1hZ2luZy9saWJJbWFnaW5nICB0a0ltYWdpbmcuYyBcCisjICoqKiBVbmNvbW1lbnQgYW5kIGVkaXQgZm9yIFRPR0wgZXh0ZW5zaW9uIG9ubHk6CisjCS1EV0lUSF9UT0dMIHRvZ2wuYyBcCisjICoqKiBVbmNvbW1lbnQgYW5kIGVkaXQgdG8gcmVmbGVjdCB5b3VyIFRjbC9UayB2ZXJzaW9uczoKKyMJLWx0azguMiAtbHRjbDguMiBcCisjICoqKiBVbmNvbW1lbnQgYW5kIGVkaXQgdG8gcmVmbGVjdCB3aGVyZSB5b3VyIFgxMSBsaWJyYXJpZXMgYXJlOgorIwktTC91c3IvWDExUjYvbGliIFwKKyMgKioqIE9yIHVuY29tbWVudCB0aGlzIGZvciBTb2xhcmlzOgorIwktTC91c3Ivb3Blbndpbi9saWIgXAorIyAqKiogVW5jb21tZW50IHRoZXNlIGZvciBUT0dMIGV4dGVuc2lvbiBvbmx5OgorIwktbEdMIC1sR0xVIC1sWGV4dCAtbFhtdSBcCisjICoqKiBVbmNvbW1lbnQgZm9yIEFJWDoKKyMJLWxsZCBcCisjICoqKiBBbHdheXMgdW5jb21tZW50IHRoaXM7IFgxMSBsaWJyYXJpZXMgdG8gbGluayB3aXRoOgorIwktbFgxMQorCisjIExhbmNlIEVsbGluZ2hhdXMncyBzeXNsb2cgbW9kdWxlCisjc3lzbG9nIHN5c2xvZ21vZHVsZS5jCQkjIHN5c2xvZyBkYWVtb24gaW50ZXJmYWNlCisKKworIyBDdXJzZXMgc3VwcG9ydCwgcmVxdXJpbmcgdGhlIFN5c3RlbSBWIHZlcnNpb24gb2YgY3Vyc2VzLCBvZnRlbgorIyBwcm92aWRlZCBieSB0aGUgbmN1cnNlcyBsaWJyYXJ5LiAgZS5nLiBvbiBMaW51eCwgbGluayB3aXRoIC1sbmN1cnNlcworIyBpbnN0ZWFkIG9mIC1sY3Vyc2VzKS4KKyMKKyMgRmlyc3QsIGxvb2sgYXQgU2V0dXAuY29uZmlnOyBjb25maWd1cmUgbWF5IGhhdmUgc2V0IHRoaXMgZm9yIHlvdS4KKworI19jdXJzZXMgX2N1cnNlc21vZHVsZS5jIC1sY3Vyc2VzIC1sdGVybWNhcAorIyBXcmFwcGVyIGZvciB0aGUgcGFuZWwgbGlicmFyeSB0aGF0J3MgcGFydCBvZiBuY3Vyc2VzIGFuZCBTWVNWIGN1cnNlcy4KKyNfY3Vyc2VzX3BhbmVsIF9jdXJzZXNfcGFuZWwuYyAtbHBhbmVsIC1sbmN1cnNlcyAKKworCisjIEdlbmVyaWMgKFN1bk9TIC8gU1ZSNCkgZHluYW1pYyBsb2FkaW5nIG1vZHVsZS4KKyMgVGhpcyBpcyBub3QgbmVlZGVkIGZvciBkeW5hbWljIGxvYWRpbmcgb2YgUHl0aG9uIG1vZHVsZXMgLS0KKyMgaXQgaXMgYSBoaWdobHkgZXhwZXJpbWVudGFsIGFuZCBkYW5nZXJvdXMgZGV2aWNlIGZvciBjYWxsaW5nCisjICphcmJpdHJhcnkqIEMgZnVuY3Rpb25zIGluICphcmJpdHJhcnkqIHNoYXJlZCBsaWJyYXJpZXM6CisKKyNkbCBkbG1vZHVsZS5jCisKKworIyBNb2R1bGVzIHRoYXQgcHJvdmlkZSBwZXJzaXN0ZW50IGRpY3Rpb25hcnktbGlrZSBzZW1hbnRpY3MuICBZb3Ugd2lsbAorIyBwcm9iYWJseSB3YW50IHRvIGFycmFuZ2UgZm9yIGF0IGxlYXN0IG9uZSBvZiB0aGVtIHRvIGJlIGF2YWlsYWJsZSBvbgorIyB5b3VyIG1hY2hpbmUsIHRob3VnaCBub25lIGFyZSBkZWZpbmVkIGJ5IGRlZmF1bHQgYmVjYXVzZSBvZiBsaWJyYXJ5CisjIGRlcGVuZGVuY2llcy4gIFRoZSBQeXRob24gbW9kdWxlIGFueWRibS5weSBwcm92aWRlcyBhbgorIyBpbXBsZW1lbnRhdGlvbiBpbmRlcGVuZGVudCB3cmFwcGVyIGZvciB0aGVzZTsgZHVtYmRibS5weSBwcm92aWRlcworIyBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgKGJ1dCBzbG93ZXIgb2YgY291cnNlKSBpbXBsZW1lbnRlZCBpbiBQeXRob24uCisKKyMgVGhlIHN0YW5kYXJkIFVuaXggZGJtIG1vZHVsZSBoYXMgYmVlbiBtb3ZlZCB0byBTZXR1cC5jb25maWcgc28gdGhhdAorIyBpdCB3aWxsIGJlIGNvbXBpbGVkIGFzIGEgc2hhcmVkIGxpYnJhcnkgYnkgZGVmYXVsdC4gIENvbXBpbGluZyBpdCBhcworIyBhIGJ1aWx0LWluIG1vZHVsZSBjYXVzZXMgY29uZmxpY3RzIHdpdGggdGhlIHB5YnNkZGIzIG1vZHVsZSBzaW5jZSBpdAorIyBjcmVhdGVzIGEgc3RhdGljIGRlcGVuZGVuY3kgb24gYW4gb3V0LW9mLWRhdGUgdmVyc2lvbiBvZiBkYi5zby4KKyMKKyMgRmlyc3QsIGxvb2sgYXQgU2V0dXAuY29uZmlnOyBjb25maWd1cmUgbWF5IGhhdmUgc2V0IHRoaXMgZm9yIHlvdS4KKworI2RibSBkYm1tb2R1bGUuYyAJIyBkYm0oMykgbWF5IHJlcXVpcmUgLWxuZGJtIG9yIHNpbWlsYXIKKworIyBBbnRob255IEJheHRlcidzIGdkYm0gbW9kdWxlLiAgR05VIGRibSgzKSB3aWxsIHJlcXVpcmUgLWxnZGJtOgorIworIyBGaXJzdCwgbG9vayBhdCBTZXR1cC5jb25maWc7IGNvbmZpZ3VyZSBtYXkgaGF2ZSBzZXQgdGhpcyBmb3IgeW91LgorCisjZ2RibSBnZGJtbW9kdWxlLmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUgLUwvdXNyL2xvY2FsL2xpYiAtbGdkYm0KKworCisjIFNsZWVweWNhdCBCZXJrZWxleSBEQiBpbnRlcmZhY2UuCisjCisjIFRoaXMgcmVxdWlyZXMgdGhlIFNsZWVweWNhdCBEQiBjb2RlLCBzZWUgaHR0cDovL3d3dy5zbGVlcHljYXQuY29tLworIyBUaGUgZWFybGllc3Qgc3VwcG9ydGVkIHZlcnNpb24gb2YgdGhhdCBsaWJyYXJ5IGlzIDMuMCwgdGhlIGxhdGVzdAorIyBzdXBwb3J0ZWQgdmVyc2lvbiBpcyA0LjAgKDQuMSBpcyBzcGVjaWZpY2FsbHkgbm90IHN1cHBvcnRlZCwgYXMgdGhhdAorIyBjaGFuZ2VzIHRoZSBzZW1hbnRpY3Mgb2YgdHJhbnNhY3Rpb25hbCBkYXRhYmFzZXMpLiBBIGxpc3Qgb2YgYXZhaWxhYmxlCisjIHJlbGVhc2VzIGNhbiBiZSBmb3VuZCBhdAorIworIyBodHRwOi8vd3d3LnNsZWVweWNhdC5jb20vdXBkYXRlL2luZGV4Lmh0bWwKKyMKKyMgRWRpdCB0aGUgdmFyaWFibGVzIERCIGFuZCBEQkxJQlZFUnRvIHBvaW50IHRvIHRoZSBkYiB0b3AgZGlyZWN0b3J5CisjIGFuZCB0aGUgc3ViZGlyZWN0b3J5IG9mIFBPUlQgd2hlcmUgeW91IGJ1aWx0IGl0LgorI0RCPS91c3IvbG9jYWwvQmVya2VsZXlEQi40LjAKKyNEQkxJQlZFUj00LjAKKyNEQklOQz0kKERCKS9pbmNsdWRlCisjREJMSUI9JChEQikvbGliCisjX2JzZGRiIF9ic2RkYi5jIC1JJChEQklOQykgLUwkKERCTElCKSAtbGRiLSQoREJMSUJWRVIpCisKKyMgSGlzdG9yaWNhbCBCZXJrZWxleSBEQiAxLjg1CisjCisjIFRoaXMgbW9kdWxlIGlzIGRlcHJlY2F0ZWQ7IHRoZSAxLjg1IHZlcnNpb24gb2YgdGhlIEJlcmtlbGV5IERCIGxpYnJhcnkgaGFzCisjIGJ1Z3MgdGhhdCBjYW4gY2F1c2UgZGF0YSBjb3JydXB0aW9uLiBJZiB5b3UgY2FuLCB1c2UgbGF0ZXIgdmVyc2lvbnMgb2YgdGhlCisjIGxpYnJhcnkgaW5zdGVhZCwgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cuc2xlZXB5Y2F0LmNvbS8+LgorCisjREI9L2RlcG90L3N1bmRyeS9zcmMvYmVya2VsZXktZGIvZGIuMS44NQorI0RCUE9SVD0kKERCKS9QT1JUL2lyaXguNS4zCisjYnNkZGIxODUgYnNkZGJtb2R1bGUuYyAtSSQoREJQT1JUKS9pbmNsdWRlIC1JJChEQlBPUlQpICQoREJQT1JUKS9saWJkYi5hCisKKworCisjIEhlbHBlciBtb2R1bGUgZm9yIHZhcmlvdXMgYXNjaWktZW5jb2RlcnMKKyNiaW5hc2NpaSBiaW5hc2NpaS5jCisKKyMgRnJlZCBEcmFrZSdzIGludGVyZmFjZSB0byB0aGUgUHl0aG9uIHBhcnNlcgorI3BhcnNlciBwYXJzZXJtb2R1bGUuYworCisjIGNTdHJpbmdJTyBhbmQgY1BpY2tsZQorI2NTdHJpbmdJTyBjU3RyaW5nSU8uYworI2NQaWNrbGUgY1BpY2tsZS5jCisKKworIyBMZWUgQnVzYnkncyBTSUdGUEUgbW9kdWxlcy4KKyMgVGhlIGxpYnJhcnkgdG8gbGluayBmcGVjdGwgd2l0aCBpcyBwbGF0Zm9ybSBzcGVjaWZpYy4KKyMgQ2hvb3NlICpvbmUqIG9mIHRoZSBvcHRpb25zIGJlbG93IGZvciBmcGVjdGw6CisKKyMgRm9yIFNHSSBJUklYICh0ZXN0ZWQgb24gNS4zKToKKyNmcGVjdGwgZnBlY3RsbW9kdWxlLmMgLWxmcGUKKworIyBGb3IgU29sYXJpcyB3aXRoIFN1blBybyBjb21waWxlciAodGVzdGVkIG9uIFNvbGFyaXMgMi41IHdpdGggU3VuUHJvIEMgNC4yKToKKyMgKFdpdGhvdXQgdGhlIGNvbXBpbGVyIHlvdSBkb24ndCBoYXZlIC1sc3VubWF0aC4pCisjZnBlY3RsIGZwZWN0bG1vZHVsZS5jIC1SL29wdC9TVU5Xc3Byby9saWIgLWxzdW5tYXRoIC1sbQorCisjIEZvciBvdGhlciBzeXN0ZW1zOiBzZWUgaW5zdHJ1Y3Rpb25zIGluIGZwZWN0bG1vZHVsZS5jLgorI2ZwZWN0bCBmcGVjdGxtb2R1bGUuYyAuLi4KKworIyBUZXN0IG1vZHVsZSBmb3IgZnBlY3RsLiAgTm8gZXh0cmEgbGlicmFyaWVzIG5lZWRlZC4KKyNmcGV0ZXN0IGZwZXRlc3Rtb2R1bGUuYworCisjIEFuZHJldyBLdWNobGluZydzIHpsaWIgbW9kdWxlLgorIyBUaGlzIHJlcXVpcmUgemxpYiAxLjEuMyAob3IgbGF0ZXIpLgorIyBTZWUgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLworI3psaWIgemxpYm1vZHVsZS5jIC1JJChwcmVmaXgpL2luY2x1ZGUgLUwkKGV4ZWNfcHJlZml4KS9saWIgLWx6CisKKyMgSW50ZXJmYWNlIHRvIHRoZSBFeHBhdCBYTUwgcGFyc2VyCisjCisjIEV4cGF0IHdhcyB3cml0dGVuIGJ5IEphbWVzIENsYXJrIGFuZCBpcyBub3cgbWFpbnRhaW5lZCBieSBhIGdyb3VwIG9mCisjIGRldmVsb3BlcnMgb24gU291cmNlRm9yZ2U7IHNlZSB3d3cubGliZXhwYXQub3JnIGZvciBtb3JlCisjIGluZm9ybWF0aW9uLiAgVGhlIHB5ZXhwYXQgbW9kdWxlIHdhcyB3cml0dGVuIGJ5IFBhdWwgUHJlc2NvZCBhZnRlciBhCisjIHByb3RvdHlwZSBieSBKYWNrIEphbnNlbi4gIFNvdXJjZSBvZiBFeHBhdCAxLjk1LjIgaXMgaW5jbHVkZWQgaW4KKyMgTW9kdWxlcy9leHBhdC8uICBVc2FnZSBvZiBhIHN5c3RlbSBzaGFyZWQgbGliZXhwYXQuc28vZXhwYXQuZGxsIGlzCisjIG5vdCBhZHZpc2VkLgorIworIyBNb3JlIGluZm9ybWF0aW9uIG9uIEV4cGF0IGNhbiBiZSBmb3VuZCBhdCB3d3cubGliZXhwYXQub3JnLgorIworI3B5ZXhwYXQgZXhwYXQveG1scGFyc2UuYyBleHBhdC94bWxyb2xlLmMgZXhwYXQveG1sdG9rLmMgcHlleHBhdC5jIC1JJChzcmNkaXIpL01vZHVsZXMvZXhwYXQgLURIQVZFX0VYUEFUX0NPTkZJR19IIC1EVVNFX1BZRVhQQVRfQ0FQSQorCisKKyMgSHllLVNoaWsgQ2hhbmcncyBDSktDb2RlY3MKKworIyBtdWx0aWJ5dGVjb2RlYyBpcyByZXF1aXJlZCBmb3IgYWxsIHRoZSBvdGhlciBDSksgY29kZWMgbW9kdWxlcworI19tdWx0aWJ5dGVjb2RlYyBjamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYworCisjX2NvZGVjc19jbiBjamtjb2RlY3MvX2NvZGVjc19jbi5jCisjX2NvZGVjc19oayBjamtjb2RlY3MvX2NvZGVjc19oay5jCisjX2NvZGVjc19pc28yMDIyIGNqa2NvZGVjcy9fY29kZWNzX2lzbzIwMjIuYworI19jb2RlY3NfanAgY2prY29kZWNzL19jb2RlY3NfanAuYworI19jb2RlY3Nfa3IgY2prY29kZWNzL19jb2RlY3Nfa3IuYworI19jb2RlY3NfdHcgY2prY29kZWNzL19jb2RlY3NfdHcuYworCisjIEV4YW1wbGUgLS0gaW5jbHVkZWQgZm9yIHJlZmVyZW5jZSBvbmx5OgorIyB4eCB4eG1vZHVsZS5jCisKKyMgQW5vdGhlciBleGFtcGxlIC0tIHRoZSAneHhzdWJ0eXBlJyBtb2R1bGUgc2hvd3MgQy1sZXZlbCBzdWJ0eXBpbmcgaW4gYWN0aW9uCit4eHN1YnR5cGUgeHhzdWJ0eXBlLmMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29uZmlnL1NldHVwLmNvbmZpZyBiL2xpYi9weXRob24yLjcvY29uZmlnL1NldHVwLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDI3OGJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb25maWcvU2V0dXAuY29uZmlnCkBAIC0wLDAgKzEsMjYgQEAKKyMgVGhpcyBmaWxlIGlzIHRyYW5zbW9ncmlmaWVkIGludG8gU2V0dXAuY29uZmlnIGJ5IGNvbmZpZy5zdGF0dXMuCisKKyMgVGhlIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIGNvbmRpdGlvbmFsbHkgZW5hYmxlIGNlcnRhaW4gbW9kdWxlcworIyBiYXNlZCBvbiBjb25maWd1cmUtdGltZSBvcHRpb25zLgorCisjIGluaXQgc3lzdGVtIGNhbGxzKHBvc2l4L250Ly4uLikgZm9yIElOSVRGVU5DICh1c2VkIGJ5IG1ha2VzZXR1cCkKK3Bvc2l4IHBvc2l4bW9kdWxlLmMKKworIyBUaHJlYWRpbmcKK3RocmVhZCB0aHJlYWRtb2R1bGUuYworCisjIFRoZSBzaWduYWwgbW9kdWxlCitzaWduYWwgc2lnbmFsbW9kdWxlLmMKKworIyBPbiB3aW4zMiBob3N0KG1pbmd3IGJ1aWxkIGluIE1TWVMgZW52aXJvbm1lbnQpIHNob3cgdGhhdCBzaXRlLnB5CisjIGZhaWwgdG8gbG9hZCBpZiBzb21lIG1vZHVsZXMgYXJlIG5vdCBidWlsZC1pbjoKKyNfZnVuY3Rvb2xzIF9mdW5jdG9vbHNtb2R1bGUuYwkjIFRvb2xzIGZvciB3b3JraW5nIHdpdGggZnVuY3Rpb25zIGFuZCBjYWxsYWJsZSBvYmplY3RzCisjb3BlcmF0b3Igb3BlcmF0b3IuYwkjIG9wZXJhdG9yLmFkZCgpIGFuZCBzaW1pbGFyIGdvb2RpZXMKKyNfbG9jYWxlIF9sb2NhbGVtb2R1bGUuYwkjIC1saW50bAorI193aW5yZWcgLi4vUEMvX3dpbnJlZy5jCisjdGltZSB0aW1lbW9kdWxlLmMKKyNtc3ZjcnQgLi4vUEMvbXN2Y3J0bW9kdWxlLmMKKworCisjIFRoZSByZXN0IG9mIHRoZSBtb2R1bGVzIHByZXZpb3VzbHkgbGlzdGVkIGluIHRoaXMgZmlsZSBhcmUgYnVpbHQKKyMgYnkgdGhlIHNldHVwLnB5IHNjcmlwdCBpbiBQeXRob24gMi4xIGFuZCBsYXRlci4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29uZmlnL1NldHVwLmxvY2FsIGIvbGliL3B5dGhvbjIuNy9jb25maWcvU2V0dXAubG9jYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyOTgzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29uZmlnL1NldHVwLmxvY2FsCkBAIC0wLDAgKzEgQEAKKyMgRWRpdCB0aGlzIGZpbGUgZm9yIGxvY2FsIHNldHVwIGNoYW5nZXMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29uZmlnL2NvbmZpZy5jIGIvbGliL3B5dGhvbjIuNy9jb25maWcvY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlZTBhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29uZmlnL2NvbmZpZy5jCkBAIC0wLDAgKzEsODYgQEAKKy8qIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNS9Nb2R1bGVzL2NvbmZpZy5jLmluIGJ5IG1ha2VzZXR1cC4gKi8KKy8qIC0qLSBDIC0qLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAwLCBCZU9wZW4uY29tLgorQ29weXJpZ2h0IChjKSAxOTk1LTIwMDAsIENvcnBvcmF0aW9uIGZvciBOYXRpb25hbCBSZXNlYXJjaCBJbml0aWF0aXZlcy4KK0NvcHlyaWdodCAoYykgMTk5MC0xOTk1LCBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0uCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitTZWUgdGhlIGZpbGUgIk1pc2MvQ09QWVJJR0hUIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kCityZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNb2R1bGUgY29uZmlndXJhdGlvbiAqLworCisvKiAhISEgISEhICEhISBUaGlzIGZpbGUgaXMgZWRpdGVkIGJ5IHRoZSBtYWtlc2V0dXAgc2NyaXB0ICEhISAhISEgISEhICovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgdGFibGUgb2YgYnVpbHQtaW4gbW9kdWxlcy4KKyAgIFNlZSBpbml0X2J1aWx0aW4oKSBpbiBpbXBvcnQuYy4gKi8KKworI2luY2x1ZGUgIlB5dGhvbi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworZXh0ZXJuIHZvaWQgaW5pdHBvc2l4KHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdHRocmVhZCh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRzaWduYWwodm9pZCk7CitleHRlcm4gdm9pZCBpbml0ZXJybm8odm9pZCk7CitleHRlcm4gdm9pZCBpbml0X3NyZSh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfY29kZWNzKHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdF93ZWFrcmVmKHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdHppcGltcG9ydCh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfc3ltdGFibGUodm9pZCk7CitleHRlcm4gdm9pZCBpbml0eHhzdWJ0eXBlKHZvaWQpOworLyogLS0gQURETU9EVUxFIE1BUktFUiAxIC0tICovCisKK2V4dGVybiB2b2lkIFB5TWFyc2hhbF9Jbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdGltcCh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRnYyh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfYXN0KHZvaWQpOworZXh0ZXJuIHZvaWQgX1B5V2FybmluZ3NfSW5pdCh2b2lkKTsKKworc3RydWN0IF9pbml0dGFiIF9QeUltcG9ydF9Jbml0dGFiW10gPSB7CisKK3sicG9zaXgiLCBpbml0cG9zaXh9LAoreyJ0aHJlYWQiLCBpbml0dGhyZWFkfSwKK3sic2lnbmFsIiwgaW5pdHNpZ25hbH0sCit7ImVycm5vIiwgaW5pdGVycm5vfSwKK3siX3NyZSIsIGluaXRfc3JlfSwKK3siX2NvZGVjcyIsIGluaXRfY29kZWNzfSwKK3siX3dlYWtyZWYiLCBpbml0X3dlYWtyZWZ9LAoreyJ6aXBpbXBvcnQiLCBpbml0emlwaW1wb3J0fSwKK3siX3N5bXRhYmxlIiwgaW5pdF9zeW10YWJsZX0sCit7Inh4c3VidHlwZSIsIGluaXR4eHN1YnR5cGV9LAorLyogLS0gQURETU9EVUxFIE1BUktFUiAyIC0tICovCisKKyAgICAvKiBUaGlzIG1vZHVsZSBsaXZlcyBpbiBtYXJzaGFsLmMgKi8KKyAgICB7Im1hcnNoYWwiLCBQeU1hcnNoYWxfSW5pdH0sCisKKyAgICAvKiBUaGlzIGxpdmVzIGluIGltcG9ydC5jICovCisgICAgeyJpbXAiLCBpbml0aW1wfSwKKworICAgIC8qIFRoaXMgbGl2ZXMgaW4gUHl0aG9uL1B5dGhvbi1hc3QuYyAqLworICAgIHsiX2FzdCIsIGluaXRfYXN0fSwKKworICAgIC8qIFRoZXNlIGVudHJpZXMgYXJlIGhlcmUgZm9yIHN5cy5idWlsdGluX21vZHVsZV9uYW1lcyAqLworICAgIHsiX19tYWluX18iLCBOVUxMfSwKKyAgICB7Il9fYnVpbHRpbl9fIiwgTlVMTH0sCisgICAgeyJzeXMiLCBOVUxMfSwKKyAgICB7ImV4Y2VwdGlvbnMiLCBOVUxMfSwKKworICAgIC8qIFRoaXMgbGl2ZXMgaW4gZ2Ntb2R1bGUuYyAqLworICAgIHsiZ2MiLCBpbml0Z2N9LAorCisgICAgLyogVGhpcyBsaXZlcyBpbiBfd2FybmluZ3MuYyAqLworICAgIHsiX3dhcm5pbmdzIiwgX1B5V2FybmluZ3NfSW5pdH0sCisKKyAgICAvKiBTZW50aW5lbCAqLworICAgIHswLCAwfQorfTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb25maWcvY29uZmlnLmMuaW4gYi9saWIvcHl0aG9uMi43L2NvbmZpZy9jb25maWcuYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWE0MjdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb25maWcvY29uZmlnLmMuaW4KQEAgLTAsMCArMSw2NSBAQAorLyogLSotIEMgLSotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitDb3B5cmlnaHQgKGMpIDIwMDAsIEJlT3Blbi5jb20uCitDb3B5cmlnaHQgKGMpIDE5OTUtMjAwMCwgQ29ycG9yYXRpb24gZm9yIE5hdGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzLgorQ29weXJpZ2h0IChjKSAxOTkwLTE5OTUsIFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bS4KK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1NlZSB0aGUgZmlsZSAiTWlzYy9DT1BZUklHSFQiIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQKK3JlZGlzdHJpYnV0aW9uIG9mIHRoaXMgZmlsZSwgYW5kIGZvciBhIERJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIE1vZHVsZSBjb25maWd1cmF0aW9uICovCisKKy8qICEhISAhISEgISEhIFRoaXMgZmlsZSBpcyBlZGl0ZWQgYnkgdGhlIG1ha2VzZXR1cCBzY3JpcHQgISEhICEhISAhISEgKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSB0YWJsZSBvZiBidWlsdC1pbiBtb2R1bGVzLgorICAgU2VlIGluaXRfYnVpbHRpbigpIGluIGltcG9ydC5jLiAqLworCisjaW5jbHVkZSAiUHl0aG9uLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiAtLSBBRERNT0RVTEUgTUFSS0VSIDEgLS0gKi8KKworZXh0ZXJuIHZvaWQgUHlNYXJzaGFsX0luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpbml0aW1wKHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdGdjKHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdF9hc3Qodm9pZCk7CitleHRlcm4gdm9pZCBfUHlXYXJuaW5nc19Jbml0KHZvaWQpOworCitzdHJ1Y3QgX2luaXR0YWIgX1B5SW1wb3J0X0luaXR0YWJbXSA9IHsKKworLyogLS0gQURETU9EVUxFIE1BUktFUiAyIC0tICovCisKKyAgICAvKiBUaGlzIG1vZHVsZSBsaXZlcyBpbiBtYXJzaGFsLmMgKi8KKyAgICB7Im1hcnNoYWwiLCBQeU1hcnNoYWxfSW5pdH0sCisKKyAgICAvKiBUaGlzIGxpdmVzIGluIGltcG9ydC5jICovCisgICAgeyJpbXAiLCBpbml0aW1wfSwKKworICAgIC8qIFRoaXMgbGl2ZXMgaW4gUHl0aG9uL1B5dGhvbi1hc3QuYyAqLworICAgIHsiX2FzdCIsIGluaXRfYXN0fSwKKworICAgIC8qIFRoZXNlIGVudHJpZXMgYXJlIGhlcmUgZm9yIHN5cy5idWlsdGluX21vZHVsZV9uYW1lcyAqLworICAgIHsiX19tYWluX18iLCBOVUxMfSwKKyAgICB7Il9fYnVpbHRpbl9fIiwgTlVMTH0sCisgICAgeyJzeXMiLCBOVUxMfSwKKyAgICB7ImV4Y2VwdGlvbnMiLCBOVUxMfSwKKworICAgIC8qIFRoaXMgbGl2ZXMgaW4gZ2Ntb2R1bGUuYyAqLworICAgIHsiZ2MiLCBpbml0Z2N9LAorCisgICAgLyogVGhpcyBsaXZlcyBpbiBfd2FybmluZ3MuYyAqLworICAgIHsiX3dhcm5pbmdzIiwgX1B5V2FybmluZ3NfSW5pdH0sCisKKyAgICAvKiBTZW50aW5lbCAqLworICAgIHswLCAwfQorfTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb25maWcvaW5zdGFsbC1zaCBiL2xpYi9weXRob24yLjcvY29uZmlnL2luc3RhbGwtc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGVjMjdiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29uZmlnL2luc3RhbGwtc2gKQEAgLTAsMCArMSwyOTQgQEAKKyMhL2Jpbi9zaAorIworIyBpbnN0YWxsIC0gaW5zdGFsbCBhIHByb2dyYW0sIHNjcmlwdCwgb3IgZGF0YWZpbGUKKyMKKyMgVGhpcyBvcmlnaW5hdGVzIGZyb20gWDExUjUgKG1pdC91dGlsL3NjcmlwdHMvaW5zdGFsbC5zaCksIHdoaWNoIHdhcworIyBsYXRlciByZWxlYXNlZCBpbiBYMTFSNiAoeGMvY29uZmlnL3V0aWwvaW5zdGFsbC5zaCkgd2l0aCB0aGUKKyMgZm9sbG93aW5nIGNvcHlyaWdodCBhbmQgbGljZW5zZS4KKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk0IFggQ29uc29ydGl1bQorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisjIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bworIyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZQorIyByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyMgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisjIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorIyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisjIFggQ09OU09SVElVTSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyMgQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDLQorIyBUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIworIyBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWCBDb25zb3J0aXVtIHNoYWxsIG5vdAorIyBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbC0KKyMgaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gdGhlIFggQ29uc29yLQorIyB0aXVtLgorIworIworIyBGU0YgY2hhbmdlcyB0byB0aGlzIGZpbGUgYXJlIGluIHRoZSBwdWJsaWMgZG9tYWluLgorIworIyBDYWxsaW5nIHRoaXMgc2NyaXB0IGluc3RhbGwtc2ggaXMgcHJlZmVycmVkIG92ZXIgaW5zdGFsbC5zaCwgdG8gcHJldmVudAorIyBgbWFrZScgaW1wbGljaXQgcnVsZXMgZnJvbSBjcmVhdGluZyBhIGZpbGUgY2FsbGVkIGluc3RhbGwgZnJvbSBpdAorIyB3aGVuIHRoZXJlIGlzIG5vIE1ha2VmaWxlLgorIworIyBUaGlzIHNjcmlwdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIEJTRCBpbnN0YWxsIHNjcmlwdCwgYnV0IHdhcyB3cml0dGVuCisjIGZyb20gc2NyYXRjaC4gIEl0IGNhbiBvbmx5IGluc3RhbGwgb25lIGZpbGUgYXQgYSB0aW1lLCBhIHJlc3RyaWN0aW9uCisjIHNoYXJlZCB3aXRoIG1hbnkgT1MncyBpbnN0YWxsIHByb2dyYW1zLgorCisKKyMgc2V0IERPSVRQUk9HIHRvIGVjaG8gdG8gdGVzdCB0aGlzIHNjcmlwdAorCisjIERvbid0IHVzZSA6LSBzaW5jZSA0LjNCU0QgYW5kIGVhcmxpZXIgc2hlbGxzIGRvbid0IGxpa2UgaXQuCitkb2l0PSIke0RPSVRQUk9HLX0iCisKKworIyBwdXQgaW4gYWJzb2x1dGUgcGF0aHMgaWYgeW91IGRvbid0IGhhdmUgdGhlbSBpbiB5b3VyIHBhdGg7IG9yIHVzZSBlbnYuIHZhcnMuCisKK212cHJvZz0iJHtNVlBST0ctbXZ9IgorY3Bwcm9nPSIke0NQUFJPRy1jcH0iCitjaG1vZHByb2c9IiR7Q0hNT0RQUk9HLWNobW9kfSIKK2Nob3ducHJvZz0iJHtDSE9XTlBST0ctY2hvd259IgorY2hncnBwcm9nPSIke0NIR1JQUFJPRy1jaGdycH0iCitzdHJpcHByb2c9IiR7U1RSSVBQUk9HLXN0cmlwfSIKK3JtcHJvZz0iJHtSTVBST0ctcm19IgorbWtkaXJwcm9nPSIke01LRElSUFJPRy1ta2Rpcn0iCisKK3RyYW5zZm9ybWJhc2VuYW1lPSIiCit0cmFuc2Zvcm1fYXJnPSIiCitpbnN0Y21kPSIkbXZwcm9nIgorY2htb2RjbWQ9IiRjaG1vZHByb2cgMDc1NSIKK2Nob3duY21kPSIiCitjaGdycGNtZD0iIgorc3RyaXBjbWQ9IiIKK3JtY21kPSIkcm1wcm9nIC1mIgorbXZjbWQ9IiRtdnByb2ciCitzcmM9IiIKK2RzdD0iIgorZGlyX2FyZz0iIgorCit3aGlsZSBbIHgiJDEiICE9IHggXTsgZG8KKyAgICBjYXNlICQxIGluCisJLWMpIGluc3RjbWQ9JGNwcHJvZworCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZCkgZGlyX2FyZz10cnVlCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1tKSBjaG1vZGNtZD0iJGNobW9kcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW8pIGNob3duY21kPSIkY2hvd25wcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktZykgY2hncnBjbWQ9IiRjaGdycHByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1zKSBzdHJpcGNtZD0kc3RyaXBwcm9nCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS10PSopIHRyYW5zZm9ybWFyZz1gZWNobyAkMSB8IHNlZCAncy8tdD0vLydgCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1iPSopIHRyYW5zZm9ybWJhc2VuYW1lPWBlY2hvICQxIHwgc2VkICdzLy1iPS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJKikgIGlmIFsgeCIkc3JjIiA9IHggXQorCSAgICB0aGVuCisJCXNyYz0kMQorCSAgICBlbHNlCisJCSMgdGhpcyBjb2xvbiBpcyB0byB3b3JrIGFyb3VuZCBhIDM4NkJTRCAvYmluL3NoIGJ1ZworCQk6CisJCWRzdD0kMQorCSAgICBmaQorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisgICAgZXNhYworZG9uZQorCitpZiBbIHgiJHNyYyIgPSB4IF0KK3RoZW4KKwllY2hvICIkMDogbm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiID4mMgorCWV4aXQgMQorZWxzZQorCToKK2ZpCisKK2lmIFsgeCIkZGlyX2FyZyIgIT0geCBdOyB0aGVuCisJZHN0PSRzcmMKKwlzcmM9IiIKKworCWlmIFsgLWQgIiRkc3QiIF07IHRoZW4KKwkJaW5zdGNtZD06CisJCWNobW9kY21kPSIiCisJZWxzZQorCQlpbnN0Y21kPSRta2RpcnByb2cKKwlmaQorZWxzZQorCisjIFdhaXRpbmcgZm9yIHRoaXMgdG8gYmUgZGV0ZWN0ZWQgYnkgdGhlICIkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQKKyMgbWlnaHQgY2F1c2UgZGlyZWN0b3JpZXMgdG8gYmUgY3JlYXRlZCwgd2hpY2ggd291bGQgYmUgZXNwZWNpYWxseSBiYWQKKyMgaWYgJHNyYyAoYW5kIHRodXMgJGRzdHRtcCkgY29udGFpbnMgJyonLgorCisJaWYgWyAtZiAiJHNyYyIgXSB8fCBbIC1kICIkc3JjIiBdCisJdGhlbgorCQk6CisJZWxzZQorCQllY2hvICIkMDogJHNyYyBkb2VzIG5vdCBleGlzdCIgPiYyCisJCWV4aXQgMQorCWZpCisKKwlpZiBbIHgiJGRzdCIgPSB4IF0KKwl0aGVuCisJCWVjaG8gIiQwOiBubyBkZXN0aW5hdGlvbiBzcGVjaWZpZWQiID4mMgorCQlleGl0IDEKKwllbHNlCisJCToKKwlmaQorCisjIElmIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5LCBhcHBlbmQgdGhlIGlucHV0IGZpbGVuYW1lOyBpZiB5b3VyIHN5c3RlbQorIyBkb2VzIG5vdCBsaWtlIGRvdWJsZSBzbGFzaGVzIGluIGZpbGVuYW1lcywgeW91IG1heSBuZWVkIHRvIGFkZCBzb21lIGxvZ2ljCisKKwlpZiBbIC1kICIkZHN0IiBdCisJdGhlbgorCQlkc3Q9JGRzdC9gYmFzZW5hbWUgIiRzcmMiYAorCWVsc2UKKwkJOgorCWZpCitmaQorCisjIyB0aGlzIHNlZCBjb21tYW5kIGVtdWxhdGVzIHRoZSBkaXJuYW1lIGNvbW1hbmQKK2RzdGRpcj1gZWNobyAiJGRzdCIgfCBzZWQgLWUgJ3MsW14vXSokLCw7cywvJCwsO3MsXiQsLiwnYAorCisjIE1ha2Ugc3VyZSB0aGF0IHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgZXhpc3RzLgorIyAgdGhpcyBwYXJ0IGlzIHRha2VuIGZyb20gTm9haCBGcmllZG1hbidzIG1raW5zdGFsbGRpcnMgc2NyaXB0CisKKyMgU2tpcCBsb3RzIG9mIHN0YXQgY2FsbHMgaW4gdGhlIHVzdWFsIGNhc2UuCitpZiBbICEgLWQgIiRkc3RkaXIiIF07IHRoZW4KK2RlZmF1bHRJRlM9JworCScKK0lGUz0iJHtJRlMtJGRlZmF1bHRJRlN9IgorCitvSUZTPSRJRlMKKyMgU29tZSBzaCdzIGNhbid0IGhhbmRsZSBJRlM9LyBmb3Igc29tZSByZWFzb24uCitJRlM9JyUnCitzZXQgLSBgZWNobyAiJGRzdGRpciIgfCBzZWQgLWUgJ3NAL0AlQGcnIC1lICdzQF4lQC9AJ2AKK0lGUz0kb0lGUworCitwYXRoY29tcD0nJworCit3aGlsZSBbICQjIC1uZSAwIF0gOyBkbworCXBhdGhjb21wPSRwYXRoY29tcCQxCisJc2hpZnQKKworCWlmIFsgISAtZCAiJHBhdGhjb21wIiBdIDsKKyAgICAgICAgdGhlbgorCQkkbWtkaXJwcm9nICIkcGF0aGNvbXAiCisJZWxzZQorCQk6CisJZmkKKworCXBhdGhjb21wPSRwYXRoY29tcC8KK2RvbmUKK2ZpCisKK2lmIFsgeCIkZGlyX2FyZyIgIT0geCBdCit0aGVuCisJJGRvaXQgJGluc3RjbWQgIiRkc3QiICYmCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICIkZHN0IjsgZWxzZSA6IDsgZmkgJiYKKwlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICIkZHN0IjsgZWxzZSA6IDsgZmkgJiYKKwlpZiBbIHgiJHN0cmlwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJHN0cmlwY21kICIkZHN0IjsgZWxzZSA6IDsgZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICIkZHN0IjsgZWxzZSA6IDsgZmkKK2Vsc2UKKworIyBJZiB3ZSdyZSBnb2luZyB0byByZW5hbWUgdGhlIGZpbmFsIGV4ZWN1dGFibGUsIGRldGVybWluZSB0aGUgbmFtZSBub3cuCisKKwlpZiBbIHgiJHRyYW5zZm9ybWFyZyIgPSB4IF0KKwl0aGVuCisJCWRzdGZpbGU9YGJhc2VuYW1lICIkZHN0ImAKKwllbHNlCisJCWRzdGZpbGU9YGJhc2VuYW1lICIkZHN0IiAkdHJhbnNmb3JtYmFzZW5hbWUgfAorCQkJc2VkICR0cmFuc2Zvcm1hcmdgJHRyYW5zZm9ybWJhc2VuYW1lCisJZmkKKworIyBkb24ndCBhbGxvdyB0aGUgc2VkIGNvbW1hbmQgdG8gY29tcGxldGVseSBlbGltaW5hdGUgdGhlIGZpbGVuYW1lCisKKwlpZiBbIHgiJGRzdGZpbGUiID0geCBdCisJdGhlbgorCQlkc3RmaWxlPWBiYXNlbmFtZSAiJGRzdCJgCisJZWxzZQorCQk6CisJZmkKKworIyBNYWtlIGEgY291cGxlIG9mIHRlbXAgZmlsZSBuYW1lcyBpbiB0aGUgcHJvcGVyIGRpcmVjdG9yeS4KKworCWRzdHRtcD0kZHN0ZGlyLyNpbnN0LiQkIworCXJtdG1wPSRkc3RkaXIvI3JtLiQkIworCisjIFRyYXAgdG8gY2xlYW4gdXAgdGVtcCBmaWxlcyBhdCBleGl0LgorCisJdHJhcCAnc3RhdHVzPSQ/OyBybSAtZiAiJGRzdHRtcCIgIiRybXRtcCIgJiYgZXhpdCAkc3RhdHVzJyAwCisJdHJhcCAnKGV4aXQgJD8pOyBleGl0JyAxIDIgMTMgMTUKKworIyBNb3ZlIG9yIGNvcHkgdGhlIGZpbGUgbmFtZSB0byB0aGUgdGVtcCBuYW1lCisKKwkkZG9pdCAkaW5zdGNtZCAiJHNyYyIgIiRkc3R0bXAiICYmCisKKyMgYW5kIHNldCBhbnkgb3B0aW9uczsgZG8gY2htb2QgbGFzdCB0byBwcmVzZXJ2ZSBzZXR1aWQgYml0cworCisjIElmIGFueSBvZiB0aGVzZSBmYWlsLCB3ZSBhYm9ydCB0aGUgd2hvbGUgdGhpbmcuICBJZiB3ZSB3YW50IHRvCisjIGlnbm9yZSBlcnJvcnMgZnJvbSBhbnkgb2YgdGhlc2UsIGp1c3QgbWFrZSBzdXJlIG5vdCB0byBpZ25vcmUKKyMgZXJyb3JzIGZyb20gdGhlIGFib3ZlICIkZG9pdCAkaW5zdGNtZCAkc3JjICRkc3R0bXAiIGNvbW1hbmQuCisKKwlpZiBbIHgiJGNob3duY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNob3duY21kICIkZHN0dG1wIjsgZWxzZSA6O2ZpICYmCisJaWYgWyB4IiRjaGdycGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRjaGdycGNtZCAiJGRzdHRtcCI7IGVsc2UgOjtmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgIiRkc3R0bXAiOyBlbHNlIDo7ZmkgJiYKKwlpZiBbIHgiJGNobW9kY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNobW9kY21kICIkZHN0dG1wIjsgZWxzZSA6O2ZpICYmCisKKyMgTm93IHJlbW92ZSBvciBtb3ZlIGFzaWRlIGFueSBvbGQgZmlsZSBhdCBkZXN0aW5hdGlvbiBsb2NhdGlvbi4gIFdlIHRyeSB0aGlzCisjIHR3byB3YXlzIHNpbmNlIHJtIGNhbid0IHVubGluayBpdHNlbGYgb24gc29tZSBzeXN0ZW1zIGFuZCB0aGUgZGVzdGluYXRpb24KKyMgZmlsZSBtaWdodCBiZSBidXN5IGZvciBvdGhlciByZWFzb25zLiAgSW4gdGhpcyBjYXNlLCB0aGUgZmluYWwgY2xlYW51cAorIyBtaWdodCBmYWlsIGJ1dCB0aGUgbmV3IGZpbGUgc2hvdWxkIHN0aWxsIGluc3RhbGwgc3VjY2Vzc2Z1bGx5LgorCit7CisJaWYgWyAtZiAiJGRzdGRpci8kZHN0ZmlsZSIgXQorCXRoZW4KKwkJJGRvaXQgJHJtY21kIC1mICIkZHN0ZGlyLyRkc3RmaWxlIiAyPi9kZXYvbnVsbCB8fAorCQkkZG9pdCAkbXZjbWQgLWYgIiRkc3RkaXIvJGRzdGZpbGUiICIkcm10bXAiIDI+L2Rldi9udWxsIHx8CisJCXsKKwkJICBlY2hvICIkMDogY2Fubm90IHVubGluayBvciByZW5hbWUgJGRzdGRpci8kZHN0ZmlsZSIgPiYyCisJCSAgKGV4aXQgMSk7IGV4aXQKKwkJfQorCWVsc2UKKwkJOgorCWZpCit9ICYmCisKKyMgTm93IHJlbmFtZSB0aGUgZmlsZSB0byB0aGUgcmVhbCBkZXN0aW5hdGlvbi4KKworCSRkb2l0ICRtdmNtZCAiJGRzdHRtcCIgIiRkc3RkaXIvJGRzdGZpbGUiCisKK2ZpICYmCisKKyMgVGhlIGZpbmFsIGxpdHRsZSB0cmljayB0byAiY29ycmVjdGx5IiBwYXNzIHRoZSBleGl0IHN0YXR1cyB0byB0aGUgZXhpdCB0cmFwLgorCit7CisJKGV4aXQgMCk7IGV4aXQKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29uZmlnL2xpYnB5dGhvbjIuNy5hIGIvbGliL3B5dGhvbjIuNy9jb25maWcvbGlicHl0aG9uMi43LmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4MjhmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29uZmlnL2xpYnB5dGhvbjIuNy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29uZmlnL21ha2VzZXR1cCBiL2xpYi9weXRob24yLjcvY29uZmlnL21ha2VzZXR1cApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ODYyYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb25maWcvbWFrZXNldHVwCkBAIC0wLDAgKzEsMjk3IEBACisjISAvYmluL3NoCisKKyMgQ29udmVydCB0ZW1wbGF0ZXMgaW50byBNYWtlZmlsZSBhbmQgY29uZmlnLmMsIGJhc2VkIG9uIHRoZSBtb2R1bGUKKyMgZGVmaW5pdGlvbnMgZm91bmQgaW4gdGhlIGZpbGUgU2V0dXAuCisjCisjIFVzYWdlOiBtYWtlc2V0dXAgWy1zIGRpcl0gWy1jIGZpbGVdIFstbSBmaWxlXSBbU2V0dXBdIC4uLiBbLW4gW1NldHVwXSAuLi5dCisjCisjIE9wdGlvbnM6CisjIC1zIGRpcmVjdG9yeTogYWx0ZXJuYXRpdmUgc291cmNlIGRpcmVjdG9yeSAoZGVmYXVsdCAuKQorIyAtbCBkaXJlY3Rvcnk6IGxpYnJhcnkgc291cmNlIGRpcmVjdG9yeSAoZGVmYXVsdCBkZXJpdmVkIGZyb20gJDApCisjIC1jIGZpbGU6ICAgICAgYWx0ZXJuYXRpdmUgY29uZmlnLmMgdGVtcGxhdGUgKGRlZmF1bHQgJGxpYmRpci9jb25maWcuYy5pbikKKyMgLWMgLTogICAgICAgICBkb24ndCB3cml0ZSBjb25maWcuYworIyAtbSBmaWxlOiAgICAgIGFsdGVybmF0aXZlIE1ha2VmaWxlIHRlbXBsYXRlIChkZWZhdWx0IC4vTWFrZWZpbGUucHJlKQorIyAtbSAtOiAgICAgICAgIGRvbid0IHdyaXRlIE1ha2VmaWxlCisjCisjIFJlbWFpbmluZyBhcmd1bWVudHMgYXJlIG9uZSBvciBtb3JlIFNldHVwIGZpbGVzIChkZWZhdWx0IC4vU2V0dXApLgorIyBTZXR1cCBmaWxlcyBhZnRlciBhIC1uIG9wdGlvbiBhcmUgdXNlZCBmb3IgdGhlaXIgdmFyaWFibGVzLCBtb2R1bGVzCisjIGFuZCBsaWJyYXJpZXMgYnV0IG5vdCBmb3IgdGhlaXIgLm8gZmlsZXMuCisjCisjIFNlZSBTZXR1cC5kaXN0IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQgb2YgdGhlIFNldHVwIGZpbGUuCisjCisjIFRoZSBmb2xsb3dpbmcgZWRpdHMgYXJlIG1hZGU6CisjCisjIENvcHlpbmcgY29uZmlnLmMuaW4gdG8gY29uZmlnLmM6CisjIC0gaW5zZXJ0IGFuIGlkZW50aWZ5aW5nIGNvbW1lbnQgYXQgdGhlIHN0YXJ0CisjIC0gZm9yIGVhY2ggPG1vZHVsZT4gbWVudGlvbmVkIGluIFNldHVwIGJlZm9yZSAqbm9jb25maWcqOgorIyAgICsgaW5zZXJ0ICdleHRlcm4gdm9pZCBpbml0PG1vZHVsZT4odm9pZCk7JyBiZWZvcmUgTUFSS0VSIDEKKyMgICArIGluc2VydCAneyI8bW9kdWxlPiIsIGluaXRtb2R1bGV9LCcgYmVmb3JlIE1BUktFUiAyCisjCisjIENvcHlpbmcgTWFrZWZpbGUucHJlIHRvIE1ha2VmaWxlOgorIyAtIGluc2VydCBhbiBpZGVudGlmeWluZyBjb21tZW50IGF0IHRoZSBzdGFydAorIyAtIHJlcGxhY2UgX01PRE9CSlNfIGJ5IHRoZSBsaXN0IG9mIG9iamVjdHMgZnJvbSBTZXR1cCAoZXhjZXB0IGZvcgorIyAgIFNldHVwIGZpbGVzIGFmdGVyIGEgLW4gb3B0aW9uKQorIyAtIHJlcGxhY2UgX01PRExJQlNfIGJ5IHRoZSBsaXN0IG9mIGxpYnJhcmllcyBmcm9tIFNldHVwCisjIC0gZm9yIGVhY2ggb2JqZWN0IGZpbGUgbWVudGlvbmVkIGluIFNldHVwLCBhcHBlbmQgYSBydWxlCisjICAgJzxmaWxlPi5vOiA8ZmlsZT4uYzsgPGJ1aWxkIGNvbW1hbmRzPicgdG8gdGhlIGVuZCBvZiB0aGUgTWFrZWZpbGUKKyMgLSBmb3IgZWFjaCBtb2R1bGUgbWVudGlvbmVkIGluIFNldHVwLCBhcHBlbmQgYSBydWxlCisjICAgd2hpY2ggY3JlYXRlcyBhIHNoYXJlZCBsaWJyYXJ5IHZlcnNpb24gdG8gdGhlIGVuZCBvZiB0aGUgTWFrZWZpbGUKKyMgLSBmb3IgZWFjaCB2YXJpYWJsZSBkZWZpbml0aW9uIGZvdW5kIGluIFNldHVwLCBpbnNlcnQgdGhlIGRlZmluaXRpb24KKyMgICBiZWZvcmUgdGhlIGNvbW1lbnQgJ0RlZmluaXRpb25zIGFkZGVkIGJ5IG1ha2VzZXR1cCcKKworIyBMb29wIG92ZXIgY29tbWFuZCBsaW5lIG9wdGlvbnMKK3VzYWdlPScKK3VzYWdlOiBtYWtlc2V0dXAgWy1zIHNyY2Rpcl0gWy1sIGxpYmRpcl0gWy1jIGNvbmZpZy5jLmluXSBbLW0gTWFrZWZpbGUucHJlXQorICAgICAgICAgICAgICAgICBbU2V0dXBdIC4uLiBbLW4gW1NldHVwXSAuLi5dJworc3JjZGlyPScuJworbGliZGlyPScnCitjb25maWc9JycKK21ha2VwcmU9JycKK25vb2JqZWN0cz0nJworZG9jb25maWc9eWVzCit3aGlsZSA6CitkbworCWNhc2UgJDEgaW4KKwktcykJc2hpZnQ7IHNyY2Rpcj0kMTsgc2hpZnQ7OworCS1sKQlzaGlmdDsgbGliZGlyPSQxOyBzaGlmdDs7CisJLWMpCXNoaWZ0OyBjb25maWc9JDE7IHNoaWZ0OzsKKwktbSkJc2hpZnQ7IG1ha2VwcmU9JDE7IHNoaWZ0OzsKKwktLSkJc2hpZnQ7IGJyZWFrOzsKKwktbikJbm9vYmplY3RzPXllczs7CisJLSopCWVjaG8gIiR1c2FnZSIgMT4mMjsgZXhpdCAyOzsKKwkqKQlicmVhazs7CisJZXNhYworZG9uZQorCisjIFNldCBkZWZhdWx0IGxpYmRpciBhbmQgY29uZmlnIGlmIG5vdCBzZXQgYnkgY29tbWFuZCBsaW5lCisjIChOb3QgYWxsIHN5c3RlbXMgaGF2ZSBkaXJuYW1lKQorY2FzZSAkbGliZGlyIGluCisnJykJY2FzZSAkMCBpbgorCSovKikJbGliZGlyPWBlY2hvICQwIHwgc2VkICdzLC9bXi9dKiQsLCdgOzsKKwkqKQlsaWJkaXI9Ljs7CisJZXNhYzs7Citlc2FjCitjYXNlICRjb25maWcgaW4KKycnKQljb25maWc9JGxpYmRpci9jb25maWcuYy5pbjs7Citlc2FjCitjYXNlICRtYWtlcHJlIGluCisnJykJbWFrZXByZT1NYWtlZmlsZS5wcmU7OworZXNhYworCisjIE5ld2xpbmUgZm9yIHNlZCBpIGFuZCBhIGNvbW1hbmRzCitOTD0nXAorJworCisjIFNldHVwIHRvIGxpbmsgd2l0aCBleHRyYSBsaWJyYXJpZXMgd2hlbiBtYWtlaW5nIHNoYXJlZCBleHRlbnNpb25zLgorIyBDdXJyZW50bHksIG9ubHkgQ3lnd2luIG5lZWRzIHRoaXMgYmFnZ2FnZS4KK2Nhc2UgYHVuYW1lIC1zYCBpbgorQ1lHV0lOKikgaWYgdGVzdCAkbGliZGlyID0gLgorCSB0aGVuCisJIAlFeHRyYUxpYkRpcj0uCisJIGVsc2UKKwkgCUV4dHJhTGliRGlyPSckKExJQlBMKScKKwkgZmkKKwkgRXh0cmFMaWJzPSItTCRFeHRyYUxpYkRpciAtbHB5dGhvblwkKFZFUlNJT04pIjs7Citlc2FjCisKKyMgTWFpbiBsb29wCitmb3IgaSBpbiAkeyotU2V0dXB9CitkbworCWNhc2UgJGkgaW4KKwktbikJZWNobyAnKm5vb2JqZWN0cyonOzsKKwkqKQllY2hvICcqZG9jb25maWcqJzsgY2F0ICIkaSI7OworCWVzYWMKK2RvbmUgfAorc2VkIC1lICdzL1sgCV0qIy4qLy8nIC1lICcvXlsgCV0qJC9kJyB8CisoCisJcnVsZXNmPSJAcnVsZXMuJCQiCisJdHJhcCAncm0gLWYgJHJ1bGVzZicgMCAxIDIgMworCWVjaG8gIgorIyBSdWxlcyBhcHBlbmRlZCBieSBtYWtlZGVwZW5kCisiID4kcnVsZXNmCisJREVGUz0KKwlNT0RTPQorCVNIQVJFRE1PRFM9CisJT0JKUz0KKwlMSUJTPQorCUxPQ0FMTElCUz0KKwlCQVNFTElCUz0KKwl3aGlsZSByZWFkIGxpbmUKKwlkbworCQkjIHRvIGhhbmRsZSBiYWNrc2xhc2hlcyBmb3Igc2gncyB0aGF0IGRvbid0IGF1dG9tYXRpY2FsbHkKKwkJIyBjb250aW51ZSBhIHJlYWQgd2hlbiB0aGUgbGFzdCBjaGFyIGlzIGEgYmFja3NsYXNoCisJCXdoaWxlIGVjaG8gJGxpbmUgfCBncmVwICdcXCQnID4gL2Rldi9udWxsCisJCWRvCisJCQlyZWFkIGV4dHJhbGluZQorCQkJbGluZT1gZWNobyAkbGluZXwgc2VkIHMvLiQvL2AkZXh0cmFsaW5lCisJCWRvbmUKKworCQkjIE91dHB1dCBERUZTIGluIHJldmVyc2Ugb3JkZXIgc28gZmlyc3QgZGVmaW5pdGlvbiBvdmVycmlkZXMKKwkJY2FzZSAkbGluZSBpbgorCQkqPSopCURFRlM9IiRsaW5lJE5MJERFRlMiOyBjb250aW51ZTs7CisJCSdpbmNsdWRlICcqKQlERUZTPSIkbGluZSROTCRERUZTIjsgY29udGludWU7OworCQknKm5vb2JqZWN0cyonKQorCQkJY2FzZSAkbm9vYmplY3RzIGluCisJCQl5ZXMpCTs7CisJCQkqKQlMT0NBTExJQlM9JExJQlM7IExJQlM9OzsKKwkJCWVzYWMKKwkJCW5vb2JqZWN0cz15ZXM7CisJCQljb250aW51ZTs7CisJCScqZG9jb25maWcqJykJZG9jb25maWc9eWVzOyBjb250aW51ZTs7CisJCScqc3RhdGljKicpCWRvY29uZmlnPXllczsgY29udGludWU7OworCQknKm5vY29uZmlnKicpCWRvY29uZmlnPW5vOyBjb250aW51ZTs7CisJCScqc2hhcmVkKicpCWRvY29uZmlnPW5vOyBjb250aW51ZTs7CisJCWVzYWMKKwkJc3Jjcz0KKwkJY3Bwcz0KKwkJbGlicz0KKwkJbW9kcz0KKwkJc2tpcD0KKwkJZm9yIGFyZyBpbiAkbGluZQorCQlkbworCQkJY2FzZSAkc2tpcCBpbgorCQkJbGlicykJbGlicz0iJGxpYnMgJGFyZyI7IHNraXA9OyBjb250aW51ZTs7CisJCQljcHBzKQljcHBzPSIkY3BwcyAkYXJnIjsgc2tpcD07IGNvbnRpbnVlOzsKKwkJCXNyY3MpCXNyY3M9IiRzcmNzICRhcmciOyBza2lwPTsgY29udGludWU7OworCQkJZXNhYworCQkJY2FzZSAkYXJnIGluCisJCQktZnJhbWV3b3JrKQlsaWJzPSIkbGlicyAkYXJnIjsgc2tpcD1saWJzOworCQkJCSAgICAgICAgIyBPU1gvT1NYUy9EYXJ3aW4gZnJhbWV3b3JrIGxpbmsgY21kCisJCQkJCTs7CisJCQktW0lEVUNmRl0qKQljcHBzPSIkY3BwcyAkYXJnIjs7CisJCQktWGNvbXBpbGVyKQlza2lwPWNwcHM7OworCQkJLVhsaW5rZXIpCWxpYnM9IiRsaWJzICRhcmciOyBza2lwPWxpYnM7OworCQkJLXJwYXRoKQkJbGlicz0iJGxpYnMgJGFyZyI7IHNraXA9bGliczs7CisJCQktLXJwYXRoKQlsaWJzPSIkbGlicyAkYXJnIjsgc2tpcD1saWJzOzsKKwkJCS1bQS1abF0qKQlsaWJzPSIkbGlicyAkYXJnIjs7CisJCQkqLmEpCQlsaWJzPSIkbGlicyAkYXJnIjs7CisJCQkqLnNvKQkJbGlicz0iJGxpYnMgJGFyZyI7OworCQkJKi5zbCkJCWxpYnM9IiRsaWJzICRhcmciOzsKKwkJCS8qLm8pCQlsaWJzPSIkbGlicyAkYXJnIjs7CisJCQkqLmRlZikJCWxpYnM9IiRsaWJzICRhcmciOzsKKwkJCSoubykJCXNyY3M9IiRzcmNzIGBiYXNlbmFtZSAkYXJnIC5vYC5jIjs7CisJCQkqLltjQ10pCQlzcmNzPSIkc3JjcyAkYXJnIjs7CisJCQkqLm0pCQlzcmNzPSIkc3JjcyAkYXJnIjs7ICMgT2JqZWN0aXZlLUMgc3JjCisJCQkqLmNjKQkJc3Jjcz0iJHNyY3MgJGFyZyI7OworCQkJKi5jKyspCQlzcmNzPSIkc3JjcyAkYXJnIjs7CisJCQkqLmN4eCkJCXNyY3M9IiRzcmNzICRhcmciOzsKKwkJCSouY3BwKQkJc3Jjcz0iJHNyY3MgJGFyZyI7OworCQkJXCQqKQkJbGlicz0iJGxpYnMgJGFyZyIKKwkJCQkJY3Bwcz0iJGNwcHMgJGFyZyI7OworCQkJKi4qKQkJZWNobyAxPiYyICJiYWQgd29yZCAkYXJnIGluICRsaW5lIgorCQkJCQlleGl0IDE7OworCQkJLXUpCQlza2lwPWxpYnM7IGxpYnM9IiRsaWJzIC11Ijs7CisJCQlbYS16QS1aX10qKQltb2RzPSIkbW9kcyAkYXJnIjs7CisJCQkqKQkJZWNobyAxPiYyICJiYWQgd29yZCAkYXJnIGluICRsaW5lIgorCQkJCQlleGl0IDE7OworCQkJZXNhYworCQlkb25lCisJCWNhc2UgJGRvY29uZmlnIGluCisJCXllcykKKwkJCUxJQlM9IiRMSUJTICRsaWJzIgorCQkJTU9EUz0iJE1PRFMgJG1vZHMiCisJCQk7OworCQllc2FjCisJCWNhc2UgJG5vb2JqZWN0cyBpbgorCQl5ZXMpCWNvbnRpbnVlOzsKKwkJZXNhYworCQlvYmpzPScnCisJCWZvciBzcmMgaW4gJHNyY3MKKwkJZG8KKwkJCWNhc2UgJHNyYyBpbgorCQkJKi5jKSAgIG9iaj1gYmFzZW5hbWUgJHNyYyAuY2AubzsgY2M9JyQoQ0MpJzs7CisJCQkqLmNjKSAgb2JqPWBiYXNlbmFtZSAkc3JjIC5jY2AubzsgY2M9JyQoQ1hYKSc7OworCQkJKi5jKyspIG9iaj1gYmFzZW5hbWUgJHNyYyAuYysrYC5vOyBjYz0nJChDWFgpJzs7CisJCQkqLkMpICAgb2JqPWBiYXNlbmFtZSAkc3JjIC5DYC5vOyBjYz0nJChDWFgpJzs7CisJCQkqLmN4eCkgb2JqPWBiYXNlbmFtZSAkc3JjIC5jeHhgLm87IGNjPSckKENYWCknOzsKKwkJCSouY3BwKSBvYmo9YGJhc2VuYW1lICRzcmMgLmNwcGAubzsgY2M9JyQoQ1hYKSc7OworCQkJKi5tKSAgIG9iaj1gYmFzZW5hbWUgJHNyYyAubWAubzsgY2M9JyQoQ0MpJzs7ICMgT2JqLUMKKwkJCSopICAgICBjb250aW51ZTs7CisJCQllc2FjCisJCQlvYmo9IiRzcmNkaXIvJG9iaiIKKwkJCW9ianM9IiRvYmpzICRvYmoiCisJCQljYXNlICRzcmMgaW4KKwkJCWdsbW9kdWxlLmMpIDs7CisJCQkvKikgOzsKKwkJCVwkKikgOzsKKwkJCSopIHNyYz0nJChzcmNkaXIpLyciJHNyY2Rpci8kc3JjIjs7CisJCQllc2FjCisJCQljYXNlICRkb2NvbmZpZyBpbgorCQkJbm8pCWNjPSIkY2MgXCQoQ0NTSEFSRUQpIFwkKENGTEFHUykgXCQoQ1BQRkxBR1MpIjs7CisJCQkqKQorCQkJCWNjPSIkY2MgXCQoUFlfQ0ZMQUdTKSI7OworCQkJZXNhYworCQkJcnVsZT0iJG9iajogJHNyYzsgJGNjICRjcHBzIC1jICRzcmMgLW8gJG9iaiIKKwkJCWVjaG8gIiRydWxlIiA+PiRydWxlc2YKKwkJZG9uZQorCQljYXNlICRkb2NvbmZpZyBpbgorCQl5ZXMpCU9CSlM9IiRPQkpTICRvYmpzIjs7CisJCWVzYWMKKwkJZm9yIG1vZCBpbiAkbW9kcworCQlkbworCQkJY2FzZSAkb2JqcyBpbgorCQkJKiRtb2QubyopCWJhc2U9JG1vZDs7CisJCQkqKQkJYmFzZT0ke21vZH1tb2R1bGU7OworCQkJZXNhYworCQkJZmlsZT0iJHNyY2Rpci8kYmFzZVwkKFNPKSIKKwkJCWNhc2UgJGRvY29uZmlnIGluCisJCQlubykJU0hBUkVETU9EUz0iJFNIQVJFRE1PRFMgJGZpbGUiOzsKKwkJCWVzYWMKKwkJCXJ1bGU9IiRmaWxlOiAkb2JqcyIKKwkJCXJ1bGU9IiRydWxlOyBcJChCTERTSEFSRUQpICRvYmpzICRsaWJzICRFeHRyYUxpYnMgLW8gJGZpbGUiCisJCQllY2hvICIkcnVsZSIgPj4kcnVsZXNmCisJCWRvbmUKKwlkb25lCisKKwljYXNlICRTSEFSRURNT0RTIGluCisJJycpCTs7CisJKikJREVGUz0iU0hBUkVETU9EUz0kU0hBUkVETU9EUyROTCRERUZTIjs7CisJZXNhYworCisJY2FzZSAkbm9vYmplY3RzIGluCisJeWVzKQlCQVNFTElCUz0kTElCUzs7CisJKikJTE9DQUxMSUJTPSRMSUJTOzsKKwllc2FjCisJTElCUz0nJChMT0NBTE1PRExJQlMpICQoQkFTRU1PRExJQlMpJworCURFRlM9IkJBU0VNT0RMSUJTPSRCQVNFTElCUyROTCRERUZTIgorCURFRlM9IkxPQ0FMTU9ETElCUz0kTE9DQUxMSUJTJE5MJERFRlMiCisKKwlFWFRERUNMUz0KKwlJTklUQklUUz0KKwlmb3IgbW9kIGluICRNT0RTCisJZG8KKwkJRVhUREVDTFM9IiR7RVhUREVDTFN9ZXh0ZXJuIHZvaWQgaW5pdCRtb2Qodm9pZCk7JE5MIgorCQlJTklUQklUUz0iJHtJTklUQklUU30Je1wiJG1vZFwiLCBpbml0JG1vZH0sJE5MIgorCWRvbmUKKworCisJY2FzZSAkY29uZmlnIGluCisJLSkgIDs7CisJKikgIHNlZCAtZSAiCisJCTFpJE5MLyogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSAkY29uZmlnIGJ5IG1ha2VzZXR1cC4gKi8KKwkJL01BUktFUiAxL2kkTkwkRVhUREVDTFMKKyAKKwkJL01BUktFUiAyL2kkTkwkSU5JVEJJVFMKKworCQkiICRjb25maWcgPmNvbmZpZy5jCisJICAgIDs7CisJZXNhYworCisJY2FzZSAkbWFrZXByZSBpbgorCS0pCTs7CisJKikJc2VkZj0iQHNlZC5pbi4kJCIKKwkJdHJhcCAncm0gLWYgJHNlZGYnIDAgMSAyIDMKKwkJZWNobyAiMWlcXCIgPiRzZWRmCisJCXN0cj0iIyBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tICRtYWtlcHJlIGJ5IG1ha2VzZXR1cC4iCisJCWVjaG8gIiRzdHIiID4+JHNlZGYKKwkJZWNobyAicyVfTU9ET0JKU18lJE9CSlMlIiA+PiRzZWRmCisJCWVjaG8gInMlX01PRExJQlNfJSRMSUJTJSIgPj4kc2VkZgorCQllY2hvICIvRGVmaW5pdGlvbnMgYWRkZWQgYnkgbWFrZXNldHVwL2EkTkwkTkwkREVGUyIgPj4kc2VkZgorCQlzZWQgLWYgJHNlZGYgJG1ha2VwcmUgPk1ha2VmaWxlCisJCWNhdCAkcnVsZXNmID4+TWFrZWZpbGUKKwkJcm0gLWYgJHNlZGYKKwkgICAgOzsKKwllc2FjCisKKwlybSAtZiAkcnVsZXNmCispCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbmZpZy9weXRob24ubyBiL2xpYi9weXRob24yLjcvY29uZmlnL3B5dGhvbi5vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTllMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbmZpZy9weXRob24ubwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbnRleHRsaWIucHkgYi9saWIvcHl0aG9uMi43L2NvbnRleHRsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA1MjA1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29udGV4dGxpYi5weQpAQCAtMCwwICsxLDE1NCBAQAorIiIiVXRpbGl0aWVzIGZvciB3aXRoLXN0YXRlbWVudCBjb250ZXh0cy4gIFNlZSBQRVAgMzQzLiIiIgorCitpbXBvcnQgc3lzCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4KKworX19hbGxfXyA9IFsiY29udGV4dG1hbmFnZXIiLCAibmVzdGVkIiwgImNsb3NpbmciXQorCitjbGFzcyBHZW5lcmF0b3JDb250ZXh0TWFuYWdlcihvYmplY3QpOgorICAgICIiIkhlbHBlciBmb3IgQGNvbnRleHRtYW5hZ2VyIGRlY29yYXRvci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZW4pOgorICAgICAgICBzZWxmLmdlbiA9IGdlbgorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2VuLm5leHQoKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiZ2VuZXJhdG9yIGRpZG4ndCB5aWVsZCIpCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgIGlmIHR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmdlbi5uZXh0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImdlbmVyYXRvciBkaWRuJ3Qgc3RvcCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgTmVlZCB0byBmb3JjZSBpbnN0YW50aWF0aW9uIHNvIHdlIGNhbiByZWxpYWJseQorICAgICAgICAgICAgICAgICMgdGVsbCBpZiB3ZSBnZXQgdGhlIHNhbWUgZXhjZXB0aW9uIGJhY2sKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHR5cGUoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZ2VuLnRocm93KHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJnZW5lcmF0b3IgZGlkbid0IHN0b3AgYWZ0ZXIgdGhyb3coKSIpCisgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbiwgZXhjOgorICAgICAgICAgICAgICAgICMgU3VwcHJlc3MgdGhlIGV4Y2VwdGlvbiAqdW5sZXNzKiBpdCdzIHRoZSBzYW1lIGV4Y2VwdGlvbiB0aGF0CisgICAgICAgICAgICAgICAgIyB3YXMgcGFzc2VkIHRvIHRocm93KCkuICBUaGlzIHByZXZlbnRzIGEgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgICMgcmFpc2VkIGluc2lkZSB0aGUgIndpdGgiIHN0YXRlbWVudCBmcm9tIGJlaW5nIHN1cHByZXNzZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gZXhjIGlzIG5vdCB2YWx1ZQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICMgb25seSByZS1yYWlzZSBpZiBpdCdzICpub3QqIHRoZSBleGNlcHRpb24gdGhhdCB3YXMKKyAgICAgICAgICAgICAgICAjIHBhc3NlZCB0byB0aHJvdygpLCBiZWNhdXNlIF9fZXhpdF9fKCkgbXVzdCBub3QgcmFpc2UKKyAgICAgICAgICAgICAgICAjIGFuIGV4Y2VwdGlvbiB1bmxlc3MgX19leGl0X18oKSBpdHNlbGYgZmFpbGVkLiAgQnV0IHRocm93KCkKKyAgICAgICAgICAgICAgICAjIGhhcyB0byByYWlzZSB0aGUgZXhjZXB0aW9uIHRvIHNpZ25hbCBwcm9wYWdhdGlvbiwgc28gdGhpcworICAgICAgICAgICAgICAgICMgZml4ZXMgdGhlIGltcGVkYW5jZSBtaXNtYXRjaCBiZXR3ZWVuIHRoZSB0aHJvdygpIHByb3RvY29sCisgICAgICAgICAgICAgICAgIyBhbmQgdGhlIF9fZXhpdF9fKCkgcHJvdG9jb2wuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgIGlmIHN5cy5leGNfaW5mbygpWzFdIGlzIG5vdCB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKworCitkZWYgY29udGV4dG1hbmFnZXIoZnVuYyk6CisgICAgIiIiQGNvbnRleHRtYW5hZ2VyIGRlY29yYXRvci4KKworICAgIFR5cGljYWwgdXNhZ2U6CisKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBzb21lX2dlbmVyYXRvcig8YXJndW1lbnRzPik6CisgICAgICAgICAgICA8c2V0dXA+CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQgPHZhbHVlPgorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICA8Y2xlYW51cD4KKworICAgIFRoaXMgbWFrZXMgdGhpczoKKworICAgICAgICB3aXRoIHNvbWVfZ2VuZXJhdG9yKDxhcmd1bWVudHM+KSBhcyA8dmFyaWFibGU+OgorICAgICAgICAgICAgPGJvZHk+CisKKyAgICBlcXVpdmFsZW50IHRvIHRoaXM6CisKKyAgICAgICAgPHNldHVwPgorICAgICAgICB0cnk6CisgICAgICAgICAgICA8dmFyaWFibGU+ID0gPHZhbHVlPgorICAgICAgICAgICAgPGJvZHk+CisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICA8Y2xlYW51cD4KKworICAgICIiIgorICAgIEB3cmFwcyhmdW5jKQorICAgIGRlZiBoZWxwZXIoKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIHJldHVybiBHZW5lcmF0b3JDb250ZXh0TWFuYWdlcihmdW5jKCphcmdzLCAqKmt3ZHMpKQorICAgIHJldHVybiBoZWxwZXIKKworCitAY29udGV4dG1hbmFnZXIKK2RlZiBuZXN0ZWQoKm1hbmFnZXJzKToKKyAgICAiIiJDb21iaW5lIG11bHRpcGxlIGNvbnRleHQgbWFuYWdlcnMgaW50byBhIHNpbmdsZSBuZXN0ZWQgY29udGV4dCBtYW5hZ2VyLgorCisgICBUaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBtdWx0aXBsZSBtYW5hZ2VyIGZvcm0KKyAgIG9mIHRoZSB3aXRoIHN0YXRlbWVudC4KKworICAgVGhlIG9uZSBhZHZhbnRhZ2Ugb2YgdGhpcyBmdW5jdGlvbiBvdmVyIHRoZSBtdWx0aXBsZSBtYW5hZ2VyIGZvcm0gb2YgdGhlCisgICB3aXRoIHN0YXRlbWVudCBpcyB0aGF0IGFyZ3VtZW50IHVucGFja2luZyBhbGxvd3MgaXQgdG8gYmUKKyAgIHVzZWQgd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZiBjb250ZXh0IG1hbmFnZXJzIGFzIGZvbGxvd3M6CisKKyAgICAgIHdpdGggbmVzdGVkKCptYW5hZ2Vycyk6CisgICAgICAgICAgZG9fc29tZXRoaW5nKCkKKworICAgICIiIgorICAgIHdhcm4oIldpdGgtc3RhdGVtZW50cyBub3cgZGlyZWN0bHkgc3VwcG9ydCBtdWx0aXBsZSBjb250ZXh0IG1hbmFnZXJzIiwKKyAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMykKKyAgICBleGl0cyA9IFtdCisgICAgdmFycyA9IFtdCisgICAgZXhjID0gKE5vbmUsIE5vbmUsIE5vbmUpCisgICAgdHJ5OgorICAgICAgICBmb3IgbWdyIGluIG1hbmFnZXJzOgorICAgICAgICAgICAgZXhpdCA9IG1nci5fX2V4aXRfXworICAgICAgICAgICAgZW50ZXIgPSBtZ3IuX19lbnRlcl9fCisgICAgICAgICAgICB2YXJzLmFwcGVuZChlbnRlcigpKQorICAgICAgICAgICAgZXhpdHMuYXBwZW5kKGV4aXQpCisgICAgICAgIHlpZWxkIHZhcnMKKyAgICBleGNlcHQ6CisgICAgICAgIGV4YyA9IHN5cy5leGNfaW5mbygpCisgICAgZmluYWxseToKKyAgICAgICAgd2hpbGUgZXhpdHM6CisgICAgICAgICAgICBleGl0ID0gZXhpdHMucG9wKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBleGl0KCpleGMpOgorICAgICAgICAgICAgICAgICAgICBleGMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBleGMgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICBpZiBleGMgIT0gKE5vbmUsIE5vbmUsIE5vbmUpOgorICAgICAgICAgICAgIyBEb24ndCByZWx5IG9uIHN5cy5leGNfaW5mbygpIHN0aWxsIGNvbnRhaW5pbmcKKyAgICAgICAgICAgICMgdGhlIHJpZ2h0IGluZm9ybWF0aW9uLiBBbm90aGVyIGV4Y2VwdGlvbiBtYXkKKyAgICAgICAgICAgICMgaGF2ZSBiZWVuIHJhaXNlZCBhbmQgY2F1Z2h0IGJ5IGFuIGV4aXQgbWV0aG9kCisgICAgICAgICAgICByYWlzZSBleGNbMF0sIGV4Y1sxXSwgZXhjWzJdCisKKworY2xhc3MgY2xvc2luZyhvYmplY3QpOgorICAgICIiIkNvbnRleHQgdG8gYXV0b21hdGljYWxseSBjbG9zZSBzb21ldGhpbmcgYXQgdGhlIGVuZCBvZiBhIGJsb2NrLgorCisgICAgQ29kZSBsaWtlIHRoaXM6CisKKyAgICAgICAgd2l0aCBjbG9zaW5nKDxtb2R1bGU+Lm9wZW4oPGFyZ3VtZW50cz4pKSBhcyBmOgorICAgICAgICAgICAgPGJsb2NrPgorCisgICAgaXMgZXF1aXZhbGVudCB0byB0aGlzOgorCisgICAgICAgIGYgPSA8bW9kdWxlPi5vcGVuKDxhcmd1bWVudHM+KQorICAgICAgICB0cnk6CisgICAgICAgICAgICA8YmxvY2s+CisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aGluZyk6CisgICAgICAgIHNlbGYudGhpbmcgPSB0aGluZworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRoaW5nCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfaW5mbyk6CisgICAgICAgIHNlbGYudGhpbmcuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb250ZXh0bGliLnB5YyBiL2xpYi9weXRob24yLjcvY29udGV4dGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0N2ExMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29udGV4dGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb250ZXh0bGliLnB5byBiL2xpYi9weXRob24yLjcvY29udGV4dGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0N2ExMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29udGV4dGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb29raWVsaWIucHkgYi9saWIvcHl0aG9uMi43L2Nvb2tpZWxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWM4ZDJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb29raWVsaWIucHkKQEAgLTAsMCArMSwxNzk0IEBACityIiIiSFRUUCBjb29raWUgaGFuZGxpbmcgZm9yIHdlYiBjbGllbnRzLgorCitUaGlzIG1vZHVsZSBoYXMgKG5vdyBmYWlybHkgZGlzdGFudCkgb3JpZ2lucyBpbiBHaXNsZSBBYXMnIFBlcmwgbW9kdWxlCitIVFRQOjpDb29raWVzLCBmcm9tIHRoZSBsaWJ3d3ctcGVybCBsaWJyYXJ5LgorCitEb2NzdHJpbmdzLCBjb21tZW50cyBhbmQgZGVidWcgc3RyaW5ncyBpbiB0aGlzIGNvZGUgcmVmZXIgdG8gdGhlCithdHRyaWJ1dGVzIG9mIHRoZSBIVFRQIGNvb2tpZSBzeXN0ZW0gYXMgY29va2llLWF0dHJpYnV0ZXMsIHRvIGRpc3Rpbmd1aXNoCit0aGVtIGNsZWFybHkgZnJvbSBQeXRob24gYXR0cmlidXRlcy4KKworQ2xhc3MgZGlhZ3JhbSAobm90ZSB0aGF0IEJTRERCQ29va2llSmFyIGFuZCB0aGUgTVNJRSogY2xhc3NlcyBhcmUgbm90CitkaXN0cmlidXRlZCB3aXRoIHRoZSBQeXRob24gc3RhbmRhcmQgbGlicmFyeSwgYnV0IGFyZSBhdmFpbGFibGUgZnJvbQoraHR0cDovL3d3d3NlYXJjaC5zZi5uZXQvKToKKworICAgICAgICAgICAgICAgICAgICAgICAgQ29va2llSmFyX19fXworICAgICAgICAgICAgICAgICAgICAgICAgLyAgICAgXCAgICAgIFwKKyAgICAgICAgICAgIEZpbGVDb29raWVKYXIgICAgICBcICAgICAgXAorICAgICAgICAgICAgIC8gICAgfCAgIFwgICAgICAgICBcICAgICAgXAorIE1vemlsbGFDb29raWVKYXIgfCBMV1BDb29raWVKYXIgXCAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgXAorICAgICAgICAgICAgICAgICAgfCAgIC0tLU1TSUVCYXNlIHwgICAgICAgXAorICAgICAgICAgICAgICAgICAgfCAgLyAgICAgIHwgICAgIHwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIHwgLyAgIE1TSUVEQkNvb2tpZUphciBCU0REQkNvb2tpZUphcgorICAgICAgICAgICAgICAgICAgfC8KKyAgICAgICAgICAgICAgIE1TSUVDb29raWVKYXIKKworIiIiCisKK19fYWxsX18gPSBbJ0Nvb2tpZScsICdDb29raWVKYXInLCAnQ29va2llUG9saWN5JywgJ0RlZmF1bHRDb29raWVQb2xpY3knLAorICAgICAgICAgICAnRmlsZUNvb2tpZUphcicsICdMV1BDb29raWVKYXInLCAnbHdwX2Nvb2tpZV9zdHInLCAnTG9hZEVycm9yJywKKyAgICAgICAgICAgJ01vemlsbGFDb29raWVKYXInXQorCitpbXBvcnQgcmUsIHVybHBhcnNlLCBjb3B5LCB0aW1lLCB1cmxsaWIKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nIGFzIF90aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIF90aHJlYWRpbmcKK2ltcG9ydCBodHRwbGliICAjIG9ubHkgZm9yIHRoZSBkZWZhdWx0IEhUVFAgcG9ydAorZnJvbSBjYWxlbmRhciBpbXBvcnQgdGltZWdtCisKK2RlYnVnID0gRmFsc2UgICAjIHNldCB0byBUcnVlIHRvIGVuYWJsZSBkZWJ1Z2dpbmcgdmlhIHRoZSBsb2dnaW5nIG1vZHVsZQorbG9nZ2VyID0gTm9uZQorCitkZWYgX2RlYnVnKCphcmdzKToKKyAgICBpZiBub3QgZGVidWc6CisgICAgICAgIHJldHVybgorICAgIGdsb2JhbCBsb2dnZXIKKyAgICBpZiBub3QgbG9nZ2VyOgorICAgICAgICBpbXBvcnQgbG9nZ2luZworICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29va2llbGliIikKKyAgICByZXR1cm4gbG9nZ2VyLmRlYnVnKCphcmdzKQorCisKK0RFRkFVTFRfSFRUUF9QT1JUID0gc3RyKGh0dHBsaWIuSFRUUF9QT1JUKQorTUlTU0lOR19GSUxFTkFNRV9URVhUID0gKCJhIGZpbGVuYW1lIHdhcyBub3Qgc3VwcGxpZWQgKG5vciB3YXMgdGhlIENvb2tpZUphciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbmNlIGluaXRpYWxpc2VkIHdpdGggb25lKSIpCisKK2RlZiBfd2Fybl91bmhhbmRsZWRfZXhjZXB0aW9uKCk6CisgICAgIyBUaGVyZSBhcmUgYSBmZXcgY2F0Y2gtYWxsIGV4Y2VwdDogc3RhdGVtZW50cyBpbiB0aGlzIG1vZHVsZSwgZm9yCisgICAgIyBjYXRjaGluZyBpbnB1dCB0aGF0J3MgYmFkIGluIHVuZXhwZWN0ZWQgd2F5cy4gIFdhcm4gaWYgYW55CisgICAgIyBleGNlcHRpb25zIGFyZSBjYXVnaHQgdGhlcmUuCisgICAgaW1wb3J0IHdhcm5pbmdzLCB0cmFjZWJhY2ssIFN0cmluZ0lPCisgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICB0cmFjZWJhY2sucHJpbnRfZXhjKE5vbmUsIGYpCisgICAgbXNnID0gZi5nZXR2YWx1ZSgpCisgICAgd2FybmluZ3Mud2FybigiY29va2llbGliIGJ1ZyFcbiVzIiAlIG1zZywgc3RhY2tsZXZlbD0yKQorCisKKyMgRGF0ZS90aW1lIGNvbnZlcnNpb24KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRVBPQ0hfWUVBUiA9IDE5NzAKK2RlZiBfdGltZWdtKHR0KToKKyAgICB5ZWFyLCBtb250aCwgbWRheSwgaG91ciwgbWluLCBzZWMgPSB0dFs6Nl0KKyAgICBpZiAoKHllYXIgPj0gRVBPQ0hfWUVBUikgYW5kICgxIDw9IG1vbnRoIDw9IDEyKSBhbmQgKDEgPD0gbWRheSA8PSAzMSkgYW5kCisgICAgICAgICgwIDw9IGhvdXIgPD0gMjQpIGFuZCAoMCA8PSBtaW4gPD0gNTkpIGFuZCAoMCA8PSBzZWMgPD0gNjEpKToKKyAgICAgICAgcmV0dXJuIHRpbWVnbSh0dCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQorCitEQVlTID0gWyJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIsICJTdW4iXQorTU9OVEhTID0gWyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisgICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIl0KK01PTlRIU19MT1dFUiA9IFtdCitmb3IgbW9udGggaW4gTU9OVEhTOiBNT05USFNfTE9XRVIuYXBwZW5kKG1vbnRoLmxvd2VyKCkpCisKK2RlZiB0aW1lMmlzb3oodD1Ob25lKToKKyAgICAiIiJSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRpbWUgaW4gc2Vjb25kcyBzaW5jZSBlcG9jaCwgdC4KKworICAgIElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBhbiBhcmd1bWVudCwgaXQgd2lsbCB1c2UgdGhlIGN1cnJlbnQKKyAgICB0aW1lLgorCisgICAgVGhlIGZvcm1hdCBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIGxpa2UgIllZWVktTU0tREQgaGg6bW06c3NaIiwKKyAgICByZXByZXNlbnRpbmcgVW5pdmVyc2FsIFRpbWUgKFVUQywgYWthIEdNVCkuICBBbiBleGFtcGxlIG9mIHRoaXMgZm9ybWF0IGlzOgorCisgICAgMTk5NC0xMS0yNCAwODo0OTozN1oKKworICAgICIiIgorICAgIGlmIHQgaXMgTm9uZTogdCA9IHRpbWUudGltZSgpCisgICAgeWVhciwgbW9uLCBtZGF5LCBob3VyLCBtaW4sIHNlYyA9IHRpbWUuZ210aW1lKHQpWzo2XQorICAgIHJldHVybiAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmRaIiAlICgKKyAgICAgICAgeWVhciwgbW9uLCBtZGF5LCBob3VyLCBtaW4sIHNlYykKKworZGVmIHRpbWUybmV0c2NhcGUodD1Ob25lKToKKyAgICAiIiJSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRpbWUgaW4gc2Vjb25kcyBzaW5jZSBlcG9jaCwgdC4KKworICAgIElmIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBhbiBhcmd1bWVudCwgaXQgd2lsbCB1c2UgdGhlIGN1cnJlbnQKKyAgICB0aW1lLgorCisgICAgVGhlIGZvcm1hdCBvZiB0aGUgcmV0dXJuZWQgc3RyaW5nIGlzIGxpa2UgdGhpczoKKworICAgIFdlZCwgREQtTW9uLVlZWVkgSEg6TU06U1MgR01UCisKKyAgICAiIiIKKyAgICBpZiB0IGlzIE5vbmU6IHQgPSB0aW1lLnRpbWUoKQorICAgIHllYXIsIG1vbiwgbWRheSwgaG91ciwgbWluLCBzZWMsIHdkYXkgPSB0aW1lLmdtdGltZSh0KVs6N10KKyAgICByZXR1cm4gIiVzICUwMmQtJXMtJTA0ZCAlMDJkOiUwMmQ6JTAyZCBHTVQiICUgKAorICAgICAgICBEQVlTW3dkYXldLCBtZGF5LCBNT05USFNbbW9uLTFdLCB5ZWFyLCBob3VyLCBtaW4sIHNlYykKKworCitVVENfWk9ORVMgPSB7IkdNVCI6IE5vbmUsICJVVEMiOiBOb25lLCAiVVQiOiBOb25lLCAiWiI6IE5vbmV9CisKK1RJTUVaT05FX1JFID0gcmUuY29tcGlsZShyIl4oWy0rXSk/KFxkXGQ/KTo/KFxkXGQpPyQiKQorZGVmIG9mZnNldF9mcm9tX3R6X3N0cmluZyh0eik6CisgICAgb2Zmc2V0ID0gTm9uZQorICAgIGlmIHR6IGluIFVUQ19aT05FUzoKKyAgICAgICAgb2Zmc2V0ID0gMAorICAgIGVsc2U6CisgICAgICAgIG0gPSBUSU1FWk9ORV9SRS5zZWFyY2godHopCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBvZmZzZXQgPSAzNjAwICogaW50KG0uZ3JvdXAoMikpCisgICAgICAgICAgICBpZiBtLmdyb3VwKDMpOgorICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIDYwICogaW50KG0uZ3JvdXAoMykpCisgICAgICAgICAgICBpZiBtLmdyb3VwKDEpID09ICctJzoKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAtb2Zmc2V0CisgICAgcmV0dXJuIG9mZnNldAorCitkZWYgX3N0cjJ0aW1lKGRheSwgbW9uLCB5ciwgaHIsIG1pbiwgc2VjLCB0eik6CisgICAgIyB0cmFuc2xhdGUgbW9udGggbmFtZSB0byBudW1iZXIKKyAgICAjIG1vbnRoIG51bWJlcnMgc3RhcnQgd2l0aCAxIChKYW51YXJ5KQorICAgIHRyeToKKyAgICAgICAgbW9uID0gTU9OVEhTX0xPV0VSLmluZGV4KG1vbi5sb3dlcigpKSsxCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICMgbWF5YmUgaXQncyBhbHJlYWR5IGEgbnVtYmVyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltb24gPSBpbnQobW9uKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIDEgPD0gaW1vbiA8PSAxMjoKKyAgICAgICAgICAgIG1vbiA9IGltb24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIG1ha2Ugc3VyZSBjbG9jayBlbGVtZW50cyBhcmUgZGVmaW5lZAorICAgIGlmIGhyIGlzIE5vbmU6IGhyID0gMAorICAgIGlmIG1pbiBpcyBOb25lOiBtaW4gPSAwCisgICAgaWYgc2VjIGlzIE5vbmU6IHNlYyA9IDAKKworICAgIHlyID0gaW50KHlyKQorICAgIGRheSA9IGludChkYXkpCisgICAgaHIgPSBpbnQoaHIpCisgICAgbWluID0gaW50KG1pbikKKyAgICBzZWMgPSBpbnQoc2VjKQorCisgICAgaWYgeXIgPCAxMDAwOgorICAgICAgICAjIGZpbmQgIm9idmlvdXMiIHllYXIKKyAgICAgICAgY3VyX3lyID0gdGltZS5sb2NhbHRpbWUodGltZS50aW1lKCkpWzBdCisgICAgICAgIG0gPSBjdXJfeXIgJSAxMDAKKyAgICAgICAgdG1wID0geXIKKyAgICAgICAgeXIgPSB5ciArIGN1cl95ciAtIG0KKyAgICAgICAgbSA9IG0gLSB0bXAKKyAgICAgICAgaWYgYWJzKG0pID4gNTA6CisgICAgICAgICAgICBpZiBtID4gMDogeXIgPSB5ciArIDEwMAorICAgICAgICAgICAgZWxzZTogeXIgPSB5ciAtIDEwMAorCisgICAgIyBjb252ZXJ0IFVUQyB0aW1lIHR1cGxlIHRvIHNlY29uZHMgc2luY2UgZXBvY2ggKG5vdCB0aW1lem9uZS1hZGp1c3RlZCkKKyAgICB0ID0gX3RpbWVnbSgoeXIsIG1vbiwgZGF5LCBociwgbWluLCBzZWMsIHR6KSkKKworICAgIGlmIHQgaXMgbm90IE5vbmU6CisgICAgICAgICMgYWRqdXN0IHRpbWUgdXNpbmcgdGltZXpvbmUgc3RyaW5nLCB0byBnZXQgYWJzb2x1dGUgdGltZSBzaW5jZSBlcG9jaAorICAgICAgICBpZiB0eiBpcyBOb25lOgorICAgICAgICAgICAgdHogPSAiVVRDIgorICAgICAgICB0eiA9IHR6LnVwcGVyKCkKKyAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0X2Zyb21fdHpfc3RyaW5nKHR6KQorICAgICAgICBpZiBvZmZzZXQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHQgPSB0IC0gb2Zmc2V0CisKKyAgICByZXR1cm4gdAorCitTVFJJQ1RfREFURV9SRSA9IHJlLmNvbXBpbGUoCisgICAgciJeW1NNVFdGXVthLXpdW2Etel0sIChcZFxkKSAoW0pGTUFTT05EXVthLXpdW2Etel0pICIKKyAgICAiKFxkXGRcZFxkKSAoXGRcZCk6KFxkXGQpOihcZFxkKSBHTVQkIikKK1dFRUtEQVlfUkUgPSByZS5jb21waWxlKAorICAgIHIiXig/OlN1bnxNb258VHVlfFdlZHxUaHV8RnJpfFNhdClbYS16XSosP1xzKiIsIHJlLkkpCitMT09TRV9IVFRQX0RBVEVfUkUgPSByZS5jb21waWxlKAorICAgIHIiIiJeCisgICAgKFxkXGQ/KSAgICAgICAgICAgICMgZGF5CisgICAgICAgKD86XHMrfFstXC9dKQorICAgIChcdyspICAgICAgICAgICAgICAjIG1vbnRoCisgICAgICAgICg/OlxzK3xbLVwvXSkKKyAgICAoXGQrKSAgICAgICAgICAgICAgIyB5ZWFyCisgICAgKD86CisgICAgICAgICAgKD86XHMrfDopICAgICMgc2VwYXJhdG9yIGJlZm9yZSBjbG9jaworICAgICAgIChcZFxkPyk6KFxkXGQpICAjIGhvdXI6bWluCisgICAgICAgKD86OihcZFxkKSk/ICAgICMgb3B0aW9uYWwgc2Vjb25kcworICAgICk/ICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIGNsb2NrCisgICAgICAgXHMqCisgICAgKFstK10/XGR7Miw0fXwoPyFbQVBhcF1bTW1dXGIpW0EtWmEtel0rKT8gIyB0aW1lem9uZQorICAgICAgIFxzKgorICAgICg/OlwoXHcrXCkpPyAgICAgICAjIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRpbWV6b25lIGluIHBhcmVucy4KKyAgICAgICBccyokIiIiLCByZS5YKQorZGVmIGh0dHAydGltZSh0ZXh0KToKKyAgICAiIiJSZXR1cm5zIHRpbWUgaW4gc2Vjb25kcyBzaW5jZSBlcG9jaCBvZiB0aW1lIHJlcHJlc2VudGVkIGJ5IGEgc3RyaW5nLgorCisgICAgUmV0dXJuIHZhbHVlIGlzIGFuIGludGVnZXIuCisKKyAgICBOb25lIGlzIHJldHVybmVkIGlmIHRoZSBmb3JtYXQgb2Ygc3RyIGlzIHVucmVjb2duaXplZCwgdGhlIHRpbWUgaXMgb3V0c2lkZQorICAgIHRoZSByZXByZXNlbnRhYmxlIHJhbmdlLCBvciB0aGUgdGltZXpvbmUgc3RyaW5nIGlzIG5vdCByZWNvZ25pemVkLiAgSWYgdGhlCisgICAgc3RyaW5nIGNvbnRhaW5zIG5vIHRpbWV6b25lLCBVVEMgaXMgYXNzdW1lZC4KKworICAgIFRoZSB0aW1lem9uZSBpbiB0aGUgc3RyaW5nIG1heSBiZSBudW1lcmljYWwgKGxpa2UgIi0wODAwIiBvciAiKzAxMDAiKSBvciBhCisgICAgc3RyaW5nIHRpbWV6b25lIChsaWtlICJVVEMiLCAiR01UIiwgIkJTVCIgb3IgIkVTVCIpLiAgQ3VycmVudGx5LCBvbmx5IHRoZQorICAgIHRpbWV6b25lIHN0cmluZ3MgZXF1aXZhbGVudCB0byBVVEMgKHplcm8gb2Zmc2V0KSBhcmUga25vd24gdG8gdGhlIGZ1bmN0aW9uLgorCisgICAgVGhlIGZ1bmN0aW9uIGxvb3NlbHkgcGFyc2VzIHRoZSBmb2xsb3dpbmcgZm9ybWF0czoKKworICAgIFdlZCwgMDkgRmViIDE5OTQgMjI6MjM6MzIgR01UICAgICAgIC0tIEhUVFAgZm9ybWF0CisgICAgVHVlc2RheSwgMDgtRmViLTk0IDE0OjE1OjI5IEdNVCAgICAgLS0gb2xkIHJmYzg1MCBIVFRQIGZvcm1hdAorICAgIFR1ZXNkYXksIDA4LUZlYi0xOTk0IDE0OjE1OjI5IEdNVCAgIC0tIGJyb2tlbiByZmM4NTAgSFRUUCBmb3JtYXQKKyAgICAwOSBGZWIgMTk5NCAyMjoyMzozMiBHTVQgICAgICAgICAgICAtLSBIVFRQIGZvcm1hdCAobm8gd2Vla2RheSkKKyAgICAwOC1GZWItOTQgMTQ6MTU6MjkgR01UICAgICAgICAgICAgICAtLSByZmM4NTAgZm9ybWF0IChubyB3ZWVrZGF5KQorICAgIDA4LUZlYi0xOTk0IDE0OjE1OjI5IEdNVCAgICAgICAgICAgIC0tIGJyb2tlbiByZmM4NTAgZm9ybWF0IChubyB3ZWVrZGF5KQorCisgICAgVGhlIHBhcnNlciBpZ25vcmVzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICBUaGUgdGltZSBtYXkgYmUKKyAgICBhYnNlbnQuCisKKyAgICBJZiB0aGUgeWVhciBpcyBnaXZlbiB3aXRoIG9ubHkgMiBkaWdpdHMsIHRoZSBmdW5jdGlvbiB3aWxsIHNlbGVjdCB0aGUKKyAgICBjZW50dXJ5IHRoYXQgbWFrZXMgdGhlIHllYXIgY2xvc2VzdCB0byB0aGUgY3VycmVudCBkYXRlLgorCisgICAgIiIiCisgICAgIyBmYXN0IGV4aXQgZm9yIHN0cmljdGx5IGNvbmZvcm1pbmcgc3RyaW5nCisgICAgbSA9IFNUUklDVF9EQVRFX1JFLnNlYXJjaCh0ZXh0KQorICAgIGlmIG06CisgICAgICAgIGcgPSBtLmdyb3VwcygpCisgICAgICAgIG1vbiA9IE1PTlRIU19MT1dFUi5pbmRleChnWzFdLmxvd2VyKCkpICsgMQorICAgICAgICB0dCA9IChpbnQoZ1syXSksIG1vbiwgaW50KGdbMF0pLAorICAgICAgICAgICAgICBpbnQoZ1szXSksIGludChnWzRdKSwgZmxvYXQoZ1s1XSkpCisgICAgICAgIHJldHVybiBfdGltZWdtKHR0KQorCisgICAgIyBObywgd2UgbmVlZCBzb21lIG1lc3N5IHBhcnNpbmcuLi4KKworICAgICMgY2xlYW4gdXAKKyAgICB0ZXh0ID0gdGV4dC5sc3RyaXAoKQorICAgIHRleHQgPSBXRUVLREFZX1JFLnN1YigiIiwgdGV4dCwgMSkgICMgVXNlbGVzcyB3ZWVrZGF5CisKKyAgICAjIHR6IGlzIHRpbWUgem9uZSBzcGVjaWZpZXIgc3RyaW5nCisgICAgZGF5LCBtb24sIHlyLCBociwgbWluLCBzZWMsIHR6ID0gW05vbmVdKjcKKworICAgICMgbG9vc2UgcmVnZXhwIHBhcnNlCisgICAgbSA9IExPT1NFX0hUVFBfREFURV9SRS5zZWFyY2godGV4dCkKKyAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICBkYXksIG1vbiwgeXIsIGhyLCBtaW4sIHNlYywgdHogPSBtLmdyb3VwcygpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUgICMgYmFkIGZvcm1hdAorCisgICAgcmV0dXJuIF9zdHIydGltZShkYXksIG1vbiwgeXIsIGhyLCBtaW4sIHNlYywgdHopCisKK0lTT19EQVRFX1JFID0gcmUuY29tcGlsZSgKKyAgICAiIiJeCisgICAgKFxkezR9KSAgICAgICAgICAgICAgIyB5ZWFyCisgICAgICAgWy1cL10/CisgICAgKFxkXGQ/KSAgICAgICAgICAgICAgIyBudW1lcmljYWwgbW9udGgKKyAgICAgICBbLVwvXT8KKyAgICAoXGRcZD8pICAgICAgICAgICAgICAjIGRheQorICAgKD86CisgICAgICAgICAoPzpccyt8Wy06VHRdKSAgIyBzZXBhcmF0b3IgYmVmb3JlIGNsb2NrCisgICAgICAoXGRcZD8pOj8oXGRcZCkgICAgIyBob3VyOm1pbgorICAgICAgKD86Oj8oXGRcZCg/OlwuXGQqKT8pKT8gICMgb3B0aW9uYWwgc2Vjb25kcyAoYW5kIGZyYWN0aW9uYWwpCisgICApPyAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCBjbG9jaworICAgICAgXHMqCisgICAoWy0rXT9cZFxkPzo/KDo/XGRcZCk/CisgICAgfFp8eik/ICAgICAgICAgICAgICAgIyB0aW1lem9uZSAgKFogaXMgInplcm8gbWVyaWRpYW4iLCBpLmUuIEdNVCkKKyAgICAgIFxzKiQiIiIsIHJlLlgpCitkZWYgaXNvMnRpbWUodGV4dCk6CisgICAgIiIiCisgICAgQXMgZm9yIGh0dHAydGltZSwgYnV0IHBhcnNlcyB0aGUgSVNPIDg2MDEgZm9ybWF0czoKKworICAgIDE5OTQtMDItMDMgMTQ6MTU6MjkgLTAxMDAgICAgLS0gSVNPIDg2MDEgZm9ybWF0CisgICAgMTk5NC0wMi0wMyAxNDoxNToyOSAgICAgICAgICAtLSB6b25lIGlzIG9wdGlvbmFsCisgICAgMTk5NC0wMi0wMyAgICAgICAgICAgICAgICAgICAtLSBvbmx5IGRhdGUKKyAgICAxOTk0LTAyLTAzVDE0OjE1OjI5ICAgICAgICAgIC0tIFVzZSBUIGFzIHNlcGFyYXRvcgorICAgIDE5OTQwMjAzVDE0MTUyOVogICAgICAgICAgICAgLS0gSVNPIDg2MDEgY29tcGFjdCBmb3JtYXQKKyAgICAxOTk0MDIwMyAgICAgICAgICAgICAgICAgICAgIC0tIG9ubHkgZGF0ZQorCisgICAgIiIiCisgICAgIyBjbGVhbiB1cAorICAgIHRleHQgPSB0ZXh0LmxzdHJpcCgpCisKKyAgICAjIHR6IGlzIHRpbWUgem9uZSBzcGVjaWZpZXIgc3RyaW5nCisgICAgZGF5LCBtb24sIHlyLCBociwgbWluLCBzZWMsIHR6ID0gW05vbmVdKjcKKworICAgICMgbG9vc2UgcmVnZXhwIHBhcnNlCisgICAgbSA9IElTT19EQVRFX1JFLnNlYXJjaCh0ZXh0KQorICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgICMgWFhYIHRoZXJlJ3MgYW4gZXh0cmEgYml0IG9mIHRoZSB0aW1lem9uZSBJJ20gaWdub3JpbmcgaGVyZTogaXMKKyAgICAgICAgIyAgIHRoaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvPworICAgICAgICB5ciwgbW9uLCBkYXksIGhyLCBtaW4sIHNlYywgdHosIF8gPSBtLmdyb3VwcygpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUgICMgYmFkIGZvcm1hdAorCisgICAgcmV0dXJuIF9zdHIydGltZShkYXksIG1vbiwgeXIsIGhyLCBtaW4sIHNlYywgdHopCisKKworIyBIZWFkZXIgcGFyc2luZworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdW5tYXRjaGVkKG1hdGNoKToKKyAgICAiIiJSZXR1cm4gdW5tYXRjaGVkIHBhcnQgb2YgcmUuTWF0Y2ggb2JqZWN0LiIiIgorICAgIHN0YXJ0LCBlbmQgPSBtYXRjaC5zcGFuKDApCisgICAgcmV0dXJuIG1hdGNoLnN0cmluZ1s6c3RhcnRdK21hdGNoLnN0cmluZ1tlbmQ6XQorCitIRUFERVJfVE9LRU5fUkUgPSAgICAgICAgcmUuY29tcGlsZShyIl5ccyooW149XHM7LF0rKSIpCitIRUFERVJfUVVPVEVEX1ZBTFVFX1JFID0gcmUuY29tcGlsZShyIl5ccyo9XHMqXCIoW15cIlxcXSooPzpcXC5bXlwiXFxdKikqKVwiIikKK0hFQURFUl9WQUxVRV9SRSA9ICAgICAgICByZS5jb21waWxlKHIiXlxzKj1ccyooW15cczssXSopIikKK0hFQURFUl9FU0NBUEVfUkUgPSByZS5jb21waWxlKHIiXFwoLikiKQorZGVmIHNwbGl0X2hlYWRlcl93b3JkcyhoZWFkZXJfdmFsdWVzKToKKyAgICByIiIiUGFyc2UgaGVhZGVyIHZhbHVlcyBpbnRvIGEgbGlzdCBvZiBsaXN0cyBjb250YWluaW5nIGtleSx2YWx1ZSBwYWlycy4KKworICAgIFRoZSBmdW5jdGlvbiBrbm93cyBob3cgdG8gZGVhbCB3aXRoICIsIiwgIjsiIGFuZCAiPSIgYXMgd2VsbCBhcyBxdW90ZWQKKyAgICB2YWx1ZXMgYWZ0ZXIgIj0iLiAgQSBsaXN0IG9mIHNwYWNlIHNlcGFyYXRlZCB0b2tlbnMgYXJlIHBhcnNlZCBhcyBpZiB0aGV5CisgICAgd2VyZSBzZXBhcmF0ZWQgYnkgIjsiLgorCisgICAgSWYgdGhlIGhlYWRlcl92YWx1ZXMgcGFzc2VkIGFzIGFyZ3VtZW50IGNvbnRhaW5zIG11bHRpcGxlIHZhbHVlcywgdGhlbiB0aGV5CisgICAgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlIGEgc2luZ2xlIHZhbHVlIHNlcGFyYXRlZCBieSBjb21tYSAiLCIuCisKKyAgICBUaGlzIG1lYW5zIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHBhcnNpbmcgaGVhZGVyIGZpZWxkcyB0aGF0CisgICAgZm9sbG93IHRoaXMgc3ludGF4IChCTkYgYXMgZnJvbSB0aGUgSFRUUC8xLjEgc3BlY2lmaWNhdGlvbiwgYnV0IHdlIHJlbGF4CisgICAgdGhlIHJlcXVpcmVtZW50IGZvciB0b2tlbnMpLgorCisgICAgICBoZWFkZXJzICAgICAgICAgICA9ICNoZWFkZXIKKyAgICAgIGhlYWRlciAgICAgICAgICAgID0gKHRva2VuIHwgcGFyYW1ldGVyKSAqKCBbIjsiXSAodG9rZW4gfCBwYXJhbWV0ZXIpKQorCisgICAgICB0b2tlbiAgICAgICAgICAgICA9IDEqPGFueSBDSEFSIGV4Y2VwdCBDVExzIG9yIHNlcGFyYXRvcnM+CisgICAgICBzZXBhcmF0b3JzICAgICAgICA9ICIoIiB8ICIpIiB8ICI8IiB8ICI+IiB8ICJAIgorICAgICAgICAgICAgICAgICAgICAgICAgfCAiLCIgfCAiOyIgfCAiOiIgfCAiXCIgfCA8Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgIi8iIHwgIlsiIHwgIl0iIHwgIj8iIHwgIj0iCisgICAgICAgICAgICAgICAgICAgICAgICB8ICJ7IiB8ICJ9IiB8IFNQIHwgSFQKKworICAgICAgcXVvdGVkLXN0cmluZyAgICAgPSAoIDwiPiAqKHFkdGV4dCB8IHF1b3RlZC1wYWlyICkgPCI+ICkKKyAgICAgIHFkdGV4dCAgICAgICAgICAgID0gPGFueSBURVhUIGV4Y2VwdCA8Ij4+CisgICAgICBxdW90ZWQtcGFpciAgICAgICA9ICJcIiBDSEFSCisKKyAgICAgIHBhcmFtZXRlciAgICAgICAgID0gYXR0cmlidXRlICI9IiB2YWx1ZQorICAgICAgYXR0cmlidXRlICAgICAgICAgPSB0b2tlbgorICAgICAgdmFsdWUgICAgICAgICAgICAgPSB0b2tlbiB8IHF1b3RlZC1zdHJpbmcKKworICAgIEVhY2ggaGVhZGVyIGlzIHJlcHJlc2VudGVkIGJ5IGEgbGlzdCBvZiBrZXkvdmFsdWUgcGFpcnMuICBUaGUgdmFsdWUgZm9yIGEKKyAgICBzaW1wbGUgdG9rZW4gKG5vdCBwYXJ0IG9mIGEgcGFyYW1ldGVyKSBpcyBOb25lLiAgU3ludGFjdGljYWxseSBpbmNvcnJlY3QKKyAgICBoZWFkZXJzIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIHBhcnNlZCBhcyB5b3Ugd291bGQgd2FudC4KKworICAgIFRoaXMgaXMgZWFzaWVyIHRvIGRlc2NyaWJlIHdpdGggc29tZSBleGFtcGxlczoKKworICAgID4+PiBzcGxpdF9oZWFkZXJfd29yZHMoWydmb289ImJhciI7IHBvcnQ9IjgwLDgxIjsgZGlzY2FyZCwgYmFyPWJheiddKQorICAgIFtbKCdmb28nLCAnYmFyJyksICgncG9ydCcsICc4MCw4MScpLCAoJ2Rpc2NhcmQnLCBOb25lKV0sIFsoJ2JhcicsICdiYXonKV1dCisgICAgPj4+IHNwbGl0X2hlYWRlcl93b3JkcyhbJ3RleHQvaHRtbDsgY2hhcnNldD0iaXNvLTg4NTktMSInXSkKKyAgICBbWygndGV4dC9odG1sJywgTm9uZSksICgnY2hhcnNldCcsICdpc28tODg1OS0xJyldXQorICAgID4+PiBzcGxpdF9oZWFkZXJfd29yZHMoW3InQmFzaWMgcmVhbG09IlwiZm9vXGJhclwiIiddKQorICAgIFtbKCdCYXNpYycsIE5vbmUpLCAoJ3JlYWxtJywgJyJmb29iYXIiJyldXQorCisgICAgIiIiCisgICAgYXNzZXJ0IG5vdCBpc2luc3RhbmNlKGhlYWRlcl92YWx1ZXMsIGJhc2VzdHJpbmcpCisgICAgcmVzdWx0ID0gW10KKyAgICBmb3IgdGV4dCBpbiBoZWFkZXJfdmFsdWVzOgorICAgICAgICBvcmlnX3RleHQgPSB0ZXh0CisgICAgICAgIHBhaXJzID0gW10KKyAgICAgICAgd2hpbGUgdGV4dDoKKyAgICAgICAgICAgIG0gPSBIRUFERVJfVE9LRU5fUkUuc2VhcmNoKHRleHQpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIHRleHQgPSB1bm1hdGNoZWQobSkKKyAgICAgICAgICAgICAgICBuYW1lID0gbS5ncm91cCgxKQorICAgICAgICAgICAgICAgIG0gPSBIRUFERVJfUVVPVEVEX1ZBTFVFX1JFLnNlYXJjaCh0ZXh0KQorICAgICAgICAgICAgICAgIGlmIG06ICAjIHF1b3RlZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdW5tYXRjaGVkKG0pCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbS5ncm91cCgxKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEhFQURFUl9FU0NBUEVfUkUuc3ViKHIiXDEiLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtID0gSEVBREVSX1ZBTFVFX1JFLnNlYXJjaCh0ZXh0KQorICAgICAgICAgICAgICAgICAgICBpZiBtOiAgIyB1bnF1b3RlZCB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHVubWF0Y2hlZChtKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtLmdyb3VwKDEpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJzdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHZhbHVlLCBhIGxvbmUgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTm9uZQorICAgICAgICAgICAgICAgIHBhaXJzLmFwcGVuZCgobmFtZSwgdmFsdWUpKQorICAgICAgICAgICAgZWxpZiB0ZXh0LmxzdHJpcCgpLnN0YXJ0c3dpdGgoIiwiKToKKyAgICAgICAgICAgICAgICAjIGNvbmNhdGVuYXRlZCBoZWFkZXJzLCBhcyBwZXIgUkZDIDI2MTYgc2VjdGlvbiA0LjIKKyAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5sc3RyaXAoKVsxOl0KKyAgICAgICAgICAgICAgICBpZiBwYWlyczogcmVzdWx0LmFwcGVuZChwYWlycykKKyAgICAgICAgICAgICAgICBwYWlycyA9IFtdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgc2tpcCBqdW5rCisgICAgICAgICAgICAgICAgbm9uX2p1bmssIG5yX2p1bmtfY2hhcnMgPSByZS5zdWJuKCJeWz1ccztdKiIsICIiLCB0ZXh0KQorICAgICAgICAgICAgICAgIGFzc2VydCBucl9qdW5rX2NoYXJzID4gMCwgKAorICAgICAgICAgICAgICAgICAgICAic3BsaXRfaGVhZGVyX3dvcmRzIGJ1ZzogJyVzJywgJyVzJywgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgKG9yaWdfdGV4dCwgdGV4dCwgcGFpcnMpKQorICAgICAgICAgICAgICAgIHRleHQgPSBub25fanVuaworICAgICAgICBpZiBwYWlyczogcmVzdWx0LmFwcGVuZChwYWlycykKKyAgICByZXR1cm4gcmVzdWx0CisKK0hFQURFUl9KT0lOX0VTQ0FQRV9SRSA9IHJlLmNvbXBpbGUociIoW1wiXFxdKSIpCitkZWYgam9pbl9oZWFkZXJfd29yZHMobGlzdHMpOgorICAgICIiIkRvIHRoZSBpbnZlcnNlIChhbG1vc3QpIG9mIHRoZSBjb252ZXJzaW9uIGRvbmUgYnkgc3BsaXRfaGVhZGVyX3dvcmRzLgorCisgICAgVGFrZXMgYSBsaXN0IG9mIGxpc3RzIG9mIChrZXksIHZhbHVlKSBwYWlycyBhbmQgcHJvZHVjZXMgYSBzaW5nbGUgaGVhZGVyCisgICAgdmFsdWUuICBBdHRyaWJ1dGUgdmFsdWVzIGFyZSBxdW90ZWQgaWYgbmVlZGVkLgorCisgICAgPj4+IGpvaW5faGVhZGVyX3dvcmRzKFtbKCJ0ZXh0L3BsYWluIiwgTm9uZSksICgiY2hhcnNldCIsICJpc28tODg1OS8xIildXSkKKyAgICAndGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTkvMSInCisgICAgPj4+IGpvaW5faGVhZGVyX3dvcmRzKFtbKCJ0ZXh0L3BsYWluIiwgTm9uZSldLCBbKCJjaGFyc2V0IiwgImlzby04ODU5LzEiKV1dKQorICAgICd0ZXh0L3BsYWluLCBjaGFyc2V0PSJpc28tODg1OS8xIicKKworICAgICIiIgorICAgIGhlYWRlcnMgPSBbXQorICAgIGZvciBwYWlycyBpbiBsaXN0czoKKyAgICAgICAgYXR0ciA9IFtdCisgICAgICAgIGZvciBrLCB2IGluIHBhaXJzOgorICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBub3QgcmUuc2VhcmNoKHIiXlx3KyQiLCB2KToKKyAgICAgICAgICAgICAgICAgICAgdiA9IEhFQURFUl9KT0lOX0VTQ0FQRV9SRS5zdWIociJcXFwxIiwgdikgICMgZXNjYXBlICIgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgdiA9ICciJXMiJyAlIHYKKyAgICAgICAgICAgICAgICBrID0gIiVzPSVzIiAlIChrLCB2KQorICAgICAgICAgICAgYXR0ci5hcHBlbmQoaykKKyAgICAgICAgaWYgYXR0cjogaGVhZGVycy5hcHBlbmQoIjsgIi5qb2luKGF0dHIpKQorICAgIHJldHVybiAiLCAiLmpvaW4oaGVhZGVycykKKworZGVmIF9zdHJpcF9xdW90ZXModGV4dCk6CisgICAgaWYgdGV4dC5zdGFydHN3aXRoKCciJyk6CisgICAgICAgIHRleHQgPSB0ZXh0WzE6XQorICAgIGlmIHRleHQuZW5kc3dpdGgoJyInKToKKyAgICAgICAgdGV4dCA9IHRleHRbOi0xXQorICAgIHJldHVybiB0ZXh0CisKK2RlZiBwYXJzZV9uc19oZWFkZXJzKG5zX2hlYWRlcnMpOgorICAgICIiIkFkLWhvYyBwYXJzZXIgZm9yIE5ldHNjYXBlIHByb3RvY29sIGNvb2tpZS1hdHRyaWJ1dGVzLgorCisgICAgVGhlIG9sZCBOZXRzY2FwZSBjb29raWUgZm9ybWF0IGZvciBTZXQtQ29va2llIGNhbiBmb3IgaW5zdGFuY2UgY29udGFpbgorICAgIGFuIHVucXVvdGVkICIsIiBpbiB0aGUgZXhwaXJlcyBmaWVsZCwgc28gd2UgaGF2ZSB0byB1c2UgdGhpcyBhZC1ob2MKKyAgICBwYXJzZXIgaW5zdGVhZCBvZiBzcGxpdF9oZWFkZXJfd29yZHMuCisKKyAgICBYWFggVGhpcyBtYXkgbm90IG1ha2UgdGhlIGJlc3QgcG9zc2libGUgZWZmb3J0IHRvIHBhcnNlIGFsbCB0aGUgY3JhcAorICAgIHRoYXQgTmV0c2NhcGUgQ29va2llIGhlYWRlcnMgY29udGFpbi4gIFJvbmFsZCBUc2NoYWxhcidzIEhUVFBDbGllbnQKKyAgICBwYXJzZXIgaXMgcHJvYmFibHkgYmV0dGVyLCBzbyBjb3VsZCBkbyB3b3JzZSB0aGFuIGZvbGxvd2luZyB0aGF0IGlmCisgICAgdGhpcyBldmVyIGdpdmVzIGFueSB0cm91YmxlLgorCisgICAgQ3VycmVudGx5LCB0aGlzIGlzIGFsc28gdXNlZCBmb3IgcGFyc2luZyBSRkMgMjEwOSBjb29raWVzLgorCisgICAgIiIiCisgICAga25vd25fYXR0cnMgPSAoImV4cGlyZXMiLCAiZG9tYWluIiwgInBhdGgiLCAic2VjdXJlIiwKKyAgICAgICAgICAgICAgICAgICAjIFJGQyAyMTA5IGF0dHJzIChtYXkgdHVybiB1cCBpbiBOZXRzY2FwZSBjb29raWVzLCB0b28pCisgICAgICAgICAgICAgICAgICAgInZlcnNpb24iLCAicG9ydCIsICJtYXgtYWdlIikKKworICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIG5zX2hlYWRlciBpbiBuc19oZWFkZXJzOgorICAgICAgICBwYWlycyA9IFtdCisgICAgICAgIHZlcnNpb25fc2V0ID0gRmFsc2UKKyAgICAgICAgZm9yIGlpLCBwYXJhbSBpbiBlbnVtZXJhdGUocmUuc3BsaXQociI7XHMqIiwgbnNfaGVhZGVyKSk6CisgICAgICAgICAgICBwYXJhbSA9IHBhcmFtLnJzdHJpcCgpCisgICAgICAgICAgICBpZiBwYXJhbSA9PSAiIjogY29udGludWUKKyAgICAgICAgICAgIGlmICI9IiBub3QgaW4gcGFyYW06CisgICAgICAgICAgICAgICAgaywgdiA9IHBhcmFtLCBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGssIHYgPSByZS5zcGxpdChyIlxzKj1ccyoiLCBwYXJhbSwgMSkKKyAgICAgICAgICAgICAgICBrID0gay5sc3RyaXAoKQorICAgICAgICAgICAgaWYgaWkgIT0gMDoKKyAgICAgICAgICAgICAgICBsYyA9IGsubG93ZXIoKQorICAgICAgICAgICAgICAgIGlmIGxjIGluIGtub3duX2F0dHJzOgorICAgICAgICAgICAgICAgICAgICBrID0gbGMKKyAgICAgICAgICAgICAgICBpZiBrID09ICJ2ZXJzaW9uIjoKKyAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGFuIFJGQyAyMTA5IGNvb2tpZS4KKyAgICAgICAgICAgICAgICAgICAgdiA9IF9zdHJpcF9xdW90ZXModikKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl9zZXQgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgayA9PSAiZXhwaXJlcyI6CisgICAgICAgICAgICAgICAgICAgICMgY29udmVydCBleHBpcmVzIGRhdGUgdG8gc2Vjb25kcyBzaW5jZSBlcG9jaAorICAgICAgICAgICAgICAgICAgICB2ID0gaHR0cDJ0aW1lKF9zdHJpcF9xdW90ZXModikpICAjIE5vbmUgaWYgaW52YWxpZAorICAgICAgICAgICAgcGFpcnMuYXBwZW5kKChrLCB2KSkKKworICAgICAgICBpZiBwYWlyczoKKyAgICAgICAgICAgIGlmIG5vdCB2ZXJzaW9uX3NldDoKKyAgICAgICAgICAgICAgICBwYWlycy5hcHBlbmQoKCJ2ZXJzaW9uIiwgIjAiKSkKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocGFpcnMpCisKKyAgICByZXR1cm4gcmVzdWx0CisKKworSVBWNF9SRSA9IHJlLmNvbXBpbGUociJcLlxkKyQiKQorZGVmIGlzX0hETih0ZXh0KToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0ZXh0IGlzIGEgaG9zdCBkb21haW4gbmFtZS4iIiIKKyAgICAjIFhYWAorICAgICMgVGhpcyBtYXkgd2VsbCBiZSB3cm9uZy4gIFdoaWNoIFJGQyBpcyBIRE4gZGVmaW5lZCBpbiwgaWYgYW55IChmb3IKKyAgICAjICB0aGUgcHVycG9zZXMgb2YgUkZDIDI5NjUpPworICAgICMgRm9yIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB3aGF0IGFib3V0IElQdjY/ICBSZW1lbWJlciB0byBsb29rCisgICAgIyAgYXQgb3RoZXIgdXNlcyBvZiBJUFY0X1JFIGFsc28sIGlmIGNoYW5nZSB0aGlzLgorICAgIGlmIElQVjRfUkUuc2VhcmNoKHRleHQpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiB0ZXh0ID09ICIiOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiB0ZXh0WzBdID09ICIuIiBvciB0ZXh0Wy0xXSA9PSAiLiI6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCisKK2RlZiBkb21haW5fbWF0Y2goQSwgQik6CisgICAgIiIiUmV0dXJuIFRydWUgaWYgZG9tYWluIEEgZG9tYWluLW1hdGNoZXMgZG9tYWluIEIsIGFjY29yZGluZyB0byBSRkMgMjk2NS4KKworICAgIEEgYW5kIEIgbWF5IGJlIGhvc3QgZG9tYWluIG5hbWVzIG9yIElQIGFkZHJlc3Nlcy4KKworICAgIFJGQyAyOTY1LCBzZWN0aW9uIDE6CisKKyAgICBIb3N0IG5hbWVzIGNhbiBiZSBzcGVjaWZpZWQgZWl0aGVyIGFzIGFuIElQIGFkZHJlc3Mgb3IgYSBIRE4gc3RyaW5nLgorICAgIFNvbWV0aW1lcyB3ZSBjb21wYXJlIG9uZSBob3N0IG5hbWUgd2l0aCBhbm90aGVyLiAgKFN1Y2ggY29tcGFyaXNvbnMgU0hBTEwKKyAgICBiZSBjYXNlLWluc2Vuc2l0aXZlLikgIEhvc3QgQSdzIG5hbWUgZG9tYWluLW1hdGNoZXMgaG9zdCBCJ3MgaWYKKworICAgICAgICAgKiAgdGhlaXIgaG9zdCBuYW1lIHN0cmluZ3Mgc3RyaW5nLWNvbXBhcmUgZXF1YWw7IG9yCisKKyAgICAgICAgICogQSBpcyBhIEhETiBzdHJpbmcgYW5kIGhhcyB0aGUgZm9ybSBOQiwgd2hlcmUgTiBpcyBhIG5vbi1lbXB0eQorICAgICAgICAgICAgbmFtZSBzdHJpbmcsIEIgaGFzIHRoZSBmb3JtIC5CJywgYW5kIEInIGlzIGEgSEROIHN0cmluZy4gIChTbywKKyAgICAgICAgICAgIHgueS5jb20gZG9tYWluLW1hdGNoZXMgLlkuY29tIGJ1dCBub3QgWS5jb20uKQorCisgICAgTm90ZSB0aGF0IGRvbWFpbi1tYXRjaCBpcyBub3QgYSBjb21tdXRhdGl2ZSBvcGVyYXRpb246IGEuYi5jLmNvbQorICAgIGRvbWFpbi1tYXRjaGVzIC5jLmNvbSwgYnV0IG5vdCB0aGUgcmV2ZXJzZS4KKworICAgICIiIgorICAgICMgTm90ZSB0aGF0LCBpZiBBIG9yIEIgYXJlIElQIGFkZHJlc3NlcywgdGhlIG9ubHkgcmVsZXZhbnQgcGFydCBvZiB0aGUKKyAgICAjIGRlZmluaXRpb24gb2YgdGhlIGRvbWFpbi1tYXRjaCBhbGdvcml0aG0gaXMgdGhlIGRpcmVjdCBzdHJpbmctY29tcGFyZS4KKyAgICBBID0gQS5sb3dlcigpCisgICAgQiA9IEIubG93ZXIoKQorICAgIGlmIEEgPT0gQjoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBpZiBub3QgaXNfSEROKEEpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpID0gQS5yZmluZChCKQorICAgIGlmIGkgPT0gLTEgb3IgaSA9PSAwOgorICAgICAgICAjIEEgZG9lcyBub3QgaGF2ZSBmb3JtIE5CLCBvciBOIGlzIHRoZSBlbXB0eSBzdHJpbmcKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgbm90IEIuc3RhcnRzd2l0aCgiLiIpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBub3QgaXNfSEROKEJbMTpdKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworZGVmIGxpYmVyYWxfaXNfSEROKHRleHQpOgorICAgICIiIlJldHVybiBUcnVlIGlmIHRleHQgaXMgYSBzb3J0LW9mLWxpa2UgYSBob3N0IGRvbWFpbiBuYW1lLgorCisgICAgRm9yIGFjY2VwdGluZy9ibG9ja2luZyBkb21haW5zLgorCisgICAgIiIiCisgICAgaWYgSVBWNF9SRS5zZWFyY2godGV4dCk6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCisKK2RlZiB1c2VyX2RvbWFpbl9tYXRjaChBLCBCKToKKyAgICAiIiJGb3IgYmxvY2tpbmcvYWNjZXB0aW5nIGRvbWFpbnMuCisKKyAgICBBIGFuZCBCIG1heSBiZSBob3N0IGRvbWFpbiBuYW1lcyBvciBJUCBhZGRyZXNzZXMuCisKKyAgICAiIiIKKyAgICBBID0gQS5sb3dlcigpCisgICAgQiA9IEIubG93ZXIoKQorICAgIGlmIG5vdCAobGliZXJhbF9pc19IRE4oQSkgYW5kIGxpYmVyYWxfaXNfSEROKEIpKToKKyAgICAgICAgaWYgQSA9PSBCOgorICAgICAgICAgICAgIyBlcXVhbCBJUCBhZGRyZXNzZXMKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGluaXRpYWxfZG90ID0gQi5zdGFydHN3aXRoKCIuIikKKyAgICBpZiBpbml0aWFsX2RvdCBhbmQgQS5lbmRzd2l0aChCKToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBpZiBub3QgaW5pdGlhbF9kb3QgYW5kIEEgPT0gQjoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworY3V0X3BvcnRfcmUgPSByZS5jb21waWxlKHIiOlxkKyQiKQorZGVmIHJlcXVlc3RfaG9zdChyZXF1ZXN0KToKKyAgICAiIiJSZXR1cm4gcmVxdWVzdC1ob3N0LCBhcyBkZWZpbmVkIGJ5IFJGQyAyOTY1LgorCisgICAgVmFyaWF0aW9uIGZyb20gUkZDOiByZXR1cm5lZCB2YWx1ZSBpcyBsb3dlcmNhc2VkLCBmb3IgY29udmVuaWVudAorICAgIGNvbXBhcmlzb24uCisKKyAgICAiIiIKKyAgICB1cmwgPSByZXF1ZXN0LmdldF9mdWxsX3VybCgpCisgICAgaG9zdCA9IHVybHBhcnNlLnVybHBhcnNlKHVybClbMV0KKyAgICBpZiBob3N0ID09ICIiOgorICAgICAgICBob3N0ID0gcmVxdWVzdC5nZXRfaGVhZGVyKCJIb3N0IiwgIiIpCisKKyAgICAjIHJlbW92ZSBwb3J0LCBpZiBwcmVzZW50CisgICAgaG9zdCA9IGN1dF9wb3J0X3JlLnN1YigiIiwgaG9zdCwgMSkKKyAgICByZXR1cm4gaG9zdC5sb3dlcigpCisKK2RlZiBlZmZfcmVxdWVzdF9ob3N0KHJlcXVlc3QpOgorICAgICIiIlJldHVybiBhIHR1cGxlIChyZXF1ZXN0LWhvc3QsIGVmZmVjdGl2ZSByZXF1ZXN0LWhvc3QgbmFtZSkuCisKKyAgICBBcyBkZWZpbmVkIGJ5IFJGQyAyOTY1LCBleGNlcHQgYm90aCBhcmUgbG93ZXJjYXNlZC4KKworICAgICIiIgorICAgIGVyaG4gPSByZXFfaG9zdCA9IHJlcXVlc3RfaG9zdChyZXF1ZXN0KQorICAgIGlmIHJlcV9ob3N0LmZpbmQoIi4iKSA9PSAtMSBhbmQgbm90IElQVjRfUkUuc2VhcmNoKHJlcV9ob3N0KToKKyAgICAgICAgZXJobiA9IHJlcV9ob3N0ICsgIi5sb2NhbCIKKyAgICByZXR1cm4gcmVxX2hvc3QsIGVyaG4KKworZGVmIHJlcXVlc3RfcGF0aChyZXF1ZXN0KToKKyAgICAiIiJQYXRoIGNvbXBvbmVudCBvZiByZXF1ZXN0LVVSSSwgYXMgZGVmaW5lZCBieSBSRkMgMjk2NS4iIiIKKyAgICB1cmwgPSByZXF1ZXN0LmdldF9mdWxsX3VybCgpCisgICAgcGFydHMgPSB1cmxwYXJzZS51cmxzcGxpdCh1cmwpCisgICAgcGF0aCA9IGVzY2FwZV9wYXRoKHBhcnRzLnBhdGgpCisgICAgaWYgbm90IHBhdGguc3RhcnRzd2l0aCgiLyIpOgorICAgICAgICAjIGZpeCBiYWQgUkZDIDIzOTYgYWJzb2x1dGVVUkkKKyAgICAgICAgcGF0aCA9ICIvIiArIHBhdGgKKyAgICByZXR1cm4gcGF0aAorCitkZWYgcmVxdWVzdF9wb3J0KHJlcXVlc3QpOgorICAgIGhvc3QgPSByZXF1ZXN0LmdldF9ob3N0KCkKKyAgICBpID0gaG9zdC5maW5kKCc6JykKKyAgICBpZiBpID49IDA6CisgICAgICAgIHBvcnQgPSBob3N0W2krMTpdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGludChwb3J0KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIF9kZWJ1Zygibm9ubnVtZXJpYyBwb3J0OiAnJXMnIiwgcG9ydCkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgZWxzZToKKyAgICAgICAgcG9ydCA9IERFRkFVTFRfSFRUUF9QT1JUCisgICAgcmV0dXJuIHBvcnQKKworIyBDaGFyYWN0ZXJzIGluIGFkZGl0aW9uIHRvIEEtWiwgYS16LCAwLTksICdfJywgJy4nLCBhbmQgJy0nIHRoYXQgZG9uJ3QKKyMgbmVlZCB0byBiZSBlc2NhcGVkIHRvIGZvcm0gYSB2YWxpZCBIVFRQIFVSTCAoUkZDcyAyMzk2IGFuZCAxNzM4KS4KK0hUVFBfUEFUSF9TQUZFID0gIiUvOzpAJj0rJCwhfionKCkiCitFU0NBUEVEX0NIQVJfUkUgPSByZS5jb21waWxlKHIiJShbMC05YS1mQS1GXVswLTlhLWZBLUZdKSIpCitkZWYgdXBwZXJjYXNlX2VzY2FwZWRfY2hhcihtYXRjaCk6CisgICAgcmV0dXJuICIlJSVzIiAlIG1hdGNoLmdyb3VwKDEpLnVwcGVyKCkKK2RlZiBlc2NhcGVfcGF0aChwYXRoKToKKyAgICAiIiJFc2NhcGUgYW55IGludmFsaWQgY2hhcmFjdGVycyBpbiBIVFRQIFVSTCwgYW5kIHVwcGVyY2FzZSBhbGwgZXNjYXBlcy4iIiIKKyAgICAjIFRoZXJlJ3Mgbm8ga25vd2luZyB3aGF0IGNoYXJhY3RlciBlbmNvZGluZyB3YXMgdXNlZCB0byBjcmVhdGUgVVJMcworICAgICMgY29udGFpbmluZyAlLWVzY2FwZXMsIGJ1dCBzaW5jZSB3ZSBoYXZlIHRvIHBpY2sgb25lIHRvIGVzY2FwZSBpbnZhbGlkCisgICAgIyBwYXRoIGNoYXJhY3RlcnMsIHdlIHBpY2sgVVRGLTgsIGFzIHJlY29tbWVuZGVkIGluIHRoZSBIVE1MIDQuMAorICAgICMgc3BlY2lmaWNhdGlvbjoKKyAgICAjIGh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvYXBwZW5kaXgvbm90ZXMuaHRtbCNoLUIuMi4xCisgICAgIyBBbmQgaGVyZSwga2luZCBvZjogZHJhZnQtZmllbGRpbmctdXJpLXJmYzIzOTZiaXMtMDMKKyAgICAjIChBbmQgaW4gZHJhZnQgSVJJIHNwZWNpZmljYXRpb246IGRyYWZ0LWR1ZXJzdC1pcmktMDUpCisgICAgIyAoQW5kIGhlcmUsIGZvciBuZXcgVVJJIHNjaGVtZXM6IFJGQyAyNzE4KQorICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgdW5pY29kZSk6CisgICAgICAgIHBhdGggPSBwYXRoLmVuY29kZSgidXRmLTgiKQorICAgIHBhdGggPSB1cmxsaWIucXVvdGUocGF0aCwgSFRUUF9QQVRIX1NBRkUpCisgICAgcGF0aCA9IEVTQ0FQRURfQ0hBUl9SRS5zdWIodXBwZXJjYXNlX2VzY2FwZWRfY2hhciwgcGF0aCkKKyAgICByZXR1cm4gcGF0aAorCitkZWYgcmVhY2goaCk6CisgICAgIiIiUmV0dXJuIHJlYWNoIG9mIGhvc3QgaCwgYXMgZGVmaW5lZCBieSBSRkMgMjk2NSwgc2VjdGlvbiAxLgorCisgICAgVGhlIHJlYWNoIFIgb2YgYSBob3N0IG5hbWUgSCBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisKKyAgICAgICAqICBJZgorCisgICAgICAgICAgLSAgSCBpcyB0aGUgaG9zdCBkb21haW4gbmFtZSBvZiBhIGhvc3Q7IGFuZCwKKworICAgICAgICAgIC0gIEggaGFzIHRoZSBmb3JtIEEuQjsgYW5kCisKKyAgICAgICAgICAtICBBIGhhcyBubyBlbWJlZGRlZCAodGhhdCBpcywgaW50ZXJpb3IpIGRvdHM7IGFuZAorCisgICAgICAgICAgLSAgQiBoYXMgYXQgbGVhc3Qgb25lIGVtYmVkZGVkIGRvdCwgb3IgQiBpcyB0aGUgc3RyaW5nICJsb2NhbCIuCisgICAgICAgICAgICAgdGhlbiB0aGUgcmVhY2ggb2YgSCBpcyAuQi4KKworICAgICAgICogIE90aGVyd2lzZSwgdGhlIHJlYWNoIG9mIEggaXMgSC4KKworICAgID4+PiByZWFjaCgid3d3LmFjbWUuY29tIikKKyAgICAnLmFjbWUuY29tJworICAgID4+PiByZWFjaCgiYWNtZS5jb20iKQorICAgICdhY21lLmNvbScKKyAgICA+Pj4gcmVhY2goImFjbWUubG9jYWwiKQorICAgICcubG9jYWwnCisKKyAgICAiIiIKKyAgICBpID0gaC5maW5kKCIuIikKKyAgICBpZiBpID49IDA6CisgICAgICAgICNhID0gaFs6aV0gICMgdGhpcyBsaW5lIGlzIG9ubHkgaGVyZSB0byBzaG93IHdoYXQgYSBpcworICAgICAgICBiID0gaFtpKzE6XQorICAgICAgICBpID0gYi5maW5kKCIuIikKKyAgICAgICAgaWYgaXNfSEROKGgpIGFuZCAoaSA+PSAwIG9yIGIgPT0gImxvY2FsIik6CisgICAgICAgICAgICByZXR1cm4gIi4iK2IKKyAgICByZXR1cm4gaAorCitkZWYgaXNfdGhpcmRfcGFydHkocmVxdWVzdCk6CisgICAgIiIiCisKKyAgICBSRkMgMjk2NSwgc2VjdGlvbiAzLjMuNjoKKworICAgICAgICBBbiB1bnZlcmlmaWFibGUgdHJhbnNhY3Rpb24gaXMgdG8gYSB0aGlyZC1wYXJ0eSBob3N0IGlmIGl0cyByZXF1ZXN0LQorICAgICAgICBob3N0IFUgZG9lcyBub3QgZG9tYWluLW1hdGNoIHRoZSByZWFjaCBSIG9mIHRoZSByZXF1ZXN0LWhvc3QgTyBpbiB0aGUKKyAgICAgICAgb3JpZ2luIHRyYW5zYWN0aW9uLgorCisgICAgIiIiCisgICAgcmVxX2hvc3QgPSByZXF1ZXN0X2hvc3QocmVxdWVzdCkKKyAgICBpZiBub3QgZG9tYWluX21hdGNoKHJlcV9ob3N0LCByZWFjaChyZXF1ZXN0LmdldF9vcmlnaW5fcmVxX2hvc3QoKSkpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBGYWxzZQorCisKK2NsYXNzIENvb2tpZToKKyAgICAiIiJIVFRQIENvb2tpZS4KKworICAgIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBib3RoIE5ldHNjYXBlIGFuZCBSRkMgMjk2NSBjb29raWVzLgorCisgICAgVGhpcyBpcyBkZWxpYmVyYXRlbHkgYSB2ZXJ5IHNpbXBsZSBjbGFzcy4gIEl0IGp1c3QgaG9sZHMgYXR0cmlidXRlcy4gIEl0J3MKKyAgICBwb3NzaWJsZSB0byBjb25zdHJ1Y3QgQ29va2llIGluc3RhbmNlcyB0aGF0IGRvbid0IGNvbXBseSB3aXRoIHRoZSBjb29raWUKKyAgICBzdGFuZGFyZHMuICBDb29raWVKYXIubWFrZV9jb29raWVzIGlzIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGZvciBDb29raWUKKyAgICBvYmplY3RzIC0tIGl0IGRlYWxzIHdpdGggY29va2llIHBhcnNpbmcsIHN1cHBseWluZyBkZWZhdWx0cywgYW5kCisgICAgbm9ybWFsaXNpbmcgdG8gdGhlIHJlcHJlc2VudGF0aW9uIHVzZWQgaW4gdGhpcyBjbGFzcy4gIENvb2tpZVBvbGljeSBpcworICAgIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyB0aGVtIHRvIHNlZSB3aGV0aGVyIHRoZXkgc2hvdWxkIGJlIGFjY2VwdGVkIGZyb20KKyAgICBhbmQgcmV0dXJuZWQgdG8gdGhlIHNlcnZlci4KKworICAgIE5vdGUgdGhhdCB0aGUgcG9ydCBtYXkgYmUgcHJlc2VudCBpbiB0aGUgaGVhZGVycywgYnV0IHVuc3BlY2lmaWVkICgiUG9ydCIKKyAgICByYXRoZXIgdGhhbiJQb3J0PTgwIiwgZm9yIGV4YW1wbGUpOyBpZiB0aGlzIGlzIHRoZSBjYXNlLCBwb3J0IGlzIE5vbmUuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uLCBuYW1lLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgcG9ydCwgcG9ydF9zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgIGRvbWFpbiwgZG9tYWluX3NwZWNpZmllZCwgZG9tYWluX2luaXRpYWxfZG90LAorICAgICAgICAgICAgICAgICBwYXRoLCBwYXRoX3NwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgc2VjdXJlLAorICAgICAgICAgICAgICAgICBleHBpcmVzLAorICAgICAgICAgICAgICAgICBkaXNjYXJkLAorICAgICAgICAgICAgICAgICBjb21tZW50LAorICAgICAgICAgICAgICAgICBjb21tZW50X3VybCwKKyAgICAgICAgICAgICAgICAgcmVzdCwKKyAgICAgICAgICAgICAgICAgcmZjMjEwOT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgKToKKworICAgICAgICBpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOiB2ZXJzaW9uID0gaW50KHZlcnNpb24pCisgICAgICAgIGlmIGV4cGlyZXMgaXMgbm90IE5vbmU6IGV4cGlyZXMgPSBpbnQoZXhwaXJlcykKKyAgICAgICAgaWYgcG9ydCBpcyBOb25lIGFuZCBwb3J0X3NwZWNpZmllZCBpcyBUcnVlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaWYgcG9ydCBpcyBOb25lLCBwb3J0X3NwZWNpZmllZCBtdXN0IGJlIGZhbHNlIikKKworICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5wb3J0X3NwZWNpZmllZCA9IHBvcnRfc3BlY2lmaWVkCisgICAgICAgICMgbm9ybWFsaXNlIGNhc2UsIGFzIHBlciBSRkMgMjk2NSBzZWN0aW9uIDMuMy4zCisgICAgICAgIHNlbGYuZG9tYWluID0gZG9tYWluLmxvd2VyKCkKKyAgICAgICAgc2VsZi5kb21haW5fc3BlY2lmaWVkID0gZG9tYWluX3NwZWNpZmllZAorICAgICAgICAjIFNpZ2guICBXZSBuZWVkIHRvIGtub3cgd2hldGhlciB0aGUgZG9tYWluIGdpdmVuIGluIHRoZQorICAgICAgICAjIGNvb2tpZS1hdHRyaWJ1dGUgaGFkIGFuIGluaXRpYWwgZG90LCBpbiBvcmRlciB0byBmb2xsb3cgUkZDIDI5NjUKKyAgICAgICAgIyAoYXMgY2xhcmlmaWVkIGluIGRyYWZ0IGVycmF0YSkuICBOZWVkZWQgZm9yIHRoZSByZXR1cm5lZCAkRG9tYWluCisgICAgICAgICMgdmFsdWUuCisgICAgICAgIHNlbGYuZG9tYWluX2luaXRpYWxfZG90ID0gZG9tYWluX2luaXRpYWxfZG90CisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5wYXRoX3NwZWNpZmllZCA9IHBhdGhfc3BlY2lmaWVkCisgICAgICAgIHNlbGYuc2VjdXJlID0gc2VjdXJlCisgICAgICAgIHNlbGYuZXhwaXJlcyA9IGV4cGlyZXMKKyAgICAgICAgc2VsZi5kaXNjYXJkID0gZGlzY2FyZAorICAgICAgICBzZWxmLmNvbW1lbnQgPSBjb21tZW50CisgICAgICAgIHNlbGYuY29tbWVudF91cmwgPSBjb21tZW50X3VybAorICAgICAgICBzZWxmLnJmYzIxMDkgPSByZmMyMTA5CisKKyAgICAgICAgc2VsZi5fcmVzdCA9IGNvcHkuY29weShyZXN0KQorCisgICAgZGVmIGhhc19ub25zdGFuZGFyZF9hdHRyKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gbmFtZSBpbiBzZWxmLl9yZXN0CisgICAgZGVmIGdldF9ub25zdGFuZGFyZF9hdHRyKHNlbGYsIG5hbWUsIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9yZXN0LmdldChuYW1lLCBkZWZhdWx0KQorICAgIGRlZiBzZXRfbm9uc3RhbmRhcmRfYXR0cihzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgIHNlbGYuX3Jlc3RbbmFtZV0gPSB2YWx1ZQorCisgICAgZGVmIGlzX2V4cGlyZWQoc2VsZiwgbm93PU5vbmUpOgorICAgICAgICBpZiBub3cgaXMgTm9uZTogbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgaWYgKHNlbGYuZXhwaXJlcyBpcyBub3QgTm9uZSkgYW5kIChzZWxmLmV4cGlyZXMgPD0gbm93KToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYucG9ydCBpcyBOb25lOiBwID0gIiIKKyAgICAgICAgZWxzZTogcCA9ICI6IitzZWxmLnBvcnQKKyAgICAgICAgbGltaXQgPSBzZWxmLmRvbWFpbiArIHAgKyBzZWxmLnBhdGgKKyAgICAgICAgaWYgc2VsZi52YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5hbWV2YWx1ZSA9ICIlcz0lcyIgJSAoc2VsZi5uYW1lLCBzZWxmLnZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZXZhbHVlID0gc2VsZi5uYW1lCisgICAgICAgIHJldHVybiAiPENvb2tpZSAlcyBmb3IgJXM+IiAlIChuYW1ldmFsdWUsIGxpbWl0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBhcmdzID0gW10KKyAgICAgICAgZm9yIG5hbWUgaW4gKCJ2ZXJzaW9uIiwgIm5hbWUiLCAidmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCAicG9ydF9zcGVjaWZpZWQiLAorICAgICAgICAgICAgICAgICAgICAgImRvbWFpbiIsICJkb21haW5fc3BlY2lmaWVkIiwgImRvbWFpbl9pbml0aWFsX2RvdCIsCisgICAgICAgICAgICAgICAgICAgICAicGF0aCIsICJwYXRoX3NwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgICAgICAic2VjdXJlIiwgImV4cGlyZXMiLCAiZGlzY2FyZCIsICJjb21tZW50IiwgImNvbW1lbnRfdXJsIiwKKyAgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICBhdHRyID0gZ2V0YXR0cihzZWxmLCBuYW1lKQorICAgICAgICAgICAgYXJncy5hcHBlbmQoIiVzPSVzIiAlIChuYW1lLCByZXByKGF0dHIpKSkKKyAgICAgICAgYXJncy5hcHBlbmQoInJlc3Q9JXMiICUgcmVwcihzZWxmLl9yZXN0KSkKKyAgICAgICAgYXJncy5hcHBlbmQoInJmYzIxMDk9JXMiICUgcmVwcihzZWxmLnJmYzIxMDkpKQorICAgICAgICByZXR1cm4gIkNvb2tpZSglcykiICUgIiwgIi5qb2luKGFyZ3MpCisKKworY2xhc3MgQ29va2llUG9saWN5OgorICAgICIiIkRlZmluZXMgd2hpY2ggY29va2llcyBnZXQgYWNjZXB0ZWQgZnJvbSBhbmQgcmV0dXJuZWQgdG8gc2VydmVyLgorCisgICAgTWF5IGFsc28gbW9kaWZ5IGNvb2tpZXMsIHRob3VnaCB0aGlzIGlzIHByb2JhYmx5IGEgYmFkIGlkZWEuCisKKyAgICBUaGUgc3ViY2xhc3MgRGVmYXVsdENvb2tpZVBvbGljeSBkZWZpbmVzIHRoZSBzdGFuZGFyZCBydWxlcyBmb3IgTmV0c2NhcGUKKyAgICBhbmQgUkZDIDI5NjUgY29va2llcyAtLSBvdmVycmlkZSB0aGF0IGlmIHlvdSB3YW50IGEgY3VzdG9taXNlZCBwb2xpY3kuCisKKyAgICAiIiIKKyAgICBkZWYgc2V0X29rKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIChhbmQgb25seSBpZikgY29va2llIHNob3VsZCBiZSBhY2NlcHRlZCBmcm9tIHNlcnZlci4KKworICAgICAgICBDdXJyZW50bHksIHByZS1leHBpcmVkIGNvb2tpZXMgbmV2ZXIgZ2V0IHRoaXMgZmFyIC0tIHRoZSBDb29raWVKYXIKKyAgICAgICAgY2xhc3MgZGVsZXRlcyBzdWNoIGNvb2tpZXMgaXRzZWxmLgorCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICAgIGRlZiByZXR1cm5fb2soc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgKGFuZCBvbmx5IGlmKSBjb29raWUgc2hvdWxkIGJlIHJldHVybmVkIHRvIHNlcnZlci4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgZG9tYWluX3JldHVybl9vayhzZWxmLCBkb21haW4sIHJlcXVlc3QpOgorICAgICAgICAiIiJSZXR1cm4gZmFsc2UgaWYgY29va2llcyBzaG91bGQgbm90IGJlIHJldHVybmVkLCBnaXZlbiBjb29raWUgZG9tYWluLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBwYXRoX3JldHVybl9vayhzZWxmLCBwYXRoLCByZXF1ZXN0KToKKyAgICAgICAgIiIiUmV0dXJuIGZhbHNlIGlmIGNvb2tpZXMgc2hvdWxkIG5vdCBiZSByZXR1cm5lZCwgZ2l2ZW4gY29va2llIHBhdGguCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIERlZmF1bHRDb29raWVQb2xpY3koQ29va2llUG9saWN5KToKKyAgICAiIiJJbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBydWxlcyBmb3IgYWNjZXB0aW5nIGFuZCByZXR1cm5pbmcgY29va2llcy4iIiIKKworICAgIERvbWFpblN0cmljdE5vRG90cyA9IDEKKyAgICBEb21haW5TdHJpY3ROb25Eb21haW4gPSAyCisgICAgRG9tYWluUkZDMjk2NU1hdGNoID0gNAorCisgICAgRG9tYWluTGliZXJhbCA9IDAKKyAgICBEb21haW5TdHJpY3QgPSBEb21haW5TdHJpY3ROb0RvdHN8RG9tYWluU3RyaWN0Tm9uRG9tYWluCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgYmxvY2tlZF9kb21haW5zPU5vbmUsIGFsbG93ZWRfZG9tYWlucz1Ob25lLAorICAgICAgICAgICAgICAgICBuZXRzY2FwZT1UcnVlLCByZmMyOTY1PUZhbHNlLAorICAgICAgICAgICAgICAgICByZmMyMTA5X2FzX25ldHNjYXBlPU5vbmUsCisgICAgICAgICAgICAgICAgIGhpZGVfY29va2llMj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgc3RyaWN0X2RvbWFpbj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgc3RyaWN0X3JmYzI5NjVfdW52ZXJpZmlhYmxlPVRydWUsCisgICAgICAgICAgICAgICAgIHN0cmljdF9uc191bnZlcmlmaWFibGU9RmFsc2UsCisgICAgICAgICAgICAgICAgIHN0cmljdF9uc19kb21haW49RG9tYWluTGliZXJhbCwKKyAgICAgICAgICAgICAgICAgc3RyaWN0X25zX3NldF9pbml0aWFsX2RvbGxhcj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgc3RyaWN0X25zX3NldF9wYXRoPUZhbHNlLAorICAgICAgICAgICAgICAgICApOgorICAgICAgICAiIiJDb25zdHJ1Y3RvciBhcmd1bWVudHMgc2hvdWxkIGJlIHBhc3NlZCBhcyBrZXl3b3JkIGFyZ3VtZW50cyBvbmx5LiIiIgorICAgICAgICBzZWxmLm5ldHNjYXBlID0gbmV0c2NhcGUKKyAgICAgICAgc2VsZi5yZmMyOTY1ID0gcmZjMjk2NQorICAgICAgICBzZWxmLnJmYzIxMDlfYXNfbmV0c2NhcGUgPSByZmMyMTA5X2FzX25ldHNjYXBlCisgICAgICAgIHNlbGYuaGlkZV9jb29raWUyID0gaGlkZV9jb29raWUyCisgICAgICAgIHNlbGYuc3RyaWN0X2RvbWFpbiA9IHN0cmljdF9kb21haW4KKyAgICAgICAgc2VsZi5zdHJpY3RfcmZjMjk2NV91bnZlcmlmaWFibGUgPSBzdHJpY3RfcmZjMjk2NV91bnZlcmlmaWFibGUKKyAgICAgICAgc2VsZi5zdHJpY3RfbnNfdW52ZXJpZmlhYmxlID0gc3RyaWN0X25zX3VudmVyaWZpYWJsZQorICAgICAgICBzZWxmLnN0cmljdF9uc19kb21haW4gPSBzdHJpY3RfbnNfZG9tYWluCisgICAgICAgIHNlbGYuc3RyaWN0X25zX3NldF9pbml0aWFsX2RvbGxhciA9IHN0cmljdF9uc19zZXRfaW5pdGlhbF9kb2xsYXIKKyAgICAgICAgc2VsZi5zdHJpY3RfbnNfc2V0X3BhdGggPSBzdHJpY3RfbnNfc2V0X3BhdGgKKworICAgICAgICBpZiBibG9ja2VkX2RvbWFpbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9ibG9ja2VkX2RvbWFpbnMgPSB0dXBsZShibG9ja2VkX2RvbWFpbnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9ibG9ja2VkX2RvbWFpbnMgPSAoKQorCisgICAgICAgIGlmIGFsbG93ZWRfZG9tYWlucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFsbG93ZWRfZG9tYWlucyA9IHR1cGxlKGFsbG93ZWRfZG9tYWlucykKKyAgICAgICAgc2VsZi5fYWxsb3dlZF9kb21haW5zID0gYWxsb3dlZF9kb21haW5zCisKKyAgICBkZWYgYmxvY2tlZF9kb21haW5zKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHNlcXVlbmNlIG9mIGJsb2NrZWQgZG9tYWlucyAoYXMgYSB0dXBsZSkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9ibG9ja2VkX2RvbWFpbnMKKyAgICBkZWYgc2V0X2Jsb2NrZWRfZG9tYWlucyhzZWxmLCBibG9ja2VkX2RvbWFpbnMpOgorICAgICAgICAiIiJTZXQgdGhlIHNlcXVlbmNlIG9mIGJsb2NrZWQgZG9tYWlucy4iIiIKKyAgICAgICAgc2VsZi5fYmxvY2tlZF9kb21haW5zID0gdHVwbGUoYmxvY2tlZF9kb21haW5zKQorCisgICAgZGVmIGlzX2Jsb2NrZWQoc2VsZiwgZG9tYWluKToKKyAgICAgICAgZm9yIGJsb2NrZWRfZG9tYWluIGluIHNlbGYuX2Jsb2NrZWRfZG9tYWluczoKKyAgICAgICAgICAgIGlmIHVzZXJfZG9tYWluX21hdGNoKGRvbWFpbiwgYmxvY2tlZF9kb21haW4pOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGFsbG93ZWRfZG9tYWlucyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIE5vbmUsIG9yIHRoZSBzZXF1ZW5jZSBvZiBhbGxvd2VkIGRvbWFpbnMgKGFzIGEgdHVwbGUpLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fYWxsb3dlZF9kb21haW5zCisgICAgZGVmIHNldF9hbGxvd2VkX2RvbWFpbnMoc2VsZiwgYWxsb3dlZF9kb21haW5zKToKKyAgICAgICAgIiIiU2V0IHRoZSBzZXF1ZW5jZSBvZiBhbGxvd2VkIGRvbWFpbnMsIG9yIE5vbmUuIiIiCisgICAgICAgIGlmIGFsbG93ZWRfZG9tYWlucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFsbG93ZWRfZG9tYWlucyA9IHR1cGxlKGFsbG93ZWRfZG9tYWlucykKKyAgICAgICAgc2VsZi5fYWxsb3dlZF9kb21haW5zID0gYWxsb3dlZF9kb21haW5zCisKKyAgICBkZWYgaXNfbm90X2FsbG93ZWQoc2VsZiwgZG9tYWluKToKKyAgICAgICAgaWYgc2VsZi5fYWxsb3dlZF9kb21haW5zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZm9yIGFsbG93ZWRfZG9tYWluIGluIHNlbGYuX2FsbG93ZWRfZG9tYWluczoKKyAgICAgICAgICAgIGlmIHVzZXJfZG9tYWluX21hdGNoKGRvbWFpbiwgYWxsb3dlZF9kb21haW4pOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNldF9vayhzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAiIiIKKyAgICAgICAgSWYgeW91IG92ZXJyaWRlIC5zZXRfb2soKSwgYmUgc3VyZSB0byBjYWxsIHRoaXMgbWV0aG9kLiAgSWYgaXQgcmV0dXJucworICAgICAgICBmYWxzZSwgc28gc2hvdWxkIHlvdXIgc3ViY2xhc3MgKGFzc3VtaW5nIHlvdXIgc3ViY2xhc3Mgd2FudHMgdG8gYmUgbW9yZQorICAgICAgICBzdHJpY3QgYWJvdXQgd2hpY2ggY29va2llcyB0byBhY2NlcHQpLgorCisgICAgICAgICIiIgorICAgICAgICBfZGVidWcoIiAtIGNoZWNraW5nIGNvb2tpZSAlcz0lcyIsIGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUpCisKKyAgICAgICAgYXNzZXJ0IGNvb2tpZS5uYW1lIGlzIG5vdCBOb25lCisKKyAgICAgICAgZm9yIG4gaW4gInZlcnNpb24iLCAidmVyaWZpYWJpbGl0eSIsICJuYW1lIiwgInBhdGgiLCAiZG9tYWluIiwgInBvcnQiOgorICAgICAgICAgICAgZm5fbmFtZSA9ICJzZXRfb2tfIituCisgICAgICAgICAgICBmbiA9IGdldGF0dHIoc2VsZiwgZm5fbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBmbihjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X29rX3ZlcnNpb24oc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgY29va2llLnZlcnNpb24gaXMgTm9uZToKKyAgICAgICAgICAgICMgVmVyc2lvbiBpcyBhbHdheXMgc2V0IHRvIDAgYnkgcGFyc2VfbnNfaGVhZGVycyBpZiBpdCdzIGEgTmV0c2NhcGUKKyAgICAgICAgICAgICMgY29va2llLCBzbyB0aGlzIG11c3QgYmUgYW4gaW52YWxpZCBSRkMgMjk2NSBjb29raWUuCisgICAgICAgICAgICBfZGVidWcoIiAgIFNldC1Db29raWUyIHdpdGhvdXQgdmVyc2lvbiBhdHRyaWJ1dGUgKCVzPSVzKSIsCisgICAgICAgICAgICAgICAgICAgY29va2llLm5hbWUsIGNvb2tpZS52YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBjb29raWUudmVyc2lvbiA+IDAgYW5kIG5vdCBzZWxmLnJmYzI5NjU6CisgICAgICAgICAgICBfZGVidWcoIiAgIFJGQyAyOTY1IGNvb2tpZXMgYXJlIHN3aXRjaGVkIG9mZiIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxpZiBjb29raWUudmVyc2lvbiA9PSAwIGFuZCBub3Qgc2VsZi5uZXRzY2FwZToKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgTmV0c2NhcGUgY29va2llcyBhcmUgc3dpdGNoZWQgb2ZmIikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNldF9va192ZXJpZmlhYmlsaXR5KHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIHJlcXVlc3QuaXNfdW52ZXJpZmlhYmxlKCkgYW5kIGlzX3RoaXJkX3BhcnR5KHJlcXVlc3QpOgorICAgICAgICAgICAgaWYgY29va2llLnZlcnNpb24gPiAwIGFuZCBzZWxmLnN0cmljdF9yZmMyOTY1X3VudmVyaWZpYWJsZToKKyAgICAgICAgICAgICAgICBfZGVidWcoIiAgIHRoaXJkLXBhcnR5IFJGQyAyOTY1IGNvb2tpZSBkdXJpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW52ZXJpZmlhYmxlIHRyYW5zYWN0aW9uIikKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGVsaWYgY29va2llLnZlcnNpb24gPT0gMCBhbmQgc2VsZi5zdHJpY3RfbnNfdW52ZXJpZmlhYmxlOgorICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgdGhpcmQtcGFydHkgTmV0c2NhcGUgY29va2llIGR1cmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnZlcmlmaWFibGUgdHJhbnNhY3Rpb24iKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNldF9va19uYW1lKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICMgVHJ5IGFuZCBzdG9wIHNlcnZlcnMgc2V0dGluZyBWMCBjb29raWVzIGRlc2lnbmVkIHRvIGhhY2sgb3RoZXIKKyAgICAgICAgIyBzZXJ2ZXJzIHRoYXQga25vdyBib3RoIFYwIGFuZCBWMSBwcm90b2NvbHMuCisgICAgICAgIGlmIChjb29raWUudmVyc2lvbiA9PSAwIGFuZCBzZWxmLnN0cmljdF9uc19zZXRfaW5pdGlhbF9kb2xsYXIgYW5kCisgICAgICAgICAgICBjb29raWUubmFtZS5zdGFydHN3aXRoKCIkIikpOgorICAgICAgICAgICAgX2RlYnVnKCIgICBpbGxlZ2FsIG5hbWUgKHN0YXJ0cyB3aXRoICckJyk6ICclcyciLCBjb29raWUubmFtZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNldF9va19wYXRoKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIGNvb2tpZS5wYXRoX3NwZWNpZmllZDoKKyAgICAgICAgICAgIHJlcV9wYXRoID0gcmVxdWVzdF9wYXRoKHJlcXVlc3QpCisgICAgICAgICAgICBpZiAoKGNvb2tpZS52ZXJzaW9uID4gMCBvcgorICAgICAgICAgICAgICAgICAoY29va2llLnZlcnNpb24gPT0gMCBhbmQgc2VsZi5zdHJpY3RfbnNfc2V0X3BhdGgpKSBhbmQKKyAgICAgICAgICAgICAgICBub3QgcmVxX3BhdGguc3RhcnRzd2l0aChjb29raWUucGF0aCkpOgorICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgcGF0aCBhdHRyaWJ1dGUgJXMgaXMgbm90IGEgcHJlZml4IG9mIHJlcXVlc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAicGF0aCAlcyIsIGNvb2tpZS5wYXRoLCByZXFfcGF0aCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZXRfb2tfZG9tYWluKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIHNlbGYuaXNfYmxvY2tlZChjb29raWUuZG9tYWluKToKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgZG9tYWluICVzIGlzIGluIHVzZXIgYmxvY2stbGlzdCIsIGNvb2tpZS5kb21haW4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5pc19ub3RfYWxsb3dlZChjb29raWUuZG9tYWluKToKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgZG9tYWluICVzIGlzIG5vdCBpbiB1c2VyIGFsbG93LWxpc3QiLCBjb29raWUuZG9tYWluKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGNvb2tpZS5kb21haW5fc3BlY2lmaWVkOgorICAgICAgICAgICAgcmVxX2hvc3QsIGVyaG4gPSBlZmZfcmVxdWVzdF9ob3N0KHJlcXVlc3QpCisgICAgICAgICAgICBkb21haW4gPSBjb29raWUuZG9tYWluCisgICAgICAgICAgICBpZiBzZWxmLnN0cmljdF9kb21haW4gYW5kIChkb21haW4uY291bnQoIi4iKSA+PSAyKToKKyAgICAgICAgICAgICAgICAjIFhYWCBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBjb21wYXJlZCB3aXRoIHRoZSBLb25xdWVyb3IKKyAgICAgICAgICAgICAgICAjIChrY29va2llamFyLmNwcCkgYW5kIE1vemlsbGEgaW1wbGVtZW50YXRpb25zLCBidXQgaXQncyBhCisgICAgICAgICAgICAgICAgIyBsb3NpbmcgYmF0dGxlLgorICAgICAgICAgICAgICAgIGkgPSBkb21haW4ucmZpbmQoIi4iKQorICAgICAgICAgICAgICAgIGogPSBkb21haW4ucmZpbmQoIi4iLCAwLCBpKQorICAgICAgICAgICAgICAgIGlmIGogPT0gMDogICMgZG9tYWluIGxpa2UgLmZvby5iYXIKKyAgICAgICAgICAgICAgICAgICAgdGxkID0gZG9tYWluW2krMTpdCisgICAgICAgICAgICAgICAgICAgIHNsZCA9IGRvbWFpbltqKzE6aV0KKyAgICAgICAgICAgICAgICAgICAgaWYgc2xkLmxvd2VyKCkgaW4gKCJjbyIsICJhYyIsICJjb20iLCAiZWR1IiwgIm9yZyIsICJuZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAiZ292IiwgIm1pbCIsICJpbnQiLCAiYWVybyIsICJiaXoiLCAiY2F0IiwgImNvb3AiLAorICAgICAgICAgICAgICAgICAgICAgICAiaW5mbyIsICJqb2JzIiwgIm1vYmkiLCAibXVzZXVtIiwgIm5hbWUiLCAicHJvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgInRyYXZlbCIsICJldSIpIGFuZCBsZW4odGxkKSA9PSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBkb21haW4gbGlrZSAuY28udWsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgY291bnRyeS1jb2RlIHNlY29uZCBsZXZlbCBkb21haW4gJXMiLCBkb21haW4pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIGRvbWFpbi5zdGFydHN3aXRoKCIuIik6CisgICAgICAgICAgICAgICAgdW5kb3R0ZWRfZG9tYWluID0gZG9tYWluWzE6XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB1bmRvdHRlZF9kb21haW4gPSBkb21haW4KKyAgICAgICAgICAgIGVtYmVkZGVkX2RvdHMgPSAodW5kb3R0ZWRfZG9tYWluLmZpbmQoIi4iKSA+PSAwKQorICAgICAgICAgICAgaWYgbm90IGVtYmVkZGVkX2RvdHMgYW5kIGRvbWFpbiAhPSAiLmxvY2FsIjoKKyAgICAgICAgICAgICAgICBfZGVidWcoIiAgIG5vbi1sb2NhbCBkb21haW4gJXMgY29udGFpbnMgbm8gZW1iZWRkZWQgZG90IiwKKyAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgY29va2llLnZlcnNpb24gPT0gMDoKKyAgICAgICAgICAgICAgICBpZiAobm90IGVyaG4uZW5kc3dpdGgoZG9tYWluKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgKG5vdCBlcmhuLnN0YXJ0c3dpdGgoIi4iKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgIG5vdCAoIi4iK2VyaG4pLmVuZHN3aXRoKGRvbWFpbikpKToKKyAgICAgICAgICAgICAgICAgICAgX2RlYnVnKCIgICBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0ICVzIChldmVuIHdpdGggYWRkZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImluaXRpYWwgZG90KSBkb2VzIG5vdCBlbmQgd2l0aCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmhuLCBkb21haW4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgKGNvb2tpZS52ZXJzaW9uID4gMCBvcgorICAgICAgICAgICAgICAgIChzZWxmLnN0cmljdF9uc19kb21haW4gJiBzZWxmLkRvbWFpblJGQzI5NjVNYXRjaCkpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBkb21haW5fbWF0Y2goZXJobiwgZG9tYWluKToKKyAgICAgICAgICAgICAgICAgICAgX2RlYnVnKCIgICBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0ICVzIGRvZXMgbm90IGRvbWFpbi1tYXRjaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMiLCBlcmhuLCBkb21haW4pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgKGNvb2tpZS52ZXJzaW9uID4gMCBvcgorICAgICAgICAgICAgICAgIChzZWxmLnN0cmljdF9uc19kb21haW4gJiBzZWxmLkRvbWFpblN0cmljdE5vRG90cykpOgorICAgICAgICAgICAgICAgIGhvc3RfcHJlZml4ID0gcmVxX2hvc3RbOi1sZW4oZG9tYWluKV0KKyAgICAgICAgICAgICAgICBpZiAoaG9zdF9wcmVmaXguZmluZCgiLiIpID49IDAgYW5kCisgICAgICAgICAgICAgICAgICAgIG5vdCBJUFY0X1JFLnNlYXJjaChyZXFfaG9zdCkpOgorICAgICAgICAgICAgICAgICAgICBfZGVidWcoIiAgIGhvc3QgcHJlZml4ICVzIGZvciBkb21haW4gJXMgY29udGFpbnMgYSBkb3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9wcmVmaXgsIGRvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X29rX3BvcnQoc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgY29va2llLnBvcnRfc3BlY2lmaWVkOgorICAgICAgICAgICAgcmVxX3BvcnQgPSByZXF1ZXN0X3BvcnQocmVxdWVzdCkKKyAgICAgICAgICAgIGlmIHJlcV9wb3J0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmVxX3BvcnQgPSAiODAiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlcV9wb3J0ID0gc3RyKHJlcV9wb3J0KQorICAgICAgICAgICAgZm9yIHAgaW4gY29va2llLnBvcnQuc3BsaXQoIiwiKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGludChwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBfZGVidWcoIiAgIGJhZCBwb3J0ICVzIChub3QgbnVtZXJpYykiLCBwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiBwID09IHJlcV9wb3J0OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBfZGVidWcoIiAgIHJlcXVlc3QgcG9ydCAoJXMpIG5vdCBmb3VuZCBpbiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIHJlcV9wb3J0LCBjb29raWUucG9ydCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZXR1cm5fb2soc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgIiIiCisgICAgICAgIElmIHlvdSBvdmVycmlkZSAucmV0dXJuX29rKCksIGJlIHN1cmUgdG8gY2FsbCB0aGlzIG1ldGhvZC4gIElmIGl0CisgICAgICAgIHJldHVybnMgZmFsc2UsIHNvIHNob3VsZCB5b3VyIHN1YmNsYXNzIChhc3N1bWluZyB5b3VyIHN1YmNsYXNzIHdhbnRzIHRvCisgICAgICAgIGJlIG1vcmUgc3RyaWN0IGFib3V0IHdoaWNoIGNvb2tpZXMgdG8gcmV0dXJuKS4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBQYXRoIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBieSAucGF0aF9yZXR1cm5fb2soKSwgYW5kIGRvbWFpbgorICAgICAgICAjIGJsb2NraW5nIGRvbmUgYnkgLmRvbWFpbl9yZXR1cm5fb2soKS4KKyAgICAgICAgX2RlYnVnKCIgLSBjaGVja2luZyBjb29raWUgJXM9JXMiLCBjb29raWUubmFtZSwgY29va2llLnZhbHVlKQorCisgICAgICAgIGZvciBuIGluICJ2ZXJzaW9uIiwgInZlcmlmaWFiaWxpdHkiLCAic2VjdXJlIiwgImV4cGlyZXMiLCAicG9ydCIsICJkb21haW4iOgorICAgICAgICAgICAgZm5fbmFtZSA9ICJyZXR1cm5fb2tfIituCisgICAgICAgICAgICBmbiA9IGdldGF0dHIoc2VsZiwgZm5fbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBmbihjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJldHVybl9va192ZXJzaW9uKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uID4gMCBhbmQgbm90IHNlbGYucmZjMjk2NToKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgUkZDIDI5NjUgY29va2llcyBhcmUgc3dpdGNoZWQgb2ZmIikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbGlmIGNvb2tpZS52ZXJzaW9uID09IDAgYW5kIG5vdCBzZWxmLm5ldHNjYXBlOgorICAgICAgICAgICAgX2RlYnVnKCIgICBOZXRzY2FwZSBjb29raWVzIGFyZSBzd2l0Y2hlZCBvZmYiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmV0dXJuX29rX3ZlcmlmaWFiaWxpdHkoc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgcmVxdWVzdC5pc191bnZlcmlmaWFibGUoKSBhbmQgaXNfdGhpcmRfcGFydHkocmVxdWVzdCk6CisgICAgICAgICAgICBpZiBjb29raWUudmVyc2lvbiA+IDAgYW5kIHNlbGYuc3RyaWN0X3JmYzI5NjVfdW52ZXJpZmlhYmxlOgorICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgdGhpcmQtcGFydHkgUkZDIDI5NjUgY29va2llIGR1cmluZyB1bnZlcmlmaWFibGUgIgorICAgICAgICAgICAgICAgICAgICAgICAidHJhbnNhY3Rpb24iKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZWxpZiBjb29raWUudmVyc2lvbiA9PSAwIGFuZCBzZWxmLnN0cmljdF9uc191bnZlcmlmaWFibGU6CisgICAgICAgICAgICAgICAgX2RlYnVnKCIgICB0aGlyZC1wYXJ0eSBOZXRzY2FwZSBjb29raWUgZHVyaW5nIHVudmVyaWZpYWJsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2FjdGlvbiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmV0dXJuX29rX3NlY3VyZShzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICBpZiBjb29raWUuc2VjdXJlIGFuZCByZXF1ZXN0LmdldF90eXBlKCkgIT0gImh0dHBzIjoKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgc2VjdXJlIGNvb2tpZSB3aXRoIG5vbi1zZWN1cmUgcmVxdWVzdCIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZXR1cm5fb2tfZXhwaXJlcyhzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICBpZiBjb29raWUuaXNfZXhwaXJlZChzZWxmLl9ub3cpOgorICAgICAgICAgICAgX2RlYnVnKCIgICBjb29raWUgZXhwaXJlZCIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZXR1cm5fb2tfcG9ydChzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICBpZiBjb29raWUucG9ydDoKKyAgICAgICAgICAgIHJlcV9wb3J0ID0gcmVxdWVzdF9wb3J0KHJlcXVlc3QpCisgICAgICAgICAgICBpZiByZXFfcG9ydCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJlcV9wb3J0ID0gIjgwIgorICAgICAgICAgICAgZm9yIHAgaW4gY29va2llLnBvcnQuc3BsaXQoIiwiKToKKyAgICAgICAgICAgICAgICBpZiBwID09IHJlcV9wb3J0OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBfZGVidWcoIiAgIHJlcXVlc3QgcG9ydCAlcyBkb2VzIG5vdCBtYXRjaCBjb29raWUgcG9ydCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIHJlcV9wb3J0LCBjb29raWUucG9ydCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZXR1cm5fb2tfZG9tYWluKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIHJlcV9ob3N0LCBlcmhuID0gZWZmX3JlcXVlc3RfaG9zdChyZXF1ZXN0KQorICAgICAgICBkb21haW4gPSBjb29raWUuZG9tYWluCisKKyAgICAgICAgIyBzdHJpY3QgY2hlY2sgb2Ygbm9uLWRvbWFpbiBjb29raWVzOiBNb3ppbGxhIGRvZXMgdGhpcywgTVNJRTUgZG9lc24ndAorICAgICAgICBpZiAoY29va2llLnZlcnNpb24gPT0gMCBhbmQKKyAgICAgICAgICAgIChzZWxmLnN0cmljdF9uc19kb21haW4gJiBzZWxmLkRvbWFpblN0cmljdE5vbkRvbWFpbikgYW5kCisgICAgICAgICAgICBub3QgY29va2llLmRvbWFpbl9zcGVjaWZpZWQgYW5kIGRvbWFpbiAhPSBlcmhuKToKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgY29va2llIHdpdGggdW5zcGVjaWZpZWQgZG9tYWluIGRvZXMgbm90IHN0cmluZy1jb21wYXJlICIKKyAgICAgICAgICAgICAgICAgICAiZXF1YWwgdG8gcmVxdWVzdCBkb21haW4iKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaWYgY29va2llLnZlcnNpb24gPiAwIGFuZCBub3QgZG9tYWluX21hdGNoKGVyaG4sIGRvbWFpbik6CisgICAgICAgICAgICBfZGVidWcoIiAgIGVmZmVjdGl2ZSByZXF1ZXN0LWhvc3QgbmFtZSAlcyBkb2VzIG5vdCBkb21haW4tbWF0Y2ggIgorICAgICAgICAgICAgICAgICAgICJSRkMgMjk2NSBjb29raWUgZG9tYWluICVzIiwgZXJobiwgZG9tYWluKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uID09IDAgYW5kIG5vdCAoIi4iK2VyaG4pLmVuZHN3aXRoKGRvbWFpbik6CisgICAgICAgICAgICBfZGVidWcoIiAgIHJlcXVlc3QtaG9zdCAlcyBkb2VzIG5vdCBtYXRjaCBOZXRzY2FwZSBjb29raWUgZG9tYWluICIKKyAgICAgICAgICAgICAgICAgICAiJXMiLCByZXFfaG9zdCwgZG9tYWluKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgZG9tYWluX3JldHVybl9vayhzZWxmLCBkb21haW4sIHJlcXVlc3QpOgorICAgICAgICAjIExpYmVyYWwgY2hlY2sgb2YuICBUaGlzIGlzIGhlcmUgYXMgYW4gb3B0aW1pemF0aW9uIHRvIGF2b2lkCisgICAgICAgICMgaGF2aW5nIHRvIGxvYWQgbG90cyBvZiBNU0lFIGNvb2tpZSBmaWxlcyB1bmxlc3MgbmVjZXNzYXJ5LgorICAgICAgICByZXFfaG9zdCwgZXJobiA9IGVmZl9yZXF1ZXN0X2hvc3QocmVxdWVzdCkKKyAgICAgICAgaWYgbm90IHJlcV9ob3N0LnN0YXJ0c3dpdGgoIi4iKToKKyAgICAgICAgICAgIHJlcV9ob3N0ID0gIi4iK3JlcV9ob3N0CisgICAgICAgIGlmIG5vdCBlcmhuLnN0YXJ0c3dpdGgoIi4iKToKKyAgICAgICAgICAgIGVyaG4gPSAiLiIrZXJobgorICAgICAgICBpZiBub3QgKHJlcV9ob3N0LmVuZHN3aXRoKGRvbWFpbikgb3IgZXJobi5lbmRzd2l0aChkb21haW4pKToKKyAgICAgICAgICAgICNfZGVidWcoIiAgIHJlcXVlc3QgZG9tYWluICVzIGRvZXMgbm90IG1hdGNoIGNvb2tpZSBkb21haW4gJXMiLAorICAgICAgICAgICAgIyAgICAgICByZXFfaG9zdCwgZG9tYWluKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaWYgc2VsZi5pc19ibG9ja2VkKGRvbWFpbik6CisgICAgICAgICAgICBfZGVidWcoIiAgIGRvbWFpbiAlcyBpcyBpbiB1c2VyIGJsb2NrLWxpc3QiLCBkb21haW4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5pc19ub3RfYWxsb3dlZChkb21haW4pOgorICAgICAgICAgICAgX2RlYnVnKCIgICBkb21haW4gJXMgaXMgbm90IGluIHVzZXIgYWxsb3ctbGlzdCIsIGRvbWFpbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcGF0aF9yZXR1cm5fb2soc2VsZiwgcGF0aCwgcmVxdWVzdCk6CisgICAgICAgIF9kZWJ1ZygiLSBjaGVja2luZyBjb29raWUgcGF0aD0lcyIsIHBhdGgpCisgICAgICAgIHJlcV9wYXRoID0gcmVxdWVzdF9wYXRoKHJlcXVlc3QpCisgICAgICAgIGlmIG5vdCByZXFfcGF0aC5zdGFydHN3aXRoKHBhdGgpOgorICAgICAgICAgICAgX2RlYnVnKCIgICVzIGRvZXMgbm90IHBhdGgtbWF0Y2ggJXMiLCByZXFfcGF0aCwgcGF0aCkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2RlZiB2YWxzX3NvcnRlZF9ieV9rZXkoYWRpY3QpOgorICAgIGtleXMgPSBhZGljdC5rZXlzKCkKKyAgICBrZXlzLnNvcnQoKQorICAgIHJldHVybiBtYXAoYWRpY3QuZ2V0LCBrZXlzKQorCitkZWYgZGVlcHZhbHVlcyhtYXBwaW5nKToKKyAgICAiIiJJdGVyYXRlcyBvdmVyIG5lc3RlZCBtYXBwaW5nLCBkZXB0aC1maXJzdCwgaW4gc29ydGVkIG9yZGVyIGJ5IGtleS4iIiIKKyAgICB2YWx1ZXMgPSB2YWxzX3NvcnRlZF9ieV9rZXkobWFwcGluZykKKyAgICBmb3Igb2JqIGluIHZhbHVlczoKKyAgICAgICAgbWFwcGluZyA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9iai5pdGVtcworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtYXBwaW5nID0gVHJ1ZQorICAgICAgICAgICAgZm9yIHN1Ym9iaiBpbiBkZWVwdmFsdWVzKG9iaik6CisgICAgICAgICAgICAgICAgeWllbGQgc3Vib2JqCisgICAgICAgIGlmIG5vdCBtYXBwaW5nOgorICAgICAgICAgICAgeWllbGQgb2JqCisKKworIyBVc2VkIGFzIHNlY29uZCBwYXJhbWV0ZXIgdG8gZGljdC5nZXQoKSBtZXRob2QsIHRvIGRpc3Rpbmd1aXNoIGFic2VudAorIyBkaWN0IGtleSBmcm9tIG9uZSB3aXRoIGEgTm9uZSB2YWx1ZS4KK2NsYXNzIEFic2VudDogcGFzcworCitjbGFzcyBDb29raWVKYXI6CisgICAgIiIiQ29sbGVjdGlvbiBvZiBIVFRQIGNvb2tpZXMuCisKKyAgICBZb3UgbWF5IG5vdCBuZWVkIHRvIGtub3cgYWJvdXQgdGhpcyBjbGFzczogdHJ5CisgICAgdXJsbGliMi5idWlsZF9vcGVuZXIoSFRUUENvb2tpZVByb2Nlc3Nvcikub3Blbih1cmwpLgorCisgICAgIiIiCisKKyAgICBub25fd29yZF9yZSA9IHJlLmNvbXBpbGUociJcVyIpCisgICAgcXVvdGVfcmUgPSByZS5jb21waWxlKHIiKFtcIlxcXSkiKQorICAgIHN0cmljdF9kb21haW5fcmUgPSByZS5jb21waWxlKHIiXC4/W14uXSoiKQorICAgIGRvbWFpbl9yZSA9IHJlLmNvbXBpbGUociJbXi5dKiIpCisgICAgZG90c19yZSA9IHJlLmNvbXBpbGUociJeXC4rIikKKworICAgIG1hZ2ljX3JlID0gciJeXCNMV1AtQ29va2llcy0oXGQrXC5cZCspIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvbGljeT1Ob25lKToKKyAgICAgICAgaWYgcG9saWN5IGlzIE5vbmU6CisgICAgICAgICAgICBwb2xpY3kgPSBEZWZhdWx0Q29va2llUG9saWN5KCkKKyAgICAgICAgc2VsZi5fcG9saWN5ID0gcG9saWN5CisKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrID0gX3RocmVhZGluZy5STG9jaygpCisgICAgICAgIHNlbGYuX2Nvb2tpZXMgPSB7fQorCisgICAgZGVmIHNldF9wb2xpY3koc2VsZiwgcG9saWN5KToKKyAgICAgICAgc2VsZi5fcG9saWN5ID0gcG9saWN5CisKKyAgICBkZWYgX2Nvb2tpZXNfZm9yX2RvbWFpbihzZWxmLCBkb21haW4sIHJlcXVlc3QpOgorICAgICAgICBjb29raWVzID0gW10KKyAgICAgICAgaWYgbm90IHNlbGYuX3BvbGljeS5kb21haW5fcmV0dXJuX29rKGRvbWFpbiwgcmVxdWVzdCk6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgX2RlYnVnKCJDaGVja2luZyAlcyBmb3IgY29va2llcyB0byByZXR1cm4iLCBkb21haW4pCisgICAgICAgIGNvb2tpZXNfYnlfcGF0aCA9IHNlbGYuX2Nvb2tpZXNbZG9tYWluXQorICAgICAgICBmb3IgcGF0aCBpbiBjb29raWVzX2J5X3BhdGgua2V5cygpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3BvbGljeS5wYXRoX3JldHVybl9vayhwYXRoLCByZXF1ZXN0KToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgY29va2llc19ieV9uYW1lID0gY29va2llc19ieV9wYXRoW3BhdGhdCisgICAgICAgICAgICBmb3IgY29va2llIGluIGNvb2tpZXNfYnlfbmFtZS52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fcG9saWN5LnJldHVybl9vayhjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAgICAgICAgICAgICBfZGVidWcoIiAgIG5vdCByZXR1cm5pbmcgY29va2llIikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBfZGVidWcoIiAgIGl0J3MgYSBtYXRjaCIpCisgICAgICAgICAgICAgICAgY29va2llcy5hcHBlbmQoY29va2llKQorICAgICAgICByZXR1cm4gY29va2llcworCisgICAgZGVmIF9jb29raWVzX2Zvcl9yZXF1ZXN0KHNlbGYsIHJlcXVlc3QpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGNvb2tpZXMgdG8gYmUgcmV0dXJuZWQgdG8gc2VydmVyLiIiIgorICAgICAgICBjb29raWVzID0gW10KKyAgICAgICAgZm9yIGRvbWFpbiBpbiBzZWxmLl9jb29raWVzLmtleXMoKToKKyAgICAgICAgICAgIGNvb2tpZXMuZXh0ZW5kKHNlbGYuX2Nvb2tpZXNfZm9yX2RvbWFpbihkb21haW4sIHJlcXVlc3QpKQorICAgICAgICByZXR1cm4gY29va2llcworCisgICAgZGVmIF9jb29raWVfYXR0cnMoc2VsZiwgY29va2llcyk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgY29va2llLWF0dHJpYnV0ZXMgdG8gYmUgcmV0dXJuZWQgdG8gc2VydmVyLgorCisgICAgICAgIGxpa2UgWydmb289ImJhciI7ICRQYXRoPSIvIicsIC4uLl0KKworICAgICAgICBUaGUgJFZlcnNpb24gYXR0cmlidXRlIGlzIGFsc28gYWRkZWQgd2hlbiBhcHByb3ByaWF0ZSAoY3VycmVudGx5IG9ubHkKKyAgICAgICAgb25jZSBwZXIgcmVxdWVzdCkuCisKKyAgICAgICAgIiIiCisgICAgICAgICMgYWRkIGNvb2tpZXMgaW4gb3JkZXIgb2YgbW9zdCBzcGVjaWZpYyAoaWUuIGxvbmdlc3QpIHBhdGggZmlyc3QKKyAgICAgICAgY29va2llcy5zb3J0KGtleT1sYW1iZGEgYXJnOiBsZW4oYXJnLnBhdGgpLCByZXZlcnNlPVRydWUpCisKKyAgICAgICAgdmVyc2lvbl9zZXQgPSBGYWxzZQorCisgICAgICAgIGF0dHJzID0gW10KKyAgICAgICAgZm9yIGNvb2tpZSBpbiBjb29raWVzOgorICAgICAgICAgICAgIyBzZXQgdmVyc2lvbiBvZiBDb29raWUgaGVhZGVyCisgICAgICAgICAgICAjIFhYWAorICAgICAgICAgICAgIyBXaGF0IHNob3VsZCBpdCBiZSBpZiBtdWx0aXBsZSBtYXRjaGluZyBTZXQtQ29va2llIGhlYWRlcnMgaGF2ZQorICAgICAgICAgICAgIyAgZGlmZmVyZW50IHZlcnNpb25zIHRoZW1zZWx2ZXM/CisgICAgICAgICAgICAjIEFuc3dlcjogdGhlcmUgaXMgbm8gYW5zd2VyOyB3YXMgc3VwcG9zZWQgdG8gYmUgc2V0dGxlZCBieQorICAgICAgICAgICAgIyAgUkZDIDI5NjUgZXJyYXRhLCBidXQgdGhhdCBtYXkgbmV2ZXIgYXBwZWFyLi4uCisgICAgICAgICAgICB2ZXJzaW9uID0gY29va2llLnZlcnNpb24KKyAgICAgICAgICAgIGlmIG5vdCB2ZXJzaW9uX3NldDoKKyAgICAgICAgICAgICAgICB2ZXJzaW9uX3NldCA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiB2ZXJzaW9uID4gMDoKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMuYXBwZW5kKCIkVmVyc2lvbj0lcyIgJSB2ZXJzaW9uKQorCisgICAgICAgICAgICAjIHF1b3RlIGNvb2tpZSB2YWx1ZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICMgKG5vdCBmb3IgTmV0c2NhcGUgcHJvdG9jb2wsIHdoaWNoIGFscmVhZHkgaGFzIGFueSBxdW90ZXMKKyAgICAgICAgICAgICMgIGludGFjdCwgZHVlIHRvIHRoZSBwb29ybHktc3BlY2lmaWVkIE5ldHNjYXBlIENvb2tpZTogc3ludGF4KQorICAgICAgICAgICAgaWYgKChjb29raWUudmFsdWUgaXMgbm90IE5vbmUpIGFuZAorICAgICAgICAgICAgICAgIHNlbGYubm9uX3dvcmRfcmUuc2VhcmNoKGNvb2tpZS52YWx1ZSkgYW5kIHZlcnNpb24gPiAwKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYucXVvdGVfcmUuc3ViKHIiXFxcMSIsIGNvb2tpZS52YWx1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBjb29raWUudmFsdWUKKworICAgICAgICAgICAgIyBhZGQgY29va2llLWF0dHJpYnV0ZXMgdG8gYmUgcmV0dXJuZWQgaW4gQ29va2llIGhlYWRlcgorICAgICAgICAgICAgaWYgY29va2llLnZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYXR0cnMuYXBwZW5kKGNvb2tpZS5uYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhdHRycy5hcHBlbmQoIiVzPSVzIiAlIChjb29raWUubmFtZSwgdmFsdWUpKQorICAgICAgICAgICAgaWYgdmVyc2lvbiA+IDA6CisgICAgICAgICAgICAgICAgaWYgY29va2llLnBhdGhfc3BlY2lmaWVkOgorICAgICAgICAgICAgICAgICAgICBhdHRycy5hcHBlbmQoJyRQYXRoPSIlcyInICUgY29va2llLnBhdGgpCisgICAgICAgICAgICAgICAgaWYgY29va2llLmRvbWFpbi5zdGFydHN3aXRoKCIuIik6CisgICAgICAgICAgICAgICAgICAgIGRvbWFpbiA9IGNvb2tpZS5kb21haW4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vdCBjb29raWUuZG9tYWluX2luaXRpYWxfZG90IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluLnN0YXJ0c3dpdGgoIi4iKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4gPSBkb21haW5bMTpdCisgICAgICAgICAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgnJERvbWFpbj0iJXMiJyAlIGRvbWFpbikKKyAgICAgICAgICAgICAgICBpZiBjb29raWUucG9ydCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcCA9ICIkUG9ydCIKKyAgICAgICAgICAgICAgICAgICAgaWYgY29va2llLnBvcnRfc3BlY2lmaWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHAgKyAoJz0iJXMiJyAlIGNvb2tpZS5wb3J0KQorICAgICAgICAgICAgICAgICAgICBhdHRycy5hcHBlbmQocCkKKworICAgICAgICByZXR1cm4gYXR0cnMKKworICAgIGRlZiBhZGRfY29va2llX2hlYWRlcihzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgIiIiQWRkIGNvcnJlY3QgQ29va2llOiBoZWFkZXIgdG8gcmVxdWVzdCAodXJsbGliMi5SZXF1ZXN0IG9iamVjdCkuCisKKyAgICAgICAgVGhlIENvb2tpZTIgaGVhZGVyIGlzIGFsc28gYWRkZWQgdW5sZXNzIHBvbGljeS5oaWRlX2Nvb2tpZTIgaXMgdHJ1ZS4KKworICAgICAgICAiIiIKKyAgICAgICAgX2RlYnVnKCJhZGRfY29va2llX2hlYWRlciIpCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorCisgICAgICAgICAgICBzZWxmLl9wb2xpY3kuX25vdyA9IHNlbGYuX25vdyA9IGludCh0aW1lLnRpbWUoKSkKKworICAgICAgICAgICAgY29va2llcyA9IHNlbGYuX2Nvb2tpZXNfZm9yX3JlcXVlc3QocmVxdWVzdCkKKworICAgICAgICAgICAgYXR0cnMgPSBzZWxmLl9jb29raWVfYXR0cnMoY29va2llcykKKyAgICAgICAgICAgIGlmIGF0dHJzOgorICAgICAgICAgICAgICAgIGlmIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoIkNvb2tpZSIpOgorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvb2tpZSIsICI7ICIuam9pbihhdHRycykpCisKKyAgICAgICAgICAgICMgaWYgbmVjZXNzYXJ5LCBhZHZlcnRpc2UgdGhhdCB3ZSBrbm93IFJGQyAyOTY1CisgICAgICAgICAgICBpZiAoc2VsZi5fcG9saWN5LnJmYzI5NjUgYW5kIG5vdCBzZWxmLl9wb2xpY3kuaGlkZV9jb29raWUyIGFuZAorICAgICAgICAgICAgICAgIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoIkNvb2tpZTIiKSk6CisgICAgICAgICAgICAgICAgZm9yIGNvb2tpZSBpbiBjb29raWVzOgorICAgICAgICAgICAgICAgICAgICBpZiBjb29raWUudmVyc2lvbiAhPSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigiQ29va2llMiIsICckVmVyc2lvbj0iMSInKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQorCisgICAgICAgIHNlbGYuY2xlYXJfZXhwaXJlZF9jb29raWVzKCkKKworICAgIGRlZiBfbm9ybWFsaXplZF9jb29raWVfdHVwbGVzKHNlbGYsIGF0dHJzX3NldCk6CisgICAgICAgICIiIlJldHVybiBsaXN0IG9mIHR1cGxlcyBjb250YWluaW5nIG5vcm1hbGlzZWQgY29va2llIGluZm9ybWF0aW9uLgorCisgICAgICAgIGF0dHJzX3NldCBpcyB0aGUgbGlzdCBvZiBsaXN0cyBvZiBrZXksdmFsdWUgcGFpcnMgZXh0cmFjdGVkIGZyb20KKyAgICAgICAgdGhlIFNldC1Db29raWUgb3IgU2V0LUNvb2tpZTIgaGVhZGVycy4KKworICAgICAgICBUdXBsZXMgYXJlIG5hbWUsIHZhbHVlLCBzdGFuZGFyZCwgcmVzdCwgd2hlcmUgbmFtZSBhbmQgdmFsdWUgYXJlIHRoZQorICAgICAgICBjb29raWUgbmFtZSBhbmQgdmFsdWUsIHN0YW5kYXJkIGlzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBzdGFuZGFyZAorICAgICAgICBjb29raWUtYXR0cmlidXRlcyAoZGlzY2FyZCwgc2VjdXJlLCB2ZXJzaW9uLCBleHBpcmVzIG9yIG1heC1hZ2UsCisgICAgICAgIGRvbWFpbiwgcGF0aCBhbmQgcG9ydCkgYW5kIHJlc3QgaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIHJlc3Qgb2YKKyAgICAgICAgdGhlIGNvb2tpZS1hdHRyaWJ1dGVzLgorCisgICAgICAgICIiIgorICAgICAgICBjb29raWVfdHVwbGVzID0gW10KKworICAgICAgICBib29sZWFuX2F0dHJzID0gImRpc2NhcmQiLCAic2VjdXJlIgorICAgICAgICB2YWx1ZV9hdHRycyA9ICgidmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICJleHBpcmVzIiwgIm1heC1hZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAiZG9tYWluIiwgInBhdGgiLCAicG9ydCIsCisgICAgICAgICAgICAgICAgICAgICAgICJjb21tZW50IiwgImNvbW1lbnR1cmwiKQorCisgICAgICAgIGZvciBjb29raWVfYXR0cnMgaW4gYXR0cnNfc2V0OgorICAgICAgICAgICAgbmFtZSwgdmFsdWUgPSBjb29raWVfYXR0cnNbMF0KKworICAgICAgICAgICAgIyBCdWlsZCBkaWN0aW9uYXJ5IG9mIHN0YW5kYXJkIGNvb2tpZS1hdHRyaWJ1dGVzIChzdGFuZGFyZCkgYW5kCisgICAgICAgICAgICAjIGRpY3Rpb25hcnkgb2Ygb3RoZXIgY29va2llLWF0dHJpYnV0ZXMgKHJlc3QpLgorCisgICAgICAgICAgICAjIE5vdGU6IGV4cGlyeSB0aW1lIGlzIG5vcm1hbGlzZWQgdG8gc2Vjb25kcyBzaW5jZSBlcG9jaC4gIFYwCisgICAgICAgICAgICAjIGNvb2tpZXMgc2hvdWxkIGhhdmUgdGhlIEV4cGlyZXMgY29va2llLWF0dHJpYnV0ZSwgYW5kIFYxIGNvb2tpZXMKKyAgICAgICAgICAgICMgc2hvdWxkIGhhdmUgTWF4LUFnZSwgYnV0IHNpbmNlIFYxIGluY2x1ZGVzIFJGQyAyMTA5IGNvb2tpZXMgKGFuZAorICAgICAgICAgICAgIyBzaW5jZSBWMCBjb29raWVzIG1heSBiZSBhIG1pc2gtbWFzaCBvZiBOZXRzY2FwZSBhbmQgUkZDIDIxMDkpLCB3ZQorICAgICAgICAgICAgIyBhY2NlcHQgZWl0aGVyIChidXQgcHJlZmVyIE1heC1BZ2UpLgorICAgICAgICAgICAgbWF4X2FnZV9zZXQgPSBGYWxzZQorCisgICAgICAgICAgICBiYWRfY29va2llID0gRmFsc2UKKworICAgICAgICAgICAgc3RhbmRhcmQgPSB7fQorICAgICAgICAgICAgcmVzdCA9IHt9CisgICAgICAgICAgICBmb3IgaywgdiBpbiBjb29raWVfYXR0cnNbMTpdOgorICAgICAgICAgICAgICAgIGxjID0gay5sb3dlcigpCisgICAgICAgICAgICAgICAgIyBkb24ndCBsb3NlIGNhc2UgZGlzdGluY3Rpb24gZm9yIHVua25vd24gZmllbGRzCisgICAgICAgICAgICAgICAgaWYgbGMgaW4gdmFsdWVfYXR0cnMgb3IgbGMgaW4gYm9vbGVhbl9hdHRyczoKKyAgICAgICAgICAgICAgICAgICAgayA9IGxjCisgICAgICAgICAgICAgICAgaWYgayBpbiBib29sZWFuX2F0dHJzIGFuZCB2IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICMgYm9vbGVhbiBjb29raWUtYXR0cmlidXRlIGlzIHByZXNlbnQsIGJ1dCBoYXMgbm8gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgIyAobGlrZSAiZGlzY2FyZCIsIHJhdGhlciB0aGFuICJwb3J0PTgwIikKKyAgICAgICAgICAgICAgICAgICAgdiA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBrIGluIHN0YW5kYXJkOgorICAgICAgICAgICAgICAgICAgICAjIG9ubHkgZmlyc3QgdmFsdWUgaXMgc2lnbmlmaWNhbnQKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBrID09ICJkb21haW4iOgorICAgICAgICAgICAgICAgICAgICBpZiB2IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBfZGVidWcoIiAgIG1pc3NpbmcgdmFsdWUgZm9yIGRvbWFpbiBhdHRyaWJ1dGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgYmFkX2Nvb2tpZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICMgUkZDIDI5NjUgc2VjdGlvbiAzLjMuMworICAgICAgICAgICAgICAgICAgICB2ID0gdi5sb3dlcigpCisgICAgICAgICAgICAgICAgaWYgayA9PSAiZXhwaXJlcyI6CisgICAgICAgICAgICAgICAgICAgIGlmIG1heF9hZ2Vfc2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgIyBQcmVmZXIgbWF4LWFnZSB0byBleHBpcmVzIChsaWtlIE1vemlsbGEpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiB2IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBfZGVidWcoIiAgIG1pc3Npbmcgb3IgaW52YWxpZCB2YWx1ZSBmb3IgZXhwaXJlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXR0cmlidXRlOiB0cmVhdGluZyBhcyBzZXNzaW9uIGNvb2tpZSIpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGsgPT0gIm1heC1hZ2UiOgorICAgICAgICAgICAgICAgICAgICBtYXhfYWdlX3NldCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGludCh2KQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgbWlzc2luZyBvciBpbnZhbGlkIChub24tbnVtZXJpYykgdmFsdWUgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXgtYWdlIGF0dHJpYnV0ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICBiYWRfY29va2llID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IFJGQyAyOTY1IE1heC1BZ2UgdG8gc2Vjb25kcyBzaW5jZSBlcG9jaAorICAgICAgICAgICAgICAgICAgICAjIFhYWCBTdHJpY3RseSB5b3UncmUgc3VwcG9zZWQgdG8gZm9sbG93IFJGQyAyNjE2CisgICAgICAgICAgICAgICAgICAgICMgICBhZ2UtY2FsY3VsYXRpb24gcnVsZXMuICBSZW1lbWJlciB0aGF0IHplcm8gTWF4LUFnZSBpcyBhCisgICAgICAgICAgICAgICAgICAgICMgICBpcyBhIHJlcXVlc3QgdG8gZGlzY2FyZCAob2xkIGFuZCBuZXcpIGNvb2tpZSwgdGhvdWdoLgorICAgICAgICAgICAgICAgICAgICBrID0gImV4cGlyZXMiCisgICAgICAgICAgICAgICAgICAgIHYgPSBzZWxmLl9ub3cgKyB2CisgICAgICAgICAgICAgICAgaWYgKGsgaW4gdmFsdWVfYXR0cnMpIG9yIChrIGluIGJvb2xlYW5fYXR0cnMpOgorICAgICAgICAgICAgICAgICAgICBpZiAodiBpcyBOb25lIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgayBub3QgaW4gKCJwb3J0IiwgImNvbW1lbnQiLCAiY29tbWVudHVybCIpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgbWlzc2luZyB2YWx1ZSBmb3IgJXMgYXR0cmlidXRlIiAlIGspCisgICAgICAgICAgICAgICAgICAgICAgICBiYWRfY29va2llID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRba10gPSB2CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVzdFtrXSA9IHYKKworICAgICAgICAgICAgaWYgYmFkX2Nvb2tpZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBjb29raWVfdHVwbGVzLmFwcGVuZCgobmFtZSwgdmFsdWUsIHN0YW5kYXJkLCByZXN0KSkKKworICAgICAgICByZXR1cm4gY29va2llX3R1cGxlcworCisgICAgZGVmIF9jb29raWVfZnJvbV9jb29raWVfdHVwbGUoc2VsZiwgdHVwLCByZXF1ZXN0KToKKyAgICAgICAgIyBzdGFuZGFyZCBpcyBkaWN0IG9mIHN0YW5kYXJkIGNvb2tpZS1hdHRyaWJ1dGVzLCByZXN0IGlzIGRpY3Qgb2YgdGhlCisgICAgICAgICMgcmVzdCBvZiB0aGVtCisgICAgICAgIG5hbWUsIHZhbHVlLCBzdGFuZGFyZCwgcmVzdCA9IHR1cAorCisgICAgICAgIGRvbWFpbiA9IHN0YW5kYXJkLmdldCgiZG9tYWluIiwgQWJzZW50KQorICAgICAgICBwYXRoID0gc3RhbmRhcmQuZ2V0KCJwYXRoIiwgQWJzZW50KQorICAgICAgICBwb3J0ID0gc3RhbmRhcmQuZ2V0KCJwb3J0IiwgQWJzZW50KQorICAgICAgICBleHBpcmVzID0gc3RhbmRhcmQuZ2V0KCJleHBpcmVzIiwgQWJzZW50KQorCisgICAgICAgICMgc2V0IHRoZSBlYXN5IGRlZmF1bHRzCisgICAgICAgIHZlcnNpb24gPSBzdGFuZGFyZC5nZXQoInZlcnNpb24iLCBOb25lKQorICAgICAgICBpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZlcnNpb24gPSBpbnQodmVyc2lvbikKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lICAjIGludmFsaWQgdmVyc2lvbiwgaWdub3JlIGNvb2tpZQorICAgICAgICBzZWN1cmUgPSBzdGFuZGFyZC5nZXQoInNlY3VyZSIsIEZhbHNlKQorICAgICAgICAjIChkaXNjYXJkIGlzIGFsc28gc2V0IGlmIGV4cGlyZXMgaXMgQWJzZW50KQorICAgICAgICBkaXNjYXJkID0gc3RhbmRhcmQuZ2V0KCJkaXNjYXJkIiwgRmFsc2UpCisgICAgICAgIGNvbW1lbnQgPSBzdGFuZGFyZC5nZXQoImNvbW1lbnQiLCBOb25lKQorICAgICAgICBjb21tZW50X3VybCA9IHN0YW5kYXJkLmdldCgiY29tbWVudHVybCIsIE5vbmUpCisKKyAgICAgICAgIyBzZXQgZGVmYXVsdCBwYXRoCisgICAgICAgIGlmIHBhdGggaXMgbm90IEFic2VudCBhbmQgcGF0aCAhPSAiIjoKKyAgICAgICAgICAgIHBhdGhfc3BlY2lmaWVkID0gVHJ1ZQorICAgICAgICAgICAgcGF0aCA9IGVzY2FwZV9wYXRoKHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoX3NwZWNpZmllZCA9IEZhbHNlCisgICAgICAgICAgICBwYXRoID0gcmVxdWVzdF9wYXRoKHJlcXVlc3QpCisgICAgICAgICAgICBpID0gcGF0aC5yZmluZCgiLyIpCisgICAgICAgICAgICBpZiBpICE9IC0xOgorICAgICAgICAgICAgICAgIGlmIHZlcnNpb24gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBOZXRzY2FwZSBzcGVjIHBhcnRzIGNvbXBhbnkgZnJvbSByZWFsaXR5IGhlcmUKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbOmldCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbOmkrMV0KKyAgICAgICAgICAgIGlmIGxlbihwYXRoKSA9PSAwOiBwYXRoID0gIi8iCisKKyAgICAgICAgIyBzZXQgZGVmYXVsdCBkb21haW4KKyAgICAgICAgZG9tYWluX3NwZWNpZmllZCA9IGRvbWFpbiBpcyBub3QgQWJzZW50CisgICAgICAgICMgYnV0IGZpcnN0IHdlIGhhdmUgdG8gcmVtZW1iZXIgd2hldGhlciBpdCBzdGFydHMgd2l0aCBhIGRvdAorICAgICAgICBkb21haW5faW5pdGlhbF9kb3QgPSBGYWxzZQorICAgICAgICBpZiBkb21haW5fc3BlY2lmaWVkOgorICAgICAgICAgICAgZG9tYWluX2luaXRpYWxfZG90ID0gYm9vbChkb21haW4uc3RhcnRzd2l0aCgiLiIpKQorICAgICAgICBpZiBkb21haW4gaXMgQWJzZW50OgorICAgICAgICAgICAgcmVxX2hvc3QsIGVyaG4gPSBlZmZfcmVxdWVzdF9ob3N0KHJlcXVlc3QpCisgICAgICAgICAgICBkb21haW4gPSBlcmhuCisgICAgICAgIGVsaWYgbm90IGRvbWFpbi5zdGFydHN3aXRoKCIuIik6CisgICAgICAgICAgICBkb21haW4gPSAiLiIrZG9tYWluCisKKyAgICAgICAgIyBzZXQgZGVmYXVsdCBwb3J0CisgICAgICAgIHBvcnRfc3BlY2lmaWVkID0gRmFsc2UKKyAgICAgICAgaWYgcG9ydCBpcyBub3QgQWJzZW50OgorICAgICAgICAgICAgaWYgcG9ydCBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgUG9ydCBhdHRyIHByZXNlbnQsIGJ1dCBoYXMgbm8gdmFsdWU6IGRlZmF1bHQgdG8gcmVxdWVzdCBwb3J0LgorICAgICAgICAgICAgICAgICMgQ29va2llIHNob3VsZCB0aGVuIG9ubHkgYmUgc2VudCBiYWNrIG9uIHRoYXQgcG9ydC4KKyAgICAgICAgICAgICAgICBwb3J0ID0gcmVxdWVzdF9wb3J0KHJlcXVlc3QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBvcnRfc3BlY2lmaWVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIHBvcnQgPSByZS5zdWIociJccysiLCAiIiwgcG9ydCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgTm8gcG9ydCBhdHRyIHByZXNlbnQuICBDb29raWUgY2FuIGJlIHNlbnQgYmFjayBvbiBhbnkgcG9ydC4KKyAgICAgICAgICAgIHBvcnQgPSBOb25lCisKKyAgICAgICAgIyBzZXQgZGVmYXVsdCBleHBpcmVzIGFuZCBkaXNjYXJkCisgICAgICAgIGlmIGV4cGlyZXMgaXMgQWJzZW50OgorICAgICAgICAgICAgZXhwaXJlcyA9IE5vbmUKKyAgICAgICAgICAgIGRpc2NhcmQgPSBUcnVlCisgICAgICAgIGVsaWYgZXhwaXJlcyA8PSBzZWxmLl9ub3c6CisgICAgICAgICAgICAjIEV4cGlyeSBkYXRlIGluIHBhc3QgaXMgcmVxdWVzdCB0byBkZWxldGUgY29va2llLiAgVGhpcyBjYW4ndCBiZQorICAgICAgICAgICAgIyBpbiBEZWZhdWx0Q29va2llUG9saWN5LCBiZWNhdXNlIGNhbid0IGRlbGV0ZSBjb29raWVzIHRoZXJlLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIoZG9tYWluLCBwYXRoLCBuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIF9kZWJ1ZygiRXhwaXJpbmcgY29va2llLCBkb21haW49JyVzJywgcGF0aD0nJXMnLCBuYW1lPSclcyciLAorICAgICAgICAgICAgICAgICAgIGRvbWFpbiwgcGF0aCwgbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgcmV0dXJuIENvb2tpZSh2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIHBvcnQsIHBvcnRfc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiwgZG9tYWluX3NwZWNpZmllZCwgZG9tYWluX2luaXRpYWxfZG90LAorICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIHBhdGhfc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzLAorICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQsCisgICAgICAgICAgICAgICAgICAgICAgY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb21tZW50X3VybCwKKyAgICAgICAgICAgICAgICAgICAgICByZXN0KQorCisgICAgZGVmIF9jb29raWVzX2Zyb21fYXR0cnNfc2V0KHNlbGYsIGF0dHJzX3NldCwgcmVxdWVzdCk6CisgICAgICAgIGNvb2tpZV90dXBsZXMgPSBzZWxmLl9ub3JtYWxpemVkX2Nvb2tpZV90dXBsZXMoYXR0cnNfc2V0KQorCisgICAgICAgIGNvb2tpZXMgPSBbXQorICAgICAgICBmb3IgdHVwIGluIGNvb2tpZV90dXBsZXM6CisgICAgICAgICAgICBjb29raWUgPSBzZWxmLl9jb29raWVfZnJvbV9jb29raWVfdHVwbGUodHVwLCByZXF1ZXN0KQorICAgICAgICAgICAgaWYgY29va2llOiBjb29raWVzLmFwcGVuZChjb29raWUpCisgICAgICAgIHJldHVybiBjb29raWVzCisKKyAgICBkZWYgX3Byb2Nlc3NfcmZjMjEwOV9jb29raWVzKHNlbGYsIGNvb2tpZXMpOgorICAgICAgICByZmMyMTA5X2FzX25zID0gZ2V0YXR0cihzZWxmLl9wb2xpY3ksICdyZmMyMTA5X2FzX25ldHNjYXBlJywgTm9uZSkKKyAgICAgICAgaWYgcmZjMjEwOV9hc19ucyBpcyBOb25lOgorICAgICAgICAgICAgcmZjMjEwOV9hc19ucyA9IG5vdCBzZWxmLl9wb2xpY3kucmZjMjk2NQorICAgICAgICBmb3IgY29va2llIGluIGNvb2tpZXM6CisgICAgICAgICAgICBpZiBjb29raWUudmVyc2lvbiA9PSAxOgorICAgICAgICAgICAgICAgIGNvb2tpZS5yZmMyMTA5ID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIHJmYzIxMDlfYXNfbnM6CisgICAgICAgICAgICAgICAgICAgICMgdHJlYXQgMjEwOSBjb29raWVzIGFzIE5ldHNjYXBlIGNvb2tpZXMgcmF0aGVyIHRoYW4KKyAgICAgICAgICAgICAgICAgICAgIyBhcyBSRkMyOTY1IGNvb2tpZXMKKyAgICAgICAgICAgICAgICAgICAgY29va2llLnZlcnNpb24gPSAwCisKKyAgICBkZWYgbWFrZV9jb29raWVzKHNlbGYsIHJlc3BvbnNlLCByZXF1ZXN0KToKKyAgICAgICAgIiIiUmV0dXJuIHNlcXVlbmNlIG9mIENvb2tpZSBvYmplY3RzIGV4dHJhY3RlZCBmcm9tIHJlc3BvbnNlIG9iamVjdC4iIiIKKyAgICAgICAgIyBnZXQgY29va2llLWF0dHJpYnV0ZXMgZm9yIFJGQyAyOTY1IGFuZCBOZXRzY2FwZSBwcm90b2NvbHMKKyAgICAgICAgaGVhZGVycyA9IHJlc3BvbnNlLmluZm8oKQorICAgICAgICByZmMyOTY1X2hkcnMgPSBoZWFkZXJzLmdldGhlYWRlcnMoIlNldC1Db29raWUyIikKKyAgICAgICAgbnNfaGRycyA9IGhlYWRlcnMuZ2V0aGVhZGVycygiU2V0LUNvb2tpZSIpCisKKyAgICAgICAgcmZjMjk2NSA9IHNlbGYuX3BvbGljeS5yZmMyOTY1CisgICAgICAgIG5ldHNjYXBlID0gc2VsZi5fcG9saWN5Lm5ldHNjYXBlCisKKyAgICAgICAgaWYgKChub3QgcmZjMjk2NV9oZHJzIGFuZCBub3QgbnNfaGRycykgb3IKKyAgICAgICAgICAgIChub3QgbnNfaGRycyBhbmQgbm90IHJmYzI5NjUpIG9yCisgICAgICAgICAgICAobm90IHJmYzI5NjVfaGRycyBhbmQgbm90IG5ldHNjYXBlKSBvcgorICAgICAgICAgICAgKG5vdCBuZXRzY2FwZSBhbmQgbm90IHJmYzI5NjUpKToKKyAgICAgICAgICAgIHJldHVybiBbXSAgIyBubyByZWxldmFudCBjb29raWUgaGVhZGVyczogcXVpY2sgZXhpdAorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvb2tpZXMgPSBzZWxmLl9jb29raWVzX2Zyb21fYXR0cnNfc2V0KAorICAgICAgICAgICAgICAgIHNwbGl0X2hlYWRlcl93b3JkcyhyZmMyOTY1X2hkcnMpLCByZXF1ZXN0KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgX3dhcm5fdW5oYW5kbGVkX2V4Y2VwdGlvbigpCisgICAgICAgICAgICBjb29raWVzID0gW10KKworICAgICAgICBpZiBuc19oZHJzIGFuZCBuZXRzY2FwZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFJGQyAyMTA5IGFuZCBOZXRzY2FwZSBjb29raWVzCisgICAgICAgICAgICAgICAgbnNfY29va2llcyA9IHNlbGYuX2Nvb2tpZXNfZnJvbV9hdHRyc19zZXQoCisgICAgICAgICAgICAgICAgICAgIHBhcnNlX25zX2hlYWRlcnMobnNfaGRycyksIHJlcXVlc3QpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIF93YXJuX3VuaGFuZGxlZF9leGNlcHRpb24oKQorICAgICAgICAgICAgICAgIG5zX2Nvb2tpZXMgPSBbXQorICAgICAgICAgICAgc2VsZi5fcHJvY2Vzc19yZmMyMTA5X2Nvb2tpZXMobnNfY29va2llcykKKworICAgICAgICAgICAgIyBMb29rIGZvciBOZXRzY2FwZSBjb29raWVzIChmcm9tIFNldC1Db29raWUgaGVhZGVycykgdGhhdCBtYXRjaAorICAgICAgICAgICAgIyBjb3JyZXNwb25kaW5nIFJGQyAyOTY1IGNvb2tpZXMgKGZyb20gU2V0LUNvb2tpZTIgaGVhZGVycykuCisgICAgICAgICAgICAjIEZvciBlYWNoIG1hdGNoLCBrZWVwIHRoZSBSRkMgMjk2NSBjb29raWUgYW5kIGlnbm9yZSB0aGUgTmV0c2NhcGUKKyAgICAgICAgICAgICMgY29va2llIChSRkMgMjk2NSBzZWN0aW9uIDkuMSkuICBBY3R1YWxseSwgUkZDIDIxMDkgY29va2llcyBhcmUKKyAgICAgICAgICAgICMgYnVuZGxlZCBpbiB3aXRoIHRoZSBOZXRzY2FwZSBjb29raWVzIGZvciB0aGlzIHB1cnBvc2UsIHdoaWNoIGlzCisgICAgICAgICAgICAjIHJlYXNvbmFibGUgYmVoYXZpb3VyLgorICAgICAgICAgICAgaWYgcmZjMjk2NToKKyAgICAgICAgICAgICAgICBsb29rdXAgPSB7fQorICAgICAgICAgICAgICAgIGZvciBjb29raWUgaW4gY29va2llczoKKyAgICAgICAgICAgICAgICAgICAgbG9va3VwWyhjb29raWUuZG9tYWluLCBjb29raWUucGF0aCwgY29va2llLm5hbWUpXSA9IE5vbmUKKworICAgICAgICAgICAgICAgIGRlZiBub19tYXRjaGluZ19yZmMyOTY1KG5zX2Nvb2tpZSwgbG9va3VwPWxvb2t1cCk6CisgICAgICAgICAgICAgICAgICAgIGtleSA9IG5zX2Nvb2tpZS5kb21haW4sIG5zX2Nvb2tpZS5wYXRoLCBuc19jb29raWUubmFtZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5IG5vdCBpbiBsb29rdXAKKyAgICAgICAgICAgICAgICBuc19jb29raWVzID0gZmlsdGVyKG5vX21hdGNoaW5nX3JmYzI5NjUsIG5zX2Nvb2tpZXMpCisKKyAgICAgICAgICAgIGlmIG5zX2Nvb2tpZXM6CisgICAgICAgICAgICAgICAgY29va2llcy5leHRlbmQobnNfY29va2llcykKKworICAgICAgICByZXR1cm4gY29va2llcworCisgICAgZGVmIHNldF9jb29raWVfaWZfb2soc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgIiIiU2V0IGEgY29va2llIGlmIHBvbGljeSBzYXlzIGl0J3MgT0sgdG8gZG8gc28uIiIiCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fcG9saWN5Ll9ub3cgPSBzZWxmLl9ub3cgPSBpbnQodGltZS50aW1lKCkpCisKKyAgICAgICAgICAgIGlmIHNlbGYuX3BvbGljeS5zZXRfb2soY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9jb29raWUoY29va2llKQorCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBzZXRfY29va2llKHNlbGYsIGNvb2tpZSk6CisgICAgICAgICIiIlNldCBhIGNvb2tpZSwgd2l0aG91dCBjaGVja2luZyB3aGV0aGVyIG9yIG5vdCBpdCBzaG91bGQgYmUgc2V0LiIiIgorICAgICAgICBjID0gc2VsZi5fY29va2llcworICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGNvb2tpZS5kb21haW4gbm90IGluIGM6IGNbY29va2llLmRvbWFpbl0gPSB7fQorICAgICAgICAgICAgYzIgPSBjW2Nvb2tpZS5kb21haW5dCisgICAgICAgICAgICBpZiBjb29raWUucGF0aCBub3QgaW4gYzI6IGMyW2Nvb2tpZS5wYXRoXSA9IHt9CisgICAgICAgICAgICBjMyA9IGMyW2Nvb2tpZS5wYXRoXQorICAgICAgICAgICAgYzNbY29va2llLm5hbWVdID0gY29va2llCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgZXh0cmFjdF9jb29raWVzKHNlbGYsIHJlc3BvbnNlLCByZXF1ZXN0KToKKyAgICAgICAgIiIiRXh0cmFjdCBjb29raWVzIGZyb20gcmVzcG9uc2UsIHdoZXJlIGFsbG93YWJsZSBnaXZlbiB0aGUgcmVxdWVzdC4iIiIKKyAgICAgICAgX2RlYnVnKCJleHRyYWN0X2Nvb2tpZXM6ICVzIiwgcmVzcG9uc2UuaW5mbygpKQorICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3BvbGljeS5fbm93ID0gc2VsZi5fbm93ID0gaW50KHRpbWUudGltZSgpKQorCisgICAgICAgICAgICBmb3IgY29va2llIGluIHNlbGYubWFrZV9jb29raWVzKHJlc3BvbnNlLCByZXF1ZXN0KToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9wb2xpY3kuc2V0X29rKGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiIHNldHRpbmcgY29va2llOiAlcyIsIGNvb2tpZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRfY29va2llKGNvb2tpZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBjbGVhcihzZWxmLCBkb21haW49Tm9uZSwgcGF0aD1Ob25lLCBuYW1lPU5vbmUpOgorICAgICAgICAiIiJDbGVhciBzb21lIGNvb2tpZXMuCisKKyAgICAgICAgSW52b2tpbmcgdGhpcyBtZXRob2Qgd2l0aG91dCBhcmd1bWVudHMgd2lsbCBjbGVhciBhbGwgY29va2llcy4gIElmCisgICAgICAgIGdpdmVuIGEgc2luZ2xlIGFyZ3VtZW50LCBvbmx5IGNvb2tpZXMgYmVsb25naW5nIHRvIHRoYXQgZG9tYWluIHdpbGwgYmUKKyAgICAgICAgcmVtb3ZlZC4gIElmIGdpdmVuIHR3byBhcmd1bWVudHMsIGNvb2tpZXMgYmVsb25naW5nIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgcGF0aCB3aXRoaW4gdGhhdCBkb21haW4gYXJlIHJlbW92ZWQuICBJZiBnaXZlbiB0aHJlZSBhcmd1bWVudHMsIHRoZW4KKyAgICAgICAgdGhlIGNvb2tpZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgcGF0aCBhbmQgZG9tYWluIGlzIHJlbW92ZWQuCisKKyAgICAgICAgUmFpc2VzIEtleUVycm9yIGlmIG5vIG1hdGNoaW5nIGNvb2tpZSBleGlzdHMuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiAoZG9tYWluIGlzIE5vbmUpIG9yIChwYXRoIGlzIE5vbmUpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJkb21haW4gYW5kIHBhdGggbXVzdCBiZSBnaXZlbiB0byByZW1vdmUgYSBjb29raWUgYnkgbmFtZSIpCisgICAgICAgICAgICBkZWwgc2VsZi5fY29va2llc1tkb21haW5dW3BhdGhdW25hbWVdCisgICAgICAgIGVsaWYgcGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGRvbWFpbiBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJkb21haW4gbXVzdCBiZSBnaXZlbiB0byByZW1vdmUgY29va2llcyBieSBwYXRoIikKKyAgICAgICAgICAgIGRlbCBzZWxmLl9jb29raWVzW2RvbWFpbl1bcGF0aF0KKyAgICAgICAgZWxpZiBkb21haW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkZWwgc2VsZi5fY29va2llc1tkb21haW5dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9jb29raWVzID0ge30KKworICAgIGRlZiBjbGVhcl9zZXNzaW9uX2Nvb2tpZXMoc2VsZik6CisgICAgICAgICIiIkRpc2NhcmQgYWxsIHNlc3Npb24gY29va2llcy4KKworICAgICAgICBOb3RlIHRoYXQgdGhlIC5zYXZlKCkgbWV0aG9kIHdvbid0IHNhdmUgc2Vzc2lvbiBjb29raWVzIGFueXdheSwgdW5sZXNzCisgICAgICAgIHlvdSBhc2sgb3RoZXJ3aXNlIGJ5IHBhc3NpbmcgYSB0cnVlIGlnbm9yZV9kaXNjYXJkIGFyZ3VtZW50LgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBjb29raWUgaW4gc2VsZjoKKyAgICAgICAgICAgICAgICBpZiBjb29raWUuZGlzY2FyZDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGVhcihjb29raWUuZG9tYWluLCBjb29raWUucGF0aCwgY29va2llLm5hbWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgY2xlYXJfZXhwaXJlZF9jb29raWVzKHNlbGYpOgorICAgICAgICAiIiJEaXNjYXJkIGFsbCBleHBpcmVkIGNvb2tpZXMuCisKKyAgICAgICAgWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gY2FsbCB0aGlzIG1ldGhvZDogZXhwaXJlZCBjb29raWVzIGFyZSBuZXZlcgorICAgICAgICBzZW50IGJhY2sgdG8gdGhlIHNlcnZlciAocHJvdmlkZWQgeW91J3JlIHVzaW5nIERlZmF1bHRDb29raWVQb2xpY3kpLAorICAgICAgICB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgQ29va2llSmFyIGl0c2VsZiBldmVyeSBzbyBvZnRlbiwgYW5kIHRoZQorICAgICAgICAuc2F2ZSgpIG1ldGhvZCB3b24ndCBzYXZlIGV4cGlyZWQgY29va2llcyBhbnl3YXkgKHVubGVzcyB5b3UgYXNrCisgICAgICAgIG90aGVyd2lzZSBieSBwYXNzaW5nIGEgdHJ1ZSBpZ25vcmVfZXhwaXJlcyBhcmd1bWVudCkuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIGZvciBjb29raWUgaW4gc2VsZjoKKyAgICAgICAgICAgICAgICBpZiBjb29raWUuaXNfZXhwaXJlZChub3cpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyKGNvb2tpZS5kb21haW4sIGNvb2tpZS5wYXRoLCBjb29raWUubmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGRlZXB2YWx1ZXMoc2VsZi5fY29va2llcykKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbnVtYmVyIG9mIGNvbnRhaW5lZCBjb29raWVzLiIiIgorICAgICAgICBpID0gMAorICAgICAgICBmb3IgY29va2llIGluIHNlbGY6IGkgPSBpICsgMQorICAgICAgICByZXR1cm4gaQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByID0gW10KKyAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOiByLmFwcGVuZChyZXByKGNvb2tpZSkpCisgICAgICAgIHJldHVybiAiPCVzWyVzXT4iICUgKHNlbGYuX19jbGFzc19fLCAiLCAiLmpvaW4ocikpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgciA9IFtdCisgICAgICAgIGZvciBjb29raWUgaW4gc2VsZjogci5hcHBlbmQoc3RyKGNvb2tpZSkpCisgICAgICAgIHJldHVybiAiPCVzWyVzXT4iICUgKHNlbGYuX19jbGFzc19fLCAiLCAiLmpvaW4ocikpCisKKworIyBkZXJpdmVzIGZyb20gSU9FcnJvciBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi40LjAKK2NsYXNzIExvYWRFcnJvcihJT0Vycm9yKTogcGFzcworCitjbGFzcyBGaWxlQ29va2llSmFyKENvb2tpZUphcik6CisgICAgIiIiQ29va2llSmFyIHRoYXQgY2FuIGJlIGxvYWRlZCBmcm9tIGFuZCBzYXZlZCB0byBhIGZpbGUuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWU9Tm9uZSwgZGVsYXlsb2FkPUZhbHNlLCBwb2xpY3k9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBDb29raWVzIGFyZSBOT1QgbG9hZGVkIGZyb20gdGhlIG5hbWVkIGZpbGUgdW50aWwgZWl0aGVyIHRoZSAubG9hZCgpIG9yCisgICAgICAgIC5yZXZlcnQoKSBtZXRob2QgaXMgY2FsbGVkLgorCisgICAgICAgICIiIgorICAgICAgICBDb29raWVKYXIuX19pbml0X18oc2VsZiwgcG9saWN5KQorICAgICAgICBpZiBmaWxlbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSsiIgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpbGVuYW1lIG11c3QgYmUgc3RyaW5nLWxpa2UiKQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5kZWxheWxvYWQgPSBib29sKGRlbGF5bG9hZCkKKworICAgIGRlZiBzYXZlKHNlbGYsIGZpbGVuYW1lPU5vbmUsIGlnbm9yZV9kaXNjYXJkPUZhbHNlLCBpZ25vcmVfZXhwaXJlcz1GYWxzZSk6CisgICAgICAgICIiIlNhdmUgY29va2llcyB0byBhIGZpbGUuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgICAgZGVmIGxvYWQoc2VsZiwgZmlsZW5hbWU9Tm9uZSwgaWdub3JlX2Rpc2NhcmQ9RmFsc2UsIGlnbm9yZV9leHBpcmVzPUZhbHNlKToKKyAgICAgICAgIiIiTG9hZCBjb29raWVzIGZyb20gYSBmaWxlLiIiIgorICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5maWxlbmFtZSBpcyBub3QgTm9uZTogZmlsZW5hbWUgPSBzZWxmLmZpbGVuYW1lCisgICAgICAgICAgICBlbHNlOiByYWlzZSBWYWx1ZUVycm9yKE1JU1NJTkdfRklMRU5BTUVfVEVYVCkKKworICAgICAgICBmID0gb3BlbihmaWxlbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fcmVhbGx5X2xvYWQoZiwgZmlsZW5hbWUsIGlnbm9yZV9kaXNjYXJkLCBpZ25vcmVfZXhwaXJlcykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHJldmVydChzZWxmLCBmaWxlbmFtZT1Ob25lLAorICAgICAgICAgICAgICAgaWdub3JlX2Rpc2NhcmQ9RmFsc2UsIGlnbm9yZV9leHBpcmVzPUZhbHNlKToKKyAgICAgICAgIiIiQ2xlYXIgYWxsIGNvb2tpZXMgYW5kIHJlbG9hZCBjb29raWVzIGZyb20gYSBzYXZlZCBmaWxlLgorCisgICAgICAgIFJhaXNlcyBMb2FkRXJyb3IgKG9yIElPRXJyb3IpIGlmIHJldmVyc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bDsgdGhlCisgICAgICAgIG9iamVjdCdzIHN0YXRlIHdpbGwgbm90IGJlIGFsdGVyZWQgaWYgdGhpcyBoYXBwZW5zLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5maWxlbmFtZSBpcyBub3QgTm9uZTogZmlsZW5hbWUgPSBzZWxmLmZpbGVuYW1lCisgICAgICAgICAgICBlbHNlOiByYWlzZSBWYWx1ZUVycm9yKE1JU1NJTkdfRklMRU5BTUVfVEVYVCkKKworICAgICAgICBzZWxmLl9jb29raWVzX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKworICAgICAgICAgICAgb2xkX3N0YXRlID0gY29weS5kZWVwY29weShzZWxmLl9jb29raWVzKQorICAgICAgICAgICAgc2VsZi5fY29va2llcyA9IHt9CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5sb2FkKGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZCwgaWdub3JlX2V4cGlyZXMpCisgICAgICAgICAgICBleGNlcHQgKExvYWRFcnJvciwgSU9FcnJvcik6CisgICAgICAgICAgICAgICAgc2VsZi5fY29va2llcyA9IG9sZF9zdGF0ZQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKKworZnJvbSBfTFdQQ29va2llSmFyIGltcG9ydCBMV1BDb29raWVKYXIsIGx3cF9jb29raWVfc3RyCitmcm9tIF9Nb3ppbGxhQ29va2llSmFyIGltcG9ydCBNb3ppbGxhQ29va2llSmFyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Nvb2tpZWxpYi5weWMgYi9saWIvcHl0aG9uMi43L2Nvb2tpZWxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4MWRiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29va2llbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Nvb2tpZWxpYi5weW8gYi9saWIvcHl0aG9uMi43L2Nvb2tpZWxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEyYjcwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29va2llbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvcHkucHkgYi9saWIvcHl0aG9uMi43L2NvcHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyN2EyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29weS5weQpAQCAtMCwwICsxLDQzMyBAQAorIiIiR2VuZXJpYyAoc2hhbGxvdyBhbmQgZGVlcCkgY29weWluZyBvcGVyYXRpb25zLgorCitJbnRlcmZhY2Ugc3VtbWFyeToKKworICAgICAgICBpbXBvcnQgY29weQorCisgICAgICAgIHggPSBjb3B5LmNvcHkoeSkgICAgICAgICMgbWFrZSBhIHNoYWxsb3cgY29weSBvZiB5CisgICAgICAgIHggPSBjb3B5LmRlZXBjb3B5KHkpICAgICMgbWFrZSBhIGRlZXAgY29weSBvZiB5CisKK0ZvciBtb2R1bGUgc3BlY2lmaWMgZXJyb3JzLCBjb3B5LkVycm9yIGlzIHJhaXNlZC4KKworVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzaGFsbG93IGFuZCBkZWVwIGNvcHlpbmcgaXMgb25seSByZWxldmFudCBmb3IKK2NvbXBvdW5kIG9iamVjdHMgKG9iamVjdHMgdGhhdCBjb250YWluIG90aGVyIG9iamVjdHMsIGxpa2UgbGlzdHMgb3IKK2NsYXNzIGluc3RhbmNlcykuCisKKy0gQSBzaGFsbG93IGNvcHkgY29uc3RydWN0cyBhIG5ldyBjb21wb3VuZCBvYmplY3QgYW5kIHRoZW4gKHRvIHRoZQorICBleHRlbnQgcG9zc2libGUpIGluc2VydHMgKnRoZSBzYW1lIG9iamVjdHMqIGludG8gaXQgdGhhdCB0aGUKKyAgb3JpZ2luYWwgY29udGFpbnMuCisKKy0gQSBkZWVwIGNvcHkgY29uc3RydWN0cyBhIG5ldyBjb21wb3VuZCBvYmplY3QgYW5kIHRoZW4sIHJlY3Vyc2l2ZWx5LAorICBpbnNlcnRzICpjb3BpZXMqIGludG8gaXQgb2YgdGhlIG9iamVjdHMgZm91bmQgaW4gdGhlIG9yaWdpbmFsLgorCitUd28gcHJvYmxlbXMgb2Z0ZW4gZXhpc3Qgd2l0aCBkZWVwIGNvcHkgb3BlcmF0aW9ucyB0aGF0IGRvbid0IGV4aXN0Cit3aXRoIHNoYWxsb3cgY29weSBvcGVyYXRpb25zOgorCisgYSkgcmVjdXJzaXZlIG9iamVjdHMgKGNvbXBvdW5kIG9iamVjdHMgdGhhdCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwKKyAgICBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZW1zZWx2ZXMpIG1heSBjYXVzZSBhIHJlY3Vyc2l2ZSBsb29wCisKKyBiKSBiZWNhdXNlIGRlZXAgY29weSBjb3BpZXMgKmV2ZXJ5dGhpbmcqIGl0IG1heSBjb3B5IHRvbyBtdWNoLCBlLmcuCisgICAgYWRtaW5pc3RyYXRpdmUgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgc2hvdWxkIGJlIHNoYXJlZCBldmVuIGJldHdlZW4KKyAgICBjb3BpZXMKKworUHl0aG9uJ3MgZGVlcCBjb3B5IG9wZXJhdGlvbiBhdm9pZHMgdGhlc2UgcHJvYmxlbXMgYnk6CisKKyBhKSBrZWVwaW5nIGEgdGFibGUgb2Ygb2JqZWN0cyBhbHJlYWR5IGNvcGllZCBkdXJpbmcgdGhlIGN1cnJlbnQKKyAgICBjb3B5aW5nIHBhc3MKKworIGIpIGxldHRpbmcgdXNlci1kZWZpbmVkIGNsYXNzZXMgb3ZlcnJpZGUgdGhlIGNvcHlpbmcgb3BlcmF0aW9uIG9yIHRoZQorICAgIHNldCBvZiBjb21wb25lbnRzIGNvcGllZAorCitUaGlzIHZlcnNpb24gZG9lcyBub3QgY29weSB0eXBlcyBsaWtlIG1vZHVsZSwgY2xhc3MsIGZ1bmN0aW9uLCBtZXRob2QsCitub3Igc3RhY2sgdHJhY2UsIHN0YWNrIGZyYW1lLCBub3IgZmlsZSwgc29ja2V0LCB3aW5kb3csIG5vciBhcnJheSwgbm9yCithbnkgc2ltaWxhciB0eXBlcy4KKworQ2xhc3NlcyBjYW4gdXNlIHRoZSBzYW1lIGludGVyZmFjZXMgdG8gY29udHJvbCBjb3B5aW5nIHRoYXQgdGhleSB1c2UKK3RvIGNvbnRyb2wgcGlja2xpbmc6IHRoZXkgY2FuIGRlZmluZSBtZXRob2RzIGNhbGxlZCBfX2dldGluaXRhcmdzX18oKSwKK19fZ2V0c3RhdGVfXygpIGFuZCBfX3NldHN0YXRlX18oKS4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgbW9kdWxlCisicGlja2xlIiBmb3IgaW5mb3JtYXRpb24gb24gdGhlc2UgbWV0aG9kcy4KKyIiIgorCitpbXBvcnQgdHlwZXMKK2ltcG9ydCB3ZWFrcmVmCitmcm9tIGNvcHlfcmVnIGltcG9ydCBkaXNwYXRjaF90YWJsZQorCitjbGFzcyBFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKK2Vycm9yID0gRXJyb3IgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKwordHJ5OgorICAgIGZyb20gb3JnLnB5dGhvbi5jb3JlIGltcG9ydCBQeVN0cmluZ01hcAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIFB5U3RyaW5nTWFwID0gTm9uZQorCitfX2FsbF9fID0gWyJFcnJvciIsICJjb3B5IiwgImRlZXBjb3B5Il0KKworZGVmIGNvcHkoeCk6CisgICAgIiIiU2hhbGxvdyBjb3B5IG9wZXJhdGlvbiBvbiBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuCisKKyAgICBTZWUgdGhlIG1vZHVsZSdzIF9fZG9jX18gc3RyaW5nIGZvciBtb3JlIGluZm8uCisgICAgIiIiCisKKyAgICBjbHMgPSB0eXBlKHgpCisKKyAgICBjb3BpZXIgPSBfY29weV9kaXNwYXRjaC5nZXQoY2xzKQorICAgIGlmIGNvcGllcjoKKyAgICAgICAgcmV0dXJuIGNvcGllcih4KQorCisgICAgY29waWVyID0gZ2V0YXR0cihjbHMsICJfX2NvcHlfXyIsIE5vbmUpCisgICAgaWYgY29waWVyOgorICAgICAgICByZXR1cm4gY29waWVyKHgpCisKKyAgICByZWR1Y3RvciA9IGRpc3BhdGNoX3RhYmxlLmdldChjbHMpCisgICAgaWYgcmVkdWN0b3I6CisgICAgICAgIHJ2ID0gcmVkdWN0b3IoeCkKKyAgICBlbHNlOgorICAgICAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgIl9fcmVkdWNlX2V4X18iLCBOb25lKQorICAgICAgICBpZiByZWR1Y3RvcjoKKyAgICAgICAgICAgIHJ2ID0gcmVkdWN0b3IoMikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCAiX19yZWR1Y2VfXyIsIE5vbmUpCisgICAgICAgICAgICBpZiByZWR1Y3RvcjoKKyAgICAgICAgICAgICAgICBydiA9IHJlZHVjdG9yKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoInVuKHNoYWxsb3cpY29weWFibGUgb2JqZWN0IG9mIHR5cGUgJXMiICUgY2xzKQorCisgICAgcmV0dXJuIF9yZWNvbnN0cnVjdCh4LCBydiwgMCkKKworCitfY29weV9kaXNwYXRjaCA9IGQgPSB7fQorCitkZWYgX2NvcHlfaW1tdXRhYmxlKHgpOgorICAgIHJldHVybiB4Citmb3IgdCBpbiAodHlwZShOb25lKSwgaW50LCBsb25nLCBmbG9hdCwgYm9vbCwgc3RyLCB0dXBsZSwKKyAgICAgICAgICBmcm96ZW5zZXQsIHR5cGUsIHhyYW5nZSwgdHlwZXMuQ2xhc3NUeXBlLAorICAgICAgICAgIHR5cGVzLkJ1aWx0aW5GdW5jdGlvblR5cGUsIHR5cGUoRWxsaXBzaXMpLAorICAgICAgICAgIHR5cGVzLkZ1bmN0aW9uVHlwZSwgd2Vha3JlZi5yZWYpOgorICAgIGRbdF0gPSBfY29weV9pbW11dGFibGUKK2ZvciBuYW1lIGluICgiQ29tcGxleFR5cGUiLCAiVW5pY29kZVR5cGUiLCAiQ29kZVR5cGUiKToKKyAgICB0ID0gZ2V0YXR0cih0eXBlcywgbmFtZSwgTm9uZSkKKyAgICBpZiB0IGlzIG5vdCBOb25lOgorICAgICAgICBkW3RdID0gX2NvcHlfaW1tdXRhYmxlCisKK2RlZiBfY29weV93aXRoX2NvbnN0cnVjdG9yKHgpOgorICAgIHJldHVybiB0eXBlKHgpKHgpCitmb3IgdCBpbiAobGlzdCwgZGljdCwgc2V0KToKKyAgICBkW3RdID0gX2NvcHlfd2l0aF9jb25zdHJ1Y3RvcgorCitkZWYgX2NvcHlfd2l0aF9jb3B5X21ldGhvZCh4KToKKyAgICByZXR1cm4geC5jb3B5KCkKK2lmIFB5U3RyaW5nTWFwIGlzIG5vdCBOb25lOgorICAgIGRbUHlTdHJpbmdNYXBdID0gX2NvcHlfd2l0aF9jb3B5X21ldGhvZAorCitkZWYgX2NvcHlfaW5zdCh4KToKKyAgICBpZiBoYXNhdHRyKHgsICdfX2NvcHlfXycpOgorICAgICAgICByZXR1cm4geC5fX2NvcHlfXygpCisgICAgaWYgaGFzYXR0cih4LCAnX19nZXRpbml0YXJnc19fJyk6CisgICAgICAgIGFyZ3MgPSB4Ll9fZ2V0aW5pdGFyZ3NfXygpCisgICAgICAgIHkgPSB4Ll9fY2xhc3NfXygqYXJncykKKyAgICBlbHNlOgorICAgICAgICB5ID0gX0VtcHR5Q2xhc3MoKQorICAgICAgICB5Ll9fY2xhc3NfXyA9IHguX19jbGFzc19fCisgICAgaWYgaGFzYXR0cih4LCAnX19nZXRzdGF0ZV9fJyk6CisgICAgICAgIHN0YXRlID0geC5fX2dldHN0YXRlX18oKQorICAgIGVsc2U6CisgICAgICAgIHN0YXRlID0geC5fX2RpY3RfXworICAgIGlmIGhhc2F0dHIoeSwgJ19fc2V0c3RhdGVfXycpOgorICAgICAgICB5Ll9fc2V0c3RhdGVfXyhzdGF0ZSkKKyAgICBlbHNlOgorICAgICAgICB5Ll9fZGljdF9fLnVwZGF0ZShzdGF0ZSkKKyAgICByZXR1cm4geQorZFt0eXBlcy5JbnN0YW5jZVR5cGVdID0gX2NvcHlfaW5zdAorCitkZWwgZAorCitkZWYgZGVlcGNvcHkoeCwgbWVtbz1Ob25lLCBfbmlsPVtdKToKKyAgICAiIiJEZWVwIGNvcHkgb3BlcmF0aW9uIG9uIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4KKworICAgIFNlZSB0aGUgbW9kdWxlJ3MgX19kb2NfXyBzdHJpbmcgZm9yIG1vcmUgaW5mby4KKyAgICAiIiIKKworICAgIGlmIG1lbW8gaXMgTm9uZToKKyAgICAgICAgbWVtbyA9IHt9CisKKyAgICBkID0gaWQoeCkKKyAgICB5ID0gbWVtby5nZXQoZCwgX25pbCkKKyAgICBpZiB5IGlzIG5vdCBfbmlsOgorICAgICAgICByZXR1cm4geQorCisgICAgY2xzID0gdHlwZSh4KQorCisgICAgY29waWVyID0gX2RlZXBjb3B5X2Rpc3BhdGNoLmdldChjbHMpCisgICAgaWYgY29waWVyOgorICAgICAgICB5ID0gY29waWVyKHgsIG1lbW8pCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaXNzYyA9IGlzc3ViY2xhc3MoY2xzLCB0eXBlKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOiAjIGNscyBpcyBub3QgYSBjbGFzcyAob2xkIEJvb3N0OyBzZWUgU0YgIzUwMjA4NSkKKyAgICAgICAgICAgIGlzc2MgPSAwCisgICAgICAgIGlmIGlzc2M6CisgICAgICAgICAgICB5ID0gX2RlZXBjb3B5X2F0b21pYyh4LCBtZW1vKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29waWVyID0gZ2V0YXR0cih4LCAiX19kZWVwY29weV9fIiwgTm9uZSkKKyAgICAgICAgICAgIGlmIGNvcGllcjoKKyAgICAgICAgICAgICAgICB5ID0gY29waWVyKG1lbW8pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlZHVjdG9yID0gZGlzcGF0Y2hfdGFibGUuZ2V0KGNscykKKyAgICAgICAgICAgICAgICBpZiByZWR1Y3RvcjoKKyAgICAgICAgICAgICAgICAgICAgcnYgPSByZWR1Y3Rvcih4KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCAiX19yZWR1Y2VfZXhfXyIsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgIGlmIHJlZHVjdG9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSByZWR1Y3RvcigyKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWN0b3IgPSBnZXRhdHRyKHgsICJfX3JlZHVjZV9fIiwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJlZHVjdG9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gcmVkdWN0b3IoKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuKGRlZXApY29weWFibGUgb2JqZWN0IG9mIHR5cGUgJXMiICUgY2xzKQorICAgICAgICAgICAgICAgIHkgPSBfcmVjb25zdHJ1Y3QoeCwgcnYsIDEsIG1lbW8pCisKKyAgICBtZW1vW2RdID0geQorICAgIF9rZWVwX2FsaXZlKHgsIG1lbW8pICMgTWFrZSBzdXJlIHggbGl2ZXMgYXQgbGVhc3QgYXMgbG9uZyBhcyBkCisgICAgcmV0dXJuIHkKKworX2RlZXBjb3B5X2Rpc3BhdGNoID0gZCA9IHt9CisKK2RlZiBfZGVlcGNvcHlfYXRvbWljKHgsIG1lbW8pOgorICAgIHJldHVybiB4CitkW3R5cGUoTm9uZSldID0gX2RlZXBjb3B5X2F0b21pYworZFt0eXBlKEVsbGlwc2lzKV0gPSBfZGVlcGNvcHlfYXRvbWljCitkW2ludF0gPSBfZGVlcGNvcHlfYXRvbWljCitkW2xvbmddID0gX2RlZXBjb3B5X2F0b21pYworZFtmbG9hdF0gPSBfZGVlcGNvcHlfYXRvbWljCitkW2Jvb2xdID0gX2RlZXBjb3B5X2F0b21pYwordHJ5OgorICAgIGRbY29tcGxleF0gPSBfZGVlcGNvcHlfYXRvbWljCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Rbc3RyXSA9IF9kZWVwY29weV9hdG9taWMKK3RyeToKKyAgICBkW3VuaWNvZGVdID0gX2RlZXBjb3B5X2F0b21pYworZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBwYXNzCit0cnk6CisgICAgZFt0eXBlcy5Db2RlVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgcGFzcworZFt0eXBlXSA9IF9kZWVwY29weV9hdG9taWMKK2RbeHJhbmdlXSA9IF9kZWVwY29weV9hdG9taWMKK2RbdHlwZXMuQ2xhc3NUeXBlXSA9IF9kZWVwY29weV9hdG9taWMKK2RbdHlwZXMuQnVpbHRpbkZ1bmN0aW9uVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljCitkW3R5cGVzLkZ1bmN0aW9uVHlwZV0gPSBfZGVlcGNvcHlfYXRvbWljCitkW3dlYWtyZWYucmVmXSA9IF9kZWVwY29weV9hdG9taWMKKworZGVmIF9kZWVwY29weV9saXN0KHgsIG1lbW8pOgorICAgIHkgPSBbXQorICAgIG1lbW9baWQoeCldID0geQorICAgIGZvciBhIGluIHg6CisgICAgICAgIHkuYXBwZW5kKGRlZXBjb3B5KGEsIG1lbW8pKQorICAgIHJldHVybiB5CitkW2xpc3RdID0gX2RlZXBjb3B5X2xpc3QKKworZGVmIF9kZWVwY29weV90dXBsZSh4LCBtZW1vKToKKyAgICB5ID0gW10KKyAgICBmb3IgYSBpbiB4OgorICAgICAgICB5LmFwcGVuZChkZWVwY29weShhLCBtZW1vKSkKKyAgICBkID0gaWQoeCkKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBtZW1vW2RdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBwYXNzCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHgpKToKKyAgICAgICAgaWYgeFtpXSBpcyBub3QgeVtpXToKKyAgICAgICAgICAgIHkgPSB0dXBsZSh5KQorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICB5ID0geAorICAgIG1lbW9bZF0gPSB5CisgICAgcmV0dXJuIHkKK2RbdHVwbGVdID0gX2RlZXBjb3B5X3R1cGxlCisKK2RlZiBfZGVlcGNvcHlfZGljdCh4LCBtZW1vKToKKyAgICB5ID0ge30KKyAgICBtZW1vW2lkKHgpXSA9IHkKKyAgICBmb3Iga2V5LCB2YWx1ZSBpbiB4Lml0ZXJpdGVtcygpOgorICAgICAgICB5W2RlZXBjb3B5KGtleSwgbWVtbyldID0gZGVlcGNvcHkodmFsdWUsIG1lbW8pCisgICAgcmV0dXJuIHkKK2RbZGljdF0gPSBfZGVlcGNvcHlfZGljdAoraWYgUHlTdHJpbmdNYXAgaXMgbm90IE5vbmU6CisgICAgZFtQeVN0cmluZ01hcF0gPSBfZGVlcGNvcHlfZGljdAorCitkZWYgX2RlZXBjb3B5X21ldGhvZCh4LCBtZW1vKTogIyBDb3B5IGluc3RhbmNlIG1ldGhvZHMKKyAgICByZXR1cm4gdHlwZSh4KSh4LmltX2Z1bmMsIGRlZXBjb3B5KHguaW1fc2VsZiwgbWVtbyksIHguaW1fY2xhc3MpCitfZGVlcGNvcHlfZGlzcGF0Y2hbdHlwZXMuTWV0aG9kVHlwZV0gPSBfZGVlcGNvcHlfbWV0aG9kCisKK2RlZiBfa2VlcF9hbGl2ZSh4LCBtZW1vKToKKyAgICAiIiJLZWVwcyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IHggaW4gdGhlIG1lbW8uCisKKyAgICBCZWNhdXNlIHdlIHJlbWVtYmVyIG9iamVjdHMgYnkgdGhlaXIgaWQsIHdlIGhhdmUKKyAgICB0byBhc3N1cmUgdGhhdCBwb3NzaWJseSB0ZW1wb3Jhcnkgb2JqZWN0cyBhcmUga2VwdAorICAgIGFsaXZlIGJ5IHJlZmVyZW5jaW5nIHRoZW0uCisgICAgV2Ugc3RvcmUgYSByZWZlcmVuY2UgYXQgdGhlIGlkIG9mIHRoZSBtZW1vLCB3aGljaCBzaG91bGQKKyAgICBub3JtYWxseSBub3QgYmUgdXNlZCB1bmxlc3Mgc29tZW9uZSB0cmllcyB0byBkZWVwY29weQorICAgIHRoZSBtZW1vIGl0c2VsZi4uLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgbWVtb1tpZChtZW1vKV0uYXBwZW5kKHgpCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAjIGFoYSwgdGhpcyBpcyB0aGUgZmlyc3Qgb25lIDotKQorICAgICAgICBtZW1vW2lkKG1lbW8pXT1beF0KKworZGVmIF9kZWVwY29weV9pbnN0KHgsIG1lbW8pOgorICAgIGlmIGhhc2F0dHIoeCwgJ19fZGVlcGNvcHlfXycpOgorICAgICAgICByZXR1cm4geC5fX2RlZXBjb3B5X18obWVtbykKKyAgICBpZiBoYXNhdHRyKHgsICdfX2dldGluaXRhcmdzX18nKToKKyAgICAgICAgYXJncyA9IHguX19nZXRpbml0YXJnc19fKCkKKyAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pCisgICAgICAgIHkgPSB4Ll9fY2xhc3NfXygqYXJncykKKyAgICBlbHNlOgorICAgICAgICB5ID0gX0VtcHR5Q2xhc3MoKQorICAgICAgICB5Ll9fY2xhc3NfXyA9IHguX19jbGFzc19fCisgICAgbWVtb1tpZCh4KV0gPSB5CisgICAgaWYgaGFzYXR0cih4LCAnX19nZXRzdGF0ZV9fJyk6CisgICAgICAgIHN0YXRlID0geC5fX2dldHN0YXRlX18oKQorICAgIGVsc2U6CisgICAgICAgIHN0YXRlID0geC5fX2RpY3RfXworICAgIHN0YXRlID0gZGVlcGNvcHkoc3RhdGUsIG1lbW8pCisgICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6CisgICAgICAgIHkuX19zZXRzdGF0ZV9fKHN0YXRlKQorICAgIGVsc2U6CisgICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKQorICAgIHJldHVybiB5CitkW3R5cGVzLkluc3RhbmNlVHlwZV0gPSBfZGVlcGNvcHlfaW5zdAorCitkZWYgX3JlY29uc3RydWN0KHgsIGluZm8sIGRlZXAsIG1lbW89Tm9uZSk6CisgICAgaWYgaXNpbnN0YW5jZShpbmZvLCBzdHIpOgorICAgICAgICByZXR1cm4geAorICAgIGFzc2VydCBpc2luc3RhbmNlKGluZm8sIHR1cGxlKQorICAgIGlmIG1lbW8gaXMgTm9uZToKKyAgICAgICAgbWVtbyA9IHt9CisgICAgbiA9IGxlbihpbmZvKQorICAgIGFzc2VydCBuIGluICgyLCAzLCA0LCA1KQorICAgIGNhbGxhYmxlLCBhcmdzID0gaW5mb1s6Ml0KKyAgICBpZiBuID4gMjoKKyAgICAgICAgc3RhdGUgPSBpbmZvWzJdCisgICAgZWxzZToKKyAgICAgICAgc3RhdGUgPSB7fQorICAgIGlmIG4gPiAzOgorICAgICAgICBsaXN0aXRlciA9IGluZm9bM10KKyAgICBlbHNlOgorICAgICAgICBsaXN0aXRlciA9IE5vbmUKKyAgICBpZiBuID4gNDoKKyAgICAgICAgZGljdGl0ZXIgPSBpbmZvWzRdCisgICAgZWxzZToKKyAgICAgICAgZGljdGl0ZXIgPSBOb25lCisgICAgaWYgZGVlcDoKKyAgICAgICAgYXJncyA9IGRlZXBjb3B5KGFyZ3MsIG1lbW8pCisgICAgeSA9IGNhbGxhYmxlKCphcmdzKQorICAgIG1lbW9baWQoeCldID0geQorCisgICAgaWYgc3RhdGU6CisgICAgICAgIGlmIGRlZXA6CisgICAgICAgICAgICBzdGF0ZSA9IGRlZXBjb3B5KHN0YXRlLCBtZW1vKQorICAgICAgICBpZiBoYXNhdHRyKHksICdfX3NldHN0YXRlX18nKToKKyAgICAgICAgICAgIHkuX19zZXRzdGF0ZV9fKHN0YXRlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzdGF0ZSwgdHVwbGUpIGFuZCBsZW4oc3RhdGUpID09IDI6CisgICAgICAgICAgICAgICAgc3RhdGUsIHNsb3RzdGF0ZSA9IHN0YXRlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNsb3RzdGF0ZSA9IE5vbmUKKyAgICAgICAgICAgIGlmIHN0YXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKQorICAgICAgICAgICAgaWYgc2xvdHN0YXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNsb3RzdGF0ZS5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cih5LCBrZXksIHZhbHVlKQorCisgICAgaWYgbGlzdGl0ZXIgaXMgbm90IE5vbmU6CisgICAgICAgIGZvciBpdGVtIGluIGxpc3RpdGVyOgorICAgICAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgICAgICAgICBpdGVtID0gZGVlcGNvcHkoaXRlbSwgbWVtbykKKyAgICAgICAgICAgIHkuYXBwZW5kKGl0ZW0pCisgICAgaWYgZGljdGl0ZXIgaXMgbm90IE5vbmU6CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRpY3RpdGVyOgorICAgICAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgICAgICAgICBrZXkgPSBkZWVwY29weShrZXksIG1lbW8pCisgICAgICAgICAgICAgICAgdmFsdWUgPSBkZWVwY29weSh2YWx1ZSwgbWVtbykKKyAgICAgICAgICAgIHlba2V5XSA9IHZhbHVlCisgICAgcmV0dXJuIHkKKworZGVsIGQKKworZGVsIHR5cGVzCisKKyMgSGVscGVyIGZvciBpbnN0YW5jZSBjcmVhdGlvbiB3aXRob3V0IGNhbGxpbmcgX19pbml0X18KK2NsYXNzIF9FbXB0eUNsYXNzOgorICAgIHBhc3MKKworZGVmIF90ZXN0KCk6CisgICAgbCA9IFtOb25lLCAxLCAyTCwgMy4xNCwgJ3h5enp5JywgKDEsIDJMKSwgWzMuMTQsICdhYmMnXSwKKyAgICAgICAgIHsnYWJjJzogJ0FCQyd9LCAoKSwgW10sIHt9XQorICAgIGwxID0gY29weShsKQorICAgIHByaW50IGwxPT1sCisgICAgbDEgPSBtYXAoY29weSwgbCkKKyAgICBwcmludCBsMT09bAorICAgIGwxID0gZGVlcGNvcHkobCkKKyAgICBwcmludCBsMT09bAorICAgIGNsYXNzIEM6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmc9Tm9uZSk6CisgICAgICAgICAgICBzZWxmLmEgPSAxCisgICAgICAgICAgICBzZWxmLmFyZyA9IGFyZworICAgICAgICAgICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICAgICAgZmlsZSA9IHN5cy5hcmd2WzBdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZpbGUgPSBfX2ZpbGVfXworICAgICAgICAgICAgc2VsZi5mcCA9IG9wZW4oZmlsZSkKKyAgICAgICAgICAgIHNlbGYuZnAuY2xvc2UoKQorICAgICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHsnYSc6IHNlbGYuYSwgJ2FyZyc6IHNlbGYuYXJnfQorICAgICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHN0YXRlLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwga2V5LCB2YWx1ZSkKKyAgICAgICAgZGVmIF9fZGVlcGNvcHlfXyhzZWxmLCBtZW1vPU5vbmUpOgorICAgICAgICAgICAgbmV3ID0gc2VsZi5fX2NsYXNzX18oZGVlcGNvcHkoc2VsZi5hcmcsIG1lbW8pKQorICAgICAgICAgICAgbmV3LmEgPSBzZWxmLmEKKyAgICAgICAgICAgIHJldHVybiBuZXcKKyAgICBjID0gQygnYXJndW1lbnQgc2tldGNoJykKKyAgICBsLmFwcGVuZChjKQorICAgIGwyID0gY29weShsKQorICAgIHByaW50IGwgPT0gbDIKKyAgICBwcmludCBsCisgICAgcHJpbnQgbDIKKyAgICBsMiA9IGRlZXBjb3B5KGwpCisgICAgcHJpbnQgbCA9PSBsMgorICAgIHByaW50IGwKKyAgICBwcmludCBsMgorICAgIGwuYXBwZW5kKHtsWzFdOiBsLCAneHl6JzogbFsyXX0pCisgICAgbDMgPSBjb3B5KGwpCisgICAgaW1wb3J0IHJlcHIKKyAgICBwcmludCBtYXAocmVwci5yZXByLCBsKQorICAgIHByaW50IG1hcChyZXByLnJlcHIsIGwxKQorICAgIHByaW50IG1hcChyZXByLnJlcHIsIGwyKQorICAgIHByaW50IG1hcChyZXByLnJlcHIsIGwzKQorICAgIGwzID0gZGVlcGNvcHkobCkKKyAgICBpbXBvcnQgcmVwcgorICAgIHByaW50IG1hcChyZXByLnJlcHIsIGwpCisgICAgcHJpbnQgbWFwKHJlcHIucmVwciwgbDEpCisgICAgcHJpbnQgbWFwKHJlcHIucmVwciwgbDIpCisgICAgcHJpbnQgbWFwKHJlcHIucmVwciwgbDMpCisgICAgY2xhc3Mgb2RpY3QoZGljdCk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkID0ge30pOgorICAgICAgICAgICAgc2VsZi5hID0gOTkKKyAgICAgICAgICAgIGRpY3QuX19pbml0X18oc2VsZiwgZCkKKyAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGssIGkpOgorICAgICAgICAgICAgZGljdC5fX3NldGl0ZW1fXyhzZWxmLCBrLCBpKQorICAgICAgICAgICAgc2VsZi5hCisgICAgbyA9IG9kaWN0KHsiQSIgOiAiQiJ9KQorICAgIHggPSBkZWVwY29weShvKQorICAgIHByaW50KG8sIHgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb3B5LnB5YyBiL2xpYi9weXRob24yLjcvY29weS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIxNWU2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29weS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb3B5LnB5byBiL2xpYi9weXRob24yLjcvY29weS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2MDYzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29weS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb3B5X3JlZy5weSBiL2xpYi9weXRob24yLjcvY29weV9yZWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxNzE1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29weV9yZWcucHkKQEAgLTAsMCArMSwyMDEgQEAKKyIiIkhlbHBlciB0byBwcm92aWRlIGV4dGVuc2liaWxpdHkgZm9yIHBpY2tsZS9jUGlja2xlLgorCitUaGlzIGlzIG9ubHkgdXNlZnVsIHRvIGFkZCBwaWNrbGUgc3VwcG9ydCBmb3IgZXh0ZW5zaW9uIHR5cGVzIGRlZmluZWQgaW4KK0MsIG5vdCBmb3IgaW5zdGFuY2VzIG9mIHVzZXItZGVmaW5lZCBjbGFzc2VzLgorIiIiCisKK2Zyb20gdHlwZXMgaW1wb3J0IENsYXNzVHlwZSBhcyBfQ2xhc3NUeXBlCisKK19fYWxsX18gPSBbInBpY2tsZSIsICJjb25zdHJ1Y3RvciIsCisgICAgICAgICAgICJhZGRfZXh0ZW5zaW9uIiwgInJlbW92ZV9leHRlbnNpb24iLCAiY2xlYXJfZXh0ZW5zaW9uX2NhY2hlIl0KKworZGlzcGF0Y2hfdGFibGUgPSB7fQorCitkZWYgcGlja2xlKG9iX3R5cGUsIHBpY2tsZV9mdW5jdGlvbiwgY29uc3RydWN0b3Jfb2I9Tm9uZSk6CisgICAgaWYgdHlwZShvYl90eXBlKSBpcyBfQ2xhc3NUeXBlOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNvcHlfcmVnIGlzIG5vdCBpbnRlbmRlZCBmb3IgdXNlIHdpdGggY2xhc3NlcyIpCisKKyAgICBpZiBub3QgaGFzYXR0cihwaWNrbGVfZnVuY3Rpb24sICdfX2NhbGxfXycpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoInJlZHVjdGlvbiBmdW5jdGlvbnMgbXVzdCBiZSBjYWxsYWJsZSIpCisgICAgZGlzcGF0Y2hfdGFibGVbb2JfdHlwZV0gPSBwaWNrbGVfZnVuY3Rpb24KKworICAgICMgVGhlIGNvbnN0cnVjdG9yX29iIGZ1bmN0aW9uIGlzIGEgdmVzdGlnZSBvZiBzYWZlIGZvciB1bnBpY2tsaW5nLgorICAgICMgVGhlcmUgaXMgbm8gcmVhc29uIGZvciB0aGUgY2FsbGVyIHRvIHBhc3MgaXQgYW55bW9yZS4KKyAgICBpZiBjb25zdHJ1Y3Rvcl9vYiBpcyBub3QgTm9uZToKKyAgICAgICAgY29uc3RydWN0b3IoY29uc3RydWN0b3Jfb2IpCisKK2RlZiBjb25zdHJ1Y3RvcihvYmplY3QpOgorICAgIGlmIG5vdCBoYXNhdHRyKG9iamVjdCwgJ19fY2FsbF9fJyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY29uc3RydWN0b3JzIG11c3QgYmUgY2FsbGFibGUiKQorCisjIEV4YW1wbGU6IHByb3ZpZGUgcGlja2xpbmcgc3VwcG9ydCBmb3IgY29tcGxleCBudW1iZXJzLgorCit0cnk6CisgICAgY29tcGxleAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorCisgICAgZGVmIHBpY2tsZV9jb21wbGV4KGMpOgorICAgICAgICByZXR1cm4gY29tcGxleCwgKGMucmVhbCwgYy5pbWFnKQorCisgICAgcGlja2xlKGNvbXBsZXgsIHBpY2tsZV9jb21wbGV4LCBjb21wbGV4KQorCisjIFN1cHBvcnQgZm9yIHBpY2tsaW5nIG5ldy1zdHlsZSBvYmplY3RzCisKK2RlZiBfcmVjb25zdHJ1Y3RvcihjbHMsIGJhc2UsIHN0YXRlKToKKyAgICBpZiBiYXNlIGlzIG9iamVjdDoKKyAgICAgICAgb2JqID0gb2JqZWN0Ll9fbmV3X18oY2xzKQorICAgIGVsc2U6CisgICAgICAgIG9iaiA9IGJhc2UuX19uZXdfXyhjbHMsIHN0YXRlKQorICAgICAgICBpZiBiYXNlLl9faW5pdF9fICE9IG9iamVjdC5fX2luaXRfXzoKKyAgICAgICAgICAgIGJhc2UuX19pbml0X18ob2JqLCBzdGF0ZSkKKyAgICByZXR1cm4gb2JqCisKK19IRUFQVFlQRSA9IDE8PDkKKworIyBQeXRob24gY29kZSBmb3Igb2JqZWN0Ll9fcmVkdWNlX2V4X18gZm9yIHByb3RvY29scyAwIGFuZCAxCisKK2RlZiBfcmVkdWNlX2V4KHNlbGYsIHByb3RvKToKKyAgICBhc3NlcnQgcHJvdG8gPCAyCisgICAgZm9yIGJhc2UgaW4gc2VsZi5fX2NsYXNzX18uX19tcm9fXzoKKyAgICAgICAgaWYgaGFzYXR0cihiYXNlLCAnX19mbGFnc19fJykgYW5kIG5vdCBiYXNlLl9fZmxhZ3NfXyAmIF9IRUFQVFlQRToKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgYmFzZSA9IG9iamVjdCAjIG5vdCByZWFsbHkgcmVhY2hhYmxlCisgICAgaWYgYmFzZSBpcyBvYmplY3Q6CisgICAgICAgIHN0YXRlID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIGlmIGJhc2UgaXMgc2VsZi5fX2NsYXNzX186CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJjYW4ndCBwaWNrbGUgJXMgb2JqZWN0cyIgJSBiYXNlLl9fbmFtZV9fCisgICAgICAgIHN0YXRlID0gYmFzZShzZWxmKQorICAgIGFyZ3MgPSAoc2VsZi5fX2NsYXNzX18sIGJhc2UsIHN0YXRlKQorICAgIHRyeToKKyAgICAgICAgZ2V0c3RhdGUgPSBzZWxmLl9fZ2V0c3RhdGVfXworICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAiX19zbG90c19fIiwgTm9uZSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImEgY2xhc3MgdGhhdCBkZWZpbmVzIF9fc2xvdHNfXyB3aXRob3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmaW5pbmcgX19nZXRzdGF0ZV9fIGNhbm5vdCBiZSBwaWNrbGVkIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGljdCA9IHNlbGYuX19kaWN0X18KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgZGljdCA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgICBkaWN0ID0gZ2V0c3RhdGUoKQorICAgIGlmIGRpY3Q6CisgICAgICAgIHJldHVybiBfcmVjb25zdHJ1Y3RvciwgYXJncywgZGljdAorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBfcmVjb25zdHJ1Y3RvciwgYXJncworCisjIEhlbHBlciBmb3IgX19yZWR1Y2VfZXhfXyBwcm90b2NvbCAyCisKK2RlZiBfX25ld29ial9fKGNscywgKmFyZ3MpOgorICAgIHJldHVybiBjbHMuX19uZXdfXyhjbHMsICphcmdzKQorCitkZWYgX3Nsb3RuYW1lcyhjbHMpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc2xvdCBuYW1lcyBmb3IgYSBnaXZlbiBjbGFzcy4KKworICAgIFRoaXMgbmVlZHMgdG8gZmluZCBzbG90cyBkZWZpbmVkIGJ5IHRoZSBjbGFzcyBhbmQgaXRzIGJhc2VzLCBzbyB3ZQorICAgIGNhbid0IHNpbXBseSByZXR1cm4gdGhlIF9fc2xvdHNfXyBhdHRyaWJ1dGUuICBXZSBtdXN0IHdhbGsgZG93bgorICAgIHRoZSBNZXRob2QgUmVzb2x1dGlvbiBPcmRlciBhbmQgY29uY2F0ZW5hdGUgdGhlIF9fc2xvdHNfXyBvZiBlYWNoCisgICAgY2xhc3MgZm91bmQgdGhlcmUuICAoVGhpcyBhc3N1bWVzIGNsYXNzZXMgZG9uJ3QgbW9kaWZ5IHRoZWlyCisgICAgX19zbG90c19fIGF0dHJpYnV0ZSB0byBtaXNyZXByZXNlbnQgdGhlaXIgc2xvdHMgYWZ0ZXIgdGhlIGNsYXNzIGlzCisgICAgZGVmaW5lZC4pCisgICAgIiIiCisKKyAgICAjIEdldCB0aGUgdmFsdWUgZnJvbSBhIGNhY2hlIGluIHRoZSBjbGFzcyBpZiBwb3NzaWJsZQorICAgIG5hbWVzID0gY2xzLl9fZGljdF9fLmdldCgiX19zbG90bmFtZXNfXyIpCisgICAgaWYgbmFtZXMgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBuYW1lcworCisgICAgIyBOb3QgY2FjaGVkIC0tIGNhbGN1bGF0ZSB0aGUgdmFsdWUKKyAgICBuYW1lcyA9IFtdCisgICAgaWYgbm90IGhhc2F0dHIoY2xzLCAiX19zbG90c19fIik6CisgICAgICAgICMgVGhpcyBjbGFzcyBoYXMgbm8gc2xvdHMKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgICMgU2xvdHMgZm91bmQgLS0gZ2F0aGVyIHNsb3QgbmFtZXMgZnJvbSBhbGwgYmFzZSBjbGFzc2VzCisgICAgICAgIGZvciBjIGluIGNscy5fX21yb19fOgorICAgICAgICAgICAgaWYgIl9fc2xvdHNfXyIgaW4gYy5fX2RpY3RfXzoKKyAgICAgICAgICAgICAgICBzbG90cyA9IGMuX19kaWN0X19bJ19fc2xvdHNfXyddCisgICAgICAgICAgICAgICAgIyBpZiBjbGFzcyBoYXMgYSBzaW5nbGUgc2xvdCwgaXQgY2FuIGJlIGdpdmVuIGFzIGEgc3RyaW5nCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzbG90cywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgICAgIHNsb3RzID0gKHNsb3RzLCkKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBzbG90czoKKyAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIGRlc2NyaXB0b3JzCisgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gKCJfX2RpY3RfXyIsICJfX3dlYWtyZWZfXyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgIyBtYW5nbGVkIG5hbWVzCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbmFtZS5zdGFydHN3aXRoKCdfXycpIGFuZCBub3QgbmFtZS5lbmRzd2l0aCgnX18nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFwcGVuZCgnXyVzJXMnICUgKGMuX19uYW1lX18sIG5hbWUpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYXBwZW5kKG5hbWUpCisKKyAgICAjIENhY2hlIHRoZSBvdXRjb21lIGluIHRoZSBjbGFzcyBpZiBhdCBhbGwgcG9zc2libGUKKyAgICB0cnk6CisgICAgICAgIGNscy5fX3Nsb3RuYW1lc19fID0gbmFtZXMKKyAgICBleGNlcHQ6CisgICAgICAgIHBhc3MgIyBCdXQgZG9uJ3QgZGllIGlmIHdlIGNhbid0CisKKyAgICByZXR1cm4gbmFtZXMKKworIyBBIHJlZ2lzdHJ5IG9mIGV4dGVuc2lvbiBjb2Rlcy4gIFRoaXMgaXMgYW4gYWQtaG9jIGNvbXByZXNzaW9uCisjIG1lY2hhbmlzbS4gIFdoZW5ldmVyIGEgZ2xvYmFsIHJlZmVyZW5jZSB0byA8bW9kdWxlPiwgPG5hbWU+IGlzIGFib3V0CisjIHRvIGJlIHBpY2tsZWQsIHRoZSAoPG1vZHVsZT4sIDxuYW1lPikgdHVwbGUgaXMgbG9va2VkIHVwIGhlcmUgdG8gc2VlCisjIGlmIGl0IGlzIGEgcmVnaXN0ZXJlZCBleHRlbnNpb24gY29kZSBmb3IgaXQuICBFeHRlbnNpb24gY29kZXMgYXJlCisjIHVuaXZlcnNhbCwgc28gdGhhdCB0aGUgbWVhbmluZyBvZiBhIHBpY2tsZSBkb2VzIG5vdCBkZXBlbmQgb24KKyMgY29udGV4dC4gIChUaGVyZSBhcmUgYWxzbyBzb21lIGNvZGVzIHJlc2VydmVkIGZvciBsb2NhbCB1c2UgdGhhdAorIyBkb24ndCBoYXZlIHRoaXMgcmVzdHJpY3Rpb24uKSAgQ29kZXMgYXJlIHBvc2l0aXZlIGludHM7IDAgaXMKKyMgcmVzZXJ2ZWQuCisKK19leHRlbnNpb25fcmVnaXN0cnkgPSB7fSAgICAgICAgICAgICAgICAjIGtleSAtPiBjb2RlCitfaW52ZXJ0ZWRfcmVnaXN0cnkgPSB7fSAgICAgICAgICAgICAgICAgIyBjb2RlIC0+IGtleQorX2V4dGVuc2lvbl9jYWNoZSA9IHt9ICAgICAgICAgICAgICAgICAgICMgY29kZSAtPiBvYmplY3QKKyMgRG9uJ3QgZXZlciByZWJpbmQgdGhvc2UgbmFtZXM6ICBjUGlja2xlIGdyYWJzIGEgcmVmZXJlbmNlIHRvIHRoZW0gd2hlbgorIyBpdCdzIGluaXRpYWxpemVkLCBhbmQgd29uJ3Qgc2VlIGEgcmViaW5kaW5nLgorCitkZWYgYWRkX2V4dGVuc2lvbihtb2R1bGUsIG5hbWUsIGNvZGUpOgorICAgICIiIlJlZ2lzdGVyIGFuIGV4dGVuc2lvbiBjb2RlLiIiIgorICAgIGNvZGUgPSBpbnQoY29kZSkKKyAgICBpZiBub3QgMSA8PSBjb2RlIDw9IDB4N2ZmZmZmZmY6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJjb2RlIG91dCBvZiByYW5nZSIKKyAgICBrZXkgPSAobW9kdWxlLCBuYW1lKQorICAgIGlmIChfZXh0ZW5zaW9uX3JlZ2lzdHJ5LmdldChrZXkpID09IGNvZGUgYW5kCisgICAgICAgIF9pbnZlcnRlZF9yZWdpc3RyeS5nZXQoY29kZSkgPT0ga2V5KToKKyAgICAgICAgcmV0dXJuICMgUmVkdW5kYW50IHJlZ2lzdHJhdGlvbnMgYXJlIGJlbmlnbgorICAgIGlmIGtleSBpbiBfZXh0ZW5zaW9uX3JlZ2lzdHJ5OgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJrZXkgJXMgaXMgYWxyZWFkeSByZWdpc3RlcmVkIHdpdGggY29kZSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChrZXksIF9leHRlbnNpb25fcmVnaXN0cnlba2V5XSkpCisgICAgaWYgY29kZSBpbiBfaW52ZXJ0ZWRfcmVnaXN0cnk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNvZGUgJXMgaXMgYWxyZWFkeSBpbiB1c2UgZm9yIGtleSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChjb2RlLCBfaW52ZXJ0ZWRfcmVnaXN0cnlbY29kZV0pKQorICAgIF9leHRlbnNpb25fcmVnaXN0cnlba2V5XSA9IGNvZGUKKyAgICBfaW52ZXJ0ZWRfcmVnaXN0cnlbY29kZV0gPSBrZXkKKworZGVmIHJlbW92ZV9leHRlbnNpb24obW9kdWxlLCBuYW1lLCBjb2RlKToKKyAgICAiIiJVbnJlZ2lzdGVyIGFuIGV4dGVuc2lvbiBjb2RlLiAgRm9yIHRlc3Rpbmcgb25seS4iIiIKKyAgICBrZXkgPSAobW9kdWxlLCBuYW1lKQorICAgIGlmIChfZXh0ZW5zaW9uX3JlZ2lzdHJ5LmdldChrZXkpICE9IGNvZGUgb3IKKyAgICAgICAgX2ludmVydGVkX3JlZ2lzdHJ5LmdldChjb2RlKSAhPSBrZXkpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJrZXkgJXMgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBjb2RlICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGtleSwgY29kZSkpCisgICAgZGVsIF9leHRlbnNpb25fcmVnaXN0cnlba2V5XQorICAgIGRlbCBfaW52ZXJ0ZWRfcmVnaXN0cnlbY29kZV0KKyAgICBpZiBjb2RlIGluIF9leHRlbnNpb25fY2FjaGU6CisgICAgICAgIGRlbCBfZXh0ZW5zaW9uX2NhY2hlW2NvZGVdCisKK2RlZiBjbGVhcl9leHRlbnNpb25fY2FjaGUoKToKKyAgICBfZXh0ZW5zaW9uX2NhY2hlLmNsZWFyKCkKKworIyBTdGFuZGFyZCBleHRlbnNpb24gY29kZSBhc3NpZ25tZW50cworCisjIFJlc2VydmVkIHJhbmdlcworCisjIEZpcnN0ICBMYXN0IENvdW50ICBQdXJwb3NlCisjICAgICAxICAgMTI3ICAgMTI3ICBSZXNlcnZlZCBmb3IgUHl0aG9uIHN0YW5kYXJkIGxpYnJhcnkKKyMgICAxMjggICAxOTEgICAgNjQgIFJlc2VydmVkIGZvciBab3BlCisjICAgMTkyICAgMjM5ICAgIDQ4ICBSZXNlcnZlZCBmb3IgM3JkIHBhcnRpZXMKKyMgICAyNDAgICAyNTUgICAgMTYgIFJlc2VydmVkIGZvciBwcml2YXRlIHVzZSAod2lsbCBuZXZlciBiZSBhc3NpZ25lZCkKKyMgICAyNTYgICBJbmYgICBJbmYgIFJlc2VydmVkIGZvciBmdXR1cmUgYXNzaWdubWVudAorCisjIEV4dGVuc2lvbiBjb2RlcyBhcmUgYXNzaWduZWQgYnkgdGhlIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb3B5X3JlZy5weWMgYi9saWIvcHl0aG9uMi43L2NvcHlfcmVnLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2ZiNjc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb3B5X3JlZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb3B5X3JlZy5weW8gYi9saWIvcHl0aG9uMi43L2NvcHlfcmVnLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU3OTAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb3B5X3JlZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jc3YucHkgYi9saWIvcHl0aG9uMi43L2Nzdi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODRlZDdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jc3YucHkKQEAgLTAsMCArMSw0NTEgQEAKKworIiIiCitjc3YucHkgLSByZWFkL3dyaXRlL2ludmVzdGlnYXRlIENTViBmaWxlcworIiIiCisKK2ltcG9ydCByZQorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQorZnJvbSBfY3N2IGltcG9ydCBFcnJvciwgX192ZXJzaW9uX18sIHdyaXRlciwgcmVhZGVyLCByZWdpc3Rlcl9kaWFsZWN0LCBcCisgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfZGlhbGVjdCwgZ2V0X2RpYWxlY3QsIGxpc3RfZGlhbGVjdHMsIFwKKyAgICAgICAgICAgICAgICAgZmllbGRfc2l6ZV9saW1pdCwgXAorICAgICAgICAgICAgICAgICBRVU9URV9NSU5JTUFMLCBRVU9URV9BTEwsIFFVT1RFX05PTk5VTUVSSUMsIFFVT1RFX05PTkUsIFwKKyAgICAgICAgICAgICAgICAgX19kb2NfXworZnJvbSBfY3N2IGltcG9ydCBEaWFsZWN0IGFzIF9EaWFsZWN0CisKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitfX2FsbF9fID0gWyAiUVVPVEVfTUlOSU1BTCIsICJRVU9URV9BTEwiLCAiUVVPVEVfTk9OTlVNRVJJQyIsICJRVU9URV9OT05FIiwKKyAgICAgICAgICAgICJFcnJvciIsICJEaWFsZWN0IiwgIl9fZG9jX18iLCAiZXhjZWwiLCAiZXhjZWxfdGFiIiwKKyAgICAgICAgICAgICJmaWVsZF9zaXplX2xpbWl0IiwgInJlYWRlciIsICJ3cml0ZXIiLAorICAgICAgICAgICAgInJlZ2lzdGVyX2RpYWxlY3QiLCAiZ2V0X2RpYWxlY3QiLCAibGlzdF9kaWFsZWN0cyIsICJTbmlmZmVyIiwKKyAgICAgICAgICAgICJ1bnJlZ2lzdGVyX2RpYWxlY3QiLCAiX192ZXJzaW9uX18iLCAiRGljdFJlYWRlciIsICJEaWN0V3JpdGVyIiBdCisKK2NsYXNzIERpYWxlY3Q6CisgICAgIiIiRGVzY3JpYmUgYW4gRXhjZWwgZGlhbGVjdC4KKworICAgIFRoaXMgbXVzdCBiZSBzdWJjbGFzc2VkIChzZWUgY3N2LmV4Y2VsKS4gIFZhbGlkIGF0dHJpYnV0ZXMgYXJlOgorICAgIGRlbGltaXRlciwgcXVvdGVjaGFyLCBlc2NhcGVjaGFyLCBkb3VibGVxdW90ZSwgc2tpcGluaXRpYWxzcGFjZSwKKyAgICBsaW5ldGVybWluYXRvciwgcXVvdGluZy4KKworICAgICIiIgorICAgIF9uYW1lID0gIiIKKyAgICBfdmFsaWQgPSBGYWxzZQorICAgICMgcGxhY2Vob2xkZXJzCisgICAgZGVsaW1pdGVyID0gTm9uZQorICAgIHF1b3RlY2hhciA9IE5vbmUKKyAgICBlc2NhcGVjaGFyID0gTm9uZQorICAgIGRvdWJsZXF1b3RlID0gTm9uZQorICAgIHNraXBpbml0aWFsc3BhY2UgPSBOb25lCisgICAgbGluZXRlcm1pbmF0b3IgPSBOb25lCisgICAgcXVvdGluZyA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fX2NsYXNzX18gIT0gRGlhbGVjdDoKKyAgICAgICAgICAgIHNlbGYuX3ZhbGlkID0gVHJ1ZQorICAgICAgICBzZWxmLl92YWxpZGF0ZSgpCisKKyAgICBkZWYgX3ZhbGlkYXRlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBfRGlhbGVjdChzZWxmKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlOgorICAgICAgICAgICAgIyBXZSBkbyB0aGlzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHkyLjMKKyAgICAgICAgICAgIHJhaXNlIEVycm9yKHN0cihlKSkKKworY2xhc3MgZXhjZWwoRGlhbGVjdCk6CisgICAgIiIiRGVzY3JpYmUgdGhlIHVzdWFsIHByb3BlcnRpZXMgb2YgRXhjZWwtZ2VuZXJhdGVkIENTViBmaWxlcy4iIiIKKyAgICBkZWxpbWl0ZXIgPSAnLCcKKyAgICBxdW90ZWNoYXIgPSAnIicKKyAgICBkb3VibGVxdW90ZSA9IFRydWUKKyAgICBza2lwaW5pdGlhbHNwYWNlID0gRmFsc2UKKyAgICBsaW5ldGVybWluYXRvciA9ICdcclxuJworICAgIHF1b3RpbmcgPSBRVU9URV9NSU5JTUFMCityZWdpc3Rlcl9kaWFsZWN0KCJleGNlbCIsIGV4Y2VsKQorCitjbGFzcyBleGNlbF90YWIoZXhjZWwpOgorICAgICIiIkRlc2NyaWJlIHRoZSB1c3VhbCBwcm9wZXJ0aWVzIG9mIEV4Y2VsLWdlbmVyYXRlZCBUQUItZGVsaW1pdGVkIGZpbGVzLiIiIgorICAgIGRlbGltaXRlciA9ICdcdCcKK3JlZ2lzdGVyX2RpYWxlY3QoImV4Y2VsLXRhYiIsIGV4Y2VsX3RhYikKKworCitjbGFzcyBEaWN0UmVhZGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmLCBmaWVsZG5hbWVzPU5vbmUsIHJlc3RrZXk9Tm9uZSwgcmVzdHZhbD1Ob25lLAorICAgICAgICAgICAgICAgICBkaWFsZWN0PSJleGNlbCIsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICBzZWxmLl9maWVsZG5hbWVzID0gZmllbGRuYW1lcyAgICMgbGlzdCBvZiBrZXlzIGZvciB0aGUgZGljdAorICAgICAgICBzZWxmLnJlc3RrZXkgPSByZXN0a2V5ICAgICAgICAgICMga2V5IHRvIGNhdGNoIGxvbmcgcm93cworICAgICAgICBzZWxmLnJlc3R2YWwgPSByZXN0dmFsICAgICAgICAgICMgZGVmYXVsdCB2YWx1ZSBmb3Igc2hvcnQgcm93cworICAgICAgICBzZWxmLnJlYWRlciA9IHJlYWRlcihmLCBkaWFsZWN0LCAqYXJncywgKiprd2RzKQorICAgICAgICBzZWxmLmRpYWxlY3QgPSBkaWFsZWN0CisgICAgICAgIHNlbGYubGluZV9udW0gPSAwCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZmllbGRuYW1lcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZmllbGRuYW1lcyBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpZWxkbmFtZXMgPSBzZWxmLnJlYWRlci5uZXh0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5saW5lX251bSA9IHNlbGYucmVhZGVyLmxpbmVfbnVtCisgICAgICAgIHJldHVybiBzZWxmLl9maWVsZG5hbWVzCisKKyAgICBAZmllbGRuYW1lcy5zZXR0ZXIKKyAgICBkZWYgZmllbGRuYW1lcyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYuX2ZpZWxkbmFtZXMgPSB2YWx1ZQorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYubGluZV9udW0gPT0gMDoKKyAgICAgICAgICAgICMgVXNlZCBvbmx5IGZvciBpdHMgc2lkZSBlZmZlY3QuCisgICAgICAgICAgICBzZWxmLmZpZWxkbmFtZXMKKyAgICAgICAgcm93ID0gc2VsZi5yZWFkZXIubmV4dCgpCisgICAgICAgIHNlbGYubGluZV9udW0gPSBzZWxmLnJlYWRlci5saW5lX251bQorCisgICAgICAgICMgdW5saWtlIHRoZSBiYXNpYyByZWFkZXIsIHdlIHByZWZlciBub3QgdG8gcmV0dXJuIGJsYW5rcywKKyAgICAgICAgIyBiZWNhdXNlIHdlIHdpbGwgdHlwaWNhbGx5IHdpbmQgdXAgd2l0aCBhIGRpY3QgZnVsbCBvZiBOb25lCisgICAgICAgICMgdmFsdWVzCisgICAgICAgIHdoaWxlIHJvdyA9PSBbXToKKyAgICAgICAgICAgIHJvdyA9IHNlbGYucmVhZGVyLm5leHQoKQorICAgICAgICBkID0gZGljdCh6aXAoc2VsZi5maWVsZG5hbWVzLCByb3cpKQorICAgICAgICBsZiA9IGxlbihzZWxmLmZpZWxkbmFtZXMpCisgICAgICAgIGxyID0gbGVuKHJvdykKKyAgICAgICAgaWYgbGYgPCBscjoKKyAgICAgICAgICAgIGRbc2VsZi5yZXN0a2V5XSA9IHJvd1tsZjpdCisgICAgICAgIGVsaWYgbGYgPiBscjoKKyAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5maWVsZG5hbWVzW2xyOl06CisgICAgICAgICAgICAgICAgZFtrZXldID0gc2VsZi5yZXN0dmFsCisgICAgICAgIHJldHVybiBkCisKKworY2xhc3MgRGljdFdyaXRlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZiwgZmllbGRuYW1lcywgcmVzdHZhbD0iIiwgZXh0cmFzYWN0aW9uPSJyYWlzZSIsCisgICAgICAgICAgICAgICAgIGRpYWxlY3Q9ImV4Y2VsIiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIHNlbGYuZmllbGRuYW1lcyA9IGZpZWxkbmFtZXMgICAgIyBsaXN0IG9mIGtleXMgZm9yIHRoZSBkaWN0CisgICAgICAgIHNlbGYucmVzdHZhbCA9IHJlc3R2YWwgICAgICAgICAgIyBmb3Igd3JpdGluZyBzaG9ydCBkaWN0cworICAgICAgICBpZiBleHRyYXNhY3Rpb24ubG93ZXIoKSBub3QgaW4gKCJyYWlzZSIsICJpZ25vcmUiKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICgiZXh0cmFzYWN0aW9uICglcykgbXVzdCBiZSAncmFpc2UnIG9yICdpZ25vcmUnIiAlCisgICAgICAgICAgICAgICAgICAgZXh0cmFzYWN0aW9uKQorICAgICAgICBzZWxmLmV4dHJhc2FjdGlvbiA9IGV4dHJhc2FjdGlvbgorICAgICAgICBzZWxmLndyaXRlciA9IHdyaXRlcihmLCBkaWFsZWN0LCAqYXJncywgKiprd2RzKQorCisgICAgZGVmIHdyaXRlaGVhZGVyKHNlbGYpOgorICAgICAgICBoZWFkZXIgPSBkaWN0KHppcChzZWxmLmZpZWxkbmFtZXMsIHNlbGYuZmllbGRuYW1lcykpCisgICAgICAgIHNlbGYud3JpdGVyb3coaGVhZGVyKQorCisgICAgZGVmIF9kaWN0X3RvX2xpc3Qoc2VsZiwgcm93ZGljdCk6CisgICAgICAgIGlmIHNlbGYuZXh0cmFzYWN0aW9uID09ICJyYWlzZSI6CisgICAgICAgICAgICB3cm9uZ19maWVsZHMgPSBbayBmb3IgayBpbiByb3dkaWN0IGlmIGsgbm90IGluIHNlbGYuZmllbGRuYW1lc10KKyAgICAgICAgICAgIGlmIHdyb25nX2ZpZWxkczoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJkaWN0IGNvbnRhaW5zIGZpZWxkcyBub3QgaW4gZmllbGRuYW1lczogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCAiLmpvaW4od3JvbmdfZmllbGRzKSkKKyAgICAgICAgcmV0dXJuIFtyb3dkaWN0LmdldChrZXksIHNlbGYucmVzdHZhbCkgZm9yIGtleSBpbiBzZWxmLmZpZWxkbmFtZXNdCisKKyAgICBkZWYgd3JpdGVyb3coc2VsZiwgcm93ZGljdCk6CisgICAgICAgIHJldHVybiBzZWxmLndyaXRlci53cml0ZXJvdyhzZWxmLl9kaWN0X3RvX2xpc3Qocm93ZGljdCkpCisKKyAgICBkZWYgd3JpdGVyb3dzKHNlbGYsIHJvd2RpY3RzKToKKyAgICAgICAgcm93cyA9IFtdCisgICAgICAgIGZvciByb3dkaWN0IGluIHJvd2RpY3RzOgorICAgICAgICAgICAgcm93cy5hcHBlbmQoc2VsZi5fZGljdF90b19saXN0KHJvd2RpY3QpKQorICAgICAgICByZXR1cm4gc2VsZi53cml0ZXIud3JpdGVyb3dzKHJvd3MpCisKKyMgR3VhcmQgU25pZmZlcidzIHR5cGUgY2hlY2tpbmcgYWdhaW5zdCBidWlsZHMgdGhhdCBleGNsdWRlIGNvbXBsZXgoKQordHJ5OgorICAgIGNvbXBsZXgKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgY29tcGxleCA9IGZsb2F0CisKK2NsYXNzIFNuaWZmZXI6CisgICAgJycnCisgICAgIlNuaWZmcyIgdGhlIGZvcm1hdCBvZiBhIENTViBmaWxlIChpLmUuIGRlbGltaXRlciwgcXVvdGVjaGFyKQorICAgIFJldHVybnMgYSBEaWFsZWN0IG9iamVjdC4KKyAgICAnJycKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgaW4gY2FzZSB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBvc3NpYmxlIGRlbGltaXRlcgorICAgICAgICBzZWxmLnByZWZlcnJlZCA9IFsnLCcsICdcdCcsICc7JywgJyAnLCAnOiddCisKKworICAgIGRlZiBzbmlmZihzZWxmLCBzYW1wbGUsIGRlbGltaXRlcnM9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIGEgZGlhbGVjdCAob3IgTm9uZSkgY29ycmVzcG9uZGluZyB0byB0aGUgc2FtcGxlCisgICAgICAgICIiIgorCisgICAgICAgIHF1b3RlY2hhciwgZG91YmxlcXVvdGUsIGRlbGltaXRlciwgc2tpcGluaXRpYWxzcGFjZSA9IFwKKyAgICAgICAgICAgICAgICAgICBzZWxmLl9ndWVzc19xdW90ZV9hbmRfZGVsaW1pdGVyKHNhbXBsZSwgZGVsaW1pdGVycykKKyAgICAgICAgaWYgbm90IGRlbGltaXRlcjoKKyAgICAgICAgICAgIGRlbGltaXRlciwgc2tpcGluaXRpYWxzcGFjZSA9IHNlbGYuX2d1ZXNzX2RlbGltaXRlcihzYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVycykKKworICAgICAgICBpZiBub3QgZGVsaW1pdGVyOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJDb3VsZCBub3QgZGV0ZXJtaW5lIGRlbGltaXRlciIKKworICAgICAgICBjbGFzcyBkaWFsZWN0KERpYWxlY3QpOgorICAgICAgICAgICAgX25hbWUgPSAic25pZmZlZCIKKyAgICAgICAgICAgIGxpbmV0ZXJtaW5hdG9yID0gJ1xyXG4nCisgICAgICAgICAgICBxdW90aW5nID0gUVVPVEVfTUlOSU1BTAorICAgICAgICAgICAgIyBlc2NhcGVjaGFyID0gJycKKworICAgICAgICBkaWFsZWN0LmRvdWJsZXF1b3RlID0gZG91YmxlcXVvdGUKKyAgICAgICAgZGlhbGVjdC5kZWxpbWl0ZXIgPSBkZWxpbWl0ZXIKKyAgICAgICAgIyBfY3N2LnJlYWRlciB3b24ndCBhY2NlcHQgYSBxdW90ZWNoYXIgb2YgJycKKyAgICAgICAgZGlhbGVjdC5xdW90ZWNoYXIgPSBxdW90ZWNoYXIgb3IgJyInCisgICAgICAgIGRpYWxlY3Quc2tpcGluaXRpYWxzcGFjZSA9IHNraXBpbml0aWFsc3BhY2UKKworICAgICAgICByZXR1cm4gZGlhbGVjdAorCisKKyAgICBkZWYgX2d1ZXNzX3F1b3RlX2FuZF9kZWxpbWl0ZXIoc2VsZiwgZGF0YSwgZGVsaW1pdGVycyk6CisgICAgICAgICIiIgorICAgICAgICBMb29rcyBmb3IgdGV4dCBlbmNsb3NlZCBiZXR3ZWVuIHR3byBpZGVudGljYWwgcXVvdGVzCisgICAgICAgICh0aGUgcHJvYmFibGUgcXVvdGVjaGFyKSB3aGljaCBhcmUgcHJlY2VkZWQgYW5kIGZvbGxvd2VkCisgICAgICAgIGJ5IHRoZSBzYW1lIGNoYXJhY3RlciAodGhlIHByb2JhYmxlIGRlbGltaXRlcikuCisgICAgICAgIEZvciBleGFtcGxlOgorICAgICAgICAgICAgICAgICAgICAgICAgICwnc29tZSB0ZXh0JywKKyAgICAgICAgVGhlIHF1b3RlIHdpdGggdGhlIG1vc3Qgd2lucywgc2FtZSB3aXRoIHRoZSBkZWxpbWl0ZXIuCisgICAgICAgIElmIHRoZXJlIGlzIG5vIHF1b3RlY2hhciB0aGUgZGVsaW1pdGVyIGNhbid0IGJlIGRldGVybWluZWQKKyAgICAgICAgdGhpcyB3YXkuCisgICAgICAgICIiIgorCisgICAgICAgIG1hdGNoZXMgPSBbXQorICAgICAgICBmb3IgcmVzdHIgaW4gKCcoP1A8ZGVsaW0+W15cd1xuIlwnXSkoP1A8c3BhY2U+ID8pKD9QPHF1b3RlPlsiXCddKS4qPyg/UD1xdW90ZSkoP1A9ZGVsaW0pJywgIyAsIi4qPyIsCisgICAgICAgICAgICAgICAgICAgICAgJyg/Ol58XG4pKD9QPHF1b3RlPlsiXCddKS4qPyg/UD1xdW90ZSkoP1A8ZGVsaW0+W15cd1xuIlwnXSkoP1A8c3BhY2U+ID8pJywgICAjICAiLio/IiwKKyAgICAgICAgICAgICAgICAgICAgICAnKD9QPGRlbGltPj5bXlx3XG4iXCddKSg/UDxzcGFjZT4gPykoP1A8cXVvdGU+WyJcJ10pLio/KD9QPXF1b3RlKSg/OiR8XG4pJywgICMgLCIuKj8iCisgICAgICAgICAgICAgICAgICAgICAgJyg/Ol58XG4pKD9QPHF1b3RlPlsiXCddKS4qPyg/UD1xdW90ZSkoPzokfFxuKScpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAiLio/IiAobm8gZGVsaW0sIG5vIHNwYWNlKQorICAgICAgICAgICAgcmVnZXhwID0gcmUuY29tcGlsZShyZXN0ciwgcmUuRE9UQUxMIHwgcmUuTVVMVElMSU5FKQorICAgICAgICAgICAgbWF0Y2hlcyA9IHJlZ2V4cC5maW5kYWxsKGRhdGEpCisgICAgICAgICAgICBpZiBtYXRjaGVzOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaWYgbm90IG1hdGNoZXM6CisgICAgICAgICAgICAjIChxdW90ZWNoYXIsIGRvdWJsZXF1b3RlLCBkZWxpbWl0ZXIsIHNraXBpbml0aWFsc3BhY2UpCisgICAgICAgICAgICByZXR1cm4gKCcnLCBGYWxzZSwgTm9uZSwgMCkKKyAgICAgICAgcXVvdGVzID0ge30KKyAgICAgICAgZGVsaW1zID0ge30KKyAgICAgICAgc3BhY2VzID0gMAorICAgICAgICBmb3IgbSBpbiBtYXRjaGVzOgorICAgICAgICAgICAgbiA9IHJlZ2V4cC5ncm91cGluZGV4WydxdW90ZSddIC0gMQorICAgICAgICAgICAga2V5ID0gbVtuXQorICAgICAgICAgICAgaWYga2V5OgorICAgICAgICAgICAgICAgIHF1b3Rlc1trZXldID0gcXVvdGVzLmdldChrZXksIDApICsgMQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG4gPSByZWdleHAuZ3JvdXBpbmRleFsnZGVsaW0nXSAtIDEKKyAgICAgICAgICAgICAgICBrZXkgPSBtW25dCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGtleSBhbmQgKGRlbGltaXRlcnMgaXMgTm9uZSBvciBrZXkgaW4gZGVsaW1pdGVycyk6CisgICAgICAgICAgICAgICAgZGVsaW1zW2tleV0gPSBkZWxpbXMuZ2V0KGtleSwgMCkgKyAxCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbiA9IHJlZ2V4cC5ncm91cGluZGV4WydzcGFjZSddIC0gMQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBtW25dOgorICAgICAgICAgICAgICAgIHNwYWNlcyArPSAxCisKKyAgICAgICAgcXVvdGVjaGFyID0gcmVkdWNlKGxhbWJkYSBhLCBiLCBxdW90ZXMgPSBxdW90ZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAocXVvdGVzW2FdID4gcXVvdGVzW2JdKSBhbmQgYSBvciBiLCBxdW90ZXMua2V5cygpKQorCisgICAgICAgIGlmIGRlbGltczoKKyAgICAgICAgICAgIGRlbGltID0gcmVkdWNlKGxhbWJkYSBhLCBiLCBkZWxpbXMgPSBkZWxpbXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVsaW1zW2FdID4gZGVsaW1zW2JdKSBhbmQgYSBvciBiLCBkZWxpbXMua2V5cygpKQorICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZSA9IGRlbGltc1tkZWxpbV0gPT0gc3BhY2VzCisgICAgICAgICAgICBpZiBkZWxpbSA9PSAnXG4nOiAjIG1vc3QgbGlrZWx5IGEgZmlsZSB3aXRoIGEgc2luZ2xlIGNvbHVtbgorICAgICAgICAgICAgICAgIGRlbGltID0gJycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgdGhlcmUgaXMgKm5vKiBkZWxpbWl0ZXIsIGl0J3MgYSBzaW5nbGUgY29sdW1uIG9mIHF1b3RlZCBkYXRhCisgICAgICAgICAgICBkZWxpbSA9ICcnCisgICAgICAgICAgICBza2lwaW5pdGlhbHNwYWNlID0gMAorCisgICAgICAgICMgaWYgd2Ugc2VlIGFuIGV4dHJhIHF1b3RlIGJldHdlZW4gZGVsaW1pdGVycywgd2UndmUgZ290IGEKKyAgICAgICAgIyBkb3VibGUgcXVvdGVkIGZvcm1hdAorICAgICAgICBkcV9yZWdleHAgPSByZS5jb21waWxlKHIiKCglKGRlbGltKXMpfF4pXFcqJShxdW90ZSlzW14lKGRlbGltKXNcbl0qJShxdW90ZSlzW14lKGRlbGltKXNcbl0qJShxdW90ZSlzXFcqKCglKGRlbGltKXMpfCQpIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2RlbGltJzpkZWxpbSwgJ3F1b3RlJzpxdW90ZWNoYXJ9LCByZS5NVUxUSUxJTkUpCisKKworCisgICAgICAgIGlmIGRxX3JlZ2V4cC5zZWFyY2goZGF0YSk6CisgICAgICAgICAgICBkb3VibGVxdW90ZSA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRvdWJsZXF1b3RlID0gRmFsc2UKKworICAgICAgICByZXR1cm4gKHF1b3RlY2hhciwgZG91YmxlcXVvdGUsIGRlbGltLCBza2lwaW5pdGlhbHNwYWNlKQorCisKKyAgICBkZWYgX2d1ZXNzX2RlbGltaXRlcihzZWxmLCBkYXRhLCBkZWxpbWl0ZXJzKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoZSBkZWxpbWl0ZXIgL3Nob3VsZC8gb2NjdXIgdGhlIHNhbWUgbnVtYmVyIG9mIHRpbWVzIG9uCisgICAgICAgIGVhY2ggcm93LiBIb3dldmVyLCBkdWUgdG8gbWFsZm9ybWVkIGRhdGEsIGl0IG1heSBub3QuIFdlIGRvbid0IHdhbnQKKyAgICAgICAgYW4gYWxsIG9yIG5vdGhpbmcgYXBwcm9hY2gsIHNvIHdlIGFsbG93IGZvciBzbWFsbCB2YXJpYXRpb25zIGluIHRoaXMKKyAgICAgICAgbnVtYmVyLgorICAgICAgICAgIDEpIGJ1aWxkIGEgdGFibGUgb2YgdGhlIGZyZXF1ZW5jeSBvZiBlYWNoIGNoYXJhY3RlciBvbiBldmVyeSBsaW5lLgorICAgICAgICAgIDIpIGJ1aWxkIGEgdGFibGUgb2YgZnJlcXVlbmNpZXMgb2YgdGhpcyBmcmVxdWVuY3kgKG1ldGEtZnJlcXVlbmN5PyksCisgICAgICAgICAgICAgZS5nLiAgJ3ggb2NjdXJyZWQgNSB0aW1lcyBpbiAxMCByb3dzLCA2IHRpbWVzIGluIDEwMDAgcm93cywKKyAgICAgICAgICAgICA3IHRpbWVzIGluIDIgcm93cycKKyAgICAgICAgICAzKSB1c2UgdGhlIG1vZGUgb2YgdGhlIG1ldGEtZnJlcXVlbmN5IHRvIGRldGVybWluZSB0aGUgL2V4cGVjdGVkLworICAgICAgICAgICAgIGZyZXF1ZW5jeSBmb3IgdGhhdCBjaGFyYWN0ZXIKKyAgICAgICAgICA0KSBmaW5kIG91dCBob3cgb2Z0ZW4gdGhlIGNoYXJhY3RlciBhY3R1YWxseSBtZWV0cyB0aGF0IGdvYWwKKyAgICAgICAgICA1KSB0aGUgY2hhcmFjdGVyIHRoYXQgYmVzdCBtZWV0cyBpdHMgZ29hbCBpcyB0aGUgZGVsaW1pdGVyCisgICAgICAgIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCB0aGUgZGF0YSBpcyBldmFsdWF0ZWQgaW4gY2h1bmtzLCBzbyBpdCBjYW4KKyAgICAgICAgdHJ5IGFuZCBldmFsdWF0ZSB0aGUgc21hbGxlc3QgcG9ydGlvbiBvZiB0aGUgZGF0YSBwb3NzaWJsZSwgZXZhbHVhdGluZworICAgICAgICBhZGRpdGlvbmFsIGNodW5rcyBhcyBuZWNlc3NhcnkuCisgICAgICAgICIiIgorCisgICAgICAgIGRhdGEgPSBmaWx0ZXIoTm9uZSwgZGF0YS5zcGxpdCgnXG4nKSkKKworICAgICAgICBhc2NpaSA9IFtjaHIoYykgZm9yIGMgaW4gcmFuZ2UoMTI3KV0gIyA3LWJpdCBBU0NJSQorCisgICAgICAgICMgYnVpbGQgZnJlcXVlbmN5IHRhYmxlcworICAgICAgICBjaHVua0xlbmd0aCA9IG1pbigxMCwgbGVuKGRhdGEpKQorICAgICAgICBpdGVyYXRpb24gPSAwCisgICAgICAgIGNoYXJGcmVxdWVuY3kgPSB7fQorICAgICAgICBtb2RlcyA9IHt9CisgICAgICAgIGRlbGltcyA9IHt9CisgICAgICAgIHN0YXJ0LCBlbmQgPSAwLCBtaW4oY2h1bmtMZW5ndGgsIGxlbihkYXRhKSkKKyAgICAgICAgd2hpbGUgc3RhcnQgPCBsZW4oZGF0YSk6CisgICAgICAgICAgICBpdGVyYXRpb24gKz0gMQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gZGF0YVtzdGFydDplbmRdOgorICAgICAgICAgICAgICAgIGZvciBjaGFyIGluIGFzY2lpOgorICAgICAgICAgICAgICAgICAgICBtZXRhRnJlcXVlbmN5ID0gY2hhckZyZXF1ZW5jeS5nZXQoY2hhciwge30pCisgICAgICAgICAgICAgICAgICAgICMgbXVzdCBjb3VudCBldmVuIGlmIGZyZXF1ZW5jeSBpcyAwCisgICAgICAgICAgICAgICAgICAgIGZyZXEgPSBsaW5lLmNvdW50KGNoYXIpCisgICAgICAgICAgICAgICAgICAgICMgdmFsdWUgaXMgdGhlIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgbWV0YUZyZXF1ZW5jeVtmcmVxXSA9IG1ldGFGcmVxdWVuY3kuZ2V0KGZyZXEsIDApICsgMQorICAgICAgICAgICAgICAgICAgICBjaGFyRnJlcXVlbmN5W2NoYXJdID0gbWV0YUZyZXF1ZW5jeQorCisgICAgICAgICAgICBmb3IgY2hhciBpbiBjaGFyRnJlcXVlbmN5LmtleXMoKToKKyAgICAgICAgICAgICAgICBpdGVtcyA9IGNoYXJGcmVxdWVuY3lbY2hhcl0uaXRlbXMoKQorICAgICAgICAgICAgICAgIGlmIGxlbihpdGVtcykgPT0gMSBhbmQgaXRlbXNbMF1bMF0gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAjIGdldCB0aGUgbW9kZSBvZiB0aGUgZnJlcXVlbmNpZXMKKyAgICAgICAgICAgICAgICBpZiBsZW4oaXRlbXMpID4gMToKKyAgICAgICAgICAgICAgICAgICAgbW9kZXNbY2hhcl0gPSByZWR1Y2UobGFtYmRhIGEsIGI6IGFbMV0gPiBiWzFdIGFuZCBhIG9yIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zKQorICAgICAgICAgICAgICAgICAgICAjIGFkanVzdCB0aGUgbW9kZSAtIHN1YnRyYWN0IHRoZSBzdW0gb2YgYWxsCisgICAgICAgICAgICAgICAgICAgICMgb3RoZXIgZnJlcXVlbmNpZXMKKyAgICAgICAgICAgICAgICAgICAgaXRlbXMucmVtb3ZlKG1vZGVzW2NoYXJdKQorICAgICAgICAgICAgICAgICAgICBtb2Rlc1tjaGFyXSA9IChtb2Rlc1tjaGFyXVswXSwgbW9kZXNbY2hhcl1bMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSByZWR1Y2UobGFtYmRhIGEsIGI6ICgwLCBhWzFdICsgYlsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zKVsxXSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtb2Rlc1tjaGFyXSA9IGl0ZW1zWzBdCisKKyAgICAgICAgICAgICMgYnVpbGQgYSBsaXN0IG9mIHBvc3NpYmxlIGRlbGltaXRlcnMKKyAgICAgICAgICAgIG1vZGVMaXN0ID0gbW9kZXMuaXRlbXMoKQorICAgICAgICAgICAgdG90YWwgPSBmbG9hdChjaHVua0xlbmd0aCAqIGl0ZXJhdGlvbikKKyAgICAgICAgICAgICMgKHJvd3Mgb2YgY29uc2lzdGVudCBkYXRhKSAvIChudW1iZXIgb2Ygcm93cykgPSAxMDAlCisgICAgICAgICAgICBjb25zaXN0ZW5jeSA9IDEuMAorICAgICAgICAgICAgIyBtaW5pbXVtIGNvbnNpc3RlbmN5IHRocmVzaG9sZAorICAgICAgICAgICAgdGhyZXNob2xkID0gMC45CisgICAgICAgICAgICB3aGlsZSBsZW4oZGVsaW1zKSA9PSAwIGFuZCBjb25zaXN0ZW5jeSA+PSB0aHJlc2hvbGQ6CisgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gbW9kZUxpc3Q6CisgICAgICAgICAgICAgICAgICAgIGlmIHZbMF0gPiAwIGFuZCB2WzFdID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodlsxXS90b3RhbCkgPj0gY29uc2lzdGVuY3kgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlbGltaXRlcnMgaXMgTm9uZSBvciBrIGluIGRlbGltaXRlcnMpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbXNba10gPSB2CisgICAgICAgICAgICAgICAgY29uc2lzdGVuY3kgLT0gMC4wMQorCisgICAgICAgICAgICBpZiBsZW4oZGVsaW1zKSA9PSAxOgorICAgICAgICAgICAgICAgIGRlbGltID0gZGVsaW1zLmtleXMoKVswXQorICAgICAgICAgICAgICAgIHNraXBpbml0aWFsc3BhY2UgPSAoZGF0YVswXS5jb3VudChkZWxpbSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0uY291bnQoIiVjICIgJSBkZWxpbSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIChkZWxpbSwgc2tpcGluaXRpYWxzcGFjZSkKKworICAgICAgICAgICAgIyBhbmFseXplIGFub3RoZXIgY2h1bmtMZW5ndGggbGluZXMKKyAgICAgICAgICAgIHN0YXJ0ID0gZW5kCisgICAgICAgICAgICBlbmQgKz0gY2h1bmtMZW5ndGgKKworICAgICAgICBpZiBub3QgZGVsaW1zOgorICAgICAgICAgICAgcmV0dXJuICgnJywgMCkKKworICAgICAgICAjIGlmIHRoZXJlJ3MgbW9yZSB0aGFuIG9uZSwgZmFsbCBiYWNrIHRvIGEgJ3ByZWZlcnJlZCcgbGlzdAorICAgICAgICBpZiBsZW4oZGVsaW1zKSA+IDE6CisgICAgICAgICAgICBmb3IgZCBpbiBzZWxmLnByZWZlcnJlZDoKKyAgICAgICAgICAgICAgICBpZiBkIGluIGRlbGltcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIHNraXBpbml0aWFsc3BhY2UgPSAoZGF0YVswXS5jb3VudChkKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0uY291bnQoIiVjICIgJSBkKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkLCBza2lwaW5pdGlhbHNwYWNlKQorCisgICAgICAgICMgbm90aGluZyBlbHNlIGluZGljYXRlcyBhIHByZWZlcmVuY2UsIHBpY2sgdGhlIGNoYXJhY3RlciB0aGF0CisgICAgICAgICMgZG9taW5hdGVzKD8pCisgICAgICAgIGl0ZW1zID0gWyh2LGspIGZvciAoayx2KSBpbiBkZWxpbXMuaXRlbXMoKV0KKyAgICAgICAgaXRlbXMuc29ydCgpCisgICAgICAgIGRlbGltID0gaXRlbXNbLTFdWzFdCisKKyAgICAgICAgc2tpcGluaXRpYWxzcGFjZSA9IChkYXRhWzBdLmNvdW50KGRlbGltKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0uY291bnQoIiVjICIgJSBkZWxpbSkpCisgICAgICAgIHJldHVybiAoZGVsaW0sIHNraXBpbml0aWFsc3BhY2UpCisKKworICAgIGRlZiBoYXNfaGVhZGVyKHNlbGYsIHNhbXBsZSk6CisgICAgICAgICMgQ3JlYXRlcyBhIGRpY3Rpb25hcnkgb2YgdHlwZXMgb2YgZGF0YSBpbiBlYWNoIGNvbHVtbi4gSWYgYW55CisgICAgICAgICMgY29sdW1uIGlzIG9mIGEgc2luZ2xlIHR5cGUgKHNheSwgaW50ZWdlcnMpLCAqZXhjZXB0KiBmb3IgdGhlIGZpcnN0CisgICAgICAgICMgcm93LCB0aGVuIHRoZSBmaXJzdCByb3cgaXMgcHJlc3VtZWQgdG8gYmUgbGFiZWxzLiBJZiB0aGUgdHlwZQorICAgICAgICAjIGNhbid0IGJlIGRldGVybWluZWQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBzdHJpbmcgaW4gd2hpY2ggY2FzZQorICAgICAgICAjIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyB0aGUgZGV0ZXJtaW5pbmcgZmFjdG9yOiBpZiBhbGwgb2YgdGhlCisgICAgICAgICMgcm93cyBleGNlcHQgZm9yIHRoZSBmaXJzdCBhcmUgdGhlIHNhbWUgbGVuZ3RoLCBpdCdzIGEgaGVhZGVyLgorICAgICAgICAjIEZpbmFsbHksIGEgJ3ZvdGUnIGlzIHRha2VuIGF0IHRoZSBlbmQgZm9yIGVhY2ggY29sdW1uLCBhZGRpbmcgb3IKKyAgICAgICAgIyBzdWJ0cmFjdGluZyBmcm9tIHRoZSBsaWtlbGlob29kIG9mIHRoZSBmaXJzdCByb3cgYmVpbmcgYSBoZWFkZXIuCisKKyAgICAgICAgcmRyID0gcmVhZGVyKFN0cmluZ0lPKHNhbXBsZSksIHNlbGYuc25pZmYoc2FtcGxlKSkKKworICAgICAgICBoZWFkZXIgPSByZHIubmV4dCgpICMgYXNzdW1lIGZpcnN0IHJvdyBpcyBoZWFkZXIKKworICAgICAgICBjb2x1bW5zID0gbGVuKGhlYWRlcikKKyAgICAgICAgY29sdW1uVHlwZXMgPSB7fQorICAgICAgICBmb3IgaSBpbiByYW5nZShjb2x1bW5zKTogY29sdW1uVHlwZXNbaV0gPSBOb25lCisKKyAgICAgICAgY2hlY2tlZCA9IDAKKyAgICAgICAgZm9yIHJvdyBpbiByZHI6CisgICAgICAgICAgICAjIGFyYml0cmFyeSBudW1iZXIgb2Ygcm93cyB0byBjaGVjaywgdG8ga2VlcCBpdCBzYW5lCisgICAgICAgICAgICBpZiBjaGVja2VkID4gMjA6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNoZWNrZWQgKz0gMQorCisgICAgICAgICAgICBpZiBsZW4ocm93KSAhPSBjb2x1bW5zOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlICMgc2tpcCByb3dzIHRoYXQgaGF2ZSBpcnJlZ3VsYXIgbnVtYmVyIG9mIGNvbHVtbnMKKworICAgICAgICAgICAgZm9yIGNvbCBpbiBjb2x1bW5UeXBlcy5rZXlzKCk6CisKKyAgICAgICAgICAgICAgICBmb3IgdGhpc1R5cGUgaW4gW2ludCwgbG9uZywgZmxvYXQsIGNvbXBsZXhdOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzVHlwZShyb3dbY29sXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgT3ZlcmZsb3dFcnJvcik6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBmYWxsYmFjayB0byBsZW5ndGggb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIHRoaXNUeXBlID0gbGVuKHJvd1tjb2xdKQorCisgICAgICAgICAgICAgICAgIyB0cmVhdCBsb25ncyBhcyBpbnRzCisgICAgICAgICAgICAgICAgaWYgdGhpc1R5cGUgPT0gbG9uZzoKKyAgICAgICAgICAgICAgICAgICAgdGhpc1R5cGUgPSBpbnQKKworICAgICAgICAgICAgICAgIGlmIHRoaXNUeXBlICE9IGNvbHVtblR5cGVzW2NvbF06CisgICAgICAgICAgICAgICAgICAgIGlmIGNvbHVtblR5cGVzW2NvbF0gaXMgTm9uZTogIyBhZGQgbmV3IGNvbHVtbiB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5UeXBlc1tjb2xdID0gdGhpc1R5cGUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdHlwZSBpcyBpbmNvbnNpc3RlbnQsIHJlbW92ZSBjb2x1bW4gZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgIyBjb25zaWRlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgY29sdW1uVHlwZXNbY29sXQorCisgICAgICAgICMgZmluYWxseSwgY29tcGFyZSByZXN1bHRzIGFnYWluc3QgZmlyc3Qgcm93IGFuZCAidm90ZSIKKyAgICAgICAgIyBvbiB3aGV0aGVyIGl0J3MgYSBoZWFkZXIKKyAgICAgICAgaGFzSGVhZGVyID0gMAorICAgICAgICBmb3IgY29sLCBjb2xUeXBlIGluIGNvbHVtblR5cGVzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB0eXBlKGNvbFR5cGUpID09IHR5cGUoMCk6ICMgaXQncyBhIGxlbmd0aAorICAgICAgICAgICAgICAgIGlmIGxlbihoZWFkZXJbY29sXSkgIT0gY29sVHlwZToKKyAgICAgICAgICAgICAgICAgICAgaGFzSGVhZGVyICs9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBoYXNIZWFkZXIgLT0gMQorICAgICAgICAgICAgZWxzZTogIyBhdHRlbXB0IHR5cGVjYXN0CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjb2xUeXBlKGhlYWRlcltjb2xdKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgaGFzSGVhZGVyICs9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBoYXNIZWFkZXIgLT0gMQorCisgICAgICAgIHJldHVybiBoYXNIZWFkZXIgPiAwCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Nzdi5weWMgYi9saWIvcHl0aG9uMi43L2Nzdi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwODViMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3N2LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Nzdi5weW8gYi9saWIvcHl0aG9uMi43L2Nzdi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwODViMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3N2LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTdjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDU1NSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIiIiY3JlYXRlIGFuZCBtYW5pcHVsYXRlIEMgZGF0YSB0eXBlcyBpbiBQeXRob24iIiIKKworaW1wb3J0IG9zIGFzIF9vcywgc3lzIGFzIF9zeXMKKworX192ZXJzaW9uX18gPSAiMS4xLjAiCisKK2Zyb20gX2N0eXBlcyBpbXBvcnQgVW5pb24sIFN0cnVjdHVyZSwgQXJyYXkKK2Zyb20gX2N0eXBlcyBpbXBvcnQgX1BvaW50ZXIKK2Zyb20gX2N0eXBlcyBpbXBvcnQgQ0Z1bmNQdHIgYXMgX0NGdW5jUHRyCitmcm9tIF9jdHlwZXMgaW1wb3J0IF9fdmVyc2lvbl9fIGFzIF9jdHlwZXNfdmVyc2lvbgorZnJvbSBfY3R5cGVzIGltcG9ydCBSVExEX0xPQ0FMLCBSVExEX0dMT0JBTAorZnJvbSBfY3R5cGVzIGltcG9ydCBBcmd1bWVudEVycm9yCisKK2Zyb20gc3RydWN0IGltcG9ydCBjYWxjc2l6ZSBhcyBfY2FsY3NpemUKKworaWYgX192ZXJzaW9uX18gIT0gX2N0eXBlc192ZXJzaW9uOgorICAgIHJhaXNlIEV4Y2VwdGlvbigiVmVyc2lvbiBudW1iZXIgbWlzbWF0Y2giLCBfX3ZlcnNpb25fXywgX2N0eXBlc192ZXJzaW9uKQorCitpZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBGb3JtYXRFcnJvcgorCitERUZBVUxUX01PREUgPSBSVExEX0xPQ0FMCitpZiBfb3MubmFtZSA9PSAicG9zaXgiIGFuZCBfc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgICMgT24gT1MgWCAxMC4zLCB3ZSB1c2UgUlRMRF9HTE9CQUwgYXMgZGVmYXVsdCBtb2RlCisgICAgIyBiZWNhdXNlIFJUTERfTE9DQUwgZG9lcyBub3Qgd29yayBhdCBsZWFzdCBvbiBzb21lCisgICAgIyBsaWJyYXJpZXMuICBPUyBYIDEwLjMgaXMgRGFyd2luIDcsIHNvIHdlIGNoZWNrIGZvcgorICAgICMgdGhhdC4KKworICAgIGlmIGludChfb3MudW5hbWUoKVsyXS5zcGxpdCgnLicpWzBdKSA8IDg6CisgICAgICAgIERFRkFVTFRfTU9ERSA9IFJUTERfR0xPQkFMCisKK2Zyb20gX2N0eXBlcyBpbXBvcnQgRlVOQ0ZMQUdfQ0RFQ0wgYXMgX0ZVTkNGTEFHX0NERUNMLCBcCisgICAgIEZVTkNGTEFHX1BZVEhPTkFQSSBhcyBfRlVOQ0ZMQUdfUFlUSE9OQVBJLCBcCisgICAgIEZVTkNGTEFHX1VTRV9FUlJOTyBhcyBfRlVOQ0ZMQUdfVVNFX0VSUk5PLCBcCisgICAgIEZVTkNGTEFHX1VTRV9MQVNURVJST1IgYXMgX0ZVTkNGTEFHX1VTRV9MQVNURVJST1IKKworIiIiCitXSU5PTEVBUEkgLT4gSFJFU1VMVAorV0lOT0xFQVBJXyh0eXBlKQorCitTVERNRVRIT0RDQUxMVFlQRQorCitTVERNRVRIT0QobmFtZSkKK1NURE1FVEhPRF8odHlwZSwgbmFtZSkKKworU1REQVBJQ0FMTFRZUEUKKyIiIgorCitkZWYgY3JlYXRlX3N0cmluZ19idWZmZXIoaW5pdCwgc2l6ZT1Ob25lKToKKyAgICAiIiJjcmVhdGVfc3RyaW5nX2J1ZmZlcihhU3RyaW5nKSAtPiBjaGFyYWN0ZXIgYXJyYXkKKyAgICBjcmVhdGVfc3RyaW5nX2J1ZmZlcihhbkludGVnZXIpIC0+IGNoYXJhY3RlciBhcnJheQorICAgIGNyZWF0ZV9zdHJpbmdfYnVmZmVyKGFTdHJpbmcsIGFuSW50ZWdlcikgLT4gY2hhcmFjdGVyIGFycmF5CisgICAgIiIiCisgICAgaWYgaXNpbnN0YW5jZShpbml0LCAoc3RyLCB1bmljb2RlKSk6CisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHNpemUgPSBsZW4oaW5pdCkrMQorICAgICAgICBidWZ0eXBlID0gY19jaGFyICogc2l6ZQorICAgICAgICBidWYgPSBidWZ0eXBlKCkKKyAgICAgICAgYnVmLnZhbHVlID0gaW5pdAorICAgICAgICByZXR1cm4gYnVmCisgICAgZWxpZiBpc2luc3RhbmNlKGluaXQsIChpbnQsIGxvbmcpKToKKyAgICAgICAgYnVmdHlwZSA9IGNfY2hhciAqIGluaXQKKyAgICAgICAgYnVmID0gYnVmdHlwZSgpCisgICAgICAgIHJldHVybiBidWYKKyAgICByYWlzZSBUeXBlRXJyb3IoaW5pdCkKKworZGVmIGNfYnVmZmVyKGluaXQsIHNpemU9Tm9uZSk6CisjIyAgICAiZGVwcmVjYXRlZCwgdXNlIGNyZWF0ZV9zdHJpbmdfYnVmZmVyIGluc3RlYWQiCisjIyAgICBpbXBvcnQgd2FybmluZ3MKKyMjICAgIHdhcm5pbmdzLndhcm4oImNfYnVmZmVyIGlzIGRlcHJlY2F0ZWQsIHVzZSBjcmVhdGVfc3RyaW5nX2J1ZmZlciBpbnN0ZWFkIiwKKyMjICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgcmV0dXJuIGNyZWF0ZV9zdHJpbmdfYnVmZmVyKGluaXQsIHNpemUpCisKK19jX2Z1bmN0eXBlX2NhY2hlID0ge30KK2RlZiBDRlVOQ1RZUEUocmVzdHlwZSwgKmFyZ3R5cGVzLCAqKmt3KToKKyAgICAiIiJDRlVOQ1RZUEUocmVzdHlwZSwgKmFyZ3R5cGVzLAorICAgICAgICAgICAgICAgICB1c2VfZXJybm89RmFsc2UsIHVzZV9sYXN0X2Vycm9yPUZhbHNlKSAtPiBmdW5jdGlvbiBwcm90b3R5cGUuCisKKyAgICByZXN0eXBlOiB0aGUgcmVzdWx0IHR5cGUKKyAgICBhcmd0eXBlczogYSBzZXF1ZW5jZSBzcGVjaWZ5aW5nIHRoZSBhcmd1bWVudCB0eXBlcworCisgICAgVGhlIGZ1bmN0aW9uIHByb3RvdHlwZSBjYW4gYmUgY2FsbGVkIGluIGRpZmZlcmVudCB3YXlzIHRvIGNyZWF0ZSBhCisgICAgY2FsbGFibGUgb2JqZWN0OgorCisgICAgcHJvdG90eXBlKGludGVnZXIgYWRkcmVzcykgLT4gZm9yZWlnbiBmdW5jdGlvbgorICAgIHByb3RvdHlwZShjYWxsYWJsZSkgLT4gY3JlYXRlIGFuZCByZXR1cm4gYSBDIGNhbGxhYmxlIGZ1bmN0aW9uIGZyb20gY2FsbGFibGUKKyAgICBwcm90b3R5cGUoaW50ZWdlciBpbmRleCwgbWV0aG9kIG5hbWVbLCBwYXJhbWZsYWdzXSkgLT4gZm9yZWlnbiBmdW5jdGlvbiBjYWxsaW5nIGEgQ09NIG1ldGhvZAorICAgIHByb3RvdHlwZSgob3JkaW5hbCBudW1iZXIsIGRsbCBvYmplY3QpWywgcGFyYW1mbGFnc10pIC0+IGZvcmVpZ24gZnVuY3Rpb24gZXhwb3J0ZWQgYnkgb3JkaW5hbAorICAgIHByb3RvdHlwZSgoZnVuY3Rpb24gbmFtZSwgZGxsIG9iamVjdClbLCBwYXJhbWZsYWdzXSkgLT4gZm9yZWlnbiBmdW5jdGlvbiBleHBvcnRlZCBieSBuYW1lCisgICAgIiIiCisgICAgZmxhZ3MgPSBfRlVOQ0ZMQUdfQ0RFQ0wKKyAgICBpZiBrdy5wb3AoInVzZV9lcnJubyIsIEZhbHNlKToKKyAgICAgICAgZmxhZ3MgfD0gX0ZVTkNGTEFHX1VTRV9FUlJOTworICAgIGlmIGt3LnBvcCgidXNlX2xhc3RfZXJyb3IiLCBGYWxzZSk6CisgICAgICAgIGZsYWdzIHw9IF9GVU5DRkxBR19VU0VfTEFTVEVSUk9SCisgICAgaWYga3c6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudChzKSAlcyIgJSBrdy5rZXlzKCkpCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gX2NfZnVuY3R5cGVfY2FjaGVbKHJlc3R5cGUsIGFyZ3R5cGVzLCBmbGFncyldCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBjbGFzcyBDRnVuY3Rpb25UeXBlKF9DRnVuY1B0cik6CisgICAgICAgICAgICBfYXJndHlwZXNfID0gYXJndHlwZXMKKyAgICAgICAgICAgIF9yZXN0eXBlXyA9IHJlc3R5cGUKKyAgICAgICAgICAgIF9mbGFnc18gPSBmbGFncworICAgICAgICBfY19mdW5jdHlwZV9jYWNoZVsocmVzdHlwZSwgYXJndHlwZXMsIGZsYWdzKV0gPSBDRnVuY3Rpb25UeXBlCisgICAgICAgIHJldHVybiBDRnVuY3Rpb25UeXBlCisKK2lmIF9vcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IExvYWRMaWJyYXJ5IGFzIF9kbG9wZW4KKyAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IEZVTkNGTEFHX1NURENBTEwgYXMgX0ZVTkNGTEFHX1NURENBTEwKKyAgICBpZiBfb3MubmFtZSA9PSAiY2UiOgorICAgICAgICAjICdjZScgZG9lc24ndCBoYXZlIHRoZSBzdGRjYWxsIGNhbGxpbmcgY29udmVudGlvbgorICAgICAgICBfRlVOQ0ZMQUdfU1REQ0FMTCA9IF9GVU5DRkxBR19DREVDTAorCisgICAgX3dpbl9mdW5jdHlwZV9jYWNoZSA9IHt9CisgICAgZGVmIFdJTkZVTkNUWVBFKHJlc3R5cGUsICphcmd0eXBlcywgKiprdyk6CisgICAgICAgICMgZG9jc3RyaW5nIHNldCBsYXRlciAodmVyeSBzaW1pbGFyIHRvIENGVU5DVFlQRS5fX2RvY19fKQorICAgICAgICBmbGFncyA9IF9GVU5DRkxBR19TVERDQUxMCisgICAgICAgIGlmIGt3LnBvcCgidXNlX2Vycm5vIiwgRmFsc2UpOgorICAgICAgICAgICAgZmxhZ3MgfD0gX0ZVTkNGTEFHX1VTRV9FUlJOTworICAgICAgICBpZiBrdy5wb3AoInVzZV9sYXN0X2Vycm9yIiwgRmFsc2UpOgorICAgICAgICAgICAgZmxhZ3MgfD0gX0ZVTkNGTEFHX1VTRV9MQVNURVJST1IKKyAgICAgICAgaWYga3c6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQocykgJXMiICUga3cua2V5cygpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gX3dpbl9mdW5jdHlwZV9jYWNoZVsocmVzdHlwZSwgYXJndHlwZXMsIGZsYWdzKV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgY2xhc3MgV2luRnVuY3Rpb25UeXBlKF9DRnVuY1B0cik6CisgICAgICAgICAgICAgICAgX2FyZ3R5cGVzXyA9IGFyZ3R5cGVzCisgICAgICAgICAgICAgICAgX3Jlc3R5cGVfID0gcmVzdHlwZQorICAgICAgICAgICAgICAgIF9mbGFnc18gPSBmbGFncworICAgICAgICAgICAgX3dpbl9mdW5jdHlwZV9jYWNoZVsocmVzdHlwZSwgYXJndHlwZXMsIGZsYWdzKV0gPSBXaW5GdW5jdGlvblR5cGUKKyAgICAgICAgICAgIHJldHVybiBXaW5GdW5jdGlvblR5cGUKKyAgICBpZiBXSU5GVU5DVFlQRS5fX2RvY19fOgorICAgICAgICBXSU5GVU5DVFlQRS5fX2RvY19fID0gQ0ZVTkNUWVBFLl9fZG9jX18ucmVwbGFjZSgiQ0ZVTkNUWVBFIiwgIldJTkZVTkNUWVBFIikKKworZWxpZiBfb3MubmFtZSA9PSAicG9zaXgiOgorICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgZGxvcGVuIGFzIF9kbG9wZW4KKworZnJvbSBfY3R5cGVzIGltcG9ydCBzaXplb2YsIGJ5cmVmLCBhZGRyZXNzb2YsIGFsaWdubWVudCwgcmVzaXplCitmcm9tIF9jdHlwZXMgaW1wb3J0IGdldF9lcnJubywgc2V0X2Vycm5vCitmcm9tIF9jdHlwZXMgaW1wb3J0IF9TaW1wbGVDRGF0YQorCitkZWYgX2NoZWNrX3NpemUodHlwLCB0eXBlY29kZT1Ob25lKToKKyAgICAjIENoZWNrIGlmIHNpemVvZihjdHlwZXNfdHlwZSkgYWdhaW5zdCBzdHJ1Y3QuY2FsY3NpemUuICBUaGlzCisgICAgIyBzaG91bGQgcHJvdGVjdCBzb21ld2hhdCBhZ2FpbnN0IGEgbWlzY29uZmlndXJlZCBsaWJmZmkuCisgICAgZnJvbSBzdHJ1Y3QgaW1wb3J0IGNhbGNzaXplCisgICAgaWYgdHlwZWNvZGUgaXMgTm9uZToKKyAgICAgICAgIyBNb3N0IF90eXBlXyBjb2RlcyBhcmUgdGhlIHNhbWUgYXMgdXNlZCBpbiBzdHJ1Y3QKKyAgICAgICAgdHlwZWNvZGUgPSB0eXAuX3R5cGVfCisgICAgYWN0dWFsLCByZXF1aXJlZCA9IHNpemVvZih0eXApLCBjYWxjc2l6ZSh0eXBlY29kZSkKKyAgICBpZiBhY3R1YWwgIT0gcmVxdWlyZWQ6CisgICAgICAgIHJhaXNlIFN5c3RlbUVycm9yKCJzaXplb2YoJXMpIHdyb25nOiAlZCBpbnN0ZWFkIG9mICVkIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cCwgYWN0dWFsLCByZXF1aXJlZCkpCisKK2NsYXNzIHB5X29iamVjdChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJPIgorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHN1cGVyKHB5X29iamVjdCwgc2VsZikuX19yZXByX18oKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAiJXMoPE5VTEw+KSIgJSB0eXBlKHNlbGYpLl9fbmFtZV9fCitfY2hlY2tfc2l6ZShweV9vYmplY3QsICJQIikKKworY2xhc3MgY19zaG9ydChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJoIgorX2NoZWNrX3NpemUoY19zaG9ydCkKKworY2xhc3MgY191c2hvcnQoX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAiSCIKK19jaGVja19zaXplKGNfdXNob3J0KQorCitjbGFzcyBjX2xvbmcoX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAibCIKK19jaGVja19zaXplKGNfbG9uZykKKworY2xhc3MgY191bG9uZyhfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJMIgorX2NoZWNrX3NpemUoY191bG9uZykKKworaWYgX2NhbGNzaXplKCJpIikgPT0gX2NhbGNzaXplKCJsIik6CisgICAgIyBpZiBpbnQgYW5kIGxvbmcgaGF2ZSB0aGUgc2FtZSBzaXplLCBtYWtlIGNfaW50IGFuIGFsaWFzIGZvciBjX2xvbmcKKyAgICBjX2ludCA9IGNfbG9uZworICAgIGNfdWludCA9IGNfdWxvbmcKK2Vsc2U6CisgICAgY2xhc3MgY19pbnQoX1NpbXBsZUNEYXRhKToKKyAgICAgICAgX3R5cGVfID0gImkiCisgICAgX2NoZWNrX3NpemUoY19pbnQpCisKKyAgICBjbGFzcyBjX3VpbnQoX1NpbXBsZUNEYXRhKToKKyAgICAgICAgX3R5cGVfID0gIkkiCisgICAgX2NoZWNrX3NpemUoY191aW50KQorCitjbGFzcyBjX2Zsb2F0KF9TaW1wbGVDRGF0YSk6CisgICAgX3R5cGVfID0gImYiCitfY2hlY2tfc2l6ZShjX2Zsb2F0KQorCitjbGFzcyBjX2RvdWJsZShfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJkIgorX2NoZWNrX3NpemUoY19kb3VibGUpCisKK2NsYXNzIGNfbG9uZ2RvdWJsZShfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJnIgoraWYgc2l6ZW9mKGNfbG9uZ2RvdWJsZSkgPT0gc2l6ZW9mKGNfZG91YmxlKToKKyAgICBjX2xvbmdkb3VibGUgPSBjX2RvdWJsZQorCitpZiBfY2FsY3NpemUoImwiKSA9PSBfY2FsY3NpemUoInEiKToKKyAgICAjIGlmIGxvbmcgYW5kIGxvbmcgbG9uZyBoYXZlIHRoZSBzYW1lIHNpemUsIG1ha2UgY19sb25nbG9uZyBhbiBhbGlhcyBmb3IgY19sb25nCisgICAgY19sb25nbG9uZyA9IGNfbG9uZworICAgIGNfdWxvbmdsb25nID0gY191bG9uZworZWxzZToKKyAgICBjbGFzcyBjX2xvbmdsb25nKF9TaW1wbGVDRGF0YSk6CisgICAgICAgIF90eXBlXyA9ICJxIgorICAgIF9jaGVja19zaXplKGNfbG9uZ2xvbmcpCisKKyAgICBjbGFzcyBjX3Vsb25nbG9uZyhfU2ltcGxlQ0RhdGEpOgorICAgICAgICBfdHlwZV8gPSAiUSIKKyAgICAjIyAgICBkZWYgZnJvbV9wYXJhbShjbHMsIHZhbCk6CisgICAgIyMgICAgICAgIHJldHVybiAoJ2QnLCBmbG9hdCh2YWwpLCB2YWwpCisgICAgIyMgICAgZnJvbV9wYXJhbSA9IGNsYXNzbWV0aG9kKGZyb21fcGFyYW0pCisgICAgX2NoZWNrX3NpemUoY191bG9uZ2xvbmcpCisKK2NsYXNzIGNfdWJ5dGUoX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAiQiIKK2NfdWJ5dGUuX19jdHlwZV9sZV9fID0gY191Ynl0ZS5fX2N0eXBlX2JlX18gPSBjX3VieXRlCisjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6CisjI2NfdWNoYXIgPSBjX3VieXRlCitfY2hlY2tfc2l6ZShjX3VieXRlKQorCitjbGFzcyBjX2J5dGUoX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAiYiIKK2NfYnl0ZS5fX2N0eXBlX2xlX18gPSBjX2J5dGUuX19jdHlwZV9iZV9fID0gY19ieXRlCitfY2hlY2tfc2l6ZShjX2J5dGUpCisKK2NsYXNzIGNfY2hhcihfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJjIgorY19jaGFyLl9fY3R5cGVfbGVfXyA9IGNfY2hhci5fX2N0eXBlX2JlX18gPSBjX2NoYXIKK19jaGVja19zaXplKGNfY2hhcikKKworY2xhc3MgY19jaGFyX3AoX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAieiIKKyAgICBpZiBfb3MubmFtZSA9PSAibnQiOgorICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICBpZiBub3Qgd2luZGxsLmtlcm5lbDMyLklzQmFkU3RyaW5nUHRyQShzZWxmLCAtMSk6CisgICAgICAgICAgICAgICAgcmV0dXJuICIlcyglcikiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLnZhbHVlKQorICAgICAgICAgICAgcmV0dXJuICIlcyglcykiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBjYXN0KHNlbGYsIGNfdm9pZF9wKS52YWx1ZSkKKyAgICBlbHNlOgorICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gIiVzKCVzKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGNhc3Qoc2VsZiwgY192b2lkX3ApLnZhbHVlKQorX2NoZWNrX3NpemUoY19jaGFyX3AsICJQIikKKworY2xhc3MgY192b2lkX3AoX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAiUCIKK2Nfdm9pZHAgPSBjX3ZvaWRfcCAjIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICh0byBhIGJ1ZykKK19jaGVja19zaXplKGNfdm9pZF9wKQorCitjbGFzcyBjX2Jvb2woX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAiPyIKKworZnJvbSBfY3R5cGVzIGltcG9ydCBQT0lOVEVSLCBwb2ludGVyLCBfcG9pbnRlcl90eXBlX2NhY2hlCisKK2RlZiBfcmVzZXRfY2FjaGUoKToKKyAgICBfcG9pbnRlcl90eXBlX2NhY2hlLmNsZWFyKCkKKyAgICBfY19mdW5jdHlwZV9jYWNoZS5jbGVhcigpCisgICAgaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorICAgICAgICBfd2luX2Z1bmN0eXBlX2NhY2hlLmNsZWFyKCkKKyAgICAjIF9TaW1wbGVDRGF0YS5jX3djaGFyX3BfZnJvbV9wYXJhbQorICAgIFBPSU5URVIoY193Y2hhcikuZnJvbV9wYXJhbSA9IGNfd2NoYXJfcC5mcm9tX3BhcmFtCisgICAgIyBfU2ltcGxlQ0RhdGEuY19jaGFyX3BfZnJvbV9wYXJhbQorICAgIFBPSU5URVIoY19jaGFyKS5mcm9tX3BhcmFtID0gY19jaGFyX3AuZnJvbV9wYXJhbQorICAgIF9wb2ludGVyX3R5cGVfY2FjaGVbTm9uZV0gPSBjX3ZvaWRfcAorICAgICMgWFhYIGZvciB3aGF0ZXZlciByZWFzb25zLCBjcmVhdGluZyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgYSBjYWxsYmFjaworICAgICMgZnVuY3Rpb24gaXMgbmVlZGVkIGZvciB0aGUgdW5pdHRlc3RzIG9uIFdpbjY0IHRvIHN1Y2NlZWQuICBUaGlzIE1BWQorICAgICMgYmUgYSBjb21waWxlciBidWcsIHNpbmNlIHRoZSBwcm9ibGVtIG9jY3VycyBvbmx5IHdoZW4gX2N0eXBlcyBpcworICAgICMgY29tcGlsZWQgd2l0aCB0aGUgTVMgU0RLIGNvbXBpbGVyLiAgT3IgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZT8KKyAgICBDRlVOQ1RZUEUoY19pbnQpKGxhbWJkYTogTm9uZSkKKwordHJ5OgorICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgc2V0X2NvbnZlcnNpb25fbW9kZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorICAgICAgICBzZXRfY29udmVyc2lvbl9tb2RlKCJtYmNzIiwgImlnbm9yZSIpCisgICAgZWxzZToKKyAgICAgICAgc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKworICAgIGNsYXNzIGNfd2NoYXJfcChfU2ltcGxlQ0RhdGEpOgorICAgICAgICBfdHlwZV8gPSAiWiIKKworICAgIGNsYXNzIGNfd2NoYXIoX1NpbXBsZUNEYXRhKToKKyAgICAgICAgX3R5cGVfID0gInUiCisKKyAgICBkZWYgY3JlYXRlX3VuaWNvZGVfYnVmZmVyKGluaXQsIHNpemU9Tm9uZSk6CisgICAgICAgICIiImNyZWF0ZV91bmljb2RlX2J1ZmZlcihhU3RyaW5nKSAtPiBjaGFyYWN0ZXIgYXJyYXkKKyAgICAgICAgY3JlYXRlX3VuaWNvZGVfYnVmZmVyKGFuSW50ZWdlcikgLT4gY2hhcmFjdGVyIGFycmF5CisgICAgICAgIGNyZWF0ZV91bmljb2RlX2J1ZmZlcihhU3RyaW5nLCBhbkludGVnZXIpIC0+IGNoYXJhY3RlciBhcnJheQorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShpbml0LCAoc3RyLCB1bmljb2RlKSk6CisgICAgICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2l6ZSA9IGxlbihpbml0KSsxCisgICAgICAgICAgICBidWZ0eXBlID0gY193Y2hhciAqIHNpemUKKyAgICAgICAgICAgIGJ1ZiA9IGJ1ZnR5cGUoKQorICAgICAgICAgICAgYnVmLnZhbHVlID0gaW5pdAorICAgICAgICAgICAgcmV0dXJuIGJ1ZgorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaW5pdCwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgYnVmdHlwZSA9IGNfd2NoYXIgKiBpbml0CisgICAgICAgICAgICBidWYgPSBidWZ0eXBlKCkKKyAgICAgICAgICAgIHJldHVybiBidWYKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKGluaXQpCisKKyMgWFhYIERlcHJlY2F0ZWQKK2RlZiBTZXRQb2ludGVyVHlwZShwb2ludGVyLCBjbHMpOgorICAgIGlmIF9wb2ludGVyX3R5cGVfY2FjaGUuZ2V0KGNscywgTm9uZSkgaXMgbm90IE5vbmU6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiVGhpcyB0eXBlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBjYWNoZSIpCisgICAgaWYgaWQocG9pbnRlcikgbm90IGluIF9wb2ludGVyX3R5cGVfY2FjaGU6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiV2hhdCdzIHRoaXM/Pz8iKQorICAgIHBvaW50ZXIuc2V0X3R5cGUoY2xzKQorICAgIF9wb2ludGVyX3R5cGVfY2FjaGVbY2xzXSA9IHBvaW50ZXIKKyAgICBkZWwgX3BvaW50ZXJfdHlwZV9jYWNoZVtpZChwb2ludGVyKV0KKworIyBYWFggRGVwcmVjYXRlZAorZGVmIEFSUkFZKHR5cCwgbGVuKToKKyAgICByZXR1cm4gdHlwICogbGVuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCitjbGFzcyBDRExMKG9iamVjdCk6CisgICAgIiIiQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbG9hZGVkIGRsbC9zaGFyZWQKKyAgICBsaWJyYXJ5LCBleHBvcnRpbmcgZnVuY3Rpb25zIHVzaW5nIHRoZSBzdGFuZGFyZCBDIGNhbGxpbmcKKyAgICBjb252ZW50aW9uIChuYW1lZCAnY2RlY2wnIG9uIFdpbmRvd3MpLgorCisgICAgVGhlIGV4cG9ydGVkIGZ1bmN0aW9ucyBjYW4gYmUgYWNjZXNzZWQgYXMgYXR0cmlidXRlcywgb3IgYnkKKyAgICBpbmRleGluZyB3aXRoIHRoZSBmdW5jdGlvbiBuYW1lLiAgRXhhbXBsZXM6CisKKyAgICA8b2JqPi5xc29ydCAtPiBjYWxsYWJsZSBvYmplY3QKKyAgICA8b2JqPlsncXNvcnQnXSAtPiBjYWxsYWJsZSBvYmplY3QKKworICAgIENhbGxpbmcgdGhlIGZ1bmN0aW9ucyByZWxlYXNlcyB0aGUgUHl0aG9uIEdJTCBkdXJpbmcgdGhlIGNhbGwgYW5kCisgICAgcmVhY3F1aXJlcyBpdCBhZnRlcndhcmRzLgorICAgICIiIgorICAgIF9mdW5jX2ZsYWdzXyA9IF9GVU5DRkxBR19DREVDTAorICAgIF9mdW5jX3Jlc3R5cGVfID0gY19pbnQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2RlPURFRkFVTFRfTU9ERSwgaGFuZGxlPU5vbmUsCisgICAgICAgICAgICAgICAgIHVzZV9lcnJubz1GYWxzZSwKKyAgICAgICAgICAgICAgICAgdXNlX2xhc3RfZXJyb3I9RmFsc2UpOgorICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQorICAgICAgICBmbGFncyA9IHNlbGYuX2Z1bmNfZmxhZ3NfCisgICAgICAgIGlmIHVzZV9lcnJubzoKKyAgICAgICAgICAgIGZsYWdzIHw9IF9GVU5DRkxBR19VU0VfRVJSTk8KKyAgICAgICAgaWYgdXNlX2xhc3RfZXJyb3I6CisgICAgICAgICAgICBmbGFncyB8PSBfRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUgorCisgICAgICAgIGNsYXNzIF9GdW5jUHRyKF9DRnVuY1B0cik6CisgICAgICAgICAgICBfZmxhZ3NfID0gZmxhZ3MKKyAgICAgICAgICAgIF9yZXN0eXBlXyA9IHNlbGYuX2Z1bmNfcmVzdHlwZV8KKyAgICAgICAgc2VsZi5fRnVuY1B0ciA9IF9GdW5jUHRyCisKKyAgICAgICAgaWYgaGFuZGxlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9oYW5kbGUgPSBfZGxvcGVuKHNlbGYuX25hbWUsIG1vZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9oYW5kbGUgPSBoYW5kbGUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8JXMgJyVzJywgaGFuZGxlICV4IGF0ICV4PiIgJSBcCisgICAgICAgICAgICAgICAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX25hbWUsCisgICAgICAgICAgICAgICAgKHNlbGYuX2hhbmRsZSAmIChfc3lzLm1heGludCoyICsgMSkpLAorICAgICAgICAgICAgICAgIGlkKHNlbGYpICYgKF9zeXMubWF4aW50KjIgKyAxKSkKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdfXycpIGFuZCBuYW1lLmVuZHN3aXRoKCdfXycpOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkKKyAgICAgICAgZnVuYyA9IHNlbGYuX19nZXRpdGVtX18obmFtZSkKKyAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBmdW5jKQorICAgICAgICByZXR1cm4gZnVuYworCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWVfb3Jfb3JkaW5hbCk6CisgICAgICAgIGZ1bmMgPSBzZWxmLl9GdW5jUHRyKChuYW1lX29yX29yZGluYWwsIHNlbGYpKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuYW1lX29yX29yZGluYWwsIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgIGZ1bmMuX19uYW1lX18gPSBuYW1lX29yX29yZGluYWwKKyAgICAgICAgcmV0dXJuIGZ1bmMKKworY2xhc3MgUHlETEwoQ0RMTCk6CisgICAgIiIiVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBQeXRob24gbGlicmFyeSBpdHNlbGYuICBJdCBhbGxvd3MgdG8KKyAgICBhY2Nlc3MgUHl0aG9uIEFQSSBmdW5jdGlvbnMuICBUaGUgR0lMIGlzIG5vdCByZWxlYXNlZCwgYW5kCisgICAgUHl0aG9uIGV4Y2VwdGlvbnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5LgorICAgICIiIgorICAgIF9mdW5jX2ZsYWdzXyA9IF9GVU5DRkxBR19DREVDTCB8IF9GVU5DRkxBR19QWVRIT05BUEkKKworaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorCisgICAgY2xhc3MgV2luRExMKENETEwpOgorICAgICAgICAiIiJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBkbGwgZXhwb3J0aW5nIGZ1bmN0aW9ucyB1c2luZyB0aGUKKyAgICAgICAgV2luZG93cyBzdGRjYWxsIGNhbGxpbmcgY29udmVudGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIF9mdW5jX2ZsYWdzXyA9IF9GVU5DRkxBR19TVERDQUxMCisKKyAgICAjIFhYWCBIbSwgd2hhdCBhYm91dCBIUkVTVUxUIGFzIG5vcm1hbCBwYXJhbWV0ZXI/CisgICAgIyBNdXN0bid0IGl0IGRlcml2ZSBmcm9tIGNfbG9uZyB0aGVuPworICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgX2NoZWNrX0hSRVNVTFQsIF9TaW1wbGVDRGF0YQorICAgIGNsYXNzIEhSRVNVTFQoX1NpbXBsZUNEYXRhKToKKyAgICAgICAgX3R5cGVfID0gImwiCisgICAgICAgICMgX2NoZWNrX3JldHZhbF8gaXMgY2FsbGVkIHdpdGggdGhlIGZ1bmN0aW9uJ3MgcmVzdWx0IHdoZW4gaXQKKyAgICAgICAgIyBpcyB1c2VkIGFzIHJlc3R5cGUuICBJdCBjaGVja3MgZm9yIHRoZSBGQUlMRUQgYml0LCBhbmQKKyAgICAgICAgIyByYWlzZXMgYSBXaW5kb3dzRXJyb3IgaWYgaXQgaXMgc2V0LgorICAgICAgICAjCisgICAgICAgICMgVGhlIF9jaGVja19yZXR2YWxfIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiBDLCBzbyB0aGF0IHRoZQorICAgICAgICAjIG1ldGhvZCBkZWZpbml0aW9uIGl0c2VsZiBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHRyYWNlYmFjaworICAgICAgICAjIHdoZW4gaXQgcmFpc2VzIGFuIGVycm9yIC0gdGhhdCBpcyB3aGF0IHdlIHdhbnQgKGFuZCBQeXRob24KKyAgICAgICAgIyBkb2Vzbid0IGhhdmUgYSB3YXkgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGluIHRoZSBjYWxsZXIncworICAgICAgICAjIGZyYW1lKS4KKyAgICAgICAgX2NoZWNrX3JldHZhbF8gPSBfY2hlY2tfSFJFU1VMVAorCisgICAgY2xhc3MgT2xlRExMKENETEwpOgorICAgICAgICAiIiJUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBkbGwgZXhwb3J0aW5nIGZ1bmN0aW9ucyB1c2luZyB0aGUKKyAgICAgICAgV2luZG93cyBzdGRjYWxsIGNhbGxpbmcgY29udmVudGlvbiwgYW5kIHJldHVybmluZyBIUkVTVUxULgorICAgICAgICBIUkVTVUxUIGVycm9yIHZhbHVlcyBhcmUgYXV0b21hdGljYWxseSByYWlzZWQgYXMgV2luZG93c0Vycm9yCisgICAgICAgIGV4Y2VwdGlvbnMuCisgICAgICAgICIiIgorICAgICAgICBfZnVuY19mbGFnc18gPSBfRlVOQ0ZMQUdfU1REQ0FMTAorICAgICAgICBfZnVuY19yZXN0eXBlXyA9IEhSRVNVTFQKKworY2xhc3MgTGlicmFyeUxvYWRlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkbGx0eXBlKToKKyAgICAgICAgc2VsZi5fZGxsdHlwZSA9IGRsbHR5cGUKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbmFtZVswXSA9PSAnXyc6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihuYW1lKQorICAgICAgICBkbGwgPSBzZWxmLl9kbGx0eXBlKG5hbWUpCisgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgZGxsKQorICAgICAgICByZXR1cm4gZGxsCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIG5hbWUpCisKKyAgICBkZWYgTG9hZExpYnJhcnkoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9kbGx0eXBlKG5hbWUpCisKK2NkbGwgPSBMaWJyYXJ5TG9hZGVyKENETEwpCitweWRsbCA9IExpYnJhcnlMb2FkZXIoUHlETEwpCisKK2lmIF9vcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICBweXRob25hcGkgPSBQeURMTCgicHl0aG9uIGRsbCIsIE5vbmUsIF9zeXMuZGxsaGFuZGxlKQorZWxpZiBfc3lzLnBsYXRmb3JtID09ICJjeWd3aW4iOgorICAgIHB5dGhvbmFwaSA9IFB5RExMKCJsaWJweXRob24lZC4lZC5kbGwiICUgX3N5cy52ZXJzaW9uX2luZm9bOjJdKQorZWxzZToKKyAgICBweXRob25hcGkgPSBQeURMTChOb25lKQorCisKK2lmIF9vcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICB3aW5kbGwgPSBMaWJyYXJ5TG9hZGVyKFdpbkRMTCkKKyAgICBvbGVkbGwgPSBMaWJyYXJ5TG9hZGVyKE9sZURMTCkKKworICAgIGlmIF9vcy5uYW1lID09ICJudCI6CisgICAgICAgIEdldExhc3RFcnJvciA9IHdpbmRsbC5rZXJuZWwzMi5HZXRMYXN0RXJyb3IKKyAgICBlbHNlOgorICAgICAgICBHZXRMYXN0RXJyb3IgPSB3aW5kbGwuY29yZWRsbC5HZXRMYXN0RXJyb3IKKyAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IGdldF9sYXN0X2Vycm9yLCBzZXRfbGFzdF9lcnJvcgorCisgICAgZGVmIFdpbkVycm9yKGNvZGU9Tm9uZSwgZGVzY3I9Tm9uZSk6CisgICAgICAgIGlmIGNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgIGNvZGUgPSBHZXRMYXN0RXJyb3IoKQorICAgICAgICBpZiBkZXNjciBpcyBOb25lOgorICAgICAgICAgICAgZGVzY3IgPSBGb3JtYXRFcnJvcihjb2RlKS5zdHJpcCgpCisgICAgICAgIHJldHVybiBXaW5kb3dzRXJyb3IoY29kZSwgZGVzY3IpCisKK2lmIHNpemVvZihjX3VpbnQpID09IHNpemVvZihjX3ZvaWRfcCk6CisgICAgY19zaXplX3QgPSBjX3VpbnQKKyAgICBjX3NzaXplX3QgPSBjX2ludAorZWxpZiBzaXplb2YoY191bG9uZykgPT0gc2l6ZW9mKGNfdm9pZF9wKToKKyAgICBjX3NpemVfdCA9IGNfdWxvbmcKKyAgICBjX3NzaXplX3QgPSBjX2xvbmcKK2VsaWYgc2l6ZW9mKGNfdWxvbmdsb25nKSA9PSBzaXplb2YoY192b2lkX3ApOgorICAgIGNfc2l6ZV90ID0gY191bG9uZ2xvbmcKKyAgICBjX3NzaXplX3QgPSBjX2xvbmdsb25nCisKKyMgZnVuY3Rpb25zCisKK2Zyb20gX2N0eXBlcyBpbXBvcnQgX21lbW1vdmVfYWRkciwgX21lbXNldF9hZGRyLCBfc3RyaW5nX2F0X2FkZHIsIF9jYXN0X2FkZHIKKworIyMgdm9pZCAqbWVtbW92ZSh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK21lbW1vdmUgPSBDRlVOQ1RZUEUoY192b2lkX3AsIGNfdm9pZF9wLCBjX3ZvaWRfcCwgY19zaXplX3QpKF9tZW1tb3ZlX2FkZHIpCisKKyMjIHZvaWQgKm1lbXNldCh2b2lkICosIGludCwgc2l6ZV90KQorbWVtc2V0ID0gQ0ZVTkNUWVBFKGNfdm9pZF9wLCBjX3ZvaWRfcCwgY19pbnQsIGNfc2l6ZV90KShfbWVtc2V0X2FkZHIpCisKK2RlZiBQWUZVTkNUWVBFKHJlc3R5cGUsICphcmd0eXBlcyk6CisgICAgY2xhc3MgQ0Z1bmN0aW9uVHlwZShfQ0Z1bmNQdHIpOgorICAgICAgICBfYXJndHlwZXNfID0gYXJndHlwZXMKKyAgICAgICAgX3Jlc3R5cGVfID0gcmVzdHlwZQorICAgICAgICBfZmxhZ3NfID0gX0ZVTkNGTEFHX0NERUNMIHwgX0ZVTkNGTEFHX1BZVEhPTkFQSQorICAgIHJldHVybiBDRnVuY3Rpb25UeXBlCisKK19jYXN0ID0gUFlGVU5DVFlQRShweV9vYmplY3QsIGNfdm9pZF9wLCBweV9vYmplY3QsIHB5X29iamVjdCkoX2Nhc3RfYWRkcikKK2RlZiBjYXN0KG9iaiwgdHlwKToKKyAgICByZXR1cm4gX2Nhc3Qob2JqLCBvYmosIHR5cCkKKworX3N0cmluZ19hdCA9IFBZRlVOQ1RZUEUocHlfb2JqZWN0LCBjX3ZvaWRfcCwgY19pbnQpKF9zdHJpbmdfYXRfYWRkcikKK2RlZiBzdHJpbmdfYXQocHRyLCBzaXplPS0xKToKKyAgICAiIiJzdHJpbmdfYXQoYWRkclssIHNpemVdKSAtPiBzdHJpbmcKKworICAgIFJldHVybiB0aGUgc3RyaW5nIGF0IGFkZHIuIiIiCisgICAgcmV0dXJuIF9zdHJpbmdfYXQocHRyLCBzaXplKQorCit0cnk6CisgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBfd3N0cmluZ19hdF9hZGRyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBfd3N0cmluZ19hdCA9IFBZRlVOQ1RZUEUocHlfb2JqZWN0LCBjX3ZvaWRfcCwgY19pbnQpKF93c3RyaW5nX2F0X2FkZHIpCisgICAgZGVmIHdzdHJpbmdfYXQocHRyLCBzaXplPS0xKToKKyAgICAgICAgIiIid3N0cmluZ19hdChhZGRyWywgc2l6ZV0pIC0+IHN0cmluZworCisgICAgICAgIFJldHVybiB0aGUgc3RyaW5nIGF0IGFkZHIuIiIiCisgICAgICAgIHJldHVybiBfd3N0cmluZ19hdChwdHIsIHNpemUpCisKKworaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOiAjIENPTSBzdHVmZgorICAgIGRlZiBEbGxHZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNjb20gPSBfX2ltcG9ydF9fKCJjb210eXBlcy5zZXJ2ZXIuaW5wcm9jc2VydmVyIiwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWycqJ10pCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAtMjE0NzIyMTIzMSAjIENMQVNTX0VfQ0xBU1NOT1RBVkFJTEFCTEUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjY29tLkRsbEdldENsYXNzT2JqZWN0KHJjbHNpZCwgcmlpZCwgcHB2KQorCisgICAgZGVmIERsbENhblVubG9hZE5vdygpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjY29tID0gX19pbXBvcnRfXygiY29tdHlwZXMuc2VydmVyLmlucHJvY3NlcnZlciIsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gMCAjIFNfT0sKKyAgICAgICAgcmV0dXJuIGNjb20uRGxsQ2FuVW5sb2FkTm93KCkKKworZnJvbSBjdHlwZXMuX2VuZGlhbiBpbXBvcnQgQmlnRW5kaWFuU3RydWN0dXJlLCBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUKKworIyBGaWxsIGluIHNwZWNpZmljYWxseS1zaXplZCB0eXBlcworY19pbnQ4ID0gY19ieXRlCitjX3VpbnQ4ID0gY191Ynl0ZQorZm9yIGtpbmQgaW4gW2Nfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfbG9uZ2xvbmddOgorICAgIGlmIHNpemVvZihraW5kKSA9PSAyOiBjX2ludDE2ID0ga2luZAorICAgIGVsaWYgc2l6ZW9mKGtpbmQpID09IDQ6IGNfaW50MzIgPSBraW5kCisgICAgZWxpZiBzaXplb2Yoa2luZCkgPT0gODogY19pbnQ2NCA9IGtpbmQKK2ZvciBraW5kIGluIFtjX3VzaG9ydCwgY191aW50LCBjX3Vsb25nLCBjX3Vsb25nbG9uZ106CisgICAgaWYgc2l6ZW9mKGtpbmQpID09IDI6IGNfdWludDE2ID0ga2luZAorICAgIGVsaWYgc2l6ZW9mKGtpbmQpID09IDQ6IGNfdWludDMyID0ga2luZAorICAgIGVsaWYgc2l6ZW9mKGtpbmQpID09IDg6IGNfdWludDY0ID0ga2luZAorZGVsKGtpbmQpCisKK19yZXNldF9jYWNoZSgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzMDIzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzMDIzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9fZW5kaWFuLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvX2VuZGlhbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODBlNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvX2VuZGlhbi5weQpAQCAtMCwwICsxLDY0IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpbXBvcnQgc3lzCitmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitfYXJyYXlfdHlwZSA9IHR5cGUoQXJyYXkpCisKK2RlZiBfb3RoZXJfZW5kaWFuKHR5cCk6CisgICAgIiIiUmV0dXJuIHRoZSB0eXBlIHdpdGggdGhlICdvdGhlcicgYnl0ZSBvcmRlci4gIFNpbXBsZSB0eXBlcyBsaWtlCisgICAgY19pbnQgYW5kIHNvIG9uIGFscmVhZHkgaGF2ZSBfX2N0eXBlX2JlX18gYW5kIF9fY3R5cGVfbGVfXworICAgIGF0dHJpYnV0ZXMgd2hpY2ggY29udGFpbiB0aGUgdHlwZXMsIGZvciBtb3JlIGNvbXBsaWNhdGVkIHR5cGVzCisgICAgYXJyYXlzIGFuZCBzdHJ1Y3R1cmVzIGFyZSBzdXBwb3J0ZWQuCisgICAgIiIiCisgICAgIyBjaGVjayBfT1RIRVJfRU5ESUFOIGF0dHJpYnV0ZSAocHJlc2VudCBpZiB0eXAgaXMgcHJpbWl0aXZlIHR5cGUpCisgICAgaWYgaGFzYXR0cih0eXAsIF9PVEhFUl9FTkRJQU4pOgorICAgICAgICByZXR1cm4gZ2V0YXR0cih0eXAsIF9PVEhFUl9FTkRJQU4pCisgICAgIyBpZiB0eXAgaXMgYXJyYXkKKyAgICBpZiBpc2luc3RhbmNlKHR5cCwgX2FycmF5X3R5cGUpOgorICAgICAgICByZXR1cm4gX290aGVyX2VuZGlhbih0eXAuX3R5cGVfKSAqIHR5cC5fbGVuZ3RoXworICAgICMgaWYgdHlwIGlzIHN0cnVjdHVyZQorICAgIGlmIGlzc3ViY2xhc3ModHlwLCBTdHJ1Y3R1cmUpOgorICAgICAgICByZXR1cm4gdHlwCisgICAgcmFpc2UgVHlwZUVycm9yKCJUaGlzIHR5cGUgZG9lcyBub3Qgc3VwcG9ydCBvdGhlciBlbmRpYW46ICVzIiAlIHR5cCkKKworY2xhc3MgX3N3YXBwZWRfbWV0YSh0eXBlKFN0cnVjdHVyZSkpOgorICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBhdHRybmFtZSwgdmFsdWUpOgorICAgICAgICBpZiBhdHRybmFtZSA9PSAiX2ZpZWxkc18iOgorICAgICAgICAgICAgZmllbGRzID0gW10KKyAgICAgICAgICAgIGZvciBkZXNjIGluIHZhbHVlOgorICAgICAgICAgICAgICAgIG5hbWUgPSBkZXNjWzBdCisgICAgICAgICAgICAgICAgdHlwID0gZGVzY1sxXQorICAgICAgICAgICAgICAgIHJlc3QgPSBkZXNjWzI6XQorICAgICAgICAgICAgICAgIGZpZWxkcy5hcHBlbmQoKG5hbWUsIF9vdGhlcl9lbmRpYW4odHlwKSkgKyByZXN0KQorICAgICAgICAgICAgdmFsdWUgPSBmaWVsZHMKKyAgICAgICAgc3VwZXIoX3N3YXBwZWRfbWV0YSwgc2VsZikuX19zZXRhdHRyX18oYXR0cm5hbWUsIHZhbHVlKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgTm90ZTogVGhlIFN0cnVjdHVyZSBtZXRhY2xhc3MgY2hlY2tzIGZvciB0aGUgKnByZXNlbmNlKiAobm90IHRoZQorIyB2YWx1ZSEpIG9mIGEgX3N3YXBwZWRfYnl0ZXNfIGF0dHJpYnV0ZSB0byBkZXRlcm1pbmUgdGhlIGJpdCBvcmRlciBpbgorIyBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYml0IGZpZWxkcy4KKworaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICBfT1RIRVJfRU5ESUFOID0gIl9fY3R5cGVfYmVfXyIKKworICAgIExpdHRsZUVuZGlhblN0cnVjdHVyZSA9IFN0cnVjdHVyZQorCisgICAgY2xhc3MgQmlnRW5kaWFuU3RydWN0dXJlKFN0cnVjdHVyZSk6CisgICAgICAgICIiIlN0cnVjdHVyZSB3aXRoIGJpZyBlbmRpYW4gYnl0ZSBvcmRlciIiIgorICAgICAgICBfX21ldGFjbGFzc19fID0gX3N3YXBwZWRfbWV0YQorICAgICAgICBfc3dhcHBlZGJ5dGVzXyA9IE5vbmUKKworZWxpZiBzeXMuYnl0ZW9yZGVyID09ICJiaWciOgorICAgIF9PVEhFUl9FTkRJQU4gPSAiX19jdHlwZV9sZV9fIgorCisgICAgQmlnRW5kaWFuU3RydWN0dXJlID0gU3RydWN0dXJlCisgICAgY2xhc3MgTGl0dGxlRW5kaWFuU3RydWN0dXJlKFN0cnVjdHVyZSk6CisgICAgICAgICIiIlN0cnVjdHVyZSB3aXRoIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciIiIgorICAgICAgICBfX21ldGFjbGFzc19fID0gX3N3YXBwZWRfbWV0YQorICAgICAgICBfc3dhcHBlZGJ5dGVzXyA9IE5vbmUKKworZWxzZToKKyAgICByYWlzZSBSdW50aW1lRXJyb3IoIkludmFsaWQgYnl0ZW9yZGVyIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL19lbmRpYW4ucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvX2VuZGlhbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjNDVmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL19lbmRpYW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL19lbmRpYW4ucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvX2VuZGlhbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjNDVmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL19lbmRpYW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL1JFQURNRS5jdHlwZXMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9SRUFETUUuY3R5cGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTBjYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9SRUFETUUuY3R5cGVzCkBAIC0wLDAgKzEsNyBAQAorRmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgZnJvbSBmcm9tIEJvYiBJcHBvbGl0bydzIHB5MmFwcC4KKworTGljZW5zZTogQW55IGNvbXBvbmVudHMgb2YgdGhlIHB5MmFwcCBzdWl0ZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIKK3RoZSBNSVQgb3IgUFNGIG9wZW4gc291cmNlIGxpY2Vuc2VzLgorCitUaGlzIGlzIHZlcnNpb24gMS4wLCBTVk4gcmV2aXNpb24gNzg5LCBmcm9tIDIwMDYvMDEvMjUuCitUaGUgbWFpbiByZXBvc2l0b3J5IGlzIGh0dHA6Ly9zdm4ucmVkLWJlYW4uY29tL2JvYi9tYWNob2xpYi90cnVuay9tYWNob2xpYi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTQ5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weQpAQCAtMCwwICsxLDEyIEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisiIiIKK0Vub3VnaCBNYWNoLU8gdG8gbWFrZSB5b3VyIGhlYWQgc3Bpbi4KKworU2VlIHRoZSByZWxldmFudCBoZWFkZXIgZmlsZXMgaW4gL3Vzci9pbmNsdWRlL21hY2gtbworCitBbmQgYWxzbyBBcHBsZSdzIGRvY3VtZW50YXRpb24uCisiIiIKKworX192ZXJzaW9uX18gPSAnMS4wJwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNTc1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNTc1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsZC5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2R5bGQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxNGVjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2R5bGQucHkKQEAgLTAsMCArMSwxNjkgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyIiIgorZHlsZCBlbXVsYXRpb24KKyIiIgorCitpbXBvcnQgb3MKK2Zyb20gZnJhbWV3b3JrIGltcG9ydCBmcmFtZXdvcmtfaW5mbworZnJvbSBkeWxpYiBpbXBvcnQgZHlsaWJfaW5mbworZnJvbSBpdGVydG9vbHMgaW1wb3J0ICoKKworX19hbGxfXyA9IFsKKyAgICAnZHlsZF9maW5kJywgJ2ZyYW1ld29ya19maW5kJywKKyAgICAnZnJhbWV3b3JrX2luZm8nLCAnZHlsaWJfaW5mbycsCitdCisKKyMgVGhlc2UgYXJlIHRoZSBkZWZhdWx0cyBhcyBwZXIgbWFuIGR5bGQoMSkKKyMKK0RFRkFVTFRfRlJBTUVXT1JLX0ZBTExCQUNLID0gWworICAgIG9zLnBhdGguZXhwYW5kdXNlcigifi9MaWJyYXJ5L0ZyYW1ld29ya3MiKSwKKyAgICAiL0xpYnJhcnkvRnJhbWV3b3JrcyIsCisgICAgIi9OZXR3b3JrL0xpYnJhcnkvRnJhbWV3b3JrcyIsCisgICAgIi9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzIiwKK10KKworREVGQVVMVF9MSUJSQVJZX0ZBTExCQUNLID0gWworICAgIG9zLnBhdGguZXhwYW5kdXNlcigifi9saWIiKSwKKyAgICAiL3Vzci9sb2NhbC9saWIiLAorICAgICIvbGliIiwKKyAgICAiL3Vzci9saWIiLAorXQorCitkZWYgZW5zdXJlX3V0Zjgocyk6CisgICAgIiIiTm90IGFsbCBvZiBQeU9iakMgYW5kIFB5dGhvbiB1bmRlcnN0YW5kIHVuaWNvZGUgcGF0aHMgdmVyeSB3ZWxsIHlldCIiIgorICAgIGlmIGlzaW5zdGFuY2UocywgdW5pY29kZSk6CisgICAgICAgIHJldHVybiBzLmVuY29kZSgndXRmOCcpCisgICAgcmV0dXJuIHMKKworZGVmIGR5bGRfZW52KGVudiwgdmFyKToKKyAgICBpZiBlbnYgaXMgTm9uZToKKyAgICAgICAgZW52ID0gb3MuZW52aXJvbgorICAgIHJ2YWwgPSBlbnYuZ2V0KHZhcikKKyAgICBpZiBydmFsIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBbXQorICAgIHJldHVybiBydmFsLnNwbGl0KCc6JykKKworZGVmIGR5bGRfaW1hZ2Vfc3VmZml4KGVudj1Ob25lKToKKyAgICBpZiBlbnYgaXMgTm9uZToKKyAgICAgICAgZW52ID0gb3MuZW52aXJvbgorICAgIHJldHVybiBlbnYuZ2V0KCdEWUxEX0lNQUdFX1NVRkZJWCcpCisKK2RlZiBkeWxkX2ZyYW1ld29ya19wYXRoKGVudj1Ob25lKToKKyAgICByZXR1cm4gZHlsZF9lbnYoZW52LCAnRFlMRF9GUkFNRVdPUktfUEFUSCcpCisKK2RlZiBkeWxkX2xpYnJhcnlfcGF0aChlbnY9Tm9uZSk6CisgICAgcmV0dXJuIGR5bGRfZW52KGVudiwgJ0RZTERfTElCUkFSWV9QQVRIJykKKworZGVmIGR5bGRfZmFsbGJhY2tfZnJhbWV3b3JrX3BhdGgoZW52PU5vbmUpOgorICAgIHJldHVybiBkeWxkX2VudihlbnYsICdEWUxEX0ZBTExCQUNLX0ZSQU1FV09SS19QQVRIJykKKworZGVmIGR5bGRfZmFsbGJhY2tfbGlicmFyeV9wYXRoKGVudj1Ob25lKToKKyAgICByZXR1cm4gZHlsZF9lbnYoZW52LCAnRFlMRF9GQUxMQkFDS19MSUJSQVJZX1BBVEgnKQorCitkZWYgZHlsZF9pbWFnZV9zdWZmaXhfc2VhcmNoKGl0ZXJhdG9yLCBlbnY9Tm9uZSk6CisgICAgIiIiRm9yIGEgcG90ZW50aWFsIHBhdGggaXRlcmF0b3IsIGFkZCBEWUxEX0lNQUdFX1NVRkZJWCBzZW1hbnRpY3MiIiIKKyAgICBzdWZmaXggPSBkeWxkX2ltYWdlX3N1ZmZpeChlbnYpCisgICAgaWYgc3VmZml4IGlzIE5vbmU6CisgICAgICAgIHJldHVybiBpdGVyYXRvcgorICAgIGRlZiBfaW5qZWN0KGl0ZXJhdG9yPWl0ZXJhdG9yLCBzdWZmaXg9c3VmZml4KToKKyAgICAgICAgZm9yIHBhdGggaW4gaXRlcmF0b3I6CisgICAgICAgICAgICBpZiBwYXRoLmVuZHN3aXRoKCcuZHlsaWInKToKKyAgICAgICAgICAgICAgICB5aWVsZCBwYXRoWzotbGVuKCcuZHlsaWInKV0gKyBzdWZmaXggKyAnLmR5bGliJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCBwYXRoICsgc3VmZml4CisgICAgICAgICAgICB5aWVsZCBwYXRoCisgICAgcmV0dXJuIF9pbmplY3QoKQorCitkZWYgZHlsZF9vdmVycmlkZV9zZWFyY2gobmFtZSwgZW52PU5vbmUpOgorICAgICMgSWYgRFlMRF9GUkFNRVdPUktfUEFUSCBpcyBzZXQgYW5kIHRoaXMgZHlsaWJfbmFtZSBpcyBhCisgICAgIyBmcmFtZXdvcmsgbmFtZSwgdXNlIHRoZSBmaXJzdCBmaWxlIHRoYXQgZXhpc3RzIGluIHRoZSBmcmFtZXdvcmsKKyAgICAjIHBhdGggaWYgYW55LiAgSWYgdGhlcmUgaXMgbm9uZSBnbyBvbiB0byBzZWFyY2ggdGhlIERZTERfTElCUkFSWV9QQVRICisgICAgIyBpZiBhbnkuCisKKyAgICBmcmFtZXdvcmsgPSBmcmFtZXdvcmtfaW5mbyhuYW1lKQorCisgICAgaWYgZnJhbWV3b3JrIGlzIG5vdCBOb25lOgorICAgICAgICBmb3IgcGF0aCBpbiBkeWxkX2ZyYW1ld29ya19wYXRoKGVudik6CisgICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4ocGF0aCwgZnJhbWV3b3JrWyduYW1lJ10pCisKKyAgICAjIElmIERZTERfTElCUkFSWV9QQVRIIGlzIHNldCB0aGVuIHVzZSB0aGUgZmlyc3QgZmlsZSB0aGF0IGV4aXN0cworICAgICMgaW4gdGhlIHBhdGguICBJZiBub25lIHVzZSB0aGUgb3JpZ2luYWwgbmFtZS4KKyAgICBmb3IgcGF0aCBpbiBkeWxkX2xpYnJhcnlfcGF0aChlbnYpOgorICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4ocGF0aCwgb3MucGF0aC5iYXNlbmFtZShuYW1lKSkKKworZGVmIGR5bGRfZXhlY3V0YWJsZV9wYXRoX3NlYXJjaChuYW1lLCBleGVjdXRhYmxlX3BhdGg9Tm9uZSk6CisgICAgIyBJZiB3ZSBoYXZlbid0IGRvbmUgYW55IHNlYXJjaGluZyBhbmQgZm91bmQgYSBsaWJyYXJ5IGFuZCB0aGUKKyAgICAjIGR5bGliX25hbWUgc3RhcnRzIHdpdGggIkBleGVjdXRhYmxlX3BhdGgvIiB0aGVuIGNvbnN0cnVjdCB0aGUKKyAgICAjIGxpYnJhcnkgbmFtZS4KKyAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ0BleGVjdXRhYmxlX3BhdGgvJykgYW5kIGV4ZWN1dGFibGVfcGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKGV4ZWN1dGFibGVfcGF0aCwgbmFtZVtsZW4oJ0BleGVjdXRhYmxlX3BhdGgvJyk6XSkKKworZGVmIGR5bGRfZGVmYXVsdF9zZWFyY2gobmFtZSwgZW52PU5vbmUpOgorICAgIHlpZWxkIG5hbWUKKworICAgIGZyYW1ld29yayA9IGZyYW1ld29ya19pbmZvKG5hbWUpCisKKyAgICBpZiBmcmFtZXdvcmsgaXMgbm90IE5vbmU6CisgICAgICAgIGZhbGxiYWNrX2ZyYW1ld29ya19wYXRoID0gZHlsZF9mYWxsYmFja19mcmFtZXdvcmtfcGF0aChlbnYpCisgICAgICAgIGZvciBwYXRoIGluIGZhbGxiYWNrX2ZyYW1ld29ya19wYXRoOgorICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHBhdGgsIGZyYW1ld29ya1snbmFtZSddKQorCisgICAgZmFsbGJhY2tfbGlicmFyeV9wYXRoID0gZHlsZF9mYWxsYmFja19saWJyYXJ5X3BhdGgoZW52KQorICAgIGZvciBwYXRoIGluIGZhbGxiYWNrX2xpYnJhcnlfcGF0aDoKKyAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKHBhdGgsIG9zLnBhdGguYmFzZW5hbWUobmFtZSkpCisKKyAgICBpZiBmcmFtZXdvcmsgaXMgbm90IE5vbmUgYW5kIG5vdCBmYWxsYmFja19mcmFtZXdvcmtfcGF0aDoKKyAgICAgICAgZm9yIHBhdGggaW4gREVGQVVMVF9GUkFNRVdPUktfRkFMTEJBQ0s6CisgICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4ocGF0aCwgZnJhbWV3b3JrWyduYW1lJ10pCisKKyAgICBpZiBub3QgZmFsbGJhY2tfbGlicmFyeV9wYXRoOgorICAgICAgICBmb3IgcGF0aCBpbiBERUZBVUxUX0xJQlJBUllfRkFMTEJBQ0s6CisgICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4ocGF0aCwgb3MucGF0aC5iYXNlbmFtZShuYW1lKSkKKworZGVmIGR5bGRfZmluZChuYW1lLCBleGVjdXRhYmxlX3BhdGg9Tm9uZSwgZW52PU5vbmUpOgorICAgICIiIgorICAgIEZpbmQgYSBsaWJyYXJ5IG9yIGZyYW1ld29yayB1c2luZyBkeWxkIHNlbWFudGljcworICAgICIiIgorICAgIG5hbWUgPSBlbnN1cmVfdXRmOChuYW1lKQorICAgIGV4ZWN1dGFibGVfcGF0aCA9IGVuc3VyZV91dGY4KGV4ZWN1dGFibGVfcGF0aCkKKyAgICBmb3IgcGF0aCBpbiBkeWxkX2ltYWdlX3N1ZmZpeF9zZWFyY2goY2hhaW4oCisgICAgICAgICAgICAgICAgZHlsZF9vdmVycmlkZV9zZWFyY2gobmFtZSwgZW52KSwKKyAgICAgICAgICAgICAgICBkeWxkX2V4ZWN1dGFibGVfcGF0aF9zZWFyY2gobmFtZSwgZXhlY3V0YWJsZV9wYXRoKSwKKyAgICAgICAgICAgICAgICBkeWxkX2RlZmF1bHRfc2VhcmNoKG5hbWUsIGVudiksCisgICAgICAgICAgICApLCBlbnYpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgIHJldHVybiBwYXRoCisgICAgcmFpc2UgVmFsdWVFcnJvcigiZHlsaWIgJXMgY291bGQgbm90IGJlIGZvdW5kIiAlIChuYW1lLCkpCisKK2RlZiBmcmFtZXdvcmtfZmluZChmbiwgZXhlY3V0YWJsZV9wYXRoPU5vbmUsIGVudj1Ob25lKToKKyAgICAiIiIKKyAgICBGaW5kIGEgZnJhbWV3b3JrIHVzaW5nIGR5bGQgc2VtYW50aWNzIGluIGEgdmVyeSBsb29zZSBtYW5uZXIuCisKKyAgICBXaWxsIHRha2UgaW5wdXQgc3VjaCBhczoKKyAgICAgICAgUHl0aG9uCisgICAgICAgIFB5dGhvbi5mcmFtZXdvcmsKKyAgICAgICAgUHl0aG9uLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50CisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gZHlsZF9maW5kKGZuLCBleGVjdXRhYmxlX3BhdGg9ZXhlY3V0YWJsZV9wYXRoLCBlbnY9ZW52KQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICBwYXNzCisgICAgZm13a19pbmRleCA9IGZuLnJmaW5kKCcuZnJhbWV3b3JrJykKKyAgICBpZiBmbXdrX2luZGV4ID09IC0xOgorICAgICAgICBmbXdrX2luZGV4ID0gbGVuKGZuKQorICAgICAgICBmbiArPSAnLmZyYW1ld29yaycKKyAgICBmbiA9IG9zLnBhdGguam9pbihmbiwgb3MucGF0aC5iYXNlbmFtZShmbls6Zm13a19pbmRleF0pKQorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGR5bGRfZmluZChmbiwgZXhlY3V0YWJsZV9wYXRoPWV4ZWN1dGFibGVfcGF0aCwgZW52PWVudikKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcmFpc2UgZQorCitkZWYgdGVzdF9keWxkX2ZpbmQoKToKKyAgICBlbnYgPSB7fQorICAgIGFzc2VydCBkeWxkX2ZpbmQoJ2xpYlN5c3RlbS5keWxpYicpID09ICcvdXNyL2xpYi9saWJTeXN0ZW0uZHlsaWInCisgICAgYXNzZXJ0IGR5bGRfZmluZCgnU3lzdGVtLmZyYW1ld29yay9TeXN0ZW0nKSA9PSAnL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvU3lzdGVtLmZyYW1ld29yay9TeXN0ZW0nCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9keWxkX2ZpbmQoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsZC5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9keWxkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWMzY2EwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsZC5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9keWxkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBjMzMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsaWIucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9keWxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTNkZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsaWIucHkKQEAgLTAsMCArMSw2NiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIiIiCitHZW5lcmljIGR5bGliIHBhdGggbWFuaXB1bGF0aW9uCisiIiIKKworaW1wb3J0IHJlCisKK19fYWxsX18gPSBbJ2R5bGliX2luZm8nXQorCitEWUxJQl9SRSA9IHJlLmNvbXBpbGUociIiIig/eCkKKyg/UDxsb2NhdGlvbj5eLiopKD86XnwvKQorKD9QPG5hbWU+CisgICAgKD9QPHNob3J0bmFtZT5cdys/KQorICAgICg/OlwuKD9QPHZlcnNpb24+W14uX10rKSk/CisgICAgKD86Xyg/UDxzdWZmaXg+W14uX10rKSk/CisgICAgXC5keWxpYiQKKykKKyIiIikKKworZGVmIGR5bGliX2luZm8oZmlsZW5hbWUpOgorICAgICIiIgorICAgIEEgZHlsaWIgbmFtZSBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3VyIGZvcm1zOgorICAgICAgICBMb2NhdGlvbi9OYW1lLlNvbWVWZXJzaW9uX1N1ZmZpeC5keWxpYgorICAgICAgICBMb2NhdGlvbi9OYW1lLlNvbWVWZXJzaW9uLmR5bGliCisgICAgICAgIExvY2F0aW9uL05hbWVfU3VmZml4LmR5bGliCisgICAgICAgIExvY2F0aW9uL05hbWUuZHlsaWIKKworICAgIHJldHVybnMgTm9uZSBpZiBub3QgZm91bmQgb3IgYSBtYXBwaW5nIGVxdWl2YWxlbnQgdG86CisgICAgICAgIGRpY3QoCisgICAgICAgICAgICBsb2NhdGlvbj0nTG9jYXRpb24nLAorICAgICAgICAgICAgbmFtZT0nTmFtZS5Tb21lVmVyc2lvbl9TdWZmaXguZHlsaWInLAorICAgICAgICAgICAgc2hvcnRuYW1lPSdOYW1lJywKKyAgICAgICAgICAgIHZlcnNpb249J1NvbWVWZXJzaW9uJywKKyAgICAgICAgICAgIHN1ZmZpeD0nU3VmZml4JywKKyAgICAgICAgKQorCisgICAgTm90ZSB0aGF0IFNvbWVWZXJzaW9uIGFuZCBTdWZmaXggYXJlIG9wdGlvbmFsIGFuZCBtYXkgYmUgTm9uZQorICAgIGlmIG5vdCBwcmVzZW50LgorICAgICIiIgorICAgIGlzX2R5bGliID0gRFlMSUJfUkUubWF0Y2goZmlsZW5hbWUpCisgICAgaWYgbm90IGlzX2R5bGliOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiBpc19keWxpYi5ncm91cGRpY3QoKQorCisKK2RlZiB0ZXN0X2R5bGliX2luZm8oKToKKyAgICBkZWYgZChsb2NhdGlvbj1Ob25lLCBuYW1lPU5vbmUsIHNob3J0bmFtZT1Ob25lLCB2ZXJzaW9uPU5vbmUsIHN1ZmZpeD1Ob25lKToKKyAgICAgICAgcmV0dXJuIGRpY3QoCisgICAgICAgICAgICBsb2NhdGlvbj1sb2NhdGlvbiwKKyAgICAgICAgICAgIG5hbWU9bmFtZSwKKyAgICAgICAgICAgIHNob3J0bmFtZT1zaG9ydG5hbWUsCisgICAgICAgICAgICB2ZXJzaW9uPXZlcnNpb24sCisgICAgICAgICAgICBzdWZmaXg9c3VmZml4CisgICAgICAgICkKKyAgICBhc3NlcnQgZHlsaWJfaW5mbygnY29tcGxldGVseS9pbnZhbGlkJykgaXMgTm9uZQorICAgIGFzc2VydCBkeWxpYl9pbmZvKCdjb21wbGV0ZWx5L2ludmFsaWRlX2RlYnVnJykgaXMgTm9uZQorICAgIGFzc2VydCBkeWxpYl9pbmZvKCdQL0Zvby5keWxpYicpID09IGQoJ1AnLCAnRm9vLmR5bGliJywgJ0ZvbycpCisgICAgYXNzZXJ0IGR5bGliX2luZm8oJ1AvRm9vX2RlYnVnLmR5bGliJykgPT0gZCgnUCcsICdGb29fZGVidWcuZHlsaWInLCAnRm9vJywgc3VmZml4PSdkZWJ1ZycpCisgICAgYXNzZXJ0IGR5bGliX2luZm8oJ1AvRm9vLkEuZHlsaWInKSA9PSBkKCdQJywgJ0Zvby5BLmR5bGliJywgJ0ZvbycsICdBJykKKyAgICBhc3NlcnQgZHlsaWJfaW5mbygnUC9Gb29fZGVidWcuQS5keWxpYicpID09IGQoJ1AnLCAnRm9vX2RlYnVnLkEuZHlsaWInLCAnRm9vX2RlYnVnJywgJ0EnKQorICAgIGFzc2VydCBkeWxpYl9pbmZvKCdQL0Zvby5BX2RlYnVnLmR5bGliJykgPT0gZCgnUCcsICdGb28uQV9kZWJ1Zy5keWxpYicsICdGb28nLCAnQScsICdkZWJ1ZycpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9keWxpYl9pbmZvKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDAxZTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzhiODhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2ZldGNoX21hY2hvbGliIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZmV0Y2hfbWFjaG9saWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTZkNmEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2ZldGNoX21hY2hvbGliCkBAIC0wLDAgKzEsMiBAQAorIyEvYmluL3NoCitzdm4gZXhwb3J0IC0tZm9yY2UgaHR0cDovL3N2bi5yZWQtYmVhbi5jb20vYm9iL21hY2hvbGliL3RydW5rL21hY2hvbGliLyAuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9mZXRjaF9tYWNob2xpYi5iYXQgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9mZXRjaF9tYWNob2xpYi5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllMWMwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2ZldGNoX21hY2hvbGliLmJhdApAQCAtMCwwICsxIEBACitzdm4gZXhwb3J0IC0tZm9yY2UgaHR0cDovL3N2bi5yZWQtYmVhbi5jb20vYm9iL21hY2hvbGliL3RydW5rL21hY2hvbGliLyAuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9mcmFtZXdvcmsucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9mcmFtZXdvcmsucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3ZmIyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weQpAQCAtMCwwICsxLDY4IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisiIiIKK0dlbmVyaWMgZnJhbWV3b3JrIHBhdGggbWFuaXB1bGF0aW9uCisiIiIKKworaW1wb3J0IHJlCisKK19fYWxsX18gPSBbJ2ZyYW1ld29ya19pbmZvJ10KKworU1RSSUNUX0ZSQU1FV09SS19SRSA9IHJlLmNvbXBpbGUociIiIig/eCkKKyg/UDxsb2NhdGlvbj5eLiopKD86XnwvKQorKD9QPG5hbWU+CisgICAgKD9QPHNob3J0bmFtZT5cdyspLmZyYW1ld29yay8KKyAgICAoPzpWZXJzaW9ucy8oP1A8dmVyc2lvbj5bXi9dKykvKT8KKyAgICAoP1A9c2hvcnRuYW1lKQorICAgICg/Ol8oP1A8c3VmZml4PlteX10rKSk/CispJAorIiIiKQorCitkZWYgZnJhbWV3b3JrX2luZm8oZmlsZW5hbWUpOgorICAgICIiIgorICAgIEEgZnJhbWV3b3JrIG5hbWUgY2FuIHRha2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcgZm91ciBmb3JtczoKKyAgICAgICAgTG9jYXRpb24vTmFtZS5mcmFtZXdvcmsvVmVyc2lvbnMvU29tZVZlcnNpb24vTmFtZV9TdWZmaXgKKyAgICAgICAgTG9jYXRpb24vTmFtZS5mcmFtZXdvcmsvVmVyc2lvbnMvU29tZVZlcnNpb24vTmFtZQorICAgICAgICBMb2NhdGlvbi9OYW1lLmZyYW1ld29yay9OYW1lX1N1ZmZpeAorICAgICAgICBMb2NhdGlvbi9OYW1lLmZyYW1ld29yay9OYW1lCisKKyAgICByZXR1cm5zIE5vbmUgaWYgbm90IGZvdW5kLCBvciBhIG1hcHBpbmcgZXF1aXZhbGVudCB0bzoKKyAgICAgICAgZGljdCgKKyAgICAgICAgICAgIGxvY2F0aW9uPSdMb2NhdGlvbicsCisgICAgICAgICAgICBuYW1lPSdOYW1lLmZyYW1ld29yay9WZXJzaW9ucy9Tb21lVmVyc2lvbi9OYW1lX1N1ZmZpeCcsCisgICAgICAgICAgICBzaG9ydG5hbWU9J05hbWUnLAorICAgICAgICAgICAgdmVyc2lvbj0nU29tZVZlcnNpb24nLAorICAgICAgICAgICAgc3VmZml4PSdTdWZmaXgnLAorICAgICAgICApCisKKyAgICBOb3RlIHRoYXQgU29tZVZlcnNpb24gYW5kIFN1ZmZpeCBhcmUgb3B0aW9uYWwgYW5kIG1heSBiZSBOb25lCisgICAgaWYgbm90IHByZXNlbnQKKyAgICAiIiIKKyAgICBpc19mcmFtZXdvcmsgPSBTVFJJQ1RfRlJBTUVXT1JLX1JFLm1hdGNoKGZpbGVuYW1lKQorICAgIGlmIG5vdCBpc19mcmFtZXdvcms6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIGlzX2ZyYW1ld29yay5ncm91cGRpY3QoKQorCitkZWYgdGVzdF9mcmFtZXdvcmtfaW5mbygpOgorICAgIGRlZiBkKGxvY2F0aW9uPU5vbmUsIG5hbWU9Tm9uZSwgc2hvcnRuYW1lPU5vbmUsIHZlcnNpb249Tm9uZSwgc3VmZml4PU5vbmUpOgorICAgICAgICByZXR1cm4gZGljdCgKKyAgICAgICAgICAgIGxvY2F0aW9uPWxvY2F0aW9uLAorICAgICAgICAgICAgbmFtZT1uYW1lLAorICAgICAgICAgICAgc2hvcnRuYW1lPXNob3J0bmFtZSwKKyAgICAgICAgICAgIHZlcnNpb249dmVyc2lvbiwKKyAgICAgICAgICAgIHN1ZmZpeD1zdWZmaXgKKyAgICAgICAgKQorICAgIGFzc2VydCBmcmFtZXdvcmtfaW5mbygnY29tcGxldGVseS9pbnZhbGlkJykgaXMgTm9uZQorICAgIGFzc2VydCBmcmFtZXdvcmtfaW5mbygnY29tcGxldGVseS9pbnZhbGlkL19kZWJ1ZycpIGlzIE5vbmUKKyAgICBhc3NlcnQgZnJhbWV3b3JrX2luZm8oJ1AvRi5mcmFtZXdvcmsnKSBpcyBOb25lCisgICAgYXNzZXJ0IGZyYW1ld29ya19pbmZvKCdQL0YuZnJhbWV3b3JrL19kZWJ1ZycpIGlzIE5vbmUKKyAgICBhc3NlcnQgZnJhbWV3b3JrX2luZm8oJ1AvRi5mcmFtZXdvcmsvRicpID09IGQoJ1AnLCAnRi5mcmFtZXdvcmsvRicsICdGJykKKyAgICBhc3NlcnQgZnJhbWV3b3JrX2luZm8oJ1AvRi5mcmFtZXdvcmsvRl9kZWJ1ZycpID09IGQoJ1AnLCAnRi5mcmFtZXdvcmsvRl9kZWJ1ZycsICdGJywgc3VmZml4PSdkZWJ1ZycpCisgICAgYXNzZXJ0IGZyYW1ld29ya19pbmZvKCdQL0YuZnJhbWV3b3JrL1ZlcnNpb25zJykgaXMgTm9uZQorICAgIGFzc2VydCBmcmFtZXdvcmtfaW5mbygnUC9GLmZyYW1ld29yay9WZXJzaW9ucy9BJykgaXMgTm9uZQorICAgIGFzc2VydCBmcmFtZXdvcmtfaW5mbygnUC9GLmZyYW1ld29yay9WZXJzaW9ucy9BL0YnKSA9PSBkKCdQJywgJ0YuZnJhbWV3b3JrL1ZlcnNpb25zL0EvRicsICdGJywgJ0EnKQorICAgIGFzc2VydCBmcmFtZXdvcmtfaW5mbygnUC9GLmZyYW1ld29yay9WZXJzaW9ucy9BL0ZfZGVidWcnKSA9PSBkKCdQJywgJ0YuZnJhbWV3b3JrL1ZlcnNpb25zL0EvRl9kZWJ1ZycsICdGJywgJ0EnLCAnZGVidWcnKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfZnJhbWV3b3JrX2luZm8oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZnJhbWV3b3JrLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4ZTI4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZnJhbWV3b3JrLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0NWVhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA4ZTQxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvX19pbml0X18ucHkKQEAgLTAsMCArMSwyMDggQEAKK2ltcG9ydCBvcywgc3lzLCB1bml0dGVzdCwgZ2V0b3B0LCB0aW1lCisKK3VzZV9yZXNvdXJjZXMgPSBbXQorCitjbGFzcyBSZXNvdXJjZURlbmllZChFeGNlcHRpb24pOgorICAgICIiIlRlc3Qgc2tpcHBlZCBiZWNhdXNlIGl0IHJlcXVlc3RlZCBhIGRpc2FsbG93ZWQgcmVzb3VyY2UuCisKKyAgICBUaGlzIGlzIHJhaXNlZCB3aGVuIGEgdGVzdCBjYWxscyByZXF1aXJlcygpIGZvciBhIHJlc291cmNlIHRoYXQKKyAgICBoYXMgbm90IGJlIGVuYWJsZWQuICBSZXNvdXJjZXMgYXJlIGRlZmluZWQgYnkgdGVzdCBtb2R1bGVzLgorICAgICIiIgorCitkZWYgaXNfcmVzb3VyY2VfZW5hYmxlZChyZXNvdXJjZSk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGEgcmVzb3VyY2UgaXMgZW5hYmxlZC4KKworICAgIElmIHRoZSBjYWxsZXIncyBtb2R1bGUgaXMgX19tYWluX18gdGhlbiBhdXRvbWF0aWNhbGx5IHJldHVybiBUcnVlLiIiIgorICAgIGlmIHN5cy5fZ2V0ZnJhbWUoKS5mX2JhY2suZl9nbG9iYWxzLmdldCgiX19uYW1lX18iKSA9PSAiX19tYWluX18iOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJlc3VsdCA9IHVzZV9yZXNvdXJjZXMgaXMgbm90IE5vbmUgYW5kIFwKKyAgICAgICAgICAgKHJlc291cmNlIGluIHVzZV9yZXNvdXJjZXMgb3IgIioiIGluIHVzZV9yZXNvdXJjZXMpCisgICAgaWYgbm90IHJlc3VsdDoKKyAgICAgICAgX3VuYXZhaWxbcmVzb3VyY2VdID0gTm9uZQorICAgIHJldHVybiByZXN1bHQKKworX3VuYXZhaWwgPSB7fQorZGVmIHJlcXVpcmVzKHJlc291cmNlLCBtc2c9Tm9uZSk6CisgICAgIiIiUmFpc2UgUmVzb3VyY2VEZW5pZWQgaWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlLgorCisgICAgSWYgdGhlIGNhbGxlcidzIG1vZHVsZSBpcyBfX21haW5fXyB0aGVuIGF1dG9tYXRpY2FsbHkgcmV0dXJuIFRydWUuIiIiCisgICAgIyBzZWUgaWYgdGhlIGNhbGxlcidzIG1vZHVsZSBpcyBfX21haW5fXyAtIGlmIHNvLCB0cmVhdCBhcyBpZgorICAgICMgdGhlIHJlc291cmNlIHdhcyBzZXQKKyAgICBpZiBzeXMuX2dldGZyYW1lKCkuZl9iYWNrLmZfZ2xvYmFscy5nZXQoIl9fbmFtZV9fIikgPT0gIl9fbWFpbl9fIjoKKyAgICAgICAgcmV0dXJuCisgICAgaWYgbm90IGlzX3Jlc291cmNlX2VuYWJsZWQocmVzb3VyY2UpOgorICAgICAgICBpZiBtc2cgaXMgTm9uZToKKyAgICAgICAgICAgIG1zZyA9ICJVc2Ugb2YgdGhlIGAlcycgcmVzb3VyY2Ugbm90IGVuYWJsZWQiICUgcmVzb3VyY2UKKyAgICAgICAgcmFpc2UgUmVzb3VyY2VEZW5pZWQobXNnKQorCitkZWYgZmluZF9wYWNrYWdlX21vZHVsZXMocGFja2FnZSwgbWFzayk6CisgICAgaW1wb3J0IGZubWF0Y2gKKyAgICBpZiAoaGFzYXR0cihwYWNrYWdlLCAiX19sb2FkZXJfXyIpIGFuZAorICAgICAgICAgICAgaGFzYXR0cihwYWNrYWdlLl9fbG9hZGVyX18sICdfZmlsZXMnKSk6CisgICAgICAgIHBhdGggPSBwYWNrYWdlLl9fbmFtZV9fLnJlcGxhY2UoIi4iLCBvcy5wYXRoLnNlcCkKKyAgICAgICAgbWFzayA9IG9zLnBhdGguam9pbihwYXRoLCBtYXNrKQorICAgICAgICBmb3IgZm5tIGluIHBhY2thZ2UuX19sb2FkZXJfXy5fZmlsZXMuaXRlcmtleXMoKToKKyAgICAgICAgICAgIGlmIGZubWF0Y2guZm5tYXRjaGNhc2UoZm5tLCBtYXNrKToKKyAgICAgICAgICAgICAgICB5aWVsZCBvcy5wYXRoLnNwbGl0ZXh0KGZubSlbMF0ucmVwbGFjZShvcy5wYXRoLnNlcCwgIi4iKQorICAgIGVsc2U6CisgICAgICAgIHBhdGggPSBwYWNrYWdlLl9fcGF0aF9fWzBdCisgICAgICAgIGZvciBmbm0gaW4gb3MubGlzdGRpcihwYXRoKToKKyAgICAgICAgICAgIGlmIGZubWF0Y2guZm5tYXRjaGNhc2UoZm5tLCBtYXNrKToKKyAgICAgICAgICAgICAgICB5aWVsZCAiJXMuJXMiICUgKHBhY2thZ2UuX19uYW1lX18sIG9zLnBhdGguc3BsaXRleHQoZm5tKVswXSkKKworZGVmIGdldF90ZXN0cyhwYWNrYWdlLCBtYXNrLCB2ZXJib3NpdHksIGV4Y2x1ZGU9KCkpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc2tpcHBlZCB0ZXN0IG1vZHVsZXMsIGFuZCBhIGxpc3Qgb2YgdGVzdCBjYXNlcy4iIiIKKyAgICB0ZXN0cyA9IFtdCisgICAgc2tpcHBlZCA9IFtdCisgICAgZm9yIG1vZG5hbWUgaW4gZmluZF9wYWNrYWdlX21vZHVsZXMocGFja2FnZSwgbWFzayk6CisgICAgICAgIGlmIG1vZG5hbWUuc3BsaXQoIi4iKVstMV0gaW4gZXhjbHVkZToKKyAgICAgICAgICAgIHNraXBwZWQuYXBwZW5kKG1vZG5hbWUpCisgICAgICAgICAgICBpZiB2ZXJib3NpdHkgPiAxOgorICAgICAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJTa2lwcGVkICVzOiBleGNsdWRlZCIgJSBtb2RuYW1lCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKG1vZG5hbWUsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQorICAgICAgICBleGNlcHQgKFJlc291cmNlRGVuaWVkLCB1bml0dGVzdC5Ta2lwVGVzdCkgYXMgZGV0YWlsOgorICAgICAgICAgICAgc2tpcHBlZC5hcHBlbmQobW9kbmFtZSkKKyAgICAgICAgICAgIGlmIHZlcmJvc2l0eSA+IDE6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIlNraXBwZWQgJXM6ICVzIiAlIChtb2RuYW1lLCBkZXRhaWwpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3IgbmFtZSBpbiBkaXIobW9kKToKKyAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgiXyIpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBvID0gZ2V0YXR0cihtb2QsIG5hbWUpCisgICAgICAgICAgICBpZiB0eXBlKG8pIGlzIHR5cGUodW5pdHRlc3QuVGVzdENhc2UpIGFuZCBpc3N1YmNsYXNzKG8sIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICB0ZXN0cy5hcHBlbmQobykKKyAgICByZXR1cm4gc2tpcHBlZCwgdGVzdHMKKworZGVmIHVzYWdlKCk6CisgICAgcHJpbnQgX19kb2NfXworICAgIHJldHVybiAxCisKK2RlZiB0ZXN0X3dpdGhfcmVmY291bnRzKHJ1bm5lciwgdmVyYm9zaXR5LCB0ZXN0Y2FzZSk6CisgICAgIiIiUnVuIHRlc3RjYXNlIHNldmVyYWwgdGltZXMsIHRyYWNraW5nIHJlZmVyZW5jZSBjb3VudHMuIiIiCisgICAgaW1wb3J0IGdjCisgICAgaW1wb3J0IGN0eXBlcworICAgIHB0YyA9IGN0eXBlcy5fcG9pbnRlcl90eXBlX2NhY2hlLmNvcHkoKQorICAgIGNmYyA9IGN0eXBlcy5fY19mdW5jdHlwZV9jYWNoZS5jb3B5KCkKKyAgICB3ZmMgPSBjdHlwZXMuX3dpbl9mdW5jdHlwZV9jYWNoZS5jb3B5KCkKKworICAgICMgd2hlbiBzZWFyY2hpbmcgZm9yIHJlZmNvdW50IGxlYWtzLCB3ZSBoYXZlIHRvIG1hbnVhbGx5IHJlc2V0IGFueQorICAgICMgY2FjaGVzIHRoYXQgY3R5cGVzIGhhcy4KKyAgICBkZWYgY2xlYW51cCgpOgorICAgICAgICBjdHlwZXMuX3BvaW50ZXJfdHlwZV9jYWNoZSA9IHB0Yy5jb3B5KCkKKyAgICAgICAgY3R5cGVzLl9jX2Z1bmN0eXBlX2NhY2hlID0gY2ZjLmNvcHkoKQorICAgICAgICBjdHlwZXMuX3dpbl9mdW5jdHlwZV9jYWNoZSA9IHdmYy5jb3B5KCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICB0ZXN0ID0gdW5pdHRlc3QubWFrZVN1aXRlKHRlc3RjYXNlKQorICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcnVubmVyLnJ1bih0ZXN0KQorICAgICAgICBjbGVhbnVwKCkKKyAgICBDT1VOVCA9IDUKKyAgICByZWZjb3VudHMgPSBbTm9uZV0gKiBDT1VOVAorICAgIGZvciBpIGluIHJhbmdlKENPVU5UKToKKyAgICAgICAgcmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIHJ1bm5lci5ydW4odGVzdCkKKyAgICAgICAgY2xlYW51cCgpCisgICAgICAgIHJlZmNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkgLSByYworICAgIGlmIGZpbHRlcihOb25lLCByZWZjb3VudHMpOgorICAgICAgICBwcmludCAiJXMgbGVha3M6XG5cdCIgJSB0ZXN0Y2FzZSwgcmVmY291bnRzCisgICAgZWxpZiB2ZXJib3NpdHk6CisgICAgICAgIHByaW50ICIlczogb2suIiAlIHRlc3RjYXNlCisKK2NsYXNzIFRlc3RSdW5uZXIodW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIpOgorICAgIGRlZiBydW4oc2VsZiwgdGVzdCwgc2tpcHBlZCk6CisgICAgICAgICJSdW4gdGhlIGdpdmVuIHRlc3QgY2FzZSBvciB0ZXN0IHN1aXRlLiIKKyAgICAgICAgIyBTYW1lIGFzIHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyLnJ1biwgZXhjZXB0IHRoYXQgaXQgcmVwb3J0cworICAgICAgICAjIHNraXBwZWQgdGVzdHMuCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX21ha2VSZXN1bHQoKQorICAgICAgICBzdGFydFRpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICB0ZXN0KHJlc3VsdCkKKyAgICAgICAgc3RvcFRpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICB0aW1lVGFrZW4gPSBzdG9wVGltZSAtIHN0YXJ0VGltZQorICAgICAgICByZXN1bHQucHJpbnRFcnJvcnMoKQorICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKHJlc3VsdC5zZXBhcmF0b3IyKQorICAgICAgICBydW4gPSByZXN1bHQudGVzdHNSdW4KKyAgICAgICAgaWYgX3VuYXZhaWw6ICNza2lwcGVkOgorICAgICAgICAgICAgcmVxdWVzdGVkID0gX3VuYXZhaWwua2V5cygpCisgICAgICAgICAgICByZXF1ZXN0ZWQuc29ydCgpCisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCJSYW4gJWQgdGVzdCVzIGluICUuM2ZzICglcyBtb2R1bGUlcyBza2lwcGVkKSIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocnVuLCBydW4gIT0gMSBhbmQgInMiIG9yICIiLCB0aW1lVGFrZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oc2tpcHBlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oc2tpcHBlZCkgIT0gMSBhbmQgInMiIG9yICIiKSkKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oIlVuYXZhaWxhYmxlIHJlc291cmNlczogJXMiICUgIiwgIi5qb2luKHJlcXVlc3RlZCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCJSYW4gJWQgdGVzdCVzIGluICUuM2ZzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChydW4sIHJ1biAhPSAxIGFuZCAicyIgb3IgIiIsIHRpbWVUYWtlbikpCisgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oKQorICAgICAgICBpZiBub3QgcmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKCJGQUlMRUQgKCIpCisgICAgICAgICAgICBmYWlsZWQsIGVycm9yZWQgPSBtYXAobGVuLCAocmVzdWx0LmZhaWx1cmVzLCByZXN1bHQuZXJyb3JzKSkKKyAgICAgICAgICAgIGlmIGZhaWxlZDoKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgiZmFpbHVyZXM9JWQiICUgZmFpbGVkKQorICAgICAgICAgICAgaWYgZXJyb3JlZDoKKyAgICAgICAgICAgICAgICBpZiBmYWlsZWQ6IHNlbGYuc3RyZWFtLndyaXRlKCIsICIpCisgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoImVycm9ycz0lZCIgJSBlcnJvcmVkKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigiKSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCJPSyIpCisgICAgICAgIHJldHVybiByZXN1bHQKKworCitkZWYgbWFpbigqcGFja2FnZXMpOgorICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAicnF2dTp4OiIpCisgICAgZXhjZXB0IGdldG9wdC5lcnJvcjoKKyAgICAgICAgcmV0dXJuIHVzYWdlKCkKKworICAgIHZlcmJvc2l0eSA9IDEKKyAgICBzZWFyY2hfbGVha3MgPSBGYWxzZQorICAgIGV4Y2x1ZGUgPSBbXQorICAgIGZvciBmbGFnLCB2YWx1ZSBpbiBvcHRzOgorICAgICAgICBpZiBmbGFnID09ICItcSI6CisgICAgICAgICAgICB2ZXJib3NpdHkgLT0gMQorICAgICAgICBlbGlmIGZsYWcgPT0gIi12IjoKKyAgICAgICAgICAgIHZlcmJvc2l0eSArPSAxCisgICAgICAgIGVsaWYgZmxhZyA9PSAiLXIiOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5cy5nZXR0b3RhbHJlZmNvdW50CisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIi1yIGZsYWcgcmVxdWlyZXMgUHl0aG9uIGRlYnVnIGJ1aWxkIgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgc2VhcmNoX2xlYWtzID0gVHJ1ZQorICAgICAgICBlbGlmIGZsYWcgPT0gIi11IjoKKyAgICAgICAgICAgIHVzZV9yZXNvdXJjZXMuZXh0ZW5kKHZhbHVlLnNwbGl0KCIsIikpCisgICAgICAgIGVsaWYgZmxhZyA9PSAiLXgiOgorICAgICAgICAgICAgZXhjbHVkZS5leHRlbmQodmFsdWUuc3BsaXQoIiwiKSkKKworICAgIG1hc2sgPSAidGVzdF8qLnB5IgorICAgIGlmIGFyZ3M6CisgICAgICAgIG1hc2sgPSBhcmdzWzBdCisKKyAgICBmb3IgcGFja2FnZSBpbiBwYWNrYWdlczoKKyAgICAgICAgcnVuX3Rlc3RzKHBhY2thZ2UsIG1hc2ssIHZlcmJvc2l0eSwgc2VhcmNoX2xlYWtzLCBleGNsdWRlKQorCisKK2RlZiBydW5fdGVzdHMocGFja2FnZSwgbWFzaywgdmVyYm9zaXR5LCBzZWFyY2hfbGVha3MsIGV4Y2x1ZGUpOgorICAgIHNraXBwZWQsIHRlc3RjYXNlcyA9IGdldF90ZXN0cyhwYWNrYWdlLCBtYXNrLCB2ZXJib3NpdHksIGV4Y2x1ZGUpCisgICAgcnVubmVyID0gVGVzdFJ1bm5lcih2ZXJib3NpdHk9dmVyYm9zaXR5KQorCisgICAgc3VpdGVzID0gW3VuaXR0ZXN0Lm1ha2VTdWl0ZShvKSBmb3IgbyBpbiB0ZXN0Y2FzZXNdCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoc3VpdGVzKQorICAgIHJlc3VsdCA9IHJ1bm5lci5ydW4oc3VpdGUsIHNraXBwZWQpCisKKyAgICBpZiBzZWFyY2hfbGVha3M6CisgICAgICAgICMgaHVudCBmb3IgcmVmY291bnQgbGVha3MKKyAgICAgICAgcnVubmVyID0gQmFzaWNUZXN0UnVubmVyKCkKKyAgICAgICAgZm9yIHQgaW4gdGVzdGNhc2VzOgorICAgICAgICAgICAgdGVzdF93aXRoX3JlZmNvdW50cyhydW5uZXIsIHZlcmJvc2l0eSwgdCkKKworICAgIHJldHVybiBib29sKHJlc3VsdC5lcnJvcnMpCisKK2NsYXNzIEJhc2ljVGVzdFJ1bm5lcjoKKyAgICBkZWYgcnVuKHNlbGYsIHRlc3QpOgorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgdGVzdChyZXN1bHQpCisgICAgICAgIHJldHVybiByZXN1bHQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiYjVkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiYjVkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvcnVudGVzdHMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3J1bnRlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzFmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3J1bnRlc3RzLnB5CkBAIC0wLDAgKzEsMTkgQEAKKyIiIlVzYWdlOiBydW50ZXN0cy5weSBbLXFdIFstcl0gWy12XSBbLXUgcmVzb3VyY2VzXSBbbWFza10KKworUnVuIGFsbCB0ZXN0cyBmb3VuZCBpbiB0aGlzIGRpcmVjdG9yeSwgYW5kIHByaW50IGEgc3VtbWFyeSBvZiB0aGUgcmVzdWx0cy4KK0NvbW1hbmQgbGluZSBmbGFnczoKKyAgLXEgICAgIHF1aWV0IG1vZGU6IGRvbid0IHBybnQgYW55dGhpbmcgd2hpbGUgdGhlIHRlc3RzIGFyZSBydW5uaW5nCisgIC1yICAgICBydW4gdGVzdHMgcmVwZWF0ZWRseSwgbG9vayBmb3IgcmVmY291bnQgbGVha3MKKyAgLXU8cmVzb3VyY2VzPgorICAgICAgICAgQWRkIHJlc291cmNlcyB0byB0aGUgbGl0cyBvZiBhbGxvd2VkIHJlc291cmNlcy4gJyonIGFsbG93cyBhbGwKKyAgICAgICAgIHJlc291cmNlcy4KKyAgLXYgICAgIHZlcmJvc2UgbW9kZTogcHJpbnQgdGhlIHRlc3QgY3VycmVudGx5IGV4ZWN1dGVkCisgIC14PHRlc3QxWyx0ZXN0Mi4uLl0+CisgICAgICAgICBFeGNsdWRlIHNwZWNpZmllZCB0ZXN0cy4KKyAgbWFzayAgIG1hc2sgdG8gc2VsZWN0IGZpbGVuYW1lcyBjb250YWluaW5nIHRlc3RjYXNlcywgd2lsZGNhcmRzIGFsbG93ZWQKKyIiIgoraW1wb3J0IHN5cworaW1wb3J0IGN0eXBlcy50ZXN0CisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3lzLmV4aXQoY3R5cGVzLnRlc3QubWFpbihjdHlwZXMudGVzdCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3J1bnRlc3RzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvcnVudGVzdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZTcwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3J1bnRlc3RzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3J1bnRlc3RzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvcnVudGVzdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZTcwZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3J1bnRlc3RzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYW5vbi5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hbm9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OTJiNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYW5vbi5weQpAQCAtMCwwICsxLDYwIEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2NsYXNzIEFub25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Fub24oc2VsZik6CisgICAgICAgIGNsYXNzIEFOT04oVW5pb24pOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQpXQorCisgICAgICAgIGNsYXNzIFkoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiXyIsIEFOT04pLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19pbnQpXQorICAgICAgICAgICAgX2Fub255bW91c18gPSBbIl8iXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWS5hLm9mZnNldCwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLmIub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQU5PTi5hLm9mZnNldCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChBTk9OLmIub2Zmc2V0LCAwKQorCisgICAgZGVmIHRlc3RfYW5vbl9ub25zZXEoc2VsZik6CisgICAgICAgICMgVHlwZUVycm9yOiBfYW5vbnltb3VzXyBtdXN0IGJlIGEgc2VxdWVuY2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiB0eXBlKFN0cnVjdHVyZSkoIk5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cnVjdHVyZSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJfZmllbGRzXyI6IFtdLCAiX2Fub255bW91c18iOiA0Mn0pKQorCisgICAgZGVmIHRlc3RfYW5vbl9ub25tZW1iZXIoc2VsZik6CisgICAgICAgICMgQXR0cmlidXRlRXJyb3I6IHR5cGUgb2JqZWN0ICdOYW1lJyBoYXMgbm8gYXR0cmlidXRlICd4JworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTogdHlwZShTdHJ1Y3R1cmUpKCJOYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJ1Y3R1cmUsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiX2ZpZWxkc18iOiBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX2Fub255bW91c18iOiBbIngiXX0pKQorCisgICAgZGVmIHRlc3RfbmVzdGVkKHNlbGYpOgorICAgICAgICBjbGFzcyBBTk9OX1MoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KV0KKworICAgICAgICBjbGFzcyBBTk9OX1UoVW5pb24pOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJfIiwgQU5PTl9TKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50KV0KKyAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KKworICAgICAgICBjbGFzcyBZKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoIl8iLCBBTk9OX1UpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19pbnQpXQorICAgICAgICAgICAgX2Fub255bW91c18gPSBbIl8iXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWS54Lm9mZnNldCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLmEub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkuYi5vZmZzZXQsIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWS5fLm9mZnNldCwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLnkub2Zmc2V0LCBzaXplb2YoY19pbnQpICogMikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hbm9uLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hbm9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWE4OWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hbm9uLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hbm9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWE4OWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheV9pbl9wb2ludGVyLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5X2luX3BvaW50ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3ODYzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheV9pbl9wb2ludGVyLnB5CkBAIC0wLDAgKzEsNjQgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gYmluYXNjaWkgaW1wb3J0IGhleGxpZnkKK2ltcG9ydCByZQorCitkZWYgZHVtcChvYmopOgorICAgICMgaGVscGVyIGZ1bmN0aW9uIHRvIGR1bXAgbWVtb3J5IGNvbnRlbnRzIGluIGhleCwgd2l0aCBhIGh5cGhlbgorICAgICMgYmV0d2VlbiB0aGUgYnl0ZXMuCisgICAgaCA9IGhleGxpZnkobWVtb3J5dmlldyhvYmopKQorICAgIHJldHVybiByZS5zdWIociIoLi4pIiwgciJcMS0iLCBoKVs6LTFdCisKKworY2xhc3MgVmFsdWUoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoInZhbCIsIGNfYnl0ZSldCisKK2NsYXNzIENvbnRhaW5lcihTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygicHZhbHVlcyIsIFBPSU5URVIoVmFsdWUpKV0KKworY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICMgY3JlYXRlIGFuIGFycmF5IG9mIDQgdmFsdWVzCisgICAgICAgIHZhbF9hcnJheSA9IChWYWx1ZSAqIDQpKCkKKworICAgICAgICAjIGNyZWF0ZSBhIGNvbnRhaW5lciwgd2hpY2ggaG9sZHMgYSBwb2ludGVyIHRvIHRoZSBwdmFsdWVzIGFycmF5LgorICAgICAgICBjID0gQ29udGFpbmVyKCkKKyAgICAgICAgYy5wdmFsdWVzID0gdmFsX2FycmF5CisKKyAgICAgICAgIyBtZW1vcnkgY29udGFpbnMgNCBOVUwgYnl0ZXMgbm93LCB0aGF0J3MgY29ycmVjdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIwMC0wMC0wMC0wMCIsIGR1bXAodmFsX2FycmF5KSkKKworICAgICAgICAjIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBhcnJheSB0aHJvdWdoIHRoZSBwb2ludGVyOgorICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAgICAgICAgIGMucHZhbHVlc1tpXS52YWwgPSBpICsgMQorCisgICAgICAgIHZhbHVlcyA9IFtjLnB2YWx1ZXNbaV0udmFsIGZvciBpIGluIHJhbmdlKDQpXQorCisgICAgICAgICMgVGhlc2UgYXJlIHRoZSBleHBlY3RlZCByZXN1bHRzOiBoZXJlIHMgdGhlIGJ1ZyEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICh2YWx1ZXMsIGR1bXAodmFsX2FycmF5KSksCisgICAgICAgICAgICAoWzEsIDIsIDMsIDRdLCAiMDEtMDItMDMtMDQiKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorCisgICAgICAgIHZhbF9hcnJheSA9IChWYWx1ZSAqIDQpKCkKKworICAgICAgICAjIG1lbW9yeSBjb250YWlucyA0IE5VTCBieXRlcyBub3csIHRoYXQncyBjb3JyZWN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjAwLTAwLTAwLTAwIiwgZHVtcCh2YWxfYXJyYXkpKQorCisgICAgICAgIHB0ciA9IGNhc3QodmFsX2FycmF5LCBQT0lOVEVSKFZhbHVlKSkKKyAgICAgICAgIyBzZXQgdGhlIHZhbHVlcyBvZiB0aGUgYXJyYXkgdGhyb3VnaCB0aGUgcG9pbnRlcjoKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNCk6CisgICAgICAgICAgICBwdHJbaV0udmFsID0gaSArIDEKKworICAgICAgICB2YWx1ZXMgPSBbcHRyW2ldLnZhbCBmb3IgaSBpbiByYW5nZSg0KV0KKworICAgICAgICAjIFRoZXNlIGFyZSB0aGUgZXhwZWN0ZWQgcmVzdWx0czogaGVyZSBzIHRoZSBidWchCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAodmFsdWVzLCBkdW1wKHZhbF9hcnJheSkpLAorICAgICAgICAgICAgKFsxLCAyLCAzLCA0XSwgIjAxLTAyLTAzLTA0IikKKyAgICAgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5X2luX3BvaW50ZXIucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5X2luX3BvaW50ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYzkyODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5X2luX3BvaW50ZXIucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5X2luX3BvaW50ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYzkyODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1ZjhiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheXMucHkKQEAgLTAsMCArMSwxMzQgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworZm9ybWF0cyA9ICJiQmhIaUlsTHFRZmQiCisKK2Zvcm1hdHMgPSBjX2J5dGUsIGNfdWJ5dGUsIGNfc2hvcnQsIGNfdXNob3J0LCBjX2ludCwgY191aW50LCBcCisgICAgICAgICAgY19sb25nLCBjX3Vsb25nbG9uZywgY19mbG9hdCwgY19kb3VibGUsIGNfbG9uZ2RvdWJsZQorCitjbGFzcyBBcnJheVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgICMgY3JlYXRlIGNsYXNzZXMgaG9sZGluZyBzaW1wbGUgbnVtZXJpYyB0eXBlcywgYW5kIGNoZWNrCisgICAgICAgICMgdmFyaW91cyBwcm9wZXJ0aWVzLgorCisgICAgICAgIGluaXQgPSByYW5nZSgxNSwgMjUpCisKKyAgICAgICAgZm9yIGZtdCBpbiBmb3JtYXRzOgorICAgICAgICAgICAgYWxlbiA9IGxlbihpbml0KQorICAgICAgICAgICAgaW50X2FycmF5ID0gQVJSQVkoZm10LCBhbGVuKQorCisgICAgICAgICAgICBpYSA9IGludF9hcnJheSgqaW5pdCkKKyAgICAgICAgICAgICMgbGVuZ3RoIG9mIGluc3RhbmNlIG9rPworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaWEpLCBhbGVuKQorCisgICAgICAgICAgICAjIHNsb3QgdmFsdWVzIG9rPworICAgICAgICAgICAgdmFsdWVzID0gW2lhW2ldIGZvciBpIGluIHJhbmdlKGxlbihpbml0KSldCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgaW5pdCkKKworICAgICAgICAgICAgIyBjaGFuZ2UgdGhlIGl0ZW1zCisgICAgICAgICAgICBmcm9tIG9wZXJhdG9yIGltcG9ydCBzZXRpdGVtCisgICAgICAgICAgICBuZXdfdmFsdWVzID0gcmFuZ2UoNDIsIDQyK2FsZW4pCisgICAgICAgICAgICBbc2V0aXRlbShpYSwgbiwgbmV3X3ZhbHVlc1tuXSkgZm9yIG4gaW4gcmFuZ2UoYWxlbildCisgICAgICAgICAgICB2YWx1ZXMgPSBbaWFbaV0gZm9yIGkgaW4gcmFuZ2UobGVuKGluaXQpKV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBuZXdfdmFsdWVzKQorCisgICAgICAgICAgICAjIGFyZSB0aGUgaXRlbXMgaW5pdGlhbGl6ZWQgdG8gMD8KKyAgICAgICAgICAgIGlhID0gaW50X2FycmF5KCkKKyAgICAgICAgICAgIHZhbHVlcyA9IFtpYVtpXSBmb3IgaSBpbiByYW5nZShsZW4oaW5pdCkpXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXMsIFswXSAqIGxlbihpbml0KSkKKworICAgICAgICAgICAgIyBUb28gbWFueSBpbml0aWFsaXplcnMgc2hvdWxkIGJlIGNhdWdodAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgaW50X2FycmF5LCAqcmFuZ2UoYWxlbioyKSkKKworICAgICAgICBDaGFyQXJyYXkgPSBBUlJBWShjX2NoYXIsIDMpCisKKyAgICAgICAgY2EgPSBDaGFyQXJyYXkoImEiLCAiYiIsICJjIikKKworICAgICAgICAjIFNob3VsZCB0aGlzIHdvcms/IEl0IGRvZXNuJ3Q6CisgICAgICAgICMgQ2hhckFycmF5KCJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIENoYXJBcnJheSwgImFiYyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVswXSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhWzFdLCAiYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FbMl0sICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVstM10sICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVstMl0sICJiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVstMV0sICJjIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjYSksIDMpCisKKyAgICAgICAgIyBzbGljaW5nIGlzIG5vdyBzdXBwb3J0ZWQsIGJ1dCBub3QgZXh0ZW5kZWQgc2xpY2luZyAoMy1hcmd1bWVudCkhCisgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGdldHNsaWNlLCBkZWxpdGVtCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0c2xpY2UsIGNhLCAwLCAxLCAtMSkKKworICAgICAgICAjIGNhbm5vdCBkZWxldGUgaXRlbXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkZWxpdGVtLCBjYSwgMCkKKworICAgIGRlZiB0ZXN0X251bWVyaWNfYXJyYXlzKHNlbGYpOgorCisgICAgICAgIGFsZW4gPSA1CisKKyAgICAgICAgbnVtYXJyYXkgPSBBUlJBWShjX2ludCwgYWxlbikKKworICAgICAgICBuYSA9IG51bWFycmF5KCkKKyAgICAgICAgdmFsdWVzID0gW25hW2ldIGZvciBpIGluIHJhbmdlKGFsZW4pXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgWzBdICogYWxlbikKKworICAgICAgICBuYSA9IG51bWFycmF5KCpbY19pbnQoKV0gKiBhbGVuKQorICAgICAgICB2YWx1ZXMgPSBbbmFbaV0gZm9yIGkgaW4gcmFuZ2UoYWxlbildCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBbMF0qYWxlbikKKworICAgICAgICBuYSA9IG51bWFycmF5KDEsIDIsIDMsIDQsIDUpCisgICAgICAgIHZhbHVlcyA9IFtpIGZvciBpIGluIG5hXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgWzEsIDIsIDMsIDQsIDVdKQorCisgICAgICAgIG5hID0gbnVtYXJyYXkoKm1hcChjX2ludCwgKDEsIDIsIDMsIDQsIDUpKSkKKyAgICAgICAgdmFsdWVzID0gW2kgZm9yIGkgaW4gbmFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBbMSwgMiwgMywgNCwgNV0pCisKKyAgICBkZWYgdGVzdF9jbGFzc2NhY2hlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IEFSUkFZKGNfaW50LCAzKSBpcyBBUlJBWShjX2ludCwgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBUlJBWShjX2ludCwgMykgaXMgQVJSQVkoY19pbnQsIDMpKQorCisgICAgZGVmIHRlc3RfZnJvbV9hZGRyZXNzKHNlbGYpOgorICAgICAgICAjIEZhaWxlZCB3aXRoIDAuOS44LCByZXBvcnRlZCBieSBKVXJuZXIKKyAgICAgICAgcCA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKCJmb28iKQorICAgICAgICBzeiA9IChjX2NoYXIgKiAzKS5mcm9tX2FkZHJlc3MoYWRkcmVzc29mKHApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6WzpdLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6Ol0sICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6LTFdLCAib29mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6OjNdLCAiZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbMTo0OjJdLCAibyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3oudmFsdWUsICJmb28iKQorCisgICAgdHJ5OgorICAgICAgICBjcmVhdGVfdW5pY29kZV9idWZmZXIKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgZGVmIHRlc3RfZnJvbV9hZGRyZXNzVyhzZWxmKToKKyAgICAgICAgICAgIHAgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoImZvbyIpCisgICAgICAgICAgICBzeiA9IChjX3djaGFyICogMykuZnJvbV9hZGRyZXNzKGFkZHJlc3NvZihwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOl0sICJmb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6Ol0sICJmb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6Oi0xXSwgIm9vZiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6M10sICJmIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbMTo0OjJdLCAibyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6LnZhbHVlLCAiZm9vIikKKworICAgIGRlZiB0ZXN0X2NhY2hlKHNlbGYpOgorICAgICAgICAjIEFycmF5IHR5cGVzIGFyZSBjYWNoZWQgaW50ZXJuYWxseSBpbiB0aGUgX2N0eXBlcyBleHRlbnNpb24sCisgICAgICAgICMgaW4gYSBXZWFrVmFsdWVEaWN0aW9uYXJ5LiAgTWFrZSBzdXJlIHRoZSBhcnJheSB0eXBlIGlzCisgICAgICAgICMgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSB3aGVuIHRoZSBpdGVtdHlwZSBnb2VzIGF3YXkuICBUaGlzCisgICAgICAgICMgdGVzdCB3aWxsIG5vdCBmYWlsLCBidXQgd2lsbCBzaG93IGEgbGVhayBpbiB0aGUgdGVzdHN1aXRlLgorCisgICAgICAgICMgQ3JlYXRlIGEgbmV3IHR5cGU6CisgICAgICAgIGNsYXNzIG15X2ludChjX2ludCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgQ3JlYXRlIGEgbmV3IGFycmF5IHR5cGUgYmFzZWQgb24gaXQ6CisgICAgICAgIHQxID0gbXlfaW50ICogMQorICAgICAgICB0MiA9IG15X2ludCAqIDEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIGlzIHQyKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTE0ZTYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTE0ZTYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hc19wYXJhbWV0ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1M2U2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hc19wYXJhbWV0ZXIucHkKQEAgLTAsMCArMSwyMzMgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKK2ltcG9ydCBzeXMKKworZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisKK3RyeToKKyAgICBDQUxMQkFDS19GVU5DVFlQRSA9IFdJTkZVTkNUWVBFCitleGNlcHQgTmFtZUVycm9yOgorICAgICMgZmFrZSB0byBlbmFibGUgdGhpcyB0ZXN0IG9uIExpbnV4CisgICAgQ0FMTEJBQ0tfRlVOQ1RZUEUgPSBDRlVOQ1RZUEUKKworY2xhc3MgUE9JTlQoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksICgieSIsIGNfaW50KV0KKworY2xhc3MgQmFzaWNXcmFwVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB3cmFwKHNlbGYsIHBhcmFtKToKKyAgICAgICAgcmV0dXJuIHBhcmFtCisKKyAgICBkZWYgdGVzdF93Y2hhcl9wYXJtKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjX3djaGFyCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfaV9iaGlsZmQKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfd2NoYXIsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQorICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcCgxKSwgc2VsZi53cmFwKHUieCIpLCBzZWxmLndyYXAoMyksIHNlbGYud3JhcCg0KSwgc2VsZi53cmFwKDUuMCksIHNlbGYud3JhcCg2LjApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMTM5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyZXN1bHQpLCBpbnQpCisKKyAgICBkZWYgdGVzdF9wb2ludGVycyhzZWxmKToKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfcF9wCisgICAgICAgIGYucmVzdHlwZSA9IFBPSU5URVIoY19pbnQpCisgICAgICAgIGYuYXJndHlwZXMgPSBbUE9JTlRFUihjX2ludCldCisKKyAgICAgICAgIyBUaGlzIG9ubHkgd29ya3MgaWYgdGhlIHZhbHVlIGNfaW50KDQyKSBwYXNzZWQgdG8gdGhlCisgICAgICAgICMgZnVuY3Rpb24gaXMgc3RpbGwgYWxpdmUgd2hpbGUgdGhlIHBvaW50ZXIgKHRoZSByZXN1bHQpIGlzCisgICAgICAgICMgdXNlZC4KKworICAgICAgICB2ID0gY19pbnQoNDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb2ludGVyKHYpLmNvbnRlbnRzLnZhbHVlLCA0MikKKyAgICAgICAgcmVzdWx0ID0gZihzZWxmLndyYXAocG9pbnRlcih2KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBQT0lOVEVSKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIDQyKQorCisgICAgICAgICMgVGhpcyBvbiB3b3Jrcy4uLgorICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcChwb2ludGVyKHYpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIHYudmFsdWUpCisKKyAgICAgICAgcCA9IHBvaW50ZXIoY19pbnQoOTkpKQorICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcChwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIDk5KQorCisgICAgZGVmIHRlc3Rfc2hvcnRzKHNlbGYpOgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19jYWxsYmFja19pX2lmCisKKyAgICAgICAgYXJncyA9IFtdCisgICAgICAgIGV4cGVjdGVkID0gWzI2MjE0NCwgMTMxMDcyLCA2NTUzNiwgMzI3NjgsIDE2Mzg0LCA4MTkyLCA0MDk2LCAyMDQ4LAorICAgICAgICAgICAgICAgICAgICAxMDI0LCA1MTIsIDI1NiwgMTI4LCA2NCwgMzIsIDE2LCA4LCA0LCAyLCAxXQorCisgICAgICAgIGRlZiBjYWxsYmFjayh2KToKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKHYpCisgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgIENhbGxCYWNrID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCkKKworICAgICAgICBjYiA9IENhbGxCYWNrKGNhbGxiYWNrKQorICAgICAgICBmKHNlbGYud3JhcCgyKioxOCksIHNlbGYud3JhcChjYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgZXhwZWN0ZWQpCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja3Moc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2NhbGxiYWNrX2lfaWYKKyAgICAgICAgZi5yZXN0eXBlID0gY19pbnQKKyAgICAgICAgZi5hcmd0eXBlcyA9IE5vbmUKKworICAgICAgICBNeUNhbGxiYWNrID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCkKKworICAgICAgICBkZWYgY2FsbGJhY2sodmFsdWUpOgorICAgICAgICAgICAgI3ByaW50ICJjYWxsZWQgYmFjayB3aXRoIiwgdmFsdWUKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKKworICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcCgtMTApLCBzZWxmLndyYXAoY2IpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQorCisgICAgICAgICMgdGVzdCB3aXRoIHByb3RvdHlwZQorICAgICAgICBmLmFyZ3R5cGVzID0gW2NfaW50LCBNeUNhbGxiYWNrXQorICAgICAgICBjYiA9IE15Q2FsbGJhY2soY2FsbGJhY2spCisKKyAgICAgICAgcmVzdWx0ID0gZihzZWxmLndyYXAoLTEwKSwgc2VsZi53cmFwKGNiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0xOCkKKworICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcCgtMTApLCBzZWxmLndyYXAoY2IpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQorCisgICAgICAgIEFub3RoZXJDYWxsYmFjayA9IENBTExCQUNLX0ZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQsIGNfaW50LCBjX2ludCkKKworICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIHByb3RvdHlwZSB3b3Jrczogd2UgY2FsbCBmIHdpdGggd3JvbmcKKyAgICAgICAgIyBhcmd1bWVudCB0eXBlcworICAgICAgICBjYiA9IEFub3RoZXJDYWxsYmFjayhjYWxsYmFjaykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgZiwgc2VsZi53cmFwKC0xMCksIHNlbGYud3JhcChjYikpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja3NfMihzZWxmKToKKyAgICAgICAgIyBDYW4gYWxzbyB1c2Ugc2ltcGxlIGRhdGF0eXBlcyBhcyBhcmd1bWVudCB0eXBlIHNwZWNpZmllcnMKKyAgICAgICAgIyBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgorICAgICAgICAjIEluIHRoaXMgY2FzZSB0aGUgY2FsbCByZWNlaXZlcyBhbiBpbnN0YW5jZSBvZiB0aGF0IHR5cGUKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfY2FsbGJhY2tfaV9pZgorICAgICAgICBmLnJlc3R5cGUgPSBjX2ludAorCisgICAgICAgIE15Q2FsbGJhY2sgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KQorCisgICAgICAgIGYuYXJndHlwZXMgPSBbY19pbnQsIE15Q2FsbGJhY2tdCisKKyAgICAgICAgZGVmIGNhbGxiYWNrKHZhbHVlKToKKyAgICAgICAgICAgICNwcmludCAiY2FsbGVkIGJhY2sgd2l0aCIsIHZhbHVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWUpLCBpbnQpCisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKworICAgICAgICBjYiA9IE15Q2FsbGJhY2soY2FsbGJhY2spCisgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKC0xMCksIHNlbGYud3JhcChjYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMTgpCisKKyAgICBkZWYgdGVzdF9sb25nbG9uZ19jYWxsYmFja3Moc2VsZik6CisKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfY2FsbGJhY2tfcV9xZgorICAgICAgICBmLnJlc3R5cGUgPSBjX2xvbmdsb25nCisKKyAgICAgICAgTXlDYWxsYmFjayA9IENGVU5DVFlQRShjX2xvbmdsb25nLCBjX2xvbmdsb25nKQorCisgICAgICAgIGYuYXJndHlwZXMgPSBbY19sb25nbG9uZywgTXlDYWxsYmFja10KKworICAgICAgICBkZWYgY2FsbGJhY2sodmFsdWUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmFsdWUsIChpbnQsIGxvbmcpKSkKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSAmIDB4N0ZGRkZGRkYKKworICAgICAgICBjYiA9IE15Q2FsbGJhY2soY2FsbGJhY2spCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMzU3NzYyNTU4NywgaW50KGYoc2VsZi53cmFwKDEwMDAwMDAwMDAwMDApLCBzZWxmLndyYXAoY2IpKSkpCisKKyAgICBkZWYgdGVzdF9ieXZhbChzZWxmKToKKyAgICAgICAgIyB3aXRob3V0IHByb3RvdHlwZQorICAgICAgICBwdGluID0gUE9JTlQoMSwgMikKKyAgICAgICAgcHRvdXQgPSBQT0lOVCgpCisgICAgICAgICMgRVhQT1JUIGludCBfdGVzdGZ1bmNfYnl2YWwocG9pbnQgaW4sIHBvaW50ICpwb3V0KQorICAgICAgICByZXN1bHQgPSBkbGwuX3Rlc3RmdW5jX2J5dmFsKHB0aW4sIGJ5cmVmKHB0b3V0KSkKKyAgICAgICAgZ290ID0gcmVzdWx0LCBwdG91dC54LCBwdG91dC55CisgICAgICAgIGV4cGVjdGVkID0gMywgMSwgMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgIyB3aXRoIHByb3RvdHlwZQorICAgICAgICBwdGluID0gUE9JTlQoMTAxLCAxMDIpCisgICAgICAgIHB0b3V0ID0gUE9JTlQoKQorICAgICAgICBkbGwuX3Rlc3RmdW5jX2J5dmFsLmFyZ3R5cGVzID0gKFBPSU5ULCBQT0lOVEVSKFBPSU5UKSkKKyAgICAgICAgZGxsLl90ZXN0ZnVuY19ieXZhbC5yZXN0eXBlID0gY19pbnQKKyAgICAgICAgcmVzdWx0ID0gZGxsLl90ZXN0ZnVuY19ieXZhbChzZWxmLndyYXAocHRpbiksIGJ5cmVmKHB0b3V0KSkKKyAgICAgICAgZ290ID0gcmVzdWx0LCBwdG91dC54LCBwdG91dC55CisgICAgICAgIGV4cGVjdGVkID0gMjAzLCAxMDEsIDEwMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfcmV0dXJuXzJIKHNlbGYpOgorICAgICAgICBjbGFzcyBTMkgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19zaG9ydCldCisgICAgICAgIGRsbC5yZXRfMmhfZnVuYy5yZXN0eXBlID0gUzJICisgICAgICAgIGRsbC5yZXRfMmhfZnVuYy5hcmd0eXBlcyA9IFtTMkhdCisgICAgICAgIGlucCA9IFMySCg5OSwgODgpCisgICAgICAgIHMyaCA9IGRsbC5yZXRfMmhfZnVuYyhzZWxmLndyYXAoaW5wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczJoLngsIHMyaC55KSwgKDk5KjIsIDg4KjMpKQorCisgICAgIyBUaGlzIGlzIGtub3duIGNkZWNsIGluY29tcGF0aWJpbGl0eSBiZXR3ZWVuIEdDQworICAgICMgYW5kIE1TVkMuIEl0IGlzIGFkZHJlc3NlZCBpbiBHQ0MgaXNzdWUgIzM2ODM0LgorICAgICMgUHl0aG9uIGxpYmZmaSBkZXRlY3QgaXQgYW5kIGNvbXBsYWluLgorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIgYW5kIHN5cy52ZXJzaW9uLmZpbmQoIkdDQyIpID49IDAsICdYRkFJTCBHQ0MobWluZ3cpJykKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfcmV0dXJuXzhIKHNlbGYpOgorICAgICAgICBjbGFzcyBTOEkoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZiIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZyIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfaW50KV0KKyAgICAgICAgZGxsLnJldF84aV9mdW5jLnJlc3R5cGUgPSBTOEkKKyAgICAgICAgZGxsLnJldF84aV9mdW5jLmFyZ3R5cGVzID0gW1M4SV0KKyAgICAgICAgaW5wID0gUzhJKDksIDgsIDcsIDYsIDUsIDQsIDMsIDIpCisgICAgICAgIHM4aSA9IGRsbC5yZXRfOGlfZnVuYyhzZWxmLndyYXAoaW5wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczhpLmEsIHM4aS5iLCBzOGkuYywgczhpLmQsIHM4aS5lLCBzOGkuZiwgczhpLmcsIHM4aS5oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDkqMiwgOCozLCA3KjQsIDYqNSwgNSo2LCA0KjcsIDMqOCwgMio5KSkKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV9hc19wYXJhbShzZWxmKToKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfaW50CisKKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgYS5fYXNfcGFyYW1ldGVyXyA9IGEKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgY19pbnQuZnJvbV9wYXJhbShhKQorCisKKyN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2NsYXNzIEFzUGFyYW1XcmFwcGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmFtKToKKyAgICAgICAgc2VsZi5fYXNfcGFyYW1ldGVyXyA9IHBhcmFtCisKK2NsYXNzIEFzUGFyYW1XcmFwcGVyVGVzdENhc2UoQmFzaWNXcmFwVGVzdENhc2UpOgorICAgIHdyYXAgPSBBc1BhcmFtV3JhcHBlcgorCisjfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitjbGFzcyBBc1BhcmFtUHJvcGVydHlXcmFwcGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmFtKToKKyAgICAgICAgc2VsZi5fcGFyYW0gPSBwYXJhbQorCisgICAgZGVmIGdldFBhcmFtZXRlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmFtCisgICAgX2FzX3BhcmFtZXRlcl8gPSBwcm9wZXJ0eShnZXRQYXJhbWV0ZXIpCisKK2NsYXNzIEFzUGFyYW1Qcm9wZXJ0eVdyYXBwZXJUZXN0Q2FzZShCYXNpY1dyYXBUZXN0Q2FzZSk6CisgICAgd3JhcCA9IEFzUGFyYW1Qcm9wZXJ0eVdyYXBwZXIKKworI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hc19wYXJhbWV0ZXIucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3ODQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hc19wYXJhbWV0ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hc19wYXJhbWV0ZXIucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3ODQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hc19wYXJhbWV0ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiY2M2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5CkBAIC0wLDAgKzEsMjY0IEBACitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKKworaW1wb3J0IGN0eXBlcworaW1wb3J0IF9jdHlwZXNfdGVzdAorCitjbGFzcyBCSVRTKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJBIiwgY19pbnQsIDEpLAorICAgICAgICAgICAgICAgICgiQiIsIGNfaW50LCAyKSwKKyAgICAgICAgICAgICAgICAoIkMiLCBjX2ludCwgMyksCisgICAgICAgICAgICAgICAgKCJEIiwgY19pbnQsIDQpLAorICAgICAgICAgICAgICAgICgiRSIsIGNfaW50LCA1KSwKKyAgICAgICAgICAgICAgICAoIkYiLCBjX2ludCwgNiksCisgICAgICAgICAgICAgICAgKCJHIiwgY19pbnQsIDcpLAorICAgICAgICAgICAgICAgICgiSCIsIGNfaW50LCA4KSwKKyAgICAgICAgICAgICAgICAoIkkiLCBjX2ludCwgOSksCisKKyAgICAgICAgICAgICAgICAoIk0iLCBjX3Nob3J0LCAxKSwKKyAgICAgICAgICAgICAgICAoIk4iLCBjX3Nob3J0LCAyKSwKKyAgICAgICAgICAgICAgICAoIk8iLCBjX3Nob3J0LCAzKSwKKyAgICAgICAgICAgICAgICAoIlAiLCBjX3Nob3J0LCA0KSwKKyAgICAgICAgICAgICAgICAoIlEiLCBjX3Nob3J0LCA1KSwKKyAgICAgICAgICAgICAgICAoIlIiLCBjX3Nob3J0LCA2KSwKKyAgICAgICAgICAgICAgICAoIlMiLCBjX3Nob3J0LCA3KV0KKworZnVuYyA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKS51bnBhY2tfYml0ZmllbGRzCitmdW5jLmFyZ3R5cGVzID0gUE9JTlRFUihCSVRTKSwgY19jaGFyCisKKyMjZm9yIG4gaW4gIkFCQ0RFRkdISU1OT1BRUlMiOgorIyMgICAgcHJpbnQgbiwgaGV4KGdldGF0dHIoQklUUywgbikuc2l6ZSksIGdldGF0dHIoQklUUywgbikub2Zmc2V0CisKK2NsYXNzIENfVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9pbnRzKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSg1MTIpOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gIkFCQ0RFRkdISSI6CisgICAgICAgICAgICAgICAgYiA9IEJJVFMoKQorICAgICAgICAgICAgICAgIHNldGF0dHIoYiwgbmFtZSwgaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChuYW1lLCBpLCBnZXRhdHRyKGIsIG5hbWUpKSwgKG5hbWUsIGksIGZ1bmMoYnlyZWYoYiksIG5hbWUpKSkKKworICAgIGRlZiB0ZXN0X3Nob3J0cyhzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgIGZvciBuYW1lIGluICJNTk9QUVJTIjoKKyAgICAgICAgICAgICAgICBiID0gQklUUygpCisgICAgICAgICAgICAgICAgc2V0YXR0cihiLCBuYW1lLCBpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG5hbWUsIGksIGdldGF0dHIoYiwgbmFtZSkpLCAobmFtZSwgaSwgZnVuYyhieXJlZihiKSwgbmFtZSkpKQorCitzaWduZWRfaW50X3R5cGVzID0gKGNfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19sb25nbG9uZykKK3Vuc2lnbmVkX2ludF90eXBlcyA9IChjX3VieXRlLCBjX3VzaG9ydCwgY191aW50LCBjX3Vsb25nLCBjX3Vsb25nbG9uZykKK2ludF90eXBlcyA9IHVuc2lnbmVkX2ludF90eXBlcyArIHNpZ25lZF9pbnRfdHlwZXMKKworY2xhc3MgQml0RmllbGRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2xvbmdsb25nKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2xvbmdsb25nLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfbG9uZ2xvbmcsIDYyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfbG9uZ2xvbmcsIDEpXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19sb25nbG9uZykpCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgeC5hLCB4LmIsIHguYyA9IC0xLCA3LCAtMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4LmEsIHguYiwgeC5jKSwgKC0xLCA3LCAtMSkpCisKKyAgICBkZWYgdGVzdF91bG9uZ2xvbmcoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfdWxvbmdsb25nLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfdWxvbmdsb25nLCA2MiksCisgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3Vsb25nbG9uZywgMSldCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2xvbmdsb25nKSkKKyAgICAgICAgeCA9IFgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4LmEsIHguYiwgeC5jKSwgKDAsIDAsIDApKQorICAgICAgICB4LmEsIHguYiwgeC5jID0gNywgNywgNworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4LmEsIHguYiwgeC5jKSwgKDEsIDcsIDEpKQorCisgICAgZGVmIHRlc3Rfc2lnbmVkKHNlbGYpOgorICAgICAgICBmb3IgY190eXAgaW4gc2lnbmVkX2ludF90eXBlczoKKyAgICAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImR1bW15IiwgY190eXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYSIsIGNfdHlwLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3R5cCwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY190eXAsIDEpXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkqMikKKworICAgICAgICAgICAgeCA9IFgoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIDAsIDAsIDApKQorICAgICAgICAgICAgeC5hID0gLTEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAtMSwgMCwgMCkpCisgICAgICAgICAgICB4LmEsIHguYiA9IDAsIC0xCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChjX3R5cCwgeC5hLCB4LmIsIHguYyksIChjX3R5cCwgMCwgLTEsIDApKQorCisKKyAgICBkZWYgdGVzdF91bnNpZ25lZChzZWxmKToKKyAgICAgICAgZm9yIGNfdHlwIGluIHVuc2lnbmVkX2ludF90eXBlczoKKyAgICAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3R5cCwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY190eXAsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfdHlwLCAxKV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY190eXApKQorCisgICAgICAgICAgICB4ID0gWCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChjX3R5cCwgeC5hLCB4LmIsIHguYyksIChjX3R5cCwgMCwgMCwgMCkpCisgICAgICAgICAgICB4LmEgPSAtMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIDcsIDAsIDApKQorICAgICAgICAgICAgeC5hLCB4LmIgPSAwLCAtMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIDAsIDcsIDApKQorCisKKyAgICBkZWYgZmFpbF9maWVsZHMoc2VsZiwgKmZpZWxkcyk6CisgICAgICAgIHJldHVybiBzZWxmLmdldF9leGNlcHQodHlwZShTdHJ1Y3R1cmUpLCAiWCIsICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiX2ZpZWxkc18iOiBmaWVsZHN9KQorCisgICAgZGVmIHRlc3Rfbm9uaW50X3R5cGVzKHNlbGYpOgorICAgICAgICAjIGJpdCBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkIG9uIG5vbi1pbnRlZ2VyIHR5cGVzLgorICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIGNfY2hhcl9wLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfY2hhcl9wJykpCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBjX3ZvaWRfcCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBjX3ZvaWRfcCcpKQorCisgICAgICAgIGlmIGNfaW50ICE9IGNfbG9uZzoKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgUE9JTlRFUihjX2ludCksIDEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIExQX2NfaW50JykpCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBjX2NoYXIsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKFR5cGVFcnJvciwgJ2JpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgY19jaGFyJykpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY193Y2hhcgorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBjX3djaGFyLCAxKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBjX3djaGFyJykpCisKKyAgICAgICAgY2xhc3MgRHVtbXkoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gW10KKworICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIER1bW15LCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIER1bW15JykpCisKKyAgICBkZWYgdGVzdF9zaW5nbGVfYml0ZmllbGRfc2l6ZShzZWxmKToKKyAgICAgICAgZm9yIGNfdHlwIGluIGludF90eXBlczoKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY190eXAsIC0xKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVmFsdWVFcnJvciwgJ251bWJlciBvZiBiaXRzIGludmFsaWQgZm9yIGJpdCBmaWVsZCcpKQorCisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIGNfdHlwLCAwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVmFsdWVFcnJvciwgJ251bWJlciBvZiBiaXRzIGludmFsaWQgZm9yIGJpdCBmaWVsZCcpKQorCisgICAgICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY190eXAsIDEpXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkpCisKKyAgICAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3R5cCwgc2l6ZW9mKGNfdHlwKSo4KV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY190eXApKQorCisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIGNfdHlwLCBzaXplb2YoY190eXApKjggKyAxKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVmFsdWVFcnJvciwgJ251bWJlciBvZiBiaXRzIGludmFsaWQgZm9yIGJpdCBmaWVsZCcpKQorCisgICAgZGVmIHRlc3RfbXVsdGlfYml0ZmllbGRzX3NpemUoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfc2hvcnQsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19zaG9ydCwgMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19zaG9ydCwgMSldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19zaG9ydCkpCisKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19zaG9ydCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImExIiwgY19zaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3Nob3J0LCAxNCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3Nob3J0LCAxKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3Nob3J0KSozKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYS5vZmZzZXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5hMS5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmIub2Zmc2V0LCBzaXplb2YoY19zaG9ydCkqMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmMub2Zmc2V0LCBzaXplb2YoY19zaG9ydCkqMikKKworICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3Nob3J0LCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfc2hvcnQsIDE0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfc2hvcnQsIDE0KV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3Nob3J0KSozKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYS5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSowKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYi5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYy5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQorCisKKyAgICBkZWYgZ2V0X2V4Y2VwdChzZWxmLCBmdW5jLCAqYXJncywgKiprdyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMoKmFyZ3MsICoqa3cpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGRldGFpbDoKKyAgICAgICAgICAgIHJldHVybiBkZXRhaWwuX19jbGFzc19fLCBzdHIoZGV0YWlsKQorCisgICAgZGVmIHRlc3RfbWl4ZWRfMShzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50LCA0KV0KKyAgICAgICAgaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSoyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkpCisKKyAgICBkZWYgdGVzdF9taXhlZF8yKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2J5dGUsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQsIDMyKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkqMikKKworICAgIGRlZiB0ZXN0X21peGVkXzMoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3VieXRlLCA0KV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2J5dGUpKQorCisgICAgZGVmIHRlc3RfbWl4ZWRfNChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19zaG9ydCwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3Nob3J0LCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfaW50LCAyNCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImQiLCBjX3Nob3J0LCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZSIsIGNfc2hvcnQsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJmIiwgY19pbnQsIDI0KV0KKyAgICAgICAgIyBNU1ZDIGRvZXMgTk9UIGNvbWJpbmUgY19zaG9ydCBhbmQgY19pbnQgaW50byBvbmUgZmllbGQsIEdDQworICAgICAgICAjIGRvZXMgKHVubGVzcyBHQ0MgaXMgcnVuIHdpdGggJy1tbXMtYml0ZmllbGRzJyB3aGljaAorICAgICAgICAjIHByb2R1Y2VzIGNvZGUgY29tcGF0aWJsZSB3aXRoIE1TVkMpLgorICAgICAgICBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpICogNCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpICogMikKKworICAgIGRlZiB0ZXN0X2Fub25fYml0ZmllbGRzKHNlbGYpOgorICAgICAgICAjIGFub255bW91cyBiaXQtZmllbGRzIGdhdmUgYSBzdHJhbmdlIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfdWJ5dGUsIDQpXQorICAgICAgICBjbGFzcyBZKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfYW5vbnltb3VzXyA9IFsiXyJdCisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIl8iLCBYKV0KKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoY3R5cGVzLCAiY191aW50MzIiKSwgImNfaW50MzIgaXMgcmVxdWlyZWQiKQorICAgIGRlZiB0ZXN0X3VpbnQzMihzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY191aW50MzIsIDMyKV0KKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4LmEgPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgMTApCisgICAgICAgIHguYSA9IDB4RkRDQkE5ODcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmEsIDB4RkRDQkE5ODcpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKGN0eXBlcywgImNfdWludDY0IiksICJjX2ludDY0IGlzIHJlcXVpcmVkIikKKyAgICBkZWYgdGVzdF91aW50NjQoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfdWludDY0LCA2NCldCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgeC5hID0gMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmEsIDEwKQorICAgICAgICB4LmEgPSAweEZFRENCQTk4NzY1NDMyMTEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmEsIDB4RkVEQ0JBOTg3NjU0MzIxMSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3YmI1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ3YmI1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2J1ZmZlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI5NDVlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5CkBAIC0wLDAgKzEsNzQgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgU3RyaW5nQnVmZmVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYnVmZmVyKHNlbGYpOgorICAgICAgICBiID0gY3JlYXRlX3N0cmluZ19idWZmZXIoMzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCAzMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDMyICogc2l6ZW9mKGNfY2hhcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGJbMF0pIGlzIHN0cikKKworICAgICAgICBiID0gY3JlYXRlX3N0cmluZ19idWZmZXIoImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCA0KSAjIHRyYWlsaW5nIG51bCBjaGFyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCA0ICogc2l6ZW9mKGNfY2hhcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGJbMF0pIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzBdLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6XSwgImFiY1wwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6XSwgImFiY1wwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6LTFdLCAiXDBjYmEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjoyXSwgImFjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6NV0sICJhIikKKworICAgIGRlZiB0ZXN0X2J1ZmZlcl9pbnRlcmZhY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJ5dGVhcnJheShjcmVhdGVfc3RyaW5nX2J1ZmZlcigwKSkpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihieXRlYXJyYXkoY3JlYXRlX3N0cmluZ19idWZmZXIoMSkpKSwgMSkKKworICAgIGRlZiB0ZXN0X3N0cmluZ19jb252ZXJzaW9uKHNlbGYpOgorICAgICAgICBiID0gY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihiKSwgNCAqIHNpemVvZihjX2NoYXIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiWzBdKSBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlswXSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOl0sICJhYmNcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Ol0sICJhYmNcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6Ml0sICJhYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjVdLCAiYSIpCisKKyAgICB0cnk6CisgICAgICAgIGNfd2NoYXIKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgZGVmIHRlc3RfdW5pY29kZV9idWZmZXIoc2VsZik6CisgICAgICAgICAgICBiID0gY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDMyICogc2l6ZW9mKGNfd2NoYXIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYlswXSkgaXMgdW5pY29kZSkKKworICAgICAgICAgICAgYiA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcih1ImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY193Y2hhcikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiWzBdKSBpcyB1bmljb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzBdLCB1ImEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCAiYWJjXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6XSwgImFiY1wwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjJdLCAiYWMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6NV0sICJhIikKKworICAgICAgICBkZWYgdGVzdF91bmljb2RlX2NvbnZlcnNpb24oc2VsZik6CisgICAgICAgICAgICBiID0gY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYmMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCA0ICogc2l6ZW9mKGNfd2NoYXIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYlswXSkgaXMgdW5pY29kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlswXSwgdSJhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6XSwgImFiY1wwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Ol0sICJhYmNcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjotMV0sICJcMGNiYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjoyXSwgImFjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjVdLCAiYSIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYnVmZmVycy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYnVmZmVycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlYzlmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYnVmZmVycy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYnVmZmVycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlYzlmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkNzVjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weQpAQCAtMCwwICsxLDI5NCBAQAoraW1wb3J0IHN5cywgdW5pdHRlc3QsIHN0cnVjdCwgbWF0aCwgY3R5cGVzCitmcm9tIGJpbmFzY2lpIGltcG9ydCBoZXhsaWZ5CisKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2RlZiBiaW4ocyk6CisgICAgcmV0dXJuIGhleGxpZnkobWVtb3J5dmlldyhzKSkudXBwZXIoKQorCisjIEVhY2ggKnNpbXBsZSogdHlwZSB0aGF0IHN1cHBvcnRzIGRpZmZlcmVudCBieXRlIG9yZGVycyBoYXMgYW4KKyMgX19jdHlwZV9iZV9fIGF0dHJpYnV0ZSB0aGF0IHNwZWNpZmllcyB0aGUgc2FtZSB0eXBlIGluIEJJRyBFTkRJQU4KKyMgYnl0ZSBvcmRlciwgYW5kIGEgX19jdHlwZV9sZV9fIGF0dHJpYnV0ZSB0aGF0IGlzIHRoZSBzYW1lIHR5cGUgaW4KKyMgTElUVExFIEVORElBTiBieXRlIG9yZGVyLgorIworIyBGb3IgU3RydWN0dXJlcyBhbmQgVW5pb25zLCB0aGVzZSB0eXBlcyBhcmUgY3JlYXRlZCBvbiBkZW1hbmQuCisKK2NsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBYX3Rlc3Qoc2VsZik6CisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICBzeXMuYnl0ZW9yZGVyCisgICAgICAgIGZvciBpIGluIHJhbmdlKDMyKToKKyAgICAgICAgICAgIGJpdHMgPSBCSVRTKCkKKyAgICAgICAgICAgIHNldGF0dHIoYml0cywgImklcyIgJSBpLCAxKQorICAgICAgICAgICAgZHVtcChiaXRzKQorCisgICAgZGVmIHRlc3RfZW5kaWFuX3Nob3J0KHNlbGYpOgorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc2hvcnQuX19jdHlwZV9sZV9fIGlzIGNfc2hvcnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zaG9ydC5fX2N0eXBlX2JlX18uX19jdHlwZV9sZV9fIGlzIGNfc2hvcnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zaG9ydC5fX2N0eXBlX2JlX18gaXMgY19zaG9ydCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3Nob3J0Ll9fY3R5cGVfbGVfXy5fX2N0eXBlX2JlX18gaXMgY19zaG9ydCkKKyAgICAgICAgcyA9IGNfc2hvcnQuX19jdHlwZV9iZV9fKDB4MTIzNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5oIiwgMHgxMjM0KSksICIxMjM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICIxMjM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQpCisKKyAgICAgICAgcyA9IGNfc2hvcnQuX19jdHlwZV9sZV9fKDB4MTIzNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIjxoIiwgMHgxMjM0KSksICIzNDEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICIzNDEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQpCisKKyAgICAgICAgcyA9IGNfdXNob3J0Ll9fY3R5cGVfYmVfXygweDEyMzQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+aCIsIDB4MTIzNCkpLCAiMTIzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiMTIzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgMHgxMjM0KQorCisgICAgICAgIHMgPSBjX3VzaG9ydC5fX2N0eXBlX2xlX18oMHgxMjM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPGgiLCAweDEyMzQpKSwgIjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNCkKKworICAgIGRlZiB0ZXN0X2VuZGlhbl9pbnQoc2VsZik6CisgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19pbnQuX19jdHlwZV9sZV9fIGlzIGNfaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfaW50Ll9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18gaXMgY19pbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19pbnQuX19jdHlwZV9iZV9fIGlzIGNfaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfaW50Ll9fY3R5cGVfbGVfXy5fX2N0eXBlX2JlX18gaXMgY19pbnQpCisKKyAgICAgICAgcyA9IGNfaW50Ll9fY3R5cGVfYmVfXygweDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmkiLCAweDEyMzQ1Njc4KSksICIxMjM0NTY3OCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiMTIzNDU2NzgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2NzgpCisKKyAgICAgICAgcyA9IGNfaW50Ll9fY3R5cGVfbGVfXygweDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPGkiLCAweDEyMzQ1Njc4KSksICI3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2NzgpCisKKyAgICAgICAgcyA9IGNfdWludC5fX2N0eXBlX2JlX18oMHgxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5JIiwgMHgxMjM0NTY3OCkpLCAiMTIzNDU2NzgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjEyMzQ1Njc4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4KQorCisgICAgICAgIHMgPSBjX3VpbnQuX19jdHlwZV9sZV9fKDB4MTIzNDU2NzgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8SSIsIDB4MTIzNDU2NzgpKSwgIjc4NTYzNDEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICI3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3OCkKKworICAgIGRlZiB0ZXN0X2VuZGlhbl9sb25nbG9uZyhzZWxmKToKKyAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2xvbmdsb25nLl9fY3R5cGVfbGVfXyBpcyBjX2xvbmdsb25nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfbG9uZ2xvbmcuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2xvbmdsb25nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfbG9uZ2xvbmcuX19jdHlwZV9iZV9fIGlzIGNfbG9uZ2xvbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19sb25nbG9uZy5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fIGlzIGNfbG9uZ2xvbmcpCisKKyAgICAgICAgcyA9IGNfbG9uZ2xvbmcuX19jdHlwZV9iZV9fKDB4MTIzNDU2Nzg5MEFCQ0RFRikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5xIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4OTBBQkNERUYpCisKKyAgICAgICAgcyA9IGNfbG9uZ2xvbmcuX19jdHlwZV9sZV9fKDB4MTIzNDU2Nzg5MEFCQ0RFRikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIjxxIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICJFRkNEQUI5MDc4NTYzNDEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICJFRkNEQUI5MDc4NTYzNDEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4OTBBQkNERUYpCisKKyAgICAgICAgcyA9IGNfdWxvbmdsb25nLl9fY3R5cGVfYmVfXygweDEyMzQ1Njc4OTBBQkNERUYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+USIsIDB4MTIzNDU2Nzg5MEFCQ0RFRikpLCAiMTIzNDU2Nzg5MEFCQ0RFRiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiMTIzNDU2Nzg5MEFCQ0RFRiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3ODkwQUJDREVGKQorCisgICAgICAgIHMgPSBjX3Vsb25nbG9uZy5fX2N0eXBlX2xlX18oMHgxMjM0NTY3ODkwQUJDREVGKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPFEiLCAweDEyMzQ1Njc4OTBBQkNERUYpKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2Nzg5MEFCQ0RFRikKKworICAgIGRlZiB0ZXN0X2VuZGlhbl9mbG9hdChzZWxmKToKKyAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2Zsb2F0Ll9fY3R5cGVfbGVfXyBpcyBjX2Zsb2F0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfZmxvYXQuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2Zsb2F0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfZmxvYXQuX19jdHlwZV9iZV9fIGlzIGNfZmxvYXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19mbG9hdC5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fIGlzIGNfZmxvYXQpCisgICAgICAgIHMgPSBjX2Zsb2F0KG1hdGgucGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCJmIiwgbWF0aC5waSkpLCBiaW4ocykpCisgICAgICAgICMgSG0sIHdoYXQncyB0aGUgcHJlY2lzaW9uIG9mIGEgZmxvYXQgY29tcGFyZWQgdG8gYSBkb3VibGU/CisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocy52YWx1ZSwgbWF0aC5waSwgNikKKyAgICAgICAgcyA9IGNfZmxvYXQuX19jdHlwZV9sZV9fKG1hdGgucGkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocy52YWx1ZSwgbWF0aC5waSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIjxmIiwgbWF0aC5waSkpLCBiaW4ocykpCisgICAgICAgIHMgPSBjX2Zsb2F0Ll9fY3R5cGVfYmVfXyhtYXRoLnBpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHMudmFsdWUsIG1hdGgucGksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+ZiIsIG1hdGgucGkpKSwgYmluKHMpKQorCisgICAgZGVmIHRlc3RfZW5kaWFuX2RvdWJsZShzZWxmKToKKyAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2RvdWJsZS5fX2N0eXBlX2xlX18gaXMgY19kb3VibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19kb3VibGUuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2RvdWJsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2RvdWJsZS5fX2N0eXBlX2JlX18gaXMgY19kb3VibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19kb3VibGUuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2RvdWJsZSkKKyAgICAgICAgcyA9IGNfZG91YmxlKG1hdGgucGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgbWF0aC5waSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soImQiLCBtYXRoLnBpKSksIGJpbihzKSkKKyAgICAgICAgcyA9IGNfZG91YmxlLl9fY3R5cGVfbGVfXyhtYXRoLnBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIG1hdGgucGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8ZCIsIG1hdGgucGkpKSwgYmluKHMpKQorICAgICAgICBzID0gY19kb3VibGUuX19jdHlwZV9iZV9fKG1hdGgucGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgbWF0aC5waSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5kIiwgbWF0aC5waSkpLCBiaW4ocykpCisKKyAgICBkZWYgdGVzdF9lbmRpYW5fb3RoZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2J5dGUuX19jdHlwZV9sZV9fIGlzIGNfYnl0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfYnl0ZS5fX2N0eXBlX2JlX18gaXMgY19ieXRlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3VieXRlLl9fY3R5cGVfbGVfXyBpcyBjX3VieXRlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY191Ynl0ZS5fX2N0eXBlX2JlX18gaXMgY191Ynl0ZSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoY19jaGFyLl9fY3R5cGVfbGVfXyBpcyBjX2NoYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2NoYXIuX19jdHlwZV9iZV9fIGlzIGNfY2hhcikKKworICAgIGRlZiB0ZXN0X3N0cnVjdF9maWVsZHNfMShzZWxmKToKKyAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICAgICAgICAgIGJhc2UgPSBCaWdFbmRpYW5TdHJ1Y3R1cmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhc2UgPSBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUKKworICAgICAgICBjbGFzcyBUKGJhc2UpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3VieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19zaG9ydCksCisgICAgICAgICAgICAgICAgICAgICgiZCIsIGNfdXNob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgKCJlIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAoImYiLCBjX3VpbnQpLAorICAgICAgICAgICAgICAgICAgICAoImciLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICAgICAoImgiLCBjX3Vsb25nKSwKKyAgICAgICAgICAgICAgICAgICAgKCJpIiwgY19sb25nbG9uZyksCisgICAgICAgICAgICAgICAgICAgICgiayIsIGNfdWxvbmdsb25nKSwKKyAgICAgICAgICAgICAgICAgICAgKCJsIiwgY19mbG9hdCksCisgICAgICAgICAgICAgICAgICAgICgibSIsIGNfZG91YmxlKSwKKyAgICAgICAgICAgICAgICAgICAgKCJuIiwgY19jaGFyKSwKKworICAgICAgICAgICAgICAgICAgICAoImIxIiwgY19ieXRlLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgKCJiMiIsIGNfYnl0ZSwgMyksCisgICAgICAgICAgICAgICAgICAgICgiYjMiLCBjX2J5dGUsIDIpLAorICAgICAgICAgICAgICAgICAgICAoImEiLCBjX2ludCAqIDMgKiAzICogMyldCisgICAgICAgIFQuX2ZpZWxkc18gPSBfZmllbGRzXworCisgICAgICAgICMgdGhlc2UgZmllbGRzIGRvIG5vdCBzdXBwb3J0IGRpZmZlcmVudCBieXRlIG9yZGVyOgorICAgICAgICBmb3IgdHlwIGluIGNfd2NoYXIsIGNfdm9pZF9wLCBQT0lOVEVSKGNfaW50KToKKyAgICAgICAgICAgIF9maWVsZHNfLmFwcGVuZCgoIngiLCB0eXApKQorICAgICAgICAgICAgY2xhc3MgVChiYXNlKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIFQsICJfZmllbGRzXyIsIFsoIngiLCB0eXApXSkKKworICAgIGRlZiB0ZXN0X3N0cnVjdF9zdHJ1Y3Qoc2VsZik6CisgICAgICAgICMgbmVzdGVkIHN0cnVjdHVyZXMgd2l0aCBkaWZmZXJlbnQgYnl0ZW9yZGVycworCisgICAgICAgICMgY3JlYXRlIG5lc3RlZCBzdHJ1Y3R1cmVzIHdpdGggZ2l2ZW4gYnl0ZW9yZGVycyBhbmQgc2V0IG1lbW9yeSB0byBkYXRhCisKKyAgICAgICAgZm9yIG5lc3RlZCwgZGF0YSBpbiAoCisgICAgICAgICAgICAoQmlnRW5kaWFuU3RydWN0dXJlLCBiJ1wwXDBcMFwxXDBcMFwwXDInKSwKKyAgICAgICAgICAgIChMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUsIGInXDFcMFwwXDBcMlwwXDBcMCcpLAorICAgICAgICApOgorICAgICAgICAgICAgZm9yIHBhcmVudCBpbiAoCisgICAgICAgICAgICAgICAgQmlnRW5kaWFuU3RydWN0dXJlLAorICAgICAgICAgICAgICAgIExpdHRsZUVuZGlhblN0cnVjdHVyZSwKKyAgICAgICAgICAgICAgICBTdHJ1Y3R1cmUsCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGNsYXNzIE5lc3RlZFN0cnVjdHVyZShuZXN0ZWQpOgorICAgICAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX3VpbnQzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfdWludDMyKV0KKworICAgICAgICAgICAgICAgIGNsYXNzIFRlc3RTdHJ1Y3R1cmUocGFyZW50KToKKyAgICAgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJwb2ludCIsIE5lc3RlZFN0cnVjdHVyZSldCisKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkYXRhKSwgc2l6ZW9mKFRlc3RTdHJ1Y3R1cmUpKQorICAgICAgICAgICAgICAgIHB0ciA9IFBPSU5URVIoVGVzdFN0cnVjdHVyZSkKKyAgICAgICAgICAgICAgICBzID0gY2FzdChkYXRhLCBwdHIpWzBdCisgICAgICAgICAgICAgICAgZGVsIGN0eXBlcy5fcG9pbnRlcl90eXBlX2NhY2hlW1Rlc3RTdHJ1Y3R1cmVdCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnBvaW50LngsIDEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnBvaW50LnksIDIpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfZmllbGRzXzIoc2VsZik6CisgICAgICAgICMgc3RhbmRhcmQgcGFja2luZyBpbiBzdHJ1Y3QgdXNlcyBubyBhbGlnbm1lbnQuCisgICAgICAgICMgU28sIHdlIGhhdmUgdG8gYWxpZ24gdXNpbmcgcGFkIGJ5dGVzLgorICAgICAgICAjCisgICAgICAgICMgVW5hbGlnbmVkIGFjY2Vzc2VzIHdpbGwgY3Jhc2ggUHl0aG9uIChvbiB0aG9zZSBwbGF0Zm9ybXMgdGhhdAorICAgICAgICAjIGRvbid0IGFsbG93IGl0LCBsaWtlIHNwYXJjIHNvbGFyaXMpLgorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgYmFzZSA9IEJpZ0VuZGlhblN0cnVjdHVyZQorICAgICAgICAgICAgZm10ID0gIj5ieGhpZCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhc2UgPSBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUKKyAgICAgICAgICAgIGZtdCA9ICI8YnhoaWQiCisKKyAgICAgICAgY2xhc3MgUyhiYXNlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYiIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsIGNfZG91YmxlKV0KKworICAgICAgICBzMSA9IFMoMHgxMiwgMHgxMjM0LCAweDEyMzQ1Njc4LCAzLjE0KQorICAgICAgICBzMiA9IHN0cnVjdC5wYWNrKGZtdCwgMHgxMiwgMHgxMjM0LCAweDEyMzQ1Njc4LCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzMSksIGJpbihzMikpCisKKyAgICBkZWYgdGVzdF91bmFsaWduZWRfbm9ubmF0aXZlX3N0cnVjdF9maWVsZHMoc2VsZik6CisgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICBiYXNlID0gQmlnRW5kaWFuU3RydWN0dXJlCisgICAgICAgICAgICBmbXQgPSAiPmIgaCB4aSB4ZCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhc2UgPSBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUKKyAgICAgICAgICAgIGZtdCA9ICI8YiBoIHhpIHhkIgorCisgICAgICAgIGNsYXNzIFMoYmFzZSk6CisgICAgICAgICAgICBfcGFja18gPSAxCisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImIiLCBjX2J5dGUpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCBjX3Nob3J0KSwKKworICAgICAgICAgICAgICAgICAgICAgICAgKCJfMSIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImkiLCBjX2ludCksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICgiXzIiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgY19kb3VibGUpXQorCisgICAgICAgIHMxID0gUygpCisgICAgICAgIHMxLmIgPSAweDEyCisgICAgICAgIHMxLmggPSAweDEyMzQKKyAgICAgICAgczEuaSA9IDB4MTIzNDU2NzgKKyAgICAgICAgczEuZCA9IDMuMTQKKyAgICAgICAgczIgPSBzdHJ1Y3QucGFjayhmbXQsIDB4MTIsIDB4MTIzNCwgMHgxMjM0NTY3OCwgMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oczEpLCBiaW4oczIpKQorCisgICAgZGVmIHRlc3RfdW5hbGlnbmVkX25hdGl2ZV9zdHJ1Y3RfZmllbGRzKHNlbGYpOgorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgZm10ID0gIjxiIGggeGkgeGQiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYXNlID0gTGl0dGxlRW5kaWFuU3RydWN0dXJlCisgICAgICAgICAgICBmbXQgPSAiPmIgaCB4aSB4ZCIKKworICAgICAgICBjbGFzcyBTKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfcGFja18gPSAxCisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImIiLCBjX2J5dGUpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCBjX3Nob3J0KSwKKworICAgICAgICAgICAgICAgICAgICAgICAgKCJfMSIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImkiLCBjX2ludCksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICgiXzIiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgY19kb3VibGUpXQorCisgICAgICAgIHMxID0gUygpCisgICAgICAgIHMxLmIgPSAweDEyCisgICAgICAgIHMxLmggPSAweDEyMzQKKyAgICAgICAgczEuaSA9IDB4MTIzNDU2NzgKKyAgICAgICAgczEuZCA9IDMuMTQKKyAgICAgICAgczIgPSBzdHJ1Y3QucGFjayhmbXQsIDB4MTIsIDB4MTIzNCwgMHgxMjM0NTY3OCwgMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oczEpLCBiaW4oczIpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlNWM2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlNWM2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUwYzE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHkKQEAgLTAsMCArMSwyNTYgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKKworY2xhc3MgQ2FsbGJhY2tzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmdW5jdHlwZSA9IENGVU5DVFlQRQorCisjIyAgICBkZWYgdGVhckRvd24oc2VsZik6CisjIyAgICAgICAgaW1wb3J0IGdjCisjIyAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICBkZWYgY2FsbGJhY2soc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLmdvdF9hcmdzID0gYXJncworICAgICAgICByZXR1cm4gYXJnc1stMV0KKworICAgIGRlZiBjaGVja190eXBlKHNlbGYsIHR5cCwgYXJnKToKKyAgICAgICAgUFJPVE8gPSBzZWxmLmZ1bmN0eXBlLmltX2Z1bmModHlwLCB0eXApCisgICAgICAgIHJlc3VsdCA9IFBST1RPKHNlbGYuY2FsbGJhY2spKGFyZykKKyAgICAgICAgaWYgdHlwID09IGNfZmxvYXQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJlc3VsdCwgYXJnLCBwbGFjZXM9NSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nb3RfYXJncywgKGFyZywpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGFyZykKKworICAgICAgICBQUk9UTyA9IHNlbGYuZnVuY3R5cGUuaW1fZnVuYyh0eXAsIGNfYnl0ZSwgdHlwKQorICAgICAgICByZXN1bHQgPSBQUk9UTyhzZWxmLmNhbGxiYWNrKSgtMywgYXJnKQorICAgICAgICBpZiB0eXAgPT0gY19mbG9hdDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocmVzdWx0LCBhcmcsIHBsYWNlcz01KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdvdF9hcmdzLCAoLTMsIGFyZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgYXJnKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIworCisgICAgZGVmIHRlc3RfYnl0ZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfYnl0ZSwgNDIpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2J5dGUsIC00MikKKworICAgIGRlZiB0ZXN0X3VieXRlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY191Ynl0ZSwgNDIpCisKKyAgICBkZWYgdGVzdF9zaG9ydChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfc2hvcnQsIDQyKQorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19zaG9ydCwgLTQyKQorCisgICAgZGVmIHRlc3RfdXNob3J0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY191c2hvcnQsIDQyKQorCisgICAgZGVmIHRlc3RfaW50KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19pbnQsIDQyKQorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19pbnQsIC00MikKKworICAgIGRlZiB0ZXN0X3VpbnQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX3VpbnQsIDQyKQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfbG9uZywgNDIpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2xvbmcsIC00MikKKworICAgIGRlZiB0ZXN0X3Vsb25nKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY191bG9uZywgNDIpCisKKyAgICBkZWYgdGVzdF9sb25nbG9uZyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHNvbWUgNjQtYml0IHZhbHVlcywgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2xvbmdsb25nLCA1OTQ4MjkxNzU3MjQ1Mjc3NDY3KQorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19sb25nbG9uZywgLTUyMjkzODg5MDk3ODQxOTA1ODApCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2xvbmdsb25nLCA0MikKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfbG9uZ2xvbmcsIC00MikKKworICAgIGRlZiB0ZXN0X3Vsb25nbG9uZyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHNvbWUgNjQtYml0IHZhbHVlcywgd2l0aCBhbmQgd2l0aG91dCBtc2Igc2V0LgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY191bG9uZ2xvbmcsIDEwOTU1NDEyMjQyMTcwMzM5NzgyKQorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY191bG9uZ2xvbmcsIDM2NjU4ODU0OTk4NDExNjc0NTgpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX3Vsb25nbG9uZywgNDIpCisKKyAgICBkZWYgdGVzdF9mbG9hdChzZWxmKToKKyAgICAgICAgIyBvbmx5IGFsbW9zdCBlcXVhbDogZG91YmxlIC0+IGZsb2F0IC0+IGRvdWJsZQorICAgICAgICBpbXBvcnQgbWF0aAorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19mbG9hdCwgbWF0aC5lKQorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19mbG9hdCwgLW1hdGguZSkKKworICAgIGRlZiB0ZXN0X2RvdWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfZG91YmxlLCAzLjE0KQorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19kb3VibGUsIC0zLjE0KQorCisgICAgZGVmIHRlc3RfbG9uZ2RvdWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfbG9uZ2RvdWJsZSwgMy4xNCkKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfbG9uZ2RvdWJsZSwgLTMuMTQpCisKKyAgICBkZWYgdGVzdF9jaGFyKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19jaGFyLCAieCIpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2NoYXIsICJhIikKKworICAgICMgZGlzYWJsZWQ6IHdvdWxkIG5vdyAoY29ycmVjdGx5KSByYWlzZSBhIFJ1bnRpbWVXYXJuaW5nIGFib3V0CisgICAgIyBhIG1lbW9yeSBsZWFrLiAgQSBjYWxsYmFjayBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuIGEgbm9uLWludGVncmFsCisgICAgIyBDIHR5cGUgd2l0aG91dCBjYXVzaW5nIGEgbWVtb3J5IGxlYWsuCisjIyAgICBkZWYgdGVzdF9jaGFyX3Aoc2VsZik6CisjIyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfY2hhcl9wLCAiYWJjIikKKyMjICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19jaGFyX3AsICJkZWYiKQorCisgICAgZGVmIHRlc3RfcHlvYmplY3Qoc2VsZik6CisgICAgICAgIG8gPSAoKQorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgZ2V0cmVmY291bnQgYXMgZ3JjCisgICAgICAgIGZvciBvIGluICgpLCBbXSwgb2JqZWN0KCk6CisgICAgICAgICAgICBpbml0aWFsID0gZ3JjKG8pCisgICAgICAgICAgICAjIFRoaXMgY2FsbCBsZWFrcyBhIHJlZmVyZW5jZSB0byAnbycuLi4KKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdHlwZShweV9vYmplY3QsIG8pCisgICAgICAgICAgICBiZWZvcmUgPSBncmMobykKKyAgICAgICAgICAgICMgLi4uYnV0IHRoaXMgY2FsbCBkb2Vzbid0IGxlYWsgYW55IG1vcmUuICBXaGVyZSBpcyB0aGUgcmVmY291bnQ/CisgICAgICAgICAgICBzZWxmLmNoZWNrX3R5cGUocHlfb2JqZWN0LCBvKQorICAgICAgICAgICAgYWZ0ZXIgPSBncmMobykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGFmdGVyLCBvKSwgKGJlZm9yZSwgbykpCisKKyAgICBkZWYgdGVzdF91bnN1cHBvcnRlZF9yZXN0eXBlXzEoc2VsZik6CisgICAgICAgICMgT25seSAiZnVuZGFtZW50YWwiIHJlc3VsdCB0eXBlcyBhcmUgc3VwcG9ydGVkIGZvciBjYWxsYmFjaworICAgICAgICAjIGZ1bmN0aW9ucywgdGhlIHR5cGUgbXVzdCBoYXZlIGEgbm9uLU5VTEwgc3RnZGljdC0+c2V0ZnVuYy4KKyAgICAgICAgIyBQT0lOVEVSKGNfZG91YmxlKSwgZm9yIGV4YW1wbGUsIGlzIG5vdCBzdXBwb3J0ZWQuCisKKyAgICAgICAgcHJvdG90eXBlID0gc2VsZi5mdW5jdHlwZS5pbV9mdW5jKFBPSU5URVIoY19kb3VibGUpKQorICAgICAgICAjIFRoZSB0eXBlIGlzIGNoZWNrZWQgd2hlbiB0aGUgcHJvdG90eXBlIGlzIGNhbGxlZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvdHlwZSwgbGFtYmRhOiBOb25lKQorCisgICAgZGVmIHRlc3RfdW5zdXBwb3J0ZWRfcmVzdHlwZV8yKHNlbGYpOgorICAgICAgICBwcm90b3R5cGUgPSBzZWxmLmZ1bmN0eXBlLmltX2Z1bmMob2JqZWN0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvdHlwZSwgbGFtYmRhOiBOb25lKQorCisgICAgZGVmIHRlc3RfaXNzdWVfNzk1OShzZWxmKToKKyAgICAgICAgcHJvdG8gPSBzZWxmLmZ1bmN0eXBlLmltX2Z1bmMoTm9uZSkKKworICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZnVuYyhzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYudiA9IHByb3RvKHNlbGYuZnVuYykKKworICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMzIpOgorICAgICAgICAgICAgWCgpCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBsaXZlID0gW3ggZm9yIHggaW4gZ2MuZ2V0X29iamVjdHMoKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoeCwgWCldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpdmUpLCAwKQorCisgICAgZGVmIHRlc3RfaXNzdWUxMjQ4MyhzZWxmKToKKyAgICAgICAgaW1wb3J0IGdjCisgICAgICAgIGNsYXNzIE5hc3R5OgorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIENGVU5DVFlQRShOb25lKShsYW1iZGEgeD1OYXN0eSgpOiBOb25lKQorCisKK3RyeToKKyAgICBXSU5GVU5DVFlQRQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGNsYXNzIFN0ZGNhbGxDYWxsYmFja3MoQ2FsbGJhY2tzKToKKyAgICAgICAgZnVuY3R5cGUgPSBXSU5GVU5DVFlQRQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIFNhbXBsZUNhbGxiYWNrc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2ludGVncmF0ZShzZWxmKToKKyAgICAgICAgIyBEZXJpdmVkIGZyb20gc29tZSB0aGVuIG5vbi13b3JraW5nIGNvZGUsIHBvc3RlZCBieSBEYXZpZCBGb3N0ZXIKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisKKyAgICAgICAgIyBUaGUgZnVuY3Rpb24gcHJvdG90eXBlIGNhbGxlZCBieSAnaW50ZWdyYXRlJzogZG91YmxlIGZ1bmMoZG91YmxlKTsKKyAgICAgICAgQ0FMTEJBQ0sgPSBDRlVOQ1RZUEUoY19kb3VibGUsIGNfZG91YmxlKQorCisgICAgICAgICMgVGhlIGludGVncmF0ZSBmdW5jdGlvbiBpdHNlbGYsIGV4cG9zZWQgZnJvbSB0aGUgX2N0eXBlc190ZXN0IGRsbAorICAgICAgICBpbnRlZ3JhdGUgPSBkbGwuaW50ZWdyYXRlCisgICAgICAgIGludGVncmF0ZS5hcmd0eXBlcyA9IChjX2RvdWJsZSwgY19kb3VibGUsIENBTExCQUNLLCBjX2xvbmcpCisgICAgICAgIGludGVncmF0ZS5yZXN0eXBlID0gY19kb3VibGUKKworICAgICAgICBkZWYgZnVuYyh4KToKKyAgICAgICAgICAgIHJldHVybiB4KioyCisKKyAgICAgICAgcmVzdWx0ID0gaW50ZWdyYXRlKDAuMCwgMS4wLCBDQUxMQkFDSyhmdW5jKSwgMTApCisgICAgICAgIGRpZmYgPSBhYnMocmVzdWx0IC0gMS4vMy4pCisKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKGRpZmYsIDAuMDEsICIlcyBub3QgbGVzcyB0aGFuIDAuMDEiICUgZGlmZikKKworICAgIGRlZiB0ZXN0X2lzc3VlXzg5NTlfYShzZWxmKToKKyAgICAgICAgZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5CisgICAgICAgIGxpYmNfcGF0aCA9IGZpbmRfbGlicmFyeSgiYyIpCisgICAgICAgIGlmIG5vdCBsaWJjX3BhdGg6CisgICAgICAgICAgICByZXR1cm4gIyBjYW5ub3QgdGVzdAorICAgICAgICBsaWJjID0gQ0RMTChsaWJjX3BhdGgpCisKKyAgICAgICAgQENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihjX2ludCksIFBPSU5URVIoY19pbnQpKQorICAgICAgICBkZWYgY21wX2Z1bmMoYSwgYik6CisgICAgICAgICAgICByZXR1cm4gYVswXSAtIGJbMF0KKworICAgICAgICBhcnJheSA9IChjX2ludCAqIDUpKDUsIDEsIDk5LCA3LCAzMykKKworICAgICAgICBsaWJjLnFzb3J0KGFycmF5LCBsZW4oYXJyYXkpLCBzaXplb2YoY19pbnQpLCBjbXBfZnVuYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcnJheVs6XSwgWzEsIDUsIDcsIDMzLCA5OV0pCisKKyAgICB0cnk6CisgICAgICAgIFdJTkZVTkNUWVBFCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGRlZiB0ZXN0X2lzc3VlXzg5NTlfYihzZWxmKToKKyAgICAgICAgICAgIGZyb20gY3R5cGVzLndpbnR5cGVzIGltcG9ydCBCT09MLCBIV05ELCBMUEFSQU0KKyAgICAgICAgICAgIGdsb2JhbCB3aW5kb3dDb3VudAorICAgICAgICAgICAgd2luZG93Q291bnQgPSAwCisKKyAgICAgICAgICAgIEBXSU5GVU5DVFlQRShCT09MLCBIV05ELCBMUEFSQU0pCisgICAgICAgICAgICBkZWYgRW51bVdpbmRvd3NDYWxsYmFja0Z1bmMoaHduZCwgbFBhcmFtKToKKyAgICAgICAgICAgICAgICBnbG9iYWwgd2luZG93Q291bnQKKyAgICAgICAgICAgICAgICB3aW5kb3dDb3VudCArPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUgI0FsbG93IHdpbmRvd3MgdG8ga2VlcCBlbnVtZXJhdGluZworCisgICAgICAgICAgICB3aW5kbGwudXNlcjMyLkVudW1XaW5kb3dzKEVudW1XaW5kb3dzQ2FsbGJhY2tGdW5jLCAwKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfcmVnaXN0ZXJfaW50KHNlbGYpOgorICAgICAgICAjIElzc3VlICM4Mjc1OiBidWdneSBoYW5kbGluZyBvZiBjYWxsYmFjayBhcmdzIHVuZGVyIFdpbjY0CisgICAgICAgICMgTk9URTogc2hvdWxkIGJlIHJ1biBvbiByZWxlYXNlIGJ1aWxkcyBhcyB3ZWxsCisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBDQUxMQkFDSyA9IENGVU5DVFlQRShjX2ludCwgY19pbnQsIGNfaW50LCBjX2ludCwgY19pbnQsIGNfaW50KQorICAgICAgICAjIEFsbCB0aGlzIGZ1bmN0aW9uIGRvZXMgaXMgY2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBpdHMgYXJncyBzcXVhcmVkCisgICAgICAgIGZ1bmMgPSBkbGwuX3Rlc3RmdW5jX2Nia19yZWdfaW50CisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoY19pbnQsIGNfaW50LCBjX2ludCwgY19pbnQsIGNfaW50LCBDQUxMQkFDSykKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gY19pbnQKKworICAgICAgICBkZWYgY2FsbGJhY2soYSwgYiwgYywgZCwgZSk6CisgICAgICAgICAgICByZXR1cm4gYSArIGIgKyBjICsgZCArIGUKKworICAgICAgICByZXN1bHQgPSBmdW5jKDIsIDMsIDQsIDUsIDYsIENBTExCQUNLKGNhbGxiYWNrKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGNhbGxiYWNrKDIqMiwgMyozLCA0KjQsIDUqNSwgNio2KSkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX3JlZ2lzdGVyX2RvdWJsZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjODI3NTogYnVnZ3kgaGFuZGxpbmcgb2YgY2FsbGJhY2sgYXJncyB1bmRlciBXaW42NAorICAgICAgICAjIE5PVEU6IHNob3VsZCBiZSBydW4gb24gcmVsZWFzZSBidWlsZHMgYXMgd2VsbAorICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgQ0FMTEJBQ0sgPSBDRlVOQ1RZUEUoY19kb3VibGUsIGNfZG91YmxlLCBjX2RvdWJsZSwgY19kb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfZG91YmxlLCBjX2RvdWJsZSkKKyAgICAgICAgIyBBbGwgdGhpcyBmdW5jdGlvbiBkb2VzIGlzIGNhbGwgdGhlIGNhbGxiYWNrIHdpdGggaXRzIGFyZ3Mgc3F1YXJlZAorICAgICAgICBmdW5jID0gZGxsLl90ZXN0ZnVuY19jYmtfcmVnX2RvdWJsZQorICAgICAgICBmdW5jLmFyZ3R5cGVzID0gKGNfZG91YmxlLCBjX2RvdWJsZSwgY19kb3VibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY19kb3VibGUsIGNfZG91YmxlLCBDQUxMQkFDSykKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gY19kb3VibGUKKworICAgICAgICBkZWYgY2FsbGJhY2soYSwgYiwgYywgZCwgZSk6CisgICAgICAgICAgICByZXR1cm4gYSArIGIgKyBjICsgZCArIGUKKworICAgICAgICByZXN1bHQgPSBmdW5jKDEuMSwgMi4yLCAzLjMsIDQuNCwgNS41LCBDQUxMQkFDSyhjYWxsYmFjaykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKDEuMSoxLjEsIDIuMioyLjIsIDMuMyozLjMsIDQuNCo0LjQsIDUuNSo1LjUpKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkMmUwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhkMmUwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2ZmZmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5CkBAIC0wLDAgKzEsODkgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKKworY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hcnJheTJwb2ludGVyKHNlbGYpOgorICAgICAgICBhcnJheSA9IChjX2ludCAqIDMpKDQyLCAxNywgMikKKworICAgICAgICAjIGNhc3RpbmcgYW4gYXJyYXkgdG8gYSBwb2ludGVyIHdvcmtzLgorICAgICAgICBwdHIgPSBjYXN0KGFycmF5LCBQT0lOVEVSKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbcHRyW2ldIGZvciBpIGluIHJhbmdlKDMpXSwgWzQyLCAxNywgMl0pCisKKyAgICAgICAgaWYgMipzaXplb2YoY19zaG9ydCkgPT0gc2l6ZW9mKGNfaW50KToKKyAgICAgICAgICAgIHB0ciA9IGNhc3QoYXJyYXksIFBPSU5URVIoY19zaG9ydCkpCisgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3B0cltpXSBmb3IgaSBpbiByYW5nZSg2KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzQyLCAwLCAxNywgMCwgMiwgMF0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3B0cltpXSBmb3IgaSBpbiByYW5nZSg2KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDQyLCAwLCAxNywgMCwgMl0pCisKKyAgICBkZWYgdGVzdF9hZGRyZXNzMnBvaW50ZXIoc2VsZik6CisgICAgICAgIGFycmF5ID0gKGNfaW50ICogMykoNDIsIDE3LCAyKQorCisgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzb2YoYXJyYXkpCisgICAgICAgIHB0ciA9IGNhc3QoY192b2lkX3AoYWRkcmVzcyksIFBPSU5URVIoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKKworICAgICAgICBwdHIgPSBjYXN0KGFkZHJlc3MsIFBPSU5URVIoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKKworICAgIGRlZiB0ZXN0X3AyYV9vYmplY3RzKHNlbGYpOgorICAgICAgICBhcnJheSA9IChjX2NoYXJfcCAqIDUpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcnJheS5fb2JqZWN0cywgTm9uZSkKKyAgICAgICAgYXJyYXlbMF0gPSAiZm9vIGJhciIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcnJheS5fb2JqZWN0cywgeycwJzogImZvbyBiYXIifSkKKworICAgICAgICBwID0gY2FzdChhcnJheSwgUE9JTlRFUihjX2NoYXJfcCkpCisgICAgICAgICMgYXJyYXkgYW5kIHAgc2hhcmUgYSBjb21tb24gX29iamVjdHMgYXR0cmlidXRlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwLl9vYmplY3RzIGlzIGFycmF5Ll9vYmplY3RzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFycmF5Ll9vYmplY3RzLCB7JzAnOiAiZm9vIGJhciIsIGlkKGFycmF5KTogYXJyYXl9KQorICAgICAgICBwWzBdID0gInNwYW0gc3BhbSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLl9vYmplY3RzLCB7JzAnOiAic3BhbSBzcGFtIiwgaWQoYXJyYXkpOiBhcnJheX0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhcnJheS5fb2JqZWN0cyBpcyBwLl9vYmplY3RzKQorICAgICAgICBwWzFdID0gImZvbyBiYXIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5fb2JqZWN0cywgeycxJzogJ2ZvbyBiYXInLCAnMCc6ICJzcGFtIHNwYW0iLCBpZChhcnJheSk6IGFycmF5fSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFycmF5Ll9vYmplY3RzIGlzIHAuX29iamVjdHMpCisKKyAgICBkZWYgdGVzdF9vdGhlcihzZWxmKToKKyAgICAgICAgcCA9IGNhc3QoKGNfaW50ICogNCkoMSwgMiwgMywgNCksIFBPSU5URVIoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjRdLCBbMSwyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0Ol0sIFsxLCAyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzM6LTE6LTFdLCBbNCwgMywgMiwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6NDozXSwgWzEsIDRdKQorICAgICAgICBjX2ludCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6NF0sIFsxLCAyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0Ol0sIFsxLCAyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzM6LTE6LTFdLCBbNCwgMywgMiwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6NDozXSwgWzEsIDRdKQorICAgICAgICBwWzJdID0gOTYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0XSwgWzEsIDIsIDk2LCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0Ol0sIFsxLCAyLCA5NiwgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFszOi0xOi0xXSwgWzQsIDk2LCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0OjNdLCBbMSwgNF0pCisgICAgICAgIGNfaW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0XSwgWzEsIDIsIDk2LCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0Ol0sIFsxLCAyLCA5NiwgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFszOi0xOi0xXSwgWzQsIDk2LCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0OjNdLCBbMSwgNF0pCisKKyAgICBkZWYgdGVzdF9jaGFyX3Aoc2VsZik6CisgICAgICAgICMgVGhpcyBkaWRuJ3Qgd29yazogYmFkIGFyZ3VtZW50IHRvIGludGVybmFsIGZ1bmN0aW9uCisgICAgICAgIHMgPSBjX2NoYXJfcCgiaGlobyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FzdChjYXN0KHMsIGNfdm9pZF9wKSwgY19jaGFyX3ApLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlobyIpCisKKyAgICB0cnk6CisgICAgICAgIGNfd2NoYXJfcAorICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBkZWYgdGVzdF93Y2hhcl9wKHNlbGYpOgorICAgICAgICAgICAgcyA9IGNfd2NoYXJfcCgiaGlobyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoY2FzdChzLCBjX3ZvaWRfcCksIGNfd2NoYXJfcCkudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlobyIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkYzYzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkYzYzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTNjYmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weQpAQCAtMCwwICsxLDIxMSBAQAorIyBBIGxvdCBvZiBmYWlsdXJlcyBpbiB0aGVzZSB0ZXN0cyBvbiBNYWMgT1MgWC4KKyMgQnl0ZSBvcmRlciByZWxhdGVkPworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKKworY2xhc3MgQ0Z1bmN0aW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgX2RsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorCisgICAgZGVmIFMoc2VsZik6CisgICAgICAgIHJldHVybiBjX2xvbmdsb25nLmluX2RsbChzZWxmLl9kbGwsICJsYXN0X3RmX2FyZ19zIikudmFsdWUKKyAgICBkZWYgVShzZWxmKToKKyAgICAgICAgcmV0dXJuIGNfdWxvbmdsb25nLmluX2RsbChzZWxmLl9kbGwsICJsYXN0X3RmX2FyZ191IikudmFsdWUKKworICAgIGRlZiB0ZXN0X2J5dGUoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iLnJlc3R5cGUgPSBjX2J5dGUKKyAgICAgICAgc2VsZi5fZGxsLnRmX2IuYXJndHlwZXMgPSAoY19ieXRlLCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYigtMTI2KSwgLTQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtMTI2KQorCisgICAgZGVmIHRlc3RfYnl0ZV9wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYmIucmVzdHlwZSA9IGNfYnl0ZQorICAgICAgICBzZWxmLl9kbGwudGZfYmIuYXJndHlwZXMgPSAoY19ieXRlLCBjX2J5dGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JiKDAsIC0xMjYpLCAtNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC0xMjYpCisKKyAgICBkZWYgdGVzdF91Ynl0ZShzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX0IucmVzdHlwZSA9IGNfdWJ5dGUKKyAgICAgICAgc2VsZi5fZGxsLnRmX0IuYXJndHlwZXMgPSAoY191Ynl0ZSwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX0IoMjU1KSwgODUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDI1NSkKKworICAgIGRlZiB0ZXN0X3VieXRlX3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iQi5yZXN0eXBlID0gY191Ynl0ZQorICAgICAgICBzZWxmLl9kbGwudGZfYkIuYXJndHlwZXMgPSAoY19ieXRlLCBjX3VieXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iQigwLCAyNTUpLCA4NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgMjU1KQorCisgICAgZGVmIHRlc3Rfc2hvcnQoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9oLnJlc3R5cGUgPSBjX3Nob3J0CisgICAgICAgIHNlbGYuX2RsbC50Zl9oLmFyZ3R5cGVzID0gKGNfc2hvcnQsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9oKC0zMjc2NiksIC0xMDkyMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTMyNzY2KQorCisgICAgZGVmIHRlc3Rfc2hvcnRfcGx1cyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JoLnJlc3R5cGUgPSBjX3Nob3J0CisgICAgICAgIHNlbGYuX2RsbC50Zl9iaC5hcmd0eXBlcyA9IChjX2J5dGUsIGNfc2hvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JoKDAsIC0zMjc2NiksIC0xMDkyMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTMyNzY2KQorCisgICAgZGVmIHRlc3RfdXNob3J0KHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfSC5yZXN0eXBlID0gY191c2hvcnQKKyAgICAgICAgc2VsZi5fZGxsLnRmX0guYXJndHlwZXMgPSAoY191c2hvcnQsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9IKDY1NTM1KSwgMjE4NDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDY1NTM1KQorCisgICAgZGVmIHRlc3RfdXNob3J0X3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iSC5yZXN0eXBlID0gY191c2hvcnQKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JILmFyZ3R5cGVzID0gKGNfYnl0ZSwgY191c2hvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JIKDAsIDY1NTM1KSwgMjE4NDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDY1NTM1KQorCisgICAgZGVmIHRlc3RfaW50KHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfaS5yZXN0eXBlID0gY19pbnQKKyAgICAgICAgc2VsZi5fZGxsLnRmX2kuYXJndHlwZXMgPSAoY19pbnQsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9pKC0yMTQ3NDgzNjQ2KSwgLTcxNTgyNzg4MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTIxNDc0ODM2NDYpCisKKyAgICBkZWYgdGVzdF9pbnRfcGx1cyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JpLnJlc3R5cGUgPSBjX2ludAorICAgICAgICBzZWxmLl9kbGwudGZfYmkuYXJndHlwZXMgPSAoY19ieXRlLCBjX2ludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmkoMCwgLTIxNDc0ODM2NDYpLCAtNzE1ODI3ODgyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKKworICAgIGRlZiB0ZXN0X3VpbnQoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9JLnJlc3R5cGUgPSBjX3VpbnQKKyAgICAgICAgc2VsZi5fZGxsLnRmX0kuYXJndHlwZXMgPSAoY191aW50LCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfSSg0Mjk0OTY3Mjk1KSwgMTQzMTY1NTc2NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgNDI5NDk2NzI5NSkKKworICAgIGRlZiB0ZXN0X3VpbnRfcGx1cyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JJLnJlc3R5cGUgPSBjX3VpbnQKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JJLmFyZ3R5cGVzID0gKGNfYnl0ZSwgY191aW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iSSgwLCA0Mjk0OTY3Mjk1KSwgMTQzMTY1NTc2NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgNDI5NDk2NzI5NSkKKworICAgIGRlZiB0ZXN0X2xvbmcoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9sLnJlc3R5cGUgPSBjX2xvbmcKKyAgICAgICAgc2VsZi5fZGxsLnRmX2wuYXJndHlwZXMgPSAoY19sb25nLCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfbCgtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC0yMTQ3NDgzNjQ2KQorCisgICAgZGVmIHRlc3RfbG9uZ19wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYmwucmVzdHlwZSA9IGNfbG9uZworICAgICAgICBzZWxmLl9kbGwudGZfYmwuYXJndHlwZXMgPSAoY19ieXRlLCBjX2xvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JsKDAsIC0yMTQ3NDgzNjQ2KSwgLTcxNTgyNzg4MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTIxNDc0ODM2NDYpCisKKyAgICBkZWYgdGVzdF91bG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX0wucmVzdHlwZSA9IGNfdWxvbmcKKyAgICAgICAgc2VsZi5fZGxsLnRmX0wuYXJndHlwZXMgPSAoY191bG9uZywpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX0woNDI5NDk2NzI5NSksIDE0MzE2NTU3NjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDQyOTQ5NjcyOTUpCisKKyAgICBkZWYgdGVzdF91bG9uZ19wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYkwucmVzdHlwZSA9IGNfdWxvbmcKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JMLmFyZ3R5cGVzID0gKGNfY2hhciwgY191bG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYkwoJyAnLCA0Mjk0OTY3Mjk1KSwgMTQzMTY1NTc2NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgNDI5NDk2NzI5NSkKKworICAgIGRlZiB0ZXN0X2xvbmdsb25nKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfcS5yZXN0eXBlID0gY19sb25nbG9uZworICAgICAgICBzZWxmLl9kbGwudGZfcS5hcmd0eXBlcyA9IChjX2xvbmdsb25nLCApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX3EoLTkyMjMzNzIwMzY4NTQ3NzU4MDYpLCAtMzA3NDQ1NzM0NTYxODI1ODYwMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDYpCisKKyAgICBkZWYgdGVzdF9sb25nbG9uZ19wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYnEucmVzdHlwZSA9IGNfbG9uZ2xvbmcKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JxLmFyZ3R5cGVzID0gKGNfYnl0ZSwgY19sb25nbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYnEoMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDYpLCAtMzA3NDQ1NzM0NTYxODI1ODYwMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDYpCisKKyAgICBkZWYgdGVzdF91bG9uZ2xvbmcoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9RLnJlc3R5cGUgPSBjX3Vsb25nbG9uZworICAgICAgICBzZWxmLl9kbGwudGZfUS5hcmd0eXBlcyA9IChjX3Vsb25nbG9uZywgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9RKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSwgNjE0ODkxNDY5MTIzNjUxNzIwNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgMTg0NDY3NDQwNzM3MDk1NTE2MTUpCisKKyAgICBkZWYgdGVzdF91bG9uZ2xvbmdfcGx1cyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JRLnJlc3R5cGUgPSBjX3Vsb25nbG9uZworICAgICAgICBzZWxmLl9kbGwudGZfYlEuYXJndHlwZXMgPSAoY19ieXRlLCBjX3Vsb25nbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYlEoMCwgMTg0NDY3NDQwNzM3MDk1NTE2MTUpLCA2MTQ4OTE0NjkxMjM2NTE3MjA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCAxODQ0Njc0NDA3MzcwOTU1MTYxNSkKKworICAgIGRlZiB0ZXN0X2Zsb2F0KHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfZi5yZXN0eXBlID0gY19mbG9hdAorICAgICAgICBzZWxmLl9kbGwudGZfZi5hcmd0eXBlcyA9IChjX2Zsb2F0LCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfZigtNDIuKSwgLTE0LikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTQyKQorCisgICAgZGVmIHRlc3RfZmxvYXRfcGx1cyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JmLnJlc3R5cGUgPSBjX2Zsb2F0CisgICAgICAgIHNlbGYuX2RsbC50Zl9iZi5hcmd0eXBlcyA9IChjX2J5dGUsIGNfZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JmKDAsIC00Mi4pLCAtMTQuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtNDIpCisKKyAgICBkZWYgdGVzdF9kb3VibGUoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9kLnJlc3R5cGUgPSBjX2RvdWJsZQorICAgICAgICBzZWxmLl9kbGwudGZfZC5hcmd0eXBlcyA9IChjX2RvdWJsZSwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2QoNDIuKSwgMTQuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCA0MikKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYmQucmVzdHlwZSA9IGNfZG91YmxlCisgICAgICAgIHNlbGYuX2RsbC50Zl9iZC5hcmd0eXBlcyA9IChjX2J5dGUsIGNfZG91YmxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iZCgwLCA0Mi4pLCAxNC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIDQyKQorCisgICAgZGVmIHRlc3RfbG9uZ2RvdWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX0QucmVzdHlwZSA9IGNfbG9uZ2RvdWJsZQorICAgICAgICBzZWxmLl9kbGwudGZfRC5hcmd0eXBlcyA9IChjX2xvbmdkb3VibGUsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9EKDQyLiksIDE0LikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgNDIpCisKKyAgICBkZWYgdGVzdF9sb25nZG91YmxlX3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iRC5yZXN0eXBlID0gY19sb25nZG91YmxlCisgICAgICAgIHNlbGYuX2RsbC50Zl9iRC5hcmd0eXBlcyA9IChjX2J5dGUsIGNfbG9uZ2RvdWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYkQoMCwgNDIuKSwgMTQuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCA0MikKKworICAgIGRlZiB0ZXN0X2NhbGx3aXRocmVzdWx0KHNlbGYpOgorICAgICAgICBkZWYgcHJvY2Vzc19yZXN1bHQocmVzdWx0KToKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQgKiAyCisgICAgICAgIHNlbGYuX2RsbC50Zl9pLnJlc3R5cGUgPSBwcm9jZXNzX3Jlc3VsdAorICAgICAgICBzZWxmLl9kbGwudGZfaS5hcmd0eXBlcyA9IChjX2ludCwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2koNDIpLCAyOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2koLTQyKSwgLTI4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtNDIpCisKKyAgICBkZWYgdGVzdF92b2lkKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudHZfaS5yZXN0eXBlID0gTm9uZQorICAgICAgICBzZWxmLl9kbGwudHZfaS5hcmd0eXBlcyA9IChjX2ludCwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnR2X2koNDIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudHZfaSgtNDIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtNDIpCisKKyMgVGhlIGZvbGxvd2luZyByZXBlYXRlcyB0aGUgYWJvdmUgdGVzdHMgd2l0aCBzdGRjYWxsIGZ1bmN0aW9ucyAod2hlcmUKKyMgdGhleSBhcmUgYXZhaWxhYmxlKQordHJ5OgorICAgIFdpbkRMTAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGNsYXNzIHN0ZGNhbGxfZGxsKFdpbkRMTCk6CisgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgIGlmIG5hbWVbOjJdID09ICdfXycgYW5kIG5hbWVbLTI6XSA9PSAnX18nOgorICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpCisgICAgICAgICAgICBmdW5jID0gc2VsZi5fRnVuY1B0cigoInNfIiArIG5hbWUsIHNlbGYpKQorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBmdW5jKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMKKworICAgIGNsYXNzIHN0ZGNhbGxDRnVuY3Rpb25zKENGdW5jdGlvbnMpOgorICAgICAgICBfZGxsID0gc3RkY2FsbF9kbGwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBwYXNzCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDYyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDYyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjY2M1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weQpAQCAtMCwwICsxLDM5IEBACitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworY2xhc3MgQ0hFQ0tFRChjX2ludCk6CisgICAgZGVmIF9jaGVja19yZXR2YWxfKHZhbHVlKToKKyAgICAgICAgIyBSZWNlaXZlcyBhIENIRUNLRUQgaW5zdGFuY2UuCisgICAgICAgIHJldHVybiBzdHIodmFsdWUudmFsdWUpCisgICAgX2NoZWNrX3JldHZhbF8gPSBzdGF0aWNtZXRob2QoX2NoZWNrX3JldHZhbF8pCisKK2NsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY2hlY2tyZXR2YWwoc2VsZik6CisKKyAgICAgICAgaW1wb3J0IF9jdHlwZXNfdGVzdAorICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZGxsLl90ZXN0ZnVuY19wX3AoNDIpKQorCisgICAgICAgIGRsbC5fdGVzdGZ1bmNfcF9wLnJlc3R5cGUgPSBDSEVDS0VECisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjQyIiwgZGxsLl90ZXN0ZnVuY19wX3AoNDIpKQorCisgICAgICAgIGRsbC5fdGVzdGZ1bmNfcF9wLnJlc3R5cGUgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZGxsLl90ZXN0ZnVuY19wX3AoNDIpKQorCisgICAgICAgIGRlbCBkbGwuX3Rlc3RmdW5jX3BfcC5yZXN0eXBlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGRsbC5fdGVzdGZ1bmNfcF9wKDQyKSkKKworICAgIHRyeToKKyAgICAgICAgb2xlZGxsCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGRlZiB0ZXN0X29sZWRsbChzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGVkbGwub2xlYXV0MzIuQ3JlYXRlVHlwZUxpYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTm9uZSwgTm9uZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NjNkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NjNkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9kZWxhdHRyLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2RlbGF0dHIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0ZDU4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9kZWxhdHRyLnB5CkBAIC0wLDAgKzEsMjEgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygiZm9vIiwgY19pbnQpXQorCitjbGFzcyBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF0dHIsIGNfaW50KDQyKSwgInZhbHVlIikKKworICAgIGRlZiB0ZXN0X2NoYXJhcnJheShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxhdHRyLCAoY19jaGFyICogNSkoKSwgInZhbHVlIikKKworICAgIGRlZiB0ZXN0X3N0cnVjdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxhdHRyLCBYKCksICJmb28iKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2RlbGF0dHIucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2RlbGF0dHIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZGVsYXR0ci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2RlbGF0dHIucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2RlbGF0dHIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMWM5MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZGVsYXR0ci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2VycmNoZWNrLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2VycmNoZWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTEzZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHkKQEAgLTAsMCArMSwxOSBAQAoraW1wb3J0IHN5cworZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworIyNjbGFzcyBITU9EVUxFKFN0cnVjdHVyZSk6CisjIyAgICBfZmllbGRzXyA9IFsoInZhbHVlIiwgY192b2lkX3ApXQorCisjIyAgICBkZWYgX19yZXByX18oc2VsZik6CisjIyAgICAgICAgcmV0dXJuICI8SE1PRFVMRSAlcz4iICUgc2VsZi52YWx1ZQorCisjI3dpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBLnJlc3R5cGUgPSBITU9EVUxFCisKKyMjcHJpbnQgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoInB5dGhvbjIzLmRsbCIpCisjI3ByaW50IGhleChzeXMuZGxsaGFuZGxlKQorCisjI2RlZiBub256ZXJvKGhhbmRsZSk6CisjIyAgICByZXR1cm4gKEdldExhc3RFcnJvcigpLCBoYW5kbGUpCisKKyMjd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEuZXJyY2hlY2sgPSBub256ZXJvCisjI3ByaW50IHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBKCJzcGFtIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9lcnJjaGVjay5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTJlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9lcnJjaGVjay5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTJlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9lcnJuby5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9lcnJuby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E1YmYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Vycm5vLnB5CkBAIC0wLDAgKzEsODAgQEAKK2ltcG9ydCB1bml0dGVzdCwgb3MsIGVycm5vCitmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCisKK2NsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X29wZW4oc2VsZik6CisgICAgICAgIGxpYmNfbmFtZSA9IGZpbmRfbGlicmFyeSgiYyIpCisgICAgICAgIGlmIGxpYmNfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIlVuYWJsZSB0byBmaW5kIEMgbGlicmFyeSIpCisgICAgICAgIGxpYmMgPSBDRExMKGxpYmNfbmFtZSwgdXNlX2Vycm5vPVRydWUpCisgICAgICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKKyAgICAgICAgICAgIGxpYmNfb3BlbiA9IGxpYmMuX29wZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxpYmNfb3BlbiA9IGxpYmMub3BlbgorCisgICAgICAgIGxpYmNfb3Blbi5hcmd0eXBlcyA9IGNfY2hhcl9wLCBjX2ludAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGliY19vcGVuKCIiLCAwKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2Vycm5vKCksIGVycm5vLkVOT0VOVCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldF9lcnJubygzMiksIGVycm5vLkVOT0VOVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZXJybm8oKSwgMzIpCisKKyAgICAgICAgaWYgdGhyZWFkaW5nOgorICAgICAgICAgICAgZGVmIF93b3JrZXIoKToKKyAgICAgICAgICAgICAgICBzZXRfZXJybm8oMCkKKworICAgICAgICAgICAgICAgIGxpYmMgPSBDRExMKGxpYmNfbmFtZSwgdXNlX2Vycm5vPUZhbHNlKQorICAgICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKKyAgICAgICAgICAgICAgICAgICAgbGliY19vcGVuID0gbGliYy5fb3BlbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxpYmNfb3BlbiA9IGxpYmMub3BlbgorICAgICAgICAgICAgICAgIGxpYmNfb3Blbi5hcmd0eXBlcyA9IGNfY2hhcl9wLCBjX2ludAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGliY19vcGVuKCIiLCAwKSwgLTEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZXJybm8oKSwgMCkKKworICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PV93b3JrZXIpCisgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIHQuam9pbigpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2Vycm5vKCksIDMyKQorICAgICAgICAgICAgc2V0X2Vycm5vKDApCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lID09ICJudCIsICdUZXN0IHNwZWNpZmljIHRvIFdpbmRvd3MnKQorICAgIGRlZiB0ZXN0X0dldExhc3RFcnJvcihzZWxmKToKKyAgICAgICAgZGxsID0gV2luRExMKCJrZXJuZWwzMiIsIHVzZV9sYXN0X2Vycm9yPVRydWUpCisgICAgICAgIEdldE1vZHVsZUhhbmRsZSA9IGRsbC5HZXRNb2R1bGVIYW5kbGVBCisgICAgICAgIEdldE1vZHVsZUhhbmRsZS5hcmd0eXBlcyA9IFtjX3djaGFyX3BdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBHZXRNb2R1bGVIYW5kbGUoImZvbyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9sYXN0X2Vycm9yKCksIDEyNikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldF9sYXN0X2Vycm9yKDMyKSwgMTI2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9sYXN0X2Vycm9yKCksIDMyKQorCisgICAgICAgIGRlZiBfd29ya2VyKCk6CisgICAgICAgICAgICBzZXRfbGFzdF9lcnJvcigwKQorCisgICAgICAgICAgICBkbGwgPSBXaW5ETEwoImtlcm5lbDMyIiwgdXNlX2xhc3RfZXJyb3I9RmFsc2UpCisgICAgICAgICAgICBHZXRNb2R1bGVIYW5kbGUgPSBkbGwuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlLmFyZ3R5cGVzID0gW2Nfd2NoYXJfcF0KKyAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZSgiYmFyIikKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfbGFzdF9lcnJvcigpLCAwKQorCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1fd29ya2VyKQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9sYXN0X2Vycm9yKCksIDMyKQorCisgICAgICAgIHNldF9sYXN0X2Vycm9yKDApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Vycm5vLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDNmNzRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Vycm5vLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Vycm5vLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDNmNzRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Vycm5vLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTc4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weQpAQCAtMCwwICsxLDgyIEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitmcm9tIGN0eXBlcy51dGlsIGltcG9ydCBmaW5kX2xpYnJhcnkKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IGlzX3Jlc291cmNlX2VuYWJsZWQKKworaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgbGliX2dsID0gZmluZF9saWJyYXJ5KCJPcGVuR0wzMiIpCisgICAgbGliX2dsdSA9IGZpbmRfbGlicmFyeSgiR2x1MzIiKQorICAgIGxpYl9nbGUgPSBOb25lCitlbGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICBsaWJfZ2wgPSBsaWJfZ2x1ID0gZmluZF9saWJyYXJ5KCJPcGVuR0wiKQorICAgIGxpYl9nbGUgPSBOb25lCitlbHNlOgorICAgIGxpYl9nbCA9IGZpbmRfbGlicmFyeSgiR0wiKQorICAgIGxpYl9nbHUgPSBmaW5kX2xpYnJhcnkoIkdMVSIpCisgICAgbGliX2dsZSA9IGZpbmRfbGlicmFyeSgiZ2xlIikKKworIyMgcHJpbnQsIGZvciBkZWJ1Z2dpbmcKK2lmIGlzX3Jlc291cmNlX2VuYWJsZWQoInByaW50aW5nIik6CisgICAgaWYgbGliX2dsIG9yIGxpYl9nbHUgb3IgbGliX2dsZToKKyAgICAgICAgcHJpbnQgIk9wZW5HTCBsaWJyYXJpZXM6IgorICAgICAgICBmb3IgaXRlbSBpbiAoKCJHTCIsIGxpYl9nbCksCisgICAgICAgICAgICAgICAgICAgICAoIkdMVSIsIGxpYl9nbHUpLAorICAgICAgICAgICAgICAgICAgICAgKCJnbGUiLCBsaWJfZ2xlKSk6CisgICAgICAgICAgICBwcmludCAiXHQiLCBpdGVtCisKKworIyBPbiBzb21lIHN5c3RlbXMsIGxvYWRpbmcgdGhlIE9wZW5HTCBsaWJyYXJpZXMgbmVlZHMgdGhlIFJUTERfR0xPQkFMIG1vZGUuCitjbGFzcyBUZXN0X09wZW5HTF9saWJzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZ2wgPSBzZWxmLmdsdSA9IHNlbGYuZ2xlID0gTm9uZQorICAgICAgICBpZiBsaWJfZ2w6CisgICAgICAgICAgICBzZWxmLmdsID0gQ0RMTChsaWJfZ2wsIG1vZGU9UlRMRF9HTE9CQUwpCisgICAgICAgIGlmIGxpYl9nbHU6CisgICAgICAgICAgICBzZWxmLmdsdSA9IENETEwobGliX2dsdSwgUlRMRF9HTE9CQUwpCisgICAgICAgIGlmIGxpYl9nbGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5nbGUgPSBDRExMKGxpYl9nbGUpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBpZiBsaWJfZ2w6CisgICAgICAgIGRlZiB0ZXN0X2dsKHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5nbDoKKyAgICAgICAgICAgICAgICBzZWxmLmdsLmdsQ2xlYXJJbmRleAorCisgICAgaWYgbGliX2dsdToKKyAgICAgICAgZGVmIHRlc3RfZ2x1KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5nbHU6CisgICAgICAgICAgICAgICAgc2VsZi5nbHUuZ2x1QmVnaW5DdXJ2ZQorCisgICAgaWYgbGliX2dsZToKKyAgICAgICAgZGVmIHRlc3RfZ2xlKHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5nbGU6CisgICAgICAgICAgICAgICAgc2VsZi5nbGUuZ2xlR2V0Sm9pblN0eWxlCisKKyMjaWYgb3MubmFtZSA9PSAicG9zaXgiIGFuZCBzeXMucGxhdGZvcm0gIT0gImRhcndpbiI6CisKKyMjICAgICMgT24gcGxhdGZvcm1zIHdoZXJlIHRoZSBkZWZhdWx0IHNoYXJlZCBsaWJyYXJ5IHN1ZmZpeCBpcyAnLnNvJywKKyMjICAgICMgYXQgbGVhc3Qgc29tZSBsaWJyYXJpZXMgY2FuIGJlIGxvYWRlZCBhcyBhdHRyaWJ1dGVzIG9mIHRoZSBjZGxsCisjIyAgICAjIG9iamVjdCwgc2luY2UgY3R5cGVzIG5vdyB0cmllcyBsb2FkaW5nIHRoZSBsaWIgYWdhaW4KKyMjICAgICMgd2l0aCAnLnNvJyBhcHBlbmRlZCBvZiB0aGUgZmlyc3QgdHJ5IGZhaWxzLgorIyMgICAgIworIyMgICAgIyBXb24ndCB3b3JrIGZvciBsaWJjLCB1bmZvcnR1bmF0ZWx5LiAgT1RPSCwgaXQgaXNuJ3QKKyMjICAgICMgbmVlZGVkIGZvciBsaWJjIHNpbmNlIHRoaXMgaXMgYWxyZWFkeSBtYXBwZWQgaW50byB0aGUgY3VycmVudAorIyMgICAgIyBwcm9jZXNzICg/KQorIyMgICAgIworIyMgICAgIyBPbiBNQUMgT1NYLCBpdCB3b24ndCB3b3JrIGVpdGhlciwgYmVjYXVzZSBkbG9wZW4oKSBuZWVkcyBhIGZ1bGwgcGF0aCwKKyMjICAgICMgYW5kIHRoZSBkZWZhdWx0IHN1ZmZpeCBpcyBlaXRoZXIgbm9uZSBvciAnLmR5bGliJy4KKworIyMgICAgY2xhc3MgTG9hZExpYnModW5pdHRlc3QuVGVzdENhc2UpOgorIyMgICAgICAgIGRlZiB0ZXN0X2xpYm0oc2VsZik6CisjIyAgICAgICAgICAgIGltcG9ydCBtYXRoCisjIyAgICAgICAgICAgIGxpYm0gPSBjZGxsLmxpYm0KKyMjICAgICAgICAgICAgc3FydCA9IGxpYm0uc3FydAorIyMgICAgICAgICAgICBzcXJ0LmFyZ3R5cGVzID0gKGNfZG91YmxlLCkKKyMjICAgICAgICAgICAgc3FydC5yZXN0eXBlID0gY19kb3VibGUKKyMjICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcXJ0KDIpLCBtYXRoLnNxcnQoMikpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwOGJiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcwOGJiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnJvbWJ1ZmZlci5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mcm9tYnVmZmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNGZiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnJvbWJ1ZmZlci5weQpAQCAtMCwwICsxLDgxIEBACitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IGFycmF5CitpbXBvcnQgZ2MKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJjX2ludCIsIGNfaW50KV0KKyAgICBpbml0X2NhbGxlZCA9IEZhbHNlCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9pbml0X2NhbGxlZCA9IFRydWUKKworY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZm9tX2J1ZmZlcihzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KCJpIiwgcmFuZ2UoMTYpKQorICAgICAgICB4ID0gKGNfaW50ICogMTYpLmZyb21fYnVmZmVyKGEpCisKKyAgICAgICAgeSA9IFguZnJvbV9idWZmZXIoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmNfaW50LCBhWzBdKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHkuaW5pdF9jYWxsZWQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzpdLCBhLnRvbGlzdCgpKQorCisgICAgICAgIGFbMF0sIGFbLTFdID0gMjAwLCAtMjAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFs6XSwgYS50b2xpc3QoKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpbiB4Ll9vYmplY3RzLnZhbHVlcygpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNfaW50LmZyb21fYnVmZmVyLCBhLCAtMSkKKworICAgICAgICBleHBlY3RlZCA9IHhbOl0KKyAgICAgICAgZGVsIGE7IGdjLmNvbGxlY3QoKTsgZ2MuY29sbGVjdCgpOyBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzpdLCBleHBlY3RlZCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjX2NoYXIgKiAxNikuZnJvbV9idWZmZXIsICJhIiAqIDE2KQorCisgICAgZGVmIHRlc3RfZm9tX2J1ZmZlcl93aXRoX29mZnNldChzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KCJpIiwgcmFuZ2UoMTYpKQorICAgICAgICB4ID0gKGNfaW50ICogMTUpLmZyb21fYnVmZmVyKGEsIHNpemVvZihjX2ludCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzpdLCBhLnRvbGlzdCgpWzE6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiAoY19pbnQgKiAxNikuZnJvbV9idWZmZXIoYSwgc2l6ZW9mKGNfaW50KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogKGNfaW50ICogMSkuZnJvbV9idWZmZXIoYSwgMTYgKiBzaXplb2YoY19pbnQpKSkKKworICAgIGRlZiB0ZXN0X2Zyb21fYnVmZmVyX2NvcHkoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheSgiaSIsIHJhbmdlKDE2KSkKKyAgICAgICAgeCA9IChjX2ludCAqIDE2KS5mcm9tX2J1ZmZlcl9jb3B5KGEpCisKKyAgICAgICAgeSA9IFguZnJvbV9idWZmZXJfY29weShhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuY19pbnQsIGFbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoeS5pbml0X2NhbGxlZCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbOl0sIHJhbmdlKDE2KSkKKworICAgICAgICBhWzBdLCBhWy0xXSA9IDIwMCwgLTIwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbOl0sIHJhbmdlKDE2KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIE5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY19pbnQuZnJvbV9idWZmZXIsIGEsIC0xKQorCisgICAgICAgIGRlbCBhOyBnYy5jb2xsZWN0KCk7IGdjLmNvbGxlY3QoKTsgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFs6XSwgcmFuZ2UoMTYpKQorCisgICAgICAgIHggPSAoY19jaGFyICogMTYpLmZyb21fYnVmZmVyX2NvcHkoImEiICogMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFs6XSwgImEiICogMTYpCisKKyAgICBkZWYgdGVzdF9mb21fYnVmZmVyX2NvcHlfd2l0aF9vZmZzZXQoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheSgiaSIsIHJhbmdlKDE2KSkKKyAgICAgICAgeCA9IChjX2ludCAqIDE1KS5mcm9tX2J1ZmZlcl9jb3B5KGEsIHNpemVvZihjX2ludCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzpdLCBhLnRvbGlzdCgpWzE6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNfaW50ICogMTYpLmZyb21fYnVmZmVyX2NvcHksIGEsIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjX2ludCAqIDEpLmZyb21fYnVmZmVyX2NvcHksIGEsIDE2ICogc2l6ZW9mKGNfaW50KSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mcm9tYnVmZmVyLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mcm9tYnVmZmVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzA3YjBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mcm9tYnVmZmVyLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mcm9tYnVmZmVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzA3YjBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhZjVlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5CkBAIC0wLDAgKzEsMTI3IEBACitpbXBvcnQgb3MsIHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCit0cnk6CisgICAgV0lORlVOQ1RZUEUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgIyBmYWtlIHRvIGVuYWJsZSB0aGlzIHRlc3Qgb24gTGludXgKKyAgICBXSU5GVU5DVFlQRSA9IENGVU5DVFlQRQorCitpbXBvcnQgX2N0eXBlc190ZXN0CitsaWIgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKworY2xhc3MgQ0Z1bmNQdHJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIFggPSBXSU5GVU5DVFlQRShjX2ludCwgY19pbnQsIGNfaW50KQorCisgICAgICAgIGRlZiBmdW5jKCphcmdzKToKKyAgICAgICAgICAgIHJldHVybiBsZW4oYXJncykKKworICAgICAgICB4ID0gWChmdW5jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgucmVzdHlwZSwgY19pbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5hcmd0eXBlcywgKGNfaW50LCBjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHgpLCBzaXplb2YoY192b2lkcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY192b2lkcCkpCisKKyAgICBkZWYgdGVzdF9maXJzdChzZWxmKToKKyAgICAgICAgU3RkQ2FsbGJhY2sgPSBXSU5GVU5DVFlQRShjX2ludCwgY19pbnQsIGNfaW50KQorICAgICAgICBDZGVjbENhbGxiYWNrID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQpCisKKyAgICAgICAgZGVmIGZ1bmMoYSwgYik6CisgICAgICAgICAgICByZXR1cm4gYSArIGIKKworICAgICAgICBzID0gU3RkQ2FsbGJhY2soZnVuYykKKyAgICAgICAgYyA9IENkZWNsQ2FsbGJhY2soZnVuYykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMoMSwgMiksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYygxLCAyKSwgMykKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIG5vIGxvbmdlciByYWlzZXMgYSBUeXBlRXJyb3IgLSBpdCBpcyBub3cKKyAgICAgICAgIyBwb3NzaWJsZSwgYXMgaW4gQywgdG8gY2FsbCBjZGVjbCBmdW5jdGlvbnMgd2l0aCBtb3JlIHBhcmFtZXRlcnMuCisgICAgICAgICNzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMsIDEsIDIsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYygxLCAyLCAzLCA0LCA1LCA2KSwgMykKKyAgICAgICAgaWYgbm90IFdJTkZVTkNUWVBFIGlzIENGVU5DVFlQRSBhbmQgb3MubmFtZSAhPSAiY2UiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzLCAxLCAyLCAzKQorCisgICAgZGVmIHRlc3Rfc3RydWN0dXJlcyhzZWxmKToKKyAgICAgICAgV05EUFJPQyA9IFdJTkZVTkNUWVBFKGNfbG9uZywgY19pbnQsIGNfaW50LCBjX2ludCwgY19pbnQpCisKKyAgICAgICAgZGVmIHduZHByb2MoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk6CisgICAgICAgICAgICByZXR1cm4gaHduZCArIG1zZyArIHdQYXJhbSArIGxQYXJhbQorCisgICAgICAgIEhJTlNUQU5DRSA9IGNfaW50CisgICAgICAgIEhJQ09OID0gY19pbnQKKyAgICAgICAgSENVUlNPUiA9IGNfaW50CisgICAgICAgIExQQ1RTVFIgPSBjX2NoYXJfcAorCisgICAgICAgIGNsYXNzIFdORENMQVNTKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoInN0eWxlIiwgY191aW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgibHBmblduZFByb2MiLCBXTkRQUk9DKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiY2JDbHNFeHRyYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiY2JXbmRFeHRyYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaEluc3RhbmNlIiwgSElOU1RBTkNFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaEljb24iLCBISUNPTiksCisgICAgICAgICAgICAgICAgICAgICAgICAoImhDdXJzb3IiLCBIQ1VSU09SKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgibHBzek1lbnVOYW1lIiwgTFBDVFNUUiksCisgICAgICAgICAgICAgICAgICAgICAgICAoImxwc3pDbGFzc05hbWUiLCBMUENUU1RSKV0KKworICAgICAgICB3bmRjbGFzcyA9IFdORENMQVNTKCkKKyAgICAgICAgd25kY2xhc3MubHBmblduZFByb2MgPSBXTkRQUk9DKHduZHByb2MpCisKKyAgICAgICAgV05EUFJPQ18yID0gV0lORlVOQ1RZUEUoY19sb25nLCBjX2ludCwgY19pbnQsIGNfaW50LCBjX2ludCkKKworICAgICAgICAjIFRoaXMgaXMgbm8gbG9uZ2VyIHRydWUsIG5vdyB0aGF0IFdJTkZVTkNUWVBFIGNhY2hlcyBjcmVhdGVkIHR5cGVzIGludGVybmFsbHkuCisgICAgICAgICMjICMgQ0Z1bmNQdHIgc3ViY2xhc3NlcyBhcmUgY29tcGFyZWQgYnkgaWRlbnRpdHksIHNvIHRoaXMgcmFpc2VzIGEgVHlwZUVycm9yOgorICAgICAgICAjIyBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHduZGNsYXNzLAorICAgICAgICAjIyAgICAgICAgICAgICAgICAgICJscGZuV25kUHJvYyIsIFdORFBST0NfMih3bmRwcm9jKSkKKyAgICAgICAgIyBpbnN0ZWFkOgorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShXTkRQUk9DIGlzIFdORFBST0NfMikKKyAgICAgICAgIyAnd25kY2xhc3MubHBmblduZFByb2MnIGxlYWtzIDk0IHJlZmVyZW5jZXMuICBXaHk/CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod25kY2xhc3MubHBmblduZFByb2MoMSwgMiwgMywgNCksIDEwKQorCisKKyAgICAgICAgZiA9IHduZGNsYXNzLmxwZm5XbmRQcm9jCisKKyAgICAgICAgZGVsIHduZGNsYXNzCisgICAgICAgIGRlbCB3bmRwcm9jCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKDEwLCAxMSwgMTIsIDEzKSwgNDYpCisKKyAgICBkZWYgdGVzdF9kbGxmdW5jdGlvbnMoc2VsZik6CisKKyAgICAgICAgZGVmIE5vTnVsbEhhbmRsZSh2YWx1ZSk6CisgICAgICAgICAgICBpZiBub3QgdmFsdWU6CisgICAgICAgICAgICAgICAgcmFpc2UgV2luRXJyb3IoKQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICAgICAgc3RyY2hyID0gbGliLm15X3N0cmNocgorICAgICAgICBzdHJjaHIucmVzdHlwZSA9IGNfY2hhcl9wCisgICAgICAgIHN0cmNoci5hcmd0eXBlcyA9IChjX2NoYXJfcCwgY19jaGFyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocigiYWJjZGVmZ2hpIiwgImIiKSwgImJjZGVmZ2hpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoImFiY2RlZmdoaSIsICJ4IiksIE5vbmUpCisKKworICAgICAgICBzdHJ0b2sgPSBsaWIubXlfc3RydG9rCisgICAgICAgIHN0cnRvay5yZXN0eXBlID0gY19jaGFyX3AKKyAgICAgICAgIyBOZWl0aGVyIG9mIHRoaXMgZG9lcyB3b3JrOiBzdHJ0b2sgY2hhbmdlcyB0aGUgYnVmZmVyIGl0IGlzIHBhc3NlZAorIyMgICAgICAgIHN0cnRvay5hcmd0eXBlcyA9IChjX2NoYXJfcCwgY19jaGFyX3ApCisjIyAgICAgICAgc3RydG9rLmFyZ3R5cGVzID0gKGNfc3RyaW5nLCBjX2NoYXJfcCkKKworICAgICAgICBkZWYgY19zdHJpbmcoaW5pdCk6CisgICAgICAgICAgICBzaXplID0gbGVuKGluaXQpICsgMQorICAgICAgICAgICAgcmV0dXJuIChjX2NoYXIqc2l6ZSkoKmluaXQpCisKKyAgICAgICAgcyA9ICJhXG5iXG5jIgorICAgICAgICBiID0gY19zdHJpbmcocykKKworIyMgICAgICAgIGIgPSAoY19jaGFyICogKGxlbihzKSsxKSkoKQorIyMgICAgICAgIGIudmFsdWUgPSBzCisKKyMjICAgICAgICBiID0gY19zdHJpbmcocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJ0b2soYiwgIlxuIiksICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJ0b2soTm9uZSwgIlxuIiksICJiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJ0b2soTm9uZSwgIlxuIiksICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJ0b2soTm9uZSwgIlxuIiksIE5vbmUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3B0ci5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3B0ci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyYmUzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3B0ci5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3B0ci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYyYmUzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Z1bmN0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2JkM2VjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Z1bmN0aW9ucy5weQpAQCAtMCwwICsxLDQxMiBAQAorIiIiCitIZXJlIGlzIHByb2JhYmx5IHRoZSBwbGFjZSB0byB3cml0ZSB0aGUgZG9jcywgc2luY2UgdGhlIHRlc3QtY2FzZXMKK3Nob3cgaG93IHRoZSB0eXBlIGJlaGF2ZS4KKworTGF0ZXIuLi4KKyIiIgorCitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IHN5cywgdW5pdHRlc3QKKwordHJ5OgorICAgIFdJTkZVTkNUWVBFCitleGNlcHQgTmFtZUVycm9yOgorICAgICMgZmFrZSB0byBlbmFibGUgdGhpcyB0ZXN0IG9uIExpbnV4CisgICAgV0lORlVOQ1RZUEUgPSBDRlVOQ1RZUEUKKworaW1wb3J0IF9jdHlwZXNfdGVzdAorZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCitpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICB3aW5kbGwgPSBXaW5ETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorCitjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwgKCJ5IiwgY19pbnQpXQorY2xhc3MgUkVDVChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygibGVmdCIsIGNfaW50KSwgKCJ0b3AiLCBjX2ludCksCisgICAgICAgICAgICAgICAgKCJyaWdodCIsIGNfaW50KSwgKCJib3R0b20iLCBjX2ludCldCitjbGFzcyBGdW5jdGlvblRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X21ybyhzZWxmKToKKyAgICAgICAgIyBpbiBQeXRob24gMi4zLCB0aGlzIHJhaXNlcyBUeXBlRXJyb3I6IE1STyBjb25mbGljdCBhbW9uZyBiYXNlcyBjbGFzc2VzLAorICAgICAgICAjIGluIFB5dGhvbiAyLjIgaXQgd29ya3MuCisgICAgICAgICMKKyAgICAgICAgIyBCdXQgaW4gZWFybHkgdmVyc2lvbnMgb2YgX2N0eXBlcy5jLCB0aGUgcmVzdWx0IG9mIHRwX25ldworICAgICAgICAjIHdhc24ndCBjaGVja2VkLCBhbmQgaXQgZXZlbiBjcmFzaGVkIFB5dGhvbi4KKyAgICAgICAgIyBGb3VuZCBieSBHcmVnIENoYXBtYW4uCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgWChvYmplY3QsIEFycmF5KToKKyAgICAgICAgICAgICAgICBfbGVuZ3RoXyA9IDUKKyAgICAgICAgICAgICAgICBfdHlwZV8gPSAiaSIKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworCisgICAgICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgX1BvaW50ZXIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgWChvYmplY3QsIF9Qb2ludGVyKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBfU2ltcGxlQ0RhdGEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgWChvYmplY3QsIF9TaW1wbGVDRGF0YSk6CisgICAgICAgICAgICAgICAgX3R5cGVfID0gImkiCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgWChvYmplY3QsIFN0cnVjdHVyZSk6CisgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbXQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisKKyAgICBkZWYgdGVzdF93Y2hhcl9wYXJtKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjX3djaGFyCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfaV9iaGlsZmQKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfd2NoYXIsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQorICAgICAgICByZXN1bHQgPSBmKDEsIHUieCIsIDMsIDQsIDUuMCwgNi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMTM5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgaW50KQorCisgICAgZGVmIHRlc3Rfd2NoYXJfcmVzdWx0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjX3djaGFyCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfaV9iaGlsZmQKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQorICAgICAgICBmLnJlc3R5cGUgPSBjX3djaGFyCisgICAgICAgIHJlc3VsdCA9IGYoMCwgMCwgMCwgMCwgMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHUnXHgwMCcpCisKKyAgICBkZWYgdGVzdF92b2lkcmVzdWx0KHNlbGYpOgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY192CisgICAgICAgIGYucmVzdHlwZSA9IE5vbmUKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2ludCwgY19pbnQsIFBPSU5URVIoY19pbnQpXQorICAgICAgICByZXN1bHQgPSBjX2ludCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZigxLCAyLCBieXJlZihyZXN1bHQpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudmFsdWUsIDMpCisKKyAgICBkZWYgdGVzdF9pbnRyZXN1bHQoc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2lfYmhpbGZkCisgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KKyAgICAgICAgZi5yZXN0eXBlID0gY19pbnQKKyAgICAgICAgcmVzdWx0ID0gZigxLCAyLCAzLCA0LCA1LjAsIDYuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgaW50KQorCisgICAgICAgIHJlc3VsdCA9IGYoLTEsIC0yLCAtMywgLTQsIC01LjAsIC02LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCisKKyAgICAgICAgIyBJZiB3ZSBkZWNsYXJlIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gYSBzaG9ydCwKKyAgICAgICAgIyBpcyB0aGUgaGlnaCBwYXJ0IHNwbGl0IG9mZj8KKyAgICAgICAgZi5yZXN0eXBlID0gY19zaG9ydAorICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCisKKyAgICAgICAgcmVzdWx0ID0gZigxLCAyLCAzLCAweDEwMDA0LCA1LjAsIDYuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgaW50KQorCisgICAgICAgICMgWW91IGNhbm5vdCBhc3NpZ24gY2hhcmFjdGVyIGZvcm1hdCBjb2RlcyBhcyByZXN0eXBlIGFueSBsb25nZXIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBmLCAicmVzdHlwZSIsICJpIikKKworICAgIGRlZiB0ZXN0X2Zsb2F0cmVzdWx0KHNlbGYpOgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19mX2JoaWxmZAorICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCisgICAgICAgIGYucmVzdHlwZSA9IGNfZmxvYXQKKyAgICAgICAgcmVzdWx0ID0gZigxLCAyLCAzLCA0LCA1LjAsIDYuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCisKKyAgICAgICAgcmVzdWx0ID0gZigtMSwgLTIsIC0zLCAtNCwgLTUuMCwgLTYuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0yMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQorCisgICAgZGVmIHRlc3RfZG91YmxlcmVzdWx0KHNlbGYpOgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19kX2JoaWxmZAorICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCisgICAgICAgIGYucmVzdHlwZSA9IGNfZG91YmxlCisgICAgICAgIHJlc3VsdCA9IGYoMSwgMiwgMywgNCwgNS4wLCA2LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQorCisgICAgICAgIHJlc3VsdCA9IGYoLTEsIC0yLCAtMywgLTQsIC01LjAsIC02LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKKworICAgIGRlZiB0ZXN0X2xvbmdkb3VibGVyZXN1bHQoc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX0RfYmhpbGZECisgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2xvbmdkb3VibGVdCisgICAgICAgIGYucmVzdHlwZSA9IGNfbG9uZ2RvdWJsZQorICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKKworICAgICAgICByZXN1bHQgPSBmKC0xLCAtMiwgLTMsIC00LCAtNS4wLCAtNi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCisKKyAgICBkZWYgdGVzdF9sb25nbG9uZ3Jlc3VsdChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY19sb25nbG9uZworICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX3FfYmhpbGZkCisgICAgICAgIGYucmVzdHlwZSA9IGNfbG9uZ2xvbmcKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQorICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMjEpCisKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfcV9iaGlsZmRxCisgICAgICAgIGYucmVzdHlwZSA9IGNfbG9uZ2xvbmcKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlLCBjX2xvbmdsb25nXQorICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wLCAyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDQyKQorCisgICAgZGVmIHRlc3Rfc3RyaW5ncmVzdWx0KHNlbGYpOgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZi5hcmd0eXBlcyA9IE5vbmUKKyAgICAgICAgZi5yZXN0eXBlID0gY19jaGFyX3AKKyAgICAgICAgcmVzdWx0ID0gZigiMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsICIxMjMiKQorCisgICAgICAgIHJlc3VsdCA9IGYoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9wb2ludGVycyhzZWxmKToKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfcF9wCisgICAgICAgIGYucmVzdHlwZSA9IFBPSU5URVIoY19pbnQpCisgICAgICAgIGYuYXJndHlwZXMgPSBbUE9JTlRFUihjX2ludCldCisKKyAgICAgICAgIyBUaGlzIG9ubHkgd29ya3MgaWYgdGhlIHZhbHVlIGNfaW50KDQyKSBwYXNzZWQgdG8gdGhlCisgICAgICAgICMgZnVuY3Rpb24gaXMgc3RpbGwgYWxpdmUgd2hpbGUgdGhlIHBvaW50ZXIgKHRoZSByZXN1bHQpIGlzCisgICAgICAgICMgdXNlZC4KKworICAgICAgICB2ID0gY19pbnQoNDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb2ludGVyKHYpLmNvbnRlbnRzLnZhbHVlLCA0MikKKyAgICAgICAgcmVzdWx0ID0gZihwb2ludGVyKHYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgUE9JTlRFUihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvbnRlbnRzLnZhbHVlLCA0MikKKworICAgICAgICAjIFRoaXMgb24gd29ya3MuLi4KKyAgICAgICAgcmVzdWx0ID0gZihwb2ludGVyKHYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgdi52YWx1ZSkKKworICAgICAgICBwID0gcG9pbnRlcihjX2ludCg5OSkpCisgICAgICAgIHJlc3VsdCA9IGYocCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIDk5KQorCisgICAgICAgIGFyZyA9IGJ5cmVmKHYpCisgICAgICAgIHJlc3VsdCA9IGYoYXJnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlc3VsdC5jb250ZW50cywgdi52YWx1ZSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBmLCBieXJlZihjX3Nob3J0KDIyKSkpCisKKyAgICAgICAgIyBJdCBpcyBkYW5nZXJvdXMsIGhvd2V2ZXIsIGJlY2F1c2UgeW91IGRvbid0IGNvbnRyb2wgdGhlIGxpZmV0aW1lCisgICAgICAgICMgb2YgdGhlIHBvaW50ZXI6CisgICAgICAgIHJlc3VsdCA9IGYoYnlyZWYoY19pbnQoOTkpKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZXN1bHQuY29udGVudHMsIDk5KQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZi5yZXN0eXBlID0gY19pbnQKKworICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoInkiLCBjX2ludCldCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCBYKCkpICNjYW5ub3QgY29udmVydCBwYXJhbWV0ZXIKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICBkZWYgdGVzdF9zaG9ydHMoc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2NhbGxiYWNrX2lfaWYKKworICAgICAgICBhcmdzID0gW10KKyAgICAgICAgZXhwZWN0ZWQgPSBbMjYyMTQ0LCAxMzEwNzIsIDY1NTM2LCAzMjc2OCwgMTYzODQsIDgxOTIsIDQwOTYsIDIwNDgsCisgICAgICAgICAgICAgICAgICAgIDEwMjQsIDUxMiwgMjU2LCAxMjgsIDY0LCAzMiwgMTYsIDgsIDQsIDIsIDFdCisKKyAgICAgICAgZGVmIGNhbGxiYWNrKHYpOgorICAgICAgICAgICAgYXJncy5hcHBlbmQodikKKyAgICAgICAgICAgIHJldHVybiB2CisKKyAgICAgICAgQ2FsbEJhY2sgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KQorCisgICAgICAgIGNiID0gQ2FsbEJhY2soY2FsbGJhY2spCisgICAgICAgIGYoMioqMTgsIGNiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIGV4cGVjdGVkKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja3Moc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2NhbGxiYWNrX2lfaWYKKyAgICAgICAgZi5yZXN0eXBlID0gY19pbnQKKyAgICAgICAgZi5hcmd0eXBlcyA9IE5vbmUKKworICAgICAgICBNeUNhbGxiYWNrID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCkKKworICAgICAgICBkZWYgY2FsbGJhY2sodmFsdWUpOgorICAgICAgICAgICAgI3ByaW50ICJjYWxsZWQgYmFjayB3aXRoIiwgdmFsdWUKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKKyAgICAgICAgcmVzdWx0ID0gZigtMTAsIGNiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQorCisgICAgICAgICMgdGVzdCB3aXRoIHByb3RvdHlwZQorICAgICAgICBmLmFyZ3R5cGVzID0gW2NfaW50LCBNeUNhbGxiYWNrXQorICAgICAgICBjYiA9IE15Q2FsbGJhY2soY2FsbGJhY2spCisgICAgICAgIHJlc3VsdCA9IGYoLTEwLCBjYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0xOCkKKworICAgICAgICBBbm90aGVyQ2FsbGJhY2sgPSBXSU5GVU5DVFlQRShjX2ludCwgY19pbnQsIGNfaW50LCBjX2ludCwgY19pbnQpCisKKyAgICAgICAgIyBjaGVjayB0aGF0IHRoZSBwcm90b3R5cGUgd29ya3M6IHdlIGNhbGwgZiB3aXRoIHdyb25nCisgICAgICAgICMgYXJndW1lbnQgdHlwZXMKKyAgICAgICAgY2IgPSBBbm90aGVyQ2FsbGJhY2soY2FsbGJhY2spCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIGYsIC0xMCwgY2IpCisKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrc18yKHNlbGYpOgorICAgICAgICAjIENhbiBhbHNvIHVzZSBzaW1wbGUgZGF0YXR5cGVzIGFzIGFyZ3VtZW50IHR5cGUgc3BlY2lmaWVycworICAgICAgICAjIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgICAgICMgSW4gdGhpcyBjYXNlIHRoZSBjYWxsIHJlY2VpdmVzIGFuIGluc3RhbmNlIG9mIHRoYXQgdHlwZQorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19jYWxsYmFja19pX2lmCisgICAgICAgIGYucmVzdHlwZSA9IGNfaW50CisKKyAgICAgICAgTXlDYWxsYmFjayA9IENGVU5DVFlQRShjX2ludCwgY19pbnQpCisKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2ludCwgTXlDYWxsYmFja10KKworICAgICAgICBkZWYgY2FsbGJhY2sodmFsdWUpOgorICAgICAgICAgICAgI3ByaW50ICJjYWxsZWQgYmFjayB3aXRoIiwgdmFsdWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWx1ZSksIGludCkKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKKyAgICAgICAgcmVzdWx0ID0gZigtMTAsIGNiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQorCisgICAgZGVmIHRlc3RfbG9uZ2xvbmdfY2FsbGJhY2tzKHNlbGYpOgorCisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2NhbGxiYWNrX3FfcWYKKyAgICAgICAgZi5yZXN0eXBlID0gY19sb25nbG9uZworCisgICAgICAgIE15Q2FsbGJhY2sgPSBDRlVOQ1RZUEUoY19sb25nbG9uZywgY19sb25nbG9uZykKKworICAgICAgICBmLmFyZ3R5cGVzID0gW2NfbG9uZ2xvbmcsIE15Q2FsbGJhY2tdCisKKyAgICAgICAgZGVmIGNhbGxiYWNrKHZhbHVlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZhbHVlLCAoaW50LCBsb25nKSkpCisgICAgICAgICAgICByZXR1cm4gdmFsdWUgJiAweDdGRkZGRkZGCisKKyAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTM1Nzc2MjU1ODcsIGYoMTAwMDAwMDAwMDAwMCwgY2IpKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZ2V0YXR0ciwgZGxsLCAiX3h4eF95eXkiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX2ludC5pbl9kbGwsIGRsbCwgIl94eHhfeXl5IikKKworICAgIGRlZiB0ZXN0X2J5dmFsKHNlbGYpOgorCisgICAgICAgICMgd2l0aG91dCBwcm90b3R5cGUKKyAgICAgICAgcHRpbiA9IFBPSU5UKDEsIDIpCisgICAgICAgIHB0b3V0ID0gUE9JTlQoKQorICAgICAgICAjIEVYUE9SVCBpbnQgX3Rlc3RmdW5jX2J5dmFsKHBvaW50IGluLCBwb2ludCAqcG91dCkKKyAgICAgICAgcmVzdWx0ID0gZGxsLl90ZXN0ZnVuY19ieXZhbChwdGluLCBieXJlZihwdG91dCkpCisgICAgICAgIGdvdCA9IHJlc3VsdCwgcHRvdXQueCwgcHRvdXQueQorICAgICAgICBleHBlY3RlZCA9IDMsIDEsIDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQorCisgICAgICAgICMgd2l0aCBwcm90b3R5cGUKKyAgICAgICAgcHRpbiA9IFBPSU5UKDEwMSwgMTAyKQorICAgICAgICBwdG91dCA9IFBPSU5UKCkKKyAgICAgICAgZGxsLl90ZXN0ZnVuY19ieXZhbC5hcmd0eXBlcyA9IChQT0lOVCwgUE9JTlRFUihQT0lOVCkpCisgICAgICAgIGRsbC5fdGVzdGZ1bmNfYnl2YWwucmVzdHlwZSA9IGNfaW50CisgICAgICAgIHJlc3VsdCA9IGRsbC5fdGVzdGZ1bmNfYnl2YWwocHRpbiwgYnlyZWYocHRvdXQpKQorICAgICAgICBnb3QgPSByZXN1bHQsIHB0b3V0LngsIHB0b3V0LnkKKyAgICAgICAgZXhwZWN0ZWQgPSAyMDMsIDEwMSwgMTAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fMkgoc2VsZik6CisgICAgICAgIGNsYXNzIFMySChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19zaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCBjX3Nob3J0KV0KKyAgICAgICAgZGxsLnJldF8yaF9mdW5jLnJlc3R5cGUgPSBTMkgKKyAgICAgICAgZGxsLnJldF8yaF9mdW5jLmFyZ3R5cGVzID0gW1MySF0KKyAgICAgICAgaW5wID0gUzJIKDk5LCA4OCkKKyAgICAgICAgczJoID0gZGxsLnJldF8yaF9mdW5jKGlucCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczJoLngsIHMyaC55KSwgKDk5KjIsIDg4KjMpKQorCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fMkhfc3RkY2FsbChzZWxmKToKKyAgICAgICAgICAgIGNsYXNzIFMySChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfc2hvcnQpXQorCisgICAgICAgICAgICB3aW5kbGwuc19yZXRfMmhfZnVuYy5yZXN0eXBlID0gUzJICisgICAgICAgICAgICB3aW5kbGwuc19yZXRfMmhfZnVuYy5hcmd0eXBlcyA9IFtTMkhdCisgICAgICAgICAgICBzMmggPSB3aW5kbGwuc19yZXRfMmhfZnVuYyhTMkgoOTksIDg4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHMyaC54LCBzMmgueSksICg5OSoyLCA4OCozKSkKKworICAgICMgVGhpcyBpcyBrbm93biBjZGVjbCBpbmNvbXBhdGliaWxpdHkgYmV0d2VlbiBHQ0MKKyAgICAjIGFuZCBNU1ZDLiBJdCBpcyBhZGRyZXNzZWQgaW4gR0NDIGlzc3VlICMzNjgzNC4KKyAgICAjIFB5dGhvbiBsaWJmZmkgZGV0ZWN0IGl0IGFuZCBjb21wbGFpbi4KKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiIGFuZCBzeXMudmVyc2lvbi5maW5kKCJHQ0MiKSA+PSAwLCAnWEZBSUwgR0NDKG1pbmd3KScpCisgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl84SChzZWxmKToKKyAgICAgICAgY2xhc3MgUzhJKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImQiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImUiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImYiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImciLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCBjX2ludCldCisgICAgICAgIGRsbC5yZXRfOGlfZnVuYy5yZXN0eXBlID0gUzhJCisgICAgICAgIGRsbC5yZXRfOGlfZnVuYy5hcmd0eXBlcyA9IFtTOEldCisgICAgICAgIGlucCA9IFM4SSg5LCA4LCA3LCA2LCA1LCA0LCAzLCAyKQorICAgICAgICBzOGkgPSBkbGwucmV0XzhpX2Z1bmMoaW5wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOSoyLCA4KjMsIDcqNCwgNio1LCA1KjYsIDQqNywgMyo4LCAyKjkpKQorCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fOEhfc3RkY2FsbChzZWxmKToKKyAgICAgICAgICAgIGNsYXNzIFM4SShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImUiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJmIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZyIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCBjX2ludCldCisgICAgICAgICAgICB3aW5kbGwuc19yZXRfOGlfZnVuYy5yZXN0eXBlID0gUzhJCisgICAgICAgICAgICB3aW5kbGwuc19yZXRfOGlfZnVuYy5hcmd0eXBlcyA9IFtTOEldCisgICAgICAgICAgICBpbnAgPSBTOEkoOSwgOCwgNywgNiwgNSwgNCwgMywgMikKKyAgICAgICAgICAgIHM4aSA9IHdpbmRsbC5zX3JldF84aV9mdW5jKGlucCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHM4aS5hLCBzOGkuYiwgczhpLmMsIHM4aS5kLCBzOGkuZSwgczhpLmYsIHM4aS5nLCBzOGkuaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOSoyLCA4KjMsIDcqNCwgNio1LCA1KjYsIDQqNywgMyo4LCAyKjkpKQorCisgICAgZGVmIHRlc3Rfc2YxNjUxMjM1KHNlbGYpOgorICAgICAgICAjIHNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvMTY1MTIzNQorCisgICAgICAgIHByb3RvID0gQ0ZVTkNUWVBFKGNfaW50LCBSRUNULCBQT0lOVCkKKyAgICAgICAgZGVmIGNhbGxiYWNrKCphcmdzKToKKyAgICAgICAgICAgIHJldHVybiAwCisKKyAgICAgICAgY2FsbGJhY2sgPSBwcm90byhjYWxsYmFjaykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgbGFtYmRhOiBjYWxsYmFjaygoMSwgMiwgMywgNCksIFBPSU5UKCkpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Z1bmN0aW9ucy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmI1MTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Z1bmN0aW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Z1bmN0aW9ucy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmI1MTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Z1bmN0aW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2luY29tcGxldGUucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW5jb21wbGV0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTAzZTlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2luY29tcGxldGUucHkKQEAgLTAsMCArMSw0MiBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRoZSBpbmNvbXBsZXRlIHBvaW50ZXIgZXhhbXBsZSBmcm9tIHRoZSB0dXRvcmlhbAorIworCitjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2luY29tcGxldGVfZXhhbXBsZShzZWxmKToKKyAgICAgICAgbHBjZWxsID0gUE9JTlRFUigiY2VsbCIpCisgICAgICAgIGNsYXNzIGNlbGwoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygibmFtZSIsIGNfY2hhcl9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgibmV4dCIsIGxwY2VsbCldCisKKyAgICAgICAgU2V0UG9pbnRlclR5cGUobHBjZWxsLCBjZWxsKQorCisgICAgICAgIGMxID0gY2VsbCgpCisgICAgICAgIGMxLm5hbWUgPSAiZm9vIgorICAgICAgICBjMiA9IGNlbGwoKQorICAgICAgICBjMi5uYW1lID0gImJhciIKKworICAgICAgICBjMS5uZXh0ID0gcG9pbnRlcihjMikKKyAgICAgICAgYzIubmV4dCA9IHBvaW50ZXIoYzEpCisKKyAgICAgICAgcCA9IGMxCisKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOCk6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHAubmFtZSkKKyAgICAgICAgICAgIHAgPSBwLm5leHRbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFsiZm9vIiwgImJhciJdICogNCkKKworICAgICAgICAjIHRvIG5vdCBsZWFrIHJlZmVyZW5jZXMsIHdlIG11c3QgY2xlYW4gX3BvaW50ZXJfdHlwZV9jYWNoZQorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgX3BvaW50ZXJfdHlwZV9jYWNoZQorICAgICAgICBkZWwgX3BvaW50ZXJfdHlwZV9jYWNoZVtjZWxsXQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW5jb21wbGV0ZS5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW5jb21wbGV0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkMGI1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbmNvbXBsZXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW5jb21wbGV0ZS5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW5jb21wbGV0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkMGI1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbmNvbXBsZXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW5pdC5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbml0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYmQxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW5pdC5weQpAQCAtMCwwICsxLDQwIEBACitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFgoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksCisgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQpXQorICAgIG5ld193YXNfY2FsbGVkID0gRmFsc2UKKworICAgIGRlZiBfX25ld19fKGNscyk6CisgICAgICAgIHJlc3VsdCA9IHN1cGVyKFgsIGNscykuX19uZXdfXyhjbHMpCisgICAgICAgIHJlc3VsdC5uZXdfd2FzX2NhbGxlZCA9IFRydWUKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmEgPSA5CisgICAgICAgIHNlbGYuYiA9IDEyCisKK2NsYXNzIFkoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoIngiLCBYKV0KKworCitjbGFzcyBJbml0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgb25seSBhY2Nlc3NpbmcgYSBuZXN0ZWQgc3RydWN0dXJlCisgICAgICAgICMgZG9lc24ndCBjYWxsIHRoZSBzdHJ1Y3R1cmUncyBfX25ld19fIGFuZCBfX2luaXRfXworICAgICAgICB5ID0gWSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHkueC5hLCB5LnguYiksICgwLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LngubmV3X3dhc19jYWxsZWQsIEZhbHNlKQorCisgICAgICAgICMgQnV0IGV4cGxpY2l0bHkgY3JlYXRpbmcgYW4gWCBzdHJ1Y3R1cmUgY2FsbHMgX19uZXdfXyBhbmQgX19pbml0X18sIG9mIGNvdXJzZS4KKyAgICAgICAgeCA9IFgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4LmEsIHguYiksICg5LCAxMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5uZXdfd2FzX2NhbGxlZCwgVHJ1ZSkKKworICAgICAgICB5LnggPSB4CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHkueC5hLCB5LnguYiksICg5LCAxMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS54Lm5ld193YXNfY2FsbGVkLCBGYWxzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbml0LnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbml0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWE3N2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbml0LnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbml0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWE3N2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlZ2Vycy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlZ2Vycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjY0NTNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVnZXJzLnB5CkBAIC0wLDAgKzEsNSBAQAorIyBzdXBlcnNlZWRlZCBieSB0ZXN0X251bWJlcnMucHkKK2ltcG9ydCB1bml0dGVzdAorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVnZXJzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlZ2Vycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjMmE3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlZ2Vycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVnZXJzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlZ2Vycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjMmE3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlZ2Vycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVybmFscy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlcm5hbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1YjFmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlcm5hbHMucHkKQEAgLTAsMCArMSwxMDMgQEAKKyMgVGhpcyB0ZXN0cyB0aGUgaW50ZXJuYWwgX29iamVjdHMgYXR0cmlidXRlCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitmcm9tIHN5cyBpbXBvcnQgZ2V0cmVmY291bnQgYXMgZ3JjCisKKyMgWFhYIFRoaXMgdGVzdCBtdXN0IGJlIHJldmlld2VkIGZvciBjb3JyZWN0bmVzcyEhIQorCisiIiIKK2N0eXBlcycgdHlwZXMgYXJlIGNvbnRhaW5lciB0eXBlcy4KKworVGhleSBoYXZlIGFuIGludGVybmFsIG1lbW9yeSBibG9jaywgd2hpY2ggb25seSBjb25zaXN0cyBvZiBzb21lIGJ5dGVzLAorYnV0IGl0IGhhcyB0byBrZWVwIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0cyBhcyB3ZWxsLiBUaGlzIGlzIG5vdAorcmVhbGx5IG5lZWRlZCBmb3IgdHJpdmlhbCBDIHR5cGVzIGxpa2UgaW50IG9yIGNoYXIsIGJ1dCBpdCBpcyBpbXBvcnRhbnQKK2ZvciBhZ2dyZWdhdGUgdHlwZXMgbGlrZSBzdHJpbmdzIG9yIHBvaW50ZXJzIGluIHBhcnRpY3VsYXIuCisKK1doYXQgYWJvdXQgcG9pbnRlcnM/CisKKyIiIgorCitjbGFzcyBPYmplY3RzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBhc3NlcnRTYW1lKHNlbGYsIGEsIGIpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGEpLCBpZChiKSkKKworICAgIGRlZiB0ZXN0X2ludHMoc2VsZik6CisgICAgICAgIGkgPSA0MjAwMDEyMworICAgICAgICByZWZjbnQgPSBncmMoaSkKKyAgICAgICAgY2kgPSBjX2ludChpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZmNudCwgZ3JjKGkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNpLl9vYmplY3RzLCBOb25lKQorCisgICAgZGVmIHRlc3RfY19jaGFyX3Aoc2VsZik6CisgICAgICAgIHMgPSAiSGVsbG8sIFdvcmxkIgorICAgICAgICByZWZjbnQgPSBncmMocykKKyAgICAgICAgY3MgPSBjX2NoYXJfcChzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZmNudCArIDEsIGdyYyhzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRTYW1lKGNzLl9vYmplY3RzLCBzKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX3N0cnVjdChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpLCAoImIiLCBjX2ludCldCisKKyAgICAgICAgYSA9IDQyMTIzNAorICAgICAgICBiID0gNDIxMjM1CisgICAgICAgIHggPSBYKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICB4LmEgPSBhCisgICAgICAgIHguYiA9IGIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorCisgICAgZGVmIHRlc3RfZW1iZWRkZWRfc3RydWN0cyhzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpLCAoImIiLCBjX2ludCldCisKKyAgICAgICAgY2xhc3MgWShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgWCksICgieSIsIFgpXQorCisgICAgICAgIHkgPSBZKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9vYmplY3RzLCBOb25lKQorCisgICAgICAgIHgxLCB4MiA9IFgoKSwgWCgpCisgICAgICAgIHkueCwgeS55ID0geDEsIHgyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fb2JqZWN0cywgeyIwIjoge30sICIxIjoge319KQorICAgICAgICB4MS5hLCB4Mi5iID0gNDIsIDkzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fb2JqZWN0cywgeyIwIjoge30sICIxIjoge319KQorCisgICAgZGVmIHRlc3RfeHh4KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2NoYXJfcCksICgiYiIsIGNfY2hhcl9wKV0KKworICAgICAgICBjbGFzcyBZKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBYKSwgKCJ5IiwgWCldCisKKyAgICAgICAgczEgPSAiSGVsbG8sIFdvcmxkIgorICAgICAgICBzMiA9ICJIYWxsbywgV2VsdCIKKworICAgICAgICB4ID0gWCgpCisgICAgICAgIHguYSA9IHMxCisgICAgICAgIHguYiA9IHMyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgeyIwIjogczEsICIxIjogczJ9KQorCisgICAgICAgIHkgPSBZKCkKKyAgICAgICAgeS54ID0geAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuX29iamVjdHMsIHsiMCI6IHsiMCI6IHMxLCAiMSI6IHMyfX0pCisjIyAgICAgICAgeCA9IHkueAorIyMgICAgICAgIGRlbCB5CisjIyAgICAgICAgcHJpbnQgeC5fYl9iYXNlXy5fb2JqZWN0cworCisgICAgZGVmIHRlc3RfcHRyX3N0cnVjdChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJkYXRhIiwgUE9JTlRFUihjX2ludCkpXQorCisgICAgICAgIEEgPSBjX2ludCo0CisgICAgICAgIGEgPSBBKDExLCAyMiwgMzMsIDQ0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX29iamVjdHMsIE5vbmUpCisKKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4LmRhdGEgPSBhCisjI1hYWCAgICAgICAgcHJpbnQgeC5fb2JqZWN0cworIyNYWFggICAgICAgIHByaW50IHguZGF0YVswXQorIyNYWFggICAgICAgIHByaW50IHguZGF0YS5fb2JqZWN0cworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVybmFscy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZXJuYWxzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTcxYzgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVybmFscy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVybmFscy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZXJuYWxzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTcxYzgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVybmFscy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MDRjMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKQEAgLTAsMCArMSwxNTIgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgU2ltcGxlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NpbnQoc2VsZik6CisgICAgICAgIHggPSBjX2ludCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgTm9uZSkKKyAgICAgICAgeC52YWx1ZSA9IDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgTm9uZSkKKyAgICAgICAgeCA9IGNfaW50KDk5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9jY2hhcnAoc2VsZik6CisgICAgICAgIHggPSBjX2NoYXJfcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgTm9uZSkKKyAgICAgICAgeC52YWx1ZSA9ICJhYmMiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgImFiYyIpCisgICAgICAgIHggPSBjX2NoYXJfcCgic3BhbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgInNwYW0iKQorCitjbGFzcyBTdHJ1Y3R1cmVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY2ludF9zdHJ1Y3Qoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50KV0KKworICAgICAgICB4ID0gWCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgTm9uZSkKKyAgICAgICAgeC5hID0gNDIKKyAgICAgICAgeC5iID0gOTkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorCisgICAgZGVmIHRlc3RfY2NoYXJwX3N0cnVjdChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19jaGFyX3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19jaGFyX3ApXQorICAgICAgICB4ID0gWCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgTm9uZSkKKworICAgICAgICB4LmEgPSAic3BhbSIKKyAgICAgICAgeC5iID0gImZvbyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCB7IjAiOiAic3BhbSIsICIxIjogImZvbyJ9KQorCisgICAgZGVmIHRlc3Rfc3RydWN0X3N0cnVjdChzZWxmKToKKyAgICAgICAgY2xhc3MgUE9JTlQoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwgKCJ5IiwgY19pbnQpXQorICAgICAgICBjbGFzcyBSRUNUKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoInVsIiwgUE9JTlQpLCAoImxyIiwgUE9JTlQpXQorCisgICAgICAgIHIgPSBSRUNUKCkKKyAgICAgICAgci51bC54ID0gMAorICAgICAgICByLnVsLnkgPSAxCisgICAgICAgIHIubHIueCA9IDIKKyAgICAgICAgci5sci55ID0gMworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuX29iamVjdHMsIE5vbmUpCisKKyAgICAgICAgciA9IFJFQ1QoKQorICAgICAgICBwdCA9IFBPSU5UKDEsIDIpCisgICAgICAgIHIudWwgPSBwdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuX29iamVjdHMsIHsnMCc6IHt9fSkKKyAgICAgICAgci51bC54ID0gMjIKKyAgICAgICAgci51bC55ID0gNDQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLl9vYmplY3RzLCB7JzAnOiB7fX0pCisgICAgICAgIHIubHIgPSBQT0lOVCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5fb2JqZWN0cywgeycwJzoge30sICcxJzoge319KQorCitjbGFzcyBBcnJheVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jaW50X2FycmF5KHNlbGYpOgorICAgICAgICBJTlRBUlIgPSBjX2ludCAqIDMKKworICAgICAgICBpYSA9IElOVEFSUigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWEuX29iamVjdHMsIE5vbmUpCisgICAgICAgIGlhWzBdID0gMQorICAgICAgICBpYVsxXSA9IDIKKyAgICAgICAgaWFbMl0gPSAzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWEuX29iamVjdHMsIE5vbmUpCisKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJhIiwgSU5UQVJSKV0KKworICAgICAgICB4ID0gWCgpCisgICAgICAgIHgueCA9IDEwMDAKKyAgICAgICAgeC5hWzBdID0gNDIKKyAgICAgICAgeC5hWzFdID0gOTYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICB4LmEgPSBpYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIHsnMSc6IHt9fSkKKworY2xhc3MgUG9pbnRlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9wX2NpbnQoc2VsZik6CisgICAgICAgIGkgPSBjX2ludCg0MikKKyAgICAgICAgeCA9IHBvaW50ZXIoaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCB7JzEnOiBpfSkKKworY2xhc3MgRGVsZXRlUG9pbnRlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgWF90ZXN0KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoInAiLCBQT0lOVEVSKGNfY2hhcl9wKSldCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgaSA9IGNfY2hhcl9wKCJhYmMgZGVmIikKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IGdldHJlZmNvdW50IGFzIGdyYworICAgICAgICBwcmludCAiMj8iLCBncmMoaSkKKyAgICAgICAgeC5wID0gcG9pbnRlcihpKQorICAgICAgICBwcmludCAiMz8iLCBncmMoaSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMzIwKToKKyAgICAgICAgICAgIGNfaW50KDk5KQorICAgICAgICAgICAgeC5wWzBdCisgICAgICAgIHByaW50IHgucFswXQorIyMgICAgICAgIGRlbCB4CisjIyAgICAgICAgcHJpbnQgIjI/IiwgZ3JjKGkpCisjIyAgICAgICAgZGVsIGkKKyAgICAgICAgaW1wb3J0IGdjCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgzMjApOgorICAgICAgICAgICAgY19pbnQoOTkpCisgICAgICAgICAgICB4LnBbMF0KKyAgICAgICAgcHJpbnQgeC5wWzBdCisgICAgICAgIHByaW50IHgucC5jb250ZW50cworIyMgICAgICAgIHByaW50IHguX29iamVjdHMKKworICAgICAgICB4LnBbMF0gPSAic3BhbSBzcGFtIgorIyMgICAgICAgIHByaW50IHgucFswXQorICAgICAgICBwcmludCAiKyIgKiA0MgorICAgICAgICBwcmludCB4Ll9vYmplY3RzCisKK2NsYXNzIFBvaW50ZXJUb1N0cnVjdHVyZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksICgieSIsIGNfaW50KV0KKyAgICAgICAgY2xhc3MgUkVDVChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgUE9JTlRFUihQT0lOVCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgUE9JTlRFUihQT0lOVCkpXQorICAgICAgICByID0gUkVDVCgpCisgICAgICAgIHAxID0gUE9JTlQoMSwgMikKKworICAgICAgICByLmEgPSBwb2ludGVyKHAxKQorICAgICAgICByLmIgPSBwb2ludGVyKHAxKQorIyMgICAgICAgIGZyb20gcHByaW50IGltcG9ydCBwcHJpbnQgYXMgcHAKKyMjICAgICAgICBwcChwMS5fb2JqZWN0cykKKyMjICAgICAgICBwcChyLl9vYmplY3RzKQorCisgICAgICAgIHIuYVswXS54ID0gNDIKKyAgICAgICAgci5hWzBdLnkgPSA5OQorCisgICAgICAgICMgdG8gYXZvaWQgbGVha2luZyB3aGVuIHRlc3RzIGFyZSBydW4gc2V2ZXJhbCB0aW1lcworICAgICAgICAjIGNsZWFuIHVwIHRoZSB0eXBlcyBsZWZ0IGluIHRoZSBjYWNoZS4KKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IF9wb2ludGVyX3R5cGVfY2FjaGUKKyAgICAgICAgZGVsIF9wb2ludGVyX3R5cGVfY2FjaGVbUE9JTlRdCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjA5ODY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjA5ODY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9saWJjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYzQ2M2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weQpAQCAtMCwwICsxLDI5IEBACitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKKworbGliID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisKK2NsYXNzIExpYlRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3NxcnQoc2VsZik6CisgICAgICAgIGxpYi5teV9zcXJ0LmFyZ3R5cGVzID0gY19kb3VibGUsCisgICAgICAgIGxpYi5teV9zcXJ0LnJlc3R5cGUgPSBjX2RvdWJsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpYi5teV9zcXJ0KDQuMCksIDIuMCkKKyAgICAgICAgaW1wb3J0IG1hdGgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaWIubXlfc3FydCgyLjApLCBtYXRoLnNxcnQoMi4wKSkKKworICAgIGRlZiB0ZXN0X3Fzb3J0KHNlbGYpOgorICAgICAgICBjb21wYXJlZnVuYyA9IENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihjX2NoYXIpLCBQT0lOVEVSKGNfY2hhcikpCisgICAgICAgIGxpYi5teV9xc29ydC5hcmd0eXBlcyA9IGNfdm9pZF9wLCBjX3NpemVfdCwgY19zaXplX3QsIGNvbXBhcmVmdW5jCisgICAgICAgIGxpYi5teV9xc29ydC5yZXN0eXBlID0gTm9uZQorCisgICAgICAgIGRlZiBzb3J0KGEsIGIpOgorICAgICAgICAgICAgcmV0dXJuIGNtcChhWzBdLCBiWzBdKQorCisgICAgICAgIGNoYXJzID0gY3JlYXRlX3N0cmluZ19idWZmZXIoInNwYW0sIHNwYW0sIGFuZCBzcGFtIikKKyAgICAgICAgbGliLm15X3Fzb3J0KGNoYXJzLCBsZW4oY2hhcnMpLTEsIHNpemVvZihjX2NoYXIpLCBjb21wYXJlZnVuYyhzb3J0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFycy5yYXcsICIgICAsLGFhYWFkbW1tbnBwcHNzc1x4MDAiKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2MzMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliN2MzMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjY4M2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKQEAgLTAsMCArMSwxMDYgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgc3lzLCB1bml0dGVzdAoraW1wb3J0IG9zCitmcm9tIGN0eXBlcy51dGlsIGltcG9ydCBmaW5kX2xpYnJhcnkKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IGlzX3Jlc291cmNlX2VuYWJsZWQKKworbGliY19uYW1lID0gTm9uZQoraWYgb3MubmFtZSA9PSAibnQiOgorICAgIGxpYmNfbmFtZSA9IGZpbmRfbGlicmFyeSgiYyIpCitlbGlmIG9zLm5hbWUgPT0gImNlIjoKKyAgICBsaWJjX25hbWUgPSAiY29yZWRsbCIKK2VsaWYgc3lzLnBsYXRmb3JtID09ICJjeWd3aW4iOgorICAgIGxpYmNfbmFtZSA9ICJjeWd3aW4xLmRsbCIKK2Vsc2U6CisgICAgbGliY19uYW1lID0gZmluZF9saWJyYXJ5KCJjIikKKworaWYgaXNfcmVzb3VyY2VfZW5hYmxlZCgicHJpbnRpbmciKToKKyAgICBwcmludCAibGliY19uYW1lIGlzIiwgbGliY19uYW1lCisKK2NsYXNzIExvYWRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgdW5rbm93bmRsbCA9ICJ4eHJhbmRvbW5hbWV4eCIKKworICAgIGlmIGxpYmNfbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgZGVmIHRlc3RfbG9hZChzZWxmKToKKyAgICAgICAgICAgIENETEwobGliY19uYW1lKQorICAgICAgICAgICAgQ0RMTChvcy5wYXRoLmJhc2VuYW1lKGxpYmNfbmFtZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBDRExMLCBzZWxmLnVua25vd25kbGwpCisKKyAgICBpZiBsaWJjX25hbWUgaXMgbm90IE5vbmUgYW5kIG9zLnBhdGguYmFzZW5hbWUobGliY19uYW1lKSA9PSAibGliYy5zby42IjoKKyAgICAgICAgZGVmIHRlc3RfbG9hZF92ZXJzaW9uKHNlbGYpOgorICAgICAgICAgICAgY2RsbC5Mb2FkTGlicmFyeSgibGliYy5zby42IikKKyAgICAgICAgICAgICMgbGludXggdXNlcyB2ZXJzaW9uLCBsaWJjIDkgc2hvdWxkIG5vdCBleGlzdAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2RsbC5Mb2FkTGlicmFyeSwgImxpYmMuc28uOSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLkxvYWRMaWJyYXJ5LCBzZWxmLnVua25vd25kbGwpCisKKyAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiAoImMiLCAibSIpOgorICAgICAgICAgICAgbGliID0gZmluZF9saWJyYXJ5KG5hbWUpCisgICAgICAgICAgICBpZiBsaWI6CisgICAgICAgICAgICAgICAgY2RsbC5Mb2FkTGlicmFyeShsaWIpCisgICAgICAgICAgICAgICAgQ0RMTChsaWIpCisKKyAgICBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICAgICAgZGVmIHRlc3RfbG9hZF9saWJyYXJ5KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsaWJjX25hbWUgaXMgTm9uZSkKKyAgICAgICAgICAgIGlmIGlzX3Jlc291cmNlX2VuYWJsZWQoInByaW50aW5nIik6CisgICAgICAgICAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJrZXJuZWwzMiIpCisgICAgICAgICAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJ1c2VyMzIiKQorCisgICAgICAgICAgICBpZiBvcy5uYW1lID09ICJudCI6CisgICAgICAgICAgICAgICAgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgICAgICB3aW5kbGxbImtlcm5lbDMyIl0uR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgICAgIHdpbmRsbC5Mb2FkTGlicmFyeSgia2VybmVsMzIiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICAgICAgV2luRExMKCJrZXJuZWwzMiIpLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgIGVsaWYgb3MubmFtZSA9PSAiY2UiOgorICAgICAgICAgICAgICAgIHdpbmRsbC5jb3JlZGxsLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgICAgICB3aW5kbGxbImNvcmVkbGwiXS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICAgICAgd2luZGxsLkxvYWRMaWJyYXJ5KCJjb3JlZGxsIikuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgICAgIFdpbkRMTCgiY29yZWRsbCIpLkdldE1vZHVsZUhhbmRsZVcKKworICAgICAgICBkZWYgdGVzdF9sb2FkX29yZGluYWxfZnVuY3Rpb25zKHNlbGYpOgorICAgICAgICAgICAgaW1wb3J0IF9jdHlwZXNfdGVzdAorICAgICAgICAgICAgZGxsID0gV2luRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgICAgICMgV2UgbG9hZCB0aGUgc2FtZSBmdW5jdGlvbiBib3RoIHZpYSBvcmRpbmFsIGFuZCBuYW1lCisgICAgICAgICAgICBmdW5jX29yZCA9IGRsbFsyXQorICAgICAgICAgICAgZnVuY19uYW1lID0gZGxsLkdldFN0cmluZworICAgICAgICAgICAgIyBhZGRyZXNzb2YgZ2V0cyB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgZnVuY3Rpb24gcG9pbnRlciBpcyBzdG9yZWQKKyAgICAgICAgICAgIGFfb3JkID0gYWRkcmVzc29mKGZ1bmNfb3JkKQorICAgICAgICAgICAgYV9uYW1lID0gYWRkcmVzc29mKGZ1bmNfbmFtZSkKKyAgICAgICAgICAgIGZfb3JkX2FkZHIgPSBjX3ZvaWRfcC5mcm9tX2FkZHJlc3MoYV9vcmQpLnZhbHVlCisgICAgICAgICAgICBmX25hbWVfYWRkciA9IGNfdm9pZF9wLmZyb21fYWRkcmVzcyhhX25hbWUpLnZhbHVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleChmX29yZF9hZGRyKSwgaGV4KGZfbmFtZV9hZGRyKSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGRsbC5fX2dldGl0ZW1fXywgMTIzNCkKKworICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKKyAgICAgICAgZGVmIHRlc3RfMTcwMzI4Nl9BKHNlbGYpOgorICAgICAgICAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBMb2FkTGlicmFyeSwgRnJlZUxpYnJhcnkKKyAgICAgICAgICAgICMgT24gd2luWFAgNjQtYml0LCBhZHZhcGkzMiBsb2FkcyBhdCBhbiBhZGRyZXNzIHRoYXQgZG9lcworICAgICAgICAgICAgIyBOT1QgZml0IGludG8gYSAzMi1iaXQgaW50ZWdlci4gIEZyZWVMaWJyYXJ5IG11c3QgYmUgYWJsZQorICAgICAgICAgICAgIyB0byBhY2NlcHQgdGhpcyBhZGRyZXNzLgorCisgICAgICAgICAgICAjIFRoZXNlIGFyZSB0ZXN0cyBmb3IgaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzE3MDMyODYKKyAgICAgICAgICAgIGhhbmRsZSA9IExvYWRMaWJyYXJ5KCJhZHZhcGkzMiIpCisgICAgICAgICAgICBGcmVlTGlicmFyeShoYW5kbGUpCisKKyAgICAgICAgZGVmIHRlc3RfMTcwMzI4Nl9CKHNlbGYpOgorICAgICAgICAgICAgIyBTaW5jZSBvbiB3aW5YUCA2NC1iaXQgYWR2YXBpMzIgbG9hZHMgbGlrZSBkZXNjcmliZWQKKyAgICAgICAgICAgICMgYWJvdmUsIHRoZSAoYXJiaXRyYXJpbHkgc2VsZWN0ZWQpIENsb3NlRXZlbnRMb2cgZnVuY3Rpb24KKyAgICAgICAgICAgICMgYWxzbyBoYXMgYSBoaWdoIGFkZHJlc3MuICAnY2FsbF9mdW5jdGlvbicgc2hvdWxkIGFjY2VwdAorICAgICAgICAgICAgIyBhZGRyZXNzZXMgc28gbGFyZ2UuCisgICAgICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IGNhbGxfZnVuY3Rpb24KKyAgICAgICAgICAgIGFkdmFwaTMyID0gd2luZGxsLmFkdmFwaTMyCisgICAgICAgICAgICAjIENhbGxpbmcgQ2xvc2VFdmVudExvZyB3aXRoIGEgTlVMTCBhcmd1bWVudCBzaG91bGQgZmFpbCwKKyAgICAgICAgICAgICMgYnV0IHRoZSBjYWxsIHNob3VsZCBub3Qgc2VnZmF1bHQgb3Igc28uCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGFkdmFwaTMyLkNsb3NlRXZlbnRMb2coTm9uZSkpCisgICAgICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MuYXJndHlwZXMgPSBjX3ZvaWRfcCwgY19jaGFyX3AKKyAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRQcm9jQWRkcmVzcy5yZXN0eXBlID0gY192b2lkX3AKKyAgICAgICAgICAgIHByb2MgPSB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MoYWR2YXBpMzIuX2hhbmRsZSwgIkNsb3NlRXZlbnRMb2ciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb2MpCisgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIHJlYWwgdGVzdDogY2FsbCB0aGUgZnVuY3Rpb24gdmlhICdjYWxsX2Z1bmN0aW9uJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBjYWxsX2Z1bmN0aW9uKHByb2MsIChOb25lLCkpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NDViMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NDViMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X21hY2hvbGliLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X21hY2hvbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYTg0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHkKQEAgLTAsMCArMSw2MiBAQAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworIyBCb2IgSXBwb2xpdG86CisiIiIKK09rLi4gdGhlIGNvZGUgdG8gZmluZCB0aGUgZmlsZW5hbWUgZm9yIF9fZ2V0YXR0cl9fIHNob3VsZCBsb29rCitzb21ldGhpbmcgbGlrZToKKworaW1wb3J0IG9zCitmcm9tIG1hY2hvbGliLmR5bGQgaW1wb3J0IGR5bGRfZmluZAorCitkZWYgZmluZF9saWIobmFtZSk6CisgICAgIHBvc3NpYmxlID0gWydsaWInK25hbWUrJy5keWxpYicsIG5hbWUrJy5keWxpYicsCisgICAgIG5hbWUrJy5mcmFtZXdvcmsvJytuYW1lXQorICAgICBmb3IgZHlsaWIgaW4gcG9zc2libGU6CisgICAgICAgICB0cnk6CisgICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGgucmVhbHBhdGgoZHlsZF9maW5kKGR5bGliKSkKKyAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgIHBhc3MKKyAgICAgcmFpc2UgVmFsdWVFcnJvciwgIiVzIG5vdCBmb3VuZCIgJSAobmFtZSwpCisKK0l0J2xsIGhhdmUgb3V0cHV0IGxpa2UgdGhpczoKKworID4+PiBmaW5kX2xpYigncHRocmVhZCcpCisnL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWInCisgPj4+IGZpbmRfbGliKCd6JykKKycvdXNyL2xpYi9saWJ6LjEuZHlsaWInCisgPj4+IGZpbmRfbGliKCdJT0tpdCcpCisnL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSU9LaXQuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSU9LaXQnCisKKy1ib2IKKworIiIiCisKK2Zyb20gY3R5cGVzLm1hY2hvbGliLmR5bGQgaW1wb3J0IGR5bGRfZmluZAorCitkZWYgZmluZF9saWIobmFtZSk6CisgICAgcG9zc2libGUgPSBbJ2xpYicrbmFtZSsnLmR5bGliJywgbmFtZSsnLmR5bGliJywgbmFtZSsnLmZyYW1ld29yay8nK25hbWVdCisgICAgZm9yIGR5bGliIGluIHBvc3NpYmxlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5yZWFscGF0aChkeWxkX2ZpbmQoZHlsaWIpKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICByYWlzZSBWYWx1ZUVycm9yKCIlcyBub3QgZm91bmQiICUgKG5hbWUsKSkKKworY2xhc3MgTWFjaE9UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgICAgIGRlZiB0ZXN0X2ZpbmQoc2VsZik6CisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmluZF9saWIoJ3B0aHJlYWQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYicpCisKKyAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRfbGliKCd6JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuc3RhcnRzd2l0aCgnL3Vzci9saWIvbGliei4xJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LmVuZHN3aXRoKCcuZHlsaWInKSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaW5kX2xpYignSU9LaXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9JT0tpdC5mcmFtZXdvcmsvVmVyc2lvbnMvQS9JT0tpdCcpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X21hY2hvbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTE0NzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X21hY2hvbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X21hY2hvbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTE0NzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X21hY2hvbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X21lbWZ1bmN0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDcyNjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X21lbWZ1bmN0aW9ucy5weQpAQCAtMCwwICsxLDc5IEBACitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2NsYXNzIE1lbUZ1bmN0aW9uc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorIyMgICAgZGVmIHRlc3Rfb3ZlcmZsb3coc2VsZik6CisjIyAgICAgICAgIyBzdHJpbmdfYXQgYW5kIHdzdHJpbmdfYXQgbXVzdCB1c2UgdGhlIFB5dGhvbiBjYWxsaW5nCisjIyAgICAgICAgIyBjb252ZW50aW9uICh3aGljaCBhY3F1aXJlcyB0aGUgR0lMIGFuZCBjaGVja3MgdGhlIFB5dGhvbgorIyMgICAgICAgICMgZXJyb3IgZmxhZykuICBQcm92b2tlIGFuIGVycm9yIGFuZCBjYXRjaCBpdDsgc2VlIGFsc28gaXNzdWUKKyMjICAgICAgICAjICMzNTU0OiA8aHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTM1NTQ+CisjIyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKE92ZXJmbG93RXJyb3IsIE1lbW9yeUVycm9yLCBTeXN0ZW1FcnJvciksCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiB3c3RyaW5nX2F0KHUiZm9vIiwgc3lzLm1heGludCAtIDEpKQorIyMgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChPdmVyZmxvd0Vycm9yLCBNZW1vcnlFcnJvciwgU3lzdGVtRXJyb3IpLAorIyMgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTogc3RyaW5nX2F0KCJmb28iLCBzeXMubWF4aW50IC0gMSkpCisKKyAgICBkZWYgdGVzdF9tZW1tb3ZlKHNlbGYpOgorICAgICAgICAjIGxhcmdlIGJ1ZmZlcnMgYXBwYXJlbnRseSBpbmNyZWFzZSB0aGUgY2hhbmNlIHRoYXQgdGhlIG1lbW9yeQorICAgICAgICAjIGlzIGFsbG9jYXRlZCBpbiBoaWdoIGFkZHJlc3Mgc3BhY2UuCisgICAgICAgIGEgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcigxMDAwMDAwKQorICAgICAgICBwID0gIkhlbGxvLCBXb3JsZCIKKyAgICAgICAgcmVzdWx0ID0gbWVtbW92ZShhLCBwLCBsZW4ocCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQocmVzdWx0KSwgIkhlbGxvLCBXb3JsZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KHJlc3VsdCwgNSksICJIZWxsbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KHJlc3VsdCwgMTYpLCAiSGVsbG8sIFdvcmxkXDBcMFwwXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZ19hdChyZXN1bHQsIDApLCAiIikKKworICAgIGRlZiB0ZXN0X21lbXNldChzZWxmKToKKyAgICAgICAgYSA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKDEwMDAwMDApCisgICAgICAgIHJlc3VsdCA9IG1lbXNldChhLCBvcmQoJ3gnKSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS52YWx1ZSwgInh4eHh4eHh4eHh4eHh4eHgiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KHJlc3VsdCksICJ4eHh4eHh4eHh4eHh4eHh4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQoYSksICJ4eHh4eHh4eHh4eHh4eHh4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQoYSwgMjApLCAieHh4eHh4eHh4eHh4eHh4eFwwXDBcMFwwIikKKworICAgIGRlZiB0ZXN0X2Nhc3Qoc2VsZik6CisgICAgICAgIGEgPSAoY191Ynl0ZSAqIDMyKSgqbWFwKG9yZCwgImFiY2RlZiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoYSwgY19jaGFyX3ApLnZhbHVlLCAiYWJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGEsIFBPSU5URVIoY19ieXRlKSlbOjddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FzdChhLCBQT0lOVEVSKGNfYnl0ZSkpWzo3Ol0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGEsIFBPSU5URVIoY19ieXRlKSlbNjotMTotMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAxMDIsIDEwMSwgMTAwLCA5OSwgOTgsIDk3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGEsIFBPSU5URVIoY19ieXRlKSlbOjc6Ml0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs5NywgOTksIDEwMSwgMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FzdChhLCBQT0lOVEVSKGNfYnl0ZSkpWzo3OjddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOTddKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nX2F0KHNlbGYpOgorICAgICAgICBzID0gc3RyaW5nX2F0KCJmb28gYmFyIikKKyAgICAgICAgIyBYWFggVGhlIGZvbGxvd2luZyBtYXkgYmUgd3JvbmcsIGRlcGVuZGluZyBvbiBob3cgUHl0aG9uCisgICAgICAgICMgbWFuYWdlcyBzdHJpbmcgaW5zdGFuY2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgc3lzLmdldHJlZmNvdW50KHMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocywgImZvbyBiYXIiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KCJmb28gYmFyIiwgOCksICJmb28gYmFyXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZ19hdCgiZm9vIGJhciIsIDMpLCAiZm9vIikKKworICAgIHRyeToKKyAgICAgICAgY3JlYXRlX3VuaWNvZGVfYnVmZmVyCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGRlZiB0ZXN0X3dzdHJpbmdfYXQoc2VsZik6CisgICAgICAgICAgICBwID0gY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJIZWxsbywgV29ybGQiKQorICAgICAgICAgICAgYSA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDAwMDAwKQorICAgICAgICAgICAgcmVzdWx0ID0gbWVtbW92ZShhLCBwLCBsZW4ocCkgKiBzaXplb2YoY193Y2hhcikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEudmFsdWUsICJIZWxsbywgV29ybGQiKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSksICJIZWxsbywgV29ybGQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEsIDUpLCAiSGVsbG8iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEsIDE2KSwgIkhlbGxvLCBXb3JsZFwwXDBcMFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3N0cmluZ19hdChhLCAwKSwgIiIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZmYzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZmYzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MjM5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weQpAQCAtMCwwICsxLDI4NiBAQAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN0cnVjdAorCitkZWYgdmFsaWRfcmFuZ2VzKCp0eXBlcyk6CisgICAgIyBnaXZlbiBhIHNlcXVlbmNlIG9mIG51bWVyaWMgdHlwZXMsIGNvbGxlY3QgdGhlaXIgX3R5cGVfCisgICAgIyBhdHRyaWJ1dGUsIHdoaWNoIGlzIGEgc2luZ2xlIGZvcm1hdCBjaGFyYWN0ZXIgY29tcGF0aWJsZSB3aXRoCisgICAgIyB0aGUgc3RydWN0IG1vZHVsZSwgdXNlIHRoZSBzdHJ1Y3QgbW9kdWxlIHRvIGNhbGN1bGF0ZSB0aGUKKyAgICAjIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUgYWxsb3dlZCBmb3IgdGhpcyBmb3JtYXQuCisgICAgIyBSZXR1cm5zIGEgbGlzdCBvZiAobWluLCBtYXgpIHZhbHVlcy4KKyAgICByZXN1bHQgPSBbXQorICAgIGZvciB0IGluIHR5cGVzOgorICAgICAgICBmbXQgPSB0Ll90eXBlXworICAgICAgICBzaXplID0gc3RydWN0LmNhbGNzaXplKGZtdCkKKyAgICAgICAgYSA9IHN0cnVjdC51bnBhY2soZm10LCAoIlx4MDAiKjMyKVs6c2l6ZV0pWzBdCisgICAgICAgIGIgPSBzdHJ1Y3QudW5wYWNrKGZtdCwgKCJceEZGIiozMilbOnNpemVdKVswXQorICAgICAgICBjID0gc3RydWN0LnVucGFjayhmbXQsICgiXHg3RiIrIlx4MDAiKjMyKVs6c2l6ZV0pWzBdCisgICAgICAgIGQgPSBzdHJ1Y3QudW5wYWNrKGZtdCwgKCJceDgwIisiXHhGRiIqMzIpWzpzaXplXSlbMF0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgobWluKGEsIGIsIGMsIGQpLCBtYXgoYSwgYiwgYywgZCkpKQorICAgIHJldHVybiByZXN1bHQKKworQXJnVHlwZSA9IHR5cGUoYnlyZWYoY19pbnQoMCkpKQorCit1bnNpZ25lZF90eXBlcyA9IFtjX3VieXRlLCBjX3VzaG9ydCwgY191aW50LCBjX3Vsb25nXQorc2lnbmVkX3R5cGVzID0gW2NfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19sb25nbG9uZ10KKworYm9vbF90eXBlcyA9IFtdCisKK2Zsb2F0X3R5cGVzID0gW2NfZG91YmxlLCBjX2Zsb2F0XQorCit0cnk6CisgICAgY191bG9uZ2xvbmcKKyAgICBjX2xvbmdsb25nCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgdW5zaWduZWRfdHlwZXMuYXBwZW5kKGNfdWxvbmdsb25nKQorICAgIHNpZ25lZF90eXBlcy5hcHBlbmQoY19sb25nbG9uZykKKwordHJ5OgorICAgIGNfYm9vbAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGJvb2xfdHlwZXMuYXBwZW5kKGNfYm9vbCkKKwordW5zaWduZWRfcmFuZ2VzID0gdmFsaWRfcmFuZ2VzKCp1bnNpZ25lZF90eXBlcykKK3NpZ25lZF9yYW5nZXMgPSB2YWxpZF9yYW5nZXMoKnNpZ25lZF90eXBlcykKK2Jvb2xfdmFsdWVzID0gW1RydWUsIEZhbHNlLCAwLCAxLCAtMSwgNTAwMCwgJ3Rlc3QnLCBbXSwgWzFdXQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIE51bWJlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfaW5pdChzZWxmKToKKyAgICAgICAgIyBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IHRvIHplcm8KKyAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXMgKyBmbG9hdF90eXBlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCgpLnZhbHVlLCAwKQorCisgICAgZGVmIHRlc3RfdW5zaWduZWRfdmFsdWVzKHNlbGYpOgorICAgICAgICAjIHRoZSB2YWx1ZSBnaXZlbiB0byB0aGUgY29uc3RydWN0b3IgaXMgYXZhaWxhYmxlCisgICAgICAgICMgYXMgdGhlICd2YWx1ZScgYXR0cmlidXRlCisgICAgICAgIGZvciB0LCAobCwgaCkgaW4gemlwKHVuc2lnbmVkX3R5cGVzLCB1bnNpZ25lZF9yYW5nZXMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KGwpLnZhbHVlLCBsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KGgpLnZhbHVlLCBoKQorCisgICAgZGVmIHRlc3Rfc2lnbmVkX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgIyBzZWUgYWJvdmUKKyAgICAgICAgZm9yIHQsIChsLCBoKSBpbiB6aXAoc2lnbmVkX3R5cGVzLCBzaWduZWRfcmFuZ2VzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodChsKS52YWx1ZSwgbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodChoKS52YWx1ZSwgaCkKKworICAgIGRlZiB0ZXN0X2Jvb2xfdmFsdWVzKHNlbGYpOgorICAgICAgICBmcm9tIG9wZXJhdG9yIGltcG9ydCB0cnV0aAorICAgICAgICBmb3IgdCwgdiBpbiB6aXAoYm9vbF90eXBlcywgYm9vbF92YWx1ZXMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KHYpLnZhbHVlLCB0cnV0aCh2KSkKKworICAgIGRlZiB0ZXN0X3R5cGVlcnJvcihzZWxmKToKKyAgICAgICAgIyBPbmx5IG51bWJlcnMgYXJlIGFsbG93ZWQgaW4gdGhlIGNvbnRydWN0b3IsCisgICAgICAgICMgb3RoZXJ3aXNlIFR5cGVFcnJvciBpcyByYWlzZWQKKyAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXMgKyBmbG9hdF90eXBlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdCwgIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQsIE5vbmUpCisKKyMjICAgIGRlZiB0ZXN0X3ZhbGlkX3JhbmdlcyhzZWxmKToKKyMjICAgICAgICAjIGludmFsaWQgdmFsdWVzIG9mIHRoZSBjb3JyZWN0IHR5cGUKKyMjICAgICAgICAjIHJhaXNlIFZhbHVlRXJyb3IgKG5vdCBPdmVyZmxvd0Vycm9yKQorIyMgICAgICAgIGZvciB0LCAobCwgaCkgaW4gemlwKHVuc2lnbmVkX3R5cGVzLCB1bnNpZ25lZF9yYW5nZXMpOgorIyMgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LCBsLTEpCisjIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQsIGgrMSkKKworICAgIGRlZiB0ZXN0X2Zyb21fcGFyYW0oc2VsZik6CisgICAgICAgICMgdGhlIGZyb21fcGFyYW0gY2xhc3MgbWV0aG9kIGF0dHJpYnV0ZSBhbHdheXMKKyAgICAgICAgIyByZXR1cm5zIFB5Q0FyZ09iamVjdCBpbnN0YW5jZXMKKyAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXMgKyBmbG9hdF90eXBlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQXJnVHlwZSwgdHlwZSh0LmZyb21fcGFyYW0oMCkpKQorCisgICAgZGVmIHRlc3RfYnlyZWYoc2VsZik6CisgICAgICAgICMgY2FsbGluZyBieXJlZiByZXR1cm5zIGFsc28gYSBQeUNBcmdPYmplY3QgaW5zdGFuY2UKKyAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXMgKyBmbG9hdF90eXBlcyArIGJvb2xfdHlwZXM6CisgICAgICAgICAgICBwYXJtID0gYnlyZWYodCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChBcmdUeXBlLCB0eXBlKHBhcm0pKQorCisKKyAgICBkZWYgdGVzdF9mbG9hdHMoc2VsZik6CisgICAgICAgICMgY19mbG9hdCBhbmQgY19kb3VibGUgY2FuIGJlIGNyZWF0ZWQgZnJvbQorICAgICAgICAjIFB5dGhvbiBpbnQsIGxvbmcgYW5kIGZsb2F0CisgICAgICAgIGNsYXNzIEZsb2F0TGlrZShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMi4wCisgICAgICAgIGYgPSBGbG9hdExpa2UoKQorICAgICAgICBmb3IgdCBpbiBmbG9hdF90eXBlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCgyLjApLnZhbHVlLCAyLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQoMikudmFsdWUsIDIuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCgyTCkudmFsdWUsIDIuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodChmKS52YWx1ZSwgMi4wKQorCisgICAgZGVmIHRlc3RfaW50ZWdlcnMoc2VsZik6CisgICAgICAgIGNsYXNzIEZsb2F0TGlrZShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMi4wCisgICAgICAgIGYgPSBGbG9hdExpa2UoKQorICAgICAgICBjbGFzcyBJbnRMaWtlKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMgorICAgICAgICBpID0gSW50TGlrZSgpCisgICAgICAgICMgaW50ZWdlcnMgY2Fubm90IGJlIGNvbnN0cnVjdGVkIGZyb20gZmxvYXRzLAorICAgICAgICAjIGJ1dCBmcm9tIGludGVnZXItbGlrZSBvYmplY3RzCisgICAgICAgIGZvciB0IGluIHNpZ25lZF90eXBlcyArIHVuc2lnbmVkX3R5cGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LCAzLjE0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LCBmKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KGkpLnZhbHVlLCAyKQorCisgICAgZGVmIHRlc3Rfc2l6ZXMoc2VsZik6CisgICAgICAgIGZvciB0IGluIHNpZ25lZF90eXBlcyArIHVuc2lnbmVkX3R5cGVzICsgZmxvYXRfdHlwZXMgKyBib29sX3R5cGVzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNpemUgPSBzdHJ1Y3QuY2FsY3NpemUodC5fdHlwZV8pCisgICAgICAgICAgICBleGNlcHQgc3RydWN0LmVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIHNpemVvZiBvZiB0aGUgdHlwZS4uLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YodCksIHNpemUpCisgICAgICAgICAgICAjIGFuZCBzaXplb2Ygb2YgYW4gaW5zdGFuY2UKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHQoKSksIHNpemUpCisKKyAgICBkZWYgdGVzdF9hbGlnbm1lbnRzKHNlbGYpOgorICAgICAgICBmb3IgdCBpbiBzaWduZWRfdHlwZXMgKyB1bnNpZ25lZF90eXBlcyArIGZsb2F0X3R5cGVzOgorICAgICAgICAgICAgY29kZSA9IHQuX3R5cGVfICMgdGhlIHR5cGVjb2RlCisgICAgICAgICAgICBhbGlnbiA9IHN0cnVjdC5jYWxjc2l6ZSgiYyVjIiAlIGNvZGUpIC0gc3RydWN0LmNhbGNzaXplKGNvZGUpCisKKyAgICAgICAgICAgICMgYWxpZ25tZW50IG9mIHRoZSB0eXBlLi4uCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChjb2RlLCBhbGlnbm1lbnQodCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUsIGFsaWduKSkKKyAgICAgICAgICAgICMgYW5kIGFsaWdubWVudCBvZiBhbiBpbnN0YW5jZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoY29kZSwgYWxpZ25tZW50KHQoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUsIGFsaWduKSkKKworICAgIGRlZiB0ZXN0X2ludF9mcm9tX2FkZHJlc3Moc2VsZik6CisgICAgICAgIGZyb20gYXJyYXkgaW1wb3J0IGFycmF5CisgICAgICAgIGZvciB0IGluIHNpZ25lZF90eXBlcyArIHVuc2lnbmVkX3R5cGVzOgorICAgICAgICAgICAgIyB0aGUgYXJyYXkgbW9kdWxlIGRvZXNuJ3Qgc3VwcG9ydCBhbGwgZm9ybWF0IGNvZGVzCisgICAgICAgICAgICAjIChubyAncScgb3IgJ1EnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGFycmF5KHQuX3R5cGVfKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGEgPSBhcnJheSh0Ll90eXBlXywgWzEwMF0pCisKKyAgICAgICAgICAgICMgdiBub3cgaXMgYW4gaW50ZWdlciBhdCBhbiAnZXh0ZXJuYWwnIG1lbW9yeSBsb2NhdGlvbgorICAgICAgICAgICAgdiA9IHQuZnJvbV9hZGRyZXNzKGEuYnVmZmVyX2luZm8oKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2KSwgdCkKKworICAgICAgICAgICAgIyBjaGFuZ2luZyB0aGUgdmFsdWUgYXQgdGhlIG1lbW9yeSBsb2NhdGlvbiBjaGFuZ2VzIHYncyB2YWx1ZSBhbHNvCisgICAgICAgICAgICBhWzBdID0gNDIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKKworCisgICAgZGVmIHRlc3RfZmxvYXRfZnJvbV9hZGRyZXNzKHNlbGYpOgorICAgICAgICBmcm9tIGFycmF5IGltcG9ydCBhcnJheQorICAgICAgICBmb3IgdCBpbiBmbG9hdF90eXBlczoKKyAgICAgICAgICAgIGEgPSBhcnJheSh0Ll90eXBlXywgWzMuMTRdKQorICAgICAgICAgICAgdiA9IHQuZnJvbV9hZGRyZXNzKGEuYnVmZmVyX2luZm8oKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHYpIGlzIHQpCisgICAgICAgICAgICBhWzBdID0gMi4zNDU2ZTE3CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYudmFsdWUsIGFbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh2KSBpcyB0KQorCisgICAgZGVmIHRlc3RfY2hhcl9mcm9tX2FkZHJlc3Moc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX2NoYXIKKyAgICAgICAgZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKKworICAgICAgICBhID0gYXJyYXkoJ2MnLCAneCcpCisgICAgICAgIHYgPSBjX2NoYXIuZnJvbV9hZGRyZXNzKGEuYnVmZmVyX2luZm8oKVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh2KSBpcyBjX2NoYXIpCisKKyAgICAgICAgYVswXSA9ICc/JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYudmFsdWUsIGFbMF0pCisKKyAgICAjIGFycmF5IGRvZXMgbm90IHN1cHBvcnQgY19ib29sIC8gJ3QnCisgICAgIyBkZWYgdGVzdF9ib29sX2Zyb21fYWRkcmVzcyhzZWxmKToKKyAgICAjICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19ib29sCisgICAgIyAgICAgZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKKyAgICAjICAgICBhID0gYXJyYXkoY19ib29sLl90eXBlXywgW1RydWVdKQorICAgICMgICAgIHYgPSB0LmZyb21fYWRkcmVzcyhhLmJ1ZmZlcl9pbmZvKClbMF0pCisgICAgIyAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICMgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2KSBpcyB0KQorICAgICMgICAgIGFbMF0gPSBGYWxzZQorICAgICMgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKKyAgICAjICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodikgaXMgdCkKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgICMgY19pbnQoKSBjYW4gYmUgaW5pdGlhbGl6ZWQgZnJvbSBQeXRob24ncyBpbnQsIGFuZCBjX2ludC4KKyAgICAgICAgIyBOb3QgZnJvbSBjX2xvbmcgb3Igc28sIHdoaWNoIHNlZW1zIHN0cmFuZ2UsIGFiZCBzaG91bGQKKyAgICAgICAgIyBwcm9iYWJseSBiZSBjaGFuZ2VkOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfaW50LCBjX2xvbmcoNDIpKQorCisgICAgZGVmIHRlc3RfZmxvYXRfb3ZlcmZsb3coc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgYmlnX2ludCA9IGludChzeXMuZmxvYXRfaW5mby5tYXgpICogMgorICAgICAgICBmb3IgdCBpbiBmbG9hdF90eXBlcyArIFtjX2xvbmdkb3VibGVdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgdCwgYmlnX2ludCkKKyAgICAgICAgICAgIGlmIChoYXNhdHRyKHQsICJfX2N0eXBlX2JlX18iKSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgdC5fX2N0eXBlX2JlX18sIGJpZ19pbnQpCisgICAgICAgICAgICBpZiAoaGFzYXR0cih0LCAiX19jdHlwZV9sZV9fIikpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHQuX19jdHlwZV9sZV9fLCBiaWdfaW50KQorCisjIyAgICBkZWYgdGVzdF9wZXJmKHNlbGYpOgorIyMgICAgICAgIGNoZWNrX3BlcmYoKQorCitmcm9tIGN0eXBlcyBpbXBvcnQgX1NpbXBsZUNEYXRhCitjbGFzcyBjX2ludF9TKF9TaW1wbGVDRGF0YSk6CisgICAgX3R5cGVfID0gImkiCisgICAgX19zbG90c19fID0gW10KKworZGVmIHJ1bl90ZXN0KHJlcCwgbXNnLCBmdW5jLCBhcmc9Tm9uZSk6CisjIyAgICBpdGVtcyA9IFtOb25lXSAqIHJlcAorICAgIGl0ZW1zID0gcmFuZ2UocmVwKQorICAgIGZyb20gdGltZSBpbXBvcnQgY2xvY2sKKyAgICBpZiBhcmcgaXMgbm90IE5vbmU6CisgICAgICAgIHN0YXJ0ID0gY2xvY2soKQorICAgICAgICBmb3IgaSBpbiBpdGVtczoKKyAgICAgICAgICAgIGZ1bmMoYXJnKTsgZnVuYyhhcmcpOyBmdW5jKGFyZyk7IGZ1bmMoYXJnKTsgZnVuYyhhcmcpCisgICAgICAgIHN0b3AgPSBjbG9jaygpCisgICAgZWxzZToKKyAgICAgICAgc3RhcnQgPSBjbG9jaygpCisgICAgICAgIGZvciBpIGluIGl0ZW1zOgorICAgICAgICAgICAgZnVuYygpOyBmdW5jKCk7IGZ1bmMoKTsgZnVuYygpOyBmdW5jKCkKKyAgICAgICAgc3RvcCA9IGNsb2NrKCkKKyAgICBwcmludCAiJTE1czogJS4yZiB1cyIgJSAobXNnLCAoKHN0b3Atc3RhcnQpKjFlNi81L3JlcCkpCisKK2RlZiBjaGVja19wZXJmKCk6CisgICAgIyBDb25zdHJ1Y3QgNSBvYmplY3RzCisgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfaW50CisKKyAgICBSRVAgPSAyMDAwMDAKKworICAgIHJ1bl90ZXN0KFJFUCwgImludCgpIiwgaW50KQorICAgIHJ1bl90ZXN0KFJFUCwgImludCg5OTkpIiwgaW50KQorICAgIHJ1bl90ZXN0KFJFUCwgImNfaW50KCkiLCBjX2ludCkKKyAgICBydW5fdGVzdChSRVAsICJjX2ludCg5OTkpIiwgY19pbnQpCisgICAgcnVuX3Rlc3QoUkVQLCAiY19pbnRfUygpIiwgY19pbnRfUykKKyAgICBydW5fdGVzdChSRVAsICJjX2ludF9TKDk5OSkiLCBjX2ludF9TKQorCisjIFB5dGhvbiAyLjMgLU9PLCB3aW4yaywgUDQgNzAwIE1IejoKKyMKKyMgICAgICAgICAgaW50KCk6IDAuODcgdXMKKyMgICAgICAgaW50KDk5OSk6IDAuODcgdXMKKyMgICAgICAgIGNfaW50KCk6IDMuMzUgdXMKKyMgICAgIGNfaW50KDk5OSk6IDMuMzQgdXMKKyMgICAgICBjX2ludF9TKCk6IDMuMjMgdXMKKyMgICBjX2ludF9TKDk5OSk6IDMuMjQgdXMKKworIyBQeXRob24gMi4yIC1PTywgd2luMmssIFA0IDcwMCBNSHo6CisjCisjICAgICAgICAgIGludCgpOiAwLjg5IHVzCisjICAgICAgIGludCg5OTkpOiAwLjg5IHVzCisjICAgICAgICBjX2ludCgpOiA5Ljk5IHVzCisjICAgICBjX2ludCg5OTkpOiAxMC4wMiB1cworIyAgICAgIGNfaW50X1MoKTogOS44NyB1cworIyAgIGNfaW50X1MoOTk5KTogOS44NSB1cworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorIyMgICAgY2hlY2tfcGVyZigpCisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1YjY1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1YjY1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfb2JqZWN0cy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTIxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfb2JqZWN0cy5weQpAQCAtMCwwICsxLDcwIEBACityJycnCitUaGlzIHRlc3RzIHRoZSAnX29iamVjdHMnIGF0dHJpYnV0ZSBvZiBjdHlwZXMgaW5zdGFuY2VzLiAgJ19vYmplY3RzJworaG9sZHMgcmVmZXJlbmNlcyB0byBvYmplY3RzIHRoYXQgbXVzdCBiZSBrZXB0IGFsaXZlIGFzIGxvbmcgYXMgdGhlCitjdHlwZXMgaW5zdGFuY2UsIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBtZW1vcnkgYnVmZmVyIGlzIHZhbGlkLgorCitXQVJOSU5HOiBUaGUgJ19vYmplY3RzJyBhdHRyaWJ1dGUgaXMgZXhwb3NlZCBPTkxZIGZvciBkZWJ1Z2dpbmcgY3R5cGVzIGl0c2VsZiwKK2l0IE1VU1QgTkVWRVIgQkUgTU9ESUZJRUQhCisKKydfb2JqZWN0cycgaXMgaW5pdGlhbGl6ZWQgdG8gYSBkaWN0aW9uYXJ5IG9uIGZpcnN0IHVzZSwgYmVmb3JlIHRoYXQgaXQKK2lzIE5vbmUuCisKK0hlcmUgaXMgYW4gYXJyYXkgb2Ygc3RyaW5nIHBvaW50ZXJzOgorCis+Pj4gZnJvbSBjdHlwZXMgaW1wb3J0ICoKKz4+PiBhcnJheSA9IChjX2NoYXJfcCAqIDUpKCkKKz4+PiBwcmludCBhcnJheS5fb2JqZWN0cworTm9uZQorPj4+CisKK1RoZSBtZW1vcnkgYmxvY2sgc3RvcmVzIHBvaW50ZXJzIHRvIHN0cmluZ3MsIGFuZCB0aGUgc3RyaW5ncyBpdHNlbGYKK2Fzc2lnbmVkIGZyb20gUHl0aG9uIG11c3QgYmUga2VwdC4KKworPj4+IGFycmF5WzRdID0gJ2ZvbyBiYXInCis+Pj4gYXJyYXkuX29iamVjdHMKK3snNCc6ICdmb28gYmFyJ30KKz4+PiBhcnJheVs0XQorJ2ZvbyBiYXInCis+Pj4KKworSXQgZ2V0cyBtb3JlIGNvbXBsaWNhdGVkIHdoZW4gdGhlIGN0eXBlcyBpbnN0YW5jZSBpdHNlbGYgaXMgY29udGFpbmVkCitpbiBhICdiYXNlJyBvYmplY3QuCisKKz4+PiBjbGFzcyBYKFN0cnVjdHVyZSk6CisuLi4gICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwgKCJ5IiwgY19pbnQpLCAoImFycmF5IiwgY19jaGFyX3AgKiA1KV0KKy4uLgorPj4+IHggPSBYKCkKKz4+PiBwcmludCB4Ll9vYmplY3RzCitOb25lCis+Pj4KKworVGhlJ2FycmF5JyBhdHRyaWJ1dGUgb2YgdGhlICd4JyBvYmplY3Qgc2hhcmVzIHBhcnQgb2YgdGhlIG1lbW9yeSBidWZmZXIKK29mICd4JyAoJ19iX2Jhc2VfJyBpcyBlaXRoZXIgTm9uZSwgb3IgdGhlIHJvb3Qgb2JqZWN0IG93bmluZyB0aGUgbWVtb3J5IGJsb2NrKToKKworPj4+IHByaW50IHguYXJyYXkuX2JfYmFzZV8gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKzxjdHlwZXMudGVzdC50ZXN0X29iamVjdHMuWCBvYmplY3QgYXQgMHguLi4+Cis+Pj4KKworPj4+IHguYXJyYXlbMF0gPSAnc3BhbSBzcGFtIHNwYW0nCis+Pj4geC5fb2JqZWN0cworeycwOjInOiAnc3BhbSBzcGFtIHNwYW0nfQorPj4+IHguYXJyYXkuX2JfYmFzZV8uX29iamVjdHMKK3snMDoyJzogJ3NwYW0gc3BhbSBzcGFtJ30KKz4+PgorCisnJycKKworaW1wb3J0IHVuaXR0ZXN0LCBkb2N0ZXN0LCBzeXMKKworaW1wb3J0IGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cworCitjbGFzcyBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgaWYgc3lzLmhleHZlcnNpb24gPiAweDAyMDQwMDAwOgorICAgICAgICAjIFB5dGhvbiAyLjMgaGFzIG5vIEVMTElQU0lTIGZsYWcsIHNvIHdlIGRvbid0IHRlc3Qgd2l0aCB0aGlzCisgICAgICAgICMgdmVyc2lvbjoKKyAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICBkb2N0ZXN0LnRlc3Rtb2QoY3R5cGVzLnRlc3QudGVzdF9vYmplY3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGlmIHN5cy5oZXh2ZXJzaW9uID4gMHgwMjA0MDAwMDoKKyAgICAgICAgZG9jdGVzdC50ZXN0bW9kKGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzIzM2IzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzIzM2IzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3MDRkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CkBAIC0wLDAgKzEsMTg4IEBACitpbXBvcnQgdW5pdHRlc3QsIHN5cworCitjbGFzcyBTaW1wbGVUeXBlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaW1wb3J0IGN0eXBlcworICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IHNldF9jb252ZXJzaW9uX21vZGUKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wcmV2X2NvbnZfbW9kZSA9IHNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgc2V0X2NvbnZlcnNpb25fbW9kZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXRfY29udmVyc2lvbl9tb2RlKCpzZWxmLnByZXZfY29udl9tb2RlKQorCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc2VzKHNlbGYpOgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY192b2lkX3AsIGNfY2hhcl9wCisgICAgICAgICMgY3R5cGVzIDAuOS41IGFuZCBiZWZvcmUgZGlkIG92ZXJ3cml0ZSBmcm9tX3BhcmFtIGluIFNpbXBsZVR5cGVfbmV3CisgICAgICAgIGNsYXNzIENWT0lEUChjX3ZvaWRfcCk6CisgICAgICAgICAgICBkZWYgZnJvbV9wYXJhbShjbHMsIHZhbHVlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKiAyCisgICAgICAgICAgICBmcm9tX3BhcmFtID0gY2xhc3NtZXRob2QoZnJvbV9wYXJhbSkKKworICAgICAgICBjbGFzcyBDQ0hBUlAoY19jaGFyX3ApOgorICAgICAgICAgICAgZGVmIGZyb21fcGFyYW0oY2xzLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICogNAorICAgICAgICAgICAgZnJvbV9wYXJhbSA9IGNsYXNzbWV0aG9kKGZyb21fcGFyYW0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDVk9JRFAuZnJvbV9wYXJhbSgiYWJjIiksICJhYmNhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENDSEFSUC5mcm9tX3BhcmFtKCJhYmMiKSwgImFiY2FiY2FiY2FiYyIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfd2NoYXJfcAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBjbGFzcyBDV0NIQVJQKGNfd2NoYXJfcCk6CisgICAgICAgICAgICBkZWYgZnJvbV9wYXJhbShjbHMsIHZhbHVlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKiAzCisgICAgICAgICAgICBmcm9tX3BhcmFtID0gY2xhc3NtZXRob2QoZnJvbV9wYXJhbSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENXQ0hBUlAuZnJvbV9wYXJhbSgiYWJjIiksICJhYmNhYmNhYmMiKQorCisgICAgIyBYWFggUmVwbGFjZSBieSBjX2NoYXJfcCB0ZXN0cworICAgIGRlZiB0ZXN0X2NzdHJpbmdzKHNlbGYpOgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19jaGFyX3AsIGJ5cmVmCisKKyAgICAgICAgIyBjX2NoYXJfcC5mcm9tX3BhcmFtIG9uIGEgUHl0aG9uIFN0cmluZyBwYWNrcyB0aGUgc3RyaW5nCisgICAgICAgICMgaW50byBhIGNwYXJhbSBvYmplY3QKKyAgICAgICAgcyA9ICIxMjMiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2NoYXJfcC5mcm9tX3BhcmFtKHMpLl9vYmogaXMgcykKKworICAgICAgICAjIG5ldyBpbiAwLjkuMTogY29udmVydCAoZW5jb2RlKSB1bmljb2RlIHRvIGFzY2lpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY19jaGFyX3AuZnJvbV9wYXJhbSh1IjEyMyIpLl9vYmosICIxMjMiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIGNfY2hhcl9wLmZyb21fcGFyYW0sIHUiMTIzXDM3NyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX2NoYXJfcC5mcm9tX3BhcmFtLCA0MikKKworICAgICAgICAjIGNhbGxpbmcgY19jaGFyX3AuZnJvbV9wYXJhbSB3aXRoIGEgY19jaGFyX3AgaW5zdGFuY2UKKyAgICAgICAgIyByZXR1cm5zIHRoZSBhcmd1bWVudCBpdHNlbGY6CisgICAgICAgIGEgPSBjX2NoYXJfcCgiMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfY2hhcl9wLmZyb21fcGFyYW0oYSkgaXMgYSkKKworICAgIGRlZiB0ZXN0X2N3X3N0cmluZ3Moc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBieXJlZgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY193Y2hhcl9wCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyMjICAgICAgICAgICAgcHJpbnQgIihObyBjX3djaGFyX3ApIgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHMgPSB1IjEyMyIKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY193Y2hhcl9wLmZyb21fcGFyYW0ocykuX29iaiBpcyBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3djaGFyX3AuZnJvbV9wYXJhbSwgNDIpCisKKyAgICAgICAgICAgICMgbmV3IGluIDAuOS4xOiBjb252ZXJ0IChkZWNvZGUpIGFzY2lpIHRvIHVuaWNvZGUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY193Y2hhcl9wLmZyb21fcGFyYW0oIjEyMyIpLl9vYmosIHUiMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBjX3djaGFyX3AuZnJvbV9wYXJhbSwgIjEyM1wzNzciKQorCisgICAgICAgIHBhID0gY193Y2hhcl9wLmZyb21fcGFyYW0oY193Y2hhcl9wKHUiMTIzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShwYSksIGNfd2NoYXJfcCkKKworICAgIGRlZiB0ZXN0X2ludF9wb2ludGVycyhzZWxmKToKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgUE9JTlRFUiwgcG9pbnRlcgorICAgICAgICBMUElOVCA9IFBPSU5URVIoY19pbnQpCisKKyMjICAgICAgICBwID0gcG9pbnRlcihjX2ludCg0MikpCisjIyAgICAgICAgeCA9IExQSU5ULmZyb21fcGFyYW0ocCkKKyAgICAgICAgeCA9IExQSU5ULmZyb21fcGFyYW0ocG9pbnRlcihjX2ludCg0MikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguY29udGVudHMudmFsdWUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExQSU5UKGNfaW50KDQyKSkuY29udGVudHMudmFsdWUsIDQyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTFBJTlQuZnJvbV9wYXJhbShOb25lKSwgTm9uZSkKKworICAgICAgICBpZiBjX2ludCAhPSBjX2xvbmc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIHBvaW50ZXIoY19sb25nKDQyKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBJTlQuZnJvbV9wYXJhbSwgcG9pbnRlcihjX3VpbnQoNDIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBMUElOVC5mcm9tX3BhcmFtLCBwb2ludGVyKGNfc2hvcnQoNDIpKSkKKworICAgIGRlZiB0ZXN0X2J5cmVmX3BvaW50ZXIoc2VsZik6CisgICAgICAgICMgVGhlIGZyb21fcGFyYW0gY2xhc3MgbWV0aG9kIG9mIFBPSU5URVIodHlwKSBjbGFzc2VzIGFjY2VwdHMgd2hhdCBpcworICAgICAgICAjIHJldHVybmVkIGJ5IGJ5cmVmKG9iaiksIGl0IHR5cGUob2JqKSA9PSB0eXAKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgcG9pbnRlciwgUE9JTlRFUiwgYnlyZWYKKyAgICAgICAgTFBJTlQgPSBQT0lOVEVSKGNfaW50KQorCisgICAgICAgIExQSU5ULmZyb21fcGFyYW0oYnlyZWYoY19pbnQoNDIpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIGJ5cmVmKGNfc2hvcnQoMjIpKSkKKyAgICAgICAgaWYgY19pbnQgIT0gY19sb25nOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBMUElOVC5mcm9tX3BhcmFtLCBieXJlZihjX2xvbmcoMjIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBMUElOVC5mcm9tX3BhcmFtLCBieXJlZihjX3VpbnQoMjIpKSkKKworICAgIGRlZiB0ZXN0X2J5cmVmX3BvaW50ZXJwb2ludGVyKHNlbGYpOgorICAgICAgICAjIFNlZSBhYm92ZQorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19zaG9ydCwgY191aW50LCBjX2ludCwgY19sb25nLCBwb2ludGVyLCBQT0lOVEVSLCBieXJlZgorCisgICAgICAgIExQTFBJTlQgPSBQT0lOVEVSKFBPSU5URVIoY19pbnQpKQorICAgICAgICBMUExQSU5ULmZyb21fcGFyYW0oYnlyZWYocG9pbnRlcihjX2ludCg0MikpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQTFBJTlQuZnJvbV9wYXJhbSwgYnlyZWYocG9pbnRlcihjX3Nob3J0KDIyKSkpKQorICAgICAgICBpZiBjX2ludCAhPSBjX2xvbmc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQTFBJTlQuZnJvbV9wYXJhbSwgYnlyZWYocG9pbnRlcihjX2xvbmcoMjIpKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBMUElOVC5mcm9tX3BhcmFtLCBieXJlZihwb2ludGVyKGNfdWludCgyMikpKSkKKworICAgIGRlZiB0ZXN0X2FycmF5X3BvaW50ZXJzKHNlbGYpOgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19zaG9ydCwgY191aW50LCBjX2ludCwgY19sb25nLCBQT0lOVEVSCisgICAgICAgIElOVEFSUkFZID0gY19pbnQgKiAzCisgICAgICAgIGlhID0gSU5UQVJSQVkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpYSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2lhW2ldIGZvciBpIGluIHJhbmdlKDMpXSwgWzAsIDAsIDBdKQorCisgICAgICAgICMgUG9pbnRlcnMgYXJlIG9ubHkgY29tcGF0aWJsZSB3aXRoIGFycmF5cyBjb250YWluaW5nIGl0ZW1zIG9mCisgICAgICAgICMgdGhlIHNhbWUgdHlwZSEKKyAgICAgICAgTFBJTlQgPSBQT0lOVEVSKGNfaW50KQorICAgICAgICBMUElOVC5mcm9tX3BhcmFtKChjX2ludCozKSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIGNfc2hvcnQqMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBMUElOVC5mcm9tX3BhcmFtLCBjX2xvbmcqMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBMUElOVC5mcm9tX3BhcmFtLCBjX3VpbnQqMykKKworIyMgICAgZGVmIHRlc3RfcGVyZm9ybWFuY2Uoc2VsZik6CisjIyAgICAgICAgY2hlY2tfcGVyZigpCisKKyAgICBkZWYgdGVzdF9ub2N0eXBlc19hcmd0eXBlKHNlbGYpOgorICAgICAgICBpbXBvcnQgX2N0eXBlc190ZXN0CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBDRExMLCBjX3ZvaWRfcCwgQXJndW1lbnRFcnJvcgorCisgICAgICAgIGZ1bmMgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3ZvaWRfcAorICAgICAgICAjIFR5cGVFcnJvcjogaGFzIG5vIGZyb21fcGFyYW0gbWV0aG9kCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgZnVuYywgImFyZ3R5cGVzIiwgKG9iamVjdCwpKQorCisgICAgICAgIGNsYXNzIEFkYXB0ZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgb2JqKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoQWRhcHRlcigpLCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKE5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMob2JqZWN0KCkpLCBOb25lKQorCisgICAgICAgIGNsYXNzIEFkYXB0ZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgb2JqKToKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqCisKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IChBZGFwdGVyKCksKQorICAgICAgICAjIGRvbid0IGtub3cgaG93IHRvIGNvbnZlcnQgcGFyYW1ldGVyIDEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgZnVuYywgb2JqZWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyhjX3ZvaWRfcCg0MikpLCA0MikKKworICAgICAgICBjbGFzcyBBZGFwdGVyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZnJvbV9wYXJhbShjbHMsIG9iaik6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihvYmopCisKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IChBZGFwdGVyKCksKQorICAgICAgICAjIEFyZ3VtZW50RXJyb3I6IGFyZ3VtZW50IDE6IFZhbHVlRXJyb3I6IDk5CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIGZ1bmMsIDk5KQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTE2ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTE2ODY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wZXAzMTE4LnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2NDczYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wZXAzMTE4LnB5CkBAIC0wLDAgKzEsMTk2IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgcmUsIHN5cworCitpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgIFRISVNfRU5ESUFOID0gIjwiCisgICAgT1RIRVJfRU5ESUFOID0gIj4iCitlbHNlOgorICAgIFRISVNfRU5ESUFOID0gIj4iCisgICAgT1RIRVJfRU5ESUFOID0gIjwiCisKK2RlZiBub3JtYWxpemUoZm9ybWF0KToKKyAgICAjIFJlbW92ZSBjdXJyZW50IGVuZGlhbiBzcGVjaWZpZXIgYW5kIHdoaXRlIHNwYWNlIGZyb20gYSBmb3JtYXQKKyAgICAjIHN0cmluZworICAgIGlmIGZvcm1hdCBpcyBOb25lOgorICAgICAgICByZXR1cm4gIiIKKyAgICBmb3JtYXQgPSBmb3JtYXQucmVwbGFjZShPVEhFUl9FTkRJQU4sIFRISVNfRU5ESUFOKQorICAgIHJldHVybiByZS5zdWIociJccyIsICIiLCBmb3JtYXQpCisKK2NsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbmF0aXZlX3R5cGVzKHNlbGYpOgorICAgICAgICBmb3IgdHAsIGZtdCwgc2hhcGUsIGl0ZW10cCBpbiBuYXRpdmVfdHlwZXM6CisgICAgICAgICAgICBvYiA9IHRwKCkKKyAgICAgICAgICAgIHYgPSBtZW1vcnl2aWV3KG9iKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybWFsaXplKHYuZm9ybWF0KSwgbm9ybWFsaXplKGZtdCkpCisgICAgICAgICAgICAgICAgaWYgc2hhcGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHYpLCBzaGFwZVswXSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2KSAqIHNpemVvZihpdGVtdHApLCBzaXplb2Yob2IpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi5pdGVtc2l6ZSwgc2l6ZW9mKGl0ZW10cCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnNoYXBlLCBzaGFwZSkKKyAgICAgICAgICAgICAgICAjIGN0eXBlcyBvYmplY3QgYWx3YXlzIGhhdmUgYSBub24tc3RyaWRlZCBtZW1vcnkgYmxvY2sKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuc3RyaWRlcywgTm9uZSkKKyAgICAgICAgICAgICAgICAjIHRoZXkgYXJlIGFsd2F5cyByZWFkL3dyaXRlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh2LnJlYWRvbmx5KQorCisgICAgICAgICAgICAgICAgaWYgdi5zaGFwZToKKyAgICAgICAgICAgICAgICAgICAgbiA9IDEKKyAgICAgICAgICAgICAgICAgICAgZm9yIGRpbSBpbiB2LnNoYXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG4gKiBkaW0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuICogdi5pdGVtc2l6ZSwgbGVuKHYudG9ieXRlcygpKSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIHNvIHRoYXQgd2UgY2FuIHNlZSB0aGUgZmFpbGluZyB0eXBlCisgICAgICAgICAgICAgICAgcHJpbnQodHApCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiB0ZXN0X2VuZGlhbl90eXBlcyhzZWxmKToKKyAgICAgICAgZm9yIHRwLCBmbXQsIHNoYXBlLCBpdGVtdHAgaW4gZW5kaWFuX3R5cGVzOgorICAgICAgICAgICAgb2IgPSB0cCgpCisgICAgICAgICAgICB2ID0gbWVtb3J5dmlldyhvYikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuZm9ybWF0LCBmbXQpCisgICAgICAgICAgICAgICAgaWYgc2hhcGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHYpLCBzaGFwZVswXSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2KSAqIHNpemVvZihpdGVtdHApLCBzaXplb2Yob2IpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi5pdGVtc2l6ZSwgc2l6ZW9mKGl0ZW10cCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnNoYXBlLCBzaGFwZSkKKyAgICAgICAgICAgICAgICAjIGN0eXBlcyBvYmplY3QgYWx3YXlzIGhhdmUgYSBub24tc3RyaWRlZCBtZW1vcnkgYmxvY2sKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuc3RyaWRlcywgTm9uZSkKKyAgICAgICAgICAgICAgICAjIHRoZXkgYXJlIGFsd2F5cyByZWFkL3dyaXRlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh2LnJlYWRvbmx5KQorCisgICAgICAgICAgICAgICAgaWYgdi5zaGFwZToKKyAgICAgICAgICAgICAgICAgICAgbiA9IDEKKyAgICAgICAgICAgICAgICAgICAgZm9yIGRpbSBpbiB2LnNoYXBlOgorICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG4gKiBkaW0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuLCBsZW4odikpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBzbyB0aGF0IHdlIGNhbiBzZWUgdGhlIGZhaWxpbmcgdHlwZQorICAgICAgICAgICAgICAgIHByaW50KHRwKQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyMgZGVmaW5lIHNvbWUgc3RydWN0dXJlIGNsYXNzZXMKKworY2xhc3MgUG9pbnQoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoIngiLCBjX2xvbmcpLCAoInkiLCBjX2xvbmcpXQorCitjbGFzcyBQYWNrZWRQb2ludChTdHJ1Y3R1cmUpOgorICAgIF9wYWNrXyA9IDIKKyAgICBfZmllbGRzXyA9IFsoIngiLCBjX2xvbmcpLCAoInkiLCBjX2xvbmcpXQorCitjbGFzcyBQb2ludDIoU3RydWN0dXJlKToKKyAgICBwYXNzCitQb2ludDIuX2ZpZWxkc18gPSBbKCJ4IiwgY19sb25nKSwgKCJ5IiwgY19sb25nKV0KKworY2xhc3MgRW1wdHlTdHJ1Y3QoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFtdCisKK2NsYXNzIGFVbmlvbihVbmlvbik6CisgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpXQorCitjbGFzcyBJbmNvbXBsZXRlKFN0cnVjdHVyZSk6CisgICAgcGFzcworCitjbGFzcyBDb21wbGV0ZShTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1BDb21wbGV0ZSA9IFBPSU5URVIoQ29tcGxldGUpCitDb21wbGV0ZS5fZmllbGRzXyA9IFsoImEiLCBjX2xvbmcpXQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRoaXMgdGFibGUgY29udGFpbnMgZm9ybWF0IHN0cmluZ3MgYXMgdGhleSBsb29rIG9uIGxpdHRsZSBlbmRpYW4KKyMgbWFjaGluZXMuICBUaGUgdGVzdCByZXBsYWNlcyAnPCcgd2l0aCAnPicgb24gYmlnIGVuZGlhbiBtYWNoaW5lcy4KKyMKK25hdGl2ZV90eXBlcyA9IFsKKyAgICAjIHR5cGUgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ICAgICAgICAgICAgICAgICAgc2hhcGUgICAgICAgICAgIGNhbGMgaXRlbXNpemUKKworICAgICMjIHNpbXBsZSB0eXBlcworCisgICAgKGNfY2hhciwgICAgICAgICAgICAgICAgICAgICI8YyIsICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBjX2NoYXIpLAorICAgIChjX2J5dGUsICAgICAgICAgICAgICAgICAgICAiPGIiLCAgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgY19ieXRlKSwKKyAgICAoY191Ynl0ZSwgICAgICAgICAgICAgICAgICAgIjxCIiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIGNfdWJ5dGUpLAorICAgIChjX3Nob3J0LCAgICAgICAgICAgICAgICAgICAiPGgiLCAgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgY19zaG9ydCksCisgICAgKGNfdXNob3J0LCAgICAgICAgICAgICAgICAgICI8SCIsICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBjX3VzaG9ydCksCisKKyAgICAjIGNfaW50IGFuZCBjX3VpbnQgbWF5IGJlIGFsaWFzZXMgdG8gY19sb25nCisgICAgIyhjX2ludCwgICAgICAgICAgICAgICAgICAgICAiPGkiLCAgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgY19pbnQpLAorICAgICMoY191aW50LCAgICAgICAgICAgICAgICAgICAgIjxJIiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIGNfdWludCksCisKKyAgICAoY19sb25nLCAgICAgICAgICAgICAgICAgICAgIjxsIiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIGNfbG9uZyksCisgICAgKGNfdWxvbmcsICAgICAgICAgICAgICAgICAgICI8TCIsICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBjX3Vsb25nKSwKKworICAgICMgY19sb25nbG9uZyBhbmQgY191bG9uZ2xvbmcgYXJlIGFsaWFzZXMgb24gNjQtYml0IHBsYXRmb3JtcworICAgICMoY19sb25nbG9uZywgICAgICAgICAgICAgICAgIjxxIiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIGNfbG9uZ2xvbmcpLAorICAgICMoY191bG9uZ2xvbmcsICAgICAgICAgICAgICAgIjxRIiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIGNfdWxvbmdsb25nKSwKKworICAgIChjX2Zsb2F0LCAgICAgICAgICAgICAgICAgICAiPGYiLCAgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgY19mbG9hdCksCisgICAgKGNfZG91YmxlLCAgICAgICAgICAgICAgICAgICI8ZCIsICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBjX2RvdWJsZSksCisgICAgIyBjX2xvbmdkb3VibGUgbWF5IGJlIGFuIGFsaWFzIHRvIGNfZG91YmxlCisKKyAgICAoY19ib29sLCAgICAgICAgICAgICAgICAgICAgIjw/IiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIGNfYm9vbCksCisgICAgKHB5X29iamVjdCwgICAgICAgICAgICAgICAgICI8TyIsICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBweV9vYmplY3QpLAorCisgICAgIyMgcG9pbnRlcnMKKworICAgIChQT0lOVEVSKGNfYnl0ZSksICAgICAgICAgICAiJjxiIiwgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgUE9JTlRFUihjX2J5dGUpKSwKKyAgICAoUE9JTlRFUihQT0lOVEVSKGNfbG9uZykpLCAgIiYmPGwiLCAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIFBPSU5URVIoUE9JTlRFUihjX2xvbmcpKSksCisKKyAgICAjIyBhcnJheXMgYW5kIHBvaW50ZXJzCisKKyAgICAoY19kb3VibGUgKiA0LCAgICAgICAgICAgICAgIig0KTxkIiwgICAgICAgICAgICAgICAgKDQsKSwgICAgICAgICAgIGNfZG91YmxlKSwKKyAgICAoY19mbG9hdCAqIDQgKiAzICogMiwgICAgICAgIigyLDMsNCk8ZiIsICAgICAgICAgICAgKDIsMyw0KSwgICAgICAgIGNfZmxvYXQpLAorICAgIChQT0lOVEVSKGNfc2hvcnQpICogMiwgICAgICAiKDIpJjxoIiwgICAgICAgICAgICAgICAoMiwpLCAgICAgICAgICAgUE9JTlRFUihjX3Nob3J0KSksCisgICAgKFBPSU5URVIoY19zaG9ydCkgKiAyICogMywgICIoMywyKSY8aCIsICAgICAgICAgICAgICgzLDIsKSwgICAgICAgICBQT0lOVEVSKGNfc2hvcnQpKSwKKyAgICAoUE9JTlRFUihjX3Nob3J0ICogMiksICAgICAgIiYoMik8aCIsICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIFBPSU5URVIoY19zaG9ydCkpLAorCisgICAgIyMgc3RydWN0dXJlcyBhbmQgdW5pb25zCisKKyAgICAoUG9pbnQsICAgICAgICAgICAgICAgICAgICAgIlR7PGw6eDo8bDp5On0iLCAgICAgICAgTm9uZSwgICAgICAgICAgIFBvaW50KSwKKyAgICAjIHBhY2tlZCBzdHJ1Y3R1cmVzIGRvIG5vdCBpbXBsZW1lbnQgdGhlIHBlcAorICAgIChQYWNrZWRQb2ludCwgICAgICAgICAgICAgICAiQiIsICAgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgUGFja2VkUG9pbnQpLAorICAgIChQb2ludDIsICAgICAgICAgICAgICAgICAgICAiVHs8bDp4OjxsOnk6fSIsICAgICAgICBOb25lLCAgICAgICAgICAgUG9pbnQyKSwKKyAgICAoRW1wdHlTdHJ1Y3QsICAgICAgICAgICAgICAgIlR7fSIsICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIEVtcHR5U3RydWN0KSwKKyAgICAjIHRoZSBwZXAgZG9lcyd0IHN1cHBvcnQgdW5pb25zCisgICAgKGFVbmlvbiwgICAgICAgICAgICAgICAgICAgICJCIiwgICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBhVW5pb24pLAorCisgICAgIyMgcG9pbnRlciB0byBpbmNvbXBsZXRlIHN0cnVjdHVyZQorICAgIChJbmNvbXBsZXRlLCAgICAgICAgICAgICAgICAiQiIsICAgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgSW5jb21wbGV0ZSksCisgICAgKFBPSU5URVIoSW5jb21wbGV0ZSksICAgICAgICImQiIsICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBQT0lOVEVSKEluY29tcGxldGUpKSwKKworICAgICMgJ0NvbXBsZXRlJyBpcyBhIHN0cnVjdHVyZSB0aGF0IHN0YXJ0cyBpbmNvbXBsZXRlLCBidXQgaXMgY29tcGxldGVkIGFmdGVyIHRoZQorICAgICMgcG9pbnRlciB0eXBlIHRvIGl0IGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgKENvbXBsZXRlLCAgICAgICAgICAgICAgICAgICJUezxsOmE6fSIsICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBDb21wbGV0ZSksCisgICAgIyBVbmZvcnR1bmF0ZWx5IHRoZSBwb2ludGVyIGZvcm1hdCBzdHJpbmcgaXMgbm90IGZpeGVkLi4uCisgICAgKFBPSU5URVIoQ29tcGxldGUpLCAgICAgICAgICImQiIsICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBQT0lOVEVSKENvbXBsZXRlKSksCisKKyAgICAjIyBvdGhlcgorCisgICAgIyBmdW5jdGlvbiBzaWduYXR1cmVzIGFyZSBub3QgaW1wbGVtZW50ZWQKKyAgICAoQ0ZVTkNUWVBFKE5vbmUpLCAgICAgICAgICAgIlh7fSIsICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIENGVU5DVFlQRShOb25lKSksCisKKyAgICBdCisKK2NsYXNzIEJFUG9pbnQoQmlnRW5kaWFuU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoIngiLCBjX2xvbmcpLCAoInkiLCBjX2xvbmcpXQorCitjbGFzcyBMRVBvaW50KExpdHRsZUVuZGlhblN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19sb25nKSwgKCJ5IiwgY19sb25nKV0KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUaGlzIHRhYmxlIGNvbnRhaW5zIGZvcm1hdCBzdHJpbmdzIGFzIHRoZXkgcmVhbGx5IGxvb2ssIG9uIGJvdGggYmlnCisjIGFuZCBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzLgorIworZW5kaWFuX3R5cGVzID0gWworICAgIChCRVBvaW50LCAgICAgICAgICAgICAgICAgICAiVHs+bDp4Oj5sOnk6fSIsICAgICAgICBOb25lLCAgICAgICAgICAgQkVQb2ludCksCisgICAgKExFUG9pbnQsICAgICAgICAgICAgICAgICAgICJUezxsOng6PGw6eTp9IiwgICAgICAgIE5vbmUsICAgICAgICAgICBMRVBvaW50KSwKKyAgICAoUE9JTlRFUihCRVBvaW50KSwgICAgICAgICAgIiZUez5sOng6Pmw6eTp9IiwgICAgICAgTm9uZSwgICAgICAgICAgIFBPSU5URVIoQkVQb2ludCkpLAorICAgIChQT0lOVEVSKExFUG9pbnQpLCAgICAgICAgICAiJlR7PGw6eDo8bDp5On0iLCAgICAgICBOb25lLCAgICAgICAgICAgUE9JTlRFUihMRVBvaW50KSksCisgICAgXQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZGEwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZGEwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BpY2tsaW5nLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BpY2tsaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNmNiZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGlja2xpbmcucHkKQEAgLTAsMCArMSw4MyBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgcGlja2xlCitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IF9jdHlwZXNfdGVzdAorZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisKK2NsYXNzIFgoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksICgiYiIsIGNfZG91YmxlKV0KKyAgICBpbml0X2NhbGxlZCA9IDAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICBYLmluaXRfY2FsbGVkICs9IDEKKyAgICAgICAgc2VsZi54ID0gNDIKKworY2xhc3MgWShYKToKKyAgICBfZmllbGRzXyA9IFsoInN0ciIsIGNfY2hhcl9wKV0KKworY2xhc3MgUGlja2xlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGR1bXBzKHNlbGYsIGl0ZW0pOgorICAgICAgICByZXR1cm4gcGlja2xlLmR1bXBzKGl0ZW0pCisKKyAgICBkZWYgbG9hZHMoc2VsZiwgaXRlbSk6CisgICAgICAgIHJldHVybiBwaWNrbGUubG9hZHMoaXRlbSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgZm9yIHNyYyBpbiBbCisgICAgICAgICAgICBjX2ludCg0MiksCisgICAgICAgICAgICBjX2RvdWJsZSgzLjE0KSwKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICBkc3QgPSBzZWxmLmxvYWRzKHNlbGYuZHVtcHMoc3JjKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3JjLl9fZGljdF9fLCBkc3QuX19kaWN0X18pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbW9yeXZpZXcoc3JjKS50b2J5dGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnl2aWV3KGRzdCkudG9ieXRlcygpKQorCisgICAgZGVmIHRlc3Rfc3RydWN0KHNlbGYpOgorICAgICAgICBYLmluaXRfY2FsbGVkID0gMAorCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgeC5hID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmluaXRfY2FsbGVkLCAxKQorCisgICAgICAgIHkgPSBzZWxmLmxvYWRzKHNlbGYuZHVtcHMoeCkpCisKKyAgICAgICAgIyBsb2FkcyBtdXN0IE5PVCBjYWxsIF9faW5pdF9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5pbml0X2NhbGxlZCwgMSkKKworICAgICAgICAjIGN0eXBlcyBpbnN0YW5jZXMgYXJlIGlkZW50aWNhbCB3aGVuIHRoZSBpbnN0YW5jZSBfX2RpY3RfXworICAgICAgICAjIGFuZCB0aGUgbWVtb3J5IGJ1ZmZlciBhcmUgaWRlbnRpY2FsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fX2RpY3RfXywgeC5fX2RpY3RfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1vcnl2aWV3KHkpLnRvYnl0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5dmlldyh4KS50b2J5dGVzKCkpCisKKyAgICBkZWYgdGVzdF91bnBpY2thYmxlKHNlbGYpOgorICAgICAgICAjIGN0eXBlcyBvYmplY3RzIHRoYXQgYXJlIHBvaW50ZXJzIG9yIGNvbnRhaW4gcG9pbnRlcnMgYXJlCisgICAgICAgICMgdW5waWNrYWJsZS4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBzZWxmLmR1bXBzKFkoKSkpCisKKyAgICAgICAgcHJvdG90eXBlID0gQ0ZVTkNUWVBFKGNfaW50KQorCisgICAgICAgIGZvciBpdGVtIGluIFsKKyAgICAgICAgICAgIGNfY2hhcl9wKCksCisgICAgICAgICAgICBjX3djaGFyX3AoKSwKKyAgICAgICAgICAgIGNfdm9pZF9wKCksCisgICAgICAgICAgICBwb2ludGVyKGNfaW50KDQyKSksCisgICAgICAgICAgICBkbGwuX3Rlc3RmdW5jX3BfcCwKKyAgICAgICAgICAgIHByb3RvdHlwZShsYW1iZGE6IDQyKSwKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IHNlbGYuZHVtcHMoaXRlbSkpCisKKyAgICBkZWYgdGVzdF93Y2hhcihzZWxmKToKKyAgICAgICAgcGlja2xlLmR1bXBzKGNfY2hhcigieCIpKQorICAgICAgICAjIElzc3VlIDUwNDkKKyAgICAgICAgcGlja2xlLmR1bXBzKGNfd2NoYXIodSJ4IikpCisKK2NsYXNzIFBpY2tsZVRlc3RfMShQaWNrbGVUZXN0KToKKyAgICBkZWYgZHVtcHMoc2VsZiwgaXRlbSk6CisgICAgICAgIHJldHVybiBwaWNrbGUuZHVtcHMoaXRlbSwgMSkKKworY2xhc3MgUGlja2xlVGVzdF8yKFBpY2tsZVRlc3QpOgorICAgIGRlZiBkdW1wcyhzZWxmLCBpdGVtKToKKyAgICAgICAgcmV0dXJuIHBpY2tsZS5kdW1wcyhpdGVtLCAyKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BpY2tsaW5nLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9waWNrbGluZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0NmY5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9waWNrbGluZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BpY2tsaW5nLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9waWNrbGluZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0NmY5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9waWNrbGluZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjhjZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkKQEAgLTAsMCArMSwxOTIgQEAKK2ltcG9ydCB1bml0dGVzdCwgc3lzCisKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgX2N0eXBlc190ZXN0CisKK2N0eXBlX3R5cGVzID0gW2NfYnl0ZSwgY191Ynl0ZSwgY19zaG9ydCwgY191c2hvcnQsIGNfaW50LCBjX3VpbnQsCisgICAgICAgICAgICAgICAgIGNfbG9uZywgY191bG9uZywgY19sb25nbG9uZywgY191bG9uZ2xvbmcsIGNfZG91YmxlLCBjX2Zsb2F0XQorcHl0aG9uX3R5cGVzID0gW2ludCwgaW50LCBpbnQsIGludCwgaW50LCBsb25nLAorICAgICAgICAgICAgICAgIGludCwgbG9uZywgbG9uZywgbG9uZywgZmxvYXQsIGZsb2F0XQorCitjbGFzcyBQb2ludGVyc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3BvaW50ZXJfY3Jhc2goc2VsZik6CisKKyAgICAgICAgY2xhc3MgQShQT0lOVEVSKGNfdWxvbmcpKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBQT0lOVEVSKGNfdWxvbmcpKGNfdWxvbmcoMjIpKQorICAgICAgICAjIFBvaW50ZXIgY2FuJ3Qgc2V0IGNvbnRlbnRzOiBoYXMgbm8gX3R5cGVfCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgQSwgY191bG9uZygzMykpCisKKyAgICBkZWYgdGVzdF9wYXNzX3BvaW50ZXJzKHNlbGYpOgorICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgZnVuYyA9IGRsbC5fdGVzdGZ1bmNfcF9wCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfbG9uZworCisgICAgICAgIGkgPSBjX2ludCgxMjM0NTY3OCkKKyMjICAgICAgICBmdW5jLmFyZ3R5cGVzID0gKFBPSU5URVIoY19pbnQpLCkKKyAgICAgICAgYWRkcmVzcyA9IGZ1bmMoYnlyZWYoaSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY19pbnQuZnJvbV9hZGRyZXNzKGFkZHJlc3MpLnZhbHVlLCAxMjM0NTY3OCkKKworICAgICAgICBmdW5jLnJlc3R5cGUgPSBQT0lOVEVSKGNfaW50KQorICAgICAgICByZXMgPSBmdW5jKHBvaW50ZXIoaSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLmNvbnRlbnRzLnZhbHVlLCAxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMF0sIDEyMzQ1Njc4KQorCisgICAgZGVmIHRlc3RfY2hhbmdlX3BvaW50ZXJzKHNlbGYpOgorICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgZnVuYyA9IGRsbC5fdGVzdGZ1bmNfcF9wCisKKyAgICAgICAgaSA9IGNfaW50KDg3NjU0KQorICAgICAgICBmdW5jLnJlc3R5cGUgPSBQT0lOVEVSKGNfaW50KQorICAgICAgICBmdW5jLmFyZ3R5cGVzID0gKFBPSU5URVIoY19pbnQpLCkKKworICAgICAgICByZXMgPSBmdW5jKHBvaW50ZXIoaSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzBdLCA4NzY1NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuY29udGVudHMudmFsdWUsIDg3NjU0KQorCisgICAgICAgICMgQyBjb2RlOiAqcmVzID0gNTQzNDUKKyAgICAgICAgcmVzWzBdID0gNTQzNDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLnZhbHVlLCA1NDM0NSkKKworICAgICAgICAjIEMgY29kZToKKyAgICAgICAgIyAgIGludCB4ID0gMTIzMjE7CisgICAgICAgICMgICByZXMgPSAmeAorICAgICAgICByZXMuY29udGVudHMgPSBjX2ludCgxMjMyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLnZhbHVlLCA1NDM0NSkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrc193aXRoX3BvaW50ZXJzKHNlbGYpOgorICAgICAgICAjIGEgZnVuY3Rpb24gdHlwZSByZWNlaXZpbmcgYSBwb2ludGVyCisgICAgICAgIFBST1RPVFlQRSA9IENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihjX2ludCkpCisKKyAgICAgICAgc2VsZi5yZXN1bHQgPSBbXQorCisgICAgICAgIGRlZiBmdW5jKGFyZyk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisjIyAgICAgICAgICAgICAgICBwcmludCBhcmdbaV0sCisgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQuYXBwZW5kKGFyZ1tpXSkKKyMjICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGNhbGxiYWNrID0gUFJPVE9UWVBFKGZ1bmMpCisKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgICMgVGhpcyBmdW5jdGlvbiBleHBlY3RzIGEgZnVuY3Rpb24gcG9pbnRlciwKKyAgICAgICAgIyBhbmQgY2FsbHMgdGhpcyB3aXRoIGFuIGludGVnZXIgcG9pbnRlciBhcyBwYXJhbWV0ZXIuCisgICAgICAgICMgVGhlIGludCBwb2ludGVyIHBvaW50cyB0byBhIHRhYmxlIGNvbnRhaW5pbmcgdGhlIG51bWJlcnMgMS4uMTAKKyAgICAgICAgZG9pdCA9IGRsbC5fdGVzdGZ1bmNfY2FsbGJhY2tfd2l0aF9wb2ludGVyCisKKyMjICAgICAgICBpID0gY19pbnQoNDIpCisjIyAgICAgICAgY2FsbGJhY2soYnlyZWYoaSkpCisjIyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGkudmFsdWUgPT0gODQpCisKKyAgICAgICAgZG9pdChjYWxsYmFjaykKKyMjICAgICAgICBwcmludCBzZWxmLnJlc3VsdAorICAgICAgICBkb2l0KGNhbGxiYWNrKQorIyMgICAgICAgIHByaW50IHNlbGYucmVzdWx0CisKKyAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CisgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGRlbGl0ZW0KKyAgICAgICAgZm9yIGN0LCBwdCBpbiB6aXAoY3R5cGVfdHlwZXMsIHB5dGhvbl90eXBlcyk6CisgICAgICAgICAgICBpID0gY3QoNDIpCisgICAgICAgICAgICBwID0gcG9pbnRlcihpKQorIyMgICAgICAgICAgICBwcmludCB0eXBlKHAuY29udGVudHMpLCBjdAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocC5jb250ZW50cykgaXMgY3QpCisgICAgICAgICAgICAjIHAuY29udGVudHMgaXMgdGhlIHNhbWUgYXMgcFswXQorIyMgICAgICAgICAgICBwcmludCBwLmNvbnRlbnRzCisjIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwLmNvbnRlbnRzID09IDQyKQorIyMgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocFswXSA9PSA0MikKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkZWxpdGVtLCBwLCAwKQorCisgICAgZGVmIHRlc3RfZnJvbV9hZGRyZXNzKHNlbGYpOgorICAgICAgICBmcm9tIGFycmF5IGltcG9ydCBhcnJheQorICAgICAgICBhID0gYXJyYXkoJ2knLCBbMTAwLCAyMDAsIDMwMCwgNDAwLCA1MDBdKQorICAgICAgICBhZGRyID0gYS5idWZmZXJfaW5mbygpWzBdCisKKyAgICAgICAgcCA9IFBPSU5URVIoUE9JTlRFUihjX2ludCkpCisjIyAgICAgICAgcHJpbnQgZGlyKHApCisjIyAgICAgICAgcHJpbnQgcC5mcm9tX2FkZHJlc3MKKyMjICAgICAgICBwcmludCBwLmZyb21fYWRkcmVzcyhhZGRyKVswXVswXQorCisgICAgZGVmIHRlc3Rfb3RoZXIoc2VsZik6CisgICAgICAgIGNsYXNzIFRhYmxlKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX2ludCldCisKKyAgICAgICAgcHQgPSBwb2ludGVyKFRhYmxlKDEsIDIsIDMpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHQuY29udGVudHMuYSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwdC5jb250ZW50cy5iLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB0LmNvbnRlbnRzLmMsIDMpCisKKyAgICAgICAgcHQuY29udGVudHMuYyA9IDMzCisKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IF9wb2ludGVyX3R5cGVfY2FjaGUKKyAgICAgICAgZGVsIF9wb2ludGVyX3R5cGVfY2FjaGVbVGFibGVdCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgcCA9IHBvaW50ZXIoY19pbnQoNDIpKQorICAgICAgICAjIEFsdGhvdWdoIGEgcG9pbnRlciBjYW4gYmUgaW5kZXhlZCwgaXQgaGEgbm8gbGVuZ3RoCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGVuLCBwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbMF0sIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuY29udGVudHMudmFsdWUsIDQyKQorCisgICAgZGVmIHRlc3RfY2hhcnBwKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgYSBjaGFyYWN0ZXIgcG9pbnRlci10by1wb2ludGVyIGlzIGNvcnJlY3RseSBwYXNzZWQiIiIKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIGZ1bmMgPSBkbGwuX3Rlc3RmdW5jX2NfcF9wCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfY2hhcl9wCisgICAgICAgIGFyZ3YgPSAoY19jaGFyX3AgKiAyKSgpCisgICAgICAgIGFyZ2MgPSBjX2ludCggMiApCisgICAgICAgIGFyZ3ZbMF0gPSAnaGVsbG8nCisgICAgICAgIGFyZ3ZbMV0gPSAnd29ybGQnCisgICAgICAgIHJlc3VsdCA9IGZ1bmMoIGJ5cmVmKGFyZ2MpLCBhcmd2ICkKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCA9PSAnd29ybGQnLCByZXN1bHQKKworICAgIGRlZiB0ZXN0X2J1Z18xNDY3ODUyKHNlbGYpOgorICAgICAgICAjIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci8/ZnVuYz1kZXRhaWwmYXRpZD01MzIxNTQmYWlkPTE0Njc4NTImZ3JvdXBfaWQ9NzE3MDIKKyAgICAgICAgeCA9IGNfaW50KDUpCisgICAgICAgIGR1bW15ID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMzIwMDApOgorICAgICAgICAgICAgZHVtbXkuYXBwZW5kKGNfaW50KGkpKQorICAgICAgICB5ID0gY19pbnQoNikKKyAgICAgICAgcCA9IHBvaW50ZXIoeCkKKyAgICAgICAgcHAgPSBwb2ludGVyKHApCisgICAgICAgIHEgPSBwb2ludGVyKHkpCisgICAgICAgIHBwWzBdID0gcSAgICAgICAgICMgPD09CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFswXSwgNikKKyAgICBkZWYgdGVzdF9jX3ZvaWRfcChzZWxmKToKKyAgICAgICAgIyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvP2Z1bmM9ZGV0YWlsJmFpZD0xNTE4MTkwJmdyb3VwX2lkPTU0NzAmYXRpZD0xMDU0NzAKKyAgICAgICAgaWYgc2l6ZW9mKGNfdm9pZF9wKSA9PSA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGTCkudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY192b2lkX3AoLTEpLnZhbHVlKQorICAgICAgICBlbGlmIHNpemVvZihjX3ZvaWRfcCkgPT0gODoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY192b2lkX3AoMHhGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRkwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY192b2lkX3AoLTEpLnZhbHVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY192b2lkX3AoLTEpLnZhbHVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY192b2lkX3AsIDMuMTQpICMgbWFrZSBzdXJlIGZsb2F0cyBhcmUgTk9UIGFjY2VwdGVkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY192b2lkX3AsIG9iamVjdCgpKSAjIG5vciBvdGhlciBvYmplY3RzCisKKyAgICBkZWYgdGVzdF9wb2ludGVyc19ib29sKHNlbGYpOgorICAgICAgICAjIE5VTEwgcG9pbnRlcnMgaGF2ZSBhIGJvb2xlYW4gRmFsc2UgdmFsdWUsIG5vbi1OVUxMIHBvaW50ZXJzIFRydWUuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm9vbChQT0lOVEVSKGNfaW50KSgpKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm9vbChwb2ludGVyKGNfaW50KCkpKSwgVHJ1ZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvb2woQ0ZVTkNUWVBFKE5vbmUpKDApKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm9vbChDRlVOQ1RZUEUoTm9uZSkoNDIpKSwgVHJ1ZSkKKworICAgICAgICAjIENPTSBtZXRob2RzIGFyZSBib29sZWFuIFRydWU6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorICAgICAgICAgICAgbXRoID0gV0lORlVOQ1RZUEUoTm9uZSkoNDIsICJuYW1lIiwgKCksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvb2wobXRoKSwgVHJ1ZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZGNiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZWY0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliYTY1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5CkBAIC0wLDAgKzEsMjIxIEBACitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IHVuaXR0ZXN0CisKKyMgSU1QT1JUQU5UIElORk86CisjCisjIENvbnNpZGVyIHRoaXMgY2FsbDoKKyMgICAgZnVuYy5yZXN0eXBlID0gY19jaGFyX3AKKyMgICAgZnVuYyhjX2NoYXJfcCgiMTIzIikpCisjIEl0IHJldHVybnMKKyMgICAgIjEyMyIKKyMKKyMgV0hZIElTIFRISVMgU08/CisjCisjIGFyZ3VtZW50IHR1cGxlIChjX2NoYXJfcCgiMTIzIiksICkgaXMgZGVzdHJveWVkIGFmdGVyIHRoZSBmdW5jdGlvbgorIyBmdW5jIGlzIGNhbGxlZCwgYnV0IE5PVCBiZWZvcmUgdGhlIHJlc3VsdCBpcyBhY3R1YWxseSBidWlsdC4KKyMKKyMgSWYgdGhlIGFyZ2xpc3Qgd291bGQgYmUgZGVzdHJveWVkIEJFRk9SRSB0aGUgcmVzdWx0IGhhcyBiZWVuIGJ1aWx0LAorIyB0aGUgY19jaGFyX3AoIjEyMyIpIG9iamVjdCB3b3VsZCBhbHJlYWR5IGhhdmUgYSB6ZXJvIHJlZmNvdW50LAorIyBhbmQgdGhlIHBvaW50ZXIgcGFzc2VkIHRvIChhbmQgcmV0dXJuZWQgYnkpIHRoZSBmdW5jdGlvbiB3b3VsZAorIyBwcm9iYWJseSBwb2ludCB0byBkZWFsbG9jYXRlZCBzcGFjZS4KKyMKKyMgSW4gdGhpcyBjYXNlLCB0aGVyZSB3b3VsZCBoYXZlIHRvIGJlIGFuIGFkZGl0aW9uYWwgcmVmZXJlbmNlIHRvIHRoZSBhcmd1bWVudC4uLgorCitpbXBvcnQgX2N0eXBlc190ZXN0Cit0ZXN0ZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisKKyMgUmV0dXJuIG1hY2hpbmUgYWRkcmVzcyBgYWAgYXMgYSAocG9zc2libHkgbG9uZykgbm9uLW5lZ2F0aXZlIGludGVnZXIuCisjIFN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuNSwgaWQoYW55dGhpbmcpIGlzIGFsd2F5cyBub24tbmVnYXRpdmUsIGFuZAorIyB0aGUgY3R5cGVzIGFkZHJlc3NvZigpIGluaGVyaXRzIHRoYXQgdmlhIFB5TG9uZ19Gcm9tVm9pZFB0cigpLgorZGVmIHBvc2l0aXZlX2FkZHJlc3MoYSk6CisgICAgaWYgYSA+PSAwOgorICAgICAgICByZXR1cm4gYQorICAgICMgVmlldyB0aGUgYml0cyBpbiBgYWAgYXMgdW5zaWduZWQgaW5zdGVhZC4KKyAgICBpbXBvcnQgc3RydWN0CisgICAgbnVtX2JpdHMgPSBzdHJ1Y3QuY2FsY3NpemUoIlAiKSAqIDggIyBudW0gYml0cyBpbiBuYXRpdmUgbWFjaGluZSBhZGRyZXNzCisgICAgYSArPSAxTCA8PCBudW1fYml0cworICAgIGFzc2VydCBhID49IDAKKyAgICByZXR1cm4gYQorCitkZWYgY193YnVmZmVyKGluaXQpOgorICAgIG4gPSBsZW4oaW5pdCkgKyAxCisgICAgcmV0dXJuIChjX3djaGFyICogbikoKmluaXQpCisKK2NsYXNzIENoYXJQb2ludGVyc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2xvbmcKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IE5vbmUKKworICAgIGRlZiB0ZXN0X3BhcmFtZmxhZ3Moc2VsZik6CisgICAgICAgICMgZnVuY3Rpb24gcmV0dXJucyBjX3ZvaWRfcCByZXN1bHQsCisgICAgICAgICMgYW5kIGhhcyBhIHJlcXVpcmVkIHBhcmFtZXRlciBuYW1lZCAnaW5wdXQnCisgICAgICAgIHByb3RvdHlwZSA9IENGVU5DVFlQRShjX3ZvaWRfcCwgY192b2lkX3ApCisgICAgICAgIGZ1bmMgPSBwcm90b3R5cGUoKCJfdGVzdGZ1bmNfcF9wIiwgdGVzdGRsbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgxLCAiaW5wdXQiKSwpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMoKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBkZXRhaWxzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZGV0YWlscyksICJyZXF1aXJlZCBhcmd1bWVudCAnaW5wdXQnIG1pc3NpbmciKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJUeXBlRXJyb3Igbm90IHJhaXNlZCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKE5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoaW5wdXQ9Tm9uZSksIE5vbmUpCisKKworICAgIGRlZiB0ZXN0X2ludF9wb2ludGVyX2FyZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2xvbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBmdW5jKDApKQorCisgICAgICAgIGNpID0gY19pbnQoMCkKKworICAgICAgICBmdW5jLmFyZ3R5cGVzID0gUE9JTlRFUihjX2ludCksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXRpdmVfYWRkcmVzcyhhZGRyZXNzb2YoY2kpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfYWRkcmVzcyhmdW5jKGJ5cmVmKGNpKSkpKQorCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBjX2NoYXJfcCwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgZnVuYywgYnlyZWYoY2kpKQorCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBQT0lOVEVSKGNfc2hvcnQpLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBmdW5jLCBieXJlZihjaSkpCisKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IFBPSU5URVIoY19kb3VibGUpLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBmdW5jLCBieXJlZihjaSkpCisKKyAgICBkZWYgdGVzdF9QT0lOVEVSX2NfY2hhcl9hcmcoc2VsZik6CisgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gY19jaGFyX3AKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IFBPSU5URVIoY19jaGFyKSwKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoIjEyMyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY19jaGFyX3AoTm9uZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfY2hhcl9wKCIxMjMiKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX2J1ZmZlcigiMTIzIikpKQorICAgICAgICBjYSA9IGNfY2hhcigiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKKworICAgIGRlZiB0ZXN0X2NfY2hhcl9wX2FyZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2NoYXJfcAorICAgICAgICBmdW5jLmFyZ3R5cGVzID0gY19jaGFyX3AsCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKCIxMjMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfY2hhcl9wKE5vbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX2NoYXJfcCgiMTIzIikpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoY19idWZmZXIoIjEyMyIpKSkKKyAgICAgICAgY2EgPSBjX2NoYXIoImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCisKKyAgICBkZWYgdGVzdF9jX3ZvaWRfcF9hcmcoc2VsZik6CisgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gY19jaGFyX3AKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfdm9pZF9wLAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYygiMTIzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoY19jaGFyX3AoIjEyMyIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfY2hhcl9wKE5vbmUpKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfYnVmZmVyKCIxMjMiKSkpCisgICAgICAgIGNhID0gY19jaGFyKCJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYSIsIGZ1bmMocG9pbnRlcihjYSkpWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQorCisgICAgICAgIGZ1bmMoYnlyZWYoY19pbnQoKSkpCisgICAgICAgIGZ1bmMocG9pbnRlcihjX2ludCgpKSkKKyAgICAgICAgZnVuYygoY19pbnQgKiAzKSgpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfd2NoYXJfcAorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfd2NoYXJfcChOb25lKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyhjX3djaGFyX3AodSIxMjMiKSkpCisKKyAgICBkZWYgdGVzdF9pbnN0YW5jZShzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3ZvaWRfcAorCisgICAgICAgIGNsYXNzIFg6CisgICAgICAgICAgICBfYXNfcGFyYW1ldGVyXyA9IE5vbmUKKworICAgICAgICBmdW5jLmFyZ3R5cGVzID0gY192b2lkX3AsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhYKCkpKQorCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhYKCkpKQorCit0cnk6CisgICAgY193Y2hhcgorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGNsYXNzIFdDaGFyUG9pbnRlcnNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICAgICAgZnVuYy5yZXN0eXBlID0gY19pbnQKKyAgICAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBOb25lCisKKworICAgICAgICBkZWYgdGVzdF9QT0lOVEVSX2Nfd2NoYXJfYXJnKHNlbGYpOgorICAgICAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICAgICAgZnVuYy5yZXN0eXBlID0gY193Y2hhcl9wCisgICAgICAgICAgICBmdW5jLmFyZ3R5cGVzID0gUE9JTlRFUihjX3djaGFyKSwKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IjEyMyIsIGZ1bmModSIxMjMiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhjX3djaGFyX3AoTm9uZSkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IjEyMyIsIGZ1bmMoY193Y2hhcl9wKHUiMTIzIikpKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyhjX3didWZmZXIodSIxMjMiKSkpCisgICAgICAgICAgICBjYSA9IGNfd2NoYXIoImEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQorCisgICAgICAgIGRlZiB0ZXN0X2Nfd2NoYXJfcF9hcmcoc2VsZik6CisgICAgICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCisgICAgICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3djaGFyX3AKKyAgICAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBjX3djaGFyX3AsCisKKyAgICAgICAgICAgIGNfd2NoYXJfcC5mcm9tX3BhcmFtKHUiMTIzIikKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyh1IjEyMyIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfd2NoYXJfcChOb25lKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfd2NoYXJfcCgiMTIzIikpKQorCisgICAgICAgICAgICAjIFhYWCBDdXJyZW50bHksIHRoZXNlIHJhaXNlIFR5cGVFcnJvcnMsIGFsdGhvdWdoIHRoZXkgc2hvdWxkbid0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX3didWZmZXIoIjEyMyIpKSkKKyAgICAgICAgICAgIGNhID0gY193Y2hhcigiYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQorCitjbGFzcyBBcnJheVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfYWk4CisgICAgICAgIGZ1bmMucmVzdHlwZSA9IFBPSU5URVIoY19pbnQpCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBjX2ludCAqIDgsCisKKyAgICAgICAgZnVuYygoY19pbnQgKiA4KSgxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KSkKKworICAgICAgICAjIFRoaXMgZGlkIGNyYXNoIGJlZm9yZToKKworICAgICAgICBkZWYgZnVuYygpOiBwYXNzCisgICAgICAgIENGVU5DVFlQRShOb25lLCBjX2ludCAqIDMpKGZ1bmMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBlZDljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTJjYmE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3B5dGhvbl9hcGkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4MTcwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5CkBAIC0wLDAgKzEsOTAgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QsIHN5cworZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgaXNfcmVzb3VyY2VfZW5hYmxlZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoaXMgc2VjdGlvbiBzaG91bGQgYmUgbW92ZWQgaW50byBjdHlwZXNcX19pbml0X18ucHksIHdoZW4gaXQncyByZWFkeS4KKworZnJvbSBfY3R5cGVzIGltcG9ydCBQeU9ial9Gcm9tUHRyCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZnJvbSBzeXMgaW1wb3J0IGdldHJlZmNvdW50IGFzIGdyYworaWYgc3lzLnZlcnNpb25faW5mbyA+ICgyLCA0KToKKyAgICBjX3B5X3NzaXplX3QgPSBjX3NpemVfdAorZWxzZToKKyAgICBjX3B5X3NzaXplX3QgPSBjX2ludAorCitjbGFzcyBQeXRob25BUElUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzZWxmKToKKyAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUgPSBweXRob25hcGkuUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUKKworICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZS5yZXN0eXBlID0gcHlfb2JqZWN0CisgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplLmFyZ3R5cGVzID0gY19jaGFyX3AsIGNfcHlfc3NpemVfdAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoImFiY2RlZmdoaSIsIDMpLCAiYWJjIikKKworICAgIGRlZiB0ZXN0X1B5U3RyaW5nX0Zyb21TdHJpbmcoc2VsZik6CisgICAgICAgIHB5dGhvbmFwaS5QeVN0cmluZ19Gcm9tU3RyaW5nLnJlc3R5cGUgPSBweV9vYmplY3QKKyAgICAgICAgcHl0aG9uYXBpLlB5U3RyaW5nX0Zyb21TdHJpbmcuYXJndHlwZXMgPSAoY19jaGFyX3AsKQorCisgICAgICAgIHMgPSAiYWJjIgorICAgICAgICByZWZjbnQgPSBncmMocykKKyAgICAgICAgcHlvYiA9IHB5dGhvbmFwaS5QeVN0cmluZ19Gcm9tU3RyaW5nKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKHMpLCByZWZjbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgcHlvYikKKyAgICAgICAgZGVsIHB5b2IKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMocyksIHJlZmNudCkKKworICAgIGlmIGlzX3Jlc291cmNlX2VuYWJsZWQoInJlZmNvdW50Iik6CisgICAgICAgICMgVGhpcyB0ZXN0IGlzIHVucmVsaWFibGUsIGJlY2F1c2UgaXQgaXMgcG9zc2libGUgdGhhdCBjb2RlIGluCisgICAgICAgICMgdW5pdHRlc3QgY2hhbmdlcyB0aGUgcmVmY291bnQgb2YgdGhlICc0MicgaW50ZWdlci4gIFNvLCBpdAorICAgICAgICAjIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisgICAgICAgIGRlZiB0ZXN0X1B5SW50X0xvbmcoc2VsZik6CisgICAgICAgICAgICByZWY0MiA9IGdyYyg0MikKKyAgICAgICAgICAgIHB5dGhvbmFwaS5QeUludF9Gcm9tTG9uZy5yZXN0eXBlID0gcHlfb2JqZWN0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB5dGhvbmFwaS5QeUludF9Gcm9tTG9uZyg0MiksIDQyKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyg0MiksIHJlZjQyKQorCisgICAgICAgICAgICBweXRob25hcGkuUHlJbnRfQXNMb25nLmFyZ3R5cGVzID0gKHB5X29iamVjdCwpCisgICAgICAgICAgICBweXRob25hcGkuUHlJbnRfQXNMb25nLnJlc3R5cGUgPSBjX2xvbmcKKworICAgICAgICAgICAgcmVzID0gcHl0aG9uYXBpLlB5SW50X0FzTG9uZyg0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKHJlcyksIHJlZjQyICsgMSkKKyAgICAgICAgICAgIGRlbCByZXMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKDQyKSwgcmVmNDIpCisKKyAgICBkZWYgdGVzdF9QeU9ial9Gcm9tUHRyKHNlbGYpOgorICAgICAgICBzID0gImFiYyBkZWYgZ2hpIGprbCIKKyAgICAgICAgcmVmID0gZ3JjKHMpCisgICAgICAgICMgaWQocHl0aG9uLW9iamVjdCkgaXMgdGhlIGFkZHJlc3MKKyAgICAgICAgcHlvYmogPSBQeU9ial9Gcm9tUHRyKGlkKHMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocyBpcyBweW9iaikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhzKSwgcmVmICsgMSkKKyAgICAgICAgZGVsIHB5b2JqCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKHMpLCByZWYpCisKKyAgICBkZWYgdGVzdF9QeU9TX3NucHJpbnRmKHNlbGYpOgorICAgICAgICBQeU9TX3NucHJpbnRmID0gcHl0aG9uYXBpLlB5T1Nfc25wcmludGYKKyAgICAgICAgUHlPU19zbnByaW50Zi5hcmd0eXBlcyA9IFBPSU5URVIoY19jaGFyKSwgY19zaXplX3QsIGNfY2hhcl9wCisKKyAgICAgICAgYnVmID0gY19idWZmZXIoMjU2KQorICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJIZWxsbyBmcm9tICVzIiwgImN0eXBlcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCAiSGVsbG8gZnJvbSBjdHlwZXMiKQorCisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkhlbGxvIGZyb20gJXMiLCAiY3R5cGVzIiwgMSwgMiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJIZWxsbyBmcm9tIGN0eXBlcyIpCisKKyAgICAgICAgIyBub3QgZW5vdWdoIGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFB5T1Nfc25wcmludGYsIGJ1ZikKKworICAgIGRlZiB0ZXN0X3B5b2JqZWN0X3JlcHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihweV9vYmplY3QoKSksICJweV9vYmplY3QoPE5VTEw+KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihweV9vYmplY3QoNDIpKSwgInB5X29iamVjdCg0MikiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIocHlfb2JqZWN0KG9iamVjdCkpLCAicHlfb2JqZWN0KCVyKSIgJSBvYmplY3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyNDQxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyNDQxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMjE3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weQpAQCAtMCwwICsxLDc1IEBACitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IHVuaXR0ZXN0LCBzeXMKKworZGVmIGNhbGxiYWNrX2Z1bmMoYXJnKToKKyAgICA0MiAvLyBhcmcKKyAgICByYWlzZSBWYWx1ZUVycm9yKGFyZykKKworaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisKKyAgICBjbGFzcyBjYWxsX2Z1bmN0aW9uX1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgIyBfY3R5cGVzLmNhbGxfZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBhbmQgcHJpdmF0ZSwgYnV0IHVzZWQgYnkKKyAgICAgICAgIyBHYXJ5IEJpc2hwJ3MgcmVhZGxpbmUgbW9kdWxlLiAgSWYgd2UgaGF2ZSBpdCwgd2UgbXVzdCB0ZXN0IGl0IGFzIHdlbGwuCisKKyAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IGNhbGxfZnVuY3Rpb24KKyAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5Mb2FkTGlicmFyeUEucmVzdHlwZSA9IGNfdm9pZF9wCisgICAgICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MuYXJndHlwZXMgPSBjX3ZvaWRfcCwgY19jaGFyX3AKKyAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRQcm9jQWRkcmVzcy5yZXN0eXBlID0gY192b2lkX3AKKworICAgICAgICAgICAgaGRsbCA9IHdpbmRsbC5rZXJuZWwzMi5Mb2FkTGlicmFyeUEoImtlcm5lbDMyIikKKyAgICAgICAgICAgIGZ1bmNhZGRyID0gd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzKGhkbGwsICJHZXRNb2R1bGVIYW5kbGVBIikKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxsX2Z1bmN0aW9uKGZ1bmNhZGRyLCAoTm9uZSwpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBKE5vbmUpKQorCitjbGFzcyBDYWxsYmFja1RyYWNiYWNrVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgV2hlbiBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGluIGEgY3R5cGVzIGNhbGxiYWNrIGZ1bmN0aW9uLCB0aGUgQworICAgICMgY29kZSBwcmludHMgYSB0cmFjZWJhY2suCisgICAgIworICAgICMgVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhlIGV4Y2VwdGlvbiB0eXBlcyAqYW5kKiB0aGUgZXhjZXB0aW9uCisgICAgIyB2YWx1ZSBpcyBwcmludGVkIGNvcnJlY3RseS4KKyAgICAjCisgICAgIyBDaGFuZ2VkIGluIDAuOS4zOiBObyBsb25nZXIgaXMgJyhpbiBjYWxsYmFjayknIHByZXBlbmRlZCB0byB0aGUKKyAgICAjIGVycm9yIG1lc3NhZ2UgLSBpbnN0ZWFkIGEgYWRkaXRpb25hbCBmcmFtZSBmb3IgdGhlIEMgY29kZSBpcworICAgICMgY3JlYXRlZCwgdGhlbiBhIGZ1bGwgdHJhY2ViYWNrIHByaW50ZWQuICBXaGVuIFN5c3RlbUV4aXQgaXMKKyAgICAjIHJhaXNlZCBpbiBhIGNhbGxiYWNrIGZ1bmN0aW9uLCB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuCisKKyAgICBkZWYgY2FwdHVyZV9zdGRlcnIoc2VsZiwgZnVuYywgKmFyZ3MsICoqa3cpOgorICAgICAgICAjIGhlbHBlciAtIGNhbGwgZnVuY3Rpb24gJ2Z1bmMnLCBhbmQgcmV0dXJuIHRoZSBjYXB0dXJlZCBzdGRlcnIKKyAgICAgICAgaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIG9sZF9zdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgIGxvZ2dlciA9IHN5cy5zdGRlcnIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMoKmFyZ3MsICoqa3cpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3RkZXJyID0gb2xkX3N0ZGVycgorICAgICAgICByZXR1cm4gbG9nZ2VyLmdldHZhbHVlKCkKKworICAgIGRlZiB0ZXN0X1ZhbHVlRXJyb3Ioc2VsZik6CisgICAgICAgIGNiID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCkoY2FsbGJhY2tfZnVuYykKKyAgICAgICAgb3V0ID0gc2VsZi5jYXB0dXJlX3N0ZGVycihjYiwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZUVycm9yOiA0MiIpCisKKyAgICBkZWYgdGVzdF9JbnRlZ2VyRGl2aXNpb25FcnJvcihzZWxmKToKKyAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KShjYWxsYmFja19mdW5jKQorICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdWzoxOV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZXJvRGl2aXNpb25FcnJvcjogIikKKworICAgIGRlZiB0ZXN0X0Zsb2F0RGl2aXNpb25FcnJvcihzZWxmKToKKyAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfZG91YmxlKShjYWxsYmFja19mdW5jKQorICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV1bOjE5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplcm9EaXZpc2lvbkVycm9yOiAiKQorCisgICAgZGVmIHRlc3RfVHlwZUVycm9yRGl2aXNpb25FcnJvcihzZWxmKToKKyAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfY2hhcl9wKShjYWxsYmFja19mdW5jKQorICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCAic3BhbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlRXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgLy86ICdpbnQnIGFuZCAnc3RyJyIpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2MDViYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2MDViYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmVmY291bnRzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWE4MWFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weQpAQCAtMCwwICsxLDk4IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBjdHlwZXMKK2ltcG9ydCBnYworCitNeUNhbGxiYWNrID0gY3R5cGVzLkNGVU5DVFlQRShjdHlwZXMuY19pbnQsIGN0eXBlcy5jX2ludCkKK090aGVyQ2FsbGJhY2sgPSBjdHlwZXMuQ0ZVTkNUWVBFKGN0eXBlcy5jX2ludCwgY3R5cGVzLmNfaW50LCBjdHlwZXMuY191bG9uZ2xvbmcpCisKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKK2RsbCA9IGN0eXBlcy5DRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKworY2xhc3MgUmVmY291bnRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgZ2V0cmVmY291bnQgYXMgZ3JjCisKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfY2FsbGJhY2tfaV9pZgorICAgICAgICBmLnJlc3R5cGUgPSBjdHlwZXMuY19pbnQKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtjdHlwZXMuY19pbnQsIE15Q2FsbGJhY2tdCisKKyAgICAgICAgZGVmIGNhbGxiYWNrKHZhbHVlKToKKyAgICAgICAgICAgICNwcmludCAiY2FsbGVkIGJhY2sgd2l0aCIsIHZhbHVlCisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhjYWxsYmFjayksIDIpCisgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGNhbGxiYWNrKSA+IDIpCisgICAgICAgIHJlc3VsdCA9IGYoLTEwLCBjYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0xOCkKKyAgICAgICAgY2IgPSBOb25lCisKKyAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoY2FsbGJhY2spLCAyKQorCisKKyAgICBkZWYgdGVzdF9yZWZjb3VudChzZWxmKToKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IGdldHJlZmNvdW50IGFzIGdyYworICAgICAgICBkZWYgZnVuYygqYXJncyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgdGhpcyBpcyB0aGUgc3RhbmRhcmQgcmVmY291bnQgZm9yIGZ1bmMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoZnVuYyksIDIpCisKKyAgICAgICAgIyB0aGUgQ0Z1bmNQdHIgaW5zdGFuY2UgaG9sZHMgYXRyIGxlYXN0IG9uZSByZWZjb3VudCBvbiBmdW5jOgorICAgICAgICBmID0gT3RoZXJDYWxsYmFjayhmdW5jKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID4gMikKKworICAgICAgICAjIGFuZCBtYXkgcmVsZWFzZSBpdCBhZ2FpbgorICAgICAgICBkZWwgZgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID49IDIpCisKKyAgICAgICAgIyBidXQgbm93IGl0IG11c3QgYmUgZ29uZQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdyYyhmdW5jKSA9PSAyKQorCisgICAgICAgIGNsYXNzIFgoY3R5cGVzLlN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBPdGhlckNhbGxiYWNrKV0KKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4LmEgPSBPdGhlckNhbGxiYWNrKGZ1bmMpCisKKyAgICAgICAgIyB0aGUgQ0Z1bmNQdHIgaW5zdGFuY2UgaG9sZHMgYXRyIGxlYXN0IG9uZSByZWZjb3VudCBvbiBmdW5jOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID4gMikKKworICAgICAgICAjIGFuZCBtYXkgcmVsZWFzZSBpdCBhZ2FpbgorICAgICAgICBkZWwgeAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID49IDIpCisKKyAgICAgICAgIyBhbmQgbm93IGl0IG11c3QgYmUgZ29uZSBhZ2FpbgorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoZnVuYyksIDIpCisKKyAgICAgICAgZiA9IE90aGVyQ2FsbGJhY2soZnVuYykKKworICAgICAgICAjIHRoZSBDRnVuY1B0ciBpbnN0YW5jZSBob2xkcyBhdHIgbGVhc3Qgb25lIHJlZmNvdW50IG9uIGZ1bmM6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoZnVuYykgPiAyKQorCisgICAgICAgICMgY3JlYXRlIGEgY3ljbGUKKyAgICAgICAgZi5jeWNsZSA9IGYKKworICAgICAgICBkZWwgZgorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoZnVuYyksIDIpCisKK2NsYXNzIEFub3RoZXJMZWFrKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jYWxsYmFjayhzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworCisgICAgICAgIHByb3RvID0gY3R5cGVzLkNGVU5DVFlQRShjdHlwZXMuY19pbnQsIGN0eXBlcy5jX2ludCwgY3R5cGVzLmNfaW50KQorICAgICAgICBkZWYgZnVuYyhhLCBiKToKKyAgICAgICAgICAgIHJldHVybiBhICogYiAqIDIKKyAgICAgICAgZiA9IHByb3RvKGZ1bmMpCisKKyAgICAgICAgYSA9IHN5cy5nZXRyZWZjb3VudChjdHlwZXMuY19pbnQpCisgICAgICAgIGYoMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0cmVmY291bnQoY3R5cGVzLmNfaW50KSwgYSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZWZjb3VudHMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBlNmRmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZWZjb3VudHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZWZjb3VudHMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBlNmRmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZWZjb3VudHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXByLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlcHIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljYzU1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXByLnB5CkBAIC0wLDAgKzEsMjkgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKKworc3ViY2xhc3NlcyA9IFtdCitmb3IgYmFzZSBpbiBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2xvbmdsb25nLAorICAgICAgICBjX3VieXRlLCBjX3VzaG9ydCwgY191aW50LCBjX3Vsb25nLCBjX3Vsb25nbG9uZywKKyAgICAgICAgY19mbG9hdCwgY19kb3VibGUsIGNfbG9uZ2RvdWJsZSwgY19ib29sXToKKyAgICBjbGFzcyBYKGJhc2UpOgorICAgICAgICBwYXNzCisgICAgc3ViY2xhc3Nlcy5hcHBlbmQoWCkKKworY2xhc3MgWChjX2NoYXIpOgorICAgIHBhc3MKKworIyBUaGlzIHRlc3QgY2hlY2tzIGlmIHRoZSBfX3JlcHJfXyBpcyBjb3JyZWN0IGZvciBzdWJjbGFzc2VzIG9mIHNpbXBsZSB0eXBlcworCitjbGFzcyBSZXByVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbnVtYmVycyhzZWxmKToKKyAgICAgICAgZm9yIHR5cCBpbiBzdWJjbGFzc2VzOgorICAgICAgICAgICAgYmFzZSA9IHR5cC5fX2Jhc2VzX19bMF0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGJhc2UoNDIpKS5zdGFydHN3aXRoKGJhc2UuX19uYW1lX18pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiPFggb2JqZWN0IGF0IiwgcmVwcih0eXAoNDIpKVs6MTJdKQorCisgICAgZGVmIHRlc3RfY2hhcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiY19jaGFyKCd4JykiLCByZXByKGNfY2hhcigneCcpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiPFggb2JqZWN0IGF0IiwgcmVwcihYKCd4JykpWzoxMl0pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmVwci5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmVwci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1YjlkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXByLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmVwci5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmVwci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1YjlkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXByLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyN2YwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXR1cm5mdW5jcHRycy5weQpAQCAtMCwwICsxLDY1IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgb3MKKworaW1wb3J0IF9jdHlwZXNfdGVzdAorCitjbGFzcyBSZXR1cm5GdW5jUHRyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfd2l0aF9wcm90b3R5cGUoc2VsZik6CisgICAgICAgICMgVGhlIF9jdHlwZXNfdGVzdCBzaGFyZWQgbGliL2RsbCBleHBvcnRzIHF1aXRlIHNvbWUgZnVuY3Rpb25zIGZvciB0ZXN0aW5nLgorICAgICAgICAjIFRoZSBnZXRfc3RyY2hyIGZ1bmN0aW9uIHJldHVybnMgYSAqcG9pbnRlciogdG8gdGhlIEMgc3RyY2hyIGZ1bmN0aW9uLgorICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgZ2V0X3N0cmNociA9IGRsbC5nZXRfc3RyY2hyCisgICAgICAgIGdldF9zdHJjaHIucmVzdHlwZSA9IENGVU5DVFlQRShjX2NoYXJfcCwgY19jaGFyX3AsIGNfY2hhcikKKyAgICAgICAgc3RyY2hyID0gZ2V0X3N0cmNocigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKCJhYmNkZWYiLCAiYiIpLCAiYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocigiYWJjZGVmIiwgIngiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgc3RyY2hyLCAiYWJjZGVmIiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdHJjaHIsICJhYmNkZWYiKQorCisgICAgZGVmIHRlc3Rfd2l0aG91dF9wcm90b3R5cGUoc2VsZik6CisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBnZXRfc3RyY2hyID0gZGxsLmdldF9zdHJjaHIKKyAgICAgICAgIyB0aGUgZGVmYXVsdCAnY19pbnQnIHdvdWxkIG5vdCB3b3JrIG9uIHN5c3RlbXMgd2hlcmUgc2l6ZW9mKGludCkgIT0gc2l6ZW9mKHZvaWQgKikKKyAgICAgICAgZ2V0X3N0cmNoci5yZXN0eXBlID0gY192b2lkX3AKKyAgICAgICAgYWRkciA9IGdldF9zdHJjaHIoKQorICAgICAgICAjIF9DRnVuY1B0ciBpbnN0YW5jZXMgYXJlIG5vdyBjYWxsYWJsZSB3aXRoIGFuIGludGVnZXIgYXJndW1lbnQKKyAgICAgICAgIyB3aGljaCBkZW5vdGVzIGEgZnVuY3Rpb24gYWRkcmVzczoKKyAgICAgICAgc3RyY2hyID0gQ0ZVTkNUWVBFKGNfY2hhcl9wLCBjX2NoYXJfcCwgY19jaGFyKShhZGRyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyY2hyKCJhYmNkZWYiLCAiYiIpLCAiYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocigiYWJjZGVmIiwgIngiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgc3RyY2hyLCAiYWJjZGVmIiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdHJjaHIsICJhYmNkZWYiKQorCisgICAgZGVmIHRlc3RfZnJvbV9kbGwoc2VsZik6CisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICAjIF9DRnVuY1B0ciBpbnN0YW5jZXMgYXJlIG5vdyBjYWxsYWJsZSB3aXRoIGEgdHVwbGUgYXJndW1lbnQKKyAgICAgICAgIyB3aGljaCBkZW5vdGVzIGEgZnVuY3Rpb24gbmFtZSBhbmQgYSBkbGw6CisgICAgICAgIHN0cmNociA9IENGVU5DVFlQRShjX2NoYXJfcCwgY19jaGFyX3AsIGNfY2hhcikoKCJteV9zdHJjaHIiLCBkbGwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyY2hyKGIiYWJjZGVmIiwgYiJiIiksICJiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKGIiYWJjZGVmIiwgYiJ4IiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIHN0cmNociwgYiJhYmNkZWYiLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3RyY2hyLCBiImFiY2RlZiIpCisKKyAgICAjIElzc3VlIDYwODM6IFJlZmVyZW5jZSBjb3VudGluZyBidWcKKyAgICBkZWYgdGVzdF9mcm9tX2RsbF9yZWZjb3VudChzZWxmKToKKyAgICAgICAgY2xhc3MgQmFkU2VxdWVuY2UodHVwbGUpOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgaWYga2V5ID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibXlfc3RyY2hyIgorICAgICAgICAgICAgICAgIGlmIGtleSA9PSAxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorCisgICAgICAgICMgX0NGdW5jUHRyIGluc3RhbmNlcyBhcmUgbm93IGNhbGxhYmxlIHdpdGggYSB0dXBsZSBhcmd1bWVudAorICAgICAgICAjIHdoaWNoIGRlbm90ZXMgYSBmdW5jdGlvbiBuYW1lIGFuZCBhIGRsbDoKKyAgICAgICAgc3RyY2hyID0gQ0ZVTkNUWVBFKGNfY2hhcl9wLCBjX2NoYXJfcCwgY19jaGFyKSgKKyAgICAgICAgICAgICAgICBCYWRTZXF1ZW5jZSgoIm15X3N0cmNociIsIENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyY2hyKGIiYWJjZGVmIiwgYiJiIiksICJiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKGIiYWJjZGVmIiwgYiJ4IiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIHN0cmNociwgYiJhYmNkZWYiLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3RyY2hyLCBiImFiY2RlZiIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzlkMGNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzlkMGNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2ltcGxlc3ViY2xhc3Nlcy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaW1wbGVzdWJjbGFzc2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNzNmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2ltcGxlc3ViY2xhc3Nlcy5weQpAQCAtMCwwICsxLDU3IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2NsYXNzIE15SW50KGNfaW50KToKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHR5cGUob3RoZXIpICE9IE15SW50OgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIHJldHVybiBjbXAoc2VsZi52YWx1ZSwgb3RoZXIudmFsdWUpCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOiAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgIHJldHVybiBoYXNoKHNlbGYudmFsdWUpCisKK2NsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNeUludCgzKSwgTXlJbnQoMykpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoTXlJbnQoNDIpLCBNeUludCg0MykpCisKKyAgICBkZWYgdGVzdF9pZ25vcmVfcmV0dmFsKHNlbGYpOgorICAgICAgICAjIFRlc3QgaWYgdGhlIHJldHVybiB2YWx1ZSBvZiBhIGNhbGxiYWNrIGlzIGlnbm9yZWQKKyAgICAgICAgIyBpZiByZXN0eXBlIGlzIE5vbmUKKyAgICAgICAgcHJvdG8gPSBDRlVOQ1RZUEUoTm9uZSkKKyAgICAgICAgZGVmIGZ1bmMoKToKKyAgICAgICAgICAgIHJldHVybiAoMSwgImFiYyIsIE5vbmUpCisKKyAgICAgICAgY2IgPSBwcm90byhmdW5jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGNiKCkpCisKKworICAgIGRlZiB0ZXN0X2ludF9jYWxsYmFjayhzZWxmKToKKyAgICAgICAgYXJncyA9IFtdCisgICAgICAgIGRlZiBmdW5jKGFyZyk6CisgICAgICAgICAgICBhcmdzLmFwcGVuZChhcmcpCisgICAgICAgICAgICByZXR1cm4gYXJnCisKKyAgICAgICAgY2IgPSBDRlVOQ1RZUEUoTm9uZSwgTXlJbnQpKGZ1bmMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBjYig0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhcmdzWy0xXSksIE15SW50KQorCisgICAgICAgIGNiID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCkoZnVuYykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBjYig0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhcmdzWy0xXSksIGludCkKKworICAgIGRlZiB0ZXN0X2ludF9zdHJ1Y3Qoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIE15SW50KV0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgoKS54LCBNeUludCgpKQorCisgICAgICAgIHMgPSBYKCkKKyAgICAgICAgcy54ID0gTXlJbnQoNDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLngsIE15SW50KDQyKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaW1wbGVzdWJjbGFzc2VzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaW1wbGVzdWJjbGFzc2VzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MThiMjhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NpbXBsZXN1YmNsYXNzZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaW1wbGVzdWJjbGFzc2VzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaW1wbGVzdWJjbGFzc2VzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MThiMjhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NpbXBsZXN1YmNsYXNzZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWI1ZTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CkBAIC0wLDAgKzEsMzQgQEAKKyMgVGVzdCBzcGVjaWZpY2FsbHktc2l6ZWQgY29udGFpbmVycy4KKworZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgU2l6ZXNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfOChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBzaXplb2YoY19pbnQ4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBzaXplb2YoY191aW50OCkpCisKKyAgICBkZWYgdGVzdF8xNihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBzaXplb2YoY19pbnQxNikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgc2l6ZW9mKGNfdWludDE2KSkKKworICAgIGRlZiB0ZXN0XzMyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHNpemVvZihjX2ludDMyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBzaXplb2YoY191aW50MzIpKQorCisgICAgZGVmIHRlc3RfNjQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOCwgc2l6ZW9mKGNfaW50NjQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDgsIHNpemVvZihjX3VpbnQ2NCkpCisKKyAgICBkZWYgdGVzdF9zaXplX3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGNfdm9pZF9wKSwgc2l6ZW9mKGNfc2l6ZV90KSkKKworICAgIGRlZiB0ZXN0X3NzaXplX3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGNfdm9pZF9wKSwgc2l6ZW9mKGNfc3NpemVfdCkpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjY1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjY1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2MzJlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5CkBAIC0wLDAgKzEsMTc4IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKKworY2xhc3MgU2xpY2VzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2dldHNsaWNlX2NpbnQoc2VsZik6CisgICAgICAgIGEgPSAoY19pbnQgKiAxMDApKCp4cmFuZ2UoMTEwMCwgMTIwMCkpCisgICAgICAgIGIgPSByYW5nZSgxMTAwLCAxMjAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMDoyXSwgYlswOjJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMDoyOl0sIGJbMDoyOl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGEpLCBsZW4oYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs1OjddLCBiWzU6N10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs1Ojc6XSwgYls1Ojc6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xXSwgYlstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6XSwgYls6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6XSwgYls6Ol0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxMDo6LTFdLCBiWzEwOjotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVszMDoyMDotMV0sIGJbMzA6MjA6LTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjEyOjZdLCBiWzoxMjo2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzI6Njo0XSwgYlsyOjY6NF0pCisKKyAgICAgICAgYVswOjVdID0gcmFuZ2UoNSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVswOjVdLCByYW5nZSg1LCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVswOjU6XSwgcmFuZ2UoNSwgMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbNDo6LTFdLCByYW5nZSg5LCA0LCAtMSkpCisKKyAgICBkZWYgdGVzdF9zZXRzbGljZV9jaW50KHNlbGYpOgorICAgICAgICBhID0gKGNfaW50ICogMTAwKSgqeHJhbmdlKDExMDAsIDEyMDApKQorICAgICAgICBiID0gcmFuZ2UoMTEwMCwgMTIwMCkKKworICAgICAgICBhWzMyOjQ3XSA9IHJhbmdlKDMyLCA0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzMyOjQ3XSwgcmFuZ2UoMzIsIDQ3KSkKKyAgICAgICAgYVszMjo0N10gPSByYW5nZSgxMzIsIDE0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzMyOjQ3Ol0sIHJhbmdlKDEzMiwgMTQ3KSkKKyAgICAgICAgYVs0NjozMTotMV0gPSByYW5nZSgyMzIsIDI0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzMyOjQ3OjFdLCByYW5nZSgyNDYsIDIzMSwgLTEpKQorCisgICAgICAgIGFbMzI6NDddID0gcmFuZ2UoMTEzMiwgMTE0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzpdLCBiKQorICAgICAgICBhWzMyOjQ3OjddID0gcmFuZ2UoMykKKyAgICAgICAgYlszMjo0Nzo3XSA9IHJhbmdlKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6XSwgYikKKyAgICAgICAgYVszMzo6LTNdID0gcmFuZ2UoMTIpCisgICAgICAgIGJbMzM6Oi0zXSA9IHJhbmdlKDEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOl0sIGIpCisKKyAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgc2V0c2xpY2UsIHNldGl0ZW0KKworICAgICAgICAjIFR5cGVFcnJvcjogaW50IGV4cGVjdGVkIGluc3RlYWQgb2Ygc3RyIGluc3RhbmNlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0c2xpY2UsIGEsIDAsIDUsICJhYmNkZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0aXRlbSwgYSwgc2xpY2UoMCwgNSksICJhYmNkZSIpCisgICAgICAgICMgVHlwZUVycm9yOiBpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBzdHIgaW5zdGFuY2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRzbGljZSwgYSwgMCwgNSwgWyJhIiwgImIiLCAiYyIsICJkIiwgImUiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRpdGVtLCBhLCBzbGljZSgwLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyJhIiwgImIiLCAiYyIsICJkIiwgImUiXSkKKyAgICAgICAgIyBUeXBlRXJyb3I6IGludCBleHBlY3RlZCBpbnN0ZWFkIG9mIGZsb2F0IGluc3RhbmNlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0c2xpY2UsIGEsIDAsIDUsIFsxLCAyLCAzLCA0LCAzLjE0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRpdGVtLCBhLCBzbGljZSgwLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWzEsIDIsIDMsIDQsIDMuMTRdKQorICAgICAgICAjIFZhbHVlRXJyb3I6IENhbiBvbmx5IGFzc2lnbiBzZXF1ZW5jZSBvZiBzYW1lIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0c2xpY2UsIGEsIDAsIDUsIHJhbmdlKDMyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0aXRlbSwgYSwgc2xpY2UoMCwgNSksIHJhbmdlKDMyKSkKKworICAgIGRlZiB0ZXN0X2NoYXJfcHRyKHNlbGYpOgorICAgICAgICBzID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgorCisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBkbGwubXlfc3RyZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfY2hhcikKKyAgICAgICAgZGxsLm15X2ZyZWUucmVzdHlwZSA9IE5vbmUKKyAgICAgICAgcmVzID0gZGxsLm15X3N0cmR1cChzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpXSwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOjNdLCBzWzozXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKTpdLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMTotMTotMV0sIHNbOjotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzW2xlbihzKS0xOjU6LTddLCBzWzo1Oi03XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMDotMTotMV0sIHNbMDo6LTFdKQorCisgICAgICAgIGltcG9ydCBvcGVyYXRvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIHNsaWNlKE5vbmUsIE5vbmUsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIHNsaWNlKDAsIE5vbmUsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIHNsaWNlKE5vbmUsIDUsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLCBzbGljZSgtNSwgTm9uZSwgTm9uZSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRzbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLCAwLCA1LCB1ImFiY2RlIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIHNsaWNlKDAsIDUpLCB1ImFiY2RlIikKKyAgICAgICAgZGxsLm15X2ZyZWUocmVzKQorCisgICAgICAgIGRsbC5teV9zdHJkdXAucmVzdHlwZSA9IFBPSU5URVIoY19ieXRlKQorICAgICAgICByZXMgPSBkbGwubXlfc3RyZHVwKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyldLCByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikrMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyk6XSwgcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpKQorICAgICAgICBkbGwubXlfZnJlZShyZXMpCisKKyAgICBkZWYgdGVzdF9jaGFyX3B0cl93aXRoX2ZyZWUoc2VsZik6CisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBzID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgorCisgICAgICAgIGNsYXNzIGFsbG9jYXRlZF9jX2NoYXJfcChjX2NoYXJfcCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGxsLm15X2ZyZWUucmVzdHlwZSA9IE5vbmUKKyAgICAgICAgZGVmIGVycmNoZWNrKHJlc3VsdCwgZnVuYywgYXJncyk6CisgICAgICAgICAgICByZXR2YWwgPSByZXN1bHQudmFsdWUKKyAgICAgICAgICAgIGRsbC5teV9mcmVlKHJlc3VsdCkKKyAgICAgICAgICAgIHJldHVybiByZXR2YWwKKworICAgICAgICBkbGwubXlfc3RyZHVwLnJlc3R5cGUgPSBhbGxvY2F0ZWRfY19jaGFyX3AKKyAgICAgICAgZGxsLm15X3N0cmR1cC5lcnJjaGVjayA9IGVycmNoZWNrCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlcyA9IGRsbC5teV9zdHJkdXAocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIGRsbC5teV9zdHJkdXAuZXJyY2hlY2sKKworCisgICAgZGVmIHRlc3RfY2hhcl9hcnJheShzZWxmKToKKyAgICAgICAgcyA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwwIgorCisgICAgICAgIHAgPSAoY19jaGFyICogMjcpKCpzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOl0sIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6Ol0sIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6Oi0xXSwgc1s6Oi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzU6Oi0yXSwgc1s1OjotMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFsyOjU6LTNdLCBzWzI6NTotM10pCisKKworICAgIHRyeToKKyAgICAgICAgY193Y2hhcgorICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBkZWYgdGVzdF93Y2hhcl9wdHIoc2VsZik6CisgICAgICAgICAgICBzID0gdSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwwIgorCisgICAgICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgICAgIGRsbC5teV93Y3NkdXAucmVzdHlwZSA9IFBPSU5URVIoY193Y2hhcikKKyAgICAgICAgICAgIGRsbC5teV93Y3NkdXAuYXJndHlwZXMgPSBQT0lOVEVSKGNfd2NoYXIpLAorICAgICAgICAgICAgZGxsLm15X2ZyZWUucmVzdHlwZSA9IE5vbmUKKyAgICAgICAgICAgIHJlcyA9IGRsbC5teV93Y3NkdXAocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyldLCBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKTpdLCBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTE6LTE6LTFdLCBzWzo6LTFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTE6NTotN10sIHNbOjU6LTddKQorCisgICAgICAgICAgICBpbXBvcnQgb3BlcmF0b3IKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0c2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIDAsIDUsIHUiYWJjZGUiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLCBzbGljZSgwLCA1KSwgdSJhYmNkZSIpCisgICAgICAgICAgICBkbGwubXlfZnJlZShyZXMpCisKKyAgICAgICAgICAgIGlmIHNpemVvZihjX3djaGFyKSA9PSBzaXplb2YoY19zaG9ydCk6CisgICAgICAgICAgICAgICAgZGxsLm15X3djc2R1cC5yZXN0eXBlID0gUE9JTlRFUihjX3Nob3J0KQorICAgICAgICAgICAgZWxpZiBzaXplb2YoY193Y2hhcikgPT0gc2l6ZW9mKGNfaW50KToKKyAgICAgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfaW50KQorICAgICAgICAgICAgZWxpZiBzaXplb2YoY193Y2hhcikgPT0gc2l6ZW9mKGNfbG9uZyk6CisgICAgICAgICAgICAgICAgZGxsLm15X3djc2R1cC5yZXN0eXBlID0gUE9JTlRFUihjX2xvbmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmVzID0gZGxsLm15X3djc2R1cChzKQorICAgICAgICAgICAgdG1wbCA9IHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSsxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKS0xXSwgdG1wbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyktMTpdLCB0bXBsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTI6LTE6LTFdLCB0bXBsWzo6LTFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTI6NTotN10sIHRtcGxbOjU6LTddKQorICAgICAgICAgICAgZGxsLm15X2ZyZWUocmVzKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyOWJjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyOWJjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3B0ci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmVkNThiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3B0ci5weQpAQCAtMCwwICsxLDc1IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKKworbGliID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisKK2NsYXNzIFN0cmluZ1B0clRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X19QT0lOVEVSX2NfY2hhcihzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJzdHIiLCBQT0lOVEVSKGNfY2hhcikpXQorICAgICAgICB4ID0gWCgpCisKKyAgICAgICAgIyBOVUxMIHBvaW50ZXIgYWNjZXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldGF0dHIsIHguc3RyLCAiY29udGVudHMiKQorICAgICAgICBiID0gY19idWZmZXIoIkhlbGxvLCBXb3JsZCIpCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBnZXRyZWZjb3VudCBhcyBncmMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoYiksIDIpCisgICAgICAgIHguc3RyID0gYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhiKSwgMykKKworICAgICAgICAjIFBPSU5URVIoY19jaGFyKSBhbmQgUHl0aG9uIHN0cmluZyBpcyBOT1QgY29tcGF0aWJsZQorICAgICAgICAjIFBPSU5URVIoY19jaGFyKSBhbmQgY19idWZmZXIoKSBpcyBjb21wYXRpYmxlCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihiKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbaV0sIHguc3RyW2ldKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgeCwgInN0ciIsICJIZWxsbywgV29ybGQiKQorCisgICAgZGVmIHRlc3RfX2NfY2hhcl9wKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoInN0ciIsIGNfY2hhcl9wKV0KKyAgICAgICAgeCA9IFgoKQorCisgICAgICAgICMgY19jaGFyX3AgYW5kIFB5dGhvbiBzdHJpbmcgaXMgY29tcGF0aWJsZQorICAgICAgICAjIGNfY2hhcl9wIGFuZCBjX2J1ZmZlciBpcyBOT1QgY29tcGF0aWJsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyLCBOb25lKQorICAgICAgICB4LnN0ciA9ICJIZWxsbywgV29ybGQiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHIsICJIZWxsbywgV29ybGQiKQorICAgICAgICBiID0gY19idWZmZXIoIkhlbGxvLCBXb3JsZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgeCwgInN0ciIsIGIpCisKKworICAgIGRlZiB0ZXN0X2Z1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgc3RyY2hyID0gbGliLm15X3N0cmNocgorICAgICAgICBzdHJjaHIucmVzdHlwZSA9IGNfY2hhcl9wCisKKyAgICAgICAgIyBjX2NoYXJfcCBhbmQgUHl0aG9uIHN0cmluZyBpcyBjb21wYXRpYmxlCisgICAgICAgICMgY19jaGFyX3AgYW5kIGNfYnVmZmVyIGFyZSBub3cgY29tcGF0aWJsZQorICAgICAgICBzdHJjaHIuYXJndHlwZXMgPSBjX2NoYXJfcCwgY19jaGFyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKCJhYmNkZWYiLCAiYyIpLCAiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKGNfYnVmZmVyKCJhYmNkZWYiKSwgImMiKSwgImNkZWYiKQorCisgICAgICAgICMgUE9JTlRFUihjX2NoYXIpIGFuZCBQeXRob24gc3RyaW5nIGlzIE5PVCBjb21wYXRpYmxlCisgICAgICAgICMgUE9JTlRFUihjX2NoYXIpIGFuZCBjX2J1ZmZlcigpIGlzIGNvbXBhdGlibGUKKyAgICAgICAgc3RyY2hyLmFyZ3R5cGVzID0gUE9JTlRFUihjX2NoYXIpLCBjX2NoYXIKKyAgICAgICAgYnVmID0gY19idWZmZXIoImFiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKGJ1ZiwgImMiKSwgImNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocigiYWJjZGVmIiwgImMiKSwgImNkZWYiKQorCisgICAgICAgICMgWFhYIFRoZXNlIGNhbGxzIGFyZSBkYW5nZXJvdXMsIGJlY2F1c2UgdGhlIGZpcnN0IGFyZ3VtZW50CisgICAgICAgICMgdG8gc3RyY2hyIGlzIG5vIGxvbmdlciB2YWxpZCBhZnRlciB0aGUgZnVuY3Rpb24gcmV0dXJucyEKKyAgICAgICAgIyBTbyB3ZSBtdXN0IGtlZXAgYSByZWZlcmVuY2UgdG8gYnVmIHNlcGFyYXRlbHkKKworICAgICAgICBzdHJjaHIucmVzdHlwZSA9IFBPSU5URVIoY19jaGFyKQorICAgICAgICBidWYgPSBjX2J1ZmZlcigiYWJjZGVmIikKKyAgICAgICAgciA9IHN0cmNocihidWYsICJjIikKKyAgICAgICAgeCA9IHJbMF0sIHJbMV0sIHJbMl0sIHJbM10sIHJbNF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCAoImMiLCAiZCIsICJlIiwgImYiLCAiXDAwMCIpKQorICAgICAgICBkZWwgYnVmCisgICAgICAgICMgeDEgd2lsbCBOT1QgYmUgdGhlIHNhbWUgYXMgeCwgdXN1YWxseToKKyAgICAgICAgeDEgPSByWzBdLCByWzFdLCByWzJdLCByWzNdLCByWzRdCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OTEzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OTEzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NDVkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weQpAQCAtMCwwICsxLDIyNSBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgU3RyaW5nQXJyYXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIEJVRiA9IGNfY2hhciAqIDQKKworICAgICAgICBidWYgPSBCVUYoImEiLCAiYiIsICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5yYXcsICJhYmNcMDAwIikKKworICAgICAgICBidWYudmFsdWUgPSAiQUJDRCIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJBQkNEIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYucmF3LCAiQUJDRCIpCisKKyAgICAgICAgYnVmLnZhbHVlID0gIngiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCAieCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnJhdywgInhcMDAwQ0QiKQorCisgICAgICAgIGJ1ZlsxXSA9ICJaIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgInhaQ0QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5yYXcsICJ4WkNEIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBidWYsICJ2YWx1ZSIsICJhYWFhYWFhYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgYnVmLCAidmFsdWUiLCA0MikKKworICAgIGRlZiB0ZXN0X2NfYnVmZmVyX3ZhbHVlKHNlbGYsIG1lbW9yeXZpZXc9bWVtb3J5dmlldyk6CisgICAgICAgIGJ1ZiA9IGNfYnVmZmVyKDMyKQorCisgICAgICAgIGJ1Zi52YWx1ZSA9ICJIZWxsbywgV29ybGQiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIGJ1ZiwgInZhbHVlIiwgbWVtb3J5dmlldygiSGVsbG8sIFdvcmxkIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgYnVmLCAidmFsdWUiLCBtZW1vcnl2aWV3KCJhYmMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0YXR0ciwgYnVmLCAicmF3IiwgbWVtb3J5dmlldygieCIgKiAxMDApKQorCisgICAgZGVmIHRlc3RfY19idWZmZXJfcmF3KHNlbGYsIG1lbW9yeXZpZXc9bWVtb3J5dmlldyk6CisgICAgICAgIGJ1ZiA9IGNfYnVmZmVyKDMyKQorCisgICAgICAgIGJ1Zi5yYXcgPSBtZW1vcnl2aWV3KCJIZWxsbywgV29ybGQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgYnVmLCAidmFsdWUiLCBtZW1vcnl2aWV3KCJhYmMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0YXR0ciwgYnVmLCAicmF3IiwgbWVtb3J5dmlldygieCIgKiAxMDApKQorCisgICAgZGVmIHRlc3RfY19idWZmZXJfZGVwcmVjYXRlZChzZWxmKToKKyAgICAgICAgIyBDb21wYXRpYmlsaXR5IHdpdGggMi54CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYudGVzdF9jX2J1ZmZlcl92YWx1ZShidWZmZXIpCisgICAgICAgICAgICBzZWxmLnRlc3RfY19idWZmZXJfcmF3KGJ1ZmZlcikKKworICAgIGRlZiB0ZXN0X3BhcmFtXzEoc2VsZik6CisgICAgICAgIEJVRiA9IGNfY2hhciAqIDQKKyAgICAgICAgYnVmID0gQlVGKCkKKyMjICAgICAgICBwcmludCBjX2NoYXJfcC5mcm9tX3BhcmFtKGJ1ZikKKworICAgIGRlZiB0ZXN0X3BhcmFtXzIoc2VsZik6CisgICAgICAgIEJVRiA9IGNfY2hhciAqIDQKKyAgICAgICAgYnVmID0gQlVGKCkKKyMjICAgICAgICBwcmludCBCVUYuZnJvbV9wYXJhbShjX2NoYXJfcCgicHl0aG9uIikpCisjIyAgICAgICAgcHJpbnQgQlVGLmZyb21fcGFyYW0oQlVGKCoicHl0aCIpKQorCit0cnk6CisgICAgY193Y2hhcgorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGNsYXNzIFdTdHJpbmdBcnJheVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICBCVUYgPSBjX3djaGFyICogNAorCisgICAgICAgICAgICBidWYgPSBCVUYodSJhIiwgdSJiIiwgdSJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCB1ImFiYyIpCisKKyAgICAgICAgICAgIGJ1Zi52YWx1ZSA9IHUiQUJDRCIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCB1IkFCQ0QiKQorCisgICAgICAgICAgICBidWYudmFsdWUgPSB1IngiCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgdSJ4IikKKworICAgICAgICAgICAgYnVmWzFdID0gdSJaIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUieFpDRCIpCisKK2NsYXNzIFN0cmluZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgWFhfdGVzdF9iYXNpY19zdHJpbmdzKHNlbGYpOgorICAgICAgICBjcyA9IGNfc3RyaW5nKCJhYmNkZWYiKQorCisgICAgICAgICMgQ2Fubm90IGNhbGwgbGVuIG9uIGEgY19zdHJpbmcgYW55IGxvbmdlcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxlbiwgY3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGNzKSwgNykKKworICAgICAgICAjIFRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyB0aGUgc3RyaW5nIHVwIHRvIHRoZSBmaXJzdCB0ZXJtaW5hdGluZyBOVUwuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MudmFsdWUsICJhYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfc3RyaW5nKCJhYmNcMDAwZGVmIikudmFsdWUsICJhYmMiKQorCisgICAgICAgICMgVGhlIHJhdyBwcm9wZXJ0eSBpcyB0aGUgdG90YWwgYnVmZmVyIGNvbnRlbnRzOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzLnJhdywgImFiY2RlZlwwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfc3RyaW5nKCJhYmNcMDAwZGVmIikucmF3LCAiYWJjXDAwMGRlZlwwMDAiKQorCisgICAgICAgICMgV2UgY2FuIGNoYW5nZSB0aGUgdmFsdWU6CisgICAgICAgIGNzLnZhbHVlID0gImFiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzLnZhbHVlLCAiYWIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzLnJhdywgImFiXDAwMFwwMDBcMDAwXDAwMFwwMDAiKQorCisgICAgICAgIGNzLnJhdyA9ICJYWSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjcy52YWx1ZSwgIlhZIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjcy5yYXcsICJYWVwwMDBcMDAwXDAwMFwwMDBcMDAwIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfc3RyaW5nLCB1IjEyMyIpCisKKyAgICBkZWYgWFhfdGVzdF9zaXplZF9zdHJpbmdzKHNlbGYpOgorCisgICAgICAgICMgTmV3IGluIHJlbGVhc2VzIGxhdGVyIHRoYW4gMC40LjA6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY19zdHJpbmcsIE5vbmUpCisKKyAgICAgICAgIyBOZXcgaW4gcmVsZWFzZXMgbGF0ZXIgdGhhbiAwLjQuMDoKKyAgICAgICAgIyBjX3N0cmluZyhudW1iZXIpIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nIG9mIHNpemUgbnVtYmVyCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oY19zdHJpbmcoMzIpLnJhdykgPT0gMzIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNfc3RyaW5nLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY19zdHJpbmcsIDApCisKKyAgICAgICAgIyBUaGVzZSB0ZXN0cyBmYWlsLCBiZWNhdXNlIGl0IGlzIG5vIGxvbmdlciBpbml0aWFsaXplZAorIyMgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygyKS52YWx1ZSA9PSAiIikKKyMjICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoMikucmF3ID09ICJcMDAwXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygyKS5yYXdbLTFdID09ICJcMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihjX3N0cmluZygyKS5yYXcpID09IDIpCisKKyAgICBkZWYgWFhfdGVzdF9pbml0aWFsaXplZF9zdHJpbmdzKHNlbGYpOgorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygiYWIiLCA0KS5yYXdbOjJdID09ICJhYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygiYWIiLCA0KS5yYXdbOjI6XSA9PSAiYWIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyOi0xXSA9PSAiYmEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyOjJdID09ICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1stMV0gPT0gIlwwMDAiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgMikucmF3ID09ICJhXDAwMCIpCisKKyAgICBkZWYgWFhfdGVzdF90b29sb25nKHNlbGYpOgorICAgICAgICBjcyA9IGNfc3RyaW5nKCJhYmNkZWYiKQorICAgICAgICAjIE11Y2ggdG9vIGxvbmcgc3RyaW5nOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBjcywgInZhbHVlIiwgIjEyMzQ1Njc4OTAxMjM0NSIpCisKKyAgICAgICAgIyBPbmUgY2hhciB0b28gbG9uZyB2YWx1ZXM6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIGNzLCAidmFsdWUiLCAiMTIzNDU2NyIpCisKKyMjICAgIGRlZiB0ZXN0X3BlcmYoc2VsZik6CisjIyAgICAgICAgY2hlY2tfcGVyZigpCisKK3RyeToKKyAgICBjX3djaGFyCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3MgV1N0cmluZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgZGVmIHRlc3Rfd2NoYXIoc2VsZik6CisgICAgICAgICAgICBjX3djaGFyKHUieCIpCisgICAgICAgICAgICByZXByKGJ5cmVmKGNfd2NoYXIodSJ4IikpKQorICAgICAgICAgICAgY193Y2hhcigieCIpCisKKworICAgICAgICBkZWYgWF90ZXN0X2Jhc2ljX3dzdHJpbmdzKHNlbGYpOgorICAgICAgICAgICAgY3MgPSBjX3dzdHJpbmcodSJhYmNkZWYiKQorCisgICAgICAgICAgICAjIFhYWCBUaGlzIGJlaGF2aW91ciBpcyBhYm91dCB0byBjaGFuZ2U6CisgICAgICAgICAgICAjIGxlbiByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIgaW4gYnl0ZXMuCisgICAgICAgICAgICAjIFRoaXMgaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIE5VTCBjaGFyYWN0ZXIuCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2l6ZW9mKGNzKSA9PSAxNCkKKworICAgICAgICAgICAgIyBUaGUgdmFsdWUgcHJvcGVydHkgaXMgdGhlIHN0cmluZyB1cCB0byB0aGUgZmlyc3QgdGVybWluYXRpbmcgTlVMLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzLnZhbHVlID09IHUiYWJjZGVmIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3dzdHJpbmcodSJhYmNcMDAwZGVmIikudmFsdWUgPT0gdSJhYmMiKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnZhbHVlID09IHUiYWJjIikKKworICAgICAgICAgICAgIyBUaGUgcmF3IHByb3BlcnR5IGlzIHRoZSB0b3RhbCBidWZmZXIgY29udGVudHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY3MucmF3ID09IHUiYWJjZGVmXDAwMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnJhdyA9PSB1ImFiY1wwMDBkZWZcMDAwIikKKworICAgICAgICAgICAgIyBXZSBjYW4gY2hhbmdlIHRoZSB2YWx1ZToKKyAgICAgICAgICAgIGNzLnZhbHVlID0gdSJhYiIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjcy52YWx1ZSA9PSB1ImFiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjcy5yYXcgPT0gdSJhYlwwMDBcMDAwXDAwMFwwMDBcMDAwIikKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3dzdHJpbmcsICIxMjMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY193c3RyaW5nLCAwKQorCisgICAgICAgIGRlZiBYX3Rlc3RfdG9vbG9uZyhzZWxmKToKKyAgICAgICAgICAgIGNzID0gY193c3RyaW5nKHUiYWJjZGVmIikKKyAgICAgICAgICAgICMgTXVjaCB0b28gbG9uZyBzdHJpbmc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBjcywgInZhbHVlIiwgdSIxMjM0NTY3ODkwMTIzNDUiKQorCisgICAgICAgICAgICAjIE9uZSBjaGFyIHRvbyBsb25nIHZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIGNzLCAidmFsdWUiLCB1IjEyMzQ1NjciKQorCisKK2RlZiBydW5fdGVzdChyZXAsIG1zZywgZnVuYywgYXJnKToKKyAgICBpdGVtcyA9IHJhbmdlKHJlcCkKKyAgICBmcm9tIHRpbWUgaW1wb3J0IGNsb2NrCisgICAgc3RhcnQgPSBjbG9jaygpCisgICAgZm9yIGkgaW4gaXRlbXM6CisgICAgICAgIGZ1bmMoYXJnKTsgZnVuYyhhcmcpOyBmdW5jKGFyZyk7IGZ1bmMoYXJnKTsgZnVuYyhhcmcpCisgICAgc3RvcCA9IGNsb2NrKCkKKyAgICBwcmludCAiJTIwczogJS4yZiB1cyIgJSAobXNnLCAoKHN0b3Atc3RhcnQpKjFlNi81L3JlcCkpCisKK2RlZiBjaGVja19wZXJmKCk6CisgICAgIyBDb25zdHJ1Y3QgNSBvYmplY3RzCisKKyAgICBSRVAgPSAyMDAwMDAKKworICAgIHJ1bl90ZXN0KFJFUCwgImNfc3RyaW5nKE5vbmUpIiwgY19zdHJpbmcsIE5vbmUpCisgICAgcnVuX3Rlc3QoUkVQLCAiY19zdHJpbmcoJ2FiYycpIiwgY19zdHJpbmcsICdhYmMnKQorCisjIFB5dGhvbiAyLjMgLU9PLCB3aW4yaywgUDQgNzAwIE1IejoKKyMKKyMgICAgICBjX3N0cmluZyhOb25lKTogMS43NSB1cworIyAgICAgY19zdHJpbmcoJ2FiYycpOiAyLjc0IHVzCisKKyMgUHl0aG9uIDIuMiAtT08sIHdpbjJrLCBQNCA3MDAgTUh6OgorIworIyAgICAgIGNfc3RyaW5nKE5vbmUpOiAyLjk1IHVzCisjICAgICBjX3N0cmluZygnYWJjJyk6IDMuNjcgdXMKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorIyMgICAgY2hlY2tfcGVyZigpCisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzMjI2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzMjI2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0X2ZpZWxkcy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZWIzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0X2ZpZWxkcy5weQpAQCAtMCwwICsxLDUwIEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2NsYXNzIFN0cnVjdEZpZWxkc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFN0cnVjdHVyZS9VbmlvbiBjbGFzc2VzIG11c3QgZ2V0ICdmaW5hbGl6ZWQnIHNvb25lciBvcgorICAgICMgbGF0ZXIsIHdoZW4gb25lIG9mIHRoZXNlIHRoaW5ncyBoYXBwZW46CisgICAgIworICAgICMgMS4gX2ZpZWxkc18gaXMgc2V0LgorICAgICMgMi4gQW4gaW5zdGFuY2UgaXMgY3JlYXRlZC4KKyAgICAjIDMuIFRoZSB0eXBlIGlzIHVzZWQgYXMgZmllbGQgb2YgYW5vdGhlciBTdHJ1Y3R1cmUvVW5pb24uCisgICAgIyA0LiBUaGUgdHlwZSBpcyBzdWJjbGFzc2VkCisgICAgIworICAgICMgV2hlbiB0aGV5IGFyZSBmaW5hbGl6ZWQsIGFzc2lnbmluZyBfZmllbGRzXyBpcyBubyBsb25nZXIgYWxsb3dlZC4KKworICAgIGRlZiB0ZXN0XzFfQShzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgMCkgIyBub3QgZmluYWxpemVkCisgICAgICAgIFguX2ZpZWxkc18gPSBbXSAjIGZpbmFsaXplZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgWCwgIl9maWVsZHNfIiwgW10pCisKKyAgICBkZWYgdGVzdF8xX0Ioc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gW10gIyBmaW5hbGl6ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIFgsICJfZmllbGRzXyIsIFtdKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBYKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIFgsICJfZmllbGRzXyIsIFtdKQorCisgICAgZGVmIHRlc3RfMyhzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBZKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBYKV0gIyBmaW5hbGl6ZXMgWAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgWCwgIl9maWVsZHNfIiwgW10pCisKKyAgICBkZWYgdGVzdF80KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIFkoWCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBYLCAiX2ZpZWxkc18iLCBbXSkKKyAgICAgICAgWS5fZmllbGRzXyA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBYLCAiX2ZpZWxkc18iLCBbXSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGU0OWY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdF9maWVsZHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGU0OWY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdF9maWVsZHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3YzgxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CkBAIC0wLDAgKzEsNDc4IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitmcm9tIHN0cnVjdCBpbXBvcnQgY2FsY3NpemUKK2ltcG9ydCBfdGVzdGNhcGkKKworY2xhc3MgU3ViY2xhc3Nlc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCldCisKKyAgICAgICAgY2xhc3MgWShYKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYiIsIGNfaW50KV0KKworICAgICAgICBjbGFzcyBaKFgpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihZKSwgc2l6ZW9mKGNfaW50KSoyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihaKSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLl9maWVsZHNfLCBbKCJhIiwgY19pbnQpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLl9maWVsZHNfLCBbKCJiIiwgY19pbnQpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChaLl9maWVsZHNfLCBbKCJhIiwgY19pbnQpXSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX2RlbGF5ZWQoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIDApCisgICAgICAgIFguX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpXQorCisgICAgICAgIGNsYXNzIFkoWCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFkpLCBzaXplb2YoWCkpCisgICAgICAgIFkuX2ZpZWxkc18gPSBbKCJiIiwgY19pbnQpXQorCisgICAgICAgIGNsYXNzIFooWCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFkpLCBzaXplb2YoY19pbnQpKjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFopLCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguX2ZpZWxkc18sIFsoImEiLCBjX2ludCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkuX2ZpZWxkc18sIFsoImIiLCBjX2ludCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFouX2ZpZWxkc18sIFsoImEiLCBjX2ludCldKQorCitjbGFzcyBTdHJ1Y3R1cmVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZm9ybWF0cyA9IHsiYyI6IGNfY2hhciwKKyAgICAgICAgICAgICAgICJiIjogY19ieXRlLAorICAgICAgICAgICAgICAgIkIiOiBjX3VieXRlLAorICAgICAgICAgICAgICAgImgiOiBjX3Nob3J0LAorICAgICAgICAgICAgICAgIkgiOiBjX3VzaG9ydCwKKyAgICAgICAgICAgICAgICJpIjogY19pbnQsCisgICAgICAgICAgICAgICAiSSI6IGNfdWludCwKKyAgICAgICAgICAgICAgICJsIjogY19sb25nLAorICAgICAgICAgICAgICAgIkwiOiBjX3Vsb25nLAorICAgICAgICAgICAgICAgInEiOiBjX2xvbmdsb25nLAorICAgICAgICAgICAgICAgIlEiOiBjX3Vsb25nbG9uZywKKyAgICAgICAgICAgICAgICJmIjogY19mbG9hdCwKKyAgICAgICAgICAgICAgICJkIjogY19kb3VibGUsCisgICAgICAgICAgICAgICB9CisKKyAgICBkZWYgdGVzdF9zaW1wbGVfc3RydWN0cyhzZWxmKToKKyAgICAgICAgZm9yIGNvZGUsIHRwIGluIHNlbGYuZm9ybWF0cy5pdGVtcygpOgorICAgICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfY2hhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgdHApXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoc2l6ZW9mKFgpLCBjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWxjc2l6ZSgiYyVjMCVjIiAlIChjb2RlLCBjb2RlKSksIGNvZGUpKQorCisgICAgZGVmIHRlc3RfdW5pb25zKHNlbGYpOgorICAgICAgICBmb3IgY29kZSwgdHAgaW4gc2VsZi5mb3JtYXRzLml0ZW1zKCk6CisgICAgICAgICAgICBjbGFzcyBYKFVuaW9uKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2NoYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIHRwKV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHNpemVvZihYKSwgY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FsY3NpemUoIiVjIiAlIChjb2RlKSksIGNvZGUpKQorCisgICAgZGVmIHRlc3Rfc3RydWN0X2FsaWdubWVudChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19jaGFyICogMyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxpZ25tZW50KFgpLCBjYWxjc2l6ZSgicyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgY2FsY3NpemUoIjNzIikpCisKKyAgICAgICAgY2xhc3MgWShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19jaGFyICogMyksCisgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCBjX2ludCldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxpZ25tZW50KFkpLCBjYWxjc2l6ZSgiaSIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihZKSwgY2FsY3NpemUoIjNzaSIpKQorCisgICAgICAgIGNsYXNzIFNJKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIFkpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaWdubWVudChTSSksIG1heChhbGlnbm1lbnQoWSksIGFsaWdubWVudChYKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFNJKSwgY2FsY3NpemUoIjNzMGkgM3NpIDBpIikpCisKKyAgICAgICAgY2xhc3MgSVMoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYiIsIFkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJhIiwgWCldCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlnbm1lbnQoU0kpLCBtYXgoYWxpZ25tZW50KFgpLCBhbGlnbm1lbnQoWSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihJUyksIGNhbGNzaXplKCIzc2kgM3MgMGkiKSkKKworICAgICAgICBjbGFzcyBYWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgWCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBYKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlnbm1lbnQoWFgpLCBhbGlnbm1lbnQoWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFhYKSwgY2FsY3NpemUoIjNzIDNzIDBzIikpCisKKyAgICBkZWYgdGVzdF9lbXRweShzZWxmKToKKyAgICAgICAgIyBJIGhhZCBwcm9ibGVtcyB3aXRoIHRoZXNlCisgICAgICAgICMKKyAgICAgICAgIyBBbHRob3VnaCB0aGVzZSBhcmUgcGF0b2xvZ2ljYWwgY2FzZXM6IEVtcHR5IFN0cnVjdHVyZXMhCisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gW10KKworICAgICAgICBjbGFzcyBZKFVuaW9uKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gW10KKworICAgICAgICAjIElzIHRoaXMgcmVhbGx5IHRoZSBjb3JyZWN0IGFsaWdubWVudCwgb3Igc2hvdWxkIGl0IGJlIDA/CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGlnbm1lbnQoWCkgPT0gYWxpZ25tZW50KFkpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaXplb2YoWCkgPT0gc2l6ZW9mKFkpID09IDApCisKKyAgICAgICAgY2xhc3MgWFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIFgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgWCldCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlnbm1lbnQoWFgpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYWCksIDApCisKKyAgICBkZWYgdGVzdF9maWVsZHMoc2VsZik6CisgICAgICAgICMgdGVzdCB0aGUgb2Zmc2V0IGFuZCBzaXplIGF0dHJpYnV0ZXMgb2YgU3RydWN0dXJlL1Vub2luIGZpZWxkcy4KKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19jaGFyKV0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueC5vZmZzZXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC54LnNpemUsIHNpemVvZihjX2ludCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLnkub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKKworICAgICAgICAjIHJlYWRvbmx5CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgc2V0YXR0ciwgWC54LCAib2Zmc2V0IiwgOTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgc2V0YXR0ciwgWC54LCAic2l6ZSIsIDkyKQorCisgICAgICAgIGNsYXNzIFgoVW5pb24pOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19jaGFyKV0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueC5vZmZzZXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC54LnNpemUsIHNpemVvZihjX2ludCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLnkub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKKworICAgICAgICAjIHJlYWRvbmx5CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgc2V0YXR0ciwgWC54LCAib2Zmc2V0IiwgOTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgc2V0YXR0ciwgWC54LCAic2l6ZSIsIDkyKQorCisgICAgICAgICMgWFhYIFNob3VsZCB3ZSBjaGVjayBuZXN0ZWQgZGF0YSB0eXBlcyBhbHNvPworICAgICAgICAjIG9mZnNldCBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIGNsYXNzLi4uCisKKyAgICBkZWYgdGVzdF9wYWNrZWQoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2xvbmdsb25nKV0KKyAgICAgICAgICAgIF9wYWNrXyA9IDEKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmIub2Zmc2V0LCAxKQorCisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2xvbmdsb25nKV0KKyAgICAgICAgICAgIF9wYWNrXyA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYi5vZmZzZXQsIDIpCisKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfbG9uZ2xvbmcpXQorICAgICAgICAgICAgX3BhY2tfID0gNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5iLm9mZnNldCwgNCkKKworICAgICAgICBpbXBvcnQgc3RydWN0CisgICAgICAgIGxvbmdsb25nX3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoInEiKQorICAgICAgICBsb25nbG9uZ19hbGlnbiA9IHN0cnVjdC5jYWxjc2l6ZSgiYnEiKSAtIGxvbmdsb25nX3NpemUKKworICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19sb25nbG9uZyldCisgICAgICAgICAgICBfcGFja18gPSA4CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIGxvbmdsb25nX2FsaWduICsgbG9uZ2xvbmdfc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmIub2Zmc2V0LCBtaW4oOCwgbG9uZ2xvbmdfYWxpZ24pKQorCisKKyAgICAgICAgZCA9IHsiX2ZpZWxkc18iOiBbKCJhIiwgImIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgInEiKV0sCisgICAgICAgICAgICAgIl9wYWNrXyI6IC0xfQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0eXBlKFN0cnVjdHVyZSksICJYIiwgKFN0cnVjdHVyZSwpLCBkKQorCisgICAgICAgICMgSXNzdWUgMTU5ODkKKyAgICAgICAgZCA9IHsiX2ZpZWxkc18iOiBbKCJhIiwgY19ieXRlKV0sCisgICAgICAgICAgICAgIl9wYWNrXyI6IF90ZXN0Y2FwaS5JTlRfTUFYICsgMX0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHlwZShTdHJ1Y3R1cmUpLCAiWCIsIChTdHJ1Y3R1cmUsKSwgZCkKKyAgICAgICAgZCA9IHsiX2ZpZWxkc18iOiBbKCJhIiwgY19ieXRlKV0sCisgICAgICAgICAgICAgIl9wYWNrXyI6IF90ZXN0Y2FwaS5VSU5UX01BWCArIDJ9CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR5cGUoU3RydWN0dXJlKSwgIlgiLCAoU3RydWN0dXJlLCksIGQpCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXplcnMoc2VsZik6CisgICAgICAgIGNsYXNzIFBlcnNvbihTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY19jaGFyKjYpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJhZ2UiLCBjX2ludCldCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBQZXJzb24sIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBQZXJzb24sICJhc2xka2phc2xrZGphc2xrZGoiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFBlcnNvbiwgIk5hbWUiLCAiSEkiKQorCisgICAgICAgICMgc2hvcnQgZW5vdWdoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUGVyc29uKCIxMjM0NSIsIDUpLm5hbWUsICIxMjM0NSIpCisgICAgICAgICMgZXhhY3QgZml0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUGVyc29uKCIxMjM0NTYiLCA1KS5uYW1lLCAiMTIzNDU2IikKKyAgICAgICAgIyB0b28gbG9uZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBQZXJzb24sICIxMjM0NTY3IiwgNSkKKworICAgIGRlZiB0ZXN0X2NvbmZsaWN0aW5nX2luaXRpYWxpemVycyhzZWxmKToKKyAgICAgICAgY2xhc3MgUE9JTlQoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwgKCJ5IiwgY19pbnQpXQorICAgICAgICAjIGNvbmZsaWN0aW5nIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFBPSU5ULCAyLCAzLCB4PTQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgUE9JTlQsIDIsIDMsIHk9NCkKKworICAgICAgICAjIHRvbyBtYW55IGluaXRpYWxpemVycworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFBPSU5ULCAyLCAzLCA0KQorCisgICAgZGVmIHRlc3Rfa2V5d29yZF9pbml0aWFsaXplcnMoc2VsZik6CisgICAgICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksICgieSIsIGNfaW50KV0KKyAgICAgICAgcHQgPSBQT0lOVCgxLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChwdC54LCBwdC55KSwgKDEsIDIpKQorCisgICAgICAgIHB0ID0gUE9JTlQoeT0yLCB4PTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHB0LngsIHB0LnkpLCAoMSwgMikpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2ZpZWxkX3R5cGVzKHNlbGYpOgorICAgICAgICBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIFBPSU5ULCAiX2ZpZWxkc18iLCBbKCJ4IiwgMSksICgieSIsIDIpXSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfbmFtZShzZWxmKToKKyAgICAgICAgIyBmaWVsZCBuYW1lIG11c3QgYmUgc3RyaW5nCisgICAgICAgIGRlZiBkZWNsYXJlX3dpdGhfbmFtZShuYW1lKToKKyAgICAgICAgICAgIGNsYXNzIFMoU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsobmFtZSwgY19pbnQpXQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGVjbGFyZV93aXRoX25hbWUsIHUieFx4ZTkiKQorCisgICAgZGVmIHRlc3RfaW50YXJyYXlfZmllbGRzKHNlbGYpOgorICAgICAgICBjbGFzcyBTb21lSW50cyhTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQgKiA0KV0KKworICAgICAgICAjIGNhbiB1c2UgdHVwbGUgdG8gaW5pdGlhbGl6ZSBhcnJheSAoYnV0IG5vdCBsaXN0ISkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTb21lSW50cygoMSwgMikpLmFbOl0sIFsxLCAyLCAwLCAwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTb21lSW50cygoMSwgMikpLmFbOjpdLCBbMSwgMiwgMCwgMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU29tZUludHMoKDEsIDIpKS5hWzo6LTFdLCBbMCwgMCwgMiwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU29tZUludHMoKDEsIDIpKS5hWzo6Ml0sIFsxLCAwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTb21lSW50cygoMSwgMikpLmFbMTo1OjZdLCBbMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU29tZUludHMoKDEsIDIpKS5hWzY6NDotMV0sIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNvbWVJbnRzKCgxLCAyLCAzLCA0KSkuYVs6XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNvbWVJbnRzKCgxLCAyLCAzLCA0KSkuYVs6Ol0sIFsxLCAyLCAzLCA0XSkKKyAgICAgICAgIyB0b28gbG9uZworICAgICAgICAjIFhYWCBTaG91bGQgcmFpc2UgVmFsdWVFcnJvcj8sIG5vdCBSdW50aW1lRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBTb21lSW50cywgKDEsIDIsIDMsIDQsIDUpKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX2luaXRpYWxpemVycyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGluaXRpYWxpemluZyBuZXN0ZWQgc3RydWN0dXJlcworICAgICAgICBjbGFzcyBQaG9uZShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhcmVhY29kZSIsIGNfY2hhcio2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgibnVtYmVyIiwgY19jaGFyKjEyKV0KKworICAgICAgICBjbGFzcyBQZXJzb24oU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygibmFtZSIsIGNfY2hhciAqIDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgicGhvbmUiLCBQaG9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImFnZSIsIGNfaW50KV0KKworICAgICAgICBwID0gUGVyc29uKCJTb21lb25lIiwgKCIxMjM0IiwgIjU2NzgiKSwgNSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmFtZSwgIlNvbWVvbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGhvbmUuYXJlYWNvZGUsICIxMjM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBob25lLm51bWJlciwgIjU2NzgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuYWdlLCA1KQorCisgICAgZGVmIHRlc3Rfc3RydWN0dXJlc193aXRoX3djaGFyKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjX3djaGFyCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gIyBubyB1bmljb2RlCisKKyAgICAgICAgY2xhc3MgUGVyc29uVyhTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY193Y2hhciAqIDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYWdlIiwgY19pbnQpXQorCisgICAgICAgIHAgPSBQZXJzb25XKHUiU29tZW9uZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uYW1lLCAiU29tZW9uZSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQZXJzb25XKHUiMTIzNDU2Nzg5MCIpLm5hbWUsIHUiMTIzNDU2Nzg5MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUGVyc29uVyh1IjEyMzQ1Njc4OTAxIikubmFtZSwgdSIxMjM0NTY3ODkwMSIpCisgICAgICAgICMgZXhhY3QgZml0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUGVyc29uVyh1IjEyMzQ1Njc4OTAxMiIpLm5hbWUsIHUiMTIzNDU2Nzg5MDEyIikKKyAgICAgICAgI3RvbyBsb25nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIFBlcnNvblcsIHUiMTIzNDU2Nzg5MDEyMyIpCisKKyAgICBkZWYgdGVzdF9pbml0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgY2xhc3MgUGhvbmUoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYXJlYWNvZGUiLCBjX2NoYXIqNiksCisgICAgICAgICAgICAgICAgICAgICAgICAoIm51bWJlciIsIGNfY2hhcioxMildCisKKyAgICAgICAgY2xhc3MgUGVyc29uKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIm5hbWUiLCBjX2NoYXIgKiAxMiksCisgICAgICAgICAgICAgICAgICAgICAgICAoInBob25lIiwgUGhvbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJhZ2UiLCBjX2ludCldCisKKyAgICAgICAgY2xzLCBtc2cgPSBzZWxmLmdldF9leGNlcHQoUGVyc29uLCAiU29tZW9uZSIsICgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbHMsIFJ1bnRpbWVFcnJvcikKKyAgICAgICAgIyBJbiBQeXRob24gMi41LCBFeGNlcHRpb24gaXMgYSBuZXctc3R5bGUgY2xhc3MsIGFuZCB0aGUgcmVwciBjaGFuZ2VkCisgICAgICAgIGlmIGlzc3ViY2xhc3MoRXhjZXB0aW9uLCBvYmplY3QpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSA8dHlwZSAnZXhjZXB0aW9ucy5UeXBlRXJyb3InPjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwgaW50IGZvdW5kIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgZXhjZXB0aW9ucy5UeXBlRXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QsIGludCBmb3VuZCIpCisKKyAgICAgICAgY2xzLCBtc2cgPSBzZWxmLmdldF9leGNlcHQoUGVyc29uLCAiU29tZW9uZSIsICgiYSIsICJiIiwgImMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbHMsIFJ1bnRpbWVFcnJvcikKKyAgICAgICAgaWYgaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoUGhvbmUpIDx0eXBlICdleGNlcHRpb25zLlR5cGVFcnJvcic+OiB0b28gbWFueSBpbml0aWFsaXplcnMiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csICIoUGhvbmUpIGV4Y2VwdGlvbnMuVHlwZUVycm9yOiB0b28gbWFueSBpbml0aWFsaXplcnMiKQorCisgICAgZGVmIHRlc3RfaHVnZV9maWVsZF9uYW1lKHNlbGYpOgorICAgICAgICAjIGlzc3VlMTI4ODE6IHNlZ2ZhdWx0IHdpdGggbGFyZ2Ugc3RydWN0dXJlIGZpZWxkIG5hbWVzCisgICAgICAgIGRlZiBjcmVhdGVfY2xhc3MobGVuZ3RoKToKKyAgICAgICAgICAgIGNsYXNzIFMoU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoJ3gnICogbGVuZ3RoLCBjX2ludCldCisKKyAgICAgICAgZm9yIGxlbmd0aCBpbiBbMTAgKiogaSBmb3IgaSBpbiByYW5nZSgwLCA4KV06CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3JlYXRlX2NsYXNzKGxlbmd0aCkKKyAgICAgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKKyAgICAgICAgICAgICAgICAjIE1lbW9yeUVycm9ycyBhcmUgT0ssIHdlIGp1c3QgZG9uJ3Qgd2FudCB0byBzZWdmYXVsdAorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBnZXRfZXhjZXB0KHNlbGYsIGZ1bmMsICphcmdzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYygqYXJncykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZGV0YWlsOgorICAgICAgICAgICAgcmV0dXJuIGRldGFpbC5fX2NsYXNzX18sIHN0cihkZXRhaWwpCisKKworIyMgICAgZGVmIHRlc3Rfc3ViY2xhc3NfY3JlYXRpb24oc2VsZik6CisjIyAgICAgICAgbWV0YSA9IHR5cGUoU3RydWN0dXJlKQorIyMgICAgICAgICMgc2FtZSBhcyAnY2xhc3MgWChTdHJ1Y3R1cmUpOiBwYXNzJworIyMgICAgICAgICMgZmFpbHMsIHNpbmNlIHdlIG5lZWQgZWl0aGVyIGEgX2ZpZWxkc18gb3IgYSBfYWJzdHJhY3RfIGF0dHJpYnV0ZQorIyMgICAgICAgIGNscywgbXNnID0gc2VsZi5nZXRfZXhjZXB0KG1ldGEsICJYIiwgKFN0cnVjdHVyZSwpLCB7fSkKKyMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChjbHMsIG1zZyksCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEF0dHJpYnV0ZUVycm9yLCAiY2xhc3MgbXVzdCBkZWZpbmUgYSAnX2ZpZWxkc18nIGF0dHJpYnV0ZSIpKQorCisgICAgZGVmIHRlc3RfYWJzdHJhY3RfY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9hYnN0cmFjdF8gPSAic29tZXRoaW5nIgorICAgICAgICAjIHRyeSAnWCgpJworICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChldmFsLCAiWCgpIiwgbG9jYWxzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNscywgbXNnKSwgKFR5cGVFcnJvciwgImFic3RyYWN0IGNsYXNzIikpCisKKyAgICBkZWYgdGVzdF9tZXRob2RzKHNlbGYpOgorIyMgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyMjICAgICAgICAgICAgX2ZpZWxkc18gPSBbXQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiaW5fZGxsIiBpbiBkaXIodHlwZShTdHJ1Y3R1cmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJmcm9tX2FkZHJlc3MiIGluIGRpcih0eXBlKFN0cnVjdHVyZSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImluX2RsbCIgaW4gZGlyKHR5cGUoU3RydWN0dXJlKSkpCisKKyAgICBkZWYgdGVzdF9wb3NpdGlvbmFsX2FyZ3Moc2VsZik6CisgICAgICAgICMgc2VlIGFsc28gaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTUwNDIKKyAgICAgICAgY2xhc3MgVyhTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpLCAoImIiLCBjX2ludCldCisgICAgICAgIGNsYXNzIFgoVyk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImMiLCBjX2ludCldCisgICAgICAgIGNsYXNzIFkoWCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIFooWSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImQiLCBjX2ludCksICgiZSIsIGNfaW50KSwgKCJmIiwgY19pbnQpXQorCisgICAgICAgIHogPSBaKDEsIDIsIDMsIDQsIDUsIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHouYSwgei5iLCB6LmMsIHouZCwgei5lLCB6LmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAyLCAzLCA0LCA1LCA2KSkKKyAgICAgICAgeiA9IFooMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoei5hLCB6LmIsIHouYywgei5kLCB6LmUsIHouZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKDEsIDAsIDAsIDAsIDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogWigxLCAyLCAzLCA0LCA1LCA2LCA3KSkKKworY2xhc3MgUG9pbnRlck1lbWJlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAjIGEgU3RydWN0dXJlIHdpdGggYSBQT0lOVEVSIGZpZWxkCisgICAgICAgIGNsYXNzIFMoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYXJyYXkiLCBQT0lOVEVSKGNfaW50KSldCisKKyAgICAgICAgcyA9IFMoKQorICAgICAgICAjIFdlIGNhbiBhc3NpZ24gYXJyYXlzIG9mIHRoZSBjb3JyZWN0IHR5cGUKKyAgICAgICAgcy5hcnJheSA9IChjX2ludCAqIDMpKDEsIDIsIDMpCisgICAgICAgIGl0ZW1zID0gW3MuYXJyYXlbaV0gZm9yIGkgaW4gcmFuZ2UoMyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIFsxLCAyLCAzXSkKKworICAgICAgICAjIFRoZSBmb2xsb3dpbmcgYXJlIGJ1Z3MsIGJ1dCBhcmUgaW5jbHVkZWQgaGVyZSBiZWNhdXNlIHRoZSB1bml0dGVzdHMKKyAgICAgICAgIyBhbHNvIGRlc2NyaWJlIHRoZSBjdXJyZW50IGJlaGF2aW91ci4KKyAgICAgICAgIworICAgICAgICAjIFRoaXMgZmFpbHMgd2l0aCBTeXN0ZW1FcnJvcjogYmFkIGFyZyB0byBpbnRlcm5hbCBmdW5jdGlvbgorICAgICAgICAjIG9yIHdpdGggSW5kZXhFcnJvciAod2l0aCBhIHBhdGNoIEkgaGF2ZSkKKworICAgICAgICBzLmFycmF5WzBdID0gNDIKKworICAgICAgICBpdGVtcyA9IFtzLmFycmF5W2ldIGZvciBpIGluIHJhbmdlKDMpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW1zLCBbNDIsIDIsIDNdKQorCisgICAgICAgIHMuYXJyYXlbMF0gPSAxCisKKyMjICAgICAgICBzLmFycmF5WzFdID0gNDIKKworICAgICAgICBpdGVtcyA9IFtzLmFycmF5W2ldIGZvciBpIGluIHJhbmdlKDMpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW1zLCBbMSwgMiwgM10pCisKKyAgICBkZWYgdGVzdF9ub25lX3RvX3BvaW50ZXJfZmllbGRzKHNlbGYpOgorICAgICAgICBjbGFzcyBTKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoInAiLCBQT0lOVEVSKGNfaW50KSldCisKKyAgICAgICAgcyA9IFMoKQorICAgICAgICBzLnggPSAxMjM0NTY3OAorICAgICAgICBzLnAgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy54LCAxMjM0NTY3OCkKKworY2xhc3MgVGVzdFJlY3Vyc2l2ZVN0cnVjdHVyZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY29udGFpbnNfaXRzZWxmKHNlbGYpOgorICAgICAgICBjbGFzcyBSZWN1cnNpdmUoU3RydWN0dXJlKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBSZWN1cnNpdmUuX2ZpZWxkc18gPSBbKCJuZXh0IiwgUmVjdXJzaXZlKV0KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBkZXRhaWxzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJTdHJ1Y3R1cmUgb3IgdW5pb24gY2Fubm90IGNvbnRhaW4gaXRzZWxmIiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihkZXRhaWxzKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU3RydWN0dXJlIG9yIHVuaW9uIGNhbm5vdCBjb250YWluIGl0c2VsZiIpCisKKworICAgIGRlZiB0ZXN0X3ZpY2VfdmVyc2Eoc2VsZik6CisgICAgICAgIGNsYXNzIEZpcnN0KFN0cnVjdHVyZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIFNlY29uZChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIEZpcnN0Ll9maWVsZHNfID0gWygic2Vjb25kIiwgU2Vjb25kKV0KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBTZWNvbmQuX2ZpZWxkc18gPSBbKCJmaXJzdCIsIEZpcnN0KV0KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBkZXRhaWxzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJfZmllbGRzXyBpcyBmaW5hbCIgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoZGV0YWlscykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkF0dHJpYnV0ZUVycm9yIG5vdCByYWlzZWQiKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NmY5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NmY5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3VuYWxpZ25lZF9zdHJ1Y3R1cmVzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3VuYWxpZ25lZF9zdHJ1Y3R1cmVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYWNmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdW5hbGlnbmVkX3N0cnVjdHVyZXMucHkKQEAgLTAsMCArMSw0NSBAQAoraW1wb3J0IHN5cywgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK3N0cnVjdHVyZXMgPSBbXQorYnl0ZXN3YXBwZWRfc3RydWN0dXJlcyA9IFtdCisKKworaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICBTd2FwcGVkU3RydWN0dXJlID0gQmlnRW5kaWFuU3RydWN0dXJlCitlbHNlOgorICAgIFN3YXBwZWRTdHJ1Y3R1cmUgPSBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUKKworZm9yIHR5cCBpbiBbY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19sb25nbG9uZywKKyAgICAgICAgICAgIGNfZmxvYXQsIGNfZG91YmxlLAorICAgICAgICAgICAgY191c2hvcnQsIGNfdWludCwgY191bG9uZywgY191bG9uZ2xvbmddOgorICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgX3BhY2tfID0gMQorICAgICAgICBfZmllbGRzXyA9IFsoInBhZCIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICgidmFsdWUiLCB0eXApXQorICAgIGNsYXNzIFkoU3dhcHBlZFN0cnVjdHVyZSk6CisgICAgICAgIF9wYWNrXyA9IDEKKyAgICAgICAgX2ZpZWxkc18gPSBbKCJwYWQiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAoInZhbHVlIiwgdHlwKV0KKyAgICBzdHJ1Y3R1cmVzLmFwcGVuZChYKQorICAgIGJ5dGVzd2FwcGVkX3N0cnVjdHVyZXMuYXBwZW5kKFkpCisKK2NsYXNzIFRlc3RTdHJ1Y3R1cmVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9uYXRpdmUoc2VsZik6CisgICAgICAgIGZvciB0eXAgaW4gc3RydWN0dXJlczoKKyMjICAgICAgICAgICAgcHJpbnQgdHlwLnZhbHVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cC52YWx1ZS5vZmZzZXQsIDEpCisgICAgICAgICAgICBvID0gdHlwKCkKKyAgICAgICAgICAgIG8udmFsdWUgPSA0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8udmFsdWUsIDQpCisKKyAgICBkZWYgdGVzdF9zd2FwcGVkKHNlbGYpOgorICAgICAgICBmb3IgdHlwIGluIGJ5dGVzd2FwcGVkX3N0cnVjdHVyZXM6CisjIyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIHR5cC52YWx1ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXAudmFsdWUub2Zmc2V0LCAxKQorICAgICAgICAgICAgbyA9IHR5cCgpCisgICAgICAgICAgICBvLnZhbHVlID0gNAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLnZhbHVlLCA0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3VuYWxpZ25lZF9zdHJ1Y3R1cmVzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2MmIwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3VuYWxpZ25lZF9zdHJ1Y3R1cmVzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2MmIwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3VuaWNvZGUucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTU3NDc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3VuaWNvZGUucHkKQEAgLTAsMCArMSwxMjkgQEAKKyMgY29kaW5nOiBsYXRpbi0xCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBjdHlwZXMKKwordHJ5OgorICAgIGN0eXBlcy5jX3djaGFyCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBpbXBvcnQgX2N0eXBlc190ZXN0CisgICAgZGxsID0gY3R5cGVzLkNETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgIHdjc2xlbiA9IGRsbC5teV93Y3NsZW4KKyAgICB3Y3NsZW4uYXJndHlwZXMgPSBbY3R5cGVzLmNfd2NoYXJfcF0KKworCisgICAgY2xhc3MgVW5pY29kZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5wcmV2X2NvbnZfbW9kZSA9IGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQorCisgICAgICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCpzZWxmLnByZXZfY29udl9tb2RlKQorCisgICAgICAgIGRlZiB0ZXN0X2FzY2lpX3N0cmljdChzZWxmKToKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQorICAgICAgICAgICAgIyBubyBjb252ZXJzaW9ucyB0YWtlIHBsYWNlIHdpdGggdW5pY29kZSBhcmd1bWVudHMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCisgICAgICAgICAgICAjIHN0cmluZyBhcmdzIGFyZSBjb252ZXJ0ZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGN0eXBlcy5Bcmd1bWVudEVycm9yLCB3Y3NsZW4sICJhYuQiKQorCisgICAgICAgIGRlZiB0ZXN0X2FzY2lpX3JlcGxhY2Uoc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFi5CIpLCAzKQorCisgICAgICAgIGRlZiB0ZXN0X2FzY2lpX2lnbm9yZShzZWxmKToKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKKyAgICAgICAgICAgICMgaWdub3JlIGVycm9yIG1vZGUgc2tpcHMgbm9uLWFzY2lpIGNoYXJhY3RlcnMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCLk9vzfIiksIDApCisKKyAgICAgICAgZGVmIHRlc3RfbGF0aW4xX3N0cmljdChzZWxmKToKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJsYXRpbi0xIiwgInN0cmljdCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oIuT2/N8iKSwgNCkKKworICAgICAgICBkZWYgdGVzdF9idWZmZXJzKHNlbGYpOgorICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCisgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYmMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVmKSwgMysxKQorCisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCisgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYuT2/CIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6XSwgdSJhYlx1RkZGRFx1RkZGRFx1RkZGRFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgdSJhYlx1RkZGRFx1RkZGRFx1RkZGRFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCB1IlwwXHVGRkZEXHVGRkZEXHVGRkZEYmEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjoyXSwgdSJhXHVGRkZEXHVGRkZEIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzY6NTotMV0sIHUiIikKKworICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCisgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYuT2/CIpCisgICAgICAgICAgICAjIGlzIHRoYXQgY29ycmVjdD8gbm90IHN1cmUuICBCdXQgd2l0aCAnaWdub3JlJywgeW91IGdldCB3aGF0IHlvdSBwYXkgZm9yLi4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzpdLCB1ImFiXDBcMFwwXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjpdLCB1ImFiXDBcMFwwXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sIHUiXDBcMFwwXDBiYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6OjJdLCB1ImFcMFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzY6NTotMV0sIHUiIikKKworICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKKyAgICBmdW5jID0gY3R5cGVzLkNETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKS5fdGVzdGZ1bmNfcF9wCisKKyAgICBjbGFzcyBTdHJpbmdUZXN0Q2FzZShVbmljb2RlVGVzdENhc2UpOgorICAgICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICAgICBzZWxmLnByZXZfY29udl9tb2RlID0gY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCisgICAgICAgICAgICBmdW5jLmFyZ3R5cGVzID0gW2N0eXBlcy5jX2NoYXJfcF0KKyAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGN0eXBlcy5jX2NoYXJfcAorCisgICAgICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCpzZWxmLnByZXZfY29udl9tb2RlKQorICAgICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IE5vbmUKKyAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGN0eXBlcy5jX2ludAorCisgICAgICAgIGRlZiB0ZXN0X2FzY2lpX3JlcGxhY2Uoc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYygiYWJjIiksICJhYmMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3R5cGVzLkFyZ3VtZW50RXJyb3IsIGZ1bmMsIHUiYWLkIikKKworICAgICAgICBkZWYgdGVzdF9hc2NpaV9pZ25vcmUoc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYygiYWJjIiksICJhYmMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKHUi5Pb83yIpLCAiIikKKworICAgICAgICBkZWYgdGVzdF9hc2NpaV9yZXBsYWNlKHNlbGYpOgorICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInJlcGxhY2UiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKCJhYmMiKSwgImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSLk9vzfIiksICI/Pz8/IikKKworICAgICAgICBkZWYgdGVzdF9idWZmZXJzKHNlbGYpOgorICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCisgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYmMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVmKSwgMysxKQorCisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCisgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYuT2/CIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6XSwgImFiPz8/XDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjpdLCAiYWI/Pz9cMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Oi0xXSwgIlwwPz8/YmEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjoyXSwgImE/PyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls2OjU6LTFdLCAiIikKKworICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCisgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYuT2/CIpCisgICAgICAgICAgICAjIGlzIHRoYXQgY29ycmVjdD8gbm90IHN1cmUuICBCdXQgd2l0aCAnaWdub3JlJywgeW91IGdldCB3aGF0IHlvdSBwYXkgZm9yLi4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzpdLCAiYWJcMFwwXDBcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sICJhYlwwXDBcMFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCAiXDBcMFwwXDBiYSIpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExY2FhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExY2FhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2JmZDRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weQpAQCAtMCwwICsxLDgyIEBACisiIiIKK0EgdGVzdGNhc2Ugd2hpY2ggYWNjZXNzZXMgKnZhbHVlcyogaW4gYSBkbGwuCisiIiIKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitpbXBvcnQgX2N0eXBlc190ZXN0CisKK2NsYXNzIFZhbHVlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2FuX2ludGVnZXIoc2VsZik6CisgICAgICAgIGN0ZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIGFuX2ludGVnZXIgPSBjX2ludC5pbl9kbGwoY3RkbGwsICJhbl9pbnRlZ2VyIikKKyAgICAgICAgeCA9IGFuX2ludGVnZXIudmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBjdGRsbC5nZXRfYW5faW50ZWdlcigpKQorICAgICAgICBhbl9pbnRlZ2VyLnZhbHVlICo9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4KjIsIGN0ZGxsLmdldF9hbl9pbnRlZ2VyKCkpCisKKyAgICBkZWYgdGVzdF91bmRlZmluZWQoc2VsZik6CisgICAgICAgIGN0ZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNfaW50LmluX2RsbCwgY3RkbGwsICJVbmRlZmluZWRfU3ltYm9sIikKKworICAgIGNsYXNzIFdpbl9WYWx1ZXNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICIiIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdoZW4gcHl0aG9uIGl0c2VsZiBpcyBhIGRsbC9zaGFyZWQgbGlicmFyeSIiIgorCisgICAgICAgIGRlZiB0ZXN0X29wdGltaXplZmxhZyhzZWxmKToKKyAgICAgICAgICAgICMgVGhpcyB0ZXN0IGFjY2Vzc2VzIHRoZSBQeV9PcHRpbWl6ZUZsYWcgaW50Z2VyLCB3aGljaCBpcworICAgICAgICAgICAgIyBleHBvcnRlZCBieSB0aGUgUHl0aG9uIGRsbC4KKworICAgICAgICAgICAgIyBJdCdzIHZhbHVlIGlzIHNldCBkZXBlbmRpbmcgb24gdGhlIC1PIGFuZCAtT08gZmxhZ3M6CisgICAgICAgICAgICAjIGlmIG5vdCBnaXZlbiwgaXQgaXMgMCBhbmQgX19kZWJ1Z19fIGlzIDEuCisgICAgICAgICAgICAjIElmIC1PIGlzIGdpdmVuLCB0aGUgZmxhZyBpcyAxLCBmb3IgLU9PIGl0IGlzIDIuCisgICAgICAgICAgICAjIGRvY3N0cmluZ3MgYXJlIGFsc28gcmVtb3ZlZCBpbiB0aGUgbGF0dGVyIGNhc2UuCisgICAgICAgICAgICBvcHQgPSBjX2ludC5pbl9kbGwocHlkbGwsICJQeV9PcHRpbWl6ZUZsYWciKS52YWx1ZQorICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LCAwKQorICAgICAgICAgICAgZWxpZiBWYWx1ZXNUZXN0Q2FzZS5fX2RvY19fIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LCAxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdCwgMikKKworICAgICAgICBkZWYgdGVzdF9mcm96ZW50YWJsZShzZWxmKToKKyAgICAgICAgICAgICMgUHl0aG9uIGV4cG9ydHMgYSBQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzIHN5bWJvbC4gVGhpcyBpcyBhCisgICAgICAgICAgICAjIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2Ygc3RydWN0IF9mcm96ZW4gZW50cmllcy4gIFRoZSBlbmQgb2YgdGhlCisgICAgICAgICAgICAjIGFycmF5IGlzIG1hcmtlZCBieSBhbiBlbnRyeSBjb250YWluaW5nIGEgTlVMTCBuYW1lIGFuZCB6ZXJvCisgICAgICAgICAgICAjIHNpemUuCisKKyAgICAgICAgICAgICMgSW4gc3RhbmRhcmQgUHl0aG9uLCB0aGlzIHRhYmxlIGNvbnRhaW5zIGEgX19oZWxsb19fCisgICAgICAgICAgICAjIG1vZHVsZSwgYW5kIGEgX19waGVsbG9fXyBwYWNrYWdlIGNvbnRhaW5pbmcgYSBzcGFtCisgICAgICAgICAgICAjIG1vZHVsZS4KKyAgICAgICAgICAgIGNsYXNzIHN0cnVjdF9mcm96ZW4oU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIm5hbWUiLCBjX2NoYXJfcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjb2RlIiwgUE9JTlRFUihjX3VieXRlKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJzaXplIiwgY19pbnQpXQorICAgICAgICAgICAgRnJvemVuVGFibGUgPSBQT0lOVEVSKHN0cnVjdF9mcm96ZW4pCisKKyAgICAgICAgICAgIGZ0ID0gRnJvemVuVGFibGUuaW5fZGxsKHB5ZGxsLCAiUHlJbXBvcnRfRnJvemVuTW9kdWxlcyIpCisgICAgICAgICAgICAjIGZ0IGlzIGEgcG9pbnRlciB0byB0aGUgc3RydWN0X2Zyb3plbiBlbnRyaWVzOgorICAgICAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICAgICAgZm9yIGVudHJ5IGluIGZ0OgorICAgICAgICAgICAgICAgICMgVGhpcyBpcyBkYW5nZXJvdXMuIFdlICpjYW4qIGl0ZXJhdGUgb3ZlciBhIHBvaW50ZXIsIGJ1dAorICAgICAgICAgICAgICAgICMgdGhlIGxvb3Agd2lsbCBub3QgdGVybWluYXRlIChtYXliZSB3aXRoIGFuIGFjY2VzcworICAgICAgICAgICAgICAgICMgdmlvbGF0aW9uOy0pIGJlY2F1c2UgdGhlIHBvaW50ZXIgaW5zdGFuY2UgaGFzIG5vIHNpemUuCisgICAgICAgICAgICAgICAgaWYgZW50cnkubmFtZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZCgoZW50cnkubmFtZSwgZW50cnkuc2l6ZSkpCisgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzoyXSA+PSAoMiwgMyk6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbKCJfX2hlbGxvX18iLCAxMDQpLCAoIl9fcGhlbGxvX18iLCAtMTA0KSwgKCJfX3BoZWxsb19fLnNwYW0iLCAxMDQpXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFsoIl9faGVsbG9fXyIsIDEwMCksICgiX19waGVsbG9fXyIsIC0xMDApLCAoIl9fcGhlbGxvX18uc3BhbSIsIDEwMCldCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW1zLCBleHBlY3RlZCkKKworICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IF9wb2ludGVyX3R5cGVfY2FjaGUKKyAgICAgICAgICAgIGRlbCBfcG9pbnRlcl90eXBlX2NhY2hlW3N0cnVjdF9mcm96ZW5dCisKKyAgICAgICAgZGVmIHRlc3RfdW5kZWZpbmVkKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY19pbnQuaW5fZGxsLCBweWRsbCwgIlVuZGVmaW5lZF9TeW1ib2wiKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWYyYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjY2YWE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3ZhcnNpemVfc3RydWN0LnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3ZhcnNpemVfc3RydWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MDk1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHkKQEAgLTAsMCArMSw1MCBAQAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBWYXJTaXplVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcmVzaXplKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIml0ZW0iLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImFycmF5IiwgY19pbnQgKiAxKV0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSAqIDIpCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgeC5pdGVtID0gNDIKKyAgICAgICAgeC5hcnJheVswXSA9IDEwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZih4KSwgc2l6ZW9mKGNfaW50KSAqIDIpCisKKyAgICAgICAgIyBtYWtlIHJvb20gZm9yIG9uZSBhZGRpdGlvbmFsIGl0ZW0KKyAgICAgICAgbmV3X3NpemUgPSBzaXplb2YoWCkgKyBzaXplb2YoY19pbnQpICogMQorICAgICAgICByZXNpemUoeCwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHgpLCBuZXdfc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoeC5pdGVtLCB4LmFycmF5WzBdKSwgKDQyLCAxMDApKQorCisgICAgICAgICMgbWFrZSByb29tIGZvciAxMCBhZGRpdGlvbmFsIGl0ZW1zCisgICAgICAgIG5ld19zaXplID0gc2l6ZW9mKFgpICsgc2l6ZW9mKGNfaW50KSAqIDkKKyAgICAgICAgcmVzaXplKHgsIG5ld19zaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZih4KSwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHguaXRlbSwgeC5hcnJheVswXSksICg0MiwgMTAwKSkKKworICAgICAgICAjIG1ha2Ugcm9vbSBmb3Igb25lIGFkZGl0aW9uYWwgaXRlbQorICAgICAgICBuZXdfc2l6ZSA9IHNpemVvZihYKSArIHNpemVvZihjX2ludCkgKiAxCisgICAgICAgIHJlc2l6ZSh4LCBuZXdfc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoeCksIG5ld19zaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4Lml0ZW0sIHguYXJyYXlbMF0pLCAoNDIsIDEwMCkpCisKKyAgICBkZWYgdGVzdF9hcnJheV9pbnZhbGlkX2xlbmd0aChzZWxmKToKKyAgICAgICAgIyBjYW5ub3QgY3JlYXRlIGFycmF5cyB3aXRoIG5vbi1wb3NpdGl2ZSBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogY19pbnQgKiAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBjX2ludCAqIC0zKQorCisgICAgZGVmIHRlc3RfemVyb3NpemVkX2FycmF5KHNlbGYpOgorICAgICAgICBhcnJheSA9IChjX2ludCAqIDApKCkKKyAgICAgICAgIyBhY2Nlc3NpbmcgZWxlbWVudHMgb2YgemVyby1zaXplZCBhcnJheXMgcmFpc2UgSW5kZXhFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX3NldGl0ZW1fXywgMCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19nZXRpdGVtX18sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fc2V0aXRlbV9fLCAxLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX2dldGl0ZW1fXywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19zZXRpdGVtX18sIC0xLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX2dldGl0ZW1fXywgLTEpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3ZhcnNpemVfc3RydWN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWE5Yjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3ZhcnNpemVfc3RydWN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3ZhcnNpemVfc3RydWN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWE5Yjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3ZhcnNpemVfc3RydWN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlNmZlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weQpAQCAtMCwwICsxLDkzIEBACisjIFdpbmRvd3Mgc3BlY2lmaWMgdGVzdHMKKworZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnRlc3QgaW1wb3J0IGlzX3Jlc291cmNlX2VuYWJsZWQKK2ltcG9ydCB1bml0dGVzdCwgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0CisKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKKworaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIgYW5kIHNpemVvZihjX3ZvaWRfcCkgPT0gc2l6ZW9mKGNfaW50KToKKyAgICAjIE9ubHkgd2luZG93cyAzMi1iaXQgaGFzIGRpZmZlcmVudCBjYWxsaW5nIGNvbnZlbnRpb25zLgorCisgICAgY2xhc3MgV2luZG93c1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgZGVmIHRlc3RfY2FsbGNvbnZfMShzZWxmKToKKyAgICAgICAgICAgICMgVGVzdGluZyBzdGRjYWxsIGZ1bmN0aW9uCisKKyAgICAgICAgICAgIElzV2luZG93ID0gd2luZGxsLnVzZXIzMi5Jc1dpbmRvdworICAgICAgICAgICAgIyBWYWx1ZUVycm9yOiBQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggbm90IGVub3VnaCBhcmd1bWVudHMgKDQgYnl0ZXMgbWlzc2luZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIElzV2luZG93KQorCisgICAgICAgICAgICAjIFRoaXMgb25lIHNob3VsZCBzdWNjZWVkLi4uCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIElzV2luZG93KDApKQorCisgICAgICAgICAgICAjIFZhbHVlRXJyb3I6IFByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCB0b28gbWFueSBhcmd1bWVudHMgKDggYnl0ZXMgaW4gZXhjZXNzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgSXNXaW5kb3csIDAsIDAsIDApCisKKyAgICAgICAgZGVmIHRlc3RfY2FsbGNvbnZfMihzZWxmKToKKyAgICAgICAgICAgICMgQ2FsbGluZyBzdGRjYWxsIGZ1bmN0aW9uIGFzIGNkZWNsCisKKyAgICAgICAgICAgIElzV2luZG93ID0gY2RsbC51c2VyMzIuSXNXaW5kb3cKKworICAgICAgICAgICAgIyBWYWx1ZUVycm9yOiBQcm9jZWR1cmUgY2FsbGVkIHdpdGggbm90IGVub3VnaCBhcmd1bWVudHMgKDQgYnl0ZXMgbWlzc2luZykKKyAgICAgICAgICAgICMgb3Igd3JvbmcgY2FsbGluZyBjb252ZW50aW9uCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBJc1dpbmRvdywgTm9uZSkKKworaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgY2xhc3MgRnVuY3Rpb25DYWxsVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgICAgIGlmIGlzX3Jlc291cmNlX2VuYWJsZWQoIlNFSCIpOgorICAgICAgICAgICAgZGVmIHRlc3RfU0VIKHNlbGYpOgorICAgICAgICAgICAgICAgICMgQ2FsbCBmdW5jdGlvbnMgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cywgYW5kIG1ha2Ugc3VyZQorICAgICAgICAgICAgICAgICMgdGhhdCBhY2Nlc3MgdmlvbGF0aW9ucyBhcmUgdHJhcHBlZCBhbmQgcmFpc2UgYW4KKyAgICAgICAgICAgICAgICAjIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsIHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBLCAzMikKKworICAgICAgICBkZWYgdGVzdF9ub2FyZ3Moc2VsZik6CisgICAgICAgICAgICAjIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugb24gd2luMzIgeDY0CisgICAgICAgICAgICB3aW5kbGwudXNlcjMyLkdldERlc2t0b3BXaW5kb3coKQorCisgICAgY2xhc3MgVGVzdFdpbnR5cGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgZGVmIHRlc3RfSFdORChzZWxmKToKKyAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW50eXBlcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2Yod2ludHlwZXMuSFdORCksIHNpemVvZihjX3ZvaWRfcCkpCisKKyAgICAgICAgZGVmIHRlc3RfUEFSQU0oc2VsZik6CisgICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHdpbnR5cGVzLldQQVJBTSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY192b2lkX3ApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2Yod2ludHlwZXMuTFBBUkFNKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjX3ZvaWRfcCkpCisKKyAgICAgICAgZGVmIHRlc3RfQ09NRXJyb3Ioc2VsZik6CisgICAgICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IENPTUVycm9yCisgICAgICAgICAgICBpZiBzdXBwb3J0LkhBVkVfRE9DU1RSSU5HUzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENPTUVycm9yLl9fZG9jX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFpc2VkIHdoZW4gYSBDT00gbWV0aG9kIGNhbGwgZmFpbGVkLiIpCisKKyAgICAgICAgICAgIGV4ID0gQ09NRXJyb3IoLTEsICJ0ZXh0IiwgKCJkZXRhaWxzIiwpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5ocmVzdWx0LCAtMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXgudGV4dCwgInRleHQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC5kZXRhaWxzLCAoImRldGFpbHMiLCkpCisKK2NsYXNzIFN0cnVjdHVyZXModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc3RydWN0X2J5X3ZhbHVlKHNlbGYpOgorICAgICAgICBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19sb25nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfbG9uZyldCisKKyAgICAgICAgY2xhc3MgUkVDVChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJsZWZ0IiwgY19sb25nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgidG9wIiwgY19sb25nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgicmlnaHQiLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJib3R0b20iLCBjX2xvbmcpXQorCisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorCisgICAgICAgIHB0ID0gUE9JTlQoMTAsIDEwKQorICAgICAgICByZWN0ID0gUkVDVCgwLCAwLCAyMCwgMjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgZGxsLlBvaW50SW5SZWN0KGJ5cmVmKHJlY3QpLCBwdCkpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGRjODk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGRjODk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfd2ludHlwZXMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfd2ludHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2ZmNjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF93aW50eXBlcy5weQpAQCAtMCwwICsxLDQzIEBACitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKToKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgnV2luZG93cy1vbmx5IHRlc3QnKQorCitmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMgaW1wb3J0IHdpbnR5cGVzCisKK2NsYXNzIFdpblR5cGVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfdmFyaWFudF9ib29sKHNlbGYpOgorICAgICAgICAjIHJlYWRzIDE2LWJpdHMgZnJvbSBtZW1vcnksIGFueXRoaW5nIG5vbi16ZXJvIGlzIFRydWUKKyAgICAgICAgZm9yIHRydWVfdmFsdWUgaW4gKDEsIDMyNzY3LCAzMjc2OCwgNjU1MzUsIDY1NTM3KToKKyAgICAgICAgICAgIHRydWUgPSBQT0lOVEVSKGNfaW50MTYpKGNfaW50MTYodHJ1ZV92YWx1ZSkpCisgICAgICAgICAgICB2YWx1ZSA9IGNhc3QodHJ1ZSwgUE9JTlRFUih3aW50eXBlcy5WQVJJQU5UX0JPT0wpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHZhbHVlLmNvbnRlbnRzKSwgJ1ZBUklBTlRfQk9PTChUcnVlKScpCisKKyAgICAgICAgICAgIHZiID0gd2ludHlwZXMuVkFSSUFOVF9CT09MKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModmIudmFsdWUsIEZhbHNlKQorICAgICAgICAgICAgdmIudmFsdWUgPSBUcnVlCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHZiLnZhbHVlLCBUcnVlKQorICAgICAgICAgICAgdmIudmFsdWUgPSB0cnVlX3ZhbHVlCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHZiLnZhbHVlLCBUcnVlKQorCisgICAgICAgIGZvciBmYWxzZV92YWx1ZSBpbiAoMCwgNjU1MzYsIDI2MjE0NCwgMioqMzMpOgorICAgICAgICAgICAgZmFsc2UgPSBQT0lOVEVSKGNfaW50MTYpKGNfaW50MTYoZmFsc2VfdmFsdWUpKQorICAgICAgICAgICAgdmFsdWUgPSBjYXN0KGZhbHNlLCBQT0lOVEVSKHdpbnR5cGVzLlZBUklBTlRfQk9PTCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodmFsdWUuY29udGVudHMpLCAnVkFSSUFOVF9CT09MKEZhbHNlKScpCisKKyAgICAgICAgIyBhbGxvdyBhbnkgYm9vbCBjb252ZXJzaW9uIG9uIGFzc2lnbm1lbnQgdG8gdmFsdWUKKyAgICAgICAgZm9yIHNldF92YWx1ZSBpbiAoNjU1MzYsIDI2MjE0NCwgMioqMzMpOgorICAgICAgICAgICAgdmIgPSB3aW50eXBlcy5WQVJJQU5UX0JPT0woKQorICAgICAgICAgICAgdmIudmFsdWUgPSBzZXRfdmFsdWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModmIudmFsdWUsIFRydWUpCisKKyAgICAgICAgdmIgPSB3aW50eXBlcy5WQVJJQU5UX0JPT0woKQorICAgICAgICB2Yi52YWx1ZSA9IFsyLCAzXQorICAgICAgICBzZWxmLmFzc2VydElzKHZiLnZhbHVlLCBUcnVlKQorICAgICAgICB2Yi52YWx1ZSA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0SXModmIudmFsdWUsIEZhbHNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3dpbnR5cGVzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF93aW50eXBlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzZmFkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF93aW50eXBlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3dpbnR5cGVzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF93aW50eXBlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzZmFkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF93aW50eXBlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdXRpbC5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4MDg3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3V0aWwucHkKQEAgLTAsMCArMSwyOTAgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ltcG9ydCBzeXMsIG9zCisKKyMgZmluZF9saWJyYXJ5KG5hbWUpIHJldHVybnMgdGhlIHBhdGhuYW1lIG9mIGEgbGlicmFyeSwgb3IgTm9uZS4KK2lmIG9zLm5hbWUgPT0gIm50IjoKKworICAgIGRlZiBfZ2V0X2J1aWxkX3ZlcnNpb24oKToKKyAgICAgICAgIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICMgTk9URTogQXMgZXhhbXBsZSBmb3IgR0NDKG1pbmd3KSBidWlsZCBzeXMudmVyc2lvbiByZXR1cm46CisgICAgICAgICMgJzIuN2EwICh0cnVuazo8UkVWSVNJT04+TSwgPERBVEU+LCA8VElNRT4pIFxuW0dDQyAzLjQuNSAobWluZ3cgc3BlY2lhbCldJworICAgICAgICAjICcyLjdhMCAodHJ1bms6PFJFVklTSU9OPk0sIDxEQVRFPiwgPFRJTUU+KSBcbltHQ0MgNC40LjBdJworICAgICAgICAjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIE1TVkMgdGhhdCB3YXMgdXNlZCB0byBidWlsZCBQeXRob24uCisKKyAgICAgICAgRm9yIFB5dGhvbiAyLjMgYW5kIHVwLCB0aGUgdmVyc2lvbiBudW1iZXIgaXMgaW5jbHVkZWQgaW4KKyAgICAgICAgc3lzLnZlcnNpb24uICBGb3IgZWFybGllciB2ZXJzaW9ucywgYXNzdW1lIHRoZSBjb21waWxlciBpcyBNU1ZDIDYuCisgICAgICAgICIiIgorICAgICAgICAjIFRoaXMgZnVuY3Rpb24gd2FzIGNvcGllZCBmcm9tIExpYi9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5CisgICAgICAgIHByZWZpeCA9ICJNU0Mgdi4iCisgICAgICAgIGkgPSBzeXMudmVyc2lvbi5maW5kKHByZWZpeCkKKyAgICAgICAgaWYgaSA9PSAtMToKKyAgICAgICAgICAgIHJldHVybiA2CisgICAgICAgIGkgPSBpICsgbGVuKHByZWZpeCkKKyAgICAgICAgcywgcmVzdCA9IHN5cy52ZXJzaW9uW2k6XS5zcGxpdCgiICIsIDEpCisgICAgICAgIG1ham9yVmVyc2lvbiA9IGludChzWzotMl0pIC0gNgorICAgICAgICBtaW5vclZlcnNpb24gPSBpbnQoc1syOjNdKSAvIDEwLjAKKyAgICAgICAgIyBJIGRvbid0IHRoaW5rIHBhdGhzIGFyZSBhZmZlY3RlZCBieSBtaW5vciB2ZXJzaW9uIGluIHZlcnNpb24gNgorICAgICAgICBpZiBtYWpvclZlcnNpb24gPT0gNjoKKyAgICAgICAgICAgIG1pbm9yVmVyc2lvbiA9IDAKKyAgICAgICAgaWYgbWFqb3JWZXJzaW9uID49IDY6CisgICAgICAgICAgICByZXR1cm4gbWFqb3JWZXJzaW9uICsgbWlub3JWZXJzaW9uCisgICAgICAgICMgZWxzZSB3ZSBkb24ndCBrbm93IHdoYXQgdmVyc2lvbiBvZiB0aGUgY29tcGlsZXIgdGhpcyBpcworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGZpbmRfbXN2Y3J0KCk6CisgICAgICAgICMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgIyBGSVhNRTogRm9yIEdDQyhtaW5ndykgcnVudGltZSBkb24ndCBkZXBlbmQgZnJvbSBjb21waWxlcgorICAgICAgICAjIHZlcnNpb24gOykuIFdlIG1heSB1c2UgLURfX01TVkNSVF9WRVJTSU9OX18gdG8gZGV0ZWN0IHdoaWNoCisgICAgICAgICMgdmVyaW9uIGlzIHJlcXVlc3RlZCBieSB1c2VyLCBidXQgdGhlIG5hbWUgb2YgdGhlIGxpYnJhcnkKKyAgICAgICAgIyB0byBiZSBkZWZhdWx0LgorICAgICAgICAjIEFzIGV4YW1wbGUgV1hQIGlzIHdpdGggdmVyc2lvbiA3LjAgb2YgbXN2Y3J0LmRsbC4KKyAgICAgICAgIyBBbnl3YXkgc2luY2UgX2dldF9idWlsZF92ZXJzaW9uIHJldHVybiA2IGluIG1vc3Qoc3RhbmRhcmQpCisgICAgICAgICMgY2FzZXMgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbXN2Y3J0e2R9LiBNYXkgYmUgbm90IHNvIGJhZC4KKyAgICAgICAgIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIFZDIHJ1bnRpbWUgZGxsIiIiCisgICAgICAgIHZlcnNpb24gPSBfZ2V0X2J1aWxkX3ZlcnNpb24oKQorICAgICAgICBpZiB2ZXJzaW9uIGlzIE5vbmU6CisgICAgICAgICAgICAjIGJldHRlciBiZSBzYWZlIHRoYW4gc29ycnkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIHZlcnNpb24gPD0gNjoKKyAgICAgICAgICAgIGNsaWJuYW1lID0gJ21zdmNydCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNsaWJuYW1lID0gJ21zdmNyJWQnICUgKHZlcnNpb24gKiAxMCkKKworICAgICAgICAjIElmIHB5dGhvbiB3YXMgYnVpbHQgd2l0aCBpbiBkZWJ1ZyBtb2RlCisgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgaWYgaW1wLmdldF9zdWZmaXhlcygpWzBdWzBdID09ICdfZC5weWQnOgorICAgICAgICAgICAgY2xpYm5hbWUgKz0gJ2QnCisgICAgICAgIHJldHVybiBjbGlibmFtZSsnLmRsbCcKKworICAgIGRlZiBmaW5kX2xpYnJhcnkobmFtZSk6CisgICAgICAgIGlmIG5hbWUgaW4gKCdjJywgJ20nKToKKyAgICAgICAgICAgIHJldHVybiBmaW5kX21zdmNydCgpCisgICAgICAgICMgU2VlIE1TRE4gZm9yIHRoZSBSRUFMIHNlYXJjaCBvcmRlci4KKyAgICAgICAgZm9yIGRpcmVjdG9yeSBpbiBvcy5lbnZpcm9uWydQQVRIJ10uc3BsaXQob3MucGF0aHNlcCk6CisgICAgICAgICAgICBmbmFtZSA9IG9zLnBhdGguam9pbihkaXJlY3RvcnksIG5hbWUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmbmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZuYW1lCisgICAgICAgICAgICBpZiBmbmFtZS5sb3dlcigpLmVuZHN3aXRoKCIuZGxsIik6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZuYW1lID0gZm5hbWUgKyAiLmRsbCIKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZm5hbWUKKyAgICAgICAgcmV0dXJuIE5vbmUKKworaWYgb3MubmFtZSA9PSAiY2UiOgorICAgICMgc2VhcmNoIHBhdGggYWNjb3JkaW5nIHRvIE1TRE46CisgICAgIyAtIGFic29sdXRlIHBhdGggc3BlY2lmaWVkIGJ5IGZpbGVuYW1lCisgICAgIyAtIFRoZSAuZXhlIGxhdW5jaCBkaXJlY3RvcnkKKyAgICAjIC0gdGhlIFdpbmRvd3MgZGlyZWN0b3J5CisgICAgIyAtIFJPTSBkbGwgZmlsZXMgKHdoZXJlIGFyZSB0aGV5PykKKyAgICAjIC0gT0VNIHNwZWNpZmllZCBzZWFyY2ggcGF0aDogSEtMTVxMb2FkZXJcU3lzdGVtUGF0aAorICAgIGRlZiBmaW5kX2xpYnJhcnkobmFtZSk6CisgICAgICAgIHJldHVybiBuYW1lCisKK2lmIG9zLm5hbWUgPT0gInBvc2l4IiBhbmQgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgIGZyb20gY3R5cGVzLm1hY2hvbGliLmR5bGQgaW1wb3J0IGR5bGRfZmluZCBhcyBfZHlsZF9maW5kCisgICAgZGVmIGZpbmRfbGlicmFyeShuYW1lKToKKyAgICAgICAgcG9zc2libGUgPSBbJ2xpYiVzLmR5bGliJyAlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICclcy5keWxpYicgJSBuYW1lLAorICAgICAgICAgICAgICAgICAgICAnJXMuZnJhbWV3b3JrLyVzJyAlIChuYW1lLCBuYW1lKV0KKyAgICAgICAgZm9yIG5hbWUgaW4gcG9zc2libGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9keWxkX2ZpbmQobmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHJldHVybiBOb25lCisKK2VsaWYgb3MubmFtZSA9PSAicG9zaXgiOgorICAgICMgQW5kcmVhcyBEZWdlcnQncyBmaW5kIGZ1bmN0aW9ucywgdXNpbmcgZ2NjLCAvc2Jpbi9sZGNvbmZpZywgb2JqZHVtcAorICAgIGltcG9ydCByZSwgdGVtcGZpbGUsIGVycm5vCisKKyAgICBkZWYgX2ZpbmRMaWJfZ2NjKG5hbWUpOgorICAgICAgICBleHByID0gcidbXlwoXClcc10qbGliJXNcLlteXChcKVxzXSonICUgcmUuZXNjYXBlKG5hbWUpCisgICAgICAgIGZkb3V0LCBjY291dCA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBvcy5jbG9zZShmZG91dCkKKyAgICAgICAgY21kID0gJ2lmIHR5cGUgZ2NjID4vZGV2L251bGwgMj4mMTsgdGhlbiBDQz1nY2M7IGVsaWYgdHlwZSBjYyA+L2Rldi9udWxsIDI+JjE7IHRoZW4gQ0M9Y2M7ZWxzZSBleGl0IDEwOyBmaTsnIFwKKyAgICAgICAgICAgICAgJyRDQyAtV2wsLXQgLW8gJyArIGNjb3V0ICsgJyAyPiYxIC1sJyArIG5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9zLnBvcGVuKGNtZCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cmFjZSA9IGYucmVhZCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHJ2ID0gZi5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGNjb3V0KQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGlmIHJ2ID09IDEwOgorICAgICAgICAgICAgcmFpc2UgT1NFcnJvciwgJ2djYyBvciBjYyBjb21tYW5kIG5vdCBmb3VuZCcKKyAgICAgICAgcmVzID0gcmUuc2VhcmNoKGV4cHIsIHRyYWNlKQorICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHJlcy5ncm91cCgwKQorCisKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gInN1bm9zNSI6CisgICAgICAgICMgdXNlIC91c3IvY2NzL2Jpbi9kdW1wIG9uIHNvbGFyaXMKKyAgICAgICAgZGVmIF9nZXRfc29uYW1lKGYpOgorICAgICAgICAgICAgaWYgbm90IGY6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGNtZCA9ICIvdXNyL2Njcy9iaW4vZHVtcCAtTHB2IDI+L2Rldi9udWxsICIgKyBmCisgICAgICAgICAgICBmID0gb3MucG9wZW4oY21kKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJlcyA9IHJlLnNlYXJjaChyJ1xbLipcXVxzU09OQU1FXHMrKFteXHNdKyknLCBkYXRhKQorICAgICAgICAgICAgaWYgbm90IHJlczoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcmV0dXJuIHJlcy5ncm91cCgxKQorICAgIGVsc2U6CisgICAgICAgIGRlZiBfZ2V0X3NvbmFtZShmKToKKyAgICAgICAgICAgICMgYXNzdW1pbmcgR05VIGJpbnV0aWxzIC8gRUxGCisgICAgICAgICAgICBpZiBub3QgZjoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgY21kID0gJ2lmICEgdHlwZSBvYmpkdW1wID4vZGV2L251bGwgMj4mMTsgdGhlbiBleGl0IDEwOyBmaTsnIFwKKyAgICAgICAgICAgICAgICAgICJvYmpkdW1wIC1wIC1qIC5keW5hbWljIDI+L2Rldi9udWxsICIgKyBmCisgICAgICAgICAgICBmID0gb3MucG9wZW4oY21kKQorICAgICAgICAgICAgZHVtcCA9IGYucmVhZCgpCisgICAgICAgICAgICBydiA9IGYuY2xvc2UoKQorICAgICAgICAgICAgaWYgcnYgPT0gMTA6CisgICAgICAgICAgICAgICAgcmFpc2UgT1NFcnJvciwgJ29iamR1bXAgY29tbWFuZCBub3QgZm91bmQnCisgICAgICAgICAgICBmID0gb3MucG9wZW4oY21kKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJlcyA9IHJlLnNlYXJjaChyJ1xzU09OQU1FXHMrKFteXHNdKyknLCBkYXRhKQorICAgICAgICAgICAgaWYgbm90IHJlczoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcmV0dXJuIHJlcy5ncm91cCgxKQorCisgICAgaWYgKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJmcmVlYnNkIikKKyAgICAgICAgb3Igc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIm9wZW5ic2QiKQorICAgICAgICBvciBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgiZHJhZ29uZmx5IikpOgorCisgICAgICAgIGRlZiBfbnVtX3ZlcnNpb24obGlibmFtZSk6CisgICAgICAgICAgICAjICJsaWJ4eXouc28uTUFKT1IuTUlOT1IiID0+IFsgTUFKT1IsIE1JTk9SIF0KKyAgICAgICAgICAgIHBhcnRzID0gbGlibmFtZS5zcGxpdCgiLiIpCisgICAgICAgICAgICBudW1zID0gW10KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0czoKKyAgICAgICAgICAgICAgICAgICAgbnVtcy5pbnNlcnQoMCwgaW50KHBhcnRzLnBvcCgpKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHJldHVybiBudW1zIG9yIFsgc3lzLm1heGludCBdCisKKyAgICAgICAgZGVmIGZpbmRfbGlicmFyeShuYW1lKToKKyAgICAgICAgICAgIGVuYW1lID0gcmUuZXNjYXBlKG5hbWUpCisgICAgICAgICAgICBleHByID0gcic6LWwlc1wuXFMrID0+IFxTKi8obGliJXNcLlxTKyknICUgKGVuYW1lLCBlbmFtZSkKKyAgICAgICAgICAgIGYgPSBvcy5wb3BlbignL3NiaW4vbGRjb25maWcgLXIgMj4vZGV2L251bGwnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJlcyA9IHJlLmZpbmRhbGwoZXhwciwgZGF0YSkKKyAgICAgICAgICAgIGlmIG5vdCByZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9nZXRfc29uYW1lKF9maW5kTGliX2djYyhuYW1lKSkKKyAgICAgICAgICAgIHJlcy5zb3J0KGNtcD0gbGFtYmRhIHgseTogY21wKF9udW1fdmVyc2lvbih4KSwgX251bV92ZXJzaW9uKHkpKSkKKyAgICAgICAgICAgIHJldHVybiByZXNbLTFdCisKKyAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAic3Vub3M1IjoKKworICAgICAgICBkZWYgX2ZpbmRMaWJfY3JsZShuYW1lLCBpczY0KToKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cygnL3Vzci9iaW4vY3JsZScpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgICAgIGlmIGlzNjQ6CisgICAgICAgICAgICAgICAgY21kID0gJ2VudiBMQ19BTEw9QyAvdXNyL2Jpbi9jcmxlIC02NCAyPi9kZXYvbnVsbCcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY21kID0gJ2VudiBMQ19BTEw9QyAvdXNyL2Jpbi9jcmxlIDI+L2Rldi9udWxsJworCisgICAgICAgICAgICBmb3IgbGluZSBpbiBvcy5wb3BlbihjbWQpLnJlYWRsaW5lcygpOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ0RlZmF1bHQgTGlicmFyeSBQYXRoIChFTEYpOicpOgorICAgICAgICAgICAgICAgICAgICBwYXRocyA9IGxpbmUuc3BsaXQoKVs0XQorCisgICAgICAgICAgICBpZiBub3QgcGF0aHM6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAgICAgZm9yIGRpciBpbiBwYXRocy5zcGxpdCgiOiIpOgorICAgICAgICAgICAgICAgIGxpYmZpbGUgPSBvcy5wYXRoLmpvaW4oZGlyLCAibGliJXMuc28iICUgbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsaWJmaWxlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpYmZpbGUKKworICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBkZWYgZmluZF9saWJyYXJ5KG5hbWUsIGlzNjQgPSBGYWxzZSk6CisgICAgICAgICAgICByZXR1cm4gX2dldF9zb25hbWUoX2ZpbmRMaWJfY3JsZShuYW1lLCBpczY0KSBvciBfZmluZExpYl9nY2MobmFtZSkpCisKKyAgICBlbHNlOgorCisgICAgICAgIGRlZiBfZmluZFNvbmFtZV9sZGNvbmZpZyhuYW1lKToKKyAgICAgICAgICAgIGltcG9ydCBzdHJ1Y3QKKyAgICAgICAgICAgIGlmIHN0cnVjdC5jYWxjc2l6ZSgnbCcpID09IDQ6CisgICAgICAgICAgICAgICAgbWFjaGluZSA9IG9zLnVuYW1lKClbNF0gKyAnLTMyJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gb3MudW5hbWUoKVs0XSArICctNjQnCisgICAgICAgICAgICBtYWNoX21hcCA9IHsKKyAgICAgICAgICAgICAgICAneDg2XzY0LTY0JzogJ2xpYmM2LHg4Ni02NCcsCisgICAgICAgICAgICAgICAgJ3BwYzY0LTY0JzogJ2xpYmM2LDY0Yml0JywKKyAgICAgICAgICAgICAgICAnc3BhcmM2NC02NCc6ICdsaWJjNiw2NGJpdCcsCisgICAgICAgICAgICAgICAgJ3MzOTB4LTY0JzogJ2xpYmM2LDY0Yml0JywKKyAgICAgICAgICAgICAgICAnaWE2NC02NCc6ICdsaWJjNixJQS02NCcsCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgYWJpX3R5cGUgPSBtYWNoX21hcC5nZXQobWFjaGluZSwgJ2xpYmM2JykKKworICAgICAgICAgICAgIyBYWFggYXNzdW1pbmcgR0xJQkMncyBsZGNvbmZpZyAod2l0aCBvcHRpb24gLXApCisgICAgICAgICAgICBleHByID0gcidccysobGliJXNcLlteXHNdKylccytcKCVzJyAlIChyZS5lc2NhcGUobmFtZSksIGFiaV90eXBlKQorICAgICAgICAgICAgZiA9IG9zLnBvcGVuKCcvc2Jpbi9sZGNvbmZpZyAtcCAyPi9kZXYvbnVsbCcpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgcmVzID0gcmUuc2VhcmNoKGV4cHIsIGRhdGEpCisgICAgICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICByZXR1cm4gcmVzLmdyb3VwKDEpCisKKyAgICAgICAgZGVmIGZpbmRfbGlicmFyeShuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBfZmluZFNvbmFtZV9sZGNvbmZpZyhuYW1lKSBvciBfZ2V0X3NvbmFtZShfZmluZExpYl9nY2MobmFtZSkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgdGVzdCBjb2RlCisKK2RlZiB0ZXN0KCk6CisgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNkbGwKKyAgICBpZiBvcy5uYW1lID09ICJudCI6CisgICAgICAgIHByaW50IGNkbGwubXN2Y3J0CisgICAgICAgIHByaW50IGNkbGwubG9hZCgibXN2Y3J0IikKKyAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJtc3ZjcnQiKQorCisgICAgaWYgb3MubmFtZSA9PSAicG9zaXgiOgorICAgICAgICAjIGZpbmQgYW5kIGxvYWRfdmVyc2lvbgorICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoIm0iKQorICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoImMiKQorICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoImJ6MiIpCisKKyAgICAgICAgIyBnZXRhdHRyCisjIyAgICAgICAgcHJpbnQgY2RsbC5tCisjIyAgICAgICAgcHJpbnQgY2RsbC5iejIKKworICAgICAgICAjIGxvYWQKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgICAgICAgICAgcHJpbnQgY2RsbC5Mb2FkTGlicmFyeSgibGlibS5keWxpYiIpCisgICAgICAgICAgICBwcmludCBjZGxsLkxvYWRMaWJyYXJ5KCJsaWJjcnlwdG8uZHlsaWIiKQorICAgICAgICAgICAgcHJpbnQgY2RsbC5Mb2FkTGlicmFyeSgibGliU3lzdGVtLmR5bGliIikKKyAgICAgICAgICAgIHByaW50IGNkbGwuTG9hZExpYnJhcnkoIlN5c3RlbS5mcmFtZXdvcmsvU3lzdGVtIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50IGNkbGwuTG9hZExpYnJhcnkoImxpYm0uc28iKQorICAgICAgICAgICAgcHJpbnQgY2RsbC5Mb2FkTGlicmFyeSgibGliY3J5cHQuc28iKQorICAgICAgICAgICAgcHJpbnQgZmluZF9saWJyYXJ5KCJjcnlwdCIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOWZmYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy91dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy91dGlsLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOWZmYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy91dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy93aW50eXBlcy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3dpbnR5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZmJiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy93aW50eXBlcy5weQpAQCAtMCwwICsxLDE4NSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRoZSBtb3N0IHVzZWZ1bCB3aW5kb3dzIGRhdGF0eXBlcworZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworQllURSA9IGNfYnl0ZQorV09SRCA9IGNfdXNob3J0CitEV09SRCA9IGNfdWxvbmcKKworV0NIQVIgPSBjX3djaGFyCitVSU5UID0gY191aW50CitJTlQgPSBjX2ludAorCitET1VCTEUgPSBjX2RvdWJsZQorRkxPQVQgPSBjX2Zsb2F0CisKK0JPT0xFQU4gPSBCWVRFCitCT09MID0gY19sb25nCisKK2Zyb20gY3R5cGVzIGltcG9ydCBfU2ltcGxlQ0RhdGEKK2NsYXNzIFZBUklBTlRfQk9PTChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJ2IgorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyglcikiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLnZhbHVlKQorCitVTE9ORyA9IGNfdWxvbmcKK0xPTkcgPSBjX2xvbmcKKworVVNIT1JUID0gY191c2hvcnQKK1NIT1JUID0gY19zaG9ydAorCisjIGluIHRoZSB3aW5kb3dzIGhlYWRlciBmaWxlcywgdGhlc2UgYXJlIHN0cnVjdHVyZXMuCitfTEFSR0VfSU5URUdFUiA9IExBUkdFX0lOVEVHRVIgPSBjX2xvbmdsb25nCitfVUxBUkdFX0lOVEVHRVIgPSBVTEFSR0VfSU5URUdFUiA9IGNfdWxvbmdsb25nCisKK0xQQ09MRVNUUiA9IExQT0xFU1RSID0gT0xFU1RSID0gY193Y2hhcl9wCitMUENXU1RSID0gTFBXU1RSID0gY193Y2hhcl9wCitMUENTVFIgPSBMUFNUUiA9IGNfY2hhcl9wCitMUENWT0lEID0gTFBWT0lEID0gY192b2lkX3AKKworIyBXUEFSQU0gaXMgZGVmaW5lZCBhcyBVSU5UX1BUUiAodW5zaWduZWQgdHlwZSkKKyMgTFBBUkFNIGlzIGRlZmluZWQgYXMgTE9OR19QVFIgKHNpZ25lZCB0eXBlKQoraWYgc2l6ZW9mKGNfbG9uZykgPT0gc2l6ZW9mKGNfdm9pZF9wKToKKyAgICBXUEFSQU0gPSBjX3Vsb25nCisgICAgTFBBUkFNID0gY19sb25nCitlbGlmIHNpemVvZihjX2xvbmdsb25nKSA9PSBzaXplb2YoY192b2lkX3ApOgorICAgIFdQQVJBTSA9IGNfdWxvbmdsb25nCisgICAgTFBBUkFNID0gY19sb25nbG9uZworCitBVE9NID0gV09SRAorTEFOR0lEID0gV09SRAorCitDT0xPUlJFRiA9IERXT1JECitMR1JQSUQgPSBEV09SRAorTENUWVBFID0gRFdPUkQKKworTENJRCA9IERXT1JECisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgSEFORExFIHR5cGVzCitIQU5ETEUgPSBjX3ZvaWRfcCAjIGluIHRoZSBoZWFkZXIgZmlsZXM6IHZvaWQgKgorCitIQUNDRUwgPSBIQU5ETEUKK0hCSVRNQVAgPSBIQU5ETEUKK0hCUlVTSCA9IEhBTkRMRQorSENPTE9SU1BBQ0UgPSBIQU5ETEUKK0hEQyA9IEhBTkRMRQorSERFU0sgPSBIQU5ETEUKK0hEV1AgPSBIQU5ETEUKK0hFTkhNRVRBRklMRSA9IEhBTkRMRQorSEZPTlQgPSBIQU5ETEUKK0hHRElPQkogPSBIQU5ETEUKK0hHTE9CQUwgPSBIQU5ETEUKK0hIT09LID0gSEFORExFCitISUNPTiA9IEhBTkRMRQorSElOU1RBTkNFID0gSEFORExFCitIS0VZID0gSEFORExFCitIS0wgPSBIQU5ETEUKK0hMT0NBTCA9IEhBTkRMRQorSE1FTlUgPSBIQU5ETEUKK0hNRVRBRklMRSA9IEhBTkRMRQorSE1PRFVMRSA9IEhBTkRMRQorSE1PTklUT1IgPSBIQU5ETEUKK0hQQUxFVFRFID0gSEFORExFCitIUEVOID0gSEFORExFCitIUkdOID0gSEFORExFCitIUlNSQyA9IEhBTkRMRQorSFNUUiA9IEhBTkRMRQorSFRBU0sgPSBIQU5ETEUKK0hXSU5TVEEgPSBIQU5ETEUKK0hXTkQgPSBIQU5ETEUKK1NDX0hBTkRMRSA9IEhBTkRMRQorU0VSVklDRV9TVEFUVVNfSEFORExFID0gSEFORExFCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU29tZSBpbXBvcnRhbnQgc3RydWN0dXJlIGRlZmluaXRpb25zCisKK2NsYXNzIFJFQ1QoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoImxlZnQiLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICgidG9wIiwgY19sb25nKSwKKyAgICAgICAgICAgICAgICAoInJpZ2h0IiwgY19sb25nKSwKKyAgICAgICAgICAgICAgICAoImJvdHRvbSIsIGNfbG9uZyldCit0YWdSRUNUID0gX1JFQ1RMID0gUkVDVEwgPSBSRUNUCisKK2NsYXNzIF9TTUFMTF9SRUNUKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCdMZWZ0JywgY19zaG9ydCksCisgICAgICAgICAgICAgICAgKCdUb3AnLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAoJ1JpZ2h0JywgY19zaG9ydCksCisgICAgICAgICAgICAgICAgKCdCb3R0b20nLCBjX3Nob3J0KV0KK1NNQUxMX1JFQ1QgPSBfU01BTExfUkVDVAorCitjbGFzcyBfQ09PUkQoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoJ1gnLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAoJ1knLCBjX3Nob3J0KV0KKworY2xhc3MgUE9JTlQoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoIngiLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICgieSIsIGNfbG9uZyldCit0YWdQT0lOVCA9IF9QT0lOVEwgPSBQT0lOVEwgPSBQT0lOVAorCitjbGFzcyBTSVpFKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJjeCIsIGNfbG9uZyksCisgICAgICAgICAgICAgICAgKCJjeSIsIGNfbG9uZyldCit0YWdTSVpFID0gU0laRUwgPSBTSVpFCisKK2RlZiBSR0IocmVkLCBncmVlbiwgYmx1ZSk6CisgICAgcmV0dXJuIHJlZCArIChncmVlbiA8PCA4KSArIChibHVlIDw8IDE2KQorCitjbGFzcyBGSUxFVElNRShTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygiZHdMb3dEYXRlVGltZSIsIERXT1JEKSwKKyAgICAgICAgICAgICAgICAoImR3SGlnaERhdGVUaW1lIiwgRFdPUkQpXQorX0ZJTEVUSU1FID0gRklMRVRJTUUKKworY2xhc3MgTVNHKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJoV25kIiwgSFdORCksCisgICAgICAgICAgICAgICAgKCJtZXNzYWdlIiwgY191aW50KSwKKyAgICAgICAgICAgICAgICAoIndQYXJhbSIsIFdQQVJBTSksCisgICAgICAgICAgICAgICAgKCJsUGFyYW0iLCBMUEFSQU0pLAorICAgICAgICAgICAgICAgICgidGltZSIsIERXT1JEKSwKKyAgICAgICAgICAgICAgICAoInB0IiwgUE9JTlQpXQordGFnTVNHID0gTVNHCitNQVhfUEFUSCA9IDI2MAorCitjbGFzcyBXSU4zMl9GSU5EX0RBVEFBKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJkd0ZpbGVBdHRyaWJ1dGVzIiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgiZnRDcmVhdGlvblRpbWUiLCBGSUxFVElNRSksCisgICAgICAgICAgICAgICAgKCJmdExhc3RBY2Nlc3NUaW1lIiwgRklMRVRJTUUpLAorICAgICAgICAgICAgICAgICgiZnRMYXN0V3JpdGVUaW1lIiwgRklMRVRJTUUpLAorICAgICAgICAgICAgICAgICgibkZpbGVTaXplSGlnaCIsIERXT1JEKSwKKyAgICAgICAgICAgICAgICAoIm5GaWxlU2l6ZUxvdyIsIERXT1JEKSwKKyAgICAgICAgICAgICAgICAoImR3UmVzZXJ2ZWQwIiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgiZHdSZXNlcnZlZDEiLCBEV09SRCksCisgICAgICAgICAgICAgICAgKCJjRmlsZU5hbWUiLCBjX2NoYXIgKiBNQVhfUEFUSCksCisgICAgICAgICAgICAgICAgKCJjQWx0ZXJuYXRlRmlsZU5hbWUiLCBjX2NoYXIgKiAxNCldCisKK2NsYXNzIFdJTjMyX0ZJTkRfREFUQVcoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoImR3RmlsZUF0dHJpYnV0ZXMiLCBEV09SRCksCisgICAgICAgICAgICAgICAgKCJmdENyZWF0aW9uVGltZSIsIEZJTEVUSU1FKSwKKyAgICAgICAgICAgICAgICAoImZ0TGFzdEFjY2Vzc1RpbWUiLCBGSUxFVElNRSksCisgICAgICAgICAgICAgICAgKCJmdExhc3RXcml0ZVRpbWUiLCBGSUxFVElNRSksCisgICAgICAgICAgICAgICAgKCJuRmlsZVNpemVIaWdoIiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgibkZpbGVTaXplTG93IiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgiZHdSZXNlcnZlZDAiLCBEV09SRCksCisgICAgICAgICAgICAgICAgKCJkd1Jlc2VydmVkMSIsIERXT1JEKSwKKyAgICAgICAgICAgICAgICAoImNGaWxlTmFtZSIsIGNfd2NoYXIgKiBNQVhfUEFUSCksCisgICAgICAgICAgICAgICAgKCJjQWx0ZXJuYXRlRmlsZU5hbWUiLCBjX3djaGFyICogMTQpXQorCitfX2FsbF9fID0gWydBVE9NJywgJ0JPT0wnLCAnQk9PTEVBTicsICdCWVRFJywgJ0NPTE9SUkVGJywgJ0RPVUJMRScsICdEV09SRCcsCisgICAgICAgICAgICdGSUxFVElNRScsICdGTE9BVCcsICdIQUNDRUwnLCAnSEFORExFJywgJ0hCSVRNQVAnLCAnSEJSVVNIJywKKyAgICAgICAgICAgJ0hDT0xPUlNQQUNFJywgJ0hEQycsICdIREVTSycsICdIRFdQJywgJ0hFTkhNRVRBRklMRScsICdIRk9OVCcsCisgICAgICAgICAgICdIR0RJT0JKJywgJ0hHTE9CQUwnLCAnSEhPT0snLCAnSElDT04nLCAnSElOU1RBTkNFJywgJ0hLRVknLAorICAgICAgICAgICAnSEtMJywgJ0hMT0NBTCcsICdITUVOVScsICdITUVUQUZJTEUnLCAnSE1PRFVMRScsICdITU9OSVRPUicsCisgICAgICAgICAgICdIUEFMRVRURScsICdIUEVOJywgJ0hSR04nLCAnSFJTUkMnLCAnSFNUUicsICdIVEFTSycsICdIV0lOU1RBJywKKyAgICAgICAgICAgJ0hXTkQnLCAnSU5UJywgJ0xBTkdJRCcsICdMQVJHRV9JTlRFR0VSJywgJ0xDSUQnLCAnTENUWVBFJywKKyAgICAgICAgICAgJ0xHUlBJRCcsICdMT05HJywgJ0xQQVJBTScsICdMUENPTEVTVFInLCAnTFBDU1RSJywgJ0xQQ1ZPSUQnLAorICAgICAgICAgICAnTFBDV1NUUicsICdMUE9MRVNUUicsICdMUFNUUicsICdMUFZPSUQnLCAnTFBXU1RSJywgJ01BWF9QQVRIJywKKyAgICAgICAgICAgJ01TRycsICdPTEVTVFInLCAnUE9JTlQnLCAnUE9JTlRMJywgJ1JFQ1QnLCAnUkVDVEwnLCAnUkdCJywKKyAgICAgICAgICAgJ1NDX0hBTkRMRScsICdTRVJWSUNFX1NUQVRVU19IQU5ETEUnLCAnU0hPUlQnLCAnU0laRScsICdTSVpFTCcsCisgICAgICAgICAgICdTTUFMTF9SRUNUJywgJ1VJTlQnLCAnVUxBUkdFX0lOVEVHRVInLCAnVUxPTkcnLCAnVVNIT1JUJywKKyAgICAgICAgICAgJ1ZBUklBTlRfQk9PTCcsICdXQ0hBUicsICdXSU4zMl9GSU5EX0RBVEFBJywgJ1dJTjMyX0ZJTkRfREFUQVcnLAorICAgICAgICAgICAnV09SRCcsICdXUEFSQU0nLCAnX0NPT1JEJywgJ19GSUxFVElNRScsICdfTEFSR0VfSU5URUdFUicsCisgICAgICAgICAgICdfUE9JTlRMJywgJ19SRUNUTCcsICdfU01BTExfUkVDVCcsICdfVUxBUkdFX0lOVEVHRVInLCAndGFnTVNHJywKKyAgICAgICAgICAgJ3RhZ1BPSU5UJywgJ3RhZ1JFQ1QnLCAndGFnU0laRSddCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy93aW50eXBlcy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy93aW50eXBlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3MDRlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3dpbnR5cGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy93aW50eXBlcy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy93aW50eXBlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ3MDRlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3dpbnR5cGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvY3Vyc2VzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZjU5ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDU5IEBACisiIiJjdXJzZXMKKworVGhlIG1haW4gcGFja2FnZSBmb3IgY3Vyc2VzIHN1cHBvcnQgZm9yIFB5dGhvbi4gIE5vcm1hbGx5IHVzZWQgYnkgaW1wb3J0aW5nCit0aGUgcGFja2FnZSwgYW5kIHBlcmhhcHMgYSBwYXJ0aWN1bGFyIG1vZHVsZSBpbnNpZGUgaXQuCisKKyAgIGltcG9ydCBjdXJzZXMKKyAgIGZyb20gY3Vyc2VzIGltcG9ydCB0ZXh0cGFkCisgICBjdXJzZXMuaW5pdHNjcigpCisgICAuLi4KKworIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitmcm9tIF9jdXJzZXMgaW1wb3J0ICoKK2Zyb20gY3Vyc2VzLndyYXBwZXIgaW1wb3J0IHdyYXBwZXIKK2ltcG9ydCBvcyBhcyBfb3MKK2ltcG9ydCBzeXMgYXMgX3N5cworCisjIFNvbWUgY29uc3RhbnRzLCBtb3N0IG5vdGFibHkgdGhlIEFDU18qIG9uZXMsIGFyZSBvbmx5IGFkZGVkIHRvIHRoZSBDCisjIF9jdXJzZXMgbW9kdWxlJ3MgZGljdGlvbmFyeSBhZnRlciBpbml0c2NyKCkgaXMgY2FsbGVkLiAgKFNvbWUKKyMgdmVyc2lvbnMgb2YgU0dJJ3MgY3Vyc2VzIGRvbid0IGRlZmluZSB2YWx1ZXMgZm9yIHRob3NlIGNvbnN0YW50cworIyB1bnRpbCBpbml0c2NyKCkgaGFzIGJlZW4gY2FsbGVkLikgIFRoaXMgd3JhcHBlciBmdW5jdGlvbiBjYWxscyB0aGUKKyMgdW5kZXJseWluZyBDIGluaXRzY3IoKSwgYW5kIHRoZW4gY29waWVzIHRoZSBjb25zdGFudHMgZnJvbSB0aGUKKyMgX2N1cnNlcyBtb2R1bGUgdG8gdGhlIGN1cnNlcyBwYWNrYWdlJ3MgZGljdGlvbmFyeS4gIERvbid0IGRvICdmcm9tCisjIGN1cnNlcyBpbXBvcnQgKicgaWYgeW91J2xsIGJlIG5lZWRpbmcgdGhlIEFDU18qIGNvbnN0YW50cy4KKworZGVmIGluaXRzY3IoKToKKyAgICBpbXBvcnQgX2N1cnNlcywgY3Vyc2VzCisgICAgIyB3ZSBjYWxsIHNldHVwdGVybSgpIGhlcmUgYmVjYXVzZSBpdCByYWlzZXMgYW4gZXJyb3IKKyAgICAjIGluc3RlYWQgb2YgY2FsbGluZyBleGl0KCkgaW4gZXJyb3IgY2FzZXMuCisgICAgc2V0dXB0ZXJtKHRlcm09X29zLmVudmlyb24uZ2V0KCJURVJNIiwgInVua25vd24iKSwKKyAgICAgICAgICAgICAgZmQ9X3N5cy5fX3N0ZG91dF9fLmZpbGVubygpKQorICAgIHN0ZHNjciA9IF9jdXJzZXMuaW5pdHNjcigpCisgICAgZm9yIGtleSwgdmFsdWUgaW4gX2N1cnNlcy5fX2RpY3RfXy5pdGVtcygpOgorICAgICAgICBpZiBrZXlbMDo0XSA9PSAnQUNTXycgb3Iga2V5IGluICgnTElORVMnLCAnQ09MUycpOgorICAgICAgICAgICAgc2V0YXR0cihjdXJzZXMsIGtleSwgdmFsdWUpCisKKyAgICByZXR1cm4gc3Rkc2NyCisKKyMgVGhpcyBpcyBhIHNpbWlsYXIgd3JhcHBlciBmb3Igc3RhcnRfY29sb3IoKSwgd2hpY2ggYWRkcyB0aGUgQ09MT1JTIGFuZAorIyBDT0xPUl9QQUlSUyB2YXJpYWJsZXMgd2hpY2ggYXJlIG9ubHkgYXZhaWxhYmxlIGFmdGVyIHN0YXJ0X2NvbG9yKCkgaXMKKyMgY2FsbGVkLgorCitkZWYgc3RhcnRfY29sb3IoKToKKyAgICBpbXBvcnQgX2N1cnNlcywgY3Vyc2VzCisgICAgcmV0dmFsID0gX2N1cnNlcy5zdGFydF9jb2xvcigpCisgICAgaWYgaGFzYXR0cihfY3Vyc2VzLCAnQ09MT1JTJyk6CisgICAgICAgIGN1cnNlcy5DT0xPUlMgPSBfY3Vyc2VzLkNPTE9SUworICAgIGlmIGhhc2F0dHIoX2N1cnNlcywgJ0NPTE9SX1BBSVJTJyk6CisgICAgICAgIGN1cnNlcy5DT0xPUl9QQUlSUyA9IF9jdXJzZXMuQ09MT1JfUEFJUlMKKyAgICByZXR1cm4gcmV0dmFsCisKKyMgSW1wb3J0IFB5dGhvbiBoYXNfa2V5KCkgaW1wbGVtZW50YXRpb24gaWYgX2N1cnNlcyBkb2Vzbid0IGNvbnRhaW4gaGFzX2tleSgpCisKK3RyeToKKyAgICBoYXNfa2V5CitleGNlcHQgTmFtZUVycm9yOgorICAgIGZyb20gaGFzX2tleSBpbXBvcnQgaGFzX2tleQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWIwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NWIwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvYXNjaWkucHkgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9hc2NpaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDBmZDhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvYXNjaWkucHkKQEAgLTAsMCArMSw5OSBAQAorIiIiQ29uc3RhbnRzIGFuZCBtZW1iZXJzaGlwIHRlc3RzIGZvciBBU0NJSSBjaGFyYWN0ZXJzIiIiCisKK05VTCAgICAgPSAweDAwICAjIF5ACitTT0ggICAgID0gMHgwMSAgIyBeQQorU1RYICAgICA9IDB4MDIgICMgXkIKK0VUWCAgICAgPSAweDAzICAjIF5DCitFT1QgICAgID0gMHgwNCAgIyBeRAorRU5RICAgICA9IDB4MDUgICMgXkUKK0FDSyAgICAgPSAweDA2ICAjIF5GCitCRUwgICAgID0gMHgwNyAgIyBeRworQlMgICAgICA9IDB4MDggICMgXkgKK1RBQiAgICAgPSAweDA5ICAjIF5JCitIVCAgICAgID0gMHgwOSAgIyBeSQorTEYgICAgICA9IDB4MGEgICMgXkoKK05MICAgICAgPSAweDBhICAjIF5KCitWVCAgICAgID0gMHgwYiAgIyBeSworRkYgICAgICA9IDB4MGMgICMgXkwKK0NSICAgICAgPSAweDBkICAjIF5NCitTTyAgICAgID0gMHgwZSAgIyBeTgorU0kgICAgICA9IDB4MGYgICMgXk8KK0RMRSAgICAgPSAweDEwICAjIF5QCitEQzEgICAgID0gMHgxMSAgIyBeUQorREMyICAgICA9IDB4MTIgICMgXlIKK0RDMyAgICAgPSAweDEzICAjIF5TCitEQzQgICAgID0gMHgxNCAgIyBeVAorTkFLICAgICA9IDB4MTUgICMgXlUKK1NZTiAgICAgPSAweDE2ICAjIF5WCitFVEIgICAgID0gMHgxNyAgIyBeVworQ0FOICAgICA9IDB4MTggICMgXlgKK0VNICAgICAgPSAweDE5ICAjIF5ZCitTVUIgICAgID0gMHgxYSAgIyBeWgorRVNDICAgICA9IDB4MWIgICMgXlsKK0ZTICAgICAgPSAweDFjICAjIF5cCitHUyAgICAgID0gMHgxZCAgIyBeXQorUlMgICAgICA9IDB4MWUgICMgXl4KK1VTICAgICAgPSAweDFmICAjIF5fCitTUCAgICAgID0gMHgyMCAgIyBzcGFjZQorREVMICAgICA9IDB4N2YgICMgZGVsZXRlCisKK2NvbnRyb2xuYW1lcyA9IFsKKyJOVUwiLCAiU09IIiwgIlNUWCIsICJFVFgiLCAiRU9UIiwgIkVOUSIsICJBQ0siLCAiQkVMIiwKKyJCUyIsICAiSFQiLCAgIkxGIiwgICJWVCIsICAiRkYiLCAgIkNSIiwgICJTTyIsICAiU0kiLAorIkRMRSIsICJEQzEiLCAiREMyIiwgIkRDMyIsICJEQzQiLCAiTkFLIiwgIlNZTiIsICJFVEIiLAorIkNBTiIsICJFTSIsICAiU1VCIiwgIkVTQyIsICJGUyIsICAiR1MiLCAgIlJTIiwgICJVUyIsCisiU1AiCitdCisKK2RlZiBfY3RvaShjKToKKyAgICBpZiB0eXBlKGMpID09IHR5cGUoIiIpOgorICAgICAgICByZXR1cm4gb3JkKGMpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGMKKworZGVmIGlzYWxudW0oYyk6IHJldHVybiBpc2FscGhhKGMpIG9yIGlzZGlnaXQoYykKK2RlZiBpc2FscGhhKGMpOiByZXR1cm4gaXN1cHBlcihjKSBvciBpc2xvd2VyKGMpCitkZWYgaXNhc2NpaShjKTogcmV0dXJuIF9jdG9pKGMpIDw9IDEyNyAgICAgICAgICAjID8KK2RlZiBpc2JsYW5rKGMpOiByZXR1cm4gX2N0b2koYykgaW4gKDgsMzIpCitkZWYgaXNjbnRybChjKTogcmV0dXJuIF9jdG9pKGMpIDw9IDMxCitkZWYgaXNkaWdpdChjKTogcmV0dXJuIF9jdG9pKGMpID49IDQ4IGFuZCBfY3RvaShjKSA8PSA1NworZGVmIGlzZ3JhcGgoYyk6IHJldHVybiBfY3RvaShjKSA+PSAzMyBhbmQgX2N0b2koYykgPD0gMTI2CitkZWYgaXNsb3dlcihjKTogcmV0dXJuIF9jdG9pKGMpID49IDk3IGFuZCBfY3RvaShjKSA8PSAxMjIKK2RlZiBpc3ByaW50KGMpOiByZXR1cm4gX2N0b2koYykgPj0gMzIgYW5kIF9jdG9pKGMpIDw9IDEyNgorZGVmIGlzcHVuY3QoYyk6IHJldHVybiBfY3RvaShjKSAhPSAzMiBhbmQgbm90IGlzYWxudW0oYykKK2RlZiBpc3NwYWNlKGMpOiByZXR1cm4gX2N0b2koYykgaW4gKDksIDEwLCAxMSwgMTIsIDEzLCAzMikKK2RlZiBpc3VwcGVyKGMpOiByZXR1cm4gX2N0b2koYykgPj0gNjUgYW5kIF9jdG9pKGMpIDw9IDkwCitkZWYgaXN4ZGlnaXQoYyk6IHJldHVybiBpc2RpZ2l0KGMpIG9yIFwKKyAgICAoX2N0b2koYykgPj0gNjUgYW5kIF9jdG9pKGMpIDw9IDcwKSBvciAoX2N0b2koYykgPj0gOTcgYW5kIF9jdG9pKGMpIDw9IDEwMikKK2RlZiBpc2N0cmwoYyk6IHJldHVybiBfY3RvaShjKSA8IDMyCitkZWYgaXNtZXRhKGMpOiByZXR1cm4gX2N0b2koYykgPiAxMjcKKworZGVmIGFzY2lpKGMpOgorICAgIGlmIHR5cGUoYykgPT0gdHlwZSgiIik6CisgICAgICAgIHJldHVybiBjaHIoX2N0b2koYykgJiAweDdmKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBfY3RvaShjKSAmIDB4N2YKKworZGVmIGN0cmwoYyk6CisgICAgaWYgdHlwZShjKSA9PSB0eXBlKCIiKToKKyAgICAgICAgcmV0dXJuIGNocihfY3RvaShjKSAmIDB4MWYpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIF9jdG9pKGMpICYgMHgxZgorCitkZWYgYWx0KGMpOgorICAgIGlmIHR5cGUoYykgPT0gdHlwZSgiIik6CisgICAgICAgIHJldHVybiBjaHIoX2N0b2koYykgfCAweDgwKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBfY3RvaShjKSB8IDB4ODAKKworZGVmIHVuY3RybChjKToKKyAgICBiaXRzID0gX2N0b2koYykKKyAgICBpZiBiaXRzID09IDB4N2Y6CisgICAgICAgIHJlcCA9ICJePyIKKyAgICBlbGlmIGlzcHJpbnQoYml0cyAmIDB4N2YpOgorICAgICAgICByZXAgPSBjaHIoYml0cyAmIDB4N2YpCisgICAgZWxzZToKKyAgICAgICAgcmVwID0gIl4iICsgY2hyKCgoYml0cyAmIDB4N2YpIHwgMHgyMCkgKyAweDIwKQorICAgIGlmIGJpdHMgJiAweDgwOgorICAgICAgICByZXR1cm4gIiEiICsgcmVwCisgICAgcmV0dXJuIHJlcApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvYXNjaWkucHljIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvYXNjaWkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MGMzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9hc2NpaS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvYXNjaWkucHlvIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvYXNjaWkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MGMzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9hc2NpaS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvaGFzX2tleS5weSBiL2xpYi9weXRob24yLjcvY3Vyc2VzL2hhc19rZXkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkNWEzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL2hhc19rZXkucHkKQEAgLTAsMCArMSwxOTIgQEAKKworIworIyBFbXVsYXRpb24gb2YgaGFzX2tleSgpIGZ1bmN0aW9uIGZvciBwbGF0Zm9ybXMgdGhhdCBkb24ndCB1c2UgbmN1cnNlcworIworCitpbXBvcnQgX2N1cnNlcworCisjIFRhYmxlIG1hcHBpbmcgY3Vyc2VzIGtleXMgdG8gdGhlIHRlcm1pbmZvIGNhcGFiaWxpdHkgbmFtZQorCitfY2FwYWJpbGl0eV9uYW1lcyA9IHsKKyAgICBfY3Vyc2VzLktFWV9BMTogJ2thMScsCisgICAgX2N1cnNlcy5LRVlfQTM6ICdrYTMnLAorICAgIF9jdXJzZXMuS0VZX0IyOiAna2IyJywKKyAgICBfY3Vyc2VzLktFWV9CQUNLU1BBQ0U6ICdrYnMnLAorICAgIF9jdXJzZXMuS0VZX0JFRzogJ2tiZWcnLAorICAgIF9jdXJzZXMuS0VZX0JUQUI6ICdrY2J0JywKKyAgICBfY3Vyc2VzLktFWV9DMTogJ2tjMScsCisgICAgX2N1cnNlcy5LRVlfQzM6ICdrYzMnLAorICAgIF9jdXJzZXMuS0VZX0NBTkNFTDogJ2tjYW4nLAorICAgIF9jdXJzZXMuS0VZX0NBVEFCOiAna3RiYycsCisgICAgX2N1cnNlcy5LRVlfQ0xFQVI6ICdrY2xyJywKKyAgICBfY3Vyc2VzLktFWV9DTE9TRTogJ2tjbG8nLAorICAgIF9jdXJzZXMuS0VZX0NPTU1BTkQ6ICdrY21kJywKKyAgICBfY3Vyc2VzLktFWV9DT1BZOiAna2NweScsCisgICAgX2N1cnNlcy5LRVlfQ1JFQVRFOiAna2NydCcsCisgICAgX2N1cnNlcy5LRVlfQ1RBQjogJ2tjdGFiJywKKyAgICBfY3Vyc2VzLktFWV9EQzogJ2tkY2gxJywKKyAgICBfY3Vyc2VzLktFWV9ETDogJ2tkbDEnLAorICAgIF9jdXJzZXMuS0VZX0RPV046ICdrY3VkMScsCisgICAgX2N1cnNlcy5LRVlfRUlDOiAna3JtaXInLAorICAgIF9jdXJzZXMuS0VZX0VORDogJ2tlbmQnLAorICAgIF9jdXJzZXMuS0VZX0VOVEVSOiAna2VudCcsCisgICAgX2N1cnNlcy5LRVlfRU9MOiAna2VsJywKKyAgICBfY3Vyc2VzLktFWV9FT1M6ICdrZWQnLAorICAgIF9jdXJzZXMuS0VZX0VYSVQ6ICdrZXh0JywKKyAgICBfY3Vyc2VzLktFWV9GMDogJ2tmMCcsCisgICAgX2N1cnNlcy5LRVlfRjE6ICdrZjEnLAorICAgIF9jdXJzZXMuS0VZX0YxMDogJ2tmMTAnLAorICAgIF9jdXJzZXMuS0VZX0YxMTogJ2tmMTEnLAorICAgIF9jdXJzZXMuS0VZX0YxMjogJ2tmMTInLAorICAgIF9jdXJzZXMuS0VZX0YxMzogJ2tmMTMnLAorICAgIF9jdXJzZXMuS0VZX0YxNDogJ2tmMTQnLAorICAgIF9jdXJzZXMuS0VZX0YxNTogJ2tmMTUnLAorICAgIF9jdXJzZXMuS0VZX0YxNjogJ2tmMTYnLAorICAgIF9jdXJzZXMuS0VZX0YxNzogJ2tmMTcnLAorICAgIF9jdXJzZXMuS0VZX0YxODogJ2tmMTgnLAorICAgIF9jdXJzZXMuS0VZX0YxOTogJ2tmMTknLAorICAgIF9jdXJzZXMuS0VZX0YyOiAna2YyJywKKyAgICBfY3Vyc2VzLktFWV9GMjA6ICdrZjIwJywKKyAgICBfY3Vyc2VzLktFWV9GMjE6ICdrZjIxJywKKyAgICBfY3Vyc2VzLktFWV9GMjI6ICdrZjIyJywKKyAgICBfY3Vyc2VzLktFWV9GMjM6ICdrZjIzJywKKyAgICBfY3Vyc2VzLktFWV9GMjQ6ICdrZjI0JywKKyAgICBfY3Vyc2VzLktFWV9GMjU6ICdrZjI1JywKKyAgICBfY3Vyc2VzLktFWV9GMjY6ICdrZjI2JywKKyAgICBfY3Vyc2VzLktFWV9GMjc6ICdrZjI3JywKKyAgICBfY3Vyc2VzLktFWV9GMjg6ICdrZjI4JywKKyAgICBfY3Vyc2VzLktFWV9GMjk6ICdrZjI5JywKKyAgICBfY3Vyc2VzLktFWV9GMzogJ2tmMycsCisgICAgX2N1cnNlcy5LRVlfRjMwOiAna2YzMCcsCisgICAgX2N1cnNlcy5LRVlfRjMxOiAna2YzMScsCisgICAgX2N1cnNlcy5LRVlfRjMyOiAna2YzMicsCisgICAgX2N1cnNlcy5LRVlfRjMzOiAna2YzMycsCisgICAgX2N1cnNlcy5LRVlfRjM0OiAna2YzNCcsCisgICAgX2N1cnNlcy5LRVlfRjM1OiAna2YzNScsCisgICAgX2N1cnNlcy5LRVlfRjM2OiAna2YzNicsCisgICAgX2N1cnNlcy5LRVlfRjM3OiAna2YzNycsCisgICAgX2N1cnNlcy5LRVlfRjM4OiAna2YzOCcsCisgICAgX2N1cnNlcy5LRVlfRjM5OiAna2YzOScsCisgICAgX2N1cnNlcy5LRVlfRjQ6ICdrZjQnLAorICAgIF9jdXJzZXMuS0VZX0Y0MDogJ2tmNDAnLAorICAgIF9jdXJzZXMuS0VZX0Y0MTogJ2tmNDEnLAorICAgIF9jdXJzZXMuS0VZX0Y0MjogJ2tmNDInLAorICAgIF9jdXJzZXMuS0VZX0Y0MzogJ2tmNDMnLAorICAgIF9jdXJzZXMuS0VZX0Y0NDogJ2tmNDQnLAorICAgIF9jdXJzZXMuS0VZX0Y0NTogJ2tmNDUnLAorICAgIF9jdXJzZXMuS0VZX0Y0NjogJ2tmNDYnLAorICAgIF9jdXJzZXMuS0VZX0Y0NzogJ2tmNDcnLAorICAgIF9jdXJzZXMuS0VZX0Y0ODogJ2tmNDgnLAorICAgIF9jdXJzZXMuS0VZX0Y0OTogJ2tmNDknLAorICAgIF9jdXJzZXMuS0VZX0Y1OiAna2Y1JywKKyAgICBfY3Vyc2VzLktFWV9GNTA6ICdrZjUwJywKKyAgICBfY3Vyc2VzLktFWV9GNTE6ICdrZjUxJywKKyAgICBfY3Vyc2VzLktFWV9GNTI6ICdrZjUyJywKKyAgICBfY3Vyc2VzLktFWV9GNTM6ICdrZjUzJywKKyAgICBfY3Vyc2VzLktFWV9GNTQ6ICdrZjU0JywKKyAgICBfY3Vyc2VzLktFWV9GNTU6ICdrZjU1JywKKyAgICBfY3Vyc2VzLktFWV9GNTY6ICdrZjU2JywKKyAgICBfY3Vyc2VzLktFWV9GNTc6ICdrZjU3JywKKyAgICBfY3Vyc2VzLktFWV9GNTg6ICdrZjU4JywKKyAgICBfY3Vyc2VzLktFWV9GNTk6ICdrZjU5JywKKyAgICBfY3Vyc2VzLktFWV9GNjogJ2tmNicsCisgICAgX2N1cnNlcy5LRVlfRjYwOiAna2Y2MCcsCisgICAgX2N1cnNlcy5LRVlfRjYxOiAna2Y2MScsCisgICAgX2N1cnNlcy5LRVlfRjYyOiAna2Y2MicsCisgICAgX2N1cnNlcy5LRVlfRjYzOiAna2Y2MycsCisgICAgX2N1cnNlcy5LRVlfRjc6ICdrZjcnLAorICAgIF9jdXJzZXMuS0VZX0Y4OiAna2Y4JywKKyAgICBfY3Vyc2VzLktFWV9GOTogJ2tmOScsCisgICAgX2N1cnNlcy5LRVlfRklORDogJ2tmbmQnLAorICAgIF9jdXJzZXMuS0VZX0hFTFA6ICdraGxwJywKKyAgICBfY3Vyc2VzLktFWV9IT01FOiAna2hvbWUnLAorICAgIF9jdXJzZXMuS0VZX0lDOiAna2ljaDEnLAorICAgIF9jdXJzZXMuS0VZX0lMOiAna2lsMScsCisgICAgX2N1cnNlcy5LRVlfTEVGVDogJ2tjdWIxJywKKyAgICBfY3Vyc2VzLktFWV9MTDogJ2tsbCcsCisgICAgX2N1cnNlcy5LRVlfTUFSSzogJ2ttcmsnLAorICAgIF9jdXJzZXMuS0VZX01FU1NBR0U6ICdrbXNnJywKKyAgICBfY3Vyc2VzLktFWV9NT1ZFOiAna21vdicsCisgICAgX2N1cnNlcy5LRVlfTkVYVDogJ2tueHQnLAorICAgIF9jdXJzZXMuS0VZX05QQUdFOiAna25wJywKKyAgICBfY3Vyc2VzLktFWV9PUEVOOiAna29wbicsCisgICAgX2N1cnNlcy5LRVlfT1BUSU9OUzogJ2tvcHQnLAorICAgIF9jdXJzZXMuS0VZX1BQQUdFOiAna3BwJywKKyAgICBfY3Vyc2VzLktFWV9QUkVWSU9VUzogJ2twcnYnLAorICAgIF9jdXJzZXMuS0VZX1BSSU5UOiAna3BydCcsCisgICAgX2N1cnNlcy5LRVlfUkVETzogJ2tyZG8nLAorICAgIF9jdXJzZXMuS0VZX1JFRkVSRU5DRTogJ2tyZWYnLAorICAgIF9jdXJzZXMuS0VZX1JFRlJFU0g6ICdrcmZyJywKKyAgICBfY3Vyc2VzLktFWV9SRVBMQUNFOiAna3JwbCcsCisgICAgX2N1cnNlcy5LRVlfUkVTVEFSVDogJ2tyc3QnLAorICAgIF9jdXJzZXMuS0VZX1JFU1VNRTogJ2tyZXMnLAorICAgIF9jdXJzZXMuS0VZX1JJR0hUOiAna2N1ZjEnLAorICAgIF9jdXJzZXMuS0VZX1NBVkU6ICdrc2F2JywKKyAgICBfY3Vyc2VzLktFWV9TQkVHOiAna0JFRycsCisgICAgX2N1cnNlcy5LRVlfU0NBTkNFTDogJ2tDQU4nLAorICAgIF9jdXJzZXMuS0VZX1NDT01NQU5EOiAna0NNRCcsCisgICAgX2N1cnNlcy5LRVlfU0NPUFk6ICdrQ1BZJywKKyAgICBfY3Vyc2VzLktFWV9TQ1JFQVRFOiAna0NSVCcsCisgICAgX2N1cnNlcy5LRVlfU0RDOiAna0RDJywKKyAgICBfY3Vyc2VzLktFWV9TREw6ICdrREwnLAorICAgIF9jdXJzZXMuS0VZX1NFTEVDVDogJ2tzbHQnLAorICAgIF9jdXJzZXMuS0VZX1NFTkQ6ICdrRU5EJywKKyAgICBfY3Vyc2VzLktFWV9TRU9MOiAna0VPTCcsCisgICAgX2N1cnNlcy5LRVlfU0VYSVQ6ICdrRVhUJywKKyAgICBfY3Vyc2VzLktFWV9TRjogJ2tpbmQnLAorICAgIF9jdXJzZXMuS0VZX1NGSU5EOiAna0ZORCcsCisgICAgX2N1cnNlcy5LRVlfU0hFTFA6ICdrSExQJywKKyAgICBfY3Vyc2VzLktFWV9TSE9NRTogJ2tIT00nLAorICAgIF9jdXJzZXMuS0VZX1NJQzogJ2tJQycsCisgICAgX2N1cnNlcy5LRVlfU0xFRlQ6ICdrTEZUJywKKyAgICBfY3Vyc2VzLktFWV9TTUVTU0FHRTogJ2tNU0cnLAorICAgIF9jdXJzZXMuS0VZX1NNT1ZFOiAna01PVicsCisgICAgX2N1cnNlcy5LRVlfU05FWFQ6ICdrTlhUJywKKyAgICBfY3Vyc2VzLktFWV9TT1BUSU9OUzogJ2tPUFQnLAorICAgIF9jdXJzZXMuS0VZX1NQUkVWSU9VUzogJ2tQUlYnLAorICAgIF9jdXJzZXMuS0VZX1NQUklOVDogJ2tQUlQnLAorICAgIF9jdXJzZXMuS0VZX1NSOiAna3JpJywKKyAgICBfY3Vyc2VzLktFWV9TUkVETzogJ2tSRE8nLAorICAgIF9jdXJzZXMuS0VZX1NSRVBMQUNFOiAna1JQTCcsCisgICAgX2N1cnNlcy5LRVlfU1JJR0hUOiAna1JJVCcsCisgICAgX2N1cnNlcy5LRVlfU1JTVU1FOiAna1JFUycsCisgICAgX2N1cnNlcy5LRVlfU1NBVkU6ICdrU0FWJywKKyAgICBfY3Vyc2VzLktFWV9TU1VTUEVORDogJ2tTUEQnLAorICAgIF9jdXJzZXMuS0VZX1NUQUI6ICdraHRzJywKKyAgICBfY3Vyc2VzLktFWV9TVU5ETzogJ2tVTkQnLAorICAgIF9jdXJzZXMuS0VZX1NVU1BFTkQ6ICdrc3BkJywKKyAgICBfY3Vyc2VzLktFWV9VTkRPOiAna3VuZCcsCisgICAgX2N1cnNlcy5LRVlfVVA6ICdrY3V1MScKKyAgICB9CisKK2RlZiBoYXNfa2V5KGNoKToKKyAgICBpZiBpc2luc3RhbmNlKGNoLCBzdHIpOgorICAgICAgICBjaCA9IG9yZChjaCkKKworICAgICMgRmlndXJlIG91dCB0aGUgY29ycmVjdCBjYXBhYmlsaXR5IG5hbWUgZm9yIHRoZSBrZXljb2RlLgorICAgIGNhcGFiaWxpdHlfbmFtZSA9IF9jYXBhYmlsaXR5X25hbWVzLmdldChjaCkKKyAgICBpZiBjYXBhYmlsaXR5X25hbWUgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjQ2hlY2sgdGhlIGN1cnJlbnQgdGVybWluYWwgZGVzY3JpcHRpb24gZm9yIHRoYXQgY2FwYWJpbGl0eTsKKyAgICAjaWYgcHJlc2VudCwgcmV0dXJuIHRydWUsIGVsc2UgcmV0dXJuIGZhbHNlLgorICAgIGlmIF9jdXJzZXMudGlnZXRzdHIoIGNhcGFiaWxpdHlfbmFtZSApOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBGYWxzZQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICMgQ29tcGFyZSB0aGUgb3V0cHV0IG9mIHRoaXMgaW1wbGVtZW50YXRpb24gYW5kIHRoZSBuY3Vyc2VzIGhhc19rZXksCisgICAgIyBvbiBwbGF0Zm9ybXMgd2hlcmUgaGFzX2tleSBpcyBhbHJlYWR5IGF2YWlsYWJsZQorICAgIHRyeToKKyAgICAgICAgTCA9IFtdCisgICAgICAgIF9jdXJzZXMuaW5pdHNjcigpCisgICAgICAgIGZvciBrZXkgaW4gX2NhcGFiaWxpdHlfbmFtZXMua2V5cygpOgorICAgICAgICAgICAgc3lzdGVtID0ga2V5IGluIF9jdXJzZXMKKyAgICAgICAgICAgIHB5dGhvbiA9IGhhc19rZXkoa2V5KQorICAgICAgICAgICAgaWYgc3lzdGVtICE9IHB5dGhvbjoKKyAgICAgICAgICAgICAgICBMLmFwcGVuZCggJ01pc21hdGNoIGZvciBrZXkgJXMsIHN5c3RlbT0laSwgUHl0aG9uPSVpJworICAgICAgICAgICAgICAgICAgICAgICAgICAlIChfY3Vyc2VzLmtleW5hbWUoIGtleSApLCBzeXN0ZW0sIHB5dGhvbikgKQorICAgIGZpbmFsbHk6CisgICAgICAgIF9jdXJzZXMuZW5kd2luKCkKKyAgICAgICAgZm9yIGkgaW4gTDogcHJpbnQgaQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvaGFzX2tleS5weWMgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9oYXNfa2V5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWQ4MTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvaGFzX2tleS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvaGFzX2tleS5weW8gYi9saWIvcHl0aG9uMi43L2N1cnNlcy9oYXNfa2V5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWQ4MTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvaGFzX2tleS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvcGFuZWwucHkgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9wYW5lbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWNjYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvcGFuZWwucHkKQEAgLTAsMCArMSw4IEBACisiIiJjdXJzZXMucGFuZWwKKworTW9kdWxlIGZvciB1c2luZyBwYW5lbHMgd2l0aCBjdXJzZXMuCisiIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2Zyb20gX2N1cnNlc19wYW5lbCBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvcGFuZWwucHljIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvcGFuZWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZWVhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9wYW5lbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvcGFuZWwucHlvIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvcGFuZWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZWVhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9wYW5lbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvdGV4dHBhZC5weSBiL2xpYi9weXRob24yLjcvY3Vyc2VzL3RleHRwYWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1MzYxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL3RleHRwYWQucHkKQEAgLTAsMCArMSwxODggQEAKKyIiIlNpbXBsZSB0ZXh0Ym94IGVkaXRpbmcgd2lkZ2V0IHdpdGggRW1hY3MtbGlrZSBrZXliaW5kaW5ncy4iIiIKKworaW1wb3J0IGN1cnNlcworaW1wb3J0IGN1cnNlcy5hc2NpaQorCitkZWYgcmVjdGFuZ2xlKHdpbiwgdWx5LCB1bHgsIGxyeSwgbHJ4KToKKyAgICAiIiJEcmF3IGEgcmVjdGFuZ2xlIHdpdGggY29ybmVycyBhdCB0aGUgcHJvdmlkZWQgdXBwZXItbGVmdAorICAgIGFuZCBsb3dlci1yaWdodCBjb29yZGluYXRlcy4KKyAgICAiIiIKKyAgICB3aW4udmxpbmUodWx5KzEsIHVseCwgY3Vyc2VzLkFDU19WTElORSwgbHJ5IC0gdWx5IC0gMSkKKyAgICB3aW4uaGxpbmUodWx5LCB1bHgrMSwgY3Vyc2VzLkFDU19ITElORSwgbHJ4IC0gdWx4IC0gMSkKKyAgICB3aW4uaGxpbmUobHJ5LCB1bHgrMSwgY3Vyc2VzLkFDU19ITElORSwgbHJ4IC0gdWx4IC0gMSkKKyAgICB3aW4udmxpbmUodWx5KzEsIGxyeCwgY3Vyc2VzLkFDU19WTElORSwgbHJ5IC0gdWx5IC0gMSkKKyAgICB3aW4uYWRkY2godWx5LCB1bHgsIGN1cnNlcy5BQ1NfVUxDT1JORVIpCisgICAgd2luLmFkZGNoKHVseSwgbHJ4LCBjdXJzZXMuQUNTX1VSQ09STkVSKQorICAgIHdpbi5hZGRjaChscnksIGxyeCwgY3Vyc2VzLkFDU19MUkNPUk5FUikKKyAgICB3aW4uYWRkY2gobHJ5LCB1bHgsIGN1cnNlcy5BQ1NfTExDT1JORVIpCisKK2NsYXNzIFRleHRib3g6CisgICAgIiIiRWRpdGluZyB3aWRnZXQgdXNpbmcgdGhlIGludGVyaW9yIG9mIGEgd2luZG93IG9iamVjdC4KKyAgICAgU3VwcG9ydHMgdGhlIGZvbGxvd2luZyBFbWFjcy1saWtlIGtleSBiaW5kaW5nczoKKworICAgIEN0cmwtQSAgICAgIEdvIHRvIGxlZnQgZWRnZSBvZiB3aW5kb3cuCisgICAgQ3RybC1CICAgICAgQ3Vyc29yIGxlZnQsIHdyYXBwaW5nIHRvIHByZXZpb3VzIGxpbmUgaWYgYXBwcm9wcmlhdGUuCisgICAgQ3RybC1EICAgICAgRGVsZXRlIGNoYXJhY3RlciB1bmRlciBjdXJzb3IuCisgICAgQ3RybC1FICAgICAgR28gdG8gcmlnaHQgZWRnZSAoc3RyaXBzcGFjZXMgb2ZmKSBvciBlbmQgb2YgbGluZSAoc3RyaXBzcGFjZXMgb24pLgorICAgIEN0cmwtRiAgICAgIEN1cnNvciByaWdodCwgd3JhcHBpbmcgdG8gbmV4dCBsaW5lIHdoZW4gYXBwcm9wcmlhdGUuCisgICAgQ3RybC1HICAgICAgVGVybWluYXRlLCByZXR1cm5pbmcgdGhlIHdpbmRvdyBjb250ZW50cy4KKyAgICBDdHJsLUggICAgICBEZWxldGUgY2hhcmFjdGVyIGJhY2t3YXJkLgorICAgIEN0cmwtSiAgICAgIFRlcm1pbmF0ZSBpZiB0aGUgd2luZG93IGlzIDEgbGluZSwgb3RoZXJ3aXNlIGluc2VydCBuZXdsaW5lLgorICAgIEN0cmwtSyAgICAgIElmIGxpbmUgaXMgYmxhbmssIGRlbGV0ZSBpdCwgb3RoZXJ3aXNlIGNsZWFyIHRvIGVuZCBvZiBsaW5lLgorICAgIEN0cmwtTCAgICAgIFJlZnJlc2ggc2NyZWVuLgorICAgIEN0cmwtTiAgICAgIEN1cnNvciBkb3duOyBtb3ZlIGRvd24gb25lIGxpbmUuCisgICAgQ3RybC1PICAgICAgSW5zZXJ0IGEgYmxhbmsgbGluZSBhdCBjdXJzb3IgbG9jYXRpb24uCisgICAgQ3RybC1QICAgICAgQ3Vyc29yIHVwOyBtb3ZlIHVwIG9uZSBsaW5lLgorCisgICAgTW92ZSBvcGVyYXRpb25zIGRvIG5vdGhpbmcgaWYgdGhlIGN1cnNvciBpcyBhdCBhbiBlZGdlIHdoZXJlIHRoZSBtb3ZlbWVudAorICAgIGlzIG5vdCBwb3NzaWJsZS4gIFRoZSBmb2xsb3dpbmcgc3lub255bXMgYXJlIHN1cHBvcnRlZCB3aGVyZSBwb3NzaWJsZToKKworICAgIEtFWV9MRUZUID0gQ3RybC1CLCBLRVlfUklHSFQgPSBDdHJsLUYsIEtFWV9VUCA9IEN0cmwtUCwgS0VZX0RPV04gPSBDdHJsLU4KKyAgICBLRVlfQkFDS1NQQUNFID0gQ3RybC1oCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdpbiwgaW5zZXJ0X21vZGU9RmFsc2UpOgorICAgICAgICBzZWxmLndpbiA9IHdpbgorICAgICAgICBzZWxmLmluc2VydF9tb2RlID0gaW5zZXJ0X21vZGUKKyAgICAgICAgKHNlbGYubWF4eSwgc2VsZi5tYXh4KSA9IHdpbi5nZXRtYXh5eCgpCisgICAgICAgIHNlbGYubWF4eSA9IHNlbGYubWF4eSAtIDEKKyAgICAgICAgc2VsZi5tYXh4ID0gc2VsZi5tYXh4IC0gMQorICAgICAgICBzZWxmLnN0cmlwc3BhY2VzID0gMQorICAgICAgICBzZWxmLmxhc3RjbWQgPSBOb25lCisgICAgICAgIHdpbi5rZXlwYWQoMSkKKworICAgIGRlZiBfZW5kX29mX2xpbmUoc2VsZiwgeSk6CisgICAgICAgICIiIkdvIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgYmxhbmsgb24gdGhlIGdpdmVuIGxpbmUsCisgICAgICAgIHJldHVybmluZyB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgbm9uLWJsYW5rIGNoYXJhY3Rlci4iIiIKKyAgICAgICAgbGFzdCA9IHNlbGYubWF4eAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgY3Vyc2VzLmFzY2lpLmFzY2lpKHNlbGYud2luLmluY2goeSwgbGFzdCkpICE9IGN1cnNlcy5hc2NpaS5TUDoKKyAgICAgICAgICAgICAgICBsYXN0ID0gbWluKHNlbGYubWF4eCwgbGFzdCsxKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIGxhc3QgPT0gMDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgbGFzdCA9IGxhc3QgLSAxCisgICAgICAgIHJldHVybiBsYXN0CisKKyAgICBkZWYgX2luc2VydF9wcmludGFibGVfY2hhcihzZWxmLCBjaCk6CisgICAgICAgICh5LCB4KSA9IHNlbGYud2luLmdldHl4KCkKKyAgICAgICAgaWYgeSA8IHNlbGYubWF4eSBvciB4IDwgc2VsZi5tYXh4OgorICAgICAgICAgICAgaWYgc2VsZi5pbnNlcnRfbW9kZToKKyAgICAgICAgICAgICAgICBvbGRjaCA9IHNlbGYud2luLmluY2goKQorICAgICAgICAgICAgIyBUaGUgdHJ5LWNhdGNoIGlnbm9yZXMgdGhlIGVycm9yIHdlIHRyaWdnZXIgZnJvbSBzb21lIGN1cnNlcworICAgICAgICAgICAgIyB2ZXJzaW9ucyBieSB0cnlpbmcgdG8gd3JpdGUgaW50byB0aGUgbG93ZXN0LXJpZ2h0bW9zdCBzcG90CisgICAgICAgICAgICAjIGluIHRoZSB3aW5kb3cuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi53aW4uYWRkY2goY2gpCisgICAgICAgICAgICBleGNlcHQgY3Vyc2VzLmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIHNlbGYuaW5zZXJ0X21vZGU6CisgICAgICAgICAgICAgICAgKGJhY2t5LCBiYWNreCkgPSBzZWxmLndpbi5nZXR5eCgpCisgICAgICAgICAgICAgICAgaWYgY3Vyc2VzLmFzY2lpLmlzcHJpbnQob2xkY2gpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnNlcnRfcHJpbnRhYmxlX2NoYXIob2xkY2gpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud2luLm1vdmUoYmFja3ksIGJhY2t4KQorCisgICAgZGVmIGRvX2NvbW1hbmQoc2VsZiwgY2gpOgorICAgICAgICAiUHJvY2VzcyBhIHNpbmdsZSBlZGl0aW5nIGNvbW1hbmQuIgorICAgICAgICAoeSwgeCkgPSBzZWxmLndpbi5nZXR5eCgpCisgICAgICAgIHNlbGYubGFzdGNtZCA9IGNoCisgICAgICAgIGlmIGN1cnNlcy5hc2NpaS5pc3ByaW50KGNoKToKKyAgICAgICAgICAgIGlmIHkgPCBzZWxmLm1heHkgb3IgeCA8IHNlbGYubWF4eDoKKyAgICAgICAgICAgICAgICBzZWxmLl9pbnNlcnRfcHJpbnRhYmxlX2NoYXIoY2gpCisgICAgICAgIGVsaWYgY2ggPT0gY3Vyc2VzLmFzY2lpLlNPSDogICAgICAgICAgICAgICAgICAgICAgICAgICAjIF5hCisgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHksIDApCisgICAgICAgIGVsaWYgY2ggaW4gKGN1cnNlcy5hc2NpaS5TVFgsY3Vyc2VzLktFWV9MRUZULCBjdXJzZXMuYXNjaWkuQlMsY3Vyc2VzLktFWV9CQUNLU1BBQ0UpOgorICAgICAgICAgICAgaWYgeCA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi53aW4ubW92ZSh5LCB4LTEpCisgICAgICAgICAgICBlbGlmIHkgPT0gMDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIHNlbGYuc3RyaXBzcGFjZXM6CisgICAgICAgICAgICAgICAgc2VsZi53aW4ubW92ZSh5LTEsIHNlbGYuX2VuZF9vZl9saW5lKHktMSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud2luLm1vdmUoeS0xLCBzZWxmLm1heHgpCisgICAgICAgICAgICBpZiBjaCBpbiAoY3Vyc2VzLmFzY2lpLkJTLCBjdXJzZXMuS0VZX0JBQ0tTUEFDRSk6CisgICAgICAgICAgICAgICAgc2VsZi53aW4uZGVsY2goKQorICAgICAgICBlbGlmIGNoID09IGN1cnNlcy5hc2NpaS5FT1Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBeZAorICAgICAgICAgICAgc2VsZi53aW4uZGVsY2goKQorICAgICAgICBlbGlmIGNoID09IGN1cnNlcy5hc2NpaS5FTlE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBeZQorICAgICAgICAgICAgaWYgc2VsZi5zdHJpcHNwYWNlczoKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHksIHNlbGYuX2VuZF9vZl9saW5lKHkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHksIHNlbGYubWF4eCkKKyAgICAgICAgZWxpZiBjaCBpbiAoY3Vyc2VzLmFzY2lpLkFDSywgY3Vyc2VzLktFWV9SSUdIVCk6ICAgICAgICMgXmYKKyAgICAgICAgICAgIGlmIHggPCBzZWxmLm1heHg6CisgICAgICAgICAgICAgICAgc2VsZi53aW4ubW92ZSh5LCB4KzEpCisgICAgICAgICAgICBlbGlmIHkgPT0gc2VsZi5tYXh5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53aW4ubW92ZSh5KzEsIDApCisgICAgICAgIGVsaWYgY2ggPT0gY3Vyc2VzLmFzY2lpLkJFTDogICAgICAgICAgICAgICAgICAgICAgICAgICAjIF5nCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBlbGlmIGNoID09IGN1cnNlcy5hc2NpaS5OTDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBeagorICAgICAgICAgICAgaWYgc2VsZi5tYXh5ID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGVsaWYgeSA8IHNlbGYubWF4eToKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHkrMSwgMCkKKyAgICAgICAgZWxpZiBjaCA9PSBjdXJzZXMuYXNjaWkuVlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgXmsKKyAgICAgICAgICAgIGlmIHggPT0gMCBhbmQgc2VsZi5fZW5kX29mX2xpbmUoeSkgPT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5kZWxldGVsbigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgZmlyc3QgdW5kbyB0aGUgZWZmZWN0IG9mIHNlbGYuX2VuZF9vZl9saW5lCisgICAgICAgICAgICAgICAgc2VsZi53aW4ubW92ZSh5LCB4KQorICAgICAgICAgICAgICAgIHNlbGYud2luLmNscnRvZW9sKCkKKyAgICAgICAgZWxpZiBjaCA9PSBjdXJzZXMuYXNjaWkuRkY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgXmwKKyAgICAgICAgICAgIHNlbGYud2luLnJlZnJlc2goKQorICAgICAgICBlbGlmIGNoIGluIChjdXJzZXMuYXNjaWkuU08sIGN1cnNlcy5LRVlfRE9XTik6ICAgICAgICAgIyBebgorICAgICAgICAgICAgaWYgeSA8IHNlbGYubWF4eToKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHkrMSwgeCkKKyAgICAgICAgICAgICAgICBpZiB4ID4gc2VsZi5fZW5kX29mX2xpbmUoeSsxKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53aW4ubW92ZSh5KzEsIHNlbGYuX2VuZF9vZl9saW5lKHkrMSkpCisgICAgICAgIGVsaWYgY2ggPT0gY3Vyc2VzLmFzY2lpLlNJOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIF5vCisgICAgICAgICAgICBzZWxmLndpbi5pbnNlcnRsbigpCisgICAgICAgIGVsaWYgY2ggaW4gKGN1cnNlcy5hc2NpaS5ETEUsIGN1cnNlcy5LRVlfVVApOiAgICAgICAgICAjIF5wCisgICAgICAgICAgICBpZiB5ID4gMDoKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHktMSwgeCkKKyAgICAgICAgICAgICAgICBpZiB4ID4gc2VsZi5fZW5kX29mX2xpbmUoeS0xKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53aW4ubW92ZSh5LTEsIHNlbGYuX2VuZF9vZl9saW5lKHktMSkpCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgZ2F0aGVyKHNlbGYpOgorICAgICAgICAiQ29sbGVjdCBhbmQgcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgd2luZG93LiIKKyAgICAgICAgcmVzdWx0ID0gIiIKKyAgICAgICAgZm9yIHkgaW4gcmFuZ2Uoc2VsZi5tYXh5KzEpOgorICAgICAgICAgICAgc2VsZi53aW4ubW92ZSh5LCAwKQorICAgICAgICAgICAgc3RvcCA9IHNlbGYuX2VuZF9vZl9saW5lKHkpCisgICAgICAgICAgICBpZiBzdG9wID09IDAgYW5kIHNlbGYuc3RyaXBzcGFjZXM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZvciB4IGluIHJhbmdlKHNlbGYubWF4eCsxKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0cmlwc3BhY2VzIGFuZCB4ID4gc3RvcDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBjaHIoY3Vyc2VzLmFzY2lpLmFzY2lpKHNlbGYud2luLmluY2goeSwgeCkpKQorICAgICAgICAgICAgaWYgc2VsZi5tYXh5ID4gMDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAiXG4iCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBlZGl0KHNlbGYsIHZhbGlkYXRlPU5vbmUpOgorICAgICAgICAiRWRpdCBpbiB0aGUgd2lkZ2V0IHdpbmRvdyBhbmQgY29sbGVjdCB0aGUgcmVzdWx0cy4iCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBjaCA9IHNlbGYud2luLmdldGNoKCkKKyAgICAgICAgICAgIGlmIHZhbGlkYXRlOgorICAgICAgICAgICAgICAgIGNoID0gdmFsaWRhdGUoY2gpCisgICAgICAgICAgICBpZiBub3QgY2g6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRvX2NvbW1hbmQoY2gpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzZWxmLndpbi5yZWZyZXNoKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2F0aGVyKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBkZWYgdGVzdF9lZGl0Ym94KHN0ZHNjcik6CisgICAgICAgIG5jb2xzLCBubGluZXMgPSA5LCA0CisgICAgICAgIHVseSwgdWx4ID0gMTUsIDIwCisgICAgICAgIHN0ZHNjci5hZGRzdHIodWx5LTIsIHVseCwgIlVzZSBDdHJsLUcgdG8gZW5kIGVkaXRpbmcuIikKKyAgICAgICAgd2luID0gY3Vyc2VzLm5ld3dpbihubGluZXMsIG5jb2xzLCB1bHksIHVseCkKKyAgICAgICAgcmVjdGFuZ2xlKHN0ZHNjciwgdWx5LTEsIHVseC0xLCB1bHkgKyBubGluZXMsIHVseCArIG5jb2xzKQorICAgICAgICBzdGRzY3IucmVmcmVzaCgpCisgICAgICAgIHJldHVybiBUZXh0Ym94KHdpbikuZWRpdCgpCisKKyAgICBzdHIgPSBjdXJzZXMud3JhcHBlcih0ZXN0X2VkaXRib3gpCisgICAgcHJpbnQgJ0NvbnRlbnRzIG9mIHRleHQgYm94OicsIHJlcHIoc3RyKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvdGV4dHBhZC5weWMgYi9saWIvcHl0aG9uMi43L2N1cnNlcy90ZXh0cGFkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2E1YzZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvdGV4dHBhZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvdGV4dHBhZC5weW8gYi9saWIvcHl0aG9uMi43L2N1cnNlcy90ZXh0cGFkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2E1YzZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvdGV4dHBhZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvd3JhcHBlci5weSBiL2xpYi9weXRob24yLjcvY3Vyc2VzL3dyYXBwZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4M2NlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL3dyYXBwZXIucHkKQEAgLTAsMCArMSw1MCBAQAorIiIiY3Vyc2VzLndyYXBwZXIKKworQ29udGFpbnMgb25lIGZ1bmN0aW9uLCB3cmFwcGVyKCksIHdoaWNoIHJ1bnMgYW5vdGhlciBmdW5jdGlvbiB3aGljaAorc2hvdWxkIGJlIHRoZSByZXN0IG9mIHlvdXIgY3Vyc2VzLWJhc2VkIGFwcGxpY2F0aW9uLiAgSWYgdGhlCithcHBsaWNhdGlvbiByYWlzZXMgYW4gZXhjZXB0aW9uLCB3cmFwcGVyKCkgd2lsbCByZXN0b3JlIHRoZSB0ZXJtaW5hbAordG8gYSBzYW5lIHN0YXRlIHNvIHlvdSBjYW4gcmVhZCB0aGUgcmVzdWx0aW5nIHRyYWNlYmFjay4KKworIiIiCisKK2ltcG9ydCBjdXJzZXMKKworZGVmIHdyYXBwZXIoZnVuYywgKmFyZ3MsICoqa3dkcyk6CisgICAgIiIiV3JhcHBlciBmdW5jdGlvbiB0aGF0IGluaXRpYWxpemVzIGN1cnNlcyBhbmQgY2FsbHMgYW5vdGhlciBmdW5jdGlvbiwKKyAgICByZXN0b3Jpbmcgbm9ybWFsIGtleWJvYXJkL3NjcmVlbiBiZWhhdmlvciBvbiBlcnJvci4KKyAgICBUaGUgY2FsbGFibGUgb2JqZWN0ICdmdW5jJyBpcyB0aGVuIHBhc3NlZCB0aGUgbWFpbiB3aW5kb3cgJ3N0ZHNjcicKKyAgICBhcyBpdHMgZmlyc3QgYXJndW1lbnQsIGZvbGxvd2VkIGJ5IGFueSBvdGhlciBhcmd1bWVudHMgcGFzc2VkIHRvCisgICAgd3JhcHBlcigpLgorICAgICIiIgorCisgICAgdHJ5OgorICAgICAgICAjIEluaXRpYWxpemUgY3Vyc2VzCisgICAgICAgIHN0ZHNjciA9IGN1cnNlcy5pbml0c2NyKCkKKworICAgICAgICAjIFR1cm4gb2ZmIGVjaG9pbmcgb2Yga2V5cywgYW5kIGVudGVyIGNicmVhayBtb2RlLAorICAgICAgICAjIHdoZXJlIG5vIGJ1ZmZlcmluZyBpcyBwZXJmb3JtZWQgb24ga2V5Ym9hcmQgaW5wdXQKKyAgICAgICAgY3Vyc2VzLm5vZWNobygpCisgICAgICAgIGN1cnNlcy5jYnJlYWsoKQorCisgICAgICAgICMgSW4ga2V5cGFkIG1vZGUsIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHNwZWNpYWwga2V5cworICAgICAgICAjIChsaWtlIHRoZSBjdXJzb3Iga2V5cykgd2lsbCBiZSBpbnRlcnByZXRlZCBhbmQKKyAgICAgICAgIyBhIHNwZWNpYWwgdmFsdWUgbGlrZSBjdXJzZXMuS0VZX0xFRlQgd2lsbCBiZSByZXR1cm5lZAorICAgICAgICBzdGRzY3Iua2V5cGFkKDEpCisKKyAgICAgICAgIyBTdGFydCBjb2xvciwgdG9vLiAgSGFybWxlc3MgaWYgdGhlIHRlcm1pbmFsIGRvZXNuJ3QgaGF2ZQorICAgICAgICAjIGNvbG9yOyB1c2VyIGNhbiB0ZXN0IHdpdGggaGFzX2NvbG9yKCkgbGF0ZXIgb24uICBUaGUgdHJ5L2NhdGNoCisgICAgICAgICMgd29ya3MgYXJvdW5kIGEgbWlub3IgYml0IG9mIG92ZXItY29uc2NpZW50aW91c25lc3MgaW4gdGhlIGN1cnNlcworICAgICAgICAjIG1vZHVsZSAtLSB0aGUgZXJyb3IgcmV0dXJuIGZyb20gQyBzdGFydF9jb2xvcigpIGlzIGlnbm9yYWJsZS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3Vyc2VzLnN0YXJ0X2NvbG9yKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHJldHVybiBmdW5jKHN0ZHNjciwgKmFyZ3MsICoqa3dkcykKKyAgICBmaW5hbGx5OgorICAgICAgICAjIFNldCBldmVyeXRoaW5nIGJhY2sgdG8gbm9ybWFsCisgICAgICAgIGlmICdzdGRzY3InIGluIGxvY2FscygpOgorICAgICAgICAgICAgc3Rkc2NyLmtleXBhZCgwKQorICAgICAgICAgICAgY3Vyc2VzLmVjaG8oKQorICAgICAgICAgICAgY3Vyc2VzLm5vY2JyZWFrKCkKKyAgICAgICAgICAgIGN1cnNlcy5lbmR3aW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvd3JhcHBlci5weWMgYi9saWIvcHl0aG9uMi43L2N1cnNlcy93cmFwcGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGVlYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvd3JhcHBlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdXJzZXMvd3JhcHBlci5weW8gYi9saWIvcHl0aG9uMi43L2N1cnNlcy93cmFwcGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGVlYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvd3JhcHBlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kYmhhc2gucHkgYi9saWIvcHl0aG9uMi43L2RiaGFzaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQ1Mzc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kYmhhc2gucHkKQEAgLTAsMCArMSwxOCBAQAorIiIiUHJvdmlkZSBhIChnKWRibS1jb21wYXRpYmxlIGludGVyZmFjZSB0byBic2RkYi5oYXNob3Blbi4iIiIKKworaW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy53YXJucHkzaygiaW4gMy54LCB0aGUgZGJoYXNoIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIiwgc3RhY2tsZXZlbD0yKQordHJ5OgorICAgIGltcG9ydCBic2RkYgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgcHJldmVudCBhIHNlY29uZCBpbXBvcnQgb2YgdGhpcyBtb2R1bGUgZnJvbSBzcHVyaW91c2x5IHN1Y2NlZWRpbmcKKyAgICBkZWwgc3lzLm1vZHVsZXNbX19uYW1lX19dCisgICAgcmFpc2UKKworX19hbGxfXyA9IFsiZXJyb3IiLCJvcGVuIl0KKworZXJyb3IgPSBic2RkYi5lcnJvciAgICAgICAgICAgICAgICAgICAgICMgRXhwb3J0ZWQgZm9yIGFueWRibQorCitkZWYgb3BlbihmaWxlLCBmbGFnID0gJ3InLCBtb2RlPTA2NjYpOgorICAgIHJldHVybiBic2RkYi5oYXNob3BlbihmaWxlLCBmbGFnLCBtb2RlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kYmhhc2gucHljIGIvbGliL3B5dGhvbjIuNy9kYmhhc2gucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzFiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2RiaGFzaC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kYmhhc2gucHlvIGIvbGliL3B5dGhvbjIuNy9kYmhhc2gucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzFiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2RiaGFzaC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kZWNpbWFsLnB5IGIvbGliL3B5dGhvbjIuNy9kZWNpbWFsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTEyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2RlY2ltYWwucHkKQEAgLTAsMCArMSw2MTk4IEBACisjIENvcHlyaWdodCAoYykgMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIyBXcml0dGVuIGJ5IEVyaWMgUHJpY2UgPGVwcmljZSBhdCB0amhzc3QuZWR1PgorIyAgICBhbmQgRmFjdW5kbyBCYXRpc3RhIDxmYWN1bmRvIGF0IHRhbmlxdWV0aWwuY29tLmFyPgorIyAgICBhbmQgUmF5bW9uZCBIZXR0aW5nZXIgPHB5dGhvbiBhdCByY24uY29tPgorIyAgICBhbmQgQWFoeiA8YWFoeiBhdCBwb2JveC5jb20+CisjICAgIGFuZCBUaW0gUGV0ZXJzCisKKyMgVGhpcyBtb2R1bGUgaXMgY3VycmVudGx5IFB5Mi4zIGNvbXBhdGlibGUgYW5kIHNob3VsZCBiZSBrZXB0IHRoYXQgd2F5CisjIHVubGVzcyBhIG1ham9yIGNvbXBlbGxpbmcgYWR2YW50YWdlIGFyaXNlcy4gIElPVywgMi4zIGNvbXBhdGliaWxpdHkgaXMKKyMgc3Ryb25nbHkgcHJlZmVycmVkLCBidXQgbm90IGd1YXJhbnRlZWQuCisKKyMgQWxzbywgdGhpcyBtb2R1bGUgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBsYXRlc3QgdXBkYXRlcyBvZgorIyB0aGUgSUJNIHNwZWNpZmljYXRpb24gYXMgaXQgZXZvbHZlcy4gIFRob3NlIHVwZGF0ZXMgd2lsbCBiZSB0cmVhdGVkCisjIGFzIGJ1ZyBmaXhlcyAoZGV2aWF0aW9uIGZyb20gdGhlIHNwZWMgaXMgYSBjb21wYXRpYmlsaXR5LCB1c2FiaWxpdHkKKyMgYnVnKSBhbmQgd2lsbCBiZSBiYWNrcG9ydGVkLiAgQXQgdGhpcyBwb2ludCB0aGUgc3BlYyBpcyBzdGFiaWxpemluZworIyBhbmQgdGhlIHVwZGF0ZXMgYXJlIGJlY29taW5nIGZld2VyLCBzbWFsbGVyLCBhbmQgbGVzcyBzaWduaWZpY2FudC4KKworIiIiCitUaGlzIGlzIGEgUHkyLjMgaW1wbGVtZW50YXRpb24gb2YgZGVjaW1hbCBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljIGJhc2VkIG9uCit0aGUgR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgU3BlY2lmaWNhdGlvbjoKKworICAgIGh0dHA6Ly9zcGVsZW90cm92ZS5jb20vZGVjaW1hbC9kZWNhcml0aC5odG1sCisKK2FuZCBJRUVFIHN0YW5kYXJkIDg1NC0xOTg3OgorCisgICAgd3d3LmNzLmJlcmtlbGV5LmVkdS9+ZWpyL3Byb2plY3RzLzc1NC9wcml2YXRlL2RyYWZ0cy84NTQtMTk4Ny9kaXIuaHRtbAorCitEZWNpbWFsIGZsb2F0aW5nIHBvaW50IGhhcyBmaW5pdGUgcHJlY2lzaW9uIHdpdGggYXJiaXRyYXJpbHkgbGFyZ2UgYm91bmRzLgorCitUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBzdXBwb3J0IGFyaXRobWV0aWMgdXNpbmcgZmFtaWxpYXIKKyJzY2hvb2xob3VzZSIgcnVsZXMgYW5kIHRvIGF2b2lkIHNvbWUgb2YgdGhlIHRyaWNreSByZXByZXNlbnRhdGlvbgoraXNzdWVzIGFzc29jaWF0ZWQgd2l0aCBiaW5hcnkgZmxvYXRpbmcgcG9pbnQuICBUaGUgcGFja2FnZSBpcyBlc3BlY2lhbGx5Cit1c2VmdWwgZm9yIGZpbmFuY2lhbCBhcHBsaWNhdGlvbnMgb3IgZm9yIGNvbnRleHRzIHdoZXJlIHVzZXJzIGhhdmUKK2V4cGVjdGF0aW9ucyB0aGF0IGFyZSBhdCBvZGRzIHdpdGggYmluYXJ5IGZsb2F0aW5nIHBvaW50IChmb3IgaW5zdGFuY2UsCitpbiBiaW5hcnkgZmxvYXRpbmcgcG9pbnQsIDEuMDAgJSAwLjEgZ2l2ZXMgMC4wOTk5OTk5OTk5OTk5OTk5NSBpbnN0ZWFkCitvZiB0aGUgZXhwZWN0ZWQgRGVjaW1hbCgnMC4wMCcpIHJldHVybmVkIGJ5IGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQpLgorCitIZXJlIGFyZSBzb21lIGV4YW1wbGVzIG9mIHVzaW5nIHRoZSBkZWNpbWFsIG1vZHVsZToKKworPj4+IGZyb20gZGVjaW1hbCBpbXBvcnQgKgorPj4+IHNldGNvbnRleHQoRXh0ZW5kZWRDb250ZXh0KQorPj4+IERlY2ltYWwoMCkKK0RlY2ltYWwoJzAnKQorPj4+IERlY2ltYWwoJzEnKQorRGVjaW1hbCgnMScpCis+Pj4gRGVjaW1hbCgnLS4wMTIzJykKK0RlY2ltYWwoJy0wLjAxMjMnKQorPj4+IERlY2ltYWwoMTIzNDU2KQorRGVjaW1hbCgnMTIzNDU2JykKKz4+PiBEZWNpbWFsKCcxMjMuNDVlMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnKQorRGVjaW1hbCgnMS4yMzQ1RSsxMjM0NTY3ODkwMTIzNDU2Nzg5MicpCis+Pj4gRGVjaW1hbCgnMS4zMycpICsgRGVjaW1hbCgnMS4yNycpCitEZWNpbWFsKCcyLjYwJykKKz4+PiBEZWNpbWFsKCcxMi4zNCcpICsgRGVjaW1hbCgnMy44NycpIC0gRGVjaW1hbCgnMTguNDEnKQorRGVjaW1hbCgnLTIuMjAnKQorPj4+IGRpZyA9IERlY2ltYWwoMSkKKz4+PiBwcmludCBkaWcgLyBEZWNpbWFsKDMpCiswLjMzMzMzMzMzMworPj4+IGdldGNvbnRleHQoKS5wcmVjID0gMTgKKz4+PiBwcmludCBkaWcgLyBEZWNpbWFsKDMpCiswLjMzMzMzMzMzMzMzMzMzMzMzMworPj4+IHByaW50IGRpZy5zcXJ0KCkKKzEKKz4+PiBwcmludCBEZWNpbWFsKDMpLnNxcnQoKQorMS43MzIwNTA4MDc1Njg4NzcyOQorPj4+IHByaW50IERlY2ltYWwoMykgKiogMTIzCis0Ljg1MTkyNzgwOTc2ODk2NDI3RSs1OAorPj4+IGluZiA9IERlY2ltYWwoMSkgLyBEZWNpbWFsKDApCis+Pj4gcHJpbnQgaW5mCitJbmZpbml0eQorPj4+IG5lZ2luZiA9IERlY2ltYWwoLTEpIC8gRGVjaW1hbCgwKQorPj4+IHByaW50IG5lZ2luZgorLUluZmluaXR5Cis+Pj4gcHJpbnQgbmVnaW5mICsgaW5mCitOYU4KKz4+PiBwcmludCBuZWdpbmYgKiBpbmYKKy1JbmZpbml0eQorPj4+IHByaW50IGRpZyAvIDAKK0luZmluaXR5Cis+Pj4gZ2V0Y29udGV4dCgpLnRyYXBzW0RpdmlzaW9uQnlaZXJvXSA9IDEKKz4+PiBwcmludCBkaWcgLyAwCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorICAuLi4KKyAgLi4uCitEaXZpc2lvbkJ5WmVybzogeCAvIDAKKz4+PiBjID0gQ29udGV4dCgpCis+Pj4gYy50cmFwc1tJbnZhbGlkT3BlcmF0aW9uXSA9IDAKKz4+PiBwcmludCBjLmZsYWdzW0ludmFsaWRPcGVyYXRpb25dCiswCis+Pj4gYy5kaXZpZGUoRGVjaW1hbCgwKSwgRGVjaW1hbCgwKSkKK0RlY2ltYWwoJ05hTicpCis+Pj4gYy50cmFwc1tJbnZhbGlkT3BlcmF0aW9uXSA9IDEKKz4+PiBwcmludCBjLmZsYWdzW0ludmFsaWRPcGVyYXRpb25dCisxCis+Pj4gYy5mbGFnc1tJbnZhbGlkT3BlcmF0aW9uXSA9IDAKKz4+PiBwcmludCBjLmZsYWdzW0ludmFsaWRPcGVyYXRpb25dCiswCis+Pj4gcHJpbnQgYy5kaXZpZGUoRGVjaW1hbCgwKSwgRGVjaW1hbCgwKSkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCisgIC4uLgorICAuLi4KK0ludmFsaWRPcGVyYXRpb246IDAgLyAwCis+Pj4gcHJpbnQgYy5mbGFnc1tJbnZhbGlkT3BlcmF0aW9uXQorMQorPj4+IGMuZmxhZ3NbSW52YWxpZE9wZXJhdGlvbl0gPSAwCis+Pj4gYy50cmFwc1tJbnZhbGlkT3BlcmF0aW9uXSA9IDAKKz4+PiBwcmludCBjLmRpdmlkZShEZWNpbWFsKDApLCBEZWNpbWFsKDApKQorTmFOCis+Pj4gcHJpbnQgYy5mbGFnc1tJbnZhbGlkT3BlcmF0aW9uXQorMQorPj4+CisiIiIKKworX19hbGxfXyA9IFsKKyAgICAjIFR3byBtYWpvciBjbGFzc2VzCisgICAgJ0RlY2ltYWwnLCAnQ29udGV4dCcsCisKKyAgICAjIENvbnRleHRzCisgICAgJ0RlZmF1bHRDb250ZXh0JywgJ0Jhc2ljQ29udGV4dCcsICdFeHRlbmRlZENvbnRleHQnLAorCisgICAgIyBFeGNlcHRpb25zCisgICAgJ0RlY2ltYWxFeGNlcHRpb24nLCAnQ2xhbXBlZCcsICdJbnZhbGlkT3BlcmF0aW9uJywgJ0RpdmlzaW9uQnlaZXJvJywKKyAgICAnSW5leGFjdCcsICdSb3VuZGVkJywgJ1N1Ym5vcm1hbCcsICdPdmVyZmxvdycsICdVbmRlcmZsb3cnLAorCisgICAgIyBDb25zdGFudHMgZm9yIHVzZSBpbiBzZXR0aW5nIHVwIGNvbnRleHRzCisgICAgJ1JPVU5EX0RPV04nLCAnUk9VTkRfSEFMRl9VUCcsICdST1VORF9IQUxGX0VWRU4nLCAnUk9VTkRfQ0VJTElORycsCisgICAgJ1JPVU5EX0ZMT09SJywgJ1JPVU5EX1VQJywgJ1JPVU5EX0hBTEZfRE9XTicsICdST1VORF8wNVVQJywKKworICAgICMgRnVuY3Rpb25zIGZvciBtYW5pcHVsYXRpbmcgY29udGV4dHMKKyAgICAnc2V0Y29udGV4dCcsICdnZXRjb250ZXh0JywgJ2xvY2FsY29udGV4dCcKK10KKworX192ZXJzaW9uX18gPSAnMS43MCcgICAgIyBIaWdoZXN0IHZlcnNpb24gb2YgdGhlIHNwZWMgdGhpcyBjb21wbGllcyB3aXRoCisKK2ltcG9ydCBjb3B5IGFzIF9jb3B5CitpbXBvcnQgbWF0aCBhcyBfbWF0aAoraW1wb3J0IG51bWJlcnMgYXMgX251bWJlcnMKKwordHJ5OgorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUgYXMgX25hbWVkdHVwbGUKKyAgICBEZWNpbWFsVHVwbGUgPSBfbmFtZWR0dXBsZSgnRGVjaW1hbFR1cGxlJywgJ3NpZ24gZGlnaXRzIGV4cG9uZW50JykKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBEZWNpbWFsVHVwbGUgPSBsYW1iZGEgKmFyZ3M6IGFyZ3MKKworIyBSb3VuZGluZworUk9VTkRfRE9XTiA9ICdST1VORF9ET1dOJworUk9VTkRfSEFMRl9VUCA9ICdST1VORF9IQUxGX1VQJworUk9VTkRfSEFMRl9FVkVOID0gJ1JPVU5EX0hBTEZfRVZFTicKK1JPVU5EX0NFSUxJTkcgPSAnUk9VTkRfQ0VJTElORycKK1JPVU5EX0ZMT09SID0gJ1JPVU5EX0ZMT09SJworUk9VTkRfVVAgPSAnUk9VTkRfVVAnCitST1VORF9IQUxGX0RPV04gPSAnUk9VTkRfSEFMRl9ET1dOJworUk9VTkRfMDVVUCA9ICdST1VORF8wNVVQJworCisjIEVycm9ycworCitjbGFzcyBEZWNpbWFsRXhjZXB0aW9uKEFyaXRobWV0aWNFcnJvcik6CisgICAgIiIiQmFzZSBleGNlcHRpb24gY2xhc3MuCisKKyAgICBVc2VkIGV4Y2VwdGlvbnMgZGVyaXZlIGZyb20gdGhpcy4KKyAgICBJZiBhbiBleGNlcHRpb24gZGVyaXZlcyBmcm9tIGFub3RoZXIgZXhjZXB0aW9uIGJlc2lkZXMgdGhpcyAoc3VjaCBhcworICAgIFVuZGVyZmxvdyAoSW5leGFjdCwgUm91bmRlZCwgU3Vibm9ybWFsKSB0aGF0IGluZGljYXRlcyB0aGF0IGl0IGlzIG9ubHkKKyAgICBjYWxsZWQgaWYgdGhlIG90aGVycyBhcmUgcHJlc2VudC4gIFRoaXMgaXNuJ3QgYWN0dWFsbHkgdXNlZCBmb3IKKyAgICBhbnl0aGluZywgdGhvdWdoLgorCisgICAgaGFuZGxlICAtLSBDYWxsZWQgd2hlbiBjb250ZXh0Ll9yYWlzZV9lcnJvciBpcyBjYWxsZWQgYW5kIHRoZQorICAgICAgICAgICAgICAgdHJhcF9lbmFibGVyIGlzIG5vdCBzZXQuICBGaXJzdCBhcmd1bWVudCBpcyBzZWxmLCBzZWNvbmQgaXMgdGhlCisgICAgICAgICAgICAgICBjb250ZXh0LiAgTW9yZSBhcmd1bWVudHMgY2FuIGJlIGdpdmVuLCB0aG9zZSBiZWluZyBhZnRlcgorICAgICAgICAgICAgICAgdGhlIGV4cGxhbmF0aW9uIGluIF9yYWlzZV9lcnJvciAoRm9yIGV4YW1wbGUsCisgICAgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihOZXdFcnJvciwgJygteCkhJywgc2VsZi5fc2lnbikgd291bGQKKyAgICAgICAgICAgICAgIGNhbGwgTmV3RXJyb3IoKS5oYW5kbGUoY29udGV4dCwgc2VsZi5fc2lnbikuKQorCisgICAgVG8gZGVmaW5lIGEgbmV3IGV4Y2VwdGlvbiwgaXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gaGF2ZSBpdCBkZXJpdmUKKyAgICBmcm9tIERlY2ltYWxFeGNlcHRpb24uCisgICAgIiIiCisgICAgZGVmIGhhbmRsZShzZWxmLCBjb250ZXh0LCAqYXJncyk6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBDbGFtcGVkKERlY2ltYWxFeGNlcHRpb24pOgorICAgICIiIkV4cG9uZW50IG9mIGEgMCBjaGFuZ2VkIHRvIGZpdCBib3VuZHMuCisKKyAgICBUaGlzIG9jY3VycyBhbmQgc2lnbmFscyBjbGFtcGVkIGlmIHRoZSBleHBvbmVudCBvZiBhIHJlc3VsdCBoYXMgYmVlbgorICAgIGFsdGVyZWQgaW4gb3JkZXIgdG8gZml0IHRoZSBjb25zdHJhaW50cyBvZiBhIHNwZWNpZmljIGNvbmNyZXRlCisgICAgcmVwcmVzZW50YXRpb24uICBUaGlzIG1heSBvY2N1ciB3aGVuIHRoZSBleHBvbmVudCBvZiBhIHplcm8gcmVzdWx0IHdvdWxkCisgICAgYmUgb3V0c2lkZSB0aGUgYm91bmRzIG9mIGEgcmVwcmVzZW50YXRpb24sIG9yIHdoZW4gYSBsYXJnZSBub3JtYWwKKyAgICBudW1iZXIgd291bGQgaGF2ZSBhbiBlbmNvZGVkIGV4cG9uZW50IHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkLiAgSW4KKyAgICB0aGlzIGxhdHRlciBjYXNlLCB0aGUgZXhwb25lbnQgaXMgcmVkdWNlZCB0byBmaXQgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisgICAgbnVtYmVyIG9mIHplcm8gZGlnaXRzIGFyZSBhcHBlbmRlZCB0byB0aGUgY29lZmZpY2llbnQgKCJmb2xkLWRvd24iKS4KKyAgICAiIiIKKworY2xhc3MgSW52YWxpZE9wZXJhdGlvbihEZWNpbWFsRXhjZXB0aW9uKToKKyAgICAiIiJBbiBpbnZhbGlkIG9wZXJhdGlvbiB3YXMgcGVyZm9ybWVkLgorCisgICAgVmFyaW91cyBiYWQgdGhpbmdzIGNhdXNlIHRoaXM6CisKKyAgICBTb21ldGhpbmcgY3JlYXRlcyBhIHNpZ25hbGluZyBOYU4KKyAgICAtSU5GICsgSU5GCisgICAgMCAqICgrLSlJTkYKKyAgICAoKy0pSU5GIC8gKCstKUlORgorICAgIHggJSAwCisgICAgKCstKUlORiAlIHgKKyAgICB4Ll9yZXNjYWxlKCBub24taW50ZWdlciApCisgICAgc3FydCgteCkgLCB4ID4gMAorICAgIDAgKiogMAorICAgIHggKiogKG5vbi1pbnRlZ2VyKQorICAgIHggKiogKCstKUlORgorICAgIEFuIG9wZXJhbmQgaXMgaW52YWxpZAorCisgICAgVGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIGFmdGVyIHRoZXNlIGlzIGEgcXVpZXQgcG9zaXRpdmUgTmFOLAorICAgIGV4Y2VwdCB3aGVuIHRoZSBjYXVzZSBpcyBhIHNpZ25hbGluZyBOYU4sIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcworICAgIGFsc28gYSBxdWlldCBOYU4sIGJ1dCB3aXRoIHRoZSBvcmlnaW5hbCBzaWduLCBhbmQgYW4gb3B0aW9uYWwKKyAgICBkaWFnbm9zdGljIGluZm9ybWF0aW9uLgorICAgICIiIgorICAgIGRlZiBoYW5kbGUoc2VsZiwgY29udGV4dCwgKmFyZ3MpOgorICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShhcmdzWzBdLl9zaWduLCBhcmdzWzBdLl9pbnQsICduJywgVHJ1ZSkKKyAgICAgICAgICAgIHJldHVybiBhbnMuX2ZpeF9uYW4oY29udGV4dCkKKyAgICAgICAgcmV0dXJuIF9OYU4KKworY2xhc3MgQ29udmVyc2lvblN5bnRheChJbnZhbGlkT3BlcmF0aW9uKToKKyAgICAiIiJUcnlpbmcgdG8gY29udmVydCBiYWRseSBmb3JtZWQgc3RyaW5nLgorCisgICAgVGhpcyBvY2N1cnMgYW5kIHNpZ25hbHMgaW52YWxpZC1vcGVyYXRpb24gaWYgYW4gc3RyaW5nIGlzIGJlaW5nCisgICAgY29udmVydGVkIHRvIGEgbnVtYmVyIGFuZCBpdCBkb2VzIG5vdCBjb25mb3JtIHRvIHRoZSBudW1lcmljIHN0cmluZworICAgIHN5bnRheC4gIFRoZSByZXN1bHQgaXMgWzAscU5hTl0uCisgICAgIiIiCisgICAgZGVmIGhhbmRsZShzZWxmLCBjb250ZXh0LCAqYXJncyk6CisgICAgICAgIHJldHVybiBfTmFOCisKK2NsYXNzIERpdmlzaW9uQnlaZXJvKERlY2ltYWxFeGNlcHRpb24sIFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAiIiJEaXZpc2lvbiBieSAwLgorCisgICAgVGhpcyBvY2N1cnMgYW5kIHNpZ25hbHMgZGl2aXNpb24tYnktemVybyBpZiBkaXZpc2lvbiBvZiBhIGZpbml0ZSBudW1iZXIKKyAgICBieSB6ZXJvIHdhcyBhdHRlbXB0ZWQgKGR1cmluZyBhIGRpdmlkZS1pbnRlZ2VyIG9yIGRpdmlkZSBvcGVyYXRpb24sIG9yIGEKKyAgICBwb3dlciBvcGVyYXRpb24gd2l0aCBuZWdhdGl2ZSByaWdodC1oYW5kIG9wZXJhbmQpLCBhbmQgdGhlIGRpdmlkZW5kIHdhcworICAgIG5vdCB6ZXJvLgorCisgICAgVGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIGlzIFtzaWduLGluZl0sIHdoZXJlIHNpZ24gaXMgdGhlIGV4Y2x1c2l2ZQorICAgIG9yIG9mIHRoZSBzaWducyBvZiB0aGUgb3BlcmFuZHMgZm9yIGRpdmlkZSwgb3IgaXMgMSBmb3IgYW4gb2RkIHBvd2VyIG9mCisgICAgLTAsIGZvciBwb3dlci4KKyAgICAiIiIKKworICAgIGRlZiBoYW5kbGUoc2VsZiwgY29udGV4dCwgc2lnbiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gX1NpZ25lZEluZmluaXR5W3NpZ25dCisKK2NsYXNzIERpdmlzaW9uSW1wb3NzaWJsZShJbnZhbGlkT3BlcmF0aW9uKToKKyAgICAiIiJDYW5ub3QgcGVyZm9ybSB0aGUgZGl2aXNpb24gYWRlcXVhdGVseS4KKworICAgIFRoaXMgb2NjdXJzIGFuZCBzaWduYWxzIGludmFsaWQtb3BlcmF0aW9uIGlmIHRoZSBpbnRlZ2VyIHJlc3VsdCBvZiBhCisgICAgZGl2aWRlLWludGVnZXIgb3IgcmVtYWluZGVyIG9wZXJhdGlvbiBoYWQgdG9vIG1hbnkgZGlnaXRzICh3b3VsZCBiZQorICAgIGxvbmdlciB0aGFuIHByZWNpc2lvbikuICBUaGUgcmVzdWx0IGlzIFswLHFOYU5dLgorICAgICIiIgorCisgICAgZGVmIGhhbmRsZShzZWxmLCBjb250ZXh0LCAqYXJncyk6CisgICAgICAgIHJldHVybiBfTmFOCisKK2NsYXNzIERpdmlzaW9uVW5kZWZpbmVkKEludmFsaWRPcGVyYXRpb24sIFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAiIiJVbmRlZmluZWQgcmVzdWx0IG9mIGRpdmlzaW9uLgorCisgICAgVGhpcyBvY2N1cnMgYW5kIHNpZ25hbHMgaW52YWxpZC1vcGVyYXRpb24gaWYgZGl2aXNpb24gYnkgemVybyB3YXMKKyAgICBhdHRlbXB0ZWQgKGR1cmluZyBhIGRpdmlkZS1pbnRlZ2VyLCBkaXZpZGUsIG9yIHJlbWFpbmRlciBvcGVyYXRpb24pLCBhbmQKKyAgICB0aGUgZGl2aWRlbmQgaXMgYWxzbyB6ZXJvLiAgVGhlIHJlc3VsdCBpcyBbMCxxTmFOXS4KKyAgICAiIiIKKworICAgIGRlZiBoYW5kbGUoc2VsZiwgY29udGV4dCwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gX05hTgorCitjbGFzcyBJbmV4YWN0KERlY2ltYWxFeGNlcHRpb24pOgorICAgICIiIkhhZCB0byByb3VuZCwgbG9zaW5nIGluZm9ybWF0aW9uLgorCisgICAgVGhpcyBvY2N1cnMgYW5kIHNpZ25hbHMgaW5leGFjdCB3aGVuZXZlciB0aGUgcmVzdWx0IG9mIGFuIG9wZXJhdGlvbiBpcworICAgIG5vdCBleGFjdCAodGhhdCBpcywgaXQgbmVlZGVkIHRvIGJlIHJvdW5kZWQgYW5kIGFueSBkaXNjYXJkZWQgZGlnaXRzCisgICAgd2VyZSBub24temVybyksIG9yIGlmIGFuIG92ZXJmbG93IG9yIHVuZGVyZmxvdyBjb25kaXRpb24gb2NjdXJzLiAgVGhlCisgICAgcmVzdWx0IGluIGFsbCBjYXNlcyBpcyB1bmNoYW5nZWQuCisKKyAgICBUaGUgaW5leGFjdCBzaWduYWwgbWF5IGJlIHRlc3RlZCAob3IgdHJhcHBlZCkgdG8gZGV0ZXJtaW5lIGlmIGEgZ2l2ZW4KKyAgICBvcGVyYXRpb24gKG9yIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMpIHdhcyBpbmV4YWN0LgorICAgICIiIgorCitjbGFzcyBJbnZhbGlkQ29udGV4dChJbnZhbGlkT3BlcmF0aW9uKToKKyAgICAiIiJJbnZhbGlkIGNvbnRleHQuICBVbmtub3duIHJvdW5kaW5nLCBmb3IgZXhhbXBsZS4KKworICAgIFRoaXMgb2NjdXJzIGFuZCBzaWduYWxzIGludmFsaWQtb3BlcmF0aW9uIGlmIGFuIGludmFsaWQgY29udGV4dCB3YXMKKyAgICBkZXRlY3RlZCBkdXJpbmcgYW4gb3BlcmF0aW9uLiAgVGhpcyBjYW4gb2NjdXIgaWYgY29udGV4dHMgYXJlIG5vdCBjaGVja2VkCisgICAgb24gY3JlYXRpb24gYW5kIGVpdGhlciB0aGUgcHJlY2lzaW9uIGV4Y2VlZHMgdGhlIGNhcGFiaWxpdHkgb2YgdGhlCisgICAgdW5kZXJseWluZyBjb25jcmV0ZSByZXByZXNlbnRhdGlvbiBvciBhbiB1bmtub3duIG9yIHVuc3VwcG9ydGVkIHJvdW5kaW5nCisgICAgd2FzIHNwZWNpZmllZC4gIFRoZXNlIGFzcGVjdHMgb2YgdGhlIGNvbnRleHQgbmVlZCBvbmx5IGJlIGNoZWNrZWQgd2hlbgorICAgIHRoZSB2YWx1ZXMgYXJlIHJlcXVpcmVkIHRvIGJlIHVzZWQuICBUaGUgcmVzdWx0IGlzIFswLHFOYU5dLgorICAgICIiIgorCisgICAgZGVmIGhhbmRsZShzZWxmLCBjb250ZXh0LCAqYXJncyk6CisgICAgICAgIHJldHVybiBfTmFOCisKK2NsYXNzIFJvdW5kZWQoRGVjaW1hbEV4Y2VwdGlvbik6CisgICAgIiIiTnVtYmVyIGdvdCByb3VuZGVkIChub3QgIG5lY2Vzc2FyaWx5IGNoYW5nZWQgZHVyaW5nIHJvdW5kaW5nKS4KKworICAgIFRoaXMgb2NjdXJzIGFuZCBzaWduYWxzIHJvdW5kZWQgd2hlbmV2ZXIgdGhlIHJlc3VsdCBvZiBhbiBvcGVyYXRpb24gaXMKKyAgICByb3VuZGVkICh0aGF0IGlzLCBzb21lIHplcm8gb3Igbm9uLXplcm8gZGlnaXRzIHdlcmUgZGlzY2FyZGVkIGZyb20gdGhlCisgICAgY29lZmZpY2llbnQpLCBvciBpZiBhbiBvdmVyZmxvdyBvciB1bmRlcmZsb3cgY29uZGl0aW9uIG9jY3Vycy4gIFRoZQorICAgIHJlc3VsdCBpbiBhbGwgY2FzZXMgaXMgdW5jaGFuZ2VkLgorCisgICAgVGhlIHJvdW5kZWQgc2lnbmFsIG1heSBiZSB0ZXN0ZWQgKG9yIHRyYXBwZWQpIHRvIGRldGVybWluZSBpZiBhIGdpdmVuCisgICAgb3BlcmF0aW9uIChvciBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zKSBjYXVzZWQgYSBsb3NzIG9mIHByZWNpc2lvbi4KKyAgICAiIiIKKworY2xhc3MgU3Vibm9ybWFsKERlY2ltYWxFeGNlcHRpb24pOgorICAgICIiIkV4cG9uZW50IDwgRW1pbiBiZWZvcmUgcm91bmRpbmcuCisKKyAgICBUaGlzIG9jY3VycyBhbmQgc2lnbmFscyBzdWJub3JtYWwgd2hlbmV2ZXIgdGhlIHJlc3VsdCBvZiBhIGNvbnZlcnNpb24gb3IKKyAgICBvcGVyYXRpb24gaXMgc3Vibm9ybWFsICh0aGF0IGlzLCBpdHMgYWRqdXN0ZWQgZXhwb25lbnQgaXMgbGVzcyB0aGFuCisgICAgRW1pbiwgYmVmb3JlIGFueSByb3VuZGluZykuICBUaGUgcmVzdWx0IGluIGFsbCBjYXNlcyBpcyB1bmNoYW5nZWQuCisKKyAgICBUaGUgc3Vibm9ybWFsIHNpZ25hbCBtYXkgYmUgdGVzdGVkIChvciB0cmFwcGVkKSB0byBkZXRlcm1pbmUgaWYgYSBnaXZlbgorICAgIG9yIG9wZXJhdGlvbiAob3Igc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucykgeWllbGRlZCBhIHN1Ym5vcm1hbCByZXN1bHQuCisgICAgIiIiCisKK2NsYXNzIE92ZXJmbG93KEluZXhhY3QsIFJvdW5kZWQpOgorICAgICIiIk51bWVyaWNhbCBvdmVyZmxvdy4KKworICAgIFRoaXMgb2NjdXJzIGFuZCBzaWduYWxzIG92ZXJmbG93IGlmIHRoZSBhZGp1c3RlZCBleHBvbmVudCBvZiBhIHJlc3VsdAorICAgIChmcm9tIGEgY29udmVyc2lvbiBvciBmcm9tIGFuIG9wZXJhdGlvbiB0aGF0IGlzIG5vdCBhbiBhdHRlbXB0IHRvIGRpdmlkZQorICAgIGJ5IHplcm8pLCBhZnRlciByb3VuZGluZywgd291bGQgYmUgZ3JlYXRlciB0aGFuIHRoZSBsYXJnZXN0IHZhbHVlIHRoYXQKKyAgICBjYW4gYmUgaGFuZGxlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gKHRoZSB2YWx1ZSBFbWF4KS4KKworICAgIFRoZSByZXN1bHQgZGVwZW5kcyBvbiB0aGUgcm91bmRpbmcgbW9kZToKKworICAgIEZvciByb3VuZC1oYWxmLXVwIGFuZCByb3VuZC1oYWxmLWV2ZW4gKGFuZCBmb3Igcm91bmQtaGFsZi1kb3duIGFuZAorICAgIHJvdW5kLXVwLCBpZiBpbXBsZW1lbnRlZCksIHRoZSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiBpcyBbc2lnbixpbmZdLAorICAgIHdoZXJlIHNpZ24gaXMgdGhlIHNpZ24gb2YgdGhlIGludGVybWVkaWF0ZSByZXN1bHQuICBGb3Igcm91bmQtZG93biwgdGhlCisgICAgcmVzdWx0IGlzIHRoZSBsYXJnZXN0IGZpbml0ZSBudW1iZXIgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gdGhlCisgICAgY3VycmVudCBwcmVjaXNpb24sIHdpdGggdGhlIHNpZ24gb2YgdGhlIGludGVybWVkaWF0ZSByZXN1bHQuICBGb3IKKyAgICByb3VuZC1jZWlsaW5nLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIGZvciByb3VuZC1kb3duIGlmIHRoZSBzaWduIG9mCisgICAgdGhlIGludGVybWVkaWF0ZSByZXN1bHQgaXMgMSwgb3IgaXMgWzAsaW5mXSBvdGhlcndpc2UuICBGb3Igcm91bmQtZmxvb3IsCisgICAgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyBmb3Igcm91bmQtZG93biBpZiB0aGUgc2lnbiBvZiB0aGUgaW50ZXJtZWRpYXRlCisgICAgcmVzdWx0IGlzIDAsIG9yIGlzIFsxLGluZl0gb3RoZXJ3aXNlLiAgSW4gYWxsIGNhc2VzLCBJbmV4YWN0IGFuZCBSb3VuZGVkCisgICAgd2lsbCBhbHNvIGJlIHJhaXNlZC4KKyAgICAiIiIKKworICAgIGRlZiBoYW5kbGUoc2VsZiwgY29udGV4dCwgc2lnbiwgKmFyZ3MpOgorICAgICAgICBpZiBjb250ZXh0LnJvdW5kaW5nIGluIChST1VORF9IQUxGX1VQLCBST1VORF9IQUxGX0VWRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPVU5EX0hBTEZfRE9XTiwgUk9VTkRfVVApOgorICAgICAgICAgICAgcmV0dXJuIF9TaWduZWRJbmZpbml0eVtzaWduXQorICAgICAgICBpZiBzaWduID09IDA6CisgICAgICAgICAgICBpZiBjb250ZXh0LnJvdW5kaW5nID09IFJPVU5EX0NFSUxJTkc6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9TaWduZWRJbmZpbml0eVtzaWduXQorICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoc2lnbiwgJzknKmNvbnRleHQucHJlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkVtYXgtY29udGV4dC5wcmVjKzEpCisgICAgICAgIGlmIHNpZ24gPT0gMToKKyAgICAgICAgICAgIGlmIGNvbnRleHQucm91bmRpbmcgPT0gUk9VTkRfRkxPT1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9TaWduZWRJbmZpbml0eVtzaWduXQorICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoc2lnbiwgJzknKmNvbnRleHQucHJlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5FbWF4LWNvbnRleHQucHJlYysxKQorCisKK2NsYXNzIFVuZGVyZmxvdyhJbmV4YWN0LCBSb3VuZGVkLCBTdWJub3JtYWwpOgorICAgICIiIk51bWVyaWNhbCB1bmRlcmZsb3cgd2l0aCByZXN1bHQgcm91bmRlZCB0byAwLgorCisgICAgVGhpcyBvY2N1cnMgYW5kIHNpZ25hbHMgdW5kZXJmbG93IGlmIGEgcmVzdWx0IGlzIGluZXhhY3QgYW5kIHRoZQorICAgIGFkanVzdGVkIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgd291bGQgYmUgc21hbGxlciAobW9yZSBuZWdhdGl2ZSkgdGhhbgorICAgIHRoZSBzbWFsbGVzdCB2YWx1ZSB0aGF0IGNhbiBiZSBoYW5kbGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiAodGhlIHZhbHVlCisgICAgRW1pbikuICBUaGF0IGlzLCB0aGUgcmVzdWx0IGlzIGJvdGggaW5leGFjdCBhbmQgc3Vibm9ybWFsLgorCisgICAgVGhlIHJlc3VsdCBhZnRlciBhbiB1bmRlcmZsb3cgd2lsbCBiZSBhIHN1Ym5vcm1hbCBudW1iZXIgcm91bmRlZCwgaWYKKyAgICBuZWNlc3NhcnksIHNvIHRoYXQgaXRzIGV4cG9uZW50IGlzIG5vdCBsZXNzIHRoYW4gRXRpbnkuICBUaGlzIG1heSByZXN1bHQKKyAgICBpbiAwIHdpdGggdGhlIHNpZ24gb2YgdGhlIGludGVybWVkaWF0ZSByZXN1bHQgYW5kIGFuIGV4cG9uZW50IG9mIEV0aW55LgorCisgICAgSW4gYWxsIGNhc2VzLCBJbmV4YWN0LCBSb3VuZGVkLCBhbmQgU3Vibm9ybWFsIHdpbGwgYWxzbyBiZSByYWlzZWQuCisgICAgIiIiCisKKyMgTGlzdCBvZiBwdWJsaWMgdHJhcHMgYW5kIGZsYWdzCitfc2lnbmFscyA9IFtDbGFtcGVkLCBEaXZpc2lvbkJ5WmVybywgSW5leGFjdCwgT3ZlcmZsb3csIFJvdW5kZWQsCisgICAgICAgICAgIFVuZGVyZmxvdywgSW52YWxpZE9wZXJhdGlvbiwgU3Vibm9ybWFsXQorCisjIE1hcCBjb25kaXRpb25zIChwZXIgdGhlIHNwZWMpIHRvIHNpZ25hbHMKK19jb25kaXRpb25fbWFwID0ge0NvbnZlcnNpb25TeW50YXg6SW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgIERpdmlzaW9uSW1wb3NzaWJsZTpJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgRGl2aXNpb25VbmRlZmluZWQ6SW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgIEludmFsaWRDb250ZXh0OkludmFsaWRPcGVyYXRpb259CisKKyMjIyMjIENvbnRleHQgRnVuY3Rpb25zICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlIGdldGNvbnRleHQoKSBhbmQgc2V0Y29udGV4dCgpIGZ1bmN0aW9uIG1hbmFnZSBhY2Nlc3MgdG8gYSB0aHJlYWQtbG9jYWwKKyMgY3VycmVudCBjb250ZXh0LiAgUHkyLjQgb2ZmZXJzIGRpcmVjdCBzdXBwb3J0IGZvciB0aHJlYWQgbG9jYWxzLiAgSWYgdGhhdAorIyBpcyBub3QgYXZhaWxhYmxlLCB1c2UgdGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQoKSB3aGljaCBpcyBzbG93ZXIgYnV0IHdpbGwKKyMgd29yayBmb3Igb2xkZXIgUHl0aG9ucy4gIElmIHRocmVhZHMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBidWlsZCwgY3JlYXRlIGEKKyMgbW9jayB0aHJlYWRpbmcgb2JqZWN0IHdpdGggdGhyZWFkaW5nLmxvY2FsKCkgcmV0dXJuaW5nIHRoZSBtb2R1bGUgbmFtZXNwYWNlLgorCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgUHl0aG9uIHdhcyBjb21waWxlZCB3aXRob3V0IHRocmVhZHM7IGNyZWF0ZSBhIG1vY2sgb2JqZWN0IGluc3RlYWQKKyAgICBpbXBvcnQgc3lzCisgICAgY2xhc3MgTW9ja1RocmVhZGluZyhvYmplY3QpOgorICAgICAgICBkZWYgbG9jYWwoc2VsZiwgc3lzPXN5cyk6CisgICAgICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbX19uYW1lX19dCisgICAgdGhyZWFkaW5nID0gTW9ja1RocmVhZGluZygpCisgICAgZGVsIHN5cywgTW9ja1RocmVhZGluZworCit0cnk6CisgICAgdGhyZWFkaW5nLmxvY2FsCisKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKworICAgICMgVG8gZml4IHJlbG9hZGluZywgZm9yY2UgaXQgdG8gY3JlYXRlIGEgbmV3IGNvbnRleHQKKyAgICAjIE9sZCBjb250ZXh0cyBoYXZlIGRpZmZlcmVudCBleGNlcHRpb25zIGluIHRoZWlyIGRpY3RzLCBtYWtpbmcgcHJvYmxlbXMuCisgICAgaWYgaGFzYXR0cih0aHJlYWRpbmcuY3VycmVudFRocmVhZCgpLCAnX19kZWNpbWFsX2NvbnRleHRfXycpOgorICAgICAgICBkZWwgdGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQoKS5fX2RlY2ltYWxfY29udGV4dF9fCisKKyAgICBkZWYgc2V0Y29udGV4dChjb250ZXh0KToKKyAgICAgICAgIiIiU2V0IHRoaXMgdGhyZWFkJ3MgY29udGV4dCB0byBjb250ZXh0LiIiIgorICAgICAgICBpZiBjb250ZXh0IGluIChEZWZhdWx0Q29udGV4dCwgQmFzaWNDb250ZXh0LCBFeHRlbmRlZENvbnRleHQpOgorICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQuY29weSgpCisgICAgICAgICAgICBjb250ZXh0LmNsZWFyX2ZsYWdzKCkKKyAgICAgICAgdGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQoKS5fX2RlY2ltYWxfY29udGV4dF9fID0gY29udGV4dAorCisgICAgZGVmIGdldGNvbnRleHQoKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGlzIHRocmVhZCdzIGNvbnRleHQuCisKKyAgICAgICAgSWYgdGhpcyB0aHJlYWQgZG9lcyBub3QgeWV0IGhhdmUgYSBjb250ZXh0LCByZXR1cm5zCisgICAgICAgIGEgbmV3IGNvbnRleHQgYW5kIHNldHMgdGhpcyB0aHJlYWQncyBjb250ZXh0LgorICAgICAgICBOZXcgY29udGV4dHMgYXJlIGNvcGllcyBvZiBEZWZhdWx0Q29udGV4dC4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiB0aHJlYWRpbmcuY3VycmVudFRocmVhZCgpLl9fZGVjaW1hbF9jb250ZXh0X18KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgY29udGV4dCA9IENvbnRleHQoKQorICAgICAgICAgICAgdGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQoKS5fX2RlY2ltYWxfY29udGV4dF9fID0gY29udGV4dAorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQKKworZWxzZToKKworICAgIGxvY2FsID0gdGhyZWFkaW5nLmxvY2FsKCkKKyAgICBpZiBoYXNhdHRyKGxvY2FsLCAnX19kZWNpbWFsX2NvbnRleHRfXycpOgorICAgICAgICBkZWwgbG9jYWwuX19kZWNpbWFsX2NvbnRleHRfXworCisgICAgZGVmIGdldGNvbnRleHQoX2xvY2FsPWxvY2FsKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGlzIHRocmVhZCdzIGNvbnRleHQuCisKKyAgICAgICAgSWYgdGhpcyB0aHJlYWQgZG9lcyBub3QgeWV0IGhhdmUgYSBjb250ZXh0LCByZXR1cm5zCisgICAgICAgIGEgbmV3IGNvbnRleHQgYW5kIHNldHMgdGhpcyB0aHJlYWQncyBjb250ZXh0LgorICAgICAgICBOZXcgY29udGV4dHMgYXJlIGNvcGllcyBvZiBEZWZhdWx0Q29udGV4dC4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBfbG9jYWwuX19kZWNpbWFsX2NvbnRleHRfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBjb250ZXh0ID0gQ29udGV4dCgpCisgICAgICAgICAgICBfbG9jYWwuX19kZWNpbWFsX2NvbnRleHRfXyA9IGNvbnRleHQKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0CisKKyAgICBkZWYgc2V0Y29udGV4dChjb250ZXh0LCBfbG9jYWw9bG9jYWwpOgorICAgICAgICAiIiJTZXQgdGhpcyB0aHJlYWQncyBjb250ZXh0IHRvIGNvbnRleHQuIiIiCisgICAgICAgIGlmIGNvbnRleHQgaW4gKERlZmF1bHRDb250ZXh0LCBCYXNpY0NvbnRleHQsIEV4dGVuZGVkQ29udGV4dCk6CisgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5jb3B5KCkKKyAgICAgICAgICAgIGNvbnRleHQuY2xlYXJfZmxhZ3MoKQorICAgICAgICBfbG9jYWwuX19kZWNpbWFsX2NvbnRleHRfXyA9IGNvbnRleHQKKworICAgIGRlbCB0aHJlYWRpbmcsIGxvY2FsICAgICAgICAjIERvbid0IGNvbnRhbWluYXRlIHRoZSBuYW1lc3BhY2UKKworZGVmIGxvY2FsY29udGV4dChjdHg9Tm9uZSk6CisgICAgIiIiUmV0dXJuIGEgY29udGV4dCBtYW5hZ2VyIGZvciBhIGNvcHkgb2YgdGhlIHN1cHBsaWVkIGNvbnRleHQKKworICAgIFVzZXMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGNvbnRleHQgaWYgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQKKyAgICBUaGUgcmV0dXJuZWQgY29udGV4dCBtYW5hZ2VyIGNyZWF0ZXMgYSBsb2NhbCBkZWNpbWFsIGNvbnRleHQKKyAgICBpbiBhIHdpdGggc3RhdGVtZW50OgorICAgICAgICBkZWYgc2luKHgpOgorICAgICAgICAgICAgIHdpdGggbG9jYWxjb250ZXh0KCkgYXMgY3R4OgorICAgICAgICAgICAgICAgICBjdHgucHJlYyArPSAyCisgICAgICAgICAgICAgICAgICMgUmVzdCBvZiBzaW4gY2FsY3VsYXRpb24gYWxnb3JpdGhtCisgICAgICAgICAgICAgICAgICMgdXNlcyBhIHByZWNpc2lvbiAyIGdyZWF0ZXIgdGhhbiBub3JtYWwKKyAgICAgICAgICAgICByZXR1cm4gK3MgICMgQ29udmVydCByZXN1bHQgdG8gbm9ybWFsIHByZWNpc2lvbgorCisgICAgICAgICBkZWYgc2luKHgpOgorICAgICAgICAgICAgIHdpdGggbG9jYWxjb250ZXh0KEV4dGVuZGVkQ29udGV4dCk6CisgICAgICAgICAgICAgICAgICMgUmVzdCBvZiBzaW4gY2FsY3VsYXRpb24gYWxnb3JpdGhtCisgICAgICAgICAgICAgICAgICMgdXNlcyB0aGUgRXh0ZW5kZWQgQ29udGV4dCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAjIEdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFNwZWNpZmljYXRpb24KKyAgICAgICAgICAgICByZXR1cm4gK3MgICMgQ29udmVydCByZXN1bHQgdG8gbm9ybWFsIGNvbnRleHQKKworICAgID4+PiBzZXRjb250ZXh0KERlZmF1bHRDb250ZXh0KQorICAgID4+PiBwcmludCBnZXRjb250ZXh0KCkucHJlYworICAgIDI4CisgICAgPj4+IHdpdGggbG9jYWxjb250ZXh0KCk6CisgICAgLi4uICAgICBjdHggPSBnZXRjb250ZXh0KCkKKyAgICAuLi4gICAgIGN0eC5wcmVjICs9IDIKKyAgICAuLi4gICAgIHByaW50IGN0eC5wcmVjCisgICAgLi4uCisgICAgMzAKKyAgICA+Pj4gd2l0aCBsb2NhbGNvbnRleHQoRXh0ZW5kZWRDb250ZXh0KToKKyAgICAuLi4gICAgIHByaW50IGdldGNvbnRleHQoKS5wcmVjCisgICAgLi4uCisgICAgOQorICAgID4+PiBwcmludCBnZXRjb250ZXh0KCkucHJlYworICAgIDI4CisgICAgIiIiCisgICAgaWYgY3R4IGlzIE5vbmU6IGN0eCA9IGdldGNvbnRleHQoKQorICAgIHJldHVybiBfQ29udGV4dE1hbmFnZXIoY3R4KQorCisKKyMjIyMjIERlY2ltYWwgY2xhc3MgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBEZWNpbWFsKG9iamVjdCk6CisgICAgIiIiRmxvYXRpbmcgcG9pbnQgY2xhc3MgZm9yIGRlY2ltYWwgYXJpdGhtZXRpYy4iIiIKKworICAgIF9fc2xvdHNfXyA9ICgnX2V4cCcsJ19pbnQnLCdfc2lnbicsICdfaXNfc3BlY2lhbCcpCisgICAgIyBHZW5lcmFsbHksIHRoZSB2YWx1ZSBvZiB0aGUgRGVjaW1hbCBpbnN0YW5jZSBpcyBnaXZlbiBieQorICAgICMgICgtMSkqKl9zaWduICogX2ludCAqIDEwKipfZXhwCisgICAgIyBTcGVjaWFsIHZhbHVlcyBhcmUgc2lnbmlmaWVkIGJ5IF9pc19zcGVjaWFsID09IFRydWUKKworICAgICMgV2UncmUgaW1tdXRhYmxlLCBzbyB1c2UgX19uZXdfXyBub3QgX19pbml0X18KKyAgICBkZWYgX19uZXdfXyhjbHMsIHZhbHVlPSIwIiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgZGVjaW1hbCBwb2ludCBpbnN0YW5jZS4KKworICAgICAgICA+Pj4gRGVjaW1hbCgnMy4xNCcpICAgICAgICAgICAgICAjIHN0cmluZyBpbnB1dAorICAgICAgICBEZWNpbWFsKCczLjE0JykKKyAgICAgICAgPj4+IERlY2ltYWwoKDAsICgzLCAxLCA0KSwgLTIpKSAgIyB0dXBsZSAoc2lnbiwgZGlnaXRfdHVwbGUsIGV4cG9uZW50KQorICAgICAgICBEZWNpbWFsKCczLjE0JykKKyAgICAgICAgPj4+IERlY2ltYWwoMzE0KSAgICAgICAgICAgICAgICAgIyBpbnQgb3IgbG9uZworICAgICAgICBEZWNpbWFsKCczMTQnKQorICAgICAgICA+Pj4gRGVjaW1hbChEZWNpbWFsKDMxNCkpICAgICAgICAjIGFub3RoZXIgZGVjaW1hbCBpbnN0YW5jZQorICAgICAgICBEZWNpbWFsKCczMTQnKQorICAgICAgICA+Pj4gRGVjaW1hbCgnICAzLjE0ICBcXG4nKSAgICAgICAgIyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIG9rYXkKKyAgICAgICAgRGVjaW1hbCgnMy4xNCcpCisgICAgICAgICIiIgorCisgICAgICAgICMgTm90ZSB0aGF0IHRoZSBjb2VmZmljaWVudCwgc2VsZi5faW50LCBpcyBhY3R1YWxseSBzdG9yZWQgYXMKKyAgICAgICAgIyBhIHN0cmluZyByYXRoZXIgdGhhbiBhcyBhIHR1cGxlIG9mIGRpZ2l0cy4gIFRoaXMgc3BlZWRzIHVwCisgICAgICAgICMgdGhlICJkaWdpdHMgdG8gaW50ZWdlciIgYW5kICJpbnRlZ2VyIHRvIGRpZ2l0cyIgY29udmVyc2lvbnMKKyAgICAgICAgIyB0aGF0IGFyZSB1c2VkIGluIGFsbW9zdCBldmVyeSBhcml0aG1ldGljIG9wZXJhdGlvbiBvbgorICAgICAgICAjIERlY2ltYWxzLiAgVGhpcyBpcyBhbiBpbnRlcm5hbCBkZXRhaWw6IHRoZSBhc190dXBsZSBmdW5jdGlvbgorICAgICAgICAjIGFuZCB0aGUgRGVjaW1hbCBjb25zdHJ1Y3RvciBzdGlsbCBkZWFsIHdpdGggdHVwbGVzIG9mCisgICAgICAgICMgZGlnaXRzLgorCisgICAgICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhjbHMpCisKKyAgICAgICAgIyBGcm9tIGEgc3RyaW5nCisgICAgICAgICMgUkVzIGluc2lzdCBvbiByZWFsIHN0cmluZ3MsIHNvIHdlIGNhbiB0b28uCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgbSA9IF9wYXJzZXIodmFsdWUuc3RyaXAoKSkKKyAgICAgICAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoQ29udmVyc2lvblN5bnRheCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbGl0ZXJhbCBmb3IgRGVjaW1hbDogJXIiICUgdmFsdWUpCisKKyAgICAgICAgICAgIGlmIG0uZ3JvdXAoJ3NpZ24nKSA9PSAiLSI6CisgICAgICAgICAgICAgICAgc2VsZi5fc2lnbiA9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fc2lnbiA9IDAKKyAgICAgICAgICAgIGludHBhcnQgPSBtLmdyb3VwKCdpbnQnKQorICAgICAgICAgICAgaWYgaW50cGFydCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIGZpbml0ZSBudW1iZXIKKyAgICAgICAgICAgICAgICBmcmFjcGFydCA9IG0uZ3JvdXAoJ2ZyYWMnKSBvciAnJworICAgICAgICAgICAgICAgIGV4cCA9IGludChtLmdyb3VwKCdleHAnKSBvciAnMCcpCisgICAgICAgICAgICAgICAgc2VsZi5faW50ID0gc3RyKGludChpbnRwYXJ0K2ZyYWNwYXJ0KSkKKyAgICAgICAgICAgICAgICBzZWxmLl9leHAgPSBleHAgLSBsZW4oZnJhY3BhcnQpCisgICAgICAgICAgICAgICAgc2VsZi5faXNfc3BlY2lhbCA9IEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRpYWcgPSBtLmdyb3VwKCdkaWFnJykKKyAgICAgICAgICAgICAgICBpZiBkaWFnIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAjIE5hTgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnQgPSBzdHIoaW50KGRpYWcgb3IgJzAnKSkubHN0cmlwKCcwJykKKyAgICAgICAgICAgICAgICAgICAgaWYgbS5ncm91cCgnc2lnbmFsJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9leHAgPSAnTicKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2V4cCA9ICduJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgaW5maW5pdHkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faW50ID0gJzAnCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2V4cCA9ICdGJworICAgICAgICAgICAgICAgIHNlbGYuX2lzX3NwZWNpYWwgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICMgRnJvbSBhbiBpbnRlZ2VyCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChpbnQsbG9uZykpOgorICAgICAgICAgICAgaWYgdmFsdWUgPj0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLl9zaWduID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9zaWduID0gMQorICAgICAgICAgICAgc2VsZi5fZXhwID0gMAorICAgICAgICAgICAgc2VsZi5faW50ID0gc3RyKGFicyh2YWx1ZSkpCisgICAgICAgICAgICBzZWxmLl9pc19zcGVjaWFsID0gRmFsc2UKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgIyBGcm9tIGFub3RoZXIgZGVjaW1hbAorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBEZWNpbWFsKToKKyAgICAgICAgICAgIHNlbGYuX2V4cCAgPSB2YWx1ZS5fZXhwCisgICAgICAgICAgICBzZWxmLl9zaWduID0gdmFsdWUuX3NpZ24KKyAgICAgICAgICAgIHNlbGYuX2ludCAgPSB2YWx1ZS5faW50CisgICAgICAgICAgICBzZWxmLl9pc19zcGVjaWFsICA9IHZhbHVlLl9pc19zcGVjaWFsCisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICMgRnJvbSBhbiBpbnRlcm5hbCB3b3JraW5nIHZhbHVlCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIF9Xb3JrUmVwKToKKyAgICAgICAgICAgIHNlbGYuX3NpZ24gPSB2YWx1ZS5zaWduCisgICAgICAgICAgICBzZWxmLl9pbnQgPSBzdHIodmFsdWUuaW50KQorICAgICAgICAgICAgc2VsZi5fZXhwID0gaW50KHZhbHVlLmV4cCkKKyAgICAgICAgICAgIHNlbGYuX2lzX3NwZWNpYWwgPSBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAjIHR1cGxlL2xpc3QgY29udmVyc2lvbiAocG9zc2libHkgZnJvbSBhc190dXBsZSgpKQorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAobGlzdCx0dXBsZSkpOgorICAgICAgICAgICAgaWYgbGVuKHZhbHVlKSAhPSAzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ludmFsaWQgdHVwbGUgc2l6ZSBpbiBjcmVhdGlvbiBvZiBEZWNpbWFsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tIGxpc3Qgb3IgdHVwbGUuICBUaGUgbGlzdCBvciB0dXBsZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hvdWxkIGhhdmUgZXhhY3RseSB0aHJlZSBlbGVtZW50cy4nKQorICAgICAgICAgICAgIyBwcm9jZXNzIHNpZ24uICBUaGUgaXNpbnN0YW5jZSB0ZXN0IHJlamVjdHMgZmxvYXRzCisgICAgICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2UodmFsdWVbMF0sIChpbnQsIGxvbmcpKSBhbmQgdmFsdWVbMF0gaW4gKDAsMSkpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgc2lnbi4gIFRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgdHVwbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZCBiZSBhbiBpbnRlZ2VyOyBlaXRoZXIgMCBmb3IgYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9zaXRpdmUgbnVtYmVyIG9yIDEgZm9yIGEgbmVnYXRpdmUgbnVtYmVyLiIpCisgICAgICAgICAgICBzZWxmLl9zaWduID0gdmFsdWVbMF0KKyAgICAgICAgICAgIGlmIHZhbHVlWzJdID09ICdGJzoKKyAgICAgICAgICAgICAgICAjIGluZmluaXR5OiB2YWx1ZVsxXSBpcyBpZ25vcmVkCisgICAgICAgICAgICAgICAgc2VsZi5faW50ID0gJzAnCisgICAgICAgICAgICAgICAgc2VsZi5fZXhwID0gdmFsdWVbMl0KKyAgICAgICAgICAgICAgICBzZWxmLl9pc19zcGVjaWFsID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHByb2Nlc3MgYW5kIHZhbGlkYXRlIHRoZSBkaWdpdHMgaW4gdmFsdWVbMV0KKyAgICAgICAgICAgICAgICBkaWdpdHMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBkaWdpdCBpbiB2YWx1ZVsxXToKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkaWdpdCwgKGludCwgbG9uZykpIGFuZCAwIDw9IGRpZ2l0IDw9IDk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHNraXAgbGVhZGluZyB6ZXJvcworICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGlnaXRzIG9yIGRpZ2l0ICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzLmFwcGVuZChkaWdpdCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRoZSBzZWNvbmQgdmFsdWUgaW4gdGhlIHR1cGxlIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmUgY29tcG9zZWQgb2YgaW50ZWdlcnMgaW4gdGhlIHJhbmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAgdGhyb3VnaCA5LiIpCisgICAgICAgICAgICAgICAgaWYgdmFsdWVbMl0gaW4gKCduJywgJ04nKToKKyAgICAgICAgICAgICAgICAgICAgIyBOYU46IGRpZ2l0cyBmb3JtIHRoZSBkaWFnbm9zdGljCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ludCA9ICcnLmpvaW4obWFwKHN0ciwgZGlnaXRzKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXhwID0gdmFsdWVbMl0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faXNfc3BlY2lhbCA9IFRydWUKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWVbMl0sIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgICAgICAgICAgIyBmaW5pdGUgbnVtYmVyOiBkaWdpdHMgZ2l2ZSB0aGUgY29lZmZpY2llbnQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faW50ID0gJycuam9pbihtYXAoc3RyLCBkaWdpdHMgb3IgWzBdKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXhwID0gdmFsdWVbMl0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faXNfc3BlY2lhbCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGhlIHRoaXJkIHZhbHVlIGluIHRoZSB0dXBsZSBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmUgYW4gaW50ZWdlciwgb3Igb25lIG9mIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZ3MgJ0YnLCAnbicsICdOJy4iKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBmbG9hdCk6CisgICAgICAgICAgICB2YWx1ZSA9IERlY2ltYWwuZnJvbV9mbG9hdCh2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuX2V4cCAgPSB2YWx1ZS5fZXhwCisgICAgICAgICAgICBzZWxmLl9zaWduID0gdmFsdWUuX3NpZ24KKyAgICAgICAgICAgIHNlbGYuX2ludCAgPSB2YWx1ZS5faW50CisgICAgICAgICAgICBzZWxmLl9pc19zcGVjaWFsICA9IHZhbHVlLl9pc19zcGVjaWFsCisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgJXIgdG8gRGVjaW1hbCIgJSB2YWx1ZSkKKworICAgICMgQGNsYXNzbWV0aG9kLCBidXQgQGRlY29yYXRvciBpcyBub3QgdmFsaWQgUHl0aG9uIDIuMyBzeW50YXgsIHNvCisgICAgIyBkb24ndCB1c2UgaXQgKHNlZSBub3RlcyBvbiBQeTIuMyBjb21wYXRpYmlsaXR5IGF0IHRvcCBvZiBmaWxlKQorICAgIGRlZiBmcm9tX2Zsb2F0KGNscywgZik6CisgICAgICAgICIiIkNvbnZlcnRzIGEgZmxvYXQgdG8gYSBkZWNpbWFsIG51bWJlciwgZXhhY3RseS4KKworICAgICAgICBOb3RlIHRoYXQgRGVjaW1hbC5mcm9tX2Zsb2F0KDAuMSkgaXMgbm90IHRoZSBzYW1lIGFzIERlY2ltYWwoJzAuMScpLgorICAgICAgICBTaW5jZSAwLjEgaXMgbm90IGV4YWN0bHkgcmVwcmVzZW50YWJsZSBpbiBiaW5hcnkgZmxvYXRpbmcgcG9pbnQsIHRoZQorICAgICAgICB2YWx1ZSBpcyBzdG9yZWQgYXMgdGhlIG5lYXJlc3QgcmVwcmVzZW50YWJsZSB2YWx1ZSB3aGljaCBpcworICAgICAgICAweDEuOTk5OTk5OTk5OTk5YXAtNC4gIFRoZSBleGFjdCBlcXVpdmFsZW50IG9mIHRoZSB2YWx1ZSBpbiBkZWNpbWFsCisgICAgICAgIGlzIDAuMTAwMDAwMDAwMDAwMDAwMDA1NTUxMTE1MTIzMTI1NzgyNzAyMTE4MTU4MzQwNDU0MTAxNTYyNS4KKworICAgICAgICA+Pj4gRGVjaW1hbC5mcm9tX2Zsb2F0KDAuMSkKKyAgICAgICAgRGVjaW1hbCgnMC4xMDAwMDAwMDAwMDAwMDAwMDU1NTExMTUxMjMxMjU3ODI3MDIxMTgxNTgzNDA0NTQxMDE1NjI1JykKKyAgICAgICAgPj4+IERlY2ltYWwuZnJvbV9mbG9hdChmbG9hdCgnbmFuJykpCisgICAgICAgIERlY2ltYWwoJ05hTicpCisgICAgICAgID4+PiBEZWNpbWFsLmZyb21fZmxvYXQoZmxvYXQoJ2luZicpKQorICAgICAgICBEZWNpbWFsKCdJbmZpbml0eScpCisgICAgICAgID4+PiBEZWNpbWFsLmZyb21fZmxvYXQoLWZsb2F0KCdpbmYnKSkKKyAgICAgICAgRGVjaW1hbCgnLUluZmluaXR5JykKKyAgICAgICAgPj4+IERlY2ltYWwuZnJvbV9mbG9hdCgtMC4wKQorICAgICAgICBEZWNpbWFsKCctMCcpCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZiwgKGludCwgbG9uZykpOiAgICAgICAgIyBoYW5kbGUgaW50ZWdlciBpbnB1dHMKKyAgICAgICAgICAgIHJldHVybiBjbHMoZikKKyAgICAgICAgaWYgX21hdGguaXNpbmYoZikgb3IgX21hdGguaXNuYW4oZik6ICAjIHJhaXNlcyBUeXBlRXJyb3IgaWYgbm90IGEgZmxvYXQKKyAgICAgICAgICAgIHJldHVybiBjbHMocmVwcihmKSkKKyAgICAgICAgaWYgX21hdGguY29weXNpZ24oMS4wLCBmKSA9PSAxLjA6CisgICAgICAgICAgICBzaWduID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2lnbiA9IDEKKyAgICAgICAgbiwgZCA9IGFicyhmKS5hc19pbnRlZ2VyX3JhdGlvKCkKKyAgICAgICAgayA9IGQuYml0X2xlbmd0aCgpIC0gMQorICAgICAgICByZXN1bHQgPSBfZGVjX2Zyb21fdHJpcGxlKHNpZ24sIHN0cihuKjUqKmspLCAtaykKKyAgICAgICAgaWYgY2xzIGlzIERlY2ltYWw6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY2xzKHJlc3VsdCkKKyAgICBmcm9tX2Zsb2F0ID0gY2xhc3NtZXRob2QoZnJvbV9mbG9hdCkKKworICAgIGRlZiBfaXNuYW4oc2VsZik6CisgICAgICAgICIiIlJldHVybnMgd2hldGhlciB0aGUgbnVtYmVyIGlzIG5vdCBhY3R1YWxseSBvbmUuCisKKyAgICAgICAgMCBpZiBhIG51bWJlcgorICAgICAgICAxIGlmIE5hTgorICAgICAgICAyIGlmIHNOYU4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBleHAgPSBzZWxmLl9leHAKKyAgICAgICAgICAgIGlmIGV4cCA9PSAnbic6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIGVsaWYgZXhwID09ICdOJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gMgorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIF9pc2luZmluaXR5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHdoZXRoZXIgdGhlIG51bWJlciBpcyBpbmZpbml0ZQorCisgICAgICAgIDAgaWYgZmluaXRlIG9yIG5vdCBhIG51bWJlcgorICAgICAgICAxIGlmICtJTkYKKyAgICAgICAgLTEgaWYgLUlORgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fZXhwID09ICdGJzoKKyAgICAgICAgICAgIGlmIHNlbGYuX3NpZ246CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIF9jaGVja19uYW5zKHNlbGYsIG90aGVyPU5vbmUsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybnMgd2hldGhlciB0aGUgbnVtYmVyIGlzIG5vdCBhY3R1YWxseSBvbmUuCisKKyAgICAgICAgaWYgc2VsZiwgb3RoZXIgYXJlIHNOYU4sIHNpZ25hbAorICAgICAgICBpZiBzZWxmLCBvdGhlciBhcmUgTmFOIHJldHVybiBuYW4KKyAgICAgICAgcmV0dXJuIDAKKworICAgICAgICBEb25lIGJlZm9yZSBvcGVyYXRpb25zLgorICAgICAgICAiIiIKKworICAgICAgICBzZWxmX2lzX25hbiA9IHNlbGYuX2lzbmFuKCkKKyAgICAgICAgaWYgb3RoZXIgaXMgTm9uZToKKyAgICAgICAgICAgIG90aGVyX2lzX25hbiA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdGhlcl9pc19uYW4gPSBvdGhlci5faXNuYW4oKQorCisgICAgICAgIGlmIHNlbGZfaXNfbmFuIG9yIG90aGVyX2lzX25hbjoKKyAgICAgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgICAgIGlmIHNlbGZfaXNfbmFuID09IDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sICdzTmFOJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKQorICAgICAgICAgICAgaWYgb3RoZXJfaXNfbmFuID09IDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sICdzTmFOJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcikKKyAgICAgICAgICAgIGlmIHNlbGZfaXNfbmFuOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXhfbmFuKGNvbnRleHQpCisKKyAgICAgICAgICAgIHJldHVybiBvdGhlci5fZml4X25hbihjb250ZXh0KQorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIF9jb21wYXJlX2NoZWNrX25hbnMoc2VsZiwgb3RoZXIsIGNvbnRleHQpOgorICAgICAgICAiIiJWZXJzaW9uIG9mIF9jaGVja19uYW5zIHVzZWQgZm9yIHRoZSBzaWduYWxpbmcgY29tcGFyaXNvbnMKKyAgICAgICAgY29tcGFyZV9zaWduYWwsIF9fbGVfXywgX19sdF9fLCBfX2dlX18sIF9fZ3RfXy4KKworICAgICAgICBTaWduYWwgSW52YWxpZE9wZXJhdGlvbiBpZiBlaXRoZXIgc2VsZiBvciBvdGhlciBpcyBhIChxdWlldAorICAgICAgICBvciBzaWduYWxpbmcpIE5hTi4gIFNpZ25hbGluZyBOYU5zIHRha2UgcHJlY2VkZW5jZSBvdmVyIHF1aWV0CisgICAgICAgIE5hTnMuCisKKyAgICAgICAgUmV0dXJuIDAgaWYgbmVpdGhlciBvcGVyYW5kIGlzIGEgTmFOLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbCBvciBvdGhlci5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGlmIHNlbGYuaXNfc25hbigpOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGFyaXNvbiBpbnZvbHZpbmcgc05hTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCisgICAgICAgICAgICBlbGlmIG90aGVyLmlzX3NuYW4oKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gaW52b2x2aW5nIHNOYU4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcikKKyAgICAgICAgICAgIGVsaWYgc2VsZi5pc19xbmFuKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wYXJpc29uIGludm9sdmluZyBOYU4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKQorICAgICAgICAgICAgZWxpZiBvdGhlci5pc19xbmFuKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wYXJpc29uIGludm9sdmluZyBOYU4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcikKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgc2VsZiBpcyBub256ZXJvOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLgorCisgICAgICAgIE5hTnMgYW5kIGluZmluaXRpZXMgYXJlIGNvbnNpZGVyZWQgbm9uemVyby4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pc19zcGVjaWFsIG9yIHNlbGYuX2ludCAhPSAnMCcKKworICAgIGRlZiBfY21wKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQ29tcGFyZSB0aGUgdHdvIG5vbi1OYU4gZGVjaW1hbCBpbnN0YW5jZXMgc2VsZiBhbmQgb3RoZXIuCisKKyAgICAgICAgUmV0dXJucyAtMSBpZiBzZWxmIDwgb3RoZXIsIDAgaWYgc2VsZiA9PSBvdGhlciBhbmQgMQorICAgICAgICBpZiBzZWxmID4gb3RoZXIuICBUaGlzIHJvdXRpbmUgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LiIiIgorCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWwgb3Igb3RoZXIuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBzZWxmX2luZiA9IHNlbGYuX2lzaW5maW5pdHkoKQorICAgICAgICAgICAgb3RoZXJfaW5mID0gb3RoZXIuX2lzaW5maW5pdHkoKQorICAgICAgICAgICAgaWYgc2VsZl9pbmYgPT0gb3RoZXJfaW5mOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbGlmIHNlbGZfaW5mIDwgb3RoZXJfaW5mOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgICMgY2hlY2sgZm9yIHplcm9zOyAgRGVjaW1hbCgnMCcpID09IERlY2ltYWwoJy0wJykKKyAgICAgICAgaWYgbm90IHNlbGY6CisgICAgICAgICAgICBpZiBub3Qgb3RoZXI6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0oKC0xKSoqb3RoZXIuX3NpZ24pCisgICAgICAgIGlmIG5vdCBvdGhlcjoKKyAgICAgICAgICAgIHJldHVybiAoLTEpKipzZWxmLl9zaWduCisKKyAgICAgICAgIyBJZiBkaWZmZXJlbnQgc2lnbnMsIG5lZyBvbmUgaXMgbGVzcworICAgICAgICBpZiBvdGhlci5fc2lnbiA8IHNlbGYuX3NpZ246CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgaWYgc2VsZi5fc2lnbiA8IG90aGVyLl9zaWduOgorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICBzZWxmX2FkanVzdGVkID0gc2VsZi5hZGp1c3RlZCgpCisgICAgICAgIG90aGVyX2FkanVzdGVkID0gb3RoZXIuYWRqdXN0ZWQoKQorICAgICAgICBpZiBzZWxmX2FkanVzdGVkID09IG90aGVyX2FkanVzdGVkOgorICAgICAgICAgICAgc2VsZl9wYWRkZWQgPSBzZWxmLl9pbnQgKyAnMCcqKHNlbGYuX2V4cCAtIG90aGVyLl9leHApCisgICAgICAgICAgICBvdGhlcl9wYWRkZWQgPSBvdGhlci5faW50ICsgJzAnKihvdGhlci5fZXhwIC0gc2VsZi5fZXhwKQorICAgICAgICAgICAgaWYgc2VsZl9wYWRkZWQgPT0gb3RoZXJfcGFkZGVkOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbGlmIHNlbGZfcGFkZGVkIDwgb3RoZXJfcGFkZGVkOgorICAgICAgICAgICAgICAgIHJldHVybiAtKC0xKSoqc2VsZi5fc2lnbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKC0xKSoqc2VsZi5fc2lnbgorICAgICAgICBlbGlmIHNlbGZfYWRqdXN0ZWQgPiBvdGhlcl9hZGp1c3RlZDoKKyAgICAgICAgICAgIHJldHVybiAoLTEpKipzZWxmLl9zaWduCisgICAgICAgIGVsc2U6ICMgc2VsZl9hZGp1c3RlZCA8IG90aGVyX2FkanVzdGVkCisgICAgICAgICAgICByZXR1cm4gLSgoLTEpKipzZWxmLl9zaWduKQorCisgICAgIyBOb3RlOiBUaGUgRGVjaW1hbCBzdGFuZGFyZCBkb2Vzbid0IGNvdmVyIHJpY2ggY29tcGFyaXNvbnMgZm9yCisgICAgIyBEZWNpbWFscy4gIEluIHBhcnRpY3VsYXIsIHRoZSBzcGVjaWZpY2F0aW9uIGlzIHNpbGVudCBvbiB0aGUKKyAgICAjIHN1YmplY3Qgb2Ygd2hhdCBzaG91bGQgaGFwcGVuIGZvciBhIGNvbXBhcmlzb24gaW52b2x2aW5nIGEgTmFOLgorICAgICMgV2UgdGFrZSB0aGUgZm9sbG93aW5nIGFwcHJvYWNoOgorICAgICMKKyAgICAjICAgPT0gY29tcGFyaXNvbnMgaW52b2x2aW5nIGEgcXVpZXQgTmFOIGFsd2F5cyByZXR1cm4gRmFsc2UKKyAgICAjICAgIT0gY29tcGFyaXNvbnMgaW52b2x2aW5nIGEgcXVpZXQgTmFOIGFsd2F5cyByZXR1cm4gVHJ1ZQorICAgICMgICA9PSBvciAhPSBjb21wYXJpc29ucyBpbnZvbHZpbmcgYSBzaWduYWxpbmcgTmFOIHNpZ25hbAorICAgICMgICAgICBJbnZhbGlkT3BlcmF0aW9uLCBhbmQgcmV0dXJuIEZhbHNlIG9yIFRydWUgYXMgYWJvdmUgaWYgdGhlCisgICAgIyAgICAgIEludmFsaWRPcGVyYXRpb24gaXMgbm90IHRyYXBwZWQuCisgICAgIyAgIDwsID4sIDw9IGFuZCA+PSBjb21wYXJpc29ucyBpbnZvbHZpbmcgYSAocXVpZXQgb3Igc2lnbmFsaW5nKQorICAgICMgICAgICBOYU4gc2lnbmFsIEludmFsaWRPcGVyYXRpb24sIGFuZCByZXR1cm4gRmFsc2UgaWYgdGhlCisgICAgIyAgICAgIEludmFsaWRPcGVyYXRpb24gaXMgbm90IHRyYXBwZWQuCisgICAgIworICAgICMgVGhpcyBiZWhhdmlvciBpcyBkZXNpZ25lZCB0byBjb25mb3JtIGFzIGNsb3NlbHkgYXMgcG9zc2libGUgdG8KKyAgICAjIHRoYXQgc3BlY2lmaWVkIGJ5IElFRUUgNzU0LgorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgYWxsb3dfZmxvYXQ9VHJ1ZSkKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIKKyAgICAgICAgaWYgc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPT0gMAorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgYWxsb3dfZmxvYXQ9VHJ1ZSkKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIKKyAgICAgICAgaWYgc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSAhPSAwCisKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCBhbGxvd19mbG9hdD1UcnVlKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorICAgICAgICBhbnMgPSBzZWxmLl9jb21wYXJlX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA8IDAKKworICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIGFsbG93X2Zsb2F0PVRydWUpCisgICAgICAgIGlmIG90aGVyIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyCisgICAgICAgIGFucyA9IHNlbGYuX2NvbXBhcmVfY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDw9IDAKKworICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIGFsbG93X2Zsb2F0PVRydWUpCisgICAgICAgIGlmIG90aGVyIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyCisgICAgICAgIGFucyA9IHNlbGYuX2NvbXBhcmVfY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpID4gMAorCisgICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgYWxsb3dfZmxvYXQ9VHJ1ZSkKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIKKyAgICAgICAgYW5zID0gc2VsZi5fY29tcGFyZV9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPj0gMAorCisgICAgZGVmIGNvbXBhcmUoc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIkNvbXBhcmVzIG9uZSB0byBhbm90aGVyLgorCisgICAgICAgIC0xID0+IGEgPCBiCisgICAgICAgIDAgID0+IGEgPSBiCisgICAgICAgIDEgID0+IGEgPiBiCisgICAgICAgIE5hTiA9PiBvbmUgaXMgTmFOCisgICAgICAgIExpa2UgX19jbXBfXywgYnV0IHJldHVybnMgRGVjaW1hbCBpbnN0YW5jZXMuCisgICAgICAgICIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisKKyAgICAgICAgIyBDb21wYXJlKE5hTiwgTmFOKSA9IE5hTgorICAgICAgICBpZiAoc2VsZi5faXNfc3BlY2lhbCBvciBvdGhlciBhbmQgb3RoZXIuX2lzX3NwZWNpYWwpOgorICAgICAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKyAgICAgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZi5fY21wKG90aGVyKSkKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgIiIieC5fX2hhc2hfXygpIDw9PT4gaGFzaCh4KSIiIgorICAgICAgICAjIERlY2ltYWwgaW50ZWdlcnMgbXVzdCBoYXNoIHRoZSBzYW1lIGFzIHRoZSBpbnRzCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgaGFzaCBvZiBhIG5vbnNwZWNpYWwgbm9uaW50ZWdlciBEZWNpbWFsIG11c3QgZGVwZW5kIG9ubHkKKyAgICAgICAgIyBvbiB0aGUgdmFsdWUgb2YgdGhhdCBEZWNpbWFsLCBhbmQgbm90IG9uIGl0cyByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgIyBGb3IgZXhhbXBsZTogaGFzaChEZWNpbWFsKCcxMDBFLTEnKSkgPT0gaGFzaChEZWNpbWFsKCcxMCcpKS4KKworICAgICAgICAjIEVxdWFsaXR5IGNvbXBhcmlzb25zIGludm9sdmluZyBzaWduYWxpbmcgbmFucyBjYW4gcmFpc2UgYW4KKyAgICAgICAgIyBleGNlcHRpb247IHNpbmNlIGVxdWFsaXR5IGNoZWNrcyBhcmUgaW1wbGljaXRseSBhbmQKKyAgICAgICAgIyB1bnByZWRpY3RhYmx5IHVzZWQgd2hlbiBjaGVja2luZyBzZXQgYW5kIGRpY3QgbWVtYmVyc2hpcCwgd2UKKyAgICAgICAgIyBwcmV2ZW50IHNpZ25hbGluZyBuYW5zIGZyb20gYmVpbmcgdXNlZCBhcyBzZXQgZWxlbWVudHMgb3IKKyAgICAgICAgIyBkaWN0IGtleXMgYnkgbWFraW5nIF9faGFzaF9fIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGlmIHNlbGYuaXNfc25hbigpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2Fubm90IGhhc2ggYSBzaWduYWxpbmcgTmFOIHZhbHVlLicpCisgICAgICAgICAgICBlbGlmIHNlbGYuaXNfbmFuKCk6CisgICAgICAgICAgICAgICAgIyAwIHRvIG1hdGNoIGhhc2goZmxvYXQoJ25hbicpKQorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgdmFsdWVzIGNob3NlbiB0byBtYXRjaCBoYXNoKGZsb2F0KCdpbmYnKSkgYW5kCisgICAgICAgICAgICAgICAgIyBoYXNoKGZsb2F0KCctaW5mJykpLgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3NpZ246CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMjcxODI4CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMxNDE1OQorCisgICAgICAgICMgSW4gUHl0aG9uIDIuNywgd2UncmUgYWxsb3dpbmcgY29tcGFyaXNvbnMgKGJ1dCBub3QKKyAgICAgICAgIyBhcml0aG1ldGljIG9wZXJhdGlvbnMpIGJldHdlZW4gZmxvYXRzIGFuZCBEZWNpbWFsczsgIHNvIGlmCisgICAgICAgICMgYSBEZWNpbWFsIGluc3RhbmNlIGlzIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBhcyBhIGZsb2F0IHRoZW4KKyAgICAgICAgIyBpdHMgaGFzaCBzaG91bGQgbWF0Y2ggdGhhdCBvZiB0aGUgZmxvYXQuCisgICAgICAgIHNlbGZfYXNfZmxvYXQgPSBmbG9hdChzZWxmKQorICAgICAgICBpZiBEZWNpbWFsLmZyb21fZmxvYXQoc2VsZl9hc19mbG9hdCkgPT0gc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBoYXNoKHNlbGZfYXNfZmxvYXQpCisKKyAgICAgICAgaWYgc2VsZi5faXNpbnRlZ2VyKCk6CisgICAgICAgICAgICBvcCA9IF9Xb3JrUmVwKHNlbGYudG9faW50ZWdyYWxfdmFsdWUoKSkKKyAgICAgICAgICAgICMgdG8gbWFrZSBjb21wdXRhdGlvbiBmZWFzaWJsZSBmb3IgRGVjaW1hbHMgd2l0aCBsYXJnZQorICAgICAgICAgICAgIyBleHBvbmVudCwgd2UgdXNlIHRoZSBmYWN0IHRoYXQgaGFzaChuKSA9PSBoYXNoKG0pIGZvcgorICAgICAgICAgICAgIyBhbnkgdHdvIG5vbnplcm8gaW50ZWdlcnMgbiBhbmQgbSBzdWNoIHRoYXQgKGkpIG4gYW5kIG0KKyAgICAgICAgICAgICMgaGF2ZSB0aGUgc2FtZSBzaWduLCBhbmQgKGlpKSBuIGlzIGNvbmdydWVudCB0byBtIG1vZHVsbworICAgICAgICAgICAgIyAyKio2NC0xLiAgU28gd2UgY2FuIHJlcGxhY2UgaGFzaCgoLTEpKipzKmMqMTAqKmUpIHdpdGgKKyAgICAgICAgICAgICMgaGFzaCgoLTEpKipzKmMqcG93KDEwLCBlLCAyKio2NC0xKS4KKyAgICAgICAgICAgIHJldHVybiBoYXNoKCgtMSkqKm9wLnNpZ24qb3AuaW50KnBvdygxMCwgb3AuZXhwLCAyKio2NC0xKSkKKyAgICAgICAgIyBUaGUgdmFsdWUgb2YgYSBub256ZXJvIG5vbnNwZWNpYWwgRGVjaW1hbCBpbnN0YW5jZSBpcworICAgICAgICAjIGZhaXRoZnVsbHkgcmVwcmVzZW50ZWQgYnkgdGhlIHRyaXBsZSBjb25zaXN0aW5nIG9mIGl0cyBzaWduLAorICAgICAgICAjIGl0cyBhZGp1c3RlZCBleHBvbmVudCwgYW5kIGl0cyBjb2VmZmljaWVudCB3aXRoIHRyYWlsaW5nCisgICAgICAgICMgemVyb3MgcmVtb3ZlZC4KKyAgICAgICAgcmV0dXJuIGhhc2goKHNlbGYuX3NpZ24sCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl9leHArbGVuKHNlbGYuX2ludCksCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnQucnN0cmlwKCcwJykpKQorCisgICAgZGVmIGFzX3R1cGxlKHNlbGYpOgorICAgICAgICAiIiJSZXByZXNlbnRzIHRoZSBudW1iZXIgYXMgYSB0cmlwbGUgdHVwbGUuCisKKyAgICAgICAgVG8gc2hvdyB0aGUgaW50ZXJuYWxzIGV4YWN0bHkgYXMgdGhleSBhcmUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gRGVjaW1hbFR1cGxlKHNlbGYuX3NpZ24sIHR1cGxlKG1hcChpbnQsIHNlbGYuX2ludCkpLCBzZWxmLl9leHApCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIlJlcHJlc2VudHMgdGhlIG51bWJlciBhcyBhbiBpbnN0YW5jZSBvZiBEZWNpbWFsLiIiIgorICAgICAgICAjIEludmFyaWFudDogIGV2YWwocmVwcihkKSkgPT0gZAorICAgICAgICByZXR1cm4gIkRlY2ltYWwoJyVzJykiICUgc3RyKHNlbGYpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmLCBlbmc9RmFsc2UsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlciBpbiBzY2llbnRpZmljIG5vdGF0aW9uLgorCisgICAgICAgIENhcHR1cmVzIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24uCisgICAgICAgICIiIgorCisgICAgICAgIHNpZ24gPSBbJycsICctJ11bc2VsZi5fc2lnbl0KKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGlmIHNlbGYuX2V4cCA9PSAnRic6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ24gKyAnSW5maW5pdHknCisgICAgICAgICAgICBlbGlmIHNlbGYuX2V4cCA9PSAnbic6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ24gKyAnTmFOJyArIHNlbGYuX2ludAorICAgICAgICAgICAgZWxzZTogIyBzZWxmLl9leHAgPT0gJ04nCisgICAgICAgICAgICAgICAgcmV0dXJuIHNpZ24gKyAnc05hTicgKyBzZWxmLl9pbnQKKworICAgICAgICAjIG51bWJlciBvZiBkaWdpdHMgb2Ygc2VsZi5faW50IHRvIGxlZnQgb2YgZGVjaW1hbCBwb2ludAorICAgICAgICBsZWZ0ZGlnaXRzID0gc2VsZi5fZXhwICsgbGVuKHNlbGYuX2ludCkKKworICAgICAgICAjIGRvdHBsYWNlIGlzIG51bWJlciBvZiBkaWdpdHMgb2Ygc2VsZi5faW50IHRvIHRoZSBsZWZ0IG9mIHRoZQorICAgICAgICAjIGRlY2ltYWwgcG9pbnQgaW4gdGhlIG1hbnRpc3NhIG9mIHRoZSBvdXRwdXQgc3RyaW5nICh0aGF0IGlzLAorICAgICAgICAjIGFmdGVyIGFkanVzdGluZyB0aGUgZXhwb25lbnQpCisgICAgICAgIGlmIHNlbGYuX2V4cCA8PSAwIGFuZCBsZWZ0ZGlnaXRzID4gLTY6CisgICAgICAgICAgICAjIG5vIGV4cG9uZW50IHJlcXVpcmVkCisgICAgICAgICAgICBkb3RwbGFjZSA9IGxlZnRkaWdpdHMKKyAgICAgICAgZWxpZiBub3QgZW5nOgorICAgICAgICAgICAgIyB1c3VhbCBzY2llbnRpZmljIG5vdGF0aW9uOiAxIGRpZ2l0IG9uIGxlZnQgb2YgdGhlIHBvaW50CisgICAgICAgICAgICBkb3RwbGFjZSA9IDEKKyAgICAgICAgZWxpZiBzZWxmLl9pbnQgPT0gJzAnOgorICAgICAgICAgICAgIyBlbmdpbmVlcmluZyBub3RhdGlvbiwgemVybworICAgICAgICAgICAgZG90cGxhY2UgPSAobGVmdGRpZ2l0cyArIDEpICUgMyAtIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZW5naW5lZXJpbmcgbm90YXRpb24sIG5vbnplcm8KKyAgICAgICAgICAgIGRvdHBsYWNlID0gKGxlZnRkaWdpdHMgLSAxKSAlIDMgKyAxCisKKyAgICAgICAgaWYgZG90cGxhY2UgPD0gMDoKKyAgICAgICAgICAgIGludHBhcnQgPSAnMCcKKyAgICAgICAgICAgIGZyYWNwYXJ0ID0gJy4nICsgJzAnKigtZG90cGxhY2UpICsgc2VsZi5faW50CisgICAgICAgIGVsaWYgZG90cGxhY2UgPj0gbGVuKHNlbGYuX2ludCk6CisgICAgICAgICAgICBpbnRwYXJ0ID0gc2VsZi5faW50KycwJyooZG90cGxhY2UtbGVuKHNlbGYuX2ludCkpCisgICAgICAgICAgICBmcmFjcGFydCA9ICcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbnRwYXJ0ID0gc2VsZi5faW50Wzpkb3RwbGFjZV0KKyAgICAgICAgICAgIGZyYWNwYXJ0ID0gJy4nICsgc2VsZi5faW50W2RvdHBsYWNlOl0KKyAgICAgICAgaWYgbGVmdGRpZ2l0cyA9PSBkb3RwbGFjZToKKyAgICAgICAgICAgIGV4cCA9ICcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorICAgICAgICAgICAgZXhwID0gWydlJywgJ0UnXVtjb250ZXh0LmNhcGl0YWxzXSArICIlK2QiICUgKGxlZnRkaWdpdHMtZG90cGxhY2UpCisKKyAgICAgICAgcmV0dXJuIHNpZ24gKyBpbnRwYXJ0ICsgZnJhY3BhcnQgKyBleHAKKworICAgIGRlZiB0b19lbmdfc3RyaW5nKHNlbGYsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIkNvbnZlcnQgdG8gZW5naW5lZXJpbmctdHlwZSBzdHJpbmcuCisKKyAgICAgICAgRW5naW5lZXJpbmcgbm90YXRpb24gaGFzIGFuIGV4cG9uZW50IHdoaWNoIGlzIGEgbXVsdGlwbGUgb2YgMywgc28gdGhlcmUKKyAgICAgICAgYXJlIHVwIHRvIDMgZGlnaXRzIGxlZnQgb2YgdGhlIGRlY2ltYWwgcGxhY2UuCisKKyAgICAgICAgU2FtZSBydWxlcyBmb3Igd2hlbiBpbiBleHBvbmVudGlhbCBhbmQgd2hlbiBhcyBhIHZhbHVlIGFzIGluIF9fc3RyX18uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX3N0cl9fKGVuZz1UcnVlLCBjb250ZXh0PWNvbnRleHQpCisKKyAgICBkZWYgX19uZWdfXyhzZWxmLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIGEgY29weSB3aXRoIHRoZSBzaWduIHN3aXRjaGVkLgorCisgICAgICAgIFJvdW5kcywgaWYgaXQgaGFzIHJlYXNvbi4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIGlmIG5vdCBzZWxmIGFuZCBjb250ZXh0LnJvdW5kaW5nICE9IFJPVU5EX0ZMT09SOgorICAgICAgICAgICAgIyAtRGVjaW1hbCgnMCcpIGlzIERlY2ltYWwoJzAnKSwgbm90IERlY2ltYWwoJy0wJyksIGV4Y2VwdAorICAgICAgICAgICAgIyBpbiBST1VORF9GTE9PUiByb3VuZGluZyBtb2RlLgorICAgICAgICAgICAgYW5zID0gc2VsZi5jb3B5X2FicygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbnMgPSBzZWxmLmNvcHlfbmVnYXRlKCkKKworICAgICAgICByZXR1cm4gYW5zLl9maXgoY29udGV4dCkKKworICAgIGRlZiBfX3Bvc19fKHNlbGYsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybnMgYSBjb3B5LCB1bmxlc3MgaXQgaXMgYSBzTmFOLgorCisgICAgICAgIFJvdW5kcyB0aGUgbnVtYmVyIChpZiBtb3JlIHRoZW4gcHJlY2lzaW9uIGRpZ2l0cykKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIGlmIG5vdCBzZWxmIGFuZCBjb250ZXh0LnJvdW5kaW5nICE9IFJPVU5EX0ZMT09SOgorICAgICAgICAgICAgIyArICgtMCkgPSAwLCBleGNlcHQgaW4gUk9VTkRfRkxPT1Igcm91bmRpbmcgbW9kZS4KKyAgICAgICAgICAgIGFucyA9IHNlbGYuY29weV9hYnMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYW5zID0gRGVjaW1hbChzZWxmKQorCisgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgZGVmIF9fYWJzX18oc2VsZiwgcm91bmQ9VHJ1ZSwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2Ygc2VsZi4KKworICAgICAgICBJZiB0aGUga2V5d29yZCBhcmd1bWVudCAncm91bmQnIGlzIGZhbHNlLCBkbyBub3Qgcm91bmQuICBUaGUKKyAgICAgICAgZXhwcmVzc2lvbiBzZWxmLl9fYWJzX18ocm91bmQ9RmFsc2UpIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgICAgc2VsZi5jb3B5X2FicygpLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHJvdW5kOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29weV9hYnMoKQorCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgaWYgc2VsZi5fc2lnbjoKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX19uZWdfXyhjb250ZXh0PWNvbnRleHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9fcG9zX18oY29udGV4dD1jb250ZXh0KQorCisgICAgICAgIHJldHVybiBhbnMKKworICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHNlbGYgKyBvdGhlci4KKworICAgICAgICAtSU5GICsgSU5GIChvciB0aGUgcmV2ZXJzZSkgY2F1c2UgSW52YWxpZE9wZXJhdGlvbiBlcnJvcnMuCisgICAgICAgICIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsIG9yIG90aGVyLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKyAgICAgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgICAgIGlmIHNlbGYuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgICAgICAjIElmIGJvdGggSU5GLCBzYW1lIHNpZ24gPT4gc2FtZSBhcyBib3RoLCBvcHBvc2l0ZSA9PiBlcnJvci4KKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9zaWduICE9IG90aGVyLl9zaWduIGFuZCBvdGhlci5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJy1JTkYgKyBJTkYnKQorICAgICAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpCisgICAgICAgICAgICBpZiBvdGhlci5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKG90aGVyKSAgIyBDYW4ndCBib3RoIGJlIGluZmluaXR5IGhlcmUKKworICAgICAgICBleHAgPSBtaW4oc2VsZi5fZXhwLCBvdGhlci5fZXhwKQorICAgICAgICBuZWdhdGl2ZXplcm8gPSAwCisgICAgICAgIGlmIGNvbnRleHQucm91bmRpbmcgPT0gUk9VTkRfRkxPT1IgYW5kIHNlbGYuX3NpZ24gIT0gb3RoZXIuX3NpZ246CisgICAgICAgICAgICAjIElmIHRoZSBhbnN3ZXIgaXMgMCwgdGhlIHNpZ24gc2hvdWxkIGJlIG5lZ2F0aXZlLCBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICBuZWdhdGl2ZXplcm8gPSAxCisKKyAgICAgICAgaWYgbm90IHNlbGYgYW5kIG5vdCBvdGhlcjoKKyAgICAgICAgICAgIHNpZ24gPSBtaW4oc2VsZi5fc2lnbiwgb3RoZXIuX3NpZ24pCisgICAgICAgICAgICBpZiBuZWdhdGl2ZXplcm86CisgICAgICAgICAgICAgICAgc2lnbiA9IDEKKyAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUoc2lnbiwgJzAnLCBleHApCisgICAgICAgICAgICBhbnMgPSBhbnMuX2ZpeChjb250ZXh0KQorICAgICAgICAgICAgcmV0dXJuIGFucworICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIGV4cCA9IG1heChleHAsIG90aGVyLl9leHAgLSBjb250ZXh0LnByZWMtMSkKKyAgICAgICAgICAgIGFucyA9IG90aGVyLl9yZXNjYWxlKGV4cCwgY29udGV4dC5yb3VuZGluZykKKyAgICAgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisgICAgICAgICAgICByZXR1cm4gYW5zCisgICAgICAgIGlmIG5vdCBvdGhlcjoKKyAgICAgICAgICAgIGV4cCA9IG1heChleHAsIHNlbGYuX2V4cCAtIGNvbnRleHQucHJlYy0xKQorICAgICAgICAgICAgYW5zID0gc2VsZi5fcmVzY2FsZShleHAsIGNvbnRleHQucm91bmRpbmcpCisgICAgICAgICAgICBhbnMgPSBhbnMuX2ZpeChjb250ZXh0KQorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgIG9wMSA9IF9Xb3JrUmVwKHNlbGYpCisgICAgICAgIG9wMiA9IF9Xb3JrUmVwKG90aGVyKQorICAgICAgICBvcDEsIG9wMiA9IF9ub3JtYWxpemUob3AxLCBvcDIsIGNvbnRleHQucHJlYykKKworICAgICAgICByZXN1bHQgPSBfV29ya1JlcCgpCisgICAgICAgIGlmIG9wMS5zaWduICE9IG9wMi5zaWduOgorICAgICAgICAgICAgIyBFcXVhbCBhbmQgb3Bwb3NpdGUKKyAgICAgICAgICAgIGlmIG9wMS5pbnQgPT0gb3AyLmludDoKKyAgICAgICAgICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKG5lZ2F0aXZlemVybywgJzAnLCBleHApCisgICAgICAgICAgICAgICAgYW5zID0gYW5zLl9maXgoY29udGV4dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5zCisgICAgICAgICAgICBpZiBvcDEuaW50IDwgb3AyLmludDoKKyAgICAgICAgICAgICAgICBvcDEsIG9wMiA9IG9wMiwgb3AxCisgICAgICAgICAgICAgICAgIyBPSywgbm93IGFicyhvcDEpID4gYWJzKG9wMikKKyAgICAgICAgICAgIGlmIG9wMS5zaWduID09IDE6CisgICAgICAgICAgICAgICAgcmVzdWx0LnNpZ24gPSAxCisgICAgICAgICAgICAgICAgb3AxLnNpZ24sIG9wMi5zaWduID0gb3AyLnNpZ24sIG9wMS5zaWduCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3VsdC5zaWduID0gMAorICAgICAgICAgICAgICAgICMgU28gd2Uga25vdyB0aGUgc2lnbiwgYW5kIG9wMSA+IDAuCisgICAgICAgIGVsaWYgb3AxLnNpZ24gPT0gMToKKyAgICAgICAgICAgIHJlc3VsdC5zaWduID0gMQorICAgICAgICAgICAgb3AxLnNpZ24sIG9wMi5zaWduID0gKDAsIDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXN1bHQuc2lnbiA9IDAKKyAgICAgICAgIyBOb3csIG9wMSA+IGFicyhvcDIpID4gMAorCisgICAgICAgIGlmIG9wMi5zaWduID09IDA6CisgICAgICAgICAgICByZXN1bHQuaW50ID0gb3AxLmludCArIG9wMi5pbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdC5pbnQgPSBvcDEuaW50IC0gb3AyLmludAorCisgICAgICAgIHJlc3VsdC5leHAgPSBvcDEuZXhwCisgICAgICAgIGFucyA9IERlY2ltYWwocmVzdWx0KQorICAgICAgICBhbnMgPSBhbnMuX2ZpeChjb250ZXh0KQorICAgICAgICByZXR1cm4gYW5zCisKKyAgICBfX3JhZGRfXyA9IF9fYWRkX18KKworICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gc2VsZiAtIG90aGVyIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIpCisgICAgICAgIGlmIG90aGVyIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyCisKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbCBvciBvdGhlci5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgIyBzZWxmIC0gb3RoZXIgaXMgY29tcHV0ZWQgYXMgc2VsZiArIG90aGVyLmNvcHlfbmVnYXRlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19hZGRfXyhvdGhlci5jb3B5X25lZ2F0ZSgpLCBjb250ZXh0PWNvbnRleHQpCisKKyAgICBkZWYgX19yc3ViX18oc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBvdGhlciAtIHNlbGYiIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlcikKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIKKworICAgICAgICByZXR1cm4gb3RoZXIuX19zdWJfXyhzZWxmLCBjb250ZXh0PWNvbnRleHQpCisKKyAgICBkZWYgX19tdWxfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHNlbGYgKiBvdGhlci4KKworICAgICAgICAoKy0pIElORiAqIDAgKG9yIGl0cyByZXZlcnNlKSByYWlzZSBJbnZhbGlkT3BlcmF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlcikKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgcmVzdWx0c2lnbiA9IHNlbGYuX3NpZ24gXiBvdGhlci5fc2lnbgorCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWwgb3Igb3RoZXIuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBvdGhlcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sICcoKy0pSU5GICogMCcpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9TaWduZWRJbmZpbml0eVtyZXN1bHRzaWduXQorCisgICAgICAgICAgICBpZiBvdGhlci5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJzAgKiAoKy0pSU5GJykKKyAgICAgICAgICAgICAgICByZXR1cm4gX1NpZ25lZEluZmluaXR5W3Jlc3VsdHNpZ25dCisKKyAgICAgICAgcmVzdWx0ZXhwID0gc2VsZi5fZXhwICsgb3RoZXIuX2V4cAorCisgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciBtdWx0aXBseWluZyBieSB6ZXJvCisgICAgICAgIGlmIG5vdCBzZWxmIG9yIG5vdCBvdGhlcjoKKyAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUocmVzdWx0c2lnbiwgJzAnLCByZXN1bHRleHApCisgICAgICAgICAgICAjIEZpeGluZyBpbiBjYXNlIHRoZSBleHBvbmVudCBpcyBvdXQgb2YgYm91bmRzCisgICAgICAgICAgICBhbnMgPSBhbnMuX2ZpeChjb250ZXh0KQorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciBtdWx0aXBseWluZyBieSBwb3dlciBvZiAxMAorICAgICAgICBpZiBzZWxmLl9pbnQgPT0gJzEnOgorICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShyZXN1bHRzaWduLCBvdGhlci5faW50LCByZXN1bHRleHApCisgICAgICAgICAgICBhbnMgPSBhbnMuX2ZpeChjb250ZXh0KQorICAgICAgICAgICAgcmV0dXJuIGFucworICAgICAgICBpZiBvdGhlci5faW50ID09ICcxJzoKKyAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUocmVzdWx0c2lnbiwgc2VsZi5faW50LCByZXN1bHRleHApCisgICAgICAgICAgICBhbnMgPSBhbnMuX2ZpeChjb250ZXh0KQorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgIG9wMSA9IF9Xb3JrUmVwKHNlbGYpCisgICAgICAgIG9wMiA9IF9Xb3JrUmVwKG90aGVyKQorCisgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUocmVzdWx0c2lnbiwgc3RyKG9wMS5pbnQgKiBvcDIuaW50KSwgcmVzdWx0ZXhwKQorICAgICAgICBhbnMgPSBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgICAgIHJldHVybiBhbnMKKyAgICBfX3JtdWxfXyA9IF9fbXVsX18KKworICAgIGRlZiBfX3RydWVkaXZfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHNlbGYgLyBvdGhlci4iIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlcikKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgc2lnbiA9IHNlbGYuX3NpZ24gXiBvdGhlci5fc2lnbgorCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWwgb3Igb3RoZXIuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpIGFuZCBvdGhlci5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnKCstKUlORi8oKy0pSU5GJykKKworICAgICAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgICAgIHJldHVybiBfU2lnbmVkSW5maW5pdHlbc2lnbl0KKworICAgICAgICAgICAgaWYgb3RoZXIuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihDbGFtcGVkLCAnRGl2aXNpb24gYnkgaW5maW5pdHknKQorICAgICAgICAgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKHNpZ24sICcwJywgY29udGV4dC5FdGlueSgpKQorCisgICAgICAgICMgU3BlY2lhbCBjYXNlcyBmb3IgemVyb2VzCisgICAgICAgIGlmIG5vdCBvdGhlcjoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihEaXZpc2lvblVuZGVmaW5lZCwgJzAgLyAwJykKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihEaXZpc2lvbkJ5WmVybywgJ3ggLyAwJywgc2lnbikKKworICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIGV4cCA9IHNlbGYuX2V4cCAtIG90aGVyLl9leHAKKyAgICAgICAgICAgIGNvZWZmID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBPSywgc28gbmVpdGhlciA9IDAsIElORiBvciBOYU4KKyAgICAgICAgICAgIHNoaWZ0ID0gbGVuKG90aGVyLl9pbnQpIC0gbGVuKHNlbGYuX2ludCkgKyBjb250ZXh0LnByZWMgKyAxCisgICAgICAgICAgICBleHAgPSBzZWxmLl9leHAgLSBvdGhlci5fZXhwIC0gc2hpZnQKKyAgICAgICAgICAgIG9wMSA9IF9Xb3JrUmVwKHNlbGYpCisgICAgICAgICAgICBvcDIgPSBfV29ya1JlcChvdGhlcikKKyAgICAgICAgICAgIGlmIHNoaWZ0ID49IDA6CisgICAgICAgICAgICAgICAgY29lZmYsIHJlbWFpbmRlciA9IGRpdm1vZChvcDEuaW50ICogMTAqKnNoaWZ0LCBvcDIuaW50KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb2VmZiwgcmVtYWluZGVyID0gZGl2bW9kKG9wMS5pbnQsIG9wMi5pbnQgKiAxMCoqLXNoaWZ0KQorICAgICAgICAgICAgaWYgcmVtYWluZGVyOgorICAgICAgICAgICAgICAgICMgcmVzdWx0IGlzIG5vdCBleGFjdDsgYWRqdXN0IHRvIGVuc3VyZSBjb3JyZWN0IHJvdW5kaW5nCisgICAgICAgICAgICAgICAgaWYgY29lZmYgJSA1ID09IDA6CisgICAgICAgICAgICAgICAgICAgIGNvZWZmICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyByZXN1bHQgaXMgZXhhY3Q7IGdldCBhcyBjbG9zZSB0byBpZGVhbCBleHBvbmVudCBhcyBwb3NzaWJsZQorICAgICAgICAgICAgICAgIGlkZWFsX2V4cCA9IHNlbGYuX2V4cCAtIG90aGVyLl9leHAKKyAgICAgICAgICAgICAgICB3aGlsZSBleHAgPCBpZGVhbF9leHAgYW5kIGNvZWZmICUgMTAgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgY29lZmYgLy89IDEwCisgICAgICAgICAgICAgICAgICAgIGV4cCArPSAxCisKKyAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShzaWduLCBzdHIoY29lZmYpLCBleHApCisgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgZGVmIF9kaXZpZGUoc2VsZiwgb3RoZXIsIGNvbnRleHQpOgorICAgICAgICAiIiJSZXR1cm4gKHNlbGYgLy8gb3RoZXIsIHNlbGYgJSBvdGhlciksIHRvIGNvbnRleHQucHJlYyBwcmVjaXNpb24uCisKKyAgICAgICAgQXNzdW1lcyB0aGF0IG5laXRoZXIgc2VsZiBub3Igb3RoZXIgaXMgYSBOYU4sIHRoYXQgc2VsZiBpcyBub3QKKyAgICAgICAgaW5maW5pdGUgYW5kIHRoYXQgb3RoZXIgaXMgbm9uemVyby4KKyAgICAgICAgIiIiCisgICAgICAgIHNpZ24gPSBzZWxmLl9zaWduIF4gb3RoZXIuX3NpZ24KKyAgICAgICAgaWYgb3RoZXIuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgIGlkZWFsX2V4cCA9IHNlbGYuX2V4cAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWRlYWxfZXhwID0gbWluKHNlbGYuX2V4cCwgb3RoZXIuX2V4cCkKKworICAgICAgICBleHBkaWZmID0gc2VsZi5hZGp1c3RlZCgpIC0gb3RoZXIuYWRqdXN0ZWQoKQorICAgICAgICBpZiBub3Qgc2VsZiBvciBvdGhlci5faXNpbmZpbml0eSgpIG9yIGV4cGRpZmYgPD0gLTI6CisgICAgICAgICAgICByZXR1cm4gKF9kZWNfZnJvbV90cmlwbGUoc2lnbiwgJzAnLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVzY2FsZShpZGVhbF9leHAsIGNvbnRleHQucm91bmRpbmcpKQorICAgICAgICBpZiBleHBkaWZmIDw9IGNvbnRleHQucHJlYzoKKyAgICAgICAgICAgIG9wMSA9IF9Xb3JrUmVwKHNlbGYpCisgICAgICAgICAgICBvcDIgPSBfV29ya1JlcChvdGhlcikKKyAgICAgICAgICAgIGlmIG9wMS5leHAgPj0gb3AyLmV4cDoKKyAgICAgICAgICAgICAgICBvcDEuaW50ICo9IDEwKioob3AxLmV4cCAtIG9wMi5leHApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9wMi5pbnQgKj0gMTAqKihvcDIuZXhwIC0gb3AxLmV4cCkKKyAgICAgICAgICAgIHEsIHIgPSBkaXZtb2Qob3AxLmludCwgb3AyLmludCkKKyAgICAgICAgICAgIGlmIHEgPCAxMCoqY29udGV4dC5wcmVjOgorICAgICAgICAgICAgICAgIHJldHVybiAoX2RlY19mcm9tX3RyaXBsZShzaWduLCBzdHIocSksIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLCBzdHIociksIGlkZWFsX2V4cCkpCisKKyAgICAgICAgIyBIZXJlIHRoZSBxdW90aWVudCBpcyB0b28gbGFyZ2UgdG8gYmUgcmVwcmVzZW50YWJsZQorICAgICAgICBhbnMgPSBjb250ZXh0Ll9yYWlzZV9lcnJvcihEaXZpc2lvbkltcG9zc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdW90aWVudCB0b28gbGFyZ2UgaW4gLy8sICUgb3IgZGl2bW9kJykKKyAgICAgICAgcmV0dXJuIGFucywgYW5zCisKKyAgICBkZWYgX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJTd2FwcyBzZWxmL290aGVyIGFuZCByZXR1cm5zIF9fdHJ1ZWRpdl9fLiIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorICAgICAgICByZXR1cm4gb3RoZXIuX190cnVlZGl2X18oc2VsZiwgY29udGV4dD1jb250ZXh0KQorCisgICAgX19kaXZfXyA9IF9fdHJ1ZWRpdl9fCisgICAgX19yZGl2X18gPSBfX3J0cnVlZGl2X18KKworICAgIGRlZiBfX2Rpdm1vZF9fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIChzZWxmIC8vIG90aGVyLCBzZWxmICUgb3RoZXIpCisgICAgICAgICIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gKGFucywgYW5zKQorCisgICAgICAgIHNpZ24gPSBzZWxmLl9zaWduIF4gb3RoZXIuX3NpZ24KKyAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgaWYgb3RoZXIuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgICAgICBhbnMgPSBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnZGl2bW9kKElORiwgSU5GKScpCisgICAgICAgICAgICAgICAgcmV0dXJuIGFucywgYW5zCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAoX1NpZ25lZEluZmluaXR5W3NpZ25dLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJ0lORiAlIHgnKSkKKworICAgICAgICBpZiBub3Qgb3RoZXI6CisgICAgICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgICAgICBhbnMgPSBjb250ZXh0Ll9yYWlzZV9lcnJvcihEaXZpc2lvblVuZGVmaW5lZCwgJ2Rpdm1vZCgwLCAwKScpCisgICAgICAgICAgICAgICAgcmV0dXJuIGFucywgYW5zCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAoY29udGV4dC5fcmFpc2VfZXJyb3IoRGl2aXNpb25CeVplcm8sICd4IC8vIDAnLCBzaWduKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sICd4ICUgMCcpKQorCisgICAgICAgIHF1b3RpZW50LCByZW1haW5kZXIgPSBzZWxmLl9kaXZpZGUob3RoZXIsIGNvbnRleHQpCisgICAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci5fZml4KGNvbnRleHQpCisgICAgICAgIHJldHVybiBxdW90aWVudCwgcmVtYWluZGVyCisKKyAgICBkZWYgX19yZGl2bW9kX18oc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlN3YXBzIHNlbGYvb3RoZXIgYW5kIHJldHVybnMgX19kaXZtb2RfXy4iIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlcikKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIKKyAgICAgICAgcmV0dXJuIG90aGVyLl9fZGl2bW9kX18oc2VsZiwgY29udGV4dD1jb250ZXh0KQorCisgICAgZGVmIF9fbW9kX18oc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBzZWxmICUgb3RoZXIKKyAgICAgICAgIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIpCisgICAgICAgIGlmIG90aGVyIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyCisKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJ0lORiAlIHgnKQorICAgICAgICBlbGlmIG5vdCBvdGhlcjoKKyAgICAgICAgICAgIGlmIHNlbGY6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sICd4ICUgMCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihEaXZpc2lvblVuZGVmaW5lZCwgJzAgJSAwJykKKworICAgICAgICByZW1haW5kZXIgPSBzZWxmLl9kaXZpZGUob3RoZXIsIGNvbnRleHQpWzFdCisgICAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci5fZml4KGNvbnRleHQpCisgICAgICAgIHJldHVybiByZW1haW5kZXIKKworICAgIGRlZiBfX3Jtb2RfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiU3dhcHMgc2VsZi9vdGhlciBhbmQgcmV0dXJucyBfX21vZF9fLiIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorICAgICAgICByZXR1cm4gb3RoZXIuX19tb2RfXyhzZWxmLCBjb250ZXh0PWNvbnRleHQpCisKKyAgICBkZWYgcmVtYWluZGVyX25lYXIoc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBSZW1haW5kZXIgbmVhcmVzdCB0byAwLSAgYWJzKHJlbWFpbmRlci1uZWFyKSA8PSBvdGhlci8yCisgICAgICAgICIiIgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorCisgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICAjIHNlbGYgPT0gKy8taW5maW5pdHkgLT4gSW52YWxpZE9wZXJhdGlvbgorICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVtYWluZGVyX25lYXIoaW5maW5pdHksIHgpJykKKworICAgICAgICAjIG90aGVyID09IDAgLT4gZWl0aGVyIEludmFsaWRPcGVyYXRpb24gb3IgRGl2aXNpb25VbmRlZmluZWQKKyAgICAgICAgaWYgbm90IG90aGVyOgorICAgICAgICAgICAgaWYgc2VsZjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbWFpbmRlcl9uZWFyKHgsIDApJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKERpdmlzaW9uVW5kZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVtYWluZGVyX25lYXIoMCwgMCknKQorCisgICAgICAgICMgb3RoZXIgPSArLy1pbmZpbml0eSAtPiByZW1haW5kZXIgPSBzZWxmCisgICAgICAgIGlmIG90aGVyLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICBhbnMgPSBEZWNpbWFsKHNlbGYpCisgICAgICAgICAgICByZXR1cm4gYW5zLl9maXgoY29udGV4dCkKKworICAgICAgICAjIHNlbGYgPSAwIC0+IHJlbWFpbmRlciA9IHNlbGYsIHdpdGggaWRlYWwgZXhwb25lbnQKKyAgICAgICAgaWRlYWxfZXhwb25lbnQgPSBtaW4oc2VsZi5fZXhwLCBvdGhlci5fZXhwKQorICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUoc2VsZi5fc2lnbiwgJzAnLCBpZGVhbF9leHBvbmVudCkKKyAgICAgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgICAgICMgY2F0Y2ggbW9zdCBjYXNlcyBvZiBsYXJnZSBvciBzbWFsbCBxdW90aWVudAorICAgICAgICBleHBkaWZmID0gc2VsZi5hZGp1c3RlZCgpIC0gb3RoZXIuYWRqdXN0ZWQoKQorICAgICAgICBpZiBleHBkaWZmID49IGNvbnRleHQucHJlYyArIDE6CisgICAgICAgICAgICAjIGV4cGRpZmYgPj0gcHJlYysxID0+IGFicyhzZWxmL290aGVyKSA+IDEwKipwcmVjCisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoRGl2aXNpb25JbXBvc3NpYmxlKQorICAgICAgICBpZiBleHBkaWZmIDw9IC0yOgorICAgICAgICAgICAgIyBleHBkaWZmIDw9IC0yID0+IGFicyhzZWxmL290aGVyKSA8IDAuMQorICAgICAgICAgICAgYW5zID0gc2VsZi5fcmVzY2FsZShpZGVhbF9leHBvbmVudCwgY29udGV4dC5yb3VuZGluZykKKyAgICAgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgICAgICMgYWRqdXN0IGJvdGggYXJndW1lbnRzIHRvIGhhdmUgdGhlIHNhbWUgZXhwb25lbnQsIHRoZW4gZGl2aWRlCisgICAgICAgIG9wMSA9IF9Xb3JrUmVwKHNlbGYpCisgICAgICAgIG9wMiA9IF9Xb3JrUmVwKG90aGVyKQorICAgICAgICBpZiBvcDEuZXhwID49IG9wMi5leHA6CisgICAgICAgICAgICBvcDEuaW50ICo9IDEwKioob3AxLmV4cCAtIG9wMi5leHApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcDIuaW50ICo9IDEwKioob3AyLmV4cCAtIG9wMS5leHApCisgICAgICAgIHEsIHIgPSBkaXZtb2Qob3AxLmludCwgb3AyLmludCkKKyAgICAgICAgIyByZW1haW5kZXIgaXMgcioxMCoqaWRlYWxfZXhwb25lbnQ7IG90aGVyIGlzICsvLW9wMi5pbnQgKgorICAgICAgICAjIDEwKippZGVhbF9leHBvbmVudC4gICBBcHBseSBjb3JyZWN0aW9uIHRvIGVuc3VyZSB0aGF0CisgICAgICAgICMgYWJzKHJlbWFpbmRlcikgPD0gYWJzKG90aGVyKS8yCisgICAgICAgIGlmIDIqciArIChxJjEpID4gb3AyLmludDoKKyAgICAgICAgICAgIHIgLT0gb3AyLmludAorICAgICAgICAgICAgcSArPSAxCisKKyAgICAgICAgaWYgcSA+PSAxMCoqY29udGV4dC5wcmVjOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKERpdmlzaW9uSW1wb3NzaWJsZSkKKworICAgICAgICAjIHJlc3VsdCBoYXMgc2FtZSBzaWduIGFzIHNlbGYgdW5sZXNzIHIgaXMgbmVnYXRpdmUKKyAgICAgICAgc2lnbiA9IHNlbGYuX3NpZ24KKyAgICAgICAgaWYgciA8IDA6CisgICAgICAgICAgICBzaWduID0gMS1zaWduCisgICAgICAgICAgICByID0gLXIKKworICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKHNpZ24sIHN0cihyKSwgaWRlYWxfZXhwb25lbnQpCisgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgZGVmIF9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIic2VsZiAvLyBvdGhlciIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgaWYgb3RoZXIuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJ0lORiAvLyBJTkYnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gX1NpZ25lZEluZmluaXR5W3NlbGYuX3NpZ24gXiBvdGhlci5fc2lnbl0KKworICAgICAgICBpZiBub3Qgb3RoZXI6CisgICAgICAgICAgICBpZiBzZWxmOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihEaXZpc2lvbkJ5WmVybywgJ3ggLy8gMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NpZ24gXiBvdGhlci5fc2lnbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKERpdmlzaW9uVW5kZWZpbmVkLCAnMCAvLyAwJykKKworICAgICAgICByZXR1cm4gc2VsZi5fZGl2aWRlKG90aGVyLCBjb250ZXh0KVswXQorCisgICAgZGVmIF9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlN3YXBzIHNlbGYvb3RoZXIgYW5kIHJldHVybnMgX19mbG9vcmRpdl9fLiIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorICAgICAgICByZXR1cm4gb3RoZXIuX19mbG9vcmRpdl9fKHNlbGYsIGNvbnRleHQ9Y29udGV4dCkKKworICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICIiIkZsb2F0IHJlcHJlc2VudGF0aW9uLiIiIgorICAgICAgICBpZiBzZWxmLl9pc25hbigpOgorICAgICAgICAgICAgaWYgc2VsZi5pc19zbmFuKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IGNvbnZlcnQgc2lnbmFsaW5nIE5hTiB0byBmbG9hdCIpCisgICAgICAgICAgICBzID0gIi1uYW4iIGlmIHNlbGYuX3NpZ24gZWxzZSAibmFuIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9IHN0cihzZWxmKQorICAgICAgICByZXR1cm4gZmxvYXQocykKKworICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAiIiJDb252ZXJ0cyBzZWxmIHRvIGFuIGludCwgdHJ1bmNhdGluZyBpZiBuZWNlc3NhcnkuIiIiCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBpZiBzZWxmLl9pc25hbigpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBjb252ZXJ0IE5hTiB0byBpbnRlZ2VyIikKKyAgICAgICAgICAgIGVsaWYgc2VsZi5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoIkNhbm5vdCBjb252ZXJ0IGluZmluaXR5IHRvIGludGVnZXIiKQorICAgICAgICBzID0gKC0xKSoqc2VsZi5fc2lnbgorICAgICAgICBpZiBzZWxmLl9leHAgPj0gMDoKKyAgICAgICAgICAgIHJldHVybiBzKmludChzZWxmLl9pbnQpKjEwKipzZWxmLl9leHAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzKmludChzZWxmLl9pbnRbOnNlbGYuX2V4cF0gb3IgJzAnKQorCisgICAgX190cnVuY19fID0gX19pbnRfXworCisgICAgZGVmIHJlYWwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisgICAgcmVhbCA9IHByb3BlcnR5KHJlYWwpCisKKyAgICBkZWYgaW1hZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIERlY2ltYWwoMCkKKyAgICBpbWFnID0gcHJvcGVydHkoaW1hZykKKworICAgIGRlZiBjb25qdWdhdGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19jb21wbGV4X18oc2VsZik6CisgICAgICAgIHJldHVybiBjb21wbGV4KGZsb2F0KHNlbGYpKQorCisgICAgZGVmIF9fbG9uZ19fKHNlbGYpOgorICAgICAgICAiIiJDb252ZXJ0cyB0byBhIGxvbmcuCisKKyAgICAgICAgRXF1aXZhbGVudCB0byBsb25nKGludChzZWxmKSkKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBsb25nKHNlbGYuX19pbnRfXygpKQorCisgICAgZGVmIF9maXhfbmFuKHNlbGYsIGNvbnRleHQpOgorICAgICAgICAiIiJEZWNhcGl0YXRlIHRoZSBwYXlsb2FkIG9mIGEgTmFOIHRvIGZpdCB0aGUgY29udGV4dCIiIgorICAgICAgICBwYXlsb2FkID0gc2VsZi5faW50CisKKyAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiBwYXlsb2FkIGlzIHByZWNpc2lvbiBpZiBfY2xhbXA9MCwKKyAgICAgICAgIyBwcmVjaXNpb24tMSBpZiBfY2xhbXA9MS4KKyAgICAgICAgbWF4X3BheWxvYWRfbGVuID0gY29udGV4dC5wcmVjIC0gY29udGV4dC5fY2xhbXAKKyAgICAgICAgaWYgbGVuKHBheWxvYWQpID4gbWF4X3BheWxvYWRfbGVuOgorICAgICAgICAgICAgcGF5bG9hZCA9IHBheWxvYWRbbGVuKHBheWxvYWQpLW1heF9wYXlsb2FkX2xlbjpdLmxzdHJpcCgnMCcpCisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLCBwYXlsb2FkLCBzZWxmLl9leHAsIFRydWUpCisgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpCisKKyAgICBkZWYgX2ZpeChzZWxmLCBjb250ZXh0KToKKyAgICAgICAgIiIiUm91bmQgaWYgaXQgaXMgbmVjZXNzYXJ5IHRvIGtlZXAgc2VsZiB3aXRoaW4gcHJlYyBwcmVjaXNpb24uCisKKyAgICAgICAgUm91bmRzIGFuZCBmaXhlcyB0aGUgZXhwb25lbnQuICBEb2VzIG5vdCByYWlzZSBvbiBhIHNOYU4uCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICBzZWxmIC0gRGVjaW1hbCBpbnN0YW5jZQorICAgICAgICBjb250ZXh0IC0gY29udGV4dCB1c2VkLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgaWYgc2VsZi5faXNuYW4oKToKKyAgICAgICAgICAgICAgICAjIGRlY2FwaXRhdGUgcGF5bG9hZCBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZml4X25hbihjb250ZXh0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHNlbGYgaXMgKy8tSW5maW5pdHk7IHJldHVybiB1bmFsdGVyZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gRGVjaW1hbChzZWxmKQorCisgICAgICAgICMgaWYgc2VsZiBpcyB6ZXJvIHRoZW4gZXhwb25lbnQgc2hvdWxkIGJlIGJldHdlZW4gRXRpbnkgYW5kCisgICAgICAgICMgRW1heCBpZiBfY2xhbXA9PTAsIGFuZCBiZXR3ZWVuIEV0aW55IGFuZCBFdG9wIGlmIF9jbGFtcD09MS4KKyAgICAgICAgRXRpbnkgPSBjb250ZXh0LkV0aW55KCkKKyAgICAgICAgRXRvcCA9IGNvbnRleHQuRXRvcCgpCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgZXhwX21heCA9IFtjb250ZXh0LkVtYXgsIEV0b3BdW2NvbnRleHQuX2NsYW1wXQorICAgICAgICAgICAgbmV3X2V4cCA9IG1pbihtYXgoc2VsZi5fZXhwLCBFdGlueSksIGV4cF9tYXgpCisgICAgICAgICAgICBpZiBuZXdfZXhwICE9IHNlbGYuX2V4cDoKKyAgICAgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihDbGFtcGVkKQorICAgICAgICAgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKHNlbGYuX3NpZ24sICcwJywgbmV3X2V4cCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikKKworICAgICAgICAjIGV4cF9taW4gaXMgdGhlIHNtYWxsZXN0IGFsbG93YWJsZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0LAorICAgICAgICAjIGVxdWFsIHRvIG1heChzZWxmLmFkanVzdGVkKCktY29udGV4dC5wcmVjKzEsIEV0aW55KQorICAgICAgICBleHBfbWluID0gbGVuKHNlbGYuX2ludCkgKyBzZWxmLl9leHAgLSBjb250ZXh0LnByZWMKKyAgICAgICAgaWYgZXhwX21pbiA+IEV0b3A6CisgICAgICAgICAgICAjIG92ZXJmbG93OiBleHBfbWluID4gRXRvcCBpZmYgc2VsZi5hZGp1c3RlZCgpID4gRW1heAorICAgICAgICAgICAgYW5zID0gY29udGV4dC5fcmFpc2VfZXJyb3IoT3ZlcmZsb3csICdhYm92ZSBFbWF4Jywgc2VsZi5fc2lnbikKKyAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKEluZXhhY3QpCisgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihSb3VuZGVkKQorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgIHNlbGZfaXNfc3Vibm9ybWFsID0gZXhwX21pbiA8IEV0aW55CisgICAgICAgIGlmIHNlbGZfaXNfc3Vibm9ybWFsOgorICAgICAgICAgICAgZXhwX21pbiA9IEV0aW55CisKKyAgICAgICAgIyByb3VuZCBpZiBzZWxmIGhhcyB0b28gbWFueSBkaWdpdHMKKyAgICAgICAgaWYgc2VsZi5fZXhwIDwgZXhwX21pbjoKKyAgICAgICAgICAgIGRpZ2l0cyA9IGxlbihzZWxmLl9pbnQpICsgc2VsZi5fZXhwIC0gZXhwX21pbgorICAgICAgICAgICAgaWYgZGlnaXRzIDwgMDoKKyAgICAgICAgICAgICAgICBzZWxmID0gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLCAnMScsIGV4cF9taW4tMSkKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSAwCisgICAgICAgICAgICByb3VuZGluZ19tZXRob2QgPSBzZWxmLl9waWNrX3JvdW5kaW5nX2Z1bmN0aW9uW2NvbnRleHQucm91bmRpbmddCisgICAgICAgICAgICBjaGFuZ2VkID0gcm91bmRpbmdfbWV0aG9kKHNlbGYsIGRpZ2l0cykKKyAgICAgICAgICAgIGNvZWZmID0gc2VsZi5faW50WzpkaWdpdHNdIG9yICcwJworICAgICAgICAgICAgaWYgY2hhbmdlZCA+IDA6CisgICAgICAgICAgICAgICAgY29lZmYgPSBzdHIoaW50KGNvZWZmKSsxKQorICAgICAgICAgICAgICAgIGlmIGxlbihjb2VmZikgPiBjb250ZXh0LnByZWM6CisgICAgICAgICAgICAgICAgICAgIGNvZWZmID0gY29lZmZbOi0xXQorICAgICAgICAgICAgICAgICAgICBleHBfbWluICs9IDEKKworICAgICAgICAgICAgIyBjaGVjayB3aGV0aGVyIHRoZSByb3VuZGluZyBwdXNoZWQgdGhlIGV4cG9uZW50IG91dCBvZiByYW5nZQorICAgICAgICAgICAgaWYgZXhwX21pbiA+IEV0b3A6CisgICAgICAgICAgICAgICAgYW5zID0gY29udGV4dC5fcmFpc2VfZXJyb3IoT3ZlcmZsb3csICdhYm92ZSBFbWF4Jywgc2VsZi5fc2lnbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLCBjb2VmZiwgZXhwX21pbikKKworICAgICAgICAgICAgIyByYWlzZSB0aGUgYXBwcm9wcmlhdGUgc2lnbmFscywgdGFraW5nIGNhcmUgdG8gcmVzcGVjdAorICAgICAgICAgICAgIyB0aGUgcHJlY2VkZW5jZSBkZXNjcmliZWQgaW4gdGhlIHNwZWNpZmljYXRpb24KKyAgICAgICAgICAgIGlmIGNoYW5nZWQgYW5kIHNlbGZfaXNfc3Vibm9ybWFsOgorICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKFVuZGVyZmxvdykKKyAgICAgICAgICAgIGlmIHNlbGZfaXNfc3Vibm9ybWFsOgorICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKFN1Ym5vcm1hbCkKKyAgICAgICAgICAgIGlmIGNoYW5nZWQ6CisgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoSW5leGFjdCkKKyAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKFJvdW5kZWQpCisgICAgICAgICAgICBpZiBub3QgYW5zOgorICAgICAgICAgICAgICAgICMgcmFpc2UgQ2xhbXBlZCBvbiB1bmRlcmZsb3cgdG8gMAorICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKENsYW1wZWQpCisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgaWYgc2VsZl9pc19zdWJub3JtYWw6CisgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihTdWJub3JtYWwpCisKKyAgICAgICAgIyBmb2xkIGRvd24gaWYgX2NsYW1wID09IDEgYW5kIHNlbGYgaGFzIHRvbyBmZXcgZGlnaXRzCisgICAgICAgIGlmIGNvbnRleHQuX2NsYW1wID09IDEgYW5kIHNlbGYuX2V4cCA+IEV0b3A6CisgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihDbGFtcGVkKQorICAgICAgICAgICAgc2VsZl9wYWRkZWQgPSBzZWxmLl9pbnQgKyAnMCcqKHNlbGYuX2V4cCAtIEV0b3ApCisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLCBzZWxmX3BhZGRlZCwgRXRvcCkKKworICAgICAgICAjIGhlcmUgc2VsZiB3YXMgcmVwcmVzZW50YWJsZSB0byBiZWdpbiB3aXRoOyByZXR1cm4gdW5jaGFuZ2VkCisgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpCisKKyAgICAjIGZvciBlYWNoIG9mIHRoZSByb3VuZGluZyBmdW5jdGlvbnMgYmVsb3c6CisgICAgIyAgIHNlbGYgaXMgYSBmaW5pdGUsIG5vbnplcm8gRGVjaW1hbAorICAgICMgICBwcmVjIGlzIGFuIGludGVnZXIgc2F0aXNmeWluZyAwIDw9IHByZWMgPCBsZW4oc2VsZi5faW50KQorICAgICMKKyAgICAjIGVhY2ggZnVuY3Rpb24gcmV0dXJucyBlaXRoZXIgLTEsIDAsIG9yIDEsIGFzIGZvbGxvd3M6CisgICAgIyAgIDEgaW5kaWNhdGVzIHRoYXQgc2VsZiBzaG91bGQgYmUgcm91bmRlZCB1cCAoYXdheSBmcm9tIHplcm8pCisgICAgIyAgIDAgaW5kaWNhdGVzIHRoYXQgc2VsZiBzaG91bGQgYmUgdHJ1bmNhdGVkLCBhbmQgdGhhdCBhbGwgdGhlCisgICAgIyAgICAgZGlnaXRzIHRvIGJlIHRydW5jYXRlZCBhcmUgemVyb3MgKHNvIHRoZSB2YWx1ZSBpcyB1bmNoYW5nZWQpCisgICAgIyAgLTEgaW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG5vbnplcm8gZGlnaXRzIHRvIGJlIHRydW5jYXRlZAorCisgICAgZGVmIF9yb3VuZF9kb3duKHNlbGYsIHByZWMpOgorICAgICAgICAiIiJBbHNvIGtub3duIGFzIHJvdW5kLXRvd2FyZHMtMCwgdHJ1bmNhdGUuIiIiCisgICAgICAgIGlmIF9hbGxfemVyb3Moc2VsZi5faW50LCBwcmVjKToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gLTEKKworICAgIGRlZiBfcm91bmRfdXAoc2VsZiwgcHJlYyk6CisgICAgICAgICIiIlJvdW5kcyBhd2F5IGZyb20gMC4iIiIKKyAgICAgICAgcmV0dXJuIC1zZWxmLl9yb3VuZF9kb3duKHByZWMpCisKKyAgICBkZWYgX3JvdW5kX2hhbGZfdXAoc2VsZiwgcHJlYyk6CisgICAgICAgICIiIlJvdW5kcyA1IHVwIChhd2F5IGZyb20gMCkiIiIKKyAgICAgICAgaWYgc2VsZi5faW50W3ByZWNdIGluICc1Njc4OSc6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbGlmIF9hbGxfemVyb3Moc2VsZi5faW50LCBwcmVjKToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gLTEKKworICAgIGRlZiBfcm91bmRfaGFsZl9kb3duKHNlbGYsIHByZWMpOgorICAgICAgICAiIiJSb3VuZCA1IGRvd24iIiIKKyAgICAgICAgaWYgX2V4YWN0X2hhbGYoc2VsZi5faW50LCBwcmVjKToKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JvdW5kX2hhbGZfdXAocHJlYykKKworICAgIGRlZiBfcm91bmRfaGFsZl9ldmVuKHNlbGYsIHByZWMpOgorICAgICAgICAiIiJSb3VuZCA1IHRvIGV2ZW4sIHJlc3QgdG8gbmVhcmVzdC4iIiIKKyAgICAgICAgaWYgX2V4YWN0X2hhbGYoc2VsZi5faW50LCBwcmVjKSBhbmQgXAorICAgICAgICAgICAgICAgIChwcmVjID09IDAgb3Igc2VsZi5faW50W3ByZWMtMV0gaW4gJzAyNDY4Jyk6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yb3VuZF9oYWxmX3VwKHByZWMpCisKKyAgICBkZWYgX3JvdW5kX2NlaWxpbmcoc2VsZiwgcHJlYyk6CisgICAgICAgICIiIlJvdW5kcyB1cCAobm90IGF3YXkgZnJvbSAwIGlmIG5lZ2F0aXZlLikiIiIKKyAgICAgICAgaWYgc2VsZi5fc2lnbjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yb3VuZF9kb3duKHByZWMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gLXNlbGYuX3JvdW5kX2Rvd24ocHJlYykKKworICAgIGRlZiBfcm91bmRfZmxvb3Ioc2VsZiwgcHJlYyk6CisgICAgICAgICIiIlJvdW5kcyBkb3duIChub3QgdG93YXJkcyAwIGlmIG5lZ2F0aXZlKSIiIgorICAgICAgICBpZiBub3Qgc2VsZi5fc2lnbjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yb3VuZF9kb3duKHByZWMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gLXNlbGYuX3JvdW5kX2Rvd24ocHJlYykKKworICAgIGRlZiBfcm91bmRfMDV1cChzZWxmLCBwcmVjKToKKyAgICAgICAgIiIiUm91bmQgZG93biB1bmxlc3MgZGlnaXQgcHJlYy0xIGlzIDAgb3IgNS4iIiIKKyAgICAgICAgaWYgcHJlYyBhbmQgc2VsZi5faW50W3ByZWMtMV0gbm90IGluICcwNSc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcm91bmRfZG93bihwcmVjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIC1zZWxmLl9yb3VuZF9kb3duKHByZWMpCisKKyAgICBfcGlja19yb3VuZGluZ19mdW5jdGlvbiA9IGRpY3QoCisgICAgICAgIFJPVU5EX0RPV04gPSBfcm91bmRfZG93biwKKyAgICAgICAgUk9VTkRfVVAgPSBfcm91bmRfdXAsCisgICAgICAgIFJPVU5EX0hBTEZfVVAgPSBfcm91bmRfaGFsZl91cCwKKyAgICAgICAgUk9VTkRfSEFMRl9ET1dOID0gX3JvdW5kX2hhbGZfZG93biwKKyAgICAgICAgUk9VTkRfSEFMRl9FVkVOID0gX3JvdW5kX2hhbGZfZXZlbiwKKyAgICAgICAgUk9VTkRfQ0VJTElORyA9IF9yb3VuZF9jZWlsaW5nLAorICAgICAgICBST1VORF9GTE9PUiA9IF9yb3VuZF9mbG9vciwKKyAgICAgICAgUk9VTkRfMDVVUCA9IF9yb3VuZF8wNXVwLAorICAgICkKKworICAgIGRlZiBmbWEoc2VsZiwgb3RoZXIsIHRoaXJkLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJGdXNlZCBtdWx0aXBseS1hZGQuCisKKyAgICAgICAgUmV0dXJucyBzZWxmKm90aGVyK3RoaXJkIHdpdGggbm8gcm91bmRpbmcgb2YgdGhlIGludGVybWVkaWF0ZQorICAgICAgICBwcm9kdWN0IHNlbGYqb3RoZXIuCisKKyAgICAgICAgc2VsZiBhbmQgb3RoZXIgYXJlIG11bHRpcGxpZWQgdG9nZXRoZXIsIHdpdGggbm8gcm91bmRpbmcgb2YKKyAgICAgICAgdGhlIHJlc3VsdC4gIFRoZSB0aGlyZCBvcGVyYW5kIGlzIHRoZW4gYWRkZWQgdG8gdGhlIHJlc3VsdCwKKyAgICAgICAgYW5kIGEgc2luZ2xlIGZpbmFsIHJvdW5kaW5nIGlzIHBlcmZvcm1lZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorCisgICAgICAgICMgY29tcHV0ZSBwcm9kdWN0OyByYWlzZSBJbnZhbGlkT3BlcmF0aW9uIGlmIGVpdGhlciBvcGVyYW5kIGlzCisgICAgICAgICMgYSBzaWduYWxpbmcgTmFOIG9yIGlmIHRoZSBwcm9kdWN0IGlzIHplcm8gdGltZXMgaW5maW5pdHkuCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWwgb3Igb3RoZXIuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorICAgICAgICAgICAgaWYgc2VsZi5fZXhwID09ICdOJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJ3NOYU4nLCBzZWxmKQorICAgICAgICAgICAgaWYgb3RoZXIuX2V4cCA9PSAnTic6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sICdzTmFOJywgb3RoZXIpCisgICAgICAgICAgICBpZiBzZWxmLl9leHAgPT0gJ24nOgorICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBzZWxmCisgICAgICAgICAgICBlbGlmIG90aGVyLl9leHAgPT0gJ24nOgorICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBvdGhlcgorICAgICAgICAgICAgZWxpZiBzZWxmLl9leHAgPT0gJ0YnOgorICAgICAgICAgICAgICAgIGlmIG5vdCBvdGhlcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSU5GICogMCBpbiBmbWEnKQorICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBfU2lnbmVkSW5maW5pdHlbc2VsZi5fc2lnbiBeIG90aGVyLl9zaWduXQorICAgICAgICAgICAgZWxpZiBvdGhlci5fZXhwID09ICdGJzoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMCAqIElORiBpbiBmbWEnKQorICAgICAgICAgICAgICAgIHByb2R1Y3QgPSBfU2lnbmVkSW5maW5pdHlbc2VsZi5fc2lnbiBeIG90aGVyLl9zaWduXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJvZHVjdCA9IF9kZWNfZnJvbV90cmlwbGUoc2VsZi5fc2lnbiBeIG90aGVyLl9zaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKGludChzZWxmLl9pbnQpICogaW50KG90aGVyLl9pbnQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2V4cCArIG90aGVyLl9leHApCisKKyAgICAgICAgdGhpcmQgPSBfY29udmVydF9vdGhlcih0aGlyZCwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gcHJvZHVjdC5fX2FkZF9fKHRoaXJkLCBjb250ZXh0KQorCisgICAgZGVmIF9wb3dlcl9tb2R1bG8oc2VsZiwgb3RoZXIsIG1vZHVsbywgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiVGhyZWUgYXJndW1lbnQgdmVyc2lvbiBvZiBfX3Bvd19fIiIiCisKKyAgICAgICAgIyBpZiBjYW4ndCBjb252ZXJ0IG90aGVyIGFuZCBtb2R1bG8gdG8gRGVjaW1hbCwgcmFpc2UKKyAgICAgICAgIyBUeXBlRXJyb3I7IHRoZXJlJ3Mgbm8gcG9pbnQgcmV0dXJuaW5nIE5vdEltcGxlbWVudGVkIChubworICAgICAgICAjIGVxdWl2YWxlbnQgb2YgX19ycG93X18gZm9yIHRocmVlIGFyZ3VtZW50IHBvdykKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorICAgICAgICBtb2R1bG8gPSBfY29udmVydF9vdGhlcihtb2R1bG8sIHJhaXNlaXQ9VHJ1ZSkKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgIyBkZWFsIHdpdGggTmFOczogaWYgdGhlcmUgYXJlIGFueSBzTmFOcyB0aGVuIGZpcnN0IG9uZSB3aW5zLAorICAgICAgICAjIChpLmUuIGJlaGF2aW91ciBmb3IgTmFOcyBpcyBpZGVudGljYWwgdG8gdGhhdCBvZiBmbWEpCisgICAgICAgIHNlbGZfaXNfbmFuID0gc2VsZi5faXNuYW4oKQorICAgICAgICBvdGhlcl9pc19uYW4gPSBvdGhlci5faXNuYW4oKQorICAgICAgICBtb2R1bG9faXNfbmFuID0gbW9kdWxvLl9pc25hbigpCisgICAgICAgIGlmIHNlbGZfaXNfbmFuIG9yIG90aGVyX2lzX25hbiBvciBtb2R1bG9faXNfbmFuOgorICAgICAgICAgICAgaWYgc2VsZl9pc19uYW4gPT0gMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJ3NOYU4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCisgICAgICAgICAgICBpZiBvdGhlcl9pc19uYW4gPT0gMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJ3NOYU4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyKQorICAgICAgICAgICAgaWYgbW9kdWxvX2lzX25hbiA9PSAyOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnc05hTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxvKQorICAgICAgICAgICAgaWYgc2VsZl9pc19uYW46CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeF9uYW4oY29udGV4dCkKKyAgICAgICAgICAgIGlmIG90aGVyX2lzX25hbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIuX2ZpeF9uYW4oY29udGV4dCkKKyAgICAgICAgICAgIHJldHVybiBtb2R1bG8uX2ZpeF9uYW4oY29udGV4dCkKKworICAgICAgICAjIGNoZWNrIGlucHV0czogd2UgYXBwbHkgc2FtZSByZXN0cmljdGlvbnMgYXMgUHl0aG9uJ3MgcG93KCkKKyAgICAgICAgaWYgbm90IChzZWxmLl9pc2ludGVnZXIoKSBhbmQKKyAgICAgICAgICAgICAgICBvdGhlci5faXNpbnRlZ2VyKCkgYW5kCisgICAgICAgICAgICAgICAgbW9kdWxvLl9pc2ludGVnZXIoKSk6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncG93KCkgM3JkIGFyZ3VtZW50IG5vdCBhbGxvd2VkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5sZXNzIGFsbCBhcmd1bWVudHMgYXJlIGludGVnZXJzJykKKyAgICAgICAgaWYgb3RoZXIgPCAwOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvdygpIDJuZCBhcmd1bWVudCBjYW5ub3QgYmUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZWdhdGl2ZSB3aGVuIDNyZCBhcmd1bWVudCBzcGVjaWZpZWQnKQorICAgICAgICBpZiBub3QgbW9kdWxvOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvdygpIDNyZCBhcmd1bWVudCBjYW5ub3QgYmUgMCcpCisKKyAgICAgICAgIyBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIGZvciBkZWNpbWFsOiB0aGUgbW9kdWx1cyBtdXN0IGJlIGxlc3MKKyAgICAgICAgIyB0aGFuIDEwKipwcmVjIGluIGFic29sdXRlIHZhbHVlCisgICAgICAgIGlmIG1vZHVsby5hZGp1c3RlZCgpID49IGNvbnRleHQucHJlYzoKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnN1ZmZpY2llbnQgcHJlY2lzaW9uOiBwb3coKSAzcmQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmd1bWVudCBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZWNpc2lvbiBkaWdpdHMnKQorCisgICAgICAgICMgZGVmaW5lIDAqKjAgPT0gTmFOLCBmb3IgY29uc2lzdGVuY3kgd2l0aCB0d28tYXJndW1lbnQgcG93CisgICAgICAgICMgKGV2ZW4gdGhvdWdoIGl0IGh1cnRzISkKKyAgICAgICAgaWYgbm90IG90aGVyIGFuZCBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhdCBsZWFzdCBvbmUgb2YgcG93KCkgMXN0IGFyZ3VtZW50ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5kIDJuZCBhcmd1bWVudCBtdXN0IGJlIG5vbnplcm8gOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMCoqMCBpcyBub3QgZGVmaW5lZCcpCisKKyAgICAgICAgIyBjb21wdXRlIHNpZ24gb2YgcmVzdWx0CisgICAgICAgIGlmIG90aGVyLl9pc2V2ZW4oKToKKyAgICAgICAgICAgIHNpZ24gPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaWduID0gc2VsZi5fc2lnbgorCisgICAgICAgICMgY29udmVydCBtb2R1bG8gdG8gYSBQeXRob24gaW50ZWdlciwgYW5kIHNlbGYgYW5kIG90aGVyIHRvCisgICAgICAgICMgRGVjaW1hbCBpbnRlZ2VycyAoaS5lLiBmb3JjZSB0aGVpciBleHBvbmVudHMgdG8gYmUgPj0gMCkKKyAgICAgICAgbW9kdWxvID0gYWJzKGludChtb2R1bG8pKQorICAgICAgICBiYXNlID0gX1dvcmtSZXAoc2VsZi50b19pbnRlZ3JhbF92YWx1ZSgpKQorICAgICAgICBleHBvbmVudCA9IF9Xb3JrUmVwKG90aGVyLnRvX2ludGVncmFsX3ZhbHVlKCkpCisKKyAgICAgICAgIyBjb21wdXRlIHJlc3VsdCB1c2luZyBpbnRlZ2VyIHBvdygpCisgICAgICAgIGJhc2UgPSAoYmFzZS5pbnQgJSBtb2R1bG8gKiBwb3coMTAsIGJhc2UuZXhwLCBtb2R1bG8pKSAlIG1vZHVsbworICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoZXhwb25lbnQuZXhwKToKKyAgICAgICAgICAgIGJhc2UgPSBwb3coYmFzZSwgMTAsIG1vZHVsbykKKyAgICAgICAgYmFzZSA9IHBvdyhiYXNlLCBleHBvbmVudC5pbnQsIG1vZHVsbykKKworICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShzaWduLCBzdHIoYmFzZSksIDApCisKKyAgICBkZWYgX3Bvd2VyX2V4YWN0KHNlbGYsIG90aGVyLCBwKToKKyAgICAgICAgIiIiQXR0ZW1wdCB0byBjb21wdXRlIHNlbGYqKm90aGVyIGV4YWN0bHkuCisKKyAgICAgICAgR2l2ZW4gRGVjaW1hbHMgc2VsZiBhbmQgb3RoZXIgYW5kIGFuIGludGVnZXIgcCwgYXR0ZW1wdCB0bworICAgICAgICBjb21wdXRlIGFuIGV4YWN0IHJlc3VsdCBmb3IgdGhlIHBvd2VyIHNlbGYqKm90aGVyLCB3aXRoIHAKKyAgICAgICAgZGlnaXRzIG9mIHByZWNpc2lvbi4gIFJldHVybiBOb25lIGlmIHNlbGYqKm90aGVyIGlzIG5vdAorICAgICAgICBleGFjdGx5IHJlcHJlc2VudGFibGUgaW4gcCBkaWdpdHMuCisKKyAgICAgICAgQXNzdW1lcyB0aGF0IGVsaW1pbmF0aW9uIG9mIHNwZWNpYWwgY2FzZXMgaGFzIGFscmVhZHkgYmVlbgorICAgICAgICBwZXJmb3JtZWQ6IHNlbGYgYW5kIG90aGVyIG11c3QgYm90aCBiZSBub25zcGVjaWFsOyBzZWxmIG11c3QKKyAgICAgICAgYmUgcG9zaXRpdmUgYW5kIG5vdCBudW1lcmljYWxseSBlcXVhbCB0byAxOyBvdGhlciBtdXN0IGJlCisgICAgICAgIG5vbnplcm8uICBGb3IgZWZmaWNpZW5jeSwgb3RoZXIuX2V4cCBzaG91bGQgbm90IGJlIHRvbyBsYXJnZSwKKyAgICAgICAgc28gdGhhdCAxMCoqYWJzKG90aGVyLl9leHApIGlzIGEgZmVhc2libGUgY2FsY3VsYXRpb24uIiIiCisKKyAgICAgICAgIyBJbiB0aGUgY29tbWVudHMgYmVsb3csIHdlIHdyaXRlIHggZm9yIHRoZSB2YWx1ZSBvZiBzZWxmIGFuZCB5IGZvciB0aGUKKyAgICAgICAgIyB2YWx1ZSBvZiBvdGhlci4gIFdyaXRlIHggPSB4YyoxMCoqeGUgYW5kIGFicyh5KSA9IHljKjEwKip5ZSwgd2l0aCB4YworICAgICAgICAjIGFuZCB5YyBwb3NpdGl2ZSBpbnRlZ2VycyBub3QgZGl2aXNpYmxlIGJ5IDEwLgorCisgICAgICAgICMgVGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBpZGVudGlmeSB0aGUgKmZhaWx1cmUqCisgICAgICAgICMgb2YgeCoqeSB0byBiZSBleGFjdGx5IHJlcHJlc2VudGFibGUgd2l0aCBhcyBsaXR0bGUgZWZmb3J0IGFzCisgICAgICAgICMgcG9zc2libGUuICBTbyB3ZSBsb29rIGZvciBjaGVhcCBhbmQgZWFzeSB0ZXN0cyB0aGF0CisgICAgICAgICMgZWxpbWluYXRlIHRoZSBwb3NzaWJpbGl0eSBvZiB4Kip5IGJlaW5nIGV4YWN0LiAgT25seSBpZiBhbGwKKyAgICAgICAgIyB0aGVzZSB0ZXN0cyBhcmUgcGFzc2VkIGRvIHdlIGdvIG9uIHRvIGFjdHVhbGx5IGNvbXB1dGUgeCoqeS4KKworICAgICAgICAjIEhlcmUncyB0aGUgbWFpbiBpZGVhLiAgRXhwcmVzcyB5IGFzIGEgcmF0aW9uYWwgbnVtYmVyIG0vbiwgd2l0aCBtIGFuZAorICAgICAgICAjIG4gcmVsYXRpdmVseSBwcmltZSBhbmQgbj4wLiAgVGhlbiBmb3IgeCoqeSB0byBiZSBleGFjdGx5CisgICAgICAgICMgcmVwcmVzZW50YWJsZSAoYXQgKmFueSogcHJlY2lzaW9uKSwgeGMgbXVzdCBiZSB0aGUgbnRoIHBvd2VyIG9mIGEKKyAgICAgICAgIyBwb3NpdGl2ZSBpbnRlZ2VyIGFuZCB4ZSBtdXN0IGJlIGRpdmlzaWJsZSBieSBuLiAgSWYgeSBpcyBuZWdhdGl2ZQorICAgICAgICAjIHRoZW4gYWRkaXRpb25hbGx5IHhjIG11c3QgYmUgYSBwb3dlciBvZiBlaXRoZXIgMiBvciA1LCBoZW5jZSBhIHBvd2VyCisgICAgICAgICMgb2YgMioqbiBvciA1KipuLgorICAgICAgICAjCisgICAgICAgICMgVGhlcmUncyBhIGxpbWl0IHRvIGhvdyBzbWFsbCB8eXwgY2FuIGJlOiBpZiB5PW0vbiBhcyBhYm92ZQorICAgICAgICAjIHRoZW46CisgICAgICAgICMKKyAgICAgICAgIyAgKDEpIGlmIHhjICE9IDEgdGhlbiBmb3IgdGhlIHJlc3VsdCB0byBiZSByZXByZXNlbnRhYmxlIHdlCisgICAgICAgICMgICAgICBuZWVkIHhjKiooMS9uKSA+PSAyLCBhbmQgaGVuY2UgYWxzbyB4YyoqfHl8ID49IDIuICBTbworICAgICAgICAjICAgICAgaWYgfHl8IDw9IDEvbmJpdHMoeGMpIHRoZW4geGMgPCAyKipuYml0cyh4YykgPD0KKyAgICAgICAgIyAgICAgIDIqKigxL3x5fCksIGhlbmNlIHhjKip8eXwgPCAyIGFuZCB0aGUgcmVzdWx0IGlzIG5vdAorICAgICAgICAjICAgICAgcmVwcmVzZW50YWJsZS4KKyAgICAgICAgIworICAgICAgICAjICAoMikgaWYgeGUgIT0gMCwgfHhlfCooMS9uKSA+PSAxLCBzbyB8eGV8Knx5fCA+PSAxLiAgSGVuY2UgaWYKKyAgICAgICAgIyAgICAgIHx5fCA8IDEvfHhlfCB0aGVuIHRoZSByZXN1bHQgaXMgbm90IHJlcHJlc2VudGFibGUuCisgICAgICAgICMKKyAgICAgICAgIyBOb3RlIHRoYXQgc2luY2UgeCBpcyBub3QgZXF1YWwgdG8gMSwgYXQgbGVhc3Qgb25lIG9mICgxKSBhbmQKKyAgICAgICAgIyAoMikgbXVzdCBhcHBseS4gIE5vdyB8eXwgPCAxL25iaXRzKHhjKSBpZmYgfHljfCpuYml0cyh4YykgPAorICAgICAgICAjIDEwKioteWUgaWZmIGxlbihzdHIofHljfCpuYml0cyh4YykpIDw9IC15ZS4KKyAgICAgICAgIworICAgICAgICAjIFRoZXJlJ3MgYWxzbyBhIGxpbWl0IHRvIGhvdyBsYXJnZSB5IGNhbiBiZSwgYXQgbGVhc3QgaWYgaXQncworICAgICAgICAjIHBvc2l0aXZlOiB0aGUgbm9ybWFsaXplZCByZXN1bHQgd2lsbCBoYXZlIGNvZWZmaWNpZW50IHhjKip5LAorICAgICAgICAjIHNvIGlmIGl0J3MgcmVwcmVzZW50YWJsZSB0aGVuIHhjKip5IDwgMTAqKnAsIGFuZCB5IDwKKyAgICAgICAgIyBwL2xvZzEwKHhjKS4gIEhlbmNlIGlmIHkqbG9nMTAoeGMpID49IHAgdGhlbiB0aGUgcmVzdWx0IGlzCisgICAgICAgICMgbm90IGV4YWN0bHkgcmVwcmVzZW50YWJsZS4KKworICAgICAgICAjIGlmIGxlbihzdHIoYWJzKHljKnhlKSkgPD0gLXllIHRoZW4gYWJzKHljKnhlKSA8IDEwKioteWUsCisgICAgICAgICMgc28gfHl8IDwgMS94ZSBhbmQgdGhlIHJlc3VsdCBpcyBub3QgcmVwcmVzZW50YWJsZS4KKyAgICAgICAgIyBTaW1pbGFybHksIGxlbihzdHIoYWJzKHljKSp4Y19iaXRzKSkgPD0gLXllIGltcGxpZXMgfHl8CisgICAgICAgICMgPCAxL25iaXRzKHhjKS4KKworICAgICAgICB4ID0gX1dvcmtSZXAoc2VsZikKKyAgICAgICAgeGMsIHhlID0geC5pbnQsIHguZXhwCisgICAgICAgIHdoaWxlIHhjICUgMTAgPT0gMDoKKyAgICAgICAgICAgIHhjIC8vPSAxMAorICAgICAgICAgICAgeGUgKz0gMQorCisgICAgICAgIHkgPSBfV29ya1JlcChvdGhlcikKKyAgICAgICAgeWMsIHllID0geS5pbnQsIHkuZXhwCisgICAgICAgIHdoaWxlIHljICUgMTAgPT0gMDoKKyAgICAgICAgICAgIHljIC8vPSAxMAorICAgICAgICAgICAgeWUgKz0gMQorCisgICAgICAgICMgY2FzZSB3aGVyZSB4YyA9PSAxOiByZXN1bHQgaXMgMTAqKih4ZSp5KSwgd2l0aCB4ZSp5CisgICAgICAgICMgcmVxdWlyZWQgdG8gYmUgYW4gaW50ZWdlcgorICAgICAgICBpZiB4YyA9PSAxOgorICAgICAgICAgICAgeGUgKj0geWMKKyAgICAgICAgICAgICMgcmVzdWx0IGlzIG5vdyAxMCoqKHhlICogMTAqKnllKTsgIHhlICogMTAqKnllIG11c3QgYmUgaW50ZWdyYWwKKyAgICAgICAgICAgIHdoaWxlIHhlICUgMTAgPT0gMDoKKyAgICAgICAgICAgICAgICB4ZSAvLz0gMTAKKyAgICAgICAgICAgICAgICB5ZSArPSAxCisgICAgICAgICAgICBpZiB5ZSA8IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGV4cG9uZW50ID0geGUgKiAxMCoqeWUKKyAgICAgICAgICAgIGlmIHkuc2lnbiA9PSAxOgorICAgICAgICAgICAgICAgIGV4cG9uZW50ID0gLWV4cG9uZW50CisgICAgICAgICAgICAjIGlmIG90aGVyIGlzIGEgbm9ubmVnYXRpdmUgaW50ZWdlciwgdXNlIGlkZWFsIGV4cG9uZW50CisgICAgICAgICAgICBpZiBvdGhlci5faXNpbnRlZ2VyKCkgYW5kIG90aGVyLl9zaWduID09IDA6CisgICAgICAgICAgICAgICAgaWRlYWxfZXhwb25lbnQgPSBzZWxmLl9leHAqaW50KG90aGVyKQorICAgICAgICAgICAgICAgIHplcm9zID0gbWluKGV4cG9uZW50LWlkZWFsX2V4cG9uZW50LCBwLTEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHplcm9zID0gMAorICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoMCwgJzEnICsgJzAnKnplcm9zLCBleHBvbmVudC16ZXJvcykKKworICAgICAgICAjIGNhc2Ugd2hlcmUgeSBpcyBuZWdhdGl2ZTogeGMgbXVzdCBiZSBlaXRoZXIgYSBwb3dlcgorICAgICAgICAjIG9mIDIgb3IgYSBwb3dlciBvZiA1LgorICAgICAgICBpZiB5LnNpZ24gPT0gMToKKyAgICAgICAgICAgIGxhc3RfZGlnaXQgPSB4YyAlIDEwCisgICAgICAgICAgICBpZiBsYXN0X2RpZ2l0IGluICgyLDQsNiw4KToKKyAgICAgICAgICAgICAgICAjIHF1aWNrIHRlc3QgZm9yIHBvd2VyIG9mIDIKKyAgICAgICAgICAgICAgICBpZiB4YyAmIC14YyAhPSB4YzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICAjIG5vdyB4YyBpcyBhIHBvd2VyIG9mIDI7IGUgaXMgaXRzIGV4cG9uZW50CisgICAgICAgICAgICAgICAgZSA9IF9uYml0cyh4YyktMQorCisgICAgICAgICAgICAgICAgIyBXZSBub3cgaGF2ZToKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyAgIHggPSAyKiplICogMTAqKnhlLCBlID4gMCwgYW5kIHkgPCAwLgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIFRoZSBleGFjdCByZXN1bHQgaXM6CisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgICB4Kip5ID0gNSoqKC1lKnkpICogMTAqKihlKnkgKyB4ZSp5KQorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIHByb3ZpZGVkIHRoYXQgYm90aCBlKnkgYW5kIHhlKnkgYXJlIGludGVnZXJzLiAgTm90ZSB0aGF0IGlmCisgICAgICAgICAgICAgICAgIyA1KiooLWUqeSkgPj0gMTAqKnAsIHRoZW4gdGhlIHJlc3VsdCBjYW4ndCBiZSBleHByZXNzZWQKKyAgICAgICAgICAgICAgICAjIGV4YWN0bHkgd2l0aCBwIGRpZ2l0cyBvZiBwcmVjaXNpb24uCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgVXNpbmcgdGhlIGFib3ZlLCB3ZSBjYW4gZ3VhcmQgYWdhaW5zdCBsYXJnZSB2YWx1ZXMgb2YgeWUuCisgICAgICAgICAgICAgICAgIyA5My82NSBpcyBhbiB1cHBlciBib3VuZCBmb3IgbG9nKDEwKS9sb2coNSksIHNvIGlmCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgICB5ZSA+PSBsZW4oc3RyKDkzKnAvLzY1KSkKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyB0aGVuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgICAtZSp5ID49IC15ID49IDEwKip5ZSA+IDkzKnAvNjUgPiBwKmxvZygxMCkvbG9nKDUpLAorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIHNvIDUqKigtZSp5KSA+PSAxMCoqcCwgYW5kIHRoZSBjb2VmZmljaWVudCBvZiB0aGUgcmVzdWx0CisgICAgICAgICAgICAgICAgIyBjYW4ndCBiZSBleHByZXNzZWQgaW4gcCBkaWdpdHMuCisKKyAgICAgICAgICAgICAgICAjIGVtYXggPj0gbGFyZ2VzdCBlIHN1Y2ggdGhhdCA1KiplIDwgMTAqKnAuCisgICAgICAgICAgICAgICAgZW1heCA9IHAqOTMvLzY1CisgICAgICAgICAgICAgICAgaWYgeWUgPj0gbGVuKHN0cihlbWF4KSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgICAgICAgICAjIEZpbmQgLWUqeSBhbmQgLXhlKnk7IGJvdGggbXVzdCBiZSBpbnRlZ2VycworICAgICAgICAgICAgICAgIGUgPSBfZGVjaW1hbF9sc2hpZnRfZXhhY3QoZSAqIHljLCB5ZSkKKyAgICAgICAgICAgICAgICB4ZSA9IF9kZWNpbWFsX2xzaGlmdF9leGFjdCh4ZSAqIHljLCB5ZSkKKyAgICAgICAgICAgICAgICBpZiBlIGlzIE5vbmUgb3IgeGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAgICAgICAgIGlmIGUgPiBlbWF4OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIHhjID0gNSoqZQorCisgICAgICAgICAgICBlbGlmIGxhc3RfZGlnaXQgPT0gNToKKyAgICAgICAgICAgICAgICAjIGUgPj0gbG9nXzUoeGMpIGlmIHhjIGlzIGEgcG93ZXIgb2YgNTsgd2UgaGF2ZQorICAgICAgICAgICAgICAgICMgZXF1YWxpdHkgYWxsIHRoZSB3YXkgdXAgdG8geGM9NSoqMjY1OAorICAgICAgICAgICAgICAgIGUgPSBfbmJpdHMoeGMpKjI4Ly82NQorICAgICAgICAgICAgICAgIHhjLCByZW1haW5kZXIgPSBkaXZtb2QoNSoqZSwgeGMpCisgICAgICAgICAgICAgICAgaWYgcmVtYWluZGVyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIHdoaWxlIHhjICUgNSA9PSAwOgorICAgICAgICAgICAgICAgICAgICB4YyAvLz0gNQorICAgICAgICAgICAgICAgICAgICBlIC09IDEKKworICAgICAgICAgICAgICAgICMgR3VhcmQgYWdhaW5zdCBsYXJnZSB2YWx1ZXMgb2YgeWUsIHVzaW5nIHRoZSBzYW1lIGxvZ2ljIGFzIGluCisgICAgICAgICAgICAgICAgIyB0aGUgJ3hjIGlzIGEgcG93ZXIgb2YgMicgYnJhbmNoLiAgMTAvMyBpcyBhbiB1cHBlciBib3VuZCBmb3IKKyAgICAgICAgICAgICAgICAjIGxvZygxMCkvbG9nKDIpLgorICAgICAgICAgICAgICAgIGVtYXggPSBwKjEwLy8zCisgICAgICAgICAgICAgICAgaWYgeWUgPj0gbGVuKHN0cihlbWF4KSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgICAgICAgICBlID0gX2RlY2ltYWxfbHNoaWZ0X2V4YWN0KGUgKiB5YywgeWUpCisgICAgICAgICAgICAgICAgeGUgPSBfZGVjaW1hbF9sc2hpZnRfZXhhY3QoeGUgKiB5YywgeWUpCisgICAgICAgICAgICAgICAgaWYgZSBpcyBOb25lIG9yIHhlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgICAgICAgICBpZiBlID4gZW1heDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICB4YyA9IDIqKmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAgICAgaWYgeGMgPj0gMTAqKnA6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHhlID0gLWUteGUKKyAgICAgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKDAsIHN0cih4YyksIHhlKQorCisgICAgICAgICMgbm93IHkgaXMgcG9zaXRpdmU7IGZpbmQgbSBhbmQgbiBzdWNoIHRoYXQgeSA9IG0vbgorICAgICAgICBpZiB5ZSA+PSAwOgorICAgICAgICAgICAgbSwgbiA9IHljKjEwKip5ZSwgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgeGUgIT0gMCBhbmQgbGVuKHN0cihhYnMoeWMqeGUpKSkgPD0gLXllOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICB4Y19iaXRzID0gX25iaXRzKHhjKQorICAgICAgICAgICAgaWYgeGMgIT0gMSBhbmQgbGVuKHN0cihhYnMoeWMpKnhjX2JpdHMpKSA8PSAteWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIG0sIG4gPSB5YywgMTAqKigteWUpCisgICAgICAgICAgICB3aGlsZSBtICUgMiA9PSBuICUgMiA9PSAwOgorICAgICAgICAgICAgICAgIG0gLy89IDIKKyAgICAgICAgICAgICAgICBuIC8vPSAyCisgICAgICAgICAgICB3aGlsZSBtICUgNSA9PSBuICUgNSA9PSAwOgorICAgICAgICAgICAgICAgIG0gLy89IDUKKyAgICAgICAgICAgICAgICBuIC8vPSA1CisKKyAgICAgICAgIyBjb21wdXRlIG50aCByb290IG9mIHhjKjEwKip4ZQorICAgICAgICBpZiBuID4gMToKKyAgICAgICAgICAgICMgaWYgMSA8IHhjIDwgMioqbiB0aGVuIHhjIGlzbid0IGFuIG50aCBwb3dlcgorICAgICAgICAgICAgaWYgeGMgIT0gMSBhbmQgeGNfYml0cyA8PSBuOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgICAgIHhlLCByZW0gPSBkaXZtb2QoeGUsIG4pCisgICAgICAgICAgICBpZiByZW0gIT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICAgICAjIGNvbXB1dGUgbnRoIHJvb3Qgb2YgeGMgdXNpbmcgTmV3dG9uJ3MgbWV0aG9kCisgICAgICAgICAgICBhID0gMUwgPDwgLSgtX25iaXRzKHhjKS8vbikgIyBpbml0aWFsIGVzdGltYXRlCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHEsIHIgPSBkaXZtb2QoeGMsIGEqKihuLTEpKQorICAgICAgICAgICAgICAgIGlmIGEgPD0gcToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhID0gKGEqKG4tMSkgKyBxKS8vbgorICAgICAgICAgICAgaWYgbm90IChhID09IHEgYW5kIHIgPT0gMCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHhjID0gYQorCisgICAgICAgICMgbm93IHhjKjEwKip4ZSBpcyB0aGUgbnRoIHJvb3Qgb2YgdGhlIG9yaWdpbmFsIHhjKjEwKip4ZQorICAgICAgICAjIGNvbXB1dGUgbXRoIHBvd2VyIG9mIHhjKjEwKip4ZQorCisgICAgICAgICMgaWYgbSA+IHAqMTAwLy9fbG9nMTBfbGIoeGMpIHRoZW4gbSA+IHAvbG9nMTAoeGMpLCBoZW5jZSB4YyoqbSA+CisgICAgICAgICMgMTAqKnAgYW5kIHRoZSByZXN1bHQgaXMgbm90IHJlcHJlc2VudGFibGUuCisgICAgICAgIGlmIHhjID4gMSBhbmQgbSA+IHAqMTAwLy9fbG9nMTBfbGIoeGMpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgeGMgPSB4YyoqbQorICAgICAgICB4ZSAqPSBtCisgICAgICAgIGlmIHhjID4gMTAqKnA6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgYnkgdGhpcyBwb2ludCB0aGUgcmVzdWx0ICppcyogZXhhY3RseSByZXByZXNlbnRhYmxlCisgICAgICAgICMgYWRqdXN0IHRoZSBleHBvbmVudCB0byBnZXQgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIGlkZWFsCisgICAgICAgICMgZXhwb25lbnQsIGlmIG5lY2Vzc2FyeQorICAgICAgICBzdHJfeGMgPSBzdHIoeGMpCisgICAgICAgIGlmIG90aGVyLl9pc2ludGVnZXIoKSBhbmQgb3RoZXIuX3NpZ24gPT0gMDoKKyAgICAgICAgICAgIGlkZWFsX2V4cG9uZW50ID0gc2VsZi5fZXhwKmludChvdGhlcikKKyAgICAgICAgICAgIHplcm9zID0gbWluKHhlLWlkZWFsX2V4cG9uZW50LCBwLWxlbihzdHJfeGMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgemVyb3MgPSAwCisgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKDAsIHN0cl94YysnMCcqemVyb3MsIHhlLXplcm9zKQorCisgICAgZGVmIF9fcG93X18oc2VsZiwgb3RoZXIsIG1vZHVsbz1Ob25lLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gc2VsZiAqKiBvdGhlciBbICUgbW9kdWxvXS4KKworICAgICAgICBXaXRoIHR3byBhcmd1bWVudHMsIGNvbXB1dGUgc2VsZioqb3RoZXIuCisKKyAgICAgICAgV2l0aCB0aHJlZSBhcmd1bWVudHMsIGNvbXB1dGUgKHNlbGYqKm90aGVyKSAlIG1vZHVsby4gIEZvciB0aGUKKyAgICAgICAgdGhyZWUgYXJndW1lbnQgZm9ybSwgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnMgb24gdGhlCisgICAgICAgIGFyZ3VtZW50cyBob2xkOgorCisgICAgICAgICAtIGFsbCB0aHJlZSBhcmd1bWVudHMgbXVzdCBiZSBpbnRlZ3JhbAorICAgICAgICAgLSBvdGhlciBtdXN0IGJlIG5vbm5lZ2F0aXZlCisgICAgICAgICAtIGVpdGhlciBzZWxmIG9yIG90aGVyIChvciBib3RoKSBtdXN0IGJlIG5vbnplcm8KKyAgICAgICAgIC0gbW9kdWxvIG11c3QgYmUgbm9uemVybyBhbmQgbXVzdCBoYXZlIGF0IG1vc3QgcCBkaWdpdHMsCisgICAgICAgICAgIHdoZXJlIHAgaXMgdGhlIGNvbnRleHQgcHJlY2lzaW9uLgorCisgICAgICAgIElmIGFueSBvZiB0aGVzZSByZXN0cmljdGlvbnMgaXMgdmlvbGF0ZWQgdGhlIEludmFsaWRPcGVyYXRpb24KKyAgICAgICAgZmxhZyBpcyByYWlzZWQuCisKKyAgICAgICAgVGhlIHJlc3VsdCBvZiBwb3coc2VsZiwgb3RoZXIsIG1vZHVsbykgaXMgaWRlbnRpY2FsIHRvIHRoZQorICAgICAgICByZXN1bHQgdGhhdCB3b3VsZCBiZSBvYnRhaW5lZCBieSBjb21wdXRpbmcgKHNlbGYqKm90aGVyKSAlCisgICAgICAgIG1vZHVsbyB3aXRoIHVuYm91bmRlZCBwcmVjaXNpb24sIGJ1dCBpcyBjb21wdXRlZCBtb3JlCisgICAgICAgIGVmZmljaWVudGx5LiAgSXQgaXMgYWx3YXlzIGV4YWN0LgorICAgICAgICAiIiIKKworICAgICAgICBpZiBtb2R1bG8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcG93ZXJfbW9kdWxvKG90aGVyLCBtb2R1bG8sIGNvbnRleHQpCisKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlcikKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgIyBlaXRoZXIgYXJndW1lbnQgaXMgYSBOYU4gPT4gcmVzdWx0IGlzIE5hTgorICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgIyAwKiowID0gTmFOICghKSwgeCoqMCA9IDEgZm9yIG5vbnplcm8geCAoaW5jbHVkaW5nICsvLUluZmluaXR5KQorICAgICAgICBpZiBub3Qgb3RoZXI6CisgICAgICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJzAgKiogMCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBfT25lCisKKyAgICAgICAgIyByZXN1bHQgaGFzIHNpZ24gMSBpZmYgc2VsZi5fc2lnbiBpcyAxIGFuZCBvdGhlciBpcyBhbiBvZGQgaW50ZWdlcgorICAgICAgICByZXN1bHRfc2lnbiA9IDAKKyAgICAgICAgaWYgc2VsZi5fc2lnbiA9PSAxOgorICAgICAgICAgICAgaWYgb3RoZXIuX2lzaW50ZWdlcigpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBvdGhlci5faXNldmVuKCk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9zaWduID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIC12ZSoqbm9uaW50ZWdlciA9IE5hTgorICAgICAgICAgICAgICAgICMgKC0wKSoqbm9uaW50ZWdlciA9IDAqKm5vbmludGVnZXIKKyAgICAgICAgICAgICAgICBpZiBzZWxmOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICd4ICoqIHkgd2l0aCB4IG5lZ2F0aXZlIGFuZCB5IG5vdCBhbiBpbnRlZ2VyJykKKyAgICAgICAgICAgICMgbmVnYXRlIHNlbGYsIHdpdGhvdXQgZG9pbmcgYW55IHVud2FudGVkIHJvdW5kaW5nCisgICAgICAgICAgICBzZWxmID0gc2VsZi5jb3B5X25lZ2F0ZSgpCisKKyAgICAgICAgIyAwKiooK3ZlIG9yIEluZik9IDA7IDAqKigtdmUgb3IgLUluZikgPSBJbmZpbml0eQorICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIGlmIG90aGVyLl9zaWduID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUocmVzdWx0X3NpZ24sICcwJywgMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9TaWduZWRJbmZpbml0eVtyZXN1bHRfc2lnbl0KKworICAgICAgICAjIEluZioqKCt2ZSBvciBJbmYpID0gSW5mOyBJbmYqKigtdmUgb3IgLUluZikgPSAwCisgICAgICAgIGlmIHNlbGYuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgIGlmIG90aGVyLl9zaWduID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9TaWduZWRJbmZpbml0eVtyZXN1bHRfc2lnbl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUocmVzdWx0X3NpZ24sICcwJywgMCkKKworICAgICAgICAjIDEqKm90aGVyID0gMSwgYnV0IHRoZSBjaG9pY2Ugb2YgZXhwb25lbnQgYW5kIHRoZSBmbGFncworICAgICAgICAjIGRlcGVuZCBvbiB0aGUgZXhwb25lbnQgb2Ygc2VsZiwgYW5kIG9uIHdoZXRoZXIgb3RoZXIgaXMgYQorICAgICAgICAjIHBvc2l0aXZlIGludGVnZXIsIGEgbmVnYXRpdmUgaW50ZWdlciwgb3IgbmVpdGhlcgorICAgICAgICBpZiBzZWxmID09IF9PbmU6CisgICAgICAgICAgICBpZiBvdGhlci5faXNpbnRlZ2VyKCk6CisgICAgICAgICAgICAgICAgIyBleHAgPSBtYXgoc2VsZi5fZXhwKm1heChpbnQob3RoZXIpLCAwKSwKKyAgICAgICAgICAgICAgICAjIDEtY29udGV4dC5wcmVjKSBidXQgZXZhbHVhdGluZyBpbnQob3RoZXIpIGRpcmVjdGx5CisgICAgICAgICAgICAgICAgIyBpcyBkYW5nZXJvdXMgdW50aWwgd2Uga25vdyBvdGhlciBpcyBzbWFsbCAob3RoZXIKKyAgICAgICAgICAgICAgICAjIGNvdWxkIGJlIDFlOTk5OTk5OTk5KQorICAgICAgICAgICAgICAgIGlmIG90aGVyLl9zaWduID09IDE6CisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpZXIgPSAwCisgICAgICAgICAgICAgICAgZWxpZiBvdGhlciA+IGNvbnRleHQucHJlYzoKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGllciA9IGNvbnRleHQucHJlYworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxpZXIgPSBpbnQob3RoZXIpCisKKyAgICAgICAgICAgICAgICBleHAgPSBzZWxmLl9leHAgKiBtdWx0aXBsaWVyCisgICAgICAgICAgICAgICAgaWYgZXhwIDwgMS1jb250ZXh0LnByZWM6CisgICAgICAgICAgICAgICAgICAgIGV4cCA9IDEtY29udGV4dC5wcmVjCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKFJvdW5kZWQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKEluZXhhY3QpCisgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoUm91bmRlZCkKKyAgICAgICAgICAgICAgICBleHAgPSAxLWNvbnRleHQucHJlYworCisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShyZXN1bHRfc2lnbiwgJzEnKycwJyotZXhwLCBleHApCisKKyAgICAgICAgIyBjb21wdXRlIGFkanVzdGVkIGV4cG9uZW50IG9mIHNlbGYKKyAgICAgICAgc2VsZl9hZGogPSBzZWxmLmFkanVzdGVkKCkKKworICAgICAgICAjIHNlbGYgKiogaW5maW5pdHkgaXMgaW5maW5pdHkgaWYgc2VsZiA+IDEsIDAgaWYgc2VsZiA8IDEKKyAgICAgICAgIyBzZWxmICoqIC1pbmZpbml0eSBpcyBpbmZpbml0eSBpZiBzZWxmIDwgMSwgMCBpZiBzZWxmID4gMQorICAgICAgICBpZiBvdGhlci5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgaWYgKG90aGVyLl9zaWduID09IDApID09IChzZWxmX2FkaiA8IDApOgorICAgICAgICAgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKHJlc3VsdF9zaWduLCAnMCcsIDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBfU2lnbmVkSW5maW5pdHlbcmVzdWx0X3NpZ25dCisKKyAgICAgICAgIyBmcm9tIGhlcmUgb24sIHRoZSByZXN1bHQgYWx3YXlzIGdvZXMgdGhyb3VnaCB0aGUgY2FsbAorICAgICAgICAjIHRvIF9maXggYXQgdGhlIGVuZCBvZiB0aGlzIGZ1bmN0aW9uLgorICAgICAgICBhbnMgPSBOb25lCisgICAgICAgIGV4YWN0ID0gRmFsc2UKKworICAgICAgICAjIGNydWRlIHRlc3QgdG8gY2F0Y2ggY2FzZXMgb2YgZXh0cmVtZSBvdmVyZmxvdy91bmRlcmZsb3cuICBJZgorICAgICAgICAjIGxvZzEwKHNlbGYpKm90aGVyID49IDEwKipib3VuZCBhbmQgYm91bmQgPj0gbGVuKHN0cihFbWF4KSkKKyAgICAgICAgIyB0aGVuIDEwKipib3VuZCA+PSAxMCoqbGVuKHN0cihFbWF4KSkgPj0gRW1heCsxIGFuZCBoZW5jZQorICAgICAgICAjIHNlbGYqKm90aGVyID49IDEwKiooRW1heCsxKSwgc28gb3ZlcmZsb3cgb2NjdXJzLiAgVGhlIHRlc3QKKyAgICAgICAgIyBmb3IgdW5kZXJmbG93IGlzIHNpbWlsYXIuCisgICAgICAgIGJvdW5kID0gc2VsZi5fbG9nMTBfZXhwX2JvdW5kKCkgKyBvdGhlci5hZGp1c3RlZCgpCisgICAgICAgIGlmIChzZWxmX2FkaiA+PSAwKSA9PSAob3RoZXIuX3NpZ24gPT0gMCk6CisgICAgICAgICAgICAjIHNlbGYgPiAxIGFuZCBvdGhlciArdmUsIG9yIHNlbGYgPCAxIGFuZCBvdGhlciAtdmUKKyAgICAgICAgICAgICMgcG9zc2liaWxpdHkgb2Ygb3ZlcmZsb3cKKyAgICAgICAgICAgIGlmIGJvdW5kID49IGxlbihzdHIoY29udGV4dC5FbWF4KSk6CisgICAgICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShyZXN1bHRfc2lnbiwgJzEnLCBjb250ZXh0LkVtYXgrMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgc2VsZiA+IDEgYW5kIG90aGVyIC12ZSwgb3Igc2VsZiA8IDEgYW5kIG90aGVyICt2ZQorICAgICAgICAgICAgIyBwb3NzaWJpbGl0eSBvZiB1bmRlcmZsb3cgdG8gMAorICAgICAgICAgICAgRXRpbnkgPSBjb250ZXh0LkV0aW55KCkKKyAgICAgICAgICAgIGlmIGJvdW5kID49IGxlbihzdHIoLUV0aW55KSk6CisgICAgICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShyZXN1bHRfc2lnbiwgJzEnLCBFdGlueS0xKQorCisgICAgICAgICMgdHJ5IGZvciBhbiBleGFjdCByZXN1bHQgd2l0aCBwcmVjaXNpb24gKzEKKyAgICAgICAgaWYgYW5zIGlzIE5vbmU6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9wb3dlcl9leGFjdChvdGhlciwgY29udGV4dC5wcmVjICsgMSkKKyAgICAgICAgICAgIGlmIGFucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiByZXN1bHRfc2lnbiA9PSAxOgorICAgICAgICAgICAgICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKDEsIGFucy5faW50LCBhbnMuX2V4cCkKKyAgICAgICAgICAgICAgICBleGFjdCA9IFRydWUKKworICAgICAgICAjIHVzdWFsIGNhc2U6IGluZXhhY3QgcmVzdWx0LCB4Kip5IGNvbXB1dGVkIGRpcmVjdGx5IGFzIGV4cCh5KmxvZyh4KSkKKyAgICAgICAgaWYgYW5zIGlzIE5vbmU6CisgICAgICAgICAgICBwID0gY29udGV4dC5wcmVjCisgICAgICAgICAgICB4ID0gX1dvcmtSZXAoc2VsZikKKyAgICAgICAgICAgIHhjLCB4ZSA9IHguaW50LCB4LmV4cAorICAgICAgICAgICAgeSA9IF9Xb3JrUmVwKG90aGVyKQorICAgICAgICAgICAgeWMsIHllID0geS5pbnQsIHkuZXhwCisgICAgICAgICAgICBpZiB5LnNpZ24gPT0gMToKKyAgICAgICAgICAgICAgICB5YyA9IC15YworCisgICAgICAgICAgICAjIGNvbXB1dGUgY29ycmVjdGx5IHJvdW5kZWQgcmVzdWx0OiAgc3RhcnQgd2l0aCBwcmVjaXNpb24gKzMsCisgICAgICAgICAgICAjIHRoZW4gaW5jcmVhc2UgcHJlY2lzaW9uIHVudGlsIHJlc3VsdCBpcyB1bmFtYmlndW91c2x5IHJvdW5kYWJsZQorICAgICAgICAgICAgZXh0cmEgPSAzCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGNvZWZmLCBleHAgPSBfZHBvd2VyKHhjLCB4ZSwgeWMsIHllLCBwK2V4dHJhKQorICAgICAgICAgICAgICAgIGlmIGNvZWZmICUgKDUqMTAqKihsZW4oc3RyKGNvZWZmKSktcC0xKSk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXh0cmEgKz0gMworCisgICAgICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKHJlc3VsdF9zaWduLCBzdHIoY29lZmYpLCBleHApCisKKyAgICAgICAgIyB1bmxpa2UgZXhwLCBsbiBhbmQgbG9nMTAsIHRoZSBwb3dlciBmdW5jdGlvbiByZXNwZWN0cyB0aGUKKyAgICAgICAgIyByb3VuZGluZyBtb2RlOyBubyBuZWVkIHRvIHN3aXRjaCB0byBST1VORF9IQUxGX0VWRU4gaGVyZQorCisgICAgICAgICMgVGhlcmUncyBhIGRpZmZpY3VsdHkgaGVyZSB3aGVuICdvdGhlcicgaXMgbm90IGFuIGludGVnZXIgYW5kCisgICAgICAgICMgdGhlIHJlc3VsdCBpcyBleGFjdC4gIEluIHRoaXMgY2FzZSwgdGhlIHNwZWNpZmljYXRpb24KKyAgICAgICAgIyByZXF1aXJlcyB0aGF0IHRoZSBJbmV4YWN0IGZsYWcgYmUgcmFpc2VkIChpbiBzcGl0ZSBvZgorICAgICAgICAjIGV4YWN0bmVzcyksIGJ1dCBzaW5jZSB0aGUgcmVzdWx0IGlzIGV4YWN0IF9maXggd29uJ3QgZG8gdGhpcworICAgICAgICAjIGZvciB1cy4gIChDb3JyZXNwb25kaW5nbHksIHRoZSBVbmRlcmZsb3cgc2lnbmFsIHNob3VsZCBhbHNvCisgICAgICAgICMgYmUgcmFpc2VkIGZvciBzdWJub3JtYWwgcmVzdWx0cy4pICBXZSBjYW4ndCBkaXJlY3RseSByYWlzZQorICAgICAgICAjIHRoZXNlIHNpZ25hbHMgZWl0aGVyIGJlZm9yZSBvciBhZnRlciBjYWxsaW5nIF9maXgsIHNpbmNlCisgICAgICAgICMgdGhhdCB3b3VsZCB2aW9sYXRlIHRoZSBwcmVjZWRlbmNlIGZvciBzaWduYWxzLiAgU28gd2Ugd3JhcAorICAgICAgICAjIHRoZSAuX2ZpeCBjYWxsIGluIGEgdGVtcG9yYXJ5IGNvbnRleHQsIGFuZCByZXJhaXNlCisgICAgICAgICMgYWZ0ZXJ3YXJkcy4KKyAgICAgICAgaWYgZXhhY3QgYW5kIG5vdCBvdGhlci5faXNpbnRlZ2VyKCk6CisgICAgICAgICAgICAjIHBhZCB3aXRoIHplcm9zIHVwIHRvIGxlbmd0aCBjb250ZXh0LnByZWMrMSBpZiBuZWNlc3Nhcnk7IHRoaXMKKyAgICAgICAgICAgICMgZW5zdXJlcyB0aGF0IHRoZSBSb3VuZGVkIHNpZ25hbCB3aWxsIGJlIHJhaXNlZC4KKyAgICAgICAgICAgIGlmIGxlbihhbnMuX2ludCkgPD0gY29udGV4dC5wcmVjOgorICAgICAgICAgICAgICAgIGV4cGRpZmYgPSBjb250ZXh0LnByZWMgKyAxIC0gbGVuKGFucy5faW50KQorICAgICAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUoYW5zLl9zaWduLCBhbnMuX2ludCsnMCcqZXhwZGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFucy5fZXhwLWV4cGRpZmYpCisKKyAgICAgICAgICAgICMgY3JlYXRlIGEgY29weSBvZiB0aGUgY3VycmVudCBjb250ZXh0LCB3aXRoIGNsZWFyZWQgZmxhZ3MvdHJhcHMKKyAgICAgICAgICAgIG5ld2NvbnRleHQgPSBjb250ZXh0LmNvcHkoKQorICAgICAgICAgICAgbmV3Y29udGV4dC5jbGVhcl9mbGFncygpCisgICAgICAgICAgICBmb3IgZXhjZXB0aW9uIGluIF9zaWduYWxzOgorICAgICAgICAgICAgICAgIG5ld2NvbnRleHQudHJhcHNbZXhjZXB0aW9uXSA9IDAKKworICAgICAgICAgICAgIyByb3VuZCBpbiB0aGUgbmV3IGNvbnRleHQKKyAgICAgICAgICAgIGFucyA9IGFucy5fZml4KG5ld2NvbnRleHQpCisKKyAgICAgICAgICAgICMgcmFpc2UgSW5leGFjdCwgYW5kIGlmIG5lY2Vzc2FyeSwgVW5kZXJmbG93CisgICAgICAgICAgICBuZXdjb250ZXh0Ll9yYWlzZV9lcnJvcihJbmV4YWN0KQorICAgICAgICAgICAgaWYgbmV3Y29udGV4dC5mbGFnc1tTdWJub3JtYWxdOgorICAgICAgICAgICAgICAgIG5ld2NvbnRleHQuX3JhaXNlX2Vycm9yKFVuZGVyZmxvdykKKworICAgICAgICAgICAgIyBwcm9wYWdhdGUgc2lnbmFscyB0byB0aGUgb3JpZ2luYWwgY29udGV4dDsgX2ZpeCBjb3VsZAorICAgICAgICAgICAgIyBoYXZlIHJhaXNlZCBhbnkgb2YgT3ZlcmZsb3csIFVuZGVyZmxvdywgU3Vibm9ybWFsLAorICAgICAgICAgICAgIyBJbmV4YWN0LCBSb3VuZGVkLCBDbGFtcGVkLiAgT3ZlcmZsb3cgbmVlZHMgdGhlIGNvcnJlY3QKKyAgICAgICAgICAgICMgYXJndW1lbnRzLiAgTm90ZSB0aGF0IHRoZSBvcmRlciBvZiB0aGUgZXhjZXB0aW9ucyBpcworICAgICAgICAgICAgIyBpbXBvcnRhbnQgaGVyZS4KKyAgICAgICAgICAgIGlmIG5ld2NvbnRleHQuZmxhZ3NbT3ZlcmZsb3ddOgorICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKE92ZXJmbG93LCAnYWJvdmUgRW1heCcsIGFucy5fc2lnbikKKyAgICAgICAgICAgIGZvciBleGNlcHRpb24gaW4gVW5kZXJmbG93LCBTdWJub3JtYWwsIEluZXhhY3QsIFJvdW5kZWQsIENsYW1wZWQ6CisgICAgICAgICAgICAgICAgaWYgbmV3Y29udGV4dC5mbGFnc1tleGNlcHRpb25dOgorICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihleGNlcHRpb24pCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisKKyAgICAgICAgcmV0dXJuIGFucworCisgICAgZGVmIF9fcnBvd19fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJTd2FwcyBzZWxmL290aGVyIGFuZCByZXR1cm5zIF9fcG93X18uIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIpCisgICAgICAgIGlmIG90aGVyIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyCisgICAgICAgIHJldHVybiBvdGhlci5fX3Bvd19fKHNlbGYsIGNvbnRleHQ9Y29udGV4dCkKKworICAgIGRlZiBub3JtYWxpemUoc2VsZiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiTm9ybWFsaXplLSBzdHJpcCB0cmFpbGluZyAwcywgY2hhbmdlIGFueXRoaW5nIGVxdWFsIHRvIDAgdG8gMGUwIiIiCisKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgZHVwID0gc2VsZi5fZml4KGNvbnRleHQpCisgICAgICAgIGlmIGR1cC5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgcmV0dXJuIGR1cAorCisgICAgICAgIGlmIG5vdCBkdXA6CisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShkdXAuX3NpZ24sICcwJywgMCkKKyAgICAgICAgZXhwX21heCA9IFtjb250ZXh0LkVtYXgsIGNvbnRleHQuRXRvcCgpXVtjb250ZXh0Ll9jbGFtcF0KKyAgICAgICAgZW5kID0gbGVuKGR1cC5faW50KQorICAgICAgICBleHAgPSBkdXAuX2V4cAorICAgICAgICB3aGlsZSBkdXAuX2ludFtlbmQtMV0gPT0gJzAnIGFuZCBleHAgPCBleHBfbWF4OgorICAgICAgICAgICAgZXhwICs9IDEKKyAgICAgICAgICAgIGVuZCAtPSAxCisgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKGR1cC5fc2lnbiwgZHVwLl9pbnRbOmVuZF0sIGV4cCkKKworICAgIGRlZiBxdWFudGl6ZShzZWxmLCBleHAsIHJvdW5kaW5nPU5vbmUsIGNvbnRleHQ9Tm9uZSwgd2F0Y2hleHA9VHJ1ZSk6CisgICAgICAgICIiIlF1YW50aXplIHNlbGYgc28gaXRzIGV4cG9uZW50IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgZXhwLgorCisgICAgICAgIFNpbWlsYXIgdG8gc2VsZi5fcmVzY2FsZShleHAuX2V4cCkgYnV0IHdpdGggZXJyb3IgY2hlY2tpbmcuCisgICAgICAgICIiIgorICAgICAgICBleHAgPSBfY29udmVydF9vdGhlcihleHAsIHJhaXNlaXQ9VHJ1ZSkKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIGlmIHJvdW5kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICByb3VuZGluZyA9IGNvbnRleHQucm91bmRpbmcKKworICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsIG9yIGV4cC5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMoZXhwLCBjb250ZXh0KQorICAgICAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICAgICAgaWYgZXhwLl9pc2luZmluaXR5KCkgb3Igc2VsZi5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgICAgIGlmIGV4cC5faXNpbmZpbml0eSgpIGFuZCBzZWxmLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpICAjIGlmIGJvdGggYXJlIGluZiwgaXQgaXMgT0sKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVhbnRpemUgd2l0aCBvbmUgSU5GJykKKworICAgICAgICAjIGlmIHdlJ3JlIG5vdCB3YXRjaGluZyBleHBvbmVudHMsIGRvIGEgc2ltcGxlIHJlc2NhbGUKKyAgICAgICAgaWYgbm90IHdhdGNoZXhwOgorICAgICAgICAgICAgYW5zID0gc2VsZi5fcmVzY2FsZShleHAuX2V4cCwgcm91bmRpbmcpCisgICAgICAgICAgICAjIHJhaXNlIEluZXhhY3QgYW5kIFJvdW5kZWQgd2hlcmUgYXBwcm9wcmlhdGUKKyAgICAgICAgICAgIGlmIGFucy5fZXhwID4gc2VsZi5fZXhwOgorICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKFJvdW5kZWQpCisgICAgICAgICAgICAgICAgaWYgYW5zICE9IHNlbGY6CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKEluZXhhY3QpCisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgIyBleHAuX2V4cCBzaG91bGQgYmUgYmV0d2VlbiBFdGlueSBhbmQgRW1heAorICAgICAgICBpZiBub3QgKGNvbnRleHQuRXRpbnkoKSA8PSBleHAuX2V4cCA8PSBjb250ZXh0LkVtYXgpOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgJ3RhcmdldCBleHBvbmVudCBvdXQgb2YgYm91bmRzIGluIHF1YW50aXplJykKKworICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUoc2VsZi5fc2lnbiwgJzAnLCBleHAuX2V4cCkKKyAgICAgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgICAgIHNlbGZfYWRqdXN0ZWQgPSBzZWxmLmFkanVzdGVkKCkKKyAgICAgICAgaWYgc2VsZl9hZGp1c3RlZCA+IGNvbnRleHQuRW1heDoKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHBvbmVudCBvZiBxdWFudGl6ZSByZXN1bHQgdG9vIGxhcmdlIGZvciBjdXJyZW50IGNvbnRleHQnKQorICAgICAgICBpZiBzZWxmX2FkanVzdGVkIC0gZXhwLl9leHAgKyAxID4gY29udGV4dC5wcmVjOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1YW50aXplIHJlc3VsdCBoYXMgdG9vIG1hbnkgZGlnaXRzIGZvciBjdXJyZW50IGNvbnRleHQnKQorCisgICAgICAgIGFucyA9IHNlbGYuX3Jlc2NhbGUoZXhwLl9leHAsIHJvdW5kaW5nKQorICAgICAgICBpZiBhbnMuYWRqdXN0ZWQoKSA+IGNvbnRleHQuRW1heDoKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHBvbmVudCBvZiBxdWFudGl6ZSByZXN1bHQgdG9vIGxhcmdlIGZvciBjdXJyZW50IGNvbnRleHQnKQorICAgICAgICBpZiBsZW4oYW5zLl9pbnQpID4gY29udGV4dC5wcmVjOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1YW50aXplIHJlc3VsdCBoYXMgdG9vIG1hbnkgZGlnaXRzIGZvciBjdXJyZW50IGNvbnRleHQnKQorCisgICAgICAgICMgcmFpc2UgYXBwcm9wcmlhdGUgZmxhZ3MKKyAgICAgICAgaWYgYW5zIGFuZCBhbnMuYWRqdXN0ZWQoKSA8IGNvbnRleHQuRW1pbjoKKyAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKFN1Ym5vcm1hbCkKKyAgICAgICAgaWYgYW5zLl9leHAgPiBzZWxmLl9leHA6CisgICAgICAgICAgICBpZiBhbnMgIT0gc2VsZjoKKyAgICAgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbmV4YWN0KQorICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoUm91bmRlZCkKKworICAgICAgICAjIGNhbGwgdG8gZml4IHRha2VzIGNhcmUgb2YgYW55IG5lY2Vzc2FyeSBmb2xkZG93biwgYW5kCisgICAgICAgICMgc2lnbmFscyBDbGFtcGVkIGlmIG5lY2Vzc2FyeQorICAgICAgICBhbnMgPSBhbnMuX2ZpeChjb250ZXh0KQorICAgICAgICByZXR1cm4gYW5zCisKKyAgICBkZWYgc2FtZV9xdWFudHVtKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgc2VsZiBhbmQgb3RoZXIgaGF2ZSB0aGUgc2FtZSBleHBvbmVudDsgb3RoZXJ3aXNlCisgICAgICAgIHJldHVybiBGYWxzZS4KKworICAgICAgICBJZiBlaXRoZXIgb3BlcmFuZCBpcyBhIHNwZWNpYWwgdmFsdWUsIHRoZSBmb2xsb3dpbmcgcnVsZXMgYXJlIHVzZWQ6CisgICAgICAgICAgICogcmV0dXJuIFRydWUgaWYgYm90aCBvcGVyYW5kcyBhcmUgaW5maW5pdGllcworICAgICAgICAgICAqIHJldHVybiBUcnVlIGlmIGJvdGggb3BlcmFuZHMgYXJlIE5hTnMKKyAgICAgICAgICAgKiBvdGhlcndpc2UsIHJldHVybiBGYWxzZS4KKyAgICAgICAgIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbCBvciBvdGhlci5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIHJldHVybiAoc2VsZi5pc19uYW4oKSBhbmQgb3RoZXIuaXNfbmFuKCkgb3IKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19pbmZpbml0ZSgpIGFuZCBvdGhlci5pc19pbmZpbml0ZSgpKQorICAgICAgICByZXR1cm4gc2VsZi5fZXhwID09IG90aGVyLl9leHAKKworICAgIGRlZiBfcmVzY2FsZShzZWxmLCBleHAsIHJvdW5kaW5nKToKKyAgICAgICAgIiIiUmVzY2FsZSBzZWxmIHNvIHRoYXQgdGhlIGV4cG9uZW50IGlzIGV4cCwgZWl0aGVyIGJ5IHBhZGRpbmcgd2l0aCB6ZXJvcworICAgICAgICBvciBieSB0cnVuY2F0aW5nIGRpZ2l0cywgdXNpbmcgdGhlIGdpdmVuIHJvdW5kaW5nIG1vZGUuCisKKyAgICAgICAgU3BlY2lhbHMgYXJlIHJldHVybmVkIHdpdGhvdXQgY2hhbmdlLiAgVGhpcyBvcGVyYXRpb24gaXMKKyAgICAgICAgcXVpZXQ6IGl0IHJhaXNlcyBubyBmbGFncywgYW5kIHVzZXMgbm8gaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAgICAgICAgY29udGV4dC4KKworICAgICAgICBleHAgPSBleHAgdG8gc2NhbGUgdG8gKGFuIGludGVnZXIpCisgICAgICAgIHJvdW5kaW5nID0gcm91bmRpbmcgbW9kZQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoc2VsZi5fc2lnbiwgJzAnLCBleHApCisKKyAgICAgICAgaWYgc2VsZi5fZXhwID49IGV4cDoKKyAgICAgICAgICAgICMgcGFkIGFuc3dlciB3aXRoIHplcm9zIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoc2VsZi5fc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnQgKyAnMCcqKHNlbGYuX2V4cCAtIGV4cCksIGV4cCkKKworICAgICAgICAjIHRvbyBtYW55IGRpZ2l0czsgcm91bmQgYW5kIGxvc2UgZGF0YS4gIElmIHNlbGYuYWRqdXN0ZWQoKSA8CisgICAgICAgICMgZXhwLTEsIHJlcGxhY2Ugc2VsZiBieSAxMCoqKGV4cC0xKSBiZWZvcmUgcm91bmRpbmcKKyAgICAgICAgZGlnaXRzID0gbGVuKHNlbGYuX2ludCkgKyBzZWxmLl9leHAgLSBleHAKKyAgICAgICAgaWYgZGlnaXRzIDwgMDoKKyAgICAgICAgICAgIHNlbGYgPSBfZGVjX2Zyb21fdHJpcGxlKHNlbGYuX3NpZ24sICcxJywgZXhwLTEpCisgICAgICAgICAgICBkaWdpdHMgPSAwCisgICAgICAgIHRoaXNfZnVuY3Rpb24gPSBzZWxmLl9waWNrX3JvdW5kaW5nX2Z1bmN0aW9uW3JvdW5kaW5nXQorICAgICAgICBjaGFuZ2VkID0gdGhpc19mdW5jdGlvbihzZWxmLCBkaWdpdHMpCisgICAgICAgIGNvZWZmID0gc2VsZi5faW50WzpkaWdpdHNdIG9yICcwJworICAgICAgICBpZiBjaGFuZ2VkID09IDE6CisgICAgICAgICAgICBjb2VmZiA9IHN0cihpbnQoY29lZmYpKzEpCisgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKHNlbGYuX3NpZ24sIGNvZWZmLCBleHApCisKKyAgICBkZWYgX3JvdW5kKHNlbGYsIHBsYWNlcywgcm91bmRpbmcpOgorICAgICAgICAiIiJSb3VuZCBhIG5vbnplcm8sIG5vbnNwZWNpYWwgRGVjaW1hbCB0byBhIGZpeGVkIG51bWJlciBvZgorICAgICAgICBzaWduaWZpY2FudCBmaWd1cmVzLCB1c2luZyB0aGUgZ2l2ZW4gcm91bmRpbmcgbW9kZS4KKworICAgICAgICBJbmZpbml0aWVzLCBOYU5zIGFuZCB6ZXJvcyBhcmUgcmV0dXJuZWQgdW5hbHRlcmVkLgorCisgICAgICAgIFRoaXMgb3BlcmF0aW9uIGlzIHF1aWV0OiBpdCByYWlzZXMgbm8gZmxhZ3MsIGFuZCB1c2VzIG5vCisgICAgICAgIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvbnRleHQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHBsYWNlcyA8PSAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYXJndW1lbnQgc2hvdWxkIGJlIGF0IGxlYXN0IDEgaW4gX3JvdW5kIikKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbCBvciBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpCisgICAgICAgIGFucyA9IHNlbGYuX3Jlc2NhbGUoc2VsZi5hZGp1c3RlZCgpKzEtcGxhY2VzLCByb3VuZGluZykKKyAgICAgICAgIyBpdCBjYW4gaGFwcGVuIHRoYXQgdGhlIHJlc2NhbGUgYWx0ZXJzIHRoZSBhZGp1c3RlZCBleHBvbmVudDsKKyAgICAgICAgIyBmb3IgZXhhbXBsZSB3aGVuIHJvdW5kaW5nIDk5Ljk3IHRvIDMgc2lnbmlmaWNhbnQgZmlndXJlcy4KKyAgICAgICAgIyBXaGVuIHRoaXMgaGFwcGVucyB3ZSBlbmQgdXAgd2l0aCBhbiBleHRyYSAwIGF0IHRoZSBlbmQgb2YKKyAgICAgICAgIyB0aGUgbnVtYmVyOyBhIHNlY29uZCByZXNjYWxlIGZpeGVzIHRoaXMuCisgICAgICAgIGlmIGFucy5hZGp1c3RlZCgpICE9IHNlbGYuYWRqdXN0ZWQoKToKKyAgICAgICAgICAgIGFucyA9IGFucy5fcmVzY2FsZShhbnMuYWRqdXN0ZWQoKSsxLXBsYWNlcywgcm91bmRpbmcpCisgICAgICAgIHJldHVybiBhbnMKKworICAgIGRlZiB0b19pbnRlZ3JhbF9leGFjdChzZWxmLCByb3VuZGluZz1Ob25lLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSb3VuZHMgdG8gYSBuZWFyYnkgaW50ZWdlci4KKworICAgICAgICBJZiBubyByb3VuZGluZyBtb2RlIGlzIHNwZWNpZmllZCwgdGFrZSB0aGUgcm91bmRpbmcgbW9kZSBmcm9tCisgICAgICAgIHRoZSBjb250ZXh0LiAgVGhpcyBtZXRob2QgcmFpc2VzIHRoZSBSb3VuZGVkIGFuZCBJbmV4YWN0IGZsYWdzCisgICAgICAgIHdoZW4gYXBwcm9wcmlhdGUuCisKKyAgICAgICAgU2VlIGFsc286IHRvX2ludGVncmFsX3ZhbHVlLCB3aGljaCBkb2VzIGV4YWN0bHkgdGhlIHNhbWUgYXMKKyAgICAgICAgdGhpcyBtZXRob2QgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCByYWlzZSBJbmV4YWN0IG9yIFJvdW5kZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhjb250ZXh0PWNvbnRleHQpCisgICAgICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFucworICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikKKyAgICAgICAgaWYgc2VsZi5fZXhwID49IDA6CisgICAgICAgICAgICByZXR1cm4gRGVjaW1hbChzZWxmKQorICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKHNlbGYuX3NpZ24sICcwJywgMCkKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorICAgICAgICBpZiByb3VuZGluZyBpcyBOb25lOgorICAgICAgICAgICAgcm91bmRpbmcgPSBjb250ZXh0LnJvdW5kaW5nCisgICAgICAgIGFucyA9IHNlbGYuX3Jlc2NhbGUoMCwgcm91bmRpbmcpCisgICAgICAgIGlmIGFucyAhPSBzZWxmOgorICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoSW5leGFjdCkKKyAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoUm91bmRlZCkKKyAgICAgICAgcmV0dXJuIGFucworCisgICAgZGVmIHRvX2ludGVncmFsX3ZhbHVlKHNlbGYsIHJvdW5kaW5nPU5vbmUsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJvdW5kcyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLCB3aXRob3V0IHJhaXNpbmcgaW5leGFjdCwgcm91bmRlZC4iIiIKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorICAgICAgICBpZiByb3VuZGluZyBpcyBOb25lOgorICAgICAgICAgICAgcm91bmRpbmcgPSBjb250ZXh0LnJvdW5kaW5nCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5zCisgICAgICAgICAgICByZXR1cm4gRGVjaW1hbChzZWxmKQorICAgICAgICBpZiBzZWxmLl9leHAgPj0gMDoKKyAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVzY2FsZSgwLCByb3VuZGluZykKKworICAgICMgdGhlIG1ldGhvZCBuYW1lIGNoYW5nZWQsIGJ1dCB3ZSBwcm92aWRlIGFsc28gdGhlIG9sZCBvbmUsIGZvciBjb21wYXRpYmlsaXR5CisgICAgdG9faW50ZWdyYWwgPSB0b19pbnRlZ3JhbF92YWx1ZQorCisgICAgZGVmIHNxcnQoc2VsZiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzcXVhcmUgcm9vdCBvZiBzZWxmLiIiIgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMoY29udGV4dD1jb250ZXh0KQorICAgICAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpIGFuZCBzZWxmLl9zaWduID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikKKworICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgICMgZXhwb25lbnQgPSBzZWxmLl9leHAgLy8gMi4gIHNxcnQoLTApID0gLTAKKyAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUoc2VsZi5fc2lnbiwgJzAnLCBzZWxmLl9leHAgLy8gMikKKyAgICAgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgICAgIGlmIHNlbGYuX3NpZ24gPT0gMToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnc3FydCgteCksIHggPiAwJykKKworICAgICAgICAjIEF0IHRoaXMgcG9pbnQgc2VsZiByZXByZXNlbnRzIGEgcG9zaXRpdmUgbnVtYmVyLiAgTGV0IHAgYmUKKyAgICAgICAgIyB0aGUgZGVzaXJlZCBwcmVjaXNpb24gYW5kIGV4cHJlc3Mgc2VsZiBpbiB0aGUgZm9ybSBjKjEwMCoqZQorICAgICAgICAjIHdpdGggYyBhIHBvc2l0aXZlIHJlYWwgbnVtYmVyIGFuZCBlIGFuIGludGVnZXIsIGMgYW5kIGUKKyAgICAgICAgIyBiZWluZyBjaG9zZW4gc28gdGhhdCAxMDAqKihwLTEpIDw9IGMgPCAxMDAqKnAuICBUaGVuIHRoZQorICAgICAgICAjIChleGFjdCkgc3F1YXJlIHJvb3Qgb2Ygc2VsZiBpcyBzcXJ0KGMpKjEwKiplLCBhbmQgMTAqKihwLTEpCisgICAgICAgICMgPD0gc3FydChjKSA8IDEwKipwLCBzbyB0aGUgY2xvc2VzdCByZXByZXNlbnRhYmxlIERlY2ltYWwgYXQKKyAgICAgICAgIyBwcmVjaXNpb24gcCBpcyBuKjEwKiplIHdoZXJlIG4gPSByb3VuZF9oYWxmX2V2ZW4oc3FydChjKSksCisgICAgICAgICMgdGhlIGNsb3Nlc3QgaW50ZWdlciB0byBzcXJ0KGMpIHdpdGggdGhlIGV2ZW4gaW50ZWdlciBjaG9zZW4KKyAgICAgICAgIyBpbiB0aGUgY2FzZSBvZiBhIHRpZS4KKyAgICAgICAgIworICAgICAgICAjIFRvIGVuc3VyZSBjb3JyZWN0IHJvdW5kaW5nIGluIGFsbCBjYXNlcywgd2UgdXNlIHRoZQorICAgICAgICAjIGZvbGxvd2luZyB0cmljazogd2UgY29tcHV0ZSB0aGUgc3F1YXJlIHJvb3QgdG8gYW4gZXh0cmEKKyAgICAgICAgIyBwbGFjZSAocHJlY2lzaW9uIHArMSBpbnN0ZWFkIG9mIHByZWNpc2lvbiBwKSwgcm91bmRpbmcgZG93bi4KKyAgICAgICAgIyBUaGVuLCBpZiB0aGUgcmVzdWx0IGlzIGluZXhhY3QgYW5kIGl0cyBsYXN0IGRpZ2l0IGlzIDAgb3IgNSwKKyAgICAgICAgIyB3ZSBpbmNyZWFzZSB0aGUgbGFzdCBkaWdpdCB0byAxIG9yIDYgcmVzcGVjdGl2ZWx5OyBpZiBpdCdzCisgICAgICAgICMgZXhhY3Qgd2UgbGVhdmUgdGhlIGxhc3QgZGlnaXQgYWxvbmUuICBOb3cgdGhlIGZpbmFsIHJvdW5kIHRvCisgICAgICAgICMgcCBwbGFjZXMgKG9yIGZld2VyIGluIHRoZSBjYXNlIG9mIHVuZGVyZmxvdykgd2lsbCByb3VuZAorICAgICAgICAjIGNvcnJlY3RseSBhbmQgcmFpc2UgdGhlIGFwcHJvcHJpYXRlIGZsYWdzLgorCisgICAgICAgICMgdXNlIGFuIGV4dHJhIGRpZ2l0IG9mIHByZWNpc2lvbgorICAgICAgICBwcmVjID0gY29udGV4dC5wcmVjKzEKKworICAgICAgICAjIHdyaXRlIGFyZ3VtZW50IGluIHRoZSBmb3JtIGMqMTAwKiplIHdoZXJlIGUgPSBzZWxmLl9leHAvLzIKKyAgICAgICAgIyBpcyB0aGUgJ2lkZWFsJyBleHBvbmVudCwgdG8gYmUgdXNlZCBpZiB0aGUgc3F1YXJlIHJvb3QgaXMKKyAgICAgICAgIyBleGFjdGx5IHJlcHJlc2VudGFibGUuICBsIGlzIHRoZSBudW1iZXIgb2YgJ2RpZ2l0cycgb2YgYyBpbgorICAgICAgICAjIGJhc2UgMTAwLCBzbyB0aGF0IDEwMCoqKGwtMSkgPD0gYyA8IDEwMCoqbC4KKyAgICAgICAgb3AgPSBfV29ya1JlcChzZWxmKQorICAgICAgICBlID0gb3AuZXhwID4+IDEKKyAgICAgICAgaWYgb3AuZXhwICYgMToKKyAgICAgICAgICAgIGMgPSBvcC5pbnQgKiAxMAorICAgICAgICAgICAgbCA9IChsZW4oc2VsZi5faW50KSA+PiAxKSArIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGMgPSBvcC5pbnQKKyAgICAgICAgICAgIGwgPSBsZW4oc2VsZi5faW50KSsxID4+IDEKKworICAgICAgICAjIHJlc2NhbGUgc28gdGhhdCBjIGhhcyBleGFjdGx5IHByZWMgYmFzZSAxMDAgJ2RpZ2l0cycKKyAgICAgICAgc2hpZnQgPSBwcmVjLWwKKyAgICAgICAgaWYgc2hpZnQgPj0gMDoKKyAgICAgICAgICAgIGMgKj0gMTAwKipzaGlmdAorICAgICAgICAgICAgZXhhY3QgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjLCByZW1haW5kZXIgPSBkaXZtb2QoYywgMTAwKiotc2hpZnQpCisgICAgICAgICAgICBleGFjdCA9IG5vdCByZW1haW5kZXIKKyAgICAgICAgZSAtPSBzaGlmdAorCisgICAgICAgICMgZmluZCBuID0gZmxvb3Ioc3FydChjKSkgdXNpbmcgTmV3dG9uJ3MgbWV0aG9kCisgICAgICAgIG4gPSAxMCoqcHJlYworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgcSA9IGMvL24KKyAgICAgICAgICAgIGlmIG4gPD0gcToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuID0gbiArIHEgPj4gMQorICAgICAgICBleGFjdCA9IGV4YWN0IGFuZCBuKm4gPT0gYworCisgICAgICAgIGlmIGV4YWN0OgorICAgICAgICAgICAgIyByZXN1bHQgaXMgZXhhY3Q7IHJlc2NhbGUgdG8gdXNlIGlkZWFsIGV4cG9uZW50IGUKKyAgICAgICAgICAgIGlmIHNoaWZ0ID49IDA6CisgICAgICAgICAgICAgICAgIyBhc3NlcnQgbiAlIDEwKipzaGlmdCA9PSAwCisgICAgICAgICAgICAgICAgbiAvLz0gMTAqKnNoaWZ0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG4gKj0gMTAqKi1zaGlmdAorICAgICAgICAgICAgZSArPSBzaGlmdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyByZXN1bHQgaXMgbm90IGV4YWN0OyBmaXggbGFzdCBkaWdpdCBhcyBkZXNjcmliZWQgYWJvdmUKKyAgICAgICAgICAgIGlmIG4gJSA1ID09IDA6CisgICAgICAgICAgICAgICAgbiArPSAxCisKKyAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZSgwLCBzdHIobiksIGUpCisKKyAgICAgICAgIyByb3VuZCwgYW5kIGZpdCB0byBjdXJyZW50IGNvbnRleHQKKyAgICAgICAgY29udGV4dCA9IGNvbnRleHQuX3NoYWxsb3dfY29weSgpCisgICAgICAgIHJvdW5kaW5nID0gY29udGV4dC5fc2V0X3JvdW5kaW5nKFJPVU5EX0hBTEZfRVZFTikKKyAgICAgICAgYW5zID0gYW5zLl9maXgoY29udGV4dCkKKyAgICAgICAgY29udGV4dC5yb3VuZGluZyA9IHJvdW5kaW5nCisKKyAgICAgICAgcmV0dXJuIGFucworCisgICAgZGVmIG1heChzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbGFyZ2VyIHZhbHVlLgorCisgICAgICAgIExpa2UgbWF4KHNlbGYsIG90aGVyKSBleGNlcHQgaWYgb25lIGlzIG5vdCBhIG51bWJlciwgcmV0dXJucworICAgICAgICBOYU4gKGFuZCBzaWduYWxzIGlmIG9uZSBpcyBzTmFOKS4gIEFsc28gcm91bmRzLgorICAgICAgICAiIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsIG9yIG90aGVyLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgIyBJZiBvbmUgb3BlcmFuZCBpcyBhIHF1aWV0IE5hTiBhbmQgdGhlIG90aGVyIGlzIG51bWJlciwgdGhlbiB0aGUKKyAgICAgICAgICAgICMgbnVtYmVyIGlzIGFsd2F5cyByZXR1cm5lZAorICAgICAgICAgICAgc24gPSBzZWxmLl9pc25hbigpCisgICAgICAgICAgICBvbiA9IG90aGVyLl9pc25hbigpCisgICAgICAgICAgICBpZiBzbiBvciBvbjoKKyAgICAgICAgICAgICAgICBpZiBvbiA9PSAxIGFuZCBzbiA9PSAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZml4KGNvbnRleHQpCisgICAgICAgICAgICAgICAgaWYgc24gPT0gMSBhbmQgb24gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyLl9maXgoY29udGV4dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKworICAgICAgICBjID0gc2VsZi5fY21wKG90aGVyKQorICAgICAgICBpZiBjID09IDA6CisgICAgICAgICAgICAjIElmIGJvdGggb3BlcmFuZHMgYXJlIGZpbml0ZSBhbmQgZXF1YWwgaW4gbnVtZXJpY2FsIHZhbHVlCisgICAgICAgICAgICAjIHRoZW4gYW4gb3JkZXJpbmcgaXMgYXBwbGllZDoKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgSWYgdGhlIHNpZ25zIGRpZmZlciB0aGVuIG1heCByZXR1cm5zIHRoZSBvcGVyYW5kIHdpdGggdGhlCisgICAgICAgICAgICAjIHBvc2l0aXZlIHNpZ24gYW5kIG1pbiByZXR1cm5zIHRoZSBvcGVyYW5kIHdpdGggdGhlIG5lZ2F0aXZlIHNpZ24KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgSWYgdGhlIHNpZ25zIGFyZSB0aGUgc2FtZSB0aGVuIHRoZSBleHBvbmVudCBpcyB1c2VkIHRvIHNlbGVjdAorICAgICAgICAgICAgIyB0aGUgcmVzdWx0LiAgVGhpcyBpcyBleGFjdGx5IHRoZSBvcmRlcmluZyB1c2VkIGluIGNvbXBhcmVfdG90YWwuCisgICAgICAgICAgICBjID0gc2VsZi5jb21wYXJlX3RvdGFsKG90aGVyKQorCisgICAgICAgIGlmIGMgPT0gLTE6CisgICAgICAgICAgICBhbnMgPSBvdGhlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYW5zID0gc2VsZgorCisgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgZGVmIG1pbihzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgc21hbGxlciB2YWx1ZS4KKworICAgICAgICBMaWtlIG1pbihzZWxmLCBvdGhlcikgZXhjZXB0IGlmIG9uZSBpcyBub3QgYSBudW1iZXIsIHJldHVybnMKKyAgICAgICAgTmFOIChhbmQgc2lnbmFscyBpZiBvbmUgaXMgc05hTikuICBBbHNvIHJvdW5kcy4KKyAgICAgICAgIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIHJhaXNlaXQ9VHJ1ZSkKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbCBvciBvdGhlci5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgICMgSWYgb25lIG9wZXJhbmQgaXMgYSBxdWlldCBOYU4gYW5kIHRoZSBvdGhlciBpcyBudW1iZXIsIHRoZW4gdGhlCisgICAgICAgICAgICAjIG51bWJlciBpcyBhbHdheXMgcmV0dXJuZWQKKyAgICAgICAgICAgIHNuID0gc2VsZi5faXNuYW4oKQorICAgICAgICAgICAgb24gPSBvdGhlci5faXNuYW4oKQorICAgICAgICAgICAgaWYgc24gb3Igb246CisgICAgICAgICAgICAgICAgaWYgb24gPT0gMSBhbmQgc24gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeChjb250ZXh0KQorICAgICAgICAgICAgICAgIGlmIHNuID09IDEgYW5kIG9uID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdGhlci5fZml4KGNvbnRleHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisKKyAgICAgICAgYyA9IHNlbGYuX2NtcChvdGhlcikKKyAgICAgICAgaWYgYyA9PSAwOgorICAgICAgICAgICAgYyA9IHNlbGYuY29tcGFyZV90b3RhbChvdGhlcikKKworICAgICAgICBpZiBjID09IC0xOgorICAgICAgICAgICAgYW5zID0gc2VsZgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYW5zID0gb3RoZXIKKworICAgICAgICByZXR1cm4gYW5zLl9maXgoY29udGV4dCkKKworICAgIGRlZiBfaXNpbnRlZ2VyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHdoZXRoZXIgc2VsZiBpcyBhbiBpbnRlZ2VyIiIiCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5fZXhwID49IDA6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXN0ID0gc2VsZi5faW50W3NlbGYuX2V4cDpdCisgICAgICAgIHJldHVybiByZXN0ID09ICcwJypsZW4ocmVzdCkKKworICAgIGRlZiBfaXNldmVuKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgc2VsZiBpcyBldmVuLiAgQXNzdW1lcyBzZWxmIGlzIGFuIGludGVnZXIuIiIiCisgICAgICAgIGlmIG5vdCBzZWxmIG9yIHNlbGYuX2V4cCA+IDA6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gc2VsZi5faW50Wy0xK3NlbGYuX2V4cF0gaW4gJzAyNDY4JworCisgICAgZGVmIGFkanVzdGVkKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGFkanVzdGVkIGV4cG9uZW50IG9mIHNlbGYiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2V4cCArIGxlbihzZWxmLl9pbnQpIC0gMQorICAgICAgICAjIElmIE5hTiBvciBJbmZpbml0eSwgc2VsZi5fZXhwIGlzIHN0cmluZworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBjYW5vbmljYWwoc2VsZiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgc2FtZSBEZWNpbWFsIG9iamVjdC4KKworICAgICAgICBBcyB3ZSBkbyBub3QgaGF2ZSBkaWZmZXJlbnQgZW5jb2RpbmdzIGZvciB0aGUgc2FtZSBudW1iZXIsIHRoZQorICAgICAgICByZWNlaXZlZCBvYmplY3QgYWxyZWFkeSBpcyBpbiBpdHMgY2Fub25pY2FsIGZvcm0uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGNvbXBhcmVfc2lnbmFsKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJDb21wYXJlcyBzZWxmIHRvIHRoZSBvdGhlciBvcGVyYW5kIG51bWVyaWNhbGx5LgorCisgICAgICAgIEl0J3MgcHJldHR5IG11Y2ggbGlrZSBjb21wYXJlKCksIGJ1dCBhbGwgTmFOcyBzaWduYWwsIHdpdGggc2lnbmFsaW5nCisgICAgICAgIE5hTnMgdGFraW5nIHByZWNlZGVuY2Ugb3ZlciBxdWlldCBOYU5zLgorICAgICAgICAiIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdCA9IFRydWUpCisgICAgICAgIGFucyA9IHNlbGYuX2NvbXBhcmVfY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIGFucworICAgICAgICByZXR1cm4gc2VsZi5jb21wYXJlKG90aGVyLCBjb250ZXh0PWNvbnRleHQpCisKKyAgICBkZWYgY29tcGFyZV90b3RhbChzZWxmLCBvdGhlcik6CisgICAgICAgICIiIkNvbXBhcmVzIHNlbGYgdG8gb3RoZXIgdXNpbmcgdGhlIGFic3RyYWN0IHJlcHJlc2VudGF0aW9ucy4KKworICAgICAgICBUaGlzIGlzIG5vdCBsaWtlIHRoZSBzdGFuZGFyZCBjb21wYXJlLCB3aGljaCB1c2UgdGhlaXIgbnVtZXJpY2FsCisgICAgICAgIHZhbHVlLiBOb3RlIHRoYXQgYSB0b3RhbCBvcmRlcmluZyBpcyBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgYWJzdHJhY3QKKyAgICAgICAgcmVwcmVzZW50YXRpb25zLgorICAgICAgICAiIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorCisgICAgICAgICMgaWYgb25lIGlzIG5lZ2F0aXZlIGFuZCB0aGUgb3RoZXIgaXMgcG9zaXRpdmUsIGl0J3MgZWFzeQorICAgICAgICBpZiBzZWxmLl9zaWduIGFuZCBub3Qgb3RoZXIuX3NpZ246CisgICAgICAgICAgICByZXR1cm4gX05lZ2F0aXZlT25lCisgICAgICAgIGlmIG5vdCBzZWxmLl9zaWduIGFuZCBvdGhlci5fc2lnbjoKKyAgICAgICAgICAgIHJldHVybiBfT25lCisgICAgICAgIHNpZ24gPSBzZWxmLl9zaWduCisKKyAgICAgICAgIyBsZXQncyBoYW5kbGUgYm90aCBOYU4gdHlwZXMKKyAgICAgICAgc2VsZl9uYW4gPSBzZWxmLl9pc25hbigpCisgICAgICAgIG90aGVyX25hbiA9IG90aGVyLl9pc25hbigpCisgICAgICAgIGlmIHNlbGZfbmFuIG9yIG90aGVyX25hbjoKKyAgICAgICAgICAgIGlmIHNlbGZfbmFuID09IG90aGVyX25hbjoKKyAgICAgICAgICAgICAgICAjIGNvbXBhcmUgcGF5bG9hZHMgYXMgdGhvdWdoIHRoZXkncmUgaW50ZWdlcnMKKyAgICAgICAgICAgICAgICBzZWxmX2tleSA9IGxlbihzZWxmLl9pbnQpLCBzZWxmLl9pbnQKKyAgICAgICAgICAgICAgICBvdGhlcl9rZXkgPSBsZW4ob3RoZXIuX2ludCksIG90aGVyLl9pbnQKKyAgICAgICAgICAgICAgICBpZiBzZWxmX2tleSA8IG90aGVyX2tleToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2lnbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfT25lCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX05lZ2F0aXZlT25lCisgICAgICAgICAgICAgICAgaWYgc2VsZl9rZXkgPiBvdGhlcl9rZXk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNpZ246CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX05lZ2F0aXZlT25lCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX09uZQorICAgICAgICAgICAgICAgIHJldHVybiBfWmVybworCisgICAgICAgICAgICBpZiBzaWduOgorICAgICAgICAgICAgICAgIGlmIHNlbGZfbmFuID09IDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfTmVnYXRpdmVPbmUKKyAgICAgICAgICAgICAgICBpZiBvdGhlcl9uYW4gPT0gMToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9PbmUKKyAgICAgICAgICAgICAgICBpZiBzZWxmX25hbiA9PSAyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX05lZ2F0aXZlT25lCisgICAgICAgICAgICAgICAgaWYgb3RoZXJfbmFuID09IDI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfT25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGZfbmFuID09IDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfT25lCisgICAgICAgICAgICAgICAgaWYgb3RoZXJfbmFuID09IDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfTmVnYXRpdmVPbmUKKyAgICAgICAgICAgICAgICBpZiBzZWxmX25hbiA9PSAyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX09uZQorICAgICAgICAgICAgICAgIGlmIG90aGVyX25hbiA9PSAyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX05lZ2F0aXZlT25lCisKKyAgICAgICAgaWYgc2VsZiA8IG90aGVyOgorICAgICAgICAgICAgcmV0dXJuIF9OZWdhdGl2ZU9uZQorICAgICAgICBpZiBzZWxmID4gb3RoZXI6CisgICAgICAgICAgICByZXR1cm4gX09uZQorCisgICAgICAgIGlmIHNlbGYuX2V4cCA8IG90aGVyLl9leHA6CisgICAgICAgICAgICBpZiBzaWduOgorICAgICAgICAgICAgICAgIHJldHVybiBfT25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBfTmVnYXRpdmVPbmUKKyAgICAgICAgaWYgc2VsZi5fZXhwID4gb3RoZXIuX2V4cDoKKyAgICAgICAgICAgIGlmIHNpZ246CisgICAgICAgICAgICAgICAgcmV0dXJuIF9OZWdhdGl2ZU9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gX09uZQorICAgICAgICByZXR1cm4gX1plcm8KKworCisgICAgZGVmIGNvbXBhcmVfdG90YWxfbWFnKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQ29tcGFyZXMgc2VsZiB0byBvdGhlciB1c2luZyBhYnN0cmFjdCByZXByLiwgaWdub3Jpbmcgc2lnbi4KKworICAgICAgICBMaWtlIGNvbXBhcmVfdG90YWwsIGJ1dCB3aXRoIG9wZXJhbmQncyBzaWduIGlnbm9yZWQgYW5kIGFzc3VtZWQgdG8gYmUgMC4KKyAgICAgICAgIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIHJhaXNlaXQ9VHJ1ZSkKKworICAgICAgICBzID0gc2VsZi5jb3B5X2FicygpCisgICAgICAgIG8gPSBvdGhlci5jb3B5X2FicygpCisgICAgICAgIHJldHVybiBzLmNvbXBhcmVfdG90YWwobykKKworICAgIGRlZiBjb3B5X2FicyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBhIGNvcHkgd2l0aCB0aGUgc2lnbiBzZXQgdG8gMC4gIiIiCisgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKDAsIHNlbGYuX2ludCwgc2VsZi5fZXhwLCBzZWxmLl9pc19zcGVjaWFsKQorCisgICAgZGVmIGNvcHlfbmVnYXRlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIGEgY29weSB3aXRoIHRoZSBzaWduIGludmVydGVkLiIiIgorICAgICAgICBpZiBzZWxmLl9zaWduOgorICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoMCwgc2VsZi5faW50LCBzZWxmLl9leHAsIHNlbGYuX2lzX3NwZWNpYWwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZSgxLCBzZWxmLl9pbnQsIHNlbGYuX2V4cCwgc2VsZi5faXNfc3BlY2lhbCkKKworICAgIGRlZiBjb3B5X3NpZ24oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJSZXR1cm5zIHNlbGYgd2l0aCB0aGUgc2lnbiBvZiBvdGhlci4iIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShvdGhlci5fc2lnbiwgc2VsZi5faW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9leHAsIHNlbGYuX2lzX3NwZWNpYWwpCisKKyAgICBkZWYgZXhwKHNlbGYsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybnMgZSAqKiBzZWxmLiIiIgorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICAjIGV4cChOYU4pID0gTmFOCisgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMoY29udGV4dD1jb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgIyBleHAoLUluZmluaXR5KSA9IDAKKyAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpID09IC0xOgorICAgICAgICAgICAgcmV0dXJuIF9aZXJvCisKKyAgICAgICAgIyBleHAoMCkgPSAxCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIF9PbmUKKworICAgICAgICAjIGV4cChJbmZpbml0eSkgPSBJbmZpbml0eQorICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCkgPT0gMToKKyAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpCisKKyAgICAgICAgIyB0aGUgcmVzdWx0IGlzIG5vdyBndWFyYW50ZWVkIHRvIGJlIGluZXhhY3QgKHRoZSB0cnVlCisgICAgICAgICMgbWF0aGVtYXRpY2FsIHJlc3VsdCBpcyB0cmFuc2NlbmRlbnRhbCkuIFRoZXJlJ3Mgbm8gbmVlZCB0bworICAgICAgICAjIHJhaXNlIFJvdW5kZWQgYW5kIEluZXhhY3QgaGVyZS0tLXRoZXknbGwgYWx3YXlzIGJlIHJhaXNlZCBhcworICAgICAgICAjIGEgcmVzdWx0IG9mIHRoZSBjYWxsIHRvIF9maXguCisgICAgICAgIHAgPSBjb250ZXh0LnByZWMKKyAgICAgICAgYWRqID0gc2VsZi5hZGp1c3RlZCgpCisKKyAgICAgICAgIyB3ZSBvbmx5IG5lZWQgdG8gZG8gYW55IGNvbXB1dGF0aW9uIGZvciBxdWl0ZSBhIHNtYWxsIHJhbmdlCisgICAgICAgICMgb2YgYWRqdXN0ZWQgZXhwb25lbnRzLS0tZm9yIGV4YW1wbGUsIC0yOSA8PSBhZGogPD0gMTAgZm9yCisgICAgICAgICMgdGhlIGRlZmF1bHQgY29udGV4dC4gIEZvciBzbWFsbGVyIGV4cG9uZW50IHRoZSByZXN1bHQgaXMKKyAgICAgICAgIyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIDEgYXQgdGhlIGdpdmVuIHByZWNpc2lvbiwgd2hpbGUgZm9yCisgICAgICAgICMgbGFyZ2VyIGV4cG9uZW50IHRoZSByZXN1bHQgZWl0aGVyIG92ZXJmbG93cyBvciB1bmRlcmZsb3dzLgorICAgICAgICBpZiBzZWxmLl9zaWduID09IDAgYW5kIGFkaiA+IGxlbihzdHIoKGNvbnRleHQuRW1heCsxKSozKSk6CisgICAgICAgICAgICAjIG92ZXJmbG93CisgICAgICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKDAsICcxJywgY29udGV4dC5FbWF4KzEpCisgICAgICAgIGVsaWYgc2VsZi5fc2lnbiA9PSAxIGFuZCBhZGogPiBsZW4oc3RyKCgtY29udGV4dC5FdGlueSgpKzEpKjMpKToKKyAgICAgICAgICAgICMgdW5kZXJmbG93IHRvIDAKKyAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUoMCwgJzEnLCBjb250ZXh0LkV0aW55KCktMSkKKyAgICAgICAgZWxpZiBzZWxmLl9zaWduID09IDAgYW5kIGFkaiA8IC1wOgorICAgICAgICAgICAgIyBwKzEgZGlnaXRzOyBmaW5hbCByb3VuZCB3aWxsIHJhaXNlIGNvcnJlY3QgZmxhZ3MKKyAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUoMCwgJzEnICsgJzAnKihwLTEpICsgJzEnLCAtcCkKKyAgICAgICAgZWxpZiBzZWxmLl9zaWduID09IDEgYW5kIGFkaiA8IC1wLTE6CisgICAgICAgICAgICAjIHArMSBkaWdpdHM7IGZpbmFsIHJvdW5kIHdpbGwgcmFpc2UgY29ycmVjdCBmbGFncworICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZSgwLCAnOScqKHArMSksIC1wLTEpCisgICAgICAgICMgZ2VuZXJhbCBjYXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcCA9IF9Xb3JrUmVwKHNlbGYpCisgICAgICAgICAgICBjLCBlID0gb3AuaW50LCBvcC5leHAKKyAgICAgICAgICAgIGlmIG9wLnNpZ24gPT0gMToKKyAgICAgICAgICAgICAgICBjID0gLWMKKworICAgICAgICAgICAgIyBjb21wdXRlIGNvcnJlY3RseSByb3VuZGVkIHJlc3VsdDogaW5jcmVhc2UgcHJlY2lzaW9uIGJ5CisgICAgICAgICAgICAjIDMgZGlnaXRzIGF0IGEgdGltZSB1bnRpbCB3ZSBnZXQgYW4gdW5hbWJpZ3VvdXNseQorICAgICAgICAgICAgIyByb3VuZGFibGUgcmVzdWx0CisgICAgICAgICAgICBleHRyYSA9IDMKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgY29lZmYsIGV4cCA9IF9kZXhwKGMsIGUsIHArZXh0cmEpCisgICAgICAgICAgICAgICAgaWYgY29lZmYgJSAoNSoxMCoqKGxlbihzdHIoY29lZmYpKS1wLTEpKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBleHRyYSArPSAzCisKKyAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUoMCwgc3RyKGNvZWZmKSwgZXhwKQorCisgICAgICAgICMgYXQgdGhpcyBzdGFnZSwgYW5zIHNob3VsZCByb3VuZCBjb3JyZWN0bHkgd2l0aCAqYW55KgorICAgICAgICAjIHJvdW5kaW5nIG1vZGUsIG5vdCBqdXN0IHdpdGggUk9VTkRfSEFMRl9FVkVOCisgICAgICAgIGNvbnRleHQgPSBjb250ZXh0Ll9zaGFsbG93X2NvcHkoKQorICAgICAgICByb3VuZGluZyA9IGNvbnRleHQuX3NldF9yb3VuZGluZyhST1VORF9IQUxGX0VWRU4pCisgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisgICAgICAgIGNvbnRleHQucm91bmRpbmcgPSByb3VuZGluZworCisgICAgICAgIHJldHVybiBhbnMKKworICAgIGRlZiBpc19jYW5vbmljYWwoc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHNlbGYgaXMgY2Fub25pY2FsOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLgorCisgICAgICAgIEN1cnJlbnRseSwgdGhlIGVuY29kaW5nIG9mIGEgRGVjaW1hbCBpbnN0YW5jZSBpcyBhbHdheXMKKyAgICAgICAgY2Fub25pY2FsLCBzbyB0aGlzIG1ldGhvZCByZXR1cm5zIFRydWUgZm9yIGFueSBEZWNpbWFsLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBpc19maW5pdGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHNlbGYgaXMgZmluaXRlOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLgorCisgICAgICAgIEEgRGVjaW1hbCBpbnN0YW5jZSBpcyBjb25zaWRlcmVkIGZpbml0ZSBpZiBpdCBpcyBuZWl0aGVyCisgICAgICAgIGluZmluaXRlIG5vciBhIE5hTi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBub3Qgc2VsZi5faXNfc3BlY2lhbAorCisgICAgZGVmIGlzX2luZmluaXRlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBzZWxmIGlzIGluZmluaXRlOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZXhwID09ICdGJworCisgICAgZGVmIGlzX25hbihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgc2VsZiBpcyBhIHFOYU4gb3Igc05hTjsgb3RoZXJ3aXNlIHJldHVybiBGYWxzZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4cCBpbiAoJ24nLCAnTicpCisKKyAgICBkZWYgaXNfbm9ybWFsKHNlbGYsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHNlbGYgaXMgYSBub3JtYWwgbnVtYmVyOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLiIiIgorICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsIG9yIG5vdCBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuRW1pbiA8PSBzZWxmLmFkanVzdGVkKCkKKworICAgIGRlZiBpc19xbmFuKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBzZWxmIGlzIGEgcXVpZXQgTmFOOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZXhwID09ICduJworCisgICAgZGVmIGlzX3NpZ25lZChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgc2VsZiBpcyBuZWdhdGl2ZTsgb3RoZXJ3aXNlIHJldHVybiBGYWxzZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NpZ24gPT0gMQorCisgICAgZGVmIGlzX3NuYW4oc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHNlbGYgaXMgYSBzaWduYWxpbmcgTmFOOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZXhwID09ICdOJworCisgICAgZGVmIGlzX3N1Ym5vcm1hbChzZWxmLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBzZWxmIGlzIHN1Ym5vcm1hbDsgb3RoZXJ3aXNlIHJldHVybiBGYWxzZS4iIiIKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbCBvciBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIHJldHVybiBzZWxmLmFkanVzdGVkKCkgPCBjb250ZXh0LkVtaW4KKworICAgIGRlZiBpc196ZXJvKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBzZWxmIGlzIGEgemVybzsgb3RoZXJ3aXNlIHJldHVybiBGYWxzZS4iIiIKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9pc19zcGVjaWFsIGFuZCBzZWxmLl9pbnQgPT0gJzAnCisKKyAgICBkZWYgX2xuX2V4cF9ib3VuZChzZWxmKToKKyAgICAgICAgIiIiQ29tcHV0ZSBhIGxvd2VyIGJvdW5kIGZvciB0aGUgYWRqdXN0ZWQgZXhwb25lbnQgb2Ygc2VsZi5sbigpLgorICAgICAgICBJbiBvdGhlciB3b3JkcywgY29tcHV0ZSByIHN1Y2ggdGhhdCBzZWxmLmxuKCkgPj0gMTAqKnIuICBBc3N1bWVzCisgICAgICAgIHRoYXQgc2VsZiBpcyBmaW5pdGUgYW5kIHBvc2l0aXZlIGFuZCB0aGF0IHNlbGYgIT0gMS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBmb3IgMC4xIDw9IHggPD0gMTAgd2UgdXNlIHRoZSBpbmVxdWFsaXRpZXMgMS0xL3ggPD0gbG4oeCkgPD0geC0xCisgICAgICAgIGFkaiA9IHNlbGYuX2V4cCArIGxlbihzZWxmLl9pbnQpIC0gMQorICAgICAgICBpZiBhZGogPj0gMToKKyAgICAgICAgICAgICMgYXJndW1lbnQgPj0gMTA7IHdlIHVzZSAyMy8xMCA9IDIuMyBhcyBhIGxvd2VyIGJvdW5kIGZvciBsbigxMCkKKyAgICAgICAgICAgIHJldHVybiBsZW4oc3RyKGFkaioyMy8vMTApKSAtIDEKKyAgICAgICAgaWYgYWRqIDw9IC0yOgorICAgICAgICAgICAgIyBhcmd1bWVudCA8PSAwLjEKKyAgICAgICAgICAgIHJldHVybiBsZW4oc3RyKCgtMS1hZGopKjIzLy8xMCkpIC0gMQorICAgICAgICBvcCA9IF9Xb3JrUmVwKHNlbGYpCisgICAgICAgIGMsIGUgPSBvcC5pbnQsIG9wLmV4cAorICAgICAgICBpZiBhZGogPT0gMDoKKyAgICAgICAgICAgICMgMSA8IHNlbGYgPCAxMAorICAgICAgICAgICAgbnVtID0gc3RyKGMtMTAqKi1lKQorICAgICAgICAgICAgZGVuID0gc3RyKGMpCisgICAgICAgICAgICByZXR1cm4gbGVuKG51bSkgLSBsZW4oZGVuKSAtIChudW0gPCBkZW4pCisgICAgICAgICMgYWRqID09IC0xLCAwLjEgPD0gc2VsZiA8IDEKKyAgICAgICAgcmV0dXJuIGUgKyBsZW4oc3RyKDEwKiotZSAtIGMpKSAtIDEKKworCisgICAgZGVmIGxuKHNlbGYsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIG5hdHVyYWwgKGJhc2UgZSkgbG9nYXJpdGhtIG9mIHNlbGYuIiIiCisKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgICMgbG4oTmFOKSA9IE5hTgorICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgICMgbG4oMC4wKSA9PSAtSW5maW5pdHkKKyAgICAgICAgaWYgbm90IHNlbGY6CisgICAgICAgICAgICByZXR1cm4gX05lZ2F0aXZlSW5maW5pdHkKKworICAgICAgICAjIGxuKEluZmluaXR5KSA9IEluZmluaXR5CisgICAgICAgIGlmIHNlbGYuX2lzaW5maW5pdHkoKSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIF9JbmZpbml0eQorCisgICAgICAgICMgbG4oMS4wKSA9PSAwLjAKKyAgICAgICAgaWYgc2VsZiA9PSBfT25lOgorICAgICAgICAgICAgcmV0dXJuIF9aZXJvCisKKyAgICAgICAgIyBsbihuZWdhdGl2ZSkgcmFpc2VzIEludmFsaWRPcGVyYXRpb24KKyAgICAgICAgaWYgc2VsZi5fc2lnbiA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xuIG9mIGEgbmVnYXRpdmUgdmFsdWUnKQorCisgICAgICAgICMgcmVzdWx0IGlzIGlycmF0aW9uYWwsIHNvIG5lY2Vzc2FyaWx5IGluZXhhY3QKKyAgICAgICAgb3AgPSBfV29ya1JlcChzZWxmKQorICAgICAgICBjLCBlID0gb3AuaW50LCBvcC5leHAKKyAgICAgICAgcCA9IGNvbnRleHQucHJlYworCisgICAgICAgICMgY29ycmVjdGx5IHJvdW5kZWQgcmVzdWx0OiByZXBlYXRlZGx5IGluY3JlYXNlIHByZWNpc2lvbiBieSAzCisgICAgICAgICMgdW50aWwgd2UgZ2V0IGFuIHVuYW1iaWd1b3VzbHkgcm91bmRhYmxlIHJlc3VsdAorICAgICAgICBwbGFjZXMgPSBwIC0gc2VsZi5fbG5fZXhwX2JvdW5kKCkgKyAyICMgYXQgbGVhc3QgcCszIHBsYWNlcworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgY29lZmYgPSBfZGxvZyhjLCBlLCBwbGFjZXMpCisgICAgICAgICAgICAjIGFzc2VydCBsZW4oc3RyKGFicyhjb2VmZikpKS1wID49IDEKKyAgICAgICAgICAgIGlmIGNvZWZmICUgKDUqMTAqKihsZW4oc3RyKGFicyhjb2VmZikpKS1wLTEpKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcGxhY2VzICs9IDMKKyAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShpbnQoY29lZmY8MCksIHN0cihhYnMoY29lZmYpKSwgLXBsYWNlcykKKworICAgICAgICBjb250ZXh0ID0gY29udGV4dC5fc2hhbGxvd19jb3B5KCkKKyAgICAgICAgcm91bmRpbmcgPSBjb250ZXh0Ll9zZXRfcm91bmRpbmcoUk9VTkRfSEFMRl9FVkVOKQorICAgICAgICBhbnMgPSBhbnMuX2ZpeChjb250ZXh0KQorICAgICAgICBjb250ZXh0LnJvdW5kaW5nID0gcm91bmRpbmcKKyAgICAgICAgcmV0dXJuIGFucworCisgICAgZGVmIF9sb2cxMF9leHBfYm91bmQoc2VsZik6CisgICAgICAgICIiIkNvbXB1dGUgYSBsb3dlciBib3VuZCBmb3IgdGhlIGFkanVzdGVkIGV4cG9uZW50IG9mIHNlbGYubG9nMTAoKS4KKyAgICAgICAgSW4gb3RoZXIgd29yZHMsIGZpbmQgciBzdWNoIHRoYXQgc2VsZi5sb2cxMCgpID49IDEwKipyLgorICAgICAgICBBc3N1bWVzIHRoYXQgc2VsZiBpcyBmaW5pdGUgYW5kIHBvc2l0aXZlIGFuZCB0aGF0IHNlbGYgIT0gMS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBGb3IgeCA+PSAxMCBvciB4IDwgMC4xIHdlIG9ubHkgbmVlZCBhIGJvdW5kIG9uIHRoZSBpbnRlZ2VyCisgICAgICAgICMgcGFydCBvZiBsb2cxMChzZWxmKSwgYW5kIHRoaXMgY29tZXMgZGlyZWN0bHkgZnJvbSB0aGUKKyAgICAgICAgIyBleHBvbmVudCBvZiB4LiAgRm9yIDAuMSA8PSB4IDw9IDEwIHdlIHVzZSB0aGUgaW5lcXVhbGl0aWVzCisgICAgICAgICMgMS0xL3ggPD0gbG9nKHgpIDw9IHgtMS4gSWYgeCA+IDEgd2UgaGF2ZSB8bG9nMTAoeCl8ID4KKyAgICAgICAgIyAoMS0xL3gpLzIuMzEgPiAwLiAgSWYgeCA8IDEgdGhlbiB8bG9nMTAoeCl8ID4gKDEteCkvMi4zMSA+IDAKKworICAgICAgICBhZGogPSBzZWxmLl9leHAgKyBsZW4oc2VsZi5faW50KSAtIDEKKyAgICAgICAgaWYgYWRqID49IDE6CisgICAgICAgICAgICAjIHNlbGYgPj0gMTAKKyAgICAgICAgICAgIHJldHVybiBsZW4oc3RyKGFkaikpLTEKKyAgICAgICAgaWYgYWRqIDw9IC0yOgorICAgICAgICAgICAgIyBzZWxmIDwgMC4xCisgICAgICAgICAgICByZXR1cm4gbGVuKHN0cigtMS1hZGopKS0xCisgICAgICAgIG9wID0gX1dvcmtSZXAoc2VsZikKKyAgICAgICAgYywgZSA9IG9wLmludCwgb3AuZXhwCisgICAgICAgIGlmIGFkaiA9PSAwOgorICAgICAgICAgICAgIyAxIDwgc2VsZiA8IDEwCisgICAgICAgICAgICBudW0gPSBzdHIoYy0xMCoqLWUpCisgICAgICAgICAgICBkZW4gPSBzdHIoMjMxKmMpCisgICAgICAgICAgICByZXR1cm4gbGVuKG51bSkgLSBsZW4oZGVuKSAtIChudW0gPCBkZW4pICsgMgorICAgICAgICAjIGFkaiA9PSAtMSwgMC4xIDw9IHNlbGYgPCAxCisgICAgICAgIG51bSA9IHN0cigxMCoqLWUtYykKKyAgICAgICAgcmV0dXJuIGxlbihudW0pICsgZSAtIChudW0gPCAiMjMxIikgLSAxCisKKyAgICBkZWYgbG9nMTAoc2VsZiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgYmFzZSAxMCBsb2dhcml0aG0gb2Ygc2VsZi4iIiIKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgIyBsb2cxMChOYU4pID0gTmFOCisgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMoY29udGV4dD1jb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgIyBsb2cxMCgwLjApID09IC1JbmZpbml0eQorICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBfTmVnYXRpdmVJbmZpbml0eQorCisgICAgICAgICMgbG9nMTAoSW5maW5pdHkpID0gSW5maW5pdHkKKyAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpID09IDE6CisgICAgICAgICAgICByZXR1cm4gX0luZmluaXR5CisKKyAgICAgICAgIyBsb2cxMChuZWdhdGl2ZSBvciAtSW5maW5pdHkpIHJhaXNlcyBJbnZhbGlkT3BlcmF0aW9uCisgICAgICAgIGlmIHNlbGYuX3NpZ24gPT0gMToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb2cxMCBvZiBhIG5lZ2F0aXZlIHZhbHVlJykKKworICAgICAgICAjIGxvZzEwKDEwKipuKSA9IG4KKyAgICAgICAgaWYgc2VsZi5faW50WzBdID09ICcxJyBhbmQgc2VsZi5faW50WzE6XSA9PSAnMCcqKGxlbihzZWxmLl9pbnQpIC0gMSk6CisgICAgICAgICAgICAjIGFuc3dlciBtYXkgbmVlZCByb3VuZGluZworICAgICAgICAgICAgYW5zID0gRGVjaW1hbChzZWxmLl9leHAgKyBsZW4oc2VsZi5faW50KSAtIDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHJlc3VsdCBpcyBpcnJhdGlvbmFsLCBzbyBuZWNlc3NhcmlseSBpbmV4YWN0CisgICAgICAgICAgICBvcCA9IF9Xb3JrUmVwKHNlbGYpCisgICAgICAgICAgICBjLCBlID0gb3AuaW50LCBvcC5leHAKKyAgICAgICAgICAgIHAgPSBjb250ZXh0LnByZWMKKworICAgICAgICAgICAgIyBjb3JyZWN0bHkgcm91bmRlZCByZXN1bHQ6IHJlcGVhdGVkbHkgaW5jcmVhc2UgcHJlY2lzaW9uCisgICAgICAgICAgICAjIHVudGlsIHJlc3VsdCBpcyB1bmFtYmlndW91c2x5IHJvdW5kYWJsZQorICAgICAgICAgICAgcGxhY2VzID0gcC1zZWxmLl9sb2cxMF9leHBfYm91bmQoKSsyCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGNvZWZmID0gX2Rsb2cxMChjLCBlLCBwbGFjZXMpCisgICAgICAgICAgICAgICAgIyBhc3NlcnQgbGVuKHN0cihhYnMoY29lZmYpKSktcCA+PSAxCisgICAgICAgICAgICAgICAgaWYgY29lZmYgJSAoNSoxMCoqKGxlbihzdHIoYWJzKGNvZWZmKSkpLXAtMSkpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHBsYWNlcyArPSAzCisgICAgICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKGludChjb2VmZjwwKSwgc3RyKGFicyhjb2VmZikpLCAtcGxhY2VzKQorCisgICAgICAgIGNvbnRleHQgPSBjb250ZXh0Ll9zaGFsbG93X2NvcHkoKQorICAgICAgICByb3VuZGluZyA9IGNvbnRleHQuX3NldF9yb3VuZGluZyhST1VORF9IQUxGX0VWRU4pCisgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisgICAgICAgIGNvbnRleHQucm91bmRpbmcgPSByb3VuZGluZworICAgICAgICByZXR1cm4gYW5zCisKKyAgICBkZWYgbG9nYihzZWxmLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiIgUmV0dXJucyB0aGUgZXhwb25lbnQgb2YgdGhlIG1hZ25pdHVkZSBvZiBzZWxmJ3MgTVNELgorCisgICAgICAgIFRoZSByZXN1bHQgaXMgdGhlIGludGVnZXIgd2hpY2ggaXMgdGhlIGV4cG9uZW50IG9mIHRoZSBtYWduaXR1ZGUKKyAgICAgICAgb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXQgb2Ygc2VsZiAoYXMgdGhvdWdoIGl0IHdlcmUgdHJ1bmNhdGVkCisgICAgICAgIHRvIGEgc2luZ2xlIGRpZ2l0IHdoaWxlIG1haW50YWluaW5nIHRoZSB2YWx1ZSBvZiB0aGF0IGRpZ2l0IGFuZAorICAgICAgICB3aXRob3V0IGxpbWl0aW5nIHRoZSByZXN1bHRpbmcgZXhwb25lbnQpLgorICAgICAgICAiIiIKKyAgICAgICAgIyBsb2diKE5hTikgPSBOYU4KKyAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhjb250ZXh0PWNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgIyBsb2diKCsvLUluZikgPSArSW5mCisgICAgICAgIGlmIHNlbGYuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgIHJldHVybiBfSW5maW5pdHkKKworICAgICAgICAjIGxvZ2IoMCkgPSAtSW5mLCBEaXZpc2lvbkJ5WmVybworICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihEaXZpc2lvbkJ5WmVybywgJ2xvZ2IoMCknLCAxKQorCisgICAgICAgICMgb3RoZXJ3aXNlLCBzaW1wbHkgcmV0dXJuIHRoZSBhZGp1c3RlZCBleHBvbmVudCBvZiBzZWxmLCBhcyBhCisgICAgICAgICMgRGVjaW1hbC4gIE5vdGUgdGhhdCBubyBhdHRlbXB0IGlzIG1hZGUgdG8gZml0IHRoZSByZXN1bHQKKyAgICAgICAgIyBpbnRvIHRoZSBjdXJyZW50IGNvbnRleHQuCisgICAgICAgIGFucyA9IERlY2ltYWwoc2VsZi5hZGp1c3RlZCgpKQorICAgICAgICByZXR1cm4gYW5zLl9maXgoY29udGV4dCkKKworICAgIGRlZiBfaXNsb2dpY2FsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBzZWxmIGlzIGEgbG9naWNhbCBvcGVyYW5kLgorCisgICAgICAgIEZvciBiZWluZyBsb2dpY2FsLCBpdCBtdXN0IGJlIGEgZmluaXRlIG51bWJlciB3aXRoIGEgc2lnbiBvZiAwLAorICAgICAgICBhbiBleHBvbmVudCBvZiAwLCBhbmQgYSBjb2VmZmljaWVudCB3aG9zZSBkaWdpdHMgbXVzdCBhbGwgYmUKKyAgICAgICAgZWl0aGVyIDAgb3IgMS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX3NpZ24gIT0gMCBvciBzZWxmLl9leHAgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmb3IgZGlnIGluIHNlbGYuX2ludDoKKyAgICAgICAgICAgIGlmIGRpZyBub3QgaW4gJzAxJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBfZmlsbF9sb2dpY2FsKHNlbGYsIGNvbnRleHQsIG9wYSwgb3BiKToKKyAgICAgICAgZGlmID0gY29udGV4dC5wcmVjIC0gbGVuKG9wYSkKKyAgICAgICAgaWYgZGlmID4gMDoKKyAgICAgICAgICAgIG9wYSA9ICcwJypkaWYgKyBvcGEKKyAgICAgICAgZWxpZiBkaWYgPCAwOgorICAgICAgICAgICAgb3BhID0gb3BhWy1jb250ZXh0LnByZWM6XQorICAgICAgICBkaWYgPSBjb250ZXh0LnByZWMgLSBsZW4ob3BiKQorICAgICAgICBpZiBkaWYgPiAwOgorICAgICAgICAgICAgb3BiID0gJzAnKmRpZiArIG9wYgorICAgICAgICBlbGlmIGRpZiA8IDA6CisgICAgICAgICAgICBvcGIgPSBvcGJbLWNvbnRleHQucHJlYzpdCisgICAgICAgIHJldHVybiBvcGEsIG9wYgorCisgICAgZGVmIGxvZ2ljYWxfYW5kKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJBcHBsaWVzIGFuICdhbmQnIG9wZXJhdGlvbiBiZXR3ZWVuIHNlbGYgYW5kIG90aGVyJ3MgZGlnaXRzLiIiIgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorCisgICAgICAgIGlmIG5vdCBzZWxmLl9pc2xvZ2ljYWwoKSBvciBub3Qgb3RoZXIuX2lzbG9naWNhbCgpOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24pCisKKyAgICAgICAgIyBmaWxsIHRvIGNvbnRleHQucHJlYworICAgICAgICAob3BhLCBvcGIpID0gc2VsZi5fZmlsbF9sb2dpY2FsKGNvbnRleHQsIHNlbGYuX2ludCwgb3RoZXIuX2ludCkKKworICAgICAgICAjIG1ha2UgdGhlIG9wZXJhdGlvbiwgYW5kIGNsZWFuIHN0YXJ0aW5nIHplcm9lcworICAgICAgICByZXN1bHQgPSAiIi5qb2luKFtzdHIoaW50KGEpJmludChiKSkgZm9yIGEsYiBpbiB6aXAob3BhLG9wYildKQorICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZSgwLCByZXN1bHQubHN0cmlwKCcwJykgb3IgJzAnLCAwKQorCisgICAgZGVmIGxvZ2ljYWxfaW52ZXJ0KHNlbGYsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIkludmVydCBhbGwgaXRzIGRpZ2l0cy4iIiIKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorICAgICAgICByZXR1cm4gc2VsZi5sb2dpY2FsX3hvcihfZGVjX2Zyb21fdHJpcGxlKDAsJzEnKmNvbnRleHQucHJlYywwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCkKKworICAgIGRlZiBsb2dpY2FsX29yKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJBcHBsaWVzIGFuICdvcicgb3BlcmF0aW9uIGJldHdlZW4gc2VsZiBhbmQgb3RoZXIncyBkaWdpdHMuIiIiCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisKKyAgICAgICAgaWYgbm90IHNlbGYuX2lzbG9naWNhbCgpIG9yIG5vdCBvdGhlci5faXNsb2dpY2FsKCk6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbikKKworICAgICAgICAjIGZpbGwgdG8gY29udGV4dC5wcmVjCisgICAgICAgIChvcGEsIG9wYikgPSBzZWxmLl9maWxsX2xvZ2ljYWwoY29udGV4dCwgc2VsZi5faW50LCBvdGhlci5faW50KQorCisgICAgICAgICMgbWFrZSB0aGUgb3BlcmF0aW9uLCBhbmQgY2xlYW4gc3RhcnRpbmcgemVyb2VzCisgICAgICAgIHJlc3VsdCA9ICIiLmpvaW4oW3N0cihpbnQoYSl8aW50KGIpKSBmb3IgYSxiIGluIHppcChvcGEsb3BiKV0pCisgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKDAsIHJlc3VsdC5sc3RyaXAoJzAnKSBvciAnMCcsIDApCisKKyAgICBkZWYgbG9naWNhbF94b3Ioc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIkFwcGxpZXMgYW4gJ3hvcicgb3BlcmF0aW9uIGJldHdlZW4gc2VsZiBhbmQgb3RoZXIncyBkaWdpdHMuIiIiCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisKKyAgICAgICAgaWYgbm90IHNlbGYuX2lzbG9naWNhbCgpIG9yIG5vdCBvdGhlci5faXNsb2dpY2FsKCk6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbikKKworICAgICAgICAjIGZpbGwgdG8gY29udGV4dC5wcmVjCisgICAgICAgIChvcGEsIG9wYikgPSBzZWxmLl9maWxsX2xvZ2ljYWwoY29udGV4dCwgc2VsZi5faW50LCBvdGhlci5faW50KQorCisgICAgICAgICMgbWFrZSB0aGUgb3BlcmF0aW9uLCBhbmQgY2xlYW4gc3RhcnRpbmcgemVyb2VzCisgICAgICAgIHJlc3VsdCA9ICIiLmpvaW4oW3N0cihpbnQoYSleaW50KGIpKSBmb3IgYSxiIGluIHppcChvcGEsb3BiKV0pCisgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKDAsIHJlc3VsdC5sc3RyaXAoJzAnKSBvciAnMCcsIDApCisKKyAgICBkZWYgbWF4X21hZyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiQ29tcGFyZXMgdGhlIHZhbHVlcyBudW1lcmljYWxseSB3aXRoIHRoZWlyIHNpZ24gaWdub3JlZC4iIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsIG9yIG90aGVyLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgIyBJZiBvbmUgb3BlcmFuZCBpcyBhIHF1aWV0IE5hTiBhbmQgdGhlIG90aGVyIGlzIG51bWJlciwgdGhlbiB0aGUKKyAgICAgICAgICAgICMgbnVtYmVyIGlzIGFsd2F5cyByZXR1cm5lZAorICAgICAgICAgICAgc24gPSBzZWxmLl9pc25hbigpCisgICAgICAgICAgICBvbiA9IG90aGVyLl9pc25hbigpCisgICAgICAgICAgICBpZiBzbiBvciBvbjoKKyAgICAgICAgICAgICAgICBpZiBvbiA9PSAxIGFuZCBzbiA9PSAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZml4KGNvbnRleHQpCisgICAgICAgICAgICAgICAgaWYgc24gPT0gMSBhbmQgb24gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyLl9maXgoY29udGV4dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKworICAgICAgICBjID0gc2VsZi5jb3B5X2FicygpLl9jbXAob3RoZXIuY29weV9hYnMoKSkKKyAgICAgICAgaWYgYyA9PSAwOgorICAgICAgICAgICAgYyA9IHNlbGYuY29tcGFyZV90b3RhbChvdGhlcikKKworICAgICAgICBpZiBjID09IC0xOgorICAgICAgICAgICAgYW5zID0gb3RoZXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFucyA9IHNlbGYKKworICAgICAgICByZXR1cm4gYW5zLl9maXgoY29udGV4dCkKKworICAgIGRlZiBtaW5fbWFnKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJDb21wYXJlcyB0aGUgdmFsdWVzIG51bWVyaWNhbGx5IHdpdGggdGhlaXIgc2lnbiBpZ25vcmVkLiIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWwgb3Igb3RoZXIuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICAjIElmIG9uZSBvcGVyYW5kIGlzIGEgcXVpZXQgTmFOIGFuZCB0aGUgb3RoZXIgaXMgbnVtYmVyLCB0aGVuIHRoZQorICAgICAgICAgICAgIyBudW1iZXIgaXMgYWx3YXlzIHJldHVybmVkCisgICAgICAgICAgICBzbiA9IHNlbGYuX2lzbmFuKCkKKyAgICAgICAgICAgIG9uID0gb3RoZXIuX2lzbmFuKCkKKyAgICAgICAgICAgIGlmIHNuIG9yIG9uOgorICAgICAgICAgICAgICAgIGlmIG9uID09IDEgYW5kIHNuID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXgoY29udGV4dCkKKyAgICAgICAgICAgICAgICBpZiBzbiA9PSAxIGFuZCBvbiA9PSAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIuX2ZpeChjb250ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorCisgICAgICAgIGMgPSBzZWxmLmNvcHlfYWJzKCkuX2NtcChvdGhlci5jb3B5X2FicygpKQorICAgICAgICBpZiBjID09IDA6CisgICAgICAgICAgICBjID0gc2VsZi5jb21wYXJlX3RvdGFsKG90aGVyKQorCisgICAgICAgIGlmIGMgPT0gLTE6CisgICAgICAgICAgICBhbnMgPSBzZWxmCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbnMgPSBvdGhlcgorCisgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgZGVmIG5leHRfbWludXMoc2VsZiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIG51bWJlciBzbWFsbGVyIHRoYW4gaXRzZWxmLiIiIgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhjb250ZXh0PWNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCkgPT0gLTE6CisgICAgICAgICAgICByZXR1cm4gX05lZ2F0aXZlSW5maW5pdHkKKyAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpID09IDE6CisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZSgwLCAnOScqY29udGV4dC5wcmVjLCBjb250ZXh0LkV0b3AoKSkKKworICAgICAgICBjb250ZXh0ID0gY29udGV4dC5jb3B5KCkKKyAgICAgICAgY29udGV4dC5fc2V0X3JvdW5kaW5nKFJPVU5EX0ZMT09SKQorICAgICAgICBjb250ZXh0Ll9pZ25vcmVfYWxsX2ZsYWdzKCkKKyAgICAgICAgbmV3X3NlbGYgPSBzZWxmLl9maXgoY29udGV4dCkKKyAgICAgICAgaWYgbmV3X3NlbGYgIT0gc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBuZXdfc2VsZgorICAgICAgICByZXR1cm4gc2VsZi5fX3N1Yl9fKF9kZWNfZnJvbV90cmlwbGUoMCwgJzEnLCBjb250ZXh0LkV0aW55KCktMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCkKKworICAgIGRlZiBuZXh0X3BsdXMoc2VsZiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIgbGFyZ2VyIHRoYW4gaXRzZWxmLiIiIgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhjb250ZXh0PWNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCkgPT0gMToKKyAgICAgICAgICAgIHJldHVybiBfSW5maW5pdHkKKyAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpID09IC0xOgorICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoMSwgJzknKmNvbnRleHQucHJlYywgY29udGV4dC5FdG9wKCkpCisKKyAgICAgICAgY29udGV4dCA9IGNvbnRleHQuY29weSgpCisgICAgICAgIGNvbnRleHQuX3NldF9yb3VuZGluZyhST1VORF9DRUlMSU5HKQorICAgICAgICBjb250ZXh0Ll9pZ25vcmVfYWxsX2ZsYWdzKCkKKyAgICAgICAgbmV3X3NlbGYgPSBzZWxmLl9maXgoY29udGV4dCkKKyAgICAgICAgaWYgbmV3X3NlbGYgIT0gc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBuZXdfc2VsZgorICAgICAgICByZXR1cm4gc2VsZi5fX2FkZF9fKF9kZWNfZnJvbV90cmlwbGUoMCwgJzEnLCBjb250ZXh0LkV0aW55KCktMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCkKKworICAgIGRlZiBuZXh0X3Rvd2FyZChzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbnVtYmVyIGNsb3Nlc3QgdG8gc2VsZiwgaW4gdGhlIGRpcmVjdGlvbiB0b3dhcmRzIG90aGVyLgorCisgICAgICAgIFRoZSByZXN1bHQgaXMgdGhlIGNsb3Nlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIgdG8gc2VsZgorICAgICAgICAoZXhjbHVkaW5nIHNlbGYpIHRoYXQgaXMgaW4gdGhlIGRpcmVjdGlvbiB0b3dhcmRzIG90aGVyLAorICAgICAgICB1bmxlc3MgYm90aCBoYXZlIHRoZSBzYW1lIHZhbHVlLiAgSWYgdGhlIHR3byBvcGVyYW5kcyBhcmUKKyAgICAgICAgbnVtZXJpY2FsbHkgZXF1YWwsIHRoZW4gdGhlIHJlc3VsdCBpcyBhIGNvcHkgb2Ygc2VsZiB3aXRoIHRoZQorICAgICAgICBzaWduIHNldCB0byBiZSB0aGUgc2FtZSBhcyB0aGUgc2lnbiBvZiBvdGhlci4KKyAgICAgICAgIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIHJhaXNlaXQ9VHJ1ZSkKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgIGNvbXBhcmlzb24gPSBzZWxmLl9jbXAob3RoZXIpCisgICAgICAgIGlmIGNvbXBhcmlzb24gPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvcHlfc2lnbihvdGhlcikKKworICAgICAgICBpZiBjb21wYXJpc29uID09IC0xOgorICAgICAgICAgICAgYW5zID0gc2VsZi5uZXh0X3BsdXMoY29udGV4dCkKKyAgICAgICAgZWxzZTogIyBjb21wYXJpc29uID09IDEKKyAgICAgICAgICAgIGFucyA9IHNlbGYubmV4dF9taW51cyhjb250ZXh0KQorCisgICAgICAgICMgZGVjaWRlIHdoaWNoIGZsYWdzIHRvIHJhaXNlIHVzaW5nIHZhbHVlIG9mIGFucworICAgICAgICBpZiBhbnMuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKE92ZXJmbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0luZmluaXRlIHJlc3VsdCBmcm9tIG5leHRfdG93YXJkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFucy5fc2lnbikKKyAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKEluZXhhY3QpCisgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihSb3VuZGVkKQorICAgICAgICBlbGlmIGFucy5hZGp1c3RlZCgpIDwgY29udGV4dC5FbWluOgorICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoVW5kZXJmbG93KQorICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoU3Vibm9ybWFsKQorICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoSW5leGFjdCkKKyAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKFJvdW5kZWQpCisgICAgICAgICAgICAjIGlmIHByZWNpc2lvbiA9PSAxIHRoZW4gd2UgZG9uJ3QgcmFpc2UgQ2xhbXBlZCBmb3IgYQorICAgICAgICAgICAgIyByZXN1bHQgMEUtRXRpbnkuCisgICAgICAgICAgICBpZiBub3QgYW5zOgorICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKENsYW1wZWQpCisKKyAgICAgICAgcmV0dXJuIGFucworCisgICAgZGVmIG51bWJlcl9jbGFzcyhzZWxmLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIGFuIGluZGljYXRpb24gb2YgdGhlIGNsYXNzIG9mIHNlbGYuCisKKyAgICAgICAgVGhlIGNsYXNzIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0cmluZ3M6CisgICAgICAgICAgc05hTgorICAgICAgICAgIE5hTgorICAgICAgICAgIC1JbmZpbml0eQorICAgICAgICAgIC1Ob3JtYWwKKyAgICAgICAgICAtU3Vibm9ybWFsCisgICAgICAgICAgLVplcm8KKyAgICAgICAgICArWmVybworICAgICAgICAgICtTdWJub3JtYWwKKyAgICAgICAgICArTm9ybWFsCisgICAgICAgICAgK0luZmluaXR5CisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmlzX3NuYW4oKToKKyAgICAgICAgICAgIHJldHVybiAic05hTiIKKyAgICAgICAgaWYgc2VsZi5pc19xbmFuKCk6CisgICAgICAgICAgICByZXR1cm4gIk5hTiIKKyAgICAgICAgaW5mID0gc2VsZi5faXNpbmZpbml0eSgpCisgICAgICAgIGlmIGluZiA9PSAxOgorICAgICAgICAgICAgcmV0dXJuICIrSW5maW5pdHkiCisgICAgICAgIGlmIGluZiA9PSAtMToKKyAgICAgICAgICAgIHJldHVybiAiLUluZmluaXR5IgorICAgICAgICBpZiBzZWxmLmlzX3plcm8oKToKKyAgICAgICAgICAgIGlmIHNlbGYuX3NpZ246CisgICAgICAgICAgICAgICAgcmV0dXJuICItWmVybyIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICIrWmVybyIKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorICAgICAgICBpZiBzZWxmLmlzX3N1Ym5vcm1hbChjb250ZXh0PWNvbnRleHQpOgorICAgICAgICAgICAgaWYgc2VsZi5fc2lnbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIi1TdWJub3JtYWwiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAiK1N1Ym5vcm1hbCIKKyAgICAgICAgIyBqdXN0IGEgbm9ybWFsLCByZWd1bGFyLCBib3JpbmcgbnVtYmVyLCA6KQorICAgICAgICBpZiBzZWxmLl9zaWduOgorICAgICAgICAgICAgcmV0dXJuICItTm9ybWFsIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICIrTm9ybWFsIgorCisgICAgZGVmIHJhZGl4KHNlbGYpOgorICAgICAgICAiIiJKdXN0IHJldHVybnMgMTAsIGFzIHRoaXMgaXMgRGVjaW1hbCwgOikiIiIKKyAgICAgICAgcmV0dXJuIERlY2ltYWwoMTApCisKKyAgICBkZWYgcm90YXRlKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIGEgcm90YXRlZCBjb3B5IG9mIHNlbGYsIHZhbHVlLW9mLW90aGVyIHRpbWVzLiIiIgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorCisgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICBpZiBvdGhlci5fZXhwICE9IDA6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbikKKyAgICAgICAgaWYgbm90ICgtY29udGV4dC5wcmVjIDw9IGludChvdGhlcikgPD0gY29udGV4dC5wcmVjKToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uKQorCisgICAgICAgIGlmIHNlbGYuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpCisKKyAgICAgICAgIyBnZXQgdmFsdWVzLCBwYWQgaWYgbmVjZXNzYXJ5CisgICAgICAgIHRvcm90ID0gaW50KG90aGVyKQorICAgICAgICByb3RkaWcgPSBzZWxmLl9pbnQKKyAgICAgICAgdG9wYWQgPSBjb250ZXh0LnByZWMgLSBsZW4ocm90ZGlnKQorICAgICAgICBpZiB0b3BhZCA+IDA6CisgICAgICAgICAgICByb3RkaWcgPSAnMCcqdG9wYWQgKyByb3RkaWcKKyAgICAgICAgZWxpZiB0b3BhZCA8IDA6CisgICAgICAgICAgICByb3RkaWcgPSByb3RkaWdbLXRvcGFkOl0KKworICAgICAgICAjIGxldCdzIHJvdGF0ZSEKKyAgICAgICAgcm90YXRlZCA9IHJvdGRpZ1t0b3JvdDpdICsgcm90ZGlnWzp0b3JvdF0KKyAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoc2VsZi5fc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlZC5sc3RyaXAoJzAnKSBvciAnMCcsIHNlbGYuX2V4cCkKKworICAgIGRlZiBzY2FsZWIoc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybnMgc2VsZiBvcGVyYW5kIGFmdGVyIGFkZGluZyB0aGUgc2Vjb25kIHZhbHVlIHRvIGl0cyBleHAuIiIiCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisKKyAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgIGlmIG90aGVyLl9leHAgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uKQorICAgICAgICBsaW1pbmYgPSAtMiAqIChjb250ZXh0LkVtYXggKyBjb250ZXh0LnByZWMpCisgICAgICAgIGxpbXN1cCA9ICAyICogKGNvbnRleHQuRW1heCArIGNvbnRleHQucHJlYykKKyAgICAgICAgaWYgbm90IChsaW1pbmYgPD0gaW50KG90aGVyKSA8PSBsaW1zdXApOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24pCisKKyAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikKKworICAgICAgICBkID0gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLCBzZWxmLl9pbnQsIHNlbGYuX2V4cCArIGludChvdGhlcikpCisgICAgICAgIGQgPSBkLl9maXgoY29udGV4dCkKKyAgICAgICAgcmV0dXJuIGQKKworICAgIGRlZiBzaGlmdChzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyBhIHNoaWZ0ZWQgY29weSBvZiBzZWxmLCB2YWx1ZS1vZi1vdGhlciB0aW1lcy4iIiIKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIHJhaXNlaXQ9VHJ1ZSkKKworICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgaWYgb3RoZXIuX2V4cCAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24pCisgICAgICAgIGlmIG5vdCAoLWNvbnRleHQucHJlYyA8PSBpbnQob3RoZXIpIDw9IGNvbnRleHQucHJlYyk6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbikKKworICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICByZXR1cm4gRGVjaW1hbChzZWxmKQorCisgICAgICAgICMgZ2V0IHZhbHVlcywgcGFkIGlmIG5lY2Vzc2FyeQorICAgICAgICB0b3JvdCA9IGludChvdGhlcikKKyAgICAgICAgcm90ZGlnID0gc2VsZi5faW50CisgICAgICAgIHRvcGFkID0gY29udGV4dC5wcmVjIC0gbGVuKHJvdGRpZykKKyAgICAgICAgaWYgdG9wYWQgPiAwOgorICAgICAgICAgICAgcm90ZGlnID0gJzAnKnRvcGFkICsgcm90ZGlnCisgICAgICAgIGVsaWYgdG9wYWQgPCAwOgorICAgICAgICAgICAgcm90ZGlnID0gcm90ZGlnWy10b3BhZDpdCisKKyAgICAgICAgIyBsZXQncyBzaGlmdCEKKyAgICAgICAgaWYgdG9yb3QgPCAwOgorICAgICAgICAgICAgc2hpZnRlZCA9IHJvdGRpZ1s6dG9yb3RdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaGlmdGVkID0gcm90ZGlnICsgJzAnKnRvcm90CisgICAgICAgICAgICBzaGlmdGVkID0gc2hpZnRlZFstY29udGV4dC5wcmVjOl0KKworICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRlZC5sc3RyaXAoJzAnKSBvciAnMCcsIHNlbGYuX2V4cCkKKworICAgICMgU3VwcG9ydCBmb3IgcGlja2xpbmcsIGNvcHksIGFuZCBkZWVwY29weQorICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuX19jbGFzc19fLCAoc3RyKHNlbGYpLCkpCisKKyAgICBkZWYgX19jb3B5X18oc2VsZik6CisgICAgICAgIGlmIHR5cGUoc2VsZikgaXMgRGVjaW1hbDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmICAgICAjIEknbSBpbW11dGFibGU7IHRoZXJlZm9yZSBJIGFtIG15IG93biBjbG9uZQorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc3RyKHNlbGYpKQorCisgICAgZGVmIF9fZGVlcGNvcHlfXyhzZWxmLCBtZW1vKToKKyAgICAgICAgaWYgdHlwZShzZWxmKSBpcyBEZWNpbWFsOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYgICAgICMgTXkgY29tcG9uZW50cyBhcmUgYWxzbyBpbW11dGFibGUKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHN0cihzZWxmKSkKKworICAgICMgUEVQIDMxMDEgc3VwcG9ydC4gIHRoZSBfbG9jYWxlY29udiBrZXl3b3JkIGFyZ3VtZW50IHNob3VsZCBiZQorICAgICMgY29uc2lkZXJlZCBwcml2YXRlOiBpdCdzIHByb3ZpZGVkIGZvciBlYXNlIG9mIHRlc3Rpbmcgb25seS4KKyAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBzcGVjaWZpZXIsIGNvbnRleHQ9Tm9uZSwgX2xvY2FsZWNvbnY9Tm9uZSk6CisgICAgICAgICIiIkZvcm1hdCBhIERlY2ltYWwgaW5zdGFuY2UgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBzcGVjaWZpZXIuCisKKyAgICAgICAgVGhlIHNwZWNpZmllciBzaG91bGQgYmUgYSBzdGFuZGFyZCBmb3JtYXQgc3BlY2lmaWVyLCB3aXRoIHRoZQorICAgICAgICBmb3JtIGRlc2NyaWJlZCBpbiBQRVAgMzEwMS4gIEZvcm1hdHRpbmcgdHlwZXMgJ2UnLCAnRScsICdmJywKKyAgICAgICAgJ0YnLCAnZycsICdHJywgJ24nIGFuZCAnJScgYXJlIHN1cHBvcnRlZC4gIElmIHRoZSBmb3JtYXR0aW5nCisgICAgICAgIHR5cGUgaXMgb21pdHRlZCBpdCBkZWZhdWx0cyB0byAnZycgb3IgJ0cnLCBkZXBlbmRpbmcgb24gdGhlCisgICAgICAgIHZhbHVlIG9mIGNvbnRleHQuY2FwaXRhbHMuCisgICAgICAgICIiIgorCisgICAgICAgICMgTm90ZTogUEVQIDMxMDEgc2F5cyB0aGF0IGlmIHRoZSB0eXBlIGlzIG5vdCBwcmVzZW50IHRoZW4KKyAgICAgICAgIyB0aGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LgorICAgICAgICAjIFdlIHRha2UgdGhlIGxpYmVydHkgb2YgaWdub3JpbmcgdGhpcyByZXF1aXJlbWVudCBmb3IKKyAgICAgICAgIyBEZWNpbWFsLS0taXQncyBwcmVzdW1hYmx5IHRoZXJlIHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgICAgICMgZm9ybWF0KGZsb2F0LCAnJykgYmVoYXZlcyBzaW1pbGFybHkgdG8gc3RyKGZsb2F0KS4KKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIHNwZWMgPSBfcGFyc2VfZm9ybWF0X3NwZWNpZmllcihzcGVjaWZpZXIsIF9sb2NhbGVjb252PV9sb2NhbGVjb252KQorCisgICAgICAgICMgc3BlY2lhbCB2YWx1ZXMgZG9uJ3QgY2FyZSBhYm91dCB0aGUgdHlwZSBvciBwcmVjaXNpb24KKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIHNpZ24gPSBfZm9ybWF0X3NpZ24oc2VsZi5fc2lnbiwgc3BlYykKKyAgICAgICAgICAgIGJvZHkgPSBzdHIoc2VsZi5jb3B5X2FicygpKQorICAgICAgICAgICAgcmV0dXJuIF9mb3JtYXRfYWxpZ24oc2lnbiwgYm9keSwgc3BlYykKKworICAgICAgICAjIGEgdHlwZSBvZiBOb25lIGRlZmF1bHRzIHRvICdnJyBvciAnRycsIGRlcGVuZGluZyBvbiBjb250ZXh0CisgICAgICAgIGlmIHNwZWNbJ3R5cGUnXSBpcyBOb25lOgorICAgICAgICAgICAgc3BlY1sndHlwZSddID0gWydnJywgJ0cnXVtjb250ZXh0LmNhcGl0YWxzXQorCisgICAgICAgICMgaWYgdHlwZSBpcyAnJScsIGFkanVzdCBleHBvbmVudCBvZiBzZWxmIGFjY29yZGluZ2x5CisgICAgICAgIGlmIHNwZWNbJ3R5cGUnXSA9PSAnJSc6CisgICAgICAgICAgICBzZWxmID0gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLCBzZWxmLl9pbnQsIHNlbGYuX2V4cCsyKQorCisgICAgICAgICMgcm91bmQgaWYgbmVjZXNzYXJ5LCB0YWtpbmcgcm91bmRpbmcgbW9kZSBmcm9tIHRoZSBjb250ZXh0CisgICAgICAgIHJvdW5kaW5nID0gY29udGV4dC5yb3VuZGluZworICAgICAgICBwcmVjaXNpb24gPSBzcGVjWydwcmVjaXNpb24nXQorICAgICAgICBpZiBwcmVjaXNpb24gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzcGVjWyd0eXBlJ10gaW4gJ2VFJzoKKyAgICAgICAgICAgICAgICBzZWxmID0gc2VsZi5fcm91bmQocHJlY2lzaW9uKzEsIHJvdW5kaW5nKQorICAgICAgICAgICAgZWxpZiBzcGVjWyd0eXBlJ10gaW4gJ2ZGJSc6CisgICAgICAgICAgICAgICAgc2VsZiA9IHNlbGYuX3Jlc2NhbGUoLXByZWNpc2lvbiwgcm91bmRpbmcpCisgICAgICAgICAgICBlbGlmIHNwZWNbJ3R5cGUnXSBpbiAnZ0cnIGFuZCBsZW4oc2VsZi5faW50KSA+IHByZWNpc2lvbjoKKyAgICAgICAgICAgICAgICBzZWxmID0gc2VsZi5fcm91bmQocHJlY2lzaW9uLCByb3VuZGluZykKKyAgICAgICAgIyBzcGVjaWFsIGNhc2U6IHplcm9zIHdpdGggYSBwb3NpdGl2ZSBleHBvbmVudCBjYW4ndCBiZQorICAgICAgICAjIHJlcHJlc2VudGVkIGluIGZpeGVkIHBvaW50OyByZXNjYWxlIHRoZW0gdG8gMGUwLgorICAgICAgICBpZiBub3Qgc2VsZiBhbmQgc2VsZi5fZXhwID4gMCBhbmQgc3BlY1sndHlwZSddIGluICdmRiUnOgorICAgICAgICAgICAgc2VsZiA9IHNlbGYuX3Jlc2NhbGUoMCwgcm91bmRpbmcpCisKKyAgICAgICAgIyBmaWd1cmUgb3V0IHBsYWNlbWVudCBvZiB0aGUgZGVjaW1hbCBwb2ludAorICAgICAgICBsZWZ0ZGlnaXRzID0gc2VsZi5fZXhwICsgbGVuKHNlbGYuX2ludCkKKyAgICAgICAgaWYgc3BlY1sndHlwZSddIGluICdlRSc6CisgICAgICAgICAgICBpZiBub3Qgc2VsZiBhbmQgcHJlY2lzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGRvdHBsYWNlID0gMSAtIHByZWNpc2lvbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkb3RwbGFjZSA9IDEKKyAgICAgICAgZWxpZiBzcGVjWyd0eXBlJ10gaW4gJ2ZGJSc6CisgICAgICAgICAgICBkb3RwbGFjZSA9IGxlZnRkaWdpdHMKKyAgICAgICAgZWxpZiBzcGVjWyd0eXBlJ10gaW4gJ2dHJzoKKyAgICAgICAgICAgIGlmIHNlbGYuX2V4cCA8PSAwIGFuZCBsZWZ0ZGlnaXRzID4gLTY6CisgICAgICAgICAgICAgICAgZG90cGxhY2UgPSBsZWZ0ZGlnaXRzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRvdHBsYWNlID0gMQorCisgICAgICAgICMgZmluZCBkaWdpdHMgYmVmb3JlIGFuZCBhZnRlciBkZWNpbWFsIHBvaW50LCBhbmQgZ2V0IGV4cG9uZW50CisgICAgICAgIGlmIGRvdHBsYWNlIDwgMDoKKyAgICAgICAgICAgIGludHBhcnQgPSAnMCcKKyAgICAgICAgICAgIGZyYWNwYXJ0ID0gJzAnKigtZG90cGxhY2UpICsgc2VsZi5faW50CisgICAgICAgIGVsaWYgZG90cGxhY2UgPiBsZW4oc2VsZi5faW50KToKKyAgICAgICAgICAgIGludHBhcnQgPSBzZWxmLl9pbnQgKyAnMCcqKGRvdHBsYWNlLWxlbihzZWxmLl9pbnQpKQorICAgICAgICAgICAgZnJhY3BhcnQgPSAnJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW50cGFydCA9IHNlbGYuX2ludFs6ZG90cGxhY2VdIG9yICcwJworICAgICAgICAgICAgZnJhY3BhcnQgPSBzZWxmLl9pbnRbZG90cGxhY2U6XQorICAgICAgICBleHAgPSBsZWZ0ZGlnaXRzLWRvdHBsYWNlCisKKyAgICAgICAgIyBkb25lIHdpdGggdGhlIGRlY2ltYWwtc3BlY2lmaWMgc3R1ZmY7ICBoYW5kIG92ZXIgdGhlIHJlc3QKKyAgICAgICAgIyBvZiB0aGUgZm9ybWF0dGluZyB0byB0aGUgX2Zvcm1hdF9udW1iZXIgZnVuY3Rpb24KKyAgICAgICAgcmV0dXJuIF9mb3JtYXRfbnVtYmVyKHNlbGYuX3NpZ24sIGludHBhcnQsIGZyYWNwYXJ0LCBleHAsIHNwZWMpCisKK2RlZiBfZGVjX2Zyb21fdHJpcGxlKHNpZ24sIGNvZWZmaWNpZW50LCBleHBvbmVudCwgc3BlY2lhbD1GYWxzZSk6CisgICAgIiIiQ3JlYXRlIGEgZGVjaW1hbCBpbnN0YW5jZSBkaXJlY3RseSwgd2l0aG91dCBhbnkgdmFsaWRhdGlvbiwKKyAgICBub3JtYWxpemF0aW9uIChlLmcuIHJlbW92YWwgb2YgbGVhZGluZyB6ZXJvcykgb3IgYXJndW1lbnQKKyAgICBjb252ZXJzaW9uLgorCisgICAgVGhpcyBmdW5jdGlvbiBpcyBmb3IgKmludGVybmFsIHVzZSBvbmx5Ki4KKyAgICAiIiIKKworICAgIHNlbGYgPSBvYmplY3QuX19uZXdfXyhEZWNpbWFsKQorICAgIHNlbGYuX3NpZ24gPSBzaWduCisgICAgc2VsZi5faW50ID0gY29lZmZpY2llbnQKKyAgICBzZWxmLl9leHAgPSBleHBvbmVudAorICAgIHNlbGYuX2lzX3NwZWNpYWwgPSBzcGVjaWFsCisKKyAgICByZXR1cm4gc2VsZgorCisjIFJlZ2lzdGVyIERlY2ltYWwgYXMgYSBraW5kIG9mIE51bWJlciAoYW4gYWJzdHJhY3QgYmFzZSBjbGFzcykuCisjIEhvd2V2ZXIsIGRvIG5vdCByZWdpc3RlciBpdCBhcyBSZWFsIChiZWNhdXNlIERlY2ltYWxzIGFyZSBub3QKKyMgaW50ZXJvcGVyYWJsZSB3aXRoIGZsb2F0cykuCitfbnVtYmVycy5OdW1iZXIucmVnaXN0ZXIoRGVjaW1hbCkKKworCisjIyMjIyBDb250ZXh0IGNsYXNzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgX0NvbnRleHRNYW5hZ2VyKG9iamVjdCk6CisgICAgIiIiQ29udGV4dCBtYW5hZ2VyIGNsYXNzIHRvIHN1cHBvcnQgbG9jYWxjb250ZXh0KCkuCisKKyAgICAgIFNldHMgYSBjb3B5IG9mIHRoZSBzdXBwbGllZCBjb250ZXh0IGluIF9fZW50ZXJfXygpIGFuZCByZXN0b3JlcworICAgICAgdGhlIHByZXZpb3VzIGRlY2ltYWwgY29udGV4dCBpbiBfX2V4aXRfXygpCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5ld19jb250ZXh0KToKKyAgICAgICAgc2VsZi5uZXdfY29udGV4dCA9IG5ld19jb250ZXh0LmNvcHkoKQorICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuc2F2ZWRfY29udGV4dCA9IGdldGNvbnRleHQoKQorICAgICAgICBzZXRjb250ZXh0KHNlbGYubmV3X2NvbnRleHQpCisgICAgICAgIHJldHVybiBzZWxmLm5ld19jb250ZXh0CisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHQsIHYsIHRiKToKKyAgICAgICAgc2V0Y29udGV4dChzZWxmLnNhdmVkX2NvbnRleHQpCisKK2NsYXNzIENvbnRleHQob2JqZWN0KToKKyAgICAiIiJDb250YWlucyB0aGUgY29udGV4dCBmb3IgYSBEZWNpbWFsIGluc3RhbmNlLgorCisgICAgQ29udGFpbnM6CisgICAgcHJlYyAtIHByZWNpc2lvbiAoZm9yIHVzZSBpbiByb3VuZGluZywgZGl2aXNpb24sIHNxdWFyZSByb290cy4uKQorICAgIHJvdW5kaW5nIC0gcm91bmRpbmcgdHlwZSAoaG93IHlvdSByb3VuZCkKKyAgICB0cmFwcyAtIElmIHRyYXBzW2V4Y2VwdGlvbl0gPSAxLCB0aGVuIHRoZSBleGNlcHRpb24gaXMKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VkIHdoZW4gaXQgaXMgY2F1c2VkLiAgT3RoZXJ3aXNlLCBhIHZhbHVlIGlzCisgICAgICAgICAgICAgICAgICAgIHN1YnN0aXR1dGVkIGluLgorICAgIGZsYWdzICAtIFdoZW4gYW4gZXhjZXB0aW9uIGlzIGNhdXNlZCwgZmxhZ3NbZXhjZXB0aW9uXSBpcyBzZXQuCisgICAgICAgICAgICAgKFdoZXRoZXIgb3Igbm90IHRoZSB0cmFwX2VuYWJsZXIgaXMgc2V0KQorICAgICAgICAgICAgIFNob3VsZCBiZSByZXNldCBieSB1c2VyIG9mIERlY2ltYWwgaW5zdGFuY2UuCisgICAgRW1pbiAtICAgTWluaW11bSBleHBvbmVudAorICAgIEVtYXggLSAgIE1heGltdW0gZXhwb25lbnQKKyAgICBjYXBpdGFscyAtICAgICAgSWYgMSwgMSoxMF4xIGlzIHByaW50ZWQgYXMgMUUrMS4KKyAgICAgICAgICAgICAgICAgICAgSWYgMCwgcHJpbnRlZCBhcyAxZTEKKyAgICBfY2xhbXAgLSBJZiAxLCBjaGFuZ2UgZXhwb25lbnRzIGlmIHRvbyBoaWdoIChEZWZhdWx0IDApCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJlYz1Ob25lLCByb3VuZGluZz1Ob25lLAorICAgICAgICAgICAgICAgICB0cmFwcz1Ob25lLCBmbGFncz1Ob25lLAorICAgICAgICAgICAgICAgICBFbWluPU5vbmUsIEVtYXg9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY2FwaXRhbHM9Tm9uZSwgX2NsYW1wPTAsCisgICAgICAgICAgICAgICAgIF9pZ25vcmVkX2ZsYWdzPU5vbmUpOgorICAgICAgICAjIFNldCBkZWZhdWx0czsgZm9yIGV2ZXJ5dGhpbmcgZXhjZXB0IGZsYWdzIGFuZCBfaWdub3JlZF9mbGFncywKKyAgICAgICAgIyBpbmhlcml0IGZyb20gRGVmYXVsdENvbnRleHQuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRjID0gRGVmYXVsdENvbnRleHQKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLnByZWMgPSBwcmVjIGlmIHByZWMgaXMgbm90IE5vbmUgZWxzZSBkYy5wcmVjCisgICAgICAgIHNlbGYucm91bmRpbmcgPSByb3VuZGluZyBpZiByb3VuZGluZyBpcyBub3QgTm9uZSBlbHNlIGRjLnJvdW5kaW5nCisgICAgICAgIHNlbGYuRW1pbiA9IEVtaW4gaWYgRW1pbiBpcyBub3QgTm9uZSBlbHNlIGRjLkVtaW4KKyAgICAgICAgc2VsZi5FbWF4ID0gRW1heCBpZiBFbWF4IGlzIG5vdCBOb25lIGVsc2UgZGMuRW1heAorICAgICAgICBzZWxmLmNhcGl0YWxzID0gY2FwaXRhbHMgaWYgY2FwaXRhbHMgaXMgbm90IE5vbmUgZWxzZSBkYy5jYXBpdGFscworICAgICAgICBzZWxmLl9jbGFtcCA9IF9jbGFtcCBpZiBfY2xhbXAgaXMgbm90IE5vbmUgZWxzZSBkYy5fY2xhbXAKKworICAgICAgICBpZiBfaWdub3JlZF9mbGFncyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5faWdub3JlZF9mbGFncyA9IFtdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9pZ25vcmVkX2ZsYWdzID0gX2lnbm9yZWRfZmxhZ3MKKworICAgICAgICBpZiB0cmFwcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50cmFwcyA9IGRjLnRyYXBzLmNvcHkoKQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHRyYXBzLCBkaWN0KToKKyAgICAgICAgICAgIHNlbGYudHJhcHMgPSBkaWN0KChzLCBpbnQocyBpbiB0cmFwcykpIGZvciBzIGluIF9zaWduYWxzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50cmFwcyA9IHRyYXBzCisKKyAgICAgICAgaWYgZmxhZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBkaWN0LmZyb21rZXlzKF9zaWduYWxzLCAwKQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGZsYWdzLCBkaWN0KToKKyAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBkaWN0KChzLCBpbnQocyBpbiBmbGFncykpIGZvciBzIGluIF9zaWduYWxzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIlNob3cgdGhlIGN1cnJlbnQgY29udGV4dC4iIiIKKyAgICAgICAgcyA9IFtdCisgICAgICAgIHMuYXBwZW5kKCdDb250ZXh0KHByZWM9JShwcmVjKWQsIHJvdW5kaW5nPSUocm91bmRpbmcpcywgJworICAgICAgICAgICAgICAgICAnRW1pbj0lKEVtaW4pZCwgRW1heD0lKEVtYXgpZCwgY2FwaXRhbHM9JShjYXBpdGFscylkJworICAgICAgICAgICAgICAgICAlIHZhcnMoc2VsZikpCisgICAgICAgIG5hbWVzID0gW2YuX19uYW1lX18gZm9yIGYsIHYgaW4gc2VsZi5mbGFncy5pdGVtcygpIGlmIHZdCisgICAgICAgIHMuYXBwZW5kKCdmbGFncz1bJyArICcsICcuam9pbihuYW1lcykgKyAnXScpCisgICAgICAgIG5hbWVzID0gW3QuX19uYW1lX18gZm9yIHQsIHYgaW4gc2VsZi50cmFwcy5pdGVtcygpIGlmIHZdCisgICAgICAgIHMuYXBwZW5kKCd0cmFwcz1bJyArICcsICcuam9pbihuYW1lcykgKyAnXScpCisgICAgICAgIHJldHVybiAnLCAnLmpvaW4ocykgKyAnKScKKworICAgIGRlZiBjbGVhcl9mbGFncyhzZWxmKToKKyAgICAgICAgIiIiUmVzZXQgYWxsIGZsYWdzIHRvIHplcm8iIiIKKyAgICAgICAgZm9yIGZsYWcgaW4gc2VsZi5mbGFnczoKKyAgICAgICAgICAgIHNlbGYuZmxhZ3NbZmxhZ10gPSAwCisKKyAgICBkZWYgX3NoYWxsb3dfY29weShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBhIHNoYWxsb3cgY29weSBmcm9tIHNlbGYuIiIiCisgICAgICAgIG5jID0gQ29udGV4dChzZWxmLnByZWMsIHNlbGYucm91bmRpbmcsIHNlbGYudHJhcHMsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLmZsYWdzLCBzZWxmLkVtaW4sIHNlbGYuRW1heCwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FwaXRhbHMsIHNlbGYuX2NsYW1wLCBzZWxmLl9pZ25vcmVkX2ZsYWdzKQorICAgICAgICByZXR1cm4gbmMKKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIGEgZGVlcCBjb3B5IGZyb20gc2VsZi4iIiIKKyAgICAgICAgbmMgPSBDb250ZXh0KHNlbGYucHJlYywgc2VsZi5yb3VuZGluZywgc2VsZi50cmFwcy5jb3B5KCksCisgICAgICAgICAgICAgICAgICAgICBzZWxmLmZsYWdzLmNvcHkoKSwgc2VsZi5FbWluLCBzZWxmLkVtYXgsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhcGl0YWxzLCBzZWxmLl9jbGFtcCwgc2VsZi5faWdub3JlZF9mbGFncykKKyAgICAgICAgcmV0dXJuIG5jCisgICAgX19jb3B5X18gPSBjb3B5CisKKyAgICBkZWYgX3JhaXNlX2Vycm9yKHNlbGYsIGNvbmRpdGlvbiwgZXhwbGFuYXRpb24gPSBOb25lLCAqYXJncyk6CisgICAgICAgICIiIkhhbmRsZXMgYW4gZXJyb3IKKworICAgICAgICBJZiB0aGUgZmxhZyBpcyBpbiBfaWdub3JlZF9mbGFncywgcmV0dXJucyB0aGUgZGVmYXVsdCByZXNwb25zZS4KKyAgICAgICAgT3RoZXJ3aXNlLCBpdCBzZXRzIHRoZSBmbGFnLCB0aGVuLCBpZiB0aGUgY29ycmVzcG9uZGluZworICAgICAgICB0cmFwX2VuYWJsZXIgaXMgc2V0LCBpdCByZXJhaXNlcyB0aGUgZXhjZXB0aW9uLiAgT3RoZXJ3aXNlLCBpdCByZXR1cm5zCisgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIGFmdGVyIHNldHRpbmcgdGhlIGZsYWcuCisgICAgICAgICIiIgorICAgICAgICBlcnJvciA9IF9jb25kaXRpb25fbWFwLmdldChjb25kaXRpb24sIGNvbmRpdGlvbikKKyAgICAgICAgaWYgZXJyb3IgaW4gc2VsZi5faWdub3JlZF9mbGFnczoKKyAgICAgICAgICAgICMgRG9uJ3QgdG91Y2ggdGhlIGZsYWcKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigpLmhhbmRsZShzZWxmLCAqYXJncykKKworICAgICAgICBzZWxmLmZsYWdzW2Vycm9yXSA9IDEKKyAgICAgICAgaWYgbm90IHNlbGYudHJhcHNbZXJyb3JdOgorICAgICAgICAgICAgIyBUaGUgZXJyb3JzIGRlZmluZSBob3cgdG8gaGFuZGxlIHRoZW1zZWx2ZXMuCisgICAgICAgICAgICByZXR1cm4gY29uZGl0aW9uKCkuaGFuZGxlKHNlbGYsICphcmdzKQorCisgICAgICAgICMgRXJyb3JzIHNob3VsZCBvbmx5IGJlIHJpc2tlZCBvbiBjb3BpZXMgb2YgdGhlIGNvbnRleHQKKyAgICAgICAgIyBzZWxmLl9pZ25vcmVkX2ZsYWdzID0gW10KKyAgICAgICAgcmFpc2UgZXJyb3IoZXhwbGFuYXRpb24pCisKKyAgICBkZWYgX2lnbm9yZV9hbGxfZmxhZ3Moc2VsZik6CisgICAgICAgICIiIklnbm9yZSBhbGwgZmxhZ3MsIGlmIHRoZXkgYXJlIHJhaXNlZCIiIgorICAgICAgICByZXR1cm4gc2VsZi5faWdub3JlX2ZsYWdzKCpfc2lnbmFscykKKworICAgIGRlZiBfaWdub3JlX2ZsYWdzKHNlbGYsICpmbGFncyk6CisgICAgICAgICIiIklnbm9yZSB0aGUgZmxhZ3MsIGlmIHRoZXkgYXJlIHJhaXNlZCIiIgorICAgICAgICAjIERvIG5vdCBtdXRhdGUtLSBUaGlzIHdheSwgY29waWVzIG9mIGEgY29udGV4dCBsZWF2ZSB0aGUgb3JpZ2luYWwKKyAgICAgICAgIyBhbG9uZS4KKyAgICAgICAgc2VsZi5faWdub3JlZF9mbGFncyA9IChzZWxmLl9pZ25vcmVkX2ZsYWdzICsgbGlzdChmbGFncykpCisgICAgICAgIHJldHVybiBsaXN0KGZsYWdzKQorCisgICAgZGVmIF9yZWdhcmRfZmxhZ3Moc2VsZiwgKmZsYWdzKToKKyAgICAgICAgIiIiU3RvcCBpZ25vcmluZyB0aGUgZmxhZ3MsIGlmIHRoZXkgYXJlIHJhaXNlZCIiIgorICAgICAgICBpZiBmbGFncyBhbmQgaXNpbnN0YW5jZShmbGFnc1swXSwgKHR1cGxlLGxpc3QpKToKKyAgICAgICAgICAgIGZsYWdzID0gZmxhZ3NbMF0KKyAgICAgICAgZm9yIGZsYWcgaW4gZmxhZ3M6CisgICAgICAgICAgICBzZWxmLl9pZ25vcmVkX2ZsYWdzLnJlbW92ZShmbGFnKQorCisgICAgIyBXZSBpbmhlcml0IG9iamVjdC5fX2hhc2hfXywgc28gd2UgbXVzdCBkZW55IHRoaXMgZXhwbGljaXRseQorICAgIF9faGFzaF9fID0gTm9uZQorCisgICAgZGVmIEV0aW55KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIEV0aW55ICg9IEVtaW4gLSBwcmVjICsgMSkiIiIKKyAgICAgICAgcmV0dXJuIGludChzZWxmLkVtaW4gLSBzZWxmLnByZWMgKyAxKQorCisgICAgZGVmIEV0b3Aoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgbWF4aW11bSBleHBvbmVudCAoPSBFbWF4IC0gcHJlYyArIDEpIiIiCisgICAgICAgIHJldHVybiBpbnQoc2VsZi5FbWF4IC0gc2VsZi5wcmVjICsgMSkKKworICAgIGRlZiBfc2V0X3JvdW5kaW5nKHNlbGYsIHR5cGUpOgorICAgICAgICAiIiJTZXRzIHRoZSByb3VuZGluZyB0eXBlLgorCisgICAgICAgIFNldHMgdGhlIHJvdW5kaW5nIHR5cGUsIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IChwcmV2aW91cykKKyAgICAgICAgcm91bmRpbmcgdHlwZS4gIE9mdGVuIHVzZWQgbGlrZToKKworICAgICAgICBjb250ZXh0ID0gY29udGV4dC5jb3B5KCkKKyAgICAgICAgIyBzbyB5b3UgZG9uJ3QgY2hhbmdlIHRoZSBjYWxsaW5nIGNvbnRleHQKKyAgICAgICAgIyBpZiBhbiBlcnJvciBvY2N1cnMgaW4gdGhlIG1pZGRsZS4KKyAgICAgICAgcm91bmRpbmcgPSBjb250ZXh0Ll9zZXRfcm91bmRpbmcoUk9VTkRfVVApCisgICAgICAgIHZhbCA9IHNlbGYuX19zdWJfXyhvdGhlciwgY29udGV4dD1jb250ZXh0KQorICAgICAgICBjb250ZXh0Ll9zZXRfcm91bmRpbmcocm91bmRpbmcpCisKKyAgICAgICAgVGhpcyB3aWxsIG1ha2UgaXQgcm91bmQgdXAgZm9yIHRoYXQgb3BlcmF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgcm91bmRpbmcgPSBzZWxmLnJvdW5kaW5nCisgICAgICAgIHNlbGYucm91bmRpbmc9IHR5cGUKKyAgICAgICAgcmV0dXJuIHJvdW5kaW5nCisKKyAgICBkZWYgY3JlYXRlX2RlY2ltYWwoc2VsZiwgbnVtPScwJyk6CisgICAgICAgICIiIkNyZWF0ZXMgYSBuZXcgRGVjaW1hbCBpbnN0YW5jZSBidXQgdXNpbmcgc2VsZiBhcyBjb250ZXh0LgorCisgICAgICAgIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgdGhlIHRvLW51bWJlciBvcGVyYXRpb24gb2YgdGhlCisgICAgICAgIElCTSBEZWNpbWFsIHNwZWNpZmljYXRpb24uIiIiCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShudW0sIGJhc2VzdHJpbmcpIGFuZCBudW0gIT0gbnVtLnN0cmlwKCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmFpc2VfZXJyb3IoQ29udmVyc2lvblN5bnRheCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gdHJhaWxpbmcgb3IgbGVhZGluZyB3aGl0ZXNwYWNlIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGVybWl0dGVkLiIpCisKKyAgICAgICAgZCA9IERlY2ltYWwobnVtLCBjb250ZXh0PXNlbGYpCisgICAgICAgIGlmIGQuX2lzbmFuKCkgYW5kIGxlbihkLl9pbnQpID4gc2VsZi5wcmVjIC0gc2VsZi5fY2xhbXA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmFpc2VfZXJyb3IoQ29udmVyc2lvblN5bnRheCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlhZ25vc3RpYyBpbmZvIHRvbyBsb25nIGluIE5hTiIpCisgICAgICAgIHJldHVybiBkLl9maXgoc2VsZikKKworICAgIGRlZiBjcmVhdGVfZGVjaW1hbF9mcm9tX2Zsb2F0KHNlbGYsIGYpOgorICAgICAgICAiIiJDcmVhdGVzIGEgbmV3IERlY2ltYWwgaW5zdGFuY2UgZnJvbSBhIGZsb2F0IGJ1dCByb3VuZGluZyB1c2luZyBzZWxmCisgICAgICAgIGFzIHRoZSBjb250ZXh0LgorCisgICAgICAgID4+PiBjb250ZXh0ID0gQ29udGV4dChwcmVjPTUsIHJvdW5kaW5nPVJPVU5EX0RPV04pCisgICAgICAgID4+PiBjb250ZXh0LmNyZWF0ZV9kZWNpbWFsX2Zyb21fZmxvYXQoMy4xNDE1OTI2NTM1ODk3OTMyKQorICAgICAgICBEZWNpbWFsKCczLjE0MTUnKQorICAgICAgICA+Pj4gY29udGV4dCA9IENvbnRleHQocHJlYz01LCB0cmFwcz1bSW5leGFjdF0pCisgICAgICAgID4+PiBjb250ZXh0LmNyZWF0ZV9kZWNpbWFsX2Zyb21fZmxvYXQoMy4xNDE1OTI2NTM1ODk3OTMyKQorICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgICAgICAuLi4KKyAgICAgICAgSW5leGFjdDogTm9uZQorCisgICAgICAgICIiIgorICAgICAgICBkID0gRGVjaW1hbC5mcm9tX2Zsb2F0KGYpICAgICAgICMgQW4gZXhhY3QgY29udmVyc2lvbgorICAgICAgICByZXR1cm4gZC5fZml4KHNlbGYpICAgICAgICAgICAgICMgQXBwbHkgdGhlIGNvbnRleHQgcm91bmRpbmcKKworICAgICMgTWV0aG9kcworICAgIGRlZiBhYnMoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBvcGVyYW5kLgorCisgICAgICAgIElmIHRoZSBvcGVyYW5kIGlzIG5lZ2F0aXZlLCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIHVzaW5nIHRoZSBtaW51cworICAgICAgICBvcGVyYXRpb24gb24gdGhlIG9wZXJhbmQuICBPdGhlcndpc2UsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgdXNpbmcKKyAgICAgICAgdGhlIHBsdXMgb3BlcmF0aW9uIG9uIHRoZSBvcGVyYW5kLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuYWJzKERlY2ltYWwoJzIuMScpKQorICAgICAgICBEZWNpbWFsKCcyLjEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmFicyhEZWNpbWFsKCctMTAwJykpCisgICAgICAgIERlY2ltYWwoJzEwMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuYWJzKERlY2ltYWwoJzEwMS41JykpCisgICAgICAgIERlY2ltYWwoJzEwMS41JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5hYnMoRGVjaW1hbCgnLTEwMS41JykpCisgICAgICAgIERlY2ltYWwoJzEwMS41JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5hYnMoLTEpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuX19hYnNfXyhjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgYWRkKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHN1bSBvZiB0aGUgdHdvIG9wZXJhbmRzLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuYWRkKERlY2ltYWwoJzEyJyksIERlY2ltYWwoJzcuMDAnKSkKKyAgICAgICAgRGVjaW1hbCgnMTkuMDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmFkZChEZWNpbWFsKCcxRSsyJyksIERlY2ltYWwoJzEuMDFFKzQnKSkKKyAgICAgICAgRGVjaW1hbCgnMS4wMkUrNCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuYWRkKDEsIERlY2ltYWwoMikpCisgICAgICAgIERlY2ltYWwoJzMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmFkZChEZWNpbWFsKDgpLCA1KQorICAgICAgICBEZWNpbWFsKCcxMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuYWRkKDUsIDUpCisgICAgICAgIERlY2ltYWwoJzEwJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHIgPSBhLl9fYWRkX18oYiwgY29udGV4dD1zZWxmKQorICAgICAgICBpZiByIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJVbmFibGUgdG8gY29udmVydCAlcyB0byBEZWNpbWFsIiAlIGIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIF9hcHBseShzZWxmLCBhKToKKyAgICAgICAgcmV0dXJuIHN0cihhLl9maXgoc2VsZikpCisKKyAgICBkZWYgY2Fub25pY2FsKHNlbGYsIGEpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBzYW1lIERlY2ltYWwgb2JqZWN0LgorCisgICAgICAgIEFzIHdlIGRvIG5vdCBoYXZlIGRpZmZlcmVudCBlbmNvZGluZ3MgZm9yIHRoZSBzYW1lIG51bWJlciwgdGhlCisgICAgICAgIHJlY2VpdmVkIG9iamVjdCBhbHJlYWR5IGlzIGluIGl0cyBjYW5vbmljYWwgZm9ybS4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNhbm9uaWNhbChEZWNpbWFsKCcyLjUwJykpCisgICAgICAgIERlY2ltYWwoJzIuNTAnKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGEuY2Fub25pY2FsKGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBjb21wYXJlKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJDb21wYXJlcyB2YWx1ZXMgbnVtZXJpY2FsbHkuCisKKyAgICAgICAgSWYgdGhlIHNpZ25zIG9mIHRoZSBvcGVyYW5kcyBkaWZmZXIsIGEgdmFsdWUgcmVwcmVzZW50aW5nIGVhY2ggb3BlcmFuZAorICAgICAgICAoJy0xJyBpZiB0aGUgb3BlcmFuZCBpcyBsZXNzIHRoYW4gemVybywgJzAnIGlmIHRoZSBvcGVyYW5kIGlzIHplcm8gb3IKKyAgICAgICAgbmVnYXRpdmUgemVybywgb3IgJzEnIGlmIHRoZSBvcGVyYW5kIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvKSBpcyB1c2VkIGluCisgICAgICAgIHBsYWNlIG9mIHRoYXQgb3BlcmFuZCBmb3IgdGhlIGNvbXBhcmlzb24gaW5zdGVhZCBvZiB0aGUgYWN0dWFsCisgICAgICAgIG9wZXJhbmQuCisKKyAgICAgICAgVGhlIGNvbXBhcmlzb24gaXMgdGhlbiBlZmZlY3RlZCBieSBzdWJ0cmFjdGluZyB0aGUgc2Vjb25kIG9wZXJhbmQgZnJvbQorICAgICAgICB0aGUgZmlyc3QgYW5kIHRoZW4gcmV0dXJuaW5nIGEgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSByZXN1bHQgb2YgdGhlCisgICAgICAgIHN1YnRyYWN0aW9uOiAnLTEnIGlmIHRoZSByZXN1bHQgaXMgbGVzcyB0aGFuIHplcm8sICcwJyBpZiB0aGUgcmVzdWx0IGlzCisgICAgICAgIHplcm8gb3IgbmVnYXRpdmUgemVybywgb3IgJzEnIGlmIHRoZSByZXN1bHQgaXMgZ3JlYXRlciB0aGFuIHplcm8uCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlKERlY2ltYWwoJzIuMScpLCBEZWNpbWFsKCczJykpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlKERlY2ltYWwoJzIuMScpLCBEZWNpbWFsKCcyLjEnKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29tcGFyZShEZWNpbWFsKCcyLjEnKSwgRGVjaW1hbCgnMi4xMCcpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlKERlY2ltYWwoJzMnKSwgRGVjaW1hbCgnMi4xJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmUoRGVjaW1hbCgnMi4xJyksIERlY2ltYWwoJy0zJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmUoRGVjaW1hbCgnLTMnKSwgRGVjaW1hbCgnMi4xJykpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlKDEsIDIpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlKERlY2ltYWwoMSksIDIpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlKDEsIERlY2ltYWwoMikpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmNvbXBhcmUoYiwgY29udGV4dD1zZWxmKQorCisgICAgZGVmIGNvbXBhcmVfc2lnbmFsKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJDb21wYXJlcyB0aGUgdmFsdWVzIG9mIHRoZSB0d28gb3BlcmFuZHMgbnVtZXJpY2FsbHkuCisKKyAgICAgICAgSXQncyBwcmV0dHkgbXVjaCBsaWtlIGNvbXBhcmUoKSwgYnV0IGFsbCBOYU5zIHNpZ25hbCwgd2l0aCBzaWduYWxpbmcKKyAgICAgICAgTmFOcyB0YWtpbmcgcHJlY2VkZW5jZSBvdmVyIHF1aWV0IE5hTnMuCisKKyAgICAgICAgPj4+IGMgPSBFeHRlbmRlZENvbnRleHQKKyAgICAgICAgPj4+IGMuY29tcGFyZV9zaWduYWwoRGVjaW1hbCgnMi4xJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gYy5jb21wYXJlX3NpZ25hbChEZWNpbWFsKCcyLjEnKSwgRGVjaW1hbCgnMi4xJykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gYy5mbGFnc1tJbnZhbGlkT3BlcmF0aW9uXSA9IDAKKyAgICAgICAgPj4+IHByaW50IGMuZmxhZ3NbSW52YWxpZE9wZXJhdGlvbl0KKyAgICAgICAgMAorICAgICAgICA+Pj4gYy5jb21wYXJlX3NpZ25hbChEZWNpbWFsKCdOYU4nKSwgRGVjaW1hbCgnMi4xJykpCisgICAgICAgIERlY2ltYWwoJ05hTicpCisgICAgICAgID4+PiBwcmludCBjLmZsYWdzW0ludmFsaWRPcGVyYXRpb25dCisgICAgICAgIDEKKyAgICAgICAgPj4+IGMuZmxhZ3NbSW52YWxpZE9wZXJhdGlvbl0gPSAwCisgICAgICAgID4+PiBwcmludCBjLmZsYWdzW0ludmFsaWRPcGVyYXRpb25dCisgICAgICAgIDAKKyAgICAgICAgPj4+IGMuY29tcGFyZV9zaWduYWwoRGVjaW1hbCgnc05hTicpLCBEZWNpbWFsKCcyLjEnKSkKKyAgICAgICAgRGVjaW1hbCgnTmFOJykKKyAgICAgICAgPj4+IHByaW50IGMuZmxhZ3NbSW52YWxpZE9wZXJhdGlvbl0KKyAgICAgICAgMQorICAgICAgICA+Pj4gYy5jb21wYXJlX3NpZ25hbCgtMSwgMikKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gYy5jb21wYXJlX3NpZ25hbChEZWNpbWFsKC0xKSwgMikKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gYy5jb21wYXJlX3NpZ25hbCgtMSwgRGVjaW1hbCgyKSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuY29tcGFyZV9zaWduYWwoYiwgY29udGV4dD1zZWxmKQorCisgICAgZGVmIGNvbXBhcmVfdG90YWwoc2VsZiwgYSwgYik6CisgICAgICAgICIiIkNvbXBhcmVzIHR3byBvcGVyYW5kcyB1c2luZyB0aGVpciBhYnN0cmFjdCByZXByZXNlbnRhdGlvbi4KKworICAgICAgICBUaGlzIGlzIG5vdCBsaWtlIHRoZSBzdGFuZGFyZCBjb21wYXJlLCB3aGljaCB1c2UgdGhlaXIgbnVtZXJpY2FsCisgICAgICAgIHZhbHVlLiBOb3RlIHRoYXQgYSB0b3RhbCBvcmRlcmluZyBpcyBkZWZpbmVkIGZvciBhbGwgcG9zc2libGUgYWJzdHJhY3QKKyAgICAgICAgcmVwcmVzZW50YXRpb25zLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29tcGFyZV90b3RhbChEZWNpbWFsKCcxMi43MycpLCBEZWNpbWFsKCcxMjcuOScpKQorICAgICAgICBEZWNpbWFsKCctMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29tcGFyZV90b3RhbChEZWNpbWFsKCctMTI3JyksICBEZWNpbWFsKCcxMicpKQorICAgICAgICBEZWNpbWFsKCctMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29tcGFyZV90b3RhbChEZWNpbWFsKCcxMi4zMCcpLCBEZWNpbWFsKCcxMi4zJykpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlX3RvdGFsKERlY2ltYWwoJzEyLjMwJyksIERlY2ltYWwoJzEyLjMwJykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmVfdG90YWwoRGVjaW1hbCgnMTIuMycpLCAgRGVjaW1hbCgnMTIuMzAwJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmVfdG90YWwoRGVjaW1hbCgnMTIuMycpLCAgRGVjaW1hbCgnTmFOJykpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlX3RvdGFsKDEsIDIpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlX3RvdGFsKERlY2ltYWwoMSksIDIpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlX3RvdGFsKDEsIERlY2ltYWwoMikpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmNvbXBhcmVfdG90YWwoYikKKworICAgIGRlZiBjb21wYXJlX3RvdGFsX21hZyhzZWxmLCBhLCBiKToKKyAgICAgICAgIiIiQ29tcGFyZXMgdHdvIG9wZXJhbmRzIHVzaW5nIHRoZWlyIGFic3RyYWN0IHJlcHJlc2VudGF0aW9uIGlnbm9yaW5nIHNpZ24uCisKKyAgICAgICAgTGlrZSBjb21wYXJlX3RvdGFsLCBidXQgd2l0aCBvcGVyYW5kJ3Mgc2lnbiBpZ25vcmVkIGFuZCBhc3N1bWVkIHRvIGJlIDAuCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5jb21wYXJlX3RvdGFsX21hZyhiKQorCisgICAgZGVmIGNvcHlfYWJzKHNlbGYsIGEpOgorICAgICAgICAiIiJSZXR1cm5zIGEgY29weSBvZiB0aGUgb3BlcmFuZCB3aXRoIHRoZSBzaWduIHNldCB0byAwLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9hYnMoRGVjaW1hbCgnMi4xJykpCisgICAgICAgIERlY2ltYWwoJzIuMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9hYnMoRGVjaW1hbCgnLTEwMCcpKQorICAgICAgICBEZWNpbWFsKCcxMDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvcHlfYWJzKC0xKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmNvcHlfYWJzKCkKKworICAgIGRlZiBjb3B5X2RlY2ltYWwoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybnMgYSBjb3B5IG9mIHRoZSBkZWNpbWFsIG9iamVjdC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvcHlfZGVjaW1hbChEZWNpbWFsKCcyLjEnKSkKKyAgICAgICAgRGVjaW1hbCgnMi4xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb3B5X2RlY2ltYWwoRGVjaW1hbCgnLTEuMDAnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEuMDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvcHlfZGVjaW1hbCgxKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBEZWNpbWFsKGEpCisKKyAgICBkZWYgY29weV9uZWdhdGUoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybnMgYSBjb3B5IG9mIHRoZSBvcGVyYW5kIHdpdGggdGhlIHNpZ24gaW52ZXJ0ZWQuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb3B5X25lZ2F0ZShEZWNpbWFsKCcxMDEuNScpKQorICAgICAgICBEZWNpbWFsKCctMTAxLjUnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvcHlfbmVnYXRlKERlY2ltYWwoJy0xMDEuNScpKQorICAgICAgICBEZWNpbWFsKCcxMDEuNScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9uZWdhdGUoMSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuY29weV9uZWdhdGUoKQorCisgICAgZGVmIGNvcHlfc2lnbihzZWxmLCBhLCBiKToKKyAgICAgICAgIiIiQ29waWVzIHRoZSBzZWNvbmQgb3BlcmFuZCdzIHNpZ24gdG8gdGhlIGZpcnN0IG9uZS4KKworICAgICAgICBJbiBkZXRhaWwsIGl0IHJldHVybnMgYSBjb3B5IG9mIHRoZSBmaXJzdCBvcGVyYW5kIHdpdGggdGhlIHNpZ24KKyAgICAgICAgZXF1YWwgdG8gdGhlIHNpZ24gb2YgdGhlIHNlY29uZCBvcGVyYW5kLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9zaWduKERlY2ltYWwoICcxLjUwJyksIERlY2ltYWwoJzcuMzMnKSkKKyAgICAgICAgRGVjaW1hbCgnMS41MCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9zaWduKERlY2ltYWwoJy0xLjUwJyksIERlY2ltYWwoJzcuMzMnKSkKKyAgICAgICAgRGVjaW1hbCgnMS41MCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9zaWduKERlY2ltYWwoICcxLjUwJyksIERlY2ltYWwoJy03LjMzJykpCisgICAgICAgIERlY2ltYWwoJy0xLjUwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb3B5X3NpZ24oRGVjaW1hbCgnLTEuNTAnKSwgRGVjaW1hbCgnLTcuMzMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEuNTAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvcHlfc2lnbigxLCAtMikKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvcHlfc2lnbihEZWNpbWFsKDEpLCAtMikKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvcHlfc2lnbigxLCBEZWNpbWFsKC0yKSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuY29weV9zaWduKGIpCisKKyAgICBkZWYgZGl2aWRlKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJEZWNpbWFsIGRpdmlzaW9uIGluIGEgc3BlY2lmaWVkIGNvbnRleHQuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGUoRGVjaW1hbCgnMScpLCBEZWNpbWFsKCczJykpCisgICAgICAgIERlY2ltYWwoJzAuMzMzMzMzMzMzJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGUoRGVjaW1hbCgnMicpLCBEZWNpbWFsKCczJykpCisgICAgICAgIERlY2ltYWwoJzAuNjY2NjY2NjY3JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGUoRGVjaW1hbCgnNScpLCBEZWNpbWFsKCcyJykpCisgICAgICAgIERlY2ltYWwoJzIuNScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZGl2aWRlKERlY2ltYWwoJzEnKSwgRGVjaW1hbCgnMTAnKSkKKyAgICAgICAgRGVjaW1hbCgnMC4xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGUoRGVjaW1hbCgnMTInKSwgRGVjaW1hbCgnMTInKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZGl2aWRlKERlY2ltYWwoJzguMDAnKSwgRGVjaW1hbCgnMicpKQorICAgICAgICBEZWNpbWFsKCc0LjAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGUoRGVjaW1hbCgnMi40MDAnKSwgRGVjaW1hbCgnMi4wJykpCisgICAgICAgIERlY2ltYWwoJzEuMjAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZShEZWNpbWFsKCcxMDAwJyksIERlY2ltYWwoJzEwMCcpKQorICAgICAgICBEZWNpbWFsKCcxMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZGl2aWRlKERlY2ltYWwoJzEwMDAnKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcxMDAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGUoRGVjaW1hbCgnMi40MEUrNicpLCBEZWNpbWFsKCcyJykpCisgICAgICAgIERlY2ltYWwoJzEuMjBFKzYnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZSg1LCA1KQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGUoRGVjaW1hbCg1KSwgNSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZGl2aWRlKDUsIERlY2ltYWwoNSkpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgciA9IGEuX19kaXZfXyhiLCBjb250ZXh0PXNlbGYpCisgICAgICAgIGlmIHIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVzIHRvIERlY2ltYWwiICUgYikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiByCisKKyAgICBkZWYgZGl2aWRlX2ludChzZWxmLCBhLCBiKToKKyAgICAgICAgIiIiRGl2aWRlcyB0d28gbnVtYmVycyBhbmQgcmV0dXJucyB0aGUgaW50ZWdlciBwYXJ0IG9mIHRoZSByZXN1bHQuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGVfaW50KERlY2ltYWwoJzInKSwgRGVjaW1hbCgnMycpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGVfaW50KERlY2ltYWwoJzEwJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZGl2aWRlX2ludChEZWNpbWFsKCcxJyksIERlY2ltYWwoJzAuMycpKQorICAgICAgICBEZWNpbWFsKCczJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGVfaW50KDEwLCAzKQorICAgICAgICBEZWNpbWFsKCczJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGVfaW50KERlY2ltYWwoMTApLCAzKQorICAgICAgICBEZWNpbWFsKCczJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGVfaW50KDEwLCBEZWNpbWFsKDMpKQorICAgICAgICBEZWNpbWFsKCczJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHIgPSBhLl9fZmxvb3JkaXZfXyhiLCBjb250ZXh0PXNlbGYpCisgICAgICAgIGlmIHIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVzIHRvIERlY2ltYWwiICUgYikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiByCisKKyAgICBkZWYgZGl2bW9kKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJSZXR1cm4gKGEgLy8gYiwgYSAlIGIpLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZGl2bW9kKERlY2ltYWwoOCksIERlY2ltYWwoMykpCisgICAgICAgIChEZWNpbWFsKCcyJyksIERlY2ltYWwoJzInKSkKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZtb2QoRGVjaW1hbCg4KSwgRGVjaW1hbCg0KSkKKyAgICAgICAgKERlY2ltYWwoJzInKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdm1vZCg4LCA0KQorICAgICAgICAoRGVjaW1hbCgnMicpLCBEZWNpbWFsKCcwJykpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZGl2bW9kKERlY2ltYWwoOCksIDQpCisgICAgICAgIChEZWNpbWFsKCcyJyksIERlY2ltYWwoJzAnKSkKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZtb2QoOCwgRGVjaW1hbCg0KSkKKyAgICAgICAgKERlY2ltYWwoJzInKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgciA9IGEuX19kaXZtb2RfXyhiLCBjb250ZXh0PXNlbGYpCisgICAgICAgIGlmIHIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVzIHRvIERlY2ltYWwiICUgYikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiByCisKKyAgICBkZWYgZXhwKHNlbGYsIGEpOgorICAgICAgICAiIiJSZXR1cm5zIGUgKiogYS4KKworICAgICAgICA+Pj4gYyA9IEV4dGVuZGVkQ29udGV4dC5jb3B5KCkKKyAgICAgICAgPj4+IGMuRW1pbiA9IC05OTkKKyAgICAgICAgPj4+IGMuRW1heCA9IDk5OQorICAgICAgICA+Pj4gYy5leHAoRGVjaW1hbCgnLUluZmluaXR5JykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gYy5leHAoRGVjaW1hbCgnLTEnKSkKKyAgICAgICAgRGVjaW1hbCgnMC4zNjc4Nzk0NDEnKQorICAgICAgICA+Pj4gYy5leHAoRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IGMuZXhwKERlY2ltYWwoJzEnKSkKKyAgICAgICAgRGVjaW1hbCgnMi43MTgyODE4MycpCisgICAgICAgID4+PiBjLmV4cChEZWNpbWFsKCcwLjY5MzE0NzE4MScpKQorICAgICAgICBEZWNpbWFsKCcyLjAwMDAwMDAwJykKKyAgICAgICAgPj4+IGMuZXhwKERlY2ltYWwoJytJbmZpbml0eScpKQorICAgICAgICBEZWNpbWFsKCdJbmZpbml0eScpCisgICAgICAgID4+PiBjLmV4cCgxMCkKKyAgICAgICAgRGVjaW1hbCgnMjIwMjYuNDY1OCcpCisgICAgICAgICIiIgorICAgICAgICBhID1fY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmV4cChjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgZm1hKHNlbGYsIGEsIGIsIGMpOgorICAgICAgICAiIiJSZXR1cm5zIGEgbXVsdGlwbGllZCBieSBiLCBwbHVzIGMuCisKKyAgICAgICAgVGhlIGZpcnN0IHR3byBvcGVyYW5kcyBhcmUgbXVsdGlwbGllZCB0b2dldGhlciwgdXNpbmcgbXVsdGlwbHksCisgICAgICAgIHRoZSB0aGlyZCBvcGVyYW5kIGlzIHRoZW4gYWRkZWQgdG8gdGhlIHJlc3VsdCBvZiB0aGF0CisgICAgICAgIG11bHRpcGxpY2F0aW9uLCB1c2luZyBhZGQsIGFsbCB3aXRoIG9ubHkgb25lIGZpbmFsIHJvdW5kaW5nLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZm1hKERlY2ltYWwoJzMnKSwgRGVjaW1hbCgnNScpLCBEZWNpbWFsKCc3JykpCisgICAgICAgIERlY2ltYWwoJzIyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5mbWEoRGVjaW1hbCgnMycpLCBEZWNpbWFsKCctNScpLCBEZWNpbWFsKCc3JykpCisgICAgICAgIERlY2ltYWwoJy04JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5mbWEoRGVjaW1hbCgnODg4NTY1MjkwJyksIERlY2ltYWwoJzE1NTcuOTY5MzAnKSwgRGVjaW1hbCgnLTg2MDg3Ljc1NzgnKSkKKyAgICAgICAgRGVjaW1hbCgnMS4zODQzNTczNkUrMTInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmZtYSgxLCAzLCA0KQorICAgICAgICBEZWNpbWFsKCc3JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5mbWEoMSwgRGVjaW1hbCgzKSwgNCkKKyAgICAgICAgRGVjaW1hbCgnNycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZm1hKDEsIDMsIERlY2ltYWwoNCkpCisgICAgICAgIERlY2ltYWwoJzcnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuZm1hKGIsIGMsIGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBpc19jYW5vbmljYWwoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBvcGVyYW5kIGlzIGNhbm9uaWNhbDsgb3RoZXJ3aXNlIHJldHVybiBGYWxzZS4KKworICAgICAgICBDdXJyZW50bHksIHRoZSBlbmNvZGluZyBvZiBhIERlY2ltYWwgaW5zdGFuY2UgaXMgYWx3YXlzCisgICAgICAgIGNhbm9uaWNhbCwgc28gdGhpcyBtZXRob2QgcmV0dXJucyBUcnVlIGZvciBhbnkgRGVjaW1hbC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX2Nhbm9uaWNhbChEZWNpbWFsKCcyLjUwJykpCisgICAgICAgIFRydWUKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBhLmlzX2Nhbm9uaWNhbCgpCisKKyAgICBkZWYgaXNfZmluaXRlKHNlbGYsIGEpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgb3BlcmFuZCBpcyBmaW5pdGU7IG90aGVyd2lzZSByZXR1cm4gRmFsc2UuCisKKyAgICAgICAgQSBEZWNpbWFsIGluc3RhbmNlIGlzIGNvbnNpZGVyZWQgZmluaXRlIGlmIGl0IGlzIG5laXRoZXIKKyAgICAgICAgaW5maW5pdGUgbm9yIGEgTmFOLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfZmluaXRlKERlY2ltYWwoJzIuNTAnKSkKKyAgICAgICAgVHJ1ZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX2Zpbml0ZShEZWNpbWFsKCctMC4zJykpCisgICAgICAgIFRydWUKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19maW5pdGUoRGVjaW1hbCgnMCcpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfZmluaXRlKERlY2ltYWwoJ0luZicpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX2Zpbml0ZShEZWNpbWFsKCdOYU4nKSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19maW5pdGUoMSkKKyAgICAgICAgVHJ1ZQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuaXNfZmluaXRlKCkKKworICAgIGRlZiBpc19pbmZpbml0ZShzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhbmQgaXMgaW5maW5pdGU7IG90aGVyd2lzZSByZXR1cm4gRmFsc2UuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19pbmZpbml0ZShEZWNpbWFsKCcyLjUwJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfaW5maW5pdGUoRGVjaW1hbCgnLUluZicpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfaW5maW5pdGUoRGVjaW1hbCgnTmFOJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfaW5maW5pdGUoMSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmlzX2luZmluaXRlKCkKKworICAgIGRlZiBpc19uYW4oc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBvcGVyYW5kIGlzIGEgcU5hTiBvciBzTmFOOworICAgICAgICBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfbmFuKERlY2ltYWwoJzIuNTAnKSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19uYW4oRGVjaW1hbCgnTmFOJykpCisgICAgICAgIFRydWUKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19uYW4oRGVjaW1hbCgnLXNOYU4nKSkKKyAgICAgICAgVHJ1ZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX25hbigxKQorICAgICAgICBGYWxzZQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuaXNfbmFuKCkKKworICAgIGRlZiBpc19ub3JtYWwoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBvcGVyYW5kIGlzIGEgbm9ybWFsIG51bWJlcjsKKyAgICAgICAgb3RoZXJ3aXNlIHJldHVybiBGYWxzZS4KKworICAgICAgICA+Pj4gYyA9IEV4dGVuZGVkQ29udGV4dC5jb3B5KCkKKyAgICAgICAgPj4+IGMuRW1pbiA9IC05OTkKKyAgICAgICAgPj4+IGMuRW1heCA9IDk5OQorICAgICAgICA+Pj4gYy5pc19ub3JtYWwoRGVjaW1hbCgnMi41MCcpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBjLmlzX25vcm1hbChEZWNpbWFsKCcwLjFFLTk5OScpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gYy5pc19ub3JtYWwoRGVjaW1hbCgnMC4wMCcpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gYy5pc19ub3JtYWwoRGVjaW1hbCgnLUluZicpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gYy5pc19ub3JtYWwoRGVjaW1hbCgnTmFOJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBjLmlzX25vcm1hbCgxKQorICAgICAgICBUcnVlCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5pc19ub3JtYWwoY29udGV4dD1zZWxmKQorCisgICAgZGVmIGlzX3FuYW4oc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBvcGVyYW5kIGlzIGEgcXVpZXQgTmFOOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfcW5hbihEZWNpbWFsKCcyLjUwJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfcW5hbihEZWNpbWFsKCdOYU4nKSkKKyAgICAgICAgVHJ1ZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3FuYW4oRGVjaW1hbCgnc05hTicpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3FuYW4oMSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmlzX3FuYW4oKQorCisgICAgZGVmIGlzX3NpZ25lZChzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhbmQgaXMgbmVnYXRpdmU7IG90aGVyd2lzZSByZXR1cm4gRmFsc2UuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19zaWduZWQoRGVjaW1hbCgnMi41MCcpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3NpZ25lZChEZWNpbWFsKCctMTInKSkKKyAgICAgICAgVHJ1ZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3NpZ25lZChEZWNpbWFsKCctMCcpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfc2lnbmVkKDgpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfc2lnbmVkKC04KQorICAgICAgICBUcnVlCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5pc19zaWduZWQoKQorCisgICAgZGVmIGlzX3NuYW4oc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBvcGVyYW5kIGlzIGEgc2lnbmFsaW5nIE5hTjsKKyAgICAgICAgb3RoZXJ3aXNlIHJldHVybiBGYWxzZS4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3NuYW4oRGVjaW1hbCgnMi41MCcpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3NuYW4oRGVjaW1hbCgnTmFOJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfc25hbihEZWNpbWFsKCdzTmFOJykpCisgICAgICAgIFRydWUKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19zbmFuKDEpCisgICAgICAgIEZhbHNlCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5pc19zbmFuKCkKKworICAgIGRlZiBpc19zdWJub3JtYWwoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBvcGVyYW5kIGlzIHN1Ym5vcm1hbDsgb3RoZXJ3aXNlIHJldHVybiBGYWxzZS4KKworICAgICAgICA+Pj4gYyA9IEV4dGVuZGVkQ29udGV4dC5jb3B5KCkKKyAgICAgICAgPj4+IGMuRW1pbiA9IC05OTkKKyAgICAgICAgPj4+IGMuRW1heCA9IDk5OQorICAgICAgICA+Pj4gYy5pc19zdWJub3JtYWwoRGVjaW1hbCgnMi41MCcpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gYy5pc19zdWJub3JtYWwoRGVjaW1hbCgnMC4xRS05OTknKSkKKyAgICAgICAgVHJ1ZQorICAgICAgICA+Pj4gYy5pc19zdWJub3JtYWwoRGVjaW1hbCgnMC4wMCcpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gYy5pc19zdWJub3JtYWwoRGVjaW1hbCgnLUluZicpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gYy5pc19zdWJub3JtYWwoRGVjaW1hbCgnTmFOJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBjLmlzX3N1Ym5vcm1hbCgxKQorICAgICAgICBGYWxzZQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuaXNfc3Vibm9ybWFsKGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBpc196ZXJvKHNlbGYsIGEpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgb3BlcmFuZCBpcyBhIHplcm87IG90aGVyd2lzZSByZXR1cm4gRmFsc2UuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc196ZXJvKERlY2ltYWwoJzAnKSkKKyAgICAgICAgVHJ1ZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3plcm8oRGVjaW1hbCgnMi41MCcpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3plcm8oRGVjaW1hbCgnLTBFKzInKSkKKyAgICAgICAgVHJ1ZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3plcm8oMSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc196ZXJvKDApCisgICAgICAgIFRydWUKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmlzX3plcm8oKQorCisgICAgZGVmIGxuKHNlbGYsIGEpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBuYXR1cmFsIChiYXNlIGUpIGxvZ2FyaXRobSBvZiB0aGUgb3BlcmFuZC4KKworICAgICAgICA+Pj4gYyA9IEV4dGVuZGVkQ29udGV4dC5jb3B5KCkKKyAgICAgICAgPj4+IGMuRW1pbiA9IC05OTkKKyAgICAgICAgPj4+IGMuRW1heCA9IDk5OQorICAgICAgICA+Pj4gYy5sbihEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJy1JbmZpbml0eScpCisgICAgICAgID4+PiBjLmxuKERlY2ltYWwoJzEuMDAwJykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gYy5sbihEZWNpbWFsKCcyLjcxODI4MTgzJykpCisgICAgICAgIERlY2ltYWwoJzEuMDAwMDAwMDAnKQorICAgICAgICA+Pj4gYy5sbihEZWNpbWFsKCcxMCcpKQorICAgICAgICBEZWNpbWFsKCcyLjMwMjU4NTA5JykKKyAgICAgICAgPj4+IGMubG4oRGVjaW1hbCgnK0luZmluaXR5JykpCisgICAgICAgIERlY2ltYWwoJ0luZmluaXR5JykKKyAgICAgICAgPj4+IGMubG4oMSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5sbihjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgbG9nMTAoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGJhc2UgMTAgbG9nYXJpdGhtIG9mIHRoZSBvcGVyYW5kLgorCisgICAgICAgID4+PiBjID0gRXh0ZW5kZWRDb250ZXh0LmNvcHkoKQorICAgICAgICA+Pj4gYy5FbWluID0gLTk5OQorICAgICAgICA+Pj4gYy5FbWF4ID0gOTk5CisgICAgICAgID4+PiBjLmxvZzEwKERlY2ltYWwoJzAnKSkKKyAgICAgICAgRGVjaW1hbCgnLUluZmluaXR5JykKKyAgICAgICAgPj4+IGMubG9nMTAoRGVjaW1hbCgnMC4wMDEnKSkKKyAgICAgICAgRGVjaW1hbCgnLTMnKQorICAgICAgICA+Pj4gYy5sb2cxMChEZWNpbWFsKCcxLjAwMCcpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IGMubG9nMTAoRGVjaW1hbCgnMicpKQorICAgICAgICBEZWNpbWFsKCcwLjMwMTAyOTk5NicpCisgICAgICAgID4+PiBjLmxvZzEwKERlY2ltYWwoJzEwJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gYy5sb2cxMChEZWNpbWFsKCc3MCcpKQorICAgICAgICBEZWNpbWFsKCcxLjg0NTA5ODA0JykKKyAgICAgICAgPj4+IGMubG9nMTAoRGVjaW1hbCgnK0luZmluaXR5JykpCisgICAgICAgIERlY2ltYWwoJ0luZmluaXR5JykKKyAgICAgICAgPj4+IGMubG9nMTAoMCkKKyAgICAgICAgRGVjaW1hbCgnLUluZmluaXR5JykKKyAgICAgICAgPj4+IGMubG9nMTAoMSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5sb2cxMChjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgbG9nYihzZWxmLCBhKToKKyAgICAgICAgIiIiIFJldHVybnMgdGhlIGV4cG9uZW50IG9mIHRoZSBtYWduaXR1ZGUgb2YgdGhlIG9wZXJhbmQncyBNU0QuCisKKyAgICAgICAgVGhlIHJlc3VsdCBpcyB0aGUgaW50ZWdlciB3aGljaCBpcyB0aGUgZXhwb25lbnQgb2YgdGhlIG1hZ25pdHVkZQorICAgICAgICBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBkaWdpdCBvZiB0aGUgb3BlcmFuZCAoYXMgdGhvdWdoIHRoZQorICAgICAgICBvcGVyYW5kIHdlcmUgdHJ1bmNhdGVkIHRvIGEgc2luZ2xlIGRpZ2l0IHdoaWxlIG1haW50YWluaW5nIHRoZQorICAgICAgICB2YWx1ZSBvZiB0aGF0IGRpZ2l0IGFuZCB3aXRob3V0IGxpbWl0aW5nIHRoZSByZXN1bHRpbmcgZXhwb25lbnQpLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9nYihEZWNpbWFsKCcyNTAnKSkKKyAgICAgICAgRGVjaW1hbCgnMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9nYihEZWNpbWFsKCcyLjUwJykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2IoRGVjaW1hbCgnMC4wMycpKQorICAgICAgICBEZWNpbWFsKCctMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9nYihEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJy1JbmZpbml0eScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9nYigxKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2diKDEwKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2diKDEwMCkKKyAgICAgICAgRGVjaW1hbCgnMicpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5sb2diKGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBsb2dpY2FsX2FuZChzZWxmLCBhLCBiKToKKyAgICAgICAgIiIiQXBwbGllcyB0aGUgbG9naWNhbCBvcGVyYXRpb24gJ2FuZCcgYmV0d2VlbiBlYWNoIG9wZXJhbmQncyBkaWdpdHMuCisKKyAgICAgICAgVGhlIG9wZXJhbmRzIG11c3QgYmUgYm90aCBsb2dpY2FsIG51bWJlcnMuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX2FuZChEZWNpbWFsKCcwJyksIERlY2ltYWwoJzAnKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF9hbmQoRGVjaW1hbCgnMCcpLCBEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfYW5kKERlY2ltYWwoJzEnKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX2FuZChEZWNpbWFsKCcxJyksIERlY2ltYWwoJzEnKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF9hbmQoRGVjaW1hbCgnMTEwMCcpLCBEZWNpbWFsKCcxMDEwJykpCisgICAgICAgIERlY2ltYWwoJzEwMDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfYW5kKERlY2ltYWwoJzExMTEnKSwgRGVjaW1hbCgnMTAnKSkKKyAgICAgICAgRGVjaW1hbCgnMTAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfYW5kKDExMCwgMTEwMSkKKyAgICAgICAgRGVjaW1hbCgnMTAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX2FuZChEZWNpbWFsKDExMCksIDExMDEpCisgICAgICAgIERlY2ltYWwoJzEwMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF9hbmQoMTEwLCBEZWNpbWFsKDExMDEpKQorICAgICAgICBEZWNpbWFsKCcxMDAnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEubG9naWNhbF9hbmQoYiwgY29udGV4dD1zZWxmKQorCisgICAgZGVmIGxvZ2ljYWxfaW52ZXJ0KHNlbGYsIGEpOgorICAgICAgICAiIiJJbnZlcnQgYWxsIHRoZSBkaWdpdHMgaW4gdGhlIG9wZXJhbmQuCisKKyAgICAgICAgVGhlIG9wZXJhbmQgbXVzdCBiZSBhIGxvZ2ljYWwgbnVtYmVyLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF9pbnZlcnQoRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcxMTExMTExMTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfaW52ZXJ0KERlY2ltYWwoJzEnKSkKKyAgICAgICAgRGVjaW1hbCgnMTExMTExMTEwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX2ludmVydChEZWNpbWFsKCcxMTExMTExMTEnKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF9pbnZlcnQoRGVjaW1hbCgnMTAxMDEwMTAxJykpCisgICAgICAgIERlY2ltYWwoJzEwMTAxMDEwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX2ludmVydCgxMTAxKQorICAgICAgICBEZWNpbWFsKCcxMTExMTAwMTAnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEubG9naWNhbF9pbnZlcnQoY29udGV4dD1zZWxmKQorCisgICAgZGVmIGxvZ2ljYWxfb3Ioc2VsZiwgYSwgYik6CisgICAgICAgICIiIkFwcGxpZXMgdGhlIGxvZ2ljYWwgb3BlcmF0aW9uICdvcicgYmV0d2VlbiBlYWNoIG9wZXJhbmQncyBkaWdpdHMuCisKKyAgICAgICAgVGhlIG9wZXJhbmRzIG11c3QgYmUgYm90aCBsb2dpY2FsIG51bWJlcnMuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX29yKERlY2ltYWwoJzAnKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX29yKERlY2ltYWwoJzAnKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX29yKERlY2ltYWwoJzEnKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX29yKERlY2ltYWwoJzEnKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX29yKERlY2ltYWwoJzExMDAnKSwgRGVjaW1hbCgnMTAxMCcpKQorICAgICAgICBEZWNpbWFsKCcxMTEwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX29yKERlY2ltYWwoJzExMTAnKSwgRGVjaW1hbCgnMTAnKSkKKyAgICAgICAgRGVjaW1hbCgnMTExMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF9vcigxMTAsIDExMDEpCisgICAgICAgIERlY2ltYWwoJzExMTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfb3IoRGVjaW1hbCgxMTApLCAxMTAxKQorICAgICAgICBEZWNpbWFsKCcxMTExJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX29yKDExMCwgRGVjaW1hbCgxMTAxKSkKKyAgICAgICAgRGVjaW1hbCgnMTExMScpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5sb2dpY2FsX29yKGIsIGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBsb2dpY2FsX3hvcihzZWxmLCBhLCBiKToKKyAgICAgICAgIiIiQXBwbGllcyB0aGUgbG9naWNhbCBvcGVyYXRpb24gJ3hvcicgYmV0d2VlbiBlYWNoIG9wZXJhbmQncyBkaWdpdHMuCisKKyAgICAgICAgVGhlIG9wZXJhbmRzIG11c3QgYmUgYm90aCBsb2dpY2FsIG51bWJlcnMuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX3hvcihEZWNpbWFsKCcwJyksIERlY2ltYWwoJzAnKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF94b3IoRGVjaW1hbCgnMCcpLCBEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfeG9yKERlY2ltYWwoJzEnKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX3hvcihEZWNpbWFsKCcxJyksIERlY2ltYWwoJzEnKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF94b3IoRGVjaW1hbCgnMTEwMCcpLCBEZWNpbWFsKCcxMDEwJykpCisgICAgICAgIERlY2ltYWwoJzExMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF94b3IoRGVjaW1hbCgnMTExMScpLCBEZWNpbWFsKCcxMCcpKQorICAgICAgICBEZWNpbWFsKCcxMTAxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX3hvcigxMTAsIDExMDEpCisgICAgICAgIERlY2ltYWwoJzEwMTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfeG9yKERlY2ltYWwoMTEwKSwgMTEwMSkKKyAgICAgICAgRGVjaW1hbCgnMTAxMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF94b3IoMTEwLCBEZWNpbWFsKDExMDEpKQorICAgICAgICBEZWNpbWFsKCcxMDExJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmxvZ2ljYWxfeG9yKGIsIGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBtYXgoc2VsZiwgYSwgYik6CisgICAgICAgICIiIm1heCBjb21wYXJlcyB0d28gdmFsdWVzIG51bWVyaWNhbGx5IGFuZCByZXR1cm5zIHRoZSBtYXhpbXVtLgorCisgICAgICAgIElmIGVpdGhlciBvcGVyYW5kIGlzIGEgTmFOIHRoZW4gdGhlIGdlbmVyYWwgcnVsZXMgYXBwbHkuCisgICAgICAgIE90aGVyd2lzZSwgdGhlIG9wZXJhbmRzIGFyZSBjb21wYXJlZCBhcyB0aG91Z2ggYnkgdGhlIGNvbXBhcmUKKyAgICAgICAgb3BlcmF0aW9uLiAgSWYgdGhleSBhcmUgbnVtZXJpY2FsbHkgZXF1YWwgdGhlbiB0aGUgbGVmdC1oYW5kIG9wZXJhbmQKKyAgICAgICAgaXMgY2hvc2VuIGFzIHRoZSByZXN1bHQuICBPdGhlcndpc2UgdGhlIG1heGltdW0gKGNsb3NlciB0byBwb3NpdGl2ZQorICAgICAgICBpbmZpbml0eSkgb2YgdGhlIHR3byBvcGVyYW5kcyBpcyBjaG9zZW4gYXMgdGhlIHJlc3VsdC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1heChEZWNpbWFsKCczJyksIERlY2ltYWwoJzInKSkKKyAgICAgICAgRGVjaW1hbCgnMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWF4KERlY2ltYWwoJy0xMCcpLCBEZWNpbWFsKCczJykpCisgICAgICAgIERlY2ltYWwoJzMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1heChEZWNpbWFsKCcxLjAnKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tYXgoRGVjaW1hbCgnNycpLCBEZWNpbWFsKCdOYU4nKSkKKyAgICAgICAgRGVjaW1hbCgnNycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWF4KDEsIDIpCisgICAgICAgIERlY2ltYWwoJzInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1heChEZWNpbWFsKDEpLCAyKQorICAgICAgICBEZWNpbWFsKCcyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tYXgoMSwgRGVjaW1hbCgyKSkKKyAgICAgICAgRGVjaW1hbCgnMicpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5tYXgoYiwgY29udGV4dD1zZWxmKQorCisgICAgZGVmIG1heF9tYWcoc2VsZiwgYSwgYik6CisgICAgICAgICIiIkNvbXBhcmVzIHRoZSB2YWx1ZXMgbnVtZXJpY2FsbHkgd2l0aCB0aGVpciBzaWduIGlnbm9yZWQuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tYXhfbWFnKERlY2ltYWwoJzcnKSwgRGVjaW1hbCgnTmFOJykpCisgICAgICAgIERlY2ltYWwoJzcnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1heF9tYWcoRGVjaW1hbCgnNycpLCBEZWNpbWFsKCctMTAnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tYXhfbWFnKDEsIC0yKQorICAgICAgICBEZWNpbWFsKCctMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWF4X21hZyhEZWNpbWFsKDEpLCAtMikKKyAgICAgICAgRGVjaW1hbCgnLTInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1heF9tYWcoMSwgRGVjaW1hbCgtMikpCisgICAgICAgIERlY2ltYWwoJy0yJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLm1heF9tYWcoYiwgY29udGV4dD1zZWxmKQorCisgICAgZGVmIG1pbihzZWxmLCBhLCBiKToKKyAgICAgICAgIiIibWluIGNvbXBhcmVzIHR3byB2YWx1ZXMgbnVtZXJpY2FsbHkgYW5kIHJldHVybnMgdGhlIG1pbmltdW0uCisKKyAgICAgICAgSWYgZWl0aGVyIG9wZXJhbmQgaXMgYSBOYU4gdGhlbiB0aGUgZ2VuZXJhbCBydWxlcyBhcHBseS4KKyAgICAgICAgT3RoZXJ3aXNlLCB0aGUgb3BlcmFuZHMgYXJlIGNvbXBhcmVkIGFzIHRob3VnaCBieSB0aGUgY29tcGFyZQorICAgICAgICBvcGVyYXRpb24uICBJZiB0aGV5IGFyZSBudW1lcmljYWxseSBlcXVhbCB0aGVuIHRoZSBsZWZ0LWhhbmQgb3BlcmFuZAorICAgICAgICBpcyBjaG9zZW4gYXMgdGhlIHJlc3VsdC4gIE90aGVyd2lzZSB0aGUgbWluaW11bSAoY2xvc2VyIHRvIG5lZ2F0aXZlCisgICAgICAgIGluZmluaXR5KSBvZiB0aGUgdHdvIG9wZXJhbmRzIGlzIGNob3NlbiBhcyB0aGUgcmVzdWx0LgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWluKERlY2ltYWwoJzMnKSwgRGVjaW1hbCgnMicpKQorICAgICAgICBEZWNpbWFsKCcyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW4oRGVjaW1hbCgnLTEwJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW4oRGVjaW1hbCgnMS4wJyksIERlY2ltYWwoJzEnKSkKKyAgICAgICAgRGVjaW1hbCgnMS4wJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW4oRGVjaW1hbCgnNycpLCBEZWNpbWFsKCdOYU4nKSkKKyAgICAgICAgRGVjaW1hbCgnNycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWluKDEsIDIpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1pbihEZWNpbWFsKDEpLCAyKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW4oMSwgRGVjaW1hbCgyOSkpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEubWluKGIsIGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBtaW5fbWFnKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJDb21wYXJlcyB0aGUgdmFsdWVzIG51bWVyaWNhbGx5IHdpdGggdGhlaXIgc2lnbiBpZ25vcmVkLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWluX21hZyhEZWNpbWFsKCczJyksIERlY2ltYWwoJy0yJykpCisgICAgICAgIERlY2ltYWwoJy0yJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW5fbWFnKERlY2ltYWwoJy0zJyksIERlY2ltYWwoJ05hTicpKQorICAgICAgICBEZWNpbWFsKCctMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWluX21hZygxLCAtMikKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWluX21hZyhEZWNpbWFsKDEpLCAtMikKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWluX21hZygxLCBEZWNpbWFsKC0yKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5taW5fbWFnKGIsIGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBtaW51cyhzZWxmLCBhKToKKyAgICAgICAgIiIiTWludXMgY29ycmVzcG9uZHMgdG8gdW5hcnkgcHJlZml4IG1pbnVzIGluIFB5dGhvbi4KKworICAgICAgICBUaGUgb3BlcmF0aW9uIGlzIGV2YWx1YXRlZCB1c2luZyB0aGUgc2FtZSBydWxlcyBhcyBzdWJ0cmFjdDsgdGhlCisgICAgICAgIG9wZXJhdGlvbiBtaW51cyhhKSBpcyBjYWxjdWxhdGVkIGFzIHN1YnRyYWN0KCcwJywgYSkgd2hlcmUgdGhlICcwJworICAgICAgICBoYXMgdGhlIHNhbWUgZXhwb25lbnQgYXMgdGhlIG9wZXJhbmQuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW51cyhEZWNpbWFsKCcxLjMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEuMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWludXMoRGVjaW1hbCgnLTEuMycpKQorICAgICAgICBEZWNpbWFsKCcxLjMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1pbnVzKDEpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLl9fbmVnX18oY29udGV4dD1zZWxmKQorCisgICAgZGVmIG11bHRpcGx5KHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJtdWx0aXBseSBtdWx0aXBsaWVzIHR3byBvcGVyYW5kcy4KKworICAgICAgICBJZiBlaXRoZXIgb3BlcmFuZCBpcyBhIHNwZWNpYWwgdmFsdWUgdGhlbiB0aGUgZ2VuZXJhbCBydWxlcyBhcHBseS4KKyAgICAgICAgT3RoZXJ3aXNlLCB0aGUgb3BlcmFuZHMgYXJlIG11bHRpcGxpZWQgdG9nZXRoZXIKKyAgICAgICAgKCdsb25nIG11bHRpcGxpY2F0aW9uJyksIHJlc3VsdGluZyBpbiBhIG51bWJlciB3aGljaCBtYXkgYmUgYXMgbG9uZyBhcworICAgICAgICB0aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIHRoZSB0d28gb3BlcmFuZHMuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tdWx0aXBseShEZWNpbWFsKCcxLjIwJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnMy42MCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubXVsdGlwbHkoRGVjaW1hbCgnNycpLCBEZWNpbWFsKCczJykpCisgICAgICAgIERlY2ltYWwoJzIxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tdWx0aXBseShEZWNpbWFsKCcwLjknKSwgRGVjaW1hbCgnMC44JykpCisgICAgICAgIERlY2ltYWwoJzAuNzInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm11bHRpcGx5KERlY2ltYWwoJzAuOScpLCBEZWNpbWFsKCctMCcpKQorICAgICAgICBEZWNpbWFsKCctMC4wJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tdWx0aXBseShEZWNpbWFsKCc2NTQzMjEnKSwgRGVjaW1hbCgnNjU0MzIxJykpCisgICAgICAgIERlY2ltYWwoJzQuMjgxMzU5NzFFKzExJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tdWx0aXBseSg3LCA3KQorICAgICAgICBEZWNpbWFsKCc0OScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubXVsdGlwbHkoRGVjaW1hbCg3KSwgNykKKyAgICAgICAgRGVjaW1hbCgnNDknKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm11bHRpcGx5KDcsIERlY2ltYWwoNykpCisgICAgICAgIERlY2ltYWwoJzQ5JykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHIgPSBhLl9fbXVsX18oYiwgY29udGV4dD1zZWxmKQorICAgICAgICBpZiByIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJVbmFibGUgdG8gY29udmVydCAlcyB0byBEZWNpbWFsIiAlIGIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIG5leHRfbWludXMoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIgc21hbGxlciB0aGFuIGEuCisKKyAgICAgICAgPj4+IGMgPSBFeHRlbmRlZENvbnRleHQuY29weSgpCisgICAgICAgID4+PiBjLkVtaW4gPSAtOTk5CisgICAgICAgID4+PiBjLkVtYXggPSA5OTkKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5uZXh0X21pbnVzKERlY2ltYWwoJzEnKSkKKyAgICAgICAgRGVjaW1hbCgnMC45OTk5OTk5OTknKQorICAgICAgICA+Pj4gYy5uZXh0X21pbnVzKERlY2ltYWwoJzFFLTEwMDcnKSkKKyAgICAgICAgRGVjaW1hbCgnMEUtMTAwNycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubmV4dF9taW51cyhEZWNpbWFsKCctMS4wMDAwMDAwMycpKQorICAgICAgICBEZWNpbWFsKCctMS4wMDAwMDAwNCcpCisgICAgICAgID4+PiBjLm5leHRfbWludXMoRGVjaW1hbCgnSW5maW5pdHknKSkKKyAgICAgICAgRGVjaW1hbCgnOS45OTk5OTk5OUUrOTk5JykKKyAgICAgICAgPj4+IGMubmV4dF9taW51cygxKQorICAgICAgICBEZWNpbWFsKCcwLjk5OTk5OTk5OScpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5uZXh0X21pbnVzKGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBuZXh0X3BsdXMoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIHNtYWxsZXN0IHJlcHJlc2VudGFibGUgbnVtYmVyIGxhcmdlciB0aGFuIGEuCisKKyAgICAgICAgPj4+IGMgPSBFeHRlbmRlZENvbnRleHQuY29weSgpCisgICAgICAgID4+PiBjLkVtaW4gPSAtOTk5CisgICAgICAgID4+PiBjLkVtYXggPSA5OTkKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5uZXh0X3BsdXMoRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcxLjAwMDAwMDAxJykKKyAgICAgICAgPj4+IGMubmV4dF9wbHVzKERlY2ltYWwoJy0xRS0xMDA3JykpCisgICAgICAgIERlY2ltYWwoJy0wRS0xMDA3JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5uZXh0X3BsdXMoRGVjaW1hbCgnLTEuMDAwMDAwMDMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEuMDAwMDAwMDInKQorICAgICAgICA+Pj4gYy5uZXh0X3BsdXMoRGVjaW1hbCgnLUluZmluaXR5JykpCisgICAgICAgIERlY2ltYWwoJy05Ljk5OTk5OTk5RSs5OTknKQorICAgICAgICA+Pj4gYy5uZXh0X3BsdXMoMSkKKyAgICAgICAgRGVjaW1hbCgnMS4wMDAwMDAwMScpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5uZXh0X3BsdXMoY29udGV4dD1zZWxmKQorCisgICAgZGVmIG5leHRfdG93YXJkKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBudW1iZXIgY2xvc2VzdCB0byBhLCBpbiBkaXJlY3Rpb24gdG93YXJkcyBiLgorCisgICAgICAgIFRoZSByZXN1bHQgaXMgdGhlIGNsb3Nlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIgZnJvbSB0aGUgZmlyc3QKKyAgICAgICAgb3BlcmFuZCAoYnV0IG5vdCB0aGUgZmlyc3Qgb3BlcmFuZCkgdGhhdCBpcyBpbiB0aGUgZGlyZWN0aW9uCisgICAgICAgIHRvd2FyZHMgdGhlIHNlY29uZCBvcGVyYW5kLCB1bmxlc3MgdGhlIG9wZXJhbmRzIGhhdmUgdGhlIHNhbWUKKyAgICAgICAgdmFsdWUuCisKKyAgICAgICAgPj4+IGMgPSBFeHRlbmRlZENvbnRleHQuY29weSgpCisgICAgICAgID4+PiBjLkVtaW4gPSAtOTk5CisgICAgICAgID4+PiBjLkVtYXggPSA5OTkKKyAgICAgICAgPj4+IGMubmV4dF90b3dhcmQoRGVjaW1hbCgnMScpLCBEZWNpbWFsKCcyJykpCisgICAgICAgIERlY2ltYWwoJzEuMDAwMDAwMDEnKQorICAgICAgICA+Pj4gYy5uZXh0X3Rvd2FyZChEZWNpbWFsKCctMUUtMTAwNycpLCBEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJy0wRS0xMDA3JykKKyAgICAgICAgPj4+IGMubmV4dF90b3dhcmQoRGVjaW1hbCgnLTEuMDAwMDAwMDMnKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCctMS4wMDAwMDAwMicpCisgICAgICAgID4+PiBjLm5leHRfdG93YXJkKERlY2ltYWwoJzEnKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcwLjk5OTk5OTk5OScpCisgICAgICAgID4+PiBjLm5leHRfdG93YXJkKERlY2ltYWwoJzFFLTEwMDcnKSwgRGVjaW1hbCgnLTEwMCcpKQorICAgICAgICBEZWNpbWFsKCcwRS0xMDA3JykKKyAgICAgICAgPj4+IGMubmV4dF90b3dhcmQoRGVjaW1hbCgnLTEuMDAwMDAwMDMnKSwgRGVjaW1hbCgnLTEwJykpCisgICAgICAgIERlY2ltYWwoJy0xLjAwMDAwMDA0JykKKyAgICAgICAgPj4+IGMubmV4dF90b3dhcmQoRGVjaW1hbCgnMC4wMCcpLCBEZWNpbWFsKCctMC4wMDAwJykpCisgICAgICAgIERlY2ltYWwoJy0wLjAwJykKKyAgICAgICAgPj4+IGMubmV4dF90b3dhcmQoMCwgMSkKKyAgICAgICAgRGVjaW1hbCgnMUUtMTAwNycpCisgICAgICAgID4+PiBjLm5leHRfdG93YXJkKERlY2ltYWwoMCksIDEpCisgICAgICAgIERlY2ltYWwoJzFFLTEwMDcnKQorICAgICAgICA+Pj4gYy5uZXh0X3Rvd2FyZCgwLCBEZWNpbWFsKDEpKQorICAgICAgICBEZWNpbWFsKCcxRS0xMDA3JykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLm5leHRfdG93YXJkKGIsIGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBub3JtYWxpemUoc2VsZiwgYSk6CisgICAgICAgICIiIm5vcm1hbGl6ZSByZWR1Y2VzIGFuIG9wZXJhbmQgdG8gaXRzIHNpbXBsZXN0IGZvcm0uCisKKyAgICAgICAgRXNzZW50aWFsbHkgYSBwbHVzIG9wZXJhdGlvbiB3aXRoIGFsbCB0cmFpbGluZyB6ZXJvcyByZW1vdmVkIGZyb20gdGhlCisgICAgICAgIHJlc3VsdC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm5vcm1hbGl6ZShEZWNpbWFsKCcyLjEnKSkKKyAgICAgICAgRGVjaW1hbCgnMi4xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5ub3JtYWxpemUoRGVjaW1hbCgnLTIuMCcpKQorICAgICAgICBEZWNpbWFsKCctMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubm9ybWFsaXplKERlY2ltYWwoJzEuMjAwJykpCisgICAgICAgIERlY2ltYWwoJzEuMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubm9ybWFsaXplKERlY2ltYWwoJy0xMjAnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEuMkUrMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubm9ybWFsaXplKERlY2ltYWwoJzEyMC4wMCcpKQorICAgICAgICBEZWNpbWFsKCcxLjJFKzInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm5vcm1hbGl6ZShEZWNpbWFsKCcwLjAwJykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm5vcm1hbGl6ZSg2KQorICAgICAgICBEZWNpbWFsKCc2JykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLm5vcm1hbGl6ZShjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgbnVtYmVyX2NsYXNzKHNlbGYsIGEpOgorICAgICAgICAiIiJSZXR1cm5zIGFuIGluZGljYXRpb24gb2YgdGhlIGNsYXNzIG9mIHRoZSBvcGVyYW5kLgorCisgICAgICAgIFRoZSBjbGFzcyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdHJpbmdzOgorICAgICAgICAgIC1zTmFOCisgICAgICAgICAgLU5hTgorICAgICAgICAgIC1JbmZpbml0eQorICAgICAgICAgIC1Ob3JtYWwKKyAgICAgICAgICAtU3Vibm9ybWFsCisgICAgICAgICAgLVplcm8KKyAgICAgICAgICArWmVybworICAgICAgICAgICtTdWJub3JtYWwKKyAgICAgICAgICArTm9ybWFsCisgICAgICAgICAgK0luZmluaXR5CisKKyAgICAgICAgPj4+IGMgPSBDb250ZXh0KEV4dGVuZGVkQ29udGV4dCkKKyAgICAgICAgPj4+IGMuRW1pbiA9IC05OTkKKyAgICAgICAgPj4+IGMuRW1heCA9IDk5OQorICAgICAgICA+Pj4gYy5udW1iZXJfY2xhc3MoRGVjaW1hbCgnSW5maW5pdHknKSkKKyAgICAgICAgJytJbmZpbml0eScKKyAgICAgICAgPj4+IGMubnVtYmVyX2NsYXNzKERlY2ltYWwoJzFFLTEwJykpCisgICAgICAgICcrTm9ybWFsJworICAgICAgICA+Pj4gYy5udW1iZXJfY2xhc3MoRGVjaW1hbCgnMi41MCcpKQorICAgICAgICAnK05vcm1hbCcKKyAgICAgICAgPj4+IGMubnVtYmVyX2NsYXNzKERlY2ltYWwoJzAuMUUtOTk5JykpCisgICAgICAgICcrU3Vibm9ybWFsJworICAgICAgICA+Pj4gYy5udW1iZXJfY2xhc3MoRGVjaW1hbCgnMCcpKQorICAgICAgICAnK1plcm8nCisgICAgICAgID4+PiBjLm51bWJlcl9jbGFzcyhEZWNpbWFsKCctMCcpKQorICAgICAgICAnLVplcm8nCisgICAgICAgID4+PiBjLm51bWJlcl9jbGFzcyhEZWNpbWFsKCctMC4xRS05OTknKSkKKyAgICAgICAgJy1TdWJub3JtYWwnCisgICAgICAgID4+PiBjLm51bWJlcl9jbGFzcyhEZWNpbWFsKCctMUUtMTAnKSkKKyAgICAgICAgJy1Ob3JtYWwnCisgICAgICAgID4+PiBjLm51bWJlcl9jbGFzcyhEZWNpbWFsKCctMi41MCcpKQorICAgICAgICAnLU5vcm1hbCcKKyAgICAgICAgPj4+IGMubnVtYmVyX2NsYXNzKERlY2ltYWwoJy1JbmZpbml0eScpKQorICAgICAgICAnLUluZmluaXR5JworICAgICAgICA+Pj4gYy5udW1iZXJfY2xhc3MoRGVjaW1hbCgnTmFOJykpCisgICAgICAgICdOYU4nCisgICAgICAgID4+PiBjLm51bWJlcl9jbGFzcyhEZWNpbWFsKCctTmFOJykpCisgICAgICAgICdOYU4nCisgICAgICAgID4+PiBjLm51bWJlcl9jbGFzcyhEZWNpbWFsKCdzTmFOJykpCisgICAgICAgICdzTmFOJworICAgICAgICA+Pj4gYy5udW1iZXJfY2xhc3MoMTIzKQorICAgICAgICAnK05vcm1hbCcKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLm51bWJlcl9jbGFzcyhjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgcGx1cyhzZWxmLCBhKToKKyAgICAgICAgIiIiUGx1cyBjb3JyZXNwb25kcyB0byB1bmFyeSBwcmVmaXggcGx1cyBpbiBQeXRob24uCisKKyAgICAgICAgVGhlIG9wZXJhdGlvbiBpcyBldmFsdWF0ZWQgdXNpbmcgdGhlIHNhbWUgcnVsZXMgYXMgYWRkOyB0aGUKKyAgICAgICAgb3BlcmF0aW9uIHBsdXMoYSkgaXMgY2FsY3VsYXRlZCBhcyBhZGQoJzAnLCBhKSB3aGVyZSB0aGUgJzAnCisgICAgICAgIGhhcyB0aGUgc2FtZSBleHBvbmVudCBhcyB0aGUgb3BlcmFuZC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnBsdXMoRGVjaW1hbCgnMS4zJykpCisgICAgICAgIERlY2ltYWwoJzEuMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucGx1cyhEZWNpbWFsKCctMS4zJykpCisgICAgICAgIERlY2ltYWwoJy0xLjMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnBsdXMoLTEpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLl9fcG9zX18oY29udGV4dD1zZWxmKQorCisgICAgZGVmIHBvd2VyKHNlbGYsIGEsIGIsIG1vZHVsbz1Ob25lKToKKyAgICAgICAgIiIiUmFpc2VzIGEgdG8gdGhlIHBvd2VyIG9mIGIsIHRvIG1vZHVsbyBpZiBnaXZlbi4KKworICAgICAgICBXaXRoIHR3byBhcmd1bWVudHMsIGNvbXB1dGUgYSoqYi4gIElmIGEgaXMgbmVnYXRpdmUgdGhlbiBiCisgICAgICAgIG11c3QgYmUgaW50ZWdyYWwuICBUaGUgcmVzdWx0IHdpbGwgYmUgaW5leGFjdCB1bmxlc3MgYiBpcworICAgICAgICBpbnRlZ3JhbCBhbmQgdGhlIHJlc3VsdCBpcyBmaW5pdGUgYW5kIGNhbiBiZSBleHByZXNzZWQgZXhhY3RseQorICAgICAgICBpbiAncHJlY2lzaW9uJyBkaWdpdHMuCisKKyAgICAgICAgV2l0aCB0aHJlZSBhcmd1bWVudHMsIGNvbXB1dGUgKGEqKmIpICUgbW9kdWxvLiAgRm9yIHRoZQorICAgICAgICB0aHJlZSBhcmd1bWVudCBmb3JtLCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9ucyBvbiB0aGUKKyAgICAgICAgYXJndW1lbnRzIGhvbGQ6CisKKyAgICAgICAgIC0gYWxsIHRocmVlIGFyZ3VtZW50cyBtdXN0IGJlIGludGVncmFsCisgICAgICAgICAtIGIgbXVzdCBiZSBub25uZWdhdGl2ZQorICAgICAgICAgLSBhdCBsZWFzdCBvbmUgb2YgYSBvciBiIG11c3QgYmUgbm9uemVybworICAgICAgICAgLSBtb2R1bG8gbXVzdCBiZSBub256ZXJvIGFuZCBoYXZlIGF0IG1vc3QgJ3ByZWNpc2lvbicgZGlnaXRzCisKKyAgICAgICAgVGhlIHJlc3VsdCBvZiBwb3coYSwgYiwgbW9kdWxvKSBpcyBpZGVudGljYWwgdG8gdGhlIHJlc3VsdAorICAgICAgICB0aGF0IHdvdWxkIGJlIG9idGFpbmVkIGJ5IGNvbXB1dGluZyAoYSoqYikgJSBtb2R1bG8gd2l0aAorICAgICAgICB1bmJvdW5kZWQgcHJlY2lzaW9uLCBidXQgaXMgY29tcHV0ZWQgbW9yZSBlZmZpY2llbnRseS4gIEl0IGlzCisgICAgICAgIGFsd2F5cyBleGFjdC4KKworICAgICAgICA+Pj4gYyA9IEV4dGVuZGVkQ29udGV4dC5jb3B5KCkKKyAgICAgICAgPj4+IGMuRW1pbiA9IC05OTkKKyAgICAgICAgPj4+IGMuRW1heCA9IDk5OQorICAgICAgICA+Pj4gYy5wb3dlcihEZWNpbWFsKCcyJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnOCcpCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJy0yJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTgnKQorICAgICAgICA+Pj4gYy5wb3dlcihEZWNpbWFsKCcyJyksIERlY2ltYWwoJy0zJykpCisgICAgICAgIERlY2ltYWwoJzAuMTI1JykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnMS43JyksIERlY2ltYWwoJzgnKSkKKyAgICAgICAgRGVjaW1hbCgnNjkuNzU3NTc0NCcpCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJzEwJyksIERlY2ltYWwoJzAuMzAxMDI5OTk2JykpCisgICAgICAgIERlY2ltYWwoJzIuMDAwMDAwMDAnKQorICAgICAgICA+Pj4gYy5wb3dlcihEZWNpbWFsKCdJbmZpbml0eScpLCBEZWNpbWFsKCctMScpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnSW5maW5pdHknKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnSW5maW5pdHknKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCdJbmZpbml0eScpCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJy1JbmZpbml0eScpLCBEZWNpbWFsKCctMScpKQorICAgICAgICBEZWNpbWFsKCctMCcpCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJy1JbmZpbml0eScpLCBEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gYy5wb3dlcihEZWNpbWFsKCctSW5maW5pdHknKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCctSW5maW5pdHknKQorICAgICAgICA+Pj4gYy5wb3dlcihEZWNpbWFsKCctSW5maW5pdHknKSwgRGVjaW1hbCgnMicpKQorICAgICAgICBEZWNpbWFsKCdJbmZpbml0eScpCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJzAnKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCdOYU4nKQorCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJzMnKSwgRGVjaW1hbCgnNycpLCBEZWNpbWFsKCcxNicpKQorICAgICAgICBEZWNpbWFsKCcxMScpCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJy0zJyksIERlY2ltYWwoJzcnKSwgRGVjaW1hbCgnMTYnKSkKKyAgICAgICAgRGVjaW1hbCgnLTExJykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnLTMnKSwgRGVjaW1hbCgnOCcpLCBEZWNpbWFsKCcxNicpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnMycpLCBEZWNpbWFsKCc3JyksIERlY2ltYWwoJy0xNicpKQorICAgICAgICBEZWNpbWFsKCcxMScpCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJzIzRTEyMzQ1JyksIERlY2ltYWwoJzY3RTE4OScpLCBEZWNpbWFsKCcxMjM0NTY3ODknKSkKKyAgICAgICAgRGVjaW1hbCgnMTE3Mjk4MzAnKQorICAgICAgICA+Pj4gYy5wb3dlcihEZWNpbWFsKCctMCcpLCBEZWNpbWFsKCcxNycpLCBEZWNpbWFsKCcxNzI5JykpCisgICAgICAgIERlY2ltYWwoJy0wJykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnLTIzJyksIERlY2ltYWwoJzAnKSwgRGVjaW1hbCgnNjU1MzcnKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucG93ZXIoNywgNykKKyAgICAgICAgRGVjaW1hbCgnODIzNTQzJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5wb3dlcihEZWNpbWFsKDcpLCA3KQorICAgICAgICBEZWNpbWFsKCc4MjM1NDMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnBvd2VyKDcsIERlY2ltYWwoNyksIDIpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgciA9IGEuX19wb3dfXyhiLCBtb2R1bG8sIGNvbnRleHQ9c2VsZikKKyAgICAgICAgaWYgciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgJXMgdG8gRGVjaW1hbCIgJSBiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiBxdWFudGl6ZShzZWxmLCBhLCBiKToKKyAgICAgICAgIiIiUmV0dXJucyBhIHZhbHVlIGVxdWFsIHRvICdhJyAocm91bmRlZCksIGhhdmluZyB0aGUgZXhwb25lbnQgb2YgJ2InLgorCisgICAgICAgIFRoZSBjb2VmZmljaWVudCBvZiB0aGUgcmVzdWx0IGlzIGRlcml2ZWQgZnJvbSB0aGF0IG9mIHRoZSBsZWZ0LWhhbmQKKyAgICAgICAgb3BlcmFuZC4gIEl0IG1heSBiZSByb3VuZGVkIHVzaW5nIHRoZSBjdXJyZW50IHJvdW5kaW5nIHNldHRpbmcgKGlmIHRoZQorICAgICAgICBleHBvbmVudCBpcyBiZWluZyBpbmNyZWFzZWQpLCBtdWx0aXBsaWVkIGJ5IGEgcG9zaXRpdmUgcG93ZXIgb2YgdGVuIChpZgorICAgICAgICB0aGUgZXhwb25lbnQgaXMgYmVpbmcgZGVjcmVhc2VkKSwgb3IgaXMgdW5jaGFuZ2VkIChpZiB0aGUgZXhwb25lbnQgaXMKKyAgICAgICAgYWxyZWFkeSBlcXVhbCB0byB0aGF0IG9mIHRoZSByaWdodC1oYW5kIG9wZXJhbmQpLgorCisgICAgICAgIFVubGlrZSBvdGhlciBvcGVyYXRpb25zLCBpZiB0aGUgbGVuZ3RoIG9mIHRoZSBjb2VmZmljaWVudCBhZnRlciB0aGUKKyAgICAgICAgcXVhbnRpemUgb3BlcmF0aW9uIHdvdWxkIGJlIGdyZWF0ZXIgdGhhbiBwcmVjaXNpb24gdGhlbiBhbiBJbnZhbGlkCisgICAgICAgIG9wZXJhdGlvbiBjb25kaXRpb24gaXMgcmFpc2VkLiAgVGhpcyBndWFyYW50ZWVzIHRoYXQsIHVubGVzcyB0aGVyZSBpcworICAgICAgICBhbiBlcnJvciBjb25kaXRpb24sIHRoZSBleHBvbmVudCBvZiB0aGUgcmVzdWx0IG9mIGEgcXVhbnRpemUgaXMgYWx3YXlzCisgICAgICAgIGVxdWFsIHRvIHRoYXQgb2YgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZC4KKworICAgICAgICBBbHNvIHVubGlrZSBvdGhlciBvcGVyYXRpb25zLCBxdWFudGl6ZSB3aWxsIG5ldmVyIHJhaXNlIFVuZGVyZmxvdywgZXZlbgorICAgICAgICBpZiB0aGUgcmVzdWx0IGlzIHN1Ym5vcm1hbCBhbmQgaW5leGFjdC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoJzIuMTcnKSwgRGVjaW1hbCgnMC4wMDEnKSkKKyAgICAgICAgRGVjaW1hbCgnMi4xNzAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoJzIuMTcnKSwgRGVjaW1hbCgnMC4wMScpKQorICAgICAgICBEZWNpbWFsKCcyLjE3JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5xdWFudGl6ZShEZWNpbWFsKCcyLjE3JyksIERlY2ltYWwoJzAuMScpKQorICAgICAgICBEZWNpbWFsKCcyLjInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoJzIuMTcnKSwgRGVjaW1hbCgnMWUrMCcpKQorICAgICAgICBEZWNpbWFsKCcyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5xdWFudGl6ZShEZWNpbWFsKCcyLjE3JyksIERlY2ltYWwoJzFlKzEnKSkKKyAgICAgICAgRGVjaW1hbCgnMEUrMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucXVhbnRpemUoRGVjaW1hbCgnLUluZicpLCBEZWNpbWFsKCdJbmZpbml0eScpKQorICAgICAgICBEZWNpbWFsKCctSW5maW5pdHknKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoJzInKSwgRGVjaW1hbCgnSW5maW5pdHknKSkKKyAgICAgICAgRGVjaW1hbCgnTmFOJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5xdWFudGl6ZShEZWNpbWFsKCctMC4xJyksIERlY2ltYWwoJzEnKSkKKyAgICAgICAgRGVjaW1hbCgnLTAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoJy0wJyksIERlY2ltYWwoJzFlKzUnKSkKKyAgICAgICAgRGVjaW1hbCgnLTBFKzUnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoJyszNTIzNjQ1MC42JyksIERlY2ltYWwoJzFlLTInKSkKKyAgICAgICAgRGVjaW1hbCgnTmFOJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5xdWFudGl6ZShEZWNpbWFsKCctMzUyMzY0NTAuNicpLCBEZWNpbWFsKCcxZS0yJykpCisgICAgICAgIERlY2ltYWwoJ05hTicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucXVhbnRpemUoRGVjaW1hbCgnMjE3JyksIERlY2ltYWwoJzFlLTEnKSkKKyAgICAgICAgRGVjaW1hbCgnMjE3LjAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoJzIxNycpLCBEZWNpbWFsKCcxZS0wJykpCisgICAgICAgIERlY2ltYWwoJzIxNycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucXVhbnRpemUoRGVjaW1hbCgnMjE3JyksIERlY2ltYWwoJzFlKzEnKSkKKyAgICAgICAgRGVjaW1hbCgnMi4yRSsyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5xdWFudGl6ZShEZWNpbWFsKCcyMTcnKSwgRGVjaW1hbCgnMWUrMicpKQorICAgICAgICBEZWNpbWFsKCcyRSsyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5xdWFudGl6ZSgxLCAyKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5xdWFudGl6ZShEZWNpbWFsKDEpLCAyKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5xdWFudGl6ZSgxLCBEZWNpbWFsKDIpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLnF1YW50aXplKGIsIGNvbnRleHQ9c2VsZikKKworICAgIGRlZiByYWRpeChzZWxmKToKKyAgICAgICAgIiIiSnVzdCByZXR1cm5zIDEwLCBhcyB0aGlzIGlzIERlY2ltYWwsIDopCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yYWRpeCgpCisgICAgICAgIERlY2ltYWwoJzEwJykKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBEZWNpbWFsKDEwKQorCisgICAgZGVmIHJlbWFpbmRlcihzZWxmLCBhLCBiKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgcmVtYWluZGVyIGZyb20gaW50ZWdlciBkaXZpc2lvbi4KKworICAgICAgICBUaGUgcmVzdWx0IGlzIHRoZSByZXNpZHVlIG9mIHRoZSBkaXZpZGVuZCBhZnRlciB0aGUgb3BlcmF0aW9uIG9mCisgICAgICAgIGNhbGN1bGF0aW5nIGludGVnZXIgZGl2aXNpb24gYXMgZGVzY3JpYmVkIGZvciBkaXZpZGUtaW50ZWdlciwgcm91bmRlZAorICAgICAgICB0byBwcmVjaXNpb24gZGlnaXRzIGlmIG5lY2Vzc2FyeS4gIFRoZSBzaWduIG9mIHRoZSByZXN1bHQsIGlmCisgICAgICAgIG5vbi16ZXJvLCBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIHRoZSBvcmlnaW5hbCBkaXZpZGVuZC4KKworICAgICAgICBUaGlzIG9wZXJhdGlvbiB3aWxsIGZhaWwgdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyBhcyBpbnRlZ2VyIGRpdmlzaW9uCisgICAgICAgICh0aGF0IGlzLCBpZiBpbnRlZ2VyIGRpdmlzaW9uIG9uIHRoZSBzYW1lIHR3byBvcGVyYW5kcyB3b3VsZCBmYWlsLCB0aGUKKyAgICAgICAgcmVtYWluZGVyIGNhbm5vdCBiZSBjYWxjdWxhdGVkKS4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcihEZWNpbWFsKCcyLjEnKSwgRGVjaW1hbCgnMycpKQorICAgICAgICBEZWNpbWFsKCcyLjEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcihEZWNpbWFsKCcxMCcpLCBEZWNpbWFsKCczJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcihEZWNpbWFsKCctMTAnKSwgRGVjaW1hbCgnMycpKQorICAgICAgICBEZWNpbWFsKCctMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyKERlY2ltYWwoJzEwLjInKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcwLjInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcihEZWNpbWFsKCcxMCcpLCBEZWNpbWFsKCcwLjMnKSkKKyAgICAgICAgRGVjaW1hbCgnMC4xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yZW1haW5kZXIoRGVjaW1hbCgnMy42JyksIERlY2ltYWwoJzEuMycpKQorICAgICAgICBEZWNpbWFsKCcxLjAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcigyMiwgNikKKyAgICAgICAgRGVjaW1hbCgnNCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyKERlY2ltYWwoMjIpLCA2KQorICAgICAgICBEZWNpbWFsKCc0JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yZW1haW5kZXIoMjIsIERlY2ltYWwoNikpCisgICAgICAgIERlY2ltYWwoJzQnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgciA9IGEuX19tb2RfXyhiLCBjb250ZXh0PXNlbGYpCisgICAgICAgIGlmIHIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVzIHRvIERlY2ltYWwiICUgYikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiByCisKKyAgICBkZWYgcmVtYWluZGVyX25lYXIoc2VsZiwgYSwgYik6CisgICAgICAgICIiIlJldHVybnMgdG8gYmUgImEgLSBiICogbiIsIHdoZXJlIG4gaXMgdGhlIGludGVnZXIgbmVhcmVzdCB0aGUgZXhhY3QKKyAgICAgICAgdmFsdWUgb2YgInggLyBiIiAoaWYgdHdvIGludGVnZXJzIGFyZSBlcXVhbGx5IG5lYXIgdGhlbiB0aGUgZXZlbiBvbmUKKyAgICAgICAgaXMgY2hvc2VuKS4gIElmIHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gMCB0aGVuIGl0cyBzaWduIHdpbGwgYmUgdGhlCisgICAgICAgIHNpZ24gb2YgYS4KKworICAgICAgICBUaGlzIG9wZXJhdGlvbiB3aWxsIGZhaWwgdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyBhcyBpbnRlZ2VyIGRpdmlzaW9uCisgICAgICAgICh0aGF0IGlzLCBpZiBpbnRlZ2VyIGRpdmlzaW9uIG9uIHRoZSBzYW1lIHR3byBvcGVyYW5kcyB3b3VsZCBmYWlsLCB0aGUKKyAgICAgICAgcmVtYWluZGVyIGNhbm5vdCBiZSBjYWxjdWxhdGVkKS4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcl9uZWFyKERlY2ltYWwoJzIuMScpLCBEZWNpbWFsKCczJykpCisgICAgICAgIERlY2ltYWwoJy0wLjknKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcl9uZWFyKERlY2ltYWwoJzEwJyksIERlY2ltYWwoJzYnKSkKKyAgICAgICAgRGVjaW1hbCgnLTInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcl9uZWFyKERlY2ltYWwoJzEwJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyX25lYXIoRGVjaW1hbCgnLTEwJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcl9uZWFyKERlY2ltYWwoJzEwLjInKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcwLjInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcl9uZWFyKERlY2ltYWwoJzEwJyksIERlY2ltYWwoJzAuMycpKQorICAgICAgICBEZWNpbWFsKCcwLjEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcl9uZWFyKERlY2ltYWwoJzMuNicpLCBEZWNpbWFsKCcxLjMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTAuMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyX25lYXIoMywgMTEpCisgICAgICAgIERlY2ltYWwoJzMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcl9uZWFyKERlY2ltYWwoMyksIDExKQorICAgICAgICBEZWNpbWFsKCczJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yZW1haW5kZXJfbmVhcigzLCBEZWNpbWFsKDExKSkKKyAgICAgICAgRGVjaW1hbCgnMycpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5yZW1haW5kZXJfbmVhcihiLCBjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgcm90YXRlKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJSZXR1cm5zIGEgcm90YXRlZCBjb3B5IG9mIGEsIGIgdGltZXMuCisKKyAgICAgICAgVGhlIGNvZWZmaWNpZW50IG9mIHRoZSByZXN1bHQgaXMgYSByb3RhdGVkIGNvcHkgb2YgdGhlIGRpZ2l0cyBpbgorICAgICAgICB0aGUgY29lZmZpY2llbnQgb2YgdGhlIGZpcnN0IG9wZXJhbmQuICBUaGUgbnVtYmVyIG9mIHBsYWNlcyBvZgorICAgICAgICByb3RhdGlvbiBpcyB0YWtlbiBmcm9tIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgc2Vjb25kIG9wZXJhbmQsCisgICAgICAgIHdpdGggdGhlIHJvdGF0aW9uIGJlaW5nIHRvIHRoZSBsZWZ0IGlmIHRoZSBzZWNvbmQgb3BlcmFuZCBpcworICAgICAgICBwb3NpdGl2ZSBvciB0byB0aGUgcmlnaHQgb3RoZXJ3aXNlLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucm90YXRlKERlY2ltYWwoJzM0JyksIERlY2ltYWwoJzgnKSkKKyAgICAgICAgRGVjaW1hbCgnNDAwMDAwMDAzJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yb3RhdGUoRGVjaW1hbCgnMTInKSwgRGVjaW1hbCgnOScpKQorICAgICAgICBEZWNpbWFsKCcxMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucm90YXRlKERlY2ltYWwoJzEyMzQ1Njc4OScpLCBEZWNpbWFsKCctMicpKQorICAgICAgICBEZWNpbWFsKCc4OTEyMzQ1NjcnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJvdGF0ZShEZWNpbWFsKCcxMjM0NTY3ODknKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcxMjM0NTY3ODknKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJvdGF0ZShEZWNpbWFsKCcxMjM0NTY3ODknKSwgRGVjaW1hbCgnKzInKSkKKyAgICAgICAgRGVjaW1hbCgnMzQ1Njc4OTEyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yb3RhdGUoMTMzMzMzMywgMSkKKyAgICAgICAgRGVjaW1hbCgnMTMzMzMzMzAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJvdGF0ZShEZWNpbWFsKDEzMzMzMzMpLCAxKQorICAgICAgICBEZWNpbWFsKCcxMzMzMzMzMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucm90YXRlKDEzMzMzMzMsIERlY2ltYWwoMSkpCisgICAgICAgIERlY2ltYWwoJzEzMzMzMzMwJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLnJvdGF0ZShiLCBjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgc2FtZV9xdWFudHVtKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgdGhlIHR3byBvcGVyYW5kcyBoYXZlIHRoZSBzYW1lIGV4cG9uZW50LgorCisgICAgICAgIFRoZSByZXN1bHQgaXMgbmV2ZXIgYWZmZWN0ZWQgYnkgZWl0aGVyIHRoZSBzaWduIG9yIHRoZSBjb2VmZmljaWVudCBvZgorICAgICAgICBlaXRoZXIgb3BlcmFuZC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNhbWVfcXVhbnR1bShEZWNpbWFsKCcyLjE3JyksIERlY2ltYWwoJzAuMDAxJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc2FtZV9xdWFudHVtKERlY2ltYWwoJzIuMTcnKSwgRGVjaW1hbCgnMC4wMScpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc2FtZV9xdWFudHVtKERlY2ltYWwoJzIuMTcnKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNhbWVfcXVhbnR1bShEZWNpbWFsKCdJbmYnKSwgRGVjaW1hbCgnLUluZicpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc2FtZV9xdWFudHVtKDEwMDAwLCAtMSkKKyAgICAgICAgVHJ1ZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNhbWVfcXVhbnR1bShEZWNpbWFsKDEwMDAwKSwgLTEpCisgICAgICAgIFRydWUKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zYW1lX3F1YW50dW0oMTAwMDAsIERlY2ltYWwoLTEpKQorICAgICAgICBUcnVlCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5zYW1lX3F1YW50dW0oYikKKworICAgIGRlZiBzY2FsZWIgKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBmaXJzdCBvcGVyYW5kIGFmdGVyIGFkZGluZyB0aGUgc2Vjb25kIHZhbHVlIGl0cyBleHAuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zY2FsZWIoRGVjaW1hbCgnNy41MCcpLCBEZWNpbWFsKCctMicpKQorICAgICAgICBEZWNpbWFsKCcwLjA3NTAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNjYWxlYihEZWNpbWFsKCc3LjUwJyksIERlY2ltYWwoJzAnKSkKKyAgICAgICAgRGVjaW1hbCgnNy41MCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc2NhbGViKERlY2ltYWwoJzcuNTAnKSwgRGVjaW1hbCgnMycpKQorICAgICAgICBEZWNpbWFsKCc3LjUwRSszJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zY2FsZWIoMSwgNCkKKyAgICAgICAgRGVjaW1hbCgnMUUrNCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc2NhbGViKERlY2ltYWwoMSksIDQpCisgICAgICAgIERlY2ltYWwoJzFFKzQnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNjYWxlYigxLCBEZWNpbWFsKDQpKQorICAgICAgICBEZWNpbWFsKCcxRSs0JykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLnNjYWxlYihiLCBjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgc2hpZnQoc2VsZiwgYSwgYik6CisgICAgICAgICIiIlJldHVybnMgYSBzaGlmdGVkIGNvcHkgb2YgYSwgYiB0aW1lcy4KKworICAgICAgICBUaGUgY29lZmZpY2llbnQgb2YgdGhlIHJlc3VsdCBpcyBhIHNoaWZ0ZWQgY29weSBvZiB0aGUgZGlnaXRzCisgICAgICAgIGluIHRoZSBjb2VmZmljaWVudCBvZiB0aGUgZmlyc3Qgb3BlcmFuZC4gIFRoZSBudW1iZXIgb2YgcGxhY2VzCisgICAgICAgIHRvIHNoaWZ0IGlzIHRha2VuIGZyb20gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCwKKyAgICAgICAgd2l0aCB0aGUgc2hpZnQgYmVpbmcgdG8gdGhlIGxlZnQgaWYgdGhlIHNlY29uZCBvcGVyYW5kIGlzCisgICAgICAgIHBvc2l0aXZlIG9yIHRvIHRoZSByaWdodCBvdGhlcndpc2UuICBEaWdpdHMgc2hpZnRlZCBpbnRvIHRoZQorICAgICAgICBjb2VmZmljaWVudCBhcmUgemVyb3MuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zaGlmdChEZWNpbWFsKCczNCcpLCBEZWNpbWFsKCc4JykpCisgICAgICAgIERlY2ltYWwoJzQwMDAwMDAwMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc2hpZnQoRGVjaW1hbCgnMTInKSwgRGVjaW1hbCgnOScpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zaGlmdChEZWNpbWFsKCcxMjM0NTY3ODknKSwgRGVjaW1hbCgnLTInKSkKKyAgICAgICAgRGVjaW1hbCgnMTIzNDU2NycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc2hpZnQoRGVjaW1hbCgnMTIzNDU2Nzg5JyksIERlY2ltYWwoJzAnKSkKKyAgICAgICAgRGVjaW1hbCgnMTIzNDU2Nzg5JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zaGlmdChEZWNpbWFsKCcxMjM0NTY3ODknKSwgRGVjaW1hbCgnKzInKSkKKyAgICAgICAgRGVjaW1hbCgnMzQ1Njc4OTAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zaGlmdCg4ODg4ODg4OCwgMikKKyAgICAgICAgRGVjaW1hbCgnODg4ODg4ODAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zaGlmdChEZWNpbWFsKDg4ODg4ODg4KSwgMikKKyAgICAgICAgRGVjaW1hbCgnODg4ODg4ODAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zaGlmdCg4ODg4ODg4OCwgRGVjaW1hbCgyKSkKKyAgICAgICAgRGVjaW1hbCgnODg4ODg4ODAwJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLnNoaWZ0KGIsIGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBzcXJ0KHNlbGYsIGEpOgorICAgICAgICAiIiJTcXVhcmUgcm9vdCBvZiBhIG5vbi1uZWdhdGl2ZSBudW1iZXIgdG8gY29udGV4dCBwcmVjaXNpb24uCisKKyAgICAgICAgSWYgdGhlIHJlc3VsdCBtdXN0IGJlIGluZXhhY3QsIGl0IGlzIHJvdW5kZWQgdXNpbmcgdGhlIHJvdW5kLWhhbGYtZXZlbgorICAgICAgICBhbGdvcml0aG0uCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zcXJ0KERlY2ltYWwoJzAnKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3FydChEZWNpbWFsKCctMCcpKQorICAgICAgICBEZWNpbWFsKCctMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3FydChEZWNpbWFsKCcwLjM5JykpCisgICAgICAgIERlY2ltYWwoJzAuNjI0NDk5ODAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zcXJ0KERlY2ltYWwoJzEwMCcpKQorICAgICAgICBEZWNpbWFsKCcxMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3FydChEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNxcnQoRGVjaW1hbCgnMS4wJykpCisgICAgICAgIERlY2ltYWwoJzEuMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3FydChEZWNpbWFsKCcxLjAwJykpCisgICAgICAgIERlY2ltYWwoJzEuMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3FydChEZWNpbWFsKCc3JykpCisgICAgICAgIERlY2ltYWwoJzIuNjQ1NzUxMzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNxcnQoRGVjaW1hbCgnMTAnKSkKKyAgICAgICAgRGVjaW1hbCgnMy4xNjIyNzc2NicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3FydCgyKQorICAgICAgICBEZWNpbWFsKCcxLjQxNDIxMzU2JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5wcmVjCisgICAgICAgIDkKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLnNxcnQoY29udGV4dD1zZWxmKQorCisgICAgZGVmIHN1YnRyYWN0KHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIG9wZXJhbmRzLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3VidHJhY3QoRGVjaW1hbCgnMS4zJyksIERlY2ltYWwoJzEuMDcnKSkKKyAgICAgICAgRGVjaW1hbCgnMC4yMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3VidHJhY3QoRGVjaW1hbCgnMS4zJyksIERlY2ltYWwoJzEuMzAnKSkKKyAgICAgICAgRGVjaW1hbCgnMC4wMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3VidHJhY3QoRGVjaW1hbCgnMS4zJyksIERlY2ltYWwoJzIuMDcnKSkKKyAgICAgICAgRGVjaW1hbCgnLTAuNzcnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnN1YnRyYWN0KDgsIDUpCisgICAgICAgIERlY2ltYWwoJzMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnN1YnRyYWN0KERlY2ltYWwoOCksIDUpCisgICAgICAgIERlY2ltYWwoJzMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnN1YnRyYWN0KDgsIERlY2ltYWwoNSkpCisgICAgICAgIERlY2ltYWwoJzMnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgciA9IGEuX19zdWJfXyhiLCBjb250ZXh0PXNlbGYpCisgICAgICAgIGlmIHIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVzIHRvIERlY2ltYWwiICUgYikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiByCisKKyAgICBkZWYgdG9fZW5nX3N0cmluZyhzZWxmLCBhKToKKyAgICAgICAgIiIiQ29udmVydHMgYSBudW1iZXIgdG8gYSBzdHJpbmcsIHVzaW5nIHNjaWVudGlmaWMgbm90YXRpb24uCisKKyAgICAgICAgVGhlIG9wZXJhdGlvbiBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIGNvbnRleHQuCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS50b19lbmdfc3RyaW5nKGNvbnRleHQ9c2VsZikKKworICAgIGRlZiB0b19zY2lfc3RyaW5nKHNlbGYsIGEpOgorICAgICAgICAiIiJDb252ZXJ0cyBhIG51bWJlciB0byBhIHN0cmluZywgdXNpbmcgc2NpZW50aWZpYyBub3RhdGlvbi4KKworICAgICAgICBUaGUgb3BlcmF0aW9uIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgY29udGV4dC4KKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLl9fc3RyX18oY29udGV4dD1zZWxmKQorCisgICAgZGVmIHRvX2ludGVncmFsX2V4YWN0KHNlbGYsIGEpOgorICAgICAgICAiIiJSb3VuZHMgdG8gYW4gaW50ZWdlci4KKworICAgICAgICBXaGVuIHRoZSBvcGVyYW5kIGhhcyBhIG5lZ2F0aXZlIGV4cG9uZW50LCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lCisgICAgICAgIGFzIHVzaW5nIHRoZSBxdWFudGl6ZSgpIG9wZXJhdGlvbiB1c2luZyB0aGUgZ2l2ZW4gb3BlcmFuZCBhcyB0aGUKKyAgICAgICAgbGVmdC1oYW5kLW9wZXJhbmQsIDFFKzAgYXMgdGhlIHJpZ2h0LWhhbmQtb3BlcmFuZCwgYW5kIHRoZSBwcmVjaXNpb24KKyAgICAgICAgb2YgdGhlIG9wZXJhbmQgYXMgdGhlIHByZWNpc2lvbiBzZXR0aW5nOyBJbmV4YWN0IGFuZCBSb3VuZGVkIGZsYWdzCisgICAgICAgIGFyZSBhbGxvd2VkIGluIHRoaXMgb3BlcmF0aW9uLiAgVGhlIHJvdW5kaW5nIG1vZGUgaXMgdGFrZW4gZnJvbSB0aGUKKyAgICAgICAgY29udGV4dC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnRvX2ludGVncmFsX2V4YWN0KERlY2ltYWwoJzIuMScpKQorICAgICAgICBEZWNpbWFsKCcyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC50b19pbnRlZ3JhbF9leGFjdChEZWNpbWFsKCcxMDAnKSkKKyAgICAgICAgRGVjaW1hbCgnMTAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC50b19pbnRlZ3JhbF9leGFjdChEZWNpbWFsKCcxMDAuMCcpKQorICAgICAgICBEZWNpbWFsKCcxMDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnRvX2ludGVncmFsX2V4YWN0KERlY2ltYWwoJzEwMS41JykpCisgICAgICAgIERlY2ltYWwoJzEwMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQudG9faW50ZWdyYWxfZXhhY3QoRGVjaW1hbCgnLTEwMS41JykpCisgICAgICAgIERlY2ltYWwoJy0xMDInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnRvX2ludGVncmFsX2V4YWN0KERlY2ltYWwoJzEwRSs1JykpCisgICAgICAgIERlY2ltYWwoJzEuMEUrNicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQudG9faW50ZWdyYWxfZXhhY3QoRGVjaW1hbCgnNy44OUUrNzcnKSkKKyAgICAgICAgRGVjaW1hbCgnNy44OUUrNzcnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnRvX2ludGVncmFsX2V4YWN0KERlY2ltYWwoJy1JbmYnKSkKKyAgICAgICAgRGVjaW1hbCgnLUluZmluaXR5JykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLnRvX2ludGVncmFsX2V4YWN0KGNvbnRleHQ9c2VsZikKKworICAgIGRlZiB0b19pbnRlZ3JhbF92YWx1ZShzZWxmLCBhKToKKyAgICAgICAgIiIiUm91bmRzIHRvIGFuIGludGVnZXIuCisKKyAgICAgICAgV2hlbiB0aGUgb3BlcmFuZCBoYXMgYSBuZWdhdGl2ZSBleHBvbmVudCwgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZQorICAgICAgICBhcyB1c2luZyB0aGUgcXVhbnRpemUoKSBvcGVyYXRpb24gdXNpbmcgdGhlIGdpdmVuIG9wZXJhbmQgYXMgdGhlCisgICAgICAgIGxlZnQtaGFuZC1vcGVyYW5kLCAxRSswIGFzIHRoZSByaWdodC1oYW5kLW9wZXJhbmQsIGFuZCB0aGUgcHJlY2lzaW9uCisgICAgICAgIG9mIHRoZSBvcGVyYW5kIGFzIHRoZSBwcmVjaXNpb24gc2V0dGluZywgZXhjZXB0IHRoYXQgbm8gZmxhZ3Mgd2lsbAorICAgICAgICBiZSBzZXQuICBUaGUgcm91bmRpbmcgbW9kZSBpcyB0YWtlbiBmcm9tIHRoZSBjb250ZXh0LgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQudG9faW50ZWdyYWxfdmFsdWUoRGVjaW1hbCgnMi4xJykpCisgICAgICAgIERlY2ltYWwoJzInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnRvX2ludGVncmFsX3ZhbHVlKERlY2ltYWwoJzEwMCcpKQorICAgICAgICBEZWNpbWFsKCcxMDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnRvX2ludGVncmFsX3ZhbHVlKERlY2ltYWwoJzEwMC4wJykpCisgICAgICAgIERlY2ltYWwoJzEwMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQudG9faW50ZWdyYWxfdmFsdWUoRGVjaW1hbCgnMTAxLjUnKSkKKyAgICAgICAgRGVjaW1hbCgnMTAyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC50b19pbnRlZ3JhbF92YWx1ZShEZWNpbWFsKCctMTAxLjUnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEwMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQudG9faW50ZWdyYWxfdmFsdWUoRGVjaW1hbCgnMTBFKzUnKSkKKyAgICAgICAgRGVjaW1hbCgnMS4wRSs2JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC50b19pbnRlZ3JhbF92YWx1ZShEZWNpbWFsKCc3Ljg5RSs3NycpKQorICAgICAgICBEZWNpbWFsKCc3Ljg5RSs3NycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQudG9faW50ZWdyYWxfdmFsdWUoRGVjaW1hbCgnLUluZicpKQorICAgICAgICBEZWNpbWFsKCctSW5maW5pdHknKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEudG9faW50ZWdyYWxfdmFsdWUoY29udGV4dD1zZWxmKQorCisgICAgIyB0aGUgbWV0aG9kIG5hbWUgY2hhbmdlZCwgYnV0IHdlIHByb3ZpZGUgYWxzbyB0aGUgb2xkIG9uZSwgZm9yIGNvbXBhdGliaWxpdHkKKyAgICB0b19pbnRlZ3JhbCA9IHRvX2ludGVncmFsX3ZhbHVlCisKK2NsYXNzIF9Xb3JrUmVwKG9iamVjdCk6CisgICAgX19zbG90c19fID0gKCdzaWduJywnaW50JywnZXhwJykKKyAgICAjIHNpZ246IDAgb3IgMQorICAgICMgaW50OiAgaW50IG9yIGxvbmcKKyAgICAjIGV4cDogIE5vbmUsIGludCwgb3Igc3RyaW5nCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9Tm9uZSk6CisgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnNpZ24gPSBOb25lCisgICAgICAgICAgICBzZWxmLmludCA9IDAKKyAgICAgICAgICAgIHNlbGYuZXhwID0gTm9uZQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIERlY2ltYWwpOgorICAgICAgICAgICAgc2VsZi5zaWduID0gdmFsdWUuX3NpZ24KKyAgICAgICAgICAgIHNlbGYuaW50ID0gaW50KHZhbHVlLl9pbnQpCisgICAgICAgICAgICBzZWxmLmV4cCA9IHZhbHVlLl9leHAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgYXNzZXJ0IGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKQorICAgICAgICAgICAgc2VsZi5zaWduID0gdmFsdWVbMF0KKyAgICAgICAgICAgIHNlbGYuaW50ID0gdmFsdWVbMV0KKyAgICAgICAgICAgIHNlbGYuZXhwID0gdmFsdWVbMl0KKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIoJXIsICVyLCAlcikiICUgKHNlbGYuc2lnbiwgc2VsZi5pbnQsIHNlbGYuZXhwKQorCisgICAgX19zdHJfXyA9IF9fcmVwcl9fCisKKworCitkZWYgX25vcm1hbGl6ZShvcDEsIG9wMiwgcHJlYyA9IDApOgorICAgICIiIk5vcm1hbGl6ZXMgb3AxLCBvcDIgdG8gaGF2ZSB0aGUgc2FtZSBleHAgYW5kIGxlbmd0aCBvZiBjb2VmZmljaWVudC4KKworICAgIERvbmUgZHVyaW5nIGFkZGl0aW9uLgorICAgICIiIgorICAgIGlmIG9wMS5leHAgPCBvcDIuZXhwOgorICAgICAgICB0bXAgPSBvcDIKKyAgICAgICAgb3RoZXIgPSBvcDEKKyAgICBlbHNlOgorICAgICAgICB0bXAgPSBvcDEKKyAgICAgICAgb3RoZXIgPSBvcDIKKworICAgICMgTGV0IGV4cCA9IG1pbih0bXAuZXhwIC0gMSwgdG1wLmFkanVzdGVkKCkgLSBwcmVjaXNpb24gLSAxKS4KKyAgICAjIFRoZW4gYWRkaW5nIDEwKipleHAgdG8gdG1wIGhhcyB0aGUgc2FtZSBlZmZlY3QgKGFmdGVyIHJvdW5kaW5nKQorICAgICMgYXMgYWRkaW5nIGFueSBwb3NpdGl2ZSBxdWFudGl0eSBzbWFsbGVyIHRoYW4gMTAqKmV4cDsgc2ltaWxhcmx5CisgICAgIyBmb3Igc3VidHJhY3Rpb24uICBTbyBpZiBvdGhlciBpcyBzbWFsbGVyIHRoYW4gMTAqKmV4cCB3ZSByZXBsYWNlCisgICAgIyBpdCB3aXRoIDEwKipleHAuICBUaGlzIGF2b2lkcyB0bXAuZXhwIC0gb3RoZXIuZXhwIGdldHRpbmcgdG9vIGxhcmdlLgorICAgIHRtcF9sZW4gPSBsZW4oc3RyKHRtcC5pbnQpKQorICAgIG90aGVyX2xlbiA9IGxlbihzdHIob3RoZXIuaW50KSkKKyAgICBleHAgPSB0bXAuZXhwICsgbWluKC0xLCB0bXBfbGVuIC0gcHJlYyAtIDIpCisgICAgaWYgb3RoZXJfbGVuICsgb3RoZXIuZXhwIC0gMSA8IGV4cDoKKyAgICAgICAgb3RoZXIuaW50ID0gMQorICAgICAgICBvdGhlci5leHAgPSBleHAKKworICAgIHRtcC5pbnQgKj0gMTAgKiogKHRtcC5leHAgLSBvdGhlci5leHApCisgICAgdG1wLmV4cCA9IG90aGVyLmV4cAorICAgIHJldHVybiBvcDEsIG9wMgorCisjIyMjIyBJbnRlZ2VyIGFyaXRobWV0aWMgZnVuY3Rpb25zIHVzZWQgYnkgbG4sIGxvZzEwLCBleHAgYW5kIF9fcG93X18gIyMjIyMKKworIyBUaGlzIGZ1bmN0aW9uIGZyb20gVGltIFBldGVycyB3YXMgdGFrZW4gZnJvbSBoZXJlOgorIyBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tbGlzdC8xOTk5LUp1bHkvMDA3NzU4Lmh0bWwKKyMgVGhlIGNvcnJlY3Rpb24gYmVpbmcgaW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgZm9yIHNwZWVkLCBhbmQKKyMgdGhlIHdob2xlIGZ1bmN0aW9uIGlzIG5vdCByZXNvbHZlZCB3aXRoIG1hdGgubG9nIGJlY2F1c2Ugb2YgYXZvaWRpbmcKKyMgdGhlIHVzZSBvZiBmbG9hdHMuCitkZWYgX25iaXRzKG4sIGNvcnJlY3Rpb24gPSB7CisgICAgICAgICcwJzogNCwgJzEnOiAzLCAnMic6IDIsICczJzogMiwKKyAgICAgICAgJzQnOiAxLCAnNSc6IDEsICc2JzogMSwgJzcnOiAxLAorICAgICAgICAnOCc6IDAsICc5JzogMCwgJ2EnOiAwLCAnYic6IDAsCisgICAgICAgICdjJzogMCwgJ2QnOiAwLCAnZSc6IDAsICdmJzogMH0pOgorICAgICIiIk51bWJlciBvZiBiaXRzIGluIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcG9zaXRpdmUgaW50ZWdlciBuLAorICAgIG9yIDAgaWYgbiA9PSAwLgorICAgICIiIgorICAgIGlmIG4gPCAwOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUaGUgYXJndW1lbnQgdG8gX25iaXRzIHNob3VsZCBiZSBub25uZWdhdGl2ZS4iKQorICAgIGhleF9uID0gIiV4IiAlIG4KKyAgICByZXR1cm4gNCpsZW4oaGV4X24pIC0gY29ycmVjdGlvbltoZXhfblswXV0KKworZGVmIF9kZWNpbWFsX2xzaGlmdF9leGFjdChuLCBlKToKKyAgICAiIiIgR2l2ZW4gaW50ZWdlcnMgbiBhbmQgZSwgcmV0dXJuIG4gKiAxMCoqZSBpZiBpdCdzIGFuIGludGVnZXIsIGVsc2UgTm9uZS4KKworICAgIFRoZSBjb21wdXRhdGlvbiBpcyBkZXNpZ25lZCB0byBhdm9pZCBjb21wdXRpbmcgbGFyZ2UgcG93ZXJzIG9mIDEwCisgICAgdW5uZWNlc3NhcmlseS4KKworICAgID4+PiBfZGVjaW1hbF9sc2hpZnRfZXhhY3QoMywgNCkKKyAgICAzMDAwMAorICAgID4+PiBfZGVjaW1hbF9sc2hpZnRfZXhhY3QoMzAwLCAtOTk5OTk5OTk5KSAgIyByZXR1cm5zIE5vbmUKKworICAgICIiIgorICAgIGlmIG4gPT0gMDoKKyAgICAgICAgcmV0dXJuIDAKKyAgICBlbGlmIGUgPj0gMDoKKyAgICAgICAgcmV0dXJuIG4gKiAxMCoqZQorICAgIGVsc2U6CisgICAgICAgICMgdmFsX24gPSBsYXJnZXN0IHBvd2VyIG9mIDEwIGRpdmlkaW5nIG4uCisgICAgICAgIHN0cl9uID0gc3RyKGFicyhuKSkKKyAgICAgICAgdmFsX24gPSBsZW4oc3RyX24pIC0gbGVuKHN0cl9uLnJzdHJpcCgnMCcpKQorICAgICAgICByZXR1cm4gTm9uZSBpZiB2YWxfbiA8IC1lIGVsc2UgbiAvLyAxMCoqLWUKKworZGVmIF9zcXJ0X25lYXJlc3QobiwgYSk6CisgICAgIiIiQ2xvc2VzdCBpbnRlZ2VyIHRvIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgcG9zaXRpdmUgaW50ZWdlciBuLiAgYSBpcworICAgIGFuIGluaXRpYWwgYXBwcm94aW1hdGlvbiB0byB0aGUgc3F1YXJlIHJvb3QuICBBbnkgcG9zaXRpdmUgaW50ZWdlcgorICAgIHdpbGwgZG8gZm9yIGEsIGJ1dCB0aGUgY2xvc2VyIGEgaXMgdG8gdGhlIHNxdWFyZSByb290IG9mIG4gdGhlCisgICAgZmFzdGVyIGNvbnZlcmdlbmNlIHdpbGwgYmUuCisKKyAgICAiIiIKKyAgICBpZiBuIDw9IDAgb3IgYSA8PSAwOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJCb3RoIGFyZ3VtZW50cyB0byBfc3FydF9uZWFyZXN0IHNob3VsZCBiZSBwb3NpdGl2ZS4iKQorCisgICAgYj0wCisgICAgd2hpbGUgYSAhPSBiOgorICAgICAgICBiLCBhID0gYSwgYS0tbi8vYT4+MQorICAgIHJldHVybiBhCisKK2RlZiBfcnNoaWZ0X25lYXJlc3QoeCwgc2hpZnQpOgorICAgICIiIkdpdmVuIGFuIGludGVnZXIgeCBhbmQgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIHNoaWZ0LCByZXR1cm4gY2xvc2VzdAorICAgIGludGVnZXIgdG8geCAvIDIqKnNoaWZ0OyB1c2Ugcm91bmQtdG8tZXZlbiBpbiBjYXNlIG9mIGEgdGllLgorCisgICAgIiIiCisgICAgYiwgcSA9IDFMIDw8IHNoaWZ0LCB4ID4+IHNoaWZ0CisgICAgcmV0dXJuIHEgKyAoMiooeCAmIChiLTEpKSArIChxJjEpID4gYikKKworZGVmIF9kaXZfbmVhcmVzdChhLCBiKToKKyAgICAiIiJDbG9zZXN0IGludGVnZXIgdG8gYS9iLCBhIGFuZCBiIHBvc2l0aXZlIGludGVnZXJzOyByb3VuZHMgdG8gZXZlbgorICAgIGluIHRoZSBjYXNlIG9mIGEgdGllLgorCisgICAgIiIiCisgICAgcSwgciA9IGRpdm1vZChhLCBiKQorICAgIHJldHVybiBxICsgKDIqciArIChxJjEpID4gYikKKworZGVmIF9pbG9nKHgsIE0sIEwgPSA4KToKKyAgICAiIiJJbnRlZ2VyIGFwcHJveGltYXRpb24gdG8gTSpsb2coeC9NKSwgd2l0aCBhYnNvbHV0ZSBlcnJvciBib3VuZGFibGUKKyAgICBpbiB0ZXJtcyBvbmx5IG9mIHgvTS4KKworICAgIEdpdmVuIHBvc2l0aXZlIGludGVnZXJzIHggYW5kIE0sIHJldHVybiBhbiBpbnRlZ2VyIGFwcHJveGltYXRpb24gdG8KKyAgICBNICogbG9nKHgvTSkuICBGb3IgTCA9IDggYW5kIDAuMSA8PSB4L00gPD0gMTAgdGhlIGRpZmZlcmVuY2UKKyAgICBiZXR3ZWVuIHRoZSBhcHByb3hpbWF0aW9uIGFuZCB0aGUgZXhhY3QgcmVzdWx0IGlzIGF0IG1vc3QgMjIuICBGb3IKKyAgICBMID0gOCBhbmQgMS4wIDw9IHgvTSA8PSAxMC4wIHRoZSBkaWZmZXJlbmNlIGlzIGF0IG1vc3QgMTUuICBJbgorICAgIGJvdGggY2FzZXMgdGhlc2UgYXJlIHVwcGVyIGJvdW5kcyBvbiB0aGUgZXJyb3I7IGl0IHdpbGwgdXN1YWxseSBiZQorICAgIG11Y2ggc21hbGxlci4iIiIKKworICAgICMgVGhlIGJhc2ljIGFsZ29yaXRobSBpcyB0aGUgZm9sbG93aW5nOiBsZXQgbG9nMXAgYmUgdGhlIGZ1bmN0aW9uCisgICAgIyBsb2cxcCh4KSA9IGxvZygxK3gpLiAgVGhlbiBsb2coeC9NKSA9IGxvZzFwKCh4LU0pL00pLiAgV2UgdXNlCisgICAgIyB0aGUgcmVkdWN0aW9uCisgICAgIworICAgICMgICAgbG9nMXAoeSkgPSAyKmxvZzFwKHkvKDErc3FydCgxK3kpKSkKKyAgICAjCisgICAgIyByZXBlYXRlZGx5IHVudGlsIHRoZSBhcmd1bWVudCB0byBsb2cxcCBpcyBzbWFsbCAoPCAyKiotTCBpbgorICAgICMgYWJzb2x1dGUgdmFsdWUpLiAgRm9yIHNtYWxsIHkgd2UgY2FuIHVzZSB0aGUgVGF5bG9yIHNlcmllcworICAgICMgZXhwYW5zaW9uCisgICAgIworICAgICMgICAgbG9nMXAoeSkgfiB5IC0geSoqMi8yICsgeSoqMy8zIC0gLi4uIC0gKC15KSoqVC9UCisgICAgIworICAgICMgdHJ1bmNhdGluZyBhdCBUIHN1Y2ggdGhhdCB5KipUIGlzIHNtYWxsIGVub3VnaC4gIFRoZSB3aG9sZQorICAgICMgY29tcHV0YXRpb24gaXMgY2FycmllZCBvdXQgaW4gYSBmb3JtIG9mIGZpeGVkLXBvaW50IGFyaXRobWV0aWMsCisgICAgIyB3aXRoIGEgcmVhbCBudW1iZXIgeiBiZWluZyByZXByZXNlbnRlZCBieSBhbiBpbnRlZ2VyCisgICAgIyBhcHByb3hpbWF0aW9uIHRvIHoqTS4gIFRvIGF2b2lkIGxvc3Mgb2YgcHJlY2lzaW9uLCB0aGUgeSBiZWxvdworICAgICMgaXMgYWN0dWFsbHkgYW4gaW50ZWdlciBhcHByb3hpbWF0aW9uIHRvIDIqKlIqeSpNLCB3aGVyZSBSIGlzIHRoZQorICAgICMgbnVtYmVyIG9mIHJlZHVjdGlvbnMgcGVyZm9ybWVkIHNvIGZhci4KKworICAgIHkgPSB4LU0KKyAgICAjIGFyZ3VtZW50IHJlZHVjdGlvbjsgUiA9IG51bWJlciBvZiByZWR1Y3Rpb25zIHBlcmZvcm1lZAorICAgIFIgPSAwCisgICAgd2hpbGUgKFIgPD0gTCBhbmQgbG9uZyhhYnMoeSkpIDw8IEwtUiA+PSBNIG9yCisgICAgICAgICAgIFIgPiBMIGFuZCBhYnMoeSkgPj4gUi1MID49IE0pOgorICAgICAgICB5ID0gX2Rpdl9uZWFyZXN0KGxvbmcoTSp5KSA8PCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIE0gKyBfc3FydF9uZWFyZXN0KE0qKE0rX3JzaGlmdF9uZWFyZXN0KHksIFIpKSwgTSkpCisgICAgICAgIFIgKz0gMQorCisgICAgIyBUYXlsb3Igc2VyaWVzIHdpdGggVCB0ZXJtcworICAgIFQgPSAtaW50KC0xMCpsZW4oc3RyKE0pKS8vKDMqTCkpCisgICAgeXNoaWZ0ID0gX3JzaGlmdF9uZWFyZXN0KHksIFIpCisgICAgdyA9IF9kaXZfbmVhcmVzdChNLCBUKQorICAgIGZvciBrIGluIHhyYW5nZShULTEsIDAsIC0xKToKKyAgICAgICAgdyA9IF9kaXZfbmVhcmVzdChNLCBrKSAtIF9kaXZfbmVhcmVzdCh5c2hpZnQqdywgTSkKKworICAgIHJldHVybiBfZGl2X25lYXJlc3Qodyp5LCBNKQorCitkZWYgX2Rsb2cxMChjLCBlLCBwKToKKyAgICAiIiJHaXZlbiBpbnRlZ2VycyBjLCBlIGFuZCBwIHdpdGggYyA+IDAsIHAgPj0gMCwgY29tcHV0ZSBhbiBpbnRlZ2VyCisgICAgYXBwcm94aW1hdGlvbiB0byAxMCoqcCAqIGxvZzEwKGMqMTAqKmUpLCB3aXRoIGFuIGFic29sdXRlIGVycm9yIG9mCisgICAgYXQgbW9zdCAxLiAgQXNzdW1lcyB0aGF0IGMqMTAqKmUgaXMgbm90IGV4YWN0bHkgMS4iIiIKKworICAgICMgaW5jcmVhc2UgcHJlY2lzaW9uIGJ5IDI7IGNvbXBlbnNhdGUgZm9yIHRoaXMgYnkgZGl2aWRpbmcKKyAgICAjIGZpbmFsIHJlc3VsdCBieSAxMDAKKyAgICBwICs9IDIKKworICAgICMgd3JpdGUgYyoxMCoqZSBhcyBkKjEwKipmIHdpdGggZWl0aGVyOgorICAgICMgICBmID49IDAgYW5kIDEgPD0gZCA8PSAxMCwgb3IKKyAgICAjICAgZiA8PSAwIGFuZCAwLjEgPD0gZCA8PSAxLgorICAgICMgVGh1cyBmb3IgYyoxMCoqZSBjbG9zZSB0byAxLCBmID0gMAorICAgIGwgPSBsZW4oc3RyKGMpKQorICAgIGYgPSBlK2wgLSAoZStsID49IDEpCisKKyAgICBpZiBwID4gMDoKKyAgICAgICAgTSA9IDEwKipwCisgICAgICAgIGsgPSBlK3AtZgorICAgICAgICBpZiBrID49IDA6CisgICAgICAgICAgICBjICo9IDEwKiprCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjID0gX2Rpdl9uZWFyZXN0KGMsIDEwKiotaykKKworICAgICAgICBsb2dfZCA9IF9pbG9nKGMsIE0pICMgZXJyb3IgPCA1ICsgMjIgPSAyNworICAgICAgICBsb2dfMTAgPSBfbG9nMTBfZGlnaXRzKHApICMgZXJyb3IgPCAxCisgICAgICAgIGxvZ19kID0gX2Rpdl9uZWFyZXN0KGxvZ19kKk0sIGxvZ18xMCkKKyAgICAgICAgbG9nX3RlbnBvd2VyID0gZipNICMgZXhhY3QKKyAgICBlbHNlOgorICAgICAgICBsb2dfZCA9IDAgICMgZXJyb3IgPCAyLjMxCisgICAgICAgIGxvZ190ZW5wb3dlciA9IF9kaXZfbmVhcmVzdChmLCAxMCoqLXApICMgZXJyb3IgPCAwLjUKKworICAgIHJldHVybiBfZGl2X25lYXJlc3QobG9nX3RlbnBvd2VyK2xvZ19kLCAxMDApCisKK2RlZiBfZGxvZyhjLCBlLCBwKToKKyAgICAiIiJHaXZlbiBpbnRlZ2VycyBjLCBlIGFuZCBwIHdpdGggYyA+IDAsIGNvbXB1dGUgYW4gaW50ZWdlcgorICAgIGFwcHJveGltYXRpb24gdG8gMTAqKnAgKiBsb2coYyoxMCoqZSksIHdpdGggYW4gYWJzb2x1dGUgZXJyb3Igb2YKKyAgICBhdCBtb3N0IDEuICBBc3N1bWVzIHRoYXQgYyoxMCoqZSBpcyBub3QgZXhhY3RseSAxLiIiIgorCisgICAgIyBJbmNyZWFzZSBwcmVjaXNpb24gYnkgMi4gVGhlIHByZWNpc2lvbiBpbmNyZWFzZSBpcyBjb21wZW5zYXRlZAorICAgICMgZm9yIGF0IHRoZSBlbmQgd2l0aCBhIGRpdmlzaW9uIGJ5IDEwMC4KKyAgICBwICs9IDIKKworICAgICMgcmV3cml0ZSBjKjEwKiplIGFzIGQqMTAqKmYgd2l0aCBlaXRoZXIgZiA+PSAwIGFuZCAxIDw9IGQgPD0gMTAsCisgICAgIyBvciBmIDw9IDAgYW5kIDAuMSA8PSBkIDw9IDEuICBUaGVuIHdlIGNhbiBjb21wdXRlIDEwKipwICogbG9nKGMqMTAqKmUpCisgICAgIyBhcyAxMCoqcCAqIGxvZyhkKSArIDEwKipwKmYgKiBsb2coMTApLgorICAgIGwgPSBsZW4oc3RyKGMpKQorICAgIGYgPSBlK2wgLSAoZStsID49IDEpCisKKyAgICAjIGNvbXB1dGUgYXBwcm94aW1hdGlvbiB0byAxMCoqcCpsb2coZCksIHdpdGggZXJyb3IgPCAyNworICAgIGlmIHAgPiAwOgorICAgICAgICBrID0gZStwLWYKKyAgICAgICAgaWYgayA+PSAwOgorICAgICAgICAgICAgYyAqPSAxMCoqaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYyA9IF9kaXZfbmVhcmVzdChjLCAxMCoqLWspICAjIGVycm9yIG9mIDw9IDAuNSBpbiBjCisKKyAgICAgICAgIyBfaWxvZyBtYWduaWZpZXMgZXhpc3RpbmcgZXJyb3IgaW4gYyBieSBhIGZhY3RvciBvZiBhdCBtb3N0IDEwCisgICAgICAgIGxvZ19kID0gX2lsb2coYywgMTAqKnApICMgZXJyb3IgPCA1ICsgMjIgPSAyNworICAgIGVsc2U6CisgICAgICAgICMgcCA8PSAwOiBqdXN0IGFwcHJveGltYXRlIHRoZSB3aG9sZSB0aGluZyBieSAwOyBlcnJvciA8IDIuMzEKKyAgICAgICAgbG9nX2QgPSAwCisKKyAgICAjIGNvbXB1dGUgYXBwcm94aW1hdGlvbiB0byBmKjEwKipwKmxvZygxMCksIHdpdGggZXJyb3IgPCAxMS4KKyAgICBpZiBmOgorICAgICAgICBleHRyYSA9IGxlbihzdHIoYWJzKGYpKSktMQorICAgICAgICBpZiBwICsgZXh0cmEgPj0gMDoKKyAgICAgICAgICAgICMgZXJyb3IgaW4gZiAqIF9sb2cxMF9kaWdpdHMocCtleHRyYSkgPCB8ZnwgKiAxID0gfGZ8CisgICAgICAgICAgICAjIGFmdGVyIGRpdmlzaW9uLCBlcnJvciA8IHxmfC8xMCoqZXh0cmEgKyAwLjUgPCAxMCArIDAuNSA8IDExCisgICAgICAgICAgICBmX2xvZ190ZW4gPSBfZGl2X25lYXJlc3QoZipfbG9nMTBfZGlnaXRzKHArZXh0cmEpLCAxMCoqZXh0cmEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmX2xvZ190ZW4gPSAwCisgICAgZWxzZToKKyAgICAgICAgZl9sb2dfdGVuID0gMAorCisgICAgIyBlcnJvciBpbiBzdW0gPCAxMSsyNyA9IDM4OyBlcnJvciBhZnRlciBkaXZpc2lvbiA8IDAuMzggKyAwLjUgPCAxCisgICAgcmV0dXJuIF9kaXZfbmVhcmVzdChmX2xvZ190ZW4gKyBsb2dfZCwgMTAwKQorCitjbGFzcyBfTG9nMTBNZW1vaXplKG9iamVjdCk6CisgICAgIiIiQ2xhc3MgdG8gY29tcHV0ZSwgc3RvcmUsIGFuZCBhbGxvdyByZXRyaWV2YWwgb2YsIGRpZ2l0cyBvZiB0aGUKKyAgICBjb25zdGFudCBsb2coMTApID0gMi4zMDI1ODUuLi4uICBUaGlzIGNvbnN0YW50IGlzIG5lZWRlZCBieQorICAgIERlY2ltYWwubG4sIERlY2ltYWwubG9nMTAsIERlY2ltYWwuZXhwIGFuZCBEZWNpbWFsLl9fcG93X18uIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmRpZ2l0cyA9ICIyMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MjA3NjAxMTAxNDg4NiIKKworICAgIGRlZiBnZXRkaWdpdHMoc2VsZiwgcCk6CisgICAgICAgICIiIkdpdmVuIGFuIGludGVnZXIgcCA+PSAwLCByZXR1cm4gZmxvb3IoMTAqKnApKmxvZygxMCkuCisKKyAgICAgICAgRm9yIGV4YW1wbGUsIHNlbGYuZ2V0ZGlnaXRzKDMpIHJldHVybnMgMjMwMi4KKyAgICAgICAgIiIiCisgICAgICAgICMgZGlnaXRzIGFyZSBzdG9yZWQgYXMgYSBzdHJpbmcsIGZvciBxdWljayBjb252ZXJzaW9uIHRvCisgICAgICAgICMgaW50ZWdlciBpbiB0aGUgY2FzZSB0aGF0IHdlJ3ZlIGFscmVhZHkgY29tcHV0ZWQgZW5vdWdoCisgICAgICAgICMgZGlnaXRzOyB0aGUgc3RvcmVkIGRpZ2l0cyBzaG91bGQgYWx3YXlzIGJlIGNvcnJlY3QKKyAgICAgICAgIyAodHJ1bmNhdGVkLCBub3Qgcm91bmRlZCB0byBuZWFyZXN0KS4KKyAgICAgICAgaWYgcCA8IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwIHNob3VsZCBiZSBub25uZWdhdGl2ZSIpCisKKyAgICAgICAgaWYgcCA+PSBsZW4oc2VsZi5kaWdpdHMpOgorICAgICAgICAgICAgIyBjb21wdXRlIHArMywgcCs2LCBwKzksIC4uLiBkaWdpdHM7IGNvbnRpbnVlIHVudGlsIGF0CisgICAgICAgICAgICAjIGxlYXN0IG9uZSBvZiB0aGUgZXh0cmEgZGlnaXRzIGlzIG5vbnplcm8KKyAgICAgICAgICAgIGV4dHJhID0gMworICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAjIGNvbXB1dGUgcCtleHRyYSBkaWdpdHMsIGNvcnJlY3QgdG8gd2l0aGluIDF1bHAKKyAgICAgICAgICAgICAgICBNID0gMTAqKihwK2V4dHJhKzIpCisgICAgICAgICAgICAgICAgZGlnaXRzID0gc3RyKF9kaXZfbmVhcmVzdChfaWxvZygxMCpNLCBNKSwgMTAwKSkKKyAgICAgICAgICAgICAgICBpZiBkaWdpdHNbLWV4dHJhOl0gIT0gJzAnKmV4dHJhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4dHJhICs9IDMKKyAgICAgICAgICAgICMga2VlcCBhbGwgcmVsaWFibGUgZGlnaXRzIHNvIGZhcjsgcmVtb3ZlIHRyYWlsaW5nIHplcm9zCisgICAgICAgICAgICAjIGFuZCBuZXh0IG5vbnplcm8gZGlnaXQKKyAgICAgICAgICAgIHNlbGYuZGlnaXRzID0gZGlnaXRzLnJzdHJpcCgnMCcpWzotMV0KKyAgICAgICAgcmV0dXJuIGludChzZWxmLmRpZ2l0c1s6cCsxXSkKKworX2xvZzEwX2RpZ2l0cyA9IF9Mb2cxME1lbW9pemUoKS5nZXRkaWdpdHMKKworZGVmIF9pZXhwKHgsIE0sIEw9OCk6CisgICAgIiIiR2l2ZW4gaW50ZWdlcnMgeCBhbmQgTSwgTSA+IDAsIHN1Y2ggdGhhdCB4L00gaXMgc21hbGwgaW4gYWJzb2x1dGUKKyAgICB2YWx1ZSwgY29tcHV0ZSBhbiBpbnRlZ2VyIGFwcHJveGltYXRpb24gdG8gTSpleHAoeC9NKS4gIEZvciAwIDw9CisgICAgeC9NIDw9IDIuNCwgdGhlIGFic29sdXRlIGVycm9yIGluIHRoZSByZXN1bHQgaXMgYm91bmRlZCBieSA2MCAoYW5kCisgICAgaXMgdXN1YWxseSBtdWNoIHNtYWxsZXIpLiIiIgorCisgICAgIyBBbGdvcml0aG06IHRvIGNvbXB1dGUgZXhwKHopIGZvciBhIHJlYWwgbnVtYmVyIHosIGZpcnN0IGRpdmlkZSB6CisgICAgIyBieSBhIHN1aXRhYmxlIHBvd2VyIFIgb2YgMiBzbyB0aGF0IHx6LzIqKlJ8IDwgMioqLUwuICBUaGVuCisgICAgIyBjb21wdXRlIGV4cG0xKHovMioqUikgPSBleHAoei8yKipSKSAtIDEgdXNpbmcgdGhlIHVzdWFsIFRheWxvcgorICAgICMgc2VyaWVzCisgICAgIworICAgICMgICAgIGV4cG0xKHgpID0geCArIHgqKjIvMiEgKyB4KiozLzMhICsgLi4uCisgICAgIworICAgICMgTm93IHVzZSB0aGUgaWRlbnRpdHkKKyAgICAjCisgICAgIyAgICAgZXhwbTEoMngpID0gZXhwbTEoeCkqKGV4cG0xKHgpKzIpCisgICAgIworICAgICMgUiB0aW1lcyB0byBjb21wdXRlIHRoZSBzZXF1ZW5jZSBleHBtMSh6LzIqKlIpLAorICAgICMgZXhwbTEoei8yKiooUi0xKSksIC4uLiAsIGV4cCh6LzIpLCBleHAoeikuCisKKyAgICAjIEZpbmQgUiBzdWNoIHRoYXQgeC8yKipSL00gPD0gMioqLUwKKyAgICBSID0gX25iaXRzKChsb25nKHgpPDxMKS8vTSkKKworICAgICMgVGF5bG9yIHNlcmllcy4gICgyKipMKSoqVCA+IE0KKyAgICBUID0gLWludCgtMTAqbGVuKHN0cihNKSkvLygzKkwpKQorICAgIHkgPSBfZGl2X25lYXJlc3QoeCwgVCkKKyAgICBNc2hpZnQgPSBsb25nKE0pPDxSCisgICAgZm9yIGkgaW4geHJhbmdlKFQtMSwgMCwgLTEpOgorICAgICAgICB5ID0gX2Rpdl9uZWFyZXN0KHgqKE1zaGlmdCArIHkpLCBNc2hpZnQgKiBpKQorCisgICAgIyBFeHBhbnNpb24KKyAgICBmb3IgayBpbiB4cmFuZ2UoUi0xLCAtMSwgLTEpOgorICAgICAgICBNc2hpZnQgPSBsb25nKE0pPDwoaysyKQorICAgICAgICB5ID0gX2Rpdl9uZWFyZXN0KHkqKHkrTXNoaWZ0KSwgTXNoaWZ0KQorCisgICAgcmV0dXJuIE0reQorCitkZWYgX2RleHAoYywgZSwgcCk6CisgICAgIiIiQ29tcHV0ZSBhbiBhcHByb3hpbWF0aW9uIHRvIGV4cChjKjEwKiplKSwgd2l0aCBwIGRlY2ltYWwgcGxhY2VzIG9mCisgICAgcHJlY2lzaW9uLgorCisgICAgUmV0dXJucyBpbnRlZ2VycyBkLCBmIHN1Y2ggdGhhdDoKKworICAgICAgMTAqKihwLTEpIDw9IGQgPD0gMTAqKnAsIGFuZAorICAgICAgKGQtMSkqMTAqKmYgPCBleHAoYyoxMCoqZSkgPCAoZCsxKSoxMCoqZgorCisgICAgSW4gb3RoZXIgd29yZHMsIGQqMTAqKmYgaXMgYW4gYXBwcm94aW1hdGlvbiB0byBleHAoYyoxMCoqZSkgd2l0aCBwCisgICAgZGlnaXRzIG9mIHByZWNpc2lvbiwgYW5kIHdpdGggYW4gZXJyb3IgaW4gZCBvZiBhdCBtb3N0IDEuICBUaGlzIGlzCisgICAgYWxtb3N0LCBidXQgbm90IHF1aXRlLCB0aGUgc2FtZSBhcyB0aGUgZXJyb3IgYmVpbmcgPCAxdWxwOiB3aGVuIGQKKyAgICA9IDEwKioocC0xKSB0aGUgZXJyb3IgY291bGQgYmUgdXAgdG8gMTAgdWxwLiIiIgorCisgICAgIyB3ZSdsbCBjYWxsIGlleHAgd2l0aCBNID0gMTAqKihwKzIpLCBnaXZpbmcgcCszIGRpZ2l0cyBvZiBwcmVjaXNpb24KKyAgICBwICs9IDIKKworICAgICMgY29tcHV0ZSBsb2coMTApIHdpdGggZXh0cmEgcHJlY2lzaW9uID0gYWRqdXN0ZWQgZXhwb25lbnQgb2YgYyoxMCoqZQorICAgIGV4dHJhID0gbWF4KDAsIGUgKyBsZW4oc3RyKGMpKSAtIDEpCisgICAgcSA9IHAgKyBleHRyYQorCisgICAgIyBjb21wdXRlIHF1b3RpZW50IGMqMTAqKmUvKGxvZygxMCkpID0gYyoxMCoqKGUrcSkvKGxvZygxMCkqMTAqKnEpLAorICAgICMgcm91bmRpbmcgZG93bgorICAgIHNoaWZ0ID0gZStxCisgICAgaWYgc2hpZnQgPj0gMDoKKyAgICAgICAgY3NoaWZ0ID0gYyoxMCoqc2hpZnQKKyAgICBlbHNlOgorICAgICAgICBjc2hpZnQgPSBjLy8xMCoqLXNoaWZ0CisgICAgcXVvdCwgcmVtID0gZGl2bW9kKGNzaGlmdCwgX2xvZzEwX2RpZ2l0cyhxKSkKKworICAgICMgcmVkdWNlIHJlbWFpbmRlciBiYWNrIHRvIG9yaWdpbmFsIHByZWNpc2lvbgorICAgIHJlbSA9IF9kaXZfbmVhcmVzdChyZW0sIDEwKipleHRyYSkKKworICAgICMgZXJyb3IgaW4gcmVzdWx0IG9mIF9pZXhwIDwgMTIwOyAgZXJyb3IgYWZ0ZXIgZGl2aXNpb24gPCAwLjYyCisgICAgcmV0dXJuIF9kaXZfbmVhcmVzdChfaWV4cChyZW0sIDEwKipwKSwgMTAwMCksIHF1b3QgLSBwICsgMworCitkZWYgX2Rwb3dlcih4YywgeGUsIHljLCB5ZSwgcCk6CisgICAgIiIiR2l2ZW4gaW50ZWdlcnMgeGMsIHhlLCB5YyBhbmQgeWUgcmVwcmVzZW50aW5nIERlY2ltYWxzIHggPSB4YyoxMCoqeGUgYW5kCisgICAgeSA9IHljKjEwKip5ZSwgY29tcHV0ZSB4Kip5LiAgUmV0dXJucyBhIHBhaXIgb2YgaW50ZWdlcnMgKGMsIGUpIHN1Y2ggdGhhdDoKKworICAgICAgMTAqKihwLTEpIDw9IGMgPD0gMTAqKnAsIGFuZAorICAgICAgKGMtMSkqMTAqKmUgPCB4Kip5IDwgKGMrMSkqMTAqKmUKKworICAgIGluIG90aGVyIHdvcmRzLCBjKjEwKiplIGlzIGFuIGFwcHJveGltYXRpb24gdG8geCoqeSB3aXRoIHAgZGlnaXRzCisgICAgb2YgcHJlY2lzaW9uLCBhbmQgd2l0aCBhbiBlcnJvciBpbiBjIG9mIGF0IG1vc3QgMS4gIChUaGlzIGlzCisgICAgYWxtb3N0LCBidXQgbm90IHF1aXRlLCB0aGUgc2FtZSBhcyB0aGUgZXJyb3IgYmVpbmcgPCAxdWxwOiB3aGVuIGMKKyAgICA9PSAxMCoqKHAtMSkgd2UgY2FuIG9ubHkgZ3VhcmFudGVlIGVycm9yIDwgMTB1bHAuKQorCisgICAgV2UgYXNzdW1lIHRoYXQ6IHggaXMgcG9zaXRpdmUgYW5kIG5vdCBlcXVhbCB0byAxLCBhbmQgeSBpcyBub256ZXJvLgorICAgICIiIgorCisgICAgIyBGaW5kIGIgc3VjaCB0aGF0IDEwKiooYi0xKSA8PSB8eXwgPD0gMTAqKmIKKyAgICBiID0gbGVuKHN0cihhYnMoeWMpKSkgKyB5ZQorCisgICAgIyBsb2coeCkgPSBseGMqMTAqKigtcC1iLTEpLCB0byBwK2IrMSBwbGFjZXMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBseGMgPSBfZGxvZyh4YywgeGUsIHArYisxKQorCisgICAgIyBjb21wdXRlIHByb2R1Y3QgeSpsb2coeCkgPSB5YypseGMqMTAqKigtcC1iLTEreWUpID0gcGMqMTAqKigtcC0xKQorICAgIHNoaWZ0ID0geWUtYgorICAgIGlmIHNoaWZ0ID49IDA6CisgICAgICAgIHBjID0gbHhjKnljKjEwKipzaGlmdAorICAgIGVsc2U6CisgICAgICAgIHBjID0gX2Rpdl9uZWFyZXN0KGx4Yyp5YywgMTAqKi1zaGlmdCkKKworICAgIGlmIHBjID09IDA6CisgICAgICAgICMgd2UgcHJlZmVyIGEgcmVzdWx0IHRoYXQgaXNuJ3QgZXhhY3RseSAxOyB0aGlzIG1ha2VzIGl0CisgICAgICAgICMgZWFzaWVyIHRvIGNvbXB1dGUgYSBjb3JyZWN0bHkgcm91bmRlZCByZXN1bHQgaW4gX19wb3dfXworICAgICAgICBpZiAoKGxlbihzdHIoeGMpKSArIHhlID49IDEpID09ICh5YyA+IDApKTogIyBpZiB4Kip5ID4gMToKKyAgICAgICAgICAgIGNvZWZmLCBleHAgPSAxMCoqKHAtMSkrMSwgMS1wCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb2VmZiwgZXhwID0gMTAqKnAtMSwgLXAKKyAgICBlbHNlOgorICAgICAgICBjb2VmZiwgZXhwID0gX2RleHAocGMsIC0ocCsxKSwgcCsxKQorICAgICAgICBjb2VmZiA9IF9kaXZfbmVhcmVzdChjb2VmZiwgMTApCisgICAgICAgIGV4cCArPSAxCisKKyAgICByZXR1cm4gY29lZmYsIGV4cAorCitkZWYgX2xvZzEwX2xiKGMsIGNvcnJlY3Rpb24gPSB7CisgICAgICAgICcxJzogMTAwLCAnMic6IDcwLCAnMyc6IDUzLCAnNCc6IDQwLCAnNSc6IDMxLAorICAgICAgICAnNic6IDIzLCAnNyc6IDE2LCAnOCc6IDEwLCAnOSc6IDV9KToKKyAgICAiIiJDb21wdXRlIGEgbG93ZXIgYm91bmQgZm9yIDEwMCpsb2cxMChjKSBmb3IgYSBwb3NpdGl2ZSBpbnRlZ2VyIGMuIiIiCisgICAgaWYgYyA8PSAwOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUaGUgYXJndW1lbnQgdG8gX2xvZzEwX2xiIHNob3VsZCBiZSBub25uZWdhdGl2ZS4iKQorICAgIHN0cl9jID0gc3RyKGMpCisgICAgcmV0dXJuIDEwMCpsZW4oc3RyX2MpIC0gY29ycmVjdGlvbltzdHJfY1swXV0KKworIyMjIyMgSGVscGVyIEZ1bmN0aW9ucyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1GYWxzZSwgYWxsb3dfZmxvYXQ9RmFsc2UpOgorICAgICIiIkNvbnZlcnQgb3RoZXIgdG8gRGVjaW1hbC4KKworICAgIFZlcmlmaWVzIHRoYXQgaXQncyBvayB0byB1c2UgaW4gYW4gaW1wbGljaXQgY29uc3RydWN0aW9uLgorICAgIElmIGFsbG93X2Zsb2F0IGlzIHRydWUsIGFsbG93IGNvbnZlcnNpb24gZnJvbSBmbG9hdDsgIHRoaXMKKyAgICBpcyB1c2VkIGluIHRoZSBjb21wYXJpc29uIG1ldGhvZHMgKF9fZXFfXyBhbmQgZnJpZW5kcykuCisKKyAgICAiIiIKKyAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBEZWNpbWFsKToKKyAgICAgICAgcmV0dXJuIG90aGVyCisgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgKGludCwgbG9uZykpOgorICAgICAgICByZXR1cm4gRGVjaW1hbChvdGhlcikKKyAgICBpZiBhbGxvd19mbG9hdCBhbmQgaXNpbnN0YW5jZShvdGhlciwgZmxvYXQpOgorICAgICAgICByZXR1cm4gRGVjaW1hbC5mcm9tX2Zsb2F0KG90aGVyKQorCisgICAgaWYgcmFpc2VpdDoKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJVbmFibGUgdG8gY29udmVydCAlcyB0byBEZWNpbWFsIiAlIG90aGVyKQorICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisjIyMjIyBTZXR1cCBTcGVjaWZpYyBDb250ZXh0cyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFRoZSBkZWZhdWx0IGNvbnRleHQgcHJvdG90eXBlIHVzZWQgYnkgQ29udGV4dCgpCisjIElzIG11dGFibGUsIHNvIHRoYXQgbmV3IGNvbnRleHRzIGNhbiBoYXZlIGRpZmZlcmVudCBkZWZhdWx0IHZhbHVlcworCitEZWZhdWx0Q29udGV4dCA9IENvbnRleHQoCisgICAgICAgIHByZWM9MjgsIHJvdW5kaW5nPVJPVU5EX0hBTEZfRVZFTiwKKyAgICAgICAgdHJhcHM9W0RpdmlzaW9uQnlaZXJvLCBPdmVyZmxvdywgSW52YWxpZE9wZXJhdGlvbl0sCisgICAgICAgIGZsYWdzPVtdLAorICAgICAgICBFbWF4PTk5OTk5OTk5OSwKKyAgICAgICAgRW1pbj0tOTk5OTk5OTk5LAorICAgICAgICBjYXBpdGFscz0xCispCisKKyMgUHJlLW1hZGUgYWx0ZXJuYXRlIGNvbnRleHRzIG9mZmVyZWQgYnkgdGhlIHNwZWNpZmljYXRpb24KKyMgRG9uJ3QgY2hhbmdlIHRoZXNlOyB0aGUgdXNlciBzaG91bGQgYmUgYWJsZSB0byBzZWxlY3QgdGhlc2UKKyMgY29udGV4dHMgYW5kIGJlIGFibGUgdG8gcmVwcm9kdWNlIHJlc3VsdHMgZnJvbSBvdGhlciBpbXBsZW1lbnRhdGlvbnMKKyMgb2YgdGhlIHNwZWMuCisKK0Jhc2ljQ29udGV4dCA9IENvbnRleHQoCisgICAgICAgIHByZWM9OSwgcm91bmRpbmc9Uk9VTkRfSEFMRl9VUCwKKyAgICAgICAgdHJhcHM9W0RpdmlzaW9uQnlaZXJvLCBPdmVyZmxvdywgSW52YWxpZE9wZXJhdGlvbiwgQ2xhbXBlZCwgVW5kZXJmbG93XSwKKyAgICAgICAgZmxhZ3M9W10sCispCisKK0V4dGVuZGVkQ29udGV4dCA9IENvbnRleHQoCisgICAgICAgIHByZWM9OSwgcm91bmRpbmc9Uk9VTkRfSEFMRl9FVkVOLAorICAgICAgICB0cmFwcz1bXSwKKyAgICAgICAgZmxhZ3M9W10sCispCisKKworIyMjIyMgY3J1ZCBmb3IgcGFyc2luZyBzdHJpbmdzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBSZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgcGFyc2luZyBudW1lcmljIHN0cmluZ3MuICBBZGRpdGlvbmFsCisjIGNvbW1lbnRzOgorIworIyAxLiBVbmNvbW1lbnQgdGhlIHR3byAnXHMqJyBsaW5lcyB0byBhbGxvdyBsZWFkaW5nIGFuZC9vciB0cmFpbGluZworIyB3aGl0ZXNwYWNlLiAgQnV0IG5vdGUgdGhhdCB0aGUgc3BlY2lmaWNhdGlvbiBkaXNhbGxvd3Mgd2hpdGVzcGFjZSBpbgorIyBhIG51bWVyaWMgc3RyaW5nLgorIworIyAyLiBGb3IgZmluaXRlIG51bWJlcnMgKG5vdCBpbmZpbml0aWVzIGFuZCBOYU5zKSB0aGUgYm9keSBvZiB0aGUKKyMgbnVtYmVyIGJldHdlZW4gdGhlIG9wdGlvbmFsIHNpZ24gYW5kIHRoZSBvcHRpb25hbCBleHBvbmVudCBtdXN0IGhhdmUKKyMgYXQgbGVhc3Qgb25lIGRlY2ltYWwgZGlnaXQsIHBvc3NpYmx5IGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LiAgVGhlCisjIGxvb2thaGVhZCBleHByZXNzaW9uICcoPz1cZHxcLlxkKScgY2hlY2tzIHRoaXMuCisKK2ltcG9ydCByZQorX3BhcnNlciA9IHJlLmNvbXBpbGUociIiIiAgICAgICAgIyBBIG51bWVyaWMgc3RyaW5nIGNvbnNpc3RzIG9mOgorIyAgICBccyoKKyAgICAoP1A8c2lnbj5bLStdKT8gICAgICAgICAgICAgICMgYW4gb3B0aW9uYWwgc2lnbiwgZm9sbG93ZWQgYnkgZWl0aGVyLi4uCisgICAgKAorICAgICAgICAoPz1cZHxcLlxkKSAgICAgICAgICAgICAgIyAuLi5hIG51bWJlciAod2l0aCBhdCBsZWFzdCBvbmUgZGlnaXQpCisgICAgICAgICg/UDxpbnQ+XGQqKSAgICAgICAgICAgICAjIGhhdmluZyBhIChwb3NzaWJseSBlbXB0eSkgaW50ZWdlciBwYXJ0CisgICAgICAgIChcLig/UDxmcmFjPlxkKikpPyAgICAgICAjIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIGZyYWN0aW9uYWwgcGFydAorICAgICAgICAoRSg/UDxleHA+Wy0rXT9cZCspKT8gICAgIyBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBleHBvbmVudCwgb3IuLi4KKyAgICB8CisgICAgICAgIEluZihpbml0eSk/ICAgICAgICAgICAgICAjIC4uLmFuIGluZmluaXR5LCBvci4uLgorICAgIHwKKyAgICAgICAgKD9QPHNpZ25hbD5zKT8gICAgICAgICAgICMgLi4uYW4gKG9wdGlvbmFsbHkgc2lnbmFsaW5nKQorICAgICAgICBOYU4gICAgICAgICAgICAgICAgICAgICAgIyBOYU4KKyAgICAgICAgKD9QPGRpYWc+XGQqKSAgICAgICAgICAgICMgd2l0aCAocG9zc2libHkgZW1wdHkpIGRpYWdub3N0aWMgaW5mby4KKyAgICApCisjICAgIFxzKgorICAgIFxaCisiIiIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFIHwgcmUuVU5JQ09ERSkubWF0Y2gKKworX2FsbF96ZXJvcyA9IHJlLmNvbXBpbGUoJzAqJCcpLm1hdGNoCitfZXhhY3RfaGFsZiA9IHJlLmNvbXBpbGUoJzUwKiQnKS5tYXRjaAorCisjIyMjIyBQRVAzMTAxIHN1cHBvcnQgZnVuY3Rpb25zICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIHNlY3Rpb24gaGF2ZSBsaXR0bGUgdG8gZG8gd2l0aCB0aGUgRGVjaW1hbAorIyBjbGFzcywgYW5kIGNvdWxkIHBvdGVudGlhbGx5IGJlIHJldXNlZCBvciBhZGFwdGVkIGZvciBvdGhlciBwdXJlCisjIFB5dGhvbiBudW1lcmljIGNsYXNzZXMgdGhhdCB3YW50IHRvIGltcGxlbWVudCBfX2Zvcm1hdF9fCisjCisjIEEgZm9ybWF0IHNwZWNpZmllciBmb3IgRGVjaW1hbCBsb29rcyBsaWtlOgorIworIyAgIFtbZmlsbF1hbGlnbl1bc2lnbl1bMF1bbWluaW11bXdpZHRoXVssXVsucHJlY2lzaW9uXVt0eXBlXQorCitfcGFyc2VfZm9ybWF0X3NwZWNpZmllcl9yZWdleCA9IHJlLmNvbXBpbGUociIiIlxBCisoPzoKKyAgICg/UDxmaWxsPi4pPworICAgKD9QPGFsaWduPls8Pj1eXSkKKyk/CisoP1A8c2lnbj5bLSsgXSk/CisoP1A8emVyb3BhZD4wKT8KKyg/UDxtaW5pbXVtd2lkdGg+KD8hMClcZCspPworKD9QPHRob3VzYW5kc19zZXA+LCk/CisoPzpcLig/UDxwcmVjaXNpb24+MHwoPyEwKVxkKykpPworKD9QPHR5cGU+W2VFZkZnR24lXSk/CitcWgorIiIiLCByZS5WRVJCT1NFKQorCitkZWwgcmUKKworIyBUaGUgbG9jYWxlIG1vZHVsZSBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlICduJyBmb3JtYXQgc3BlY2lmaWVyLiAgVGhlCisjIHJlc3Qgb2YgdGhlIFBFUCAzMTAxIGNvZGUgZnVuY3Rpb25zIHF1aXRlIGhhcHBpbHkgd2l0aG91dCBpdCwgc28gd2UKKyMgZG9uJ3QgY2FyZSB0b28gbXVjaCBpZiBsb2NhbGUgaXNuJ3QgcHJlc2VudC4KK3RyeToKKyAgICBpbXBvcnQgbG9jYWxlIGFzIF9sb2NhbGUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCisKK2RlZiBfcGFyc2VfZm9ybWF0X3NwZWNpZmllcihmb3JtYXRfc3BlYywgX2xvY2FsZWNvbnY9Tm9uZSk6CisgICAgIiIiUGFyc2UgYW5kIHZhbGlkYXRlIGEgZm9ybWF0IHNwZWNpZmllci4KKworICAgIFR1cm5zIGEgc3RhbmRhcmQgbnVtZXJpYyBmb3JtYXQgc3BlY2lmaWVyIGludG8gYSBkaWN0LCB3aXRoIHRoZQorICAgIGZvbGxvd2luZyBlbnRyaWVzOgorCisgICAgICBmaWxsOiBmaWxsIGNoYXJhY3RlciB0byBwYWQgZmllbGQgdG8gbWluaW11bSB3aWR0aAorICAgICAgYWxpZ246IGFsaWdubWVudCB0eXBlLCBlaXRoZXIgJzwnLCAnPicsICc9JyBvciAnXicKKyAgICAgIHNpZ246IGVpdGhlciAnKycsICctJyBvciAnICcKKyAgICAgIG1pbmltdW13aWR0aDogbm9ubmVnYXRpdmUgaW50ZWdlciBnaXZpbmcgbWluaW11bSB3aWR0aAorICAgICAgemVyb3BhZDogYm9vbGVhbiwgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHBhZCB3aXRoIHplcm9zCisgICAgICB0aG91c2FuZHNfc2VwOiBzdHJpbmcgdG8gdXNlIGFzIHRob3VzYW5kcyBzZXBhcmF0b3IsIG9yICcnCisgICAgICBncm91cGluZzogZ3JvdXBpbmcgZm9yIHRob3VzYW5kcyBzZXBhcmF0b3JzLCBpbiBmb3JtYXQKKyAgICAgICAgdXNlZCBieSBsb2NhbGVjb252CisgICAgICBkZWNpbWFsX3BvaW50OiBzdHJpbmcgdG8gdXNlIGZvciBkZWNpbWFsIHBvaW50CisgICAgICBwcmVjaXNpb246IG5vbm5lZ2F0aXZlIGludGVnZXIgZ2l2aW5nIHByZWNpc2lvbiwgb3IgTm9uZQorICAgICAgdHlwZTogb25lIG9mIHRoZSBjaGFyYWN0ZXJzICdlRWZGZ0clJywgb3IgTm9uZQorICAgICAgdW5pY29kZTogYm9vbGVhbiAoYWx3YXlzIFRydWUgZm9yIFB5dGhvbiAzLngpCisKKyAgICAiIiIKKyAgICBtID0gX3BhcnNlX2Zvcm1hdF9zcGVjaWZpZXJfcmVnZXgubWF0Y2goZm9ybWF0X3NwZWMpCisgICAgaWYgbSBpcyBOb25lOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGZvcm1hdCBzcGVjaWZpZXI6ICIgKyBmb3JtYXRfc3BlYykKKworICAgICMgZ2V0IHRoZSBkaWN0aW9uYXJ5CisgICAgZm9ybWF0X2RpY3QgPSBtLmdyb3VwZGljdCgpCisKKyAgICAjIHplcm9wYWQ7IGRlZmF1bHRzIGZvciBmaWxsIGFuZCBhbGlnbm1lbnQuICBJZiB6ZXJvIHBhZGRpbmcKKyAgICAjIGlzIHJlcXVlc3RlZCwgdGhlIGZpbGwgYW5kIGFsaWduIGZpZWxkcyBzaG91bGQgYmUgYWJzZW50LgorICAgIGZpbGwgPSBmb3JtYXRfZGljdFsnZmlsbCddCisgICAgYWxpZ24gPSBmb3JtYXRfZGljdFsnYWxpZ24nXQorICAgIGZvcm1hdF9kaWN0Wyd6ZXJvcGFkJ10gPSAoZm9ybWF0X2RpY3RbJ3plcm9wYWQnXSBpcyBub3QgTm9uZSkKKyAgICBpZiBmb3JtYXRfZGljdFsnemVyb3BhZCddOgorICAgICAgICBpZiBmaWxsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRmlsbCBjaGFyYWN0ZXIgY29uZmxpY3RzIHdpdGggJzAnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIGZvcm1hdCBzcGVjaWZpZXI6ICIgKyBmb3JtYXRfc3BlYykKKyAgICAgICAgaWYgYWxpZ24gaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJBbGlnbm1lbnQgY29uZmxpY3RzIHdpdGggJzAnIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCBzcGVjaWZpZXI6ICIgKyBmb3JtYXRfc3BlYykKKyAgICBmb3JtYXRfZGljdFsnZmlsbCddID0gZmlsbCBvciAnICcKKyAgICAjIFBFUCAzMTAxIG9yaWdpbmFsbHkgc3BlY2lmaWVkIHRoYXQgdGhlIGRlZmF1bHQgYWxpZ25tZW50IHNob3VsZAorICAgICMgYmUgbGVmdDsgIGl0IHdhcyBsYXRlciBhZ3JlZWQgdGhhdCByaWdodC1hbGlnbmVkIG1ha2VzIG1vcmUgc2Vuc2UKKyAgICAjIGZvciBudW1lcmljIHR5cGVzLiAgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU2ODU3LgorICAgIGZvcm1hdF9kaWN0WydhbGlnbiddID0gYWxpZ24gb3IgJz4nCisKKyAgICAjIGRlZmF1bHQgc2lnbiBoYW5kbGluZzogJy0nIGZvciBuZWdhdGl2ZSwgJycgZm9yIHBvc2l0aXZlCisgICAgaWYgZm9ybWF0X2RpY3RbJ3NpZ24nXSBpcyBOb25lOgorICAgICAgICBmb3JtYXRfZGljdFsnc2lnbiddID0gJy0nCisKKyAgICAjIG1pbmltdW13aWR0aCBkZWZhdWx0cyB0byAwOyBwcmVjaXNpb24gcmVtYWlucyBOb25lIGlmIG5vdCBnaXZlbgorICAgIGZvcm1hdF9kaWN0WydtaW5pbXVtd2lkdGgnXSA9IGludChmb3JtYXRfZGljdFsnbWluaW11bXdpZHRoJ10gb3IgJzAnKQorICAgIGlmIGZvcm1hdF9kaWN0WydwcmVjaXNpb24nXSBpcyBub3QgTm9uZToKKyAgICAgICAgZm9ybWF0X2RpY3RbJ3ByZWNpc2lvbiddID0gaW50KGZvcm1hdF9kaWN0WydwcmVjaXNpb24nXSkKKworICAgICMgaWYgZm9ybWF0IHR5cGUgaXMgJ2cnIG9yICdHJyB0aGVuIGEgcHJlY2lzaW9uIG9mIDAgbWFrZXMgbGl0dGxlCisgICAgIyBzZW5zZTsgY29udmVydCBpdCB0byAxLiAgU2FtZSBpZiBmb3JtYXQgdHlwZSBpcyB1bnNwZWNpZmllZC4KKyAgICBpZiBmb3JtYXRfZGljdFsncHJlY2lzaW9uJ10gPT0gMDoKKyAgICAgICAgaWYgZm9ybWF0X2RpY3RbJ3R5cGUnXSBpcyBOb25lIG9yIGZvcm1hdF9kaWN0Wyd0eXBlJ10gaW4gJ2dHJzoKKyAgICAgICAgICAgIGZvcm1hdF9kaWN0WydwcmVjaXNpb24nXSA9IDEKKworICAgICMgZGV0ZXJtaW5lIHRob3VzYW5kcyBzZXBhcmF0b3IsIGdyb3VwaW5nLCBhbmQgZGVjaW1hbCBzZXBhcmF0b3IsIGFuZAorICAgICMgYWRkIGFwcHJvcHJpYXRlIGVudHJpZXMgdG8gZm9ybWF0X2RpY3QKKyAgICBpZiBmb3JtYXRfZGljdFsndHlwZSddID09ICduJzoKKyAgICAgICAgIyBhcGFydCBmcm9tIHNlcGFyYXRvcnMsICduJyBiZWhhdmVzIGp1c3QgbGlrZSAnZycKKyAgICAgICAgZm9ybWF0X2RpY3RbJ3R5cGUnXSA9ICdnJworICAgICAgICBpZiBfbG9jYWxlY29udiBpcyBOb25lOgorICAgICAgICAgICAgX2xvY2FsZWNvbnYgPSBfbG9jYWxlLmxvY2FsZWNvbnYoKQorICAgICAgICBpZiBmb3JtYXRfZGljdFsndGhvdXNhbmRzX3NlcCddIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRXhwbGljaXQgdGhvdXNhbmRzIHNlcGFyYXRvciBjb25mbGljdHMgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInbicgdHlwZSBpbiBmb3JtYXQgc3BlY2lmaWVyOiAiICsgZm9ybWF0X3NwZWMpCisgICAgICAgIGZvcm1hdF9kaWN0Wyd0aG91c2FuZHNfc2VwJ10gPSBfbG9jYWxlY29udlsndGhvdXNhbmRzX3NlcCddCisgICAgICAgIGZvcm1hdF9kaWN0Wydncm91cGluZyddID0gX2xvY2FsZWNvbnZbJ2dyb3VwaW5nJ10KKyAgICAgICAgZm9ybWF0X2RpY3RbJ2RlY2ltYWxfcG9pbnQnXSA9IF9sb2NhbGVjb252WydkZWNpbWFsX3BvaW50J10KKyAgICBlbHNlOgorICAgICAgICBpZiBmb3JtYXRfZGljdFsndGhvdXNhbmRzX3NlcCddIGlzIE5vbmU6CisgICAgICAgICAgICBmb3JtYXRfZGljdFsndGhvdXNhbmRzX3NlcCddID0gJycKKyAgICAgICAgZm9ybWF0X2RpY3RbJ2dyb3VwaW5nJ10gPSBbMywgMF0KKyAgICAgICAgZm9ybWF0X2RpY3RbJ2RlY2ltYWxfcG9pbnQnXSA9ICcuJworCisgICAgIyByZWNvcmQgd2hldGhlciByZXR1cm4gdHlwZSBzaG91bGQgYmUgc3RyIG9yIHVuaWNvZGUKKyAgICBmb3JtYXRfZGljdFsndW5pY29kZSddID0gaXNpbnN0YW5jZShmb3JtYXRfc3BlYywgdW5pY29kZSkKKworICAgIHJldHVybiBmb3JtYXRfZGljdAorCitkZWYgX2Zvcm1hdF9hbGlnbihzaWduLCBib2R5LCBzcGVjKToKKyAgICAiIiJHaXZlbiBhbiB1bnBhZGRlZCwgbm9uLWFsaWduZWQgbnVtZXJpYyBzdHJpbmcgJ2JvZHknIGFuZCBzaWduCisgICAgc3RyaW5nICdzaWduJywgYWRkIHBhZGRpbmcgYW5kIGFsaWdubWVudCBjb25mb3JtaW5nIHRvIHRoZSBnaXZlbgorICAgIGZvcm1hdCBzcGVjaWZpZXIgZGljdGlvbmFyeSAnc3BlYycgKGFzIHByb2R1Y2VkIGJ5CisgICAgcGFyc2VfZm9ybWF0X3NwZWNpZmllcikuCisKKyAgICBBbHNvIGNvbnZlcnRzIHJlc3VsdCB0byB1bmljb2RlIGlmIG5lY2Vzc2FyeS4KKworICAgICIiIgorICAgICMgaG93IG11Y2ggZXh0cmEgc3BhY2UgZG8gd2UgaGF2ZSB0byBwbGF5IHdpdGg/CisgICAgbWluaW11bXdpZHRoID0gc3BlY1snbWluaW11bXdpZHRoJ10KKyAgICBmaWxsID0gc3BlY1snZmlsbCddCisgICAgcGFkZGluZyA9IGZpbGwqKG1pbmltdW13aWR0aCAtIGxlbihzaWduKSAtIGxlbihib2R5KSkKKworICAgIGFsaWduID0gc3BlY1snYWxpZ24nXQorICAgIGlmIGFsaWduID09ICc8JzoKKyAgICAgICAgcmVzdWx0ID0gc2lnbiArIGJvZHkgKyBwYWRkaW5nCisgICAgZWxpZiBhbGlnbiA9PSAnPic6CisgICAgICAgIHJlc3VsdCA9IHBhZGRpbmcgKyBzaWduICsgYm9keQorICAgIGVsaWYgYWxpZ24gPT0gJz0nOgorICAgICAgICByZXN1bHQgPSBzaWduICsgcGFkZGluZyArIGJvZHkKKyAgICBlbGlmIGFsaWduID09ICdeJzoKKyAgICAgICAgaGFsZiA9IGxlbihwYWRkaW5nKS8vMgorICAgICAgICByZXN1bHQgPSBwYWRkaW5nWzpoYWxmXSArIHNpZ24gKyBib2R5ICsgcGFkZGluZ1toYWxmOl0KKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbnJlY29nbmlzZWQgYWxpZ25tZW50IGZpZWxkJykKKworICAgICMgbWFrZSBzdXJlIHRoYXQgcmVzdWx0IGlzIHVuaWNvZGUgaWYgbmVjZXNzYXJ5CisgICAgaWYgc3BlY1sndW5pY29kZSddOgorICAgICAgICByZXN1bHQgPSB1bmljb2RlKHJlc3VsdCkKKworICAgIHJldHVybiByZXN1bHQKKworZGVmIF9ncm91cF9sZW5ndGhzKGdyb3VwaW5nKToKKyAgICAiIiJDb252ZXJ0IGEgbG9jYWxlY29udi1zdHlsZSBncm91cGluZyBpbnRvIGEgKHBvc3NpYmx5IGluZmluaXRlKQorICAgIGl0ZXJhYmxlIG9mIGludGVnZXJzIHJlcHJlc2VudGluZyBncm91cCBsZW5ndGhzLgorCisgICAgIiIiCisgICAgIyBUaGUgcmVzdWx0IGZyb20gbG9jYWxlY29udigpWydncm91cGluZyddLCBhbmQgdGhlIGlucHV0IHRvIHRoaXMKKyAgICAjIGZ1bmN0aW9uLCBzaG91bGQgYmUgYSBsaXN0IG9mIGludGVnZXJzIGluIG9uZSBvZiB0aGUKKyAgICAjIGZvbGxvd2luZyB0aHJlZSBmb3JtczoKKyAgICAjCisgICAgIyAgICgxKSBhbiBlbXB0eSBsaXN0LCBvcgorICAgICMgICAoMikgbm9uZW1wdHkgbGlzdCBvZiBwb3NpdGl2ZSBpbnRlZ2VycyArIFswXQorICAgICMgICAoMykgbGlzdCBvZiBwb3NpdGl2ZSBpbnRlZ2VycyArIFtsb2NhbGUuQ0hBUl9NQVhdLCBvcgorCisgICAgZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluLCByZXBlYXQKKyAgICBpZiBub3QgZ3JvdXBpbmc6CisgICAgICAgIHJldHVybiBbXQorICAgIGVsaWYgZ3JvdXBpbmdbLTFdID09IDAgYW5kIGxlbihncm91cGluZykgPj0gMjoKKyAgICAgICAgcmV0dXJuIGNoYWluKGdyb3VwaW5nWzotMV0sIHJlcGVhdChncm91cGluZ1stMl0pKQorICAgIGVsaWYgZ3JvdXBpbmdbLTFdID09IF9sb2NhbGUuQ0hBUl9NQVg6CisgICAgICAgIHJldHVybiBncm91cGluZ1s6LTFdCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndW5yZWNvZ25pc2VkIGZvcm1hdCBmb3IgZ3JvdXBpbmcnKQorCitkZWYgX2luc2VydF90aG91c2FuZHNfc2VwKGRpZ2l0cywgc3BlYywgbWluX3dpZHRoPTEpOgorICAgICIiIkluc2VydCB0aG91c2FuZHMgc2VwYXJhdG9ycyBpbnRvIGEgZGlnaXQgc3RyaW5nLgorCisgICAgc3BlYyBpcyBhIGRpY3Rpb25hcnkgd2hvc2Uga2V5cyBzaG91bGQgaW5jbHVkZSAndGhvdXNhbmRzX3NlcCcgYW5kCisgICAgJ2dyb3VwaW5nJzsgdHlwaWNhbGx5IGl0J3MgdGhlIHJlc3VsdCBvZiBwYXJzaW5nIHRoZSBmb3JtYXQKKyAgICBzcGVjaWZpZXIgdXNpbmcgX3BhcnNlX2Zvcm1hdF9zcGVjaWZpZXIuCisKKyAgICBUaGUgbWluX3dpZHRoIGtleXdvcmQgYXJndW1lbnQgZ2l2ZXMgdGhlIG1pbmltdW0gbGVuZ3RoIG9mIHRoZQorICAgIHJlc3VsdCwgd2hpY2ggd2lsbCBiZSBwYWRkZWQgb24gdGhlIGxlZnQgd2l0aCB6ZXJvcyBpZiBuZWNlc3NhcnkuCisKKyAgICBJZiBuZWNlc3NhcnksIHRoZSB6ZXJvIHBhZGRpbmcgYWRkcyBhbiBleHRyYSAnMCcgb24gdGhlIGxlZnQgdG8KKyAgICBhdm9pZCBhIGxlYWRpbmcgdGhvdXNhbmRzIHNlcGFyYXRvci4gIEZvciBleGFtcGxlLCBpbnNlcnRpbmcKKyAgICBjb21tYXMgZXZlcnkgdGhyZWUgZGlnaXRzIGluICcxMjM0NTYnLCB3aXRoIG1pbl93aWR0aD04LCBnaXZlcworICAgICcwLDEyMyw0NTYnLCBldmVuIHRob3VnaCB0aGF0IGhhcyBsZW5ndGggOS4KKworICAgICIiIgorCisgICAgc2VwID0gc3BlY1sndGhvdXNhbmRzX3NlcCddCisgICAgZ3JvdXBpbmcgPSBzcGVjWydncm91cGluZyddCisKKyAgICBncm91cHMgPSBbXQorICAgIGZvciBsIGluIF9ncm91cF9sZW5ndGhzKGdyb3VwaW5nKToKKyAgICAgICAgaWYgbCA8PSAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZ3JvdXAgbGVuZ3RoIHNob3VsZCBiZSBwb3NpdGl2ZSIpCisgICAgICAgICMgbWF4KC4uLiwgMSkgZm9yY2VzIGF0IGxlYXN0IDEgZGlnaXQgdG8gdGhlIGxlZnQgb2YgYSBzZXBhcmF0b3IKKyAgICAgICAgbCA9IG1pbihtYXgobGVuKGRpZ2l0cyksIG1pbl93aWR0aCwgMSksIGwpCisgICAgICAgIGdyb3Vwcy5hcHBlbmQoJzAnKihsIC0gbGVuKGRpZ2l0cykpICsgZGlnaXRzWy1sOl0pCisgICAgICAgIGRpZ2l0cyA9IGRpZ2l0c1s6LWxdCisgICAgICAgIG1pbl93aWR0aCAtPSBsCisgICAgICAgIGlmIG5vdCBkaWdpdHMgYW5kIG1pbl93aWR0aCA8PSAwOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgbWluX3dpZHRoIC09IGxlbihzZXApCisgICAgZWxzZToKKyAgICAgICAgbCA9IG1heChsZW4oZGlnaXRzKSwgbWluX3dpZHRoLCAxKQorICAgICAgICBncm91cHMuYXBwZW5kKCcwJyoobCAtIGxlbihkaWdpdHMpKSArIGRpZ2l0c1stbDpdKQorICAgIHJldHVybiBzZXAuam9pbihyZXZlcnNlZChncm91cHMpKQorCitkZWYgX2Zvcm1hdF9zaWduKGlzX25lZ2F0aXZlLCBzcGVjKToKKyAgICAiIiJEZXRlcm1pbmUgc2lnbiBjaGFyYWN0ZXIuIiIiCisKKyAgICBpZiBpc19uZWdhdGl2ZToKKyAgICAgICAgcmV0dXJuICctJworICAgIGVsaWYgc3BlY1snc2lnbiddIGluICcgKyc6CisgICAgICAgIHJldHVybiBzcGVjWydzaWduJ10KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gJycKKworZGVmIF9mb3JtYXRfbnVtYmVyKGlzX25lZ2F0aXZlLCBpbnRwYXJ0LCBmcmFjcGFydCwgZXhwLCBzcGVjKToKKyAgICAiIiJGb3JtYXQgYSBudW1iZXIsIGdpdmVuIHRoZSBmb2xsb3dpbmcgZGF0YToKKworICAgIGlzX25lZ2F0aXZlOiB0cnVlIGlmIHRoZSBudW1iZXIgaXMgbmVnYXRpdmUsIGVsc2UgZmFsc2UKKyAgICBpbnRwYXJ0OiBzdHJpbmcgb2YgZGlnaXRzIHRoYXQgbXVzdCBhcHBlYXIgYmVmb3JlIHRoZSBkZWNpbWFsIHBvaW50CisgICAgZnJhY3BhcnQ6IHN0cmluZyBvZiBkaWdpdHMgdGhhdCBtdXN0IGNvbWUgYWZ0ZXIgdGhlIHBvaW50CisgICAgZXhwOiBleHBvbmVudCwgYXMgYW4gaW50ZWdlcgorICAgIHNwZWM6IGRpY3Rpb25hcnkgcmVzdWx0aW5nIGZyb20gcGFyc2luZyB0aGUgZm9ybWF0IHNwZWNpZmllcgorCisgICAgVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBpbmZvcm1hdGlvbiBpbiBzcGVjIHRvOgorICAgICAgaW5zZXJ0IHNlcGFyYXRvcnMgKGRlY2ltYWwgc2VwYXJhdG9yIGFuZCB0aG91c2FuZHMgc2VwYXJhdG9ycykKKyAgICAgIGZvcm1hdCB0aGUgc2lnbgorICAgICAgZm9ybWF0IHRoZSBleHBvbmVudAorICAgICAgYWRkIHRyYWlsaW5nICclJyBmb3IgdGhlICclJyB0eXBlCisgICAgICB6ZXJvLXBhZCBpZiBuZWNlc3NhcnkKKyAgICAgIGZpbGwgYW5kIGFsaWduIGlmIG5lY2Vzc2FyeQorICAgICIiIgorCisgICAgc2lnbiA9IF9mb3JtYXRfc2lnbihpc19uZWdhdGl2ZSwgc3BlYykKKworICAgIGlmIGZyYWNwYXJ0OgorICAgICAgICBmcmFjcGFydCA9IHNwZWNbJ2RlY2ltYWxfcG9pbnQnXSArIGZyYWNwYXJ0CisKKyAgICBpZiBleHAgIT0gMCBvciBzcGVjWyd0eXBlJ10gaW4gJ2VFJzoKKyAgICAgICAgZWNoYXIgPSB7J0UnOiAnRScsICdlJzogJ2UnLCAnRyc6ICdFJywgJ2cnOiAnZSd9W3NwZWNbJ3R5cGUnXV0KKyAgICAgICAgZnJhY3BhcnQgKz0gInswfXsxOit9Ii5mb3JtYXQoZWNoYXIsIGV4cCkKKyAgICBpZiBzcGVjWyd0eXBlJ10gPT0gJyUnOgorICAgICAgICBmcmFjcGFydCArPSAnJScKKworICAgIGlmIHNwZWNbJ3plcm9wYWQnXToKKyAgICAgICAgbWluX3dpZHRoID0gc3BlY1snbWluaW11bXdpZHRoJ10gLSBsZW4oZnJhY3BhcnQpIC0gbGVuKHNpZ24pCisgICAgZWxzZToKKyAgICAgICAgbWluX3dpZHRoID0gMAorICAgIGludHBhcnQgPSBfaW5zZXJ0X3Rob3VzYW5kc19zZXAoaW50cGFydCwgc3BlYywgbWluX3dpZHRoKQorCisgICAgcmV0dXJuIF9mb3JtYXRfYWxpZ24oc2lnbiwgaW50cGFydCtmcmFjcGFydCwgc3BlYykKKworCisjIyMjIyBVc2VmdWwgQ29uc3RhbnRzIChpbnRlcm5hbCB1c2Ugb25seSkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBSZXVzYWJsZSBkZWZhdWx0cworX0luZmluaXR5ID0gRGVjaW1hbCgnSW5mJykKK19OZWdhdGl2ZUluZmluaXR5ID0gRGVjaW1hbCgnLUluZicpCitfTmFOID0gRGVjaW1hbCgnTmFOJykKK19aZXJvID0gRGVjaW1hbCgwKQorX09uZSA9IERlY2ltYWwoMSkKK19OZWdhdGl2ZU9uZSA9IERlY2ltYWwoLTEpCisKKyMgX1NpZ25lZEluZmluaXR5W3NpZ25dIGlzIGluZmluaXR5IHcvIHRoYXQgc2lnbgorX1NpZ25lZEluZmluaXR5ID0gKF9JbmZpbml0eSwgX05lZ2F0aXZlSW5maW5pdHkpCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBkb2N0ZXN0LCBzeXMKKyAgICBkb2N0ZXN0LnRlc3Rtb2Qoc3lzLm1vZHVsZXNbX19uYW1lX19dKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kZWNpbWFsLnB5YyBiL2xpYi9weXRob24yLjcvZGVjaW1hbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzZGQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGVjaW1hbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kZWNpbWFsLnB5byBiL2xpYi9weXRob24yLjcvZGVjaW1hbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzZGQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGVjaW1hbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaWZmbGliLnB5IGIvbGliL3B5dGhvbjIuNy9kaWZmbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmNiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2RpZmZsaWIucHkKQEAgLTAsMCArMSwyMDU5IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIgorTW9kdWxlIGRpZmZsaWIgLS0gaGVscGVycyBmb3IgY29tcHV0aW5nIGRlbHRhcyBiZXR3ZWVuIG9iamVjdHMuCisKK0Z1bmN0aW9uIGdldF9jbG9zZV9tYXRjaGVzKHdvcmQsIHBvc3NpYmlsaXRpZXMsIG49MywgY3V0b2ZmPTAuNik6CisgICAgVXNlIFNlcXVlbmNlTWF0Y2hlciB0byByZXR1cm4gbGlzdCBvZiB0aGUgYmVzdCAiZ29vZCBlbm91Z2giIG1hdGNoZXMuCisKK0Z1bmN0aW9uIGNvbnRleHRfZGlmZihhLCBiKToKKyAgICBGb3IgdHdvIGxpc3RzIG9mIHN0cmluZ3MsIHJldHVybiBhIGRlbHRhIGluIGNvbnRleHQgZGlmZiBmb3JtYXQuCisKK0Z1bmN0aW9uIG5kaWZmKGEsIGIpOgorICAgIFJldHVybiBhIGRlbHRhOiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGBhYCBhbmQgYGJgIChsaXN0cyBvZiBzdHJpbmdzKS4KKworRnVuY3Rpb24gcmVzdG9yZShkZWx0YSwgd2hpY2gpOgorICAgIFJldHVybiBvbmUgb2YgdGhlIHR3byBzZXF1ZW5jZXMgdGhhdCBnZW5lcmF0ZWQgYW4gbmRpZmYgZGVsdGEuCisKK0Z1bmN0aW9uIHVuaWZpZWRfZGlmZihhLCBiKToKKyAgICBGb3IgdHdvIGxpc3RzIG9mIHN0cmluZ3MsIHJldHVybiBhIGRlbHRhIGluIHVuaWZpZWQgZGlmZiBmb3JtYXQuCisKK0NsYXNzIFNlcXVlbmNlTWF0Y2hlcjoKKyAgICBBIGZsZXhpYmxlIGNsYXNzIGZvciBjb21wYXJpbmcgcGFpcnMgb2Ygc2VxdWVuY2VzIG9mIGFueSB0eXBlLgorCitDbGFzcyBEaWZmZXI6CisgICAgRm9yIHByb2R1Y2luZyBodW1hbi1yZWFkYWJsZSBkZWx0YXMgZnJvbSBzZXF1ZW5jZXMgb2YgbGluZXMgb2YgdGV4dC4KKworQ2xhc3MgSHRtbERpZmY6CisgICAgRm9yIHByb2R1Y2luZyBIVE1MIHNpZGUgYnkgc2lkZSBjb21wYXJpc29uIHdpdGggY2hhbmdlIGhpZ2hsaWdodHMuCisiIiIKKworX19hbGxfXyA9IFsnZ2V0X2Nsb3NlX21hdGNoZXMnLCAnbmRpZmYnLCAncmVzdG9yZScsICdTZXF1ZW5jZU1hdGNoZXInLAorICAgICAgICAgICAnRGlmZmVyJywnSVNfQ0hBUkFDVEVSX0pVTksnLCAnSVNfTElORV9KVU5LJywgJ2NvbnRleHRfZGlmZicsCisgICAgICAgICAgICd1bmlmaWVkX2RpZmYnLCAnSHRtbERpZmYnLCAnTWF0Y2gnXQorCitpbXBvcnQgaGVhcHEKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUgYXMgX25hbWVkdHVwbGUKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2UKKworTWF0Y2ggPSBfbmFtZWR0dXBsZSgnTWF0Y2gnLCAnYSBiIHNpemUnKQorCitkZWYgX2NhbGN1bGF0ZV9yYXRpbyhtYXRjaGVzLCBsZW5ndGgpOgorICAgIGlmIGxlbmd0aDoKKyAgICAgICAgcmV0dXJuIDIuMCAqIG1hdGNoZXMgLyBsZW5ndGgKKyAgICByZXR1cm4gMS4wCisKK2NsYXNzIFNlcXVlbmNlTWF0Y2hlcjoKKworICAgICIiIgorICAgIFNlcXVlbmNlTWF0Y2hlciBpcyBhIGZsZXhpYmxlIGNsYXNzIGZvciBjb21wYXJpbmcgcGFpcnMgb2Ygc2VxdWVuY2VzIG9mCisgICAgYW55IHR5cGUsIHNvIGxvbmcgYXMgdGhlIHNlcXVlbmNlIGVsZW1lbnRzIGFyZSBoYXNoYWJsZS4gIFRoZSBiYXNpYworICAgIGFsZ29yaXRobSBwcmVkYXRlcywgYW5kIGlzIGEgbGl0dGxlIGZhbmNpZXIgdGhhbiwgYW4gYWxnb3JpdGhtCisgICAgcHVibGlzaGVkIGluIHRoZSBsYXRlIDE5ODAncyBieSBSYXRjbGlmZiBhbmQgT2JlcnNoZWxwIHVuZGVyIHRoZQorICAgIGh5cGVyYm9saWMgbmFtZSAiZ2VzdGFsdCBwYXR0ZXJuIG1hdGNoaW5nIi4gIFRoZSBiYXNpYyBpZGVhIGlzIHRvIGZpbmQKKyAgICB0aGUgbG9uZ2VzdCBjb250aWd1b3VzIG1hdGNoaW5nIHN1YnNlcXVlbmNlIHRoYXQgY29udGFpbnMgbm8gImp1bmsiCisgICAgZWxlbWVudHMgKFItTyBkb2Vzbid0IGFkZHJlc3MganVuaykuICBUaGUgc2FtZSBpZGVhIGlzIHRoZW4gYXBwbGllZAorICAgIHJlY3Vyc2l2ZWx5IHRvIHRoZSBwaWVjZXMgb2YgdGhlIHNlcXVlbmNlcyB0byB0aGUgbGVmdCBhbmQgdG8gdGhlIHJpZ2h0CisgICAgb2YgdGhlIG1hdGNoaW5nIHN1YnNlcXVlbmNlLiAgVGhpcyBkb2VzIG5vdCB5aWVsZCBtaW5pbWFsIGVkaXQKKyAgICBzZXF1ZW5jZXMsIGJ1dCBkb2VzIHRlbmQgdG8geWllbGQgbWF0Y2hlcyB0aGF0ICJsb29rIHJpZ2h0IiB0byBwZW9wbGUuCisKKyAgICBTZXF1ZW5jZU1hdGNoZXIgdHJpZXMgdG8gY29tcHV0ZSBhICJodW1hbi1mcmllbmRseSBkaWZmIiBiZXR3ZWVuIHR3bworICAgIHNlcXVlbmNlcy4gIFVubGlrZSBlLmcuIFVOSVgodG0pIGRpZmYsIHRoZSBmdW5kYW1lbnRhbCBub3Rpb24gaXMgdGhlCisgICAgbG9uZ2VzdCAqY29udGlndW91cyogJiBqdW5rLWZyZWUgbWF0Y2hpbmcgc3Vic2VxdWVuY2UuICBUaGF0J3Mgd2hhdAorICAgIGNhdGNoZXMgcGVvcGxlcycgZXllcy4gIFRoZSBXaW5kb3dzKHRtKSB3aW5kaWZmIGhhcyBhbm90aGVyIGludGVyZXN0aW5nCisgICAgbm90aW9uLCBwYWlyaW5nIHVwIGVsZW1lbnRzIHRoYXQgYXBwZWFyIHVuaXF1ZWx5IGluIGVhY2ggc2VxdWVuY2UuCisgICAgVGhhdCwgYW5kIHRoZSBtZXRob2QgaGVyZSwgYXBwZWFyIHRvIHlpZWxkIG1vcmUgaW50dWl0aXZlIGRpZmZlcmVuY2UKKyAgICByZXBvcnRzIHRoYW4gZG9lcyBkaWZmLiAgVGhpcyBtZXRob2QgYXBwZWFycyB0byBiZSB0aGUgbGVhc3QgdnVsbmVyYWJsZQorICAgIHRvIHN5bmNoaW5nIHVwIG9uIGJsb2NrcyBvZiAianVuayBsaW5lcyIsIHRob3VnaCAobGlrZSBibGFuayBsaW5lcyBpbgorICAgIG9yZGluYXJ5IHRleHQgZmlsZXMsIG9yIG1heWJlICI8UD4iIGxpbmVzIGluIEhUTUwgZmlsZXMpLiAgVGhhdCBtYXkgYmUKKyAgICBiZWNhdXNlIHRoaXMgaXMgdGhlIG9ubHkgbWV0aG9kIG9mIHRoZSAzIHRoYXQgaGFzIGEgKmNvbmNlcHQqIG9mCisgICAgImp1bmsiIDx3aW5rPi4KKworICAgIEV4YW1wbGUsIGNvbXBhcmluZyB0d28gc3RyaW5ncywgYW5kIGNvbnNpZGVyaW5nIGJsYW5rcyB0byBiZSAianVuayI6CisKKyAgICA+Pj4gcyA9IFNlcXVlbmNlTWF0Y2hlcihsYW1iZGEgeDogeCA9PSAiICIsCisgICAgLi4uICAgICAgICAgICAgICAgICAgICAgInByaXZhdGUgVGhyZWFkIGN1cnJlbnRUaHJlYWQ7IiwKKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAicHJpdmF0ZSB2b2xhdGlsZSBUaHJlYWQgY3VycmVudFRocmVhZDsiKQorICAgID4+PgorCisgICAgLnJhdGlvKCkgcmV0dXJucyBhIGZsb2F0IGluIFswLCAxXSwgbWVhc3VyaW5nIHRoZSAic2ltaWxhcml0eSIgb2YgdGhlCisgICAgc2VxdWVuY2VzLiAgQXMgYSBydWxlIG9mIHRodW1iLCBhIC5yYXRpbygpIHZhbHVlIG92ZXIgMC42IG1lYW5zIHRoZQorICAgIHNlcXVlbmNlcyBhcmUgY2xvc2UgbWF0Y2hlczoKKworICAgID4+PiBwcmludCByb3VuZChzLnJhdGlvKCksIDMpCisgICAgMC44NjYKKyAgICA+Pj4KKworICAgIElmIHlvdSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gd2hlcmUgdGhlIHNlcXVlbmNlcyBtYXRjaCwKKyAgICAuZ2V0X21hdGNoaW5nX2Jsb2NrcygpIGlzIGhhbmR5OgorCisgICAgPj4+IGZvciBibG9jayBpbiBzLmdldF9tYXRjaGluZ19ibG9ja3MoKToKKyAgICAuLi4gICAgIHByaW50ICJhWyVkXSBhbmQgYlslZF0gbWF0Y2ggZm9yICVkIGVsZW1lbnRzIiAlIGJsb2NrCisgICAgYVswXSBhbmQgYlswXSBtYXRjaCBmb3IgOCBlbGVtZW50cworICAgIGFbOF0gYW5kIGJbMTddIG1hdGNoIGZvciAyMSBlbGVtZW50cworICAgIGFbMjldIGFuZCBiWzM4XSBtYXRjaCBmb3IgMCBlbGVtZW50cworCisgICAgTm90ZSB0aGF0IHRoZSBsYXN0IHR1cGxlIHJldHVybmVkIGJ5IC5nZXRfbWF0Y2hpbmdfYmxvY2tzKCkgaXMgYWx3YXlzIGEKKyAgICBkdW1teSwgKGxlbihhKSwgbGVuKGIpLCAwKSwgYW5kIHRoaXMgaXMgdGhlIG9ubHkgY2FzZSBpbiB3aGljaCB0aGUgbGFzdAorICAgIHR1cGxlIGVsZW1lbnQgKG51bWJlciBvZiBlbGVtZW50cyBtYXRjaGVkKSBpcyAwLgorCisgICAgSWYgeW91IHdhbnQgdG8ga25vdyBob3cgdG8gY2hhbmdlIHRoZSBmaXJzdCBzZXF1ZW5jZSBpbnRvIHRoZSBzZWNvbmQsCisgICAgdXNlIC5nZXRfb3Bjb2RlcygpOgorCisgICAgPj4+IGZvciBvcGNvZGUgaW4gcy5nZXRfb3Bjb2RlcygpOgorICAgIC4uLiAgICAgcHJpbnQgIiU2cyBhWyVkOiVkXSBiWyVkOiVkXSIgJSBvcGNvZGUKKyAgICAgZXF1YWwgYVswOjhdIGJbMDo4XQorICAgIGluc2VydCBhWzg6OF0gYls4OjE3XQorICAgICBlcXVhbCBhWzg6MjldIGJbMTc6MzhdCisKKyAgICBTZWUgdGhlIERpZmZlciBjbGFzcyBmb3IgYSBmYW5jeSBodW1hbi1mcmllbmRseSBmaWxlIGRpZmZlcmVuY2VyLCB3aGljaAorICAgIHVzZXMgU2VxdWVuY2VNYXRjaGVyIGJvdGggdG8gY29tcGFyZSBzZXF1ZW5jZXMgb2YgbGluZXMsIGFuZCB0byBjb21wYXJlCisgICAgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgd2l0aGluIHNpbWlsYXIgKG5lYXItbWF0Y2hpbmcpIGxpbmVzLgorCisgICAgU2VlIGFsc28gZnVuY3Rpb24gZ2V0X2Nsb3NlX21hdGNoZXMoKSBpbiB0aGlzIG1vZHVsZSwgd2hpY2ggc2hvd3MgaG93CisgICAgc2ltcGxlIGNvZGUgYnVpbGRpbmcgb24gU2VxdWVuY2VNYXRjaGVyIGNhbiBiZSB1c2VkIHRvIGRvIHVzZWZ1bCB3b3JrLgorCisgICAgVGltaW5nOiAgQmFzaWMgUi1PIGlzIGN1YmljIHRpbWUgd29yc3QgY2FzZSBhbmQgcXVhZHJhdGljIHRpbWUgZXhwZWN0ZWQKKyAgICBjYXNlLiAgU2VxdWVuY2VNYXRjaGVyIGlzIHF1YWRyYXRpYyB0aW1lIGZvciB0aGUgd29yc3QgY2FzZSBhbmQgaGFzCisgICAgZXhwZWN0ZWQtY2FzZSBiZWhhdmlvciBkZXBlbmRlbnQgaW4gYSBjb21wbGljYXRlZCB3YXkgb24gaG93IG1hbnkKKyAgICBlbGVtZW50cyB0aGUgc2VxdWVuY2VzIGhhdmUgaW4gY29tbW9uOyBiZXN0IGNhc2UgdGltZSBpcyBsaW5lYXIuCisKKyAgICBNZXRob2RzOgorCisgICAgX19pbml0X18oaXNqdW5rPU5vbmUsIGE9JycsIGI9JycpCisgICAgICAgIENvbnN0cnVjdCBhIFNlcXVlbmNlTWF0Y2hlci4KKworICAgIHNldF9zZXFzKGEsIGIpCisgICAgICAgIFNldCB0aGUgdHdvIHNlcXVlbmNlcyB0byBiZSBjb21wYXJlZC4KKworICAgIHNldF9zZXExKGEpCisgICAgICAgIFNldCB0aGUgZmlyc3Qgc2VxdWVuY2UgdG8gYmUgY29tcGFyZWQuCisKKyAgICBzZXRfc2VxMihiKQorICAgICAgICBTZXQgdGhlIHNlY29uZCBzZXF1ZW5jZSB0byBiZSBjb21wYXJlZC4KKworICAgIGZpbmRfbG9uZ2VzdF9tYXRjaChhbG8sIGFoaSwgYmxvLCBiaGkpCisgICAgICAgIEZpbmQgbG9uZ2VzdCBtYXRjaGluZyBibG9jayBpbiBhW2FsbzphaGldIGFuZCBiW2JsbzpiaGldLgorCisgICAgZ2V0X21hdGNoaW5nX2Jsb2NrcygpCisgICAgICAgIFJldHVybiBsaXN0IG9mIHRyaXBsZXMgZGVzY3JpYmluZyBtYXRjaGluZyBzdWJzZXF1ZW5jZXMuCisKKyAgICBnZXRfb3Bjb2RlcygpCisgICAgICAgIFJldHVybiBsaXN0IG9mIDUtdHVwbGVzIGRlc2NyaWJpbmcgaG93IHRvIHR1cm4gYSBpbnRvIGIuCisKKyAgICByYXRpbygpCisgICAgICAgIFJldHVybiBhIG1lYXN1cmUgb2YgdGhlIHNlcXVlbmNlcycgc2ltaWxhcml0eSAoZmxvYXQgaW4gWzAsMV0pLgorCisgICAgcXVpY2tfcmF0aW8oKQorICAgICAgICBSZXR1cm4gYW4gdXBwZXIgYm91bmQgb24gLnJhdGlvKCkgcmVsYXRpdmVseSBxdWlja2x5LgorCisgICAgcmVhbF9xdWlja19yYXRpbygpCisgICAgICAgIFJldHVybiBhbiB1cHBlciBib3VuZCBvbiByYXRpbygpIHZlcnkgcXVpY2tseS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpc2p1bms9Tm9uZSwgYT0nJywgYj0nJywgYXV0b2p1bms9VHJ1ZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFNlcXVlbmNlTWF0Y2hlci4KKworICAgICAgICBPcHRpb25hbCBhcmcgaXNqdW5rIGlzIE5vbmUgKHRoZSBkZWZhdWx0KSwgb3IgYSBvbmUtYXJndW1lbnQKKyAgICAgICAgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHNlcXVlbmNlIGVsZW1lbnQgYW5kIHJldHVybnMgdHJ1ZSBpZmYgdGhlCisgICAgICAgIGVsZW1lbnQgaXMganVuay4gIE5vbmUgaXMgZXF1aXZhbGVudCB0byBwYXNzaW5nICJsYW1iZGEgeDogMCIsIGkuZS4KKyAgICAgICAgbm8gZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUganVuay4gIEZvciBleGFtcGxlLCBwYXNzCisgICAgICAgICAgICBsYW1iZGEgeDogeCBpbiAiIFxcdCIKKyAgICAgICAgaWYgeW91J3JlIGNvbXBhcmluZyBsaW5lcyBhcyBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycywgYW5kIGRvbid0CisgICAgICAgIHdhbnQgdG8gc3luY2ggdXAgb24gYmxhbmtzIG9yIGhhcmQgdGFicy4KKworICAgICAgICBPcHRpb25hbCBhcmcgYSBpcyB0aGUgZmlyc3Qgb2YgdHdvIHNlcXVlbmNlcyB0byBiZSBjb21wYXJlZC4gIEJ5CisgICAgICAgIGRlZmF1bHQsIGFuIGVtcHR5IHN0cmluZy4gIFRoZSBlbGVtZW50cyBvZiBhIG11c3QgYmUgaGFzaGFibGUuICBTZWUKKyAgICAgICAgYWxzbyAuc2V0X3NlcXMoKSBhbmQgLnNldF9zZXExKCkuCisKKyAgICAgICAgT3B0aW9uYWwgYXJnIGIgaXMgdGhlIHNlY29uZCBvZiB0d28gc2VxdWVuY2VzIHRvIGJlIGNvbXBhcmVkLiAgQnkKKyAgICAgICAgZGVmYXVsdCwgYW4gZW1wdHkgc3RyaW5nLiAgVGhlIGVsZW1lbnRzIG9mIGIgbXVzdCBiZSBoYXNoYWJsZS4gU2VlCisgICAgICAgIGFsc28gLnNldF9zZXFzKCkgYW5kIC5zZXRfc2VxMigpLgorCisgICAgICAgIE9wdGlvbmFsIGFyZyBhdXRvanVuayBzaG91bGQgYmUgc2V0IHRvIEZhbHNlIHRvIGRpc2FibGUgdGhlCisgICAgICAgICJhdXRvbWF0aWMganVuayBoZXVyaXN0aWMiIHRoYXQgdHJlYXRzIHBvcHVsYXIgZWxlbWVudHMgYXMganVuaworICAgICAgICAoc2VlIG1vZHVsZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uKS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBNZW1iZXJzOgorICAgICAgICAjIGEKKyAgICAgICAgIyAgICAgIGZpcnN0IHNlcXVlbmNlCisgICAgICAgICMgYgorICAgICAgICAjICAgICAgc2Vjb25kIHNlcXVlbmNlOyBkaWZmZXJlbmNlcyBhcmUgY29tcHV0ZWQgYXMgIndoYXQgZG8KKyAgICAgICAgIyAgICAgIHdlIG5lZWQgdG8gZG8gdG8gJ2EnIHRvIGNoYW5nZSBpdCBpbnRvICdiJz8iCisgICAgICAgICMgYjJqCisgICAgICAgICMgICAgICBmb3IgeCBpbiBiLCBiMmpbeF0gaXMgYSBsaXN0IG9mIHRoZSBpbmRpY2VzIChpbnRvIGIpCisgICAgICAgICMgICAgICBhdCB3aGljaCB4IGFwcGVhcnM7IGp1bmsgZWxlbWVudHMgZG8gbm90IGFwcGVhcgorICAgICAgICAjIGZ1bGxiY291bnQKKyAgICAgICAgIyAgICAgIGZvciB4IGluIGIsIGZ1bGxiY291bnRbeF0gPT0gdGhlIG51bWJlciBvZiB0aW1lcyB4CisgICAgICAgICMgICAgICBhcHBlYXJzIGluIGI7IG9ubHkgbWF0ZXJpYWxpemVkIGlmIHJlYWxseSBuZWVkZWQgKHVzZWQKKyAgICAgICAgIyAgICAgIG9ubHkgZm9yIGNvbXB1dGluZyBxdWlja19yYXRpbygpKQorICAgICAgICAjIG1hdGNoaW5nX2Jsb2NrcworICAgICAgICAjICAgICAgYSBsaXN0IG9mIChpLCBqLCBrKSB0cmlwbGVzLCB3aGVyZSBhW2k6aStrXSA9PSBiW2o6aitrXTsKKyAgICAgICAgIyAgICAgIGFzY2VuZGluZyAmIG5vbi1vdmVybGFwcGluZyBpbiBpIGFuZCBpbiBqOyB0ZXJtaW5hdGVkIGJ5CisgICAgICAgICMgICAgICBhIGR1bW15IChsZW4oYSksIGxlbihiKSwgMCkgc2VudGluZWwKKyAgICAgICAgIyBvcGNvZGVzCisgICAgICAgICMgICAgICBhIGxpc3Qgb2YgKHRhZywgaTEsIGkyLCBqMSwgajIpIHR1cGxlcywgd2hlcmUgdGFnIGlzCisgICAgICAgICMgICAgICBvbmUgb2YKKyAgICAgICAgIyAgICAgICAgICAncmVwbGFjZScgICBhW2kxOmkyXSBzaG91bGQgYmUgcmVwbGFjZWQgYnkgYltqMTpqMl0KKyAgICAgICAgIyAgICAgICAgICAnZGVsZXRlJyAgICBhW2kxOmkyXSBzaG91bGQgYmUgZGVsZXRlZAorICAgICAgICAjICAgICAgICAgICdpbnNlcnQnICAgIGJbajE6ajJdIHNob3VsZCBiZSBpbnNlcnRlZAorICAgICAgICAjICAgICAgICAgICdlcXVhbCcgICAgIGFbaTE6aTJdID09IGJbajE6ajJdCisgICAgICAgICMgaXNqdW5rCisgICAgICAgICMgICAgICBhIHVzZXItc3VwcGxpZWQgZnVuY3Rpb24gdGFraW5nIGEgc2VxdWVuY2UgZWxlbWVudCBhbmQKKyAgICAgICAgIyAgICAgIHJldHVybmluZyB0cnVlIGlmZiB0aGUgZWxlbWVudCBpcyAianVuayIgLS0gdGhpcyBoYXMKKyAgICAgICAgIyAgICAgIHN1YnRsZSBidXQgaGVscGZ1bCBlZmZlY3RzIG9uIHRoZSBhbGdvcml0aG0sIHdoaWNoIEknbGwKKyAgICAgICAgIyAgICAgIGdldCBhcm91bmQgdG8gd3JpdGluZyB1cCBzb21lZGF5IDwwLjkgd2luaz4uCisgICAgICAgICMgICAgICBET04nVCBVU0UhICBPbmx5IF9fY2hhaW5fYiB1c2VzIHRoaXMuICBVc2UgaXNianVuay4KKyAgICAgICAgIyBpc2JqdW5rCisgICAgICAgICMgICAgICBmb3IgeCBpbiBiLCBpc2JqdW5rKHgpID09IGlzanVuayh4KSBidXQgbXVjaCBmYXN0ZXI7CisgICAgICAgICMgICAgICBpdCdzIHJlYWxseSB0aGUgX19jb250YWluc19fIG1ldGhvZCBvZiBhIGhpZGRlbiBkaWN0LgorICAgICAgICAjICAgICAgRE9FUyBOT1QgV09SSyBmb3IgeCBpbiBhIQorICAgICAgICAjIGlzYnBvcHVsYXIKKyAgICAgICAgIyAgICAgIGZvciB4IGluIGIsIGlzYnBvcHVsYXIoeCkgaXMgdHJ1ZSBpZmYgYiBpcyByZWFzb25hYmx5IGxvbmcKKyAgICAgICAgIyAgICAgIChhdCBsZWFzdCAyMDAgZWxlbWVudHMpIGFuZCB4IGFjY291bnRzIGZvciBtb3JlIHRoYW4gMSArIDElIG9mCisgICAgICAgICMgICAgICBpdHMgZWxlbWVudHMgKHdoZW4gYXV0b2p1bmsgaXMgZW5hYmxlZCkuCisgICAgICAgICMgICAgICBET0VTIE5PVCBXT1JLIGZvciB4IGluIGEhCisKKyAgICAgICAgc2VsZi5pc2p1bmsgPSBpc2p1bmsKKyAgICAgICAgc2VsZi5hID0gc2VsZi5iID0gTm9uZQorICAgICAgICBzZWxmLmF1dG9qdW5rID0gYXV0b2p1bmsKKyAgICAgICAgc2VsZi5zZXRfc2VxcyhhLCBiKQorCisgICAgZGVmIHNldF9zZXFzKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJTZXQgdGhlIHR3byBzZXF1ZW5jZXMgdG8gYmUgY29tcGFyZWQuCisKKyAgICAgICAgPj4+IHMgPSBTZXF1ZW5jZU1hdGNoZXIoKQorICAgICAgICA+Pj4gcy5zZXRfc2VxcygiYWJjZCIsICJiY2RlIikKKyAgICAgICAgPj4+IHMucmF0aW8oKQorICAgICAgICAwLjc1CisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYuc2V0X3NlcTEoYSkKKyAgICAgICAgc2VsZi5zZXRfc2VxMihiKQorCisgICAgZGVmIHNldF9zZXExKHNlbGYsIGEpOgorICAgICAgICAiIiJTZXQgdGhlIGZpcnN0IHNlcXVlbmNlIHRvIGJlIGNvbXBhcmVkLgorCisgICAgICAgIFRoZSBzZWNvbmQgc2VxdWVuY2UgdG8gYmUgY29tcGFyZWQgaXMgbm90IGNoYW5nZWQuCisKKyAgICAgICAgPj4+IHMgPSBTZXF1ZW5jZU1hdGNoZXIoTm9uZSwgImFiY2QiLCAiYmNkZSIpCisgICAgICAgID4+PiBzLnJhdGlvKCkKKyAgICAgICAgMC43NQorICAgICAgICA+Pj4gcy5zZXRfc2VxMSgiYmNkZSIpCisgICAgICAgID4+PiBzLnJhdGlvKCkKKyAgICAgICAgMS4wCisgICAgICAgID4+PgorCisgICAgICAgIFNlcXVlbmNlTWF0Y2hlciBjb21wdXRlcyBhbmQgY2FjaGVzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgICAgICBzZWNvbmQgc2VxdWVuY2UsIHNvIGlmIHlvdSB3YW50IHRvIGNvbXBhcmUgb25lIHNlcXVlbmNlIFMgYWdhaW5zdAorICAgICAgICBtYW55IHNlcXVlbmNlcywgdXNlIC5zZXRfc2VxMihTKSBvbmNlIGFuZCBjYWxsIC5zZXRfc2VxMSh4KQorICAgICAgICByZXBlYXRlZGx5IGZvciBlYWNoIG9mIHRoZSBvdGhlciBzZXF1ZW5jZXMuCisKKyAgICAgICAgU2VlIGFsc28gc2V0X3NlcXMoKSBhbmQgc2V0X3NlcTIoKS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgYSBpcyBzZWxmLmE6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hID0gYQorICAgICAgICBzZWxmLm1hdGNoaW5nX2Jsb2NrcyA9IHNlbGYub3Bjb2RlcyA9IE5vbmUKKworICAgIGRlZiBzZXRfc2VxMihzZWxmLCBiKToKKyAgICAgICAgIiIiU2V0IHRoZSBzZWNvbmQgc2VxdWVuY2UgdG8gYmUgY29tcGFyZWQuCisKKyAgICAgICAgVGhlIGZpcnN0IHNlcXVlbmNlIHRvIGJlIGNvbXBhcmVkIGlzIG5vdCBjaGFuZ2VkLgorCisgICAgICAgID4+PiBzID0gU2VxdWVuY2VNYXRjaGVyKE5vbmUsICJhYmNkIiwgImJjZGUiKQorICAgICAgICA+Pj4gcy5yYXRpbygpCisgICAgICAgIDAuNzUKKyAgICAgICAgPj4+IHMuc2V0X3NlcTIoImFiY2QiKQorICAgICAgICA+Pj4gcy5yYXRpbygpCisgICAgICAgIDEuMAorICAgICAgICA+Pj4KKworICAgICAgICBTZXF1ZW5jZU1hdGNoZXIgY29tcHV0ZXMgYW5kIGNhY2hlcyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICAgICAgc2Vjb25kIHNlcXVlbmNlLCBzbyBpZiB5b3Ugd2FudCB0byBjb21wYXJlIG9uZSBzZXF1ZW5jZSBTIGFnYWluc3QKKyAgICAgICAgbWFueSBzZXF1ZW5jZXMsIHVzZSAuc2V0X3NlcTIoUykgb25jZSBhbmQgY2FsbCAuc2V0X3NlcTEoeCkKKyAgICAgICAgcmVwZWF0ZWRseSBmb3IgZWFjaCBvZiB0aGUgb3RoZXIgc2VxdWVuY2VzLgorCisgICAgICAgIFNlZSBhbHNvIHNldF9zZXFzKCkgYW5kIHNldF9zZXExKCkuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGIgaXMgc2VsZi5iOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYiA9IGIKKyAgICAgICAgc2VsZi5tYXRjaGluZ19ibG9ja3MgPSBzZWxmLm9wY29kZXMgPSBOb25lCisgICAgICAgIHNlbGYuZnVsbGJjb3VudCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2NoYWluX2IoKQorCisgICAgIyBGb3IgZWFjaCBlbGVtZW50IHggaW4gYiwgc2V0IGIyalt4XSB0byBhIGxpc3Qgb2YgdGhlIGluZGljZXMgaW4KKyAgICAjIGIgd2hlcmUgeCBhcHBlYXJzOyB0aGUgaW5kaWNlcyBhcmUgaW4gaW5jcmVhc2luZyBvcmRlcjsgbm90ZSB0aGF0CisgICAgIyB0aGUgbnVtYmVyIG9mIHRpbWVzIHggYXBwZWFycyBpbiBiIGlzIGxlbihiMmpbeF0pIC4uLgorICAgICMgd2hlbiBzZWxmLmlzanVuayBpcyBkZWZpbmVkLCBqdW5rIGVsZW1lbnRzIGRvbid0IHNob3cgdXAgaW4gdGhpcworICAgICMgbWFwIGF0IGFsbCwgd2hpY2ggc3RvcHMgdGhlIGNlbnRyYWwgZmluZF9sb25nZXN0X21hdGNoIG1ldGhvZAorICAgICMgZnJvbSBzdGFydGluZyBhbnkgbWF0Y2hpbmcgYmxvY2sgYXQgYSBqdW5rIGVsZW1lbnQgLi4uCisgICAgIyBhbHNvIGNyZWF0ZXMgdGhlIGZhc3QgaXNianVuayBmdW5jdGlvbiAuLi4KKyAgICAjIGIyaiBhbHNvIGRvZXMgbm90IGNvbnRhaW4gZW50cmllcyBmb3IgInBvcHVsYXIiIGVsZW1lbnRzLCBtZWFuaW5nCisgICAgIyBlbGVtZW50cyB0aGF0IGFjY291bnQgZm9yIG1vcmUgdGhhbiAxICsgMSUgb2YgdGhlIHRvdGFsIGVsZW1lbnRzLCBhbmQKKyAgICAjIHdoZW4gdGhlIHNlcXVlbmNlIGlzIHJlYXNvbmFibHkgbGFyZ2UgKD49IDIwMCBlbGVtZW50cyk7IHRoaXMgY2FuCisgICAgIyBiZSB2aWV3ZWQgYXMgYW4gYWRhcHRpdmUgbm90aW9uIG9mIHNlbWktanVuaywgYW5kIHlpZWxkcyBhbiBlbm9ybW91cworICAgICMgc3BlZWR1cCB3aGVuLCBlLmcuLCBjb21wYXJpbmcgcHJvZ3JhbSBmaWxlcyB3aXRoIGh1bmRyZWRzIG9mCisgICAgIyBpbnN0YW5jZXMgb2YgInJldHVybiBOVUxMOyIgLi4uCisgICAgIyBub3RlIHRoYXQgdGhpcyBpcyBvbmx5IGNhbGxlZCB3aGVuIGIgY2hhbmdlczsgc28gZm9yIGNyb3NzLXByb2R1Y3QKKyAgICAjIGtpbmRzIG9mIG1hdGNoZXMsIGl0J3MgYmVzdCB0byBjYWxsIHNldF9zZXEyIG9uY2UsIHRoZW4gc2V0X3NlcTEKKyAgICAjIHJlcGVhdGVkbHkKKworICAgIGRlZiBfX2NoYWluX2Ioc2VsZik6CisgICAgICAgICMgQmVjYXVzZSBpc2p1bmsgaXMgYSB1c2VyLWRlZmluZWQgKG5vdCBDKSBmdW5jdGlvbiwgYW5kIHdlIHRlc3QKKyAgICAgICAgIyBmb3IganVuayBhIExPVCwgaXQncyBpbXBvcnRhbnQgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBjYWxscy4KKyAgICAgICAgIyBCZWZvcmUgdGhlIHRyaWNrcyBkZXNjcmliZWQgaGVyZSwgX19jaGFpbl9iIHdhcyBieSBmYXIgdGhlIG1vc3QKKyAgICAgICAgIyB0aW1lLWNvbnN1bWluZyByb3V0aW5lIGluIHRoZSB3aG9sZSBtb2R1bGUhICBJZiBhbnlvbmUgc2VlcworICAgICAgICAjIEppbSBSb3NraW5kLCB0aGFuayBoaW0gYWdhaW4gZm9yIHByb2ZpbGUucHkgLS0gSSBuZXZlciB3b3VsZAorICAgICAgICAjIGhhdmUgZ3Vlc3NlZCB0aGF0LgorICAgICAgICAjIFRoZSBmaXJzdCB0cmljayBpcyB0byBidWlsZCBiMmogaWdub3JpbmcgdGhlIHBvc3NpYmlsaXR5CisgICAgICAgICMgb2YganVuay4gIEkuZS4sIHdlIGRvbid0IGNhbGwgaXNqdW5rIGF0IGFsbCB5ZXQuICBUaHJvd2luZworICAgICAgICAjIG91dCB0aGUganVuayBsYXRlciBpcyBtdWNoIGNoZWFwZXIgdGhhbiBidWlsZGluZyBiMmogInJpZ2h0IgorICAgICAgICAjIGZyb20gdGhlIHN0YXJ0LgorICAgICAgICBiID0gc2VsZi5iCisgICAgICAgIHNlbGYuYjJqID0gYjJqID0ge30KKworICAgICAgICBmb3IgaSwgZWx0IGluIGVudW1lcmF0ZShiKToKKyAgICAgICAgICAgIGluZGljZXMgPSBiMmouc2V0ZGVmYXVsdChlbHQsIFtdKQorICAgICAgICAgICAgaW5kaWNlcy5hcHBlbmQoaSkKKworICAgICAgICAjIFB1cmdlIGp1bmsgZWxlbWVudHMKKyAgICAgICAganVuayA9IHNldCgpCisgICAgICAgIGlzanVuayA9IHNlbGYuaXNqdW5rCisgICAgICAgIGlmIGlzanVuazoKKyAgICAgICAgICAgIGZvciBlbHQgaW4gbGlzdChiMmoua2V5cygpKTogICMgdXNpbmcgbGlzdCgpIHNpbmNlIGIyaiBpcyBtb2RpZmllZAorICAgICAgICAgICAgICAgIGlmIGlzanVuayhlbHQpOgorICAgICAgICAgICAgICAgICAgICBqdW5rLmFkZChlbHQpCisgICAgICAgICAgICAgICAgICAgIGRlbCBiMmpbZWx0XQorCisgICAgICAgICMgUHVyZ2UgcG9wdWxhciBlbGVtZW50cyB0aGF0IGFyZSBub3QganVuaworICAgICAgICBwb3B1bGFyID0gc2V0KCkKKyAgICAgICAgbiA9IGxlbihiKQorICAgICAgICBpZiBzZWxmLmF1dG9qdW5rIGFuZCBuID49IDIwMDoKKyAgICAgICAgICAgIG50ZXN0ID0gbiAvLyAxMDAgKyAxCisgICAgICAgICAgICBmb3IgZWx0LCBpZHhzIGluIGxpc3QoYjJqLml0ZW1zKCkpOgorICAgICAgICAgICAgICAgIGlmIGxlbihpZHhzKSA+IG50ZXN0OgorICAgICAgICAgICAgICAgICAgICBwb3B1bGFyLmFkZChlbHQpCisgICAgICAgICAgICAgICAgICAgIGRlbCBiMmpbZWx0XQorCisgICAgICAgICMgTm93IGZvciB4IGluIGIsIGlzanVuayh4KSA9PSB4IGluIGp1bmssIGJ1dCB0aGUgbGF0dGVyIGlzIG11Y2ggZmFzdGVyLgorICAgICAgICAjIFNpY25lIHRoZSBudW1iZXIgb2YgKnVuaXF1ZSoganVuayBlbGVtZW50cyBpcyBwcm9iYWJseSBzbWFsbCwgdGhlCisgICAgICAgICMgbWVtb3J5IGJ1cmRlbiBvZiBrZWVwaW5nIHRoaXMgc2V0IGFsaXZlIGlzIGxpa2VseSB0cml2aWFsIGNvbXBhcmVkIHRvCisgICAgICAgICMgdGhlIHNpemUgb2YgYjJqLgorICAgICAgICBzZWxmLmlzYmp1bmsgPSBqdW5rLl9fY29udGFpbnNfXworICAgICAgICBzZWxmLmlzYnBvcHVsYXIgPSBwb3B1bGFyLl9fY29udGFpbnNfXworCisgICAgZGVmIGZpbmRfbG9uZ2VzdF9tYXRjaChzZWxmLCBhbG8sIGFoaSwgYmxvLCBiaGkpOgorICAgICAgICAiIiJGaW5kIGxvbmdlc3QgbWF0Y2hpbmcgYmxvY2sgaW4gYVthbG86YWhpXSBhbmQgYltibG86YmhpXS4KKworICAgICAgICBJZiBpc2p1bmsgaXMgbm90IGRlZmluZWQ6CisKKyAgICAgICAgUmV0dXJuIChpLGosaykgc3VjaCB0aGF0IGFbaTppK2tdIGlzIGVxdWFsIHRvIGJbajpqK2tdLCB3aGVyZQorICAgICAgICAgICAgYWxvIDw9IGkgPD0gaStrIDw9IGFoaQorICAgICAgICAgICAgYmxvIDw9IGogPD0gaitrIDw9IGJoaQorICAgICAgICBhbmQgZm9yIGFsbCAoaScsaicsaycpIG1lZXRpbmcgdGhvc2UgY29uZGl0aW9ucywKKyAgICAgICAgICAgIGsgPj0gaycKKyAgICAgICAgICAgIGkgPD0gaScKKyAgICAgICAgICAgIGFuZCBpZiBpID09IGknLCBqIDw9IGonCisKKyAgICAgICAgSW4gb3RoZXIgd29yZHMsIG9mIGFsbCBtYXhpbWFsIG1hdGNoaW5nIGJsb2NrcywgcmV0dXJuIG9uZSB0aGF0CisgICAgICAgIHN0YXJ0cyBlYXJsaWVzdCBpbiBhLCBhbmQgb2YgYWxsIHRob3NlIG1heGltYWwgbWF0Y2hpbmcgYmxvY2tzIHRoYXQKKyAgICAgICAgc3RhcnQgZWFybGllc3QgaW4gYSwgcmV0dXJuIHRoZSBvbmUgdGhhdCBzdGFydHMgZWFybGllc3QgaW4gYi4KKworICAgICAgICA+Pj4gcyA9IFNlcXVlbmNlTWF0Y2hlcihOb25lLCAiIGFiY2QiLCAiYWJjZCBhYmNkIikKKyAgICAgICAgPj4+IHMuZmluZF9sb25nZXN0X21hdGNoKDAsIDUsIDAsIDkpCisgICAgICAgIE1hdGNoKGE9MCwgYj00LCBzaXplPTUpCisKKyAgICAgICAgSWYgaXNqdW5rIGlzIGRlZmluZWQsIGZpcnN0IHRoZSBsb25nZXN0IG1hdGNoaW5nIGJsb2NrIGlzCisgICAgICAgIGRldGVybWluZWQgYXMgYWJvdmUsIGJ1dCB3aXRoIHRoZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9uIHRoYXQgbm8KKyAgICAgICAganVuayBlbGVtZW50IGFwcGVhcnMgaW4gdGhlIGJsb2NrLiAgVGhlbiB0aGF0IGJsb2NrIGlzIGV4dGVuZGVkIGFzCisgICAgICAgIGZhciBhcyBwb3NzaWJsZSBieSBtYXRjaGluZyAob25seSkganVuayBlbGVtZW50cyBvbiBib3RoIHNpZGVzLiAgU28KKyAgICAgICAgdGhlIHJlc3VsdGluZyBibG9jayBuZXZlciBtYXRjaGVzIG9uIGp1bmsgZXhjZXB0IGFzIGlkZW50aWNhbCBqdW5rCisgICAgICAgIGhhcHBlbnMgdG8gYmUgYWRqYWNlbnQgdG8gYW4gImludGVyZXN0aW5nIiBtYXRjaC4KKworICAgICAgICBIZXJlJ3MgdGhlIHNhbWUgZXhhbXBsZSBhcyBiZWZvcmUsIGJ1dCBjb25zaWRlcmluZyBibGFua3MgdG8gYmUKKyAgICAgICAganVuay4gIFRoYXQgcHJldmVudHMgIiBhYmNkIiBmcm9tIG1hdGNoaW5nIHRoZSAiIGFiY2QiIGF0IHRoZSB0YWlsCisgICAgICAgIGVuZCBvZiB0aGUgc2Vjb25kIHNlcXVlbmNlIGRpcmVjdGx5LiAgSW5zdGVhZCBvbmx5IHRoZSAiYWJjZCIgY2FuCisgICAgICAgIG1hdGNoLCBhbmQgbWF0Y2hlcyB0aGUgbGVmdG1vc3QgImFiY2QiIGluIHRoZSBzZWNvbmQgc2VxdWVuY2U6CisKKyAgICAgICAgPj4+IHMgPSBTZXF1ZW5jZU1hdGNoZXIobGFtYmRhIHg6IHg9PSIgIiwgIiBhYmNkIiwgImFiY2QgYWJjZCIpCisgICAgICAgID4+PiBzLmZpbmRfbG9uZ2VzdF9tYXRjaCgwLCA1LCAwLCA5KQorICAgICAgICBNYXRjaChhPTEsIGI9MCwgc2l6ZT00KQorCisgICAgICAgIElmIG5vIGJsb2NrcyBtYXRjaCwgcmV0dXJuIChhbG8sIGJsbywgMCkuCisKKyAgICAgICAgPj4+IHMgPSBTZXF1ZW5jZU1hdGNoZXIoTm9uZSwgImFiIiwgImMiKQorICAgICAgICA+Pj4gcy5maW5kX2xvbmdlc3RfbWF0Y2goMCwgMiwgMCwgMSkKKyAgICAgICAgTWF0Y2goYT0wLCBiPTAsIHNpemU9MCkKKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBDQVVUSU9OOiAgc3RyaXBwaW5nIGNvbW1vbiBwcmVmaXggb3Igc3VmZml4IHdvdWxkIGJlIGluY29ycmVjdC4KKyAgICAgICAgIyBFLmcuLAorICAgICAgICAjICAgIGFiCisgICAgICAgICMgICAgYWNhYgorICAgICAgICAjIExvbmdlc3QgbWF0Y2hpbmcgYmxvY2sgaXMgImFiIiwgYnV0IGlmIGNvbW1vbiBwcmVmaXggaXMKKyAgICAgICAgIyBzdHJpcHBlZCwgaXQncyAiYSIgKHRpZWQgd2l0aCAiYiIpLiAgVU5JWCh0bSkgZGlmZiBkb2VzIHNvCisgICAgICAgICMgc3RyaXAsIHNvIGVuZHMgdXAgY2xhaW1pbmcgdGhhdCBhYiBpcyBjaGFuZ2VkIHRvIGFjYWIgYnkKKyAgICAgICAgIyBpbnNlcnRpbmcgImNhIiBpbiB0aGUgbWlkZGxlLiAgVGhhdCdzIG1pbmltYWwgYnV0IHVuaW50dWl0aXZlOgorICAgICAgICAjICJpdCdzIG9idmlvdXMiIHRoYXQgc29tZW9uZSBpbnNlcnRlZCAiYWMiIGF0IHRoZSBmcm9udC4KKyAgICAgICAgIyBXaW5kaWZmIGVuZHMgdXAgYXQgdGhlIHNhbWUgcGxhY2UgYXMgZGlmZiwgYnV0IGJ5IHBhaXJpbmcgdXAKKyAgICAgICAgIyB0aGUgdW5pcXVlICdiJ3MgYW5kIHRoZW4gbWF0Y2hpbmcgdGhlIGZpcnN0IHR3byAnYSdzLgorCisgICAgICAgIGEsIGIsIGIyaiwgaXNianVuayA9IHNlbGYuYSwgc2VsZi5iLCBzZWxmLmIyaiwgc2VsZi5pc2JqdW5rCisgICAgICAgIGJlc3RpLCBiZXN0aiwgYmVzdHNpemUgPSBhbG8sIGJsbywgMAorICAgICAgICAjIGZpbmQgbG9uZ2VzdCBqdW5rLWZyZWUgbWF0Y2gKKyAgICAgICAgIyBkdXJpbmcgYW4gaXRlcmF0aW9uIG9mIHRoZSBsb29wLCBqMmxlbltqXSA9IGxlbmd0aCBvZiBsb25nZXN0CisgICAgICAgICMganVuay1mcmVlIG1hdGNoIGVuZGluZyB3aXRoIGFbaS0xXSBhbmQgYltqXQorICAgICAgICBqMmxlbiA9IHt9CisgICAgICAgIG5vdGhpbmcgPSBbXQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoYWxvLCBhaGkpOgorICAgICAgICAgICAgIyBsb29rIGF0IGFsbCBpbnN0YW5jZXMgb2YgYVtpXSBpbiBiOyBub3RlIHRoYXQgYmVjYXVzZQorICAgICAgICAgICAgIyBiMmogaGFzIG5vIGp1bmsga2V5cywgdGhlIGxvb3AgaXMgc2tpcHBlZCBpZiBhW2ldIGlzIGp1bmsKKyAgICAgICAgICAgIGoybGVuZ2V0ID0gajJsZW4uZ2V0CisgICAgICAgICAgICBuZXdqMmxlbiA9IHt9CisgICAgICAgICAgICBmb3IgaiBpbiBiMmouZ2V0KGFbaV0sIG5vdGhpbmcpOgorICAgICAgICAgICAgICAgICMgYVtpXSBtYXRjaGVzIGJbal0KKyAgICAgICAgICAgICAgICBpZiBqIDwgYmxvOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGogPj0gYmhpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGsgPSBuZXdqMmxlbltqXSA9IGoybGVuZ2V0KGotMSwgMCkgKyAxCisgICAgICAgICAgICAgICAgaWYgayA+IGJlc3RzaXplOgorICAgICAgICAgICAgICAgICAgICBiZXN0aSwgYmVzdGosIGJlc3RzaXplID0gaS1rKzEsIGotaysxLCBrCisgICAgICAgICAgICBqMmxlbiA9IG5ld2oybGVuCisKKyAgICAgICAgIyBFeHRlbmQgdGhlIGJlc3QgYnkgbm9uLWp1bmsgZWxlbWVudHMgb24gZWFjaCBlbmQuICBJbiBwYXJ0aWN1bGFyLAorICAgICAgICAjICJwb3B1bGFyIiBub24tanVuayBlbGVtZW50cyBhcmVuJ3QgaW4gYjJqLCB3aGljaCBncmVhdGx5IHNwZWVkcworICAgICAgICAjIHRoZSBpbm5lciBsb29wIGFib3ZlLCBidXQgYWxzbyBtZWFucyAidGhlIGJlc3QiIG1hdGNoIHNvIGZhcgorICAgICAgICAjIGRvZXNuJ3QgY29udGFpbiBhbnkganVuayAqb3IqIHBvcHVsYXIgbm9uLWp1bmsgZWxlbWVudHMuCisgICAgICAgIHdoaWxlIGJlc3RpID4gYWxvIGFuZCBiZXN0aiA+IGJsbyBhbmQgXAorICAgICAgICAgICAgICBub3QgaXNianVuayhiW2Jlc3RqLTFdKSBhbmQgXAorICAgICAgICAgICAgICBhW2Jlc3RpLTFdID09IGJbYmVzdGotMV06CisgICAgICAgICAgICBiZXN0aSwgYmVzdGosIGJlc3RzaXplID0gYmVzdGktMSwgYmVzdGotMSwgYmVzdHNpemUrMQorICAgICAgICB3aGlsZSBiZXN0aStiZXN0c2l6ZSA8IGFoaSBhbmQgYmVzdGorYmVzdHNpemUgPCBiaGkgYW5kIFwKKyAgICAgICAgICAgICAgbm90IGlzYmp1bmsoYltiZXN0aitiZXN0c2l6ZV0pIGFuZCBcCisgICAgICAgICAgICAgIGFbYmVzdGkrYmVzdHNpemVdID09IGJbYmVzdGorYmVzdHNpemVdOgorICAgICAgICAgICAgYmVzdHNpemUgKz0gMQorCisgICAgICAgICMgTm93IHRoYXQgd2UgaGF2ZSBhIHdob2xseSBpbnRlcmVzdGluZyBtYXRjaCAoYWxiZWl0IHBvc3NpYmx5CisgICAgICAgICMgZW1wdHkhKSwgd2UgbWF5IGFzIHdlbGwgc3VjayB1cCB0aGUgbWF0Y2hpbmcganVuayBvbiBlYWNoCisgICAgICAgICMgc2lkZSBvZiBpdCB0b28uICBDYW4ndCB0aGluayBvZiBhIGdvb2QgcmVhc29uIG5vdCB0bywgYW5kIGl0CisgICAgICAgICMgc2F2ZXMgcG9zdC1wcm9jZXNzaW5nIHRoZSAocG9zc2libHkgY29uc2lkZXJhYmxlKSBleHBlbnNlIG9mCisgICAgICAgICMgZmlndXJpbmcgb3V0IHdoYXQgdG8gZG8gd2l0aCBpdC4gIEluIHRoZSBjYXNlIG9mIGFuIGVtcHR5CisgICAgICAgICMgaW50ZXJlc3RpbmcgbWF0Y2gsIHRoaXMgaXMgY2xlYXJseSB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sCisgICAgICAgICMgYmVjYXVzZSBubyBvdGhlciBraW5kIG9mIG1hdGNoIGlzIHBvc3NpYmxlIGluIHRoZSByZWdpb25zLgorICAgICAgICB3aGlsZSBiZXN0aSA+IGFsbyBhbmQgYmVzdGogPiBibG8gYW5kIFwKKyAgICAgICAgICAgICAgaXNianVuayhiW2Jlc3RqLTFdKSBhbmQgXAorICAgICAgICAgICAgICBhW2Jlc3RpLTFdID09IGJbYmVzdGotMV06CisgICAgICAgICAgICBiZXN0aSwgYmVzdGosIGJlc3RzaXplID0gYmVzdGktMSwgYmVzdGotMSwgYmVzdHNpemUrMQorICAgICAgICB3aGlsZSBiZXN0aStiZXN0c2l6ZSA8IGFoaSBhbmQgYmVzdGorYmVzdHNpemUgPCBiaGkgYW5kIFwKKyAgICAgICAgICAgICAgaXNianVuayhiW2Jlc3RqK2Jlc3RzaXplXSkgYW5kIFwKKyAgICAgICAgICAgICAgYVtiZXN0aStiZXN0c2l6ZV0gPT0gYltiZXN0aitiZXN0c2l6ZV06CisgICAgICAgICAgICBiZXN0c2l6ZSA9IGJlc3RzaXplICsgMQorCisgICAgICAgIHJldHVybiBNYXRjaChiZXN0aSwgYmVzdGosIGJlc3RzaXplKQorCisgICAgZGVmIGdldF9tYXRjaGluZ19ibG9ja3Moc2VsZik6CisgICAgICAgICIiIlJldHVybiBsaXN0IG9mIHRyaXBsZXMgZGVzY3JpYmluZyBtYXRjaGluZyBzdWJzZXF1ZW5jZXMuCisKKyAgICAgICAgRWFjaCB0cmlwbGUgaXMgb2YgdGhlIGZvcm0gKGksIGosIG4pLCBhbmQgbWVhbnMgdGhhdAorICAgICAgICBhW2k6aStuXSA9PSBiW2o6aituXS4gIFRoZSB0cmlwbGVzIGFyZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgaW4KKyAgICAgICAgaSBhbmQgaW4gai4gIE5ldyBpbiBQeXRob24gMi41LCBpdCdzIGFsc28gZ3VhcmFudGVlZCB0aGF0IGlmCisgICAgICAgIChpLCBqLCBuKSBhbmQgKGknLCBqJywgbicpIGFyZSBhZGphY2VudCB0cmlwbGVzIGluIHRoZSBsaXN0LCBhbmQKKyAgICAgICAgdGhlIHNlY29uZCBpcyBub3QgdGhlIGxhc3QgdHJpcGxlIGluIHRoZSBsaXN0LCB0aGVuIGkrbiAhPSBpJyBvcgorICAgICAgICBqK24gIT0gaicuICBJT1csIGFkamFjZW50IHRyaXBsZXMgbmV2ZXIgZGVzY3JpYmUgYWRqYWNlbnQgZXF1YWwKKyAgICAgICAgYmxvY2tzLgorCisgICAgICAgIFRoZSBsYXN0IHRyaXBsZSBpcyBhIGR1bW15LCAobGVuKGEpLCBsZW4oYiksIDApLCBhbmQgaXMgdGhlIG9ubHkKKyAgICAgICAgdHJpcGxlIHdpdGggbj09MC4KKworICAgICAgICA+Pj4gcyA9IFNlcXVlbmNlTWF0Y2hlcihOb25lLCAiYWJ4Y2QiLCAiYWJjZCIpCisgICAgICAgID4+PiBzLmdldF9tYXRjaGluZ19ibG9ja3MoKQorICAgICAgICBbTWF0Y2goYT0wLCBiPTAsIHNpemU9MiksIE1hdGNoKGE9MywgYj0yLCBzaXplPTIpLCBNYXRjaChhPTUsIGI9NCwgc2l6ZT0wKV0KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgc2VsZi5tYXRjaGluZ19ibG9ja3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5tYXRjaGluZ19ibG9ja3MKKyAgICAgICAgbGEsIGxiID0gbGVuKHNlbGYuYSksIGxlbihzZWxmLmIpCisKKyAgICAgICAgIyBUaGlzIGlzIG1vc3QgbmF0dXJhbGx5IGV4cHJlc3NlZCBhcyBhIHJlY3Vyc2l2ZSBhbGdvcml0aG0sIGJ1dAorICAgICAgICAjIGF0IGxlYXN0IG9uZSB1c2VyIGJ1bXBlZCBpbnRvIGV4dHJlbWUgdXNlIGNhc2VzIHRoYXQgZXhjZWVkZWQKKyAgICAgICAgIyB0aGUgcmVjdXJzaW9uIGxpbWl0IG9uIHRoZWlyIGJveC4gIFNvLCBub3cgd2UgbWFpbnRhaW4gYSBsaXN0CisgICAgICAgICMgKCdxdWV1ZWApIG9mIGJsb2NrcyB3ZSBzdGlsbCBuZWVkIHRvIGxvb2sgYXQsIGFuZCBhcHBlbmQgcGFydGlhbAorICAgICAgICAjIHJlc3VsdHMgdG8gYG1hdGNoaW5nX2Jsb2Nrc2AgaW4gYSBsb29wOyB0aGUgbWF0Y2hlcyBhcmUgc29ydGVkCisgICAgICAgICMgYXQgdGhlIGVuZC4KKyAgICAgICAgcXVldWUgPSBbKDAsIGxhLCAwLCBsYildCisgICAgICAgIG1hdGNoaW5nX2Jsb2NrcyA9IFtdCisgICAgICAgIHdoaWxlIHF1ZXVlOgorICAgICAgICAgICAgYWxvLCBhaGksIGJsbywgYmhpID0gcXVldWUucG9wKCkKKyAgICAgICAgICAgIGksIGosIGsgPSB4ID0gc2VsZi5maW5kX2xvbmdlc3RfbWF0Y2goYWxvLCBhaGksIGJsbywgYmhpKQorICAgICAgICAgICAgIyBhW2FsbzppXSB2cyBiW2JsbzpqXSB1bmtub3duCisgICAgICAgICAgICAjIGFbaTppK2tdIHNhbWUgYXMgYltqOmora10KKyAgICAgICAgICAgICMgYVtpK2s6YWhpXSB2cyBiW2orazpiaGldIHVua25vd24KKyAgICAgICAgICAgIGlmIGs6ICAgIyBpZiBrIGlzIDAsIHRoZXJlIHdhcyBubyBtYXRjaGluZyBibG9jaworICAgICAgICAgICAgICAgIG1hdGNoaW5nX2Jsb2Nrcy5hcHBlbmQoeCkKKyAgICAgICAgICAgICAgICBpZiBhbG8gPCBpIGFuZCBibG8gPCBqOgorICAgICAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQoKGFsbywgaSwgYmxvLCBqKSkKKyAgICAgICAgICAgICAgICBpZiBpK2sgPCBhaGkgYW5kIGorayA8IGJoaToKKyAgICAgICAgICAgICAgICAgICAgcXVldWUuYXBwZW5kKChpK2ssIGFoaSwgaitrLCBiaGkpKQorICAgICAgICBtYXRjaGluZ19ibG9ja3Muc29ydCgpCisKKyAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZSBhZGphY2VudCBlcXVhbCBibG9ja3MgaW4gdGhlCisgICAgICAgICMgbWF0Y2hpbmdfYmxvY2tzIGxpc3Qgbm93LiAgU3RhcnRpbmcgd2l0aCAyLjUsIHRoaXMgY29kZSB3YXMgYWRkZWQKKyAgICAgICAgIyB0byBjb2xsYXBzZSB0aGVtLgorICAgICAgICBpMSA9IGoxID0gazEgPSAwCisgICAgICAgIG5vbl9hZGphY2VudCA9IFtdCisgICAgICAgIGZvciBpMiwgajIsIGsyIGluIG1hdGNoaW5nX2Jsb2NrczoKKyAgICAgICAgICAgICMgSXMgdGhpcyBibG9jayBhZGphY2VudCB0byBpMSwgajEsIGsxPworICAgICAgICAgICAgaWYgaTEgKyBrMSA9PSBpMiBhbmQgajEgKyBrMSA9PSBqMjoKKyAgICAgICAgICAgICAgICAjIFllcywgc28gY29sbGFwc2UgdGhlbSAtLSB0aGlzIGp1c3QgaW5jcmVhc2VzIHRoZSBsZW5ndGggb2YKKyAgICAgICAgICAgICAgICAjIHRoZSBmaXJzdCBibG9jayBieSB0aGUgbGVuZ3RoIG9mIHRoZSBzZWNvbmQsIGFuZCB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAjIGJsb2NrIHNvIGxlbmd0aGVuZWQgcmVtYWlucyB0aGUgYmxvY2sgdG8gY29tcGFyZSBhZ2FpbnN0LgorICAgICAgICAgICAgICAgIGsxICs9IGsyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgTm90IGFkamFjZW50LiAgUmVtZW1iZXIgdGhlIGZpcnN0IGJsb2NrIChrMT09MCBtZWFucyBpdCdzCisgICAgICAgICAgICAgICAgIyB0aGUgZHVtbXkgd2Ugc3RhcnRlZCB3aXRoKSwgYW5kIG1ha2UgdGhlIHNlY29uZCBibG9jayB0aGUKKyAgICAgICAgICAgICAgICAjIG5ldyBibG9jayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgICAgICAgICAgaWYgazE6CisgICAgICAgICAgICAgICAgICAgIG5vbl9hZGphY2VudC5hcHBlbmQoKGkxLCBqMSwgazEpKQorICAgICAgICAgICAgICAgIGkxLCBqMSwgazEgPSBpMiwgajIsIGsyCisgICAgICAgIGlmIGsxOgorICAgICAgICAgICAgbm9uX2FkamFjZW50LmFwcGVuZCgoaTEsIGoxLCBrMSkpCisKKyAgICAgICAgbm9uX2FkamFjZW50LmFwcGVuZCggKGxhLCBsYiwgMCkgKQorICAgICAgICBzZWxmLm1hdGNoaW5nX2Jsb2NrcyA9IG5vbl9hZGphY2VudAorICAgICAgICByZXR1cm4gbWFwKE1hdGNoLl9tYWtlLCBzZWxmLm1hdGNoaW5nX2Jsb2NrcykKKworICAgIGRlZiBnZXRfb3Bjb2RlcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgNS10dXBsZXMgZGVzY3JpYmluZyBob3cgdG8gdHVybiBhIGludG8gYi4KKworICAgICAgICBFYWNoIHR1cGxlIGlzIG9mIHRoZSBmb3JtICh0YWcsIGkxLCBpMiwgajEsIGoyKS4gIFRoZSBmaXJzdCB0dXBsZQorICAgICAgICBoYXMgaTEgPT0gajEgPT0gMCwgYW5kIHJlbWFpbmluZyB0dXBsZXMgaGF2ZSBpMSA9PSB0aGUgaTIgZnJvbSB0aGUKKyAgICAgICAgdHVwbGUgcHJlY2VkaW5nIGl0LCBhbmQgbGlrZXdpc2UgZm9yIGoxID09IHRoZSBwcmV2aW91cyBqMi4KKworICAgICAgICBUaGUgdGFncyBhcmUgc3RyaW5ncywgd2l0aCB0aGVzZSBtZWFuaW5nczoKKworICAgICAgICAncmVwbGFjZSc6ICBhW2kxOmkyXSBzaG91bGQgYmUgcmVwbGFjZWQgYnkgYltqMTpqMl0KKyAgICAgICAgJ2RlbGV0ZSc6ICAgYVtpMTppMl0gc2hvdWxkIGJlIGRlbGV0ZWQuCisgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBqMT09ajIgaW4gdGhpcyBjYXNlLgorICAgICAgICAnaW5zZXJ0JzogICBiW2oxOmoyXSBzaG91bGQgYmUgaW5zZXJ0ZWQgYXQgYVtpMTppMV0uCisgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBpMT09aTIgaW4gdGhpcyBjYXNlLgorICAgICAgICAnZXF1YWwnOiAgICBhW2kxOmkyXSA9PSBiW2oxOmoyXQorCisgICAgICAgID4+PiBhID0gInFhYnhjZCIKKyAgICAgICAgPj4+IGIgPSAiYWJ5Y2RmIgorICAgICAgICA+Pj4gcyA9IFNlcXVlbmNlTWF0Y2hlcihOb25lLCBhLCBiKQorICAgICAgICA+Pj4gZm9yIHRhZywgaTEsIGkyLCBqMSwgajIgaW4gcy5nZXRfb3Bjb2RlcygpOgorICAgICAgICAuLi4gICAgcHJpbnQgKCIlN3MgYVslZDolZF0gKCVzKSBiWyVkOiVkXSAoJXMpIiAlCisgICAgICAgIC4uLiAgICAgICAgICAgKHRhZywgaTEsIGkyLCBhW2kxOmkyXSwgajEsIGoyLCBiW2oxOmoyXSkpCisgICAgICAgICBkZWxldGUgYVswOjFdIChxKSBiWzA6MF0gKCkKKyAgICAgICAgICBlcXVhbCBhWzE6M10gKGFiKSBiWzA6Ml0gKGFiKQorICAgICAgICByZXBsYWNlIGFbMzo0XSAoeCkgYlsyOjNdICh5KQorICAgICAgICAgIGVxdWFsIGFbNDo2XSAoY2QpIGJbMzo1XSAoY2QpCisgICAgICAgICBpbnNlcnQgYVs2OjZdICgpIGJbNTo2XSAoZikKKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgc2VsZi5vcGNvZGVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYub3Bjb2RlcworICAgICAgICBpID0gaiA9IDAKKyAgICAgICAgc2VsZi5vcGNvZGVzID0gYW5zd2VyID0gW10KKyAgICAgICAgZm9yIGFpLCBiaiwgc2l6ZSBpbiBzZWxmLmdldF9tYXRjaGluZ19ibG9ja3MoKToKKyAgICAgICAgICAgICMgaW52YXJpYW50OiAgd2UndmUgcHVtcGVkIG91dCBjb3JyZWN0IGRpZmZzIHRvIGNoYW5nZQorICAgICAgICAgICAgIyBhWzppXSBpbnRvIGJbOmpdLCBhbmQgdGhlIG5leHQgbWF0Y2hpbmcgYmxvY2sgaXMKKyAgICAgICAgICAgICMgYVthaTphaStzaXplXSA9PSBiW2JqOmJqK3NpemVdLiAgU28gd2UgbmVlZCB0byBwdW1wCisgICAgICAgICAgICAjIG91dCBhIGRpZmYgdG8gY2hhbmdlIGFbaTphaV0gaW50byBiW2o6YmpdLCBwdW1wIG91dAorICAgICAgICAgICAgIyB0aGUgbWF0Y2hpbmcgYmxvY2ssIGFuZCBtb3ZlIChpLGopIGJleW9uZCB0aGUgbWF0Y2gKKyAgICAgICAgICAgIHRhZyA9ICcnCisgICAgICAgICAgICBpZiBpIDwgYWkgYW5kIGogPCBiajoKKyAgICAgICAgICAgICAgICB0YWcgPSAncmVwbGFjZScKKyAgICAgICAgICAgIGVsaWYgaSA8IGFpOgorICAgICAgICAgICAgICAgIHRhZyA9ICdkZWxldGUnCisgICAgICAgICAgICBlbGlmIGogPCBiajoKKyAgICAgICAgICAgICAgICB0YWcgPSAnaW5zZXJ0JworICAgICAgICAgICAgaWYgdGFnOgorICAgICAgICAgICAgICAgIGFuc3dlci5hcHBlbmQoICh0YWcsIGksIGFpLCBqLCBiaikgKQorICAgICAgICAgICAgaSwgaiA9IGFpK3NpemUsIGJqK3NpemUKKyAgICAgICAgICAgICMgdGhlIGxpc3Qgb2YgbWF0Y2hpbmcgYmxvY2tzIGlzIHRlcm1pbmF0ZWQgYnkgYQorICAgICAgICAgICAgIyBzZW50aW5lbCB3aXRoIHNpemUgMAorICAgICAgICAgICAgaWYgc2l6ZToKKyAgICAgICAgICAgICAgICBhbnN3ZXIuYXBwZW5kKCAoJ2VxdWFsJywgYWksIGksIGJqLCBqKSApCisgICAgICAgIHJldHVybiBhbnN3ZXIKKworICAgIGRlZiBnZXRfZ3JvdXBlZF9vcGNvZGVzKHNlbGYsIG49Myk6CisgICAgICAgICIiIiBJc29sYXRlIGNoYW5nZSBjbHVzdGVycyBieSBlbGltaW5hdGluZyByYW5nZXMgd2l0aCBubyBjaGFuZ2VzLgorCisgICAgICAgIFJldHVybiBhIGdlbmVyYXRvciBvZiBncm91cHMgd2l0aCB1cHRvIG4gbGluZXMgb2YgY29udGV4dC4KKyAgICAgICAgRWFjaCBncm91cCBpcyBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgcmV0dXJuZWQgYnkgZ2V0X29wY29kZXMoKS4KKworICAgICAgICA+Pj4gZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAorICAgICAgICA+Pj4gYSA9IG1hcChzdHIsIHJhbmdlKDEsNDApKQorICAgICAgICA+Pj4gYiA9IGFbOl0KKyAgICAgICAgPj4+IGJbODo4XSA9IFsnaSddICAgICAjIE1ha2UgYW4gaW5zZXJ0aW9uCisgICAgICAgID4+PiBiWzIwXSArPSAneCcgICAgICAgIyBNYWtlIGEgcmVwbGFjZW1lbnQKKyAgICAgICAgPj4+IGJbMjM6MjhdID0gW10gICAgICAjIE1ha2UgYSBkZWxldGlvbgorICAgICAgICA+Pj4gYlszMF0gKz0gJ3knICAgICAgICMgTWFrZSBhbm90aGVyIHJlcGxhY2VtZW50CisgICAgICAgID4+PiBwcHJpbnQobGlzdChTZXF1ZW5jZU1hdGNoZXIoTm9uZSxhLGIpLmdldF9ncm91cGVkX29wY29kZXMoKSkpCisgICAgICAgIFtbKCdlcXVhbCcsIDUsIDgsIDUsIDgpLCAoJ2luc2VydCcsIDgsIDgsIDgsIDkpLCAoJ2VxdWFsJywgOCwgMTEsIDksIDEyKV0sCisgICAgICAgICBbKCdlcXVhbCcsIDE2LCAxOSwgMTcsIDIwKSwKKyAgICAgICAgICAoJ3JlcGxhY2UnLCAxOSwgMjAsIDIwLCAyMSksCisgICAgICAgICAgKCdlcXVhbCcsIDIwLCAyMiwgMjEsIDIzKSwKKyAgICAgICAgICAoJ2RlbGV0ZScsIDIyLCAyNywgMjMsIDIzKSwKKyAgICAgICAgICAoJ2VxdWFsJywgMjcsIDMwLCAyMywgMjYpXSwKKyAgICAgICAgIFsoJ2VxdWFsJywgMzEsIDM0LCAyNywgMzApLAorICAgICAgICAgICgncmVwbGFjZScsIDM0LCAzNSwgMzAsIDMxKSwKKyAgICAgICAgICAoJ2VxdWFsJywgMzUsIDM4LCAzMSwgMzQpXV0KKyAgICAgICAgIiIiCisKKyAgICAgICAgY29kZXMgPSBzZWxmLmdldF9vcGNvZGVzKCkKKyAgICAgICAgaWYgbm90IGNvZGVzOgorICAgICAgICAgICAgY29kZXMgPSBbKCJlcXVhbCIsIDAsIDEsIDAsIDEpXQorICAgICAgICAjIEZpeHVwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGdyb3VwcyBpZiB0aGV5IHNob3cgbm8gY2hhbmdlcy4KKyAgICAgICAgaWYgY29kZXNbMF1bMF0gPT0gJ2VxdWFsJzoKKyAgICAgICAgICAgIHRhZywgaTEsIGkyLCBqMSwgajIgPSBjb2Rlc1swXQorICAgICAgICAgICAgY29kZXNbMF0gPSB0YWcsIG1heChpMSwgaTItbiksIGkyLCBtYXgoajEsIGoyLW4pLCBqMgorICAgICAgICBpZiBjb2Rlc1stMV1bMF0gPT0gJ2VxdWFsJzoKKyAgICAgICAgICAgIHRhZywgaTEsIGkyLCBqMSwgajIgPSBjb2Rlc1stMV0KKyAgICAgICAgICAgIGNvZGVzWy0xXSA9IHRhZywgaTEsIG1pbihpMiwgaTErbiksIGoxLCBtaW4oajIsIGoxK24pCisKKyAgICAgICAgbm4gPSBuICsgbgorICAgICAgICBncm91cCA9IFtdCisgICAgICAgIGZvciB0YWcsIGkxLCBpMiwgajEsIGoyIGluIGNvZGVzOgorICAgICAgICAgICAgIyBFbmQgdGhlIGN1cnJlbnQgZ3JvdXAgYW5kIHN0YXJ0IGEgbmV3IG9uZSB3aGVuZXZlcgorICAgICAgICAgICAgIyB0aGVyZSBpcyBhIGxhcmdlIHJhbmdlIHdpdGggbm8gY2hhbmdlcy4KKyAgICAgICAgICAgIGlmIHRhZyA9PSAnZXF1YWwnIGFuZCBpMi1pMSA+IG5uOgorICAgICAgICAgICAgICAgIGdyb3VwLmFwcGVuZCgodGFnLCBpMSwgbWluKGkyLCBpMStuKSwgajEsIG1pbihqMiwgajErbikpKQorICAgICAgICAgICAgICAgIHlpZWxkIGdyb3VwCisgICAgICAgICAgICAgICAgZ3JvdXAgPSBbXQorICAgICAgICAgICAgICAgIGkxLCBqMSA9IG1heChpMSwgaTItbiksIG1heChqMSwgajItbikKKyAgICAgICAgICAgIGdyb3VwLmFwcGVuZCgodGFnLCBpMSwgaTIsIGoxICxqMikpCisgICAgICAgIGlmIGdyb3VwIGFuZCBub3QgKGxlbihncm91cCk9PTEgYW5kIGdyb3VwWzBdWzBdID09ICdlcXVhbCcpOgorICAgICAgICAgICAgeWllbGQgZ3JvdXAKKworICAgIGRlZiByYXRpbyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbWVhc3VyZSBvZiB0aGUgc2VxdWVuY2VzJyBzaW1pbGFyaXR5IChmbG9hdCBpbiBbMCwxXSkuCisKKyAgICAgICAgV2hlcmUgVCBpcyB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGJvdGggc2VxdWVuY2VzLCBhbmQKKyAgICAgICAgTSBpcyB0aGUgbnVtYmVyIG9mIG1hdGNoZXMsIHRoaXMgaXMgMi4wKk0gLyBULgorICAgICAgICBOb3RlIHRoYXQgdGhpcyBpcyAxIGlmIHRoZSBzZXF1ZW5jZXMgYXJlIGlkZW50aWNhbCwgYW5kIDAgaWYKKyAgICAgICAgdGhleSBoYXZlIG5vdGhpbmcgaW4gY29tbW9uLgorCisgICAgICAgIC5yYXRpbygpIGlzIGV4cGVuc2l2ZSB0byBjb21wdXRlIGlmIHlvdSBoYXZlbid0IGFscmVhZHkgY29tcHV0ZWQKKyAgICAgICAgLmdldF9tYXRjaGluZ19ibG9ja3MoKSBvciAuZ2V0X29wY29kZXMoKSwgaW4gd2hpY2ggY2FzZSB5b3UgbWF5CisgICAgICAgIHdhbnQgdG8gdHJ5IC5xdWlja19yYXRpbygpIG9yIC5yZWFsX3F1aWNrX3JhdGlvKCkgZmlyc3QgdG8gZ2V0IGFuCisgICAgICAgIHVwcGVyIGJvdW5kLgorCisgICAgICAgID4+PiBzID0gU2VxdWVuY2VNYXRjaGVyKE5vbmUsICJhYmNkIiwgImJjZGUiKQorICAgICAgICA+Pj4gcy5yYXRpbygpCisgICAgICAgIDAuNzUKKyAgICAgICAgPj4+IHMucXVpY2tfcmF0aW8oKQorICAgICAgICAwLjc1CisgICAgICAgID4+PiBzLnJlYWxfcXVpY2tfcmF0aW8oKQorICAgICAgICAxLjAKKyAgICAgICAgIiIiCisKKyAgICAgICAgbWF0Y2hlcyA9IHJlZHVjZShsYW1iZGEgc3VtLCB0cmlwbGU6IHN1bSArIHRyaXBsZVstMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbWF0Y2hpbmdfYmxvY2tzKCksIDApCisgICAgICAgIHJldHVybiBfY2FsY3VsYXRlX3JhdGlvKG1hdGNoZXMsIGxlbihzZWxmLmEpICsgbGVuKHNlbGYuYikpCisKKyAgICBkZWYgcXVpY2tfcmF0aW8oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbiB1cHBlciBib3VuZCBvbiByYXRpbygpIHJlbGF0aXZlbHkgcXVpY2tseS4KKworICAgICAgICBUaGlzIGlzbid0IGRlZmluZWQgYmV5b25kIHRoYXQgaXQgaXMgYW4gdXBwZXIgYm91bmQgb24gLnJhdGlvKCksIGFuZAorICAgICAgICBpcyBmYXN0ZXIgdG8gY29tcHV0ZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyB2aWV3aW5nIGEgYW5kIGIgYXMgbXVsdGlzZXRzLCBzZXQgbWF0Y2hlcyB0byB0aGUgY2FyZGluYWxpdHkKKyAgICAgICAgIyBvZiB0aGVpciBpbnRlcnNlY3Rpb247IHRoaXMgY291bnRzIHRoZSBudW1iZXIgb2YgbWF0Y2hlcworICAgICAgICAjIHdpdGhvdXQgcmVnYXJkIHRvIG9yZGVyLCBzbyBpcyBjbGVhcmx5IGFuIHVwcGVyIGJvdW5kCisgICAgICAgIGlmIHNlbGYuZnVsbGJjb3VudCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5mdWxsYmNvdW50ID0gZnVsbGJjb3VudCA9IHt9CisgICAgICAgICAgICBmb3IgZWx0IGluIHNlbGYuYjoKKyAgICAgICAgICAgICAgICBmdWxsYmNvdW50W2VsdF0gPSBmdWxsYmNvdW50LmdldChlbHQsIDApICsgMQorICAgICAgICBmdWxsYmNvdW50ID0gc2VsZi5mdWxsYmNvdW50CisgICAgICAgICMgYXZhaWxbeF0gaXMgdGhlIG51bWJlciBvZiB0aW1lcyB4IGFwcGVhcnMgaW4gJ2InIGxlc3MgdGhlCisgICAgICAgICMgbnVtYmVyIG9mIHRpbWVzIHdlJ3ZlIHNlZW4gaXQgaW4gJ2EnIHNvIGZhciAuLi4ga2luZGEKKyAgICAgICAgYXZhaWwgPSB7fQorICAgICAgICBhdmFpbGhhcywgbWF0Y2hlcyA9IGF2YWlsLl9fY29udGFpbnNfXywgMAorICAgICAgICBmb3IgZWx0IGluIHNlbGYuYToKKyAgICAgICAgICAgIGlmIGF2YWlsaGFzKGVsdCk6CisgICAgICAgICAgICAgICAgbnVtYiA9IGF2YWlsW2VsdF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbnVtYiA9IGZ1bGxiY291bnQuZ2V0KGVsdCwgMCkKKyAgICAgICAgICAgIGF2YWlsW2VsdF0gPSBudW1iIC0gMQorICAgICAgICAgICAgaWYgbnVtYiA+IDA6CisgICAgICAgICAgICAgICAgbWF0Y2hlcyA9IG1hdGNoZXMgKyAxCisgICAgICAgIHJldHVybiBfY2FsY3VsYXRlX3JhdGlvKG1hdGNoZXMsIGxlbihzZWxmLmEpICsgbGVuKHNlbGYuYikpCisKKyAgICBkZWYgcmVhbF9xdWlja19yYXRpbyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIHVwcGVyIGJvdW5kIG9uIHJhdGlvKCkgdmVyeSBxdWlja2x5LgorCisgICAgICAgIFRoaXMgaXNuJ3QgZGVmaW5lZCBiZXlvbmQgdGhhdCBpdCBpcyBhbiB1cHBlciBib3VuZCBvbiAucmF0aW8oKSwgYW5kCisgICAgICAgIGlzIGZhc3RlciB0byBjb21wdXRlIHRoYW4gZWl0aGVyIC5yYXRpbygpIG9yIC5xdWlja19yYXRpbygpLgorICAgICAgICAiIiIKKworICAgICAgICBsYSwgbGIgPSBsZW4oc2VsZi5hKSwgbGVuKHNlbGYuYikKKyAgICAgICAgIyBjYW4ndCBoYXZlIG1vcmUgbWF0Y2hlcyB0aGFuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCisgICAgICAgICMgc2hvcnRlciBzZXF1ZW5jZQorICAgICAgICByZXR1cm4gX2NhbGN1bGF0ZV9yYXRpbyhtaW4obGEsIGxiKSwgbGEgKyBsYikKKworZGVmIGdldF9jbG9zZV9tYXRjaGVzKHdvcmQsIHBvc3NpYmlsaXRpZXMsIG49MywgY3V0b2ZmPTAuNik6CisgICAgIiIiVXNlIFNlcXVlbmNlTWF0Y2hlciB0byByZXR1cm4gbGlzdCBvZiB0aGUgYmVzdCAiZ29vZCBlbm91Z2giIG1hdGNoZXMuCisKKyAgICB3b3JkIGlzIGEgc2VxdWVuY2UgZm9yIHdoaWNoIGNsb3NlIG1hdGNoZXMgYXJlIGRlc2lyZWQgKHR5cGljYWxseSBhCisgICAgc3RyaW5nKS4KKworICAgIHBvc3NpYmlsaXRpZXMgaXMgYSBsaXN0IG9mIHNlcXVlbmNlcyBhZ2FpbnN0IHdoaWNoIHRvIG1hdGNoIHdvcmQKKyAgICAodHlwaWNhbGx5IGEgbGlzdCBvZiBzdHJpbmdzKS4KKworICAgIE9wdGlvbmFsIGFyZyBuIChkZWZhdWx0IDMpIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjbG9zZSBtYXRjaGVzIHRvCisgICAgcmV0dXJuLiAgbiBtdXN0IGJlID4gMC4KKworICAgIE9wdGlvbmFsIGFyZyBjdXRvZmYgKGRlZmF1bHQgMC42KSBpcyBhIGZsb2F0IGluIFswLCAxXS4gIFBvc3NpYmlsaXRpZXMKKyAgICB0aGF0IGRvbid0IHNjb3JlIGF0IGxlYXN0IHRoYXQgc2ltaWxhciB0byB3b3JkIGFyZSBpZ25vcmVkLgorCisgICAgVGhlIGJlc3QgKG5vIG1vcmUgdGhhbiBuKSBtYXRjaGVzIGFtb25nIHRoZSBwb3NzaWJpbGl0aWVzIGFyZSByZXR1cm5lZAorICAgIGluIGEgbGlzdCwgc29ydGVkIGJ5IHNpbWlsYXJpdHkgc2NvcmUsIG1vc3Qgc2ltaWxhciBmaXJzdC4KKworICAgID4+PiBnZXRfY2xvc2VfbWF0Y2hlcygiYXBwZWwiLCBbImFwZSIsICJhcHBsZSIsICJwZWFjaCIsICJwdXBweSJdKQorICAgIFsnYXBwbGUnLCAnYXBlJ10KKyAgICA+Pj4gaW1wb3J0IGtleXdvcmQgYXMgX2tleXdvcmQKKyAgICA+Pj4gZ2V0X2Nsb3NlX21hdGNoZXMoIndoZWVsIiwgX2tleXdvcmQua3dsaXN0KQorICAgIFsnd2hpbGUnXQorICAgID4+PiBnZXRfY2xvc2VfbWF0Y2hlcygiYXBwbGUiLCBfa2V5d29yZC5rd2xpc3QpCisgICAgW10KKyAgICA+Pj4gZ2V0X2Nsb3NlX21hdGNoZXMoImFjY2VwdCIsIF9rZXl3b3JkLmt3bGlzdCkKKyAgICBbJ2V4Y2VwdCddCisgICAgIiIiCisKKyAgICBpZiBub3QgbiA+ICAwOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJuIG11c3QgYmUgPiAwOiAlciIgJSAobiwpKQorICAgIGlmIG5vdCAwLjAgPD0gY3V0b2ZmIDw9IDEuMDoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY3V0b2ZmIG11c3QgYmUgaW4gWzAuMCwgMS4wXTogJXIiICUgKGN1dG9mZiwpKQorICAgIHJlc3VsdCA9IFtdCisgICAgcyA9IFNlcXVlbmNlTWF0Y2hlcigpCisgICAgcy5zZXRfc2VxMih3b3JkKQorICAgIGZvciB4IGluIHBvc3NpYmlsaXRpZXM6CisgICAgICAgIHMuc2V0X3NlcTEoeCkKKyAgICAgICAgaWYgcy5yZWFsX3F1aWNrX3JhdGlvKCkgPj0gY3V0b2ZmIGFuZCBcCisgICAgICAgICAgIHMucXVpY2tfcmF0aW8oKSA+PSBjdXRvZmYgYW5kIFwKKyAgICAgICAgICAgcy5yYXRpbygpID49IGN1dG9mZjoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKHMucmF0aW8oKSwgeCkpCisKKyAgICAjIE1vdmUgdGhlIGJlc3Qgc2NvcmVycyB0byBoZWFkIG9mIGxpc3QKKyAgICByZXN1bHQgPSBoZWFwcS5ubGFyZ2VzdChuLCByZXN1bHQpCisgICAgIyBTdHJpcCBzY29yZXMgZm9yIHRoZSBiZXN0IG4gbWF0Y2hlcworICAgIHJldHVybiBbeCBmb3Igc2NvcmUsIHggaW4gcmVzdWx0XQorCitkZWYgX2NvdW50X2xlYWRpbmcobGluZSwgY2gpOgorICAgICIiIgorICAgIFJldHVybiBudW1iZXIgb2YgYGNoYCBjaGFyYWN0ZXJzIGF0IHRoZSBzdGFydCBvZiBgbGluZWAuCisKKyAgICBFeGFtcGxlOgorCisgICAgPj4+IF9jb3VudF9sZWFkaW5nKCcgICBhYmMnLCAnICcpCisgICAgMworICAgICIiIgorCisgICAgaSwgbiA9IDAsIGxlbihsaW5lKQorICAgIHdoaWxlIGkgPCBuIGFuZCBsaW5lW2ldID09IGNoOgorICAgICAgICBpICs9IDEKKyAgICByZXR1cm4gaQorCitjbGFzcyBEaWZmZXI6CisgICAgciIiIgorICAgIERpZmZlciBpcyBhIGNsYXNzIGZvciBjb21wYXJpbmcgc2VxdWVuY2VzIG9mIGxpbmVzIG9mIHRleHQsIGFuZAorICAgIHByb2R1Y2luZyBodW1hbi1yZWFkYWJsZSBkaWZmZXJlbmNlcyBvciBkZWx0YXMuICBEaWZmZXIgdXNlcworICAgIFNlcXVlbmNlTWF0Y2hlciBib3RoIHRvIGNvbXBhcmUgc2VxdWVuY2VzIG9mIGxpbmVzLCBhbmQgdG8gY29tcGFyZQorICAgIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzIHdpdGhpbiBzaW1pbGFyIChuZWFyLW1hdGNoaW5nKSBsaW5lcy4KKworICAgIEVhY2ggbGluZSBvZiBhIERpZmZlciBkZWx0YSBiZWdpbnMgd2l0aCBhIHR3by1sZXR0ZXIgY29kZToKKworICAgICAgICAnLSAnICAgIGxpbmUgdW5pcXVlIHRvIHNlcXVlbmNlIDEKKyAgICAgICAgJysgJyAgICBsaW5lIHVuaXF1ZSB0byBzZXF1ZW5jZSAyCisgICAgICAgICcgICcgICAgbGluZSBjb21tb24gdG8gYm90aCBzZXF1ZW5jZXMKKyAgICAgICAgJz8gJyAgICBsaW5lIG5vdCBwcmVzZW50IGluIGVpdGhlciBpbnB1dCBzZXF1ZW5jZQorCisgICAgTGluZXMgYmVnaW5uaW5nIHdpdGggJz8gJyBhdHRlbXB0IHRvIGd1aWRlIHRoZSBleWUgdG8gaW50cmFsaW5lCisgICAgZGlmZmVyZW5jZXMsIGFuZCB3ZXJlIG5vdCBwcmVzZW50IGluIGVpdGhlciBpbnB1dCBzZXF1ZW5jZS4gIFRoZXNlIGxpbmVzCisgICAgY2FuIGJlIGNvbmZ1c2luZyBpZiB0aGUgc2VxdWVuY2VzIGNvbnRhaW4gdGFiIGNoYXJhY3RlcnMuCisKKyAgICBOb3RlIHRoYXQgRGlmZmVyIG1ha2VzIG5vIGNsYWltIHRvIHByb2R1Y2UgYSAqbWluaW1hbCogZGlmZi4gIFRvIHRoZQorICAgIGNvbnRyYXJ5LCBtaW5pbWFsIGRpZmZzIGFyZSBvZnRlbiBjb3VudGVyLWludHVpdGl2ZSwgYmVjYXVzZSB0aGV5IHN5bmNoCisgICAgdXAgYW55d2hlcmUgcG9zc2libGUsIHNvbWV0aW1lcyBhY2NpZGVudGFsIG1hdGNoZXMgMTAwIHBhZ2VzIGFwYXJ0LgorICAgIFJlc3RyaWN0aW5nIHN5bmNoIHBvaW50cyB0byBjb250aWd1b3VzIG1hdGNoZXMgcHJlc2VydmVzIHNvbWUgbm90aW9uIG9mCisgICAgbG9jYWxpdHksIGF0IHRoZSBvY2Nhc2lvbmFsIGNvc3Qgb2YgcHJvZHVjaW5nIGEgbG9uZ2VyIGRpZmYuCisKKyAgICBFeGFtcGxlOiBDb21wYXJpbmcgdHdvIHRleHRzLgorCisgICAgRmlyc3Qgd2Ugc2V0IHVwIHRoZSB0ZXh0cywgc2VxdWVuY2VzIG9mIGluZGl2aWR1YWwgc2luZ2xlLWxpbmUgc3RyaW5ncworICAgIGVuZGluZyB3aXRoIG5ld2xpbmVzIChzdWNoIHNlcXVlbmNlcyBjYW4gYWxzbyBiZSBvYnRhaW5lZCBmcm9tIHRoZQorICAgIGByZWFkbGluZXMoKWAgbWV0aG9kIG9mIGZpbGUtbGlrZSBvYmplY3RzKToKKworICAgID4+PiB0ZXh0MSA9ICcnJyAgMS4gQmVhdXRpZnVsIGlzIGJldHRlciB0aGFuIHVnbHkuCisgICAgLi4uICAgMi4gRXhwbGljaXQgaXMgYmV0dGVyIHRoYW4gaW1wbGljaXQuCisgICAgLi4uICAgMy4gU2ltcGxlIGlzIGJldHRlciB0aGFuIGNvbXBsZXguCisgICAgLi4uICAgNC4gQ29tcGxleCBpcyBiZXR0ZXIgdGhhbiBjb21wbGljYXRlZC4KKyAgICAuLi4gJycnLnNwbGl0bGluZXMoMSkKKyAgICA+Pj4gbGVuKHRleHQxKQorICAgIDQKKyAgICA+Pj4gdGV4dDFbMF1bLTFdCisgICAgJ1xuJworICAgID4+PiB0ZXh0MiA9ICcnJyAgMS4gQmVhdXRpZnVsIGlzIGJldHRlciB0aGFuIHVnbHkuCisgICAgLi4uICAgMy4gICBTaW1wbGUgaXMgYmV0dGVyIHRoYW4gY29tcGxleC4KKyAgICAuLi4gICA0LiBDb21wbGljYXRlZCBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LgorICAgIC4uLiAgIDUuIEZsYXQgaXMgYmV0dGVyIHRoYW4gbmVzdGVkLgorICAgIC4uLiAnJycuc3BsaXRsaW5lcygxKQorCisgICAgTmV4dCB3ZSBpbnN0YW50aWF0ZSBhIERpZmZlciBvYmplY3Q6CisKKyAgICA+Pj4gZCA9IERpZmZlcigpCisKKyAgICBOb3RlIHRoYXQgd2hlbiBpbnN0YW50aWF0aW5nIGEgRGlmZmVyIG9iamVjdCB3ZSBtYXkgcGFzcyBmdW5jdGlvbnMgdG8KKyAgICBmaWx0ZXIgb3V0IGxpbmUgYW5kIGNoYXJhY3RlciAnanVuaycuICBTZWUgRGlmZmVyLl9faW5pdF9fIGZvciBkZXRhaWxzLgorCisgICAgRmluYWxseSwgd2UgY29tcGFyZSB0aGUgdHdvOgorCisgICAgPj4+IHJlc3VsdCA9IGxpc3QoZC5jb21wYXJlKHRleHQxLCB0ZXh0MikpCisKKyAgICAncmVzdWx0JyBpcyBhIGxpc3Qgb2Ygc3RyaW5ncywgc28gbGV0J3MgcHJldHR5LXByaW50IGl0OgorCisgICAgPj4+IGZyb20gcHByaW50IGltcG9ydCBwcHJpbnQgYXMgX3BwcmludAorICAgID4+PiBfcHByaW50KHJlc3VsdCkKKyAgICBbJyAgICAxLiBCZWF1dGlmdWwgaXMgYmV0dGVyIHRoYW4gdWdseS5cbicsCisgICAgICctICAgMi4gRXhwbGljaXQgaXMgYmV0dGVyIHRoYW4gaW1wbGljaXQuXG4nLAorICAgICAnLSAgIDMuIFNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LlxuJywKKyAgICAgJysgICAzLiAgIFNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LlxuJywKKyAgICAgJz8gICAgICsrXG4nLAorICAgICAnLSAgIDQuIENvbXBsZXggaXMgYmV0dGVyIHRoYW4gY29tcGxpY2F0ZWQuXG4nLAorICAgICAnPyAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAtLS0tIF5cbicsCisgICAgICcrICAgNC4gQ29tcGxpY2F0ZWQgaXMgYmV0dGVyIHRoYW4gY29tcGxleC5cbicsCisgICAgICc/ICAgICAgICAgICArKysrIF4gICAgICAgICAgICAgICAgICAgICAgXlxuJywKKyAgICAgJysgICA1LiBGbGF0IGlzIGJldHRlciB0aGFuIG5lc3RlZC5cbiddCisKKyAgICBBcyBhIHNpbmdsZSBtdWx0aS1saW5lIHN0cmluZyBpdCBsb29rcyBsaWtlIHRoaXM6CisKKyAgICA+Pj4gcHJpbnQgJycuam9pbihyZXN1bHQpLAorICAgICAgICAxLiBCZWF1dGlmdWwgaXMgYmV0dGVyIHRoYW4gdWdseS4KKyAgICAtICAgMi4gRXhwbGljaXQgaXMgYmV0dGVyIHRoYW4gaW1wbGljaXQuCisgICAgLSAgIDMuIFNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LgorICAgICsgICAzLiAgIFNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LgorICAgID8gICAgICsrCisgICAgLSAgIDQuIENvbXBsZXggaXMgYmV0dGVyIHRoYW4gY29tcGxpY2F0ZWQuCisgICAgPyAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAtLS0tIF4KKyAgICArICAgNC4gQ29tcGxpY2F0ZWQgaXMgYmV0dGVyIHRoYW4gY29tcGxleC4KKyAgICA/ICAgICAgICAgICArKysrIF4gICAgICAgICAgICAgICAgICAgICAgXgorICAgICsgICA1LiBGbGF0IGlzIGJldHRlciB0aGFuIG5lc3RlZC4KKworICAgIE1ldGhvZHM6CisKKyAgICBfX2luaXRfXyhsaW5lanVuaz1Ob25lLCBjaGFyanVuaz1Ob25lKQorICAgICAgICBDb25zdHJ1Y3QgYSB0ZXh0IGRpZmZlcmVuY2VyLCB3aXRoIG9wdGlvbmFsIGZpbHRlcnMuCisKKyAgICBjb21wYXJlKGEsIGIpCisgICAgICAgIENvbXBhcmUgdHdvIHNlcXVlbmNlcyBvZiBsaW5lczsgZ2VuZXJhdGUgdGhlIHJlc3VsdGluZyBkZWx0YS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lanVuaz1Ob25lLCBjaGFyanVuaz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIENvbnN0cnVjdCBhIHRleHQgZGlmZmVyZW5jZXIsIHdpdGggb3B0aW9uYWwgZmlsdGVycy4KKworICAgICAgICBUaGUgdHdvIG9wdGlvbmFsIGtleXdvcmQgcGFyYW1ldGVycyBhcmUgZm9yIGZpbHRlciBmdW5jdGlvbnM6CisKKyAgICAgICAgLSBgbGluZWp1bmtgOiBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGFjY2VwdCBhIHNpbmdsZSBzdHJpbmcgYXJndW1lbnQsCisgICAgICAgICAgYW5kIHJldHVybiB0cnVlIGlmZiB0aGUgc3RyaW5nIGlzIGp1bmsuIFRoZSBtb2R1bGUtbGV2ZWwgZnVuY3Rpb24KKyAgICAgICAgICBgSVNfTElORV9KVU5LYCBtYXkgYmUgdXNlZCB0byBmaWx0ZXIgb3V0IGxpbmVzIHdpdGhvdXQgdmlzaWJsZQorICAgICAgICAgIGNoYXJhY3RlcnMsIGV4Y2VwdCBmb3IgYXQgbW9zdCBvbmUgc3BsYXQgKCcjJykuICBJdCBpcyByZWNvbW1lbmRlZAorICAgICAgICAgIHRvIGxlYXZlIGxpbmVqdW5rIE5vbmU7IGFzIG9mIFB5dGhvbiAyLjMsIHRoZSB1bmRlcmx5aW5nCisgICAgICAgICAgU2VxdWVuY2VNYXRjaGVyIGNsYXNzIGhhcyBncm93biBhbiBhZGFwdGl2ZSBub3Rpb24gb2YgIm5vaXNlIiBsaW5lcworICAgICAgICAgIHRoYXQncyBiZXR0ZXIgdGhhbiBhbnkgc3RhdGljIGRlZmluaXRpb24gdGhlIGF1dGhvciBoYXMgZXZlciBiZWVuCisgICAgICAgICAgYWJsZSB0byBjcmFmdC4KKworICAgICAgICAtIGBjaGFyanVua2A6IEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYWNjZXB0IGEgc3RyaW5nIG9mIGxlbmd0aCAxLiBUaGUKKyAgICAgICAgICBtb2R1bGUtbGV2ZWwgZnVuY3Rpb24gYElTX0NIQVJBQ1RFUl9KVU5LYCBtYXkgYmUgdXNlZCB0byBmaWx0ZXIgb3V0CisgICAgICAgICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChhIGJsYW5rIG9yIHRhYjsgKipub3RlKio6IGJhZCBpZGVhIHRvIGluY2x1ZGUKKyAgICAgICAgICBuZXdsaW5lIGluIHRoaXMhKS4gIFVzZSBvZiBJU19DSEFSQUNURVJfSlVOSyBpcyByZWNvbW1lbmRlZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5saW5lanVuayA9IGxpbmVqdW5rCisgICAgICAgIHNlbGYuY2hhcmp1bmsgPSBjaGFyanVuaworCisgICAgZGVmIGNvbXBhcmUoc2VsZiwgYSwgYik6CisgICAgICAgIHIiIiIKKyAgICAgICAgQ29tcGFyZSB0d28gc2VxdWVuY2VzIG9mIGxpbmVzOyBnZW5lcmF0ZSB0aGUgcmVzdWx0aW5nIGRlbHRhLgorCisgICAgICAgIEVhY2ggc2VxdWVuY2UgbXVzdCBjb250YWluIGluZGl2aWR1YWwgc2luZ2xlLWxpbmUgc3RyaW5ncyBlbmRpbmcgd2l0aAorICAgICAgICBuZXdsaW5lcy4gU3VjaCBzZXF1ZW5jZXMgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIGByZWFkbGluZXMoKWAgbWV0aG9kCisgICAgICAgIG9mIGZpbGUtbGlrZSBvYmplY3RzLiAgVGhlIGRlbHRhIGdlbmVyYXRlZCBhbHNvIGNvbnNpc3RzIG9mIG5ld2xpbmUtCisgICAgICAgIHRlcm1pbmF0ZWQgc3RyaW5ncywgcmVhZHkgdG8gYmUgcHJpbnRlZCBhcy1pcyB2aWEgdGhlIHdyaXRlbGluZSgpCisgICAgICAgIG1ldGhvZCBvZiBhIGZpbGUtbGlrZSBvYmplY3QuCisKKyAgICAgICAgRXhhbXBsZToKKworICAgICAgICA+Pj4gcHJpbnQgJycuam9pbihEaWZmZXIoKS5jb21wYXJlKCdvbmVcbnR3b1xudGhyZWVcbicuc3BsaXRsaW5lcygxKSwKKyAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JlXG50cmVlXG5lbXVcbicuc3BsaXRsaW5lcygxKSkpLAorICAgICAgICAtIG9uZQorICAgICAgICA/ICBeCisgICAgICAgICsgb3JlCisgICAgICAgID8gIF4KKyAgICAgICAgLSB0d28KKyAgICAgICAgLSB0aHJlZQorICAgICAgICA/ICAtCisgICAgICAgICsgdHJlZQorICAgICAgICArIGVtdQorICAgICAgICAiIiIKKworICAgICAgICBjcnVuY2hlciA9IFNlcXVlbmNlTWF0Y2hlcihzZWxmLmxpbmVqdW5rLCBhLCBiKQorICAgICAgICBmb3IgdGFnLCBhbG8sIGFoaSwgYmxvLCBiaGkgaW4gY3J1bmNoZXIuZ2V0X29wY29kZXMoKToKKyAgICAgICAgICAgIGlmIHRhZyA9PSAncmVwbGFjZSc6CisgICAgICAgICAgICAgICAgZyA9IHNlbGYuX2ZhbmN5X3JlcGxhY2UoYSwgYWxvLCBhaGksIGIsIGJsbywgYmhpKQorICAgICAgICAgICAgZWxpZiB0YWcgPT0gJ2RlbGV0ZSc6CisgICAgICAgICAgICAgICAgZyA9IHNlbGYuX2R1bXAoJy0nLCBhLCBhbG8sIGFoaSkKKyAgICAgICAgICAgIGVsaWYgdGFnID09ICdpbnNlcnQnOgorICAgICAgICAgICAgICAgIGcgPSBzZWxmLl9kdW1wKCcrJywgYiwgYmxvLCBiaGkpCisgICAgICAgICAgICBlbGlmIHRhZyA9PSAnZXF1YWwnOgorICAgICAgICAgICAgICAgIGcgPSBzZWxmLl9kdW1wKCcgJywgYSwgYWxvLCBhaGkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICd1bmtub3duIHRhZyAlcicgJSAodGFnLCkKKworICAgICAgICAgICAgZm9yIGxpbmUgaW4gZzoKKyAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCisKKyAgICBkZWYgX2R1bXAoc2VsZiwgdGFnLCB4LCBsbywgaGkpOgorICAgICAgICAiIiJHZW5lcmF0ZSBjb21wYXJpc29uIHJlc3VsdHMgZm9yIGEgc2FtZS10YWdnZWQgcmFuZ2UuIiIiCisgICAgICAgIGZvciBpIGluIHhyYW5nZShsbywgaGkpOgorICAgICAgICAgICAgeWllbGQgJyVzICVzJyAlICh0YWcsIHhbaV0pCisKKyAgICBkZWYgX3BsYWluX3JlcGxhY2Uoc2VsZiwgYSwgYWxvLCBhaGksIGIsIGJsbywgYmhpKToKKyAgICAgICAgYXNzZXJ0IGFsbyA8IGFoaSBhbmQgYmxvIDwgYmhpCisgICAgICAgICMgZHVtcCB0aGUgc2hvcnRlciBibG9jayBmaXJzdCAtLSByZWR1Y2VzIHRoZSBidXJkZW4gb24gc2hvcnQtdGVybQorICAgICAgICAjIG1lbW9yeSBpZiB0aGUgYmxvY2tzIGFyZSBvZiB2ZXJ5IGRpZmZlcmVudCBzaXplcworICAgICAgICBpZiBiaGkgLSBibG8gPCBhaGkgLSBhbG86CisgICAgICAgICAgICBmaXJzdCAgPSBzZWxmLl9kdW1wKCcrJywgYiwgYmxvLCBiaGkpCisgICAgICAgICAgICBzZWNvbmQgPSBzZWxmLl9kdW1wKCctJywgYSwgYWxvLCBhaGkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaXJzdCAgPSBzZWxmLl9kdW1wKCctJywgYSwgYWxvLCBhaGkpCisgICAgICAgICAgICBzZWNvbmQgPSBzZWxmLl9kdW1wKCcrJywgYiwgYmxvLCBiaGkpCisKKyAgICAgICAgZm9yIGcgaW4gZmlyc3QsIHNlY29uZDoKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGc6CisgICAgICAgICAgICAgICAgeWllbGQgbGluZQorCisgICAgZGVmIF9mYW5jeV9yZXBsYWNlKHNlbGYsIGEsIGFsbywgYWhpLCBiLCBibG8sIGJoaSk6CisgICAgICAgIHIiIiIKKyAgICAgICAgV2hlbiByZXBsYWNpbmcgb25lIGJsb2NrIG9mIGxpbmVzIHdpdGggYW5vdGhlciwgc2VhcmNoIHRoZSBibG9ja3MKKyAgICAgICAgZm9yICpzaW1pbGFyKiBsaW5lczsgdGhlIGJlc3QtbWF0Y2hpbmcgcGFpciAoaWYgYW55KSBpcyB1c2VkIGFzIGEKKyAgICAgICAgc3luY2ggcG9pbnQsIGFuZCBpbnRyYWxpbmUgZGlmZmVyZW5jZSBtYXJraW5nIGlzIGRvbmUgb24gdGhlCisgICAgICAgIHNpbWlsYXIgcGFpci4gTG90cyBvZiB3b3JrLCBidXQgb2Z0ZW4gd29ydGggaXQuCisKKyAgICAgICAgRXhhbXBsZToKKworICAgICAgICA+Pj4gZCA9IERpZmZlcigpCisgICAgICAgID4+PiByZXN1bHRzID0gZC5fZmFuY3lfcmVwbGFjZShbJ2FiY0RlZmdoaUprbFxuJ10sIDAsIDEsCisgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2FiY2RlZkdoaWprbFxuJ10sIDAsIDEpCisgICAgICAgID4+PiBwcmludCAnJy5qb2luKHJlc3VsdHMpLAorICAgICAgICAtIGFiY0RlZmdoaUprbAorICAgICAgICA/ICAgIF4gIF4gIF4KKyAgICAgICAgKyBhYmNkZWZHaGlqa2wKKyAgICAgICAgPyAgICBeICBeICBeCisgICAgICAgICIiIgorCisgICAgICAgICMgZG9uJ3Qgc3luY2ggdXAgdW5sZXNzIHRoZSBsaW5lcyBoYXZlIGEgc2ltaWxhcml0eSBzY29yZSBvZiBhdAorICAgICAgICAjIGxlYXN0IGN1dG9mZjsgYmVzdF9yYXRpbyB0cmFja3MgdGhlIGJlc3Qgc2NvcmUgc2VlbiBzbyBmYXIKKyAgICAgICAgYmVzdF9yYXRpbywgY3V0b2ZmID0gMC43NCwgMC43NQorICAgICAgICBjcnVuY2hlciA9IFNlcXVlbmNlTWF0Y2hlcihzZWxmLmNoYXJqdW5rKQorICAgICAgICBlcWksIGVxaiA9IE5vbmUsIE5vbmUgICAjIDFzdCBpbmRpY2VzIG9mIGVxdWFsIGxpbmVzIChpZiBhbnkpCisKKyAgICAgICAgIyBzZWFyY2ggZm9yIHRoZSBwYWlyIHRoYXQgbWF0Y2hlcyBiZXN0IHdpdGhvdXQgYmVpbmcgaWRlbnRpY2FsCisgICAgICAgICMgKGlkZW50aWNhbCBsaW5lcyBtdXN0IGJlIGp1bmsgbGluZXMsICYgd2UgZG9uJ3Qgd2FudCB0byBzeW5jaCB1cAorICAgICAgICAjIG9uIGp1bmsgLS0gdW5sZXNzIHdlIGhhdmUgdG8pCisgICAgICAgIGZvciBqIGluIHhyYW5nZShibG8sIGJoaSk6CisgICAgICAgICAgICBiaiA9IGJbal0KKyAgICAgICAgICAgIGNydW5jaGVyLnNldF9zZXEyKGJqKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGFsbywgYWhpKToKKyAgICAgICAgICAgICAgICBhaSA9IGFbaV0KKyAgICAgICAgICAgICAgICBpZiBhaSA9PSBiajoKKyAgICAgICAgICAgICAgICAgICAgaWYgZXFpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBlcWksIGVxaiA9IGksIGoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBjcnVuY2hlci5zZXRfc2VxMShhaSkKKyAgICAgICAgICAgICAgICAjIGNvbXB1dGluZyBzaW1pbGFyaXR5IGlzIGV4cGVuc2l2ZSwgc28gdXNlIHRoZSBxdWljaworICAgICAgICAgICAgICAgICMgdXBwZXIgYm91bmRzIGZpcnN0IC0tIGhhdmUgc2VlbiB0aGlzIHNwZWVkIHVwIG1lc3N5CisgICAgICAgICAgICAgICAgIyBjb21wYXJlcyBieSBhIGZhY3RvciBvZiAzLgorICAgICAgICAgICAgICAgICMgbm90ZSB0aGF0IHJhdGlvKCkgaXMgb25seSBleHBlbnNpdmUgdG8gY29tcHV0ZSB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAjIHRpbWUgaXQncyBjYWxsZWQgb24gYSBzZXF1ZW5jZSBwYWlyOyB0aGUgZXhwZW5zaXZlIHBhcnQKKyAgICAgICAgICAgICAgICAjIG9mIHRoZSBjb21wdXRhdGlvbiBpcyBjYWNoZWQgYnkgY3J1bmNoZXIKKyAgICAgICAgICAgICAgICBpZiBjcnVuY2hlci5yZWFsX3F1aWNrX3JhdGlvKCkgPiBiZXN0X3JhdGlvIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgY3J1bmNoZXIucXVpY2tfcmF0aW8oKSA+IGJlc3RfcmF0aW8gYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICBjcnVuY2hlci5yYXRpbygpID4gYmVzdF9yYXRpbzoKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9yYXRpbywgYmVzdF9pLCBiZXN0X2ogPSBjcnVuY2hlci5yYXRpbygpLCBpLCBqCisgICAgICAgIGlmIGJlc3RfcmF0aW8gPCBjdXRvZmY6CisgICAgICAgICAgICAjIG5vIG5vbi1pZGVudGljYWwgInByZXR0eSBjbG9zZSIgcGFpcgorICAgICAgICAgICAgaWYgZXFpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBubyBpZGVudGljYWwgcGFpciBlaXRoZXIgLS0gdHJlYXQgaXQgYXMgYSBzdHJhaWdodCByZXBsYWNlCisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5fcGxhaW5fcmVwbGFjZShhLCBhbG8sIGFoaSwgYiwgYmxvLCBiaGkpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAjIG5vIGNsb3NlIHBhaXIsIGJ1dCBhbiBpZGVudGljYWwgcGFpciAtLSBzeW5jaCB1cCBvbiB0aGF0CisgICAgICAgICAgICBiZXN0X2ksIGJlc3RfaiwgYmVzdF9yYXRpbyA9IGVxaSwgZXFqLCAxLjAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgdGhlcmUncyBhIGNsb3NlIHBhaXIsIHNvIGZvcmdldCB0aGUgaWRlbnRpY2FsIHBhaXIgKGlmIGFueSkKKyAgICAgICAgICAgIGVxaSA9IE5vbmUKKworICAgICAgICAjIGFbYmVzdF9pXSB2ZXJ5IHNpbWlsYXIgdG8gYltiZXN0X2pdOyBlcWkgaXMgTm9uZSBpZmYgdGhleSdyZSBub3QKKyAgICAgICAgIyBpZGVudGljYWwKKworICAgICAgICAjIHB1bXAgb3V0IGRpZmZzIGZyb20gYmVmb3JlIHRoZSBzeW5jaCBwb2ludAorICAgICAgICBmb3IgbGluZSBpbiBzZWxmLl9mYW5jeV9oZWxwZXIoYSwgYWxvLCBiZXN0X2ksIGIsIGJsbywgYmVzdF9qKToKKyAgICAgICAgICAgIHlpZWxkIGxpbmUKKworICAgICAgICAjIGRvIGludHJhbGluZSBtYXJraW5nIG9uIHRoZSBzeW5jaCBwYWlyCisgICAgICAgIGFlbHQsIGJlbHQgPSBhW2Jlc3RfaV0sIGJbYmVzdF9qXQorICAgICAgICBpZiBlcWkgaXMgTm9uZToKKyAgICAgICAgICAgICMgcHVtcCBvdXQgYSAnLScsICc/JywgJysnLCAnPycgcXVhZCBmb3IgdGhlIHN5bmNoZWQgbGluZXMKKyAgICAgICAgICAgIGF0YWdzID0gYnRhZ3MgPSAiIgorICAgICAgICAgICAgY3J1bmNoZXIuc2V0X3NlcXMoYWVsdCwgYmVsdCkKKyAgICAgICAgICAgIGZvciB0YWcsIGFpMSwgYWkyLCBiajEsIGJqMiBpbiBjcnVuY2hlci5nZXRfb3Bjb2RlcygpOgorICAgICAgICAgICAgICAgIGxhLCBsYiA9IGFpMiAtIGFpMSwgYmoyIC0gYmoxCisgICAgICAgICAgICAgICAgaWYgdGFnID09ICdyZXBsYWNlJzoKKyAgICAgICAgICAgICAgICAgICAgYXRhZ3MgKz0gJ14nICogbGEKKyAgICAgICAgICAgICAgICAgICAgYnRhZ3MgKz0gJ14nICogbGIKKyAgICAgICAgICAgICAgICBlbGlmIHRhZyA9PSAnZGVsZXRlJzoKKyAgICAgICAgICAgICAgICAgICAgYXRhZ3MgKz0gJy0nICogbGEKKyAgICAgICAgICAgICAgICBlbGlmIHRhZyA9PSAnaW5zZXJ0JzoKKyAgICAgICAgICAgICAgICAgICAgYnRhZ3MgKz0gJysnICogbGIKKyAgICAgICAgICAgICAgICBlbGlmIHRhZyA9PSAnZXF1YWwnOgorICAgICAgICAgICAgICAgICAgICBhdGFncyArPSAnICcgKiBsYQorICAgICAgICAgICAgICAgICAgICBidGFncyArPSAnICcgKiBsYgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICd1bmtub3duIHRhZyAlcicgJSAodGFnLCkKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX3Fmb3JtYXQoYWVsdCwgYmVsdCwgYXRhZ3MsIGJ0YWdzKToKKyAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHRoZSBzeW5jaCBwYWlyIGlzIGlkZW50aWNhbAorICAgICAgICAgICAgeWllbGQgJyAgJyArIGFlbHQKKworICAgICAgICAjIHB1bXAgb3V0IGRpZmZzIGZyb20gYWZ0ZXIgdGhlIHN5bmNoIHBvaW50CisgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2ZhbmN5X2hlbHBlcihhLCBiZXN0X2krMSwgYWhpLCBiLCBiZXN0X2orMSwgYmhpKToKKyAgICAgICAgICAgIHlpZWxkIGxpbmUKKworICAgIGRlZiBfZmFuY3lfaGVscGVyKHNlbGYsIGEsIGFsbywgYWhpLCBiLCBibG8sIGJoaSk6CisgICAgICAgIGcgPSBbXQorICAgICAgICBpZiBhbG8gPCBhaGk6CisgICAgICAgICAgICBpZiBibG8gPCBiaGk6CisgICAgICAgICAgICAgICAgZyA9IHNlbGYuX2ZhbmN5X3JlcGxhY2UoYSwgYWxvLCBhaGksIGIsIGJsbywgYmhpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBnID0gc2VsZi5fZHVtcCgnLScsIGEsIGFsbywgYWhpKQorICAgICAgICBlbGlmIGJsbyA8IGJoaToKKyAgICAgICAgICAgIGcgPSBzZWxmLl9kdW1wKCcrJywgYiwgYmxvLCBiaGkpCisKKyAgICAgICAgZm9yIGxpbmUgaW4gZzoKKyAgICAgICAgICAgIHlpZWxkIGxpbmUKKworICAgIGRlZiBfcWZvcm1hdChzZWxmLCBhbGluZSwgYmxpbmUsIGF0YWdzLCBidGFncyk6CisgICAgICAgIHIiIiIKKyAgICAgICAgRm9ybWF0ICI/IiBvdXRwdXQgYW5kIGRlYWwgd2l0aCBsZWFkaW5nIHRhYnMuCisKKyAgICAgICAgRXhhbXBsZToKKworICAgICAgICA+Pj4gZCA9IERpZmZlcigpCisgICAgICAgID4+PiByZXN1bHRzID0gZC5fcWZvcm1hdCgnXHRhYmNEZWZnaGlKa2xcbicsICdcdGFiY2RlZkdoaWprbFxuJywKKyAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICcgIF4gXiAgXiAgICAgICcsICcgIF4gXiAgXiAgICAgICcpCisgICAgICAgID4+PiBmb3IgbGluZSBpbiByZXN1bHRzOiBwcmludCByZXByKGxpbmUpCisgICAgICAgIC4uLgorICAgICAgICAnLSBcdGFiY0RlZmdoaUprbFxuJworICAgICAgICAnPyBcdCBeIF4gIF5cbicKKyAgICAgICAgJysgXHRhYmNkZWZHaGlqa2xcbicKKyAgICAgICAgJz8gXHQgXiBeICBeXG4nCisgICAgICAgICIiIgorCisgICAgICAgICMgQ2FuIGh1cnQsIGJ1dCB3aWxsIHByb2JhYmx5IGhlbHAgbW9zdCBvZiB0aGUgdGltZS4KKyAgICAgICAgY29tbW9uID0gbWluKF9jb3VudF9sZWFkaW5nKGFsaW5lLCAiXHQiKSwKKyAgICAgICAgICAgICAgICAgICAgIF9jb3VudF9sZWFkaW5nKGJsaW5lLCAiXHQiKSkKKyAgICAgICAgY29tbW9uID0gbWluKGNvbW1vbiwgX2NvdW50X2xlYWRpbmcoYXRhZ3NbOmNvbW1vbl0sICIgIikpCisgICAgICAgIGNvbW1vbiA9IG1pbihjb21tb24sIF9jb3VudF9sZWFkaW5nKGJ0YWdzWzpjb21tb25dLCAiICIpKQorICAgICAgICBhdGFncyA9IGF0YWdzW2NvbW1vbjpdLnJzdHJpcCgpCisgICAgICAgIGJ0YWdzID0gYnRhZ3NbY29tbW9uOl0ucnN0cmlwKCkKKworICAgICAgICB5aWVsZCAiLSAiICsgYWxpbmUKKyAgICAgICAgaWYgYXRhZ3M6CisgICAgICAgICAgICB5aWVsZCAiPyAlcyVzXG4iICUgKCJcdCIgKiBjb21tb24sIGF0YWdzKQorCisgICAgICAgIHlpZWxkICIrICIgKyBibGluZQorICAgICAgICBpZiBidGFnczoKKyAgICAgICAgICAgIHlpZWxkICI/ICVzJXNcbiIgJSAoIlx0IiAqIGNvbW1vbiwgYnRhZ3MpCisKKyMgV2l0aCByZXNwZWN0IHRvIGp1bmssIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiBuZGlmZiBzaW1wbHkgcmVmdXNlZCB0bworIyAqc3RhcnQqIGEgbWF0Y2ggd2l0aCBhIGp1bmsgZWxlbWVudC4gIFRoZSByZXN1bHQgd2FzIGNhc2VzIGxpa2UgdGhpczoKKyMgICAgIGJlZm9yZTogcHJpdmF0ZSBUaHJlYWQgY3VycmVudFRocmVhZDsKKyMgICAgIGFmdGVyOiAgcHJpdmF0ZSB2b2xhdGlsZSBUaHJlYWQgY3VycmVudFRocmVhZDsKKyMgSWYgeW91IGNvbnNpZGVyIHdoaXRlc3BhY2UgdG8gYmUganVuaywgdGhlIGxvbmdlc3QgY29udGlndW91cyBtYXRjaAorIyBub3Qgc3RhcnRpbmcgd2l0aCBqdW5rIGlzICJlIFRocmVhZCBjdXJyZW50VGhyZWFkIi4gIFNvIG5kaWZmIHJlcG9ydGVkCisjIHRoYXQgImUgdm9sYXRpbCIgd2FzIGluc2VydGVkIGJldHdlZW4gdGhlICd0JyBhbmQgdGhlICdlJyBpbiAicHJpdmF0ZSIuCisjIFdoaWxlIGFuIGFjY3VyYXRlIHZpZXcsIHRvIHBlb3BsZSB0aGF0J3MgYWJzdXJkLiAgVGhlIGN1cnJlbnQgdmVyc2lvbgorIyBsb29rcyBmb3IgbWF0Y2hpbmcgYmxvY2tzIHRoYXQgYXJlIGVudGlyZWx5IGp1bmstZnJlZSwgdGhlbiBleHRlbmRzIHRoZQorIyBsb25nZXN0IG9uZSBvZiB0aG9zZSBhcyBmYXIgYXMgcG9zc2libGUgYnV0IG9ubHkgd2l0aCBtYXRjaGluZyBqdW5rLgorIyBTbyBub3cgImN1cnJlbnRUaHJlYWQiIGlzIG1hdGNoZWQsIHRoZW4gZXh0ZW5kZWQgdG8gc3VjayB1cCB0aGUKKyMgcHJlY2VkaW5nIGJsYW5rOyB0aGVuICJwcml2YXRlIiBpcyBtYXRjaGVkLCBhbmQgZXh0ZW5kZWQgdG8gc3VjayB1cCB0aGUKKyMgZm9sbG93aW5nIGJsYW5rOyB0aGVuICJUaHJlYWQiIGlzIG1hdGNoZWQ7IGFuZCBmaW5hbGx5IG5kaWZmIHJlcG9ydHMKKyMgdGhhdCAidm9sYXRpbGUgIiB3YXMgaW5zZXJ0ZWQgYmVmb3JlICJUaHJlYWQiLiAgVGhlIG9ubHkgcXVpYmJsZQorIyByZW1haW5pbmcgaXMgdGhhdCBwZXJoYXBzIGl0IHdhcyByZWFsbHkgdGhlIGNhc2UgdGhhdCAiIHZvbGF0aWxlIgorIyB3YXMgaW5zZXJ0ZWQgYWZ0ZXIgInByaXZhdGUiLiAgSSBjYW4gbGl2ZSB3aXRoIHRoYXQgPHdpbms+LgorCitpbXBvcnQgcmUKKworZGVmIElTX0xJTkVfSlVOSyhsaW5lLCBwYXQ9cmUuY29tcGlsZShyIlxzKiM/XHMqJCIpLm1hdGNoKToKKyAgICByIiIiCisgICAgUmV0dXJuIDEgZm9yIGlnbm9yYWJsZSBsaW5lOiBpZmYgYGxpbmVgIGlzIGJsYW5rIG9yIGNvbnRhaW5zIGEgc2luZ2xlICcjJy4KKworICAgIEV4YW1wbGVzOgorCisgICAgPj4+IElTX0xJTkVfSlVOSygnXG4nKQorICAgIFRydWUKKyAgICA+Pj4gSVNfTElORV9KVU5LKCcgICMgICBcbicpCisgICAgVHJ1ZQorICAgID4+PiBJU19MSU5FX0pVTksoJ2hlbGxvXG4nKQorICAgIEZhbHNlCisgICAgIiIiCisKKyAgICByZXR1cm4gcGF0KGxpbmUpIGlzIG5vdCBOb25lCisKK2RlZiBJU19DSEFSQUNURVJfSlVOSyhjaCwgd3M9IiBcdCIpOgorICAgIHIiIiIKKyAgICBSZXR1cm4gMSBmb3IgaWdub3JhYmxlIGNoYXJhY3RlcjogaWZmIGBjaGAgaXMgYSBzcGFjZSBvciB0YWIuCisKKyAgICBFeGFtcGxlczoKKworICAgID4+PiBJU19DSEFSQUNURVJfSlVOSygnICcpCisgICAgVHJ1ZQorICAgID4+PiBJU19DSEFSQUNURVJfSlVOSygnXHQnKQorICAgIFRydWUKKyAgICA+Pj4gSVNfQ0hBUkFDVEVSX0pVTksoJ1xuJykKKyAgICBGYWxzZQorICAgID4+PiBJU19DSEFSQUNURVJfSlVOSygneCcpCisgICAgRmFsc2UKKyAgICAiIiIKKworICAgIHJldHVybiBjaCBpbiB3cworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjICBVbmlmaWVkIERpZmYKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgX2Zvcm1hdF9yYW5nZV91bmlmaWVkKHN0YXJ0LCBzdG9wKToKKyAgICAnQ29udmVydCByYW5nZSB0byB0aGUgImVkIiBmb3JtYXQnCisgICAgIyBQZXIgdGhlIGRpZmYgc3BlYyBhdCBodHRwOi8vd3d3LnVuaXgub3JnL3NpbmdsZV91bml4X3NwZWNpZmljYXRpb24vCisgICAgYmVnaW5uaW5nID0gc3RhcnQgKyAxICAgICAjIGxpbmVzIHN0YXJ0IG51bWJlcmluZyB3aXRoIG9uZQorICAgIGxlbmd0aCA9IHN0b3AgLSBzdGFydAorICAgIGlmIGxlbmd0aCA9PSAxOgorICAgICAgICByZXR1cm4gJ3t9Jy5mb3JtYXQoYmVnaW5uaW5nKQorICAgIGlmIG5vdCBsZW5ndGg6CisgICAgICAgIGJlZ2lubmluZyAtPSAxICAgICAgICAjIGVtcHR5IHJhbmdlcyBiZWdpbiBhdCBsaW5lIGp1c3QgYmVmb3JlIHRoZSByYW5nZQorICAgIHJldHVybiAne30se30nLmZvcm1hdChiZWdpbm5pbmcsIGxlbmd0aCkKKworZGVmIHVuaWZpZWRfZGlmZihhLCBiLCBmcm9tZmlsZT0nJywgdG9maWxlPScnLCBmcm9tZmlsZWRhdGU9JycsCisgICAgICAgICAgICAgICAgIHRvZmlsZWRhdGU9JycsIG49MywgbGluZXRlcm09J1xuJyk6CisgICAgciIiIgorICAgIENvbXBhcmUgdHdvIHNlcXVlbmNlcyBvZiBsaW5lczsgZ2VuZXJhdGUgdGhlIGRlbHRhIGFzIGEgdW5pZmllZCBkaWZmLgorCisgICAgVW5pZmllZCBkaWZmcyBhcmUgYSBjb21wYWN0IHdheSBvZiBzaG93aW5nIGxpbmUgY2hhbmdlcyBhbmQgYSBmZXcKKyAgICBsaW5lcyBvZiBjb250ZXh0LiAgVGhlIG51bWJlciBvZiBjb250ZXh0IGxpbmVzIGlzIHNldCBieSAnbicgd2hpY2gKKyAgICBkZWZhdWx0cyB0byB0aHJlZS4KKworICAgIEJ5IGRlZmF1bHQsIHRoZSBkaWZmIGNvbnRyb2wgbGluZXMgKHRob3NlIHdpdGggLS0tLCArKyssIG9yIEBAKSBhcmUKKyAgICBjcmVhdGVkIHdpdGggYSB0cmFpbGluZyBuZXdsaW5lLiAgVGhpcyBpcyBoZWxwZnVsIHNvIHRoYXQgaW5wdXRzCisgICAgY3JlYXRlZCBmcm9tIGZpbGUucmVhZGxpbmVzKCkgcmVzdWx0IGluIGRpZmZzIHRoYXQgYXJlIHN1aXRhYmxlIGZvcgorICAgIGZpbGUud3JpdGVsaW5lcygpIHNpbmNlIGJvdGggdGhlIGlucHV0cyBhbmQgb3V0cHV0cyBoYXZlIHRyYWlsaW5nCisgICAgbmV3bGluZXMuCisKKyAgICBGb3IgaW5wdXRzIHRoYXQgZG8gbm90IGhhdmUgdHJhaWxpbmcgbmV3bGluZXMsIHNldCB0aGUgbGluZXRlcm0KKyAgICBhcmd1bWVudCB0byAiIiBzbyB0aGF0IHRoZSBvdXRwdXQgd2lsbCBiZSB1bmlmb3JtbHkgbmV3bGluZSBmcmVlLgorCisgICAgVGhlIHVuaWRpZmYgZm9ybWF0IG5vcm1hbGx5IGhhcyBhIGhlYWRlciBmb3IgZmlsZW5hbWVzIGFuZCBtb2RpZmljYXRpb24KKyAgICB0aW1lcy4gIEFueSBvciBhbGwgb2YgdGhlc2UgbWF5IGJlIHNwZWNpZmllZCB1c2luZyBzdHJpbmdzIGZvcgorICAgICdmcm9tZmlsZScsICd0b2ZpbGUnLCAnZnJvbWZpbGVkYXRlJywgYW5kICd0b2ZpbGVkYXRlJy4KKyAgICBUaGUgbW9kaWZpY2F0aW9uIHRpbWVzIGFyZSBub3JtYWxseSBleHByZXNzZWQgaW4gdGhlIElTTyA4NjAxIGZvcm1hdC4KKworICAgIEV4YW1wbGU6CisKKyAgICA+Pj4gZm9yIGxpbmUgaW4gdW5pZmllZF9kaWZmKCdvbmUgdHdvIHRocmVlIGZvdXInLnNwbGl0KCksCisgICAgLi4uICAgICAgICAgICAgICd6ZXJvIG9uZSB0cmVlIGZvdXInLnNwbGl0KCksICdPcmlnaW5hbCcsICdDdXJyZW50JywKKyAgICAuLi4gICAgICAgICAgICAgJzIwMDUtMDEtMjYgMjM6MzA6NTAnLCAnMjAxMC0wNC0wMiAxMDoyMDo1MicsCisgICAgLi4uICAgICAgICAgICAgIGxpbmV0ZXJtPScnKToKKyAgICAuLi4gICAgIHByaW50IGxpbmUgICAgICAgICAgICAgICAgICAjIGRvY3Rlc3Q6ICtOT1JNQUxJWkVfV0hJVEVTUEFDRQorICAgIC0tLSBPcmlnaW5hbCAgICAgICAgMjAwNS0wMS0yNiAyMzozMDo1MAorICAgICsrKyBDdXJyZW50ICAgICAgICAgMjAxMC0wNC0wMiAxMDoyMDo1MgorICAgIEBAIC0xLDQgKzEsNCBAQAorICAgICt6ZXJvCisgICAgIG9uZQorICAgIC10d28KKyAgICAtdGhyZWUKKyAgICArdHJlZQorICAgICBmb3VyCisgICAgIiIiCisKKyAgICBzdGFydGVkID0gRmFsc2UKKyAgICBmb3IgZ3JvdXAgaW4gU2VxdWVuY2VNYXRjaGVyKE5vbmUsYSxiKS5nZXRfZ3JvdXBlZF9vcGNvZGVzKG4pOgorICAgICAgICBpZiBub3Qgc3RhcnRlZDoKKyAgICAgICAgICAgIHN0YXJ0ZWQgPSBUcnVlCisgICAgICAgICAgICBmcm9tZGF0ZSA9ICdcdHt9Jy5mb3JtYXQoZnJvbWZpbGVkYXRlKSBpZiBmcm9tZmlsZWRhdGUgZWxzZSAnJworICAgICAgICAgICAgdG9kYXRlID0gJ1x0e30nLmZvcm1hdCh0b2ZpbGVkYXRlKSBpZiB0b2ZpbGVkYXRlIGVsc2UgJycKKyAgICAgICAgICAgIHlpZWxkICctLS0ge317fXt9Jy5mb3JtYXQoZnJvbWZpbGUsIGZyb21kYXRlLCBsaW5ldGVybSkKKyAgICAgICAgICAgIHlpZWxkICcrKysge317fXt9Jy5mb3JtYXQodG9maWxlLCB0b2RhdGUsIGxpbmV0ZXJtKQorCisgICAgICAgIGZpcnN0LCBsYXN0ID0gZ3JvdXBbMF0sIGdyb3VwWy0xXQorICAgICAgICBmaWxlMV9yYW5nZSA9IF9mb3JtYXRfcmFuZ2VfdW5pZmllZChmaXJzdFsxXSwgbGFzdFsyXSkKKyAgICAgICAgZmlsZTJfcmFuZ2UgPSBfZm9ybWF0X3JhbmdlX3VuaWZpZWQoZmlyc3RbM10sIGxhc3RbNF0pCisgICAgICAgIHlpZWxkICdAQCAte30gK3t9IEBAe30nLmZvcm1hdChmaWxlMV9yYW5nZSwgZmlsZTJfcmFuZ2UsIGxpbmV0ZXJtKQorCisgICAgICAgIGZvciB0YWcsIGkxLCBpMiwgajEsIGoyIGluIGdyb3VwOgorICAgICAgICAgICAgaWYgdGFnID09ICdlcXVhbCc6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gYVtpMTppMl06CisgICAgICAgICAgICAgICAgICAgIHlpZWxkICcgJyArIGxpbmUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgdGFnIGluICgncmVwbGFjZScsICdkZWxldGUnKToKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBhW2kxOmkyXToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgJy0nICsgbGluZQorICAgICAgICAgICAgaWYgdGFnIGluICgncmVwbGFjZScsICdpbnNlcnQnKToKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBiW2oxOmoyXToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgJysnICsgbGluZQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjICBDb250ZXh0IERpZmYKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgX2Zvcm1hdF9yYW5nZV9jb250ZXh0KHN0YXJ0LCBzdG9wKToKKyAgICAnQ29udmVydCByYW5nZSB0byB0aGUgImVkIiBmb3JtYXQnCisgICAgIyBQZXIgdGhlIGRpZmYgc3BlYyBhdCBodHRwOi8vd3d3LnVuaXgub3JnL3NpbmdsZV91bml4X3NwZWNpZmljYXRpb24vCisgICAgYmVnaW5uaW5nID0gc3RhcnQgKyAxICAgICAjIGxpbmVzIHN0YXJ0IG51bWJlcmluZyB3aXRoIG9uZQorICAgIGxlbmd0aCA9IHN0b3AgLSBzdGFydAorICAgIGlmIG5vdCBsZW5ndGg6CisgICAgICAgIGJlZ2lubmluZyAtPSAxICAgICAgICAjIGVtcHR5IHJhbmdlcyBiZWdpbiBhdCBsaW5lIGp1c3QgYmVmb3JlIHRoZSByYW5nZQorICAgIGlmIGxlbmd0aCA8PSAxOgorICAgICAgICByZXR1cm4gJ3t9Jy5mb3JtYXQoYmVnaW5uaW5nKQorICAgIHJldHVybiAne30se30nLmZvcm1hdChiZWdpbm5pbmcsIGJlZ2lubmluZyArIGxlbmd0aCAtIDEpCisKKyMgU2VlIGh0dHA6Ly93d3cudW5peC5vcmcvc2luZ2xlX3VuaXhfc3BlY2lmaWNhdGlvbi8KK2RlZiBjb250ZXh0X2RpZmYoYSwgYiwgZnJvbWZpbGU9JycsIHRvZmlsZT0nJywKKyAgICAgICAgICAgICAgICAgZnJvbWZpbGVkYXRlPScnLCB0b2ZpbGVkYXRlPScnLCBuPTMsIGxpbmV0ZXJtPSdcbicpOgorICAgIHIiIiIKKyAgICBDb21wYXJlIHR3byBzZXF1ZW5jZXMgb2YgbGluZXM7IGdlbmVyYXRlIHRoZSBkZWx0YSBhcyBhIGNvbnRleHQgZGlmZi4KKworICAgIENvbnRleHQgZGlmZnMgYXJlIGEgY29tcGFjdCB3YXkgb2Ygc2hvd2luZyBsaW5lIGNoYW5nZXMgYW5kIGEgZmV3CisgICAgbGluZXMgb2YgY29udGV4dC4gIFRoZSBudW1iZXIgb2YgY29udGV4dCBsaW5lcyBpcyBzZXQgYnkgJ24nIHdoaWNoCisgICAgZGVmYXVsdHMgdG8gdGhyZWUuCisKKyAgICBCeSBkZWZhdWx0LCB0aGUgZGlmZiBjb250cm9sIGxpbmVzICh0aG9zZSB3aXRoICoqKiBvciAtLS0pIGFyZQorICAgIGNyZWF0ZWQgd2l0aCBhIHRyYWlsaW5nIG5ld2xpbmUuICBUaGlzIGlzIGhlbHBmdWwgc28gdGhhdCBpbnB1dHMKKyAgICBjcmVhdGVkIGZyb20gZmlsZS5yZWFkbGluZXMoKSByZXN1bHQgaW4gZGlmZnMgdGhhdCBhcmUgc3VpdGFibGUgZm9yCisgICAgZmlsZS53cml0ZWxpbmVzKCkgc2luY2UgYm90aCB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzIGhhdmUgdHJhaWxpbmcKKyAgICBuZXdsaW5lcy4KKworICAgIEZvciBpbnB1dHMgdGhhdCBkbyBub3QgaGF2ZSB0cmFpbGluZyBuZXdsaW5lcywgc2V0IHRoZSBsaW5ldGVybQorICAgIGFyZ3VtZW50IHRvICIiIHNvIHRoYXQgdGhlIG91dHB1dCB3aWxsIGJlIHVuaWZvcm1seSBuZXdsaW5lIGZyZWUuCisKKyAgICBUaGUgY29udGV4dCBkaWZmIGZvcm1hdCBub3JtYWxseSBoYXMgYSBoZWFkZXIgZm9yIGZpbGVuYW1lcyBhbmQKKyAgICBtb2RpZmljYXRpb24gdGltZXMuICBBbnkgb3IgYWxsIG9mIHRoZXNlIG1heSBiZSBzcGVjaWZpZWQgdXNpbmcKKyAgICBzdHJpbmdzIGZvciAnZnJvbWZpbGUnLCAndG9maWxlJywgJ2Zyb21maWxlZGF0ZScsIGFuZCAndG9maWxlZGF0ZScuCisgICAgVGhlIG1vZGlmaWNhdGlvbiB0aW1lcyBhcmUgbm9ybWFsbHkgZXhwcmVzc2VkIGluIHRoZSBJU08gODYwMSBmb3JtYXQuCisgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHN0cmluZ3MgZGVmYXVsdCB0byBibGFua3MuCisKKyAgICBFeGFtcGxlOgorCisgICAgPj4+IHByaW50ICcnLmpvaW4oY29udGV4dF9kaWZmKCdvbmVcbnR3b1xudGhyZWVcbmZvdXJcbicuc3BsaXRsaW5lcygxKSwKKyAgICAuLi4gICAgICAgJ3plcm9cbm9uZVxudHJlZVxuZm91clxuJy5zcGxpdGxpbmVzKDEpLCAnT3JpZ2luYWwnLCAnQ3VycmVudCcpKSwKKyAgICAqKiogT3JpZ2luYWwKKyAgICAtLS0gQ3VycmVudAorICAgICoqKioqKioqKioqKioqKgorICAgICoqKiAxLDQgKioqKgorICAgICAgb25lCisgICAgISB0d28KKyAgICAhIHRocmVlCisgICAgICBmb3VyCisgICAgLS0tIDEsNCAtLS0tCisgICAgKyB6ZXJvCisgICAgICBvbmUKKyAgICAhIHRyZWUKKyAgICAgIGZvdXIKKyAgICAiIiIKKworICAgIHByZWZpeCA9IGRpY3QoaW5zZXJ0PScrICcsIGRlbGV0ZT0nLSAnLCByZXBsYWNlPSchICcsIGVxdWFsPScgICcpCisgICAgc3RhcnRlZCA9IEZhbHNlCisgICAgZm9yIGdyb3VwIGluIFNlcXVlbmNlTWF0Y2hlcihOb25lLGEsYikuZ2V0X2dyb3VwZWRfb3Bjb2RlcyhuKToKKyAgICAgICAgaWYgbm90IHN0YXJ0ZWQ6CisgICAgICAgICAgICBzdGFydGVkID0gVHJ1ZQorICAgICAgICAgICAgZnJvbWRhdGUgPSAnXHR7fScuZm9ybWF0KGZyb21maWxlZGF0ZSkgaWYgZnJvbWZpbGVkYXRlIGVsc2UgJycKKyAgICAgICAgICAgIHRvZGF0ZSA9ICdcdHt9Jy5mb3JtYXQodG9maWxlZGF0ZSkgaWYgdG9maWxlZGF0ZSBlbHNlICcnCisgICAgICAgICAgICB5aWVsZCAnKioqIHt9e317fScuZm9ybWF0KGZyb21maWxlLCBmcm9tZGF0ZSwgbGluZXRlcm0pCisgICAgICAgICAgICB5aWVsZCAnLS0tIHt9e317fScuZm9ybWF0KHRvZmlsZSwgdG9kYXRlLCBsaW5ldGVybSkKKworICAgICAgICBmaXJzdCwgbGFzdCA9IGdyb3VwWzBdLCBncm91cFstMV0KKyAgICAgICAgeWllbGQgJyoqKioqKioqKioqKioqKicgKyBsaW5ldGVybQorCisgICAgICAgIGZpbGUxX3JhbmdlID0gX2Zvcm1hdF9yYW5nZV9jb250ZXh0KGZpcnN0WzFdLCBsYXN0WzJdKQorICAgICAgICB5aWVsZCAnKioqIHt9ICoqKip7fScuZm9ybWF0KGZpbGUxX3JhbmdlLCBsaW5ldGVybSkKKworICAgICAgICBpZiBhbnkodGFnIGluICgncmVwbGFjZScsICdkZWxldGUnKSBmb3IgdGFnLCBfLCBfLCBfLCBfIGluIGdyb3VwKToKKyAgICAgICAgICAgIGZvciB0YWcsIGkxLCBpMiwgXywgXyBpbiBncm91cDoKKyAgICAgICAgICAgICAgICBpZiB0YWcgIT0gJ2luc2VydCc6CisgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGFbaTE6aTJdOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgcHJlZml4W3RhZ10gKyBsaW5lCisKKyAgICAgICAgZmlsZTJfcmFuZ2UgPSBfZm9ybWF0X3JhbmdlX2NvbnRleHQoZmlyc3RbM10sIGxhc3RbNF0pCisgICAgICAgIHlpZWxkICctLS0ge30gLS0tLXt9Jy5mb3JtYXQoZmlsZTJfcmFuZ2UsIGxpbmV0ZXJtKQorCisgICAgICAgIGlmIGFueSh0YWcgaW4gKCdyZXBsYWNlJywgJ2luc2VydCcpIGZvciB0YWcsIF8sIF8sIF8sIF8gaW4gZ3JvdXApOgorICAgICAgICAgICAgZm9yIHRhZywgXywgXywgajEsIGoyIGluIGdyb3VwOgorICAgICAgICAgICAgICAgIGlmIHRhZyAhPSAnZGVsZXRlJzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gYltqMTpqMl06CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBwcmVmaXhbdGFnXSArIGxpbmUKKworZGVmIG5kaWZmKGEsIGIsIGxpbmVqdW5rPU5vbmUsIGNoYXJqdW5rPUlTX0NIQVJBQ1RFUl9KVU5LKToKKyAgICByIiIiCisgICAgQ29tcGFyZSBgYWAgYW5kIGBiYCAobGlzdHMgb2Ygc3RyaW5ncyk7IHJldHVybiBhIGBEaWZmZXJgLXN0eWxlIGRlbHRhLgorCisgICAgT3B0aW9uYWwga2V5d29yZCBwYXJhbWV0ZXJzIGBsaW5lanVua2AgYW5kIGBjaGFyanVua2AgYXJlIGZvciBmaWx0ZXIKKyAgICBmdW5jdGlvbnMgKG9yIE5vbmUpOgorCisgICAgLSBsaW5lanVuazogQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBhY2NlcHQgYSBzaW5nbGUgc3RyaW5nIGFyZ3VtZW50LCBhbmQKKyAgICAgIHJldHVybiB0cnVlIGlmZiB0aGUgc3RyaW5nIGlzIGp1bmsuICBUaGUgZGVmYXVsdCBpcyBOb25lLCBhbmQgaXMKKyAgICAgIHJlY29tbWVuZGVkOyBhcyBvZiBQeXRob24gMi4zLCBhbiBhZGFwdGl2ZSBub3Rpb24gb2YgIm5vaXNlIiBsaW5lcyBpcworICAgICAgdXNlZCB0aGF0IGRvZXMgYSBnb29kIGpvYiBvbiBpdHMgb3duLgorCisgICAgLSBjaGFyanVuazogQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBhY2NlcHQgYSBzdHJpbmcgb2YgbGVuZ3RoIDEuIFRoZQorICAgICAgZGVmYXVsdCBpcyBtb2R1bGUtbGV2ZWwgZnVuY3Rpb24gSVNfQ0hBUkFDVEVSX0pVTkssIHdoaWNoIGZpbHRlcnMgb3V0CisgICAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgKGEgYmxhbmsgb3IgdGFiOyBub3RlOiBiYWQgaWRlYSB0byBpbmNsdWRlIG5ld2xpbmUKKyAgICAgIGluIHRoaXMhKS4KKworICAgIFRvb2xzL3NjcmlwdHMvbmRpZmYucHkgaXMgYSBjb21tYW5kLWxpbmUgZnJvbnQtZW5kIHRvIHRoaXMgZnVuY3Rpb24uCisKKyAgICBFeGFtcGxlOgorCisgICAgPj4+IGRpZmYgPSBuZGlmZignb25lXG50d29cbnRocmVlXG4nLnNwbGl0bGluZXMoMSksCisgICAgLi4uICAgICAgICAgICAgICAnb3JlXG50cmVlXG5lbXVcbicuc3BsaXRsaW5lcygxKSkKKyAgICA+Pj4gcHJpbnQgJycuam9pbihkaWZmKSwKKyAgICAtIG9uZQorICAgID8gIF4KKyAgICArIG9yZQorICAgID8gIF4KKyAgICAtIHR3bworICAgIC0gdGhyZWUKKyAgICA/ICAtCisgICAgKyB0cmVlCisgICAgKyBlbXUKKyAgICAiIiIKKyAgICByZXR1cm4gRGlmZmVyKGxpbmVqdW5rLCBjaGFyanVuaykuY29tcGFyZShhLCBiKQorCitkZWYgX21kaWZmKGZyb21saW5lcywgdG9saW5lcywgY29udGV4dD1Ob25lLCBsaW5lanVuaz1Ob25lLAorICAgICAgICAgICBjaGFyanVuaz1JU19DSEFSQUNURVJfSlVOSyk6CisgICAgciIiIlJldHVybnMgZ2VuZXJhdG9yIHlpZWxkaW5nIG1hcmtlZCB1cCBmcm9tL3RvIHNpZGUgYnkgc2lkZSBkaWZmZXJlbmNlcy4KKworICAgIEFyZ3VtZW50czoKKyAgICBmcm9tbGluZXMgLS0gbGlzdCBvZiB0ZXh0IGxpbmVzIHRvIGNvbXBhcmVkIHRvIHRvbGluZXMKKyAgICB0b2xpbmVzIC0tIGxpc3Qgb2YgdGV4dCBsaW5lcyB0byBiZSBjb21wYXJlZCB0byBmcm9tbGluZXMKKyAgICBjb250ZXh0IC0tIG51bWJlciBvZiBjb250ZXh0IGxpbmVzIHRvIGRpc3BsYXkgb24gZWFjaCBzaWRlIG9mIGRpZmZlcmVuY2UsCisgICAgICAgICAgICAgICBpZiBOb25lLCBhbGwgZnJvbS90byB0ZXh0IGxpbmVzIHdpbGwgYmUgZ2VuZXJhdGVkLgorICAgIGxpbmVqdW5rIC0tIHBhc3NlZCBvbiB0byBuZGlmZiAoc2VlIG5kaWZmIGRvY3VtZW50YXRpb24pCisgICAgY2hhcmp1bmsgLS0gcGFzc2VkIG9uIHRvIG5kaWZmIChzZWUgbmRpZmYgZG9jdW1lbnRhdGlvbikKKworICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlcmF0b3Igd2hpY2ggcmV0dXJucyBhIHR1cGxlOgorICAgIChmcm9tIGxpbmUgdHVwbGUsIHRvIGxpbmUgdHVwbGUsIGJvb2xlYW4gZmxhZykKKworICAgIGZyb20vdG8gbGluZSB0dXBsZSAtLSAobGluZSBudW0sIGxpbmUgdGV4dCkKKyAgICAgICAgbGluZSBudW0gLS0gaW50ZWdlciBvciBOb25lICh0byBpbmRpY2F0ZSBhIGNvbnRleHQgc2VwYXJhdGlvbikKKyAgICAgICAgbGluZSB0ZXh0IC0tIG9yaWdpbmFsIGxpbmUgdGV4dCB3aXRoIGZvbGxvd2luZyBtYXJrZXJzIGluc2VydGVkOgorICAgICAgICAgICAgJ1wwKycgLS0gbWFya3Mgc3RhcnQgb2YgYWRkZWQgdGV4dAorICAgICAgICAgICAgJ1wwLScgLS0gbWFya3Mgc3RhcnQgb2YgZGVsZXRlZCB0ZXh0CisgICAgICAgICAgICAnXDBeJyAtLSBtYXJrcyBzdGFydCBvZiBjaGFuZ2VkIHRleHQKKyAgICAgICAgICAgICdcMScgLS0gbWFya3MgZW5kIG9mIGFkZGVkL2RlbGV0ZWQvY2hhbmdlZCB0ZXh0CisKKyAgICBib29sZWFuIGZsYWcgLS0gTm9uZSBpbmRpY2F0ZXMgY29udGV4dCBzZXBhcmF0aW9uLCBUcnVlIGluZGljYXRlcworICAgICAgICBlaXRoZXIgImZyb20iIG9yICJ0byIgbGluZSBjb250YWlucyBhIGNoYW5nZSwgb3RoZXJ3aXNlIEZhbHNlLgorCisgICAgVGhpcyBmdW5jdGlvbi9pdGVyYXRvciB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgdG8gZ2VuZXJhdGUgc2lkZSBieSBzaWRlCisgICAgZmlsZSBkaWZmZXJlbmNlIGZvciBtYWtpbmcgSFRNTCBwYWdlcyAoc2VlIEh0bWxEaWZmIGNsYXNzIGZvciBleGFtcGxlCisgICAgdXNhZ2UpLgorCisgICAgTm90ZSwgdGhpcyBmdW5jdGlvbiB1dGlsaXplcyB0aGUgbmRpZmYgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIHNpZGUgYnkKKyAgICBzaWRlIGRpZmZlcmVuY2UgbWFya3VwLiAgT3B0aW9uYWwgbmRpZmYgYXJndW1lbnRzIG1heSBiZSBwYXNzZWQgdG8gdGhpcworICAgIGZ1bmN0aW9uIGFuZCB0aGV5IGluIHR1cm4gd2lsbCBiZSBwYXNzZWQgdG8gbmRpZmYuCisgICAgIiIiCisgICAgaW1wb3J0IHJlCisKKyAgICAjIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgZmluZGluZyBpbnRyYWxpbmUgY2hhbmdlIGluZGljZXMKKyAgICBjaGFuZ2VfcmUgPSByZS5jb21waWxlKCcoXCsrfFwtK3xcXispJykKKworICAgICMgY3JlYXRlIHRoZSBkaWZmZXJlbmNlIGl0ZXJhdG9yIHRvIGdlbmVyYXRlIHRoZSBkaWZmZXJlbmNlcworICAgIGRpZmZfbGluZXNfaXRlcmF0b3IgPSBuZGlmZihmcm9tbGluZXMsdG9saW5lcyxsaW5lanVuayxjaGFyanVuaykKKworICAgIGRlZiBfbWFrZV9saW5lKGxpbmVzLCBmb3JtYXRfa2V5LCBzaWRlLCBudW1fbGluZXM9WzAsMF0pOgorICAgICAgICAiIiJSZXR1cm5zIGxpbmUgb2YgdGV4dCB3aXRoIHVzZXIncyBjaGFuZ2UgbWFya3VwIGFuZCBsaW5lIGZvcm1hdHRpbmcuCisKKyAgICAgICAgbGluZXMgLS0gbGlzdCBvZiBsaW5lcyBmcm9tIHRoZSBuZGlmZiBnZW5lcmF0b3IgdG8gcHJvZHVjZSBhIGxpbmUgb2YKKyAgICAgICAgICAgICAgICAgdGV4dCBmcm9tLiAgV2hlbiBwcm9kdWNpbmcgdGhlIGxpbmUgb2YgdGV4dCB0byByZXR1cm4sIHRoZQorICAgICAgICAgICAgICAgICBsaW5lcyB1c2VkIGFyZSByZW1vdmVkIGZyb20gdGhpcyBsaXN0LgorICAgICAgICBmb3JtYXRfa2V5IC0tICcrJyByZXR1cm4gZmlyc3QgbGluZSBpbiBsaXN0IHdpdGggImFkZCIgbWFya3VwIGFyb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW50aXJlIGxpbmUuCisgICAgICAgICAgICAgICAgICAgICAgJy0nIHJldHVybiBmaXJzdCBsaW5lIGluIGxpc3Qgd2l0aCAiZGVsZXRlIiBtYXJrdXAgYXJvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnRpcmUgbGluZS4KKyAgICAgICAgICAgICAgICAgICAgICAnPycgcmV0dXJuIGZpcnN0IGxpbmUgaW4gbGlzdCB3aXRoIGFkZC9kZWxldGUvY2hhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJhbGluZSBtYXJrdXAgKGluZGljZXMgb2J0YWluZWQgZnJvbSBzZWNvbmQgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICBOb25lIHJldHVybiBmaXJzdCBsaW5lIGluIGxpc3Qgd2l0aCBubyBtYXJrdXAKKyAgICAgICAgc2lkZSAtLSBpbmRpY2UgaW50byB0aGUgbnVtX2xpbmVzIGxpc3QgKDA9ZnJvbSwxPXRvKQorICAgICAgICBudW1fbGluZXMgLS0gZnJvbS90byBjdXJyZW50IGxpbmUgbnVtYmVyLiAgVGhpcyBpcyBOT1QgaW50ZW5kZWQgdG8gYmUgYQorICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHBhcmFtZXRlci4gIEl0IGlzIHByZXNlbnQgYXMgYSBrZXl3b3JkIGFyZ3VtZW50IHRvCisgICAgICAgICAgICAgICAgICAgICBtYWludGFpbiBtZW1vcnkgb2YgdGhlIGN1cnJlbnQgbGluZSBudW1iZXJzIGJldHdlZW4gY2FsbHMKKyAgICAgICAgICAgICAgICAgICAgIG9mIHRoaXMgZnVuY3Rpb24uCisKKyAgICAgICAgTm90ZSwgdGhpcyBmdW5jdGlvbiBpcyBwdXJwb3NlZnVsbHkgbm90IGRlZmluZWQgYXQgdGhlIG1vZHVsZSBzY29wZSBzbworICAgICAgICB0aGF0IGRhdGEgaXQgbmVlZHMgZnJvbSBpdHMgcGFyZW50IGZ1bmN0aW9uICh3aXRoaW4gd2hvc2UgY29udGV4dCBpdAorICAgICAgICBpcyBkZWZpbmVkKSBkb2VzIG5vdCBuZWVkIHRvIGJlIG9mIG1vZHVsZSBzY29wZS4KKyAgICAgICAgIiIiCisgICAgICAgIG51bV9saW5lc1tzaWRlXSArPSAxCisgICAgICAgICMgSGFuZGxlIGNhc2Ugd2hlcmUgbm8gdXNlciBtYXJrdXAgaXMgdG8gYmUgYWRkZWQsIGp1c3QgcmV0dXJuIGxpbmUgb2YKKyAgICAgICAgIyB0ZXh0IHdpdGggdXNlcidzIGxpbmUgZm9ybWF0IHRvIGFsbG93IGZvciB1c2FnZSBvZiB0aGUgbGluZSBudW1iZXIuCisgICAgICAgIGlmIGZvcm1hdF9rZXkgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAobnVtX2xpbmVzW3NpZGVdLGxpbmVzLnBvcCgwKVsyOl0pCisgICAgICAgICMgSGFuZGxlIGNhc2Ugb2YgaW50cmFsaW5lIGNoYW5nZXMKKyAgICAgICAgaWYgZm9ybWF0X2tleSA9PSAnPyc6CisgICAgICAgICAgICB0ZXh0LCBtYXJrZXJzID0gbGluZXMucG9wKDApLCBsaW5lcy5wb3AoMCkKKyAgICAgICAgICAgICMgZmluZCBpbnRyYWxpbmUgY2hhbmdlcyAoc3RvcmUgY2hhbmdlIHR5cGUgYW5kIGluZGljZXMgaW4gdHVwbGVzKQorICAgICAgICAgICAgc3ViX2luZm8gPSBbXQorICAgICAgICAgICAgZGVmIHJlY29yZF9zdWJfaW5mbyhtYXRjaF9vYmplY3Qsc3ViX2luZm89c3ViX2luZm8pOgorICAgICAgICAgICAgICAgIHN1Yl9pbmZvLmFwcGVuZChbbWF0Y2hfb2JqZWN0Lmdyb3VwKDEpWzBdLG1hdGNoX29iamVjdC5zcGFuKCldKQorICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaF9vYmplY3QuZ3JvdXAoMSkKKyAgICAgICAgICAgIGNoYW5nZV9yZS5zdWIocmVjb3JkX3N1Yl9pbmZvLG1hcmtlcnMpCisgICAgICAgICAgICAjIHByb2Nlc3MgZWFjaCB0dXBsZSBpbnNlcnRpbmcgb3VyIHNwZWNpYWwgbWFya3MgdGhhdCB3b24ndCBiZQorICAgICAgICAgICAgIyBub3RpY2VkIGJ5IGFuIHhtbC9odG1sIGVzY2FwZXIuCisgICAgICAgICAgICBmb3Iga2V5LChiZWdpbixlbmQpIGluIHN1Yl9pbmZvWzo6LTFdOgorICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0WzA6YmVnaW5dKydcMCcra2V5K3RleHRbYmVnaW46ZW5kXSsnXDEnK3RleHRbZW5kOl0KKyAgICAgICAgICAgIHRleHQgPSB0ZXh0WzI6XQorICAgICAgICAjIEhhbmRsZSBjYXNlIG9mIGFkZC9kZWxldGUgZW50aXJlIGxpbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRleHQgPSBsaW5lcy5wb3AoMClbMjpdCisgICAgICAgICAgICAjIGlmIGxpbmUgb2YgdGV4dCBpcyBqdXN0IGEgbmV3bGluZSwgaW5zZXJ0IGEgc3BhY2Ugc28gdGhlcmUgaXMKKyAgICAgICAgICAgICMgc29tZXRoaW5nIGZvciB0aGUgdXNlciB0byBoaWdobGlnaHQgYW5kIHNlZS4KKyAgICAgICAgICAgIGlmIG5vdCB0ZXh0OgorICAgICAgICAgICAgICAgIHRleHQgPSAnICcKKyAgICAgICAgICAgICMgaW5zZXJ0IG1hcmtzIHRoYXQgd29uJ3QgYmUgbm90aWNlZCBieSBhbiB4bWwvaHRtbCBlc2NhcGVyLgorICAgICAgICAgICAgdGV4dCA9ICdcMCcgKyBmb3JtYXRfa2V5ICsgdGV4dCArICdcMScKKyAgICAgICAgIyBSZXR1cm4gbGluZSBvZiB0ZXh0LCBmaXJzdCBhbGxvdyB1c2VyJ3MgbGluZSBmb3JtYXR0ZXIgdG8gZG8gaXRzCisgICAgICAgICMgdGhpbmcgKHN1Y2ggYXMgYWRkaW5nIHRoZSBsaW5lIG51bWJlcikgdGhlbiByZXBsYWNlIHRoZSBzcGVjaWFsCisgICAgICAgICMgbWFya3Mgd2l0aCB3aGF0IHRoZSB1c2VyJ3MgY2hhbmdlIG1hcmt1cC4KKyAgICAgICAgcmV0dXJuIChudW1fbGluZXNbc2lkZV0sdGV4dCkKKworICAgIGRlZiBfbGluZV9pdGVyYXRvcigpOgorICAgICAgICAiIiJZaWVsZHMgZnJvbS90byBsaW5lcyBvZiB0ZXh0IHdpdGggYSBjaGFuZ2UgaW5kaWNhdGlvbi4KKworICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGFuIGl0ZXJhdG9yLiAgSXQgaXRzZWxmIHB1bGxzIGxpbmVzIGZyb20gYQorICAgICAgICBkaWZmZXJlbmNpbmcgaXRlcmF0b3IsIHByb2Nlc3NlcyB0aGVtIGFuZCB5aWVsZHMgdGhlbS4gIFdoZW4gaXQgY2FuCisgICAgICAgIGl0IHlpZWxkcyBib3RoIGEgImZyb20iIGFuZCBhICJ0byIgbGluZSwgb3RoZXJ3aXNlIGl0IHdpbGwgeWllbGQgb25lCisgICAgICAgIG9yIHRoZSBvdGhlci4gIEluIGFkZGl0aW9uIHRvIHlpZWxkaW5nIHRoZSBsaW5lcyBvZiBmcm9tL3RvIHRleHQsIGEKKyAgICAgICAgYm9vbGVhbiBmbGFnIGlzIHlpZWxkZWQgdG8gaW5kaWNhdGUgaWYgdGhlIHRleHQgbGluZShzKSBoYXZlCisgICAgICAgIGRpZmZlcmVuY2VzIGluIHRoZW0uCisKKyAgICAgICAgTm90ZSwgdGhpcyBmdW5jdGlvbiBpcyBwdXJwb3NlZnVsbHkgbm90IGRlZmluZWQgYXQgdGhlIG1vZHVsZSBzY29wZSBzbworICAgICAgICB0aGF0IGRhdGEgaXQgbmVlZHMgZnJvbSBpdHMgcGFyZW50IGZ1bmN0aW9uICh3aXRoaW4gd2hvc2UgY29udGV4dCBpdAorICAgICAgICBpcyBkZWZpbmVkKSBkb2VzIG5vdCBuZWVkIHRvIGJlIG9mIG1vZHVsZSBzY29wZS4KKyAgICAgICAgIiIiCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgbnVtX2JsYW5rc19wZW5kaW5nLCBudW1fYmxhbmtzX3RvX3lpZWxkID0gMCwgMAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgIyBMb2FkIHVwIG5leHQgNCBsaW5lcyBzbyB3ZSBjYW4gbG9vayBhaGVhZCwgY3JlYXRlIHN0cmluZ3Mgd2hpY2gKKyAgICAgICAgICAgICMgYXJlIGEgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGVhY2ggb2YgdGhlIDQgbGluZXMKKyAgICAgICAgICAgICMgc28gd2UgY2FuIGRvIHNvbWUgdmVyeSByZWFkYWJsZSBjb21wYXJpc29ucy4KKyAgICAgICAgICAgIHdoaWxlIGxlbihsaW5lcykgPCA0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGRpZmZfbGluZXNfaXRlcmF0b3IubmV4dCgpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJ1gnKQorICAgICAgICAgICAgcyA9ICcnLmpvaW4oW2xpbmVbMF0gZm9yIGxpbmUgaW4gbGluZXNdKQorICAgICAgICAgICAgaWYgcy5zdGFydHN3aXRoKCdYJyk6CisgICAgICAgICAgICAgICAgIyBXaGVuIG5vIG1vcmUgbGluZXMsIHB1bXAgb3V0IGFueSByZW1haW5pbmcgYmxhbmsgbGluZXMgc28gdGhlCisgICAgICAgICAgICAgICAgIyBjb3JyZXNwb25kaW5nIGFkZC9kZWxldGUgbGluZXMgZ2V0IGEgbWF0Y2hpbmcgYmxhbmsgbGluZSBzbworICAgICAgICAgICAgICAgICMgYWxsIGxpbmUgcGFpcnMgZ2V0IHlpZWxkZWQgYXQgdGhlIG5leHQgbGV2ZWwuCisgICAgICAgICAgICAgICAgbnVtX2JsYW5rc190b195aWVsZCA9IG51bV9ibGFua3NfcGVuZGluZworICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoJy0/Kz8nKToKKyAgICAgICAgICAgICAgICAjIHNpbXBsZSBpbnRyYWxpbmUgY2hhbmdlCisgICAgICAgICAgICAgICAgeWllbGQgX21ha2VfbGluZShsaW5lcywnPycsMCksIF9tYWtlX2xpbmUobGluZXMsJz8nLDEpLCBUcnVlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgcy5zdGFydHN3aXRoKCctLSsrJyk6CisgICAgICAgICAgICAgICAgIyBpbiBkZWxldGUgYmxvY2ssIGFkZCBibG9jayBjb21pbmc6IHdlIGRvIE5PVCB3YW50IHRvIGdldAorICAgICAgICAgICAgICAgICMgY2F1Z2h0IHVwIG9uIGJsYW5rIGxpbmVzIHlldCwganVzdCBwcm9jZXNzIHRoZSBkZWxldGUgbGluZQorICAgICAgICAgICAgICAgIG51bV9ibGFua3NfcGVuZGluZyAtPSAxCisgICAgICAgICAgICAgICAgeWllbGQgX21ha2VfbGluZShsaW5lcywnLScsMCksIE5vbmUsIFRydWUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoKCctLT8rJywgJy0tKycsICctICcpKToKKyAgICAgICAgICAgICAgICAjIGluIGRlbGV0ZSBibG9jayBhbmQgc2VlIGEgaW50cmFsaW5lIGNoYW5nZSBvciB1bmNoYW5nZWQgbGluZQorICAgICAgICAgICAgICAgICMgY29taW5nOiB5aWVsZCB0aGUgZGVsZXRlIGxpbmUgYW5kIHRoZW4gYmxhbmtzCisgICAgICAgICAgICAgICAgZnJvbV9saW5lLHRvX2xpbmUgPSBfbWFrZV9saW5lKGxpbmVzLCctJywwKSwgTm9uZQorICAgICAgICAgICAgICAgIG51bV9ibGFua3NfdG9feWllbGQsbnVtX2JsYW5rc19wZW5kaW5nID0gbnVtX2JsYW5rc19wZW5kaW5nLTEsMAorICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoJy0rPycpOgorICAgICAgICAgICAgICAgICMgaW50cmFsaW5lIGNoYW5nZQorICAgICAgICAgICAgICAgIHlpZWxkIF9tYWtlX2xpbmUobGluZXMsTm9uZSwwKSwgX21ha2VfbGluZShsaW5lcywnPycsMSksIFRydWUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoJy0/KycpOgorICAgICAgICAgICAgICAgICMgaW50cmFsaW5lIGNoYW5nZQorICAgICAgICAgICAgICAgIHlpZWxkIF9tYWtlX2xpbmUobGluZXMsJz8nLDApLCBfbWFrZV9saW5lKGxpbmVzLE5vbmUsMSksIFRydWUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoJy0nKToKKyAgICAgICAgICAgICAgICAjIGRlbGV0ZSBGUk9NIGxpbmUKKyAgICAgICAgICAgICAgICBudW1fYmxhbmtzX3BlbmRpbmcgLT0gMQorICAgICAgICAgICAgICAgIHlpZWxkIF9tYWtlX2xpbmUobGluZXMsJy0nLDApLCBOb25lLCBUcnVlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgcy5zdGFydHN3aXRoKCcrLS0nKToKKyAgICAgICAgICAgICAgICAjIGluIGFkZCBibG9jaywgZGVsZXRlIGJsb2NrIGNvbWluZzogd2UgZG8gTk9UIHdhbnQgdG8gZ2V0CisgICAgICAgICAgICAgICAgIyBjYXVnaHQgdXAgb24gYmxhbmsgbGluZXMgeWV0LCBqdXN0IHByb2Nlc3MgdGhlIGFkZCBsaW5lCisgICAgICAgICAgICAgICAgbnVtX2JsYW5rc19wZW5kaW5nICs9IDEKKyAgICAgICAgICAgICAgICB5aWVsZCBOb25lLCBfbWFrZV9saW5lKGxpbmVzLCcrJywxKSwgVHJ1ZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgoJysgJywgJystJykpOgorICAgICAgICAgICAgICAgICMgd2lsbCBiZSBsZWF2aW5nIGFuIGFkZCBibG9jazogeWllbGQgYmxhbmtzIHRoZW4gYWRkIGxpbmUKKyAgICAgICAgICAgICAgICBmcm9tX2xpbmUsIHRvX2xpbmUgPSBOb25lLCBfbWFrZV9saW5lKGxpbmVzLCcrJywxKQorICAgICAgICAgICAgICAgIG51bV9ibGFua3NfdG9feWllbGQsbnVtX2JsYW5rc19wZW5kaW5nID0gbnVtX2JsYW5rc19wZW5kaW5nKzEsMAorICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoJysnKToKKyAgICAgICAgICAgICAgICAjIGluc2lkZSBhbiBhZGQgYmxvY2ssIHlpZWxkIHRoZSBhZGQgbGluZQorICAgICAgICAgICAgICAgIG51bV9ibGFua3NfcGVuZGluZyArPSAxCisgICAgICAgICAgICAgICAgeWllbGQgTm9uZSwgX21ha2VfbGluZShsaW5lcywnKycsMSksIFRydWUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoJyAnKToKKyAgICAgICAgICAgICAgICAjIHVuY2hhbmdlZCB0ZXh0LCB5aWVsZCBpdCB0byBib3RoIHNpZGVzCisgICAgICAgICAgICAgICAgeWllbGQgX21ha2VfbGluZShsaW5lc1s6XSxOb25lLDApLF9tYWtlX2xpbmUobGluZXMsTm9uZSwxKSxGYWxzZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIENhdGNoIHVwIG9uIHRoZSBibGFuayBsaW5lcyBzbyB3aGVuIHdlIHlpZWxkIHRoZSBuZXh0IGZyb20vdG8KKyAgICAgICAgICAgICMgcGFpciwgdGhleSBhcmUgbGluZWQgdXAuCisgICAgICAgICAgICB3aGlsZShudW1fYmxhbmtzX3RvX3lpZWxkIDwgMCk6CisgICAgICAgICAgICAgICAgbnVtX2JsYW5rc190b195aWVsZCArPSAxCisgICAgICAgICAgICAgICAgeWllbGQgTm9uZSwoJycsJ1xuJyksVHJ1ZQorICAgICAgICAgICAgd2hpbGUobnVtX2JsYW5rc190b195aWVsZCA+IDApOgorICAgICAgICAgICAgICAgIG51bV9ibGFua3NfdG9feWllbGQgLT0gMQorICAgICAgICAgICAgICAgIHlpZWxkICgnJywnXG4nKSxOb25lLFRydWUKKyAgICAgICAgICAgIGlmIHMuc3RhcnRzd2l0aCgnWCcpOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgZnJvbV9saW5lLHRvX2xpbmUsVHJ1ZQorCisgICAgZGVmIF9saW5lX3BhaXJfaXRlcmF0b3IoKToKKyAgICAgICAgIiIiWWllbGRzIGZyb20vdG8gbGluZXMgb2YgdGV4dCB3aXRoIGEgY2hhbmdlIGluZGljYXRpb24uCisKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBhbiBpdGVyYXRvci4gIEl0IGl0c2VsZiBwdWxscyBsaW5lcyBmcm9tIHRoZSBsaW5lCisgICAgICAgIGl0ZXJhdG9yLiAgSXRzIGRpZmZlcmVuY2UgZnJvbSB0aGF0IGl0ZXJhdG9yIGlzIHRoYXQgdGhpcyBmdW5jdGlvbgorICAgICAgICBhbHdheXMgeWllbGRzIGEgcGFpciBvZiBmcm9tL3RvIHRleHQgbGluZXMgKHdpdGggdGhlIGNoYW5nZQorICAgICAgICBpbmRpY2F0aW9uKS4gIElmIG5lY2Vzc2FyeSBpdCB3aWxsIGNvbGxlY3Qgc2luZ2xlIGZyb20vdG8gbGluZXMKKyAgICAgICAgdW50aWwgaXQgaGFzIGEgbWF0Y2hpbmcgcGFpciBmcm9tL3RvIHBhaXIgdG8geWllbGQuCisKKyAgICAgICAgTm90ZSwgdGhpcyBmdW5jdGlvbiBpcyBwdXJwb3NlZnVsbHkgbm90IGRlZmluZWQgYXQgdGhlIG1vZHVsZSBzY29wZSBzbworICAgICAgICB0aGF0IGRhdGEgaXQgbmVlZHMgZnJvbSBpdHMgcGFyZW50IGZ1bmN0aW9uICh3aXRoaW4gd2hvc2UgY29udGV4dCBpdAorICAgICAgICBpcyBkZWZpbmVkKSBkb2VzIG5vdCBuZWVkIHRvIGJlIG9mIG1vZHVsZSBzY29wZS4KKyAgICAgICAgIiIiCisgICAgICAgIGxpbmVfaXRlcmF0b3IgPSBfbGluZV9pdGVyYXRvcigpCisgICAgICAgIGZyb21saW5lcyx0b2xpbmVzPVtdLFtdCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAjIENvbGxlY3RpbmcgbGluZXMgb2YgdGV4dCB1bnRpbCB3ZSBoYXZlIGEgZnJvbS90byBwYWlyCisgICAgICAgICAgICB3aGlsZSAobGVuKGZyb21saW5lcyk9PTAgb3IgbGVuKHRvbGluZXMpPT0wKToKKyAgICAgICAgICAgICAgICBmcm9tX2xpbmUsIHRvX2xpbmUsIGZvdW5kX2RpZmYgPWxpbmVfaXRlcmF0b3IubmV4dCgpCisgICAgICAgICAgICAgICAgaWYgZnJvbV9saW5lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBmcm9tbGluZXMuYXBwZW5kKChmcm9tX2xpbmUsZm91bmRfZGlmZikpCisgICAgICAgICAgICAgICAgaWYgdG9fbGluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgdG9saW5lcy5hcHBlbmQoKHRvX2xpbmUsZm91bmRfZGlmZikpCisgICAgICAgICAgICAjIE9uY2Ugd2UgaGF2ZSBhIHBhaXIsIHJlbW92ZSB0aGVtIGZyb20gdGhlIGNvbGxlY3Rpb24gYW5kIHlpZWxkIGl0CisgICAgICAgICAgICBmcm9tX2xpbmUsIGZyb21EaWZmID0gZnJvbWxpbmVzLnBvcCgwKQorICAgICAgICAgICAgdG9fbGluZSwgdG9fZGlmZiA9IHRvbGluZXMucG9wKDApCisgICAgICAgICAgICB5aWVsZCAoZnJvbV9saW5lLHRvX2xpbmUsZnJvbURpZmYgb3IgdG9fZGlmZikKKworICAgICMgSGFuZGxlIGNhc2Ugd2hlcmUgdXNlciBkb2VzIG5vdCB3YW50IGNvbnRleHQgZGlmZmVyZW5jaW5nLCBqdXN0IHlpZWxkCisgICAgIyB0aGVtIHVwIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcgZWxzZSB3aXRoIHRoZW0uCisgICAgbGluZV9wYWlyX2l0ZXJhdG9yID0gX2xpbmVfcGFpcl9pdGVyYXRvcigpCisgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgeWllbGQgbGluZV9wYWlyX2l0ZXJhdG9yLm5leHQoKQorICAgICMgSGFuZGxlIGNhc2Ugd2hlcmUgdXNlciB3YW50cyBjb250ZXh0IGRpZmZlcmVuY2luZy4gIFdlIG11c3QgZG8gc29tZQorICAgICMgc3RvcmFnZSBvZiBsaW5lcyB1bnRpbCB3ZSBrbm93IGZvciBzdXJlIHRoYXQgdGhleSBhcmUgdG8gYmUgeWllbGRlZC4KKyAgICBlbHNlOgorICAgICAgICBjb250ZXh0ICs9IDEKKyAgICAgICAgbGluZXNfdG9fd3JpdGUgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAjIFN0b3JlIGxpbmVzIHVwIHVudGlsIHdlIGZpbmQgYSBkaWZmZXJlbmNlLCBub3RlIHVzZSBvZiBhCisgICAgICAgICAgICAjIGNpcmN1bGFyIHF1ZXVlIGJlY2F1c2Ugd2Ugb25seSBuZWVkIHRvIGtlZXAgYXJvdW5kIHdoYXQKKyAgICAgICAgICAgICMgd2UgbmVlZCBmb3IgY29udGV4dC4KKyAgICAgICAgICAgIGluZGV4LCBjb250ZXh0TGluZXMgPSAwLCBbTm9uZV0qKGNvbnRleHQpCisgICAgICAgICAgICBmb3VuZF9kaWZmID0gRmFsc2UKKyAgICAgICAgICAgIHdoaWxlKGZvdW5kX2RpZmYgaXMgRmFsc2UpOgorICAgICAgICAgICAgICAgIGZyb21fbGluZSwgdG9fbGluZSwgZm91bmRfZGlmZiA9IGxpbmVfcGFpcl9pdGVyYXRvci5uZXh0KCkKKyAgICAgICAgICAgICAgICBpID0gaW5kZXggJSBjb250ZXh0CisgICAgICAgICAgICAgICAgY29udGV4dExpbmVzW2ldID0gKGZyb21fbGluZSwgdG9fbGluZSwgZm91bmRfZGlmZikKKyAgICAgICAgICAgICAgICBpbmRleCArPSAxCisgICAgICAgICAgICAjIFlpZWxkIGxpbmVzIHRoYXQgd2UgaGF2ZSBjb2xsZWN0ZWQgc28gZmFyLCBidXQgZmlyc3QgeWllbGQKKyAgICAgICAgICAgICMgdGhlIHVzZXIncyBzZXBhcmF0b3IuCisgICAgICAgICAgICBpZiBpbmRleCA+IGNvbnRleHQ6CisgICAgICAgICAgICAgICAgeWllbGQgTm9uZSwgTm9uZSwgTm9uZQorICAgICAgICAgICAgICAgIGxpbmVzX3RvX3dyaXRlID0gY29udGV4dAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsaW5lc190b193cml0ZSA9IGluZGV4CisgICAgICAgICAgICAgICAgaW5kZXggPSAwCisgICAgICAgICAgICB3aGlsZShsaW5lc190b193cml0ZSk6CisgICAgICAgICAgICAgICAgaSA9IGluZGV4ICUgY29udGV4dAorICAgICAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgICAgICB5aWVsZCBjb250ZXh0TGluZXNbaV0KKyAgICAgICAgICAgICAgICBsaW5lc190b193cml0ZSAtPSAxCisgICAgICAgICAgICAjIE5vdyB5aWVsZCB0aGUgY29udGV4dCBsaW5lcyBhZnRlciB0aGUgY2hhbmdlCisgICAgICAgICAgICBsaW5lc190b193cml0ZSA9IGNvbnRleHQtMQorICAgICAgICAgICAgd2hpbGUobGluZXNfdG9fd3JpdGUpOgorICAgICAgICAgICAgICAgIGZyb21fbGluZSwgdG9fbGluZSwgZm91bmRfZGlmZiA9IGxpbmVfcGFpcl9pdGVyYXRvci5uZXh0KCkKKyAgICAgICAgICAgICAgICAjIElmIGFub3RoZXIgY2hhbmdlIHdpdGhpbiB0aGUgY29udGV4dCwgZXh0ZW5kIHRoZSBjb250ZXh0CisgICAgICAgICAgICAgICAgaWYgZm91bmRfZGlmZjoKKyAgICAgICAgICAgICAgICAgICAgbGluZXNfdG9fd3JpdGUgPSBjb250ZXh0LTEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsaW5lc190b193cml0ZSAtPSAxCisgICAgICAgICAgICAgICAgeWllbGQgZnJvbV9saW5lLCB0b19saW5lLCBmb3VuZF9kaWZmCisKKworX2ZpbGVfdGVtcGxhdGUgPSAiIiIKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorCis8aHRtbD4KKworPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgorICAgICAgICAgIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgorICAgIDx0aXRsZT48L3RpdGxlPgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+JShzdHlsZXMpcworICAgIDwvc3R5bGU+Cis8L2hlYWQ+CisKKzxib2R5PgorICAgICUodGFibGUpcyUobGVnZW5kKXMKKzwvYm9keT4KKworPC9odG1sPiIiIgorCitfc3R5bGVzID0gIiIiCisgICAgICAgIHRhYmxlLmRpZmYge2ZvbnQtZmFtaWx5OkNvdXJpZXI7IGJvcmRlcjptZWRpdW07fQorICAgICAgICAuZGlmZl9oZWFkZXIge2JhY2tncm91bmQtY29sb3I6I2UwZTBlMH0KKyAgICAgICAgdGQuZGlmZl9oZWFkZXIge3RleHQtYWxpZ246cmlnaHR9CisgICAgICAgIC5kaWZmX25leHQge2JhY2tncm91bmQtY29sb3I6I2MwYzBjMH0KKyAgICAgICAgLmRpZmZfYWRkIHtiYWNrZ3JvdW5kLWNvbG9yOiNhYWZmYWF9CisgICAgICAgIC5kaWZmX2NoZyB7YmFja2dyb3VuZC1jb2xvcjojZmZmZjc3fQorICAgICAgICAuZGlmZl9zdWIge2JhY2tncm91bmQtY29sb3I6I2ZmYWFhYX0iIiIKKworX3RhYmxlX3RlbXBsYXRlID0gIiIiCisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBpZD0iZGlmZmxpYl9jaGdfJShwcmVmaXgpc190b3AiCisgICAgICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgcnVsZXM9Imdyb3VwcyIgPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICAlKGhlYWRlcl9yb3cpcworICAgICAgICA8dGJvZHk+CislKGRhdGFfcm93cylzICAgICAgICA8L3Rib2R5PgorICAgIDwvdGFibGU+IiIiCisKK19sZWdlbmQgPSAiIiIKKyAgICA8dGFibGUgY2xhc3M9ImRpZmYiIHN1bW1hcnk9IkxlZ2VuZHMiPgorICAgICAgICA8dHI+IDx0aCBjb2xzcGFuPSIyIj4gTGVnZW5kcyA8L3RoPiA8L3RyPgorICAgICAgICA8dHI+IDx0ZD4gPHRhYmxlIGJvcmRlcj0iIiBzdW1tYXJ5PSJDb2xvcnMiPgorICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGg+IENvbG9ycyA8L3RoPiA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDtBZGRlZCZuYnNwOzwvdGQ+PC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX2NoZyI+Q2hhbmdlZDwvdGQ+IDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9zdWIiPkRlbGV0ZWQ8L3RkPiA8L3RyPgorICAgICAgICAgICAgICAgICAgPC90YWJsZT48L3RkPgorICAgICAgICAgICAgIDx0ZD4gPHRhYmxlIGJvcmRlcj0iIiBzdW1tYXJ5PSJMaW5rcyI+CisgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0aCBjb2xzcGFuPSIyIj4gTGlua3MgPC90aD4gPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPihmKWlyc3QgY2hhbmdlPC90ZD4gPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPihuKWV4dCBjaGFuZ2U8L3RkPiA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+KHQpb3A8L3RkPiA8L3RyPgorICAgICAgICAgICAgICAgICAgPC90YWJsZT48L3RkPiA8L3RyPgorICAgIDwvdGFibGU+IiIiCisKK2NsYXNzIEh0bWxEaWZmKG9iamVjdCk6CisgICAgIiIiRm9yIHByb2R1Y2luZyBIVE1MIHNpZGUgYnkgc2lkZSBjb21wYXJpc29uIHdpdGggY2hhbmdlIGhpZ2hsaWdodHMuCisKKyAgICBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBIVE1MIHRhYmxlIChvciBhIGNvbXBsZXRlIEhUTUwgZmlsZQorICAgIGNvbnRhaW5pbmcgdGhlIHRhYmxlKSBzaG93aW5nIGEgc2lkZSBieSBzaWRlLCBsaW5lIGJ5IGxpbmUgY29tcGFyaXNvbgorICAgIG9mIHRleHQgd2l0aCBpbnRlci1saW5lIGFuZCBpbnRyYS1saW5lIGNoYW5nZSBoaWdobGlnaHRzLiAgVGhlIHRhYmxlIGNhbgorICAgIGJlIGdlbmVyYXRlZCBpbiBlaXRoZXIgZnVsbCBvciBjb250ZXh0dWFsIGRpZmZlcmVuY2UgbW9kZS4KKworICAgIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgcHJvdmlkZWQgZm9yIEhUTUwgZ2VuZXJhdGlvbjoKKworICAgIG1ha2VfdGFibGUgLS0gZ2VuZXJhdGVzIEhUTUwgZm9yIGEgc2luZ2xlIHNpZGUgYnkgc2lkZSB0YWJsZQorICAgIG1ha2VfZmlsZSAtLSBnZW5lcmF0ZXMgY29tcGxldGUgSFRNTCBmaWxlIHdpdGggYSBzaW5nbGUgc2lkZSBieSBzaWRlIHRhYmxlCisKKyAgICBTZWUgdG9vbHMvc2NyaXB0cy9kaWZmLnB5IGZvciBhbiBleGFtcGxlIHVzYWdlIG9mIHRoaXMgY2xhc3MuCisgICAgIiIiCisKKyAgICBfZmlsZV90ZW1wbGF0ZSA9IF9maWxlX3RlbXBsYXRlCisgICAgX3N0eWxlcyA9IF9zdHlsZXMKKyAgICBfdGFibGVfdGVtcGxhdGUgPSBfdGFibGVfdGVtcGxhdGUKKyAgICBfbGVnZW5kID0gX2xlZ2VuZAorICAgIF9kZWZhdWx0X3ByZWZpeCA9IDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLHRhYnNpemU9OCx3cmFwY29sdW1uPU5vbmUsbGluZWp1bms9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY2hhcmp1bms9SVNfQ0hBUkFDVEVSX0pVTkspOgorICAgICAgICAiIiJIdG1sRGlmZiBpbnN0YW5jZSBpbml0aWFsaXplcgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgdGFic2l6ZSAtLSB0YWIgc3RvcCBzcGFjaW5nLCBkZWZhdWx0cyB0byA4LgorICAgICAgICB3cmFwY29sdW1uIC0tIGNvbHVtbiBudW1iZXIgd2hlcmUgbGluZXMgYXJlIGJyb2tlbiBhbmQgd3JhcHBlZCwKKyAgICAgICAgICAgIGRlZmF1bHRzIHRvIE5vbmUgd2hlcmUgbGluZXMgYXJlIG5vdCB3cmFwcGVkLgorICAgICAgICBsaW5lanVuayxjaGFyanVuayAtLSBrZXl3b3JkIGFyZ3VtZW50cyBwYXNzZWQgaW50byBuZGlmZigpICh1c2VkIHRvIGJ5CisgICAgICAgICAgICBIdG1sRGlmZigpIHRvIGdlbmVyYXRlIHRoZSBzaWRlIGJ5IHNpZGUgSFRNTCBkaWZmZXJlbmNlcykuICBTZWUKKyAgICAgICAgICAgIG5kaWZmKCkgZG9jdW1lbnRhdGlvbiBmb3IgYXJndW1lbnQgZGVmYXVsdCB2YWx1ZXMgYW5kIGRlc2NyaXB0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3RhYnNpemUgPSB0YWJzaXplCisgICAgICAgIHNlbGYuX3dyYXBjb2x1bW4gPSB3cmFwY29sdW1uCisgICAgICAgIHNlbGYuX2xpbmVqdW5rID0gbGluZWp1bmsKKyAgICAgICAgc2VsZi5fY2hhcmp1bmsgPSBjaGFyanVuaworCisgICAgZGVmIG1ha2VfZmlsZShzZWxmLGZyb21saW5lcyx0b2xpbmVzLGZyb21kZXNjPScnLHRvZGVzYz0nJyxjb250ZXh0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgbnVtbGluZXM9NSk6CisgICAgICAgICIiIlJldHVybnMgSFRNTCBmaWxlIG9mIHNpZGUgYnkgc2lkZSBjb21wYXJpc29uIHdpdGggY2hhbmdlIGhpZ2hsaWdodHMKKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIGZyb21saW5lcyAtLSBsaXN0IG9mICJmcm9tIiBsaW5lcworICAgICAgICB0b2xpbmVzIC0tIGxpc3Qgb2YgInRvIiBsaW5lcworICAgICAgICBmcm9tZGVzYyAtLSAiZnJvbSIgZmlsZSBjb2x1bW4gaGVhZGVyIHN0cmluZworICAgICAgICB0b2Rlc2MgLS0gInRvIiBmaWxlIGNvbHVtbiBoZWFkZXIgc3RyaW5nCisgICAgICAgIGNvbnRleHQgLS0gc2V0IHRvIFRydWUgZm9yIGNvbnRleHR1YWwgZGlmZmVyZW5jZXMgKGRlZmF1bHRzIHRvIEZhbHNlCisgICAgICAgICAgICB3aGljaCBzaG93cyBmdWxsIGRpZmZlcmVuY2VzKS4KKyAgICAgICAgbnVtbGluZXMgLS0gbnVtYmVyIG9mIGNvbnRleHQgbGluZXMuICBXaGVuIGNvbnRleHQgaXMgc2V0IFRydWUsCisgICAgICAgICAgICBjb250cm9scyBudW1iZXIgb2YgbGluZXMgZGlzcGxheWVkIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGNoYW5nZS4KKyAgICAgICAgICAgIFdoZW4gY29udGV4dCBpcyBGYWxzZSwgY29udHJvbHMgdGhlIG51bWJlciBvZiBsaW5lcyB0byBwbGFjZQorICAgICAgICAgICAgdGhlICJuZXh0IiBsaW5rIGFuY2hvcnMgYmVmb3JlIHRoZSBuZXh0IGNoYW5nZSAoc28gY2xpY2sgb2YKKyAgICAgICAgICAgICJuZXh0IiBsaW5rIGp1bXBzIHRvIGp1c3QgYmVmb3JlIHRoZSBjaGFuZ2UpLgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5fZmlsZV90ZW1wbGF0ZSAlIGRpY3QoCisgICAgICAgICAgICBzdHlsZXMgPSBzZWxmLl9zdHlsZXMsCisgICAgICAgICAgICBsZWdlbmQgPSBzZWxmLl9sZWdlbmQsCisgICAgICAgICAgICB0YWJsZSA9IHNlbGYubWFrZV90YWJsZShmcm9tbGluZXMsdG9saW5lcyxmcm9tZGVzYyx0b2Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0PWNvbnRleHQsbnVtbGluZXM9bnVtbGluZXMpKQorCisgICAgZGVmIF90YWJfbmV3bGluZV9yZXBsYWNlKHNlbGYsZnJvbWxpbmVzLHRvbGluZXMpOgorICAgICAgICAiIiJSZXR1cm5zIGZyb20vdG8gbGluZSBsaXN0cyB3aXRoIHRhYnMgZXhwYW5kZWQgYW5kIG5ld2xpbmVzIHJlbW92ZWQuCisKKyAgICAgICAgSW5zdGVhZCBvZiB0YWIgY2hhcmFjdGVycyBiZWluZyByZXBsYWNlZCBieSB0aGUgbnVtYmVyIG9mIHNwYWNlcworICAgICAgICBuZWVkZWQgdG8gZmlsbCBpbiB0byB0aGUgbmV4dCB0YWIgc3RvcCwgdGhpcyBmdW5jdGlvbiB3aWxsIGZpbGwKKyAgICAgICAgdGhlIHNwYWNlIHdpdGggdGFiIGNoYXJhY3RlcnMuICBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgZGlmZmVyZW5jZQorICAgICAgICBhbGdvcml0aG1zIGNhbiBpZGVudGlmeSBjaGFuZ2VzIGluIGEgZmlsZSB3aGVuIHRhYnMgYXJlIHJlcGxhY2VkIGJ5CisgICAgICAgIHNwYWNlcyBhbmQgdmljZSB2ZXJzYS4gIEF0IHRoZSBlbmQgb2YgdGhlIEhUTUwgZ2VuZXJhdGlvbiwgdGhlIHRhYgorICAgICAgICBjaGFyYWN0ZXJzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhIG5vbmJyZWFrYWJsZSBzcGFjZS4KKyAgICAgICAgIiIiCisgICAgICAgIGRlZiBleHBhbmRfdGFicyhsaW5lKToKKyAgICAgICAgICAgICMgaGlkZSByZWFsIHNwYWNlcworICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgnICcsJ1wwJykKKyAgICAgICAgICAgICMgZXhwYW5kIHRhYnMgaW50byBzcGFjZXMKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLmV4cGFuZHRhYnMoc2VsZi5fdGFic2l6ZSkKKyAgICAgICAgICAgICMgcmVwbGFjZSBzcGFjZXMgZnJvbSBleHBhbmRlZCB0YWJzIGJhY2sgaW50byB0YWIgY2hhcmFjdGVycworICAgICAgICAgICAgIyAod2UnbGwgcmVwbGFjZSB0aGVtIHdpdGggbWFya3VwIGFmdGVyIHdlIGRvIGRpZmZlcmVuY2luZykKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoJyAnLCdcdCcpCisgICAgICAgICAgICByZXR1cm4gbGluZS5yZXBsYWNlKCdcMCcsJyAnKS5yc3RyaXAoJ1xuJykKKyAgICAgICAgZnJvbWxpbmVzID0gW2V4cGFuZF90YWJzKGxpbmUpIGZvciBsaW5lIGluIGZyb21saW5lc10KKyAgICAgICAgdG9saW5lcyA9IFtleHBhbmRfdGFicyhsaW5lKSBmb3IgbGluZSBpbiB0b2xpbmVzXQorICAgICAgICByZXR1cm4gZnJvbWxpbmVzLHRvbGluZXMKKworICAgIGRlZiBfc3BsaXRfbGluZShzZWxmLGRhdGFfbGlzdCxsaW5lX251bSx0ZXh0KToKKyAgICAgICAgIiIiQnVpbGRzIGxpc3Qgb2YgdGV4dCBsaW5lcyBieSBzcGxpdHRpbmcgdGV4dCBsaW5lcyBhdCB3cmFwIHBvaW50CisKKyAgICAgICAgVGhpcyBmdW5jdGlvbiB3aWxsIGRldGVybWluZSBpZiB0aGUgaW5wdXQgdGV4dCBsaW5lIG5lZWRzIHRvIGJlCisgICAgICAgIHdyYXBwZWQgKHNwbGl0KSBpbnRvIHNlcGFyYXRlIGxpbmVzLiAgSWYgc28sIHRoZSBmaXJzdCB3cmFwIHBvaW50CisgICAgICAgIHdpbGwgYmUgZGV0ZXJtaW5lZCBhbmQgdGhlIGZpcnN0IGxpbmUgYXBwZW5kZWQgdG8gdGhlIG91dHB1dAorICAgICAgICB0ZXh0IGxpbmUgbGlzdC4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCByZWN1cnNpdmVseSB0byBoYW5kbGUKKyAgICAgICAgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBzcGxpdCBsaW5lIHRvIGZ1cnRoZXIgc3BsaXQgaXQuCisgICAgICAgICIiIgorICAgICAgICAjIGlmIGJsYW5rIGxpbmUgb3IgY29udGV4dCBzZXBhcmF0b3IsIGp1c3QgYWRkIGl0IHRvIHRoZSBvdXRwdXQgbGlzdAorICAgICAgICBpZiBub3QgbGluZV9udW06CisgICAgICAgICAgICBkYXRhX2xpc3QuYXBwZW5kKChsaW5lX251bSx0ZXh0KSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgaWYgbGluZSB0ZXh0IGRvZXNuJ3QgbmVlZCB3cmFwcGluZywganVzdCBhZGQgaXQgdG8gdGhlIG91dHB1dCBsaXN0CisgICAgICAgIHNpemUgPSBsZW4odGV4dCkKKyAgICAgICAgbWF4ID0gc2VsZi5fd3JhcGNvbHVtbgorICAgICAgICBpZiAoc2l6ZSA8PSBtYXgpIG9yICgoc2l6ZSAtKHRleHQuY291bnQoJ1wwJykqMykpIDw9IG1heCk6CisgICAgICAgICAgICBkYXRhX2xpc3QuYXBwZW5kKChsaW5lX251bSx0ZXh0KSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgc2NhbiB0ZXh0IGxvb2tpbmcgZm9yIHRoZSB3cmFwIHBvaW50LCBrZWVwaW5nIHRyYWNrIGlmIHRoZSB3cmFwCisgICAgICAgICMgcG9pbnQgaXMgaW5zaWRlIG1hcmtlcnMKKyAgICAgICAgaSA9IDAKKyAgICAgICAgbiA9IDAKKyAgICAgICAgbWFyayA9ICcnCisgICAgICAgIHdoaWxlIG4gPCBtYXggYW5kIGkgPCBzaXplOgorICAgICAgICAgICAgaWYgdGV4dFtpXSA9PSAnXDAnOgorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgICAgIG1hcmsgPSB0ZXh0W2ldCisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBlbGlmIHRleHRbaV0gPT0gJ1wxJzoKKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgICAgICBtYXJrID0gJycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAgICAgbiArPSAxCisKKyAgICAgICAgIyB3cmFwIHBvaW50IGlzIGluc2lkZSB0ZXh0LCBicmVhayBpdCB1cCBpbnRvIHNlcGFyYXRlIGxpbmVzCisgICAgICAgIGxpbmUxID0gdGV4dFs6aV0KKyAgICAgICAgbGluZTIgPSB0ZXh0W2k6XQorCisgICAgICAgICMgaWYgd3JhcCBwb2ludCBpcyBpbnNpZGUgbWFya2VycywgcGxhY2UgZW5kIG1hcmtlciBhdCBlbmQgb2YgZmlyc3QKKyAgICAgICAgIyBsaW5lIGFuZCBzdGFydCBtYXJrZXIgYXQgYmVnaW5uaW5nIG9mIHNlY29uZCBsaW5lIGJlY2F1c2UgZWFjaAorICAgICAgICAjIGxpbmUgd2lsbCBoYXZlIGl0cyBvd24gdGFibGUgdGFnIG1hcmt1cCBhcm91bmQgaXQuCisgICAgICAgIGlmIG1hcms6CisgICAgICAgICAgICBsaW5lMSA9IGxpbmUxICsgJ1wxJworICAgICAgICAgICAgbGluZTIgPSAnXDAnICsgbWFyayArIGxpbmUyCisKKyAgICAgICAgIyB0YWNrIG9uIGZpcnN0IGxpbmUgb250byB0aGUgb3V0cHV0IGxpc3QKKyAgICAgICAgZGF0YV9saXN0LmFwcGVuZCgobGluZV9udW0sbGluZTEpKQorCisgICAgICAgICMgdXNlIHRoaXMgcm91dGluZSBhZ2FpbiB0byB3cmFwIHRoZSByZW1haW5pbmcgdGV4dAorICAgICAgICBzZWxmLl9zcGxpdF9saW5lKGRhdGFfbGlzdCwnPicsbGluZTIpCisKKyAgICBkZWYgX2xpbmVfd3JhcHBlcihzZWxmLGRpZmZzKToKKyAgICAgICAgIiIiUmV0dXJucyBpdGVyYXRvciB0aGF0IHNwbGl0cyAod3JhcHMpIG1kaWZmIHRleHQgbGluZXMiIiIKKworICAgICAgICAjIHB1bGwgZnJvbS90byBkYXRhIGFuZCBmbGFncyBmcm9tIG1kaWZmIGl0ZXJhdG9yCisgICAgICAgIGZvciBmcm9tZGF0YSx0b2RhdGEsZmxhZyBpbiBkaWZmczoKKyAgICAgICAgICAgICMgY2hlY2sgZm9yIGNvbnRleHQgc2VwYXJhdG9ycyBhbmQgcGFzcyB0aGVtIHRocm91Z2gKKyAgICAgICAgICAgIGlmIGZsYWcgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB5aWVsZCBmcm9tZGF0YSx0b2RhdGEsZmxhZworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAoZnJvbWxpbmUsZnJvbXRleHQpLCh0b2xpbmUsdG90ZXh0KSA9IGZyb21kYXRhLHRvZGF0YQorICAgICAgICAgICAgIyBmb3IgZWFjaCBmcm9tL3RvIGxpbmUgc3BsaXQgaXQgYXQgdGhlIHdyYXAgY29sdW1uIHRvIGZvcm0KKyAgICAgICAgICAgICMgbGlzdCBvZiB0ZXh0IGxpbmVzLgorICAgICAgICAgICAgZnJvbWxpc3QsdG9saXN0ID0gW10sW10KKyAgICAgICAgICAgIHNlbGYuX3NwbGl0X2xpbmUoZnJvbWxpc3QsZnJvbWxpbmUsZnJvbXRleHQpCisgICAgICAgICAgICBzZWxmLl9zcGxpdF9saW5lKHRvbGlzdCx0b2xpbmUsdG90ZXh0KQorICAgICAgICAgICAgIyB5aWVsZCBmcm9tL3RvIGxpbmUgaW4gcGFpcnMgaW5zZXJ0aW5nIGJsYW5rIGxpbmVzIGFzCisgICAgICAgICAgICAjIG5lY2Vzc2FyeSB3aGVuIG9uZSBzaWRlIGhhcyBtb3JlIHdyYXBwZWQgbGluZXMKKyAgICAgICAgICAgIHdoaWxlIGZyb21saXN0IG9yIHRvbGlzdDoKKyAgICAgICAgICAgICAgICBpZiBmcm9tbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgZnJvbWRhdGEgPSBmcm9tbGlzdC5wb3AoMCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmcm9tZGF0YSA9ICgnJywnICcpCisgICAgICAgICAgICAgICAgaWYgdG9saXN0OgorICAgICAgICAgICAgICAgICAgICB0b2RhdGEgPSB0b2xpc3QucG9wKDApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdG9kYXRhID0gKCcnLCcgJykKKyAgICAgICAgICAgICAgICB5aWVsZCBmcm9tZGF0YSx0b2RhdGEsZmxhZworCisgICAgZGVmIF9jb2xsZWN0X2xpbmVzKHNlbGYsZGlmZnMpOgorICAgICAgICAiIiJDb2xsZWN0cyBtZGlmZiBvdXRwdXQgaW50byBzZXBhcmF0ZSBsaXN0cworCisgICAgICAgIEJlZm9yZSBzdG9yaW5nIHRoZSBtZGlmZiBmcm9tL3RvIGRhdGEgaW50byBhIGxpc3QsIGl0IGlzIGNvbnZlcnRlZAorICAgICAgICBpbnRvIGEgc2luZ2xlIGxpbmUgb2YgdGV4dCB3aXRoIEhUTUwgbWFya3VwLgorICAgICAgICAiIiIKKworICAgICAgICBmcm9tbGlzdCx0b2xpc3QsZmxhZ2xpc3QgPSBbXSxbXSxbXQorICAgICAgICAjIHB1bGwgZnJvbS90byBkYXRhIGFuZCBmbGFncyBmcm9tIG1kaWZmIHN0eWxlIGl0ZXJhdG9yCisgICAgICAgIGZvciBmcm9tZGF0YSx0b2RhdGEsZmxhZyBpbiBkaWZmczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIHN0b3JlIEhUTUwgbWFya3VwIG9mIHRoZSBsaW5lcyBpbnRvIHRoZSBsaXN0cworICAgICAgICAgICAgICAgIGZyb21saXN0LmFwcGVuZChzZWxmLl9mb3JtYXRfbGluZSgwLGZsYWcsKmZyb21kYXRhKSkKKyAgICAgICAgICAgICAgICB0b2xpc3QuYXBwZW5kKHNlbGYuX2Zvcm1hdF9saW5lKDEsZmxhZywqdG9kYXRhKSkKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBleGNlcHRpb25zIG9jY3VyIGZvciBsaW5lcyB3aGVyZSBjb250ZXh0IHNlcGFyYXRvcnMgZ28KKyAgICAgICAgICAgICAgICBmcm9tbGlzdC5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgICAgICB0b2xpc3QuYXBwZW5kKE5vbmUpCisgICAgICAgICAgICBmbGFnbGlzdC5hcHBlbmQoZmxhZykKKyAgICAgICAgcmV0dXJuIGZyb21saXN0LHRvbGlzdCxmbGFnbGlzdAorCisgICAgZGVmIF9mb3JtYXRfbGluZShzZWxmLHNpZGUsZmxhZyxsaW5lbnVtLHRleHQpOgorICAgICAgICAiIiJSZXR1cm5zIEhUTUwgbWFya3VwIG9mICJmcm9tIiAvICJ0byIgdGV4dCBsaW5lcworCisgICAgICAgIHNpZGUgLS0gMCBvciAxIGluZGljYXRpbmcgImZyb20iIG9yICJ0byIgdGV4dAorICAgICAgICBmbGFnIC0tIGluZGljYXRlcyBpZiBkaWZmZXJlbmNlIG9uIGxpbmUKKyAgICAgICAgbGluZW51bSAtLSBsaW5lIG51bWJlciAodXNlZCBmb3IgbGluZSBudW1iZXIgY29sdW1uKQorICAgICAgICB0ZXh0IC0tIGxpbmUgdGV4dCB0byBiZSBtYXJrZWQgdXAKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmVudW0gPSAnJWQnICUgbGluZW51bQorICAgICAgICAgICAgaWQgPSAnIGlkPSIlcyVzIicgJSAoc2VsZi5fcHJlZml4W3NpZGVdLGxpbmVudW0pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAjIGhhbmRsZSBibGFuayBsaW5lcyB3aGVyZSBsaW5lbnVtIGlzICc+JyBvciAnJworICAgICAgICAgICAgaWQgPSAnJworICAgICAgICAjIHJlcGxhY2UgdGhvc2UgdGhpbmdzIHRoYXQgd291bGQgZ2V0IGNvbmZ1c2VkIHdpdGggSFRNTCBzeW1ib2xzCisgICAgICAgIHRleHQ9dGV4dC5yZXBsYWNlKCImIiwiJmFtcDsiKS5yZXBsYWNlKCI+IiwiJmd0OyIpLnJlcGxhY2UoIjwiLCImbHQ7IikKKworICAgICAgICAjIG1ha2Ugc3BhY2Ugbm9uLWJyZWFrYWJsZSBzbyB0aGV5IGRvbid0IGdldCBjb21wcmVzc2VkIG9yIGxpbmUgd3JhcHBlZAorICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCcgJywnJm5ic3A7JykucnN0cmlwKCkKKworICAgICAgICByZXR1cm4gJzx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiJXM+JXM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+JXM8L3RkPicgXAorICAgICAgICAgICAgICAgJSAoaWQsbGluZW51bSx0ZXh0KQorCisgICAgZGVmIF9tYWtlX3ByZWZpeChzZWxmKToKKyAgICAgICAgIiIiQ3JlYXRlIHVuaXF1ZSBhbmNob3IgcHJlZml4ZXMiIiIKKworICAgICAgICAjIEdlbmVyYXRlIGEgdW5pcXVlIGFuY2hvciBwcmVmaXggc28gbXVsdGlwbGUgdGFibGVzCisgICAgICAgICMgY2FuIGV4aXN0IG9uIHRoZSBzYW1lIEhUTUwgcGFnZSB3aXRob3V0IGNvbmZsaWN0cy4KKyAgICAgICAgZnJvbXByZWZpeCA9ICJmcm9tJWRfIiAlIEh0bWxEaWZmLl9kZWZhdWx0X3ByZWZpeAorICAgICAgICB0b3ByZWZpeCA9ICJ0byVkXyIgJSBIdG1sRGlmZi5fZGVmYXVsdF9wcmVmaXgKKyAgICAgICAgSHRtbERpZmYuX2RlZmF1bHRfcHJlZml4ICs9IDEKKyAgICAgICAgIyBzdG9yZSBwcmVmaXhlcyBzbyBsaW5lIGZvcm1hdCBtZXRob2QgaGFzIGFjY2VzcworICAgICAgICBzZWxmLl9wcmVmaXggPSBbZnJvbXByZWZpeCx0b3ByZWZpeF0KKworICAgIGRlZiBfY29udmVydF9mbGFncyhzZWxmLGZyb21saXN0LHRvbGlzdCxmbGFnbGlzdCxjb250ZXh0LG51bWxpbmVzKToKKyAgICAgICAgIiIiTWFrZXMgbGlzdCBvZiAibmV4dCIgbGlua3MiIiIKKworICAgICAgICAjIGFsbCBhbmNob3IgbmFtZXMgd2lsbCBiZSBnZW5lcmF0ZWQgdXNpbmcgdGhlIHVuaXF1ZSAidG8iIHByZWZpeAorICAgICAgICB0b3ByZWZpeCA9IHNlbGYuX3ByZWZpeFsxXQorCisgICAgICAgICMgcHJvY2VzcyBjaGFuZ2UgZmxhZ3MsIGdlbmVyYXRpbmcgbWlkZGxlIGNvbHVtbiBvZiBuZXh0IGFuY2hvcnMvbGlua3MKKyAgICAgICAgbmV4dF9pZCA9IFsnJ10qbGVuKGZsYWdsaXN0KQorICAgICAgICBuZXh0X2hyZWYgPSBbJyddKmxlbihmbGFnbGlzdCkKKyAgICAgICAgbnVtX2NoZywgaW5fY2hhbmdlID0gMCwgRmFsc2UKKyAgICAgICAgbGFzdCA9IDAKKyAgICAgICAgZm9yIGksZmxhZyBpbiBlbnVtZXJhdGUoZmxhZ2xpc3QpOgorICAgICAgICAgICAgaWYgZmxhZzoKKyAgICAgICAgICAgICAgICBpZiBub3QgaW5fY2hhbmdlOgorICAgICAgICAgICAgICAgICAgICBpbl9jaGFuZ2UgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBpCisgICAgICAgICAgICAgICAgICAgICMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNoYW5nZSwgZHJvcCBhbiBhbmNob3IgYSBmZXcgbGluZXMKKyAgICAgICAgICAgICAgICAgICAgIyAodGhlIGNvbnRleHQgbGluZXMpIGJlZm9yZSB0aGUgY2hhbmdlIGZvciB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgIyBsaW5rCisgICAgICAgICAgICAgICAgICAgIGkgPSBtYXgoWzAsaS1udW1saW5lc10pCisgICAgICAgICAgICAgICAgICAgIG5leHRfaWRbaV0gPSAnIGlkPSJkaWZmbGliX2NoZ18lc18lZCInICUgKHRvcHJlZml4LG51bV9jaGcpCisgICAgICAgICAgICAgICAgICAgICMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGNoYW5nZSwgZHJvcCBhIGxpbmsgdG8gdGhlIG5leHQKKyAgICAgICAgICAgICAgICAgICAgIyBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgbnVtX2NoZyArPSAxCisgICAgICAgICAgICAgICAgICAgIG5leHRfaHJlZltsYXN0XSA9ICc8YSBocmVmPSIjZGlmZmxpYl9jaGdfJXNfJWQiPm48L2E+JyAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICB0b3ByZWZpeCxudW1fY2hnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbl9jaGFuZ2UgPSBGYWxzZQorICAgICAgICAjIGNoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyBubyBjb250ZW50IHRvIGF2b2lkIGV4Y2VwdGlvbnMKKyAgICAgICAgaWYgbm90IGZsYWdsaXN0OgorICAgICAgICAgICAgZmxhZ2xpc3QgPSBbRmFsc2VdCisgICAgICAgICAgICBuZXh0X2lkID0gWycnXQorICAgICAgICAgICAgbmV4dF9ocmVmID0gWycnXQorICAgICAgICAgICAgbGFzdCA9IDAKKyAgICAgICAgICAgIGlmIGNvbnRleHQ6CisgICAgICAgICAgICAgICAgZnJvbWxpc3QgPSBbJzx0ZD48L3RkPjx0ZD4mbmJzcDtObyBEaWZmZXJlbmNlcyBGb3VuZCZuYnNwOzwvdGQ+J10KKyAgICAgICAgICAgICAgICB0b2xpc3QgPSBmcm9tbGlzdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmcm9tbGlzdCA9IHRvbGlzdCA9IFsnPHRkPjwvdGQ+PHRkPiZuYnNwO0VtcHR5IEZpbGUmbmJzcDs8L3RkPiddCisgICAgICAgICMgaWYgbm90IGEgY2hhbmdlIG9uIGZpcnN0IGxpbmUsIGRyb3AgYSBsaW5rCisgICAgICAgIGlmIG5vdCBmbGFnbGlzdFswXToKKyAgICAgICAgICAgIG5leHRfaHJlZlswXSA9ICc8YSBocmVmPSIjZGlmZmxpYl9jaGdfJXNfMCI+ZjwvYT4nICUgdG9wcmVmaXgKKyAgICAgICAgIyByZWRvIHRoZSBsYXN0IGxpbmsgdG8gbGluayB0byB0aGUgdG9wCisgICAgICAgIG5leHRfaHJlZltsYXN0XSA9ICc8YSBocmVmPSIjZGlmZmxpYl9jaGdfJXNfdG9wIj50PC9hPicgJSAodG9wcmVmaXgpCisKKyAgICAgICAgcmV0dXJuIGZyb21saXN0LHRvbGlzdCxmbGFnbGlzdCxuZXh0X2hyZWYsbmV4dF9pZAorCisgICAgZGVmIG1ha2VfdGFibGUoc2VsZixmcm9tbGluZXMsdG9saW5lcyxmcm9tZGVzYz0nJyx0b2Rlc2M9JycsY29udGV4dD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICBudW1saW5lcz01KToKKyAgICAgICAgIiIiUmV0dXJucyBIVE1MIHRhYmxlIG9mIHNpZGUgYnkgc2lkZSBjb21wYXJpc29uIHdpdGggY2hhbmdlIGhpZ2hsaWdodHMKKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIGZyb21saW5lcyAtLSBsaXN0IG9mICJmcm9tIiBsaW5lcworICAgICAgICB0b2xpbmVzIC0tIGxpc3Qgb2YgInRvIiBsaW5lcworICAgICAgICBmcm9tZGVzYyAtLSAiZnJvbSIgZmlsZSBjb2x1bW4gaGVhZGVyIHN0cmluZworICAgICAgICB0b2Rlc2MgLS0gInRvIiBmaWxlIGNvbHVtbiBoZWFkZXIgc3RyaW5nCisgICAgICAgIGNvbnRleHQgLS0gc2V0IHRvIFRydWUgZm9yIGNvbnRleHR1YWwgZGlmZmVyZW5jZXMgKGRlZmF1bHRzIHRvIEZhbHNlCisgICAgICAgICAgICB3aGljaCBzaG93cyBmdWxsIGRpZmZlcmVuY2VzKS4KKyAgICAgICAgbnVtbGluZXMgLS0gbnVtYmVyIG9mIGNvbnRleHQgbGluZXMuICBXaGVuIGNvbnRleHQgaXMgc2V0IFRydWUsCisgICAgICAgICAgICBjb250cm9scyBudW1iZXIgb2YgbGluZXMgZGlzcGxheWVkIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGNoYW5nZS4KKyAgICAgICAgICAgIFdoZW4gY29udGV4dCBpcyBGYWxzZSwgY29udHJvbHMgdGhlIG51bWJlciBvZiBsaW5lcyB0byBwbGFjZQorICAgICAgICAgICAgdGhlICJuZXh0IiBsaW5rIGFuY2hvcnMgYmVmb3JlIHRoZSBuZXh0IGNoYW5nZSAoc28gY2xpY2sgb2YKKyAgICAgICAgICAgICJuZXh0IiBsaW5rIGp1bXBzIHRvIGp1c3QgYmVmb3JlIHRoZSBjaGFuZ2UpLgorICAgICAgICAiIiIKKworICAgICAgICAjIG1ha2UgdW5pcXVlIGFuY2hvciBwcmVmaXhlcyBzbyB0aGF0IG11bHRpcGxlIHRhYmxlcyBtYXkgZXhpc3QKKyAgICAgICAgIyBvbiB0aGUgc2FtZSBwYWdlIHdpdGhvdXQgY29uZmxpY3QuCisgICAgICAgIHNlbGYuX21ha2VfcHJlZml4KCkKKworICAgICAgICAjIGNoYW5nZSB0YWJzIHRvIHNwYWNlcyBiZWZvcmUgaXQgZ2V0cyBtb3JlIGRpZmZpY3VsdCBhZnRlciB3ZSBpbnNlcnQKKyAgICAgICAgIyBtYXJra3VwCisgICAgICAgIGZyb21saW5lcyx0b2xpbmVzID0gc2VsZi5fdGFiX25ld2xpbmVfcmVwbGFjZShmcm9tbGluZXMsdG9saW5lcykKKworICAgICAgICAjIGNyZWF0ZSBkaWZmcyBpdGVyYXRvciB3aGljaCBnZW5lcmF0ZXMgc2lkZSBieSBzaWRlIGZyb20vdG8gZGF0YQorICAgICAgICBpZiBjb250ZXh0OgorICAgICAgICAgICAgY29udGV4dF9saW5lcyA9IG51bWxpbmVzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb250ZXh0X2xpbmVzID0gTm9uZQorICAgICAgICBkaWZmcyA9IF9tZGlmZihmcm9tbGluZXMsdG9saW5lcyxjb250ZXh0X2xpbmVzLGxpbmVqdW5rPXNlbGYuX2xpbmVqdW5rLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXJqdW5rPXNlbGYuX2NoYXJqdW5rKQorCisgICAgICAgICMgc2V0IHVwIGl0ZXJhdG9yIHRvIHdyYXAgbGluZXMgdGhhdCBleGNlZWQgZGVzaXJlZCB3aWR0aAorICAgICAgICBpZiBzZWxmLl93cmFwY29sdW1uOgorICAgICAgICAgICAgZGlmZnMgPSBzZWxmLl9saW5lX3dyYXBwZXIoZGlmZnMpCisKKyAgICAgICAgIyBjb2xsZWN0IHVwIGZyb20vdG8gbGluZXMgYW5kIGZsYWdzIGludG8gbGlzdHMgKGFsc28gZm9ybWF0IHRoZSBsaW5lcykKKyAgICAgICAgZnJvbWxpc3QsdG9saXN0LGZsYWdsaXN0ID0gc2VsZi5fY29sbGVjdF9saW5lcyhkaWZmcykKKworICAgICAgICAjIHByb2Nlc3MgY2hhbmdlIGZsYWdzLCBnZW5lcmF0aW5nIG1pZGRsZSBjb2x1bW4gb2YgbmV4dCBhbmNob3JzL2xpbmtzCisgICAgICAgIGZyb21saXN0LHRvbGlzdCxmbGFnbGlzdCxuZXh0X2hyZWYsbmV4dF9pZCA9IHNlbGYuX2NvbnZlcnRfZmxhZ3MoCisgICAgICAgICAgICBmcm9tbGlzdCx0b2xpc3QsZmxhZ2xpc3QsY29udGV4dCxudW1saW5lcykKKworICAgICAgICBzID0gW10KKyAgICAgICAgZm10ID0gJyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIlcz4lczwvdGQ+JXMnICsgXAorICAgICAgICAgICAgICAnPHRkIGNsYXNzPSJkaWZmX25leHQiPiVzPC90ZD4lczwvdHI+XG4nCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihmbGFnbGlzdCkpOgorICAgICAgICAgICAgaWYgZmxhZ2xpc3RbaV0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIG1kaWZmIHlpZWxkcyBOb25lIG9uIHNlcGFyYXRvciBsaW5lcyBza2lwIHRoZSBib2d1cyBvbmVzCisgICAgICAgICAgICAgICAgIyBnZW5lcmF0ZWQgZm9yIHRoZSBmaXJzdCBsaW5lCisgICAgICAgICAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICAgICAgICAgIHMuYXBwZW5kKCcgICAgICAgIDwvdGJvZHk+ICAgICAgICBcbiAgICAgICAgPHRib2R5PlxuJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcy5hcHBlbmQoIGZtdCAlIChuZXh0X2lkW2ldLG5leHRfaHJlZltpXSxmcm9tbGlzdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2hyZWZbaV0sdG9saXN0W2ldKSkKKyAgICAgICAgaWYgZnJvbWRlc2Mgb3IgdG9kZXNjOgorICAgICAgICAgICAgaGVhZGVyX3JvdyA9ICc8dGhlYWQ+PHRyPiVzJXMlcyVzPC90cj48L3RoZWFkPicgJSAoCisgICAgICAgICAgICAgICAgJzx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPicsCisgICAgICAgICAgICAgICAgJzx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPiVzPC90aD4nICUgZnJvbWRlc2MsCisgICAgICAgICAgICAgICAgJzx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPicsCisgICAgICAgICAgICAgICAgJzx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPiVzPC90aD4nICUgdG9kZXNjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGVhZGVyX3JvdyA9ICcnCisKKyAgICAgICAgdGFibGUgPSBzZWxmLl90YWJsZV90ZW1wbGF0ZSAlIGRpY3QoCisgICAgICAgICAgICBkYXRhX3Jvd3M9Jycuam9pbihzKSwKKyAgICAgICAgICAgIGhlYWRlcl9yb3c9aGVhZGVyX3JvdywKKyAgICAgICAgICAgIHByZWZpeD1zZWxmLl9wcmVmaXhbMV0pCisKKyAgICAgICAgcmV0dXJuIHRhYmxlLnJlcGxhY2UoJ1wwKycsJzxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+JykuIFwKKyAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoJ1wwLScsJzxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+JykuIFwKKyAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoJ1wwXicsJzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+JykuIFwKKyAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoJ1wxJywnPC9zcGFuPicpLiBcCisgICAgICAgICAgICAgICAgICAgICByZXBsYWNlKCdcdCcsJyZuYnNwOycpCisKK2RlbCByZQorCitkZWYgcmVzdG9yZShkZWx0YSwgd2hpY2gpOgorICAgIHIiIiIKKyAgICBHZW5lcmF0ZSBvbmUgb2YgdGhlIHR3byBzZXF1ZW5jZXMgdGhhdCBnZW5lcmF0ZWQgYSBkZWx0YS4KKworICAgIEdpdmVuIGEgYGRlbHRhYCBwcm9kdWNlZCBieSBgRGlmZmVyLmNvbXBhcmUoKWAgb3IgYG5kaWZmKClgLCBleHRyYWN0CisgICAgbGluZXMgb3JpZ2luYXRpbmcgZnJvbSBmaWxlIDEgb3IgMiAocGFyYW1ldGVyIGB3aGljaGApLCBzdHJpcHBpbmcgb2ZmIGxpbmUKKyAgICBwcmVmaXhlcy4KKworICAgIEV4YW1wbGVzOgorCisgICAgPj4+IGRpZmYgPSBuZGlmZignb25lXG50d29cbnRocmVlXG4nLnNwbGl0bGluZXMoMSksCisgICAgLi4uICAgICAgICAgICAgICAnb3JlXG50cmVlXG5lbXVcbicuc3BsaXRsaW5lcygxKSkKKyAgICA+Pj4gZGlmZiA9IGxpc3QoZGlmZikKKyAgICA+Pj4gcHJpbnQgJycuam9pbihyZXN0b3JlKGRpZmYsIDEpKSwKKyAgICBvbmUKKyAgICB0d28KKyAgICB0aHJlZQorICAgID4+PiBwcmludCAnJy5qb2luKHJlc3RvcmUoZGlmZiwgMikpLAorICAgIG9yZQorICAgIHRyZWUKKyAgICBlbXUKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHRhZyA9IHsxOiAiLSAiLCAyOiAiKyAifVtpbnQod2hpY2gpXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgKCd1bmtub3duIGRlbHRhIGNob2ljZSAobXVzdCBiZSAxIG9yIDIpOiAlcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICUgd2hpY2gpCisgICAgcHJlZml4ZXMgPSAoIiAgIiwgdGFnKQorICAgIGZvciBsaW5lIGluIGRlbHRhOgorICAgICAgICBpZiBsaW5lWzoyXSBpbiBwcmVmaXhlczoKKyAgICAgICAgICAgIHlpZWxkIGxpbmVbMjpdCisKK2RlZiBfdGVzdCgpOgorICAgIGltcG9ydCBkb2N0ZXN0LCBkaWZmbGliCisgICAgcmV0dXJuIGRvY3Rlc3QudGVzdG1vZChkaWZmbGliKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlmZmxpYi5weWMgYi9saWIvcHl0aG9uMi43L2RpZmZsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMzg2MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2RpZmZsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlmZmxpYi5weW8gYi9saWIvcHl0aG9uMi43L2RpZmZsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZWVmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2RpZmZsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlyY2FjaGUucHkgYi9saWIvcHl0aG9uMi43L2RpcmNhY2hlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNGYwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2RpcmNhY2hlLnB5CkBAIC0wLDAgKzEsNDEgQEAKKyIiIlJlYWQgYW5kIGNhY2hlIGRpcmVjdG9yeSBsaXN0aW5ncy4KKworVGhlIGxpc3RkaXIoKSByb3V0aW5lIHJldHVybnMgYSBzb3J0ZWQgbGlzdCBvZiB0aGUgZmlsZXMgaW4gYSBkaXJlY3RvcnksCit1c2luZyBhIGNhY2hlIHRvIGF2b2lkIHJlYWRpbmcgdGhlIGRpcmVjdG9yeSBtb3JlIG9mdGVuIHRoYW4gbmVjZXNzYXJ5LgorVGhlIGFubm90YXRlKCkgcm91dGluZSBhcHBlbmRzIHNsYXNoZXMgdG8gZGlyZWN0b3JpZXMuIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSBkaXJjYWNoZSBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKK2ltcG9ydCBvcworCitfX2FsbF9fID0gWyJsaXN0ZGlyIiwgIm9wZW5kaXIiLCAiYW5ub3RhdGUiLCAicmVzZXQiXQorCitjYWNoZSA9IHt9CisKK2RlZiByZXNldCgpOgorICAgICIiIlJlc2V0IHRoZSBjYWNoZSBjb21wbGV0ZWx5LiIiIgorICAgIGdsb2JhbCBjYWNoZQorICAgIGNhY2hlID0ge30KKworZGVmIGxpc3RkaXIocGF0aCk6CisgICAgIiIiTGlzdCBkaXJlY3RvcnkgY29udGVudHMsIHVzaW5nIGNhY2hlLiIiIgorICAgIHRyeToKKyAgICAgICAgY2FjaGVkX210aW1lLCBsaXN0ID0gY2FjaGVbcGF0aF0KKyAgICAgICAgZGVsIGNhY2hlW3BhdGhdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBjYWNoZWRfbXRpbWUsIGxpc3QgPSAtMSwgW10KKyAgICBtdGltZSA9IG9zLnN0YXQocGF0aCkuc3RfbXRpbWUKKyAgICBpZiBtdGltZSAhPSBjYWNoZWRfbXRpbWU6CisgICAgICAgIGxpc3QgPSBvcy5saXN0ZGlyKHBhdGgpCisgICAgICAgIGxpc3Quc29ydCgpCisgICAgY2FjaGVbcGF0aF0gPSBtdGltZSwgbGlzdAorICAgIHJldHVybiBsaXN0CisKK29wZW5kaXIgPSBsaXN0ZGlyICMgWFhYIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKworZGVmIGFubm90YXRlKGhlYWQsIGxpc3QpOgorICAgICIiIkFkZCAnLycgc3VmZml4ZXMgdG8gZGlyZWN0b3JpZXMuIiIiCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpc3QpKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oaGVhZCwgbGlzdFtpXSkpOgorICAgICAgICAgICAgbGlzdFtpXSA9IGxpc3RbaV0gKyAnLycKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlyY2FjaGUucHljIGIvbGliL3B5dGhvbjIuNy9kaXJjYWNoZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyNmVlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlyY2FjaGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlyY2FjaGUucHlvIGIvbGliL3B5dGhvbjIuNy9kaXJjYWNoZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyNmVlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlyY2FjaGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzLnB5IGIvbGliL3B5dGhvbjIuNy9kaXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhMDljOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzLnB5CkBAIC0wLDAgKzEsMjI0IEBACisiIiJEaXNhc3NlbWJsZXIgb2YgUHl0aG9uIGJ5dGUgY29kZSBpbnRvIG1uZW1vbmljcy4iIiIKKworaW1wb3J0IHN5cworaW1wb3J0IHR5cGVzCisKK2Zyb20gb3Bjb2RlIGltcG9ydCAqCitmcm9tIG9wY29kZSBpbXBvcnQgX19hbGxfXyBhcyBfb3Bjb2Rlc19hbGwKKworX19hbGxfXyA9IFsiZGlzIiwgImRpc2Fzc2VtYmxlIiwgImRpc3RiIiwgImRpc2NvIiwKKyAgICAgICAgICAgImZpbmRsaW5lc3RhcnRzIiwgImZpbmRsYWJlbHMiXSArIF9vcGNvZGVzX2FsbAorZGVsIF9vcGNvZGVzX2FsbAorCitfaGF2ZV9jb2RlID0gKHR5cGVzLk1ldGhvZFR5cGUsIHR5cGVzLkZ1bmN0aW9uVHlwZSwgdHlwZXMuQ29kZVR5cGUsCisgICAgICAgICAgICAgIHR5cGVzLkNsYXNzVHlwZSwgdHlwZSkKKworZGVmIGRpcyh4PU5vbmUpOgorICAgICIiIkRpc2Fzc2VtYmxlIGNsYXNzZXMsIG1ldGhvZHMsIGZ1bmN0aW9ucywgb3IgY29kZS4KKworICAgIFdpdGggbm8gYXJndW1lbnQsIGRpc2Fzc2VtYmxlIHRoZSBsYXN0IHRyYWNlYmFjay4KKworICAgICIiIgorICAgIGlmIHggaXMgTm9uZToKKyAgICAgICAgZGlzdGIoKQorICAgICAgICByZXR1cm4KKyAgICBpZiBpc2luc3RhbmNlKHgsIHR5cGVzLkluc3RhbmNlVHlwZSk6CisgICAgICAgIHggPSB4Ll9fY2xhc3NfXworICAgIGlmIGhhc2F0dHIoeCwgJ2ltX2Z1bmMnKToKKyAgICAgICAgeCA9IHguaW1fZnVuYworICAgIGlmIGhhc2F0dHIoeCwgJ2Z1bmNfY29kZScpOgorICAgICAgICB4ID0geC5mdW5jX2NvZGUKKyAgICBpZiBoYXNhdHRyKHgsICdfX2RpY3RfXycpOgorICAgICAgICBpdGVtcyA9IHguX19kaWN0X18uaXRlbXMoKQorICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgZm9yIG5hbWUsIHgxIGluIGl0ZW1zOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh4MSwgX2hhdmVfY29kZSk6CisgICAgICAgICAgICAgICAgcHJpbnQgIkRpc2Fzc2VtYmx5IG9mICVzOiIgJSBuYW1lCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkaXMoeDEpCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiU29ycnk6IiwgbXNnCisgICAgICAgICAgICAgICAgcHJpbnQKKyAgICBlbGlmIGhhc2F0dHIoeCwgJ2NvX2NvZGUnKToKKyAgICAgICAgZGlzYXNzZW1ibGUoeCkKKyAgICBlbGlmIGlzaW5zdGFuY2UoeCwgc3RyKToKKyAgICAgICAgZGlzYXNzZW1ibGVfc3RyaW5nKHgpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBcCisgICAgICAgICAgICAgICJkb24ndCBrbm93IGhvdyB0byBkaXNhc3NlbWJsZSAlcyBvYmplY3RzIiAlIFwKKyAgICAgICAgICAgICAgdHlwZSh4KS5fX25hbWVfXworCitkZWYgZGlzdGIodGI9Tm9uZSk6CisgICAgIiIiRGlzYXNzZW1ibGUgYSB0cmFjZWJhY2sgKGRlZmF1bHQ6IGxhc3QgdHJhY2ViYWNrKS4iIiIKKyAgICBpZiB0YiBpcyBOb25lOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YiA9IHN5cy5sYXN0X3RyYWNlYmFjaworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJubyBsYXN0IHRyYWNlYmFjayB0byBkaXNhc3NlbWJsZSIKKyAgICAgICAgd2hpbGUgdGIudGJfbmV4dDogdGIgPSB0Yi50Yl9uZXh0CisgICAgZGlzYXNzZW1ibGUodGIudGJfZnJhbWUuZl9jb2RlLCB0Yi50Yl9sYXN0aSkKKworZGVmIGRpc2Fzc2VtYmxlKGNvLCBsYXN0aT0tMSk6CisgICAgIiIiRGlzYXNzZW1ibGUgYSBjb2RlIG9iamVjdC4iIiIKKyAgICBjb2RlID0gY28uY29fY29kZQorICAgIGxhYmVscyA9IGZpbmRsYWJlbHMoY29kZSkKKyAgICBsaW5lc3RhcnRzID0gZGljdChmaW5kbGluZXN0YXJ0cyhjbykpCisgICAgbiA9IGxlbihjb2RlKQorICAgIGkgPSAwCisgICAgZXh0ZW5kZWRfYXJnID0gMAorICAgIGZyZWUgPSBOb25lCisgICAgd2hpbGUgaSA8IG46CisgICAgICAgIGMgPSBjb2RlW2ldCisgICAgICAgIG9wID0gb3JkKGMpCisgICAgICAgIGlmIGkgaW4gbGluZXN0YXJ0czoKKyAgICAgICAgICAgIGlmIGkgPiAwOgorICAgICAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAiJTNkIiAlIGxpbmVzdGFydHNbaV0sCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAnICAgJywKKworICAgICAgICBpZiBpID09IGxhc3RpOiBwcmludCAnLS0+JywKKyAgICAgICAgZWxzZTogcHJpbnQgJyAgICcsCisgICAgICAgIGlmIGkgaW4gbGFiZWxzOiBwcmludCAnPj4nLAorICAgICAgICBlbHNlOiBwcmludCAnICAnLAorICAgICAgICBwcmludCByZXByKGkpLnJqdXN0KDQpLAorICAgICAgICBwcmludCBvcG5hbWVbb3BdLmxqdXN0KDIwKSwKKyAgICAgICAgaSA9IGkrMQorICAgICAgICBpZiBvcCA+PSBIQVZFX0FSR1VNRU5UOgorICAgICAgICAgICAgb3BhcmcgPSBvcmQoY29kZVtpXSkgKyBvcmQoY29kZVtpKzFdKSoyNTYgKyBleHRlbmRlZF9hcmcKKyAgICAgICAgICAgIGV4dGVuZGVkX2FyZyA9IDAKKyAgICAgICAgICAgIGkgPSBpKzIKKyAgICAgICAgICAgIGlmIG9wID09IEVYVEVOREVEX0FSRzoKKyAgICAgICAgICAgICAgICBleHRlbmRlZF9hcmcgPSBvcGFyZyo2NTUzNkwKKyAgICAgICAgICAgIHByaW50IHJlcHIob3BhcmcpLnJqdXN0KDUpLAorICAgICAgICAgICAgaWYgb3AgaW4gaGFzY29uc3Q6CisgICAgICAgICAgICAgICAgcHJpbnQgJygnICsgcmVwcihjby5jb19jb25zdHNbb3BhcmddKSArICcpJywKKyAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzbmFtZToKKyAgICAgICAgICAgICAgICBwcmludCAnKCcgKyBjby5jb19uYW1lc1tvcGFyZ10gKyAnKScsCisgICAgICAgICAgICBlbGlmIG9wIGluIGhhc2pyZWw6CisgICAgICAgICAgICAgICAgcHJpbnQgJyh0byAnICsgcmVwcihpICsgb3BhcmcpICsgJyknLAorICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNsb2NhbDoKKyAgICAgICAgICAgICAgICBwcmludCAnKCcgKyBjby5jb192YXJuYW1lc1tvcGFyZ10gKyAnKScsCisgICAgICAgICAgICBlbGlmIG9wIGluIGhhc2NvbXBhcmU6CisgICAgICAgICAgICAgICAgcHJpbnQgJygnICsgY21wX29wW29wYXJnXSArICcpJywKKyAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzZnJlZToKKyAgICAgICAgICAgICAgICBpZiBmcmVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGZyZWUgPSBjby5jb19jZWxsdmFycyArIGNvLmNvX2ZyZWV2YXJzCisgICAgICAgICAgICAgICAgcHJpbnQgJygnICsgZnJlZVtvcGFyZ10gKyAnKScsCisgICAgICAgIHByaW50CisKK2RlZiBkaXNhc3NlbWJsZV9zdHJpbmcoY29kZSwgbGFzdGk9LTEsIHZhcm5hbWVzPU5vbmUsIG5hbWVzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50cz1Ob25lKToKKyAgICBsYWJlbHMgPSBmaW5kbGFiZWxzKGNvZGUpCisgICAgbiA9IGxlbihjb2RlKQorICAgIGkgPSAwCisgICAgd2hpbGUgaSA8IG46CisgICAgICAgIGMgPSBjb2RlW2ldCisgICAgICAgIG9wID0gb3JkKGMpCisgICAgICAgIGlmIGkgPT0gbGFzdGk6IHByaW50ICctLT4nLAorICAgICAgICBlbHNlOiBwcmludCAnICAgJywKKyAgICAgICAgaWYgaSBpbiBsYWJlbHM6IHByaW50ICc+PicsCisgICAgICAgIGVsc2U6IHByaW50ICcgICcsCisgICAgICAgIHByaW50IHJlcHIoaSkucmp1c3QoNCksCisgICAgICAgIHByaW50IG9wbmFtZVtvcF0ubGp1c3QoMTUpLAorICAgICAgICBpID0gaSsxCisgICAgICAgIGlmIG9wID49IEhBVkVfQVJHVU1FTlQ6CisgICAgICAgICAgICBvcGFyZyA9IG9yZChjb2RlW2ldKSArIG9yZChjb2RlW2krMV0pKjI1NgorICAgICAgICAgICAgaSA9IGkrMgorICAgICAgICAgICAgcHJpbnQgcmVwcihvcGFyZykucmp1c3QoNSksCisgICAgICAgICAgICBpZiBvcCBpbiBoYXNjb25zdDoKKyAgICAgICAgICAgICAgICBpZiBjb25zdGFudHM6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICcoJyArIHJlcHIoY29uc3RhbnRzW29wYXJnXSkgKyAnKScsCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyglZCknJW9wYXJnLAorICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNuYW1lOgorICAgICAgICAgICAgICAgIGlmIG5hbWVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnKCcgKyBuYW1lc1tvcGFyZ10gKyAnKScsCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyglZCknJW9wYXJnLAorICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNqcmVsOgorICAgICAgICAgICAgICAgIHByaW50ICcodG8gJyArIHJlcHIoaSArIG9wYXJnKSArICcpJywKKyAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzbG9jYWw6CisgICAgICAgICAgICAgICAgaWYgdmFybmFtZXM6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICcoJyArIHZhcm5hbWVzW29wYXJnXSArICcpJywKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnKCVkKScgJSBvcGFyZywKKyAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzY29tcGFyZToKKyAgICAgICAgICAgICAgICBwcmludCAnKCcgKyBjbXBfb3Bbb3BhcmddICsgJyknLAorICAgICAgICBwcmludAorCitkaXNjbyA9IGRpc2Fzc2VtYmxlICAgICAgICAgICAgICAgICAgICAgIyBYWFggRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisKK2RlZiBmaW5kbGFiZWxzKGNvZGUpOgorICAgICIiIkRldGVjdCBhbGwgb2Zmc2V0cyBpbiBhIGJ5dGUgY29kZSB3aGljaCBhcmUganVtcCB0YXJnZXRzLgorCisgICAgUmV0dXJuIHRoZSBsaXN0IG9mIG9mZnNldHMuCisKKyAgICAiIiIKKyAgICBsYWJlbHMgPSBbXQorICAgIG4gPSBsZW4oY29kZSkKKyAgICBpID0gMAorICAgIHdoaWxlIGkgPCBuOgorICAgICAgICBjID0gY29kZVtpXQorICAgICAgICBvcCA9IG9yZChjKQorICAgICAgICBpID0gaSsxCisgICAgICAgIGlmIG9wID49IEhBVkVfQVJHVU1FTlQ6CisgICAgICAgICAgICBvcGFyZyA9IG9yZChjb2RlW2ldKSArIG9yZChjb2RlW2krMV0pKjI1NgorICAgICAgICAgICAgaSA9IGkrMgorICAgICAgICAgICAgbGFiZWwgPSAtMQorICAgICAgICAgICAgaWYgb3AgaW4gaGFzanJlbDoKKyAgICAgICAgICAgICAgICBsYWJlbCA9IGkrb3BhcmcKKyAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzamFiczoKKyAgICAgICAgICAgICAgICBsYWJlbCA9IG9wYXJnCisgICAgICAgICAgICBpZiBsYWJlbCA+PSAwOgorICAgICAgICAgICAgICAgIGlmIGxhYmVsIG5vdCBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgICAgIGxhYmVscy5hcHBlbmQobGFiZWwpCisgICAgcmV0dXJuIGxhYmVscworCitkZWYgZmluZGxpbmVzdGFydHMoY29kZSk6CisgICAgIiIiRmluZCB0aGUgb2Zmc2V0cyBpbiBhIGJ5dGUgY29kZSB3aGljaCBhcmUgc3RhcnQgb2YgbGluZXMgaW4gdGhlIHNvdXJjZS4KKworICAgIEdlbmVyYXRlIHBhaXJzIChvZmZzZXQsIGxpbmVubykgYXMgZGVzY3JpYmVkIGluIFB5dGhvbi9jb21waWxlLmMuCisKKyAgICAiIiIKKyAgICBieXRlX2luY3JlbWVudHMgPSBbb3JkKGMpIGZvciBjIGluIGNvZGUuY29fbG5vdGFiWzA6OjJdXQorICAgIGxpbmVfaW5jcmVtZW50cyA9IFtvcmQoYykgZm9yIGMgaW4gY29kZS5jb19sbm90YWJbMTo6Ml1dCisKKyAgICBsYXN0bGluZW5vID0gTm9uZQorICAgIGxpbmVubyA9IGNvZGUuY29fZmlyc3RsaW5lbm8KKyAgICBhZGRyID0gMAorICAgIGZvciBieXRlX2luY3IsIGxpbmVfaW5jciBpbiB6aXAoYnl0ZV9pbmNyZW1lbnRzLCBsaW5lX2luY3JlbWVudHMpOgorICAgICAgICBpZiBieXRlX2luY3I6CisgICAgICAgICAgICBpZiBsaW5lbm8gIT0gbGFzdGxpbmVubzoKKyAgICAgICAgICAgICAgICB5aWVsZCAoYWRkciwgbGluZW5vKQorICAgICAgICAgICAgICAgIGxhc3RsaW5lbm8gPSBsaW5lbm8KKyAgICAgICAgICAgIGFkZHIgKz0gYnl0ZV9pbmNyCisgICAgICAgIGxpbmVubyArPSBsaW5lX2luY3IKKyAgICBpZiBsaW5lbm8gIT0gbGFzdGxpbmVubzoKKyAgICAgICAgeWllbGQgKGFkZHIsIGxpbmVubykKKworZGVmIF90ZXN0KCk6CisgICAgIiIiU2ltcGxlIHRlc3QgcHJvZ3JhbSB0byBkaXNhc3NlbWJsZSBhIGZpbGUuIiIiCisgICAgaWYgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBpZiBzeXMuYXJndlsyOl06CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ1c2FnZTogcHl0aG9uIGRpcy5weSBbLXxmaWxlXVxuIikKKyAgICAgICAgICAgIHN5cy5leGl0KDIpCisgICAgICAgIGZuID0gc3lzLmFyZ3ZbMV0KKyAgICAgICAgaWYgbm90IGZuIG9yIGZuID09ICItIjoKKyAgICAgICAgICAgIGZuID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIGZuID0gTm9uZQorICAgIGlmIGZuIGlzIE5vbmU6CisgICAgICAgIGYgPSBzeXMuc3RkaW4KKyAgICBlbHNlOgorICAgICAgICBmID0gb3BlbihmbikKKyAgICBzb3VyY2UgPSBmLnJlYWQoKQorICAgIGlmIGZuIGlzIG5vdCBOb25lOgorICAgICAgICBmLmNsb3NlKCkKKyAgICBlbHNlOgorICAgICAgICBmbiA9ICI8c3RkaW4+IgorICAgIGNvZGUgPSBjb21waWxlKHNvdXJjZSwgZm4sICJleGVjIikKKyAgICBkaXMoY29kZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpcy5weWMgYi9saWIvcHl0aG9uMi43L2Rpcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0YWFhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpcy5weW8gYi9saWIvcHl0aG9uMi43L2Rpcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0YWFhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9SRUFETUUgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4YTIwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL1JFQURNRQpAQCAtMCwwICsxLDEzIEBACitUaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgRGlzdHV0aWxzIHBhY2thZ2UuCisKK1RoZXJlJ3MgYSBmdWxsIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIGF0OgorCisgICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9kaXN0dXRpbHMvCisKK1RoZSBEaXN0dXRpbHMtU0lHIHdlYiBwYWdlIGlzIGFsc28gYSBnb29kIHN0YXJ0aW5nIHBvaW50OgorCisgICAgaHR0cDovL3d3dy5weXRob24ub3JnL3NpZ3MvZGlzdHV0aWxzLXNpZy8KKworV0FSTklORyA6IERpc3R1dGlscyBtdXN0IHJlbWFpbiBjb21wYXRpYmxlIHdpdGggMi4zCisKKyRJZCQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmNGJiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMTkgQEAKKyIiImRpc3R1dGlscworCitUaGUgbWFpbiBwYWNrYWdlIGZvciB0aGUgUHl0aG9uIE1vZHVsZSBEaXN0cmlidXRpb24gVXRpbGl0aWVzLiAgTm9ybWFsbHkKK3VzZWQgZnJvbSBhIHNldHVwIHNjcmlwdCBhcworCisgICBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cAorCisgICBzZXR1cCAoLi4uKQorIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCisjIERpc3R1dGlscyB2ZXJzaW9uCisjCisjIFVwZGF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUgUHl0aG9uIHJlbGVhc2UgcHJvY2Vzcy4KKyMKKyMtLXN0YXJ0IGNvbnN0YW50cy0tCitfX3ZlcnNpb25fXyA9ICIyLjcuNSIKKyMtLWVuZCBjb25zdGFudHMtLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OGFiZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OGFiZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvYXJjaGl2ZV91dGlsLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvYXJjaGl2ZV91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNGI3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9hcmNoaXZlX3V0aWwucHkKQEAgLTAsMCArMSwyNDMgQEAKKyIiImRpc3R1dGlscy5hcmNoaXZlX3V0aWwKKworVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFyY2hpdmUgZmlsZXMgKHRhcmJhbGxzLCB6aXAgZmlsZXMsCit0aGF0IHNvcnQgb2YgdGhpbmcpLiIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCitpbXBvcnQgc3lzCisKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXhlY0Vycm9yCitmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KK2Zyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCBta3BhdGgKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKwordHJ5OgorICAgIGZyb20gcHdkIGltcG9ydCBnZXRwd25hbQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGdldHB3bmFtID0gTm9uZQorCit0cnk6CisgICAgZnJvbSBncnAgaW1wb3J0IGdldGdybmFtCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZ2V0Z3JuYW0gPSBOb25lCisKK2RlZiBfZ2V0X2dpZChuYW1lKToKKyAgICAiIiJSZXR1cm5zIGEgZ2lkLCBnaXZlbiBhIGdyb3VwIG5hbWUuIiIiCisgICAgaWYgZ2V0Z3JuYW0gaXMgTm9uZSBvciBuYW1lIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBOb25lCisgICAgdHJ5OgorICAgICAgICByZXN1bHQgPSBnZXRncm5hbShuYW1lKQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIHJlc3VsdFsyXQorICAgIHJldHVybiBOb25lCisKK2RlZiBfZ2V0X3VpZChuYW1lKToKKyAgICAiIiJSZXR1cm5zIGFuIHVpZCwgZ2l2ZW4gYSB1c2VyIG5hbWUuIiIiCisgICAgaWYgZ2V0cHduYW0gaXMgTm9uZSBvciBuYW1lIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBOb25lCisgICAgdHJ5OgorICAgICAgICByZXN1bHQgPSBnZXRwd25hbShuYW1lKQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIHJlc3VsdFsyXQorICAgIHJldHVybiBOb25lCisKK2RlZiBtYWtlX3RhcmJhbGwoYmFzZV9uYW1lLCBiYXNlX2RpciwgY29tcHJlc3M9Imd6aXAiLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwKKyAgICAgICAgICAgICAgICAgb3duZXI9Tm9uZSwgZ3JvdXA9Tm9uZSk6CisgICAgIiIiQ3JlYXRlIGEgKHBvc3NpYmx5IGNvbXByZXNzZWQpIHRhciBmaWxlIGZyb20gYWxsIHRoZSBmaWxlcyB1bmRlcgorICAgICdiYXNlX2RpcicuCisKKyAgICAnY29tcHJlc3MnIG11c3QgYmUgImd6aXAiICh0aGUgZGVmYXVsdCksICJjb21wcmVzcyIsICJiemlwMiIsIG9yIE5vbmUuCisgICAgKGNvbXByZXNzIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiBQeXRob24gMy4yKQorCisgICAgJ293bmVyJyBhbmQgJ2dyb3VwJyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYW4gb3duZXIgYW5kIGEgZ3JvdXAgZm9yIHRoZQorICAgIGFyY2hpdmUgdGhhdCBpcyBiZWluZyBidWlsdC4gSWYgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCBvd25lciBhbmQgZ3JvdXAKKyAgICB3aWxsIGJlIHVzZWQuCisKKyAgICBUaGUgb3V0cHV0IHRhciBmaWxlIHdpbGwgYmUgbmFtZWQgJ2Jhc2VfZGlyJyArICAiLnRhciIsIHBvc3NpYmx5IHBsdXMKKyAgICB0aGUgYXBwcm9wcmlhdGUgY29tcHJlc3Npb24gZXh0ZW5zaW9uICgiLmd6IiwgIi5iejIiIG9yICIuWiIpLgorCisgICAgUmV0dXJucyB0aGUgb3V0cHV0IGZpbGVuYW1lLgorICAgICIiIgorICAgIHRhcl9jb21wcmVzc2lvbiA9IHsnZ3ppcCc6ICdneicsICdiemlwMic6ICdiejInLCBOb25lOiAnJywgJ2NvbXByZXNzJzogJyd9CisgICAgY29tcHJlc3NfZXh0ID0geydnemlwJzogJy5neicsICdiemlwMic6ICcuYnoyJywgJ2NvbXByZXNzJzogJy5aJ30KKworICAgICMgZmxhZ3MgZm9yIGNvbXByZXNzaW9uIHByb2dyYW0sIGVhY2ggZWxlbWVudCBvZiBsaXN0IHdpbGwgYmUgYW4gYXJndW1lbnQKKyAgICBpZiBjb21wcmVzcyBpcyBub3QgTm9uZSBhbmQgY29tcHJlc3Mgbm90IGluIGNvbXByZXNzX2V4dC5rZXlzKCk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgKCJiYWQgdmFsdWUgZm9yICdjb21wcmVzcyc6IG11c3QgYmUgTm9uZSwgJ2d6aXAnLCAnYnppcDInICIKKyAgICAgICAgICAgICAgICJvciAnY29tcHJlc3MnIikKKworICAgIGFyY2hpdmVfbmFtZSA9IGJhc2VfbmFtZSArICcudGFyJworICAgIGlmIGNvbXByZXNzICE9ICdjb21wcmVzcyc6CisgICAgICAgIGFyY2hpdmVfbmFtZSArPSBjb21wcmVzc19leHQuZ2V0KGNvbXByZXNzLCAnJykKKworICAgIG1rcGF0aChvcy5wYXRoLmRpcm5hbWUoYXJjaGl2ZV9uYW1lKSwgZHJ5X3J1bj1kcnlfcnVuKQorCisgICAgIyBjcmVhdGluZyB0aGUgdGFyYmFsbAorICAgIGltcG9ydCB0YXJmaWxlICAjIGxhdGUgaW1wb3J0IHNvIFB5dGhvbiBidWlsZCBpdHNlbGYgZG9lc24ndCBicmVhaworCisgICAgbG9nLmluZm8oJ0NyZWF0aW5nIHRhciBhcmNoaXZlJykKKworICAgIHVpZCA9IF9nZXRfdWlkKG93bmVyKQorICAgIGdpZCA9IF9nZXRfZ2lkKGdyb3VwKQorCisgICAgZGVmIF9zZXRfdWlkX2dpZCh0YXJpbmZvKToKKyAgICAgICAgaWYgZ2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdGFyaW5mby5naWQgPSBnaWQKKyAgICAgICAgICAgIHRhcmluZm8uZ25hbWUgPSBncm91cAorICAgICAgICBpZiB1aWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0YXJpbmZvLnVpZCA9IHVpZAorICAgICAgICAgICAgdGFyaW5mby51bmFtZSA9IG93bmVyCisgICAgICAgIHJldHVybiB0YXJpbmZvCisKKyAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGFyY2hpdmVfbmFtZSwgJ3d8JXMnICUgdGFyX2NvbXByZXNzaW9uW2NvbXByZXNzXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFyLmFkZChiYXNlX2RpciwgZmlsdGVyPV9zZXRfdWlkX2dpZCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAjIGNvbXByZXNzaW9uIHVzaW5nIGBjb21wcmVzc2AKKyAgICBpZiBjb21wcmVzcyA9PSAnY29tcHJlc3MnOgorICAgICAgICB3YXJuKCInY29tcHJlc3MnIHdpbGwgYmUgZGVwcmVjYXRlZC4iLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAjIHRoZSBvcHRpb24gdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KKyAgICAgICAgY29tcHJlc3NlZF9uYW1lID0gYXJjaGl2ZV9uYW1lICsgY29tcHJlc3NfZXh0W2NvbXByZXNzXQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIGNtZCA9IFtjb21wcmVzcywgYXJjaGl2ZV9uYW1lLCBjb21wcmVzc2VkX25hbWVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbWQgPSBbY29tcHJlc3MsICctZicsIGFyY2hpdmVfbmFtZV0KKyAgICAgICAgc3Bhd24oY21kLCBkcnlfcnVuPWRyeV9ydW4pCisgICAgICAgIHJldHVybiBjb21wcmVzc2VkX25hbWUKKworICAgIHJldHVybiBhcmNoaXZlX25hbWUKKworZGVmIG1ha2VfemlwZmlsZShiYXNlX25hbWUsIGJhc2VfZGlyLCB2ZXJib3NlPTAsIGRyeV9ydW49MCk6CisgICAgIiIiQ3JlYXRlIGEgemlwIGZpbGUgZnJvbSBhbGwgdGhlIGZpbGVzIHVuZGVyICdiYXNlX2RpcicuCisKKyAgICBUaGUgb3V0cHV0IHppcCBmaWxlIHdpbGwgYmUgbmFtZWQgJ2Jhc2VfbmFtZScgKyAiLnppcCIuICBVc2VzIGVpdGhlciB0aGUKKyAgICAiemlwZmlsZSIgUHl0aG9uIG1vZHVsZSAoaWYgYXZhaWxhYmxlKSBvciB0aGUgSW5mb1pJUCAiemlwIiB1dGlsaXR5CisgICAgKGlmIGluc3RhbGxlZCBhbmQgZm91bmQgb24gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGgpLiAgSWYgbmVpdGhlciB0b29sIGlzCisgICAgYXZhaWxhYmxlLCByYWlzZXMgRGlzdHV0aWxzRXhlY0Vycm9yLiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHppcAorICAgIGZpbGUuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgemlwZmlsZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgemlwZmlsZSA9IE5vbmUKKworICAgIHppcF9maWxlbmFtZSA9IGJhc2VfbmFtZSArICIuemlwIgorICAgIG1rcGF0aChvcy5wYXRoLmRpcm5hbWUoemlwX2ZpbGVuYW1lKSwgZHJ5X3J1bj1kcnlfcnVuKQorCisgICAgIyBJZiB6aXBmaWxlIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlLCB0cnkgc3Bhd25pbmcgYW4gZXh0ZXJuYWwKKyAgICAjICd6aXAnIGNvbW1hbmQuCisgICAgaWYgemlwZmlsZSBpcyBOb25lOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgemlwb3B0aW9ucyA9ICItciIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHppcG9wdGlvbnMgPSAiLXJxIgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNwYXduKFsiemlwIiwgemlwb3B0aW9ucywgemlwX2ZpbGVuYW1lLCBiYXNlX2Rpcl0sCisgICAgICAgICAgICAgICAgICBkcnlfcnVuPWRyeV9ydW4pCisgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3I6CisgICAgICAgICAgICAjIFhYWCByZWFsbHkgc2hvdWxkIGRpc3Rpbmd1aXNoIGJldHdlZW4gImNvdWxkbid0IGZpbmQKKyAgICAgICAgICAgICMgZXh0ZXJuYWwgJ3ppcCcgY29tbWFuZCIgYW5kICJ6aXAgZmFpbGVkIi4KKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0V4ZWNFcnJvciwgXAorICAgICAgICAgICAgICAgICAgKCJ1bmFibGUgdG8gY3JlYXRlIHppcCBmaWxlICclcyc6ICIKKyAgICAgICAgICAgICAgICAgICAiY291bGQgbmVpdGhlciBpbXBvcnQgdGhlICd6aXBmaWxlJyBtb2R1bGUgbm9yICIKKyAgICAgICAgICAgICAgICAgICAiZmluZCBhIHN0YW5kYWxvbmUgemlwIHV0aWxpdHkiKSAlIHppcF9maWxlbmFtZQorCisgICAgZWxzZToKKyAgICAgICAgbG9nLmluZm8oImNyZWF0aW5nICclcycgYW5kIGFkZGluZyAnJXMnIHRvIGl0IiwKKyAgICAgICAgICAgICAgICAgemlwX2ZpbGVuYW1lLCBiYXNlX2RpcikKKworICAgICAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgICAgIHppcCA9IHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZW5hbWUsICJ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbj16aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgICAgICAgICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhiYXNlX2Rpcik6CisgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oZGlycGF0aCwgbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgemlwLndyaXRlKHBhdGgsIHBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiYWRkaW5nICclcyciICUgcGF0aCkKKyAgICAgICAgICAgIHppcC5jbG9zZSgpCisKKyAgICByZXR1cm4gemlwX2ZpbGVuYW1lCisKK0FSQ0hJVkVfRk9STUFUUyA9IHsKKyAgICAnZ3p0YXInOiAobWFrZV90YXJiYWxsLCBbKCdjb21wcmVzcycsICdnemlwJyldLCAiZ3ppcCdlZCB0YXItZmlsZSIpLAorICAgICdienRhcic6IChtYWtlX3RhcmJhbGwsIFsoJ2NvbXByZXNzJywgJ2J6aXAyJyldLCAiYnppcDInZWQgdGFyLWZpbGUiKSwKKyAgICAnenRhcic6ICAobWFrZV90YXJiYWxsLCBbKCdjb21wcmVzcycsICdjb21wcmVzcycpXSwgImNvbXByZXNzZWQgdGFyIGZpbGUiKSwKKyAgICAndGFyJzogICAobWFrZV90YXJiYWxsLCBbKCdjb21wcmVzcycsIE5vbmUpXSwgInVuY29tcHJlc3NlZCB0YXIgZmlsZSIpLAorICAgICd6aXAnOiAgIChtYWtlX3ppcGZpbGUsIFtdLCJaSVAgZmlsZSIpCisgICAgfQorCitkZWYgY2hlY2tfYXJjaGl2ZV9mb3JtYXRzKGZvcm1hdHMpOgorICAgICIiIlJldHVybnMgdGhlIGZpcnN0IGZvcm1hdCBmcm9tIHRoZSAnZm9ybWF0JyBsaXN0IHRoYXQgaXMgdW5rbm93bi4KKworICAgIElmIGFsbCBmb3JtYXRzIGFyZSBrbm93biwgcmV0dXJucyBOb25lCisgICAgIiIiCisgICAgZm9yIGZvcm1hdCBpbiBmb3JtYXRzOgorICAgICAgICBpZiBmb3JtYXQgbm90IGluIEFSQ0hJVkVfRk9STUFUUzoKKyAgICAgICAgICAgIHJldHVybiBmb3JtYXQKKyAgICByZXR1cm4gTm9uZQorCitkZWYgbWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgZm9ybWF0LCByb290X2Rpcj1Ob25lLCBiYXNlX2Rpcj1Ob25lLCB2ZXJib3NlPTAsCisgICAgICAgICAgICAgICAgIGRyeV9ydW49MCwgb3duZXI9Tm9uZSwgZ3JvdXA9Tm9uZSk6CisgICAgIiIiQ3JlYXRlIGFuIGFyY2hpdmUgZmlsZSAoZWcuIHppcCBvciB0YXIpLgorCisgICAgJ2Jhc2VfbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLCBtaW51cyBhbnkgZm9ybWF0LXNwZWNpZmljCisgICAgZXh0ZW5zaW9uOyAnZm9ybWF0JyBpcyB0aGUgYXJjaGl2ZSBmb3JtYXQ6IG9uZSBvZiAiemlwIiwgInRhciIsICJ6dGFyIiwKKyAgICBvciAiZ3p0YXIiLgorCisgICAgJ3Jvb3RfZGlyJyBpcyBhIGRpcmVjdG9yeSB0aGF0IHdpbGwgYmUgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZQorICAgIGFyY2hpdmU7IGllLiB3ZSB0eXBpY2FsbHkgY2hkaXIgaW50byAncm9vdF9kaXInIGJlZm9yZSBjcmVhdGluZyB0aGUKKyAgICBhcmNoaXZlLiAgJ2Jhc2VfZGlyJyBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHdlIHN0YXJ0IGFyY2hpdmluZyBmcm9tOworICAgIGllLiAnYmFzZV9kaXInIHdpbGwgYmUgdGhlIGNvbW1vbiBwcmVmaXggb2YgYWxsIGZpbGVzIGFuZAorICAgIGRpcmVjdG9yaWVzIGluIHRoZSBhcmNoaXZlLiAgJ3Jvb3RfZGlyJyBhbmQgJ2Jhc2VfZGlyJyBib3RoIGRlZmF1bHQKKyAgICB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIGZpbGUuCisKKyAgICAnb3duZXInIGFuZCAnZ3JvdXAnIGFyZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YXIgYXJjaGl2ZS4gQnkgZGVmYXVsdCwKKyAgICB1c2VzIHRoZSBjdXJyZW50IG93bmVyIGFuZCBncm91cC4KKyAgICAiIiIKKyAgICBzYXZlX2N3ZCA9IG9zLmdldGN3ZCgpCisgICAgaWYgcm9vdF9kaXIgaXMgbm90IE5vbmU6CisgICAgICAgIGxvZy5kZWJ1ZygiY2hhbmdpbmcgaW50byAnJXMnIiwgcm9vdF9kaXIpCisgICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguYWJzcGF0aChiYXNlX25hbWUpCisgICAgICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAgICAgb3MuY2hkaXIocm9vdF9kaXIpCisKKyAgICBpZiBiYXNlX2RpciBpcyBOb25lOgorICAgICAgICBiYXNlX2RpciA9IG9zLmN1cmRpcgorCisgICAga3dhcmdzID0geydkcnlfcnVuJzogZHJ5X3J1bn0KKworICAgIHRyeToKKyAgICAgICAgZm9ybWF0X2luZm8gPSBBUkNISVZFX0ZPUk1BVFNbZm9ybWF0XQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVua25vd24gYXJjaGl2ZSBmb3JtYXQgJyVzJyIgJSBmb3JtYXQKKworICAgIGZ1bmMgPSBmb3JtYXRfaW5mb1swXQorICAgIGZvciBhcmcsIHZhbCBpbiBmb3JtYXRfaW5mb1sxXToKKyAgICAgICAga3dhcmdzW2FyZ10gPSB2YWwKKworICAgIGlmIGZvcm1hdCAhPSAnemlwJzoKKyAgICAgICAga3dhcmdzWydvd25lciddID0gb3duZXIKKyAgICAgICAga3dhcmdzWydncm91cCddID0gZ3JvdXAKKworICAgIHRyeToKKyAgICAgICAgZmlsZW5hbWUgPSBmdW5jKGJhc2VfbmFtZSwgYmFzZV9kaXIsICoqa3dhcmdzKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHJvb3RfZGlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbG9nLmRlYnVnKCJjaGFuZ2luZyBiYWNrIHRvICclcyciLCBzYXZlX2N3ZCkKKyAgICAgICAgICAgIG9zLmNoZGlyKHNhdmVfY3dkKQorCisgICAgcmV0dXJuIGZpbGVuYW1lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9hcmNoaXZlX3V0aWwucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvYXJjaGl2ZV91dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTEwZWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvYXJjaGl2ZV91dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9hcmNoaXZlX3V0aWwucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvYXJjaGl2ZV91dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTEwZWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvYXJjaGl2ZV91dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9iY3BwY29tcGlsZXIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9iY3BwY29tcGlsZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI2ZTdhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2JjcHBjb21waWxlci5weQpAQCAtMCwwICsxLDM5NCBAQAorIiIiZGlzdHV0aWxzLmJjcHBjb21waWxlcgorCitDb250YWlucyBCb3JsYW5kQ0NvbXBpbGVyLCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgQ0NvbXBpbGVyIGNsYXNzCitmb3IgdGhlIEJvcmxhbmQgQysrIGNvbXBpbGVyLgorIiIiCisKKyMgVGhpcyBpbXBsZW1lbnRhdGlvbiBieSBMeWxlIEpvaG5zb24sIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBtc3ZjY29tcGlsZXIucHkKKyMgbW9kdWxlIGFuZCB1c2luZyB0aGUgZGlyZWN0aW9ucyBvcmlnaW5hbGx5IHB1Ymxpc2hlZCBieSBHb3Jkb24gV2lsbGlhbXMuCisKKyMgWFhYIGxvb2tzIGxpa2UgdGhlcmUncyBhIExPVCBvZiBvdmVybGFwIGJldHdlZW4gdGhlc2UgdHdvIGNsYXNzZXM6CisjIHNvbWVvbmUgc2hvdWxkIHNpdCBkb3duIGFuZCBmYWN0b3Igb3V0IHRoZSBjb21tb24gY29kZSBhcworIyBXaW5kb3dzQ0NvbXBpbGVyISAgLS1HUFcKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcworCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IChEaXN0dXRpbHNFeGVjRXJyb3IsIENvbXBpbGVFcnJvciwgTGliRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rRXJyb3IsIFVua25vd25GaWxlRXJyb3IpCitmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IENDb21waWxlciwgZ2VuX3ByZXByb2Nlc3Nfb3B0aW9ucworZnJvbSBkaXN0dXRpbHMuZmlsZV91dGlsIGltcG9ydCB3cml0ZV9maWxlCitmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXIKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworY2xhc3MgQkNQUENvbXBpbGVyKENDb21waWxlcikgOgorICAgICIiIkNvbmNyZXRlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgdG8gdGhlIEJvcmxhbmQgQy9DKysKKyAgICBjb21waWxlciwgYXMgZGVmaW5lZCBieSB0aGUgQ0NvbXBpbGVyIGFic3RyYWN0IGNsYXNzLgorICAgICIiIgorCisgICAgY29tcGlsZXJfdHlwZSA9ICdiY3BwJworCisgICAgIyBKdXN0IHNldCB0aGlzIHNvIENDb21waWxlcidzIGNvbnN0cnVjdG9yIGRvZXNuJ3QgYmFyZi4gIFdlIGN1cnJlbnRseQorICAgICMgZG9uJ3QgdXNlIHRoZSAnc2V0X2V4ZWN1dGFibGVzKCknIGJ1cmVhdWNyYWN5IHByb3ZpZGVkIGJ5IENDb21waWxlciwKKyAgICAjIGFzIGl0IHJlYWxseSBpc24ndCBuZWNlc3NhcnkgZm9yIHRoaXMgc29ydCBvZiBzaW5nbGUtY29tcGlsZXIgY2xhc3MuCisgICAgIyBXb3VsZCBiZSBuaWNlIHRvIGhhdmUgYSBjb25zaXN0ZW50IGludGVyZmFjZSB3aXRoIFVuaXhDQ29tcGlsZXIsCisgICAgIyB0aG91Z2gsIHNvIGl0J3Mgd29ydGggdGhpbmtpbmcgYWJvdXQuCisgICAgZXhlY3V0YWJsZXMgPSB7fQorCisgICAgIyBQcml2YXRlIGNsYXNzIGRhdGEgKG5lZWQgdG8gZGlzdGluZ3Vpc2ggQyBmcm9tIEMrKyBzb3VyY2UgZm9yIGNvbXBpbGVyKQorICAgIF9jX2V4dGVuc2lvbnMgPSBbJy5jJ10KKyAgICBfY3BwX2V4dGVuc2lvbnMgPSBbJy5jYycsICcuY3BwJywgJy5jeHgnXQorCisgICAgIyBOZWVkZWQgZm9yIHRoZSBmaWxlbmFtZSBnZW5lcmF0aW9uIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlCisgICAgIyBiYXNlIGNsYXNzLCBDQ29tcGlsZXIuCisgICAgc3JjX2V4dGVuc2lvbnMgPSBfY19leHRlbnNpb25zICsgX2NwcF9leHRlbnNpb25zCisgICAgb2JqX2V4dGVuc2lvbiA9ICcub2JqJworICAgIHN0YXRpY19saWJfZXh0ZW5zaW9uID0gJy5saWInCisgICAgc2hhcmVkX2xpYl9leHRlbnNpb24gPSAnLmRsbCcKKyAgICBzdGF0aWNfbGliX2Zvcm1hdCA9IHNoYXJlZF9saWJfZm9ybWF0ID0gJyVzJXMnCisgICAgZXhlX2V4dGVuc2lvbiA9ICcuZXhlJworCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsCisgICAgICAgICAgICAgICAgICB2ZXJib3NlPTAsCisgICAgICAgICAgICAgICAgICBkcnlfcnVuPTAsCisgICAgICAgICAgICAgICAgICBmb3JjZT0wKToKKworICAgICAgICBDQ29tcGlsZXIuX19pbml0X18gKHNlbGYsIHZlcmJvc2UsIGRyeV9ydW4sIGZvcmNlKQorCisgICAgICAgICMgVGhlc2UgZXhlY3V0YWJsZXMgYXJlIGFzc3VtZWQgdG8gYWxsIGJlIGluIHRoZSBwYXRoLgorICAgICAgICAjIEJvcmxhbmQgZG9lc24ndCBzZWVtIHRvIHVzZSBhbnkgc3BlY2lhbCByZWdpc3RyeSBzZXR0aW5ncyB0bworICAgICAgICAjIGluZGljYXRlIHRoZWlyIGluc3RhbGxhdGlvbiBsb2NhdGlvbnMuCisKKyAgICAgICAgc2VsZi5jYyA9ICJiY2MzMi5leGUiCisgICAgICAgIHNlbGYubGlua2VyID0gImlsaW5rMzIuZXhlIgorICAgICAgICBzZWxmLmxpYiA9ICJ0bGliLmV4ZSIKKworICAgICAgICBzZWxmLnByZXByb2Nlc3Nfb3B0aW9ucyA9IE5vbmUKKyAgICAgICAgc2VsZi5jb21waWxlX29wdGlvbnMgPSBbJy90V00nLCAnL08yJywgJy9xJywgJy9nMCddCisgICAgICAgIHNlbGYuY29tcGlsZV9vcHRpb25zX2RlYnVnID0gWycvdFdNJywgJy9PZCcsICcvcScsICcvZzAnXQorCisgICAgICAgIHNlbGYubGRmbGFnc19zaGFyZWQgPSBbJy9UcGQnLCAnL0duJywgJy9xJywgJy94J10KKyAgICAgICAgc2VsZi5sZGZsYWdzX3NoYXJlZF9kZWJ1ZyA9IFsnL1RwZCcsICcvR24nLCAnL3EnLCAnL3gnXQorICAgICAgICBzZWxmLmxkZmxhZ3Nfc3RhdGljID0gW10KKyAgICAgICAgc2VsZi5sZGZsYWdzX2V4ZSA9IFsnL0duJywgJy9xJywgJy94J10KKyAgICAgICAgc2VsZi5sZGZsYWdzX2V4ZV9kZWJ1ZyA9IFsnL0duJywgJy9xJywgJy94JywnL3InXQorCisKKyAgICAjIC0tIFdvcmtlciBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGNvbXBpbGUoc2VsZiwgc291cmNlcywKKyAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPU5vbmUsIG1hY3Jvcz1Ob25lLCBpbmNsdWRlX2RpcnM9Tm9uZSwgZGVidWc9MCwKKyAgICAgICAgICAgICAgICBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGRlcGVuZHM9Tm9uZSk6CisKKyAgICAgICAgbWFjcm9zLCBvYmplY3RzLCBleHRyYV9wb3N0YXJncywgcHBfb3B0cywgYnVpbGQgPSBcCisgICAgICAgICAgICAgICAgc2VsZi5fc2V0dXBfY29tcGlsZShvdXRwdXRfZGlyLCBtYWNyb3MsIGluY2x1ZGVfZGlycywgc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMsIGV4dHJhX3Bvc3RhcmdzKQorICAgICAgICBjb21waWxlX29wdHMgPSBleHRyYV9wcmVhcmdzIG9yIFtdCisgICAgICAgIGNvbXBpbGVfb3B0cy5hcHBlbmQgKCctYycpCisgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgY29tcGlsZV9vcHRzLmV4dGVuZCAoc2VsZi5jb21waWxlX29wdGlvbnNfZGVidWcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb21waWxlX29wdHMuZXh0ZW5kIChzZWxmLmNvbXBpbGVfb3B0aW9ucykKKworICAgICAgICBmb3Igb2JqIGluIG9iamVjdHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3JjLCBleHQgPSBidWlsZFtvYmpdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgWFhYIHdoeSBkbyB0aGUgbm9ybXBhdGggaGVyZT8KKyAgICAgICAgICAgIHNyYyA9IG9zLnBhdGgubm9ybXBhdGgoc3JjKQorICAgICAgICAgICAgb2JqID0gb3MucGF0aC5ub3JtcGF0aChvYmopCisgICAgICAgICAgICAjIFhYWCBfc2V0dXBfY29tcGlsZSgpIGRpZCBhIG1rcGF0aCgpIHRvbyBidXQgYmVmb3JlIHRoZSBub3JtcGF0aC4KKyAgICAgICAgICAgICMgSXMgaXQgcG9zc2libGUgdG8gc2tpcCB0aGUgbm9ybXBhdGg/CisgICAgICAgICAgICBzZWxmLm1rcGF0aChvcy5wYXRoLmRpcm5hbWUob2JqKSkKKworICAgICAgICAgICAgaWYgZXh0ID09ICcucmVzJzoKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYWxyZWFkeSBhIGJpbmFyeSBmaWxlIC0tIHNraXAgaXQuCisgICAgICAgICAgICAgICAgY29udGludWUgIyB0aGUgJ2ZvcicgbG9vcAorICAgICAgICAgICAgaWYgZXh0ID09ICcucmMnOgorICAgICAgICAgICAgICAgICMgVGhpcyBuZWVkcyB0byBiZSBjb21waWxlZCB0byBhIC5yZXMgZmlsZSAtLSBkbyBpdCBub3cuCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNwYXduIChbImJyY2MzMiIsICItZm8iLCBvYmosIHNyY10pCisgICAgICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IsIG1zZworICAgICAgICAgICAgICAgIGNvbnRpbnVlICMgdGhlICdmb3InIGxvb3AKKworICAgICAgICAgICAgIyBUaGUgbmV4dCB0d28gYXJlIGJvdGggZm9yIHRoZSByZWFsIGNvbXBpbGVyLgorICAgICAgICAgICAgaWYgZXh0IGluIHNlbGYuX2NfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICBpbnB1dF9vcHQgPSAiIgorICAgICAgICAgICAgZWxpZiBleHQgaW4gc2VsZi5fY3BwX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgaW5wdXRfb3B0ID0gIi1QIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFVua25vd24gZmlsZSB0eXBlIC0tIG5vIGV4dHJhIG9wdGlvbnMuICBUaGUgY29tcGlsZXIKKyAgICAgICAgICAgICAgICAjIHdpbGwgcHJvYmFibHkgZmFpbCwgYnV0IGxldCBpdCBqdXN0IGluIGNhc2UgdGhpcyBpcyBhCisgICAgICAgICAgICAgICAgIyBmaWxlIHRoZSBjb21waWxlciByZWNvZ25pemVzIGV2ZW4gaWYgd2UgZG9uJ3QuCisgICAgICAgICAgICAgICAgaW5wdXRfb3B0ID0gIiIKKworICAgICAgICAgICAgb3V0cHV0X29wdCA9ICItbyIgKyBvYmoKKworICAgICAgICAgICAgIyBDb21waWxlciBjb21tYW5kIGxpbmUgc3ludGF4IGlzOiAiYmNjMzIgW29wdGlvbnNdIGZpbGUocykiLgorICAgICAgICAgICAgIyBOb3RlIHRoYXQgdGhlIHNvdXJjZSBmaWxlIG5hbWVzIG11c3QgYXBwZWFyIGF0IHRoZSBlbmQgb2YKKyAgICAgICAgICAgICMgdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNwYXduIChbc2VsZi5jY10gKyBjb21waWxlX29wdHMgKyBwcF9vcHRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRfb3B0LCBvdXRwdXRfb3B0XSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3MgKyBbc3JjXSkKKyAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IsIG1zZworCisgICAgICAgIHJldHVybiBvYmplY3RzCisKKyAgICAjIGNvbXBpbGUgKCkKKworCisgICAgZGVmIGNyZWF0ZV9zdGF0aWNfbGliIChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9saWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9sYW5nPU5vbmUpOgorCisgICAgICAgIChvYmplY3RzLCBvdXRwdXRfZGlyKSA9IHNlbGYuX2ZpeF9vYmplY3RfYXJncyAob2JqZWN0cywgb3V0cHV0X2RpcikKKyAgICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gXAorICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2ZpbGVuYW1lIChvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1vdXRwdXRfZGlyKQorCisgICAgICAgIGlmIHNlbGYuX25lZWRfbGluayAob2JqZWN0cywgb3V0cHV0X2ZpbGVuYW1lKToKKyAgICAgICAgICAgIGxpYl9hcmdzID0gW291dHB1dF9maWxlbmFtZSwgJy91J10gKyBvYmplY3RzCisgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICBwYXNzICAgICAgICAgICAgICAgICAgICAjIFhYWCB3aGF0IGdvZXMgaGVyZT8KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNwYXduIChbc2VsZi5saWJdICsgbGliX2FyZ3MpCisgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcmFpc2UgTGliRXJyb3IsIG1zZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nLmRlYnVnKCJza2lwcGluZyAlcyAodXAtdG8tZGF0ZSkiLCBvdXRwdXRfZmlsZW5hbWUpCisKKyAgICAjIGNyZWF0ZV9zdGF0aWNfbGliICgpCisKKworICAgIGRlZiBsaW5rIChzZWxmLAorICAgICAgICAgICAgICB0YXJnZXRfZGVzYywKKyAgICAgICAgICAgICAgb2JqZWN0cywKKyAgICAgICAgICAgICAgb3V0cHV0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICBvdXRwdXRfZGlyPU5vbmUsCisgICAgICAgICAgICAgIGxpYnJhcmllcz1Ob25lLAorICAgICAgICAgICAgICBsaWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHM9Tm9uZSwKKyAgICAgICAgICAgICAgZGVidWc9MCwKKyAgICAgICAgICAgICAgZXh0cmFfcHJlYXJncz1Ob25lLAorICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncz1Ob25lLAorICAgICAgICAgICAgICBidWlsZF90ZW1wPU5vbmUsCisgICAgICAgICAgICAgIHRhcmdldF9sYW5nPU5vbmUpOgorCisgICAgICAgICMgWFhYIHRoaXMgaWdub3JlcyAnYnVpbGRfdGVtcCchICBzaG91bGQgZm9sbG93IHRoZSBsZWFkIG9mCisgICAgICAgICMgbXN2Y2NvbXBpbGVyLnB5CisKKyAgICAgICAgKG9iamVjdHMsIG91dHB1dF9kaXIpID0gc2VsZi5fZml4X29iamVjdF9hcmdzIChvYmplY3RzLCBvdXRwdXRfZGlyKQorICAgICAgICAobGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzKSA9IFwKKyAgICAgICAgICAgIHNlbGYuX2ZpeF9saWJfYXJncyAobGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzKQorCisgICAgICAgIGlmIHJ1bnRpbWVfbGlicmFyeV9kaXJzOgorICAgICAgICAgICAgbG9nLndhcm4oIkkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggJ3J1bnRpbWVfbGlicmFyeV9kaXJzJzogJXMiLAorICAgICAgICAgICAgICAgICAgICAgc3RyKHJ1bnRpbWVfbGlicmFyeV9kaXJzKSkKKworICAgICAgICBpZiBvdXRwdXRfZGlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luIChvdXRwdXRfZGlyLCBvdXRwdXRfZmlsZW5hbWUpCisKKyAgICAgICAgaWYgc2VsZi5fbmVlZF9saW5rIChvYmplY3RzLCBvdXRwdXRfZmlsZW5hbWUpOgorCisgICAgICAgICAgICAjIEZpZ3VyZSBvdXQgbGlua2VyIGFyZ3MgYmFzZWQgb24gdHlwZSBvZiB0YXJnZXQuCisgICAgICAgICAgICBpZiB0YXJnZXRfZGVzYyA9PSBDQ29tcGlsZXIuRVhFQ1VUQUJMRToKKyAgICAgICAgICAgICAgICBzdGFydHVwX29iaiA9ICdjMHczMicKKyAgICAgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgbGRfYXJncyA9IHNlbGYubGRmbGFnc19leGVfZGVidWdbOl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsZF9hcmdzID0gc2VsZi5sZGZsYWdzX2V4ZVs6XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGFydHVwX29iaiA9ICdjMGQzMicKKyAgICAgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgbGRfYXJncyA9IHNlbGYubGRmbGFnc19zaGFyZWRfZGVidWdbOl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsZF9hcmdzID0gc2VsZi5sZGZsYWdzX3NoYXJlZFs6XQorCisKKyAgICAgICAgICAgICMgQ3JlYXRlIGEgdGVtcG9yYXJ5IGV4cG9ydHMgZmlsZSBmb3IgdXNlIGJ5IHRoZSBsaW5rZXIKKyAgICAgICAgICAgIGlmIGV4cG9ydF9zeW1ib2xzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVmX2ZpbGUgPSAnJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdCAob3V0cHV0X2ZpbGVuYW1lKQorICAgICAgICAgICAgICAgIG1vZG5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQgKHRhaWwpCisgICAgICAgICAgICAgICAgdGVtcF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob2JqZWN0c1swXSkgIyBwcmVzZXJ2ZSB0cmVlIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgIGRlZl9maWxlID0gb3MucGF0aC5qb2luICh0ZW1wX2RpciwgJyVzLmRlZicgJSBtb2RuYW1lKQorICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gWydFWFBPUlRTJ10KKyAgICAgICAgICAgICAgICBmb3Igc3ltIGluIChleHBvcnRfc3ltYm9scyBvciBbXSk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZCgnICAlcz1fJXMnICUgKHN5bSwgc3ltKSkKKyAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGUod3JpdGVfZmlsZSwgKGRlZl9maWxlLCBjb250ZW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0aW5nICVzIiAlIGRlZl9maWxlKQorCisgICAgICAgICAgICAjIEJvcmxhbmQgQysrIGhhcyBwcm9ibGVtcyB3aXRoICcvJyBpbiBwYXRocworICAgICAgICAgICAgb2JqZWN0czIgPSBtYXAob3MucGF0aC5ub3JtcGF0aCwgb2JqZWN0cykKKyAgICAgICAgICAgICMgc3BsaXQgb2JqZWN0cyBpbiAub2JqIGFuZCAucmVzIGZpbGVzCisgICAgICAgICAgICAjIEJvcmxhbmQgQysrIG5lZWRzIHRoZW0gYXQgZGlmZmVyZW50IHBvc2l0aW9ucyBpbiB0aGUgY29tbWFuZCBsaW5lCisgICAgICAgICAgICBvYmplY3RzID0gW3N0YXJ0dXBfb2JqXQorICAgICAgICAgICAgcmVzb3VyY2VzID0gW10KKyAgICAgICAgICAgIGZvciBmaWxlIGluIG9iamVjdHMyOgorICAgICAgICAgICAgICAgIChiYXNlLCBleHQpID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLm5vcm1jYXNlKGZpbGUpKQorICAgICAgICAgICAgICAgIGlmIGV4dCA9PSAnLnJlcyc6CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy5hcHBlbmQoZmlsZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvYmplY3RzLmFwcGVuZChmaWxlKQorCisKKyAgICAgICAgICAgIGZvciBsIGluIGxpYnJhcnlfZGlyczoKKyAgICAgICAgICAgICAgICBsZF9hcmdzLmFwcGVuZCgiL0wlcyIgJSBvcy5wYXRoLm5vcm1wYXRoKGwpKQorICAgICAgICAgICAgbGRfYXJncy5hcHBlbmQoIi9MLiIpICMgd2Ugc29tZXRpbWVzIHVzZSByZWxhdGl2ZSBwYXRocworCisgICAgICAgICAgICAjIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzCisgICAgICAgICAgICBsZF9hcmdzLmV4dGVuZChvYmplY3RzKQorCisgICAgICAgICAgICAjIFhYWCB0aGUgY29tbWFuZC1saW5lIHN5bnRheCBmb3IgQm9ybGFuZCBDKysgaXMgYSBiaXQgd29ua3k7CisgICAgICAgICAgICAjIGNlcnRhaW4gZmlsZW5hbWVzIGFyZSBqYW1tZWQgdG9nZXRoZXIgaW4gb25lIGJpZyBzdHJpbmcsIGJ1dAorICAgICAgICAgICAgIyBjb21tYS1kZWxpbWl0ZWQuICBUaGlzIGRvZXNuJ3QgbWVzaCB0b28gd2VsbCB3aXRoIHRoZQorICAgICAgICAgICAgIyBVbml4LWNlbnRyaWMgYXR0aXR1ZGUgKHdpdGggYSBET1MvV2luZG93cyBxdW90aW5nIGhhY2spIG9mCisgICAgICAgICAgICAjICdzcGF3bigpJywgc28gY29uc3RydWN0aW5nIHRoZSBhcmd1bWVudCBsaXN0IGlzIGEgYml0CisgICAgICAgICAgICAjIGF3a3dhcmQuICBOb3RlIHRoYXQgZG9pbmcgdGhlIG9idmlvdXMgdGhpbmcgYW5kIGphbW1pbmcgYWxsCisgICAgICAgICAgICAjIHRoZSBmaWxlbmFtZXMgYW5kIGNvbW1hcyBpbnRvIG9uZSBhcmd1bWVudCB3b3VsZCBiZSB3cm9uZywKKyAgICAgICAgICAgICMgYmVjYXVzZSAnc3Bhd24oKScgd291bGQgcXVvdGUgYW55IGZpbGVuYW1lcyB3aXRoIHNwYWNlcyBpbgorICAgICAgICAgICAgIyB0aGVtLiAgQXJnaGdoaCEuICBBcHBhcmVudGx5IGl0IHdvcmtzIGZpbmUgYXMgY29kZWQuLi4KKworICAgICAgICAgICAgIyBuYW1lIG9mIGRsbC9leGUgZmlsZQorICAgICAgICAgICAgbGRfYXJncy5leHRlbmQoWycsJyxvdXRwdXRfZmlsZW5hbWVdKQorICAgICAgICAgICAgIyBubyBtYXAgZmlsZSBhbmQgc3RhcnQgbGlicmFyaWVzCisgICAgICAgICAgICBsZF9hcmdzLmFwcGVuZCgnLCwnKQorCisgICAgICAgICAgICBmb3IgbGliIGluIGxpYnJhcmllczoKKyAgICAgICAgICAgICAgICAjIHNlZSBpZiB3ZSBmaW5kIGl0IGFuZCBpZiB0aGVyZSBpcyBhIGJjcHAgc3BlY2lmaWMgbGliCisgICAgICAgICAgICAgICAgIyAoeHh4X2JjcHAubGliKQorICAgICAgICAgICAgICAgIGxpYmZpbGUgPSBzZWxmLmZpbmRfbGlicmFyeV9maWxlKGxpYnJhcnlfZGlycywgbGliLCBkZWJ1ZykKKyAgICAgICAgICAgICAgICBpZiBsaWJmaWxlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGxkX2FyZ3MuYXBwZW5kKGxpYikKKyAgICAgICAgICAgICAgICAgICAgIyBwcm9iYWJseSBhIEJDUFAgaW50ZXJuYWwgbGlicmFyeSAtLSBkb24ndCB3YXJuCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBmdWxsIG5hbWUgd2hpY2ggcHJlZmVycyBiY3BwX3h4eC5saWIgb3ZlciB4eHgubGliCisgICAgICAgICAgICAgICAgICAgIGxkX2FyZ3MuYXBwZW5kKGxpYmZpbGUpCisKKyAgICAgICAgICAgICMgc29tZSBkZWZhdWx0IGxpYnJhcmllcworICAgICAgICAgICAgbGRfYXJncy5hcHBlbmQgKCdpbXBvcnQzMicpCisgICAgICAgICAgICBsZF9hcmdzLmFwcGVuZCAoJ2N3MzJtdCcpCisKKyAgICAgICAgICAgICMgZGVmIGZpbGUgZm9yIGV4cG9ydCBzeW1ib2xzCisgICAgICAgICAgICBsZF9hcmdzLmV4dGVuZChbJywnLGRlZl9maWxlXSkKKyAgICAgICAgICAgICMgYWRkIHJlc291cmNlIGZpbGVzCisgICAgICAgICAgICBsZF9hcmdzLmFwcGVuZCgnLCcpCisgICAgICAgICAgICBsZF9hcmdzLmV4dGVuZChyZXNvdXJjZXMpCisKKworICAgICAgICAgICAgaWYgZXh0cmFfcHJlYXJnczoKKyAgICAgICAgICAgICAgICBsZF9hcmdzWzowXSA9IGV4dHJhX3ByZWFyZ3MKKyAgICAgICAgICAgIGlmIGV4dHJhX3Bvc3RhcmdzOgorICAgICAgICAgICAgICAgIGxkX2FyZ3MuZXh0ZW5kKGV4dHJhX3Bvc3RhcmdzKQorCisgICAgICAgICAgICBzZWxmLm1rcGF0aCAob3MucGF0aC5kaXJuYW1lIChvdXRwdXRfZmlsZW5hbWUpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24gKFtzZWxmLmxpbmtlcl0gKyBsZF9hcmdzKQorICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHJhaXNlIExpbmtFcnJvciwgbXNnCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZy5kZWJ1Zygic2tpcHBpbmcgJXMgKHVwLXRvLWRhdGUpIiwgb3V0cHV0X2ZpbGVuYW1lKQorCisgICAgIyBsaW5rICgpCisKKyAgICAjIC0tIE1pc2NlbGxhbmVvdXMgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBkZWYgZmluZF9saWJyYXJ5X2ZpbGUgKHNlbGYsIGRpcnMsIGxpYiwgZGVidWc9MCk6CisgICAgICAgICMgTGlzdCBvZiBlZmZlY3RpdmUgbGlicmFyeSBuYW1lcyB0byB0cnksIGluIG9yZGVyIG9mIHByZWZlcmVuY2U6CisgICAgICAgICMgeHh4X2JjcHAubGliIGlzIGJldHRlciB0aGFuIHh4eC5saWIKKyAgICAgICAgIyBhbmQgeHh4X2QubGliIGlzIGJldHRlciB0aGFuIHh4eC5saWIgaWYgZGVidWcgaXMgc2V0CisgICAgICAgICMKKyAgICAgICAgIyBUaGUgIl9iY3BwIiBzdWZmaXggaXMgdG8gaGFuZGxlIGEgUHl0aG9uIGluc3RhbGxhdGlvbiBmb3IgcGVvcGxlCisgICAgICAgICMgd2l0aCBtdWx0aXBsZSBjb21waWxlcnMgKHByaW1hcmlseSBEaXN0dXRpbHMgaGFja2VycywgSSBzdXNwZWN0CisgICAgICAgICMgOy0pLiAgVGhlIGlkZWEgaXMgdGhleSdkIGhhdmUgb25lIHN0YXRpYyBsaWJyYXJ5IGZvciBlYWNoCisgICAgICAgICMgY29tcGlsZXIgdGhleSBjYXJlIGFib3V0LCBzaW5jZSAoYWxtb3N0PykgZXZlcnkgV2luZG93cyBjb21waWxlcgorICAgICAgICAjIHNlZW1zIHRvIGhhdmUgYSBkaWZmZXJlbnQgZm9ybWF0IGZvciBzdGF0aWMgbGlicmFyaWVzLgorICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgIGRsaWIgPSAobGliICsgIl9kIikKKyAgICAgICAgICAgIHRyeV9uYW1lcyA9IChkbGliICsgIl9iY3BwIiwgbGliICsgIl9iY3BwIiwgZGxpYiwgbGliKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5X25hbWVzID0gKGxpYiArICJfYmNwcCIsIGxpYikKKworICAgICAgICBmb3IgZGlyIGluIGRpcnM6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiB0cnlfbmFtZXM6CisgICAgICAgICAgICAgICAgbGliZmlsZSA9IG9zLnBhdGguam9pbihkaXIsIHNlbGYubGlicmFyeV9maWxlbmFtZShuYW1lKSkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsaWJmaWxlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpYmZpbGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgT29wcywgZGlkbid0IGZpbmQgaXQgaW4gKmFueSogb2YgJ2RpcnMnCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBvdmVyd3JpdGUgdGhlIG9uZSBmcm9tIENDb21waWxlciB0byBzdXBwb3J0IHJjIGFuZCByZXMtZmlsZXMKKyAgICBkZWYgb2JqZWN0X2ZpbGVuYW1lcyAoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2ZpbGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBfZGlyPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9JycpOgorICAgICAgICBpZiBvdXRwdXRfZGlyIGlzIE5vbmU6IG91dHB1dF9kaXIgPSAnJworICAgICAgICBvYmpfbmFtZXMgPSBbXQorICAgICAgICBmb3Igc3JjX25hbWUgaW4gc291cmNlX2ZpbGVuYW1lczoKKyAgICAgICAgICAgICMgdXNlIG5vcm1jYXNlIHRvIG1ha2Ugc3VyZSAnLnJjJyBpcyByZWFsbHkgJy5yYycgYW5kIG5vdCAnLlJDJworICAgICAgICAgICAgKGJhc2UsIGV4dCkgPSBvcy5wYXRoLnNwbGl0ZXh0IChvcy5wYXRoLm5vcm1jYXNlKHNyY19uYW1lKSkKKyAgICAgICAgICAgIGlmIGV4dCBub3QgaW4gKHNlbGYuc3JjX2V4dGVuc2lvbnMgKyBbJy5yYycsJy5yZXMnXSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVW5rbm93bkZpbGVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGZpbGUgdHlwZSAnJXMnIChmcm9tICclcycpIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAoZXh0LCBzcmNfbmFtZSkKKyAgICAgICAgICAgIGlmIHN0cmlwX2RpcjoKKyAgICAgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5iYXNlbmFtZSAoYmFzZSkKKyAgICAgICAgICAgIGlmIGV4dCA9PSAnLnJlcyc6CisgICAgICAgICAgICAgICAgIyB0aGVzZSBjYW4gZ28gdW5jaGFuZ2VkCisgICAgICAgICAgICAgICAgb2JqX25hbWVzLmFwcGVuZCAob3MucGF0aC5qb2luIChvdXRwdXRfZGlyLCBiYXNlICsgZXh0KSkKKyAgICAgICAgICAgIGVsaWYgZXh0ID09ICcucmMnOgorICAgICAgICAgICAgICAgICMgdGhlc2UgbmVlZCB0byBiZSBjb21waWxlZCB0byAucmVzLWZpbGVzCisgICAgICAgICAgICAgICAgb2JqX25hbWVzLmFwcGVuZCAob3MucGF0aC5qb2luIChvdXRwdXRfZGlyLCBiYXNlICsgJy5yZXMnKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2JqX25hbWVzLmFwcGVuZCAob3MucGF0aC5qb2luIChvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgc2VsZi5vYmpfZXh0ZW5zaW9uKSkKKyAgICAgICAgcmV0dXJuIG9ial9uYW1lcworCisgICAgIyBvYmplY3RfZmlsZW5hbWVzICgpCisKKyAgICBkZWYgcHJlcHJvY2VzcyAoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZmlsZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICBtYWNyb3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3M9Tm9uZSk6CisKKyAgICAgICAgKF8sIG1hY3JvcywgaW5jbHVkZV9kaXJzKSA9IFwKKyAgICAgICAgICAgIHNlbGYuX2ZpeF9jb21waWxlX2FyZ3MoTm9uZSwgbWFjcm9zLCBpbmNsdWRlX2RpcnMpCisgICAgICAgIHBwX29wdHMgPSBnZW5fcHJlcHJvY2Vzc19vcHRpb25zKG1hY3JvcywgaW5jbHVkZV9kaXJzKQorICAgICAgICBwcF9hcmdzID0gWydjcHAzMi5leGUnXSArIHBwX29wdHMKKyAgICAgICAgaWYgb3V0cHV0X2ZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcF9hcmdzLmFwcGVuZCgnLW8nICsgb3V0cHV0X2ZpbGUpCisgICAgICAgIGlmIGV4dHJhX3ByZWFyZ3M6CisgICAgICAgICAgICBwcF9hcmdzWzowXSA9IGV4dHJhX3ByZWFyZ3MKKyAgICAgICAgaWYgZXh0cmFfcG9zdGFyZ3M6CisgICAgICAgICAgICBwcF9hcmdzLmV4dGVuZChleHRyYV9wb3N0YXJncykKKyAgICAgICAgcHBfYXJncy5hcHBlbmQoc291cmNlKQorCisgICAgICAgICMgV2UgbmVlZCB0byBwcmVwcm9jZXNzOiBlaXRoZXIgd2UncmUgYmVpbmcgZm9yY2VkIHRvLCBvciB0aGUKKyAgICAgICAgIyBzb3VyY2UgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSB0YXJnZXQgKG9yIHRoZSB0YXJnZXQgZG9lc24ndAorICAgICAgICAjIGV4aXN0KS4KKyAgICAgICAgaWYgc2VsZi5mb3JjZSBvciBvdXRwdXRfZmlsZSBpcyBOb25lIG9yIG5ld2VyKHNvdXJjZSwgb3V0cHV0X2ZpbGUpOgorICAgICAgICAgICAgaWYgb3V0cHV0X2ZpbGU6CisgICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgob3MucGF0aC5kaXJuYW1lKG91dHB1dF9maWxlKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNwYXduKHBwX2FyZ3MpCisgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcHJpbnQgbXNnCisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcGlsZUVycm9yLCBtc2cKKworICAgICMgcHJlcHJvY2VzcygpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9iY3BwY29tcGlsZXIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvYmNwcGNvbXBpbGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzM3M2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvYmNwcGNvbXBpbGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9iY3BwY29tcGlsZXIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvYmNwcGNvbXBpbGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzM3M2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvYmNwcGNvbXBpbGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jY29tcGlsZXIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jY29tcGlsZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4ZDhmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Njb21waWxlci5weQpAQCAtMCwwICsxLDEwOTcgQEAKKyIiImRpc3R1dGlscy5jY29tcGlsZXIKKworQ29udGFpbnMgQ0NvbXBpbGVyLCBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgZGVmaW5lcyB0aGUgaW50ZXJmYWNlCitmb3IgdGhlIERpc3R1dGlscyBjb21waWxlciBhYnN0cmFjdGlvbiBtb2RlbC4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHJlCisKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKENvbXBpbGVFcnJvciwgTGlua0Vycm9yLCBVbmtub3duRmlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgRGlzdHV0aWxzTW9kdWxlRXJyb3IpCitmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KK2Zyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgbW92ZV9maWxlCitmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgbWtwYXRoCitmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXJfZ3JvdXAKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IHNwbGl0X3F1b3RlZCwgZXhlY3V0ZQorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworIyBmb2xsb3dpbmcgaW1wb3J0IGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Citmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGN1c3RvbWl6ZV9jb21waWxlcgorCitjbGFzcyBDQ29tcGlsZXI6CisgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyB0byBkZWZpbmUgdGhlIGludGVyZmFjZSB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQKKyAgICBieSByZWFsIGNvbXBpbGVyIGNsYXNzZXMuICBBbHNvIGhhcyBzb21lIHV0aWxpdHkgbWV0aG9kcyB1c2VkIGJ5CisgICAgc2V2ZXJhbCBjb21waWxlciBjbGFzc2VzLgorCisgICAgVGhlIGJhc2ljIGlkZWEgYmVoaW5kIGEgY29tcGlsZXIgYWJzdHJhY3Rpb24gY2xhc3MgaXMgdGhhdCBlYWNoCisgICAgaW5zdGFuY2UgY2FuIGJlIHVzZWQgZm9yIGFsbCB0aGUgY29tcGlsZS9saW5rIHN0ZXBzIGluIGJ1aWxkaW5nIGEKKyAgICBzaW5nbGUgcHJvamVjdC4gIFRodXMsIGF0dHJpYnV0ZXMgY29tbW9uIHRvIGFsbCBvZiB0aG9zZSBjb21waWxlIGFuZAorICAgIGxpbmsgc3RlcHMgLS0gaW5jbHVkZSBkaXJlY3RvcmllcywgbWFjcm9zIHRvIGRlZmluZSwgbGlicmFyaWVzIHRvIGxpbmsKKyAgICBhZ2FpbnN0LCBldGMuIC0tIGFyZSBhdHRyaWJ1dGVzIG9mIHRoZSBjb21waWxlciBpbnN0YW5jZS4gIFRvIGFsbG93IGZvcgorICAgIHZhcmlhYmlsaXR5IGluIGhvdyBpbmRpdmlkdWFsIGZpbGVzIGFyZSB0cmVhdGVkLCBtb3N0IG9mIHRob3NlCisgICAgYXR0cmlidXRlcyBtYXkgYmUgdmFyaWVkIG9uIGEgcGVyLWNvbXBpbGF0aW9uIG9yIHBlci1saW5rIGJhc2lzLgorICAgICIiIgorCisgICAgIyAnY29tcGlsZXJfdHlwZScgaXMgYSBjbGFzcyBhdHRyaWJ1dGUgdGhhdCBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICBJdAorICAgICMga2VlcHMgY29kZSB0aGF0IHdhbnRzIHRvIGtub3cgd2hhdCBraW5kIG9mIGNvbXBpbGVyIGl0J3MgZGVhbGluZyB3aXRoCisgICAgIyBmcm9tIGhhdmluZyB0byBpbXBvcnQgYWxsIHBvc3NpYmxlIGNvbXBpbGVyIGNsYXNzZXMganVzdCB0byBkbyBhbgorICAgICMgJ2lzaW5zdGFuY2UnLiAgSW4gY29uY3JldGUgQ0NvbXBpbGVyIHN1YmNsYXNzZXMsICdjb21waWxlcl90eXBlJworICAgICMgc2hvdWxkIHJlYWxseSwgcmVhbGx5IGJlIG9uZSBvZiB0aGUga2V5cyBvZiB0aGUgJ2NvbXBpbGVyX2NsYXNzJworICAgICMgZGljdGlvbmFyeSAoc2VlIGJlbG93IC0tIHVzZWQgYnkgdGhlICduZXdfY29tcGlsZXIoKScgZmFjdG9yeQorICAgICMgZnVuY3Rpb24pIC0tIGF1dGhvcnMgb2YgbmV3IGNvbXBpbGVyIGludGVyZmFjZSBjbGFzc2VzIGFyZQorICAgICMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nICdjb21waWxlcl9jbGFzcychCisgICAgY29tcGlsZXJfdHlwZSA9IE5vbmUKKworICAgICMgWFhYIHRoaW5ncyBub3QgaGFuZGxlZCBieSB0aGlzIGNvbXBpbGVyIGFic3RyYWN0aW9uIG1vZGVsOgorICAgICMgICAqIGNsaWVudCBjYW4ndCBwcm92aWRlIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgYSBjb21waWxlciwKKyAgICAjICAgICBlLmcuIHdhcm5pbmcsIG9wdGltaXphdGlvbiwgZGVidWdnaW5nIGZsYWdzLiAgUGVyaGFwcyB0aGlzCisgICAgIyAgICAgc2hvdWxkIGJlIHRoZSBkb21haW4gb2YgY29uY3JldGUgY29tcGlsZXIgYWJzdHJhY3Rpb24gY2xhc3NlcworICAgICMgICAgIChVbml4Q0NvbXBpbGVyLCBNU1ZDQ29tcGlsZXIsIGV0Yy4pIC0tIG9yIHBlcmhhcHMgdGhlIGJhc2UKKyAgICAjICAgICBjbGFzcyBzaG91bGQgaGF2ZSBtZXRob2RzIGZvciB0aGUgY29tbW9uIG9uZXMuCisgICAgIyAgICogY2FuJ3QgY29tcGxldGVseSBvdmVycmlkZSB0aGUgaW5jbHVkZSBvciBsaWJyYXJ5IHNlYXJjaGcKKyAgICAjICAgICBwYXRoLCBpZS4gbm8gImNjIC1JIC1JZGlyMSAtSWRpcjIiIG9yICJjYyAtTCAtTGRpcjEgLUxkaXIyIi4KKyAgICAjICAgICBJJ20gbm90IHN1cmUgaG93IHdpZGVseSBzdXBwb3J0ZWQgdGhpcyBpcyBldmVuIGJ5IFVuaXgKKyAgICAjICAgICBjb21waWxlcnMsIG11Y2ggbGVzcyBvbiBvdGhlciBwbGF0Zm9ybXMuICBBbmQgSSdtIGV2ZW4gbGVzcworICAgICMgICAgIHN1cmUgaG93IHVzZWZ1bCBpdCBpczsgbWF5YmUgZm9yIGNyb3NzLWNvbXBpbGluZywgYnV0CisgICAgIyAgICAgc3VwcG9ydCBmb3IgdGhhdCBpcyBhIHdheXMgb2ZmLiAgKEFuZCBhbnl3YXlzLCBjcm9zcworICAgICMgICAgIGNvbXBpbGVycyBwcm9iYWJseSBoYXZlIGEgZGVkaWNhdGVkIGJpbmFyeSB3aXRoIHRoZQorICAgICMgICAgIHJpZ2h0IHBhdGhzIGNvbXBpbGVkIGluLiAgSSBob3BlLikKKyAgICAjICAgKiBjYW4ndCBkbyByZWFsbHkgZnJlYWt5IHRoaW5ncyB3aXRoIHRoZSBsaWJyYXJ5IGxpc3QvbGlicmFyeQorICAgICMgICAgIGRpcnMsIGUuZy4gIi1MZGlyMSAtbGZvbyAtTGRpcjIgLWxmb28iIHRvIGxpbmsgYWdhaW5zdAorICAgICMgICAgIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBsaWJmb28uYSBpbiBkaWZmZXJlbnQgbG9jYXRpb25zLiAgSQorICAgICMgICAgIHRoaW5rIHRoaXMgaXMgdXNlbGVzcyB3aXRob3V0IHRoZSBhYmlsaXR5IHRvIG51bGwgb3V0IHRoZQorICAgICMgICAgIGxpYnJhcnkgc2VhcmNoIHBhdGggYW55d2F5cy4KKworCisgICAgIyBTdWJjbGFzc2VzIHRoYXQgcmVseSBvbiB0aGUgc3RhbmRhcmQgZmlsZW5hbWUgZ2VuZXJhdGlvbiBtZXRob2RzCisgICAgIyBpbXBsZW1lbnRlZCBiZWxvdyBzaG91bGQgb3ZlcnJpZGUgdGhlc2U7IHNlZSB0aGUgY29tbWVudCBuZWFyCisgICAgIyB0aG9zZSBtZXRob2RzICgnb2JqZWN0X2ZpbGVuYW1lcygpJyBldC4gYWwuKSBmb3IgZGV0YWlsczoKKyAgICBzcmNfZXh0ZW5zaW9ucyA9IE5vbmUgICAgICAgICAgICAgICAjIGxpc3Qgb2Ygc3RyaW5ncworICAgIG9ial9leHRlbnNpb24gPSBOb25lICAgICAgICAgICAgICAgICMgc3RyaW5nCisgICAgc3RhdGljX2xpYl9leHRlbnNpb24gPSBOb25lCisgICAgc2hhcmVkX2xpYl9leHRlbnNpb24gPSBOb25lICAgICAgICAgIyBzdHJpbmcKKyAgICBzdGF0aWNfbGliX2Zvcm1hdCA9IE5vbmUgICAgICAgICAgICAjIGZvcm1hdCBzdHJpbmcKKyAgICBzaGFyZWRfbGliX2Zvcm1hdCA9IE5vbmUgICAgICAgICAgICAjIHByb2IuIHNhbWUgYXMgc3RhdGljX2xpYl9mb3JtYXQKKyAgICBleGVfZXh0ZW5zaW9uID0gTm9uZSAgICAgICAgICAgICAgICAjIHN0cmluZworCisgICAgIyBEZWZhdWx0IGxhbmd1YWdlIHNldHRpbmdzLiBsYW5ndWFnZV9tYXAgaXMgdXNlZCB0byBkZXRlY3QgYSBzb3VyY2UKKyAgICAjIGZpbGUgb3IgRXh0ZW5zaW9uIHRhcmdldCBsYW5ndWFnZSwgY2hlY2tpbmcgc291cmNlIGZpbGVuYW1lcy4KKyAgICAjIGxhbmd1YWdlX29yZGVyIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBsYW5ndWFnZSBwcmVjZWRlbmNlLCB3aGVuIGRlY2lkaW5nCisgICAgIyB3aGF0IGxhbmd1YWdlIHRvIHVzZSB3aGVuIG1peGluZyBzb3VyY2UgdHlwZXMuIEZvciBleGFtcGxlLCBpZiBzb21lCisgICAgIyBleHRlbnNpb24gaGFzIHR3byBmaWxlcyB3aXRoICIuYyIgZXh0ZW5zaW9uLCBhbmQgb25lIHdpdGggIi5jcHAiLCBpdAorICAgICMgaXMgc3RpbGwgbGlua2VkIGFzIGMrKy4KKyAgICBsYW5ndWFnZV9tYXAgPSB7Ii5jIiAgIDogImMiLAorICAgICAgICAgICAgICAgICAgICAiLmNjIiAgOiAiYysrIiwKKyAgICAgICAgICAgICAgICAgICAgIi5jcHAiIDogImMrKyIsCisgICAgICAgICAgICAgICAgICAgICIuY3h4IiA6ICJjKysiLAorICAgICAgICAgICAgICAgICAgICAiLm0iICAgOiAib2JqYyIsCisgICAgICAgICAgICAgICAgICAgfQorICAgIGxhbmd1YWdlX29yZGVyID0gWyJjKysiLCAib2JqYyIsICJjIl0KKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsIGZvcmNlPTApOgorICAgICAgICBzZWxmLmRyeV9ydW4gPSBkcnlfcnVuCisgICAgICAgIHNlbGYuZm9yY2UgPSBmb3JjZQorICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCisKKyAgICAgICAgIyAnb3V0cHV0X2Rpcic6IGEgY29tbW9uIG91dHB1dCBkaXJlY3RvcnkgZm9yIG9iamVjdCwgbGlicmFyeSwKKyAgICAgICAgIyBzaGFyZWQgb2JqZWN0LCBhbmQgc2hhcmVkIGxpYnJhcnkgZmlsZXMKKyAgICAgICAgc2VsZi5vdXRwdXRfZGlyID0gTm9uZQorCisgICAgICAgICMgJ21hY3Jvcyc6IGEgbGlzdCBvZiBtYWNybyBkZWZpbml0aW9ucyAob3IgdW5kZWZpbml0aW9ucykuICBBCisgICAgICAgICMgbWFjcm8gZGVmaW5pdGlvbiBpcyBhIDItdHVwbGUgKG5hbWUsIHZhbHVlKSwgd2hlcmUgdGhlIHZhbHVlIGlzCisgICAgICAgICMgZWl0aGVyIGEgc3RyaW5nIG9yIE5vbmUgKG5vIGV4cGxpY2l0IHZhbHVlKS4gIEEgbWFjcm8KKyAgICAgICAgIyB1bmRlZmluaXRpb24gaXMgYSAxLXR1cGxlIChuYW1lLCkuCisgICAgICAgIHNlbGYubWFjcm9zID0gW10KKworICAgICAgICAjICdpbmNsdWRlX2RpcnMnOiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBpbmNsdWRlIGZpbGVzCisgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzID0gW10KKworICAgICAgICAjICdsaWJyYXJpZXMnOiBhIGxpc3Qgb2YgbGlicmFyaWVzIHRvIGluY2x1ZGUgaW4gYW55IGxpbmsKKyAgICAgICAgIyAobGlicmFyeSBuYW1lcywgbm90IGZpbGVuYW1lczogZWcuICJmb28iIG5vdCAibGliZm9vLmEiKQorICAgICAgICBzZWxmLmxpYnJhcmllcyA9IFtdCisKKyAgICAgICAgIyAnbGlicmFyeV9kaXJzJzogYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgbGlicmFyaWVzCisgICAgICAgIHNlbGYubGlicmFyeV9kaXJzID0gW10KKworICAgICAgICAjICdydW50aW1lX2xpYnJhcnlfZGlycyc6IGEgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yCisgICAgICAgICMgc2hhcmVkIGxpYnJhcmllcy9vYmplY3RzIGF0IHJ1bnRpbWUKKyAgICAgICAgc2VsZi5ydW50aW1lX2xpYnJhcnlfZGlycyA9IFtdCisKKyAgICAgICAgIyAnb2JqZWN0cyc6IGEgbGlzdCBvZiBvYmplY3QgZmlsZXMgKG9yIHNpbWlsYXIsIHN1Y2ggYXMgZXhwbGljaXRseQorICAgICAgICAjIG5hbWVkIGxpYnJhcnkgZmlsZXMpIHRvIGluY2x1ZGUgb24gYW55IGxpbmsKKyAgICAgICAgc2VsZi5vYmplY3RzID0gW10KKworICAgICAgICBmb3Iga2V5IGluIHNlbGYuZXhlY3V0YWJsZXMua2V5cygpOgorICAgICAgICAgICAgc2VsZi5zZXRfZXhlY3V0YWJsZShrZXksIHNlbGYuZXhlY3V0YWJsZXNba2V5XSkKKworICAgIGRlZiBzZXRfZXhlY3V0YWJsZXMoc2VsZiwgKiphcmdzKToKKyAgICAgICAgIiIiRGVmaW5lIHRoZSBleGVjdXRhYmxlcyAoYW5kIG9wdGlvbnMgZm9yIHRoZW0pIHRoYXQgd2lsbCBiZSBydW4KKyAgICAgICAgdG8gcGVyZm9ybSB0aGUgdmFyaW91cyBzdGFnZXMgb2YgY29tcGlsYXRpb24uICBUaGUgZXhhY3Qgc2V0IG9mCisgICAgICAgIGV4ZWN1dGFibGVzIHRoYXQgbWF5IGJlIHNwZWNpZmllZCBoZXJlIGRlcGVuZHMgb24gdGhlIGNvbXBpbGVyCisgICAgICAgIGNsYXNzICh2aWEgdGhlICdleGVjdXRhYmxlcycgY2xhc3MgYXR0cmlidXRlKSwgYnV0IG1vc3Qgd2lsbCBoYXZlOgorICAgICAgICAgIGNvbXBpbGVyICAgICAgdGhlIEMvQysrIGNvbXBpbGVyCisgICAgICAgICAgbGlua2VyX3NvICAgICBsaW5rZXIgdXNlZCB0byBjcmVhdGUgc2hhcmVkIG9iamVjdHMgYW5kIGxpYnJhcmllcworICAgICAgICAgIGxpbmtlcl9leGUgICAgbGlua2VyIHVzZWQgdG8gY3JlYXRlIGJpbmFyeSBleGVjdXRhYmxlcworICAgICAgICAgIGFyY2hpdmVyICAgICAgc3RhdGljIGxpYnJhcnkgY3JlYXRvcgorCisgICAgICAgIE9uIHBsYXRmb3JtcyB3aXRoIGEgY29tbWFuZC1saW5lIChVbml4LCBET1MvV2luZG93cyksIGVhY2ggb2YgdGhlc2UKKyAgICAgICAgaXMgYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHNwbGl0IGludG8gZXhlY3V0YWJsZSBuYW1lIGFuZCAob3B0aW9uYWwpCisgICAgICAgIGxpc3Qgb2YgYXJndW1lbnRzLiAgKFNwbGl0dGluZyB0aGUgc3RyaW5nIGlzIGRvbmUgc2ltaWxhcmx5IHRvIGhvdworICAgICAgICBVbml4IHNoZWxscyBvcGVyYXRlOiB3b3JkcyBhcmUgZGVsaW1pdGVkIGJ5IHNwYWNlcywgYnV0IHF1b3RlcyBhbmQKKyAgICAgICAgYmFja3NsYXNoZXMgY2FuIG92ZXJyaWRlIHRoaXMuICBTZWUKKyAgICAgICAgJ2Rpc3R1dGlscy51dGlsLnNwbGl0X3F1b3RlZCgpJy4pCisgICAgICAgICIiIgorCisgICAgICAgICMgTm90ZSB0aGF0IHNvbWUgQ0NvbXBpbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgd2lsbCBkZWZpbmUgY2xhc3MKKyAgICAgICAgIyBhdHRyaWJ1dGVzICdjcHAnLCAnY2MnLCBldGMuIHdpdGggaGFyZC1jb2RlZCBleGVjdXRhYmxlIG5hbWVzOworICAgICAgICAjIHRoaXMgaXMgYXBwcm9wcmlhdGUgd2hlbiBhIGNvbXBpbGVyIGNsYXNzIGlzIGZvciBleGFjdGx5IG9uZQorICAgICAgICAjIGNvbXBpbGVyL09TIGNvbWJpbmF0aW9uIChlZy4gTVNWQ0NvbXBpbGVyKS4gIE90aGVyIGNvbXBpbGVyCisgICAgICAgICMgY2xhc3NlcyAoVW5peENDb21waWxlciwgaW4gcGFydGljdWxhcikgYXJlIGRyaXZlbiBieSBpbmZvcm1hdGlvbgorICAgICAgICAjIGRpc2NvdmVyZWQgYXQgcnVuLXRpbWUsIHNpbmNlIHRoZXJlIGFyZSBtYW55IGRpZmZlcmVudCB3YXlzIHRvIGRvCisgICAgICAgICMgYmFzaWNhbGx5IHRoZSBzYW1lIHRoaW5ncyB3aXRoIFVuaXggQyBjb21waWxlcnMuCisKKyAgICAgICAgZm9yIGtleSBpbiBhcmdzLmtleXMoKToKKyAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZi5leGVjdXRhYmxlczoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gZXhlY3V0YWJsZSAnJXMnIGZvciBjbGFzcyAlcyIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgKGtleSwgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCisgICAgICAgICAgICBzZWxmLnNldF9leGVjdXRhYmxlKGtleSwgYXJnc1trZXldKQorCisgICAgZGVmIHNldF9leGVjdXRhYmxlKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHIpOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrZXksIHNwbGl0X3F1b3RlZCh2YWx1ZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleSwgdmFsdWUpCisKKyAgICBkZWYgX2ZpbmRfbWFjcm8oc2VsZiwgbmFtZSk6CisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBkZWZuIGluIHNlbGYubWFjcm9zOgorICAgICAgICAgICAgaWYgZGVmblswXSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBpCisgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfY2hlY2tfbWFjcm9fZGVmaW5pdGlvbnMoc2VsZiwgZGVmaW5pdGlvbnMpOgorICAgICAgICAiIiJFbnN1cmVzIHRoYXQgZXZlcnkgZWxlbWVudCBvZiAnZGVmaW5pdGlvbnMnIGlzIGEgdmFsaWQgbWFjcm8KKyAgICAgICAgZGVmaW5pdGlvbiwgaWUuIGVpdGhlciAobmFtZSx2YWx1ZSkgMi10dXBsZSBvciBhIChuYW1lLCkgdHVwbGUuICBEbworICAgICAgICBub3RoaW5nIGlmIGFsbCBkZWZpbml0aW9ucyBhcmUgT0ssIHJhaXNlIFR5cGVFcnJvciBvdGhlcndpc2UuCisgICAgICAgICIiIgorICAgICAgICBmb3IgZGVmbiBpbiBkZWZpbml0aW9uczoKKyAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZShkZWZuLCB0dXBsZSkgYW5kCisgICAgICAgICAgICAgICAgICAgIChsZW4gKGRlZm4pID09IDEgb3IKKyAgICAgICAgICAgICAgICAgICAgIChsZW4gKGRlZm4pID09IDIgYW5kCisgICAgICAgICAgICAgICAgICAgICAgKGlzaW5zdGFuY2UoZGVmblsxXSwgc3RyKSBvciBkZWZuWzFdIGlzIE5vbmUpKSkgYW5kCisgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoZGVmblswXSwgc3RyKSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKCJpbnZhbGlkIG1hY3JvIGRlZmluaXRpb24gJyVzJzogIiAlIGRlZm4pICsgXAorICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHR1cGxlIChzdHJpbmcsKSwgKHN0cmluZywgc3RyaW5nKSwgb3IgIiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAiKHN0cmluZywgTm9uZSkiCisKKworICAgICMgLS0gQm9va2tlZXBpbmcgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZGVmaW5lX21hY3JvKHNlbGYsIG5hbWUsIHZhbHVlPU5vbmUpOgorICAgICAgICAiIiJEZWZpbmUgYSBwcmVwcm9jZXNzb3IgbWFjcm8gZm9yIGFsbCBjb21waWxhdGlvbnMgZHJpdmVuIGJ5IHRoaXMKKyAgICAgICAgY29tcGlsZXIgb2JqZWN0LiAgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciAndmFsdWUnIHNob3VsZCBiZSBhCisgICAgICAgIHN0cmluZzsgaWYgaXQgaXMgbm90IHN1cHBsaWVkLCB0aGVuIHRoZSBtYWNybyB3aWxsIGJlIGRlZmluZWQKKyAgICAgICAgd2l0aG91dCBhbiBleHBsaWNpdCB2YWx1ZSBhbmQgdGhlIGV4YWN0IG91dGNvbWUgZGVwZW5kcyBvbiB0aGUKKyAgICAgICAgY29tcGlsZXIgdXNlZCAoWFhYIHRydWU/IGRvZXMgQU5TSSBzYXkgYW55dGhpbmcgYWJvdXQgdGhpcz8pCisgICAgICAgICIiIgorICAgICAgICAjIERlbGV0ZSBmcm9tIHRoZSBsaXN0IG9mIG1hY3JvIGRlZmluaXRpb25zL3VuZGVmaW5pdGlvbnMgaWYKKyAgICAgICAgIyBhbHJlYWR5IHRoZXJlIChzbyB0aGF0IHRoaXMgb25lIHdpbGwgdGFrZSBwcmVjZWRlbmNlKS4KKyAgICAgICAgaSA9IHNlbGYuX2ZpbmRfbWFjcm8gKG5hbWUpCisgICAgICAgIGlmIGkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkZWwgc2VsZi5tYWNyb3NbaV0KKworICAgICAgICBkZWZuID0gKG5hbWUsIHZhbHVlKQorICAgICAgICBzZWxmLm1hY3Jvcy5hcHBlbmQgKGRlZm4pCisKKyAgICBkZWYgdW5kZWZpbmVfbWFjcm8oc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlVuZGVmaW5lIGEgcHJlcHJvY2Vzc29yIG1hY3JvIGZvciBhbGwgY29tcGlsYXRpb25zIGRyaXZlbiBieQorICAgICAgICB0aGlzIGNvbXBpbGVyIG9iamVjdC4gIElmIHRoZSBzYW1lIG1hY3JvIGlzIGRlZmluZWQgYnkKKyAgICAgICAgJ2RlZmluZV9tYWNybygpJyBhbmQgdW5kZWZpbmVkIGJ5ICd1bmRlZmluZV9tYWNybygpJyB0aGUgbGFzdCBjYWxsCisgICAgICAgIHRha2VzIHByZWNlZGVuY2UgKGluY2x1ZGluZyBtdWx0aXBsZSByZWRlZmluaXRpb25zIG9yCisgICAgICAgIHVuZGVmaW5pdGlvbnMpLiAgSWYgdGhlIG1hY3JvIGlzIHJlZGVmaW5lZC91bmRlZmluZWQgb24gYQorICAgICAgICBwZXItY29tcGlsYXRpb24gYmFzaXMgKGllLiBpbiB0aGUgY2FsbCB0byAnY29tcGlsZSgpJyksIHRoZW4gdGhhdAorICAgICAgICB0YWtlcyBwcmVjZWRlbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgIyBEZWxldGUgZnJvbSB0aGUgbGlzdCBvZiBtYWNybyBkZWZpbml0aW9ucy91bmRlZmluaXRpb25zIGlmCisgICAgICAgICMgYWxyZWFkeSB0aGVyZSAoc28gdGhhdCB0aGlzIG9uZSB3aWxsIHRha2UgcHJlY2VkZW5jZSkuCisgICAgICAgIGkgPSBzZWxmLl9maW5kX21hY3JvIChuYW1lKQorICAgICAgICBpZiBpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGVsIHNlbGYubWFjcm9zW2ldCisKKyAgICAgICAgdW5kZWZuID0gKG5hbWUsKQorICAgICAgICBzZWxmLm1hY3Jvcy5hcHBlbmQgKHVuZGVmbikKKworICAgIGRlZiBhZGRfaW5jbHVkZV9kaXIoc2VsZiwgZGlyKToKKyAgICAgICAgIiIiQWRkICdkaXInIHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSBzZWFyY2hlZCBmb3IKKyAgICAgICAgaGVhZGVyIGZpbGVzLiAgVGhlIGNvbXBpbGVyIGlzIGluc3RydWN0ZWQgdG8gc2VhcmNoIGRpcmVjdG9yaWVzIGluCisgICAgICAgIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBzdXBwbGllZCBieSBzdWNjZXNzaXZlIGNhbGxzIHRvCisgICAgICAgICdhZGRfaW5jbHVkZV9kaXIoKScuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmluY2x1ZGVfZGlycy5hcHBlbmQgKGRpcikKKworICAgIGRlZiBzZXRfaW5jbHVkZV9kaXJzKHNlbGYsIGRpcnMpOgorICAgICAgICAiIiJTZXQgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIHRvICdkaXJzJyAoYQorICAgICAgICBsaXN0IG9mIHN0cmluZ3MpLiAgT3ZlcnJpZGVzIGFueSBwcmVjZWRpbmcgY2FsbHMgdG8KKyAgICAgICAgJ2FkZF9pbmNsdWRlX2RpcigpJzsgc3Vic2VxdWVuY2UgY2FsbHMgdG8gJ2FkZF9pbmNsdWRlX2RpcigpJyBhZGQKKyAgICAgICAgdG8gdGhlIGxpc3QgcGFzc2VkIHRvICdzZXRfaW5jbHVkZV9kaXJzKCknLiAgVGhpcyBkb2VzIG5vdCBhZmZlY3QKKyAgICAgICAgYW55IGxpc3Qgb2Ygc3RhbmRhcmQgaW5jbHVkZSBkaXJlY3RvcmllcyB0aGF0IHRoZSBjb21waWxlciBtYXkKKyAgICAgICAgc2VhcmNoIGJ5IGRlZmF1bHQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmluY2x1ZGVfZGlycyA9IGRpcnNbOl0KKworICAgIGRlZiBhZGRfbGlicmFyeShzZWxmLCBsaWJuYW1lKToKKyAgICAgICAgIiIiQWRkICdsaWJuYW1lJyB0byB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluCisgICAgICAgIGFsbCBsaW5rcyBkcml2ZW4gYnkgdGhpcyBjb21waWxlciBvYmplY3QuICBOb3RlIHRoYXQgJ2xpYm5hbWUnCisgICAgICAgIHNob3VsZCAqbm90KiBiZSB0aGUgbmFtZSBvZiBhIGZpbGUgY29udGFpbmluZyBhIGxpYnJhcnksIGJ1dCB0aGUKKyAgICAgICAgbmFtZSBvZiB0aGUgbGlicmFyeSBpdHNlbGY6IHRoZSBhY3R1YWwgZmlsZW5hbWUgd2lsbCBiZSBpbmZlcnJlZCBieQorICAgICAgICB0aGUgbGlua2VyLCB0aGUgY29tcGlsZXIsIG9yIHRoZSBjb21waWxlciBjbGFzcyAoZGVwZW5kaW5nIG9uIHRoZQorICAgICAgICBwbGF0Zm9ybSkuCisKKyAgICAgICAgVGhlIGxpbmtlciB3aWxsIGJlIGluc3RydWN0ZWQgdG8gbGluayBhZ2FpbnN0IGxpYnJhcmllcyBpbiB0aGUKKyAgICAgICAgb3JkZXIgdGhleSB3ZXJlIHN1cHBsaWVkIHRvICdhZGRfbGlicmFyeSgpJyBhbmQvb3IKKyAgICAgICAgJ3NldF9saWJyYXJpZXMoKScuICBJdCBpcyBwZXJmZWN0bHkgdmFsaWQgdG8gZHVwbGljYXRlIGxpYnJhcnkKKyAgICAgICAgbmFtZXM7IHRoZSBsaW5rZXIgd2lsbCBiZSBpbnN0cnVjdGVkIHRvIGxpbmsgYWdhaW5zdCBsaWJyYXJpZXMgYXMKKyAgICAgICAgbWFueSB0aW1lcyBhcyB0aGV5IGFyZSBtZW50aW9uZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmxpYnJhcmllcy5hcHBlbmQgKGxpYm5hbWUpCisKKyAgICBkZWYgc2V0X2xpYnJhcmllcyhzZWxmLCBsaWJuYW1lcyk6CisgICAgICAgICIiIlNldCB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgdG8gYmUgaW5jbHVkZWQgaW4gYWxsIGxpbmtzIGRyaXZlbiBieQorICAgICAgICB0aGlzIGNvbXBpbGVyIG9iamVjdCB0byAnbGlibmFtZXMnIChhIGxpc3Qgb2Ygc3RyaW5ncykuICBUaGlzIGRvZXMKKyAgICAgICAgbm90IGFmZmVjdCBhbnkgc3RhbmRhcmQgc3lzdGVtIGxpYnJhcmllcyB0aGF0IHRoZSBsaW5rZXIgbWF5CisgICAgICAgIGluY2x1ZGUgYnkgZGVmYXVsdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubGlicmFyaWVzID0gbGlibmFtZXNbOl0KKworCisgICAgZGVmIGFkZF9saWJyYXJ5X2RpcihzZWxmLCBkaXIpOgorICAgICAgICAiIiJBZGQgJ2RpcicgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIGZvcgorICAgICAgICBsaWJyYXJpZXMgc3BlY2lmaWVkIHRvICdhZGRfbGlicmFyeSgpJyBhbmQgJ3NldF9saWJyYXJpZXMoKScuICBUaGUKKyAgICAgICAgbGlua2VyIHdpbGwgYmUgaW5zdHJ1Y3RlZCB0byBzZWFyY2ggZm9yIGxpYnJhcmllcyBpbiB0aGUgb3JkZXIgdGhleQorICAgICAgICBhcmUgc3VwcGxpZWQgdG8gJ2FkZF9saWJyYXJ5X2RpcigpJyBhbmQvb3IgJ3NldF9saWJyYXJ5X2RpcnMoKScuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmxpYnJhcnlfZGlycy5hcHBlbmQoZGlyKQorCisgICAgZGVmIHNldF9saWJyYXJ5X2RpcnMoc2VsZiwgZGlycyk6CisgICAgICAgICIiIlNldCB0aGUgbGlzdCBvZiBsaWJyYXJ5IHNlYXJjaCBkaXJlY3RvcmllcyB0byAnZGlycycgKGEgbGlzdCBvZgorICAgICAgICBzdHJpbmdzKS4gIFRoaXMgZG9lcyBub3QgYWZmZWN0IGFueSBzdGFuZGFyZCBsaWJyYXJ5IHNlYXJjaCBwYXRoCisgICAgICAgIHRoYXQgdGhlIGxpbmtlciBtYXkgc2VhcmNoIGJ5IGRlZmF1bHQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmxpYnJhcnlfZGlycyA9IGRpcnNbOl0KKworICAgIGRlZiBhZGRfcnVudGltZV9saWJyYXJ5X2RpcihzZWxmLCBkaXIpOgorICAgICAgICAiIiJBZGQgJ2RpcicgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIGZvcgorICAgICAgICBzaGFyZWQgbGlicmFyaWVzIGF0IHJ1bnRpbWUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJ1bnRpbWVfbGlicmFyeV9kaXJzLmFwcGVuZChkaXIpCisKKyAgICBkZWYgc2V0X3J1bnRpbWVfbGlicmFyeV9kaXJzKHNlbGYsIGRpcnMpOgorICAgICAgICAiIiJTZXQgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBzaGFyZWQgbGlicmFyaWVzIGF0CisgICAgICAgIHJ1bnRpbWUgdG8gJ2RpcnMnIChhIGxpc3Qgb2Ygc3RyaW5ncykuICBUaGlzIGRvZXMgbm90IGFmZmVjdCBhbnkKKyAgICAgICAgc3RhbmRhcmQgc2VhcmNoIHBhdGggdGhhdCB0aGUgcnVudGltZSBsaW5rZXIgbWF5IHNlYXJjaCBieQorICAgICAgICBkZWZhdWx0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ydW50aW1lX2xpYnJhcnlfZGlycyA9IGRpcnNbOl0KKworICAgIGRlZiBhZGRfbGlua19vYmplY3Qoc2VsZiwgb2JqZWN0KToKKyAgICAgICAgIiIiQWRkICdvYmplY3QnIHRvIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyAob3IgYW5hbG9ndWVzLCBzdWNoIGFzCisgICAgICAgIGV4cGxpY2l0bHkgbmFtZWQgbGlicmFyeSBmaWxlcyBvciB0aGUgb3V0cHV0IG9mICJyZXNvdXJjZQorICAgICAgICBjb21waWxlcnMiKSB0byBiZSBpbmNsdWRlZCBpbiBldmVyeSBsaW5rIGRyaXZlbiBieSB0aGlzIGNvbXBpbGVyCisgICAgICAgIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYub2JqZWN0cy5hcHBlbmQob2JqZWN0KQorCisgICAgZGVmIHNldF9saW5rX29iamVjdHMoc2VsZiwgb2JqZWN0cyk6CisgICAgICAgICIiIlNldCB0aGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgKG9yIGFuYWxvZ3VlcykgdG8gYmUgaW5jbHVkZWQgaW4KKyAgICAgICAgZXZlcnkgbGluayB0byAnb2JqZWN0cycuICBUaGlzIGRvZXMgbm90IGFmZmVjdCBhbnkgc3RhbmRhcmQgb2JqZWN0CisgICAgICAgIGZpbGVzIHRoYXQgdGhlIGxpbmtlciBtYXkgaW5jbHVkZSBieSBkZWZhdWx0IChzdWNoIGFzIHN5c3RlbQorICAgICAgICBsaWJyYXJpZXMpLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5vYmplY3RzID0gb2JqZWN0c1s6XQorCisKKyAgICAjIC0tIFByaXZhdGUgdXRpbGl0eSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAoaGVyZSBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIHN1YmNsYXNzZXMpCisKKyAgICAjIEhlbHBlciBtZXRob2QgdG8gcHJlcCBjb21waWxlciBpbiBzdWJjbGFzcyBjb21waWxlKCkgbWV0aG9kcworCisgICAgZGVmIF9zZXR1cF9jb21waWxlKHNlbGYsIG91dGRpciwgbWFjcm9zLCBpbmNkaXJzLCBzb3VyY2VzLCBkZXBlbmRzLAorICAgICAgICAgICAgICAgICAgICAgICBleHRyYSk6CisgICAgICAgICIiIlByb2Nlc3MgYXJndW1lbnRzIGFuZCBkZWNpZGUgd2hpY2ggc291cmNlIGZpbGVzIHRvIGNvbXBpbGUuIiIiCisgICAgICAgIGlmIG91dGRpciBpcyBOb25lOgorICAgICAgICAgICAgb3V0ZGlyID0gc2VsZi5vdXRwdXRfZGlyCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob3V0ZGlyLCBzdHIpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiJ291dHB1dF9kaXInIG11c3QgYmUgYSBzdHJpbmcgb3IgTm9uZSIKKworICAgICAgICBpZiBtYWNyb3MgaXMgTm9uZToKKyAgICAgICAgICAgIG1hY3JvcyA9IHNlbGYubWFjcm9zCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtYWNyb3MsIGxpc3QpOgorICAgICAgICAgICAgbWFjcm9zID0gbWFjcm9zICsgKHNlbGYubWFjcm9zIG9yIFtdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiJ21hY3JvcycgKGlmIHN1cHBsaWVkKSBtdXN0IGJlIGEgbGlzdCBvZiB0dXBsZXMiCisKKyAgICAgICAgaWYgaW5jZGlycyBpcyBOb25lOgorICAgICAgICAgICAgaW5jZGlycyA9IHNlbGYuaW5jbHVkZV9kaXJzCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpbmNkaXJzLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgIGluY2RpcnMgPSBsaXN0KGluY2RpcnMpICsgKHNlbGYuaW5jbHVkZV9kaXJzIG9yIFtdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiJ2luY2x1ZGVfZGlycycgKGlmIHN1cHBsaWVkKSBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzIgorCisgICAgICAgIGlmIGV4dHJhIGlzIE5vbmU6CisgICAgICAgICAgICBleHRyYSA9IFtdCisKKyAgICAgICAgIyBHZXQgdGhlIGxpc3Qgb2YgZXhwZWN0ZWQgb3V0cHV0IChvYmplY3QpIGZpbGVzCisgICAgICAgIG9iamVjdHMgPSBzZWxmLm9iamVjdF9maWxlbmFtZXMoc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcF9kaXI9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPW91dGRpcikKKyAgICAgICAgYXNzZXJ0IGxlbihvYmplY3RzKSA9PSBsZW4oc291cmNlcykKKworICAgICAgICBwcF9vcHRzID0gZ2VuX3ByZXByb2Nlc3Nfb3B0aW9ucyhtYWNyb3MsIGluY2RpcnMpCisKKyAgICAgICAgYnVpbGQgPSB7fQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc291cmNlcykpOgorICAgICAgICAgICAgc3JjID0gc291cmNlc1tpXQorICAgICAgICAgICAgb2JqID0gb2JqZWN0c1tpXQorICAgICAgICAgICAgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzcmMpWzFdCisgICAgICAgICAgICBzZWxmLm1rcGF0aChvcy5wYXRoLmRpcm5hbWUob2JqKSkKKyAgICAgICAgICAgIGJ1aWxkW29ial0gPSAoc3JjLCBleHQpCisKKyAgICAgICAgcmV0dXJuIG1hY3Jvcywgb2JqZWN0cywgZXh0cmEsIHBwX29wdHMsIGJ1aWxkCisKKyAgICBkZWYgX2dldF9jY19hcmdzKHNlbGYsIHBwX29wdHMsIGRlYnVnLCBiZWZvcmUpOgorICAgICAgICAjIHdvcmtzIGZvciB1bml4Y2NvbXBpbGVyLCBlbXhjY29tcGlsZXIsIGN5Z3dpbmNjb21waWxlcgorICAgICAgICBjY19hcmdzID0gcHBfb3B0cyArIFsnLWMnXQorICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgIGNjX2FyZ3NbOjBdID0gWyctZyddCisgICAgICAgIGlmIGJlZm9yZToKKyAgICAgICAgICAgIGNjX2FyZ3NbOjBdID0gYmVmb3JlCisgICAgICAgIHJldHVybiBjY19hcmdzCisKKyAgICBkZWYgX2ZpeF9jb21waWxlX2FyZ3Moc2VsZiwgb3V0cHV0X2RpciwgbWFjcm9zLCBpbmNsdWRlX2RpcnMpOgorICAgICAgICAiIiJUeXBlY2hlY2sgYW5kIGZpeC11cCBzb21lIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlICdjb21waWxlKCknCisgICAgICAgIG1ldGhvZCwgYW5kIHJldHVybiBmaXhlZC11cCB2YWx1ZXMuICBTcGVjaWZpY2FsbHk6IGlmICdvdXRwdXRfZGlyJworICAgICAgICBpcyBOb25lLCByZXBsYWNlcyBpdCB3aXRoICdzZWxmLm91dHB1dF9kaXInOyBlbnN1cmVzIHRoYXQgJ21hY3JvcycKKyAgICAgICAgaXMgYSBsaXN0LCBhbmQgYXVnbWVudHMgaXQgd2l0aCAnc2VsZi5tYWNyb3MnOyBlbnN1cmVzIHRoYXQKKyAgICAgICAgJ2luY2x1ZGVfZGlycycgaXMgYSBsaXN0LCBhbmQgYXVnbWVudHMgaXQgd2l0aCAnc2VsZi5pbmNsdWRlX2RpcnMnLgorICAgICAgICBHdWFyYW50ZWVzIHRoYXQgdGhlIHJldHVybmVkIHZhbHVlcyBhcmUgb2YgdGhlIGNvcnJlY3QgdHlwZSwKKyAgICAgICAgaS5lLiBmb3IgJ291dHB1dF9kaXInIGVpdGhlciBzdHJpbmcgb3IgTm9uZSwgYW5kIGZvciAnbWFjcm9zJyBhbmQKKyAgICAgICAgJ2luY2x1ZGVfZGlycycgZWl0aGVyIGxpc3Qgb3IgTm9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG91dHB1dF9kaXIgaXMgTm9uZToKKyAgICAgICAgICAgIG91dHB1dF9kaXIgPSBzZWxmLm91dHB1dF9kaXIKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdXRwdXRfZGlyLCBzdHIpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiJ291dHB1dF9kaXInIG11c3QgYmUgYSBzdHJpbmcgb3IgTm9uZSIKKworICAgICAgICBpZiBtYWNyb3MgaXMgTm9uZToKKyAgICAgICAgICAgIG1hY3JvcyA9IHNlbGYubWFjcm9zCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtYWNyb3MsIGxpc3QpOgorICAgICAgICAgICAgbWFjcm9zID0gbWFjcm9zICsgKHNlbGYubWFjcm9zIG9yIFtdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiJ21hY3JvcycgKGlmIHN1cHBsaWVkKSBtdXN0IGJlIGEgbGlzdCBvZiB0dXBsZXMiCisKKyAgICAgICAgaWYgaW5jbHVkZV9kaXJzIGlzIE5vbmU6CisgICAgICAgICAgICBpbmNsdWRlX2RpcnMgPSBzZWxmLmluY2x1ZGVfZGlycworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaW5jbHVkZV9kaXJzLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgIGluY2x1ZGVfZGlycyA9IGxpc3QgKGluY2x1ZGVfZGlycykgKyAoc2VsZi5pbmNsdWRlX2RpcnMgb3IgW10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICInaW5jbHVkZV9kaXJzJyAoaWYgc3VwcGxpZWQpIG11c3QgYmUgYSBsaXN0IG9mIHN0cmluZ3MiCisKKyAgICAgICAgcmV0dXJuIG91dHB1dF9kaXIsIG1hY3JvcywgaW5jbHVkZV9kaXJzCisKKyAgICBkZWYgX2ZpeF9vYmplY3RfYXJncyhzZWxmLCBvYmplY3RzLCBvdXRwdXRfZGlyKToKKyAgICAgICAgIiIiVHlwZWNoZWNrIGFuZCBmaXggdXAgc29tZSBhcmd1bWVudHMgc3VwcGxpZWQgdG8gdmFyaW91cyBtZXRob2RzLgorICAgICAgICBTcGVjaWZpY2FsbHk6IGVuc3VyZSB0aGF0ICdvYmplY3RzJyBpcyBhIGxpc3Q7IGlmIG91dHB1dF9kaXIgaXMKKyAgICAgICAgTm9uZSwgcmVwbGFjZSB3aXRoIHNlbGYub3V0cHV0X2Rpci4gIFJldHVybiBmaXhlZCB2ZXJzaW9ucyBvZgorICAgICAgICAnb2JqZWN0cycgYW5kICdvdXRwdXRfZGlyJy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG9iamVjdHMsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiJ29iamVjdHMnIG11c3QgYmUgYSBsaXN0IG9yIHR1cGxlIG9mIHN0cmluZ3MiCisgICAgICAgIG9iamVjdHMgPSBsaXN0IChvYmplY3RzKQorCisgICAgICAgIGlmIG91dHB1dF9kaXIgaXMgTm9uZToKKyAgICAgICAgICAgIG91dHB1dF9kaXIgPSBzZWxmLm91dHB1dF9kaXIKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdXRwdXRfZGlyLCBzdHIpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiJ291dHB1dF9kaXInIG11c3QgYmUgYSBzdHJpbmcgb3IgTm9uZSIKKworICAgICAgICByZXR1cm4gKG9iamVjdHMsIG91dHB1dF9kaXIpCisKKyAgICBkZWYgX2ZpeF9saWJfYXJncyhzZWxmLCBsaWJyYXJpZXMsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMpOgorICAgICAgICAiIiJUeXBlY2hlY2sgYW5kIGZpeCB1cCBzb21lIG9mIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQgdG8gdGhlCisgICAgICAgICdsaW5rXyonIG1ldGhvZHMuICBTcGVjaWZpY2FsbHk6IGVuc3VyZSB0aGF0IGFsbCBhcmd1bWVudHMgYXJlCisgICAgICAgIGxpc3RzLCBhbmQgYXVnbWVudCB0aGVtIHdpdGggdGhlaXIgcGVybWFuZW50IHZlcnNpb25zCisgICAgICAgIChlZy4gJ3NlbGYubGlicmFyaWVzJyBhdWdtZW50cyAnbGlicmFyaWVzJykuICBSZXR1cm4gYSB0dXBsZSB3aXRoCisgICAgICAgIGZpeGVkIHZlcnNpb25zIG9mIGFsbCBhcmd1bWVudHMuCisgICAgICAgICIiIgorICAgICAgICBpZiBsaWJyYXJpZXMgaXMgTm9uZToKKyAgICAgICAgICAgIGxpYnJhcmllcyA9IHNlbGYubGlicmFyaWVzCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShsaWJyYXJpZXMsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgbGlicmFyaWVzID0gbGlzdCAobGlicmFyaWVzKSArIChzZWxmLmxpYnJhcmllcyBvciBbXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgIidsaWJyYXJpZXMnIChpZiBzdXBwbGllZCkgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyIKKworICAgICAgICBpZiBsaWJyYXJ5X2RpcnMgaXMgTm9uZToKKyAgICAgICAgICAgIGxpYnJhcnlfZGlycyA9IHNlbGYubGlicmFyeV9kaXJzCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShsaWJyYXJ5X2RpcnMsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgbGlicmFyeV9kaXJzID0gbGlzdCAobGlicmFyeV9kaXJzKSArIChzZWxmLmxpYnJhcnlfZGlycyBvciBbXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgIidsaWJyYXJ5X2RpcnMnIChpZiBzdXBwbGllZCkgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyIKKworICAgICAgICBpZiBydW50aW1lX2xpYnJhcnlfZGlycyBpcyBOb25lOgorICAgICAgICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnMgPSBzZWxmLnJ1bnRpbWVfbGlicmFyeV9kaXJzCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShydW50aW1lX2xpYnJhcnlfZGlycywgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICBydW50aW1lX2xpYnJhcnlfZGlycyA9IChsaXN0IChydW50aW1lX2xpYnJhcnlfZGlycykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYucnVudGltZV9saWJyYXJ5X2RpcnMgb3IgW10pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiJ3J1bnRpbWVfbGlicmFyeV9kaXJzJyAoaWYgc3VwcGxpZWQpICIgKyBcCisgICAgICAgICAgICAgICAgICAibXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyIKKworICAgICAgICByZXR1cm4gKGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycykKKworICAgIGRlZiBfbmVlZF9saW5rKHNlbGYsIG9iamVjdHMsIG91dHB1dF9maWxlKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgd2UgbmVlZCB0byByZWxpbmsgdGhlIGZpbGVzIGxpc3RlZCBpbiAnb2JqZWN0cycKKyAgICAgICAgdG8gcmVjcmVhdGUgJ291dHB1dF9maWxlJy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZm9yY2U6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgIG5ld2VyID0gbmV3ZXJfZ3JvdXAgKG9iamVjdHMsIG91dHB1dF9maWxlLCBtaXNzaW5nPSduZXdlcicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld2VyID0gbmV3ZXJfZ3JvdXAgKG9iamVjdHMsIG91dHB1dF9maWxlKQorICAgICAgICAgICAgcmV0dXJuIG5ld2VyCisKKyAgICBkZWYgZGV0ZWN0X2xhbmd1YWdlKHNlbGYsIHNvdXJjZXMpOgorICAgICAgICAiIiJEZXRlY3QgdGhlIGxhbmd1YWdlIG9mIGEgZ2l2ZW4gZmlsZSwgb3IgbGlzdCBvZiBmaWxlcy4gVXNlcworICAgICAgICBsYW5ndWFnZV9tYXAsIGFuZCBsYW5ndWFnZV9vcmRlciB0byBkbyB0aGUgam9iLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc291cmNlcywgbGlzdCk6CisgICAgICAgICAgICBzb3VyY2VzID0gW3NvdXJjZXNdCisgICAgICAgIGxhbmcgPSBOb25lCisgICAgICAgIGluZGV4ID0gbGVuKHNlbGYubGFuZ3VhZ2Vfb3JkZXIpCisgICAgICAgIGZvciBzb3VyY2UgaW4gc291cmNlczoKKyAgICAgICAgICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc291cmNlKQorICAgICAgICAgICAgZXh0bGFuZyA9IHNlbGYubGFuZ3VhZ2VfbWFwLmdldChleHQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXh0aW5kZXggPSBzZWxmLmxhbmd1YWdlX29yZGVyLmluZGV4KGV4dGxhbmcpCisgICAgICAgICAgICAgICAgaWYgZXh0aW5kZXggPCBpbmRleDoKKyAgICAgICAgICAgICAgICAgICAgbGFuZyA9IGV4dGxhbmcKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBleHRpbmRleAorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gbGFuZworCisgICAgIyAtLSBXb3JrZXIgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIChtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMpCisKKyAgICBkZWYgcHJlcHJvY2VzcyhzZWxmLCBzb3VyY2UsIG91dHB1dF9maWxlPU5vbmUsIG1hY3Jvcz1Ob25lLAorICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1Ob25lLCBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUpOgorICAgICAgICAiIiJQcmVwcm9jZXNzIGEgc2luZ2xlIEMvQysrIHNvdXJjZSBmaWxlLCBuYW1lZCBpbiAnc291cmNlJy4KKyAgICAgICAgT3V0cHV0IHdpbGwgYmUgd3JpdHRlbiB0byBmaWxlIG5hbWVkICdvdXRwdXRfZmlsZScsIG9yIHN0ZG91dCBpZgorICAgICAgICAnb3V0cHV0X2ZpbGUnIG5vdCBzdXBwbGllZC4gICdtYWNyb3MnIGlzIGEgbGlzdCBvZiBtYWNybworICAgICAgICBkZWZpbml0aW9ucyBhcyBmb3IgJ2NvbXBpbGUoKScsIHdoaWNoIHdpbGwgYXVnbWVudCB0aGUgbWFjcm9zIHNldAorICAgICAgICB3aXRoICdkZWZpbmVfbWFjcm8oKScgYW5kICd1bmRlZmluZV9tYWNybygpJy4gICdpbmNsdWRlX2RpcnMnIGlzIGEKKyAgICAgICAgbGlzdCBvZiBkaXJlY3RvcnkgbmFtZXMgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBkZWZhdWx0IGxpc3QuCisKKyAgICAgICAgUmFpc2VzIFByZXByb2Nlc3NFcnJvciBvbiBmYWlsdXJlLgorICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIGNvbXBpbGUoc2VsZiwgc291cmNlcywgb3V0cHV0X2Rpcj1Ob25lLCBtYWNyb3M9Tm9uZSwKKyAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9Tm9uZSwgZGVidWc9MCwgZXh0cmFfcHJlYXJncz1Ob25lLAorICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGRlcGVuZHM9Tm9uZSk6CisgICAgICAgICIiIkNvbXBpbGUgb25lIG9yIG1vcmUgc291cmNlIGZpbGVzLgorCisgICAgICAgICdzb3VyY2VzJyBtdXN0IGJlIGEgbGlzdCBvZiBmaWxlbmFtZXMsIG1vc3QgbGlrZWx5IEMvQysrCisgICAgICAgIGZpbGVzLCBidXQgaW4gcmVhbGl0eSBhbnl0aGluZyB0aGF0IGNhbiBiZSBoYW5kbGVkIGJ5IGEKKyAgICAgICAgcGFydGljdWxhciBjb21waWxlciBhbmQgY29tcGlsZXIgY2xhc3MgKGVnLiBNU1ZDQ29tcGlsZXIgY2FuCisgICAgICAgIGhhbmRsZSByZXNvdXJjZSBmaWxlcyBpbiAnc291cmNlcycpLiAgUmV0dXJuIGEgbGlzdCBvZiBvYmplY3QKKyAgICAgICAgZmlsZW5hbWVzLCBvbmUgcGVyIHNvdXJjZSBmaWxlbmFtZSBpbiAnc291cmNlcycuICBEZXBlbmRpbmcgb24KKyAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uLCBub3QgYWxsIHNvdXJjZSBmaWxlcyB3aWxsIG5lY2Vzc2FyaWx5IGJlCisgICAgICAgIGNvbXBpbGVkLCBidXQgYWxsIGNvcnJlc3BvbmRpbmcgb2JqZWN0IGZpbGVuYW1lcyB3aWxsIGJlCisgICAgICAgIHJldHVybmVkLgorCisgICAgICAgIElmICdvdXRwdXRfZGlyJyBpcyBnaXZlbiwgb2JqZWN0IGZpbGVzIHdpbGwgYmUgcHV0IHVuZGVyIGl0LCB3aGlsZQorICAgICAgICByZXRhaW5pbmcgdGhlaXIgb3JpZ2luYWwgcGF0aCBjb21wb25lbnQuICBUaGF0IGlzLCAiZm9vL2Jhci5jIgorICAgICAgICBub3JtYWxseSBjb21waWxlcyB0byAiZm9vL2Jhci5vIiAoZm9yIGEgVW5peCBpbXBsZW1lbnRhdGlvbik7IGlmCisgICAgICAgICdvdXRwdXRfZGlyJyBpcyAiYnVpbGQiLCB0aGVuIGl0IHdvdWxkIGNvbXBpbGUgdG8KKyAgICAgICAgImJ1aWxkL2Zvby9iYXIubyIuCisKKyAgICAgICAgJ21hY3JvcycsIGlmIGdpdmVuLCBtdXN0IGJlIGEgbGlzdCBvZiBtYWNybyBkZWZpbml0aW9ucy4gIEEgbWFjcm8KKyAgICAgICAgZGVmaW5pdGlvbiBpcyBlaXRoZXIgYSAobmFtZSwgdmFsdWUpIDItdHVwbGUgb3IgYSAobmFtZSwpIDEtdHVwbGUuCisgICAgICAgIFRoZSBmb3JtZXIgZGVmaW5lcyBhIG1hY3JvOyBpZiB0aGUgdmFsdWUgaXMgTm9uZSwgdGhlIG1hY3JvIGlzCisgICAgICAgIGRlZmluZWQgd2l0aG91dCBhbiBleHBsaWNpdCB2YWx1ZS4gIFRoZSAxLXR1cGxlIGNhc2UgdW5kZWZpbmVzIGEKKyAgICAgICAgbWFjcm8uICBMYXRlciBkZWZpbml0aW9ucy9yZWRlZmluaXRpb25zLyB1bmRlZmluaXRpb25zIHRha2UKKyAgICAgICAgcHJlY2VkZW5jZS4KKworICAgICAgICAnaW5jbHVkZV9kaXJzJywgaWYgZ2l2ZW4sIG11c3QgYmUgYSBsaXN0IG9mIHN0cmluZ3MsIHRoZQorICAgICAgICBkaXJlY3RvcmllcyB0byBhZGQgdG8gdGhlIGRlZmF1bHQgaW5jbHVkZSBmaWxlIHNlYXJjaCBwYXRoIGZvciB0aGlzCisgICAgICAgIGNvbXBpbGF0aW9uIG9ubHkuCisKKyAgICAgICAgJ2RlYnVnJyBpcyBhIGJvb2xlYW47IGlmIHRydWUsIHRoZSBjb21waWxlciB3aWxsIGJlIGluc3RydWN0ZWQgdG8KKyAgICAgICAgb3V0cHV0IGRlYnVnIHN5bWJvbHMgaW4gKG9yIGFsb25nc2lkZSkgdGhlIG9iamVjdCBmaWxlKHMpLgorCisgICAgICAgICdleHRyYV9wcmVhcmdzJyBhbmQgJ2V4dHJhX3Bvc3RhcmdzJyBhcmUgaW1wbGVtZW50YXRpb24tIGRlcGVuZGVudC4KKyAgICAgICAgT24gcGxhdGZvcm1zIHRoYXQgaGF2ZSB0aGUgbm90aW9uIG9mIGEgY29tbWFuZC1saW5lIChlLmcuIFVuaXgsCisgICAgICAgIERPUy9XaW5kb3dzKSwgdGhleSBhcmUgbW9zdCBsaWtlbHkgbGlzdHMgb2Ygc3RyaW5nczogZXh0cmEKKyAgICAgICAgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0byBwcmVwYW5kL2FwcGVuZCB0byB0aGUgY29tcGlsZXIgY29tbWFuZAorICAgICAgICBsaW5lLiAgT24gb3RoZXIgcGxhdGZvcm1zLCBjb25zdWx0IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcworICAgICAgICBkb2N1bWVudGF0aW9uLiAgSW4gYW55IGV2ZW50LCB0aGV5IGFyZSBpbnRlbmRlZCBhcyBhbiBlc2NhcGUgaGF0Y2gKKyAgICAgICAgZm9yIHRob3NlIG9jY2FzaW9ucyB3aGVuIHRoZSBhYnN0cmFjdCBjb21waWxlciBmcmFtZXdvcmsgZG9lc24ndAorICAgICAgICBjdXQgdGhlIG11c3RhcmQuCisKKyAgICAgICAgJ2RlcGVuZHMnLCBpZiBnaXZlbiwgaXMgYSBsaXN0IG9mIGZpbGVuYW1lcyB0aGF0IGFsbCB0YXJnZXRzCisgICAgICAgIGRlcGVuZCBvbi4gIElmIGEgc291cmNlIGZpbGUgaXMgb2xkZXIgdGhhbiBhbnkgZmlsZSBpbgorICAgICAgICBkZXBlbmRzLCB0aGVuIHRoZSBzb3VyY2UgZmlsZSB3aWxsIGJlIHJlY29tcGlsZWQuICBUaGlzCisgICAgICAgIHN1cHBvcnRzIGRlcGVuZGVuY3kgdHJhY2tpbmcsIGJ1dCBvbmx5IGF0IGEgY29hcnNlCisgICAgICAgIGdyYW51bGFyaXR5LgorCisgICAgICAgIFJhaXNlcyBDb21waWxlRXJyb3Igb24gZmFpbHVyZS4KKyAgICAgICAgIiIiCisgICAgICAgICMgQSBjb25jcmV0ZSBjb21waWxlciBjbGFzcyBjYW4gZWl0aGVyIG92ZXJyaWRlIHRoaXMgbWV0aG9kCisgICAgICAgICMgZW50aXJlbHkgb3IgaW1wbGVtZW50IF9jb21waWxlKCkuCisKKyAgICAgICAgbWFjcm9zLCBvYmplY3RzLCBleHRyYV9wb3N0YXJncywgcHBfb3B0cywgYnVpbGQgPSBcCisgICAgICAgICAgICAgICAgc2VsZi5fc2V0dXBfY29tcGlsZShvdXRwdXRfZGlyLCBtYWNyb3MsIGluY2x1ZGVfZGlycywgc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMsIGV4dHJhX3Bvc3RhcmdzKQorICAgICAgICBjY19hcmdzID0gc2VsZi5fZ2V0X2NjX2FyZ3MocHBfb3B0cywgZGVidWcsIGV4dHJhX3ByZWFyZ3MpCisKKyAgICAgICAgZm9yIG9iaiBpbiBvYmplY3RzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNyYywgZXh0ID0gYnVpbGRbb2JqXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLl9jb21waWxlKG9iaiwgc3JjLCBleHQsIGNjX2FyZ3MsIGV4dHJhX3Bvc3RhcmdzLCBwcF9vcHRzKQorCisgICAgICAgICMgUmV0dXJuICphbGwqIG9iamVjdCBmaWxlbmFtZXMsIG5vdCBqdXN0IHRoZSBvbmVzIHdlIGp1c3QgYnVpbHQuCisgICAgICAgIHJldHVybiBvYmplY3RzCisKKyAgICBkZWYgX2NvbXBpbGUoc2VsZiwgb2JqLCBzcmMsIGV4dCwgY2NfYXJncywgZXh0cmFfcG9zdGFyZ3MsIHBwX29wdHMpOgorICAgICAgICAiIiJDb21waWxlICdzcmMnIHRvIHByb2R1Y3QgJ29iaicuIiIiCisKKyAgICAgICAgIyBBIGNvbmNyZXRlIGNvbXBpbGVyIGNsYXNzIHRoYXQgZG9lcyBub3Qgb3ZlcnJpZGUgY29tcGlsZSgpCisgICAgICAgICMgc2hvdWxkIGltcGxlbWVudCBfY29tcGlsZSgpLgorICAgICAgICBwYXNzCisKKyAgICBkZWYgY3JlYXRlX3N0YXRpY19saWIoc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc9MCwgdGFyZ2V0X2xhbmc9Tm9uZSk6CisgICAgICAgICIiIkxpbmsgYSBidW5jaCBvZiBzdHVmZiB0b2dldGhlciB0byBjcmVhdGUgYSBzdGF0aWMgbGlicmFyeSBmaWxlLgorICAgICAgICBUaGUgImJ1bmNoIG9mIHN0dWZmIiBjb25zaXN0cyBvZiB0aGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgc3VwcGxpZWQKKyAgICAgICAgYXMgJ29iamVjdHMnLCB0aGUgZXh0cmEgb2JqZWN0IGZpbGVzIHN1cHBsaWVkIHRvCisgICAgICAgICdhZGRfbGlua19vYmplY3QoKScgYW5kL29yICdzZXRfbGlua19vYmplY3RzKCknLCB0aGUgbGlicmFyaWVzCisgICAgICAgIHN1cHBsaWVkIHRvICdhZGRfbGlicmFyeSgpJyBhbmQvb3IgJ3NldF9saWJyYXJpZXMoKScsIGFuZCB0aGUKKyAgICAgICAgbGlicmFyaWVzIHN1cHBsaWVkIGFzICdsaWJyYXJpZXMnIChpZiBhbnkpLgorCisgICAgICAgICdvdXRwdXRfbGlibmFtZScgc2hvdWxkIGJlIGEgbGlicmFyeSBuYW1lLCBub3QgYSBmaWxlbmFtZTsgdGhlCisgICAgICAgIGZpbGVuYW1lIHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgbGlicmFyeSBuYW1lLiAgJ291dHB1dF9kaXInIGlzCisgICAgICAgIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGxpYnJhcnkgZmlsZSB3aWxsIGJlIHB1dC4KKworICAgICAgICAnZGVidWcnIGlzIGEgYm9vbGVhbjsgaWYgdHJ1ZSwgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdpbGwgYmUKKyAgICAgICAgaW5jbHVkZWQgaW4gdGhlIGxpYnJhcnkgKG5vdGUgdGhhdCBvbiBtb3N0IHBsYXRmb3JtcywgaXQgaXMgdGhlCisgICAgICAgIGNvbXBpbGUgc3RlcCB3aGVyZSB0aGlzIG1hdHRlcnM6IHRoZSAnZGVidWcnIGZsYWcgaXMgaW5jbHVkZWQgaGVyZQorICAgICAgICBqdXN0IGZvciBjb25zaXN0ZW5jeSkuCisKKyAgICAgICAgJ3RhcmdldF9sYW5nJyBpcyB0aGUgdGFyZ2V0IGxhbmd1YWdlIGZvciB3aGljaCB0aGUgZ2l2ZW4gb2JqZWN0cworICAgICAgICBhcmUgYmVpbmcgY29tcGlsZWQuIFRoaXMgYWxsb3dzIHNwZWNpZmljIGxpbmthZ2UgdGltZSB0cmVhdG1lbnQgb2YKKyAgICAgICAgY2VydGFpbiBsYW5ndWFnZXMuCisKKyAgICAgICAgUmFpc2VzIExpYkVycm9yIG9uIGZhaWx1cmUuCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKyAgICAjIHZhbHVlcyBmb3IgdGFyZ2V0X2Rlc2MgcGFyYW1ldGVyIGluIGxpbmsoKQorICAgIFNIQVJFRF9PQkpFQ1QgPSAic2hhcmVkX29iamVjdCIKKyAgICBTSEFSRURfTElCUkFSWSA9ICJzaGFyZWRfbGlicmFyeSIKKyAgICBFWEVDVVRBQkxFID0gImV4ZWN1dGFibGUiCisKKyAgICBkZWYgbGluayhzZWxmLCB0YXJnZXRfZGVzYywgb2JqZWN0cywgb3V0cHV0X2ZpbGVuYW1lLCBvdXRwdXRfZGlyPU5vbmUsCisgICAgICAgICAgICAgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICAgICAgIGV4cG9ydF9zeW1ib2xzPU5vbmUsIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICBleHRyYV9wb3N0YXJncz1Ob25lLCBidWlsZF90ZW1wPU5vbmUsIHRhcmdldF9sYW5nPU5vbmUpOgorICAgICAgICAiIiJMaW5rIGEgYnVuY2ggb2Ygc3R1ZmYgdG9nZXRoZXIgdG8gY3JlYXRlIGFuIGV4ZWN1dGFibGUgb3IKKyAgICAgICAgc2hhcmVkIGxpYnJhcnkgZmlsZS4KKworICAgICAgICBUaGUgImJ1bmNoIG9mIHN0dWZmIiBjb25zaXN0cyBvZiB0aGUgbGlzdCBvZiBvYmplY3QgZmlsZXMgc3VwcGxpZWQKKyAgICAgICAgYXMgJ29iamVjdHMnLiAgJ291dHB1dF9maWxlbmFtZScgc2hvdWxkIGJlIGEgZmlsZW5hbWUuICBJZgorICAgICAgICAnb3V0cHV0X2RpcicgaXMgc3VwcGxpZWQsICdvdXRwdXRfZmlsZW5hbWUnIGlzIHJlbGF0aXZlIHRvIGl0CisgICAgICAgIChpLmUuICdvdXRwdXRfZmlsZW5hbWUnIGNhbiBwcm92aWRlIGRpcmVjdG9yeSBjb21wb25lbnRzIGlmCisgICAgICAgIG5lZWRlZCkuCisKKyAgICAgICAgJ2xpYnJhcmllcycgaXMgYSBsaXN0IG9mIGxpYnJhcmllcyB0byBsaW5rIGFnYWluc3QuICBUaGVzZSBhcmUKKyAgICAgICAgbGlicmFyeSBuYW1lcywgbm90IGZpbGVuYW1lcywgc2luY2UgdGhleSdyZSB0cmFuc2xhdGVkIGludG8KKyAgICAgICAgZmlsZW5hbWVzIGluIGEgcGxhdGZvcm0tc3BlY2lmaWMgd2F5IChlZy4gImZvbyIgYmVjb21lcyAibGliZm9vLmEiCisgICAgICAgIG9uIFVuaXggYW5kICJmb28ubGliIiBvbiBET1MvV2luZG93cykuICBIb3dldmVyLCB0aGV5IGNhbiBpbmNsdWRlIGEKKyAgICAgICAgZGlyZWN0b3J5IGNvbXBvbmVudCwgd2hpY2ggbWVhbnMgdGhlIGxpbmtlciB3aWxsIGxvb2sgaW4gdGhhdAorICAgICAgICBzcGVjaWZpYyBkaXJlY3RvcnkgcmF0aGVyIHRoYW4gc2VhcmNoaW5nIGFsbCB0aGUgbm9ybWFsIGxvY2F0aW9ucy4KKworICAgICAgICAnbGlicmFyeV9kaXJzJywgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8KKyAgICAgICAgc2VhcmNoIGZvciBsaWJyYXJpZXMgdGhhdCB3ZXJlIHNwZWNpZmllZCBhcyBiYXJlIGxpYnJhcnkgbmFtZXMKKyAgICAgICAgKGllLiBubyBkaXJlY3RvcnkgY29tcG9uZW50KS4gIFRoZXNlIGFyZSBvbiB0b3Agb2YgdGhlIHN5c3RlbQorICAgICAgICBkZWZhdWx0IGFuZCB0aG9zZSBzdXBwbGllZCB0byAnYWRkX2xpYnJhcnlfZGlyKCknIGFuZC9vcgorICAgICAgICAnc2V0X2xpYnJhcnlfZGlycygpJy4gICdydW50aW1lX2xpYnJhcnlfZGlycycgaXMgYSBsaXN0IG9mCisgICAgICAgIGRpcmVjdG9yaWVzIHRoYXQgd2lsbCBiZSBlbWJlZGRlZCBpbnRvIHRoZSBzaGFyZWQgbGlicmFyeSBhbmQgdXNlZAorICAgICAgICB0byBzZWFyY2ggZm9yIG90aGVyIHNoYXJlZCBsaWJyYXJpZXMgdGhhdCAqaXQqIGRlcGVuZHMgb24gYXQKKyAgICAgICAgcnVuLXRpbWUuICAoVGhpcyBtYXkgb25seSBiZSByZWxldmFudCBvbiBVbml4LikKKworICAgICAgICAnZXhwb3J0X3N5bWJvbHMnIGlzIGEgbGlzdCBvZiBzeW1ib2xzIHRoYXQgdGhlIHNoYXJlZCBsaWJyYXJ5IHdpbGwKKyAgICAgICAgZXhwb3J0LiAgKFRoaXMgYXBwZWFycyB0byBiZSByZWxldmFudCBvbmx5IG9uIFdpbmRvd3MuKQorCisgICAgICAgICdkZWJ1ZycgaXMgYXMgZm9yICdjb21waWxlKCknIGFuZCAnY3JlYXRlX3N0YXRpY19saWIoKScsIHdpdGggdGhlCisgICAgICAgIHNsaWdodCBkaXN0aW5jdGlvbiB0aGF0IGl0IGFjdHVhbGx5IG1hdHRlcnMgb24gbW9zdCBwbGF0Zm9ybXMgKGFzCisgICAgICAgIG9wcG9zZWQgdG8gJ2NyZWF0ZV9zdGF0aWNfbGliKCknLCB3aGljaCBpbmNsdWRlcyBhICdkZWJ1ZycgZmxhZworICAgICAgICBtb3N0bHkgZm9yIGZvcm0ncyBzYWtlKS4KKworICAgICAgICAnZXh0cmFfcHJlYXJncycgYW5kICdleHRyYV9wb3N0YXJncycgYXJlIGFzIGZvciAnY29tcGlsZSgpJyAoZXhjZXB0CisgICAgICAgIG9mIGNvdXJzZSB0aGF0IHRoZXkgc3VwcGx5IGNvbW1hbmQtbGluZSBhcmd1bWVudHMgZm9yIHRoZQorICAgICAgICBwYXJ0aWN1bGFyIGxpbmtlciBiZWluZyB1c2VkKS4KKworICAgICAgICAndGFyZ2V0X2xhbmcnIGlzIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgZm9yIHdoaWNoIHRoZSBnaXZlbiBvYmplY3RzCisgICAgICAgIGFyZSBiZWluZyBjb21waWxlZC4gVGhpcyBhbGxvd3Mgc3BlY2lmaWMgbGlua2FnZSB0aW1lIHRyZWF0bWVudCBvZgorICAgICAgICBjZXJ0YWluIGxhbmd1YWdlcy4KKworICAgICAgICBSYWlzZXMgTGlua0Vycm9yIG9uIGZhaWx1cmUuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworICAgICMgT2xkICdsaW5rXyooKScgbWV0aG9kcywgcmV3cml0dGVuIHRvIHVzZSB0aGUgbmV3ICdsaW5rKCknIG1ldGhvZC4KKworICAgIGRlZiBsaW5rX3NoYXJlZF9saWIoc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcz1Ob25lLCBsaWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsIGV4cG9ydF9zeW1ib2xzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZF90ZW1wPU5vbmUsIHRhcmdldF9sYW5nPU5vbmUpOgorICAgICAgICBzZWxmLmxpbmsoQ0NvbXBpbGVyLlNIQVJFRF9MSUJSQVJZLCBvYmplY3RzLAorICAgICAgICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2ZpbGVuYW1lKG91dHB1dF9saWJuYW1lLCBsaWJfdHlwZT0nc2hhcmVkJyksCisgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgbGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzLAorICAgICAgICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHMsIGRlYnVnLAorICAgICAgICAgICAgICAgICAgZXh0cmFfcHJlYXJncywgZXh0cmFfcG9zdGFyZ3MsIGJ1aWxkX3RlbXAsIHRhcmdldF9sYW5nKQorCisKKyAgICBkZWYgbGlua19zaGFyZWRfb2JqZWN0KHNlbGYsIG9iamVjdHMsIG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwgZXhwb3J0X3N5bWJvbHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX3RlbXA9Tm9uZSwgdGFyZ2V0X2xhbmc9Tm9uZSk6CisgICAgICAgIHNlbGYubGluayhDQ29tcGlsZXIuU0hBUkVEX09CSkVDVCwgb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgIG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgIGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycywKKyAgICAgICAgICAgICAgICAgIGV4cG9ydF9zeW1ib2xzLCBkZWJ1ZywKKyAgICAgICAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3MsIGV4dHJhX3Bvc3RhcmdzLCBidWlsZF90ZW1wLCB0YXJnZXRfbGFuZykKKworICAgIGRlZiBsaW5rX2V4ZWN1dGFibGUoc2VsZiwgb2JqZWN0cywgb3V0cHV0X3Byb2duYW1lLCBvdXRwdXRfZGlyPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9Tm9uZSwgbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLCBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncz1Ob25lLCB0YXJnZXRfbGFuZz1Ob25lKToKKyAgICAgICAgc2VsZi5saW5rKENDb21waWxlci5FWEVDVVRBQkxFLCBvYmplY3RzLAorICAgICAgICAgICAgICAgICAgc2VsZi5leGVjdXRhYmxlX2ZpbGVuYW1lKG91dHB1dF9wcm9nbmFtZSksIG91dHB1dF9kaXIsCisgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMsIE5vbmUsCisgICAgICAgICAgICAgICAgICBkZWJ1ZywgZXh0cmFfcHJlYXJncywgZXh0cmFfcG9zdGFyZ3MsIE5vbmUsIHRhcmdldF9sYW5nKQorCisKKyAgICAjIC0tIE1pc2NlbGxhbmVvdXMgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgVGhlc2UgYXJlIGFsbCB1c2VkIGJ5IHRoZSAnZ2VuX2xpYl9vcHRpb25zKCkgZnVuY3Rpb247IHRoZXJlIGlzCisgICAgIyBubyBhcHByb3ByaWF0ZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNvIHN1YmNsYXNzZXMgc2hvdWxkCisgICAgIyBpbXBsZW1lbnQgYWxsIG9mIHRoZXNlLgorCisgICAgZGVmIGxpYnJhcnlfZGlyX29wdGlvbihzZWxmLCBkaXIpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNvbXBpbGVyIG9wdGlvbiB0byBhZGQgJ2RpcicgdG8gdGhlIGxpc3Qgb2YKKyAgICAgICAgZGlyZWN0b3JpZXMgc2VhcmNoZWQgZm9yIGxpYnJhcmllcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBydW50aW1lX2xpYnJhcnlfZGlyX29wdGlvbihzZWxmLCBkaXIpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNvbXBpbGVyIG9wdGlvbiB0byBhZGQgJ2RpcicgdG8gdGhlIGxpc3Qgb2YKKyAgICAgICAgZGlyZWN0b3JpZXMgc2VhcmNoZWQgZm9yIHJ1bnRpbWUgbGlicmFyaWVzLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGxpYnJhcnlfb3B0aW9uKHNlbGYsIGxpYik6CisgICAgICAgICIiIlJldHVybiB0aGUgY29tcGlsZXIgb3B0aW9uIHRvIGFkZCAnZGlyJyB0byB0aGUgbGlzdCBvZiBsaWJyYXJpZXMKKyAgICAgICAgbGlua2VkIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5IG9yIGV4ZWN1dGFibGUuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgaGFzX2Z1bmN0aW9uKHNlbGYsIGZ1bmNuYW1lLCBpbmNsdWRlcz1Ob25lLCBpbmNsdWRlX2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcz1Ob25lLCBsaWJyYXJ5X2RpcnM9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGZ1bmNuYW1lIGlzIHN1cHBvcnRlZCBvbgorICAgICAgICB0aGUgY3VycmVudCBwbGF0Zm9ybS4gIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgY2FuIGJlIHVzZWQgdG8KKyAgICAgICAgYXVnbWVudCB0aGUgY29tcGlsYXRpb24gZW52aXJvbm1lbnQuCisgICAgICAgICIiIgorCisgICAgICAgICMgdGhpcyBjYW4ndCBiZSBpbmNsdWRlZCBhdCBtb2R1bGUgc2NvcGUgYmVjYXVzZSBpdCB0cmllcyB0bworICAgICAgICAjIGltcG9ydCBtYXRoIHdoaWNoIG1pZ2h0IG5vdCBiZSBhdmFpbGFibGUgYXQgdGhhdCBwb2ludCAtIG1heWJlCisgICAgICAgICMgdGhlIG5lY2Vzc2FyeSBsb2dpYyBzaG91bGQganVzdCBiZSBpbmxpbmVkPworICAgICAgICBpbXBvcnQgdGVtcGZpbGUKKyAgICAgICAgaWYgaW5jbHVkZXMgaXMgTm9uZToKKyAgICAgICAgICAgIGluY2x1ZGVzID0gW10KKyAgICAgICAgaWYgaW5jbHVkZV9kaXJzIGlzIE5vbmU6CisgICAgICAgICAgICBpbmNsdWRlX2RpcnMgPSBbXQorICAgICAgICBpZiBsaWJyYXJpZXMgaXMgTm9uZToKKyAgICAgICAgICAgIGxpYnJhcmllcyA9IFtdCisgICAgICAgIGlmIGxpYnJhcnlfZGlycyBpcyBOb25lOgorICAgICAgICAgICAgbGlicmFyeV9kaXJzID0gW10KKyAgICAgICAgZmQsIGZuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgiLmMiLCBmdW5jbmFtZSwgdGV4dD1UcnVlKQorICAgICAgICBmID0gb3MuZmRvcGVuKGZkLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpbmNsIGluIGluY2x1ZGVzOgorICAgICAgICAgICAgICAgIGYud3JpdGUoIiIiI2luY2x1ZGUgIiVzIlxuIiIiICUgaW5jbCkKKyAgICAgICAgICAgIGYud3JpdGUoIiIiXAorbWFpbiAoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgJXMoKTsKK30KKyIiIiAlIGZ1bmNuYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9iamVjdHMgPSBzZWxmLmNvbXBpbGUoW2ZuYW1lXSwgaW5jbHVkZV9kaXJzPWluY2x1ZGVfZGlycykKKyAgICAgICAgZXhjZXB0IENvbXBpbGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYubGlua19leGVjdXRhYmxlKG9iamVjdHMsICJhLm91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9bGlicmFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9kaXJzPWxpYnJhcnlfZGlycykKKyAgICAgICAgZXhjZXB0IChMaW5rRXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBmaW5kX2xpYnJhcnlfZmlsZSAoc2VsZiwgZGlycywgbGliLCBkZWJ1Zz0wKToKKyAgICAgICAgIiIiU2VhcmNoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBkaXJlY3RvcmllcyBmb3IgYSBzdGF0aWMgb3Igc2hhcmVkCisgICAgICAgIGxpYnJhcnkgZmlsZSAnbGliJyBhbmQgcmV0dXJuIHRoZSBmdWxsIHBhdGggdG8gdGhhdCBmaWxlLiAgSWYKKyAgICAgICAgJ2RlYnVnJyB0cnVlLCBsb29rIGZvciBhIGRlYnVnZ2luZyB2ZXJzaW9uIChpZiB0aGF0IG1ha2VzIHNlbnNlIG9uCisgICAgICAgIHRoZSBjdXJyZW50IHBsYXRmb3JtKS4gIFJldHVybiBOb25lIGlmICdsaWInIHdhc24ndCBmb3VuZCBpbiBhbnkgb2YKKyAgICAgICAgdGhlIHNwZWNpZmllZCBkaXJlY3Rvcmllcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgICMgLS0gRmlsZW5hbWUgZ2VuZXJhdGlvbiBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAjIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBmaWxlbmFtZSBnZW5lcmF0aW5nIG1ldGhvZHMgYXJlCisgICAgIyBwcmVqdWRpY2VkIHRvd2FyZHMgdGhlIFVuaXgvRE9TL1dpbmRvd3MgdmlldyBvZiB0aGUgd29ybGQ6CisgICAgIyAgICogb2JqZWN0IGZpbGVzIGFyZSBuYW1lZCBieSByZXBsYWNpbmcgdGhlIHNvdXJjZSBmaWxlIGV4dGVuc2lvbgorICAgICMgICAgIChlZy4gLmMvLmNwcCAtPiAuby8ub2JqKQorICAgICMgICAqIGxpYnJhcnkgZmlsZXMgKHNoYXJlZCBvciBzdGF0aWMpIGFyZSBuYW1lZCBieSBwbHVnZ2luZyB0aGUKKyAgICAjICAgICBsaWJyYXJ5IG5hbWUgYW5kIGV4dGVuc2lvbiBpbnRvIGEgZm9ybWF0IHN0cmluZywgZWcuCisgICAgIyAgICAgImxpYiVzLiVzIiAlIChsaWJfbmFtZSwgIi5hIikgZm9yIFVuaXggc3RhdGljIGxpYnJhcmllcworICAgICMgICAqIGV4ZWN1dGFibGVzIGFyZSBuYW1lZCBieSBhcHBlbmRpbmcgYW4gZXh0ZW5zaW9uIChwb3NzaWJseQorICAgICMgICAgIGVtcHR5KSB0byB0aGUgcHJvZ3JhbSBuYW1lOiBlZy4gcHJvZ25hbWUgKyAiLmV4ZSIgZm9yCisgICAgIyAgICAgV2luZG93cworICAgICMKKyAgICAjIFRvIHJlZHVjZSByZWR1bmRhbnQgY29kZSwgdGhlc2UgbWV0aG9kcyBleHBlY3QgdG8gZmluZAorICAgICMgc2V2ZXJhbCBhdHRyaWJ1dGVzIGluIHRoZSBjdXJyZW50IG9iamVjdCAocHJlc3VtYWJseSBkZWZpbmVkCisgICAgIyBhcyBjbGFzcyBhdHRyaWJ1dGVzKToKKyAgICAjICAgKiBzcmNfZXh0ZW5zaW9ucyAtCisgICAgIyAgICAgbGlzdCBvZiBDL0MrKyBzb3VyY2UgZmlsZSBleHRlbnNpb25zLCBlZy4gWycuYycsICcuY3BwJ10KKyAgICAjICAgKiBvYmpfZXh0ZW5zaW9uIC0KKyAgICAjICAgICBvYmplY3QgZmlsZSBleHRlbnNpb24sIGVnLiAnLm8nIG9yICcub2JqJworICAgICMgICAqIHN0YXRpY19saWJfZXh0ZW5zaW9uIC0KKyAgICAjICAgICBleHRlbnNpb24gZm9yIHN0YXRpYyBsaWJyYXJ5IGZpbGVzLCBlZy4gJy5hJyBvciAnLmxpYicKKyAgICAjICAgKiBzaGFyZWRfbGliX2V4dGVuc2lvbiAtCisgICAgIyAgICAgZXh0ZW5zaW9uIGZvciBzaGFyZWQgbGlicmFyeS9vYmplY3QgZmlsZXMsIGVnLiAnLnNvJywgJy5kbGwnCisgICAgIyAgICogc3RhdGljX2xpYl9mb3JtYXQgLQorICAgICMgICAgIGZvcm1hdCBzdHJpbmcgZm9yIGdlbmVyYXRpbmcgc3RhdGljIGxpYnJhcnkgZmlsZW5hbWVzLAorICAgICMgICAgIGVnLiAnbGliJXMuJXMnIG9yICclcy4lcycKKyAgICAjICAgKiBzaGFyZWRfbGliX2Zvcm1hdAorICAgICMgICAgIGZvcm1hdCBzdHJpbmcgZm9yIGdlbmVyYXRpbmcgc2hhcmVkIGxpYnJhcnkgZmlsZW5hbWVzCisgICAgIyAgICAgKHByb2JhYmx5IHNhbWUgYXMgc3RhdGljX2xpYl9mb3JtYXQsIHNpbmNlIHRoZSBleHRlbnNpb24KKyAgICAjICAgICBpcyBvbmUgb2YgdGhlIGludGVuZGVkIHBhcmFtZXRlcnMgdG8gdGhlIGZvcm1hdCBzdHJpbmcpCisgICAgIyAgICogZXhlX2V4dGVuc2lvbiAtCisgICAgIyAgICAgZXh0ZW5zaW9uIGZvciBleGVjdXRhYmxlIGZpbGVzLCBlZy4gJycgb3IgJy5leGUnCisKKyAgICBkZWYgb2JqZWN0X2ZpbGVuYW1lcyhzZWxmLCBzb3VyY2VfZmlsZW5hbWVzLCBzdHJpcF9kaXI9MCwgb3V0cHV0X2Rpcj0nJyk6CisgICAgICAgIGlmIG91dHB1dF9kaXIgaXMgTm9uZToKKyAgICAgICAgICAgIG91dHB1dF9kaXIgPSAnJworICAgICAgICBvYmpfbmFtZXMgPSBbXQorICAgICAgICBmb3Igc3JjX25hbWUgaW4gc291cmNlX2ZpbGVuYW1lczoKKyAgICAgICAgICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc3JjX25hbWUpCisgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5zcGxpdGRyaXZlKGJhc2UpWzFdICMgQ2hvcCBvZmYgdGhlIGRyaXZlCisgICAgICAgICAgICBiYXNlID0gYmFzZVtvcy5wYXRoLmlzYWJzKGJhc2UpOl0gICMgSWYgYWJzLCBjaG9wIG9mZiBsZWFkaW5nIC8KKyAgICAgICAgICAgIGlmIGV4dCBub3QgaW4gc2VsZi5zcmNfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICByYWlzZSBVbmtub3duRmlsZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gZmlsZSB0eXBlICclcycgKGZyb20gJyVzJykiICUgKGV4dCwgc3JjX25hbWUpCisgICAgICAgICAgICBpZiBzdHJpcF9kaXI6CisgICAgICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUoYmFzZSkKKyAgICAgICAgICAgIG9ial9uYW1lcy5hcHBlbmQob3MucGF0aC5qb2luKG91dHB1dF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgc2VsZi5vYmpfZXh0ZW5zaW9uKSkKKyAgICAgICAgcmV0dXJuIG9ial9uYW1lcworCisgICAgZGVmIHNoYXJlZF9vYmplY3RfZmlsZW5hbWUoc2VsZiwgYmFzZW5hbWUsIHN0cmlwX2Rpcj0wLCBvdXRwdXRfZGlyPScnKToKKyAgICAgICAgYXNzZXJ0IG91dHB1dF9kaXIgaXMgbm90IE5vbmUKKyAgICAgICAgaWYgc3RyaXBfZGlyOgorICAgICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lIChiYXNlbmFtZSkKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCBiYXNlbmFtZSArIHNlbGYuc2hhcmVkX2xpYl9leHRlbnNpb24pCisKKyAgICBkZWYgZXhlY3V0YWJsZV9maWxlbmFtZShzZWxmLCBiYXNlbmFtZSwgc3RyaXBfZGlyPTAsIG91dHB1dF9kaXI9JycpOgorICAgICAgICBhc3NlcnQgb3V0cHV0X2RpciBpcyBub3QgTm9uZQorICAgICAgICBpZiBzdHJpcF9kaXI6CisgICAgICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUgKGJhc2VuYW1lKQorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKG91dHB1dF9kaXIsIGJhc2VuYW1lICsgKHNlbGYuZXhlX2V4dGVuc2lvbiBvciAnJykpCisKKyAgICBkZWYgbGlicmFyeV9maWxlbmFtZShzZWxmLCBsaWJuYW1lLCBsaWJfdHlwZT0nc3RhdGljJywgICAgICMgb3IgJ3NoYXJlZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcF9kaXI9MCwgb3V0cHV0X2Rpcj0nJyk6CisgICAgICAgIGFzc2VydCBvdXRwdXRfZGlyIGlzIG5vdCBOb25lCisgICAgICAgIGlmIGxpYl90eXBlIG5vdCBpbiAoInN0YXRpYyIsICJzaGFyZWQiLCAiZHlsaWIiKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICInbGliX3R5cGUnIG11c3QgYmUgXCJzdGF0aWNcIiwgXCJzaGFyZWRcIiBvciBcImR5bGliXCIiCisgICAgICAgIGZtdCA9IGdldGF0dHIoc2VsZiwgbGliX3R5cGUgKyAiX2xpYl9mb3JtYXQiKQorICAgICAgICBleHQgPSBnZXRhdHRyKHNlbGYsIGxpYl90eXBlICsgIl9saWJfZXh0ZW5zaW9uIikKKworICAgICAgICBkaXIsIGJhc2UgPSBvcy5wYXRoLnNwbGl0IChsaWJuYW1lKQorICAgICAgICBmaWxlbmFtZSA9IGZtdCAlIChiYXNlLCBleHQpCisgICAgICAgIGlmIHN0cmlwX2RpcjoKKyAgICAgICAgICAgIGRpciA9ICcnCisKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCBkaXIsIGZpbGVuYW1lKQorCisKKyAgICAjIC0tIFV0aWxpdHkgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGFubm91bmNlKHNlbGYsIG1zZywgbGV2ZWw9MSk6CisgICAgICAgIGxvZy5kZWJ1Zyhtc2cpCisKKyAgICBkZWYgZGVidWdfcHJpbnQoc2VsZiwgbXNnKToKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuZGVidWcgaW1wb3J0IERFQlVHCisgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgcHJpbnQgbXNnCisKKyAgICBkZWYgd2FybihzZWxmLCBtc2cpOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ3YXJuaW5nOiAlc1xuIiAlIG1zZykKKworICAgIGRlZiBleGVjdXRlKHNlbGYsIGZ1bmMsIGFyZ3MsIG1zZz1Ob25lLCBsZXZlbD0xKToKKyAgICAgICAgZXhlY3V0ZShmdW5jLCBhcmdzLCBtc2csIHNlbGYuZHJ5X3J1bikKKworICAgIGRlZiBzcGF3bihzZWxmLCBjbWQpOgorICAgICAgICBzcGF3bihjbWQsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgZGVmIG1vdmVfZmlsZShzZWxmLCBzcmMsIGRzdCk6CisgICAgICAgIHJldHVybiBtb3ZlX2ZpbGUoc3JjLCBkc3QsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgZGVmIG1rcGF0aChzZWxmLCBuYW1lLCBtb2RlPTA3NzcpOgorICAgICAgICBta3BhdGgobmFtZSwgbW9kZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisKKworIyBjbGFzcyBDQ29tcGlsZXIKKworCisjIE1hcCBhIHN5cy5wbGF0Zm9ybS9vcy5uYW1lICgncG9zaXgnLCAnbnQnKSB0byB0aGUgZGVmYXVsdCBjb21waWxlcgorIyB0eXBlIGZvciB0aGF0IHBsYXRmb3JtLiBLZXlzIGFyZSBpbnRlcnByZXRlZCBhcyByZSBtYXRjaAorIyBwYXR0ZXJucy4gT3JkZXIgaXMgaW1wb3J0YW50OyBwbGF0Zm9ybSBtYXBwaW5ncyBhcmUgcHJlZmVycmVkIG92ZXIKKyMgT1MgbmFtZXMuCitfZGVmYXVsdF9jb21waWxlcnMgPSAoCisKKyAgICAjIFBsYXRmb3JtIHN0cmluZyBtYXBwaW5ncworCisgICAgIyBvbiBhIGN5Z3dpbiBidWlsdCBweXRob24gd2UgY2FuIHVzZSBnY2MgbGlrZSBhbiBvcmRpbmFyeSBVTklYaXNoCisgICAgIyBjb21waWxlcgorICAgICgnY3lnd2luLionLCAndW5peCcpLAorICAgICgnb3MyZW14JywgJ2VteCcpLAorCisgICAgIyBPUyBuYW1lIG1hcHBpbmdzCisgICAgKCdwb3NpeCcsICd1bml4JyksCisgICAgKCdudCcsICdtc3ZjJyksCisKKyAgICApCisKK2RlZiBnZXRfZGVmYXVsdF9jb21waWxlcihvc25hbWU9Tm9uZSwgcGxhdGZvcm09Tm9uZSk6CisgICAgIiIiIERldGVybWluZSB0aGUgZGVmYXVsdCBjb21waWxlciB0byB1c2UgZm9yIHRoZSBnaXZlbiBwbGF0Zm9ybS4KKworICAgICAgICBvc25hbWUgc2hvdWxkIGJlIG9uZSBvZiB0aGUgc3RhbmRhcmQgUHl0aG9uIE9TIG5hbWVzIChpLmUuIHRoZQorICAgICAgICBvbmVzIHJldHVybmVkIGJ5IG9zLm5hbWUpIGFuZCBwbGF0Zm9ybSB0aGUgY29tbW9uIHZhbHVlCisgICAgICAgIHJldHVybmVkIGJ5IHN5cy5wbGF0Zm9ybSBmb3IgdGhlIHBsYXRmb3JtIGluIHF1ZXN0aW9uLgorCisgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgb3MubmFtZSBhbmQgc3lzLnBsYXRmb3JtIGluIGNhc2UgdGhlCisgICAgICAgIHBhcmFtZXRlcnMgYXJlIG5vdCBnaXZlbi4KKworICAgICIiIgorICAgIGlmIG9zbmFtZSBpcyBOb25lOgorICAgICAgICBvc25hbWUgPSBvcy5uYW1lCisgICAgaWYgcGxhdGZvcm0gaXMgTm9uZToKKyAgICAgICAgcGxhdGZvcm0gPSBzeXMucGxhdGZvcm0KKyAgICBpZiBvc25hbWUgPT0gIm50IiBhbmQgc3lzLnZlcnNpb24uZmluZCgnR0NDJykgPj0gMDoKKyAgICAgICAgcmV0dXJuICdtaW5ndzMyJworICAgIGZvciBwYXR0ZXJuLCBjb21waWxlciBpbiBfZGVmYXVsdF9jb21waWxlcnM6CisgICAgICAgIGlmIHJlLm1hdGNoKHBhdHRlcm4sIHBsYXRmb3JtKSBpcyBub3QgTm9uZSBvciBcCisgICAgICAgICAgIHJlLm1hdGNoKHBhdHRlcm4sIG9zbmFtZSkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gY29tcGlsZXIKKyAgICAjIERlZmF1bHQgdG8gVW5peCBjb21waWxlcgorICAgIHJldHVybiAndW5peCcKKworIyBNYXAgY29tcGlsZXIgdHlwZXMgdG8gKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lKSBwYWlycyAtLSBpZS4gd2hlcmUgdG8KKyMgZmluZCB0aGUgY29kZSB0aGF0IGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIHRvIHRoaXMgY29tcGlsZXIuICAoVGhlIG1vZHVsZQorIyBpcyBhc3N1bWVkIHRvIGJlIGluIHRoZSAnZGlzdHV0aWxzJyBwYWNrYWdlLikKK2NvbXBpbGVyX2NsYXNzID0geyAndW5peCc6ICAgICgndW5peGNjb21waWxlcicsICdVbml4Q0NvbXBpbGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhbmRhcmQgVU5JWC1zdHlsZSBjb21waWxlciIpLAorICAgICAgICAgICAgICAgICAgICdtc3ZjJzogICAgKCdtc3ZjY29tcGlsZXInLCAnTVNWQ0NvbXBpbGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWljcm9zb2Z0IFZpc3VhbCBDKysiKSwKKyAgICAgICAgICAgICAgICAgICAnY3lnd2luJzogICgnY3lnd2luY2NvbXBpbGVyJywgJ0N5Z3dpbkNDb21waWxlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkN5Z3dpbiBwb3J0IG9mIEdOVSBDIENvbXBpbGVyIGZvciBXaW4zMiIpLAorICAgICAgICAgICAgICAgICAgICdtaW5ndzMyJzogKCdjeWd3aW5jY29tcGlsZXInLCAnTWluZ3czMkNDb21waWxlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pbmd3MzIgcG9ydCBvZiBHTlUgQyBDb21waWxlciBmb3IgV2luMzIiKSwKKyAgICAgICAgICAgICAgICAgICAnYmNwcCc6ICAgICgnYmNwcGNvbXBpbGVyJywgJ0JDUFBDb21waWxlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvcmxhbmQgQysrIENvbXBpbGVyIiksCisgICAgICAgICAgICAgICAgICAgJ2VteCc6ICAgICAoJ2VteGNjb21waWxlcicsICdFTVhDQ29tcGlsZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFTVggcG9ydCBvZiBHTlUgQyBDb21waWxlciBmb3IgT1MvMiIpLAorICAgICAgICAgICAgICAgICB9CisKK2RlZiBzaG93X2NvbXBpbGVycygpOgorICAgICIiIlByaW50IGxpc3Qgb2YgYXZhaWxhYmxlIGNvbXBpbGVycyAodXNlZCBieSB0aGUgIi0taGVscC1jb21waWxlciIKKyAgICBvcHRpb25zIHRvICJidWlsZCIsICJidWlsZF9leHQiLCAiYnVpbGRfY2xpYiIpLgorICAgICIiIgorICAgICMgWFhYIHRoaXMgImtub3dzIiB0aGF0IHRoZSBjb21waWxlciBvcHRpb24gaXQncyBkZXNjcmliaW5nIGlzCisgICAgIyAiLS1jb21waWxlciIsIHdoaWNoIGp1c3QgaGFwcGVucyB0byBiZSB0aGUgY2FzZSBmb3IgdGhlIHRocmVlCisgICAgIyBjb21tYW5kcyB0aGF0IHVzZSBpdC4KKyAgICBmcm9tIGRpc3R1dGlscy5mYW5jeV9nZXRvcHQgaW1wb3J0IEZhbmN5R2V0b3B0CisgICAgY29tcGlsZXJzID0gW10KKyAgICBmb3IgY29tcGlsZXIgaW4gY29tcGlsZXJfY2xhc3Mua2V5cygpOgorICAgICAgICBjb21waWxlcnMuYXBwZW5kKCgiY29tcGlsZXI9Iitjb21waWxlciwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXJfY2xhc3NbY29tcGlsZXJdWzJdKSkKKyAgICBjb21waWxlcnMuc29ydCgpCisgICAgcHJldHR5X3ByaW50ZXIgPSBGYW5jeUdldG9wdChjb21waWxlcnMpCisgICAgcHJldHR5X3ByaW50ZXIucHJpbnRfaGVscCgiTGlzdCBvZiBhdmFpbGFibGUgY29tcGlsZXJzOiIpCisKKworZGVmIG5ld19jb21waWxlcihwbGF0PU5vbmUsIGNvbXBpbGVyPU5vbmUsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wLCBmb3JjZT0wKToKKyAgICAiIiJHZW5lcmF0ZSBhbiBpbnN0YW5jZSBvZiBzb21lIENDb21waWxlciBzdWJjbGFzcyBmb3IgdGhlIHN1cHBsaWVkCisgICAgcGxhdGZvcm0vY29tcGlsZXIgY29tYmluYXRpb24uICAncGxhdCcgZGVmYXVsdHMgdG8gJ29zLm5hbWUnCisgICAgKGVnLiAncG9zaXgnLCAnbnQnKSwgYW5kICdjb21waWxlcicgZGVmYXVsdHMgdG8gdGhlIGRlZmF1bHQgY29tcGlsZXIKKyAgICBmb3IgdGhhdCBwbGF0Zm9ybS4gIEN1cnJlbnRseSBvbmx5ICdwb3NpeCcgYW5kICdudCcgYXJlIHN1cHBvcnRlZCwgYW5kCisgICAgdGhlIGRlZmF1bHQgY29tcGlsZXJzIGFyZSAidHJhZGl0aW9uYWwgVW5peCBpbnRlcmZhY2UiIChVbml4Q0NvbXBpbGVyCisgICAgY2xhc3MpIGFuZCBWaXN1YWwgQysrIChNU1ZDQ29tcGlsZXIgY2xhc3MpLiAgTm90ZSB0aGF0IGl0J3MgcGVyZmVjdGx5CisgICAgcG9zc2libGUgdG8gYXNrIGZvciBhIFVuaXggY29tcGlsZXIgb2JqZWN0IHVuZGVyIFdpbmRvd3MsIGFuZCBhCisgICAgTWljcm9zb2Z0IGNvbXBpbGVyIG9iamVjdCB1bmRlciBVbml4IC0tIGlmIHlvdSBzdXBwbHkgYSB2YWx1ZSBmb3IKKyAgICAnY29tcGlsZXInLCAncGxhdCcgaXMgaWdub3JlZC4KKyAgICAiIiIKKyAgICBpZiBwbGF0IGlzIE5vbmU6CisgICAgICAgIHBsYXQgPSBvcy5uYW1lCisKKyAgICB0cnk6CisgICAgICAgIGlmIGNvbXBpbGVyIGlzIE5vbmU6CisgICAgICAgICAgICBjb21waWxlciA9IGdldF9kZWZhdWx0X2NvbXBpbGVyKHBsYXQpCisKKyAgICAgICAgKG1vZHVsZV9uYW1lLCBjbGFzc19uYW1lLCBsb25nX2Rlc2NyaXB0aW9uKSA9IGNvbXBpbGVyX2NsYXNzW2NvbXBpbGVyXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgbXNnID0gImRvbid0IGtub3cgaG93IHRvIGNvbXBpbGUgQy9DKysgY29kZSBvbiBwbGF0Zm9ybSAnJXMnIiAlIHBsYXQKKyAgICAgICAgaWYgY29tcGlsZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiIHdpdGggJyVzJyBjb21waWxlciIgJSBjb21waWxlcgorICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBtc2cKKworICAgIHRyeToKKyAgICAgICAgbW9kdWxlX25hbWUgPSAiZGlzdHV0aWxzLiIgKyBtb2R1bGVfbmFtZQorICAgICAgICBfX2ltcG9ydF9fIChtb2R1bGVfbmFtZSkKKyAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlX25hbWVdCisgICAgICAgIGtsYXNzID0gdmFycyhtb2R1bGUpW2NsYXNzX25hbWVdCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNNb2R1bGVFcnJvciwgXAorICAgICAgICAgICAgICAiY2FuJ3QgY29tcGlsZSBDL0MrKyBjb2RlOiB1bmFibGUgdG8gbG9hZCBtb2R1bGUgJyVzJyIgJSBcCisgICAgICAgICAgICAgIG1vZHVsZV9uYW1lCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNNb2R1bGVFcnJvciwgXAorICAgICAgICAgICAgICAoImNhbid0IGNvbXBpbGUgQy9DKysgY29kZTogdW5hYmxlIHRvIGZpbmQgY2xhc3MgJyVzJyAiICsKKyAgICAgICAgICAgICAgICJpbiBtb2R1bGUgJyVzJyIpICUgKGNsYXNzX25hbWUsIG1vZHVsZV9uYW1lKQorCisgICAgIyBYWFggVGhlIE5vbmUgaXMgbmVjZXNzYXJ5IHRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgIyB3aXRoIGNsYXNzZXMgdGhhdCBleHBlY3QgdmVyYm9zZSB0byBiZSB0aGUgZmlyc3QgcG9zaXRpb25hbAorICAgICMgYXJndW1lbnQuCisgICAgcmV0dXJuIGtsYXNzKE5vbmUsIGRyeV9ydW4sIGZvcmNlKQorCisKK2RlZiBnZW5fcHJlcHJvY2Vzc19vcHRpb25zKG1hY3JvcywgaW5jbHVkZV9kaXJzKToKKyAgICAiIiJHZW5lcmF0ZSBDIHByZS1wcm9jZXNzb3Igb3B0aW9ucyAoLUQsIC1VLCAtSSkgYXMgdXNlZCBieSBhdCBsZWFzdAorICAgIHR3byB0eXBlcyBvZiBjb21waWxlcnM6IHRoZSB0eXBpY2FsIFVuaXggY29tcGlsZXIgYW5kIFZpc3VhbCBDKysuCisgICAgJ21hY3JvcycgaXMgdGhlIHVzdWFsIHRoaW5nLCBhIGxpc3Qgb2YgMS0gb3IgMi10dXBsZXMsIHdoZXJlIChuYW1lLCkKKyAgICBtZWFucyB1bmRlZmluZSAoLVUpIG1hY3JvICduYW1lJywgYW5kIChuYW1lLHZhbHVlKSBtZWFucyBkZWZpbmUgKC1EKQorICAgIG1hY3JvICduYW1lJyB0byAndmFsdWUnLiAgJ2luY2x1ZGVfZGlycycgaXMganVzdCBhIGxpc3Qgb2YgZGlyZWN0b3J5CisgICAgbmFtZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGhlYWRlciBmaWxlIHNlYXJjaCBwYXRoICgtSSkuICBSZXR1cm5zIGEgbGlzdAorICAgIG9mIGNvbW1hbmQtbGluZSBvcHRpb25zIHN1aXRhYmxlIGZvciBlaXRoZXIgVW5peCBjb21waWxlcnMgb3IgVmlzdWFsCisgICAgQysrLgorICAgICIiIgorICAgICMgWFhYIGl0IHdvdWxkIGJlIG5pY2UgKG1haW5seSBhZXN0aGV0aWMsIGFuZCBzbyB3ZSBkb24ndCBnZW5lcmF0ZQorICAgICMgc3R1cGlkLWxvb2tpbmcgY29tbWFuZCBsaW5lcykgdG8gZ28gb3ZlciAnbWFjcm9zJyBhbmQgZWxpbWluYXRlCisgICAgIyByZWR1bmRhbnQgZGVmaW5pdGlvbnMvdW5kZWZpbml0aW9ucyAoaWUuIGVuc3VyZSB0aGF0IG9ubHkgdGhlCisgICAgIyBsYXRlc3QgbWVudGlvbiBvZiBhIHBhcnRpY3VsYXIgbWFjcm8gd2luZHMgdXAgb24gdGhlIGNvbW1hbmQKKyAgICAjIGxpbmUpLiAgSSBkb24ndCB0aGluayBpdCdzIGVzc2VudGlhbCwgdGhvdWdoLCBzaW5jZSBtb3N0IChhbGw/KQorICAgICMgVW5peCBDIGNvbXBpbGVycyBvbmx5IHBheSBhdHRlbnRpb24gdG8gdGhlIGxhdGVzdCAtRCBvciAtVQorICAgICMgbWVudGlvbiBvZiBhIG1hY3JvIG9uIHRoZWlyIGNvbW1hbmQgbGluZS4gIFNpbWlsYXIgc2l0dWF0aW9uIGZvcgorICAgICMgJ2luY2x1ZGVfZGlycycuICBJJ20gcHVudGluZyBvbiBib3RoIGZvciBub3cuICBBbnl3YXlzLCB3ZWVkaW5nIG91dAorICAgICMgcmVkdW5kYW5jaWVzIGxpa2UgdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgdGhlIHByb3ZpbmNlIG9mCisgICAgIyBDQ29tcGlsZXIsIHNpbmNlIHRoZSBkYXRhIHN0cnVjdHVyZXMgdXNlZCBhcmUgaW5oZXJpdGVkIGZyb20gaXQKKyAgICAjIGFuZCB0aGVyZWZvcmUgY29tbW9uIHRvIGFsbCBDQ29tcGlsZXIgY2xhc3Nlcy4KKworICAgIHBwX29wdHMgPSBbXQorICAgIGZvciBtYWNybyBpbiBtYWNyb3M6CisKKyAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKG1hY3JvLCB0dXBsZSkgYW5kCisgICAgICAgICAgICAgICAgMSA8PSBsZW4gKG1hY3JvKSA8PSAyKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgKCJiYWQgbWFjcm8gZGVmaW5pdGlvbiAnJXMnOiAiICsKKyAgICAgICAgICAgICAgICAgICAiZWFjaCBlbGVtZW50IG9mICdtYWNyb3MnIGxpc3QgbXVzdCBiZSBhIDEtIG9yIDItdHVwbGUiKSAlIFwKKyAgICAgICAgICAgICAgICAgIG1hY3JvCisKKyAgICAgICAgaWYgbGVuIChtYWNybykgPT0gMTogICAgICAgICMgdW5kZWZpbmUgdGhpcyBtYWNybworICAgICAgICAgICAgcHBfb3B0cy5hcHBlbmQgKCItVSVzIiAlIG1hY3JvWzBdKQorICAgICAgICBlbGlmIGxlbiAobWFjcm8pID09IDI6CisgICAgICAgICAgICBpZiBtYWNyb1sxXSBpcyBOb25lOiAgICAjIGRlZmluZSB3aXRoIG5vIGV4cGxpY2l0IHZhbHVlCisgICAgICAgICAgICAgICAgcHBfb3B0cy5hcHBlbmQgKCItRCVzIiAlIG1hY3JvWzBdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFhYWCAqZG9uJ3QqIG5lZWQgdG8gYmUgY2xldmVyIGFib3V0IHF1b3RpbmcgdGhlCisgICAgICAgICAgICAgICAgIyBtYWNybyB2YWx1ZSBoZXJlLCBiZWNhdXNlIHdlJ3JlIGdvaW5nIHRvIGF2b2lkIHRoZQorICAgICAgICAgICAgICAgICMgc2hlbGwgYXQgYWxsIGNvc3RzIHdoZW4gd2Ugc3Bhd24gdGhlIGNvbW1hbmQhCisgICAgICAgICAgICAgICAgcHBfb3B0cy5hcHBlbmQgKCItRCVzPSVzIiAlIG1hY3JvKQorCisgICAgZm9yIGRpciBpbiBpbmNsdWRlX2RpcnM6CisgICAgICAgIHBwX29wdHMuYXBwZW5kICgiLUklcyIgJSBkaXIpCisKKyAgICByZXR1cm4gcHBfb3B0cworCisKK2RlZiBnZW5fbGliX29wdGlvbnMoY29tcGlsZXIsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMsIGxpYnJhcmllcyk6CisgICAgIiIiR2VuZXJhdGUgbGlua2VyIG9wdGlvbnMgZm9yIHNlYXJjaGluZyBsaWJyYXJ5IGRpcmVjdG9yaWVzIGFuZAorICAgIGxpbmtpbmcgd2l0aCBzcGVjaWZpYyBsaWJyYXJpZXMuCisKKyAgICAnbGlicmFyaWVzJyBhbmQgJ2xpYnJhcnlfZGlycycgYXJlLCByZXNwZWN0aXZlbHksIGxpc3RzIG9mIGxpYnJhcnkgbmFtZXMKKyAgICAobm90IGZpbGVuYW1lcyEpIGFuZCBzZWFyY2ggZGlyZWN0b3JpZXMuICBSZXR1cm5zIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUKKyAgICBvcHRpb25zIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCBzb21lIGNvbXBpbGVyIChkZXBlbmRpbmcgb24gdGhlIHR3byBmb3JtYXQKKyAgICBzdHJpbmdzIHBhc3NlZCBpbikuCisgICAgIiIiCisgICAgbGliX29wdHMgPSBbXQorCisgICAgZm9yIGRpciBpbiBsaWJyYXJ5X2RpcnM6CisgICAgICAgIGxpYl9vcHRzLmFwcGVuZChjb21waWxlci5saWJyYXJ5X2Rpcl9vcHRpb24oZGlyKSkKKworICAgIGZvciBkaXIgaW4gcnVudGltZV9saWJyYXJ5X2RpcnM6CisgICAgICAgIG9wdCA9IGNvbXBpbGVyLnJ1bnRpbWVfbGlicmFyeV9kaXJfb3B0aW9uKGRpcikKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvcHQsIGxpc3QpOgorICAgICAgICAgICAgbGliX29wdHMuZXh0ZW5kKG9wdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxpYl9vcHRzLmFwcGVuZChvcHQpCisKKyAgICAjIFhYWCBpdCdzIGltcG9ydGFudCB0aGF0IHdlICpub3QqIHJlbW92ZSByZWR1bmRhbnQgbGlicmFyeSBtZW50aW9ucyEKKyAgICAjIHNvbWV0aW1lcyB5b3UgcmVhbGx5IGRvIGhhdmUgdG8gc2F5ICItbGZvbyAtbGJhciAtbGZvbyIgaW4gb3JkZXIgdG8KKyAgICAjIHJlc29sdmUgYWxsIHN5bWJvbHMuICBJIGp1c3QgaG9wZSB3ZSBuZXZlciBoYXZlIHRvIHNheSAiLWxmb28gb2JqLm8KKyAgICAjIC1sYmFyIiB0byBnZXQgdGhpbmdzIHRvIHdvcmsgLS0gdGhhdCdzIGNlcnRhaW5seSBhIHBvc3NpYmlsaXR5LCBidXQgYQorICAgICMgcHJldHR5IG5hc3R5IHdheSB0byBhcnJhbmdlIHlvdXIgQyBjb2RlLgorCisgICAgZm9yIGxpYiBpbiBsaWJyYXJpZXM6CisgICAgICAgIGxpYl9kaXIsIGxpYl9uYW1lID0gb3MucGF0aC5zcGxpdChsaWIpCisgICAgICAgIGlmIGxpYl9kaXIgIT0gJyc6CisgICAgICAgICAgICBsaWJfZmlsZSA9IGNvbXBpbGVyLmZpbmRfbGlicmFyeV9maWxlKFtsaWJfZGlyXSwgbGliX25hbWUpCisgICAgICAgICAgICBpZiBsaWJfZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBsaWJfb3B0cy5hcHBlbmQobGliX2ZpbGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbXBpbGVyLndhcm4oIm5vIGxpYnJhcnkgZmlsZSBjb3JyZXNwb25kaW5nIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGZvdW5kIChza2lwcGluZykiICUgbGliKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGliX29wdHMuYXBwZW5kKGNvbXBpbGVyLmxpYnJhcnlfb3B0aW9uKGxpYikpCisKKyAgICByZXR1cm4gbGliX29wdHMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Njb21waWxlci5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jY29tcGlsZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDUzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jY29tcGlsZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Njb21waWxlci5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jY29tcGlsZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOWY3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jY29tcGlsZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NtZC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NtZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWQ1NjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY21kLnB5CkBAIC0wLDAgKzEsNDU3IEBACisiIiJkaXN0dXRpbHMuY21kCisKK1Byb3ZpZGVzIHRoZSBDb21tYW5kIGNsYXNzLCB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIGNvbW1hbmQgY2xhc3NlcworaW4gdGhlIGRpc3R1dGlscy5jb21tYW5kIHBhY2thZ2UuCisiIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBzeXMsIG9zLCByZQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHV0aWwsIGRpcl91dGlsLCBmaWxlX3V0aWwsIGFyY2hpdmVfdXRpbCwgZGVwX3V0aWwKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworY2xhc3MgQ29tbWFuZDoKKyAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBkZWZpbmluZyBjb21tYW5kIGNsYXNzZXMsIHRoZSAid29ya2VyIGJlZXMiCisgICAgb2YgdGhlIERpc3R1dGlscy4gIEEgdXNlZnVsIGFuYWxvZ3kgZm9yIGNvbW1hbmQgY2xhc3NlcyBpcyB0byB0aGluayBvZgorICAgIHRoZW0gYXMgc3Vicm91dGluZXMgd2l0aCBsb2NhbCB2YXJpYWJsZXMgY2FsbGVkICJvcHRpb25zIi4gIFRoZSBvcHRpb25zCisgICAgYXJlICJkZWNsYXJlZCIgaW4gJ2luaXRpYWxpemVfb3B0aW9ucygpJyBhbmQgImRlZmluZWQiIChnaXZlbiB0aGVpcgorICAgIGZpbmFsIHZhbHVlcywgYWthICJmaW5hbGl6ZWQiKSBpbiAnZmluYWxpemVfb3B0aW9ucygpJywgYm90aCBvZiB3aGljaAorICAgIG11c3QgYmUgZGVmaW5lZCBieSBldmVyeSBjb21tYW5kIGNsYXNzLiAgVGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gdGhlCisgICAgdHdvIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9wdGlvbiB2YWx1ZXMgbWlnaHQgY29tZSBmcm9tIHRoZSBvdXRzaWRlCisgICAgd29ybGQgKGNvbW1hbmQgbGluZSwgY29uZmlnIGZpbGUsIC4uLiksIGFuZCBhbnkgb3B0aW9ucyBkZXBlbmRlbnQgb24KKyAgICBvdGhlciBvcHRpb25zIG11c3QgYmUgY29tcHV0ZWQgKmFmdGVyKiB0aGVzZSBvdXRzaWRlIGluZmx1ZW5jZXMgaGF2ZQorICAgIGJlZW4gcHJvY2Vzc2VkIC0tIGhlbmNlICdmaW5hbGl6ZV9vcHRpb25zKCknLiAgVGhlICJib2R5IiBvZiB0aGUKKyAgICBzdWJyb3V0aW5lLCB3aGVyZSBpdCBkb2VzIGFsbCBpdHMgd29yayBiYXNlZCBvbiB0aGUgdmFsdWVzIG9mIGl0cworICAgIG9wdGlvbnMsIGlzIHRoZSAncnVuKCknIG1ldGhvZCwgd2hpY2ggbXVzdCBhbHNvIGJlIGltcGxlbWVudGVkIGJ5IGV2ZXJ5CisgICAgY29tbWFuZCBjbGFzcy4KKyAgICAiIiIKKworICAgICMgJ3N1Yl9jb21tYW5kcycgZm9ybWFsaXplcyB0aGUgbm90aW9uIG9mIGEgImZhbWlseSIgb2YgY29tbWFuZHMsCisgICAgIyBlZy4gImluc3RhbGwiIGFzIHRoZSBwYXJlbnQgd2l0aCBzdWItY29tbWFuZHMgImluc3RhbGxfbGliIiwKKyAgICAjICJpbnN0YWxsX2hlYWRlcnMiLCBldGMuICBUaGUgcGFyZW50IG9mIGEgZmFtaWx5IG9mIGNvbW1hbmRzCisgICAgIyBkZWZpbmVzICdzdWJfY29tbWFuZHMnIGFzIGEgY2xhc3MgYXR0cmlidXRlOyBpdCdzIGEgbGlzdCBvZgorICAgICMgICAgKGNvbW1hbmRfbmFtZSA6IHN0cmluZywgcHJlZGljYXRlIDogdW5ib3VuZF9tZXRob2QgfCBzdHJpbmcgfCBOb25lKQorICAgICMgdHVwbGVzLCB3aGVyZSAncHJlZGljYXRlJyBpcyBhIG1ldGhvZCBvZiB0aGUgcGFyZW50IGNvbW1hbmQgdGhhdAorICAgICMgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIGNvbW1hbmQgaXMgYXBwbGljYWJsZSBpbiB0aGUKKyAgICAjIGN1cnJlbnQgc2l0dWF0aW9uLiAgKEVnLiB3ZSAiaW5zdGFsbF9oZWFkZXJzIiBpcyBvbmx5IGFwcGxpY2FibGUgaWYKKyAgICAjIHdlIGhhdmUgYW55IEMgaGVhZGVyIGZpbGVzIHRvIGluc3RhbGwuKSAgSWYgJ3ByZWRpY2F0ZScgaXMgTm9uZSwKKyAgICAjIHRoYXQgY29tbWFuZCBpcyBhbHdheXMgYXBwbGljYWJsZS4KKyAgICAjCisgICAgIyAnc3ViX2NvbW1hbmRzJyBpcyB1c3VhbGx5IGRlZmluZWQgYXQgdGhlICplbmQqIG9mIGEgY2xhc3MsIGJlY2F1c2UKKyAgICAjIHByZWRpY2F0ZXMgY2FuIGJlIHVuYm91bmQgbWV0aG9kcywgc28gdGhleSBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuCisgICAgIyBkZWZpbmVkLiAgVGhlIGNhbm9uaWNhbCBleGFtcGxlIGlzIHRoZSAiaW5zdGFsbCIgY29tbWFuZC4KKyAgICBzdWJfY29tbWFuZHMgPSBbXQorCisKKyAgICAjIC0tIENyZWF0aW9uL2luaXRpYWxpemF0aW9uIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpc3QpOgorICAgICAgICAiIiJDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgQ29tbWFuZCBvYmplY3QuICBNb3N0IGltcG9ydGFudGx5LAorICAgICAgICBpbnZva2VzIHRoZSAnaW5pdGlhbGl6ZV9vcHRpb25zKCknIG1ldGhvZCwgd2hpY2ggaXMgdGhlIHJlYWwKKyAgICAgICAgaW5pdGlhbGl6ZXIgYW5kIGRlcGVuZHMgb24gdGhlIGFjdHVhbCBjb21tYW5kIGJlaW5nCisgICAgICAgIGluc3RhbnRpYXRlZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgbGF0ZSBpbXBvcnQgYmVjYXVzZSBvZiBtdXR1YWwgZGVwZW5kZW5jZSBiZXR3ZWVuIHRoZXNlIGNsYXNzZXMKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uCisKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGlzdCwgRGlzdHJpYnV0aW9uKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImRpc3QgbXVzdCBiZSBhIERpc3RyaWJ1dGlvbiBpbnN0YW5jZSIKKyAgICAgICAgaWYgc2VsZi5fX2NsYXNzX18gaXMgQ29tbWFuZDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkNvbW1hbmQgaXMgYW4gYWJzdHJhY3QgY2xhc3MiCisKKyAgICAgICAgc2VsZi5kaXN0cmlidXRpb24gPSBkaXN0CisgICAgICAgIHNlbGYuaW5pdGlhbGl6ZV9vcHRpb25zKCkKKworICAgICAgICAjIFBlci1jb21tYW5kIHZlcnNpb25zIG9mIHRoZSBnbG9iYWwgZmxhZ3MsIHNvIHRoYXQgdGhlIHVzZXIgY2FuCisgICAgICAgICMgY3VzdG9taXplIERpc3R1dGlscycgYmVoYXZpb3VyIGNvbW1hbmQtYnktY29tbWFuZCBhbmQgbGV0IHNvbWUKKyAgICAgICAgIyBjb21tYW5kcyBmYWxsIGJhY2sgb24gdGhlIERpc3RyaWJ1dGlvbidzIGJlaGF2aW91ci4gIE5vbmUgbWVhbnMKKyAgICAgICAgIyAibm90IGRlZmluZWQsIGNoZWNrIHNlbGYuZGlzdHJpYnV0aW9uJ3MgY29weSIsIHdoaWxlIDAgb3IgMSBtZWFuCisgICAgICAgICMgZmFsc2UgYW5kIHRydWUgKGR1aCkuICBOb3RlIHRoYXQgdGhpcyBtZWFucyBmaWd1cmluZyBvdXQgdGhlIHJlYWwKKyAgICAgICAgIyB2YWx1ZSBvZiBlYWNoIGZsYWcgaXMgYSB0b3VjaCBjb21wbGljYXRlZCAtLSBoZW5jZSAic2VsZi5fZHJ5X3J1biIKKyAgICAgICAgIyB3aWxsIGJlIGhhbmRsZWQgYnkgX19nZXRhdHRyX18sIGJlbG93LgorICAgICAgICAjIFhYWCBUaGlzIG5lZWRzIHRvIGJlIGZpeGVkLgorICAgICAgICBzZWxmLl9kcnlfcnVuID0gTm9uZQorCisgICAgICAgICMgdmVyYm9zZSBpcyBsYXJnZWx5IGlnbm9yZWQsIGJ1dCBuZWVkcyB0byBiZSBzZXQgZm9yCisgICAgICAgICMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKEkgdGhpbmspPworICAgICAgICBzZWxmLnZlcmJvc2UgPSBkaXN0LnZlcmJvc2UKKworICAgICAgICAjIFNvbWUgY29tbWFuZHMgZGVmaW5lIGEgJ3NlbGYuZm9yY2UnIG9wdGlvbiB0byBpZ25vcmUgZmlsZQorICAgICAgICAjIHRpbWVzdGFtcHMsIGJ1dCBtZXRob2RzIGRlZmluZWQgKmhlcmUqIGFzc3VtZSB0aGF0CisgICAgICAgICMgJ3NlbGYuZm9yY2UnIGV4aXN0cyBmb3IgYWxsIGNvbW1hbmRzLiAgU28gZGVmaW5lIGl0IGhlcmUKKyAgICAgICAgIyBqdXN0IHRvIGJlIHNhZmUuCisgICAgICAgIHNlbGYuZm9yY2UgPSBOb25lCisKKyAgICAgICAgIyBUaGUgJ2hlbHAnIGZsYWcgaXMganVzdCB1c2VkIGZvciBjb21tYW5kLWxpbmUgcGFyc2luZywgc28KKyAgICAgICAgIyBub25lIG9mIHRoYXQgY29tcGxpY2F0ZWQgYnVyZWF1Y3JhY3kgaXMgbmVlZGVkLgorICAgICAgICBzZWxmLmhlbHAgPSAwCisKKyAgICAgICAgIyAnZmluYWxpemVkJyByZWNvcmRzIHdoZXRoZXIgb3Igbm90ICdmaW5hbGl6ZV9vcHRpb25zKCknIGhhcyBiZWVuCisgICAgICAgICMgY2FsbGVkLiAgJ2ZpbmFsaXplX29wdGlvbnMoKScgaXRzZWxmIHNob3VsZCBub3QgcGF5IGF0dGVudGlvbiB0bworICAgICAgICAjIHRoaXMgZmxhZzogaXQgaXMgdGhlIGJ1c2luZXNzIG9mICdlbnN1cmVfZmluYWxpemVkKCknLCB3aGljaAorICAgICAgICAjIGFsd2F5cyBjYWxscyAnZmluYWxpemVfb3B0aW9ucygpJywgdG8gcmVzcGVjdC91cGRhdGUgaXQuCisgICAgICAgIHNlbGYuZmluYWxpemVkID0gMAorCisgICAgIyBYWFggQSBtb3JlIGV4cGxpY2l0IHdheSB0byBjdXN0b21pemUgZHJ5X3J1biB3b3VsZCBiZSBiZXR0ZXIuCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICBpZiBhdHRyID09ICdkcnlfcnVuJzoKKyAgICAgICAgICAgIG15dmFsID0gZ2V0YXR0cihzZWxmLCAiXyIgKyBhdHRyKQorICAgICAgICAgICAgaWYgbXl2YWwgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgYXR0cikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIG15dmFsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgYXR0cgorCisgICAgZGVmIGVuc3VyZV9maW5hbGl6ZWQoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmZpbmFsaXplZDoKKyAgICAgICAgICAgIHNlbGYuZmluYWxpemVfb3B0aW9ucygpCisgICAgICAgIHNlbGYuZmluYWxpemVkID0gMQorCisgICAgIyBTdWJjbGFzc2VzIG11c3QgZGVmaW5lOgorICAgICMgICBpbml0aWFsaXplX29wdGlvbnMoKQorICAgICMgICAgIHByb3ZpZGUgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCBvcHRpb25zOyBtYXkgYmUgY3VzdG9taXplZCBieQorICAgICMgICAgIHNldHVwIHNjcmlwdCwgYnkgb3B0aW9ucyBmcm9tIGNvbmZpZyBmaWxlKHMpLCBvciBieSBjb21tYW5kLWxpbmUKKyAgICAjICAgICBvcHRpb25zCisgICAgIyAgIGZpbmFsaXplX29wdGlvbnMoKQorICAgICMgICAgIGRlY2lkZSBvbiB0aGUgZmluYWwgdmFsdWVzIGZvciBhbGwgb3B0aW9uczsgdGhpcyBpcyBjYWxsZWQKKyAgICAjICAgICBhZnRlciBhbGwgcG9zc2libGUgaW50ZXJ2ZW50aW9uIGZyb20gdGhlIG91dHNpZGUgd29ybGQKKyAgICAjICAgICAoY29tbWFuZC1saW5lLCBvcHRpb24gZmlsZSwgZXRjLikgaGFzIGJlZW4gcHJvY2Vzc2VkCisgICAgIyAgIHJ1bigpCisgICAgIyAgICAgcnVuIHRoZSBjb21tYW5kOiBkbyB3aGF0ZXZlciBpdCBpcyB3ZSdyZSBoZXJlIHRvIGRvLAorICAgICMgICAgIGNvbnRyb2xsZWQgYnkgdGhlIGNvbW1hbmQncyB2YXJpb3VzIG9wdGlvbiB2YWx1ZXMKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgICIiIlNldCBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHRoZSBvcHRpb25zIHRoYXQgdGhpcyBjb21tYW5kCisgICAgICAgIHN1cHBvcnRzLiAgTm90ZSB0aGF0IHRoZXNlIGRlZmF1bHRzIG1heSBiZSBvdmVycmlkZGVuIGJ5IG90aGVyCisgICAgICAgIGNvbW1hbmRzLCBieSB0aGUgc2V0dXAgc2NyaXB0LCBieSBjb25maWcgZmlsZXMsIG9yIGJ5IHRoZQorICAgICAgICBjb21tYW5kLWxpbmUuICBUaHVzLCB0aGlzIGlzIG5vdCB0aGUgcGxhY2UgdG8gY29kZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgYmV0d2VlbiBvcHRpb25zOyBnZW5lcmFsbHksICdpbml0aWFsaXplX29wdGlvbnMoKScgaW1wbGVtZW50YXRpb25zCisgICAgICAgIGFyZSBqdXN0IGEgYnVuY2ggb2YgInNlbGYuZm9vID0gTm9uZSIgYXNzaWdubWVudHMuCisKKyAgICAgICAgVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgY29tbWFuZCBjbGFzc2VzLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCBcCisgICAgICAgICAgICAgICJhYnN0cmFjdCBtZXRob2QgLS0gc3ViY2xhc3MgJXMgbXVzdCBvdmVycmlkZSIgJSBzZWxmLl9fY2xhc3NfXworCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgICIiIlNldCBmaW5hbCB2YWx1ZXMgZm9yIGFsbCB0aGUgb3B0aW9ucyB0aGF0IHRoaXMgY29tbWFuZCBzdXBwb3J0cy4KKyAgICAgICAgVGhpcyBpcyBhbHdheXMgY2FsbGVkIGFzIGxhdGUgYXMgcG9zc2libGUsIGllLiAgYWZ0ZXIgYW55IG9wdGlvbgorICAgICAgICBhc3NpZ25tZW50cyBmcm9tIHRoZSBjb21tYW5kLWxpbmUgb3IgZnJvbSBvdGhlciBjb21tYW5kcyBoYXZlIGJlZW4KKyAgICAgICAgZG9uZS4gIFRodXMsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIGNvZGUgb3B0aW9uIGRlcGVuZGVuY2llczogaWYKKyAgICAgICAgJ2ZvbycgZGVwZW5kcyBvbiAnYmFyJywgdGhlbiBpdCBpcyBzYWZlIHRvIHNldCAnZm9vJyBmcm9tICdiYXInIGFzCisgICAgICAgIGxvbmcgYXMgJ2Zvbycgc3RpbGwgaGFzIHRoZSBzYW1lIHZhbHVlIGl0IHdhcyBhc3NpZ25lZCBpbgorICAgICAgICAnaW5pdGlhbGl6ZV9vcHRpb25zKCknLgorCisgICAgICAgIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIGNvbW1hbmQgY2xhc3Nlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgICAiYWJzdHJhY3QgbWV0aG9kIC0tIHN1YmNsYXNzICVzIG11c3Qgb3ZlcnJpZGUiICUgc2VsZi5fX2NsYXNzX18KKworCisgICAgZGVmIGR1bXBfb3B0aW9ucyhzZWxmLCBoZWFkZXI9Tm9uZSwgaW5kZW50PSIiKToKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuZmFuY3lfZ2V0b3B0IGltcG9ydCBsb25nb3B0X3hsYXRlCisgICAgICAgIGlmIGhlYWRlciBpcyBOb25lOgorICAgICAgICAgICAgaGVhZGVyID0gImNvbW1hbmQgb3B0aW9ucyBmb3IgJyVzJzoiICUgc2VsZi5nZXRfY29tbWFuZF9uYW1lKCkKKyAgICAgICAgc2VsZi5hbm5vdW5jZShpbmRlbnQgKyBoZWFkZXIsIGxldmVsPWxvZy5JTkZPKQorICAgICAgICBpbmRlbnQgPSBpbmRlbnQgKyAiICAiCisgICAgICAgIGZvciAob3B0aW9uLCBfLCBfKSBpbiBzZWxmLnVzZXJfb3B0aW9uczoKKyAgICAgICAgICAgIG9wdGlvbiA9IG9wdGlvbi50cmFuc2xhdGUobG9uZ29wdF94bGF0ZSkKKyAgICAgICAgICAgIGlmIG9wdGlvblstMV0gPT0gIj0iOgorICAgICAgICAgICAgICAgIG9wdGlvbiA9IG9wdGlvbls6LTFdCisgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZiwgb3B0aW9uKQorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShpbmRlbnQgKyAiJXMgPSAlcyIgJSAob3B0aW9uLCB2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPWxvZy5JTkZPKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIiIiQSBjb21tYW5kJ3MgcmFpc29uIGQnZXRyZTogY2Fycnkgb3V0IHRoZSBhY3Rpb24gaXQgZXhpc3RzIHRvCisgICAgICAgIHBlcmZvcm0sIGNvbnRyb2xsZWQgYnkgdGhlIG9wdGlvbnMgaW5pdGlhbGl6ZWQgaW4KKyAgICAgICAgJ2luaXRpYWxpemVfb3B0aW9ucygpJywgY3VzdG9taXplZCBieSBvdGhlciBjb21tYW5kcywgdGhlIHNldHVwCisgICAgICAgIHNjcmlwdCwgdGhlIGNvbW1hbmQtbGluZSwgYW5kIGNvbmZpZyBmaWxlcywgYW5kIGZpbmFsaXplZCBpbgorICAgICAgICAnZmluYWxpemVfb3B0aW9ucygpJy4gIEFsbCB0ZXJtaW5hbCBvdXRwdXQgYW5kIGZpbGVzeXN0ZW0KKyAgICAgICAgaW50ZXJhY3Rpb24gc2hvdWxkIGJlIGRvbmUgYnkgJ3J1bigpJy4KKworICAgICAgICBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGFsbCBjb21tYW5kIGNsYXNzZXMuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFwKKyAgICAgICAgICAgICAgImFic3RyYWN0IG1ldGhvZCAtLSBzdWJjbGFzcyAlcyBtdXN0IG92ZXJyaWRlIiAlIHNlbGYuX19jbGFzc19fCisKKyAgICBkZWYgYW5ub3VuY2Uoc2VsZiwgbXNnLCBsZXZlbD0xKToKKyAgICAgICAgIiIiSWYgdGhlIGN1cnJlbnQgdmVyYm9zaXR5IGxldmVsIGlzIG9mIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworICAgICAgICAnbGV2ZWwnIHByaW50ICdtc2cnIHRvIHN0ZG91dC4KKyAgICAgICAgIiIiCisgICAgICAgIGxvZy5sb2cobGV2ZWwsIG1zZykKKworICAgIGRlZiBkZWJ1Z19wcmludChzZWxmLCBtc2cpOgorICAgICAgICAiIiJQcmludCAnbXNnJyB0byBzdGRvdXQgaWYgdGhlIGdsb2JhbCBERUJVRyAodGFrZW4gZnJvbSB0aGUKKyAgICAgICAgRElTVFVUSUxTX0RFQlVHIGVudmlyb25tZW50IHZhcmlhYmxlKSBmbGFnIGlzIHRydWUuCisgICAgICAgICIiIgorICAgICAgICBmcm9tIGRpc3R1dGlscy5kZWJ1ZyBpbXBvcnQgREVCVUcKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBwcmludCBtc2cKKyAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorCisKKyAgICAjIC0tIE9wdGlvbiB2YWxpZGF0aW9uIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgKHRoZXNlIGFyZSB2ZXJ5IGhhbmR5IGluIHdyaXRpbmcgdGhlICdmaW5hbGl6ZV9vcHRpb25zKCknIG1ldGhvZCkKKyAgICAjCisgICAgIyBOQi4gdGhlIGdlbmVyYWwgcGhpbG9zb3BoeSBoZXJlIGlzIHRvIGVuc3VyZSB0aGF0IGEgcGFydGljdWxhciBvcHRpb24KKyAgICAjIHZhbHVlIG1lZXRzIGNlcnRhaW4gdHlwZSBhbmQgdmFsdWUgY29uc3RyYWludHMuICBJZiBub3QsIHdlIHRyeSB0bworICAgICMgZm9yY2UgaXQgaW50byBjb25mb3JtYW5jZSAoZWcuIGlmIHdlIGV4cGVjdCBhIGxpc3QgYnV0IGhhdmUgYSBzdHJpbmcsCisgICAgIyBzcGxpdCB0aGUgc3RyaW5nIG9uIGNvbW1hIGFuZC9vciB3aGl0ZXNwYWNlKS4gIElmIHdlIGNhbid0IGZvcmNlIHRoZQorICAgICMgb3B0aW9uIGludG8gY29uZm9ybWFuY2UsIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLiAgVGh1cywgY29tbWFuZAorICAgICMgY2xhc3NlcyBuZWVkIGRvIG5vdGhpbmcgbW9yZSB0aGFuIChlZy4pCisgICAgIyAgIHNlbGYuZW5zdXJlX3N0cmluZ19saXN0KCdmb28nKQorICAgICMgYW5kIHRoZXkgY2FuIGJlIGd1YXJhbnRlZWQgdGhhdCB0aGVyZWFmdGVyLCBzZWxmLmZvbyB3aWxsIGJlCisgICAgIyBhIGxpc3Qgb2Ygc3RyaW5ncy4KKworICAgIGRlZiBfZW5zdXJlX3N0cmluZ2xpa2Uoc2VsZiwgb3B0aW9uLCB3aGF0LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIG9wdGlvbikKKyAgICAgICAgaWYgdmFsIGlzIE5vbmU6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG9wdGlvbiwgZGVmYXVsdCkKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodmFsLCBzdHIpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICInJXMnIG11c3QgYmUgYSAlcyAoZ290IGAlc2ApIiAlIChvcHRpb24sIHdoYXQsIHZhbCkKKyAgICAgICAgcmV0dXJuIHZhbAorCisgICAgZGVmIGVuc3VyZV9zdHJpbmcoc2VsZiwgb3B0aW9uLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAiIiJFbnN1cmUgdGhhdCAnb3B0aW9uJyBpcyBhIHN0cmluZzsgaWYgbm90IGRlZmluZWQsIHNldCBpdCB0bworICAgICAgICAnZGVmYXVsdCcuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9lbnN1cmVfc3RyaW5nbGlrZShvcHRpb24sICJzdHJpbmciLCBkZWZhdWx0KQorCisgICAgZGVmIGVuc3VyZV9zdHJpbmdfbGlzdChzZWxmLCBvcHRpb24pOgorICAgICAgICAiIiJFbnN1cmUgdGhhdCAnb3B0aW9uJyBpcyBhIGxpc3Qgb2Ygc3RyaW5ncy4gIElmICdvcHRpb24nIGlzCisgICAgICAgIGN1cnJlbnRseSBhIHN0cmluZywgd2Ugc3BsaXQgaXQgZWl0aGVyIG9uIC8sXHMqLyBvciAvXHMrLywgc28KKyAgICAgICAgImZvbyBiYXIgYmF6IiwgImZvbyxiYXIsYmF6IiwgYW5kICJmb28sICAgYmFyIGJheiIgYWxsIGJlY29tZQorICAgICAgICBbImZvbyIsICJiYXIiLCAiYmF6Il0uCisgICAgICAgICIiIgorICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIG9wdGlvbikKKyAgICAgICAgaWYgdmFsIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbCwgc3RyKToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgb3B0aW9uLCByZS5zcGxpdChyJyxccyp8XHMrJywgdmFsKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBsaXN0KToKKyAgICAgICAgICAgICAgICAjIGNoZWNrcyBpZiBhbGwgZWxlbWVudHMgYXJlIHN0cgorICAgICAgICAgICAgICAgIG9rID0gMQorICAgICAgICAgICAgICAgIGZvciBlbGVtZW50IGluIHZhbDoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZWxlbWVudCwgc3RyKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2sgPSAwCisKKyAgICAgICAgICAgIGlmIG5vdCBvazoKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAiJyVzJyBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzIChnb3QgJXIpIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb24sIHZhbCkKKworCisgICAgZGVmIF9lbnN1cmVfdGVzdGVkX3N0cmluZyhzZWxmLCBvcHRpb24sIHRlc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQsIGVycm9yX2ZtdCwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgdmFsID0gc2VsZi5fZW5zdXJlX3N0cmluZ2xpa2Uob3B0aW9uLCB3aGF0LCBkZWZhdWx0KQorICAgICAgICBpZiB2YWwgaXMgbm90IE5vbmUgYW5kIG5vdCB0ZXN0ZXIodmFsKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgICAgICAgICAgICAgICAoImVycm9yIGluICclcycgb3B0aW9uOiAiICsgZXJyb3JfZm10KSAlIChvcHRpb24sIHZhbCkKKworICAgIGRlZiBlbnN1cmVfZmlsZW5hbWUoc2VsZiwgb3B0aW9uKToKKyAgICAgICAgIiIiRW5zdXJlIHRoYXQgJ29wdGlvbicgaXMgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgZmlsZS4iIiIKKyAgICAgICAgc2VsZi5fZW5zdXJlX3Rlc3RlZF9zdHJpbmcob3B0aW9uLCBvcy5wYXRoLmlzZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGVuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZmlsZSIpCisKKyAgICBkZWYgZW5zdXJlX2Rpcm5hbWUoc2VsZiwgb3B0aW9uKToKKyAgICAgICAgc2VsZi5fZW5zdXJlX3Rlc3RlZF9zdHJpbmcob3B0aW9uLCBvcy5wYXRoLmlzZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5IG5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBkaXJlY3RvcnkiKQorCisKKyAgICAjIC0tIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGdldF9jb21tYW5kX25hbWUoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2NvbW1hbmRfbmFtZScpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tbWFuZF9uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgIGRlZiBzZXRfdW5kZWZpbmVkX29wdGlvbnMoc2VsZiwgc3JjX2NtZCwgKm9wdGlvbl9wYWlycyk6CisgICAgICAgICIiIlNldCB0aGUgdmFsdWVzIG9mIGFueSAidW5kZWZpbmVkIiBvcHRpb25zIGZyb20gY29ycmVzcG9uZGluZworICAgICAgICBvcHRpb24gdmFsdWVzIGluIHNvbWUgb3RoZXIgY29tbWFuZCBvYmplY3QuICAiVW5kZWZpbmVkIiBoZXJlIG1lYW5zCisgICAgICAgICJpcyBOb25lIiwgd2hpY2ggaXMgdGhlIGNvbnZlbnRpb24gdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGFuIG9wdGlvbgorICAgICAgICBoYXMgbm90IGJlZW4gY2hhbmdlZCBiZXR3ZWVuICdpbml0aWFsaXplX29wdGlvbnMoKScgYW5kCisgICAgICAgICdmaW5hbGl6ZV9vcHRpb25zKCknLiAgVXN1YWxseSBjYWxsZWQgZnJvbSAnZmluYWxpemVfb3B0aW9ucygpJyBmb3IKKyAgICAgICAgb3B0aW9ucyB0aGF0IGRlcGVuZCBvbiBzb21lIG90aGVyIGNvbW1hbmQgcmF0aGVyIHRoYW4gYW5vdGhlcgorICAgICAgICBvcHRpb24gb2YgdGhlIHNhbWUgY29tbWFuZC4gICdzcmNfY21kJyBpcyB0aGUgb3RoZXIgY29tbWFuZCBmcm9tCisgICAgICAgIHdoaWNoIG9wdGlvbiB2YWx1ZXMgd2lsbCBiZSB0YWtlbiAoYSBjb21tYW5kIG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQKKyAgICAgICAgZm9yIGl0IGlmIG5lY2Vzc2FyeSk7IHRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZQorICAgICAgICAnKHNyY19vcHRpb24sZHN0X29wdGlvbiknIHR1cGxlcyB3aGljaCBtZWFuICJ0YWtlIHRoZSB2YWx1ZSBvZgorICAgICAgICAnc3JjX29wdGlvbicgaW4gdGhlICdzcmNfY21kJyBjb21tYW5kIG9iamVjdCwgYW5kIGNvcHkgaXQgdG8KKyAgICAgICAgJ2RzdF9vcHRpb24nIGluIHRoZSBjdXJyZW50IGNvbW1hbmQgb2JqZWN0Ii4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBPcHRpb25fcGFpcnM6IGxpc3Qgb2YgKHNyY19vcHRpb24sIGRzdF9vcHRpb24pIHR1cGxlcworCisgICAgICAgIHNyY19jbWRfb2JqID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfb2JqKHNyY19jbWQpCisgICAgICAgIHNyY19jbWRfb2JqLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBmb3IgKHNyY19vcHRpb24sIGRzdF9vcHRpb24pIGluIG9wdGlvbl9wYWlyczoKKyAgICAgICAgICAgIGlmIGdldGF0dHIoc2VsZiwgZHN0X29wdGlvbikgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGRzdF9vcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHNyY19jbWRfb2JqLCBzcmNfb3B0aW9uKSkKKworCisgICAgZGVmIGdldF9maW5hbGl6ZWRfY29tbWFuZChzZWxmLCBjb21tYW5kLCBjcmVhdGU9MSk6CisgICAgICAgICIiIldyYXBwZXIgYXJvdW5kIERpc3RyaWJ1dGlvbidzICdnZXRfY29tbWFuZF9vYmooKScgbWV0aG9kOiBmaW5kCisgICAgICAgIChjcmVhdGUgaWYgbmVjZXNzYXJ5IGFuZCAnY3JlYXRlJyBpcyB0cnVlKSB0aGUgY29tbWFuZCBvYmplY3QgZm9yCisgICAgICAgICdjb21tYW5kJywgY2FsbCBpdHMgJ2Vuc3VyZV9maW5hbGl6ZWQoKScgbWV0aG9kLCBhbmQgcmV0dXJuIHRoZQorICAgICAgICBmaW5hbGl6ZWQgY29tbWFuZCBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICBjbWRfb2JqID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfb2JqKGNvbW1hbmQsIGNyZWF0ZSkKKyAgICAgICAgY21kX29iai5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgcmV0dXJuIGNtZF9vYmoKKworICAgICMgWFhYIHJlbmFtZSB0byAnZ2V0X3JlaW5pdGlhbGl6ZWRfY29tbWFuZCgpJz8gKHNob3VsZCBkbyB0aGUKKyAgICAjIHNhbWUgaW4gZGlzdC5weSwgaWYgc28pCisgICAgZGVmIHJlaW5pdGlhbGl6ZV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcz0wKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGlzdHJpYnV0aW9uLnJlaW5pdGlhbGl6ZV9jb21tYW5kKAorICAgICAgICAgICAgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzKQorCisgICAgZGVmIHJ1bl9jb21tYW5kKHNlbGYsIGNvbW1hbmQpOgorICAgICAgICAiIiJSdW4gc29tZSBvdGhlciBjb21tYW5kOiB1c2VzIHRoZSAncnVuX2NvbW1hbmQoKScgbWV0aG9kIG9mCisgICAgICAgIERpc3RyaWJ1dGlvbiwgd2hpY2ggY3JlYXRlcyBhbmQgZmluYWxpemVzIHRoZSBjb21tYW5kIG9iamVjdCBpZgorICAgICAgICBuZWNlc3NhcnkgYW5kIHRoZW4gaW52b2tlcyBpdHMgJ3J1bigpJyBtZXRob2QuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5ydW5fY29tbWFuZChjb21tYW5kKQorCisgICAgZGVmIGdldF9zdWJfY29tbWFuZHMoc2VsZik6CisgICAgICAgICIiIkRldGVybWluZSB0aGUgc3ViLWNvbW1hbmRzIHRoYXQgYXJlIHJlbGV2YW50IGluIHRoZSBjdXJyZW50CisgICAgICAgIGRpc3RyaWJ1dGlvbiAoaWUuLCB0aGF0IG5lZWQgdG8gYmUgcnVuKS4gIFRoaXMgaXMgYmFzZWQgb24gdGhlCisgICAgICAgICdzdWJfY29tbWFuZHMnIGNsYXNzIGF0dHJpYnV0ZTogZWFjaCB0dXBsZSBpbiB0aGF0IGxpc3QgbWF5IGluY2x1ZGUKKyAgICAgICAgYSBtZXRob2QgdGhhdCB3ZSBjYWxsIHRvIGRldGVybWluZSBpZiB0aGUgc3ViY29tbWFuZCBuZWVkcyB0byBiZQorICAgICAgICBydW4gZm9yIHRoZSBjdXJyZW50IGRpc3RyaWJ1dGlvbi4gIFJldHVybiBhIGxpc3Qgb2YgY29tbWFuZCBuYW1lcy4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbW1hbmRzID0gW10KKyAgICAgICAgZm9yIChjbWRfbmFtZSwgbWV0aG9kKSBpbiBzZWxmLnN1Yl9jb21tYW5kczoKKyAgICAgICAgICAgIGlmIG1ldGhvZCBpcyBOb25lIG9yIG1ldGhvZChzZWxmKToKKyAgICAgICAgICAgICAgICBjb21tYW5kcy5hcHBlbmQoY21kX25hbWUpCisgICAgICAgIHJldHVybiBjb21tYW5kcworCisKKyAgICAjIC0tIEV4dGVybmFsIHdvcmxkIG1hbmlwdWxhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHdhcm4oc2VsZiwgbXNnKToKKyAgICAgICAgbG9nLndhcm4oIndhcm5pbmc6ICVzOiAlc1xuIiAlCisgICAgICAgICAgICAgICAgKHNlbGYuZ2V0X2NvbW1hbmRfbmFtZSgpLCBtc2cpKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgZnVuYywgYXJncywgbXNnPU5vbmUsIGxldmVsPTEpOgorICAgICAgICB1dGlsLmV4ZWN1dGUoZnVuYywgYXJncywgbXNnLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKworICAgIGRlZiBta3BhdGgoc2VsZiwgbmFtZSwgbW9kZT0wNzc3KToKKyAgICAgICAgZGlyX3V0aWwubWtwYXRoKG5hbWUsIG1vZGUsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgZGVmIGNvcHlfZmlsZShzZWxmLCBpbmZpbGUsIG91dGZpbGUsCisgICAgICAgICAgICAgICAgICAgcHJlc2VydmVfbW9kZT0xLCBwcmVzZXJ2ZV90aW1lcz0xLCBsaW5rPU5vbmUsIGxldmVsPTEpOgorICAgICAgICAiIiJDb3B5IGEgZmlsZSByZXNwZWN0aW5nIHZlcmJvc2UsIGRyeS1ydW4gYW5kIGZvcmNlIGZsYWdzLiAgKFRoZQorICAgICAgICBmb3JtZXIgdHdvIGRlZmF1bHQgdG8gd2hhdGV2ZXIgaXMgaW4gdGhlIERpc3RyaWJ1dGlvbiBvYmplY3QsIGFuZAorICAgICAgICB0aGUgbGF0dGVyIGRlZmF1bHRzIHRvIGZhbHNlIGZvciBjb21tYW5kcyB0aGF0IGRvbid0IGRlZmluZSBpdC4pIiIiCisKKyAgICAgICAgcmV0dXJuIGZpbGVfdXRpbC5jb3B5X2ZpbGUoCisgICAgICAgICAgICBpbmZpbGUsIG91dGZpbGUsCisgICAgICAgICAgICBwcmVzZXJ2ZV9tb2RlLCBwcmVzZXJ2ZV90aW1lcywKKyAgICAgICAgICAgIG5vdCBzZWxmLmZvcmNlLAorICAgICAgICAgICAgbGluaywKKyAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgZGVmIGNvcHlfdHJlZShzZWxmLCBpbmZpbGUsIG91dGZpbGUsCisgICAgICAgICAgICAgICAgICAgcHJlc2VydmVfbW9kZT0xLCBwcmVzZXJ2ZV90aW1lcz0xLCBwcmVzZXJ2ZV9zeW1saW5rcz0wLAorICAgICAgICAgICAgICAgICAgIGxldmVsPTEpOgorICAgICAgICAiIiJDb3B5IGFuIGVudGlyZSBkaXJlY3RvcnkgdHJlZSByZXNwZWN0aW5nIHZlcmJvc2UsIGRyeS1ydW4sCisgICAgICAgIGFuZCBmb3JjZSBmbGFncy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBkaXJfdXRpbC5jb3B5X3RyZWUoCisgICAgICAgICAgICBpbmZpbGUsIG91dGZpbGUsCisgICAgICAgICAgICBwcmVzZXJ2ZV9tb2RlLHByZXNlcnZlX3RpbWVzLHByZXNlcnZlX3N5bWxpbmtzLAorICAgICAgICAgICAgbm90IHNlbGYuZm9yY2UsCisgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKworICAgIGRlZiBtb3ZlX2ZpbGUgKHNlbGYsIHNyYywgZHN0LCBsZXZlbD0xKToKKyAgICAgICAgIiIiTW92ZSBhIGZpbGUgcmVzcGVjdGluZyBkcnktcnVuIGZsYWcuIiIiCisgICAgICAgIHJldHVybiBmaWxlX3V0aWwubW92ZV9maWxlKHNyYywgZHN0LCBkcnlfcnVuID0gc2VsZi5kcnlfcnVuKQorCisgICAgZGVmIHNwYXduIChzZWxmLCBjbWQsIHNlYXJjaF9wYXRoPTEsIGxldmVsPTEpOgorICAgICAgICAiIiJTcGF3biBhbiBleHRlcm5hbCBjb21tYW5kIHJlc3BlY3RpbmcgZHJ5LXJ1biBmbGFnLiIiIgorICAgICAgICBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24KKyAgICAgICAgc3Bhd24oY21kLCBzZWFyY2hfcGF0aCwgZHJ5X3J1bj0gc2VsZi5kcnlfcnVuKQorCisgICAgZGVmIG1ha2VfYXJjaGl2ZShzZWxmLCBiYXNlX25hbWUsIGZvcm1hdCwgcm9vdF9kaXI9Tm9uZSwgYmFzZV9kaXI9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIG93bmVyPU5vbmUsIGdyb3VwPU5vbmUpOgorICAgICAgICByZXR1cm4gYXJjaGl2ZV91dGlsLm1ha2VfYXJjaGl2ZShiYXNlX25hbWUsIGZvcm1hdCwgcm9vdF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VfZGlyLCBkcnlfcnVuPXNlbGYuZHJ5X3J1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXI9b3duZXIsIGdyb3VwPWdyb3VwKQorCisgICAgZGVmIG1ha2VfZmlsZShzZWxmLCBpbmZpbGVzLCBvdXRmaWxlLCBmdW5jLCBhcmdzLAorICAgICAgICAgICAgICAgICAgZXhlY19tc2c9Tm9uZSwgc2tpcF9tc2c9Tm9uZSwgbGV2ZWw9MSk6CisgICAgICAgICIiIlNwZWNpYWwgY2FzZSBvZiAnZXhlY3V0ZSgpJyBmb3Igb3BlcmF0aW9ucyB0aGF0IHByb2Nlc3Mgb25lIG9yCisgICAgICAgIG1vcmUgaW5wdXQgZmlsZXMgYW5kIGdlbmVyYXRlIG9uZSBvdXRwdXQgZmlsZS4gIFdvcmtzIGp1c3QgbGlrZQorICAgICAgICAnZXhlY3V0ZSgpJywgZXhjZXB0IHRoZSBvcGVyYXRpb24gaXMgc2tpcHBlZCBhbmQgYSBkaWZmZXJlbnQKKyAgICAgICAgbWVzc2FnZSBwcmludGVkIGlmICdvdXRmaWxlJyBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgbmV3ZXIgdGhhbiBhbGwKKyAgICAgICAgZmlsZXMgbGlzdGVkIGluICdpbmZpbGVzJy4gIElmIHRoZSBjb21tYW5kIGRlZmluZWQgJ3NlbGYuZm9yY2UnLAorICAgICAgICBhbmQgaXQgaXMgdHJ1ZSwgdGhlbiB0aGUgY29tbWFuZCBpcyB1bmNvbmRpdGlvbmFsbHkgcnVuIC0tIGRvZXMgbm8KKyAgICAgICAgdGltZXN0YW1wIGNoZWNrcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNraXBfbXNnIGlzIE5vbmU6CisgICAgICAgICAgICBza2lwX21zZyA9ICJza2lwcGluZyAlcyAoaW5wdXRzIHVuY2hhbmdlZCkiICUgb3V0ZmlsZQorCisgICAgICAgICMgQWxsb3cgJ2luZmlsZXMnIHRvIGJlIGEgc2luZ2xlIHN0cmluZworICAgICAgICBpZiBpc2luc3RhbmNlKGluZmlsZXMsIHN0cik6CisgICAgICAgICAgICBpbmZpbGVzID0gKGluZmlsZXMsKQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGluZmlsZXMsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiJ2luZmlsZXMnIG11c3QgYmUgYSBzdHJpbmcsIG9yIGEgbGlzdCBvciB0dXBsZSBvZiBzdHJpbmdzIgorCisgICAgICAgIGlmIGV4ZWNfbXNnIGlzIE5vbmU6CisgICAgICAgICAgICBleGVjX21zZyA9ICJnZW5lcmF0aW5nICVzIGZyb20gJXMiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAob3V0ZmlsZSwgJywgJy5qb2luKGluZmlsZXMpKQorCisgICAgICAgICMgSWYgJ291dGZpbGUnIG11c3QgYmUgcmVnZW5lcmF0ZWQgKGVpdGhlciBiZWNhdXNlIGl0IGRvZXNuJ3QKKyAgICAgICAgIyBleGlzdCwgaXMgb3V0LW9mLWRhdGUsIG9yIHRoZSAnZm9yY2UnIGZsYWcgaXMgdHJ1ZSkgdGhlbgorICAgICAgICAjIHBlcmZvcm0gdGhlIGFjdGlvbiB0aGF0IHByZXN1bWFibHkgcmVnZW5lcmF0ZXMgaXQKKyAgICAgICAgaWYgc2VsZi5mb3JjZSBvciBkZXBfdXRpbC5uZXdlcl9ncm91cChpbmZpbGVzLCBvdXRmaWxlKToKKyAgICAgICAgICAgIHNlbGYuZXhlY3V0ZShmdW5jLCBhcmdzLCBleGVjX21zZywgbGV2ZWwpCisKKyAgICAgICAgIyBPdGhlcndpc2UsIHByaW50IHRoZSAic2tpcCIgbWVzc2FnZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nLmRlYnVnKHNraXBfbXNnKQorCisjIFhYWCAnaW5zdGFsbF9taXNjJyBjbGFzcyBub3QgY3VycmVudGx5IHVzZWQgLS0gaXQgd2FzIHRoZSBiYXNlIGNsYXNzIGZvcgorIyBib3RoICdpbnN0YWxsX3NjcmlwdHMnIGFuZCAnaW5zdGFsbF9kYXRhJywgYnV0IHRoZXkgb3V0Z3JldyBpdC4gIEl0IG1pZ2h0CisjIHN0aWxsIGJlIHVzZWZ1bCBmb3IgJ2luc3RhbGxfaGVhZGVycycsIHRob3VnaCwgc28gSSdtIGtlZXBpbmcgaXQgYXJvdW5kCisjIGZvciB0aGUgdGltZSBiZWluZy4KKworY2xhc3MgaW5zdGFsbF9taXNjKENvbW1hbmQpOgorICAgICIiIkNvbW1vbiBiYXNlIGNsYXNzIGZvciBpbnN0YWxsaW5nIHNvbWUgZmlsZXMgaW4gYSBzdWJkaXJlY3RvcnkuCisgICAgQ3VycmVudGx5IHVzZWQgYnkgaW5zdGFsbF9kYXRhIGFuZCBpbnN0YWxsX3NjcmlwdHMuCisgICAgIiIiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbKCdpbnN0YWxsLWRpcj0nLCAnZCcsICJkaXJlY3RvcnkgdG8gaW5zdGFsbCB0aGUgZmlsZXMgdG8iKV0KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gTm9uZQorICAgICAgICBzZWxmLm91dGZpbGVzID0gW10KKworICAgIGRlZiBfaW5zdGFsbF9kaXJfZnJvbShzZWxmLCBkaXJuYW1lKToKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGwnLCAoZGlybmFtZSwgJ2luc3RhbGxfZGlyJykpCisKKyAgICBkZWYgX2NvcHlfZmlsZXMoc2VsZiwgZmlsZWxpc3QpOgorICAgICAgICBzZWxmLm91dGZpbGVzID0gW10KKyAgICAgICAgaWYgbm90IGZpbGVsaXN0OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYubWtwYXRoKHNlbGYuaW5zdGFsbF9kaXIpCisgICAgICAgIGZvciBmIGluIGZpbGVsaXN0OgorICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUoZiwgc2VsZi5pbnN0YWxsX2RpcikKKyAgICAgICAgICAgIHNlbGYub3V0ZmlsZXMuYXBwZW5kKG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBmKSkKKworICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYub3V0ZmlsZXMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NtZC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jbWQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2NhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jbWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NtZC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jbWQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2NhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jbWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYjE1OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMzMgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kCisKK1BhY2thZ2UgY29udGFpbmluZyBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgdGhlIHN0YW5kYXJkIERpc3R1dGlscworY29tbWFuZHMuIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitfX2FsbF9fID0gWydidWlsZCcsCisgICAgICAgICAgICdidWlsZF9weScsCisgICAgICAgICAgICdidWlsZF9leHQnLAorICAgICAgICAgICAnYnVpbGRfY2xpYicsCisgICAgICAgICAgICdidWlsZF9zY3JpcHRzJywKKyAgICAgICAgICAgJ2NsZWFuJywKKyAgICAgICAgICAgJ2luc3RhbGwnLAorICAgICAgICAgICAnaW5zdGFsbF9saWInLAorICAgICAgICAgICAnaW5zdGFsbF9oZWFkZXJzJywKKyAgICAgICAgICAgJ2luc3RhbGxfc2NyaXB0cycsCisgICAgICAgICAgICdpbnN0YWxsX2RhdGEnLAorICAgICAgICAgICAnc2Rpc3QnLAorICAgICAgICAgICAncmVnaXN0ZXInLAorICAgICAgICAgICAnYmRpc3QnLAorICAgICAgICAgICAnYmRpc3RfZHVtYicsCisgICAgICAgICAgICdiZGlzdF9ycG0nLAorICAgICAgICAgICAnYmRpc3Rfd2luaW5zdCcsCisgICAgICAgICAgICd1cGxvYWQnLAorICAgICAgICAgICAnY2hlY2snLAorICAgICAgICAgICAjIFRoZXNlIHR3byBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6CisgICAgICAgICAgICMnYmRpc3Rfc2R1eCcsCisgICAgICAgICAgICMnYmRpc3RfcGtndG9vbCcsCisgICAgICAgICAgICMgTm90ZToKKyAgICAgICAgICAgIyBiZGlzdF9wYWNrYWdlciBpcyBub3QgaW5jbHVkZWQgYmVjYXVzZSBpdCBvbmx5IHByb3ZpZGVzCisgICAgICAgICAgICMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcworICAgICAgICAgIF0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5Nzc3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5Nzc3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3QucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3OTEwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0LnB5CkBAIC0wLDAgKzEsMTQ2IEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC5iZGlzdAorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ2JkaXN0JyBjb21tYW5kIChjcmVhdGUgYSBidWlsdCBbYmluYXJ5XQorZGlzdHJpYnV0aW9uKS4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcworCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgRGlzdHV0aWxzT3B0aW9uRXJyb3IKKworCitkZWYgc2hvd19mb3JtYXRzKCk6CisgICAgIiIiUHJpbnQgbGlzdCBvZiBhdmFpbGFibGUgZm9ybWF0cyAoYXJndW1lbnRzIHRvICItLWZvcm1hdCIgb3B0aW9uKS4KKyAgICAiIiIKKyAgICBmcm9tIGRpc3R1dGlscy5mYW5jeV9nZXRvcHQgaW1wb3J0IEZhbmN5R2V0b3B0CisgICAgZm9ybWF0cyA9IFtdCisgICAgZm9yIGZvcm1hdCBpbiBiZGlzdC5mb3JtYXRfY29tbWFuZHM6CisgICAgICAgIGZvcm1hdHMuYXBwZW5kKCgiZm9ybWF0cz0iICsgZm9ybWF0LCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgYmRpc3QuZm9ybWF0X2NvbW1hbmRbZm9ybWF0XVsxXSkpCisgICAgcHJldHR5X3ByaW50ZXIgPSBGYW5jeUdldG9wdChmb3JtYXRzKQorICAgIHByZXR0eV9wcmludGVyLnByaW50X2hlbHAoIkxpc3Qgb2YgYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbiBmb3JtYXRzOiIpCisKKworY2xhc3MgYmRpc3QoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJjcmVhdGUgYSBidWlsdCAoYmluYXJ5KSBkaXN0cmlidXRpb24iCisKKyAgICB1c2VyX29wdGlvbnMgPSBbKCdiZGlzdC1iYXNlPScsICdiJywKKyAgICAgICAgICAgICAgICAgICAgICJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjcmVhdGluZyBidWlsdCBkaXN0cmlidXRpb25zIiksCisgICAgICAgICAgICAgICAgICAgICgncGxhdC1uYW1lPScsICdwJywKKyAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybSBuYW1lIHRvIGVtYmVkIGluIGdlbmVyYXRlZCBmaWxlbmFtZXMgIgorICAgICAgICAgICAgICAgICAgICAgIihkZWZhdWx0OiAlcykiICUgZ2V0X3BsYXRmb3JtKCkpLAorICAgICAgICAgICAgICAgICAgICAoJ2Zvcm1hdHM9JywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJmb3JtYXRzIGZvciBkaXN0cmlidXRpb24gKGNvbW1hLXNlcGFyYXRlZCBsaXN0KSIpLAorICAgICAgICAgICAgICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKKyAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgaW4gIgorICAgICAgICAgICAgICAgICAgICAgIltkZWZhdWx0OiBkaXN0XSIpLAorICAgICAgICAgICAgICAgICAgICAoJ3NraXAtYnVpbGQnLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgInNraXAgcmVidWlsZGluZyBldmVyeXRoaW5nIChmb3IgdGVzdGluZy9kZWJ1Z2dpbmcpIiksCisgICAgICAgICAgICAgICAgICAgICgnb3duZXI9JywgJ3UnLAorICAgICAgICAgICAgICAgICAgICAgIk93bmVyIG5hbWUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGZpbGUiCisgICAgICAgICAgICAgICAgICAgICAiIFtkZWZhdWx0OiBjdXJyZW50IHVzZXJdIiksCisgICAgICAgICAgICAgICAgICAgICgnZ3JvdXA9JywgJ2cnLAorICAgICAgICAgICAgICAgICAgICAgIkdyb3VwIG5hbWUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGZpbGUiCisgICAgICAgICAgICAgICAgICAgICAiIFtkZWZhdWx0OiBjdXJyZW50IGdyb3VwXSIpLAorICAgICAgICAgICAgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnc2tpcC1idWlsZCddCisKKyAgICBoZWxwX29wdGlvbnMgPSBbCisgICAgICAgICgnaGVscC1mb3JtYXRzJywgTm9uZSwKKyAgICAgICAgICJsaXN0cyBhdmFpbGFibGUgZGlzdHJpYnV0aW9uIGZvcm1hdHMiLCBzaG93X2Zvcm1hdHMpLAorICAgICAgICBdCisKKyAgICAjIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgZG8gbm90IHRha2UgYSBmb3JtYXQgb3B0aW9uIGZyb20gYmRpc3QKKyAgICBub19mb3JtYXRfb3B0aW9uID0gKCdiZGlzdF9ycG0nLCkKKworICAgICMgVGhpcyB3b24ndCBkbyBpbiByZWFsaXR5OiB3aWxsIG5lZWQgdG8gZGlzdGluZ3Vpc2ggUlBNLWlzaCBMaW51eCwKKyAgICAjIERlYmlhbi1pc2ggTGludXgsIFNvbGFyaXMsIEZyZWVCU0QsIC4uLiwgV2luZG93cywgTWFjIE9TLgorICAgIGRlZmF1bHRfZm9ybWF0ID0geydwb3NpeCc6ICdnenRhcicsCisgICAgICAgICAgICAgICAgICAgICAgJ250JzogJ3ppcCcsCisgICAgICAgICAgICAgICAgICAgICAgJ29zMic6ICd6aXAnfQorCisgICAgIyBFc3RhYmxpc2ggdGhlIHByZWZlcnJlZCBvcmRlciAoZm9yIHRoZSAtLWhlbHAtZm9ybWF0cyBvcHRpb24pLgorICAgIGZvcm1hdF9jb21tYW5kcyA9IFsncnBtJywgJ2d6dGFyJywgJ2J6dGFyJywgJ3p0YXInLCAndGFyJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3dpbmluc3QnLCAnemlwJywgJ21zaSddCisKKyAgICAjIEFuZCB0aGUgcmVhbCBpbmZvcm1hdGlvbi4KKyAgICBmb3JtYXRfY29tbWFuZCA9IHsncnBtJzogICAoJ2JkaXN0X3JwbScsICAiUlBNIGRpc3RyaWJ1dGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAgICdnenRhcic6ICgnYmRpc3RfZHVtYicsICJnemlwJ2VkIHRhciBmaWxlIiksCisgICAgICAgICAgICAgICAgICAgICAgJ2J6dGFyJzogKCdiZGlzdF9kdW1iJywgImJ6aXAyJ2VkIHRhciBmaWxlIiksCisgICAgICAgICAgICAgICAgICAgICAgJ3p0YXInOiAgKCdiZGlzdF9kdW1iJywgImNvbXByZXNzZWQgdGFyIGZpbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAndGFyJzogICAoJ2JkaXN0X2R1bWInLCAidGFyIGZpbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAnd2luaW5zdCc6ICgnYmRpc3Rfd2luaW5zdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldpbmRvd3MgZXhlY3V0YWJsZSBpbnN0YWxsZXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAnemlwJzogICAoJ2JkaXN0X2R1bWInLCAiWklQIGZpbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAnbXNpJzogICAoJ2JkaXN0X21zaScsICAiTWljcm9zb2Z0IEluc3RhbGxlciIpCisgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmJkaXN0X2Jhc2UgPSBOb25lCisgICAgICAgIHNlbGYucGxhdF9uYW1lID0gTm9uZQorICAgICAgICBzZWxmLmZvcm1hdHMgPSBOb25lCisgICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYuc2tpcF9idWlsZCA9IDAKKyAgICAgICAgc2VsZi5ncm91cCA9IE5vbmUKKyAgICAgICAgc2VsZi5vd25lciA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICAjIGhhdmUgdG8gZmluYWxpemUgJ3BsYXRfbmFtZScgYmVmb3JlICdiZGlzdF9iYXNlJworICAgICAgICBpZiBzZWxmLnBsYXRfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5za2lwX2J1aWxkOgorICAgICAgICAgICAgICAgIHNlbGYucGxhdF9uYW1lID0gZ2V0X3BsYXRmb3JtKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKS5wbGF0X25hbWUKKworICAgICAgICAjICdiZGlzdF9iYXNlJyAtLSBwYXJlbnQgb2YgcGVyLWJ1aWx0LWRpc3RyaWJ1dGlvbi1mb3JtYXQKKyAgICAgICAgIyB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMgKGVnLiB3ZSdsbCBwcm9iYWJseSBoYXZlCisgICAgICAgICMgImJ1aWxkL2JkaXN0LjxwbGF0Pi9kdW1iIiwgImJ1aWxkL2JkaXN0LjxwbGF0Pi9ycG0iLCBldGMuKQorICAgICAgICBpZiBzZWxmLmJkaXN0X2Jhc2UgaXMgTm9uZToKKyAgICAgICAgICAgIGJ1aWxkX2Jhc2UgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKS5idWlsZF9iYXNlCisgICAgICAgICAgICBzZWxmLmJkaXN0X2Jhc2UgPSBvcy5wYXRoLmpvaW4oYnVpbGRfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmRpc3QuJyArIHNlbGYucGxhdF9uYW1lKQorCisgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZ19saXN0KCdmb3JtYXRzJykKKyAgICAgICAgaWYgc2VsZi5mb3JtYXRzIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5mb3JtYXRzID0gW3NlbGYuZGVmYXVsdF9mb3JtYXRbb3MubmFtZV1dCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJkb24ndCBrbm93IGhvdyB0byBjcmVhdGUgYnVpbHQgZGlzdHJpYnV0aW9ucyAiICsgXAorICAgICAgICAgICAgICAgICAgICAgICJvbiBwbGF0Zm9ybSAlcyIgJSBvcy5uYW1lCisKKyAgICAgICAgaWYgc2VsZi5kaXN0X2RpciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5kaXN0X2RpciA9ICJkaXN0IgorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIyBGaWd1cmUgb3V0IHdoaWNoIHN1Yi1jb21tYW5kcyB3ZSBuZWVkIHRvIHJ1bi4KKyAgICAgICAgY29tbWFuZHMgPSBbXQorICAgICAgICBmb3IgZm9ybWF0IGluIHNlbGYuZm9ybWF0czoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb21tYW5kcy5hcHBlbmQoc2VsZi5mb3JtYXRfY29tbWFuZFtmb3JtYXRdWzBdKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCAiaW52YWxpZCBmb3JtYXQgJyVzJyIgJSBmb3JtYXQKKworICAgICAgICAjIFJlaW5pdGlhbGl6ZSBhbmQgcnVuIGVhY2ggY29tbWFuZC4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZm9ybWF0cykpOgorICAgICAgICAgICAgY21kX25hbWUgPSBjb21tYW5kc1tpXQorICAgICAgICAgICAgc3ViX2NtZCA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoY21kX25hbWUpCisgICAgICAgICAgICBpZiBjbWRfbmFtZSBub3QgaW4gc2VsZi5ub19mb3JtYXRfb3B0aW9uOgorICAgICAgICAgICAgICAgIHN1Yl9jbWQuZm9ybWF0ID0gc2VsZi5mb3JtYXRzW2ldCisKKyAgICAgICAgICAgICMgcGFzc2luZyB0aGUgb3duZXIgYW5kIGdyb3VwIG5hbWVzIGZvciB0YXIgYXJjaGl2aW5nCisgICAgICAgICAgICBpZiBjbWRfbmFtZSA9PSAnYmRpc3RfZHVtYic6CisgICAgICAgICAgICAgICAgc3ViX2NtZC5vd25lciA9IHNlbGYub3duZXIKKyAgICAgICAgICAgICAgICBzdWJfY21kLmdyb3VwID0gc2VsZi5ncm91cAorCisgICAgICAgICAgICAjIElmIHdlJ3JlIGdvaW5nIHRvIG5lZWQgdG8gcnVuIHRoaXMgY29tbWFuZCBhZ2FpbiwgdGVsbCBpdCB0bworICAgICAgICAgICAgIyBrZWVwIGl0cyB0ZW1wb3JhcnkgZmlsZXMgYXJvdW5kIHNvIHN1YnNlcXVlbnQgcnVucyBnbyBmYXN0ZXIuCisgICAgICAgICAgICBpZiBjbWRfbmFtZSBpbiBjb21tYW5kc1tpKzE6XToKKyAgICAgICAgICAgICAgICBzdWJfY21kLmtlZXBfdGVtcCA9IDEKKyAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kX25hbWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0LnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZWQzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0LnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZWQzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X2R1bWIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X2R1bWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzYzY2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfZHVtYi5weQpAQCAtMCwwICsxLDEzMyBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfZHVtYgorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ2JkaXN0X2R1bWInIGNvbW1hbmQgKGNyZWF0ZSBhICJkdW1iIiBidWlsdAorZGlzdHJpYnV0aW9uIC0tIGkuZS4sIGp1c3QgYW4gYXJjaGl2ZSB0byBiZSB1bnBhY2tlZCB1bmRlciAkcHJlZml4IG9yCiskZXhlY19wcmVmaXgpLiIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zCisKK2Zyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfcHl0aG9uX3ZlcnNpb24KKworZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgcmVtb3ZlX3RyZWUsIGVuc3VyZV9yZWxhdGl2ZQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKK2NsYXNzIGJkaXN0X2R1bWIgKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAnY3JlYXRlIGEgImR1bWIiIGJ1aWx0IGRpc3RyaWJ1dGlvbicKKworICAgIHVzZXJfb3B0aW9ucyA9IFsoJ2JkaXN0LWRpcj0nLCAnZCcsCisgICAgICAgICAgICAgICAgICAgICAidGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAoJ3BsYXQtbmFtZT0nLCAncCcsCisgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm0gbmFtZSB0byBlbWJlZCBpbiBnZW5lcmF0ZWQgZmlsZW5hbWVzICIKKyAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdDogJXMpIiAlIGdldF9wbGF0Zm9ybSgpKSwKKyAgICAgICAgICAgICAgICAgICAgKCdmb3JtYXQ9JywgJ2YnLAorICAgICAgICAgICAgICAgICAgICAgImFyY2hpdmUgZm9ybWF0IHRvIGNyZWF0ZSAodGFyLCB6dGFyLCBnenRhciwgemlwKSIpLAorICAgICAgICAgICAgICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKKyAgICAgICAgICAgICAgICAgICAgICJrZWVwIHRoZSBwc2V1ZG8taW5zdGFsbGF0aW9uIHRyZWUgYXJvdW5kIGFmdGVyICIgKworICAgICAgICAgICAgICAgICAgICAgImNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24gYXJjaGl2ZSIpLAorICAgICAgICAgICAgICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKKyAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgaW4iKSwKKyAgICAgICAgICAgICAgICAgICAgKCdza2lwLWJ1aWxkJywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJza2lwIHJlYnVpbGRpbmcgZXZlcnl0aGluZyAoZm9yIHRlc3RpbmcvZGVidWdnaW5nKSIpLAorICAgICAgICAgICAgICAgICAgICAoJ3JlbGF0aXZlJywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJidWlsZCB0aGUgYXJjaGl2ZSB1c2luZyByZWxhdGl2ZSBwYXRocyIKKyAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdDogZmFsc2UpIiksCisgICAgICAgICAgICAgICAgICAgICgnb3duZXI9JywgJ3UnLAorICAgICAgICAgICAgICAgICAgICAgIk93bmVyIG5hbWUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGZpbGUiCisgICAgICAgICAgICAgICAgICAgICAiIFtkZWZhdWx0OiBjdXJyZW50IHVzZXJdIiksCisgICAgICAgICAgICAgICAgICAgICgnZ3JvdXA9JywgJ2cnLAorICAgICAgICAgICAgICAgICAgICAgIkdyb3VwIG5hbWUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGZpbGUiCisgICAgICAgICAgICAgICAgICAgICAiIFtkZWZhdWx0OiBjdXJyZW50IGdyb3VwXSIpLAorICAgICAgICAgICAgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsna2VlcC10ZW1wJywgJ3NraXAtYnVpbGQnLCAncmVsYXRpdmUnXQorCisgICAgZGVmYXVsdF9mb3JtYXQgPSB7ICdwb3NpeCc6ICdnenRhcicsCisgICAgICAgICAgICAgICAgICAgICAgICdudCc6ICd6aXAnLAorICAgICAgICAgICAgICAgICAgICAgICAnb3MyJzogJ3ppcCcgfQorCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zIChzZWxmKToKKyAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYucGxhdF9uYW1lID0gTm9uZQorICAgICAgICBzZWxmLmZvcm1hdCA9IE5vbmUKKyAgICAgICAgc2VsZi5rZWVwX3RlbXAgPSAwCisgICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYuc2tpcF9idWlsZCA9IE5vbmUKKyAgICAgICAgc2VsZi5yZWxhdGl2ZSA9IDAKKyAgICAgICAgc2VsZi5vd25lciA9IE5vbmUKKyAgICAgICAgc2VsZi5ncm91cCA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmJkaXN0X2RpciBpcyBOb25lOgorICAgICAgICAgICAgYmRpc3RfYmFzZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdiZGlzdCcpLmJkaXN0X2Jhc2UKKyAgICAgICAgICAgIHNlbGYuYmRpc3RfZGlyID0gb3MucGF0aC5qb2luKGJkaXN0X2Jhc2UsICdkdW1iJykKKworICAgICAgICBpZiBzZWxmLmZvcm1hdCBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZm9ybWF0ID0gc2VsZi5kZWZhdWx0X2Zvcm1hdFtvcy5uYW1lXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoImRvbid0IGtub3cgaG93IHRvIGNyZWF0ZSBkdW1iIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgIiArCisgICAgICAgICAgICAgICAgICAgICAgICJvbiBwbGF0Zm9ybSAlcyIpICUgb3MubmFtZQorCisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZGlzdF9kaXInLCAnZGlzdF9kaXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdwbGF0X25hbWUnLCAncGxhdF9uYW1lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnc2tpcF9idWlsZCcsICdza2lwX2J1aWxkJykpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5za2lwX2J1aWxkOgorICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGQnKQorCisgICAgICAgIGluc3RhbGwgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdpbnN0YWxsJywgcmVpbml0X3N1YmNvbW1hbmRzPTEpCisgICAgICAgIGluc3RhbGwucm9vdCA9IHNlbGYuYmRpc3RfZGlyCisgICAgICAgIGluc3RhbGwuc2tpcF9idWlsZCA9IHNlbGYuc2tpcF9idWlsZAorICAgICAgICBpbnN0YWxsLndhcm5fZGlyID0gMAorCisgICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIHRvICVzIiAlIHNlbGYuYmRpc3RfZGlyKQorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdpbnN0YWxsJykKKworICAgICAgICAjIEFuZCBtYWtlIGFuIGFyY2hpdmUgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlCisgICAgICAgICMgcHNldWRvLWluc3RhbGxhdGlvbiB0cmVlLgorICAgICAgICBhcmNoaXZlX2Jhc2VuYW1lID0gIiVzLiVzIiAlIChzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wbGF0X25hbWUpCisKKyAgICAgICAgIyBPUy8yIG9iamVjdHMgdG8gYW55ICI6IiBjaGFyYWN0ZXJzIGluIGEgZmlsZW5hbWUgKHN1Y2ggYXMgd2hlbgorICAgICAgICAjIGEgdGltZXN0YW1wIGlzIHVzZWQgaW4gYSB2ZXJzaW9uKSBzbyBjaGFuZ2UgdGhlbSB0byBoeXBoZW5zLgorICAgICAgICBpZiBvcy5uYW1lID09ICJvczIiOgorICAgICAgICAgICAgYXJjaGl2ZV9iYXNlbmFtZSA9IGFyY2hpdmVfYmFzZW5hbWUucmVwbGFjZSgiOiIsICItIikKKworICAgICAgICBwc2V1ZG9pbnN0YWxsX3Jvb3QgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwgYXJjaGl2ZV9iYXNlbmFtZSkKKyAgICAgICAgaWYgbm90IHNlbGYucmVsYXRpdmU6CisgICAgICAgICAgICBhcmNoaXZlX3Jvb3QgPSBzZWxmLmJkaXN0X2RpcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgKHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpIGFuZAorICAgICAgICAgICAgICAgIChpbnN0YWxsLmluc3RhbGxfYmFzZSAhPSBpbnN0YWxsLmluc3RhbGxfcGxhdGJhc2UpKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKCJjYW4ndCBtYWtlIGEgZHVtYiBidWlsdCBkaXN0cmlidXRpb24gd2hlcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAiYmFzZSBhbmQgcGxhdGJhc2UgYXJlIGRpZmZlcmVudCAoJXMsICVzKSIKKyAgICAgICAgICAgICAgICAgICAgICAgJSAocmVwcihpbnN0YWxsLmluc3RhbGxfYmFzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIoaW5zdGFsbC5pbnN0YWxsX3BsYXRiYXNlKSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFyY2hpdmVfcm9vdCA9IG9zLnBhdGguam9pbihzZWxmLmJkaXN0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlX3JlbGF0aXZlKGluc3RhbGwuaW5zdGFsbF9iYXNlKSkKKworICAgICAgICAjIE1ha2UgdGhlIGFyY2hpdmUKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLm1ha2VfYXJjaGl2ZShwc2V1ZG9pbnN0YWxsX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3JtYXQsIHJvb3RfZGlyPWFyY2hpdmVfcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcj1zZWxmLm93bmVyLCBncm91cD1zZWxmLmdyb3VwKQorICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKKyAgICAgICAgICAgIHB5dmVyc2lvbiA9IGdldF9weXRob25fdmVyc2lvbigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBweXZlcnNpb24gPSAnYW55JworICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzLmFwcGVuZCgoJ2JkaXN0X2R1bWInLCBweXZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSkpCisKKyAgICAgICAgaWYgbm90IHNlbGYua2VlcF90ZW1wOgorICAgICAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5iZGlzdF9kaXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9kdW1iLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfZHVtYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjM2UwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfZHVtYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9kdW1iLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfZHVtYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjM2UwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfZHVtYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDNmODczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHkKQEAgLTAsMCArMSw3NDIgQEAKKyMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KKyMgQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IE1hcnRpbiB2b24gTPZ3aXMKKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorIyBUaGUgYmRpc3Rfd2luaW5zdCBjb21tYW5kIHByb3BlcgorIyBiYXNlZCBvbiBiZGlzdF93aW5pbnN0CisiIiIKK0ltcGxlbWVudHMgdGhlIGJkaXN0X21zaSBjb21tYW5kLgorIiIiCitpbXBvcnQgc3lzLCBvcworZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fdmVyc2lvbgorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgcmVtb3ZlX3RyZWUKK2Zyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IFN0cmljdFZlcnNpb24KK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQorCitpbXBvcnQgbXNpbGliCitmcm9tIG1zaWxpYiBpbXBvcnQgc2NoZW1hLCBzZXF1ZW5jZSwgdGV4dAorZnJvbSBtc2lsaWIgaW1wb3J0IERpcmVjdG9yeSwgRmVhdHVyZSwgRGlhbG9nLCBhZGRfZGF0YQorCitjbGFzcyBQeURpYWxvZyhEaWFsb2cpOgorICAgICIiIkRpYWxvZyBjbGFzcyB3aXRoIGEgZml4ZWQgbGF5b3V0OiBjb250cm9scyBhdCB0aGUgdG9wLCB0aGVuIGEgcnVsZXIsCisgICAgdGhlbiBhIGxpc3Qgb2YgYnV0dG9uczogYmFjaywgbmV4dCwgY2FuY2VsLiBPcHRpb25hbGx5IGEgYml0bWFwIGF0IHRoZQorICAgIGxlZnQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgIiIiRGlhbG9nKGRhdGFiYXNlLCBuYW1lLCB4LCB5LCB3LCBoLCBhdHRyaWJ1dGVzLCB0aXRsZSwgZmlyc3QsCisgICAgICAgIGRlZmF1bHQsIGNhbmNlbCwgYml0bWFwPXRydWUpIiIiCisgICAgICAgIERpYWxvZy5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgcnVsZXIgPSBzZWxmLmggLSAzNgorICAgICAgICAjaWYga3cuZ2V0KCJiaXRtYXAiLCBUcnVlKToKKyAgICAgICAgIyAgICBzZWxmLmJpdG1hcCgiQml0bWFwIiwgMCwgMCwgYm13aWR0aCwgcnVsZXIsICJQeXRob25XaW4iKQorICAgICAgICBzZWxmLmxpbmUoIkJvdHRvbUxpbmUiLCAwLCBydWxlciwgc2VsZi53LCAwKQorCisgICAgZGVmIHRpdGxlKHNlbGYsIHRpdGxlKToKKyAgICAgICAgIlNldCB0aGUgdGl0bGUgdGV4dCBvZiB0aGUgZGlhbG9nIGF0IHRoZSB0b3AuIgorICAgICAgICAjIG5hbWUsIHgsIHksIHcsIGgsIGZsYWdzPVZpc2libGV8RW5hYmxlZHxUcmFuc3BhcmVudHxOb1ByZWZpeCwKKyAgICAgICAgIyB0ZXh0LCBpbiBWZXJkYW5hQm9sZDEwCisgICAgICAgIHNlbGYudGV4dCgiVGl0bGUiLCAxNSwgMTAsIDMyMCwgNjAsIDB4MzAwMDMsCisgICAgICAgICAgICAgICAgICByIntcVmVyZGFuYUJvbGQxMH0lcyIgJSB0aXRsZSkKKworICAgIGRlZiBiYWNrKHNlbGYsIHRpdGxlLCBuZXh0LCBuYW1lID0gIkJhY2siLCBhY3RpdmUgPSAxKToKKyAgICAgICAgIiIiQWRkIGEgYmFjayBidXR0b24gd2l0aCBhIGdpdmVuIHRpdGxlLCB0aGUgdGFiLW5leHQgYnV0dG9uLAorICAgICAgICBpdHMgbmFtZSBpbiB0aGUgQ29udHJvbCB0YWJsZSwgcG9zc2libHkgaW5pdGlhbGx5IGRpc2FibGVkLgorCisgICAgICAgIFJldHVybiB0aGUgYnV0dG9uLCBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYXNzb2NpYXRlZCIiIgorICAgICAgICBpZiBhY3RpdmU6CisgICAgICAgICAgICBmbGFncyA9IDMgIyBWaXNpYmxlfEVuYWJsZWQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZsYWdzID0gMSAjIFZpc2libGUKKyAgICAgICAgcmV0dXJuIHNlbGYucHVzaGJ1dHRvbihuYW1lLCAxODAsIHNlbGYuaC0yNyAsIDU2LCAxNywgZmxhZ3MsIHRpdGxlLCBuZXh0KQorCisgICAgZGVmIGNhbmNlbChzZWxmLCB0aXRsZSwgbmV4dCwgbmFtZSA9ICJDYW5jZWwiLCBhY3RpdmUgPSAxKToKKyAgICAgICAgIiIiQWRkIGEgY2FuY2VsIGJ1dHRvbiB3aXRoIGEgZ2l2ZW4gdGl0bGUsIHRoZSB0YWItbmV4dCBidXR0b24sCisgICAgICAgIGl0cyBuYW1lIGluIHRoZSBDb250cm9sIHRhYmxlLCBwb3NzaWJseSBpbml0aWFsbHkgZGlzYWJsZWQuCisKKyAgICAgICAgUmV0dXJuIHRoZSBidXR0b24sIHNvIHRoYXQgZXZlbnRzIGNhbiBiZSBhc3NvY2lhdGVkIiIiCisgICAgICAgIGlmIGFjdGl2ZToKKyAgICAgICAgICAgIGZsYWdzID0gMyAjIFZpc2libGV8RW5hYmxlZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmxhZ3MgPSAxICMgVmlzaWJsZQorICAgICAgICByZXR1cm4gc2VsZi5wdXNoYnV0dG9uKG5hbWUsIDMwNCwgc2VsZi5oLTI3LCA1NiwgMTcsIGZsYWdzLCB0aXRsZSwgbmV4dCkKKworICAgIGRlZiBuZXh0KHNlbGYsIHRpdGxlLCBuZXh0LCBuYW1lID0gIk5leHQiLCBhY3RpdmUgPSAxKToKKyAgICAgICAgIiIiQWRkIGEgTmV4dCBidXR0b24gd2l0aCBhIGdpdmVuIHRpdGxlLCB0aGUgdGFiLW5leHQgYnV0dG9uLAorICAgICAgICBpdHMgbmFtZSBpbiB0aGUgQ29udHJvbCB0YWJsZSwgcG9zc2libHkgaW5pdGlhbGx5IGRpc2FibGVkLgorCisgICAgICAgIFJldHVybiB0aGUgYnV0dG9uLCBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYXNzb2NpYXRlZCIiIgorICAgICAgICBpZiBhY3RpdmU6CisgICAgICAgICAgICBmbGFncyA9IDMgIyBWaXNpYmxlfEVuYWJsZWQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZsYWdzID0gMSAjIFZpc2libGUKKyAgICAgICAgcmV0dXJuIHNlbGYucHVzaGJ1dHRvbihuYW1lLCAyMzYsIHNlbGYuaC0yNywgNTYsIDE3LCBmbGFncywgdGl0bGUsIG5leHQpCisKKyAgICBkZWYgeGJ1dHRvbihzZWxmLCBuYW1lLCB0aXRsZSwgbmV4dCwgeHBvcyk6CisgICAgICAgICIiIkFkZCBhIGJ1dHRvbiB3aXRoIGEgZ2l2ZW4gdGl0bGUsIHRoZSB0YWItbmV4dCBidXR0b24sCisgICAgICAgIGl0cyBuYW1lIGluIHRoZSBDb250cm9sIHRhYmxlLCBnaXZpbmcgaXRzIHggcG9zaXRpb247IHRoZQorICAgICAgICB5LXBvc2l0aW9uIGlzIGFsaWduZWQgd2l0aCB0aGUgb3RoZXIgYnV0dG9ucy4KKworICAgICAgICBSZXR1cm4gdGhlIGJ1dHRvbiwgc28gdGhhdCBldmVudHMgY2FuIGJlIGFzc29jaWF0ZWQiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucHVzaGJ1dHRvbihuYW1lLCBpbnQoc2VsZi53Knhwb3MgLSAyOCksIHNlbGYuaC0yNywgNTYsIDE3LCAzLCB0aXRsZSwgbmV4dCkKKworY2xhc3MgYmRpc3RfbXNpIChDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhIE1pY3Jvc29mdCBJbnN0YWxsZXIgKC5tc2kpIGJpbmFyeSBkaXN0cmlidXRpb24iCisKKyAgICB1c2VyX29wdGlvbnMgPSBbKCdiZGlzdC1kaXI9JywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIiksCisgICAgICAgICAgICAgICAgICAgICgncGxhdC1uYW1lPScsICdwJywKKyAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybSBuYW1lIHRvIGVtYmVkIGluIGdlbmVyYXRlZCBmaWxlbmFtZXMgIgorICAgICAgICAgICAgICAgICAgICAgIihkZWZhdWx0OiAlcykiICUgZ2V0X3BsYXRmb3JtKCkpLAorICAgICAgICAgICAgICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKKyAgICAgICAgICAgICAgICAgICAgICJrZWVwIHRoZSBwc2V1ZG8taW5zdGFsbGF0aW9uIHRyZWUgYXJvdW5kIGFmdGVyICIgKworICAgICAgICAgICAgICAgICAgICAgImNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24gYXJjaGl2ZSIpLAorICAgICAgICAgICAgICAgICAgICAoJ3RhcmdldC12ZXJzaW9uPScsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZSBhIHNwZWNpZmljIHB5dGhvbiB2ZXJzaW9uIiArCisgICAgICAgICAgICAgICAgICAgICAiIG9uIHRoZSB0YXJnZXQgc3lzdGVtIiksCisgICAgICAgICAgICAgICAgICAgICgnbm8tdGFyZ2V0LWNvbXBpbGUnLCAnYycsCisgICAgICAgICAgICAgICAgICAgICAiZG8gbm90IGNvbXBpbGUgLnB5IHRvIC5weWMgb24gdGhlIHRhcmdldCBzeXN0ZW0iKSwKKyAgICAgICAgICAgICAgICAgICAgKCduby10YXJnZXQtb3B0aW1pemUnLCAnbycsCisgICAgICAgICAgICAgICAgICAgICAiZG8gbm90IGNvbXBpbGUgLnB5IHRvIC5weW8gKG9wdGltaXplZCkiCisgICAgICAgICAgICAgICAgICAgICAib24gdGhlIHRhcmdldCBzeXN0ZW0iKSwKKyAgICAgICAgICAgICAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCisgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCBmaW5hbCBidWlsdCBkaXN0cmlidXRpb25zIGluIiksCisgICAgICAgICAgICAgICAgICAgICgnc2tpcC1idWlsZCcsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAic2tpcCByZWJ1aWxkaW5nIGV2ZXJ5dGhpbmcgKGZvciB0ZXN0aW5nL2RlYnVnZ2luZykiKSwKKyAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsLXNjcmlwdD0nLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgImJhc2VuYW1lIG9mIGluc3RhbGxhdGlvbiBzY3JpcHQgdG8gYmUgcnVuIGFmdGVyIgorICAgICAgICAgICAgICAgICAgICAgImluc3RhbGxhdGlvbiBvciBiZWZvcmUgZGVpbnN0YWxsYXRpb24iKSwKKyAgICAgICAgICAgICAgICAgICAgKCdwcmUtaW5zdGFsbC1zY3JpcHQ9JywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJGdWxseSBxdWFsaWZpZWQgZmlsZW5hbWUgb2YgYSBzY3JpcHQgdG8gYmUgcnVuIGJlZm9yZSAiCisgICAgICAgICAgICAgICAgICAgICAiYW55IGZpbGVzIGFyZSBpbnN0YWxsZWQuICBUaGlzIHNjcmlwdCBuZWVkIG5vdCBiZSBpbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgImRpc3RyaWJ1dGlvbiIpLAorICAgICAgICAgICAgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsna2VlcC10ZW1wJywgJ25vLXRhcmdldC1jb21waWxlJywgJ25vLXRhcmdldC1vcHRpbWl6ZScsCisgICAgICAgICAgICAgICAgICAgICAgICdza2lwLWJ1aWxkJ10KKworICAgIGFsbF92ZXJzaW9ucyA9IFsnMi4wJywgJzIuMScsICcyLjInLCAnMi4zJywgJzIuNCcsCisgICAgICAgICAgICAgICAgICAgICcyLjUnLCAnMi42JywgJzIuNycsICcyLjgnLCAnMi45JywKKyAgICAgICAgICAgICAgICAgICAgJzMuMCcsICczLjEnLCAnMy4yJywgJzMuMycsICczLjQnLAorICAgICAgICAgICAgICAgICAgICAnMy41JywgJzMuNicsICczLjcnLCAnMy44JywgJzMuOSddCisgICAgb3RoZXJfdmVyc2lvbiA9ICdYJworCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuYmRpc3RfZGlyID0gTm9uZQorICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5rZWVwX3RlbXAgPSAwCisgICAgICAgIHNlbGYubm9fdGFyZ2V0X2NvbXBpbGUgPSAwCisgICAgICAgIHNlbGYubm9fdGFyZ2V0X29wdGltaXplID0gMAorICAgICAgICBzZWxmLnRhcmdldF92ZXJzaW9uID0gTm9uZQorICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQorICAgICAgICBzZWxmLnNraXBfYnVpbGQgPSBOb25lCisgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQgPSBOb25lCisgICAgICAgIHNlbGYucHJlX2luc3RhbGxfc2NyaXB0ID0gTm9uZQorICAgICAgICBzZWxmLnZlcnNpb25zID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLCAoJ3NraXBfYnVpbGQnLCAnc2tpcF9idWlsZCcpKQorCisgICAgICAgIGlmIHNlbGYuYmRpc3RfZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBiZGlzdF9iYXNlID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0JykuYmRpc3RfYmFzZQorICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBvcy5wYXRoLmpvaW4oYmRpc3RfYmFzZSwgJ21zaScpCisKKyAgICAgICAgc2hvcnRfdmVyc2lvbiA9IGdldF9weXRob25fdmVyc2lvbigpCisgICAgICAgIGlmIChub3Qgc2VsZi50YXJnZXRfdmVyc2lvbikgYW5kIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgc2VsZi50YXJnZXRfdmVyc2lvbiA9IHNob3J0X3ZlcnNpb24KKworICAgICAgICBpZiBzZWxmLnRhcmdldF92ZXJzaW9uOgorICAgICAgICAgICAgc2VsZi52ZXJzaW9ucyA9IFtzZWxmLnRhcmdldF92ZXJzaW9uXQorICAgICAgICAgICAgaWYgbm90IHNlbGYuc2tpcF9idWlsZCBhbmQgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKClcCisgICAgICAgICAgICAgICBhbmQgc2VsZi50YXJnZXRfdmVyc2lvbiAhPSBzaG9ydF92ZXJzaW9uOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgInRhcmdldCB2ZXJzaW9uIGNhbiBvbmx5IGJlICVzLCBvciB0aGUgJy0tc2tpcC1idWlsZCciIFwKKyAgICAgICAgICAgICAgICAgICAgICAiIG9wdGlvbiBtdXN0IGJlIHNwZWNpZmllZCIgJSAoc2hvcnRfdmVyc2lvbiwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnZlcnNpb25zID0gbGlzdChzZWxmLmFsbF92ZXJzaW9ucykKKworICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2Rpc3RfZGlyJywgJ2Rpc3RfZGlyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgncGxhdF9uYW1lJywgJ3BsYXRfbmFtZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgaWYgc2VsZi5wcmVfaW5zdGFsbF9zY3JpcHQ6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgInRoZSBwcmUtaW5zdGFsbC1zY3JpcHQgZmVhdHVyZSBpcyBub3QgeWV0IGltcGxlbWVudGVkIgorCisgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9zY3JpcHQ6CisgICAgICAgICAgICBmb3Igc2NyaXB0IGluIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHM6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5pbnN0YWxsX3NjcmlwdCA9PSBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdCk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgImluc3RhbGxfc2NyaXB0ICclcycgbm90IGZvdW5kIGluIHNjcmlwdHMiICUgXAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQKKyAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdF9rZXkgPSBOb25lCisgICAgIyBmaW5hbGl6ZV9vcHRpb25zKCkKKworCisgICAgZGVmIHJ1biAoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnNraXBfYnVpbGQ6CisgICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZCcpCisKKyAgICAgICAgaW5zdGFsbCA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2luc3RhbGwnLCByZWluaXRfc3ViY29tbWFuZHM9MSkKKyAgICAgICAgaW5zdGFsbC5wcmVmaXggPSBzZWxmLmJkaXN0X2RpcgorICAgICAgICBpbnN0YWxsLnNraXBfYnVpbGQgPSBzZWxmLnNraXBfYnVpbGQKKyAgICAgICAgaW5zdGFsbC53YXJuX2RpciA9IDAKKworICAgICAgICBpbnN0YWxsX2xpYiA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2luc3RhbGxfbGliJykKKyAgICAgICAgIyB3ZSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIHB5YyBvciBweW8gZmlsZXMKKyAgICAgICAgaW5zdGFsbF9saWIuY29tcGlsZSA9IDAKKyAgICAgICAgaW5zdGFsbF9saWIub3B0aW1pemUgPSAwCisKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CisgICAgICAgICAgICAjIElmIHdlIGFyZSBidWlsZGluZyBhbiBpbnN0YWxsZXIgZm9yIGEgUHl0aG9uIHZlcnNpb24gb3RoZXIKKyAgICAgICAgICAgICMgdGhhbiB0aGUgb25lIHdlIGFyZSBjdXJyZW50bHkgcnVubmluZywgdGhlbiB3ZSBuZWVkIHRvIGVuc3VyZQorICAgICAgICAgICAgIyBvdXIgYnVpbGRfbGliIHJlZmxlY3RzIHRoZSBvdGhlciBQeXRob24gdmVyc2lvbiByYXRoZXIgdGhhbiBvdXJzLgorICAgICAgICAgICAgIyBOb3RlIHRoYXQgZm9yIHRhcmdldF92ZXJzaW9uIT1zeXMudmVyc2lvbiwgd2UgbXVzdCBoYXZlIHNraXBwZWQgdGhlCisgICAgICAgICAgICAjIGJ1aWxkIHN0ZXAsIHNvIHRoZXJlIGlzIG5vIGlzc3VlIHdpdGggZW5mb3JjaW5nIHRoZSBidWlsZCBvZiB0aGlzCisgICAgICAgICAgICAjIHZlcnNpb24uCisgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiA9IHNlbGYudGFyZ2V0X3ZlcnNpb24KKyAgICAgICAgICAgIGlmIG5vdCB0YXJnZXRfdmVyc2lvbjoKKyAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5za2lwX2J1aWxkLCAiU2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoaXMiCisgICAgICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSBzeXMudmVyc2lvblswOjNdCisgICAgICAgICAgICBwbGF0X3NwZWNpZmllciA9ICIuJXMtJXMiICUgKHNlbGYucGxhdF9uYW1lLCB0YXJnZXRfdmVyc2lvbikKKyAgICAgICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKKyAgICAgICAgICAgIGJ1aWxkLmJ1aWxkX2xpYiA9IG9zLnBhdGguam9pbihidWlsZC5idWlsZF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaWInICsgcGxhdF9zcGVjaWZpZXIpCisKKyAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgdG8gJXMiLCBzZWxmLmJkaXN0X2RpcikKKyAgICAgICAgaW5zdGFsbC5lbnN1cmVfZmluYWxpemVkKCkKKworICAgICAgICAjIGF2b2lkIHdhcm5pbmcgb2YgJ2luc3RhbGxfbGliJyBhYm91dCBpbnN0YWxsaW5nCisgICAgICAgICMgaW50byBhIGRpcmVjdG9yeSBub3QgaW4gc3lzLnBhdGgKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihzZWxmLmJkaXN0X2RpciwgJ1BVUkVMSUInKSkKKworICAgICAgICBpbnN0YWxsLnJ1bigpCisKKyAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisKKyAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi5kaXN0X2RpcikKKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKQorICAgICAgICBpbnN0YWxsZXJfbmFtZSA9IHNlbGYuZ2V0X2luc3RhbGxlcl9maWxlbmFtZShmdWxsbmFtZSkKKyAgICAgICAgaW5zdGFsbGVyX25hbWUgPSBvcy5wYXRoLmFic3BhdGgoaW5zdGFsbGVyX25hbWUpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGluc3RhbGxlcl9uYW1lKTogb3MudW5saW5rKGluc3RhbGxlcl9uYW1lKQorCisgICAgICAgIG1ldGFkYXRhID0gc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEKKyAgICAgICAgYXV0aG9yID0gbWV0YWRhdGEuYXV0aG9yCisgICAgICAgIGlmIG5vdCBhdXRob3I6CisgICAgICAgICAgICBhdXRob3IgPSBtZXRhZGF0YS5tYWludGFpbmVyCisgICAgICAgIGlmIG5vdCBhdXRob3I6CisgICAgICAgICAgICBhdXRob3IgPSAiVU5LTk9XTiIKKyAgICAgICAgdmVyc2lvbiA9IG1ldGFkYXRhLmdldF92ZXJzaW9uKCkKKyAgICAgICAgIyBQcm9kdWN0VmVyc2lvbiBtdXN0IGJlIHN0cmljdGx5IG51bWVyaWMKKyAgICAgICAgIyBYWFggbmVlZCB0byBkZWFsIHdpdGggcHJlcmVsZWFzZSB2ZXJzaW9ucworICAgICAgICBzdmVyc2lvbiA9ICIlZC4lZC4lZCIgJSBTdHJpY3RWZXJzaW9uKHZlcnNpb24pLnZlcnNpb24KKyAgICAgICAgIyBQcmVmaXggUHJvZHVjdE5hbWUgd2l0aCBQeXRob24geC55LCBzbyB0aGF0CisgICAgICAgICMgaXQgc29ydHMgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXIgUHl0aG9uIHBhY2thZ2VzCisgICAgICAgICMgaW4gQWRkLVJlbW92ZS1Qcm9ncmFtcyAoQVBSKQorICAgICAgICBmdWxsbmFtZSA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpCisgICAgICAgIGlmIHNlbGYudGFyZ2V0X3ZlcnNpb246CisgICAgICAgICAgICBwcm9kdWN0X25hbWUgPSAiUHl0aG9uICVzICVzIiAlIChzZWxmLnRhcmdldF92ZXJzaW9uLCBmdWxsbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByb2R1Y3RfbmFtZSA9ICJQeXRob24gJXMiICUgKGZ1bGxuYW1lKQorICAgICAgICBzZWxmLmRiID0gbXNpbGliLmluaXRfZGF0YWJhc2UoaW5zdGFsbGVyX25hbWUsIHNjaGVtYSwKKyAgICAgICAgICAgICAgICBwcm9kdWN0X25hbWUsIG1zaWxpYi5nZW5fdXVpZCgpLAorICAgICAgICAgICAgICAgIHN2ZXJzaW9uLCBhdXRob3IpCisgICAgICAgIG1zaWxpYi5hZGRfdGFibGVzKHNlbGYuZGIsIHNlcXVlbmNlKQorICAgICAgICBwcm9wcyA9IFsoJ0Rpc3RWZXJzaW9uJywgdmVyc2lvbildCisgICAgICAgIGVtYWlsID0gbWV0YWRhdGEuYXV0aG9yX2VtYWlsIG9yIG1ldGFkYXRhLm1haW50YWluZXJfZW1haWwKKyAgICAgICAgaWYgZW1haWw6CisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoKCJBUlBDT05UQUNUIiwgZW1haWwpKQorICAgICAgICBpZiBtZXRhZGF0YS51cmw6CisgICAgICAgICAgICBwcm9wcy5hcHBlbmQoKCJBUlBVUkxJTkZPQUJPVVQiLCBtZXRhZGF0YS51cmwpKQorICAgICAgICBpZiBwcm9wczoKKyAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICdQcm9wZXJ0eScsIHByb3BzKQorCisgICAgICAgIHNlbGYuYWRkX2ZpbmRfcHl0aG9uKCkKKyAgICAgICAgc2VsZi5hZGRfZmlsZXMoKQorICAgICAgICBzZWxmLmFkZF9zY3JpcHRzKCkKKyAgICAgICAgc2VsZi5hZGRfdWkoKQorICAgICAgICBzZWxmLmRiLkNvbW1pdCgpCisKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwgJ2Rpc3RfZmlsZXMnKToKKyAgICAgICAgICAgIHR1cCA9ICdiZGlzdF9tc2knLCBzZWxmLnRhcmdldF92ZXJzaW9uIG9yICdhbnknLCBmdWxsbmFtZQorICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGlzdF9maWxlcy5hcHBlbmQodHVwKQorCisgICAgICAgIGlmIG5vdCBzZWxmLmtlZXBfdGVtcDoKKyAgICAgICAgICAgIHJlbW92ZV90cmVlKHNlbGYuYmRpc3RfZGlyLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKworICAgIGRlZiBhZGRfZmlsZXMoc2VsZik6CisgICAgICAgIGRiID0gc2VsZi5kYgorICAgICAgICBjYWIgPSBtc2lsaWIuQ0FCKCJkaXN0ZmlsZXMiKQorICAgICAgICByb290ZGlyID0gb3MucGF0aC5hYnNwYXRoKHNlbGYuYmRpc3RfZGlyKQorCisgICAgICAgIHJvb3QgPSBEaXJlY3RvcnkoZGIsIGNhYiwgTm9uZSwgcm9vdGRpciwgIlRBUkdFVERJUiIsICJTb3VyY2VEaXIiKQorICAgICAgICBmID0gRmVhdHVyZShkYiwgIlB5dGhvbiIsICJQeXRob24iLCAiRXZlcnl0aGluZyIsCisgICAgICAgICAgICAgICAgICAgIDAsIDEsIGRpcmVjdG9yeT0iVEFSR0VURElSIikKKworICAgICAgICBpdGVtcyA9IFsoZiwgcm9vdCwgJycpXQorICAgICAgICBmb3IgdmVyc2lvbiBpbiBzZWxmLnZlcnNpb25zICsgW3NlbGYub3RoZXJfdmVyc2lvbl06CisgICAgICAgICAgICB0YXJnZXQgPSAiVEFSR0VURElSIiArIHZlcnNpb24KKyAgICAgICAgICAgIG5hbWUgPSBkZWZhdWx0ID0gIlB5dGhvbiIgKyB2ZXJzaW9uCisgICAgICAgICAgICBkZXNjID0gIkV2ZXJ5dGhpbmciCisgICAgICAgICAgICBpZiB2ZXJzaW9uIGlzIHNlbGYub3RoZXJfdmVyc2lvbjoKKyAgICAgICAgICAgICAgICB0aXRsZSA9ICJQeXRob24gZnJvbSBhbm90aGVyIGxvY2F0aW9uIgorICAgICAgICAgICAgICAgIGxldmVsID0gMgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0aXRsZSA9ICJQeXRob24gJXMgZnJvbSByZWdpc3RyeSIgJSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgbGV2ZWwgPSAxCisgICAgICAgICAgICBmID0gRmVhdHVyZShkYiwgbmFtZSwgdGl0bGUsIGRlc2MsIDEsIGxldmVsLCBkaXJlY3Rvcnk9dGFyZ2V0KQorICAgICAgICAgICAgZGlyID0gRGlyZWN0b3J5KGRiLCBjYWIsIHJvb3QsIHJvb3RkaXIsIHRhcmdldCwgZGVmYXVsdCkKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZCgoZiwgZGlyLCB2ZXJzaW9uKSkKKyAgICAgICAgZGIuQ29tbWl0KCkKKworICAgICAgICBzZWVuID0ge30KKyAgICAgICAgZm9yIGZlYXR1cmUsIGRpciwgdmVyc2lvbiBpbiBpdGVtczoKKyAgICAgICAgICAgIHRvZG8gPSBbZGlyXQorICAgICAgICAgICAgd2hpbGUgdG9kbzoKKyAgICAgICAgICAgICAgICBkaXIgPSB0b2RvLnBvcCgpCisgICAgICAgICAgICAgICAgZm9yIGZpbGUgaW4gb3MubGlzdGRpcihkaXIuYWJzb2x1dGUpOgorICAgICAgICAgICAgICAgICAgICBhZmlsZSA9IG9zLnBhdGguam9pbihkaXIuYWJzb2x1dGUsIGZpbGUpCisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoYWZpbGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgPSAiJXN8JXMiICUgKGRpci5tYWtlX3Nob3J0KGZpbGUpLCBmaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA9IGZpbGUgKyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdkaXIgPSBEaXJlY3RvcnkoZGIsIGNhYiwgZGlyLCBmaWxlLCBkZWZhdWx0LCBzaG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvZG8uYXBwZW5kKG5ld2RpcikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBkaXIuY29tcG9uZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpci5zdGFydF9jb21wb25lbnQoZGlyLmxvZ2ljYWwsIGZlYXR1cmUsIDApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBhZmlsZSBub3QgaW4gc2VlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBzZWVuW2FmaWxlXSA9IGRpci5hZGRfZmlsZShmaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpbGU9PXNlbGYuaW5zdGFsbF9zY3JpcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9zY3JpcHRfa2V5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTXVsdGlwbGUgZmlsZXMgd2l0aCBuYW1lICVzIiAlIGZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHRfa2V5ID0gJ1sjJXNdJyAlIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBzZWVuW2FmaWxlXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJEdXBsaWNhdGVGaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhrZXkgKyB2ZXJzaW9uLCBkaXIuY29tcG9uZW50LCBrZXksIE5vbmUsIGRpci5sb2dpY2FsKV0pCisgICAgICAgICAgICBkYi5Db21taXQoKQorICAgICAgICBjYWIuY29tbWl0KGRiKQorCisgICAgZGVmIGFkZF9maW5kX3B5dGhvbihzZWxmKToKKyAgICAgICAgIiIiQWRkcyBjb2RlIHRvIHRoZSBpbnN0YWxsZXIgdG8gY29tcHV0ZSB0aGUgbG9jYXRpb24gb2YgUHl0aG9uLgorCisgICAgICAgIFByb3BlcnRpZXMgUFlUSE9OLk1BQ0hJTkUuWC5ZIGFuZCBQWVRIT04uVVNFUi5YLlkgd2lsbCBiZSBzZXQgZnJvbSB0aGUKKyAgICAgICAgcmVnaXN0cnkgZm9yIGVhY2ggdmVyc2lvbiBvZiBQeXRob24uCisKKyAgICAgICAgUHJvcGVydGllcyBUQVJHRVRESVJYLlkgd2lsbCBiZSBzZXQgZnJvbSBQWVRIT04uVVNFUi5YLlkgaWYgZGVmaW5lZCwKKyAgICAgICAgZWxzZSBmcm9tIFBZVEhPTi5NQUNISU5FLlguWS4KKworICAgICAgICBQcm9wZXJ0aWVzIFBZVEhPTlguWSB3aWxsIGJlIHNldCB0byBUQVJHRVRESVJYLllcXHB5dGhvbi5leGUiIiIKKworICAgICAgICBzdGFydCA9IDQwMgorICAgICAgICBmb3IgdmVyIGluIHNlbGYudmVyc2lvbnM6CisgICAgICAgICAgICBpbnN0YWxsX3BhdGggPSByIlNPRlRXQVJFXFB5dGhvblxQeXRob25Db3JlXCVzXEluc3RhbGxQYXRoIiAlIHZlcgorICAgICAgICAgICAgbWFjaGluZV9yZWcgPSAicHl0aG9uLm1hY2hpbmUuIiArIHZlcgorICAgICAgICAgICAgdXNlcl9yZWcgPSAicHl0aG9uLnVzZXIuIiArIHZlcgorICAgICAgICAgICAgbWFjaGluZV9wcm9wID0gIlBZVEhPTi5NQUNISU5FLiIgKyB2ZXIKKyAgICAgICAgICAgIHVzZXJfcHJvcCA9ICJQWVRIT04uVVNFUi4iICsgdmVyCisgICAgICAgICAgICBtYWNoaW5lX2FjdGlvbiA9ICJQeXRob25Gcm9tTWFjaGluZSIgKyB2ZXIKKyAgICAgICAgICAgIHVzZXJfYWN0aW9uID0gIlB5dGhvbkZyb21Vc2VyIiArIHZlcgorICAgICAgICAgICAgZXhlX2FjdGlvbiA9ICJQeXRob25FeGUiICsgdmVyCisgICAgICAgICAgICB0YXJnZXRfZGlyX3Byb3AgPSAiVEFSR0VURElSIiArIHZlcgorICAgICAgICAgICAgZXhlX3Byb3AgPSAiUFlUSE9OIiArIHZlcgorICAgICAgICAgICAgaWYgbXNpbGliLldpbjY0OgorICAgICAgICAgICAgICAgICMgdHlwZTogbXNpZGJMb2NhdG9yVHlwZVJhd1ZhbHVlICsgbXNpZGJMb2NhdG9yVHlwZTY0Yml0CisgICAgICAgICAgICAgICAgVHlwZSA9IDIrMTYKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgVHlwZSA9IDIKKyAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJSZWdMb2NhdG9yIiwKKyAgICAgICAgICAgICAgICAgICAgWyhtYWNoaW5lX3JlZywgMiwgaW5zdGFsbF9wYXRoLCBOb25lLCBUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICh1c2VyX3JlZywgMSwgaW5zdGFsbF9wYXRoLCBOb25lLCBUeXBlKV0pCisgICAgICAgICAgICBhZGRfZGF0YShzZWxmLmRiLCAiQXBwU2VhcmNoIiwKKyAgICAgICAgICAgICAgICAgICAgWyhtYWNoaW5lX3Byb3AsIG1hY2hpbmVfcmVnKSwKKyAgICAgICAgICAgICAgICAgICAgICh1c2VyX3Byb3AsIHVzZXJfcmVnKV0pCisgICAgICAgICAgICBhZGRfZGF0YShzZWxmLmRiLCAiQ3VzdG9tQWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgWyhtYWNoaW5lX2FjdGlvbiwgNTErMjU2LCB0YXJnZXRfZGlyX3Byb3AsICJbIiArIG1hY2hpbmVfcHJvcCArICJdIiksCisgICAgICAgICAgICAgICAgICAgICAodXNlcl9hY3Rpb24sIDUxKzI1NiwgdGFyZ2V0X2Rpcl9wcm9wLCAiWyIgKyB1c2VyX3Byb3AgKyAiXSIpLAorICAgICAgICAgICAgICAgICAgICAgKGV4ZV9hY3Rpb24sIDUxKzI1NiwgZXhlX3Byb3AsICJbIiArIHRhcmdldF9kaXJfcHJvcCArICJdXFxweXRob24uZXhlIiksCisgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICBhZGRfZGF0YShzZWxmLmRiLCAiSW5zdGFsbEV4ZWN1dGVTZXF1ZW5jZSIsCisgICAgICAgICAgICAgICAgICAgIFsobWFjaGluZV9hY3Rpb24sIG1hY2hpbmVfcHJvcCwgc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgKHVzZXJfYWN0aW9uLCB1c2VyX3Byb3AsIHN0YXJ0ICsgMSksCisgICAgICAgICAgICAgICAgICAgICAoZXhlX2FjdGlvbiwgTm9uZSwgc3RhcnQgKyAyKSwKKyAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJJbnN0YWxsVUlTZXF1ZW5jZSIsCisgICAgICAgICAgICAgICAgICAgIFsobWFjaGluZV9hY3Rpb24sIG1hY2hpbmVfcHJvcCwgc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgKHVzZXJfYWN0aW9uLCB1c2VyX3Byb3AsIHN0YXJ0ICsgMSksCisgICAgICAgICAgICAgICAgICAgICAoZXhlX2FjdGlvbiwgTm9uZSwgc3RhcnQgKyAyKSwKKyAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJDb25kaXRpb24iLAorICAgICAgICAgICAgICAgICAgICBbKCJQeXRob24iICsgdmVyLCAwLCAiTk9UIFRBUkdFVERJUiIgKyB2ZXIpXSkKKyAgICAgICAgICAgIHN0YXJ0ICs9IDQKKyAgICAgICAgICAgIGFzc2VydCBzdGFydCA8IDUwMAorCisgICAgZGVmIGFkZF9zY3JpcHRzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmluc3RhbGxfc2NyaXB0OgorICAgICAgICAgICAgc3RhcnQgPSA2ODAwCisgICAgICAgICAgICBmb3IgdmVyIGluIHNlbGYudmVyc2lvbnMgKyBbc2VsZi5vdGhlcl92ZXJzaW9uXToKKyAgICAgICAgICAgICAgICBpbnN0YWxsX2FjdGlvbiA9ICJpbnN0YWxsX3NjcmlwdC4iICsgdmVyCisgICAgICAgICAgICAgICAgZXhlX3Byb3AgPSAiUFlUSE9OIiArIHZlcgorICAgICAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJDdXN0b21BY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhpbnN0YWxsX2FjdGlvbiwgNTAsIGV4ZV9wcm9wLCBzZWxmLmluc3RhbGxfc2NyaXB0X2tleSldKQorICAgICAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJJbnN0YWxsRXhlY3V0ZVNlcXVlbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoaW5zdGFsbF9hY3Rpb24sICImUHl0aG9uJXM9MyIgJSB2ZXIsIHN0YXJ0KV0pCisgICAgICAgICAgICAgICAgc3RhcnQgKz0gMQorICAgICAgICAjIFhYWCBwcmUtaW5zdGFsbCBzY3JpcHRzIGFyZSBjdXJyZW50bHkgcmVmdXNlZCBpbiBmaW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgIyAgICAgYnV0IGlmIHRoaXMgZmVhdHVyZSBpcyBjb21wbGV0ZWQsIGl0IHdpbGwgYWxzbyBuZWVkIHRvIGFkZAorICAgICAgICAjICAgICBlbnRyaWVzIGZvciBlYWNoIHZlcnNpb24gYXMgdGhlIGFib3ZlIGNvZGUgZG9lcworICAgICAgICBpZiBzZWxmLnByZV9pbnN0YWxsX3NjcmlwdDoKKyAgICAgICAgICAgIHNjcmlwdGZuID0gb3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLCAicHJlaW5zdGFsbC5iYXQiKQorICAgICAgICAgICAgZiA9IG9wZW4oc2NyaXB0Zm4sICJ3IikKKyAgICAgICAgICAgICMgVGhlIGJhdGNoIGZpbGUgd2lsbCBiZSBleGVjdXRlZCB3aXRoIFtQWVRIT05dLCBzbyB0aGF0ICUxCisgICAgICAgICAgICAjIGlzIHRoZSBwYXRoIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXI7ICUwIHdpbGwgYmUgdGhlIHBhdGgKKyAgICAgICAgICAgICMgb2YgdGhlIGJhdGNoIGZpbGUuCisgICAgICAgICAgICAjIHJlbSA9IiIiCisgICAgICAgICAgICAjICUxICUwCisgICAgICAgICAgICAjIGV4aXQKKyAgICAgICAgICAgICMgIiIiCisgICAgICAgICAgICAjIDxhY3R1YWwgc2NyaXB0PgorICAgICAgICAgICAgZi53cml0ZSgncmVtID0iIiJcbiUxICUwXG5leGl0XG4iIiJcbicpCisgICAgICAgICAgICBmLndyaXRlKG9wZW4oc2VsZi5wcmVfaW5zdGFsbF9zY3JpcHQpLnJlYWQoKSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIkJpbmFyeSIsCisgICAgICAgICAgICAgICAgWygiUHJlSW5zdGFsbCIsIG1zaWxpYi5CaW5hcnkoc2NyaXB0Zm4pKQorICAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICBhZGRfZGF0YShzZWxmLmRiLCAiQ3VzdG9tQWN0aW9uIiwKKyAgICAgICAgICAgICAgICBbKCJQcmVJbnN0YWxsIiwgMiwgIlByZUluc3RhbGwiLCBOb25lKQorICAgICAgICAgICAgICAgIF0pCisgICAgICAgICAgICBhZGRfZGF0YShzZWxmLmRiLCAiSW5zdGFsbEV4ZWN1dGVTZXF1ZW5jZSIsCisgICAgICAgICAgICAgICAgICAgIFsoIlByZUluc3RhbGwiLCAiTk9UIEluc3RhbGxlZCIsIDQ1MCldKQorCisKKyAgICBkZWYgYWRkX3VpKHNlbGYpOgorICAgICAgICBkYiA9IHNlbGYuZGIKKyAgICAgICAgeCA9IHkgPSA1MAorICAgICAgICB3ID0gMzcwCisgICAgICAgIGggPSAzMDAKKyAgICAgICAgdGl0bGUgPSAiW1Byb2R1Y3ROYW1lXSBTZXR1cCIKKworICAgICAgICAjIHNlZSAiRGlhbG9nIFN0eWxlIEJpdHMiCisgICAgICAgIG1vZGFsID0gMyAgICAgICMgdmlzaWJsZSB8IG1vZGFsCisgICAgICAgIG1vZGVsZXNzID0gMSAgICMgdmlzaWJsZQorCisgICAgICAgICMgVUkgY3VzdG9taXphdGlvbiBwcm9wZXJ0aWVzCisgICAgICAgIGFkZF9kYXRhKGRiLCAiUHJvcGVydHkiLAorICAgICAgICAgICAgICAgICAjIFNlZSAiRGVmYXVsdFVJRm9udCBQcm9wZXJ0eSIKKyAgICAgICAgICAgICAgICAgWygiRGVmYXVsdFVJRm9udCIsICJEbGdGb250OCIpLAorICAgICAgICAgICAgICAgICAgIyBTZWUgIkVycm9yRGlhbG9nIFN0eWxlIEJpdCIKKyAgICAgICAgICAgICAgICAgICgiRXJyb3JEaWFsb2ciLCAiRXJyb3JEbGciKSwKKyAgICAgICAgICAgICAgICAgICgiUHJvZ3Jlc3MxIiwgIkluc3RhbGwiKSwgICAjIG1vZGlmaWVkIGluIG1haW50ZW5hbmNlIHR5cGUgZGxnCisgICAgICAgICAgICAgICAgICAoIlByb2dyZXNzMiIsICJpbnN0YWxscyIpLAorICAgICAgICAgICAgICAgICAgKCJNYWludGVuYW5jZUZvcm1fQWN0aW9uIiwgIlJlcGFpciIpLAorICAgICAgICAgICAgICAgICAgIyBwb3NzaWJsZSB2YWx1ZXM6IEFMTCwgSlVTVE1FCisgICAgICAgICAgICAgICAgICAoIldoaWNoVXNlcnMiLCAiQUxMIikKKyAgICAgICAgICAgICAgICAgXSkKKworICAgICAgICAjIEZvbnRzLCBzZWUgIlRleHRTdHlsZSBUYWJsZSIKKyAgICAgICAgYWRkX2RhdGEoZGIsICJUZXh0U3R5bGUiLAorICAgICAgICAgICAgICAgICBbKCJEbGdGb250OCIsICJUYWhvbWEiLCA5LCBOb25lLCAwKSwKKyAgICAgICAgICAgICAgICAgICgiRGxnRm9udEJvbGQ4IiwgIlRhaG9tYSIsIDgsIE5vbmUsIDEpLCAjYm9sZAorICAgICAgICAgICAgICAgICAgKCJWZXJkYW5hQm9sZDEwIiwgIlZlcmRhbmEiLCAxMCwgTm9uZSwgMSksCisgICAgICAgICAgICAgICAgICAoIlZlcmRhbmFSZWQ5IiwgIlZlcmRhbmEiLCA5LCAyNTUsIDApLAorICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgICMgVUkgU2VxdWVuY2VzLCBzZWUgIkluc3RhbGxVSVNlcXVlbmNlIFRhYmxlIiwgIlVzaW5nIGEgU2VxdWVuY2UgVGFibGUiCisgICAgICAgICMgTnVtYmVycyBpbmRpY2F0ZSBzZXF1ZW5jZTsgc2VlIHNlcXVlbmNlLnB5IGZvciBob3cgdGhlc2UgYWN0aW9uIGludGVncmF0ZQorICAgICAgICBhZGRfZGF0YShkYiwgIkluc3RhbGxVSVNlcXVlbmNlIiwKKyAgICAgICAgICAgICAgICAgWygiUHJlcGFyZURsZyIsICJOb3QgUHJpdmlsZWdlZCBvciBXaW5kb3dzOXggb3IgSW5zdGFsbGVkIiwgMTQwKSwKKyAgICAgICAgICAgICAgICAgICgiV2hpY2hVc2Vyc0RsZyIsICJQcml2aWxlZ2VkIGFuZCBub3QgV2luZG93czl4IGFuZCBub3QgSW5zdGFsbGVkIiwgMTQxKSwKKyAgICAgICAgICAgICAgICAgICMgSW4gdGhlIHVzZXIgaW50ZXJmYWNlLCBhc3N1bWUgYWxsLXVzZXJzIGluc3RhbGxhdGlvbiBpZiBwcml2aWxlZ2VkLgorICAgICAgICAgICAgICAgICAgKCJTZWxlY3RGZWF0dXJlc0RsZyIsICJOb3QgSW5zdGFsbGVkIiwgMTIzMCksCisgICAgICAgICAgICAgICAgICAjIFhYWCBubyBzdXBwb3J0IGZvciByZXN1bWUgaW5zdGFsbGF0aW9ucyB5ZXQKKyAgICAgICAgICAgICAgICAgICMoIlJlc3VtZURsZyIsICJJbnN0YWxsZWQgQU5EIChSRVNVTUUgT1IgUHJlc2VsZWN0ZWQpIiwgMTI0MCksCisgICAgICAgICAgICAgICAgICAoIk1haW50ZW5hbmNlVHlwZURsZyIsICJJbnN0YWxsZWQgQU5EIE5PVCBSRVNVTUUgQU5EIE5PVCBQcmVzZWxlY3RlZCIsIDEyNTApLAorICAgICAgICAgICAgICAgICAgKCJQcm9ncmVzc0RsZyIsIE5vbmUsIDEyODApXSkKKworICAgICAgICBhZGRfZGF0YShkYiwgJ0FjdGlvblRleHQnLCB0ZXh0LkFjdGlvblRleHQpCisgICAgICAgIGFkZF9kYXRhKGRiLCAnVUlUZXh0JywgdGV4dC5VSVRleHQpCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIFN0YW5kYXJkIGRpYWxvZ3M6IEZhdGFsRXJyb3IsIFVzZXJFeGl0LCBFeGl0RGlhbG9nCisgICAgICAgIGZhdGFsPVB5RGlhbG9nKGRiLCAiRmF0YWxFcnJvciIsIHgsIHksIHcsIGgsIG1vZGFsLCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICJGaW5pc2giLCAiRmluaXNoIiwgIkZpbmlzaCIpCisgICAgICAgIGZhdGFsLnRpdGxlKCJbUHJvZHVjdE5hbWVdIEluc3RhbGxlciBlbmRlZCBwcmVtYXR1cmVseSIpCisgICAgICAgIGZhdGFsLmJhY2soIjwgQmFjayIsICJGaW5pc2giLCBhY3RpdmUgPSAwKQorICAgICAgICBmYXRhbC5jYW5jZWwoIkNhbmNlbCIsICJCYWNrIiwgYWN0aXZlID0gMCkKKyAgICAgICAgZmF0YWwudGV4dCgiRGVzY3JpcHRpb24xIiwgMTUsIDcwLCAzMjAsIDgwLCAweDMwMDAzLAorICAgICAgICAgICAgICAgICAgICJbUHJvZHVjdE5hbWVdIHNldHVwIGVuZGVkIHByZW1hdHVyZWx5IGJlY2F1c2Ugb2YgYW4gZXJyb3IuICBZb3VyIHN5c3RlbSBoYXMgbm90IGJlZW4gbW9kaWZpZWQuICBUbyBpbnN0YWxsIHRoaXMgcHJvZ3JhbSBhdCBhIGxhdGVyIHRpbWUsIHBsZWFzZSBydW4gdGhlIGluc3RhbGxhdGlvbiBhZ2Fpbi4iKQorICAgICAgICBmYXRhbC50ZXh0KCJEZXNjcmlwdGlvbjIiLCAxNSwgMTU1LCAzMjAsIDIwLCAweDMwMDAzLAorICAgICAgICAgICAgICAgICAgICJDbGljayB0aGUgRmluaXNoIGJ1dHRvbiB0byBleGl0IHRoZSBJbnN0YWxsZXIuIikKKyAgICAgICAgYz1mYXRhbC5uZXh0KCJGaW5pc2giLCAiQ2FuY2VsIiwgbmFtZT0iRmluaXNoIikKKyAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIkV4aXQiKQorCisgICAgICAgIHVzZXJfZXhpdD1QeURpYWxvZyhkYiwgIlVzZXJFeGl0IiwgeCwgeSwgdywgaCwgbW9kYWwsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgIkZpbmlzaCIsICJGaW5pc2giLCAiRmluaXNoIikKKyAgICAgICAgdXNlcl9leGl0LnRpdGxlKCJbUHJvZHVjdE5hbWVdIEluc3RhbGxlciB3YXMgaW50ZXJydXB0ZWQiKQorICAgICAgICB1c2VyX2V4aXQuYmFjaygiPCBCYWNrIiwgIkZpbmlzaCIsIGFjdGl2ZSA9IDApCisgICAgICAgIHVzZXJfZXhpdC5jYW5jZWwoIkNhbmNlbCIsICJCYWNrIiwgYWN0aXZlID0gMCkKKyAgICAgICAgdXNlcl9leGl0LnRleHQoIkRlc2NyaXB0aW9uMSIsIDE1LCA3MCwgMzIwLCA4MCwgMHgzMDAwMywKKyAgICAgICAgICAgICAgICAgICAiW1Byb2R1Y3ROYW1lXSBzZXR1cCB3YXMgaW50ZXJydXB0ZWQuICBZb3VyIHN5c3RlbSBoYXMgbm90IGJlZW4gbW9kaWZpZWQuICAiCisgICAgICAgICAgICAgICAgICAgIlRvIGluc3RhbGwgdGhpcyBwcm9ncmFtIGF0IGEgbGF0ZXIgdGltZSwgcGxlYXNlIHJ1biB0aGUgaW5zdGFsbGF0aW9uIGFnYWluLiIpCisgICAgICAgIHVzZXJfZXhpdC50ZXh0KCJEZXNjcmlwdGlvbjIiLCAxNSwgMTU1LCAzMjAsIDIwLCAweDMwMDAzLAorICAgICAgICAgICAgICAgICAgICJDbGljayB0aGUgRmluaXNoIGJ1dHRvbiB0byBleGl0IHRoZSBJbnN0YWxsZXIuIikKKyAgICAgICAgYyA9IHVzZXJfZXhpdC5uZXh0KCJGaW5pc2giLCAiQ2FuY2VsIiwgbmFtZT0iRmluaXNoIikKKyAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIkV4aXQiKQorCisgICAgICAgIGV4aXRfZGlhbG9nID0gUHlEaWFsb2coZGIsICJFeGl0RGlhbG9nIiwgeCwgeSwgdywgaCwgbW9kYWwsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmluaXNoIiwgIkZpbmlzaCIsICJGaW5pc2giKQorICAgICAgICBleGl0X2RpYWxvZy50aXRsZSgiQ29tcGxldGluZyB0aGUgW1Byb2R1Y3ROYW1lXSBJbnN0YWxsZXIiKQorICAgICAgICBleGl0X2RpYWxvZy5iYWNrKCI8IEJhY2siLCAiRmluaXNoIiwgYWN0aXZlID0gMCkKKyAgICAgICAgZXhpdF9kaWFsb2cuY2FuY2VsKCJDYW5jZWwiLCAiQmFjayIsIGFjdGl2ZSA9IDApCisgICAgICAgIGV4aXRfZGlhbG9nLnRleHQoIkRlc2NyaXB0aW9uIiwgMTUsIDIzNSwgMzIwLCAyMCwgMHgzMDAwMywKKyAgICAgICAgICAgICAgICAgICAiQ2xpY2sgdGhlIEZpbmlzaCBidXR0b24gdG8gZXhpdCB0aGUgSW5zdGFsbGVyLiIpCisgICAgICAgIGMgPSBleGl0X2RpYWxvZy5uZXh0KCJGaW5pc2giLCAiQ2FuY2VsIiwgbmFtZT0iRmluaXNoIikKKyAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIlJldHVybiIpCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgUmVxdWlyZWQgZGlhbG9nOiBGaWxlc0luVXNlLCBFcnJvckRsZworICAgICAgICBpbnVzZSA9IFB5RGlhbG9nKGRiLCAiRmlsZXNJblVzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgdywgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAxOSwgICAgICAgICAgICAgICAgIyBLZWVwTW9kZWxlc3N8TW9kYWx8VmlzaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICJSZXRyeSIsICJSZXRyeSIsICJSZXRyeSIsIGJpdG1hcD1GYWxzZSkKKyAgICAgICAgaW51c2UudGV4dCgiVGl0bGUiLCAxNSwgNiwgMjAwLCAxNSwgMHgzMDAwMywKKyAgICAgICAgICAgICAgICAgICByIntcRGxnRm9udEJvbGQ4fUZpbGVzIGluIFVzZSIpCisgICAgICAgIGludXNlLnRleHQoIkRlc2NyaXB0aW9uIiwgMjAsIDIzLCAyODAsIDIwLCAweDMwMDAzLAorICAgICAgICAgICAgICAgIlNvbWUgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQgYXJlIGN1cnJlbnRseSBpbiB1c2UuIikKKyAgICAgICAgaW51c2UudGV4dCgiVGV4dCIsIDIwLCA1NSwgMzMwLCA1MCwgMywKKyAgICAgICAgICAgICAgICAgICAiVGhlIGZvbGxvd2luZyBhcHBsaWNhdGlvbnMgYXJlIHVzaW5nIGZpbGVzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkIGJ5IHRoaXMgc2V0dXAuIENsb3NlIHRoZXNlIGFwcGxpY2F0aW9ucyBhbmQgdGhlbiBjbGljayBSZXRyeSB0byBjb250aW51ZSB0aGUgaW5zdGFsbGF0aW9uIG9yIENhbmNlbCB0byBleGl0IGl0LiIpCisgICAgICAgIGludXNlLmNvbnRyb2woIkxpc3QiLCAiTGlzdEJveCIsIDIwLCAxMDcsIDMzMCwgMTMwLCA3LCAiRmlsZUluVXNlUHJvY2VzcyIsCisgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgYz1pbnVzZS5iYWNrKCJFeGl0IiwgIklnbm9yZSIsIG5hbWU9IkV4aXQiKQorICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCAiRXhpdCIpCisgICAgICAgIGM9aW51c2UubmV4dCgiSWdub3JlIiwgIlJldHJ5IiwgbmFtZT0iSWdub3JlIikKKyAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIklnbm9yZSIpCisgICAgICAgIGM9aW51c2UuY2FuY2VsKCJSZXRyeSIsICJFeGl0IiwgbmFtZT0iUmV0cnkiKQorICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCJSZXRyeSIpCisKKyAgICAgICAgIyBTZWUgIkVycm9yIERpYWxvZyIuIFNlZSAiSUNFMjAiIGZvciB0aGUgcmVxdWlyZWQgbmFtZXMgb2YgdGhlIGNvbnRyb2xzLgorICAgICAgICBlcnJvciA9IERpYWxvZyhkYiwgIkVycm9yRGxnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgNTAsIDEwLCAzMzAsIDEwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgNjU1NDMsICAgICAgICMgRXJyb3J8TWluaW1pemV8TW9kYWx8VmlzaWJsZQorICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yVGV4dCIsIE5vbmUsIE5vbmUpCisgICAgICAgIGVycm9yLnRleHQoIkVycm9yVGV4dCIsIDUwLDksMjgwLDQ4LDMsICIiKQorICAgICAgICAjZXJyb3IuY29udHJvbCgiRXJyb3JJY29uIiwgIkljb24iLCAxNSwgOSwgMjQsIDI0LCA1MjQyODgxLCBOb25lLCAicHkuaWNvIiwgTm9uZSwgTm9uZSkKKyAgICAgICAgZXJyb3IucHVzaGJ1dHRvbigiTiIsMTIwLDcyLDgxLDIxLDMsIk5vIixOb25lKS5ldmVudCgiRW5kRGlhbG9nIiwiRXJyb3JObyIpCisgICAgICAgIGVycm9yLnB1c2hidXR0b24oIlkiLDI0MCw3Miw4MSwyMSwzLCJZZXMiLE5vbmUpLmV2ZW50KCJFbmREaWFsb2ciLCJFcnJvclllcyIpCisgICAgICAgIGVycm9yLnB1c2hidXR0b24oIkEiLDAsNzIsODEsMjEsMywiQWJvcnQiLE5vbmUpLmV2ZW50KCJFbmREaWFsb2ciLCJFcnJvckFib3J0IikKKyAgICAgICAgZXJyb3IucHVzaGJ1dHRvbigiQyIsNDIsNzIsODEsMjEsMywiQ2FuY2VsIixOb25lKS5ldmVudCgiRW5kRGlhbG9nIiwiRXJyb3JDYW5jZWwiKQorICAgICAgICBlcnJvci5wdXNoYnV0dG9uKCJJIiw4MSw3Miw4MSwyMSwzLCJJZ25vcmUiLE5vbmUpLmV2ZW50KCJFbmREaWFsb2ciLCJFcnJvcklnbm9yZSIpCisgICAgICAgIGVycm9yLnB1c2hidXR0b24oIk8iLDE1OSw3Miw4MSwyMSwzLCJPayIsTm9uZSkuZXZlbnQoIkVuZERpYWxvZyIsIkVycm9yT2siKQorICAgICAgICBlcnJvci5wdXNoYnV0dG9uKCJSIiwxOTgsNzIsODEsMjEsMywiUmV0cnkiLE5vbmUpLmV2ZW50KCJFbmREaWFsb2ciLCJFcnJvclJldHJ5IikKKworICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyBHbG9iYWwgIlF1ZXJ5IENhbmNlbCIgZGlhbG9nCisgICAgICAgIGNhbmNlbCA9IERpYWxvZyhkYiwgIkNhbmNlbERsZyIsIDUwLCAxMCwgMjYwLCA4NSwgMywgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8iLCAiTm8iLCAiTm8iKQorICAgICAgICBjYW5jZWwudGV4dCgiVGV4dCIsIDQ4LCAxNSwgMTk0LCAzMCwgMywKKyAgICAgICAgICAgICAgICAgICAgIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjYW5jZWwgW1Byb2R1Y3ROYW1lXSBpbnN0YWxsYXRpb24/IikKKyAgICAgICAgI2NhbmNlbC5jb250cm9sKCJJY29uIiwgIkljb24iLCAxNSwgMTUsIDI0LCAyNCwgNTI0Mjg4MSwgTm9uZSwKKyAgICAgICAgIyAgICAgICAgICAgICAgICJweS5pY28iLCBOb25lLCBOb25lKQorICAgICAgICBjPWNhbmNlbC5wdXNoYnV0dG9uKCJZZXMiLCA3MiwgNTcsIDU2LCAxNywgMywgIlllcyIsICJObyIpCisgICAgICAgIGMuZXZlbnQoIkVuZERpYWxvZyIsICJFeGl0IikKKworICAgICAgICBjPWNhbmNlbC5wdXNoYnV0dG9uKCJObyIsIDEzMiwgNTcsIDU2LCAxNywgMywgIk5vIiwgIlllcyIpCisgICAgICAgIGMuZXZlbnQoIkVuZERpYWxvZyIsICJSZXR1cm4iKQorCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIEdsb2JhbCAiV2FpdCBmb3IgY29zdGluZyIgZGlhbG9nCisgICAgICAgIGNvc3RpbmcgPSBEaWFsb2coZGIsICJXYWl0Rm9yQ29zdGluZ0RsZyIsIDUwLCAxMCwgMjYwLCA4NSwgbW9kYWwsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICJSZXR1cm4iLCAiUmV0dXJuIiwgIlJldHVybiIpCisgICAgICAgIGNvc3RpbmcudGV4dCgiVGV4dCIsIDQ4LCAxNSwgMTk0LCAzMCwgMywKKyAgICAgICAgICAgICAgICAgICAgICJQbGVhc2Ugd2FpdCB3aGlsZSB0aGUgaW5zdGFsbGVyIGZpbmlzaGVzIGRldGVybWluaW5nIHlvdXIgZGlzayBzcGFjZSByZXF1aXJlbWVudHMuIikKKyAgICAgICAgYyA9IGNvc3RpbmcucHVzaGJ1dHRvbigiUmV0dXJuIiwgMTAyLCA1NywgNTYsIDE3LCAzLCAiUmV0dXJuIiwgTm9uZSkKKyAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIkV4aXQiKQorCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIFByZXBhcmF0aW9uIGRpYWxvZzogbm8gdXNlciBpbnB1dCBleGNlcHQgY2FuY2VsbGF0aW9uCisgICAgICAgIHByZXAgPSBQeURpYWxvZyhkYiwgIlByZXBhcmVEbGciLCB4LCB5LCB3LCBoLCBtb2RlbGVzcywgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuY2VsIiwgIkNhbmNlbCIsICJDYW5jZWwiKQorICAgICAgICBwcmVwLnRleHQoIkRlc2NyaXB0aW9uIiwgMTUsIDcwLCAzMjAsIDQwLCAweDMwMDAzLAorICAgICAgICAgICAgICAgICAgIlBsZWFzZSB3YWl0IHdoaWxlIHRoZSBJbnN0YWxsZXIgcHJlcGFyZXMgdG8gZ3VpZGUgeW91IHRocm91Z2ggdGhlIGluc3RhbGxhdGlvbi4iKQorICAgICAgICBwcmVwLnRpdGxlKCJXZWxjb21lIHRvIHRoZSBbUHJvZHVjdE5hbWVdIEluc3RhbGxlciIpCisgICAgICAgIGM9cHJlcC50ZXh0KCJBY3Rpb25UZXh0IiwgMTUsIDExMCwgMzIwLCAyMCwgMHgzMDAwMywgIlBvbmRlcmluZy4uLiIpCisgICAgICAgIGMubWFwcGluZygiQWN0aW9uVGV4dCIsICJUZXh0IikKKyAgICAgICAgYz1wcmVwLnRleHQoIkFjdGlvbkRhdGEiLCAxNSwgMTM1LCAzMjAsIDMwLCAweDMwMDAzLCBOb25lKQorICAgICAgICBjLm1hcHBpbmcoIkFjdGlvbkRhdGEiLCAiVGV4dCIpCisgICAgICAgIHByZXAuYmFjaygiQmFjayIsIE5vbmUsIGFjdGl2ZT0wKQorICAgICAgICBwcmVwLm5leHQoIk5leHQiLCBOb25lLCBhY3RpdmU9MCkKKyAgICAgICAgYz1wcmVwLmNhbmNlbCgiQ2FuY2VsIiwgTm9uZSkKKyAgICAgICAgYy5ldmVudCgiU3Bhd25EaWFsb2ciLCAiQ2FuY2VsRGxnIikKKworICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyBGZWF0dXJlIChQeXRob24gZGlyZWN0b3J5KSBzZWxlY3Rpb24KKyAgICAgICAgc2VsZGxnID0gUHlEaWFsb2coZGIsICJTZWxlY3RGZWF0dXJlc0RsZyIsIHgsIHksIHcsIGgsIG1vZGFsLCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOZXh0IiwgIk5leHQiLCAiQ2FuY2VsIikKKyAgICAgICAgc2VsZGxnLnRpdGxlKCJTZWxlY3QgUHl0aG9uIEluc3RhbGxhdGlvbnMiKQorCisgICAgICAgIHNlbGRsZy50ZXh0KCJIaW50IiwgMTUsIDMwLCAzMDAsIDIwLCAzLAorICAgICAgICAgICAgICAgICAgICAiU2VsZWN0IHRoZSBQeXRob24gbG9jYXRpb25zIHdoZXJlICVzIHNob3VsZCBiZSBpbnN0YWxsZWQuIgorICAgICAgICAgICAgICAgICAgICAlIHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpKQorCisgICAgICAgIHNlbGRsZy5iYWNrKCI8IEJhY2siLCBOb25lLCBhY3RpdmU9MCkKKyAgICAgICAgYyA9IHNlbGRsZy5uZXh0KCJOZXh0ID4iLCAiQ2FuY2VsIikKKyAgICAgICAgb3JkZXIgPSAxCisgICAgICAgIGMuZXZlbnQoIltUQVJHRVRESVJdIiwgIltTb3VyY2VEaXJdIiwgb3JkZXJpbmc9b3JkZXIpCisgICAgICAgIGZvciB2ZXJzaW9uIGluIHNlbGYudmVyc2lvbnMgKyBbc2VsZi5vdGhlcl92ZXJzaW9uXToKKyAgICAgICAgICAgIG9yZGVyICs9IDEKKyAgICAgICAgICAgIGMuZXZlbnQoIltUQVJHRVRESVJdIiwgIltUQVJHRVRESVIlc10iICUgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgIkZFQVRVUkVfU0VMRUNURUQgQU5EICZQeXRob24lcz0zIiAlIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIG9yZGVyaW5nPW9yZGVyKQorICAgICAgICBjLmV2ZW50KCJTcGF3bldhaXREaWFsb2ciLCAiV2FpdEZvckNvc3RpbmdEbGciLCBvcmRlcmluZz1vcmRlciArIDEpCisgICAgICAgIGMuZXZlbnQoIkVuZERpYWxvZyIsICJSZXR1cm4iLCBvcmRlcmluZz1vcmRlciArIDIpCisgICAgICAgIGMgPSBzZWxkbGcuY2FuY2VsKCJDYW5jZWwiLCAiRmVhdHVyZXMiKQorICAgICAgICBjLmV2ZW50KCJTcGF3bkRpYWxvZyIsICJDYW5jZWxEbGciKQorCisgICAgICAgIGMgPSBzZWxkbGcuY29udHJvbCgiRmVhdHVyZXMiLCAiU2VsZWN0aW9uVHJlZSIsIDE1LCA2MCwgMzAwLCAxMjAsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkVBVFVSRSIsIE5vbmUsICJQYXRoRWRpdCIsIE5vbmUpCisgICAgICAgIGMuZXZlbnQoIltGRUFUVVJFX1NFTEVDVEVEXSIsICIxIikKKyAgICAgICAgdmVyID0gc2VsZi5vdGhlcl92ZXJzaW9uCisgICAgICAgIGluc3RhbGxfb3RoZXJfY29uZCA9ICJGRUFUVVJFX1NFTEVDVEVEIEFORCAmUHl0aG9uJXM9MyIgJSB2ZXIKKyAgICAgICAgZG9udF9pbnN0YWxsX290aGVyX2NvbmQgPSAiRkVBVFVSRV9TRUxFQ1RFRCBBTkQgJlB5dGhvbiVzPD4zIiAlIHZlcgorCisgICAgICAgIGMgPSBzZWxkbGcudGV4dCgiT3RoZXIiLCAxNSwgMjAwLCAzMDAsIDE1LCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgIlByb3ZpZGUgYW4gYWx0ZXJuYXRlIFB5dGhvbiBsb2NhdGlvbiIpCisgICAgICAgIGMuY29uZGl0aW9uKCJFbmFibGUiLCBpbnN0YWxsX290aGVyX2NvbmQpCisgICAgICAgIGMuY29uZGl0aW9uKCJTaG93IiwgaW5zdGFsbF9vdGhlcl9jb25kKQorICAgICAgICBjLmNvbmRpdGlvbigiRGlzYWJsZSIsIGRvbnRfaW5zdGFsbF9vdGhlcl9jb25kKQorICAgICAgICBjLmNvbmRpdGlvbigiSGlkZSIsIGRvbnRfaW5zdGFsbF9vdGhlcl9jb25kKQorCisgICAgICAgIGMgPSBzZWxkbGcuY29udHJvbCgiUGF0aEVkaXQiLCAiUGF0aEVkaXQiLCAxNSwgMjE1LCAzMDAsIDE2LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRBUkdFVERJUiIgKyB2ZXIsIE5vbmUsICJOZXh0IiwgTm9uZSkKKyAgICAgICAgYy5jb25kaXRpb24oIkVuYWJsZSIsIGluc3RhbGxfb3RoZXJfY29uZCkKKyAgICAgICAgYy5jb25kaXRpb24oIlNob3ciLCBpbnN0YWxsX290aGVyX2NvbmQpCisgICAgICAgIGMuY29uZGl0aW9uKCJEaXNhYmxlIiwgZG9udF9pbnN0YWxsX290aGVyX2NvbmQpCisgICAgICAgIGMuY29uZGl0aW9uKCJIaWRlIiwgZG9udF9pbnN0YWxsX290aGVyX2NvbmQpCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgRGlzayBjb3N0CisgICAgICAgIGNvc3QgPSBQeURpYWxvZyhkYiwgIkRpc2tDb3N0RGxnIiwgeCwgeSwgdywgaCwgbW9kYWwsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIk9LIiwgIk9LIiwgIk9LIiwgYml0bWFwPUZhbHNlKQorICAgICAgICBjb3N0LnRleHQoIlRpdGxlIiwgMTUsIDYsIDIwMCwgMTUsIDB4MzAwMDMsCisgICAgICAgICAgICAgICAgICAie1xEbGdGb250Qm9sZDh9RGlzayBTcGFjZSBSZXF1aXJlbWVudHMiKQorICAgICAgICBjb3N0LnRleHQoIkRlc2NyaXB0aW9uIiwgMjAsIDIwLCAyODAsIDIwLCAweDMwMDAzLAorICAgICAgICAgICAgICAgICAgIlRoZSBkaXNrIHNwYWNlIHJlcXVpcmVkIGZvciB0aGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBzZWxlY3RlZCBmZWF0dXJlcy4iKQorICAgICAgICBjb3N0LnRleHQoIlRleHQiLCAyMCwgNTMsIDMzMCwgNjAsIDMsCisgICAgICAgICAgICAgICAgICAiVGhlIGhpZ2hsaWdodGVkIHZvbHVtZXMgKGlmIGFueSkgZG8gbm90IGhhdmUgZW5vdWdoIGRpc2sgc3BhY2UgIgorICAgICAgICAgICAgICAiYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGZlYXR1cmVzLiAgWW91IGNhbiBlaXRoZXIgIgorICAgICAgICAgICAgICAicmVtb3ZlIHNvbWUgZmlsZXMgZnJvbSB0aGUgaGlnaGxpZ2h0ZWQgdm9sdW1lcywgb3IgY2hvb3NlIHRvICIKKyAgICAgICAgICAgICAgImluc3RhbGwgbGVzcyBmZWF0dXJlcyBvbnRvIGxvY2FsIGRyaXZlKHMpLCBvciBzZWxlY3QgZGlmZmVyZW50ICIKKyAgICAgICAgICAgICAgImRlc3RpbmF0aW9uIGRyaXZlKHMpLiIpCisgICAgICAgIGNvc3QuY29udHJvbCgiVm9sdW1lTGlzdCIsICJWb2x1bWVDb3N0TGlzdCIsIDIwLCAxMDAsIDMzMCwgMTUwLCAzOTMyMjMsCisgICAgICAgICAgICAgICAgICAgICBOb25lLCAiezEyMH17NzB9ezcwfXs3MH17NzB9IiwgTm9uZSwgTm9uZSkKKyAgICAgICAgY29zdC54YnV0dG9uKCJPSyIsICJPayIsIE5vbmUsIDAuNSkuZXZlbnQoIkVuZERpYWxvZyIsICJSZXR1cm4iKQorCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIFdoaWNoVXNlcnMgRGlhbG9nLiBPbmx5IGF2YWlsYWJsZSBvbiBOVCwgYW5kIGZvciBwcml2aWxlZ2VkIHVzZXJzLgorICAgICAgICAjIFRoaXMgbXVzdCBiZSBydW4gYmVmb3JlIEZpbmRSZWxhdGVkUHJvZHVjdHMsIGJlY2F1c2UgdGhhdCB3aWxsCisgICAgICAgICMgdGFrZSBpbnRvIGFjY291bnQgd2hldGhlciB0aGUgcHJldmlvdXMgaW5zdGFsbGF0aW9uIHdhcyBwZXItdXNlcgorICAgICAgICAjIG9yIHBlci1tYWNoaW5lLiBXZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBnb2luZyBiYWNrIHRvIHRoaXMKKyAgICAgICAgIyBkaWFsb2cgYWZ0ZXIgIk5leHQiIHdhcyBzZWxlY3RlZDsgdG8gc3VwcG9ydCB0aGlzLCB3ZSB3b3VsZCBuZWVkIHRvCisgICAgICAgICMgZmluZCBob3cgdG8gcmVzZXQgdGhlIEFMTFVTRVJTIHByb3BlcnR5LCBhbmQgaG93IHRvIHJlLXJ1bgorICAgICAgICAjIEZpbmRSZWxhdGVkUHJvZHVjdHMuCisgICAgICAgICMgT24gV2luZG93czl4LCB0aGUgQUxMVVNFUlMgcHJvcGVydHkgaXMgaWdub3JlZCBvbiB0aGUgY29tbWFuZCBsaW5lCisgICAgICAgICMgYW5kIGluIHRoZSBQcm9wZXJ0eSB0YWJsZSwgYnV0IGluc3RhbGxlciBmYWlscyBhY2NvcmRpbmcgdG8gdGhlIGRvY3VtZW50YXRpb24KKyAgICAgICAgIyBpZiBhIGRpYWxvZyBhdHRlbXB0cyB0byBzZXQgQUxMVVNFUlMuCisgICAgICAgIHdoaWNodXNlcnMgPSBQeURpYWxvZyhkYiwgIldoaWNoVXNlcnNEbGciLCB4LCB5LCB3LCBoLCBtb2RhbCwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFkbWluSW5zdGFsbCIsICJOZXh0IiwgIkNhbmNlbCIpCisgICAgICAgIHdoaWNodXNlcnMudGl0bGUoIlNlbGVjdCB3aGV0aGVyIHRvIGluc3RhbGwgW1Byb2R1Y3ROYW1lXSBmb3IgYWxsIHVzZXJzIG9mIHRoaXMgY29tcHV0ZXIuIikKKyAgICAgICAgIyBBIHJhZGlvIGdyb3VwIHdpdGggdHdvIG9wdGlvbnM6IGFsbHVzZXJzLCBqdXN0bWUKKyAgICAgICAgZyA9IHdoaWNodXNlcnMucmFkaW9ncm91cCgiQWRtaW5JbnN0YWxsIiwgMTUsIDYwLCAyNjAsIDUwLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGljaFVzZXJzIiwgIiIsICJOZXh0IikKKyAgICAgICAgZy5hZGQoIkFMTCIsIDAsIDUsIDE1MCwgMjAsICJJbnN0YWxsIGZvciBhbGwgdXNlcnMiKQorICAgICAgICBnLmFkZCgiSlVTVE1FIiwgMCwgMjUsIDE1MCwgMjAsICJJbnN0YWxsIGp1c3QgZm9yIG1lIikKKworICAgICAgICB3aGljaHVzZXJzLmJhY2soIkJhY2siLCBOb25lLCBhY3RpdmU9MCkKKworICAgICAgICBjID0gd2hpY2h1c2Vycy5uZXh0KCJOZXh0ID4iLCAiQ2FuY2VsIikKKyAgICAgICAgYy5ldmVudCgiW0FMTFVTRVJTXSIsICIxIiwgJ1doaWNoVXNlcnM9IkFMTCInLCAxKQorICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCAiUmV0dXJuIiwgb3JkZXJpbmcgPSAyKQorCisgICAgICAgIGMgPSB3aGljaHVzZXJzLmNhbmNlbCgiQ2FuY2VsIiwgIkFkbWluSW5zdGFsbCIpCisgICAgICAgIGMuZXZlbnQoIlNwYXduRGlhbG9nIiwgIkNhbmNlbERsZyIpCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgSW5zdGFsbGF0aW9uIFByb2dyZXNzIGRpYWxvZyAobW9kZWxlc3MpCisgICAgICAgIHByb2dyZXNzID0gUHlEaWFsb2coZGIsICJQcm9ncmVzc0RsZyIsIHgsIHksIHcsIGgsIG1vZGVsZXNzLCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuY2VsIiwgIkNhbmNlbCIsICJDYW5jZWwiLCBiaXRtYXA9RmFsc2UpCisgICAgICAgIHByb2dyZXNzLnRleHQoIlRpdGxlIiwgMjAsIDE1LCAyMDAsIDE1LCAweDMwMDAzLAorICAgICAgICAgICAgICAgICAgICAgICJ7XERsZ0ZvbnRCb2xkOH1bUHJvZ3Jlc3MxXSBbUHJvZHVjdE5hbWVdIikKKyAgICAgICAgcHJvZ3Jlc3MudGV4dCgiVGV4dCIsIDM1LCA2NSwgMzAwLCAzMCwgMywKKyAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHdhaXQgd2hpbGUgdGhlIEluc3RhbGxlciBbUHJvZ3Jlc3MyXSBbUHJvZHVjdE5hbWVdLiAiCisgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgbWF5IHRha2Ugc2V2ZXJhbCBtaW51dGVzLiIpCisgICAgICAgIHByb2dyZXNzLnRleHQoIlN0YXR1c0xhYmVsIiwgMzUsIDEwMCwgMzUsIDIwLCAzLCAiU3RhdHVzOiIpCisKKyAgICAgICAgYz1wcm9ncmVzcy50ZXh0KCJBY3Rpb25UZXh0IiwgNzAsIDEwMCwgdy03MCwgMjAsIDMsICJQb25kZXJpbmcuLi4iKQorICAgICAgICBjLm1hcHBpbmcoIkFjdGlvblRleHQiLCAiVGV4dCIpCisKKyAgICAgICAgI2M9cHJvZ3Jlc3MudGV4dCgiQWN0aW9uRGF0YSIsIDM1LCAxNDAsIDMwMCwgMjAsIDMsIE5vbmUpCisgICAgICAgICNjLm1hcHBpbmcoIkFjdGlvbkRhdGEiLCAiVGV4dCIpCisKKyAgICAgICAgYz1wcm9ncmVzcy5jb250cm9sKCJQcm9ncmVzc0JhciIsICJQcm9ncmVzc0JhciIsIDM1LCAxMjAsIDMwMCwgMTAsIDY1NTM3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgIlByb2dyZXNzIGRvbmUiLCBOb25lLCBOb25lKQorICAgICAgICBjLm1hcHBpbmcoIlNldFByb2dyZXNzIiwgIlByb2dyZXNzIikKKworICAgICAgICBwcm9ncmVzcy5iYWNrKCI8IEJhY2siLCAiTmV4dCIsIGFjdGl2ZT1GYWxzZSkKKyAgICAgICAgcHJvZ3Jlc3MubmV4dCgiTmV4dCA+IiwgIkNhbmNlbCIsIGFjdGl2ZT1GYWxzZSkKKyAgICAgICAgcHJvZ3Jlc3MuY2FuY2VsKCJDYW5jZWwiLCAiQmFjayIpLmV2ZW50KCJTcGF3bkRpYWxvZyIsICJDYW5jZWxEbGciKQorCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyBNYWludGVuYW5jZSB0eXBlOiByZXBhaXIvdW5pbnN0YWxsCisgICAgICAgIG1haW50ID0gUHlEaWFsb2coZGIsICJNYWludGVuYW5jZVR5cGVEbGciLCB4LCB5LCB3LCBoLCBtb2RhbCwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk5leHQiLCAiTmV4dCIsICJDYW5jZWwiKQorICAgICAgICBtYWludC50aXRsZSgiV2VsY29tZSB0byB0aGUgW1Byb2R1Y3ROYW1lXSBTZXR1cCBXaXphcmQiKQorICAgICAgICBtYWludC50ZXh0KCJCb2R5VGV4dCIsIDE1LCA2MywgMzMwLCA0MiwgMywKKyAgICAgICAgICAgICAgICAgICAiU2VsZWN0IHdoZXRoZXIgeW91IHdhbnQgdG8gcmVwYWlyIG9yIHJlbW92ZSBbUHJvZHVjdE5hbWVdLiIpCisgICAgICAgIGc9bWFpbnQucmFkaW9ncm91cCgiUmVwYWlyUmFkaW9Hcm91cCIsIDE1LCAxMDgsIDMzMCwgNjAsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1haW50ZW5hbmNlRm9ybV9BY3Rpb24iLCAiIiwgIk5leHQiKQorICAgICAgICAjZy5hZGQoIkNoYW5nZSIsIDAsIDAsIDIwMCwgMTcsICImQ2hhbmdlIFtQcm9kdWN0TmFtZV0iKQorICAgICAgICBnLmFkZCgiUmVwYWlyIiwgMCwgMTgsIDIwMCwgMTcsICImUmVwYWlyIFtQcm9kdWN0TmFtZV0iKQorICAgICAgICBnLmFkZCgiUmVtb3ZlIiwgMCwgMzYsIDIwMCwgMTcsICJSZSZtb3ZlIFtQcm9kdWN0TmFtZV0iKQorCisgICAgICAgIG1haW50LmJhY2soIjwgQmFjayIsIE5vbmUsIGFjdGl2ZT1GYWxzZSkKKyAgICAgICAgYz1tYWludC5uZXh0KCJGaW5pc2giLCAiQ2FuY2VsIikKKyAgICAgICAgIyBDaGFuZ2UgaW5zdGFsbGF0aW9uOiBDaGFuZ2UgcHJvZ3Jlc3MgZGlhbG9nIHRvICJDaGFuZ2UiLCB0aGVuIGFzaworICAgICAgICAjIGZvciBmZWF0dXJlIHNlbGVjdGlvbgorICAgICAgICAjYy5ldmVudCgiW1Byb2dyZXNzMV0iLCAiQ2hhbmdlIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IkNoYW5nZSInLCAxKQorICAgICAgICAjYy5ldmVudCgiW1Byb2dyZXNzMl0iLCAiY2hhbmdlcyIsICdNYWludGVuYW5jZUZvcm1fQWN0aW9uPSJDaGFuZ2UiJywgMikKKworICAgICAgICAjIFJlaW5zdGFsbDogQ2hhbmdlIHByb2dyZXNzIGRpYWxvZyB0byAiUmVwYWlyIiwgdGhlbiBpbnZva2UgcmVpbnN0YWxsCisgICAgICAgICMgQWxzbyBzZXQgbGlzdCBvZiByZWluc3RhbGxlZCBmZWF0dXJlcyB0byAiQUxMIgorICAgICAgICBjLmV2ZW50KCJbUkVJTlNUQUxMXSIsICJBTEwiLCAnTWFpbnRlbmFuY2VGb3JtX0FjdGlvbj0iUmVwYWlyIicsIDUpCisgICAgICAgIGMuZXZlbnQoIltQcm9ncmVzczFdIiwgIlJlcGFpcmluZyIsICdNYWludGVuYW5jZUZvcm1fQWN0aW9uPSJSZXBhaXIiJywgNikKKyAgICAgICAgYy5ldmVudCgiW1Byb2dyZXNzMl0iLCAicmVwYWlycyIsICdNYWludGVuYW5jZUZvcm1fQWN0aW9uPSJSZXBhaXIiJywgNykKKyAgICAgICAgYy5ldmVudCgiUmVpbnN0YWxsIiwgIkFMTCIsICdNYWludGVuYW5jZUZvcm1fQWN0aW9uPSJSZXBhaXIiJywgOCkKKworICAgICAgICAjIFVuaW5zdGFsbDogQ2hhbmdlIHByb2dyZXNzIHRvICJSZW1vdmUiLCB0aGVuIGludm9rZSB1bmluc3RhbGwKKyAgICAgICAgIyBBbHNvIHNldCBsaXN0IG9mIHJlbW92ZWQgZmVhdHVyZXMgdG8gIkFMTCIKKyAgICAgICAgYy5ldmVudCgiW1JFTU9WRV0iLCAiQUxMIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IlJlbW92ZSInLCAxMSkKKyAgICAgICAgYy5ldmVudCgiW1Byb2dyZXNzMV0iLCAiUmVtb3ZpbmciLCAnTWFpbnRlbmFuY2VGb3JtX0FjdGlvbj0iUmVtb3ZlIicsIDEyKQorICAgICAgICBjLmV2ZW50KCJbUHJvZ3Jlc3MyXSIsICJyZW1vdmVzIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IlJlbW92ZSInLCAxMykKKyAgICAgICAgYy5ldmVudCgiUmVtb3ZlIiwgIkFMTCIsICdNYWludGVuYW5jZUZvcm1fQWN0aW9uPSJSZW1vdmUiJywgMTQpCisKKyAgICAgICAgIyBDbG9zZSBkaWFsb2cgd2hlbiBtYWludGVuYW5jZSBhY3Rpb24gc2NoZWR1bGVkCisgICAgICAgIGMuZXZlbnQoIkVuZERpYWxvZyIsICJSZXR1cm4iLCAnTWFpbnRlbmFuY2VGb3JtX0FjdGlvbjw+IkNoYW5nZSInLCAyMCkKKyAgICAgICAgI2MuZXZlbnQoIk5ld0RpYWxvZyIsICJTZWxlY3RGZWF0dXJlc0RsZyIsICdNYWludGVuYW5jZUZvcm1fQWN0aW9uPSJDaGFuZ2UiJywgMjEpCisKKyAgICAgICAgbWFpbnQuY2FuY2VsKCJDYW5jZWwiLCAiUmVwYWlyUmFkaW9Hcm91cCIpLmV2ZW50KCJTcGF3bkRpYWxvZyIsICJDYW5jZWxEbGciKQorCisgICAgZGVmIGdldF9pbnN0YWxsZXJfZmlsZW5hbWUoc2VsZiwgZnVsbG5hbWUpOgorICAgICAgICAjIEZhY3RvcmVkIG91dCB0byBhbGxvdyBvdmVycmlkaW5nIGluIHN1YmNsYXNzZXMKKyAgICAgICAgaWYgc2VsZi50YXJnZXRfdmVyc2lvbjoKKyAgICAgICAgICAgIGJhc2VfbmFtZSA9ICIlcy4lcy1weSVzLm1zaSIgJSAoZnVsbG5hbWUsIHNlbGYucGxhdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhcmdldF92ZXJzaW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzZV9uYW1lID0gIiVzLiVzLm1zaSIgJSAoZnVsbG5hbWUsIHNlbGYucGxhdF9uYW1lKQorICAgICAgICBpbnN0YWxsZXJfbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBiYXNlX25hbWUpCisgICAgICAgIHJldHVybiBpbnN0YWxsZXJfbmFtZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Mzc3NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9tc2kucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzA0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTU4MjQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkKQEAgLTAsMCArMSw1ODcgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3JwbQorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ2JkaXN0X3JwbScgY29tbWFuZCAoY3JlYXRlIFJQTSBzb3VyY2UgYW5kIGJpbmFyeQorZGlzdHJpYnV0aW9ucykuIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBzdHJpbmcKKworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMuZGVidWcgaW1wb3J0IERFQlVHCitmcm9tIGRpc3R1dGlscy5maWxlX3V0aWwgaW1wb3J0IHdyaXRlX2ZpbGUKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKERpc3R1dGlsc09wdGlvbkVycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzdHV0aWxzRmlsZUVycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IpCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKK2NsYXNzIGJkaXN0X3JwbSAoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJjcmVhdGUgYW4gUlBNIGRpc3RyaWJ1dGlvbiIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdiZGlzdC1iYXNlPScsIE5vbmUsCisgICAgICAgICAiYmFzZSBkaXJlY3RvcnkgZm9yIGNyZWF0aW5nIGJ1aWx0IGRpc3RyaWJ1dGlvbnMiKSwKKyAgICAgICAgKCdycG0tYmFzZT0nLCBOb25lLAorICAgICAgICAgImJhc2UgZGlyZWN0b3J5IGZvciBjcmVhdGluZyBSUE1zIChkZWZhdWx0cyB0byBcInJwbVwiIHVuZGVyICIKKyAgICAgICAgICItLWJkaXN0LWJhc2U7IG11c3QgYmUgc3BlY2lmaWVkIGZvciBSUE0gMikiKSwKKyAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCisgICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCBmaW5hbCBSUE0gZmlsZXMgaW4gIgorICAgICAgICAgIihhbmQgLnNwZWMgZmlsZXMgaWYgLS1zcGVjLW9ubHkpIiksCisgICAgICAgICgncHl0aG9uPScsIE5vbmUsCisgICAgICAgICAicGF0aCB0byBQeXRob24gaW50ZXJwcmV0ZXIgdG8gaGFyZC1jb2RlIGluIHRoZSAuc3BlYyBmaWxlICIKKyAgICAgICAgICIoZGVmYXVsdDogXCJweXRob25cIikiKSwKKyAgICAgICAgKCdmaXgtcHl0aG9uJywgTm9uZSwKKyAgICAgICAgICJoYXJkLWNvZGUgdGhlIGV4YWN0IHBhdGggdG8gdGhlIGN1cnJlbnQgUHl0aG9uIGludGVycHJldGVyIGluICIKKyAgICAgICAgICJ0aGUgLnNwZWMgZmlsZSIpLAorICAgICAgICAoJ3NwZWMtb25seScsIE5vbmUsCisgICAgICAgICAib25seSByZWdlbmVyYXRlIHNwZWMgZmlsZSIpLAorICAgICAgICAoJ3NvdXJjZS1vbmx5JywgTm9uZSwKKyAgICAgICAgICJvbmx5IGdlbmVyYXRlIHNvdXJjZSBSUE0iKSwKKyAgICAgICAgKCdiaW5hcnktb25seScsIE5vbmUsCisgICAgICAgICAib25seSBnZW5lcmF0ZSBiaW5hcnkgUlBNIiksCisgICAgICAgICgndXNlLWJ6aXAyJywgTm9uZSwKKyAgICAgICAgICJ1c2UgYnppcDIgaW5zdGVhZCBvZiBnemlwIHRvIGNyZWF0ZSBzb3VyY2UgZGlzdHJpYnV0aW9uIiksCisKKyAgICAgICAgIyBNb3JlIG1ldGEtZGF0YTogdG9vIFJQTS1zcGVjaWZpYyB0byBwdXQgaW4gdGhlIHNldHVwIHNjcmlwdCwKKyAgICAgICAgIyBidXQgbmVlZHMgdG8gZ28gaW4gdGhlIC5zcGVjIGZpbGUgLS0gc28gd2UgbWFrZSB0aGVzZSBvcHRpb25zCisgICAgICAgICMgdG8gImJkaXN0X3JwbSIuICBUaGUgaWRlYSBpcyB0aGF0IHBhY2thZ2VycyB3b3VsZCBwdXQgdGhpcworICAgICAgICAjIGluZm8gaW4gc2V0dXAuY2ZnLCBhbHRob3VnaCB0aGV5IGFyZSBvZiBjb3Vyc2UgZnJlZSB0bworICAgICAgICAjIHN1cHBseSBpdCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICAoJ2Rpc3RyaWJ1dGlvbi1uYW1lPScsIE5vbmUsCisgICAgICAgICAibmFtZSBvZiB0aGUgKExpbnV4KSBkaXN0cmlidXRpb24gdG8gd2hpY2ggdGhpcyAiCisgICAgICAgICAiUlBNIGFwcGxpZXMgKCpub3QqIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgZGlzdHJpYnV0aW9uISkiKSwKKyAgICAgICAgKCdncm91cD0nLCBOb25lLAorICAgICAgICAgInBhY2thZ2UgY2xhc3NpZmljYXRpb24gW2RlZmF1bHQ6IFwiRGV2ZWxvcG1lbnQvTGlicmFyaWVzXCJdIiksCisgICAgICAgICgncmVsZWFzZT0nLCBOb25lLAorICAgICAgICAgIlJQTSByZWxlYXNlIG51bWJlciIpLAorICAgICAgICAoJ3NlcmlhbD0nLCBOb25lLAorICAgICAgICAgIlJQTSBzZXJpYWwgbnVtYmVyIiksCisgICAgICAgICgndmVuZG9yPScsIE5vbmUsCisgICAgICAgICAiUlBNIFwidmVuZG9yXCIgKGVnLiBcIkpvZSBCbG93IDxqb2VAZXhhbXBsZS5jb20+XCIpICIKKyAgICAgICAgICJbZGVmYXVsdDogbWFpbnRhaW5lciBvciBhdXRob3IgZnJvbSBzZXR1cCBzY3JpcHRdIiksCisgICAgICAgICgncGFja2FnZXI9JywgTm9uZSwKKyAgICAgICAgICJSUE0gcGFja2FnZXIgKGVnLiBcIkphbmUgRG9lIDxqYW5lQGV4YW1wbGUubmV0PlwiKSIKKyAgICAgICAgICJbZGVmYXVsdDogdmVuZG9yXSIpLAorICAgICAgICAoJ2RvYy1maWxlcz0nLCBOb25lLAorICAgICAgICAgImxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBmaWxlcyAoc3BhY2Ugb3IgY29tbWEtc2VwYXJhdGVkKSIpLAorICAgICAgICAoJ2NoYW5nZWxvZz0nLCBOb25lLAorICAgICAgICAgIlJQTSBjaGFuZ2Vsb2ciKSwKKyAgICAgICAgKCdpY29uPScsIE5vbmUsCisgICAgICAgICAibmFtZSBvZiBpY29uIGZpbGUiKSwKKyAgICAgICAgKCdwcm92aWRlcz0nLCBOb25lLAorICAgICAgICAgImNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGlzIHBhY2thZ2UiKSwKKyAgICAgICAgKCdyZXF1aXJlcz0nLCBOb25lLAorICAgICAgICAgImNhcGFiaWxpdGllcyByZXF1aXJlZCBieSB0aGlzIHBhY2thZ2UiKSwKKyAgICAgICAgKCdjb25mbGljdHM9JywgTm9uZSwKKyAgICAgICAgICJjYXBhYmlsaXRpZXMgd2hpY2ggY29uZmxpY3Qgd2l0aCB0aGlzIHBhY2thZ2UiKSwKKyAgICAgICAgKCdidWlsZC1yZXF1aXJlcz0nLCBOb25lLAorICAgICAgICAgImNhcGFiaWxpdGllcyByZXF1aXJlZCB0byBidWlsZCB0aGlzIHBhY2thZ2UiKSwKKyAgICAgICAgKCdvYnNvbGV0ZXM9JywgTm9uZSwKKyAgICAgICAgICJjYXBhYmlsaXRpZXMgbWFkZSBvYnNvbGV0ZSBieSB0aGlzIHBhY2thZ2UiKSwKKyAgICAgICAgKCduby1hdXRvcmVxJywgTm9uZSwKKyAgICAgICAgICJkbyBub3QgYXV0b21hdGljYWxseSBjYWxjdWxhdGUgZGVwZW5kZW5jaWVzIiksCisKKyAgICAgICAgIyBBY3Rpb25zIHRvIHRha2Ugd2hlbiBidWlsZGluZyBSUE0KKyAgICAgICAgKCdrZWVwLXRlbXAnLCAnaycsCisgICAgICAgICAiZG9uJ3QgY2xlYW4gdXAgUlBNIGJ1aWxkIGRpcmVjdG9yeSIpLAorICAgICAgICAoJ25vLWtlZXAtdGVtcCcsIE5vbmUsCisgICAgICAgICAiY2xlYW4gdXAgUlBNIGJ1aWxkIGRpcmVjdG9yeSBbZGVmYXVsdF0iKSwKKyAgICAgICAgKCd1c2UtcnBtLW9wdC1mbGFncycsIE5vbmUsCisgICAgICAgICAiY29tcGlsZSB3aXRoIFJQTV9PUFRfRkxBR1Mgd2hlbiBidWlsZGluZyBmcm9tIHNvdXJjZSBSUE0iKSwKKyAgICAgICAgKCduby1ycG0tb3B0LWZsYWdzJywgTm9uZSwKKyAgICAgICAgICJkbyBub3QgcGFzcyBhbnkgUlBNIENGTEFHUyB0byBjb21waWxlciIpLAorICAgICAgICAoJ3JwbTMtbW9kZScsIE5vbmUsCisgICAgICAgICAiUlBNIDMgY29tcGF0aWJpbGl0eSBtb2RlIChkZWZhdWx0KSIpLAorICAgICAgICAoJ3JwbTItbW9kZScsIE5vbmUsCisgICAgICAgICAiUlBNIDIgY29tcGF0aWJpbGl0eSBtb2RlIiksCisKKyAgICAgICAgIyBBZGQgdGhlIGhvb2tzIG5lY2Vzc2FyeSBmb3Igc3BlY2lmeWluZyBjdXN0b20gc2NyaXB0cworICAgICAgICAoJ3ByZXAtc2NyaXB0PScsIE5vbmUsCisgICAgICAgICAiU3BlY2lmeSBhIHNjcmlwdCBmb3IgdGhlIFBSRVAgcGhhc2Ugb2YgUlBNIGJ1aWxkaW5nIiksCisgICAgICAgICgnYnVpbGQtc2NyaXB0PScsIE5vbmUsCisgICAgICAgICAiU3BlY2lmeSBhIHNjcmlwdCBmb3IgdGhlIEJVSUxEIHBoYXNlIG9mIFJQTSBidWlsZGluZyIpLAorCisgICAgICAgICgncHJlLWluc3RhbGw9JywgTm9uZSwKKyAgICAgICAgICJTcGVjaWZ5IGEgc2NyaXB0IGZvciB0aGUgcHJlLUlOU1RBTEwgcGhhc2Ugb2YgUlBNIGJ1aWxkaW5nIiksCisgICAgICAgICgnaW5zdGFsbC1zY3JpcHQ9JywgTm9uZSwKKyAgICAgICAgICJTcGVjaWZ5IGEgc2NyaXB0IGZvciB0aGUgSU5TVEFMTCBwaGFzZSBvZiBSUE0gYnVpbGRpbmciKSwKKyAgICAgICAgKCdwb3N0LWluc3RhbGw9JywgTm9uZSwKKyAgICAgICAgICJTcGVjaWZ5IGEgc2NyaXB0IGZvciB0aGUgcG9zdC1JTlNUQUxMIHBoYXNlIG9mIFJQTSBidWlsZGluZyIpLAorCisgICAgICAgICgncHJlLXVuaW5zdGFsbD0nLCBOb25lLAorICAgICAgICAgIlNwZWNpZnkgYSBzY3JpcHQgZm9yIHRoZSBwcmUtVU5JTlNUQUxMIHBoYXNlIG9mIFJQTSBidWlsZGluZyIpLAorICAgICAgICAoJ3Bvc3QtdW5pbnN0YWxsPScsIE5vbmUsCisgICAgICAgICAiU3BlY2lmeSBhIHNjcmlwdCBmb3IgdGhlIHBvc3QtVU5JTlNUQUxMIHBoYXNlIG9mIFJQTSBidWlsZGluZyIpLAorCisgICAgICAgICgnY2xlYW4tc2NyaXB0PScsIE5vbmUsCisgICAgICAgICAiU3BlY2lmeSBhIHNjcmlwdCBmb3IgdGhlIENMRUFOIHBoYXNlIG9mIFJQTSBidWlsZGluZyIpLAorCisgICAgICAgICgndmVyaWZ5LXNjcmlwdD0nLCBOb25lLAorICAgICAgICAgIlNwZWNpZnkgYSBzY3JpcHQgZm9yIHRoZSBWRVJJRlkgcGhhc2Ugb2YgdGhlIFJQTSBidWlsZCIpLAorCisgICAgICAgICMgQWxsb3cgYSBwYWNrYWdlciB0byBleHBsaWNpdGx5IGZvcmNlIGFuIGFyY2hpdGVjdHVyZQorICAgICAgICAoJ2ZvcmNlLWFyY2g9JywgTm9uZSwKKyAgICAgICAgICJGb3JjZSBhbiBhcmNoaXRlY3R1cmUgb250byB0aGUgUlBNIGJ1aWxkIHByb2Nlc3MiKSwKKworICAgICAgICAoJ3F1aWV0JywgJ3EnLAorICAgICAgICAgIlJ1biB0aGUgSU5TVEFMTCBwaGFzZSBvZiBSUE0gYnVpbGRpbmcgaW4gcXVpZXQgbW9kZSIpLAorICAgICAgICBdCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ2tlZXAtdGVtcCcsICd1c2UtcnBtLW9wdC1mbGFncycsICdycG0zLW1vZGUnLAorICAgICAgICAgICAgICAgICAgICAgICAnbm8tYXV0b3JlcScsICdxdWlldCddCisKKyAgICBuZWdhdGl2ZV9vcHQgPSB7J25vLWtlZXAtdGVtcCc6ICdrZWVwLXRlbXAnLAorICAgICAgICAgICAgICAgICAgICAnbm8tcnBtLW9wdC1mbGFncyc6ICd1c2UtcnBtLW9wdC1mbGFncycsCisgICAgICAgICAgICAgICAgICAgICdycG0yLW1vZGUnOiAncnBtMy1tb2RlJ30KKworCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuYmRpc3RfYmFzZSA9IE5vbmUKKyAgICAgICAgc2VsZi5ycG1fYmFzZSA9IE5vbmUKKyAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5weXRob24gPSBOb25lCisgICAgICAgIHNlbGYuZml4X3B5dGhvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5zcGVjX29ubHkgPSBOb25lCisgICAgICAgIHNlbGYuYmluYXJ5X29ubHkgPSBOb25lCisgICAgICAgIHNlbGYuc291cmNlX29ubHkgPSBOb25lCisgICAgICAgIHNlbGYudXNlX2J6aXAyID0gTm9uZQorCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uX25hbWUgPSBOb25lCisgICAgICAgIHNlbGYuZ3JvdXAgPSBOb25lCisgICAgICAgIHNlbGYucmVsZWFzZSA9IE5vbmUKKyAgICAgICAgc2VsZi5zZXJpYWwgPSBOb25lCisgICAgICAgIHNlbGYudmVuZG9yID0gTm9uZQorICAgICAgICBzZWxmLnBhY2thZ2VyID0gTm9uZQorICAgICAgICBzZWxmLmRvY19maWxlcyA9IE5vbmUKKyAgICAgICAgc2VsZi5jaGFuZ2Vsb2cgPSBOb25lCisgICAgICAgIHNlbGYuaWNvbiA9IE5vbmUKKworICAgICAgICBzZWxmLnByZXBfc2NyaXB0ID0gTm9uZQorICAgICAgICBzZWxmLmJ1aWxkX3NjcmlwdCA9IE5vbmUKKyAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdCA9IE5vbmUKKyAgICAgICAgc2VsZi5jbGVhbl9zY3JpcHQgPSBOb25lCisgICAgICAgIHNlbGYudmVyaWZ5X3NjcmlwdCA9IE5vbmUKKyAgICAgICAgc2VsZi5wcmVfaW5zdGFsbCA9IE5vbmUKKyAgICAgICAgc2VsZi5wb3N0X2luc3RhbGwgPSBOb25lCisgICAgICAgIHNlbGYucHJlX3VuaW5zdGFsbCA9IE5vbmUKKyAgICAgICAgc2VsZi5wb3N0X3VuaW5zdGFsbCA9IE5vbmUKKyAgICAgICAgc2VsZi5wcmVwID0gTm9uZQorICAgICAgICBzZWxmLnByb3ZpZGVzID0gTm9uZQorICAgICAgICBzZWxmLnJlcXVpcmVzID0gTm9uZQorICAgICAgICBzZWxmLmNvbmZsaWN0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZF9yZXF1aXJlcyA9IE5vbmUKKyAgICAgICAgc2VsZi5vYnNvbGV0ZXMgPSBOb25lCisKKyAgICAgICAgc2VsZi5rZWVwX3RlbXAgPSAwCisgICAgICAgIHNlbGYudXNlX3JwbV9vcHRfZmxhZ3MgPSAxCisgICAgICAgIHNlbGYucnBtM19tb2RlID0gMQorICAgICAgICBzZWxmLm5vX2F1dG9yZXEgPSAwCisKKyAgICAgICAgc2VsZi5mb3JjZV9hcmNoID0gTm9uZQorICAgICAgICBzZWxmLnF1aWV0ID0gMAorCisgICAgIyBpbml0aWFsaXplX29wdGlvbnMoKQorCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsICgnYmRpc3RfYmFzZScsICdiZGlzdF9iYXNlJykpCisgICAgICAgIGlmIHNlbGYucnBtX2Jhc2UgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJwbTNfbW9kZToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJ5b3UgbXVzdCBzcGVjaWZ5IC0tcnBtLWJhc2UgaW4gUlBNIDIgbW9kZSIKKyAgICAgICAgICAgIHNlbGYucnBtX2Jhc2UgPSBvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9iYXNlLCAicnBtIikKKworICAgICAgICBpZiBzZWxmLnB5dGhvbiBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5maXhfcHl0aG9uOgorICAgICAgICAgICAgICAgIHNlbGYucHl0aG9uID0gc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5weXRob24gPSAicHl0aG9uIgorICAgICAgICBlbGlmIHNlbGYuZml4X3B5dGhvbjoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiLS1weXRob24gYW5kIC0tZml4LXB5dGhvbiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIG9wdGlvbnMiCisKKyAgICAgICAgaWYgb3MubmFtZSAhPSAncG9zaXgnOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgXAorICAgICAgICAgICAgICAgICAgKCJkb24ndCBrbm93IGhvdyB0byBjcmVhdGUgUlBNICIKKyAgICAgICAgICAgICAgICAgICAiZGlzdHJpYnV0aW9ucyBvbiBwbGF0Zm9ybSAlcyIgJSBvcy5uYW1lKQorICAgICAgICBpZiBzZWxmLmJpbmFyeV9vbmx5IGFuZCBzZWxmLnNvdXJjZV9vbmx5OgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICJjYW5ub3Qgc3VwcGx5IGJvdGggJy0tc291cmNlLW9ubHknIGFuZCAnLS1iaW5hcnktb25seSciCisKKyAgICAgICAgIyBkb24ndCBwYXNzIENGTEFHUyB0byBwdXJlIHB5dGhvbiBkaXN0cmlidXRpb25zCisgICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKKyAgICAgICAgICAgIHNlbGYudXNlX3JwbV9vcHRfZmxhZ3MgPSAwCisKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywgKCdkaXN0X2RpcicsICdkaXN0X2RpcicpKQorICAgICAgICBzZWxmLmZpbmFsaXplX3BhY2thZ2VfZGF0YSgpCisKKyAgICAjIGZpbmFsaXplX29wdGlvbnMoKQorCisgICAgZGVmIGZpbmFsaXplX3BhY2thZ2VfZGF0YSAoc2VsZik6CisgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZygnZ3JvdXAnLCAiRGV2ZWxvcG1lbnQvTGlicmFyaWVzIikKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nKCd2ZW5kb3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIDwlcz4iICUgKHNlbGYuZGlzdHJpYnV0aW9uLmdldF9jb250YWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZ2V0X2NvbnRhY3RfZW1haWwoKSkpCisgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZygncGFja2FnZXInKQorICAgICAgICBzZWxmLmVuc3VyZV9zdHJpbmdfbGlzdCgnZG9jX2ZpbGVzJykKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmRvY19maWxlcywgbGlzdCk6CisgICAgICAgICAgICBmb3IgcmVhZG1lIGluICgnUkVBRE1FJywgJ1JFQURNRS50eHQnKToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZWFkbWUpIGFuZCByZWFkbWUgbm90IGluIHNlbGYuZG9jX2ZpbGVzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRvY19maWxlcy5hcHBlbmQocmVhZG1lKQorCisgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZygncmVsZWFzZScsICIxIikKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nKCdzZXJpYWwnKSAgICMgc2hvdWxkIGl0IGJlIGFuIGludD8KKworICAgICAgICBzZWxmLmVuc3VyZV9zdHJpbmcoJ2Rpc3RyaWJ1dGlvbl9uYW1lJykKKworICAgICAgICBzZWxmLmVuc3VyZV9zdHJpbmcoJ2NoYW5nZWxvZycpCisgICAgICAgICAgIyBGb3JtYXQgY2hhbmdlbG9nIGNvcnJlY3RseQorICAgICAgICBzZWxmLmNoYW5nZWxvZyA9IHNlbGYuX2Zvcm1hdF9jaGFuZ2Vsb2coc2VsZi5jaGFuZ2Vsb2cpCisKKyAgICAgICAgc2VsZi5lbnN1cmVfZmlsZW5hbWUoJ2ljb24nKQorCisgICAgICAgIHNlbGYuZW5zdXJlX2ZpbGVuYW1lKCdwcmVwX3NjcmlwdCcpCisgICAgICAgIHNlbGYuZW5zdXJlX2ZpbGVuYW1lKCdidWlsZF9zY3JpcHQnKQorICAgICAgICBzZWxmLmVuc3VyZV9maWxlbmFtZSgnaW5zdGFsbF9zY3JpcHQnKQorICAgICAgICBzZWxmLmVuc3VyZV9maWxlbmFtZSgnY2xlYW5fc2NyaXB0JykKKyAgICAgICAgc2VsZi5lbnN1cmVfZmlsZW5hbWUoJ3ZlcmlmeV9zY3JpcHQnKQorICAgICAgICBzZWxmLmVuc3VyZV9maWxlbmFtZSgncHJlX2luc3RhbGwnKQorICAgICAgICBzZWxmLmVuc3VyZV9maWxlbmFtZSgncG9zdF9pbnN0YWxsJykKKyAgICAgICAgc2VsZi5lbnN1cmVfZmlsZW5hbWUoJ3ByZV91bmluc3RhbGwnKQorICAgICAgICBzZWxmLmVuc3VyZV9maWxlbmFtZSgncG9zdF91bmluc3RhbGwnKQorCisgICAgICAgICMgWFhYIGRvbid0IGZvcmdldCB3ZSBwdW50ZWQgb24gc3VtbWFyaWVzIGFuZCBkZXNjcmlwdGlvbnMgLS0gdGhleQorICAgICAgICAjIHNob3VsZCBiZSBoYW5kbGVkIGhlcmUgZXZlbnR1YWxseSEKKworICAgICAgICAjIE5vdyAqdGhpcyogaXMgc29tZSBtZXRhLWRhdGEgdGhhdCBiZWxvbmdzIGluIHRoZSBzZXR1cCBzY3JpcHQuLi4KKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nX2xpc3QoJ3Byb3ZpZGVzJykKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nX2xpc3QoJ3JlcXVpcmVzJykKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nX2xpc3QoJ2NvbmZsaWN0cycpCisgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZ19saXN0KCdidWlsZF9yZXF1aXJlcycpCisgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZ19saXN0KCdvYnNvbGV0ZXMnKQorCisgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZygnZm9yY2VfYXJjaCcpCisgICAgIyBmaW5hbGl6ZV9wYWNrYWdlX2RhdGEgKCkKKworCisgICAgZGVmIHJ1biAoc2VsZik6CisKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBwcmludCAiYmVmb3JlIF9nZXRfcGFja2FnZV9kYXRhKCk6IgorICAgICAgICAgICAgcHJpbnQgInZlbmRvciA9Iiwgc2VsZi52ZW5kb3IKKyAgICAgICAgICAgIHByaW50ICJwYWNrYWdlciA9Iiwgc2VsZi5wYWNrYWdlcgorICAgICAgICAgICAgcHJpbnQgImRvY19maWxlcyA9Iiwgc2VsZi5kb2NfZmlsZXMKKyAgICAgICAgICAgIHByaW50ICJjaGFuZ2Vsb2cgPSIsIHNlbGYuY2hhbmdlbG9nCisKKyAgICAgICAgIyBtYWtlIGRpcmVjdG9yaWVzCisgICAgICAgIGlmIHNlbGYuc3BlY19vbmx5OgorICAgICAgICAgICAgc3BlY19kaXIgPSBzZWxmLmRpc3RfZGlyCisgICAgICAgICAgICBzZWxmLm1rcGF0aChzcGVjX2RpcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJwbV9kaXIgPSB7fQorICAgICAgICAgICAgZm9yIGQgaW4gKCdTT1VSQ0VTJywgJ1NQRUNTJywgJ0JVSUxEJywgJ1JQTVMnLCAnU1JQTVMnKToKKyAgICAgICAgICAgICAgICBycG1fZGlyW2RdID0gb3MucGF0aC5qb2luKHNlbGYucnBtX2Jhc2UsIGQpCisgICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgocnBtX2RpcltkXSkKKyAgICAgICAgICAgIHNwZWNfZGlyID0gcnBtX2RpclsnU1BFQ1MnXQorCisgICAgICAgICMgU3BlYyBmaWxlIGdvZXMgaW50byAnZGlzdF9kaXInIGlmICctLXNwZWMtb25seSBzcGVjaWZpZWQnLAorICAgICAgICAjIGJ1aWxkL3JwbS48cGxhdD4gb3RoZXJ3aXNlLgorICAgICAgICBzcGVjX3BhdGggPSBvcy5wYXRoLmpvaW4oc3BlY19kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMuc3BlYyIgJSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKQorICAgICAgICBzZWxmLmV4ZWN1dGUod3JpdGVfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIChzcGVjX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWFrZV9zcGVjX2ZpbGUoKSksCisgICAgICAgICAgICAgICAgICAgICAid3JpdGluZyAnJXMnIiAlIHNwZWNfcGF0aCkKKworICAgICAgICBpZiBzZWxmLnNwZWNfb25seTogIyBzdG9wIGlmIHJlcXVlc3RlZAorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBNYWtlIGEgc291cmNlIGRpc3RyaWJ1dGlvbiBhbmQgY29weSB0byBTT1VSQ0VTIGRpcmVjdG9yeSB3aXRoCisgICAgICAgICMgb3B0aW9uYWwgaWNvbi4KKyAgICAgICAgc2F2ZWRfZGlzdF9maWxlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXNbOl0KKyAgICAgICAgc2Rpc3QgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdzZGlzdCcpCisgICAgICAgIGlmIHNlbGYudXNlX2J6aXAyOgorICAgICAgICAgICAgc2Rpc3QuZm9ybWF0cyA9IFsnYnp0YXInXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2Rpc3QuZm9ybWF0cyA9IFsnZ3p0YXInXQorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdzZGlzdCcpCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXMgPSBzYXZlZF9kaXN0X2ZpbGVzCisKKyAgICAgICAgc291cmNlID0gc2Rpc3QuZ2V0X2FyY2hpdmVfZmlsZXMoKVswXQorICAgICAgICBzb3VyY2VfZGlyID0gcnBtX2RpclsnU09VUkNFUyddCisgICAgICAgIHNlbGYuY29weV9maWxlKHNvdXJjZSwgc291cmNlX2RpcikKKworICAgICAgICBpZiBzZWxmLmljb246CisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmljb24pOgorICAgICAgICAgICAgICAgIHNlbGYuY29weV9maWxlKHNlbGYuaWNvbiwgc291cmNlX2RpcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgImljb24gZmlsZSAnJXMnIGRvZXMgbm90IGV4aXN0IiAlIHNlbGYuaWNvbgorCisKKyAgICAgICAgIyBidWlsZCBwYWNrYWdlCisgICAgICAgIGxvZy5pbmZvKCJidWlsZGluZyBSUE1zIikKKyAgICAgICAgcnBtX2NtZCA9IFsncnBtJ10KKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoJy91c3IvYmluL3JwbWJ1aWxkJykgb3IgXAorICAgICAgICAgICBvcy5wYXRoLmV4aXN0cygnL2Jpbi9ycG1idWlsZCcpOgorICAgICAgICAgICAgcnBtX2NtZCA9IFsncnBtYnVpbGQnXQorCisgICAgICAgIGlmIHNlbGYuc291cmNlX29ubHk6ICMgd2hhdCBraW5kIG9mIFJQTXM/CisgICAgICAgICAgICBycG1fY21kLmFwcGVuZCgnLWJzJykKKyAgICAgICAgZWxpZiBzZWxmLmJpbmFyeV9vbmx5OgorICAgICAgICAgICAgcnBtX2NtZC5hcHBlbmQoJy1iYicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBycG1fY21kLmFwcGVuZCgnLWJhJykKKyAgICAgICAgaWYgc2VsZi5ycG0zX21vZGU6CisgICAgICAgICAgICBycG1fY21kLmV4dGVuZChbJy0tZGVmaW5lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ190b3BkaXIgJXMnICUgb3MucGF0aC5hYnNwYXRoKHNlbGYucnBtX2Jhc2UpXSkKKyAgICAgICAgaWYgbm90IHNlbGYua2VlcF90ZW1wOgorICAgICAgICAgICAgcnBtX2NtZC5hcHBlbmQoJy0tY2xlYW4nKQorCisgICAgICAgIGlmIHNlbGYucXVpZXQ6CisgICAgICAgICAgICBycG1fY21kLmFwcGVuZCgnLS1xdWlldCcpCisKKyAgICAgICAgcnBtX2NtZC5hcHBlbmQoc3BlY19wYXRoKQorICAgICAgICAjIERldGVybWluZSB0aGUgYmluYXJ5IHJwbSBuYW1lcyB0aGF0IHNob3VsZCBiZSBidWlsdCBvdXQgb2YgdGhpcyBzcGVjCisgICAgICAgICMgZmlsZQorICAgICAgICAjIE5vdGUgdGhhdCBzb21lIG9mIHRoZXNlIG1heSBub3QgYmUgcmVhbGx5IGJ1aWx0IChpZiB0aGUgZmlsZQorICAgICAgICAjIGxpc3QgaXMgZW1wdHkpCisgICAgICAgIG52cl9zdHJpbmcgPSAiJXtuYW1lfS0le3ZlcnNpb259LSV7cmVsZWFzZX0iCisgICAgICAgIHNyY19ycG0gPSBudnJfc3RyaW5nICsgIi5zcmMucnBtIgorICAgICAgICBub25fc3JjX3JwbSA9ICIle2FyY2h9LyIgKyBudnJfc3RyaW5nICsgIi4le2FyY2h9LnJwbSIKKyAgICAgICAgcV9jbWQgPSByInJwbSAtcSAtLXFmICclcyAlc1xuJyAtLXNwZWNmaWxlICclcyciICUgKAorICAgICAgICAgICAgc3JjX3JwbSwgbm9uX3NyY19ycG0sIHNwZWNfcGF0aCkKKworICAgICAgICBvdXQgPSBvcy5wb3BlbihxX2NtZCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYmluYXJ5X3JwbXMgPSBbXQorICAgICAgICAgICAgc291cmNlX3JwbSA9IE5vbmUKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgbGluZSA9IG91dC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgbCA9IHN0cmluZy5zcGxpdChzdHJpbmcuc3RyaXAobGluZSkpCisgICAgICAgICAgICAgICAgYXNzZXJ0KGxlbihsKSA9PSAyKQorICAgICAgICAgICAgICAgIGJpbmFyeV9ycG1zLmFwcGVuZChsWzFdKQorICAgICAgICAgICAgICAgICMgVGhlIHNvdXJjZSBycG0gaXMgbmFtZWQgYWZ0ZXIgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBzcGVjIGZpbGUKKyAgICAgICAgICAgICAgICBpZiBzb3VyY2VfcnBtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9ycG0gPSBsWzBdCisKKyAgICAgICAgICAgIHN0YXR1cyA9IG91dC5jbG9zZSgpCisgICAgICAgICAgICBpZiBzdGF0dXM6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXhlY0Vycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZTogJXMiICUgcmVwcihxX2NtZCkpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG91dC5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5zcGF3bihycG1fY21kKQorCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKKyAgICAgICAgICAgICAgICBweXZlcnNpb24gPSBnZXRfcHl0aG9uX3ZlcnNpb24oKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBweXZlcnNpb24gPSAnYW55JworCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5iaW5hcnlfb25seToKKyAgICAgICAgICAgICAgICBzcnBtID0gb3MucGF0aC5qb2luKHJwbV9kaXJbJ1NSUE1TJ10sIHNvdXJjZV9ycG0pCisgICAgICAgICAgICAgICAgYXNzZXJ0KG9zLnBhdGguZXhpc3RzKHNycG0pKQorICAgICAgICAgICAgICAgIHNlbGYubW92ZV9maWxlKHNycG0sIHNlbGYuZGlzdF9kaXIpCisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2Rpciwgc291cmNlX3JwbSkKKyAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgKCdiZGlzdF9ycG0nLCBweXZlcnNpb24sIGZpbGVuYW1lKSkKKworICAgICAgICAgICAgaWYgbm90IHNlbGYuc291cmNlX29ubHk6CisgICAgICAgICAgICAgICAgZm9yIHJwbSBpbiBiaW5hcnlfcnBtczoKKyAgICAgICAgICAgICAgICAgICAgcnBtID0gb3MucGF0aC5qb2luKHJwbV9kaXJbJ1JQTVMnXSwgcnBtKQorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhycG0pOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb3ZlX2ZpbGUocnBtLCBzZWxmLmRpc3RfZGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUocnBtKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXMuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYmRpc3RfcnBtJywgcHl2ZXJzaW9uLCBmaWxlbmFtZSkpCisgICAgIyBydW4oKQorCisgICAgZGVmIF9kaXN0X3BhdGgoc2VsZiwgcGF0aCk6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2Rpciwgb3MucGF0aC5iYXNlbmFtZShwYXRoKSkKKworICAgIGRlZiBfbWFrZV9zcGVjX2ZpbGUoc2VsZik6CisgICAgICAgICIiIkdlbmVyYXRlIHRoZSB0ZXh0IG9mIGFuIFJQTSBzcGVjIGZpbGUgYW5kIHJldHVybiBpdCBhcyBhCisgICAgICAgIGxpc3Qgb2Ygc3RyaW5ncyAob25lIHBlciBsaW5lKS4KKyAgICAgICAgIiIiCisgICAgICAgICMgZGVmaW5pdGlvbnMgYW5kIGhlYWRlcnMKKyAgICAgICAgc3BlY19maWxlID0gWworICAgICAgICAgICAgJyVkZWZpbmUgbmFtZSAnICsgc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICclZGVmaW5lIHZlcnNpb24gJyArIHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkucmVwbGFjZSgnLScsJ18nKSwKKyAgICAgICAgICAgICclZGVmaW5lIHVubWFuZ2xlZF92ZXJzaW9uICcgKyBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpLAorICAgICAgICAgICAgJyVkZWZpbmUgcmVsZWFzZSAnICsgc2VsZi5yZWxlYXNlLnJlcGxhY2UoJy0nLCdfJyksCisgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICdTdW1tYXJ5OiAnICsgc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Rlc2NyaXB0aW9uKCksCisgICAgICAgICAgICBdCisKKyAgICAgICAgIyBwdXQgbG9jYWxlIHN1bW1hcmllcyBpbnRvIHNwZWMgZmlsZQorICAgICAgICAjIFhYWCBub3Qgc3VwcG9ydGVkIGZvciBub3cgKGhhcmQgdG8gcHV0IGEgZGljdGlvbmFyeQorICAgICAgICAjIGluIGEgY29uZmlnIGZpbGUgLS0gYXJnISkKKyAgICAgICAgI2ZvciBsb2NhbGUgaW4gc2VsZi5zdW1tYXJpZXMua2V5cygpOgorICAgICAgICAjICAgIHNwZWNfZmlsZS5hcHBlbmQoJ1N1bW1hcnkoJXMpOiAlcycgJSAobG9jYWxlLAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdW1tYXJpZXNbbG9jYWxlXSkpCisKKyAgICAgICAgc3BlY19maWxlLmV4dGVuZChbCisgICAgICAgICAgICAnTmFtZTogJXtuYW1lfScsCisgICAgICAgICAgICAnVmVyc2lvbjogJXt2ZXJzaW9ufScsCisgICAgICAgICAgICAnUmVsZWFzZTogJXtyZWxlYXNlfScsXSkKKworICAgICAgICAjIFhYWCB5dWNrISB0aGlzIGZpbGVuYW1lIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSAic2Rpc3QiIGNvbW1hbmQsCisgICAgICAgICMgYnV0IG9ubHkgYWZ0ZXIgaXQgaGFzIHJ1bjogYW5kIHdlIGNyZWF0ZSB0aGUgc3BlYyBmaWxlIGJlZm9yZQorICAgICAgICAjIHJ1bm5pbmcgInNkaXN0IiwgaW4gY2FzZSBvZiAtLXNwZWMtb25seS4KKyAgICAgICAgaWYgc2VsZi51c2VfYnppcDI6CisgICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKCdTb3VyY2UwOiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259LnRhci5iejInKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3BlY19maWxlLmFwcGVuZCgnU291cmNlMDogJXtuYW1lfS0le3VubWFuZ2xlZF92ZXJzaW9ufS50YXIuZ3onKQorCisgICAgICAgIHNwZWNfZmlsZS5leHRlbmQoWworICAgICAgICAgICAgJ0xpY2Vuc2U6ICcgKyBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbGljZW5zZSgpLAorICAgICAgICAgICAgJ0dyb3VwOiAnICsgc2VsZi5ncm91cCwKKyAgICAgICAgICAgICdCdWlsZFJvb3Q6ICV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS0le3JlbGVhc2V9LWJ1aWxkcm9vdCcsCisgICAgICAgICAgICAnUHJlZml4OiAle19wcmVmaXh9JywgXSkKKworICAgICAgICBpZiBub3Qgc2VsZi5mb3JjZV9hcmNoOgorICAgICAgICAgICAgIyBub2FyY2ggaWYgbm8gZXh0ZW5zaW9uIG1vZHVsZXMKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKKyAgICAgICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKCdCdWlsZEFyY2g6IG5vYXJjaCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKCAnQnVpbGRBcmNoOiAlcycgJSBzZWxmLmZvcmNlX2FyY2ggKQorCisgICAgICAgIGZvciBmaWVsZCBpbiAoJ1ZlbmRvcicsCisgICAgICAgICAgICAgICAgICAgICAgJ1BhY2thZ2VyJywKKyAgICAgICAgICAgICAgICAgICAgICAnUHJvdmlkZXMnLAorICAgICAgICAgICAgICAgICAgICAgICdSZXF1aXJlcycsCisgICAgICAgICAgICAgICAgICAgICAgJ0NvbmZsaWN0cycsCisgICAgICAgICAgICAgICAgICAgICAgJ09ic29sZXRlcycsCisgICAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgc3RyaW5nLmxvd2VyKGZpZWxkKSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBsaXN0KToKKyAgICAgICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKCclczogJXMnICUgKGZpZWxkLCBzdHJpbmcuam9pbih2YWwpKSkKKyAgICAgICAgICAgIGVsaWYgdmFsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNwZWNfZmlsZS5hcHBlbmQoJyVzOiAlcycgJSAoZmllbGQsIHZhbCkpCisKKworICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdXJsKCkgIT0gJ1VOS05PV04nOgorICAgICAgICAgICAgc3BlY19maWxlLmFwcGVuZCgnVXJsOiAnICsgc2VsZi5kaXN0cmlidXRpb24uZ2V0X3VybCgpKQorCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uX25hbWU6CisgICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKCdEaXN0cmlidXRpb246ICcgKyBzZWxmLmRpc3RyaWJ1dGlvbl9uYW1lKQorCisgICAgICAgIGlmIHNlbGYuYnVpbGRfcmVxdWlyZXM6CisgICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKCdCdWlsZFJlcXVpcmVzOiAnICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmpvaW4oc2VsZi5idWlsZF9yZXF1aXJlcykpCisKKyAgICAgICAgaWYgc2VsZi5pY29uOgorICAgICAgICAgICAgc3BlY19maWxlLmFwcGVuZCgnSWNvbjogJyArIG9zLnBhdGguYmFzZW5hbWUoc2VsZi5pY29uKSkKKworICAgICAgICBpZiBzZWxmLm5vX2F1dG9yZXE6CisgICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKCdBdXRvUmVxOiAwJykKKworICAgICAgICBzcGVjX2ZpbGUuZXh0ZW5kKFsKKyAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJyVkZXNjcmlwdGlvbicsCisgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbG9uZ19kZXNjcmlwdGlvbigpCisgICAgICAgICAgICBdKQorCisgICAgICAgICMgcHV0IGxvY2FsZSBkZXNjcmlwdGlvbnMgaW50byBzcGVjIGZpbGUKKyAgICAgICAgIyBYWFggYWdhaW4sIHN1cHByZXNzZWQgYmVjYXVzZSBjb25maWcgZmlsZSBzeW50YXggZG9lc24ndAorICAgICAgICAjIGVhc2lseSBzdXBwb3J0IHRoaXMgOy0oCisgICAgICAgICNmb3IgbG9jYWxlIGluIHNlbGYuZGVzY3JpcHRpb25zLmtleXMoKToKKyAgICAgICAgIyAgICBzcGVjX2ZpbGUuZXh0ZW5kKFsKKyAgICAgICAgIyAgICAgICAgJycsCisgICAgICAgICMgICAgICAgICclZGVzY3JpcHRpb24gLWwgJyArIGxvY2FsZSwKKyAgICAgICAgIyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbnNbbG9jYWxlXSwKKyAgICAgICAgIyAgICAgICAgXSkKKworICAgICAgICAjIHJwbSBzY3JpcHRzCisgICAgICAgICMgZmlndXJlIG91dCBkZWZhdWx0IGJ1aWxkIHNjcmlwdAorICAgICAgICBkZWZfc2V0dXBfY2FsbCA9ICIlcyAlcyIgJSAoc2VsZi5weXRob24sb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkpCisgICAgICAgIGRlZl9idWlsZCA9ICIlcyBidWlsZCIgJSBkZWZfc2V0dXBfY2FsbAorICAgICAgICBpZiBzZWxmLnVzZV9ycG1fb3B0X2ZsYWdzOgorICAgICAgICAgICAgZGVmX2J1aWxkID0gJ2VudiBDRkxBR1M9IiRSUE1fT1BUX0ZMQUdTIiAnICsgZGVmX2J1aWxkCisKKyAgICAgICAgIyBpbnNlcnQgY29udGVudHMgb2YgZmlsZXMKKworICAgICAgICAjIFhYWCB0aGlzIGlzIGtpbmQgb2YgbWlzbGVhZGluZzogdXNlci1zdXBwbGllZCBvcHRpb25zIGFyZSBmaWxlcworICAgICAgICAjIHRoYXQgd2Ugb3BlbiBhbmQgaW50ZXJwb2xhdGUgaW50byB0aGUgc3BlYyBmaWxlLCBidXQgdGhlIGRlZmF1bHRzCisgICAgICAgICMgYXJlIGp1c3QgdGV4dCB0aGF0IHdlIGRyb3AgaW4gYXMtaXMuICBIbW1tLgorCisgICAgICAgIGluc3RhbGxfY21kID0gKCclcyBpbnN0YWxsIC1PMSAtLXJvb3Q9JFJQTV9CVUlMRF9ST09UICcKKyAgICAgICAgICAgICAgICAgICAgICAgJy0tcmVjb3JkPUlOU1RBTExFRF9GSUxFUycpICUgZGVmX3NldHVwX2NhbGwKKworICAgICAgICBzY3JpcHRfb3B0aW9ucyA9IFsKKyAgICAgICAgICAgICgncHJlcCcsICdwcmVwX3NjcmlwdCcsICIlc2V0dXAgLW4gJXtuYW1lfS0le3VubWFuZ2xlZF92ZXJzaW9ufSIpLAorICAgICAgICAgICAgKCdidWlsZCcsICdidWlsZF9zY3JpcHQnLCBkZWZfYnVpbGQpLAorICAgICAgICAgICAgKCdpbnN0YWxsJywgJ2luc3RhbGxfc2NyaXB0JywgaW5zdGFsbF9jbWQpLAorICAgICAgICAgICAgKCdjbGVhbicsICdjbGVhbl9zY3JpcHQnLCAicm0gLXJmICRSUE1fQlVJTERfUk9PVCIpLAorICAgICAgICAgICAgKCd2ZXJpZnlzY3JpcHQnLCAndmVyaWZ5X3NjcmlwdCcsIE5vbmUpLAorICAgICAgICAgICAgKCdwcmUnLCAncHJlX2luc3RhbGwnLCBOb25lKSwKKyAgICAgICAgICAgICgncG9zdCcsICdwb3N0X2luc3RhbGwnLCBOb25lKSwKKyAgICAgICAgICAgICgncHJldW4nLCAncHJlX3VuaW5zdGFsbCcsIE5vbmUpLAorICAgICAgICAgICAgKCdwb3N0dW4nLCAncG9zdF91bmluc3RhbGwnLCBOb25lKSwKKyAgICAgICAgXQorCisgICAgICAgIGZvciAocnBtX29wdCwgYXR0ciwgZGVmYXVsdCkgaW4gc2NyaXB0X29wdGlvbnM6CisgICAgICAgICAgICAjIEluc2VydCBjb250ZW50cyBvZiBmaWxlIHJlZmVycmVkIHRvLCBpZiBubyBmaWxlIGlzIHJlZmVycmVkIHRvCisgICAgICAgICAgICAjIHVzZSAnZGVmYXVsdCcgYXMgY29udGVudHMgb2Ygc2NyaXB0CisgICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpCisgICAgICAgICAgICBpZiB2YWwgb3IgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzcGVjX2ZpbGUuZXh0ZW5kKFsKKyAgICAgICAgICAgICAgICAgICAgJycsCisgICAgICAgICAgICAgICAgICAgICclJyArIHJwbV9vcHQsXSkKKyAgICAgICAgICAgICAgICBpZiB2YWw6CisgICAgICAgICAgICAgICAgICAgIHNwZWNfZmlsZS5leHRlbmQoc3RyaW5nLnNwbGl0KG9wZW4odmFsLCAncicpLnJlYWQoKSwgJ1xuJykpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3BlY19maWxlLmFwcGVuZChkZWZhdWx0KQorCisKKyAgICAgICAgIyBmaWxlcyBzZWN0aW9uCisgICAgICAgIHNwZWNfZmlsZS5leHRlbmQoWworICAgICAgICAgICAgJycsCisgICAgICAgICAgICAnJWZpbGVzIC1mIElOU1RBTExFRF9GSUxFUycsCisgICAgICAgICAgICAnJWRlZmF0dHIoLSxyb290LHJvb3QpJywKKyAgICAgICAgICAgIF0pCisKKyAgICAgICAgaWYgc2VsZi5kb2NfZmlsZXM6CisgICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKCclZG9jICcgKyBzdHJpbmcuam9pbihzZWxmLmRvY19maWxlcykpCisKKyAgICAgICAgaWYgc2VsZi5jaGFuZ2Vsb2c6CisgICAgICAgICAgICBzcGVjX2ZpbGUuZXh0ZW5kKFsKKyAgICAgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICAgICAnJWNoYW5nZWxvZycsXSkKKyAgICAgICAgICAgIHNwZWNfZmlsZS5leHRlbmQoc2VsZi5jaGFuZ2Vsb2cpCisKKyAgICAgICAgcmV0dXJuIHNwZWNfZmlsZQorCisgICAgIyBfbWFrZV9zcGVjX2ZpbGUgKCkKKworICAgIGRlZiBfZm9ybWF0X2NoYW5nZWxvZyhzZWxmLCBjaGFuZ2Vsb2cpOgorICAgICAgICAiIiJGb3JtYXQgdGhlIGNoYW5nZWxvZyBjb3JyZWN0bHkgYW5kIGNvbnZlcnQgaXQgdG8gYSBsaXN0IG9mIHN0cmluZ3MKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBjaGFuZ2Vsb2c6CisgICAgICAgICAgICByZXR1cm4gY2hhbmdlbG9nCisgICAgICAgIG5ld19jaGFuZ2Vsb2cgPSBbXQorICAgICAgICBmb3IgbGluZSBpbiBzdHJpbmcuc3BsaXQoc3RyaW5nLnN0cmlwKGNoYW5nZWxvZyksICdcbicpOgorICAgICAgICAgICAgbGluZSA9IHN0cmluZy5zdHJpcChsaW5lKQorICAgICAgICAgICAgaWYgbGluZVswXSA9PSAnKic6CisgICAgICAgICAgICAgICAgbmV3X2NoYW5nZWxvZy5leHRlbmQoWycnLCBsaW5lXSkKKyAgICAgICAgICAgIGVsaWYgbGluZVswXSA9PSAnLSc6CisgICAgICAgICAgICAgICAgbmV3X2NoYW5nZWxvZy5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV3X2NoYW5nZWxvZy5hcHBlbmQoJyAgJyArIGxpbmUpCisKKyAgICAgICAgIyBzdHJpcCB0cmFpbGluZyBuZXdsaW5lIGluc2VydGVkIGJ5IGZpcnN0IGNoYW5nZWxvZyBlbnRyeQorICAgICAgICBpZiBub3QgbmV3X2NoYW5nZWxvZ1swXToKKyAgICAgICAgICAgIGRlbCBuZXdfY2hhbmdlbG9nWzBdCisKKyAgICAgICAgcmV0dXJuIG5ld19jaGFuZ2Vsb2cKKworICAgICMgX2Zvcm1hdF9jaGFuZ2Vsb2coKQorCisjIGNsYXNzIGJkaXN0X3JwbQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9ycG0ucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9ycG0ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZmVjOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9ycG0ucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9ycG0ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZmZmOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTM4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHkKQEAgLTAsMCArMSwzNjggQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3dpbmluc3QKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdiZGlzdF93aW5pbnN0JyBjb21tYW5kOiBjcmVhdGUgYSB3aW5kb3dzIGluc3RhbGxlcgorZXhlLXByb2dyYW0uIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBzdHJpbmcKKworZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fdmVyc2lvbgorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgcmVtb3ZlX3RyZWUKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQorCitjbGFzcyBiZGlzdF93aW5pbnN0IChDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhbiBleGVjdXRhYmxlIGluc3RhbGxlciBmb3IgTVMgV2luZG93cyIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsoJ2JkaXN0LWRpcj0nLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgInRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24iKSwKKyAgICAgICAgICAgICAgICAgICAgKCdwbGF0LW5hbWU9JywgJ3AnLAorICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtIG5hbWUgdG8gZW1iZWQgaW4gZ2VuZXJhdGVkIGZpbGVuYW1lcyAiCisgICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQ6ICVzKSIgJSBnZXRfcGxhdGZvcm0oKSksCisgICAgICAgICAgICAgICAgICAgICgna2VlcC10ZW1wJywgJ2snLAorICAgICAgICAgICAgICAgICAgICAgImtlZXAgdGhlIHBzZXVkby1pbnN0YWxsYXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgIiArCisgICAgICAgICAgICAgICAgICAgICAiY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIiksCisgICAgICAgICAgICAgICAgICAgICgndGFyZ2V0LXZlcnNpb249JywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlIGEgc3BlY2lmaWMgcHl0aG9uIHZlcnNpb24iICsKKyAgICAgICAgICAgICAgICAgICAgICIgb24gdGhlIHRhcmdldCBzeXN0ZW0iKSwKKyAgICAgICAgICAgICAgICAgICAgKCduby10YXJnZXQtY29tcGlsZScsICdjJywKKyAgICAgICAgICAgICAgICAgICAgICJkbyBub3QgY29tcGlsZSAucHkgdG8gLnB5YyBvbiB0aGUgdGFyZ2V0IHN5c3RlbSIpLAorICAgICAgICAgICAgICAgICAgICAoJ25vLXRhcmdldC1vcHRpbWl6ZScsICdvJywKKyAgICAgICAgICAgICAgICAgICAgICJkbyBub3QgY29tcGlsZSAucHkgdG8gLnB5byAob3B0aW1pemVkKSIKKyAgICAgICAgICAgICAgICAgICAgICJvbiB0aGUgdGFyZ2V0IHN5c3RlbSIpLAorICAgICAgICAgICAgICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKKyAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgaW4iKSwKKyAgICAgICAgICAgICAgICAgICAgKCdiaXRtYXA9JywgJ2InLAorICAgICAgICAgICAgICAgICAgICAgImJpdG1hcCB0byB1c2UgZm9yIHRoZSBpbnN0YWxsZXIgaW5zdGVhZCBvZiBweXRob24tcG93ZXJlZCBsb2dvIiksCisgICAgICAgICAgICAgICAgICAgICgndGl0bGU9JywgJ3QnLAorICAgICAgICAgICAgICAgICAgICAgInRpdGxlIHRvIGRpc3BsYXkgb24gdGhlIGluc3RhbGxlciBiYWNrZ3JvdW5kIGluc3RlYWQgb2YgZGVmYXVsdCIpLAorICAgICAgICAgICAgICAgICAgICAoJ3NraXAtYnVpbGQnLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgInNraXAgcmVidWlsZGluZyBldmVyeXRoaW5nIChmb3IgdGVzdGluZy9kZWJ1Z2dpbmcpIiksCisgICAgICAgICAgICAgICAgICAgICgnaW5zdGFsbC1zY3JpcHQ9JywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJiYXNlbmFtZSBvZiBpbnN0YWxsYXRpb24gc2NyaXB0IHRvIGJlIHJ1biBhZnRlciIKKyAgICAgICAgICAgICAgICAgICAgICJpbnN0YWxsYXRpb24gb3IgYmVmb3JlIGRlaW5zdGFsbGF0aW9uIiksCisgICAgICAgICAgICAgICAgICAgICgncHJlLWluc3RhbGwtc2NyaXB0PScsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAiRnVsbHkgcXVhbGlmaWVkIGZpbGVuYW1lIG9mIGEgc2NyaXB0IHRvIGJlIHJ1biBiZWZvcmUgIgorICAgICAgICAgICAgICAgICAgICAgImFueSBmaWxlcyBhcmUgaW5zdGFsbGVkLiAgVGhpcyBzY3JpcHQgbmVlZCBub3QgYmUgaW4gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICJkaXN0cmlidXRpb24iKSwKKyAgICAgICAgICAgICAgICAgICAgKCd1c2VyLWFjY2Vzcy1jb250cm9sPScsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAic3BlY2lmeSBWaXN0YSdzIFVBQyBoYW5kbGluZyAtICdub25lJy9kZWZhdWx0PW5vICIKKyAgICAgICAgICAgICAgICAgICAgICJoYW5kbGluZywgJ2F1dG8nPXVzZSBVQUMgaWYgdGFyZ2V0IFB5dGhvbiBpbnN0YWxsZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICJhbGwgdXNlcnMsICdmb3JjZSc9YWx3YXlzIHVzZSBVQUMiKSwKKyAgICAgICAgICAgICAgICAgICBdCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ2tlZXAtdGVtcCcsICduby10YXJnZXQtY29tcGlsZScsICduby10YXJnZXQtb3B0aW1pemUnLAorICAgICAgICAgICAgICAgICAgICAgICAnc2tpcC1idWlsZCddCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zIChzZWxmKToKKyAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYucGxhdF9uYW1lID0gTm9uZQorICAgICAgICBzZWxmLmtlZXBfdGVtcCA9IDAKKyAgICAgICAgc2VsZi5ub190YXJnZXRfY29tcGlsZSA9IDAKKyAgICAgICAgc2VsZi5ub190YXJnZXRfb3B0aW1pemUgPSAwCisgICAgICAgIHNlbGYudGFyZ2V0X3ZlcnNpb24gPSBOb25lCisgICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYuYml0bWFwID0gTm9uZQorICAgICAgICBzZWxmLnRpdGxlID0gTm9uZQorICAgICAgICBzZWxmLnNraXBfYnVpbGQgPSBOb25lCisgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHQgPSBOb25lCisgICAgICAgIHNlbGYucHJlX2luc3RhbGxfc2NyaXB0ID0gTm9uZQorICAgICAgICBzZWxmLnVzZXJfYWNjZXNzX2NvbnRyb2wgPSBOb25lCisKKyAgICAjIGluaXRpYWxpemVfb3B0aW9ucygpCisKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zIChzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywgKCdza2lwX2J1aWxkJywgJ3NraXBfYnVpbGQnKSkKKworICAgICAgICBpZiBzZWxmLmJkaXN0X2RpciBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5za2lwX2J1aWxkIGFuZCBzZWxmLnBsYXRfbmFtZToKKyAgICAgICAgICAgICAgICAjIElmIGJ1aWxkIGlzIHNraXBwZWQgYW5kIHBsYXRfbmFtZSBpcyBvdmVycmlkZGVuLCBiZGlzdCB3aWxsCisgICAgICAgICAgICAgICAgIyBub3Qgc2VlIHRoZSBjb3JyZWN0ICdwbGF0X25hbWUnIC0gc28gc2V0IHRoYXQgdXAgbWFudWFsbHkuCisgICAgICAgICAgICAgICAgYmRpc3QgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9vYmooJ2JkaXN0JykKKyAgICAgICAgICAgICAgICBiZGlzdC5wbGF0X25hbWUgPSBzZWxmLnBsYXRfbmFtZQorICAgICAgICAgICAgICAgICMgbmV4dCB0aGUgY29tbWFuZCB3aWxsIGJlIGluaXRpYWxpemVkIHVzaW5nIHRoYXQgbmFtZQorICAgICAgICAgICAgYmRpc3RfYmFzZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdiZGlzdCcpLmJkaXN0X2Jhc2UKKyAgICAgICAgICAgIHNlbGYuYmRpc3RfZGlyID0gb3MucGF0aC5qb2luKGJkaXN0X2Jhc2UsICd3aW5pbnN0JykKKworICAgICAgICBpZiBub3Qgc2VsZi50YXJnZXRfdmVyc2lvbjoKKyAgICAgICAgICAgIHNlbGYudGFyZ2V0X3ZlcnNpb24gPSAiIgorCisgICAgICAgIGlmIG5vdCBzZWxmLnNraXBfYnVpbGQgYW5kIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgc2hvcnRfdmVyc2lvbiA9IGdldF9weXRob25fdmVyc2lvbigpCisgICAgICAgICAgICBpZiBzZWxmLnRhcmdldF92ZXJzaW9uIGFuZCBzZWxmLnRhcmdldF92ZXJzaW9uICE9IHNob3J0X3ZlcnNpb246CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0IHZlcnNpb24gY2FuIG9ubHkgYmUgJXMsIG9yIHRoZSAnLS1za2lwLWJ1aWxkJyIgXAorICAgICAgICAgICAgICAgICAgICAgICIgb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIiAlIChzaG9ydF92ZXJzaW9uLCkKKyAgICAgICAgICAgIHNlbGYudGFyZ2V0X3ZlcnNpb24gPSBzaG9ydF92ZXJzaW9uCisKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdkaXN0X2RpcicsICdkaXN0X2RpcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3BsYXRfbmFtZScsICdwbGF0X25hbWUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgaWYgc2VsZi5pbnN0YWxsX3NjcmlwdDoKKyAgICAgICAgICAgIGZvciBzY3JpcHQgaW4gc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmluc3RhbGxfc2NyaXB0ID09IG9zLnBhdGguYmFzZW5hbWUoc2NyaXB0KToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbF9zY3JpcHQgJyVzJyBub3QgZm91bmQgaW4gc2NyaXB0cyIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdAorICAgICMgZmluYWxpemVfb3B0aW9ucygpCisKKworICAgIGRlZiBydW4gKHNlbGYpOgorICAgICAgICBpZiAoc3lzLnBsYXRmb3JtICE9ICJ3aW4zMiIgYW5kCisgICAgICAgICAgICAoc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCkgb3IKKyAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfY19saWJyYXJpZXMoKSkpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciBcCisgICAgICAgICAgICAgICAgICAoImRpc3RyaWJ1dGlvbiBjb250YWlucyBleHRlbnNpb25zIGFuZC9vciBDIGxpYnJhcmllczsgIgorICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGNvbXBpbGVkIG9uIGEgV2luZG93cyAzMiBwbGF0Zm9ybSIpCisKKyAgICAgICAgaWYgbm90IHNlbGYuc2tpcF9idWlsZDoKKyAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkJykKKworICAgICAgICBpbnN0YWxsID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnaW5zdGFsbCcsIHJlaW5pdF9zdWJjb21tYW5kcz0xKQorICAgICAgICBpbnN0YWxsLnJvb3QgPSBzZWxmLmJkaXN0X2RpcgorICAgICAgICBpbnN0YWxsLnNraXBfYnVpbGQgPSBzZWxmLnNraXBfYnVpbGQKKyAgICAgICAgaW5zdGFsbC53YXJuX2RpciA9IDAKKyAgICAgICAgaW5zdGFsbC5wbGF0X25hbWUgPSBzZWxmLnBsYXRfbmFtZQorCisgICAgICAgIGluc3RhbGxfbGliID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnaW5zdGFsbF9saWInKQorICAgICAgICAjIHdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgcHljIG9yIHB5byBmaWxlcworICAgICAgICBpbnN0YWxsX2xpYi5jb21waWxlID0gMAorICAgICAgICBpbnN0YWxsX2xpYi5vcHRpbWl6ZSA9IDAKKworICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKKyAgICAgICAgICAgICMgSWYgd2UgYXJlIGJ1aWxkaW5nIGFuIGluc3RhbGxlciBmb3IgYSBQeXRob24gdmVyc2lvbiBvdGhlcgorICAgICAgICAgICAgIyB0aGFuIHRoZSBvbmUgd2UgYXJlIGN1cnJlbnRseSBydW5uaW5nLCB0aGVuIHdlIG5lZWQgdG8gZW5zdXJlCisgICAgICAgICAgICAjIG91ciBidWlsZF9saWIgcmVmbGVjdHMgdGhlIG90aGVyIFB5dGhvbiB2ZXJzaW9uIHJhdGhlciB0aGFuIG91cnMuCisgICAgICAgICAgICAjIE5vdGUgdGhhdCBmb3IgdGFyZ2V0X3ZlcnNpb24hPXN5cy52ZXJzaW9uLCB3ZSBtdXN0IGhhdmUgc2tpcHBlZCB0aGUKKyAgICAgICAgICAgICMgYnVpbGQgc3RlcCwgc28gdGhlcmUgaXMgbm8gaXNzdWUgd2l0aCBlbmZvcmNpbmcgdGhlIGJ1aWxkIG9mIHRoaXMKKyAgICAgICAgICAgICMgdmVyc2lvbi4KKyAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gc2VsZi50YXJnZXRfdmVyc2lvbgorICAgICAgICAgICAgaWYgbm90IHRhcmdldF92ZXJzaW9uOgorICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnNraXBfYnVpbGQsICJTaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhpcyIKKyAgICAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiA9IHN5cy52ZXJzaW9uWzA6M10KKyAgICAgICAgICAgIHBsYXRfc3BlY2lmaWVyID0gIi4lcy0lcyIgJSAoc2VsZi5wbGF0X25hbWUsIHRhcmdldF92ZXJzaW9uKQorICAgICAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQorICAgICAgICAgICAgYnVpbGQuYnVpbGRfbGliID0gb3MucGF0aC5qb2luKGJ1aWxkLmJ1aWxkX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpYicgKyBwbGF0X3NwZWNpZmllcikKKworICAgICAgICAjIFVzZSBhIGN1c3RvbSBzY2hlbWUgZm9yIHRoZSB6aXAtZmlsZSwgYmVjYXVzZSB3ZSBoYXZlIHRvIGRlY2lkZQorICAgICAgICAjIGF0IGluc3RhbGxhdGlvbiB0aW1lIHdoaWNoIHNjaGVtZSB0byB1c2UuCisgICAgICAgIGZvciBrZXkgaW4gKCdwdXJlbGliJywgJ3BsYXRsaWInLCAnaGVhZGVycycsICdzY3JpcHRzJywgJ2RhdGEnKToKKyAgICAgICAgICAgIHZhbHVlID0gc3RyaW5nLnVwcGVyKGtleSkKKyAgICAgICAgICAgIGlmIGtleSA9PSAnaGVhZGVycyc6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSArICcvSW5jbHVkZS8kZGlzdF9uYW1lJworICAgICAgICAgICAgc2V0YXR0cihpbnN0YWxsLAorICAgICAgICAgICAgICAgICAgICAnaW5zdGFsbF8nICsga2V5LAorICAgICAgICAgICAgICAgICAgICB2YWx1ZSkKKworICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyB0byAlcyIsIHNlbGYuYmRpc3RfZGlyKQorICAgICAgICBpbnN0YWxsLmVuc3VyZV9maW5hbGl6ZWQoKQorCisgICAgICAgICMgYXZvaWQgd2FybmluZyBvZiAnaW5zdGFsbF9saWInIGFib3V0IGluc3RhbGxpbmcKKyAgICAgICAgIyBpbnRvIGEgZGlyZWN0b3J5IG5vdCBpbiBzeXMucGF0aAorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLCAnUFVSRUxJQicpKQorCisgICAgICAgIGluc3RhbGwucnVuKCkKKworICAgICAgICBkZWwgc3lzLnBhdGhbMF0KKworICAgICAgICAjIEFuZCBtYWtlIGFuIGFyY2hpdmUgcmVsYXRpdmUgdG8gdGhlIHJvb3Qgb2YgdGhlCisgICAgICAgICMgcHNldWRvLWluc3RhbGxhdGlvbiB0cmVlLgorICAgICAgICBmcm9tIHRlbXBmaWxlIGltcG9ydCBta3RlbXAKKyAgICAgICAgYXJjaGl2ZV9iYXNlbmFtZSA9IG1rdGVtcCgpCisgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCkKKyAgICAgICAgYXJjbmFtZSA9IHNlbGYubWFrZV9hcmNoaXZlKGFyY2hpdmVfYmFzZW5hbWUsICJ6aXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdF9kaXI9c2VsZi5iZGlzdF9kaXIpCisgICAgICAgICMgY3JlYXRlIGFuIGV4ZSBjb250YWluaW5nIHRoZSB6aXAtZmlsZQorICAgICAgICBzZWxmLmNyZWF0ZV9leGUoYXJjbmFtZSwgZnVsbG5hbWUsIHNlbGYuYml0bWFwKQorICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKKyAgICAgICAgICAgIHB5dmVyc2lvbiA9IGdldF9weXRob25fdmVyc2lvbigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBweXZlcnNpb24gPSAnYW55JworICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzLmFwcGVuZCgoJ2JkaXN0X3dpbmluc3QnLCBweXZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9pbnN0YWxsZXJfZmlsZW5hbWUoZnVsbG5hbWUpKSkKKyAgICAgICAgIyByZW1vdmUgdGhlIHppcC1maWxlIGFnYWluCisgICAgICAgIGxvZy5kZWJ1ZygicmVtb3ZpbmcgdGVtcG9yYXJ5IGZpbGUgJyVzJyIsIGFyY25hbWUpCisgICAgICAgIG9zLnJlbW92ZShhcmNuYW1lKQorCisgICAgICAgIGlmIG5vdCBzZWxmLmtlZXBfdGVtcDoKKyAgICAgICAgICAgIHJlbW92ZV90cmVlKHNlbGYuYmRpc3RfZGlyLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKworICAgICMgcnVuKCkKKworICAgIGRlZiBnZXRfaW5pZGF0YSAoc2VsZik6CisgICAgICAgICMgUmV0dXJuIGRhdGEgZGVzY3JpYmluZyB0aGUgaW5zdGFsbGF0aW9uLgorCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgbWV0YWRhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQorCisgICAgICAgICMgV3JpdGUgdGhlIFttZXRhZGF0YV0gc2VjdGlvbi4KKyAgICAgICAgbGluZXMuYXBwZW5kKCJbbWV0YWRhdGFdIikKKworICAgICAgICAjICdpbmZvJyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgaW5zdGFsbGVyJ3MgZGlhbG9nIGJveCwKKyAgICAgICAgIyBkZXNjcmliaW5nIHRoZSBpdGVtcyB0byBiZSBpbnN0YWxsZWQuCisgICAgICAgIGluZm8gPSAobWV0YWRhdGEubG9uZ19kZXNjcmlwdGlvbiBvciAnJykgKyAnXG4nCisKKyAgICAgICAgIyBFc2NhcGUgbmV3bGluZSBjaGFyYWN0ZXJzCisgICAgICAgIGRlZiBlc2NhcGUocyk6CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocywgIlxuIiwgIlxcbiIpCisKKyAgICAgICAgZm9yIG5hbWUgaW4gWyJhdXRob3IiLCAiYXV0aG9yX2VtYWlsIiwgImRlc2NyaXB0aW9uIiwgIm1haW50YWluZXIiLAorICAgICAgICAgICAgICAgICAgICAgIm1haW50YWluZXJfZW1haWwiLCAibmFtZSIsICJ1cmwiLCAidmVyc2lvbiJdOgorICAgICAgICAgICAgZGF0YSA9IGdldGF0dHIobWV0YWRhdGEsIG5hbWUsICIiKQorICAgICAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgICAgICBpbmZvID0gaW5mbyArICgiXG4gICAgJXM6ICVzIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLmNhcGl0YWxpemUobmFtZSksIGVzY2FwZShkYXRhKSkpCisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCIlcz0lcyIgJSAobmFtZSwgZXNjYXBlKGRhdGEpKSkKKworICAgICAgICAjIFRoZSBbc2V0dXBdIHNlY3Rpb24gY29udGFpbnMgZW50cmllcyBjb250cm9sbGluZworICAgICAgICAjIHRoZSBpbnN0YWxsZXIgcnVudGltZS4KKyAgICAgICAgbGluZXMuYXBwZW5kKCJcbltTZXR1cF0iKQorICAgICAgICBpZiBzZWxmLmluc3RhbGxfc2NyaXB0OgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKCJpbnN0YWxsX3NjcmlwdD0lcyIgJSBzZWxmLmluc3RhbGxfc2NyaXB0KQorICAgICAgICBsaW5lcy5hcHBlbmQoImluZm89JXMiICUgZXNjYXBlKGluZm8pKQorICAgICAgICBsaW5lcy5hcHBlbmQoInRhcmdldF9jb21waWxlPSVkIiAlIChub3Qgc2VsZi5ub190YXJnZXRfY29tcGlsZSkpCisgICAgICAgIGxpbmVzLmFwcGVuZCgidGFyZ2V0X29wdGltaXplPSVkIiAlIChub3Qgc2VsZi5ub190YXJnZXRfb3B0aW1pemUpKQorICAgICAgICBpZiBzZWxmLnRhcmdldF92ZXJzaW9uOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKCJ0YXJnZXRfdmVyc2lvbj0lcyIgJSBzZWxmLnRhcmdldF92ZXJzaW9uKQorICAgICAgICBpZiBzZWxmLnVzZXJfYWNjZXNzX2NvbnRyb2w6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoInVzZXJfYWNjZXNzX2NvbnRyb2w9JXMiICUgc2VsZi51c2VyX2FjY2Vzc19jb250cm9sKQorCisgICAgICAgIHRpdGxlID0gc2VsZi50aXRsZSBvciBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKQorICAgICAgICBsaW5lcy5hcHBlbmQoInRpdGxlPSVzIiAlIGVzY2FwZSh0aXRsZSkpCisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIGltcG9ydCBkaXN0dXRpbHMKKyAgICAgICAgYnVpbGRfaW5mbyA9ICJCdWlsdCAlcyB3aXRoIGRpc3R1dGlscy0lcyIgJSBcCisgICAgICAgICAgICAgICAgICAgICAodGltZS5jdGltZSh0aW1lLnRpbWUoKSksIGRpc3R1dGlscy5fX3ZlcnNpb25fXykKKyAgICAgICAgbGluZXMuYXBwZW5kKCJidWlsZF9pbmZvPSVzIiAlIGJ1aWxkX2luZm8pCisgICAgICAgIHJldHVybiBzdHJpbmcuam9pbihsaW5lcywgIlxuIikKKworICAgICMgZ2V0X2luaWRhdGEoKQorCisgICAgZGVmIGNyZWF0ZV9leGUgKHNlbGYsIGFyY25hbWUsIGZ1bGxuYW1lLCBiaXRtYXA9Tm9uZSk6CisgICAgICAgIGltcG9ydCBzdHJ1Y3QKKworICAgICAgICBzZWxmLm1rcGF0aChzZWxmLmRpc3RfZGlyKQorCisgICAgICAgIGNmZ2RhdGEgPSBzZWxmLmdldF9pbmlkYXRhKCkKKworICAgICAgICBpbnN0YWxsZXJfbmFtZSA9IHNlbGYuZ2V0X2luc3RhbGxlcl9maWxlbmFtZShmdWxsbmFtZSkKKyAgICAgICAgc2VsZi5hbm5vdW5jZSgiY3JlYXRpbmcgJXMiICUgaW5zdGFsbGVyX25hbWUpCisKKyAgICAgICAgaWYgYml0bWFwOgorICAgICAgICAgICAgYml0bWFwZGF0YSA9IG9wZW4oYml0bWFwLCAicmIiKS5yZWFkKCkKKyAgICAgICAgICAgIGJpdG1hcGxlbiA9IGxlbihiaXRtYXBkYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYml0bWFwbGVuID0gMAorCisgICAgICAgIGZpbGUgPSBvcGVuKGluc3RhbGxlcl9uYW1lLCAid2IiKQorICAgICAgICBmaWxlLndyaXRlKHNlbGYuZ2V0X2V4ZV9ieXRlcygpKQorICAgICAgICBpZiBiaXRtYXA6CisgICAgICAgICAgICBmaWxlLndyaXRlKGJpdG1hcGRhdGEpCisKKyAgICAgICAgIyBDb252ZXJ0IGNmZ2RhdGEgZnJvbSB1bmljb2RlIHRvIGFzY2lpLCBtYmNzIGVuY29kZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdW5pY29kZQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjZmdkYXRhLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICBjZmdkYXRhID0gY2ZnZGF0YS5lbmNvZGUoIm1iY3MiKQorCisgICAgICAgICMgQXBwZW5kIHRoZSBwcmUtaW5zdGFsbCBzY3JpcHQKKyAgICAgICAgY2ZnZGF0YSA9IGNmZ2RhdGEgKyAiXDAiCisgICAgICAgIGlmIHNlbGYucHJlX2luc3RhbGxfc2NyaXB0OgorICAgICAgICAgICAgc2NyaXB0X2RhdGEgPSBvcGVuKHNlbGYucHJlX2luc3RhbGxfc2NyaXB0LCAiciIpLnJlYWQoKQorICAgICAgICAgICAgY2ZnZGF0YSA9IGNmZ2RhdGEgKyBzY3JpcHRfZGF0YSArICJcblwwIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBlbXB0eSBwcmUtaW5zdGFsbCBzY3JpcHQKKyAgICAgICAgICAgIGNmZ2RhdGEgPSBjZmdkYXRhICsgIlwwIgorICAgICAgICBmaWxlLndyaXRlKGNmZ2RhdGEpCisKKyAgICAgICAgIyBUaGUgJ21hZ2ljIG51bWJlcicgMHgxMjM0NTY3QiBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZQorICAgICAgICAjIGJpbmFyeSBsYXlvdXQgb2YgJ2NmZ2RhdGEnIGlzIHdoYXQgdGhlIHdpbmluc3QuZXhlIGJpbmFyeQorICAgICAgICAjIGV4cGVjdHMuICBJZiB0aGUgbGF5b3V0IGNoYW5nZXMsIGluY3JlbWVudCB0aGF0IG51bWJlciwgbWFrZQorICAgICAgICAjIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdG8gdGhlIHdpbmluc3QuZXhlIHNvdXJjZXMsIGFuZAorICAgICAgICAjIHJlY29tcGlsZSB0aGVtLgorICAgICAgICBoZWFkZXIgPSBzdHJ1Y3QucGFjaygiPGlpaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIzNDU2N0IsICAgICAgICMgdGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbihjZmdkYXRhKSwgICAgICMgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcGxlbiwgICAgICAgICMgbnVtYmVyIG9mIGJ5dGVzIGluIGJpdG1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIGZpbGUud3JpdGUoaGVhZGVyKQorICAgICAgICBmaWxlLndyaXRlKG9wZW4oYXJjbmFtZSwgInJiIikucmVhZCgpKQorCisgICAgIyBjcmVhdGVfZXhlKCkKKworICAgIGRlZiBnZXRfaW5zdGFsbGVyX2ZpbGVuYW1lKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgIyBGYWN0b3JlZCBvdXQgdG8gYWxsb3cgb3ZlcnJpZGluZyBpbiBzdWJjbGFzc2VzCisgICAgICAgIGlmIHNlbGYudGFyZ2V0X3ZlcnNpb246CisgICAgICAgICAgICAjIGlmIHdlIGNyZWF0ZSBhbiBpbnN0YWxsZXIgZm9yIGEgc3BlY2lmaWMgcHl0aG9uIHZlcnNpb24sCisgICAgICAgICAgICAjIGl0J3MgYmV0dGVyIHRvIGluY2x1ZGUgdGhpcyBpbiB0aGUgbmFtZQorICAgICAgICAgICAgaW5zdGFsbGVyX25hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcy4lcy1weSVzLmV4ZSIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdWxsbmFtZSwgc2VsZi5wbGF0X25hbWUsIHNlbGYudGFyZ2V0X3ZlcnNpb24pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5zdGFsbGVyX25hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcy4lcy5leGUiICUgKGZ1bGxuYW1lLCBzZWxmLnBsYXRfbmFtZSkpCisgICAgICAgIHJldHVybiBpbnN0YWxsZXJfbmFtZQorICAgICMgZ2V0X2luc3RhbGxlcl9maWxlbmFtZSgpCisKKyAgICBkZWYgZ2V0X2V4ZV9ieXRlcyAoc2VsZik6CisgICAgICAgIGZyb20gZGlzdHV0aWxzLm1zdmNjb21waWxlciBpbXBvcnQgZ2V0X2J1aWxkX3ZlcnNpb24KKyAgICAgICAgIyBJZiBhIHRhcmdldC12ZXJzaW9uIG90aGVyIHRoYW4gdGhlIGN1cnJlbnQgdmVyc2lvbiBoYXMgYmVlbgorICAgICAgICAjIHNwZWNpZmllZCwgdGhlbiB1c2luZyB0aGUgTVNWQyB2ZXJzaW9uIGZyb20gKnRoaXMqIGJ1aWxkIGlzIG5vIGdvb2QuCisgICAgICAgICMgV2l0aG91dCBhY3R1YWxseSBmaW5kaW5nIGFuZCBleGVjdXRpbmcgdGhlIHRhcmdldCB2ZXJzaW9uIGFuZCBwYXJzaW5nCisgICAgICAgICMgaXRzIHN5cy52ZXJzaW9uLCB3ZSBqdXN0IGhhcmQtY29kZSBvdXIga25vd2xlZGdlIG9mIG9sZCB2ZXJzaW9ucy4KKyAgICAgICAgIyBOT1RFOiBQb3NzaWJsZSBhbHRlcm5hdGl2ZSBpcyB0byBhbGxvdyAiLS10YXJnZXQtdmVyc2lvbiIgdG8KKyAgICAgICAgIyBzcGVjaWZ5IGEgUHl0aG9uIGV4ZWN1dGFibGUgcmF0aGVyIHRoYW4gYSBzaW1wbGUgdmVyc2lvbiBzdHJpbmcuCisgICAgICAgICMgV2UgY2FuIHRoZW4gZXhlY3V0ZSB0aGlzIHByb2dyYW0gdG8gb2J0YWluIGFueSBpbmZvIHdlIG5lZWQsIHN1Y2gKKyAgICAgICAgIyBhcyB0aGUgcmVhbCBzeXMudmVyc2lvbiBzdHJpbmcgZm9yIHRoZSBidWlsZC4KKyAgICAgICAgY3VyX3ZlcnNpb24gPSBnZXRfcHl0aG9uX3ZlcnNpb24oKQorICAgICAgICBpZiBzZWxmLnRhcmdldF92ZXJzaW9uIGFuZCBzZWxmLnRhcmdldF92ZXJzaW9uICE9IGN1cl92ZXJzaW9uOgorICAgICAgICAgICAgIyBJZiB0aGUgdGFyZ2V0IHZlcnNpb24gaXMgKmxhdGVyKiB0aGFuIHVzLCB0aGVuIHdlIGFzc3VtZSB0aGV5CisgICAgICAgICAgICAjIHVzZSB3aGF0IHdlIHVzZQorICAgICAgICAgICAgIyBzdHJpbmcgY29tcGFyZXMgc2VlbSB3cm9uZywgYnV0IGFyZSB3aGF0IHN5c2NvbmZpZy5weSBpdHNlbGYgdXNlcworICAgICAgICAgICAgaWYgc2VsZi50YXJnZXRfdmVyc2lvbiA+IGN1cl92ZXJzaW9uOgorICAgICAgICAgICAgICAgIGJ2ID0gZ2V0X2J1aWxkX3ZlcnNpb24oKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnRhcmdldF92ZXJzaW9uIDwgIjIuNCI6CisgICAgICAgICAgICAgICAgICAgIGJ2ID0gNi4wCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnYgPSA3LjEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZm9yIGN1cnJlbnQgdmVyc2lvbiAtIHVzZSBhdXRob3JpdGF0aXZlIGNoZWNrLgorICAgICAgICAgICAgYnYgPSBnZXRfYnVpbGRfdmVyc2lvbigpCisKKyAgICAgICAgIyB3aW5pbnN0LXgueS5leGUgaXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgZmlsZQorICAgICAgICBkaXJlY3RvcnkgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisgICAgICAgICMgd2UgbXVzdCB1c2UgYSB3aW5pbnN0LXgueS5leGUgYnVpbHQgd2l0aCB0aGUgc2FtZSBDIGNvbXBpbGVyCisgICAgICAgICMgdXNlZCBmb3IgcHl0aG9uLiAgWFhYIFdoYXQgYWJvdXQgbWluZ3csIGJvcmxhbmQsIGFuZCBzbyBvbj8KKworICAgICAgICAjIGlmIHBsYXRfbmFtZSBzdGFydHMgd2l0aCAid2luIiBidXQgaXMgbm90ICJ3aW4zMiIKKyAgICAgICAgIyB3ZSB3YW50IHRvIHN0cmlwICJ3aW4iIGFuZCBsZWF2ZSB0aGUgcmVzdCAoZS5nLiAtYW1kNjQpCisgICAgICAgICMgZm9yIGFsbCBvdGhlciBjYXNlcywgd2UgZG9uJ3Qgd2FudCBhbnkgc3VmZml4CisgICAgICAgIGlmIHNlbGYucGxhdF9uYW1lICE9ICd3aW4zMicgYW5kIHNlbGYucGxhdF9uYW1lWzozXSA9PSAnd2luJzoKKyAgICAgICAgICAgIHNmaXggPSBzZWxmLnBsYXRfbmFtZVszOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNmaXggPSAnJworCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgIndpbmluc3QtJS4xZiVzLmV4ZSIgJSAoYnYsIHNmaXgpKQorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgInJiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyMgY2xhc3MgYmRpc3Rfd2luaW5zdApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNiNTA4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4ODM5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0YmYzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHkKQEAgLTAsMCArMSwxNDcgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmJ1aWxkCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnYnVpbGQnIGNvbW1hbmQuIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgc3lzLCBvcworCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKKworZGVmIHNob3dfY29tcGlsZXJzKCk6CisgICAgZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBzaG93X2NvbXBpbGVycworICAgIHNob3dfY29tcGlsZXJzKCkKKworY2xhc3MgYnVpbGQoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJidWlsZCBldmVyeXRoaW5nIG5lZWRlZCB0byBpbnN0YWxsIgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2J1aWxkLWJhc2U9JywgJ2InLAorICAgICAgICAgImJhc2UgZGlyZWN0b3J5IGZvciBidWlsZCBsaWJyYXJ5IiksCisgICAgICAgICgnYnVpbGQtcHVyZWxpYj0nLCBOb25lLAorICAgICAgICAgImJ1aWxkIGRpcmVjdG9yeSBmb3IgcGxhdGZvcm0tbmV1dHJhbCBkaXN0cmlidXRpb25zIiksCisgICAgICAgICgnYnVpbGQtcGxhdGxpYj0nLCBOb25lLAorICAgICAgICAgImJ1aWxkIGRpcmVjdG9yeSBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgZGlzdHJpYnV0aW9ucyIpLAorICAgICAgICAoJ2J1aWxkLWxpYj0nLCBOb25lLAorICAgICAgICAgImJ1aWxkIGRpcmVjdG9yeSBmb3IgYWxsIGRpc3RyaWJ1dGlvbiAoZGVmYXVsdHMgdG8gZWl0aGVyICIgKworICAgICAgICAgImJ1aWxkLXB1cmVsaWIgb3IgYnVpbGQtcGxhdGxpYiIpLAorICAgICAgICAoJ2J1aWxkLXNjcmlwdHM9JywgTm9uZSwKKyAgICAgICAgICJidWlsZCBkaXJlY3RvcnkgZm9yIHNjcmlwdHMiKSwKKyAgICAgICAgKCdidWlsZC10ZW1wPScsICd0JywKKyAgICAgICAgICJ0ZW1wb3JhcnkgYnVpbGQgZGlyZWN0b3J5IiksCisgICAgICAgICgncGxhdC1uYW1lPScsICdwJywKKyAgICAgICAgICJwbGF0Zm9ybSBuYW1lIHRvIGJ1aWxkIGZvciwgaWYgc3VwcG9ydGVkICIKKyAgICAgICAgICIoZGVmYXVsdDogJXMpIiAlIGdldF9wbGF0Zm9ybSgpKSwKKyAgICAgICAgKCdjb21waWxlcj0nLCAnYycsCisgICAgICAgICAic3BlY2lmeSB0aGUgY29tcGlsZXIgdHlwZSIpLAorICAgICAgICAoJ2RlYnVnJywgJ2cnLAorICAgICAgICAgImNvbXBpbGUgZXh0ZW5zaW9ucyBhbmQgbGlicmFyaWVzIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uIiksCisgICAgICAgICgnZm9yY2UnLCAnZicsCisgICAgICAgICAiZm9yY2libHkgYnVpbGQgZXZlcnl0aGluZyAoaWdub3JlIGZpbGUgdGltZXN0YW1wcykiKSwKKyAgICAgICAgKCdleGVjdXRhYmxlPScsICdlJywKKyAgICAgICAgICJzcGVjaWZ5IGZpbmFsIGRlc3RpbmF0aW9uIGludGVycHJldGVyIHBhdGggKGJ1aWxkLnB5KSIpLAorICAgICAgICBdCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ2RlYnVnJywgJ2ZvcmNlJ10KKworICAgIGhlbHBfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdoZWxwLWNvbXBpbGVyJywgTm9uZSwKKyAgICAgICAgICJsaXN0IGF2YWlsYWJsZSBjb21waWxlcnMiLCBzaG93X2NvbXBpbGVycyksCisgICAgICAgIF0KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYnVpbGRfYmFzZSA9ICdidWlsZCcKKyAgICAgICAgIyB0aGVzZSBhcmUgZGVjaWRlZCBvbmx5IGFmdGVyICdidWlsZF9iYXNlJyBoYXMgaXRzIGZpbmFsIHZhbHVlCisgICAgICAgICMgKHVubGVzcyBvdmVycmlkZGVuIGJ5IHRoZSB1c2VyIG9yIGNsaWVudCkKKyAgICAgICAgc2VsZi5idWlsZF9wdXJlbGliID0gTm9uZQorICAgICAgICBzZWxmLmJ1aWxkX3BsYXRsaWIgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfbGliID0gTm9uZQorICAgICAgICBzZWxmLmJ1aWxkX3RlbXAgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfc2NyaXB0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5jb21waWxlciA9IE5vbmUKKyAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBOb25lCisgICAgICAgIHNlbGYuZGVidWcgPSBOb25lCisgICAgICAgIHNlbGYuZm9yY2UgPSAwCisgICAgICAgIHNlbGYuZXhlY3V0YWJsZSA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnBsYXRfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBnZXRfcGxhdGZvcm0oKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBwbGF0LW5hbWUgb25seSBzdXBwb3J0ZWQgZm9yIHdpbmRvd3MgKG90aGVyIHBsYXRmb3JtcyBhcmUKKyAgICAgICAgICAgICMgc3VwcG9ydGVkIHZpYSAuL2NvbmZpZ3VyZSBmbGFncywgaWYgYXQgYWxsKS4gIEF2b2lkIG1pc2xlYWRpbmcKKyAgICAgICAgICAgICMgb3RoZXIgcGxhdGZvcm1zLgorICAgICAgICAgICAgaWYgb3MubmFtZSAhPSAnbnQnOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLXBsYXQtbmFtZSBvbmx5IHN1cHBvcnRlZCBvbiBXaW5kb3dzICh0cnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyAnLi9jb25maWd1cmUgLS1oZWxwJyBvbiB5b3VyIHBsYXRmb3JtKSIpCisKKyAgICAgICAgcGxhdF9zcGVjaWZpZXIgPSAiLiVzLSVzIiAlIChzZWxmLnBsYXRfbmFtZSwgc3lzLnZlcnNpb25bMDozXSkKKworICAgICAgICAjIE1ha2UgaXQgc28gUHl0aG9uIDIueCBhbmQgUHl0aG9uIDIueCB3aXRoIC0td2l0aC1weWRlYnVnIGRvbid0CisgICAgICAgICMgc2hhcmUgdGhlIHNhbWUgYnVpbGQgZGlyZWN0b3JpZXMuIERvaW5nIHNvIGNvbmZ1c2VzIHRoZSBidWlsZAorICAgICAgICAjIHByb2Nlc3MgZm9yIEMgbW9kdWxlcworICAgICAgICBpZiBoYXNhdHRyKHN5cywgJ2dldHRvdGFscmVmY291bnQnKToKKyAgICAgICAgICAgIHBsYXRfc3BlY2lmaWVyICs9ICctcHlkZWJ1ZycKKworICAgICAgICAjICdidWlsZF9wdXJlbGliJyBhbmQgJ2J1aWxkX3BsYXRsaWInIGp1c3QgZGVmYXVsdCB0byAnbGliJyBhbmQKKyAgICAgICAgIyAnbGliLjxwbGF0PicgdW5kZXIgdGhlIGJhc2UgYnVpbGQgZGlyZWN0b3J5LiAgV2Ugb25seSB1c2Ugb25lIG9mCisgICAgICAgICMgdGhlbSBmb3IgYSBnaXZlbiBkaXN0cmlidXRpb24sIHRob3VnaCAtLQorICAgICAgICBpZiBzZWxmLmJ1aWxkX3B1cmVsaWIgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfcHVyZWxpYiA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Jhc2UsICdsaWInKQorICAgICAgICBpZiBzZWxmLmJ1aWxkX3BsYXRsaWIgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfcGxhdGxpYiA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpYicgKyBwbGF0X3NwZWNpZmllcikKKworICAgICAgICAjICdidWlsZF9saWInIGlzIHRoZSBhY3R1YWwgZGlyZWN0b3J5IHRoYXQgd2Ugd2lsbCB1c2UgZm9yIHRoaXMKKyAgICAgICAgIyBwYXJ0aWN1bGFyIG1vZHVsZSBkaXN0cmlidXRpb24gLS0gaWYgdXNlciBkaWRuJ3Qgc3VwcGx5IGl0LCBwaWNrCisgICAgICAgICMgb25lIG9mICdidWlsZF9wdXJlbGliJyBvciAnYnVpbGRfcGxhdGxpYicuCisgICAgICAgIGlmIHNlbGYuYnVpbGRfbGliIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5leHRfbW9kdWxlczoKKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX2xpYiA9IHNlbGYuYnVpbGRfcGxhdGxpYgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX2xpYiA9IHNlbGYuYnVpbGRfcHVyZWxpYgorCisgICAgICAgICMgJ2J1aWxkX3RlbXAnIC0tIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNvbXBpbGVyIHR1cmRzLAorICAgICAgICAjICJidWlsZC90ZW1wLjxwbGF0PiIKKyAgICAgICAgaWYgc2VsZi5idWlsZF90ZW1wIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmJ1aWxkX3RlbXAgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZW1wJyArIHBsYXRfc3BlY2lmaWVyKQorICAgICAgICBpZiBzZWxmLmJ1aWxkX3NjcmlwdHMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfc2NyaXB0cyA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdHMtJyArIHN5cy52ZXJzaW9uWzA6M10pCisKKyAgICAgICAgaWYgc2VsZi5leGVjdXRhYmxlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmV4ZWN1dGFibGUgPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjdXRhYmxlKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIyBSdW4gYWxsIHJlbGV2YW50IHN1Yi1jb21tYW5kcy4gIFRoaXMgd2lsbCBiZSBzb21lIHN1YnNldCBvZjoKKyAgICAgICAgIyAgLSBidWlsZF9weSAgICAgIC0gcHVyZSBQeXRob24gbW9kdWxlcworICAgICAgICAjICAtIGJ1aWxkX2NsaWIgICAgLSBzdGFuZGFsb25lIEMgbGlicmFyaWVzCisgICAgICAgICMgIC0gYnVpbGRfZXh0ICAgICAtIFB5dGhvbiBleHRlbnNpb25zCisgICAgICAgICMgIC0gYnVpbGRfc2NyaXB0cyAtIChQeXRob24pIHNjcmlwdHMKKyAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgorICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRfbmFtZSkKKworICAgICMgLS0gUHJlZGljYXRlcyBmb3IgdGhlIHN1Yi1jb21tYW5kIGxpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgaGFzX3B1cmVfbW9kdWxlcyAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfcHVyZV9tb2R1bGVzKCkKKworICAgIGRlZiBoYXNfY19saWJyYXJpZXMgKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kaXN0cmlidXRpb24uaGFzX2NfbGlicmFyaWVzKCkKKworICAgIGRlZiBoYXNfZXh0X21vZHVsZXMgKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCkKKworICAgIGRlZiBoYXNfc2NyaXB0cyAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfc2NyaXB0cygpCisKKyAgICBzdWJfY29tbWFuZHMgPSBbKCdidWlsZF9weScsICAgICAgaGFzX3B1cmVfbW9kdWxlcyksCisgICAgICAgICAgICAgICAgICAgICgnYnVpbGRfY2xpYicsICAgIGhhc19jX2xpYnJhcmllcyksCisgICAgICAgICAgICAgICAgICAgICgnYnVpbGRfZXh0JywgICAgIGhhc19leHRfbW9kdWxlcyksCisgICAgICAgICAgICAgICAgICAgICgnYnVpbGRfc2NyaXB0cycsIGhhc19zY3JpcHRzKSwKKyAgICAgICAgICAgICAgICAgICBdCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjJmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjJmZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2NsaWIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2NsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA1NTg3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfY2xpYi5weQpAQCAtMCwwICsxLDIwOSBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfY2xpYgorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ2J1aWxkX2NsaWInIGNvbW1hbmQsIHRvIGJ1aWxkIGEgQy9DKysgbGlicmFyeQordGhhdCBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kdWxlIGRpc3RyaWJ1dGlvbiBhbmQgbmVlZGVkIGJ5IGFuIGV4dGVuc2lvbgorbW9kdWxlLiIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworCisjIFhYWCB0aGlzIG1vZHVsZSBoYXMgKmxvdHMqIG9mIGNvZGUgcmlwcGVkLW9mZiBxdWl0ZSB0cmFuc3BhcmVudGx5IGZyb20KKyMgYnVpbGRfZXh0LnB5IC0tIG5vdCBzdXJwcmlzaW5nbHkgcmVhbGx5LCBhcyB0aGUgd29yayByZXF1aXJlZCB0byBidWlsZAorIyBhIHN0YXRpYyBsaWJyYXJ5IGZyb20gYSBjb2xsZWN0aW9uIG9mIEMgc291cmNlIGZpbGVzIGlzIG5vdCByZWFsbHkgYWxsCisjIHRoYXQgZGlmZmVyZW50IGZyb20gd2hhdCdzIHJlcXVpcmVkIHRvIGJ1aWxkIGEgc2hhcmVkIG9iamVjdCBmaWxlIGZyb20KKyMgYSBjb2xsZWN0aW9uIG9mIEMgc291cmNlIGZpbGVzLiAgTmV2ZXJ0aGVsZXNzLCBJIGhhdmVuJ3QgZG9uZSB0aGUKKyMgbmVjZXNzYXJ5IHJlZmFjdG9yaW5nIHRvIGFjY291bnQgZm9yIHRoZSBvdmVybGFwIGluIGNvZGUgYmV0d2VlbiB0aGUKKyMgdHdvIG1vZHVsZXMsIG1haW5seSBiZWNhdXNlIGEgbnVtYmVyIG9mIHN1YnRsZSBkZXRhaWxzIGNoYW5nZWQgaW4gdGhlCisjIGN1dCAnbiBwYXN0ZS4gIFNpZ2guCisKK2ltcG9ydCBvcworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCitmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGN1c3RvbWl6ZV9jb21waWxlcgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCitkZWYgc2hvd19jb21waWxlcnMoKToKKyAgICBmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IHNob3dfY29tcGlsZXJzCisgICAgc2hvd19jb21waWxlcnMoKQorCisKK2NsYXNzIGJ1aWxkX2NsaWIoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJidWlsZCBDL0MrKyBsaWJyYXJpZXMgdXNlZCBieSBQeXRob24gZXh0ZW5zaW9ucyIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdidWlsZC1jbGliPScsICdiJywKKyAgICAgICAgICJkaXJlY3RvcnkgdG8gYnVpbGQgQy9DKysgbGlicmFyaWVzIHRvIiksCisgICAgICAgICgnYnVpbGQtdGVtcD0nLCAndCcsCisgICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCB0ZW1wb3JhcnkgYnVpbGQgYnktcHJvZHVjdHMiKSwKKyAgICAgICAgKCdkZWJ1ZycsICdnJywKKyAgICAgICAgICJjb21waWxlIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uIiksCisgICAgICAgICgnZm9yY2UnLCAnZicsCisgICAgICAgICAiZm9yY2libHkgYnVpbGQgZXZlcnl0aGluZyAoaWdub3JlIGZpbGUgdGltZXN0YW1wcykiKSwKKyAgICAgICAgKCdjb21waWxlcj0nLCAnYycsCisgICAgICAgICAic3BlY2lmeSB0aGUgY29tcGlsZXIgdHlwZSIpLAorICAgICAgICBdCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ2RlYnVnJywgJ2ZvcmNlJ10KKworICAgIGhlbHBfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdoZWxwLWNvbXBpbGVyJywgTm9uZSwKKyAgICAgICAgICJsaXN0IGF2YWlsYWJsZSBjb21waWxlcnMiLCBzaG93X2NvbXBpbGVycyksCisgICAgICAgIF0KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYnVpbGRfY2xpYiA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZF90ZW1wID0gTm9uZQorCisgICAgICAgICMgTGlzdCBvZiBsaWJyYXJpZXMgdG8gYnVpbGQKKyAgICAgICAgc2VsZi5saWJyYXJpZXMgPSBOb25lCisKKyAgICAgICAgIyBDb21waWxhdGlvbiBvcHRpb25zIGZvciBhbGwgbGlicmFyaWVzCisgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzID0gTm9uZQorICAgICAgICBzZWxmLmRlZmluZSA9IE5vbmUKKyAgICAgICAgc2VsZi51bmRlZiA9IE5vbmUKKyAgICAgICAgc2VsZi5kZWJ1ZyA9IE5vbmUKKyAgICAgICAgc2VsZi5mb3JjZSA9IDAKKyAgICAgICAgc2VsZi5jb21waWxlciA9IE5vbmUKKworCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgICMgVGhpcyBtaWdodCBiZSBjb25mdXNpbmc6IGJvdGggYnVpbGQtY2xpYiBhbmQgYnVpbGQtdGVtcCBkZWZhdWx0CisgICAgICAgICMgdG8gYnVpbGQtdGVtcCBhcyBkZWZpbmVkIGJ5IHRoZSAiYnVpbGQiIGNvbW1hbmQuICBUaGlzIGlzIGJlY2F1c2UKKyAgICAgICAgIyBJIHRoaW5rIHRoYXQgQyBsaWJyYXJpZXMgYXJlIHJlYWxseSBqdXN0IHRlbXBvcmFyeSBidWlsZAorICAgICAgICAjIGJ5LXByb2R1Y3RzLCBhdCBsZWFzdCBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIGJ1aWxkaW5nIFB5dGhvbgorICAgICAgICAjIGV4dGVuc2lvbnMgLS0gYnV0IEkgd2FudCB0byBrZWVwIG15IG9wdGlvbnMgb3Blbi4KKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2J1aWxkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdidWlsZF90ZW1wJywgJ2J1aWxkX2NsaWInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdidWlsZF90ZW1wJywgJ2J1aWxkX3RlbXAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdjb21waWxlcicsICdjb21waWxlcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2RlYnVnJywgJ2RlYnVnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZm9yY2UnLCAnZm9yY2UnKSkKKworICAgICAgICBzZWxmLmxpYnJhcmllcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmxpYnJhcmllcworICAgICAgICBpZiBzZWxmLmxpYnJhcmllczoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbGlicmFyeV9saXN0KHNlbGYubGlicmFyaWVzKQorCisgICAgICAgIGlmIHNlbGYuaW5jbHVkZV9kaXJzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmluY2x1ZGVfZGlycyA9IHNlbGYuZGlzdHJpYnV0aW9uLmluY2x1ZGVfZGlycyBvciBbXQorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5jbHVkZV9kaXJzLCBzdHIpOgorICAgICAgICAgICAgc2VsZi5pbmNsdWRlX2RpcnMgPSBzZWxmLmluY2x1ZGVfZGlycy5zcGxpdChvcy5wYXRoc2VwKQorCisgICAgICAgICMgWFhYIHNhbWUgYXMgZm9yIGJ1aWxkX2V4dCAtLSB3aGF0IGFib3V0ICdzZWxmLmRlZmluZScgYW5kCisgICAgICAgICMgJ3NlbGYudW5kZWYnID8KKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmxpYnJhcmllczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgWWVjaCAtLSB0aGlzIGlzIGN1dCAnbiBwYXN0ZWQgZnJvbSBidWlsZF9leHQucHkhCisgICAgICAgIGZyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgbmV3X2NvbXBpbGVyCisgICAgICAgIHNlbGYuY29tcGlsZXIgPSBuZXdfY29tcGlsZXIoY29tcGlsZXI9c2VsZi5jb21waWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1zZWxmLmZvcmNlKQorICAgICAgICBjdXN0b21pemVfY29tcGlsZXIoc2VsZi5jb21waWxlcikKKworICAgICAgICBpZiBzZWxmLmluY2x1ZGVfZGlycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuc2V0X2luY2x1ZGVfZGlycyhzZWxmLmluY2x1ZGVfZGlycykKKyAgICAgICAgaWYgc2VsZi5kZWZpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjICdkZWZpbmUnIG9wdGlvbiBpcyBhIGxpc3Qgb2YgKG5hbWUsdmFsdWUpIHR1cGxlcworICAgICAgICAgICAgZm9yIChuYW1lLHZhbHVlKSBpbiBzZWxmLmRlZmluZToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBpbGVyLmRlZmluZV9tYWNybyhuYW1lLCB2YWx1ZSkKKyAgICAgICAgaWYgc2VsZi51bmRlZiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBtYWNybyBpbiBzZWxmLnVuZGVmOgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIudW5kZWZpbmVfbWFjcm8obWFjcm8pCisKKyAgICAgICAgc2VsZi5idWlsZF9saWJyYXJpZXMoc2VsZi5saWJyYXJpZXMpCisKKworICAgIGRlZiBjaGVja19saWJyYXJ5X2xpc3Qoc2VsZiwgbGlicmFyaWVzKToKKyAgICAgICAgIiIiRW5zdXJlIHRoYXQgdGhlIGxpc3Qgb2YgbGlicmFyaWVzIGlzIHZhbGlkLgorCisgICAgICAgIGBsaWJyYXJ5YCBpcyBwcmVzdW1hYmx5IHByb3ZpZGVkIGFzIGEgY29tbWFuZCBvcHRpb24gJ2xpYnJhcmllcycuCisgICAgICAgIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGF0IGl0IGlzIGEgbGlzdCBvZiAyLXR1cGxlcywgd2hlcmUgdGhlIHR1cGxlcworICAgICAgICBhcmUgKGxpYnJhcnlfbmFtZSwgYnVpbGRfaW5mb19kaWN0KS4KKworICAgICAgICBSYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yIGlmIHRoZSBzdHJ1Y3R1cmUgaXMgaW52YWxpZCBhbnl3aGVyZTsKKyAgICAgICAganVzdCByZXR1cm5zIG90aGVyd2lzZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGxpYnJhcmllcywgbGlzdCk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiJ2xpYnJhcmllcycgb3B0aW9uIG11c3QgYmUgYSBsaXN0IG9mIHR1cGxlcyIKKworICAgICAgICBmb3IgbGliIGluIGxpYnJhcmllczoKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGxpYiwgdHVwbGUpIGFuZCBsZW4obGliKSAhPSAyOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAiZWFjaCBlbGVtZW50IG9mICdsaWJyYXJpZXMnIG11c3QgYSAyLXR1cGxlIgorCisgICAgICAgICAgICBuYW1lLCBidWlsZF9pbmZvID0gbGliCisKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5hbWUsIHN0cik6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJmaXJzdCBlbGVtZW50IG9mIGVhY2ggdHVwbGUgaW4gJ2xpYnJhcmllcycgIiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBhIHN0cmluZyAodGhlIGxpYnJhcnkgbmFtZSkiCisgICAgICAgICAgICBpZiAnLycgaW4gbmFtZSBvciAob3Muc2VwICE9ICcvJyBhbmQgb3Muc2VwIGluIG5hbWUpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoImJhZCBsaWJyYXJ5IG5hbWUgJyVzJzogIiArCisgICAgICAgICAgICAgICAgICAgICAgICJtYXkgbm90IGNvbnRhaW4gZGlyZWN0b3J5IHNlcGFyYXRvcnMiKSAlIFwKKyAgICAgICAgICAgICAgICAgICAgICBsaWJbMF0KKworICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVpbGRfaW5mbywgZGljdCk6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJzZWNvbmQgZWxlbWVudCBvZiBlYWNoIHR1cGxlIGluICdsaWJyYXJpZXMnICIgKyBcCisgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgYSBkaWN0aW9uYXJ5IChidWlsZCBpbmZvKSIKKworICAgIGRlZiBnZXRfbGlicmFyeV9uYW1lcyhzZWxmKToKKyAgICAgICAgIyBBc3N1bWUgdGhlIGxpYnJhcnkgbGlzdCBpcyB2YWxpZCAtLSAnY2hlY2tfbGlicmFyeV9saXN0KCknIGlzCisgICAgICAgICMgY2FsbGVkIGZyb20gJ2ZpbmFsaXplX29wdGlvbnMoKScsIHNvIGl0IHNob3VsZCBiZSEKKyAgICAgICAgaWYgbm90IHNlbGYubGlicmFyaWVzOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBsaWJfbmFtZXMgPSBbXQorICAgICAgICBmb3IgKGxpYl9uYW1lLCBidWlsZF9pbmZvKSBpbiBzZWxmLmxpYnJhcmllczoKKyAgICAgICAgICAgIGxpYl9uYW1lcy5hcHBlbmQobGliX25hbWUpCisgICAgICAgIHJldHVybiBsaWJfbmFtZXMKKworCisgICAgZGVmIGdldF9zb3VyY2VfZmlsZXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfbGlicmFyeV9saXN0KHNlbGYubGlicmFyaWVzKQorICAgICAgICBmaWxlbmFtZXMgPSBbXQorICAgICAgICBmb3IgKGxpYl9uYW1lLCBidWlsZF9pbmZvKSBpbiBzZWxmLmxpYnJhcmllczoKKyAgICAgICAgICAgIHNvdXJjZXMgPSBidWlsZF9pbmZvLmdldCgnc291cmNlcycpCisgICAgICAgICAgICBpZiBzb3VyY2VzIGlzIE5vbmUgb3Igbm90IGlzaW5zdGFuY2Uoc291cmNlcywgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICgiaW4gJ2xpYnJhcmllcycgb3B0aW9uIChsaWJyYXJ5ICclcycpLCAiCisgICAgICAgICAgICAgICAgICAgICAgICInc291cmNlcycgbXVzdCBiZSBwcmVzZW50IGFuZCBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgImEgbGlzdCBvZiBzb3VyY2UgZmlsZW5hbWVzIikgJSBsaWJfbmFtZQorCisgICAgICAgICAgICBmaWxlbmFtZXMuZXh0ZW5kKHNvdXJjZXMpCisgICAgICAgIHJldHVybiBmaWxlbmFtZXMKKworICAgIGRlZiBidWlsZF9saWJyYXJpZXMoc2VsZiwgbGlicmFyaWVzKToKKyAgICAgICAgZm9yIChsaWJfbmFtZSwgYnVpbGRfaW5mbykgaW4gbGlicmFyaWVzOgorICAgICAgICAgICAgc291cmNlcyA9IGJ1aWxkX2luZm8uZ2V0KCdzb3VyY2VzJykKKyAgICAgICAgICAgIGlmIHNvdXJjZXMgaXMgTm9uZSBvciBub3QgaXNpbnN0YW5jZShzb3VyY2VzLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKCJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIgKworICAgICAgICAgICAgICAgICAgICAgICAiJ3NvdXJjZXMnIG11c3QgYmUgcHJlc2VudCBhbmQgbXVzdCBiZSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgImEgbGlzdCBvZiBzb3VyY2UgZmlsZW5hbWVzIikgJSBsaWJfbmFtZQorICAgICAgICAgICAgc291cmNlcyA9IGxpc3Qoc291cmNlcykKKworICAgICAgICAgICAgbG9nLmluZm8oImJ1aWxkaW5nICclcycgbGlicmFyeSIsIGxpYl9uYW1lKQorCisgICAgICAgICAgICAjIEZpcnN0LCBjb21waWxlIHRoZSBzb3VyY2UgY29kZSB0byBvYmplY3QgZmlsZXMgaW4gdGhlIGxpYnJhcnkKKyAgICAgICAgICAgICMgZGlyZWN0b3J5LiAgKFRoaXMgc2hvdWxkIHByb2JhYmx5IGNoYW5nZSB0byBwdXR0aW5nIG9iamVjdAorICAgICAgICAgICAgIyBmaWxlcyBpbiBhIHRlbXBvcmFyeSBidWlsZCBkaXJlY3RvcnkuKQorICAgICAgICAgICAgbWFjcm9zID0gYnVpbGRfaW5mby5nZXQoJ21hY3JvcycpCisgICAgICAgICAgICBpbmNsdWRlX2RpcnMgPSBidWlsZF9pbmZvLmdldCgnaW5jbHVkZV9kaXJzJykKKyAgICAgICAgICAgIG9iamVjdHMgPSBzZWxmLmNvbXBpbGVyLmNvbXBpbGUoc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX3RlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3Jvcz1tYWNyb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1pbmNsdWRlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPXNlbGYuZGVidWcpCisKKyAgICAgICAgICAgICMgTm93ICJsaW5rIiB0aGUgb2JqZWN0IGZpbGVzIHRvZ2V0aGVyIGludG8gYSBzdGF0aWMgbGlicmFyeS4KKyAgICAgICAgICAgICMgKE9uIFVuaXggYXQgbGVhc3QsIHRoaXMgaXNuJ3QgcmVhbGx5IGxpbmtpbmcgLS0gaXQganVzdAorICAgICAgICAgICAgIyBidWlsZHMgYW4gYXJjaGl2ZS4gIFdoYXRldmVyLikKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuY3JlYXRlX3N0YXRpY19saWIob2JqZWN0cywgbGliX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9c2VsZi5idWlsZF9jbGliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1zZWxmLmRlYnVnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9jbGliLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfY2xpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhY2Q0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfY2xpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9jbGliLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfY2xpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVhY2Q0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfY2xpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzMyMTlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkKQEAgLTAsMCArMSw3OTkgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dAorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ2J1aWxkX2V4dCcgY29tbWFuZCwgZm9yIGJ1aWxkaW5nIGV4dGVuc2lvbgorbW9kdWxlcyAoY3VycmVudGx5IGxpbWl0ZWQgdG8gQyBleHRlbnNpb25zLCBzaG91bGQgYWNjb21tb2RhdGUgQysrCitleHRlbnNpb25zIEFTQVApLiIiIgorCisjIFRoaXMgbW9kdWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4xLgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IHN5cywgb3MsIHN0cmluZywgcmUKK2Zyb20gdHlwZXMgaW1wb3J0ICoKK2Zyb20gc2l0ZSBpbXBvcnQgVVNFUl9CQVNFLCBVU0VSX1NJVEUKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKgorZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIsIGdldF9weXRob25fdmVyc2lvbgorZnJvbSBkaXN0dXRpbHMuZGVwX3V0aWwgaW1wb3J0IG5ld2VyX2dyb3VwCitmcm9tIGRpc3R1dGlscy5leHRlbnNpb24gaW1wb3J0IEV4dGVuc2lvbgorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKKyMgR0NDKG1pbmd3KTogb3MubmFtZSBpcyAibnQiIGJ1dCBidWlsZCBzeXN0ZW0gaXMgcG9zaXgKK2lmIG9zLm5hbWUgPT0gJ250JyBhbmQgc3lzLnZlcnNpb24uZmluZCgnR0NDJykgPCAwOgorICAgIGZyb20gZGlzdHV0aWxzLm1zdmNjb21waWxlciBpbXBvcnQgZ2V0X2J1aWxkX3ZlcnNpb24KKyAgICBNU1ZDX1ZFUlNJT04gPSBpbnQoZ2V0X2J1aWxkX3ZlcnNpb24oKSkKKworIyBBbiBleHRlbnNpb24gbmFtZSBpcyBqdXN0IGEgZG90LXNlcGFyYXRlZCBsaXN0IG9mIFB5dGhvbiBOQU1FcyAoaWUuCisjIHRoZSBzYW1lIGFzIGEgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBuYW1lKS4KK2V4dGVuc2lvbl9uYW1lX3JlID0gcmUuY29tcGlsZSBcCisgICAgKHInXlthLXpBLVpfXVthLXpBLVpfMC05XSooXC5bYS16QS1aX11bYS16QS1aXzAtOV0qKSokJykKKworCitkZWYgc2hvd19jb21waWxlcnMgKCk6CisgICAgZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBzaG93X2NvbXBpbGVycworICAgIHNob3dfY29tcGlsZXJzKCkKKworCitjbGFzcyBidWlsZF9leHQgKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAiYnVpbGQgQy9DKysgZXh0ZW5zaW9ucyAoY29tcGlsZS9saW5rIHRvIGJ1aWxkIGRpcmVjdG9yeSkiCisKKyAgICAjIFhYWCB0aG91Z2h0cyBvbiBob3cgdG8gZGVhbCB3aXRoIGNvbXBsZXggY29tbWFuZC1saW5lIG9wdGlvbnMgbGlrZQorICAgICMgdGhlc2UsIGkuZS4gaG93IHRvIG1ha2UgaXQgc28gZmFuY3lfZ2V0b3B0IGNhbiBzdWNrIHRoZW0gb2ZmIHRoZQorICAgICMgY29tbWFuZCBsaW5lIGFuZCBtYWtlIGl0IGxvb2sgbGlrZSBzZXR1cC5weSBkZWZpbmVkIHRoZSBhcHByb3ByaWF0ZQorICAgICMgbGlzdHMgb2YgdHVwbGVzIG9mIHdoYXQtaGF2ZS15b3UuCisgICAgIyAgIC0gZWFjaCBjb21tYW5kIG5lZWRzIGEgY2FsbGJhY2sgdG8gcHJvY2VzcyBpdHMgY29tbWFuZC1saW5lIG9wdGlvbnMKKyAgICAjICAgLSBDb21tYW5kLl9faW5pdF9fKCkgbmVlZHMgYWNjZXNzIHRvIGl0cyBzaGFyZSBvZiB0aGUgd2hvbGUKKyAgICAjICAgICBjb21tYW5kIGxpbmUgKG11c3QgdWx0aW1hdGVseSBjb21lIGZyb20KKyAgICAjICAgICBEaXN0cmlidXRpb24ucGFyc2VfY29tbWFuZF9saW5lKCkpCisgICAgIyAgIC0gaXQgdGhlbiBjYWxscyB0aGUgY3VycmVudCBjb21tYW5kIGNsYXNzJyBvcHRpb24tcGFyc2luZworICAgICMgICAgIGNhbGxiYWNrIHRvIGRlYWwgd2l0aCB3ZWlyZCBvcHRpb25zIGxpa2UgLUQsIHdoaWNoIGhhdmUgdG8KKyAgICAjICAgICBwYXJzZSB0aGUgb3B0aW9uIHRleHQgYW5kIGNodXJuIG91dCBzb21lIGN1c3RvbSBkYXRhCisgICAgIyAgICAgc3RydWN0dXJlCisgICAgIyAgIC0gdGhhdCBkYXRhIHN0cnVjdHVyZSAoaW4gdGhpcyBjYXNlLCBhIGxpc3Qgb2YgMi10dXBsZXMpCisgICAgIyAgICAgd2lsbCB0aGVuIGJlIHByZXNlbnQgaW4gdGhlIGNvbW1hbmQgb2JqZWN0IGJ5IHRoZSB0aW1lCisgICAgIyAgICAgd2UgZ2V0IHRvIGZpbmFsaXplX29wdGlvbnMoKSAoaS5lLiB0aGUgY29uc3RydWN0b3IKKyAgICAjICAgICB0YWtlcyBjYXJlIG9mIGJvdGggY29tbWFuZC1saW5lIGFuZCBjbGllbnQgb3B0aW9ucworICAgICMgICAgIGluIGJldHdlZW4gaW5pdGlhbGl6ZV9vcHRpb25zKCkgYW5kIGZpbmFsaXplX29wdGlvbnMoKSkKKworICAgIHNlcF9ieSA9ICIgKHNlcGFyYXRlZCBieSAnJXMnKSIgJSBvcy5wYXRoc2VwCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2J1aWxkLWxpYj0nLCAnYicsCisgICAgICAgICAiZGlyZWN0b3J5IGZvciBjb21waWxlZCBleHRlbnNpb24gbW9kdWxlcyIpLAorICAgICAgICAoJ2J1aWxkLXRlbXA9JywgJ3QnLAorICAgICAgICAgImRpcmVjdG9yeSBmb3IgdGVtcG9yYXJ5IGZpbGVzIChidWlsZCBieS1wcm9kdWN0cykiKSwKKyAgICAgICAgKCdwbGF0LW5hbWU9JywgJ3AnLAorICAgICAgICAgInBsYXRmb3JtIG5hbWUgdG8gY3Jvc3MtY29tcGlsZSBmb3IsIGlmIHN1cHBvcnRlZCAiCisgICAgICAgICAiKGRlZmF1bHQ6ICVzKSIgJSBnZXRfcGxhdGZvcm0oKSksCisgICAgICAgICgnaW5wbGFjZScsICdpJywKKyAgICAgICAgICJpZ25vcmUgYnVpbGQtbGliIGFuZCBwdXQgY29tcGlsZWQgZXh0ZW5zaW9ucyBpbnRvIHRoZSBzb3VyY2UgIiArCisgICAgICAgICAiZGlyZWN0b3J5IGFsb25nc2lkZSB5b3VyIHB1cmUgUHl0aG9uIG1vZHVsZXMiKSwKKyAgICAgICAgKCdpbmNsdWRlLWRpcnM9JywgJ0knLAorICAgICAgICAgImxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBoZWFkZXIgZmlsZXMiICsgc2VwX2J5KSwKKyAgICAgICAgKCdkZWZpbmU9JywgJ0QnLAorICAgICAgICAgIkMgcHJlcHJvY2Vzc29yIG1hY3JvcyB0byBkZWZpbmUiKSwKKyAgICAgICAgKCd1bmRlZj0nLCAnVScsCisgICAgICAgICAiQyBwcmVwcm9jZXNzb3IgbWFjcm9zIHRvIHVuZGVmaW5lIiksCisgICAgICAgICgnbGlicmFyaWVzPScsICdsJywKKyAgICAgICAgICJleHRlcm5hbCBDIGxpYnJhcmllcyB0byBsaW5rIHdpdGgiKSwKKyAgICAgICAgKCdsaWJyYXJ5LWRpcnM9JywgJ0wnLAorICAgICAgICAgImRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgZXh0ZXJuYWwgQyBsaWJyYXJpZXMiICsgc2VwX2J5KSwKKyAgICAgICAgKCdycGF0aD0nLCAnUicsCisgICAgICAgICAiZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBzaGFyZWQgQyBsaWJyYXJpZXMgYXQgcnVudGltZSIpLAorICAgICAgICAoJ2xpbmstb2JqZWN0cz0nLCAnTycsCisgICAgICAgICAiZXh0cmEgZXhwbGljaXQgbGluayBvYmplY3RzIHRvIGluY2x1ZGUgaW4gdGhlIGxpbmsiKSwKKyAgICAgICAgKCdkZWJ1ZycsICdnJywKKyAgICAgICAgICJjb21waWxlL2xpbmsgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iKSwKKyAgICAgICAgKCdmb3JjZScsICdmJywKKyAgICAgICAgICJmb3JjaWJseSBidWlsZCBldmVyeXRoaW5nIChpZ25vcmUgZmlsZSB0aW1lc3RhbXBzKSIpLAorICAgICAgICAoJ2NvbXBpbGVyPScsICdjJywKKyAgICAgICAgICJzcGVjaWZ5IHRoZSBjb21waWxlciB0eXBlIiksCisgICAgICAgICgnc3dpZy1jcHAnLCBOb25lLAorICAgICAgICAgIm1ha2UgU1dJRyBjcmVhdGUgQysrIGZpbGVzIChkZWZhdWx0IGlzIEMpIiksCisgICAgICAgICgnc3dpZy1vcHRzPScsIE5vbmUsCisgICAgICAgICAibGlzdCBvZiBTV0lHIGNvbW1hbmQgbGluZSBvcHRpb25zIiksCisgICAgICAgICgnc3dpZz0nLCBOb25lLAorICAgICAgICAgInBhdGggdG8gdGhlIFNXSUcgZXhlY3V0YWJsZSIpLAorICAgICAgICAoJ3VzZXInLCBOb25lLAorICAgICAgICAgImFkZCB1c2VyIGluY2x1ZGUsIGxpYnJhcnkgYW5kIHJwYXRoIiksCisgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnaW5wbGFjZScsICdkZWJ1ZycsICdmb3JjZScsICdzd2lnLWNwcCcsICd1c2VyJ10KKworICAgIGhlbHBfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdoZWxwLWNvbXBpbGVyJywgTm9uZSwKKyAgICAgICAgICJsaXN0IGF2YWlsYWJsZSBjb21waWxlcnMiLCBzaG93X2NvbXBpbGVycyksCisgICAgICAgIF0KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLmV4dGVuc2lvbnMgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfbGliID0gTm9uZQorICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZF90ZW1wID0gTm9uZQorICAgICAgICBzZWxmLmlucGxhY2UgPSAwCisgICAgICAgIHNlbGYucGFja2FnZSA9IE5vbmUKKworICAgICAgICBzZWxmLmluY2x1ZGVfZGlycyA9IE5vbmUKKyAgICAgICAgc2VsZi5kZWZpbmUgPSBOb25lCisgICAgICAgIHNlbGYudW5kZWYgPSBOb25lCisgICAgICAgIHNlbGYubGlicmFyaWVzID0gTm9uZQorICAgICAgICBzZWxmLmxpYnJhcnlfZGlycyA9IE5vbmUKKyAgICAgICAgc2VsZi5ycGF0aCA9IE5vbmUKKyAgICAgICAgc2VsZi5saW5rX29iamVjdHMgPSBOb25lCisgICAgICAgIHNlbGYuZGVidWcgPSBOb25lCisgICAgICAgIHNlbGYuZm9yY2UgPSBOb25lCisgICAgICAgIHNlbGYuY29tcGlsZXIgPSBOb25lCisgICAgICAgIHNlbGYuc3dpZyA9IE5vbmUKKyAgICAgICAgc2VsZi5zd2lnX2NwcCA9IE5vbmUKKyAgICAgICAgc2VsZi5zd2lnX29wdHMgPSBOb25lCisgICAgICAgIHNlbGYudXNlciA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCisKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2J1aWxkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdidWlsZF9saWInLCAnYnVpbGRfbGliJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYnVpbGRfdGVtcCcsICdidWlsZF90ZW1wJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnY29tcGlsZXInLCAnY29tcGlsZXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdkZWJ1ZycsICdkZWJ1ZycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2ZvcmNlJywgJ2ZvcmNlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgncGxhdF9uYW1lJywgJ3BsYXRfbmFtZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgaWYgc2VsZi5wYWNrYWdlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2UgPSBzZWxmLmRpc3RyaWJ1dGlvbi5leHRfcGFja2FnZQorCisgICAgICAgIHNlbGYuZXh0ZW5zaW9ucyA9IHNlbGYuZGlzdHJpYnV0aW9uLmV4dF9tb2R1bGVzCisKKyAgICAgICAgIyBNYWtlIHN1cmUgUHl0aG9uJ3MgaW5jbHVkZSBkaXJlY3RvcmllcyAoZm9yIFB5dGhvbi5oLCBweWNvbmZpZy5oLAorICAgICAgICAjIGV0Yy4pIGFyZSBpbiB0aGUgaW5jbHVkZSBzZWFyY2ggcGF0aC4KKyAgICAgICAgcHlfaW5jbHVkZSA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2luYygpCisgICAgICAgIHBsYXRfcHlfaW5jbHVkZSA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2luYyhwbGF0X3NwZWNpZmljPTEpCisgICAgICAgIGlmIHNlbGYuaW5jbHVkZV9kaXJzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmluY2x1ZGVfZGlycyA9IHNlbGYuZGlzdHJpYnV0aW9uLmluY2x1ZGVfZGlycyBvciBbXQorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuaW5jbHVkZV9kaXJzLCBzdHIpOgorICAgICAgICAgICAgc2VsZi5pbmNsdWRlX2RpcnMgPSBzZWxmLmluY2x1ZGVfZGlycy5zcGxpdChvcy5wYXRoc2VwKQorCisgICAgICAgICMgUHV0IHRoZSBQeXRob24gInN5c3RlbSIgaW5jbHVkZSBkaXIgYXQgdGhlIGVuZCwgc28gdGhhdAorICAgICAgICAjIGFueSBsb2NhbCBpbmNsdWRlIGRpcnMgdGFrZSBwcmVjZWRlbmNlLgorICAgICAgICBzZWxmLmluY2x1ZGVfZGlycy5hcHBlbmQocHlfaW5jbHVkZSkKKyAgICAgICAgaWYgcGxhdF9weV9pbmNsdWRlICE9IHB5X2luY2x1ZGU6CisgICAgICAgICAgICBzZWxmLmluY2x1ZGVfZGlycy5hcHBlbmQocGxhdF9weV9pbmNsdWRlKQorCisgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZ19saXN0KCdsaWJyYXJpZXMnKQorCisgICAgICAgICMgTGlmZSBpcyBlYXNpZXIgaWYgd2UncmUgbm90IGZvcmV2ZXIgY2hlY2tpbmcgZm9yIE5vbmUsIHNvCisgICAgICAgICMgc2ltcGxpZnkgdGhlc2Ugb3B0aW9ucyB0byBlbXB0eSBsaXN0cyBpZiB1bnNldAorICAgICAgICBpZiBzZWxmLmxpYnJhcmllcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5saWJyYXJpZXMgPSBbXQorICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZGlycyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMgPSBbXQorICAgICAgICBlbGlmIHR5cGUoc2VsZi5saWJyYXJ5X2RpcnMpIGlzIFN0cmluZ1R5cGU6CisgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZGlycyA9IHN0cmluZy5zcGxpdChzZWxmLmxpYnJhcnlfZGlycywgb3MucGF0aHNlcCkKKworICAgICAgICBpZiBzZWxmLnJwYXRoIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnJwYXRoID0gW10KKyAgICAgICAgZWxpZiB0eXBlKHNlbGYucnBhdGgpIGlzIFN0cmluZ1R5cGU6CisgICAgICAgICAgICBzZWxmLnJwYXRoID0gc3RyaW5nLnNwbGl0KHNlbGYucnBhdGgsIG9zLnBhdGhzZXApCisKKyAgICAgICAgIyBmb3IgZXh0ZW5zaW9ucyB1bmRlciB3aW5kb3dzIHVzZSBkaWZmZXJlbnQgZGlyZWN0b3JpZXMKKyAgICAgICAgIyBmb3IgUmVsZWFzZSBhbmQgRGVidWcgYnVpbGRzLgorICAgICAgICAjIGFsc28gUHl0aG9uJ3MgbGlicmFyeSBkaXJlY3RvcnkgbXVzdCBiZSBhcHBlbmRlZCB0byBsaWJyYXJ5X2RpcnMKKyAgICAgICAgIyBHQ0MobWluZ3cpOiBvcy5uYW1lIGlzICJudCIgYnV0IGJ1aWxkIHN5c3RlbSBpcyBwb3NpeAorICAgICAgICBpZiBvcy5uYW1lID09ICdudCcgYW5kIHN5cy52ZXJzaW9uLmZpbmQoJ0dDQycpIDwgMDoKKyAgICAgICAgICAgICMgdGhlICdsaWJzJyBkaXJlY3RvcnkgaXMgZm9yIGJpbmFyeSBpbnN0YWxscyAtIHdlIGFzc3VtZSB0aGF0CisgICAgICAgICAgICAjIG11c3QgYmUgdGhlICpuYXRpdmUqIHBsYXRmb3JtLiAgQnV0IHdlIGRvbid0IHJlYWxseSBzdXBwb3J0CisgICAgICAgICAgICAjIGNyb3NzLWNvbXBpbGluZyB2aWEgYSBiaW5hcnkgaW5zdGFsbCBhbnl3YXksIHNvIHdlIGxldCBpdCBnby4KKyAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LCAnbGlicycpKQorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX3RlbXAgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF90ZW1wLCAiRGVidWciKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX3RlbXAgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF90ZW1wLCAiUmVsZWFzZSIpCisKKyAgICAgICAgICAgICMgQXBwZW5kIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIGluY2x1ZGUgYW5kIGxpYnJhcnkgZGlyZWN0b3JpZXMsCisgICAgICAgICAgICAjIHRoaXMgYWxsb3dzIGRpc3R1dGlscyBvbiB3aW5kb3dzIHRvIHdvcmsgaW4gdGhlIHNvdXJjZSB0cmVlCisgICAgICAgICAgICBzZWxmLmluY2x1ZGVfZGlycy5hcHBlbmQob3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwgJ1BDJykpCisgICAgICAgICAgICBpZiBNU1ZDX1ZFUlNJT04gPT0gOToKKyAgICAgICAgICAgICAgICAjIFVzZSB0aGUgLmxpYiBmaWxlcyBmb3IgdGhlIGNvcnJlY3QgYXJjaGl0ZWN0dXJlCisgICAgICAgICAgICAgICAgaWYgc2VsZi5wbGF0X25hbWUgPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gJycKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIHdpbi1hbWQ2NCBvciB3aW4taWE2NAorICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBzZWxmLnBsYXRfbmFtZVs0Ol0KKyAgICAgICAgICAgICAgICBuZXdfbGliID0gb3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwgJ1BDYnVpbGQnKQorICAgICAgICAgICAgICAgIGlmIHN1ZmZpeDoKKyAgICAgICAgICAgICAgICAgICAgbmV3X2xpYiA9IG9zLnBhdGguam9pbihuZXdfbGliLCBzdWZmaXgpCisgICAgICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMuYXBwZW5kKG5ld19saWIpCisKKyAgICAgICAgICAgIGVsaWYgTVNWQ19WRVJTSU9OID09IDg6CisgICAgICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMuYXBwZW5kKG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQQycsICdWUzguMCcpKQorICAgICAgICAgICAgZWxpZiBNU1ZDX1ZFUlNJT04gPT0gNzoKKyAgICAgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZGlycy5hcHBlbmQob3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BDJywgJ1ZTNy4xJykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUEMnLCAnVkM2JykpCisKKyAgICAgICAgIyBPUy8yIChFTVgpIGRvZXNuJ3Qgc3VwcG9ydCBEZWJ1ZyB2cyBSZWxlYXNlIGJ1aWxkcywgYnV0IGhhcyB0aGUKKyAgICAgICAgIyBpbXBvcnQgbGlicmFyaWVzIGluIGl0cyAiQ29uZmlnIiBzdWJkaXJlY3RvcnkKKyAgICAgICAgaWYgb3MubmFtZSA9PSAnb3MyJzoKKyAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LCAnQ29uZmlnJykpCisKKyAgICAgICAgIyBmb3IgZXh0ZW5zaW9ucyB1bmRlciBDeWd3aW4gYW5kIEF0aGVPUyBQeXRob24ncyBsaWJyYXJ5IGRpcmVjdG9yeSBtdXN0IGJlCisgICAgICAgICMgYXBwZW5kZWQgdG8gbGlicmFyeV9kaXJzCisgICAgICAgIGlmIChzeXMucGxhdGZvcm1bOjZdID09ICdjeWd3aW4nIG9yIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gJ2F0aGVvcycKKyAgICAgICAgICAgIG9yIChzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBhbmQgc3lzLnZlcnNpb24uZmluZCgnR0NDJykgPj0gMCkpOgorICAgICAgICAgICAgaWYgc3lzLmV4ZWN1dGFibGUuc3RhcnRzd2l0aChvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LCAiYmluIikpOgorICAgICAgICAgICAgICAgICMgYnVpbGRpbmcgdGhpcmQgcGFydHkgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgImxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uIiArIGdldF9weXRob25fdmVyc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZyIpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGJ1aWxkaW5nIHB5dGhvbiBzdGFuZGFyZCBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMuYXBwZW5kKCcuJykKKworICAgICAgICAjIGZvciBleHRlbnNpb25zIHVuZGVyIExpbnV4IG9yIFNvbGFyaXMgd2l0aCBhIHNoYXJlZCBQeXRob24gbGlicmFyeSwKKyAgICAgICAgIyBQeXRob24ncyBsaWJyYXJ5IGRpcmVjdG9yeSBtdXN0IGJlIGFwcGVuZGVkIHRvIGxpYnJhcnlfZGlycworICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1B5X0VOQUJMRV9TSEFSRUQnKQorICAgICAgICBpZiAoKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdsaW51eCcpIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdnbnUnKQorICAgICAgICAgICAgIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdzdW5vcycpKQorICAgICAgICAgICAgYW5kIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignUHlfRU5BQkxFX1NIQVJFRCcpKToKKyAgICAgICAgICAgIGlmIHN5cy5leGVjdXRhYmxlLnN0YXJ0c3dpdGgob3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwgImJpbiIpKToKKyAgICAgICAgICAgICAgICAjIGJ1aWxkaW5nIHRoaXJkIHBhcnR5IGV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZGlycy5hcHBlbmQoc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdMSUJESVInKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBidWlsZGluZyBweXRob24gc3RhbmRhcmQgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzLmFwcGVuZCgnLicpCisKKyAgICAgICAgIyBUaGUgYXJndW1lbnQgcGFyc2luZyB3aWxsIHJlc3VsdCBpbiBzZWxmLmRlZmluZSBiZWluZyBhIHN0cmluZywgYnV0CisgICAgICAgICMgaXQgaGFzIHRvIGJlIGEgbGlzdCBvZiAyLXR1cGxlcy4gIEFsbCB0aGUgcHJlcHJvY2Vzc29yIHN5bWJvbHMKKyAgICAgICAgIyBzcGVjaWZpZWQgYnkgdGhlICdkZWZpbmUnIG9wdGlvbiB3aWxsIGJlIHNldCB0byAnMScuICBNdWx0aXBsZQorICAgICAgICAjIHN5bWJvbHMgY2FuIGJlIHNlcGFyYXRlZCB3aXRoIGNvbW1hcy4KKworICAgICAgICBpZiBzZWxmLmRlZmluZToKKyAgICAgICAgICAgIGRlZmluZXMgPSBzZWxmLmRlZmluZS5zcGxpdCgnLCcpCisgICAgICAgICAgICBzZWxmLmRlZmluZSA9IG1hcChsYW1iZGEgc3ltYm9sOiAoc3ltYm9sLCAnMScpLCBkZWZpbmVzKQorCisgICAgICAgICMgVGhlIG9wdGlvbiBmb3IgbWFjcm9zIHRvIHVuZGVmaW5lIGlzIGFsc28gYSBzdHJpbmcgZnJvbSB0aGUKKyAgICAgICAgIyBvcHRpb24gcGFyc2luZywgYnV0IGhhcyB0byBiZSBhIGxpc3QuICBNdWx0aXBsZSBzeW1ib2xzIGNhbiBhbHNvCisgICAgICAgICMgYmUgc2VwYXJhdGVkIHdpdGggY29tbWFzIGhlcmUuCisgICAgICAgIGlmIHNlbGYudW5kZWY6CisgICAgICAgICAgICBzZWxmLnVuZGVmID0gc2VsZi51bmRlZi5zcGxpdCgnLCcpCisKKyAgICAgICAgaWYgc2VsZi5zd2lnX29wdHMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc3dpZ19vcHRzID0gW10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3dpZ19vcHRzID0gc2VsZi5zd2lnX29wdHMuc3BsaXQoJyAnKQorCisgICAgICAgICMgRmluYWxseSBhZGQgdGhlIHVzZXIgaW5jbHVkZSBhbmQgbGlicmFyeSBkaXJlY3RvcmllcyBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgc2VsZi51c2VyOgorICAgICAgICAgICAgdXNlcl9pbmNsdWRlID0gb3MucGF0aC5qb2luKFVTRVJfQkFTRSwgImluY2x1ZGUiKQorICAgICAgICAgICAgdXNlcl9saWIgPSBvcy5wYXRoLmpvaW4oVVNFUl9CQVNFLCAibGliIikKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIodXNlcl9pbmNsdWRlKToKKyAgICAgICAgICAgICAgICBzZWxmLmluY2x1ZGVfZGlycy5hcHBlbmQodXNlcl9pbmNsdWRlKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih1c2VyX2xpYik6CisgICAgICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMuYXBwZW5kKHVzZXJfbGliKQorICAgICAgICAgICAgICAgIHNlbGYucnBhdGguYXBwZW5kKHVzZXJfbGliKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBuZXdfY29tcGlsZXIKKworICAgICAgICAjICdzZWxmLmV4dGVuc2lvbnMnLCBhcyBzdXBwbGllZCBieSBzZXR1cC5weSwgaXMgYSBsaXN0IG9mCisgICAgICAgICMgRXh0ZW5zaW9uIGluc3RhbmNlcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgRXh0ZW5zaW9uIChpbgorICAgICAgICAjIGRpc3R1dGlscy5leHRlbnNpb24pIGZvciBkZXRhaWxzLgorICAgICAgICAjCisgICAgICAgICMgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggRGlzdHV0aWxzIDAuOC4yIGFuZCBlYXJsaWVyLCB3ZQorICAgICAgICAjIGFsc28gYWxsb3cgdGhlICdleHRlbnNpb25zJyBsaXN0IHRvIGJlIGEgbGlzdCBvZiB0dXBsZXM6CisgICAgICAgICMgICAgKGV4dF9uYW1lLCBidWlsZF9pbmZvKQorICAgICAgICAjIHdoZXJlIGJ1aWxkX2luZm8gaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgZXZlcnl0aGluZyB0aGF0CisgICAgICAgICMgRXh0ZW5zaW9uIGluc3RhbmNlcyBkbyBleGNlcHQgdGhlIG5hbWUsIHdpdGggYSBmZXcgdGhpbmdzIGJlaW5nCisgICAgICAgICMgZGlmZmVyZW50bHkgbmFtZWQuICBXZSBjb252ZXJ0IHRoZXNlIDItdHVwbGVzIHRvIEV4dGVuc2lvbgorICAgICAgICAjIGluc3RhbmNlcyBhcyBuZWVkZWQuCisKKyAgICAgICAgaWYgbm90IHNlbGYuZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgSWYgd2Ugd2VyZSBhc2tlZCB0byBidWlsZCBhbnkgQy9DKysgbGlicmFyaWVzLCBtYWtlIHN1cmUgdGhhdCB0aGUKKyAgICAgICAgIyBkaXJlY3Rvcnkgd2hlcmUgd2UgcHV0IHRoZW0gaXMgaW4gdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGggZm9yCisgICAgICAgICMgbGlua2luZyBleHRlbnNpb25zLgorICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfY19saWJyYXJpZXMoKToKKyAgICAgICAgICAgIGJ1aWxkX2NsaWIgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfY2xpYicpCisgICAgICAgICAgICBzZWxmLmxpYnJhcmllcy5leHRlbmQoYnVpbGRfY2xpYi5nZXRfbGlicmFyeV9uYW1lcygpIG9yIFtdKQorICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMuYXBwZW5kKGJ1aWxkX2NsaWIuYnVpbGRfY2xpYikKKworICAgICAgICAjIFNldHVwIHRoZSBDQ29tcGlsZXIgb2JqZWN0IHRoYXQgd2UnbGwgdXNlIHRvIGRvIGFsbCB0aGUKKyAgICAgICAgIyBjb21waWxpbmcgYW5kIGxpbmtpbmcKKyAgICAgICAgc2VsZi5jb21waWxlciA9IG5ld19jb21waWxlcihjb21waWxlcj1zZWxmLmNvbXBpbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9c2VsZi52ZXJib3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPXNlbGYuZm9yY2UpCisgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihzZWxmLmNvbXBpbGVyKQorICAgICAgICAjIElmIHdlIGFyZSBjcm9zcy1jb21waWxpbmcsIGluaXQgdGhlIGNvbXBpbGVyIG5vdyAoaWYgd2UgYXJlIG5vdAorICAgICAgICAjIGNyb3NzLWNvbXBpbGluZywgaW5pdCB3b3VsZCBub3QgaHVydCwgYnV0IHBlb3BsZSBtYXkgcmVseSBvbgorICAgICAgICAjIGxhdGUgaW5pdGlhbGl6YXRpb24gb2YgY29tcGlsZXIgZXZlbiBpZiB0aGV5IHNob3VsZG4ndC4uLikKKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnIGFuZCBzZWxmLnBsYXRfbmFtZSAhPSBnZXRfcGxhdGZvcm0oKToKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuaW5pdGlhbGl6ZShzZWxmLnBsYXRfbmFtZSkKKworICAgICAgICAjIEFuZCBtYWtlIHN1cmUgdGhhdCBhbnkgY29tcGlsZS9saW5rLXJlbGF0ZWQgb3B0aW9ucyAod2hpY2ggbWlnaHQKKyAgICAgICAgIyBjb21lIGZyb20gdGhlIGNvbW1hbmQtbGluZSBvciBmcm9tIHRoZSBzZXR1cCBzY3JpcHQpIGFyZSBzZXQgaW4KKyAgICAgICAgIyB0aGF0IENDb21waWxlciBvYmplY3QgLS0gdGhhdCB3YXksIHRoZXkgYXV0b21hdGljYWxseSBhcHBseSB0bworICAgICAgICAjIGFsbCBjb21waWxpbmcgYW5kIGxpbmtpbmcgZG9uZSBoZXJlLgorICAgICAgICBpZiBzZWxmLmluY2x1ZGVfZGlycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuc2V0X2luY2x1ZGVfZGlycyhzZWxmLmluY2x1ZGVfZGlycykKKyAgICAgICAgaWYgc2VsZi5kZWZpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjICdkZWZpbmUnIG9wdGlvbiBpcyBhIGxpc3Qgb2YgKG5hbWUsdmFsdWUpIHR1cGxlcworICAgICAgICAgICAgZm9yIChuYW1lLCB2YWx1ZSkgaW4gc2VsZi5kZWZpbmU6CisgICAgICAgICAgICAgICAgc2VsZi5jb21waWxlci5kZWZpbmVfbWFjcm8obmFtZSwgdmFsdWUpCisgICAgICAgIGlmIHNlbGYudW5kZWYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3IgbWFjcm8gaW4gc2VsZi51bmRlZjoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBpbGVyLnVuZGVmaW5lX21hY3JvKG1hY3JvKQorICAgICAgICBpZiBzZWxmLmxpYnJhcmllcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuc2V0X2xpYnJhcmllcyhzZWxmLmxpYnJhcmllcykKKyAgICAgICAgaWYgc2VsZi5saWJyYXJ5X2RpcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNvbXBpbGVyLnNldF9saWJyYXJ5X2RpcnMoc2VsZi5saWJyYXJ5X2RpcnMpCisgICAgICAgIGlmIHNlbGYucnBhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNvbXBpbGVyLnNldF9ydW50aW1lX2xpYnJhcnlfZGlycyhzZWxmLnJwYXRoKQorICAgICAgICBpZiBzZWxmLmxpbmtfb2JqZWN0cyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuc2V0X2xpbmtfb2JqZWN0cyhzZWxmLmxpbmtfb2JqZWN0cykKKworICAgICAgICAjIE5vdyBhY3R1YWxseSBjb21waWxlIGFuZCBsaW5rIGV2ZXJ5dGhpbmcuCisgICAgICAgIHNlbGYuYnVpbGRfZXh0ZW5zaW9ucygpCisKKyAgICBkZWYgY2hlY2tfZXh0ZW5zaW9uc19saXN0KHNlbGYsIGV4dGVuc2lvbnMpOgorICAgICAgICAiIiJFbnN1cmUgdGhhdCB0aGUgbGlzdCBvZiBleHRlbnNpb25zIChwcmVzdW1hYmx5IHByb3ZpZGVkIGFzIGEKKyAgICAgICAgY29tbWFuZCBvcHRpb24gJ2V4dGVuc2lvbnMnKSBpcyB2YWxpZCwgaS5lLiBpdCBpcyBhIGxpc3Qgb2YKKyAgICAgICAgRXh0ZW5zaW9uIG9iamVjdHMuICBXZSBhbHNvIHN1cHBvcnQgdGhlIG9sZC1zdHlsZSBsaXN0IG9mIDItdHVwbGVzLAorICAgICAgICB3aGVyZSB0aGUgdHVwbGVzIGFyZSAoZXh0X25hbWUsIGJ1aWxkX2luZm8pLCB3aGljaCBhcmUgY29udmVydGVkIHRvCisgICAgICAgIEV4dGVuc2lvbiBpbnN0YW5jZXMgaGVyZS4KKworICAgICAgICBSYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yIGlmIHRoZSBzdHJ1Y3R1cmUgaXMgaW52YWxpZCBhbnl3aGVyZTsKKyAgICAgICAganVzdCByZXR1cm5zIG90aGVyd2lzZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dGVuc2lvbnMsIGxpc3QpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvciwgXAorICAgICAgICAgICAgICAgICAgIidleHRfbW9kdWxlcycgb3B0aW9uIG11c3QgYmUgYSBsaXN0IG9mIEV4dGVuc2lvbiBpbnN0YW5jZXMiCisKKyAgICAgICAgZm9yIGksIGV4dCBpbiBlbnVtZXJhdGUoZXh0ZW5zaW9ucyk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCwgRXh0ZW5zaW9uKToKKyAgICAgICAgICAgICAgICBjb250aW51ZSAgICAgICAgICAgICAgICAjIE9LISAoYXNzdW1lIHR5cGUtY2hlY2tpbmcgZG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYnkgRXh0ZW5zaW9uIGNvbnN0cnVjdG9yKQorCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleHQsIHR1cGxlKSBvciBsZW4oZXh0KSAhPSAyOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoImVhY2ggZWxlbWVudCBvZiAnZXh0X21vZHVsZXMnIG9wdGlvbiBtdXN0IGJlIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4dGVuc2lvbiBpbnN0YW5jZSBvciAyLXR1cGxlIikKKworICAgICAgICAgICAgZXh0X25hbWUsIGJ1aWxkX2luZm8gPSBleHQKKworICAgICAgICAgICAgbG9nLndhcm4oKCJvbGQtc3R5bGUgKGV4dF9uYW1lLCBidWlsZF9pbmZvKSB0dXBsZSBmb3VuZCBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgImV4dF9tb2R1bGVzIGZvciBleHRlbnNpb24gJyVzJyIKKyAgICAgICAgICAgICAgICAgICAgICAiLS0gcGxlYXNlIGNvbnZlcnQgdG8gRXh0ZW5zaW9uIGluc3RhbmNlIiAlIGV4dF9uYW1lKSkKKworICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKGV4dF9uYW1lLCBzdHIpIGFuZAorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fbmFtZV9yZS5tYXRjaChleHRfbmFtZSkpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoImZpcnN0IGVsZW1lbnQgb2YgZWFjaCB0dXBsZSBpbiAnZXh0X21vZHVsZXMnICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgdGhlIGV4dGVuc2lvbiBuYW1lIChhIHN0cmluZykiKQorCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShidWlsZF9pbmZvLCBkaWN0KToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKCJzZWNvbmQgZWxlbWVudCBvZiBlYWNoIHR1cGxlIGluICdleHRfbW9kdWxlcycgIgorICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBhIGRpY3Rpb25hcnkgKGJ1aWxkIGluZm8pIikKKworICAgICAgICAgICAgIyBPSywgdGhlIChleHRfbmFtZSwgYnVpbGRfaW5mbykgZGljdCBpcyB0eXBlLXNhZmU6IGNvbnZlcnQgaXQKKyAgICAgICAgICAgICMgdG8gYW4gRXh0ZW5zaW9uIGluc3RhbmNlLgorICAgICAgICAgICAgZXh0ID0gRXh0ZW5zaW9uKGV4dF9uYW1lLCBidWlsZF9pbmZvWydzb3VyY2VzJ10pCisKKyAgICAgICAgICAgICMgRWFzeSBzdHVmZjogb25lLXRvLW9uZSBtYXBwaW5nIGZyb20gZGljdCBlbGVtZW50cyB0bworICAgICAgICAgICAgIyBpbnN0YW5jZSBhdHRyaWJ1dGVzLgorICAgICAgICAgICAgZm9yIGtleSBpbiAoJ2luY2x1ZGVfZGlycycsICdsaWJyYXJ5X2RpcnMnLCAnbGlicmFyaWVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdleHRyYV9vYmplY3RzJywgJ2V4dHJhX2NvbXBpbGVfYXJncycsCisgICAgICAgICAgICAgICAgICAgICAgICAnZXh0cmFfbGlua19hcmdzJyk6CisgICAgICAgICAgICAgICAgdmFsID0gYnVpbGRfaW5mby5nZXQoa2V5KQorICAgICAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihleHQsIGtleSwgdmFsKQorCisgICAgICAgICAgICAjIE1lZGl1bS1lYXN5IHN0dWZmOiBzYW1lIHN5bnRheC9zZW1hbnRpY3MsIGRpZmZlcmVudCBuYW1lcy4KKyAgICAgICAgICAgIGV4dC5ydW50aW1lX2xpYnJhcnlfZGlycyA9IGJ1aWxkX2luZm8uZ2V0KCdycGF0aCcpCisgICAgICAgICAgICBpZiAnZGVmX2ZpbGUnIGluIGJ1aWxkX2luZm86CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIidkZWZfZmlsZScgZWxlbWVudCBvZiBidWlsZCBpbmZvIGRpY3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJubyBsb25nZXIgc3VwcG9ydGVkIikKKworICAgICAgICAgICAgIyBOb24tdHJpdmlhbCBzdHVmZjogJ21hY3Jvcycgc3BsaXQgaW50byAnZGVmaW5lX21hY3JvcycKKyAgICAgICAgICAgICMgYW5kICd1bmRlZl9tYWNyb3MnLgorICAgICAgICAgICAgbWFjcm9zID0gYnVpbGRfaW5mby5nZXQoJ21hY3JvcycpCisgICAgICAgICAgICBpZiBtYWNyb3M6CisgICAgICAgICAgICAgICAgZXh0LmRlZmluZV9tYWNyb3MgPSBbXQorICAgICAgICAgICAgICAgIGV4dC51bmRlZl9tYWNyb3MgPSBbXQorICAgICAgICAgICAgICAgIGZvciBtYWNybyBpbiBtYWNyb3M6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZShtYWNybywgdHVwbGUpIGFuZCBsZW4obWFjcm8pIGluICgxLCAyKSk6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIidtYWNyb3MnIGVsZW1lbnQgb2YgYnVpbGQgaW5mbyBkaWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSAxLSBvciAyLXR1cGxlIikKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKG1hY3JvKSA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0LnVuZGVmX21hY3Jvcy5hcHBlbmQobWFjcm9bMF0pCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbGVuKG1hY3JvKSA9PSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0LmRlZmluZV9tYWNyb3MuYXBwZW5kKG1hY3JvKQorCisgICAgICAgICAgICBleHRlbnNpb25zW2ldID0gZXh0CisKKyAgICBkZWYgZ2V0X3NvdXJjZV9maWxlcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19leHRlbnNpb25zX2xpc3Qoc2VsZi5leHRlbnNpb25zKQorICAgICAgICBmaWxlbmFtZXMgPSBbXQorCisgICAgICAgICMgV291bGRuJ3QgaXQgYmUgbmVhdCBpZiB3ZSBrbmV3IHRoZSBuYW1lcyBvZiBoZWFkZXIgZmlsZXMgdG9vLi4uCisgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgorICAgICAgICAgICAgZmlsZW5hbWVzLmV4dGVuZChleHQuc291cmNlcykKKworICAgICAgICByZXR1cm4gZmlsZW5hbWVzCisKKyAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgICMgU2FuaXR5IGNoZWNrIHRoZSAnZXh0ZW5zaW9ucycgbGlzdCAtLSBjYW4ndCBhc3N1bWUgdGhpcyBpcyBiZWluZworICAgICAgICAjIGRvbmUgaW4gdGhlIHNhbWUgcnVuIGFzIGEgJ2J1aWxkX2V4dGVuc2lvbnMoKScgY2FsbCAoaW4gZmFjdCwgd2UKKyAgICAgICAgIyBjYW4gcHJvYmFibHkgYXNzdW1lIHRoYXQgaXQgKmlzbid0KiEpLgorICAgICAgICBzZWxmLmNoZWNrX2V4dGVuc2lvbnNfbGlzdChzZWxmLmV4dGVuc2lvbnMpCisKKyAgICAgICAgIyBBbmQgYnVpbGQgdGhlIGxpc3Qgb2Ygb3V0cHV0IChidWlsdCkgZmlsZW5hbWVzLiAgTm90ZSB0aGF0IHRoaXMKKyAgICAgICAgIyBpZ25vcmVzIHRoZSAnaW5wbGFjZScgZmxhZywgYW5kIGFzc3VtZXMgZXZlcnl0aGluZyBnb2VzIGluIHRoZQorICAgICAgICAjICJidWlsZCIgdHJlZS4KKyAgICAgICAgb3V0cHV0cyA9IFtdCisgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgorICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQoc2VsZi5nZXRfZXh0X2Z1bGxwYXRoKGV4dC5uYW1lKSkKKyAgICAgICAgcmV0dXJuIG91dHB1dHMKKworICAgIGRlZiBidWlsZF9leHRlbnNpb25zKHNlbGYpOgorICAgICAgICAjIEZpcnN0LCBzYW5pdHktY2hlY2sgdGhlICdleHRlbnNpb25zJyBsaXN0CisgICAgICAgIHNlbGYuY2hlY2tfZXh0ZW5zaW9uc19saXN0KHNlbGYuZXh0ZW5zaW9ucykKKworICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfZXh0ZW5zaW9uKGV4dCkKKworICAgIGRlZiBidWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KToKKyAgICAgICAgc291cmNlcyA9IGV4dC5zb3VyY2VzCisgICAgICAgIGlmIHNvdXJjZXMgaXMgTm9uZSBvciB0eXBlKHNvdXJjZXMpIG5vdCBpbiAoTGlzdFR5cGUsIFR1cGxlVHlwZSk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAoImluICdleHRfbW9kdWxlcycgb3B0aW9uIChleHRlbnNpb24gJyVzJyksICIgKworICAgICAgICAgICAgICAgICAgICInc291cmNlcycgbXVzdCBiZSBwcmVzZW50IGFuZCBtdXN0IGJlICIgKworICAgICAgICAgICAgICAgICAgICJhIGxpc3Qgb2Ygc291cmNlIGZpbGVuYW1lcyIpICUgZXh0Lm5hbWUKKyAgICAgICAgc291cmNlcyA9IGxpc3Qoc291cmNlcykKKworICAgICAgICBleHRfcGF0aCA9IHNlbGYuZ2V0X2V4dF9mdWxscGF0aChleHQubmFtZSkKKyAgICAgICAgZGVwZW5kcyA9IHNvdXJjZXMgKyBleHQuZGVwZW5kcworICAgICAgICBpZiBub3QgKHNlbGYuZm9yY2Ugb3IgbmV3ZXJfZ3JvdXAoZGVwZW5kcywgZXh0X3BhdGgsICduZXdlcicpKToKKyAgICAgICAgICAgIGxvZy5kZWJ1Zygic2tpcHBpbmcgJyVzJyBleHRlbnNpb24gKHVwLXRvLWRhdGUpIiwgZXh0Lm5hbWUpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZy5pbmZvKCJidWlsZGluZyAnJXMnIGV4dGVuc2lvbiIsIGV4dC5uYW1lKQorCisgICAgICAgICMgRmlyc3QsIHNjYW4gdGhlIHNvdXJjZXMgZm9yIFNXSUcgZGVmaW5pdGlvbiBmaWxlcyAoLmkpLCBydW4KKyAgICAgICAgIyBTV0lHIG9uICdlbSB0byBjcmVhdGUgLmMgZmlsZXMsIGFuZCBtb2RpZnkgdGhlIHNvdXJjZXMgbGlzdAorICAgICAgICAjIGFjY29yZGluZ2x5LgorICAgICAgICBzb3VyY2VzID0gc2VsZi5zd2lnX3NvdXJjZXMoc291cmNlcywgZXh0KQorCisgICAgICAgICMgTmV4dCwgY29tcGlsZSB0aGUgc291cmNlIGNvZGUgdG8gb2JqZWN0IGZpbGVzLgorCisgICAgICAgICMgWFhYIG5vdCBob25vdXJpbmcgJ2RlZmluZV9tYWNyb3MnIG9yICd1bmRlZl9tYWNyb3MnIC0tIHRoZQorICAgICAgICAjIENDb21waWxlciBBUEkgbmVlZHMgdG8gY2hhbmdlIHRvIGFjY29tbW9kYXRlIHRoaXMsIGFuZCBJCisgICAgICAgICMgd2FudCB0byBkbyBvbmUgdGhpbmcgYXQgYSB0aW1lIQorCisgICAgICAgICMgVHdvIHBvc3NpYmxlIHNvdXJjZXMgZm9yIGV4dHJhIGNvbXBpbGVyIGFyZ3VtZW50czoKKyAgICAgICAgIyAgIC0gJ2V4dHJhX2NvbXBpbGVfYXJncycgaW4gRXh0ZW5zaW9uIG9iamVjdAorICAgICAgICAjICAgLSBDRkxBR1MgZW52aXJvbm1lbnQgdmFyaWFibGUgKG5vdCBwYXJ0aWN1bGFybHkKKyAgICAgICAgIyAgICAgZWxlZ2FudCwgYnV0IHBlb3BsZSBzZWVtIHRvIGV4cGVjdCBpdCBhbmQgSQorICAgICAgICAjICAgICBndWVzcyBpdCdzIHVzZWZ1bCkKKyAgICAgICAgIyBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgc2hvdWxkIHRha2UgcHJlY2VkZW5jZSwgYW5kCisgICAgICAgICMgYW55IHNlbnNpYmxlIGNvbXBpbGVyIHdpbGwgZ2l2ZSBwcmVjZWRlbmNlIHRvIGxhdGVyCisgICAgICAgICMgY29tbWFuZCBsaW5lIGFyZ3MuICBIZW5jZSB3ZSBjb21iaW5lIHRoZW0gaW4gb3JkZXI6CisgICAgICAgIGV4dHJhX2FyZ3MgPSBleHQuZXh0cmFfY29tcGlsZV9hcmdzIG9yIFtdCisKKyAgICAgICAgbWFjcm9zID0gZXh0LmRlZmluZV9tYWNyb3NbOl0KKyAgICAgICAgZm9yIHVuZGVmIGluIGV4dC51bmRlZl9tYWNyb3M6CisgICAgICAgICAgICBtYWNyb3MuYXBwZW5kKCh1bmRlZiwpKQorCisgICAgICAgIG9iamVjdHMgPSBzZWxmLmNvbXBpbGVyLmNvbXBpbGUoc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX3RlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY3Jvcz1tYWNyb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1leHQuaW5jbHVkZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1zZWxmLmRlYnVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncz1leHRyYV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzPWV4dC5kZXBlbmRzKQorCisgICAgICAgICMgWFhYIC0tIHRoaXMgaXMgYSBWaWxlIEhBQ0shCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgc2V0dXAucHkgc2NyaXB0IGZvciBQeXRob24gb24gVW5peCBuZWVkcyB0byBiZSBhYmxlIHRvCisgICAgICAgICMgZ2V0IHRoaXMgbGlzdCBzbyBpdCBjYW4gcGVyZm9ybSBhbGwgdGhlIGNsZWFuIHVwIG5lZWRlZCB0bworICAgICAgICAjIGF2b2lkIGtlZXBpbmcgb2JqZWN0IGZpbGVzIGFyb3VuZCB3aGVuIGNsZWFuaW5nIG91dCBhIGZhaWxlZAorICAgICAgICAjIGJ1aWxkIG9mIGFuIGV4dGVuc2lvbiBtb2R1bGUuICBTaW5jZSBEaXN0dXRpbHMgZG9lcyBub3QKKyAgICAgICAgIyB0cmFjayBkZXBlbmRlbmNpZXMsIHdlIGhhdmUgdG8gZ2V0IHJpZCBvZiBpbnRlcm1lZGlhdGVzIHRvCisgICAgICAgICMgZW5zdXJlIGFsbCB0aGUgaW50ZXJtZWRpYXRlcyB3aWxsIGJlIHByb3Blcmx5IHJlLWJ1aWx0LgorICAgICAgICAjCisgICAgICAgIHNlbGYuX2J1aWx0X29iamVjdHMgPSBvYmplY3RzWzpdCisKKyAgICAgICAgIyBOb3cgbGluayB0aGUgb2JqZWN0IGZpbGVzIHRvZ2V0aGVyIGludG8gYSAic2hhcmVkIG9iamVjdCIgLS0KKyAgICAgICAgIyBvZiBjb3Vyc2UsIGZpcnN0IHdlIGhhdmUgdG8gZmlndXJlIG91dCBhbGwgdGhlIG90aGVyIHRoaW5ncworICAgICAgICAjIHRoYXQgZ28gaW50byB0aGUgbWl4LgorICAgICAgICBpZiBleHQuZXh0cmFfb2JqZWN0czoKKyAgICAgICAgICAgIG9iamVjdHMuZXh0ZW5kKGV4dC5leHRyYV9vYmplY3RzKQorICAgICAgICBleHRyYV9hcmdzID0gZXh0LmV4dHJhX2xpbmtfYXJncyBvciBbXQorCisgICAgICAgICMgRGV0ZWN0IHRhcmdldCBsYW5ndWFnZSwgaWYgbm90IHByb3ZpZGVkCisgICAgICAgIGxhbmd1YWdlID0gZXh0Lmxhbmd1YWdlIG9yIHNlbGYuY29tcGlsZXIuZGV0ZWN0X2xhbmd1YWdlKHNvdXJjZXMpCisKKyAgICAgICAgc2VsZi5jb21waWxlci5saW5rX3NoYXJlZF9vYmplY3QoCisgICAgICAgICAgICBvYmplY3RzLCBleHRfcGF0aCwKKyAgICAgICAgICAgIGxpYnJhcmllcz1zZWxmLmdldF9saWJyYXJpZXMoZXh0KSwKKyAgICAgICAgICAgIGxpYnJhcnlfZGlycz1leHQubGlicmFyeV9kaXJzLAorICAgICAgICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnM9ZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzLAorICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3M9ZXh0cmFfYXJncywKKyAgICAgICAgICAgIGV4cG9ydF9zeW1ib2xzPXNlbGYuZ2V0X2V4cG9ydF9zeW1ib2xzKGV4dCksCisgICAgICAgICAgICBkZWJ1Zz1zZWxmLmRlYnVnLAorICAgICAgICAgICAgYnVpbGRfdGVtcD1zZWxmLmJ1aWxkX3RlbXAsCisgICAgICAgICAgICB0YXJnZXRfbGFuZz1sYW5ndWFnZSkKKworCisgICAgZGVmIHN3aWdfc291cmNlcyAoc2VsZiwgc291cmNlcywgZXh0ZW5zaW9uKToKKworICAgICAgICAiIiJXYWxrIHRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcyBpbiAnc291cmNlcycsIGxvb2tpbmcgZm9yIFNXSUcKKyAgICAgICAgaW50ZXJmYWNlICguaSkgZmlsZXMuICBSdW4gU1dJRyBvbiBhbGwgdGhhdCBhcmUgZm91bmQsIGFuZAorICAgICAgICByZXR1cm4gYSBtb2RpZmllZCAnc291cmNlcycgbGlzdCB3aXRoIFNXSUcgc291cmNlIGZpbGVzIHJlcGxhY2VkCisgICAgICAgIGJ5IHRoZSBnZW5lcmF0ZWQgQyAob3IgQysrKSBmaWxlcy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgbmV3X3NvdXJjZXMgPSBbXQorICAgICAgICBzd2lnX3NvdXJjZXMgPSBbXQorICAgICAgICBzd2lnX3RhcmdldHMgPSB7fQorCisgICAgICAgICMgWFhYIHRoaXMgZHJvcHMgZ2VuZXJhdGVkIEMvQysrIGZpbGVzIGludG8gdGhlIHNvdXJjZSB0cmVlLCB3aGljaAorICAgICAgICAjIGlzIGZpbmUgZm9yIGRldmVsb3BlcnMgd2hvIHdhbnQgdG8gZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkCisgICAgICAgICMgc291cmNlIC0tIGJ1dCB0aGVyZSBzaG91bGQgYmUgYW4gb3B0aW9uIHRvIHB1dCBTV0lHIG91dHB1dCBpbgorICAgICAgICAjIHRoZSB0ZW1wIGRpci4KKworICAgICAgICBpZiBzZWxmLnN3aWdfY3BwOgorICAgICAgICAgICAgbG9nLndhcm4oIi0tc3dpZy1jcHAgaXMgZGVwcmVjYXRlZCAtIHVzZSAtLXN3aWctb3B0cz0tYysrIikKKworICAgICAgICBpZiBzZWxmLnN3aWdfY3BwIG9yICgnLWMrKycgaW4gc2VsZi5zd2lnX29wdHMpIG9yIFwKKyAgICAgICAgICAgKCctYysrJyBpbiBleHRlbnNpb24uc3dpZ19vcHRzKToKKyAgICAgICAgICAgIHRhcmdldF9leHQgPSAnLmNwcCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRhcmdldF9leHQgPSAnLmMnCisKKyAgICAgICAgZm9yIHNvdXJjZSBpbiBzb3VyY2VzOgorICAgICAgICAgICAgKGJhc2UsIGV4dCkgPSBvcy5wYXRoLnNwbGl0ZXh0KHNvdXJjZSkKKyAgICAgICAgICAgIGlmIGV4dCA9PSAiLmkiOiAgICAgICAgICAgICAjIFNXSUcgaW50ZXJmYWNlIGZpbGUKKyAgICAgICAgICAgICAgICBuZXdfc291cmNlcy5hcHBlbmQoYmFzZSArICdfd3JhcCcgKyB0YXJnZXRfZXh0KQorICAgICAgICAgICAgICAgIHN3aWdfc291cmNlcy5hcHBlbmQoc291cmNlKQorICAgICAgICAgICAgICAgIHN3aWdfdGFyZ2V0c1tzb3VyY2VdID0gbmV3X3NvdXJjZXNbLTFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld19zb3VyY2VzLmFwcGVuZChzb3VyY2UpCisKKyAgICAgICAgaWYgbm90IHN3aWdfc291cmNlczoKKyAgICAgICAgICAgIHJldHVybiBuZXdfc291cmNlcworCisgICAgICAgIHN3aWcgPSBzZWxmLnN3aWcgb3Igc2VsZi5maW5kX3N3aWcoKQorICAgICAgICBzd2lnX2NtZCA9IFtzd2lnLCAiLXB5dGhvbiJdCisgICAgICAgIHN3aWdfY21kLmV4dGVuZChzZWxmLnN3aWdfb3B0cykKKyAgICAgICAgaWYgc2VsZi5zd2lnX2NwcDoKKyAgICAgICAgICAgIHN3aWdfY21kLmFwcGVuZCgiLWMrKyIpCisKKyAgICAgICAgIyBEbyBub3Qgb3ZlcnJpZGUgY29tbWFuZGxpbmUgYXJndW1lbnRzCisgICAgICAgIGlmIG5vdCBzZWxmLnN3aWdfb3B0czoKKyAgICAgICAgICAgIGZvciBvIGluIGV4dGVuc2lvbi5zd2lnX29wdHM6CisgICAgICAgICAgICAgICAgc3dpZ19jbWQuYXBwZW5kKG8pCisKKyAgICAgICAgZm9yIHNvdXJjZSBpbiBzd2lnX3NvdXJjZXM6CisgICAgICAgICAgICB0YXJnZXQgPSBzd2lnX3RhcmdldHNbc291cmNlXQorICAgICAgICAgICAgbG9nLmluZm8oInN3aWdnaW5nICVzIHRvICVzIiwgc291cmNlLCB0YXJnZXQpCisgICAgICAgICAgICBzZWxmLnNwYXduKHN3aWdfY21kICsgWyItbyIsIHRhcmdldCwgc291cmNlXSkKKworICAgICAgICByZXR1cm4gbmV3X3NvdXJjZXMKKworICAgICMgc3dpZ19zb3VyY2VzICgpCisKKyAgICBkZWYgZmluZF9zd2lnIChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBTV0lHIGV4ZWN1dGFibGUuICBPbiBVbml4LCB0aGlzIGlzCisgICAgICAgIGp1c3QgInN3aWciIC0tIGl0IHNob3VsZCBiZSBpbiB0aGUgUEFUSC4gIFRyaWVzIGEgYml0IGhhcmRlciBvbgorICAgICAgICBXaW5kb3dzLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBvcy5uYW1lID09ICJwb3NpeCI6CisgICAgICAgICAgICByZXR1cm4gInN3aWciCisgICAgICAgIGVsaWYgb3MubmFtZSA9PSAibnQiOgorCisgICAgICAgICAgICAjIExvb2sgZm9yIFNXSUcgaW4gaXRzIHN0YW5kYXJkIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb24KKyAgICAgICAgICAgICMgV2luZG93cyAob3Igc28gSSBwcmVzdW1lISkuICBJZiB3ZSBmaW5kIGl0IHRoZXJlLCBncmVhdDsKKyAgICAgICAgICAgICMgaWYgbm90LCBhY3QgbGlrZSBVbml4IGFuZCBhc3N1bWUgaXQncyBpbiB0aGUgUEFUSC4KKyAgICAgICAgICAgIGZvciB2ZXJzIGluICgiMS4zIiwgIjEuMiIsICIxLjEiKToKKyAgICAgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbigiYzpcXHN3aWclcyIgJSB2ZXJzLCAic3dpZy5leGUiKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZuKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAic3dpZy5leGUiCisKKyAgICAgICAgZWxpZiBvcy5uYW1lID09ICJvczIiOgorICAgICAgICAgICAgIyBhc3N1bWUgc3dpZyBhdmFpbGFibGUgaW4gdGhlIFBBVEguCisgICAgICAgICAgICByZXR1cm4gInN3aWcuZXhlIgorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAoIkkgZG9uJ3Qga25vdyBob3cgdG8gZmluZCAobXVjaCBsZXNzIHJ1bikgU1dJRyAiCisgICAgICAgICAgICAgICAgICAgIm9uIHBsYXRmb3JtICclcyciKSAlIG9zLm5hbWUKKworICAgICMgZmluZF9zd2lnICgpCisKKyAgICAjIC0tIE5hbWUgZ2VuZXJhdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgKGV4dGVuc2lvbiBuYW1lcywgZmlsZW5hbWVzLCB3aGF0ZXZlcikKKyAgICBkZWYgZ2V0X2V4dF9mdWxscGF0aChzZWxmLCBleHRfbmFtZSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIHBhdGggb2YgdGhlIGZpbGVuYW1lIGZvciBhIGdpdmVuIGV4dGVuc2lvbi4KKworICAgICAgICBUaGUgZmlsZSBpcyBsb2NhdGVkIGluIGBidWlsZF9saWJgIG9yIGRpcmVjdGx5IGluIHRoZSBwYWNrYWdlCisgICAgICAgIChpbnBsYWNlIG9wdGlvbikuCisgICAgICAgICIiIgorICAgICAgICAjIG1ha2VzIHN1cmUgdGhlIGV4dGVuc2lvbiBuYW1lIGlzIG9ubHkgdXNpbmcgZG90cworICAgICAgICBhbGxfZG90cyA9IHN0cmluZy5tYWtldHJhbnMoJy8nK29zLnNlcCwgJy4uJykKKyAgICAgICAgZXh0X25hbWUgPSBleHRfbmFtZS50cmFuc2xhdGUoYWxsX2RvdHMpCisKKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmdldF9leHRfZnVsbG5hbWUoZXh0X25hbWUpCisgICAgICAgIG1vZHBhdGggPSBmdWxsbmFtZS5zcGxpdCgnLicpCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKGV4dF9uYW1lKQorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpWy0xXQorCisgICAgICAgIGlmIG5vdCBzZWxmLmlucGxhY2U6CisgICAgICAgICAgICAjIG5vIGZ1cnRoZXIgd29yayBuZWVkZWQKKyAgICAgICAgICAgICMgcmV0dXJuaW5nIDoKKyAgICAgICAgICAgICMgICBidWlsZF9kaXIvcGFja2FnZS9wYXRoL2ZpbGVuYW1lCisgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbigqbW9kcGF0aFs6LTFdK1tmaWxlbmFtZV0pCisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfbGliLCBmaWxlbmFtZSkKKworICAgICAgICAjIHRoZSBpbnBsYWNlIG9wdGlvbiByZXF1aXJlcyB0byBmaW5kIHRoZSBwYWNrYWdlIGRpcmVjdG9yeQorICAgICAgICAjIHVzaW5nIHRoZSBidWlsZF9weSBjb21tYW5kIGZvciB0aGF0CisgICAgICAgIHBhY2thZ2UgPSAnLicuam9pbihtb2RwYXRoWzA6LTFdKQorICAgICAgICBidWlsZF9weSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpCisgICAgICAgIHBhY2thZ2VfZGlyID0gb3MucGF0aC5hYnNwYXRoKGJ1aWxkX3B5LmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKSkKKworICAgICAgICAjIHJldHVybmluZworICAgICAgICAjICAgcGFja2FnZV9kaXIvZmlsZW5hbWUKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihwYWNrYWdlX2RpciwgZmlsZW5hbWUpCisKKyAgICBkZWYgZ2V0X2V4dF9mdWxsbmFtZShzZWxmLCBleHRfbmFtZSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGZ1bGxuYW1lIG9mIGEgZ2l2ZW4gZXh0ZW5zaW9uIG5hbWUuCisKKyAgICAgICAgQWRkcyB0aGUgYHBhY2thZ2UuYCBwcmVmaXgiIiIKKyAgICAgICAgaWYgc2VsZi5wYWNrYWdlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZXh0X25hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhY2thZ2UgKyAnLicgKyBleHRfbmFtZQorCisgICAgZGVmIGdldF9leHRfZmlsZW5hbWUoc2VsZiwgZXh0X25hbWUpOgorICAgICAgICByIiIiQ29udmVydCB0aGUgbmFtZSBvZiBhbiBleHRlbnNpb24gKGVnLiAiZm9vLmJhciIpIGludG8gdGhlIG5hbWUKKyAgICAgICAgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCBpdCB3aWxsIGJlIGxvYWRlZCAoZWcuICJmb28vYmFyLnNvIiwgb3IKKyAgICAgICAgImZvb1xiYXIucHlkIikuCisgICAgICAgICIiIgorICAgICAgICBmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGdldF9jb25maWdfdmFyCisgICAgICAgIGV4dF9wYXRoID0gc3RyaW5nLnNwbGl0KGV4dF9uYW1lLCAnLicpCisgICAgICAgICMgT1MvMiBoYXMgYW4gOCBjaGFyYWN0ZXIgbW9kdWxlIChleHRlbnNpb24pIGxpbWl0IDotKAorICAgICAgICBpZiBvcy5uYW1lID09ICJvczIiOgorICAgICAgICAgICAgZXh0X3BhdGhbbGVuKGV4dF9wYXRoKSAtIDFdID0gZXh0X3BhdGhbbGVuKGV4dF9wYXRoKSAtIDFdWzo4XQorICAgICAgICAjIGV4dGVuc2lvbnMgaW4gZGVidWdfbW9kZSBhcmUgbmFtZWQgJ21vZHVsZV9kLnB5ZCcgdW5kZXIgd2luZG93cworICAgICAgICBzb19leHQgPSBnZXRfY29uZmlnX3ZhcignU08nKQorICAgICAgICBpZiBvcy5uYW1lID09ICdudCcgYW5kIHNlbGYuZGVidWc6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKCpleHRfcGF0aCkgKyAnX2QnICsgc29fZXh0CisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oKmV4dF9wYXRoKSArIHNvX2V4dAorCisgICAgZGVmIGdldF9leHBvcnRfc3ltYm9scyAoc2VsZiwgZXh0KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBsaXN0IG9mIHN5bWJvbHMgdGhhdCBhIHNoYXJlZCBleHRlbnNpb24gaGFzIHRvCisgICAgICAgIGV4cG9ydC4gIFRoaXMgZWl0aGVyIHVzZXMgJ2V4dC5leHBvcnRfc3ltYm9scycgb3IsIGlmIGl0J3Mgbm90CisgICAgICAgIHByb3ZpZGVkLCAiaW5pdCIgKyBtb2R1bGVfbmFtZS4gIE9ubHkgcmVsZXZhbnQgb24gV2luZG93cywgd2hlcmUKKyAgICAgICAgdGhlIC5weWQgZmlsZSAoRExMKSBtdXN0IGV4cG9ydCB0aGUgbW9kdWxlICJpbml0IiBmdW5jdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIGluaXRmdW5jX25hbWUgPSAiaW5pdCIgKyBleHQubmFtZS5zcGxpdCgnLicpWy0xXQorICAgICAgICBpZiBpbml0ZnVuY19uYW1lIG5vdCBpbiBleHQuZXhwb3J0X3N5bWJvbHM6CisgICAgICAgICAgICBleHQuZXhwb3J0X3N5bWJvbHMuYXBwZW5kKGluaXRmdW5jX25hbWUpCisgICAgICAgIHJldHVybiBleHQuZXhwb3J0X3N5bWJvbHMKKworICAgIGRlZiBnZXRfbGlicmFyaWVzIChzZWxmLCBleHQpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGxpc3Qgb2YgbGlicmFyaWVzIHRvIGxpbmsgYWdhaW5zdCB3aGVuIGJ1aWxkaW5nIGEKKyAgICAgICAgc2hhcmVkIGV4dGVuc2lvbi4gIE9uIG1vc3QgcGxhdGZvcm1zLCB0aGlzIGlzIGp1c3QgJ2V4dC5saWJyYXJpZXMnOworICAgICAgICBvbiBXaW5kb3dzIGFuZCBPUy8yLCB3ZSBhZGQgdGhlIFB5dGhvbiBsaWJyYXJ5IChlZy4gcHl0aG9uMjAuZGxsKS4KKyAgICAgICAgIiIiCisgICAgICAgICMgVGhlIHB5dGhvbiBsaWJyYXJ5IGlzIGFsd2F5cyBuZWVkZWQgb24gV2luZG93cy4gIEZvciBNU1ZDLCB0aGlzCisgICAgICAgICMgaXMgcmVkdW5kYW50LCBzaW5jZSB0aGUgbGlicmFyeSBpcyBtZW50aW9uZWQgaW4gYSBwcmFnbWEgaW4KKyAgICAgICAgIyBweWNvbmZpZy5oIHRoYXQgTVNWQyBncm9rcy4gIFRoZSBvdGhlciBXaW5kb3dzIGNvbXBpbGVycyBhbGwgc2VlbQorICAgICAgICAjIHRvIG5lZWQgaXQgbWVudGlvbmVkIGV4cGxpY2l0bHksIHRob3VnaCwgc28gdGhhdCdzIHdoYXQgd2UgZG8uCisgICAgICAgICMgQXBwZW5kICdfZCcgdG8gdGhlIHB5dGhvbiBpbXBvcnQgbGlicmFyeSBvbiBkZWJ1ZyBidWlsZHMuCisKKyAgICAgICAgIyBGSVhNRTogV2hhdCBpcyBwdXJwb3NlIG9mIGNvZGUgYmVsb3cgPworICAgICAgICAjIFRoZSBwb3NpeCBidWlsZCBzeXN0ZW0ga2hvdyByZXF1cmVkIGxpYnJhcmllcyB0byBidWlsZCBhIG1vZHVsZS4KKyAgICAgICAgIyBUaGUgbGlicmFyaWVzIGFyZSBzdG9yZWQgaW4gY29uZmlnKE1ha2VmaWxlKSB2YXJpYWJsZXMgQkxETElCUkFSWSwKKyAgICAgICAgIyBNT0RMSUJTIGFuZCBTSExJQlMuIE5vdGUgdGhhdCBzb21lIHZhcmlhYmxlcyBtYXkgY29udGFpbiBsaW5rZXIKKyAgICAgICAgIyBmbGFncy4KKyAgICAgICAgIyBOT1RFOiBGb3Igbm93IHdlIHdpbGwgY2hlY2sgb25seSBHQ0MobWluZ3cpIGNvbXBpbGVyIGFzIGlzIGNsZWFyCisgICAgICAgICMgdGhhdCB3ZSBidWlsZCBmb3Igd2luZG93cyBwbGF0ZnJvbS4KKyAgICAgICAgIyBUaGUgY29kZSBmb3IgR0NDKG1pbmd3KSBpcyBub3QgY29ycmVjdCBidXQgdGhpcyBpcyBkaXN0dXRpbHMKKyAgICAgICAgIyBsaW1pdGF0aW9uIC0gd2UgaGFzIHRvIHBhc3MgdmFyaWFibGVzIHRvIHRoZSBsaW5rZXIgYXMgaXMKKyAgICAgICAgIyBpbnN0ZWFkIG9ubHkgbGlicmFyeSBuYW1lcy4KKyAgICAgICAgaWYgc2VsZi5jb21waWxlci5jb21waWxlcl90eXBlID09ICdtaW5ndzMyJzoKKyAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKKyAgICAgICAgICAgIHRlbXBsYXRlID0gInB5dGhvbiVzIgorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlICsgJ19kJworICAgICAgICAgICAgZXh0cmEgPSBbKHRlbXBsYXRlICUgKHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignVkVSU0lPTicpKSldCisgICAgICAgICAgICBmb3IgbGliIGluIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQkxETElCUkFSWScpLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgaWYgbGliLnN0YXJ0c3dpdGgoJy1sJyk6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZChsaWJbMjpdKQorICAgICAgICAgICAgZm9yIGxpYiBpbiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ01PRExJQlMnKS5zcGxpdCgpOgorICAgICAgICAgICAgICAgIGlmIGxpYi5zdGFydHN3aXRoKCctbCcpOgorICAgICAgICAgICAgICAgICAgICBleHRyYS5hcHBlbmQobGliWzI6XSkKKyAgICAgICAgICAgIGZvciBsaWIgaW4gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdTSExJQlMnKS5zcGxpdCgpOgorICAgICAgICAgICAgICAgIGlmIGxpYi5zdGFydHN3aXRoKCctbCcpOgorICAgICAgICAgICAgICAgICAgICBleHRyYS5hcHBlbmQobGliWzI6XSkKKyAgICAgICAgICAgIHJldHVybiBleHQubGlicmFyaWVzICsgZXh0cmEKKworICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLm1zdmNjb21waWxlciBpbXBvcnQgTVNWQ0NvbXBpbGVyCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLmNvbXBpbGVyLCBNU1ZDQ29tcGlsZXIpOgorICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gInB5dGhvbiVkJWQiCisgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZSArICdfZCcKKyAgICAgICAgICAgICAgICBweXRob25saWIgPSAodGVtcGxhdGUgJQorICAgICAgICAgICAgICAgICAgICAgICAoc3lzLmhleHZlcnNpb24gPj4gMjQsIChzeXMuaGV4dmVyc2lvbiA+PiAxNikgJiAweGZmKSkKKyAgICAgICAgICAgICAgICAjIGRvbid0IGV4dGVuZCBleHQubGlicmFyaWVzLCBpdCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIKKyAgICAgICAgICAgICAgICAjIGV4dGVuc2lvbnMsIGl0IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBsaXN0CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4dC5saWJyYXJpZXMgKyBbcHl0aG9ubGliXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0LmxpYnJhcmllcworICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAib3MyZW14IjoKKyAgICAgICAgICAgICMgRU1YL0dDQyByZXF1aXJlcyB0aGUgcHl0aG9uIGxpYnJhcnkgZXhwbGljaXRseSwgYW5kIEkKKyAgICAgICAgICAgICMgYmVsaWV2ZSBWQUNQUCBkb2VzIGFzIHdlbGwgKHRob3VnaCBub3QgY29uZmlybWVkKSAtIEFJTSBBcHIwMQorICAgICAgICAgICAgdGVtcGxhdGUgPSAicHl0aG9uJWQlZCIKKyAgICAgICAgICAgICMgZGVidWcgdmVyc2lvbnMgb2YgdGhlIG1haW4gRExMIGFyZW4ndCBzdXBwb3J0ZWQsIGF0IGxlYXN0CisgICAgICAgICAgICAjIG5vdCBhdCB0aGlzIHRpbWUgLSBBSU0gQXByMDEKKyAgICAgICAgICAgICNpZiBzZWxmLmRlYnVnOgorICAgICAgICAgICAgIyAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlICsgJ19kJworICAgICAgICAgICAgcHl0aG9ubGliID0gKHRlbXBsYXRlICUKKyAgICAgICAgICAgICAgICAgICAoc3lzLmhleHZlcnNpb24gPj4gMjQsIChzeXMuaGV4dmVyc2lvbiA+PiAxNikgJiAweGZmKSkKKyAgICAgICAgICAgICMgZG9uJ3QgZXh0ZW5kIGV4dC5saWJyYXJpZXMsIGl0IG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlcgorICAgICAgICAgICAgIyBleHRlbnNpb25zLCBpdCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgbGlzdAorICAgICAgICAgICAgcmV0dXJuIGV4dC5saWJyYXJpZXMgKyBbcHl0aG9ubGliXQorICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gImN5Z3dpbiI6CisgICAgICAgICAgICB0ZW1wbGF0ZSA9ICJweXRob24lZC4lZCIKKyAgICAgICAgICAgIHB5dGhvbmxpYiA9ICh0ZW1wbGF0ZSAlCisgICAgICAgICAgICAgICAgICAgKHN5cy5oZXh2ZXJzaW9uID4+IDI0LCAoc3lzLmhleHZlcnNpb24gPj4gMTYpICYgMHhmZikpCisgICAgICAgICAgICAjIGRvbid0IGV4dGVuZCBleHQubGlicmFyaWVzLCBpdCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIKKyAgICAgICAgICAgICMgZXh0ZW5zaW9ucywgaXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGxpc3QKKyAgICAgICAgICAgIHJldHVybiBleHQubGlicmFyaWVzICsgW3B5dGhvbmxpYl0KKyAgICAgICAgZWxpZiBzeXMucGxhdGZvcm1bOjZdID09ICJhdGhlb3MiOgorICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZworCisgICAgICAgICAgICB0ZW1wbGF0ZSA9ICJweXRob24lZC4lZCIKKyAgICAgICAgICAgIHB5dGhvbmxpYiA9ICh0ZW1wbGF0ZSAlCisgICAgICAgICAgICAgICAgICAgKHN5cy5oZXh2ZXJzaW9uID4+IDI0LCAoc3lzLmhleHZlcnNpb24gPj4gMTYpICYgMHhmZikpCisgICAgICAgICAgICAjIEdldCBTSExJQlMgZnJvbSBNYWtlZmlsZQorICAgICAgICAgICAgZXh0cmEgPSBbXQorICAgICAgICAgICAgZm9yIGxpYiBpbiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1NITElCUycpLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgaWYgbGliLnN0YXJ0c3dpdGgoJy1sJyk6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZChsaWJbMjpdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZChsaWIpCisgICAgICAgICAgICAjIGRvbid0IGV4dGVuZCBleHQubGlicmFyaWVzLCBpdCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIKKyAgICAgICAgICAgICMgZXh0ZW5zaW9ucywgaXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGxpc3QKKyAgICAgICAgICAgIHJldHVybiBleHQubGlicmFyaWVzICsgW3B5dGhvbmxpYiwgIm0iXSArIGV4dHJhCisKKyAgICAgICAgZWxpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICAjIERvbid0IHVzZSB0aGUgZGVmYXVsdCBjb2RlIGJlbG93CisgICAgICAgICAgICByZXR1cm4gZXh0LmxpYnJhcmllcworICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ2FpeCc6CisgICAgICAgICAgICAjIERvbid0IHVzZSB0aGUgZGVmYXVsdCBjb2RlIGJlbG93CisgICAgICAgICAgICByZXR1cm4gZXh0LmxpYnJhcmllcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZworICAgICAgICAgICAgaWYgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdQeV9FTkFCTEVfU0hBUkVEJyk6CisgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAicHl0aG9uJWQuJWQiCisgICAgICAgICAgICAgICAgcHl0aG9ubGliID0gKHRlbXBsYXRlICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5cy5oZXh2ZXJzaW9uID4+IDI0LCAoc3lzLmhleHZlcnNpb24gPj4gMTYpICYgMHhmZikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGV4dC5saWJyYXJpZXMgKyBbcHl0aG9ubGliXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0LmxpYnJhcmllcworCisjIGNsYXNzIGJ1aWxkX2V4dApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTc3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTc3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9weS5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfcHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRjNDU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfcHkucHkKQEAgLTAsMCArMSwzOTMgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3B5CisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnYnVpbGRfcHknIGNvbW1hbmQuIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2Zyb20gZ2xvYiBpbXBvcnQgZ2xvYgorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yLCBEaXN0dXRpbHNGaWxlRXJyb3IKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCitjbGFzcyBidWlsZF9weShDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gIlwiYnVpbGRcIiBwdXJlIFB5dGhvbiBtb2R1bGVzIChjb3B5IHRvIGJ1aWxkIGRpcmVjdG9yeSkiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnYnVpbGQtbGliPScsICdkJywgImRpcmVjdG9yeSB0byBcImJ1aWxkXCIgKGNvcHkpIHRvIiksCisgICAgICAgICgnY29tcGlsZScsICdjJywgImNvbXBpbGUgLnB5IHRvIC5weWMiKSwKKyAgICAgICAgKCduby1jb21waWxlJywgTm9uZSwgImRvbid0IGNvbXBpbGUgLnB5IGZpbGVzIFtkZWZhdWx0XSIpLAorICAgICAgICAoJ29wdGltaXplPScsICdPJywKKyAgICAgICAgICJhbHNvIGNvbXBpbGUgd2l0aCBvcHRpbWl6YXRpb246IC1PMSBmb3IgXCJweXRob24gLU9cIiwgIgorICAgICAgICAgIi1PMiBmb3IgXCJweXRob24gLU9PXCIsIGFuZCAtTzAgdG8gZGlzYWJsZSBbZGVmYXVsdDogLU8wXSIpLAorICAgICAgICAoJ2ZvcmNlJywgJ2YnLCAiZm9yY2libHkgYnVpbGQgZXZlcnl0aGluZyAoaWdub3JlIGZpbGUgdGltZXN0YW1wcykiKSwKKyAgICAgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWydjb21waWxlJywgJ2ZvcmNlJ10KKyAgICBuZWdhdGl2ZV9vcHQgPSB7J25vLWNvbXBpbGUnIDogJ2NvbXBpbGUnfQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5idWlsZF9saWIgPSBOb25lCisgICAgICAgIHNlbGYucHlfbW9kdWxlcyA9IE5vbmUKKyAgICAgICAgc2VsZi5wYWNrYWdlID0gTm9uZQorICAgICAgICBzZWxmLnBhY2thZ2VfZGF0YSA9IE5vbmUKKyAgICAgICAgc2VsZi5wYWNrYWdlX2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5jb21waWxlID0gMAorICAgICAgICBzZWxmLm9wdGltaXplID0gMAorICAgICAgICBzZWxmLmZvcmNlID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdidWlsZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYnVpbGRfbGliJywgJ2J1aWxkX2xpYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2ZvcmNlJywgJ2ZvcmNlJykpCisKKyAgICAgICAgIyBHZXQgdGhlIGRpc3RyaWJ1dGlvbiBvcHRpb25zIHRoYXQgYXJlIGFsaWFzZXMgZm9yIGJ1aWxkX3B5CisgICAgICAgICMgb3B0aW9ucyAtLSBsaXN0IG9mIHBhY2thZ2VzIGFuZCBsaXN0IG9mIG1vZHVsZXMuCisgICAgICAgIHNlbGYucGFja2FnZXMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5wYWNrYWdlcworICAgICAgICBzZWxmLnB5X21vZHVsZXMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5weV9tb2R1bGVzCisgICAgICAgIHNlbGYucGFja2FnZV9kYXRhID0gc2VsZi5kaXN0cmlidXRpb24ucGFja2FnZV9kYXRhCisgICAgICAgIHNlbGYucGFja2FnZV9kaXIgPSB7fQorICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5wYWNrYWdlX2RpcjoKKyAgICAgICAgICAgIGZvciBuYW1lLCBwYXRoIGluIHNlbGYuZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGlyLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlX2RpcltuYW1lXSA9IGNvbnZlcnRfcGF0aChwYXRoKQorICAgICAgICBzZWxmLmRhdGFfZmlsZXMgPSBzZWxmLmdldF9kYXRhX2ZpbGVzKCkKKworICAgICAgICAjIEljaywgY29waWVkIHN0cmFpZ2h0IGZyb20gaW5zdGFsbF9saWIucHkgKGZhbmN5X2dldG9wdCBuZWVkcyBhCisgICAgICAgICMgdHlwZSBzeXN0ZW0hICBIZWxsLCAqZXZlcnl0aGluZyogbmVlZHMgYSB0eXBlIHN5c3RlbSEhISkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5vcHRpbWl6ZSwgaW50KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLm9wdGltaXplID0gaW50KHNlbGYub3B0aW1pemUpCisgICAgICAgICAgICAgICAgYXNzZXJ0IDAgPD0gc2VsZi5vcHRpbWl6ZSA8PSAyCisgICAgICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigib3B0aW1pemUgbXVzdCBiZSAwLCAxLCBvciAyIikKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICMgWFhYIGNvcHlfZmlsZSBieSBkZWZhdWx0IHByZXNlcnZlcyBhdGltZSBhbmQgbXRpbWUuICBJTUhPIHRoaXMgaXMKKyAgICAgICAgIyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8sIGJ1dCBwZXJoYXBzIGl0IHNob3VsZCBiZSBhbiBvcHRpb24gLS0gaW4KKyAgICAgICAgIyBwYXJ0aWN1bGFyLCBhIHNpdGUgYWRtaW5pc3RyYXRvciBtaWdodCB3YW50IGluc3RhbGxlZCBmaWxlcyB0bworICAgICAgICAjIHJlZmxlY3QgdGhlIHRpbWUgb2YgaW5zdGFsbGF0aW9uIHJhdGhlciB0aGFuIHRoZSBsYXN0CisgICAgICAgICMgbW9kaWZpY2F0aW9uIHRpbWUgYmVmb3JlIHRoZSBpbnN0YWxsZWQgcmVsZWFzZS4KKworICAgICAgICAjIFhYWCBjb3B5X2ZpbGUgYnkgZGVmYXVsdCBwcmVzZXJ2ZXMgbW9kZSwgd2hpY2ggYXBwZWFycyB0byBiZSB0aGUKKyAgICAgICAgIyB3cm9uZyB0aGluZyB0byBkbzogaWYgYSBmaWxlIGlzIHJlYWQtb25seSBpbiB0aGUgd29ya2luZworICAgICAgICAjIGRpcmVjdG9yeSwgd2Ugd2FudCBpdCB0byBiZSBpbnN0YWxsZWQgcmVhZC93cml0ZSBzbyB0aGF0IHRoZSBuZXh0CisgICAgICAgICMgaW5zdGFsbGF0aW9uIG9mIHRoZSBzYW1lIG1vZHVsZSBkaXN0cmlidXRpb24gY2FuIG92ZXJ3cml0ZSBpdAorICAgICAgICAjIHdpdGhvdXQgcHJvYmxlbXMuICAoVGhpcyBtaWdodCBiZSBhIFVuaXgtc3BlY2lmaWMgaXNzdWUuKSAgVGh1cworICAgICAgICAjIHdlIHR1cm4gb2ZmICdwcmVzZXJ2ZV9tb2RlJyB3aGVuIGNvcHlpbmcgdG8gdGhlIGJ1aWxkIGRpcmVjdG9yeSwKKyAgICAgICAgIyBzaW5jZSB0aGUgYnVpbGQgZGlyZWN0b3J5IGlzIHN1cHBvc2VkIHRvIGJlIGV4YWN0bHkgd2hhdCB0aGUKKyAgICAgICAgIyBpbnN0YWxsYXRpb24gd2lsbCBsb29rIGxpa2UgKGllLiB3ZSBwcmVzZXJ2ZSBtb2RlIHdoZW4KKyAgICAgICAgIyBpbnN0YWxsaW5nKS4KKworICAgICAgICAjIFR3byBvcHRpb25zIGNvbnRyb2wgd2hpY2ggbW9kdWxlcyB3aWxsIGJlIGluc3RhbGxlZDogJ3BhY2thZ2VzJworICAgICAgICAjIGFuZCAncHlfbW9kdWxlcycuICBUaGUgZm9ybWVyIGxldHMgdXMgd29yayB3aXRoIHdob2xlIHBhY2thZ2VzLCBub3QKKyAgICAgICAgIyBzcGVjaWZ5aW5nIGluZGl2aWR1YWwgbW9kdWxlcyBhdCBhbGw7IHRoZSBsYXR0ZXIgaXMgZm9yCisgICAgICAgICMgc3BlY2lmeWluZyBtb2R1bGVzIG9uZS1hdC1hLXRpbWUuCisKKyAgICAgICAgaWYgc2VsZi5weV9tb2R1bGVzOgorICAgICAgICAgICAgc2VsZi5idWlsZF9tb2R1bGVzKCkKKyAgICAgICAgaWYgc2VsZi5wYWNrYWdlczoKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZXMoKQorICAgICAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlX2RhdGEoKQorCisgICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKHNlbGYuZ2V0X291dHB1dHMoaW5jbHVkZV9ieXRlY29kZT0wKSkKKworICAgIGRlZiBnZXRfZGF0YV9maWxlcyhzZWxmKToKKyAgICAgICAgIiIiR2VuZXJhdGUgbGlzdCBvZiAnKHBhY2thZ2Usc3JjX2RpcixidWlsZF9kaXIsZmlsZW5hbWVzKScgdHVwbGVzIiIiCisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICBpZiBub3Qgc2VsZi5wYWNrYWdlczoKKyAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgIGZvciBwYWNrYWdlIGluIHNlbGYucGFja2FnZXM6CisgICAgICAgICAgICAjIExvY2F0ZSBwYWNrYWdlIHNvdXJjZSBkaXJlY3RvcnkKKyAgICAgICAgICAgIHNyY19kaXIgPSBzZWxmLmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQorCisgICAgICAgICAgICAjIENvbXB1dGUgcGFja2FnZSBidWlsZCBkaXJlY3RvcnkKKyAgICAgICAgICAgIGJ1aWxkX2RpciA9IG9zLnBhdGguam9pbigqKFtzZWxmLmJ1aWxkX2xpYl0gKyBwYWNrYWdlLnNwbGl0KCcuJykpKQorCisgICAgICAgICAgICAjIExlbmd0aCBvZiBwYXRoIHRvIHN0cmlwIGZyb20gZm91bmQgZmlsZXMKKyAgICAgICAgICAgIHBsZW4gPSAwCisgICAgICAgICAgICBpZiBzcmNfZGlyOgorICAgICAgICAgICAgICAgIHBsZW4gPSBsZW4oc3JjX2RpcikrMQorCisgICAgICAgICAgICAjIFN0cmlwIGRpcmVjdG9yeSBmcm9tIGdsb2JiZWQgZmlsZW5hbWVzCisgICAgICAgICAgICBmaWxlbmFtZXMgPSBbCisgICAgICAgICAgICAgICAgZmlsZVtwbGVuOl0gZm9yIGZpbGUgaW4gc2VsZi5maW5kX2RhdGFfZmlsZXMocGFja2FnZSwgc3JjX2RpcikKKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICBkYXRhLmFwcGVuZCgocGFja2FnZSwgc3JjX2RpciwgYnVpbGRfZGlyLCBmaWxlbmFtZXMpKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIGZpbmRfZGF0YV9maWxlcyhzZWxmLCBwYWNrYWdlLCBzcmNfZGlyKToKKyAgICAgICAgIiIiUmV0dXJuIGZpbGVuYW1lcyBmb3IgcGFja2FnZSdzIGRhdGEgZmlsZXMgaW4gJ3NyY19kaXInIiIiCisgICAgICAgIGdsb2JzID0gKHNlbGYucGFja2FnZV9kYXRhLmdldCgnJywgW10pCisgICAgICAgICAgICAgICAgICsgc2VsZi5wYWNrYWdlX2RhdGEuZ2V0KHBhY2thZ2UsIFtdKSkKKyAgICAgICAgZmlsZXMgPSBbXQorICAgICAgICBmb3IgcGF0dGVybiBpbiBnbG9iczoKKyAgICAgICAgICAgICMgRWFjaCBwYXR0ZXJuIGhhcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoCisgICAgICAgICAgICBmaWxlbGlzdCA9IGdsb2Iob3MucGF0aC5qb2luKHNyY19kaXIsIGNvbnZlcnRfcGF0aChwYXR0ZXJuKSkpCisgICAgICAgICAgICAjIEZpbGVzIHRoYXQgbWF0Y2ggbW9yZSB0aGFuIG9uZSBwYXR0ZXJuIGFyZSBvbmx5IGFkZGVkIG9uY2UKKyAgICAgICAgICAgIGZpbGVzLmV4dGVuZChbZm4gZm9yIGZuIGluIGZpbGVsaXN0IGlmIGZuIG5vdCBpbiBmaWxlc10pCisgICAgICAgIHJldHVybiBmaWxlcworCisgICAgZGVmIGJ1aWxkX3BhY2thZ2VfZGF0YShzZWxmKToKKyAgICAgICAgIiIiQ29weSBkYXRhIGZpbGVzIGludG8gYnVpbGQgZGlyZWN0b3J5IiIiCisgICAgICAgIGZvciBwYWNrYWdlLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcyBpbiBzZWxmLmRhdGFfZmlsZXM6CisgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihidWlsZF9kaXIsIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYubWtwYXRoKG9zLnBhdGguZGlybmFtZSh0YXJnZXQpKQorICAgICAgICAgICAgICAgIHNlbGYuY29weV9maWxlKG9zLnBhdGguam9pbihzcmNfZGlyLCBmaWxlbmFtZSksIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZV9tb2RlPUZhbHNlKQorCisgICAgZGVmIGdldF9wYWNrYWdlX2RpcihzZWxmLCBwYWNrYWdlKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBkaXJlY3RvcnksIHJlbGF0aXZlIHRvIHRoZSB0b3Agb2YgdGhlIHNvdXJjZQorICAgICAgICAgICBkaXN0cmlidXRpb24sIHdoZXJlIHBhY2thZ2UgJ3BhY2thZ2UnIHNob3VsZCBiZSBmb3VuZAorICAgICAgICAgICAoYXQgbGVhc3QgYWNjb3JkaW5nIHRvIHRoZSAncGFja2FnZV9kaXInIG9wdGlvbiwgaWYgYW55KS4iIiIKKworICAgICAgICBwYXRoID0gcGFja2FnZS5zcGxpdCgnLicpCisKKyAgICAgICAgaWYgbm90IHNlbGYucGFja2FnZV9kaXI6CisgICAgICAgICAgICBpZiBwYXRoOgorICAgICAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oKnBhdGgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFpbCA9IFtdCisgICAgICAgICAgICB3aGlsZSBwYXRoOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcGRpciA9IHNlbGYucGFja2FnZV9kaXJbJy4nLmpvaW4ocGF0aCldCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICB0YWlsLmluc2VydCgwLCBwYXRoWy0xXSkKKyAgICAgICAgICAgICAgICAgICAgZGVsIHBhdGhbLTFdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGFpbC5pbnNlcnQoMCwgcGRpcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigqdGFpbCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBPb3BzLCBnb3QgYWxsIHRoZSB3YXkgdGhyb3VnaCAncGF0aCcgd2l0aG91dCBmaW5kaW5nIGEKKyAgICAgICAgICAgICAgICAjIG1hdGNoIGluIHBhY2thZ2VfZGlyLiAgSWYgcGFja2FnZV9kaXIgZGVmaW5lcyBhIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICMgZm9yIHRoZSByb290IChuYW1lbGVzcykgcGFja2FnZSwgdGhlbiBmYWxsYmFjayBvbiBpdDsKKyAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSwgd2UgbWlnaHQgYXMgd2VsbCBoYXZlIG5vdCBjb25zdWx0ZWQKKyAgICAgICAgICAgICAgICAjIHBhY2thZ2VfZGlyIGF0IGFsbCwgYXMgd2UganVzdCB1c2UgdGhlIGRpcmVjdG9yeSBpbXBsaWVkCisgICAgICAgICAgICAgICAgIyBieSAndGFpbCcgKHdoaWNoIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwgdmFsdWUKKyAgICAgICAgICAgICAgICAjIG9mICdwYXRoJyBhdCB0aGlzIHBvaW50KS4KKyAgICAgICAgICAgICAgICBwZGlyID0gc2VsZi5wYWNrYWdlX2Rpci5nZXQoJycpCisgICAgICAgICAgICAgICAgaWYgcGRpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgdGFpbC5pbnNlcnQoMCwgcGRpcikKKworICAgICAgICAgICAgICAgIGlmIHRhaWw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oKnRhaWwpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnCisKKyAgICBkZWYgY2hlY2tfcGFja2FnZShzZWxmLCBwYWNrYWdlLCBwYWNrYWdlX2Rpcik6CisgICAgICAgICMgRW1wdHkgZGlyIG5hbWUgbWVhbnMgY3VycmVudCBkaXJlY3RvcnksIHdoaWNoIHdlIGNhbiBwcm9iYWJseQorICAgICAgICAjIGFzc3VtZSBleGlzdHMuICBBbHNvLCBvcy5wYXRoLmV4aXN0cyBhbmQgaXNkaXIgZG9uJ3Qga25vdyBhYm91dAorICAgICAgICAjIG15ICJlbXB0eSBzdHJpbmcgbWVhbnMgY3VycmVudCBkaXIiIGNvbnZlbnRpb24sIHNvIHdlIGhhdmUgdG8KKyAgICAgICAgIyBjaXJjdW12ZW50IHRoZW0uCisgICAgICAgIGlmIHBhY2thZ2VfZGlyICE9ICIiOgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhY2thZ2VfZGlyKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgZGlyZWN0b3J5ICclcycgZG9lcyBub3QgZXhpc3QiICUgcGFja2FnZV9kaXIpCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYWNrYWdlX2Rpcik6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9zZWQgcGFja2FnZSBkaXJlY3RvcnkgJyVzJyBleGlzdHMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBpcyBub3QgYSBkaXJlY3RvcnkiICUgcGFja2FnZV9kaXIpCisKKyAgICAgICAgIyBSZXF1aXJlIF9faW5pdF9fLnB5IGZvciBhbGwgYnV0IHRoZSAicm9vdCBwYWNrYWdlIgorICAgICAgICBpZiBwYWNrYWdlOgorICAgICAgICAgICAgaW5pdF9weSA9IG9zLnBhdGguam9pbihwYWNrYWdlX2RpciwgIl9faW5pdF9fLnB5IikKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGluaXRfcHkpOgorICAgICAgICAgICAgICAgIHJldHVybiBpbml0X3B5CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvZy53YXJuKCgicGFja2FnZSBpbml0IGZpbGUgJyVzJyBub3QgZm91bmQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIob3Igbm90IGEgcmVndWxhciBmaWxlKSIpLCBpbml0X3B5KQorCisgICAgICAgICMgRWl0aGVyIG5vdCBpbiBhIHBhY2thZ2UgYXQgYWxsIChfX2luaXRfXy5weSBub3QgZXhwZWN0ZWQpLCBvcgorICAgICAgICAjIF9faW5pdF9fLnB5IGRvZXNuJ3QgZXhpc3QgLS0gc28gZG9uJ3QgcmV0dXJuIHRoZSBmaWxlbmFtZS4KKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBjaGVja19tb2R1bGUoc2VsZiwgbW9kdWxlLCBtb2R1bGVfZmlsZSk6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShtb2R1bGVfZmlsZSk6CisgICAgICAgICAgICBsb2cud2FybigiZmlsZSAlcyAoZm9yIG1vZHVsZSAlcykgbm90IGZvdW5kIiwgbW9kdWxlX2ZpbGUsIG1vZHVsZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBmaW5kX3BhY2thZ2VfbW9kdWxlcyhzZWxmLCBwYWNrYWdlLCBwYWNrYWdlX2Rpcik6CisgICAgICAgIHNlbGYuY2hlY2tfcGFja2FnZShwYWNrYWdlLCBwYWNrYWdlX2RpcikKKyAgICAgICAgbW9kdWxlX2ZpbGVzID0gZ2xvYihvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsICIqLnB5IikpCisgICAgICAgIG1vZHVsZXMgPSBbXQorICAgICAgICBzZXR1cF9zY3JpcHQgPSBvcy5wYXRoLmFic3BhdGgoc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0X25hbWUpCisKKyAgICAgICAgZm9yIGYgaW4gbW9kdWxlX2ZpbGVzOgorICAgICAgICAgICAgYWJzX2YgPSBvcy5wYXRoLmFic3BhdGgoZikKKyAgICAgICAgICAgIGlmIGFic19mICE9IHNldHVwX3NjcmlwdDoKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoZikpWzBdCisgICAgICAgICAgICAgICAgbW9kdWxlcy5hcHBlbmQoKHBhY2thZ2UsIG1vZHVsZSwgZikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImV4Y2x1ZGluZyAlcyIgJSBzZXR1cF9zY3JpcHQpCisgICAgICAgIHJldHVybiBtb2R1bGVzCisKKyAgICBkZWYgZmluZF9tb2R1bGVzKHNlbGYpOgorICAgICAgICAiIiJGaW5kcyBpbmRpdmlkdWFsbHktc3BlY2lmaWVkIFB5dGhvbiBtb2R1bGVzLCBpZS4gdGhvc2UgbGlzdGVkIGJ5CisgICAgICAgIG1vZHVsZSBuYW1lIGluICdzZWxmLnB5X21vZHVsZXMnLiAgUmV0dXJucyBhIGxpc3Qgb2YgdHVwbGVzIChwYWNrYWdlLAorICAgICAgICBtb2R1bGVfYmFzZSwgZmlsZW5hbWUpOiAncGFja2FnZScgaXMgYSB0dXBsZSBvZiB0aGUgcGF0aCB0aHJvdWdoCisgICAgICAgIHBhY2thZ2Utc3BhY2UgdG8gdGhlIG1vZHVsZTsgJ21vZHVsZV9iYXNlJyBpcyB0aGUgYmFyZSAobm8KKyAgICAgICAgcGFja2FnZXMsIG5vIGRvdHMpIG1vZHVsZSBuYW1lLCBhbmQgJ2ZpbGVuYW1lJyBpcyB0aGUgcGF0aCB0byB0aGUKKyAgICAgICAgIi5weSIgZmlsZSAocmVsYXRpdmUgdG8gdGhlIGRpc3RyaWJ1dGlvbiByb290KSB0aGF0IGltcGxlbWVudHMgdGhlCisgICAgICAgIG1vZHVsZS4KKyAgICAgICAgIiIiCisgICAgICAgICMgTWFwIHBhY2thZ2UgbmFtZXMgdG8gdHVwbGVzIG9mIHVzZWZ1bCBpbmZvIGFib3V0IHRoZSBwYWNrYWdlOgorICAgICAgICAjICAgIChwYWNrYWdlX2RpciwgY2hlY2tlZCkKKyAgICAgICAgIyBwYWNrYWdlX2RpciAtIHRoZSBkaXJlY3Rvcnkgd2hlcmUgd2UnbGwgZmluZCBzb3VyY2UgZmlsZXMgZm9yCisgICAgICAgICMgICB0aGlzIHBhY2thZ2UKKyAgICAgICAgIyBjaGVja2VkIC0gdHJ1ZSBpZiB3ZSBoYXZlIGNoZWNrZWQgdGhhdCB0aGUgcGFja2FnZSBkaXJlY3RvcnkKKyAgICAgICAgIyAgIGlzIHZhbGlkIChleGlzdHMsIGNvbnRhaW5zIF9faW5pdF9fLnB5LCAuLi4gPykKKyAgICAgICAgcGFja2FnZXMgPSB7fQorCisgICAgICAgICMgTGlzdCBvZiAocGFja2FnZSwgbW9kdWxlLCBmaWxlbmFtZSkgdHVwbGVzIHRvIHJldHVybgorICAgICAgICBtb2R1bGVzID0gW10KKworICAgICAgICAjIFdlIHRyZWF0IG1vZHVsZXMtaW4tcGFja2FnZXMgYWxtb3N0IHRoZSBzYW1lIGFzIHRvcGxldmVsIG1vZHVsZXMsCisgICAgICAgICMganVzdCB0aGUgInBhY2thZ2UiIGZvciBhIHRvcGxldmVsIGlzIGVtcHR5IChlaXRoZXIgYW4gZW1wdHkKKyAgICAgICAgIyBzdHJpbmcgb3IgZW1wdHkgbGlzdCwgZGVwZW5kaW5nIG9uIGNvbnRleHQpLiAgRGlmZmVyZW5jZXM6CisgICAgICAgICMgICAtIGRvbid0IGNoZWNrIGZvciBfX2luaXRfXy5weSBpbiBkaXJlY3RvcnkgZm9yIGVtcHR5IHBhY2thZ2UKKyAgICAgICAgZm9yIG1vZHVsZSBpbiBzZWxmLnB5X21vZHVsZXM6CisgICAgICAgICAgICBwYXRoID0gbW9kdWxlLnNwbGl0KCcuJykKKyAgICAgICAgICAgIHBhY2thZ2UgPSAnLicuam9pbihwYXRoWzA6LTFdKQorICAgICAgICAgICAgbW9kdWxlX2Jhc2UgPSBwYXRoWy0xXQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgKHBhY2thZ2VfZGlyLCBjaGVja2VkKSA9IHBhY2thZ2VzW3BhY2thZ2VdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFja2FnZV9kaXIgPSBzZWxmLmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQorICAgICAgICAgICAgICAgIGNoZWNrZWQgPSAwCisKKyAgICAgICAgICAgIGlmIG5vdCBjaGVja2VkOgorICAgICAgICAgICAgICAgIGluaXRfcHkgPSBzZWxmLmNoZWNrX3BhY2thZ2UocGFja2FnZSwgcGFja2FnZV9kaXIpCisgICAgICAgICAgICAgICAgcGFja2FnZXNbcGFja2FnZV0gPSAocGFja2FnZV9kaXIsIDEpCisgICAgICAgICAgICAgICAgaWYgaW5pdF9weToKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlcy5hcHBlbmQoKHBhY2thZ2UsICJfX2luaXRfXyIsIGluaXRfcHkpKQorCisgICAgICAgICAgICAjIFhYWCBwZXJoYXBzIHdlIHNob3VsZCBhbHNvIGNoZWNrIGZvciBqdXN0IC5weWMgZmlsZXMKKyAgICAgICAgICAgICMgKHNvIGdyZWVkeSBjbG9zZWQtc291cmNlIGJhc3RhcmRzIGNhbiBkaXN0cmlidXRlIFB5dGhvbgorICAgICAgICAgICAgIyBtb2R1bGVzIHRvbykKKyAgICAgICAgICAgIG1vZHVsZV9maWxlID0gb3MucGF0aC5qb2luKHBhY2thZ2VfZGlyLCBtb2R1bGVfYmFzZSArICIucHkiKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfbW9kdWxlKG1vZHVsZSwgbW9kdWxlX2ZpbGUpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIG1vZHVsZXMuYXBwZW5kKChwYWNrYWdlLCBtb2R1bGVfYmFzZSwgbW9kdWxlX2ZpbGUpKQorCisgICAgICAgIHJldHVybiBtb2R1bGVzCisKKyAgICBkZWYgZmluZF9hbGxfbW9kdWxlcyhzZWxmKToKKyAgICAgICAgIiIiQ29tcHV0ZSB0aGUgbGlzdCBvZiBhbGwgbW9kdWxlcyB0aGF0IHdpbGwgYmUgYnVpbHQsIHdoZXRoZXIKKyAgICAgICAgdGhleSBhcmUgc3BlY2lmaWVkIG9uZS1tb2R1bGUtYXQtYS10aW1lICgnc2VsZi5weV9tb2R1bGVzJykgb3IKKyAgICAgICAgYnkgd2hvbGUgcGFja2FnZXMgKCdzZWxmLnBhY2thZ2VzJykuICBSZXR1cm4gYSBsaXN0IG9mIHR1cGxlcworICAgICAgICAocGFja2FnZSwgbW9kdWxlLCBtb2R1bGVfZmlsZSksIGp1c3QgbGlrZSAnZmluZF9tb2R1bGVzKCknIGFuZAorICAgICAgICAnZmluZF9wYWNrYWdlX21vZHVsZXMoKScgZG8uIiIiCisgICAgICAgIG1vZHVsZXMgPSBbXQorICAgICAgICBpZiBzZWxmLnB5X21vZHVsZXM6CisgICAgICAgICAgICBtb2R1bGVzLmV4dGVuZChzZWxmLmZpbmRfbW9kdWxlcygpKQorICAgICAgICBpZiBzZWxmLnBhY2thZ2VzOgorICAgICAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlczoKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2RpciA9IHNlbGYuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpCisgICAgICAgICAgICAgICAgbSA9IHNlbGYuZmluZF9wYWNrYWdlX21vZHVsZXMocGFja2FnZSwgcGFja2FnZV9kaXIpCisgICAgICAgICAgICAgICAgbW9kdWxlcy5leHRlbmQobSkKKyAgICAgICAgcmV0dXJuIG1vZHVsZXMKKworICAgIGRlZiBnZXRfc291cmNlX2ZpbGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gW21vZHVsZVstMV0gZm9yIG1vZHVsZSBpbiBzZWxmLmZpbmRfYWxsX21vZHVsZXMoKV0KKworICAgIGRlZiBnZXRfbW9kdWxlX291dGZpbGUoc2VsZiwgYnVpbGRfZGlyLCBwYWNrYWdlLCBtb2R1bGUpOgorICAgICAgICBvdXRmaWxlX3BhdGggPSBbYnVpbGRfZGlyXSArIGxpc3QocGFja2FnZSkgKyBbbW9kdWxlICsgIi5weSJdCisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oKm91dGZpbGVfcGF0aCkKKworICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmLCBpbmNsdWRlX2J5dGVjb2RlPTEpOgorICAgICAgICBtb2R1bGVzID0gc2VsZi5maW5kX2FsbF9tb2R1bGVzKCkKKyAgICAgICAgb3V0cHV0cyA9IFtdCisgICAgICAgIGZvciAocGFja2FnZSwgbW9kdWxlLCBtb2R1bGVfZmlsZSkgaW4gbW9kdWxlczoKKyAgICAgICAgICAgIHBhY2thZ2UgPSBwYWNrYWdlLnNwbGl0KCcuJykKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRfbW9kdWxlX291dGZpbGUoc2VsZi5idWlsZF9saWIsIHBhY2thZ2UsIG1vZHVsZSkKKyAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGZpbGVuYW1lKQorICAgICAgICAgICAgaWYgaW5jbHVkZV9ieXRlY29kZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbXBpbGU6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGZpbGVuYW1lICsgImMiKQorICAgICAgICAgICAgICAgIGlmIHNlbGYub3B0aW1pemUgPiAwOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFwcGVuZChmaWxlbmFtZSArICJvIikKKworICAgICAgICBvdXRwdXRzICs9IFsKKyAgICAgICAgICAgIG9zLnBhdGguam9pbihidWlsZF9kaXIsIGZpbGVuYW1lKQorICAgICAgICAgICAgZm9yIHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzIGluIHNlbGYuZGF0YV9maWxlcworICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lcworICAgICAgICAgICAgXQorCisgICAgICAgIHJldHVybiBvdXRwdXRzCisKKyAgICBkZWYgYnVpbGRfbW9kdWxlKHNlbGYsIG1vZHVsZSwgbW9kdWxlX2ZpbGUsIHBhY2thZ2UpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHBhY2thZ2UsIHN0cik6CisgICAgICAgICAgICBwYWNrYWdlID0gcGFja2FnZS5zcGxpdCgnLicpCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UocGFja2FnZSwgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoCisgICAgICAgICAgICAgICAgICAiJ3BhY2thZ2UnIG11c3QgYmUgYSBzdHJpbmcgKGRvdC1zZXBhcmF0ZWQpLCBsaXN0LCBvciB0dXBsZSIpCisKKyAgICAgICAgIyBOb3cgcHV0IHRoZSBtb2R1bGUgc291cmNlIGZpbGUgaW50byB0aGUgImJ1aWxkIiBhcmVhIC0tIHRoaXMgaXMKKyAgICAgICAgIyBlYXN5LCB3ZSBqdXN0IGNvcHkgaXQgc29tZXdoZXJlIHVuZGVyIHNlbGYuYnVpbGRfbGliICh0aGUgYnVpbGQKKyAgICAgICAgIyBkaXJlY3RvcnkgZm9yIFB5dGhvbiBzb3VyY2UpLgorICAgICAgICBvdXRmaWxlID0gc2VsZi5nZXRfbW9kdWxlX291dGZpbGUoc2VsZi5idWlsZF9saWIsIHBhY2thZ2UsIG1vZHVsZSkKKyAgICAgICAgZGlyID0gb3MucGF0aC5kaXJuYW1lKG91dGZpbGUpCisgICAgICAgIHNlbGYubWtwYXRoKGRpcikKKyAgICAgICAgcmV0dXJuIHNlbGYuY29weV9maWxlKG1vZHVsZV9maWxlLCBvdXRmaWxlLCBwcmVzZXJ2ZV9tb2RlPTApCisKKyAgICBkZWYgYnVpbGRfbW9kdWxlcyhzZWxmKToKKyAgICAgICAgbW9kdWxlcyA9IHNlbGYuZmluZF9tb2R1bGVzKCkKKyAgICAgICAgZm9yIChwYWNrYWdlLCBtb2R1bGUsIG1vZHVsZV9maWxlKSBpbiBtb2R1bGVzOgorCisgICAgICAgICAgICAjIE5vdyAiYnVpbGQiIHRoZSBtb2R1bGUgLS0gaWUuIGNvcHkgdGhlIHNvdXJjZSBmaWxlIHRvCisgICAgICAgICAgICAjIHNlbGYuYnVpbGRfbGliICh0aGUgYnVpbGQgZGlyZWN0b3J5IGZvciBQeXRob24gc291cmNlKS4KKyAgICAgICAgICAgICMgKEFjdHVhbGx5LCBpdCBnZXRzIGNvcGllZCB0byB0aGUgZGlyZWN0b3J5IGZvciB0aGlzIHBhY2thZ2UKKyAgICAgICAgICAgICMgdW5kZXIgc2VsZi5idWlsZF9saWIuKQorICAgICAgICAgICAgc2VsZi5idWlsZF9tb2R1bGUobW9kdWxlLCBtb2R1bGVfZmlsZSwgcGFja2FnZSkKKworICAgIGRlZiBidWlsZF9wYWNrYWdlcyhzZWxmKToKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlczoKKworICAgICAgICAgICAgIyBHZXQgbGlzdCBvZiAocGFja2FnZSwgbW9kdWxlLCBtb2R1bGVfZmlsZSkgdHVwbGVzIGJhc2VkIG9uCisgICAgICAgICAgICAjIHNjYW5uaW5nIHRoZSBwYWNrYWdlIGRpcmVjdG9yeS4gICdwYWNrYWdlJyBpcyBvbmx5IGluY2x1ZGVkCisgICAgICAgICAgICAjIGluIHRoZSB0dXBsZSBzbyB0aGF0ICdmaW5kX21vZHVsZXMoKScgYW5kCisgICAgICAgICAgICAjICdmaW5kX3BhY2thZ2VfdHVwbGVzKCknIGhhdmUgYSBjb25zaXN0ZW50IGludGVyZmFjZTsgaXQncworICAgICAgICAgICAgIyBpZ25vcmVkIGhlcmUgKGFwYXJ0IGZyb20gYSBzYW5pdHkgY2hlY2spLiAgQWxzbywgJ21vZHVsZScgaXMKKyAgICAgICAgICAgICMgdGhlICp1bnF1YWxpZmllZCogbW9kdWxlIG5hbWUgKGllLiBubyBkb3RzLCBubyBwYWNrYWdlIC0tIHdlCisgICAgICAgICAgICAjIGFscmVhZHkga25vdyBpdHMgcGFja2FnZSEpLCBhbmQgJ21vZHVsZV9maWxlJyBpcyB0aGUgcGF0aCB0bworICAgICAgICAgICAgIyB0aGUgLnB5IGZpbGUsIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQorICAgICAgICAgICAgIyAoaWUuIGluY2x1ZGluZyAncGFja2FnZV9kaXInKS4KKyAgICAgICAgICAgIHBhY2thZ2VfZGlyID0gc2VsZi5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkKKyAgICAgICAgICAgIG1vZHVsZXMgPSBzZWxmLmZpbmRfcGFja2FnZV9tb2R1bGVzKHBhY2thZ2UsIHBhY2thZ2VfZGlyKQorCisgICAgICAgICAgICAjIE5vdyBsb29wIG92ZXIgdGhlIG1vZHVsZXMgd2UgZm91bmQsICJidWlsZGluZyIgZWFjaCBvbmUgKGp1c3QKKyAgICAgICAgICAgICMgY29weSBpdCB0byBzZWxmLmJ1aWxkX2xpYikuCisgICAgICAgICAgICBmb3IgKHBhY2thZ2VfLCBtb2R1bGUsIG1vZHVsZV9maWxlKSBpbiBtb2R1bGVzOgorICAgICAgICAgICAgICAgIGFzc2VydCBwYWNrYWdlID09IHBhY2thZ2VfCisgICAgICAgICAgICAgICAgc2VsZi5idWlsZF9tb2R1bGUobW9kdWxlLCBtb2R1bGVfZmlsZSwgcGFja2FnZSkKKworICAgIGRlZiBieXRlX2NvbXBpbGUoc2VsZiwgZmlsZXMpOgorICAgICAgICBpZiBzeXMuZG9udF93cml0ZV9ieXRlY29kZToKKyAgICAgICAgICAgIHNlbGYud2FybignYnl0ZS1jb21waWxpbmcgaXMgZGlzYWJsZWQsIHNraXBwaW5nLicpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBieXRlX2NvbXBpbGUKKyAgICAgICAgcHJlZml4ID0gc2VsZi5idWlsZF9saWIKKyAgICAgICAgaWYgcHJlZml4Wy0xXSAhPSBvcy5zZXA6CisgICAgICAgICAgICBwcmVmaXggPSBwcmVmaXggKyBvcy5zZXAKKworICAgICAgICAjIFhYWCB0aGlzIGNvZGUgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlICdieXRlX2NvbXBpbGUoKQorICAgICAgICAjIG1ldGhvZCBvZiB0aGUgImluc3RhbGxfbGliIiBjb21tYW5kLCBleGNlcHQgZm9yIHRoZSBkZXRlcm1pbmF0aW9uCisgICAgICAgICMgb2YgdGhlICdwcmVmaXgnIHN0cmluZy4gIEhtbW0uCisKKyAgICAgICAgaWYgc2VsZi5jb21waWxlOgorICAgICAgICAgICAgYnl0ZV9jb21waWxlKGZpbGVzLCBvcHRpbWl6ZT0wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPXNlbGYuZm9yY2UsIHByZWZpeD1wcmVmaXgsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorICAgICAgICBpZiBzZWxmLm9wdGltaXplID4gMDoKKyAgICAgICAgICAgIGJ5dGVfY29tcGlsZShmaWxlcywgb3B0aW1pemU9c2VsZi5vcHRpbWl6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1zZWxmLmZvcmNlLCBwcmVmaXg9cHJlZml4LCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfcHkucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9weS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzYzJiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfcHkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfcHkucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9weS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkNTlmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfcHkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfc2NyaXB0cy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfc2NyaXB0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjdkZjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9zY3JpcHRzLnB5CkBAIC0wLDAgKzEsMTMxIEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9zY3JpcHRzCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnYnVpbGRfc2NyaXB0cycgY29tbWFuZC4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcywgcmUKK2Zyb20gc3RhdCBpbXBvcnQgU1RfTU9ERQorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMuZGVwX3V0aWwgaW1wb3J0IG5ld2VyCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworIyBjaGVjayBpZiBQeXRob24gaXMgY2FsbGVkIG9uIHRoZSBmaXJzdCBsaW5lIHdpdGggdGhpcyBleHByZXNzaW9uCitmaXJzdF9saW5lX3JlID0gcmUuY29tcGlsZSgnXiMhLipweXRob25bMC05Ll0qKFsgXHRdLiopPyQnKQorCitjbGFzcyBidWlsZF9zY3JpcHRzIChDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gIlwiYnVpbGRcIiBzY3JpcHRzIChjb3B5IGFuZCBmaXh1cCAjISBsaW5lKSIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdidWlsZC1kaXI9JywgJ2QnLCAiZGlyZWN0b3J5IHRvIFwiYnVpbGRcIiAoY29weSkgdG8iKSwKKyAgICAgICAgKCdmb3JjZScsICdmJywgImZvcmNpYmx5IGJ1aWxkIGV2ZXJ5dGhpbmcgKGlnbm9yZSBmaWxlIHRpbWVzdGFtcHMiKSwKKyAgICAgICAgKCdleGVjdXRhYmxlPScsICdlJywgInNwZWNpZnkgZmluYWwgZGVzdGluYXRpb24gaW50ZXJwcmV0ZXIgcGF0aCIpLAorICAgICAgICBdCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ2ZvcmNlJ10KKworCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuYnVpbGRfZGlyID0gTm9uZQorICAgICAgICBzZWxmLnNjcmlwdHMgPSBOb25lCisgICAgICAgIHNlbGYuZm9yY2UgPSBOb25lCisgICAgICAgIHNlbGYuZXhlY3V0YWJsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5vdXRmaWxlcyA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zIChzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2J1aWxkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdidWlsZF9zY3JpcHRzJywgJ2J1aWxkX2RpcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2ZvcmNlJywgJ2ZvcmNlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZXhlY3V0YWJsZScsICdleGVjdXRhYmxlJykpCisgICAgICAgIHNlbGYuc2NyaXB0cyA9IHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHMKKworICAgIGRlZiBnZXRfc291cmNlX2ZpbGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zY3JpcHRzCisKKyAgICBkZWYgcnVuIChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuc2NyaXB0czoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmNvcHlfc2NyaXB0cygpCisKKworICAgIGRlZiBjb3B5X3NjcmlwdHMgKHNlbGYpOgorICAgICAgICAiIiJDb3B5IGVhY2ggc2NyaXB0IGxpc3RlZCBpbiAnc2VsZi5zY3JpcHRzJzsgaWYgaXQncyBtYXJrZWQgYXMgYQorICAgICAgICBQeXRob24gc2NyaXB0IGluIHRoZSBVbml4IHdheSAoZmlyc3QgbGluZSBtYXRjaGVzICdmaXJzdF9saW5lX3JlJywKKyAgICAgICAgaWUuIHN0YXJ0cyB3aXRoICJcIyEiIGFuZCBjb250YWlucyAicHl0aG9uIiksIHRoZW4gYWRqdXN0IHRoZSBmaXJzdAorICAgICAgICBsaW5lIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50IFB5dGhvbiBpbnRlcnByZXRlciBhcyB3ZSBjb3B5LgorICAgICAgICAiIiIKKyAgICAgICAgX3N5c2NvbmZpZyA9IF9faW1wb3J0X18oJ3N5c2NvbmZpZycpCisgICAgICAgIHNlbGYubWtwYXRoKHNlbGYuYnVpbGRfZGlyKQorICAgICAgICBvdXRmaWxlcyA9IFtdCisgICAgICAgIGZvciBzY3JpcHQgaW4gc2VsZi5zY3JpcHRzOgorICAgICAgICAgICAgYWRqdXN0ID0gMAorICAgICAgICAgICAgc2NyaXB0ID0gY29udmVydF9wYXRoKHNjcmlwdCkKKyAgICAgICAgICAgIG91dGZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kaXIsIG9zLnBhdGguYmFzZW5hbWUoc2NyaXB0KSkKKyAgICAgICAgICAgIG91dGZpbGVzLmFwcGVuZChvdXRmaWxlKQorCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5mb3JjZSBhbmQgbm90IG5ld2VyKHNjcmlwdCwgb3V0ZmlsZSk6CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJub3QgY29weWluZyAlcyAodXAtdG8tZGF0ZSkiLCBzY3JpcHQpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBBbHdheXMgb3BlbiB0aGUgZmlsZSwgYnV0IGlnbm9yZSBmYWlsdXJlcyBpbiBkcnktcnVuIG1vZGUgLS0KKyAgICAgICAgICAgICMgdGhhdCB3YXksIHdlJ2xsIGdldCBhY2N1cmF0ZSBmZWVkYmFjayBpZiB3ZSBjYW4gcmVhZCB0aGUKKyAgICAgICAgICAgICMgc2NyaXB0LgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKHNjcmlwdCwgInIiKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBmID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmaXJzdF9saW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGZpcnN0X2xpbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud2FybigiJXMgaXMgYW4gZW1wdHkgZmlsZSAoc2tpcHBpbmcpIiAlIHNjcmlwdCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIG1hdGNoID0gZmlyc3RfbGluZV9yZS5tYXRjaChmaXJzdF9saW5lKQorICAgICAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgICAgICBhZGp1c3QgPSAxCisgICAgICAgICAgICAgICAgICAgIHBvc3RfaW50ZXJwID0gbWF0Y2guZ3JvdXAoMSkgb3IgJycKKworICAgICAgICAgICAgaWYgYWRqdXN0OgorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJjb3B5aW5nIGFuZCBhZGp1c3RpbmcgJXMgLT4gJXMiLCBzY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5idWlsZF9kaXIpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICAgICAgb3V0ZiA9IG9wZW4ob3V0ZmlsZSwgInciKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgX3N5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGYud3JpdGUoIiMhJXMlc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmV4ZWN1dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X2ludGVycCkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRmLndyaXRlKCIjISVzJXNcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3MucGF0aC5qb2luKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIkJJTkRJUiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiVzJXMiICUgKF9zeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIlZFUlNJT04iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJFWEUiKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdF9pbnRlcnApKQorICAgICAgICAgICAgICAgICAgICBvdXRmLndyaXRlbGluZXMoZi5yZWFkbGluZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgb3V0Zi5jbG9zZSgpCisgICAgICAgICAgICAgICAgaWYgZjoKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGY6CisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuY29weV9maWxlKHNjcmlwdCwgb3V0ZmlsZSkKKworICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICBmb3IgZmlsZSBpbiBvdXRmaWxlczoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJjaGFuZ2luZyBtb2RlIG9mICVzIiwgZmlsZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvbGRtb2RlID0gb3Muc3RhdChmaWxlKVtTVF9NT0RFXSAmIDA3Nzc3CisgICAgICAgICAgICAgICAgICAgIG5ld21vZGUgPSAob2xkbW9kZSB8IDA1NTUpICYgMDc3NzcKKyAgICAgICAgICAgICAgICAgICAgaWYgbmV3bW9kZSAhPSBvbGRtb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oImNoYW5naW5nIG1vZGUgb2YgJXMgZnJvbSAlbyB0byAlbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBvbGRtb2RlLCBuZXdtb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2htb2QoZmlsZSwgbmV3bW9kZSkKKworICAgICMgY29weV9zY3JpcHRzICgpCisKKyMgY2xhc3MgYnVpbGRfc2NyaXB0cwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9zY3JpcHRzLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfc2NyaXB0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2MTU1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfc2NyaXB0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9zY3JpcHRzLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfc2NyaXB0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2MTU1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfc2NyaXB0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jaGVjay5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY2hlY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUyYmYwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY2hlY2sucHkKQEAgLTAsMCArMSwxNDkgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmNoZWNrCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnY2hlY2snIGNvbW1hbmQuCisiIiIKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5kaXN0IGltcG9ydCBQS0dfSU5GT19FTkNPRElORworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCisKK3RyeToKKyAgICAjIGRvY3V0aWxzIGlzIGluc3RhbGxlZAorICAgIGZyb20gZG9jdXRpbHMudXRpbHMgaW1wb3J0IFJlcG9ydGVyCisgICAgZnJvbSBkb2N1dGlscy5wYXJzZXJzLnJzdCBpbXBvcnQgUGFyc2VyCisgICAgZnJvbSBkb2N1dGlscyBpbXBvcnQgZnJvbnRlbmQKKyAgICBmcm9tIGRvY3V0aWxzIGltcG9ydCBub2RlcworICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKKyAgICBjbGFzcyBTaWxlbnRSZXBvcnRlcihSZXBvcnRlcik6CisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSwgcmVwb3J0X2xldmVsLCBoYWx0X2xldmVsLCBzdHJlYW09Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIGRlYnVnPTAsIGVuY29kaW5nPSdhc2NpaScsIGVycm9yX2hhbmRsZXI9J3JlcGxhY2UnKToKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZXMgPSBbXQorICAgICAgICAgICAgUmVwb3J0ZXIuX19pbml0X18oc2VsZiwgc291cmNlLCByZXBvcnRfbGV2ZWwsIGhhbHRfbGV2ZWwsIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnLCBlbmNvZGluZywgZXJyb3JfaGFuZGxlcikKKworICAgICAgICBkZWYgc3lzdGVtX21lc3NhZ2Uoc2VsZiwgbGV2ZWwsIG1lc3NhZ2UsICpjaGlsZHJlbiwgKiprd2FyZ3MpOgorICAgICAgICAgICAgc2VsZi5tZXNzYWdlcy5hcHBlbmQoKGxldmVsLCBtZXNzYWdlLCBjaGlsZHJlbiwga3dhcmdzKSkKKyAgICAgICAgICAgIHJldHVybiBub2Rlcy5zeXN0ZW1fbWVzc2FnZShtZXNzYWdlLCBsZXZlbD1sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXNlbGYubGV2ZWxzW2xldmVsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY2hpbGRyZW4sICoqa3dhcmdzKQorCisgICAgSEFTX0RPQ1VUSUxTID0gVHJ1ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgZG9jdXRpbHMgaXMgbm90IGluc3RhbGxlZAorICAgIEhBU19ET0NVVElMUyA9IEZhbHNlCisKK2NsYXNzIGNoZWNrKENvbW1hbmQpOgorICAgICIiIlRoaXMgY29tbWFuZCBjaGVja3MgdGhlIG1ldGEtZGF0YSBvZiB0aGUgcGFja2FnZS4KKyAgICAiIiIKKyAgICBkZXNjcmlwdGlvbiA9ICgicGVyZm9ybSBzb21lIGNoZWNrcyBvbiB0aGUgcGFja2FnZSIpCisgICAgdXNlcl9vcHRpb25zID0gWygnbWV0YWRhdGEnLCAnbScsICdWZXJpZnkgbWV0YS1kYXRhJyksCisgICAgICAgICAgICAgICAgICAgICgncmVzdHJ1Y3R1cmVkdGV4dCcsICdyJywKKyAgICAgICAgICAgICAgICAgICAgICgnQ2hlY2tzIGlmIGxvbmcgc3RyaW5nIG1ldGEtZGF0YSBzeW50YXggJworICAgICAgICAgICAgICAgICAgICAgICdhcmUgcmVTdHJ1Y3R1cmVkVGV4dC1jb21wbGlhbnQnKSksCisgICAgICAgICAgICAgICAgICAgICgnc3RyaWN0JywgJ3MnLAorICAgICAgICAgICAgICAgICAgICAgJ1dpbGwgZXhpdCB3aXRoIGFuIGVycm9yIGlmIGEgY2hlY2sgZmFpbHMnKV0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnbWV0YWRhdGEnLCAncmVzdHJ1Y3R1cmVkdGV4dCcsICdzdHJpY3QnXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3Igb3B0aW9ucy4iIiIKKyAgICAgICAgc2VsZi5yZXN0cnVjdHVyZWR0ZXh0ID0gMAorICAgICAgICBzZWxmLm1ldGFkYXRhID0gMQorICAgICAgICBzZWxmLnN0cmljdCA9IDAKKyAgICAgICAgc2VsZi5fd2FybmluZ3MgPSAwCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHdhcm4oc2VsZiwgbXNnKToKKyAgICAgICAgIiIiQ291bnRzIHRoZSBudW1iZXIgb2Ygd2FybmluZ3MgdGhhdCBvY2N1cnMuIiIiCisgICAgICAgIHNlbGYuX3dhcm5pbmdzICs9IDEKKyAgICAgICAgcmV0dXJuIENvbW1hbmQud2FybihzZWxmLCBtc2cpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAiIiJSdW5zIHRoZSBjb21tYW5kLiIiIgorICAgICAgICAjIHBlcmZvcm0gdGhlIHZhcmlvdXMgdGVzdHMKKyAgICAgICAgaWYgc2VsZi5tZXRhZGF0YToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbWV0YWRhdGEoKQorICAgICAgICBpZiBzZWxmLnJlc3RydWN0dXJlZHRleHQ6CisgICAgICAgICAgICBpZiBIQVNfRE9DVVRJTFM6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19yZXN0cnVjdHVyZWR0ZXh0KCkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5zdHJpY3Q6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcignVGhlIGRvY3V0aWxzIHBhY2thZ2UgaXMgbmVlZGVkLicpCisKKyAgICAgICAgIyBsZXQncyByYWlzZSBhbiBlcnJvciBpbiBzdHJpY3QgbW9kZSwgaWYgd2UgaGF2ZSBhdCBsZWFzdAorICAgICAgICAjIG9uZSB3YXJuaW5nCisgICAgICAgIGlmIHNlbGYuc3RyaWN0IGFuZCBzZWxmLl93YXJuaW5ncyA+IDA6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKCdQbGVhc2UgY29ycmVjdCB5b3VyIHBhY2thZ2UuJykKKworICAgIGRlZiBjaGVja19tZXRhZGF0YShzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlcyB0aGF0IGFsbCByZXF1aXJlZCBlbGVtZW50cyBvZiBtZXRhLWRhdGEgYXJlIHN1cHBsaWVkLgorCisgICAgICAgIG5hbWUsIHZlcnNpb24sIFVSTCwgKGF1dGhvciBhbmQgYXV0aG9yX2VtYWlsKSBvcgorICAgICAgICAobWFpbnRhaW5lciBhbmQgbWFpbnRhaW5lcl9lbWFpbCkpLgorCisgICAgICAgIFdhcm5zIGlmIGFueSBhcmUgbWlzc2luZy4KKyAgICAgICAgIiIiCisgICAgICAgIG1ldGFkYXRhID0gc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEKKworICAgICAgICBtaXNzaW5nID0gW10KKyAgICAgICAgZm9yIGF0dHIgaW4gKCduYW1lJywgJ3ZlcnNpb24nLCAndXJsJyk6CisgICAgICAgICAgICBpZiBub3QgKGhhc2F0dHIobWV0YWRhdGEsIGF0dHIpIGFuZCBnZXRhdHRyKG1ldGFkYXRhLCBhdHRyKSk6CisgICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoYXR0cikKKworICAgICAgICBpZiBtaXNzaW5nOgorICAgICAgICAgICAgc2VsZi53YXJuKCJtaXNzaW5nIHJlcXVpcmVkIG1ldGEtZGF0YTogJXMiICAlICcsICcuam9pbihtaXNzaW5nKSkKKyAgICAgICAgaWYgbWV0YWRhdGEuYXV0aG9yOgorICAgICAgICAgICAgaWYgbm90IG1ldGFkYXRhLmF1dGhvcl9lbWFpbDoKKyAgICAgICAgICAgICAgICBzZWxmLndhcm4oIm1pc3NpbmcgbWV0YS1kYXRhOiBpZiAnYXV0aG9yJyBzdXBwbGllZCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICInYXV0aG9yX2VtYWlsJyBtdXN0IGJlIHN1cHBsaWVkIHRvbyIpCisgICAgICAgIGVsaWYgbWV0YWRhdGEubWFpbnRhaW5lcjoKKyAgICAgICAgICAgIGlmIG5vdCBtZXRhZGF0YS5tYWludGFpbmVyX2VtYWlsOgorICAgICAgICAgICAgICAgIHNlbGYud2FybigibWlzc2luZyBtZXRhLWRhdGE6IGlmICdtYWludGFpbmVyJyBzdXBwbGllZCwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICInbWFpbnRhaW5lcl9lbWFpbCcgbXVzdCBiZSBzdXBwbGllZCB0b28iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53YXJuKCJtaXNzaW5nIG1ldGEtZGF0YTogZWl0aGVyIChhdXRob3IgYW5kIGF1dGhvcl9lbWFpbCkgIiArCisgICAgICAgICAgICAgICAgICAgICAgIm9yIChtYWludGFpbmVyIGFuZCBtYWludGFpbmVyX2VtYWlsKSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBzdXBwbGllZCIpCisKKyAgICBkZWYgY2hlY2tfcmVzdHJ1Y3R1cmVkdGV4dChzZWxmKToKKyAgICAgICAgIiIiQ2hlY2tzIGlmIHRoZSBsb25nIHN0cmluZyBmaWVsZHMgYXJlIHJlU1QtY29tcGxpYW50LiIiIgorICAgICAgICBkYXRhID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2xvbmdfZGVzY3JpcHRpb24oKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCB1bmljb2RlKToKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLmRlY29kZShQS0dfSU5GT19FTkNPRElORykKKyAgICAgICAgZm9yIHdhcm5pbmcgaW4gc2VsZi5fY2hlY2tfcnN0X2RhdGEoZGF0YSk6CisgICAgICAgICAgICBsaW5lID0gd2FybmluZ1stMV0uZ2V0KCdsaW5lJykKKyAgICAgICAgICAgIGlmIGxpbmUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB3YXJuaW5nID0gd2FybmluZ1sxXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3YXJuaW5nID0gJyVzIChsaW5lICVzKScgJSAod2FybmluZ1sxXSwgbGluZSkKKyAgICAgICAgICAgIHNlbGYud2Fybih3YXJuaW5nKQorCisgICAgZGVmIF9jaGVja19yc3RfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgIiIiUmV0dXJucyB3YXJuaW5ncyB3aGVuIHRoZSBwcm92aWRlZCBkYXRhIGRvZXNuJ3QgY29tcGlsZS4iIiIKKyAgICAgICAgc291cmNlX3BhdGggPSBTdHJpbmdJTygpCisgICAgICAgIHBhcnNlciA9IFBhcnNlcigpCisgICAgICAgIHNldHRpbmdzID0gZnJvbnRlbmQuT3B0aW9uUGFyc2VyKCkuZ2V0X2RlZmF1bHRfdmFsdWVzKCkKKyAgICAgICAgc2V0dGluZ3MudGFiX3dpZHRoID0gNAorICAgICAgICBzZXR0aW5ncy5wZXBfcmVmZXJlbmNlcyA9IE5vbmUKKyAgICAgICAgc2V0dGluZ3MucmZjX3JlZmVyZW5jZXMgPSBOb25lCisgICAgICAgIHJlcG9ydGVyID0gU2lsZW50UmVwb3J0ZXIoc291cmNlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzLnJlcG9ydF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MuaGFsdF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtPXNldHRpbmdzLndhcm5pbmdfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz1zZXR0aW5ncy5kZWJ1ZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9c2V0dGluZ3MuZXJyb3JfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2hhbmRsZXI9c2V0dGluZ3MuZXJyb3JfZW5jb2RpbmdfZXJyb3JfaGFuZGxlcikKKworICAgICAgICBkb2N1bWVudCA9IG5vZGVzLmRvY3VtZW50KHNldHRpbmdzLCByZXBvcnRlciwgc291cmNlPXNvdXJjZV9wYXRoKQorICAgICAgICBkb2N1bWVudC5ub3RlX3NvdXJjZShzb3VyY2VfcGF0aCwgLTEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZShkYXRhLCBkb2N1bWVudCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmVwb3J0ZXIubWVzc2FnZXMuYXBwZW5kKCgtMSwgJ0NvdWxkIG5vdCBmaW5pc2ggdGhlIHBhcnNpbmcuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsIHt9KSkKKworICAgICAgICByZXR1cm4gcmVwb3J0ZXIubWVzc2FnZXMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY2hlY2sucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jaGVjay5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5YzJjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY2hlY2sucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY2hlY2sucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jaGVjay5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk5YzJjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY2hlY2sucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY2xlYW4ucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NsZWFuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZWYzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NsZWFuLnB5CkBAIC0wLDAgKzEsODAgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmNsZWFuCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnY2xlYW4nIGNvbW1hbmQuIiIiCisKKyMgY29udHJpYnV0ZWQgYnkgQmFzdGlhbiBLbGVpbmVpZGFtIDxjYWx2aW5AY3MudW5pLXNiLmRlPiwgYWRkZWQgMjAwMC0wMy0xOAorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgcmVtb3ZlX3RyZWUKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworY2xhc3MgY2xlYW4oQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZXMgZnJvbSAnYnVpbGQnIGNvbW1hbmQiCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2J1aWxkLWJhc2U9JywgJ2InLAorICAgICAgICAgImJhc2UgYnVpbGQgZGlyZWN0b3J5IChkZWZhdWx0OiAnYnVpbGQuYnVpbGQtYmFzZScpIiksCisgICAgICAgICgnYnVpbGQtbGliPScsIE5vbmUsCisgICAgICAgICAiYnVpbGQgZGlyZWN0b3J5IGZvciBhbGwgbW9kdWxlcyAoZGVmYXVsdDogJ2J1aWxkLmJ1aWxkLWxpYicpIiksCisgICAgICAgICgnYnVpbGQtdGVtcD0nLCAndCcsCisgICAgICAgICAidGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yeSAoZGVmYXVsdDogJ2J1aWxkLmJ1aWxkLXRlbXAnKSIpLAorICAgICAgICAoJ2J1aWxkLXNjcmlwdHM9JywgTm9uZSwKKyAgICAgICAgICJidWlsZCBkaXJlY3RvcnkgZm9yIHNjcmlwdHMgKGRlZmF1bHQ6ICdidWlsZC5idWlsZC1zY3JpcHRzJykiKSwKKyAgICAgICAgKCdiZGlzdC1iYXNlPScsIE5vbmUsCisgICAgICAgICAidGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgYnVpbHQgZGlzdHJpYnV0aW9ucyIpLAorICAgICAgICAoJ2FsbCcsICdhJywKKyAgICAgICAgICJyZW1vdmUgYWxsIGJ1aWxkIG91dHB1dCwgbm90IGp1c3QgdGVtcG9yYXJ5IGJ5LXByb2R1Y3RzIikKKyAgICBdCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ2FsbCddCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmJ1aWxkX2Jhc2UgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfbGliID0gTm9uZQorICAgICAgICBzZWxmLmJ1aWxkX3RlbXAgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfc2NyaXB0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5iZGlzdF9iYXNlID0gTm9uZQorICAgICAgICBzZWxmLmFsbCA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYnVpbGQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2J1aWxkX2Jhc2UnLCAnYnVpbGRfYmFzZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2J1aWxkX2xpYicsICdidWlsZF9saWInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdidWlsZF9zY3JpcHRzJywgJ2J1aWxkX3NjcmlwdHMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdidWlsZF90ZW1wJywgJ2J1aWxkX3RlbXAnKSkKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdiZGlzdF9iYXNlJywgJ2JkaXN0X2Jhc2UnKSkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICMgcmVtb3ZlIHRoZSBidWlsZC90ZW1wLjxwbGF0PiBkaXJlY3RvcnkgKHVubGVzcyBpdCdzIGFscmVhZHkKKyAgICAgICAgIyBnb25lKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmJ1aWxkX3RlbXApOgorICAgICAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5idWlsZF90ZW1wLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiJyVzJyBkb2VzIG5vdCBleGlzdCAtLSBjYW4ndCBjbGVhbiBpdCIsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5idWlsZF90ZW1wKQorCisgICAgICAgIGlmIHNlbGYuYWxsOgorICAgICAgICAgICAgIyByZW1vdmUgYnVpbGQgZGlyZWN0b3JpZXMKKyAgICAgICAgICAgIGZvciBkaXJlY3RvcnkgaW4gKHNlbGYuYnVpbGRfbGliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5iZGlzdF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5idWlsZF9zY3JpcHRzKToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkaXJlY3RvcnkpOgorICAgICAgICAgICAgICAgICAgICByZW1vdmVfdHJlZShkaXJlY3RvcnksIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCInJXMnIGRvZXMgbm90IGV4aXN0IC0tIGNhbid0IGNsZWFuIGl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5KQorCisgICAgICAgICMganVzdCBmb3IgdGhlIGhlY2sgb2YgaXQsIHRyeSB0byByZW1vdmUgdGhlIGJhc2UgYnVpbGQgZGlyZWN0b3J5OgorICAgICAgICAjIHdlIG1pZ2h0IGhhdmUgZW1wdGllZCBpdCByaWdodCBub3csIGJ1dCBpZiBub3Qgd2UgZG9uJ3QgY2FyZQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnJtZGlyKHNlbGYuYnVpbGRfYmFzZSkKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygicmVtb3ZpbmcgJyVzJyIsIHNlbGYuYnVpbGRfYmFzZSkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworIyBjbGFzcyBjbGVhbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jbGVhbi5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NsZWFuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTJiMDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jbGVhbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jbGVhbi5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NsZWFuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTJiMDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jbGVhbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jb21tYW5kX3RlbXBsYXRlIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jb21tYW5kX3RlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYmJhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NvbW1hbmRfdGVtcGxhdGUKQEAgLTAsMCArMSw0NSBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQueAorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ3gnIGNvbW1hbmQuCisiIiIKKworIyBjcmVhdGVkIDIwMDAvbW0vZGQsIEpvaG4gRG9lCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCisKKworY2xhc3MgeCAoQ29tbWFuZCk6CisKKyAgICAjIEJyaWVmICg0MC01MCBjaGFyYWN0ZXJzKSBkZXNjcmlwdGlvbiBvZiB0aGUgY29tbWFuZAorICAgIGRlc2NyaXB0aW9uID0gIiIKKworICAgICMgTGlzdCBvZiBvcHRpb24gdHVwbGVzOiBsb25nIG5hbWUsIHNob3J0IG5hbWUgKE5vbmUgaWYgbm8gc2hvcnQKKyAgICAjIG5hbWUpLCBhbmQgaGVscCBzdHJpbmcuCisgICAgdXNlcl9vcHRpb25zID0gWygnJywgJycsCisgICAgICAgICAgICAgICAgICAgICAiIiksCisgICAgICAgICAgICAgICAgICAgXQorCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zIChzZWxmKToKKyAgICAgICAgc2VsZi4gPSBOb25lCisgICAgICAgIHNlbGYuID0gTm9uZQorICAgICAgICBzZWxmLiA9IE5vbmUKKworICAgICMgaW5pdGlhbGl6ZV9vcHRpb25zKCkKKworCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnggaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYueCA9IAorCisgICAgIyBmaW5hbGl6ZV9vcHRpb25zKCkKKworCisgICAgZGVmIHJ1biAoc2VsZik6CisKKworICAgICMgcnVuKCkKKworIyBjbGFzcyB4CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwODQ5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weQpAQCAtMCwwICsxLDM1NyBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuY29uZmlnCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnY29uZmlnJyBjb21tYW5kLCBhIChtb3N0bHkpIGVtcHR5IGNvbW1hbmQgY2xhc3MKK3RoYXQgZXhpc3RzIG1haW5seSB0byBiZSBzdWItY2xhc3NlZCBieSBzcGVjaWZpYyBtb2R1bGUgZGlzdHJpYnV0aW9ucyBhbmQKK2FwcGxpY2F0aW9ucy4gIFRoZSBpZGVhIGlzIHRoYXQgd2hpbGUgZXZlcnkgImNvbmZpZyIgY29tbWFuZCBpcyBkaWZmZXJlbnQsCithdCBsZWFzdCB0aGV5J3JlIGFsbCBuYW1lZCB0aGUgc2FtZSwgYW5kIHVzZXJzIGFsd2F5cyBzZWUgImNvbmZpZyIgaW4gdGhlCitsaXN0IG9mIHN0YW5kYXJkIGNvbW1hbmRzLiAgQWxzbywgdGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gcHV0IGNvbW1vbgorY29uZmlndXJlLWxpa2UgdGFza3M6ICJ0cnkgdG8gY29tcGlsZSB0aGlzIEMgY29kZSIsIG9yICJmaWd1cmUgb3V0IHdoZXJlCit0aGlzIGhlYWRlciBmaWxlIGxpdmVzIi4KKyIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKKworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFeGVjRXJyb3IKK2Zyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgY3VzdG9taXplX2NvbXBpbGVyCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKK0xBTkdfRVhUID0geydjJzogJy5jJywgJ2MrKyc6ICcuY3h4J30KKworY2xhc3MgY29uZmlnKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAicHJlcGFyZSB0byBidWlsZCIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdjb21waWxlcj0nLCBOb25lLAorICAgICAgICAgInNwZWNpZnkgdGhlIGNvbXBpbGVyIHR5cGUiKSwKKyAgICAgICAgKCdjYz0nLCBOb25lLAorICAgICAgICAgInNwZWNpZnkgdGhlIGNvbXBpbGVyIGV4ZWN1dGFibGUiKSwKKyAgICAgICAgKCdpbmNsdWRlLWRpcnM9JywgJ0knLAorICAgICAgICAgImxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBoZWFkZXIgZmlsZXMiKSwKKyAgICAgICAgKCdkZWZpbmU9JywgJ0QnLAorICAgICAgICAgIkMgcHJlcHJvY2Vzc29yIG1hY3JvcyB0byBkZWZpbmUiKSwKKyAgICAgICAgKCd1bmRlZj0nLCAnVScsCisgICAgICAgICAiQyBwcmVwcm9jZXNzb3IgbWFjcm9zIHRvIHVuZGVmaW5lIiksCisgICAgICAgICgnbGlicmFyaWVzPScsICdsJywKKyAgICAgICAgICJleHRlcm5hbCBDIGxpYnJhcmllcyB0byBsaW5rIHdpdGgiKSwKKyAgICAgICAgKCdsaWJyYXJ5LWRpcnM9JywgJ0wnLAorICAgICAgICAgImRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgZXh0ZXJuYWwgQyBsaWJyYXJpZXMiKSwKKworICAgICAgICAoJ25vaXN5JywgTm9uZSwKKyAgICAgICAgICJzaG93IGV2ZXJ5IGFjdGlvbiAoY29tcGlsZSwgbGluaywgcnVuLCAuLi4pIHRha2VuIiksCisgICAgICAgICgnZHVtcC1zb3VyY2UnLCBOb25lLAorICAgICAgICAgImR1bXAgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBiZWZvcmUgYXR0ZW1wdGluZyB0byBjb21waWxlIHRoZW0iKSwKKyAgICAgICAgXQorCisKKyAgICAjIFRoZSB0aHJlZSBzdGFuZGFyZCBjb21tYW5kIG1ldGhvZHM6IHNpbmNlIHRoZSAiY29uZmlnIiBjb21tYW5kCisgICAgIyBkb2VzIG5vdGhpbmcgYnkgZGVmYXVsdCwgdGhlc2UgYXJlIGVtcHR5LgorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5jb21waWxlciA9IE5vbmUKKyAgICAgICAgc2VsZi5jYyA9IE5vbmUKKyAgICAgICAgc2VsZi5pbmNsdWRlX2RpcnMgPSBOb25lCisgICAgICAgIHNlbGYubGlicmFyaWVzID0gTm9uZQorICAgICAgICBzZWxmLmxpYnJhcnlfZGlycyA9IE5vbmUKKworICAgICAgICAjIG1heGltYWwgb3V0cHV0IGZvciBub3cKKyAgICAgICAgc2VsZi5ub2lzeSA9IDEKKyAgICAgICAgc2VsZi5kdW1wX3NvdXJjZSA9IDEKKworICAgICAgICAjIGxpc3Qgb2YgdGVtcG9yYXJ5IGZpbGVzIGdlbmVyYXRlZCBhbG9uZy10aGUtd2F5IHRoYXQgd2UgaGF2ZQorICAgICAgICAjIHRvIGNsZWFuIGF0IHNvbWUgcG9pbnQKKyAgICAgICAgc2VsZi50ZW1wX2ZpbGVzID0gW10KKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmluY2x1ZGVfZGlycyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5pbmNsdWRlX2RpcnMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5pbmNsdWRlX2RpcnMgb3IgW10KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYuaW5jbHVkZV9kaXJzLCBzdHIpOgorICAgICAgICAgICAgc2VsZi5pbmNsdWRlX2RpcnMgPSBzZWxmLmluY2x1ZGVfZGlycy5zcGxpdChvcy5wYXRoc2VwKQorCisgICAgICAgIGlmIHNlbGYubGlicmFyaWVzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmxpYnJhcmllcyA9IFtdCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLmxpYnJhcmllcywgc3RyKToKKyAgICAgICAgICAgIHNlbGYubGlicmFyaWVzID0gW3NlbGYubGlicmFyaWVzXQorCisgICAgICAgIGlmIHNlbGYubGlicmFyeV9kaXJzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZGlycyA9IFtdCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWxmLmxpYnJhcnlfZGlycywgc3RyKToKKyAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzID0gc2VsZi5saWJyYXJ5X2RpcnMuc3BsaXQob3MucGF0aHNlcCkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHBhc3MKKworCisgICAgIyBVdGlsaXR5IG1ldGhvZHMgZm9yIGFjdHVhbCAiY29uZmlnIiBjb21tYW5kcy4gIFRoZSBpbnRlcmZhY2VzIGFyZQorICAgICMgbG9vc2VseSBiYXNlZCBvbiBBdXRvY29uZiBtYWNyb3Mgb2Ygc2ltaWxhciBuYW1lcy4gIFN1Yi1jbGFzc2VzCisgICAgIyBtYXkgdXNlIHRoZXNlIGZyZWVseS4KKworICAgIGRlZiBfY2hlY2tfY29tcGlsZXIoc2VsZik6CisgICAgICAgICIiIkNoZWNrIHRoYXQgJ3NlbGYuY29tcGlsZXInIHJlYWxseSBpcyBhIENDb21waWxlciBvYmplY3Q7CisgICAgICAgIGlmIG5vdCwgbWFrZSBpdCBvbmUuCisgICAgICAgICIiIgorICAgICAgICAjIFdlIGRvIHRoaXMgbGF0ZSwgYW5kIG9ubHkgb24tZGVtYW5kLCBiZWNhdXNlIHRoaXMgaXMgYW4gZXhwZW5zaXZlCisgICAgICAgICMgaW1wb3J0LgorICAgICAgICBmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IENDb21waWxlciwgbmV3X2NvbXBpbGVyCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYuY29tcGlsZXIsIENDb21waWxlcik6CisgICAgICAgICAgICBzZWxmLmNvbXBpbGVyID0gbmV3X2NvbXBpbGVyKGNvbXBpbGVyPXNlbGYuY29tcGlsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuLCBmb3JjZT0xKQorICAgICAgICAgICAgY3VzdG9taXplX2NvbXBpbGVyKHNlbGYuY29tcGlsZXIpCisgICAgICAgICAgICBpZiBzZWxmLmluY2x1ZGVfZGlyczoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBpbGVyLnNldF9pbmNsdWRlX2RpcnMoc2VsZi5pbmNsdWRlX2RpcnMpCisgICAgICAgICAgICBpZiBzZWxmLmxpYnJhcmllczoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBpbGVyLnNldF9saWJyYXJpZXMoc2VsZi5saWJyYXJpZXMpCisgICAgICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZGlyczoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBpbGVyLnNldF9saWJyYXJ5X2RpcnMoc2VsZi5saWJyYXJ5X2RpcnMpCisKKworICAgIGRlZiBfZ2VuX3RlbXBfc291cmNlZmlsZShzZWxmLCBib2R5LCBoZWFkZXJzLCBsYW5nKToKKyAgICAgICAgZmlsZW5hbWUgPSAiX2NvbmZpZ3Rlc3QiICsgTEFOR19FWFRbbGFuZ10KKyAgICAgICAgZmlsZSA9IG9wZW4oZmlsZW5hbWUsICJ3IikKKyAgICAgICAgaWYgaGVhZGVyczoKKyAgICAgICAgICAgIGZvciBoZWFkZXIgaW4gaGVhZGVyczoKKyAgICAgICAgICAgICAgICBmaWxlLndyaXRlKCIjaW5jbHVkZSA8JXM+XG4iICUgaGVhZGVyKQorICAgICAgICAgICAgZmlsZS53cml0ZSgiXG4iKQorICAgICAgICBmaWxlLndyaXRlKGJvZHkpCisgICAgICAgIGlmIGJvZHlbLTFdICE9ICJcbiI6CisgICAgICAgICAgICBmaWxlLndyaXRlKCJcbiIpCisgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBfcHJlcHJvY2VzcyhzZWxmLCBib2R5LCBoZWFkZXJzLCBpbmNsdWRlX2RpcnMsIGxhbmcpOgorICAgICAgICBzcmMgPSBzZWxmLl9nZW5fdGVtcF9zb3VyY2VmaWxlKGJvZHksIGhlYWRlcnMsIGxhbmcpCisgICAgICAgIG91dCA9ICJfY29uZmlndGVzdC5pIgorICAgICAgICBzZWxmLnRlbXBfZmlsZXMuZXh0ZW5kKFtzcmMsIG91dF0pCisgICAgICAgIHNlbGYuY29tcGlsZXIucHJlcHJvY2VzcyhzcmMsIG91dCwgaW5jbHVkZV9kaXJzPWluY2x1ZGVfZGlycykKKyAgICAgICAgcmV0dXJuIChzcmMsIG91dCkKKworICAgIGRlZiBfY29tcGlsZShzZWxmLCBib2R5LCBoZWFkZXJzLCBpbmNsdWRlX2RpcnMsIGxhbmcpOgorICAgICAgICBzcmMgPSBzZWxmLl9nZW5fdGVtcF9zb3VyY2VmaWxlKGJvZHksIGhlYWRlcnMsIGxhbmcpCisgICAgICAgIGlmIHNlbGYuZHVtcF9zb3VyY2U6CisgICAgICAgICAgICBkdW1wX2ZpbGUoc3JjLCAiY29tcGlsaW5nICclcyc6IiAlIHNyYykKKyAgICAgICAgKG9iaiwpID0gc2VsZi5jb21waWxlci5vYmplY3RfZmlsZW5hbWVzKFtzcmNdKQorICAgICAgICBzZWxmLnRlbXBfZmlsZXMuZXh0ZW5kKFtzcmMsIG9ial0pCisgICAgICAgIHNlbGYuY29tcGlsZXIuY29tcGlsZShbc3JjXSwgaW5jbHVkZV9kaXJzPWluY2x1ZGVfZGlycykKKyAgICAgICAgcmV0dXJuIChzcmMsIG9iaikKKworICAgIGRlZiBfbGluayhzZWxmLCBib2R5LCBoZWFkZXJzLCBpbmNsdWRlX2RpcnMsIGxpYnJhcmllcywgbGlicmFyeV9kaXJzLAorICAgICAgICAgICAgICBsYW5nKToKKyAgICAgICAgKHNyYywgb2JqKSA9IHNlbGYuX2NvbXBpbGUoYm9keSwgaGVhZGVycywgaW5jbHVkZV9kaXJzLCBsYW5nKQorICAgICAgICBwcm9nID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKHNyYykpWzBdCisgICAgICAgIHNlbGYuY29tcGlsZXIubGlua19leGVjdXRhYmxlKFtvYmpdLCBwcm9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9bGlicmFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5X2RpcnM9bGlicmFyeV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbGFuZz1sYW5nKQorCisgICAgICAgIGlmIHNlbGYuY29tcGlsZXIuZXhlX2V4dGVuc2lvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByb2cgPSBwcm9nICsgc2VsZi5jb21waWxlci5leGVfZXh0ZW5zaW9uCisgICAgICAgIHNlbGYudGVtcF9maWxlcy5hcHBlbmQocHJvZykKKworICAgICAgICByZXR1cm4gKHNyYywgb2JqLCBwcm9nKQorCisgICAgZGVmIF9jbGVhbihzZWxmLCAqZmlsZW5hbWVzKToKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lczoKKyAgICAgICAgICAgIGZpbGVuYW1lcyA9IHNlbGYudGVtcF9maWxlcworICAgICAgICAgICAgc2VsZi50ZW1wX2ZpbGVzID0gW10KKyAgICAgICAgbG9nLmluZm8oInJlbW92aW5nOiAlcyIsICcgJy5qb2luKGZpbGVuYW1lcykpCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisKKyAgICAjIFhYWCB0aGVzZSBpZ25vcmUgdGhlIGRyeS1ydW4gZmxhZzogd2hhdCB0byBkbywgd2hhdCB0byBkbz8gZXZlbiBpZgorICAgICMgeW91IHdhbnQgYSBkcnktcnVuIGJ1aWxkLCB5b3Ugc3RpbGwgbmVlZCBzb21lIHNvcnQgb2YgY29uZmlndXJhdGlvbgorICAgICMgaW5mby4gIE15IGluY2xpbmF0aW9uIGlzIHRvIG1ha2UgaXQgdXAgdG8gdGhlIHJlYWwgY29uZmlnIGNvbW1hbmQgdG8KKyAgICAjIGNvbnN1bHQgJ2RyeV9ydW4nLCBhbmQgYXNzdW1lIGEgZGVmYXVsdCAobWluaW1hbCkgY29uZmlndXJhdGlvbiBpZgorICAgICMgdHJ1ZS4gIFRoZSBwcm9ibGVtIHdpdGggdHJ5aW5nIHRvIGRvIGl0IGhlcmUgaXMgdGhhdCB5b3UnZCBoYXZlIHRvCisgICAgIyByZXR1cm4gZWl0aGVyIHRydWUgb3IgZmFsc2UgZnJvbSBhbGwgdGhlICd0cnknIG1ldGhvZHMsIG5laXRoZXIgb2YKKyAgICAjIHdoaWNoIGlzIGNvcnJlY3QuCisKKyAgICAjIFhYWCBuZWVkIGFjY2VzcyB0byB0aGUgaGVhZGVyIHNlYXJjaCBwYXRoIGFuZCBtYXliZSBkZWZhdWx0IG1hY3Jvcy4KKworICAgIGRlZiB0cnlfY3BwKHNlbGYsIGJvZHk9Tm9uZSwgaGVhZGVycz1Ob25lLCBpbmNsdWRlX2RpcnM9Tm9uZSwgbGFuZz0iYyIpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBzb3VyY2UgZmlsZSBmcm9tICdib2R5JyAoYSBzdHJpbmcgY29udGFpbmluZyBsaW5lcworICAgICAgICBvZiBDL0MrKyBjb2RlKSBhbmQgJ2hlYWRlcnMnIChhIGxpc3Qgb2YgaGVhZGVyIGZpbGVzIHRvIGluY2x1ZGUpCisgICAgICAgIGFuZCBydW4gaXQgdGhyb3VnaCB0aGUgcHJlcHJvY2Vzc29yLiAgUmV0dXJuIHRydWUgaWYgdGhlCisgICAgICAgIHByZXByb2Nlc3NvciBzdWNjZWVkZWQsIGZhbHNlIGlmIHRoZXJlIHdlcmUgYW55IGVycm9ycy4KKyAgICAgICAgKCdib2R5JyBwcm9iYWJseSBpc24ndCBvZiBtdWNoIHVzZSwgYnV0IHdoYXQgdGhlIGhlY2suKQorICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBDb21waWxlRXJyb3IKKyAgICAgICAgc2VsZi5fY2hlY2tfY29tcGlsZXIoKQorICAgICAgICBvayA9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fcHJlcHJvY2Vzcyhib2R5LCBoZWFkZXJzLCBpbmNsdWRlX2RpcnMsIGxhbmcpCisgICAgICAgIGV4Y2VwdCBDb21waWxlRXJyb3I6CisgICAgICAgICAgICBvayA9IDAKKworICAgICAgICBzZWxmLl9jbGVhbigpCisgICAgICAgIHJldHVybiBvaworCisgICAgZGVmIHNlYXJjaF9jcHAoc2VsZiwgcGF0dGVybiwgYm9keT1Ob25lLCBoZWFkZXJzPU5vbmUsIGluY2x1ZGVfZGlycz1Ob25lLAorICAgICAgICAgICAgICAgICAgIGxhbmc9ImMiKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgc291cmNlIGZpbGUgKGp1c3QgbGlrZSAndHJ5X2NwcCgpJyksIHJ1biBpdCB0aHJvdWdoCisgICAgICAgIHRoZSBwcmVwcm9jZXNzb3IsIGFuZCByZXR1cm4gdHJ1ZSBpZiBhbnkgbGluZSBvZiB0aGUgb3V0cHV0IG1hdGNoZXMKKyAgICAgICAgJ3BhdHRlcm4nLiAgJ3BhdHRlcm4nIHNob3VsZCBlaXRoZXIgYmUgYSBjb21waWxlZCByZWdleCBvYmplY3Qgb3IgYQorICAgICAgICBzdHJpbmcgY29udGFpbmluZyBhIHJlZ2V4LiAgSWYgYm90aCAnYm9keScgYW5kICdoZWFkZXJzJyBhcmUgTm9uZSwKKyAgICAgICAgcHJlcHJvY2Vzc2VzIGFuIGVtcHR5IGZpbGUgLS0gd2hpY2ggY2FuIGJlIHVzZWZ1bCB0byBkZXRlcm1pbmUgdGhlCisgICAgICAgIHN5bWJvbHMgdGhlIHByZXByb2Nlc3NvciBhbmQgY29tcGlsZXIgc2V0IGJ5IGRlZmF1bHQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVja19jb21waWxlcigpCisgICAgICAgIHNyYywgb3V0ID0gc2VsZi5fcHJlcHJvY2Vzcyhib2R5LCBoZWFkZXJzLCBpbmNsdWRlX2RpcnMsIGxhbmcpCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBzdHIpOgorICAgICAgICAgICAgcGF0dGVybiA9IHJlLmNvbXBpbGUocGF0dGVybikKKworICAgICAgICBmaWxlID0gb3BlbihvdXQpCisgICAgICAgIG1hdGNoID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IGZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgcGF0dGVybi5zZWFyY2gobGluZSk6CisgICAgICAgICAgICAgICAgbWF0Y2ggPSAxCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBmaWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5fY2xlYW4oKQorICAgICAgICByZXR1cm4gbWF0Y2gKKworICAgIGRlZiB0cnlfY29tcGlsZShzZWxmLCBib2R5LCBoZWFkZXJzPU5vbmUsIGluY2x1ZGVfZGlycz1Ob25lLCBsYW5nPSJjIik6CisgICAgICAgICIiIlRyeSB0byBjb21waWxlIGEgc291cmNlIGZpbGUgYnVpbHQgZnJvbSAnYm9keScgYW5kICdoZWFkZXJzJy4KKyAgICAgICAgUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBDb21waWxlRXJyb3IKKyAgICAgICAgc2VsZi5fY2hlY2tfY29tcGlsZXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9jb21waWxlKGJvZHksIGhlYWRlcnMsIGluY2x1ZGVfZGlycywgbGFuZykKKyAgICAgICAgICAgIG9rID0gMQorICAgICAgICBleGNlcHQgQ29tcGlsZUVycm9yOgorICAgICAgICAgICAgb2sgPSAwCisKKyAgICAgICAgbG9nLmluZm8ob2sgYW5kICJzdWNjZXNzISIgb3IgImZhaWx1cmUuIikKKyAgICAgICAgc2VsZi5fY2xlYW4oKQorICAgICAgICByZXR1cm4gb2sKKworICAgIGRlZiB0cnlfbGluayhzZWxmLCBib2R5LCBoZWFkZXJzPU5vbmUsIGluY2x1ZGVfZGlycz1Ob25lLCBsaWJyYXJpZXM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsIGxhbmc9ImMiKToKKyAgICAgICAgIiIiVHJ5IHRvIGNvbXBpbGUgYW5kIGxpbmsgYSBzb3VyY2UgZmlsZSwgYnVpbHQgZnJvbSAnYm9keScgYW5kCisgICAgICAgICdoZWFkZXJzJywgdG8gZXhlY3V0YWJsZSBmb3JtLiAgUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UKKyAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBDb21waWxlRXJyb3IsIExpbmtFcnJvcgorICAgICAgICBzZWxmLl9jaGVja19jb21waWxlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2xpbmsoYm9keSwgaGVhZGVycywgaW5jbHVkZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMsIGxpYnJhcnlfZGlycywgbGFuZykKKyAgICAgICAgICAgIG9rID0gMQorICAgICAgICBleGNlcHQgKENvbXBpbGVFcnJvciwgTGlua0Vycm9yKToKKyAgICAgICAgICAgIG9rID0gMAorCisgICAgICAgIGxvZy5pbmZvKG9rIGFuZCAic3VjY2VzcyEiIG9yICJmYWlsdXJlLiIpCisgICAgICAgIHNlbGYuX2NsZWFuKCkKKyAgICAgICAgcmV0dXJuIG9rCisKKyAgICBkZWYgdHJ5X3J1bihzZWxmLCBib2R5LCBoZWFkZXJzPU5vbmUsIGluY2x1ZGVfZGlycz1Ob25lLCBsaWJyYXJpZXM9Tm9uZSwKKyAgICAgICAgICAgICAgICBsaWJyYXJ5X2RpcnM9Tm9uZSwgbGFuZz0iYyIpOgorICAgICAgICAiIiJUcnkgdG8gY29tcGlsZSwgbGluayB0byBhbiBleGVjdXRhYmxlLCBhbmQgcnVuIGEgcHJvZ3JhbQorICAgICAgICBidWlsdCBmcm9tICdib2R5JyBhbmQgJ2hlYWRlcnMnLiAgUmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UKKyAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBDb21waWxlRXJyb3IsIExpbmtFcnJvcgorICAgICAgICBzZWxmLl9jaGVja19jb21waWxlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNyYywgb2JqLCBleGUgPSBzZWxmLl9saW5rKGJvZHksIGhlYWRlcnMsIGluY2x1ZGVfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBsYW5nKQorICAgICAgICAgICAgc2VsZi5zcGF3bihbZXhlXSkKKyAgICAgICAgICAgIG9rID0gMQorICAgICAgICBleGNlcHQgKENvbXBpbGVFcnJvciwgTGlua0Vycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IpOgorICAgICAgICAgICAgb2sgPSAwCisKKyAgICAgICAgbG9nLmluZm8ob2sgYW5kICJzdWNjZXNzISIgb3IgImZhaWx1cmUuIikKKyAgICAgICAgc2VsZi5fY2xlYW4oKQorICAgICAgICByZXR1cm4gb2sKKworCisgICAgIyAtLSBIaWdoLWxldmVsIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjICh0aGVzZSBhcmUgdGhlIG9uZXMgdGhhdCBhcmUgYWN0dWFsbHkgbGlrZWx5IHRvIGJlIHVzZWZ1bAorICAgICMgd2hlbiBpbXBsZW1lbnRpbmcgYSByZWFsLXdvcmxkIGNvbmZpZyBjb21tYW5kISkKKworICAgIGRlZiBjaGVja19mdW5jKHNlbGYsIGZ1bmMsIGhlYWRlcnM9Tm9uZSwgaW5jbHVkZV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBkZWNsPTAsIGNhbGw9MCk6CisKKyAgICAgICAgIiIiRGV0ZXJtaW5lIGlmIGZ1bmN0aW9uICdmdW5jJyBpcyBhdmFpbGFibGUgYnkgY29uc3RydWN0aW5nIGEKKyAgICAgICAgc291cmNlIGZpbGUgdGhhdCByZWZlcnMgdG8gJ2Z1bmMnLCBhbmQgY29tcGlsZXMgYW5kIGxpbmtzIGl0LgorICAgICAgICBJZiBldmVyeXRoaW5nIHN1Y2NlZWRzLCByZXR1cm5zIHRydWU7IG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorCisgICAgICAgIFRoZSBjb25zdHJ1Y3RlZCBzb3VyY2UgZmlsZSBzdGFydHMgb3V0IGJ5IGluY2x1ZGluZyB0aGUgaGVhZGVyCisgICAgICAgIGZpbGVzIGxpc3RlZCBpbiAnaGVhZGVycycuICBJZiAnZGVjbCcgaXMgdHJ1ZSwgaXQgdGhlbiBkZWNsYXJlcworICAgICAgICAnZnVuYycgKGFzICJpbnQgZnVuYygpIik7IHlvdSBwcm9iYWJseSBzaG91bGRuJ3Qgc3VwcGx5ICdoZWFkZXJzJworICAgICAgICBhbmQgc2V0ICdkZWNsJyB0cnVlIGluIHRoZSBzYW1lIGNhbGwsIG9yIHlvdSBtaWdodCBnZXQgZXJyb3JzIGFib3V0CisgICAgICAgIGEgY29uZmxpY3RpbmcgZGVjbGFyYXRpb25zIGZvciAnZnVuYycuICBGaW5hbGx5LCB0aGUgY29uc3RydWN0ZWQKKyAgICAgICAgJ21haW4oKScgZnVuY3Rpb24gZWl0aGVyIHJlZmVyZW5jZXMgJ2Z1bmMnIG9yIChpZiAnY2FsbCcgaXMgdHJ1ZSkKKyAgICAgICAgY2FsbHMgaXQuICAnbGlicmFyaWVzJyBhbmQgJ2xpYnJhcnlfZGlycycgYXJlIHVzZWQgd2hlbgorICAgICAgICBsaW5raW5nLgorICAgICAgICAiIiIKKworICAgICAgICBzZWxmLl9jaGVja19jb21waWxlcigpCisgICAgICAgIGJvZHkgPSBbXQorICAgICAgICBpZiBkZWNsOgorICAgICAgICAgICAgYm9keS5hcHBlbmQoImludCAlcyAoKTsiICUgZnVuYykKKyAgICAgICAgYm9keS5hcHBlbmQoImludCBtYWluICgpIHsiKQorICAgICAgICBpZiBjYWxsOgorICAgICAgICAgICAgYm9keS5hcHBlbmQoIiAgJXMoKTsiICUgZnVuYykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kKCIgICVzOyIgJSBmdW5jKQorICAgICAgICBib2R5LmFwcGVuZCgifSIpCisgICAgICAgIGJvZHkgPSAiXG4iLmpvaW4oYm9keSkgKyAiXG4iCisKKyAgICAgICAgcmV0dXJuIHNlbGYudHJ5X2xpbmsoYm9keSwgaGVhZGVycywgaW5jbHVkZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMsIGxpYnJhcnlfZGlycykKKworICAgICMgY2hlY2tfZnVuYyAoKQorCisgICAgZGVmIGNoZWNrX2xpYihzZWxmLCBsaWJyYXJ5LCBsaWJyYXJ5X2RpcnM9Tm9uZSwgaGVhZGVycz1Ob25lLAorICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPU5vbmUsIG90aGVyX2xpYnJhcmllcz1bXSk6CisgICAgICAgICIiIkRldGVybWluZSBpZiAnbGlicmFyeScgaXMgYXZhaWxhYmxlIHRvIGJlIGxpbmtlZCBhZ2FpbnN0LAorICAgICAgICB3aXRob3V0IGFjdHVhbGx5IGNoZWNraW5nIHRoYXQgYW55IHBhcnRpY3VsYXIgc3ltYm9scyBhcmUgcHJvdmlkZWQKKyAgICAgICAgYnkgaXQuICAnaGVhZGVycycgd2lsbCBiZSB1c2VkIGluIGNvbnN0cnVjdGluZyB0aGUgc291cmNlIGZpbGUgdG8KKyAgICAgICAgYmUgY29tcGlsZWQsIGJ1dCB0aGUgb25seSBlZmZlY3Qgb2YgdGhpcyBpcyB0byBjaGVjayBpZiBhbGwgdGhlCisgICAgICAgIGhlYWRlciBmaWxlcyBsaXN0ZWQgYXJlIGF2YWlsYWJsZS4gIEFueSBsaWJyYXJpZXMgbGlzdGVkIGluCisgICAgICAgICdvdGhlcl9saWJyYXJpZXMnIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGxpbmssIGluIGNhc2UgJ2xpYnJhcnknCisgICAgICAgIGhhcyBzeW1ib2xzIHRoYXQgZGVwZW5kIG9uIG90aGVyIGxpYnJhcmllcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbXBpbGVyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYudHJ5X2xpbmsoImludCBtYWluICh2b2lkKSB7IH0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLCBpbmNsdWRlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaWJyYXJ5XStvdGhlcl9saWJyYXJpZXMsIGxpYnJhcnlfZGlycykKKworICAgIGRlZiBjaGVja19oZWFkZXIoc2VsZiwgaGVhZGVyLCBpbmNsdWRlX2RpcnM9Tm9uZSwgbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBsYW5nPSJjIik6CisgICAgICAgICIiIkRldGVybWluZSBpZiB0aGUgc3lzdGVtIGhlYWRlciBmaWxlIG5hbWVkIGJ5ICdoZWFkZXJfZmlsZScKKyAgICAgICAgZXhpc3RzIGFuZCBjYW4gYmUgZm91bmQgYnkgdGhlIHByZXByb2Nlc3NvcjsgcmV0dXJuIHRydWUgaWYgc28sCisgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRyeV9jcHAoYm9keT0iLyogTm8gYm9keSAqLyIsIGhlYWRlcnM9W2hlYWRlcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPWluY2x1ZGVfZGlycykKKworCitkZWYgZHVtcF9maWxlKGZpbGVuYW1lLCBoZWFkPU5vbmUpOgorICAgICIiIkR1bXBzIGEgZmlsZSBjb250ZW50IGludG8gbG9nLmluZm8uCisKKyAgICBJZiBoZWFkIGlzIG5vdCBOb25lLCB3aWxsIGJlIGR1bXBlZCBiZWZvcmUgdGhlIGZpbGUgY29udGVudC4KKyAgICAiIiIKKyAgICBpZiBoZWFkIGlzIE5vbmU6CisgICAgICAgIGxvZy5pbmZvKCclcycgJSBmaWxlbmFtZSkKKyAgICBlbHNlOgorICAgICAgICBsb2cuaW5mbyhoZWFkKQorICAgIGZpbGUgPSBvcGVuKGZpbGVuYW1lKQorICAgIHRyeToKKyAgICAgICAgbG9nLmluZm8oZmlsZS5yZWFkKCkpCisgICAgZmluYWxseToKKyAgICAgICAgZmlsZS5jbG9zZSgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0ZDhkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NvbmZpZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0ZDhkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5NjRhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQpAQCAtMCwwICsxLDcwOSBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbAorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ2luc3RhbGwnIGNvbW1hbmQuIiIiCisKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworIyBUaGlzIG1vZHVsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMS4KKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBzeXMsIG9zLCBzdHJpbmcsIHJlCitmcm9tIHR5cGVzIGltcG9ydCAqCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5kZWJ1ZyBpbXBvcnQgREVCVUcKK2Zyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X2NvbmZpZ192YXJzCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKK2Zyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgd3JpdGVfZmlsZQorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoLCBzdWJzdF92YXJzLCBjaGFuZ2Vfcm9vdAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCitmcm9tIHNpdGUgaW1wb3J0IFVTRVJfQkFTRQorZnJvbSBzaXRlIGltcG9ydCBVU0VSX1NJVEUKK2Zyb20gc3RyaW5nIGltcG9ydCBtYWtldHJhbnMKKworZGVmIGlzX21zeXNfbWluZ3coKToKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIiBhbmQgIk1TWVNURU0iIGluIG9zLmVudmlyb24gYW5kIHN5cy52ZXJzaW9uLmZpbmQoIkdDQyIpID49IDA6CisgICAgICAgIGlmIG9zLmVudmlyb25bIk1TWVNURU0iXSA9PSAiTUlOR1czMiI6CisgICAgICAgICAgICByZXR1cm4gMQorICAgIHJldHVybiAwCisKK2RlZiBoYXNfbXN5cygpOgorICAgIF9tc3lzZGxsID0gIm1zeXMtMS4wLmRsbCIKKyAgICBmb3IgX3BhdGggaW4gb3MuZW52aXJvblsiUEFUSCJdLnNwbGl0KG9zLnBhdGhzZXApOgorICAgICAgICBjdXJycGF0aCA9IG9zLnBhdGguam9pbihfcGF0aCwgX21zeXNkbGwpCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGN1cnJwYXRoKSBhbmQgb3MuYWNjZXNzKGN1cnJwYXRoLCBvcy5GX09LKToKKyAgICAgICAgICAgIHJldHVybiBfcGF0aAorICAgIHJldHVybiBOb25lCisKK2RlZiBtc3lzX3Jvb3QoKToKKyAgICBpZiBpc19tc3lzX21pbmd3KCkgYW5kIGhhc19tc3lzKCkgaXMgbm90IE5vbmU6CisgICAgICAgIGFyZyA9IGhhc19tc3lzKCkKKyAgICAgICAgYXJnID0gYXJnLnJzdHJpcCgiXFwiKQorICAgICAgICBpZiBhcmcuZW5kc3dpdGgoIlxcYmluIik6CisgICAgICAgICAgICAjIGRyb3AgdGhlIFxcYmluCisgICAgICAgICAgICBhcmcgPSBhcmdbOi00XQorICAgICAgICB0YWJsZSA9IG1ha2V0cmFucygnXFwnLCAnLycpCisgICAgICAgIGFyZyA9IGFyZy50cmFuc2xhdGUodGFibGUpCisgICAgICAgIGlmIGFyZy5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgYXJnID0gYXJnWzotMV0KKyAgICAgICAgcmV0dXJuIGFyZworICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisKK2lmIHN5cy52ZXJzaW9uIDwgIjIuMiI6CisgICAgV0lORE9XU19TQ0hFTUUgPSB7CisgICAgICAgICdwdXJlbGliJzogJyRiYXNlJywKKyAgICAgICAgJ3BsYXRsaWInOiAnJGJhc2UnLAorICAgICAgICAnaGVhZGVycyc6ICckYmFzZS9JbmNsdWRlLyRkaXN0X25hbWUnLAorICAgICAgICAnc2NyaXB0cyc6ICckYmFzZS9TY3JpcHRzJywKKyAgICAgICAgJ2RhdGEnICAgOiAnJGJhc2UnLAorICAgIH0KK2Vsc2U6CisgICAgV0lORE9XU19TQ0hFTUUgPSB7CisgICAgICAgICdwdXJlbGliJzogJyRiYXNlL0xpYi9zaXRlLXBhY2thZ2VzJywKKyAgICAgICAgJ3BsYXRsaWInOiAnJGJhc2UvTGliL3NpdGUtcGFja2FnZXMnLAorICAgICAgICAnaGVhZGVycyc6ICckYmFzZS9JbmNsdWRlLyRkaXN0X25hbWUnLAorICAgICAgICAnc2NyaXB0cyc6ICckYmFzZS9TY3JpcHRzJywKKyAgICAgICAgJ2RhdGEnICAgOiAnJGJhc2UnLAorICAgIH0KKworSU5TVEFMTF9TQ0hFTUVTID0geworICAgICd1bml4X3ByZWZpeCc6IHsKKyAgICAgICAgJ3B1cmVsaWInOiAnJGJhc2UvbGliL3B5dGhvbiRweV92ZXJzaW9uX3Nob3J0L3NpdGUtcGFja2FnZXMnLAorICAgICAgICAncGxhdGxpYic6ICckcGxhdGJhc2UvbGliL3B5dGhvbiRweV92ZXJzaW9uX3Nob3J0L3NpdGUtcGFja2FnZXMnLAorICAgICAgICAnaGVhZGVycyc6ICckYmFzZS9pbmNsdWRlL3B5dGhvbiRweV92ZXJzaW9uX3Nob3J0LyRkaXN0X25hbWUnLAorICAgICAgICAnc2NyaXB0cyc6ICckYmFzZS9iaW4nLAorICAgICAgICAnZGF0YScgICA6ICckYmFzZScsCisgICAgICAgIH0sCisgICAgJ3VuaXhfaG9tZSc6IHsKKyAgICAgICAgJ3B1cmVsaWInOiAnJGJhc2UvbGliL3B5dGhvbicsCisgICAgICAgICdwbGF0bGliJzogJyRiYXNlL2xpYi9weXRob24nLAorICAgICAgICAnaGVhZGVycyc6ICckYmFzZS9pbmNsdWRlL3B5dGhvbi8kZGlzdF9uYW1lJywKKyAgICAgICAgJ3NjcmlwdHMnOiAnJGJhc2UvYmluJywKKyAgICAgICAgJ2RhdGEnICAgOiAnJGJhc2UnLAorICAgICAgICB9LAorICAgICd1bml4X3VzZXInOiB7CisgICAgICAgICdwdXJlbGliJzogJyR1c2Vyc2l0ZScsCisgICAgICAgICdwbGF0bGliJzogJyR1c2Vyc2l0ZScsCisgICAgICAgICdoZWFkZXJzJzogJyR1c2VyYmFzZS9pbmNsdWRlL3B5dGhvbiRweV92ZXJzaW9uX3Nob3J0LyRkaXN0X25hbWUnLAorICAgICAgICAnc2NyaXB0cyc6ICckdXNlcmJhc2UvYmluJywKKyAgICAgICAgJ2RhdGEnICAgOiAnJHVzZXJiYXNlJywKKyAgICAgICAgfSwKKyAgICAnbnQnOiBXSU5ET1dTX1NDSEVNRSwKKyAgICAnbnRfdXNlcic6IHsKKyAgICAgICAgJ3B1cmVsaWInOiAnJHVzZXJzaXRlJywKKyAgICAgICAgJ3BsYXRsaWInOiAnJHVzZXJzaXRlJywKKyAgICAgICAgJ2hlYWRlcnMnOiAnJHVzZXJiYXNlL1B5dGhvbiRweV92ZXJzaW9uX25vZG90L0luY2x1ZGUvJGRpc3RfbmFtZScsCisgICAgICAgICdzY3JpcHRzJzogJyR1c2VyYmFzZS9TY3JpcHRzJywKKyAgICAgICAgJ2RhdGEnICAgOiAnJHVzZXJiYXNlJywKKyAgICAgICAgfSwKKyAgICAnb3MyJzogeworICAgICAgICAncHVyZWxpYic6ICckYmFzZS9MaWIvc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICdwbGF0bGliJzogJyRiYXNlL0xpYi9zaXRlLXBhY2thZ2VzJywKKyAgICAgICAgJ2hlYWRlcnMnOiAnJGJhc2UvSW5jbHVkZS8kZGlzdF9uYW1lJywKKyAgICAgICAgJ3NjcmlwdHMnOiAnJGJhc2UvU2NyaXB0cycsCisgICAgICAgICdkYXRhJyAgIDogJyRiYXNlJywKKyAgICAgICAgfSwKKyAgICAnb3MyX2hvbWUnOiB7CisgICAgICAgICdwdXJlbGliJzogJyR1c2Vyc2l0ZScsCisgICAgICAgICdwbGF0bGliJzogJyR1c2Vyc2l0ZScsCisgICAgICAgICdoZWFkZXJzJzogJyR1c2VyYmFzZS9pbmNsdWRlL3B5dGhvbiRweV92ZXJzaW9uX3Nob3J0LyRkaXN0X25hbWUnLAorICAgICAgICAnc2NyaXB0cyc6ICckdXNlcmJhc2UvYmluJywKKyAgICAgICAgJ2RhdGEnICAgOiAnJHVzZXJiYXNlJywKKyAgICAgICAgfSwKKyAgICB9CisKKyMgVGhlIGtleXMgdG8gYW4gaW5zdGFsbGF0aW9uIHNjaGVtZTsgaWYgYW55IG5ldyB0eXBlcyBvZiBmaWxlcyBhcmUgdG8gYmUKKyMgaW5zdGFsbGVkLCBiZSBzdXJlIHRvIGFkZCBhbiBlbnRyeSB0byBldmVyeSBpbnN0YWxsYXRpb24gc2NoZW1lIGFib3ZlLAorIyBhbmQgdG8gU0NIRU1FX0tFWVMgaGVyZS4KK1NDSEVNRV9LRVlTID0gKCdwdXJlbGliJywgJ3BsYXRsaWInLCAnaGVhZGVycycsICdzY3JpcHRzJywgJ2RhdGEnKQorCisKK2NsYXNzIGluc3RhbGwgKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAiaW5zdGFsbCBldmVyeXRoaW5nIGZyb20gYnVpbGQgZGlyZWN0b3J5IgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAjIFNlbGVjdCBpbnN0YWxsYXRpb24gc2NoZW1lIGFuZCBzZXQgYmFzZSBkaXJlY3Rvcih5fGllcykKKyAgICAgICAgKCdwcmVmaXg9JywgTm9uZSwKKyAgICAgICAgICJpbnN0YWxsYXRpb24gcHJlZml4IiksCisgICAgICAgICgnZXhlYy1wcmVmaXg9JywgTm9uZSwKKyAgICAgICAgICIoVW5peCBvbmx5KSBwcmVmaXggZm9yIHBsYXRmb3JtLXNwZWNpZmljIGZpbGVzIiksCisgICAgICAgICgnaG9tZT0nLCBOb25lLAorICAgICAgICAgIihVbml4IG9ubHkpIGhvbWUgZGlyZWN0b3J5IHRvIGluc3RhbGwgdW5kZXIiKSwKKyAgICAgICAgKCd1c2VyJywgTm9uZSwKKyAgICAgICAgICJpbnN0YWxsIGluIHVzZXIgc2l0ZS1wYWNrYWdlICclcyciICUgVVNFUl9TSVRFKSwKKworICAgICAgICAjIE9yLCBqdXN0IHNldCB0aGUgYmFzZSBkaXJlY3Rvcih5fGllcykKKyAgICAgICAgKCdpbnN0YWxsLWJhc2U9JywgTm9uZSwKKyAgICAgICAgICJiYXNlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKGluc3RlYWQgb2YgLS1wcmVmaXggb3IgLS1ob21lKSIpLAorICAgICAgICAoJ2luc3RhbGwtcGxhdGJhc2U9JywgTm9uZSwKKyAgICAgICAgICJiYXNlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGZpbGVzICIgKworICAgICAgICAgIihpbnN0ZWFkIG9mIC0tZXhlYy1wcmVmaXggb3IgLS1ob21lKSIpLAorICAgICAgICAoJ3Jvb3Q9JywgTm9uZSwKKyAgICAgICAgICJpbnN0YWxsIGV2ZXJ5dGhpbmcgcmVsYXRpdmUgdG8gdGhpcyBhbHRlcm5hdGUgcm9vdCBkaXJlY3RvcnkiKSwKKworICAgICAgICAjIE9yLCBleHBsaWNpdGx5IHNldCB0aGUgaW5zdGFsbGF0aW9uIHNjaGVtZQorICAgICAgICAoJ2luc3RhbGwtcHVyZWxpYj0nLCBOb25lLAorICAgICAgICAgImluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIHB1cmUgUHl0aG9uIG1vZHVsZSBkaXN0cmlidXRpb25zIiksCisgICAgICAgICgnaW5zdGFsbC1wbGF0bGliPScsIE5vbmUsCisgICAgICAgICAiaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3Igbm9uLXB1cmUgbW9kdWxlIGRpc3RyaWJ1dGlvbnMiKSwKKyAgICAgICAgKCdpbnN0YWxsLWxpYj0nLCBOb25lLAorICAgICAgICAgImluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIGFsbCBtb2R1bGUgZGlzdHJpYnV0aW9ucyAiICsKKyAgICAgICAgICIob3ZlcnJpZGVzIC0taW5zdGFsbC1wdXJlbGliIGFuZCAtLWluc3RhbGwtcGxhdGxpYikiKSwKKworICAgICAgICAoJ2luc3RhbGwtaGVhZGVycz0nLCBOb25lLAorICAgICAgICAgImluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIEMvQysrIGhlYWRlcnMiKSwKKyAgICAgICAgKCdpbnN0YWxsLXNjcmlwdHM9JywgTm9uZSwKKyAgICAgICAgICJpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBQeXRob24gc2NyaXB0cyIpLAorICAgICAgICAoJ2luc3RhbGwtZGF0YT0nLCBOb25lLAorICAgICAgICAgImluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIGRhdGEgZmlsZXMiKSwKKworICAgICAgICAjIEJ5dGUtY29tcGlsYXRpb24gb3B0aW9ucyAtLSBzZWUgaW5zdGFsbF9saWIucHkgZm9yIGRldGFpbHMsIGFzCisgICAgICAgICMgdGhlc2UgYXJlIGR1cGxpY2F0ZWQgZnJvbSB0aGVyZSAoYnV0IG9ubHkgaW5zdGFsbF9saWIgZG9lcworICAgICAgICAjIGFueXRoaW5nIHdpdGggdGhlbSkuCisgICAgICAgICgnY29tcGlsZScsICdjJywgImNvbXBpbGUgLnB5IHRvIC5weWMgW2RlZmF1bHRdIiksCisgICAgICAgICgnbm8tY29tcGlsZScsIE5vbmUsICJkb24ndCBjb21waWxlIC5weSBmaWxlcyIpLAorICAgICAgICAoJ29wdGltaXplPScsICdPJywKKyAgICAgICAgICJhbHNvIGNvbXBpbGUgd2l0aCBvcHRpbWl6YXRpb246IC1PMSBmb3IgXCJweXRob24gLU9cIiwgIgorICAgICAgICAgIi1PMiBmb3IgXCJweXRob24gLU9PXCIsIGFuZCAtTzAgdG8gZGlzYWJsZSBbZGVmYXVsdDogLU8wXSIpLAorCisgICAgICAgICMgTWlzY2VsbGFuZW91cyBjb250cm9sIG9wdGlvbnMKKyAgICAgICAgKCdmb3JjZScsICdmJywKKyAgICAgICAgICJmb3JjZSBpbnN0YWxsYXRpb24gKG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgZmlsZXMpIiksCisgICAgICAgICgnc2tpcC1idWlsZCcsIE5vbmUsCisgICAgICAgICAic2tpcCByZWJ1aWxkaW5nIGV2ZXJ5dGhpbmcgKGZvciB0ZXN0aW5nL2RlYnVnZ2luZykiKSwKKworICAgICAgICAjIFdoZXJlIHRvIGluc3RhbGwgZG9jdW1lbnRhdGlvbiAoZXZlbnR1YWxseSEpCisgICAgICAgICMoJ2RvYy1mb3JtYXQ9JywgTm9uZSwgImZvcm1hdCBvZiBkb2N1bWVudGF0aW9uIHRvIGdlbmVyYXRlIiksCisgICAgICAgICMoJ2luc3RhbGwtbWFuPScsIE5vbmUsICJkaXJlY3RvcnkgZm9yIFVuaXggbWFuIHBhZ2VzIiksCisgICAgICAgICMoJ2luc3RhbGwtaHRtbD0nLCBOb25lLCAiZGlyZWN0b3J5IGZvciBIVE1MIGRvY3VtZW50YXRpb24iKSwKKyAgICAgICAgIygnaW5zdGFsbC1pbmZvPScsIE5vbmUsICJkaXJlY3RvcnkgZm9yIEdOVSBpbmZvIGZpbGVzIiksCisKKyAgICAgICAgKCdyZWNvcmQ9JywgTm9uZSwKKyAgICAgICAgICJmaWxlbmFtZSBpbiB3aGljaCB0byByZWNvcmQgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMiKSwKKyAgICAgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWydjb21waWxlJywgJ2ZvcmNlJywgJ3NraXAtYnVpbGQnLCAndXNlciddCisgICAgbmVnYXRpdmVfb3B0ID0geyduby1jb21waWxlJyA6ICdjb21waWxlJ30KKworCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyAoc2VsZik6CisKKyAgICAgICAgIyBIaWdoLWxldmVsIG9wdGlvbnM6IHRoZXNlIHNlbGVjdCBib3RoIGFuIGluc3RhbGxhdGlvbiBiYXNlCisgICAgICAgICMgYW5kIHNjaGVtZS4KKyAgICAgICAgc2VsZi5wcmVmaXggPSBOb25lCisgICAgICAgIHNlbGYuZXhlY19wcmVmaXggPSBOb25lCisgICAgICAgIHNlbGYuaG9tZSA9IE5vbmUKKyAgICAgICAgc2VsZi51c2VyID0gMAorCisgICAgICAgICMgVGhlc2Ugc2VsZWN0IG9ubHkgdGhlIGluc3RhbGxhdGlvbiBiYXNlOyBpdCdzIHVwIHRvIHRoZSB1c2VyIHRvCisgICAgICAgICMgc3BlY2lmeSB0aGUgaW5zdGFsbGF0aW9uIHNjaGVtZSAoY3VycmVudGx5LCB0aGF0IG1lYW5zIHN1cHBseWluZworICAgICAgICAjIHRoZSAtLWluc3RhbGwte3BsYXRsaWIscHVyZWxpYixzY3JpcHRzLGRhdGF9IG9wdGlvbnMpLgorICAgICAgICBzZWxmLmluc3RhbGxfYmFzZSA9IE5vbmUKKyAgICAgICAgc2VsZi5pbnN0YWxsX3BsYXRiYXNlID0gTm9uZQorICAgICAgICBzZWxmLnJvb3QgPSBOb25lCisKKyAgICAgICAgIyBUaGVzZSBvcHRpb25zIGFyZSB0aGUgYWN0dWFsIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllczsgaWYgbm90CisgICAgICAgICMgc3VwcGxpZWQgYnkgdGhlIHVzZXIsIHRoZXkgYXJlIGZpbGxlZCBpbiB1c2luZyB0aGUgaW5zdGFsbGF0aW9uCisgICAgICAgICMgc2NoZW1lIGltcGxpZWQgYnkgcHJlZml4L2V4ZWMtcHJlZml4L2hvbWUgYW5kIHRoZSBjb250ZW50cyBvZgorICAgICAgICAjIHRoYXQgaW5zdGFsbGF0aW9uIHNjaGVtZS4KKyAgICAgICAgc2VsZi5pbnN0YWxsX3B1cmVsaWIgPSBOb25lICAgICAjIGZvciBwdXJlIG1vZHVsZSBkaXN0cmlidXRpb25zCisgICAgICAgIHNlbGYuaW5zdGFsbF9wbGF0bGliID0gTm9uZSAgICAgIyBub24tcHVyZSAoZGlzdHMgdy8gZXh0ZW5zaW9ucykKKyAgICAgICAgc2VsZi5pbnN0YWxsX2hlYWRlcnMgPSBOb25lICAgICAjIGZvciBDL0MrKyBoZWFkZXJzCisgICAgICAgIHNlbGYuaW5zdGFsbF9saWIgPSBOb25lICAgICAgICAgIyBzZXQgdG8gZWl0aGVyIHB1cmVsaWIgb3IgcGxhdGxpYgorICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5pbnN0YWxsX2RhdGEgPSBOb25lCisgICAgICAgIHNlbGYuaW5zdGFsbF91c2VyYmFzZSA9IFVTRVJfQkFTRQorICAgICAgICBzZWxmLmluc3RhbGxfdXNlcnNpdGUgPSBVU0VSX1NJVEUKKworICAgICAgICBzZWxmLmNvbXBpbGUgPSBOb25lCisgICAgICAgIHNlbGYub3B0aW1pemUgPSBOb25lCisKKyAgICAgICAgIyBUaGVzZSB0d28gYXJlIGZvciBwdXR0aW5nIG5vbi1wYWNrYWdpemVkIGRpc3RyaWJ1dGlvbnMgaW50byB0aGVpcgorICAgICAgICAjIG93biBkaXJlY3RvcnkgYW5kIGNyZWF0aW5nIGEgLnB0aCBmaWxlIGlmIGl0IG1ha2VzIHNlbnNlLgorICAgICAgICAjICdleHRyYV9wYXRoJyBjb21lcyBmcm9tIHRoZSBzZXR1cCBmaWxlOyAnaW5zdGFsbF9wYXRoX2ZpbGUnIGNhbgorICAgICAgICAjIGJlIHR1cm5lZCBvZmYgaWYgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gaW5zdGFsbCBhIC5wdGggZmlsZS4gIChCdXQKKyAgICAgICAgIyBiZXR0ZXIgdG8gaW5zdGFsbCBpdCB1c2VsZXNzbHkgdGhhbiB0byBndWVzcyB3cm9uZyBhbmQgbm90CisgICAgICAgICMgaW5zdGFsbCBpdCB3aGVuIGl0J3MgbmVjZXNzYXJ5IGFuZCB3b3VsZCBiZSB1c2VkISkgIEN1cnJlbnRseSwKKyAgICAgICAgIyAnaW5zdGFsbF9wYXRoX2ZpbGUnIGlzIGFsd2F5cyB0cnVlIHVubGVzcyBzb21lIG91dHNpZGVyIG1lZGRsZXMKKyAgICAgICAgIyB3aXRoIGl0LgorICAgICAgICBzZWxmLmV4dHJhX3BhdGggPSBOb25lCisgICAgICAgIHNlbGYuaW5zdGFsbF9wYXRoX2ZpbGUgPSAxCisKKyAgICAgICAgIyAnZm9yY2UnIGZvcmNlcyBpbnN0YWxsYXRpb24sIGV2ZW4gaWYgdGFyZ2V0IGZpbGVzIGFyZSBub3QKKyAgICAgICAgIyBvdXQtb2YtZGF0ZS4gICdza2lwX2J1aWxkJyBza2lwcyBydW5uaW5nIHRoZSAiYnVpbGQiIGNvbW1hbmQsCisgICAgICAgICMgaGFuZHkgaWYgeW91IGtub3cgaXQncyBub3QgbmVjZXNzYXJ5LiAgJ3dhcm5fZGlyJyAod2hpY2ggaXMgKm5vdCoKKyAgICAgICAgIyBhIHVzZXIgb3B0aW9uLCBpdCdzIGp1c3QgdGhlcmUgc28gdGhlIGJkaXN0XyogY29tbWFuZHMgY2FuIHR1cm4KKyAgICAgICAgIyBpdCBvZmYpIGRldGVybWluZXMgd2hldGhlciB3ZSB3YXJuIGFib3V0IGluc3RhbGxpbmcgdG8gYQorICAgICAgICAjIGRpcmVjdG9yeSBub3QgaW4gc3lzLnBhdGguCisgICAgICAgIHNlbGYuZm9yY2UgPSAwCisgICAgICAgIHNlbGYuc2tpcF9idWlsZCA9IDAKKyAgICAgICAgc2VsZi53YXJuX2RpciA9IDEKKworICAgICAgICAjIFRoZXNlIGFyZSBvbmx5IGhlcmUgYXMgYSBjb25kdWl0IGZyb20gdGhlICdidWlsZCcgY29tbWFuZCB0byB0aGUKKyAgICAgICAgIyAnaW5zdGFsbF8qJyBjb21tYW5kcyB0aGF0IGRvIHRoZSByZWFsIHdvcmsuICAoJ2J1aWxkX2Jhc2UnIGlzbid0CisgICAgICAgICMgYWN0dWFsbHkgdXNlZCBhbnl3aGVyZSwgYnV0IGl0IG1pZ2h0IGJlIHVzZWZ1bCBpbiBmdXR1cmUuKSAgVGhleQorICAgICAgICAjIGFyZSBub3QgdXNlciBvcHRpb25zLCBiZWNhdXNlIGlmIHRoZSB1c2VyIHRvbGQgdGhlIGluc3RhbGwKKyAgICAgICAgIyBjb21tYW5kIHdoZXJlIHRoZSBidWlsZCBkaXJlY3RvcnkgaXMsIHRoYXQgd291bGRuJ3QgYWZmZWN0IHRoZQorICAgICAgICAjIGJ1aWxkIGNvbW1hbmQuCisgICAgICAgIHNlbGYuYnVpbGRfYmFzZSA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZF9saWIgPSBOb25lCisKKyAgICAgICAgIyBOb3QgZGVmaW5lZCB5ZXQgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0CisgICAgICAgICMgZG9jdW1lbnRhdGlvbiB5ZXQuCisgICAgICAgICNzZWxmLmluc3RhbGxfbWFuID0gTm9uZQorICAgICAgICAjc2VsZi5pbnN0YWxsX2h0bWwgPSBOb25lCisgICAgICAgICNzZWxmLmluc3RhbGxfaW5mbyA9IE5vbmUKKworICAgICAgICBzZWxmLnJlY29yZCA9IE5vbmUKKworCisgICAgIyAtLSBPcHRpb24gZmluYWxpemluZyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIChUaGlzIGlzIHJhdGhlciBtb3JlIGludm9sdmVkIHRoYW4gZm9yIG1vc3QgY29tbWFuZHMsCisgICAgIyBiZWNhdXNlIHRoaXMgaXMgd2hlcmUgdGhlIHBvbGljeSBmb3IgaW5zdGFsbGluZyB0aGlyZC0KKyAgICAjIHBhcnR5IFB5dGhvbiBtb2R1bGVzIG9uIHZhcmlvdXMgcGxhdGZvcm1zIGdpdmVuIGEgd2lkZQorICAgICMgYXJyYXkgb2YgdXNlciBpbnB1dCBpcyBkZWNpZGVkLiAgWWVzLCBpdCdzIHF1aXRlIGNvbXBsZXghKQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMgKHNlbGYpOgorCisgICAgICAgICMgVGhpcyBtZXRob2QgKGFuZCBpdHMgcGxpYW50IHNsYXZlcywgbGlrZSAnZmluYWxpemVfdW5peCgpJywKKyAgICAgICAgIyAnZmluYWxpemVfb3RoZXIoKScsIGFuZCAnc2VsZWN0X3NjaGVtZSgpJykgaXMgd2hlcmUgdGhlIGRlZmF1bHQKKyAgICAgICAgIyBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgZm9yIG1vZHVsZXMsIGV4dGVuc2lvbiBtb2R1bGVzLCBhbmQKKyAgICAgICAgIyBhbnl0aGluZyBlbHNlIHdlIGNhcmUgdG8gaW5zdGFsbCBmcm9tIGEgUHl0aG9uIG1vZHVsZQorICAgICAgICAjIGRpc3RyaWJ1dGlvbi4gIFRodXMsIHRoaXMgY29kZSBtYWtlcyBhIHByZXR0eSBpbXBvcnRhbnQgcG9saWN5CisgICAgICAgICMgc3RhdGVtZW50IGFib3V0IGhvdyB0aGlyZC1wYXJ0eSBzdHVmZiBpcyBhZGRlZCB0byBhIFB5dGhvbgorICAgICAgICAjIGluc3RhbGxhdGlvbiEgIE5vdGUgdGhhdCB0aGUgYWN0dWFsIHdvcmsgb2YgaW5zdGFsbGF0aW9uIGlzIGRvbmUKKyAgICAgICAgIyBieSB0aGUgcmVsYXRpdmVseSBzaW1wbGUgJ2luc3RhbGxfKicgY29tbWFuZHM7IHRoZXkganVzdCB0YWtlCisgICAgICAgICMgdGhlaXIgb3JkZXJzIGZyb20gdGhlIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgb3B0aW9ucyBkZXRlcm1pbmVkCisgICAgICAgICMgaGVyZS4KKworICAgICAgICAjIENoZWNrIGZvciBlcnJvcnMvaW5jb25zaXN0ZW5jaWVzIGluIHRoZSBvcHRpb25zOyBmaXJzdCwgc3R1ZmYKKyAgICAgICAgIyB0aGF0J3Mgd3Jvbmcgb24gYW55IHBsYXRmb3JtLgorCisgICAgICAgIGlmICgoc2VsZi5wcmVmaXggb3Igc2VsZi5leGVjX3ByZWZpeCBvciBzZWxmLmhvbWUpIGFuZAorICAgICAgICAgICAgKHNlbGYuaW5zdGFsbF9iYXNlIG9yIHNlbGYuaW5zdGFsbF9wbGF0YmFzZSkpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICgibXVzdCBzdXBwbHkgZWl0aGVyIHByZWZpeC9leGVjLXByZWZpeC9ob21lIG9yICIgKworICAgICAgICAgICAgICAgICAgICJpbnN0YWxsLWJhc2UvaW5zdGFsbC1wbGF0YmFzZSAtLSBub3QgYm90aCIpCisKKyAgICAgICAgaWYgc2VsZi5ob21lIGFuZCAoc2VsZi5wcmVmaXggb3Igc2VsZi5leGVjX3ByZWZpeCk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgICAgICAgICAgICAgICAgIm11c3Qgc3VwcGx5IGVpdGhlciBob21lIG9yIHByZWZpeC9leGVjLXByZWZpeCAtLSBub3QgYm90aCIKKworICAgICAgICBpZiBzZWxmLnVzZXIgYW5kIChzZWxmLnByZWZpeCBvciBzZWxmLmV4ZWNfcHJlZml4IG9yIHNlbGYuaG9tZSBvcgorICAgICAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9iYXNlIG9yIHNlbGYuaW5zdGFsbF9wbGF0YmFzZSk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiY2FuJ3QgY29tYmluZSB1c2VyIHdpdGggcHJlZml4LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhlY19wcmVmaXgvaG9tZSwgb3IgaW5zdGFsbF8ocGxhdCliYXNlIikKKworICAgICAgICAjIE5leHQsIHN0dWZmIHRoYXQncyB3cm9uZyAob3IgZHViaW91cykgb25seSBvbiBjZXJ0YWluIHBsYXRmb3Jtcy4KKyAgICAgICAgaWYgb3MubmFtZSAhPSAicG9zaXgiOgorICAgICAgICAgICAgaWYgc2VsZi5leGVjX3ByZWZpeDoKKyAgICAgICAgICAgICAgICBzZWxmLndhcm4oImV4ZWMtcHJlZml4IG9wdGlvbiBpZ25vcmVkIG9uIHRoaXMgcGxhdGZvcm0iKQorICAgICAgICAgICAgICAgIHNlbGYuZXhlY19wcmVmaXggPSBOb25lCisKKyAgICAgICAgIyBOb3cgdGhlIGludGVyZXN0aW5nIGxvZ2ljIC0tIHNvIGludGVyZXN0aW5nIHRoYXQgd2UgZmFybSBpdCBvdXQKKyAgICAgICAgIyB0byBvdGhlciBtZXRob2RzLiAgVGhlIGdvYWwgb2YgdGhlc2UgbWV0aG9kcyBpcyB0byBzZXQgdGhlIGZpbmFsCisgICAgICAgICMgdmFsdWVzIGZvciB0aGUgaW5zdGFsbF97bGliLHNjcmlwdHMsZGF0YSwuLi59ICBvcHRpb25zLCB1c2luZyBhcworICAgICAgICAjIGlucHV0IGEgaGVhZHkgYnJldyBvZiBwcmVmaXgsIGV4ZWNfcHJlZml4LCBob21lLCBpbnN0YWxsX2Jhc2UsCisgICAgICAgICMgaW5zdGFsbF9wbGF0YmFzZSwgdXNlci1zdXBwbGllZCB2ZXJzaW9ucyBvZgorICAgICAgICAjIGluc3RhbGxfe3B1cmVsaWIscGxhdGxpYixsaWIsc2NyaXB0cyxkYXRhLC4uLn0sIGFuZCB0aGUKKyAgICAgICAgIyBJTlNUQUxMX1NDSEVNRSBkaWN0aW9uYXJ5IGFib3ZlLiAgUGhldyEKKworICAgICAgICBzZWxmLmR1bXBfZGlycygicHJlLWZpbmFsaXplX3t1bml4LG90aGVyfSIpCisKKyAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAgICAgc2VsZi5maW5hbGl6ZV91bml4KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmluYWxpemVfb3RoZXIoKQorCisgICAgICAgIHNlbGYuZHVtcF9kaXJzKCJwb3N0LWZpbmFsaXplX3t1bml4LG90aGVyfSgpIikKKworICAgICAgICAjIEV4cGFuZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcywgdGlsZGUsIGV0Yy4gaW4gc2VsZi5pbnN0YWxsX2Jhc2UKKyAgICAgICAgIyBhbmQgc2VsZi5pbnN0YWxsX3BsYXRiYXNlIC0tIHRoYXQgd2F5LCB3ZSBjYW4gdXNlICRiYXNlIG9yCisgICAgICAgICMgJHBsYXRiYXNlIGluIHRoZSBvdGhlciBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgYW5kIG5vdCB3b3JyeQorICAgICAgICAjIGFib3V0IG5lZWRpbmcgcmVjdXJzaXZlIHZhcmlhYmxlIGV4cGFuc2lvbiAoc2h1ZGRlcikuCisKKyAgICAgICAgcHlfdmVyc2lvbiA9IChzdHJpbmcuc3BsaXQoc3lzLnZlcnNpb24pKVswXQorICAgICAgICAocHJlZml4LCBleGVjX3ByZWZpeCkgPSBnZXRfY29uZmlnX3ZhcnMoJ3ByZWZpeCcsICdleGVjX3ByZWZpeCcpCisgICAgICAgIHNlbGYuY29uZmlnX3ZhcnMgPSB7J2Rpc3RfbmFtZSc6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3RfdmVyc2lvbic6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpc3RfZnVsbG5hbWUnOiBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbic6IHB5X3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5X3ZlcnNpb25fc2hvcnQnOiBweV92ZXJzaW9uWzA6M10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5X3ZlcnNpb25fbm9kb3QnOiBweV92ZXJzaW9uWzBdICsgcHlfdmVyc2lvblsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzX3ByZWZpeCc6IHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlZml4JzogcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXNfZXhlY19wcmVmaXgnOiBleGVjX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhlY19wcmVmaXgnOiBleGVjX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcmJhc2UnOiBzZWxmLmluc3RhbGxfdXNlcmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJzaXRlJzogc2VsZi5pbnN0YWxsX3VzZXJzaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICBzZWxmLmV4cGFuZF9iYXNlZGlycygpCisKKyAgICAgICAgc2VsZi5kdW1wX2RpcnMoInBvc3QtZXhwYW5kX2Jhc2VkaXJzKCkiKQorCisgICAgICAgICMgTVNZUyAocHJvYmFibHkpIHdpbGwgaGF2ZSB0cmFuc2Zvcm1lZCAtLXJvb3Q9LyB0byB0aGUKKyAgICAgICAgIyB3aW5kb3dzIHBhdGggd2hlcmUgdGhlIG1zeXMgaXMgaW5zdGFsbGVkLCBzbyB3ZSBjaGVjayBpZiByb290IGJlZ2lucworICAgICAgICAjIHdpdGggbXN5c3Jvb3QgYW5kIGlmIGl0IGRvZXMgdGhlbiByZW1vdmUgdGhpcyBwYXJ0LgorICAgICAgICBpZiBzZWxmLnJvb3QgaXMgbm90IE5vbmUgYW5kIGlzX21zeXNfbWluZ3coKToKKyAgICAgICAgICAgIG1zeXNyb290ID0gbXN5c19yb290KCkKKyAgICAgICAgICAgIGlmIG1zeXNyb290ICE9IE5vbmUgYW5kIHNlbGYucm9vdC5maW5kKG1zeXNyb290KT09MDoKKyAgICAgICAgICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLnJvb3QucmVwbGFjZShtc3lzcm9vdCwgIi8iKQorCisgICAgICAgICMgTm93IGRlZmluZSBjb25maWcgdmFycyBmb3IgdGhlIGJhc2UgZGlyZWN0b3JpZXMgc28gd2UgY2FuIGV4cGFuZAorICAgICAgICAjIGV2ZXJ5dGhpbmcgZWxzZS4KKyAgICAgICAgc2VsZi5jb25maWdfdmFyc1snYmFzZSddID0gc2VsZi5pbnN0YWxsX2Jhc2UKKyAgICAgICAgc2VsZi5jb25maWdfdmFyc1sncGxhdGJhc2UnXSA9IHNlbGYuaW5zdGFsbF9wbGF0YmFzZQorCisgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAorICAgICAgICAgICAgcHJpbnQgImNvbmZpZyB2YXJzOiIKKyAgICAgICAgICAgIHBwcmludChzZWxmLmNvbmZpZ192YXJzKQorCisgICAgICAgICMgRXhwYW5kICJ+IiBhbmQgY29uZmlndXJhdGlvbiB2YXJpYWJsZXMgaW4gdGhlIGluc3RhbGxhdGlvbgorICAgICAgICAjIGRpcmVjdG9yaWVzLgorICAgICAgICBzZWxmLmV4cGFuZF9kaXJzKCkKKworICAgICAgICBzZWxmLmR1bXBfZGlycygicG9zdC1leHBhbmRfZGlycygpIikKKworICAgICAgICAjIENyZWF0ZSBkaXJlY3RvcmllcyBpbiB0aGUgaG9tZSBkaXI6CisgICAgICAgIGlmIHNlbGYudXNlcjoKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlX2hvbWVfcGF0aCgpCisKKyAgICAgICAgIyBQaWNrIHRoZSBhY3R1YWwgZGlyZWN0b3J5IHRvIGluc3RhbGwgYWxsIG1vZHVsZXMgdG86IGVpdGhlcgorICAgICAgICAjIGluc3RhbGxfcHVyZWxpYiBvciBpbnN0YWxsX3BsYXRsaWIsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoaXMKKyAgICAgICAgIyBtb2R1bGUgZGlzdHJpYnV0aW9uIGlzIHB1cmUgb3Igbm90LiAgT2YgY291cnNlLCBpZiB0aGUgdXNlcgorICAgICAgICAjIGFscmVhZHkgc3BlY2lmaWVkIGluc3RhbGxfbGliLCB1c2UgdGhlaXIgc2VsZWN0aW9uLgorICAgICAgICBpZiBzZWxmLmluc3RhbGxfbGliIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5leHRfbW9kdWxlczogIyBoYXMgZXh0ZW5zaW9uczogbm9uLXB1cmUKKyAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfbGliID0gc2VsZi5pbnN0YWxsX3BsYXRsaWIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2xpYiA9IHNlbGYuaW5zdGFsbF9wdXJlbGliCisKKworICAgICAgICAjIENvbnZlcnQgZGlyZWN0b3JpZXMgZnJvbSBVbml4IC8tc2VwYXJhdGVkIHN5bnRheCB0byB0aGUgbG9jYWwKKyAgICAgICAgIyBjb252ZW50aW9uLgorICAgICAgICBzZWxmLmNvbnZlcnRfcGF0aHMoJ2xpYicsICdwdXJlbGliJywgJ3BsYXRsaWInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdHMnLCAnZGF0YScsICdoZWFkZXJzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyYmFzZScsICd1c2Vyc2l0ZScpCisKKyAgICAgICAgIyBXZWxsLCB3ZSdyZSBub3QgYWN0dWFsbHkgZnVsbHkgY29tcGxldGVseSBmaW5hbGl6ZWQgeWV0OiB3ZSBzdGlsbAorICAgICAgICAjIGhhdmUgdG8gZGVhbCB3aXRoICdleHRyYV9wYXRoJywgd2hpY2ggaXMgdGhlIGhhY2sgZm9yIGFsbG93aW5nCisgICAgICAgICMgbm9uLXBhY2thZ2l6ZWQgbW9kdWxlIGRpc3RyaWJ1dGlvbnMgKGhlbGxvLCBOdW1lcmljYWwgUHl0aG9uISkgdG8KKyAgICAgICAgIyBnZXQgdGhlaXIgb3duIGRpcmVjdG9yaWVzLgorICAgICAgICBzZWxmLmhhbmRsZV9leHRyYV9wYXRoKCkKKyAgICAgICAgc2VsZi5pbnN0YWxsX2xpYmJhc2UgPSBzZWxmLmluc3RhbGxfbGliICMgbmVlZGVkIGZvciAucHRoIGZpbGUKKyAgICAgICAgc2VsZi5pbnN0YWxsX2xpYiA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfbGliLCBzZWxmLmV4dHJhX2RpcnMpCisKKyAgICAgICAgIyBJZiBhIG5ldyByb290IGRpcmVjdG9yeSB3YXMgc3VwcGxpZWQsIG1ha2UgYWxsIHRoZSBpbnN0YWxsYXRpb24KKyAgICAgICAgIyBkaXJzIHJlbGF0aXZlIHRvIGl0LgorICAgICAgICBpZiBzZWxmLnJvb3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNoYW5nZV9yb290cygnbGliYmFzZScsICdsaWInLCAncHVyZWxpYicsICdwbGF0bGliJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHRzJywgJ2RhdGEnLCAnaGVhZGVycycpCisKKyAgICAgICAgc2VsZi5kdW1wX2RpcnMoImFmdGVyIHByZXBlbmRpbmcgcm9vdCIpCisKKyAgICAgICAgIyBGaW5kIG91dCB0aGUgYnVpbGQgZGlyZWN0b3JpZXMsIGllLiB3aGVyZSB0byBpbnN0YWxsIGZyb20uCisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdidWlsZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYnVpbGRfYmFzZScsICdidWlsZF9iYXNlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYnVpbGRfbGliJywgJ2J1aWxkX2xpYicpKQorCisgICAgICAgICMgUHVudCBvbiBkb2MgZGlyZWN0b3JpZXMgZm9yIG5vdyAtLSBhZnRlciBhbGwsIHdlJ3JlIHB1bnRpbmcgb24KKyAgICAgICAgIyBkb2N1bWVudGF0aW9uIGNvbXBsZXRlbHkhCisKKyAgICAjIGZpbmFsaXplX29wdGlvbnMgKCkKKworCisgICAgZGVmIGR1bXBfZGlycyAoc2VsZiwgbXNnKToKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5mYW5jeV9nZXRvcHQgaW1wb3J0IGxvbmdvcHRfeGxhdGUKKyAgICAgICAgICAgIHByaW50IG1zZyArICI6IgorICAgICAgICAgICAgZm9yIG9wdCBpbiBzZWxmLnVzZXJfb3B0aW9uczoKKyAgICAgICAgICAgICAgICBvcHRfbmFtZSA9IG9wdFswXQorICAgICAgICAgICAgICAgIGlmIG9wdF9uYW1lWy0xXSA9PSAiPSI6CisgICAgICAgICAgICAgICAgICAgIG9wdF9uYW1lID0gb3B0X25hbWVbMDotMV0KKyAgICAgICAgICAgICAgICBpZiBvcHRfbmFtZSBpbiBzZWxmLm5lZ2F0aXZlX29wdDoKKyAgICAgICAgICAgICAgICAgICAgb3B0X25hbWUgPSBzdHJpbmcudHJhbnNsYXRlKHNlbGYubmVnYXRpdmVfb3B0W29wdF9uYW1lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdvcHRfeGxhdGUpCisgICAgICAgICAgICAgICAgICAgIHZhbCA9IG5vdCBnZXRhdHRyKHNlbGYsIG9wdF9uYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG9wdF9uYW1lID0gc3RyaW5nLnRyYW5zbGF0ZShvcHRfbmFtZSwgbG9uZ29wdF94bGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gZ2V0YXR0cihzZWxmLCBvcHRfbmFtZSkKKyAgICAgICAgICAgICAgICBwcmludCAiICAlczogJXMiICUgKG9wdF9uYW1lLCB2YWwpCisKKworICAgIGRlZiBmaW5hbGl6ZV91bml4IChzZWxmKToKKworICAgICAgICBpZiBzZWxmLmluc3RhbGxfYmFzZSBpcyBub3QgTm9uZSBvciBzZWxmLmluc3RhbGxfcGxhdGJhc2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiAoKHNlbGYuaW5zdGFsbF9saWIgaXMgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3B1cmVsaWIgaXMgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3BsYXRsaWIgaXMgTm9uZSkgb3IKKyAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfaGVhZGVycyBpcyBOb25lIG9yCisgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdHMgaXMgTm9uZSBvcgorICAgICAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9kYXRhIGlzIE5vbmUpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKCJpbnN0YWxsLWJhc2Ugb3IgaW5zdGFsbC1wbGF0YmFzZSBzdXBwbGllZCwgYnV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbGF0aW9uIHNjaGVtZSBpcyBpbmNvbXBsZXRlIikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHNlbGYudXNlcjoKKyAgICAgICAgICAgIGlmIHNlbGYuaW5zdGFsbF91c2VyYmFzZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJVc2VyIGJhc2UgZGlyZWN0b3J5IGlzIG5vdCBzcGVjaWZpZWQiKQorICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2Jhc2UgPSBzZWxmLmluc3RhbGxfcGxhdGJhc2UgPSBzZWxmLmluc3RhbGxfdXNlcmJhc2UKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0X3NjaGVtZSgidW5peF91c2VyIikKKyAgICAgICAgZWxpZiBzZWxmLmhvbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmluc3RhbGxfYmFzZSA9IHNlbGYuaW5zdGFsbF9wbGF0YmFzZSA9IHNlbGYuaG9tZQorICAgICAgICAgICAgc2VsZi5zZWxlY3Rfc2NoZW1lKCJ1bml4X2hvbWUiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5wcmVmaXggaXMgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmV4ZWNfcHJlZml4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBub3Qgc3VwcGx5IGV4ZWMtcHJlZml4IHdpdGhvdXQgcHJlZml4IgorCisgICAgICAgICAgICAgICAgc2VsZi5wcmVmaXggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5wcmVmaXgpCisgICAgICAgICAgICAgICAgc2VsZi5leGVjX3ByZWZpeCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWNfcHJlZml4KQorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhlY19wcmVmaXggaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5leGVjX3ByZWZpeCA9IHNlbGYucHJlZml4CisKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9iYXNlID0gc2VsZi5wcmVmaXgKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9wbGF0YmFzZSA9IHNlbGYuZXhlY19wcmVmaXgKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0X3NjaGVtZSgidW5peF9wcmVmaXgiKQorCisgICAgIyBmaW5hbGl6ZV91bml4ICgpCisKKworICAgIGRlZiBmaW5hbGl6ZV9vdGhlciAoc2VsZik6ICAgICAgICAgICMgV2luZG93cyBhbmQgTWFjIE9TIGZvciBub3cKKworICAgICAgICBpZiBzZWxmLnVzZXI6CisgICAgICAgICAgICBpZiBzZWxmLmluc3RhbGxfdXNlcmJhc2UgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKAorICAgICAgICAgICAgICAgICAgICAiVXNlciBiYXNlIGRpcmVjdG9yeSBpcyBub3Qgc3BlY2lmaWVkIikKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9iYXNlID0gc2VsZi5pbnN0YWxsX3BsYXRiYXNlID0gc2VsZi5pbnN0YWxsX3VzZXJiYXNlCisgICAgICAgICAgICBzZWxmLnNlbGVjdF9zY2hlbWUob3MubmFtZSArICJfdXNlciIpCisgICAgICAgIGVsaWYgc2VsZi5ob21lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2Jhc2UgPSBzZWxmLmluc3RhbGxfcGxhdGJhc2UgPSBzZWxmLmhvbWUKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0X3NjaGVtZSgidW5peF9ob21lIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYucHJlZml4IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5wcmVmaXggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5wcmVmaXgpCisKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9iYXNlID0gc2VsZi5pbnN0YWxsX3BsYXRiYXNlID0gc2VsZi5wcmVmaXgKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdF9zY2hlbWUob3MubmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgIkkgZG9uJ3Qga25vdyBob3cgdG8gaW5zdGFsbCBzdHVmZiBvbiAnJXMnIiAlIG9zLm5hbWUKKworICAgICMgZmluYWxpemVfb3RoZXIgKCkKKworCisgICAgZGVmIHNlbGVjdF9zY2hlbWUgKHNlbGYsIG5hbWUpOgorICAgICAgICAjIGl0J3MgdGhlIGNhbGxlcidzIHByb2JsZW0gaWYgdGhleSBzdXBwbHkgYSBiYWQgbmFtZSEKKyAgICAgICAgc2NoZW1lID0gSU5TVEFMTF9TQ0hFTUVTW25hbWVdCisgICAgICAgIGZvciBrZXkgaW4gU0NIRU1FX0tFWVM6CisgICAgICAgICAgICBhdHRybmFtZSA9ICdpbnN0YWxsXycgKyBrZXkKKyAgICAgICAgICAgIGlmIGdldGF0dHIoc2VsZiwgYXR0cm5hbWUpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRybmFtZSwgc2NoZW1lW2tleV0pCisKKworICAgIGRlZiBfZXhwYW5kX2F0dHJzIChzZWxmLCBhdHRycyk6CisgICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgorICAgICAgICAgICAgdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKQorICAgICAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JyBvciBvcy5uYW1lID09ICdudCc6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IG9zLnBhdGguZXhwYW5kdXNlcih2YWwpCisgICAgICAgICAgICAgICAgdmFsID0gc3Vic3RfdmFycyh2YWwsIHNlbGYuY29uZmlnX3ZhcnMpCisgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWwpCisKKworICAgIGRlZiBleHBhbmRfYmFzZWRpcnMgKHNlbGYpOgorICAgICAgICBzZWxmLl9leHBhbmRfYXR0cnMoWydpbnN0YWxsX2Jhc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnN0YWxsX3BsYXRiYXNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncm9vdCddKQorCisgICAgZGVmIGV4cGFuZF9kaXJzIChzZWxmKToKKyAgICAgICAgc2VsZi5fZXhwYW5kX2F0dHJzKFsnaW5zdGFsbF9wdXJlbGliJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5zdGFsbF9wbGF0bGliJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5zdGFsbF9saWInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnN0YWxsX2hlYWRlcnMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnN0YWxsX3NjcmlwdHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnN0YWxsX2RhdGEnLF0pCisKKworICAgIGRlZiBjb252ZXJ0X3BhdGhzIChzZWxmLCAqbmFtZXMpOgorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGF0dHIgPSAiaW5zdGFsbF8iICsgbmFtZQorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCBjb252ZXJ0X3BhdGgoZ2V0YXR0cihzZWxmLCBhdHRyKSkpCisKKworICAgIGRlZiBoYW5kbGVfZXh0cmFfcGF0aCAoc2VsZik6CisKKyAgICAgICAgaWYgc2VsZi5leHRyYV9wYXRoIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmV4dHJhX3BhdGggPSBzZWxmLmRpc3RyaWJ1dGlvbi5leHRyYV9wYXRoCisKKyAgICAgICAgaWYgc2VsZi5leHRyYV9wYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgdHlwZShzZWxmLmV4dHJhX3BhdGgpIGlzIFN0cmluZ1R5cGU6CisgICAgICAgICAgICAgICAgc2VsZi5leHRyYV9wYXRoID0gc3RyaW5nLnNwbGl0KHNlbGYuZXh0cmFfcGF0aCwgJywnKQorCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5leHRyYV9wYXRoKSA9PSAxOgorICAgICAgICAgICAgICAgIHBhdGhfZmlsZSA9IGV4dHJhX2RpcnMgPSBzZWxmLmV4dHJhX3BhdGhbMF0KKyAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYuZXh0cmFfcGF0aCkgPT0gMjoKKyAgICAgICAgICAgICAgICAocGF0aF9maWxlLCBleHRyYV9kaXJzKSA9IHNlbGYuZXh0cmFfcGF0aAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICgiJ2V4dHJhX3BhdGgnIG9wdGlvbiBtdXN0IGJlIGEgbGlzdCwgdHVwbGUsIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAiY29tbWEtc2VwYXJhdGVkIHN0cmluZyB3aXRoIDEgb3IgMiBlbGVtZW50cyIpCisKKyAgICAgICAgICAgICMgY29udmVydCB0byBsb2NhbCBmb3JtIGluIGNhc2UgVW5peCBub3RhdGlvbiB1c2VkIChhcyBpdAorICAgICAgICAgICAgIyBzaG91bGQgYmUgaW4gc2V0dXAgc2NyaXB0cykKKyAgICAgICAgICAgIGV4dHJhX2RpcnMgPSBjb252ZXJ0X3BhdGgoZXh0cmFfZGlycykKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aF9maWxlID0gTm9uZQorICAgICAgICAgICAgZXh0cmFfZGlycyA9ICcnCisKKyAgICAgICAgIyBYWFggc2hvdWxkIHdlIHdhcm4gaWYgcGF0aF9maWxlIGFuZCBub3QgZXh0cmFfZGlycz8gKGluIHdoaWNoCisgICAgICAgICMgY2FzZSB0aGUgcGF0aCBmaWxlIHdvdWxkIGJlIGhhcm1sZXNzIGJ1dCBwb2ludGxlc3MpCisgICAgICAgIHNlbGYucGF0aF9maWxlID0gcGF0aF9maWxlCisgICAgICAgIHNlbGYuZXh0cmFfZGlycyA9IGV4dHJhX2RpcnMKKworICAgICMgaGFuZGxlX2V4dHJhX3BhdGggKCkKKworCisgICAgZGVmIGNoYW5nZV9yb290cyAoc2VsZiwgKm5hbWVzKToKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBhdHRyID0gImluc3RhbGxfIiArIG5hbWUKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgY2hhbmdlX3Jvb3Qoc2VsZi5yb290LCBnZXRhdHRyKHNlbGYsIGF0dHIpKSkKKworICAgIGRlZiBjcmVhdGVfaG9tZV9wYXRoKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgZGlyZWN0b3JpZXMgdW5kZXIgfgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYudXNlcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBob21lID0gY29udmVydF9wYXRoKG9zLnBhdGguZXhwYW5kdXNlcigifiIpKQorICAgICAgICBmb3IgbmFtZSwgcGF0aCBpbiBzZWxmLmNvbmZpZ192YXJzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKGhvbWUpIGFuZCBub3Qgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJvcy5tYWtlZGlycygnJXMnLCAwNzAwKSIgJSBwYXRoKQorICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHBhdGgsIDA3MDApCisKKyAgICAjIC0tIENvbW1hbmQgZXhlY3V0aW9uIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHJ1biAoc2VsZik6CisKKyAgICAgICAgIyBPYnZpb3VzbHkgaGF2ZSB0byBidWlsZCBiZWZvcmUgd2UgY2FuIGluc3RhbGwKKyAgICAgICAgaWYgbm90IHNlbGYuc2tpcF9idWlsZDoKKyAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkJykKKyAgICAgICAgICAgICMgSWYgd2UgYnVpbHQgZm9yIGFueSBvdGhlciBwbGF0Zm9ybSwgd2UgY2FuJ3QgaW5zdGFsbC4KKyAgICAgICAgICAgIGJ1aWxkX3BsYXQgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9vYmooJ2J1aWxkJykucGxhdF9uYW1lCisgICAgICAgICAgICAjIGNoZWNrIHdhcm5fZGlyIC0gaXQgaXMgYSBjbHVlIHRoYXQgdGhlICdpbnN0YWxsJyBpcyBoYXBwZW5pbmcKKyAgICAgICAgICAgICMgaW50ZXJuYWxseSwgYW5kIG5vdCB0byBzeXMucGF0aCwgc28gd2UgZG9uJ3QgY2hlY2sgdGhlIHBsYXRmb3JtCisgICAgICAgICAgICAjIG1hdGNoZXMgd2hhdCB3ZSBhcmUgcnVubmluZy4KKyAgICAgICAgICAgIGlmIHNlbGYud2Fybl9kaXIgYW5kIGJ1aWxkX3BsYXQgIT0gZ2V0X3BsYXRmb3JtKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigiQ2FuJ3QgaW5zdGFsbCB3aGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9zcy1jb21waWxpbmciKQorCisgICAgICAgICMgUnVuIGFsbCBzdWItY29tbWFuZHMgKGF0IGxlYXN0IHRob3NlIHRoYXQgbmVlZCB0byBiZSBydW4pCisgICAgICAgIGZvciBjbWRfbmFtZSBpbiBzZWxmLmdldF9zdWJfY29tbWFuZHMoKToKKyAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kX25hbWUpCisKKyAgICAgICAgaWYgc2VsZi5wYXRoX2ZpbGU6CisgICAgICAgICAgICBzZWxmLmNyZWF0ZV9wYXRoX2ZpbGUoKQorCisgICAgICAgICMgd3JpdGUgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMsIGlmIHJlcXVlc3RlZC4KKyAgICAgICAgaWYgc2VsZi5yZWNvcmQ6CisgICAgICAgICAgICBvdXRwdXRzID0gc2VsZi5nZXRfb3V0cHV0cygpCisgICAgICAgICAgICBpZiBzZWxmLnJvb3Q6ICAgICAgICAgICAgICAgIyBzdHJpcCBhbnkgcGFja2FnZSBwcmVmaXgKKyAgICAgICAgICAgICAgICByb290X2xlbiA9IGxlbihzZWxmLnJvb3QpCisgICAgICAgICAgICAgICAgZm9yIGNvdW50ZXIgaW4geHJhbmdlKGxlbihvdXRwdXRzKSk6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHNbY291bnRlcl0gPSBvdXRwdXRzW2NvdW50ZXJdW3Jvb3RfbGVuOl0KKyAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSh3cml0ZV9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnJlY29yZCwgb3V0cHV0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRpbmcgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMgdG8gJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkKQorCisgICAgICAgIHN5c19wYXRoID0gbWFwKG9zLnBhdGgubm9ybXBhdGgsIHN5cy5wYXRoKQorICAgICAgICBzeXNfcGF0aCA9IG1hcChvcy5wYXRoLm5vcm1jYXNlLCBzeXNfcGF0aCkKKyAgICAgICAgaW5zdGFsbF9saWIgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgubm9ybXBhdGgoc2VsZi5pbnN0YWxsX2xpYikpCisgICAgICAgIGlmIChzZWxmLndhcm5fZGlyIGFuZAorICAgICAgICAgICAgbm90IChzZWxmLnBhdGhfZmlsZSBhbmQgc2VsZi5pbnN0YWxsX3BhdGhfZmlsZSkgYW5kCisgICAgICAgICAgICBpbnN0YWxsX2xpYiBub3QgaW4gc3lzX3BhdGgpOgorICAgICAgICAgICAgbG9nLmRlYnVnKCgibW9kdWxlcyBpbnN0YWxsZWQgdG8gJyVzJywgd2hpY2ggaXMgbm90IGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbidzIG1vZHVsZSBzZWFyY2ggcGF0aCAoc3lzLnBhdGgpIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgInlvdSdsbCBoYXZlIHRvIGNoYW5nZSB0aGUgc2VhcmNoIHBhdGggeW91cnNlbGYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2xpYikKKworICAgICMgcnVuICgpCisKKyAgICBkZWYgY3JlYXRlX3BhdGhfZmlsZSAoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9saWJiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGhfZmlsZSArICIucHRoIikKKyAgICAgICAgaWYgc2VsZi5pbnN0YWxsX3BhdGhfZmlsZToKKyAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSh3cml0ZV9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlbmFtZSwgW3NlbGYuZXh0cmFfZGlyc10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjcmVhdGluZyAlcyIgJSBmaWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud2FybigicGF0aCBmaWxlICclcycgbm90IGNyZWF0ZWQiICUgZmlsZW5hbWUpCisKKworICAgICMgLS0gUmVwb3J0aW5nIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZ2V0X291dHB1dHMgKHNlbGYpOgorICAgICAgICAjIEFzc2VtYmxlIHRoZSBvdXRwdXRzIG9mIGFsbCB0aGUgc3ViLWNvbW1hbmRzLgorICAgICAgICBvdXRwdXRzID0gW10KKyAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgorICAgICAgICAgICAgY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoY21kX25hbWUpCisgICAgICAgICAgICAjIEFkZCB0aGUgY29udGVudHMgb2YgY21kLmdldF9vdXRwdXRzKCksIGVuc3VyaW5nCisgICAgICAgICAgICAjIHRoYXQgb3V0cHV0cyBkb2Vzbid0IGNvbnRhaW4gZHVwbGljYXRlIGVudHJpZXMKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBjbWQuZ2V0X291dHB1dHMoKToKKyAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZSBub3QgaW4gb3V0cHV0czoKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQoZmlsZW5hbWUpCisKKyAgICAgICAgaWYgc2VsZi5wYXRoX2ZpbGUgYW5kIHNlbGYuaW5zdGFsbF9wYXRoX2ZpbGU6CisgICAgICAgICAgICBvdXRwdXRzLmFwcGVuZChvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2xpYmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoX2ZpbGUgKyAiLnB0aCIpKQorCisgICAgICAgIHJldHVybiBvdXRwdXRzCisKKyAgICBkZWYgZ2V0X2lucHV0cyAoc2VsZik6CisgICAgICAgICMgWFhYIGdlZSwgdGhpcyBsb29rcyBmYW1pbGlhciA7LSgKKyAgICAgICAgaW5wdXRzID0gW10KKyAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgorICAgICAgICAgICAgY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoY21kX25hbWUpCisgICAgICAgICAgICBpbnB1dHMuZXh0ZW5kKGNtZC5nZXRfaW5wdXRzKCkpCisKKyAgICAgICAgcmV0dXJuIGlucHV0cworCisKKyAgICAjIC0tIFByZWRpY2F0ZXMgZm9yIHN1Yi1jb21tYW5kIGxpc3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGhhc19saWIgKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBkaXN0cmlidXRpb24gaGFzIGFueSBQeXRob24KKyAgICAgICAgbW9kdWxlcyB0byBpbnN0YWxsLiIiIgorICAgICAgICByZXR1cm4gKHNlbGYuZGlzdHJpYnV0aW9uLmhhc19wdXJlX21vZHVsZXMoKSBvcgorICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpKQorCisgICAgZGVmIGhhc19oZWFkZXJzIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19oZWFkZXJzKCkKKworICAgIGRlZiBoYXNfc2NyaXB0cyAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfc2NyaXB0cygpCisKKyAgICBkZWYgaGFzX2RhdGEgKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kaXN0cmlidXRpb24uaGFzX2RhdGFfZmlsZXMoKQorCisKKyAgICAjICdzdWJfY29tbWFuZHMnOiBhIGxpc3Qgb2YgY29tbWFuZHMgdGhpcyBjb21tYW5kIG1pZ2h0IGhhdmUgdG8gcnVuIHRvCisgICAgIyBnZXQgaXRzIHdvcmsgZG9uZS4gIFNlZSBjbWQucHkgZm9yIG1vcmUgaW5mby4KKyAgICBzdWJfY29tbWFuZHMgPSBbKCdpbnN0YWxsX2xpYicsICAgICBoYXNfbGliKSwKKyAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX2hlYWRlcnMnLCBoYXNfaGVhZGVycyksCisgICAgICAgICAgICAgICAgICAgICgnaW5zdGFsbF9zY3JpcHRzJywgaGFzX3NjcmlwdHMpLAorICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfZGF0YScsICAgIGhhc19kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX2VnZ19pbmZvJywgbGFtYmRhIHNlbGY6VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgXQorCisjIGNsYXNzIGluc3RhbGwKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NTdjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1NTdjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9kYXRhLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2RhdGEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI0MDc5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9kYXRhLnB5CkBAIC0wLDAgKzEsODEgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfZGF0YQorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ2luc3RhbGxfZGF0YScgY29tbWFuZCwgZm9yIGluc3RhbGxpbmcKK3BsYXRmb3JtLWluZGVwZW5kZW50IGRhdGEgZmlsZXMuIiIiCisKKyMgY29udHJpYnV0ZWQgYnkgQmFzdGlhbiBLbGVpbmVpZGFtCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNoYW5nZV9yb290LCBjb252ZXJ0X3BhdGgKKworY2xhc3MgaW5zdGFsbF9kYXRhKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAiaW5zdGFsbCBkYXRhIGZpbGVzIgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2luc3RhbGwtZGlyPScsICdkJywKKyAgICAgICAgICJiYXNlIGRpcmVjdG9yeSBmb3IgaW5zdGFsbGluZyBkYXRhIGZpbGVzICIKKyAgICAgICAgICIoZGVmYXVsdDogaW5zdGFsbGF0aW9uIGJhc2UgZGlyKSIpLAorICAgICAgICAoJ3Jvb3Q9JywgTm9uZSwKKyAgICAgICAgICJpbnN0YWxsIGV2ZXJ5dGhpbmcgcmVsYXRpdmUgdG8gdGhpcyBhbHRlcm5hdGUgcm9vdCBkaXJlY3RvcnkiKSwKKyAgICAgICAgKCdmb3JjZScsICdmJywgImZvcmNlIGluc3RhbGxhdGlvbiAob3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzKSIpLAorICAgICAgICBdCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ2ZvcmNlJ10KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYub3V0ZmlsZXMgPSBbXQorICAgICAgICBzZWxmLnJvb3QgPSBOb25lCisgICAgICAgIHNlbGYuZm9yY2UgPSAwCisgICAgICAgIHNlbGYuZGF0YV9maWxlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMKKyAgICAgICAgc2VsZi53YXJuX2RpciA9IDEKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnaW5zdGFsbF9kYXRhJywgJ2luc3RhbGxfZGlyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgncm9vdCcsICdyb290JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZm9yY2UnLCAnZm9yY2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLm1rcGF0aChzZWxmLmluc3RhbGxfZGlyKQorICAgICAgICBmb3IgZiBpbiBzZWxmLmRhdGFfZmlsZXM6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGYsIHN0cik6CisgICAgICAgICAgICAgICAgIyBpdCdzIGEgc2ltcGxlIGZpbGUsIHNvIGNvcHkgaXQKKyAgICAgICAgICAgICAgICBmID0gY29udmVydF9wYXRoKGYpCisgICAgICAgICAgICAgICAgaWYgc2VsZi53YXJuX2RpcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCJzZXR1cCBzY3JpcHQgZGlkIG5vdCBwcm92aWRlIGEgZGlyZWN0b3J5IGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyAtLSBpbnN0YWxsaW5nIHJpZ2h0IGluICclcyciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmLCBzZWxmLmluc3RhbGxfZGlyKSkKKyAgICAgICAgICAgICAgICAob3V0LCBfKSA9IHNlbGYuY29weV9maWxlKGYsIHNlbGYuaW5zdGFsbF9kaXIpCisgICAgICAgICAgICAgICAgc2VsZi5vdXRmaWxlcy5hcHBlbmQob3V0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGl0J3MgYSB0dXBsZSB3aXRoIHBhdGggdG8gaW5zdGFsbCB0byBhbmQgYSBsaXN0IG9mIGZpbGVzCisgICAgICAgICAgICAgICAgZGlyID0gY29udmVydF9wYXRoKGZbMF0pCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMoZGlyKToKKyAgICAgICAgICAgICAgICAgICAgZGlyID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGRpcikKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYucm9vdDoKKyAgICAgICAgICAgICAgICAgICAgZGlyID0gY2hhbmdlX3Jvb3Qoc2VsZi5yb290LCBkaXIpCisgICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgoZGlyKQorCisgICAgICAgICAgICAgICAgaWYgZlsxXSA9PSBbXToKKyAgICAgICAgICAgICAgICAgICAgIyBJZiB0aGVyZSBhcmUgbm8gZmlsZXMgbGlzdGVkLCB0aGUgdXNlciBtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgICMgdHJ5aW5nIHRvIGNyZWF0ZSBhbiBlbXB0eSBkaXJlY3RvcnksIHNvIGFkZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2Ygb3V0cHV0IGZpbGVzLgorICAgICAgICAgICAgICAgICAgICBzZWxmLm91dGZpbGVzLmFwcGVuZChkaXIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBDb3B5IGZpbGVzLCBhZGRpbmcgdGhlbSB0byB0aGUgbGlzdCBvZiBvdXRwdXQgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIGZvciBkYXRhIGluIGZbMV06CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gY29udmVydF9wYXRoKGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAob3V0LCBfKSA9IHNlbGYuY29weV9maWxlKGRhdGEsIGRpcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3V0ZmlsZXMuYXBwZW5kKG91dCkKKworICAgIGRlZiBnZXRfaW5wdXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhX2ZpbGVzIG9yIFtdCisKKyAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm91dGZpbGVzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZGF0YS5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZGF0YS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmZjQxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9kYXRhLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZGF0YS5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZGF0YS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmZjQxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9kYXRhLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4ODAzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weQpAQCAtMCwwICsxLDc4IEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2VnZ19pbmZvCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnaW5zdGFsbF9lZ2dfaW5mbycgY29tbWFuZCwgZm9yIGluc3RhbGxpbmcKK2EgcGFja2FnZSdzIFBLRy1JTkZPIG1ldGFkYXRhLiIiIgorCisKK2Zyb20gZGlzdHV0aWxzLmNtZCBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZywgZGlyX3V0aWwKK2ltcG9ydCBvcywgc3lzLCByZQorCitjbGFzcyBpbnN0YWxsX2VnZ19pbmZvKENvbW1hbmQpOgorICAgICIiIkluc3RhbGwgYW4gLmVnZy1pbmZvIGZpbGUgZm9yIHRoZSBwYWNrYWdlIiIiCisKKyAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIHBhY2thZ2UncyBQS0ctSU5GTyBtZXRhZGF0YSBhcyBhbiAuZWdnLWluZm8gZmlsZSIKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnaW5zdGFsbC1kaXI9JywgJ2QnLCAiZGlyZWN0b3J5IHRvIGluc3RhbGwgdG8iKSwKKyAgICBdCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsKCdpbnN0YWxsX2RpcicsJ2luc3RhbGxfZGlyJykpCisgICAgICAgIGJhc2VuYW1lID0gIiVzLSVzLXB5JXMuZWdnLWluZm8iICUgKAorICAgICAgICAgICAgdG9fZmlsZW5hbWUoc2FmZV9uYW1lKHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCkpKSwKKyAgICAgICAgICAgIHRvX2ZpbGVuYW1lKHNhZmVfdmVyc2lvbihzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpKSksCisgICAgICAgICAgICBzeXMudmVyc2lvbls6M10KKyAgICAgICAgKQorICAgICAgICBzZWxmLnRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBiYXNlbmFtZSkKKyAgICAgICAgc2VsZi5vdXRwdXRzID0gW3NlbGYudGFyZ2V0XQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgdGFyZ2V0ID0gc2VsZi50YXJnZXQKKyAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih0YXJnZXQpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsodGFyZ2V0KToKKyAgICAgICAgICAgIGRpcl91dGlsLnJlbW92ZV90cmVlKHRhcmdldCwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHModGFyZ2V0KToKKyAgICAgICAgICAgIHNlbGYuZXhlY3V0ZShvcy51bmxpbmssKHNlbGYudGFyZ2V0LCksIlJlbW92aW5nICIrdGFyZ2V0KQorICAgICAgICBlbGlmIG5vdCBvcy5wYXRoLmlzZGlyKHNlbGYuaW5zdGFsbF9kaXIpOgorICAgICAgICAgICAgc2VsZi5leGVjdXRlKG9zLm1ha2VkaXJzLCAoc2VsZi5pbnN0YWxsX2RpciwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGluZyAiK3NlbGYuaW5zdGFsbF9kaXIpCisgICAgICAgIGxvZy5pbmZvKCJXcml0aW5nICVzIiwgdGFyZ2V0KQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgZiA9IG9wZW4odGFyZ2V0LCAndycpCisgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YS53cml0ZV9wa2dfZmlsZShmKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm91dHB1dHMKKworCisjIFRoZSBmb2xsb3dpbmcgcm91dGluZXMgYXJlIHRha2VuIGZyb20gc2V0dXB0b29scycgcGtnX3Jlc291cmNlcyBtb2R1bGUgYW5kCisjIGNhbiBiZSByZXBsYWNlZCBieSBpbXBvcnRpbmcgdGhlbSBmcm9tIHBrZ19yZXNvdXJjZXMgb25jZSBpdCBpcyBpbmNsdWRlZAorIyBpbiB0aGUgc3RkbGliLgorCitkZWYgc2FmZV9uYW1lKG5hbWUpOgorICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiBuYW1lCisKKyAgICBBbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljLy4gY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSAnLScuCisgICAgIiIiCisgICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIG5hbWUpCisKKworZGVmIHNhZmVfdmVyc2lvbih2ZXJzaW9uKToKKyAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCB2ZXJzaW9uIHN0cmluZworCisgICAgU3BhY2VzIGJlY29tZSBkb3RzLCBhbmQgYWxsIG90aGVyIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBiZWNvbWUKKyAgICBkYXNoZXMsIHdpdGggcnVucyBvZiBtdWx0aXBsZSBkYXNoZXMgY29uZGVuc2VkIHRvIGEgc2luZ2xlIGRhc2guCisgICAgIiIiCisgICAgdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgnICcsJy4nKQorICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCB2ZXJzaW9uKQorCisKK2RlZiB0b19maWxlbmFtZShuYW1lKToKKyAgICAiIiJDb252ZXJ0IGEgcHJvamVjdCBvciB2ZXJzaW9uIG5hbWUgdG8gaXRzIGZpbGVuYW1lLWVzY2FwZWQgZm9ybQorCisgICAgQW55ICctJyBjaGFyYWN0ZXJzIGFyZSBjdXJyZW50bHkgcmVwbGFjZWQgd2l0aCAnXycuCisgICAgIiIiCisgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgnLScsJ18nKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4ODNiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4ODNiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2hlYWRlcnMucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfaGVhZGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODkyNDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2hlYWRlcnMucHkKQEAgLTAsMCArMSw1MSBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9oZWFkZXJzCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnaW5zdGFsbF9oZWFkZXJzJyBjb21tYW5kLCB0byBpbnN0YWxsIEMvQysrIGhlYWRlcgorZmlsZXMgdG8gdGhlIFB5dGhvbiBpbmNsdWRlIGRpcmVjdG9yeS4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKKworCisjIFhYWCBmb3JjZSBpcyBuZXZlciB1c2VkCitjbGFzcyBpbnN0YWxsX2hlYWRlcnMoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJpbnN0YWxsIEMvQysrIGhlYWRlciBmaWxlcyIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsoJ2luc3RhbGwtZGlyPScsICdkJywKKyAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgdG8gaW5zdGFsbCBoZWFkZXIgZmlsZXMgdG8iKSwKKyAgICAgICAgICAgICAgICAgICAgKCdmb3JjZScsICdmJywKKyAgICAgICAgICAgICAgICAgICAgICJmb3JjZSBpbnN0YWxsYXRpb24gKG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcykiKSwKKyAgICAgICAgICAgICAgICAgICBdCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ2ZvcmNlJ10KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYuZm9yY2UgPSAwCisgICAgICAgIHNlbGYub3V0ZmlsZXMgPSBbXQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX2hlYWRlcnMnLCAnaW5zdGFsbF9kaXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdmb3JjZScsICdmb3JjZScpKQorCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBoZWFkZXJzID0gc2VsZi5kaXN0cmlidXRpb24uaGVhZGVycworICAgICAgICBpZiBub3QgaGVhZGVyczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYubWtwYXRoKHNlbGYuaW5zdGFsbF9kaXIpCisgICAgICAgIGZvciBoZWFkZXIgaW4gaGVhZGVyczoKKyAgICAgICAgICAgIChvdXQsIF8pID0gc2VsZi5jb3B5X2ZpbGUoaGVhZGVyLCBzZWxmLmluc3RhbGxfZGlyKQorICAgICAgICAgICAgc2VsZi5vdXRmaWxlcy5hcHBlbmQob3V0KQorCisgICAgZGVmIGdldF9pbnB1dHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbi5oZWFkZXJzIG9yIFtdCisKKyAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm91dGZpbGVzCisKKyMgY2xhc3MgaW5zdGFsbF9oZWFkZXJzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfaGVhZGVycy5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfaGVhZGVycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2MWJhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9oZWFkZXJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfaGVhZGVycy5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfaGVhZGVycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2MWJhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9oZWFkZXJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfbGliLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDNlOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weQpAQCAtMCwwICsxLDIxOSBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9saWIKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdpbnN0YWxsX2xpYicgY29tbWFuZAorKGluc3RhbGwgYWxsIFB5dGhvbiBtb2R1bGVzKS4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCisKKworIyBFeHRlbnNpb24gZm9yIFB5dGhvbiBzb3VyY2UgZmlsZXMuCitpZiBoYXNhdHRyKG9zLCAnZXh0c2VwJyk6CisgICAgUFlUSE9OX1NPVVJDRV9FWFRFTlNJT04gPSBvcy5leHRzZXAgKyAicHkiCitlbHNlOgorICAgIFBZVEhPTl9TT1VSQ0VfRVhURU5TSU9OID0gIi5weSIKKworY2xhc3MgaW5zdGFsbF9saWIoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJpbnN0YWxsIGFsbCBQeXRob24gbW9kdWxlcyAoZXh0ZW5zaW9ucyBhbmQgcHVyZSBQeXRob24pIgorCisgICAgIyBUaGUgYnl0ZS1jb21waWxhdGlvbiBvcHRpb25zIGFyZSBhIHRhZCBjb25mdXNpbmcuICBIZXJlIGFyZSB0aGUKKyAgICAjIHBvc3NpYmxlIHNjZW5hcmlvczoKKyAgICAjICAgMSkgbm8gY29tcGlsYXRpb24gYXQgYWxsICgtLW5vLWNvbXBpbGUgLS1uby1vcHRpbWl6ZSkKKyAgICAjICAgMikgY29tcGlsZSAucHljIG9ubHkgKC0tY29tcGlsZSAtLW5vLW9wdGltaXplOyBkZWZhdWx0KQorICAgICMgICAzKSBjb21waWxlIC5weWMgYW5kICJsZXZlbCAxIiAucHlvICgtLWNvbXBpbGUgLS1vcHRpbWl6ZSkKKyAgICAjICAgNCkgY29tcGlsZSAibGV2ZWwgMSIgLnB5byBvbmx5ICgtLW5vLWNvbXBpbGUgLS1vcHRpbWl6ZSkKKyAgICAjICAgNSkgY29tcGlsZSAucHljIGFuZCAibGV2ZWwgMiIgLnB5byAoLS1jb21waWxlIC0tb3B0aW1pemUtbW9yZSkKKyAgICAjICAgNikgY29tcGlsZSAibGV2ZWwgMiIgLnB5byBvbmx5ICgtLW5vLWNvbXBpbGUgLS1vcHRpbWl6ZS1tb3JlKQorICAgICMKKyAgICAjIFRoZSBVSSBmb3IgdGhpcyBpcyB0d28gb3B0aW9uLCAnY29tcGlsZScgYW5kICdvcHRpbWl6ZScuCisgICAgIyAnY29tcGlsZScgaXMgc3RyaWN0bHkgYm9vbGVhbiwgYW5kIG9ubHkgZGVjaWRlcyB3aGV0aGVyIHRvCisgICAgIyBnZW5lcmF0ZSAucHljIGZpbGVzLiAgJ29wdGltaXplJyBpcyB0aHJlZS13YXkgKDAsIDEsIG9yIDIpLCBhbmQKKyAgICAjIGRlY2lkZXMgYm90aCB3aGV0aGVyIHRvIGdlbmVyYXRlIC5weW8gZmlsZXMgYW5kIHdoYXQgbGV2ZWwgb2YKKyAgICAjIG9wdGltaXphdGlvbiB0byB1c2UuCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnaW5zdGFsbC1kaXI9JywgJ2QnLCAiZGlyZWN0b3J5IHRvIGluc3RhbGwgdG8iKSwKKyAgICAgICAgKCdidWlsZC1kaXI9JywnYicsICJidWlsZCBkaXJlY3RvcnkgKHdoZXJlIHRvIGluc3RhbGwgZnJvbSkiKSwKKyAgICAgICAgKCdmb3JjZScsICdmJywgImZvcmNlIGluc3RhbGxhdGlvbiAob3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzKSIpLAorICAgICAgICAoJ2NvbXBpbGUnLCAnYycsICJjb21waWxlIC5weSB0byAucHljIFtkZWZhdWx0XSIpLAorICAgICAgICAoJ25vLWNvbXBpbGUnLCBOb25lLCAiZG9uJ3QgY29tcGlsZSAucHkgZmlsZXMiKSwKKyAgICAgICAgKCdvcHRpbWl6ZT0nLCAnTycsCisgICAgICAgICAiYWxzbyBjb21waWxlIHdpdGggb3B0aW1pemF0aW9uOiAtTzEgZm9yIFwicHl0aG9uIC1PXCIsICIKKyAgICAgICAgICItTzIgZm9yIFwicHl0aG9uIC1PT1wiLCBhbmQgLU8wIHRvIGRpc2FibGUgW2RlZmF1bHQ6IC1PMF0iKSwKKyAgICAgICAgKCdza2lwLWJ1aWxkJywgTm9uZSwgInNraXAgdGhlIGJ1aWxkIHN0ZXBzIiksCisgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnZm9yY2UnLCAnY29tcGlsZScsICdza2lwLWJ1aWxkJ10KKyAgICBuZWdhdGl2ZV9vcHQgPSB7J25vLWNvbXBpbGUnIDogJ2NvbXBpbGUnfQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIyBsZXQgdGhlICdpbnN0YWxsJyBjb21tYW5kIGRpY3RhdGUgb3VyIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkKKyAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYuZm9yY2UgPSAwCisgICAgICAgIHNlbGYuY29tcGlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5vcHRpbWl6ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5za2lwX2J1aWxkID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgICMgR2V0IGFsbCB0aGUgaW5mb3JtYXRpb24gd2UgbmVlZCB0byBpbnN0YWxsIHB1cmUgUHl0aG9uIG1vZHVsZXMKKyAgICAgICAgIyBmcm9tIHRoZSB1bWJyZWxsYSAnaW5zdGFsbCcgY29tbWFuZCAtLSBidWlsZCAoc291cmNlKSBkaXJlY3RvcnksCisgICAgICAgICMgaW5zdGFsbCAodGFyZ2V0KSBkaXJlY3RvcnksIGFuZCB3aGV0aGVyIHRvIGNvbXBpbGUgLnB5IGZpbGVzLgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYnVpbGRfbGliJywgJ2J1aWxkX2RpcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfbGliJywgJ2luc3RhbGxfZGlyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZm9yY2UnLCAnZm9yY2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdjb21waWxlJywgJ2NvbXBpbGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdvcHRpbWl6ZScsICdvcHRpbWl6ZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3NraXBfYnVpbGQnLCAnc2tpcF9idWlsZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICBpZiBzZWxmLmNvbXBpbGUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZSA9IDEKKyAgICAgICAgaWYgc2VsZi5vcHRpbWl6ZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5vcHRpbWl6ZSA9IDAKKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLm9wdGltaXplLCBpbnQpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYub3B0aW1pemUgPSBpbnQoc2VsZi5vcHRpbWl6ZSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLm9wdGltaXplIG5vdCBpbiAoMCwgMSwgMik6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yCisgICAgICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgIm9wdGltaXplIG11c3QgYmUgMCwgMSwgb3IgMiIKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYnVpbHQgZXZlcnl0aGluZyB3ZSBuZWVkIGZpcnN0CisgICAgICAgIHNlbGYuYnVpbGQoKQorCisgICAgICAgICMgSW5zdGFsbCBldmVyeXRoaW5nOiBzaW1wbHkgZHVtcCB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSBidWlsZAorICAgICAgICAjIGRpcmVjdG9yeSB0byB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAodGhhdCdzIHRoZSBiZWF1dHkgb2YKKyAgICAgICAgIyBoYXZpbmcgYSBidWlsZCBkaXJlY3RvcnkhKQorICAgICAgICBvdXRmaWxlcyA9IHNlbGYuaW5zdGFsbCgpCisKKyAgICAgICAgIyAoT3B0aW9uYWxseSkgY29tcGlsZSAucHkgdG8gLnB5YworICAgICAgICBpZiBvdXRmaWxlcyBpcyBub3QgTm9uZSBhbmQgc2VsZi5kaXN0cmlidXRpb24uaGFzX3B1cmVfbW9kdWxlcygpOgorICAgICAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUob3V0ZmlsZXMpCisKKyAgICAjIC0tIFRvcC1sZXZlbCB3b3JrZXIgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgKGNhbGxlZCBmcm9tICdydW4oKScpCisKKyAgICBkZWYgYnVpbGQoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnNraXBfYnVpbGQ6CisgICAgICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfcHVyZV9tb2R1bGVzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfcHknKQorICAgICAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfZXh0JykKKworICAgIGRlZiBpbnN0YWxsKHNlbGYpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHNlbGYuYnVpbGRfZGlyKToKKyAgICAgICAgICAgIG91dGZpbGVzID0gc2VsZi5jb3B5X3RyZWUoc2VsZi5idWlsZF9kaXIsIHNlbGYuaW5zdGFsbF9kaXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndhcm4oIiclcycgZG9lcyBub3QgZXhpc3QgLS0gbm8gUHl0aG9uIG1vZHVsZXMgdG8gaW5zdGFsbCIgJQorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRfZGlyKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJldHVybiBvdXRmaWxlcworCisgICAgZGVmIGJ5dGVfY29tcGlsZShzZWxmLCBmaWxlcyk6CisgICAgICAgIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgorICAgICAgICAgICAgc2VsZi53YXJuKCdieXRlLWNvbXBpbGluZyBpcyBkaXNhYmxlZCwgc2tpcHBpbmcuJykKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGJ5dGVfY29tcGlsZQorCisgICAgICAgICMgR2V0IHRoZSAiLS1yb290IiBkaXJlY3Rvcnkgc3VwcGxpZWQgdG8gdGhlICJpbnN0YWxsIiBjb21tYW5kLAorICAgICAgICAjIGFuZCB1c2UgaXQgYXMgYSBwcmVmaXggdG8gc3RyaXAgb2ZmIHRoZSBwdXJwb3J0ZWQgZmlsZW5hbWUKKyAgICAgICAgIyBlbmNvZGVkIGluIGJ5dGVjb2RlIGZpbGVzLiAgVGhpcyBpcyBmYXIgZnJvbSBjb21wbGV0ZSwgYnV0IGl0CisgICAgICAgICMgc2hvdWxkIGF0IGxlYXN0IGdlbmVyYXRlIHVzYWJsZSBieXRlY29kZSBpbiBSUE0gZGlzdHJpYnV0aW9ucy4KKyAgICAgICAgaW5zdGFsbF9yb290ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKS5yb290CisKKyAgICAgICAgaWYgc2VsZi5jb21waWxlOgorICAgICAgICAgICAgYnl0ZV9jb21waWxlKGZpbGVzLCBvcHRpbWl6ZT0wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPXNlbGYuZm9yY2UsIHByZWZpeD1pbnN0YWxsX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgIGlmIHNlbGYub3B0aW1pemUgPiAwOgorICAgICAgICAgICAgYnl0ZV9jb21waWxlKGZpbGVzLCBvcHRpbWl6ZT1zZWxmLm9wdGltaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPXNlbGYuZm9yY2UsIHByZWZpeD1pbnN0YWxsX3Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1zZWxmLnZlcmJvc2UsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisKKyAgICAjIC0tIFV0aWxpdHkgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIF9tdXRhdGVfb3V0cHV0cyhzZWxmLCBoYXNfYW55LCBidWlsZF9jbWQsIGNtZF9vcHRpb24sIG91dHB1dF9kaXIpOgorICAgICAgICBpZiBub3QgaGFzX2FueToKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgICAgIGJ1aWxkX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKGJ1aWxkX2NtZCkKKyAgICAgICAgYnVpbGRfZmlsZXMgPSBidWlsZF9jbWQuZ2V0X291dHB1dHMoKQorICAgICAgICBidWlsZF9kaXIgPSBnZXRhdHRyKGJ1aWxkX2NtZCwgY21kX29wdGlvbikKKworICAgICAgICBwcmVmaXhfbGVuID0gbGVuKGJ1aWxkX2RpcikgKyBsZW4ob3Muc2VwKQorICAgICAgICBvdXRwdXRzID0gW10KKyAgICAgICAgZm9yIGZpbGUgaW4gYnVpbGRfZmlsZXM6CisgICAgICAgICAgICBvdXRwdXRzLmFwcGVuZChvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgZmlsZVtwcmVmaXhfbGVuOl0pKQorCisgICAgICAgIHJldHVybiBvdXRwdXRzCisKKyAgICBkZWYgX2J5dGVjb2RlX2ZpbGVuYW1lcyhzZWxmLCBweV9maWxlbmFtZXMpOgorICAgICAgICBieXRlY29kZV9maWxlcyA9IFtdCisgICAgICAgIGZvciBweV9maWxlIGluIHB5X2ZpbGVuYW1lczoKKyAgICAgICAgICAgICMgU2luY2UgYnVpbGRfcHkgaGFuZGxlcyBwYWNrYWdlIGRhdGEgaW5zdGFsbGF0aW9uLCB0aGUKKyAgICAgICAgICAgICMgbGlzdCBvZiBvdXRwdXRzIGNhbiBjb250YWluIG1vcmUgdGhhbiBqdXN0IC5weSBmaWxlcy4KKyAgICAgICAgICAgICMgTWFrZSBzdXJlIHdlIG9ubHkgcmVwb3J0IGJ5dGVjb2RlIGZvciB0aGUgLnB5IGZpbGVzLgorICAgICAgICAgICAgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLm5vcm1jYXNlKHB5X2ZpbGUpKVsxXQorICAgICAgICAgICAgaWYgZXh0ICE9IFBZVEhPTl9TT1VSQ0VfRVhURU5TSU9OOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBzZWxmLmNvbXBpbGU6CisgICAgICAgICAgICAgICAgYnl0ZWNvZGVfZmlsZXMuYXBwZW5kKHB5X2ZpbGUgKyAiYyIpCisgICAgICAgICAgICBpZiBzZWxmLm9wdGltaXplID4gMDoKKyAgICAgICAgICAgICAgICBieXRlY29kZV9maWxlcy5hcHBlbmQocHlfZmlsZSArICJvIikKKworICAgICAgICByZXR1cm4gYnl0ZWNvZGVfZmlsZXMKKworCisgICAgIyAtLSBFeHRlcm5hbCBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIChjYWxsZWQgYnkgb3V0c2lkZXJzKQorCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCB3b3VsZCBiZSBpbnN0YWxsZWQgaWYgdGhpcyBjb21tYW5kCisgICAgICAgIHdlcmUgYWN0dWFsbHkgcnVuLiAgTm90IGFmZmVjdGVkIGJ5IHRoZSAiZHJ5LXJ1biIgZmxhZyBvciB3aGV0aGVyCisgICAgICAgIG1vZHVsZXMgaGF2ZSBhY3R1YWxseSBiZWVuIGJ1aWx0IHlldC4KKyAgICAgICAgIiIiCisgICAgICAgIHB1cmVfb3V0cHV0cyA9IFwKKyAgICAgICAgICAgIHNlbGYuX211dGF0ZV9vdXRwdXRzKHNlbGYuZGlzdHJpYnV0aW9uLmhhc19wdXJlX21vZHVsZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWlsZF9weScsICdidWlsZF9saWInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpcikKKyAgICAgICAgaWYgc2VsZi5jb21waWxlOgorICAgICAgICAgICAgYnl0ZWNvZGVfb3V0cHV0cyA9IHNlbGYuX2J5dGVjb2RlX2ZpbGVuYW1lcyhwdXJlX291dHB1dHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBieXRlY29kZV9vdXRwdXRzID0gW10KKworICAgICAgICBleHRfb3V0cHV0cyA9IFwKKyAgICAgICAgICAgIHNlbGYuX211dGF0ZV9vdXRwdXRzKHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkX2V4dCcsICdidWlsZF9saWInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RpcikKKworICAgICAgICByZXR1cm4gcHVyZV9vdXRwdXRzICsgYnl0ZWNvZGVfb3V0cHV0cyArIGV4dF9vdXRwdXRzCisKKyAgICBkZWYgZ2V0X2lucHV0cyhzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgYXJlIGlucHV0IHRvIHRoaXMgY29tbWFuZCwgaWUuIHRoZQorICAgICAgICBmaWxlcyB0aGF0IGdldCBpbnN0YWxsZWQgYXMgdGhleSBhcmUgbmFtZWQgaW4gdGhlIGJ1aWxkIHRyZWUuCisgICAgICAgIFRoZSBmaWxlcyBpbiB0aGlzIGxpc3QgY29ycmVzcG9uZCBvbmUtdG8tb25lIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgZmlsZW5hbWVzIHJldHVybmVkIGJ5ICdnZXRfb3V0cHV0cygpJy4KKyAgICAgICAgIiIiCisgICAgICAgIGlucHV0cyA9IFtdCisKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX3B1cmVfbW9kdWxlcygpOgorICAgICAgICAgICAgYnVpbGRfcHkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKQorICAgICAgICAgICAgaW5wdXRzLmV4dGVuZChidWlsZF9weS5nZXRfb3V0cHV0cygpKQorCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgYnVpbGRfZXh0ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCisgICAgICAgICAgICBpbnB1dHMuZXh0ZW5kKGJ1aWxkX2V4dC5nZXRfb3V0cHV0cygpKQorCisgICAgICAgIHJldHVybiBpbnB1dHMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9saWIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwZGU1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9saWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9saWIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwZGU1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9saWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljZDllNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5CkBAIC0wLDAgKzEsNjQgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfc2NyaXB0cworCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ2luc3RhbGxfc2NyaXB0cycgY29tbWFuZCwgZm9yIGluc3RhbGxpbmcKK1B5dGhvbiBzY3JpcHRzLiIiIgorCisjIGNvbnRyaWJ1dGVkIGJ5IEJhc3RpYW4gS2xlaW5laWRhbQorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIHN0YXQgaW1wb3J0IFNUX01PREUKKworY2xhc3MgaW5zdGFsbF9zY3JpcHRzIChDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gImluc3RhbGwgc2NyaXB0cyAoUHl0aG9uIG9yIG90aGVyd2lzZSkiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnaW5zdGFsbC1kaXI9JywgJ2QnLCAiZGlyZWN0b3J5IHRvIGluc3RhbGwgc2NyaXB0cyB0byIpLAorICAgICAgICAoJ2J1aWxkLWRpcj0nLCdiJywgImJ1aWxkIGRpcmVjdG9yeSAod2hlcmUgdG8gaW5zdGFsbCBmcm9tKSIpLAorICAgICAgICAoJ2ZvcmNlJywgJ2YnLCAiZm9yY2UgaW5zdGFsbGF0aW9uIChvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMpIiksCisgICAgICAgICgnc2tpcC1idWlsZCcsIE5vbmUsICJza2lwIHRoZSBidWlsZCBzdGVwcyIpLAorICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnZm9yY2UnLCAnc2tpcC1idWlsZCddCisKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gTm9uZQorICAgICAgICBzZWxmLmZvcmNlID0gMAorICAgICAgICBzZWxmLmJ1aWxkX2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5za2lwX2J1aWxkID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYnVpbGQnLCAoJ2J1aWxkX3NjcmlwdHMnLCAnYnVpbGRfZGlyJykpCisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX3NjcmlwdHMnLCAnaW5zdGFsbF9kaXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdmb3JjZScsICdmb3JjZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3NraXBfYnVpbGQnLCAnc2tpcF9idWlsZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBydW4gKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5za2lwX2J1aWxkOgorICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfc2NyaXB0cycpCisgICAgICAgIHNlbGYub3V0ZmlsZXMgPSBzZWxmLmNvcHlfdHJlZShzZWxmLmJ1aWxkX2Rpciwgc2VsZi5pbnN0YWxsX2RpcikKKyAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAgICAgIyBTZXQgdGhlIGV4ZWN1dGFibGUgYml0cyAob3duZXIsIGdyb3VwLCBhbmQgd29ybGQpIG9uCisgICAgICAgICAgICAjIGFsbCB0aGUgc2NyaXB0cyB3ZSBqdXN0IGluc3RhbGxlZC4KKyAgICAgICAgICAgIGZvciBmaWxlIGluIHNlbGYuZ2V0X291dHB1dHMoKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJjaGFuZ2luZyBtb2RlIG9mICVzIiwgZmlsZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtb2RlID0gKChvcy5zdGF0KGZpbGUpW1NUX01PREVdKSB8IDA1NTUpICYgMDc3NzcKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oImNoYW5naW5nIG1vZGUgb2YgJXMgdG8gJW8iLCBmaWxlLCBtb2RlKQorICAgICAgICAgICAgICAgICAgICBvcy5jaG1vZChmaWxlLCBtb2RlKQorCisgICAgZGVmIGdldF9pbnB1dHMgKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0cyBvciBbXQorCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vdXRmaWxlcyBvciBbXQorCisjIGNsYXNzIGluc3RhbGxfc2NyaXB0cwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjM2U3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjM2U3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9yZWdpc3Rlci5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiNDJiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHkKQEAgLTAsMCArMSwzMTUgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAncmVnaXN0ZXInIGNvbW1hbmQgKHJlZ2lzdGVyIHdpdGggdGhlIHJlcG9zaXRvcnkpLgorIiIiCisKKyMgY3JlYXRlZCAyMDAyLzEwLzIxLCBSaWNoYXJkIEpvbmVzCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgdXJsbGliMgoraW1wb3J0IGdldHBhc3MKK2ltcG9ydCB1cmxwYXJzZQorZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybgorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBQeVBJUkNDb21tYW5kCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKK2NsYXNzIHJlZ2lzdGVyKFB5UElSQ0NvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAoInJlZ2lzdGVyIHRoZSBkaXN0cmlidXRpb24gd2l0aCB0aGUgUHl0aG9uIHBhY2thZ2UgaW5kZXgiKQorICAgIHVzZXJfb3B0aW9ucyA9IFB5UElSQ0NvbW1hbmQudXNlcl9vcHRpb25zICsgWworICAgICAgICAoJ2xpc3QtY2xhc3NpZmllcnMnLCBOb25lLAorICAgICAgICAgJ2xpc3QgdGhlIHZhbGlkIFRyb3ZlIGNsYXNzaWZpZXJzJyksCisgICAgICAgICgnc3RyaWN0JywgTm9uZSAsCisgICAgICAgICAnV2lsbCBzdG9wIHRoZSByZWdpc3RlcmluZyBpZiB0aGUgbWV0YS1kYXRhIGFyZSBub3QgZnVsbHkgY29tcGxpYW50JykKKyAgICAgICAgXQorICAgIGJvb2xlYW5fb3B0aW9ucyA9IFB5UElSQ0NvbW1hbmQuYm9vbGVhbl9vcHRpb25zICsgWworICAgICAgICAndmVyaWZ5JywgJ2xpc3QtY2xhc3NpZmllcnMnLCAnc3RyaWN0J10KKworICAgIHN1Yl9jb21tYW5kcyA9IFsoJ2NoZWNrJywgbGFtYmRhIHNlbGY6IFRydWUpXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgUHlQSVJDQ29tbWFuZC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgc2VsZi5saXN0X2NsYXNzaWZpZXJzID0gMAorICAgICAgICBzZWxmLnN0cmljdCA9IDAKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBQeVBJUkNDb21tYW5kLmZpbmFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgIyBzZXR0aW5nIG9wdGlvbnMgZm9yIHRoZSBgY2hlY2tgIHN1YmNvbW1hbmQKKyAgICAgICAgY2hlY2tfb3B0aW9ucyA9IHsnc3RyaWN0JzogKCdyZWdpc3RlcicsIHNlbGYuc3RyaWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAncmVzdHJ1Y3R1cmVkdGV4dCc6ICgncmVnaXN0ZXInLCAxKX0KKyAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uY29tbWFuZF9vcHRpb25zWydjaGVjayddID0gY2hlY2tfb3B0aW9ucworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5fc2V0X2NvbmZpZygpCisKKyAgICAgICAgIyBSdW4gc3ViIGNvbW1hbmRzCisgICAgICAgIGZvciBjbWRfbmFtZSBpbiBzZWxmLmdldF9zdWJfY29tbWFuZHMoKToKKyAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kX25hbWUpCisKKyAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgc2VsZi52ZXJpZnlfbWV0YWRhdGEoKQorICAgICAgICBlbGlmIHNlbGYubGlzdF9jbGFzc2lmaWVyczoKKyAgICAgICAgICAgIHNlbGYuY2xhc3NpZmllcnMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZW5kX21ldGFkYXRhKCkKKworICAgIGRlZiBjaGVja19tZXRhZGF0YShzZWxmKToKKyAgICAgICAgIiIiRGVwcmVjYXRlZCBBUEkuIiIiCisgICAgICAgIHdhcm4oImRpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyLmNoZWNrX21ldGFkYXRhIGlzIGRlcHJlY2F0ZWQsIFwKKyAgICAgICAgICAgICAgdXNlIHRoZSBjaGVjayBjb21tYW5kIGluc3RlYWQiLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICBjaGVjayA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX29iaignY2hlY2snKQorICAgICAgICBjaGVjay5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY2hlY2suc3RyaWN0ID0gc2VsZi5zdHJpY3QKKyAgICAgICAgY2hlY2sucmVzdHJ1Y3R1cmVkdGV4dCA9IDEKKyAgICAgICAgY2hlY2sucnVuKCkKKworICAgIGRlZiBfc2V0X2NvbmZpZyhzZWxmKToKKyAgICAgICAgJycnIFJlYWRzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHNldCBhdHRyaWJ1dGVzLgorICAgICAgICAnJycKKyAgICAgICAgY29uZmlnID0gc2VsZi5fcmVhZF9weXBpcmMoKQorICAgICAgICBpZiBjb25maWcgIT0ge306CisgICAgICAgICAgICBzZWxmLnVzZXJuYW1lID0gY29uZmlnWyd1c2VybmFtZSddCisgICAgICAgICAgICBzZWxmLnBhc3N3b3JkID0gY29uZmlnWydwYXNzd29yZCddCisgICAgICAgICAgICBzZWxmLnJlcG9zaXRvcnkgPSBjb25maWdbJ3JlcG9zaXRvcnknXQorICAgICAgICAgICAgc2VsZi5yZWFsbSA9IGNvbmZpZ1sncmVhbG0nXQorICAgICAgICAgICAgc2VsZi5oYXNfY29uZmlnID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5yZXBvc2l0b3J5IG5vdCBpbiAoJ3B5cGknLCBzZWxmLkRFRkFVTFRfUkVQT1NJVE9SWSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXMgbm90IGZvdW5kIGluIC5weXBpcmMnICUgc2VsZi5yZXBvc2l0b3J5KQorICAgICAgICAgICAgaWYgc2VsZi5yZXBvc2l0b3J5ID09ICdweXBpJzoKKyAgICAgICAgICAgICAgICBzZWxmLnJlcG9zaXRvcnkgPSBzZWxmLkRFRkFVTFRfUkVQT1NJVE9SWQorICAgICAgICAgICAgc2VsZi5oYXNfY29uZmlnID0gRmFsc2UKKworICAgIGRlZiBjbGFzc2lmaWVycyhzZWxmKToKKyAgICAgICAgJycnIEZldGNoIHRoZSBsaXN0IG9mIGNsYXNzaWZpZXJzIGZyb20gdGhlIHNlcnZlci4KKyAgICAgICAgJycnCisgICAgICAgIHJlc3BvbnNlID0gdXJsbGliMi51cmxvcGVuKHNlbGYucmVwb3NpdG9yeSsnPzphY3Rpb249bGlzdF9jbGFzc2lmaWVycycpCisgICAgICAgIGxvZy5pbmZvKHJlc3BvbnNlLnJlYWQoKSkKKworICAgIGRlZiB2ZXJpZnlfbWV0YWRhdGEoc2VsZik6CisgICAgICAgICcnJyBTZW5kIHRoZSBtZXRhZGF0YSB0byB0aGUgcGFja2FnZSBpbmRleCBzZXJ2ZXIgdG8gYmUgY2hlY2tlZC4KKyAgICAgICAgJycnCisgICAgICAgICMgc2VuZCB0aGUgaW5mbyB0byB0aGUgc2VydmVyIGFuZCByZXBvcnQgdGhlIHJlc3VsdAorICAgICAgICAoY29kZSwgcmVzdWx0KSA9IHNlbGYucG9zdF90b19zZXJ2ZXIoc2VsZi5idWlsZF9wb3N0X2RhdGEoJ3ZlcmlmeScpKQorICAgICAgICBsb2cuaW5mbygnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChjb2RlLCByZXN1bHQpKQorCisKKyAgICBkZWYgc2VuZF9tZXRhZGF0YShzZWxmKToKKyAgICAgICAgJycnIFNlbmQgdGhlIG1ldGFkYXRhIHRvIHRoZSBwYWNrYWdlIGluZGV4IHNlcnZlci4KKworICAgICAgICAgICAgV2VsbCwgZG8gdGhlIGZvbGxvd2luZzoKKyAgICAgICAgICAgIDEuIGZpZ3VyZSB3aG8gdGhlIHVzZXIgaXMsIGFuZCB0aGVuCisgICAgICAgICAgICAyLiBzZW5kIHRoZSBkYXRhIGFzIGEgQmFzaWMgYXV0aCdlZCBQT1NULgorCisgICAgICAgICAgICBGaXJzdCB3ZSB0cnkgdG8gcmVhZCB0aGUgdXNlcm5hbWUvcGFzc3dvcmQgZnJvbSAkSE9NRS8ucHlwaXJjLAorICAgICAgICAgICAgd2hpY2ggaXMgYSBDb25maWdQYXJzZXItZm9ybWF0dGVkIGZpbGUgd2l0aCBhIHNlY3Rpb24KKyAgICAgICAgICAgIFtkaXN0dXRpbHNdIGNvbnRhaW5pbmcgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGVudHJpZXMgKGJvdGgKKyAgICAgICAgICAgIGluIGNsZWFyIHRleHQpLiBFZzoKKworICAgICAgICAgICAgICAgIFtkaXN0dXRpbHNdCisgICAgICAgICAgICAgICAgaW5kZXgtc2VydmVycyA9CisgICAgICAgICAgICAgICAgICAgIHB5cGkKKworICAgICAgICAgICAgICAgIFtweXBpXQorICAgICAgICAgICAgICAgIHVzZXJuYW1lOiBmcmVkCisgICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHNla3JpdAorCisgICAgICAgICAgICBPdGhlcndpc2UsIHRvIGZpZ3VyZSB3aG8gdGhlIHVzZXIgaXMsIHdlIG9mZmVyIHRoZSB1c2VyIHRocmVlCisgICAgICAgICAgICBjaG9pY2VzOgorCisgICAgICAgICAgICAgMS4gdXNlIGV4aXN0aW5nIGxvZ2luLAorICAgICAgICAgICAgIDIuIHJlZ2lzdGVyIGFzIGEgbmV3IHVzZXIsIG9yCisgICAgICAgICAgICAgMy4gc2V0IHRoZSBwYXNzd29yZCB0byBhIHJhbmRvbSBzdHJpbmcgYW5kIGVtYWlsIHRoZSB1c2VyLgorCisgICAgICAgICcnJworICAgICAgICAjIHNlZSBpZiB3ZSBjYW4gc2hvcnQtY3V0IGFuZCBnZXQgdGhlIHVzZXJuYW1lL3Bhc3N3b3JkIGZyb20gdGhlCisgICAgICAgICMgY29uZmlnCisgICAgICAgIGlmIHNlbGYuaGFzX2NvbmZpZzoKKyAgICAgICAgICAgIGNob2ljZSA9ICcxJworICAgICAgICAgICAgdXNlcm5hbWUgPSBzZWxmLnVzZXJuYW1lCisgICAgICAgICAgICBwYXNzd29yZCA9IHNlbGYucGFzc3dvcmQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNob2ljZSA9ICd4JworICAgICAgICAgICAgdXNlcm5hbWUgPSBwYXNzd29yZCA9ICcnCisKKyAgICAgICAgIyBnZXQgdGhlIHVzZXIncyBsb2dpbiBpbmZvCisgICAgICAgIGNob2ljZXMgPSAnMSAyIDMgNCcuc3BsaXQoKQorICAgICAgICB3aGlsZSBjaG9pY2Ugbm90IGluIGNob2ljZXM6CisgICAgICAgICAgICBzZWxmLmFubm91bmNlKCcnJ1wKK1dlIG5lZWQgdG8ga25vdyB3aG8geW91IGFyZSwgc28gcGxlYXNlIGNob29zZSBlaXRoZXI6CisgMS4gdXNlIHlvdXIgZXhpc3RpbmcgbG9naW4sCisgMi4gcmVnaXN0ZXIgYXMgYSBuZXcgdXNlciwKKyAzLiBoYXZlIHRoZSBzZXJ2ZXIgZ2VuZXJhdGUgYSBuZXcgcGFzc3dvcmQgZm9yIHlvdSAoYW5kIGVtYWlsIGl0IHRvIHlvdSksIG9yCisgNC4gcXVpdAorWW91ciBzZWxlY3Rpb24gW2RlZmF1bHQgMV06ICcnJywgbG9nLklORk8pCisKKyAgICAgICAgICAgIGNob2ljZSA9IHJhd19pbnB1dCgpCisgICAgICAgICAgICBpZiBub3QgY2hvaWNlOgorICAgICAgICAgICAgICAgIGNob2ljZSA9ICcxJworICAgICAgICAgICAgZWxpZiBjaG9pY2Ugbm90IGluIGNob2ljZXM6CisgICAgICAgICAgICAgICAgcHJpbnQgJ1BsZWFzZSBjaG9vc2Ugb25lIG9mIHRoZSBmb3VyIG9wdGlvbnMhJworCisgICAgICAgIGlmIGNob2ljZSA9PSAnMSc6CisgICAgICAgICAgICAjIGdldCB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCisgICAgICAgICAgICB3aGlsZSBub3QgdXNlcm5hbWU6CisgICAgICAgICAgICAgICAgdXNlcm5hbWUgPSByYXdfaW5wdXQoJ1VzZXJuYW1lOiAnKQorICAgICAgICAgICAgd2hpbGUgbm90IHBhc3N3b3JkOgorICAgICAgICAgICAgICAgIHBhc3N3b3JkID0gZ2V0cGFzcy5nZXRwYXNzKCdQYXNzd29yZDogJykKKworICAgICAgICAgICAgIyBzZXQgdXAgdGhlIGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICBhdXRoID0gdXJsbGliMi5IVFRQUGFzc3dvcmRNZ3IoKQorICAgICAgICAgICAgaG9zdCA9IHVybHBhcnNlLnVybHBhcnNlKHNlbGYucmVwb3NpdG9yeSlbMV0KKyAgICAgICAgICAgIGF1dGguYWRkX3Bhc3N3b3JkKHNlbGYucmVhbG0sIGhvc3QsIHVzZXJuYW1lLCBwYXNzd29yZCkKKyAgICAgICAgICAgICMgc2VuZCB0aGUgaW5mbyB0byB0aGUgc2VydmVyIGFuZCByZXBvcnQgdGhlIHJlc3VsdAorICAgICAgICAgICAgY29kZSwgcmVzdWx0ID0gc2VsZi5wb3N0X3RvX3NlcnZlcihzZWxmLmJ1aWxkX3Bvc3RfZGF0YSgnc3VibWl0JyksCisgICAgICAgICAgICAgICAgYXV0aCkKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ1NlcnZlciByZXNwb25zZSAoJXMpOiAlcycgJSAoY29kZSwgcmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLklORk8pCisKKyAgICAgICAgICAgICMgcG9zc2libHkgc2F2ZSB0aGUgbG9naW4KKyAgICAgICAgICAgIGlmIGNvZGUgPT0gMjAwOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaGFzX2NvbmZpZzoKKyAgICAgICAgICAgICAgICAgICAgIyBzaGFyaW5nIHRoZSBwYXNzd29yZCBpbiB0aGUgZGlzdHJpYnV0aW9uIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICMgc28gdGhlIHVwbG9hZCBjb21tYW5kIGNhbiByZXVzZSBpdAorICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5wYXNzd29yZCA9IHBhc3N3b3JkCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgoJ0kgY2FuIHN0b3JlIHlvdXIgUHlQSSBsb2dpbiBzbyBmdXR1cmUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3VibWlzc2lvbnMgd2lsbCBiZSBmYXN0ZXIuJyksIGxvZy5JTkZPKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCcodGhlIGxvZ2luIHdpbGwgYmUgc3RvcmVkIGluICVzKScgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X3JjX2ZpbGUoKSwgbG9nLklORk8pCisgICAgICAgICAgICAgICAgICAgIGNob2ljZSA9ICdYJworICAgICAgICAgICAgICAgICAgICB3aGlsZSBjaG9pY2UubG93ZXIoKSBub3QgaW4gJ3luJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZSA9IHJhd19pbnB1dCgnU2F2ZSB5b3VyIGxvZ2luICh5L04pPycpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgY2hvaWNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZSA9ICduJworICAgICAgICAgICAgICAgICAgICBpZiBjaG9pY2UubG93ZXIoKSA9PSAneSc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zdG9yZV9weXBpcmModXNlcm5hbWUsIHBhc3N3b3JkKQorCisgICAgICAgIGVsaWYgY2hvaWNlID09ICcyJzoKKyAgICAgICAgICAgIGRhdGEgPSB7JzphY3Rpb24nOiAndXNlcid9CisgICAgICAgICAgICBkYXRhWyduYW1lJ10gPSBkYXRhWydwYXNzd29yZCddID0gZGF0YVsnZW1haWwnXSA9ICcnCisgICAgICAgICAgICBkYXRhWydjb25maXJtJ10gPSBOb25lCisgICAgICAgICAgICB3aGlsZSBub3QgZGF0YVsnbmFtZSddOgorICAgICAgICAgICAgICAgIGRhdGFbJ25hbWUnXSA9IHJhd19pbnB1dCgnVXNlcm5hbWU6ICcpCisgICAgICAgICAgICB3aGlsZSBkYXRhWydwYXNzd29yZCddICE9IGRhdGFbJ2NvbmZpcm0nXToKKyAgICAgICAgICAgICAgICB3aGlsZSBub3QgZGF0YVsncGFzc3dvcmQnXToKKyAgICAgICAgICAgICAgICAgICAgZGF0YVsncGFzc3dvcmQnXSA9IGdldHBhc3MuZ2V0cGFzcygnUGFzc3dvcmQ6ICcpCisgICAgICAgICAgICAgICAgd2hpbGUgbm90IGRhdGFbJ2NvbmZpcm0nXToKKyAgICAgICAgICAgICAgICAgICAgZGF0YVsnY29uZmlybSddID0gZ2V0cGFzcy5nZXRwYXNzKCcgQ29uZmlybTogJykKKyAgICAgICAgICAgICAgICBpZiBkYXRhWydwYXNzd29yZCddICE9IGRhdGFbJ2NvbmZpcm0nXToKKyAgICAgICAgICAgICAgICAgICAgZGF0YVsncGFzc3dvcmQnXSA9ICcnCisgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2NvbmZpcm0nXSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlBhc3N3b3JkIGFuZCBjb25maXJtIGRvbid0IG1hdGNoISIKKyAgICAgICAgICAgIHdoaWxlIG5vdCBkYXRhWydlbWFpbCddOgorICAgICAgICAgICAgICAgIGRhdGFbJ2VtYWlsJ10gPSByYXdfaW5wdXQoJyAgIEVNYWlsOiAnKQorICAgICAgICAgICAgY29kZSwgcmVzdWx0ID0gc2VsZi5wb3N0X3RvX3NlcnZlcihkYXRhKQorICAgICAgICAgICAgaWYgY29kZSAhPSAyMDA6CisgICAgICAgICAgICAgICAgbG9nLmluZm8oJ1NlcnZlciByZXNwb25zZSAoJXMpOiAlcycgJSAoY29kZSwgcmVzdWx0KSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9nLmluZm8oJ1lvdSB3aWxsIHJlY2VpdmUgYW4gZW1haWwgc2hvcnRseS4nKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCgnRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaW4gaXQgdG8gJworICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGxldGUgcmVnaXN0cmF0aW9uLicpKQorICAgICAgICBlbGlmIGNob2ljZSA9PSAnMyc6CisgICAgICAgICAgICBkYXRhID0geyc6YWN0aW9uJzogJ3Bhc3N3b3JkX3Jlc2V0J30KKyAgICAgICAgICAgIGRhdGFbJ2VtYWlsJ10gPSAnJworICAgICAgICAgICAgd2hpbGUgbm90IGRhdGFbJ2VtYWlsJ106CisgICAgICAgICAgICAgICAgZGF0YVsnZW1haWwnXSA9IHJhd19pbnB1dCgnWW91ciBlbWFpbCBhZGRyZXNzOiAnKQorICAgICAgICAgICAgY29kZSwgcmVzdWx0ID0gc2VsZi5wb3N0X3RvX3NlcnZlcihkYXRhKQorICAgICAgICAgICAgbG9nLmluZm8oJ1NlcnZlciByZXNwb25zZSAoJXMpOiAlcycgJSAoY29kZSwgcmVzdWx0KSkKKworICAgIGRlZiBidWlsZF9wb3N0X2RhdGEoc2VsZiwgYWN0aW9uKToKKyAgICAgICAgIyBmaWd1cmUgdGhlIGRhdGEgdG8gc2VuZCAtIHRoZSBtZXRhZGF0YSBwbHVzIHNvbWUgYWRkaXRpb25hbAorICAgICAgICAjIGluZm9ybWF0aW9uIHVzZWQgYnkgdGhlIHBhY2thZ2Ugc2VydmVyCisgICAgICAgIG1ldGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQorICAgICAgICBkYXRhID0geworICAgICAgICAgICAgJzphY3Rpb24nOiBhY3Rpb24sCisgICAgICAgICAgICAnbWV0YWRhdGFfdmVyc2lvbicgOiAnMS4wJywKKyAgICAgICAgICAgICduYW1lJzogbWV0YS5nZXRfbmFtZSgpLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiBtZXRhLmdldF92ZXJzaW9uKCksCisgICAgICAgICAgICAnc3VtbWFyeSc6IG1ldGEuZ2V0X2Rlc2NyaXB0aW9uKCksCisgICAgICAgICAgICAnaG9tZV9wYWdlJzogbWV0YS5nZXRfdXJsKCksCisgICAgICAgICAgICAnYXV0aG9yJzogbWV0YS5nZXRfY29udGFjdCgpLAorICAgICAgICAgICAgJ2F1dGhvcl9lbWFpbCc6IG1ldGEuZ2V0X2NvbnRhY3RfZW1haWwoKSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogbWV0YS5nZXRfbGljZW5jZSgpLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogbWV0YS5nZXRfbG9uZ19kZXNjcmlwdGlvbigpLAorICAgICAgICAgICAgJ2tleXdvcmRzJzogbWV0YS5nZXRfa2V5d29yZHMoKSwKKyAgICAgICAgICAgICdwbGF0Zm9ybSc6IG1ldGEuZ2V0X3BsYXRmb3JtcygpLAorICAgICAgICAgICAgJ2NsYXNzaWZpZXJzJzogbWV0YS5nZXRfY2xhc3NpZmllcnMoKSwKKyAgICAgICAgICAgICdkb3dubG9hZF91cmwnOiBtZXRhLmdldF9kb3dubG9hZF91cmwoKSwKKyAgICAgICAgICAgICMgUEVQIDMxNAorICAgICAgICAgICAgJ3Byb3ZpZGVzJzogbWV0YS5nZXRfcHJvdmlkZXMoKSwKKyAgICAgICAgICAgICdyZXF1aXJlcyc6IG1ldGEuZ2V0X3JlcXVpcmVzKCksCisgICAgICAgICAgICAnb2Jzb2xldGVzJzogbWV0YS5nZXRfb2Jzb2xldGVzKCksCisgICAgICAgIH0KKyAgICAgICAgaWYgZGF0YVsncHJvdmlkZXMnXSBvciBkYXRhWydyZXF1aXJlcyddIG9yIGRhdGFbJ29ic29sZXRlcyddOgorICAgICAgICAgICAgZGF0YVsnbWV0YWRhdGFfdmVyc2lvbiddID0gJzEuMScKKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgIGRlZiBwb3N0X3RvX3NlcnZlcihzZWxmLCBkYXRhLCBhdXRoPU5vbmUpOgorICAgICAgICAnJycgUG9zdCBhIHF1ZXJ5IHRvIHRoZSBzZXJ2ZXIsIGFuZCByZXR1cm4gYSBzdHJpbmcgcmVzcG9uc2UuCisgICAgICAgICcnJworICAgICAgICBpZiAnbmFtZScgaW4gZGF0YToKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ1JlZ2lzdGVyaW5nICVzIHRvICVzJyAlIChkYXRhWyduYW1lJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9zaXRvcnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLklORk8pCisgICAgICAgICMgQnVpbGQgdXAgdGhlIE1JTUUgcGF5bG9hZCBmb3IgdGhlIHVybGxpYjIgUE9TVCBkYXRhCisgICAgICAgIGJvdW5kYXJ5ID0gJy0tLS0tLS0tLS0tLS0tR0hTS0ZKRExHRFM3NTQzRkpLTEZIUkU3NTY0Mjc1Njc0MzI1NCcKKyAgICAgICAgc2VwX2JvdW5kYXJ5ID0gJ1xuLS0nICsgYm91bmRhcnkKKyAgICAgICAgZW5kX2JvdW5kYXJ5ID0gc2VwX2JvdW5kYXJ5ICsgJy0tJworICAgICAgICBjaHVua3MgPSBbXQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkYXRhLml0ZW1zKCk6CisgICAgICAgICAgICAjIGhhbmRsZSBtdWx0aXBsZSBlbnRyaWVzIGZvciB0aGUgc2FtZSBuYW1lCisgICAgICAgICAgICBpZiB0eXBlKHZhbHVlKSBub3QgaW4gKHR5cGUoW10pLCB0eXBlKCAoKSApKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IFt2YWx1ZV0KKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHNlcF9ib3VuZGFyeSkKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKCdcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiJyVrZXkpCisgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCgiXG5cbiIpCisgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSBhbmQgdmFsdWVbLTFdID09ICdccic6CisgICAgICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoJ1xuJykgICMgd3JpdGUgYW4gZXh0cmEgbmV3bGluZSAobHVydmUgTWFjcykKKyAgICAgICAgY2h1bmtzLmFwcGVuZChlbmRfYm91bmRhcnkpCisgICAgICAgIGNodW5rcy5hcHBlbmQoIlxuIikKKworICAgICAgICAjIGNodW5rcyBtYXkgYmUgYnl0ZXMgKHN0cikgb3IgdW5pY29kZSBvYmplY3RzIHRoYXQgd2UgbmVlZCB0byBlbmNvZGUKKyAgICAgICAgYm9keSA9IFtdCisgICAgICAgIGZvciBjaHVuayBpbiBjaHVua3M6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNodW5rLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICBib2R5LmFwcGVuZChjaHVuay5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKGNodW5rKQorCisgICAgICAgIGJvZHkgPSAnJy5qb2luKGJvZHkpCisKKyAgICAgICAgIyBidWlsZCB0aGUgUmVxdWVzdAorICAgICAgICBoZWFkZXJzID0geworICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZSc6ICdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0lczsgY2hhcnNldD11dGYtOCclYm91bmRhcnksCisgICAgICAgICAgICAnQ29udGVudC1sZW5ndGgnOiBzdHIobGVuKGJvZHkpKQorICAgICAgICB9CisgICAgICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdChzZWxmLnJlcG9zaXRvcnksIGJvZHksIGhlYWRlcnMpCisKKyAgICAgICAgIyBoYW5kbGUgSFRUUCBhbmQgaW5jbHVkZSB0aGUgQmFzaWMgQXV0aCBoYW5kbGVyCisgICAgICAgIG9wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKAorICAgICAgICAgICAgdXJsbGliMi5IVFRQQmFzaWNBdXRoSGFuZGxlcihwYXNzd29yZF9tZ3I9YXV0aCkKKyAgICAgICAgKQorICAgICAgICBkYXRhID0gJycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gb3BlbmVyLm9wZW4ocmVxKQorICAgICAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBzZWxmLnNob3dfcmVzcG9uc2U6CisgICAgICAgICAgICAgICAgZGF0YSA9IGUuZnAucmVhZCgpCisgICAgICAgICAgICByZXN1bHQgPSBlLmNvZGUsIGUubXNnCisgICAgICAgIGV4Y2VwdCB1cmxsaWIyLlVSTEVycm9yLCBlOgorICAgICAgICAgICAgcmVzdWx0ID0gNTAwLCBzdHIoZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuc2hvd19yZXNwb25zZToKKyAgICAgICAgICAgICAgICBkYXRhID0gcmVzdWx0LnJlYWQoKQorICAgICAgICAgICAgcmVzdWx0ID0gMjAwLCAnT0snCisgICAgICAgIGlmIHNlbGYuc2hvd19yZXNwb25zZToKKyAgICAgICAgICAgIGRhc2hlcyA9ICctJyAqIDc1CisgICAgICAgICAgICBzZWxmLmFubm91bmNlKCclcyVzJXMnICUgKGRhc2hlcywgZGF0YSwgZGFzaGVzKSkKKworICAgICAgICByZXR1cm4gcmVzdWx0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MTg1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MTg1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzBkZTEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weQpAQCAtMCwwICsxLDQ3NyBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuc2Rpc3QKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdzZGlzdCcgY29tbWFuZCAoY3JlYXRlIGEgc291cmNlIGRpc3RyaWJ1dGlvbikuIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBzeXMKK2Zyb20gZ2xvYiBpbXBvcnQgZ2xvYgorZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybgorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgZGlyX3V0aWwsIGRlcF91dGlsLCBmaWxlX3V0aWwsIGFyY2hpdmVfdXRpbAorZnJvbSBkaXN0dXRpbHMudGV4dF9maWxlIGltcG9ydCBUZXh0RmlsZQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgRGlzdHV0aWxzT3B0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXN0dXRpbHNUZW1wbGF0ZUVycm9yKQorZnJvbSBkaXN0dXRpbHMuZmlsZWxpc3QgaW1wb3J0IEZpbGVMaXN0Citmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKKworZGVmIHNob3dfZm9ybWF0cygpOgorICAgICIiIlByaW50IGFsbCBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSAnZm9ybWF0cycgb3B0aW9uICh1c2VkIGJ5CisgICAgdGhlICItLWhlbHAtZm9ybWF0cyIgY29tbWFuZC1saW5lIG9wdGlvbikuCisgICAgIiIiCisgICAgZnJvbSBkaXN0dXRpbHMuZmFuY3lfZ2V0b3B0IGltcG9ydCBGYW5jeUdldG9wdAorICAgIGZyb20gZGlzdHV0aWxzLmFyY2hpdmVfdXRpbCBpbXBvcnQgQVJDSElWRV9GT1JNQVRTCisgICAgZm9ybWF0cyA9IFtdCisgICAgZm9yIGZvcm1hdCBpbiBBUkNISVZFX0ZPUk1BVFMua2V5cygpOgorICAgICAgICBmb3JtYXRzLmFwcGVuZCgoImZvcm1hdHM9IiArIGZvcm1hdCwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFSQ0hJVkVfRk9STUFUU1tmb3JtYXRdWzJdKSkKKyAgICBmb3JtYXRzLnNvcnQoKQorICAgIEZhbmN5R2V0b3B0KGZvcm1hdHMpLnByaW50X2hlbHAoCisgICAgICAgICJMaXN0IG9mIGF2YWlsYWJsZSBzb3VyY2UgZGlzdHJpYnV0aW9uIGZvcm1hdHM6IikKKworY2xhc3Mgc2Rpc3QoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJjcmVhdGUgYSBzb3VyY2UgZGlzdHJpYnV0aW9uICh0YXJiYWxsLCB6aXAgZmlsZSwgZXRjLikiCisKKyAgICBkZWYgY2hlY2tpbmdfbWV0YWRhdGEoc2VsZik6CisgICAgICAgICIiIkNhbGxhYmxlIHVzZWQgZm9yIHRoZSBjaGVjayBzdWItY29tbWFuZC4KKworICAgICAgICBQbGFjZWQgaGVyZSBzbyB1c2VyX29wdGlvbnMgY2FuIHZpZXcgaXQiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYubWV0YWRhdGFfY2hlY2sKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCd0ZW1wbGF0ZT0nLCAndCcsCisgICAgICAgICAibmFtZSBvZiBtYW5pZmVzdCB0ZW1wbGF0ZSBmaWxlIFtkZWZhdWx0OiBNQU5JRkVTVC5pbl0iKSwKKyAgICAgICAgKCdtYW5pZmVzdD0nLCAnbScsCisgICAgICAgICAibmFtZSBvZiBtYW5pZmVzdCBmaWxlIFtkZWZhdWx0OiBNQU5JRkVTVF0iKSwKKyAgICAgICAgKCd1c2UtZGVmYXVsdHMnLCBOb25lLAorICAgICAgICAgImluY2x1ZGUgdGhlIGRlZmF1bHQgZmlsZSBzZXQgaW4gdGhlIG1hbmlmZXN0ICIKKyAgICAgICAgICJbZGVmYXVsdDsgZGlzYWJsZSB3aXRoIC0tbm8tZGVmYXVsdHNdIiksCisgICAgICAgICgnbm8tZGVmYXVsdHMnLCBOb25lLAorICAgICAgICAgImRvbid0IGluY2x1ZGUgdGhlIGRlZmF1bHQgZmlsZSBzZXQiKSwKKyAgICAgICAgKCdwcnVuZScsIE5vbmUsCisgICAgICAgICAic3BlY2lmaWNhbGx5IGV4Y2x1ZGUgZmlsZXMvZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgbm90IGJlICIKKyAgICAgICAgICJkaXN0cmlidXRlZCAoYnVpbGQgdHJlZSwgUkNTL0NWUyBkaXJzLCBldGMuKSAiCisgICAgICAgICAiW2RlZmF1bHQ7IGRpc2FibGUgd2l0aCAtLW5vLXBydW5lXSIpLAorICAgICAgICAoJ25vLXBydW5lJywgTm9uZSwKKyAgICAgICAgICJkb24ndCBhdXRvbWF0aWNhbGx5IGV4Y2x1ZGUgYW55dGhpbmciKSwKKyAgICAgICAgKCdtYW5pZmVzdC1vbmx5JywgJ28nLAorICAgICAgICAgImp1c3QgcmVnZW5lcmF0ZSB0aGUgbWFuaWZlc3QgYW5kIHRoZW4gc3RvcCAiCisgICAgICAgICAiKGltcGxpZXMgLS1mb3JjZS1tYW5pZmVzdCkiKSwKKyAgICAgICAgKCdmb3JjZS1tYW5pZmVzdCcsICdmJywKKyAgICAgICAgICJmb3JjaWJseSByZWdlbmVyYXRlIHRoZSBtYW5pZmVzdCBhbmQgY2Fycnkgb24gYXMgdXN1YWwuICIKKyAgICAgICAgICJEZXByZWNhdGVkOiBub3cgdGhlIG1hbmlmZXN0IGlzIGFsd2F5cyByZWdlbmVyYXRlZC4iKSwKKyAgICAgICAgKCdmb3JtYXRzPScsIE5vbmUsCisgICAgICAgICAiZm9ybWF0cyBmb3Igc291cmNlIGRpc3RyaWJ1dGlvbiAoY29tbWEtc2VwYXJhdGVkIGxpc3QpIiksCisgICAgICAgICgna2VlcC10ZW1wJywgJ2snLAorICAgICAgICAgImtlZXAgdGhlIGRpc3RyaWJ1dGlvbiB0cmVlIGFyb3VuZCBhZnRlciBjcmVhdGluZyAiICsKKyAgICAgICAgICJhcmNoaXZlIGZpbGUocykiKSwKKyAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCisgICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlKHMpIGluICIKKyAgICAgICAgICJbZGVmYXVsdDogZGlzdF0iKSwKKyAgICAgICAgKCdtZXRhZGF0YS1jaGVjaycsIE5vbmUsCisgICAgICAgICAiRW5zdXJlIHRoYXQgYWxsIHJlcXVpcmVkIGVsZW1lbnRzIG9mIG1ldGEtZGF0YSAiCisgICAgICAgICAiYXJlIHN1cHBsaWVkLiBXYXJuIGlmIGFueSBtaXNzaW5nLiBbZGVmYXVsdF0iKSwKKyAgICAgICAgKCdvd25lcj0nLCAndScsCisgICAgICAgICAiT3duZXIgbmFtZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YXIgZmlsZSBbZGVmYXVsdDogY3VycmVudCB1c2VyXSIpLAorICAgICAgICAoJ2dyb3VwPScsICdnJywKKyAgICAgICAgICJHcm91cCBuYW1lIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRhciBmaWxlIFtkZWZhdWx0OiBjdXJyZW50IGdyb3VwXSIpLAorICAgICAgICBdCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ3VzZS1kZWZhdWx0cycsICdwcnVuZScsCisgICAgICAgICAgICAgICAgICAgICAgICdtYW5pZmVzdC1vbmx5JywgJ2ZvcmNlLW1hbmlmZXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2tlZXAtdGVtcCcsICdtZXRhZGF0YS1jaGVjayddCisKKyAgICBoZWxwX29wdGlvbnMgPSBbCisgICAgICAgICgnaGVscC1mb3JtYXRzJywgTm9uZSwKKyAgICAgICAgICJsaXN0IGF2YWlsYWJsZSBkaXN0cmlidXRpb24gZm9ybWF0cyIsIHNob3dfZm9ybWF0cyksCisgICAgICAgIF0KKworICAgIG5lZ2F0aXZlX29wdCA9IHsnbm8tZGVmYXVsdHMnOiAndXNlLWRlZmF1bHRzJywKKyAgICAgICAgICAgICAgICAgICAgJ25vLXBydW5lJzogJ3BydW5lJyB9CisKKyAgICBkZWZhdWx0X2Zvcm1hdCA9IHsncG9zaXgnOiAnZ3p0YXInLAorICAgICAgICAgICAgICAgICAgICAgICdudCc6ICd6aXAnIH0KKworICAgIHN1Yl9jb21tYW5kcyA9IFsoJ2NoZWNrJywgY2hlY2tpbmdfbWV0YWRhdGEpXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIyAndGVtcGxhdGUnIGFuZCAnbWFuaWZlc3QnIGFyZSwgcmVzcGVjdGl2ZWx5LCB0aGUgbmFtZXMgb2YKKyAgICAgICAgIyB0aGUgbWFuaWZlc3QgdGVtcGxhdGUgYW5kIG1hbmlmZXN0IGZpbGUuCisgICAgICAgIHNlbGYudGVtcGxhdGUgPSBOb25lCisgICAgICAgIHNlbGYubWFuaWZlc3QgPSBOb25lCisKKyAgICAgICAgIyAndXNlX2RlZmF1bHRzJzogaWYgdHJ1ZSwgd2Ugd2lsbCBpbmNsdWRlIHRoZSBkZWZhdWx0IGZpbGUgc2V0CisgICAgICAgICMgaW4gdGhlIG1hbmlmZXN0CisgICAgICAgIHNlbGYudXNlX2RlZmF1bHRzID0gMQorICAgICAgICBzZWxmLnBydW5lID0gMQorCisgICAgICAgIHNlbGYubWFuaWZlc3Rfb25seSA9IDAKKyAgICAgICAgc2VsZi5mb3JjZV9tYW5pZmVzdCA9IDAKKworICAgICAgICBzZWxmLmZvcm1hdHMgPSBOb25lCisgICAgICAgIHNlbGYua2VlcF90ZW1wID0gMAorICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQorCisgICAgICAgIHNlbGYuYXJjaGl2ZV9maWxlcyA9IE5vbmUKKyAgICAgICAgc2VsZi5tZXRhZGF0YV9jaGVjayA9IDEKKyAgICAgICAgc2VsZi5vd25lciA9IE5vbmUKKyAgICAgICAgc2VsZi5ncm91cCA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm1hbmlmZXN0IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLm1hbmlmZXN0ID0gIk1BTklGRVNUIgorICAgICAgICBpZiBzZWxmLnRlbXBsYXRlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnRlbXBsYXRlID0gIk1BTklGRVNULmluIgorCisgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZ19saXN0KCdmb3JtYXRzJykKKyAgICAgICAgaWYgc2VsZi5mb3JtYXRzIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5mb3JtYXRzID0gW3NlbGYuZGVmYXVsdF9mb3JtYXRbb3MubmFtZV1dCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJkb24ndCBrbm93IGhvdyB0byBjcmVhdGUgc291cmNlIGRpc3RyaWJ1dGlvbnMgIiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAib24gcGxhdGZvcm0gJXMiICUgb3MubmFtZQorCisgICAgICAgIGJhZF9mb3JtYXQgPSBhcmNoaXZlX3V0aWwuY2hlY2tfYXJjaGl2ZV9mb3JtYXRzKHNlbGYuZm9ybWF0cykKKyAgICAgICAgaWYgYmFkX2Zvcm1hdDoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgICAgICAgICAgICAgICAidW5rbm93biBhcmNoaXZlIGZvcm1hdCAnJXMnIiAlIGJhZF9mb3JtYXQKKworICAgICAgICBpZiBzZWxmLmRpc3RfZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmRpc3RfZGlyID0gImRpc3QiCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAjICdmaWxlbGlzdCcgY29udGFpbnMgdGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCB3aWxsIG1ha2UgdXAgdGhlCisgICAgICAgICMgbWFuaWZlc3QKKyAgICAgICAgc2VsZi5maWxlbGlzdCA9IEZpbGVMaXN0KCkKKworICAgICAgICAjIFJ1biBzdWIgY29tbWFuZHMKKyAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgorICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRfbmFtZSkKKworICAgICAgICAjIERvIHdoYXRldmVyIGl0IHRha2VzIHRvIGdldCB0aGUgbGlzdCBvZiBmaWxlcyB0byBwcm9jZXNzCisgICAgICAgICMgKHByb2Nlc3MgdGhlIG1hbmlmZXN0IHRlbXBsYXRlLCByZWFkIGFuIGV4aXN0aW5nIG1hbmlmZXN0LAorICAgICAgICAjIHdoYXRldmVyKS4gIEZpbGUgbGlzdCBpcyBhY2N1bXVsYXRlZCBpbiAnc2VsZi5maWxlbGlzdCcuCisgICAgICAgIHNlbGYuZ2V0X2ZpbGVfbGlzdCgpCisKKyAgICAgICAgIyBJZiB1c2VyIGp1c3Qgd2FudGVkIHVzIHRvIHJlZ2VuZXJhdGUgdGhlIG1hbmlmZXN0LCBzdG9wIG5vdy4KKyAgICAgICAgaWYgc2VsZi5tYW5pZmVzdF9vbmx5OgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBPdGhlcndpc2UsIGdvIGFoZWFkIGFuZCBjcmVhdGUgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gdGFyYmFsbCwKKyAgICAgICAgIyBvciB6aXBmaWxlLCBvciB3aGF0ZXZlci4KKyAgICAgICAgc2VsZi5tYWtlX2Rpc3RyaWJ1dGlvbigpCisKKyAgICBkZWYgY2hlY2tfbWV0YWRhdGEoc2VsZik6CisgICAgICAgICIiIkRlcHJlY2F0ZWQgQVBJLiIiIgorICAgICAgICB3YXJuKCJkaXN0dXRpbHMuY29tbWFuZC5zZGlzdC5jaGVja19tZXRhZGF0YSBpcyBkZXByZWNhdGVkLCBcCisgICAgICAgICAgICAgIHVzZSB0aGUgY2hlY2sgY29tbWFuZCBpbnN0ZWFkIiwgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgY2hlY2sgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9vYmooJ2NoZWNrJykKKyAgICAgICAgY2hlY2suZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNoZWNrLnJ1bigpCisKKyAgICBkZWYgZ2V0X2ZpbGVfbGlzdChzZWxmKToKKyAgICAgICAgIiIiRmlndXJlIG91dCB0aGUgbGlzdCBvZiBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBzb3VyY2UKKyAgICAgICAgZGlzdHJpYnV0aW9uLCBhbmQgcHV0IGl0IGluICdzZWxmLmZpbGVsaXN0Jy4gIFRoaXMgbWlnaHQgaW52b2x2ZQorICAgICAgICByZWFkaW5nIHRoZSBtYW5pZmVzdCB0ZW1wbGF0ZSAoYW5kIHdyaXRpbmcgdGhlIG1hbmlmZXN0KSwgb3IganVzdAorICAgICAgICByZWFkaW5nIHRoZSBtYW5pZmVzdCwgb3IganVzdCB1c2luZyB0aGUgZGVmYXVsdCBmaWxlIHNldCAtLSBpdCBhbGwKKyAgICAgICAgZGVwZW5kcyBvbiB0aGUgdXNlcidzIG9wdGlvbnMuCisgICAgICAgICIiIgorICAgICAgICAjIG5ldyBiZWhhdmlvciB3aGVuIHVzaW5nIGEgdGVtcGxhdGU6CisgICAgICAgICMgdGhlIGZpbGUgbGlzdCBpcyByZWNhbGN1bGF0ZWQgZXZlcnl0aW1lIGJlY2F1c2UKKyAgICAgICAgIyBldmVuIGlmIE1BTklGRVNULmluIG9yIHNldHVwLnB5IGFyZSBub3QgY2hhbmdlZAorICAgICAgICAjIHRoZSB1c2VyIG1pZ2h0IGhhdmUgYWRkZWQgc29tZSBmaWxlcyBpbiB0aGUgdHJlZSB0aGF0CisgICAgICAgICMgbmVlZCB0byBiZSBpbmNsdWRlZC4KKyAgICAgICAgIworICAgICAgICAjICBUaGlzIG1ha2VzIC0tZm9yY2UgdGhlIGRlZmF1bHQgYW5kIG9ubHkgYmVoYXZpb3Igd2l0aCB0ZW1wbGF0ZXMuCisgICAgICAgIHRlbXBsYXRlX2V4aXN0cyA9IG9zLnBhdGguaXNmaWxlKHNlbGYudGVtcGxhdGUpCisgICAgICAgIGlmIG5vdCB0ZW1wbGF0ZV9leGlzdHMgYW5kIHNlbGYuX21hbmlmZXN0X2lzX25vdF9nZW5lcmF0ZWQoKToKKyAgICAgICAgICAgIHNlbGYucmVhZF9tYW5pZmVzdCgpCisgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LnNvcnQoKQorICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5yZW1vdmVfZHVwbGljYXRlcygpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3QgdGVtcGxhdGVfZXhpc3RzOgorICAgICAgICAgICAgc2VsZi53YXJuKCgibWFuaWZlc3QgdGVtcGxhdGUgJyVzJyBkb2VzIG5vdCBleGlzdCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIodXNpbmcgZGVmYXVsdCBmaWxlIGxpc3QpIikgJQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZW1wbGF0ZSkKKyAgICAgICAgc2VsZi5maWxlbGlzdC5maW5kYWxsKCkKKworICAgICAgICBpZiBzZWxmLnVzZV9kZWZhdWx0czoKKyAgICAgICAgICAgIHNlbGYuYWRkX2RlZmF1bHRzKCkKKworICAgICAgICBpZiB0ZW1wbGF0ZV9leGlzdHM6CisgICAgICAgICAgICBzZWxmLnJlYWRfdGVtcGxhdGUoKQorCisgICAgICAgIGlmIHNlbGYucHJ1bmU6CisgICAgICAgICAgICBzZWxmLnBydW5lX2ZpbGVfbGlzdCgpCisKKyAgICAgICAgc2VsZi5maWxlbGlzdC5zb3J0KCkKKyAgICAgICAgc2VsZi5maWxlbGlzdC5yZW1vdmVfZHVwbGljYXRlcygpCisgICAgICAgIHNlbGYud3JpdGVfbWFuaWZlc3QoKQorCisgICAgZGVmIGFkZF9kZWZhdWx0cyhzZWxmKToKKyAgICAgICAgIiIiQWRkIGFsbCB0aGUgZGVmYXVsdCBmaWxlcyB0byBzZWxmLmZpbGVsaXN0OgorICAgICAgICAgIC0gUkVBRE1FIG9yIFJFQURNRS50eHQKKyAgICAgICAgICAtIHNldHVwLnB5CisgICAgICAgICAgLSB0ZXN0L3Rlc3QqLnB5CisgICAgICAgICAgLSBhbGwgcHVyZSBQeXRob24gbW9kdWxlcyBtZW50aW9uZWQgaW4gc2V0dXAgc2NyaXB0CisgICAgICAgICAgLSBhbGwgZmlsZXMgcG9pbnRlZCBieSBwYWNrYWdlX2RhdGEgKGJ1aWxkX3B5KQorICAgICAgICAgIC0gYWxsIGZpbGVzIGRlZmluZWQgaW4gZGF0YV9maWxlcy4KKyAgICAgICAgICAtIGFsbCBmaWxlcyBkZWZpbmVkIGFzIHNjcmlwdHMuCisgICAgICAgICAgLSBhbGwgQyBzb3VyY2VzIGxpc3RlZCBhcyBwYXJ0IG9mIGV4dGVuc2lvbnMgb3IgQyBsaWJyYXJpZXMKKyAgICAgICAgICAgIGluIHRoZSBzZXR1cCBzY3JpcHQgKGRvZXNuJ3QgY2F0Y2ggQyBoZWFkZXJzISkKKyAgICAgICAgV2FybnMgaWYgKFJFQURNRSBvciBSRUFETUUudHh0KSBvciBzZXR1cC5weSBhcmUgbWlzc2luZzsgZXZlcnl0aGluZworICAgICAgICBlbHNlIGlzIG9wdGlvbmFsLgorICAgICAgICAiIiIKKworICAgICAgICBzdGFuZGFyZHMgPSBbKCdSRUFETUUnLCAnUkVBRE1FLnR4dCcpLCBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRfbmFtZV0KKyAgICAgICAgZm9yIGZuIGluIHN0YW5kYXJkczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZm4sIHR1cGxlKToKKyAgICAgICAgICAgICAgICBhbHRzID0gZm4KKyAgICAgICAgICAgICAgICBnb3RfaXQgPSAwCisgICAgICAgICAgICAgICAgZm9yIGZuIGluIGFsdHM6CisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdF9pdCA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGZuKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgIGlmIG5vdCBnb3RfaXQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud2Fybigic3RhbmRhcmQgZmlsZSBub3QgZm91bmQ6IHNob3VsZCBoYXZlIG9uZSBvZiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5qb2luKGFsdHMsICcsICcpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGZuKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud2Fybigic3RhbmRhcmQgZmlsZSAnJXMnIG5vdCBmb3VuZCIgJSBmbikKKworICAgICAgICBvcHRpb25hbCA9IFsndGVzdC90ZXN0Ki5weScsICdzZXR1cC5jZmcnXQorICAgICAgICBmb3IgcGF0dGVybiBpbiBvcHRpb25hbDoKKyAgICAgICAgICAgIGZpbGVzID0gZmlsdGVyKG9zLnBhdGguaXNmaWxlLCBnbG9iKHBhdHRlcm4pKQorICAgICAgICAgICAgaWYgZmlsZXM6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoZmlsZXMpCisKKyAgICAgICAgIyBidWlsZF9weSBpcyB1c2VkIHRvIGdldDoKKyAgICAgICAgIyAgLSBweXRob24gbW9kdWxlcworICAgICAgICAjICAtIGZpbGVzIGRlZmluZWQgaW4gcGFja2FnZV9kYXRhCisgICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKKworICAgICAgICAjIGdldHRpbmcgcHl0aG9uIGZpbGVzCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19wdXJlX21vZHVsZXMoKToKKyAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX3B5LmdldF9zb3VyY2VfZmlsZXMoKSkKKworICAgICAgICAjIGdldHRpbmcgcGFja2FnZV9kYXRhIGZpbGVzCisgICAgICAgICMgKGNvbXB1dGVkIGluIGJ1aWxkX3B5LmRhdGFfZmlsZXMgYnkgYnVpbGRfcHkuZmluYWxpemVfb3B0aW9ucykKKyAgICAgICAgZm9yIHBrZywgc3JjX2RpciwgYnVpbGRfZGlyLCBmaWxlbmFtZXMgaW4gYnVpbGRfcHkuZGF0YV9maWxlczoKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQob3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKSkKKworICAgICAgICAjIGdldHRpbmcgZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXMKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2RhdGFfZmlsZXMoKToKKyAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXM6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBzdHIpOiAjIHBsYWluIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGNvbnZlcnRfcGF0aChpdGVtKQorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShpdGVtKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKGl0ZW0pCisgICAgICAgICAgICAgICAgZWxzZTogICAgIyBhIChkaXJuYW1lLCBmaWxlbmFtZXMpIHR1cGxlCisgICAgICAgICAgICAgICAgICAgIGRpcm5hbWUsIGZpbGVuYW1lcyA9IGl0ZW0KKyAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGNvbnZlcnRfcGF0aChmKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoZikKKworICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKKyAgICAgICAgICAgIGJ1aWxkX2V4dCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9leHQnKQorICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfZXh0LmdldF9zb3VyY2VfZmlsZXMoKSkKKworICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfY19saWJyYXJpZXMoKToKKyAgICAgICAgICAgIGJ1aWxkX2NsaWIgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfY2xpYicpCisgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9jbGliLmdldF9zb3VyY2VfZmlsZXMoKSkKKworICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfc2NyaXB0cygpOgorICAgICAgICAgICAgYnVpbGRfc2NyaXB0cyA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9zY3JpcHRzJykKKyAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX3NjcmlwdHMuZ2V0X3NvdXJjZV9maWxlcygpKQorCisgICAgZGVmIHJlYWRfdGVtcGxhdGUoc2VsZik6CisgICAgICAgICIiIlJlYWQgYW5kIHBhcnNlIG1hbmlmZXN0IHRlbXBsYXRlIGZpbGUgbmFtZWQgYnkgc2VsZi50ZW1wbGF0ZS4KKworICAgICAgICAodXN1YWxseSAiTUFOSUZFU1QuaW4iKSBUaGUgcGFyc2luZyBhbmQgcHJvY2Vzc2luZyBpcyBkb25lIGJ5CisgICAgICAgICdzZWxmLmZpbGVsaXN0Jywgd2hpY2ggdXBkYXRlcyBpdHNlbGYgYWNjb3JkaW5nbHkuCisgICAgICAgICIiIgorICAgICAgICBsb2cuaW5mbygicmVhZGluZyBtYW5pZmVzdCB0ZW1wbGF0ZSAnJXMnIiwgc2VsZi50ZW1wbGF0ZSkKKyAgICAgICAgdGVtcGxhdGUgPSBUZXh0RmlsZShzZWxmLnRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwX2NvbW1lbnRzPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9ibGFua3M9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luX2xpbmVzPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHN0cmlwX3dzPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnN0cmlwX3dzPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2Vfam9pbj0xKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgbGluZSA9IHRlbXBsYXRlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5vbmU6ICAgICAgICAgICAgIyBlbmQgb2YgZmlsZQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZShsaW5lKQorICAgICAgICAgICAgICAgICMgdGhlIGNhbGwgYWJvdmUgY2FuIHJhaXNlIGEgRGlzdHV0aWxzVGVtcGxhdGVFcnJvciBmb3IKKyAgICAgICAgICAgICAgICAjIG1hbGZvcm1lZCBsaW5lcywgb3IgYSBWYWx1ZUVycm9yIGZyb20gdGhlIGxvd2VyLWxldmVsCisgICAgICAgICAgICAgICAgIyBjb252ZXJ0X3BhdGggZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBleGNlcHQgKERpc3R1dGlsc1RlbXBsYXRlRXJyb3IsIFZhbHVlRXJyb3IpIGFzIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCIlcywgbGluZSAlZDogJXMiICUgKHRlbXBsYXRlLmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuY3VycmVudF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRlbXBsYXRlLmNsb3NlKCkKKworICAgIGRlZiBwcnVuZV9maWxlX2xpc3Qoc2VsZik6CisgICAgICAgICIiIlBydW5lIG9mZiBicmFuY2hlcyB0aGF0IG1pZ2h0IHNsaXAgaW50byB0aGUgZmlsZSBsaXN0IGFzIGNyZWF0ZWQKKyAgICAgICAgYnkgJ3JlYWRfdGVtcGxhdGUoKScsIGJ1dCByZWFsbHkgZG9uJ3QgYmVsb25nIHRoZXJlOgorICAgICAgICAgICogdGhlIGJ1aWxkIHRyZWUgKHR5cGljYWxseSAiYnVpbGQiKQorICAgICAgICAgICogdGhlIHJlbGVhc2UgdHJlZSBpdHNlbGYgKG9ubHkgYW4gaXNzdWUgaWYgd2UgcmFuICJzZGlzdCIKKyAgICAgICAgICAgIHByZXZpb3VzbHkgd2l0aCAtLWtlZXAtdGVtcCwgb3IgaXQgYWJvcnRlZCkKKyAgICAgICAgICAqIGFueSBSQ1MsIENWUywgLnN2biwgLmhnLCAuZ2l0LCAuYnpyLCBfZGFyY3MgZGlyZWN0b3JpZXMKKyAgICAgICAgIiIiCisgICAgICAgIGJ1aWxkID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKKyAgICAgICAgYmFzZV9kaXIgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKQorCisgICAgICAgIHNlbGYuZmlsZWxpc3QuZXhjbHVkZV9wYXR0ZXJuKE5vbmUsIHByZWZpeD1idWlsZC5idWlsZF9iYXNlKQorICAgICAgICBzZWxmLmZpbGVsaXN0LmV4Y2x1ZGVfcGF0dGVybihOb25lLCBwcmVmaXg9YmFzZV9kaXIpCisKKyAgICAgICAgIyBwcnVuaW5nIG91dCB2Y3MgZGlyZWN0b3JpZXMKKyAgICAgICAgIyBib3RoIHNlcGFyYXRvcnMgYXJlIHVzZWQgdW5kZXIgd2luMzIKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICBzZXBzID0gcicvfFxcJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VwcyA9ICcvJworCisgICAgICAgIHZjc19kaXJzID0gWydSQ1MnLCAnQ1ZTJywgcidcLnN2bicsIHInXC5oZycsIHInXC5naXQnLCByJ1wuYnpyJywKKyAgICAgICAgICAgICAgICAgICAgJ19kYXJjcyddCisgICAgICAgIHZjc19wdHJuID0gcicoXnwlcykoJXMpKCVzKS4qJyAlIChzZXBzLCAnfCcuam9pbih2Y3NfZGlycyksIHNlcHMpCisgICAgICAgIHNlbGYuZmlsZWxpc3QuZXhjbHVkZV9wYXR0ZXJuKHZjc19wdHJuLCBpc19yZWdleD0xKQorCisgICAgZGVmIHdyaXRlX21hbmlmZXN0KHNlbGYpOgorICAgICAgICAiIiJXcml0ZSB0aGUgZmlsZSBsaXN0IGluICdzZWxmLmZpbGVsaXN0JyAocHJlc3VtYWJseSBhcyBmaWxsZWQgaW4KKyAgICAgICAgYnkgJ2FkZF9kZWZhdWx0cygpJyBhbmQgJ3JlYWRfdGVtcGxhdGUoKScpIHRvIHRoZSBtYW5pZmVzdCBmaWxlCisgICAgICAgIG5hbWVkIGJ5ICdzZWxmLm1hbmlmZXN0Jy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX21hbmlmZXN0X2lzX25vdF9nZW5lcmF0ZWQoKToKKyAgICAgICAgICAgIGxvZy5pbmZvKCJub3Qgd3JpdGluZyB0byBtYW51YWxseSBtYWludGFpbmVkICIKKyAgICAgICAgICAgICAgICAgICAgICJtYW5pZmVzdCBmaWxlICclcyciICUgc2VsZi5tYW5pZmVzdCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGNvbnRlbnQgPSBzZWxmLmZpbGVsaXN0LmZpbGVzWzpdCisgICAgICAgIGNvbnRlbnQuaW5zZXJ0KDAsICcjIGZpbGUgR0VORVJBVEVEIGJ5IGRpc3R1dGlscywgZG8gTk9UIGVkaXQnKQorICAgICAgICBzZWxmLmV4ZWN1dGUoZmlsZV91dGlsLndyaXRlX2ZpbGUsIChzZWxmLm1hbmlmZXN0LCBjb250ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICJ3cml0aW5nIG1hbmlmZXN0IGZpbGUgJyVzJyIgJSBzZWxmLm1hbmlmZXN0KQorCisgICAgZGVmIF9tYW5pZmVzdF9pc19ub3RfZ2VuZXJhdGVkKHNlbGYpOgorICAgICAgICAjIGNoZWNrIGZvciBzcGVjaWFsIGNvbW1lbnQgdXNlZCBpbiAyLjcuMSBhbmQgaGlnaGVyCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShzZWxmLm1hbmlmZXN0KToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGZwID0gb3BlbihzZWxmLm1hbmlmZXN0LCAnclUnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaXJzdF9saW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICByZXR1cm4gZmlyc3RfbGluZSAhPSAnIyBmaWxlIEdFTkVSQVRFRCBieSBkaXN0dXRpbHMsIGRvIE5PVCBlZGl0XG4nCisKKyAgICBkZWYgcmVhZF9tYW5pZmVzdChzZWxmKToKKyAgICAgICAgIiIiUmVhZCB0aGUgbWFuaWZlc3QgZmlsZSAobmFtZWQgYnkgJ3NlbGYubWFuaWZlc3QnKSBhbmQgdXNlIGl0IHRvCisgICAgICAgIGZpbGwgaW4gJ3NlbGYuZmlsZWxpc3QnLCB0aGUgbGlzdCBvZiBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBzb3VyY2UKKyAgICAgICAgZGlzdHJpYnV0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgbG9nLmluZm8oInJlYWRpbmcgbWFuaWZlc3QgZmlsZSAnJXMnIiwgc2VsZi5tYW5pZmVzdCkKKyAgICAgICAgbWFuaWZlc3QgPSBvcGVuKHNlbGYubWFuaWZlc3QpCisgICAgICAgIGZvciBsaW5lIGluIG1hbmlmZXN0OgorICAgICAgICAgICAgIyBpZ25vcmUgY29tbWVudHMgYW5kIGJsYW5rIGxpbmVzCisgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJyMnKSBvciBub3QgbGluZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQobGluZSkKKyAgICAgICAgbWFuaWZlc3QuY2xvc2UoKQorCisgICAgZGVmIG1ha2VfcmVsZWFzZV90cmVlKHNlbGYsIGJhc2VfZGlyLCBmaWxlcyk6CisgICAgICAgICIiIkNyZWF0ZSB0aGUgZGlyZWN0b3J5IHRyZWUgdGhhdCB3aWxsIGJlY29tZSB0aGUgc291cmNlCisgICAgICAgIGRpc3RyaWJ1dGlvbiBhcmNoaXZlLiAgQWxsIGRpcmVjdG9yaWVzIGltcGxpZWQgYnkgdGhlIGZpbGVuYW1lcyBpbgorICAgICAgICAnZmlsZXMnIGFyZSBjcmVhdGVkIHVuZGVyICdiYXNlX2RpcicsIGFuZCB0aGVuIHdlIGhhcmQgbGluayBvciBjb3B5CisgICAgICAgIChpZiBoYXJkIGxpbmtpbmcgaXMgdW5hdmFpbGFibGUpIHRob3NlIGZpbGVzIGludG8gcGxhY2UuCisgICAgICAgIEVzc2VudGlhbGx5LCB0aGlzIGR1cGxpY2F0ZXMgdGhlIGRldmVsb3BlcidzIHNvdXJjZSB0cmVlLCBidXQgaW4gYQorICAgICAgICBkaXJlY3RvcnkgbmFtZWQgYWZ0ZXIgdGhlIGRpc3RyaWJ1dGlvbiwgY29udGFpbmluZyBvbmx5IHRoZSBmaWxlcworICAgICAgICB0byBiZSBkaXN0cmlidXRlZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgQ3JlYXRlIGFsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgJ2Jhc2VfZGlyJyBuZWNlc3NhcnkgdG8KKyAgICAgICAgIyBwdXQgJ2ZpbGVzJyB0aGVyZTsgdGhlICdta3BhdGgoKScgaXMganVzdCBzbyB3ZSBkb24ndCBkaWUKKyAgICAgICAgIyBpZiB0aGUgbWFuaWZlc3QgaGFwcGVucyB0byBiZSBlbXB0eS4KKyAgICAgICAgc2VsZi5ta3BhdGgoYmFzZV9kaXIpCisgICAgICAgIGRpcl91dGlsLmNyZWF0ZV90cmVlKGJhc2VfZGlyLCBmaWxlcywgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisKKyAgICAgICAgIyBBbmQgd2FsayBvdmVyIHRoZSBsaXN0IG9mIGZpbGVzLCBlaXRoZXIgbWFraW5nIGEgaGFyZCBsaW5rIChpZgorICAgICAgICAjIG9zLmxpbmsgZXhpc3RzKSB0byBlYWNoIG9uZSB0aGF0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBpbiBpdHMKKyAgICAgICAgIyBjb3JyZXNwb25kaW5nIGxvY2F0aW9uIHVuZGVyICdiYXNlX2RpcicsIG9yIGNvcHlpbmcgZWFjaCBmaWxlCisgICAgICAgICMgdGhhdCdzIG91dC1vZi1kYXRlIGluICdiYXNlX2RpcicuICAoVXN1YWxseSwgYWxsIGZpbGVzIHdpbGwgYmUKKyAgICAgICAgIyBvdXQtb2YtZGF0ZSwgYmVjYXVzZSBieSBkZWZhdWx0IHdlIGJsb3cgYXdheSAnYmFzZV9kaXInIHdoZW4KKyAgICAgICAgIyB3ZSdyZSBkb25lIG1ha2luZyB0aGUgZGlzdHJpYnV0aW9uIGFyY2hpdmVzLikKKworICAgICAgICBpZiBoYXNhdHRyKG9zLCAnbGluaycpOiAgICAgICAgIyBjYW4gbWFrZSBoYXJkIGxpbmtzIG9uIHRoaXMgc3lzdGVtCisgICAgICAgICAgICBsaW5rID0gJ2hhcmQnCisgICAgICAgICAgICBtc2cgPSAibWFraW5nIGhhcmQgbGlua3MgaW4gJXMuLi4iICUgYmFzZV9kaXIKKyAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vcGUsIGhhdmUgdG8gY29weQorICAgICAgICAgICAgbGluayA9IE5vbmUKKyAgICAgICAgICAgIG1zZyA9ICJjb3B5aW5nIGZpbGVzIHRvICVzLi4uIiAlIGJhc2VfZGlyCisKKyAgICAgICAgaWYgbm90IGZpbGVzOgorICAgICAgICAgICAgbG9nLndhcm4oIm5vIGZpbGVzIHRvIGRpc3RyaWJ1dGUgLS0gZW1wdHkgbWFuaWZlc3Q/IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZy5pbmZvKG1zZykKKyAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZSk6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIiclcycgbm90IGEgcmVndWxhciBmaWxlIC0tIHNraXBwaW5nIiAlIGZpbGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlc3QgPSBvcy5wYXRoLmpvaW4oYmFzZV9kaXIsIGZpbGUpCisgICAgICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUoZmlsZSwgZGVzdCwgbGluaz1saW5rKQorCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhLndyaXRlX3BrZ19pbmZvKGJhc2VfZGlyKQorCisgICAgZGVmIG1ha2VfZGlzdHJpYnV0aW9uKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24ocykuICBGaXJzdCwgd2UgY3JlYXRlIHRoZSByZWxlYXNlCisgICAgICAgIHRyZWUgd2l0aCAnbWFrZV9yZWxlYXNlX3RyZWUoKSc7IHRoZW4sIHdlIGNyZWF0ZSBhbGwgcmVxdWlyZWQKKyAgICAgICAgYXJjaGl2ZSBmaWxlcyAoYWNjb3JkaW5nIHRvICdzZWxmLmZvcm1hdHMnKSBmcm9tIHRoZSByZWxlYXNlIHRyZWUuCisgICAgICAgIEZpbmFsbHksIHdlIGNsZWFuIHVwIGJ5IGJsb3dpbmcgYXdheSB0aGUgcmVsZWFzZSB0cmVlICh1bmxlc3MKKyAgICAgICAgJ3NlbGYua2VlcF90ZW1wJyBpcyB0cnVlKS4gIFRoZSBsaXN0IG9mIGFyY2hpdmUgZmlsZXMgY3JlYXRlZCBpcworICAgICAgICBzdG9yZWQgc28gaXQgY2FuIGJlIHJldHJpZXZlZCBsYXRlciBieSAnZ2V0X2FyY2hpdmVfZmlsZXMoKScuCisgICAgICAgICIiIgorICAgICAgICAjIERvbid0IHdhcm4gYWJvdXQgbWlzc2luZyBtZXRhLWRhdGEgaGVyZSAtLSBzaG91bGQgYmUgKGFuZCBpcyEpCisgICAgICAgICMgZG9uZSBlbHNld2hlcmUuCisgICAgICAgIGJhc2VfZGlyID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCkKKyAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIsIGJhc2VfZGlyKQorCisgICAgICAgIHNlbGYubWFrZV9yZWxlYXNlX3RyZWUoYmFzZV9kaXIsIHNlbGYuZmlsZWxpc3QuZmlsZXMpCisgICAgICAgIGFyY2hpdmVfZmlsZXMgPSBbXSAgICAgICAgICAgICAgIyByZW1lbWJlciBuYW1lcyBvZiBmaWxlcyB3ZSBjcmVhdGUKKyAgICAgICAgIyB0YXIgYXJjaGl2ZSBtdXN0IGJlIGNyZWF0ZWQgbGFzdCB0byBhdm9pZCBvdmVyd3JpdGUgYW5kIHJlbW92ZQorICAgICAgICBpZiAndGFyJyBpbiBzZWxmLmZvcm1hdHM6CisgICAgICAgICAgICBzZWxmLmZvcm1hdHMuYXBwZW5kKHNlbGYuZm9ybWF0cy5wb3Aoc2VsZi5mb3JtYXRzLmluZGV4KCd0YXInKSkpCisKKyAgICAgICAgZm9yIGZtdCBpbiBzZWxmLmZvcm1hdHM6CisgICAgICAgICAgICBmaWxlID0gc2VsZi5tYWtlX2FyY2hpdmUoYmFzZV9uYW1lLCBmbXQsIGJhc2VfZGlyPWJhc2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyPXNlbGYub3duZXIsIGdyb3VwPXNlbGYuZ3JvdXApCisgICAgICAgICAgICBhcmNoaXZlX2ZpbGVzLmFwcGVuZChmaWxlKQorICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGlzdF9maWxlcy5hcHBlbmQoKCdzZGlzdCcsICcnLCBmaWxlKSkKKworICAgICAgICBzZWxmLmFyY2hpdmVfZmlsZXMgPSBhcmNoaXZlX2ZpbGVzCisKKyAgICAgICAgaWYgbm90IHNlbGYua2VlcF90ZW1wOgorICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUoYmFzZV9kaXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgZGVmIGdldF9hcmNoaXZlX2ZpbGVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGxpc3Qgb2YgYXJjaGl2ZSBmaWxlcyBjcmVhdGVkIHdoZW4gdGhlIGNvbW1hbmQKKyAgICAgICAgd2FzIHJ1biwgb3IgTm9uZSBpZiB0aGUgY29tbWFuZCBoYXNuJ3QgcnVuIHlldC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmFyY2hpdmVfZmlsZXMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvc2Rpc3QucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjNmMxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvc2Rpc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvc2Rpc3QucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjNmMxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvc2Rpc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxMzMzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5CkBAIC0wLDAgKzEsMTk0IEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC51cGxvYWQKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICd1cGxvYWQnIHN1YmNvbW1hbmQgKHVwbG9hZCBwYWNrYWdlIHRvIFB5UEkpLiIiIgoraW1wb3J0IG9zCitpbXBvcnQgc29ja2V0CitpbXBvcnQgcGxhdGZvcm0KK2Zyb20gdXJsbGliMiBpbXBvcnQgdXJsb3BlbiwgUmVxdWVzdCwgSFRUUEVycm9yCitmcm9tIGJhc2U2NCBpbXBvcnQgc3RhbmRhcmRfYjY0ZW5jb2RlCitpbXBvcnQgdXJscGFyc2UKK2ltcG9ydCBjU3RyaW5nSU8gYXMgU3RyaW5nSU8KK2Zyb20gaGFzaGxpYiBpbXBvcnQgbWQ1CisKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IFB5UElSQ0NvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCitjbGFzcyB1cGxvYWQoUHlQSVJDQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJ1cGxvYWQgYmluYXJ5IHBhY2thZ2UgdG8gUHlQSSIKKworICAgIHVzZXJfb3B0aW9ucyA9IFB5UElSQ0NvbW1hbmQudXNlcl9vcHRpb25zICsgWworICAgICAgICAoJ3NpZ24nLCAncycsCisgICAgICAgICAnc2lnbiBmaWxlcyB0byB1cGxvYWQgdXNpbmcgZ3BnJyksCisgICAgICAgICgnaWRlbnRpdHk9JywgJ2knLCAnR1BHIGlkZW50aXR5IHVzZWQgdG8gc2lnbiBmaWxlcycpLAorICAgICAgICBdCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBQeVBJUkNDb21tYW5kLmJvb2xlYW5fb3B0aW9ucyArIFsnc2lnbiddCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBQeVBJUkNDb21tYW5kLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLnVzZXJuYW1lID0gJycKKyAgICAgICAgc2VsZi5wYXNzd29yZCA9ICcnCisgICAgICAgIHNlbGYuc2hvd19yZXNwb25zZSA9IDAKKyAgICAgICAgc2VsZi5zaWduID0gRmFsc2UKKyAgICAgICAgc2VsZi5pZGVudGl0eSA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBQeVBJUkNDb21tYW5kLmZpbmFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgaWYgc2VsZi5pZGVudGl0eSBhbmQgbm90IHNlbGYuc2lnbjoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICJNdXN0IHVzZSAtLXNpZ24gZm9yIC0taWRlbnRpdHkgdG8gaGF2ZSBtZWFuaW5nIgorICAgICAgICAgICAgKQorICAgICAgICBjb25maWcgPSBzZWxmLl9yZWFkX3B5cGlyYygpCisgICAgICAgIGlmIGNvbmZpZyAhPSB7fToKKyAgICAgICAgICAgIHNlbGYudXNlcm5hbWUgPSBjb25maWdbJ3VzZXJuYW1lJ10KKyAgICAgICAgICAgIHNlbGYucGFzc3dvcmQgPSBjb25maWdbJ3Bhc3N3b3JkJ10KKyAgICAgICAgICAgIHNlbGYucmVwb3NpdG9yeSA9IGNvbmZpZ1sncmVwb3NpdG9yeSddCisgICAgICAgICAgICBzZWxmLnJlYWxtID0gY29uZmlnWydyZWFsbSddCisKKyAgICAgICAgIyBnZXR0aW5nIHRoZSBwYXNzd29yZCBmcm9tIHRoZSBkaXN0cmlidXRpb24KKyAgICAgICAgIyBpZiBwcmV2aW91c2x5IHNldCBieSB0aGUgcmVnaXN0ZXIgY29tbWFuZAorICAgICAgICBpZiBub3Qgc2VsZi5wYXNzd29yZCBhbmQgc2VsZi5kaXN0cmlidXRpb24ucGFzc3dvcmQ6CisgICAgICAgICAgICBzZWxmLnBhc3N3b3JkID0gc2VsZi5kaXN0cmlidXRpb24ucGFzc3dvcmQKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmRpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk5vIGRpc3QgZmlsZSBjcmVhdGVkIGluIGVhcmxpZXIgY29tbWFuZCIpCisgICAgICAgIGZvciBjb21tYW5kLCBweXZlcnNpb24sIGZpbGVuYW1lIGluIHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXM6CisgICAgICAgICAgICBzZWxmLnVwbG9hZF9maWxlKGNvbW1hbmQsIHB5dmVyc2lvbiwgZmlsZW5hbWUpCisKKyAgICBkZWYgdXBsb2FkX2ZpbGUoc2VsZiwgY29tbWFuZCwgcHl2ZXJzaW9uLCBmaWxlbmFtZSk6CisgICAgICAgICMgTWFrZXMgc3VyZSB0aGUgcmVwb3NpdG9yeSBVUkwgaXMgY29tcGxpYW50CisgICAgICAgIHNjaGVtYSwgbmV0bG9jLCB1cmwsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50cyA9IFwKKyAgICAgICAgICAgIHVybHBhcnNlLnVybHBhcnNlKHNlbGYucmVwb3NpdG9yeSkKKyAgICAgICAgaWYgcGFyYW1zIG9yIHF1ZXJ5IG9yIGZyYWdtZW50czoKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJJbmNvbXBhdGlibGUgdXJsICVzIiAlIHNlbGYucmVwb3NpdG9yeSkKKworICAgICAgICBpZiBzY2hlbWEgbm90IGluICgnaHR0cCcsICdodHRwcycpOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoInVuc3VwcG9ydGVkIHNjaGVtYSAiICsgc2NoZW1hKQorCisgICAgICAgICMgU2lnbiBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgc2VsZi5zaWduOgorICAgICAgICAgICAgZ3BnX2FyZ3MgPSBbImdwZyIsICItLWRldGFjaC1zaWduIiwgIi1hIiwgZmlsZW5hbWVdCisgICAgICAgICAgICBpZiBzZWxmLmlkZW50aXR5OgorICAgICAgICAgICAgICAgIGdwZ19hcmdzWzI6Ml0gPSBbIi0tbG9jYWwtdXNlciIsIHNlbGYuaWRlbnRpdHldCisgICAgICAgICAgICBzcGF3bihncGdfYXJncywKKyAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgICAgICMgRmlsbCBpbiB0aGUgZGF0YSAtIHNlbmQgYWxsIHRoZSBtZXRhLWRhdGEgaW4gY2FzZSB3ZSBuZWVkIHRvCisgICAgICAgICMgcmVnaXN0ZXIgYSBuZXcgcmVsZWFzZQorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwncmInKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb250ZW50ID0gZi5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBtZXRhID0gc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEKKyAgICAgICAgZGF0YSA9IHsKKyAgICAgICAgICAgICMgYWN0aW9uCisgICAgICAgICAgICAnOmFjdGlvbic6ICdmaWxlX3VwbG9hZCcsCisgICAgICAgICAgICAncHJvdGNvbF92ZXJzaW9uJzogJzEnLAorCisgICAgICAgICAgICAjIGlkZW50aWZ5IHJlbGVhc2UKKyAgICAgICAgICAgICduYW1lJzogbWV0YS5nZXRfbmFtZSgpLAorICAgICAgICAgICAgJ3ZlcnNpb24nOiBtZXRhLmdldF92ZXJzaW9uKCksCisKKyAgICAgICAgICAgICMgZmlsZSBjb250ZW50CisgICAgICAgICAgICAnY29udGVudCc6IChvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSxjb250ZW50KSwKKyAgICAgICAgICAgICdmaWxldHlwZSc6IGNvbW1hbmQsCisgICAgICAgICAgICAncHl2ZXJzaW9uJzogcHl2ZXJzaW9uLAorICAgICAgICAgICAgJ21kNV9kaWdlc3QnOiBtZDUoY29udGVudCkuaGV4ZGlnZXN0KCksCisKKyAgICAgICAgICAgICMgYWRkaXRpb25hbCBtZXRhLWRhdGEKKyAgICAgICAgICAgICdtZXRhZGF0YV92ZXJzaW9uJyA6ICcxLjAnLAorICAgICAgICAgICAgJ3N1bW1hcnknOiBtZXRhLmdldF9kZXNjcmlwdGlvbigpLAorICAgICAgICAgICAgJ2hvbWVfcGFnZSc6IG1ldGEuZ2V0X3VybCgpLAorICAgICAgICAgICAgJ2F1dGhvcic6IG1ldGEuZ2V0X2NvbnRhY3QoKSwKKyAgICAgICAgICAgICdhdXRob3JfZW1haWwnOiBtZXRhLmdldF9jb250YWN0X2VtYWlsKCksCisgICAgICAgICAgICAnbGljZW5zZSc6IG1ldGEuZ2V0X2xpY2VuY2UoKSwKKyAgICAgICAgICAgICdkZXNjcmlwdGlvbic6IG1ldGEuZ2V0X2xvbmdfZGVzY3JpcHRpb24oKSwKKyAgICAgICAgICAgICdrZXl3b3Jkcyc6IG1ldGEuZ2V0X2tleXdvcmRzKCksCisgICAgICAgICAgICAncGxhdGZvcm0nOiBtZXRhLmdldF9wbGF0Zm9ybXMoKSwKKyAgICAgICAgICAgICdjbGFzc2lmaWVycyc6IG1ldGEuZ2V0X2NsYXNzaWZpZXJzKCksCisgICAgICAgICAgICAnZG93bmxvYWRfdXJsJzogbWV0YS5nZXRfZG93bmxvYWRfdXJsKCksCisgICAgICAgICAgICAjIFBFUCAzMTQKKyAgICAgICAgICAgICdwcm92aWRlcyc6IG1ldGEuZ2V0X3Byb3ZpZGVzKCksCisgICAgICAgICAgICAncmVxdWlyZXMnOiBtZXRhLmdldF9yZXF1aXJlcygpLAorICAgICAgICAgICAgJ29ic29sZXRlcyc6IG1ldGEuZ2V0X29ic29sZXRlcygpLAorICAgICAgICAgICAgfQorICAgICAgICBjb21tZW50ID0gJycKKyAgICAgICAgaWYgY29tbWFuZCA9PSAnYmRpc3RfcnBtJzoKKyAgICAgICAgICAgIGRpc3QsIHZlcnNpb24sIGlkID0gcGxhdGZvcm0uZGlzdCgpCisgICAgICAgICAgICBpZiBkaXN0OgorICAgICAgICAgICAgICAgIGNvbW1lbnQgPSAnYnVpbHQgZm9yICVzICVzJyAlIChkaXN0LCB2ZXJzaW9uKQorICAgICAgICBlbGlmIGNvbW1hbmQgPT0gJ2JkaXN0X2R1bWInOgorICAgICAgICAgICAgY29tbWVudCA9ICdidWlsdCBmb3IgJXMnICUgcGxhdGZvcm0ucGxhdGZvcm0odGVyc2U9MSkKKyAgICAgICAgZGF0YVsnY29tbWVudCddID0gY29tbWVudAorCisgICAgICAgIGlmIHNlbGYuc2lnbjoKKyAgICAgICAgICAgIGRhdGFbJ2dwZ19zaWduYXR1cmUnXSA9IChvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSArICIuYXNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuKGZpbGVuYW1lKyIuYXNjIikucmVhZCgpKQorCisgICAgICAgICMgc2V0IHVwIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAgICBhdXRoID0gIkJhc2ljICIgKyBzdGFuZGFyZF9iNjRlbmNvZGUoc2VsZi51c2VybmFtZSArICI6IiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhc3N3b3JkKQorCisgICAgICAgICMgQnVpbGQgdXAgdGhlIE1JTUUgcGF5bG9hZCBmb3IgdGhlIFBPU1QgZGF0YQorICAgICAgICBib3VuZGFyeSA9ICctLS0tLS0tLS0tLS0tLUdIU0tGSkRMR0RTNzU0M0ZKS0xGSFJFNzU2NDI3NTY3NDMyNTQnCisgICAgICAgIHNlcF9ib3VuZGFyeSA9ICdcbi0tJyArIGJvdW5kYXJ5CisgICAgICAgIGVuZF9ib3VuZGFyeSA9IHNlcF9ib3VuZGFyeSArICctLScKKyAgICAgICAgYm9keSA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGF0YS5pdGVtcygpOgorICAgICAgICAgICAgIyBoYW5kbGUgbXVsdGlwbGUgZW50cmllcyBmb3IgdGhlIHNhbWUgbmFtZQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgorICAgICAgICAgICAgICAgIHZhbHVlID0gW3ZhbHVlXQorICAgICAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKKyAgICAgICAgICAgICAgICAgICAgZm4gPSAnO2ZpbGVuYW1lPSIlcyInICUgdmFsdWVbMF0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsxXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZuID0gIiIKKworICAgICAgICAgICAgICAgIGJvZHkud3JpdGUoc2VwX2JvdW5kYXJ5KQorICAgICAgICAgICAgICAgIGJvZHkud3JpdGUoJ1xuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSIlcyInJWtleSkKKyAgICAgICAgICAgICAgICBib2R5LndyaXRlKGZuKQorICAgICAgICAgICAgICAgIGJvZHkud3JpdGUoIlxuXG4iKQorICAgICAgICAgICAgICAgIGJvZHkud3JpdGUodmFsdWUpCisgICAgICAgICAgICAgICAgaWYgdmFsdWUgYW5kIHZhbHVlWy0xXSA9PSAnXHInOgorICAgICAgICAgICAgICAgICAgICBib2R5LndyaXRlKCdcbicpICAjIHdyaXRlIGFuIGV4dHJhIG5ld2xpbmUgKGx1cnZlIE1hY3MpCisgICAgICAgIGJvZHkud3JpdGUoZW5kX2JvdW5kYXJ5KQorICAgICAgICBib2R5LndyaXRlKCJcbiIpCisgICAgICAgIGJvZHkgPSBib2R5LmdldHZhbHVlKCkKKworICAgICAgICBzZWxmLmFubm91bmNlKCJTdWJtaXR0aW5nICVzIHRvICVzIiAlIChmaWxlbmFtZSwgc2VsZi5yZXBvc2l0b3J5KSwgbG9nLklORk8pCisKKyAgICAgICAgIyBidWlsZCB0aGUgUmVxdWVzdAorICAgICAgICBoZWFkZXJzID0geydDb250ZW50LXR5cGUnOgorICAgICAgICAgICAgICAgICAgICAgICAgJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSVzJyAlIGJvdW5kYXJ5LAorICAgICAgICAgICAgICAgICAgICdDb250ZW50LWxlbmd0aCc6IHN0cihsZW4oYm9keSkpLAorICAgICAgICAgICAgICAgICAgICdBdXRob3JpemF0aW9uJzogYXV0aH0KKworICAgICAgICByZXF1ZXN0ID0gUmVxdWVzdChzZWxmLnJlcG9zaXRvcnksIGRhdGE9Ym9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1oZWFkZXJzKQorICAgICAgICAjIHNlbmQgdGhlIGRhdGEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gdXJsb3BlbihyZXF1ZXN0KQorICAgICAgICAgICAgc3RhdHVzID0gcmVzdWx0LmdldGNvZGUoKQorICAgICAgICAgICAgcmVhc29uID0gcmVzdWx0Lm1zZworICAgICAgICAgICAgaWYgc2VsZi5zaG93X3Jlc3BvbnNlOgorICAgICAgICAgICAgICAgIG1zZyA9ICdcbicuam9pbigoJy0nICogNzUsIHIucmVhZCgpLCAnLScgKiA3NSkpCisgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShtc2csIGxvZy5JTkZPKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShzdHIoZSksIGxvZy5FUlJPUikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQgSFRUUEVycm9yLCBlOgorICAgICAgICAgICAgc3RhdHVzID0gZS5jb2RlCisgICAgICAgICAgICByZWFzb24gPSBlLm1zZworCisgICAgICAgIGlmIHN0YXR1cyA9PSAyMDA6CisgICAgICAgICAgICBzZWxmLmFubm91bmNlKCdTZXJ2ZXIgcmVzcG9uc2UgKCVzKTogJXMnICUgKHN0YXR1cywgcmVhc29uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLklORk8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFubm91bmNlKCdVcGxvYWQgZmFpbGVkICglcyk6ICVzJyAlIChzdGF0dXMsIHJlYXNvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5FUlJPUikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzEwMjVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzEwMjVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvd2luaW5zdC02LjAuZXhlIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTYuMC5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3Yzg1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvd2luaW5zdC02LjAuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvd2luaW5zdC03LjEuZXhlIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTcuMS5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzM2JjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvd2luaW5zdC03LjEuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvd2luaW5zdC04LjAuZXhlIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTguMC5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwM2JmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvd2luaW5zdC04LjAuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvd2luaW5zdC05LjAtYW1kNjQuZXhlIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTkuMC1hbWQ2NC5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkODAxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvd2luaW5zdC05LjAtYW1kNjQuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvd2luaW5zdC05LjAuZXhlIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTkuMC5leGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkYjMxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvd2luaW5zdC05LjAuZXhlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbmZpZy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbmZpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDMyNzE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29uZmlnLnB5CkBAIC0wLDAgKzEsMTE2IEBACisiIiJkaXN0dXRpbHMucHlwaXJjCisKK1Byb3ZpZGVzIHRoZSBQeVBJUkNDb21tYW5kIGNsYXNzLCB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIGNvbW1hbmQgY2xhc3NlcwordGhhdCB1c2VzIC5weXBpcmMgaW4gdGhlIGRpc3R1dGlscy5jb21tYW5kIHBhY2thZ2UuCisiIiIKK2ltcG9ydCBvcworZnJvbSBDb25maWdQYXJzZXIgaW1wb3J0IENvbmZpZ1BhcnNlcgorCitmcm9tIGRpc3R1dGlscy5jbWQgaW1wb3J0IENvbW1hbmQKKworREVGQVVMVF9QWVBJUkMgPSAiIiJcCitbZGlzdHV0aWxzXQoraW5kZXgtc2VydmVycyA9CisgICAgcHlwaQorCitbcHlwaV0KK3VzZXJuYW1lOiVzCitwYXNzd29yZDolcworIiIiCisKK2NsYXNzIFB5UElSQ0NvbW1hbmQoQ29tbWFuZCk6CisgICAgIiIiQmFzZSBjb21tYW5kIHRoYXQga25vd3MgaG93IHRvIGhhbmRsZSB0aGUgLnB5cGlyYyBmaWxlCisgICAgIiIiCisgICAgREVGQVVMVF9SRVBPU0lUT1JZID0gJ2h0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaScKKyAgICBERUZBVUxUX1JFQUxNID0gJ3B5cGknCisgICAgcmVwb3NpdG9yeSA9IE5vbmUKKyAgICByZWFsbSA9IE5vbmUKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdyZXBvc2l0b3J5PScsICdyJywKKyAgICAgICAgICJ1cmwgb2YgcmVwb3NpdG9yeSBbZGVmYXVsdDogJXNdIiAlIFwKKyAgICAgICAgICAgIERFRkFVTFRfUkVQT1NJVE9SWSksCisgICAgICAgICgnc2hvdy1yZXNwb25zZScsIE5vbmUsCisgICAgICAgICAnZGlzcGxheSBmdWxsIHJlc3BvbnNlIHRleHQgZnJvbSBzZXJ2ZXInKV0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnc2hvdy1yZXNwb25zZSddCisKKyAgICBkZWYgX2dldF9yY19maWxlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHJjIGZpbGUgcGF0aC4iIiIKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihvcy5wYXRoLmV4cGFuZHVzZXIoJ34nKSwgJy5weXBpcmMnKQorCisgICAgZGVmIF9zdG9yZV9weXBpcmMoc2VsZiwgdXNlcm5hbWUsIHBhc3N3b3JkKToKKyAgICAgICAgIiIiQ3JlYXRlcyBhIGRlZmF1bHQgLnB5cGlyYyBmaWxlLiIiIgorICAgICAgICByYyA9IHNlbGYuX2dldF9yY19maWxlKCkKKyAgICAgICAgZiA9IG9zLmZkb3Blbihvcy5vcGVuKHJjLCBvcy5PX0NSRUFUIHwgb3MuT19XUk9OTFksIDA2MDApLCAndycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoREVGQVVMVF9QWVBJUkMgJSAodXNlcm5hbWUsIHBhc3N3b3JkKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIF9yZWFkX3B5cGlyYyhzZWxmKToKKyAgICAgICAgIiIiUmVhZHMgdGhlIC5weXBpcmMgZmlsZS4iIiIKKyAgICAgICAgcmMgPSBzZWxmLl9nZXRfcmNfZmlsZSgpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJjKToKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ1VzaW5nIFB5UEkgbG9naW4gZnJvbSAlcycgJSByYykKKyAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBzZWxmLnJlcG9zaXRvcnkgb3Igc2VsZi5ERUZBVUxUX1JFUE9TSVRPUlkKKyAgICAgICAgICAgIGNvbmZpZyA9IENvbmZpZ1BhcnNlcigpCisgICAgICAgICAgICBjb25maWcucmVhZChyYykKKyAgICAgICAgICAgIHNlY3Rpb25zID0gY29uZmlnLnNlY3Rpb25zKCkKKyAgICAgICAgICAgIGlmICdkaXN0dXRpbHMnIGluIHNlY3Rpb25zOgorICAgICAgICAgICAgICAgICMgbGV0J3MgZ2V0IHRoZSBsaXN0IG9mIHNlcnZlcnMKKyAgICAgICAgICAgICAgICBpbmRleF9zZXJ2ZXJzID0gY29uZmlnLmdldCgnZGlzdHV0aWxzJywgJ2luZGV4LXNlcnZlcnMnKQorICAgICAgICAgICAgICAgIF9zZXJ2ZXJzID0gW3NlcnZlci5zdHJpcCgpIGZvciBzZXJ2ZXIgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleF9zZXJ2ZXJzLnNwbGl0KCdcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VydmVyLnN0cmlwKCkgIT0gJyddCisgICAgICAgICAgICAgICAgaWYgX3NlcnZlcnMgPT0gW106CisgICAgICAgICAgICAgICAgICAgICMgbm90aGluZyBzZXQsIGxldCdzIHRyeSB0byBnZXQgdGhlIGRlZmF1bHQgcHlwaQorICAgICAgICAgICAgICAgICAgICBpZiAncHlwaScgaW4gc2VjdGlvbnM6CisgICAgICAgICAgICAgICAgICAgICAgICBfc2VydmVycyA9IFsncHlwaSddCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBmaWxlIGlzIG5vdCBwcm9wZXJseSBkZWZpbmVkLCByZXR1cm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYW4gZW1wdHkgZGljdAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHt9CisgICAgICAgICAgICAgICAgZm9yIHNlcnZlciBpbiBfc2VydmVyczoKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHsnc2VydmVyJzogc2VydmVyfQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50Wyd1c2VybmFtZSddID0gY29uZmlnLmdldChzZXJ2ZXIsICd1c2VybmFtZScpCisKKyAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCBwYXJhbXMKKyAgICAgICAgICAgICAgICAgICAgZm9yIGtleSwgZGVmYXVsdCBpbiAoKCdyZXBvc2l0b3J5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuREVGQVVMVF9SRVBPU0lUT1JZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdyZWFsbScsIHNlbGYuREVGQVVMVF9SRUFMTSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgncGFzc3dvcmQnLCBOb25lKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjb25maWcuaGFzX29wdGlvbihzZXJ2ZXIsIGtleSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFtrZXldID0gY29uZmlnLmdldChzZXJ2ZXIsIGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFtrZXldID0gZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFsnc2VydmVyJ10gPT0gcmVwb3NpdG9yeSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFsncmVwb3NpdG9yeSddID09IHJlcG9zaXRvcnkpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQKKyAgICAgICAgICAgIGVsaWYgJ3NlcnZlci1sb2dpbicgaW4gc2VjdGlvbnM6CisgICAgICAgICAgICAgICAgIyBvbGQgZm9ybWF0CisgICAgICAgICAgICAgICAgc2VydmVyID0gJ3NlcnZlci1sb2dpbicKKyAgICAgICAgICAgICAgICBpZiBjb25maWcuaGFzX29wdGlvbihzZXJ2ZXIsICdyZXBvc2l0b3J5Jyk6CisgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBjb25maWcuZ2V0KHNlcnZlciwgJ3JlcG9zaXRvcnknKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlcG9zaXRvcnkgPSBzZWxmLkRFRkFVTFRfUkVQT1NJVE9SWQorICAgICAgICAgICAgICAgIHJldHVybiB7J3VzZXJuYW1lJzogY29uZmlnLmdldChzZXJ2ZXIsICd1c2VybmFtZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJzogY29uZmlnLmdldChzZXJ2ZXIsICdwYXNzd29yZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcG9zaXRvcnknOiByZXBvc2l0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgJ3NlcnZlcic6IHNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICdyZWFsbSc6IHNlbGYuREVGQVVMVF9SRUFMTX0KKworICAgICAgICByZXR1cm4ge30KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgICIiIkluaXRpYWxpemUgb3B0aW9ucy4iIiIKKyAgICAgICAgc2VsZi5yZXBvc2l0b3J5ID0gTm9uZQorICAgICAgICBzZWxmLnJlYWxtID0gTm9uZQorICAgICAgICBzZWxmLnNob3dfcmVzcG9uc2UgPSAwCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiRmluYWxpemVzIG9wdGlvbnMuIiIiCisgICAgICAgIGlmIHNlbGYucmVwb3NpdG9yeSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5yZXBvc2l0b3J5ID0gc2VsZi5ERUZBVUxUX1JFUE9TSVRPUlkKKyAgICAgICAgaWYgc2VsZi5yZWFsbSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5yZWFsbSA9IHNlbGYuREVGQVVMVF9SRUFMTQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29uZmlnLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbmZpZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1MjUyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbmZpZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29uZmlnLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbmZpZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1MjUyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbmZpZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29yZS5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvcmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5NTU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvcmUucHkKQEAgLTAsMCArMSwyNDIgQEAKKyIiImRpc3R1dGlscy5jb3JlCisKK1RoZSBvbmx5IG1vZHVsZSB0aGF0IG5lZWRzIHRvIGJlIGltcG9ydGVkIHRvIHVzZSB0aGUgRGlzdHV0aWxzOyBwcm92aWRlcwordGhlICdzZXR1cCcgZnVuY3Rpb24gKHdoaWNoIGlzIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSBzZXR1cCBzY3JpcHQpLiAgQWxzbworaW5kaXJlY3RseSBwcm92aWRlcyB0aGUgRGlzdHJpYnV0aW9uIGFuZCBDb21tYW5kIGNsYXNzZXMsIGFsdGhvdWdoIHRoZXkgYXJlCityZWFsbHkgZGVmaW5lZCBpbiBkaXN0dXRpbHMuZGlzdCBhbmQgZGlzdHV0aWxzLmNtZC4KKyIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCisKK2Zyb20gZGlzdHV0aWxzLmRlYnVnIGltcG9ydCBERUJVRworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoRGlzdHV0aWxzU2V0dXBFcnJvciwgRGlzdHV0aWxzQXJnRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXN0dXRpbHNFcnJvciwgQ0NvbXBpbGVyRXJyb3IpCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBncm9rX2Vudmlyb25tZW50X2Vycm9yCisKKyMgTWFpbmx5IGltcG9ydCB0aGVzZSBzbyBzZXR1cCBzY3JpcHRzIGNhbiAiZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQiIHRoZW0uCitmcm9tIGRpc3R1dGlscy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24KK2Zyb20gZGlzdHV0aWxzLmNtZCBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMuY29uZmlnIGltcG9ydCBQeVBJUkNDb21tYW5kCitmcm9tIGRpc3R1dGlscy5leHRlbnNpb24gaW1wb3J0IEV4dGVuc2lvbgorCisjIFRoaXMgaXMgYSBiYXJlYm9uZXMgaGVscCBtZXNzYWdlIGdlbmVyYXRlZCBkaXNwbGF5ZWQgd2hlbiB0aGUgdXNlcgorIyBydW5zIHRoZSBzZXR1cCBzY3JpcHQgd2l0aCBubyBhcmd1bWVudHMgYXQgYWxsLiAgTW9yZSB1c2VmdWwgaGVscAorIyBpcyBnZW5lcmF0ZWQgd2l0aCB2YXJpb3VzIC0taGVscCBvcHRpb25zOiBnbG9iYWwgaGVscCwgbGlzdCBjb21tYW5kcywKKyMgYW5kIHBlci1jb21tYW5kIGhlbHAuCitVU0FHRSA9ICIiIlwKK3VzYWdlOiAlKHNjcmlwdClzIFtnbG9iYWxfb3B0c10gY21kMSBbY21kMV9vcHRzXSBbY21kMiBbY21kMl9vcHRzXSAuLi5dCisgICBvcjogJShzY3JpcHQpcyAtLWhlbHAgW2NtZDEgY21kMiAuLi5dCisgICBvcjogJShzY3JpcHQpcyAtLWhlbHAtY29tbWFuZHMKKyAgIG9yOiAlKHNjcmlwdClzIGNtZCAtLWhlbHAKKyIiIgorCitkZWYgZ2VuX3VzYWdlKHNjcmlwdF9uYW1lKToKKyAgICBzY3JpcHQgPSBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9uYW1lKQorICAgIHJldHVybiBVU0FHRSAlIHsnc2NyaXB0Jzogc2NyaXB0fQorCisKKyMgU29tZSBtaWxkIG1hZ2ljIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW91ciBvZiAnc2V0dXAoKScgZnJvbSAncnVuX3NldHVwKCknLgorX3NldHVwX3N0b3BfYWZ0ZXIgPSBOb25lCitfc2V0dXBfZGlzdHJpYnV0aW9uID0gTm9uZQorCisjIExlZ2FsIGtleXdvcmQgYXJndW1lbnRzIGZvciB0aGUgc2V0dXAoKSBmdW5jdGlvbgorc2V0dXBfa2V5d29yZHMgPSAoJ2Rpc3RjbGFzcycsICdzY3JpcHRfbmFtZScsICdzY3JpcHRfYXJncycsICdvcHRpb25zJywKKyAgICAgICAgICAgICAgICAgICduYW1lJywgJ3ZlcnNpb24nLCAnYXV0aG9yJywgJ2F1dGhvcl9lbWFpbCcsCisgICAgICAgICAgICAgICAgICAnbWFpbnRhaW5lcicsICdtYWludGFpbmVyX2VtYWlsJywgJ3VybCcsICdsaWNlbnNlJywKKyAgICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicsICdsb25nX2Rlc2NyaXB0aW9uJywgJ2tleXdvcmRzJywKKyAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybXMnLCAnY2xhc3NpZmllcnMnLCAnZG93bmxvYWRfdXJsJywKKyAgICAgICAgICAgICAgICAgICdyZXF1aXJlcycsICdwcm92aWRlcycsICdvYnNvbGV0ZXMnLAorICAgICAgICAgICAgICAgICAgKQorCisjIExlZ2FsIGtleXdvcmQgYXJndW1lbnRzIGZvciB0aGUgRXh0ZW5zaW9uIGNvbnN0cnVjdG9yCitleHRlbnNpb25fa2V5d29yZHMgPSAoJ25hbWUnLCAnc291cmNlcycsICdpbmNsdWRlX2RpcnMnLAorICAgICAgICAgICAgICAgICAgICAgICdkZWZpbmVfbWFjcm9zJywgJ3VuZGVmX21hY3JvcycsCisgICAgICAgICAgICAgICAgICAgICAgJ2xpYnJhcnlfZGlycycsICdsaWJyYXJpZXMnLCAncnVudGltZV9saWJyYXJ5X2RpcnMnLAorICAgICAgICAgICAgICAgICAgICAgICdleHRyYV9vYmplY3RzJywgJ2V4dHJhX2NvbXBpbGVfYXJncycsICdleHRyYV9saW5rX2FyZ3MnLAorICAgICAgICAgICAgICAgICAgICAgICdzd2lnX29wdHMnLCAnZXhwb3J0X3N5bWJvbHMnLCAnZGVwZW5kcycsICdsYW5ndWFnZScpCisKK2RlZiBzZXR1cCgqKmF0dHJzKToKKyAgICAiIiJUaGUgZ2F0ZXdheSB0byB0aGUgRGlzdHV0aWxzOiBkbyBldmVyeXRoaW5nIHlvdXIgc2V0dXAgc2NyaXB0IG5lZWRzCisgICAgdG8gZG8sIGluIGEgaGlnaGx5IGZsZXhpYmxlIGFuZCB1c2VyLWRyaXZlbiB3YXkuICBCcmllZmx5OiBjcmVhdGUgYQorICAgIERpc3RyaWJ1dGlvbiBpbnN0YW5jZTsgZmluZCBhbmQgcGFyc2UgY29uZmlnIGZpbGVzOyBwYXJzZSB0aGUgY29tbWFuZAorICAgIGxpbmU7IHJ1biBlYWNoIERpc3R1dGlscyBjb21tYW5kIGZvdW5kIHRoZXJlLCBjdXN0b21pemVkIGJ5IHRoZSBvcHRpb25zCisgICAgc3VwcGxpZWQgdG8gJ3NldHVwKCknIChhcyBrZXl3b3JkIGFyZ3VtZW50cyksIGluIGNvbmZpZyBmaWxlcywgYW5kIG9uCisgICAgdGhlIGNvbW1hbmQgbGluZS4KKworICAgIFRoZSBEaXN0cmlidXRpb24gaW5zdGFuY2UgbWlnaHQgYmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyBzdXBwbGllZCB2aWEKKyAgICB0aGUgJ2Rpc3RjbGFzcycga2V5d29yZCBhcmd1bWVudCB0byAnc2V0dXAnOyBpZiBubyBzdWNoIGNsYXNzIGlzCisgICAgc3VwcGxpZWQsIHRoZW4gdGhlIERpc3RyaWJ1dGlvbiBjbGFzcyAoaW4gZGlzdC5weSkgaXMgaW5zdGFudGlhdGVkLgorICAgIEFsbCBvdGhlciBhcmd1bWVudHMgdG8gJ3NldHVwJyAoZXhjZXB0IGZvciAnY21kY2xhc3MnKSBhcmUgdXNlZCB0byBzZXQKKyAgICBhdHRyaWJ1dGVzIG9mIHRoZSBEaXN0cmlidXRpb24gaW5zdGFuY2UuCisKKyAgICBUaGUgJ2NtZGNsYXNzJyBhcmd1bWVudCwgaWYgc3VwcGxpZWQsIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nIGNvbW1hbmQKKyAgICBuYW1lcyB0byBjb21tYW5kIGNsYXNzZXMuICBFYWNoIGNvbW1hbmQgZW5jb3VudGVyZWQgb24gdGhlIGNvbW1hbmQgbGluZQorICAgIHdpbGwgYmUgdHVybmVkIGludG8gYSBjb21tYW5kIGNsYXNzLCB3aGljaCBpcyBpbiB0dXJuIGluc3RhbnRpYXRlZDsgYW55CisgICAgY2xhc3MgZm91bmQgaW4gJ2NtZGNsYXNzJyBpcyB1c2VkIGluIHBsYWNlIG9mIHRoZSBkZWZhdWx0LCB3aGljaCBpcworICAgIChmb3IgY29tbWFuZCAnZm9vX2JhcicpIGNsYXNzICdmb29fYmFyJyBpbiBtb2R1bGUKKyAgICAnZGlzdHV0aWxzLmNvbW1hbmQuZm9vX2JhcicuICBUaGUgY29tbWFuZCBjbGFzcyBtdXN0IHByb3ZpZGUgYQorICAgICd1c2VyX29wdGlvbnMnIGF0dHJpYnV0ZSB3aGljaCBpcyBhIGxpc3Qgb2Ygb3B0aW9uIHNwZWNpZmllcnMgZm9yCisgICAgJ2Rpc3R1dGlscy5mYW5jeV9nZXRvcHQnLiAgQW55IGNvbW1hbmQtbGluZSBvcHRpb25zIGJldHdlZW4gdGhlIGN1cnJlbnQKKyAgICBhbmQgdGhlIG5leHQgY29tbWFuZCBhcmUgdXNlZCB0byBzZXQgYXR0cmlidXRlcyBvZiB0aGUgY3VycmVudCBjb21tYW5kCisgICAgb2JqZWN0LgorCisgICAgV2hlbiB0aGUgZW50aXJlIGNvbW1hbmQtbGluZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcGFyc2VkLCBjYWxscyB0aGUKKyAgICAncnVuKCknIG1ldGhvZCBvbiBlYWNoIGNvbW1hbmQgb2JqZWN0IGluIHR1cm4uICBUaGlzIG1ldGhvZCB3aWxsIGJlCisgICAgZHJpdmVuIGVudGlyZWx5IGJ5IHRoZSBEaXN0cmlidXRpb24gb2JqZWN0ICh3aGljaCBlYWNoIGNvbW1hbmQgb2JqZWN0CisgICAgaGFzIGEgcmVmZXJlbmNlIHRvLCB0aGFua3MgdG8gaXRzIGNvbnN0cnVjdG9yKSwgYW5kIHRoZQorICAgIGNvbW1hbmQtc3BlY2lmaWMgb3B0aW9ucyB0aGF0IGJlY2FtZSBhdHRyaWJ1dGVzIG9mIGVhY2ggY29tbWFuZAorICAgIG9iamVjdC4KKyAgICAiIiIKKworICAgIGdsb2JhbCBfc2V0dXBfc3RvcF9hZnRlciwgX3NldHVwX2Rpc3RyaWJ1dGlvbgorCisgICAgIyBEZXRlcm1pbmUgdGhlIGRpc3RyaWJ1dGlvbiBjbGFzcyAtLSBlaXRoZXIgY2FsbGVyLXN1cHBsaWVkIG9yCisgICAgIyBvdXIgRGlzdHJpYnV0aW9uIChzZWUgYmVsb3cpLgorICAgIGtsYXNzID0gYXR0cnMuZ2V0KCdkaXN0Y2xhc3MnKQorICAgIGlmIGtsYXNzOgorICAgICAgICBkZWwgYXR0cnNbJ2Rpc3RjbGFzcyddCisgICAgZWxzZToKKyAgICAgICAga2xhc3MgPSBEaXN0cmlidXRpb24KKworICAgIGlmICdzY3JpcHRfbmFtZScgbm90IGluIGF0dHJzOgorICAgICAgICBhdHRyc1snc2NyaXB0X25hbWUnXSA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCisgICAgaWYgJ3NjcmlwdF9hcmdzJyBub3QgaW4gYXR0cnM6CisgICAgICAgIGF0dHJzWydzY3JpcHRfYXJncyddID0gc3lzLmFyZ3ZbMTpdCisKKyAgICAjIENyZWF0ZSB0aGUgRGlzdHJpYnV0aW9uIGluc3RhbmNlLCB1c2luZyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cworICAgICMgKGllLiBldmVyeXRoaW5nIGV4Y2VwdCBkaXN0Y2xhc3MpIHRvIGluaXRpYWxpemUgaXQKKyAgICB0cnk6CisgICAgICAgIF9zZXR1cF9kaXN0cmlidXRpb24gPSBkaXN0ID0ga2xhc3MoYXR0cnMpCisgICAgZXhjZXB0IERpc3R1dGlsc1NldHVwRXJyb3IsIG1zZzoKKyAgICAgICAgaWYgJ25hbWUnIGluIGF0dHJzOgorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdCwgImVycm9yIGluICVzIHNldHVwIGNvbW1hbmQ6ICVzIiAlIFwKKyAgICAgICAgICAgICAgICAgIChhdHRyc1snbmFtZSddLCBtc2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCAiZXJyb3IgaW4gc2V0dXAgY29tbWFuZDogJXMiICUgbXNnCisKKyAgICBpZiBfc2V0dXBfc3RvcF9hZnRlciA9PSAiaW5pdCI6CisgICAgICAgIHJldHVybiBkaXN0CisKKyAgICAjIEZpbmQgYW5kIHBhcnNlIHRoZSBjb25maWcgZmlsZShzKTogdGhleSB3aWxsIG92ZXJyaWRlIG9wdGlvbnMgZnJvbQorICAgICMgdGhlIHNldHVwIHNjcmlwdCwgYnV0IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNvbW1hbmQgbGluZS4KKyAgICBkaXN0LnBhcnNlX2NvbmZpZ19maWxlcygpCisKKyAgICBpZiBERUJVRzoKKyAgICAgICAgcHJpbnQgIm9wdGlvbnMgKGFmdGVyIHBhcnNpbmcgY29uZmlnIGZpbGVzKToiCisgICAgICAgIGRpc3QuZHVtcF9vcHRpb25fZGljdHMoKQorCisgICAgaWYgX3NldHVwX3N0b3BfYWZ0ZXIgPT0gImNvbmZpZyI6CisgICAgICAgIHJldHVybiBkaXN0CisKKyAgICAjIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYW5kIG92ZXJyaWRlIGNvbmZpZyBmaWxlczsgYW55CisgICAgIyBjb21tYW5kLWxpbmUgZXJyb3JzIGFyZSB0aGUgZW5kIHVzZXIncyBmYXVsdCwgc28gdHVybiB0aGVtIGludG8KKyAgICAjIFN5c3RlbUV4aXQgdG8gc3VwcHJlc3MgdHJhY2ViYWNrcy4KKyAgICB0cnk6CisgICAgICAgIG9rID0gZGlzdC5wYXJzZV9jb21tYW5kX2xpbmUoKQorICAgIGV4Y2VwdCBEaXN0dXRpbHNBcmdFcnJvciwgbXNnOgorICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCBnZW5fdXNhZ2UoZGlzdC5zY3JpcHRfbmFtZSkgKyAiXG5lcnJvcjogJXMiICUgbXNnCisKKyAgICBpZiBERUJVRzoKKyAgICAgICAgcHJpbnQgIm9wdGlvbnMgKGFmdGVyIHBhcnNpbmcgY29tbWFuZCBsaW5lKToiCisgICAgICAgIGRpc3QuZHVtcF9vcHRpb25fZGljdHMoKQorCisgICAgaWYgX3NldHVwX3N0b3BfYWZ0ZXIgPT0gImNvbW1hbmRsaW5lIjoKKyAgICAgICAgcmV0dXJuIGRpc3QKKworICAgICMgQW5kIGZpbmFsbHksIHJ1biBhbGwgdGhlIGNvbW1hbmRzIGZvdW5kIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgaWYgb2s6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRpc3QucnVuX2NvbW1hbmRzKCkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdCwgImludGVycnVwdGVkIgorICAgICAgICBleGNlcHQgKElPRXJyb3IsIG9zLmVycm9yKSwgZXhjOgorICAgICAgICAgICAgZXJyb3IgPSBncm9rX2Vudmlyb25tZW50X2Vycm9yKGV4YykKKworICAgICAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShlcnJvciArICJcbiIpCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdCwgZXJyb3IKKworICAgICAgICBleGNlcHQgKERpc3R1dGlsc0Vycm9yLAorICAgICAgICAgICAgICAgIENDb21waWxlckVycm9yKSwgbXNnOgorICAgICAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdCwgImVycm9yOiAiICsgc3RyKG1zZykKKworICAgIHJldHVybiBkaXN0CisKKworZGVmIHJ1bl9zZXR1cChzY3JpcHRfbmFtZSwgc2NyaXB0X2FyZ3M9Tm9uZSwgc3RvcF9hZnRlcj0icnVuIik6CisgICAgIiIiUnVuIGEgc2V0dXAgc2NyaXB0IGluIGEgc29tZXdoYXQgY29udHJvbGxlZCBlbnZpcm9ubWVudCwgYW5kCisgICAgcmV0dXJuIHRoZSBEaXN0cmlidXRpb24gaW5zdGFuY2UgdGhhdCBkcml2ZXMgdGhpbmdzLiAgVGhpcyBpcyB1c2VmdWwKKyAgICBpZiB5b3UgbmVlZCB0byBmaW5kIG91dCB0aGUgZGlzdHJpYnV0aW9uIG1ldGEtZGF0YSAocGFzc2VkIGFzCisgICAga2V5d29yZCBhcmdzIGZyb20gJ3NjcmlwdCcgdG8gJ3NldHVwKCknLCBvciB0aGUgY29udGVudHMgb2YgdGhlCisgICAgY29uZmlnIGZpbGVzIG9yIGNvbW1hbmQtbGluZS4KKworICAgICdzY3JpcHRfbmFtZScgaXMgYSBmaWxlIHRoYXQgd2lsbCBiZSBydW4gd2l0aCAnZXhlY2ZpbGUoKSc7CisgICAgJ3N5cy5hcmd2WzBdJyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggJ3NjcmlwdCcgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUKKyAgICBjYWxsLiAgJ3NjcmlwdF9hcmdzJyBpcyBhIGxpc3Qgb2Ygc3RyaW5nczsgaWYgc3VwcGxpZWQsCisgICAgJ3N5cy5hcmd2WzE6XScgd2lsbCBiZSByZXBsYWNlZCBieSAnc2NyaXB0X2FyZ3MnIGZvciB0aGUgZHVyYXRpb24gb2YKKyAgICB0aGUgY2FsbC4KKworICAgICdzdG9wX2FmdGVyJyB0ZWxscyAnc2V0dXAoKScgd2hlbiB0byBzdG9wIHByb2Nlc3Npbmc7IHBvc3NpYmxlCisgICAgdmFsdWVzOgorICAgICAgaW5pdAorICAgICAgICBzdG9wIGFmdGVyIHRoZSBEaXN0cmlidXRpb24gaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZCBhbmQKKyAgICAgICAgcG9wdWxhdGVkIHdpdGggdGhlIGtleXdvcmQgYXJndW1lbnRzIHRvICdzZXR1cCgpJworICAgICAgY29uZmlnCisgICAgICAgIHN0b3AgYWZ0ZXIgY29uZmlnIGZpbGVzIGhhdmUgYmVlbiBwYXJzZWQgKGFuZCB0aGVpciBkYXRhCisgICAgICAgIHN0b3JlZCBpbiB0aGUgRGlzdHJpYnV0aW9uIGluc3RhbmNlKQorICAgICAgY29tbWFuZGxpbmUKKyAgICAgICAgc3RvcCBhZnRlciB0aGUgY29tbWFuZC1saW5lICgnc3lzLmFyZ3ZbMTpdJyBvciAnc2NyaXB0X2FyZ3MnKQorICAgICAgICBoYXZlIGJlZW4gcGFyc2VkIChhbmQgdGhlIGRhdGEgc3RvcmVkIGluIHRoZSBEaXN0cmlidXRpb24pCisgICAgICBydW4gW2RlZmF1bHRdCisgICAgICAgIHN0b3AgYWZ0ZXIgYWxsIGNvbW1hbmRzIGhhdmUgYmVlbiBydW4gKHRoZSBzYW1lIGFzIGlmICdzZXR1cCgpJworICAgICAgICBoYWQgYmVlbiBjYWxsZWQgaW4gdGhlIHVzdWFsIHdheQorCisgICAgUmV0dXJucyB0aGUgRGlzdHJpYnV0aW9uIGluc3RhbmNlLCB3aGljaCBwcm92aWRlcyBhbGwgaW5mb3JtYXRpb24KKyAgICB1c2VkIHRvIGRyaXZlIHRoZSBEaXN0dXRpbHMuCisgICAgIiIiCisgICAgaWYgc3RvcF9hZnRlciBub3QgaW4gKCdpbml0JywgJ2NvbmZpZycsICdjb21tYW5kbGluZScsICdydW4nKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImludmFsaWQgdmFsdWUgZm9yICdzdG9wX2FmdGVyJzogJXIiICUgKHN0b3BfYWZ0ZXIsKQorCisgICAgZ2xvYmFsIF9zZXR1cF9zdG9wX2FmdGVyLCBfc2V0dXBfZGlzdHJpYnV0aW9uCisgICAgX3NldHVwX3N0b3BfYWZ0ZXIgPSBzdG9wX2FmdGVyCisKKyAgICBzYXZlX2FyZ3YgPSBzeXMuYXJndgorICAgIGcgPSB7J19fZmlsZV9fJzogc2NyaXB0X25hbWV9CisgICAgbCA9IHt9CisgICAgdHJ5OgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuYXJndlswXSA9IHNjcmlwdF9uYW1lCisgICAgICAgICAgICBpZiBzY3JpcHRfYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzeXMuYXJndlsxOl0gPSBzY3JpcHRfYXJncworICAgICAgICAgICAgZiA9IG9wZW4oc2NyaXB0X25hbWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXhlYyBmLnJlYWQoKSBpbiBnLCBsCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLmFyZ3YgPSBzYXZlX2FyZ3YKKyAgICAgICAgICAgIF9zZXR1cF9zdG9wX2FmdGVyID0gTm9uZQorICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAjIEhtbSwgc2hvdWxkIHdlIGRvIHNvbWV0aGluZyBpZiBleGl0aW5nIHdpdGggYSBub24temVybyBjb2RlCisgICAgICAgICMgKGllLiBlcnJvcik/CisgICAgICAgIHBhc3MKKyAgICBleGNlcHQ6CisgICAgICAgIHJhaXNlCisKKyAgICBpZiBfc2V0dXBfZGlzdHJpYnV0aW9uIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgICAoIidkaXN0dXRpbHMuY29yZS5zZXR1cCgpJyB3YXMgbmV2ZXIgY2FsbGVkIC0tICIKKyAgICAgICAgICAgICAgICJwZXJoYXBzICclcycgaXMgbm90IGEgRGlzdHV0aWxzIHNldHVwIHNjcmlwdD8iKSAlIFwKKyAgICAgICAgICAgICAgc2NyaXB0X25hbWUKKworICAgICMgSSB3b25kZXIgaWYgdGhlIHNldHVwIHNjcmlwdCdzIG5hbWVzcGFjZSAtLSBnIGFuZCBsIC0tIHdvdWxkIGJlIG9mCisgICAgIyBhbnkgaW50ZXJlc3QgdG8gY2FsbGVycz8KKyAgICByZXR1cm4gX3NldHVwX2Rpc3RyaWJ1dGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29yZS5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb3JlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzE2YzY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29yZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29yZS5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb3JlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzE2YzY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29yZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY3lnd2luY2NvbXBpbGVyLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY3lnd2luY2NvbXBpbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDdmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jeWd3aW5jY29tcGlsZXIucHkKQEAgLTAsMCArMSw0ODQgQEAKKyIiImRpc3R1dGlscy5jeWd3aW5jY29tcGlsZXIKKworUHJvdmlkZXMgdGhlIEN5Z3dpbkNDb21waWxlciBjbGFzcywgYSBzdWJjbGFzcyBvZiBVbml4Q0NvbXBpbGVyIHRoYXQKK2hhbmRsZXMgdGhlIEN5Z3dpbiBwb3J0IG9mIHRoZSBHTlUgQyBjb21waWxlciB0byBXaW5kb3dzLiAgSXQgYWxzbyBjb250YWlucwordGhlIE1pbmd3MzJDQ29tcGlsZXIgY2xhc3Mgd2hpY2ggaGFuZGxlcyB0aGUgbWluZ3czMiBwb3J0IG9mIEdDQyAoc2FtZSBhcworY3lnd2luIGluIG5vLWN5Z3dpbiBtb2RlKS4KKyIiIgorCisjIHByb2JsZW1zOgorIworIyAqIGlmIHlvdSB1c2UgYSBtc3ZjIGNvbXBpbGVkIHB5dGhvbiB2ZXJzaW9uICgxLjUuMikKKyMgICAxLiB5b3UgaGF2ZSB0byBpbnNlcnQgYSBfX0dOVUNfXyBzZWN0aW9uIGluIGl0cyBjb25maWcuaAorIyAgIDIuIHlvdSBoYXZlIHRvIGdlbmVyYXRlIGEgaW1wb3J0IGxpYnJhcnkgZm9yIGl0cyBkbGwKKyMgICAgICAtIGNyZWF0ZSBhIGRlZi1maWxlIGZvciBweXRob24/Py5kbGwKKyMgICAgICAtIGNyZWF0ZSBhIGltcG9ydCBsaWJyYXJ5IHVzaW5nCisjICAgICAgICAgICAgIGRsbHRvb2wgLS1kbGxuYW1lIHB5dGhvbjE1LmRsbCAtLWRlZiBweXRob24xNS5kZWYgXAorIyAgICAgICAgICAgICAgICAgICAgICAgLS1vdXRwdXQtbGliIGxpYnB5dGhvbjE1LmEKKyMKKyMgICBzZWUgYWxzbyBodHRwOi8vc3RhcnNoaXAucHl0aG9uLm5ldC9jcmV3L2tlcm5yL21pbmd3MzIvTm90ZXMuaHRtbAorIworIyAqIFdlIHB1dCBleHBvcnRfc3ltYm9scyBpbiBhIGRlZi1maWxlLCBhbmQgZG9uJ3QgdXNlCisjICAgLS1leHBvcnQtYWxsLXN5bWJvbHMgYmVjYXVzZSBpdCBkb2Vzbid0IHdvcmtlZCByZWxpYWJsZSBpbiBzb21lCisjICAgdGVzdGVkIGNvbmZpZ3VyYXRpb25zLiBBbmQgYmVjYXVzZSBvdGhlciB3aW5kb3dzIGNvbXBpbGVycyBhbHNvCisjICAgbmVlZCB0aGVpciBzeW1ib2xzIHNwZWNpZmllZCB0aGlzIG5vIHNlcmlvdXMgcHJvYmxlbS4KKyMKKyMgdGVzdGVkIGNvbmZpZ3VyYXRpb25zOgorIworIyAqIGN5Z3dpbiBnY2MgMi45MS41Ny9sZCAyLjkuNC9kbGx3cmFwIDAuMi40IHdvcmtzCisjICAgKGFmdGVyIHBhdGNoaW5nIHB5dGhvbidzIGNvbmZpZy5oIGFuZCBmb3IgQysrIHNvbWUgb3RoZXIgaW5jbHVkZSBmaWxlcykKKyMgICBzZWUgYWxzbyBodHRwOi8vc3RhcnNoaXAucHl0aG9uLm5ldC9jcmV3L2tlcm5yL21pbmd3MzIvTm90ZXMuaHRtbAorIyAqIG1pbmd3MzIgZ2NjIDIuOTUuMi9sZCAyLjkuNC9kbGx3cmFwIDAuMi40IHdvcmtzCisjICAgKGxkIGRvZXNuJ3Qgc3VwcG9ydCAtc2hhcmVkLCBzbyB3ZSB1c2UgZGxsd3JhcCkKKyMgKiBjeWd3aW4gZ2NjIDIuOTUuMi9sZCAyLjEwLjkwL2RsbHdyYXAgMi4xMC45MCB3b3JrcyBub3cKKyMgICAtIGl0cyBkbGx3cmFwIGRvZXNuJ3Qgd29yaywgdGhlcmUgaXMgYSBidWcgaW4gYmludXRpbHMgMi4xMC45MAorIyAgICAgc2VlIGFsc28gaHR0cDovL3NvdXJjZXMucmVkaGF0LmNvbS9tbC9jeWd3aW4vMjAwMC0wNi9tc2cwMTI3NC5odG1sCisjICAgLSB1c2luZyBnY2MgLW1kbGwgaW5zdGVhZCBkbGx3cmFwIGRvZXNuJ3Qgd29yayB3aXRob3V0IC1zdGF0aWMgYmVjYXVzZQorIyAgICAgaXQgdHJpZXMgdG8gbGluayBhZ2FpbnN0IGRsbHMgaW5zdGVhZCB0aGVpciBpbXBvcnQgbGlicmFyaWVzLiAoSWYKKyMgICAgIGl0IGZpbmRzIHRoZSBkbGwgZmlyc3QuKQorIyAgICAgQnkgc3BlY2lmeWluZyAtc3RhdGljIHdlIGZvcmNlIGxkIHRvIGxpbmsgYWdhaW5zdCB0aGUgaW1wb3J0IGxpYnJhcmllcywKKyMgICAgIHRoaXMgaXMgd2luZG93cyBzdGFuZGFyZCBhbmQgdGhlcmUgYXJlIG5vcm1hbGx5IG5vdCB0aGUgbmVjZXNzYXJ5IHN5bWJvbHMKKyMgICAgIGluIHRoZSBkbGxzLgorIyAgICoqKiBvbmx5IHRoZSB2ZXJzaW9uIG9mIEp1bmUgMjAwMCBzaG93cyB0aGVzZSBwcm9ibGVtcworIyAqIGN5Z3dpbiBnY2MgMy4yL2xkIDIuMTMuOTAgd29ya3MKKyMgICAobGQgc3VwcG9ydHMgLXNoYXJlZCkKKyMgKiBtaW5ndyBnY2MgMy4yL2xkIDIuMTMgd29ya3MKKyMgICAobGQgc3VwcG9ydHMgLXNoYXJlZCkKKworIyBUaGlzIG1vZHVsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMS4KKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcyxzeXMsY29weQorZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBnZW5fcHJlcHJvY2Vzc19vcHRpb25zLCBnZW5fbGliX29wdGlvbnMKK2Zyb20gZGlzdHV0aWxzLnVuaXhjY29tcGlsZXIgaW1wb3J0IFVuaXhDQ29tcGlsZXIKK2Zyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgd3JpdGVfZmlsZQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFeGVjRXJyb3IsIENvbXBpbGVFcnJvciwgVW5rbm93bkZpbGVFcnJvcgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCitkZWYgZ2V0X21zdmNyKCk6CisgICAgIiIiSW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgTVNWQyBydW50aW1lIGxpYnJhcnkgaWYgUHl0aG9uIHdhcyBidWlsdAorICAgIHdpdGggTVNWQyA3LjAgb3IgbGF0ZXIuCisgICAgIiIiCisgICAgIyBGSVhNRTogbmV4dCBjb2RlIGlzIGZyb20gaXNzdWU4NzAzODIKKyAgICAjIE1TIEMtcnVudGltZSBsaWJyYXJpZXMgbmV2ZXIgc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICAgICMgTGlua2luZyB0byBhIGRpZmZlcmVudCBsaWJyYXJ5IHdpdGhvdXQgdG8gc3BlY2lmeSBjb3JyZWN0IHJ1bnRpbWUKKyAgICAjIHZlcnNpb24gZm9yIHRoZSBoZWFkZXJzIHdpbGwgbGluayByZW5hbWVkIGZ1bmN0aW9ucyB0byBtc3ZjcnQuCisgICAgIyBTZWUgaXNzdWUzMzA4OiB0aGlzIHBpZWNlIG9mIGNvZGUgaXMgcHl0aG9uIHByb2JsZW0gZXZlbgorICAgICMgd2l0aCBjb3JyZWN0IHczMmFwaSBoZWFkZXJzLgorICAgICMgSXNzdWU6IGZvciBNU1ZDIGNvbXBpbGVyIHdlIGNhbiBnZXQgdGhlIHZlcnNpb24gYW5kIGZyb20gdmVyc2lvbgorICAgICMgdG8gZGV0ZXJtaW5lIG1jdmNydCBhcyBjb2RlIGJlbG93LiBCdXQgd2hhdCBhYm91dCBpZiBweXRob24gaXMKKyAgICAjIGJ1aWxkIHdpdGggR0NDIGNvbXBpbGVyPworICAgICMgT3V0cHV0IG9mIHN5cy52ZXJzaW9uIGlzIGluZm9ybWF0aW9uIGZvciBweXRob24gYnVpbGQgb24gZmlyc3QKKyAgICAjIGxpbmUsIG9uIHRoZSBuZXh0IGxpbmUgaXMgaW5mb3JtYXRpb24gZm9yIHRoZSBjb21waWxlciBhbmQgdGhlCisgICAgIyBvdXRwdXQgbGFjayBpbmZvcm1hdGlvbiBmb3IgdGhlIEMtcnVudGltZS4KKyAgICBtc2NfcG9zID0gc3lzLnZlcnNpb24uZmluZCgnTVNDIHYuJykKKyAgICBpZiBtc2NfcG9zICE9IC0xOgorICAgICAgICBtc2NfdmVyID0gc3lzLnZlcnNpb25bbXNjX3Bvcys2Om1zY19wb3MrMTBdCisgICAgICAgIGlmIG1zY192ZXIgPT0gJzEzMDAnOgorICAgICAgICAgICAgIyBNU1ZDIDcuMAorICAgICAgICAgICAgcmV0dXJuIFsnbXN2Y3I3MCddCisgICAgICAgIGVsaWYgbXNjX3ZlciA9PSAnMTMxMCc6CisgICAgICAgICAgICAjIE1TVkMgNy4xCisgICAgICAgICAgICByZXR1cm4gWydtc3ZjcjcxJ10KKyAgICAgICAgZWxpZiBtc2NfdmVyID09ICcxNDAwJzoKKyAgICAgICAgICAgICMgVlMyMDA1IC8gTVNWQyA4LjAKKyAgICAgICAgICAgIHJldHVybiBbJ21zdmNyODAnXQorICAgICAgICBlbGlmIG1zY192ZXIgPT0gJzE1MDAnOgorICAgICAgICAgICAgIyBWUzIwMDggLyBNU1ZDIDkuMAorICAgICAgICAgICAgcmV0dXJuIFsnbXN2Y3I5MCddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmtub3duIE1TIENvbXBpbGVyIHZlcnNpb24gJXMgIiAlIG1zY192ZXIpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIFtdCisKKworY2xhc3MgQ3lnd2luQ0NvbXBpbGVyIChVbml4Q0NvbXBpbGVyKToKKworICAgIGNvbXBpbGVyX3R5cGUgPSAnY3lnd2luJworICAgIG9ial9leHRlbnNpb24gPSAiLm8iCisgICAgc3RhdGljX2xpYl9leHRlbnNpb24gPSAiLmEiCisgICAgc2hhcmVkX2xpYl9leHRlbnNpb24gPSAiLmRsbCIKKyAgICAjIEZJWE1FOiBkeWxpYl8uLi4gPSAiLmRsbC5hIiBpcyBub3QgZW5vdWdodCBmb3IgYmludXRpbHMKKyAgICAjIGxvYWRlciBvbiB3aW4zMiBwbGF0Zm9ybSAhISEKKyAgICBkeWxpYl9saWJfZXh0ZW5zaW9uID0gIi5kbGwuYSIKKyAgICBzdGF0aWNfbGliX2Zvcm1hdCA9ICJsaWIlcyVzIgorICAgIHNoYXJlZF9saWJfZm9ybWF0ID0gIiVzJXMiCisgICAgZXhlX2V4dGVuc2lvbiA9ICIuZXhlIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwgZm9yY2U9MCk6CisKKyAgICAgICAgVW5peENDb21waWxlci5fX2luaXRfXyAoc2VsZiwgdmVyYm9zZSwgZHJ5X3J1biwgZm9yY2UpCisKKyAgICAgICAgKHN0YXR1cywgZGV0YWlscykgPSBjaGVja19jb25maWdfaCgpCisgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoIlB5dGhvbidzIEdDQyBzdGF0dXM6ICVzIChkZXRhaWxzOiAlcykiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHVzLCBkZXRhaWxzKSkKKyAgICAgICAgaWYgc3RhdHVzIGlzIG5vdCBDT05GSUdfSF9PSzoKKyAgICAgICAgICAgIHNlbGYud2FybigKKyAgICAgICAgICAgICAgICAiUHl0aG9uJ3MgcHljb25maWcuaCBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCB5b3VyIGNvbXBpbGVyLiAiCisgICAgICAgICAgICAgICAgIlJlYXNvbjogJXMuICIKKyAgICAgICAgICAgICAgICAiQ29tcGlsaW5nIG1heSBmYWlsIGJlY2F1c2Ugb2YgdW5kZWZpbmVkIHByZXByb2Nlc3NvciBtYWNyb3MuIgorICAgICAgICAgICAgICAgICUgZGV0YWlscykKKworICAgICAgICAjIE5leHQgbGluZSBvZiBjb2RlIGlzIHByb2JsZW0gZm9yIGNyb3NzLWNvbXBpbGVkIGVudmlyb21lbnQ6CisgICAgICAgICMgTk9URTogR0NDIGNyb3NzLWNvbXBpbGVyIGlzIHByZWZpeGVkIGJ5IHRoZSA8aG9zdGFyY2g+LTxob3N0b3M+LQorICAgICAgICAjIGFuZCBieSBkZWZhdWx0IGJpbmFyaWVzIGFyZSBpbnN0YWxsZWQgaW4gc2FtZSBkaXJlY3RvcnkKKyAgICAgICAgIyBhcyBuYXRpdmUgY29tcGlsZXIuCisgICAgICAgIHNlbGYuZ2NjX3ZlcnNpb24sIHNlbGYubGRfdmVyc2lvbiwgc2VsZi5kbGx3cmFwX3ZlcnNpb24gPSBcCisgICAgICAgICAgICBnZXRfdmVyc2lvbnMoKQorICAgICAgICBzZWxmLmRlYnVnX3ByaW50KHNlbGYuY29tcGlsZXJfdHlwZSArICI6IGdjYyAlcywgbGQgJXMsIGRsbHdyYXAgJXNcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmdjY192ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxkX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGxsd3JhcF92ZXJzaW9uKSApCisKKyAgICAgICAgIyBsZF92ZXJzaW9uID49ICIyLjEwLjkwIiBhbmQgPCAiMi4xMyIgc2hvdWxkIGFsc28gYmUgYWJsZSB0byB1c2UKKyAgICAgICAgIyBnY2MgLW1kbGwgaW5zdGVhZCBvZiBkbGx3cmFwCisgICAgICAgICMgT2xkZXIgZGxsd3JhcHMgaGFkIG93biB2ZXJzaW9uIG51bWJlcnMsIG5ld2VyIG9uZXMgdXNlIHRoZQorICAgICAgICAjIHNhbWUgYXMgdGhlIHJlc3Qgb2YgYmludXRpbHMgKCBhbHNvIGxkICkKKyAgICAgICAgIyBkbGx3cmFwIDIuMTAuOTAgaXMgYnVnZ3kKKyAgICAgICAgaWYgc2VsZi5sZF92ZXJzaW9uID49ICIyLjEwLjkwIjoKKyAgICAgICAgICAgIHNlbGYubGlua2VyX2RsbCA9ICJnY2MiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxpbmtlcl9kbGwgPSAiZGxsd3JhcCIKKworICAgICAgICAjIGxkX3ZlcnNpb24gPj0gIjIuMTMiIHN1cHBvcnQgLXNoYXJlZCBzbyB1c2UgaXQgaW5zdGVhZCBvZgorICAgICAgICAjIC1tZGxsIC1zdGF0aWMKKyAgICAgICAgaWYgc2VsZi5sZF92ZXJzaW9uID49ICIyLjEzIjoKKyAgICAgICAgICAgIHNoYXJlZF9vcHRpb24gPSAiLXNoYXJlZCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNoYXJlZF9vcHRpb24gPSAiLW1kbGwgLXN0YXRpYyIKKworICAgICAgICAjIEZJWE1FOgorICAgICAgICAjIEhhcmQtY29kZSBtYXkgb3ZlcnJpZGUgdW5peC1jb21waWxlciBzZXR0aW5ncyBhbmQgaXNuJ3QKKyAgICAgICAgIyBwb3NzaWJsZSB0byB1c2UgTWFrZWZpbGUgdmFyaWFibGVzIHRvIHBhc3MgY29ycmVjdCBmbGFncyAhCisgICAgICAgICMgSGFyZC1jb2RlIEdDQyBiZWNhdXNlIHRoYXQncyB3aGF0IHRoaXMgaXMgYWxsIGFib3V0LgorICAgICAgICAjIFhYWCBvcHRpbWl6YXRpb24sIHdhcm5pbmdzIGV0Yy4gc2hvdWxkIGJlIGN1c3RvbWl6YWJsZS4KKyAgICAgICAgc2VsZi5zZXRfZXhlY3V0YWJsZXMoY29tcGlsZXI9J2djYyAtbWN5Z3dpbiAtTyAtV2FsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyX3NvPSdnY2MgLW1jeWd3aW4gLW1kbGwgLU8gLVdhbGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlcl9jeHg9J2crKyAtbWN5Z3dpbiAtTyAtV2FsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlcl9leGU9J2djYyAtbWN5Z3dpbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlcl9zbz0oJyVzIC1tY3lnd2luICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYubGlua2VyX2RsbCwgc2hhcmVkX29wdGlvbikpKQorCisgICAgICAgICMgY3lnd2luIGFuZCBtaW5ndzMyIG5lZWQgZGlmZmVyZW50IHNldHMgb2YgbGlicmFyaWVzCisgICAgICAgIGlmIHNlbGYuZ2NjX3ZlcnNpb24gPT0gIjIuOTEuNTciOgorICAgICAgICAgICAgIyBjeWd3aW4gc2hvdWxkbid0IG5lZWQgbXN2Y3J0LCBidXQgd2l0aG91dCB0aGUgZGxscyB3aWxsIGNyYXNoCisgICAgICAgICAgICAjIChnY2MgdmVyc2lvbiAyLjkxLjU3KSAtLSBwZXJoYXBzIHNvbWV0aGluZyBhYm91dCBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgc2VsZi5kbGxfbGlicmFyaWVzPVsibXN2Y3J0Il0KKyAgICAgICAgICAgIHNlbGYud2FybigKKyAgICAgICAgICAgICAgICAiQ29uc2lkZXIgdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBnY2MiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBJbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBNU1ZDIHJ1bnRpbWUgbGlicmFyeSBpZiBQeXRob24gd2FzIGJ1aWx0CisgICAgICAgICAgICAjIHdpdGggTVNWQyA3LjAgb3IgbGF0ZXIuCisgICAgICAgICAgICBzZWxmLmRsbF9saWJyYXJpZXMgPSBnZXRfbXN2Y3IoKQorCisgICAgIyBfX2luaXRfXyAoKQorCisKKyAgICBkZWYgX2NvbXBpbGUoc2VsZiwgb2JqLCBzcmMsIGV4dCwgY2NfYXJncywgZXh0cmFfcG9zdGFyZ3MsIHBwX29wdHMpOgorICAgICAgICBpZiBleHQgPT0gJy5yYycgb3IgZXh0ID09ICcucmVzJzoKKyAgICAgICAgICAgICMgZ2NjIG5lZWRzICcucmVzJyBhbmQgJy5yYycgY29tcGlsZWQgdG8gb2JqZWN0IGZpbGVzICEhIQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24oWyJ3aW5kcmVzIiwgIi1pIiwgc3JjLCAiLW8iLCBvYmpdKQorICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciwgbXNnCisgICAgICAgIGVsc2U6ICMgZm9yIG90aGVyIGZpbGVzIHVzZSB0aGUgQy1jb21waWxlcgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24oc2VsZi5jb21waWxlcl9zbyArIGNjX2FyZ3MgKyBbc3JjLCAnLW8nLCBvYmpdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzKQorICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciwgbXNnCisKKyAgICBkZWYgbGluayAoc2VsZiwKKyAgICAgICAgICAgICAgdGFyZ2V0X2Rlc2MsCisgICAgICAgICAgICAgIG9iamVjdHMsCisgICAgICAgICAgICAgIG91dHB1dF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICAgICAgICBsaWJyYXJpZXM9Tm9uZSwKKyAgICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgIGV4cG9ydF9zeW1ib2xzPU5vbmUsCisgICAgICAgICAgICAgIGRlYnVnPTAsCisgICAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgYnVpbGRfdGVtcD1Ob25lLAorICAgICAgICAgICAgICB0YXJnZXRfbGFuZz1Ob25lKToKKworICAgICAgICAjIHVzZSBzZXBhcmF0ZSBjb3BpZXMsIHNvIHdlIGNhbiBtb2RpZnkgdGhlIGxpc3RzCisgICAgICAgIGV4dHJhX3ByZWFyZ3MgPSBjb3B5LmNvcHkoZXh0cmFfcHJlYXJncyBvciBbXSkKKyAgICAgICAgbGlicmFyaWVzID0gY29weS5jb3B5KGxpYnJhcmllcyBvciBbXSkKKyAgICAgICAgb2JqZWN0cyA9IGNvcHkuY29weShvYmplY3RzIG9yIFtdKQorCisgICAgICAgICMgQWRkaXRpb25hbCBsaWJyYXJpZXMKKyAgICAgICAgbGlicmFyaWVzLmV4dGVuZChzZWxmLmRsbF9saWJyYXJpZXMpCisKKyAgICAgICAgIyBoYW5kbGUgZXhwb3J0IHN5bWJvbHMgYnkgY3JlYXRpbmcgYSBkZWYtZmlsZQorICAgICAgICAjIHdpdGggZXhlY3V0YWJsZXMgdGhpcyBvbmx5IHdvcmtzIHdpdGggZ2NjL2xkIGFzIGxpbmtlcgorICAgICAgICBpZiAoKGV4cG9ydF9zeW1ib2xzIGlzIG5vdCBOb25lKSBhbmQKKyAgICAgICAgICAgICh0YXJnZXRfZGVzYyAhPSBzZWxmLkVYRUNVVEFCTEUgb3Igc2VsZi5saW5rZXJfZGxsID09ICJnY2MiKSk6CisgICAgICAgICAgICAjIChUaGUgbGlua2VyIGRvZXNuJ3QgZG8gYW55dGhpbmcgaWYgb3V0cHV0IGlzIHVwLXRvLWRhdGUuCisgICAgICAgICAgICAjIFNvIGl0IHdvdWxkIHByb2JhYmx5IGJldHRlciB0byBjaGVjayBpZiB3ZSByZWFsbHkgbmVlZCB0aGlzLAorICAgICAgICAgICAgIyBidXQgZm9yIHRoaXMgd2UgaGFkIHRvIGluc2VydCBzb21lIHVuY2hhbmdlZCBwYXJ0cyBvZgorICAgICAgICAgICAgIyBVbml4Q0NvbXBpbGVyLCBhbmQgdGhpcyBpcyBub3Qgd2hhdCB3ZSB3YW50LikKKworICAgICAgICAgICAgIyB3ZSB3YW50IHRvIHB1dCBzb21lIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUKKyAgICAgICAgICAgICMgb2JqZWN0IGZpbGVzIGFyZSwgYnVpbGRfdGVtcCBkb2Vzbid0IGhlbHAgbXVjaAorICAgICAgICAgICAgIyB3aGVyZSBhcmUgdGhlIG9iamVjdCBmaWxlcworICAgICAgICAgICAgdGVtcF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob2JqZWN0c1swXSkKKyAgICAgICAgICAgICMgbmFtZSBvZiBkbGwgdG8gZ2l2ZSB0aGUgaGVscGVyIGZpbGVzIHRoZSBzYW1lIGJhc2UgbmFtZQorICAgICAgICAgICAgKGRsbF9uYW1lLCBkbGxfZXh0ZW5zaW9uKSA9IG9zLnBhdGguc3BsaXRleHQoCisgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShvdXRwdXRfZmlsZW5hbWUpKQorCisgICAgICAgICAgICAjIGdlbmVyYXRlIHRoZSBmaWxlbmFtZXMgZm9yIHRoZXNlIGZpbGVzCisgICAgICAgICAgICBkZWZfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgZGxsX25hbWUgKyAiLmRlZiIpCisgICAgICAgICAgICBsaWJfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgJ2xpYicgKyBkbGxfbmFtZSArICIuYSIpCisKKyAgICAgICAgICAgICMgR2VuZXJhdGUgLmRlZiBmaWxlCisgICAgICAgICAgICBjb250ZW50cyA9IFsKKyAgICAgICAgICAgICAgICAiTElCUkFSWSAlcyIgJSBvcy5wYXRoLmJhc2VuYW1lKG91dHB1dF9maWxlbmFtZSksCisgICAgICAgICAgICAgICAgIkVYUE9SVFMiXQorICAgICAgICAgICAgZm9yIHN5bSBpbiBleHBvcnRfc3ltYm9sczoKKyAgICAgICAgICAgICAgICBjb250ZW50cy5hcHBlbmQoc3ltKQorICAgICAgICAgICAgc2VsZi5leGVjdXRlKHdyaXRlX2ZpbGUsIChkZWZfZmlsZSwgY29udGVudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0aW5nICVzIiAlIGRlZl9maWxlKQorCisgICAgICAgICAgICAjIG5leHQgYWRkIG9wdGlvbnMgZm9yIGRlZi1maWxlIGFuZCB0byBjcmVhdGluZyBpbXBvcnQgbGlicmFyaWVzCisKKyAgICAgICAgICAgICMgZGxsd3JhcCB1c2VzIGRpZmZlcmVudCBvcHRpb25zIHRoYW4gZ2NjL2xkCisgICAgICAgICAgICBpZiBzZWxmLmxpbmtlcl9kbGwgPT0gImRsbHdyYXAiOgorICAgICAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3MuZXh0ZW5kKFsiLS1vdXRwdXQtbGliIiwgbGliX2ZpbGVdKQorICAgICAgICAgICAgICAgICMgZm9yIGRsbHdyYXAgd2UgaGF2ZSB0byB1c2UgYSBzcGVjaWFsIG9wdGlvbgorICAgICAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3MuZXh0ZW5kKFsiLS1kZWYiLCBkZWZfZmlsZV0pCisgICAgICAgICAgICAjIHdlIHVzZSBnY2MvbGQgaGVyZSBhbmQgY2FuIGJlIHN1cmUgbGQgaXMgPj0gMi45LjEwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgZG9lc24ndCB3b3JrOiBiZmRfY2xvc2UgYnVpbGRcLi4uXGxpYmZvby5hOiBJbnZhbGlkIG9wZXJhdGlvbgorICAgICAgICAgICAgICAgICNleHRyYV9wcmVhcmdzLmV4dGVuZChbIi1XbCwtLW91dC1pbXBsaWIsJXMiICUgbGliX2ZpbGVdKQorICAgICAgICAgICAgICAgICMgZm9yIGdjYy9sZCB0aGUgZGVmLWZpbGUgaXMgc3BlY2lmaWVkIGFzIGFueSBvYmplY3QgZmlsZXMKKyAgICAgICAgICAgICAgICBvYmplY3RzLmFwcGVuZChkZWZfZmlsZSkKKworICAgICAgICAjZW5kOiBpZiAoKGV4cG9ydF9zeW1ib2xzIGlzIG5vdCBOb25lKSBhbmQKKyAgICAgICAgIyAgICAgICAgKHRhcmdldF9kZXNjICE9IHNlbGYuRVhFQ1VUQUJMRSBvciBzZWxmLmxpbmtlcl9kbGwgPT0gImdjYyIpKToKKworICAgICAgICAjIHdobyB3YW50cyBzeW1ib2xzIGFuZCBhIG1hbnkgdGltZXMgbGFyZ2VyIG91dHB1dCBmaWxlCisgICAgICAgICMgc2hvdWxkIGV4cGxpY2l0bHkgc3dpdGNoIHRoZSBkZWJ1ZyBtb2RlIG9uCisgICAgICAgICMgb3RoZXJ3aXNlIHdlIGxldCBkbGx3cmFwL2xkIHN0cmlwIHRoZSBvdXRwdXQgZmlsZQorICAgICAgICAjIChPbiBteSBtYWNoaW5lOiAxMEtCIDwgc3RyaXBwZWRfZmlsZSA8ID8/MTAwS0IKKyAgICAgICAgIyAgIHVuc3RyaXBwZWRfZmlsZSA9IHN0cmlwcGVkX2ZpbGUgKyBYWFggS0IKKyAgICAgICAgIyAgKCBYWFg9MjU0IGZvciBhIHR5cGljYWwgcHl0aG9uIGV4dGVuc2lvbikpCisgICAgICAgIGlmIG5vdCBkZWJ1ZzoKKyAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3MuYXBwZW5kKCItcyIpCisKKyAgICAgICAgVW5peENDb21waWxlci5saW5rKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCAjIGV4cG9ydF9zeW1ib2xzLCB3ZSBkbyB0aGlzIGluIG91ciBkZWYtZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wcmVhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZF90ZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2xhbmcpCisKKyAgICAjIGxpbmsgKCkKKworICAgICMgLS0gTWlzY2VsbGFuZW91cyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAjIG92ZXJ3cml0ZSB0aGUgb25lIGZyb20gQ0NvbXBpbGVyIHRvIHN1cHBvcnQgcmMgYW5kIHJlcy1maWxlcworICAgIGRlZiBvYmplY3RfZmlsZW5hbWVzIChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfZmlsZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcF9kaXI9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj0nJyk6CisgICAgICAgIGlmIG91dHB1dF9kaXIgaXMgTm9uZTogb3V0cHV0X2RpciA9ICcnCisgICAgICAgIG9ial9uYW1lcyA9IFtdCisgICAgICAgIGZvciBzcmNfbmFtZSBpbiBzb3VyY2VfZmlsZW5hbWVzOgorICAgICAgICAgICAgIyBGSVhNRTogImJvZ3VzIGNoZWNrcyBmb3Igc3VmZml4IiAtIGFzIGV4YW1wbGUgdGhlIGNvbW1lbnRlZAorICAgICAgICAgICAgIyBieSAjQk9HVVMjIGNvZGUgYnJlYWsgdmFsaWQgYXNzZW1ibGVyIHN1ZmZpeCAiLlMiICEKKyAgICAgICAgICAgICNCT0dVUyMjIHVzZSBub3JtY2FzZSB0byBtYWtlIHN1cmUgJy5yYycgaXMgcmVhbGx5ICcucmMnIGFuZCBub3QgJy5SQycKKyAgICAgICAgICAgICNCT0dVUyNiYXNlLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGgubm9ybWNhc2Uoc3JjX25hbWUpKQorICAgICAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dCAoc3JjX25hbWUpCisgICAgICAgICAgICBleHRfbm9ybWNhc2UgPSBvcy5wYXRoLm5vcm1jYXNlKGV4dCkKKyAgICAgICAgICAgIGlmIGV4dF9ub3JtY2FzZSBpbiBbJy5yYycsJy5yZXMnXToKKyAgICAgICAgICAgICAgICBleHQgPSBleHRfbm9ybWNhc2UKKyAgICAgICAgICAgIGlmIGV4dCBub3QgaW4gKHNlbGYuc3JjX2V4dGVuc2lvbnMgKyBbJy5yYycsJy5yZXMnXSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVW5rbm93bkZpbGVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGZpbGUgdHlwZSAnJXMnIChmcm9tICclcycpIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAoZXh0LCBzcmNfbmFtZSkKKyAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLnNwbGl0ZHJpdmUoYmFzZSlbMV0gIyBDaG9wIG9mZiB0aGUgZHJpdmUKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlW29zLnBhdGguaXNhYnMoYmFzZSk6XSAgIyBJZiBhYnMsIGNob3Agb2ZmIGxlYWRpbmcgLworICAgICAgICAgICAgaWYgc3RyaXBfZGlyOgorICAgICAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLmJhc2VuYW1lIChiYXNlKQorICAgICAgICAgICAgaWYgZXh0ID09ICcucmVzJyBvciBleHQgPT0gJy5yYyc6CisgICAgICAgICAgICAgICAgIyB0aGVzZSBuZWVkIHRvIGJlIGNvbXBpbGVkIHRvIG9iamVjdCBmaWxlcworICAgICAgICAgICAgICAgIG9ial9uYW1lcy5hcHBlbmQgKG9zLnBhdGguam9pbiAob3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIGV4dCArIHNlbGYub2JqX2V4dGVuc2lvbikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9ial9uYW1lcy5hcHBlbmQgKG9zLnBhdGguam9pbiAob3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIHNlbGYub2JqX2V4dGVuc2lvbikpCisgICAgICAgIHJldHVybiBvYmpfbmFtZXMKKworICAgICMgb2JqZWN0X2ZpbGVuYW1lcyAoKQorCisjIGNsYXNzIEN5Z3dpbkNDb21waWxlcgorCisKKyMgdGhlIHNhbWUgYXMgY3lnd2luIHBsdXMgc29tZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMKK2NsYXNzIE1pbmd3MzJDQ29tcGlsZXIgKEN5Z3dpbkNDb21waWxlcik6CisKKyAgICBjb21waWxlcl90eXBlID0gJ21pbmd3MzInCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsCisgICAgICAgICAgICAgICAgICB2ZXJib3NlPTAsCisgICAgICAgICAgICAgICAgICBkcnlfcnVuPTAsCisgICAgICAgICAgICAgICAgICBmb3JjZT0wKToKKworICAgICAgICBDeWd3aW5DQ29tcGlsZXIuX19pbml0X18gKHNlbGYsIHZlcmJvc2UsIGRyeV9ydW4sIGZvcmNlKQorCisgICAgICAgICMgbGRfdmVyc2lvbiA+PSAiMi4xMyIgc3VwcG9ydCAtc2hhcmVkIHNvIHVzZSBpdCBpbnN0ZWFkIG9mCisgICAgICAgICMgLW1kbGwgLXN0YXRpYworICAgICAgICBpZiBzZWxmLmxkX3ZlcnNpb24gPj0gIjIuMTMiOgorICAgICAgICAgICAgc2hhcmVkX29wdGlvbiA9ICItc2hhcmVkIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2hhcmVkX29wdGlvbiA9ICItbWRsbCAtc3RhdGljIgorCisgICAgICAgICMgQSByZWFsIG1pbmd3MzIgZG9lc24ndCBuZWVkIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgZW50cnkgcG9pbnQsCisgICAgICAgICMgYnV0IGN5Z3dpbiAyLjkxLjU3IGluIG5vLWN5Z3dpbi1tb2RlIG5lZWRzIGl0LgorICAgICAgICBpZiBzZWxmLmdjY192ZXJzaW9uIDw9ICIyLjkxLjU3IjoKKyAgICAgICAgICAgIGVudHJ5X3BvaW50ID0gJy0tZW50cnkgX0RsbE1haW5AMTInCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnRyeV9wb2ludCA9ICcnCisKKyAgICAgICAgc2VsZi5zZXRfZXhlY3V0YWJsZXMoY29tcGlsZXI9J2djYyAtbW5vLWN5Z3dpbiAtTyAtV2FsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyX3NvPSdnY2MgLW1uby1jeWd3aW4gLW1kbGwgLU8gLVdhbGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlcl9jeHg9J2crKyAtbW5vLWN5Z3dpbiAtTyAtV2FsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlcl9leGU9J2djYyAtbW5vLWN5Z3dpbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlcl9zbz0nJXMgLW1uby1jeWd3aW4gJXMgJXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5saW5rZXJfZGxsLCBzaGFyZWRfb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5X3BvaW50KSkKKyAgICAgICAgIyBNYXliZSB3ZSBzaG91bGQgYWxzbyBhcHBlbmQgLW10aHJlYWRzLCBidXQgdGhlbiB0aGUgZmluaXNoZWQKKyAgICAgICAgIyBkbGxzIG5lZWQgYW5vdGhlciBkbGwgKG1pbmd3bTEwLmRsbCBzZWUgTWluZ3czMiBkb2NzKQorICAgICAgICAjICgtbXRocmVhZHM6IFN1cHBvcnQgdGhyZWFkLXNhZmUgZXhjZXB0aW9uIGhhbmRsaW5nIG9uIGBNaW5ndzMyJykKKworICAgICAgICAjIG5vIGFkZGl0aW9uYWwgbGlicmFyaWVzIG5lZWRlZAorICAgICAgICBzZWxmLmRsbF9saWJyYXJpZXM9W10KKworICAgICAgICAjIEluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIE1TVkMgcnVudGltZSBsaWJyYXJ5IGlmIFB5dGhvbiB3YXMgYnVpbHQKKyAgICAgICAgIyB3aXRoIE1TVkMgNy4wIG9yIGxhdGVyLgorICAgICAgICBzZWxmLmRsbF9saWJyYXJpZXMgPSBnZXRfbXN2Y3IoKQorCisgICAgIyBfX2luaXRfXyAoKQorCisjIGNsYXNzIE1pbmd3MzJDQ29tcGlsZXIKKworIyBCZWNhdXNlIHRoZXNlIGNvbXBpbGVycyBhcmVuJ3QgY29uZmlndXJlZCBpbiBQeXRob24ncyBweWNvbmZpZy5oIGZpbGUgYnkKKyMgZGVmYXVsdCwgd2Ugc2hvdWxkIGF0IGxlYXN0IHdhcm4gdGhlIHVzZXIgaWYgaGUgaXMgdXNpbmcgYSB1bm1vZGlmaWVkCisjIHZlcnNpb24uCisKK0NPTkZJR19IX09LID0gIm9rIgorQ09ORklHX0hfTk9UT0sgPSAibm90IG9rIgorQ09ORklHX0hfVU5DRVJUQUlOID0gInVuY2VydGFpbiIKKworZGVmIGNoZWNrX2NvbmZpZ19oKCk6CisKKyAgICAiIiJDaGVjayBpZiB0aGUgY3VycmVudCBQeXRob24gaW5zdGFsbGF0aW9uIChzcGVjaWZpY2FsbHksIHB5Y29uZmlnLmgpCisgICAgYXBwZWFycyBhbWVuYWJsZSB0byBidWlsZGluZyBleHRlbnNpb25zIHdpdGggR0NDLiAgUmV0dXJucyBhIHR1cGxlCisgICAgKHN0YXR1cywgZGV0YWlscyksIHdoZXJlICdzdGF0dXMnIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50czoKKyAgICAgIENPTkZJR19IX09LCisgICAgICAgIGFsbCBpcyB3ZWxsLCBnbyBhaGVhZCBhbmQgY29tcGlsZQorICAgICAgQ09ORklHX0hfTk9UT0sKKyAgICAgICAgZG9lc24ndCBsb29rIGdvb2QKKyAgICAgIENPTkZJR19IX1VOQ0VSVEFJTgorICAgICAgICBub3Qgc3VyZSAtLSB1bmFibGUgdG8gcmVhZCBweWNvbmZpZy5oCisgICAgJ2RldGFpbHMnIGlzIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGV4cGxhaW5pbmcgdGhlIHNpdHVhdGlvbi4KKworICAgIE5vdGUgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGNvbmNsdWRlICJPSyI6IGVpdGhlciAnc3lzLnZlcnNpb24nIGNvbnRhaW5zCisgICAgdGhlIHN0cmluZyAiR0NDIiAoaW1wbHlpbmcgdGhhdCB0aGlzIFB5dGhvbiB3YXMgYnVpbHQgd2l0aCBHQ0MpLCBvciB0aGUKKyAgICBpbnN0YWxsZWQgInB5Y29uZmlnLmgiIGNvbnRhaW5zIHRoZSBzdHJpbmcgIl9fR05VQ19fIi4KKyAgICAiIiIKKworICAgICMgWFhYIHNpbmNlIHRoaXMgZnVuY3Rpb24gYWxzbyBjaGVja3Mgc3lzLnZlcnNpb24sIGl0J3Mgbm90IHN0cmljdGx5IGEKKyAgICAjICJweWNvbmZpZy5oIiBjaGVjayAtLSBzaG91bGQgcHJvYmFibHkgYmUgcmVuYW1lZC4uLgorCisgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZworICAgIGltcG9ydCBzdHJpbmcKKyAgICAjIGlmIHN5cy52ZXJzaW9uIGNvbnRhaW5zIEdDQyB0aGVuIHB5dGhvbiB3YXMgY29tcGlsZWQgd2l0aAorICAgICMgR0NDLCBhbmQgdGhlIHB5Y29uZmlnLmggZmlsZSBzaG91bGQgYmUgT0sKKyAgICBpZiBzdHJpbmcuZmluZChzeXMudmVyc2lvbiwiR0NDIikgPj0gMDoKKyAgICAgICAgcmV0dXJuIChDT05GSUdfSF9PSywgInN5cy52ZXJzaW9uIG1lbnRpb25zICdHQ0MnIikKKworICAgIGZuID0gc3lzY29uZmlnLmdldF9jb25maWdfaF9maWxlbmFtZSgpCisgICAgdHJ5OgorICAgICAgICAjIEl0IHdvdWxkIHByb2JhYmx5IGJldHRlciB0byByZWFkIHNpbmdsZSBsaW5lcyB0byBzZWFyY2guCisgICAgICAgICMgQnV0IHdlIGRvIHRoaXMgb25seSBvbmNlLCBhbmQgaXQgaXMgZmFzdCBlbm91Z2gKKyAgICAgICAgZiA9IG9wZW4oZm4pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSBmLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBleGNlcHQgSU9FcnJvciwgZXhjOgorICAgICAgICAjIGlmIHdlIGNhbid0IHJlYWQgdGhpcyBmaWxlLCB3ZSBjYW5ub3Qgc2F5IGl0IGlzIHdyb25nCisgICAgICAgICMgdGhlIGNvbXBpbGVyIHdpbGwgY29tcGxhaW4gbGF0ZXIgYWJvdXQgdGhpcyBmaWxlIGFzIG1pc3NpbmcKKyAgICAgICAgcmV0dXJuIChDT05GSUdfSF9VTkNFUlRBSU4sCisgICAgICAgICAgICAgICAgImNvdWxkbid0IHJlYWQgJyVzJzogJXMiICUgKGZuLCBleGMuc3RyZXJyb3IpKQorCisgICAgZWxzZToKKyAgICAgICAgIyAicHljb25maWcuaCIgY29udGFpbnMgYW4gIiNpZmRlZiBfX0dOVUNfXyIgb3Igc29tZXRoaW5nIHNpbWlsYXIKKyAgICAgICAgaWYgc3RyaW5nLmZpbmQocywiX19HTlVDX18iKSA+PSAwOgorICAgICAgICAgICAgcmV0dXJuIChDT05GSUdfSF9PSywgIiclcycgbWVudGlvbnMgJ19fR05VQ19fJyIgJSBmbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAoQ09ORklHX0hfTk9UT0ssICInJXMnIGRvZXMgbm90IG1lbnRpb24gJ19fR05VQ19fJyIgJSBmbikKKworCisKK2RlZiBnZXRfdmVyc2lvbnMoKToKKyAgICAiIiIgVHJ5IHRvIGZpbmQgb3V0IHRoZSB2ZXJzaW9ucyBvZiBnY2MsIGxkIGFuZCBkbGx3cmFwLgorICAgICAgICBJZiBub3QgcG9zc2libGUgaXQgcmV0dXJucyBOb25lIGZvciBpdC4KKyAgICAiIiIKKyAgICBmcm9tIGRpc3R1dGlscy52ZXJzaW9uIGltcG9ydCBMb29zZVZlcnNpb24KKyAgICBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlCisgICAgaW1wb3J0IHJlCisKKyAgICBnY2NfZXhlID0gb3MuZW52aXJvbi5nZXQoJ0NDJykgb3IgZmluZF9leGVjdXRhYmxlKCdnY2MnKQorICAgIGxkX2V4ZSA9IG9zLmVudmlyb24uZ2V0KCdMRCcpIG9yIGZpbmRfZXhlY3V0YWJsZSgnbGQnKQorICAgIGlmIGdjY19leGU6CisgICAgICAgIG91dCA9IG9zLnBvcGVuKGdjY19leGUgKyAnIC1kdW1wdmVyc2lvbicsJ3InKQorICAgICAgICBvdXRfc3RyaW5nID0gb3V0LnJlYWQoKQorICAgICAgICBvdXQuY2xvc2UoKQorICAgICAgICByZXN1bHQgPSByZS5zZWFyY2goJyhcZCtcLlxkKyhcLlxkKykqKScsb3V0X3N0cmluZykKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgZ2NjX3ZlcnNpb24gPSBMb29zZVZlcnNpb24ocmVzdWx0Lmdyb3VwKDEpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ2NjX3ZlcnNpb24gPSBOb25lCisgICAgICAgIG91dCA9IG9zLnBvcGVuKGdjY19leGUgKyAnIC0tcHJpbnQtcHJvZy1uYW1lIGxkJywncicpCisgICAgICAgIGxkX2V4ZSA9IG91dC5yZWFkKCkuZGVjb2RlKCdhc2NpaScpLnNwbGl0KClbMF0KKyAgICAgICAgb3V0LmNsb3NlKCkKKyAgICBlbHNlOgorICAgICAgICBnY2NfdmVyc2lvbiA9IE5vbmUKKyAgICBpZiBsZF9leGU6CisgICAgICAgIG91dCA9IG9zLnBvcGVuKGxkX2V4ZSArICcgLXYnLCdyJykKKyAgICAgICAgb3V0X3N0cmluZyA9IG91dC5yZWFkKCkKKyAgICAgICAgb3V0LmNsb3NlKCkKKyAgICAgICAgcmVzdWx0ID0gcmUuc2VhcmNoKCcoXGQrXC5cZCsoXC5cZCspKiknLG91dF9zdHJpbmcpCisgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgIGxkX3ZlcnNpb24gPSBMb29zZVZlcnNpb24ocmVzdWx0Lmdyb3VwKDEpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGRfdmVyc2lvbiA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgICBsZF92ZXJzaW9uID0gTm9uZQorICAgIGRsbHdyYXBfZXhlID0gb3MuZW52aXJvbi5nZXQoJ0RMTFdSQVAnKSBvciBmaW5kX2V4ZWN1dGFibGUoJ2RsbHdyYXAnKQorICAgIGlmIGRsbHdyYXBfZXhlOgorICAgICAgICBvdXQgPSBvcy5wb3BlbihkbGx3cmFwX2V4ZSArICcgLS12ZXJzaW9uJywncicpCisgICAgICAgIG91dF9zdHJpbmcgPSBvdXQucmVhZCgpCisgICAgICAgIG91dC5jbG9zZSgpCisgICAgICAgIHJlc3VsdCA9IHJlLnNlYXJjaCgnIChcZCtcLlxkKyhcLlxkKykqKScsb3V0X3N0cmluZykKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgZGxsd3JhcF92ZXJzaW9uID0gTG9vc2VWZXJzaW9uKHJlc3VsdC5ncm91cCgxKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRsbHdyYXBfdmVyc2lvbiA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgICBkbGx3cmFwX3ZlcnNpb24gPSBOb25lCisgICAgcmV0dXJuIChnY2NfdmVyc2lvbiwgbGRfdmVyc2lvbiwgZGxsd3JhcF92ZXJzaW9uKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY3lnd2luY2NvbXBpbGVyLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2N5Z3dpbmNjb21waWxlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4NTM2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2N5Z3dpbmNjb21waWxlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY3lnd2luY2NvbXBpbGVyLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2N5Z3dpbmNjb21waWxlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4NTM2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2N5Z3dpbmNjb21waWxlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVidWcucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZWJ1Zy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODg2NzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVidWcucHkKQEAgLTAsMCArMSw3IEBACitpbXBvcnQgb3MKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKKyMgSWYgRElTVFVUSUxTX0RFQlVHIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIGVtcHR5IHN0cmluZywgd2UgcnVuIGluCisjIGRlYnVnIG1vZGUuCitERUJVRyA9IG9zLmVudmlyb24uZ2V0KCdESVNUVVRJTFNfREVCVUcnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVidWcucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVidWcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YzdiOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZWJ1Zy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVidWcucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVidWcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YzdiOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZWJ1Zy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVwX3V0aWwucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZXBfdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjc1OTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVwX3V0aWwucHkKQEAgLTAsMCArMSw4OSBAQAorIiIiZGlzdHV0aWxzLmRlcF91dGlsCisKK1V0aWxpdHkgZnVuY3Rpb25zIGZvciBzaW1wbGUsIHRpbWVzdGFtcC1iYXNlZCBkZXBlbmRlbmN5IG9mIGZpbGVzCithbmQgZ3JvdXBzIG9mIGZpbGVzOyBhbHNvLCBmdW5jdGlvbiBiYXNlZCBlbnRpcmVseSBvbiBzdWNoCit0aW1lc3RhbXAgZGVwZW5kZW5jeSBhbmFseXNpcy4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcworZnJvbSBzdGF0IGltcG9ydCBTVF9NVElNRQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNGaWxlRXJyb3IKKworZGVmIG5ld2VyKHNvdXJjZSwgdGFyZ2V0KToKKyAgICAiIiJUZWxscyBpZiB0aGUgdGFyZ2V0IGlzIG5ld2VyIHRoYW4gdGhlIHNvdXJjZS4KKworICAgIFJldHVybiB0cnVlIGlmICdzb3VyY2UnIGV4aXN0cyBhbmQgaXMgbW9yZSByZWNlbnRseSBtb2RpZmllZCB0aGFuCisgICAgJ3RhcmdldCcsIG9yIGlmICdzb3VyY2UnIGV4aXN0cyBhbmQgJ3RhcmdldCcgZG9lc24ndC4KKworICAgIFJldHVybiBmYWxzZSBpZiBib3RoIGV4aXN0IGFuZCAndGFyZ2V0JyBpcyB0aGUgc2FtZSBhZ2Ugb3IgeW91bmdlcgorICAgIHRoYW4gJ3NvdXJjZScuIFJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvciBpZiAnc291cmNlJyBkb2VzIG5vdCBleGlzdC4KKworICAgIE5vdGUgdGhhdCB0aGlzIHRlc3QgaXMgbm90IHZlcnkgYWNjdXJhdGU6IGZpbGVzIGNyZWF0ZWQgaW4gdGhlIHNhbWUgc2Vjb25kCisgICAgd2lsbCBoYXZlIHRoZSBzYW1lICJhZ2UiLgorICAgICIiIgorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzb3VyY2UpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoImZpbGUgJyVzJyBkb2VzIG5vdCBleGlzdCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5hYnNwYXRoKHNvdXJjZSkpCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHRhcmdldCk6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICByZXR1cm4gb3Muc3RhdChzb3VyY2UpW1NUX01USU1FXSA+IG9zLnN0YXQodGFyZ2V0KVtTVF9NVElNRV0KKworZGVmIG5ld2VyX3BhaXJ3aXNlKHNvdXJjZXMsIHRhcmdldHMpOgorICAgICIiIldhbGsgdHdvIGZpbGVuYW1lIGxpc3RzIGluIHBhcmFsbGVsLCB0ZXN0aW5nIGlmIGVhY2ggc291cmNlIGlzIG5ld2VyCisgICAgdGhhbiBpdHMgY29ycmVzcG9uZGluZyB0YXJnZXQuICBSZXR1cm4gYSBwYWlyIG9mIGxpc3RzIChzb3VyY2VzLAorICAgIHRhcmdldHMpIHdoZXJlIHNvdXJjZSBpcyBuZXdlciB0aGFuIHRhcmdldCwgYWNjb3JkaW5nIHRvIHRoZSBzZW1hbnRpY3MKKyAgICBvZiAnbmV3ZXIoKScuCisgICAgIiIiCisgICAgaWYgbGVuKHNvdXJjZXMpICE9IGxlbih0YXJnZXRzKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIidzb3VyY2VzJyBhbmQgJ3RhcmdldHMnIG11c3QgYmUgc2FtZSBsZW5ndGgiCisKKyAgICAjIGJ1aWxkIGEgcGFpciBvZiBsaXN0cyAoc291cmNlcywgdGFyZ2V0cykgd2hlcmUgIHNvdXJjZSBpcyBuZXdlcgorICAgIG5fc291cmNlcyA9IFtdCisgICAgbl90YXJnZXRzID0gW10KKyAgICBmb3Igc291cmNlLCB0YXJnZXQgaW4gemlwKHNvdXJjZXMsIHRhcmdldHMpOgorICAgICAgICBpZiBuZXdlcihzb3VyY2UsIHRhcmdldCk6CisgICAgICAgICAgICBuX3NvdXJjZXMuYXBwZW5kKHNvdXJjZSkKKyAgICAgICAgICAgIG5fdGFyZ2V0cy5hcHBlbmQodGFyZ2V0KQorCisgICAgcmV0dXJuIG5fc291cmNlcywgbl90YXJnZXRzCisKK2RlZiBuZXdlcl9ncm91cChzb3VyY2VzLCB0YXJnZXQsIG1pc3Npbmc9J2Vycm9yJyk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgJ3RhcmdldCcgaXMgb3V0LW9mLWRhdGUgd2l0aCByZXNwZWN0IHRvIGFueSBmaWxlCisgICAgbGlzdGVkIGluICdzb3VyY2VzJy4KKworICAgIEluIG90aGVyIHdvcmRzLCBpZiAndGFyZ2V0JyBleGlzdHMgYW5kIGlzIG5ld2VyCisgICAgdGhhbiBldmVyeSBmaWxlIGluICdzb3VyY2VzJywgcmV0dXJuIGZhbHNlOyBvdGhlcndpc2UgcmV0dXJuIHRydWUuCisgICAgJ21pc3NpbmcnIGNvbnRyb2xzIHdoYXQgd2UgZG8gd2hlbiBhIHNvdXJjZSBmaWxlIGlzIG1pc3Npbmc7IHRoZQorICAgIGRlZmF1bHQgKCJlcnJvciIpIGlzIHRvIGJsb3cgdXAgd2l0aCBhbiBPU0Vycm9yIGZyb20gaW5zaWRlICdzdGF0KCknOworICAgIGlmIGl0IGlzICJpZ25vcmUiLCB3ZSBzaWxlbnRseSBkcm9wIGFueSBtaXNzaW5nIHNvdXJjZSBmaWxlczsgaWYgaXQgaXMKKyAgICAibmV3ZXIiLCBhbnkgbWlzc2luZyBzb3VyY2UgZmlsZXMgbWFrZSB1cyBhc3N1bWUgdGhhdCAndGFyZ2V0JyBpcworICAgIG91dC1vZi1kYXRlICh0aGlzIGlzIGhhbmR5IGluICJkcnktcnVuIiBtb2RlOiBpdCdsbCBtYWtlIHlvdSBwcmV0ZW5kIHRvCisgICAgY2Fycnkgb3V0IGNvbW1hbmRzIHRoYXQgd291bGRuJ3Qgd29yayBiZWNhdXNlIGlucHV0cyBhcmUgbWlzc2luZywgYnV0CisgICAgdGhhdCBkb2Vzbid0IG1hdHRlciBiZWNhdXNlIHlvdSdyZSBub3QgYWN0dWFsbHkgZ29pbmcgdG8gcnVuIHRoZQorICAgIGNvbW1hbmRzKS4KKyAgICAiIiIKKyAgICAjIElmIHRoZSB0YXJnZXQgZG9lc24ndCBldmVuIGV4aXN0LCB0aGVuIGl0J3MgZGVmaW5pdGVseSBvdXQtb2YtZGF0ZS4KKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModGFyZ2V0KToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgICMgT3RoZXJ3aXNlIHdlIGhhdmUgdG8gZmluZCBvdXQgdGhlIGhhcmQgd2F5OiBpZiAqYW55KiBzb3VyY2UgZmlsZQorICAgICMgaXMgbW9yZSByZWNlbnQgdGhhbiAndGFyZ2V0JywgdGhlbiAndGFyZ2V0JyBpcyBvdXQtb2YtZGF0ZSBhbmQKKyAgICAjIHdlIGNhbiBpbW1lZGlhdGVseSByZXR1cm4gdHJ1ZS4gIElmIHdlIGZhbGwgdGhyb3VnaCB0byB0aGUgZW5kCisgICAgIyBvZiB0aGUgbG9vcCwgdGhlbiAndGFyZ2V0JyBpcyB1cC10by1kYXRlIGFuZCB3ZSByZXR1cm4gZmFsc2UuCisgICAgdGFyZ2V0X210aW1lID0gb3Muc3RhdCh0YXJnZXQpW1NUX01USU1FXQorCisgICAgZm9yIHNvdXJjZSBpbiBzb3VyY2VzOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc291cmNlKToKKyAgICAgICAgICAgIGlmIG1pc3NpbmcgPT0gJ2Vycm9yJzogICAgICAjIGJsb3cgdXAgd2hlbiB3ZSBzdGF0KCkgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIG1pc3NpbmcgPT0gJ2lnbm9yZSc6ICAgIyBtaXNzaW5nIHNvdXJjZSBkcm9wcGVkIGZyb20KKyAgICAgICAgICAgICAgICBjb250aW51ZSAgICAgICAgICAgICAgICAjICB0YXJnZXQncyBkZXBlbmRlbmN5IGxpc3QKKyAgICAgICAgICAgIGVsaWYgbWlzc2luZyA9PSAnbmV3ZXInOiAgICAjIG1pc3Npbmcgc291cmNlIG1lYW5zIHRhcmdldCBpcworICAgICAgICAgICAgICAgIHJldHVybiBUcnVlICAgICAgICAgICAgICMgIG91dC1vZi1kYXRlCisKKyAgICAgICAgaWYgb3Muc3RhdChzb3VyY2UpW1NUX01USU1FXSA+IHRhcmdldF9tdGltZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2RlcF91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2RlcF91dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmMxMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVwX3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2RlcF91dGlsLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2RlcF91dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmMxMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVwX3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpcl91dGlsLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGlyX3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyNmUyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpcl91dGlsLnB5CkBAIC0wLDAgKzEsMjE2IEBACisiIiJkaXN0dXRpbHMuZGlyX3V0aWwKKworVXRpbGl0eSBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBkaXJlY3RvcmllcyBhbmQgZGlyZWN0b3J5IHRyZWVzLiIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zCitpbXBvcnQgZXJybm8KK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRmlsZUVycm9yLCBEaXN0dXRpbHNJbnRlcm5hbEVycm9yCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKKyMgY2FjaGUgZm9yIGJ5IG1rcGF0aCgpIC0tIGluIGFkZGl0aW9uIHRvIGNoZWFwZW5pbmcgcmVkdW5kYW50IGNhbGxzLAorIyBlbGltaW5hdGVzIHJlZHVuZGFudCAiY3JlYXRpbmcgL2Zvby9iYXIvYmF6IiBtZXNzYWdlcyBpbiBkcnktcnVuIG1vZGUKK19wYXRoX2NyZWF0ZWQgPSB7fQorCisjIEkgZG9uJ3QgdXNlIG9zLm1ha2VkaXJzIGJlY2F1c2UgYSkgaXQncyBuZXcgdG8gUHl0aG9uIDEuNS4yLCBhbmQKKyMgYikgaXQgYmxvd3MgdXAgaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyAoSSB3YW50IHRvIHNpbGVudGx5CisjIHN1Y2NlZWQgaW4gdGhhdCBjYXNlKS4KK2RlZiBta3BhdGgobmFtZSwgbW9kZT0wNzc3LCB2ZXJib3NlPTEsIGRyeV9ydW49MCk6CisgICAgIiIiQ3JlYXRlIGEgZGlyZWN0b3J5IGFuZCBhbnkgbWlzc2luZyBhbmNlc3RvciBkaXJlY3Rvcmllcy4KKworICAgIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMgKG9yIGlmICduYW1lJyBpcyB0aGUgZW1wdHkgc3RyaW5nLCB3aGljaAorICAgIG1lYW5zIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgd2hpY2ggb2YgY291cnNlIGV4aXN0cyksIHRoZW4gZG8gbm90aGluZy4KKyAgICBSYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IgaWYgdW5hYmxlIHRvIGNyZWF0ZSBzb21lIGRpcmVjdG9yeSBhbG9uZyB0aGUgd2F5CisgICAgKGVnLiBzb21lIHN1Yi1wYXRoIGV4aXN0cywgYnV0IGlzIGEgZmlsZSByYXRoZXIgdGhhbiBhIGRpcmVjdG9yeSkuCisgICAgSWYgJ3ZlcmJvc2UnIGlzIHRydWUsIHByaW50IGEgb25lLWxpbmUgc3VtbWFyeSBvZiBlYWNoIG1rZGlyIHRvIHN0ZG91dC4KKyAgICBSZXR1cm4gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgYWN0dWFsbHkgY3JlYXRlZC4KKyAgICAiIiIKKworICAgIGdsb2JhbCBfcGF0aF9jcmVhdGVkCisKKyAgICAjIERldGVjdCBhIGNvbW1vbiBidWcgLS0gbmFtZSBpcyBOb25lCisgICAgaWYgbm90IGlzaW5zdGFuY2UobmFtZSwgYmFzZXN0cmluZyk6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc0ludGVybmFsRXJyb3IsIFwKKyAgICAgICAgICAgICAgIm1rcGF0aDogJ25hbWUnIG11c3QgYmUgYSBzdHJpbmcgKGdvdCAlcikiICUgKG5hbWUsKQorCisgICAgIyBYWFggd2hhdCdzIHRoZSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB2ZXJib3NpdHk/IHByaW50IGFzIHdlIGNyZWF0ZQorICAgICMgZWFjaCBkaXJlY3RvcnkgaW4gdGhlIHBhdGggKHRoZSBjdXJyZW50IGJlaGF2aW91ciksIG9yIG9ubHkgYW5ub3VuY2UKKyAgICAjIHRoZSBjcmVhdGlvbiBvZiB0aGUgd2hvbGUgcGF0aD8gKHF1aXRlIGVhc3kgdG8gZG8gdGhlIGxhdHRlciBzaW5jZQorICAgICMgd2UncmUgbm90IHVzaW5nIGEgcmVjdXJzaXZlIGFsZ29yaXRobSkKKworICAgIG5hbWUgPSBvcy5wYXRoLm5vcm1wYXRoKG5hbWUpCisgICAgY3JlYXRlZF9kaXJzID0gW10KKyAgICBpZiBvcy5wYXRoLmlzZGlyKG5hbWUpIG9yIG5hbWUgPT0gJyc6CisgICAgICAgIHJldHVybiBjcmVhdGVkX2RpcnMKKyAgICBpZiBfcGF0aF9jcmVhdGVkLmdldChvcy5wYXRoLmFic3BhdGgobmFtZSkpOgorICAgICAgICByZXR1cm4gY3JlYXRlZF9kaXJzCisKKyAgICAoaGVhZCwgdGFpbCkgPSBvcy5wYXRoLnNwbGl0KG5hbWUpCisgICAgdGFpbHMgPSBbdGFpbF0gICAgICAgICAgICAgICAgICAgICAgIyBzdGFjayBvZiBsb25lIGRpcnMgdG8gY3JlYXRlCisKKyAgICB3aGlsZSBoZWFkIGFuZCB0YWlsIGFuZCBub3Qgb3MucGF0aC5pc2RpcihoZWFkKToKKyAgICAgICAgKGhlYWQsIHRhaWwpID0gb3MucGF0aC5zcGxpdChoZWFkKQorICAgICAgICB0YWlscy5pbnNlcnQoMCwgdGFpbCkgICAgICAgICAgIyBwdXNoIG5leHQgaGlnaGVyIGRpciBvbnRvIHN0YWNrCisKKyAgICAjIG5vdyAnaGVhZCcgY29udGFpbnMgdGhlIGRlZXBlc3QgZGlyZWN0b3J5IHRoYXQgYWxyZWFkeSBleGlzdHMKKyAgICAjICh0aGF0IGlzLCB0aGUgY2hpbGQgb2YgJ2hlYWQnIGluICduYW1lJyBpcyB0aGUgaGlnaGVzdCBkaXJlY3RvcnkKKyAgICAjIHRoYXQgZG9lcyAqbm90KiBleGlzdCkKKyAgICBmb3IgZCBpbiB0YWlsczoKKyAgICAgICAgI3ByaW50ICJoZWFkID0gJXMsIGQgPSAlczogIiAlIChoZWFkLCBkKSwKKyAgICAgICAgaGVhZCA9IG9zLnBhdGguam9pbihoZWFkLCBkKQorICAgICAgICBhYnNfaGVhZCA9IG9zLnBhdGguYWJzcGF0aChoZWFkKQorCisgICAgICAgIGlmIF9wYXRoX2NyZWF0ZWQuZ2V0KGFic19oZWFkKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgdmVyYm9zZSA+PSAxOgorICAgICAgICAgICAgbG9nLmluZm8oImNyZWF0aW5nICVzIiwgaGVhZCkKKworICAgICAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihoZWFkLCBtb2RlKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGV4YzoKKyAgICAgICAgICAgICAgICBpZiBub3QgKGV4Yy5lcnJubyA9PSBlcnJuby5FRVhJU1QgYW5kIG9zLnBhdGguaXNkaXIoaGVhZCkpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY3JlYXRlICclcyc6ICVzIiAlIChoZWFkLCBleGMuYXJnc1stMV0pKQorICAgICAgICAgICAgY3JlYXRlZF9kaXJzLmFwcGVuZChoZWFkKQorCisgICAgICAgIF9wYXRoX2NyZWF0ZWRbYWJzX2hlYWRdID0gMQorICAgIHJldHVybiBjcmVhdGVkX2RpcnMKKworZGVmIGNyZWF0ZV90cmVlKGJhc2VfZGlyLCBmaWxlcywgbW9kZT0wNzc3LCB2ZXJib3NlPTEsIGRyeV9ydW49MCk6CisgICAgIiIiQ3JlYXRlIGFsbCB0aGUgZW1wdHkgZGlyZWN0b3JpZXMgdW5kZXIgJ2Jhc2VfZGlyJyBuZWVkZWQgdG8gcHV0ICdmaWxlcycKKyAgICB0aGVyZS4KKworICAgICdiYXNlX2RpcicgaXMganVzdCB0aGUgYSBuYW1lIG9mIGEgZGlyZWN0b3J5IHdoaWNoIGRvZXNuJ3QgbmVjZXNzYXJpbHkKKyAgICBleGlzdCB5ZXQ7ICdmaWxlcycgaXMgYSBsaXN0IG9mIGZpbGVuYW1lcyB0byBiZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0bworICAgICdiYXNlX2RpcicuICAnYmFzZV9kaXInICsgdGhlIGRpcmVjdG9yeSBwb3J0aW9uIG9mIGV2ZXJ5IGZpbGUgaW4gJ2ZpbGVzJworICAgIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuICAnbW9kZScsICd2ZXJib3NlJyBhbmQKKyAgICAnZHJ5X3J1bicgZmxhZ3MgYXJlIGFzIGZvciAnbWtwYXRoKCknLgorICAgICIiIgorICAgICMgRmlyc3QgZ2V0IHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIGNyZWF0ZQorICAgIG5lZWRfZGlyID0ge30KKyAgICBmb3IgZmlsZSBpbiBmaWxlczoKKyAgICAgICAgbmVlZF9kaXJbb3MucGF0aC5qb2luKGJhc2VfZGlyLCBvcy5wYXRoLmRpcm5hbWUoZmlsZSkpXSA9IDEKKyAgICBuZWVkX2RpcnMgPSBuZWVkX2Rpci5rZXlzKCkKKyAgICBuZWVkX2RpcnMuc29ydCgpCisKKyAgICAjIE5vdyBjcmVhdGUgdGhlbQorICAgIGZvciBkaXIgaW4gbmVlZF9kaXJzOgorICAgICAgICBta3BhdGgoZGlyLCBtb2RlLCB2ZXJib3NlPXZlcmJvc2UsIGRyeV9ydW49ZHJ5X3J1bikKKworZGVmIGNvcHlfdHJlZShzcmMsIGRzdCwgcHJlc2VydmVfbW9kZT0xLCBwcmVzZXJ2ZV90aW1lcz0xLAorICAgICAgICAgICAgICBwcmVzZXJ2ZV9zeW1saW5rcz0wLCB1cGRhdGU9MCwgdmVyYm9zZT0xLCBkcnlfcnVuPTApOgorICAgICIiIkNvcHkgYW4gZW50aXJlIGRpcmVjdG9yeSB0cmVlICdzcmMnIHRvIGEgbmV3IGxvY2F0aW9uICdkc3QnLgorCisgICAgQm90aCAnc3JjJyBhbmQgJ2RzdCcgbXVzdCBiZSBkaXJlY3RvcnkgbmFtZXMuICBJZiAnc3JjJyBpcyBub3QgYQorICAgIGRpcmVjdG9yeSwgcmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yLiAgSWYgJ2RzdCcgZG9lcyBub3QgZXhpc3QsIGl0IGlzCisgICAgY3JlYXRlZCB3aXRoICdta3BhdGgoKScuICBUaGUgZW5kIHJlc3VsdCBvZiB0aGUgY29weSBpcyB0aGF0IGV2ZXJ5CisgICAgZmlsZSBpbiAnc3JjJyBpcyBjb3BpZWQgdG8gJ2RzdCcsIGFuZCBkaXJlY3RvcmllcyB1bmRlciAnc3JjJyBhcmUKKyAgICByZWN1cnNpdmVseSBjb3BpZWQgdG8gJ2RzdCcuICBSZXR1cm4gdGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCB3ZXJlCisgICAgY29waWVkIG9yIG1pZ2h0IGhhdmUgYmVlbiBjb3BpZWQsIHVzaW5nIHRoZWlyIG91dHB1dCBuYW1lLiAgVGhlCisgICAgcmV0dXJuIHZhbHVlIGlzIHVuYWZmZWN0ZWQgYnkgJ3VwZGF0ZScgb3IgJ2RyeV9ydW4nOiBpdCBpcyBzaW1wbHkKKyAgICB0aGUgbGlzdCBvZiBhbGwgZmlsZXMgdW5kZXIgJ3NyYycsIHdpdGggdGhlIG5hbWVzIGNoYW5nZWQgdG8gYmUKKyAgICB1bmRlciAnZHN0Jy4KKworICAgICdwcmVzZXJ2ZV9tb2RlJyBhbmQgJ3ByZXNlcnZlX3RpbWVzJyBhcmUgdGhlIHNhbWUgYXMgZm9yCisgICAgJ2NvcHlfZmlsZSc7IG5vdGUgdGhhdCB0aGV5IG9ubHkgYXBwbHkgdG8gcmVndWxhciBmaWxlcywgbm90IHRvCisgICAgZGlyZWN0b3JpZXMuICBJZiAncHJlc2VydmVfc3ltbGlua3MnIGlzIHRydWUsIHN5bWxpbmtzIHdpbGwgYmUKKyAgICBjb3BpZWQgYXMgc3ltbGlua3MgKG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgdGhlbSEpOyBvdGhlcndpc2UKKyAgICAodGhlIGRlZmF1bHQpLCB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHN5bWxpbmsgd2lsbCBiZSBjb3BpZWQuCisgICAgJ3VwZGF0ZScgYW5kICd2ZXJib3NlJyBhcmUgdGhlIHNhbWUgYXMgZm9yICdjb3B5X2ZpbGUnLgorICAgICIiIgorICAgIGZyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgY29weV9maWxlCisKKyAgICBpZiBub3QgZHJ5X3J1biBhbmQgbm90IG9zLnBhdGguaXNkaXIoc3JjKToKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yLCBcCisgICAgICAgICAgICAgICJjYW5ub3QgY29weSB0cmVlICclcyc6IG5vdCBhIGRpcmVjdG9yeSIgJSBzcmMKKyAgICB0cnk6CisgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihzcmMpCisgICAgZXhjZXB0IG9zLmVycm9yLCAoZXJybm8sIGVycnN0cik6CisgICAgICAgIGlmIGRyeV9ydW46CisgICAgICAgICAgICBuYW1lcyA9IFtdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICJlcnJvciBsaXN0aW5nIGZpbGVzIGluICclcyc6ICVzIiAlIChzcmMsIGVycnN0cikKKworICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICBta3BhdGgoZHN0LCB2ZXJib3NlPXZlcmJvc2UpCisKKyAgICBvdXRwdXRzID0gW10KKworICAgIGZvciBuIGluIG5hbWVzOgorICAgICAgICBzcmNfbmFtZSA9IG9zLnBhdGguam9pbihzcmMsIG4pCisgICAgICAgIGRzdF9uYW1lID0gb3MucGF0aC5qb2luKGRzdCwgbikKKworICAgICAgICBpZiBuLnN0YXJ0c3dpdGgoJy5uZnMnKToKKyAgICAgICAgICAgICMgc2tpcCBORlMgcmVuYW1lIGZpbGVzCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIHByZXNlcnZlX3N5bWxpbmtzIGFuZCBvcy5wYXRoLmlzbGluayhzcmNfbmFtZSk6CisgICAgICAgICAgICBsaW5rX2Rlc3QgPSBvcy5yZWFkbGluayhzcmNfbmFtZSkKKyAgICAgICAgICAgIGlmIHZlcmJvc2UgPj0gMToKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygibGlua2luZyAlcyAtPiAlcyIsIGRzdF9uYW1lLCBsaW5rX2Rlc3QpCisgICAgICAgICAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKGxpbmtfZGVzdCwgZHN0X25hbWUpCisgICAgICAgICAgICBvdXRwdXRzLmFwcGVuZChkc3RfbmFtZSkKKworICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIoc3JjX25hbWUpOgorICAgICAgICAgICAgb3V0cHV0cy5leHRlbmQoCisgICAgICAgICAgICAgICAgY29weV90cmVlKHNyY19uYW1lLCBkc3RfbmFtZSwgcHJlc2VydmVfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVfdGltZXMsIHByZXNlcnZlX3N5bWxpbmtzLCB1cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmJvc2U9dmVyYm9zZSwgZHJ5X3J1bj1kcnlfcnVuKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvcHlfZmlsZShzcmNfbmFtZSwgZHN0X25hbWUsIHByZXNlcnZlX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVfdGltZXMsIHVwZGF0ZSwgdmVyYm9zZT12ZXJib3NlLAorICAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW49ZHJ5X3J1bikKKyAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGRzdF9uYW1lKQorCisgICAgcmV0dXJuIG91dHB1dHMKKworZGVmIF9idWlsZF9jbWR0dXBsZShwYXRoLCBjbWR0dXBsZXMpOgorICAgICIiIkhlbHBlciBmb3IgcmVtb3ZlX3RyZWUoKS4iIiIKKyAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKHBhdGgpOgorICAgICAgICByZWFsX2YgPSBvcy5wYXRoLmpvaW4ocGF0aCxmKQorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHJlYWxfZikgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhyZWFsX2YpOgorICAgICAgICAgICAgX2J1aWxkX2NtZHR1cGxlKHJlYWxfZiwgY21kdHVwbGVzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kdHVwbGVzLmFwcGVuZCgob3MucmVtb3ZlLCByZWFsX2YpKQorICAgIGNtZHR1cGxlcy5hcHBlbmQoKG9zLnJtZGlyLCBwYXRoKSkKKworZGVmIHJlbW92ZV90cmVlKGRpcmVjdG9yeSwgdmVyYm9zZT0xLCBkcnlfcnVuPTApOgorICAgICIiIlJlY3Vyc2l2ZWx5IHJlbW92ZSBhbiBlbnRpcmUgZGlyZWN0b3J5IHRyZWUuCisKKyAgICBBbnkgZXJyb3JzIGFyZSBpZ25vcmVkIChhcGFydCBmcm9tIGJlaW5nIHJlcG9ydGVkIHRvIHN0ZG91dCBpZiAndmVyYm9zZScKKyAgICBpcyB0cnVlKS4KKyAgICAiIiIKKyAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBncm9rX2Vudmlyb25tZW50X2Vycm9yCisgICAgZ2xvYmFsIF9wYXRoX2NyZWF0ZWQKKworICAgIGlmIHZlcmJvc2UgPj0gMToKKyAgICAgICAgbG9nLmluZm8oInJlbW92aW5nICclcycgKGFuZCBldmVyeXRoaW5nIHVuZGVyIGl0KSIsIGRpcmVjdG9yeSkKKyAgICBpZiBkcnlfcnVuOgorICAgICAgICByZXR1cm4KKyAgICBjbWR0dXBsZXMgPSBbXQorICAgIF9idWlsZF9jbWR0dXBsZShkaXJlY3RvcnksIGNtZHR1cGxlcykKKyAgICBmb3IgY21kIGluIGNtZHR1cGxlczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY21kWzBdKGNtZFsxXSkKKyAgICAgICAgICAgICMgcmVtb3ZlIGRpciBmcm9tIGNhY2hlIGlmIGl0J3MgYWxyZWFkeSB0aGVyZQorICAgICAgICAgICAgYWJzcGF0aCA9IG9zLnBhdGguYWJzcGF0aChjbWRbMV0pCisgICAgICAgICAgICBpZiBhYnNwYXRoIGluIF9wYXRoX2NyZWF0ZWQ6CisgICAgICAgICAgICAgICAgZGVsIF9wYXRoX2NyZWF0ZWRbYWJzcGF0aF0KKyAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBPU0Vycm9yKSwgZXhjOgorICAgICAgICAgICAgbG9nLndhcm4oZ3Jva19lbnZpcm9ubWVudF9lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgZXhjLCAiZXJyb3IgcmVtb3ZpbmcgJXM6ICIgJSBkaXJlY3RvcnkpKQorCitkZWYgZW5zdXJlX3JlbGF0aXZlKHBhdGgpOgorICAgICIiIlRha2UgdGhlIGZ1bGwgcGF0aCAncGF0aCcsIGFuZCBtYWtlIGl0IGEgcmVsYXRpdmUgcGF0aC4KKworICAgIFRoaXMgaXMgdXNlZnVsIHRvIG1ha2UgJ3BhdGgnIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gb3MucGF0aC5qb2luKCkuCisgICAgIiIiCisgICAgZHJpdmUsIHBhdGggPSBvcy5wYXRoLnNwbGl0ZHJpdmUocGF0aCkKKyAgICBpZiBwYXRoWzA6MV0gPT0gb3Muc2VwOgorICAgICAgICBwYXRoID0gZHJpdmUgKyBwYXRoWzE6XQorICAgIHJldHVybiBwYXRoCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kaXJfdXRpbC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kaXJfdXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5MDcwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpcl91dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kaXJfdXRpbC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kaXJfdXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5MDcwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpcl91dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kaXN0LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDI1MzEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGlzdC5weQpAQCAtMCwwICsxLDEyNDkgQEAKKyIiImRpc3R1dGlscy5kaXN0CisKK1Byb3ZpZGVzIHRoZSBEaXN0cmlidXRpb24gY2xhc3MsIHdoaWNoIHJlcHJlc2VudHMgdGhlIG1vZHVsZSBkaXN0cmlidXRpb24KK2JlaW5nIGJ1aWx0L2luc3RhbGxlZC9kaXN0cmlidXRlZC4KKyIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IHN5cywgb3MsIHJlCitmcm9tIGVtYWlsIGltcG9ydCBtZXNzYWdlX2Zyb21fZmlsZQorCit0cnk6CisgICAgaW1wb3J0IHdhcm5pbmdzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgd2FybmluZ3MgPSBOb25lCisKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKERpc3R1dGlsc09wdGlvbkVycm9yLCBEaXN0dXRpbHNBcmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3R1dGlsc01vZHVsZUVycm9yLCBEaXN0dXRpbHNDbGFzc0Vycm9yKQorZnJvbSBkaXN0dXRpbHMuZmFuY3lfZ2V0b3B0IGltcG9ydCBGYW5jeUdldG9wdCwgdHJhbnNsYXRlX2xvbmdvcHQKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNoZWNrX2Vudmlyb24sIHN0cnRvYm9vbCwgcmZjODIyX2VzY2FwZQorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZGVidWcgaW1wb3J0IERFQlVHCisKKyMgRW5jb2RpbmcgdXNlZCBmb3IgdGhlIFBLRy1JTkZPIGZpbGVzCitQS0dfSU5GT19FTkNPRElORyA9ICd1dGYtOCcKKworIyBSZWdleCB0byBkZWZpbmUgYWNjZXB0YWJsZSBEaXN0dXRpbHMgY29tbWFuZCBuYW1lcy4gIFRoaXMgaXMgbm90ICpxdWl0ZSoKKyMgdGhlIHNhbWUgYXMgYSBQeXRob24gTkFNRSAtLSBJIGRvbid0IGFsbG93IGxlYWRpbmcgdW5kZXJzY29yZXMuICBUaGUgZmFjdAorIyB0aGF0IHRoZXkncmUgdmVyeSBzaW1pbGFyIGlzIG5vIGNvaW5jaWRlbmNlOyB0aGUgZGVmYXVsdCBuYW1pbmcgc2NoZW1lIGlzCisjIHRvIGxvb2sgZm9yIGEgUHl0aG9uIG1vZHVsZSBuYW1lZCBhZnRlciB0aGUgY29tbWFuZC4KK2NvbW1hbmRfcmUgPSByZS5jb21waWxlIChyJ15bYS16QS1aXShbYS16QS1aMC05X10qKSQnKQorCisKK2NsYXNzIERpc3RyaWJ1dGlvbjoKKyAgICAiIiJUaGUgY29yZSBvZiB0aGUgRGlzdHV0aWxzLiAgTW9zdCBvZiB0aGUgd29yayBoaWRpbmcgYmVoaW5kICdzZXR1cCcKKyAgICBpcyByZWFsbHkgZG9uZSB3aXRoaW4gYSBEaXN0cmlidXRpb24gaW5zdGFuY2UsIHdoaWNoIGZhcm1zIHRoZSB3b3JrIG91dAorICAgIHRvIHRoZSBEaXN0dXRpbHMgY29tbWFuZHMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisKKyAgICBTZXR1cCBzY3JpcHRzIHdpbGwgYWxtb3N0IG5ldmVyIGluc3RhbnRpYXRlIERpc3RyaWJ1dGlvbiBkaXJlY3RseSwKKyAgICB1bmxlc3MgdGhlICdzZXR1cCgpJyBmdW5jdGlvbiBpcyB0b3RhbGx5IGluYWRlcXVhdGUgdG8gdGhlaXIgbmVlZHMuCisgICAgSG93ZXZlciwgaXQgaXMgY29uY2VpdmFibGUgdGhhdCBhIHNldHVwIHNjcmlwdCBtaWdodCB3aXNoIHRvIHN1YmNsYXNzCisgICAgRGlzdHJpYnV0aW9uIGZvciBzb21lIHNwZWNpYWxpemVkIHB1cnBvc2UsIGFuZCB0aGVuIHBhc3MgdGhlIHN1YmNsYXNzCisgICAgdG8gJ3NldHVwKCknIGFzIHRoZSAnZGlzdGNsYXNzJyBrZXl3b3JkIGFyZ3VtZW50LiAgSWYgc28sIGl0IGlzCisgICAgbmVjZXNzYXJ5IHRvIHJlc3BlY3QgdGhlIGV4cGVjdGF0aW9ucyB0aGF0ICdzZXR1cCcgaGFzIG9mIERpc3RyaWJ1dGlvbi4KKyAgICBTZWUgdGhlIGNvZGUgZm9yICdzZXR1cCgpJywgaW4gY29yZS5weSwgZm9yIGRldGFpbHMuCisgICAgIiIiCisKKworICAgICMgJ2dsb2JhbF9vcHRpb25zJyBkZXNjcmliZXMgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRoYXQgbWF5IGJlCisgICAgIyBzdXBwbGllZCB0byB0aGUgc2V0dXAgc2NyaXB0IHByaW9yIHRvIGFueSBhY3R1YWwgY29tbWFuZHMuCisgICAgIyBFZy4gIi4vc2V0dXAucHkgLW4iIG9yICIuL3NldHVwLnB5IC0tcXVpZXQiIGJvdGggdGFrZSBhZHZhbnRhZ2Ugb2YKKyAgICAjIHRoZXNlIGdsb2JhbCBvcHRpb25zLiAgVGhpcyBsaXN0IHNob3VsZCBiZSBrZXB0IHRvIGEgYmFyZSBtaW5pbXVtLAorICAgICMgc2luY2UgZXZlcnkgZ2xvYmFsIG9wdGlvbiBpcyBhbHNvIHZhbGlkIGFzIGEgY29tbWFuZCBvcHRpb24gLS0gYW5kIHdlCisgICAgIyBkb24ndCB3YW50IHRvIHBvbGx1dGUgdGhlIGNvbW1hbmRzIHdpdGggdG9vIG1hbnkgb3B0aW9ucyB0aGF0IHRoZXkKKyAgICAjIGhhdmUgbWluaW1hbCBjb250cm9sIG92ZXIuCisgICAgIyBUaGUgZm91cnRoIGVudHJ5IGZvciB2ZXJib3NlIG1lYW5zIHRoYXQgaXQgY2FuIGJlIHJlcGVhdGVkLgorICAgIGdsb2JhbF9vcHRpb25zID0gWygndmVyYm9zZScsICd2JywgInJ1biB2ZXJib3NlbHkgKGRlZmF1bHQpIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgKCdxdWlldCcsICdxJywgInJ1biBxdWlldGx5ICh0dXJucyB2ZXJib3NpdHkgb2ZmKSIpLAorICAgICAgICAgICAgICAgICAgICAgICgnZHJ5LXJ1bicsICduJywgImRvbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIiksCisgICAgICAgICAgICAgICAgICAgICAgKCdoZWxwJywgJ2gnLCAic2hvdyBkZXRhaWxlZCBoZWxwIG1lc3NhZ2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJ25vLXVzZXItY2ZnJywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2lnbm9yZSBweWRpc3R1dGlscy5jZmcgaW4geW91ciBob21lIGRpcmVjdG9yeScpLAorICAgIF0KKworICAgICMgJ2NvbW1vbl91c2FnZScgaXMgYSBzaG9ydCAoMi0zIGxpbmUpIHN0cmluZyBkZXNjcmliaW5nIHRoZSBjb21tb24KKyAgICAjIHVzYWdlIG9mIHRoZSBzZXR1cCBzY3JpcHQuCisgICAgY29tbW9uX3VzYWdlID0gIiIiXAorQ29tbW9uIGNvbW1hbmRzOiAoc2VlICctLWhlbHAtY29tbWFuZHMnIGZvciBtb3JlKQorCisgIHNldHVwLnB5IGJ1aWxkICAgICAgd2lsbCBidWlsZCB0aGUgcGFja2FnZSB1bmRlcm5lYXRoICdidWlsZC8nCisgIHNldHVwLnB5IGluc3RhbGwgICAgd2lsbCBpbnN0YWxsIHRoZSBwYWNrYWdlCisiIiIKKworICAgICMgb3B0aW9ucyB0aGF0IGFyZSBub3QgcHJvcGFnYXRlZCB0byB0aGUgY29tbWFuZHMKKyAgICBkaXNwbGF5X29wdGlvbnMgPSBbCisgICAgICAgICgnaGVscC1jb21tYW5kcycsIE5vbmUsCisgICAgICAgICAibGlzdCBhbGwgYXZhaWxhYmxlIGNvbW1hbmRzIiksCisgICAgICAgICgnbmFtZScsIE5vbmUsCisgICAgICAgICAicHJpbnQgcGFja2FnZSBuYW1lIiksCisgICAgICAgICgndmVyc2lvbicsICdWJywKKyAgICAgICAgICJwcmludCBwYWNrYWdlIHZlcnNpb24iKSwKKyAgICAgICAgKCdmdWxsbmFtZScsIE5vbmUsCisgICAgICAgICAicHJpbnQgPHBhY2thZ2UgbmFtZT4tPHZlcnNpb24+IiksCisgICAgICAgICgnYXV0aG9yJywgTm9uZSwKKyAgICAgICAgICJwcmludCB0aGUgYXV0aG9yJ3MgbmFtZSIpLAorICAgICAgICAoJ2F1dGhvci1lbWFpbCcsIE5vbmUsCisgICAgICAgICAicHJpbnQgdGhlIGF1dGhvcidzIGVtYWlsIGFkZHJlc3MiKSwKKyAgICAgICAgKCdtYWludGFpbmVyJywgTm9uZSwKKyAgICAgICAgICJwcmludCB0aGUgbWFpbnRhaW5lcidzIG5hbWUiKSwKKyAgICAgICAgKCdtYWludGFpbmVyLWVtYWlsJywgTm9uZSwKKyAgICAgICAgICJwcmludCB0aGUgbWFpbnRhaW5lcidzIGVtYWlsIGFkZHJlc3MiKSwKKyAgICAgICAgKCdjb250YWN0JywgTm9uZSwKKyAgICAgICAgICJwcmludCB0aGUgbWFpbnRhaW5lcidzIG5hbWUgaWYga25vd24sIGVsc2UgdGhlIGF1dGhvcidzIiksCisgICAgICAgICgnY29udGFjdC1lbWFpbCcsIE5vbmUsCisgICAgICAgICAicHJpbnQgdGhlIG1haW50YWluZXIncyBlbWFpbCBhZGRyZXNzIGlmIGtub3duLCBlbHNlIHRoZSBhdXRob3IncyIpLAorICAgICAgICAoJ3VybCcsIE5vbmUsCisgICAgICAgICAicHJpbnQgdGhlIFVSTCBmb3IgdGhpcyBwYWNrYWdlIiksCisgICAgICAgICgnbGljZW5zZScsIE5vbmUsCisgICAgICAgICAicHJpbnQgdGhlIGxpY2Vuc2Ugb2YgdGhlIHBhY2thZ2UiKSwKKyAgICAgICAgKCdsaWNlbmNlJywgTm9uZSwKKyAgICAgICAgICJhbGlhcyBmb3IgLS1saWNlbnNlIiksCisgICAgICAgICgnZGVzY3JpcHRpb24nLCBOb25lLAorICAgICAgICAgInByaW50IHRoZSBwYWNrYWdlIGRlc2NyaXB0aW9uIiksCisgICAgICAgICgnbG9uZy1kZXNjcmlwdGlvbicsIE5vbmUsCisgICAgICAgICAicHJpbnQgdGhlIGxvbmcgcGFja2FnZSBkZXNjcmlwdGlvbiIpLAorICAgICAgICAoJ3BsYXRmb3JtcycsIE5vbmUsCisgICAgICAgICAicHJpbnQgdGhlIGxpc3Qgb2YgcGxhdGZvcm1zIiksCisgICAgICAgICgnY2xhc3NpZmllcnMnLCBOb25lLAorICAgICAgICAgInByaW50IHRoZSBsaXN0IG9mIGNsYXNzaWZpZXJzIiksCisgICAgICAgICgna2V5d29yZHMnLCBOb25lLAorICAgICAgICAgInByaW50IHRoZSBsaXN0IG9mIGtleXdvcmRzIiksCisgICAgICAgICgncHJvdmlkZXMnLCBOb25lLAorICAgICAgICAgInByaW50IHRoZSBsaXN0IG9mIHBhY2thZ2VzL21vZHVsZXMgcHJvdmlkZWQiKSwKKyAgICAgICAgKCdyZXF1aXJlcycsIE5vbmUsCisgICAgICAgICAicHJpbnQgdGhlIGxpc3Qgb2YgcGFja2FnZXMvbW9kdWxlcyByZXF1aXJlZCIpLAorICAgICAgICAoJ29ic29sZXRlcycsIE5vbmUsCisgICAgICAgICAicHJpbnQgdGhlIGxpc3Qgb2YgcGFja2FnZXMvbW9kdWxlcyBtYWRlIG9ic29sZXRlIikKKyAgICAgICAgXQorICAgIGRpc3BsYXlfb3B0aW9uX25hbWVzID0gbWFwKGxhbWJkYSB4OiB0cmFuc2xhdGVfbG9uZ29wdCh4WzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X29wdGlvbnMpCisKKyAgICAjIG5lZ2F0aXZlIG9wdGlvbnMgYXJlIG9wdGlvbnMgdGhhdCBleGNsdWRlIG90aGVyIG9wdGlvbnMKKyAgICBuZWdhdGl2ZV9vcHQgPSB7J3F1aWV0JzogJ3ZlcmJvc2UnfQorCisKKyAgICAjIC0tIENyZWF0aW9uL2luaXRpYWxpemF0aW9uIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCBhdHRycz1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgbmV3IERpc3RyaWJ1dGlvbiBpbnN0YW5jZTogaW5pdGlhbGl6ZSBhbGwgdGhlCisgICAgICAgIGF0dHJpYnV0ZXMgb2YgYSBEaXN0cmlidXRpb24sIGFuZCB0aGVuIHVzZSAnYXR0cnMnIChhIGRpY3Rpb25hcnkKKyAgICAgICAgbWFwcGluZyBhdHRyaWJ1dGUgbmFtZXMgdG8gdmFsdWVzKSB0byBhc3NpZ24gc29tZSBvZiB0aG9zZQorICAgICAgICBhdHRyaWJ1dGVzIHRoZWlyICJyZWFsIiB2YWx1ZXMuICAoQW55IGF0dHJpYnV0ZXMgbm90IG1lbnRpb25lZCBpbgorICAgICAgICAnYXR0cnMnIHdpbGwgYmUgYXNzaWduZWQgdG8gc29tZSBudWxsIHZhbHVlOiAwLCBOb25lLCBhbiBlbXB0eSBsaXN0CisgICAgICAgIG9yIGRpY3Rpb25hcnksIGV0Yy4pICBNb3N0IGltcG9ydGFudGx5LCBpbml0aWFsaXplIHRoZQorICAgICAgICAnY29tbWFuZF9vYmonIGF0dHJpYnV0ZSB0byB0aGUgZW1wdHkgZGljdGlvbmFyeTsgdGhpcyB3aWxsIGJlCisgICAgICAgIGZpbGxlZCBpbiB3aXRoIHJlYWwgY29tbWFuZCBvYmplY3RzIGJ5ICdwYXJzZV9jb21tYW5kX2xpbmUoKScuCisgICAgICAgICIiIgorCisgICAgICAgICMgRGVmYXVsdCB2YWx1ZXMgZm9yIG91ciBjb21tYW5kLWxpbmUgb3B0aW9ucworICAgICAgICBzZWxmLnZlcmJvc2UgPSAxCisgICAgICAgIHNlbGYuZHJ5X3J1biA9IDAKKyAgICAgICAgc2VsZi5oZWxwID0gMAorICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLmRpc3BsYXlfb3B0aW9uX25hbWVzOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCAwKQorCisgICAgICAgICMgU3RvcmUgdGhlIGRpc3RyaWJ1dGlvbiBtZXRhLWRhdGEgKG5hbWUsIHZlcnNpb24sIGF1dGhvciwgYW5kIHNvCisgICAgICAgICMgZm9ydGgpIGluIGEgc2VwYXJhdGUgb2JqZWN0IC0tIHdlJ3JlIGdldHRpbmcgdG8gaGF2ZSBlbm91Z2gKKyAgICAgICAgIyBpbmZvcm1hdGlvbiBoZXJlIChhbmQgZW5vdWdoIGNvbW1hbmQtbGluZSBvcHRpb25zKSB0aGF0IGl0J3MKKyAgICAgICAgIyB3b3J0aCBpdC4gIEFsc28gZGVsZWdhdGUgJ2dldF9YWFgoKScgbWV0aG9kcyB0byB0aGUgJ21ldGFkYXRhJworICAgICAgICAjIG9iamVjdCBpbiBhIHNuZWFreSBhbmQgdW5kZXJoYW5kZWQgKGJ1dCBlZmZpY2llbnQhKSB3YXkuCisgICAgICAgIHNlbGYubWV0YWRhdGEgPSBEaXN0cmlidXRpb25NZXRhZGF0YSgpCisgICAgICAgIGZvciBiYXNlbmFtZSBpbiBzZWxmLm1ldGFkYXRhLl9NRVRIT0RfQkFTRU5BTUVTOgorICAgICAgICAgICAgbWV0aG9kX25hbWUgPSAiZ2V0XyIgKyBiYXNlbmFtZQorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBtZXRob2RfbmFtZSwgZ2V0YXR0cihzZWxmLm1ldGFkYXRhLCBtZXRob2RfbmFtZSkpCisKKyAgICAgICAgIyAnY21kY2xhc3MnIG1hcHMgY29tbWFuZCBuYW1lcyB0byBjbGFzcyBvYmplY3RzLCBzbyB3ZQorICAgICAgICAjIGNhbiAxKSBxdWlja2x5IGZpZ3VyZSBvdXQgd2hpY2ggY2xhc3MgdG8gaW5zdGFudGlhdGUgd2hlbgorICAgICAgICAjIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGNvbW1hbmQgb2JqZWN0LCBhbmQgMikgaGF2ZSBhIHdheQorICAgICAgICAjIGZvciB0aGUgc2V0dXAgc2NyaXB0IHRvIG92ZXJyaWRlIGNvbW1hbmQgY2xhc3NlcworICAgICAgICBzZWxmLmNtZGNsYXNzID0ge30KKworICAgICAgICAjICdjb21tYW5kX3BhY2thZ2VzJyBpcyBhIGxpc3Qgb2YgcGFja2FnZXMgaW4gd2hpY2ggY29tbWFuZHMKKyAgICAgICAgIyBhcmUgc2VhcmNoZWQgZm9yLiAgVGhlIGZhY3RvcnkgZm9yIGNvbW1hbmQgJ2ZvbycgaXMgZXhwZWN0ZWQKKyAgICAgICAgIyB0byBiZSBuYW1lZCAnZm9vJyBpbiB0aGUgbW9kdWxlICdmb28nIGluIG9uZSBvZiB0aGUgcGFja2FnZXMKKyAgICAgICAgIyBuYW1lZCBoZXJlLiAgVGhpcyBsaXN0IGlzIHNlYXJjaGVkIGZyb20gdGhlIGxlZnQ7IGFuIGVycm9yCisgICAgICAgICMgaXMgcmFpc2VkIGlmIG5vIG5hbWVkIHBhY2thZ2UgcHJvdmlkZXMgdGhlIGNvbW1hbmQgYmVpbmcKKyAgICAgICAgIyBzZWFyY2hlZCBmb3IuICAoQWx3YXlzIGFjY2VzcyB1c2luZyBnZXRfY29tbWFuZF9wYWNrYWdlcygpLikKKyAgICAgICAgc2VsZi5jb21tYW5kX3BhY2thZ2VzID0gTm9uZQorCisgICAgICAgICMgJ3NjcmlwdF9uYW1lJyBhbmQgJ3NjcmlwdF9hcmdzJyBhcmUgdXN1YWxseSBzZXQgdG8gc3lzLmFyZ3ZbMF0KKyAgICAgICAgIyBhbmQgc3lzLmFyZ3ZbMTpdLCBidXQgdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiB3aGVuIHRoZSBjYWxsZXIgaXMKKyAgICAgICAgIyBub3QgbmVjZXNzYXJpbHkgYSBzZXR1cCBzY3JpcHQgcnVuIGZyb20gdGhlIGNvbW1hbmQtbGluZS4KKyAgICAgICAgc2VsZi5zY3JpcHRfbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5zY3JpcHRfYXJncyA9IE5vbmUKKworICAgICAgICAjICdjb21tYW5kX29wdGlvbnMnIGlzIHdoZXJlIHdlIHN0b3JlIGNvbW1hbmQgb3B0aW9ucyBiZXR3ZWVuCisgICAgICAgICMgcGFyc2luZyB0aGVtIChmcm9tIGNvbmZpZyBmaWxlcywgdGhlIGNvbW1hbmQtbGluZSwgZXRjLikgYW5kIHdoZW4KKyAgICAgICAgIyB0aGV5IGFyZSBhY3R1YWxseSBuZWVkZWQgLS0gaWUuIHdoZW4gdGhlIGNvbW1hbmQgaW4gcXVlc3Rpb24gaXMKKyAgICAgICAgIyBpbnN0YW50aWF0ZWQuICBJdCBpcyBhIGRpY3Rpb25hcnkgb2YgZGljdGlvbmFyaWVzIG9mIDItdHVwbGVzOgorICAgICAgICAjICAgY29tbWFuZF9vcHRpb25zID0geyBjb21tYW5kX25hbWUgOiB7IG9wdGlvbiA6IChzb3VyY2UsIHZhbHVlKSB9IH0KKyAgICAgICAgc2VsZi5jb21tYW5kX29wdGlvbnMgPSB7fQorCisgICAgICAgICMgJ2Rpc3RfZmlsZXMnIGlzIHRoZSBsaXN0IG9mIChjb21tYW5kLCBweXZlcnNpb24sIGZpbGUpIHRoYXQKKyAgICAgICAgIyBoYXZlIGJlZW4gY3JlYXRlZCBieSBhbnkgZGlzdCBjb21tYW5kcyBydW4gc28gZmFyLiBUaGlzIGlzCisgICAgICAgICMgZmlsbGVkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcnVuIGlzIGRyeSBvciBub3QuIHB5dmVyc2lvbgorICAgICAgICAjIGdpdmVzIHN5c2NvbmZpZy5nZXRfcHl0aG9uX3ZlcnNpb24oKSBpZiB0aGUgZGlzdCBmaWxlIGlzCisgICAgICAgICMgc3BlY2lmaWMgdG8gYSBQeXRob24gdmVyc2lvbiwgJ2FueScgaWYgaXQgaXMgZ29vZCBmb3IgYWxsCisgICAgICAgICMgUHl0aG9uIHZlcnNpb25zIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIGFuZCAnJyBmb3IgYSBzb3VyY2UKKyAgICAgICAgIyBmaWxlLiBweXZlcnNpb24gc2hvdWxkIG5vdCBiZSB1c2VkIHRvIHNwZWNpZnkgbWluaW11bSBvcgorICAgICAgICAjIG1heGltdW0gcmVxdWlyZWQgUHl0aG9uIHZlcnNpb25zOyB1c2UgdGhlIG1ldGFpbmZvIGZvciB0aGF0CisgICAgICAgICMgaW5zdGVhZC4KKyAgICAgICAgc2VsZi5kaXN0X2ZpbGVzID0gW10KKworICAgICAgICAjIFRoZXNlIG9wdGlvbnMgYXJlIHJlYWxseSB0aGUgYnVzaW5lc3Mgb2YgdmFyaW91cyBjb21tYW5kcywgcmF0aGVyCisgICAgICAgICMgdGhhbiBvZiB0aGUgRGlzdHJpYnV0aW9uIGl0c2VsZi4gIFdlIHByb3ZpZGUgYWxpYXNlcyBmb3IgdGhlbSBpbgorICAgICAgICAjIERpc3RyaWJ1dGlvbiBhcyBhIGNvbnZlbmllbmNlIHRvIHRoZSBkZXZlbG9wZXIuCisgICAgICAgIHNlbGYucGFja2FnZXMgPSBOb25lCisgICAgICAgIHNlbGYucGFja2FnZV9kYXRhID0ge30KKyAgICAgICAgc2VsZi5wYWNrYWdlX2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5weV9tb2R1bGVzID0gTm9uZQorICAgICAgICBzZWxmLmxpYnJhcmllcyA9IE5vbmUKKyAgICAgICAgc2VsZi5oZWFkZXJzID0gTm9uZQorICAgICAgICBzZWxmLmV4dF9tb2R1bGVzID0gTm9uZQorICAgICAgICBzZWxmLmV4dF9wYWNrYWdlID0gTm9uZQorICAgICAgICBzZWxmLmluY2x1ZGVfZGlycyA9IE5vbmUKKyAgICAgICAgc2VsZi5leHRyYV9wYXRoID0gTm9uZQorICAgICAgICBzZWxmLnNjcmlwdHMgPSBOb25lCisgICAgICAgIHNlbGYuZGF0YV9maWxlcyA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXNzd29yZCA9ICcnCisKKyAgICAgICAgIyBBbmQgbm93IGluaXRpYWxpemUgYm9va2tlZXBpbmcgc3R1ZmYgdGhhdCBjYW4ndCBiZSBzdXBwbGllZCBieQorICAgICAgICAjIHRoZSBjYWxsZXIgYXQgYWxsLiAgJ2NvbW1hbmRfb2JqJyBtYXBzIGNvbW1hbmQgbmFtZXMgdG8KKyAgICAgICAgIyBDb21tYW5kIGluc3RhbmNlcyAtLSB0aGF0J3MgaG93IHdlIGVuZm9yY2UgdGhhdCBldmVyeSBjb21tYW5kCisgICAgICAgICMgY2xhc3MgaXMgYSBzaW5nbGV0b24uCisgICAgICAgIHNlbGYuY29tbWFuZF9vYmogPSB7fQorCisgICAgICAgICMgJ2hhdmVfcnVuJyBtYXBzIGNvbW1hbmQgbmFtZXMgdG8gYm9vbGVhbiB2YWx1ZXM7IGl0IGtlZXBzIHRyYWNrCisgICAgICAgICMgb2Ygd2hldGhlciB3ZSBoYXZlIGFjdHVhbGx5IHJ1biBhIHBhcnRpY3VsYXIgY29tbWFuZCwgdG8gbWFrZSBpdAorICAgICAgICAjIGNoZWFwIHRvICJydW4iIGEgY29tbWFuZCB3aGVuZXZlciB3ZSB0aGluayB3ZSBtaWdodCBuZWVkIHRvIC0tIGlmCisgICAgICAgICMgaXQncyBhbHJlYWR5IGJlZW4gZG9uZSwgbm8gbmVlZCBmb3IgZXhwZW5zaXZlIGZpbGVzeXN0ZW0KKyAgICAgICAgIyBvcGVyYXRpb25zLCB3ZSBqdXN0IGNoZWNrIHRoZSAnaGF2ZV9ydW4nIGRpY3Rpb25hcnkgYW5kIGNhcnJ5IG9uLgorICAgICAgICAjIEl0J3Mgb25seSBzYWZlIHRvIHF1ZXJ5ICdoYXZlX3J1bicgZm9yIGEgY29tbWFuZCBjbGFzcyB0aGF0IGhhcworICAgICAgICAjIGJlZW4gaW5zdGFudGlhdGVkIC0tIGEgZmFsc2UgdmFsdWUgd2lsbCBiZSBpbnNlcnRlZCB3aGVuIHRoZQorICAgICAgICAjIGNvbW1hbmQgb2JqZWN0IGlzIGNyZWF0ZWQsIGFuZCByZXBsYWNlZCB3aXRoIGEgdHJ1ZSB2YWx1ZSB3aGVuCisgICAgICAgICMgdGhlIGNvbW1hbmQgaXMgc3VjY2Vzc2Z1bGx5IHJ1bi4gIFRodXMgaXQncyBwcm9iYWJseSBiZXN0IHRvIHVzZQorICAgICAgICAjICcuZ2V0KCknIHJhdGhlciB0aGFuIGEgc3RyYWlnaHQgbG9va3VwLgorICAgICAgICBzZWxmLmhhdmVfcnVuID0ge30KKworICAgICAgICAjIE5vdyB3ZSdsbCB1c2UgdGhlIGF0dHJzIGRpY3Rpb25hcnkgKHVsdGltYXRlbHksIGtleXdvcmQgYXJncyBmcm9tCisgICAgICAgICMgdGhlIHNldHVwIHNjcmlwdCkgdG8gcG9zc2libHkgb3ZlcnJpZGUgYW55IG9yIGFsbCBvZiB0aGVzZQorICAgICAgICAjIGRpc3RyaWJ1dGlvbiBvcHRpb25zLgorCisgICAgICAgIGlmIGF0dHJzOgorICAgICAgICAgICAgIyBQdWxsIG91dCB0aGUgc2V0IG9mIGNvbW1hbmQgb3B0aW9ucyBhbmQgd29yayBvbiB0aGVtCisgICAgICAgICAgICAjIHNwZWNpZmljYWxseS4gIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGd1YXJhbnRlZXMgdGhhdCBhbGlhc2VkCisgICAgICAgICAgICAjIGNvbW1hbmQgb3B0aW9ucyB3aWxsIG92ZXJyaWRlIGFueSBzdXBwbGllZCByZWR1bmRhbnRseQorICAgICAgICAgICAgIyB0aHJvdWdoIHRoZSBnZW5lcmFsIG9wdGlvbnMgZGljdGlvbmFyeS4KKyAgICAgICAgICAgIG9wdGlvbnMgPSBhdHRycy5nZXQoJ29wdGlvbnMnKQorICAgICAgICAgICAgaWYgb3B0aW9ucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBkZWwgYXR0cnNbJ29wdGlvbnMnXQorICAgICAgICAgICAgICAgIGZvciAoY29tbWFuZCwgY21kX29wdGlvbnMpIGluIG9wdGlvbnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgb3B0X2RpY3QgPSBzZWxmLmdldF9vcHRpb25fZGljdChjb21tYW5kKQorICAgICAgICAgICAgICAgICAgICBmb3IgKG9wdCwgdmFsKSBpbiBjbWRfb3B0aW9ucy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RpY3Rbb3B0XSA9ICgic2V0dXAgc2NyaXB0IiwgdmFsKQorCisgICAgICAgICAgICBpZiAnbGljZW5jZScgaW4gYXR0cnM6CisgICAgICAgICAgICAgICAgYXR0cnNbJ2xpY2Vuc2UnXSA9IGF0dHJzWydsaWNlbmNlJ10KKyAgICAgICAgICAgICAgICBkZWwgYXR0cnNbJ2xpY2VuY2UnXQorICAgICAgICAgICAgICAgIG1zZyA9ICInbGljZW5jZScgZGlzdHJpYnV0aW9uIG9wdGlvbiBpcyBkZXByZWNhdGVkOyB1c2UgJ2xpY2Vuc2UnIgorICAgICAgICAgICAgICAgIGlmIHdhcm5pbmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKG1zZyArICJcbiIpCisKKyAgICAgICAgICAgICMgTm93IHdvcmsgb24gdGhlIHJlc3Qgb2YgdGhlIGF0dHJpYnV0ZXMuICBBbnkgYXR0cmlidXRlIHRoYXQncworICAgICAgICAgICAgIyBub3QgYWxyZWFkeSBkZWZpbmVkIGlzIGludmFsaWQhCisgICAgICAgICAgICBmb3IgKGtleSwgdmFsKSBpbiBhdHRycy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5tZXRhZGF0YSwgInNldF8iICsga2V5KToKKyAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihzZWxmLm1ldGFkYXRhLCAic2V0XyIgKyBrZXkpKHZhbCkKKyAgICAgICAgICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZi5tZXRhZGF0YSwga2V5KToKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLm1ldGFkYXRhLCBrZXksIHZhbCkKKyAgICAgICAgICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrZXksIHZhbCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtc2cgPSAiVW5rbm93biBkaXN0cmlidXRpb24gb3B0aW9uOiAlcyIgJSByZXByKGtleSkKKyAgICAgICAgICAgICAgICAgICAgaWYgd2FybmluZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnICsgIlxuIikKKworICAgICAgICAjIG5vLXVzZXItY2ZnIGlzIGhhbmRsZWQgYmVmb3JlIG90aGVyIGNvbW1hbmQgbGluZSBhcmdzCisgICAgICAgICMgYmVjYXVzZSBvdGhlciBhcmdzIG92ZXJyaWRlIHRoZSBjb25maWcgZmlsZXMsIGFuZCB0aGlzCisgICAgICAgICMgb25lIGlzIG5lZWRlZCBiZWZvcmUgd2UgY2FuIGxvYWQgdGhlIGNvbmZpZyBmaWxlcy4KKyAgICAgICAgIyBJZiBhdHRyc1snc2NyaXB0X2FyZ3MnXSB3YXNuJ3QgcGFzc2VkLCBhc3N1bWUgZmFsc2UuCisgICAgICAgICMKKyAgICAgICAgIyBUaGlzIGFsc28gbWFrZSBzdXJlIHdlIGp1c3QgbG9vayBhdCB0aGUgZ2xvYmFsIG9wdGlvbnMKKyAgICAgICAgc2VsZi53YW50X3VzZXJfY2ZnID0gVHJ1ZQorCisgICAgICAgIGlmIHNlbGYuc2NyaXB0X2FyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3IgYXJnIGluIHNlbGYuc2NyaXB0X2FyZ3M6CisgICAgICAgICAgICAgICAgaWYgbm90IGFyZy5zdGFydHN3aXRoKCctJyk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgYXJnID09ICctLW5vLXVzZXItY2ZnJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53YW50X3VzZXJfY2ZnID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBzZWxmLmZpbmFsaXplX29wdGlvbnMoKQorCisgICAgZGVmIGdldF9vcHRpb25fZGljdChzZWxmLCBjb21tYW5kKToKKyAgICAgICAgIiIiR2V0IHRoZSBvcHRpb24gZGljdGlvbmFyeSBmb3IgYSBnaXZlbiBjb21tYW5kLiAgSWYgdGhhdAorICAgICAgICBjb21tYW5kJ3Mgb3B0aW9uIGRpY3Rpb25hcnkgaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQsIHRoZW4gY3JlYXRlIGl0CisgICAgICAgIGFuZCByZXR1cm4gdGhlIG5ldyBkaWN0aW9uYXJ5OyBvdGhlcndpc2UsIHJldHVybiB0aGUgZXhpc3RpbmcKKyAgICAgICAgb3B0aW9uIGRpY3Rpb25hcnkuCisgICAgICAgICIiIgorICAgICAgICBkaWN0ID0gc2VsZi5jb21tYW5kX29wdGlvbnMuZ2V0KGNvbW1hbmQpCisgICAgICAgIGlmIGRpY3QgaXMgTm9uZToKKyAgICAgICAgICAgIGRpY3QgPSBzZWxmLmNvbW1hbmRfb3B0aW9uc1tjb21tYW5kXSA9IHt9CisgICAgICAgIHJldHVybiBkaWN0CisKKyAgICBkZWYgZHVtcF9vcHRpb25fZGljdHMoc2VsZiwgaGVhZGVyPU5vbmUsIGNvbW1hbmRzPU5vbmUsIGluZGVudD0iIik6CisgICAgICAgIGZyb20gcHByaW50IGltcG9ydCBwZm9ybWF0CisKKyAgICAgICAgaWYgY29tbWFuZHMgaXMgTm9uZTogICAgICAgICAgICAgIyBkdW1wIGFsbCBjb21tYW5kIG9wdGlvbiBkaWN0cworICAgICAgICAgICAgY29tbWFuZHMgPSBzZWxmLmNvbW1hbmRfb3B0aW9ucy5rZXlzKCkKKyAgICAgICAgICAgIGNvbW1hbmRzLnNvcnQoKQorCisgICAgICAgIGlmIGhlYWRlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoaW5kZW50ICsgaGVhZGVyKQorICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50ICsgIiAgIgorCisgICAgICAgIGlmIG5vdCBjb21tYW5kczoKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoaW5kZW50ICsgIm5vIGNvbW1hbmRzIGtub3duIHlldCIpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmb3IgY21kX25hbWUgaW4gY29tbWFuZHM6CisgICAgICAgICAgICBvcHRfZGljdCA9IHNlbGYuY29tbWFuZF9vcHRpb25zLmdldChjbWRfbmFtZSkKKyAgICAgICAgICAgIGlmIG9wdF9kaWN0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIG9wdGlvbiBkaWN0IGZvciAnJXMnIGNvbW1hbmQiICUgY21kX25hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoaW5kZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gZGljdCBmb3IgJyVzJyBjb21tYW5kOiIgJSBjbWRfbmFtZSkKKyAgICAgICAgICAgICAgICBvdXQgPSBwZm9ybWF0KG9wdF9kaWN0KQorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIG91dC5zcGxpdCgnXG4nKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShpbmRlbnQgKyAiICAiICsgbGluZSkKKworICAgICMgLS0gQ29uZmlnIGZpbGUgZmluZGluZy9wYXJzaW5nIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZmluZF9jb25maWdfZmlsZXMoc2VsZik6CisgICAgICAgICIiIkZpbmQgYXMgbWFueSBjb25maWd1cmF0aW9uIGZpbGVzIGFzIHNob3VsZCBiZSBwcm9jZXNzZWQgZm9yIHRoaXMKKyAgICAgICAgcGxhdGZvcm0sIGFuZCByZXR1cm4gYSBsaXN0IG9mIGZpbGVuYW1lcyBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleQorICAgICAgICBzaG91bGQgYmUgcGFyc2VkLiAgVGhlIGZpbGVuYW1lcyByZXR1cm5lZCBhcmUgZ3VhcmFudGVlZCB0byBleGlzdAorICAgICAgICAobW9kdWxvIG5hc3R5IHJhY2UgY29uZGl0aW9ucykuCisKKyAgICAgICAgVGhlcmUgYXJlIHRocmVlIHBvc3NpYmxlIGNvbmZpZyBmaWxlczogZGlzdHV0aWxzLmNmZyBpbiB0aGUKKyAgICAgICAgRGlzdHV0aWxzIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgKGllLiB3aGVyZSB0aGUgdG9wLWxldmVsCisgICAgICAgIERpc3R1dGlscyBfX2luc3RfXy5weSBmaWxlIGxpdmVzKSwgYSBmaWxlIGluIHRoZSB1c2VyJ3MgaG9tZQorICAgICAgICBkaXJlY3RvcnkgbmFtZWQgLnB5ZGlzdHV0aWxzLmNmZyBvbiBVbml4IGFuZCBweWRpc3R1dGlscy5jZmcKKyAgICAgICAgb24gV2luZG93cy9NYWM7IGFuZCBzZXR1cC5jZmcgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorCisgICAgICAgIFRoZSBmaWxlIGluIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlCisgICAgICAgIC0tbm8tdXNlci1jZmcgb3B0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgZmlsZXMgPSBbXQorICAgICAgICBjaGVja19lbnZpcm9uKCkKKworICAgICAgICAjIFdoZXJlIHRvIGxvb2sgZm9yIHRoZSBzeXN0ZW0td2lkZSBEaXN0dXRpbHMgY29uZmlnIGZpbGUKKyAgICAgICAgc3lzX2RpciA9IG9zLnBhdGguZGlybmFtZShzeXMubW9kdWxlc1snZGlzdHV0aWxzJ10uX19maWxlX18pCisKKyAgICAgICAgIyBMb29rIGZvciB0aGUgc3lzdGVtIGNvbmZpZyBmaWxlCisgICAgICAgIHN5c19maWxlID0gb3MucGF0aC5qb2luKHN5c19kaXIsICJkaXN0dXRpbHMuY2ZnIikKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc3lzX2ZpbGUpOgorICAgICAgICAgICAgZmlsZXMuYXBwZW5kKHN5c19maWxlKQorCisgICAgICAgICMgV2hhdCB0byBjYWxsIHRoZSBwZXItdXNlciBjb25maWcgZmlsZQorICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICB1c2VyX2ZpbGVuYW1lID0gIi5weWRpc3R1dGlscy5jZmciCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1c2VyX2ZpbGVuYW1lID0gInB5ZGlzdHV0aWxzLmNmZyIKKworICAgICAgICAjIEFuZCBsb29rIGZvciB0aGUgdXNlciBjb25maWcgZmlsZQorICAgICAgICBpZiBzZWxmLndhbnRfdXNlcl9jZmc6CisgICAgICAgICAgICB1c2VyX2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5leHBhbmR1c2VyKCd+JyksIHVzZXJfZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSh1c2VyX2ZpbGUpOgorICAgICAgICAgICAgICAgIGZpbGVzLmFwcGVuZCh1c2VyX2ZpbGUpCisKKyAgICAgICAgIyBBbGwgcGxhdGZvcm1zIHN1cHBvcnQgbG9jYWwgc2V0dXAuY2ZnCisgICAgICAgIGxvY2FsX2ZpbGUgPSAic2V0dXAuY2ZnIgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShsb2NhbF9maWxlKToKKyAgICAgICAgICAgIGZpbGVzLmFwcGVuZChsb2NhbF9maWxlKQorCisgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgidXNpbmcgY29uZmlnIGZpbGVzOiAlcyIgJSAnLCAnLmpvaW4oZmlsZXMpKQorCisgICAgICAgIHJldHVybiBmaWxlcworCisgICAgZGVmIHBhcnNlX2NvbmZpZ19maWxlcyhzZWxmLCBmaWxlbmFtZXM9Tm9uZSk6CisgICAgICAgIGZyb20gQ29uZmlnUGFyc2VyIGltcG9ydCBDb25maWdQYXJzZXIKKworICAgICAgICBpZiBmaWxlbmFtZXMgaXMgTm9uZToKKyAgICAgICAgICAgIGZpbGVuYW1lcyA9IHNlbGYuZmluZF9jb25maWdfZmlsZXMoKQorCisgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiRGlzdHJpYnV0aW9uLnBhcnNlX2NvbmZpZ19maWxlcygpOiIpCisKKyAgICAgICAgcGFyc2VyID0gQ29uZmlnUGFyc2VyKCkKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIiAgcmVhZGluZyAlcyIgJSBmaWxlbmFtZSkKKyAgICAgICAgICAgIHBhcnNlci5yZWFkKGZpbGVuYW1lKQorICAgICAgICAgICAgZm9yIHNlY3Rpb24gaW4gcGFyc2VyLnNlY3Rpb25zKCk6CisgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHBhcnNlci5vcHRpb25zKHNlY3Rpb24pCisgICAgICAgICAgICAgICAgb3B0X2RpY3QgPSBzZWxmLmdldF9vcHRpb25fZGljdChzZWN0aW9uKQorCisgICAgICAgICAgICAgICAgZm9yIG9wdCBpbiBvcHRpb25zOgorICAgICAgICAgICAgICAgICAgICBpZiBvcHQgIT0gJ19fbmFtZV9fJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHBhcnNlci5nZXQoc2VjdGlvbixvcHQpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHQgPSBvcHQucmVwbGFjZSgnLScsICdfJykKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdF9kaWN0W29wdF0gPSAoZmlsZW5hbWUsIHZhbCkKKworICAgICAgICAgICAgIyBNYWtlIHRoZSBDb25maWdQYXJzZXIgZm9yZ2V0IGV2ZXJ5dGhpbmcgKHNvIHdlIHJldGFpbgorICAgICAgICAgICAgIyB0aGUgb3JpZ2luYWwgZmlsZW5hbWVzIHRoYXQgb3B0aW9ucyBjb21lIGZyb20pCisgICAgICAgICAgICBwYXJzZXIuX19pbml0X18oKQorCisgICAgICAgICMgSWYgdGhlcmUgd2FzIGEgImdsb2JhbCIgc2VjdGlvbiBpbiB0aGUgY29uZmlnIGZpbGUsIHVzZSBpdAorICAgICAgICAjIHRvIHNldCBEaXN0cmlidXRpb24gb3B0aW9ucy4KKworICAgICAgICBpZiAnZ2xvYmFsJyBpbiBzZWxmLmNvbW1hbmRfb3B0aW9uczoKKyAgICAgICAgICAgIGZvciAob3B0LCAoc3JjLCB2YWwpKSBpbiBzZWxmLmNvbW1hbmRfb3B0aW9uc1snZ2xvYmFsJ10uaXRlbXMoKToKKyAgICAgICAgICAgICAgICBhbGlhcyA9IHNlbGYubmVnYXRpdmVfb3B0LmdldChvcHQpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBhbGlhczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYWxpYXMsIG5vdCBzdHJ0b2Jvb2wodmFsKSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCd2ZXJib3NlJywgJ2RyeV9ydW4nKTogIyB1Z2ghCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG9wdCwgc3RydG9ib29sKHZhbCkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG9wdCwgdmFsKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBtc2cKKworICAgICMgLS0gQ29tbWFuZC1saW5lIHBhcnNpbmcgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgcGFyc2VfY29tbWFuZF9saW5lKHNlbGYpOgorICAgICAgICAiIiJQYXJzZSB0aGUgc2V0dXAgc2NyaXB0J3MgY29tbWFuZCBsaW5lLCB0YWtlbiBmcm9tIHRoZQorICAgICAgICAnc2NyaXB0X2FyZ3MnIGluc3RhbmNlIGF0dHJpYnV0ZSAod2hpY2ggZGVmYXVsdHMgdG8gJ3N5cy5hcmd2WzE6XScKKyAgICAgICAgLS0gc2VlICdzZXR1cCgpJyBpbiBjb3JlLnB5KS4gIFRoaXMgbGlzdCBpcyBmaXJzdCBwcm9jZXNzZWQgZm9yCisgICAgICAgICJnbG9iYWwgb3B0aW9ucyIgLS0gb3B0aW9ucyB0aGF0IHNldCBhdHRyaWJ1dGVzIG9mIHRoZSBEaXN0cmlidXRpb24KKyAgICAgICAgaW5zdGFuY2UuICBUaGVuLCBpdCBpcyBhbHRlcm5hdGVseSBzY2FubmVkIGZvciBEaXN0dXRpbHMgY29tbWFuZHMKKyAgICAgICAgYW5kIG9wdGlvbnMgZm9yIHRoYXQgY29tbWFuZC4gIEVhY2ggbmV3IGNvbW1hbmQgdGVybWluYXRlcyB0aGUKKyAgICAgICAgb3B0aW9ucyBmb3IgdGhlIHByZXZpb3VzIGNvbW1hbmQuICBUaGUgYWxsb3dlZCBvcHRpb25zIGZvciBhCisgICAgICAgIGNvbW1hbmQgYXJlIGRldGVybWluZWQgYnkgdGhlICd1c2VyX29wdGlvbnMnIGF0dHJpYnV0ZSBvZiB0aGUKKyAgICAgICAgY29tbWFuZCBjbGFzcyAtLSB0aHVzLCB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gbG9hZCBjb21tYW5kIGNsYXNzZXMKKyAgICAgICAgaW4gb3JkZXIgdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZS4gIEFueSBlcnJvciBpbiB0aGF0ICdvcHRpb25zJworICAgICAgICBhdHRyaWJ1dGUgcmFpc2VzIERpc3R1dGlsc0dldG9wdEVycm9yOyBhbnkgZXJyb3Igb24gdGhlCisgICAgICAgIGNvbW1hbmQtbGluZSByYWlzZXMgRGlzdHV0aWxzQXJnRXJyb3IuICBJZiBubyBEaXN0dXRpbHMgY29tbWFuZHMKKyAgICAgICAgd2VyZSBmb3VuZCBvbiB0aGUgY29tbWFuZCBsaW5lLCByYWlzZXMgRGlzdHV0aWxzQXJnRXJyb3IuICBSZXR1cm4KKyAgICAgICAgdHJ1ZSBpZiBjb21tYW5kLWxpbmUgd2FzIHN1Y2Nlc3NmdWxseSBwYXJzZWQgYW5kIHdlIHNob3VsZCBjYXJyeQorICAgICAgICBvbiB3aXRoIGV4ZWN1dGluZyBjb21tYW5kczsgZmFsc2UgaWYgbm8gZXJyb3JzIGJ1dCB3ZSBzaG91bGRuJ3QKKyAgICAgICAgZXhlY3V0ZSBjb21tYW5kcyAoY3VycmVudGx5LCB0aGlzIG9ubHkgaGFwcGVucyBpZiB1c2VyIGFza3MgZm9yCisgICAgICAgIGhlbHApLgorICAgICAgICAiIiIKKyAgICAgICAgIworICAgICAgICAjIFdlIG5vdyBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBzaG93IHRoZSBNYWNpbnRvc2ggZGlhbG9nCisgICAgICAgICMgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gaW50ZXJhY3RpdmVseSBzcGVjaWZ5IHRoZSAiY29tbWFuZCBsaW5lIi4KKyAgICAgICAgIworICAgICAgICB0b3BsZXZlbF9vcHRpb25zID0gc2VsZi5fZ2V0X3RvcGxldmVsX29wdGlvbnMoKQorCisgICAgICAgICMgV2UgaGF2ZSB0byBwYXJzZSB0aGUgY29tbWFuZCBsaW5lIGEgYml0IGF0IGEgdGltZSAtLSBnbG9iYWwKKyAgICAgICAgIyBvcHRpb25zLCB0aGVuIHRoZSBmaXJzdCBjb21tYW5kLCB0aGVuIGl0cyBvcHRpb25zLCBhbmQgc28gb24gLS0KKyAgICAgICAgIyBiZWNhdXNlIGVhY2ggY29tbWFuZCB3aWxsIGJlIGhhbmRsZWQgYnkgYSBkaWZmZXJlbnQgY2xhc3MsIGFuZAorICAgICAgICAjIHRoZSBvcHRpb25zIHRoYXQgYXJlIHZhbGlkIGZvciBhIHBhcnRpY3VsYXIgY2xhc3MgYXJlbid0IGtub3duCisgICAgICAgICMgdW50aWwgd2UgaGF2ZSBsb2FkZWQgdGhlIGNvbW1hbmQgY2xhc3MsIHdoaWNoIGRvZXNuJ3QgaGFwcGVuCisgICAgICAgICMgdW50aWwgd2Uga25vdyB3aGF0IHRoZSBjb21tYW5kIGlzLgorCisgICAgICAgIHNlbGYuY29tbWFuZHMgPSBbXQorICAgICAgICBwYXJzZXIgPSBGYW5jeUdldG9wdCh0b3BsZXZlbF9vcHRpb25zICsgc2VsZi5kaXNwbGF5X29wdGlvbnMpCisgICAgICAgIHBhcnNlci5zZXRfbmVnYXRpdmVfYWxpYXNlcyhzZWxmLm5lZ2F0aXZlX29wdCkKKyAgICAgICAgcGFyc2VyLnNldF9hbGlhc2VzKHsnbGljZW5jZSc6ICdsaWNlbnNlJ30pCisgICAgICAgIGFyZ3MgPSBwYXJzZXIuZ2V0b3B0KGFyZ3M9c2VsZi5zY3JpcHRfYXJncywgb2JqZWN0PXNlbGYpCisgICAgICAgIG9wdGlvbl9vcmRlciA9IHBhcnNlci5nZXRfb3B0aW9uX29yZGVyKCkKKyAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlKQorCisgICAgICAgICMgZm9yIGRpc3BsYXkgb3B0aW9ucyB3ZSByZXR1cm4gaW1tZWRpYXRlbHkKKyAgICAgICAgaWYgc2VsZi5oYW5kbGVfZGlzcGxheV9vcHRpb25zKG9wdGlvbl9vcmRlcik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgd2hpbGUgYXJnczoKKyAgICAgICAgICAgIGFyZ3MgPSBzZWxmLl9wYXJzZV9jb21tYW5kX29wdHMocGFyc2VyLCBhcmdzKQorICAgICAgICAgICAgaWYgYXJncyBpcyBOb25lOiAgICAgICAgICAgICMgdXNlciBhc2tlZCBmb3IgaGVscCAoYW5kIGdvdCBpdCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIEhhbmRsZSB0aGUgY2FzZXMgb2YgLS1oZWxwIGFzIGEgImdsb2JhbCIgb3B0aW9uLCBpZS4KKyAgICAgICAgIyAic2V0dXAucHkgLS1oZWxwIiBhbmQgInNldHVwLnB5IC0taGVscCBjb21tYW5kIC4uLiIuICBGb3IgdGhlCisgICAgICAgICMgZm9ybWVyLCB3ZSBzaG93IGdsb2JhbCBvcHRpb25zICgtLXZlcmJvc2UsIC0tZHJ5LXJ1biwgZXRjLikKKyAgICAgICAgIyBhbmQgZGlzcGxheS1vbmx5IG9wdGlvbnMgKC0tbmFtZSwgLS12ZXJzaW9uLCBldGMuKTsgZm9yIHRoZQorICAgICAgICAjIGxhdHRlciwgd2Ugb21pdCB0aGUgZGlzcGxheS1vbmx5IG9wdGlvbnMgYW5kIHNob3cgaGVscCBmb3IKKyAgICAgICAgIyBlYWNoIGNvbW1hbmQgbGlzdGVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICAgIGlmIHNlbGYuaGVscDoKKyAgICAgICAgICAgIHNlbGYuX3Nob3dfaGVscChwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheV9vcHRpb25zPWxlbihzZWxmLmNvbW1hbmRzKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzPXNlbGYuY29tbWFuZHMpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIE9vcHMsIG5vIGNvbW1hbmRzIGZvdW5kIC0tIGFuIGVuZC11c2VyIGVycm9yCisgICAgICAgIGlmIG5vdCBzZWxmLmNvbW1hbmRzOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IsICJubyBjb21tYW5kcyBzdXBwbGllZCIKKworICAgICAgICAjIEFsbCBpcyB3ZWxsOiByZXR1cm4gdHJ1ZQorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIF9nZXRfdG9wbGV2ZWxfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBub24tZGlzcGxheSBvcHRpb25zIHJlY29nbml6ZWQgYXQgdGhlIHRvcCBsZXZlbC4KKworICAgICAgICBUaGlzIGluY2x1ZGVzIG9wdGlvbnMgdGhhdCBhcmUgcmVjb2duaXplZCAqb25seSogYXQgdGhlIHRvcAorICAgICAgICBsZXZlbCBhcyB3ZWxsIGFzIG9wdGlvbnMgcmVjb2duaXplZCBmb3IgY29tbWFuZHMuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5nbG9iYWxfb3B0aW9ucyArIFsKKyAgICAgICAgICAgICgiY29tbWFuZC1wYWNrYWdlcz0iLCBOb25lLAorICAgICAgICAgICAgICJsaXN0IG9mIHBhY2thZ2VzIHRoYXQgcHJvdmlkZSBkaXN0dXRpbHMgY29tbWFuZHMiKSwKKyAgICAgICAgICAgIF0KKworICAgIGRlZiBfcGFyc2VfY29tbWFuZF9vcHRzKHNlbGYsIHBhcnNlciwgYXJncyk6CisgICAgICAgICIiIlBhcnNlIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgYSBzaW5nbGUgY29tbWFuZC4KKyAgICAgICAgJ3BhcnNlcicgbXVzdCBiZSBhIEZhbmN5R2V0b3B0IGluc3RhbmNlOyAnYXJncycgbXVzdCBiZSB0aGUgbGlzdAorICAgICAgICBvZiBhcmd1bWVudHMsIHN0YXJ0aW5nIHdpdGggdGhlIGN1cnJlbnQgY29tbWFuZCAod2hvc2Ugb3B0aW9ucworICAgICAgICB3ZSBhcmUgYWJvdXQgdG8gcGFyc2UpLiAgUmV0dXJucyBhIG5ldyB2ZXJzaW9uIG9mICdhcmdzJyB3aXRoCisgICAgICAgIHRoZSBuZXh0IGNvbW1hbmQgYXQgdGhlIGZyb250IG9mIHRoZSBsaXN0OyB3aWxsIGJlIHRoZSBlbXB0eQorICAgICAgICBsaXN0IGlmIHRoZXJlIGFyZSBubyBtb3JlIGNvbW1hbmRzIG9uIHRoZSBjb21tYW5kIGxpbmUuICBSZXR1cm5zCisgICAgICAgIE5vbmUgaWYgdGhlIHVzZXIgYXNrZWQgZm9yIGhlbHAgb24gdGhpcyBjb21tYW5kLgorICAgICAgICAiIiIKKyAgICAgICAgIyBsYXRlIGltcG9ydCBiZWNhdXNlIG9mIG11dHVhbCBkZXBlbmRlbmNlIGJldHdlZW4gdGhlc2UgbW9kdWxlcworICAgICAgICBmcm9tIGRpc3R1dGlscy5jbWQgaW1wb3J0IENvbW1hbmQKKworICAgICAgICAjIFB1bGwgdGhlIGN1cnJlbnQgY29tbWFuZCBmcm9tIHRoZSBoZWFkIG9mIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgICAgY29tbWFuZCA9IGFyZ3NbMF0KKyAgICAgICAgaWYgbm90IGNvbW1hbmRfcmUubWF0Y2goY29tbWFuZCk6CisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCAiaW52YWxpZCBjb21tYW5kIG5hbWUgJyVzJyIgJSBjb21tYW5kCisgICAgICAgIHNlbGYuY29tbWFuZHMuYXBwZW5kKGNvbW1hbmQpCisKKyAgICAgICAgIyBEaWcgdXAgdGhlIGNvbW1hbmQgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgY29tbWFuZCwgc28gd2UKKyAgICAgICAgIyAxKSBrbm93IHRoYXQgaXQncyBhIHZhbGlkIGNvbW1hbmQsIGFuZCAyKSBrbm93IHdoaWNoIG9wdGlvbnMKKyAgICAgICAgIyBpdCB0YWtlcy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY21kX2NsYXNzID0gc2VsZi5nZXRfY29tbWFuZF9jbGFzcyhjb21tYW5kKQorICAgICAgICBleGNlcHQgRGlzdHV0aWxzTW9kdWxlRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yLCBtc2cKKworICAgICAgICAjIFJlcXVpcmUgdGhhdCB0aGUgY29tbWFuZCBjbGFzcyBiZSBkZXJpdmVkIGZyb20gQ29tbWFuZCAtLSB3YW50CisgICAgICAgICMgdG8gYmUgc3VyZSB0aGF0IHRoZSBiYXNpYyAiY29tbWFuZCIgaW50ZXJmYWNlIGlzIGltcGxlbWVudGVkLgorICAgICAgICBpZiBub3QgaXNzdWJjbGFzcyhjbWRfY2xhc3MsIENvbW1hbmQpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQ2xhc3NFcnJvciwgXAorICAgICAgICAgICAgICAgICAgImNvbW1hbmQgY2xhc3MgJXMgbXVzdCBzdWJjbGFzcyBDb21tYW5kIiAlIGNtZF9jbGFzcworCisgICAgICAgICMgQWxzbyBtYWtlIHN1cmUgdGhhdCB0aGUgY29tbWFuZCBvYmplY3QgcHJvdmlkZXMgYSBsaXN0IG9mIGl0cworICAgICAgICAjIGtub3duIG9wdGlvbnMuCisgICAgICAgIGlmIG5vdCAoaGFzYXR0cihjbWRfY2xhc3MsICd1c2VyX29wdGlvbnMnKSBhbmQKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGNtZF9jbGFzcy51c2VyX29wdGlvbnMsIGxpc3QpKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0NsYXNzRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICgiY29tbWFuZCBjbGFzcyAlcyBtdXN0IHByb3ZpZGUgIiArCisgICAgICAgICAgICAgICAgICAgIid1c2VyX29wdGlvbnMnIGF0dHJpYnV0ZSAoYSBsaXN0IG9mIHR1cGxlcykiKSAlIFwKKyAgICAgICAgICAgICAgICAgIGNtZF9jbGFzcworCisgICAgICAgICMgSWYgdGhlIGNvbW1hbmQgY2xhc3MgaGFzIGEgbGlzdCBvZiBuZWdhdGl2ZSBhbGlhcyBvcHRpb25zLAorICAgICAgICAjIG1lcmdlIGl0IGluIHdpdGggdGhlIGdsb2JhbCBuZWdhdGl2ZSBhbGlhc2VzLgorICAgICAgICBuZWdhdGl2ZV9vcHQgPSBzZWxmLm5lZ2F0aXZlX29wdAorICAgICAgICBpZiBoYXNhdHRyKGNtZF9jbGFzcywgJ25lZ2F0aXZlX29wdCcpOgorICAgICAgICAgICAgbmVnYXRpdmVfb3B0ID0gbmVnYXRpdmVfb3B0LmNvcHkoKQorICAgICAgICAgICAgbmVnYXRpdmVfb3B0LnVwZGF0ZShjbWRfY2xhc3MubmVnYXRpdmVfb3B0KQorCisgICAgICAgICMgQ2hlY2sgZm9yIGhlbHBfb3B0aW9ucyBpbiBjb21tYW5kIGNsYXNzLiAgVGhleSBoYXZlIGEgZGlmZmVyZW50CisgICAgICAgICMgZm9ybWF0ICh0dXBsZSBvZiBmb3VyKSBzbyB3ZSBuZWVkIHRvIHByZXByb2Nlc3MgdGhlbSBoZXJlLgorICAgICAgICBpZiAoaGFzYXR0cihjbWRfY2xhc3MsICdoZWxwX29wdGlvbnMnKSBhbmQKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY21kX2NsYXNzLmhlbHBfb3B0aW9ucywgbGlzdCkpOgorICAgICAgICAgICAgaGVscF9vcHRpb25zID0gZml4X2hlbHBfb3B0aW9ucyhjbWRfY2xhc3MuaGVscF9vcHRpb25zKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGVscF9vcHRpb25zID0gW10KKworCisgICAgICAgICMgQWxsIGNvbW1hbmRzIHN1cHBvcnQgdGhlIGdsb2JhbCBvcHRpb25zIHRvbywganVzdCBieSBhZGRpbmcKKyAgICAgICAgIyBpbiAnZ2xvYmFsX29wdGlvbnMnLgorICAgICAgICBwYXJzZXIuc2V0X29wdGlvbl90YWJsZShzZWxmLmdsb2JhbF9vcHRpb25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kX2NsYXNzLnVzZXJfb3B0aW9ucyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBfb3B0aW9ucykKKyAgICAgICAgcGFyc2VyLnNldF9uZWdhdGl2ZV9hbGlhc2VzKG5lZ2F0aXZlX29wdCkKKyAgICAgICAgKGFyZ3MsIG9wdHMpID0gcGFyc2VyLmdldG9wdChhcmdzWzE6XSkKKyAgICAgICAgaWYgaGFzYXR0cihvcHRzLCAnaGVscCcpIGFuZCBvcHRzLmhlbHA6CisgICAgICAgICAgICBzZWxmLl9zaG93X2hlbHAocGFyc2VyLCBkaXNwbGF5X29wdGlvbnM9MCwgY29tbWFuZHM9W2NtZF9jbGFzc10pCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiAoaGFzYXR0cihjbWRfY2xhc3MsICdoZWxwX29wdGlvbnMnKSBhbmQKKyAgICAgICAgICAgIGlzaW5zdGFuY2UoY21kX2NsYXNzLmhlbHBfb3B0aW9ucywgbGlzdCkpOgorICAgICAgICAgICAgaGVscF9vcHRpb25fZm91bmQ9MAorICAgICAgICAgICAgZm9yIChoZWxwX29wdGlvbiwgc2hvcnQsIGRlc2MsIGZ1bmMpIGluIGNtZF9jbGFzcy5oZWxwX29wdGlvbnM6CisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvcHRzLCBwYXJzZXIuZ2V0X2F0dHJfbmFtZShoZWxwX29wdGlvbikpOgorICAgICAgICAgICAgICAgICAgICBoZWxwX29wdGlvbl9mb3VuZD0xCisgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoZnVuYywgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jKCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0NsYXNzRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgaGVscCBmdW5jdGlvbiAlciBmb3IgaGVscCBvcHRpb24gJyVzJzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGEgY2FsbGFibGUgb2JqZWN0IChmdW5jdGlvbiwgZXRjLikiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZnVuYywgaGVscF9vcHRpb24pKQorCisgICAgICAgICAgICBpZiBoZWxwX29wdGlvbl9mb3VuZDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIFB1dCB0aGUgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kLWxpbmUgaW50byB0aGVpciBvZmZpY2lhbAorICAgICAgICAjIGhvbGRpbmcgcGVuLCB0aGUgJ2NvbW1hbmRfb3B0aW9ucycgZGljdGlvbmFyeS4KKyAgICAgICAgb3B0X2RpY3QgPSBzZWxmLmdldF9vcHRpb25fZGljdChjb21tYW5kKQorICAgICAgICBmb3IgKG5hbWUsIHZhbHVlKSBpbiB2YXJzKG9wdHMpLml0ZW1zKCk6CisgICAgICAgICAgICBvcHRfZGljdFtuYW1lXSA9ICgiY29tbWFuZCBsaW5lIiwgdmFsdWUpCisKKyAgICAgICAgcmV0dXJuIGFyZ3MKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICAiIiJTZXQgZmluYWwgdmFsdWVzIGZvciBhbGwgdGhlIG9wdGlvbnMgb24gdGhlIERpc3RyaWJ1dGlvbgorICAgICAgICBpbnN0YW5jZSwgYW5hbG9nb3VzIHRvIHRoZSAuZmluYWxpemVfb3B0aW9ucygpIG1ldGhvZCBvZiBDb21tYW5kCisgICAgICAgIG9iamVjdHMuCisgICAgICAgICIiIgorICAgICAgICBmb3IgYXR0ciBpbiAoJ2tleXdvcmRzJywgJ3BsYXRmb3JtcycpOgorICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHNlbGYubWV0YWRhdGEsIGF0dHIpCisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzdHIpOgorICAgICAgICAgICAgICAgIHZhbHVlID0gW2VsbS5zdHJpcCgpIGZvciBlbG0gaW4gdmFsdWUuc3BsaXQoJywnKV0KKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYubWV0YWRhdGEsIGF0dHIsIHZhbHVlKQorCisgICAgZGVmIF9zaG93X2hlbHAoc2VsZiwgcGFyc2VyLCBnbG9iYWxfb3B0aW9ucz0xLCBkaXNwbGF5X29wdGlvbnM9MSwKKyAgICAgICAgICAgICAgICAgICBjb21tYW5kcz1bXSk6CisgICAgICAgICIiIlNob3cgaGVscCBmb3IgdGhlIHNldHVwIHNjcmlwdCBjb21tYW5kLWxpbmUgaW4gdGhlIGZvcm0gb2YKKyAgICAgICAgc2V2ZXJhbCBsaXN0cyBvZiBjb21tYW5kLWxpbmUgb3B0aW9ucy4gICdwYXJzZXInIHNob3VsZCBiZSBhCisgICAgICAgIEZhbmN5R2V0b3B0IGluc3RhbmNlOyBkbyBub3QgZXhwZWN0IGl0IHRvIGJlIHJldHVybmVkIGluIHRoZQorICAgICAgICBzYW1lIHN0YXRlLCBhcyBpdHMgb3B0aW9uIHRhYmxlIHdpbGwgYmUgcmVzZXQgdG8gbWFrZSBpdAorICAgICAgICBnZW5lcmF0ZSB0aGUgY29ycmVjdCBoZWxwIHRleHQuCisKKyAgICAgICAgSWYgJ2dsb2JhbF9vcHRpb25zJyBpcyB0cnVlLCBsaXN0cyB0aGUgZ2xvYmFsIG9wdGlvbnM6CisgICAgICAgIC0tdmVyYm9zZSwgLS1kcnktcnVuLCBldGMuICBJZiAnZGlzcGxheV9vcHRpb25zJyBpcyB0cnVlLCBsaXN0cworICAgICAgICB0aGUgImRpc3BsYXktb25seSIgb3B0aW9uczogLS1uYW1lLCAtLXZlcnNpb24sIGV0Yy4gIEZpbmFsbHksCisgICAgICAgIGxpc3RzIHBlci1jb21tYW5kIGhlbHAgZm9yIGV2ZXJ5IGNvbW1hbmQgbmFtZSBvciBjb21tYW5kIGNsYXNzCisgICAgICAgIGluICdjb21tYW5kcycuCisgICAgICAgICIiIgorICAgICAgICAjIGxhdGUgaW1wb3J0IGJlY2F1c2Ugb2YgbXV0dWFsIGRlcGVuZGVuY2UgYmV0d2VlbiB0aGVzZSBtb2R1bGVzCisgICAgICAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IGdlbl91c2FnZQorICAgICAgICBmcm9tIGRpc3R1dGlscy5jbWQgaW1wb3J0IENvbW1hbmQKKworICAgICAgICBpZiBnbG9iYWxfb3B0aW9uczoKKyAgICAgICAgICAgIGlmIGRpc3BsYXlfb3B0aW9uczoKKyAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5fZ2V0X3RvcGxldmVsX29wdGlvbnMoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5nbG9iYWxfb3B0aW9ucworICAgICAgICAgICAgcGFyc2VyLnNldF9vcHRpb25fdGFibGUob3B0aW9ucykKKyAgICAgICAgICAgIHBhcnNlci5wcmludF9oZWxwKHNlbGYuY29tbW9uX3VzYWdlICsgIlxuR2xvYmFsIG9wdGlvbnM6IikKKyAgICAgICAgICAgIHByaW50KCcnKQorCisgICAgICAgIGlmIGRpc3BsYXlfb3B0aW9uczoKKyAgICAgICAgICAgIHBhcnNlci5zZXRfb3B0aW9uX3RhYmxlKHNlbGYuZGlzcGxheV9vcHRpb25zKQorICAgICAgICAgICAgcGFyc2VyLnByaW50X2hlbHAoCisgICAgICAgICAgICAgICAgIkluZm9ybWF0aW9uIGRpc3BsYXkgb3B0aW9ucyAoanVzdCBkaXNwbGF5ICIgKworICAgICAgICAgICAgICAgICJpbmZvcm1hdGlvbiwgaWdub3JlIGFueSBjb21tYW5kcykiKQorICAgICAgICAgICAgcHJpbnQoJycpCisKKyAgICAgICAgZm9yIGNvbW1hbmQgaW4gc2VsZi5jb21tYW5kczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY29tbWFuZCwgdHlwZSkgYW5kIGlzc3ViY2xhc3MoY29tbWFuZCwgQ29tbWFuZCk6CisgICAgICAgICAgICAgICAga2xhc3MgPSBjb21tYW5kCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGtsYXNzID0gc2VsZi5nZXRfY29tbWFuZF9jbGFzcyhjb21tYW5kKQorICAgICAgICAgICAgaWYgKGhhc2F0dHIoa2xhc3MsICdoZWxwX29wdGlvbnMnKSBhbmQKKyAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGtsYXNzLmhlbHBfb3B0aW9ucywgbGlzdCkpOgorICAgICAgICAgICAgICAgIHBhcnNlci5zZXRfb3B0aW9uX3RhYmxlKGtsYXNzLnVzZXJfb3B0aW9ucyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4X2hlbHBfb3B0aW9ucyhrbGFzcy5oZWxwX29wdGlvbnMpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJzZXIuc2V0X29wdGlvbl90YWJsZShrbGFzcy51c2VyX29wdGlvbnMpCisgICAgICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgiT3B0aW9ucyBmb3IgJyVzJyBjb21tYW5kOiIgJSBrbGFzcy5fX25hbWVfXykKKyAgICAgICAgICAgIHByaW50KCcnKQorCisgICAgICAgIHByaW50KGdlbl91c2FnZShzZWxmLnNjcmlwdF9uYW1lKSkKKworICAgIGRlZiBoYW5kbGVfZGlzcGxheV9vcHRpb25zKHNlbGYsIG9wdGlvbl9vcmRlcik6CisgICAgICAgICIiIklmIHRoZXJlIHdlcmUgYW55IG5vbi1nbG9iYWwgImRpc3BsYXktb25seSIgb3B0aW9ucworICAgICAgICAoLS1oZWxwLWNvbW1hbmRzIG9yIHRoZSBtZXRhZGF0YSBkaXNwbGF5IG9wdGlvbnMpIG9uIHRoZSBjb21tYW5kCisgICAgICAgIGxpbmUsIGRpc3BsYXkgdGhlIHJlcXVlc3RlZCBpbmZvIGFuZCByZXR1cm4gdHJ1ZTsgZWxzZSByZXR1cm4KKyAgICAgICAgZmFsc2UuCisgICAgICAgICIiIgorICAgICAgICBmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBnZW5fdXNhZ2UKKworICAgICAgICAjIFVzZXIganVzdCB3YW50cyBhIGxpc3Qgb2YgY29tbWFuZHMgLS0gd2UnbGwgcHJpbnQgaXQgb3V0IGFuZCBzdG9wCisgICAgICAgICMgcHJvY2Vzc2luZyBub3cgKGllLiBpZiB0aGV5IHJhbiAic2V0dXAgLS1oZWxwLWNvbW1hbmRzIGZvbyBiYXIiLAorICAgICAgICAjIHdlIGlnbm9yZSAiZm9vIGJhciIpLgorICAgICAgICBpZiBzZWxmLmhlbHBfY29tbWFuZHM6CisgICAgICAgICAgICBzZWxmLnByaW50X2NvbW1hbmRzKCkKKyAgICAgICAgICAgIHByaW50KCcnKQorICAgICAgICAgICAgcHJpbnQoZ2VuX3VzYWdlKHNlbGYuc2NyaXB0X25hbWUpKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICAjIElmIHVzZXIgc3VwcGxpZWQgYW55IG9mIHRoZSAiZGlzcGxheSBtZXRhZGF0YSIgb3B0aW9ucywgdGhlbgorICAgICAgICAjIGRpc3BsYXkgdGhhdCBtZXRhZGF0YSBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHVzZXIgc3VwcGxpZWQgdGhlCisgICAgICAgICMgbWV0YWRhdGEgb3B0aW9ucy4KKyAgICAgICAgYW55X2Rpc3BsYXlfb3B0aW9ucyA9IDAKKyAgICAgICAgaXNfZGlzcGxheV9vcHRpb24gPSB7fQorICAgICAgICBmb3Igb3B0aW9uIGluIHNlbGYuZGlzcGxheV9vcHRpb25zOgorICAgICAgICAgICAgaXNfZGlzcGxheV9vcHRpb25bb3B0aW9uWzBdXSA9IDEKKworICAgICAgICBmb3IgKG9wdCwgdmFsKSBpbiBvcHRpb25fb3JkZXI6CisgICAgICAgICAgICBpZiB2YWwgYW5kIGlzX2Rpc3BsYXlfb3B0aW9uLmdldChvcHQpOgorICAgICAgICAgICAgICAgIG9wdCA9IHRyYW5zbGF0ZV9sb25nb3B0KG9wdCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZi5tZXRhZGF0YSwgImdldF8iK29wdCkoKQorICAgICAgICAgICAgICAgIGlmIG9wdCBpbiBbJ2tleXdvcmRzJywgJ3BsYXRmb3JtcyddOgorICAgICAgICAgICAgICAgICAgICBwcmludCgnLCcuam9pbih2YWx1ZSkpCisgICAgICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCdjbGFzc2lmaWVycycsICdwcm92aWRlcycsICdyZXF1aXJlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvYnNvbGV0ZXMnKToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ1xuJy5qb2luKHZhbHVlKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBhbnlfZGlzcGxheV9vcHRpb25zID0gMQorCisgICAgICAgIHJldHVybiBhbnlfZGlzcGxheV9vcHRpb25zCisKKyAgICBkZWYgcHJpbnRfY29tbWFuZF9saXN0KHNlbGYsIGNvbW1hbmRzLCBoZWFkZXIsIG1heF9sZW5ndGgpOgorICAgICAgICAiIiJQcmludCBhIHN1YnNldCBvZiB0aGUgbGlzdCBvZiBhbGwgY29tbWFuZHMgLS0gdXNlZCBieQorICAgICAgICAncHJpbnRfY29tbWFuZHMoKScuCisgICAgICAgICIiIgorICAgICAgICBwcmludChoZWFkZXIgKyAiOiIpCisKKyAgICAgICAgZm9yIGNtZCBpbiBjb21tYW5kczoKKyAgICAgICAgICAgIGtsYXNzID0gc2VsZi5jbWRjbGFzcy5nZXQoY21kKQorICAgICAgICAgICAgaWYgbm90IGtsYXNzOgorICAgICAgICAgICAgICAgIGtsYXNzID0gc2VsZi5nZXRfY29tbWFuZF9jbGFzcyhjbWQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBrbGFzcy5kZXNjcmlwdGlvbgorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIihubyBkZXNjcmlwdGlvbiBhdmFpbGFibGUpIgorCisgICAgICAgICAgICBwcmludCgiICAlLSpzICAlcyIgJSAobWF4X2xlbmd0aCwgY21kLCBkZXNjcmlwdGlvbikpCisKKyAgICBkZWYgcHJpbnRfY29tbWFuZHMoc2VsZik6CisgICAgICAgICIiIlByaW50IG91dCBhIGhlbHAgbWVzc2FnZSBsaXN0aW5nIGFsbCBhdmFpbGFibGUgY29tbWFuZHMgd2l0aCBhCisgICAgICAgIGRlc2NyaXB0aW9uIG9mIGVhY2guICBUaGUgbGlzdCBpcyBkaXZpZGVkIGludG8gInN0YW5kYXJkIGNvbW1hbmRzIgorICAgICAgICAobGlzdGVkIGluIGRpc3R1dGlscy5jb21tYW5kLl9fYWxsX18pIGFuZCAiZXh0cmEgY29tbWFuZHMiCisgICAgICAgIChtZW50aW9uZWQgaW4gc2VsZi5jbWRjbGFzcywgYnV0IG5vdCBhIHN0YW5kYXJkIGNvbW1hbmQpLiAgVGhlCisgICAgICAgIGRlc2NyaXB0aW9ucyBjb21lIGZyb20gdGhlIGNvbW1hbmQgY2xhc3MgYXR0cmlidXRlCisgICAgICAgICdkZXNjcmlwdGlvbicuCisgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQKKyAgICAgICAgc3RkX2NvbW1hbmRzID0gZGlzdHV0aWxzLmNvbW1hbmQuX19hbGxfXworICAgICAgICBpc19zdGQgPSB7fQorICAgICAgICBmb3IgY21kIGluIHN0ZF9jb21tYW5kczoKKyAgICAgICAgICAgIGlzX3N0ZFtjbWRdID0gMQorCisgICAgICAgIGV4dHJhX2NvbW1hbmRzID0gW10KKyAgICAgICAgZm9yIGNtZCBpbiBzZWxmLmNtZGNsYXNzLmtleXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBpc19zdGQuZ2V0KGNtZCk6CisgICAgICAgICAgICAgICAgZXh0cmFfY29tbWFuZHMuYXBwZW5kKGNtZCkKKworICAgICAgICBtYXhfbGVuZ3RoID0gMAorICAgICAgICBmb3IgY21kIGluIChzdGRfY29tbWFuZHMgKyBleHRyYV9jb21tYW5kcyk6CisgICAgICAgICAgICBpZiBsZW4oY21kKSA+IG1heF9sZW5ndGg6CisgICAgICAgICAgICAgICAgbWF4X2xlbmd0aCA9IGxlbihjbWQpCisKKyAgICAgICAgc2VsZi5wcmludF9jb21tYW5kX2xpc3Qoc3RkX2NvbW1hbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhbmRhcmQgY29tbWFuZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKQorICAgICAgICBpZiBleHRyYV9jb21tYW5kczoKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBzZWxmLnByaW50X2NvbW1hbmRfbGlzdChleHRyYV9jb21tYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHRyYSBjb21tYW5kcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoKQorCisgICAgZGVmIGdldF9jb21tYW5kX2xpc3Qoc2VsZik6CisgICAgICAgICIiIkdldCBhIGxpc3Qgb2YgKGNvbW1hbmQsIGRlc2NyaXB0aW9uKSB0dXBsZXMuCisgICAgICAgIFRoZSBsaXN0IGlzIGRpdmlkZWQgaW50byAic3RhbmRhcmQgY29tbWFuZHMiIChsaXN0ZWQgaW4KKyAgICAgICAgZGlzdHV0aWxzLmNvbW1hbmQuX19hbGxfXykgYW5kICJleHRyYSBjb21tYW5kcyIgKG1lbnRpb25lZCBpbgorICAgICAgICBzZWxmLmNtZGNsYXNzLCBidXQgbm90IGEgc3RhbmRhcmQgY29tbWFuZCkuICBUaGUgZGVzY3JpcHRpb25zIGNvbWUKKyAgICAgICAgZnJvbSB0aGUgY29tbWFuZCBjbGFzcyBhdHRyaWJ1dGUgJ2Rlc2NyaXB0aW9uJy4KKyAgICAgICAgIiIiCisgICAgICAgICMgQ3VycmVudGx5IHRoaXMgaXMgb25seSB1c2VkIG9uIE1hYyBPUywgZm9yIHRoZSBNYWMtb25seSBHVUkKKyAgICAgICAgIyBEaXN0dXRpbHMgaW50ZXJmYWNlIChieSBKYWNrIEphbnNlbikKKworICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQKKyAgICAgICAgc3RkX2NvbW1hbmRzID0gZGlzdHV0aWxzLmNvbW1hbmQuX19hbGxfXworICAgICAgICBpc19zdGQgPSB7fQorICAgICAgICBmb3IgY21kIGluIHN0ZF9jb21tYW5kczoKKyAgICAgICAgICAgIGlzX3N0ZFtjbWRdID0gMQorCisgICAgICAgIGV4dHJhX2NvbW1hbmRzID0gW10KKyAgICAgICAgZm9yIGNtZCBpbiBzZWxmLmNtZGNsYXNzLmtleXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBpc19zdGQuZ2V0KGNtZCk6CisgICAgICAgICAgICAgICAgZXh0cmFfY29tbWFuZHMuYXBwZW5kKGNtZCkKKworICAgICAgICBydiA9IFtdCisgICAgICAgIGZvciBjbWQgaW4gKHN0ZF9jb21tYW5kcyArIGV4dHJhX2NvbW1hbmRzKToKKyAgICAgICAgICAgIGtsYXNzID0gc2VsZi5jbWRjbGFzcy5nZXQoY21kKQorICAgICAgICAgICAgaWYgbm90IGtsYXNzOgorICAgICAgICAgICAgICAgIGtsYXNzID0gc2VsZi5nZXRfY29tbWFuZF9jbGFzcyhjbWQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBrbGFzcy5kZXNjcmlwdGlvbgorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gIihubyBkZXNjcmlwdGlvbiBhdmFpbGFibGUpIgorICAgICAgICAgICAgcnYuYXBwZW5kKChjbWQsIGRlc2NyaXB0aW9uKSkKKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICAjIC0tIENvbW1hbmQgY2xhc3Mvb2JqZWN0IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGdldF9jb21tYW5kX3BhY2thZ2VzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHBhY2thZ2VzIGZyb20gd2hpY2ggY29tbWFuZHMgYXJlIGxvYWRlZC4iIiIKKyAgICAgICAgcGtncyA9IHNlbGYuY29tbWFuZF9wYWNrYWdlcworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwa2dzLCBsaXN0KToKKyAgICAgICAgICAgIGlmIHBrZ3MgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwa2dzID0gJycKKyAgICAgICAgICAgIHBrZ3MgPSBbcGtnLnN0cmlwKCkgZm9yIHBrZyBpbiBwa2dzLnNwbGl0KCcsJykgaWYgcGtnICE9ICcnXQorICAgICAgICAgICAgaWYgImRpc3R1dGlscy5jb21tYW5kIiBub3QgaW4gcGtnczoKKyAgICAgICAgICAgICAgICBwa2dzLmluc2VydCgwLCAiZGlzdHV0aWxzLmNvbW1hbmQiKQorICAgICAgICAgICAgc2VsZi5jb21tYW5kX3BhY2thZ2VzID0gcGtncworICAgICAgICByZXR1cm4gcGtncworCisgICAgZGVmIGdldF9jb21tYW5kX2NsYXNzKHNlbGYsIGNvbW1hbmQpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzIGNvbW1hbmQgbmFtZWQgYnkKKyAgICAgICAgJ2NvbW1hbmQnLiAgRmlyc3Qgd2UgY2hlY2sgdGhlICdjbWRjbGFzcycgZGljdGlvbmFyeTsgaWYgdGhlCisgICAgICAgIGNvbW1hbmQgaXMgbWVudGlvbmVkIHRoZXJlLCB3ZSBmZXRjaCB0aGUgY2xhc3Mgb2JqZWN0IGZyb20gdGhlCisgICAgICAgIGRpY3Rpb25hcnkgYW5kIHJldHVybiBpdC4gIE90aGVyd2lzZSB3ZSBsb2FkIHRoZSBjb21tYW5kIG1vZHVsZQorICAgICAgICAoImRpc3R1dGlscy5jb21tYW5kLiIgKyBjb21tYW5kKSBhbmQgZmV0Y2ggdGhlIGNvbW1hbmQgY2xhc3MgZnJvbQorICAgICAgICB0aGUgbW9kdWxlLiAgVGhlIGxvYWRlZCBjbGFzcyBpcyBhbHNvIHN0b3JlZCBpbiAnY21kY2xhc3MnCisgICAgICAgIHRvIHNwZWVkIGZ1dHVyZSBjYWxscyB0byAnZ2V0X2NvbW1hbmRfY2xhc3MoKScuCisKKyAgICAgICAgUmFpc2VzIERpc3R1dGlsc01vZHVsZUVycm9yIGlmIHRoZSBleHBlY3RlZCBtb2R1bGUgY291bGQgbm90IGJlCisgICAgICAgIGZvdW5kLCBvciBpZiB0aGF0IG1vZHVsZSBkb2VzIG5vdCBkZWZpbmUgdGhlIGV4cGVjdGVkIGNsYXNzLgorICAgICAgICAiIiIKKyAgICAgICAga2xhc3MgPSBzZWxmLmNtZGNsYXNzLmdldChjb21tYW5kKQorICAgICAgICBpZiBrbGFzczoKKyAgICAgICAgICAgIHJldHVybiBrbGFzcworCisgICAgICAgIGZvciBwa2duYW1lIGluIHNlbGYuZ2V0X2NvbW1hbmRfcGFja2FnZXMoKToKKyAgICAgICAgICAgIG1vZHVsZV9uYW1lID0gIiVzLiVzIiAlIChwa2duYW1lLCBjb21tYW5kKQorICAgICAgICAgICAga2xhc3NfbmFtZSA9IGNvbW1hbmQKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIF9faW1wb3J0X18gKG1vZHVsZV9uYW1lKQorICAgICAgICAgICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZV9uYW1lXQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBrbGFzcyA9IGdldGF0dHIobW9kdWxlLCBrbGFzc19uYW1lKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc01vZHVsZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgY29tbWFuZCAnJXMnIChubyBjbGFzcyAnJXMnIGluIG1vZHVsZSAnJXMnKSIgXAorICAgICAgICAgICAgICAgICAgICAgICUgKGNvbW1hbmQsIGtsYXNzX25hbWUsIG1vZHVsZV9uYW1lKQorCisgICAgICAgICAgICBzZWxmLmNtZGNsYXNzW2NvbW1hbmRdID0ga2xhc3MKKyAgICAgICAgICAgIHJldHVybiBrbGFzcworCisgICAgICAgIHJhaXNlIERpc3R1dGlsc01vZHVsZUVycm9yKCJpbnZhbGlkIGNvbW1hbmQgJyVzJyIgJSBjb21tYW5kKQorCisKKyAgICBkZWYgZ2V0X2NvbW1hbmRfb2JqKHNlbGYsIGNvbW1hbmQsIGNyZWF0ZT0xKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjb21tYW5kIG9iamVjdCBmb3IgJ2NvbW1hbmQnLiAgTm9ybWFsbHkgdGhpcyBvYmplY3QKKyAgICAgICAgaXMgY2FjaGVkIG9uIGEgcHJldmlvdXMgY2FsbCB0byAnZ2V0X2NvbW1hbmRfb2JqKCknOyBpZiBubyBjb21tYW5kCisgICAgICAgIG9iamVjdCBmb3IgJ2NvbW1hbmQnIGlzIGluIHRoZSBjYWNoZSwgdGhlbiB3ZSBlaXRoZXIgY3JlYXRlIGFuZAorICAgICAgICByZXR1cm4gaXQgKGlmICdjcmVhdGUnIGlzIHRydWUpIG9yIHJldHVybiBOb25lLgorICAgICAgICAiIiIKKyAgICAgICAgY21kX29iaiA9IHNlbGYuY29tbWFuZF9vYmouZ2V0KGNvbW1hbmQpCisgICAgICAgIGlmIG5vdCBjbWRfb2JqIGFuZCBjcmVhdGU6CisgICAgICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCJEaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfb2JqKCk6ICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyZWF0aW5nICclcycgY29tbWFuZCBvYmplY3QiICUgY29tbWFuZCkKKworICAgICAgICAgICAga2xhc3MgPSBzZWxmLmdldF9jb21tYW5kX2NsYXNzKGNvbW1hbmQpCisgICAgICAgICAgICBjbWRfb2JqID0gc2VsZi5jb21tYW5kX29ialtjb21tYW5kXSA9IGtsYXNzKHNlbGYpCisgICAgICAgICAgICBzZWxmLmhhdmVfcnVuW2NvbW1hbmRdID0gMAorCisgICAgICAgICAgICAjIFNldCBhbnkgb3B0aW9ucyB0aGF0IHdlcmUgc3VwcGxpZWQgaW4gY29uZmlnIGZpbGVzCisgICAgICAgICAgICAjIG9yIG9uIHRoZSBjb21tYW5kIGxpbmUuICAoTkIuIHN1cHBvcnQgZm9yIGVycm9yCisgICAgICAgICAgICAjIHJlcG9ydGluZyBpcyBsYW1lIGhlcmU6IGFueSBlcnJvcnMgYXJlbid0IHJlcG9ydGVkCisgICAgICAgICAgICAjIHVudGlsICdmaW5hbGl6ZV9vcHRpb25zKCknIGlzIGNhbGxlZCwgd2hpY2ggbWVhbnMKKyAgICAgICAgICAgICMgd2Ugd29uJ3QgcmVwb3J0IHRoZSBzb3VyY2Ugb2YgdGhlIGVycm9yLikKKyAgICAgICAgICAgIG9wdGlvbnMgPSBzZWxmLmNvbW1hbmRfb3B0aW9ucy5nZXQoY29tbWFuZCkKKyAgICAgICAgICAgIGlmIG9wdGlvbnM6CisgICAgICAgICAgICAgICAgc2VsZi5fc2V0X2NvbW1hbmRfb3B0aW9ucyhjbWRfb2JqLCBvcHRpb25zKQorCisgICAgICAgIHJldHVybiBjbWRfb2JqCisKKyAgICBkZWYgX3NldF9jb21tYW5kX29wdGlvbnMoc2VsZiwgY29tbWFuZF9vYmosIG9wdGlvbl9kaWN0PU5vbmUpOgorICAgICAgICAiIiJTZXQgdGhlIG9wdGlvbnMgZm9yICdjb21tYW5kX29iaicgZnJvbSAnb3B0aW9uX2RpY3QnLiAgQmFzaWNhbGx5CisgICAgICAgIHRoaXMgbWVhbnMgY29weWluZyBlbGVtZW50cyBvZiBhIGRpY3Rpb25hcnkgKCdvcHRpb25fZGljdCcpIHRvCisgICAgICAgIGF0dHJpYnV0ZXMgb2YgYW4gaW5zdGFuY2UgKCdjb21tYW5kJykuCisKKyAgICAgICAgJ2NvbW1hbmRfb2JqJyBtdXN0IGJlIGEgQ29tbWFuZCBpbnN0YW5jZS4gIElmICdvcHRpb25fZGljdCcgaXMgbm90CisgICAgICAgIHN1cHBsaWVkLCB1c2VzIHRoZSBzdGFuZGFyZCBvcHRpb24gZGljdGlvbmFyeSBmb3IgdGhpcyBjb21tYW5kCisgICAgICAgIChmcm9tICdzZWxmLmNvbW1hbmRfb3B0aW9ucycpLgorICAgICAgICAiIiIKKyAgICAgICAgY29tbWFuZF9uYW1lID0gY29tbWFuZF9vYmouZ2V0X2NvbW1hbmRfbmFtZSgpCisgICAgICAgIGlmIG9wdGlvbl9kaWN0IGlzIE5vbmU6CisgICAgICAgICAgICBvcHRpb25fZGljdCA9IHNlbGYuZ2V0X29wdGlvbl9kaWN0KGNvbW1hbmRfbmFtZSkKKworICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIiAgc2V0dGluZyBvcHRpb25zIGZvciAnJXMnIGNvbW1hbmQ6IiAlIGNvbW1hbmRfbmFtZSkKKyAgICAgICAgZm9yIChvcHRpb24sIChzb3VyY2UsIHZhbHVlKSkgaW4gb3B0aW9uX2RpY3QuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIiAgICAlcyA9ICVzIChmcm9tICVzKSIgJSAob3B0aW9uLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYm9vbF9vcHRzID0gbWFwKHRyYW5zbGF0ZV9sb25nb3B0LCBjb21tYW5kX29iai5ib29sZWFuX29wdGlvbnMpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgYm9vbF9vcHRzID0gW10KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuZWdfb3B0ID0gY29tbWFuZF9vYmoubmVnYXRpdmVfb3B0CisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgbmVnX29wdCA9IHt9CisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpc19zdHJpbmcgPSBpc2luc3RhbmNlKHZhbHVlLCBzdHIpCisgICAgICAgICAgICAgICAgaWYgb3B0aW9uIGluIG5lZ19vcHQgYW5kIGlzX3N0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihjb21tYW5kX29iaiwgbmVnX29wdFtvcHRpb25dLCBub3Qgc3RydG9ib29sKHZhbHVlKSkKKyAgICAgICAgICAgICAgICBlbGlmIG9wdGlvbiBpbiBib29sX29wdHMgYW5kIGlzX3N0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihjb21tYW5kX29iaiwgb3B0aW9uLCBzdHJ0b2Jvb2wodmFsdWUpKQorICAgICAgICAgICAgICAgIGVsaWYgaGFzYXR0cihjb21tYW5kX29iaiwgb3B0aW9uKToKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihjb21tYW5kX29iaiwgb3B0aW9uLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoImVycm9yIGluICVzOiBjb21tYW5kICclcycgaGFzIG5vIHN1Y2ggb3B0aW9uICclcyciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzb3VyY2UsIGNvbW1hbmRfbmFtZSwgb3B0aW9uKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIG1zZworCisgICAgZGVmIHJlaW5pdGlhbGl6ZV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcz0wKToKKyAgICAgICAgIiIiUmVpbml0aWFsaXplcyBhIGNvbW1hbmQgdG8gdGhlIHN0YXRlIGl0IHdhcyBpbiB3aGVuIGZpcnN0CisgICAgICAgIHJldHVybmVkIGJ5ICdnZXRfY29tbWFuZF9vYmooKSc6IGllLiwgaW5pdGlhbGl6ZWQgYnV0IG5vdCB5ZXQKKyAgICAgICAgZmluYWxpemVkLiAgVGhpcyBwcm92aWRlcyB0aGUgb3Bwb3J0dW5pdHkgdG8gc25lYWsgb3B0aW9uCisgICAgICAgIHZhbHVlcyBpbiBwcm9ncmFtbWF0aWNhbGx5LCBvdmVycmlkaW5nIG9yIHN1cHBsZW1lbnRpbmcKKyAgICAgICAgdXNlci1zdXBwbGllZCB2YWx1ZXMgZnJvbSB0aGUgY29uZmlnIGZpbGVzIGFuZCBjb21tYW5kIGxpbmUuCisgICAgICAgIFlvdSdsbCBoYXZlIHRvIHJlLWZpbmFsaXplIHRoZSBjb21tYW5kIG9iamVjdCAoYnkgY2FsbGluZworICAgICAgICAnZmluYWxpemVfb3B0aW9ucygpJyBvciAnZW5zdXJlX2ZpbmFsaXplZCgpJykgYmVmb3JlIHVzaW5nIGl0IGZvcgorICAgICAgICByZWFsLgorCisgICAgICAgICdjb21tYW5kJyBzaG91bGQgYmUgYSBjb21tYW5kIG5hbWUgKHN0cmluZykgb3IgY29tbWFuZCBvYmplY3QuICBJZgorICAgICAgICAncmVpbml0X3N1YmNvbW1hbmRzJyBpcyB0cnVlLCBhbHNvIHJlaW5pdGlhbGl6ZXMgdGhlIGNvbW1hbmQncworICAgICAgICBzdWItY29tbWFuZHMsIGFzIGRlY2xhcmVkIGJ5IHRoZSAnc3ViX2NvbW1hbmRzJyBjbGFzcyBhdHRyaWJ1dGUgKGlmCisgICAgICAgIGl0IGhhcyBvbmUpLiAgU2VlIHRoZSAiaW5zdGFsbCIgY29tbWFuZCBmb3IgYW4gZXhhbXBsZS4gIE9ubHkKKyAgICAgICAgcmVpbml0aWFsaXplcyB0aGUgc3ViLWNvbW1hbmRzIHRoYXQgYWN0dWFsbHkgbWF0dGVyLCBpZS4gdGhvc2UKKyAgICAgICAgd2hvc2UgdGVzdCBwcmVkaWNhdGVzIHJldHVybiB0cnVlLgorCisgICAgICAgIFJldHVybnMgdGhlIHJlaW5pdGlhbGl6ZWQgY29tbWFuZCBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICBmcm9tIGRpc3R1dGlscy5jbWQgaW1wb3J0IENvbW1hbmQKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY29tbWFuZCwgQ29tbWFuZCk6CisgICAgICAgICAgICBjb21tYW5kX25hbWUgPSBjb21tYW5kCisgICAgICAgICAgICBjb21tYW5kID0gc2VsZi5nZXRfY29tbWFuZF9vYmooY29tbWFuZF9uYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29tbWFuZF9uYW1lID0gY29tbWFuZC5nZXRfY29tbWFuZF9uYW1lKCkKKworICAgICAgICBpZiBub3QgY29tbWFuZC5maW5hbGl6ZWQ6CisgICAgICAgICAgICByZXR1cm4gY29tbWFuZAorICAgICAgICBjb21tYW5kLmluaXRpYWxpemVfb3B0aW9ucygpCisgICAgICAgIGNvbW1hbmQuZmluYWxpemVkID0gMAorICAgICAgICBzZWxmLmhhdmVfcnVuW2NvbW1hbmRfbmFtZV0gPSAwCisgICAgICAgIHNlbGYuX3NldF9jb21tYW5kX29wdGlvbnMoY29tbWFuZCkKKworICAgICAgICBpZiByZWluaXRfc3ViY29tbWFuZHM6CisgICAgICAgICAgICBmb3Igc3ViIGluIGNvbW1hbmQuZ2V0X3N1Yl9jb21tYW5kcygpOgorICAgICAgICAgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoc3ViLCByZWluaXRfc3ViY29tbWFuZHMpCisKKyAgICAgICAgcmV0dXJuIGNvbW1hbmQKKworICAgICMgLS0gTWV0aG9kcyB0aGF0IG9wZXJhdGUgb24gdGhlIERpc3RyaWJ1dGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgYW5ub3VuY2Uoc2VsZiwgbXNnLCBsZXZlbD1sb2cuSU5GTyk6CisgICAgICAgIGxvZy5sb2cobGV2ZWwsIG1zZykKKworICAgIGRlZiBydW5fY29tbWFuZHMoc2VsZik6CisgICAgICAgICIiIlJ1biBlYWNoIGNvbW1hbmQgdGhhdCB3YXMgc2VlbiBvbiB0aGUgc2V0dXAgc2NyaXB0IGNvbW1hbmQgbGluZS4KKyAgICAgICAgVXNlcyB0aGUgbGlzdCBvZiBjb21tYW5kcyBmb3VuZCBhbmQgY2FjaGUgb2YgY29tbWFuZCBvYmplY3RzCisgICAgICAgIGNyZWF0ZWQgYnkgJ2dldF9jb21tYW5kX29iaigpJy4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBjbWQgaW4gc2VsZi5jb21tYW5kczoKKyAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoY21kKQorCisgICAgIyAtLSBNZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiBpdHMgQ29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBydW5fY29tbWFuZChzZWxmLCBjb21tYW5kKToKKyAgICAgICAgIiIiRG8gd2hhdGV2ZXIgaXQgdGFrZXMgdG8gcnVuIGEgY29tbWFuZCAoaW5jbHVkaW5nIG5vdGhpbmcgYXQgYWxsLAorICAgICAgICBpZiB0aGUgY29tbWFuZCBoYXMgYWxyZWFkeSBiZWVuIHJ1bikuICBTcGVjaWZpY2FsbHk6IGlmIHdlIGhhdmUKKyAgICAgICAgYWxyZWFkeSBjcmVhdGVkIGFuZCBydW4gdGhlIGNvbW1hbmQgbmFtZWQgYnkgJ2NvbW1hbmQnLCByZXR1cm4KKyAgICAgICAgc2lsZW50bHkgd2l0aG91dCBkb2luZyBhbnl0aGluZy4gIElmIHRoZSBjb21tYW5kIG5hbWVkIGJ5ICdjb21tYW5kJworICAgICAgICBkb2Vzbid0IGV2ZW4gaGF2ZSBhIGNvbW1hbmQgb2JqZWN0IHlldCwgY3JlYXRlIG9uZS4gIFRoZW4gaW52b2tlCisgICAgICAgICdydW4oKScgb24gdGhhdCBjb21tYW5kIG9iamVjdCAob3IgYW4gZXhpc3Rpbmcgb25lKS4KKyAgICAgICAgIiIiCisgICAgICAgICMgQWxyZWFkeSBiZWVuIGhlcmUsIGRvbmUgdGhhdD8gdGhlbiByZXR1cm4gc2lsZW50bHkuCisgICAgICAgIGlmIHNlbGYuaGF2ZV9ydW4uZ2V0KGNvbW1hbmQpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgbG9nLmluZm8oInJ1bm5pbmcgJXMiLCBjb21tYW5kKQorICAgICAgICBjbWRfb2JqID0gc2VsZi5nZXRfY29tbWFuZF9vYmooY29tbWFuZCkKKyAgICAgICAgY21kX29iai5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kX29iai5ydW4oKQorICAgICAgICBzZWxmLmhhdmVfcnVuW2NvbW1hbmRdID0gMQorCisKKyAgICAjIC0tIERpc3RyaWJ1dGlvbiBxdWVyeSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGhhc19wdXJlX21vZHVsZXMoc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5wYWNrYWdlcyBvciBzZWxmLnB5X21vZHVsZXMgb3IgW10pID4gMAorCisgICAgZGVmIGhhc19leHRfbW9kdWxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXh0X21vZHVsZXMgYW5kIGxlbihzZWxmLmV4dF9tb2R1bGVzKSA+IDAKKworICAgIGRlZiBoYXNfY19saWJyYXJpZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxpYnJhcmllcyBhbmQgbGVuKHNlbGYubGlicmFyaWVzKSA+IDAKKworICAgIGRlZiBoYXNfbW9kdWxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFzX3B1cmVfbW9kdWxlcygpIG9yIHNlbGYuaGFzX2V4dF9tb2R1bGVzKCkKKworICAgIGRlZiBoYXNfaGVhZGVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycyBhbmQgbGVuKHNlbGYuaGVhZGVycykgPiAwCisKKyAgICBkZWYgaGFzX3NjcmlwdHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnNjcmlwdHMgYW5kIGxlbihzZWxmLnNjcmlwdHMpID4gMAorCisgICAgZGVmIGhhc19kYXRhX2ZpbGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhX2ZpbGVzIGFuZCBsZW4oc2VsZi5kYXRhX2ZpbGVzKSA+IDAKKworICAgIGRlZiBpc19wdXJlKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuaGFzX3B1cmVfbW9kdWxlcygpIGFuZAorICAgICAgICAgICAgICAgIG5vdCBzZWxmLmhhc19leHRfbW9kdWxlcygpIGFuZAorICAgICAgICAgICAgICAgIG5vdCBzZWxmLmhhc19jX2xpYnJhcmllcygpKQorCisgICAgIyAtLSBNZXRhZGF0YSBxdWVyeSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICMgSWYgeW91J3JlIGxvb2tpbmcgZm9yICdnZXRfbmFtZSgpJywgJ2dldF92ZXJzaW9uKCknLCBhbmQgc28gZm9ydGgsCisgICAgIyB0aGV5IGFyZSBkZWZpbmVkIGluIGEgc25lYWt5IHdheTogdGhlIGNvbnN0cnVjdG9yIGJpbmRzIHNlbGYuZ2V0X1hYWAorICAgICMgdG8gc2VsZi5tZXRhZGF0YS5nZXRfWFhYLiAgVGhlIGFjdHVhbCBjb2RlIGlzIGluIHRoZQorICAgICMgRGlzdHJpYnV0aW9uTWV0YWRhdGEgY2xhc3MsIGJlbG93LgorCitjbGFzcyBEaXN0cmlidXRpb25NZXRhZGF0YToKKyAgICAiIiJEdW1teSBjbGFzcyB0byBob2xkIHRoZSBkaXN0cmlidXRpb24gbWV0YS1kYXRhOiBuYW1lLCB2ZXJzaW9uLAorICAgIGF1dGhvciwgYW5kIHNvIGZvcnRoLgorICAgICIiIgorCisgICAgX01FVEhPRF9CQVNFTkFNRVMgPSAoIm5hbWUiLCAidmVyc2lvbiIsICJhdXRob3IiLCAiYXV0aG9yX2VtYWlsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibWFpbnRhaW5lciIsICJtYWludGFpbmVyX2VtYWlsIiwgInVybCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImxpY2Vuc2UiLCAiZGVzY3JpcHRpb24iLCAibG9uZ19kZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImtleXdvcmRzIiwgInBsYXRmb3JtcyIsICJmdWxsbmFtZSIsICJjb250YWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFjdF9lbWFpbCIsICJsaWNlbnNlIiwgImNsYXNzaWZpZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZG93bmxvYWRfdXJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAjIFBFUCAzMTQKKyAgICAgICAgICAgICAgICAgICAgICAgICAicHJvdmlkZXMiLCAicmVxdWlyZXMiLCAib2Jzb2xldGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aD1Ob25lKToKKyAgICAgICAgaWYgcGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucmVhZF9wa2dfZmlsZShvcGVuKHBhdGgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZQorICAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gTm9uZQorICAgICAgICAgICAgc2VsZi5hdXRob3IgPSBOb25lCisgICAgICAgICAgICBzZWxmLmF1dGhvcl9lbWFpbCA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYubWFpbnRhaW5lciA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYubWFpbnRhaW5lcl9lbWFpbCA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYudXJsID0gTm9uZQorICAgICAgICAgICAgc2VsZi5saWNlbnNlID0gTm9uZQorICAgICAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYubG9uZ19kZXNjcmlwdGlvbiA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYua2V5d29yZHMgPSBOb25lCisgICAgICAgICAgICBzZWxmLnBsYXRmb3JtcyA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuY2xhc3NpZmllcnMgPSBOb25lCisgICAgICAgICAgICBzZWxmLmRvd25sb2FkX3VybCA9IE5vbmUKKyAgICAgICAgICAgICMgUEVQIDMxNAorICAgICAgICAgICAgc2VsZi5wcm92aWRlcyA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYucmVxdWlyZXMgPSBOb25lCisgICAgICAgICAgICBzZWxmLm9ic29sZXRlcyA9IE5vbmUKKworICAgIGRlZiByZWFkX3BrZ19maWxlKHNlbGYsIGZpbGUpOgorICAgICAgICAiIiJSZWFkcyB0aGUgbWV0YWRhdGEgdmFsdWVzIGZyb20gYSBmaWxlIG9iamVjdC4iIiIKKyAgICAgICAgbXNnID0gbWVzc2FnZV9mcm9tX2ZpbGUoZmlsZSkKKworICAgICAgICBkZWYgX3JlYWRfZmllbGQobmFtZSk6CisgICAgICAgICAgICB2YWx1ZSA9IG1zZ1tuYW1lXQorICAgICAgICAgICAgaWYgdmFsdWUgPT0gJ1VOS05PV04nOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKworICAgICAgICBkZWYgX3JlYWRfbGlzdChuYW1lKToKKyAgICAgICAgICAgIHZhbHVlcyA9IG1zZy5nZXRfYWxsKG5hbWUsIE5vbmUpCisgICAgICAgICAgICBpZiB2YWx1ZXMgPT0gW106CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZXMKKworICAgICAgICBtZXRhZGF0YV92ZXJzaW9uID0gbXNnWydtZXRhZGF0YS12ZXJzaW9uJ10KKyAgICAgICAgc2VsZi5uYW1lID0gX3JlYWRfZmllbGQoJ25hbWUnKQorICAgICAgICBzZWxmLnZlcnNpb24gPSBfcmVhZF9maWVsZCgndmVyc2lvbicpCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBfcmVhZF9maWVsZCgnc3VtbWFyeScpCisgICAgICAgICMgd2UgYXJlIGZpbGxpbmcgYXV0aG9yIG9ubHkuCisgICAgICAgIHNlbGYuYXV0aG9yID0gX3JlYWRfZmllbGQoJ2F1dGhvcicpCisgICAgICAgIHNlbGYubWFpbnRhaW5lciA9IE5vbmUKKyAgICAgICAgc2VsZi5hdXRob3JfZW1haWwgPSBfcmVhZF9maWVsZCgnYXV0aG9yLWVtYWlsJykKKyAgICAgICAgc2VsZi5tYWludGFpbmVyX2VtYWlsID0gTm9uZQorICAgICAgICBzZWxmLnVybCA9IF9yZWFkX2ZpZWxkKCdob21lLXBhZ2UnKQorICAgICAgICBzZWxmLmxpY2Vuc2UgPSBfcmVhZF9maWVsZCgnbGljZW5zZScpCisKKyAgICAgICAgaWYgJ2Rvd25sb2FkLXVybCcgaW4gbXNnOgorICAgICAgICAgICAgc2VsZi5kb3dubG9hZF91cmwgPSBfcmVhZF9maWVsZCgnZG93bmxvYWQtdXJsJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZG93bmxvYWRfdXJsID0gTm9uZQorCisgICAgICAgIHNlbGYubG9uZ19kZXNjcmlwdGlvbiA9IF9yZWFkX2ZpZWxkKCdkZXNjcmlwdGlvbicpCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBfcmVhZF9maWVsZCgnc3VtbWFyeScpCisKKyAgICAgICAgaWYgJ2tleXdvcmRzJyBpbiBtc2c6CisgICAgICAgICAgICBzZWxmLmtleXdvcmRzID0gX3JlYWRfZmllbGQoJ2tleXdvcmRzJykuc3BsaXQoJywnKQorCisgICAgICAgIHNlbGYucGxhdGZvcm1zID0gX3JlYWRfbGlzdCgncGxhdGZvcm0nKQorICAgICAgICBzZWxmLmNsYXNzaWZpZXJzID0gX3JlYWRfbGlzdCgnY2xhc3NpZmllcicpCisKKyAgICAgICAgIyBQRVAgMzE0IC0gdGhlc2UgZmllbGRzIG9ubHkgZXhpc3QgaW4gMS4xCisgICAgICAgIGlmIG1ldGFkYXRhX3ZlcnNpb24gPT0gJzEuMSc6CisgICAgICAgICAgICBzZWxmLnJlcXVpcmVzID0gX3JlYWRfbGlzdCgncmVxdWlyZXMnKQorICAgICAgICAgICAgc2VsZi5wcm92aWRlcyA9IF9yZWFkX2xpc3QoJ3Byb3ZpZGVzJykKKyAgICAgICAgICAgIHNlbGYub2Jzb2xldGVzID0gX3JlYWRfbGlzdCgnb2Jzb2xldGVzJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucmVxdWlyZXMgPSBOb25lCisgICAgICAgICAgICBzZWxmLnByb3ZpZGVzID0gTm9uZQorICAgICAgICAgICAgc2VsZi5vYnNvbGV0ZXMgPSBOb25lCisKKyAgICBkZWYgd3JpdGVfcGtnX2luZm8oc2VsZiwgYmFzZV9kaXIpOgorICAgICAgICAiIiJXcml0ZSB0aGUgUEtHLUlORk8gZmlsZSBpbnRvIHRoZSByZWxlYXNlIHRyZWUuCisgICAgICAgICIiIgorICAgICAgICBwa2dfaW5mbyA9IG9wZW4ob3MucGF0aC5qb2luKGJhc2VfZGlyLCAnUEtHLUlORk8nKSwgJ3cnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLndyaXRlX3BrZ19maWxlKHBrZ19pbmZvKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcGtnX2luZm8uY2xvc2UoKQorCisgICAgZGVmIHdyaXRlX3BrZ19maWxlKHNlbGYsIGZpbGUpOgorICAgICAgICAiIiJXcml0ZSB0aGUgUEtHLUlORk8gZm9ybWF0IGRhdGEgdG8gYSBmaWxlIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIHZlcnNpb24gPSAnMS4wJworICAgICAgICBpZiAoc2VsZi5wcm92aWRlcyBvciBzZWxmLnJlcXVpcmVzIG9yIHNlbGYub2Jzb2xldGVzIG9yCisgICAgICAgICAgICBzZWxmLmNsYXNzaWZpZXJzIG9yIHNlbGYuZG93bmxvYWRfdXJsKToKKyAgICAgICAgICAgIHZlcnNpb24gPSAnMS4xJworCisgICAgICAgIHNlbGYuX3dyaXRlX2ZpZWxkKGZpbGUsICdNZXRhZGF0YS1WZXJzaW9uJywgdmVyc2lvbikKKyAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZSwgJ05hbWUnLCBzZWxmLmdldF9uYW1lKCkpCisgICAgICAgIHNlbGYuX3dyaXRlX2ZpZWxkKGZpbGUsICdWZXJzaW9uJywgc2VsZi5nZXRfdmVyc2lvbigpKQorICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlLCAnU3VtbWFyeScsIHNlbGYuZ2V0X2Rlc2NyaXB0aW9uKCkpCisgICAgICAgIHNlbGYuX3dyaXRlX2ZpZWxkKGZpbGUsICdIb21lLXBhZ2UnLCBzZWxmLmdldF91cmwoKSkKKyAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZSwgJ0F1dGhvcicsIHNlbGYuZ2V0X2NvbnRhY3QoKSkKKyAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZSwgJ0F1dGhvci1lbWFpbCcsIHNlbGYuZ2V0X2NvbnRhY3RfZW1haWwoKSkKKyAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZSwgJ0xpY2Vuc2UnLCBzZWxmLmdldF9saWNlbnNlKCkpCisgICAgICAgIGlmIHNlbGYuZG93bmxvYWRfdXJsOgorICAgICAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZSwgJ0Rvd25sb2FkLVVSTCcsIHNlbGYuZG93bmxvYWRfdXJsKQorCisgICAgICAgIGxvbmdfZGVzYyA9IHJmYzgyMl9lc2NhcGUoc2VsZi5nZXRfbG9uZ19kZXNjcmlwdGlvbigpKQorICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlLCAnRGVzY3JpcHRpb24nLCBsb25nX2Rlc2MpCisKKyAgICAgICAga2V5d29yZHMgPSAnLCcuam9pbihzZWxmLmdldF9rZXl3b3JkcygpKQorICAgICAgICBpZiBrZXl3b3JkczoKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlX2ZpZWxkKGZpbGUsICdLZXl3b3JkcycsIGtleXdvcmRzKQorCisgICAgICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ1BsYXRmb3JtJywgc2VsZi5nZXRfcGxhdGZvcm1zKCkpCisgICAgICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ0NsYXNzaWZpZXInLCBzZWxmLmdldF9jbGFzc2lmaWVycygpKQorCisgICAgICAgICMgUEVQIDMxNAorICAgICAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdSZXF1aXJlcycsIHNlbGYuZ2V0X3JlcXVpcmVzKCkpCisgICAgICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ1Byb3ZpZGVzJywgc2VsZi5nZXRfcHJvdmlkZXMoKSkKKyAgICAgICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnT2Jzb2xldGVzJywgc2VsZi5nZXRfb2Jzb2xldGVzKCkpCisKKyAgICBkZWYgX3dyaXRlX2ZpZWxkKHNlbGYsIGZpbGUsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgZmlsZS53cml0ZSgnJXM6ICVzXG4nICUgKG5hbWUsIHNlbGYuX2VuY29kZV9maWVsZCh2YWx1ZSkpKQorCisgICAgZGVmIF93cml0ZV9saXN0IChzZWxmLCBmaWxlLCBuYW1lLCB2YWx1ZXMpOgorICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZSwgbmFtZSwgdmFsdWUpCisKKyAgICBkZWYgX2VuY29kZV9maWVsZChzZWxmLCB2YWx1ZSk6CisgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB1bmljb2RlKToKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZS5lbmNvZGUoUEtHX0lORk9fRU5DT0RJTkcpCisgICAgICAgIHJldHVybiBzdHIodmFsdWUpCisKKyAgICAjIC0tIE1ldGFkYXRhIHF1ZXJ5IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGdldF9uYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lIG9yICJVTktOT1dOIgorCisgICAgZGVmIGdldF92ZXJzaW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uIG9yICIwLjAuMCIKKworICAgIGRlZiBnZXRfZnVsbG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAiJXMtJXMiICUgKHNlbGYuZ2V0X25hbWUoKSwgc2VsZi5nZXRfdmVyc2lvbigpKQorCisgICAgZGVmIGdldF9hdXRob3Ioc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9lbmNvZGVfZmllbGQoc2VsZi5hdXRob3IpIG9yICJVTktOT1dOIgorCisgICAgZGVmIGdldF9hdXRob3JfZW1haWwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmF1dGhvcl9lbWFpbCBvciAiVU5LTk9XTiIKKworICAgIGRlZiBnZXRfbWFpbnRhaW5lcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2VuY29kZV9maWVsZChzZWxmLm1haW50YWluZXIpIG9yICJVTktOT1dOIgorCisgICAgZGVmIGdldF9tYWludGFpbmVyX2VtYWlsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5tYWludGFpbmVyX2VtYWlsIG9yICJVTktOT1dOIgorCisgICAgZGVmIGdldF9jb250YWN0KHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuX2VuY29kZV9maWVsZChzZWxmLm1haW50YWluZXIpIG9yCisgICAgICAgICAgICAgICAgc2VsZi5fZW5jb2RlX2ZpZWxkKHNlbGYuYXV0aG9yKSBvciAiVU5LTk9XTiIpCisKKyAgICBkZWYgZ2V0X2NvbnRhY3RfZW1haWwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1haW50YWluZXJfZW1haWwgb3Igc2VsZi5hdXRob3JfZW1haWwgb3IgIlVOS05PV04iCisKKyAgICBkZWYgZ2V0X3VybChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudXJsIG9yICJVTktOT1dOIgorCisgICAgZGVmIGdldF9saWNlbnNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5saWNlbnNlIG9yICJVTktOT1dOIgorICAgIGdldF9saWNlbmNlID0gZ2V0X2xpY2Vuc2UKKworICAgIGRlZiBnZXRfZGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9lbmNvZGVfZmllbGQoc2VsZi5kZXNjcmlwdGlvbikgb3IgIlVOS05PV04iCisKKyAgICBkZWYgZ2V0X2xvbmdfZGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9lbmNvZGVfZmllbGQoc2VsZi5sb25nX2Rlc2NyaXB0aW9uKSBvciAiVU5LTk9XTiIKKworICAgIGRlZiBnZXRfa2V5d29yZHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmtleXdvcmRzIG9yIFtdCisKKyAgICBkZWYgZ2V0X3BsYXRmb3JtcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucGxhdGZvcm1zIG9yIFsiVU5LTk9XTiJdCisKKyAgICBkZWYgZ2V0X2NsYXNzaWZpZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jbGFzc2lmaWVycyBvciBbXQorCisgICAgZGVmIGdldF9kb3dubG9hZF91cmwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRvd25sb2FkX3VybCBvciAiVU5LTk9XTiIKKworICAgICMgUEVQIDMxNAorICAgIGRlZiBnZXRfcmVxdWlyZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlcXVpcmVzIG9yIFtdCisKKyAgICBkZWYgc2V0X3JlcXVpcmVzKHNlbGYsIHZhbHVlKToKKyAgICAgICAgaW1wb3J0IGRpc3R1dGlscy52ZXJzaW9ucHJlZGljYXRlCisgICAgICAgIGZvciB2IGluIHZhbHVlOgorICAgICAgICAgICAgZGlzdHV0aWxzLnZlcnNpb25wcmVkaWNhdGUuVmVyc2lvblByZWRpY2F0ZSh2KQorICAgICAgICBzZWxmLnJlcXVpcmVzID0gdmFsdWUKKworICAgIGRlZiBnZXRfcHJvdmlkZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnByb3ZpZGVzIG9yIFtdCisKKyAgICBkZWYgc2V0X3Byb3ZpZGVzKHNlbGYsIHZhbHVlKToKKyAgICAgICAgdmFsdWUgPSBbdi5zdHJpcCgpIGZvciB2IGluIHZhbHVlXQorICAgICAgICBmb3IgdiBpbiB2YWx1ZToKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMudmVyc2lvbnByZWRpY2F0ZQorICAgICAgICAgICAgZGlzdHV0aWxzLnZlcnNpb25wcmVkaWNhdGUuc3BsaXRfcHJvdmlzaW9uKHYpCisgICAgICAgIHNlbGYucHJvdmlkZXMgPSB2YWx1ZQorCisgICAgZGVmIGdldF9vYnNvbGV0ZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm9ic29sZXRlcyBvciBbXQorCisgICAgZGVmIHNldF9vYnNvbGV0ZXMoc2VsZiwgdmFsdWUpOgorICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLnZlcnNpb25wcmVkaWNhdGUKKyAgICAgICAgZm9yIHYgaW4gdmFsdWU6CisgICAgICAgICAgICBkaXN0dXRpbHMudmVyc2lvbnByZWRpY2F0ZS5WZXJzaW9uUHJlZGljYXRlKHYpCisgICAgICAgIHNlbGYub2Jzb2xldGVzID0gdmFsdWUKKworZGVmIGZpeF9oZWxwX29wdGlvbnMob3B0aW9ucyk6CisgICAgIiIiQ29udmVydCBhIDQtdHVwbGUgJ2hlbHBfb3B0aW9ucycgbGlzdCBhcyBmb3VuZCBpbiB2YXJpb3VzIGNvbW1hbmQKKyAgICBjbGFzc2VzIHRvIHRoZSAzLXR1cGxlIGZvcm0gcmVxdWlyZWQgYnkgRmFuY3lHZXRvcHQuCisgICAgIiIiCisgICAgbmV3X29wdGlvbnMgPSBbXQorICAgIGZvciBoZWxwX3R1cGxlIGluIG9wdGlvbnM6CisgICAgICAgIG5ld19vcHRpb25zLmFwcGVuZChoZWxwX3R1cGxlWzA6M10pCisgICAgcmV0dXJuIG5ld19vcHRpb25zCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kaXN0LnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmN2YyODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kaXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kaXN0LnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmN2YyODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kaXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9lbXhjY29tcGlsZXIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9lbXhjY29tcGlsZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxNzIwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2VteGNjb21waWxlci5weQpAQCAtMCwwICsxLDMxOSBAQAorIiIiZGlzdHV0aWxzLmVteGNjb21waWxlcgorCitQcm92aWRlcyB0aGUgRU1YQ0NvbXBpbGVyIGNsYXNzLCBhIHN1YmNsYXNzIG9mIFVuaXhDQ29tcGlsZXIgdGhhdAoraGFuZGxlcyB0aGUgRU1YIHBvcnQgb2YgdGhlIEdOVSBDIGNvbXBpbGVyIHRvIE9TLzIuCisiIiIKKworIyBpc3N1ZXM6CisjCisjICogT1MvMiBpbnNpc3RzIHRoYXQgRExMcyBjYW4gaGF2ZSBuYW1lcyBubyBsb25nZXIgdGhhbiA4IGNoYXJhY3RlcnMKKyMgICBXZSBwdXQgZXhwb3J0X3N5bWJvbHMgaW4gYSBkZWYtZmlsZSwgYXMgdGhvdWdoIHRoZSBETEwgY2FuIGhhdmUKKyMgICBhbiBhcmJpdHJhcnkgbGVuZ3RoIG5hbWUsIGJ1dCB0cnVuY2F0ZSB0aGUgb3V0cHV0IGZpbGVuYW1lLgorIworIyAqIG9ubHkgdXNlIE9NRiBvYmplY3RzIGFuZCB1c2UgTElOSzM4NiBhcyB0aGUgbGlua2VyICgtWm9tZikKKyMKKyMgKiBhbHdheXMgYnVpbGQgZm9yIG11bHRpdGhyZWFkaW5nICgtWm10KSBhcyB0aGUgYWNjb21wYW55aW5nIE9TLzIgcG9ydAorIyAgIG9mIFB5dGhvbiBpcyBvbmx5IGRpc3RyaWJ1dGVkIHdpdGggdGhyZWFkcyBlbmFibGVkLgorIworIyB0ZXN0ZWQgY29uZmlndXJhdGlvbnM6CisjCisjICogRU1YIGdjYyAyLjgxL0VNWCAwLjlkIGZpeDAzCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3Msc3lzLGNvcHkKK2Zyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgZ2VuX3ByZXByb2Nlc3Nfb3B0aW9ucywgZ2VuX2xpYl9vcHRpb25zCitmcm9tIGRpc3R1dGlscy51bml4Y2NvbXBpbGVyIGltcG9ydCBVbml4Q0NvbXBpbGVyCitmcm9tIGRpc3R1dGlscy5maWxlX3V0aWwgaW1wb3J0IHdyaXRlX2ZpbGUKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXhlY0Vycm9yLCBDb21waWxlRXJyb3IsIFVua25vd25GaWxlRXJyb3IKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworY2xhc3MgRU1YQ0NvbXBpbGVyIChVbml4Q0NvbXBpbGVyKToKKworICAgIGNvbXBpbGVyX3R5cGUgPSAnZW14JworICAgIG9ial9leHRlbnNpb24gPSAiLm9iaiIKKyAgICBzdGF0aWNfbGliX2V4dGVuc2lvbiA9ICIubGliIgorICAgIHNoYXJlZF9saWJfZXh0ZW5zaW9uID0gIi5kbGwiCisgICAgc3RhdGljX2xpYl9mb3JtYXQgPSAiJXMlcyIKKyAgICBzaGFyZWRfbGliX2Zvcm1hdCA9ICIlcyVzIgorICAgIHJlc19leHRlbnNpb24gPSAiLnJlcyIgICAgICAjIGNvbXBpbGVkIHJlc291cmNlIGZpbGUKKyAgICBleGVfZXh0ZW5zaW9uID0gIi5leGUiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsCisgICAgICAgICAgICAgICAgICB2ZXJib3NlPTAsCisgICAgICAgICAgICAgICAgICBkcnlfcnVuPTAsCisgICAgICAgICAgICAgICAgICBmb3JjZT0wKToKKworICAgICAgICBVbml4Q0NvbXBpbGVyLl9faW5pdF9fIChzZWxmLCB2ZXJib3NlLCBkcnlfcnVuLCBmb3JjZSkKKworICAgICAgICAoc3RhdHVzLCBkZXRhaWxzKSA9IGNoZWNrX2NvbmZpZ19oKCkKKyAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiUHl0aG9uJ3MgR0NDIHN0YXR1czogJXMgKGRldGFpbHM6ICVzKSIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXMsIGRldGFpbHMpKQorICAgICAgICBpZiBzdGF0dXMgaXMgbm90IENPTkZJR19IX09LOgorICAgICAgICAgICAgc2VsZi53YXJuKAorICAgICAgICAgICAgICAgICJQeXRob24ncyBweWNvbmZpZy5oIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHlvdXIgY29tcGlsZXIuICAiICsKKyAgICAgICAgICAgICAgICAoIlJlYXNvbjogJXMuIiAlIGRldGFpbHMpICsKKyAgICAgICAgICAgICAgICAiQ29tcGlsaW5nIG1heSBmYWlsIGJlY2F1c2Ugb2YgdW5kZWZpbmVkIHByZXByb2Nlc3NvciBtYWNyb3MuIikKKworICAgICAgICAoc2VsZi5nY2NfdmVyc2lvbiwgc2VsZi5sZF92ZXJzaW9uKSA9IFwKKyAgICAgICAgICAgIGdldF92ZXJzaW9ucygpCisgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoc2VsZi5jb21waWxlcl90eXBlICsgIjogZ2NjICVzLCBsZCAlc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuZ2NjX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGRfdmVyc2lvbikgKQorCisgICAgICAgICMgSGFyZC1jb2RlIEdDQyBiZWNhdXNlIHRoYXQncyB3aGF0IHRoaXMgaXMgYWxsIGFib3V0LgorICAgICAgICAjIFhYWCBvcHRpbWl6YXRpb24sIHdhcm5pbmdzIGV0Yy4gc2hvdWxkIGJlIGN1c3RvbWl6YWJsZS4KKyAgICAgICAgc2VsZi5zZXRfZXhlY3V0YWJsZXMoY29tcGlsZXI9J2djYyAtWm9tZiAtWm10IC1PMyAtZm9taXQtZnJhbWUtcG9pbnRlciAtbXByb2JlIC1XYWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXJfc289J2djYyAtWm9tZiAtWm10IC1PMyAtZm9taXQtZnJhbWUtcG9pbnRlciAtbXByb2JlIC1XYWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VyX2V4ZT0nZ2NjIC1ab21mIC1abXQgLVpjcnRkbGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rZXJfc289J2djYyAtWm9tZiAtWm10IC1aY3J0ZGxsIC1aZGxsJykKKworICAgICAgICAjIHdhbnQgdGhlIGdjYyBsaWJyYXJ5IHN0YXRpY2FsbHkgbGlua2VkIChzbyB0aGF0IHdlIGRvbid0IGhhdmUKKyAgICAgICAgIyB0byBkaXN0cmlidXRlIGEgdmVyc2lvbiBkZXBlbmRlbnQgb24gdGhlIGNvbXBpbGVyIHdlIGhhdmUpCisgICAgICAgIHNlbGYuZGxsX2xpYnJhcmllcz1bImdjYyJdCisKKyAgICAjIF9faW5pdF9fICgpCisKKyAgICBkZWYgX2NvbXBpbGUoc2VsZiwgb2JqLCBzcmMsIGV4dCwgY2NfYXJncywgZXh0cmFfcG9zdGFyZ3MsIHBwX29wdHMpOgorICAgICAgICBpZiBleHQgPT0gJy5yYyc6CisgICAgICAgICAgICAjIGdjYyByZXF1aXJlcyAnLnJjJyBjb21waWxlZCB0byBiaW5hcnkgKCcucmVzJykgZmlsZXMgISEhCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zcGF3bihbInJjIiwgIi1yIiwgc3JjXSkKKyAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IsIG1zZworICAgICAgICBlbHNlOiAjIGZvciBvdGhlciBmaWxlcyB1c2UgdGhlIEMtY29tcGlsZXIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNwYXduKHNlbGYuY29tcGlsZXJfc28gKyBjY19hcmdzICsgW3NyYywgJy1vJywgb2JqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IsIG1zZworCisgICAgZGVmIGxpbmsgKHNlbGYsCisgICAgICAgICAgICAgIHRhcmdldF9kZXNjLAorICAgICAgICAgICAgICBvYmplY3RzLAorICAgICAgICAgICAgICBvdXRwdXRfZmlsZW5hbWUsCisgICAgICAgICAgICAgIG91dHB1dF9kaXI9Tm9uZSwKKyAgICAgICAgICAgICAgbGlicmFyaWVzPU5vbmUsCisgICAgICAgICAgICAgIGxpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICAgICAgICBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICAgICAgICBleHBvcnRfc3ltYm9scz1Ob25lLAorICAgICAgICAgICAgICBkZWJ1Zz0wLAorICAgICAgICAgICAgICBleHRyYV9wcmVhcmdzPU5vbmUsCisgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsCisgICAgICAgICAgICAgIGJ1aWxkX3RlbXA9Tm9uZSwKKyAgICAgICAgICAgICAgdGFyZ2V0X2xhbmc9Tm9uZSk6CisKKyAgICAgICAgIyB1c2Ugc2VwYXJhdGUgY29waWVzLCBzbyB3ZSBjYW4gbW9kaWZ5IHRoZSBsaXN0cworICAgICAgICBleHRyYV9wcmVhcmdzID0gY29weS5jb3B5KGV4dHJhX3ByZWFyZ3Mgb3IgW10pCisgICAgICAgIGxpYnJhcmllcyA9IGNvcHkuY29weShsaWJyYXJpZXMgb3IgW10pCisgICAgICAgIG9iamVjdHMgPSBjb3B5LmNvcHkob2JqZWN0cyBvciBbXSkKKworICAgICAgICAjIEFkZGl0aW9uYWwgbGlicmFyaWVzCisgICAgICAgIGxpYnJhcmllcy5leHRlbmQoc2VsZi5kbGxfbGlicmFyaWVzKQorCisgICAgICAgICMgaGFuZGxlIGV4cG9ydCBzeW1ib2xzIGJ5IGNyZWF0aW5nIGEgZGVmLWZpbGUKKyAgICAgICAgIyB3aXRoIGV4ZWN1dGFibGVzIHRoaXMgb25seSB3b3JrcyB3aXRoIGdjYy9sZCBhcyBsaW5rZXIKKyAgICAgICAgaWYgKChleHBvcnRfc3ltYm9scyBpcyBub3QgTm9uZSkgYW5kCisgICAgICAgICAgICAodGFyZ2V0X2Rlc2MgIT0gc2VsZi5FWEVDVVRBQkxFKSk6CisgICAgICAgICAgICAjIChUaGUgbGlua2VyIGRvZXNuJ3QgZG8gYW55dGhpbmcgaWYgb3V0cHV0IGlzIHVwLXRvLWRhdGUuCisgICAgICAgICAgICAjIFNvIGl0IHdvdWxkIHByb2JhYmx5IGJldHRlciB0byBjaGVjayBpZiB3ZSByZWFsbHkgbmVlZCB0aGlzLAorICAgICAgICAgICAgIyBidXQgZm9yIHRoaXMgd2UgaGFkIHRvIGluc2VydCBzb21lIHVuY2hhbmdlZCBwYXJ0cyBvZgorICAgICAgICAgICAgIyBVbml4Q0NvbXBpbGVyLCBhbmQgdGhpcyBpcyBub3Qgd2hhdCB3ZSB3YW50LikKKworICAgICAgICAgICAgIyB3ZSB3YW50IHRvIHB1dCBzb21lIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUKKyAgICAgICAgICAgICMgb2JqZWN0IGZpbGVzIGFyZSwgYnVpbGRfdGVtcCBkb2Vzbid0IGhlbHAgbXVjaAorICAgICAgICAgICAgIyB3aGVyZSBhcmUgdGhlIG9iamVjdCBmaWxlcworICAgICAgICAgICAgdGVtcF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob2JqZWN0c1swXSkKKyAgICAgICAgICAgICMgbmFtZSBvZiBkbGwgdG8gZ2l2ZSB0aGUgaGVscGVyIGZpbGVzIHRoZSBzYW1lIGJhc2UgbmFtZQorICAgICAgICAgICAgKGRsbF9uYW1lLCBkbGxfZXh0ZW5zaW9uKSA9IG9zLnBhdGguc3BsaXRleHQoCisgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShvdXRwdXRfZmlsZW5hbWUpKQorCisgICAgICAgICAgICAjIGdlbmVyYXRlIHRoZSBmaWxlbmFtZXMgZm9yIHRoZXNlIGZpbGVzCisgICAgICAgICAgICBkZWZfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wX2RpciwgZGxsX25hbWUgKyAiLmRlZiIpCisKKyAgICAgICAgICAgICMgR2VuZXJhdGUgLmRlZiBmaWxlCisgICAgICAgICAgICBjb250ZW50cyA9IFsKKyAgICAgICAgICAgICAgICAiTElCUkFSWSAlcyBJTklUSU5TVEFOQ0UgVEVSTUlOU1RBTkNFIiAlIFwKKyAgICAgICAgICAgICAgICBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUob3V0cHV0X2ZpbGVuYW1lKSlbMF0sCisgICAgICAgICAgICAgICAgIkRBVEEgTVVMVElQTEUgTk9OU0hBUkVEIiwKKyAgICAgICAgICAgICAgICAiRVhQT1JUUyJdCisgICAgICAgICAgICBmb3Igc3ltIGluIGV4cG9ydF9zeW1ib2xzOgorICAgICAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZCgnICAiJXMiJyAlIHN5bSkKKyAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSh3cml0ZV9maWxlLCAoZGVmX2ZpbGUsIGNvbnRlbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGluZyAlcyIgJSBkZWZfZmlsZSkKKworICAgICAgICAgICAgIyBuZXh0IGFkZCBvcHRpb25zIGZvciBkZWYtZmlsZSBhbmQgdG8gY3JlYXRpbmcgaW1wb3J0IGxpYnJhcmllcworICAgICAgICAgICAgIyBmb3IgZ2NjL2xkIHRoZSBkZWYtZmlsZSBpcyBzcGVjaWZpZWQgYXMgYW55IG90aGVyIG9iamVjdCBmaWxlcworICAgICAgICAgICAgb2JqZWN0cy5hcHBlbmQoZGVmX2ZpbGUpCisKKyAgICAgICAgI2VuZDogaWYgKChleHBvcnRfc3ltYm9scyBpcyBub3QgTm9uZSkgYW5kCisgICAgICAgICMgICAgICAgICh0YXJnZXRfZGVzYyAhPSBzZWxmLkVYRUNVVEFCTEUgb3Igc2VsZi5saW5rZXJfZGxsID09ICJnY2MiKSk6CisKKyAgICAgICAgIyB3aG8gd2FudHMgc3ltYm9scyBhbmQgYSBtYW55IHRpbWVzIGxhcmdlciBvdXRwdXQgZmlsZQorICAgICAgICAjIHNob3VsZCBleHBsaWNpdGx5IHN3aXRjaCB0aGUgZGVidWcgbW9kZSBvbgorICAgICAgICAjIG90aGVyd2lzZSB3ZSBsZXQgZGxsd3JhcC9sZCBzdHJpcCB0aGUgb3V0cHV0IGZpbGUKKyAgICAgICAgIyAoT24gbXkgbWFjaGluZTogMTBLQiA8IHN0cmlwcGVkX2ZpbGUgPCA/PzEwMEtCCisgICAgICAgICMgICB1bnN0cmlwcGVkX2ZpbGUgPSBzdHJpcHBlZF9maWxlICsgWFhYIEtCCisgICAgICAgICMgICggWFhYPTI1NCBmb3IgYSB0eXBpY2FsIHB5dGhvbiBleHRlbnNpb24pKQorICAgICAgICBpZiBub3QgZGVidWc6CisgICAgICAgICAgICBleHRyYV9wcmVhcmdzLmFwcGVuZCgiLXMiKQorCisgICAgICAgIFVuaXhDQ29tcGlsZXIubGluayhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2Rlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnlfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgIyBleHBvcnRfc3ltYm9scywgd2UgZG8gdGhpcyBpbiBvdXIgZGVmLWZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfcHJlYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9sYW5nKQorCisgICAgIyBsaW5rICgpCisKKyAgICAjIC0tIE1pc2NlbGxhbmVvdXMgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgIyBvdmVycmlkZSB0aGUgb2JqZWN0X2ZpbGVuYW1lcyBtZXRob2QgZnJvbSBDQ29tcGlsZXIgdG8KKyAgICAjIHN1cHBvcnQgcmMgYW5kIHJlcy1maWxlcworICAgIGRlZiBvYmplY3RfZmlsZW5hbWVzIChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfZmlsZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcF9kaXI9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj0nJyk6CisgICAgICAgIGlmIG91dHB1dF9kaXIgaXMgTm9uZTogb3V0cHV0X2RpciA9ICcnCisgICAgICAgIG9ial9uYW1lcyA9IFtdCisgICAgICAgIGZvciBzcmNfbmFtZSBpbiBzb3VyY2VfZmlsZW5hbWVzOgorICAgICAgICAgICAgIyB1c2Ugbm9ybWNhc2UgdG8gbWFrZSBzdXJlICcucmMnIGlzIHJlYWxseSAnLnJjJyBhbmQgbm90ICcuUkMnCisgICAgICAgICAgICAoYmFzZSwgZXh0KSA9IG9zLnBhdGguc3BsaXRleHQgKG9zLnBhdGgubm9ybWNhc2Uoc3JjX25hbWUpKQorICAgICAgICAgICAgaWYgZXh0IG5vdCBpbiAoc2VsZi5zcmNfZXh0ZW5zaW9ucyArIFsnLnJjJ10pOgorICAgICAgICAgICAgICAgIHJhaXNlIFVua25vd25GaWxlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBmaWxlIHR5cGUgJyVzJyAoZnJvbSAnJXMnKSIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgKGV4dCwgc3JjX25hbWUpCisgICAgICAgICAgICBpZiBzdHJpcF9kaXI6CisgICAgICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUgKGJhc2UpCisgICAgICAgICAgICBpZiBleHQgPT0gJy5yYyc6CisgICAgICAgICAgICAgICAgIyB0aGVzZSBuZWVkIHRvIGJlIGNvbXBpbGVkIHRvIG9iamVjdCBmaWxlcworICAgICAgICAgICAgICAgIG9ial9uYW1lcy5hcHBlbmQgKG9zLnBhdGguam9pbiAob3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIHNlbGYucmVzX2V4dGVuc2lvbikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9ial9uYW1lcy5hcHBlbmQgKG9zLnBhdGguam9pbiAob3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIHNlbGYub2JqX2V4dGVuc2lvbikpCisgICAgICAgIHJldHVybiBvYmpfbmFtZXMKKworICAgICMgb2JqZWN0X2ZpbGVuYW1lcyAoKQorCisgICAgIyBvdmVycmlkZSB0aGUgZmluZF9saWJyYXJ5X2ZpbGUgbWV0aG9kIGZyb20gVW5peENDb21waWxlcgorICAgICMgdG8gZGVhbCB3aXRoIGZpbGUgbmFtaW5nL3NlYXJjaGluZyBkaWZmZXJlbmNlcworICAgIGRlZiBmaW5kX2xpYnJhcnlfZmlsZShzZWxmLCBkaXJzLCBsaWIsIGRlYnVnPTApOgorICAgICAgICBzaG9ydGxpYiA9ICclcy5saWInICUgbGliCisgICAgICAgIGxvbmdsaWIgPSAnbGliJXMubGliJyAlIGxpYiAgICAjIHRoaXMgZm9ybSB2ZXJ5IHJhcmUKKworICAgICAgICAjIGdldCBFTVgncyBkZWZhdWx0IGxpYnJhcnkgZGlyZWN0b3J5IHNlYXJjaCBwYXRoCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVteF9kaXJzID0gb3MuZW52aXJvblsnTElCUkFSWV9QQVRIJ10uc3BsaXQoJzsnKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBlbXhfZGlycyA9IFtdCisKKyAgICAgICAgZm9yIGRpciBpbiBkaXJzICsgZW14X2RpcnM6CisgICAgICAgICAgICBzaG9ydGxpYnAgPSBvcy5wYXRoLmpvaW4oZGlyLCBzaG9ydGxpYikKKyAgICAgICAgICAgIGxvbmdsaWJwID0gb3MucGF0aC5qb2luKGRpciwgbG9uZ2xpYikKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNob3J0bGlicCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNob3J0bGlicAorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhsb25nbGlicCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvbmdsaWJwCisKKyAgICAgICAgIyBPb3BzLCBkaWRuJ3QgZmluZCBpdCBpbiAqYW55KiBvZiAnZGlycycKKyAgICAgICAgcmV0dXJuIE5vbmUKKworIyBjbGFzcyBFTVhDQ29tcGlsZXIKKworCisjIEJlY2F1c2UgdGhlc2UgY29tcGlsZXJzIGFyZW4ndCBjb25maWd1cmVkIGluIFB5dGhvbidzIHB5Y29uZmlnLmggZmlsZSBieQorIyBkZWZhdWx0LCB3ZSBzaG91bGQgYXQgbGVhc3Qgd2FybiB0aGUgdXNlciBpZiBoZSBpcyB1c2luZyBhIHVubW9kaWZpZWQKKyMgdmVyc2lvbi4KKworQ09ORklHX0hfT0sgPSAib2siCitDT05GSUdfSF9OT1RPSyA9ICJub3Qgb2siCitDT05GSUdfSF9VTkNFUlRBSU4gPSAidW5jZXJ0YWluIgorCitkZWYgY2hlY2tfY29uZmlnX2goKToKKworICAgICIiIkNoZWNrIGlmIHRoZSBjdXJyZW50IFB5dGhvbiBpbnN0YWxsYXRpb24gKHNwZWNpZmljYWxseSwgcHljb25maWcuaCkKKyAgICBhcHBlYXJzIGFtZW5hYmxlIHRvIGJ1aWxkaW5nIGV4dGVuc2lvbnMgd2l0aCBHQ0MuICBSZXR1cm5zIGEgdHVwbGUKKyAgICAoc3RhdHVzLCBkZXRhaWxzKSwgd2hlcmUgJ3N0YXR1cycgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorICAgICAgQ09ORklHX0hfT0sKKyAgICAgICAgYWxsIGlzIHdlbGwsIGdvIGFoZWFkIGFuZCBjb21waWxlCisgICAgICBDT05GSUdfSF9OT1RPSworICAgICAgICBkb2Vzbid0IGxvb2sgZ29vZAorICAgICAgQ09ORklHX0hfVU5DRVJUQUlOCisgICAgICAgIG5vdCBzdXJlIC0tIHVuYWJsZSB0byByZWFkIHB5Y29uZmlnLmgKKyAgICAnZGV0YWlscycgaXMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgZXhwbGFpbmluZyB0aGUgc2l0dWF0aW9uLgorCisgICAgTm90ZSB0aGVyZSBhcmUgdHdvIHdheXMgdG8gY29uY2x1ZGUgIk9LIjogZWl0aGVyICdzeXMudmVyc2lvbicgY29udGFpbnMKKyAgICB0aGUgc3RyaW5nICJHQ0MiIChpbXBseWluZyB0aGF0IHRoaXMgUHl0aG9uIHdhcyBidWlsdCB3aXRoIEdDQyksIG9yIHRoZQorICAgIGluc3RhbGxlZCAicHljb25maWcuaCIgY29udGFpbnMgdGhlIHN0cmluZyAiX19HTlVDX18iLgorICAgICIiIgorCisgICAgIyBYWFggc2luY2UgdGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyBzeXMudmVyc2lvbiwgaXQncyBub3Qgc3RyaWN0bHkgYQorICAgICMgInB5Y29uZmlnLmgiIGNoZWNrIC0tIHNob3VsZCBwcm9iYWJseSBiZSByZW5hbWVkLi4uCisKKyAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCisgICAgaW1wb3J0IHN0cmluZworICAgICMgaWYgc3lzLnZlcnNpb24gY29udGFpbnMgR0NDIHRoZW4gcHl0aG9uIHdhcyBjb21waWxlZCB3aXRoCisgICAgIyBHQ0MsIGFuZCB0aGUgcHljb25maWcuaCBmaWxlIHNob3VsZCBiZSBPSworICAgIGlmIHN0cmluZy5maW5kKHN5cy52ZXJzaW9uLCJHQ0MiKSA+PSAwOgorICAgICAgICByZXR1cm4gKENPTkZJR19IX09LLCAic3lzLnZlcnNpb24gbWVudGlvbnMgJ0dDQyciKQorCisgICAgZm4gPSBzeXNjb25maWcuZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKCkKKyAgICB0cnk6CisgICAgICAgICMgSXQgd291bGQgcHJvYmFibHkgYmV0dGVyIHRvIHJlYWQgc2luZ2xlIGxpbmVzIHRvIHNlYXJjaC4KKyAgICAgICAgIyBCdXQgd2UgZG8gdGhpcyBvbmx5IG9uY2UsIGFuZCBpdCBpcyBmYXN0IGVub3VnaAorICAgICAgICBmID0gb3BlbihmbikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcyA9IGYucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGV4Y2VwdCBJT0Vycm9yLCBleGM6CisgICAgICAgICMgaWYgd2UgY2FuJ3QgcmVhZCB0aGlzIGZpbGUsIHdlIGNhbm5vdCBzYXkgaXQgaXMgd3JvbmcKKyAgICAgICAgIyB0aGUgY29tcGlsZXIgd2lsbCBjb21wbGFpbiBsYXRlciBhYm91dCB0aGlzIGZpbGUgYXMgbWlzc2luZworICAgICAgICByZXR1cm4gKENPTkZJR19IX1VOQ0VSVEFJTiwKKyAgICAgICAgICAgICAgICAiY291bGRuJ3QgcmVhZCAnJXMnOiAlcyIgJSAoZm4sIGV4Yy5zdHJlcnJvcikpCisKKyAgICBlbHNlOgorICAgICAgICAjICJweWNvbmZpZy5oIiBjb250YWlucyBhbiAiI2lmZGVmIF9fR05VQ19fIiBvciBzb21ldGhpbmcgc2ltaWxhcgorICAgICAgICBpZiBzdHJpbmcuZmluZChzLCJfX0dOVUNfXyIpID49IDA6CisgICAgICAgICAgICByZXR1cm4gKENPTkZJR19IX09LLCAiJyVzJyBtZW50aW9ucyAnX19HTlVDX18nIiAlIGZuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIChDT05GSUdfSF9OT1RPSywgIiclcycgZG9lcyBub3QgbWVudGlvbiAnX19HTlVDX18nIiAlIGZuKQorCisKK2RlZiBnZXRfdmVyc2lvbnMoKToKKyAgICAiIiIgVHJ5IHRvIGZpbmQgb3V0IHRoZSB2ZXJzaW9ucyBvZiBnY2MgYW5kIGxkLgorICAgICAgICBJZiBub3QgcG9zc2libGUgaXQgcmV0dXJucyBOb25lIGZvciBpdC4KKyAgICAiIiIKKyAgICBmcm9tIGRpc3R1dGlscy52ZXJzaW9uIGltcG9ydCBTdHJpY3RWZXJzaW9uCisgICAgZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZQorICAgIGltcG9ydCByZQorCisgICAgZ2NjX2V4ZSA9IGZpbmRfZXhlY3V0YWJsZSgnZ2NjJykKKyAgICBpZiBnY2NfZXhlOgorICAgICAgICBvdXQgPSBvcy5wb3BlbihnY2NfZXhlICsgJyAtZHVtcHZlcnNpb24nLCdyJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3V0X3N0cmluZyA9IG91dC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG91dC5jbG9zZSgpCisgICAgICAgIHJlc3VsdCA9IHJlLnNlYXJjaCgnKFxkK1wuXGQrXC5cZCspJyxvdXRfc3RyaW5nKQorICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICBnY2NfdmVyc2lvbiA9IFN0cmljdFZlcnNpb24ocmVzdWx0Lmdyb3VwKDEpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ2NjX3ZlcnNpb24gPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgZ2NjX3ZlcnNpb24gPSBOb25lCisgICAgIyBFTVggbGQgaGFzIG5vIHdheSBvZiByZXBvcnRpbmcgdmVyc2lvbiBudW1iZXIsIGFuZCB3ZSB1c2UgR0NDCisgICAgIyBhbnl3YXkgLSBzbyB3ZSBjYW4gbGluayBPTUYgRExMcworICAgIGxkX3ZlcnNpb24gPSBOb25lCisgICAgcmV0dXJuIChnY2NfdmVyc2lvbiwgbGRfdmVyc2lvbikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2VteGNjb21waWxlci5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9lbXhjY29tcGlsZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNGFiZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9lbXhjY29tcGlsZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2VteGNjb21waWxlci5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9lbXhjY29tcGlsZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNGFiZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9lbXhjY29tcGlsZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Vycm9ycy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Vycm9ycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWM0N2M3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZXJyb3JzLnB5CkBAIC0wLDAgKzEsODggQEAKKyIiImRpc3R1dGlscy5lcnJvcnMKKworUHJvdmlkZXMgZXhjZXB0aW9ucyB1c2VkIGJ5IHRoZSBEaXN0dXRpbHMgbW9kdWxlcy4gIE5vdGUgdGhhdCBEaXN0dXRpbHMKK21vZHVsZXMgbWF5IHJhaXNlIHN0YW5kYXJkIGV4Y2VwdGlvbnM7IGluIHBhcnRpY3VsYXIsIFN5c3RlbUV4aXQgaXMKK3VzdWFsbHkgcmFpc2VkIGZvciBlcnJvcnMgdGhhdCBhcmUgb2J2aW91c2x5IHRoZSBlbmQtdXNlcidzIGZhdWx0CisoZWcuIGJhZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzKS4KKworVGhpcyBtb2R1bGUgaXMgc2FmZSB0byB1c2UgaW4gImZyb20gLi4uIGltcG9ydCAqIiBtb2RlOyBpdCBvbmx5IGV4cG9ydHMKK3N5bWJvbHMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCAiRGlzdHV0aWxzIiBhbmQgZW5kIHdpdGggIkVycm9yIi4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2NsYXNzIERpc3R1dGlsc0Vycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiVGhlIHJvb3Qgb2YgYWxsIERpc3R1dGlscyBldmlsLiIiIgorCitjbGFzcyBEaXN0dXRpbHNNb2R1bGVFcnJvcihEaXN0dXRpbHNFcnJvcik6CisgICAgIiIiVW5hYmxlIHRvIGxvYWQgYW4gZXhwZWN0ZWQgbW9kdWxlLCBvciB0byBmaW5kIGFuIGV4cGVjdGVkIGNsYXNzCisgICAgd2l0aGluIHNvbWUgbW9kdWxlIChpbiBwYXJ0aWN1bGFyLCBjb21tYW5kIG1vZHVsZXMgYW5kIGNsYXNzZXMpLiIiIgorCitjbGFzcyBEaXN0dXRpbHNDbGFzc0Vycm9yKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJTb21lIGNvbW1hbmQgY2xhc3MgKG9yIHBvc3NpYmx5IGRpc3RyaWJ1dGlvbiBjbGFzcywgaWYgYW55b25lCisgICAgZmVlbHMgYSBuZWVkIHRvIHN1YmNsYXNzIERpc3RyaWJ1dGlvbikgaXMgZm91bmQgbm90IHRvIGJlIGhvbGRpbmcKKyAgICB1cCBpdHMgZW5kIG9mIHRoZSBiYXJnYWluLCBpZS4gaW1wbGVtZW50aW5nIHNvbWUgcGFydCBvZiB0aGUKKyAgICAiY29tbWFuZCAiaW50ZXJmYWNlLiIiIgorCitjbGFzcyBEaXN0dXRpbHNHZXRvcHRFcnJvcihEaXN0dXRpbHNFcnJvcik6CisgICAgIiIiVGhlIG9wdGlvbiB0YWJsZSBwcm92aWRlZCB0byAnZmFuY3lfZ2V0b3B0KCknIGlzIGJvZ3VzLiIiIgorCitjbGFzcyBEaXN0dXRpbHNBcmdFcnJvcihEaXN0dXRpbHNFcnJvcik6CisgICAgIiIiUmFpc2VkIGJ5IGZhbmN5X2dldG9wdCBpbiByZXNwb25zZSB0byBnZXRvcHQuZXJyb3IgLS0gaWUuIGFuCisgICAgZXJyb3IgaW4gdGhlIGNvbW1hbmQgbGluZSB1c2FnZS4iIiIKKworY2xhc3MgRGlzdHV0aWxzRmlsZUVycm9yKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJBbnkgcHJvYmxlbXMgaW4gdGhlIGZpbGVzeXN0ZW06IGV4cGVjdGVkIGZpbGUgbm90IGZvdW5kLCBldGMuCisgICAgVHlwaWNhbGx5IHRoaXMgaXMgZm9yIHByb2JsZW1zIHRoYXQgd2UgZGV0ZWN0IGJlZm9yZSBJT0Vycm9yIG9yCisgICAgT1NFcnJvciBjb3VsZCBiZSByYWlzZWQuIiIiCisKK2NsYXNzIERpc3R1dGlsc09wdGlvbkVycm9yKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJTeW50YWN0aWMvc2VtYW50aWMgZXJyb3JzIGluIGNvbW1hbmQgb3B0aW9ucywgc3VjaCBhcyB1c2Ugb2YKKyAgICBtdXR1YWxseSBjb25mbGljdGluZyBvcHRpb25zLCBvciBpbmNvbnNpc3RlbnQgb3B0aW9ucywKKyAgICBiYWRseS1zcGVsbGVkIHZhbHVlcywgZXRjLiAgTm8gZGlzdGluY3Rpb24gaXMgbWFkZSBiZXR3ZWVuIG9wdGlvbgorICAgIHZhbHVlcyBvcmlnaW5hdGluZyBpbiB0aGUgc2V0dXAgc2NyaXB0LCB0aGUgY29tbWFuZCBsaW5lLCBjb25maWcKKyAgICBmaWxlcywgb3Igd2hhdC1oYXZlLXlvdSAtLSBidXQgaWYgd2UgKmtub3cqIHNvbWV0aGluZyBvcmlnaW5hdGVkIGluCisgICAgdGhlIHNldHVwIHNjcmlwdCwgd2UnbGwgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvciBpbnN0ZWFkLiIiIgorCitjbGFzcyBEaXN0dXRpbHNTZXR1cEVycm9yKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJGb3IgZXJyb3JzIHRoYXQgY2FuIGJlIGRlZmluaXRlbHkgYmxhbWVkIG9uIHRoZSBzZXR1cCBzY3JpcHQsCisgICAgc3VjaCBhcyBpbnZhbGlkIGtleXdvcmQgYXJndW1lbnRzIHRvICdzZXR1cCgpJy4iIiIKKworY2xhc3MgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihEaXN0dXRpbHNFcnJvcik6CisgICAgIiIiV2UgZG9uJ3Qga25vdyBob3cgdG8gZG8gc29tZXRoaW5nIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtIChidXQKKyAgICB3ZSBkbyBrbm93IGhvdyB0byBkbyBpdCBvbiBzb21lIHBsYXRmb3JtKSAtLSBlZy4gdHJ5aW5nIHRvIGNvbXBpbGUKKyAgICBDIGZpbGVzIG9uIGEgcGxhdGZvcm0gbm90IHN1cHBvcnRlZCBieSBhIENDb21waWxlciBzdWJjbGFzcy4iIiIKKworY2xhc3MgRGlzdHV0aWxzRXhlY0Vycm9yKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJBbnkgcHJvYmxlbXMgZXhlY3V0aW5nIGFuIGV4dGVybmFsIHByb2dyYW0gKHN1Y2ggYXMgdGhlIEMKKyAgICBjb21waWxlciwgd2hlbiBjb21waWxpbmcgQyBmaWxlcykuIiIiCisKK2NsYXNzIERpc3R1dGlsc0ludGVybmFsRXJyb3IoRGlzdHV0aWxzRXJyb3IpOgorICAgICIiIkludGVybmFsIGluY29uc2lzdGVuY2llcyBvciBpbXBvc3NpYmlsaXRpZXMgKG9idmlvdXNseSwgdGhpcworICAgIHNob3VsZCBuZXZlciBiZSBzZWVuIGlmIHRoZSBjb2RlIGlzIHdvcmtpbmchKS4iIiIKKworY2xhc3MgRGlzdHV0aWxzVGVtcGxhdGVFcnJvcihEaXN0dXRpbHNFcnJvcik6CisgICAgIiIiU3ludGF4IGVycm9yIGluIGEgZmlsZSBsaXN0IHRlbXBsYXRlLiIiIgorCitjbGFzcyBEaXN0dXRpbHNCeXRlQ29tcGlsZUVycm9yKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJCeXRlIGNvbXBpbGUgZXJyb3IuIiIiCisKKyMgRXhjZXB0aW9uIGNsYXNzZXMgdXNlZCBieSB0aGUgQ0NvbXBpbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzZXMKK2NsYXNzIENDb21waWxlckVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiU29tZSBjb21waWxlL2xpbmsgb3BlcmF0aW9uIGZhaWxlZC4iIiIKKworY2xhc3MgUHJlcHJvY2Vzc0Vycm9yKENDb21waWxlckVycm9yKToKKyAgICAiIiJGYWlsdXJlIHRvIHByZXByb2Nlc3Mgb25lIG9yIG1vcmUgQy9DKysgZmlsZXMuIiIiCisKK2NsYXNzIENvbXBpbGVFcnJvcihDQ29tcGlsZXJFcnJvcik6CisgICAgIiIiRmFpbHVyZSB0byBjb21waWxlIG9uZSBvciBtb3JlIEMvQysrIHNvdXJjZSBmaWxlcy4iIiIKKworY2xhc3MgTGliRXJyb3IoQ0NvbXBpbGVyRXJyb3IpOgorICAgICIiIkZhaWx1cmUgdG8gY3JlYXRlIGEgc3RhdGljIGxpYnJhcnkgZnJvbSBvbmUgb3IgbW9yZSBDL0MrKyBvYmplY3QKKyAgICBmaWxlcy4iIiIKKworY2xhc3MgTGlua0Vycm9yKENDb21waWxlckVycm9yKToKKyAgICAiIiJGYWlsdXJlIHRvIGxpbmsgb25lIG9yIG1vcmUgQy9DKysgb2JqZWN0IGZpbGVzIGludG8gYW4gZXhlY3V0YWJsZQorICAgIG9yIHNoYXJlZCBsaWJyYXJ5IGZpbGUuIiIiCisKK2NsYXNzIFVua25vd25GaWxlRXJyb3IoQ0NvbXBpbGVyRXJyb3IpOgorICAgICIiIkF0dGVtcHQgdG8gcHJvY2VzcyBhbiB1bmtub3duIGZpbGUgdHlwZS4iIiIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Vycm9ycy5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9lcnJvcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZDQ1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9lcnJvcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Vycm9ycy5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9lcnJvcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZDQ1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9lcnJvcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2V4dGVuc2lvbi5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2V4dGVuc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTY3Y2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZXh0ZW5zaW9uLnB5CkBAIC0wLDAgKzEsMjU1IEBACisiIiJkaXN0dXRpbHMuZXh0ZW5zaW9uCisKK1Byb3ZpZGVzIHRoZSBFeHRlbnNpb24gY2xhc3MsIHVzZWQgdG8gZGVzY3JpYmUgQy9DKysgZXh0ZW5zaW9uCittb2R1bGVzIGluIHNldHVwIHNjcmlwdHMuIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MsIHN0cmluZywgc3lzCitmcm9tIHR5cGVzIGltcG9ydCAqCisKK3RyeToKKyAgICBpbXBvcnQgd2FybmluZ3MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB3YXJuaW5ncyA9IE5vbmUKKworIyBUaGlzIGNsYXNzIGlzIHJlYWxseSBvbmx5IHVzZWQgYnkgdGhlICJidWlsZF9leHQiIGNvbW1hbmQsIHNvIGl0IG1pZ2h0CisjIG1ha2Ugc2Vuc2UgdG8gcHV0IGl0IGluIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dC4gIEhvd2V2ZXIsIHRoYXQKKyMgbW9kdWxlIGlzIGFscmVhZHkgYmlnIGVub3VnaCwgYW5kIEkgd2FudCB0byBtYWtlIHRoaXMgY2xhc3MgYSBiaXQgbW9yZQorIyBjb21wbGV4IHRvIHNpbXBsaWZ5IHNvbWUgY29tbW9uIGNhc2VzICgiZm9vIiBtb2R1bGUgaW4gImZvby5jIikgYW5kIGRvCisjIGJldHRlciBlcnJvci1jaGVja2luZyAoImZvby5jIiBhY3R1YWxseSBleGlzdHMpLgorIworIyBBbHNvLCBwdXR0aW5nIHRoaXMgaW4gYnVpbGRfZXh0LnB5IG1lYW5zIGV2ZXJ5IHNldHVwIHNjcmlwdCB3b3VsZCBoYXZlIHRvCisjIGltcG9ydCB0aGF0IGxhcmdlLWlzaCBtb2R1bGUgKGluZGlyZWN0bHksIHRocm91Z2ggZGlzdHV0aWxzLmNvcmUpIGluCisjIG9yZGVyIHRvIGRvIGFueXRoaW5nLgorCitjbGFzcyBFeHRlbnNpb246CisgICAgIiIiSnVzdCBhIGNvbGxlY3Rpb24gb2YgYXR0cmlidXRlcyB0aGF0IGRlc2NyaWJlcyBhbiBleHRlbnNpb24KKyAgICBtb2R1bGUgYW5kIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIGJ1aWxkIGl0IChob3BlZnVsbHkgaW4gYSBwb3J0YWJsZQorICAgIHdheSwgYnV0IHRoZXJlIGFyZSBob29rcyB0aGF0IGxldCB5b3UgYmUgYXMgdW5wb3J0YWJsZSBhcyB5b3UgbmVlZCkuCisKKyAgICBJbnN0YW5jZSBhdHRyaWJ1dGVzOgorICAgICAgbmFtZSA6IHN0cmluZworICAgICAgICB0aGUgZnVsbCBuYW1lIG9mIHRoZSBleHRlbnNpb24sIGluY2x1ZGluZyBhbnkgcGFja2FnZXMgLS0gaWUuCisgICAgICAgICpub3QqIGEgZmlsZW5hbWUgb3IgcGF0aG5hbWUsIGJ1dCBQeXRob24gZG90dGVkIG5hbWUKKyAgICAgIHNvdXJjZXMgOiBbc3RyaW5nXQorICAgICAgICBsaXN0IG9mIHNvdXJjZSBmaWxlbmFtZXMsIHJlbGF0aXZlIHRvIHRoZSBkaXN0cmlidXRpb24gcm9vdAorICAgICAgICAod2hlcmUgdGhlIHNldHVwIHNjcmlwdCBsaXZlcyksIGluIFVuaXggZm9ybSAoc2xhc2gtc2VwYXJhdGVkKQorICAgICAgICBmb3IgcG9ydGFiaWxpdHkuICBTb3VyY2UgZmlsZXMgbWF5IGJlIEMsIEMrKywgU1dJRyAoLmkpLAorICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyByZXNvdXJjZSBmaWxlcywgb3Igd2hhdGV2ZXIgZWxzZSBpcyByZWNvZ25pemVkCisgICAgICAgIGJ5IHRoZSAiYnVpbGRfZXh0IiBjb21tYW5kIGFzIHNvdXJjZSBmb3IgYSBQeXRob24gZXh0ZW5zaW9uLgorICAgICAgaW5jbHVkZV9kaXJzIDogW3N0cmluZ10KKyAgICAgICAgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIEMvQysrIGhlYWRlciBmaWxlcyAoaW4gVW5peAorICAgICAgICBmb3JtIGZvciBwb3J0YWJpbGl0eSkKKyAgICAgIGRlZmluZV9tYWNyb3MgOiBbKG5hbWUgOiBzdHJpbmcsIHZhbHVlIDogc3RyaW5nfE5vbmUpXQorICAgICAgICBsaXN0IG9mIG1hY3JvcyB0byBkZWZpbmU7IGVhY2ggbWFjcm8gaXMgZGVmaW5lZCB1c2luZyBhIDItdHVwbGUsCisgICAgICAgIHdoZXJlICd2YWx1ZScgaXMgZWl0aGVyIHRoZSBzdHJpbmcgdG8gZGVmaW5lIGl0IHRvIG9yIE5vbmUgdG8KKyAgICAgICAgZGVmaW5lIGl0IHdpdGhvdXQgYSBwYXJ0aWN1bGFyIHZhbHVlIChlcXVpdmFsZW50IG9mICIjZGVmaW5lCisgICAgICAgIEZPTyIgaW4gc291cmNlIG9yIC1ERk9PIG9uIFVuaXggQyBjb21waWxlciBjb21tYW5kIGxpbmUpCisgICAgICB1bmRlZl9tYWNyb3MgOiBbc3RyaW5nXQorICAgICAgICBsaXN0IG9mIG1hY3JvcyB0byB1bmRlZmluZSBleHBsaWNpdGx5CisgICAgICBsaWJyYXJ5X2RpcnMgOiBbc3RyaW5nXQorICAgICAgICBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgQy9DKysgbGlicmFyaWVzIGF0IGxpbmsgdGltZQorICAgICAgbGlicmFyaWVzIDogW3N0cmluZ10KKyAgICAgICAgbGlzdCBvZiBsaWJyYXJ5IG5hbWVzIChub3QgZmlsZW5hbWVzIG9yIHBhdGhzKSB0byBsaW5rIGFnYWluc3QKKyAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzIDogW3N0cmluZ10KKyAgICAgICAgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIEMvQysrIGxpYnJhcmllcyBhdCBydW4gdGltZQorICAgICAgICAoZm9yIHNoYXJlZCBleHRlbnNpb25zLCB0aGlzIGlzIHdoZW4gdGhlIGV4dGVuc2lvbiBpcyBsb2FkZWQpCisgICAgICBleHRyYV9vYmplY3RzIDogW3N0cmluZ10KKyAgICAgICAgbGlzdCBvZiBleHRyYSBmaWxlcyB0byBsaW5rIHdpdGggKGVnLiBvYmplY3QgZmlsZXMgbm90IGltcGxpZWQKKyAgICAgICAgYnkgJ3NvdXJjZXMnLCBzdGF0aWMgbGlicmFyeSB0aGF0IG11c3QgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQsCisgICAgICAgIGJpbmFyeSByZXNvdXJjZSBmaWxlcywgZXRjLikKKyAgICAgIGV4dHJhX2NvbXBpbGVfYXJncyA6IFtzdHJpbmddCisgICAgICAgIGFueSBleHRyYSBwbGF0Zm9ybS0gYW5kIGNvbXBpbGVyLXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIHVzZQorICAgICAgICB3aGVuIGNvbXBpbGluZyB0aGUgc291cmNlIGZpbGVzIGluICdzb3VyY2VzJy4gIEZvciBwbGF0Zm9ybXMgYW5kCisgICAgICAgIGNvbXBpbGVycyB3aGVyZSAiY29tbWFuZCBsaW5lIiBtYWtlcyBzZW5zZSwgdGhpcyBpcyB0eXBpY2FsbHkgYQorICAgICAgICBsaXN0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGJ1dCBmb3Igb3RoZXIgcGxhdGZvcm1zIGl0IGNvdWxkCisgICAgICAgIGJlIGFueXRoaW5nLgorICAgICAgZXh0cmFfbGlua19hcmdzIDogW3N0cmluZ10KKyAgICAgICAgYW55IGV4dHJhIHBsYXRmb3JtLSBhbmQgY29tcGlsZXItc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gdXNlCisgICAgICAgIHdoZW4gbGlua2luZyBvYmplY3QgZmlsZXMgdG9nZXRoZXIgdG8gY3JlYXRlIHRoZSBleHRlbnNpb24gKG9yCisgICAgICAgIHRvIGNyZWF0ZSBhIG5ldyBzdGF0aWMgUHl0aG9uIGludGVycHJldGVyKS4gIFNpbWlsYXIKKyAgICAgICAgaW50ZXJwcmV0YXRpb24gYXMgZm9yICdleHRyYV9jb21waWxlX2FyZ3MnLgorICAgICAgZXhwb3J0X3N5bWJvbHMgOiBbc3RyaW5nXQorICAgICAgICBsaXN0IG9mIHN5bWJvbHMgdG8gYmUgZXhwb3J0ZWQgZnJvbSBhIHNoYXJlZCBleHRlbnNpb24uICBOb3QKKyAgICAgICAgdXNlZCBvbiBhbGwgcGxhdGZvcm1zLCBhbmQgbm90IGdlbmVyYWxseSBuZWNlc3NhcnkgZm9yIFB5dGhvbgorICAgICAgICBleHRlbnNpb25zLCB3aGljaCB0eXBpY2FsbHkgZXhwb3J0IGV4YWN0bHkgb25lIHN5bWJvbDogImluaXQiICsKKyAgICAgICAgZXh0ZW5zaW9uX25hbWUuCisgICAgICBzd2lnX29wdHMgOiBbc3RyaW5nXQorICAgICAgICBhbnkgZXh0cmEgb3B0aW9ucyB0byBwYXNzIHRvIFNXSUcgaWYgYSBzb3VyY2UgZmlsZSBoYXMgdGhlIC5pCisgICAgICAgIGV4dGVuc2lvbi4KKyAgICAgIGRlcGVuZHMgOiBbc3RyaW5nXQorICAgICAgICBsaXN0IG9mIGZpbGVzIHRoYXQgdGhlIGV4dGVuc2lvbiBkZXBlbmRzIG9uCisgICAgICBsYW5ndWFnZSA6IHN0cmluZworICAgICAgICBleHRlbnNpb24gbGFuZ3VhZ2UgKGkuZS4gImMiLCAiYysrIiwgIm9iamMiKS4gV2lsbCBiZSBkZXRlY3RlZAorICAgICAgICBmcm9tIHRoZSBzb3VyY2UgZXh0ZW5zaW9ucyBpZiBub3QgcHJvdmlkZWQuCisgICAgIiIiCisKKyAgICAjIFdoZW4gYWRkaW5nIGFyZ3VtZW50cyB0byB0aGlzIGNvbnN0cnVjdG9yLCBiZSBzdXJlIHRvIHVwZGF0ZQorICAgICMgc2V0dXBfa2V5d29yZHMgaW4gY29yZS5weS4KKyAgICBkZWYgX19pbml0X18gKHNlbGYsIG5hbWUsIHNvdXJjZXMsCisgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIGRlZmluZV9tYWNyb3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIHVuZGVmX21hY3Jvcz1Ob25lLAorICAgICAgICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgICAgICBleHRyYV9vYmplY3RzPU5vbmUsCisgICAgICAgICAgICAgICAgICBleHRyYV9jb21waWxlX2FyZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1Ob25lLAorICAgICAgICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIHN3aWdfb3B0cyA9IE5vbmUsCisgICAgICAgICAgICAgICAgICBkZXBlbmRzPU5vbmUsCisgICAgICAgICAgICAgICAgICBsYW5ndWFnZT1Ob25lLAorICAgICAgICAgICAgICAgICAgKiprdyAgICAgICAgICAgICAgICAgICAgICAjIFRvIGNhdGNoIHVua25vd24ga2V5d29yZHMKKyAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgYXNzZXJ0IHR5cGUobmFtZSkgaXMgU3RyaW5nVHlwZSwgIiduYW1lJyBtdXN0IGJlIGEgc3RyaW5nIgorICAgICAgICBhc3NlcnQgKHR5cGUoc291cmNlcykgaXMgTGlzdFR5cGUgYW5kCisgICAgICAgICAgICAgICAgbWFwKHR5cGUsIHNvdXJjZXMpID09IFtTdHJpbmdUeXBlXSpsZW4oc291cmNlcykpLCBcCisgICAgICAgICAgICAgICAgIidzb3VyY2VzJyBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzIgorCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5zb3VyY2VzID0gc291cmNlcworICAgICAgICBzZWxmLmluY2x1ZGVfZGlycyA9IGluY2x1ZGVfZGlycyBvciBbXQorICAgICAgICBzZWxmLmRlZmluZV9tYWNyb3MgPSBkZWZpbmVfbWFjcm9zIG9yIFtdCisgICAgICAgIHNlbGYudW5kZWZfbWFjcm9zID0gdW5kZWZfbWFjcm9zIG9yIFtdCisgICAgICAgIHNlbGYubGlicmFyeV9kaXJzID0gbGlicmFyeV9kaXJzIG9yIFtdCisgICAgICAgIHNlbGYubGlicmFyaWVzID0gbGlicmFyaWVzIG9yIFtdCisgICAgICAgIHNlbGYucnVudGltZV9saWJyYXJ5X2RpcnMgPSBydW50aW1lX2xpYnJhcnlfZGlycyBvciBbXQorICAgICAgICBzZWxmLmV4dHJhX29iamVjdHMgPSBleHRyYV9vYmplY3RzIG9yIFtdCisgICAgICAgIHNlbGYuZXh0cmFfY29tcGlsZV9hcmdzID0gZXh0cmFfY29tcGlsZV9hcmdzIG9yIFtdCisgICAgICAgIHNlbGYuZXh0cmFfbGlua19hcmdzID0gZXh0cmFfbGlua19hcmdzIG9yIFtdCisgICAgICAgIHNlbGYuZXhwb3J0X3N5bWJvbHMgPSBleHBvcnRfc3ltYm9scyBvciBbXQorICAgICAgICBzZWxmLnN3aWdfb3B0cyA9IHN3aWdfb3B0cyBvciBbXQorICAgICAgICBzZWxmLmRlcGVuZHMgPSBkZXBlbmRzIG9yIFtdCisgICAgICAgIHNlbGYubGFuZ3VhZ2UgPSBsYW5ndWFnZQorCisgICAgICAgICMgSWYgdGhlcmUgYXJlIHVua25vd24ga2V5d29yZCBvcHRpb25zLCB3YXJuIGFib3V0IHRoZW0KKyAgICAgICAgaWYgbGVuKGt3KToKKyAgICAgICAgICAgIEwgPSBrdy5rZXlzKCkgOyBMLnNvcnQoKQorICAgICAgICAgICAgTCA9IG1hcChyZXByLCBMKQorICAgICAgICAgICAgbXNnID0gIlVua25vd24gRXh0ZW5zaW9uIG9wdGlvbnM6ICIgKyBzdHJpbmcuam9pbihMLCAnLCAnKQorICAgICAgICAgICAgaWYgd2FybmluZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2cpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnICsgJ1xuJykKKyMgY2xhc3MgRXh0ZW5zaW9uCisKKworZGVmIHJlYWRfc2V0dXBfZmlsZSAoZmlsZW5hbWUpOgorICAgIGZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgXAorICAgICAgICAgcGFyc2VfbWFrZWZpbGUsIGV4cGFuZF9tYWtlZmlsZV92YXJzLCBfdmFyaWFibGVfcngKKyAgICBmcm9tIGRpc3R1dGlscy50ZXh0X2ZpbGUgaW1wb3J0IFRleHRGaWxlCisgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgc3BsaXRfcXVvdGVkCisKKyAgICAjIEZpcnN0IHBhc3Mgb3ZlciB0aGUgZmlsZSB0byBnYXRoZXIgIlZBUiA9IFZBTFVFIiBhc3NpZ25tZW50cy4KKyAgICB2YXJzID0gcGFyc2VfbWFrZWZpbGUoZmlsZW5hbWUpCisKKyAgICAjIFNlY29uZCBwYXNzIHRvIGdvYmJsZSB1cCB0aGUgcmVhbCBjb250ZW50OiBsaW5lcyBvZiB0aGUgZm9ybQorICAgICMgICA8bW9kdWxlPiAuLi4gWzxzb3VyY2VmaWxlPiAuLi5dIFs8Y3BwYXJnPiAuLi5dIFs8bGlicmFyeT4gLi4uXQorICAgIGZpbGUgPSBUZXh0RmlsZShmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgc3RyaXBfY29tbWVudHM9MSwgc2tpcF9ibGFua3M9MSwgam9pbl9saW5lcz0xLAorICAgICAgICAgICAgICAgICAgICBsc3RyaXBfd3M9MSwgcnN0cmlwX3dzPTEpCisgICAgdHJ5OgorICAgICAgICBleHRlbnNpb25zID0gW10KKworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IGZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbGluZSBpcyBOb25lOiAgICAgICAgICAgICAgICAjIGVvZgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBfdmFyaWFibGVfcngubWF0Y2gobGluZSk6ICAgICMgVkFSPVZBTFVFLCBoYW5kbGVkIGluIGZpcnN0IHBhc3MKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgbGluZVswXSA9PSBsaW5lWy0xXSA9PSAiKiI6CisgICAgICAgICAgICAgICAgICAgIGZpbGUud2FybigiJyVzJyBsaW5lcyBub3QgaGFuZGxlZCB5ZXQiICUgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgI3ByaW50ICJvcmlnaW5hbCBsaW5lOiAiICsgbGluZQorICAgICAgICAgICAgbGluZSA9IGV4cGFuZF9tYWtlZmlsZV92YXJzKGxpbmUsIHZhcnMpCisgICAgICAgICAgICB3b3JkcyA9IHNwbGl0X3F1b3RlZChsaW5lKQorICAgICAgICAgICAgI3ByaW50ICJleHBhbmRlZCBsaW5lOiAiICsgbGluZQorCisgICAgICAgICAgICAjIE5CLiB0aGlzIHBhcnNlcyBhIHNsaWdodGx5IGRpZmZlcmVudCBzeW50YXggdGhhbiB0aGUgb2xkCisgICAgICAgICAgICAjIG1ha2VzZXR1cCBzY3JpcHQ6IGhlcmUsIHRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgZXh0ZW5zaW9uIHBlcgorICAgICAgICAgICAgIyBsaW5lLCBhbmQgaXQgbXVzdCBiZSB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgbGluZS4gIEkgaGF2ZSBubyBpZGVhCisgICAgICAgICAgICAjIHdoeSB0aGUgb2xkIHN5bnRheCBzdXBwb3J0ZWQgbXVsdGlwbGUgZXh0ZW5zaW9ucyBwZXIgbGluZSwgYXMKKyAgICAgICAgICAgICMgdGhleSBhbGwgd2luZCB1cCBiZWluZyB0aGUgc2FtZS4KKworICAgICAgICAgICAgbW9kdWxlID0gd29yZHNbMF0KKyAgICAgICAgICAgIGV4dCA9IEV4dGVuc2lvbihtb2R1bGUsIFtdKQorICAgICAgICAgICAgYXBwZW5kX25leHRfd29yZCA9IE5vbmUKKworICAgICAgICAgICAgZm9yIHdvcmQgaW4gd29yZHNbMTpdOgorICAgICAgICAgICAgICAgIGlmIGFwcGVuZF9uZXh0X3dvcmQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9uZXh0X3dvcmQuYXBwZW5kKHdvcmQpCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9uZXh0X3dvcmQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBzdWZmaXggPSBvcy5wYXRoLnNwbGl0ZXh0KHdvcmQpWzFdCisgICAgICAgICAgICAgICAgc3dpdGNoID0gd29yZFswOjJdIDsgdmFsdWUgPSB3b3JkWzI6XQorCisgICAgICAgICAgICAgICAgaWYgc3VmZml4IGluICgiLmMiLCAiLmNjIiwgIi5jcHAiLCAiLmN4eCIsICIuYysrIiwgIi5tIiwgIi5tbSIpOgorICAgICAgICAgICAgICAgICAgICAjIGhtbSwgc2hvdWxkIHdlIGRvIHNvbWV0aGluZyBhYm91dCBDIHZzLiBDKysgc291cmNlcz8KKyAgICAgICAgICAgICAgICAgICAgIyBvciBsZWF2ZSBpdCB1cCB0byB0aGUgQ0NvbXBpbGVyIGltcGxlbWVudGF0aW9uIHRvCisgICAgICAgICAgICAgICAgICAgICMgd29ycnkgYWJvdXQ/CisgICAgICAgICAgICAgICAgICAgIGV4dC5zb3VyY2VzLmFwcGVuZCh3b3JkKQorICAgICAgICAgICAgICAgIGVsaWYgc3dpdGNoID09ICItSSI6CisgICAgICAgICAgICAgICAgICAgIGV4dC5pbmNsdWRlX2RpcnMuYXBwZW5kKHZhbHVlKQorICAgICAgICAgICAgICAgIGVsaWYgc3dpdGNoID09ICItRCI6CisgICAgICAgICAgICAgICAgICAgIGVxdWFscyA9IHN0cmluZy5maW5kKHZhbHVlLCAiPSIpCisgICAgICAgICAgICAgICAgICAgIGlmIGVxdWFscyA9PSAtMTogICAgICAgICMgYmFyZSAiLURGT08iIC0tIG5vIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBleHQuZGVmaW5lX21hY3Jvcy5hcHBlbmQoKHZhbHVlLCBOb25lKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgIyAiLURGT089YmxhaCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dC5kZWZpbmVfbWFjcm9zLmFwcGVuZCgodmFsdWVbMDplcXVhbHNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtlcXVhbHMrMjpdKSkKKyAgICAgICAgICAgICAgICBlbGlmIHN3aXRjaCA9PSAiLVUiOgorICAgICAgICAgICAgICAgICAgICBleHQudW5kZWZfbWFjcm9zLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBlbGlmIHN3aXRjaCA9PSAiLUMiOiAgICAgICAgIyBvbmx5IGhlcmUgJ2NhdXNlIG1ha2VzZXR1cCBoYXMgaXQhCisgICAgICAgICAgICAgICAgICAgIGV4dC5leHRyYV9jb21waWxlX2FyZ3MuYXBwZW5kKHdvcmQpCisgICAgICAgICAgICAgICAgZWxpZiBzd2l0Y2ggPT0gIi1sIjoKKyAgICAgICAgICAgICAgICAgICAgZXh0LmxpYnJhcmllcy5hcHBlbmQodmFsdWUpCisgICAgICAgICAgICAgICAgZWxpZiBzd2l0Y2ggPT0gIi1MIjoKKyAgICAgICAgICAgICAgICAgICAgZXh0LmxpYnJhcnlfZGlycy5hcHBlbmQodmFsdWUpCisgICAgICAgICAgICAgICAgZWxpZiBzd2l0Y2ggPT0gIi1SIjoKKyAgICAgICAgICAgICAgICAgICAgZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBlbGlmIHdvcmQgPT0gIi1ycGF0aCI6CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9uZXh0X3dvcmQgPSBleHQucnVudGltZV9saWJyYXJ5X2RpcnMKKyAgICAgICAgICAgICAgICBlbGlmIHdvcmQgPT0gIi1YbGlua2VyIjoKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kX25leHRfd29yZCA9IGV4dC5leHRyYV9saW5rX2FyZ3MKKyAgICAgICAgICAgICAgICBlbGlmIHdvcmQgPT0gIi1YY29tcGlsZXIiOgorICAgICAgICAgICAgICAgICAgICBhcHBlbmRfbmV4dF93b3JkID0gZXh0LmV4dHJhX2NvbXBpbGVfYXJncworICAgICAgICAgICAgICAgIGVsaWYgc3dpdGNoID09ICItdSI6CisgICAgICAgICAgICAgICAgICAgIGV4dC5leHRyYV9saW5rX2FyZ3MuYXBwZW5kKHdvcmQpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9uZXh0X3dvcmQgPSBleHQuZXh0cmFfbGlua19hcmdzCisgICAgICAgICAgICAgICAgZWxpZiB3b3JkID09ICItWGNvbXBpbGVyIjoKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kX25leHRfd29yZCA9IGV4dC5leHRyYV9jb21waWxlX2FyZ3MKKyAgICAgICAgICAgICAgICBlbGlmIHN3aXRjaCA9PSAiLXUiOgorICAgICAgICAgICAgICAgICAgICBleHQuZXh0cmFfbGlua19hcmdzLmFwcGVuZCh3b3JkKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgdmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRfbmV4dF93b3JkID0gZXh0LmV4dHJhX2xpbmtfYXJncworICAgICAgICAgICAgICAgIGVsaWYgc3VmZml4IGluICgiLmEiLCAiLnNvIiwgIi5zbCIsICIubyIsICIuZHlsaWIiKToKKyAgICAgICAgICAgICAgICAgICAgIyBOQi4gYSByZWFsbHkgZmFpdGhmdWwgZW11bGF0aW9uIG9mIG1ha2VzZXR1cCB3b3VsZAorICAgICAgICAgICAgICAgICAgICAjIGFwcGVuZCBhIC5vIGZpbGUgdG8gZXh0cmFfb2JqZWN0cyBvbmx5IGlmIGl0CisgICAgICAgICAgICAgICAgICAgICMgaGFkIGEgc2xhc2ggaW4gaXQ7IG90aGVyd2lzZSwgaXQgd291bGQgcy8uby8uYy8KKyAgICAgICAgICAgICAgICAgICAgIyBhbmQgYXBwZW5kIGl0IHRvIHNvdXJjZXMuICBIbW1tbS4KKyAgICAgICAgICAgICAgICAgICAgZXh0LmV4dHJhX29iamVjdHMuYXBwZW5kKHdvcmQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZmlsZS53YXJuKCJ1bnJlY29nbml6ZWQgYXJndW1lbnQgJyVzJyIgJSB3b3JkKQorCisgICAgICAgICAgICBleHRlbnNpb25zLmFwcGVuZChleHQpCisgICAgZmluYWxseToKKyAgICAgICAgZmlsZS5jbG9zZSgpCisKKyAgICAgICAgI3ByaW50ICJtb2R1bGU6IiwgbW9kdWxlCisgICAgICAgICNwcmludCAic291cmNlIGZpbGVzOiIsIHNvdXJjZV9maWxlcworICAgICAgICAjcHJpbnQgImNwcCBhcmdzOiIsIGNwcF9hcmdzCisgICAgICAgICNwcmludCAibGliIGFyZ3M6IiwgbGlicmFyeV9hcmdzCisKKyAgICAgICAgI2V4dGVuc2lvbnNbbW9kdWxlXSA9IHsgJ3NvdXJjZXMnOiBzb3VyY2VfZmlsZXMsCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICdjcHBfYXJncyc6IGNwcF9hcmdzLAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAnbGliX2FyZ3MnOiBsaWJyYXJ5X2FyZ3MgfQorCisgICAgcmV0dXJuIGV4dGVuc2lvbnMKKworIyByZWFkX3NldHVwX2ZpbGUgKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2V4dGVuc2lvbi5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9leHRlbnNpb24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNWE2MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9leHRlbnNpb24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2V4dGVuc2lvbi5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9leHRlbnNpb24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNjc4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9leHRlbnNpb24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZhbmN5X2dldG9wdC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZhbmN5X2dldG9wdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGVhOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmFuY3lfZ2V0b3B0LnB5CkBAIC0wLDAgKzEsNDg0IEBACisiIiJkaXN0dXRpbHMuZmFuY3lfZ2V0b3B0CisKK1dyYXBwZXIgYXJvdW5kIHRoZSBzdGFuZGFyZCBnZXRvcHQgbW9kdWxlIHRoYXQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZworYWRkaXRpb25hbCBmZWF0dXJlczoKKyAgKiBzaG9ydCBhbmQgbG9uZyBvcHRpb25zIGFyZSB0aWVkIHRvZ2V0aGVyCisgICogb3B0aW9ucyBoYXZlIGhlbHAgc3RyaW5ncywgc28gZmFuY3lfZ2V0b3B0IGNvdWxkIHBvdGVudGlhbGx5CisgICAgY3JlYXRlIGEgY29tcGxldGUgdXNhZ2Ugc3VtbWFyeQorICAqIG9wdGlvbnMgc2V0IGF0dHJpYnV0ZXMgb2YgYSBwYXNzZWQtaW4gb2JqZWN0CisiIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCByZQoraW1wb3J0IGdldG9wdAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNHZXRvcHRFcnJvciwgRGlzdHV0aWxzQXJnRXJyb3IKKworIyBNdWNoIGxpa2UgY29tbWFuZF9yZSBpbiBkaXN0dXRpbHMuY29yZSwgdGhpcyBpcyBjbG9zZSB0byBidXQgbm90IHF1aXRlCisjIHRoZSBzYW1lIGFzIGEgUHl0aG9uIE5BTUUgLS0gZXhjZXB0LCBpbiB0aGUgc3Bpcml0IG9mIG1vc3QgR05VCisjIHV0aWxpdGllcywgd2UgdXNlICctJyBpbiBwbGFjZSBvZiAnXycuICAoVGhlIHNwaXJpdCBvZiBMSVNQIGxpdmVzIG9uISkKKyMgVGhlIHNpbWlsYXJpdGllcyB0byBOQU1FIGFyZSBhZ2FpbiBub3QgYSBjb2luY2lkZW5jZS4uLgorbG9uZ29wdF9wYXQgPSByJ1thLXpBLVpdKD86W2EtekEtWjAtOS1dKiknCitsb25nb3B0X3JlID0gcmUuY29tcGlsZShyJ14lcyQnICUgbG9uZ29wdF9wYXQpCisKKyMgRm9yIHJlY29nbml6aW5nICJuZWdhdGl2ZSBhbGlhcyIgb3B0aW9ucywgZWcuICJxdWlldD0hdmVyYm9zZSIKK25lZ19hbGlhc19yZSA9IHJlLmNvbXBpbGUoIl4oJXMpPSEoJXMpJCIgJSAobG9uZ29wdF9wYXQsIGxvbmdvcHRfcGF0KSkKKworIyBUaGlzIGlzIHVzZWQgdG8gdHJhbnNsYXRlIGxvbmcgb3B0aW9ucyB0byBsZWdpdGltYXRlIFB5dGhvbiBpZGVudGlmaWVycworIyAoZm9yIHVzZSBhcyBhdHRyaWJ1dGVzIG9mIHNvbWUgb2JqZWN0KS4KK2xvbmdvcHRfeGxhdGUgPSBzdHJpbmcubWFrZXRyYW5zKCctJywgJ18nKQorCitjbGFzcyBGYW5jeUdldG9wdDoKKyAgICAiIiJXcmFwcGVyIGFyb3VuZCB0aGUgc3RhbmRhcmQgJ2dldG9wdCgpJyBtb2R1bGUgdGhhdCBwcm92aWRlcyBzb21lCisgICAgaGFuZHkgZXh0cmEgZnVuY3Rpb25hbGl0eToKKyAgICAgICogc2hvcnQgYW5kIGxvbmcgb3B0aW9ucyBhcmUgdGllZCB0b2dldGhlcgorICAgICAgKiBvcHRpb25zIGhhdmUgaGVscCBzdHJpbmdzLCBhbmQgaGVscCB0ZXh0IGNhbiBiZSBhc3NlbWJsZWQKKyAgICAgICAgZnJvbSB0aGVtCisgICAgICAqIG9wdGlvbnMgc2V0IGF0dHJpYnV0ZXMgb2YgYSBwYXNzZWQtaW4gb2JqZWN0CisgICAgICAqIGJvb2xlYW4gb3B0aW9ucyBjYW4gaGF2ZSAibmVnYXRpdmUgYWxpYXNlcyIgLS0gZWcuIGlmCisgICAgICAgIC0tcXVpZXQgaXMgdGhlICJuZWdhdGl2ZSBhbGlhcyIgb2YgLS12ZXJib3NlLCB0aGVuICItLXF1aWV0IgorICAgICAgICBvbiB0aGUgY29tbWFuZCBsaW5lIHNldHMgJ3ZlcmJvc2UnIHRvIGZhbHNlCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIG9wdGlvbl90YWJsZT1Ob25lKToKKworICAgICAgICAjIFRoZSBvcHRpb24gdGFibGUgaXMgKGN1cnJlbnRseSkgYSBsaXN0IG9mIHR1cGxlcy4gIFRoZQorICAgICAgICAjIHR1cGxlcyBtYXkgaGF2ZSAzIG9yIGZvdXIgdmFsdWVzOgorICAgICAgICAjICAgKGxvbmdfb3B0aW9uLCBzaG9ydF9vcHRpb24sIGhlbHBfc3RyaW5nIFssIHJlcGVhdGFibGVdKQorICAgICAgICAjIGlmIGFuIG9wdGlvbiB0YWtlcyBhbiBhcmd1bWVudCwgaXRzIGxvbmdfb3B0aW9uIHNob3VsZCBoYXZlICc9JworICAgICAgICAjIGFwcGVuZGVkOyBzaG9ydF9vcHRpb24gc2hvdWxkIGp1c3QgYmUgYSBzaW5nbGUgY2hhcmFjdGVyLCBubyAnOicKKyAgICAgICAgIyBpbiBhbnkgY2FzZS4gIElmIGEgbG9uZ19vcHRpb24gZG9lc24ndCBoYXZlIGEgY29ycmVzcG9uZGluZworICAgICAgICAjIHNob3J0X29wdGlvbiwgc2hvcnRfb3B0aW9uIHNob3VsZCBiZSBOb25lLiAgQWxsIG9wdGlvbiB0dXBsZXMKKyAgICAgICAgIyBtdXN0IGhhdmUgbG9uZyBvcHRpb25zLgorICAgICAgICBzZWxmLm9wdGlvbl90YWJsZSA9IG9wdGlvbl90YWJsZQorCisgICAgICAgICMgJ29wdGlvbl9pbmRleCcgbWFwcyBsb25nIG9wdGlvbiBuYW1lcyB0byBlbnRyaWVzIGluIHRoZSBvcHRpb24KKyAgICAgICAgIyB0YWJsZSAoaWUuIHRob3NlIDMtdHVwbGVzKS4KKyAgICAgICAgc2VsZi5vcHRpb25faW5kZXggPSB7fQorICAgICAgICBpZiBzZWxmLm9wdGlvbl90YWJsZToKKyAgICAgICAgICAgIHNlbGYuX2J1aWxkX2luZGV4KCkKKworICAgICAgICAjICdhbGlhcycgcmVjb3JkcyAoZHVoKSBhbGlhcyBvcHRpb25zOyB7J2Zvbyc6ICdiYXInfSBtZWFucworICAgICAgICAjIC0tZm9vIGlzIGFuIGFsaWFzIGZvciAtLWJhcgorICAgICAgICBzZWxmLmFsaWFzID0ge30KKworICAgICAgICAjICduZWdhdGl2ZV9hbGlhcycga2VlcHMgdHJhY2sgb2Ygb3B0aW9ucyB0aGF0IGFyZSB0aGUgYm9vbGVhbgorICAgICAgICAjIG9wcG9zaXRlIG9mIHNvbWUgb3RoZXIgb3B0aW9uCisgICAgICAgIHNlbGYubmVnYXRpdmVfYWxpYXMgPSB7fQorCisgICAgICAgICMgVGhlc2Uga2VlcCB0cmFjayBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIG9wdGlvbiB0YWJsZS4gIFdlCisgICAgICAgICMgZG9uJ3QgYWN0dWFsbHkgcG9wdWxhdGUgdGhlc2Ugc3RydWN0dXJlcyB1bnRpbCB3ZSdyZSByZWFkeSB0bworICAgICAgICAjIHBhcnNlIHRoZSBjb21tYW5kLWxpbmUsIHNpbmNlIHRoZSAnb3B0aW9uX3RhYmxlJyBwYXNzZWQgaW4gaGVyZQorICAgICAgICAjIGlzbid0IG5lY2Vzc2FyaWx5IHRoZSBmaW5hbCB3b3JkLgorICAgICAgICBzZWxmLnNob3J0X29wdHMgPSBbXQorICAgICAgICBzZWxmLmxvbmdfb3B0cyA9IFtdCisgICAgICAgIHNlbGYuc2hvcnQybG9uZyA9IHt9CisgICAgICAgIHNlbGYuYXR0cl9uYW1lID0ge30KKyAgICAgICAgc2VsZi50YWtlc19hcmcgPSB7fQorCisgICAgICAgICMgQW5kICdvcHRpb25fb3JkZXInIGlzIGZpbGxlZCB1cCBpbiAnZ2V0b3B0KCknOyBpdCByZWNvcmRzIHRoZQorICAgICAgICAjIG9yaWdpbmFsIG9yZGVyIG9mIG9wdGlvbnMgKGFuZCB0aGVpciB2YWx1ZXMpIG9uIHRoZSBjb21tYW5kLWxpbmUsCisgICAgICAgICMgYnV0IGV4cGFuZHMgc2hvcnQgb3B0aW9ucywgY29udmVydHMgYWxpYXNlcywgZXRjLgorICAgICAgICBzZWxmLm9wdGlvbl9vcmRlciA9IFtdCisKKyAgICAjIF9faW5pdF9fICgpCisKKworICAgIGRlZiBfYnVpbGRfaW5kZXggKHNlbGYpOgorICAgICAgICBzZWxmLm9wdGlvbl9pbmRleC5jbGVhcigpCisgICAgICAgIGZvciBvcHRpb24gaW4gc2VsZi5vcHRpb25fdGFibGU6CisgICAgICAgICAgICBzZWxmLm9wdGlvbl9pbmRleFtvcHRpb25bMF1dID0gb3B0aW9uCisKKyAgICBkZWYgc2V0X29wdGlvbl90YWJsZSAoc2VsZiwgb3B0aW9uX3RhYmxlKToKKyAgICAgICAgc2VsZi5vcHRpb25fdGFibGUgPSBvcHRpb25fdGFibGUKKyAgICAgICAgc2VsZi5fYnVpbGRfaW5kZXgoKQorCisgICAgZGVmIGFkZF9vcHRpb24gKHNlbGYsIGxvbmdfb3B0aW9uLCBzaG9ydF9vcHRpb249Tm9uZSwgaGVscF9zdHJpbmc9Tm9uZSk6CisgICAgICAgIGlmIGxvbmdfb3B0aW9uIGluIHNlbGYub3B0aW9uX2luZGV4OgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzR2V0b3B0RXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICJvcHRpb24gY29uZmxpY3Q6IGFscmVhZHkgYW4gb3B0aW9uICclcyciICUgbG9uZ19vcHRpb24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wdGlvbiA9IChsb25nX29wdGlvbiwgc2hvcnRfb3B0aW9uLCBoZWxwX3N0cmluZykKKyAgICAgICAgICAgIHNlbGYub3B0aW9uX3RhYmxlLmFwcGVuZChvcHRpb24pCisgICAgICAgICAgICBzZWxmLm9wdGlvbl9pbmRleFtsb25nX29wdGlvbl0gPSBvcHRpb24KKworCisgICAgZGVmIGhhc19vcHRpb24gKHNlbGYsIGxvbmdfb3B0aW9uKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9wdGlvbiB0YWJsZSBmb3IgdGhpcyBwYXJzZXIgaGFzIGFuCisgICAgICAgIG9wdGlvbiB3aXRoIGxvbmcgbmFtZSAnbG9uZ19vcHRpb24nLiIiIgorICAgICAgICByZXR1cm4gbG9uZ19vcHRpb24gaW4gc2VsZi5vcHRpb25faW5kZXgKKworICAgIGRlZiBnZXRfYXR0cl9uYW1lIChzZWxmLCBsb25nX29wdGlvbik6CisgICAgICAgICIiIlRyYW5zbGF0ZSBsb25nIG9wdGlvbiBuYW1lICdsb25nX29wdGlvbicgdG8gdGhlIGZvcm0gaXQKKyAgICAgICAgaGFzIGFzIGFuIGF0dHJpYnV0ZSBvZiBzb21lIG9iamVjdDogaWUuLCB0cmFuc2xhdGUgaHlwaGVucworICAgICAgICB0byB1bmRlcnNjb3Jlcy4iIiIKKyAgICAgICAgcmV0dXJuIHN0cmluZy50cmFuc2xhdGUobG9uZ19vcHRpb24sIGxvbmdvcHRfeGxhdGUpCisKKworICAgIGRlZiBfY2hlY2tfYWxpYXNfZGljdCAoc2VsZiwgYWxpYXNlcywgd2hhdCk6CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGFsaWFzZXMsIGRpY3QpCisgICAgICAgIGZvciAoYWxpYXMsIG9wdCkgaW4gYWxpYXNlcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgYWxpYXMgbm90IGluIHNlbGYub3B0aW9uX2luZGV4OgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0dldG9wdEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKCJpbnZhbGlkICVzICclcyc6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiAnJXMnIG5vdCBkZWZpbmVkIikgJSAod2hhdCwgYWxpYXMsIGFsaWFzKQorICAgICAgICAgICAgaWYgb3B0IG5vdCBpbiBzZWxmLm9wdGlvbl9pbmRleDoKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNHZXRvcHRFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICgiaW52YWxpZCAlcyAnJXMnOiAiCisgICAgICAgICAgICAgICAgICAgICAgICJhbGlhc2VkIG9wdGlvbiAnJXMnIG5vdCBkZWZpbmVkIikgJSAod2hhdCwgYWxpYXMsIG9wdCkKKworICAgIGRlZiBzZXRfYWxpYXNlcyAoc2VsZiwgYWxpYXMpOgorICAgICAgICAiIiJTZXQgdGhlIGFsaWFzZXMgZm9yIHRoaXMgb3B0aW9uIHBhcnNlci4iIiIKKyAgICAgICAgc2VsZi5fY2hlY2tfYWxpYXNfZGljdChhbGlhcywgImFsaWFzIikKKyAgICAgICAgc2VsZi5hbGlhcyA9IGFsaWFzCisKKyAgICBkZWYgc2V0X25lZ2F0aXZlX2FsaWFzZXMgKHNlbGYsIG5lZ2F0aXZlX2FsaWFzKToKKyAgICAgICAgIiIiU2V0IHRoZSBuZWdhdGl2ZSBhbGlhc2VzIGZvciB0aGlzIG9wdGlvbiBwYXJzZXIuCisgICAgICAgICduZWdhdGl2ZV9hbGlhcycgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBtYXBwaW5nIG9wdGlvbiBuYW1lcyB0bworICAgICAgICBvcHRpb24gbmFtZXMsIGJvdGggdGhlIGtleSBhbmQgdmFsdWUgbXVzdCBhbHJlYWR5IGJlIGRlZmluZWQKKyAgICAgICAgaW4gdGhlIG9wdGlvbiB0YWJsZS4iIiIKKyAgICAgICAgc2VsZi5fY2hlY2tfYWxpYXNfZGljdChuZWdhdGl2ZV9hbGlhcywgIm5lZ2F0aXZlIGFsaWFzIikKKyAgICAgICAgc2VsZi5uZWdhdGl2ZV9hbGlhcyA9IG5lZ2F0aXZlX2FsaWFzCisKKworICAgIGRlZiBfZ3Jva19vcHRpb25fdGFibGUgKHNlbGYpOgorICAgICAgICAiIiJQb3B1bGF0ZSB0aGUgdmFyaW91cyBkYXRhIHN0cnVjdHVyZXMgdGhhdCBrZWVwIHRhYnMgb24gdGhlCisgICAgICAgIG9wdGlvbiB0YWJsZS4gIENhbGxlZCBieSAnZ2V0b3B0KCknIGJlZm9yZSBpdCBjYW4gZG8gYW55dGhpbmcKKyAgICAgICAgd29ydGh3aGlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubG9uZ19vcHRzID0gW10KKyAgICAgICAgc2VsZi5zaG9ydF9vcHRzID0gW10KKyAgICAgICAgc2VsZi5zaG9ydDJsb25nLmNsZWFyKCkKKyAgICAgICAgc2VsZi5yZXBlYXQgPSB7fQorCisgICAgICAgIGZvciBvcHRpb24gaW4gc2VsZi5vcHRpb25fdGFibGU6CisgICAgICAgICAgICBpZiBsZW4ob3B0aW9uKSA9PSAzOgorICAgICAgICAgICAgICAgIGxvbmcsIHNob3J0LCBoZWxwID0gb3B0aW9uCisgICAgICAgICAgICAgICAgcmVwZWF0ID0gMAorICAgICAgICAgICAgZWxpZiBsZW4ob3B0aW9uKSA9PSA0OgorICAgICAgICAgICAgICAgIGxvbmcsIHNob3J0LCBoZWxwLCByZXBlYXQgPSBvcHRpb24KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyB0aGUgb3B0aW9uIHRhYmxlIGlzIHBhcnQgb2YgdGhlIGNvZGUsIHNvIHNpbXBseQorICAgICAgICAgICAgICAgICMgYXNzZXJ0IHRoYXQgaXQgaXMgY29ycmVjdAorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJpbnZhbGlkIG9wdGlvbiB0dXBsZTogJXIiICUgKG9wdGlvbiwpCisKKyAgICAgICAgICAgICMgVHlwZS0gYW5kIHZhbHVlLWNoZWNrIHRoZSBvcHRpb24gbmFtZXMKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGxvbmcsIHN0cikgb3IgbGVuKGxvbmcpIDwgMjoKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNHZXRvcHRFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICgiaW52YWxpZCBsb25nIG9wdGlvbiAnJXMnOiAiCisgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGEgc3RyaW5nIG9mIGxlbmd0aCA+PSAyIikgJSBsb25nCisKKyAgICAgICAgICAgIGlmIChub3QgKChzaG9ydCBpcyBOb25lKSBvcgorICAgICAgICAgICAgICAgICAgICAgKGlzaW5zdGFuY2Uoc2hvcnQsIHN0cikgYW5kIGxlbihzaG9ydCkgPT0gMSkpKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNHZXRvcHRFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICgiaW52YWxpZCBzaG9ydCBvcHRpb24gJyVzJzogIgorICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBhIHNpbmdsZSBjaGFyYWN0ZXIgb3IgTm9uZSIpICUgc2hvcnQKKworICAgICAgICAgICAgc2VsZi5yZXBlYXRbbG9uZ10gPSByZXBlYXQKKyAgICAgICAgICAgIHNlbGYubG9uZ19vcHRzLmFwcGVuZChsb25nKQorCisgICAgICAgICAgICBpZiBsb25nWy0xXSA9PSAnPSc6ICAgICAgICAgICAgICMgb3B0aW9uIHRha2VzIGFuIGFyZ3VtZW50PworICAgICAgICAgICAgICAgIGlmIHNob3J0OiBzaG9ydCA9IHNob3J0ICsgJzonCisgICAgICAgICAgICAgICAgbG9uZyA9IGxvbmdbMDotMV0KKyAgICAgICAgICAgICAgICBzZWxmLnRha2VzX2FyZ1tsb25nXSA9IDEKKyAgICAgICAgICAgIGVsc2U6CisKKyAgICAgICAgICAgICAgICAjIElzIG9wdGlvbiBpcyBhICJuZWdhdGl2ZSBhbGlhcyIgZm9yIHNvbWUgb3RoZXIgb3B0aW9uIChlZy4KKyAgICAgICAgICAgICAgICAjICJxdWlldCIgPT0gIiF2ZXJib3NlIik/CisgICAgICAgICAgICAgICAgYWxpYXNfdG8gPSBzZWxmLm5lZ2F0aXZlX2FsaWFzLmdldChsb25nKQorICAgICAgICAgICAgICAgIGlmIGFsaWFzX3RvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRha2VzX2FyZ1thbGlhc190b106CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNHZXRvcHRFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJpbnZhbGlkIG5lZ2F0aXZlIGFsaWFzICclcyc6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxpYXNlZCBvcHRpb24gJyVzJyB0YWtlcyBhIHZhbHVlIikgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcsIGFsaWFzX3RvKQorCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9uZ19vcHRzWy0xXSA9IGxvbmcgIyBYWFggcmVkdW5kYW50PyEKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YWtlc19hcmdbbG9uZ10gPSAwCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRha2VzX2FyZ1tsb25nXSA9IDAKKworICAgICAgICAgICAgIyBJZiB0aGlzIGlzIGFuIGFsaWFzIG9wdGlvbiwgbWFrZSBzdXJlIGl0cyAidGFrZXMgYXJnIiBmbGFnIGlzCisgICAgICAgICAgICAjIHRoZSBzYW1lIGFzIHRoZSBvcHRpb24gaXQncyBhbGlhc2VkIHRvLgorICAgICAgICAgICAgYWxpYXNfdG8gPSBzZWxmLmFsaWFzLmdldChsb25nKQorICAgICAgICAgICAgaWYgYWxpYXNfdG8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgc2VsZi50YWtlc19hcmdbbG9uZ10gIT0gc2VsZi50YWtlc19hcmdbYWxpYXNfdG9dOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNHZXRvcHRFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoImludmFsaWQgYWxpYXMgJyVzJzogaW5jb25zaXN0ZW50IHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsaWFzZWQgb3B0aW9uICclcycgKG9uZSBvZiB0aGVtIHRha2VzIGEgdmFsdWUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgb3RoZXIgZG9lc24ndCIpICUgKGxvbmcsIGFsaWFzX3RvKQorCisKKyAgICAgICAgICAgICMgTm93IGVuZm9yY2Ugc29tZSBib25kYWdlIG9uIHRoZSBsb25nIG9wdGlvbiBuYW1lLCBzbyB3ZSBjYW4KKyAgICAgICAgICAgICMgbGF0ZXIgdHJhbnNsYXRlIGl0IHRvIGFuIGF0dHJpYnV0ZSBuYW1lIG9uIHNvbWUgb2JqZWN0LiAgSGF2ZQorICAgICAgICAgICAgIyB0byBkbyB0aGlzIGEgYml0IGxhdGUgdG8gbWFrZSBzdXJlIHdlJ3ZlIHJlbW92ZWQgYW55IHRyYWlsaW5nCisgICAgICAgICAgICAjICc9Jy4KKyAgICAgICAgICAgIGlmIG5vdCBsb25nb3B0X3JlLm1hdGNoKGxvbmcpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0dldG9wdEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKCJpbnZhbGlkIGxvbmcgb3B0aW9uIG5hbWUgJyVzJyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIihtdXN0IGJlIGxldHRlcnMsIG51bWJlcnMsIGh5cGhlbnMgb25seSIpICUgbG9uZworCisgICAgICAgICAgICBzZWxmLmF0dHJfbmFtZVtsb25nXSA9IHNlbGYuZ2V0X2F0dHJfbmFtZShsb25nKQorICAgICAgICAgICAgaWYgc2hvcnQ6CisgICAgICAgICAgICAgICAgc2VsZi5zaG9ydF9vcHRzLmFwcGVuZChzaG9ydCkKKyAgICAgICAgICAgICAgICBzZWxmLnNob3J0Mmxvbmdbc2hvcnRbMF1dID0gbG9uZworCisgICAgICAgICMgZm9yIG9wdGlvbl90YWJsZQorCisgICAgIyBfZ3Jva19vcHRpb25fdGFibGUoKQorCisKKyAgICBkZWYgZ2V0b3B0IChzZWxmLCBhcmdzPU5vbmUsIG9iamVjdD1Ob25lKToKKyAgICAgICAgIiIiUGFyc2UgY29tbWFuZC1saW5lIG9wdGlvbnMgaW4gYXJncy4gU3RvcmUgYXMgYXR0cmlidXRlcyBvbiBvYmplY3QuCisKKyAgICAgICAgSWYgJ2FyZ3MnIGlzIE5vbmUgb3Igbm90IHN1cHBsaWVkLCB1c2VzICdzeXMuYXJndlsxOl0nLiAgSWYKKyAgICAgICAgJ29iamVjdCcgaXMgTm9uZSBvciBub3Qgc3VwcGxpZWQsIGNyZWF0ZXMgYSBuZXcgT3B0aW9uRHVtbXkKKyAgICAgICAgb2JqZWN0LCBzdG9yZXMgb3B0aW9uIHZhbHVlcyB0aGVyZSwgYW5kIHJldHVybnMgYSB0dXBsZSAoYXJncywKKyAgICAgICAgb2JqZWN0KS4gIElmICdvYmplY3QnIGlzIHN1cHBsaWVkLCBpdCBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQKKyAgICAgICAgJ2dldG9wdCgpJyBqdXN0IHJldHVybnMgJ2FyZ3MnOyBpbiBib3RoIGNhc2VzLCB0aGUgcmV0dXJuZWQKKyAgICAgICAgJ2FyZ3MnIGlzIGEgbW9kaWZpZWQgY29weSBvZiB0aGUgcGFzc2VkLWluICdhcmdzJyBsaXN0LCB3aGljaAorICAgICAgICBpcyBsZWZ0IHVudG91Y2hlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGFyZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKyAgICAgICAgaWYgb2JqZWN0IGlzIE5vbmU6CisgICAgICAgICAgICBvYmplY3QgPSBPcHRpb25EdW1teSgpCisgICAgICAgICAgICBjcmVhdGVkX29iamVjdCA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNyZWF0ZWRfb2JqZWN0ID0gMAorCisgICAgICAgIHNlbGYuX2dyb2tfb3B0aW9uX3RhYmxlKCkKKworICAgICAgICBzaG9ydF9vcHRzID0gc3RyaW5nLmpvaW4oc2VsZi5zaG9ydF9vcHRzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmdzLCBzaG9ydF9vcHRzLCBzZWxmLmxvbmdfb3B0cykKKyAgICAgICAgZXhjZXB0IGdldG9wdC5lcnJvciwgbXNnOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IsIG1zZworCisgICAgICAgIGZvciBvcHQsIHZhbCBpbiBvcHRzOgorICAgICAgICAgICAgaWYgbGVuKG9wdCkgPT0gMiBhbmQgb3B0WzBdID09ICctJzogIyBpdCdzIGEgc2hvcnQgb3B0aW9uCisgICAgICAgICAgICAgICAgb3B0ID0gc2VsZi5zaG9ydDJsb25nW29wdFsxXV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGxlbihvcHQpID4gMiBhbmQgb3B0WzoyXSA9PSAnLS0nCisgICAgICAgICAgICAgICAgb3B0ID0gb3B0WzI6XQorCisgICAgICAgICAgICBhbGlhcyA9IHNlbGYuYWxpYXMuZ2V0KG9wdCkKKyAgICAgICAgICAgIGlmIGFsaWFzOgorICAgICAgICAgICAgICAgIG9wdCA9IGFsaWFzCisKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRha2VzX2FyZ1tvcHRdOiAgICAgIyBib29sZWFuIG9wdGlvbj8KKyAgICAgICAgICAgICAgICBhc3NlcnQgdmFsID09ICcnLCAiYm9vbGVhbiBvcHRpb24gY2FuJ3QgaGF2ZSB2YWx1ZSIKKyAgICAgICAgICAgICAgICBhbGlhcyA9IHNlbGYubmVnYXRpdmVfYWxpYXMuZ2V0KG9wdCkKKyAgICAgICAgICAgICAgICBpZiBhbGlhczoKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gYWxpYXMKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gMAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IDEKKworICAgICAgICAgICAgYXR0ciA9IHNlbGYuYXR0cl9uYW1lW29wdF0KKyAgICAgICAgICAgICMgVGhlIG9ubHkgcmVwZWF0aW5nIG9wdGlvbiBhdCB0aGUgbW9tZW50IGlzICd2ZXJib3NlJy4KKyAgICAgICAgICAgICMgSXQgaGFzIGEgbmVnYXRpdmUgb3B0aW9uIC1xIHF1aWV0LCB3aGljaCBzaG91bGQgc2V0IHZlcmJvc2UgPSAwLgorICAgICAgICAgICAgaWYgdmFsIGFuZCBzZWxmLnJlcGVhdC5nZXQoYXR0cikgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgdmFsID0gZ2V0YXR0cihvYmplY3QsIGF0dHIsIDApICsgMQorICAgICAgICAgICAgc2V0YXR0cihvYmplY3QsIGF0dHIsIHZhbCkKKyAgICAgICAgICAgIHNlbGYub3B0aW9uX29yZGVyLmFwcGVuZCgob3B0LCB2YWwpKQorCisgICAgICAgICMgZm9yIG9wdHMKKyAgICAgICAgaWYgY3JlYXRlZF9vYmplY3Q6CisgICAgICAgICAgICByZXR1cm4gYXJncywgb2JqZWN0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gYXJncworCisgICAgIyBnZXRvcHQoKQorCisKKyAgICBkZWYgZ2V0X29wdGlvbl9vcmRlciAoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdGhlIGxpc3Qgb2YgKG9wdGlvbiwgdmFsdWUpIHR1cGxlcyBwcm9jZXNzZWQgYnkgdGhlCisgICAgICAgIHByZXZpb3VzIHJ1biBvZiAnZ2V0b3B0KCknLiAgUmFpc2VzIFJ1bnRpbWVFcnJvciBpZgorICAgICAgICAnZ2V0b3B0KCknIGhhc24ndCBiZWVuIGNhbGxlZCB5ZXQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLm9wdGlvbl9vcmRlciBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiJ2dldG9wdCgpJyBoYXNuJ3QgYmVlbiBjYWxsZWQgeWV0IgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYub3B0aW9uX29yZGVyCisKKworICAgIGRlZiBnZW5lcmF0ZV9oZWxwIChzZWxmLCBoZWFkZXI9Tm9uZSk6CisgICAgICAgICIiIkdlbmVyYXRlIGhlbHAgdGV4dCAoYSBsaXN0IG9mIHN0cmluZ3MsIG9uZSBwZXIgc3VnZ2VzdGVkIGxpbmUgb2YKKyAgICAgICAgb3V0cHV0KSBmcm9tIHRoZSBvcHRpb24gdGFibGUgZm9yIHRoaXMgRmFuY3lHZXRvcHQgb2JqZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgIyBCbGl0aGVseSBhc3N1bWUgdGhlIG9wdGlvbiB0YWJsZSBpcyBnb29kOiBwcm9iYWJseSB3b3VsZG4ndCBjYWxsCisgICAgICAgICMgJ2dlbmVyYXRlX2hlbHAoKScgdW5sZXNzIHlvdSd2ZSBhbHJlYWR5IGNhbGxlZCAnZ2V0b3B0KCknLgorCisgICAgICAgICMgRmlyc3QgcGFzczogZGV0ZXJtaW5lIG1heGltdW0gbGVuZ3RoIG9mIGxvbmcgb3B0aW9uIG5hbWVzCisgICAgICAgIG1heF9vcHQgPSAwCisgICAgICAgIGZvciBvcHRpb24gaW4gc2VsZi5vcHRpb25fdGFibGU6CisgICAgICAgICAgICBsb25nID0gb3B0aW9uWzBdCisgICAgICAgICAgICBzaG9ydCA9IG9wdGlvblsxXQorICAgICAgICAgICAgbCA9IGxlbihsb25nKQorICAgICAgICAgICAgaWYgbG9uZ1stMV0gPT0gJz0nOgorICAgICAgICAgICAgICAgIGwgPSBsIC0gMQorICAgICAgICAgICAgaWYgc2hvcnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbCA9IGwgKyA1ICAgICAgICAgICAgICAgICAgICMgIiAoLXgpIiB3aGVyZSBzaG9ydCA9PSAneCcKKyAgICAgICAgICAgIGlmIGwgPiBtYXhfb3B0OgorICAgICAgICAgICAgICAgIG1heF9vcHQgPSBsCisKKyAgICAgICAgb3B0X3dpZHRoID0gbWF4X29wdCArIDIgKyAyICsgMiAgICAgIyByb29tIGZvciBpbmRlbnQgKyBkYXNoZXMgKyBndXR0ZXIKKworICAgICAgICAjIFR5cGljYWwgaGVscCBibG9jayBsb29rcyBsaWtlIHRoaXM6CisgICAgICAgICMgICAtLWZvbyAgICAgICBjb250cm9scyBmb29uYWJ1bGF0aW9uCisgICAgICAgICMgSGVscCBibG9jayBmb3IgbG9uZ2VzdCBvcHRpb24gbG9va3MgbGlrZSB0aGlzOgorICAgICAgICAjICAgLS1mbGltZmxhbSAgc2V0IHRoZSBmbGltLWZsYW0gbGV2ZWwKKyAgICAgICAgIyBhbmQgd2l0aCB3cmFwcGVkIHRleHQ6CisgICAgICAgICMgICAtLWZsaW1mbGFtICBzZXQgdGhlIGZsaW0tZmxhbSBsZXZlbCAobXVzdCBiZSBiZXR3ZWVuCisgICAgICAgICMgICAgICAgICAgICAgICAwIGFuZCAxMDAsIGV4Y2VwdCBvbiBUdWVzZGF5cykKKyAgICAgICAgIyBPcHRpb25zIHdpdGggc2hvcnQgbmFtZXMgd2lsbCBoYXZlIHRoZSBzaG9ydCBuYW1lIHNob3duIChidXQKKyAgICAgICAgIyBpdCBkb2Vzbid0IGNvbnRyaWJ1dGUgdG8gbWF4X29wdCk6CisgICAgICAgICMgICAtLWZvbyAoLWYpICBjb250cm9scyBmb29uYWJ1bGF0aW9uCisgICAgICAgICMgSWYgYWRkaW5nIHRoZSBzaG9ydCBvcHRpb24gd291bGQgbWFrZSB0aGUgbGVmdCBjb2x1bW4gdG9vIHdpZGUsCisgICAgICAgICMgd2UgcHVzaCB0aGUgZXhwbGFuYXRpb24gb2ZmIHRvIHRoZSBuZXh0IGxpbmUKKyAgICAgICAgIyAgIC0tZmxpbWZsYW0gKC1sKQorICAgICAgICAjICAgICAgICAgICAgICAgc2V0IHRoZSBmbGltLWZsYW0gbGV2ZWwKKyAgICAgICAgIyBJbXBvcnRhbnQgcGFyYW1ldGVyczoKKyAgICAgICAgIyAgIC0gMiBzcGFjZXMgYmVmb3JlIG9wdGlvbiBibG9jayBzdGFydCBsaW5lcworICAgICAgICAjICAgLSAyIGRhc2hlcyBmb3IgZWFjaCBsb25nIG9wdGlvbiBuYW1lCisgICAgICAgICMgICAtIG1pbi4gMiBzcGFjZXMgYmV0d2VlbiBvcHRpb24gYW5kIGV4cGxhbmF0aW9uIChndXR0ZXIpCisgICAgICAgICMgICAtIDUgY2hhcmFjdGVycyAoaW5jbC4gc3BhY2UpIGZvciBzaG9ydCBvcHRpb24gbmFtZQorCisgICAgICAgICMgTm93IGdlbmVyYXRlIGxpbmVzIG9mIGhlbHAgdGV4dC4gIChJZiA4MCBjb2x1bW5zIHdlcmUgZ29vZCBlbm91Z2gKKyAgICAgICAgIyBmb3IgSmVzdXMsIHRoZW4gNzggY29sdW1ucyBhcmUgZ29vZCBlbm91Z2ggZm9yIG1lISkKKyAgICAgICAgbGluZV93aWR0aCA9IDc4CisgICAgICAgIHRleHRfd2lkdGggPSBsaW5lX3dpZHRoIC0gb3B0X3dpZHRoCisgICAgICAgIGJpZ19pbmRlbnQgPSAnICcgKiBvcHRfd2lkdGgKKyAgICAgICAgaWYgaGVhZGVyOgorICAgICAgICAgICAgbGluZXMgPSBbaGVhZGVyXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGluZXMgPSBbJ09wdGlvbiBzdW1tYXJ5OiddCisKKyAgICAgICAgZm9yIG9wdGlvbiBpbiBzZWxmLm9wdGlvbl90YWJsZToKKyAgICAgICAgICAgIGxvbmcsIHNob3J0LCBoZWxwID0gb3B0aW9uWzozXQorICAgICAgICAgICAgdGV4dCA9IHdyYXBfdGV4dChoZWxwLCB0ZXh0X3dpZHRoKQorICAgICAgICAgICAgaWYgbG9uZ1stMV0gPT0gJz0nOgorICAgICAgICAgICAgICAgIGxvbmcgPSBsb25nWzA6LTFdCisKKyAgICAgICAgICAgICMgQ2FzZSAxOiBubyBzaG9ydCBvcHRpb24gYXQgYWxsIChtYWtlcyBsaWZlIGVhc3kpCisgICAgICAgICAgICBpZiBzaG9ydCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIHRleHQ6CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiICAtLSUtKnMgICVzIiAlIChtYXhfb3B0LCBsb25nLCB0ZXh0WzBdKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoIiAgLS0lLSpzICAiICUgKG1heF9vcHQsIGxvbmcpKQorCisgICAgICAgICAgICAjIENhc2UgMjogd2UgaGF2ZSBhIHNob3J0IG9wdGlvbiwgc28gd2UgaGF2ZSB0byBpbmNsdWRlIGl0CisgICAgICAgICAgICAjIGp1c3QgYWZ0ZXIgdGhlIGxvbmcgb3B0aW9uCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9wdF9uYW1lcyA9ICIlcyAoLSVzKSIgJSAobG9uZywgc2hvcnQpCisgICAgICAgICAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCIgIC0tJS0qcyAgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXhfb3B0LCBvcHRfbmFtZXMsIHRleHRbMF0pKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiICAtLSUtKnMiICUgb3B0X25hbWVzKQorCisgICAgICAgICAgICBmb3IgbCBpbiB0ZXh0WzE6XToKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoYmlnX2luZGVudCArIGwpCisKKyAgICAgICAgIyBmb3Igc2VsZi5vcHRpb25fdGFibGUKKworICAgICAgICByZXR1cm4gbGluZXMKKworICAgICMgZ2VuZXJhdGVfaGVscCAoKQorCisgICAgZGVmIHByaW50X2hlbHAgKHNlbGYsIGhlYWRlcj1Ob25lLCBmaWxlPU5vbmUpOgorICAgICAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgICAgICBmaWxlID0gc3lzLnN0ZG91dAorICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmdlbmVyYXRlX2hlbHAoaGVhZGVyKToKKyAgICAgICAgICAgIGZpbGUud3JpdGUobGluZSArICJcbiIpCisKKyMgY2xhc3MgRmFuY3lHZXRvcHQKKworCitkZWYgZmFuY3lfZ2V0b3B0IChvcHRpb25zLCBuZWdhdGl2ZV9vcHQsIG9iamVjdCwgYXJncyk6CisgICAgcGFyc2VyID0gRmFuY3lHZXRvcHQob3B0aW9ucykKKyAgICBwYXJzZXIuc2V0X25lZ2F0aXZlX2FsaWFzZXMobmVnYXRpdmVfb3B0KQorICAgIHJldHVybiBwYXJzZXIuZ2V0b3B0KGFyZ3MsIG9iamVjdCkKKworCitXU19UUkFOUyA9IHN0cmluZy5tYWtldHJhbnMoc3RyaW5nLndoaXRlc3BhY2UsICcgJyAqIGxlbihzdHJpbmcud2hpdGVzcGFjZSkpCisKK2RlZiB3cmFwX3RleHQgKHRleHQsIHdpZHRoKToKKyAgICAiIiJ3cmFwX3RleHQodGV4dCA6IHN0cmluZywgd2lkdGggOiBpbnQpIC0+IFtzdHJpbmddCisKKyAgICBTcGxpdCAndGV4dCcgaW50byBtdWx0aXBsZSBsaW5lcyBvZiBubyBtb3JlIHRoYW4gJ3dpZHRoJyBjaGFyYWN0ZXJzCisgICAgZWFjaCwgYW5kIHJldHVybiB0aGUgbGlzdCBvZiBzdHJpbmdzIHRoYXQgcmVzdWx0cy4KKyAgICAiIiIKKworICAgIGlmIHRleHQgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIFtdCisgICAgaWYgbGVuKHRleHQpIDw9IHdpZHRoOgorICAgICAgICByZXR1cm4gW3RleHRdCisKKyAgICB0ZXh0ID0gc3RyaW5nLmV4cGFuZHRhYnModGV4dCkKKyAgICB0ZXh0ID0gc3RyaW5nLnRyYW5zbGF0ZSh0ZXh0LCBXU19UUkFOUykKKyAgICBjaHVua3MgPSByZS5zcGxpdChyJyggK3wtKyknLCB0ZXh0KQorICAgIGNodW5rcyA9IGZpbHRlcihOb25lLCBjaHVua3MpICAgICAgIyAnIC0gJyByZXN1bHRzIGluIGVtcHR5IHN0cmluZ3MKKyAgICBsaW5lcyA9IFtdCisKKyAgICB3aGlsZSBjaHVua3M6CisKKyAgICAgICAgY3VyX2xpbmUgPSBbXSAgICAgICAgICAgICAgICAgICAjIGxpc3Qgb2YgY2h1bmtzICh0by1iZS1qb2luZWQpCisgICAgICAgIGN1cl9sZW4gPSAwICAgICAgICAgICAgICAgICAgICAgIyBsZW5ndGggb2YgY3VycmVudCBsaW5lCisKKyAgICAgICAgd2hpbGUgY2h1bmtzOgorICAgICAgICAgICAgbCA9IGxlbihjaHVua3NbMF0pCisgICAgICAgICAgICBpZiBjdXJfbGVuICsgbCA8PSB3aWR0aDogICAgIyBjYW4gc3F1ZWV6ZSAoYXQgbGVhc3QpIHRoaXMgY2h1bmsgaW4KKyAgICAgICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQoY2h1bmtzWzBdKQorICAgICAgICAgICAgICAgIGRlbCBjaHVua3NbMF0KKyAgICAgICAgICAgICAgICBjdXJfbGVuID0gY3VyX2xlbiArIGwKKyAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAjIHRoaXMgbGluZSBpcyBmdWxsCisgICAgICAgICAgICAgICAgIyBkcm9wIGxhc3QgY2h1bmsgaWYgYWxsIHNwYWNlCisgICAgICAgICAgICAgICAgaWYgY3VyX2xpbmUgYW5kIGN1cl9saW5lWy0xXVswXSA9PSAnICc6CisgICAgICAgICAgICAgICAgICAgIGRlbCBjdXJfbGluZVstMV0KKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIGlmIGNodW5rczogICAgICAgICAgICAgICAgICAgICAgIyBhbnkgY2h1bmtzIGxlZnQgdG8gcHJvY2Vzcz8KKworICAgICAgICAgICAgIyBpZiB0aGUgY3VycmVudCBsaW5lIGlzIHN0aWxsIGVtcHR5LCB0aGVuIHdlIGhhZCBhIHNpbmdsZQorICAgICAgICAgICAgIyBjaHVuayB0aGF0J3MgdG9vIGJpZyB0b28gZml0IG9uIGEgbGluZSAtLSBzbyB3ZSBicmVhaworICAgICAgICAgICAgIyBkb3duIGFuZCBicmVhayBpdCB1cCBhdCB0aGUgbGluZSB3aWR0aAorICAgICAgICAgICAgaWYgY3VyX2xlbiA9PSAwOgorICAgICAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChjaHVua3NbMF1bMDp3aWR0aF0pCisgICAgICAgICAgICAgICAgY2h1bmtzWzBdID0gY2h1bmtzWzBdW3dpZHRoOl0KKworICAgICAgICAgICAgIyBhbGwtd2hpdGVzcGFjZSBjaHVua3MgYXQgdGhlIGVuZCBvZiBhIGxpbmUgY2FuIGJlIGRpc2NhcmRlZAorICAgICAgICAgICAgIyAoYW5kIHdlIGtub3cgZnJvbSB0aGUgcmUuc3BsaXQgYWJvdmUgdGhhdCBpZiBhIGNodW5rIGhhcworICAgICAgICAgICAgIyAqYW55KiB3aGl0ZXNwYWNlLCBpdCBpcyAqYWxsKiB3aGl0ZXNwYWNlKQorICAgICAgICAgICAgaWYgY2h1bmtzWzBdWzBdID09ICcgJzoKKyAgICAgICAgICAgICAgICBkZWwgY2h1bmtzWzBdCisKKyAgICAgICAgIyBhbmQgc3RvcmUgdGhpcyBsaW5lIGluIHRoZSBsaXN0LW9mLWFsbC1saW5lcyAtLSBhcyBhIHNpbmdsZQorICAgICAgICAjIHN0cmluZywgb2YgY291cnNlIQorICAgICAgICBsaW5lcy5hcHBlbmQoc3RyaW5nLmpvaW4oY3VyX2xpbmUsICcnKSkKKworICAgICMgd2hpbGUgY2h1bmtzCisKKyAgICByZXR1cm4gbGluZXMKKworCitkZWYgdHJhbnNsYXRlX2xvbmdvcHQob3B0KToKKyAgICAiIiJDb252ZXJ0IGEgbG9uZyBvcHRpb24gbmFtZSB0byBhIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVyIGJ5CisgICAgY2hhbmdpbmcgIi0iIHRvICJfIi4KKyAgICAiIiIKKyAgICByZXR1cm4gc3RyaW5nLnRyYW5zbGF0ZShvcHQsIGxvbmdvcHRfeGxhdGUpCisKKworY2xhc3MgT3B0aW9uRHVtbXk6CisgICAgIiIiRHVtbXkgY2xhc3MganVzdCB1c2VkIGFzIGEgcGxhY2UgdG8gaG9sZCBjb21tYW5kLWxpbmUgb3B0aW9uCisgICAgdmFsdWVzIGFzIGluc3RhbmNlIGF0dHJpYnV0ZXMuIiIiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIG9wdGlvbnM9W10pOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgT3B0aW9uRHVtbXkgaW5zdGFuY2UuICBUaGUgYXR0cmlidXRlcyBsaXN0ZWQgaW4KKyAgICAgICAgJ29wdGlvbnMnIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdG8gTm9uZS4iIiIKKyAgICAgICAgZm9yIG9wdCBpbiBvcHRpb25zOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBvcHQsIE5vbmUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9mYW5jeV9nZXRvcHQucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmFuY3lfZ2V0b3B0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDNmOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmFuY3lfZ2V0b3B0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9mYW5jeV9nZXRvcHQucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmFuY3lfZ2V0b3B0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWEzZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmFuY3lfZ2V0b3B0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9maWxlX3V0aWwucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9maWxlX3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmMDc4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVfdXRpbC5weQpAQCAtMCwwICsxLDIzMSBAQAorIiIiZGlzdHV0aWxzLmZpbGVfdXRpbAorCitVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igb3BlcmF0aW5nIG9uIHNpbmdsZSBmaWxlcy4KKyIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0ZpbGVFcnJvcgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCisjIGZvciBnZW5lcmF0aW5nIHZlcmJvc2Ugb3V0cHV0IGluICdjb3B5X2ZpbGUoKScKK19jb3B5X2FjdGlvbiA9IHtOb25lOiAnY29weWluZycsCisgICAgICAgICAgICAgICAgJ2hhcmQnOiAnaGFyZCBsaW5raW5nJywKKyAgICAgICAgICAgICAgICAnc3ltJzogJ3N5bWJvbGljYWxseSBsaW5raW5nJ30KKworCitkZWYgX2NvcHlfZmlsZV9jb250ZW50cyhzcmMsIGRzdCwgYnVmZmVyX3NpemU9MTYqMTAyNCk6CisgICAgIiIiQ29weSB0aGUgZmlsZSAnc3JjJyB0byAnZHN0Jy4KKworICAgIEJvdGggbXVzdCBiZSBmaWxlbmFtZXMuIEFueSBlcnJvciBvcGVuaW5nIGVpdGhlciBmaWxlLCByZWFkaW5nIGZyb20KKyAgICAnc3JjJywgb3Igd3JpdGluZyB0byAnZHN0JywgcmFpc2VzIERpc3R1dGlsc0ZpbGVFcnJvci4gIERhdGEgaXMKKyAgICByZWFkL3dyaXR0ZW4gaW4gY2h1bmtzIG9mICdidWZmZXJfc2l6ZScgYnl0ZXMgKGRlZmF1bHQgMTZrKS4gIE5vIGF0dGVtcHQKKyAgICBpcyBtYWRlIHRvIGhhbmRsZSBhbnl0aGluZyBhcGFydCBmcm9tIHJlZ3VsYXIgZmlsZXMuCisgICAgIiIiCisgICAgIyBTdG9sZW4gZnJvbSBzaHV0aWwgbW9kdWxlIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LCBidXQgd2l0aAorICAgICMgY3VzdG9tIGVycm9yLWhhbmRsaW5nIGFkZGVkLgorICAgIGZzcmMgPSBOb25lCisgICAgZmRzdCA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZzcmMgPSBvcGVuKHNyYywgJ3JiJykKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yLCAoZXJybm8sIGVycnN0cik6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoImNvdWxkIG5vdCBvcGVuICclcyc6ICVzIiAlIChzcmMsIGVycnN0cikpCisKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHN0KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZHN0KQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yLCAoZXJybm8sIGVycnN0cik6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgZGVsZXRlICclcyc6ICVzIiAlIChkc3QsIGVycnN0cikpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmRzdCA9IG9wZW4oZHN0LCAnd2InKQorICAgICAgICBleGNlcHQgb3MuZXJyb3IsIChlcnJubywgZXJyc3RyKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICAgICAgICJjb3VsZCBub3QgY3JlYXRlICclcyc6ICVzIiAlIChkc3QsIGVycnN0cikpCisKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBidWYgPSBmc3JjLnJlYWQoYnVmZmVyX3NpemUpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3IsIChlcnJubywgZXJyc3RyKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCByZWFkIGZyb20gJyVzJzogJXMiICUgKHNyYywgZXJyc3RyKSkKKworICAgICAgICAgICAgaWYgbm90IGJ1ZjoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmRzdC53cml0ZShidWYpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3IsIChlcnJubywgZXJyc3RyKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCB3cml0ZSB0byAnJXMnOiAlcyIgJSAoZHN0LCBlcnJzdHIpKQorCisgICAgZmluYWxseToKKyAgICAgICAgaWYgZmRzdDoKKyAgICAgICAgICAgIGZkc3QuY2xvc2UoKQorICAgICAgICBpZiBmc3JjOgorICAgICAgICAgICAgZnNyYy5jbG9zZSgpCisKK2RlZiBjb3B5X2ZpbGUoc3JjLCBkc3QsIHByZXNlcnZlX21vZGU9MSwgcHJlc2VydmVfdGltZXM9MSwgdXBkYXRlPTAsCisgICAgICAgICAgICAgIGxpbms9Tm9uZSwgdmVyYm9zZT0xLCBkcnlfcnVuPTApOgorICAgICIiIkNvcHkgYSBmaWxlICdzcmMnIHRvICdkc3QnLgorCisgICAgSWYgJ2RzdCcgaXMgYSBkaXJlY3RvcnksIHRoZW4gJ3NyYycgaXMgY29waWVkIHRoZXJlIHdpdGggdGhlIHNhbWUgbmFtZTsKKyAgICBvdGhlcndpc2UsIGl0IG11c3QgYmUgYSBmaWxlbmFtZS4gIChJZiB0aGUgZmlsZSBleGlzdHMsIGl0IHdpbGwgYmUKKyAgICBydXRobGVzc2x5IGNsb2JiZXJlZC4pICBJZiAncHJlc2VydmVfbW9kZScgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLAorICAgIHRoZSBmaWxlJ3MgbW9kZSAodHlwZSBhbmQgcGVybWlzc2lvbiBiaXRzLCBvciB3aGF0ZXZlciBpcyBhbmFsb2dvdXMgb24KKyAgICB0aGUgY3VycmVudCBwbGF0Zm9ybSkgaXMgY29waWVkLiAgSWYgJ3ByZXNlcnZlX3RpbWVzJyBpcyB0cnVlICh0aGUKKyAgICBkZWZhdWx0KSwgdGhlIGxhc3QtbW9kaWZpZWQgYW5kIGxhc3QtYWNjZXNzIHRpbWVzIGFyZSBjb3BpZWQgYXMgd2VsbC4KKyAgICBJZiAndXBkYXRlJyBpcyB0cnVlLCAnc3JjJyB3aWxsIG9ubHkgYmUgY29waWVkIGlmICdkc3QnIGRvZXMgbm90IGV4aXN0LAorICAgIG9yIGlmICdkc3QnIGRvZXMgZXhpc3QgYnV0IGlzIG9sZGVyIHRoYW4gJ3NyYycuCisKKyAgICAnbGluaycgYWxsb3dzIHlvdSB0byBtYWtlIGhhcmQgbGlua3MgKG9zLmxpbmspIG9yIHN5bWJvbGljIGxpbmtzCisgICAgKG9zLnN5bWxpbmspIGluc3RlYWQgb2YgY29weWluZzogc2V0IGl0IHRvICJoYXJkIiBvciAic3ltIjsgaWYgaXQgaXMKKyAgICBOb25lICh0aGUgZGVmYXVsdCksIGZpbGVzIGFyZSBjb3BpZWQuICBEb24ndCBzZXQgJ2xpbmsnIG9uIHN5c3RlbXMgdGhhdAorICAgIGRvbid0IHN1cHBvcnQgaXQ6ICdjb3B5X2ZpbGUoKScgZG9lc24ndCBjaGVjayBpZiBoYXJkIG9yIHN5bWJvbGljCisgICAgbGlua2luZyBpcyBhdmFpbGFibGUuCisKKyAgICBVbmRlciBNYWMgT1MsIHVzZXMgdGhlIG5hdGl2ZSBmaWxlIGNvcHkgZnVuY3Rpb24gaW4gbWFjb3N0b29sczsgb24KKyAgICBvdGhlciBzeXN0ZW1zLCB1c2VzICdfY29weV9maWxlX2NvbnRlbnRzKCknIHRvIGNvcHkgZmlsZSBjb250ZW50cy4KKworICAgIFJldHVybiBhIHR1cGxlIChkZXN0X25hbWUsIGNvcGllZCk6ICdkZXN0X25hbWUnIGlzIHRoZSBhY3R1YWwgbmFtZSBvZgorICAgIHRoZSBvdXRwdXQgZmlsZSwgYW5kICdjb3BpZWQnIGlzIHRydWUgaWYgdGhlIGZpbGUgd2FzIGNvcGllZCAob3Igd291bGQKKyAgICBoYXZlIGJlZW4gY29waWVkLCBpZiAnZHJ5X3J1bicgdHJ1ZSkuCisgICAgIiIiCisgICAgIyBYWFggaWYgdGhlIGRlc3RpbmF0aW9uIGZpbGUgYWxyZWFkeSBleGlzdHMsIHdlIGNsb2JiZXIgaXQgaWYKKyAgICAjIGNvcHlpbmcsIGJ1dCBibG93IHVwIGlmIGxpbmtpbmcuICBIbW1tLiAgQW5kIEkgZG9uJ3Qga25vdyB3aGF0CisgICAgIyBtYWNvc3Rvb2xzLmNvcHlmaWxlKCkgZG9lcy4gIFNob3VsZCBkZWZpbml0ZWx5IGJlIGNvbnNpc3RlbnQsIGFuZAorICAgICMgc2hvdWxkIHByb2JhYmx5IGJsb3cgdXAgaWYgZGVzdGluYXRpb24gZXhpc3RzIGFuZCB3ZSB3b3VsZCBiZQorICAgICMgY2hhbmdpbmcgaXQgKGllLiBpdCdzIG5vdCBhbHJlYWR5IGEgaGFyZC9zb2Z0IGxpbmsgdG8gc3JjIE9SCisgICAgIyAobm90IHVwZGF0ZSkgYW5kIChzcmMgbmV3ZXIgdGhhbiBkc3QpLgorCisgICAgZnJvbSBkaXN0dXRpbHMuZGVwX3V0aWwgaW1wb3J0IG5ld2VyCisgICAgZnJvbSBzdGF0IGltcG9ydCBTVF9BVElNRSwgU1RfTVRJTUUsIFNUX01PREUsIFNfSU1PREUKKworICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShzcmMpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCisgICAgICAgICAgICAgICJjYW4ndCBjb3B5ICclcyc6IGRvZXNuJ3QgZXhpc3Qgb3Igbm90IGEgcmVndWxhciBmaWxlIiAlIHNyYykKKworICAgIGlmIG9zLnBhdGguaXNkaXIoZHN0KToKKyAgICAgICAgZGlyID0gZHN0CisgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihkc3QsIG9zLnBhdGguYmFzZW5hbWUoc3JjKSkKKyAgICBlbHNlOgorICAgICAgICBkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZHN0KQorCisgICAgaWYgdXBkYXRlIGFuZCBub3QgbmV3ZXIoc3JjLCBkc3QpOgorICAgICAgICBpZiB2ZXJib3NlID49IDE6CisgICAgICAgICAgICBsb2cuZGVidWcoIm5vdCBjb3B5aW5nICVzIChvdXRwdXQgdXAtdG8tZGF0ZSkiLCBzcmMpCisgICAgICAgIHJldHVybiBkc3QsIDAKKworICAgIHRyeToKKyAgICAgICAgYWN0aW9uID0gX2NvcHlfYWN0aW9uW2xpbmtdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIHZhbHVlICclcycgZm9yICdsaW5rJyBhcmd1bWVudCIgJSBsaW5rKQorCisgICAgaWYgdmVyYm9zZSA+PSAxOgorICAgICAgICBpZiBvcy5wYXRoLmJhc2VuYW1lKGRzdCkgPT0gb3MucGF0aC5iYXNlbmFtZShzcmMpOgorICAgICAgICAgICAgbG9nLmluZm8oIiVzICVzIC0+ICVzIiwgYWN0aW9uLCBzcmMsIGRpcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZy5pbmZvKCIlcyAlcyAtPiAlcyIsIGFjdGlvbiwgc3JjLCBkc3QpCisKKyAgICBpZiBkcnlfcnVuOgorICAgICAgICByZXR1cm4gKGRzdCwgMSkKKworICAgICMgSWYgbGlua2luZyAoaGFyZCBvciBzeW1ib2xpYyksIHVzZSB0aGUgYXBwcm9wcmlhdGUgc3lzdGVtIGNhbGwKKyAgICAjIChVbml4IG9ubHksIG9mIGNvdXJzZSwgYnV0IHRoYXQncyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkpCisgICAgaWYgbGluayA9PSAnaGFyZCc6CisgICAgICAgIGlmIG5vdCAob3MucGF0aC5leGlzdHMoZHN0KSBhbmQgb3MucGF0aC5zYW1lZmlsZShzcmMsIGRzdCkpOgorICAgICAgICAgICAgb3MubGluayhzcmMsIGRzdCkKKyAgICBlbGlmIGxpbmsgPT0gJ3N5bSc6CisgICAgICAgIGlmIG5vdCAob3MucGF0aC5leGlzdHMoZHN0KSBhbmQgb3MucGF0aC5zYW1lZmlsZShzcmMsIGRzdCkpOgorICAgICAgICAgICAgb3Muc3ltbGluayhzcmMsIGRzdCkKKworICAgICMgT3RoZXJ3aXNlIChub24tTWFjLCBub3QgbGlua2luZyksIGNvcHkgdGhlIGZpbGUgY29udGVudHMgYW5kCisgICAgIyAob3B0aW9uYWxseSkgY29weSB0aGUgdGltZXMgYW5kIG1vZGUuCisgICAgZWxzZToKKyAgICAgICAgX2NvcHlfZmlsZV9jb250ZW50cyhzcmMsIGRzdCkKKyAgICAgICAgaWYgcHJlc2VydmVfbW9kZSBvciBwcmVzZXJ2ZV90aW1lczoKKyAgICAgICAgICAgIHN0ID0gb3Muc3RhdChzcmMpCisKKyAgICAgICAgICAgICMgQWNjb3JkaW5nIHRvIERhdmlkIEFzY2hlciA8ZGFAc2tpLm9yZz4sIHV0aW1lKCkgc2hvdWxkIGJlIGRvbmUKKyAgICAgICAgICAgICMgYmVmb3JlIGNobW9kKCkgKGF0IGxlYXN0IHVuZGVyIE5UKS4KKyAgICAgICAgICAgIGlmIHByZXNlcnZlX3RpbWVzOgorICAgICAgICAgICAgICAgIG9zLnV0aW1lKGRzdCwgKHN0W1NUX0FUSU1FXSwgc3RbU1RfTVRJTUVdKSkKKyAgICAgICAgICAgIGlmIHByZXNlcnZlX21vZGU6CisgICAgICAgICAgICAgICAgb3MuY2htb2QoZHN0LCBTX0lNT0RFKHN0W1NUX01PREVdKSkKKworICAgIHJldHVybiAoZHN0LCAxKQorCisjIFhYWCBJIHN1c3BlY3QgdGhpcyBpcyBVbml4LXNwZWNpZmljIC0tIG5lZWQgcG9ydGluZyBoZWxwIQorZGVmIG1vdmVfZmlsZSAoc3JjLCBkc3QsIHZlcmJvc2U9MSwgZHJ5X3J1bj0wKToKKyAgICAiIiJNb3ZlIGEgZmlsZSAnc3JjJyB0byAnZHN0Jy4KKworICAgIElmICdkc3QnIGlzIGEgZGlyZWN0b3J5LCB0aGUgZmlsZSB3aWxsIGJlIG1vdmVkIGludG8gaXQgd2l0aCB0aGUgc2FtZQorICAgIG5hbWU7IG90aGVyd2lzZSwgJ3NyYycgaXMganVzdCByZW5hbWVkIHRvICdkc3QnLiAgUmV0dXJuIHRoZSBuZXcKKyAgICBmdWxsIG5hbWUgb2YgdGhlIGZpbGUuCisKKyAgICBIYW5kbGVzIGNyb3NzLWRldmljZSBtb3ZlcyBvbiBVbml4IHVzaW5nICdjb3B5X2ZpbGUoKScuICBXaGF0IGFib3V0CisgICAgb3RoZXIgc3lzdGVtcz8/PworICAgICIiIgorICAgIGZyb20gb3MucGF0aCBpbXBvcnQgZXhpc3RzLCBpc2ZpbGUsIGlzZGlyLCBiYXNlbmFtZSwgZGlybmFtZQorICAgIGltcG9ydCBlcnJubworCisgICAgaWYgdmVyYm9zZSA+PSAxOgorICAgICAgICBsb2cuaW5mbygibW92aW5nICVzIC0+ICVzIiwgc3JjLCBkc3QpCisKKyAgICBpZiBkcnlfcnVuOgorICAgICAgICByZXR1cm4gZHN0CisKKyAgICBpZiBub3QgaXNmaWxlKHNyYyk6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigiY2FuJ3QgbW92ZSAnJXMnOiBub3QgYSByZWd1bGFyIGZpbGUiICUgc3JjKQorCisgICAgaWYgaXNkaXIoZHN0KToKKyAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGRzdCwgYmFzZW5hbWUoc3JjKSkKKyAgICBlbGlmIGV4aXN0cyhkc3QpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCisgICAgICAgICAgICAgICJjYW4ndCBtb3ZlICclcyc6IGRlc3RpbmF0aW9uICclcycgYWxyZWFkeSBleGlzdHMiICUKKyAgICAgICAgICAgICAgKHNyYywgZHN0KSkKKworICAgIGlmIG5vdCBpc2RpcihkaXJuYW1lKGRzdCkpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCisgICAgICAgICAgICAgICJjYW4ndCBtb3ZlICclcyc6IGRlc3RpbmF0aW9uICclcycgbm90IGEgdmFsaWQgcGF0aCIgJSBcCisgICAgICAgICAgICAgIChzcmMsIGRzdCkpCisKKyAgICBjb3B5X2l0ID0gMAorICAgIHRyeToKKyAgICAgICAgb3MucmVuYW1lKHNyYywgZHN0KQorICAgIGV4Y2VwdCBvcy5lcnJvciwgKG51bSwgbXNnKToKKyAgICAgICAgaWYgbnVtID09IGVycm5vLkVYREVWOgorICAgICAgICAgICAgY29weV9pdCA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICAgICAgICJjb3VsZG4ndCBtb3ZlICclcycgdG8gJyVzJzogJXMiICUgKHNyYywgZHN0LCBtc2cpKQorCisgICAgaWYgY29weV9pdDoKKyAgICAgICAgY29weV9maWxlKHNyYywgZHN0LCB2ZXJib3NlPXZlcmJvc2UpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnVubGluayhzcmMpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgKG51bSwgbXNnKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZHN0KQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICAgICAgICgiY291bGRuJ3QgbW92ZSAnJXMnIHRvICclcycgYnkgY29weS9kZWxldGU6ICIgKworICAgICAgICAgICAgICAgICAgICJkZWxldGUgJyVzJyBmYWlsZWQ6ICVzIikgJQorICAgICAgICAgICAgICAgICAgKHNyYywgZHN0LCBzcmMsIG1zZykpCisgICAgcmV0dXJuIGRzdAorCisKK2RlZiB3cml0ZV9maWxlIChmaWxlbmFtZSwgY29udGVudHMpOgorICAgICIiIkNyZWF0ZSBhIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHdyaXRlICdjb250ZW50cycgKGEKKyAgICBzZXF1ZW5jZSBvZiBzdHJpbmdzIHdpdGhvdXQgbGluZSB0ZXJtaW5hdG9ycykgdG8gaXQuCisgICAgIiIiCisgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3IikKKyAgICB0cnk6CisgICAgICAgIGZvciBsaW5lIGluIGNvbnRlbnRzOgorICAgICAgICAgICAgZi53cml0ZShsaW5lICsgIlxuIikKKyAgICBmaW5hbGx5OgorICAgICAgICBmLmNsb3NlKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVfdXRpbC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9maWxlX3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGQ1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9maWxlX3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVfdXRpbC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9maWxlX3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGQ1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9maWxlX3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmlsZWxpc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxYzQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5CkBAIC0wLDAgKzEsMzQzIEBACisiIiJkaXN0dXRpbHMuZmlsZWxpc3QKKworUHJvdmlkZXMgdGhlIEZpbGVMaXN0IGNsYXNzLCB1c2VkIGZvciBwb2tpbmcgYWJvdXQgdGhlIGZpbGVzeXN0ZW0KK2FuZCBidWlsZGluZyBsaXN0cyBvZiBmaWxlcy4KKyIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zLCByZQoraW1wb3J0IGZubWF0Y2gKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNUZW1wbGF0ZUVycm9yLCBEaXN0dXRpbHNJbnRlcm5hbEVycm9yCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKK2NsYXNzIEZpbGVMaXN0OgorICAgICIiIkEgbGlzdCBvZiBmaWxlcyBidWlsdCBieSBvbiBleHBsb3JpbmcgdGhlIGZpbGVzeXN0ZW0gYW5kIGZpbHRlcmVkIGJ5CisgICAgYXBwbHlpbmcgdmFyaW91cyBwYXR0ZXJucyB0byB3aGF0IHdlIGZpbmQgdGhlcmUuCisKKyAgICBJbnN0YW5jZSBhdHRyaWJ1dGVzOgorICAgICAgZGlyCisgICAgICAgIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGZpbGVzIHdpbGwgYmUgdGFrZW4gLS0gb25seSB1c2VkIGlmCisgICAgICAgICdhbGxmaWxlcycgbm90IHN1cHBsaWVkIHRvIGNvbnN0cnVjdG9yCisgICAgICBmaWxlcworICAgICAgICBsaXN0IG9mIGZpbGVuYW1lcyBjdXJyZW50bHkgYmVpbmcgYnVpbHQvZmlsdGVyZWQvbWFuaXB1bGF0ZWQKKyAgICAgIGFsbGZpbGVzCisgICAgICAgIGNvbXBsZXRlIGxpc3Qgb2YgZmlsZXMgdW5kZXIgY29uc2lkZXJhdGlvbiAoaWUuIHdpdGhvdXQgYW55CisgICAgICAgIGZpbHRlcmluZyBhcHBsaWVkKQorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdhcm49Tm9uZSwgZGVidWdfcHJpbnQ9Tm9uZSk6CisgICAgICAgICMgaWdub3JlIGFyZ3VtZW50IHRvIEZpbGVMaXN0LCBidXQga2VlcCB0aGVtIGZvciBiYWNrd2FyZHMKKyAgICAgICAgIyBjb21wYXRpYmlsaXR5CisgICAgICAgIHNlbGYuYWxsZmlsZXMgPSBOb25lCisgICAgICAgIHNlbGYuZmlsZXMgPSBbXQorCisgICAgZGVmIHNldF9hbGxmaWxlcyhzZWxmLCBhbGxmaWxlcyk6CisgICAgICAgIHNlbGYuYWxsZmlsZXMgPSBhbGxmaWxlcworCisgICAgZGVmIGZpbmRhbGwoc2VsZiwgZGlyPW9zLmN1cmRpcik6CisgICAgICAgIHNlbGYuYWxsZmlsZXMgPSBmaW5kYWxsKGRpcikKKworICAgIGRlZiBkZWJ1Z19wcmludChzZWxmLCBtc2cpOgorICAgICAgICAiIiJQcmludCAnbXNnJyB0byBzdGRvdXQgaWYgdGhlIGdsb2JhbCBERUJVRyAodGFrZW4gZnJvbSB0aGUKKyAgICAgICAgRElTVFVUSUxTX0RFQlVHIGVudmlyb25tZW50IHZhcmlhYmxlKSBmbGFnIGlzIHRydWUuCisgICAgICAgICIiIgorICAgICAgICBmcm9tIGRpc3R1dGlscy5kZWJ1ZyBpbXBvcnQgREVCVUcKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBwcmludCBtc2cKKworICAgICMgLS0gTGlzdC1saWtlIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIGl0ZW0pOgorICAgICAgICBzZWxmLmZpbGVzLmFwcGVuZChpdGVtKQorCisgICAgZGVmIGV4dGVuZChzZWxmLCBpdGVtcyk6CisgICAgICAgIHNlbGYuZmlsZXMuZXh0ZW5kKGl0ZW1zKQorCisgICAgZGVmIHNvcnQoc2VsZik6CisgICAgICAgICMgTm90IGEgc3RyaWN0IGxleGljYWwgc29ydCEKKyAgICAgICAgc29ydGFibGVfZmlsZXMgPSBtYXAob3MucGF0aC5zcGxpdCwgc2VsZi5maWxlcykKKyAgICAgICAgc29ydGFibGVfZmlsZXMuc29ydCgpCisgICAgICAgIHNlbGYuZmlsZXMgPSBbXQorICAgICAgICBmb3Igc29ydF90dXBsZSBpbiBzb3J0YWJsZV9maWxlczoKKyAgICAgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKG9zLnBhdGguam9pbigqc29ydF90dXBsZSkpCisKKworICAgICMgLS0gT3RoZXIgbWlzY2VsbGFuZW91cyB1dGlsaXR5IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgcmVtb3ZlX2R1cGxpY2F0ZXMoc2VsZik6CisgICAgICAgICMgQXNzdW1lcyBsaXN0IGhhcyBiZWVuIHNvcnRlZCEKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZmlsZXMpIC0gMSwgMCwgLTEpOgorICAgICAgICAgICAgaWYgc2VsZi5maWxlc1tpXSA9PSBzZWxmLmZpbGVzW2kgLSAxXToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5maWxlc1tpXQorCisKKyAgICAjIC0tICJGaWxlIHRlbXBsYXRlIiBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIF9wYXJzZV90ZW1wbGF0ZV9saW5lKHNlbGYsIGxpbmUpOgorICAgICAgICB3b3JkcyA9IGxpbmUuc3BsaXQoKQorICAgICAgICBhY3Rpb24gPSB3b3Jkc1swXQorCisgICAgICAgIHBhdHRlcm5zID0gZGlyID0gZGlyX3BhdHRlcm4gPSBOb25lCisKKyAgICAgICAgaWYgYWN0aW9uIGluICgnaW5jbHVkZScsICdleGNsdWRlJywKKyAgICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsLWluY2x1ZGUnLCAnZ2xvYmFsLWV4Y2x1ZGUnKToKKyAgICAgICAgICAgIGlmIGxlbih3b3JkcykgPCAyOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1RlbXBsYXRlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBleHBlY3RzIDxwYXR0ZXJuMT4gPHBhdHRlcm4yPiAuLi4iICUgYWN0aW9uCisKKyAgICAgICAgICAgIHBhdHRlcm5zID0gbWFwKGNvbnZlcnRfcGF0aCwgd29yZHNbMTpdKQorCisgICAgICAgIGVsaWYgYWN0aW9uIGluICgncmVjdXJzaXZlLWluY2x1ZGUnLCAncmVjdXJzaXZlLWV4Y2x1ZGUnKToKKyAgICAgICAgICAgIGlmIGxlbih3b3JkcykgPCAzOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1RlbXBsYXRlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBleHBlY3RzIDxkaXI+IDxwYXR0ZXJuMT4gPHBhdHRlcm4yPiAuLi4iICUgYWN0aW9uCisKKyAgICAgICAgICAgIGRpciA9IGNvbnZlcnRfcGF0aCh3b3Jkc1sxXSkKKyAgICAgICAgICAgIHBhdHRlcm5zID0gbWFwKGNvbnZlcnRfcGF0aCwgd29yZHNbMjpdKQorCisgICAgICAgIGVsaWYgYWN0aW9uIGluICgnZ3JhZnQnLCAncHJ1bmUnKToKKyAgICAgICAgICAgIGlmIGxlbih3b3JkcykgIT0gMjoKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNUZW1wbGF0ZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAiJyVzJyBleHBlY3RzIGEgc2luZ2xlIDxkaXJfcGF0dGVybj4iICUgYWN0aW9uCisKKyAgICAgICAgICAgIGRpcl9wYXR0ZXJuID0gY29udmVydF9wYXRoKHdvcmRzWzFdKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNUZW1wbGF0ZUVycm9yLCAidW5rbm93biBhY3Rpb24gJyVzJyIgJSBhY3Rpb24KKworICAgICAgICByZXR1cm4gKGFjdGlvbiwgcGF0dGVybnMsIGRpciwgZGlyX3BhdHRlcm4pCisKKyAgICBkZWYgcHJvY2Vzc190ZW1wbGF0ZV9saW5lKHNlbGYsIGxpbmUpOgorICAgICAgICAjIFBhcnNlIHRoZSBsaW5lOiBzcGxpdCBpdCB1cCwgbWFrZSBzdXJlIHRoZSByaWdodCBudW1iZXIgb2Ygd29yZHMKKyAgICAgICAgIyBpcyB0aGVyZSwgYW5kIHJldHVybiB0aGUgcmVsZXZhbnQgd29yZHMuICAnYWN0aW9uJyBpcyBhbHdheXMKKyAgICAgICAgIyBkZWZpbmVkOiBpdCdzIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBsaW5lLiAgV2hpY2ggb2YgdGhlIG90aGVyCisgICAgICAgICMgdGhyZWUgYXJlIGRlZmluZWQgZGVwZW5kcyBvbiB0aGUgYWN0aW9uOyBpdCdsbCBiZSBlaXRoZXIKKyAgICAgICAgIyBwYXR0ZXJucywgKGRpciBhbmQgcGF0dGVybnMpLCBvciAoZGlyX3BhdHRlcm4pLgorICAgICAgICBhY3Rpb24sIHBhdHRlcm5zLCBkaXIsIGRpcl9wYXR0ZXJuID0gc2VsZi5fcGFyc2VfdGVtcGxhdGVfbGluZShsaW5lKQorCisgICAgICAgICMgT0ssIG5vdyB3ZSBrbm93IHRoYXQgdGhlIGFjdGlvbiBpcyB2YWxpZCBhbmQgd2UgaGF2ZSB0aGUKKyAgICAgICAgIyByaWdodCBudW1iZXIgb2Ygd29yZHMgb24gdGhlIGxpbmUgZm9yIHRoYXQgYWN0aW9uIC0tIHNvIHdlCisgICAgICAgICMgY2FuIHByb2NlZWQgd2l0aCBtaW5pbWFsIGVycm9yLWNoZWNraW5nLgorICAgICAgICBpZiBhY3Rpb24gPT0gJ2luY2x1ZGUnOgorICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiaW5jbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQorICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaW5jbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvcj0xKToKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIndhcm5pbmc6IG5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuKQorCisgICAgICAgIGVsaWYgYWN0aW9uID09ICdleGNsdWRlJzoKKyAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImV4Y2x1ZGUgIiArICcgJy5qb2luKHBhdHRlcm5zKSkKKyAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmV4Y2x1ZGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3I9MSk6CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgbWF0Y2hpbmcgJyVzJyIpLCBwYXR0ZXJuKQorCisgICAgICAgIGVsaWYgYWN0aW9uID09ICdnbG9iYWwtaW5jbHVkZSc6CisgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJnbG9iYWwtaW5jbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQorICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaW5jbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvcj0wKToKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBmaWxlcyBmb3VuZCBtYXRjaGluZyAnJXMnICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFueXdoZXJlIGluIGRpc3RyaWJ1dGlvbiIpLCBwYXR0ZXJuKQorCisgICAgICAgIGVsaWYgYWN0aW9uID09ICdnbG9iYWwtZXhjbHVkZSc6CisgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJnbG9iYWwtZXhjbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQorICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvcj0wKToKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzIG1hdGNoaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGZvdW5kIGFueXdoZXJlIGluIGRpc3RyaWJ1dGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuKQorCisgICAgICAgIGVsaWYgYWN0aW9uID09ICdyZWN1cnNpdmUtaW5jbHVkZSc6CisgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJyZWN1cnNpdmUtaW5jbHVkZSAlcyAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyLCAnICcuam9pbihwYXR0ZXJucykpKQorICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaW5jbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIHByZWZpeD1kaXIpOgorICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICclcycgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmRlciBkaXJlY3RvcnkgJyVzJyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCBkaXIpCisKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3JlY3Vyc2l2ZS1leGNsdWRlJzoKKyAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoInJlY3Vyc2l2ZS1leGNsdWRlICVzICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXIsICcgJy5qb2luKHBhdHRlcm5zKSkpCisgICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5leGNsdWRlX3BhdHRlcm4ocGF0dGVybiwgcHJlZml4PWRpcik6CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gcHJldmlvdXNseS1pbmNsdWRlZCBmaWxlcyBtYXRjaGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBmb3VuZCB1bmRlciBkaXJlY3RvcnkgJyVzJyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLCBkaXIpCisKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dyYWZ0JzoKKyAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImdyYWZ0ICIgKyBkaXJfcGF0dGVybikKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmluY2x1ZGVfcGF0dGVybihOb25lLCBwcmVmaXg9ZGlyX3BhdHRlcm4pOgorICAgICAgICAgICAgICAgIGxvZy53YXJuKCJ3YXJuaW5nOiBubyBkaXJlY3RvcmllcyBmb3VuZCBtYXRjaGluZyAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkaXJfcGF0dGVybikKKworICAgICAgICBlbGlmIGFjdGlvbiA9PSAncHJ1bmUnOgorICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgicHJ1bmUgIiArIGRpcl9wYXR0ZXJuKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZV9wYXR0ZXJuKE5vbmUsIHByZWZpeD1kaXJfcGF0dGVybik6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJubyBwcmV2aW91c2x5LWluY2x1ZGVkIGRpcmVjdG9yaWVzIGZvdW5kICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hpbmcgJyVzJyIpLCBkaXJfcGF0dGVybikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ludGVybmFsRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICJ0aGlzIGNhbm5vdCBoYXBwZW46IGludmFsaWQgYWN0aW9uICclcyciICUgYWN0aW9uCisKKyAgICAjIC0tIEZpbHRlcmluZy9zZWxlY3Rpb24gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGluY2x1ZGVfcGF0dGVybihzZWxmLCBwYXR0ZXJuLCBhbmNob3I9MSwgcHJlZml4PU5vbmUsIGlzX3JlZ2V4PTApOgorICAgICAgICAiIiJTZWxlY3Qgc3RyaW5ncyAocHJlc3VtYWJseSBmaWxlbmFtZXMpIGZyb20gJ3NlbGYuZmlsZXMnIHRoYXQKKyAgICAgICAgbWF0Y2ggJ3BhdHRlcm4nLCBhIFVuaXgtc3R5bGUgd2lsZGNhcmQgKGdsb2IpIHBhdHRlcm4uCisKKyAgICAgICAgUGF0dGVybnMgYXJlIG5vdCBxdWl0ZSB0aGUgc2FtZSBhcyBpbXBsZW1lbnRlZCBieSB0aGUgJ2ZubWF0Y2gnCisgICAgICAgIG1vZHVsZTogJyonIGFuZCAnPycgIG1hdGNoIG5vbi1zcGVjaWFsIGNoYXJhY3RlcnMsIHdoZXJlICJzcGVjaWFsIgorICAgICAgICBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQ6IHNsYXNoIG9uIFVuaXg7IGNvbG9uLCBzbGFzaCwgYW5kIGJhY2tzbGFzaCBvbgorICAgICAgICBET1MvV2luZG93czsgYW5kIGNvbG9uIG9uIE1hYyBPUy4KKworICAgICAgICBJZiAnYW5jaG9yJyBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHRoZW4gdGhlIHBhdHRlcm4gbWF0Y2ggaXMgbW9yZQorICAgICAgICBzdHJpbmdlbnQ6ICIqLnB5IiB3aWxsIG1hdGNoICJmb28ucHkiIGJ1dCBub3QgImZvby9iYXIucHkiLiAgSWYKKyAgICAgICAgJ2FuY2hvcicgaXMgZmFsc2UsIGJvdGggb2YgdGhlc2Ugd2lsbCBtYXRjaC4KKworICAgICAgICBJZiAncHJlZml4JyBpcyBzdXBwbGllZCwgdGhlbiBvbmx5IGZpbGVuYW1lcyBzdGFydGluZyB3aXRoICdwcmVmaXgnCisgICAgICAgIChpdHNlbGYgYSBwYXR0ZXJuKSBhbmQgZW5kaW5nIHdpdGggJ3BhdHRlcm4nLCB3aXRoIGFueXRoaW5nIGluIGJldHdlZW4KKyAgICAgICAgdGhlbSwgd2lsbCBtYXRjaC4gICdhbmNob3InIGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgorCisgICAgICAgIElmICdpc19yZWdleCcgaXMgdHJ1ZSwgJ2FuY2hvcicgYW5kICdwcmVmaXgnIGFyZSBpZ25vcmVkLCBhbmQKKyAgICAgICAgJ3BhdHRlcm4nIGlzIGFzc3VtZWQgdG8gYmUgZWl0aGVyIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSByZWdleCBvciBhCisgICAgICAgIHJlZ2V4IG9iamVjdCAtLSBubyB0cmFuc2xhdGlvbiBpcyBkb25lLCB0aGUgcmVnZXggaXMganVzdCBjb21waWxlZAorICAgICAgICBhbmQgdXNlZCBhcy1pcy4KKworICAgICAgICBTZWxlY3RlZCBzdHJpbmdzIHdpbGwgYmUgYWRkZWQgdG8gc2VsZi5maWxlcy4KKworICAgICAgICBSZXR1cm4gMSBpZiBmaWxlcyBhcmUgZm91bmQuCisgICAgICAgICIiIgorICAgICAgICAjIFhYWCBkb2NzdHJpbmcgbHlpbmcgYWJvdXQgd2hhdCB0aGUgc3BlY2lhbCBjaGFycyBhcmU/CisgICAgICAgIGZpbGVzX2ZvdW5kID0gMAorICAgICAgICBwYXR0ZXJuX3JlID0gdHJhbnNsYXRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yLCBwcmVmaXgsIGlzX3JlZ2V4KQorICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJpbmNsdWRlX3BhdHRlcm46IGFwcGx5aW5nIHJlZ2V4IHInJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9yZS5wYXR0ZXJuKQorCisgICAgICAgICMgZGVsYXllZCBsb2FkaW5nIG9mIGFsbGZpbGVzIGxpc3QKKyAgICAgICAgaWYgc2VsZi5hbGxmaWxlcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5maW5kYWxsKCkKKworICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmFsbGZpbGVzOgorICAgICAgICAgICAgaWYgcGF0dGVybl9yZS5zZWFyY2gobmFtZSk6CisgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiIGFkZGluZyAiICsgbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVzLmFwcGVuZChuYW1lKQorICAgICAgICAgICAgICAgIGZpbGVzX2ZvdW5kID0gMQorCisgICAgICAgIHJldHVybiBmaWxlc19mb3VuZAorCisKKyAgICBkZWYgZXhjbHVkZV9wYXR0ZXJuKHNlbGYsIHBhdHRlcm4sIGFuY2hvcj0xLCBwcmVmaXg9Tm9uZSwgaXNfcmVnZXg9MCk6CisgICAgICAgICIiIlJlbW92ZSBzdHJpbmdzIChwcmVzdW1hYmx5IGZpbGVuYW1lcykgZnJvbSAnZmlsZXMnIHRoYXQgbWF0Y2gKKyAgICAgICAgJ3BhdHRlcm4nLgorCisgICAgICAgIE90aGVyIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lIGFzIGZvciAnaW5jbHVkZV9wYXR0ZXJuKCknLCBhYm92ZS4KKyAgICAgICAgVGhlIGxpc3QgJ3NlbGYuZmlsZXMnIGlzIG1vZGlmaWVkIGluIHBsYWNlLiBSZXR1cm4gMSBpZiBmaWxlcyBhcmUKKyAgICAgICAgZm91bmQuCisgICAgICAgICIiIgorICAgICAgICBmaWxlc19mb3VuZCA9IDAKKyAgICAgICAgcGF0dGVybl9yZSA9IHRyYW5zbGF0ZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvciwgcHJlZml4LCBpc19yZWdleCkKKyAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZXhjbHVkZV9wYXR0ZXJuOiBhcHBseWluZyByZWdleCByJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fcmUucGF0dGVybikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZmlsZXMpLTEsIC0xLCAtMSk6CisgICAgICAgICAgICBpZiBwYXR0ZXJuX3JlLnNlYXJjaChzZWxmLmZpbGVzW2ldKToKKyAgICAgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCIgcmVtb3ZpbmcgIiArIHNlbGYuZmlsZXNbaV0pCisgICAgICAgICAgICAgICAgZGVsIHNlbGYuZmlsZXNbaV0KKyAgICAgICAgICAgICAgICBmaWxlc19mb3VuZCA9IDEKKworICAgICAgICByZXR1cm4gZmlsZXNfZm91bmQKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVXRpbGl0eSBmdW5jdGlvbnMKKworZGVmIGZpbmRhbGwoZGlyID0gb3MuY3VyZGlyKToKKyAgICAiIiJGaW5kIGFsbCBmaWxlcyB1bmRlciAnZGlyJyBhbmQgcmV0dXJuIHRoZSBsaXN0IG9mIGZ1bGwgZmlsZW5hbWVzCisgICAgKHJlbGF0aXZlIHRvICdkaXInKS4KKyAgICAiIiIKKyAgICBmcm9tIHN0YXQgaW1wb3J0IFNUX01PREUsIFNfSVNSRUcsIFNfSVNESVIsIFNfSVNMTksKKworICAgIGxpc3QgPSBbXQorICAgIHN0YWNrID0gW2Rpcl0KKyAgICBwb3AgPSBzdGFjay5wb3AKKyAgICBwdXNoID0gc3RhY2suYXBwZW5kCisKKyAgICB3aGlsZSBzdGFjazoKKyAgICAgICAgZGlyID0gcG9wKCkKKyAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcikKKworICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGlmIGRpciAhPSBvcy5jdXJkaXI6ICAgICAgICAjIGF2b2lkIHRoZSBkcmVhZGVkICIuLyIgc3luZHJvbWUKKyAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihkaXIsIG5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gbmFtZQorCisgICAgICAgICAgICAjIEF2b2lkIGV4Y2VzcyBzdGF0IGNhbGxzIC0tIGp1c3Qgb25lIHdpbGwgZG8sIHRoYW5rIHlvdSEKKyAgICAgICAgICAgIHN0YXQgPSBvcy5zdGF0KGZ1bGxuYW1lKQorICAgICAgICAgICAgbW9kZSA9IHN0YXRbU1RfTU9ERV0KKyAgICAgICAgICAgIGlmIFNfSVNSRUcobW9kZSk6CisgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQoZnVsbG5hbWUpCisgICAgICAgICAgICBlbGlmIFNfSVNESVIobW9kZSkgYW5kIG5vdCBTX0lTTE5LKG1vZGUpOgorICAgICAgICAgICAgICAgIHB1c2goZnVsbG5hbWUpCisKKyAgICByZXR1cm4gbGlzdAorCisKK2RlZiBnbG9iX3RvX3JlKHBhdHRlcm4pOgorICAgICIiIlRyYW5zbGF0ZSBhIHNoZWxsLWxpa2UgZ2xvYiBwYXR0ZXJuIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgorCisgICAgUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJlZ2V4LiAgRGlmZmVycyBmcm9tCisgICAgJ2ZubWF0Y2gudHJhbnNsYXRlKCknIGluIHRoYXQgJyonIGRvZXMgbm90IG1hdGNoICJzcGVjaWFsIGNoYXJhY3RlcnMiCisgICAgKHdoaWNoIGFyZSBwbGF0Zm9ybS1zcGVjaWZpYykuCisgICAgIiIiCisgICAgcGF0dGVybl9yZSA9IGZubWF0Y2gudHJhbnNsYXRlKHBhdHRlcm4pCisKKyAgICAjICc/JyBhbmQgJyonIGluIHRoZSBnbG9iIHBhdHRlcm4gYmVjb21lICcuJyBhbmQgJy4qJyBpbiB0aGUgUkUsIHdoaWNoCisgICAgIyBJTUhPIGlzIHdyb25nIC0tICc/JyBhbmQgJyonIGFyZW4ndCBzdXBwb3NlZCB0byBtYXRjaCBzbGFzaCBpbiBVbml4LAorICAgICMgYW5kIGJ5IGV4dGVuc2lvbiB0aGV5IHNob3VsZG4ndCBtYXRjaCBzdWNoICJzcGVjaWFsIGNoYXJhY3RlcnMiIHVuZGVyCisgICAgIyBhbnkgT1MuICBTbyBjaGFuZ2UgYWxsIG5vbi1lc2NhcGVkIGRvdHMgaW4gdGhlIFJFIHRvIG1hdGNoIGFueQorICAgICMgY2hhcmFjdGVyIGV4Y2VwdCB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIChjdXJyZW50bHk6IGp1c3Qgb3Muc2VwKS4KKyAgICBzZXAgPSBvcy5zZXAKKyAgICBpZiBvcy5zZXAgPT0gJ1xcJzoKKyAgICAgICAgIyB3ZSdyZSB1c2luZyBhIHJlZ2V4IHRvIG1hbmlwdWxhdGUgYSByZWdleCwgc28gd2UgbmVlZAorICAgICAgICAjIHRvIGVzY2FwZSB0aGUgYmFja3NsYXNoIHR3aWNlCisgICAgICAgIHNlcCA9IHInXFxcXCcKKyAgICBlc2NhcGVkID0gcidcMVteJXNdJyAlIHNlcAorICAgIHBhdHRlcm5fcmUgPSByZS5zdWIocicoKD88IVxcKShcXFxcKSopXC4nLCBlc2NhcGVkLCBwYXR0ZXJuX3JlKQorICAgIHJldHVybiBwYXR0ZXJuX3JlCisKKworZGVmIHRyYW5zbGF0ZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvcj0xLCBwcmVmaXg9Tm9uZSwgaXNfcmVnZXg9MCk6CisgICAgIiIiVHJhbnNsYXRlIGEgc2hlbGwtbGlrZSB3aWxkY2FyZCBwYXR0ZXJuIHRvIGEgY29tcGlsZWQgcmVndWxhcgorICAgIGV4cHJlc3Npb24uCisKKyAgICBSZXR1cm4gdGhlIGNvbXBpbGVkIHJlZ2V4LiAgSWYgJ2lzX3JlZ2V4JyB0cnVlLAorICAgIHRoZW4gJ3BhdHRlcm4nIGlzIGRpcmVjdGx5IGNvbXBpbGVkIHRvIGEgcmVnZXggKGlmIGl0J3MgYSBzdHJpbmcpCisgICAgb3IganVzdCByZXR1cm5lZCBhcy1pcyAoYXNzdW1lcyBpdCdzIGEgcmVnZXggb2JqZWN0KS4KKyAgICAiIiIKKyAgICBpZiBpc19yZWdleDoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBzdHIpOgorICAgICAgICAgICAgcmV0dXJuIHJlLmNvbXBpbGUocGF0dGVybikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuCisKKyAgICBpZiBwYXR0ZXJuOgorICAgICAgICBwYXR0ZXJuX3JlID0gZ2xvYl90b19yZShwYXR0ZXJuKQorICAgIGVsc2U6CisgICAgICAgIHBhdHRlcm5fcmUgPSAnJworCisgICAgaWYgcHJlZml4IGlzIG5vdCBOb25lOgorICAgICAgICAjIGRpdGNoIGVuZCBvZiBwYXR0ZXJuIGNoYXJhY3RlcgorICAgICAgICBlbXB0eV9wYXR0ZXJuID0gZ2xvYl90b19yZSgnJykKKyAgICAgICAgcHJlZml4X3JlID0gZ2xvYl90b19yZShwcmVmaXgpWzotbGVuKGVtcHR5X3BhdHRlcm4pXQorICAgICAgICBzZXAgPSBvcy5zZXAKKyAgICAgICAgaWYgb3Muc2VwID09ICdcXCc6CisgICAgICAgICAgICBzZXAgPSByJ1xcJworICAgICAgICBwYXR0ZXJuX3JlID0gIl4iICsgc2VwLmpvaW4oKHByZWZpeF9yZSwgIi4qIiArIHBhdHRlcm5fcmUpKQorICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gcHJlZml4IC0tIHJlc3BlY3QgYW5jaG9yIGZsYWcKKyAgICAgICAgaWYgYW5jaG9yOgorICAgICAgICAgICAgcGF0dGVybl9yZSA9ICJeIiArIHBhdHRlcm5fcmUKKworICAgIHJldHVybiByZS5jb21waWxlKHBhdHRlcm5fcmUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9maWxlbGlzdC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9maWxlbGlzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1Yjc5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9maWxlbGlzdC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9maWxlbGlzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1Yjc5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9sb2cucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9sb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4ODU3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2xvZy5weQpAQCAtMCwwICsxLDcxIEBACisiIiJBIHNpbXBsZSBsb2cgbWVjaGFuaXNtIHN0eWxlZCBhZnRlciBQRVAgMjgyLiIiIgorCisjIFRoZSBjbGFzcyBoZXJlIGlzIHN0eWxlZCBhZnRlciBQRVAgMjgyIHNvIHRoYXQgaXQgY291bGQgbGF0ZXIgYmUKKyMgcmVwbGFjZWQgd2l0aCBhIHN0YW5kYXJkIFB5dGhvbiBsb2dnaW5nIGltcGxlbWVudGF0aW9uLgorCitERUJVRyA9IDEKK0lORk8gPSAyCitXQVJOID0gMworRVJST1IgPSA0CitGQVRBTCA9IDUKKworaW1wb3J0IHN5cworCitjbGFzcyBMb2c6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGhyZXNob2xkPVdBUk4pOgorICAgICAgICBzZWxmLnRocmVzaG9sZCA9IHRocmVzaG9sZAorCisgICAgZGVmIF9sb2coc2VsZiwgbGV2ZWwsIG1zZywgYXJncyk6CisgICAgICAgIGlmIGxldmVsIG5vdCBpbiAoREVCVUcsIElORk8sIFdBUk4sIEVSUk9SLCBGQVRBTCk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclcyB3cm9uZyBsb2cgbGV2ZWwnICUgc3RyKGxldmVsKSkKKworICAgICAgICBpZiBsZXZlbCA+PSBzZWxmLnRocmVzaG9sZDoKKyAgICAgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICAgICAgbXNnID0gbXNnICUgYXJncworICAgICAgICAgICAgaWYgbGV2ZWwgaW4gKFdBUk4sIEVSUk9SLCBGQVRBTCk6CisgICAgICAgICAgICAgICAgc3RyZWFtID0gc3lzLnN0ZGVycgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICBzdHJlYW0ud3JpdGUoJyVzXG4nICUgbXNnKQorICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCkKKworICAgIGRlZiBsb2coc2VsZiwgbGV2ZWwsIG1zZywgKmFyZ3MpOgorICAgICAgICBzZWxmLl9sb2cobGV2ZWwsIG1zZywgYXJncykKKworICAgIGRlZiBkZWJ1ZyhzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgc2VsZi5fbG9nKERFQlVHLCBtc2csIGFyZ3MpCisKKyAgICBkZWYgaW5mbyhzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgc2VsZi5fbG9nKElORk8sIG1zZywgYXJncykKKworICAgIGRlZiB3YXJuKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICBzZWxmLl9sb2coV0FSTiwgbXNnLCBhcmdzKQorCisgICAgZGVmIGVycm9yKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICBzZWxmLl9sb2coRVJST1IsIG1zZywgYXJncykKKworICAgIGRlZiBmYXRhbChzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgc2VsZi5fbG9nKEZBVEFMLCBtc2csIGFyZ3MpCisKK19nbG9iYWxfbG9nID0gTG9nKCkKK2xvZyA9IF9nbG9iYWxfbG9nLmxvZworZGVidWcgPSBfZ2xvYmFsX2xvZy5kZWJ1ZworaW5mbyA9IF9nbG9iYWxfbG9nLmluZm8KK3dhcm4gPSBfZ2xvYmFsX2xvZy53YXJuCitlcnJvciA9IF9nbG9iYWxfbG9nLmVycm9yCitmYXRhbCA9IF9nbG9iYWxfbG9nLmZhdGFsCisKK2RlZiBzZXRfdGhyZXNob2xkKGxldmVsKToKKyAgICAjIHJldHVybiB0aGUgb2xkIHRocmVzaG9sZCBmb3IgdXNlIGZyb20gdGVzdHMKKyAgICBvbGQgPSBfZ2xvYmFsX2xvZy50aHJlc2hvbGQKKyAgICBfZ2xvYmFsX2xvZy50aHJlc2hvbGQgPSBsZXZlbAorICAgIHJldHVybiBvbGQKKworZGVmIHNldF92ZXJib3NpdHkodik6CisgICAgaWYgdiA8PSAwOgorICAgICAgICBzZXRfdGhyZXNob2xkKFdBUk4pCisgICAgZWxpZiB2ID09IDE6CisgICAgICAgIHNldF90aHJlc2hvbGQoSU5GTykKKyAgICBlbGlmIHYgPj0gMjoKKyAgICAgICAgc2V0X3RocmVzaG9sZChERUJVRykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2xvZy5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9sb2cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGFhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9sb2cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2xvZy5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9sb2cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGFhMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9sb2cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL21zdmM5Y29tcGlsZXIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjOWNvbXBpbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzliOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjOWNvbXBpbGVyLnB5CkBAIC0wLDAgKzEsODAxIEBACisiIiJkaXN0dXRpbHMubXN2Yzljb21waWxlcgorCitDb250YWlucyBNU1ZDQ29tcGlsZXIsIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBDQ29tcGlsZXIgY2xhc3MKK2ZvciB0aGUgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gMjAwOC4KKworVGhlIG1vZHVsZSBpcyBjb21wYXRpYmxlIHdpdGggVlMgMjAwNSBhbmQgVlMgMjAwOC4gWW91IGNhbiBmaW5kIGxlZ2FjeSBzdXBwb3J0Citmb3Igb2xkZXIgdmVyc2lvbnMgb2YgVlMgaW4gZGlzdHV0aWxzLm1zdmNjb21waWxlci4KKyIiIgorCisjIFdyaXR0ZW4gYnkgUGVycnkgU3RvbGwKKyMgaGFja2VkIGJ5IFJvYmluIEJlY2tlciBhbmQgVGhvbWFzIEhlbGxlciB0byBkbyBhIGJldHRlciBqb2Igb2YKKyMgICBmaW5kaW5nIERldlN0dWRpbyAodGhyb3VnaCB0aGUgcmVnaXN0cnkpCisjIHBvcnRlZCB0byBWUzIwMDUgYW5kIFZTIDIwMDggYnkgQ2hyaXN0aWFuIEhlaW1lcworCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHJlCisKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKERpc3R1dGlsc0V4ZWNFcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVFcnJvciwgTGliRXJyb3IsIExpbmtFcnJvcikKK2Zyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgQ0NvbXBpbGVyLCBnZW5fbGliX29wdGlvbnMKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQorCitpbXBvcnQgX3dpbnJlZworCitSZWdPcGVuS2V5RXggPSBfd2lucmVnLk9wZW5LZXlFeAorUmVnRW51bUtleSA9IF93aW5yZWcuRW51bUtleQorUmVnRW51bVZhbHVlID0gX3dpbnJlZy5FbnVtVmFsdWUKK1JlZ0Vycm9yID0gX3dpbnJlZy5lcnJvcgorCitIS0VZUyA9IChfd2lucmVnLkhLRVlfVVNFUlMsCisgICAgICAgICBfd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAorICAgICAgICAgX3dpbnJlZy5IS0VZX0xPQ0FMX01BQ0hJTkUsCisgICAgICAgICBfd2lucmVnLkhLRVlfQ0xBU1NFU19ST09UKQorCitOQVRJVkVfV0lONjQgPSAoc3lzLnBsYXRmb3JtID09ICd3aW4zMicgYW5kIHN5cy5tYXhzaXplID4gMioqMzIpCitpZiBOQVRJVkVfV0lONjQ6CisgICAgIyBWaXN1YWwgQysrIGlzIGEgMzItYml0IGFwcGxpY2F0aW9uLCBzbyB3ZSBuZWVkIHRvIGxvb2sgaW4KKyAgICAjIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdHJ5IGJyYW5jaCwgaWYgd2UncmUgcnVubmluZyBhCisgICAgIyA2NC1iaXQgUHl0aG9uIG9uIFdpbjY0CisgICAgVlNfQkFTRSA9IHIiU29mdHdhcmVcV293NjQzMk5vZGVcTWljcm9zb2Z0XFZpc3VhbFN0dWRpb1wlMC4xZiIKKyAgICBWU0VYUFJFU1NfQkFTRSA9IHIiU29mdHdhcmVcV293NjQzMk5vZGVcTWljcm9zb2Z0XFZDRXhwcmVzc1wlMC4xZiIKKyAgICBXSU5TREtfQkFTRSA9IHIiU29mdHdhcmVcV293NjQzMk5vZGVcTWljcm9zb2Z0XE1pY3Jvc29mdCBTREtzXFdpbmRvd3MiCisgICAgTkVUX0JBU0UgPSByIlNvZnR3YXJlXFdvdzY0MzJOb2RlXE1pY3Jvc29mdFwuTkVURnJhbWV3b3JrIgorZWxzZToKKyAgICBWU19CQVNFID0gciJTb2Z0d2FyZVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXCUwLjFmIgorICAgIFZTRVhQUkVTU19CQVNFID0gciJTb2Z0d2FyZVxNaWNyb3NvZnRcVkNFeHByZXNzXCUwLjFmIgorICAgIFdJTlNES19CQVNFID0gciJTb2Z0d2FyZVxNaWNyb3NvZnRcTWljcm9zb2Z0IFNES3NcV2luZG93cyIKKyAgICBORVRfQkFTRSA9IHIiU29mdHdhcmVcTWljcm9zb2Z0XC5ORVRGcmFtZXdvcmsiCisKKyMgQSBtYXAga2V5ZWQgYnkgZ2V0X3BsYXRmb3JtKCkgcmV0dXJuIHZhbHVlcyB0byB2YWx1ZXMgYWNjZXB0ZWQgYnkKKyMgJ3ZjdmFyc2FsbC5iYXQnLiAgTm90ZSBhIGNyb3NzLWNvbXBpbGUgbWF5IGNvbWJpbmUgdGhlc2UgKGVnLCAneDg2X2FtZDY0JyBpcworIyB0aGUgcGFyYW0gdG8gY3Jvc3MtY29tcGlsZSBvbiB4ODYgdGFyZ2V0dGluZyBhbWQ2NC4pCitQTEFUX1RPX1ZDVkFSUyA9IHsKKyAgICAnd2luMzInIDogJ3g4NicsCisgICAgJ3dpbi1hbWQ2NCcgOiAnYW1kNjQnLAorICAgICd3aW4taWE2NCcgOiAnaWE2NCcsCit9CisKK2NsYXNzIFJlZzoKKyAgICAiIiJIZWxwZXIgY2xhc3MgdG8gcmVhZCB2YWx1ZXMgZnJvbSB0aGUgcmVnaXN0cnkKKyAgICAiIiIKKworICAgIGRlZiBnZXRfdmFsdWUoY2xzLCBwYXRoLCBrZXkpOgorICAgICAgICBmb3IgYmFzZSBpbiBIS0VZUzoKKyAgICAgICAgICAgIGQgPSBjbHMucmVhZF92YWx1ZXMoYmFzZSwgcGF0aCkKKyAgICAgICAgICAgIGlmIGQgYW5kIGtleSBpbiBkOgorICAgICAgICAgICAgICAgIHJldHVybiBkW2tleV0KKyAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQorICAgIGdldF92YWx1ZSA9IGNsYXNzbWV0aG9kKGdldF92YWx1ZSkKKworICAgIGRlZiByZWFkX2tleXMoY2xzLCBiYXNlLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gbGlzdCBvZiByZWdpc3RyeSBrZXlzLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBoYW5kbGUgPSBSZWdPcGVuS2V5RXgoYmFzZSwga2V5KQorICAgICAgICBleGNlcHQgUmVnRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBMID0gW10KKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBrID0gUmVnRW51bUtleShoYW5kbGUsIGkpCisgICAgICAgICAgICBleGNlcHQgUmVnRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIEwuYXBwZW5kKGspCisgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgcmV0dXJuIEwKKyAgICByZWFkX2tleXMgPSBjbGFzc21ldGhvZChyZWFkX2tleXMpCisKKyAgICBkZWYgcmVhZF92YWx1ZXMoY2xzLCBiYXNlLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gZGljdCBvZiByZWdpc3RyeSBrZXlzIGFuZCB2YWx1ZXMuCisKKyAgICAgICAgQWxsIG5hbWVzIGFyZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaGFuZGxlID0gUmVnT3BlbktleUV4KGJhc2UsIGtleSkKKyAgICAgICAgZXhjZXB0IFJlZ0Vycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGkgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUsIHR5cGUgPSBSZWdFbnVtVmFsdWUoaGFuZGxlLCBpKQorICAgICAgICAgICAgZXhjZXB0IFJlZ0Vycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgICAgICBkW2Nscy5jb252ZXJ0X21iY3MobmFtZSldID0gY2xzLmNvbnZlcnRfbWJjcyh2YWx1ZSkKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICByZXR1cm4gZAorICAgIHJlYWRfdmFsdWVzID0gY2xhc3NtZXRob2QocmVhZF92YWx1ZXMpCisKKyAgICBkZWYgY29udmVydF9tYmNzKHMpOgorICAgICAgICBkZWMgPSBnZXRhdHRyKHMsICJkZWNvZGUiLCBOb25lKQorICAgICAgICBpZiBkZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcyA9IGRlYygibWJjcyIpCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIHMKKyAgICBjb252ZXJ0X21iY3MgPSBzdGF0aWNtZXRob2QoY29udmVydF9tYmNzKQorCitjbGFzcyBNYWNyb0V4cGFuZGVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgorICAgICAgICBzZWxmLm1hY3JvcyA9IHt9CisgICAgICAgIHNlbGYudnNiYXNlID0gVlNfQkFTRSAlIHZlcnNpb24KKyAgICAgICAgc2VsZi5sb2FkX21hY3Jvcyh2ZXJzaW9uKQorCisgICAgZGVmIHNldF9tYWNybyhzZWxmLCBtYWNybywgcGF0aCwga2V5KToKKyAgICAgICAgc2VsZi5tYWNyb3NbIiQoJXMpIiAlIG1hY3JvXSA9IFJlZy5nZXRfdmFsdWUocGF0aCwga2V5KQorCisgICAgZGVmIGxvYWRfbWFjcm9zKHNlbGYsIHZlcnNpb24pOgorICAgICAgICBzZWxmLnNldF9tYWNybygiVkNJbnN0YWxsRGlyIiwgc2VsZi52c2Jhc2UgKyByIlxTZXR1cFxWQyIsICJwcm9kdWN0ZGlyIikKKyAgICAgICAgc2VsZi5zZXRfbWFjcm8oIlZTSW5zdGFsbERpciIsIHNlbGYudnNiYXNlICsgciJcU2V0dXBcVlMiLCAicHJvZHVjdGRpciIpCisgICAgICAgIHNlbGYuc2V0X21hY3JvKCJGcmFtZXdvcmtEaXIiLCBORVRfQkFTRSwgImluc3RhbGxyb290IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgdmVyc2lvbiA+PSA4LjA6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRfbWFjcm8oIkZyYW1ld29ya1NES0RpciIsIE5FVF9CQVNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZGtpbnN0YWxscm9vdHYyLjAiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcigic2RraW5zdGFsbHJvb3R2Mi4wIikKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigKKyAgICAgICAgICAgICIiIlB5dGhvbiB3YXMgYnVpbHQgd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMDg7CitleHRlbnNpb25zIG11c3QgYmUgYnVpbHQgd2l0aCBhIGNvbXBpbGVyIHRoYW4gY2FuIGdlbmVyYXRlIGNvbXBhdGlibGUgYmluYXJpZXMuCitWaXN1YWwgU3R1ZGlvIDIwMDggd2FzIG5vdCBmb3VuZCBvbiB0aGlzIHN5c3RlbS4gSWYgeW91IGhhdmUgQ3lnd2luIGluc3RhbGxlZCwKK3lvdSBjYW4gdHJ5IGNvbXBpbGluZyB3aXRoIE1pbmdXMzIsIGJ5IHBhc3NpbmcgIi1jIG1pbmd3MzIiIHRvIHNldHVwLnB5LiIiIikKKworICAgICAgICBpZiB2ZXJzaW9uID49IDkuMDoKKyAgICAgICAgICAgIHNlbGYuc2V0X21hY3JvKCJGcmFtZXdvcmtWZXJzaW9uIiwgc2VsZi52c2Jhc2UsICJjbHIgdmVyc2lvbiIpCisgICAgICAgICAgICBzZWxmLnNldF9tYWNybygiV2luZG93c1Nka0RpciIsIFdJTlNES19CQVNFLCAiY3VycmVudGluc3RhbGxmb2xkZXIiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcCA9IHIiU29mdHdhcmVcTWljcm9zb2Z0XE5FVCBGcmFtZXdvcmsgU2V0dXBcUHJvZHVjdCIKKyAgICAgICAgICAgIGZvciBiYXNlIGluIEhLRVlTOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaCA9IFJlZ09wZW5LZXlFeChiYXNlLCBwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBSZWdFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBrZXkgPSBSZWdFbnVtS2V5KGgsIDApCisgICAgICAgICAgICAgICAgZCA9IFJlZy5nZXRfdmFsdWUoYmFzZSwgciIlc1wlcyIgJSAocCwga2V5KSkKKyAgICAgICAgICAgICAgICBzZWxmLm1hY3Jvc1siJChGcmFtZXdvcmtWZXJzaW9uKSJdID0gZFsidmVyc2lvbiJdCisKKyAgICBkZWYgc3ViKHNlbGYsIHMpOgorICAgICAgICBmb3IgaywgdiBpbiBzZWxmLm1hY3Jvcy5pdGVtcygpOgorICAgICAgICAgICAgcyA9IHMucmVwbGFjZShrLCB2KQorICAgICAgICByZXR1cm4gcworCitkZWYgZ2V0X2J1aWxkX3ZlcnNpb24oKToKKyAgICAiIiJSZXR1cm4gdGhlIHZlcnNpb24gb2YgTVNWQyB0aGF0IHdhcyB1c2VkIHRvIGJ1aWxkIFB5dGhvbi4KKworICAgIEZvciBQeXRob24gMi4zIGFuZCB1cCwgdGhlIHZlcnNpb24gbnVtYmVyIGlzIGluY2x1ZGVkIGluCisgICAgc3lzLnZlcnNpb24uICBGb3IgZWFybGllciB2ZXJzaW9ucywgYXNzdW1lIHRoZSBjb21waWxlciBpcyBNU1ZDIDYuCisgICAgIiIiCisgICAgcHJlZml4ID0gIk1TQyB2LiIKKyAgICBpID0gc3lzLnZlcnNpb24uZmluZChwcmVmaXgpCisgICAgaWYgaSA9PSAtMToKKyAgICAgICAgcmV0dXJuIDYKKyAgICBpID0gaSArIGxlbihwcmVmaXgpCisgICAgcywgcmVzdCA9IHN5cy52ZXJzaW9uW2k6XS5zcGxpdCgiICIsIDEpCisgICAgbWFqb3JWZXJzaW9uID0gaW50KHNbOi0yXSkgLSA2CisgICAgbWlub3JWZXJzaW9uID0gaW50KHNbMjozXSkgLyAxMC4wCisgICAgIyBJIGRvbid0IHRoaW5rIHBhdGhzIGFyZSBhZmZlY3RlZCBieSBtaW5vciB2ZXJzaW9uIGluIHZlcnNpb24gNgorICAgIGlmIG1ham9yVmVyc2lvbiA9PSA2OgorICAgICAgICBtaW5vclZlcnNpb24gPSAwCisgICAgaWYgbWFqb3JWZXJzaW9uID49IDY6CisgICAgICAgIHJldHVybiBtYWpvclZlcnNpb24gKyBtaW5vclZlcnNpb24KKyAgICAjIGVsc2Ugd2UgZG9uJ3Qga25vdyB3aGF0IHZlcnNpb24gb2YgdGhlIGNvbXBpbGVyIHRoaXMgaXMKKyAgICByZXR1cm4gTm9uZQorCitkZWYgbm9ybWFsaXplX2FuZF9yZWR1Y2VfcGF0aHMocGF0aHMpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygbm9ybWFsaXplZCBwYXRocyB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZC4KKworICAgIFRoZSBjdXJyZW50IG9yZGVyIG9mIHBhdGhzIGlzIG1haW50YWluZWQuCisgICAgIiIiCisgICAgIyBQYXRocyBhcmUgbm9ybWFsaXplZCBzbyB0aGluZ3MgbGlrZTogIC9hIGFuZCAvYS8gYXJlbid0IGJvdGggcHJlc2VydmVkLgorICAgIHJlZHVjZWRfcGF0aHMgPSBbXQorICAgIGZvciBwIGluIHBhdGhzOgorICAgICAgICBucCA9IG9zLnBhdGgubm9ybXBhdGgocCkKKyAgICAgICAgIyBYWFgobm5vcndpdHopOiBPKG4qKjIpLCBpZiByZWR1Y2VkX3BhdGhzIGdldHMgbG9uZyBwZXJoYXBzIHVzZSBhIHNldC4KKyAgICAgICAgaWYgbnAgbm90IGluIHJlZHVjZWRfcGF0aHM6CisgICAgICAgICAgICByZWR1Y2VkX3BhdGhzLmFwcGVuZChucCkKKyAgICByZXR1cm4gcmVkdWNlZF9wYXRocworCitkZWYgcmVtb3ZlRHVwbGljYXRlcyh2YXJpYWJsZSk6CisgICAgIiIiUmVtb3ZlIGR1cGxpY2F0ZSB2YWx1ZXMgb2YgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgIiIiCisgICAgb2xkTGlzdCA9IHZhcmlhYmxlLnNwbGl0KG9zLnBhdGhzZXApCisgICAgbmV3TGlzdCA9IFtdCisgICAgZm9yIGkgaW4gb2xkTGlzdDoKKyAgICAgICAgaWYgaSBub3QgaW4gbmV3TGlzdDoKKyAgICAgICAgICAgIG5ld0xpc3QuYXBwZW5kKGkpCisgICAgbmV3VmFyaWFibGUgPSBvcy5wYXRoc2VwLmpvaW4obmV3TGlzdCkKKyAgICByZXR1cm4gbmV3VmFyaWFibGUKKworZGVmIGZpbmRfdmN2YXJzYWxsKHZlcnNpb24pOgorICAgICIiIkZpbmQgdGhlIHZjdmFyc2FsbC5iYXQgZmlsZQorCisgICAgQXQgZmlyc3QgaXQgdHJpZXMgdG8gZmluZCB0aGUgcHJvZHVjdGRpciBvZiBWUyAyMDA4IGluIHRoZSByZWdpc3RyeS4gSWYKKyAgICB0aGF0IGZhaWxzIGl0IGZhbGxzIGJhY2sgdG8gdGhlIFZTOTBDT01OVE9PTFMgZW52IHZhci4KKyAgICAiIiIKKyAgICB2c2Jhc2UgPSBWU19CQVNFICUgdmVyc2lvbgorICAgIHRyeToKKyAgICAgICAgcHJvZHVjdGRpciA9IFJlZy5nZXRfdmFsdWUociIlc1xTZXR1cFxWQyIgJSB2c2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kdWN0ZGlyIikKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHByb2R1Y3RkaXIgPSBOb25lCisKKyAgICAjIHRyeWluZyBFeHByZXNzIGVkaXRpb24KKyAgICBpZiBwcm9kdWN0ZGlyIGlzIE5vbmU6CisgICAgICAgIHZzYmFzZSA9IFZTRVhQUkVTU19CQVNFICUgdmVyc2lvbgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm9kdWN0ZGlyID0gUmVnLmdldF92YWx1ZShyIiVzXFNldHVwXFZDIiAlIHZzYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kdWN0ZGlyIikKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcHJvZHVjdGRpciA9IE5vbmUKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiVW5hYmxlIHRvIGZpbmQgcHJvZHVjdGRpciBpbiByZWdpc3RyeSIpCisKKyAgICBpZiBub3QgcHJvZHVjdGRpciBvciBub3Qgb3MucGF0aC5pc2Rpcihwcm9kdWN0ZGlyKToKKyAgICAgICAgdG9vbHNrZXkgPSAiVlMlMC5mMENPTU5UT09MUyIgJSB2ZXJzaW9uCisgICAgICAgIHRvb2xzZGlyID0gb3MuZW52aXJvbi5nZXQodG9vbHNrZXksIE5vbmUpCisKKyAgICAgICAgaWYgdG9vbHNkaXIgYW5kIG9zLnBhdGguaXNkaXIodG9vbHNkaXIpOgorICAgICAgICAgICAgcHJvZHVjdGRpciA9IG9zLnBhdGguam9pbih0b29sc2Rpciwgb3MucGFyZGlyLCBvcy5wYXJkaXIsICJWQyIpCisgICAgICAgICAgICBwcm9kdWN0ZGlyID0gb3MucGF0aC5hYnNwYXRoKHByb2R1Y3RkaXIpCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcihwcm9kdWN0ZGlyKToKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIiVzIGlzIG5vdCBhIHZhbGlkIGRpcmVjdG9yeSIgJSBwcm9kdWN0ZGlyKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2cuZGVidWcoIkVudiB2YXIgJXMgaXMgbm90IHNldCBvciBpbnZhbGlkIiAlIHRvb2xza2V5KQorICAgIGlmIG5vdCBwcm9kdWN0ZGlyOgorICAgICAgICBsb2cuZGVidWcoIk5vIHByb2R1Y3RkaXIgZm91bmQiKQorICAgICAgICByZXR1cm4gTm9uZQorICAgIHZjdmFyc2FsbCA9IG9zLnBhdGguam9pbihwcm9kdWN0ZGlyLCAidmN2YXJzYWxsLmJhdCIpCisgICAgaWYgb3MucGF0aC5pc2ZpbGUodmN2YXJzYWxsKToKKyAgICAgICAgcmV0dXJuIHZjdmFyc2FsbAorICAgIGxvZy5kZWJ1ZygiVW5hYmxlIHRvIGZpbmQgdmN2YXJzYWxsLmJhdCIpCisgICAgcmV0dXJuIE5vbmUKKworZGVmIHF1ZXJ5X3ZjdmFyc2FsbCh2ZXJzaW9uLCBhcmNoPSJ4ODYiKToKKyAgICAiIiJMYXVuY2ggdmN2YXJzYWxsLmJhdCBhbmQgcmVhZCB0aGUgc2V0dGluZ3MgZnJvbSBpdHMgZW52aXJvbm1lbnQKKyAgICAiIiIKKyAgICB2Y3ZhcnNhbGwgPSBmaW5kX3ZjdmFyc2FsbCh2ZXJzaW9uKQorICAgIGludGVyZXN0aW5nID0gc2V0KCgiaW5jbHVkZSIsICJsaWIiLCAibGlicGF0aCIsICJwYXRoIikpCisgICAgcmVzdWx0ID0ge30KKworICAgIGlmIHZjdmFyc2FsbCBpcyBOb25lOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKCJVbmFibGUgdG8gZmluZCB2Y3ZhcnNhbGwuYmF0IikKKyAgICBsb2cuZGVidWcoIkNhbGxpbmcgJ3ZjdmFyc2FsbC5iYXQgJXMnICh2ZXJzaW9uPSVzKSIsIGFyY2gsIHZlcnNpb24pCisgICAgcG9wZW4gPSBzdWJwcm9jZXNzLlBvcGVuKCciJXMiICVzICYgc2V0JyAlICh2Y3ZhcnNhbGwsIGFyY2gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgIHRyeToKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwb3Blbi5jb21tdW5pY2F0ZSgpCisgICAgICAgIGlmIHBvcGVuLndhaXQoKSAhPSAwOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihzdGRlcnIuZGVjb2RlKCJtYmNzIikpCisKKyAgICAgICAgc3Rkb3V0ID0gc3Rkb3V0LmRlY29kZSgibWJjcyIpCisgICAgICAgIGZvciBsaW5lIGluIHN0ZG91dC5zcGxpdCgiXG4iKToKKyAgICAgICAgICAgIGxpbmUgPSBSZWcuY29udmVydF9tYmNzKGxpbmUpCisgICAgICAgICAgICBpZiAnPScgbm90IGluIGxpbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgIGtleSwgdmFsdWUgPSBsaW5lLnNwbGl0KCc9JywgMSkKKyAgICAgICAgICAgIGtleSA9IGtleS5sb3dlcigpCisgICAgICAgICAgICBpZiBrZXkgaW4gaW50ZXJlc3Rpbmc6CisgICAgICAgICAgICAgICAgaWYgdmFsdWUuZW5kc3dpdGgob3MucGF0aHNlcCk6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbOi0xXQorICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gcmVtb3ZlRHVwbGljYXRlcyh2YWx1ZSkKKworICAgIGZpbmFsbHk6CisgICAgICAgIHBvcGVuLnN0ZG91dC5jbG9zZSgpCisgICAgICAgIHBvcGVuLnN0ZGVyci5jbG9zZSgpCisKKyAgICBpZiBsZW4ocmVzdWx0KSAhPSBsZW4oaW50ZXJlc3RpbmcpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKHN0cihsaXN0KHJlc3VsdC5rZXlzKCkpKSkKKworICAgIHJldHVybiByZXN1bHQKKworIyBNb3JlIGdsb2JhbHMKK1ZFUlNJT04gPSBnZXRfYnVpbGRfdmVyc2lvbigpCitpZiBWRVJTSU9OIDwgOC4wOgorICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoIlZDICUwLjFmIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBtb2R1bGUiICUgVkVSU0lPTikKKyMgTUFDUk9TID0gTWFjcm9FeHBhbmRlcihWRVJTSU9OKQorCitjbGFzcyBNU1ZDQ29tcGlsZXIoQ0NvbXBpbGVyKSA6CisgICAgIiIiQ29uY3JldGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGFuIGludGVyZmFjZSB0byBNaWNyb3NvZnQgVmlzdWFsIEMrKywKKyAgICAgICBhcyBkZWZpbmVkIGJ5IHRoZSBDQ29tcGlsZXIgYWJzdHJhY3QgY2xhc3MuIiIiCisKKyAgICBjb21waWxlcl90eXBlID0gJ21zdmMnCisKKyAgICAjIEp1c3Qgc2V0IHRoaXMgc28gQ0NvbXBpbGVyJ3MgY29uc3RydWN0b3IgZG9lc24ndCBiYXJmLiAgV2UgY3VycmVudGx5CisgICAgIyBkb24ndCB1c2UgdGhlICdzZXRfZXhlY3V0YWJsZXMoKScgYnVyZWF1Y3JhY3kgcHJvdmlkZWQgYnkgQ0NvbXBpbGVyLAorICAgICMgYXMgaXQgcmVhbGx5IGlzbid0IG5lY2Vzc2FyeSBmb3IgdGhpcyBzb3J0IG9mIHNpbmdsZS1jb21waWxlciBjbGFzcy4KKyAgICAjIFdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIHdpdGggVW5peENDb21waWxlciwKKyAgICAjIHRob3VnaCwgc28gaXQncyB3b3J0aCB0aGlua2luZyBhYm91dC4KKyAgICBleGVjdXRhYmxlcyA9IHt9CisKKyAgICAjIFByaXZhdGUgY2xhc3MgZGF0YSAobmVlZCB0byBkaXN0aW5ndWlzaCBDIGZyb20gQysrIHNvdXJjZSBmb3IgY29tcGlsZXIpCisgICAgX2NfZXh0ZW5zaW9ucyA9IFsnLmMnXQorICAgIF9jcHBfZXh0ZW5zaW9ucyA9IFsnLmNjJywgJy5jcHAnLCAnLmN4eCddCisgICAgX3JjX2V4dGVuc2lvbnMgPSBbJy5yYyddCisgICAgX21jX2V4dGVuc2lvbnMgPSBbJy5tYyddCisKKyAgICAjIE5lZWRlZCBmb3IgdGhlIGZpbGVuYW1lIGdlbmVyYXRpb24gbWV0aG9kcyBwcm92aWRlZCBieSB0aGUKKyAgICAjIGJhc2UgY2xhc3MsIENDb21waWxlci4KKyAgICBzcmNfZXh0ZW5zaW9ucyA9IChfY19leHRlbnNpb25zICsgX2NwcF9leHRlbnNpb25zICsKKyAgICAgICAgICAgICAgICAgICAgICBfcmNfZXh0ZW5zaW9ucyArIF9tY19leHRlbnNpb25zKQorICAgIHJlc19leHRlbnNpb24gPSAnLnJlcycKKyAgICBvYmpfZXh0ZW5zaW9uID0gJy5vYmonCisgICAgc3RhdGljX2xpYl9leHRlbnNpb24gPSAnLmxpYicKKyAgICBzaGFyZWRfbGliX2V4dGVuc2lvbiA9ICcuZGxsJworICAgIHN0YXRpY19saWJfZm9ybWF0ID0gc2hhcmVkX2xpYl9mb3JtYXQgPSAnJXMlcycKKyAgICBleGVfZXh0ZW5zaW9uID0gJy5leGUnCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsIGZvcmNlPTApOgorICAgICAgICBDQ29tcGlsZXIuX19pbml0X18gKHNlbGYsIHZlcmJvc2UsIGRyeV9ydW4sIGZvcmNlKQorICAgICAgICBzZWxmLl9fdmVyc2lvbiA9IFZFUlNJT04KKyAgICAgICAgc2VsZi5fX3Jvb3QgPSByIlNvZnR3YXJlXE1pY3Jvc29mdFxWaXN1YWxTdHVkaW8iCisgICAgICAgICMgc2VsZi5fX21hY3JvcyA9IE1BQ1JPUworICAgICAgICBzZWxmLl9fcGF0aHMgPSBbXQorICAgICAgICAjIHRhcmdldCBwbGF0Zm9ybSAoLnBsYXRfbmFtZSBpcyBjb25zaXN0ZW50IHdpdGggJ2JkaXN0JykKKyAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBOb25lCisgICAgICAgIHNlbGYuX19hcmNoID0gTm9uZSAjIGRlcHJlY2F0ZWQgbmFtZQorICAgICAgICBzZWxmLmluaXRpYWxpemVkID0gRmFsc2UKKworICAgIGRlZiBpbml0aWFsaXplKHNlbGYsIHBsYXRfbmFtZT1Ob25lKToKKyAgICAgICAgIyBtdWx0aS1pbml0IG1lYW5zIHdlIHdvdWxkIG5lZWQgdG8gY2hlY2sgcGxhdGZvcm0gc2FtZSBlYWNoIHRpbWUuLi4KKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLmluaXRpYWxpemVkLCAiZG9uJ3QgaW5pdCBtdWx0aXBsZSB0aW1lcyIKKyAgICAgICAgaWYgcGxhdF9uYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBwbGF0X25hbWUgPSBnZXRfcGxhdGZvcm0oKQorICAgICAgICAjIHNhbml0eSBjaGVjayBmb3IgcGxhdGZvcm1zIHRvIHByZXZlbnQgb2JzY3VyZSBlcnJvcnMgbGF0ZXIuCisgICAgICAgIG9rX3BsYXRzID0gJ3dpbjMyJywgJ3dpbi1hbWQ2NCcsICd3aW4taWE2NCcKKyAgICAgICAgaWYgcGxhdF9uYW1lIG5vdCBpbiBva19wbGF0czoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoIi0tcGxhdC1uYW1lIG11c3QgYmUgb25lIG9mICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChva19wbGF0cywpKQorCisgICAgICAgIGlmICJESVNUVVRJTFNfVVNFX1NESyIgaW4gb3MuZW52aXJvbiBhbmQgIk1TU2RrIiBpbiBvcy5lbnZpcm9uIGFuZCBzZWxmLmZpbmRfZXhlKCJjbC5leGUiKToKKyAgICAgICAgICAgICMgQXNzdW1lIHRoYXQgdGhlIFNESyBzZXQgdXAgZXZlcnl0aGluZyBhbHJpZ2h0OyBkb24ndCB0cnkgdG8gYmUKKyAgICAgICAgICAgICMgc21hcnRlcgorICAgICAgICAgICAgc2VsZi5jYyA9ICJjbC5leGUiCisgICAgICAgICAgICBzZWxmLmxpbmtlciA9ICJsaW5rLmV4ZSIKKyAgICAgICAgICAgIHNlbGYubGliID0gImxpYi5leGUiCisgICAgICAgICAgICBzZWxmLnJjID0gInJjLmV4ZSIKKyAgICAgICAgICAgIHNlbGYubWMgPSAibWMuZXhlIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBPbiB4ODYsICd2Y3ZhcnMzMi5iYXQgYW1kNjQnIGNyZWF0ZXMgYW4gZW52IHRoYXQgZG9lc24ndCB3b3JrOworICAgICAgICAgICAgIyB0byBjcm9zcyBjb21waWxlLCB5b3UgdXNlICd4ODZfYW1kNjQnLgorICAgICAgICAgICAgIyBPbiBBTUQ2NCwgJ3ZjdmFyczMyLmJhdCBhbWQ2NCcgaXMgYSBuYXRpdmUgYnVpbGQgZW52OyB0byBjcm9zcworICAgICAgICAgICAgIyBjb21waWxlIHVzZSAneDg2JyAoaWUsIGl0IHJ1bnMgdGhlIHg4NiBjb21waWxlciBkaXJlY3RseSkKKyAgICAgICAgICAgICMgTm8gaWRlYSBob3cgaXRhbml1bSBoYW5kbGVzIHRoaXMsIGlmIGF0IGFsbC4KKyAgICAgICAgICAgIGlmIHBsYXRfbmFtZSA9PSBnZXRfcGxhdGZvcm0oKSBvciBwbGF0X25hbWUgPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgICAgICAjIG5hdGl2ZSBidWlsZCBvciBjcm9zcy1jb21waWxlIHRvIHdpbjMyCisgICAgICAgICAgICAgICAgcGxhdF9zcGVjID0gUExBVF9UT19WQ1ZBUlNbcGxhdF9uYW1lXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGNyb3NzIGNvbXBpbGUgZnJvbSB3aW4zMiAtPiBzb21lIDY0Yml0CisgICAgICAgICAgICAgICAgcGxhdF9zcGVjID0gUExBVF9UT19WQ1ZBUlNbZ2V0X3BsYXRmb3JtKCldICsgJ18nICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMQVRfVE9fVkNWQVJTW3BsYXRfbmFtZV0KKworICAgICAgICAgICAgdmNfZW52ID0gcXVlcnlfdmN2YXJzYWxsKFZFUlNJT04sIHBsYXRfc3BlYykKKworICAgICAgICAgICAgIyB0YWtlIGNhcmUgdG8gb25seSB1c2Ugc3RyaW5ncyBpbiB0aGUgZW52aXJvbm1lbnQuCisgICAgICAgICAgICBzZWxmLl9fcGF0aHMgPSB2Y19lbnZbJ3BhdGgnXS5lbmNvZGUoJ21iY3MnKS5zcGxpdChvcy5wYXRoc2VwKQorICAgICAgICAgICAgb3MuZW52aXJvblsnbGliJ10gPSB2Y19lbnZbJ2xpYiddLmVuY29kZSgnbWJjcycpCisgICAgICAgICAgICBvcy5lbnZpcm9uWydpbmNsdWRlJ10gPSB2Y19lbnZbJ2luY2x1ZGUnXS5lbmNvZGUoJ21iY3MnKQorCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5fX3BhdGhzKSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoIlB5dGhvbiB3YXMgYnVpbHQgd2l0aCAlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAiYW5kIGV4dGVuc2lvbnMgbmVlZCB0byBiZSBidWlsdCB3aXRoIHRoZSBzYW1lICIKKyAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gb2YgdGhlIGNvbXBpbGVyLCBidXQgaXQgaXNuJ3QgaW5zdGFsbGVkLiIKKyAgICAgICAgICAgICAgICAgICAgICAgJSBzZWxmLl9fcHJvZHVjdCkKKworICAgICAgICAgICAgc2VsZi5jYyA9IHNlbGYuZmluZF9leGUoImNsLmV4ZSIpCisgICAgICAgICAgICBzZWxmLmxpbmtlciA9IHNlbGYuZmluZF9leGUoImxpbmsuZXhlIikKKyAgICAgICAgICAgIHNlbGYubGliID0gc2VsZi5maW5kX2V4ZSgibGliLmV4ZSIpCisgICAgICAgICAgICBzZWxmLnJjID0gc2VsZi5maW5kX2V4ZSgicmMuZXhlIikgICAjIHJlc291cmNlIGNvbXBpbGVyCisgICAgICAgICAgICBzZWxmLm1jID0gc2VsZi5maW5kX2V4ZSgibWMuZXhlIikgICAjIG1lc3NhZ2UgY29tcGlsZXIKKyAgICAgICAgICAgICNzZWxmLnNldF9wYXRoX2Vudl92YXIoJ2xpYicpCisgICAgICAgICAgICAjc2VsZi5zZXRfcGF0aF9lbnZfdmFyKCdpbmNsdWRlJykKKworICAgICAgICAjIGV4dGVuZCB0aGUgTVNWQyBwYXRoIHdpdGggdGhlIGN1cnJlbnQgcGF0aAorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgcCBpbiBvcy5lbnZpcm9uWydwYXRoJ10uc3BsaXQoJzsnKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fcGF0aHMuYXBwZW5kKHApCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5fX3BhdGhzID0gbm9ybWFsaXplX2FuZF9yZWR1Y2VfcGF0aHMoc2VsZi5fX3BhdGhzKQorICAgICAgICBvcy5lbnZpcm9uWydwYXRoJ10gPSAiOyIuam9pbihzZWxmLl9fcGF0aHMpCisKKyAgICAgICAgc2VsZi5wcmVwcm9jZXNzX29wdGlvbnMgPSBOb25lCisgICAgICAgIGlmIHNlbGYuX19hcmNoID09ICJ4ODYiOgorICAgICAgICAgICAgc2VsZi5jb21waWxlX29wdGlvbnMgPSBbICcvbm9sb2dvJywgJy9PeCcsICcvTUQnLCAnL1czJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL0ROREVCVUcnXQorICAgICAgICAgICAgc2VsZi5jb21waWxlX29wdGlvbnNfZGVidWcgPSBbJy9ub2xvZ28nLCAnL09kJywgJy9NRGQnLCAnL1czJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvWjcnLCAnL0RfREVCVUcnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBXaW42NAorICAgICAgICAgICAgc2VsZi5jb21waWxlX29wdGlvbnMgPSBbICcvbm9sb2dvJywgJy9PeCcsICcvTUQnLCAnL1czJywgJy9HUy0nICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL0ROREVCVUcnXQorICAgICAgICAgICAgc2VsZi5jb21waWxlX29wdGlvbnNfZGVidWcgPSBbJy9ub2xvZ28nLCAnL09kJywgJy9NRGQnLCAnL1czJywgJy9HUy0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9aNycsICcvRF9ERUJVRyddCisKKyAgICAgICAgc2VsZi5sZGZsYWdzX3NoYXJlZCA9IFsnL0RMTCcsICcvbm9sb2dvJywgJy9JTkNSRU1FTlRBTDpOTyddCisgICAgICAgIGlmIHNlbGYuX192ZXJzaW9uID49IDc6CisgICAgICAgICAgICBzZWxmLmxkZmxhZ3Nfc2hhcmVkX2RlYnVnID0gWworICAgICAgICAgICAgICAgICcvRExMJywgJy9ub2xvZ28nLCAnL0lOQ1JFTUVOVEFMOm5vJywgJy9ERUJVRycsICcvcGRiOk5vbmUnCisgICAgICAgICAgICAgICAgXQorICAgICAgICBzZWxmLmxkZmxhZ3Nfc3RhdGljID0gWyAnL25vbG9nbyddCisKKyAgICAgICAgc2VsZi5pbml0aWFsaXplZCA9IFRydWUKKworICAgICMgLS0gV29ya2VyIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgb2JqZWN0X2ZpbGVuYW1lcyhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9maWxlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBfZGlyPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj0nJyk6CisgICAgICAgICMgQ29waWVkIGZyb20gY2NvbXBpbGVyLnB5LCBleHRlbmRlZCB0byByZXR1cm4gLnJlcyBhcyAnb2JqZWN0Jy1maWxlCisgICAgICAgICMgZm9yIC5yYyBpbnB1dCBmaWxlCisgICAgICAgIGlmIG91dHB1dF9kaXIgaXMgTm9uZTogb3V0cHV0X2RpciA9ICcnCisgICAgICAgIG9ial9uYW1lcyA9IFtdCisgICAgICAgIGZvciBzcmNfbmFtZSBpbiBzb3VyY2VfZmlsZW5hbWVzOgorICAgICAgICAgICAgKGJhc2UsIGV4dCkgPSBvcy5wYXRoLnNwbGl0ZXh0IChzcmNfbmFtZSkKKyAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLnNwbGl0ZHJpdmUoYmFzZSlbMV0gIyBDaG9wIG9mZiB0aGUgZHJpdmUKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlW29zLnBhdGguaXNhYnMoYmFzZSk6XSAgIyBJZiBhYnMsIGNob3Agb2ZmIGxlYWRpbmcgLworICAgICAgICAgICAgaWYgZXh0IG5vdCBpbiBzZWxmLnNyY19leHRlbnNpb25zOgorICAgICAgICAgICAgICAgICMgQmV0dGVyIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIHNpbGVudGx5IGNvbnRpbnVpbmcKKyAgICAgICAgICAgICAgICAjIGFuZCBsYXRlciBjb21wbGFpbiBhYm91dCBzb3VyY2VzIGFuZCB0YXJnZXRzIGhhdmluZworICAgICAgICAgICAgICAgICMgZGlmZmVyZW50IGxlbmd0aHMKKyAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IgKCJEb24ndCBrbm93IGhvdyB0byBjb21waWxlICVzIiAlIHNyY19uYW1lKQorICAgICAgICAgICAgaWYgc3RyaXBfZGlyOgorICAgICAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLmJhc2VuYW1lIChiYXNlKQorICAgICAgICAgICAgaWYgZXh0IGluIHNlbGYuX3JjX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgb2JqX25hbWVzLmFwcGVuZCAob3MucGF0aC5qb2luIChvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIHNlbGYucmVzX2V4dGVuc2lvbikpCisgICAgICAgICAgICBlbGlmIGV4dCBpbiBzZWxmLl9tY19leHRlbnNpb25zOgorICAgICAgICAgICAgICAgIG9ial9uYW1lcy5hcHBlbmQgKG9zLnBhdGguam9pbiAob3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBzZWxmLnJlc19leHRlbnNpb24pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvYmpfbmFtZXMuYXBwZW5kIChvcy5wYXRoLmpvaW4gKG91dHB1dF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgc2VsZi5vYmpfZXh0ZW5zaW9uKSkKKyAgICAgICAgcmV0dXJuIG9ial9uYW1lcworCisKKyAgICBkZWYgY29tcGlsZShzZWxmLCBzb3VyY2VzLAorICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9Tm9uZSwgbWFjcm9zPU5vbmUsIGluY2x1ZGVfZGlycz1Ob25lLCBkZWJ1Zz0wLAorICAgICAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgZGVwZW5kcz1Ob25lKToKKworICAgICAgICBpZiBub3Qgc2VsZi5pbml0aWFsaXplZDoKKyAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6ZSgpCisgICAgICAgIGNvbXBpbGVfaW5mbyA9IHNlbGYuX3NldHVwX2NvbXBpbGUob3V0cHV0X2RpciwgbWFjcm9zLCBpbmNsdWRlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcywgZGVwZW5kcywgZXh0cmFfcG9zdGFyZ3MpCisgICAgICAgIG1hY3Jvcywgb2JqZWN0cywgZXh0cmFfcG9zdGFyZ3MsIHBwX29wdHMsIGJ1aWxkID0gY29tcGlsZV9pbmZvCisKKyAgICAgICAgY29tcGlsZV9vcHRzID0gZXh0cmFfcHJlYXJncyBvciBbXQorICAgICAgICBjb21waWxlX29wdHMuYXBwZW5kICgnL2MnKQorICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgIGNvbXBpbGVfb3B0cy5leHRlbmQoc2VsZi5jb21waWxlX29wdGlvbnNfZGVidWcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb21waWxlX29wdHMuZXh0ZW5kKHNlbGYuY29tcGlsZV9vcHRpb25zKQorCisgICAgICAgIGZvciBvYmogaW4gb2JqZWN0czoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzcmMsIGV4dCA9IGJ1aWxkW29ial0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICAgICAgIyBwYXNzIHRoZSBmdWxsIHBhdGhuYW1lIHRvIE1TVkMgaW4gZGVidWcgbW9kZSwKKyAgICAgICAgICAgICAgICAjIHRoaXMgYWxsb3dzIHRoZSBkZWJ1Z2dlciB0byBmaW5kIHRoZSBzb3VyY2UgZmlsZQorICAgICAgICAgICAgICAgICMgd2l0aG91dCBhc2tpbmcgdGhlIHVzZXIgdG8gYnJvd3NlIGZvciBpdAorICAgICAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguYWJzcGF0aChzcmMpCisKKyAgICAgICAgICAgIGlmIGV4dCBpbiBzZWxmLl9jX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgaW5wdXRfb3B0ID0gIi9UYyIgKyBzcmMKKyAgICAgICAgICAgIGVsaWYgZXh0IGluIHNlbGYuX2NwcF9leHRlbnNpb25zOgorICAgICAgICAgICAgICAgIGlucHV0X29wdCA9ICIvVHAiICsgc3JjCisgICAgICAgICAgICBlbGlmIGV4dCBpbiBzZWxmLl9yY19leHRlbnNpb25zOgorICAgICAgICAgICAgICAgICMgY29tcGlsZSAuUkMgdG8gLlJFUyBmaWxlCisgICAgICAgICAgICAgICAgaW5wdXRfb3B0ID0gc3JjCisgICAgICAgICAgICAgICAgb3V0cHV0X29wdCA9ICIvZm8iICsgb2JqCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNwYXduKFtzZWxmLnJjXSArIHBwX29wdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRwdXRfb3B0XSArIFtpbnB1dF9vcHRdKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29tcGlsZUVycm9yKG1zZykKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBleHQgaW4gc2VsZi5fbWNfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICAjIENvbXBpbGUgLk1DIHRvIC5SQyBmaWxlIHRvIC5SRVMgZmlsZS4KKyAgICAgICAgICAgICAgICAjICAgKiAnLWggZGlyJyBzcGVjaWZpZXMgdGhlIGRpcmVjdG9yeSBmb3IgdGhlCisgICAgICAgICAgICAgICAgIyAgICAgZ2VuZXJhdGVkIGluY2x1ZGUgZmlsZQorICAgICAgICAgICAgICAgICMgICAqICctciBkaXInIHNwZWNpZmllcyB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBvZiB0aGUKKyAgICAgICAgICAgICAgICAjICAgICBnZW5lcmF0ZWQgUkMgZmlsZSBhbmQgdGhlIGJpbmFyeSBtZXNzYWdlIHJlc291cmNlCisgICAgICAgICAgICAgICAgIyAgICAgaXQgaW5jbHVkZXMKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBGb3Igbm93IChzaW5jZSB0aGVyZSBhcmUgbm8gb3B0aW9ucyB0byBjaGFuZ2UgdGhpcyksCisgICAgICAgICAgICAgICAgIyB3ZSB1c2UgdGhlIHNvdXJjZS1kaXJlY3RvcnkgZm9yIHRoZSBpbmNsdWRlIGZpbGUgYW5kCisgICAgICAgICAgICAgICAgIyB0aGUgYnVpbGQgZGlyZWN0b3J5IGZvciB0aGUgUkMgZmlsZSBhbmQgbWVzc2FnZQorICAgICAgICAgICAgICAgICMgcmVzb3VyY2VzLiBUaGlzIHdvcmtzIGF0IGxlYXN0IGZvciB3aW4zMmFsbC4KKyAgICAgICAgICAgICAgICBoX2RpciA9IG9zLnBhdGguZGlybmFtZShzcmMpCisgICAgICAgICAgICAgICAgcmNfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9iaikKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgZmlyc3QgY29tcGlsZSAuTUMgdG8gLlJDIGFuZCAuSCBmaWxlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24oW3NlbGYubWNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJy1oJywgaF9kaXIsICctcicsIHJjX2Rpcl0gKyBbc3JjXSkKKyAgICAgICAgICAgICAgICAgICAgYmFzZSwgXyA9IG9zLnBhdGguc3BsaXRleHQgKG9zLnBhdGguYmFzZW5hbWUgKHNyYykpCisgICAgICAgICAgICAgICAgICAgIHJjX2ZpbGUgPSBvcy5wYXRoLmpvaW4gKHJjX2RpciwgYmFzZSArICcucmMnKQorICAgICAgICAgICAgICAgICAgICAjIHRoZW4gY29tcGlsZSAuUkMgdG8gLlJFUyBmaWxlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24oW3NlbGYucmNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIi9mbyIgKyBvYmpdICsgW3JjX2ZpbGVdKQorCisgICAgICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IobXNnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgaG93IHRvIGhhbmRsZSB0aGlzIGZpbGU/CisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcGlsZUVycm9yKCJEb24ndCBrbm93IGhvdyB0byBjb21waWxlICVzIHRvICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzcmMsIG9iaikpCisKKyAgICAgICAgICAgIG91dHB1dF9vcHQgPSAiL0ZvIiArIG9iagorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24oW3NlbGYuY2NdICsgY29tcGlsZV9vcHRzICsgcHBfb3B0cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRfb3B0LCBvdXRwdXRfb3B0XSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IobXNnKQorCisgICAgICAgIHJldHVybiBvYmplY3RzCisKKworICAgIGRlZiBjcmVhdGVfc3RhdGljX2xpYihzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfbGlibmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbGFuZz1Ob25lKToKKworICAgICAgICBpZiBub3Qgc2VsZi5pbml0aWFsaXplZDoKKyAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6ZSgpCisgICAgICAgIChvYmplY3RzLCBvdXRwdXRfZGlyKSA9IHNlbGYuX2ZpeF9vYmplY3RfYXJncyhvYmplY3RzLCBvdXRwdXRfZGlyKQorICAgICAgICBvdXRwdXRfZmlsZW5hbWUgPSBzZWxmLmxpYnJhcnlfZmlsZW5hbWUob3V0cHV0X2xpYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPW91dHB1dF9kaXIpCisKKyAgICAgICAgaWYgc2VsZi5fbmVlZF9saW5rKG9iamVjdHMsIG91dHB1dF9maWxlbmFtZSk6CisgICAgICAgICAgICBsaWJfYXJncyA9IG9iamVjdHMgKyBbJy9PVVQ6JyArIG91dHB1dF9maWxlbmFtZV0KKyAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgIHBhc3MgIyBYWFggd2hhdCBnb2VzIGhlcmU/CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zcGF3bihbc2VsZi5saWJdICsgbGliX2FyZ3MpCisgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcmFpc2UgTGliRXJyb3IobXNnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nLmRlYnVnKCJza2lwcGluZyAlcyAodXAtdG8tZGF0ZSkiLCBvdXRwdXRfZmlsZW5hbWUpCisKKworICAgIGRlZiBsaW5rKHNlbGYsCisgICAgICAgICAgICAgdGFyZ2V0X2Rlc2MsCisgICAgICAgICAgICAgb2JqZWN0cywKKyAgICAgICAgICAgICBvdXRwdXRfZmlsZW5hbWUsCisgICAgICAgICAgICAgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICAgICAgIGxpYnJhcmllcz1Ob25lLAorICAgICAgICAgICAgIGxpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHM9Tm9uZSwKKyAgICAgICAgICAgICBkZWJ1Zz0wLAorICAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICBleHRyYV9wb3N0YXJncz1Ob25lLAorICAgICAgICAgICAgIGJ1aWxkX3RlbXA9Tm9uZSwKKyAgICAgICAgICAgICB0YXJnZXRfbGFuZz1Ob25lKToKKworICAgICAgICBpZiBub3Qgc2VsZi5pbml0aWFsaXplZDoKKyAgICAgICAgICAgIHNlbGYuaW5pdGlhbGl6ZSgpCisgICAgICAgIChvYmplY3RzLCBvdXRwdXRfZGlyKSA9IHNlbGYuX2ZpeF9vYmplY3RfYXJncyhvYmplY3RzLCBvdXRwdXRfZGlyKQorICAgICAgICBmaXhlZF9hcmdzID0gc2VsZi5fZml4X2xpYl9hcmdzKGxpYnJhcmllcywgbGlicmFyeV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzKQorICAgICAgICAobGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzKSA9IGZpeGVkX2FyZ3MKKworICAgICAgICBpZiBydW50aW1lX2xpYnJhcnlfZGlyczoKKyAgICAgICAgICAgIHNlbGYud2FybiAoIkkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggJ3J1bnRpbWVfbGlicmFyeV9kaXJzJzogIgorICAgICAgICAgICAgICAgICAgICAgICArIHN0ciAocnVudGltZV9saWJyYXJ5X2RpcnMpKQorCisgICAgICAgIGxpYl9vcHRzID0gZ2VuX2xpYl9vcHRpb25zKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcykKKyAgICAgICAgaWYgb3V0cHV0X2RpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG91dHB1dF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCBvdXRwdXRfZmlsZW5hbWUpCisKKyAgICAgICAgaWYgc2VsZi5fbmVlZF9saW5rKG9iamVjdHMsIG91dHB1dF9maWxlbmFtZSk6CisgICAgICAgICAgICBpZiB0YXJnZXRfZGVzYyA9PSBDQ29tcGlsZXIuRVhFQ1VUQUJMRToKKyAgICAgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgbGRmbGFncyA9IHNlbGYubGRmbGFnc19zaGFyZWRfZGVidWdbMTpdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbGRmbGFncyA9IHNlbGYubGRmbGFnc19zaGFyZWRbMTpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgICAgICBsZGZsYWdzID0gc2VsZi5sZGZsYWdzX3NoYXJlZF9kZWJ1ZworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxkZmxhZ3MgPSBzZWxmLmxkZmxhZ3Nfc2hhcmVkCisKKyAgICAgICAgICAgIGV4cG9ydF9vcHRzID0gW10KKyAgICAgICAgICAgIGZvciBzeW0gaW4gKGV4cG9ydF9zeW1ib2xzIG9yIFtdKToKKyAgICAgICAgICAgICAgICBleHBvcnRfb3B0cy5hcHBlbmQoIi9FWFBPUlQ6IiArIHN5bSkKKworICAgICAgICAgICAgbGRfYXJncyA9IChsZGZsYWdzICsgbGliX29wdHMgKyBleHBvcnRfb3B0cyArCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMgKyBbJy9PVVQ6JyArIG91dHB1dF9maWxlbmFtZV0pCisKKyAgICAgICAgICAgICMgVGhlIE1TVkMgbGlua2VyIGdlbmVyYXRlcyAubGliIGFuZCAuZXhwIGZpbGVzLCB3aGljaCBjYW5ub3QgYmUKKyAgICAgICAgICAgICMgc3VwcHJlc3NlZCBieSBhbnkgbGlua2VyIHN3aXRjaGVzLiBUaGUgLmxpYiBmaWxlcyBtYXkgZXZlbiBiZQorICAgICAgICAgICAgIyBuZWVkZWQhIE1ha2Ugc3VyZSB0aGV5IGFyZSBnZW5lcmF0ZWQgaW4gdGhlIHRlbXBvcmFyeSBidWlsZAorICAgICAgICAgICAgIyBkaXJlY3RvcnkuIFNpbmNlIHRoZXkgaGF2ZSBkaWZmZXJlbnQgbmFtZXMgZm9yIGRlYnVnIGFuZCByZWxlYXNlCisgICAgICAgICAgICAjIGJ1aWxkcywgdGhleSBjYW4gZ28gaW50byB0aGUgc2FtZSBkaXJlY3RvcnkuCisgICAgICAgICAgICBidWlsZF90ZW1wID0gb3MucGF0aC5kaXJuYW1lKG9iamVjdHNbMF0pCisgICAgICAgICAgICBpZiBleHBvcnRfc3ltYm9scyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAoZGxsX25hbWUsIGRsbF9leHQpID0gb3MucGF0aC5zcGxpdGV4dCgKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShvdXRwdXRfZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgIGltcGxpYl9maWxlID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgICAgICAgICBidWlsZF90ZW1wLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZmlsZW5hbWUoZGxsX25hbWUpKQorICAgICAgICAgICAgICAgIGxkX2FyZ3MuYXBwZW5kICgnL0lNUExJQjonICsgaW1wbGliX2ZpbGUpCisKKyAgICAgICAgICAgIHNlbGYubWFuaWZlc3Rfc2V0dXBfbGRhcmdzKG91dHB1dF9maWxlbmFtZSwgYnVpbGRfdGVtcCwgbGRfYXJncykKKworICAgICAgICAgICAgaWYgZXh0cmFfcHJlYXJnczoKKyAgICAgICAgICAgICAgICBsZF9hcmdzWzowXSA9IGV4dHJhX3ByZWFyZ3MKKyAgICAgICAgICAgIGlmIGV4dHJhX3Bvc3RhcmdzOgorICAgICAgICAgICAgICAgIGxkX2FyZ3MuZXh0ZW5kKGV4dHJhX3Bvc3RhcmdzKQorCisgICAgICAgICAgICBzZWxmLm1rcGF0aChvcy5wYXRoLmRpcm5hbWUob3V0cHV0X2ZpbGVuYW1lKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNwYXduKFtzZWxmLmxpbmtlcl0gKyBsZF9hcmdzKQorICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHJhaXNlIExpbmtFcnJvcihtc2cpCisKKyAgICAgICAgICAgICMgZW1iZWQgdGhlIG1hbmlmZXN0CisgICAgICAgICAgICAjIFhYWCAtIHRoaXMgaXMgc29tZXdoYXQgZnJhZ2lsZSAtIGlmIG10LmV4ZSBmYWlscywgZGlzdHV0aWxzCisgICAgICAgICAgICAjIHdpbGwgc3RpbGwgY29uc2lkZXIgdGhlIERMTCB1cC10by1kYXRlLCBidXQgaXQgd2lsbCBub3QgaGF2ZSBhCisgICAgICAgICAgICAjIG1hbmlmZXN0LiAgTWF5YmUgd2Ugc2hvdWxkIGxpbmsgdG8gYSB0ZW1wIGZpbGU/ICBPVE9ILCB0aGF0CisgICAgICAgICAgICAjIGltcGxpZXMgYSBidWlsZCBlbnZpcm9ubWVudCBlcnJvciB0aGF0IHNob3VsZG4ndCBnbyB1bmRldGVjdGVkLgorICAgICAgICAgICAgbWZpbmZvID0gc2VsZi5tYW5pZmVzdF9nZXRfZW1iZWRfaW5mbyh0YXJnZXRfZGVzYywgbGRfYXJncykKKyAgICAgICAgICAgIGlmIG1maW5mbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBtZmZpbGVuYW1lLCBtZmlkID0gbWZpbmZvCisgICAgICAgICAgICAgICAgb3V0X2FyZyA9ICctb3V0cHV0cmVzb3VyY2U6JXM7JXMnICUgKG91dHB1dF9maWxlbmFtZSwgbWZpZCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24oWydtdC5leGUnLCAnLW5vbG9nbycsICctbWFuaWZlc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZmZpbGVuYW1lLCBvdXRfYXJnXSkKKyAgICAgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIExpbmtFcnJvcihtc2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2cuZGVidWcoInNraXBwaW5nICVzICh1cC10by1kYXRlKSIsIG91dHB1dF9maWxlbmFtZSkKKworICAgIGRlZiBtYW5pZmVzdF9zZXR1cF9sZGFyZ3Moc2VsZiwgb3V0cHV0X2ZpbGVuYW1lLCBidWlsZF90ZW1wLCBsZF9hcmdzKToKKyAgICAgICAgIyBJZiB3ZSBuZWVkIGEgbWFuaWZlc3QgYXQgYWxsLCBhbiBlbWJlZGRlZCBtYW5pZmVzdCBpcyByZWNvbW1lbmRlZC4KKyAgICAgICAgIyBTZWUgTVNETiBhcnRpY2xlIHRpdGxlZAorICAgICAgICAjICJIb3cgdG86IEVtYmVkIGEgTWFuaWZlc3QgSW5zaWRlIGEgQy9DKysgQXBwbGljYXRpb24iCisgICAgICAgICMgKGN1cnJlbnRseSBhdCBodHRwOi8vbXNkbjIubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMjM1NTkxKFZTLjgwKS5hc3B4KQorICAgICAgICAjIEFzayB0aGUgbGlua2VyIHRvIGdlbmVyYXRlIHRoZSBtYW5pZmVzdCBpbiB0aGUgdGVtcCBkaXIsIHNvCisgICAgICAgICMgd2UgY2FuIGNoZWNrIGl0LCBhbmQgcG9zc2libHkgZW1iZWQgaXQsIGxhdGVyLgorICAgICAgICB0ZW1wX21hbmlmZXN0ID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgICAgIGJ1aWxkX3RlbXAsCisgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShvdXRwdXRfZmlsZW5hbWUpICsgIi5tYW5pZmVzdCIpCisgICAgICAgIGxkX2FyZ3MuYXBwZW5kKCcvTUFOSUZFU1RGSUxFOicgKyB0ZW1wX21hbmlmZXN0KQorCisgICAgZGVmIG1hbmlmZXN0X2dldF9lbWJlZF9pbmZvKHNlbGYsIHRhcmdldF9kZXNjLCBsZF9hcmdzKToKKyAgICAgICAgIyBJZiBhIG1hbmlmZXN0IHNob3VsZCBiZSBlbWJlZGRlZCwgcmV0dXJuIGEgdHVwbGUgb2YKKyAgICAgICAgIyAobWFuaWZlc3RfZmlsZW5hbWUsIHJlc291cmNlX2lkKS4gIFJldHVybnMgTm9uZSBpZiBubyBtYW5pZmVzdAorICAgICAgICAjIHNob3VsZCBiZSBlbWJlZGRlZC4gIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNzgzMyBmb3Igd2h5CisgICAgICAgICMgd2Ugd2FudCB0byBhdm9pZCBhbnkgbWFuaWZlc3QgZm9yIGV4dGVuc2lvbiBtb2R1bGVzIGlmIHdlIGNhbikKKyAgICAgICAgZm9yIGFyZyBpbiBsZF9hcmdzOgorICAgICAgICAgICAgaWYgYXJnLnN0YXJ0c3dpdGgoIi9NQU5JRkVTVEZJTEU6Iik6CisgICAgICAgICAgICAgICAgdGVtcF9tYW5pZmVzdCA9IGFyZy5zcGxpdCgiOiIsIDEpWzFdCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgbm8gL01BTklGRVNURklMRSBzbyBub3RoaW5nIHRvIGRvLgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgdGFyZ2V0X2Rlc2MgPT0gQ0NvbXBpbGVyLkVYRUNVVEFCTEU6CisgICAgICAgICAgICAjIGJ5IGRlZmF1bHQsIGV4ZWN1dGFibGVzIGFsd2F5cyBnZXQgdGhlIG1hbmlmZXN0IHdpdGggdGhlCisgICAgICAgICAgICAjIENSVCByZWZlcmVuY2VkLgorICAgICAgICAgICAgbWZpZCA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgRXh0ZW5zaW9uIG1vZHVsZXMgdHJ5IGFuZCBhdm9pZCBhbnkgbWFuaWZlc3QgaWYgcG9zc2libGUuCisgICAgICAgICAgICBtZmlkID0gMgorICAgICAgICAgICAgdGVtcF9tYW5pZmVzdCA9IHNlbGYuX3JlbW92ZV92aXN1YWxfY19yZWYodGVtcF9tYW5pZmVzdCkKKyAgICAgICAgaWYgdGVtcF9tYW5pZmVzdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHRlbXBfbWFuaWZlc3QsIG1maWQKKworICAgIGRlZiBfcmVtb3ZlX3Zpc3VhbF9jX3JlZihzZWxmLCBtYW5pZmVzdF9maWxlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBSZW1vdmUgcmVmZXJlbmNlcyB0byB0aGUgVmlzdWFsIEMgcnVudGltZSwgc28gdGhleSB3aWxsCisgICAgICAgICAgICAjIGZhbGwgdGhyb3VnaCB0byB0aGUgVmlzdWFsIEMgZGVwZW5kZW5jeSBvZiBQeXRob24uZXhlLgorICAgICAgICAgICAgIyBUaGlzIHdheSwgd2hlbiBpbnN0YWxsZWQgZm9yIGEgcmVzdHJpY3RlZCB1c2VyIChlLmcuCisgICAgICAgICAgICAjIHJ1bnRpbWVzIGFyZSBub3QgaW4gV2luU3hTIGZvbGRlciwgYnV0IGluIFB5dGhvbidzIG93bgorICAgICAgICAgICAgIyBmb2xkZXIpLCB0aGUgcnVudGltZXMgZG8gbm90IG5lZWQgdG8gYmUgaW4gZXZlcnkgZm9sZGVyCisgICAgICAgICAgICAjIHdpdGggLnB5ZCdzLgorICAgICAgICAgICAgIyBSZXR1cm5zIGVpdGhlciB0aGUgZmlsZW5hbWUgb2YgdGhlIG1vZGlmaWVkIG1hbmlmZXN0IG9yCisgICAgICAgICAgICAjIE5vbmUgaWYgbm8gbWFuaWZlc3Qgc2hvdWxkIGJlIGVtYmVkZGVkLgorICAgICAgICAgICAgbWFuaWZlc3RfZiA9IG9wZW4obWFuaWZlc3RfZmlsZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtYW5pZmVzdF9idWYgPSBtYW5pZmVzdF9mLnJlYWQoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBtYW5pZmVzdF9mLmNsb3NlKCkKKyAgICAgICAgICAgIHBhdHRlcm4gPSByZS5jb21waWxlKAorICAgICAgICAgICAgICAgIHIiIiI8YXNzZW1ibHlJZGVudGl0eS4qP25hbWU9KCJ8JylNaWNyb3NvZnRcLiIiIlwKKyAgICAgICAgICAgICAgICByIiIiVkNcZHsyfVwuQ1JUKCJ8JykuKj8oLz58PC9hc3NlbWJseUlkZW50aXR5PikiIiIsCisgICAgICAgICAgICAgICAgcmUuRE9UQUxMKQorICAgICAgICAgICAgbWFuaWZlc3RfYnVmID0gcmUuc3ViKHBhdHRlcm4sICIiLCBtYW5pZmVzdF9idWYpCisgICAgICAgICAgICBwYXR0ZXJuID0gIjxkZXBlbmRlbnRBc3NlbWJseT5ccyo8L2RlcGVuZGVudEFzc2VtYmx5PiIKKyAgICAgICAgICAgIG1hbmlmZXN0X2J1ZiA9IHJlLnN1YihwYXR0ZXJuLCAiIiwgbWFuaWZlc3RfYnVmKQorICAgICAgICAgICAgIyBOb3cgc2VlIGlmIGFueSBvdGhlciBhc3NlbWJsaWVzIGFyZSByZWZlcmVuY2VkIC0gaWYgbm90LCB3ZQorICAgICAgICAgICAgIyBkb24ndCB3YW50IGEgbWFuaWZlc3QgZW1iZWRkZWQuCisgICAgICAgICAgICBwYXR0ZXJuID0gcmUuY29tcGlsZSgKKyAgICAgICAgICAgICAgICByIiIiPGFzc2VtYmx5SWRlbnRpdHkuKj9uYW1lPSg/OiJ8JykoLis/KSg/OiJ8JykiIiIKKyAgICAgICAgICAgICAgICByIiIiLio/KD86Lz58PC9hc3NlbWJseUlkZW50aXR5PikiIiIsIHJlLkRPVEFMTCkKKyAgICAgICAgICAgIGlmIHJlLnNlYXJjaChwYXR0ZXJuLCBtYW5pZmVzdF9idWYpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAgICAgbWFuaWZlc3RfZiA9IG9wZW4obWFuaWZlc3RfZmlsZSwgJ3cnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1hbmlmZXN0X2Yud3JpdGUobWFuaWZlc3RfYnVmKQorICAgICAgICAgICAgICAgIHJldHVybiBtYW5pZmVzdF9maWxlCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG1hbmlmZXN0X2YuY2xvc2UoKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICMgLS0gTWlzY2VsbGFuZW91cyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBUaGVzZSBhcmUgYWxsIHVzZWQgYnkgdGhlICdnZW5fbGliX29wdGlvbnMoKSBmdW5jdGlvbiwgaW4KKyAgICAjIGNjb21waWxlci5weS4KKworICAgIGRlZiBsaWJyYXJ5X2Rpcl9vcHRpb24oc2VsZiwgZGlyKToKKyAgICAgICAgcmV0dXJuICIvTElCUEFUSDoiICsgZGlyCisKKyAgICBkZWYgcnVudGltZV9saWJyYXJ5X2Rpcl9vcHRpb24oc2VsZiwgZGlyKToKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigKKyAgICAgICAgICAgICAgImRvbid0IGtub3cgaG93IHRvIHNldCBydW50aW1lIGxpYnJhcnkgc2VhcmNoIHBhdGggZm9yIE1TVkMrKyIpCisKKyAgICBkZWYgbGlicmFyeV9vcHRpb24oc2VsZiwgbGliKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGlicmFyeV9maWxlbmFtZShsaWIpCisKKworICAgIGRlZiBmaW5kX2xpYnJhcnlfZmlsZShzZWxmLCBkaXJzLCBsaWIsIGRlYnVnPTApOgorICAgICAgICAjIFByZWZlciBhIGRlYnVnZ2luZyBsaWJyYXJ5IGlmIGZvdW5kIChhbmQgcmVxdWVzdGVkKSwgYnV0IGRlYWwKKyAgICAgICAgIyB3aXRoIGl0IGlmIHdlIGRvbid0IGhhdmUgb25lLgorICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgIHRyeV9uYW1lcyA9IFtsaWIgKyAiX2QiLCBsaWJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnlfbmFtZXMgPSBbbGliXQorICAgICAgICBmb3IgZGlyIGluIGRpcnM6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiB0cnlfbmFtZXM6CisgICAgICAgICAgICAgICAgbGliZmlsZSA9IG9zLnBhdGguam9pbihkaXIsIHNlbGYubGlicmFyeV9maWxlbmFtZSAobmFtZSkpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobGliZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaWJmaWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE9vcHMsIGRpZG4ndCBmaW5kIGl0IGluICphbnkqIG9mICdkaXJzJworICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgSGVscGVyIG1ldGhvZHMgZm9yIHVzaW5nIHRoZSBNU1ZDIHJlZ2lzdHJ5IHNldHRpbmdzCisKKyAgICBkZWYgZmluZF9leGUoc2VsZiwgZXhlKToKKyAgICAgICAgIiIiUmV0dXJuIHBhdGggdG8gYW4gTVNWQyBleGVjdXRhYmxlIHByb2dyYW0uCisKKyAgICAgICAgVHJpZXMgdG8gZmluZCB0aGUgcHJvZ3JhbSBpbiBzZXZlcmFsIHBsYWNlczogZmlyc3QsIG9uZSBvZiB0aGUKKyAgICAgICAgTVNWQyBwcm9ncmFtIHNlYXJjaCBwYXRocyBmcm9tIHRoZSByZWdpc3RyeTsgbmV4dCwgdGhlIGRpcmVjdG9yaWVzCisgICAgICAgIGluIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSWYgYW55IG9mIHRob3NlIHdvcmssIHJldHVybiBhbgorICAgICAgICBhYnNvbHV0ZSBwYXRoIHRoYXQgaXMga25vd24gdG8gZXhpc3QuICBJZiBub25lIG9mIHRoZW0gd29yaywganVzdAorICAgICAgICByZXR1cm4gdGhlIG9yaWdpbmFsIHByb2dyYW0gbmFtZSwgJ2V4ZScuCisgICAgICAgICIiIgorICAgICAgICBmb3IgcCBpbiBzZWxmLl9fcGF0aHM6CisgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgocCksIGV4ZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZuKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZm4KKworICAgICAgICAjIGRpZG4ndCBmaW5kIGl0OyB0cnkgZXhpc3RpbmcgcGF0aAorICAgICAgICBmb3IgcCBpbiBvcy5lbnZpcm9uWydQYXRoJ10uc3BsaXQoJzsnKToKKyAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChwKSxleGUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmbik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZuCisKKyAgICAgICAgcmV0dXJuIGV4ZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Yzljb21waWxlci5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjOWNvbXBpbGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDNlZWZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Yzljb21waWxlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Yzljb21waWxlci5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjOWNvbXBpbGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTMzNTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Yzljb21waWxlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjlmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjY29tcGlsZXIucHkKQEAgLTAsMCArMSw2NTkgQEAKKyIiImRpc3R1dGlscy5tc3ZjY29tcGlsZXIKKworQ29udGFpbnMgTVNWQ0NvbXBpbGVyLCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgQ0NvbXBpbGVyIGNsYXNzCitmb3IgdGhlIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvLgorIiIiCisKKyMgV3JpdHRlbiBieSBQZXJyeSBTdG9sbAorIyBoYWNrZWQgYnkgUm9iaW4gQmVja2VyIGFuZCBUaG9tYXMgSGVsbGVyIHRvIGRvIGEgYmV0dGVyIGpvYiBvZgorIyAgIGZpbmRpbmcgRGV2U3R1ZGlvICh0aHJvdWdoIHRoZSByZWdpc3RyeSkKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHN0cmluZworCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IChEaXN0dXRpbHNFeGVjRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlRXJyb3IsIExpYkVycm9yLCBMaW5rRXJyb3IpCitmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IENDb21waWxlciwgZ2VuX2xpYl9vcHRpb25zCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKK19jYW5fcmVhZF9yZWcgPSAwCit0cnk6CisgICAgaW1wb3J0IF93aW5yZWcKKworICAgIF9jYW5fcmVhZF9yZWcgPSAxCisgICAgaGtleV9tb2QgPSBfd2lucmVnCisKKyAgICBSZWdPcGVuS2V5RXggPSBfd2lucmVnLk9wZW5LZXlFeAorICAgIFJlZ0VudW1LZXkgPSBfd2lucmVnLkVudW1LZXkKKyAgICBSZWdFbnVtVmFsdWUgPSBfd2lucmVnLkVudW1WYWx1ZQorICAgIFJlZ0Vycm9yID0gX3dpbnJlZy5lcnJvcgorCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgd2luMzJhcGkKKyAgICAgICAgaW1wb3J0IHdpbjMyY29uCisgICAgICAgIF9jYW5fcmVhZF9yZWcgPSAxCisgICAgICAgIGhrZXlfbW9kID0gd2luMzJjb24KKworICAgICAgICBSZWdPcGVuS2V5RXggPSB3aW4zMmFwaS5SZWdPcGVuS2V5RXgKKyAgICAgICAgUmVnRW51bUtleSA9IHdpbjMyYXBpLlJlZ0VudW1LZXkKKyAgICAgICAgUmVnRW51bVZhbHVlID0gd2luMzJhcGkuUmVnRW51bVZhbHVlCisgICAgICAgIFJlZ0Vycm9yID0gd2luMzJhcGkuZXJyb3IKKworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgbG9nLmluZm8oIldhcm5pbmc6IENhbid0IHJlYWQgcmVnaXN0cnkgdG8gZmluZCB0aGUgIgorICAgICAgICAgICAgICAgICAibmVjZXNzYXJ5IGNvbXBpbGVyIHNldHRpbmdcbiIKKyAgICAgICAgICAgICAgICAgIk1ha2Ugc3VyZSB0aGF0IFB5dGhvbiBtb2R1bGVzIF93aW5yZWcsICIKKyAgICAgICAgICAgICAgICAgIndpbjMyYXBpIG9yIHdpbjMyY29uIGFyZSBpbnN0YWxsZWQuIikKKyAgICAgICAgcGFzcworCitpZiBfY2FuX3JlYWRfcmVnOgorICAgIEhLRVlTID0gKGhrZXlfbW9kLkhLRVlfVVNFUlMsCisgICAgICAgICAgICAgaGtleV9tb2QuSEtFWV9DVVJSRU5UX1VTRVIsCisgICAgICAgICAgICAgaGtleV9tb2QuSEtFWV9MT0NBTF9NQUNISU5FLAorICAgICAgICAgICAgIGhrZXlfbW9kLkhLRVlfQ0xBU1NFU19ST09UKQorCitkZWYgcmVhZF9rZXlzKGJhc2UsIGtleSk6CisgICAgIiIiUmV0dXJuIGxpc3Qgb2YgcmVnaXN0cnkga2V5cy4iIiIKKworICAgIHRyeToKKyAgICAgICAgaGFuZGxlID0gUmVnT3BlbktleUV4KGJhc2UsIGtleSkKKyAgICBleGNlcHQgUmVnRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgTCA9IFtdCisgICAgaSA9IDAKKyAgICB3aGlsZSAxOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBrID0gUmVnRW51bUtleShoYW5kbGUsIGkpCisgICAgICAgIGV4Y2VwdCBSZWdFcnJvcjoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIEwuYXBwZW5kKGspCisgICAgICAgIGkgPSBpICsgMQorICAgIHJldHVybiBMCisKK2RlZiByZWFkX3ZhbHVlcyhiYXNlLCBrZXkpOgorICAgICIiIlJldHVybiBkaWN0IG9mIHJlZ2lzdHJ5IGtleXMgYW5kIHZhbHVlcy4KKworICAgIEFsbCBuYW1lcyBhcmUgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIGhhbmRsZSA9IFJlZ09wZW5LZXlFeChiYXNlLCBrZXkpCisgICAgZXhjZXB0IFJlZ0Vycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGQgPSB7fQorICAgIGkgPSAwCisgICAgd2hpbGUgMToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZSwgdmFsdWUsIHR5cGUgPSBSZWdFbnVtVmFsdWUoaGFuZGxlLCBpKQorICAgICAgICBleGNlcHQgUmVnRXJyb3I6CisgICAgICAgICAgICBicmVhaworICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIGRbY29udmVydF9tYmNzKG5hbWUpXSA9IGNvbnZlcnRfbWJjcyh2YWx1ZSkKKyAgICAgICAgaSA9IGkgKyAxCisgICAgcmV0dXJuIGQKKworZGVmIGNvbnZlcnRfbWJjcyhzKToKKyAgICBlbmMgPSBnZXRhdHRyKHMsICJlbmNvZGUiLCBOb25lKQorICAgIGlmIGVuYyBpcyBub3QgTm9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcyA9IGVuYygibWJjcyIpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgcmV0dXJuIHMKKworY2xhc3MgTWFjcm9FeHBhbmRlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uKToKKyAgICAgICAgc2VsZi5tYWNyb3MgPSB7fQorICAgICAgICBzZWxmLmxvYWRfbWFjcm9zKHZlcnNpb24pCisKKyAgICBkZWYgc2V0X21hY3JvKHNlbGYsIG1hY3JvLCBwYXRoLCBrZXkpOgorICAgICAgICBmb3IgYmFzZSBpbiBIS0VZUzoKKyAgICAgICAgICAgIGQgPSByZWFkX3ZhbHVlcyhiYXNlLCBwYXRoKQorICAgICAgICAgICAgaWYgZDoKKyAgICAgICAgICAgICAgICBzZWxmLm1hY3Jvc1siJCglcykiICUgbWFjcm9dID0gZFtrZXldCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiBsb2FkX21hY3JvcyhzZWxmLCB2ZXJzaW9uKToKKyAgICAgICAgdnNiYXNlID0gciJTb2Z0d2FyZVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXCUwLjFmIiAlIHZlcnNpb24KKyAgICAgICAgc2VsZi5zZXRfbWFjcm8oIlZDSW5zdGFsbERpciIsIHZzYmFzZSArIHIiXFNldHVwXFZDIiwgInByb2R1Y3RkaXIiKQorICAgICAgICBzZWxmLnNldF9tYWNybygiVlNJbnN0YWxsRGlyIiwgdnNiYXNlICsgciJcU2V0dXBcVlMiLCAicHJvZHVjdGRpciIpCisgICAgICAgIG5ldCA9IHIiU29mdHdhcmVcTWljcm9zb2Z0XC5ORVRGcmFtZXdvcmsiCisgICAgICAgIHNlbGYuc2V0X21hY3JvKCJGcmFtZXdvcmtEaXIiLCBuZXQsICJpbnN0YWxscm9vdCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHZlcnNpb24gPiA3LjA6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRfbWFjcm8oIkZyYW1ld29ya1NES0RpciIsIG5ldCwgInNka2luc3RhbGxyb290djEuMSIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0X21hY3JvKCJGcmFtZXdvcmtTREtEaXIiLCBuZXQsICJzZGtpbnN0YWxscm9vdCIpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICgiIiJQeXRob24gd2FzIGJ1aWx0IHdpdGggVmlzdWFsIFN0dWRpbyAyMDAzOworZXh0ZW5zaW9ucyBtdXN0IGJlIGJ1aWx0IHdpdGggYSBjb21waWxlciB0aGFuIGNhbiBnZW5lcmF0ZSBjb21wYXRpYmxlIGJpbmFyaWVzLgorVmlzdWFsIFN0dWRpbyAyMDAzIHdhcyBub3QgZm91bmQgb24gdGhpcyBzeXN0ZW0uIElmIHlvdSBoYXZlIEN5Z3dpbiBpbnN0YWxsZWQsCit5b3UgY2FuIHRyeSBjb21waWxpbmcgd2l0aCBNaW5nVzMyLCBieSBwYXNzaW5nICItYyBtaW5ndzMyIiB0byBzZXR1cC5weS4iIiIpCisKKyAgICAgICAgcCA9IHIiU29mdHdhcmVcTWljcm9zb2Z0XE5FVCBGcmFtZXdvcmsgU2V0dXBcUHJvZHVjdCIKKyAgICAgICAgZm9yIGJhc2UgaW4gSEtFWVM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaCA9IFJlZ09wZW5LZXlFeChiYXNlLCBwKQorICAgICAgICAgICAgZXhjZXB0IFJlZ0Vycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBrZXkgPSBSZWdFbnVtS2V5KGgsIDApCisgICAgICAgICAgICBkID0gcmVhZF92YWx1ZXMoYmFzZSwgciIlc1wlcyIgJSAocCwga2V5KSkKKyAgICAgICAgICAgIHNlbGYubWFjcm9zWyIkKEZyYW1ld29ya1ZlcnNpb24pIl0gPSBkWyJ2ZXJzaW9uIl0KKworICAgIGRlZiBzdWIoc2VsZiwgcyk6CisgICAgICAgIGZvciBrLCB2IGluIHNlbGYubWFjcm9zLml0ZW1zKCk6CisgICAgICAgICAgICBzID0gc3RyaW5nLnJlcGxhY2UocywgaywgdikKKyAgICAgICAgcmV0dXJuIHMKKworZGVmIGdldF9idWlsZF92ZXJzaW9uKCk6CisgICAgIiIiUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIE1TVkMgdGhhdCB3YXMgdXNlZCB0byBidWlsZCBQeXRob24uCisKKyAgICBGb3IgUHl0aG9uIDIuMyBhbmQgdXAsIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBpbmNsdWRlZCBpbgorICAgIHN5cy52ZXJzaW9uLiAgRm9yIGVhcmxpZXIgdmVyc2lvbnMsIGFzc3VtZSB0aGUgY29tcGlsZXIgaXMgTVNWQyA2LgorICAgICIiIgorCisgICAgcHJlZml4ID0gIk1TQyB2LiIKKyAgICBpID0gc3RyaW5nLmZpbmQoc3lzLnZlcnNpb24sIHByZWZpeCkKKyAgICBpZiBpID09IC0xOgorICAgICAgICByZXR1cm4gNgorICAgIGkgPSBpICsgbGVuKHByZWZpeCkKKyAgICBzLCByZXN0ID0gc3lzLnZlcnNpb25baTpdLnNwbGl0KCIgIiwgMSkKKyAgICBtYWpvclZlcnNpb24gPSBpbnQoc1s6LTJdKSAtIDYKKyAgICBtaW5vclZlcnNpb24gPSBpbnQoc1syOjNdKSAvIDEwLjAKKyAgICAjIEkgZG9uJ3QgdGhpbmsgcGF0aHMgYXJlIGFmZmVjdGVkIGJ5IG1pbm9yIHZlcnNpb24gaW4gdmVyc2lvbiA2CisgICAgaWYgbWFqb3JWZXJzaW9uID09IDY6CisgICAgICAgIG1pbm9yVmVyc2lvbiA9IDAKKyAgICBpZiBtYWpvclZlcnNpb24gPj0gNjoKKyAgICAgICAgcmV0dXJuIG1ham9yVmVyc2lvbiArIG1pbm9yVmVyc2lvbgorICAgICMgZWxzZSB3ZSBkb24ndCBrbm93IHdoYXQgdmVyc2lvbiBvZiB0aGUgY29tcGlsZXIgdGhpcyBpcworICAgIHJldHVybiBOb25lCisKK2RlZiBnZXRfYnVpbGRfYXJjaGl0ZWN0dXJlKCk6CisgICAgIiIiUmV0dXJuIHRoZSBwcm9jZXNzb3IgYXJjaGl0ZWN0dXJlLgorCisgICAgUG9zc2libGUgcmVzdWx0cyBhcmUgIkludGVsIiwgIkl0YW5pdW0iLCBvciAiQU1ENjQiLgorICAgICIiIgorCisgICAgcHJlZml4ID0gIiBiaXQgKCIKKyAgICBpID0gc3RyaW5nLmZpbmQoc3lzLnZlcnNpb24sIHByZWZpeCkKKyAgICBpZiBpID09IC0xOgorICAgICAgICByZXR1cm4gIkludGVsIgorICAgIGogPSBzdHJpbmcuZmluZChzeXMudmVyc2lvbiwgIikiLCBpKQorICAgIHJldHVybiBzeXMudmVyc2lvbltpK2xlbihwcmVmaXgpOmpdCisKK2RlZiBub3JtYWxpemVfYW5kX3JlZHVjZV9wYXRocyhwYXRocyk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBub3JtYWxpemVkIHBhdGhzIHdpdGggZHVwbGljYXRlcyByZW1vdmVkLgorCisgICAgVGhlIGN1cnJlbnQgb3JkZXIgb2YgcGF0aHMgaXMgbWFpbnRhaW5lZC4KKyAgICAiIiIKKyAgICAjIFBhdGhzIGFyZSBub3JtYWxpemVkIHNvIHRoaW5ncyBsaWtlOiAgL2EgYW5kIC9hLyBhcmVuJ3QgYm90aCBwcmVzZXJ2ZWQuCisgICAgcmVkdWNlZF9wYXRocyA9IFtdCisgICAgZm9yIHAgaW4gcGF0aHM6CisgICAgICAgIG5wID0gb3MucGF0aC5ub3JtcGF0aChwKQorICAgICAgICAjIFhYWChubm9yd2l0eik6IE8obioqMiksIGlmIHJlZHVjZWRfcGF0aHMgZ2V0cyBsb25nIHBlcmhhcHMgdXNlIGEgc2V0LgorICAgICAgICBpZiBucCBub3QgaW4gcmVkdWNlZF9wYXRoczoKKyAgICAgICAgICAgIHJlZHVjZWRfcGF0aHMuYXBwZW5kKG5wKQorICAgIHJldHVybiByZWR1Y2VkX3BhdGhzCisKKworY2xhc3MgTVNWQ0NvbXBpbGVyIChDQ29tcGlsZXIpIDoKKyAgICAiIiJDb25jcmV0ZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIHRvIE1pY3Jvc29mdCBWaXN1YWwgQysrLAorICAgICAgIGFzIGRlZmluZWQgYnkgdGhlIENDb21waWxlciBhYnN0cmFjdCBjbGFzcy4iIiIKKworICAgIGNvbXBpbGVyX3R5cGUgPSAnbXN2YycKKworICAgICMgSnVzdCBzZXQgdGhpcyBzbyBDQ29tcGlsZXIncyBjb25zdHJ1Y3RvciBkb2Vzbid0IGJhcmYuICBXZSBjdXJyZW50bHkKKyAgICAjIGRvbid0IHVzZSB0aGUgJ3NldF9leGVjdXRhYmxlcygpJyBidXJlYXVjcmFjeSBwcm92aWRlZCBieSBDQ29tcGlsZXIsCisgICAgIyBhcyBpdCByZWFsbHkgaXNuJ3QgbmVjZXNzYXJ5IGZvciB0aGlzIHNvcnQgb2Ygc2luZ2xlLWNvbXBpbGVyIGNsYXNzLgorICAgICMgV291bGQgYmUgbmljZSB0byBoYXZlIGEgY29uc2lzdGVudCBpbnRlcmZhY2Ugd2l0aCBVbml4Q0NvbXBpbGVyLAorICAgICMgdGhvdWdoLCBzbyBpdCdzIHdvcnRoIHRoaW5raW5nIGFib3V0LgorICAgIGV4ZWN1dGFibGVzID0ge30KKworICAgICMgUHJpdmF0ZSBjbGFzcyBkYXRhIChuZWVkIHRvIGRpc3Rpbmd1aXNoIEMgZnJvbSBDKysgc291cmNlIGZvciBjb21waWxlcikKKyAgICBfY19leHRlbnNpb25zID0gWycuYyddCisgICAgX2NwcF9leHRlbnNpb25zID0gWycuY2MnLCAnLmNwcCcsICcuY3h4J10KKyAgICBfcmNfZXh0ZW5zaW9ucyA9IFsnLnJjJ10KKyAgICBfbWNfZXh0ZW5zaW9ucyA9IFsnLm1jJ10KKworICAgICMgTmVlZGVkIGZvciB0aGUgZmlsZW5hbWUgZ2VuZXJhdGlvbiBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZQorICAgICMgYmFzZSBjbGFzcywgQ0NvbXBpbGVyLgorICAgIHNyY19leHRlbnNpb25zID0gKF9jX2V4dGVuc2lvbnMgKyBfY3BwX2V4dGVuc2lvbnMgKworICAgICAgICAgICAgICAgICAgICAgIF9yY19leHRlbnNpb25zICsgX21jX2V4dGVuc2lvbnMpCisgICAgcmVzX2V4dGVuc2lvbiA9ICcucmVzJworICAgIG9ial9leHRlbnNpb24gPSAnLm9iaicKKyAgICBzdGF0aWNfbGliX2V4dGVuc2lvbiA9ICcubGliJworICAgIHNoYXJlZF9saWJfZXh0ZW5zaW9uID0gJy5kbGwnCisgICAgc3RhdGljX2xpYl9mb3JtYXQgPSBzaGFyZWRfbGliX2Zvcm1hdCA9ICclcyVzJworICAgIGV4ZV9leHRlbnNpb24gPSAnLmV4ZScKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsIGZvcmNlPTApOgorICAgICAgICBDQ29tcGlsZXIuX19pbml0X18gKHNlbGYsIHZlcmJvc2UsIGRyeV9ydW4sIGZvcmNlKQorICAgICAgICBzZWxmLl9fdmVyc2lvbiA9IGdldF9idWlsZF92ZXJzaW9uKCkKKyAgICAgICAgc2VsZi5fX2FyY2ggPSBnZXRfYnVpbGRfYXJjaGl0ZWN0dXJlKCkKKyAgICAgICAgaWYgc2VsZi5fX2FyY2ggPT0gIkludGVsIjoKKyAgICAgICAgICAgICMgeDg2CisgICAgICAgICAgICBpZiBzZWxmLl9fdmVyc2lvbiA+PSA3OgorICAgICAgICAgICAgICAgIHNlbGYuX19yb290ID0gciJTb2Z0d2FyZVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvIgorICAgICAgICAgICAgICAgIHNlbGYuX19tYWNyb3MgPSBNYWNyb0V4cGFuZGVyKHNlbGYuX192ZXJzaW9uKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9fcm9vdCA9IHIiU29mdHdhcmVcTWljcm9zb2Z0XERldnN0dWRpbyIKKyAgICAgICAgICAgIHNlbGYuX19wcm9kdWN0ID0gIlZpc3VhbCBTdHVkaW8gdmVyc2lvbiAlcyIgJSBzZWxmLl9fdmVyc2lvbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBXaW42NC4gQXNzdW1lIHRoaXMgd2FzIGJ1aWx0IHdpdGggdGhlIHBsYXRmb3JtIFNESworICAgICAgICAgICAgc2VsZi5fX3Byb2R1Y3QgPSAiTWljcm9zb2Z0IFNESyBjb21waWxlciAlcyIgJSAoc2VsZi5fX3ZlcnNpb24gKyA2KQorCisgICAgICAgIHNlbGYuaW5pdGlhbGl6ZWQgPSBGYWxzZQorCisgICAgZGVmIGluaXRpYWxpemUoc2VsZik6CisgICAgICAgIHNlbGYuX19wYXRocyA9IFtdCisgICAgICAgIGlmICJESVNUVVRJTFNfVVNFX1NESyIgaW4gb3MuZW52aXJvbiBhbmQgIk1TU2RrIiBpbiBvcy5lbnZpcm9uIGFuZCBzZWxmLmZpbmRfZXhlKCJjbC5leGUiKToKKyAgICAgICAgICAgICMgQXNzdW1lIHRoYXQgdGhlIFNESyBzZXQgdXAgZXZlcnl0aGluZyBhbHJpZ2h0OyBkb24ndCB0cnkgdG8gYmUKKyAgICAgICAgICAgICMgc21hcnRlcgorICAgICAgICAgICAgc2VsZi5jYyA9ICJjbC5leGUiCisgICAgICAgICAgICBzZWxmLmxpbmtlciA9ICJsaW5rLmV4ZSIKKyAgICAgICAgICAgIHNlbGYubGliID0gImxpYi5leGUiCisgICAgICAgICAgICBzZWxmLnJjID0gInJjLmV4ZSIKKyAgICAgICAgICAgIHNlbGYubWMgPSAibWMuZXhlIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX3BhdGhzID0gc2VsZi5nZXRfbXN2Y19wYXRocygicGF0aCIpCisKKyAgICAgICAgICAgIGlmIGxlbiAoc2VsZi5fX3BhdGhzKSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoIlB5dGhvbiB3YXMgYnVpbHQgd2l0aCAlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAiYW5kIGV4dGVuc2lvbnMgbmVlZCB0byBiZSBidWlsdCB3aXRoIHRoZSBzYW1lICIKKyAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24gb2YgdGhlIGNvbXBpbGVyLCBidXQgaXQgaXNuJ3QgaW5zdGFsbGVkLiIgJSBzZWxmLl9fcHJvZHVjdCkKKworICAgICAgICAgICAgc2VsZi5jYyA9IHNlbGYuZmluZF9leGUoImNsLmV4ZSIpCisgICAgICAgICAgICBzZWxmLmxpbmtlciA9IHNlbGYuZmluZF9leGUoImxpbmsuZXhlIikKKyAgICAgICAgICAgIHNlbGYubGliID0gc2VsZi5maW5kX2V4ZSgibGliLmV4ZSIpCisgICAgICAgICAgICBzZWxmLnJjID0gc2VsZi5maW5kX2V4ZSgicmMuZXhlIikgICAjIHJlc291cmNlIGNvbXBpbGVyCisgICAgICAgICAgICBzZWxmLm1jID0gc2VsZi5maW5kX2V4ZSgibWMuZXhlIikgICAjIG1lc3NhZ2UgY29tcGlsZXIKKyAgICAgICAgICAgIHNlbGYuc2V0X3BhdGhfZW52X3ZhcignbGliJykKKyAgICAgICAgICAgIHNlbGYuc2V0X3BhdGhfZW52X3ZhcignaW5jbHVkZScpCisKKyAgICAgICAgIyBleHRlbmQgdGhlIE1TVkMgcGF0aCB3aXRoIHRoZSBjdXJyZW50IHBhdGgKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIHAgaW4gc3RyaW5nLnNwbGl0KG9zLmVudmlyb25bJ3BhdGgnXSwgJzsnKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fcGF0aHMuYXBwZW5kKHApCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5fX3BhdGhzID0gbm9ybWFsaXplX2FuZF9yZWR1Y2VfcGF0aHMoc2VsZi5fX3BhdGhzKQorICAgICAgICBvcy5lbnZpcm9uWydwYXRoJ10gPSBzdHJpbmcuam9pbihzZWxmLl9fcGF0aHMsICc7JykKKworICAgICAgICBzZWxmLnByZXByb2Nlc3Nfb3B0aW9ucyA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5fX2FyY2ggPT0gIkludGVsIjoKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZV9vcHRpb25zID0gWyAnL25vbG9nbycsICcvT3gnLCAnL01EJywgJy9XMycsICcvR1gnICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL0ROREVCVUcnXQorICAgICAgICAgICAgc2VsZi5jb21waWxlX29wdGlvbnNfZGVidWcgPSBbJy9ub2xvZ28nLCAnL09kJywgJy9NRGQnLCAnL1czJywgJy9HWCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL1o3JywgJy9EX0RFQlVHJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgV2luNjQKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZV9vcHRpb25zID0gWyAnL25vbG9nbycsICcvT3gnLCAnL01EJywgJy9XMycsICcvR1MtJyAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9ETkRFQlVHJ10KKyAgICAgICAgICAgIHNlbGYuY29tcGlsZV9vcHRpb25zX2RlYnVnID0gWycvbm9sb2dvJywgJy9PZCcsICcvTURkJywgJy9XMycsICcvR1MtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvWjcnLCAnL0RfREVCVUcnXQorCisgICAgICAgIHNlbGYubGRmbGFnc19zaGFyZWQgPSBbJy9ETEwnLCAnL25vbG9nbycsICcvSU5DUkVNRU5UQUw6Tk8nXQorICAgICAgICBpZiBzZWxmLl9fdmVyc2lvbiA+PSA3OgorICAgICAgICAgICAgc2VsZi5sZGZsYWdzX3NoYXJlZF9kZWJ1ZyA9IFsKKyAgICAgICAgICAgICAgICAnL0RMTCcsICcvbm9sb2dvJywgJy9JTkNSRU1FTlRBTDpubycsICcvREVCVUcnCisgICAgICAgICAgICAgICAgXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sZGZsYWdzX3NoYXJlZF9kZWJ1ZyA9IFsKKyAgICAgICAgICAgICAgICAnL0RMTCcsICcvbm9sb2dvJywgJy9JTkNSRU1FTlRBTDpubycsICcvcGRiOk5vbmUnLCAnL0RFQlVHJworICAgICAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5sZGZsYWdzX3N0YXRpYyA9IFsgJy9ub2xvZ28nXQorCisgICAgICAgIHNlbGYuaW5pdGlhbGl6ZWQgPSBUcnVlCisKKyAgICAjIC0tIFdvcmtlciBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIG9iamVjdF9maWxlbmFtZXMgKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9maWxlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwX2Rpcj0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPScnKToKKyAgICAgICAgIyBDb3BpZWQgZnJvbSBjY29tcGlsZXIucHksIGV4dGVuZGVkIHRvIHJldHVybiAucmVzIGFzICdvYmplY3QnLWZpbGUKKyAgICAgICAgIyBmb3IgLnJjIGlucHV0IGZpbGUKKyAgICAgICAgaWYgb3V0cHV0X2RpciBpcyBOb25lOiBvdXRwdXRfZGlyID0gJycKKyAgICAgICAgb2JqX25hbWVzID0gW10KKyAgICAgICAgZm9yIHNyY19uYW1lIGluIHNvdXJjZV9maWxlbmFtZXM6CisgICAgICAgICAgICAoYmFzZSwgZXh0KSA9IG9zLnBhdGguc3BsaXRleHQgKHNyY19uYW1lKQorICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguc3BsaXRkcml2ZShiYXNlKVsxXSAjIENob3Agb2ZmIHRoZSBkcml2ZQorICAgICAgICAgICAgYmFzZSA9IGJhc2Vbb3MucGF0aC5pc2FicyhiYXNlKTpdICAjIElmIGFicywgY2hvcCBvZmYgbGVhZGluZyAvCisgICAgICAgICAgICBpZiBleHQgbm90IGluIHNlbGYuc3JjX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgIyBCZXR0ZXIgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGluc3RlYWQgb2Ygc2lsZW50bHkgY29udGludWluZworICAgICAgICAgICAgICAgICMgYW5kIGxhdGVyIGNvbXBsYWluIGFib3V0IHNvdXJjZXMgYW5kIHRhcmdldHMgaGF2aW5nCisgICAgICAgICAgICAgICAgIyBkaWZmZXJlbnQgbGVuZ3RocworICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciAoIkRvbid0IGtub3cgaG93IHRvIGNvbXBpbGUgJXMiICUgc3JjX25hbWUpCisgICAgICAgICAgICBpZiBzdHJpcF9kaXI6CisgICAgICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUgKGJhc2UpCisgICAgICAgICAgICBpZiBleHQgaW4gc2VsZi5fcmNfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICBvYmpfbmFtZXMuYXBwZW5kIChvcy5wYXRoLmpvaW4gKG91dHB1dF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgc2VsZi5yZXNfZXh0ZW5zaW9uKSkKKyAgICAgICAgICAgIGVsaWYgZXh0IGluIHNlbGYuX21jX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgb2JqX25hbWVzLmFwcGVuZCAob3MucGF0aC5qb2luIChvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIHNlbGYucmVzX2V4dGVuc2lvbikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9ial9uYW1lcy5hcHBlbmQgKG9zLnBhdGguam9pbiAob3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBzZWxmLm9ial9leHRlbnNpb24pKQorICAgICAgICByZXR1cm4gb2JqX25hbWVzCisKKyAgICAjIG9iamVjdF9maWxlbmFtZXMgKCkKKworCisgICAgZGVmIGNvbXBpbGUoc2VsZiwgc291cmNlcywKKyAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPU5vbmUsIG1hY3Jvcz1Ob25lLCBpbmNsdWRlX2RpcnM9Tm9uZSwgZGVidWc9MCwKKyAgICAgICAgICAgICAgICBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGRlcGVuZHM9Tm9uZSk6CisKKyAgICAgICAgaWYgbm90IHNlbGYuaW5pdGlhbGl6ZWQ6IHNlbGYuaW5pdGlhbGl6ZSgpCisgICAgICAgIG1hY3Jvcywgb2JqZWN0cywgZXh0cmFfcG9zdGFyZ3MsIHBwX29wdHMsIGJ1aWxkID0gXAorICAgICAgICAgICAgICAgIHNlbGYuX3NldHVwX2NvbXBpbGUob3V0cHV0X2RpciwgbWFjcm9zLCBpbmNsdWRlX2RpcnMsIHNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRzLCBleHRyYV9wb3N0YXJncykKKworICAgICAgICBjb21waWxlX29wdHMgPSBleHRyYV9wcmVhcmdzIG9yIFtdCisgICAgICAgIGNvbXBpbGVfb3B0cy5hcHBlbmQgKCcvYycpCisgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgY29tcGlsZV9vcHRzLmV4dGVuZChzZWxmLmNvbXBpbGVfb3B0aW9uc19kZWJ1ZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbXBpbGVfb3B0cy5leHRlbmQoc2VsZi5jb21waWxlX29wdGlvbnMpCisKKyAgICAgICAgZm9yIG9iaiBpbiBvYmplY3RzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNyYywgZXh0ID0gYnVpbGRbb2JqXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIGZ1bGwgcGF0aG5hbWUgdG8gTVNWQyBpbiBkZWJ1ZyBtb2RlLAorICAgICAgICAgICAgICAgICMgdGhpcyBhbGxvd3MgdGhlIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIHNvdXJjZSBmaWxlCisgICAgICAgICAgICAgICAgIyB3aXRob3V0IGFza2luZyB0aGUgdXNlciB0byBicm93c2UgZm9yIGl0CisgICAgICAgICAgICAgICAgc3JjID0gb3MucGF0aC5hYnNwYXRoKHNyYykKKworICAgICAgICAgICAgaWYgZXh0IGluIHNlbGYuX2NfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICBpbnB1dF9vcHQgPSAiL1RjIiArIHNyYworICAgICAgICAgICAgZWxpZiBleHQgaW4gc2VsZi5fY3BwX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgaW5wdXRfb3B0ID0gIi9UcCIgKyBzcmMKKyAgICAgICAgICAgIGVsaWYgZXh0IGluIHNlbGYuX3JjX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgIyBjb21waWxlIC5SQyB0byAuUkVTIGZpbGUKKyAgICAgICAgICAgICAgICBpbnB1dF9vcHQgPSBzcmMKKyAgICAgICAgICAgICAgICBvdXRwdXRfb3B0ID0gIi9mbyIgKyBvYmoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24gKFtzZWxmLnJjXSArIHBwX29wdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0cHV0X29wdF0gKyBbaW5wdXRfb3B0XSkKKyAgICAgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciwgbXNnCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgZXh0IGluIHNlbGYuX21jX2V4dGVuc2lvbnM6CisKKyAgICAgICAgICAgICAgICAjIENvbXBpbGUgLk1DIHRvIC5SQyBmaWxlIHRvIC5SRVMgZmlsZS4KKyAgICAgICAgICAgICAgICAjICAgKiAnLWggZGlyJyBzcGVjaWZpZXMgdGhlIGRpcmVjdG9yeSBmb3IgdGhlCisgICAgICAgICAgICAgICAgIyAgICAgZ2VuZXJhdGVkIGluY2x1ZGUgZmlsZQorICAgICAgICAgICAgICAgICMgICAqICctciBkaXInIHNwZWNpZmllcyB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBvZiB0aGUKKyAgICAgICAgICAgICAgICAjICAgICBnZW5lcmF0ZWQgUkMgZmlsZSBhbmQgdGhlIGJpbmFyeSBtZXNzYWdlIHJlc291cmNlCisgICAgICAgICAgICAgICAgIyAgICAgaXQgaW5jbHVkZXMKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBGb3Igbm93IChzaW5jZSB0aGVyZSBhcmUgbm8gb3B0aW9ucyB0byBjaGFuZ2UgdGhpcyksCisgICAgICAgICAgICAgICAgIyB3ZSB1c2UgdGhlIHNvdXJjZS1kaXJlY3RvcnkgZm9yIHRoZSBpbmNsdWRlIGZpbGUgYW5kCisgICAgICAgICAgICAgICAgIyB0aGUgYnVpbGQgZGlyZWN0b3J5IGZvciB0aGUgUkMgZmlsZSBhbmQgbWVzc2FnZQorICAgICAgICAgICAgICAgICMgcmVzb3VyY2VzLiBUaGlzIHdvcmtzIGF0IGxlYXN0IGZvciB3aW4zMmFsbC4KKworICAgICAgICAgICAgICAgIGhfZGlyID0gb3MucGF0aC5kaXJuYW1lIChzcmMpCisgICAgICAgICAgICAgICAgcmNfZGlyID0gb3MucGF0aC5kaXJuYW1lIChvYmopCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAjIGZpcnN0IGNvbXBpbGUgLk1DIHRvIC5SQyBhbmQgLkggZmlsZQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNwYXduIChbc2VsZi5tY10gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJy1oJywgaF9kaXIsICctcicsIHJjX2Rpcl0gKyBbc3JjXSkKKyAgICAgICAgICAgICAgICAgICAgYmFzZSwgXyA9IG9zLnBhdGguc3BsaXRleHQgKG9zLnBhdGguYmFzZW5hbWUgKHNyYykpCisgICAgICAgICAgICAgICAgICAgIHJjX2ZpbGUgPSBvcy5wYXRoLmpvaW4gKHJjX2RpciwgYmFzZSArICcucmMnKQorICAgICAgICAgICAgICAgICAgICAjIHRoZW4gY29tcGlsZSAuUkMgdG8gLlJFUyBmaWxlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24gKFtzZWxmLnJjXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiL2ZvIiArIG9ial0gKyBbcmNfZmlsZV0pCisKKyAgICAgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciwgbXNnCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBob3cgdG8gaGFuZGxlIHRoaXMgZmlsZT8KKyAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IgKAorICAgICAgICAgICAgICAgICAgICAiRG9uJ3Qga25vdyBob3cgdG8gY29tcGlsZSAlcyB0byAlcyIgJSBcCisgICAgICAgICAgICAgICAgICAgIChzcmMsIG9iaikpCisKKyAgICAgICAgICAgIG91dHB1dF9vcHQgPSAiL0ZvIiArIG9iagorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24gKFtzZWxmLmNjXSArIGNvbXBpbGVfb3B0cyArIHBwX29wdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dF9vcHQsIG91dHB1dF9vcHRdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IsIG1zZworCisgICAgICAgIHJldHVybiBvYmplY3RzCisKKyAgICAjIGNvbXBpbGUgKCkKKworCisgICAgZGVmIGNyZWF0ZV9zdGF0aWNfbGliIChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9saWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9sYW5nPU5vbmUpOgorCisgICAgICAgIGlmIG5vdCBzZWxmLmluaXRpYWxpemVkOiBzZWxmLmluaXRpYWxpemUoKQorICAgICAgICAob2JqZWN0cywgb3V0cHV0X2RpcikgPSBzZWxmLl9maXhfb2JqZWN0X2FyZ3MgKG9iamVjdHMsIG91dHB1dF9kaXIpCisgICAgICAgIG91dHB1dF9maWxlbmFtZSA9IFwKKyAgICAgICAgICAgIHNlbGYubGlicmFyeV9maWxlbmFtZSAob3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9b3V0cHV0X2RpcikKKworICAgICAgICBpZiBzZWxmLl9uZWVkX2xpbmsgKG9iamVjdHMsIG91dHB1dF9maWxlbmFtZSk6CisgICAgICAgICAgICBsaWJfYXJncyA9IG9iamVjdHMgKyBbJy9PVVQ6JyArIG91dHB1dF9maWxlbmFtZV0KKyAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgIHBhc3MgICAgICAgICAgICAgICAgICAgICMgWFhYIHdoYXQgZ29lcyBoZXJlPworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24gKFtzZWxmLmxpYl0gKyBsaWJfYXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBMaWJFcnJvciwgbXNnCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZy5kZWJ1Zygic2tpcHBpbmcgJXMgKHVwLXRvLWRhdGUpIiwgb3V0cHV0X2ZpbGVuYW1lKQorCisgICAgIyBjcmVhdGVfc3RhdGljX2xpYiAoKQorCisgICAgZGVmIGxpbmsgKHNlbGYsCisgICAgICAgICAgICAgIHRhcmdldF9kZXNjLAorICAgICAgICAgICAgICBvYmplY3RzLAorICAgICAgICAgICAgICBvdXRwdXRfZmlsZW5hbWUsCisgICAgICAgICAgICAgIG91dHB1dF9kaXI9Tm9uZSwKKyAgICAgICAgICAgICAgbGlicmFyaWVzPU5vbmUsCisgICAgICAgICAgICAgIGxpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICAgICAgICBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICAgICAgICBleHBvcnRfc3ltYm9scz1Ob25lLAorICAgICAgICAgICAgICBkZWJ1Zz0wLAorICAgICAgICAgICAgICBleHRyYV9wcmVhcmdzPU5vbmUsCisgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsCisgICAgICAgICAgICAgIGJ1aWxkX3RlbXA9Tm9uZSwKKyAgICAgICAgICAgICAgdGFyZ2V0X2xhbmc9Tm9uZSk6CisKKyAgICAgICAgaWYgbm90IHNlbGYuaW5pdGlhbGl6ZWQ6IHNlbGYuaW5pdGlhbGl6ZSgpCisgICAgICAgIChvYmplY3RzLCBvdXRwdXRfZGlyKSA9IHNlbGYuX2ZpeF9vYmplY3RfYXJncyAob2JqZWN0cywgb3V0cHV0X2RpcikKKyAgICAgICAgKGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycykgPSBcCisgICAgICAgICAgICBzZWxmLl9maXhfbGliX2FyZ3MgKGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycykKKworICAgICAgICBpZiBydW50aW1lX2xpYnJhcnlfZGlyczoKKyAgICAgICAgICAgIHNlbGYud2FybiAoIkkgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIHdpdGggJ3J1bnRpbWVfbGlicmFyeV9kaXJzJzogIgorICAgICAgICAgICAgICAgICAgICAgICArIHN0ciAocnVudGltZV9saWJyYXJ5X2RpcnMpKQorCisgICAgICAgIGxpYl9vcHRzID0gZ2VuX2xpYl9vcHRpb25zIChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcykKKyAgICAgICAgaWYgb3V0cHV0X2RpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG91dHB1dF9maWxlbmFtZSA9IG9zLnBhdGguam9pbiAob3V0cHV0X2Rpciwgb3V0cHV0X2ZpbGVuYW1lKQorCisgICAgICAgIGlmIHNlbGYuX25lZWRfbGluayAob2JqZWN0cywgb3V0cHV0X2ZpbGVuYW1lKToKKworICAgICAgICAgICAgaWYgdGFyZ2V0X2Rlc2MgPT0gQ0NvbXBpbGVyLkVYRUNVVEFCTEU6CisgICAgICAgICAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICAgICAgICAgIGxkZmxhZ3MgPSBzZWxmLmxkZmxhZ3Nfc2hhcmVkX2RlYnVnWzE6XQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxkZmxhZ3MgPSBzZWxmLmxkZmxhZ3Nfc2hhcmVkWzE6XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgbGRmbGFncyA9IHNlbGYubGRmbGFnc19zaGFyZWRfZGVidWcKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsZGZsYWdzID0gc2VsZi5sZGZsYWdzX3NoYXJlZAorCisgICAgICAgICAgICBleHBvcnRfb3B0cyA9IFtdCisgICAgICAgICAgICBmb3Igc3ltIGluIChleHBvcnRfc3ltYm9scyBvciBbXSk6CisgICAgICAgICAgICAgICAgZXhwb3J0X29wdHMuYXBwZW5kKCIvRVhQT1JUOiIgKyBzeW0pCisKKyAgICAgICAgICAgIGxkX2FyZ3MgPSAobGRmbGFncyArIGxpYl9vcHRzICsgZXhwb3J0X29wdHMgKworICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzICsgWycvT1VUOicgKyBvdXRwdXRfZmlsZW5hbWVdKQorCisgICAgICAgICAgICAjIFRoZSBNU1ZDIGxpbmtlciBnZW5lcmF0ZXMgLmxpYiBhbmQgLmV4cCBmaWxlcywgd2hpY2ggY2Fubm90IGJlCisgICAgICAgICAgICAjIHN1cHByZXNzZWQgYnkgYW55IGxpbmtlciBzd2l0Y2hlcy4gVGhlIC5saWIgZmlsZXMgbWF5IGV2ZW4gYmUKKyAgICAgICAgICAgICMgbmVlZGVkISBNYWtlIHN1cmUgdGhleSBhcmUgZ2VuZXJhdGVkIGluIHRoZSB0ZW1wb3JhcnkgYnVpbGQKKyAgICAgICAgICAgICMgZGlyZWN0b3J5LiBTaW5jZSB0aGV5IGhhdmUgZGlmZmVyZW50IG5hbWVzIGZvciBkZWJ1ZyBhbmQgcmVsZWFzZQorICAgICAgICAgICAgIyBidWlsZHMsIHRoZXkgY2FuIGdvIGludG8gdGhlIHNhbWUgZGlyZWN0b3J5LgorICAgICAgICAgICAgaWYgZXhwb3J0X3N5bWJvbHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgKGRsbF9uYW1lLCBkbGxfZXh0KSA9IG9zLnBhdGguc3BsaXRleHQoCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUob3V0cHV0X2ZpbGVuYW1lKSkKKyAgICAgICAgICAgICAgICBpbXBsaWJfZmlsZSA9IG9zLnBhdGguam9pbigKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKG9iamVjdHNbMF0pLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZmlsZW5hbWUoZGxsX25hbWUpKQorICAgICAgICAgICAgICAgIGxkX2FyZ3MuYXBwZW5kICgnL0lNUExJQjonICsgaW1wbGliX2ZpbGUpCisKKyAgICAgICAgICAgIGlmIGV4dHJhX3ByZWFyZ3M6CisgICAgICAgICAgICAgICAgbGRfYXJnc1s6MF0gPSBleHRyYV9wcmVhcmdzCisgICAgICAgICAgICBpZiBleHRyYV9wb3N0YXJnczoKKyAgICAgICAgICAgICAgICBsZF9hcmdzLmV4dGVuZChleHRyYV9wb3N0YXJncykKKworICAgICAgICAgICAgc2VsZi5ta3BhdGggKG9zLnBhdGguZGlybmFtZSAob3V0cHV0X2ZpbGVuYW1lKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNwYXduIChbc2VsZi5saW5rZXJdICsgbGRfYXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBMaW5rRXJyb3IsIG1zZworCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2cuZGVidWcoInNraXBwaW5nICVzICh1cC10by1kYXRlKSIsIG91dHB1dF9maWxlbmFtZSkKKworICAgICMgbGluayAoKQorCisKKyAgICAjIC0tIE1pc2NlbGxhbmVvdXMgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgVGhlc2UgYXJlIGFsbCB1c2VkIGJ5IHRoZSAnZ2VuX2xpYl9vcHRpb25zKCkgZnVuY3Rpb24sIGluCisgICAgIyBjY29tcGlsZXIucHkuCisKKyAgICBkZWYgbGlicmFyeV9kaXJfb3B0aW9uIChzZWxmLCBkaXIpOgorICAgICAgICByZXR1cm4gIi9MSUJQQVRIOiIgKyBkaXIKKworICAgIGRlZiBydW50aW1lX2xpYnJhcnlfZGlyX29wdGlvbiAoc2VsZiwgZGlyKToKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgXAorICAgICAgICAgICAgICAiZG9uJ3Qga25vdyBob3cgdG8gc2V0IHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aCBmb3IgTVNWQysrIgorCisgICAgZGVmIGxpYnJhcnlfb3B0aW9uIChzZWxmLCBsaWIpOgorICAgICAgICByZXR1cm4gc2VsZi5saWJyYXJ5X2ZpbGVuYW1lIChsaWIpCisKKworICAgIGRlZiBmaW5kX2xpYnJhcnlfZmlsZSAoc2VsZiwgZGlycywgbGliLCBkZWJ1Zz0wKToKKyAgICAgICAgIyBQcmVmZXIgYSBkZWJ1Z2dpbmcgbGlicmFyeSBpZiBmb3VuZCAoYW5kIHJlcXVlc3RlZCksIGJ1dCBkZWFsCisgICAgICAgICMgd2l0aCBpdCBpZiB3ZSBkb24ndCBoYXZlIG9uZS4KKyAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICB0cnlfbmFtZXMgPSBbbGliICsgIl9kIiwgbGliXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5X25hbWVzID0gW2xpYl0KKyAgICAgICAgZm9yIGRpciBpbiBkaXJzOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gdHJ5X25hbWVzOgorICAgICAgICAgICAgICAgIGxpYmZpbGUgPSBvcy5wYXRoLmpvaW4oZGlyLCBzZWxmLmxpYnJhcnlfZmlsZW5hbWUgKG5hbWUpKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxpYmZpbGUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGliZmlsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBPb3BzLCBkaWRuJ3QgZmluZCBpdCBpbiAqYW55KiBvZiAnZGlycycKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIGZpbmRfbGlicmFyeV9maWxlICgpCisKKyAgICAjIEhlbHBlciBtZXRob2RzIGZvciB1c2luZyB0aGUgTVNWQyByZWdpc3RyeSBzZXR0aW5ncworCisgICAgZGVmIGZpbmRfZXhlKHNlbGYsIGV4ZSk6CisgICAgICAgICIiIlJldHVybiBwYXRoIHRvIGFuIE1TVkMgZXhlY3V0YWJsZSBwcm9ncmFtLgorCisgICAgICAgIFRyaWVzIHRvIGZpbmQgdGhlIHByb2dyYW0gaW4gc2V2ZXJhbCBwbGFjZXM6IGZpcnN0LCBvbmUgb2YgdGhlCisgICAgICAgIE1TVkMgcHJvZ3JhbSBzZWFyY2ggcGF0aHMgZnJvbSB0aGUgcmVnaXN0cnk7IG5leHQsIHRoZSBkaXJlY3RvcmllcworICAgICAgICBpbiB0aGUgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIElmIGFueSBvZiB0aG9zZSB3b3JrLCByZXR1cm4gYW4KKyAgICAgICAgYWJzb2x1dGUgcGF0aCB0aGF0IGlzIGtub3duIHRvIGV4aXN0LiAgSWYgbm9uZSBvZiB0aGVtIHdvcmssIGp1c3QKKyAgICAgICAgcmV0dXJuIHRoZSBvcmlnaW5hbCBwcm9ncmFtIG5hbWUsICdleGUnLgorICAgICAgICAiIiIKKworICAgICAgICBmb3IgcCBpbiBzZWxmLl9fcGF0aHM6CisgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgocCksIGV4ZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZuKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZm4KKworICAgICAgICAjIGRpZG4ndCBmaW5kIGl0OyB0cnkgZXhpc3RpbmcgcGF0aAorICAgICAgICBmb3IgcCBpbiBzdHJpbmcuc3BsaXQob3MuZW52aXJvblsnUGF0aCddLCc7Jyk6CisgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgocCksZXhlKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm4pOgorICAgICAgICAgICAgICAgIHJldHVybiBmbgorCisgICAgICAgIHJldHVybiBleGUKKworICAgIGRlZiBnZXRfbXN2Y19wYXRocyhzZWxmLCBwYXRoLCBwbGF0Zm9ybT0neDg2Jyk6CisgICAgICAgICIiIkdldCBhIGxpc3Qgb2YgZGV2c3R1ZGlvIGRpcmVjdG9yaWVzIChpbmNsdWRlLCBsaWIgb3IgcGF0aCkuCisKKyAgICAgICAgUmV0dXJuIGEgbGlzdCBvZiBzdHJpbmdzLiAgVGhlIGxpc3Qgd2lsbCBiZSBlbXB0eSBpZiB1bmFibGUgdG8KKyAgICAgICAgYWNjZXNzIHRoZSByZWdpc3RyeSBvciBhcHByb3ByaWF0ZSByZWdpc3RyeSBrZXlzIG5vdCBmb3VuZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbm90IF9jYW5fcmVhZF9yZWc6CisgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICBwYXRoID0gcGF0aCArICIgZGlycyIKKyAgICAgICAgaWYgc2VsZi5fX3ZlcnNpb24gPj0gNzoKKyAgICAgICAgICAgIGtleSA9IChyIiVzXCUwLjFmXFZDXFZDX09CSkVDVFNfUExBVEZPUk1fSU5GT1xXaW4zMlxEaXJlY3RvcmllcyIKKyAgICAgICAgICAgICAgICAgICAlIChzZWxmLl9fcm9vdCwgc2VsZi5fX3ZlcnNpb24pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAga2V5ID0gKHIiJXNcNi4wXEJ1aWxkIFN5c3RlbVxDb21wb25lbnRzXFBsYXRmb3JtcyIKKyAgICAgICAgICAgICAgICAgICByIlxXaW4zMiAoJXMpXERpcmVjdG9yaWVzIiAlIChzZWxmLl9fcm9vdCwgcGxhdGZvcm0pKQorCisgICAgICAgIGZvciBiYXNlIGluIEhLRVlTOgorICAgICAgICAgICAgZCA9IHJlYWRfdmFsdWVzKGJhc2UsIGtleSkKKyAgICAgICAgICAgIGlmIGQ6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fX3ZlcnNpb24gPj0gNzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdChzZWxmLl9fbWFjcm9zLnN1YihkW3BhdGhdKSwgIjsiKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQoZFtwYXRoXSwgIjsiKQorICAgICAgICAjIE1TVkMgNiBzZWVtcyB0byBjcmVhdGUgdGhlIHJlZ2lzdHJ5IGVudHJpZXMgd2UgbmVlZCBvbmx5IHdoZW4KKyAgICAgICAgIyB0aGUgR1VJIGlzIHJ1bi4KKyAgICAgICAgaWYgc2VsZi5fX3ZlcnNpb24gPT0gNjoKKyAgICAgICAgICAgIGZvciBiYXNlIGluIEhLRVlTOgorICAgICAgICAgICAgICAgIGlmIHJlYWRfdmFsdWVzKGJhc2UsIHIiJXNcNi4wIiAlIHNlbGYuX19yb290KSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCJJdCBzZWVtcyB5b3UgaGF2ZSBWaXN1YWwgU3R1ZGlvIDYgaW5zdGFsbGVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IHRoZSBleHBlY3RlZCByZWdpc3RyeSBzZXR0aW5ncyBhcmUgbm90IHByZXNlbnQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiWW91IG11c3QgYXQgbGVhc3QgcnVuIHRoZSBWaXN1YWwgU3R1ZGlvIEdVSSBvbmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzbyB0aGF0IHRoZXNlIGVudHJpZXMgYXJlIGNyZWF0ZWQuIikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIFtdCisKKyAgICBkZWYgc2V0X3BhdGhfZW52X3ZhcihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiU2V0IGVudmlyb25tZW50IHZhcmlhYmxlICduYW1lJyB0byBhbiBNU1ZDIHBhdGggdHlwZSB2YWx1ZS4KKworICAgICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBTRVQgY29tbWFuZCBwcmlvciB0byBleGVjdXRpb24gb2Ygc3Bhd25lZAorICAgICAgICBjb21tYW5kcy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbmFtZSA9PSAibGliIjoKKyAgICAgICAgICAgIHAgPSBzZWxmLmdldF9tc3ZjX3BhdGhzKCJsaWJyYXJ5IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHAgPSBzZWxmLmdldF9tc3ZjX3BhdGhzKG5hbWUpCisgICAgICAgIGlmIHA6CisgICAgICAgICAgICBvcy5lbnZpcm9uW25hbWVdID0gc3RyaW5nLmpvaW4ocCwgJzsnKQorCisKK2lmIGdldF9idWlsZF92ZXJzaW9uKCkgPj0gOC4wOgorICAgIGxvZy5kZWJ1ZygiSW1wb3J0aW5nIG5ldyBjb21waWxlciBmcm9tIGRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyIikKKyAgICBPbGRNU1ZDQ29tcGlsZXIgPSBNU1ZDQ29tcGlsZXIKKyAgICBmcm9tIGRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyIGltcG9ydCBNU1ZDQ29tcGlsZXIKKyAgICAjIGdldF9idWlsZF9hcmNoaXRlY3R1cmUgbm90IHJlYWxseSByZWxldmFudCBub3cgd2Ugc3VwcG9ydCBjcm9zcy1jb21waWxlCisgICAgZnJvbSBkaXN0dXRpbHMubXN2Yzljb21waWxlciBpbXBvcnQgTWFjcm9FeHBhbmRlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL21zdmNjb21waWxlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2NDYzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL21zdmNjb21waWxlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL21zdmNjb21waWxlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM2NDYzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL21zdmNjb21waWxlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3Bhd24ucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9zcGF3bi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzA2MDk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3Bhd24ucHkKQEAgLTAsMCArMSwxOTkgQEAKKyIiImRpc3R1dGlscy5zcGF3bgorCitQcm92aWRlcyB0aGUgJ3NwYXduKCknIGZ1bmN0aW9uLCBhIGZyb250LWVuZCB0byB2YXJpb3VzIHBsYXRmb3JtLQorc3BlY2lmaWMgZnVuY3Rpb25zIGZvciBsYXVuY2hpbmcgYW5vdGhlciBwcm9ncmFtIGluIGEgc3ViLXByb2Nlc3MuCitBbHNvIHByb3ZpZGVzIHRoZSAnZmluZF9leGVjdXRhYmxlKCknIHRvIHNlYXJjaCB0aGUgcGF0aCBmb3IgYSBnaXZlbgorZXhlY3V0YWJsZSBuYW1lLgorIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKKworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBEaXN0dXRpbHNFeGVjRXJyb3IKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworZGVmIHNwYXduKGNtZCwgc2VhcmNoX3BhdGg9MSwgdmVyYm9zZT0wLCBkcnlfcnVuPTApOgorICAgICIiIlJ1biBhbm90aGVyIHByb2dyYW0sIHNwZWNpZmllZCBhcyBhIGNvbW1hbmQgbGlzdCAnY21kJywgaW4gYSBuZXcgcHJvY2Vzcy4KKworICAgICdjbWQnIGlzIGp1c3QgdGhlIGFyZ3VtZW50IGxpc3QgZm9yIHRoZSBuZXcgcHJvY2VzcywgaWUuCisgICAgY21kWzBdIGlzIHRoZSBwcm9ncmFtIHRvIHJ1biBhbmQgY21kWzE6XSBhcmUgdGhlIHJlc3Qgb2YgaXRzIGFyZ3VtZW50cy4KKyAgICBUaGVyZSBpcyBubyB3YXkgdG8gcnVuIGEgcHJvZ3JhbSB3aXRoIGEgbmFtZSBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIGl0cworICAgIGV4ZWN1dGFibGUuCisKKyAgICBJZiAnc2VhcmNoX3BhdGgnIGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgdGhlIHN5c3RlbSdzIGV4ZWN1dGFibGUKKyAgICBzZWFyY2ggcGF0aCB3aWxsIGJlIHVzZWQgdG8gZmluZCB0aGUgcHJvZ3JhbTsgb3RoZXJ3aXNlLCBjbWRbMF0KKyAgICBtdXN0IGJlIHRoZSBleGFjdCBwYXRoIHRvIHRoZSBleGVjdXRhYmxlLiAgSWYgJ2RyeV9ydW4nIGlzIHRydWUsCisgICAgdGhlIGNvbW1hbmQgd2lsbCBub3QgYWN0dWFsbHkgYmUgcnVuLgorCisgICAgUmFpc2UgRGlzdHV0aWxzRXhlY0Vycm9yIGlmIHJ1bm5pbmcgdGhlIHByb2dyYW0gZmFpbHMgaW4gYW55IHdheTsganVzdAorICAgIHJldHVybiBvbiBzdWNjZXNzLgorICAgICIiIgorICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgX3NwYXduX3Bvc2l4KGNtZCwgc2VhcmNoX3BhdGgsIGRyeV9ydW49ZHJ5X3J1bikKKyAgICBlbGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgX3NwYXduX250KGNtZCwgc2VhcmNoX3BhdGgsIGRyeV9ydW49ZHJ5X3J1bikKKyAgICBlbGlmIG9zLm5hbWUgPT0gJ29zMic6CisgICAgICAgIF9zcGF3bl9vczIoY21kLCBzZWFyY2hfcGF0aCwgZHJ5X3J1bj1kcnlfcnVuKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIFwKKyAgICAgICAgICAgICAgImRvbid0IGtub3cgaG93IHRvIHNwYXduIHByb2dyYW1zIG9uIHBsYXRmb3JtICclcyciICUgb3MubmFtZQorCitkZWYgX250X3F1b3RlX2FyZ3MoYXJncyk6CisgICAgIiIiUXVvdGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgRE9TL1dpbmRvd3MgY29udmVudGlvbnMuCisKKyAgICBKdXN0IHdyYXBzIGV2ZXJ5IGFyZ3VtZW50IHdoaWNoIGNvbnRhaW5zIGJsYW5rcyBpbiBkb3VibGUgcXVvdGVzLCBhbmQKKyAgICByZXR1cm5zIGEgbmV3IGFyZ3VtZW50IGxpc3QuCisgICAgIiIiCisgICAgIyBYWFggdGhpcyBkb2Vzbid0IHNlZW0gdmVyeSByb2J1c3QgdG8gbWUgLS0gYnV0IGlmIHRoZSBXaW5kb3dzIGd1eXMKKyAgICAjIHNheSBpdCdsbCB3b3JrLCBJIGd1ZXNzIEknbGwgaGF2ZSB0byBhY2NlcHQgaXQuICAoV2hhdCBpZiBhbiBhcmcKKyAgICAjIGNvbnRhaW5zIHF1b3Rlcz8gIFdoYXQgb3RoZXIgbWFnaWMgY2hhcmFjdGVycywgb3RoZXIgdGhhbiBzcGFjZXMsCisgICAgIyBoYXZlIHRvIGJlIGVzY2FwZWQ/ICBJcyB0aGVyZSBhbiBlc2NhcGluZyBtZWNoYW5pc20gb3RoZXIgdGhhbgorICAgICMgcXVvdGluZz8pCisgICAgZm9yIGksIGFyZyBpbiBlbnVtZXJhdGUoYXJncyk6CisgICAgICAgIGlmICcgJyBpbiBhcmc6CisgICAgICAgICAgICBhcmdzW2ldID0gJyIlcyInICUgYXJnCisgICAgcmV0dXJuIGFyZ3MKKworZGVmIF9zcGF3bl9udChjbWQsIHNlYXJjaF9wYXRoPTEsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wKToKKyAgICBleGVjdXRhYmxlID0gY21kWzBdCisgICAgY21kID0gX250X3F1b3RlX2FyZ3MoY21kKQorICAgIGlmIHNlYXJjaF9wYXRoOgorICAgICAgICAjIGVpdGhlciB3ZSBmaW5kIG9uZSBvciBpdCBzdGF5cyB0aGUgc2FtZQorICAgICAgICBleGVjdXRhYmxlID0gZmluZF9leGVjdXRhYmxlKGV4ZWN1dGFibGUpIG9yIGV4ZWN1dGFibGUKKyAgICBsb2cuaW5mbygnICcuam9pbihbZXhlY3V0YWJsZV0gKyBjbWRbMTpdKSkKKyAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgIyBzcGF3biBmb3IgTlQgcmVxdWlyZXMgYSBmdWxsIHBhdGggdG8gdGhlIC5leGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmMgPSBvcy5zcGF3bnYob3MuUF9XQUlULCBleGVjdXRhYmxlLCBjbWQpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBleGM6CisgICAgICAgICAgICAjIHRoaXMgc2VlbXMgdG8gaGFwcGVuIHdoZW4gdGhlIGNvbW1hbmQgaXNuJ3QgZm91bmQKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0V4ZWNFcnJvciwgXAorICAgICAgICAgICAgICAgICAgImNvbW1hbmQgJyVzJyBmYWlsZWQ6ICVzIiAlIChjbWRbMF0sIGV4Y1stMV0pCisgICAgICAgIGlmIHJjICE9IDA6CisgICAgICAgICAgICAjIGFuZCB0aGlzIHJlZmxlY3RzIHRoZSBjb21tYW5kIHJ1bm5pbmcgYnV0IGZhaWxpbmcKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0V4ZWNFcnJvciwgXAorICAgICAgICAgICAgICAgICAgImNvbW1hbmQgJyVzJyBmYWlsZWQgd2l0aCBleGl0IHN0YXR1cyAlZCIgJSAoY21kWzBdLCByYykKKworZGVmIF9zcGF3bl9vczIoY21kLCBzZWFyY2hfcGF0aD0xLCB2ZXJib3NlPTAsIGRyeV9ydW49MCk6CisgICAgZXhlY3V0YWJsZSA9IGNtZFswXQorICAgIGlmIHNlYXJjaF9wYXRoOgorICAgICAgICAjIGVpdGhlciB3ZSBmaW5kIG9uZSBvciBpdCBzdGF5cyB0aGUgc2FtZQorICAgICAgICBleGVjdXRhYmxlID0gZmluZF9leGVjdXRhYmxlKGV4ZWN1dGFibGUpIG9yIGV4ZWN1dGFibGUKKyAgICBsb2cuaW5mbygnICcuam9pbihbZXhlY3V0YWJsZV0gKyBjbWRbMTpdKSkKKyAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgIyBzcGF3bnYgZm9yIE9TLzIgRU1YIHJlcXVpcmVzIGEgZnVsbCBwYXRoIHRvIHRoZSAuZXhlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJjID0gb3Muc3Bhd252KG9zLlBfV0FJVCwgZXhlY3V0YWJsZSwgY21kKQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZXhjOgorICAgICAgICAgICAgIyB0aGlzIHNlZW1zIHRvIGhhcHBlbiB3aGVuIHRoZSBjb21tYW5kIGlzbid0IGZvdW5kCisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFeGVjRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICJjb21tYW5kICclcycgZmFpbGVkOiAlcyIgJSAoY21kWzBdLCBleGNbLTFdKQorICAgICAgICBpZiByYyAhPSAwOgorICAgICAgICAgICAgIyBhbmQgdGhpcyByZWZsZWN0cyB0aGUgY29tbWFuZCBydW5uaW5nIGJ1dCBmYWlsaW5nCisgICAgICAgICAgICBsb2cuZGVidWcoImNvbW1hbmQgJyVzJyBmYWlsZWQgd2l0aCBleGl0IHN0YXR1cyAlZCIgJSAoY21kWzBdLCByYykpCisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFeGVjRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICJjb21tYW5kICclcycgZmFpbGVkIHdpdGggZXhpdCBzdGF0dXMgJWQiICUgKGNtZFswXSwgcmMpCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCisgICAgX2NmZ190YXJnZXQgPSBOb25lCisgICAgX2NmZ190YXJnZXRfc3BsaXQgPSBOb25lCisKK2RlZiBfc3Bhd25fcG9zaXgoY21kLCBzZWFyY2hfcGF0aD0xLCB2ZXJib3NlPTAsIGRyeV9ydW49MCk6CisgICAgbG9nLmluZm8oJyAnLmpvaW4oY21kKSkKKyAgICBpZiBkcnlfcnVuOgorICAgICAgICByZXR1cm4KKyAgICBleGVjX2ZuID0gc2VhcmNoX3BhdGggYW5kIG9zLmV4ZWN2cCBvciBvcy5leGVjdgorICAgIGV4ZWNfYXJncyA9IFtjbWRbMF0sIGNtZF0KKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgIGdsb2JhbCBfY2ZnX3RhcmdldCwgX2NmZ190YXJnZXRfc3BsaXQKKyAgICAgICAgaWYgX2NmZ190YXJnZXQgaXMgTm9uZToKKyAgICAgICAgICAgIF9jZmdfdGFyZ2V0ID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnKSBvciAnJworICAgICAgICAgICAgaWYgX2NmZ190YXJnZXQ6CisgICAgICAgICAgICAgICAgX2NmZ190YXJnZXRfc3BsaXQgPSBbaW50KHgpIGZvciB4IGluIF9jZmdfdGFyZ2V0LnNwbGl0KCcuJyldCisgICAgICAgIGlmIF9jZmdfdGFyZ2V0OgorICAgICAgICAgICAgIyBlbnN1cmUgdGhhdCB0aGUgZGVwbG95bWVudCB0YXJnZXQgb2YgYnVpbGQgcHJvY2VzcyBpcyBub3QgbGVzcworICAgICAgICAgICAgIyB0aGFuIHRoYXQgdXNlZCB3aGVuIHRoZSBpbnRlcnByZXRlciB3YXMgYnVpbHQuIFRoaXMgZW5zdXJlcworICAgICAgICAgICAgIyBleHRlbnNpb24gbW9kdWxlcyBhcmUgYnVpbHQgd2l0aCBjb3JyZWN0IGNvbXBhdGliaWxpdHkgdmFsdWVzCisgICAgICAgICAgICBjdXJfdGFyZ2V0ID0gb3MuZW52aXJvbi5nZXQoJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcsIF9jZmdfdGFyZ2V0KQorICAgICAgICAgICAgaWYgX2NmZ190YXJnZXRfc3BsaXQgPiBbaW50KHgpIGZvciB4IGluIGN1cl90YXJnZXQuc3BsaXQoJy4nKV06CisgICAgICAgICAgICAgICAgbXlfbXNnID0gKCckTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIG1pc21hdGNoOiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdub3cgIiVzIiBidXQgIiVzIiBkdXJpbmcgY29uZmlndXJlJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChjdXJfdGFyZ2V0LCBfY2ZnX3RhcmdldCkpCisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihteV9tc2cpCisgICAgICAgICAgICBlbnYgPSBkaWN0KG9zLmVudmlyb24sCisgICAgICAgICAgICAgICAgICAgICAgIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVD1jdXJfdGFyZ2V0KQorICAgICAgICAgICAgZXhlY19mbiA9IHNlYXJjaF9wYXRoIGFuZCBvcy5leGVjdnBlIG9yIG9zLmV4ZWN2ZQorICAgICAgICAgICAgZXhlY19hcmdzLmFwcGVuZChlbnYpCisgICAgcGlkID0gb3MuZm9yaygpCisKKyAgICBpZiBwaWQgPT0gMDogICMgaW4gdGhlIGNoaWxkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWNfZm4oKmV4ZWNfYXJncykKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ1bmFibGUgdG8gZXhlY3V0ZSAlczogJXNcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY21kWzBdLCBlLnN0cmVycm9yKSkKKyAgICAgICAgICAgIG9zLl9leGl0KDEpCisKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgidW5hYmxlIHRvIGV4ZWN1dGUgJXMgZm9yIHVua25vd24gcmVhc29ucyIgJSBjbWRbMF0pCisgICAgICAgIG9zLl9leGl0KDEpCisgICAgZWxzZTogICAjIGluIHRoZSBwYXJlbnQKKyAgICAgICAgIyBMb29wIHVudGlsIHRoZSBjaGlsZCBlaXRoZXIgZXhpdHMgb3IgaXMgdGVybWluYXRlZCBieSBhIHNpZ25hbAorICAgICAgICAjIChpZS4ga2VlcCB3YWl0aW5nIGlmIGl0J3MgbWVyZWx5IHN0b3BwZWQpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKHBpZCwgMCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBleGM6CisgICAgICAgICAgICAgICAgaW1wb3J0IGVycm5vCisgICAgICAgICAgICAgICAgaWYgZXhjLmVycm5vID09IGVycm5vLkVJTlRSOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0V4ZWNFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kICclcycgZmFpbGVkOiAlcyIgJSAoY21kWzBdLCBleGNbLTFdKQorICAgICAgICAgICAgaWYgb3MuV0lGU0lHTkFMRUQoc3RhdHVzKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFeGVjRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAiY29tbWFuZCAnJXMnIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICVkIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAoY21kWzBdLCBvcy5XVEVSTVNJRyhzdGF0dXMpKQorCisgICAgICAgICAgICBlbGlmIG9zLldJRkVYSVRFRChzdGF0dXMpOgorICAgICAgICAgICAgICAgIGV4aXRfc3RhdHVzID0gb3MuV0VYSVRTVEFUVVMoc3RhdHVzKQorICAgICAgICAgICAgICAgIGlmIGV4aXRfc3RhdHVzID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgICMgaGV5LCBpdCBzdWNjZWVkZWQhCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXhlY0Vycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kICclcycgZmFpbGVkIHdpdGggZXhpdCBzdGF0dXMgJWQiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY21kWzBdLCBleGl0X3N0YXR1cykKKworICAgICAgICAgICAgZWxpZiBvcy5XSUZTVE9QUEVEKHN0YXR1cyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFeGVjRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBlcnJvciBleGVjdXRpbmcgJyVzJzogdGVybWluYXRpb24gc3RhdHVzICVkIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAoY21kWzBdLCBzdGF0dXMpCisKK2RlZiBmaW5kX2V4ZWN1dGFibGUoZXhlY3V0YWJsZSwgcGF0aD1Ob25lKToKKyAgICAiIiJUcmllcyB0byBmaW5kICdleGVjdXRhYmxlJyBpbiB0aGUgZGlyZWN0b3JpZXMgbGlzdGVkIGluICdwYXRoJy4KKworICAgIEEgc3RyaW5nIGxpc3RpbmcgZGlyZWN0b3JpZXMgc2VwYXJhdGVkIGJ5ICdvcy5wYXRoc2VwJzsgZGVmYXVsdHMgdG8KKyAgICBvcy5lbnZpcm9uWydQQVRIJ10uICBSZXR1cm5zIHRoZSBjb21wbGV0ZSBmaWxlbmFtZSBvciBOb25lIGlmIG5vdCBmb3VuZC4KKyAgICAiIiIKKyAgICBpZiBwYXRoIGlzIE5vbmU6CisgICAgICAgIHBhdGggPSBvcy5lbnZpcm9uWydQQVRIJ10KKyAgICBwYXRocyA9IHBhdGguc3BsaXQob3MucGF0aHNlcCkKKyAgICBiYXNlLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGV4ZWN1dGFibGUpCisKKyAgICBpZiAoc3lzLnBsYXRmb3JtID09ICd3aW4zMicgb3Igb3MubmFtZSA9PSAnb3MyJykgYW5kIChleHQgIT0gJy5leGUnKToKKyAgICAgICAgZXhlY3V0YWJsZSA9IGV4ZWN1dGFibGUgKyAnLmV4ZScKKworICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShleGVjdXRhYmxlKToKKyAgICAgICAgZm9yIHAgaW4gcGF0aHM6CisgICAgICAgICAgICBmID0gb3MucGF0aC5qb2luKHAsIGV4ZWN1dGFibGUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmKToKKyAgICAgICAgICAgICAgICAjIHRoZSBmaWxlIGV4aXN0cywgd2UgaGF2ZSBhIHNob3QgYXQgc3Bhd24gd29ya2luZworICAgICAgICAgICAgICAgIHJldHVybiBmCisgICAgICAgIHJldHVybiBOb25lCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3NwYXduLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3NwYXduLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjM0YWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3Bhd24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3NwYXduLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3NwYXduLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjM0YWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3Bhd24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3N5c2NvbmZpZy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3N5c2NvbmZpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTgwYzAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CkBAIC0wLDAgKzEsNDk0IEBACisiIiJQcm92aWRlIGFjY2VzcyB0byBQeXRob24ncyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAgVGhlIHNwZWNpZmljCitjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBhdmFpbGFibGUgZGVwZW5kIGhlYXZpbHkgb24gdGhlIHBsYXRmb3JtIGFuZAorY29uZmlndXJhdGlvbi4gIFRoZSB2YWx1ZXMgbWF5IGJlIHJldHJpZXZlZCB1c2luZworZ2V0X2NvbmZpZ192YXIobmFtZSksIGFuZCB0aGUgbGlzdCBvZiB2YXJpYWJsZXMgaXMgYXZhaWxhYmxlIHZpYQorZ2V0X2NvbmZpZ192YXJzKCkua2V5cygpLiAgQWRkaXRpb25hbCBjb252ZW5pZW5jZSBmdW5jdGlvbnMgYXJlIGFsc28KK2F2YWlsYWJsZS4KKworV3JpdHRlbiBieTogICBGcmVkIEwuIERyYWtlLCBKci4KK0VtYWlsOiAgICAgICAgPGZkcmFrZUBhY20ub3JnPgorIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN0cmluZworaW1wb3J0IHN5cworCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKKworIyBUaGVzZSBhcmUgbmVlZGVkIGluIGEgY291cGxlIG9mIHNwb3RzLCBzbyBqdXN0IGNvbXB1dGUgdGhlbSBvbmNlLgorUFJFRklYID0gb3MucGF0aC5ub3JtcGF0aChzeXMucHJlZml4KQorRVhFQ19QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjX3ByZWZpeCkKKworIyBQYXRoIHRvIHRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdC4gT24gV2luZG93cyB0aGUgYmluYXJ5IG1heQorIyBsaXZlIGluIHByb2plY3QvUENCdWlsZDkuICBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYW4geDY0IFdpbmRvd3MgYnVpbGQsCisjIGl0J2xsIGxpdmUgaW4gcHJvamVjdC9QQ2J1aWxkL2FtZDY0LgorcHJvamVjdF9iYXNlID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChzeXMuZXhlY3V0YWJsZSkpCitpZiBvcy5uYW1lID09ICJudCIgYW5kICJwY2J1aWxkIiBpbiBwcm9qZWN0X2Jhc2VbLTg6XS5sb3dlcigpOgorICAgIHByb2plY3RfYmFzZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4ocHJvamVjdF9iYXNlLCBvcy5wYXRoLnBhcmRpcikpCisjIFBDL1ZTNy4xCitpZiBvcy5uYW1lID09ICJudCIgYW5kICJcXHBjXFx2IiBpbiBwcm9qZWN0X2Jhc2VbLTEwOl0ubG93ZXIoKToKKyAgICBwcm9qZWN0X2Jhc2UgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHByb2plY3RfYmFzZSwgb3MucGF0aC5wYXJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLnBhcmRpcikpCisjIFBDL0FNRDY0CitpZiBvcy5uYW1lID09ICJudCIgYW5kICJcXHBjYnVpbGRcXGFtZDY0IiBpbiBwcm9qZWN0X2Jhc2VbLTE0Ol0ubG93ZXIoKToKKyAgICBwcm9qZWN0X2Jhc2UgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHByb2plY3RfYmFzZSwgb3MucGF0aC5wYXJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLnBhcmRpcikpCisKKyMgc2V0IGZvciBjcm9zcyBidWlsZHMKK2lmICJfUFlUSE9OX1BST0pFQ1RfQkFTRSIgaW4gb3MuZW52aXJvbjoKKyAgICAjIHRoaXMgaXMgdGhlIGJ1aWxkIGRpcmVjdG9yeSwgYXQgbGVhc3QgZm9yIHBvc2l4CisgICAgcHJvamVjdF9iYXNlID0gb3MucGF0aC5ub3JtcGF0aChvcy5lbnZpcm9uWyJfUFlUSE9OX1BST0pFQ1RfQkFTRSJdKQorCisjIHB5dGhvbl9idWlsZDogKEJvb2xlYW4pIGlmIHRydWUsIHdlJ3JlIGVpdGhlciBidWlsZGluZyBQeXRob24gb3IKKyMgYnVpbGRpbmcgYW4gZXh0ZW5zaW9uIHdpdGggYW4gdW4taW5zdGFsbGVkIFB5dGhvbiwgc28gd2UgdXNlCisjIGRpZmZlcmVudCAoaGFyZC13aXJlZCkgZGlyZWN0b3JpZXMuCisjIFNldHVwLmxvY2FsIGlzIGF2YWlsYWJsZSBmb3IgTWFrZWZpbGUgYnVpbGRzIGluY2x1ZGluZyBWUEFUSCBidWlsZHMsCisjIFNldHVwLmRpc3QgaXMgYXZhaWxhYmxlIG9uIFdpbmRvd3MKK2RlZiBfcHl0aG9uX2J1aWxkKCk6CisgICAgZm9yIGZuIGluICgiU2V0dXAuZGlzdCIsICJTZXR1cC5sb2NhbCIpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4ocHJvamVjdF9iYXNlLCAiTW9kdWxlcyIsIGZuKSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorcHl0aG9uX2J1aWxkID0gX3B5dGhvbl9idWlsZCgpCisKKworZGVmIGdldF9weXRob25fdmVyc2lvbigpOgorICAgICIiIlJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBtYWpvciBhbmQgbWlub3IgUHl0aG9uIHZlcnNpb24sCisgICAgbGVhdmluZyBvZmYgdGhlIHBhdGNobGV2ZWwuICBTYW1wbGUgcmV0dXJuIHZhbHVlcyBjb3VsZCBiZSAnMS41JworICAgIG9yICcyLjInLgorICAgICIiIgorICAgIHJldHVybiBzeXMudmVyc2lvbls6M10KKworCitkZWYgZ2V0X3B5dGhvbl9pbmMocGxhdF9zcGVjaWZpYz0wLCBwcmVmaXg9Tm9uZSk6CisgICAgIiIiUmV0dXJuIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBpbnN0YWxsZWQgUHl0aG9uIGhlYWRlciBmaWxlcy4KKworICAgIElmICdwbGF0X3NwZWNpZmljJyBpcyBmYWxzZSAodGhlIGRlZmF1bHQpLCB0aGlzIGlzIHRoZSBwYXRoIHRvIHRoZQorICAgIG5vbi1wbGF0Zm9ybS1zcGVjaWZpYyBoZWFkZXIgZmlsZXMsIGkuZS4gUHl0aG9uLmggYW5kIHNvIG9uOworICAgIG90aGVyd2lzZSwgdGhpcyBpcyB0aGUgcGF0aCB0byBwbGF0Zm9ybS1zcGVjaWZpYyBoZWFkZXIgZmlsZXMKKyAgICAobmFtZWx5IHB5Y29uZmlnLmgpLgorCisgICAgSWYgJ3ByZWZpeCcgaXMgc3VwcGxpZWQsIHVzZSBpdCBpbnN0ZWFkIG9mIHN5cy5wcmVmaXggb3IKKyAgICBzeXMuZXhlY19wcmVmaXggLS0gaS5lLiwgaWdub3JlICdwbGF0X3NwZWNpZmljJy4KKyAgICAiIiIKKyAgICBpZiBwcmVmaXggaXMgTm9uZToKKyAgICAgICAgcHJlZml4ID0gcGxhdF9zcGVjaWZpYyBhbmQgRVhFQ19QUkVGSVggb3IgUFJFRklYCisKKyAgICAjIEdDQyhtaW5ndyk6IG9zLm5hbWUgaXMgIm50IiBidXQgYnVpbGQgc3lzdGVtIGlzIHBvc2l4CisgICAgaWYgb3MubmFtZSA9PSAicG9zaXgiIG9yIHN5cy52ZXJzaW9uLmZpbmQoJ0dDQycpID49IDA6CisgICAgICAgIGlmIHB5dGhvbl9idWlsZDoKKyAgICAgICAgICAgICMgTk9URTogc3lzY29uZmlnLnB5LTIwMDkxMjEwCisgICAgICAgICAgICAjIEFzc3VtZSB0aGUgZXhlY3V0YWJsZSBpcyBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LiAgVGhlCisgICAgICAgICAgICAjIHB5Y29uZmlnLmggZmlsZSBzaG91bGQgYmUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LiAgU2luY2UKKyAgICAgICAgICAgICMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBtYXkgbm90IGJlIHRoZSBzb3VyY2UgZGlyZWN0b3J5LCB3ZQorICAgICAgICAgICAgIyBtdXN0IHVzZSAic3JjZGlyIiBmcm9tIHRoZSBtYWtlZmlsZSB0byBmaW5kIHRoZSAiSW5jbHVkZSIKKyAgICAgICAgICAgICMgZGlyZWN0b3J5LgorICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoc3lzLmV4ZWN1dGFibGUpKQorICAgICAgICAgICAgaWYgcGxhdF9zcGVjaWZpYzoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbmNkaXIgPSBvcy5wYXRoLmpvaW4oZ2V0X2NvbmZpZ192YXIoJ3NyY2RpcicpLCAnSW5jbHVkZScpCisgICAgICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGgubm9ybXBhdGgoaW5jZGlyKQorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHByZWZpeCwgImluY2x1ZGUiLCAicHl0aG9uIiArIGdldF9weXRob25fdmVyc2lvbigpKQorICAgIGVsaWYgb3MubmFtZSA9PSAibnQiOgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHByZWZpeCwgImluY2x1ZGUiKQorICAgIGVsaWYgb3MubmFtZSA9PSAib3MyIjoKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihwcmVmaXgsICJJbmNsdWRlIikKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKAorICAgICAgICAgICAgIkkgZG9uJ3Qga25vdyB3aGVyZSBQeXRob24gaW5zdGFsbHMgaXRzIEMgaGVhZGVyIGZpbGVzICIKKyAgICAgICAgICAgICJvbiBwbGF0Zm9ybSAnJXMnIiAlIG9zLm5hbWUpCisKKworZGVmIGdldF9weXRob25fbGliKHBsYXRfc3BlY2lmaWM9MCwgc3RhbmRhcmRfbGliPTAsIHByZWZpeD1Ob25lKToKKyAgICAiIiJSZXR1cm4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBQeXRob24gbGlicmFyeSAoc3RhbmRhcmQgb3IKKyAgICBzaXRlIGFkZGl0aW9ucykuCisKKyAgICBJZiAncGxhdF9zcGVjaWZpYycgaXMgdHJ1ZSwgcmV0dXJuIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZworICAgIHBsYXRmb3JtLXNwZWNpZmljIG1vZHVsZXMsIGkuZS4gYW55IG1vZHVsZSBmcm9tIGEgbm9uLXB1cmUtUHl0aG9uCisgICAgbW9kdWxlIGRpc3RyaWJ1dGlvbjsgb3RoZXJ3aXNlLCByZXR1cm4gdGhlIHBsYXRmb3JtLXNoYXJlZCBsaWJyYXJ5CisgICAgZGlyZWN0b3J5LiAgSWYgJ3N0YW5kYXJkX2xpYicgaXMgdHJ1ZSwgcmV0dXJuIHRoZSBkaXJlY3RvcnkKKyAgICBjb250YWluaW5nIHN0YW5kYXJkIFB5dGhvbiBsaWJyYXJ5IG1vZHVsZXM7IG90aGVyd2lzZSwgcmV0dXJuIHRoZQorICAgIGRpcmVjdG9yeSBmb3Igc2l0ZS1zcGVjaWZpYyBtb2R1bGVzLgorCisgICAgSWYgJ3ByZWZpeCcgaXMgc3VwcGxpZWQsIHVzZSBpdCBpbnN0ZWFkIG9mIHN5cy5wcmVmaXggb3IKKyAgICBzeXMuZXhlY19wcmVmaXggLS0gaS5lLiwgaWdub3JlICdwbGF0X3NwZWNpZmljJy4KKyAgICAiIiIKKyAgICBpZiBwcmVmaXggaXMgTm9uZToKKyAgICAgICAgcHJlZml4ID0gcGxhdF9zcGVjaWZpYyBhbmQgRVhFQ19QUkVGSVggb3IgUFJFRklYCisKKyAgICBpZiBvcy5uYW1lID09ICJwb3NpeCIgb3Igc3lzLnZlcnNpb24uZmluZCgnR0NDJykgPj0gMDoKKyAgICAgICAgbGlicHl0aG9uID0gb3MucGF0aC5qb2luKHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaWIiLCAicHl0aG9uIiArIGdldF9weXRob25fdmVyc2lvbigpKQorICAgICAgICBpZiBzdGFuZGFyZF9saWI6CisgICAgICAgICAgICByZXR1cm4gbGlicHl0aG9uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGxpYnB5dGhvbiwgInNpdGUtcGFja2FnZXMiKQorCisgICAgZWxpZiBvcy5uYW1lID09ICJudCI6CisgICAgICAgIGlmIHN0YW5kYXJkX2xpYjoKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4ocHJlZml4LCAiTGliIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGdldF9weXRob25fdmVyc2lvbigpIDwgIjIuMiI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHByZWZpeCwgIkxpYiIsICJzaXRlLXBhY2thZ2VzIikKKworICAgIGVsaWYgb3MubmFtZSA9PSAib3MyIjoKKyAgICAgICAgaWYgc3RhbmRhcmRfbGliOgorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihwcmVmaXgsICJMaWIiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihwcmVmaXgsICJMaWIiLCAic2l0ZS1wYWNrYWdlcyIpCisKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKAorICAgICAgICAgICAgIkkgZG9uJ3Qga25vdyB3aGVyZSBQeXRob24gaW5zdGFsbHMgaXRzIGxpYnJhcnkgIgorICAgICAgICAgICAgIm9uIHBsYXRmb3JtICclcyciICUgb3MubmFtZSkKKworCisKK2RlZiBjdXN0b21pemVfY29tcGlsZXIoY29tcGlsZXIpOgorICAgICIiIkRvIGFueSBwbGF0Zm9ybS1zcGVjaWZpYyBjdXN0b21pemF0aW9uIG9mIGEgQ0NvbXBpbGVyIGluc3RhbmNlLgorCisgICAgTWFpbmx5IG5lZWRlZCBvbiBVbml4LCBzbyB3ZSBjYW4gcGx1ZyBpbiB0aGUgaW5mb3JtYXRpb24gdGhhdAorICAgIHZhcmllcyBhY3Jvc3MgVW5pY2VzIGFuZCBpcyBzdG9yZWQgaW4gUHl0aG9uJ3MgTWFrZWZpbGUuCisKKyAgICBOT1RFOiAoa25vd24gbGltaXRhdGlvbiBvZiBweXRob24gYnVpbGQvaW5zdGFsbCBzeXN0ZW0pCisgICAgSW4gY3Jvc3MtYnVpbGQgZW52aXJvbm1lbnQgbWFrZSBtYWNyb3MgbGlrZSBDQyBhbmQgTERTSEFSRUQKKyAgICBjb250YWluIGNyb3NzLWNvbXBpbGVyL2xpbmtlciBpbnN0ZWFkIG9mIGhvc3QgY29tcGlsZXIvbGlua2VyLgorICAgICIiIgorICAgIHBvc2l4X2J1aWxkID0gTm9uZQorICAgIGlmIGNvbXBpbGVyLmNvbXBpbGVyX3R5cGUgPT0gInVuaXgiOgorICAgICAgIHBvc2l4X2J1aWxkID0gVHJ1ZQorICAgIGVsaWYgY29tcGlsZXIuY29tcGlsZXJfdHlwZSA9PSAibWluZ3czMiI6CisgICAgICAgIGlmIHN5cy52ZXJzaW9uLmZpbmQoJ0dDQycpID49IDA6CisgICAgICAgICAgICBwb3NpeF9idWlsZCA9IFRydWUKKyAgICBpZiBwb3NpeF9idWlsZCA9PSBUcnVlOgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgICAgICAgICAjIFBlcmZvcm0gZmlyc3QtdGltZSBjdXN0b21pemF0aW9uIG9mIGNvbXBpbGVyLXJlbGF0ZWQKKyAgICAgICAgICAgICMgY29uZmlnIHZhcnMgb24gT1MgWCBub3cgdGhhdCB3ZSBrbm93IHdlIG5lZWQgYSBjb21waWxlci4KKyAgICAgICAgICAgICMgVGhpcyBpcyBwcmltYXJpbHkgdG8gc3VwcG9ydCBQeXRob25zIGZyb20gYmluYXJ5CisgICAgICAgICAgICAjIGluc3RhbGxlcnMuICBUaGUga2luZCBhbmQgcGF0aHMgdG8gYnVpbGQgdG9vbHMgb24KKyAgICAgICAgICAgICMgdGhlIHVzZXIgc3lzdGVtIG1heSB2YXJ5IHNpZ25pZmljYW50bHkgZnJvbSB0aGUgc3lzdGVtCisgICAgICAgICAgICAjIHRoYXQgUHl0aG9uIGl0c2VsZiB3YXMgYnVpbHQgb24uICBBbHNvIHRoZSB1c2VyIE9TCisgICAgICAgICAgICAjIHZlcnNpb24gYW5kIGJ1aWxkIHRvb2xzIG1heSBub3Qgc3VwcG9ydCB0aGUgc2FtZSBzZXQKKyAgICAgICAgICAgICMgb2YgQ1BVIGFyY2hpdGVjdHVyZXMgZm9yIHVuaXZlcnNhbCBidWlsZHMuCisgICAgICAgICAgICBnbG9iYWwgX2NvbmZpZ192YXJzCisgICAgICAgICAgICBpZiBub3QgX2NvbmZpZ192YXJzLmdldCgnQ1VTVE9NSVpFRF9PU1hfQ09NUElMRVInLCAnJyk6CisgICAgICAgICAgICAgICAgaW1wb3J0IF9vc3hfc3VwcG9ydAorICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5jdXN0b21pemVfY29tcGlsZXIoX2NvbmZpZ192YXJzKQorICAgICAgICAgICAgICAgIF9jb25maWdfdmFyc1snQ1VTVE9NSVpFRF9PU1hfQ09NUElMRVInXSA9ICdUcnVlJworCisgICAgICAgIChjYywgY3h4LCBvcHQsIGNmbGFncywgY2NzaGFyZWQsIGxkc2hhcmVkLCBzb19leHQsIGFyLCBhcl9mbGFncykgPSBcCisgICAgICAgICAgICBnZXRfY29uZmlnX3ZhcnMoJ0NDJywgJ0NYWCcsICdPUFQnLCAnQ0ZMQUdTJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0NTSEFSRUQnLCAnTERTSEFSRUQnLCAnU08nLCAnQVInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBUkZMQUdTJykKKworICAgICAgICBuZXdjYyA9IE5vbmUKKyAgICAgICAgaWYgJ0NDJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgY2MgPSBvcy5lbnZpcm9uWydDQyddCisgICAgICAgIGlmICdDWFgnIGluIG9zLmVudmlyb246CisgICAgICAgICAgICBjeHggPSBvcy5lbnZpcm9uWydDWFgnXQorICAgICAgICBpZiAnTERTSEFSRUQnIGluIG9zLmVudmlyb246CisgICAgICAgICAgICBsZHNoYXJlZCA9IG9zLmVudmlyb25bJ0xEU0hBUkVEJ10KKyAgICAgICAgaWYgJ0NQUCcgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGNwcCA9IG9zLmVudmlyb25bJ0NQUCddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjcHAgPSBjYyArICIgLUUiICAgICAgICAgICAjIG5vdCBhbHdheXMKKyAgICAgICAgaWYgJ0xERkxBR1MnIGluIG9zLmVudmlyb246CisgICAgICAgICAgICBsZHNoYXJlZCA9IGxkc2hhcmVkICsgJyAnICsgb3MuZW52aXJvblsnTERGTEFHUyddCisgICAgICAgIGlmICdDRkxBR1MnIGluIG9zLmVudmlyb246CisgICAgICAgICAgICBjZmxhZ3MgPSBvcHQgKyAnICcgKyBvcy5lbnZpcm9uWydDRkxBR1MnXQorICAgICAgICAgICAgbGRzaGFyZWQgPSBsZHNoYXJlZCArICcgJyArIG9zLmVudmlyb25bJ0NGTEFHUyddCisgICAgICAgIGlmICdDUFBGTEFHUycgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGNwcCA9IGNwcCArICcgJyArIG9zLmVudmlyb25bJ0NQUEZMQUdTJ10KKyAgICAgICAgICAgIGNmbGFncyA9IGNmbGFncyArICcgJyArIG9zLmVudmlyb25bJ0NQUEZMQUdTJ10KKyAgICAgICAgICAgIGxkc2hhcmVkID0gbGRzaGFyZWQgKyAnICcgKyBvcy5lbnZpcm9uWydDUFBGTEFHUyddCisgICAgICAgIGlmICdBUicgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGFyID0gb3MuZW52aXJvblsnQVInXQorICAgICAgICBpZiAnQVJGTEFHUycgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGFyY2hpdmVyID0gYXIgKyAnICcgKyBvcy5lbnZpcm9uWydBUkZMQUdTJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyY2hpdmVyID0gYXIgKyAnICcgKyBhcl9mbGFncworCisgICAgICAgIGNjX2NtZCA9IGNjICsgJyAnICsgY2ZsYWdzCisgICAgICAgIGNvbXBpbGVyLnNldF9leGVjdXRhYmxlcygKKyAgICAgICAgICAgIHByZXByb2Nlc3Nvcj1jcHAsCisgICAgICAgICAgICBjb21waWxlcj1jY19jbWQsCisgICAgICAgICAgICBjb21waWxlcl9zbz1jY19jbWQgKyAnICcgKyBjY3NoYXJlZCwKKyAgICAgICAgICAgIGNvbXBpbGVyX2N4eD1jeHgsCisgICAgICAgICAgICBsaW5rZXJfc289bGRzaGFyZWQsCisgICAgICAgICAgICBsaW5rZXJfZXhlPWNjLAorICAgICAgICAgICAgYXJjaGl2ZXI9YXJjaGl2ZXIpCisKKyAgICAgICAgY29tcGlsZXIuc2hhcmVkX2xpYl9leHRlbnNpb24gPSBzb19leHQKKworCitkZWYgZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKCk6CisgICAgIiIiUmV0dXJuIGZ1bGwgcGF0aG5hbWUgb2YgaW5zdGFsbGVkIHB5Y29uZmlnLmggZmlsZS4iIiIKKyAgICBpZiBweXRob25fYnVpbGQ6CisgICAgICAgICMgR0NDKG1pbmd3KTogb3MubmFtZSBpcyAibnQiIGJ1dCBidWlsZCBzeXN0ZW0gaXMgcG9zaXgKKyAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiIGFuZCBzeXMudmVyc2lvbi5maW5kKCdHQ0MnKSA8IDA6CisgICAgICAgICAgICBpbmNfZGlyID0gb3MucGF0aC5qb2luKHByb2plY3RfYmFzZSwgIlBDIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGluY19kaXIgPSBwcm9qZWN0X2Jhc2UKKyAgICBlbHNlOgorICAgICAgICBpbmNfZGlyID0gZ2V0X3B5dGhvbl9pbmMocGxhdF9zcGVjaWZpYz0xKQorICAgIGlmIGdldF9weXRob25fdmVyc2lvbigpIDwgJzIuMic6CisgICAgICAgIGNvbmZpZ19oID0gJ2NvbmZpZy5oJworICAgIGVsc2U6CisgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIGNvbmZpZy5oIGZpbGUgY2hhbmdlZCBpbiAyLjIKKyAgICAgICAgY29uZmlnX2ggPSAncHljb25maWcuaCcKKyAgICByZXR1cm4gb3MucGF0aC5qb2luKGluY19kaXIsIGNvbmZpZ19oKQorCisKK2RlZiBnZXRfbWFrZWZpbGVfZmlsZW5hbWUoKToKKyAgICAiIiJSZXR1cm4gZnVsbCBwYXRobmFtZSBvZiBpbnN0YWxsZWQgTWFrZWZpbGUgZnJvbSB0aGUgUHl0aG9uIGJ1aWxkLiIiIgorICAgIGlmIHB5dGhvbl9idWlsZDoKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihwcm9qZWN0X2Jhc2UsICJNYWtlZmlsZSIpCisgICAgbGliX2RpciA9IGdldF9weXRob25fbGliKHBsYXRfc3BlY2lmaWM9MSwgc3RhbmRhcmRfbGliPTEpCisgICAgcmV0dXJuIG9zLnBhdGguam9pbihsaWJfZGlyLCAiY29uZmlnIiwgIk1ha2VmaWxlIikKKworCitkZWYgcGFyc2VfY29uZmlnX2goZnAsIGc9Tm9uZSk6CisgICAgIiIiUGFyc2UgYSBjb25maWcuaC1zdHlsZSBmaWxlLgorCisgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbmFtZS92YWx1ZSBwYWlycyBpcyByZXR1cm5lZC4gIElmIGFuCisgICAgb3B0aW9uYWwgZGljdGlvbmFyeSBpcyBwYXNzZWQgaW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgaXQgaXMKKyAgICB1c2VkIGluc3RlYWQgb2YgYSBuZXcgZGljdGlvbmFyeS4KKyAgICAiIiIKKyAgICBpZiBnIGlzIE5vbmU6CisgICAgICAgIGcgPSB7fQorICAgIGRlZmluZV9yeCA9IHJlLmNvbXBpbGUoIiNkZWZpbmUgKFtBLVpdW0EtWmEtejAtOV9dKykgKC4qKVxuIikKKyAgICB1bmRlZl9yeCA9IHJlLmNvbXBpbGUoIi9bKl0gI3VuZGVmIChbQS1aXVtBLVphLXowLTlfXSspIFsqXS9cbiIpCisgICAgIworICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgbSA9IGRlZmluZV9yeC5tYXRjaChsaW5lKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgbiwgdiA9IG0uZ3JvdXAoMSwgMikKKyAgICAgICAgICAgIHRyeTogdiA9IGludCh2KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgICAgIGdbbl0gPSB2CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtID0gdW5kZWZfcngubWF0Y2gobGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgZ1ttLmdyb3VwKDEpXSA9IDAKKyAgICByZXR1cm4gZworCisKKyMgUmVnZXhlcyBuZWVkZWQgZm9yIHBhcnNpbmcgTWFrZWZpbGUgKGFuZCBzaW1pbGFyIHN5bnRheGVzLAorIyBsaWtlIG9sZC1zdHlsZSBTZXR1cCBmaWxlcykuCitfdmFyaWFibGVfcnggPSByZS5jb21waWxlKCIoW2EtekEtWl1bYS16QS1aMC05X10rKVxzKj1ccyooLiopIikKK19maW5kdmFyMV9yeCA9IHJlLmNvbXBpbGUociJcJFwoKFtBLVphLXpdW0EtWmEtejAtOV9dKilcKSIpCitfZmluZHZhcjJfcnggPSByZS5jb21waWxlKHIiXCR7KFtBLVphLXpdW0EtWmEtejAtOV9dKil9IikKKworZGVmIHBhcnNlX21ha2VmaWxlKGZuLCBnPU5vbmUpOgorICAgICIiIlBhcnNlIGEgTWFrZWZpbGUtc3R5bGUgZmlsZS4KKworICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIG5hbWUvdmFsdWUgcGFpcnMgaXMgcmV0dXJuZWQuICBJZiBhbgorICAgIG9wdGlvbmFsIGRpY3Rpb25hcnkgaXMgcGFzc2VkIGluIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQsIGl0IGlzCisgICAgdXNlZCBpbnN0ZWFkIG9mIGEgbmV3IGRpY3Rpb25hcnkuCisgICAgIiIiCisgICAgZnJvbSBkaXN0dXRpbHMudGV4dF9maWxlIGltcG9ydCBUZXh0RmlsZQorICAgIGZwID0gVGV4dEZpbGUoZm4sIHN0cmlwX2NvbW1lbnRzPTEsIHNraXBfYmxhbmtzPTEsIGpvaW5fbGluZXM9MSkKKworICAgIGlmIGcgaXMgTm9uZToKKyAgICAgICAgZyA9IHt9CisgICAgZG9uZSA9IHt9CisgICAgbm90ZG9uZSA9IHt9CisKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICBpZiBsaW5lIGlzIE5vbmU6ICAjIGVvZgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgbSA9IF92YXJpYWJsZV9yeC5tYXRjaChsaW5lKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgbiwgdiA9IG0uZ3JvdXAoMSwgMikKKyAgICAgICAgICAgIHYgPSB2LnN0cmlwKCkKKyAgICAgICAgICAgICMgYCQkJyBpcyBhIGxpdGVyYWwgYCQnIGluIG1ha2UKKyAgICAgICAgICAgIHRtcHYgPSB2LnJlcGxhY2UoJyQkJywgJycpCisKKyAgICAgICAgICAgIGlmICIkIiBpbiB0bXB2OgorICAgICAgICAgICAgICAgIG5vdGRvbmVbbl0gPSB2CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdiA9IGludCh2KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIGluc2VydCBsaXRlcmFsIGAkJworICAgICAgICAgICAgICAgICAgICBkb25lW25dID0gdi5yZXBsYWNlKCckJCcsICckJykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkb25lW25dID0gdgorCisgICAgIyBkbyB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUKKyAgICB3aGlsZSBub3Rkb25lOgorICAgICAgICBmb3IgbmFtZSBpbiBub3Rkb25lLmtleXMoKToKKyAgICAgICAgICAgIHZhbHVlID0gbm90ZG9uZVtuYW1lXQorICAgICAgICAgICAgbSA9IF9maW5kdmFyMV9yeC5zZWFyY2godmFsdWUpIG9yIF9maW5kdmFyMl9yeC5zZWFyY2godmFsdWUpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIG4gPSBtLmdyb3VwKDEpCisgICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgbiBpbiBkb25lOgorICAgICAgICAgICAgICAgICAgICBpdGVtID0gc3RyKGRvbmVbbl0pCisgICAgICAgICAgICAgICAgZWxpZiBuIGluIG5vdGRvbmU6CisgICAgICAgICAgICAgICAgICAgICMgZ2V0IGl0IG9uIGEgc3Vic2VxdWVudCByb3VuZAorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZWxpZiBuIGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgICAgICMgZG8gaXQgbGlrZSBtYWtlOiBmYWxsIGJhY2sgdG8gZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IG9zLmVudmlyb25bbl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkb25lW25dID0gaXRlbSA9ICIiCisgICAgICAgICAgICAgICAgaWYgZm91bmQ6CisgICAgICAgICAgICAgICAgICAgIGFmdGVyID0gdmFsdWVbbS5lbmQoKTpdCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbOm0uc3RhcnQoKV0gKyBpdGVtICsgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgIiQiIGluIGFmdGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgbm90ZG9uZVtuYW1lXSA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6IHZhbHVlID0gaW50KHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVtuYW1lXSA9IHZhbHVlLnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVtuYW1lXSA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgbm90ZG9uZVtuYW1lXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGJvZ3VzIHZhcmlhYmxlIHJlZmVyZW5jZTsganVzdCBkcm9wIGl0IHNpbmNlIHdlIGNhbid0IGRlYWwKKyAgICAgICAgICAgICAgICBkZWwgbm90ZG9uZVtuYW1lXQorCisgICAgZnAuY2xvc2UoKQorCisgICAgIyBzdHJpcCBzcHVyaW91cyBzcGFjZXMKKyAgICBmb3IgaywgdiBpbiBkb25lLml0ZW1zKCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uodiwgc3RyKToKKyAgICAgICAgICAgIGRvbmVba10gPSB2LnN0cmlwKCkKKworICAgICMgc2F2ZSB0aGUgcmVzdWx0cyBpbiB0aGUgZ2xvYmFsIGRpY3Rpb25hcnkKKyAgICBnLnVwZGF0ZShkb25lKQorICAgIHJldHVybiBnCisKKworZGVmIGV4cGFuZF9tYWtlZmlsZV92YXJzKHMsIHZhcnMpOgorICAgICIiIkV4cGFuZCBNYWtlZmlsZS1zdHlsZSB2YXJpYWJsZXMgLS0gIiR7Zm9vfSIgb3IgIiQoZm9vKSIgLS0gaW4KKyAgICAnc3RyaW5nJyBhY2NvcmRpbmcgdG8gJ3ZhcnMnIChhIGRpY3Rpb25hcnkgbWFwcGluZyB2YXJpYWJsZSBuYW1lcyB0bworICAgIHZhbHVlcykuICBWYXJpYWJsZXMgbm90IHByZXNlbnQgaW4gJ3ZhcnMnIGFyZSBzaWxlbnRseSBleHBhbmRlZCB0byB0aGUKKyAgICBlbXB0eSBzdHJpbmcuICBUaGUgdmFyaWFibGUgdmFsdWVzIGluICd2YXJzJyBzaG91bGQgbm90IGNvbnRhaW4gZnVydGhlcgorICAgIHZhcmlhYmxlIGV4cGFuc2lvbnM7IGlmICd2YXJzJyBpcyB0aGUgb3V0cHV0IG9mICdwYXJzZV9tYWtlZmlsZSgpJywKKyAgICB5b3UncmUgZmluZS4gIFJldHVybnMgYSB2YXJpYWJsZS1leHBhbmRlZCB2ZXJzaW9uIG9mICdzJy4KKyAgICAiIiIKKworICAgICMgVGhpcyBhbGdvcml0aG0gZG9lcyBtdWx0aXBsZSBleHBhbnNpb24sIHNvIGlmIHZhcnNbJ2ZvbyddIGNvbnRhaW5zCisgICAgIyAiJHtiYXJ9IiwgaXQgd2lsbCBleHBhbmQgJHtmb299IHRvICR7YmFyfSwgYW5kIHRoZW4gZXhwYW5kCisgICAgIyAke2Jhcn0uLi4gYW5kIHNvIGZvcnRoLiAgVGhpcyBpcyBmaW5lIGFzIGxvbmcgYXMgJ3ZhcnMnIGNvbWVzIGZyb20KKyAgICAjICdwYXJzZV9tYWtlZmlsZSgpJywgd2hpY2ggdGFrZXMgY2FyZSBvZiBzdWNoIGV4cGFuc2lvbnMgZWFnZXJseSwKKyAgICAjIGFjY29yZGluZyB0byBtYWtlJ3MgdmFyaWFibGUgZXhwYW5zaW9uIHNlbWFudGljcy4KKworICAgIHdoaWxlIDE6CisgICAgICAgIG0gPSBfZmluZHZhcjFfcnguc2VhcmNoKHMpIG9yIF9maW5kdmFyMl9yeC5zZWFyY2gocykKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIChiZWcsIGVuZCkgPSBtLnNwYW4oKQorICAgICAgICAgICAgcyA9IHNbMDpiZWddICsgdmFycy5nZXQobS5ncm91cCgxKSkgKyBzW2VuZDpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBicmVhaworICAgIHJldHVybiBzCisKKworX2NvbmZpZ192YXJzID0gTm9uZQorCitkZWYgX2luaXRfcG9zaXgoKToKKyAgICAiIiJJbml0aWFsaXplIHRoZSBtb2R1bGUgYXMgYXBwcm9wcmlhdGUgZm9yIFBPU0lYIHN5c3RlbXMuIiIiCisgICAgIyBfc3lzY29uZmlnZGF0YSBpcyBnZW5lcmF0ZWQgYXQgYnVpbGQgdGltZSwgc2VlIHRoZSBzeXNjb25maWcgbW9kdWxlCisgICAgZnJvbSBfc3lzY29uZmlnZGF0YSBpbXBvcnQgYnVpbGRfdGltZV92YXJzCisgICAgZ2xvYmFsIF9jb25maWdfdmFycworICAgIF9jb25maWdfdmFycyA9IHt9CisgICAgX2NvbmZpZ192YXJzLnVwZGF0ZShidWlsZF90aW1lX3ZhcnMpCisKKworZGVmIF9pbml0X250KCk6CisgICAgIiIiSW5pdGlhbGl6ZSB0aGUgbW9kdWxlIGFzIGFwcHJvcHJpYXRlIGZvciBOVCIiIgorICAgIGlmIHN5cy52ZXJzaW9uLmZpbmQoJ0dDQycpID49IDA6CisgICAgICAgICMgR0NDKG1pbmd3KSB1c2UgcG9zaXggYnVpbGQgc3lzdGVtCisgICAgICAgICMgRklYTUU6IG1heSBiZSBtb2RpZmljYXRpb24gaGFzIHRvIGJlIGluIGdldF9jb25maWdfdmFycyA/CisgICAgICAgIF9pbml0X3Bvc2l4KCkKKyAgICAgICAgcmV0dXJuCisgICAgZyA9IHt9CisgICAgIyBzZXQgYmFzaWMgaW5zdGFsbCBkaXJlY3RvcmllcworICAgIGdbJ0xJQkRFU1QnXSA9IGdldF9weXRob25fbGliKHBsYXRfc3BlY2lmaWM9MCwgc3RhbmRhcmRfbGliPTEpCisgICAgZ1snQklOTElCREVTVCddID0gZ2V0X3B5dGhvbl9saWIocGxhdF9zcGVjaWZpYz0xLCBzdGFuZGFyZF9saWI9MSkKKworICAgICMgWFhYIGhtbW0uLiBhIG5vcm1hbCBpbnN0YWxsIHB1dHMgaW5jbHVkZSBmaWxlcyBoZXJlCisgICAgZ1snSU5DTFVERVBZJ10gPSBnZXRfcHl0aG9uX2luYyhwbGF0X3NwZWNpZmljPTApCisKKyAgICBnWydTTyddID0gJy5weWQnCisgICAgZ1snRVhFJ10gPSAiLmV4ZSIKKyAgICBnWydWRVJTSU9OJ10gPSBnZXRfcHl0aG9uX3ZlcnNpb24oKS5yZXBsYWNlKCIuIiwgIiIpCisgICAgZ1snQklORElSJ10gPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKHN5cy5leGVjdXRhYmxlKSkKKworICAgIGdsb2JhbCBfY29uZmlnX3ZhcnMKKyAgICBfY29uZmlnX3ZhcnMgPSBnCisKKworZGVmIF9pbml0X29zMigpOgorICAgICIiIkluaXRpYWxpemUgdGhlIG1vZHVsZSBhcyBhcHByb3ByaWF0ZSBmb3IgT1MvMiIiIgorICAgIGcgPSB7fQorICAgICMgc2V0IGJhc2ljIGluc3RhbGwgZGlyZWN0b3JpZXMKKyAgICBnWydMSUJERVNUJ10gPSBnZXRfcHl0aG9uX2xpYihwbGF0X3NwZWNpZmljPTAsIHN0YW5kYXJkX2xpYj0xKQorICAgIGdbJ0JJTkxJQkRFU1QnXSA9IGdldF9weXRob25fbGliKHBsYXRfc3BlY2lmaWM9MSwgc3RhbmRhcmRfbGliPTEpCisKKyAgICAjIFhYWCBobW1tLi4gYSBub3JtYWwgaW5zdGFsbCBwdXRzIGluY2x1ZGUgZmlsZXMgaGVyZQorICAgIGdbJ0lOQ0xVREVQWSddID0gZ2V0X3B5dGhvbl9pbmMocGxhdF9zcGVjaWZpYz0wKQorCisgICAgZ1snU08nXSA9ICcucHlkJworICAgIGdbJ0VYRSddID0gIi5leGUiCisKKyAgICBnbG9iYWwgX2NvbmZpZ192YXJzCisgICAgX2NvbmZpZ192YXJzID0gZworCisKK2RlZiBnZXRfY29uZmlnX3ZhcnMoKmFyZ3MpOgorICAgICIiIldpdGggbm8gYXJndW1lbnRzLCByZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIGFsbCBjb25maWd1cmF0aW9uCisgICAgdmFyaWFibGVzIHJlbGV2YW50IGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4gIEdlbmVyYWxseSB0aGlzIGluY2x1ZGVzCisgICAgZXZlcnl0aGluZyBuZWVkZWQgdG8gYnVpbGQgZXh0ZW5zaW9ucyBhbmQgaW5zdGFsbCBib3RoIHB1cmUgbW9kdWxlcyBhbmQKKyAgICBleHRlbnNpb25zLiAgT24gVW5peCwgdGhpcyBtZWFucyBldmVyeSB2YXJpYWJsZSBkZWZpbmVkIGluIFB5dGhvbidzCisgICAgaW5zdGFsbGVkIE1ha2VmaWxlOyBvbiBXaW5kb3dzIGFuZCBNYWMgT1MgaXQncyBhIG11Y2ggc21hbGxlciBzZXQuCisKKyAgICBXaXRoIGFyZ3VtZW50cywgcmV0dXJuIGEgbGlzdCBvZiB2YWx1ZXMgdGhhdCByZXN1bHQgZnJvbSBsb29raW5nIHVwCisgICAgZWFjaCBhcmd1bWVudCBpbiB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBkaWN0aW9uYXJ5LgorICAgICIiIgorICAgIGdsb2JhbCBfY29uZmlnX3ZhcnMKKyAgICBpZiBfY29uZmlnX3ZhcnMgaXMgTm9uZToKKyAgICAgICAgZnVuYyA9IGdsb2JhbHMoKS5nZXQoIl9pbml0XyIgKyBvcy5uYW1lKQorICAgICAgICBpZiBmdW5jOgorICAgICAgICAgICAgZnVuYygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfY29uZmlnX3ZhcnMgPSB7fQorCisgICAgICAgICMgTm9ybWFsaXplZCB2ZXJzaW9ucyBvZiBwcmVmaXggYW5kIGV4ZWNfcHJlZml4IGFyZSBoYW5keSB0byBoYXZlOworICAgICAgICAjIGluIGZhY3QsIHRoZXNlIGFyZSB0aGUgc3RhbmRhcmQgdmVyc2lvbnMgdXNlZCBtb3N0IHBsYWNlcyBpbiB0aGUKKyAgICAgICAgIyBEaXN0dXRpbHMuCisgICAgICAgIF9jb25maWdfdmFyc1sncHJlZml4J10gPSBQUkVGSVgKKyAgICAgICAgX2NvbmZpZ192YXJzWydleGVjX3ByZWZpeCddID0gRVhFQ19QUkVGSVgKKworICAgICAgICAjIE9TIFggcGxhdGZvcm1zIHJlcXVpcmUgc3BlY2lhbCBjdXN0b21pemF0aW9uIHRvIGhhbmRsZQorICAgICAgICAjIG11bHRpLWFyY2hpdGVjdHVyZSwgbXVsdGktb3MtdmVyc2lvbiBpbnN0YWxsZXJzCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIGltcG9ydCBfb3N4X3N1cHBvcnQKKyAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5jdXN0b21pemVfY29uZmlnX3ZhcnMoX2NvbmZpZ192YXJzKQorCisgICAgaWYgYXJnczoKKyAgICAgICAgdmFscyA9IFtdCisgICAgICAgIGZvciBuYW1lIGluIGFyZ3M6CisgICAgICAgICAgICB2YWxzLmFwcGVuZChfY29uZmlnX3ZhcnMuZ2V0KG5hbWUpKQorICAgICAgICByZXR1cm4gdmFscworICAgIGVsc2U6CisgICAgICAgIHJldHVybiBfY29uZmlnX3ZhcnMKKworZGVmIGdldF9jb25maWdfdmFyKG5hbWUpOgorICAgICIiIlJldHVybiB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgdmFyaWFibGUgdXNpbmcgdGhlIGRpY3Rpb25hcnkKKyAgICByZXR1cm5lZCBieSAnZ2V0X2NvbmZpZ192YXJzKCknLiAgRXF1aXZhbGVudCB0bworICAgIGdldF9jb25maWdfdmFycygpLmdldChuYW1lKQorICAgICIiIgorICAgIHJldHVybiBnZXRfY29uZmlnX3ZhcnMoKS5nZXQobmFtZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3N5c2NvbmZpZy5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9zeXNjb25maWcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMjY2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9zeXNjb25maWcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3N5c2NvbmZpZy5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9zeXNjb25maWcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMjY2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9zeXNjb25maWcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL1NldHVwLnNhbXBsZSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL1NldHVwLnNhbXBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmM0MjkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvU2V0dXAuc2FtcGxlCkBAIC0wLDAgKzEsNjcgQEAKKyMgU2V0dXAgZmlsZSBmcm9tIHRoZSBweWdhbWUgcHJvamVjdAorCisjLS1TdGFydENvbmZpZworU0RMID0gLUkvdXNyL2luY2x1ZGUvU0RMIC1EX1JFRU5UUkFOVCAtbFNETAorRk9OVCA9IC1sU0RMX3R0ZgorSU1BR0UgPSAtbFNETF9pbWFnZQorTUlYRVIgPSAtbFNETF9taXhlcgorU01QRUcgPSAtbHNtcGVnCitQTkcgPSAtbHBuZworSlBFRyA9IC1sanBlZworU0NSQVAgPSAtbFgxMQorUE9SVE1JREkgPSAtbHBvcnRtaWRpCitQT1JUVElNRSA9IC1scG9ydHRpbWUKKyMtLUVuZENvbmZpZworCisjREVCVUcgPSAtQy1XIC1DLVdhbGwKK0RFQlVHID0gCisKKyN0aGUgZm9sbG93aW5nIG1vZHVsZXMgYXJlIG9wdGlvbmFsLiB5b3Ugd2lsbCB3YW50IHRvIGNvbXBpbGUKKyNldmVyeXRoaW5nIHlvdSBjYW4sIGJ1dCB5b3UgY2FuIGlnbm9yZSBvbmVzIHlvdSBkb24ndCBoYXZlCisjZGVwZW5kZW5jaWVzIGZvciwganVzdCBjb21tZW50IHRoZW0gb3V0CisKK2ltYWdlZXh0IHNyYy9pbWFnZWV4dC5jICQoU0RMKSAkKElNQUdFKSAkKFBORykgJChKUEVHKSAkKERFQlVHKQorZm9udCBzcmMvZm9udC5jICQoU0RMKSAkKEZPTlQpICQoREVCVUcpCittaXhlciBzcmMvbWl4ZXIuYyAkKFNETCkgJChNSVhFUikgJChERUJVRykKK21peGVyX211c2ljIHNyYy9tdXNpYy5jICQoU0RMKSAkKE1JWEVSKSAkKERFQlVHKQorX251bWVyaWNzdXJmYXJyYXkgc3JjL19udW1lcmljc3VyZmFycmF5LmMgJChTREwpICQoREVCVUcpCitfbnVtZXJpY3NuZGFycmF5IHNyYy9fbnVtZXJpY3NuZGFycmF5LmMgJChTREwpICQoTUlYRVIpICQoREVCVUcpCittb3ZpZSBzcmMvbW92aWUuYyAkKFNETCkgJChTTVBFRykgJChERUJVRykKK3NjcmFwIHNyYy9zY3JhcC5jICQoU0RMKSAkKFNDUkFQKSAkKERFQlVHKQorX2NhbWVyYSBzcmMvX2NhbWVyYS5jIHNyYy9jYW1lcmFfdjRsMi5jIHNyYy9jYW1lcmFfdjRsLmMgJChTREwpICQoREVCVUcpCitweXBtIHNyYy9weXBtLmMgJChTREwpICQoUE9SVE1JREkpICQoUE9SVFRJTUUpICQoREVCVUcpCisKK0dGWCA9IHNyYy9TRExfZ2Z4L1NETF9nZnhQcmltaXRpdmVzLmMgCisjR0ZYID0gc3JjL1NETF9nZngvU0RMX2dmeEJsaXRGdW5jLmMgc3JjL1NETF9nZngvU0RMX2dmeFByaW1pdGl2ZXMuYyAKK2dmeGRyYXcgc3JjL2dmeGRyYXcuYyAkKFNETCkgJChHRlgpICQoREVCVUcpCisKKworCisjdGhlc2UgbW9kdWxlcyBhcmUgcmVxdWlyZWQgZm9yIHB5Z2FtZSB0byBydW4uIHRoZXkgb25seSByZXF1aXJlCisjU0RMIGFzIGEgZGVwZW5kZW5jeS4gdGhlc2Ugc2hvdWxkIG5vdCBiZSBhbHRlcmVkCisKK2Jhc2Ugc3JjL2Jhc2UuYyAkKFNETCkgJChERUJVRykKK2Nkcm9tIHNyYy9jZHJvbS5jICQoU0RMKSAkKERFQlVHKQorY29sb3Igc3JjL2NvbG9yLmMgJChTREwpICQoREVCVUcpCitjb25zdGFudHMgc3JjL2NvbnN0YW50cy5jICQoU0RMKSAkKERFQlVHKQorZGlzcGxheSBzcmMvZGlzcGxheS5jICQoU0RMKSAkKERFQlVHKQorZXZlbnQgc3JjL2V2ZW50LmMgJChTREwpICQoREVCVUcpCitmYXN0ZXZlbnQgc3JjL2Zhc3RldmVudC5jIHNyYy9mYXN0ZXZlbnRzLmMgJChTREwpICQoREVCVUcpCitrZXkgc3JjL2tleS5jICQoU0RMKSAkKERFQlVHKQorbW91c2Ugc3JjL21vdXNlLmMgJChTREwpICQoREVCVUcpCityZWN0IHNyYy9yZWN0LmMgJChTREwpICQoREVCVUcpCityd29iamVjdCBzcmMvcndvYmplY3QuYyAkKFNETCkgJChERUJVRykKK3N1cmZhY2Ugc3JjL3N1cmZhY2UuYyBzcmMvYWxwaGFibGl0LmMgc3JjL3N1cmZhY2VfZmlsbC5jICQoU0RMKSAkKERFQlVHKQorc3VyZmxvY2sgc3JjL3N1cmZsb2NrLmMgJChTREwpICQoREVCVUcpCit0aW1lIHNyYy90aW1lLmMgJChTREwpICQoREVCVUcpCitqb3lzdGljayBzcmMvam95c3RpY2suYyAkKFNETCkgJChERUJVRykKK2RyYXcgc3JjL2RyYXcuYyAkKFNETCkgJChERUJVRykKK2ltYWdlIHNyYy9pbWFnZS5jICQoU0RMKSAkKERFQlVHKQorb3ZlcmxheSBzcmMvb3ZlcmxheS5jICQoU0RMKSAkKERFQlVHKQordHJhbnNmb3JtIHNyYy90cmFuc2Zvcm0uYyBzcmMvcm90b3pvb20uYyBzcmMvc2NhbGUyeC5jIHNyYy9zY2FsZV9tbXguYyAkKFNETCkgJChERUJVRykKK21hc2sgc3JjL21hc2suYyBzcmMvYml0bWFzay5jICQoU0RMKSAkKERFQlVHKQorYnVmZmVycHJveHkgc3JjL2J1ZmZlcnByb3h5LmMgJChTREwpICQoREVCVUcpCitwaXhlbGFycmF5IHNyYy9waXhlbGFycmF5LmMgJChTREwpICQoREVCVUcpCitfYXJyYXlzdXJmYXJyYXkgc3JjL19hcnJheXN1cmZhcnJheS5jICQoU0RMKSAkKERFQlVHKQorCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk3ZmY4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMzYgQEAKKyIiIlRlc3Qgc3VpdGUgZm9yIGRpc3R1dGlscy4KKworVGhpcyB0ZXN0IHN1aXRlIGNvbnNpc3RzIG9mIGEgY29sbGVjdGlvbiBvZiB0ZXN0IG1vZHVsZXMgaW4gdGhlCitkaXN0dXRpbHMudGVzdHMgcGFja2FnZS4gIEVhY2ggdGVzdCBtb2R1bGUgaGFzIGEgbmFtZSBzdGFydGluZyB3aXRoCisndGVzdCcgYW5kIGNvbnRhaW5zIGEgZnVuY3Rpb24gdGVzdF9zdWl0ZSgpLiAgVGhlIGZ1bmN0aW9uIGlzIGV4cGVjdGVkCit0byByZXR1cm4gYW4gaW5pdGlhbGl6ZWQgdW5pdHRlc3QuVGVzdFN1aXRlIGluc3RhbmNlLgorCitUZXN0cyBmb3IgdGhlIGNvbW1hbmQgY2xhc3NlcyBpbiB0aGUgZGlzdHV0aWxzLmNvbW1hbmQgcGFja2FnZSBhcmUKK2luY2x1ZGVkIGluIGRpc3R1dGlscy50ZXN0cyBhcyB3ZWxsLCBpbnN0ZWFkIG9mIHVzaW5nIGEgc2VwYXJhdGUKK2Rpc3R1dGlscy5jb21tYW5kLnRlc3RzIHBhY2thZ2UsIHNpbmNlIGNvbW1hbmQgaWRlbnRpZmljYXRpb24gaXMgZG9uZQorYnkgaW1wb3J0IHJhdGhlciB0aGFuIG1hdGNoaW5nIHByZS1kZWZpbmVkIG5hbWVzLgorCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCisKK2hlcmUgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpcgorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGZvciBmbiBpbiBvcy5saXN0ZGlyKGhlcmUpOgorICAgICAgICBpZiBmbi5zdGFydHN3aXRoKCJ0ZXN0IikgYW5kIGZuLmVuZHN3aXRoKCIucHkiKToKKyAgICAgICAgICAgIG1vZG5hbWUgPSAiZGlzdHV0aWxzLnRlc3RzLiIgKyBmbls6LTNdCisgICAgICAgICAgICBfX2ltcG9ydF9fKG1vZG5hbWUpCisgICAgICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2RuYW1lXQorICAgICAgICAgICAgc3VpdGUuYWRkVGVzdChtb2R1bGUudGVzdF9zdWl0ZSgpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTJhMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTJhMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3NldHVwdG9vbHNfYnVpbGRfZXh0LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc2V0dXB0b29sc19idWlsZF9leHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFmYTllOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3NldHVwdG9vbHNfYnVpbGRfZXh0LnB5CkBAIC0wLDAgKzEsMjg3IEBACitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIF9kdV9idWlsZF9leHQKK3RyeToKKyAgICAjIEF0dGVtcHQgdG8gdXNlIFB5cmV4IGZvciBidWlsZGluZyBleHRlbnNpb25zLCBpZiBhdmFpbGFibGUKKyAgICBmcm9tIFB5cmV4LkRpc3R1dGlscy5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dCBhcyBfYnVpbGRfZXh0CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX2J1aWxkX2V4dCA9IF9kdV9idWlsZF9leHQKKworaW1wb3J0IG9zLCBzeXMKK2Zyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgY29weV9maWxlCisKK2Zyb20gZGlzdHV0aWxzLnRlc3RzLnNldHVwdG9vbHNfZXh0ZW5zaW9uIGltcG9ydCBMaWJyYXJ5CisKK2Zyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgbmV3X2NvbXBpbGVyCitmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGN1c3RvbWl6ZV9jb21waWxlciwgZ2V0X2NvbmZpZ192YXIKK2dldF9jb25maWdfdmFyKCJMRFNIQVJFRCIpICAjIG1ha2Ugc3VyZSBfY29uZmlnX3ZhcnMgaXMgaW5pdGlhbGl6ZWQKK2Zyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgX2NvbmZpZ192YXJzCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICoKKworaGF2ZV9ydGxkID0gRmFsc2UKK3VzZV9zdHVicyA9IEZhbHNlCitsaWJ0eXBlID0gJ3NoYXJlZCcKKworaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgIHVzZV9zdHVicyA9IFRydWUKK2VsaWYgb3MubmFtZSAhPSAnbnQnOgorICAgIHRyeToKKyAgICAgICAgZnJvbSBkbCBpbXBvcnQgUlRMRF9OT1cKKyAgICAgICAgaGF2ZV9ydGxkID0gVHJ1ZQorICAgICAgICB1c2Vfc3R1YnMgPSBUcnVlCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisKK2RlZiBpZl9kbChzKToKKyAgICBpZiBoYXZlX3J0bGQ6CisgICAgICAgIHJldHVybiBzCisgICAgcmV0dXJuICcnCisKKworCisKKworCitjbGFzcyBidWlsZF9leHQoX2J1aWxkX2V4dCk6CisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIiIiQnVpbGQgZXh0ZW5zaW9ucyBpbiBidWlsZCBkaXJlY3RvcnksIHRoZW4gY29weSBpZiAtLWlucGxhY2UiIiIKKyAgICAgICAgb2xkX2lucGxhY2UsIHNlbGYuaW5wbGFjZSA9IHNlbGYuaW5wbGFjZSwgMAorICAgICAgICBfYnVpbGRfZXh0LnJ1bihzZWxmKQorICAgICAgICBzZWxmLmlucGxhY2UgPSBvbGRfaW5wbGFjZQorICAgICAgICBpZiBvbGRfaW5wbGFjZToKKyAgICAgICAgICAgIHNlbGYuY29weV9leHRlbnNpb25zX3RvX3NvdXJjZSgpCisKKyAgICBkZWYgY29weV9leHRlbnNpb25zX3RvX3NvdXJjZShzZWxmKToKKyAgICAgICAgYnVpbGRfcHkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKQorICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldF9leHRfZmlsZW5hbWUoZnVsbG5hbWUpCisgICAgICAgICAgICBtb2RwYXRoID0gZnVsbG5hbWUuc3BsaXQoJy4nKQorICAgICAgICAgICAgcGFja2FnZSA9ICcuJy5qb2luKG1vZHBhdGhbOi0xXSkKKyAgICAgICAgICAgIHBhY2thZ2VfZGlyID0gYnVpbGRfcHkuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpCisgICAgICAgICAgICBkZXN0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHBhY2thZ2VfZGlyLG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKQorICAgICAgICAgICAgc3JjX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfbGliLGZpbGVuYW1lKQorCisgICAgICAgICAgICAjIEFsd2F5cyBjb3B5LCBldmVuIGlmIHNvdXJjZSBpcyBvbGRlciB0aGFuIGRlc3RpbmF0aW9uLCB0byBlbnN1cmUKKyAgICAgICAgICAgICMgdGhhdCB0aGUgcmlnaHQgZXh0ZW5zaW9ucyBmb3IgdGhlIGN1cnJlbnQgUHl0aG9uL3BsYXRmb3JtIGFyZQorICAgICAgICAgICAgIyB1c2VkLgorICAgICAgICAgICAgY29weV9maWxlKAorICAgICAgICAgICAgICAgIHNyY19maWxlbmFtZSwgZGVzdF9maWxlbmFtZSwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsCisgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4KKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YjoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX3N0dWIocGFja2FnZV9kaXIgb3Igb3MuY3VyZGlyLCBleHQsIFRydWUpCisKKworICAgIGlmIF9idWlsZF9leHQgaXMgbm90IF9kdV9idWlsZF9leHQgYW5kIG5vdCBoYXNhdHRyKF9idWlsZF9leHQsJ3B5cmV4X3NvdXJjZXMnKToKKyAgICAgICAgIyBXb3JrYXJvdW5kIGZvciBwcm9ibGVtcyB1c2luZyBzb21lIFB5cmV4IHZlcnNpb25zIHcvU1dJRyBhbmQvb3IgMi40CisgICAgICAgIGRlZiBzd2lnX3NvdXJjZXMoc2VsZiwgc291cmNlcywgKm90aGVyYXJncyk6CisgICAgICAgICAgICAjIGZpcnN0IGRvIGFueSBQeXJleCBwcm9jZXNzaW5nCisgICAgICAgICAgICBzb3VyY2VzID0gX2J1aWxkX2V4dC5zd2lnX3NvdXJjZXMoc2VsZiwgc291cmNlcykgb3Igc291cmNlcworICAgICAgICAgICAgIyBUaGVuIGRvIGFueSBhY3R1YWwgU1dJRyBzdHVmZiBvbiB0aGUgcmVtYWluZGVyCisgICAgICAgICAgICByZXR1cm4gX2R1X2J1aWxkX2V4dC5zd2lnX3NvdXJjZXMoc2VsZiwgc291cmNlcywgKm90aGVyYXJncykKKworCisKKyAgICBkZWYgZ2V0X2V4dF9maWxlbmFtZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgIGZpbGVuYW1lID0gX2J1aWxkX2V4dC5nZXRfZXh0X2ZpbGVuYW1lKHNlbGYsZnVsbG5hbWUpCisgICAgICAgIGV4dCA9IHNlbGYuZXh0X21hcFtmdWxsbmFtZV0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsTGlicmFyeSk6CisgICAgICAgICAgICBmbiwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNobGliX2NvbXBpbGVyLmxpYnJhcnlfZmlsZW5hbWUoZm4sbGlidHlwZSkKKyAgICAgICAgZWxpZiB1c2Vfc3R1YnMgYW5kIGV4dC5fbGlua3NfdG9fZHluYW1pYzoKKyAgICAgICAgICAgIGQsZm4gPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihkLCdkbC0nK2ZuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfYnVpbGRfZXh0LmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLnNobGliX2NvbXBpbGVyID0gTm9uZQorICAgICAgICBzZWxmLnNobGlicyA9IFtdCisgICAgICAgIHNlbGYuZXh0X21hcCA9IHt9CisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgX2J1aWxkX2V4dC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYuZXh0ZW5zaW9ucyA9IHNlbGYuZXh0ZW5zaW9ucyBvciBbXQorICAgICAgICBzZWxmLmNoZWNrX2V4dGVuc2lvbnNfbGlzdChzZWxmLmV4dGVuc2lvbnMpCisgICAgICAgIHNlbGYuc2hsaWJzID0gW2V4dCBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsTGlicmFyeSldCisgICAgICAgIGlmIHNlbGYuc2hsaWJzOgorICAgICAgICAgICAgc2VsZi5zZXR1cF9zaGxpYl9jb21waWxlcigpCisgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgorICAgICAgICAgICAgZXh0Ll9mdWxsX25hbWUgPSBzZWxmLmdldF9leHRfZnVsbG5hbWUoZXh0Lm5hbWUpCisgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgorICAgICAgICAgICAgZnVsbG5hbWUgPSBleHQuX2Z1bGxfbmFtZQorICAgICAgICAgICAgc2VsZi5leHRfbWFwW2Z1bGxuYW1lXSA9IGV4dAorICAgICAgICAgICAgbHRkID0gZXh0Ll9saW5rc190b19keW5hbWljID0gXAorICAgICAgICAgICAgICAgIHNlbGYuc2hsaWJzIGFuZCBzZWxmLmxpbmtzX3RvX2R5bmFtaWMoZXh0KSBvciBGYWxzZQorICAgICAgICAgICAgZXh0Ll9uZWVkc19zdHViID0gbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG5vdCBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KQorICAgICAgICAgICAgZmlsZW5hbWUgPSBleHQuX2ZpbGVfbmFtZSA9IHNlbGYuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKKyAgICAgICAgICAgIGxpYmRpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsZmlsZW5hbWUpKQorICAgICAgICAgICAgaWYgbHRkIGFuZCBsaWJkaXIgbm90IGluIGV4dC5saWJyYXJ5X2RpcnM6CisgICAgICAgICAgICAgICAgZXh0LmxpYnJhcnlfZGlycy5hcHBlbmQobGliZGlyKQorICAgICAgICAgICAgaWYgbHRkIGFuZCB1c2Vfc3R1YnMgYW5kIG9zLmN1cmRpciBub3QgaW4gZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzOgorICAgICAgICAgICAgICAgIGV4dC5ydW50aW1lX2xpYnJhcnlfZGlycy5hcHBlbmQob3MuY3VyZGlyKQorCisgICAgZGVmIHNldHVwX3NobGliX2NvbXBpbGVyKHNlbGYpOgorICAgICAgICBjb21waWxlciA9IHNlbGYuc2hsaWJfY29tcGlsZXIgPSBuZXdfY29tcGlsZXIoCisgICAgICAgICAgICBjb21waWxlcj1zZWxmLmNvbXBpbGVyLCBkcnlfcnVuPXNlbGYuZHJ5X3J1biwgZm9yY2U9c2VsZi5mb3JjZQorICAgICAgICApCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgICAgIHRtcCA9IF9jb25maWdfdmFycy5jb3B5KCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFhYWCBIZWxwISAgSSBkb24ndCBoYXZlIGFueSBpZGVhIHdoZXRoZXIgdGhlc2UgYXJlIHJpZ2h0Li4uCisgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzWydMRFNIQVJFRCddID0gImdjYyAtV2wsLXggLWR5bmFtaWNsaWIgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCIKKyAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnNbJ0NDU0hBUkVEJ10gPSAiIC1keW5hbWljbGliIgorICAgICAgICAgICAgICAgIF9jb25maWdfdmFyc1snU08nXSA9ICIuZHlsaWIiCisgICAgICAgICAgICAgICAgY3VzdG9taXplX2NvbXBpbGVyKGNvbXBpbGVyKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnMuY2xlYXIoKQorICAgICAgICAgICAgICAgIF9jb25maWdfdmFycy51cGRhdGUodG1wKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3VzdG9taXplX2NvbXBpbGVyKGNvbXBpbGVyKQorCisgICAgICAgIGlmIHNlbGYuaW5jbHVkZV9kaXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29tcGlsZXIuc2V0X2luY2x1ZGVfZGlycyhzZWxmLmluY2x1ZGVfZGlycykKKyAgICAgICAgaWYgc2VsZi5kZWZpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjICdkZWZpbmUnIG9wdGlvbiBpcyBhIGxpc3Qgb2YgKG5hbWUsdmFsdWUpIHR1cGxlcworICAgICAgICAgICAgZm9yIChuYW1lLHZhbHVlKSBpbiBzZWxmLmRlZmluZToKKyAgICAgICAgICAgICAgICBjb21waWxlci5kZWZpbmVfbWFjcm8obmFtZSwgdmFsdWUpCisgICAgICAgIGlmIHNlbGYudW5kZWYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3IgbWFjcm8gaW4gc2VsZi51bmRlZjoKKyAgICAgICAgICAgICAgICBjb21waWxlci51bmRlZmluZV9tYWNybyhtYWNybykKKyAgICAgICAgaWYgc2VsZi5saWJyYXJpZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb21waWxlci5zZXRfbGlicmFyaWVzKHNlbGYubGlicmFyaWVzKQorICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZGlycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saWJyYXJ5X2RpcnMoc2VsZi5saWJyYXJ5X2RpcnMpCisgICAgICAgIGlmIHNlbGYucnBhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb21waWxlci5zZXRfcnVudGltZV9saWJyYXJ5X2RpcnMoc2VsZi5ycGF0aCkKKyAgICAgICAgaWYgc2VsZi5saW5rX29iamVjdHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb21waWxlci5zZXRfbGlua19vYmplY3RzKHNlbGYubGlua19vYmplY3RzKQorCisgICAgICAgICMgaGFjayBzbyBkaXN0dXRpbHMnIGJ1aWxkX2V4dGVuc2lvbigpIGJ1aWxkcyBhIGxpYnJhcnkgaW5zdGVhZAorICAgICAgICBjb21waWxlci5saW5rX3NoYXJlZF9vYmplY3QgPSBsaW5rX3NoYXJlZF9vYmplY3QuX19nZXRfXyhjb21waWxlcikKKworCisKKyAgICBkZWYgZ2V0X2V4cG9ydF9zeW1ib2xzKHNlbGYsIGV4dCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LExpYnJhcnkpOgorICAgICAgICAgICAgcmV0dXJuIGV4dC5leHBvcnRfc3ltYm9scworICAgICAgICByZXR1cm4gX2J1aWxkX2V4dC5nZXRfZXhwb3J0X3N5bWJvbHMoc2VsZixleHQpCisKKyAgICBkZWYgYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCk6CisgICAgICAgIF9jb21waWxlciA9IHNlbGYuY29tcGlsZXIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsTGlicmFyeSk6CisgICAgICAgICAgICAgICAgc2VsZi5jb21waWxlciA9IHNlbGYuc2hsaWJfY29tcGlsZXIKKyAgICAgICAgICAgIF9idWlsZF9leHQuYnVpbGRfZXh0ZW5zaW9uKHNlbGYsZXh0KQorICAgICAgICAgICAgaWYgZXh0Ll9uZWVkc19zdHViOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfc3R1YigKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykuYnVpbGRfbGliLCBleHQKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNvbXBpbGVyID0gX2NvbXBpbGVyCisKKyAgICBkZWYgbGlua3NfdG9fZHluYW1pYyhzZWxmLCBleHQpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAnZXh0JyBsaW5rcyB0byBhIGR5bmFtaWMgbGliIGluIHRoZSBzYW1lIHBhY2thZ2UiIiIKKyAgICAgICAgIyBYWFggdGhpcyBzaG91bGQgY2hlY2sgdG8gZW5zdXJlIHRoZSBsaWIgaXMgYWN0dWFsbHkgYmVpbmcgYnVpbHQKKyAgICAgICAgIyBYWFggYXMgZHluYW1pYywgYW5kIG5vdCBqdXN0IHVzaW5nIGEgbG9jYWxseS1mb3VuZCB2ZXJzaW9uIG9yIGEKKyAgICAgICAgIyBYWFggc3RhdGljLWNvbXBpbGVkIHZlcnNpb24KKyAgICAgICAgbGlibmFtZXMgPSBkaWN0LmZyb21rZXlzKFtsaWIuX2Z1bGxfbmFtZSBmb3IgbGliIGluIHNlbGYuc2hsaWJzXSkKKyAgICAgICAgcGtnID0gJy4nLmpvaW4oZXh0Ll9mdWxsX25hbWUuc3BsaXQoJy4nKVs6LTFdK1snJ10pCisgICAgICAgIGZvciBsaWJuYW1lIGluIGV4dC5saWJyYXJpZXM6CisgICAgICAgICAgICBpZiBwa2crbGlibmFtZSBpbiBsaWJuYW1lczogcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgIG91dHB1dHMgPSBfYnVpbGRfZXh0LmdldF9vdXRwdXRzKHNlbGYpCisgICAgICAgIG9wdGltaXplID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5Jykub3B0aW1pemUKKyAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWI6CisgICAgICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYiwgKmV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJykpCisgICAgICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQoYmFzZSsnLnB5JykKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmFwcGVuZChiYXNlKycucHljJykKKyAgICAgICAgICAgICAgICBpZiBvcHRpbWl6ZToKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQoYmFzZSsnLnB5bycpCisgICAgICAgIHJldHVybiBvdXRwdXRzCisKKyAgICBkZWYgd3JpdGVfc3R1YihzZWxmLCBvdXRwdXRfZGlyLCBleHQsIGNvbXBpbGU9RmFsc2UpOgorICAgICAgICBsb2cuaW5mbygid3JpdGluZyBzdHViIGxvYWRlciBmb3IgJXMgdG8gJXMiLGV4dC5fZnVsbF9uYW1lLCBvdXRwdXRfZGlyKQorICAgICAgICBzdHViX2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgKmV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJykpKycucHknCisgICAgICAgIGlmIGNvbXBpbGUgYW5kIG9zLnBhdGguZXhpc3RzKHN0dWJfZmlsZSk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihzdHViX2ZpbGUrIiBhbHJlYWR5IGV4aXN0cyEgUGxlYXNlIGRlbGV0ZS4iKQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgZiA9IG9wZW4oc3R1Yl9maWxlLCd3JykKKyAgICAgICAgICAgIGYud3JpdGUoJ1xuJy5qb2luKFsKKyAgICAgICAgICAgICAgICAiZGVmIF9fYm9vdHN0cmFwX18oKToiLAorICAgICAgICAgICAgICAgICIgICBnbG9iYWwgX19ib290c3RyYXBfXywgX19maWxlX18sIF9fbG9hZGVyX18iLAorICAgICAgICAgICAgICAgICIgICBpbXBvcnQgc3lzLCBvcywgcGtnX3Jlc291cmNlcywgaW1wIitpZl9kbCgiLCBkbCIpLAorICAgICAgICAgICAgICAgICIgICBfX2ZpbGVfXyA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoX19uYW1lX18sJXIpIgorICAgICAgICAgICAgICAgICAgICUgb3MucGF0aC5iYXNlbmFtZShleHQuX2ZpbGVfbmFtZSksCisgICAgICAgICAgICAgICAgIiAgIGRlbCBfX2Jvb3RzdHJhcF9fIiwKKyAgICAgICAgICAgICAgICAiICAgaWYgJ19fbG9hZGVyX18nIGluIGdsb2JhbHMoKToiLAorICAgICAgICAgICAgICAgICIgICAgICAgZGVsIF9fbG9hZGVyX18iLAorICAgICAgICAgICAgICAgIGlmX2RsKCIgICBvbGRfZmxhZ3MgPSBzeXMuZ2V0ZGxvcGVuZmxhZ3MoKSIpLAorICAgICAgICAgICAgICAgICIgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkiLAorICAgICAgICAgICAgICAgICIgICB0cnk6IiwKKyAgICAgICAgICAgICAgICAiICAgICBvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSIsCisgICAgICAgICAgICAgICAgaWZfZGwoIiAgICAgc3lzLnNldGRsb3BlbmZsYWdzKGRsLlJUTERfTk9XKSIpLAorICAgICAgICAgICAgICAgICIgICAgIGltcC5sb2FkX2R5bmFtaWMoX19uYW1lX18sX19maWxlX18pIiwKKyAgICAgICAgICAgICAgICAiICAgZmluYWxseToiLAorICAgICAgICAgICAgICAgIGlmX2RsKCIgICAgIHN5cy5zZXRkbG9wZW5mbGFncyhvbGRfZmxhZ3MpIiksCisgICAgICAgICAgICAgICAgIiAgICAgb3MuY2hkaXIob2xkX2RpcikiLAorICAgICAgICAgICAgICAgICJfX2Jvb3RzdHJhcF9fKCkiLAorICAgICAgICAgICAgICAgICIiICMgdGVybWluYWwgXG4KKyAgICAgICAgICAgIF0pKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGlmIGNvbXBpbGU6CisgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBieXRlX2NvbXBpbGUKKyAgICAgICAgICAgIGJ5dGVfY29tcGlsZShbc3R1Yl9maWxlXSwgb3B0aW1pemU9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1UcnVlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKyAgICAgICAgICAgIG9wdGltaXplID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGxfbGliJykub3B0aW1pemUKKyAgICAgICAgICAgIGlmIG9wdGltaXplID4gMDoKKyAgICAgICAgICAgICAgICBieXRlX2NvbXBpbGUoW3N0dWJfZmlsZV0sIG9wdGltaXplPW9wdGltaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1UcnVlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHN0dWJfZmlsZSkgYW5kIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHN0dWJfZmlsZSkKKworCitpZiB1c2Vfc3R1YnMgb3Igb3MubmFtZT09J250JzoKKyAgICAjIEJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMKKyAgICAjCisgICAgZGVmIGxpbmtfc2hhcmVkX29iamVjdChzZWxmLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICBsaWJyYXJpZXM9Tm9uZSwgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgIGV4cG9ydF9zeW1ib2xzPU5vbmUsIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwKKyAgICAgICAgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgYnVpbGRfdGVtcD1Ob25lLCB0YXJnZXRfbGFuZz1Ob25lCisgICAgKTogIHNlbGYubGluaygKKyAgICAgICAgICAgIHNlbGYuU0hBUkVEX0xJQlJBUlksIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLAorICAgICAgICAgICAgb3V0cHV0X2RpciwgbGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzLAorICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHMsIGRlYnVnLCBleHRyYV9wcmVhcmdzLCBleHRyYV9wb3N0YXJncywKKyAgICAgICAgICAgIGJ1aWxkX3RlbXAsIHRhcmdldF9sYW5nCisgICAgICAgICkKK2Vsc2U6CisgICAgIyBCdWlsZCBzdGF0aWMgbGlicmFyaWVzIGV2ZXJ5d2hlcmUgZWxzZQorICAgIGxpYnR5cGUgPSAnc3RhdGljJworCisgICAgZGVmIGxpbmtfc2hhcmVkX29iamVjdChzZWxmLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICBsaWJyYXJpZXM9Tm9uZSwgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgIGV4cG9ydF9zeW1ib2xzPU5vbmUsIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwKKyAgICAgICAgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgYnVpbGRfdGVtcD1Ob25lLCB0YXJnZXRfbGFuZz1Ob25lCisgICAgKToKKyAgICAgICAgIyBYWFggd2UgbmVlZCB0byBlaXRoZXIgZGlzYWxsb3cgdGhlc2UgYXR0cnMgb24gTGlicmFyeSBpbnN0YW5jZXMsCisgICAgICAgICMgICAgIG9yIHdhcm4vYWJvcnQgaGVyZSBpZiBzZXQsIG9yIHNvbWV0aGluZy4uLgorICAgICAgICAjbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICAjZXhwb3J0X3N5bWJvbHM9Tm9uZSwgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLAorICAgICAgICAjYnVpbGRfdGVtcD1Ob25lCisKKyAgICAgICAgYXNzZXJ0IG91dHB1dF9kaXIgaXMgTm9uZSAgICMgZGlzdHV0aWxzIGJ1aWxkX2V4dCBkb2Vzbid0IHBhc3MgdGhpcworICAgICAgICBvdXRwdXRfZGlyLGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChvdXRwdXRfbGlibmFtZSkKKyAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCisgICAgICAgIGlmIHNlbGYubGlicmFyeV9maWxlbmFtZSgieCIpLnN0YXJ0c3dpdGgoJ2xpYicpOgorICAgICAgICAgICAgIyBzdHJpcCAnbGliJyBwcmVmaXg7IHRoaXMgaXMga2x1ZGd5IGlmIHNvbWUgcGxhdGZvcm0gdXNlcworICAgICAgICAgICAgIyBhIGRpZmZlcmVudCBwcmVmaXgKKyAgICAgICAgICAgIGJhc2VuYW1lID0gYmFzZW5hbWVbMzpdCisKKyAgICAgICAgc2VsZi5jcmVhdGVfc3RhdGljX2xpYigKKyAgICAgICAgICAgIG9iamVjdHMsIGJhc2VuYW1lLCBvdXRwdXRfZGlyLCBkZWJ1ZywgdGFyZ2V0X2xhbmcKKyAgICAgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc2V0dXB0b29sc19idWlsZF9leHQucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc2V0dXB0b29sc19idWlsZF9leHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYWQwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2J1aWxkX2V4dC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc2V0dXB0b29sc19idWlsZF9leHQucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc2V0dXB0b29sc19idWlsZF9leHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNmEwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2J1aWxkX2V4dC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc2V0dXB0b29sc19leHRlbnNpb24ucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2V4dGVuc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzZiNjkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc2V0dXB0b29sc19leHRlbnNpb24ucHkKQEAgLTAsMCArMSw1MSBAQAorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRXh0ZW5zaW9uIGFzIF9FeHRlbnNpb24KK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbiBhcyBfRGlzdHJpYnV0aW9uCisKK2RlZiBfZ2V0X3VucGF0Y2hlZChjbHMpOgorICAgICIiIlByb3RlY3QgYWdhaW5zdCByZS1wYXRjaGluZyB0aGUgZGlzdHV0aWxzIGlmIHJlbG9hZGVkCisKKyAgICBBbHNvIGVuc3VyZXMgdGhhdCBubyBvdGhlciBkaXN0dXRpbHMgZXh0ZW5zaW9uIG1vbmtleXBhdGNoZWQgdGhlIGRpc3R1dGlscworICAgIGZpcnN0LgorICAgICIiIgorICAgIHdoaWxlIGNscy5fX21vZHVsZV9fLnN0YXJ0c3dpdGgoJ3NldHVwdG9vbHMnKToKKyAgICAgICAgY2xzLCA9IGNscy5fX2Jhc2VzX18KKyAgICBpZiBub3QgY2xzLl9fbW9kdWxlX18uc3RhcnRzd2l0aCgnZGlzdHV0aWxzJyk6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgImRpc3R1dGlscyBoYXMgYWxyZWFkeSBiZWVuIHBhdGNoZWQgYnkgJXIiICUgY2xzCisgICAgICAgICkKKyAgICByZXR1cm4gY2xzCisKK19EaXN0cmlidXRpb24gPSBfZ2V0X3VucGF0Y2hlZChfRGlzdHJpYnV0aW9uKQorX0V4dGVuc2lvbiA9IF9nZXRfdW5wYXRjaGVkKF9FeHRlbnNpb24pCisKK3RyeToKKyAgICBmcm9tIFB5cmV4LkRpc3R1dGlscy5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGhhdmVfcHlyZXggPSBGYWxzZQorZWxzZToKKyAgICBoYXZlX3B5cmV4ID0gVHJ1ZQorCisKK2NsYXNzIEV4dGVuc2lvbihfRXh0ZW5zaW9uKToKKyAgICAiIiJFeHRlbnNpb24gdGhhdCB1c2VzICcuYycgZmlsZXMgaW4gcGxhY2Ugb2YgJy5weXgnIGZpbGVzIiIiCisKKyAgICBpZiBub3QgaGF2ZV9weXJleDoKKyAgICAgICAgIyBjb252ZXJ0IC5weXggZXh0ZW5zaW9ucyB0byAuYworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwqYXJncywqKmt3KToKKyAgICAgICAgICAgIF9FeHRlbnNpb24uX19pbml0X18oc2VsZiwqYXJncywqKmt3KQorICAgICAgICAgICAgc291cmNlcyA9IFtdCisgICAgICAgICAgICBmb3IgcyBpbiBzZWxmLnNvdXJjZXM6CisgICAgICAgICAgICAgICAgaWYgcy5lbmRzd2l0aCgnLnB5eCcpOgorICAgICAgICAgICAgICAgICAgICBzb3VyY2VzLmFwcGVuZChzWzotM10rJ2MnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMuYXBwZW5kKHMpCisgICAgICAgICAgICBzZWxmLnNvdXJjZXMgPSBzb3VyY2VzCisKK2NsYXNzIExpYnJhcnkoRXh0ZW5zaW9uKToKKyAgICAiIiJKdXN0IGxpa2UgYSByZWd1bGFyIEV4dGVuc2lvbiwgYnV0IGJ1aWx0IGFzIGEgbGlicmFyeSBpbnN0ZWFkIiIiCisKK2ltcG9ydCBzeXMsIGRpc3R1dGlscy5jb3JlLCBkaXN0dXRpbHMuZXh0ZW5zaW9uCitkaXN0dXRpbHMuY29yZS5FeHRlbnNpb24gPSBFeHRlbnNpb24KK2Rpc3R1dGlscy5leHRlbnNpb24uRXh0ZW5zaW9uID0gRXh0ZW5zaW9uCitpZiAnZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0JyBpbiBzeXMubW9kdWxlczoKKyAgICBzeXMubW9kdWxlc1snZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0J10uRXh0ZW5zaW9uID0gRXh0ZW5zaW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2V4dGVuc2lvbi5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2V4dGVuc2lvbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1MjRhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3NldHVwdG9vbHNfZXh0ZW5zaW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2V4dGVuc2lvbi5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2V4dGVuc2lvbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1MjRhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3NldHVwdG9vbHNfZXh0ZW5zaW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zdXBwb3J0LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc3VwcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTYwNThkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc3VwcG9ydC5weQpAQCAtMCwwICsxLDIyMSBAQAorIiIiU3VwcG9ydCBjb2RlIGZvciBkaXN0dXRpbHMgdGVzdCBjYXNlcy4iIiIKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHNodXRpbAoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXNjb25maWcKK2Zyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKK2ltcG9ydCB3YXJuaW5ncworCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIGRpc3R1dGlscy5sb2cgaW1wb3J0IERFQlVHLCBJTkZPLCBXQVJOLCBFUlJPUiwgRkFUQUwKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbgorCisKK2RlZiBjYXB0dXJlX3dhcm5pbmdzKGZ1bmMpOgorICAgIGRlZiBfY2FwdHVyZV93YXJuaW5ncygqYXJncywgKiprdyk6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3KQorICAgIHJldHVybiBfY2FwdHVyZV93YXJuaW5ncworCisKK2NsYXNzIExvZ2dpbmdTaWxlbmNlcihvYmplY3QpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihMb2dnaW5nU2lsZW5jZXIsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi50aHJlc2hvbGQgPSBsb2cuc2V0X3RocmVzaG9sZChsb2cuRkFUQUwpCisgICAgICAgICMgY2F0Y2hpbmcgd2FybmluZ3MKKyAgICAgICAgIyB3aGVuIGxvZyB3aWxsIGJlIHJlcGxhY2VkIGJ5IGxvZ2dpbmcKKyAgICAgICAgIyB3ZSB3b24ndCBuZWVkIHN1Y2ggbW9ua2V5LXBhdGNoIGFueW1vcmUKKyAgICAgICAgc2VsZi5fb2xkX2xvZyA9IGxvZy5Mb2cuX2xvZworICAgICAgICBsb2cuTG9nLl9sb2cgPSBzZWxmLl9sb2cKKyAgICAgICAgc2VsZi5sb2dzID0gW10KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgbG9nLnNldF90aHJlc2hvbGQoc2VsZi50aHJlc2hvbGQpCisgICAgICAgIGxvZy5Mb2cuX2xvZyA9IHNlbGYuX29sZF9sb2cKKyAgICAgICAgc3VwZXIoTG9nZ2luZ1NpbGVuY2VyLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgX2xvZyhzZWxmLCBsZXZlbCwgbXNnLCBhcmdzKToKKyAgICAgICAgaWYgbGV2ZWwgbm90IGluIChERUJVRywgSU5GTywgV0FSTiwgRVJST1IsIEZBVEFMKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVzIHdyb25nIGxvZyBsZXZlbCcgJSBzdHIobGV2ZWwpKQorICAgICAgICBzZWxmLmxvZ3MuYXBwZW5kKChsZXZlbCwgbXNnLCBhcmdzKSkKKworICAgIGRlZiBnZXRfbG9ncyhzZWxmLCAqbGV2ZWxzKToKKyAgICAgICAgZGVmIF9mb3JtYXQobXNnLCBhcmdzKToKKyAgICAgICAgICAgIGlmIGxlbihhcmdzKSA9PSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBtc2cKKyAgICAgICAgICAgIHJldHVybiBtc2cgJSBhcmdzCisgICAgICAgIHJldHVybiBbX2Zvcm1hdChtc2csIGFyZ3MpIGZvciBsZXZlbCwgbXNnLCBhcmdzCisgICAgICAgICAgICAgICAgaW4gc2VsZi5sb2dzIGlmIGxldmVsIGluIGxldmVsc10KKworICAgIGRlZiBjbGVhcl9sb2dzKHNlbGYpOgorICAgICAgICBzZWxmLmxvZ3MgPSBbXQorCisKK2NsYXNzIFRlbXBkaXJNYW5hZ2VyKG9iamVjdCk6CisgICAgIiIiTWl4LWluIGNsYXNzIHRoYXQgaGFuZGxlcyB0ZW1wb3JhcnkgZGlyZWN0b3JpZXMgZm9yIHRlc3QgY2FzZXMuCisKKyAgICBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgd2l0aCB1bml0dGVzdC5UZXN0Q2FzZS4KKyAgICAiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVtcGRpck1hbmFnZXIsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5vbGRfY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgc2VsZi50ZW1wZGlycyA9IFtdCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICMgUmVzdG9yZSB3b3JraW5nIGRpciwgZm9yIFNvbGFyaXMgYW5kIGRlcml2YXRpdmVzLCB3aGVyZSBybWRpcigpCisgICAgICAgICMgb24gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGZhaWxzLgorICAgICAgICBvcy5jaGRpcihzZWxmLm9sZF9jd2QpCisgICAgICAgIHN1cGVyKFRlbXBkaXJNYW5hZ2VyLCBzZWxmKS50ZWFyRG93bigpCisgICAgICAgIHdoaWxlIHNlbGYudGVtcGRpcnM6CisgICAgICAgICAgICBkID0gc2VsZi50ZW1wZGlycy5wb3AoKQorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkLCBvcy5uYW1lIGluICgnbnQnLCAnY3lnd2luJykpCisKKyAgICBkZWYgbWtkdGVtcChzZWxmKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB0aGF0IHdpbGwgYmUgY2xlYW5lZCB1cC4KKworICAgICAgICBSZXR1cm5zIHRoZSBwYXRoIG9mIHRoZSBkaXJlY3RvcnkuCisgICAgICAgICIiIgorICAgICAgICBkID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHNlbGYudGVtcGRpcnMuYXBwZW5kKGQpCisgICAgICAgIHJldHVybiBkCisKKyAgICBkZWYgd3JpdGVfZmlsZShzZWxmLCBwYXRoLCBjb250ZW50PSd4eHgnKToKKyAgICAgICAgIiIiV3JpdGVzIGEgZmlsZSBpbiB0aGUgZ2l2ZW4gcGF0aC4KKworCisgICAgICAgIHBhdGggY2FuIGJlIGEgc3RyaW5nIG9yIGEgc2VxdWVuY2UuCisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbigqcGF0aCkKKyAgICAgICAgZiA9IG9wZW4ocGF0aCwgJ3cnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKGNvbnRlbnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBjcmVhdGVfZGlzdChzZWxmLCBwa2dfbmFtZT0nZm9vJywgKiprdyk6CisgICAgICAgICIiIldpbGwgZ2VuZXJhdGUgYSB0ZXN0IGVudmlyb25tZW50LgorCisgICAgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlczoKKyAgICAgICAgIC0gYSBEaXN0cmlidXRpb24gaW5zdGFuY2UgdXNpbmcga2V5d29yZHMKKyAgICAgICAgIC0gYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggYSBwYWNrYWdlIHN0cnVjdHVyZQorCisgICAgICAgIEl0IHJldHVybnMgdGhlIHBhY2thZ2UgZGlyZWN0b3J5IGFuZCB0aGUgZGlzdHJpYnV0aW9uCisgICAgICAgIGluc3RhbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgdG1wX2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHBrZ19kaXIgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgcGtnX25hbWUpCisgICAgICAgIG9zLm1rZGlyKHBrZ19kaXIpCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYXR0cnM9a3cpCisKKyAgICAgICAgcmV0dXJuIHBrZ19kaXIsIGRpc3QKKworCitjbGFzcyBEdW1teUNvbW1hbmQ6CisgICAgIiIiQ2xhc3MgdG8gc3RvcmUgb3B0aW9ucyBmb3IgcmV0cmlldmFsIHZpYSBzZXRfdW5kZWZpbmVkX29wdGlvbnMoKS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIGZvciBrdywgdmFsIGluIGt3YXJncy5pdGVtcygpOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrdywgdmFsKQorCisgICAgZGVmIGVuc3VyZV9maW5hbGl6ZWQoc2VsZik6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBFbnZpcm9uR3VhcmQob2JqZWN0KToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoRW52aXJvbkd1YXJkLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYub2xkX2Vudmlyb24gPSBkZWVwY29weShvcy5lbnZpcm9uKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLm9sZF9lbnZpcm9uLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBvcy5lbnZpcm9uLmdldChrZXkpICE9IHZhbHVlOgorICAgICAgICAgICAgICAgIG9zLmVudmlyb25ba2V5XSA9IHZhbHVlCisKKyAgICAgICAgZm9yIGtleSBpbiBvcy5lbnZpcm9uLmtleXMoKToKKyAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZi5vbGRfZW52aXJvbjoKKyAgICAgICAgICAgICAgICBkZWwgb3MuZW52aXJvbltrZXldCisKKyAgICAgICAgc3VwZXIoRW52aXJvbkd1YXJkLCBzZWxmKS50ZWFyRG93bigpCisKKworZGVmIGNvcHlfeHhtb2R1bGVfYyhkaXJlY3RvcnkpOgorICAgICIiIkhlbHBlciBmb3IgdGVzdHMgdGhhdCBuZWVkIHRoZSB4eG1vZHVsZS5jIHNvdXJjZSBmaWxlLgorCisgICAgRXhhbXBsZSB1c2U6CisKKyAgICAgICAgZGVmIHRlc3RfY29tcGlsZShzZWxmKToKKyAgICAgICAgICAgIGNvcHlfeHhtb2R1bGVfYyhzZWxmLnRtcGRpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3h4bW9kdWxlLmMnLCBvcy5saXN0ZGlyKHNlbGYudG1wZGlyKSkKKworICAgIElmIHRoZSBzb3VyY2UgZmlsZSBjYW4gYmUgZm91bmQsIGl0IHdpbGwgYmUgY29waWVkIHRvICpkaXJlY3RvcnkqLiAgSWYgbm90LAorICAgIHRoZSB0ZXN0IHdpbGwgYmUgc2tpcHBlZC4gIEVycm9ycyBkdXJpbmcgY29weSBhcmUgbm90IGNhdWdodC4KKyAgICAiIiIKKyAgICBmaWxlbmFtZSA9IF9nZXRfeHhtb2R1bGVfcGF0aCgpCisgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ2Nhbm5vdCBmaW5kIHh4bW9kdWxlLmMgKHRlc3QgbXVzdCBydW4gaW4gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhlIHB5dGhvbiBidWlsZCBkaXIpJykKKyAgICBzaHV0aWwuY29weShmaWxlbmFtZSwgZGlyZWN0b3J5KQorCisKK2RlZiBfZ2V0X3h4bW9kdWxlX3BhdGgoKToKKyAgICAjIEZJWE1FIHdoZW4gcnVuIGZyb20gcmVncnRlc3QsIHNyY2RpciBzZWVtcyB0byBiZSAnLicsIHdoaWNoIGRvZXMgbm90IGhlbHAKKyAgICAjIHVzIGZpbmQgdGhlIHh4bW9kdWxlLmMgZmlsZQorICAgIHNyY2RpciA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3Zhcignc3JjZGlyJykKKyAgICBjYW5kaWRhdGVzID0gWworICAgICAgICAjIHVzZSBpbnN0YWxsZWQgY29weSBpZiBhdmFpbGFibGUKKyAgICAgICAgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICd4eG1vZHVsZS5jJyksCisgICAgICAgICMgb3RoZXJ3aXNlIHRyeSB1c2luZyBjb3B5IGZyb20gYnVpbGQgZGlyZWN0b3J5CisgICAgICAgIG9zLnBhdGguam9pbihzcmNkaXIsICdNb2R1bGVzJywgJ3h4bW9kdWxlLmMnKSwKKyAgICAgICAgIyBzcmNkaXIgbXlzdGVyaW91c2x5IGNhbiBiZSAkc3JjZGlyL0xpYi9kaXN0dXRpbHMvdGVzdHMgd2hlbgorICAgICAgICAjIHRoaXMgZmlsZSBpcyBydW4gZnJvbSBpdHMgcGFyZW50IGRpcmVjdG9yeSwgc28gd2FsayB1cCB0aGUKKyAgICAgICAgIyB0cmVlIHRvIGZpbmQgdGhlIHJlYWwgc3JjZGlyCisgICAgICAgIG9zLnBhdGguam9pbihzcmNkaXIsICcuLicsICcuLicsICcuLicsICdNb2R1bGVzJywgJ3h4bW9kdWxlLmMnKSwKKyAgICBdCisgICAgZm9yIHBhdGggaW4gY2FuZGlkYXRlczoKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICByZXR1cm4gcGF0aAorCisKK2RlZiBmaXh1cF9idWlsZF9leHQoY21kKToKKyAgICAiIiJGdW5jdGlvbiBuZWVkZWQgdG8gbWFrZSBidWlsZF9leHQgdGVzdHMgcGFzcy4KKworICAgIFdoZW4gUHl0aG9uIHdhcyBidWlsZCB3aXRoIC0tZW5hYmxlLXNoYXJlZCBvbiBVbml4LCAtTC4gaXMgbm90IGdvb2QKKyAgICBlbm91Z2ggdG8gZmluZCB0aGUgbGlicHl0aG9uPGJsYWg+LnNvLiAgVGhpcyBpcyBiZWNhdXNlIHJlZ3J0ZXN0IHJ1bnMKKyAgICBpdCB1bmRlciBhIHRlbXBkaXIsIG5vdCBpbiB0aGUgdG9wIGxldmVsIHdoZXJlIHRoZSAuc28gbGl2ZXMuICBCeSB0aGUKKyAgICB0aW1lIHdlJ3ZlIGdvdHRlbiBoZXJlLCBQeXRob24ncyBhbHJlYWR5IGJlZW4gY2hkaXInZCB0byB0aGUgdGVtcGRpci4KKworICAgIFdoZW4gUHl0aG9uIHdhcyBidWlsdCB3aXRoIGluIGRlYnVnIG1vZGUgb24gV2luZG93cywgYnVpbGRfZXh0IGNvbW1hbmRzCisgICAgbmVlZCB0aGVpciBkZWJ1ZyBhdHRyaWJ1dGUgc2V0LCBhbmQgaXQgaXMgbm90IGRvbmUgYXV0b21hdGljYWxseSBmb3IKKyAgICBzb21lIHJlYXNvbi4KKworICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBib3RoIG9mIHRoZXNlIHRoaW5ncy4gIEV4YW1wbGUgdXNlOgorCisgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQorICAgICAgICBzdXBwb3J0LmZpeHVwX2J1aWxkX2V4dChjbWQpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKworICAgIFVubGlrZSBtb3N0IG90aGVyIFVuaXggcGxhdGZvcm1zLCBNYWMgT1MgWCBlbWJlZHMgYWJzb2x1dGUgcGF0aHMKKyAgICB0byBzaGFyZWQgbGlicmFyaWVzIGludG8gZXhlY3V0YWJsZXMsIHNvIHRoZSBmaXh1cCBpcyBub3QgbmVlZGVkIHRoZXJlLgorICAgICIiIgorICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgY21kLmRlYnVnID0gc3lzLmV4ZWN1dGFibGUuZW5kc3dpdGgoJ19kLmV4ZScpCisgICAgZWxpZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1B5X0VOQUJMRV9TSEFSRUQnKToKKyAgICAgICAgIyBUbyBmdXJ0aGVyIGFkZCB0byB0aGUgc2hhcmVkIGJ1aWxkcyBmdW4gb24gVW5peCwgd2UgY2FuJ3QganVzdCBhZGQKKyAgICAgICAgIyBsaWJyYXJ5X2RpcnMgdG8gdGhlIEV4dGVuc2lvbigpIGluc3RhbmNlIGJlY2F1c2UgdGhhdCBkb2Vzbid0IGdldAorICAgICAgICAjIHBsdW1iZWQgdGhyb3VnaCB0byB0aGUgZmluYWwgY29tcGlsZXIgY29tbWFuZC4KKyAgICAgICAgcnVuc2hhcmVkID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdSVU5TSEFSRUQnKQorICAgICAgICBpZiBydW5zaGFyZWQgaXMgTm9uZToKKyAgICAgICAgICAgIGNtZC5saWJyYXJ5X2RpcnMgPSBbJy4nXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgICAgIGNtZC5saWJyYXJ5X2RpcnMgPSBbXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1lLCBlcXVhbHMsIHZhbHVlID0gcnVuc2hhcmVkLnBhcnRpdGlvbignPScpCisgICAgICAgICAgICAgICAgY21kLmxpYnJhcnlfZGlycyA9IHZhbHVlLnNwbGl0KG9zLnBhdGhzZXApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zdXBwb3J0LnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3N1cHBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNzFiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zdXBwb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zdXBwb3J0LnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3N1cHBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNzFiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zdXBwb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2FyY2hpdmVfdXRpbC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYXJjaGl2ZV91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMWNlYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2FyY2hpdmVfdXRpbC5weQpAQCAtMCwwICsxLDMyOCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuYXJjaGl2ZV91dGlsLiIiIgorX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGFyZmlsZQorZnJvbSBvcy5wYXRoIGltcG9ydCBzcGxpdGRyaXZlCitpbXBvcnQgd2FybmluZ3MKKworZnJvbSBkaXN0dXRpbHMuYXJjaGl2ZV91dGlsIGltcG9ydCAoY2hlY2tfYXJjaGl2ZV9mb3JtYXRzLCBtYWtlX3RhcmJhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3ppcGZpbGUsIG1ha2VfYXJjaGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ0hJVkVfRk9STUFUUykKK2Zyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBmaW5kX2V4ZWN1dGFibGUsIHNwYXduCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2hlY2tfd2FybmluZ3MsIHJ1bl91bml0dGVzdAorCit0cnk6CisgICAgaW1wb3J0IGdycAorICAgIGltcG9ydCBwd2QKKyAgICBVSURfR0lEX1NVUFBPUlQgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgVUlEX0dJRF9TVVBQT1JUID0gRmFsc2UKKwordHJ5OgorICAgIGltcG9ydCB6aXBmaWxlCisgICAgWklQX1NVUFBPUlQgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgWklQX1NVUFBPUlQgPSBmaW5kX2V4ZWN1dGFibGUoJ3ppcCcpCisKKyMgc29tZSB0ZXN0cyB3aWxsIGZhaWwgaWYgemxpYiBpcyBub3QgYXZhaWxhYmxlCit0cnk6CisgICAgaW1wb3J0IHpsaWIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB6bGliID0gTm9uZQorCitkZWYgY2FuX2ZzX2VuY29kZShmaWxlbmFtZSk6CisgICAgIiIiCisgICAgUmV0dXJuIFRydWUgaWYgdGhlIGZpbGVuYW1lIGNhbiBiZSBzYXZlZCBpbiB0aGUgZmlsZSBzeXN0ZW0uCisgICAgIiIiCisgICAgaWYgb3MucGF0aC5zdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lczoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICB0cnk6CisgICAgICAgIGZpbGVuYW1lLmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCisgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworCitjbGFzcyBBcmNoaXZlVXRpbFRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfbWFrZV90YXJiYWxsKHNlbGYpOgorICAgICAgICBzZWxmLl9tYWtlX3RhcmJhbGwoJ2FyY2hpdmUnKQorCisgICAgZGVmIF9tYWtlX3RhcmJhbGwoc2VsZiwgdGFyZ2V0X25hbWUpOgorICAgICAgICAjIGNyZWF0aW5nIHNvbWV0aGluZyB0byB0YXIKKyAgICAgICAgdG1wZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKFt0bXBkaXIsICdmaWxlMSddLCAneHh4JykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKFt0bXBkaXIsICdmaWxlMiddLCAneHh4JykKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKHRtcGRpciwgJ3N1YicpKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoW3RtcGRpciwgJ3N1YicsICdmaWxlMyddLCAneHh4JykKKworICAgICAgICB0bXBkaXIyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgdW5pdHRlc3Quc2tpcFVubGVzcyhzcGxpdGRyaXZlKHRtcGRpcilbMF0gPT0gc3BsaXRkcml2ZSh0bXBkaXIyKVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlIGFuZCB0YXJnZXQgc2hvdWxkIGJlIG9uIHNhbWUgZHJpdmUiKQorCisgICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIyLCB0YXJnZXRfbmFtZSkKKworICAgICAgICAjIHdvcmtpbmcgd2l0aCByZWxhdGl2ZSBwYXRocyB0byBhdm9pZCB0YXIgd2FybmluZ3MKKyAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHRtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFrZV90YXJiYWxsKHNwbGl0ZHJpdmUoYmFzZV9uYW1lKVsxXSwgJy4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKworICAgICAgICAjIGNoZWNrIGlmIHRoZSBjb21wcmVzc2VkIHRhcmJhbGwgd2FzIGNyZWF0ZWQKKyAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcudGFyLmd6JworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisKKyAgICAgICAgIyB0cnlpbmcgYW4gdW5jb21wcmVzc2VkIG9uZQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgdGFyZ2V0X25hbWUpCisgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcih0bXBkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1ha2VfdGFyYmFsbChzcGxpdGRyaXZlKGJhc2VfbmFtZSlbMV0sICcuJywgY29tcHJlc3M9Tm9uZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCisgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnRhcicKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorCisgICAgZGVmIF90YXJpbmZvKHNlbGYsIHBhdGgpOgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4ocGF0aCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZXMgPSB0YXIuZ2V0bmFtZXMoKQorICAgICAgICAgICAgbmFtZXMuc29ydCgpCisgICAgICAgICAgICByZXR1cm4gdHVwbGUobmFtZXMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgZGVmIF9jcmVhdGVfZmlsZXMoc2VsZik6CisgICAgICAgICMgY3JlYXRpbmcgc29tZXRoaW5nIHRvIHRhcgorICAgICAgICB0bXBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBkaXN0ID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2Rpc3QnKQorICAgICAgICBvcy5ta2RpcihkaXN0KQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoW2Rpc3QsICdmaWxlMSddLCAneHh4JykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKFtkaXN0LCAnZmlsZTInXSwgJ3h4eCcpCisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihkaXN0LCAnc3ViJykpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShbZGlzdCwgJ3N1YicsICdmaWxlMyddLCAneHh4JykKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKGRpc3QsICdzdWIyJykpCisgICAgICAgIHRtcGRpcjIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQorICAgICAgICByZXR1cm4gdG1wZGlyLCB0bXBkaXIyLCBiYXNlX25hbWUKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJSZXF1aXJlcyB6bGliIikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhmaW5kX2V4ZWN1dGFibGUoJ3RhcicpIGFuZCBmaW5kX2V4ZWN1dGFibGUoJ2d6aXAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnTmVlZCB0aGUgdGFyIGNvbW1hbmQgdG8gcnVuJykKKyAgICBkZWYgdGVzdF90YXJmaWxlX3ZzX3RhcihzZWxmKToKKyAgICAgICAgdG1wZGlyLCB0bXBkaXIyLCBiYXNlX25hbWUgPSAgc2VsZi5fY3JlYXRlX2ZpbGVzKCkKKyAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHRtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFrZV90YXJiYWxsKGJhc2VfbmFtZSwgJ2Rpc3QnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKworICAgICAgICAjIGNoZWNrIGlmIHRoZSBjb21wcmVzc2VkIHRhcmJhbGwgd2FzIGNyZWF0ZWQKKyAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcudGFyLmd6JworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisKKyAgICAgICAgIyBub3cgY3JlYXRlIGFub3RoZXIgdGFyYmFsbCB1c2luZyBgdGFyYAorICAgICAgICB0YXJiYWxsMiA9IG9zLnBhdGguam9pbih0bXBkaXIsICdhcmNoaXZlMi50YXIuZ3onKQorICAgICAgICB0YXJfY21kID0gWyd0YXInLCAnLWNmJywgJ2FyY2hpdmUyLnRhcicsICdkaXN0J10KKyAgICAgICAgZ3ppcF9jbWQgPSBbJ2d6aXAnLCAnLWY5JywgJ2FyY2hpdmUyLnRhciddCisgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcih0bXBkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNwYXduKHRhcl9jbWQpCisgICAgICAgICAgICBzcGF3bihnemlwX2NtZCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwyKSkKKyAgICAgICAgIyBsZXQncyBjb21wYXJlIGJvdGggdGFyYmFsbHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl90YXJpbmZvKHRhcmJhbGwpLCBzZWxmLl90YXJpbmZvKHRhcmJhbGwyKSkKKworICAgICAgICAjIHRyeWluZyBhbiB1bmNvbXByZXNzZWQgb25lCisgICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIyLCAnYXJjaGl2ZScpCisgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcih0bXBkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1ha2VfdGFyYmFsbChiYXNlX25hbWUsICdkaXN0JywgY29tcHJlc3M9Tm9uZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCisgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnRhcicKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorCisgICAgICAgICMgbm93IGZvciBhIGRyeV9ydW4KKyAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5qb2luKHRtcGRpcjIsICdhcmNoaXZlJykKKyAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHRtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFrZV90YXJiYWxsKGJhc2VfbmFtZSwgJ2Rpc3QnLCBjb21wcmVzcz1Ob25lLCBkcnlfcnVuPVRydWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorICAgICAgICB0YXJiYWxsID0gYmFzZV9uYW1lICsgJy50YXInCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGZpbmRfZXhlY3V0YWJsZSgnY29tcHJlc3MnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhlIGNvbXByZXNzIHByb2dyYW0gaXMgcmVxdWlyZWQnKQorICAgIGRlZiB0ZXN0X2NvbXByZXNzX2RlcHJlY2F0ZWQoc2VsZik6CisgICAgICAgIHRtcGRpciwgdG1wZGlyMiwgYmFzZV9uYW1lID0gIHNlbGYuX2NyZWF0ZV9maWxlcygpCisKKyAgICAgICAgIyB1c2luZyBjb21wcmVzcyBhbmQgdGVzdGluZyB0aGUgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZworICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIodG1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImFsd2F5cyIpCisgICAgICAgICAgICAgICAgbWFrZV90YXJiYWxsKGJhc2VfbmFtZSwgJ2Rpc3QnLCBjb21wcmVzcz0nY29tcHJlc3MnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKyAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcudGFyLlonCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDEpCisKKyAgICAgICAgIyBzYW1lIHRlc3Qgd2l0aCBkcnlfcnVuCisgICAgICAgIG9zLnJlbW92ZSh0YXJiYWxsKQorICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIodG1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImFsd2F5cyIpCisgICAgICAgICAgICAgICAgbWFrZV90YXJiYWxsKGJhc2VfbmFtZSwgJ2Rpc3QnLCBjb21wcmVzcz0nY29tcHJlc3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPVRydWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJSZXF1aXJlcyB6bGliIikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhaSVBfU1VQUE9SVCwgJ05lZWQgemlwIHN1cHBvcnQgdG8gcnVuJykKKyAgICBkZWYgdGVzdF9tYWtlX3ppcGZpbGUoc2VsZik6CisgICAgICAgICMgY3JlYXRpbmcgc29tZXRoaW5nIHRvIHRhcgorICAgICAgICB0bXBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoW3RtcGRpciwgJ2ZpbGUxJ10sICd4eHgnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoW3RtcGRpciwgJ2ZpbGUyJ10sICd4eHgnKQorCisgICAgICAgIHRtcGRpcjIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQorICAgICAgICBtYWtlX3ppcGZpbGUoYmFzZV9uYW1lLCB0bXBkaXIpCisKKyAgICAgICAgIyBjaGVjayBpZiB0aGUgY29tcHJlc3NlZCB0YXJiYWxsIHdhcyBjcmVhdGVkCisgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnppcCcKKworICAgIGRlZiB0ZXN0X2NoZWNrX2FyY2hpdmVfZm9ybWF0cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGVja19hcmNoaXZlX2Zvcm1hdHMoWydnenRhcicsICd4eHgnLCAnemlwJ10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICd4eHgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoZWNrX2FyY2hpdmVfZm9ybWF0cyhbJ2d6dGFyJywgJ3ppcCddKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X21ha2VfYXJjaGl2ZShzZWxmKToKKyAgICAgICAgdG1wZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2FyY2hpdmUnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYWtlX2FyY2hpdmUsIGJhc2VfbmFtZSwgJ3h4eCcpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAiUmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfbWFrZV9hcmNoaXZlX293bmVyX2dyb3VwKHNlbGYpOgorICAgICAgICAjIHRlc3RpbmcgbWFrZV9hcmNoaXZlIHdpdGggb3duZXIgYW5kIGdyb3VwLCB3aXRoIHZhcmlvdXMgY29tYmluYXRpb25zCisgICAgICAgICMgdGhpcyB3b3JrcyBldmVuIGlmIHRoZXJlJ3Mgbm90IGdpZC91aWQgc3VwcG9ydAorICAgICAgICBpZiBVSURfR0lEX1NVUFBPUlQ6CisgICAgICAgICAgICBncm91cCA9IGdycC5nZXRncmdpZCgwKVswXQorICAgICAgICAgICAgb3duZXIgPSBwd2QuZ2V0cHd1aWQoMClbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGdyb3VwID0gb3duZXIgPSAncm9vdCcKKworICAgICAgICBiYXNlX2Rpciwgcm9vdF9kaXIsIGJhc2VfbmFtZSA9ICBzZWxmLl9jcmVhdGVfZmlsZXMoKQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5ta2R0ZW1wKCkgLCAnYXJjaGl2ZScpCisgICAgICAgIHJlcyA9IG1ha2VfYXJjaGl2ZShiYXNlX25hbWUsICd6aXAnLCByb290X2RpciwgYmFzZV9kaXIsIG93bmVyPW93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA9Z3JvdXApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhyZXMpKQorCisgICAgICAgIHJlcyA9IG1ha2VfYXJjaGl2ZShiYXNlX25hbWUsICd6aXAnLCByb290X2RpciwgYmFzZV9kaXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhyZXMpKQorCisgICAgICAgIHJlcyA9IG1ha2VfYXJjaGl2ZShiYXNlX25hbWUsICd0YXInLCByb290X2RpciwgYmFzZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcj1vd25lciwgZ3JvdXA9Z3JvdXApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhyZXMpKQorCisgICAgICAgIHJlcyA9IG1ha2VfYXJjaGl2ZShiYXNlX25hbWUsICd0YXInLCByb290X2RpciwgYmFzZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcj0na2poa2poa2pnJywgZ3JvdXA9J29paG9ob2gnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMocmVzKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJSZXF1aXJlcyB6bGliIikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhVSURfR0lEX1NVUFBPUlQsICJSZXF1aXJlcyBncnAgYW5kIHB3ZCBzdXBwb3J0IikKKyAgICBkZWYgdGVzdF90YXJmaWxlX3Jvb3Rfb3duZXIoc2VsZik6CisgICAgICAgIHRtcGRpciwgdG1wZGlyMiwgYmFzZV9uYW1lID0gIHNlbGYuX2NyZWF0ZV9maWxlcygpCisgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcih0bXBkaXIpCisgICAgICAgIGdyb3VwID0gZ3JwLmdldGdyZ2lkKDApWzBdCisgICAgICAgIG93bmVyID0gcHdkLmdldHB3dWlkKDApWzBdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFyY2hpdmVfbmFtZSA9IG1ha2VfdGFyYmFsbChiYXNlX25hbWUsICdkaXN0JywgY29tcHJlc3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcj1vd25lciwgZ3JvdXA9Z3JvdXApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorCisgICAgICAgICMgY2hlY2sgaWYgdGhlIGNvbXByZXNzZWQgdGFyYmFsbCB3YXMgY3JlYXRlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoYXJjaGl2ZV9uYW1lKSkKKworICAgICAgICAjIG5vdyBjaGVja3MgdGhlIHJpZ2h0cworICAgICAgICBhcmNoaXZlID0gdGFyZmlsZS5vcGVuKGFyY2hpdmVfbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIG1lbWJlciBpbiBhcmNoaXZlLmdldG1lbWJlcnMoKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWJlci51aWQsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1iZXIuZ2lkLCAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgYXJjaGl2ZS5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9tYWtlX2FyY2hpdmVfY3dkKHNlbGYpOgorICAgICAgICBjdXJyZW50X2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIGRlZiBfYnJlYWtzKCphcmdzLCAqKmt3KToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigpCisgICAgICAgIEFSQ0hJVkVfRk9STUFUU1sneHh4J10gPSAoX2JyZWFrcywgW10sICd4eHggZmlsZScpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtYWtlX2FyY2hpdmUoJ3h4eCcsICd4eHgnLCByb290X2Rpcj1zZWxmLm1rZHRlbXAoKSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmdldGN3ZCgpLCBjdXJyZW50X2RpcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlbCBBUkNISVZFX0ZPUk1BVFNbJ3h4eCddCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfbWFrZV90YXJiYWxsX3VuaWNvZGUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBNaXJyb3IgdGVzdF9tYWtlX3RhcmJhbGwsIGV4Y2VwdCBmaWxlbmFtZSBpcyB1bmljb2RlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fbWFrZV90YXJiYWxsKHUnYXJjaGl2ZScpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoY2FuX2ZzX2VuY29kZSh1J8OlcmNoaXYnKSwKKyAgICAgICAgJ0ZpbGUgc3lzdGVtIGNhbm5vdCBoYW5kbGUgdGhpcyBmaWxlbmFtZScpCisgICAgZGVmIHRlc3RfbWFrZV90YXJiYWxsX3VuaWNvZGVfbGF0aW4xKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgTWlycm9yIHRlc3RfbWFrZV90YXJiYWxsLCBleGNlcHQgZmlsZW5hbWUgaXMgdW5pY29kZSBhbmQgY29udGFpbnMKKyAgICAgICAgbGF0aW4gY2hhcmFjdGVycy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX21ha2VfdGFyYmFsbCh1J8OlcmNoaXYnKSAjIG5vdGUgdGhpcyBpc24ndCBhIHJlYWwgd29yZAorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGNhbl9mc19lbmNvZGUodSfjga7jgqLjg7zjgqvjgqTjg5YnKSwKKyAgICAgICAgJ0ZpbGUgc3lzdGVtIGNhbm5vdCBoYW5kbGUgdGhpcyBmaWxlbmFtZScpCisgICAgZGVmIHRlc3RfbWFrZV90YXJiYWxsX3VuaWNvZGVfZXh0ZW5kZWQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBNaXJyb3IgdGVzdF9tYWtlX3RhcmJhbGwsIGV4Y2VwdCBmaWxlbmFtZSBpcyB1bmljb2RlIGFuZCBjb250YWlucworICAgICAgICBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIGxhdGluIGNoYXJzZXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9tYWtlX3RhcmJhbGwodSfjga7jgqLjg7zjgqvjgqTjg5YnKSAjIGphcGFuZXNlIGZvciBhcmNoaXZlCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShBcmNoaXZlVXRpbFRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2FyY2hpdmVfdXRpbC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2FyY2hpdmVfdXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkMGNjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYXJjaGl2ZV91dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2FyY2hpdmVfdXRpbC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2FyY2hpdmVfdXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkMGNjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYXJjaGl2ZV91dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjFkMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdC5weQpAQCAtMCwwICsxLDUyIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3QuIiIiCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdCBpbXBvcnQgYmRpc3QKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CisKKworY2xhc3MgQnVpbGRUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9mb3JtYXRzKHNlbGYpOgorICAgICAgICAjIGxldCdzIGNyZWF0ZSBhIGNvbW1hbmQgYW5kIG1ha2Ugc3VyZQorICAgICAgICAjIHdlIGNhbiBzZXQgdGhlIGZvcm1hdAorICAgICAgICBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpWzFdCisgICAgICAgIGNtZCA9IGJkaXN0KGRpc3QpCisgICAgICAgIGNtZC5mb3JtYXRzID0gWydtc2knXQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmZvcm1hdHMsIFsnbXNpJ10pCisKKyAgICAgICAgIyB3aGF0IGZvcm1hdHMgZG9lcyBiZGlzdCBvZmZlcj8KKyAgICAgICAgZm9ybWF0cyA9IFsnYnp0YXInLCAnZ3p0YXInLCAnbXNpJywgJ3JwbScsICd0YXInLAorICAgICAgICAgICAgICAgICAgICd3aW5pbnN0JywgJ3ppcCcsICd6dGFyJ10KKyAgICAgICAgZm91bmQgPSBzb3J0ZWQoY21kLmZvcm1hdF9jb21tYW5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvdW5kLCBmb3JtYXRzKQorCisgICAgZGVmIHRlc3Rfc2tpcF9idWlsZChzZWxmKToKKyAgICAgICAgIyBidWcgIzEwOTQ2OiBiZGlzdCAtLXNraXAtYnVpbGQgc2hvdWxkIHRyaWNrbGUgZG93biB0byBzdWJjb21tYW5kcworICAgICAgICBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpWzFdCisgICAgICAgIGNtZCA9IGJkaXN0KGRpc3QpCisgICAgICAgIGNtZC5za2lwX2J1aWxkID0gMQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGRpc3QuY29tbWFuZF9vYmpbJ2JkaXN0J10gPSBjbWQKKworICAgICAgICBuYW1lcyA9IFsnYmRpc3RfZHVtYicsICdiZGlzdF93aW5pbnN0J10KKyAgICAgICAgIyBiZGlzdF9ycG0gZG9lcyBub3Qgc3VwcG9ydCAtLXNraXAtYnVpbGQKKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICAgICAgbmFtZXMuYXBwZW5kKCdiZGlzdF9tc2knKQorCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgc3ViY21kID0gY21kLmdldF9maW5hbGl6ZWRfY29tbWFuZChuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN1YmNtZC5za2lwX2J1aWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcyBzaG91bGQgdGFrZSAtLXNraXAtYnVpbGQgZnJvbSBiZGlzdCcgJSBuYW1lKQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShCdWlsZFRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0LnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjI3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0LnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjI3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X2R1bWIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X2R1bWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiM2E4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfZHVtYi5weQpAQCAtMCwwICsxLDExNCBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X2R1bWIuIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHppcGZpbGUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKKyMgemxpYiBpcyBub3QgdXNlZCBoZXJlLCBidXQgaWYgaXQncyBub3QgYXZhaWxhYmxlCisjIHRlc3Rfc2ltcGxlX2J1aWx0IHdpbGwgZmFpbAordHJ5OgorICAgIGltcG9ydCB6bGliCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgemxpYiA9IE5vbmUKKworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X2R1bWIgaW1wb3J0IGJkaXN0X2R1bWIKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CisKK1NFVFVQX1BZID0gIiIiXAorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKK2ltcG9ydCBmb28KKworc2V0dXAobmFtZT0nZm9vJywgdmVyc2lvbj0nMC4xJywgcHlfbW9kdWxlcz1bJ2ZvbyddLAorICAgICAgdXJsPSd4eHgnLCBhdXRob3I9J3h4eCcsIGF1dGhvcl9lbWFpbD0neHh4JykKKworIiIiCisKK2NsYXNzIEJ1aWxkRHVtYlRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuRW52aXJvbkd1YXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihCdWlsZER1bWJUZXN0Q2FzZSwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLm9sZF9sb2NhdGlvbiA9IG9zLmdldGN3ZCgpCisgICAgICAgIHNlbGYub2xkX3N5c19hcmd2ID0gc3lzLmFyZ3YsIHN5cy5hcmd2WzpdCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIG9zLmNoZGlyKHNlbGYub2xkX2xvY2F0aW9uKQorICAgICAgICBzeXMuYXJndiA9IHNlbGYub2xkX3N5c19hcmd2WzBdCisgICAgICAgIHN5cy5hcmd2WzpdID0gc2VsZi5vbGRfc3lzX2FyZ3ZbMV0KKyAgICAgICAgc3VwZXIoQnVpbGREdW1iVGVzdENhc2UsIHNlbGYpLnRlYXJEb3duKCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9zaW1wbGVfYnVpbHQoc2VsZik6CisKKyAgICAgICAgIyBsZXQncyBjcmVhdGUgYSBzaW1wbGUgcGFja2FnZQorICAgICAgICB0bXBfZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgcGtnX2RpciA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAnZm9vJykKKyAgICAgICAgb3MubWtkaXIocGtnX2RpcikKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChwa2dfZGlyLCAnc2V0dXAucHknKSwgU0VUVVBfUFkpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgocGtnX2RpciwgJ2Zvby5weScpLCAnIycpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgocGtnX2RpciwgJ01BTklGRVNULmluJyksICdpbmNsdWRlIGZvby5weScpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgocGtnX2RpciwgJ1JFQURNRScpLCAnJykKKworICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsnbmFtZSc6ICdmb28nLCAndmVyc2lvbic6ICcwLjEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfbW9kdWxlcyc6IFsnZm9vJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1cmwnOiAneHh4JywgJ2F1dGhvcic6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXV0aG9yX2VtYWlsJzogJ3h4eCd9KQorICAgICAgICBkaXN0LnNjcmlwdF9uYW1lID0gJ3NldHVwLnB5JworICAgICAgICBvcy5jaGRpcihwa2dfZGlyKQorCisgICAgICAgIHN5cy5hcmd2ID0gWydzZXR1cC5weSddCisgICAgICAgIGNtZCA9IGJkaXN0X2R1bWIoZGlzdCkKKworICAgICAgICAjIHNvIHRoZSBvdXRwdXQgaXMgdGhlIHNhbWUgbm8gbWF0dGVyCisgICAgICAgICMgd2hhdCBpcyB0aGUgcGxhdGZvcm0KKyAgICAgICAgY21kLmZvcm1hdCA9ICd6aXAnCisKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICAjIHNlZSB3aGF0IHdlIGhhdmUKKyAgICAgICAgZGlzdF9jcmVhdGVkID0gb3MubGlzdGRpcihvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ2Rpc3QnKSkKKyAgICAgICAgYmFzZSA9ICIlcy4lcy56aXAiICUgKGRpc3QuZ2V0X2Z1bGxuYW1lKCksIGNtZC5wbGF0X25hbWUpCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ29zMic6CisgICAgICAgICAgICBiYXNlID0gYmFzZS5yZXBsYWNlKCc6JywgJy0nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdF9jcmVhdGVkLCBbYmFzZV0pCisKKyAgICAgICAgIyBub3cgbGV0J3MgY2hlY2sgd2hhdCB3ZSBoYXZlIGluIHRoZSB6aXAgZmlsZQorICAgICAgICBmcCA9IHppcGZpbGUuWmlwRmlsZShvcy5wYXRoLmpvaW4oJ2Rpc3QnLCBiYXNlKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29udGVudHMgPSBmcC5uYW1lbGlzdCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgY29udGVudHMgPSBzb3J0ZWQob3MucGF0aC5iYXNlbmFtZShmbikgZm9yIGZuIGluIGNvbnRlbnRzKQorICAgICAgICB3YW50ZWQgPSBbJ2Zvby0wLjEtcHklcy4lcy5lZ2ctaW5mbycgJSBzeXMudmVyc2lvbl9pbmZvWzoyXSwgJ2Zvby5weSddCisgICAgICAgIGlmIG5vdCBzeXMuZG9udF93cml0ZV9ieXRlY29kZToKKyAgICAgICAgICAgIHdhbnRlZC5hcHBlbmQoJ2Zvby5weWMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRzLCBzb3J0ZWQod2FudGVkKSkKKworICAgIGRlZiB0ZXN0X2ZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgb3MuY2hkaXIocGtnX2RpcikKKyAgICAgICAgY21kID0gYmRpc3RfZHVtYihkaXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5iZGlzdF9kaXIsIE5vbmUpCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKworICAgICAgICAjIGJkaXN0X2RpciBpcyBpbml0aWFsaXplZCB0byBiZGlzdF9iYXNlL2R1bWIgaWYgbm90IHNldAorICAgICAgICBiYXNlID0gY21kLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYmRpc3QnKS5iZGlzdF9iYXNlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmJkaXN0X2Rpciwgb3MucGF0aC5qb2luKGJhc2UsICdkdW1iJykpCisKKyAgICAgICAgIyB0aGUgZm9ybWF0IGlzIHNldCB0byBhIGRlZmF1bHQgdmFsdWUgZGVwZW5kaW5nIG9uIHRoZSBvcy5uYW1lCisgICAgICAgIGRlZmF1bHQgPSBjbWQuZGVmYXVsdF9mb3JtYXRbb3MubmFtZV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZm9ybWF0LCBkZWZhdWx0KQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQnVpbGREdW1iVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfZHVtYi5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X2R1bWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzIwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X2R1bWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfZHVtYi5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X2R1bWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzIwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X2R1bWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfbXNpLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9tc2kucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmN2MzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfbXNpLnB5CkBAIC0wLDAgKzEsMjYgQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9tc2kuIiIiCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJywgJ3RoZXNlIHRlc3RzIHJlcXVpcmUgV2luZG93cycpCitjbGFzcyBCRGlzdE1TSVRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAdW5pdHRlc3Quc2tpcCgiUmVxdWlyZSBiZGlzdF9tc2kiKQorICAgIGRlZiB0ZXN0X21pbmltYWwoc2VsZik6CisgICAgICAgICMgbWluaW1hbCB0ZXN0IFhYWCBuZWVkIG1vcmUgdGVzdHMKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9tc2kgaW1wb3J0IGJkaXN0X21zaQorICAgICAgICBwcm9qZWN0X2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBjbWQgPSBiZGlzdF9tc2koZGlzdCkKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShCRGlzdE1TSVRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X21zaS5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X21zaS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjNTkyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfbXNpLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X21zaS5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X21zaS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjNTkyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfbXNpLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDg5MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weQpAQCAtMCwwICsxLDEzNiBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3JwbS4iIiIKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHNodXRpbAorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3JwbSBpbXBvcnQgYmRpc3RfcnBtCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZQorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHNwYXduCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvcgorCitTRVRVUF9QWSA9ICIiIlwKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCitpbXBvcnQgZm9vCisKK3NldHVwKG5hbWU9J2ZvbycsIHZlcnNpb249JzAuMScsIHB5X21vZHVsZXM9Wydmb28nXSwKKyAgICAgIHVybD0neHh4JywgYXV0aG9yPSd4eHgnLCBhdXRob3JfZW1haWw9J3h4eCcpCisKKyIiIgorCitjbGFzcyBCdWlsZFJwbVRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKEJ1aWxkUnBtVGVzdENhc2UsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5vbGRfbG9jYXRpb24gPSBvcy5nZXRjd2QoKQorICAgICAgICBzZWxmLm9sZF9zeXNfYXJndiA9IHN5cy5hcmd2LCBzeXMuYXJndls6XQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBvcy5jaGRpcihzZWxmLm9sZF9sb2NhdGlvbikKKyAgICAgICAgc3lzLmFyZ3YgPSBzZWxmLm9sZF9zeXNfYXJndlswXQorICAgICAgICBzeXMuYXJndls6XSA9IHNlbGYub2xkX3N5c19hcmd2WzFdCisgICAgICAgIHN1cGVyKEJ1aWxkUnBtVGVzdENhc2UsIHNlbGYpLnRlYXJEb3duKCkKKworICAgIGRlZiB0ZXN0X3F1aWV0KHNlbGYpOgorCisgICAgICAgICMgWFhYIEkgYW0gdW5hYmxlIHlldCB0byBtYWtlIHRoaXMgdGVzdCB3b3JrIHdpdGhvdXQKKyAgICAgICAgIyBzcHVyaW91cyBzZHRvdXQvc3RkZXJyIG91dHB1dCB1bmRlciBNYWMgT1MgWAorICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ2xpbnV4Mic6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIHRoaXMgdGVzdCB3aWxsIHJ1biBvbmx5IGlmIHRoZSBycG0gY29tbWFuZHMgYXJlIGZvdW5kCisgICAgICAgIGlmIChmaW5kX2V4ZWN1dGFibGUoJ3JwbScpIGlzIE5vbmUgb3IKKyAgICAgICAgICAgIGZpbmRfZXhlY3V0YWJsZSgncnBtYnVpbGQnKSBpcyBOb25lKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgbGV0J3MgY3JlYXRlIGEgcGFja2FnZQorICAgICAgICB0bXBfZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgcGtnX2RpciA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAnZm9vJykKKyAgICAgICAgb3MubWtkaXIocGtnX2RpcikKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChwa2dfZGlyLCAnc2V0dXAucHknKSwgU0VUVVBfUFkpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgocGtnX2RpciwgJ2Zvby5weScpLCAnIycpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgocGtnX2RpciwgJ01BTklGRVNULmluJyksICdpbmNsdWRlIGZvby5weScpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgocGtnX2RpciwgJ1JFQURNRScpLCAnJykKKworICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsnbmFtZSc6ICdmb28nLCAndmVyc2lvbic6ICcwLjEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfbW9kdWxlcyc6IFsnZm9vJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1cmwnOiAneHh4JywgJ2F1dGhvcic6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXV0aG9yX2VtYWlsJzogJ3h4eCd9KQorICAgICAgICBkaXN0LnNjcmlwdF9uYW1lID0gJ3NldHVwLnB5JworICAgICAgICBvcy5jaGRpcihwa2dfZGlyKQorCisgICAgICAgIHN5cy5hcmd2ID0gWydzZXR1cC5weSddCisgICAgICAgIGNtZCA9IGJkaXN0X3JwbShkaXN0KQorICAgICAgICBjbWQuZml4X3B5dGhvbiA9IFRydWUKKworICAgICAgICAjIHJ1bm5pbmcgaW4gcXVpZXQgbW9kZQorICAgICAgICBjbWQucXVpZXQgPSAxCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgZGlzdF9jcmVhdGVkID0gb3MubGlzdGRpcihvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ2Rpc3QnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdmb28tMC4xLTEubm9hcmNoLnJwbScgaW4gZGlzdF9jcmVhdGVkKQorCisgICAgICAgICMgYnVnICMyOTQ1OiB1cGxvYWQgaWdub3JlcyBiZGlzdF9ycG0gZmlsZXMKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2JkaXN0X3JwbScsICdhbnknLCAnZGlzdC9mb28tMC4xLTEuc3JjLnJwbScpLCBkaXN0LmRpc3RfZmlsZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdiZGlzdF9ycG0nLCAnYW55JywgJ2Rpc3QvZm9vLTAuMS0xLm5vYXJjaC5ycG0nKSwgZGlzdC5kaXN0X2ZpbGVzKQorCisgICAgZGVmIHRlc3Rfbm9fb3B0aW1pemVfZmxhZyhzZWxmKToKKworICAgICAgICAjIFhYWCBJIGFtIHVuYWJsZSB5ZXQgdG8gbWFrZSB0aGlzIHRlc3Qgd29yayB3aXRob3V0CisgICAgICAgICMgc3B1cmlvdXMgc2R0b3V0L3N0ZGVyciBvdXRwdXQgdW5kZXIgTWFjIE9TIFgKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICdsaW51eDInOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTUzMzE2NAorICAgICAgICAjIHRoaXMgdGVzdCB3aWxsIHJ1biBvbmx5IGlmIHRoZSBycG0gY29tbWFuZCBpcyBmb3VuZAorICAgICAgICBpZiAoZmluZF9leGVjdXRhYmxlKCdycG0nKSBpcyBOb25lIG9yCisgICAgICAgICAgICBmaW5kX2V4ZWN1dGFibGUoJ3JwbWJ1aWxkJykgaXMgTm9uZSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIGxldCdzIGNyZWF0ZSBhIHBhY2thZ2UgdGhhdCBicmFrZXMgYmRpc3RfcnBtCisgICAgICAgIHRtcF9kaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBwa2dfZGlyID0gb3MucGF0aC5qb2luKHRtcF9kaXIsICdmb28nKQorICAgICAgICBvcy5ta2Rpcihwa2dfZGlyKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHBrZ19kaXIsICdzZXR1cC5weScpLCBTRVRVUF9QWSkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChwa2dfZGlyLCAnZm9vLnB5JyksICcjJykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChwa2dfZGlyLCAnTUFOSUZFU1QuaW4nKSwgJ2luY2x1ZGUgZm9vLnB5JykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChwa2dfZGlyLCAnUkVBRE1FJyksICcnKQorCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ2ZvbycsICd2ZXJzaW9uJzogJzAuMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweV9tb2R1bGVzJzogWydmb28nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCc6ICd4eHgnLCAnYXV0aG9yJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhdXRob3JfZW1haWwnOiAneHh4J30pCisgICAgICAgIGRpc3Quc2NyaXB0X25hbWUgPSAnc2V0dXAucHknCisgICAgICAgIG9zLmNoZGlyKHBrZ19kaXIpCisKKyAgICAgICAgc3lzLmFyZ3YgPSBbJ3NldHVwLnB5J10KKyAgICAgICAgY21kID0gYmRpc3RfcnBtKGRpc3QpCisgICAgICAgIGNtZC5maXhfcHl0aG9uID0gVHJ1ZQorCisgICAgICAgIGNtZC5xdWlldCA9IDEKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICBkaXN0X2NyZWF0ZWQgPSBvcy5saXN0ZGlyKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZGlzdCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2Zvby0wLjEtMS5ub2FyY2gucnBtJyBpbiBkaXN0X2NyZWF0ZWQpCisKKyAgICAgICAgIyBidWcgIzI5NDU6IHVwbG9hZCBpZ25vcmVzIGJkaXN0X3JwbSBmaWxlcworICAgICAgICBzZWxmLmFzc2VydEluKCgnYmRpc3RfcnBtJywgJ2FueScsICdkaXN0L2Zvby0wLjEtMS5zcmMucnBtJyksIGRpc3QuZGlzdF9maWxlcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2JkaXN0X3JwbScsICdhbnknLCAnZGlzdC9mb28tMC4xLTEubm9hcmNoLnJwbScpLCBkaXN0LmRpc3RfZmlsZXMpCisKKyAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZGlzdCcsICdmb28tMC4xLTEubm9hcmNoLnJwbScpKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQnVpbGRScG1UZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YzU3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YzU3YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYjEzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3dpbmluc3QucHkKQEAgLTAsMCArMSwzMiBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3dpbmluc3QuIiIiCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3Rfd2luaW5zdCBpbXBvcnQgYmRpc3Rfd2luaW5zdAorZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKKworY2xhc3MgQnVpbGRXaW5JbnN0VGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZ2V0X2V4ZV9ieXRlcyhzZWxmKToKKworICAgICAgICAjIGlzc3VlNTczMTogY29tbWFuZCB3YXMgYnJva2VuIG9uIG5vbi13aW5kb3dzIHBsYXRmb3JtcworICAgICAgICAjIHRoaXMgdGVzdCBtYWtlcyBzdXJlIGl0IHdvcmtzIG5vdyBmb3IgZXZlcnkgcGxhdGZvcm0KKyAgICAgICAgIyBsZXQncyBjcmVhdGUgYSBjb21tYW5kCisgICAgICAgIHBrZ19wdGgsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gYmRpc3Rfd2luaW5zdChkaXN0KQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisKKyAgICAgICAgIyBsZXQncyBydW4gdGhlIGNvZGUgdGhhdCBmaW5kcyB0aGUgcmlnaHQgd2luaW5zdCouZXhlIGZpbGUKKyAgICAgICAgIyBhbmQgbWFrZSBzdXJlIGl0IGZpbmRzIGl0IGFuZCByZXR1cm5zIGl0cyBjb250ZW50CisgICAgICAgICMgbm8gbWF0dGVyIHdoYXQgcGxhdGZvcm0gd2UgaGF2ZQorICAgICAgICBleGVfZmlsZSA9IGNtZC5nZXRfZXhlX2J5dGVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihleGVfZmlsZSkgPiAxMCkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEJ1aWxkV2luSW5zdFRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3dpbmluc3QucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGNlZDAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3dpbmluc3QucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGNlZDAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWI4ZDczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weQpAQCAtMCwwICsxLDU1IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGQuIiIiCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGQgaW1wb3J0IGJ1aWxkCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9wbGF0Zm9ybQorCitjbGFzcyBCdWlsZFRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGJ1aWxkKGRpc3QpCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKworICAgICAgICAjIGlmIG5vdCBzcGVjaWZpZWQsIHBsYXRfbmFtZSBnZXRzIHRoZSBjdXJyZW50IHBsYXRmb3JtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLnBsYXRfbmFtZSwgZ2V0X3BsYXRmb3JtKCkpCisKKyAgICAgICAgIyBidWlsZF9wdXJlbGliIGlzIGJ1aWxkICsgbGliCisgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjbWQuYnVpbGRfYmFzZSwgJ2xpYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmJ1aWxkX3B1cmVsaWIsIHdhbnRlZCkKKworICAgICAgICAjIGJ1aWxkX3BsYXRsaWIgaXMgJ2J1aWxkL2xpYi5wbGF0Zm9ybS14LnhbLXB5ZGVidWddJworICAgICAgICAjIGV4YW1wbGVzOgorICAgICAgICAjICAgYnVpbGQvbGliLm1hY29zeC0xMC4zLWkzODYtMi43CisgICAgICAgIHBsYXRfc3BlYyA9ICcuJXMtJXMnICUgKGNtZC5wbGF0X25hbWUsIHN5cy52ZXJzaW9uWzA6M10pCisgICAgICAgIGlmIGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtZC5idWlsZF9wbGF0bGliLmVuZHN3aXRoKCctcHlkZWJ1ZycpKQorICAgICAgICAgICAgcGxhdF9zcGVjICs9ICctcHlkZWJ1ZycKKyAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKGNtZC5idWlsZF9iYXNlLCAnbGliJyArIHBsYXRfc3BlYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuYnVpbGRfcGxhdGxpYiwgd2FudGVkKQorCisgICAgICAgICMgYnkgZGVmYXVsdCwgYnVpbGRfbGliID0gYnVpbGRfcHVyZWxpYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5idWlsZF9saWIsIGNtZC5idWlsZF9wdXJlbGliKQorCisgICAgICAgICMgYnVpbGRfdGVtcCBpcyBidWlsZC90ZW1wLjxwbGF0PgorICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oY21kLmJ1aWxkX2Jhc2UsICd0ZW1wJyArIHBsYXRfc3BlYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuYnVpbGRfdGVtcCwgd2FudGVkKQorCisgICAgICAgICMgYnVpbGRfc2NyaXB0cyBpcyBidWlsZC9zY3JpcHRzLXgueAorICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oY21kLmJ1aWxkX2Jhc2UsICdzY3JpcHRzLScgKyAgc3lzLnZlcnNpb25bMDozXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuYnVpbGRfc2NyaXB0cywgd2FudGVkKQorCisgICAgICAgICMgZXhlY3V0YWJsZSBpcyBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjdXRhYmxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5leGVjdXRhYmxlLCBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjdXRhYmxlKSkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEJ1aWxkVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkYTQzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkYTQzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfY2xpYi5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfY2xpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWYxYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5CkBAIC0wLDAgKzEsMTQ2IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfY2xpYi4iIiIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2NsaWIgaW1wb3J0IGJ1aWxkX2NsaWIKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgorZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKK2Zyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBmaW5kX2V4ZWN1dGFibGUKKworY2xhc3MgQnVpbGRDTGliVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY2hlY2tfbGlicmFyeV9kaXN0KHNlbGYpOgorICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGJ1aWxkX2NsaWIoZGlzdCkKKworICAgICAgICAjICdsaWJyYXJpZXMnIG9wdGlvbiBtdXN0IGJlIGEgbGlzdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQuY2hlY2tfbGlicmFyeV9saXN0LCAnZm9vJykKKworICAgICAgICAjIGVhY2ggZWxlbWVudCBvZiAnbGlicmFyaWVzJyBtdXN0IGEgMi10dXBsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQuY2hlY2tfbGlicmFyeV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2ZvbzEnLCAnZm9vMiddKQorCisgICAgICAgICMgZmlyc3QgZWxlbWVudCBvZiBlYWNoIHR1cGxlIGluICdsaWJyYXJpZXMnCisgICAgICAgICMgbXVzdCBiZSBhIHN0cmluZyAodGhlIGxpYnJhcnkgbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgY21kLmNoZWNrX2xpYnJhcnlfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWygxLCAnZm9vMScpLCAoJ25hbWUnLCAnZm9vMicpXSkKKworICAgICAgICAjIGxpYnJhcnkgbmFtZSBtYXkgbm90IGNvbnRhaW4gZGlyZWN0b3J5IHNlcGFyYXRvcnMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgY21kLmNoZWNrX2xpYnJhcnlfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWygnbmFtZScsICdmb28xJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2Fub3RoZXIvbmFtZScsICdmb28yJyldKQorCisgICAgICAgICMgc2Vjb25kIGVsZW1lbnQgb2YgZWFjaCB0dXBsZSBtdXN0IGJlIGEgZGljdGlvbmFyeSAoYnVpbGQgaW5mbykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgY21kLmNoZWNrX2xpYnJhcnlfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWygnbmFtZScsIHt9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYW5vdGhlcicsICdmb28yJyldKQorCisgICAgICAgICMgdGhvc2Ugd29yaworICAgICAgICBsaWJzID0gWygnbmFtZScsIHt9KSwgKCduYW1lJywgeydvayc6ICdnb29kJ30pXQorICAgICAgICBjbWQuY2hlY2tfbGlicmFyeV9saXN0KGxpYnMpCisKKyAgICBkZWYgdGVzdF9nZXRfc291cmNlX2ZpbGVzKHNlbGYpOgorICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGJ1aWxkX2NsaWIoZGlzdCkKKworICAgICAgICAjICJpbiAnbGlicmFyaWVzJyBvcHRpb24gJ3NvdXJjZXMnIG11c3QgYmUgcHJlc2VudCBhbmQgbXVzdCBiZQorICAgICAgICAjIGEgbGlzdCBvZiBzb3VyY2UgZmlsZW5hbWVzCisgICAgICAgIGNtZC5saWJyYXJpZXMgPSBbKCduYW1lJywge30pXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQuZ2V0X3NvdXJjZV9maWxlcykKKworICAgICAgICBjbWQubGlicmFyaWVzID0gWygnbmFtZScsIHsnc291cmNlcyc6IDF9KV0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgY21kLmdldF9zb3VyY2VfZmlsZXMpCisKKyAgICAgICAgY21kLmxpYnJhcmllcyA9IFsoJ25hbWUnLCB7J3NvdXJjZXMnOiBbJ2EnLCAnYiddfSldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmdldF9zb3VyY2VfZmlsZXMoKSwgWydhJywgJ2InXSkKKworICAgICAgICBjbWQubGlicmFyaWVzID0gWygnbmFtZScsIHsnc291cmNlcyc6ICgnYScsICdiJyl9KV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZ2V0X3NvdXJjZV9maWxlcygpLCBbJ2EnLCAnYiddKQorCisgICAgICAgIGNtZC5saWJyYXJpZXMgPSBbKCduYW1lJywgeydzb3VyY2VzJzogKCdhJywgJ2InKX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnbmFtZTInLCB7J3NvdXJjZXMnOiBbJ2MnLCAnZCddfSldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmdldF9zb3VyY2VfZmlsZXMoKSwgWydhJywgJ2InLCAnYycsICdkJ10pCisKKyAgICBkZWYgdGVzdF9idWlsZF9saWJyYXJpZXMoc2VsZik6CisKKyAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBjbWQgPSBidWlsZF9jbGliKGRpc3QpCisgICAgICAgIGNsYXNzIEZha2VDb21waWxlcjoKKyAgICAgICAgICAgIGRlZiBjb21waWxlKCphcmdzLCAqKmt3KToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBjcmVhdGVfc3RhdGljX2xpYiA9IGNvbXBpbGUKKworICAgICAgICBjbWQuY29tcGlsZXIgPSBGYWtlQ29tcGlsZXIoKQorCisgICAgICAgICMgYnVpbGRfbGlicmFyaWVzIGlzIGFsc28gZG9pbmcgYSBiaXQgb2YgdHlwb2UgY2hlY2tpbmcKKyAgICAgICAgbGliID0gWygnbmFtZScsIHsnc291cmNlcyc6ICdub3R2YWxpZCd9KV0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgY21kLmJ1aWxkX2xpYnJhcmllcywgbGliKQorCisgICAgICAgIGxpYiA9IFsoJ25hbWUnLCB7J3NvdXJjZXMnOiBsaXN0KCl9KV0KKyAgICAgICAgY21kLmJ1aWxkX2xpYnJhcmllcyhsaWIpCisKKyAgICAgICAgbGliID0gWygnbmFtZScsIHsnc291cmNlcyc6IHR1cGxlKCl9KV0KKyAgICAgICAgY21kLmJ1aWxkX2xpYnJhcmllcyhsaWIpCisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGJ1aWxkX2NsaWIoZGlzdCkKKworICAgICAgICBjbWQuaW5jbHVkZV9kaXJzID0gJ29uZS1kaXInCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuaW5jbHVkZV9kaXJzLCBbJ29uZS1kaXInXSkKKworICAgICAgICBjbWQuaW5jbHVkZV9kaXJzID0gTm9uZQorICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmluY2x1ZGVfZGlycywgW10pCisKKyAgICAgICAgY21kLmRpc3RyaWJ1dGlvbi5saWJyYXJpZXMgPSAnV09OVFdPUksnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5maW5hbGl6ZV9vcHRpb25zKQorCisgICAgZGVmIHRlc3RfcnVuKHNlbGYpOgorICAgICAgICAjIGNhbid0IHRlc3Qgb24gd2luZG93cworICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gYnVpbGRfY2xpYihkaXN0KQorCisgICAgICAgIGZvb19jID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdmb28uYycpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShmb29fYywgJ2ludCBtYWluKHZvaWQpIHsgcmV0dXJuIDE7fVxuJykKKyAgICAgICAgY21kLmxpYnJhcmllcyA9IFsoJ2ZvbycsIHsnc291cmNlcyc6IFtmb29fY119KV0KKworICAgICAgICBidWlsZF90ZW1wID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdidWlsZCcpCisgICAgICAgIG9zLm1rZGlyKGJ1aWxkX3RlbXApCisgICAgICAgIGNtZC5idWlsZF90ZW1wID0gYnVpbGRfdGVtcAorICAgICAgICBjbWQuYnVpbGRfY2xpYiA9IGJ1aWxkX3RlbXAKKworICAgICAgICAjIGJlZm9yZSB3ZSBydW4gdGhlIGNvbW1hbmQsIHdlIHdhbnQgdG8gbWFrZSBzdXJlCisgICAgICAgICMgYWxsIGNvbW1hbmRzIGFyZSBwcmVzZW50IG9uIHRoZSBzeXN0ZW0KKyAgICAgICAgIyBieSBjcmVhdGluZyBhIGNvbXBpbGVyIGFuZCBjaGVja2luZyBpdHMgZXhlY3V0YWJsZXMKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBuZXdfY29tcGlsZXIKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIKKworICAgICAgICBjb21waWxlciA9IG5ld19jb21waWxlcigpCisgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcikKKyAgICAgICAgZm9yIGNjbWQgaW4gY29tcGlsZXIuZXhlY3V0YWJsZXMudmFsdWVzKCk6CisgICAgICAgICAgICBpZiBjY21kIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGZpbmRfZXhlY3V0YWJsZShjY21kWzBdKSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiAjIGNhbid0IHRlc3QKKworICAgICAgICAjIHRoaXMgc2hvdWxkIHdvcmsKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgIyBsZXQncyBjaGVjayB0aGUgcmVzdWx0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnbGliZm9vLmEnIGluIG9zLmxpc3RkaXIoYnVpbGRfdGVtcCkpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShCdWlsZENMaWJUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfY2xpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJhZTVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfY2xpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfY2xpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJhZTVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfY2xpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9leHQucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGM2ZWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9leHQucHkKQEAgLTAsMCArMSw1MjIgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCB0ZXh0d3JhcAorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBFeHRlbnNpb24sIERpc3RyaWJ1dGlvbgorZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZworZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKERpc3R1dGlsc1NldHVwRXJyb3IsIENvbXBpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IpCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNDM3MworIyBEb24ndCBsb2FkIHRoZSB4eCBtb2R1bGUgbW9yZSB0aGFuIG9uY2UuCitBTFJFQURZX1RFU1RFRCA9IEZhbHNlCisKKworY2xhc3MgQnVpbGRFeHRUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoQnVpbGRFeHRUZXN0Q2FzZSwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLnRtcF9kaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBzZWxmLnh4X2NyZWF0ZWQgPSBGYWxzZQorICAgICAgICBzeXMucGF0aC5hcHBlbmQoc2VsZi50bXBfZGlyKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3lzLnBhdGgucmVtb3ZlLCBzZWxmLnRtcF9kaXIpCisgICAgICAgIGlmIHN5cy52ZXJzaW9uID4gIjIuNiI6CisgICAgICAgICAgICBpbXBvcnQgc2l0ZQorICAgICAgICAgICAgc2VsZi5vbGRfdXNlcl9iYXNlID0gc2l0ZS5VU0VSX0JBU0UKKyAgICAgICAgICAgIHNpdGUuVVNFUl9CQVNFID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQgaW1wb3J0IGJ1aWxkX2V4dAorICAgICAgICAgICAgYnVpbGRfZXh0LlVTRVJfQkFTRSA9IHNpdGUuVVNFUl9CQVNFCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYueHhfY3JlYXRlZDoKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxvYWQoJ3h4JykKKyAgICAgICAgICAgICMgWFhYIG9uIFdpbmRvd3MgdGhlIHRlc3QgbGVhdmVzIGEgZGlyZWN0b3J5CisgICAgICAgICAgICAjIHdpdGggeHggbW9kdWxlIGluIFRFTVAKKyAgICAgICAgc3VwZXIoQnVpbGRFeHRUZXN0Q2FzZSwgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIHRlc3RfYnVpbGRfZXh0KHNlbGYpOgorICAgICAgICBnbG9iYWwgQUxSRUFEWV9URVNURUQKKyAgICAgICAgc3VwcG9ydC5jb3B5X3h4bW9kdWxlX2Moc2VsZi50bXBfZGlyKQorICAgICAgICBzZWxmLnh4X2NyZWF0ZWQgPSBUcnVlCisgICAgICAgIHh4X2MgPSBvcy5wYXRoLmpvaW4oc2VsZi50bXBfZGlyLCAneHhtb2R1bGUuYycpCisgICAgICAgIHh4X2V4dCA9IEV4dGVuc2lvbigneHgnLCBbeHhfY10pCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ3h4JywgJ2V4dF9tb2R1bGVzJzogW3h4X2V4dF19KQorICAgICAgICBkaXN0LnBhY2thZ2VfZGlyID0gc2VsZi50bXBfZGlyCisgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQorICAgICAgICBzdXBwb3J0LmZpeHVwX2J1aWxkX2V4dChjbWQpCisgICAgICAgIGNtZC5idWlsZF9saWIgPSBzZWxmLnRtcF9kaXIKKyAgICAgICAgY21kLmJ1aWxkX3RlbXAgPSBzZWxmLnRtcF9kaXIKKworICAgICAgICBvbGRfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBpZiBub3QgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAjIHNpbGVuY2UgY29tcGlsZXIgb3V0cHV0CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gU3RyaW5nSU8oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgICAgICAjQnJva2VuIGFmdGVyIGlzc3VlIDc3MTIocjc4MTM2KSA6IGFkZCBhIHRlbXBfY3dkIGNvbnRleHQgbWFuYWdlciB0byB0ZXN0X3N1cHBvcnQgLi4uCisgICAgICAgICAgICAjV2l0aG91dCBjdXJyZW50IHdvcmtpbmcgZGlyOiAiLi4uY2Fubm90IGZpbmQgLWxweXRob24yNyIKKyAgICAgICAgICAgICNOT1RFOiBbcHkzayBzdm4gcjg1NTU5XSBGaXJzdCAodW5jb250cm92ZXJzaWFsKSBwYXJ0IG9mIGlzc3VlIDk4MDcsIGJhcnJ5LndhcnNhdywgMjAxMC0xMC0xNiA6CisgICAgICAgICAgICAjICBuZXcgX2ZpeHVwX2NvbW1hbmQgaXMgYm9ndXMsIHNvIHdlIHdpbGwgdXNlIG93biB3b3JrLWFyb3VuZAorICAgICAgICAgICAgY21kLmxpYnJhcnlfZGlycy5pbnNlcnQoMCwgdGVzdF9zdXBwb3J0LlNBVkVEQ1dEKQorICAgICAgICAgICAgY21kLnJ1bigpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gb2xkX3N0ZG91dAorCisgICAgICAgIGlmIEFMUkVBRFlfVEVTVEVEOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBBTFJFQURZX1RFU1RFRCA9IFRydWUKKworICAgICAgICBpbXBvcnQgeHgKKworICAgICAgICBmb3IgYXR0ciBpbiAoJ2Vycm9yJywgJ2ZvbycsICduZXcnLCAncm9qJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cih4eCwgYXR0cikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4eC5mb28oMiwgNSksIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeHguZm9vKDEzLDE1KSwgMjgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeHgubmV3KCkuZGVtbygpLCBOb25lKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuSEFWRV9ET0NTVFJJTkdTOgorICAgICAgICAgICAgZG9jID0gJ1RoaXMgaXMgYSB0ZW1wbGF0ZSBtb2R1bGUganVzdCBmb3IgaW5zdHJ1Y3Rpb24uJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4eC5fX2RvY19fLCBkb2MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHh4Lk51bGwoKSwgeHguTnVsbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHh4LlN0cigpLCB4eC5TdHIpKQorCisgICAgZGVmIHRlc3Rfc29sYXJpc19lbmFibGVfc2hhcmVkKHNlbGYpOgorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsnbmFtZSc6ICd4eCd9KQorICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgb2xkID0gc3lzLnBsYXRmb3JtCisKKyAgICAgICAgc3lzLnBsYXRmb3JtID0gJ3N1bm9zJyAjIGZvb2xpbmcgZmluYWxpemVfb3B0aW9ucworICAgICAgICBmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0ICBfY29uZmlnX3ZhcnMKKyAgICAgICAgb2xkX3ZhciA9IF9jb25maWdfdmFycy5nZXQoJ1B5X0VOQUJMRV9TSEFSRUQnKQorICAgICAgICBfY29uZmlnX3ZhcnNbJ1B5X0VOQUJMRV9TSEFSRUQnXSA9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnBsYXRmb3JtID0gb2xkCisgICAgICAgICAgICBpZiBvbGRfdmFyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVsIF9jb25maWdfdmFyc1snUHlfRU5BQkxFX1NIQVJFRCddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIF9jb25maWdfdmFyc1snUHlfRU5BQkxFX1NIQVJFRCddID0gb2xkX3ZhcgorCisgICAgICAgICMgbWFrZSBzdXJlIHdlIGdldCBzb21lIGxpYnJhcnkgZGlycyB1bmRlciBzb2xhcmlzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oY21kLmxpYnJhcnlfZGlycykgPiAwKQorCisgICAgZGVmIHRlc3RfdXNlcl9zaXRlKHNlbGYpOgorICAgICAgICAjIHNpdGUuVVNFUl9TSVRFIHdhcyBpbnRyb2R1Y2VkIGluIDIuNgorICAgICAgICBpZiBzeXMudmVyc2lvbiA8ICcyLjYnOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaW1wb3J0IHNpdGUKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7J25hbWUnOiAneHgnfSkKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisKKyAgICAgICAgIyBtYWtpbmcgc3VyZSB0aGUgdXNlciBvcHRpb24gaXMgdGhlcmUKKyAgICAgICAgb3B0aW9ucyA9IFtuYW1lIGZvciBuYW1lLCBzaG9ydCwgbGFiZWwgaW4KKyAgICAgICAgICAgICAgICAgICBjbWQudXNlcl9vcHRpb25zXQorICAgICAgICBzZWxmLmFzc2VydEluKCd1c2VyJywgb3B0aW9ucykKKworICAgICAgICAjIHNldHRpbmcgYSB2YWx1ZQorICAgICAgICBjbWQudXNlciA9IDEKKworICAgICAgICAjIHNldHRpbmcgdXNlciBiYXNlZCBsaWIgYW5kIGluY2x1ZGUKKyAgICAgICAgbGliID0gb3MucGF0aC5qb2luKHNpdGUuVVNFUl9CQVNFLCAnbGliJykKKyAgICAgICAgaW5jbCA9IG9zLnBhdGguam9pbihzaXRlLlVTRVJfQkFTRSwgJ2luY2x1ZGUnKQorICAgICAgICBvcy5ta2RpcihsaWIpCisgICAgICAgIG9zLm1rZGlyKGluY2wpCisKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorCisgICAgICAgICMgc2VlIGlmIGluY2x1ZGVfZGlycyBhbmQgbGlicmFyeV9kaXJzIHdlcmUgc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0SW4obGliLCBjbWQubGlicmFyeV9kaXJzKQorICAgICAgICBzZWxmLmFzc2VydEluKGxpYiwgY21kLnJwYXRoKQorICAgICAgICBzZWxmLmFzc2VydEluKGluY2wsIGNtZC5pbmNsdWRlX2RpcnMpCisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBQeXRob24ncyBpbmNsdWRlIGRpcmVjdG9yaWVzIChmb3IgUHl0aG9uLmgsIHB5Y29uZmlnLmgsCisgICAgICAgICMgZXRjLikgYXJlIGluIHRoZSBpbmNsdWRlIHNlYXJjaCBwYXRoLgorICAgICAgICBtb2R1bGVzID0gW0V4dGVuc2lvbignZm9vJywgWyd4eHgnXSldCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ3h4JywgJ2V4dF9tb2R1bGVzJzogbW9kdWxlc30pCisgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQorICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisKKyAgICAgICAgcHlfaW5jbHVkZSA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2luYygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShweV9pbmNsdWRlIGluIGNtZC5pbmNsdWRlX2RpcnMpCisKKyAgICAgICAgcGxhdF9weV9pbmNsdWRlID0gc3lzY29uZmlnLmdldF9weXRob25faW5jKHBsYXRfc3BlY2lmaWM9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBsYXRfcHlfaW5jbHVkZSBpbiBjbWQuaW5jbHVkZV9kaXJzKQorCisgICAgICAgICMgbWFrZSBzdXJlIGNtZC5saWJyYXJpZXMgaXMgdHVybmVkIGludG8gYSBsaXN0CisgICAgICAgICMgaWYgaXQncyBhIHN0cmluZworICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLmxpYnJhcmllcyA9ICdteV9saWIsIG90aGVyX2xpYiBsYXN0bGliJworICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmxpYnJhcmllcywgWydteV9saWInLCAnb3RoZXJfbGliJywgJ2xhc3RsaWInXSkKKworICAgICAgICAjIG1ha2Ugc3VyZSBjbWQubGlicmFyeV9kaXJzIGlzIHR1cm5lZCBpbnRvIGEgbGlzdAorICAgICAgICAjIGlmIGl0J3MgYSBzdHJpbmcKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIGNtZC5saWJyYXJ5X2RpcnMgPSAnbXlfbGliX2RpciVzb3RoZXJfbGliX2RpcicgJSBvcy5wYXRoc2VwCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignbXlfbGliX2RpcicsIGNtZC5saWJyYXJ5X2RpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ290aGVyX2xpYl9kaXInLCBjbWQubGlicmFyeV9kaXJzKQorCisgICAgICAgICMgbWFrZSBzdXJlIHJwYXRoIGlzIHR1cm5lZCBpbnRvIGEgbGlzdAorICAgICAgICAjIGlmIGl0J3MgYSBzdHJpbmcKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIGNtZC5ycGF0aCA9ICdvbmUlc3R3bycgJSBvcy5wYXRoc2VwCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQucnBhdGgsIFsnb25lJywgJ3R3byddKQorCisgICAgICAgICMgWFhYIG1vcmUgdGVzdHMgdG8gcGVyZm9ybSBmb3Igd2luMzIKKworICAgICAgICAjIG1ha2Ugc3VyZSBkZWZpbmUgaXMgdHVybmVkIGludG8gMi10dXBsZXMKKyAgICAgICAgIyBzdHJpbmdzIGlmIHRoZXkgYXJlICcsJy1zZXBhcmF0ZWQgc3RyaW5ncworICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLmRlZmluZSA9ICdvbmUsdHdvJworICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmRlZmluZSwgWygnb25lJywgJzEnKSwgKCd0d28nLCAnMScpXSkKKworICAgICAgICAjIG1ha2Ugc3VyZSB1bmRlZiBpcyB0dXJuZWQgaW50byBhIGxpc3Qgb2YKKyAgICAgICAgIyBzdHJpbmdzIGlmIHRoZXkgYXJlICcsJy1zZXBhcmF0ZWQgc3RyaW5ncworICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLnVuZGVmID0gJ29uZSx0d28nCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQudW5kZWYsIFsnb25lJywgJ3R3byddKQorCisgICAgICAgICMgbWFrZSBzdXJlIHN3aWdfb3B0cyBpcyB0dXJuZWQgaW50byBhIGxpc3QKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIGNtZC5zd2lnX29wdHMgPSBOb25lCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuc3dpZ19vcHRzLCBbXSkKKworICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLnN3aWdfb3B0cyA9ICcxIDInCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuc3dpZ19vcHRzLCBbJzEnLCAnMiddKQorCisgICAgZGVmIHRlc3RfY2hlY2tfZXh0ZW5zaW9uc19saXN0KHNlbGYpOgorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKCkKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKworICAgICAgICAjJ2V4dGVuc2lvbnMnIG9wdGlvbiBtdXN0IGJlIGEgbGlzdCBvZiBFeHRlbnNpb24gaW5zdGFuY2VzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5jaGVja19leHRlbnNpb25zX2xpc3QsICdmb28nKQorCisgICAgICAgICMgZWFjaCBlbGVtZW50IG9mICdleHRfbW9kdWxlcycgb3B0aW9uIG11c3QgYmUgYW4KKyAgICAgICAgIyBFeHRlbnNpb24gaW5zdGFuY2Ugb3IgMi10dXBsZQorICAgICAgICBleHRzID0gWygnYmFyJywgJ2ZvbycsICdiYXInKSwgJ2ZvbyddCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5jaGVja19leHRlbnNpb25zX2xpc3QsIGV4dHMpCisKKyAgICAgICAgIyBmaXJzdCBlbGVtZW50IG9mIGVhY2ggdHVwbGUgaW4gJ2V4dF9tb2R1bGVzJworICAgICAgICAjIG11c3QgYmUgdGhlIGV4dGVuc2lvbiBuYW1lIChhIHN0cmluZykgYW5kIG1hdGNoCisgICAgICAgICMgYSBweXRob24gZG90dGVkLXNlcGFyYXRlZCBuYW1lCisgICAgICAgIGV4dHMgPSBbKCdmb28tYmFyJywgJycpXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQuY2hlY2tfZXh0ZW5zaW9uc19saXN0LCBleHRzKQorCisgICAgICAgICMgc2Vjb25kIGVsZW1lbnQgb2YgZWFjaCB0dXBsZSBpbiAnZXh0X21vZHVsZXMnCisgICAgICAgICMgbXVzdCBiZSBhIGFyeSAoYnVpbGQgaW5mbykKKyAgICAgICAgZXh0cyA9IFsoJ2Zvby5iYXInLCAnJyldCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5jaGVja19leHRlbnNpb25zX2xpc3QsIGV4dHMpCisKKyAgICAgICAgIyBvayB0aGlzIG9uZSBzaG91bGQgcGFzcworICAgICAgICBleHRzID0gWygnZm9vLmJhcicsIHsnc291cmNlcyc6IFsnJ10sICdsaWJyYXJpZXMnOiAnZm9vJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvbWUnOiAnYmFyJ30pXQorICAgICAgICBjbWQuY2hlY2tfZXh0ZW5zaW9uc19saXN0KGV4dHMpCisgICAgICAgIGV4dCA9IGV4dHNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZXh0LCBFeHRlbnNpb24pKQorCisgICAgICAgICMgY2hlY2tfZXh0ZW5zaW9uc19saXN0IGFkZHMgaW4gZXh0IHRoZSB2YWx1ZXMgcGFzc2VkCisgICAgICAgICMgd2hlbiB0aGV5IGFyZSBpbiAoJ2luY2x1ZGVfZGlycycsICdsaWJyYXJ5X2RpcnMnLCAnbGlicmFyaWVzJworICAgICAgICAjICdleHRyYV9vYmplY3RzJywgJ2V4dHJhX2NvbXBpbGVfYXJncycsICdleHRyYV9saW5rX2FyZ3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4dC5saWJyYXJpZXMsICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoZXh0LCAnc29tZScpKQorCisgICAgICAgICMgJ21hY3JvcycgZWxlbWVudCBvZiBidWlsZCBpbmZvIGRpY3QgbXVzdCBiZSAxLSBvciAyLXR1cGxlCisgICAgICAgIGV4dHMgPSBbKCdmb28uYmFyJywgeydzb3VyY2VzJzogWycnXSwgJ2xpYnJhcmllcyc6ICdmb28nLAorICAgICAgICAgICAgICAgICdzb21lJzogJ2JhcicsICdtYWNyb3MnOiBbKCcxJywgJzInLCAnMycpLCAnZm9vJ119KV0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgY21kLmNoZWNrX2V4dGVuc2lvbnNfbGlzdCwgZXh0cykKKworICAgICAgICBleHRzWzBdWzFdWydtYWNyb3MnXSA9IFsoJzEnLCAnMicpLCAoJzMnLCldCisgICAgICAgIGNtZC5jaGVja19leHRlbnNpb25zX2xpc3QoZXh0cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHRzWzBdLnVuZGVmX21hY3JvcywgWyczJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0c1swXS5kZWZpbmVfbWFjcm9zLCBbKCcxJywgJzInKV0pCisKKyAgICBkZWYgdGVzdF9nZXRfc291cmNlX2ZpbGVzKHNlbGYpOgorICAgICAgICBtb2R1bGVzID0gW0V4dGVuc2lvbignZm9vJywgWyd4eHgnXSldCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ3h4JywgJ2V4dF9tb2R1bGVzJzogbW9kdWxlc30pCisgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmdldF9zb3VyY2VfZmlsZXMoKSwgWyd4eHgnXSkKKworICAgIGRlZiB0ZXN0X2NvbXBpbGVyX29wdGlvbihzZWxmKToKKyAgICAgICAgIyBjbWQuY29tcGlsZXIgaXMgYW4gb3B0aW9uIGFuZAorICAgICAgICAjIHNob3VsZCBub3QgYmUgb3ZlcnJpZGVuIGJ5IGEgY29tcGlsZXIgaW5zdGFuY2UKKyAgICAgICAgIyB3aGVuIHRoZSBjb21tYW5kIGlzIHJ1bgorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKCkKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIGNtZC5jb21waWxlciA9ICd1bml4JworICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5jb21waWxlciwgJ3VuaXgnKQorCisgICAgZGVmIHRlc3RfZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgIHRtcF9kaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBjX2ZpbGUgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgJ2Zvby5jJykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKGNfZmlsZSwgJ3ZvaWQgaW5pdGZvbyh2b2lkKSB7fTtcbicpCisgICAgICAgIGV4dCA9IEV4dGVuc2lvbignZm9vJywgW2NfZmlsZV0pCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ3h4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4dF9tb2R1bGVzJzogW2V4dF19KQorICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgc3VwcG9ydC5maXh1cF9idWlsZF9leHQoY21kKQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNtZC5nZXRfb3V0cHV0cygpKSwgMSkKKworICAgICAgICBjbWQuYnVpbGRfbGliID0gb3MucGF0aC5qb2luKHNlbGYudG1wX2RpciwgJ2J1aWxkJykKKyAgICAgICAgY21kLmJ1aWxkX3RlbXAgPSBvcy5wYXRoLmpvaW4oc2VsZi50bXBfZGlyLCAndGVtcHQnKQorCisgICAgICAgICMgaXNzdWUgIzU5NzcgOiBkaXN0dXRpbHMgYnVpbGRfZXh0LmdldF9vdXRwdXRzCisgICAgICAgICMgcmV0dXJucyB3cm9uZyByZXN1bHQgd2l0aCAtLWlucGxhY2UKKyAgICAgICAgb3RoZXJfdG1wX2RpciA9IG9zLnBhdGgucmVhbHBhdGgoc2VsZi5ta2R0ZW1wKCkpCisgICAgICAgIG9sZF93ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgICNXaXRob3V0IGN1cnJlbnQgd29ya2luZyBkaXI6ICIuLi5jYW5ub3QgZmluZCAtbHB5dGhvbjI3IgorICAgICAgICAjTk9URTogQWZ0ZXIgaXNzdWUgIzc3MTIocjc4MTM2KSB0ZXN0IGNhbm5vdCB1c2Ugb2xkX3dkICEKKyAgICAgICAgI2NtZC5saWJyYXJ5X2RpcnMuaW5zZXJ0KDAsIG9sZF93ZCkKKyAgICAgICAgI05PVEU6IFtweTNrIHN2biByODU1NTldIEZpcnN0ICh1bmNvbnRyb3ZlcnNpYWwpIHBhcnQgb2YgaXNzdWUgOTgwNywgYmFycnkud2Fyc2F3LCAyMDEwLTEwLTE2IDoKKyAgICAgICAgIyAgbmV3IF9maXh1cF9jb21tYW5kIGlzIGJvZ3VzLCBzbyB3ZSB3aWxsIHVzZSBvd24gd29yay1hcm91bmQKKyAgICAgICAgY21kLmxpYnJhcnlfZGlycy5pbnNlcnQoMCwgdGVzdF9zdXBwb3J0LlNBVkVEQ1dEKQorICAgICAgICBvcy5jaGRpcihvdGhlcl90bXBfZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbWQuaW5wbGFjZSA9IDEKKyAgICAgICAgICAgIGNtZC5ydW4oKQorICAgICAgICAgICAgc29fZmlsZSA9IGNtZC5nZXRfb3V0cHV0cygpWzBdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfd2QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzb19maWxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLnNwbGl0ZXh0KHNvX2ZpbGUpWy0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1NPJykpCisgICAgICAgIHNvX2RpciA9IG9zLnBhdGguZGlybmFtZShzb19maWxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvX2Rpciwgb3RoZXJfdG1wX2RpcikKKyAgICAgICAgY21kLmNvbXBpbGVyID0gTm9uZQorICAgICAgICBjbWQuaW5wbGFjZSA9IDAKKyAgICAgICAgY21kLnJ1bigpCisgICAgICAgIHNvX2ZpbGUgPSBjbWQuZ2V0X291dHB1dHMoKVswXQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc29fZmlsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5zcGxpdGV4dChzb19maWxlKVstMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdTTycpKQorICAgICAgICBzb19kaXIgPSBvcy5wYXRoLmRpcm5hbWUoc29fZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb19kaXIsIGNtZC5idWlsZF9saWIpCisKKyAgICAgICAgIyBpbnBsYWNlID0gMCwgY21kLnBhY2thZ2UgPSAnYmFyJworICAgICAgICBidWlsZF9weSA9IGNtZC5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKKyAgICAgICAgYnVpbGRfcHkucGFja2FnZV9kaXIgPSB7Jyc6ICdiYXInfQorICAgICAgICBwYXRoID0gY21kLmdldF9leHRfZnVsbHBhdGgoJ2ZvbycpCisgICAgICAgICMgY2hlY2tpbmcgdGhhdCB0aGUgbGFzdCBkaXJlY3RvcnkgaXMgdGhlIGJ1aWxkX2RpcgorICAgICAgICBwYXRoID0gb3MucGF0aC5zcGxpdChwYXRoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdGgsIGNtZC5idWlsZF9saWIpCisKKyAgICAgICAgIyBpbnBsYWNlID0gMSwgY21kLnBhY2thZ2UgPSAnYmFyJworICAgICAgICBjbWQuaW5wbGFjZSA9IDEKKyAgICAgICAgb3RoZXJfdG1wX2RpciA9IG9zLnBhdGgucmVhbHBhdGgoc2VsZi5ta2R0ZW1wKCkpCisgICAgICAgIG9sZF93ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKG90aGVyX3RtcF9kaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhdGggPSBjbWQuZ2V0X2V4dF9mdWxscGF0aCgnZm9vJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNoZGlyKG9sZF93ZCkKKyAgICAgICAgIyBjaGVja2luZyB0aGF0IHRoZSBsYXN0IGRpcmVjdG9yeSBpcyBiYXIKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguc3BsaXQocGF0aClbMF0KKyAgICAgICAgbGFzdGRpciA9IG9zLnBhdGguc3BsaXQocGF0aClbLTFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGFzdGRpciwgJ2JhcicpCisKKyAgICBkZWYgdGVzdF9leHRfZnVsbHBhdGgoc2VsZik6CisgICAgICAgIGV4dCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoKVsnU08nXQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKCkKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIGNtZC5pbnBsYWNlID0gMQorICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGlyID0geycnOiAnc3JjJ30KKyAgICAgICAgY21kLmRpc3RyaWJ1dGlvbi5wYWNrYWdlcyA9IFsnbHhtbCcsICdseG1sLmh0bWwnXQorICAgICAgICBjdXJkaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oY3VyZGlyLCAnc3JjJywgJ2x4bWwnLCAnZXRyZWUnICsgZXh0KQorICAgICAgICBwYXRoID0gY21kLmdldF9leHRfZnVsbHBhdGgoJ2x4bWwuZXRyZWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdhbnRlZCwgcGF0aCkKKworICAgICAgICAjIGJ1aWxkaW5nIGx4bWwuZXRyZWUgbm90IGlucGxhY2UKKyAgICAgICAgY21kLmlucGxhY2UgPSAwCisgICAgICAgIGNtZC5idWlsZF9saWIgPSBvcy5wYXRoLmpvaW4oY3VyZGlyLCAndG1wZGlyJykKKyAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKGN1cmRpciwgJ3RtcGRpcicsICdseG1sJywgJ2V0cmVlJyArIGV4dCkKKyAgICAgICAgcGF0aCA9IGNtZC5nZXRfZXh0X2Z1bGxwYXRoKCdseG1sLmV0cmVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3YW50ZWQsIHBhdGgpCisKKyAgICAgICAgIyBidWlsZGluZyB0d2lzdGVkLnJ1bm5lci5wb3J0bWFwIG5vdCBpbnBsYWNlCisgICAgICAgIGJ1aWxkX3B5ID0gY21kLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKQorICAgICAgICBidWlsZF9weS5wYWNrYWdlX2RpciA9IHt9CisgICAgICAgIGNtZC5kaXN0cmlidXRpb24ucGFja2FnZXMgPSBbJ3R3aXN0ZWQnLCAndHdpc3RlZC5ydW5uZXIucG9ydG1hcCddCisgICAgICAgIHBhdGggPSBjbWQuZ2V0X2V4dF9mdWxscGF0aCgndHdpc3RlZC5ydW5uZXIucG9ydG1hcCcpCisgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjdXJkaXIsICd0bXBkaXInLCAndHdpc3RlZCcsICdydW5uZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BvcnRtYXAnICsgZXh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdhbnRlZCwgcGF0aCkKKworICAgICAgICAjIGJ1aWxkaW5nIHR3aXN0ZWQucnVubmVyLnBvcnRtYXAgaW5wbGFjZQorICAgICAgICBjbWQuaW5wbGFjZSA9IDEKKyAgICAgICAgcGF0aCA9IGNtZC5nZXRfZXh0X2Z1bGxwYXRoKCd0d2lzdGVkLnJ1bm5lci5wb3J0bWFwJykKKyAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKGN1cmRpciwgJ3R3aXN0ZWQnLCAncnVubmVyJywgJ3BvcnRtYXAnICsgZXh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdhbnRlZCwgcGF0aCkKKworICAgIGRlZiB0ZXN0X2J1aWxkX2V4dF9pbnBsYWNlKHNlbGYpOgorICAgICAgICBldHJlZV9jID0gb3MucGF0aC5qb2luKHNlbGYudG1wX2RpciwgJ2x4bWwuZXRyZWUuYycpCisgICAgICAgIGV0cmVlX2V4dCA9IEV4dGVuc2lvbignbHhtbC5ldHJlZScsIFtldHJlZV9jXSkKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7J25hbWUnOiAnbHhtbCcsICdleHRfbW9kdWxlcyc6IFtldHJlZV9leHRdfSkKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLmlucGxhY2UgPSAxCisgICAgICAgIGNtZC5kaXN0cmlidXRpb24ucGFja2FnZV9kaXIgPSB7Jyc6ICdzcmMnfQorICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLnBhY2thZ2VzID0gWydseG1sJywgJ2x4bWwuaHRtbCddCisgICAgICAgIGN1cmRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIGV4dCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiU08iKQorICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oY3VyZGlyLCAnc3JjJywgJ2x4bWwnLCAnZXRyZWUnICsgZXh0KQorICAgICAgICBwYXRoID0gY21kLmdldF9leHRfZnVsbHBhdGgoJ2x4bWwuZXRyZWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdhbnRlZCwgcGF0aCkKKworICAgIGRlZiB0ZXN0X3NldHVwdG9vbHNfY29tcGF0KHNlbGYpOgorICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvcmUsIGRpc3R1dGlscy5leHRlbnNpb24sIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dAorICAgICAgICBzYXZlZF9leHQgPSBkaXN0dXRpbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIG9uIHNvbWUgcGxhdGZvcm1zLCBpdCBsb2FkcyB0aGUgZGVwcmVjYXRlZCAiZGwiIG1vZHVsZQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3NldHVwdG9vbHNfYnVpbGRfZXh0JywgZGVwcmVjYXRlZD1UcnVlKQorCisgICAgICAgICAgICAjIHRoZXNlcyBpbXBvcnQgcGF0Y2ggRGlzdHV0aWxzJyBFeHRlbnNpb24gY2xhc3MKKyAgICAgICAgICAgIGZyb20gc2V0dXB0b29sc19idWlsZF9leHQgaW1wb3J0IGJ1aWxkX2V4dCBhcyBzZXR1cHRvb2xzX2J1aWxkX2V4dAorICAgICAgICAgICAgZnJvbSBzZXR1cHRvb2xzX2V4dGVuc2lvbiBpbXBvcnQgRXh0ZW5zaW9uCisKKyAgICAgICAgICAgIGV0cmVlX2MgPSBvcy5wYXRoLmpvaW4oc2VsZi50bXBfZGlyLCAnbHhtbC5ldHJlZS5jJykKKyAgICAgICAgICAgIGV0cmVlX2V4dCA9IEV4dGVuc2lvbignbHhtbC5ldHJlZScsIFtldHJlZV9jXSkKKyAgICAgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ2x4bWwnLCAnZXh0X21vZHVsZXMnOiBbZXRyZWVfZXh0XX0pCisgICAgICAgICAgICBjbWQgPSBzZXR1cHRvb2xzX2J1aWxkX2V4dChkaXN0KQorICAgICAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICAgICAgY21kLmlucGxhY2UgPSAxCisgICAgICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGlyID0geycnOiAnc3JjJ30KKyAgICAgICAgICAgIGNtZC5kaXN0cmlidXRpb24ucGFja2FnZXMgPSBbJ2x4bWwnLCAnbHhtbC5odG1sJ10KKyAgICAgICAgICAgIGN1cmRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgICAgICBleHQgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIlNPIikKKyAgICAgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjdXJkaXIsICdzcmMnLCAnbHhtbCcsICdldHJlZScgKyBleHQpCisgICAgICAgICAgICBwYXRoID0gY21kLmdldF9leHRfZnVsbHBhdGgoJ2x4bWwuZXRyZWUnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3YW50ZWQsIHBhdGgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAjIHJlc3RvcmluZyBEaXN0dXRpbHMnIEV4dGVuc2lvbiBjbGFzcyBvdGhlcndpc2UgaXRzIGJyb2tlbgorICAgICAgICAgICAgZGlzdHV0aWxzLmV4dGVuc2lvbi5FeHRlbnNpb24gPSBzYXZlZF9leHQKKyAgICAgICAgICAgIGRpc3R1dGlscy5jb3JlLkV4dGVuc2lvbiA9IHNhdmVkX2V4dAorICAgICAgICAgICAgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0LkV4dGVuc2lvbiA9IHNhdmVkX2V4dAorCisgICAgZGVmIHRlc3RfYnVpbGRfZXh0X3BhdGhfd2l0aF9vc19zZXAoc2VsZik6CisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ1VwZGF0ZU1hbmFnZXInfSkKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgZXh0ID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJTTyIpCisgICAgICAgIGV4dF9uYW1lID0gb3MucGF0aC5qb2luKCdVcGRhdGVNYW5hZ2VyJywgJ2Zkc2VuZCcpCisgICAgICAgIGV4dF9wYXRoID0gY21kLmdldF9leHRfZnVsbHBhdGgoZXh0X25hbWUpCisgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjbWQuYnVpbGRfbGliLCAnVXBkYXRlTWFuYWdlcicsICdmZHNlbmQnICsgZXh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4dF9wYXRoLCB3YW50ZWQpCisKKyAgICBkZWYgdGVzdF9idWlsZF9leHRfcGF0aF9jcm9zc19wbGF0Zm9ybShzZWxmKToKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7J25hbWUnOiAnVXBkYXRlTWFuYWdlcid9KQorICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBleHQgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIlNPIikKKyAgICAgICAgIyB0aGlzIG5lZWRzIHRvIHdvcmsgZXZlbiB1bmRlciB3aW4zMgorICAgICAgICBleHRfbmFtZSA9ICdVcGRhdGVNYW5hZ2VyL2Zkc2VuZCcKKyAgICAgICAgZXh0X3BhdGggPSBjbWQuZ2V0X2V4dF9mdWxscGF0aChleHRfbmFtZSkKKyAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKGNtZC5idWlsZF9saWIsICdVcGRhdGVNYW5hZ2VyJywgJ2Zkc2VuZCcgKyBleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0X3BhdGgsIHdhbnRlZCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJywgJ3Rlc3Qgb25seSByZWxldmFudCBmb3IgTWFjT1NYJykKKyAgICBkZWYgdGVzdF9kZXBsb3ltZW50X3RhcmdldF9kZWZhdWx0KHNlbGYpOgorICAgICAgICAjIElzc3VlIDk1MTY6IFRlc3QgdGhhdCwgaW4gdGhlIGFic2VuY2Ugb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLAorICAgICAgICAjIGFuIGV4dGVuc2lvbiBtb2R1bGUgaXMgY29tcGlsZWQgd2l0aCB0aGUgc2FtZSBkZXBsb3ltZW50IHRhcmdldCBhcworICAgICAgICAjICB0aGUgaW50ZXJwcmV0ZXIuCisgICAgICAgIHNlbGYuX3RyeV9jb21waWxlX2RlcGxveW1lbnRfdGFyZ2V0KCc9PScsIE5vbmUpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicsICd0ZXN0IG9ubHkgcmVsZXZhbnQgZm9yIE1hY09TWCcpCisgICAgZGVmIHRlc3RfZGVwbG95bWVudF90YXJnZXRfdG9vX2xvdyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA5NTE2OiBUZXN0IHRoYXQgYW4gZXh0ZW5zaW9uIG1vZHVsZSBpcyBub3QgYWxsb3dlZCB0byBiZQorICAgICAgICAjIGNvbXBpbGVkIHdpdGggYSBkZXBsb3ltZW50IHRhcmdldCBsZXNzIHRoYW4gdGhhdCBvZiB0aGUgaW50ZXJwcmV0ZXIuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsCisgICAgICAgICAgICBzZWxmLl90cnlfY29tcGlsZV9kZXBsb3ltZW50X3RhcmdldCwgJz4nLCAnMTAuMScpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicsICd0ZXN0IG9ubHkgcmVsZXZhbnQgZm9yIE1hY09TWCcpCisgICAgZGVmIHRlc3RfZGVwbG95bWVudF90YXJnZXRfaGlnaGVyX29rKHNlbGYpOgorICAgICAgICAjIElzc3VlIDk1MTY6IFRlc3QgdGhhdCBhbiBleHRlbnNpb24gbW9kdWxlIGNhbiBiZSBjb21waWxlZCB3aXRoIGEKKyAgICAgICAgIyBkZXBsb3ltZW50IHRhcmdldCBoaWdoZXIgdGhhbiB0aGF0IG9mIHRoZSBpbnRlcnByZXRlcjogdGhlIGV4dAorICAgICAgICAjIG1vZHVsZSBtYXkgZGVwZW5kIG9uIHNvbWUgbmV3ZXIgT1MgZmVhdHVyZS4KKyAgICAgICAgZGVwdGFyZ2V0ID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnKQorICAgICAgICBpZiBkZXB0YXJnZXQ6CisgICAgICAgICAgICAjIGluY3JlbWVudCB0aGUgbWlub3IgdmVyc2lvbiBudW1iZXIgKGkuZS4gMTAuNiAtPiAxMC43KQorICAgICAgICAgICAgZGVwdGFyZ2V0ID0gW2ludCh4KSBmb3IgeCBpbiBkZXB0YXJnZXQuc3BsaXQoJy4nKV0KKyAgICAgICAgICAgIGRlcHRhcmdldFstMV0gKz0gMQorICAgICAgICAgICAgZGVwdGFyZ2V0ID0gJy4nLmpvaW4oc3RyKGkpIGZvciBpIGluIGRlcHRhcmdldCkKKyAgICAgICAgICAgIHNlbGYuX3RyeV9jb21waWxlX2RlcGxveW1lbnRfdGFyZ2V0KCc8JywgZGVwdGFyZ2V0KQorCisgICAgZGVmIF90cnlfY29tcGlsZV9kZXBsb3ltZW50X3RhcmdldChzZWxmLCBvcGVyYXRvciwgdGFyZ2V0KToKKyAgICAgICAgb3JpZ19lbnZpcm9uID0gb3MuZW52aXJvbgorICAgICAgICBvcy5lbnZpcm9uID0gb3JpZ19lbnZpcm9uLmNvcHkoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2V0YXR0ciwgb3MsICdlbnZpcm9uJywgb3JpZ19lbnZpcm9uKQorCisgICAgICAgIGlmIHRhcmdldCBpcyBOb25lOgorICAgICAgICAgICAgaWYgb3MuZW52aXJvbi5nZXQoJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcpOgorICAgICAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uWydNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3MuZW52aXJvblsnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJ10gPSB0YXJnZXQKKworICAgICAgICBkZXB0YXJnZXRfYyA9IG9zLnBhdGguam9pbihzZWxmLnRtcF9kaXIsICdkZXB0YXJnZXRtb2R1bGUuYycpCisKKyAgICAgICAgd2l0aCBvcGVuKGRlcHRhcmdldF9jLCAndycpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUodGV4dHdyYXAuZGVkZW50KCcnJ1wKKyAgICAgICAgICAgICAgICAjaW5jbHVkZSA8QXZhaWxhYmlsaXR5TWFjcm9zLmg+CisKKyAgICAgICAgICAgICAgICBpbnQgZHVtbXk7CisKKyAgICAgICAgICAgICAgICAjaWYgVEFSR0VUICVzIE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVECisgICAgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAjZXJyb3IgIlVuZXhwZWN0ZWQgdGFyZ2V0IgorICAgICAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAnJycgJSBvcGVyYXRvcikpCisKKyAgICAgICAgIyBnZXQgdGhlIGRlcGxveW1lbnQgdGFyZ2V0IHRoYXQgdGhlIGludGVycHJldGVyIHdhcyBidWlsdCB3aXRoCisgICAgICAgIHRhcmdldCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJykKKyAgICAgICAgdGFyZ2V0ID0gdHVwbGUobWFwKGludCwgdGFyZ2V0LnNwbGl0KCcuJykpKQorICAgICAgICB0YXJnZXQgPSAnJTAyZCUwMWQwJyAlIHRhcmdldAorICAgICAgICBkZXB0YXJnZXRfZXh0ID0gRXh0ZW5zaW9uKAorICAgICAgICAgICAgJ2RlcHRhcmdldCcsCisgICAgICAgICAgICBbZGVwdGFyZ2V0X2NdLAorICAgICAgICAgICAgZXh0cmFfY29tcGlsZV9hcmdzPVsnLURUQVJHRVQ9JXMnJSh0YXJnZXQsKV0sCisgICAgICAgICkKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7CisgICAgICAgICAgICAnbmFtZSc6ICdkZXB0YXJnZXQnLAorICAgICAgICAgICAgJ2V4dF9tb2R1bGVzJzogW2RlcHRhcmdldF9leHRdCisgICAgICAgIH0pCisgICAgICAgIGRpc3QucGFja2FnZV9kaXIgPSBzZWxmLnRtcF9kaXIKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIGNtZC5idWlsZF9saWIgPSBzZWxmLnRtcF9kaXIKKyAgICAgICAgY21kLmJ1aWxkX3RlbXAgPSBzZWxmLnRtcF9kaXIKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgICAgICBjbWQucnVuKCkKKyAgICAgICAgZXhjZXB0IENvbXBpbGVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiV3JvbmcgZGVwbG95bWVudCB0YXJnZXQgZHVyaW5nIGNvbXBpbGF0aW9uIikKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEJ1aWxkRXh0VGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2Mzc0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2Mzc0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9weS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzZlYzIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9weS5weQpAQCAtMCwwICsxLDEyMiBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3B5LiIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBTdHJpbmdJTworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfcHkgaW1wb3J0IGJ1aWxkX3B5Citmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRmlsZUVycm9yCisKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworCitjbGFzcyBCdWlsZFB5VGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9wYWNrYWdlX2RhdGEoc2VsZik6CisgICAgICAgIHNvdXJjZXMgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc291cmNlcywgIl9faW5pdF9fLnB5IiksICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiIyBQcmV0ZW5kIHRoaXMgaXMgYSBwYWNrYWdlLiIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNvdXJjZXMsICJSRUFETUUudHh0IiksICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiSW5mbyBhYm91dCB0aGlzIHBhY2thZ2UiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgZGVzdGluYXRpb24gPSBzZWxmLm1rZHRlbXAoKQorCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyJwYWNrYWdlcyI6IFsicGtnIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlX2RpciI6IHsicGtnIjogc291cmNlc319KQorICAgICAgICAjIHNjcmlwdF9uYW1lIG5lZWQgbm90IGV4aXN0LCBpdCBqdXN0IG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQKKyAgICAgICAgZGlzdC5zY3JpcHRfbmFtZSA9IG9zLnBhdGguam9pbihzb3VyY2VzLCAic2V0dXAucHkiKQorICAgICAgICBkaXN0LmNvbW1hbmRfb2JqWyJidWlsZCJdID0gc3VwcG9ydC5EdW1teUNvbW1hbmQoCisgICAgICAgICAgICBmb3JjZT0wLAorICAgICAgICAgICAgYnVpbGRfbGliPWRlc3RpbmF0aW9uKQorICAgICAgICBkaXN0LnBhY2thZ2VzID0gWyJwa2ciXQorICAgICAgICBkaXN0LnBhY2thZ2VfZGF0YSA9IHsicGtnIjogWyJSRUFETUUudHh0Il19CisgICAgICAgIGRpc3QucGFja2FnZV9kaXIgPSB7InBrZyI6IHNvdXJjZXN9CisKKyAgICAgICAgY21kID0gYnVpbGRfcHkoZGlzdCkKKyAgICAgICAgY21kLmNvbXBpbGUgPSAxCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQucGFja2FnZV9kYXRhLCBkaXN0LnBhY2thZ2VfZGF0YSkKKworICAgICAgICBjbWQucnVuKCkKKworICAgICAgICAjIFRoaXMgbWFrZXMgc3VyZSB0aGUgbGlzdCBvZiBvdXRwdXRzIGluY2x1ZGVzIGJ5dGUtY29tcGlsZWQKKyAgICAgICAgIyBmaWxlcyBmb3IgUHl0aG9uIG1vZHVsZXMgYnV0IG5vdCBmb3IgcGFja2FnZSBkYXRhIGZpbGVzCisgICAgICAgICMgKHRoZXJlIHNob3VsZG4ndCAqYmUqIGJ5dGUtY29kZSBmaWxlcyBmb3IgdGhvc2UhKS4KKyAgICAgICAgIworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjbWQuZ2V0X291dHB1dHMoKSksIDMpCisgICAgICAgIHBrZ2Rlc3QgPSBvcy5wYXRoLmpvaW4oZGVzdGluYXRpb24sICJwa2ciKQorICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIocGtnZGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiX19pbml0X18ucHkiLCBmaWxlcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiUkVBRE1FLnR4dCIsIGZpbGVzKQorICAgICAgICAjIFhYWCBldmVuIHdpdGggLU8sIGRpc3R1dGlscyB3cml0ZXMgcHljLCBub3QgcHlvOyBidWc/CisgICAgICAgIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiX19pbml0X18ucHljIiwgZmlsZXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJfX2luaXRfXy5weWMiLCBmaWxlcykKKworICAgIGRlZiB0ZXN0X2VtcHR5X3BhY2thZ2VfZGlyKHNlbGYpOgorICAgICAgICAjIFNlZSBTRiAxNjY4NTk2LzE3MjA4OTcuCisgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisKKyAgICAgICAgIyBjcmVhdGUgdGhlIGRpc3RyaWJ1dGlvbiBmaWxlcy4KKyAgICAgICAgc291cmNlcyA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIG9wZW4ob3MucGF0aC5qb2luKHNvdXJjZXMsICJfX2luaXRfXy5weSIpLCAidyIpLmNsb3NlKCkKKworICAgICAgICB0ZXN0ZGlyID0gb3MucGF0aC5qb2luKHNvdXJjZXMsICJkb2MiKQorICAgICAgICBvcy5ta2Rpcih0ZXN0ZGlyKQorICAgICAgICBvcGVuKG9zLnBhdGguam9pbih0ZXN0ZGlyLCAidGVzdGZpbGUiKSwgInciKS5jbG9zZSgpCisKKyAgICAgICAgb3MuY2hkaXIoc291cmNlcykKKyAgICAgICAgb2xkX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc3lzLnN0ZG91dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsicGFja2FnZXMiOiBbInBrZyJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2VfZGlyIjogeyJwa2ciOiAiIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZV9kYXRhIjogeyJwa2ciOiBbImRvYy8qIl19fSkKKyAgICAgICAgICAgICMgc2NyaXB0X25hbWUgbmVlZCBub3QgZXhpc3QsIGl0IGp1c3QgbmVlZCB0byBiZSBpbml0aWFsaXplZAorICAgICAgICAgICAgZGlzdC5zY3JpcHRfbmFtZSA9IG9zLnBhdGguam9pbihzb3VyY2VzLCAic2V0dXAucHkiKQorICAgICAgICAgICAgZGlzdC5zY3JpcHRfYXJncyA9IFsiYnVpbGQiXQorICAgICAgICAgICAgZGlzdC5wYXJzZV9jb21tYW5kX2xpbmUoKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGlzdC5ydW5fY29tbWFuZHMoKQorICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0ZpbGVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImZhaWxlZCBwYWNrYWdlX2RhdGEgdGVzdCB3aGVuIHBhY2thZ2VfZGlyIGlzICcnIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICMgUmVzdG9yZSBzdGF0ZS4KKyAgICAgICAgICAgIG9zLmNoZGlyKGN3ZCkKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBvbGRfc3Rkb3V0CisKKyAgICBkZWYgdGVzdF9kb250X3dyaXRlX2J5dGVjb2RlKHNlbGYpOgorICAgICAgICAjIG1ha2VzIHN1cmUgYnl0ZV9jb21waWxlIGlzIG5vdCB1c2VkCisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gYnVpbGRfcHkoZGlzdCkKKyAgICAgICAgY21kLmNvbXBpbGUgPSAxCisgICAgICAgIGNtZC5vcHRpbWl6ZSA9IDEKKworICAgICAgICBvbGRfZG9udF93cml0ZV9ieXRlY29kZSA9IHN5cy5kb250X3dyaXRlX2J5dGVjb2RlCisgICAgICAgIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbWQuYnl0ZV9jb21waWxlKFtdKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgPSBvbGRfZG9udF93cml0ZV9ieXRlY29kZQorCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2J5dGUtY29tcGlsaW5nIGlzIGRpc2FibGVkJywgc2VsZi5sb2dzWzBdWzFdKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQnVpbGRQeVRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOWM1YjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOWM1YjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3NjcmlwdHMucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3NjcmlwdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhOTNjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weQpAQCAtMCwwICsxLDExMiBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3NjcmlwdHMuIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfc2NyaXB0cyBpbXBvcnQgYnVpbGRfc2NyaXB0cworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCitpbXBvcnQgc3lzY29uZmlnCisKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworCitjbGFzcyBCdWlsZFNjcmlwdHNUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3NldHRpbmdzKHNlbGYpOgorICAgICAgICBjbWQgPSBzZWxmLmdldF9idWlsZF9zY3JpcHRzX2NtZCgiL2Zvby9iYXIiLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjbWQuZm9yY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWQuYnVpbGRfZGlyIGlzIE5vbmUpCisKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWQuZm9yY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmJ1aWxkX2RpciwgIi9mb28vYmFyIikKKworICAgIGRlZiB0ZXN0X2J1aWxkKHNlbGYpOgorICAgICAgICBzb3VyY2UgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICB0YXJnZXQgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBleHBlY3RlZCA9IHNlbGYud3JpdGVfc2FtcGxlX3NjcmlwdHMoc291cmNlKQorCisgICAgICAgIGNtZCA9IHNlbGYuZ2V0X2J1aWxkX3NjcmlwdHNfY21kKHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29zLnBhdGguam9pbihzb3VyY2UsIGZuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZuIGluIGV4cGVjdGVkXSkKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICBidWlsdCA9IG9zLmxpc3RkaXIodGFyZ2V0KQorICAgICAgICBmb3IgbmFtZSBpbiBleHBlY3RlZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYW1lIGluIGJ1aWx0KQorCisgICAgZGVmIGdldF9idWlsZF9zY3JpcHRzX2NtZChzZWxmLCB0YXJnZXQsIHNjcmlwdHMpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQorICAgICAgICBkaXN0LnNjcmlwdHMgPSBzY3JpcHRzCisgICAgICAgIGRpc3QuY29tbWFuZF9vYmpbImJ1aWxkIl0gPSBzdXBwb3J0LkR1bW15Q29tbWFuZCgKKyAgICAgICAgICAgIGJ1aWxkX3NjcmlwdHM9dGFyZ2V0LAorICAgICAgICAgICAgZm9yY2U9MSwKKyAgICAgICAgICAgIGV4ZWN1dGFibGU9c3lzLmV4ZWN1dGFibGUKKyAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGJ1aWxkX3NjcmlwdHMoZGlzdCkKKworICAgIGRlZiB3cml0ZV9zYW1wbGVfc2NyaXB0cyhzZWxmLCBkaXIpOgorICAgICAgICBleHBlY3RlZCA9IFtdCisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCgic2NyaXB0MS5weSIpCisgICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KGRpciwgInNjcmlwdDEucHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoIiMhIC91c3IvYmluL2VudiBweXRob24yLjNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIjIGJvZ3VzIHNjcmlwdCB3LyBQeXRob24gc2gtYmFuZ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhc3NcbiIpKQorICAgICAgICBleHBlY3RlZC5hcHBlbmQoInNjcmlwdDIucHkiKQorICAgICAgICBzZWxmLndyaXRlX3NjcmlwdChkaXIsICJzY3JpcHQyLnB5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCIjIS91c3IvYmluL3B5dGhvblxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMgYm9ndXMgc2NyaXB0IHcvIFB5dGhvbiBzaC1iYW5nXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFzc1xuIikpCisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCgic2hlbGwuc2giKQorICAgICAgICBzZWxmLndyaXRlX3NjcmlwdChkaXIsICJzaGVsbC5zaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICgiIyEvYmluL3NoXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyBib2d1cyBzaGVsbCBzY3JpcHQgdy8gc2gtYmFuZ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4aXQgMFxuIikpCisgICAgICAgIHJldHVybiBleHBlY3RlZAorCisgICAgZGVmIHdyaXRlX3NjcmlwdChzZWxmLCBkaXIsIG5hbWUsIHRleHQpOgorICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oZGlyLCBuYW1lKSwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKHRleHQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3ZlcnNpb25faW50KHNlbGYpOgorICAgICAgICBzb3VyY2UgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICB0YXJnZXQgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBleHBlY3RlZCA9IHNlbGYud3JpdGVfc2FtcGxlX3NjcmlwdHMoc291cmNlKQorCisKKyAgICAgICAgY21kID0gc2VsZi5nZXRfYnVpbGRfc2NyaXB0c19jbWQodGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3MucGF0aC5qb2luKHNvdXJjZSwgZm4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gZXhwZWN0ZWRdKQorICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisKKyAgICAgICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNDUyNAorICAgICAgICAjCisgICAgICAgICMgT24gbGludXgtZysrLTMyIHdpdGggY29tbWFuZCBsaW5lIGAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1pcHY2CisgICAgICAgICMgLS13aXRoLXN1ZmZpeD0zYCwgcHl0aG9uIGlzIGNvbXBpbGVkIG9rYXkgYnV0IHRoZSBidWlsZCBzY3JpcHRzCisgICAgICAgICMgZmFpbGVkIHdoZW4gd3JpdGluZyB0aGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZQorICAgICAgICBvbGQgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXJzKCkuZ2V0KCdWRVJTSU9OJykKKyAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSU1snVkVSU0lPTiddID0gNAorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbWQucnVuKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG9sZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTWydWRVJTSU9OJ10gPSBvbGQKKworICAgICAgICBidWlsdCA9IG9zLmxpc3RkaXIodGFyZ2V0KQorICAgICAgICBmb3IgbmFtZSBpbiBleHBlY3RlZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYW1lIGluIGJ1aWx0KQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQnVpbGRTY3JpcHRzVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3NjcmlwdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MTgwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3NjcmlwdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3NjcmlwdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MTgwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3NjcmlwdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2NvbXBpbGVyLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jY29tcGlsZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlNDc3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2NvbXBpbGVyLnB5CkBAIC0wLDAgKzEsODIgQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY2NvbXBpbGVyLiIiIgoraW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGNhcHR1cmVkX3N0ZG91dAorCitmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IChnZW5fbGliX29wdGlvbnMsIENDb21waWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9kZWZhdWx0X2NvbXBpbGVyKQorZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBkZWJ1ZworZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKKworY2xhc3MgRmFrZUNvbXBpbGVyKG9iamVjdCk6CisgICAgZGVmIGxpYnJhcnlfZGlyX29wdGlvbihzZWxmLCBkaXIpOgorICAgICAgICByZXR1cm4gIi1MIiArIGRpcgorCisgICAgZGVmIHJ1bnRpbWVfbGlicmFyeV9kaXJfb3B0aW9uKHNlbGYsIGRpcik6CisgICAgICAgIHJldHVybiBbIi1jb29sIiwgIi1SIiArIGRpcl0KKworICAgIGRlZiBmaW5kX2xpYnJhcnlfZmlsZShzZWxmLCBkaXJzLCBsaWIsIGRlYnVnPTApOgorICAgICAgICByZXR1cm4gJ2ZvdW5kJworCisgICAgZGVmIGxpYnJhcnlfb3B0aW9uKHNlbGYsIGxpYik6CisgICAgICAgIHJldHVybiAiLWwiICsgbGliCisKK2NsYXNzIENDb21waWxlclRlc3RDYXNlKHN1cHBvcnQuRW52aXJvbkd1YXJkLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9nZW5fbGliX29wdGlvbnMoc2VsZik6CisgICAgICAgIGNvbXBpbGVyID0gRmFrZUNvbXBpbGVyKCkKKyAgICAgICAgbGliZGlycyA9IFsnbGliMScsICdsaWIyJ10KKyAgICAgICAgcnVubGliZGlycyA9IFsncnVubGliMSddCisgICAgICAgIGxpYnMgPSBbb3MucGF0aC5qb2luKCdkaXInLCAnbmFtZScpLCAnbmFtZTInXQorCisgICAgICAgIG9wdHMgPSBnZW5fbGliX29wdGlvbnMoY29tcGlsZXIsIGxpYmRpcnMsIHJ1bmxpYmRpcnMsIGxpYnMpCisgICAgICAgIHdhbnRlZCA9IFsnLUxsaWIxJywgJy1MbGliMicsICctY29vbCcsICctUnJ1bmxpYjEnLCAnZm91bmQnLAorICAgICAgICAgICAgICAgICAgJy1sbmFtZTInXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIHdhbnRlZCkKKworICAgIGRlZiB0ZXN0X2RlYnVnX3ByaW50KHNlbGYpOgorCisgICAgICAgIGNsYXNzIE15Q0NvbXBpbGVyKENDb21waWxlcik6CisgICAgICAgICAgICBleGVjdXRhYmxlcyA9IHt9CisKKyAgICAgICAgY29tcGlsZXIgPSBNeUNDb21waWxlcigpCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgorICAgICAgICAgICAgY29tcGlsZXIuZGVidWdfcHJpbnQoJ3h4eCcpCisgICAgICAgIHN0ZG91dC5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LnJlYWQoKSwgJycpCisKKyAgICAgICAgZGVidWcuREVCVUcgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgorICAgICAgICAgICAgICAgIGNvbXBpbGVyLmRlYnVnX3ByaW50KCd4eHgnKQorICAgICAgICAgICAgc3Rkb3V0LnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LnJlYWQoKSwgJ3h4eFxuJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlYnVnLkRFQlVHID0gRmFsc2UKKworICAgIGRlZiB0ZXN0X2N1c3RvbWl6ZV9jb21waWxlcihzZWxmKToKKworICAgICAgICAjIG5vdCB0ZXN0aW5nIGlmIGRlZmF1bHQgY29tcGlsZXIgaXMgbm90IHVuaXgKKyAgICAgICAgaWYgZ2V0X2RlZmF1bHRfY29tcGlsZXIoKSAhPSAndW5peCc6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBvcy5lbnZpcm9uWydBUiddID0gJ215X2FyJworICAgICAgICBvcy5lbnZpcm9uWydBUkZMQUdTJ10gPSAnLWFyZmxhZ3MnCisKKyAgICAgICAgIyBtYWtlIHN1cmUgQVIgZ2V0cyBjYXVnaHQKKyAgICAgICAgY2xhc3MgY29tcGlsZXI6CisgICAgICAgICAgICBjb21waWxlcl90eXBlID0gJ3VuaXgnCisKKyAgICAgICAgICAgIGRlZiBzZXRfZXhlY3V0YWJsZXMoc2VsZiwgKiprdyk6CisgICAgICAgICAgICAgICAgc2VsZi5leGVzID0ga3cKKworICAgICAgICBjb21wID0gY29tcGlsZXIoKQorICAgICAgICBjdXN0b21pemVfY29tcGlsZXIoY29tcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wLmV4ZXNbJ2FyY2hpdmVyJ10sICdteV9hciAtYXJmbGFncycpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShDQ29tcGlsZXJUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJ0ZXN0X3N1aXRlIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2NvbXBpbGVyLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2NvbXBpbGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWMyNGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jY29tcGlsZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2NvbXBpbGVyLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2NvbXBpbGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWMyNGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jY29tcGlsZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2hlY2sucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NoZWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzM0MmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NoZWNrLnB5CkBAIC0wLDAgKzEsMTA5IEBACisjIC0qLSBlbmNvZGluZzogdXRmOCAtKi0KKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5jaGVjay4iIiIKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuY2hlY2sgaW1wb3J0IGNoZWNrLCBIQVNfRE9DVVRJTFMKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKKworY2xhc3MgQ2hlY2tUZXN0Q2FzZShzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9ydW4oc2VsZiwgbWV0YWRhdGE9Tm9uZSwgKipvcHRpb25zKToKKyAgICAgICAgaWYgbWV0YWRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgIG1ldGFkYXRhID0ge30KKyAgICAgICAgcGtnX2luZm8sIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCoqbWV0YWRhdGEpCisgICAgICAgIGNtZCA9IGNoZWNrKGRpc3QpCisgICAgICAgIGNtZC5pbml0aWFsaXplX29wdGlvbnMoKQorICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gb3B0aW9ucy5pdGVtcygpOgorICAgICAgICAgICAgc2V0YXR0cihjbWQsIG5hbWUsIHZhbHVlKQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorICAgICAgICByZXR1cm4gY21kCisKKyAgICBkZWYgdGVzdF9jaGVja19tZXRhZGF0YShzZWxmKToKKyAgICAgICAgIyBsZXQncyBydW4gdGhlIGNvbW1hbmQgd2l0aCBubyBtZXRhZGF0YSBhdCBhbGwKKyAgICAgICAgIyBieSBkZWZhdWx0LCBjaGVjayBpcyBjaGVja2luZyB0aGUgbWV0YWRhdGEKKyAgICAgICAgIyBzaG91bGQgaGF2ZSBzb21lIHdhcm5pbmdzCisgICAgICAgIGNtZCA9IHNlbGYuX3J1bigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLl93YXJuaW5ncywgMikKKworICAgICAgICAjIG5vdyBsZXQncyBhZGQgdGhlIHJlcXVpcmVkIGZpZWxkcworICAgICAgICAjIGFuZCBydW4gaXQgYWdhaW4sIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQKKyAgICAgICAgIyBhbnkgd2FybmluZyBhbnltb3JlCisgICAgICAgIG1ldGFkYXRhID0geyd1cmwnOiAneHh4JywgJ2F1dGhvcic6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAnYXV0aG9yX2VtYWlsJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3h4eCcsICd2ZXJzaW9uJzogJ3h4eCd9CisgICAgICAgIGNtZCA9IHNlbGYuX3J1bihtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuX3dhcm5pbmdzLCAwKQorCisgICAgICAgICMgbm93IHdpdGggdGhlIHN0cmljdCBtb2RlLCB3ZSBzaG91bGQKKyAgICAgICAgIyBnZXQgYW4gZXJyb3IgaWYgdGhlcmUgYXJlIG1pc3NpbmcgbWV0YWRhdGEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgc2VsZi5fcnVuLCB7fSwgKip7J3N0cmljdCc6IDF9KQorCisgICAgICAgICMgYW5kIG9mIGNvdXJzZSwgbm8gZXJyb3Igd2hlbiBhbGwgbWV0YWRhdGEgYXJlIHByZXNlbnQKKyAgICAgICAgY21kID0gc2VsZi5fcnVuKG1ldGFkYXRhLCBzdHJpY3Q9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuX3dhcm5pbmdzLCAwKQorCisgICAgICAgICMgbm93IGEgdGVzdCB3aXRoIFVuaWNvZGUgZW50cmllcworICAgICAgICBtZXRhZGF0YSA9IHsndXJsJzogdSd4eHgnLCAnYXV0aG9yJzogdSdcdTAwYzlyaWMnLAorICAgICAgICAgICAgICAgICAgICAnYXV0aG9yX2VtYWlsJzogdSd4eHgnLCB1J25hbWUnOiAneHh4JywKKyAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nOiB1J3h4eCcsCisgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbic6IHUnU29tZXRoaW5nIGFib3V0IGVzc3pldCBcdTAwZGYnLAorICAgICAgICAgICAgICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbic6IHUnTW9yZSB0aGluZ3MgYWJvdXQgZXNzemV0IFx1MDBkZid9CisgICAgICAgIGNtZCA9IHNlbGYuX3J1bihtZXRhZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuX3dhcm5pbmdzLCAwKQorCisgICAgZGVmIHRlc3RfY2hlY2tfZG9jdW1lbnQoc2VsZik6CisgICAgICAgIGlmIG5vdCBIQVNfRE9DVVRJTFM6ICMgd29uJ3QgdGVzdCB3aXRob3V0IGRvY3V0aWxzCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcGtnX2luZm8sIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gY2hlY2soZGlzdCkKKworICAgICAgICAjIGxldCdzIHNlZSBpZiBpdCBkZXRlY3RzIGJyb2tlbiByZXN0CisgICAgICAgIGJyb2tlbl9yZXN0ID0gJ3RpdGxlXG49PT1cblxudGVzdCcKKyAgICAgICAgbXNncyA9IGNtZC5fY2hlY2tfcnN0X2RhdGEoYnJva2VuX3Jlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZ3MpLCAxKQorCisgICAgICAgICMgYW5kIG5vbi1icm9rZW4gcmVzdAorICAgICAgICByZXN0ID0gJ3RpdGxlXG49PT09PVxuXG50ZXN0JworICAgICAgICBtc2dzID0gY21kLl9jaGVja19yc3RfZGF0YShyZXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2dzKSwgMCkKKworICAgIGRlZiB0ZXN0X2NoZWNrX3Jlc3RydWN0dXJlZHRleHQoc2VsZik6CisgICAgICAgIGlmIG5vdCBIQVNfRE9DVVRJTFM6ICMgd29uJ3QgdGVzdCB3aXRob3V0IGRvY3V0aWxzCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBsZXQncyBzZWUgaWYgaXQgZGV0ZWN0cyBicm9rZW4gcmVzdCBpbiBsb25nX2Rlc2NyaXB0aW9uCisgICAgICAgIGJyb2tlbl9yZXN0ID0gJ3RpdGxlXG49PT1cblxudGVzdCcKKyAgICAgICAgcGtnX2luZm8sIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KGxvbmdfZGVzY3JpcHRpb249YnJva2VuX3Jlc3QpCisgICAgICAgIGNtZCA9IGNoZWNrKGRpc3QpCisgICAgICAgIGNtZC5jaGVja19yZXN0cnVjdHVyZWR0ZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuX3dhcm5pbmdzLCAxKQorCisgICAgICAgICMgbGV0J3Mgc2VlIGlmIHdlIGhhdmUgYW4gZXJyb3Igd2l0aCBzdHJpY3Q9MQorICAgICAgICBtZXRhZGF0YSA9IHsndXJsJzogJ3h4eCcsICdhdXRob3InOiAneHh4JywKKyAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcl9lbWFpbCc6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICd4eHgnLCAndmVyc2lvbic6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbic6IGJyb2tlbl9yZXN0fQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBzZWxmLl9ydW4sIG1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAqKnsnc3RyaWN0JzogMSwgJ3Jlc3RydWN0dXJlZHRleHQnOiAxfSkKKworICAgICAgICAjIGFuZCBub24tYnJva2VuIHJlc3QsIGluY2x1ZGluZyBhIG5vbi1BU0NJSSBjaGFyYWN0ZXIgdG8gdGVzdCAjMTIxMTQKKyAgICAgICAgbWV0YWRhdGFbJ2xvbmdfZGVzY3JpcHRpb24nXSA9IHUndGl0bGVcbj09PT09XG5cbnRlc3QgXHUwMGRmJworICAgICAgICBjbWQgPSBzZWxmLl9ydW4obWV0YWRhdGEsIHN0cmljdD0xLCByZXN0cnVjdHVyZWR0ZXh0PTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLl93YXJuaW5ncywgMCkKKworICAgIGRlZiB0ZXN0X2NoZWNrX2FsbChzZWxmKToKKworICAgICAgICBtZXRhZGF0YSA9IHsndXJsJzogJ3h4eCcsICdhdXRob3InOiAneHh4J30KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgc2VsZi5fcnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICB7fSwgKip7J3N0cmljdCc6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzdHJ1Y3R1cmVkdGV4dCc6IDF9KQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQ2hlY2tUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jaGVjay5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NoZWNrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTNkNDZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jaGVjay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jaGVjay5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NoZWNrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTNkNDZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jaGVjay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5ODhmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkKQEAgLTAsMCArMSw1MSBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmNsZWFuLiIiIgoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBnZXRwYXNzCisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuY2xlYW4gaW1wb3J0IGNsZWFuCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2NsYXNzIGNsZWFuVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9ydW4oc2VsZik6CisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gY2xlYW4oZGlzdCkKKworICAgICAgICAjIGxldCdzIGFkZCBzb21lIGVsZW1lbnRzIGNsZWFuIHNob3VsZCByZW1vdmUKKyAgICAgICAgZGlycyA9IFsoZCwgb3MucGF0aC5qb2luKHBrZ19kaXIsIGQpKQorICAgICAgICAgICAgICAgIGZvciBkIGluICgnYnVpbGRfdGVtcCcsICdidWlsZF9saWInLCAnYmRpc3RfYmFzZScsCisgICAgICAgICAgICAgICAgJ2J1aWxkX3NjcmlwdHMnLCAnYnVpbGRfYmFzZScpXQorCisgICAgICAgIGZvciBuYW1lLCBwYXRoIGluIGRpcnM6CisgICAgICAgICAgICBvcy5ta2RpcihwYXRoKQorICAgICAgICAgICAgc2V0YXR0cihjbWQsIG5hbWUsIHBhdGgpCisgICAgICAgICAgICBpZiBuYW1lID09ICdidWlsZF9iYXNlJzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm9yIGYgaW4gKCdvbmUnLCAndHdvJywgJ3RocmVlJyk6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKG9zLnBhdGguam9pbihwYXRoLCBmKSkKKworICAgICAgICAjIGxldCdzIHJ1biB0aGUgY29tbWFuZAorICAgICAgICBjbWQuYWxsID0gMQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgICMgbWFrZSBzdXJlIHRoZSBmaWxlcyB3aGVyZSByZW1vdmVkCisgICAgICAgIGZvciBuYW1lLCBwYXRoIGluIGRpcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICclcyB3YXMgbm90IHJlbW92ZWQnICUgcGF0aCkKKworICAgICAgICAjIGxldCdzIHJ1biB0aGUgY29tbWFuZCBhZ2FpbiAoc2hvdWxkIHNwaXQgd2FybmluZ3MgYnV0IHN1Y2NlZWQpCisgICAgICAgIGNtZC5hbGwgPSAxCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShjbGVhblRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYTNjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYTNjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NtZC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNzQwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NtZC5weQpAQCAtMCwwICsxLDEyNyBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jbWQuIiIiCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0LCBydW5fdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuY21kIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24KK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBkZWJ1ZworCitjbGFzcyBNeUNtZChDb21tYW5kKToKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIENvbW1hbmRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQorICAgICAgICBzZWxmLmNtZCA9IE15Q21kKGRpc3QpCisKKyAgICBkZWYgdGVzdF9lbnN1cmVfc3RyaW5nX2xpc3Qoc2VsZik6CisKKyAgICAgICAgY21kID0gc2VsZi5jbWQKKyAgICAgICAgY21kLm5vdF9zdHJpbmdfbGlzdCA9IFsnb25lJywgMiwgJ3RocmVlJ10KKyAgICAgICAgY21kLnllc19zdHJpbmdfbGlzdCA9IFsnb25lJywgJ3R3bycsICd0aHJlZSddCisgICAgICAgIGNtZC5ub3Rfc3RyaW5nX2xpc3QyID0gb2JqZWN0KCkKKyAgICAgICAgY21kLnllc19zdHJpbmdfbGlzdDIgPSAnb2snCisgICAgICAgIGNtZC5lbnN1cmVfc3RyaW5nX2xpc3QoJ3llc19zdHJpbmdfbGlzdCcpCisgICAgICAgIGNtZC5lbnN1cmVfc3RyaW5nX2xpc3QoJ3llc19zdHJpbmdfbGlzdDInKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQuZW5zdXJlX3N0cmluZ19saXN0LCAnbm90X3N0cmluZ19saXN0JykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNPcHRpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLmVuc3VyZV9zdHJpbmdfbGlzdCwgJ25vdF9zdHJpbmdfbGlzdDInKQorCisgICAgZGVmIHRlc3RfbWFrZV9maWxlKHNlbGYpOgorCisgICAgICAgIGNtZCA9IHNlbGYuY21kCisKKyAgICAgICAgIyBtYWtpbmcgc3VyZSBpdCByYWlzZXMgd2hlbiBpbmZpbGVzIGlzIG5vdCBhIHN0cmluZyBvciBhIGxpc3QvdHVwbGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbWQubWFrZV9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZpbGVzPTEsIG91dGZpbGU9JycsIGZ1bmM9J2Z1bmMnLCBhcmdzPSgpKQorCisgICAgICAgICMgbWFraW5nIHN1cmUgZXhlY3V0ZSBnZXRzIGNhbGxlZCBwcm9wZXJseQorICAgICAgICBkZWYgX2V4ZWN1dGUoZnVuYywgYXJncywgZXhlY19tc2csIGxldmVsKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhlY19tc2csICdnZW5lcmF0aW5nIG91dCBmcm9tIGluJykKKyAgICAgICAgY21kLmZvcmNlID0gVHJ1ZQorICAgICAgICBjbWQuZXhlY3V0ZSA9IF9leGVjdXRlCisgICAgICAgIGNtZC5tYWtlX2ZpbGUoaW5maWxlcz0naW4nLCBvdXRmaWxlPSdvdXQnLCBmdW5jPSdmdW5jJywgYXJncz0oKSkKKworICAgIGRlZiB0ZXN0X2R1bXBfb3B0aW9ucyhzZWxmKToKKworICAgICAgICBtc2dzID0gW10KKyAgICAgICAgZGVmIF9hbm5vdW5jZShtc2csIGxldmVsKToKKyAgICAgICAgICAgIG1zZ3MuYXBwZW5kKG1zZykKKyAgICAgICAgY21kID0gc2VsZi5jbWQKKyAgICAgICAgY21kLmFubm91bmNlID0gX2Fubm91bmNlCisgICAgICAgIGNtZC5vcHRpb24xID0gMQorICAgICAgICBjbWQub3B0aW9uMiA9IDEKKyAgICAgICAgY21kLnVzZXJfb3B0aW9ucyA9IFsoJ29wdGlvbjEnLCAnJywgJycpLCAoJ29wdGlvbjInLCAnJywgJycpXQorICAgICAgICBjbWQuZHVtcF9vcHRpb25zKCkKKworICAgICAgICB3YW50ZWQgPSBbImNvbW1hbmQgb3B0aW9ucyBmb3IgJ015Q21kJzoiLCAnICBvcHRpb24xID0gMScsCisgICAgICAgICAgICAgICAgICAnICBvcHRpb24yID0gMSddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNncywgd2FudGVkKQorCisgICAgZGVmIHRlc3RfZW5zdXJlX3N0cmluZyhzZWxmKToKKyAgICAgICAgY21kID0gc2VsZi5jbWQKKyAgICAgICAgY21kLm9wdGlvbjEgPSAnb2snCisgICAgICAgIGNtZC5lbnN1cmVfc3RyaW5nKCdvcHRpb24xJykKKworICAgICAgICBjbWQub3B0aW9uMiA9IE5vbmUKKyAgICAgICAgY21kLmVuc3VyZV9zdHJpbmcoJ29wdGlvbjInLCAneHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoY21kLCAnb3B0aW9uMicpKQorCisgICAgICAgIGNtZC5vcHRpb24zID0gMQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNPcHRpb25FcnJvciwgY21kLmVuc3VyZV9zdHJpbmcsICdvcHRpb24zJykKKworICAgIGRlZiB0ZXN0X2Vuc3VyZV9zdHJpbmdfbGlzdChzZWxmKToKKyAgICAgICAgY21kID0gc2VsZi5jbWQKKyAgICAgICAgY21kLm9wdGlvbjEgPSAnb2ssZG9rJworICAgICAgICBjbWQuZW5zdXJlX3N0cmluZ19saXN0KCdvcHRpb24xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQub3B0aW9uMSwgWydvaycsICdkb2snXSkKKworICAgICAgICBjbWQub3B0aW9uMiA9IFsneHh4JywgJ3d3dyddCisgICAgICAgIGNtZC5lbnN1cmVfc3RyaW5nX2xpc3QoJ29wdGlvbjInKQorCisgICAgICAgIGNtZC5vcHRpb24zID0gWydvaycsIDJdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCBjbWQuZW5zdXJlX3N0cmluZ19saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAnb3B0aW9uMycpCisKKyAgICBkZWYgdGVzdF9lbnN1cmVfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGNtZCA9IHNlbGYuY21kCisgICAgICAgIGNtZC5vcHRpb24xID0gX19maWxlX18KKyAgICAgICAgY21kLmVuc3VyZV9maWxlbmFtZSgnb3B0aW9uMScpCisgICAgICAgIGNtZC5vcHRpb24yID0gJ3h4eCcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIGNtZC5lbnN1cmVfZmlsZW5hbWUsICdvcHRpb24yJykKKworICAgIGRlZiB0ZXN0X2Vuc3VyZV9kaXJuYW1lKHNlbGYpOgorICAgICAgICBjbWQgPSBzZWxmLmNtZAorICAgICAgICBjbWQub3B0aW9uMSA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3Igb3MuY3VyZGlyCisgICAgICAgIGNtZC5lbnN1cmVfZGlybmFtZSgnb3B0aW9uMScpCisgICAgICAgIGNtZC5vcHRpb24yID0gJ3h4eCcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIGNtZC5lbnN1cmVfZGlybmFtZSwgJ29wdGlvbjInKQorCisgICAgZGVmIHRlc3RfZGVidWdfcHJpbnQoc2VsZik6CisgICAgICAgIGNtZCA9IHNlbGYuY21kCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgorICAgICAgICAgICAgY21kLmRlYnVnX3ByaW50KCd4eHgnKQorICAgICAgICBzdGRvdXQuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dC5yZWFkKCksICcnKQorCisgICAgICAgIGRlYnVnLkRFQlVHID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKKyAgICAgICAgICAgICAgICBjbWQuZGVidWdfcHJpbnQoJ3h4eCcpCisgICAgICAgICAgICBzdGRvdXQuc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQucmVhZCgpLCAneHh4XG4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVidWcuREVCVUcgPSBGYWxzZQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQ29tbWFuZFRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NtZC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NtZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjNjI2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NtZC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NtZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjNjI2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZDA5NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weQpAQCAtMCwwICsxLDEyMyBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5weXBpcmMucHlwaXJjLiIiIgoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHNodXRpbAorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBQeVBJUkNDb21tYW5kCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KK2Zyb20gZGlzdHV0aWxzLmxvZyBpbXBvcnQgc2V0X3RocmVzaG9sZAorZnJvbSBkaXN0dXRpbHMubG9nIGltcG9ydCBXQVJOCisKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworUFlQSVJDID0gIiIiXAorW2Rpc3R1dGlsc10KKworaW5kZXgtc2VydmVycyA9CisgICAgc2VydmVyMQorICAgIHNlcnZlcjIKKworW3NlcnZlcjFdCit1c2VybmFtZTptZQorcGFzc3dvcmQ6c2VjcmV0CisKK1tzZXJ2ZXIyXQordXNlcm5hbWU6bWVhZ2FpbgorcGFzc3dvcmQ6IHNlY3JldAorcmVhbG06YWNtZQorcmVwb3NpdG9yeTpodHRwOi8vYW5vdGhlci5weXBpLworIiIiCisKK1BZUElSQ19PTEQgPSAiIiJcCitbc2VydmVyLWxvZ2luXQordXNlcm5hbWU6dGFyZWsKK3Bhc3N3b3JkOnNlY3JldAorIiIiCisKK1dBTlRFRCA9ICIiIlwKK1tkaXN0dXRpbHNdCitpbmRleC1zZXJ2ZXJzID0KKyAgICBweXBpCisKK1tweXBpXQordXNlcm5hbWU6dGFyZWsKK3Bhc3N3b3JkOnh4eAorIiIiCisKKworY2xhc3MgUHlQSVJDQ29tbWFuZFRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5FbnZpcm9uR3VhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJQYXRjaGVzIHRoZSBlbnZpcm9ubWVudC4iIiIKKyAgICAgICAgc3VwZXIoUHlQSVJDQ29tbWFuZFRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYudG1wX2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIG9zLmVudmlyb25bJ0hPTUUnXSA9IHNlbGYudG1wX2RpcgorICAgICAgICBzZWxmLnJjID0gb3MucGF0aC5qb2luKHNlbGYudG1wX2RpciwgJy5weXBpcmMnKQorICAgICAgICBzZWxmLmRpc3QgPSBEaXN0cmlidXRpb24oKQorCisgICAgICAgIGNsYXNzIGNvbW1hbmQoUHlQSVJDQ29tbWFuZCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdCk6CisgICAgICAgICAgICAgICAgUHlQSVJDQ29tbWFuZC5fX2luaXRfXyhzZWxmLCBkaXN0KQorICAgICAgICAgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmaW5hbGl6ZV9vcHRpb25zID0gaW5pdGlhbGl6ZV9vcHRpb25zCisKKyAgICAgICAgc2VsZi5fY21kID0gY29tbWFuZAorICAgICAgICBzZWxmLm9sZF90aHJlc2hvbGQgPSBzZXRfdGhyZXNob2xkKFdBUk4pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICIiIlJlbW92ZXMgdGhlIHBhdGNoLiIiIgorICAgICAgICBzZXRfdGhyZXNob2xkKHNlbGYub2xkX3RocmVzaG9sZCkKKyAgICAgICAgc3VwZXIoUHlQSVJDQ29tbWFuZFRlc3RDYXNlLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgdGVzdF9zZXJ2ZXJfcmVnaXN0cmF0aW9uKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdCBtYWtlcyBzdXJlIFB5UElSQ0NvbW1hbmQga25vd3MgaG93IHRvOgorICAgICAgICAjIDEuIGhhbmRsZSBzZXZlcmFsIHNlY3Rpb25zIGluIC5weXBpcmMKKyAgICAgICAgIyAyLiBoYW5kbGUgdGhlIG9sZCBmb3JtYXQKKworICAgICAgICAjIG5ldyBmb3JtYXQKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKHNlbGYucmMsIFBZUElSQykKKyAgICAgICAgY21kID0gc2VsZi5fY21kKHNlbGYuZGlzdCkKKyAgICAgICAgY29uZmlnID0gY21kLl9yZWFkX3B5cGlyYygpCisKKyAgICAgICAgY29uZmlnID0gY29uZmlnLml0ZW1zKCkKKyAgICAgICAgY29uZmlnLnNvcnQoKQorICAgICAgICB3YWl0ZWQgPSBbKCdwYXNzd29yZCcsICdzZWNyZXQnKSwgKCdyZWFsbScsICdweXBpJyksCisgICAgICAgICAgICAgICAgICAoJ3JlcG9zaXRvcnknLCAnaHR0cDovL3B5cGkucHl0aG9uLm9yZy9weXBpJyksCisgICAgICAgICAgICAgICAgICAoJ3NlcnZlcicsICdzZXJ2ZXIxJyksICgndXNlcm5hbWUnLCAnbWUnKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25maWcsIHdhaXRlZCkKKworICAgICAgICAjIG9sZCBmb3JtYXQKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKHNlbGYucmMsIFBZUElSQ19PTEQpCisgICAgICAgIGNvbmZpZyA9IGNtZC5fcmVhZF9weXBpcmMoKQorICAgICAgICBjb25maWcgPSBjb25maWcuaXRlbXMoKQorICAgICAgICBjb25maWcuc29ydCgpCisgICAgICAgIHdhaXRlZCA9IFsoJ3Bhc3N3b3JkJywgJ3NlY3JldCcpLCAoJ3JlYWxtJywgJ3B5cGknKSwKKyAgICAgICAgICAgICAgICAgICgncmVwb3NpdG9yeScsICdodHRwOi8vcHlwaS5weXRob24ub3JnL3B5cGknKSwKKyAgICAgICAgICAgICAgICAgICgnc2VydmVyJywgJ3NlcnZlci1sb2dpbicpLCAoJ3VzZXJuYW1lJywgJ3RhcmVrJyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29uZmlnLCB3YWl0ZWQpCisKKyAgICBkZWYgdGVzdF9zZXJ2ZXJfZW1wdHlfcmVnaXN0cmF0aW9uKHNlbGYpOgorICAgICAgICBjbWQgPSBzZWxmLl9jbWQoc2VsZi5kaXN0KQorICAgICAgICByYyA9IGNtZC5fZ2V0X3JjX2ZpbGUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHJjKSkKKyAgICAgICAgY21kLl9zdG9yZV9weXBpcmMoJ3RhcmVrJywgJ3h4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhyYykpCisgICAgICAgIGYgPSBvcGVuKHJjKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb250ZW50ID0gZi5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udGVudCwgV0FOVEVEKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShQeVBJUkNDb21tYW5kVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODY1NWM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODY1NWM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTZjOGVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWdfY21kLnB5CkBAIC0wLDAgKzEsOTEgQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5jb25maWcuIiIiCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuY29uZmlnIGltcG9ydCBkdW1wX2ZpbGUsIGNvbmZpZworZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworY2xhc3MgQ29uZmlnVGVzdENhc2Uoc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9pbmZvKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICBmb3IgbGluZSBpbiBtc2cuc3BsaXRsaW5lcygpOgorICAgICAgICAgICAgc2VsZi5fbG9ncy5hcHBlbmQobGluZSkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoQ29uZmlnVGVzdENhc2UsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5fbG9ncyA9IFtdCisgICAgICAgIHNlbGYub2xkX2xvZyA9IGxvZy5pbmZvCisgICAgICAgIGxvZy5pbmZvID0gc2VsZi5faW5mbworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBsb2cuaW5mbyA9IHNlbGYub2xkX2xvZworICAgICAgICBzdXBlcihDb25maWdUZXN0Q2FzZSwgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIHRlc3RfZHVtcF9maWxlKHNlbGYpOgorICAgICAgICB0aGlzX2ZpbGUgPSBvcy5wYXRoLnNwbGl0ZXh0KF9fZmlsZV9fKVswXSArICcucHknCisgICAgICAgIGYgPSBvcGVuKHRoaXNfZmlsZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbnVtbGluZXMgPSBsZW4oZi5yZWFkbGluZXMoKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGR1bXBfZmlsZSh0aGlzX2ZpbGUsICdJIGFtIHRoZSBoZWFkZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9sb2dzKSwgbnVtbGluZXMrMSkKKworICAgIGRlZiB0ZXN0X3NlYXJjaF9jcHAoc2VsZik6CisgICAgICAgICMgVE9ETzogbWluZ3cgaG9zdCA/CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gY29uZmlnKGRpc3QpCisKKyAgICAgICAgIyBzaW1wbGUgcGF0dGVybiBzZWFyY2hlcworICAgICAgICBtYXRjaCA9IGNtZC5zZWFyY2hfY3BwKHBhdHRlcm49J3h4eCcsIGJvZHk9Jy8qIHh4eCAqLycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0Y2gsIDApCisKKyAgICAgICAgbWF0Y2ggPSBjbWQuc2VhcmNoX2NwcChwYXR0ZXJuPSdfY29uZmlndGVzdCcsIGJvZHk9Jy8qIHh4eCAqLycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0Y2gsIDEpCisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICAjIGZpbmFsaXplX29wdGlvbnMgZG9lcyBhIGJpdCBvZiB0cmFuc2Zvcm1hdGlvbgorICAgICAgICAjIG9uIG9wdGlvbnMKKyAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBjbWQgPSBjb25maWcoZGlzdCkKKyAgICAgICAgY21kLmluY2x1ZGVfZGlycyA9ICdvbmUlc3R3bycgJSBvcy5wYXRoc2VwCisgICAgICAgIGNtZC5saWJyYXJpZXMgPSAnb25lJworICAgICAgICBjbWQubGlicmFyeV9kaXJzID0gJ3RocmVlJXNmb3VyJyAlIG9zLnBhdGhzZXAKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmluY2x1ZGVfZGlycywgWydvbmUnLCAndHdvJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmxpYnJhcmllcywgWydvbmUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQubGlicmFyeV9kaXJzLCBbJ3RocmVlJywgJ2ZvdXInXSkKKworICAgIGRlZiB0ZXN0X2NsZWFuKHNlbGYpOgorICAgICAgICAjIF9jbGVhbiByZW1vdmVzIGZpbGVzCisgICAgICAgIHRtcF9kaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBmMSA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAnb25lJykKKyAgICAgICAgZjIgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgJ3R3bycpCisKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKGYxLCAneHh4JykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKGYyLCAneHh4JykKKworICAgICAgICBmb3IgZiBpbiAoZjEsIGYyKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhmKSkKKworICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGNvbmZpZyhkaXN0KQorICAgICAgICBjbWQuX2NsZWFuKGYxLCBmMikKKworICAgICAgICBmb3IgZiBpbiAoZjEsIGYyKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHMoZikpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25maWdUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWdfY21kLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwNGM5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWdfY21kLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwNGM5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkOTc5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvcmUucHkKQEAgLTAsMCArMSwxMDggQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29yZS4iIiIKKworaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgZGlzdHV0aWxzLmNvcmUKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN5cworaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQsIHJ1bl91bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorCisjIHNldHVwIHNjcmlwdCB0aGF0IHVzZXMgX19maWxlX18KK3NldHVwX3VzaW5nX19fZmlsZV9fID0gIiIiXAorCitfX2ZpbGVfXworCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cAorc2V0dXAoKQorIiIiCisKK3NldHVwX3ByaW50c19jd2QgPSAiIiJcCisKK2ltcG9ydCBvcworcHJpbnQgb3MuZ2V0Y3dkKCkKKworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKK3NldHVwKCkKKyIiIgorCisKK2NsYXNzIENvcmVUZXN0Q2FzZShzdXBwb3J0LkVudmlyb25HdWFyZCwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihDb3JlVGVzdENhc2UsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5vbGRfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLmNsZWFudXBfdGVzdGZuKCkKKyAgICAgICAgc2VsZi5vbGRfYXJndiA9IHN5cy5hcmd2LCBzeXMuYXJndls6XQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5vbGRfc3Rkb3V0CisgICAgICAgIHNlbGYuY2xlYW51cF90ZXN0Zm4oKQorICAgICAgICBzeXMuYXJndiA9IHNlbGYub2xkX2FyZ3ZbMF0KKyAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzZWxmLm9sZF9hcmd2WzFdCisgICAgICAgIHN1cGVyKENvcmVUZXN0Q2FzZSwgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIGNsZWFudXBfdGVzdGZuKHNlbGYpOgorICAgICAgICBwYXRoID0gdGVzdC50ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUocGF0aCkKKworICAgIGRlZiB3cml0ZV9zZXR1cChzZWxmLCB0ZXh0LCBwYXRoPXRlc3QudGVzdF9zdXBwb3J0LlRFU1RGTik6CisgICAgICAgIGYgPSBvcGVuKHBhdGgsICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSh0ZXh0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHJldHVybiBwYXRoCisKKyAgICBkZWYgdGVzdF9ydW5fc2V0dXBfcHJvdmlkZXNfZmlsZShzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHNjcmlwdCBjYW4gdXNlIF9fZmlsZV9fOyBpZiB0aGF0J3MgbWlzc2luZywgdGhlIHRlc3QKKyAgICAgICAgIyBzZXR1cC5weSBzY3JpcHQgd2lsbCByYWlzZSBOYW1lRXJyb3IuCisgICAgICAgIGRpc3R1dGlscy5jb3JlLnJ1bl9zZXR1cCgKKyAgICAgICAgICAgIHNlbGYud3JpdGVfc2V0dXAoc2V0dXBfdXNpbmdfX19maWxlX18pKQorCisgICAgZGVmIHRlc3RfcnVuX3NldHVwX3VzZXNfY3VycmVudF9kaXIoc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0cyB0aGF0IHRoZSBzZXR1cCBzY3JpcHQgaXMgcnVuIHdpdGggdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisgICAgICAgICMgYXMgaXRzIG93biBjdXJyZW50IGRpcmVjdG9yeTsgdGhpcyB3YXMgdGVtcG9yYXJpbHkgYnJva2VuIGJ5IGEKKyAgICAgICAgIyBwcmV2aW91cyBwYXRjaCB3aGVuIFRFU1RGTiBkaWQgbm90IHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgICAgICAgIHN5cy5zdGRvdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisKKyAgICAgICAgIyBDcmVhdGUgYSBkaXJlY3RvcnkgYW5kIHdyaXRlIHRoZSBzZXR1cC5weSBmaWxlIHRoZXJlOgorICAgICAgICBvcy5ta2Rpcih0ZXN0LnRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNldHVwX3B5ID0gb3MucGF0aC5qb2luKHRlc3QudGVzdF9zdXBwb3J0LlRFU1RGTiwgInNldHVwLnB5IikKKyAgICAgICAgZGlzdHV0aWxzLmNvcmUucnVuX3NldHVwKAorICAgICAgICAgICAgc2VsZi53cml0ZV9zZXR1cChzZXR1cF9wcmludHNfY3dkLCBwYXRoPXNldHVwX3B5KSkKKworICAgICAgICBvdXRwdXQgPSBzeXMuc3Rkb3V0LmdldHZhbHVlKCkKKyAgICAgICAgaWYgb3V0cHV0LmVuZHN3aXRoKCJcbiIpOgorICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0WzotMV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjd2QsIG91dHB1dCkKKworICAgIGRlZiB0ZXN0X2RlYnVnX21vZGUoc2VsZik6CisgICAgICAgICMgdGhpcyBjb3ZlcnMgdGhlIGNvZGUgY2FsbGVkIHdoZW4gREVCVUcgaXMgc2V0CisgICAgICAgIHN5cy5hcmd2ID0gWydzZXR1cC5weScsICctLW5hbWUnXQorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKKyAgICAgICAgICAgIGRpc3R1dGlscy5jb3JlLnNldHVwKG5hbWU9J2JhcicpCisgICAgICAgIHN0ZG91dC5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LnJlYWQoKSwgJ2JhclxuJykKKworICAgICAgICBkaXN0dXRpbHMuY29yZS5ERUJVRyA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CisgICAgICAgICAgICAgICAgZGlzdHV0aWxzLmNvcmUuc2V0dXAobmFtZT0nYmFyJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRpc3R1dGlscy5jb3JlLkRFQlVHID0gRmFsc2UKKyAgICAgICAgc3Rkb3V0LnNlZWsoMCkKKyAgICAgICAgd2FudGVkID0gIm9wdGlvbnMgKGFmdGVyIHBhcnNpbmcgY29uZmlnIGZpbGVzKTpcbiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQucmVhZGxpbmVzKClbMF0sIHdhbnRlZCkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKENvcmVUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2Mjg5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2Mjg5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kZXBfdXRpbC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxMDQzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHkKQEAgLTAsMCArMSw4MSBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5kZXBfdXRpbC4iIiIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgdGltZQorCitmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXIsIG5ld2VyX3BhaXJ3aXNlLCBuZXdlcl9ncm91cAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNGaWxlRXJyb3IKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworY2xhc3MgRGVwVXRpbFRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X25ld2VyKHNlbGYpOgorCisgICAgICAgIHRtcGRpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIG5ld19maWxlID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ25ldycpCisgICAgICAgIG9sZF9maWxlID0gb3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKQorCisgICAgICAgICMgUmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yIGlmICduZXdfZmlsZScgZG9lcyBub3QgZXhpc3QuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc0ZpbGVFcnJvciwgbmV3ZXIsIG5ld19maWxlLCBvbGRfZmlsZSkKKworICAgICAgICAjIFJldHVybiB0cnVlIGlmICduZXdfZmlsZScgZXhpc3RzIGFuZCBpcyBtb3JlIHJlY2VudGx5IG1vZGlmaWVkIHRoYW4KKyAgICAgICAgIyAnb2xkX2ZpbGUnLCBvciBpZiAnbmV3X2ZpbGUnIGV4aXN0cyBhbmQgJ29sZF9maWxlJyBkb2Vzbid0LgorICAgICAgICBzZWxmLndyaXRlX2ZpbGUobmV3X2ZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuZXdlcihuZXdfZmlsZSwgJ0lfZG9udF9leGlzdCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobmV3ZXIobmV3X2ZpbGUsIG9sZF9maWxlKSkKKworICAgICAgICAjIFJldHVybiBmYWxzZSBpZiBib3RoIGV4aXN0IGFuZCAnb2xkX2ZpbGUnIGlzIHRoZSBzYW1lIGFnZSBvciB5b3VuZ2VyCisgICAgICAgICMgdGhhbiAnbmV3X2ZpbGUnLgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG5ld2VyKG9sZF9maWxlLCBuZXdfZmlsZSkpCisKKyAgICBkZWYgdGVzdF9uZXdlcl9wYWlyd2lzZShzZWxmKToKKyAgICAgICAgdG1wZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgc291cmNlcyA9IG9zLnBhdGguam9pbih0bXBkaXIsICdzb3VyY2VzJykKKyAgICAgICAgdGFyZ2V0cyA9IG9zLnBhdGguam9pbih0bXBkaXIsICd0YXJnZXRzJykKKyAgICAgICAgb3MubWtkaXIoc291cmNlcykKKyAgICAgICAgb3MubWtkaXIodGFyZ2V0cykKKyAgICAgICAgb25lID0gb3MucGF0aC5qb2luKHNvdXJjZXMsICdvbmUnKQorICAgICAgICB0d28gPSBvcy5wYXRoLmpvaW4oc291cmNlcywgJ3R3bycpCisgICAgICAgIHRocmVlID0gb3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSAgICAjIEkgYW0gdGhlIG9sZCBmaWxlCisgICAgICAgIGZvdXIgPSBvcy5wYXRoLmpvaW4odGFyZ2V0cywgJ2ZvdXInKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUob25lKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUodHdvKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZm91cikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld2VyX3BhaXJ3aXNlKFtvbmUsIHR3b10sIFt0aHJlZSwgZm91cl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIChbb25lXSxbdGhyZWVdKSkKKworICAgIGRlZiB0ZXN0X25ld2VyX2dyb3VwKHNlbGYpOgorICAgICAgICB0bXBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBzb3VyY2VzID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ3NvdXJjZXMnKQorICAgICAgICBvcy5ta2Rpcihzb3VyY2VzKQorICAgICAgICBvbmUgPSBvcy5wYXRoLmpvaW4oc291cmNlcywgJ29uZScpCisgICAgICAgIHR3byA9IG9zLnBhdGguam9pbihzb3VyY2VzLCAndHdvJykKKyAgICAgICAgdGhyZWUgPSBvcy5wYXRoLmpvaW4oc291cmNlcywgJ3RocmVlJykKKyAgICAgICAgb2xkX2ZpbGUgPSBvcy5wYXRoLmFic3BhdGgoX19maWxlX18pCisKKyAgICAgICAgIyByZXR1cm4gdHJ1ZSBpZiAnb2xkX2ZpbGUnIGlzIG91dC1vZi1kYXRlIHdpdGggcmVzcGVjdCB0byBhbnkgZmlsZQorICAgICAgICAjIGxpc3RlZCBpbiAnc291cmNlcycuCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShvbmUpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSh0d28pCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSh0aHJlZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5ld2VyX2dyb3VwKFtvbmUsIHR3bywgdGhyZWVdLCBvbGRfZmlsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobmV3ZXJfZ3JvdXAoW29uZSwgdHdvLCBvbGRfZmlsZV0sIHRocmVlKSkKKworICAgICAgICAjIG1pc3NpbmcgaGFuZGxpbmcKKyAgICAgICAgb3MucmVtb3ZlKG9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgbmV3ZXJfZ3JvdXAsIFtvbmUsIHR3bywgb2xkX2ZpbGVdLCB0aHJlZSkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG5ld2VyX2dyb3VwKFtvbmUsIHR3bywgb2xkX2ZpbGVdLCB0aHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nPSdpZ25vcmUnKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUobmV3ZXJfZ3JvdXAoW29uZSwgdHdvLCBvbGRfZmlsZV0sIHRocmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZz0nbmV3ZXInKSkKKworCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoRGVwVXRpbFRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2RlcF91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkN2E4OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2RlcF91dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2RlcF91dGlsLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkN2E4OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2RlcF91dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Rpcl91dGlsLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXJfdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODJkOTEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXJfdXRpbC5weQpAQCAtMCwwICsxLDEzNCBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5kaXJfdXRpbC4iIiIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgc3RhdAoraW1wb3J0IHNodXRpbAoraW1wb3J0IHN5cworCitmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgKG1rcGF0aCwgcmVtb3ZlX3RyZWUsIGNyZWF0ZV90cmVlLCBjb3B5X3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZV9yZWxhdGl2ZSkKKworZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitjbGFzcyBEaXJVdGlsVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9sb2coc2VsZiwgbXNnLCAqYXJncyk6CisgICAgICAgIGlmIGxlbihhcmdzKSA+IDA6CisgICAgICAgICAgICBzZWxmLl9sb2dzLmFwcGVuZChtc2cgJSBhcmdzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbG9ncy5hcHBlbmQobXNnKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihEaXJVdGlsVGVzdENhc2UsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5fbG9ncyA9IFtdCisgICAgICAgIHRtcF9kaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBzZWxmLnJvb3RfdGFyZ2V0ID0gb3MucGF0aC5qb2luKHRtcF9kaXIsICdkZWVwJykKKyAgICAgICAgc2VsZi50YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5yb290X3RhcmdldCwgJ2hlcmUnKQorICAgICAgICBzZWxmLnRhcmdldDIgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgJ2RlZXAyJykKKyAgICAgICAgc2VsZi5vbGRfbG9nID0gbG9nLmluZm8KKyAgICAgICAgbG9nLmluZm8gPSBzZWxmLl9sb2cKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgbG9nLmluZm8gPSBzZWxmLm9sZF9sb2cKKyAgICAgICAgc3VwZXIoRGlyVXRpbFRlc3RDYXNlLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgdGVzdF9ta3BhdGhfcmVtb3ZlX3RyZWVfdmVyYm9zaXR5KHNlbGYpOgorCisgICAgICAgIG1rcGF0aChzZWxmLnRhcmdldCwgdmVyYm9zZT0wKQorICAgICAgICB3YW50ZWQgPSBbXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2xvZ3MsIHdhbnRlZCkKKyAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5yb290X3RhcmdldCwgdmVyYm9zZT0wKQorCisgICAgICAgIG1rcGF0aChzZWxmLnRhcmdldCwgdmVyYm9zZT0xKQorICAgICAgICB3YW50ZWQgPSBbJ2NyZWF0aW5nICVzJyAlIHNlbGYucm9vdF90YXJnZXQsCisgICAgICAgICAgICAgICAgICAnY3JlYXRpbmcgJXMnICUgc2VsZi50YXJnZXRdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fbG9ncywgd2FudGVkKQorICAgICAgICBzZWxmLl9sb2dzID0gW10KKworICAgICAgICByZW1vdmVfdHJlZShzZWxmLnJvb3RfdGFyZ2V0LCB2ZXJib3NlPTEpCisgICAgICAgIHdhbnRlZCA9IFsicmVtb3ZpbmcgJyVzJyAoYW5kIGV2ZXJ5dGhpbmcgdW5kZXIgaXQpIiAlIHNlbGYucm9vdF90YXJnZXRdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fbG9ncywgd2FudGVkKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyksCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyB0ZXN0IGlzIG9ubHkgYXBwcm9wcmlhdGUgZm9yIFBPU0lYLWxpa2Ugc3lzdGVtcy4iKQorICAgIGRlZiB0ZXN0X21rcGF0aF93aXRoX2N1c3RvbV9tb2RlKHNlbGYpOgorICAgICAgICAjIEdldCBhbmQgc2V0IHRoZSBjdXJyZW50IHVtYXNrIHZhbHVlIGZvciB0ZXN0aW5nIG1vZGUgYml0cy4KKyAgICAgICAgdW1hc2sgPSBvcy51bWFzaygwbzAwMikKKyAgICAgICAgb3MudW1hc2sodW1hc2spCisgICAgICAgIG1rcGF0aChzZWxmLnRhcmdldCwgMG83MDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzdGF0LlNfSU1PREUob3Muc3RhdChzZWxmLnRhcmdldCkuc3RfbW9kZSksIDBvNzAwICYgfnVtYXNrKQorICAgICAgICBta3BhdGgoc2VsZi50YXJnZXQyLCAwbzU1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHN0YXQuU19JTU9ERShvcy5zdGF0KHNlbGYudGFyZ2V0Mikuc3RfbW9kZSksIDBvNTU1ICYgfnVtYXNrKQorCisgICAgZGVmIHRlc3RfY3JlYXRlX3RyZWVfdmVyYm9zaXR5KHNlbGYpOgorCisgICAgICAgIGNyZWF0ZV90cmVlKHNlbGYucm9vdF90YXJnZXQsIFsnb25lJywgJ3R3bycsICd0aHJlZSddLCB2ZXJib3NlPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fbG9ncywgW10pCisgICAgICAgIHJlbW92ZV90cmVlKHNlbGYucm9vdF90YXJnZXQsIHZlcmJvc2U9MCkKKworICAgICAgICB3YW50ZWQgPSBbJ2NyZWF0aW5nICVzJyAlIHNlbGYucm9vdF90YXJnZXRdCisgICAgICAgIGNyZWF0ZV90cmVlKHNlbGYucm9vdF90YXJnZXQsIFsnb25lJywgJ3R3bycsICd0aHJlZSddLCB2ZXJib3NlPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fbG9ncywgd2FudGVkKQorCisgICAgICAgIHJlbW92ZV90cmVlKHNlbGYucm9vdF90YXJnZXQsIHZlcmJvc2U9MCkKKworCisgICAgZGVmIHRlc3RfY29weV90cmVlX3ZlcmJvc2l0eShzZWxmKToKKworICAgICAgICBta3BhdGgoc2VsZi50YXJnZXQsIHZlcmJvc2U9MCkKKworICAgICAgICBjb3B5X3RyZWUoc2VsZi50YXJnZXQsIHNlbGYudGFyZ2V0MiwgdmVyYm9zZT0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2xvZ3MsIFtdKQorCisgICAgICAgIHJlbW92ZV90cmVlKHNlbGYucm9vdF90YXJnZXQsIHZlcmJvc2U9MCkKKworICAgICAgICBta3BhdGgoc2VsZi50YXJnZXQsIHZlcmJvc2U9MCkKKyAgICAgICAgYV9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGFyZ2V0LCAnb2sudHh0JykKKyAgICAgICAgZiA9IG9wZW4oYV9maWxlLCAndycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoJ3NvbWUgY29udGVudCcpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICB3YW50ZWQgPSBbJ2NvcHlpbmcgJXMgLT4gJXMnICUgKGFfZmlsZSwgc2VsZi50YXJnZXQyKV0KKyAgICAgICAgY29weV90cmVlKHNlbGYudGFyZ2V0LCBzZWxmLnRhcmdldDIsIHZlcmJvc2U9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9sb2dzLCB3YW50ZWQpCisKKyAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5yb290X3RhcmdldCwgdmVyYm9zZT0wKQorICAgICAgICByZW1vdmVfdHJlZShzZWxmLnRhcmdldDIsIHZlcmJvc2U9MCkKKworICAgIGRlZiB0ZXN0X2NvcHlfdHJlZV9za2lwc19uZnNfdGVtcF9maWxlcyhzZWxmKToKKyAgICAgICAgbWtwYXRoKHNlbGYudGFyZ2V0LCB2ZXJib3NlPTApCisKKyAgICAgICAgYV9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGFyZ2V0LCAnb2sudHh0JykKKyAgICAgICAgbmZzX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50YXJnZXQsICcubmZzMTIzYWJjJykKKyAgICAgICAgZm9yIGYgaW4gYV9maWxlLCBuZnNfZmlsZToKKyAgICAgICAgICAgIGZoID0gb3BlbihmLCAndycpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmgud3JpdGUoJ3NvbWUgY29udGVudCcpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGZoLmNsb3NlKCkKKworICAgICAgICBjb3B5X3RyZWUoc2VsZi50YXJnZXQsIHNlbGYudGFyZ2V0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5saXN0ZGlyKHNlbGYudGFyZ2V0MiksIFsnb2sudHh0J10pCisKKyAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5yb290X3RhcmdldCwgdmVyYm9zZT0wKQorICAgICAgICByZW1vdmVfdHJlZShzZWxmLnRhcmdldDIsIHZlcmJvc2U9MCkKKworICAgIGRlZiB0ZXN0X2Vuc3VyZV9yZWxhdGl2ZShzZWxmKToKKyAgICAgICAgaWYgb3Muc2VwID09ICcvJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5zdXJlX3JlbGF0aXZlKCcvaG9tZS9mb28nKSwgJ2hvbWUvZm9vJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5zdXJlX3JlbGF0aXZlKCdzb21lL3BhdGgnKSwgJ3NvbWUvcGF0aCcpCisgICAgICAgIGVsc2U6ICAgIyBcXAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnN1cmVfcmVsYXRpdmUoJ2M6XFxob21lXFxmb28nKSwgJ2M6aG9tZVxcZm9vJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5zdXJlX3JlbGF0aXZlKCdob21lXFxmb28nKSwgJ2hvbWVcXGZvbycpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShEaXJVdGlsVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlyX3V0aWwucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXJfdXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMGMzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlyX3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlyX3V0aWwucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXJfdXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxMGMzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlyX3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjdiYmViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXN0LnB5CkBAIC0wLDAgKzEsNDQ1IEBACisjIC0qLSBjb2Rpbmc6IHV0ZjggLSotCisKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuZGlzdC4iIiIKK2ltcG9ydCBvcworaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworaW1wb3J0IHRleHR3cmFwCisKK2Zyb20gZGlzdHV0aWxzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbiwgZml4X2hlbHBfb3B0aW9ucworZnJvbSBkaXN0dXRpbHMuY21kIGltcG9ydCBDb21tYW5kCitpbXBvcnQgZGlzdHV0aWxzLmRpc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgY2FwdHVyZWRfc3Rkb3V0LCBydW5fdW5pdHRlc3QKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CisKKworY2xhc3MgdGVzdF9kaXN0KENvbW1hbmQpOgorICAgICIiIlNhbXBsZSBkaXN0dXRpbHMgZXh0ZW5zaW9uIGNvbW1hbmQuIiIiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgic2FtcGxlLW9wdGlvbj0iLCAiUyIsICJoZWxwIHRleHQiKSwKKyAgICAgICAgXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5zYW1wbGVfb3B0aW9uID0gTm9uZQorCisKK2NsYXNzIFRlc3REaXN0cmlidXRpb24oRGlzdHJpYnV0aW9uKToKKyAgICAiIiJEaXN0cmlidXRpb24gc3ViY2xhc3NlcyB0aGF0IGF2b2lkcyB0aGUgZGVmYXVsdCBzZWFyY2ggZm9yCisgICAgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgIFRoZSAuX2NvbmZpZ19maWxlcyBhdHRyaWJ1dGUgbXVzdCBiZSBzZXQgYmVmb3JlCisgICAgLnBhcnNlX2NvbmZpZ19maWxlcygpIGlzIGNhbGxlZC4KKyAgICAiIiIKKworICAgIGRlZiBmaW5kX2NvbmZpZ19maWxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbmZpZ19maWxlcworCisKK2NsYXNzIERpc3RyaWJ1dGlvblRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuRW52aXJvbkd1YXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihEaXN0cmlidXRpb25UZXN0Q2FzZSwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLmFyZ3YgPSBzeXMuYXJndiwgc3lzLmFyZ3ZbOl0KKyAgICAgICAgZGVsIHN5cy5hcmd2WzE6XQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMuYXJndiA9IHNlbGYuYXJndlswXQorICAgICAgICBzeXMuYXJndls6XSA9IHNlbGYuYXJndlsxXQorICAgICAgICBzdXBlcihEaXN0cmlidXRpb25UZXN0Q2FzZSwgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIGNyZWF0ZV9kaXN0cmlidXRpb24oc2VsZiwgY29uZmlnZmlsZXM9KCkpOgorICAgICAgICBkID0gVGVzdERpc3RyaWJ1dGlvbigpCisgICAgICAgIGQuX2NvbmZpZ19maWxlcyA9IGNvbmZpZ2ZpbGVzCisgICAgICAgIGQucGFyc2VfY29uZmlnX2ZpbGVzKCkKKyAgICAgICAgZC5wYXJzZV9jb21tYW5kX2xpbmUoKQorICAgICAgICByZXR1cm4gZAorCisgICAgZGVmIHRlc3RfZGVidWdfbW9kZShzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgInciKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgiW2dsb2JhbF1cbiIpCisgICAgICAgICAgICBmLndyaXRlKCJjb21tYW5kX3BhY2thZ2VzID0gZm9vLmJhciwgc3BsYXQiKQorCisgICAgICAgIGZpbGVzID0gW1RFU1RGTl0KKyAgICAgICAgc3lzLmFyZ3YuYXBwZW5kKCJidWlsZCIpCisKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CisgICAgICAgICAgICBzZWxmLmNyZWF0ZV9kaXN0cmlidXRpb24oZmlsZXMpCisgICAgICAgIHN0ZG91dC5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LnJlYWQoKSwgJycpCisgICAgICAgIGRpc3R1dGlscy5kaXN0LkRFQlVHID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKKyAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9kaXN0cmlidXRpb24oZmlsZXMpCisgICAgICAgICAgICBzdGRvdXQuc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQucmVhZCgpLCAnJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRpc3R1dGlscy5kaXN0LkRFQlVHID0gRmFsc2UKKworICAgIGRlZiB0ZXN0X2NvbW1hbmRfcGFja2FnZXNfdW5zcGVjaWZpZWQoc2VsZik6CisgICAgICAgIHN5cy5hcmd2LmFwcGVuZCgiYnVpbGQiKQorICAgICAgICBkID0gc2VsZi5jcmVhdGVfZGlzdHJpYnV0aW9uKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldF9jb21tYW5kX3BhY2thZ2VzKCksIFsiZGlzdHV0aWxzLmNvbW1hbmQiXSkKKworICAgIGRlZiB0ZXN0X2NvbW1hbmRfcGFja2FnZXNfY21kbGluZShzZWxmKToKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMudGVzdHMudGVzdF9kaXN0IGltcG9ydCB0ZXN0X2Rpc3QKKyAgICAgICAgc3lzLmFyZ3YuZXh0ZW5kKFsiLS1jb21tYW5kLXBhY2thZ2VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vLmJhcixkaXN0dXRpbHMudGVzdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X2Rpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICItU3NvbWV0ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICBkID0gc2VsZi5jcmVhdGVfZGlzdHJpYnV0aW9uKCkKKyAgICAgICAgIyBsZXQncyBhY3R1YWxseSB0cnkgdG8gbG9hZCBvdXIgdGVzdCBjb21tYW5kOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0X2NvbW1hbmRfcGFja2FnZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImRpc3R1dGlscy5jb21tYW5kIiwgImZvby5iYXIiLCAiZGlzdHV0aWxzLnRlc3RzIl0pCisgICAgICAgIGNtZCA9IGQuZ2V0X2NvbW1hbmRfb2JqKCJ0ZXN0X2Rpc3QiKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoY21kLCB0ZXN0X2Rpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLnNhbXBsZV9vcHRpb24sICJzb21ldGV4dCIpCisKKyAgICBkZWYgdGVzdF9jb21tYW5kX3BhY2thZ2VzX2NvbmZpZ2ZpbGUoc2VsZik6CisgICAgICAgIHN5cy5hcmd2LmFwcGVuZCgiYnVpbGQiKQorICAgICAgICBzZWxmLmFkZENsZWFudXAob3MudW5saW5rLCBURVNURk4pCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmludCA+PiBmLCAiW2dsb2JhbF0iCisgICAgICAgICAgICBwcmludCA+PiBmLCAiY29tbWFuZF9wYWNrYWdlcyA9IGZvby5iYXIsIHNwbGF0IgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgZCA9IHNlbGYuY3JlYXRlX2Rpc3RyaWJ1dGlvbihbVEVTVEZOXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldF9jb21tYW5kX3BhY2thZ2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJkaXN0dXRpbHMuY29tbWFuZCIsICJmb28uYmFyIiwgInNwbGF0Il0pCisKKyAgICAgICAgIyBlbnN1cmUgY29tbWFuZCBsaW5lIG92ZXJyaWRlcyBjb25maWc6CisgICAgICAgIHN5cy5hcmd2WzE6XSA9IFsiLS1jb21tYW5kLXBhY2thZ2VzIiwgInNwb3JrIiwgImJ1aWxkIl0KKyAgICAgICAgZCA9IHNlbGYuY3JlYXRlX2Rpc3RyaWJ1dGlvbihbVEVTVEZOXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldF9jb21tYW5kX3BhY2thZ2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJkaXN0dXRpbHMuY29tbWFuZCIsICJzcG9yayJdKQorCisgICAgICAgICMgU2V0dGluZyAtLWNvbW1hbmQtcGFja2FnZXMgdG8gJycgc2hvdWxkIGNhdXNlIHRoZSBkZWZhdWx0IHRvCisgICAgICAgICMgYmUgdXNlZCBldmVuIGlmIGEgY29uZmlnIGZpbGUgc3BlY2lmaWVkIHNvbWV0aGluZyBlbHNlOgorICAgICAgICBzeXMuYXJndlsxOl0gPSBbIi0tY29tbWFuZC1wYWNrYWdlcyIsICIiLCAiYnVpbGQiXQorICAgICAgICBkID0gc2VsZi5jcmVhdGVfZGlzdHJpYnV0aW9uKFtURVNURk5dKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0X2NvbW1hbmRfcGFja2FnZXMoKSwgWyJkaXN0dXRpbHMuY29tbWFuZCJdKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfcGtnX2ZpbGUoc2VsZik6CisgICAgICAgICMgQ2hlY2sgRGlzdHJpYnV0aW9uTWV0YWRhdGEgaGFuZGxpbmcgb2YgVW5pY29kZSBmaWVsZHMKKyAgICAgICAgdG1wX2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIG15X2ZpbGUgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgJ2YnKQorICAgICAgICBrbGFzcyA9IERpc3RyaWJ1dGlvbgorCisgICAgICAgIGRpc3QgPSBrbGFzcyhhdHRycz17J2F1dGhvcic6IHUnTWlzdGVyIENhZsOpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICdteS5wYWNrYWdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFpbnRhaW5lcic6IHUnQ2Fmw6kgSnVuaW9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiB1J0NhZsOpIHRvcnLDqWZpw6knLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uJzogdSdIw6low6low6knfSkKKworICAgICAgICAjIGxldCdzIG1ha2Ugc3VyZSB0aGUgZmlsZSBjYW4gYmUgd3JpdHRlbgorICAgICAgICAjIHdpdGggVW5pY29kZSBmaWVsZHMuIHRoZXkgYXJlIGVuY29kZWQgd2l0aAorICAgICAgICAjIFBLR19JTkZPX0VOQ09ESU5HCisgICAgICAgIGRpc3QubWV0YWRhdGEud3JpdGVfcGtnX2ZpbGUob3BlbihteV9maWxlLCAndycpKQorCisgICAgICAgICMgcmVndWxhciBhc2NpaSBpcyBvZiBjb3Vyc2UgYWx3YXlzIHVzYWJsZQorICAgICAgICBkaXN0ID0ga2xhc3MoYXR0cnM9eydhdXRob3InOiAnTWlzdGVyIENhZmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ215LnBhY2thZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYWludGFpbmVyJzogJ0NhZmUgSnVuaW9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiAnQ2FmZSB0b3JyZWZpZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvbmdfZGVzY3JpcHRpb24nOiAnSGVoZWhlJ30pCisKKyAgICAgICAgbXlfZmlsZTIgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgJ2YyJykKKyAgICAgICAgZGlzdC5tZXRhZGF0YS53cml0ZV9wa2dfZmlsZShvcGVuKG15X2ZpbGUyLCAndycpKQorCisgICAgZGVmIHRlc3RfZW1wdHlfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIyBhbiBlbXB0eSBvcHRpb25zIGRpY3Rpb25hcnkgc2hvdWxkIG5vdCBzdGF5IGluIHRoZQorICAgICAgICAjIGxpc3Qgb2YgYXR0cmlidXRlcworCisgICAgICAgICMgY2F0Y2hpbmcgd2FybmluZ3MKKyAgICAgICAgd2FybnMgPSBbXQorCisgICAgICAgIGRlZiBfd2Fybihtc2cpOgorICAgICAgICAgICAgd2FybnMuYXBwZW5kKG1zZykKKworICAgICAgICBzZWxmLmFkZENsZWFudXAoc2V0YXR0ciwgd2FybmluZ3MsICd3YXJuJywgd2FybmluZ3Mud2FybikKKyAgICAgICAgd2FybmluZ3Mud2FybiA9IF93YXJuCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYXR0cnM9eydhdXRob3InOiAneHh4JywgJ25hbWUnOiAneHh4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nOiAneHh4JywgJ3VybCc6ICd4eHh4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wdGlvbnMnOiB7fX0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4od2FybnMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdvcHRpb25zJywgZGlyKGRpc3QpKQorCisgICAgZGVmIHRlc3RfZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgYXR0cnMgPSB7J2tleXdvcmRzJzogJ29uZSx0d28nLAorICAgICAgICAgICAgICAgICAncGxhdGZvcm1zJzogJ29uZSx0d28nfQorCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYXR0cnM9YXR0cnMpCisgICAgICAgIGRpc3QuZmluYWxpemVfb3B0aW9ucygpCisKKyAgICAgICAgIyBmaW5hbGl6ZV9vcHRpb24gc3BsaXRzIHBsYXRmb3JtcyBhbmQga2V5d29yZHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0Lm1ldGFkYXRhLnBsYXRmb3JtcywgWydvbmUnLCAndHdvJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5tZXRhZGF0YS5rZXl3b3JkcywgWydvbmUnLCAndHdvJ10pCisKKyAgICBkZWYgdGVzdF9nZXRfY29tbWFuZF9wYWNrYWdlcyhzZWxmKToKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5jb21tYW5kX3BhY2thZ2VzLCBOb25lKQorICAgICAgICBjbWRzID0gZGlzdC5nZXRfY29tbWFuZF9wYWNrYWdlcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kcywgWydkaXN0dXRpbHMuY29tbWFuZCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuY29tbWFuZF9wYWNrYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2Rpc3R1dGlscy5jb21tYW5kJ10pCisKKyAgICAgICAgZGlzdC5jb21tYW5kX3BhY2thZ2VzID0gJ29uZSx0d28nCisgICAgICAgIGNtZHMgPSBkaXN0LmdldF9jb21tYW5kX3BhY2thZ2VzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWRzLCBbJ2Rpc3R1dGlscy5jb21tYW5kJywgJ29uZScsICd0d28nXSkKKworICAgIGRlZiB0ZXN0X2Fubm91bmNlKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgbGV2ZWwgaXMga25vd24KKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCisgICAgICAgIGFyZ3MgPSAoJ29rJywpCisgICAgICAgIGt3YXJncyA9IHsnbGV2ZWwnOiAnb2syJ30KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZGlzdC5hbm5vdW5jZSwgYXJncywga3dhcmdzKQorCisgICAgZGVmIHRlc3RfZmluZF9jb25maWdfZmlsZXNfZGlzYWJsZShzZWxmKToKKyAgICAgICAgIyBUaWNrZXQgIzExODA6IEFsbG93IHVzZXIgdG8gZGlzYWJsZSB0aGVpciBob21lIGNvbmZpZyBmaWxlLgorICAgICAgICB0ZW1wX2hvbWUgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICB1c2VyX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRlbXBfaG9tZSwgIi5weWRpc3R1dGlscy5jZmciKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXNlcl9maWxlbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wX2hvbWUsICJweWRpc3R1dGlscy5jZmciKQorCisgICAgICAgIHdpdGggb3Blbih1c2VyX2ZpbGVuYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCdbZGlzdHV0aWxzXVxuJykKKworICAgICAgICBkZWYgX2V4cGFuZGVyKHBhdGgpOgorICAgICAgICAgICAgcmV0dXJuIHRlbXBfaG9tZQorCisgICAgICAgIG9sZF9leHBhbmRlciA9IG9zLnBhdGguZXhwYW5kdXNlcgorICAgICAgICBvcy5wYXRoLmV4cGFuZHVzZXIgPSBfZXhwYW5kZXIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZCA9IGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbigpCisgICAgICAgICAgICBhbGxfZmlsZXMgPSBkLmZpbmRfY29uZmlnX2ZpbGVzKCkKKworICAgICAgICAgICAgZCA9IGRpc3R1dGlscy5kaXN0LkRpc3RyaWJ1dGlvbihhdHRycz17J3NjcmlwdF9hcmdzJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyctLW5vLXVzZXItY2ZnJ119KQorICAgICAgICAgICAgZmlsZXMgPSBkLmZpbmRfY29uZmlnX2ZpbGVzKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnBhdGguZXhwYW5kdXNlciA9IG9sZF9leHBhbmRlcgorCisgICAgICAgICMgbWFrZSBzdXJlIC0tbm8tdXNlci1jZmcgZGlzYWJsZXMgdGhlIHVzZXIgY2ZnIGZpbGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYWxsX2ZpbGVzKS0xLCBsZW4oZmlsZXMpKQorCisKK2NsYXNzIE1ldGFkYXRhVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwgc3VwcG9ydC5FbnZpcm9uR3VhcmQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoTWV0YWRhdGFUZXN0Q2FzZSwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLmFyZ3YgPSBzeXMuYXJndiwgc3lzLmFyZ3ZbOl0KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3lzLmFyZ3YgPSBzZWxmLmFyZ3ZbMF0KKyAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzZWxmLmFyZ3ZbMV0KKyAgICAgICAgc3VwZXIoTWV0YWRhdGFUZXN0Q2FzZSwgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIHRlc3RfY2xhc3NpZmllcihzZWxmKToKKyAgICAgICAgYXR0cnMgPSB7J25hbWUnOiAnQm9hJywgJ3ZlcnNpb24nOiAnMy4wJywKKyAgICAgICAgICAgICAgICAgJ2NsYXNzaWZpZXJzJzogWydQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMyddfQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGF0dHJzKQorICAgICAgICBtZXRhID0gc2VsZi5mb3JtYXRfbWV0YWRhdGEoZGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignTWV0YWRhdGEtVmVyc2lvbjogMS4xJywgbWV0YSkKKworICAgIGRlZiB0ZXN0X2Rvd25sb2FkX3VybChzZWxmKToKKyAgICAgICAgYXR0cnMgPSB7J25hbWUnOiAnQm9hJywgJ3ZlcnNpb24nOiAnMy4wJywKKyAgICAgICAgICAgICAgICAgJ2Rvd25sb2FkX3VybCc6ICdodHRwOi8vZXhhbXBsZS5vcmcvYm9hJ30KKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihhdHRycykKKyAgICAgICAgbWV0YSA9IHNlbGYuZm9ybWF0X21ldGFkYXRhKGRpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ01ldGFkYXRhLVZlcnNpb246IDEuMScsIG1ldGEpCisKKyAgICBkZWYgdGVzdF9sb25nX2Rlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICBsb25nX2Rlc2MgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICBleGFtcGxlOjoKKyAgICAgICAgICAgICAgV2Ugc3RhcnQgaGVyZQorICAgICAgICAgICAgYW5kIGNvbnRpbnVlIGhlcmUKKyAgICAgICAgICBhbmQgZW5kIGhlcmUuIiIiKQorICAgICAgICBhdHRycyA9IHsibmFtZSI6ICJwYWNrYWdlIiwKKyAgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMS4wIiwKKyAgICAgICAgICAgICAgICAgImxvbmdfZGVzY3JpcHRpb24iOiBsb25nX2Rlc2N9CisKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihhdHRycykKKyAgICAgICAgbWV0YSA9IHNlbGYuZm9ybWF0X21ldGFkYXRhKGRpc3QpCisgICAgICAgIG1ldGEgPSBtZXRhLnJlcGxhY2UoJ1xuJyArIDggKiAnICcsICdcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obG9uZ19kZXNjLCBtZXRhKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX21ldGFkYXRhKHNlbGYpOgorICAgICAgICBhdHRycyA9IHsibmFtZSI6ICJwYWNrYWdlIiwKKyAgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMS4wIn0KKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihhdHRycykKKyAgICAgICAgbWV0YSA9IHNlbGYuZm9ybWF0X21ldGFkYXRhKGRpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIk1ldGFkYXRhLVZlcnNpb246IDEuMCIsIG1ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oInByb3ZpZGVzOiIsIG1ldGEubG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigicmVxdWlyZXM6IiwgbWV0YS5sb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJvYnNvbGV0ZXM6IiwgbWV0YS5sb3dlcigpKQorCisgICAgZGVmIHRlc3RfcHJvdmlkZXMoc2VsZik6CisgICAgICAgIGF0dHJzID0geyJuYW1lIjogInBhY2thZ2UiLAorICAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIxLjAiLAorICAgICAgICAgICAgICAgICAicHJvdmlkZXMiOiBbInBhY2thZ2UiLCAicGFja2FnZS5zdWIiXX0KKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihhdHRycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0Lm1ldGFkYXRhLmdldF9wcm92aWRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsicGFja2FnZSIsICJwYWNrYWdlLnN1YiJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZ2V0X3Byb3ZpZGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJwYWNrYWdlIiwgInBhY2thZ2Uuc3ViIl0pCisgICAgICAgIG1ldGEgPSBzZWxmLmZvcm1hdF9tZXRhZGF0YShkaXN0KQorICAgICAgICBzZWxmLmFzc2VydEluKCJNZXRhZGF0YS1WZXJzaW9uOiAxLjEiLCBtZXRhKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJyZXF1aXJlczoiLCBtZXRhLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIm9ic29sZXRlczoiLCBtZXRhLmxvd2VyKCkpCisKKyAgICBkZWYgdGVzdF9wcm92aWRlc19pbGxlZ2FsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBEaXN0cmlidXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6ICJwYWNrYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvdmlkZXMiOiBbIm15LnBrZyAoc3BsYXQpIl19KQorCisgICAgZGVmIHRlc3RfcmVxdWlyZXMoc2VsZik6CisgICAgICAgIGF0dHJzID0geyJuYW1lIjogInBhY2thZ2UiLAorICAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIxLjAiLAorICAgICAgICAgICAgICAgICAicmVxdWlyZXMiOiBbIm90aGVyIiwgImFub3RoZXIgKD09MS4wKSJdfQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGF0dHJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QubWV0YWRhdGEuZ2V0X3JlcXVpcmVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJvdGhlciIsICJhbm90aGVyICg9PTEuMCkiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0LmdldF9yZXF1aXJlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsib3RoZXIiLCAiYW5vdGhlciAoPT0xLjApIl0pCisgICAgICAgIG1ldGEgPSBzZWxmLmZvcm1hdF9tZXRhZGF0YShkaXN0KQorICAgICAgICBzZWxmLmFzc2VydEluKCJNZXRhZGF0YS1WZXJzaW9uOiAxLjEiLCBtZXRhKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJwcm92aWRlczoiLCBtZXRhLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlJlcXVpcmVzOiBvdGhlciIsIG1ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlJlcXVpcmVzOiBhbm90aGVyICg9PTEuMCkiLCBtZXRhKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJvYnNvbGV0ZXM6IiwgbWV0YS5sb3dlcigpKQorCisgICAgZGVmIHRlc3RfcmVxdWlyZXNfaWxsZWdhbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRGlzdHJpYnV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiAicGFja2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIxLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVzIjogWyJteS5wa2cgKHNwbGF0KSJdfSkKKworICAgIGRlZiB0ZXN0X29ic29sZXRlcyhzZWxmKToKKyAgICAgICAgYXR0cnMgPSB7Im5hbWUiOiAicGFja2FnZSIsCisgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMCIsCisgICAgICAgICAgICAgICAgICJvYnNvbGV0ZXMiOiBbIm90aGVyIiwgImFub3RoZXIgKDwxLjApIl19CisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5tZXRhZGF0YS5nZXRfb2Jzb2xldGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJvdGhlciIsICJhbm90aGVyICg8MS4wKSJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZ2V0X29ic29sZXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsib3RoZXIiLCAiYW5vdGhlciAoPDEuMCkiXSkKKyAgICAgICAgbWV0YSA9IHNlbGYuZm9ybWF0X21ldGFkYXRhKGRpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIk1ldGFkYXRhLVZlcnNpb246IDEuMSIsIG1ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oInByb3ZpZGVzOiIsIG1ldGEubG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigicmVxdWlyZXM6IiwgbWV0YS5sb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydEluKCJPYnNvbGV0ZXM6IG90aGVyIiwgbWV0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiT2Jzb2xldGVzOiBhbm90aGVyICg8MS4wKSIsIG1ldGEpCisKKyAgICBkZWYgdGVzdF9vYnNvbGV0ZXNfaWxsZWdhbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRGlzdHJpYnV0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5hbWUiOiAicGFja2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIxLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ic29sZXRlcyI6IFsibXkucGtnIChzcGxhdCkiXX0pCisKKyAgICBkZWYgZm9ybWF0X21ldGFkYXRhKHNlbGYsIGRpc3QpOgorICAgICAgICBzaW8gPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGRpc3QubWV0YWRhdGEud3JpdGVfcGtnX2ZpbGUoc2lvKQorICAgICAgICByZXR1cm4gc2lvLmdldHZhbHVlKCkKKworICAgIGRlZiB0ZXN0X2N1c3RvbV9weWRpc3R1dGlscyhzZWxmKToKKyAgICAgICAgIyBmaXhlcyAjMjE2NgorICAgICAgICAjIG1ha2Ugc3VyZSBweWRpc3R1dGlscy5jZmcgaXMgZm91bmQKKyAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAgICAgdXNlcl9maWxlbmFtZSA9ICIucHlkaXN0dXRpbHMuY2ZnIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXNlcl9maWxlbmFtZSA9ICJweWRpc3R1dGlscy5jZmciCisKKyAgICAgICAgdGVtcF9kaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICB1c2VyX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCB1c2VyX2ZpbGVuYW1lKQorICAgICAgICBmID0gb3Blbih1c2VyX2ZpbGVuYW1lLCAndycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoJy4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCisKKyAgICAgICAgICAgICMgbGludXgtc3R5bGUKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ2xpbnV4JywgJ2RhcndpbicpOgorICAgICAgICAgICAgICAgIG9zLmVudmlyb25bJ0hPTUUnXSA9IHRlbXBfZGlyCisgICAgICAgICAgICAgICAgZmlsZXMgPSBkaXN0LmZpbmRfY29uZmlnX2ZpbGVzKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHVzZXJfZmlsZW5hbWUsIGZpbGVzKQorCisgICAgICAgICAgICAjIHdpbjMyLXN0eWxlCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgICAgICAjIGhvbWUgZHJpdmUgc2hvdWxkIGJlIGZvdW5kCisgICAgICAgICAgICAgICAgb3MuZW52aXJvblsnSE9NRSddID0gdGVtcF9kaXIKKyAgICAgICAgICAgICAgICBmaWxlcyA9IGRpc3QuZmluZF9jb25maWdfZmlsZXMoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4odXNlcl9maWxlbmFtZSwgZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclciBub3QgZm91bmQgaW4gJXInICUgKHVzZXJfZmlsZW5hbWUsIGZpbGVzKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJlbW92ZSh1c2VyX2ZpbGVuYW1lKQorCisgICAgZGVmIHRlc3RfZml4X2hlbHBfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgaGVscF90dXBsZXMgPSBbKCdhJywgJ2InLCAnYycsICdkJyksICgxLCAyLCAzLCA0KV0KKyAgICAgICAgZmFuY3lfb3B0aW9ucyA9IGZpeF9oZWxwX29wdGlvbnMoaGVscF90dXBsZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmFuY3lfb3B0aW9uc1swXSwgKCdhJywgJ2InLCAnYycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZhbmN5X29wdGlvbnNbMV0sICgxLCAyLCAzKSkKKworICAgIGRlZiB0ZXN0X3Nob3dfaGVscChzZWxmKToKKyAgICAgICAgIyBzbW9rZSB0ZXN0LCBqdXN0IG1ha2VzIHN1cmUgc29tZSBoZWxwIGlzIGRpc3BsYXllZAorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKCkKKyAgICAgICAgc3lzLmFyZ3YgPSBbXQorICAgICAgICBkaXN0LmhlbHAgPSAxCisgICAgICAgIGRpc3Quc2NyaXB0X25hbWUgPSAnc2V0dXAucHknCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgczoKKyAgICAgICAgICAgIGRpc3QucGFyc2VfY29tbWFuZF9saW5lKCkKKworICAgICAgICBvdXRwdXQgPSBbbGluZSBmb3IgbGluZSBpbiBzLmdldHZhbHVlKCkuc3BsaXQoJ1xuJykKKyAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKSAhPSAnJ10KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG91dHB1dCkKKworICAgIGRlZiB0ZXN0X3JlYWRfbWV0YWRhdGEoc2VsZik6CisgICAgICAgIGF0dHJzID0geyJuYW1lIjogInBhY2thZ2UiLAorICAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIxLjAiLAorICAgICAgICAgICAgICAgICAibG9uZ19kZXNjcmlwdGlvbiI6ICJkZXNjIiwKKyAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogInh4eCIsCisgICAgICAgICAgICAgICAgICJkb3dubG9hZF91cmwiOiAiaHR0cDovL2V4YW1wbGUuY29tIiwKKyAgICAgICAgICAgICAgICAgImtleXdvcmRzIjogWydvbmUnLCAndHdvJ10sCisgICAgICAgICAgICAgICAgICJyZXF1aXJlcyI6IFsnZm9vJ119CisKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihhdHRycykKKyAgICAgICAgbWV0YWRhdGEgPSBkaXN0Lm1ldGFkYXRhCisKKyAgICAgICAgIyB3cml0ZSBpdCB0aGVuIHJlbG9hZHMgaXQKKyAgICAgICAgUEtHX0lORk8gPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIG1ldGFkYXRhLndyaXRlX3BrZ19maWxlKFBLR19JTkZPKQorICAgICAgICBQS0dfSU5GTy5zZWVrKDApCisgICAgICAgIG1ldGFkYXRhLnJlYWRfcGtnX2ZpbGUoUEtHX0lORk8pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXRhZGF0YS5uYW1lLCAicGFja2FnZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWV0YWRhdGEudmVyc2lvbiwgIjEuMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWV0YWRhdGEuZGVzY3JpcHRpb24sICJ4eHgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1ldGFkYXRhLmRvd25sb2FkX3VybCwgJ2h0dHA6Ly9leGFtcGxlLmNvbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWV0YWRhdGEua2V5d29yZHMsIFsnb25lJywgJ3R3byddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1ldGFkYXRhLnBsYXRmb3JtcywgWydVTktOT1dOJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWV0YWRhdGEub2Jzb2xldGVzLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1ldGFkYXRhLnJlcXVpcmVzLCBbJ2ZvbyddKQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERpc3RyaWJ1dGlvblRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShNZXRhZGF0YVRlc3RDYXNlKSkKKyAgICByZXR1cm4gc3VpdGUKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXN0LnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViMDhmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXN0LnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViMDhmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlX3V0aWwucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVfdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGJjZjUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlX3V0aWwucHkKQEAgLTAsMCArMSw4MSBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5maWxlX3V0aWwuIiIiCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAorCitmcm9tIGRpc3R1dGlscy5maWxlX3V0aWwgaW1wb3J0IG1vdmVfZmlsZSwgd3JpdGVfZmlsZSwgY29weV9maWxlCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2NsYXNzIEZpbGVVdGlsVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9sb2coc2VsZiwgbXNnLCAqYXJncyk6CisgICAgICAgIGlmIGxlbihhcmdzKSA+IDA6CisgICAgICAgICAgICBzZWxmLl9sb2dzLmFwcGVuZChtc2cgJSBhcmdzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbG9ncy5hcHBlbmQobXNnKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihGaWxlVXRpbFRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYuX2xvZ3MgPSBbXQorICAgICAgICBzZWxmLm9sZF9sb2cgPSBsb2cuaW5mbworICAgICAgICBsb2cuaW5mbyA9IHNlbGYuX2xvZworICAgICAgICB0bXBfZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi5zb3VyY2UgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgJ2YxJykKKyAgICAgICAgc2VsZi50YXJnZXQgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgJ2YyJykKKyAgICAgICAgc2VsZi50YXJnZXRfZGlyID0gb3MucGF0aC5qb2luKHRtcF9kaXIsICdkMScpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGxvZy5pbmZvID0gc2VsZi5vbGRfbG9nCisgICAgICAgIHN1cGVyKEZpbGVVdGlsVGVzdENhc2UsIHNlbGYpLnRlYXJEb3duKCkKKworICAgIGRlZiB0ZXN0X21vdmVfZmlsZV92ZXJib3NpdHkoc2VsZik6CisgICAgICAgIGYgPSBvcGVuKHNlbGYuc291cmNlLCAndycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoJ3NvbWUgY29udGVudCcpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBtb3ZlX2ZpbGUoc2VsZi5zb3VyY2UsIHNlbGYudGFyZ2V0LCB2ZXJib3NlPTApCisgICAgICAgIHdhbnRlZCA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fbG9ncywgd2FudGVkKQorCisgICAgICAgICMgYmFjayB0byBvcmlnaW5hbCBzdGF0ZQorICAgICAgICBtb3ZlX2ZpbGUoc2VsZi50YXJnZXQsIHNlbGYuc291cmNlLCB2ZXJib3NlPTApCisKKyAgICAgICAgbW92ZV9maWxlKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldCwgdmVyYm9zZT0xKQorICAgICAgICB3YW50ZWQgPSBbJ21vdmluZyAlcyAtPiAlcycgJSAoc2VsZi5zb3VyY2UsIHNlbGYudGFyZ2V0KV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9sb2dzLCB3YW50ZWQpCisKKyAgICAgICAgIyBiYWNrIHRvIG9yaWdpbmFsIHN0YXRlCisgICAgICAgIG1vdmVfZmlsZShzZWxmLnRhcmdldCwgc2VsZi5zb3VyY2UsIHZlcmJvc2U9MCkKKworICAgICAgICBzZWxmLl9sb2dzID0gW10KKyAgICAgICAgIyBub3cgdGhlIHRhcmdldCBpcyBhIGRpcgorICAgICAgICBvcy5ta2RpcihzZWxmLnRhcmdldF9kaXIpCisgICAgICAgIG1vdmVfZmlsZShzZWxmLnNvdXJjZSwgc2VsZi50YXJnZXRfZGlyLCB2ZXJib3NlPTEpCisgICAgICAgIHdhbnRlZCA9IFsnbW92aW5nICVzIC0+ICVzJyAlIChzZWxmLnNvdXJjZSwgc2VsZi50YXJnZXRfZGlyKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9sb2dzLCB3YW50ZWQpCisKKyAgICBkZWYgdGVzdF93cml0ZV9maWxlKHNlbGYpOgorICAgICAgICBsaW5lcyA9IFsnYScsICdiJywgJ2MnXQorICAgICAgICBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBmb28gPSBvcy5wYXRoLmpvaW4oZGlyLCAnZm9vJykKKyAgICAgICAgd3JpdGVfZmlsZShmb28sIGxpbmVzKQorICAgICAgICBjb250ZW50ID0gW2xpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiBvcGVuKGZvbykucmVhZGxpbmVzKCldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udGVudCwgbGluZXMpCisKKyAgICBkZWYgdGVzdF9jb3B5X2ZpbGUoc2VsZik6CisgICAgICAgIHNyY19kaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBmb28gPSBvcy5wYXRoLmpvaW4oc3JjX2RpciwgJ2ZvbycpCisgICAgICAgIHdyaXRlX2ZpbGUoZm9vLCAnY29udGVudCcpCisgICAgICAgIGRzdF9kaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBjb3B5X2ZpbGUoZm9vLCBkc3RfZGlyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGRzdF9kaXIsICdmb28nKSkpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShGaWxlVXRpbFRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVfdXRpbC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVfdXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjODBhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZV91dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVfdXRpbC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVfdXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjODBhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZV91dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVsaXN0LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlbGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWI4OGYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlbGlzdC5weQpAQCAtMCwwICsxLDI5OSBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5maWxlbGlzdC4iIiIKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBkZWJ1ZworZnJvbSBkaXN0dXRpbHMubG9nIGltcG9ydCBXQVJOCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1RlbXBsYXRlRXJyb3IKK2Zyb20gZGlzdHV0aWxzLmZpbGVsaXN0IGltcG9ydCBnbG9iX3RvX3JlLCB0cmFuc2xhdGVfcGF0dGVybiwgRmlsZUxpc3QKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0LCBydW5fdW5pdHRlc3QKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CisKK01BTklGRVNUX0lOID0gIiIiXAoraW5jbHVkZSBvaworaW5jbHVkZSB4bworZXhjbHVkZSB4bworaW5jbHVkZSBmb28udG1wCitpbmNsdWRlIGJ1aWxkb3V0LmNmZworZ2xvYmFsLWluY2x1ZGUgKi54CitnbG9iYWwtaW5jbHVkZSAqLnR4dAorZ2xvYmFsLWV4Y2x1ZGUgKi50bXAKK3JlY3Vyc2l2ZS1pbmNsdWRlIGYgKi5vbworcmVjdXJzaXZlLWV4Y2x1ZGUgZ2xvYmFsICoueAorZ3JhZnQgZGlyCitwcnVuZSBkaXIzCisiIiIKKworCitkZWYgbWFrZV9sb2NhbF9wYXRoKHMpOgorICAgICIiIkNvbnZlcnRzICcvJyBpbiBhIHN0cmluZyB0byBvcy5zZXAiIiIKKyAgICByZXR1cm4gcy5yZXBsYWNlKCcvJywgb3Muc2VwKQorCisKK2NsYXNzIEZpbGVMaXN0VGVzdENhc2Uoc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBhc3NlcnROb1dhcm5pbmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X2xvZ3MoV0FSTiksIFtdKQorICAgICAgICBzZWxmLmNsZWFyX2xvZ3MoKQorCisgICAgZGVmIGFzc2VydFdhcm5pbmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIobGVuKHNlbGYuZ2V0X2xvZ3MoV0FSTikpLCAwKQorICAgICAgICBzZWxmLmNsZWFyX2xvZ3MoKQorCisgICAgZGVmIHRlc3RfZ2xvYl90b19yZShzZWxmKToKKyAgICAgICAgc2VwID0gb3Muc2VwCisgICAgICAgIGlmIG9zLnNlcCA9PSAnXFwnOgorICAgICAgICAgICAgc2VwID0gcmUuZXNjYXBlKG9zLnNlcCkKKworICAgICAgICBmb3IgZ2xvYiwgcmVnZXggaW4gKAorICAgICAgICAgICAgIyBzaW1wbGUgY2FzZXMKKyAgICAgICAgICAgICgnZm9vKicsIHInZm9vW14lKHNlcClzXSpcWig/bXMpJyksCisgICAgICAgICAgICAoJ2Zvbz8nLCByJ2Zvb1teJShzZXApc11cWig/bXMpJyksCisgICAgICAgICAgICAoJ2Zvbz8/Jywgcidmb29bXiUoc2VwKXNdW14lKHNlcClzXVxaKD9tcyknKSwKKyAgICAgICAgICAgICMgc3BlY2lhbCBjYXNlcworICAgICAgICAgICAgKHInZm9vXFwqJywgcidmb29cXFxcW14lKHNlcClzXSpcWig/bXMpJyksCisgICAgICAgICAgICAocidmb29cXFwqJywgcidmb29cXFxcXFxbXiUoc2VwKXNdKlxaKD9tcyknKSwKKyAgICAgICAgICAgICgnZm9vPz8/PycsIHInZm9vW14lKHNlcClzXVteJShzZXApc11bXiUoc2VwKXNdW14lKHNlcClzXVxaKD9tcyknKSwKKyAgICAgICAgICAgIChyJ2Zvb1xcPz8nLCByJ2Zvb1xcXFxbXiUoc2VwKXNdW14lKHNlcClzXVxaKD9tcyknKSk6CisgICAgICAgICAgICByZWdleCA9IHJlZ2V4ICUgeydzZXAnOiBzZXB9CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdsb2JfdG9fcmUoZ2xvYiksIHJlZ2V4KQorCisgICAgZGVmIHRlc3RfcHJvY2Vzc190ZW1wbGF0ZV9saW5lKHNlbGYpOgorICAgICAgICAjIHRlc3RpbmcgIGFsbCBNQU5JRkVTVC5pbiB0ZW1wbGF0ZSBwYXR0ZXJucworICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIGwgPSBtYWtlX2xvY2FsX3BhdGgKKworICAgICAgICAjIHNpbXVsYXRlZCBmaWxlIGxpc3QKKyAgICAgICAgZmlsZV9saXN0LmFsbGZpbGVzID0gWydmb28udG1wJywgJ29rJywgJ3hvJywgJ2ZvdXIudHh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWlsZG91dC5jZmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmaWxlbGlzdCBkb2VzIG5vdCBmaWx0ZXIgb3V0IFZDUyBkaXJlY3RvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaXQncyBzZGlzdCB0aGF0IGRvZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJy5oZy9sYXN0LW1lc3NhZ2UudHh0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsKCdnbG9iYWwvb25lLnR4dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZ2xvYmFsL3R3by50eHQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2dsb2JhbC9maWxlcy54JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsKCdnbG9iYWwvaGVyZS50bXAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2Yvby9mLm9vJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsKCdkaXIvZ3JhZnQtb25lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsKCdkaXIvZGlyMi9ncmFmdDInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2RpcjMvb2snKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2RpcjMvc3ViL29rLnR4dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgICAgICAgZm9yIGxpbmUgaW4gTUFOSUZFU1RfSU4uc3BsaXQoJ1xuJyk6CisgICAgICAgICAgICBpZiBsaW5lLnN0cmlwKCkgPT0gJyc6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUobGluZSkKKworICAgICAgICB3YW50ZWQgPSBbJ29rJywKKyAgICAgICAgICAgICAgICAgICdidWlsZG91dC5jZmcnLAorICAgICAgICAgICAgICAgICAgJ2ZvdXIudHh0JywKKyAgICAgICAgICAgICAgICAgIGwoJy5oZy9sYXN0LW1lc3NhZ2UudHh0JyksCisgICAgICAgICAgICAgICAgICBsKCdnbG9iYWwvb25lLnR4dCcpLAorICAgICAgICAgICAgICAgICAgbCgnZ2xvYmFsL3R3by50eHQnKSwKKyAgICAgICAgICAgICAgICAgIGwoJ2Yvby9mLm9vJyksCisgICAgICAgICAgICAgICAgICBsKCdkaXIvZ3JhZnQtb25lJyksCisgICAgICAgICAgICAgICAgICBsKCdkaXIvZGlyMi9ncmFmdDInKSwKKyAgICAgICAgICAgICAgICAgXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCB3YW50ZWQpCisKKyAgICBkZWYgdGVzdF9kZWJ1Z19wcmludChzZWxmKToKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKKyAgICAgICAgICAgIGZpbGVfbGlzdC5kZWJ1Z19wcmludCgneHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQuZ2V0dmFsdWUoKSwgJycpCisKKyAgICAgICAgZGVidWcuREVCVUcgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgorICAgICAgICAgICAgICAgIGZpbGVfbGlzdC5kZWJ1Z19wcmludCgneHh4JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LmdldHZhbHVlKCksICd4eHhcbicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWJ1Zy5ERUJVRyA9IEZhbHNlCisKKyAgICBkZWYgdGVzdF9zZXRfYWxsZmlsZXMoc2VsZik6CisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgZmlsZXMgPSBbJ2EnLCAnYicsICdjJ10KKyAgICAgICAgZmlsZV9saXN0LnNldF9hbGxmaWxlcyhmaWxlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuYWxsZmlsZXMsIGZpbGVzKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlX2R1cGxpY2F0ZXMoc2VsZik6CisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgZmlsZV9saXN0LmZpbGVzID0gWydhJywgJ2InLCAnYScsICdnJywgJ2MnLCAnZyddCisgICAgICAgICMgZmlsZXMgbXVzdCBiZSBzb3J0ZWQgYmVmb3JlaGFuZCAoc2Rpc3QgZG9lcyBpdCkKKyAgICAgICAgZmlsZV9saXN0LnNvcnQoKQorICAgICAgICBmaWxlX2xpc3QucmVtb3ZlX2R1cGxpY2F0ZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhJywgJ2InLCAnYycsICdnJ10pCisKKyAgICBkZWYgdGVzdF90cmFuc2xhdGVfcGF0dGVybihzZWxmKToKKyAgICAgICAgIyBub3QgcmVnZXgKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoCisgICAgICAgICAgICB0cmFuc2xhdGVfcGF0dGVybignYScsIGFuY2hvcj1UcnVlLCBpc19yZWdleD1GYWxzZSksCisgICAgICAgICAgICAnc2VhcmNoJykpCisKKyAgICAgICAgIyBpcyBhIHJlZ2V4CisgICAgICAgIHJlZ2V4ID0gcmUuY29tcGlsZSgnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB0cmFuc2xhdGVfcGF0dGVybihyZWdleCwgYW5jaG9yPVRydWUsIGlzX3JlZ2V4PVRydWUpLAorICAgICAgICAgICAgcmVnZXgpCisKKyAgICAgICAgIyBwbGFpbiBzdHJpbmcgZmxhZ2dlZCBhcyByZWdleAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cigKKyAgICAgICAgICAgIHRyYW5zbGF0ZV9wYXR0ZXJuKCdhJywgYW5jaG9yPVRydWUsIGlzX3JlZ2V4PVRydWUpLAorICAgICAgICAgICAgJ3NlYXJjaCcpKQorCisgICAgICAgICMgZ2xvYiBzdXBwb3J0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cmFuc2xhdGVfcGF0dGVybigKKyAgICAgICAgICAgICcqLnB5JywgYW5jaG9yPVRydWUsIGlzX3JlZ2V4PUZhbHNlKS5zZWFyY2goJ2ZpbGVsaXN0LnB5JykpCisKKyAgICBkZWYgdGVzdF9leGNsdWRlX3BhdHRlcm4oc2VsZik6CisgICAgICAgICMgcmV0dXJuIEZhbHNlIGlmIG5vIG1hdGNoCisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmaWxlX2xpc3QuZXhjbHVkZV9wYXR0ZXJuKCcqLnB5JykpCisKKyAgICAgICAgIyByZXR1cm4gVHJ1ZSBpZiBmaWxlcyBtYXRjaAorICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIGZpbGVfbGlzdC5maWxlcyA9IFsnYS5weScsICdiLnB5J10KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVfbGlzdC5leGNsdWRlX3BhdHRlcm4oJyoucHknKSkKKworICAgICAgICAjIHRlc3QgZXhjbHVkZXMKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBmaWxlX2xpc3QuZmlsZXMgPSBbJ2EucHknLCAnYS50eHQnXQorICAgICAgICBmaWxlX2xpc3QuZXhjbHVkZV9wYXR0ZXJuKCcqLnB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnYS50eHQnXSkKKworICAgIGRlZiB0ZXN0X2luY2x1ZGVfcGF0dGVybihzZWxmKToKKyAgICAgICAgIyByZXR1cm4gRmFsc2UgaWYgbm8gbWF0Y2gKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBmaWxlX2xpc3Quc2V0X2FsbGZpbGVzKFtdKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpbGVfbGlzdC5pbmNsdWRlX3BhdHRlcm4oJyoucHknKSkKKworICAgICAgICAjIHJldHVybiBUcnVlIGlmIGZpbGVzIG1hdGNoCisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgZmlsZV9saXN0LnNldF9hbGxmaWxlcyhbJ2EucHknLCAnYi50eHQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVfbGlzdC5pbmNsdWRlX3BhdHRlcm4oJyoucHknKSkKKworICAgICAgICAjIHRlc3QgKiBtYXRjaGVzIGFsbCBmaWxlcworICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGZpbGVfbGlzdC5hbGxmaWxlcykKKyAgICAgICAgZmlsZV9saXN0LnNldF9hbGxmaWxlcyhbJ2EucHknLCAnYi50eHQnXSkKKyAgICAgICAgZmlsZV9saXN0LmluY2x1ZGVfcGF0dGVybignKicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmFsbGZpbGVzLCBbJ2EucHknLCAnYi50eHQnXSkKKworICAgIGRlZiB0ZXN0X3Byb2Nlc3NfdGVtcGxhdGUoc2VsZik6CisgICAgICAgIGwgPSBtYWtlX2xvY2FsX3BhdGgKKyAgICAgICAgIyBpbnZhbGlkIGxpbmVzCisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgZm9yIGFjdGlvbiBpbiAoJ2luY2x1ZGUnLCAnZXhjbHVkZScsICdnbG9iYWwtaW5jbHVkZScsCisgICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwtZXhjbHVkZScsICdyZWN1cnNpdmUtaW5jbHVkZScsCisgICAgICAgICAgICAgICAgICAgICAgICdyZWN1cnNpdmUtZXhjbHVkZScsICdncmFmdCcsICdwcnVuZScsICdibGFyZycpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzVGVtcGxhdGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUsIGFjdGlvbikKKworICAgICAgICAjIGluY2x1ZGUKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBmaWxlX2xpc3Quc2V0X2FsbGZpbGVzKFsnYS5weScsICdiLnR4dCcsIGwoJ2QvYy5weScpXSkKKworICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdpbmNsdWRlICoucHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5J10pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm9XYXJuaW5ncygpCisKKyAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgnaW5jbHVkZSAqLnJiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnYS5weSddKQorICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmdzKCkKKworICAgICAgICAjIGV4Y2x1ZGUKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBmaWxlX2xpc3QuZmlsZXMgPSBbJ2EucHknLCAnYi50eHQnLCBsKCdkL2MucHknKV0KKworICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdleGNsdWRlICoucHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydiLnR4dCcsIGwoJ2QvYy5weScpXSkKKyAgICAgICAgc2VsZi5hc3NlcnROb1dhcm5pbmdzKCkKKworICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdleGNsdWRlICoucmInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydiLnR4dCcsIGwoJ2QvYy5weScpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5ncygpCisKKyAgICAgICAgIyBnbG9iYWwtaW5jbHVkZQorICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIGZpbGVfbGlzdC5zZXRfYWxsZmlsZXMoWydhLnB5JywgJ2IudHh0JywgbCgnZC9jLnB5JyldKQorCisgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ2dsb2JhbC1pbmNsdWRlICoucHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5JywgbCgnZC9jLnB5JyldKQorICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZ3MoKQorCisgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ2dsb2JhbC1pbmNsdWRlICoucmInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5JywgbCgnZC9jLnB5JyldKQorICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmdzKCkKKworICAgICAgICAjIGdsb2JhbC1leGNsdWRlCisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgZmlsZV9saXN0LmZpbGVzID0gWydhLnB5JywgJ2IudHh0JywgbCgnZC9jLnB5JyldCisKKyAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgnZ2xvYmFsLWV4Y2x1ZGUgKi5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2IudHh0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm9XYXJuaW5ncygpCisKKyAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgnZ2xvYmFsLWV4Y2x1ZGUgKi5yYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2IudHh0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZ3MoKQorCisgICAgICAgICMgcmVjdXJzaXZlLWluY2x1ZGUKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBmaWxlX2xpc3Quc2V0X2FsbGZpbGVzKFsnYS5weScsIGwoJ2QvYi5weScpLCBsKCdkL2MudHh0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2QvZC9lLnB5JyldKQorCisgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ3JlY3Vyc2l2ZS1pbmNsdWRlIGQgKi5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbbCgnZC9iLnB5JyksIGwoJ2QvZC9lLnB5JyldKQorICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZ3MoKQorCisgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ3JlY3Vyc2l2ZS1pbmNsdWRlIGUgKi5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbbCgnZC9iLnB5JyksIGwoJ2QvZC9lLnB5JyldKQorICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmdzKCkKKworICAgICAgICAjIHJlY3Vyc2l2ZS1leGNsdWRlCisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgZmlsZV9saXN0LmZpbGVzID0gWydhLnB5JywgbCgnZC9iLnB5JyksIGwoJ2QvYy50eHQnKSwgbCgnZC9kL2UucHknKV0KKworICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdyZWN1cnNpdmUtZXhjbHVkZSBkICoucHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5JywgbCgnZC9jLnR4dCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnROb1dhcm5pbmdzKCkKKworICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdyZWN1cnNpdmUtZXhjbHVkZSBlICoucHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5JywgbCgnZC9jLnR4dCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5ncygpCisKKyAgICAgICAgIyBncmFmdAorICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIGZpbGVfbGlzdC5zZXRfYWxsZmlsZXMoWydhLnB5JywgbCgnZC9iLnB5JyksIGwoJ2QvZC9lLnB5JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2YvZi5weScpXSkKKworICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdncmFmdCBkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFtsKCdkL2IucHknKSwgbCgnZC9kL2UucHknKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm9XYXJuaW5ncygpCisKKyAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgnZ3JhZnQgZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbbCgnZC9iLnB5JyksIGwoJ2QvZC9lLnB5JyldKQorICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmdzKCkKKworICAgICAgICAjIHBydW5lCisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgZmlsZV9saXN0LmZpbGVzID0gWydhLnB5JywgbCgnZC9iLnB5JyksIGwoJ2QvZC9lLnB5JyksIGwoJ2YvZi5weScpXQorCisgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ3BydW5lIGQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5JywgbCgnZi9mLnB5JyldKQorICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZ3MoKQorCisgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ3BydW5lIGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5JywgbCgnZi9mLnB5JyldKQorICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmdzKCkKKworCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoRmlsZUxpc3RUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlbGlzdC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVsaXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmFkYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlbGlzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlbGlzdC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVsaXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmFkYWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlbGlzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTYxNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGwucHkKQEAgLTAsMCArMSwyNDcgQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsLiIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNpdGUKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0LCBydW5fdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsIGltcG9ydCBpbnN0YWxsCitmcm9tIGRpc3R1dGlscy5jb21tYW5kIGltcG9ydCBpbnN0YWxsIGFzIGluc3RhbGxfbW9kdWxlCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0Citmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IElOU1RBTExfU0NIRU1FUworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCitmcm9tIGRpc3R1dGlscy5leHRlbnNpb24gaW1wb3J0IEV4dGVuc2lvbgorCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorCisKK2RlZiBfbWFrZV9leHRfbmFtZShtb2RuYW1lKToKKyAgICBpZiBvcy5uYW1lID09ICdudCcgYW5kIHN5cy5leGVjdXRhYmxlLmVuZHN3aXRoKCdfZC5leGUnKToKKyAgICAgICAgbW9kbmFtZSArPSAnX2QnCisgICAgcmV0dXJuIG1vZG5hbWUgKyBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1NPJykKKworCitjbGFzcyBJbnN0YWxsVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9ob21lX2luc3RhbGxhdGlvbl9zY2hlbWUoc2VsZik6CisgICAgICAgICMgVGhpcyBlbnN1cmUgdHdvIHRoaW5nczoKKyAgICAgICAgIyAtIHRoYXQgLS1ob21lIGdlbmVyYXRlcyB0aGUgZGVzaXJlZCBzZXQgb2YgZGlyZWN0b3J5IG5hbWVzCisgICAgICAgICMgLSB0ZXN0IC0taG9tZSBpcyBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcworICAgICAgICBidWlsZGRpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGRlc3RpbmF0aW9uID0gb3MucGF0aC5qb2luKGJ1aWxkZGlyLCAiaW5zdGFsbGF0aW9uIikKKworICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsibmFtZSI6ICJmb29wa2cifSkKKyAgICAgICAgIyBzY3JpcHRfbmFtZSBuZWVkIG5vdCBleGlzdCwgaXQganVzdCBuZWVkIHRvIGJlIGluaXRpYWxpemVkCisgICAgICAgIGRpc3Quc2NyaXB0X25hbWUgPSBvcy5wYXRoLmpvaW4oYnVpbGRkaXIsICJzZXR1cC5weSIpCisgICAgICAgIGRpc3QuY29tbWFuZF9vYmpbImJ1aWxkIl0gPSBzdXBwb3J0LkR1bW15Q29tbWFuZCgKKyAgICAgICAgICAgIGJ1aWxkX2Jhc2U9YnVpbGRkaXIsCisgICAgICAgICAgICBidWlsZF9saWI9b3MucGF0aC5qb2luKGJ1aWxkZGlyLCAibGliIiksCisgICAgICAgICAgICApCisKKyAgICAgICAgY21kID0gaW5zdGFsbChkaXN0KQorICAgICAgICBjbWQuaG9tZSA9IGRlc3RpbmF0aW9uCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5pbnN0YWxsX2Jhc2UsIGRlc3RpbmF0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5pbnN0YWxsX3BsYXRiYXNlLCBkZXN0aW5hdGlvbikKKworICAgICAgICBkZWYgY2hlY2tfcGF0aChnb3QsIGV4cGVjdGVkKToKKyAgICAgICAgICAgIGdvdCA9IG9zLnBhdGgubm9ybXBhdGgoZ290KQorICAgICAgICAgICAgZXhwZWN0ZWQgPSBvcy5wYXRoLm5vcm1wYXRoKGV4cGVjdGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQorCisgICAgICAgIGxpYmRpciA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbiwgImxpYiIsICJweXRob24iKQorICAgICAgICBjaGVja19wYXRoKGNtZC5pbnN0YWxsX2xpYiwgbGliZGlyKQorICAgICAgICBjaGVja19wYXRoKGNtZC5pbnN0YWxsX3BsYXRsaWIsIGxpYmRpcikKKyAgICAgICAgY2hlY2tfcGF0aChjbWQuaW5zdGFsbF9wdXJlbGliLCBsaWJkaXIpCisgICAgICAgIGNoZWNrX3BhdGgoY21kLmluc3RhbGxfaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZGVzdGluYXRpb24sICJpbmNsdWRlIiwgInB5dGhvbiIsICJmb29wa2ciKSkKKyAgICAgICAgY2hlY2tfcGF0aChjbWQuaW5zdGFsbF9zY3JpcHRzLCBvcy5wYXRoLmpvaW4oZGVzdGluYXRpb24sICJiaW4iKSkKKyAgICAgICAgY2hlY2tfcGF0aChjbWQuaW5zdGFsbF9kYXRhLCBkZXN0aW5hdGlvbikKKworICAgIGRlZiB0ZXN0X3VzZXJfc2l0ZShzZWxmKToKKyAgICAgICAgIyBzaXRlLlVTRVJfU0lURSB3YXMgaW50cm9kdWNlZCBpbiAyLjYKKyAgICAgICAgaWYgc3lzLnZlcnNpb24gPCAnMi42JzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgcHJlcGFyaW5nIHRoZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRlc3QKKyAgICAgICAgc2VsZi5vbGRfdXNlcl9iYXNlID0gc2l0ZS5VU0VSX0JBU0UKKyAgICAgICAgc2VsZi5vbGRfdXNlcl9zaXRlID0gc2l0ZS5VU0VSX1NJVEUKKyAgICAgICAgc2VsZi50bXBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBzZWxmLnVzZXJfYmFzZSA9IG9zLnBhdGguam9pbihzZWxmLnRtcGRpciwgJ0InKQorICAgICAgICBzZWxmLnVzZXJfc2l0ZSA9IG9zLnBhdGguam9pbihzZWxmLnRtcGRpciwgJ1MnKQorICAgICAgICBzaXRlLlVTRVJfQkFTRSA9IHNlbGYudXNlcl9iYXNlCisgICAgICAgIHNpdGUuVVNFUl9TSVRFID0gc2VsZi51c2VyX3NpdGUKKyAgICAgICAgaW5zdGFsbF9tb2R1bGUuVVNFUl9CQVNFID0gc2VsZi51c2VyX2Jhc2UKKyAgICAgICAgaW5zdGFsbF9tb2R1bGUuVVNFUl9TSVRFID0gc2VsZi51c2VyX3NpdGUKKworICAgICAgICBkZWYgX2V4cGFuZHVzZXIocGF0aCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50bXBkaXIKKyAgICAgICAgc2VsZi5vbGRfZXhwYW5kID0gb3MucGF0aC5leHBhbmR1c2VyCisgICAgICAgIG9zLnBhdGguZXhwYW5kdXNlciA9IF9leHBhbmR1c2VyCisKKyAgICAgICAgZGVmIGNsZWFudXAoKToKKyAgICAgICAgICAgIHNpdGUuVVNFUl9CQVNFID0gc2VsZi5vbGRfdXNlcl9iYXNlCisgICAgICAgICAgICBzaXRlLlVTRVJfU0lURSA9IHNlbGYub2xkX3VzZXJfc2l0ZQorICAgICAgICAgICAgaW5zdGFsbF9tb2R1bGUuVVNFUl9CQVNFID0gc2VsZi5vbGRfdXNlcl9iYXNlCisgICAgICAgICAgICBpbnN0YWxsX21vZHVsZS5VU0VSX1NJVEUgPSBzZWxmLm9sZF91c2VyX3NpdGUKKyAgICAgICAgICAgIG9zLnBhdGguZXhwYW5kdXNlciA9IHNlbGYub2xkX2V4cGFuZAorCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChjbGVhbnVwKQorCisgICAgICAgIGZvciBrZXkgaW4gKCdudF91c2VyJywgJ3VuaXhfdXNlcicsICdvczJfaG9tZScpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihrZXksIElOU1RBTExfU0NIRU1FUykKKworICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsnbmFtZSc6ICd4eCd9KQorICAgICAgICBjbWQgPSBpbnN0YWxsKGRpc3QpCisKKyAgICAgICAgIyBtYWtpbmcgc3VyZSB0aGUgdXNlciBvcHRpb24gaXMgdGhlcmUKKyAgICAgICAgb3B0aW9ucyA9IFtuYW1lIGZvciBuYW1lLCBzaG9ydCwgbGFibGUgaW4KKyAgICAgICAgICAgICAgICAgICBjbWQudXNlcl9vcHRpb25zXQorICAgICAgICBzZWxmLmFzc2VydEluKCd1c2VyJywgb3B0aW9ucykKKworICAgICAgICAjIHNldHRpbmcgYSB2YWx1ZQorICAgICAgICBjbWQudXNlciA9IDEKKworICAgICAgICAjIHVzZXIgYmFzZSBhbmQgc2l0ZSBzaG91bGRuJ3QgYmUgY3JlYXRlZCB5ZXQKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfYmFzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoc2VsZi51c2VyX3NpdGUpKQorCisgICAgICAgICMgbGV0J3MgcnVuIGZpbmFsaXplCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKworICAgICAgICAjIG5vdyB0aGV5IHNob3VsZAorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2VsZi51c2VyX2Jhc2UpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2VsZi51c2VyX3NpdGUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzZXJiYXNlJywgY21kLmNvbmZpZ192YXJzKQorICAgICAgICBzZWxmLmFzc2VydEluKCd1c2Vyc2l0ZScsIGNtZC5jb25maWdfdmFycykKKworICAgIGRlZiB0ZXN0X2hhbmRsZV9leHRyYV9wYXRoKHNlbGYpOgorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsnbmFtZSc6ICd4eCcsICdleHRyYV9wYXRoJzogJ3BhdGgsZGlycyd9KQorICAgICAgICBjbWQgPSBpbnN0YWxsKGRpc3QpCisKKyAgICAgICAgIyB0d28gZWxlbWVudHMKKyAgICAgICAgY21kLmhhbmRsZV9leHRyYV9wYXRoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZXh0cmFfcGF0aCwgWydwYXRoJywgJ2RpcnMnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZXh0cmFfZGlycywgJ2RpcnMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5wYXRoX2ZpbGUsICdwYXRoJykKKworICAgICAgICAjIG9uZSBlbGVtZW50CisgICAgICAgIGNtZC5leHRyYV9wYXRoID0gWydwYXRoJ10KKyAgICAgICAgY21kLmhhbmRsZV9leHRyYV9wYXRoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZXh0cmFfcGF0aCwgWydwYXRoJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmV4dHJhX2RpcnMsICdwYXRoJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQucGF0aF9maWxlLCAncGF0aCcpCisKKyAgICAgICAgIyBub25lCisgICAgICAgIGRpc3QuZXh0cmFfcGF0aCA9IGNtZC5leHRyYV9wYXRoID0gTm9uZQorICAgICAgICBjbWQuaGFuZGxlX2V4dHJhX3BhdGgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5leHRyYV9wYXRoLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5leHRyYV9kaXJzLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQucGF0aF9maWxlLCBOb25lKQorCisgICAgICAgICMgdGhyZWUgZWxlbWVudHMgKG5vIHdheSAhKQorICAgICAgICBjbWQuZXh0cmFfcGF0aCA9ICdwYXRoLGRpcnMsYWdhaW4nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCBjbWQuaGFuZGxlX2V4dHJhX3BhdGgpCisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsnbmFtZSc6ICd4eCd9KQorICAgICAgICBjbWQgPSBpbnN0YWxsKGRpc3QpCisKKyAgICAgICAgIyBtdXN0IHN1cHBseSBlaXRoZXIgcHJlZml4L2V4ZWMtcHJlZml4L2hvbWUgb3IKKyAgICAgICAgIyBpbnN0YWxsLWJhc2UvaW5zdGFsbC1wbGF0YmFzZSAtLSBub3QgYm90aAorICAgICAgICBjbWQucHJlZml4ID0gJ3ByZWZpeCcKKyAgICAgICAgY21kLmluc3RhbGxfYmFzZSA9ICdiYXNlJworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNPcHRpb25FcnJvciwgY21kLmZpbmFsaXplX29wdGlvbnMpCisKKyAgICAgICAgIyBtdXN0IHN1cHBseSBlaXRoZXIgaG9tZSBvciBwcmVmaXgvZXhlYy1wcmVmaXggLS0gbm90IGJvdGgKKyAgICAgICAgY21kLmluc3RhbGxfYmFzZSA9IE5vbmUKKyAgICAgICAgY21kLmhvbWUgPSAnaG9tZScKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIGNtZC5maW5hbGl6ZV9vcHRpb25zKQorCisgICAgICAgICMgY2FuJ3QgY29tYmluZSB1c2VyIHdpdGggcHJlZml4L2V4ZWNfcHJlZml4L2hvbWUgb3IKKyAgICAgICAgIyBpbnN0YWxsXyhwbGF0KWJhc2UKKyAgICAgICAgY21kLnByZWZpeCA9IE5vbmUKKyAgICAgICAgY21kLnVzZXIgPSAndXNlcicKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIGNtZC5maW5hbGl6ZV9vcHRpb25zKQorCisgICAgZGVmIHRlc3RfcmVjb3JkKHNlbGYpOgorICAgICAgICBpbnN0YWxsX2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHByb2plY3RfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdChweV9tb2R1bGVzPVsnaGVsbG8nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdHM9WydzYXloaSddKQorICAgICAgICBvcy5jaGRpcihwcm9qZWN0X2RpcikKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKCdoZWxsby5weScsICJkZWYgbWFpbigpOiBwcmludCAnbyBoYWknIikKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKCdzYXloaScsICdmcm9tIGhlbGxvIGltcG9ydCBtYWluOyBtYWluKCknKQorCisgICAgICAgIGNtZCA9IGluc3RhbGwoZGlzdCkKKyAgICAgICAgZGlzdC5jb21tYW5kX29ialsnaW5zdGFsbCddID0gY21kCisgICAgICAgIGNtZC5yb290ID0gaW5zdGFsbF9kaXIKKyAgICAgICAgY21kLnJlY29yZCA9IG9zLnBhdGguam9pbihwcm9qZWN0X2RpciwgJ2ZpbGVsaXN0JykKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICBmID0gb3BlbihjbWQucmVjb3JkKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb250ZW50ID0gZi5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGZvdW5kID0gW29zLnBhdGguYmFzZW5hbWUobGluZSkgZm9yIGxpbmUgaW4gY29udGVudC5zcGxpdGxpbmVzKCldCisgICAgICAgIGV4cGVjdGVkID0gWydoZWxsby5weScsICdoZWxsby5weWMnLCAnc2F5aGknLAorICAgICAgICAgICAgICAgICAgICAnVU5LTk9XTi0wLjAuMC1weSVzLiVzLmVnZy1pbmZvJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvdW5kLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3JlY29yZF9leHRlbnNpb25zKHNlbGYpOgorICAgICAgICBpbnN0YWxsX2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHByb2plY3RfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdChleHRfbW9kdWxlcz1bCisgICAgICAgICAgICBFeHRlbnNpb24oJ3h4JywgWyd4eG1vZHVsZS5jJ10pXSkKKyAgICAgICAgb3MuY2hkaXIocHJvamVjdF9kaXIpCisgICAgICAgIHN1cHBvcnQuY29weV94eG1vZHVsZV9jKHByb2plY3RfZGlyKQorCisgICAgICAgIGJ1aWxkZXh0Y21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIHN1cHBvcnQuZml4dXBfYnVpbGRfZXh0KGJ1aWxkZXh0Y21kKQorICAgICAgICBidWlsZGV4dGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKworICAgICAgICBjbWQgPSBpbnN0YWxsKGRpc3QpCisgICAgICAgIGRpc3QuY29tbWFuZF9vYmpbJ2luc3RhbGwnXSA9IGNtZAorICAgICAgICBkaXN0LmNvbW1hbmRfb2JqWydidWlsZF9leHQnXSA9IGJ1aWxkZXh0Y21kCisgICAgICAgIGNtZC5yb290ID0gaW5zdGFsbF9kaXIKKyAgICAgICAgY21kLnJlY29yZCA9IG9zLnBhdGguam9pbihwcm9qZWN0X2RpciwgJ2ZpbGVsaXN0JykKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICBmID0gb3BlbihjbWQucmVjb3JkKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb250ZW50ID0gZi5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGZvdW5kID0gW29zLnBhdGguYmFzZW5hbWUobGluZSkgZm9yIGxpbmUgaW4gY29udGVudC5zcGxpdGxpbmVzKCldCisgICAgICAgIGV4cGVjdGVkID0gW19tYWtlX2V4dF9uYW1lKCd4eCcpLAorICAgICAgICAgICAgICAgICAgICAnVU5LTk9XTi0wLjAuMC1weSVzLiVzLmVnZy1pbmZvJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvdW5kLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2RlYnVnX21vZGUoc2VsZik6CisgICAgICAgICMgdGhpcyBjb3ZlcnMgdGhlIGNvZGUgY2FsbGVkIHdoZW4gREVCVUcgaXMgc2V0CisgICAgICAgIG9sZF9sb2dzX2xlbiA9IGxlbihzZWxmLmxvZ3MpCisgICAgICAgIGluc3RhbGxfbW9kdWxlLkRFQlVHID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpOgorICAgICAgICAgICAgICAgIHNlbGYudGVzdF9yZWNvcmQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaW5zdGFsbF9tb2R1bGUuREVCVUcgPSBGYWxzZQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubG9ncykgPiBvbGRfbG9nc19sZW4pCisKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEluc3RhbGxUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllNmYwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllNmYwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Nzc1Njk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHkKQEAgLTAsMCArMSw3NyBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfZGF0YS4iIiIKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgZ2V0cGFzcworCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfZGF0YSBpbXBvcnQgaW5zdGFsbF9kYXRhCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2NsYXNzIEluc3RhbGxEYXRhVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuRW52aXJvbkd1YXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zaW1wbGVfcnVuKHNlbGYpOgorICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGluc3RhbGxfZGF0YShkaXN0KQorICAgICAgICBjbWQuaW5zdGFsbF9kaXIgPSBpbnN0ID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdpbnN0JykKKworICAgICAgICAjIGRhdGFfZmlsZXMgY2FuIGNvbnRhaW4KKyAgICAgICAgIyAgLSBzaW1wbGUgZmlsZXMKKyAgICAgICAgIyAgLSBhIHR1cGxlIHdpdGggYSBwYXRoLCBhbmQgYSBsaXN0IG9mIGZpbGUKKyAgICAgICAgb25lID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdvbmUnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUob25lLCAneHh4JykKKyAgICAgICAgaW5zdDIgPSBvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ2luc3QyJykKKyAgICAgICAgdHdvID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICd0d28nKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUodHdvLCAneHh4JykKKworICAgICAgICBjbWQuZGF0YV9maWxlcyA9IFtvbmUsIChpbnN0MiwgW3R3b10pXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5nZXRfaW5wdXRzKCksIFtvbmUsIChpbnN0MiwgW3R3b10pXSkKKworICAgICAgICAjIGxldCdzIHJ1biB0aGUgY29tbWFuZAorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgICMgbGV0J3MgY2hlY2sgdGhlIHJlc3VsdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjbWQuZ2V0X291dHB1dHMoKSksIDIpCisgICAgICAgIHJ0d28gPSBvcy5wYXRoLnNwbGl0KHR3bylbLTFdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oaW5zdDIsIHJ0d28pKSkKKyAgICAgICAgcm9uZSA9IG9zLnBhdGguc3BsaXQob25lKVstMV0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0LCByb25lKSkpCisgICAgICAgIGNtZC5vdXRmaWxlcyA9IFtdCisKKyAgICAgICAgIyBsZXQncyB0cnkgd2l0aCB3YXJuX2RpciBvbmUKKyAgICAgICAgY21kLndhcm5fZGlyID0gMQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgICMgbGV0J3MgY2hlY2sgdGhlIHJlc3VsdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjbWQuZ2V0X291dHB1dHMoKSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oaW5zdDIsIHJ0d28pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0LCByb25lKSkpCisgICAgICAgIGNtZC5vdXRmaWxlcyA9IFtdCisKKyAgICAgICAgIyBub3cgdXNpbmcgcm9vdCBhbmQgZW1wdHkgZGlyCisgICAgICAgIGNtZC5yb290ID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdyb290JykKKyAgICAgICAgaW5zdDMgPSBvcy5wYXRoLmpvaW4oY21kLmluc3RhbGxfZGlyLCAnaW5zdDMnKQorICAgICAgICBpbnN0NCA9IG9zLnBhdGguam9pbihwa2dfZGlyLCAnaW5zdDQnKQorICAgICAgICB0aHJlZSA9IG9zLnBhdGguam9pbihjbWQuaW5zdGFsbF9kaXIsICd0aHJlZScpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSh0aHJlZSwgJ3h4JykKKyAgICAgICAgY21kLmRhdGFfZmlsZXMgPSBbb25lLCAoaW5zdDIsIFt0d29dKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbnN0MycsIFt0aHJlZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5zdDQsIFtdKV0KKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICAjIGxldCdzIGNoZWNrIHRoZSByZXN1bHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY21kLmdldF9vdXRwdXRzKCkpLCA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QyLCBydHdvKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oaW5zdCwgcm9uZSkpKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoSW5zdGFsbERhdGFUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmQxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmQxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2hlYWRlcnMucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfaGVhZGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzcyMjRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2hlYWRlcnMucHkKQEAgLTAsMCArMSw0MSBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfaGVhZGVycy4iIiIKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgZ2V0cGFzcworCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfaGVhZGVycyBpbXBvcnQgaW5zdGFsbF9oZWFkZXJzCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2NsYXNzIEluc3RhbGxIZWFkZXJzVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuRW52aXJvbkd1YXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zaW1wbGVfcnVuKHNlbGYpOgorICAgICAgICAjIHdlIGhhdmUgdHdvIGhlYWRlcnMKKyAgICAgICAgaGVhZGVyX2xpc3QgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBoZWFkZXIxID0gb3MucGF0aC5qb2luKGhlYWRlcl9saXN0LCAnaGVhZGVyMScpCisgICAgICAgIGhlYWRlcjIgPSBvcy5wYXRoLmpvaW4oaGVhZGVyX2xpc3QsICdoZWFkZXIyJykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKGhlYWRlcjEpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShoZWFkZXIyKQorICAgICAgICBoZWFkZXJzID0gW2hlYWRlcjEsIGhlYWRlcjJdCisKKyAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoaGVhZGVycz1oZWFkZXJzKQorICAgICAgICBjbWQgPSBpbnN0YWxsX2hlYWRlcnMoZGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZ2V0X2lucHV0cygpLCBoZWFkZXJzKQorCisgICAgICAgICMgbGV0J3MgcnVuIHRoZSBjb21tYW5kCisgICAgICAgIGNtZC5pbnN0YWxsX2RpciA9IG9zLnBhdGguam9pbihwa2dfZGlyLCAnaW5zdCcpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgIyBsZXQncyBjaGVjayB0aGUgcmVzdWx0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjbWQuZ2V0X291dHB1dHMoKSksIDIpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShJbnN0YWxsSGVhZGVyc1Rlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfaGVhZGVycy5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfaGVhZGVycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2ZDg0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfaGVhZGVycy5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfaGVhZGVycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2ZDg0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfbGliLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2xpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDg2MzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2xpYi5weQpAQCAtMCwwICsxLDEwNyBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfZGF0YS4iIiIKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9saWIgaW1wb3J0IGluc3RhbGxfbGliCitmcm9tIGRpc3R1dGlscy5leHRlbnNpb24gaW1wb3J0IEV4dGVuc2lvbgorZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitjbGFzcyBJbnN0YWxsTGliVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkVudmlyb25HdWFyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGluc3RhbGxfbGliKGRpc3QpCisKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5jb21waWxlLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5vcHRpbWl6ZSwgMCkKKworICAgICAgICAjIG9wdGltaXplIG11c3QgYmUgMCwgMSwgb3IgMgorICAgICAgICBjbWQub3B0aW1pemUgPSAnZm9vJworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNPcHRpb25FcnJvciwgY21kLmZpbmFsaXplX29wdGlvbnMpCisgICAgICAgIGNtZC5vcHRpbWl6ZSA9ICc0JworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNPcHRpb25FcnJvciwgY21kLmZpbmFsaXplX29wdGlvbnMpCisKKyAgICAgICAgY21kLm9wdGltaXplID0gJzInCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQub3B0aW1pemUsIDIpCisKKyAgICBkZWYgX3NldHVwX2J5dGVfY29tcGlsZShzZWxmKToKKyAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBjbWQgPSBpbnN0YWxsX2xpYihkaXN0KQorICAgICAgICBjbWQuY29tcGlsZSA9IGNtZC5vcHRpbWl6ZSA9IDEKKworICAgICAgICBmID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdmb28ucHknKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZiwgJyMgcHl0aG9uIGZpbGUnKQorICAgICAgICBjbWQuYnl0ZV9jb21waWxlKFtmXSkKKyAgICAgICAgcmV0dXJuIHBrZ19kaXIKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUsICdieXRlLWNvbXBpbGUgbm90IGVuYWJsZWQnKQorICAgIGRlZiB0ZXN0X2J5dGVfY29tcGlsZShzZWxmKToKKyAgICAgICAgcGtnX2RpciA9IHNlbGYuX3NldHVwX2J5dGVfY29tcGlsZSgpCisgICAgICAgIGlmIHN5cy5mbGFncy5vcHRpbWl6ZSA8IDE6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHBrZ19kaXIsICdmb28ucHljJykpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZm9vLnB5bycpKSkKKworICAgIGRlZiB0ZXN0X2dldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGluc3RhbGxfbGliKGRpc3QpCisKKyAgICAgICAgIyBzZXR0aW5nIHVwIGEgZGlzdCBlbnZpcm9ubWVudAorICAgICAgICBjbWQuY29tcGlsZSA9IGNtZC5vcHRpbWl6ZSA9IDEKKyAgICAgICAgY21kLmluc3RhbGxfZGlyID0gcGtnX2RpcgorICAgICAgICBmID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdmb28ucHknKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZiwgJyMgcHl0aG9uIGZpbGUnKQorICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLnB5X21vZHVsZXMgPSBbcGtnX2Rpcl0KKyAgICAgICAgY21kLmRpc3RyaWJ1dGlvbi5leHRfbW9kdWxlcyA9IFtFeHRlbnNpb24oJ2ZvbycsIFsneHh4J10pXQorICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLnBhY2thZ2VzID0gW3BrZ19kaXJdCisgICAgICAgIGNtZC5kaXN0cmlidXRpb24uc2NyaXB0X25hbWUgPSAnc2V0dXAucHknCisKKyAgICAgICAgIyBnZXRfb3V0cHV0IHNob3VsZCByZXR1cm4gNCBlbGVtZW50cworICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGNtZC5nZXRfb3V0cHV0cygpKSA+PSAyKQorCisgICAgZGVmIHRlc3RfZ2V0X2lucHV0cyhzZWxmKToKKyAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBjbWQgPSBpbnN0YWxsX2xpYihkaXN0KQorCisgICAgICAgICMgc2V0dGluZyB1cCBhIGRpc3QgZW52aXJvbm1lbnQKKyAgICAgICAgY21kLmNvbXBpbGUgPSBjbWQub3B0aW1pemUgPSAxCisgICAgICAgIGNtZC5pbnN0YWxsX2RpciA9IHBrZ19kaXIKKyAgICAgICAgZiA9IG9zLnBhdGguam9pbihwa2dfZGlyLCAnZm9vLnB5JykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKGYsICcjIHB5dGhvbiBmaWxlJykKKyAgICAgICAgY21kLmRpc3RyaWJ1dGlvbi5weV9tb2R1bGVzID0gW3BrZ19kaXJdCisgICAgICAgIGNtZC5kaXN0cmlidXRpb24uZXh0X21vZHVsZXMgPSBbRXh0ZW5zaW9uKCdmb28nLCBbJ3h4eCddKV0KKyAgICAgICAgY21kLmRpc3RyaWJ1dGlvbi5wYWNrYWdlcyA9IFtwa2dfZGlyXQorICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLnNjcmlwdF9uYW1lID0gJ3NldHVwLnB5JworCisgICAgICAgICMgZ2V0X2lucHV0IHNob3VsZCByZXR1cm4gMiBlbGVtZW50cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjbWQuZ2V0X2lucHV0cygpKSwgMikKKworICAgIGRlZiB0ZXN0X2RvbnRfd3JpdGVfYnl0ZWNvZGUoc2VsZik6CisgICAgICAgICMgbWFrZXMgc3VyZSBieXRlX2NvbXBpbGUgaXMgbm90IHVzZWQKKyAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBjbWQgPSBpbnN0YWxsX2xpYihkaXN0KQorICAgICAgICBjbWQuY29tcGlsZSA9IDEKKyAgICAgICAgY21kLm9wdGltaXplID0gMQorCisgICAgICAgIG9sZF9kb250X3dyaXRlX2J5dGVjb2RlID0gc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUKKyAgICAgICAgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNtZC5ieXRlX2NvbXBpbGUoW10pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuZG9udF93cml0ZV9ieXRlY29kZSA9IG9sZF9kb250X3dyaXRlX2J5dGVjb2RlCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdieXRlLWNvbXBpbGluZyBpcyBkaXNhYmxlZCcgaW4gc2VsZi5sb2dzWzBdWzFdKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoSW5zdGFsbExpYlRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfbGliLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiM2IyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfbGliLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiM2IyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9zY3JpcHRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDg1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weQpAQCAtMCwwICsxLDgyIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9zY3JpcHRzLiIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfc2NyaXB0cyBpbXBvcnQgaW5zdGFsbF9zY3JpcHRzCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KKworZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCisKK2NsYXNzIEluc3RhbGxTY3JpcHRzVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfc2V0dGluZ3Moc2VsZik6CisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQorICAgICAgICBkaXN0LmNvbW1hbmRfb2JqWyJidWlsZCJdID0gc3VwcG9ydC5EdW1teUNvbW1hbmQoCisgICAgICAgICAgICBidWlsZF9zY3JpcHRzPSIvZm9vL2JhciIpCisgICAgICAgIGRpc3QuY29tbWFuZF9vYmpbImluc3RhbGwiXSA9IHN1cHBvcnQuRHVtbXlDb21tYW5kKAorICAgICAgICAgICAgaW5zdGFsbF9zY3JpcHRzPSIvc3BsYXQvZnVuayIsCisgICAgICAgICAgICBmb3JjZT0xLAorICAgICAgICAgICAgc2tpcF9idWlsZD0xLAorICAgICAgICAgICAgKQorICAgICAgICBjbWQgPSBpbnN0YWxsX3NjcmlwdHMoZGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjbWQuZm9yY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY21kLnNraXBfYnVpbGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWQuYnVpbGRfZGlyIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWQuaW5zdGFsbF9kaXIgaXMgTm9uZSkKKworICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtZC5mb3JjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtZC5za2lwX2J1aWxkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5idWlsZF9kaXIsICIvZm9vL2JhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmluc3RhbGxfZGlyLCAiL3NwbGF0L2Z1bmsiKQorCisgICAgZGVmIHRlc3RfaW5zdGFsbGF0aW9uKHNlbGYpOgorICAgICAgICBzb3VyY2UgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBleHBlY3RlZCA9IFtdCisKKyAgICAgICAgZGVmIHdyaXRlX3NjcmlwdChuYW1lLCB0ZXh0KToKKyAgICAgICAgICAgIGV4cGVjdGVkLmFwcGVuZChuYW1lKQorICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNvdXJjZSwgbmFtZSksICJ3IikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmLndyaXRlKHRleHQpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIHdyaXRlX3NjcmlwdCgic2NyaXB0MS5weSIsICgiIyEgL3Vzci9iaW4vZW52IHB5dGhvbjIuM1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMgYm9ndXMgc2NyaXB0IHcvIFB5dGhvbiBzaC1iYW5nXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFzc1xuIikpCisgICAgICAgIHdyaXRlX3NjcmlwdCgic2NyaXB0Mi5weSIsICgiIyEvdXNyL2Jpbi9weXRob25cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjIGJvZ3VzIHNjcmlwdCB3LyBQeXRob24gc2gtYmFuZ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhc3NcbiIpKQorICAgICAgICB3cml0ZV9zY3JpcHQoInNoZWxsLnNoIiwgKCIjIS9iaW4vc2hcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyBib2d1cyBzaGVsbCBzY3JpcHQgdy8gc2gtYmFuZ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGl0IDBcbiIpKQorCisgICAgICAgIHRhcmdldCA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQorICAgICAgICBkaXN0LmNvbW1hbmRfb2JqWyJidWlsZCJdID0gc3VwcG9ydC5EdW1teUNvbW1hbmQoYnVpbGRfc2NyaXB0cz1zb3VyY2UpCisgICAgICAgIGRpc3QuY29tbWFuZF9vYmpbImluc3RhbGwiXSA9IHN1cHBvcnQuRHVtbXlDb21tYW5kKAorICAgICAgICAgICAgaW5zdGFsbF9zY3JpcHRzPXRhcmdldCwKKyAgICAgICAgICAgIGZvcmNlPTEsCisgICAgICAgICAgICBza2lwX2J1aWxkPTEsCisgICAgICAgICAgICApCisgICAgICAgIGNtZCA9IGluc3RhbGxfc2NyaXB0cyhkaXN0KQorICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgIGluc3RhbGxlZCA9IG9zLmxpc3RkaXIodGFyZ2V0KQorICAgICAgICBmb3IgbmFtZSBpbiBleHBlY3RlZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYW1lIGluIGluc3RhbGxlZCkKKworCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoSW5zdGFsbFNjcmlwdHNUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX3NjcmlwdHMucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX3NjcmlwdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTg0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX3NjcmlwdHMucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX3NjcmlwdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTg0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9tc3ZjOWNvbXBpbGVyLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9tc3ZjOWNvbXBpbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOTRhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X21zdmM5Y29tcGlsZXIucHkKQEAgLTAsMCArMSwxODQgQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMubXN2Yzljb21waWxlci4iIiIKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCisKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCisjIEEgbWFuaWZlc3Qgd2l0aCB0aGUgb25seSBhc3NlbWJseSByZWZlcmVuY2UgYmVpbmcgdGhlIG1zdmNydCBhc3NlbWJseSwgc28KKyMgc2hvdWxkIGhhdmUgdGhlIGFzc2VtYmx5IGNvbXBsZXRlbHkgc3RyaXBwZWQuICBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlCisjIGFzc2VtYmx5IGhhcyBhIDxzZWN1cml0eT4gcmVmZXJlbmNlIHRoZSBhc3NlbWJseSBpcyByZW1vdmVkIC0gdGhhdCBpcworIyBjdXJyZW50bHkgYSAiZmVhdHVyZSIsIG5vdCBhIGJ1ZyA6KQorX01BTklGRVNUX1dJVEhfT05MWV9NU1ZDX1JFRkVSRU5DRSA9ICIiIlwKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzxhc3NlbWJseSB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiCisgICAgICAgICAgbWFuaWZlc3RWZXJzaW9uPSIxLjAiPgorICA8dHJ1c3RJbmZvIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MyI+CisgICAgPHNlY3VyaXR5PgorICAgICAgPHJlcXVlc3RlZFByaXZpbGVnZXM+CisgICAgICAgIDxyZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbCBsZXZlbD0iYXNJbnZva2VyIiB1aUFjY2Vzcz0iZmFsc2UiPgorICAgICAgICA8L3JlcXVlc3RlZEV4ZWN1dGlvbkxldmVsPgorICAgICAgPC9yZXF1ZXN0ZWRQcml2aWxlZ2VzPgorICAgIDwvc2VjdXJpdHk+CisgIDwvdHJ1c3RJbmZvPgorICA8ZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8YXNzZW1ibHlJZGVudGl0eSB0eXBlPSJ3aW4zMiIgbmFtZT0iTWljcm9zb2Z0LlZDOTAuQ1JUIgorICAgICAgICAgdmVyc2lvbj0iOS4wLjIxMDIyLjgiIHByb2Nlc3NvckFyY2hpdGVjdHVyZT0ieDg2IgorICAgICAgICAgcHVibGljS2V5VG9rZW49IlhYWFgiPgorICAgICAgPC9hc3NlbWJseUlkZW50aXR5PgorICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgIDwvZGVwZW5kZW5jeT4KKzwvYXNzZW1ibHk+CisiIiIKKworIyBBIG1hbmlmZXN0IHdpdGggcmVmZXJlbmNlcyB0byBhc3NlbWJsaWVzIG90aGVyIHRoYW4gbXN2Y3J0LiAgV2hlbiBwcm9jZXNzZWQsCisjIHRoaXMgYXNzZW1ibHkgc2hvdWxkIGJlIHJldHVybmVkIHdpdGgganVzdCB0aGUgbXN2Y3J0IHBhcnQgcmVtb3ZlZC4KK19NQU5JRkVTVF9XSVRIX01VTFRJUExFX1JFRkVSRU5DRVMgPSAiIiJcCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8YXNzZW1ibHkgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIgorICAgICAgICAgIG1hbmlmZXN0VmVyc2lvbj0iMS4wIj4KKyAgPHRydXN0SW5mbyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjMiPgorICAgIDxzZWN1cml0eT4KKyAgICAgIDxyZXF1ZXN0ZWRQcml2aWxlZ2VzPgorICAgICAgICA8cmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWwgbGV2ZWw9ImFzSW52b2tlciIgdWlBY2Nlc3M9ImZhbHNlIj4KKyAgICAgICAgPC9yZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbD4KKyAgICAgIDwvcmVxdWVzdGVkUHJpdmlsZWdlcz4KKyAgICA8L3NlY3VyaXR5PgorICA8L3RydXN0SW5mbz4KKyAgPGRlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgdHlwZT0id2luMzIiIG5hbWU9Ik1pY3Jvc29mdC5WQzkwLkNSVCIKKyAgICAgICAgIHZlcnNpb249IjkuMC4yMTAyMi44IiBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9Ing4NiIKKyAgICAgICAgIHB1YmxpY0tleVRva2VuPSJYWFhYIj4KKyAgICAgIDwvYXNzZW1ibHlJZGVudGl0eT4KKyAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICA8L2RlcGVuZGVuY3k+CisgIDxkZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxhc3NlbWJseUlkZW50aXR5IHR5cGU9IndpbjMyIiBuYW1lPSJNaWNyb3NvZnQuVkM5MC5NRkMiCisgICAgICAgIHZlcnNpb249IjkuMC4yMTAyMi44IiBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9Ing4NiIKKyAgICAgICAgcHVibGljS2V5VG9rZW49IlhYWFgiPjwvYXNzZW1ibHlJZGVudGl0eT4KKyAgICA8L2RlcGVuZGVudEFzc2VtYmx5PgorICA8L2RlcGVuZGVuY3k+Cis8L2Fzc2VtYmx5PgorIiIiCisKK19DTEVBTkVEX01BTklGRVNUID0gIiIiXAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPGFzc2VtYmx5IHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSIKKyAgICAgICAgICBtYW5pZmVzdFZlcnNpb249IjEuMCI+CisgIDx0cnVzdEluZm8geG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYzIj4KKyAgICA8c2VjdXJpdHk+CisgICAgICA8cmVxdWVzdGVkUHJpdmlsZWdlcz4KKyAgICAgICAgPHJlcXVlc3RlZEV4ZWN1dGlvbkxldmVsIGxldmVsPSJhc0ludm9rZXIiIHVpQWNjZXNzPSJmYWxzZSI+CisgICAgICAgIDwvcmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWw+CisgICAgICA8L3JlcXVlc3RlZFByaXZpbGVnZXM+CisgICAgPC9zZWN1cml0eT4KKyAgPC90cnVzdEluZm8+CisgIDxkZXBlbmRlbmN5PgorCisgIDwvZGVwZW5kZW5jeT4KKyAgPGRlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgdHlwZT0id2luMzIiIG5hbWU9Ik1pY3Jvc29mdC5WQzkwLk1GQyIKKyAgICAgICAgdmVyc2lvbj0iOS4wLjIxMDIyLjgiIHByb2Nlc3NvckFyY2hpdGVjdHVyZT0ieDg2IgorICAgICAgICBwdWJsaWNLZXlUb2tlbj0iWFhYWCI+PC9hc3NlbWJseUlkZW50aXR5PgorICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgIDwvZGVwZW5kZW5jeT4KKzwvYXNzZW1ibHk+IiIiCisKK2lmIHN5cy5wbGF0Zm9ybT09IndpbjMyIjoKKyAgICBmcm9tIGRpc3R1dGlscy5tc3ZjY29tcGlsZXIgaW1wb3J0IGdldF9idWlsZF92ZXJzaW9uCisgICAgaWYgZ2V0X2J1aWxkX3ZlcnNpb24oKT49OC4wOgorICAgICAgICBTS0lQX01FU1NBR0UgPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgU0tJUF9NRVNTQUdFID0gIlRoZXNlIHRlc3RzIGFyZSBvbmx5IGZvciBNU1ZDOC4wIG9yIGFib3ZlIgorZWxzZToKKyAgICBTS0lQX01FU1NBR0UgPSAiVGhlc2UgdGVzdHMgYXJlIG9ubHkgZm9yIHdpbjMyIgorCitAdW5pdHRlc3Quc2tpcFVubGVzcyhTS0lQX01FU1NBR0UgaXMgTm9uZSwgU0tJUF9NRVNTQUdFKQorY2xhc3MgbXN2Yzljb21waWxlclRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfbm9fY29tcGlsZXIoc2VsZik6CisgICAgICAgICMgbWFrZXMgc3VyZSBxdWVyeV92Y3ZhcnNhbGwgcmFpc2VzCisgICAgICAgICMgYSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yIGlmIHRoZSBjb21waWxlcgorICAgICAgICAjIGlzIG5vdCBmb3VuZAorICAgICAgICBmcm9tIGRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyIGltcG9ydCBxdWVyeV92Y3ZhcnNhbGwKKyAgICAgICAgZGVmIF9maW5kX3ZjdmFyc2FsbCh2ZXJzaW9uKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IG1zdmM5Y29tcGlsZXIKKyAgICAgICAgb2xkX2ZpbmRfdmN2YXJzYWxsID0gbXN2Yzljb21waWxlci5maW5kX3ZjdmFyc2FsbAorICAgICAgICBtc3ZjOWNvbXBpbGVyLmZpbmRfdmN2YXJzYWxsID0gX2ZpbmRfdmN2YXJzYWxsCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIHF1ZXJ5X3ZjdmFyc2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dvbnQgZmluZCB0aGlzIHZlcnNpb24nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbXN2Yzljb21waWxlci5maW5kX3ZjdmFyc2FsbCA9IG9sZF9maW5kX3ZjdmFyc2FsbAorCisgICAgZGVmIHRlc3RfcmVnX2NsYXNzKHNlbGYpOgorICAgICAgICBmcm9tIGRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyIGltcG9ydCBSZWcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIFJlZy5nZXRfdmFsdWUsICd4eHgnLCAneHh4JykKKworICAgICAgICAjIGxvb2tpbmcgZm9yIHZhbHVlcyB0aGF0IHNob3VsZCBleGlzdCBvbiBhbGwKKyAgICAgICAgIyB3aW5kb3dzIHJlZ2lzdGVyaWVzIHZlcnNpb25zLgorICAgICAgICBwYXRoID0gcidDb250cm9sIFBhbmVsXERlc2t0b3AnCisgICAgICAgIHYgPSBSZWcuZ2V0X3ZhbHVlKHBhdGgsIHUnZHJhZ2Z1bGx3aW5kb3dzJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaW4gKHUnMCcsIHUnMScsIHUnMicpKQorCisgICAgICAgIGltcG9ydCBfd2lucmVnCisgICAgICAgIEhLQ1UgPSBfd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSCisgICAgICAgIGtleXMgPSBSZWcucmVhZF9rZXlzKEhLQ1UsICd4eHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrZXlzLCBOb25lKQorCisgICAgICAgIGtleXMgPSBSZWcucmVhZF9rZXlzKEhLQ1UsIHInQ29udHJvbCBQYW5lbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnRGVza3RvcCcgaW4ga2V5cykKKworICAgIGRlZiB0ZXN0X3JlbW92ZV92aXN1YWxfY19yZWYoc2VsZik6CisgICAgICAgIGZyb20gZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIgaW1wb3J0IE1TVkNDb21waWxlcgorICAgICAgICB0ZW1wZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgbWFuaWZlc3QgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgJ21hbmlmZXN0JykKKyAgICAgICAgZiA9IG9wZW4obWFuaWZlc3QsICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZShfTUFOSUZFU1RfV0lUSF9NVUxUSVBMRV9SRUZFUkVOQ0VTKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgY29tcGlsZXIgPSBNU1ZDQ29tcGlsZXIoKQorICAgICAgICBjb21waWxlci5fcmVtb3ZlX3Zpc3VhbF9jX3JlZihtYW5pZmVzdCkKKworICAgICAgICAjIHNlZSB3aGF0IHdlIGdvdAorICAgICAgICBmID0gb3BlbihtYW5pZmVzdCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyByZW1vdmluZyB0cmFpbGluZyBzcGFjZXMKKyAgICAgICAgICAgIGNvbnRlbnQgPSAnXG4nLmpvaW4oW2xpbmUucnN0cmlwKCkgZm9yIGxpbmUgaW4gZi5yZWFkbGluZXMoKV0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAjIG1ha2VzIHN1cmUgdGhlIG1hbmlmZXN0IHdhcyBwcm9wZXJseSBjbGVhbmVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udGVudCwgX0NMRUFORURfTUFOSUZFU1QpCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfZW50aXJlX21hbmlmZXN0KHNlbGYpOgorICAgICAgICBmcm9tIGRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyIGltcG9ydCBNU1ZDQ29tcGlsZXIKKyAgICAgICAgdGVtcGRpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIG1hbmlmZXN0ID0gb3MucGF0aC5qb2luKHRlbXBkaXIsICdtYW5pZmVzdCcpCisgICAgICAgIGYgPSBvcGVuKG1hbmlmZXN0LCAndycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoX01BTklGRVNUX1dJVEhfT05MWV9NU1ZDX1JFRkVSRU5DRSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGNvbXBpbGVyID0gTVNWQ0NvbXBpbGVyKCkKKyAgICAgICAgZ290ID0gY29tcGlsZXIuX3JlbW92ZV92aXN1YWxfY19yZWYobWFuaWZlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZ290LCBOb25lKQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShtc3ZjOWNvbXBpbGVyVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfbXN2Yzljb21waWxlci5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X21zdmM5Y29tcGlsZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMTBkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X21zdmM5Y29tcGlsZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfbXN2Yzljb21waWxlci5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X21zdmM5Y29tcGlsZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMTBkMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X21zdmM5Y29tcGlsZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3JlZ2lzdGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMzRiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3JlZ2lzdGVyLnB5CkBAIC0wLDAgKzEsMjkwIEBACisjIC0qLSBlbmNvZGluZzogdXRmOCAtKi0KKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5yZWdpc3Rlci4iIiIKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgZ2V0cGFzcworaW1wb3J0IHVybGxpYjIKK2ltcG9ydCB3YXJuaW5ncworCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjaGVja193YXJuaW5ncywgcnVuX3VuaXR0ZXN0CisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQgaW1wb3J0IHJlZ2lzdGVyIGFzIHJlZ2lzdGVyX21vZHVsZQorZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5yZWdpc3RlciBpbXBvcnQgcmVnaXN0ZXIKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgorCitmcm9tIGRpc3R1dGlscy50ZXN0cy50ZXN0X2NvbmZpZyBpbXBvcnQgUHlQSVJDQ29tbWFuZFRlc3RDYXNlCisKK3RyeToKKyAgICBpbXBvcnQgZG9jdXRpbHMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBkb2N1dGlscyA9IE5vbmUKKworUFlQSVJDX05PUEFTU1dPUkQgPSAiIiJcCitbZGlzdHV0aWxzXQorCitpbmRleC1zZXJ2ZXJzID0KKyAgICBzZXJ2ZXIxCisKK1tzZXJ2ZXIxXQordXNlcm5hbWU6bWUKKyIiIgorCitXQU5URURfUFlQSVJDID0gIiIiXAorW2Rpc3R1dGlsc10KK2luZGV4LXNlcnZlcnMgPQorICAgIHB5cGkKKworW3B5cGldCit1c2VybmFtZTp0YXJlaworcGFzc3dvcmQ6cGFzc3dvcmQKKyIiIgorCitjbGFzcyBSYXdJbnB1dHMob2JqZWN0KToKKyAgICAiIiJGYWtlcyB1c2VyIGlucHV0cy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFuc3dlcnMpOgorICAgICAgICBzZWxmLmFuc3dlcnMgPSBhbnN3ZXJzCisgICAgICAgIHNlbGYuaW5kZXggPSAwCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcHJvbXB0PScnKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYW5zd2Vyc1tzZWxmLmluZGV4XQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5pbmRleCArPSAxCisKK2NsYXNzIEZha2VPcGVuZXIob2JqZWN0KToKKyAgICAiIiJGYWtlcyBhIFB5UEkgc2VydmVyIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnJlcXMgPSBbXQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBvcGVuKHNlbGYsIHJlcSk6CisgICAgICAgIHNlbGYucmVxcy5hcHBlbmQocmVxKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIHJldHVybiAneHh4JworCitjbGFzcyBSZWdpc3RlclRlc3RDYXNlKFB5UElSQ0NvbW1hbmRUZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFJlZ2lzdGVyVGVzdENhc2UsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgIyBwYXRjaGluZyB0aGUgcGFzc3dvcmQgcHJvbXB0CisgICAgICAgIHNlbGYuX29sZF9nZXRwYXNzID0gZ2V0cGFzcy5nZXRwYXNzCisgICAgICAgIGRlZiBfZ2V0cGFzcyhwcm9tcHQpOgorICAgICAgICAgICAgcmV0dXJuICdwYXNzd29yZCcKKyAgICAgICAgZ2V0cGFzcy5nZXRwYXNzID0gX2dldHBhc3MKKyAgICAgICAgc2VsZi5vbGRfb3BlbmVyID0gdXJsbGliMi5idWlsZF9vcGVuZXIKKyAgICAgICAgc2VsZi5jb25uID0gdXJsbGliMi5idWlsZF9vcGVuZXIgPSBGYWtlT3BlbmVyKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZ2V0cGFzcy5nZXRwYXNzID0gc2VsZi5fb2xkX2dldHBhc3MKKyAgICAgICAgdXJsbGliMi5idWlsZF9vcGVuZXIgPSBzZWxmLm9sZF9vcGVuZXIKKyAgICAgICAgc3VwZXIoUmVnaXN0ZXJUZXN0Q2FzZSwgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIF9nZXRfY21kKHNlbGYsIG1ldGFkYXRhPU5vbmUpOgorICAgICAgICBpZiBtZXRhZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgbWV0YWRhdGEgPSB7J3VybCc6ICd4eHgnLCAnYXV0aG9yJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnYXV0aG9yX2VtYWlsJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICd4eHgnLCAndmVyc2lvbic6ICd4eHgnfQorICAgICAgICBwa2dfaW5mbywgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKiptZXRhZGF0YSkKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyKGRpc3QpCisKKyAgICBkZWYgdGVzdF9jcmVhdGVfcHlwaXJjKHNlbGYpOgorICAgICAgICAjIHRoaXMgdGVzdCBtYWtlcyBzdXJlIGEgLnB5cGlyYyBmaWxlCisgICAgICAgICMgaXMgY3JlYXRlZCB3aGVuIHJlcXVlc3RlZC4KKworICAgICAgICAjIGxldCdzIGNyZWF0ZSBhIHJlZ2lzdGVyIGluc3RhbmNlCisgICAgICAgIGNtZCA9IHNlbGYuX2dldF9jbWQoKQorCisgICAgICAgICMgd2Ugc2hvdWxkbid0IGhhdmUgYSAucHlwaXJjIGZpbGUgeWV0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5yYykpCisKKyAgICAgICAgIyBwYXRjaGluZyByYXdfaW5wdXQgYW5kIGdldHBhc3MuZ2V0cGFzcworICAgICAgICAjIHNvIHJlZ2lzdGVyIGdldHMgaGFwcHkKKyAgICAgICAgIworICAgICAgICAjIEhlcmUncyB3aGF0IHdlIGFyZSBmYWtpbmcgOgorICAgICAgICAjIHVzZSB5b3VyIGV4aXN0aW5nIGxvZ2luIChjaG9pY2UgMS4pCisgICAgICAgICMgVXNlcm5hbWUgOiAndGFyZWsnCisgICAgICAgICMgUGFzc3dvcmQgOiAncGFzc3dvcmQnCisgICAgICAgICMgU2F2ZSB5b3VyIGxvZ2luICh5L04pPyA6ICd5JworICAgICAgICBpbnB1dHMgPSBSYXdJbnB1dHMoJzEnLCAndGFyZWsnLCAneScpCisgICAgICAgIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQgPSBpbnB1dHMuX19jYWxsX18KKyAgICAgICAgIyBsZXQncyBydW4gdGhlIGNvbW1hbmQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY21kLnJ1bigpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWwgcmVnaXN0ZXJfbW9kdWxlLnJhd19pbnB1dAorCisgICAgICAgICMgd2Ugc2hvdWxkIGhhdmUgYSBicmFuZCBuZXcgLnB5cGlyYyBmaWxlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWxmLnJjKSkKKworICAgICAgICAjIHdpdGggdGhlIGNvbnRlbnQgc2ltaWxhciB0byBXQU5URURfUFlQSVJDCisgICAgICAgIGYgPSBvcGVuKHNlbGYucmMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb250ZW50LCBXQU5URURfUFlQSVJDKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgIyBub3cgbGV0J3MgbWFrZSBzdXJlIHRoZSAucHlwaXJjIGZpbGUgZ2VuZXJhdGVkCisgICAgICAgICMgcmVhbGx5IHdvcmtzIDogd2Ugc2hvdWxkbid0IGJlIGFza2VkIGFueXRoaW5nCisgICAgICAgICMgaWYgd2UgcnVuIHRoZSBjb21tYW5kIGFnYWluCisgICAgICAgIGRlZiBfbm9fd2F5KHByb21wdD0nJyk6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcihwcm9tcHQpCisgICAgICAgIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQgPSBfbm9fd2F5CisKKyAgICAgICAgY21kLnNob3dfcmVzcG9uc2UgPSAxCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgICMgbGV0J3Mgc2VlIHdoYXQgdGhlIHNlcnZlciByZWNlaXZlZCA6IHdlIHNob3VsZAorICAgICAgICAjIGhhdmUgMiBzaW1pbGFyIHJlcXVlc3RzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuY29ubi5yZXFzKSwgMikKKyAgICAgICAgcmVxMSA9IGRpY3Qoc2VsZi5jb25uLnJlcXNbMF0uaGVhZGVycykKKyAgICAgICAgcmVxMiA9IGRpY3Qoc2VsZi5jb25uLnJlcXNbMV0uaGVhZGVycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEyWydDb250ZW50LWxlbmd0aCddLCByZXExWydDb250ZW50LWxlbmd0aCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3h4eCcgaW4gc2VsZi5jb25uLnJlcXNbMV0uZGF0YSkKKworICAgIGRlZiB0ZXN0X3Bhc3N3b3JkX25vdF9pbl9maWxlKHNlbGYpOgorCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShzZWxmLnJjLCBQWVBJUkNfTk9QQVNTV09SRCkKKyAgICAgICAgY21kID0gc2VsZi5fZ2V0X2NtZCgpCisgICAgICAgIGNtZC5fc2V0X2NvbmZpZygpCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgY21kLnNlbmRfbWV0YWRhdGEoKQorCisgICAgICAgICMgZGlzdC5wYXNzd29yZCBzaG91bGQgYmUgc2V0CisgICAgICAgICMgdGhlcmVmb3JlIHVzZWQgYWZ0ZXJ3YXJkcyBieSBvdGhlciBjb21tYW5kcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5kaXN0cmlidXRpb24ucGFzc3dvcmQsICdwYXNzd29yZCcpCisKKyAgICBkZWYgdGVzdF9yZWdpc3RlcmluZyhzZWxmKToKKyAgICAgICAgIyB0aGlzIHRlc3QgcnVucyBjaG9pY2UgMgorICAgICAgICBjbWQgPSBzZWxmLl9nZXRfY21kKCkKKyAgICAgICAgaW5wdXRzID0gUmF3SW5wdXRzKCcyJywgJ3RhcmVrJywgJ3RhcmVrQHppYWRlLm9yZycpCisgICAgICAgIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQgPSBpbnB1dHMuX19jYWxsX18KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBsZXQncyBydW4gdGhlIGNvbW1hbmQKKyAgICAgICAgICAgIGNtZC5ydW4oKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQKKworICAgICAgICAjIHdlIHNob3VsZCBoYXZlIHNlbmQgYSByZXF1ZXN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuY29ubi5yZXFzKSwgMSkKKyAgICAgICAgcmVxID0gc2VsZi5jb25uLnJlcXNbMF0KKyAgICAgICAgaGVhZGVycyA9IGRpY3QocmVxLmhlYWRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGVhZGVyc1snQ29udGVudC1sZW5ndGgnXSwgJzYwOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndGFyZWsnIGluIHJlcS5kYXRhKQorCisgICAgZGVmIHRlc3RfcGFzc3dvcmRfcmVzZXQoc2VsZik6CisgICAgICAgICMgdGhpcyB0ZXN0IHJ1bnMgY2hvaWNlIDMKKyAgICAgICAgY21kID0gc2VsZi5fZ2V0X2NtZCgpCisgICAgICAgIGlucHV0cyA9IFJhd0lucHV0cygnMycsICd0YXJla0B6aWFkZS5vcmcnKQorICAgICAgICByZWdpc3Rlcl9tb2R1bGUucmF3X2lucHV0ID0gaW5wdXRzLl9fY2FsbF9fCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgbGV0J3MgcnVuIHRoZSBjb21tYW5kCisgICAgICAgICAgICBjbWQucnVuKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlbCByZWdpc3Rlcl9tb2R1bGUucmF3X2lucHV0CisKKyAgICAgICAgIyB3ZSBzaG91bGQgaGF2ZSBzZW5kIGEgcmVxdWVzdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLmNvbm4ucmVxcyksIDEpCisgICAgICAgIHJlcSA9IHNlbGYuY29ubi5yZXFzWzBdCisgICAgICAgIGhlYWRlcnMgPSBkaWN0KHJlcS5oZWFkZXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYWRlcnNbJ0NvbnRlbnQtbGVuZ3RoJ10sICcyOTAnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3RhcmVrJyBpbiByZXEuZGF0YSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGRvY3V0aWxzIGlzIG5vdCBOb25lLCAnbmVlZHMgZG9jdXRpbHMnKQorICAgIGRlZiB0ZXN0X3N0cmljdChzZWxmKToKKyAgICAgICAgIyB0ZXN0aW5nIHRoZSBzY3JpcHQgb3B0aW9uCisgICAgICAgICMgd2hlbiBvbiwgdGhlIHJlZ2lzdGVyIGNvbW1hbmQgc3RvcHMgaWYKKyAgICAgICAgIyB0aGUgbWV0YWRhdGEgaXMgaW5jb21wbGV0ZSBvciBpZgorICAgICAgICAjIGxvbmdfZGVzY3JpcHRpb24gaXMgbm90IHJlU3QgY29tcGxpYW50CisKKyAgICAgICAgIyBlbXB0eSBtZXRhZGF0YQorICAgICAgICBjbWQgPSBzZWxmLl9nZXRfY21kKHt9KQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5zdHJpY3QgPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5ydW4pCisKKyAgICAgICAgIyBtZXRhZGF0YSBhcmUgT0sgYnV0IGxvbmdfZGVzY3JpcHRpb24gaXMgYnJva2VuCisgICAgICAgIG1ldGFkYXRhID0geyd1cmwnOiAneHh4JywgJ2F1dGhvcic6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAnYXV0aG9yX2VtYWlsJzogdSfDqXjDqXjDqScsCisgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3h4eCcsICd2ZXJzaW9uJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uJzogJ3RpdGxlXG49PVxuXG50ZXh0J30KKworICAgICAgICBjbWQgPSBzZWxmLl9nZXRfY21kKG1ldGFkYXRhKQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5zdHJpY3QgPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5ydW4pCisKKyAgICAgICAgIyBub3cgc29tZXRoaW5nIHRoYXQgd29ya3MKKyAgICAgICAgbWV0YWRhdGFbJ2xvbmdfZGVzY3JpcHRpb24nXSA9ICd0aXRsZVxuPT09PT1cblxudGV4dCcKKyAgICAgICAgY21kID0gc2VsZi5fZ2V0X2NtZChtZXRhZGF0YSkKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQuc3RyaWN0ID0gMQorICAgICAgICBpbnB1dHMgPSBSYXdJbnB1dHMoJzEnLCAndGFyZWsnLCAneScpCisgICAgICAgIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQgPSBpbnB1dHMuX19jYWxsX18KKyAgICAgICAgIyBsZXQncyBydW4gdGhlIGNvbW1hbmQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY21kLnJ1bigpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWwgcmVnaXN0ZXJfbW9kdWxlLnJhd19pbnB1dAorCisgICAgICAgICMgc3RyaWN0IGlzIG5vdCBieSBkZWZhdWx0CisgICAgICAgIGNtZCA9IHNlbGYuX2dldF9jbWQoKQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGlucHV0cyA9IFJhd0lucHV0cygnMScsICd0YXJlaycsICd5JykKKyAgICAgICAgcmVnaXN0ZXJfbW9kdWxlLnJhd19pbnB1dCA9IGlucHV0cy5fX2NhbGxfXworICAgICAgICAjIGxldCdzIHJ1biB0aGUgY29tbWFuZAorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbWQucnVuKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlbCByZWdpc3Rlcl9tb2R1bGUucmF3X2lucHV0CisKKyAgICAgICAgIyBhbmQgZmluYWxseSBhIFVuaWNvZGUgdGVzdCAoYnVnICMxMjExNCkKKyAgICAgICAgbWV0YWRhdGEgPSB7J3VybCc6IHUneHh4JywgJ2F1dGhvcic6IHUnXHUwMGM5cmljJywKKyAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcl9lbWFpbCc6IHUneHh4JywgdSduYW1lJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uJzogdSd4eHgnLAorICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiB1J1NvbWV0aGluZyBhYm91dCBlc3N6ZXQgXHUwMGRmJywKKyAgICAgICAgICAgICAgICAgICAgJ2xvbmdfZGVzY3JpcHRpb24nOiB1J01vcmUgdGhpbmdzIGFib3V0IGVzc3pldCBcdTAwZGYnfQorCisgICAgICAgIGNtZCA9IHNlbGYuX2dldF9jbWQobWV0YWRhdGEpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnN0cmljdCA9IDEKKyAgICAgICAgaW5wdXRzID0gUmF3SW5wdXRzKCcxJywgJ3RhcmVrJywgJ3knKQorICAgICAgICByZWdpc3Rlcl9tb2R1bGUucmF3X2lucHV0ID0gaW5wdXRzLl9fY2FsbF9fCisgICAgICAgICMgbGV0J3MgcnVuIHRoZSBjb21tYW5kCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNtZC5ydW4oKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGRvY3V0aWxzIGlzIG5vdCBOb25lLCAnbmVlZHMgZG9jdXRpbHMnKQorICAgIGRlZiB0ZXN0X3JlZ2lzdGVyX2ludmFsaWRfbG9uZ19kZXNjcmlwdGlvbihzZWxmKToKKyAgICAgICAgZGVzY3JpcHRpb24gPSAnOmZ1bmtpZTpgc3RyYCcgICMgbWltaWMgU3BoaW54LXNwZWNpZmljIG1hcmt1cAorICAgICAgICBtZXRhZGF0YSA9IHsndXJsJzogJ3h4eCcsICdhdXRob3InOiAneHh4JywKKyAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcl9lbWFpbCc6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAnbmFtZSc6ICd4eHgnLCAndmVyc2lvbic6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbic6IGRlc2NyaXB0aW9ufQorICAgICAgICBjbWQgPSBzZWxmLl9nZXRfY21kKG1ldGFkYXRhKQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5zdHJpY3QgPSBUcnVlCisgICAgICAgIGlucHV0cyA9IFJhd0lucHV0cygnMicsICd0YXJlaycsICd0YXJla0B6aWFkZS5vcmcnKQorICAgICAgICByZWdpc3Rlcl9tb2R1bGUucmF3X2lucHV0ID0gaW5wdXRzCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChkZWxhdHRyLCByZWdpc3Rlcl9tb2R1bGUsICdyYXdfaW5wdXQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQucnVuKQorCisgICAgZGVmIHRlc3RfY2hlY2tfbWV0YWRhdGFfZGVwcmVjYXRlZChzZWxmKToKKyAgICAgICAgIyBtYWtlcyBzdXJlIG1ha2VfbWV0YWRhdGEgaXMgZGVwcmVjYXRlZAorICAgICAgICBjbWQgPSBzZWxmLl9nZXRfY21kKCkKKyAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImFsd2F5cyIpCisgICAgICAgICAgICBjbWQuY2hlY2tfbWV0YWRhdGEoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDEpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShSZWdpc3RlclRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3JlZ2lzdGVyLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMmZjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3JlZ2lzdGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3JlZ2lzdGVyLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMmZjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3JlZ2lzdGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NkaXN0LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zZGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTdkOThkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zZGlzdC5weQpAQCAtMCwwICsxLDUxMiBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLnNkaXN0LiIiIgoraW1wb3J0IG9zCitpbXBvcnQgdGFyZmlsZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCB6aXBmaWxlCitmcm9tIG9zLnBhdGggaW1wb3J0IGpvaW4KK2Zyb20gdGV4dHdyYXAgaW1wb3J0IGRlZGVudAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0LCBjaGVja193YXJuaW5ncywgcnVuX3VuaXR0ZXN0CisKKyMgemxpYiBpcyBub3QgdXNlZCBoZXJlLCBidXQgaWYgaXQncyBub3QgYXZhaWxhYmxlCisjIHRoZSB0ZXN0cyB0aGF0IHVzZSB6aXBmaWxlIG1heSBmYWlsCit0cnk6CisgICAgaW1wb3J0IHpsaWIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB6bGliID0gTm9uZQorCit0cnk6CisgICAgaW1wb3J0IGdycAorICAgIGltcG9ydCBwd2QKKyAgICBVSURfR0lEX1NVUFBPUlQgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgVUlEX0dJRF9TVVBQT1JUID0gRmFsc2UKKworCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLnNkaXN0IGltcG9ydCBzZGlzdCwgc2hvd19mb3JtYXRzCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KK2Zyb20gZGlzdHV0aWxzLnRlc3RzLnRlc3RfY29uZmlnIGltcG9ydCBQeVBJUkNDb21tYW5kVGVzdENhc2UKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKK2Zyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBmaW5kX2V4ZWN1dGFibGUKK2Zyb20gZGlzdHV0aWxzLmxvZyBpbXBvcnQgV0FSTgorZnJvbSBkaXN0dXRpbHMuZmlsZWxpc3QgaW1wb3J0IEZpbGVMaXN0Citmcm9tIGRpc3R1dGlscy5hcmNoaXZlX3V0aWwgaW1wb3J0IEFSQ0hJVkVfRk9STUFUUworCitTRVRVUF9QWSA9ICIiIgorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKK2ltcG9ydCBzb21lY29kZQorCitzZXR1cChuYW1lPSdmYWtlJykKKyIiIgorCitNQU5JRkVTVCA9ICIiIlwKKyMgZmlsZSBHRU5FUkFURUQgYnkgZGlzdHV0aWxzLCBkbyBOT1QgZWRpdAorUkVBRE1FCitidWlsZG91dC5jZmcKK2lucm9vdC50eHQKK3NldHVwLnB5CitkYXRhJShzZXApc2RhdGEuZHQKK3NjcmlwdHMlKHNlcClzc2NyaXB0LnB5Citzb21lJShzZXApc2ZpbGUudHh0Citzb21lJShzZXApc290aGVyX2ZpbGUudHh0Citzb21lY29kZSUoc2VwKXNfX2luaXRfXy5weQorc29tZWNvZGUlKHNlcClzZG9jLmRhdAorc29tZWNvZGUlKHNlcClzZG9jLnR4dAorIiIiCisKK2NsYXNzIFNEaXN0VGVzdENhc2UoUHlQSVJDQ29tbWFuZFRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBQeVBJUkNDb21tYW5kVGVzdENhc2UgY3JlYXRlcyBhIHRlbXAgZGlyIGFscmVhZHkKKyAgICAgICAgIyBhbmQgcHV0IGl0IGluIHNlbGYudG1wX2RpcgorICAgICAgICBzdXBlcihTRGlzdFRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCisgICAgICAgICMgc2V0dGluZyB1cCBhbiBlbnZpcm9ubWVudAorICAgICAgICBzZWxmLm9sZF9wYXRoID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MubWtkaXIoam9pbihzZWxmLnRtcF9kaXIsICdzb21lY29kZScpKQorICAgICAgICBvcy5ta2Rpcihqb2luKHNlbGYudG1wX2RpciwgJ2Rpc3QnKSkKKyAgICAgICAgIyBhIHBhY2thZ2UsIGFuZCBhIFJFQURNRQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ1JFQURNRScpLCAneHh4JykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsICdzb21lY29kZScsICdfX2luaXRfXy5weScpLCAnIycpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnc2V0dXAucHknKSwgU0VUVVBfUFkpCisgICAgICAgIG9zLmNoZGlyKHNlbGYudG1wX2RpcikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIyBiYWNrIHRvIG5vcm1hbAorICAgICAgICBvcy5jaGRpcihzZWxmLm9sZF9wYXRoKQorICAgICAgICBzdXBlcihTRGlzdFRlc3RDYXNlLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgZ2V0X2NtZChzZWxmLCBtZXRhZGF0YT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyBhIGNtZCIiIgorICAgICAgICBpZiBtZXRhZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgbWV0YWRhdGEgPSB7J25hbWUnOiAnZmFrZScsICd2ZXJzaW9uJzogJzEuMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAndXJsJzogJ3h4eCcsICdhdXRob3InOiAneHh4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdhdXRob3JfZW1haWwnOiAneHh4J30KKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihtZXRhZGF0YSkKKyAgICAgICAgZGlzdC5zY3JpcHRfbmFtZSA9ICdzZXR1cC5weScKKyAgICAgICAgZGlzdC5wYWNrYWdlcyA9IFsnc29tZWNvZGUnXQorICAgICAgICBkaXN0LmluY2x1ZGVfcGFja2FnZV9kYXRhID0gVHJ1ZQorICAgICAgICBjbWQgPSBzZGlzdChkaXN0KQorICAgICAgICBjbWQuZGlzdF9kaXIgPSAnZGlzdCcKKyAgICAgICAgcmV0dXJuIGRpc3QsIGNtZAorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3BydW5lX2ZpbGVfbGlzdChzZWxmKToKKyAgICAgICAgIyB0aGlzIHRlc3QgY3JlYXRlcyBhIHByb2plY3Qgd2l0aCBzb21lIFZDUyBkaXJzIGFuZCBhbiBORlMgcmVuYW1lCisgICAgICAgICMgZmlsZSwgdGhlbiBsYXVuY2hlcyBzZGlzdCB0byBjaGVjayB0aGV5IGdldCBwcnVuZWQgb24gYWxsIHN5c3RlbXMKKworICAgICAgICAjIGNyZWF0aW5nIFZDUyBkaXJlY3RvcmllcyB3aXRoIHNvbWUgZmlsZXMgaW4gdGhlbQorICAgICAgICBvcy5ta2Rpcihqb2luKHNlbGYudG1wX2RpciwgJ3NvbWVjb2RlJywgJy5zdm4nKSkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsICdzb21lY29kZScsICcuc3ZuJywgJ29rLnB5JyksICd4eHgnKQorCisgICAgICAgIG9zLm1rZGlyKGpvaW4oc2VsZi50bXBfZGlyLCAnc29tZWNvZGUnLCAnLmhnJykpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnc29tZWNvZGUnLCAnLmhnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnb2snKSwgJ3h4eCcpCisKKyAgICAgICAgb3MubWtkaXIoam9pbihzZWxmLnRtcF9kaXIsICdzb21lY29kZScsICcuZ2l0JykpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnc29tZWNvZGUnLCAnLmdpdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ29rJyksICd4eHgnKQorCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnc29tZWNvZGUnLCAnLm5mczAwMDEnKSwgJ3h4eCcpCisKKyAgICAgICAgIyBub3cgYnVpbGRpbmcgYSBzZGlzdAorICAgICAgICBkaXN0LCBjbWQgPSBzZWxmLmdldF9jbWQoKQorCisgICAgICAgICMgemlwIGlzIGF2YWlsYWJsZSB1bml2ZXJzYWxseQorICAgICAgICAjICh0YXIgbWlnaHQgbm90IGJlIGluc3RhbGxlZCB1bmRlciB3aW4zMikKKyAgICAgICAgY21kLmZvcm1hdHMgPSBbJ3ppcCddCisKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICAjIG5vdyBsZXQncyBjaGVjayB3aGF0IHdlIGhhdmUKKyAgICAgICAgZGlzdF9mb2xkZXIgPSBqb2luKHNlbGYudG1wX2RpciwgJ2Rpc3QnKQorICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIoZGlzdF9mb2xkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZXMsIFsnZmFrZS0xLjAuemlwJ10pCisKKyAgICAgICAgemlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUoam9pbihkaXN0X2ZvbGRlciwgJ2Zha2UtMS4wLnppcCcpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb250ZW50ID0gemlwX2ZpbGUubmFtZWxpc3QoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgemlwX2ZpbGUuY2xvc2UoKQorCisgICAgICAgICMgbWFraW5nIHN1cmUgZXZlcnl0aGluZyBoYXMgYmVlbiBwcnVuZWQgY29ycmVjdGx5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNvbnRlbnQpLCA0KQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X21ha2VfZGlzdHJpYnV0aW9uKHNlbGYpOgorCisgICAgICAgICMgY2hlY2sgaWYgdGFyIGFuZCBnemlwIGFyZSBpbnN0YWxsZWQKKyAgICAgICAgaWYgKGZpbmRfZXhlY3V0YWJsZSgndGFyJykgaXMgTm9uZSBvcgorICAgICAgICAgICAgZmluZF9leGVjdXRhYmxlKCdnemlwJykgaXMgTm9uZSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIG5vdyBidWlsZGluZyBhIHNkaXN0CisgICAgICAgIGRpc3QsIGNtZCA9IHNlbGYuZ2V0X2NtZCgpCisKKyAgICAgICAgIyBjcmVhdGluZyBhIGd6dGFyIHRoZW4gYSB0YXIKKyAgICAgICAgY21kLmZvcm1hdHMgPSBbJ2d6dGFyJywgJ3RhciddCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgIyBtYWtpbmcgc3VyZSB3ZSBoYXZlIHR3byBmaWxlcworICAgICAgICBkaXN0X2ZvbGRlciA9IGpvaW4oc2VsZi50bXBfZGlyLCAnZGlzdCcpCisgICAgICAgIHJlc3VsdCA9IG9zLmxpc3RkaXIoZGlzdF9mb2xkZXIpCisgICAgICAgIHJlc3VsdC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFsnZmFrZS0xLjAudGFyJywgJ2Zha2UtMS4wLnRhci5neiddKQorCisgICAgICAgIG9zLnJlbW92ZShqb2luKGRpc3RfZm9sZGVyLCAnZmFrZS0xLjAudGFyJykpCisgICAgICAgIG9zLnJlbW92ZShqb2luKGRpc3RfZm9sZGVyLCAnZmFrZS0xLjAudGFyLmd6JykpCisKKyAgICAgICAgIyBub3cgdHJ5aW5nIGEgdGFyIHRoZW4gYSBnenRhcgorICAgICAgICBjbWQuZm9ybWF0cyA9IFsndGFyJywgJ2d6dGFyJ10KKworICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgIHJlc3VsdCA9IG9zLmxpc3RkaXIoZGlzdF9mb2xkZXIpCisgICAgICAgIHJlc3VsdC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFsnZmFrZS0xLjAudGFyJywgJ2Zha2UtMS4wLnRhci5neiddKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3VuaWNvZGVfbWV0YWRhdGFfdGd6KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVW5pY29kZSBuYW1lIG9yIHZlcnNpb24gc2hvdWxkIG5vdCBicmVhayBidWlsZGluZyB0byB0YXIuZ3ogZm9ybWF0LgorICAgICAgICBSZWZlcmVuY2UgaXNzdWUgIzExNjM4LgorICAgICAgICAiIiIKKworICAgICAgICAjIGNyZWF0ZSB0aGUgc2Rpc3QgY29tbWFuZCB3aXRoIHVuaWNvZGUgcGFyYW1ldGVycworICAgICAgICBkaXN0LCBjbWQgPSBzZWxmLmdldF9jbWQoeyduYW1lJzogdSdmYWtlJywgJ3ZlcnNpb24nOiB1JzEuMCd9KQorCisgICAgICAgICMgY3JlYXRlIHRoZSBzZGlzdCBhcyBnenRhciBhbmQgcnVuIHRoZSBjb21tYW5kCisgICAgICAgIGNtZC5mb3JtYXRzID0gWydnenRhciddCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgIyBUaGUgY29tbWFuZCBzaG91bGQgaGF2ZSBjcmVhdGVkIHRoZSAudGFyLmd6IGZpbGUKKyAgICAgICAgZGlzdF9mb2xkZXIgPSBqb2luKHNlbGYudG1wX2RpciwgJ2Rpc3QnKQorICAgICAgICByZXN1bHQgPSBvcy5saXN0ZGlyKGRpc3RfZm9sZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWydmYWtlLTEuMC50YXIuZ3onXSkKKworICAgICAgICBvcy5yZW1vdmUoam9pbihkaXN0X2ZvbGRlciwgJ2Zha2UtMS4wLnRhci5neicpKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X2FkZF9kZWZhdWx0cyhzZWxmKToKKworICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMjc5CisKKyAgICAgICAgIyBhZGRfZGVmYXVsdCBzaG91bGQgYWxzbyBpbmNsdWRlCisgICAgICAgICMgZGF0YV9maWxlcyBhbmQgcGFja2FnZV9kYXRhCisgICAgICAgIGRpc3QsIGNtZCA9IHNlbGYuZ2V0X2NtZCgpCisKKyAgICAgICAgIyBmaWxsaW5nIGRhdGFfZmlsZXMgYnkgcG9pbnRpbmcgZmlsZXMKKyAgICAgICAgIyBpbiBwYWNrYWdlX2RhdGEKKyAgICAgICAgZGlzdC5wYWNrYWdlX2RhdGEgPSB7Jyc6IFsnKi5jZmcnLCAnKi5kYXQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvbWVjb2RlJzogWycqLnR4dCddfQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ3NvbWVjb2RlJywgJ2RvYy50eHQnKSwgJyMnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ3NvbWVjb2RlJywgJ2RvYy5kYXQnKSwgJyMnKQorCisgICAgICAgICMgYWRkaW5nIHNvbWUgZGF0YSBpbiBkYXRhX2ZpbGVzCisgICAgICAgIGRhdGFfZGlyID0gam9pbihzZWxmLnRtcF9kaXIsICdkYXRhJykKKyAgICAgICAgb3MubWtkaXIoZGF0YV9kaXIpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoZGF0YV9kaXIsICdkYXRhLmR0JyksICcjJykKKyAgICAgICAgc29tZV9kaXIgPSBqb2luKHNlbGYudG1wX2RpciwgJ3NvbWUnKQorICAgICAgICBvcy5ta2Rpcihzb21lX2RpcikKKyAgICAgICAgIyBtYWtlIHN1cmUgVkNTIGRpcmVjdG9yaWVzIGFyZSBwcnVuZWQgKCMxNDAwNCkKKyAgICAgICAgaGdfZGlyID0gam9pbihzZWxmLnRtcF9kaXIsICcuaGcnKQorICAgICAgICBvcy5ta2RpcihoZ19kaXIpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoaGdfZGlyLCAnbGFzdC1tZXNzYWdlLnR4dCcpLCAnIycpCisgICAgICAgICMgYSBidWdneSByZWdleCB1c2VkIHRvIHByZXZlbnQgdGhpcyBmcm9tIHdvcmtpbmcgb24gd2luZG93cyAoIzY4ODQpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnYnVpbGRvdXQuY2ZnJyksICcjJykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsICdpbnJvb3QudHh0JyksICcjJykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzb21lX2RpciwgJ2ZpbGUudHh0JyksICcjJykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzb21lX2RpciwgJ290aGVyX2ZpbGUudHh0JyksICcjJykKKworICAgICAgICBkaXN0LmRhdGFfZmlsZXMgPSBbKCdkYXRhJywgWydkYXRhL2RhdGEuZHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWlsZG91dC5jZmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnJvb3QudHh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm90ZXhpc3RpbmcnXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnc29tZS9maWxlLnR4dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnc29tZS9vdGhlcl9maWxlLnR4dCddCisKKyAgICAgICAgIyBhZGRpbmcgYSBzY3JpcHQKKyAgICAgICAgc2NyaXB0X2RpciA9IGpvaW4oc2VsZi50bXBfZGlyLCAnc2NyaXB0cycpCisgICAgICAgIG9zLm1rZGlyKHNjcmlwdF9kaXIpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2NyaXB0X2RpciwgJ3NjcmlwdC5weScpLCAnIycpCisgICAgICAgIGRpc3Quc2NyaXB0cyA9IFtqb2luKCdzY3JpcHRzJywgJ3NjcmlwdC5weScpXQorCisgICAgICAgIGNtZC5mb3JtYXRzID0gWyd6aXAnXQorICAgICAgICBjbWQudXNlX2RlZmF1bHRzID0gVHJ1ZQorCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgIyBub3cgbGV0J3MgY2hlY2sgd2hhdCB3ZSBoYXZlCisgICAgICAgIGRpc3RfZm9sZGVyID0gam9pbihzZWxmLnRtcF9kaXIsICdkaXN0JykKKyAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKGRpc3RfZm9sZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVzLCBbJ2Zha2UtMS4wLnppcCddKQorCisgICAgICAgIHppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKGpvaW4oZGlzdF9mb2xkZXIsICdmYWtlLTEuMC56aXAnKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29udGVudCA9IHppcF9maWxlLm5hbWVsaXN0KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHppcF9maWxlLmNsb3NlKCkKKworICAgICAgICAjIG1ha2luZyBzdXJlIGV2ZXJ5dGhpbmcgd2FzIGFkZGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNvbnRlbnQpLCAxMikKKworICAgICAgICAjIGNoZWNraW5nIHRoZSBNQU5JRkVTVAorICAgICAgICBmID0gb3Blbihqb2luKHNlbGYudG1wX2RpciwgJ01BTklGRVNUJykpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1hbmlmZXN0ID0gZi5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hbmlmZXN0LCBNQU5JRkVTVCAlIHsnc2VwJzogb3Muc2VwfSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9tZXRhZGF0YV9jaGVja19vcHRpb24oc2VsZik6CisgICAgICAgICMgdGVzdGluZyB0aGUgYG1lZGF0YS1jaGVja2Agb3B0aW9uCisgICAgICAgIGRpc3QsIGNtZCA9IHNlbGYuZ2V0X2NtZChtZXRhZGF0YT17fSkKKworICAgICAgICAjIHRoaXMgc2hvdWxkIHJhaXNlIHNvbWUgd2FybmluZ3MgIQorICAgICAgICAjIHdpdGggdGhlIGBjaGVja2Agc3ViY29tbWFuZAorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorICAgICAgICB3YXJuaW5ncyA9IFttc2cgZm9yIG1zZyBpbiBzZWxmLmdldF9sb2dzKFdBUk4pIGlmCisgICAgICAgICAgICAgICAgICAgIG1zZy5zdGFydHN3aXRoKCd3YXJuaW5nOiBjaGVjazonKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4od2FybmluZ3MpLCAyKQorCisgICAgICAgICMgdHJ5aW5nIHdpdGggYSBjb21wbGV0ZSBzZXQgb2YgbWV0YWRhdGEKKyAgICAgICAgc2VsZi5jbGVhcl9sb2dzKCkKKyAgICAgICAgZGlzdCwgY21kID0gc2VsZi5nZXRfY21kKCkKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQubWV0YWRhdGFfY2hlY2sgPSAwCisgICAgICAgIGNtZC5ydW4oKQorICAgICAgICB3YXJuaW5ncyA9IFttc2cgZm9yIG1zZyBpbiBzZWxmLmdldF9sb2dzKFdBUk4pIGlmCisgICAgICAgICAgICAgICAgICAgIG1zZy5zdGFydHN3aXRoKCd3YXJuaW5nOiBjaGVjazonKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4od2FybmluZ3MpLCAwKQorCisgICAgZGVmIHRlc3RfY2hlY2tfbWV0YWRhdGFfZGVwcmVjYXRlZChzZWxmKToKKyAgICAgICAgIyBtYWtlcyBzdXJlIG1ha2VfbWV0YWRhdGEgaXMgZGVwcmVjYXRlZAorICAgICAgICBkaXN0LCBjbWQgPSBzZWxmLmdldF9jbWQoKQorICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiYWx3YXlzIikKKyAgICAgICAgICAgIGNtZC5jaGVja19tZXRhZGF0YSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMSkKKworICAgIGRlZiB0ZXN0X3Nob3dfZm9ybWF0cyhzZWxmKToKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CisgICAgICAgICAgICBzaG93X2Zvcm1hdHMoKQorCisgICAgICAgICMgdGhlIG91dHB1dCBzaG91bGQgYmUgYSBoZWFkZXIgbGluZSArIG9uZSBsaW5lIHBlciBmb3JtYXQKKyAgICAgICAgbnVtX2Zvcm1hdHMgPSBsZW4oQVJDSElWRV9GT1JNQVRTLmtleXMoKSkKKyAgICAgICAgb3V0cHV0ID0gW2xpbmUgZm9yIGxpbmUgaW4gc3Rkb3V0LmdldHZhbHVlKCkuc3BsaXQoJ1xuJykKKyAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKS5zdGFydHN3aXRoKCctLWZvcm1hdHM9JyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG91dHB1dCksIG51bV9mb3JtYXRzKQorCisgICAgZGVmIHRlc3RfZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgZGlzdCwgY21kID0gc2VsZi5nZXRfY21kKCkKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorCisgICAgICAgICMgZGVmYXVsdCBvcHRpb25zIHNldCBieSBmaW5hbGl6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5tYW5pZmVzdCwgJ01BTklGRVNUJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQudGVtcGxhdGUsICdNQU5JRkVTVC5pbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmRpc3RfZGlyLCAnZGlzdCcpCisKKyAgICAgICAgIyBmb3JtYXRzIGhhcyB0byBiZSBhIHN0cmluZyBzcGxpdGFibGUgb24gKCcgJywgJywnKSBvcgorICAgICAgICAjIGEgc3RyaW5nbGlzdAorICAgICAgICBjbWQuZm9ybWF0cyA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIGNtZC5maW5hbGl6ZV9vcHRpb25zKQorICAgICAgICBjbWQuZm9ybWF0cyA9IFsnemlwJ10KKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorCisgICAgICAgICMgZm9ybWF0cyBoYXMgdG8gYmUga25vd24KKyAgICAgICAgY21kLmZvcm1hdHMgPSAnc3VwYXppcGEnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCBjbWQuZmluYWxpemVfb3B0aW9ucykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhVSURfR0lEX1NVUFBPUlQsICJSZXF1aXJlcyBncnAgYW5kIHB3ZCBzdXBwb3J0IikKKyAgICBkZWYgdGVzdF9tYWtlX2Rpc3RyaWJ1dGlvbl9vd25lcl9ncm91cChzZWxmKToKKworICAgICAgICAjIGNoZWNrIGlmIHRhciBhbmQgZ3ppcCBhcmUgaW5zdGFsbGVkCisgICAgICAgIGlmIChmaW5kX2V4ZWN1dGFibGUoJ3RhcicpIGlzIE5vbmUgb3IKKyAgICAgICAgICAgIGZpbmRfZXhlY3V0YWJsZSgnZ3ppcCcpIGlzIE5vbmUpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBub3cgYnVpbGRpbmcgYSBzZGlzdAorICAgICAgICBkaXN0LCBjbWQgPSBzZWxmLmdldF9jbWQoKQorCisgICAgICAgICMgY3JlYXRpbmcgYSBnenRhciBhbmQgc3BlY2lmeWluZyB0aGUgb3duZXIrZ3JvdXAKKyAgICAgICAgY21kLmZvcm1hdHMgPSBbJ2d6dGFyJ10KKyAgICAgICAgY21kLm93bmVyID0gcHdkLmdldHB3dWlkKDApWzBdCisgICAgICAgIGNtZC5ncm91cCA9IGdycC5nZXRncmdpZCgwKVswXQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgICMgbWFraW5nIHN1cmUgd2UgaGF2ZSB0aGUgZ29vZCByaWdodHMKKyAgICAgICAgYXJjaGl2ZV9uYW1lID0gam9pbihzZWxmLnRtcF9kaXIsICdkaXN0JywgJ2Zha2UtMS4wLnRhci5neicpCisgICAgICAgIGFyY2hpdmUgPSB0YXJmaWxlLm9wZW4oYXJjaGl2ZV9uYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbWVtYmVyIGluIGFyY2hpdmUuZ2V0bWVtYmVycygpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtYmVyLnVpZCwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWJlci5naWQsIDApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBhcmNoaXZlLmNsb3NlKCkKKworICAgICAgICAjIGJ1aWxkaW5nIGEgc2Rpc3QgYWdhaW4KKyAgICAgICAgZGlzdCwgY21kID0gc2VsZi5nZXRfY21kKCkKKworICAgICAgICAjIGNyZWF0aW5nIGEgZ3p0YXIKKyAgICAgICAgY21kLmZvcm1hdHMgPSBbJ2d6dGFyJ10KKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICAjIG1ha2luZyBzdXJlIHdlIGhhdmUgdGhlIGdvb2QgcmlnaHRzCisgICAgICAgIGFyY2hpdmVfbmFtZSA9IGpvaW4oc2VsZi50bXBfZGlyLCAnZGlzdCcsICdmYWtlLTEuMC50YXIuZ3onKQorICAgICAgICBhcmNoaXZlID0gdGFyZmlsZS5vcGVuKGFyY2hpdmVfbmFtZSkKKworICAgICAgICAjIG5vdGUgdGhhdCB3ZSBhcmUgbm90IHRlc3RpbmcgdGhlIGdyb3VwIG93bmVyc2hpcCBoZXJlCisgICAgICAgICMgYmVjYXVzZSwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybXMgYW5kIHRoZSBjb250YWluZXIKKyAgICAgICAgIyByaWdodHMgKHNlZSAjNzQwOCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIG1lbWJlciBpbiBhcmNoaXZlLmdldG1lbWJlcnMoKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWJlci51aWQsIG9zLmdldHVpZCgpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgYXJjaGl2ZS5jbG9zZSgpCisKKyAgICAjIHRoZSBmb2xsb3dpbmcgdGVzdHMgbWFrZSBzdXJlIHRoZXJlIGlzIGEgbmljZSBlcnJvciBtZXNzYWdlIGluc3RlYWQKKyAgICAjIG9mIGEgdHJhY2ViYWNrIHdoZW4gcGFyc2luZyBhbiBpbnZhbGlkIG1hbmlmZXN0IHRlbXBsYXRlCisKKyAgICBkZWYgX2NoZWNrX3RlbXBsYXRlKHNlbGYsIGNvbnRlbnQpOgorICAgICAgICBkaXN0LCBjbWQgPSBzZWxmLmdldF9jbWQoKQorICAgICAgICBvcy5jaGRpcihzZWxmLnRtcF9kaXIpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgnTUFOSUZFU1QuaW4nLCBjb250ZW50KQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5maWxlbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgY21kLnJlYWRfdGVtcGxhdGUoKQorICAgICAgICB3YXJuaW5ncyA9IHNlbGYuZ2V0X2xvZ3MoV0FSTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4od2FybmluZ3MpLCAxKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF90ZW1wbGF0ZV91bmtub3duX2NvbW1hbmQoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX3RlbXBsYXRlKCd0YXVudCBrbmlnaHRzIConKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF90ZW1wbGF0ZV93cm9uZ19hcmd1bWVudHMoc2VsZik6CisgICAgICAgICMgdGhpcyBtYW5pZmVzdCBjb21tYW5kIHRha2VzIG9uZSBhcmd1bWVudAorICAgICAgICBzZWxmLl9jaGVja190ZW1wbGF0ZSgncHJ1bmUnKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihvcy5uYW1lICE9ICdudCcsICd0ZXN0IHJlbGV2YW50IGZvciBXaW5kb3dzIG9ubHknKQorICAgIGRlZiB0ZXN0X2ludmFsaWRfdGVtcGxhdGVfd3JvbmdfcGF0aChzZWxmKToKKyAgICAgICAgIyBvbiBXaW5kb3dzLCB0cmFpbGluZyBzbGFzaGVzIGFyZSBub3QgYWxsb3dlZAorICAgICAgICAjIHRoaXMgdXNlZCB0byBjcmFzaCBpbnN0ZWFkIG9mIHJhaXNpbmcgYSB3YXJuaW5nOiAjODI4NgorICAgICAgICBzZWxmLl9jaGVja190ZW1wbGF0ZSgnaW5jbHVkZSBleGFtcGxlcy8nKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X2dldF9maWxlX2xpc3Qoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIE1BTklGRVNUIGlzIHJlY2FsY3VsYXRlZAorICAgICAgICBkaXN0LCBjbWQgPSBzZWxmLmdldF9jbWQoKQorCisgICAgICAgICMgZmlsbGluZyBkYXRhX2ZpbGVzIGJ5IHBvaW50aW5nIGZpbGVzIGluIHBhY2thZ2VfZGF0YQorICAgICAgICBkaXN0LnBhY2thZ2VfZGF0YSA9IHsnc29tZWNvZGUnOiBbJyoudHh0J119CisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnc29tZWNvZGUnLCAnZG9jLnR4dCcpLCAnIycpCisgICAgICAgIGNtZC5mb3JtYXRzID0gWydnenRhciddCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgZiA9IG9wZW4oY21kLm1hbmlmZXN0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtYW5pZmVzdCA9IFtsaW5lLnN0cmlwKCkgZm9yIGxpbmUgaW4gZi5yZWFkKCkuc3BsaXQoJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKSAhPSAnJ10KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1hbmlmZXN0KSwgNSkKKworICAgICAgICAjIGFkZGluZyBhIGZpbGUKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsICdzb21lY29kZScsICdkb2MyLnR4dCcpLCAnIycpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgYnVpbGRfcHkgaXMgcmVpbml0aWFsaXplZCwgbGlrZSBhIGZyZXNoIHJ1bgorICAgICAgICBidWlsZF9weSA9IGRpc3QuZ2V0X2NvbW1hbmRfb2JqKCdidWlsZF9weScpCisgICAgICAgIGJ1aWxkX3B5LmZpbmFsaXplZCA9IEZhbHNlCisgICAgICAgIGJ1aWxkX3B5LmVuc3VyZV9maW5hbGl6ZWQoKQorCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgIGYgPSBvcGVuKGNtZC5tYW5pZmVzdCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFuaWZlc3QyID0gW2xpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiBmLnJlYWQoKS5zcGxpdCgnXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKSAhPSAnJ10KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICMgZG8gd2UgaGF2ZSB0aGUgbmV3IGZpbGUgaW4gTUFOSUZFU1QgPworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtYW5pZmVzdDIpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEluKCdkb2MyLnR4dCcsIG1hbmlmZXN0MlstMV0pCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfbWFuaWZlc3RfbWFya2VyKHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgYXV0b2dlbmVyYXRlZCBNQU5JRkVTVHMgaGF2ZSBhIG1hcmtlcgorICAgICAgICBkaXN0LCBjbWQgPSBzZWxmLmdldF9jbWQoKQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgIGYgPSBvcGVuKGNtZC5tYW5pZmVzdCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFuaWZlc3QgPSBbbGluZS5zdHJpcCgpIGZvciBsaW5lIGluIGYucmVhZCgpLnNwbGl0KCdcbicpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0cmlwKCkgIT0gJyddCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hbmlmZXN0WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICcjIGZpbGUgR0VORVJBVEVEIGJ5IGRpc3R1dGlscywgZG8gTk9UIGVkaXQnKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgJ3JlcXVpcmVzIHpsaWInKQorICAgIGRlZiB0ZXN0X21hbmlmZXN0X2NvbW1lbnRzKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSBjb21tZW50cyBkb24ndCBjYXVzZSBleGNlcHRpb25zIG9yIHdyb25nIGluY2x1ZGVzCisgICAgICAgIGNvbnRlbnRzID0gZGVkZW50KCIiIlwKKyAgICAgICAgICAgICMgYmFkLnB5CisgICAgICAgICAgICAjYmFkLnB5CisgICAgICAgICAgICBnb29kLnB5CisgICAgICAgICAgICAiIiIpCisgICAgICAgIGRpc3QsIGNtZCA9IHNlbGYuZ2V0X2NtZCgpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsIGNtZC5tYW5pZmVzdCksIGNvbnRlbnRzKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ2dvb2QucHknKSwgJyMgcGljayBtZSEnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ2JhZC5weScpLCAiIyBkb24ndCBwaWNrIG1lISIpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnI2JhZC5weScpLCAiIyBkb24ndCBwaWNrIG1lISIpCisgICAgICAgIGNtZC5ydW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5maWxlbGlzdC5maWxlcywgWydnb29kLnB5J10pCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfbWFudWFsX21hbmlmZXN0KHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgYSBNQU5JRkVTVCB3aXRob3V0IGEgbWFya2VyIGlzIGxlZnQgYWxvbmUKKyAgICAgICAgZGlzdCwgY21kID0gc2VsZi5nZXRfY21kKCkKKyAgICAgICAgY21kLmZvcm1hdHMgPSBbJ2d6dGFyJ10KKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgY21kLm1hbmlmZXN0KSwgJ1JFQURNRS5tYW51YWwnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ1JFQURNRS5tYW51YWwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBwcm9qZWN0IG1haW50YWlucyBpdHMgTUFOSUZFU1QgZmlsZSBpdHNlbGYuJykKKyAgICAgICAgY21kLnJ1bigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmZpbGVsaXN0LmZpbGVzLCBbJ1JFQURNRS5tYW51YWwnXSkKKworICAgICAgICBmID0gb3BlbihjbWQubWFuaWZlc3QpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1hbmlmZXN0ID0gW2xpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiBmLnJlYWQoKS5zcGxpdCgnXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpICE9ICcnXQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYW5pZmVzdCwgWydSRUFETUUubWFudWFsJ10pCisKKyAgICAgICAgYXJjaGl2ZV9uYW1lID0gam9pbihzZWxmLnRtcF9kaXIsICdkaXN0JywgJ2Zha2UtMS4wLnRhci5neicpCisgICAgICAgIGFyY2hpdmUgPSB0YXJmaWxlLm9wZW4oYXJjaGl2ZV9uYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlbmFtZXMgPSBbdGFyaW5mby5uYW1lIGZvciB0YXJpbmZvIGluIGFyY2hpdmVdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBhcmNoaXZlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoZmlsZW5hbWVzKSwgWydmYWtlLTEuMCcsICdmYWtlLTEuMC9QS0ctSU5GTycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFrZS0xLjAvUkVBRE1FLm1hbnVhbCddKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoU0Rpc3RUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zZGlzdC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NkaXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQ1ZTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zZGlzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zZGlzdC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NkaXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQ1ZTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zZGlzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3Bhd24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmYTU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3Bhd24ucHkKQEAgLTAsMCArMSw2MCBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5zcGF3bi4iIiIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgdGltZQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0LCBydW5fdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IF9udF9xdW90ZV9hcmdzCitmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgc3Bhd24sIGZpbmRfZXhlY3V0YWJsZQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFeGVjRXJyb3IKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CisKK2NsYXNzIFNwYXduVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X250X3F1b3RlX2FyZ3Moc2VsZik6CisKKyAgICAgICAgZm9yIChhcmdzLCB3YW50ZWQpIGluICgoWyd3aXRoIHNwYWNlJywgJ25vc3BhY2UnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWycid2l0aCBzcGFjZSInLCAnbm9zcGFjZSddKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWydub2NoYW5nZScsICdub3NwYWNlJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnbm9jaGFuZ2UnLCAnbm9zcGFjZSddKSk6CisgICAgICAgICAgICByZXMgPSBfbnRfcXVvdGVfYXJncyhhcmdzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHdhbnRlZCkKKworCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MubmFtZSBpbiAoJ250JywgJ3Bvc2l4JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1J1bnMgb25seSB1bmRlciBwb3NpeCBvciBudCcpCisgICAgZGVmIHRlc3Rfc3Bhd24oc2VsZik6CisgICAgICAgIHRtcGRpciA9IHNlbGYubWtkdGVtcCgpCisKKyAgICAgICAgIyBjcmVhdGluZyBzb21ldGhpbmcgZXhlY3V0YWJsZQorICAgICAgICAjIHRocm91Z2ggdGhlIHNoZWxsIHRoYXQgcmV0dXJucyAxCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgICAgIGV4ZSA9IG9zLnBhdGguam9pbih0bXBkaXIsICdmb28uc2gnKQorICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKGV4ZSwgJyMhL2Jpbi9zaFxuZXhpdCAxJykKKyAgICAgICAgICAgIG9zLmNobW9kKGV4ZSwgMDc3NykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV4ZSA9IG9zLnBhdGguam9pbih0bXBkaXIsICdmb28uYmF0JykKKyAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZShleGUsICdleGl0IDEnKQorCisgICAgICAgIG9zLmNobW9kKGV4ZSwgMDc3NykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzRXhlY0Vycm9yLCBzcGF3biwgW2V4ZV0pCisKKyAgICAgICAgIyBub3cgc29tZXRoaW5nIHRoYXQgd29ya3MKKyAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAgICAgZXhlID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2Zvby5zaCcpCisgICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZXhlLCAnIyEvYmluL3NoXG5leGl0IDAnKQorICAgICAgICAgICAgb3MuY2htb2QoZXhlLCAwNzc3KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhlID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2Zvby5iYXQnKQorICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKGV4ZSwgJ2V4aXQgMCcpCisKKyAgICAgICAgb3MuY2htb2QoZXhlLCAwNzc3KQorICAgICAgICBzcGF3bihbZXhlXSkgICMgc2hvdWxkIHdvcmsgd2l0aG91dCBhbnkgZXJyb3IKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKFNwYXduVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3Bhd24ucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmMDVkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3Bhd24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3Bhd24ucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NmMDVkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3Bhd24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3lzY29uZmlnLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiNDBkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3lzY29uZmlnLnB5CkBAIC0wLDAgKzEsMTE3IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnN5c2NvbmZpZy4iIiIKK2ltcG9ydCBvcworaW1wb3J0IHRlc3QKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNodXRpbAorCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOCisKK2NsYXNzIFN5c2NvbmZpZ1Rlc3RDYXNlKHN1cHBvcnQuRW52aXJvbkd1YXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoU3lzY29uZmlnVGVzdENhc2UsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5tYWtlZmlsZSA9IE5vbmUKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5tYWtlZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9zLnVubGluayhzZWxmLm1ha2VmaWxlKQorICAgICAgICBzZWxmLmNsZWFudXBfdGVzdGZuKCkKKyAgICAgICAgc3VwZXIoU3lzY29uZmlnVGVzdENhc2UsIHNlbGYpLnRlYXJEb3duKCkKKworICAgIGRlZiBjbGVhbnVwX3Rlc3RmbihzZWxmKToKKyAgICAgICAgcGF0aCA9IHRlc3QudGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoKQorICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHBhdGgpCisKKyAgICBkZWYgdGVzdF9nZXRfcHl0aG9uX2xpYihzZWxmKToKKyAgICAgICAgbGliX2RpciA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYigpCisgICAgICAgICMgWFhYIGRvZXNuJ3Qgd29yayBvbiBMaW51eCB3aGVuIFB5dGhvbiB3YXMgbmV2ZXIgaW5zdGFsbGVkIGJlZm9yZQorICAgICAgICAjc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNkaXIobGliX2RpciksIGxpYl9kaXIpCisgICAgICAgICMgdGVzdCBmb3IgcHl0aG9ueHgubGliPworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYihwcmVmaXg9VEVTVEZOKSkKKyAgICAgICAgX3N5c2NvbmZpZyA9IF9faW1wb3J0X18oJ3N5c2NvbmZpZycpCisgICAgICAgIHJlcyA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYihUcnVlLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9zeXNjb25maWcuZ2V0X3BhdGgoJ3BsYXRzdGRsaWInKSwgcmVzKQorCisgICAgZGVmIHRlc3RfZ2V0X3B5dGhvbl9pbmMoc2VsZik6CisgICAgICAgIGluY19kaXIgPSBzeXNjb25maWcuZ2V0X3B5dGhvbl9pbmMoKQorICAgICAgICAjIFRoaXMgaXMgbm90IG11Y2ggb2YgYSB0ZXN0LiAgV2UgbWFrZSBzdXJlIFB5dGhvbi5oIGV4aXN0cworICAgICAgICAjIGluIHRoZSBkaXJlY3RvcnkgcmV0dXJuZWQgYnkgZ2V0X3B5dGhvbl9pbmMoKSBidXQgd2UgZG9uJ3Qga25vdworICAgICAgICAjIGl0IGlzIHRoZSBjb3JyZWN0IGZpbGUuCisgICAgICAgICNCcm9rZW4gYWZ0ZXIgaXNzdWUgNzcxMihyNzgxMzYpIDogYWRkIGEgdGVtcF9jd2QgY29udGV4dCBtYW5hZ2VyIHRvIHRlc3Rfc3VwcG9ydCAuLi4KKyAgICAgICAgI05PVEU6IEl0cyBmYWlsIG9uIHBsYXRmb3JtcyB3aXRob3V0IHJvb3QgZGlyZWN0b3J5IHN1cHBvcnQobGlrZSB3aW5kb3dzKQorICAgICAgICAjd2hlcmUgdGVtcCBhbmQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yaWVzIG1heSBzdGF5IG9uIGRpZmZlcmVudCBkcml2ZXJzLgorICAgICAgICBvbGRfd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcihTQVZFRENXRCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNkaXIoaW5jX2RpciksIGluY19kaXIpCisgICAgICAgIHB5dGhvbl9oID0gb3MucGF0aC5qb2luKGluY19kaXIsICJQeXRob24uaCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShweXRob25faCksIHB5dGhvbl9oKQorICAgICAgICBvcy5jaGRpcihvbGRfd2QpCisKKyAgICBkZWYgdGVzdF9wYXJzZV9tYWtlZmlsZV9iYXNlKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VmaWxlID0gdGVzdC50ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIGZkID0gb3BlbihzZWxmLm1ha2VmaWxlLCAndycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZkLndyaXRlKHIiQ09ORklHX0FSR1M9ICAnLS1hcmcxPW9wdGFyZzEnICdFTlY9TElCJyIgJ1xuJykKKyAgICAgICAgICAgIGZkLndyaXRlKCdWQVI9JE9USEVSXG5PVEhFUj1mb28nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmQuY2xvc2UoKQorICAgICAgICBkID0gc3lzY29uZmlnLnBhcnNlX21ha2VmaWxlKHNlbGYubWFrZWZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgeydDT05GSUdfQVJHUyc6ICInLS1hcmcxPW9wdGFyZzEnICdFTlY9TElCJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPVEhFUic6ICdmb28nfSkKKworICAgIGRlZiB0ZXN0X3BhcnNlX21ha2VmaWxlX2xpdGVyYWxfZG9sbGFyKHNlbGYpOgorICAgICAgICBzZWxmLm1ha2VmaWxlID0gdGVzdC50ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIGZkID0gb3BlbihzZWxmLm1ha2VmaWxlLCAndycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZkLndyaXRlKHIiQ09ORklHX0FSR1M9ICAnLS1hcmcxPW9wdGFyZzEnICdFTlY9XCQkTElCJyIgJ1xuJykKKyAgICAgICAgICAgIGZkLndyaXRlKCdWQVI9JE9USEVSXG5PVEhFUj1mb28nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmQuY2xvc2UoKQorICAgICAgICBkID0gc3lzY29uZmlnLnBhcnNlX21ha2VmaWxlKHNlbGYubWFrZWZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgeydDT05GSUdfQVJHUyc6IHIiJy0tYXJnMT1vcHRhcmcxJyAnRU5WPVwkTElCJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdPVEhFUic6ICdmb28nfSkKKworCisgICAgZGVmIHRlc3Rfc3lzY29uZmlnX21vZHVsZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5c2NvbmZpZyBhcyBnbG9iYWxfc3lzY29uZmlnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2xvYmFsX3N5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQ0ZMQUdTJyksIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQ0ZMQUdTJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2xvYmFsX3N5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignTERGTEFHUycpLCBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0xERkxBR1MnKSkKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdDVVNUT01JWkVEX09TWF9DT01QSUxFUicpLCdjb21waWxlciBmbGFncyBjdXN0b21pemVkJykKKyAgICBkZWYgdGVzdF9zeXNjb25maWdfY29tcGlsZXJfdmFycyhzZWxmKToKKyAgICAgICAgIyBPbiBPUyBYLCBiaW5hcnkgaW5zdGFsbGVycyBzdXBwb3J0IGV4dGVuc2lvbiBtb2R1bGUgYnVpbGRpbmcgb24KKyAgICAgICAgIyB2YXJpb3VzIGxldmVscyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB3aXRoIGRpZmZlcmluZyBYY29kZQorICAgICAgICAjIGNvbmZpZ3VyYXRpb25zLiAgVGhpcyByZXF1aXJlcyBjdXN0b21pemF0aW9uIG9mIHNvbWUgb2YgdGhlCisgICAgICAgICMgY29tcGlsZXIgY29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIHRvIHN1aXQgdGhlIGVudmlyb25tZW50IG9uCisgICAgICAgICMgdGhlIGluc3RhbGxlZCBtYWNoaW5lLiAgU29tZSBvZiB0aGVzZSBjdXN0b21pemF0aW9ucyBtYXkgcmVxdWlyZQorICAgICAgICAjIHJ1bm5pbmcgZXh0ZXJuYWwgcHJvZ3JhbXMgYW5kLCBzbywgYXJlIGRlZmVycmVkIHVudGlsIG5lZWRlZCBieQorICAgICAgICAjIHRoZSBmaXJzdCBleHRlbnNpb24gbW9kdWxlIGJ1aWxkLiAgV2l0aCBQeXRob24gMy4zLCBvbmx5CisgICAgICAgICMgdGhlIERpc3R1dGlscyB2ZXJzaW9uIG9mIHN5c2NvbmZpZyBpcyB1c2VkIGZvciBleHRlbnNpb24gbW9kdWxlCisgICAgICAgICMgYnVpbGRzLCB3aGljaCBoYXBwZW5zIGVhcmxpZXIgaW4gdGhlIERpc3R1dGlscyB0ZXN0cy4gIFRoaXMgbWF5CisgICAgICAgICMgY2F1c2UgdGhlIGZvbGxvd2luZyB0ZXN0cyB0byBmYWlsIHNpbmNlIG5vIHRlc3RzIGhhdmUgY2F1c2VkCisgICAgICAgICMgdGhlIGdsb2JhbCB2ZXJzaW9uIG9mIHN5c2NvbmZpZyB0byBjYWxsIHRoZSBjdXN0b21pemF0aW9uIHlldC4KKyAgICAgICAgIyBUaGUgc29sdXRpb24gZm9yIG5vdyBpcyB0byBzaW1wbHkgc2tpcCB0aGlzIHRlc3QgaW4gdGhpcyBjYXNlLgorICAgICAgICAjIFRoZSBsb25nZXItdGVybSBzb2x1dGlvbiBpcyB0byBvbmx5IGhhdmUgb25lIHZlcnNpb24gb2Ygc3lzY29uZmlnLgorCisgICAgICAgIGltcG9ydCBzeXNjb25maWcgYXMgZ2xvYmFsX3N5c2NvbmZpZworICAgICAgICBpZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0NVU1RPTUlaRURfT1NYX0NPTVBJTEVSJyk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnbG9iYWxfc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdMRFNIQVJFRCcpLCBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0xEU0hBUkVEJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2xvYmFsX3N5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQ0MnKSwgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdDQycpKQorCisKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoU3lzY29uZmlnVGVzdENhc2UpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3lzY29uZmlnLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3lzY29uZmlnLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI1ODBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3lzY29uZmlnLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3lzY29uZmlnLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjI1ODBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdGV4dF9maWxlLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF90ZXh0X2ZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxOWNkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdGV4dF9maWxlLnB5CkBAIC0wLDAgKzEsMTA3IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnRleHRfZmlsZS4iIiIKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGRpc3R1dGlscy50ZXh0X2ZpbGUgaW1wb3J0IFRleHRGaWxlCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK1RFU1RfREFUQSA9ICIiIiMgdGVzdCBmaWxlCisKK2xpbmUgMyBcXAorIyBpbnRlcnZlbmluZyBjb21tZW50CisgIGNvbnRpbnVlcyBvbiBuZXh0IGxpbmUKKyIiIgorCitjbGFzcyBUZXh0RmlsZVRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NsYXNzKHNlbGYpOgorICAgICAgICAjIG9sZCB0ZXN0cyBtb3ZlZCBmcm9tIHRleHRfZmlsZS5fX21haW5fXworICAgICAgICAjIHNvIHRoZXkgYXJlIHJlYWxseSBjYWxsZWQgYnkgdGhlIGJ1aWxkYm90cworCisgICAgICAgICMgcmVzdWx0IDE6IG5vIGZhbmN5IG9wdGlvbnMKKyAgICAgICAgcmVzdWx0MSA9IFsnIyB0ZXN0IGZpbGVcbicsICdcbicsICdsaW5lIDMgXFxcbicsCisgICAgICAgICAgICAgICAgICAgJyMgaW50ZXJ2ZW5pbmcgY29tbWVudFxuJywKKyAgICAgICAgICAgICAgICAgICAnICBjb250aW51ZXMgb24gbmV4dCBsaW5lXG4nXQorCisgICAgICAgICMgcmVzdWx0IDI6IGp1c3Qgc3RyaXAgY29tbWVudHMKKyAgICAgICAgcmVzdWx0MiA9IFsiXG4iLAorICAgICAgICAgICAgICAgICAgICJsaW5lIDMgXFxcbiIsCisgICAgICAgICAgICAgICAgICAgIiAgY29udGludWVzIG9uIG5leHQgbGluZVxuIl0KKworICAgICAgICAjIHJlc3VsdCAzOiBqdXN0IHN0cmlwIGJsYW5rIGxpbmVzCisgICAgICAgIHJlc3VsdDMgPSBbIiMgdGVzdCBmaWxlXG4iLAorICAgICAgICAgICAgICAgICAgICJsaW5lIDMgXFxcbiIsCisgICAgICAgICAgICAgICAgICAgIiMgaW50ZXJ2ZW5pbmcgY29tbWVudFxuIiwKKyAgICAgICAgICAgICAgICAgICAiICBjb250aW51ZXMgb24gbmV4dCBsaW5lXG4iXQorCisgICAgICAgICMgcmVzdWx0IDQ6IGRlZmF1bHQsIHN0cmlwIGNvbW1lbnRzLCBibGFuayBsaW5lcywKKyAgICAgICAgIyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgICAgICByZXN1bHQ0ID0gWyJsaW5lIDMgXFwiLAorICAgICAgICAgICAgICAgICAgICIgIGNvbnRpbnVlcyBvbiBuZXh0IGxpbmUiXQorCisgICAgICAgICMgcmVzdWx0IDU6IHN0cmlwIGNvbW1lbnRzIGFuZCBibGFua3MsIHBsdXMgam9pbiBsaW5lcyAoYnV0IGRvbid0CisgICAgICAgICMgImNvbGxhcHNlIiBqb2luZWQgbGluZXMKKyAgICAgICAgcmVzdWx0NSA9IFsibGluZSAzICAgY29udGludWVzIG9uIG5leHQgbGluZSJdCisKKyAgICAgICAgIyByZXN1bHQgNjogc3RyaXAgY29tbWVudHMgYW5kIGJsYW5rcywgcGx1cyBqb2luIGxpbmVzIChhbmQKKyAgICAgICAgIyAiY29sbGFwc2UiIGpvaW5lZCBsaW5lcworICAgICAgICByZXN1bHQ2ID0gWyJsaW5lIDMgY29udGludWVzIG9uIG5leHQgbGluZSJdCisKKyAgICAgICAgZGVmIHRlc3RfaW5wdXQoY291bnQsIGRlc2NyaXB0aW9uLCBmaWxlLCBleHBlY3RlZF9yZXN1bHQpOgorICAgICAgICAgICAgcmVzdWx0ID0gZmlsZS5yZWFkbGluZXMoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkX3Jlc3VsdCkKKworICAgICAgICB0bXBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIsICJ0ZXN0LnR4dCIpCisgICAgICAgIG91dF9maWxlID0gb3BlbihmaWxlbmFtZSwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvdXRfZmlsZS53cml0ZShURVNUX0RBVEEpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvdXRfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgaW5fZmlsZSA9IFRleHRGaWxlKGZpbGVuYW1lLCBzdHJpcF9jb21tZW50cz0wLCBza2lwX2JsYW5rcz0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbHN0cmlwX3dzPTAsIHJzdHJpcF93cz0wKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0X2lucHV0KDEsICJubyBwcm9jZXNzaW5nIiwgaW5fZmlsZSwgcmVzdWx0MSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGluX2ZpbGUuY2xvc2UoKQorCisgICAgICAgIGluX2ZpbGUgPSBUZXh0RmlsZShmaWxlbmFtZSwgc3RyaXBfY29tbWVudHM9MSwgc2tpcF9ibGFua3M9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzdHJpcF93cz0wLCByc3RyaXBfd3M9MCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdF9pbnB1dCgyLCAic3RyaXAgY29tbWVudHMiLCBpbl9maWxlLCByZXN1bHQyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaW5fZmlsZS5jbG9zZSgpCisKKyAgICAgICAgaW5fZmlsZSA9IFRleHRGaWxlKGZpbGVuYW1lLCBzdHJpcF9jb21tZW50cz0wLCBza2lwX2JsYW5rcz0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbHN0cmlwX3dzPTAsIHJzdHJpcF93cz0wKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0X2lucHV0KDMsICJzdHJpcCBibGFua3MiLCBpbl9maWxlLCByZXN1bHQzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaW5fZmlsZS5jbG9zZSgpCisKKyAgICAgICAgaW5fZmlsZSA9IFRleHRGaWxlKGZpbGVuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0X2lucHV0KDQsICJkZWZhdWx0IHByb2Nlc3NpbmciLCBpbl9maWxlLCByZXN1bHQ0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaW5fZmlsZS5jbG9zZSgpCisKKyAgICAgICAgaW5fZmlsZSA9IFRleHRGaWxlKGZpbGVuYW1lLCBzdHJpcF9jb21tZW50cz0xLCBza2lwX2JsYW5rcz0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbl9saW5lcz0xLCByc3RyaXBfd3M9MSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdF9pbnB1dCg1LCAiam9pbiBsaW5lcyB3aXRob3V0IGNvbGxhcHNpbmciLCBpbl9maWxlLCByZXN1bHQ1KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaW5fZmlsZS5jbG9zZSgpCisKKyAgICAgICAgaW5fZmlsZSA9IFRleHRGaWxlKGZpbGVuYW1lLCBzdHJpcF9jb21tZW50cz0xLCBza2lwX2JsYW5rcz0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbl9saW5lcz0xLCByc3RyaXBfd3M9MSwgY29sbGFwc2Vfam9pbj0xKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0X2lucHV0KDYsICJqb2luIGxpbmVzIHdpdGggY29sbGFwc2luZyIsIGluX2ZpbGUsIHJlc3VsdDYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpbl9maWxlLmNsb3NlKCkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKFRleHRGaWxlVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdGV4dF9maWxlLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdGV4dF9maWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2NlOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF90ZXh0X2ZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdGV4dF9maWxlLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdGV4dF9maWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2NlOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF90ZXh0X2ZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdW5peGNjb21waWxlci5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdW5peGNjb21waWxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmY5MmY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5CkBAIC0wLDAgKzEsMTMwIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnVuaXhjY29tcGlsZXIuIiIiCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCitmcm9tIGRpc3R1dGlscy51bml4Y2NvbXBpbGVyIGltcG9ydCBVbml4Q0NvbXBpbGVyCisKK2NsYXNzIFVuaXhDQ29tcGlsZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX2JhY2t1cF9wbGF0Zm9ybSA9IHN5cy5wbGF0Zm9ybQorICAgICAgICBzZWxmLl9iYWNrdXBfZ2V0X2NvbmZpZ192YXIgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIKKyAgICAgICAgY2xhc3MgQ29tcGlsZXJXcmFwcGVyKFVuaXhDQ29tcGlsZXIpOgorICAgICAgICAgICAgZGVmIHJwYXRoX2ZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5ydW50aW1lX2xpYnJhcnlfZGlyX29wdGlvbignL2ZvbycpCisgICAgICAgIHNlbGYuY2MgPSBDb21waWxlcldyYXBwZXIoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMucGxhdGZvcm0gPSBzZWxmLl9iYWNrdXBfcGxhdGZvcm0KKyAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyID0gc2VsZi5fYmFja3VwX2dldF9jb25maWdfdmFyCisKKyAgICBkZWYgdGVzdF9ydW50aW1lX2xpYmRpcl9vcHRpb24oc2VsZik6CisKKyAgICAgICAgIyBub3QgdGVzdGVkIHVuZGVyIHdpbmRvd3MKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIElzc3VlIzU5MDAKKyAgICAgICAgIworICAgICAgICAjIEVuc3VyZSBSVU5QQVRIIGlzIGFkZGVkIHRvIGV4dGVuc2lvbiBtb2R1bGVzIHdpdGggUlBBVEggaWYKKyAgICAgICAgIyBHTlUgbGQgaXMgdXNlZAorCisgICAgICAgICMgZGFyd2luCisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICdkYXJ3aW4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jYy5ycGF0aF9mb28oKSwgJy1ML2ZvbycpCisKKyAgICAgICAgIyBocC11eAorICAgICAgICBzeXMucGxhdGZvcm0gPSAnaHAtdXgnCisgICAgICAgIG9sZF9nY3YgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIKKyAgICAgICAgZGVmIGdjdih2KToKKyAgICAgICAgICAgIHJldHVybiAneHh4JworICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIgPSBnY3YKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNjLnJwYXRoX2ZvbygpLCBbJytzJywgJy1ML2ZvbyddKQorCisgICAgICAgIGRlZiBnY3Yodik6CisgICAgICAgICAgICByZXR1cm4gJ2djYycKKyAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyID0gZ2N2CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jYy5ycGF0aF9mb28oKSwgWyctV2wsK3MnLCAnLUwvZm9vJ10pCisKKyAgICAgICAgZGVmIGdjdih2KToKKyAgICAgICAgICAgIHJldHVybiAnZysrJworICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIgPSBnY3YKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNjLnJwYXRoX2ZvbygpLCBbJy1XbCwrcycsICctTC9mb28nXSkKKworICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIgPSBvbGRfZ2N2CisKKyAgICAgICAgIyBpcml4NjQ2CisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICdpcml4NjQ2JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2MucnBhdGhfZm9vKCksIFsnLXJwYXRoJywgJy9mb28nXSkKKworICAgICAgICAjIG9zZjFWNQorICAgICAgICBzeXMucGxhdGZvcm0gPSAnb3NmMVY1JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2MucnBhdGhfZm9vKCksIFsnLXJwYXRoJywgJy9mb28nXSkKKworICAgICAgICAjIEdDQyBHTlVMRAorICAgICAgICBzeXMucGxhdGZvcm0gPSAnYmFyJworICAgICAgICBkZWYgZ2N2KHYpOgorICAgICAgICAgICAgaWYgdiA9PSAnQ0MnOgorICAgICAgICAgICAgICAgIHJldHVybiAnZ2NjJworICAgICAgICAgICAgZWxpZiB2ID09ICdHTlVMRCc6CisgICAgICAgICAgICAgICAgcmV0dXJuICd5ZXMnCisgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhciA9IGdjdgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2MucnBhdGhfZm9vKCksICctV2wsLVIvZm9vJykKKworICAgICAgICAjIEdDQyBub24tR05VTEQKKyAgICAgICAgc3lzLnBsYXRmb3JtID0gJ2JhcicKKyAgICAgICAgZGVmIGdjdih2KToKKyAgICAgICAgICAgIGlmIHYgPT0gJ0NDJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2djYycKKyAgICAgICAgICAgIGVsaWYgdiA9PSAnR05VTEQnOgorICAgICAgICAgICAgICAgIHJldHVybiAnbm8nCisgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhciA9IGdjdgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2MucnBhdGhfZm9vKCksICctV2wsLVIvZm9vJykKKworICAgICAgICAjIEdDQyBHTlVMRCB3aXRoIGZ1bGx5IHF1YWxpZmllZCBjb25maWd1cmF0aW9uIHByZWZpeAorICAgICAgICAjIHNlZSAjNzYxNworICAgICAgICBzeXMucGxhdGZvcm0gPSAnYmFyJworICAgICAgICBkZWYgZ2N2KHYpOgorICAgICAgICAgICAgaWYgdiA9PSAnQ0MnOgorICAgICAgICAgICAgICAgIHJldHVybiAneDg2XzY0LXBjLWxpbnV4LWdudS1nY2MtNC40LjInCisgICAgICAgICAgICBlbGlmIHYgPT0gJ0dOVUxEJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ3llcycKKyAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyID0gZ2N2CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jYy5ycGF0aF9mb28oKSwgJy1XbCwtUi9mb28nKQorCisKKyAgICAgICAgIyBub24tR0NDIEdOVUxECisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICdiYXInCisgICAgICAgIGRlZiBnY3Yodik6CisgICAgICAgICAgICBpZiB2ID09ICdDQyc6CisgICAgICAgICAgICAgICAgcmV0dXJuICdjYycKKyAgICAgICAgICAgIGVsaWYgdiA9PSAnR05VTEQnOgorICAgICAgICAgICAgICAgIHJldHVybiAneWVzJworICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIgPSBnY3YKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNjLnJwYXRoX2ZvbygpLCAnLVIvZm9vJykKKworICAgICAgICAjIG5vbi1HQ0Mgbm9uLUdOVUxECisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICdiYXInCisgICAgICAgIGRlZiBnY3Yodik6CisgICAgICAgICAgICBpZiB2ID09ICdDQyc6CisgICAgICAgICAgICAgICAgcmV0dXJuICdjYycKKyAgICAgICAgICAgIGVsaWYgdiA9PSAnR05VTEQnOgorICAgICAgICAgICAgICAgIHJldHVybiAnbm8nCisgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhciA9IGdjdgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2MucnBhdGhfZm9vKCksICctUi9mb28nKQorCisgICAgICAgICMgQUlYIEMvQysrIGxpbmtlcgorICAgICAgICBzeXMucGxhdGZvcm0gPSAnYWl4JworICAgICAgICBkZWYgZ2N2KHYpOgorICAgICAgICAgICAgcmV0dXJuICd4eHgnCisgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhciA9IGdjdgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2MucnBhdGhfZm9vKCksICctYmxpYnBhdGg6L2ZvbycpCisKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKFVuaXhDQ29tcGlsZXJUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdW5peGNjb21waWxlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwYjNjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdW5peGNjb21waWxlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdW5peGNjb21waWxlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwYjNjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdW5peGNjb21waWxlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91cGxvYWQucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTExMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91cGxvYWQucHkKQEAgLTAsMCArMSwxMzEgQEAKKyMgLSotIGVuY29kaW5nOiB1dGY4IC0qLQorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLnVwbG9hZC4iIiIKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuY29tbWFuZCBpbXBvcnQgdXBsb2FkIGFzIHVwbG9hZF9tb2QKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQudXBsb2FkIGltcG9ydCB1cGxvYWQKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbgorCitmcm9tIGRpc3R1dGlscy50ZXN0cy50ZXN0X2NvbmZpZyBpbXBvcnQgUFlQSVJDLCBQeVBJUkNDb21tYW5kVGVzdENhc2UKKworUFlQSVJDX0xPTkdfUEFTU1dPUkQgPSAiIiJcCitbZGlzdHV0aWxzXQorCitpbmRleC1zZXJ2ZXJzID0KKyAgICBzZXJ2ZXIxCisgICAgc2VydmVyMgorCitbc2VydmVyMV0KK3VzZXJuYW1lOm1lCitwYXNzd29yZDphYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhCisKK1tzZXJ2ZXIyXQordXNlcm5hbWU6bWVhZ2FpbgorcGFzc3dvcmQ6IHNlY3JldAorcmVhbG06YWNtZQorcmVwb3NpdG9yeTpodHRwOi8vYW5vdGhlci5weXBpLworIiIiCisKKworUFlQSVJDX05PUEFTU1dPUkQgPSAiIiJcCitbZGlzdHV0aWxzXQorCitpbmRleC1zZXJ2ZXJzID0KKyAgICBzZXJ2ZXIxCisKK1tzZXJ2ZXIxXQordXNlcm5hbWU6bWUKKyIiIgorCitjbGFzcyBGYWtlT3BlbihvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCk6CisgICAgICAgIHNlbGYudXJsID0gdXJsCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHVybCwgc3RyKToKKyAgICAgICAgICAgIHNlbGYucmVxID0gdXJsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJlcSA9IE5vbmUKKyAgICAgICAgc2VsZi5tc2cgPSAnT0snCisKKyAgICBkZWYgZ2V0Y29kZShzZWxmKToKKyAgICAgICAgcmV0dXJuIDIwMAorCisKK2NsYXNzIHVwbG9hZFRlc3RDYXNlKFB5UElSQ0NvbW1hbmRUZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKHVwbG9hZFRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYub2xkX29wZW4gPSB1cGxvYWRfbW9kLnVybG9wZW4KKyAgICAgICAgdXBsb2FkX21vZC51cmxvcGVuID0gc2VsZi5fdXJsb3BlbgorICAgICAgICBzZWxmLmxhc3Rfb3BlbiA9IE5vbmUKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdXBsb2FkX21vZC51cmxvcGVuID0gc2VsZi5vbGRfb3BlbgorICAgICAgICBzdXBlcih1cGxvYWRUZXN0Q2FzZSwgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIF91cmxvcGVuKHNlbGYsIHVybCk6CisgICAgICAgIHNlbGYubGFzdF9vcGVuID0gRmFrZU9wZW4odXJsKQorICAgICAgICByZXR1cm4gc2VsZi5sYXN0X29wZW4KKworICAgIGRlZiB0ZXN0X2ZpbmFsaXplX29wdGlvbnMoc2VsZik6CisKKyAgICAgICAgIyBuZXcgZm9ybWF0CisgICAgICAgIHNlbGYud3JpdGVfZmlsZShzZWxmLnJjLCBQWVBJUkMpCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQorICAgICAgICBjbWQgPSB1cGxvYWQoZGlzdCkKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBmb3IgYXR0ciwgd2FpdGVkIGluICgoJ3VzZXJuYW1lJywgJ21lJyksICgncGFzc3dvcmQnLCAnc2VjcmV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgncmVhbG0nLCAncHlwaScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3JlcG9zaXRvcnknLCAnaHR0cDovL3B5cGkucHl0aG9uLm9yZy9weXBpJykpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKGNtZCwgYXR0ciksIHdhaXRlZCkKKworICAgIGRlZiB0ZXN0X3NhdmVkX3Bhc3N3b3JkKHNlbGYpOgorICAgICAgICAjIGZpbGUgd2l0aCBubyBwYXNzd29yZAorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoc2VsZi5yYywgUFlQSVJDX05PUEFTU1dPUkQpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgaXQgcGFzc2VzCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQorICAgICAgICBjbWQgPSB1cGxvYWQoZGlzdCkKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5wYXNzd29yZCwgTm9uZSkKKworICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBnZXQgaXQgYXMgd2VsbCwgaWYgYW5vdGhlciBjb21tYW5kCisgICAgICAgICMgaW5pdGlhbGl6ZWQgaXQgYXQgdGhlIGRpc3QgbGV2ZWwKKyAgICAgICAgZGlzdC5wYXNzd29yZCA9ICd4eHgnCisgICAgICAgIGNtZCA9IHVwbG9hZChkaXN0KQorICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLnBhc3N3b3JkLCAneHh4JykKKworICAgIGRlZiB0ZXN0X3VwbG9hZChzZWxmKToKKyAgICAgICAgdG1wID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbih0bXAsICd4eHgnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUocGF0aCkKKyAgICAgICAgY29tbWFuZCwgcHl2ZXJzaW9uLCBmaWxlbmFtZSA9ICd4eHgnLCAnMi42JywgcGF0aAorICAgICAgICBkaXN0X2ZpbGVzID0gWyhjb21tYW5kLCBweXZlcnNpb24sIGZpbGVuYW1lKV0KKyAgICAgICAgc2VsZi53cml0ZV9maWxlKHNlbGYucmMsIFBZUElSQ19MT05HX1BBU1NXT1JEKQorCisgICAgICAgICMgbGV0cyBydW4gaXQKKyAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoZGlzdF9maWxlcz1kaXN0X2ZpbGVzLCBhdXRob3I9dSdkw6lkw6knKQorICAgICAgICBjbWQgPSB1cGxvYWQoZGlzdCkKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICAjIHdoYXQgZGlkIHdlIHNlbmQgPworICAgICAgICBzZWxmLmFzc2VydEluKCdkw6lkw6knLCBzZWxmLmxhc3Rfb3Blbi5yZXEuZGF0YSkKKyAgICAgICAgaGVhZGVycyA9IGRpY3Qoc2VsZi5sYXN0X29wZW4ucmVxLmhlYWRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGVhZGVyc1snQ29udGVudC1sZW5ndGgnXSwgJzIwODUnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGVhZGVyc1snQ29udGVudC10eXBlJ10uc3RhcnRzd2l0aCgnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGFzdF9vcGVuLnJlcS5nZXRfbWV0aG9kKCksICdQT1NUJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxhc3Rfb3Blbi5yZXEuZ2V0X2Z1bGxfdXJsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2h0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgneHh4JyBpbiBzZWxmLmxhc3Rfb3Blbi5yZXEuZGF0YSkKKyAgICAgICAgYXV0aCA9IHNlbGYubGFzdF9vcGVuLnJlcS5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgnXG4nIGluIGF1dGgpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZSh1cGxvYWRUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91cGxvYWQucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91cGxvYWQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMDBiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91cGxvYWQucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91cGxvYWQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMDBiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91dGlsLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Y2Q0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3V0aWwucHkKQEAgLTAsMCArMSwyNSBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy51dGlsLiIiIgoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBEaXN0dXRpbHNCeXRlQ29tcGlsZUVycm9yCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBieXRlX2NvbXBpbGUKKworY2xhc3MgVXRpbFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2RvbnRfd3JpdGVfYnl0ZWNvZGUoc2VsZik6CisgICAgICAgICMgbWFrZXMgc3VyZSBieXRlX2NvbXBpbGUgcmFpc2UgYSBEaXN0dXRpbHNFcnJvcgorICAgICAgICAjIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlIGlzIFRydWUKKyAgICAgICAgb2xkX2RvbnRfd3JpdGVfYnl0ZWNvZGUgPSBzeXMuZG9udF93cml0ZV9ieXRlY29kZQorICAgICAgICBzeXMuZG9udF93cml0ZV9ieXRlY29kZSA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzQnl0ZUNvbXBpbGVFcnJvciwgYnl0ZV9jb21waWxlLCBbXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlID0gb2xkX2RvbnRfd3JpdGVfYnl0ZWNvZGUKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKFV0aWxUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmNjJiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91dGlsLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmNjJiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9uLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODk5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb24ucHkKQEAgLTAsMCArMSw3MSBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy52ZXJzaW9uLiIiIgoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGRpc3R1dGlscy52ZXJzaW9uIGltcG9ydCBMb29zZVZlcnNpb24KK2Zyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IFN0cmljdFZlcnNpb24KK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitjbGFzcyBWZXJzaW9uVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfcHJlcmVsZWFzZShzZWxmKToKKyAgICAgICAgdmVyc2lvbiA9IFN0cmljdFZlcnNpb24oJzEuMi4zYTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZlcnNpb24udmVyc2lvbiwgKDEsIDIsIDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZlcnNpb24ucHJlcmVsZWFzZSwgKCdhJywgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHZlcnNpb24pLCAnMS4yLjNhMScpCisKKyAgICAgICAgdmVyc2lvbiA9IFN0cmljdFZlcnNpb24oJzEuMi4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmVyc2lvbiksICcxLjInKQorCisgICAgZGVmIHRlc3RfY21wX3N0cmljdChzZWxmKToKKyAgICAgICAgdmVyc2lvbnMgPSAoKCcxLjUuMScsICcxLjUuMmIyJywgLTEpLAorICAgICAgICAgICAgICAgICAgICAoJzE2MScsICczLjEwYScsIFZhbHVlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAoJzguMDInLCAnOC4wMicsIDApLAorICAgICAgICAgICAgICAgICAgICAoJzMuNGonLCAnMTk5Ni4wNy4xMicsIFZhbHVlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAoJzMuMi5wbDAnLCAnMy4xLjEuNicsIFZhbHVlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAoJzJnNicsICcxMWcnLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgKCcwLjknLCAnMi4yJywgLTEpLAorICAgICAgICAgICAgICAgICAgICAoJzEuMi4xJywgJzEuMicsIDEpLAorICAgICAgICAgICAgICAgICAgICAoJzEuMScsICcxLjIuMicsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgKCcxLjInLCAnMS4xJywgMSksCisgICAgICAgICAgICAgICAgICAgICgnMS4yLjEnLCAnMS4yLjInLCAtMSksCisgICAgICAgICAgICAgICAgICAgICgnMS4yLjInLCAnMS4yJywgMSksCisgICAgICAgICAgICAgICAgICAgICgnMS4yJywgJzEuMi4yJywgLTEpLAorICAgICAgICAgICAgICAgICAgICAoJzAuNC4wJywgJzAuNCcsIDApLAorICAgICAgICAgICAgICAgICAgICAoJzEuMTMrKycsICc1LjUua3cnLCBWYWx1ZUVycm9yKSkKKworICAgICAgICBmb3IgdjEsIHYyLCB3YW50ZWQgaW4gdmVyc2lvbnM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzID0gU3RyaWN0VmVyc2lvbih2MSkuX19jbXBfXyhTdHJpY3RWZXJzaW9uKHYyKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGlmIHdhbnRlZCBpcyBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCgiY21wKCVzLCAlcykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZG4ndCByYWlzZSBWYWx1ZUVycm9yIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodjEsIHYyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCB3YW50ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbXAoJXMsICVzKSBzaG91bGQgYmUgJXMsIGdvdCAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjEsIHYyLCB3YW50ZWQsIHJlcykpCisKKworICAgIGRlZiB0ZXN0X2NtcChzZWxmKToKKyAgICAgICAgdmVyc2lvbnMgPSAoKCcxLjUuMScsICcxLjUuMmIyJywgLTEpLAorICAgICAgICAgICAgICAgICAgICAoJzE2MScsICczLjEwYScsIDEpLAorICAgICAgICAgICAgICAgICAgICAoJzguMDInLCAnOC4wMicsIDApLAorICAgICAgICAgICAgICAgICAgICAoJzMuNGonLCAnMTk5Ni4wNy4xMicsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgKCczLjIucGwwJywgJzMuMS4xLjYnLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgKCcyZzYnLCAnMTFnJywgLTEpLAorICAgICAgICAgICAgICAgICAgICAoJzAuOTYwOTIzJywgJzIuMmJldGEyOScsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgKCcxLjEzKysnLCAnNS41Lmt3JywgLTEpKQorCisKKyAgICAgICAgZm9yIHYxLCB2Miwgd2FudGVkIGluIHZlcnNpb25zOgorICAgICAgICAgICAgcmVzID0gTG9vc2VWZXJzaW9uKHYxKS5fX2NtcF9fKExvb3NlVmVyc2lvbih2MikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgd2FudGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY21wKCVzLCAlcykgc2hvdWxkIGJlICVzLCBnb3QgJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYxLCB2Miwgd2FudGVkLCByZXMpKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoVmVyc2lvblRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb24ucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjJkM2VjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb24ucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjJkM2VjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb25wcmVkaWNhdGUucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb25wcmVkaWNhdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2YzhkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdmVyc2lvbnByZWRpY2F0ZS5weQpAQCAtMCwwICsxLDEzIEBACisiIiJUZXN0cyBoYXJuZXNzIGZvciBkaXN0dXRpbHMudmVyc2lvbnByZWRpY2F0ZS4KKworIiIiCisKK2ltcG9ydCBkaXN0dXRpbHMudmVyc2lvbnByZWRpY2F0ZQoraW1wb3J0IGRvY3Rlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZShkaXN0dXRpbHMudmVyc2lvbnByZWRpY2F0ZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9ucHJlZGljYXRlLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdmVyc2lvbnByZWRpY2F0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkMDM1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdmVyc2lvbnByZWRpY2F0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9ucHJlZGljYXRlLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdmVyc2lvbnByZWRpY2F0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkMDM1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdmVyc2lvbnByZWRpY2F0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMveHhtb2R1bGUuYyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3h4bW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5YjA4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3h4bW9kdWxlLmMKQEAgLTAsMCArMSwzNzkgQEAKKworLyogVXNlIHRoaXMgZmlsZSBhcyBhIHRlbXBsYXRlIHRvIHN0YXJ0IGltcGxlbWVudGluZyBhIG1vZHVsZSB0aGF0CisgICBhbHNvIGRlY2xhcmVzIG9iamVjdCB0eXBlcy4gQWxsIG9jY3VycmVuY2VzIG9mICdYeG8nIHNob3VsZCBiZSBjaGFuZ2VkCisgICB0byBzb21ldGhpbmcgcmVhc29uYWJsZSBmb3IgeW91ciBvYmplY3RzLiBBZnRlciB0aGF0LCBhbGwgb3RoZXIKKyAgIG9jY3VycmVuY2VzIG9mICd4eCcgc2hvdWxkIGJlIGNoYW5nZWQgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUgZm9yIHlvdXIKKyAgIG1vZHVsZS4gSWYgeW91ciBtb2R1bGUgaXMgbmFtZWQgZm9vIHlvdXIgc291cmNlZmlsZSBzaG91bGQgYmUgbmFtZWQKKyAgIGZvb21vZHVsZS5jLgorCisgICBZb3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIGRlbGV0ZSBhbGwgcmVmZXJlbmNlcyB0byAneF9hdHRyJyBhbmQgYWRkCisgICB5b3VyIG93biB0eXBlcyBvZiBhdHRyaWJ1dGVzIGluc3RlYWQuICBNYXliZSB5b3Ugd2FudCB0byBuYW1lIHlvdXIKKyAgIGxvY2FsIHZhcmlhYmxlcyBvdGhlciB0aGFuICdzZWxmJy4gIElmIHlvdXIgb2JqZWN0IHR5cGUgaXMgbmVlZGVkIGluCisgICBvdGhlciBmaWxlcywgeW91J2xsIGhhdmUgdG8gY3JlYXRlIGEgZmlsZSAiZm9vYmFyb2JqZWN0LmgiOyBzZWUKKyAgIGludG9iamVjdC5oIGZvciBhbiBleGFtcGxlLiAqLworCisvKiBYeG8gb2JqZWN0cyAqLworCisjaW5jbHVkZSAiUHl0aG9uLmgiCisKK3N0YXRpYyBQeU9iamVjdCAqRXJyb3JPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgICAgICAgICAgICAqeF9hdHRyOyAgICAgICAgLyogQXR0cmlidXRlcyBkaWN0aW9uYXJ5ICovCit9IFh4b09iamVjdDsKKworc3RhdGljIFB5VHlwZU9iamVjdCBYeG9fVHlwZTsKKworI2RlZmluZSBYeG9PYmplY3RfQ2hlY2sodikgICAgICAoUHlfVFlQRSh2KSA9PSAmWHhvX1R5cGUpCisKK3N0YXRpYyBYeG9PYmplY3QgKgorbmV3WHhvT2JqZWN0KFB5T2JqZWN0ICphcmcpCit7CisgICAgWHhvT2JqZWN0ICpzZWxmOworICAgIHNlbGYgPSBQeU9iamVjdF9OZXcoWHhvT2JqZWN0LCAmWHhvX1R5cGUpOworICAgIGlmIChzZWxmID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHNlbGYtPnhfYXR0ciA9IE5VTEw7CisgICAgcmV0dXJuIHNlbGY7Cit9CisKKy8qIFh4byBtZXRob2RzICovCisKK3N0YXRpYyB2b2lkCitYeG9fZGVhbGxvYyhYeG9PYmplY3QgKnNlbGYpCit7CisgICAgUHlfWERFQ1JFRihzZWxmLT54X2F0dHIpOworICAgIFB5T2JqZWN0X0RlbChzZWxmKTsKK30KKworc3RhdGljIFB5T2JqZWN0ICoKK1h4b19kZW1vKFh4b09iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6ZGVtbyIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKK3N0YXRpYyBQeU1ldGhvZERlZiBYeG9fbWV0aG9kc1tdID0geworICAgIHsiZGVtbyIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKVh4b19kZW1vLCAgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoImRlbW8oKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCit9OworCitzdGF0aWMgUHlPYmplY3QgKgorWHhvX2dldGF0dHIoWHhvT2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lKQoreworICAgIGlmIChzZWxmLT54X2F0dHIgIT0gTlVMTCkgeworICAgICAgICBQeU9iamVjdCAqdiA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPnhfYXR0ciwgbmFtZSk7CisgICAgICAgIGlmICh2ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBQeV9GaW5kTWV0aG9kKFh4b19tZXRob2RzLCAoUHlPYmplY3QgKilzZWxmLCBuYW1lKTsKK30KKworc3RhdGljIGludAorWHhvX3NldGF0dHIoWHhvT2JqZWN0ICpzZWxmLCBjaGFyICpuYW1lLCBQeU9iamVjdCAqdikKK3sKKyAgICBpZiAoc2VsZi0+eF9hdHRyID09IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+eF9hdHRyID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoc2VsZi0+eF9hdHRyID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh2ID09IE5VTEwpIHsKKyAgICAgICAgaW50IHJ2ID0gUHlEaWN0X0RlbEl0ZW1TdHJpbmcoc2VsZi0+eF9hdHRyLCBuYW1lKTsKKyAgICAgICAgaWYgKHJ2IDwgMCkKKyAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19BdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAiZGVsZXRlIG5vbi1leGlzdGluZyBYeG8gYXR0cmlidXRlIik7CisgICAgICAgIHJldHVybiBydjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXR1cm4gUHlEaWN0X1NldEl0ZW1TdHJpbmcoc2VsZi0+eF9hdHRyLCBuYW1lLCB2KTsKK30KKworc3RhdGljIFB5VHlwZU9iamVjdCBYeG9fVHlwZSA9IHsKKyAgICAvKiBUaGUgb2JfdHlwZSBmaWVsZCBtdXN0IGJlIGluaXRpYWxpemVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbgorICAgICAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgInh4bW9kdWxlLlh4byIsICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgc2l6ZW9mKFh4b09iamVjdCksICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIChkZXN0cnVjdG9yKVh4b19kZWFsbG9jLCAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAoZ2V0YXR0cmZ1bmMpWHhvX2dldGF0dHIsIC8qdHBfZ2V0YXR0ciovCisgICAgKHNldGF0dHJmdW5jKVh4b19zZXRhdHRyLCAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAvKnRwX2ZsYWdzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX25ldyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KK307CisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogRnVuY3Rpb24gb2YgdHdvIGludGVnZXJzIHJldHVybmluZyBpbnRlZ2VyICovCisKK1B5RG9jX1NUUlZBUih4eF9mb29fZG9jLAorImZvbyhpLGopXG5cCitcblwKK1JldHVybiB0aGUgc3VtIG9mIGkgYW5kIGouIik7CisKK3N0YXRpYyBQeU9iamVjdCAqCit4eF9mb28oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIGxvbmcgaSwgajsKKyAgICBsb25nIHJlczsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxsOmZvbyIsICZpLCAmaikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJlcyA9IGkrajsgLyogWFhYIERvIHNvbWV0aGluZyBoZXJlICovCisgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHJlcyk7Cit9CisKKworLyogRnVuY3Rpb24gb2Ygbm8gYXJndW1lbnRzIHJldHVybmluZyBuZXcgWHhvIG9iamVjdCAqLworCitzdGF0aWMgUHlPYmplY3QgKgoreHhfbmV3KFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBYeG9PYmplY3QgKnJ2OworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICI6bmV3IikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJ2ID0gbmV3WHhvT2JqZWN0KGFyZ3MpOworICAgIGlmIChydiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopcnY7Cit9CisKKy8qIEV4YW1wbGUgd2l0aCBzdWJ0bGUgYnVnIGZyb20gZXh0ZW5zaW9ucyBtYW51YWwgKCJUaGluIEljZSIpLiAqLworCitzdGF0aWMgUHlPYmplY3QgKgoreHhfYnVnKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeU9iamVjdCAqbGlzdCwgKml0ZW07CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk86YnVnIiwgJmxpc3QpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGl0ZW0gPSBQeUxpc3RfR2V0SXRlbShsaXN0LCAwKTsKKyAgICAvKiBQeV9JTkNSRUYoaXRlbSk7ICovCisgICAgUHlMaXN0X1NldEl0ZW0obGlzdCwgMSwgUHlJbnRfRnJvbUxvbmcoMEwpKTsKKyAgICBQeU9iamVjdF9QcmludChpdGVtLCBzdGRvdXQsIDApOworICAgIHByaW50ZigiXG4iKTsKKyAgICAvKiBQeV9ERUNSRUYoaXRlbSk7ICovCisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKKy8qIFRlc3QgYmFkIGZvcm1hdCBjaGFyYWN0ZXIgKi8KKworc3RhdGljIFB5T2JqZWN0ICoKK3h4X3JvaihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgUHlPYmplY3QgKmE7CisgICAgbG9uZyBiOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTyM6cm9qIiwgJmEsICZiKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgIHJldHVybiBQeV9Ob25lOworfQorCisKKy8qIC0tLS0tLS0tLS0gKi8KKworc3RhdGljIFB5VHlwZU9iamVjdCBTdHJfVHlwZSA9IHsKKyAgICAvKiBUaGUgb2JfdHlwZSBmaWVsZCBtdXN0IGJlIGluaXRpYWxpemVkIGluIHRoZSBtb2R1bGUgaW5pdCBmdW5jdGlvbgorICAgICAqIHRvIGJlIHBvcnRhYmxlIHRvIFdpbmRvd3Mgd2l0aG91dCB1c2luZyBDKysuICovCisgICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKE5VTEwsIDApCisgICAgInh4bW9kdWxlLlN0ciIsICAgICAgICAgICAgIC8qdHBfbmFtZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYmFzaWNzaXplKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVtc2l6ZSovCisgICAgLyogbWV0aG9kcyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RlYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3ByaW50Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19udW1iZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX3NlcXVlbmNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9oYXNoKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zdHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfYnVmZmVyKi8KKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQgfCBQeV9UUEZMQUdTX0JBU0VUWVBFLCAvKnRwX2ZsYWdzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jbGVhciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmljaGNvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pdGVybmV4dCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWVtYmVycyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0c2V0Ki8KKyAgICAwLCAvKiBzZWUgaW5pdHh4ICovICAgICAgICAgLyp0cF9iYXNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9nZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaW5pdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX25ldyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZnJlZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLworfTsKKworLyogLS0tLS0tLS0tLSAqLworCitzdGF0aWMgUHlPYmplY3QgKgorbnVsbF9yaWNoY29tcGFyZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKm90aGVyLCBpbnQgb3ApCit7CisgICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKKyAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Cit9CisKK3N0YXRpYyBQeVR5cGVPYmplY3QgTnVsbF9UeXBlID0geworICAgIC8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCisgICAgICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAieHhtb2R1bGUuTnVsbCIsICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICBudWxsX3JpY2hjb21wYXJlLCAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qIHNlZSBpbml0eHggKi8gICAgICAgICAvKnRwX2Jhc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCisgICAgMCwgLyogc2VlIGluaXR4eCAqLyAgICAgICAgIC8qdHBfbmV3Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCit9OworCisKKy8qIC0tLS0tLS0tLS0gKi8KKworCisvKiBMaXN0IG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKi8KKworc3RhdGljIFB5TWV0aG9kRGVmIHh4X21ldGhvZHNbXSA9IHsKKyAgICB7InJvaiIsICAgICAgICAgICAgIHh4X3JvaiwgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigicm9qKGEsYikgLT4gTm9uZSIpfSwKKyAgICB7ImZvbyIsICAgICAgICAgICAgIHh4X2ZvbywgICAgICAgICBNRVRIX1ZBUkFSR1MsCisgICAgICAgIHh4X2Zvb19kb2N9LAorICAgIHsibmV3IiwgICAgICAgICAgICAgeHhfbmV3LCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJuZXcoKSAtPiBuZXcgWHggb2JqZWN0Iil9LAorICAgIHsiYnVnIiwgICAgICAgICAgICAgeHhfYnVnLCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJidWcobykgLT4gTm9uZSIpfSwKKyAgICB7TlVMTCwgICAgICAgICAgICAgIE5VTEx9ICAgICAgICAgICAvKiBzZW50aW5lbCAqLworfTsKKworUHlEb2NfU1RSVkFSKG1vZHVsZV9kb2MsCisiVGhpcyBpcyBhIHRlbXBsYXRlIG1vZHVsZSBqdXN0IGZvciBpbnN0cnVjdGlvbi4iKTsKKworLyogSW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gZm9yIHRoZSBtb2R1bGUgKCptdXN0KiBiZSBjYWxsZWQgaW5pdHh4KSAqLworCitQeU1PRElOSVRfRlVOQworaW5pdHh4KHZvaWQpCit7CisgICAgUHlPYmplY3QgKm07CisKKyAgICAvKiBEdWUgdG8gY3Jvc3MgcGxhdGZvcm0gY29tcGlsZXIgaXNzdWVzIHRoZSBzbG90cyBtdXN0IGJlIGZpbGxlZAorICAgICAqIGhlcmUuIEl0J3MgcmVxdWlyZWQgZm9yIHBvcnRhYmlsaXR5IHRvIFdpbmRvd3Mgd2l0aG91dCByZXF1aXJpbmcKKyAgICAgKiBDKysuICovCisgICAgTnVsbF9UeXBlLnRwX2Jhc2UgPSAmUHlCYXNlT2JqZWN0X1R5cGU7CisgICAgTnVsbF9UeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OworICAgIFN0cl9UeXBlLnRwX2Jhc2UgPSAmUHlVbmljb2RlX1R5cGU7CisKKyAgICAvKiBGaW5hbGl6ZSB0aGUgdHlwZSBvYmplY3QgaW5jbHVkaW5nIHNldHRpbmcgdHlwZSBvZiB0aGUgbmV3IHR5cGUKKyAgICAgKiBvYmplY3Q7IGRvaW5nIGl0IGhlcmUgaXMgcmVxdWlyZWQgZm9yIHBvcnRhYmlsaXR5LCB0b28uICovCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmWHhvX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogQ3JlYXRlIHRoZSBtb2R1bGUgYW5kIGFkZCB0aGUgZnVuY3Rpb25zICovCisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJ4eCIsIHh4X21ldGhvZHMsIG1vZHVsZV9kb2MpOworICAgIGlmIChtID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIC8qIEFkZCBzb21lIHN5bWJvbGljIGNvbnN0YW50cyB0byB0aGUgbW9kdWxlICovCisgICAgaWYgKEVycm9yT2JqZWN0ID09IE5VTEwpIHsKKyAgICAgICAgRXJyb3JPYmplY3QgPSBQeUVycl9OZXdFeGNlcHRpb24oInh4LmVycm9yIiwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmIChFcnJvck9iamVjdCA9PSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBQeV9JTkNSRUYoRXJyb3JPYmplY3QpOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiZXJyb3IiLCBFcnJvck9iamVjdCk7CisKKyAgICAvKiBBZGQgU3RyICovCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmU3RyX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU3RyIiwgKFB5T2JqZWN0ICopJlN0cl9UeXBlKTsKKworICAgIC8qIEFkZCBOdWxsICovCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmTnVsbF9UeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk51bGwiLCAoUHlPYmplY3QgKikmTnVsbF9UeXBlKTsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3RleHRfZmlsZS5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3RleHRfZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWE3OThiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGV4dF9maWxlLnB5CkBAIC0wLDAgKzEsMzA0IEBACisiIiJ0ZXh0X2ZpbGUKKworcHJvdmlkZXMgdGhlIFRleHRGaWxlIGNsYXNzLCB3aGljaCBnaXZlcyBhbiBpbnRlcmZhY2UgdG8gdGV4dCBmaWxlcwordGhhdCAob3B0aW9uYWxseSkgdGFrZXMgY2FyZSBvZiBzdHJpcHBpbmcgY29tbWVudHMsIGlnbm9yaW5nIGJsYW5rCitsaW5lcywgYW5kIGpvaW5pbmcgbGluZXMgd2l0aCBiYWNrc2xhc2hlcy4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBzeXMKKworCitjbGFzcyBUZXh0RmlsZToKKworICAgICIiIlByb3ZpZGVzIGEgZmlsZS1saWtlIG9iamVjdCB0aGF0IHRha2VzIGNhcmUgb2YgYWxsIHRoZSB0aGluZ3MgeW91CisgICAgICAgY29tbW9ubHkgd2FudCB0byBkbyB3aGVuIHByb2Nlc3NpbmcgYSB0ZXh0IGZpbGUgdGhhdCBoYXMgc29tZQorICAgICAgIGxpbmUtYnktbGluZSBzeW50YXg6IHN0cmlwIGNvbW1lbnRzIChhcyBsb25nIGFzICIjIiBpcyB5b3VyCisgICAgICAgY29tbWVudCBjaGFyYWN0ZXIpLCBza2lwIGJsYW5rIGxpbmVzLCBqb2luIGFkamFjZW50IGxpbmVzIGJ5CisgICAgICAgZXNjYXBpbmcgdGhlIG5ld2xpbmUgKGllLiBiYWNrc2xhc2ggYXQgZW5kIG9mIGxpbmUpLCBzdHJpcAorICAgICAgIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIHdoaXRlc3BhY2UuICBBbGwgb2YgdGhlc2UgYXJlIG9wdGlvbmFsCisgICAgICAgYW5kIGluZGVwZW5kZW50bHkgY29udHJvbGxhYmxlLgorCisgICAgICAgUHJvdmlkZXMgYSAnd2FybigpJyBtZXRob2Qgc28geW91IGNhbiBnZW5lcmF0ZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQKKyAgICAgICByZXBvcnQgcGh5c2ljYWwgbGluZSBudW1iZXIsIGV2ZW4gaWYgdGhlIGxvZ2ljYWwgbGluZSBpbiBxdWVzdGlvbgorICAgICAgIHNwYW5zIG11bHRpcGxlIHBoeXNpY2FsIGxpbmVzLiAgQWxzbyBwcm92aWRlcyAndW5yZWFkbGluZSgpJyBmb3IKKyAgICAgICBpbXBsZW1lbnRpbmcgbGluZS1hdC1hLXRpbWUgbG9va2FoZWFkLgorCisgICAgICAgQ29uc3RydWN0b3IgaXMgY2FsbGVkIGFzOgorCisgICAgICAgICAgIFRleHRGaWxlIChmaWxlbmFtZT1Ob25lLCBmaWxlPU5vbmUsICoqb3B0aW9ucykKKworICAgICAgIEl0IGJvbWJzIChSdW50aW1lRXJyb3IpIGlmIGJvdGggJ2ZpbGVuYW1lJyBhbmQgJ2ZpbGUnIGFyZSBOb25lOworICAgICAgICdmaWxlbmFtZScgc2hvdWxkIGJlIGEgc3RyaW5nLCBhbmQgJ2ZpbGUnIGEgZmlsZSBvYmplY3QgKG9yCisgICAgICAgc29tZXRoaW5nIHRoYXQgcHJvdmlkZXMgJ3JlYWRsaW5lKCknIGFuZCAnY2xvc2UoKScgbWV0aG9kcykuICBJdCBpcworICAgICAgIHJlY29tbWVuZGVkIHRoYXQgeW91IHN1cHBseSBhdCBsZWFzdCAnZmlsZW5hbWUnLCBzbyB0aGF0IFRleHRGaWxlCisgICAgICAgY2FuIGluY2x1ZGUgaXQgaW4gd2FybmluZyBtZXNzYWdlcy4gIElmICdmaWxlJyBpcyBub3Qgc3VwcGxpZWQsCisgICAgICAgVGV4dEZpbGUgY3JlYXRlcyBpdHMgb3duIHVzaW5nIHRoZSAnb3BlbigpJyBidWlsdGluLgorCisgICAgICAgVGhlIG9wdGlvbnMgYXJlIGFsbCBib29sZWFuLCBhbmQgYWZmZWN0IHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAgICAgICdyZWFkbGluZSgpJzoKKyAgICAgICAgIHN0cmlwX2NvbW1lbnRzIFtkZWZhdWx0OiB0cnVlXQorICAgICAgICAgICBzdHJpcCBmcm9tICIjIiB0byBlbmQtb2YtbGluZSwgYXMgd2VsbCBhcyBhbnkgd2hpdGVzcGFjZQorICAgICAgICAgICBsZWFkaW5nIHVwIHRvIHRoZSAiIyIgLS0gdW5sZXNzIGl0IGlzIGVzY2FwZWQgYnkgYSBiYWNrc2xhc2gKKyAgICAgICAgIGxzdHJpcF93cyBbZGVmYXVsdDogZmFsc2VdCisgICAgICAgICAgIHN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGVhY2ggbGluZSBiZWZvcmUgcmV0dXJuaW5nIGl0CisgICAgICAgICByc3RyaXBfd3MgW2RlZmF1bHQ6IHRydWVdCisgICAgICAgICAgIHN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UgKGluY2x1ZGluZyBsaW5lIHRlcm1pbmF0b3IhKSBmcm9tCisgICAgICAgICAgIGVhY2ggbGluZSBiZWZvcmUgcmV0dXJuaW5nIGl0CisgICAgICAgICBza2lwX2JsYW5rcyBbZGVmYXVsdDogdHJ1ZX0KKyAgICAgICAgICAgc2tpcCBsaW5lcyB0aGF0IGFyZSBlbXB0eSAqYWZ0ZXIqIHN0cmlwcGluZyBjb21tZW50cyBhbmQKKyAgICAgICAgICAgd2hpdGVzcGFjZS4gIChJZiBib3RoIGxzdHJpcF93cyBhbmQgcnN0cmlwX3dzIGFyZSBmYWxzZSwKKyAgICAgICAgICAgdGhlbiBzb21lIGxpbmVzIG1heSBjb25zaXN0IG9mIHNvbGVseSB3aGl0ZXNwYWNlOiB0aGVzZSB3aWxsCisgICAgICAgICAgICpub3QqIGJlIHNraXBwZWQsIGV2ZW4gaWYgJ3NraXBfYmxhbmtzJyBpcyB0cnVlLikKKyAgICAgICAgIGpvaW5fbGluZXMgW2RlZmF1bHQ6IGZhbHNlXQorICAgICAgICAgICBpZiBhIGJhY2tzbGFzaCBpcyB0aGUgbGFzdCBub24tbmV3bGluZSBjaGFyYWN0ZXIgb24gYSBsaW5lCisgICAgICAgICAgIGFmdGVyIHN0cmlwcGluZyBjb21tZW50cyBhbmQgd2hpdGVzcGFjZSwgam9pbiB0aGUgZm9sbG93aW5nIGxpbmUKKyAgICAgICAgICAgdG8gaXQgdG8gZm9ybSBvbmUgImxvZ2ljYWwgbGluZSI7IGlmIE4gY29uc2VjdXRpdmUgbGluZXMgZW5kCisgICAgICAgICAgIHdpdGggYSBiYWNrc2xhc2gsIHRoZW4gTisxIHBoeXNpY2FsIGxpbmVzIHdpbGwgYmUgam9pbmVkIHRvCisgICAgICAgICAgIGZvcm0gb25lIGxvZ2ljYWwgbGluZS4KKyAgICAgICAgIGNvbGxhcHNlX2pvaW4gW2RlZmF1bHQ6IGZhbHNlXQorICAgICAgICAgICBzdHJpcCBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBsaW5lcyB0aGF0IGFyZSBqb2luZWQgdG8gdGhlaXIKKyAgICAgICAgICAgcHJlZGVjZXNzb3I7IG9ubHkgbWF0dGVycyBpZiAoam9pbl9saW5lcyBhbmQgbm90IGxzdHJpcF93cykKKworICAgICAgIE5vdGUgdGhhdCBzaW5jZSAncnN0cmlwX3dzJyBjYW4gc3RyaXAgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIHRoZQorICAgICAgIHNlbWFudGljcyBvZiAncmVhZGxpbmUoKScgbXVzdCBkaWZmZXIgZnJvbSB0aG9zZSBvZiB0aGUgYnVpbHRpbiBmaWxlCisgICAgICAgb2JqZWN0J3MgJ3JlYWRsaW5lKCknIG1ldGhvZCEgIEluIHBhcnRpY3VsYXIsICdyZWFkbGluZSgpJyByZXR1cm5zCisgICAgICAgTm9uZSBmb3IgZW5kLW9mLWZpbGU6IGFuIGVtcHR5IHN0cmluZyBtaWdodCBqdXN0IGJlIGEgYmxhbmsgbGluZSAob3IKKyAgICAgICBhbiBhbGwtd2hpdGVzcGFjZSBsaW5lKSwgaWYgJ3JzdHJpcF93cycgaXMgdHJ1ZSBidXQgJ3NraXBfYmxhbmtzJyBpcworICAgICAgIG5vdC4iIiIKKworICAgIGRlZmF1bHRfb3B0aW9ucyA9IHsgJ3N0cmlwX2NvbW1lbnRzJzogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdza2lwX2JsYW5rcyc6ICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnbHN0cmlwX3dzJzogICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3JzdHJpcF93cyc6ICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdqb2luX2xpbmVzJzogICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAnY29sbGFwc2Vfam9pbic6ICAwLAorICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgZmlsZW5hbWU9Tm9uZSwgZmlsZT1Ob25lLCAqKm9wdGlvbnMpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBuZXcgVGV4dEZpbGUgb2JqZWN0LiAgQXQgbGVhc3Qgb25lIG9mICdmaWxlbmFtZScKKyAgICAgICAgICAgKGEgc3RyaW5nKSBhbmQgJ2ZpbGUnIChhIGZpbGUtbGlrZSBvYmplY3QpIG11c3QgYmUgc3VwcGxpZWQuCisgICAgICAgICAgIFRoZXkga2V5d29yZCBhcmd1bWVudCBvcHRpb25zIGFyZSBkZXNjcmliZWQgYWJvdmUgYW5kIGFmZmVjdAorICAgICAgICAgICB0aGUgdmFsdWVzIHJldHVybmVkIGJ5ICdyZWFkbGluZSgpJy4iIiIKKworICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lIGFuZCBmaWxlIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICJ5b3UgbXVzdCBzdXBwbHkgZWl0aGVyIG9yIGJvdGggb2YgJ2ZpbGVuYW1lJyBhbmQgJ2ZpbGUnIgorCisgICAgICAgICMgc2V0IHZhbHVlcyBmb3IgYWxsIG9wdGlvbnMgLS0gZWl0aGVyIGZyb20gY2xpZW50IG9wdGlvbiBoYXNoCisgICAgICAgICMgb3IgZmFsbGJhY2sgdG8gZGVmYXVsdF9vcHRpb25zCisgICAgICAgIGZvciBvcHQgaW4gc2VsZi5kZWZhdWx0X29wdGlvbnMua2V5cygpOgorICAgICAgICAgICAgaWYgb3B0IGluIG9wdGlvbnM6CisgICAgICAgICAgICAgICAgc2V0YXR0ciAoc2VsZiwgb3B0LCBvcHRpb25zW29wdF0pCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2V0YXR0ciAoc2VsZiwgb3B0LCBzZWxmLmRlZmF1bHRfb3B0aW9uc1tvcHRdKQorCisgICAgICAgICMgc2FuaXR5IGNoZWNrIGNsaWVudCBvcHRpb24gaGFzaAorICAgICAgICBmb3Igb3B0IGluIG9wdGlvbnMua2V5cygpOgorICAgICAgICAgICAgaWYgb3B0IG5vdCBpbiBzZWxmLmRlZmF1bHRfb3B0aW9uczoKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvciwgImludmFsaWQgVGV4dEZpbGUgb3B0aW9uICclcyciICUgb3B0CisKKyAgICAgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5vcGVuIChmaWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICAgICAgc2VsZi5jdXJyZW50X2xpbmUgPSAwICAgICAgICMgYXNzdW1pbmcgdGhhdCBmaWxlIGlzIGF0IEJPRiEKKworICAgICAgICAjICdsaW5lYnVmJyBpcyBhIHN0YWNrIG9mIGxpbmVzIHRoYXQgd2lsbCBiZSBlbXB0aWVkIGJlZm9yZSB3ZQorICAgICAgICAjIGFjdHVhbGx5IHJlYWQgZnJvbSB0aGUgZmlsZTsgaXQncyBvbmx5IHBvcHVsYXRlZCBieSBhbgorICAgICAgICAjICd1bnJlYWRsaW5lKCknIG9wZXJhdGlvbgorICAgICAgICBzZWxmLmxpbmVidWYgPSBbXQorCisKKyAgICBkZWYgb3BlbiAoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiIiJPcGVuIGEgbmV3IGZpbGUgbmFtZWQgJ2ZpbGVuYW1lJy4gIFRoaXMgb3ZlcnJpZGVzIGJvdGggdGhlCisgICAgICAgICAgICdmaWxlbmFtZScgYW5kICdmaWxlJyBhcmd1bWVudHMgdG8gdGhlIGNvbnN0cnVjdG9yLiIiIgorCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmZpbGUgPSBvcGVuIChzZWxmLmZpbGVuYW1lLCAncicpCisgICAgICAgIHNlbGYuY3VycmVudF9saW5lID0gMAorCisKKyAgICBkZWYgY2xvc2UgKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgY3VycmVudCBmaWxlIGFuZCBmb3JnZXQgZXZlcnl0aGluZyB3ZSBrbm93IGFib3V0IGl0CisgICAgICAgICAgIChmaWxlbmFtZSwgY3VycmVudCBsaW5lIG51bWJlcikuIiIiCisKKyAgICAgICAgc2VsZi5maWxlLmNsb3NlICgpCisgICAgICAgIHNlbGYuZmlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5jdXJyZW50X2xpbmUgPSBOb25lCisKKworICAgIGRlZiBnZW5fZXJyb3IgKHNlbGYsIG1zZywgbGluZT1Ob25lKToKKyAgICAgICAgb3V0bXNnID0gW10KKyAgICAgICAgaWYgbGluZSBpcyBOb25lOgorICAgICAgICAgICAgbGluZSA9IHNlbGYuY3VycmVudF9saW5lCisgICAgICAgIG91dG1zZy5hcHBlbmQoc2VsZi5maWxlbmFtZSArICIsICIpCisgICAgICAgIGlmIGlzaW5zdGFuY2UobGluZSwgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICBvdXRtc2cuYXBwZW5kKCJsaW5lcyAlZC0lZDogIiAlIHR1cGxlIChsaW5lKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dG1zZy5hcHBlbmQoImxpbmUgJWQ6ICIgJSBsaW5lKQorICAgICAgICBvdXRtc2cuYXBwZW5kKHN0cihtc2cpKQorICAgICAgICByZXR1cm4gJycuam9pbihvdXRtc2cpCisKKworICAgIGRlZiBlcnJvciAoc2VsZiwgbXNnLCBsaW5lPU5vbmUpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZXJyb3I6ICIgKyBzZWxmLmdlbl9lcnJvcihtc2csIGxpbmUpCisKKyAgICBkZWYgd2FybiAoc2VsZiwgbXNnLCBsaW5lPU5vbmUpOgorICAgICAgICAiIiJQcmludCAodG8gc3RkZXJyKSBhIHdhcm5pbmcgbWVzc2FnZSB0aWVkIHRvIHRoZSBjdXJyZW50IGxvZ2ljYWwKKyAgICAgICAgICAgbGluZSBpbiB0aGUgY3VycmVudCBmaWxlLiAgSWYgdGhlIGN1cnJlbnQgbG9naWNhbCBsaW5lIGluIHRoZQorICAgICAgICAgICBmaWxlIHNwYW5zIG11bHRpcGxlIHBoeXNpY2FsIGxpbmVzLCB0aGUgd2FybmluZyByZWZlcnMgdG8gdGhlCisgICAgICAgICAgIHdob2xlIHJhbmdlLCBlZy4gImxpbmVzIDMtNSIuICBJZiAnbGluZScgc3VwcGxpZWQsIGl0IG92ZXJyaWRlcworICAgICAgICAgICB0aGUgY3VycmVudCBsaW5lIG51bWJlcjsgaXQgbWF5IGJlIGEgbGlzdCBvciB0dXBsZSB0byBpbmRpY2F0ZSBhCisgICAgICAgICAgIHJhbmdlIG9mIHBoeXNpY2FsIGxpbmVzLCBvciBhbiBpbnRlZ2VyIGZvciBhIHNpbmdsZSBwaHlzaWNhbAorICAgICAgICAgICBsaW5lLiIiIgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ3YXJuaW5nOiAiICsgc2VsZi5nZW5fZXJyb3IobXNnLCBsaW5lKSArICJcbiIpCisKKworICAgIGRlZiByZWFkbGluZSAoc2VsZik6CisgICAgICAgICIiIlJlYWQgYW5kIHJldHVybiBhIHNpbmdsZSBsb2dpY2FsIGxpbmUgZnJvbSB0aGUgY3VycmVudCBmaWxlIChvcgorICAgICAgICAgICBmcm9tIGFuIGludGVybmFsIGJ1ZmZlciBpZiBsaW5lcyBoYXZlIHByZXZpb3VzbHkgYmVlbiAidW5yZWFkIgorICAgICAgICAgICB3aXRoICd1bnJlYWRsaW5lKCknKS4gIElmIHRoZSAnam9pbl9saW5lcycgb3B0aW9uIGlzIHRydWUsIHRoaXMKKyAgICAgICAgICAgbWF5IGludm9sdmUgcmVhZGluZyBtdWx0aXBsZSBwaHlzaWNhbCBsaW5lcyBjb25jYXRlbmF0ZWQgaW50byBhCisgICAgICAgICAgIHNpbmdsZSBzdHJpbmcuICBVcGRhdGVzIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLCBzbyBjYWxsaW5nCisgICAgICAgICAgICd3YXJuKCknIGFmdGVyICdyZWFkbGluZSgpJyBlbWl0cyBhIHdhcm5pbmcgYWJvdXQgdGhlIHBoeXNpY2FsCisgICAgICAgICAgIGxpbmUocykganVzdCByZWFkLiAgUmV0dXJucyBOb25lIG9uIGVuZC1vZi1maWxlLCBzaW5jZSB0aGUgZW1wdHkKKyAgICAgICAgICAgc3RyaW5nIGNhbiBvY2N1ciBpZiAncnN0cmlwX3dzJyBpcyB0cnVlIGJ1dCAnc3RyaXBfYmxhbmtzJyBpcworICAgICAgICAgICBub3QuIiIiCisKKyAgICAgICAgIyBJZiBhbnkgInVucmVhZCIgbGluZXMgd2FpdGluZyBpbiAnbGluZWJ1ZicsIHJldHVybiB0aGUgdG9wCisgICAgICAgICMgb25lLiAgKFdlIGRvbid0IGFjdHVhbGx5IGJ1ZmZlciByZWFkLWFoZWFkIGRhdGEgLS0gbGluZXMgb25seQorICAgICAgICAjIGdldCBwdXQgaW4gJ2xpbmVidWYnIGlmIHRoZSBjbGllbnQgZXhwbGljaXRseSBkb2VzIGFuCisgICAgICAgICMgJ3VucmVhZGxpbmUoKScuCisgICAgICAgIGlmIHNlbGYubGluZWJ1ZjoKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmxpbmVidWZbLTFdCisgICAgICAgICAgICBkZWwgc2VsZi5saW5lYnVmWy0xXQorICAgICAgICAgICAgcmV0dXJuIGxpbmUKKworICAgICAgICBidWlsZHVwX2xpbmUgPSAnJworCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAjIHJlYWQgdGhlIGxpbmUsIG1ha2UgaXQgTm9uZSBpZiBFT0YKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbGluZSA9PSAnJzogbGluZSA9IE5vbmUKKworICAgICAgICAgICAgaWYgc2VsZi5zdHJpcF9jb21tZW50cyBhbmQgbGluZToKKworICAgICAgICAgICAgICAgICMgTG9vayBmb3IgdGhlIGZpcnN0ICIjIiBpbiB0aGUgbGluZS4gIElmIG5vbmUsIG5ldmVyCisgICAgICAgICAgICAgICAgIyBtaW5kLiAgSWYgd2UgZmluZCBvbmUgYW5kIGl0J3MgdGhlIGZpcnN0IGNoYXJhY3Rlciwgb3IKKyAgICAgICAgICAgICAgICAjIGlzIG5vdCBwcmVjZWRlZCBieSAiXCIsIHRoZW4gaXQgc3RhcnRzIGEgY29tbWVudCAtLQorICAgICAgICAgICAgICAgICMgc3RyaXAgdGhlIGNvbW1lbnQsIHN0cmlwIHdoaXRlc3BhY2UgYmVmb3JlIGl0LCBhbmQKKyAgICAgICAgICAgICAgICAjIGNhcnJ5IG9uLiAgT3RoZXJ3aXNlLCBpdCdzIGp1c3QgYW4gZXNjYXBlZCAiIyIsIHNvCisgICAgICAgICAgICAgICAgIyB1bmVzY2FwZSBpdCAoYW5kIGFueSBvdGhlciBlc2NhcGVkICIjIidzIHRoYXQgbWlnaHQgYmUKKyAgICAgICAgICAgICAgICAjIGx1cmtpbmcgaW4gdGhlcmUpIGFuZCBvdGhlcndpc2UgbGVhdmUgdGhlIGxpbmUgYWxvbmUuCisKKyAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmZpbmQoIiMiKQorICAgICAgICAgICAgICAgIGlmIHBvcyA9PSAtMTogICAgICAgICAgICMgbm8gIiMiIC0tIG5vIGNvbW1lbnRzCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgICAgICMgSXQncyBkZWZpbml0ZWx5IGEgY29tbWVudCAtLSBlaXRoZXIgIiMiIGlzIHRoZSBmaXJzdAorICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyLCBvciBpdCdzIGVsc2V3aGVyZSBhbmQgdW5lc2NhcGVkLgorICAgICAgICAgICAgICAgIGVsaWYgcG9zID09IDAgb3IgbGluZVtwb3MtMV0gIT0gIlxcIjoKKyAgICAgICAgICAgICAgICAgICAgIyBIYXZlIHRvIHByZXNlcnZlIHRoZSB0cmFpbGluZyBuZXdsaW5lLCBiZWNhdXNlIGl0J3MKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgam9iIG9mIGEgbGF0ZXIgc3RlcCAocnN0cmlwX3dzKSB0byByZW1vdmUgaXQgLS0KKyAgICAgICAgICAgICAgICAgICAgIyBhbmQgaWYgcnN0cmlwX3dzIGlzIGZhbHNlLCB3ZSdkIGJldHRlciBwcmVzZXJ2ZSBpdCEKKyAgICAgICAgICAgICAgICAgICAgIyAoTkIuIHRoaXMgbWVhbnMgdGhhdCBpZiB0aGUgZmluYWwgbGluZSBpcyBhbGwgY29tbWVudAorICAgICAgICAgICAgICAgICAgICAjIGFuZCBoYXMgbm8gdHJhaWxpbmcgbmV3bGluZSwgd2Ugd2lsbCB0aGluayB0aGF0IGl0J3MKKyAgICAgICAgICAgICAgICAgICAgIyBFT0Y7IEkgdGhpbmsgdGhhdCdzIE9LLikKKyAgICAgICAgICAgICAgICAgICAgZW9sID0gKGxpbmVbLTFdID09ICdcbicpIGFuZCAnXG4nIG9yICcnCisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzA6cG9zXSArIGVvbAorCisgICAgICAgICAgICAgICAgICAgICMgSWYgYWxsIHRoYXQncyBsZWZ0IGlzIHdoaXRlc3BhY2UsIHRoZW4gc2tpcCBsaW5lCisgICAgICAgICAgICAgICAgICAgICMgKm5vdyosIGJlZm9yZSB3ZSB0cnkgdG8gam9pbiBpdCB0byAnYnVpbGR1cF9saW5lJyAtLQorICAgICAgICAgICAgICAgICAgICAjIHRoYXQgd2F5IGNvbnN0cnVjdHMgbGlrZQorICAgICAgICAgICAgICAgICAgICAjICAgaGVsbG8gXFwKKyAgICAgICAgICAgICAgICAgICAgIyAgICMgY29tbWVudCB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICMgICB0aGVyZQorICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdCBpbiAiaGVsbG8gdGhlcmUiLgorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0cmlwKCkgPT0gIiI6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgIyBpdCdzIGFuIGVzY2FwZWQgIiMiCisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoIlxcIyIsICIjIikKKworCisgICAgICAgICAgICAjIGRpZCBwcmV2aW91cyBsaW5lIGVuZCB3aXRoIGEgYmFja3NsYXNoPyB0aGVuIGFjY3VtdWxhdGUKKyAgICAgICAgICAgIGlmIHNlbGYuam9pbl9saW5lcyBhbmQgYnVpbGR1cF9saW5lOgorICAgICAgICAgICAgICAgICMgb29wczogZW5kIG9mIGZpbGUKKyAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud2FybiAoImNvbnRpbnVhdGlvbiBsaW5lIGltbWVkaWF0ZWx5IHByZWNlZGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW5kLW9mLWZpbGUiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGR1cF9saW5lCisKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbGxhcHNlX2pvaW46CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLmxzdHJpcCgpCisgICAgICAgICAgICAgICAgbGluZSA9IGJ1aWxkdXBfbGluZSArIGxpbmUKKworICAgICAgICAgICAgICAgICMgY2FyZWZ1bDogcGF5IGF0dGVudGlvbiB0byBsaW5lIG51bWJlciB3aGVuIGluY3JlbWVudGluZyBpdAorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5jdXJyZW50X2xpbmUsIGxpc3QpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRfbGluZVsxXSA9IHNlbGYuY3VycmVudF9saW5lWzFdICsgMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9saW5lID0gW3NlbGYuY3VycmVudF9saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRfbGluZSsxXQorICAgICAgICAgICAgIyBqdXN0IGFuIG9yZGluYXJ5IGxpbmUsIHJlYWQgaXQgYXMgdXN1YWwKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbGluZSBpcyBOb25lOiAgICAgICAgIyBlb2YKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAgICAgICAgICMgc3RpbGwgaGF2ZSB0byBiZSBjYXJlZnVsIGFib3V0IGluY3JlbWVudGluZyB0aGUgbGluZSBudW1iZXIhCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmN1cnJlbnRfbGluZSwgbGlzdCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9saW5lID0gc2VsZi5jdXJyZW50X2xpbmVbMV0gKyAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50X2xpbmUgPSBzZWxmLmN1cnJlbnRfbGluZSArIDEKKworCisgICAgICAgICAgICAjIHN0cmlwIHdoaXRlc3BhY2UgaG93ZXZlciB0aGUgY2xpZW50IHdhbnRzIChsZWFkaW5nIGFuZAorICAgICAgICAgICAgIyB0cmFpbGluZywgb3Igb25lIG9yIHRoZSBvdGhlciwgb3IgbmVpdGhlcikKKyAgICAgICAgICAgIGlmIHNlbGYubHN0cmlwX3dzIGFuZCBzZWxmLnJzdHJpcF93czoKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgICAgICBlbGlmIHNlbGYubHN0cmlwX3dzOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLmxzdHJpcCgpCisgICAgICAgICAgICBlbGlmIHNlbGYucnN0cmlwX3dzOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCisKKyAgICAgICAgICAgICMgYmxhbmsgbGluZSAod2hldGhlciB3ZSByc3RyaXAnZWQgb3Igbm90KT8gc2tpcCB0byBuZXh0IGxpbmUKKyAgICAgICAgICAgICMgaWYgYXBwcm9wcmlhdGUKKyAgICAgICAgICAgIGlmIChsaW5lID09ICcnIG9yIGxpbmUgPT0gJ1xuJykgYW5kIHNlbGYuc2tpcF9ibGFua3M6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgc2VsZi5qb2luX2xpbmVzOgorICAgICAgICAgICAgICAgIGlmIGxpbmVbLTFdID09ICdcXCc6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkdXBfbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgbGluZVstMjpdID09ICdcXFxuJzoKKyAgICAgICAgICAgICAgICAgICAgYnVpbGR1cF9saW5lID0gbGluZVswOi0yXSArICdcbicKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyB3ZWxsLCBJIGd1ZXNzIHRoZXJlJ3Mgc29tZSBhY3R1YWwgY29udGVudCB0aGVyZTogcmV0dXJuIGl0CisgICAgICAgICAgICByZXR1cm4gbGluZQorCisgICAgIyByZWFkbGluZSAoKQorCisKKyAgICBkZWYgcmVhZGxpbmVzIChzZWxmKToKKyAgICAgICAgIiIiUmVhZCBhbmQgcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBsb2dpY2FsIGxpbmVzIHJlbWFpbmluZyBpbiB0aGUKKyAgICAgICAgICAgY3VycmVudCBmaWxlLiIiIgorCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGxpbmUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZXMKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCAobGluZSkKKworCisgICAgZGVmIHVucmVhZGxpbmUgKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJQdXNoICdsaW5lJyAoYSBzdHJpbmcpIG9udG8gYW4gaW50ZXJuYWwgYnVmZmVyIHRoYXQgd2lsbCBiZQorICAgICAgICAgICBjaGVja2VkIGJ5IGZ1dHVyZSAncmVhZGxpbmUoKScgY2FsbHMuICBIYW5keSBmb3IgaW1wbGVtZW50aW5nCisgICAgICAgICAgIGEgcGFyc2VyIHdpdGggbGluZS1hdC1hLXRpbWUgbG9va2FoZWFkLiIiIgorCisgICAgICAgIHNlbGYubGluZWJ1Zi5hcHBlbmQgKGxpbmUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXh0X2ZpbGUucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGV4dF9maWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY1MjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGV4dF9maWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXh0X2ZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGV4dF9maWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmY1MjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGV4dF9maWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzBhYjRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weQpAQCAtMCwwICsxLDI5MCBAQAorIiIiZGlzdHV0aWxzLnVuaXhjY29tcGlsZXIKKworQ29udGFpbnMgdGhlIFVuaXhDQ29tcGlsZXIgY2xhc3MsIGEgc3ViY2xhc3Mgb2YgQ0NvbXBpbGVyIHRoYXQgaGFuZGxlcwordGhlICJ0eXBpY2FsIiBVbml4LXN0eWxlIGNvbW1hbmQtbGluZSBDIGNvbXBpbGVyOgorICAqIG1hY3JvcyBkZWZpbmVkIHdpdGggLURuYW1lWz12YWx1ZV0KKyAgKiBtYWNyb3MgdW5kZWZpbmVkIHdpdGggLVVuYW1lCisgICogaW5jbHVkZSBzZWFyY2ggZGlyZWN0b3JpZXMgc3BlY2lmaWVkIHdpdGggLUlkaXIKKyAgKiBsaWJyYXJpZXMgc3BlY2lmaWVkIHdpdGggLWxsbGliCisgICogbGlicmFyeSBzZWFyY2ggZGlyZWN0b3JpZXMgc3BlY2lmaWVkIHdpdGggLUxkaXIKKyAgKiBjb21waWxlIGhhbmRsZWQgYnkgJ2NjJyAob3Igc2ltaWxhcikgZXhlY3V0YWJsZSB3aXRoIC1jIG9wdGlvbjoKKyAgICBjb21waWxlcyAuYyB0byAubworICAqIGxpbmsgc3RhdGljIGxpYnJhcnkgaGFuZGxlZCBieSAnYXInIGNvbW1hbmQgKHBvc3NpYmx5IHdpdGggJ3JhbmxpYicpCisgICogbGluayBzaGFyZWQgbGlicmFyeSBoYW5kbGVkIGJ5ICdjYyAtc2hhcmVkJworIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MsIHN5cywgcmUKK2Zyb20gdHlwZXMgaW1wb3J0IFN0cmluZ1R5cGUsIE5vbmVUeXBlCisKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKK2Zyb20gZGlzdHV0aWxzLmRlcF91dGlsIGltcG9ydCBuZXdlcgorZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBcCisgICAgIENDb21waWxlciwgZ2VuX3ByZXByb2Nlc3Nfb3B0aW9ucywgZ2VuX2xpYl9vcHRpb25zCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IFwKKyAgICAgRGlzdHV0aWxzRXhlY0Vycm9yLCBDb21waWxlRXJyb3IsIExpYkVycm9yLCBMaW5rRXJyb3IKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgIGltcG9ydCBfb3N4X3N1cHBvcnQKKworIyBYWFggVGhpbmdzIG5vdCBjdXJyZW50bHkgaGFuZGxlZDoKKyMgICAqIG9wdGltaXphdGlvbi9kZWJ1Zy93YXJuaW5nIGZsYWdzOyB3ZSBqdXN0IHVzZSB3aGF0ZXZlcidzIGluIFB5dGhvbidzCisjICAgICBNYWtlZmlsZSBhbmQgbGl2ZSB3aXRoIGl0LiAgSXMgdGhpcyBhZGVxdWF0ZT8gIElmIG5vdCwgd2UgbWlnaHQKKyMgICAgIGhhdmUgdG8gaGF2ZSBhIGJ1bmNoIG9mIHN1YmNsYXNzZXMgR05VQ0NvbXBpbGVyLCBTR0lDQ29tcGlsZXIsCisjICAgICBTdW5DQ29tcGlsZXIsIGFuZCBJIHN1c3BlY3QgZG93biB0aGF0IHJvYWQgbGllcyBtYWRuZXNzLgorIyAgICogZXZlbiBpZiB3ZSBkb24ndCBrbm93IGEgd2FybmluZyBmbGFnIGZyb20gYW4gb3B0aW1pemF0aW9uIGZsYWcsCisjICAgICB3ZSBuZWVkIHNvbWUgd2F5IGZvciBvdXRzaWRlcnMgdG8gZmVlZCBwcmVwcm9jZXNzb3IvY29tcGlsZXIvbGlua2VyCisjICAgICBmbGFncyBpbiB0byB1cyAtLSBlZy4gYSBzeXNhZG1pbiBtaWdodCB3YW50IHRvIG1hbmRhdGUgY2VydGFpbiBmbGFncworIyAgICAgdmlhIGEgc2l0ZSBjb25maWcgZmlsZSwgb3IgYSB1c2VyIG1pZ2h0IHdhbnQgdG8gc2V0IHNvbWV0aGluZyBmb3IKKyMgICAgIGNvbXBpbGluZyB0aGlzIG1vZHVsZSBkaXN0cmlidXRpb24gb25seSB2aWEgdGhlIHNldHVwLnB5IGNvbW1hbmQKKyMgICAgIGxpbmUsIHdoYXRldmVyLiAgQXMgbG9uZyBhcyB0aGVzZSBvcHRpb25zIGNvbWUgZnJvbSBzb21ldGhpbmcgb24gdGhlCisjICAgICBjdXJyZW50IHN5c3RlbSwgdGhleSBjYW4gYmUgYXMgc3lzdGVtLWRlcGVuZGVudCBhcyB0aGV5IGxpa2UsIGFuZCB3ZQorIyAgICAgc2hvdWxkIGp1c3QgaGFwcGlseSBzdHVmZiB0aGVtIGludG8gdGhlIHByZXByb2Nlc3Nvci9jb21waWxlci9saW5rZXIKKyMgICAgIG9wdGlvbnMgYW5kIGNhcnJ5IG9uLgorCisKK2NsYXNzIFVuaXhDQ29tcGlsZXIoQ0NvbXBpbGVyKToKKworICAgIGNvbXBpbGVyX3R5cGUgPSAndW5peCcKKworICAgICMgVGhlc2UgYXJlIHVzZWQgYnkgQ0NvbXBpbGVyIGluIHR3byBwbGFjZXM6IHRoZSBjb25zdHJ1Y3RvciBzZXRzCisgICAgIyBpbnN0YW5jZSBhdHRyaWJ1dGVzICdwcmVwcm9jZXNzb3InLCAnY29tcGlsZXInLCBldGMuIGZyb20gdGhlbSwgYW5kCisgICAgIyAnc2V0X2V4ZWN1dGFibGUoKScgYWxsb3dzIGFueSBvZiB0aGVzZSB0byBiZSBzZXQuICBUaGUgZGVmYXVsdHMgaGVyZQorICAgICMgYXJlIHByZXR0eSBnZW5lcmljOyB0aGV5IHdpbGwgcHJvYmFibHkgaGF2ZSB0byBiZSBzZXQgYnkgYW4gb3V0c2lkZXIKKyAgICAjIChlZy4gdXNpbmcgaW5mb3JtYXRpb24gZGlzY292ZXJlZCBieSB0aGUgc3lzY29uZmlnIGFib3V0IGJ1aWxkaW5nCisgICAgIyBQeXRob24gZXh0ZW5zaW9ucykuCisgICAgZXhlY3V0YWJsZXMgPSB7J3ByZXByb2Nlc3NvcicgOiBOb25lLAorICAgICAgICAgICAgICAgICAgICdjb21waWxlcicgICAgIDogWyJjYyJdLAorICAgICAgICAgICAgICAgICAgICdjb21waWxlcl9zbycgIDogWyJjYyJdLAorICAgICAgICAgICAgICAgICAgICdjb21waWxlcl9jeHgnIDogWyJjYyJdLAorICAgICAgICAgICAgICAgICAgICdsaW5rZXJfc28nICAgIDogWyJjYyIsICItc2hhcmVkIl0sCisgICAgICAgICAgICAgICAgICAgJ2xpbmtlcl9leGUnICAgOiBbImNjIl0sCisgICAgICAgICAgICAgICAgICAgJ2FyY2hpdmVyJyAgICAgOiBbImFyIiwgIi1jciJdLAorICAgICAgICAgICAgICAgICAgICdyYW5saWInICAgICAgIDogTm9uZSwKKyAgICAgICAgICAgICAgICAgIH0KKworICAgIGlmIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gImRhcndpbiI6CisgICAgICAgIGV4ZWN1dGFibGVzWydyYW5saWInXSA9IFsicmFubGliIl0KKworICAgICMgTmVlZGVkIGZvciB0aGUgZmlsZW5hbWUgZ2VuZXJhdGlvbiBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZSBiYXNlCisgICAgIyBjbGFzcywgQ0NvbXBpbGVyLiAgTkIuIHdob2V2ZXIgaW5zdGFudGlhdGVzL3VzZXMgYSBwYXJ0aWN1bGFyCisgICAgIyBVbml4Q0NvbXBpbGVyIGluc3RhbmNlIHNob3VsZCBzZXQgJ3NoYXJlZF9saWJfZXh0JyAtLSB3ZSBzZXQgYQorICAgICMgcmVhc29uYWJsZSBjb21tb24gZGVmYXVsdCBoZXJlLCBidXQgaXQncyBub3QgbmVjZXNzYXJpbHkgdXNlZCBvbiBhbGwKKyAgICAjIFVuaWNlcyEKKworICAgIHNyY19leHRlbnNpb25zID0gWyIuYyIsIi5DIiwiLmNjIiwiLmN4eCIsIi5jcHAiLCIubSJdCisgICAgb2JqX2V4dGVuc2lvbiA9ICIubyIKKyAgICBzdGF0aWNfbGliX2V4dGVuc2lvbiA9ICIuYSIKKyAgICBzaGFyZWRfbGliX2V4dGVuc2lvbiA9ICIuc28iCisgICAgZHlsaWJfbGliX2V4dGVuc2lvbiA9ICIuZHlsaWIiCisgICAgc3RhdGljX2xpYl9mb3JtYXQgPSBzaGFyZWRfbGliX2Zvcm1hdCA9IGR5bGliX2xpYl9mb3JtYXQgPSAibGliJXMlcyIKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gImN5Z3dpbiI6CisgICAgICAgIGV4ZV9leHRlbnNpb24gPSAiLmV4ZSIKKworICAgIGRlZiBwcmVwcm9jZXNzKHNlbGYsIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBvdXRwdXRfZmlsZT1Ob25lLCBtYWNyb3M9Tm9uZSwgaW5jbHVkZV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lKToKKyAgICAgICAgaWdub3JlLCBtYWNyb3MsIGluY2x1ZGVfZGlycyA9IFwKKyAgICAgICAgICAgIHNlbGYuX2ZpeF9jb21waWxlX2FyZ3MoTm9uZSwgbWFjcm9zLCBpbmNsdWRlX2RpcnMpCisgICAgICAgIHBwX29wdHMgPSBnZW5fcHJlcHJvY2Vzc19vcHRpb25zKG1hY3JvcywgaW5jbHVkZV9kaXJzKQorICAgICAgICBwcF9hcmdzID0gc2VsZi5wcmVwcm9jZXNzb3IgKyBwcF9vcHRzCisgICAgICAgIGlmIG91dHB1dF9maWxlOgorICAgICAgICAgICAgcHBfYXJncy5leHRlbmQoWyctbycsIG91dHB1dF9maWxlXSkKKyAgICAgICAgaWYgZXh0cmFfcHJlYXJnczoKKyAgICAgICAgICAgIHBwX2FyZ3NbOjBdID0gZXh0cmFfcHJlYXJncworICAgICAgICBpZiBleHRyYV9wb3N0YXJnczoKKyAgICAgICAgICAgIHBwX2FyZ3MuZXh0ZW5kKGV4dHJhX3Bvc3RhcmdzKQorICAgICAgICBwcF9hcmdzLmFwcGVuZChzb3VyY2UpCisKKyAgICAgICAgIyBXZSBuZWVkIHRvIHByZXByb2Nlc3M6IGVpdGhlciB3ZSdyZSBiZWluZyBmb3JjZWQgdG8sIG9yIHdlJ3JlCisgICAgICAgICMgZ2VuZXJhdGluZyBvdXRwdXQgdG8gc3Rkb3V0LCBvciB0aGVyZSdzIGEgdGFyZ2V0IG91dHB1dCBmaWxlIGFuZAorICAgICAgICAjIHRoZSBzb3VyY2UgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSB0YXJnZXQgKG9yIHRoZSB0YXJnZXQgZG9lc24ndAorICAgICAgICAjIGV4aXN0KS4KKyAgICAgICAgaWYgc2VsZi5mb3JjZSBvciBvdXRwdXRfZmlsZSBpcyBOb25lIG9yIG5ld2VyKHNvdXJjZSwgb3V0cHV0X2ZpbGUpOgorICAgICAgICAgICAgaWYgb3V0cHV0X2ZpbGU6CisgICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgob3MucGF0aC5kaXJuYW1lKG91dHB1dF9maWxlKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNwYXduKHBwX2FyZ3MpCisgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcGlsZUVycm9yLCBtc2cKKworICAgIGRlZiBfY29tcGlsZShzZWxmLCBvYmosIHNyYywgZXh0LCBjY19hcmdzLCBleHRyYV9wb3N0YXJncywgcHBfb3B0cyk6CisgICAgICAgIGNvbXBpbGVyX3NvID0gc2VsZi5jb21waWxlcl9zbworICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICBjb21waWxlcl9zbyA9IF9vc3hfc3VwcG9ydC5jb21waWxlcl9maXh1cChjb21waWxlcl9zbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY19hcmdzICsgZXh0cmFfcG9zdGFyZ3MpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc3Bhd24oY29tcGlsZXJfc28gKyBjY19hcmdzICsgW3NyYywgJy1vJywgb2JqXSArCisgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzKQorICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IsIG1zZworCisgICAgZGVmIGNyZWF0ZV9zdGF0aWNfbGliKHNlbGYsIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPU5vbmUsIGRlYnVnPTAsIHRhcmdldF9sYW5nPU5vbmUpOgorICAgICAgICBvYmplY3RzLCBvdXRwdXRfZGlyID0gc2VsZi5fZml4X29iamVjdF9hcmdzKG9iamVjdHMsIG91dHB1dF9kaXIpCisKKyAgICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gXAorICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2ZpbGVuYW1lKG91dHB1dF9saWJuYW1lLCBvdXRwdXRfZGlyPW91dHB1dF9kaXIpCisKKyAgICAgICAgaWYgc2VsZi5fbmVlZF9saW5rKG9iamVjdHMsIG91dHB1dF9maWxlbmFtZSk6CisgICAgICAgICAgICBzZWxmLm1rcGF0aChvcy5wYXRoLmRpcm5hbWUob3V0cHV0X2ZpbGVuYW1lKSkKKyAgICAgICAgICAgIHNlbGYuc3Bhd24oc2VsZi5hcmNoaXZlciArCisgICAgICAgICAgICAgICAgICAgICAgIFtvdXRwdXRfZmlsZW5hbWVdICsKKyAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cyArIHNlbGYub2JqZWN0cykKKworICAgICAgICAgICAgIyBOb3QgbWFueSBVbmljZXMgcmVxdWlyZWQgcmFubGliIGFueW1vcmUgLS0gU3VuT1MgNC54IGlzLCBJCisgICAgICAgICAgICAjIHRoaW5rIHRoZSBvbmx5IG1ham9yIFVuaXggdGhhdCBkb2VzLiAgTWF5YmUgd2UgbmVlZCBzb21lCisgICAgICAgICAgICAjIHBsYXRmb3JtIGludGVsbGlnZW5jZSBoZXJlIHRvIHNraXAgcmFubGliIGlmIGl0J3Mgbm90CisgICAgICAgICAgICAjIG5lZWRlZCAtLSBvciBtYXliZSBQeXRob24ncyBjb25maWd1cmUgc2NyaXB0IHRvb2sgY2FyZSBvZgorICAgICAgICAgICAgIyBpdCBmb3IgdXMsIGhlbmNlIHRoZSBjaGVjayBmb3IgbGVhZGluZyBjb2xvbi4KKyAgICAgICAgICAgIGlmIHNlbGYucmFubGliOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zcGF3bihzZWxmLnJhbmxpYiArIFtvdXRwdXRfZmlsZW5hbWVdKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTGliRXJyb3IsIG1zZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nLmRlYnVnKCJza2lwcGluZyAlcyAodXAtdG8tZGF0ZSkiLCBvdXRwdXRfZmlsZW5hbWUpCisKKyAgICBkZWYgbGluayhzZWxmLCB0YXJnZXRfZGVzYywgb2JqZWN0cywKKyAgICAgICAgICAgICBvdXRwdXRfZmlsZW5hbWUsIG91dHB1dF9kaXI9Tm9uZSwgbGlicmFyaWVzPU5vbmUsCisgICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHM9Tm9uZSwgZGVidWc9MCwgZXh0cmFfcHJlYXJncz1Ob25lLAorICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwgdGFyZ2V0X2xhbmc9Tm9uZSk6CisgICAgICAgIG9iamVjdHMsIG91dHB1dF9kaXIgPSBzZWxmLl9maXhfb2JqZWN0X2FyZ3Mob2JqZWN0cywgb3V0cHV0X2RpcikKKyAgICAgICAgbGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzID0gXAorICAgICAgICAgICAgc2VsZi5fZml4X2xpYl9hcmdzKGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycykKKworICAgICAgICBsaWJfb3B0cyA9IGdlbl9saWJfb3B0aW9ucyhzZWxmLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMpCisgICAgICAgIGlmIHR5cGUob3V0cHV0X2Rpcikgbm90IGluIChTdHJpbmdUeXBlLCBOb25lVHlwZSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICInb3V0cHV0X2RpcicgbXVzdCBiZSBhIHN0cmluZyBvciBOb25lIgorICAgICAgICBpZiBvdXRwdXRfZGlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG91dHB1dF9kaXIsIG91dHB1dF9maWxlbmFtZSkKKworICAgICAgICBpZiBzZWxmLl9uZWVkX2xpbmsob2JqZWN0cywgb3V0cHV0X2ZpbGVuYW1lKToKKyAgICAgICAgICAgIGxkX2FyZ3MgPSAob2JqZWN0cyArIHNlbGYub2JqZWN0cyArCisgICAgICAgICAgICAgICAgICAgICAgIGxpYl9vcHRzICsgWyctbycsIG91dHB1dF9maWxlbmFtZV0pCisgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICBsZF9hcmdzWzowXSA9IFsnLWcnXQorICAgICAgICAgICAgaWYgZXh0cmFfcHJlYXJnczoKKyAgICAgICAgICAgICAgICBsZF9hcmdzWzowXSA9IGV4dHJhX3ByZWFyZ3MKKyAgICAgICAgICAgIGlmIGV4dHJhX3Bvc3RhcmdzOgorICAgICAgICAgICAgICAgIGxkX2FyZ3MuZXh0ZW5kKGV4dHJhX3Bvc3RhcmdzKQorICAgICAgICAgICAgc2VsZi5ta3BhdGgob3MucGF0aC5kaXJuYW1lKG91dHB1dF9maWxlbmFtZSkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgdGFyZ2V0X2Rlc2MgPT0gQ0NvbXBpbGVyLkVYRUNVVEFCTEU6CisgICAgICAgICAgICAgICAgICAgIGxpbmtlciA9IHNlbGYubGlua2VyX2V4ZVs6XQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxpbmtlciA9IHNlbGYubGlua2VyX3NvWzpdCisgICAgICAgICAgICAgICAgaWYgdGFyZ2V0X2xhbmcgPT0gImMrKyIgYW5kIHNlbGYuY29tcGlsZXJfY3h4OgorICAgICAgICAgICAgICAgICAgICAjIHNraXAgb3ZlciBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXR0aW5ncyBpZiAvdXNyL2Jpbi9lbnYKKyAgICAgICAgICAgICAgICAgICAgIyBpcyB1c2VkIHRvIHNldCB1cCB0aGUgbGlua2VyJ3MgZW52aXJvbm1lbnQuCisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBuZWVkZWQgb24gT1NYLiBOb3RlOiB0aGlzIGFzc3VtZXMgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBub3JtYWwgYW5kIEMrKyBjb21waWxlciBoYXZlIHRoZSBzYW1lIGVudmlyb25tZW50CisgICAgICAgICAgICAgICAgICAgICMgc2V0dGluZ3MuCisgICAgICAgICAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguYmFzZW5hbWUobGlua2VyWzBdKSA9PSAiZW52IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAnPScgaW4gbGlua2VyW2ldOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQorCisgICAgICAgICAgICAgICAgICAgIGxpbmtlcltpXSA9IHNlbGYuY29tcGlsZXJfY3h4W2ldCisKKyAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICAgICAgICAgIGxpbmtlciA9IF9vc3hfc3VwcG9ydC5jb21waWxlcl9maXh1cChsaW5rZXIsIGxkX2FyZ3MpCisKKyAgICAgICAgICAgICAgICBzZWxmLnNwYXduKGxpbmtlciArIGxkX2FyZ3MpCisgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcmFpc2UgTGlua0Vycm9yLCBtc2cKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZy5kZWJ1Zygic2tpcHBpbmcgJXMgKHVwLXRvLWRhdGUpIiwgb3V0cHV0X2ZpbGVuYW1lKQorCisgICAgIyAtLSBNaXNjZWxsYW5lb3VzIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRoZXNlIGFyZSBhbGwgdXNlZCBieSB0aGUgJ2dlbl9saWJfb3B0aW9ucygpIGZ1bmN0aW9uLCBpbgorICAgICMgY2NvbXBpbGVyLnB5LgorCisgICAgZGVmIGxpYnJhcnlfZGlyX29wdGlvbihzZWxmLCBkaXIpOgorICAgICAgICByZXR1cm4gIi1MIiArIGRpcgorCisgICAgZGVmIF9pc19nY2Moc2VsZiwgY29tcGlsZXJfbmFtZSk6CisgICAgICAgIHJldHVybiAiZ2NjIiBpbiBjb21waWxlcl9uYW1lIG9yICJnKysiIGluIGNvbXBpbGVyX25hbWUKKworICAgIGRlZiBydW50aW1lX2xpYnJhcnlfZGlyX29wdGlvbihzZWxmLCBkaXIpOgorICAgICAgICAjIFhYWCBIYWNraXNoLCBhdCB0aGUgdmVyeSBsZWFzdC4gIFNlZSBQeXRob24gYnVnICM0NDU5MDI6CisgICAgICAgICMgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyL2luZGV4LnBocAorICAgICAgICAjICAgP2Z1bmM9ZGV0YWlsJmFpZD00NDU5MDImZ3JvdXBfaWQ9NTQ3MCZhdGlkPTEwNTQ3MAorICAgICAgICAjIExpbmtlcnMgb24gZGlmZmVyZW50IHBsYXRmb3JtcyBuZWVkIGRpZmZlcmVudCBvcHRpb25zIHRvCisgICAgICAgICMgc3BlY2lmeSB0aGF0IGRpcmVjdG9yaWVzIG5lZWQgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YKKyAgICAgICAgIyBkaXJlY3RvcmllcyBzZWFyY2hlZCBmb3IgZGVwZW5kZW5jaWVzIHdoZW4gYSBkeW5hbWljIGxpYnJhcnkKKyAgICAgICAgIyBpcyBzb3VnaHQuICBHQ0MgaGFzIHRvIGJlIHRvbGQgdG8gcGFzcyB0aGUgLVIgb3B0aW9uIHRocm91Z2gKKyAgICAgICAgIyB0byB0aGUgbGlua2VyLCB3aGVyZWFzIG90aGVyIGNvbXBpbGVycyBqdXN0IGtub3cgdGhpcy4KKyAgICAgICAgIyBPdGhlciBjb21waWxlcnMgbWF5IG5lZWQgc29tZXRoaW5nIHNsaWdodGx5IGRpZmZlcmVudC4gIEF0CisgICAgICAgICMgdGhpcyB0aW1lLCB0aGVyZSdzIG5vIHdheSB0byBkZXRlcm1pbmUgdGhpcyBpbmZvcm1hdGlvbiBmcm9tCisgICAgICAgICMgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBzdG9yZWQgaW4gdGhlIFB5dGhvbiBpbnN0YWxsYXRpb24sIHNvCisgICAgICAgICMgd2UgdXNlIHRoaXMgaGFjay4KKyAgICAgICAgY29tcGlsZXIgPSBvcy5wYXRoLmJhc2VuYW1lKHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiQ0MiKSkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzo2XSA9PSAiZGFyd2luIjoKKyAgICAgICAgICAgICMgTWFjT1NYJ3MgbGlua2VyIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGUgLVIgZmxhZyBhdCBhbGwKKyAgICAgICAgICAgIHJldHVybiAiLUwiICsgZGlyCisgICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtWzo1XSA9PSAiaHAtdXgiOgorICAgICAgICAgICAgaWYgc2VsZi5faXNfZ2NjKGNvbXBpbGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gWyItV2wsK3MiLCAiLUwiICsgZGlyXQorICAgICAgICAgICAgcmV0dXJuIFsiK3MiLCAiLUwiICsgZGlyXQorICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybVs6N10gPT0gImlyaXg2NDYiIG9yIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gIm9zZjFWNSI6CisgICAgICAgICAgICByZXR1cm4gWyItcnBhdGgiLCBkaXJdCisgICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAiYWl4IjoKKyAgICAgICAgICAgIHJldHVybiAiLWJsaWJwYXRoOiIgKyBkaXIKKyAgICAgICAgZWxpZiBzZWxmLl9pc19nY2MoY29tcGlsZXIpOgorICAgICAgICAgICAgcmV0dXJuICItV2wsLVIiICsgZGlyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIi1SIiArIGRpcgorCisgICAgZGVmIGxpYnJhcnlfb3B0aW9uKHNlbGYsIGxpYik6CisgICAgICAgIHJldHVybiAiLWwiICsgbGliCisKKyAgICBkZWYgZmluZF9saWJyYXJ5X2ZpbGUoc2VsZiwgZGlycywgbGliLCBkZWJ1Zz0wKToKKyAgICAgICAgc2hhcmVkX2YgPSBzZWxmLmxpYnJhcnlfZmlsZW5hbWUobGliLCBsaWJfdHlwZT0nc2hhcmVkJykKKyAgICAgICAgZHlsaWJfZiA9IHNlbGYubGlicmFyeV9maWxlbmFtZShsaWIsIGxpYl90eXBlPSdkeWxpYicpCisgICAgICAgIHN0YXRpY19mID0gc2VsZi5saWJyYXJ5X2ZpbGVuYW1lKGxpYiwgbGliX3R5cGU9J3N0YXRpYycpCisKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgIyBPbiBPU1ggdXNlcnMgY2FuIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIFNESyB1c2luZworICAgICAgICAgICAgIyAnLWlzeXNyb290JywgY2FsY3VsYXRlIHRoZSBTREsgcm9vdCBpZiBpdCBpcyBzcGVjaWZpZWQKKyAgICAgICAgICAgICMgKGFuZCB1c2UgaXQgZnVydGhlciBvbikKKyAgICAgICAgICAgIGNmbGFncyA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQ0ZMQUdTJykKKyAgICAgICAgICAgIG0gPSByZS5zZWFyY2gocictaXN5c3Jvb3RccysoXFMrKScsIGNmbGFncykKKyAgICAgICAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzeXNyb290ID0gJy8nCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN5c3Jvb3QgPSBtLmdyb3VwKDEpCisKKworCisgICAgICAgIGZvciBkaXIgaW4gZGlyczoKKyAgICAgICAgICAgIHNoYXJlZCA9IG9zLnBhdGguam9pbihkaXIsIHNoYXJlZF9mKQorICAgICAgICAgICAgZHlsaWIgPSBvcy5wYXRoLmpvaW4oZGlyLCBkeWxpYl9mKQorICAgICAgICAgICAgc3RhdGljID0gb3MucGF0aC5qb2luKGRpciwgc3RhdGljX2YpCisKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgKAorICAgICAgICAgICAgICAgIGRpci5zdGFydHN3aXRoKCcvU3lzdGVtLycpIG9yICgKKyAgICAgICAgICAgICAgICBkaXIuc3RhcnRzd2l0aCgnL3Vzci8nKSBhbmQgbm90IGRpci5zdGFydHN3aXRoKCcvdXNyL2xvY2FsLycpKSk6CisKKyAgICAgICAgICAgICAgICBzaGFyZWQgPSBvcy5wYXRoLmpvaW4oc3lzcm9vdCwgZGlyWzE6XSwgc2hhcmVkX2YpCisgICAgICAgICAgICAgICAgZHlsaWIgPSBvcy5wYXRoLmpvaW4oc3lzcm9vdCwgZGlyWzE6XSwgZHlsaWJfZikKKyAgICAgICAgICAgICAgICBzdGF0aWMgPSBvcy5wYXRoLmpvaW4oc3lzcm9vdCwgZGlyWzE6XSwgc3RhdGljX2YpCisKKyAgICAgICAgICAgICMgV2UncmUgc2Vjb25kLWd1ZXNzaW5nIHRoZSBsaW5rZXIgaGVyZSwgd2l0aCBub3QgbXVjaCBoYXJkCisgICAgICAgICAgICAjIGRhdGEgdG8gZ28gb246IEdDQyBzZWVtcyB0byBwcmVmZXIgdGhlIHNoYXJlZCBsaWJyYXJ5LCBzbyBJJ20KKyAgICAgICAgICAgICMgYXNzdW1pbmcgdGhhdCAqYWxsKiBVbml4IEMgY29tcGlsZXJzIGRvLiAgQW5kIG9mIGNvdXJzZSBJJ20KKyAgICAgICAgICAgICMgaWdub3JpbmcgZXZlbiBHQ0MncyAiLXN0YXRpYyIgb3B0aW9uLiAgU28gc3VlIG1lLgorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHlsaWIpOgorICAgICAgICAgICAgICAgIHJldHVybiBkeWxpYgorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzaGFyZWQpOgorICAgICAgICAgICAgICAgIHJldHVybiBzaGFyZWQKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc3RhdGljKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGljCisKKyAgICAgICAgIyBPb3BzLCBkaWRuJ3QgZmluZCBpdCBpbiAqYW55KiBvZiAnZGlycycKKyAgICAgICAgcmV0dXJuIE5vbmUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiOTdlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiOTdlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3V0aWwucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZmZhODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91dGlsLnB5CkBAIC0wLDAgKzEsNDk5IEBACisiIiJkaXN0dXRpbHMudXRpbAorCitNaXNjZWxsYW5lb3VzIHV0aWxpdHkgZnVuY3Rpb25zIC0tIGFueXRoaW5nIHRoYXQgZG9lc24ndCBmaXQgaW50bworb25lIG9mIHRoZSBvdGhlciAqdXRpbC5weSBtb2R1bGVzLgorIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgc3lzLCBvcywgc3RyaW5nLCByZQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yCitmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXIKK2Zyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNCeXRlQ29tcGlsZUVycm9yCisKK2RlZiBnZXRfcGxhdGZvcm0gKCk6CisgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgY3VycmVudCBwbGF0Zm9ybS4gIFRoaXMgaXMgdXNlZAorICAgIG1haW5seSB0byBkaXN0aW5ndWlzaCBwbGF0Zm9ybS1zcGVjaWZpYyBidWlsZCBkaXJlY3RvcmllcyBhbmQKKyAgICBwbGF0Zm9ybS1zcGVjaWZpYyBidWlsdCBkaXN0cmlidXRpb25zLiAgVHlwaWNhbGx5IGluY2x1ZGVzIHRoZSBPUyBuYW1lCisgICAgYW5kIHZlcnNpb24gYW5kIHRoZSBhcmNoaXRlY3R1cmUgKGFzIHN1cHBsaWVkIGJ5ICdvcy51bmFtZSgpJyksCisgICAgYWx0aG91Z2ggdGhlIGV4YWN0IGluZm9ybWF0aW9uIGluY2x1ZGVkIGRlcGVuZHMgb24gdGhlIE9TOyBlZy4gZm9yIElSSVgKKyAgICB0aGUgYXJjaGl0ZWN0dXJlIGlzbid0IHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgKElSSVggb25seSBydW5zIG9uIFNHSQorICAgIGhhcmR3YXJlKSwgYnV0IGZvciBMaW51eCB0aGUga2VybmVsIHZlcnNpb24gaXNuJ3QgcGFydGljdWxhcmx5CisgICAgaW1wb3J0YW50LgorCisgICAgRXhhbXBsZXMgb2YgcmV0dXJuZWQgdmFsdWVzOgorICAgICAgIGxpbnV4LWk1ODYKKyAgICAgICBsaW51eC1hbHBoYSAoPykKKyAgICAgICBzb2xhcmlzLTIuNi1zdW40dQorICAgICAgIGlyaXgtNS4zCisgICAgICAgaXJpeDY0LTYuMgorCisgICAgV2luZG93cyB3aWxsIHJldHVybiBvbmUgb2Y6CisgICAgICAgd2luLWFtZDY0ICg2NGJpdCBXaW5kb3dzIG9uIEFNRDY0IChha2EgeDg2XzY0LCBJbnRlbDY0LCBFTTY0VCwgZXRjKQorICAgICAgIHdpbi1pYTY0ICg2NGJpdCBXaW5kb3dzIG9uIEl0YW5pdW0pCisgICAgICAgd2luMzIgKGFsbCBvdGhlcnMgLSBzcGVjaWZpY2FsbHksIHN5cy5wbGF0Zm9ybSBpcyByZXR1cm5lZCkKKworICAgIEZvciBvdGhlciBub24tUE9TSVggcGxhdGZvcm1zLCBjdXJyZW50bHkganVzdCByZXR1cm5zICdzeXMucGxhdGZvcm0nLgorICAgICIiIgorICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgIyBzbmlmZiBzeXMudmVyc2lvbiBmb3IgYXJjaGl0ZWN0dXJlLgorICAgICAgICBwcmVmaXggPSAiIGJpdCAoIgorICAgICAgICBpID0gc3RyaW5nLmZpbmQoc3lzLnZlcnNpb24sIHByZWZpeCkKKyAgICAgICAgaWYgaSA9PSAtMToKKyAgICAgICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0KKyAgICAgICAgaiA9IHN0cmluZy5maW5kKHN5cy52ZXJzaW9uLCAiKSIsIGkpCisgICAgICAgIGxvb2sgPSBzeXMudmVyc2lvbltpK2xlbihwcmVmaXgpOmpdLmxvd2VyKCkKKyAgICAgICAgaWYgbG9vaz09J2FtZDY0JzoKKyAgICAgICAgICAgIHJldHVybiAnd2luLWFtZDY0JworICAgICAgICBpZiBsb29rPT0naXRhbml1bSc6CisgICAgICAgICAgICByZXR1cm4gJ3dpbi1pYTY0JworICAgICAgICByZXR1cm4gc3lzLnBsYXRmb3JtCisKKyAgICAjIFNldCBmb3IgY3Jvc3MgYnVpbGRzIGV4cGxpY2l0bHkKKyAgICBpZiAiX1BZVEhPTl9IT1NUX1BMQVRGT1JNIiBpbiBvcy5lbnZpcm9uOgorICAgICAgICByZXR1cm4gb3MuZW52aXJvblsiX1BZVEhPTl9IT1NUX1BMQVRGT1JNIl0KKworICAgIGlmIG9zLm5hbWUgIT0gInBvc2l4IiBvciBub3QgaGFzYXR0cihvcywgJ3VuYW1lJyk6CisgICAgICAgICMgWFhYIHdoYXQgYWJvdXQgdGhlIGFyY2hpdGVjdHVyZT8gTlQgaXMgSW50ZWwgb3IgQWxwaGEsCisgICAgICAgICMgTWFjIE9TIGlzIE02OGsgb3IgUFBDLCBldGMuCisgICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0KKworICAgICMgVHJ5IHRvIGRpc3Rpbmd1aXNoIHZhcmlvdXMgZmxhdm91cnMgb2YgVW5peAorCisgICAgKG9zbmFtZSwgaG9zdCwgcmVsZWFzZSwgdmVyc2lvbiwgbWFjaGluZSkgPSBvcy51bmFtZSgpCisKKyAgICAjIENvbnZlcnQgdGhlIE9TIG5hbWUgdG8gbG93ZXJjYXNlLCByZW1vdmUgJy8nIGNoYXJhY3RlcnMKKyAgICAjICh0byBhY2NvbW1vZGF0ZSBCU0QvT1MpLCBhbmQgdHJhbnNsYXRlIHNwYWNlcyAoZm9yICJQb3dlciBNYWNpbnRvc2giKQorICAgIG9zbmFtZSA9IHN0cmluZy5sb3dlcihvc25hbWUpCisgICAgb3NuYW1lID0gc3RyaW5nLnJlcGxhY2Uob3NuYW1lLCAnLycsICcnKQorICAgIG1hY2hpbmUgPSBzdHJpbmcucmVwbGFjZShtYWNoaW5lLCAnICcsICdfJykKKyAgICBtYWNoaW5lID0gc3RyaW5nLnJlcGxhY2UobWFjaGluZSwgJy8nLCAnLScpCisKKyAgICBpZiBvc25hbWVbOjVdID09ICJsaW51eCI6CisgICAgICAgICMgQXQgbGVhc3Qgb24gTGludXgvSW50ZWwsICdtYWNoaW5lJyBpcyB0aGUgcHJvY2Vzc29yIC0tCisgICAgICAgICMgaTM4NiwgZXRjLgorICAgICAgICAjIFhYWCB3aGF0IGFib3V0IEFscGhhLCBTUEFSQywgZXRjPworICAgICAgICByZXR1cm4gICIlcy0lcyIgJSAob3NuYW1lLCBtYWNoaW5lKQorICAgIGVsaWYgb3NuYW1lWzo1XSA9PSAic3Vub3MiOgorICAgICAgICBpZiByZWxlYXNlWzBdID49ICI1IjogICAgICAgICAgICMgU3VuT1MgNSA9PSBTb2xhcmlzIDIKKyAgICAgICAgICAgIG9zbmFtZSA9ICJzb2xhcmlzIgorICAgICAgICAgICAgcmVsZWFzZSA9ICIlZC4lcyIgJSAoaW50KHJlbGVhc2VbMF0pIC0gMywgcmVsZWFzZVsyOl0pCisgICAgICAgICAgICAjIFdlIGNhbid0IHVzZSAicGxhdGZvcm0uYXJjaGl0ZWN0dXJlKClbMF0iIGJlY2F1c2UgYQorICAgICAgICAgICAgIyBib290c3RyYXAgcHJvYmxlbS4gV2UgdXNlIGEgZGljdCB0byBnZXQgYW4gZXJyb3IKKyAgICAgICAgICAgICMgaWYgc29tZSBzdXNwaWNpb3VzIGhhcHBlbnMuCisgICAgICAgICAgICBiaXRuZXNzID0gezIxNDc0ODM2NDc6IjMyYml0IiwgOTIyMzM3MjAzNjg1NDc3NTgwNzoiNjRiaXQifQorICAgICAgICAgICAgbWFjaGluZSArPSAiLiVzIiAlIGJpdG5lc3Nbc3lzLm1heGludF0KKyAgICAgICAgIyBmYWxsIHRocm91Z2ggdG8gc3RhbmRhcmQgb3NuYW1lLXJlbGVhc2UtbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgIGVsaWYgb3NuYW1lWzo0XSA9PSAiaXJpeCI6ICAgICAgICAgICAgICAjIGNvdWxkIGJlICJpcml4NjQiIQorICAgICAgICByZXR1cm4gIiVzLSVzIiAlIChvc25hbWUsIHJlbGVhc2UpCisgICAgZWxpZiBvc25hbWVbOjNdID09ICJhaXgiOgorICAgICAgICByZXR1cm4gIiVzLSVzLiVzIiAlIChvc25hbWUsIHZlcnNpb24sIHJlbGVhc2UpCisgICAgZWxpZiBvc25hbWVbOjZdID09ICJjeWd3aW4iOgorICAgICAgICBvc25hbWUgPSAiY3lnd2luIgorICAgICAgICByZWxfcmUgPSByZS5jb21waWxlIChyJ1tcZC5dKycpCisgICAgICAgIG0gPSByZWxfcmUubWF0Y2gocmVsZWFzZSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIHJlbGVhc2UgPSBtLmdyb3VwKCkKKyAgICBlbGlmIG9zbmFtZVs6Nl0gPT0gImRhcndpbiI6CisgICAgICAgIGltcG9ydCBfb3N4X3N1cHBvcnQsIGRpc3R1dGlscy5zeXNjb25maWcKKyAgICAgICAgb3NuYW1lLCByZWxlYXNlLCBtYWNoaW5lID0gX29zeF9zdXBwb3J0LmdldF9wbGF0Zm9ybV9vc3goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCisKKyAgICByZXR1cm4gIiVzLSVzLSVzIiAlIChvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCisKKyMgZ2V0X3BsYXRmb3JtICgpCisKKworZGVmIGNvbnZlcnRfcGF0aCAocGF0aG5hbWUpOgorICAgICIiIlJldHVybiAncGF0aG5hbWUnIGFzIGEgbmFtZSB0aGF0IHdpbGwgd29yayBvbiB0aGUgbmF0aXZlIGZpbGVzeXN0ZW0sCisgICAgaS5lLiBzcGxpdCBpdCBvbiAnLycgYW5kIHB1dCBpdCBiYWNrIHRvZ2V0aGVyIGFnYWluIHVzaW5nIHRoZSBjdXJyZW50CisgICAgZGlyZWN0b3J5IHNlcGFyYXRvci4gIE5lZWRlZCBiZWNhdXNlIGZpbGVuYW1lcyBpbiB0aGUgc2V0dXAgc2NyaXB0IGFyZQorICAgIGFsd2F5cyBzdXBwbGllZCBpbiBVbml4IHN0eWxlLCBhbmQgaGF2ZSB0byBiZSBjb252ZXJ0ZWQgdG8gdGhlIGxvY2FsCisgICAgY29udmVudGlvbiBiZWZvcmUgd2UgY2FuIGFjdHVhbGx5IHVzZSB0aGVtIGluIHRoZSBmaWxlc3lzdGVtLiAgUmFpc2VzCisgICAgVmFsdWVFcnJvciBvbiBub24tVW5peC1pc2ggc3lzdGVtcyBpZiAncGF0aG5hbWUnIGVpdGhlciBzdGFydHMgb3IKKyAgICBlbmRzIHdpdGggYSBzbGFzaC4KKyAgICAiIiIKKyAgICBpZiBvcy5zZXAgPT0gJy8nOgorICAgICAgICByZXR1cm4gcGF0aG5hbWUKKyAgICBpZiBub3QgcGF0aG5hbWU6CisgICAgICAgIHJldHVybiBwYXRobmFtZQorICAgIGlmIHBhdGhuYW1lWzBdID09ICcvJzoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInBhdGggJyVzJyBjYW5ub3QgYmUgYWJzb2x1dGUiICUgcGF0aG5hbWUKKyAgICBpZiBwYXRobmFtZVstMV0gPT0gJy8nOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAicGF0aCAnJXMnIGNhbm5vdCBlbmQgd2l0aCAnLyciICUgcGF0aG5hbWUKKworICAgIHBhdGhzID0gc3RyaW5nLnNwbGl0KHBhdGhuYW1lLCAnLycpCisgICAgd2hpbGUgJy4nIGluIHBhdGhzOgorICAgICAgICBwYXRocy5yZW1vdmUoJy4nKQorICAgIGlmIG5vdCBwYXRoczoKKyAgICAgICAgcmV0dXJuIG9zLmN1cmRpcgorICAgICMgT24gV2luZG93cywgaWYgcGF0aHMgaXMgWydDOicsJ2ZvbGRlcicsJ3N1YmZvbGRlciddIHRoZW4KKyAgICAjIG9zLnBhdGguam9pbigqcGF0aHMpIHdpbGwgcmV0dXJuICdDOmZvbGRlclxzdWJmb2xkZXInIHdoaWNoCisgICAgIyBpcyB0aHVzIHJlbGF0aXZlIHRvIHRoZSBDV0Qgb24gdGhhdCBkcml2ZS4gU28gd2Ugd29yayBhcm91bmQKKyAgICAjIHRoaXMgYnkgYWRkaW5nIGEgXCB0byBwYXRoWzBdCisgICAgaWYgKGxlbihwYXRocykgPiAwIGFuZCBwYXRoc1swXS5lbmRzd2l0aCgnOicpIGFuZAorICAgICAgICBzeXMucGxhdGZvcm0gPT0gIndpbjMyIiBhbmQgc3lzLnZlcnNpb24uZmluZCgiR0NDIikgPj0gMCk6CisgICAgICAgIHBhdGhzWzBdICs9ICdcXCcKKyAgICByZXR1cm4gb3MucGF0aC5qb2luKCpwYXRocykKKworIyBjb252ZXJ0X3BhdGggKCkKKworCitkZWYgY2hhbmdlX3Jvb3QgKG5ld19yb290LCBwYXRobmFtZSk6CisgICAgIiIiUmV0dXJuICdwYXRobmFtZScgd2l0aCAnbmV3X3Jvb3QnIHByZXBlbmRlZC4gIElmICdwYXRobmFtZScgaXMKKyAgICByZWxhdGl2ZSwgdGhpcyBpcyBlcXVpdmFsZW50IHRvICJvcy5wYXRoLmpvaW4obmV3X3Jvb3QscGF0aG5hbWUpIi4KKyAgICBPdGhlcndpc2UsIGl0IHJlcXVpcmVzIG1ha2luZyAncGF0aG5hbWUnIHJlbGF0aXZlIGFuZCB0aGVuIGpvaW5pbmcgdGhlCisgICAgdHdvLCB3aGljaCBpcyB0cmlja3kgb24gRE9TL1dpbmRvd3MgYW5kIE1hYyBPUy4KKyAgICAiIiIKKyAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHBhdGhuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4obmV3X3Jvb3QsIHBhdGhuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihuZXdfcm9vdCwgcGF0aG5hbWVbMTpdKQorCisgICAgZWxpZiBvcy5uYW1lID09ICdudCc6CisgICAgICAgIChkcml2ZSwgcGF0aCkgPSBvcy5wYXRoLnNwbGl0ZHJpdmUocGF0aG5hbWUpCisgICAgICAgIGlmIHBhdGhbMF0gPT0gJ1xcJzoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzE6XQorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKG5ld19yb290LCBwYXRoKQorCisgICAgZWxpZiBvcy5uYW1lID09ICdvczInOgorICAgICAgICAoZHJpdmUsIHBhdGgpID0gb3MucGF0aC5zcGxpdGRyaXZlKHBhdGhuYW1lKQorICAgICAgICBpZiBwYXRoWzBdID09IG9zLnNlcDoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzE6XQorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKG5ld19yb290LCBwYXRoKQorCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgXAorICAgICAgICAgICAgICAibm90aGluZyBrbm93biBhYm91dCBwbGF0Zm9ybSAnJXMnIiAlIG9zLm5hbWUKKworCitfZW52aXJvbl9jaGVja2VkID0gMAorZGVmIGNoZWNrX2Vudmlyb24gKCk6CisgICAgIiIiRW5zdXJlIHRoYXQgJ29zLmVudmlyb24nIGhhcyBhbGwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB3ZQorICAgIGd1YXJhbnRlZSB0aGF0IHVzZXJzIGNhbiB1c2UgaW4gY29uZmlnIGZpbGVzLCBjb21tYW5kLWxpbmUgb3B0aW9ucywKKyAgICBldGMuICBDdXJyZW50bHkgdGhpcyBpbmNsdWRlczoKKyAgICAgIEhPTUUgLSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkgKFVuaXggb25seSkKKyAgICAgIFBMQVQgLSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudCBwbGF0Zm9ybSwgaW5jbHVkaW5nIGhhcmR3YXJlCisgICAgICAgICAgICAgYW5kIE9TIChzZWUgJ2dldF9wbGF0Zm9ybSgpJykKKyAgICAiIiIKKyAgICBnbG9iYWwgX2Vudmlyb25fY2hlY2tlZAorICAgIGlmIF9lbnZpcm9uX2NoZWNrZWQ6CisgICAgICAgIHJldHVybgorCisgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnIGFuZCAnSE9NRScgbm90IGluIG9zLmVudmlyb246CisgICAgICAgIGltcG9ydCBwd2QKKyAgICAgICAgb3MuZW52aXJvblsnSE9NRSddID0gcHdkLmdldHB3dWlkKG9zLmdldHVpZCgpKVs1XQorCisgICAgaWYgJ1BMQVQnIG5vdCBpbiBvcy5lbnZpcm9uOgorICAgICAgICBvcy5lbnZpcm9uWydQTEFUJ10gPSBnZXRfcGxhdGZvcm0oKQorCisgICAgX2Vudmlyb25fY2hlY2tlZCA9IDEKKworCitkZWYgc3Vic3RfdmFycyAocywgbG9jYWxfdmFycyk6CisgICAgIiIiUGVyZm9ybSBzaGVsbC9QZXJsLXN0eWxlIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBvbiAnc3RyaW5nJy4gIEV2ZXJ5CisgICAgb2NjdXJyZW5jZSBvZiAnJCcgZm9sbG93ZWQgYnkgYSBuYW1lIGlzIGNvbnNpZGVyZWQgYSB2YXJpYWJsZSwgYW5kCisgICAgdmFyaWFibGUgaXMgc3Vic3RpdHV0ZWQgYnkgdGhlIHZhbHVlIGZvdW5kIGluIHRoZSAnbG9jYWxfdmFycycKKyAgICBkaWN0aW9uYXJ5LCBvciBpbiAnb3MuZW52aXJvbicgaWYgaXQncyBub3QgaW4gJ2xvY2FsX3ZhcnMnLgorICAgICdvcy5lbnZpcm9uJyBpcyBmaXJzdCBjaGVja2VkL2F1Z21lbnRlZCB0byBndWFyYW50ZWUgdGhhdCBpdCBjb250YWlucworICAgIGNlcnRhaW4gdmFsdWVzOiBzZWUgJ2NoZWNrX2Vudmlyb24oKScuICBSYWlzZSBWYWx1ZUVycm9yIGZvciBhbnkKKyAgICB2YXJpYWJsZXMgbm90IGZvdW5kIGluIGVpdGhlciAnbG9jYWxfdmFycycgb3IgJ29zLmVudmlyb24nLgorICAgICIiIgorICAgIGNoZWNrX2Vudmlyb24oKQorICAgIGRlZiBfc3Vic3QgKG1hdGNoLCBsb2NhbF92YXJzPWxvY2FsX3ZhcnMpOgorICAgICAgICB2YXJfbmFtZSA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgIGlmIHZhcl9uYW1lIGluIGxvY2FsX3ZhcnM6CisgICAgICAgICAgICByZXR1cm4gc3RyKGxvY2FsX3ZhcnNbdmFyX25hbWVdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG9zLmVudmlyb25bdmFyX25hbWVdCisKKyAgICB0cnk6CisgICAgICAgIHJldHVybiByZS5zdWIocidcJChbYS16QS1aX11bYS16QS1aXzAtOV0qKScsIF9zdWJzdCwgcykKKyAgICBleGNlcHQgS2V5RXJyb3IsIHZhcjoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImludmFsaWQgdmFyaWFibGUgJyQlcyciICUgdmFyCisKKyMgc3Vic3RfdmFycyAoKQorCisKK2RlZiBncm9rX2Vudmlyb25tZW50X2Vycm9yIChleGMsIHByZWZpeD0iZXJyb3I6ICIpOgorICAgICIiIkdlbmVyYXRlIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UgZnJvbSBhbiBFbnZpcm9ubWVudEVycm9yIChJT0Vycm9yIG9yCisgICAgT1NFcnJvcikgZXhjZXB0aW9uIG9iamVjdC4gIEhhbmRsZXMgUHl0aG9uIDEuNS4xIGFuZCAxLjUuMiBzdHlsZXMsIGFuZAorICAgIGRvZXMgd2hhdCBpdCBjYW4gdG8gZGVhbCB3aXRoIGV4Y2VwdGlvbiBvYmplY3RzIHRoYXQgZG9uJ3QgaGF2ZSBhCisgICAgZmlsZW5hbWUgKHdoaWNoIGhhcHBlbnMgd2hlbiB0aGUgZXJyb3IgaXMgZHVlIHRvIGEgdHdvLWZpbGUgb3BlcmF0aW9uLAorICAgIHN1Y2ggYXMgJ3JlbmFtZSgpJyBvciAnbGluaygpJy4gIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgYXMgYSBzdHJpbmcKKyAgICBwcmVmaXhlZCB3aXRoICdwcmVmaXgnLgorICAgICIiIgorICAgICMgY2hlY2sgZm9yIFB5dGhvbiAxLjUuMi1zdHlsZSB7SU8sT1N9RXJyb3IgZXhjZXB0aW9uIG9iamVjdHMKKyAgICBpZiBoYXNhdHRyKGV4YywgJ2ZpbGVuYW1lJykgYW5kIGhhc2F0dHIoZXhjLCAnc3RyZXJyb3InKToKKyAgICAgICAgaWYgZXhjLmZpbGVuYW1lOgorICAgICAgICAgICAgZXJyb3IgPSBwcmVmaXggKyAiJXM6ICVzIiAlIChleGMuZmlsZW5hbWUsIGV4Yy5zdHJlcnJvcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgdHdvLWFyZ3VtZW50IGZ1bmN0aW9ucyBpbiBwb3NpeCBtb2R1bGUgZG9uJ3QKKyAgICAgICAgICAgICMgaW5jbHVkZSB0aGUgZmlsZW5hbWUgaW4gdGhlIGV4Y2VwdGlvbiBvYmplY3QhCisgICAgICAgICAgICBlcnJvciA9IHByZWZpeCArICIlcyIgJSBleGMuc3RyZXJyb3IKKyAgICBlbHNlOgorICAgICAgICBlcnJvciA9IHByZWZpeCArIHN0cihleGNbLTFdKQorCisgICAgcmV0dXJuIGVycm9yCisKKworIyBOZWVkZWQgYnkgJ3NwbGl0X3F1b3RlZCgpJworX3dvcmRjaGFyc19yZSA9IF9zcXVvdGVfcmUgPSBfZHF1b3RlX3JlID0gTm9uZQorZGVmIF9pbml0X3JlZ2V4KCk6CisgICAgZ2xvYmFsIF93b3JkY2hhcnNfcmUsIF9zcXVvdGVfcmUsIF9kcXVvdGVfcmUKKyAgICBfd29yZGNoYXJzX3JlID0gcmUuY29tcGlsZShyJ1teXFxcJ1wiJXMgXSonICUgc3RyaW5nLndoaXRlc3BhY2UpCisgICAgX3NxdW90ZV9yZSA9IHJlLmNvbXBpbGUociInKD86W14nXFxdfFxcLikqJyIpCisgICAgX2RxdW90ZV9yZSA9IHJlLmNvbXBpbGUociciKD86W14iXFxdfFxcLikqIicpCisKK2RlZiBzcGxpdF9xdW90ZWQgKHMpOgorICAgICIiIlNwbGl0IGEgc3RyaW5nIHVwIGFjY29yZGluZyB0byBVbml4IHNoZWxsLWxpa2UgcnVsZXMgZm9yIHF1b3RlcyBhbmQKKyAgICBiYWNrc2xhc2hlcy4gIEluIHNob3J0OiB3b3JkcyBhcmUgZGVsaW1pdGVkIGJ5IHNwYWNlcywgYXMgbG9uZyBhcyB0aG9zZQorICAgIHNwYWNlcyBhcmUgbm90IGVzY2FwZWQgYnkgYSBiYWNrc2xhc2gsIG9yIGluc2lkZSBhIHF1b3RlZCBzdHJpbmcuCisgICAgU2luZ2xlIGFuZCBkb3VibGUgcXVvdGVzIGFyZSBlcXVpdmFsZW50LCBhbmQgdGhlIHF1b3RlIGNoYXJhY3RlcnMgY2FuCisgICAgYmUgYmFja3NsYXNoLWVzY2FwZWQuICBUaGUgYmFja3NsYXNoIGlzIHN0cmlwcGVkIGZyb20gYW55IHR3by1jaGFyYWN0ZXIKKyAgICBlc2NhcGUgc2VxdWVuY2UsIGxlYXZpbmcgb25seSB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuICBUaGUgcXVvdGUKKyAgICBjaGFyYWN0ZXJzIGFyZSBzdHJpcHBlZCBmcm9tIGFueSBxdW90ZWQgc3RyaW5nLiAgUmV0dXJucyBhIGxpc3Qgb2YKKyAgICB3b3Jkcy4KKyAgICAiIiIKKworICAgICMgVGhpcyBpcyBhIG5pY2UgYWxnb3JpdGhtIGZvciBzcGxpdHRpbmcgdXAgYSBzaW5nbGUgc3RyaW5nLCBzaW5jZSBpdAorICAgICMgZG9lc24ndCByZXF1aXJlIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIgZXhhbWluYXRpb24uICBJdCB3YXMgYSBsaXR0bGUKKyAgICAjIGJpdCBvZiBhIGJyYWluLWJlbmRlciB0byBnZXQgaXQgd29ya2luZyByaWdodCwgdGhvdWdoLi4uCisgICAgaWYgX3dvcmRjaGFyc19yZSBpcyBOb25lOiBfaW5pdF9yZWdleCgpCisKKyAgICBzID0gc3RyaW5nLnN0cmlwKHMpCisgICAgd29yZHMgPSBbXQorICAgIHBvcyA9IDAKKworICAgIHdoaWxlIHM6CisgICAgICAgIG0gPSBfd29yZGNoYXJzX3JlLm1hdGNoKHMsIHBvcykKKyAgICAgICAgZW5kID0gbS5lbmQoKQorICAgICAgICBpZiBlbmQgPT0gbGVuKHMpOgorICAgICAgICAgICAgd29yZHMuYXBwZW5kKHNbOmVuZF0pCisgICAgICAgICAgICBicmVhaworCisgICAgICAgIGlmIHNbZW5kXSBpbiBzdHJpbmcud2hpdGVzcGFjZTogIyB1bmVzY2FwZWQsIHVucXVvdGVkIHdoaXRlc3BhY2U6IG5vdworICAgICAgICAgICAgd29yZHMuYXBwZW5kKHNbOmVuZF0pICAgICAgICMgd2UgZGVmaW5pdGVseSBoYXZlIGEgd29yZCBkZWxpbWl0ZXIKKyAgICAgICAgICAgIHMgPSBzdHJpbmcubHN0cmlwKHNbZW5kOl0pCisgICAgICAgICAgICBwb3MgPSAwCisKKyAgICAgICAgZWxpZiBzW2VuZF0gPT0gJ1xcJzogICAgICAgICAgICAjIHByZXNlcnZlIHdoYXRldmVyIGlzIGJlaW5nIGVzY2FwZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aWxsIGJlY29tZSBwYXJ0IG9mIHRoZSBjdXJyZW50IHdvcmQKKyAgICAgICAgICAgIHMgPSBzWzplbmRdICsgc1tlbmQrMTpdCisgICAgICAgICAgICBwb3MgPSBlbmQrMQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzW2VuZF0gPT0gIiciOiAgICAgICAgICAgIyBzbHVycCBzaW5nbHktcXVvdGVkIHN0cmluZworICAgICAgICAgICAgICAgIG0gPSBfc3F1b3RlX3JlLm1hdGNoKHMsIGVuZCkKKyAgICAgICAgICAgIGVsaWYgc1tlbmRdID09ICciJzogICAgICAgICAjIHNsdXJwIGRvdWJseS1xdW90ZWQgc3RyaW5nCisgICAgICAgICAgICAgICAgbSA9IF9kcXVvdGVfcmUubWF0Y2gocywgZW5kKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAidGhpcyBjYW4ndCBoYXBwZW4gKGJhZCBjaGFyICclYycpIiAlIHNbZW5kXQorCisgICAgICAgICAgICBpZiBtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJiYWQgc3RyaW5nIChtaXNtYXRjaGVkICVzIHF1b3Rlcz8pIiAlIHNbZW5kXQorCisgICAgICAgICAgICAoYmVnLCBlbmQpID0gbS5zcGFuKCkKKyAgICAgICAgICAgIHMgPSBzWzpiZWddICsgc1tiZWcrMTplbmQtMV0gKyBzW2VuZDpdCisgICAgICAgICAgICBwb3MgPSBtLmVuZCgpIC0gMgorCisgICAgICAgIGlmIHBvcyA+PSBsZW4ocyk6CisgICAgICAgICAgICB3b3Jkcy5hcHBlbmQocykKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICByZXR1cm4gd29yZHMKKworIyBzcGxpdF9xdW90ZWQgKCkKKworCitkZWYgZXhlY3V0ZSAoZnVuYywgYXJncywgbXNnPU5vbmUsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wKToKKyAgICAiIiJQZXJmb3JtIHNvbWUgYWN0aW9uIHRoYXQgYWZmZWN0cyB0aGUgb3V0c2lkZSB3b3JsZCAoZWcuICBieQorICAgIHdyaXRpbmcgdG8gdGhlIGZpbGVzeXN0ZW0pLiAgU3VjaCBhY3Rpb25zIGFyZSBzcGVjaWFsIGJlY2F1c2UgdGhleQorICAgIGFyZSBkaXNhYmxlZCBieSB0aGUgJ2RyeV9ydW4nIGZsYWcuICBUaGlzIG1ldGhvZCB0YWtlcyBjYXJlIG9mIGFsbAorICAgIHRoYXQgYnVyZWF1Y3JhY3kgZm9yIHlvdTsgYWxsIHlvdSBoYXZlIHRvIGRvIGlzIHN1cHBseSB0aGUKKyAgICBmdW5jdGlvbiB0byBjYWxsIGFuZCBhbiBhcmd1bWVudCB0dXBsZSBmb3IgaXQgKHRvIGVtYm9keSB0aGUKKyAgICAiZXh0ZXJuYWwgYWN0aW9uIiBiZWluZyBwZXJmb3JtZWQpLCBhbmQgYW4gb3B0aW9uYWwgbWVzc2FnZSB0bworICAgIHByaW50LgorICAgICIiIgorICAgIGlmIG1zZyBpcyBOb25lOgorICAgICAgICBtc2cgPSAiJXMlciIgJSAoZnVuYy5fX25hbWVfXywgYXJncykKKyAgICAgICAgaWYgbXNnWy0yOl0gPT0gJywpJzogICAgICAgICMgY29ycmVjdCBmb3Igc2luZ2xldG9uIHR1cGxlCisgICAgICAgICAgICBtc2cgPSBtc2dbMDotMl0gKyAnKScKKworICAgIGxvZy5pbmZvKG1zZykKKyAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgZnVuYygqYXJncykKKworCitkZWYgc3RydG9ib29sICh2YWwpOgorICAgICIiIkNvbnZlcnQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdHJ1dGggdG8gdHJ1ZSAoMSkgb3IgZmFsc2UgKDApLgorCisgICAgVHJ1ZSB2YWx1ZXMgYXJlICd5JywgJ3llcycsICd0JywgJ3RydWUnLCAnb24nLCBhbmQgJzEnOyBmYWxzZSB2YWx1ZXMKKyAgICBhcmUgJ24nLCAnbm8nLCAnZicsICdmYWxzZScsICdvZmYnLCBhbmQgJzAnLiAgUmFpc2VzIFZhbHVlRXJyb3IgaWYKKyAgICAndmFsJyBpcyBhbnl0aGluZyBlbHNlLgorICAgICIiIgorICAgIHZhbCA9IHN0cmluZy5sb3dlcih2YWwpCisgICAgaWYgdmFsIGluICgneScsICd5ZXMnLCAndCcsICd0cnVlJywgJ29uJywgJzEnKToKKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbGlmIHZhbCBpbiAoJ24nLCAnbm8nLCAnZicsICdmYWxzZScsICdvZmYnLCAnMCcpOgorICAgICAgICByZXR1cm4gMAorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJpbnZhbGlkIHRydXRoIHZhbHVlICVyIiAlICh2YWwsKQorCisKK2RlZiBieXRlX2NvbXBpbGUgKHB5X2ZpbGVzLAorICAgICAgICAgICAgICAgICAgb3B0aW1pemU9MCwgZm9yY2U9MCwKKyAgICAgICAgICAgICAgICAgIHByZWZpeD1Ob25lLCBiYXNlX2Rpcj1Ob25lLAorICAgICAgICAgICAgICAgICAgdmVyYm9zZT0xLCBkcnlfcnVuPTAsCisgICAgICAgICAgICAgICAgICBkaXJlY3Q9Tm9uZSk6CisgICAgIiIiQnl0ZS1jb21waWxlIGEgY29sbGVjdGlvbiBvZiBQeXRob24gc291cmNlIGZpbGVzIHRvIGVpdGhlciAucHljCisgICAgb3IgLnB5byBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuICAncHlfZmlsZXMnIGlzIGEgbGlzdCBvZiBmaWxlcworICAgIHRvIGNvbXBpbGU7IGFueSBmaWxlcyB0aGF0IGRvbid0IGVuZCBpbiAiLnB5IiBhcmUgc2lsZW50bHkgc2tpcHBlZC4KKyAgICAnb3B0aW1pemUnIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgICAgICAwIC0gZG9uJ3Qgb3B0aW1pemUgKGdlbmVyYXRlIC5weWMpCisgICAgICAxIC0gbm9ybWFsIG9wdGltaXphdGlvbiAobGlrZSAicHl0aG9uIC1PIikKKyAgICAgIDIgLSBleHRyYSBvcHRpbWl6YXRpb24gKGxpa2UgInB5dGhvbiAtT08iKQorICAgIElmICdmb3JjZScgaXMgdHJ1ZSwgYWxsIGZpbGVzIGFyZSByZWNvbXBpbGVkIHJlZ2FyZGxlc3Mgb2YKKyAgICB0aW1lc3RhbXBzLgorCisgICAgVGhlIHNvdXJjZSBmaWxlbmFtZSBlbmNvZGVkIGluIGVhY2ggYnl0ZWNvZGUgZmlsZSBkZWZhdWx0cyB0byB0aGUKKyAgICBmaWxlbmFtZXMgbGlzdGVkIGluICdweV9maWxlcyc7IHlvdSBjYW4gbW9kaWZ5IHRoZXNlIHdpdGggJ3ByZWZpeCcgYW5kCisgICAgJ2Jhc2VkaXInLiAgJ3ByZWZpeCcgaXMgYSBzdHJpbmcgdGhhdCB3aWxsIGJlIHN0cmlwcGVkIG9mZiBvZiBlYWNoCisgICAgc291cmNlIGZpbGVuYW1lLCBhbmQgJ2Jhc2VfZGlyJyBpcyBhIGRpcmVjdG9yeSBuYW1lIHRoYXQgd2lsbCBiZQorICAgIHByZXBlbmRlZCAoYWZ0ZXIgJ3ByZWZpeCcgaXMgc3RyaXBwZWQpLiAgWW91IGNhbiBzdXBwbHkgZWl0aGVyIG9yIGJvdGgKKyAgICAob3IgbmVpdGhlcikgb2YgJ3ByZWZpeCcgYW5kICdiYXNlX2RpcicsIGFzIHlvdSB3aXNoLgorCisgICAgSWYgJ2RyeV9ydW4nIGlzIHRydWUsIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgdGhhdCB3b3VsZAorICAgIGFmZmVjdCB0aGUgZmlsZXN5c3RlbS4KKworICAgIEJ5dGUtY29tcGlsYXRpb24gaXMgZWl0aGVyIGRvbmUgZGlyZWN0bHkgaW4gdGhpcyBpbnRlcnByZXRlciBwcm9jZXNzCisgICAgd2l0aCB0aGUgc3RhbmRhcmQgcHlfY29tcGlsZSBtb2R1bGUsIG9yIGluZGlyZWN0bHkgYnkgd3JpdGluZyBhCisgICAgdGVtcG9yYXJ5IHNjcmlwdCBhbmQgZXhlY3V0aW5nIGl0LiAgTm9ybWFsbHksIHlvdSBzaG91bGQgbGV0CisgICAgJ2J5dGVfY29tcGlsZSgpJyBmaWd1cmUgb3V0IHRvIHVzZSBkaXJlY3QgY29tcGlsYXRpb24gb3Igbm90IChzZWUKKyAgICB0aGUgc291cmNlIGZvciBkZXRhaWxzKS4gIFRoZSAnZGlyZWN0JyBmbGFnIGlzIHVzZWQgYnkgdGhlIHNjcmlwdAorICAgIGdlbmVyYXRlZCBpbiBpbmRpcmVjdCBtb2RlOyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcsIGxlYXZlCisgICAgaXQgc2V0IHRvIE5vbmUuCisgICAgIiIiCisgICAgIyBub3RoaW5nIGlzIGRvbmUgaWYgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgaXMgVHJ1ZQorICAgIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNCeXRlQ29tcGlsZUVycm9yKCdieXRlLWNvbXBpbGluZyBpcyBkaXNhYmxlZC4nKQorCisgICAgIyBGaXJzdCwgaWYgdGhlIGNhbGxlciBkaWRuJ3QgZm9yY2UgdXMgaW50byBkaXJlY3Qgb3IgaW5kaXJlY3QgbW9kZSwKKyAgICAjIGZpZ3VyZSBvdXQgd2hpY2ggbW9kZSB3ZSBzaG91bGQgYmUgaW4uICBXZSB0YWtlIGEgY29uc2VydmF0aXZlCisgICAgIyBhcHByb2FjaDogY2hvb3NlIGRpcmVjdCBtb2RlICpvbmx5KiBpZiB0aGUgY3VycmVudCBpbnRlcnByZXRlciBpcworICAgICMgaW4gZGVidWcgbW9kZSBhbmQgb3B0aW1pemUgaXMgMC4gIElmIHdlJ3JlIG5vdCBpbiBkZWJ1ZyBtb2RlICgtTworICAgICMgb3IgLU9PKSwgd2UgZG9uJ3Qga25vdyB3aGljaCBsZXZlbCBvZiBvcHRpbWl6YXRpb24gdGhpcworICAgICMgaW50ZXJwcmV0ZXIgaXMgcnVubmluZyB3aXRoLCBzbyB3ZSBjYW4ndCBkbyBkaXJlY3QKKyAgICAjIGJ5dGUtY29tcGlsYXRpb24gYW5kIGJlIGNlcnRhaW4gdGhhdCBpdCdzIHRoZSByaWdodCB0aGluZy4gIFRodXMsCisgICAgIyBhbHdheXMgY29tcGlsZSBpbmRpcmVjdGx5IGlmIHRoZSBjdXJyZW50IGludGVycHJldGVyIGlzIGluIGVpdGhlcgorICAgICMgb3B0aW1pemUgbW9kZSwgb3IgaWYgZWl0aGVyIG9wdGltaXphdGlvbiBsZXZlbCB3YXMgcmVxdWVzdGVkIGJ5CisgICAgIyB0aGUgY2FsbGVyLgorICAgIGlmIGRpcmVjdCBpcyBOb25lOgorICAgICAgICBkaXJlY3QgPSAoX19kZWJ1Z19fIGFuZCBvcHRpbWl6ZSA9PSAwKQorCisgICAgIyAiSW5kaXJlY3QiIGJ5dGUtY29tcGlsYXRpb246IHdyaXRlIGEgdGVtcG9yYXJ5IHNjcmlwdCBhbmQgdGhlbgorICAgICMgcnVuIGl0IHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWdzLgorICAgIGlmIG5vdCBkaXJlY3Q6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdGVtcGZpbGUgaW1wb3J0IG1rc3RlbXAKKyAgICAgICAgICAgIChzY3JpcHRfZmQsIHNjcmlwdF9uYW1lKSA9IG1rc3RlbXAoIi5weSIpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGZyb20gdGVtcGZpbGUgaW1wb3J0IG1rdGVtcAorICAgICAgICAgICAgKHNjcmlwdF9mZCwgc2NyaXB0X25hbWUpID0gTm9uZSwgbWt0ZW1wKCIucHkiKQorICAgICAgICBsb2cuaW5mbygid3JpdGluZyBieXRlLWNvbXBpbGF0aW9uIHNjcmlwdCAnJXMnIiwgc2NyaXB0X25hbWUpCisgICAgICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAgICAgaWYgc2NyaXB0X2ZkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNjcmlwdCA9IG9zLmZkb3BlbihzY3JpcHRfZmQsICJ3IikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2NyaXB0ID0gb3BlbihzY3JpcHRfbmFtZSwgInciKQorCisgICAgICAgICAgICBzY3JpcHQud3JpdGUoIiIiXAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCitmaWxlcyA9IFsKKyIiIikKKworICAgICAgICAgICAgIyBYWFggd291bGQgYmUgbmljZSB0byB3cml0ZSBhYnNvbHV0ZSBmaWxlbmFtZXMsIGp1c3QgZm9yCisgICAgICAgICAgICAjIHNhZmV0eSdzIHNha2UgKHNjcmlwdCBzaG91bGQgYmUgbW9yZSByb2J1c3QgaW4gdGhlIGZhY2Ugb2YKKyAgICAgICAgICAgICMgY2hkaXInaW5nIGJlZm9yZSBydW5uaW5nIGl0KS4gIEJ1dCB0aGlzIHJlcXVpcmVzIGFic3BhdGgnaW5nCisgICAgICAgICAgICAjICdwcmVmaXgnIGFzIHdlbGwsIGFuZCB0aGF0IGJyZWFrcyB0aGUgaGFjayBpbiBidWlsZF9saWIncworICAgICAgICAgICAgIyAnYnl0ZV9jb21waWxlKCknIG1ldGhvZCB0aGF0IGNhcmVmdWxseSB0YWNrcyBvbiBhIHRyYWlsaW5nCisgICAgICAgICAgICAjIHNsYXNoIChvcy5zZXAgcmVhbGx5KSB0byBtYWtlIHN1cmUgdGhlIHByZWZpeCBoZXJlIGlzICJqdXN0CisgICAgICAgICAgICAjIHJpZ2h0Ii4gIFRoaXMgd2hvbGUgcHJlZml4IGJ1c2luZXNzIGlzIHJhdGhlciBkZWxpY2F0ZSAtLSB0aGUKKyAgICAgICAgICAgICMgcHJvYmxlbSBpcyB0aGF0IGl0J3MgcmVhbGx5IGEgZGlyZWN0b3J5LCBidXQgSSdtIHRyZWF0aW5nIGl0CisgICAgICAgICAgICAjIGFzIGEgZHVtYiBzdHJpbmcsIHNvIHRyYWlsaW5nIHNsYXNoZXMgYW5kIHNvIGZvcnRoIG1hdHRlci4KKworICAgICAgICAgICAgI3B5X2ZpbGVzID0gbWFwKG9zLnBhdGguYWJzcGF0aCwgcHlfZmlsZXMpCisgICAgICAgICAgICAjaWYgcHJlZml4OgorICAgICAgICAgICAgIyAgICBwcmVmaXggPSBvcy5wYXRoLmFic3BhdGgocHJlZml4KQorCisgICAgICAgICAgICBzY3JpcHQud3JpdGUoc3RyaW5nLmpvaW4obWFwKHJlcHIsIHB5X2ZpbGVzKSwgIixcbiIpICsgIl1cbiIpCisgICAgICAgICAgICBzY3JpcHQud3JpdGUoIiIiCitieXRlX2NvbXBpbGUoZmlsZXMsIG9wdGltaXplPSVyLCBmb3JjZT0lciwKKyAgICAgICAgICAgICBwcmVmaXg9JXIsIGJhc2VfZGlyPSVyLAorICAgICAgICAgICAgIHZlcmJvc2U9JXIsIGRyeV9ydW49MCwKKyAgICAgICAgICAgICBkaXJlY3Q9MSkKKyIiIiAlIChvcHRpbWl6ZSwgZm9yY2UsIHByZWZpeCwgYmFzZV9kaXIsIHZlcmJvc2UpKQorCisgICAgICAgICAgICBzY3JpcHQuY2xvc2UoKQorCisgICAgICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgc2NyaXB0X25hbWVdCisgICAgICAgIGlmIG9wdGltaXplID09IDE6CisgICAgICAgICAgICBjbWQuaW5zZXJ0KDEsICItTyIpCisgICAgICAgIGVsaWYgb3B0aW1pemUgPT0gMjoKKyAgICAgICAgICAgIGNtZC5pbnNlcnQoMSwgIi1PTyIpCisgICAgICAgIHNwYXduKGNtZCwgZHJ5X3J1bj1kcnlfcnVuKQorICAgICAgICBleGVjdXRlKG9zLnJlbW92ZSwgKHNjcmlwdF9uYW1lLCksICJyZW1vdmluZyAlcyIgJSBzY3JpcHRfbmFtZSwKKyAgICAgICAgICAgICAgICBkcnlfcnVuPWRyeV9ydW4pCisKKyAgICAjICJEaXJlY3QiIGJ5dGUtY29tcGlsYXRpb246IHVzZSB0aGUgcHlfY29tcGlsZSBtb2R1bGUgdG8gY29tcGlsZQorICAgICMgcmlnaHQgaGVyZSwgcmlnaHQgbm93LiAgTm90ZSB0aGF0IHRoZSBzY3JpcHQgZ2VuZXJhdGVkIGluIGluZGlyZWN0CisgICAgIyBtb2RlIHNpbXBseSBjYWxscyAnYnl0ZV9jb21waWxlKCknIGluIGRpcmVjdCBtb2RlLCBhIHdlaXJkIHNvcnQgb2YKKyAgICAjIGNyb3NzLXByb2Nlc3MgcmVjdXJzaW9uLiAgSGV5LCBpdCB3b3JrcyEKKyAgICBlbHNlOgorICAgICAgICBmcm9tIHB5X2NvbXBpbGUgaW1wb3J0IGNvbXBpbGUKKworICAgICAgICBmb3IgZmlsZSBpbiBweV9maWxlczoKKyAgICAgICAgICAgIGlmIGZpbGVbLTM6XSAhPSAiLnB5IjoKKyAgICAgICAgICAgICAgICAjIFRoaXMgbGV0cyB1cyBiZSBsYXp5IGFuZCBub3QgZmlsdGVyIGZpbGVuYW1lcyBpbgorICAgICAgICAgICAgICAgICMgdGhlICJpbnN0YWxsX2xpYiIgY29tbWFuZC4KKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIFRlcm1pbm9sb2d5IGZyb20gdGhlIHB5X2NvbXBpbGUgbW9kdWxlOgorICAgICAgICAgICAgIyAgIGNmaWxlIC0gYnl0ZS1jb21waWxlZCBmaWxlCisgICAgICAgICAgICAjICAgZGZpbGUgLSBwdXJwb3J0ZWQgc291cmNlIGZpbGVuYW1lIChzYW1lIGFzICdmaWxlJyBieSBkZWZhdWx0KQorICAgICAgICAgICAgY2ZpbGUgPSBmaWxlICsgKF9fZGVidWdfXyBhbmQgImMiIG9yICJvIikKKyAgICAgICAgICAgIGRmaWxlID0gZmlsZQorICAgICAgICAgICAgaWYgcHJlZml4OgorICAgICAgICAgICAgICAgIGlmIGZpbGVbOmxlbihwcmVmaXgpXSAhPSBwcmVmaXg6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCJpbnZhbGlkIHByZWZpeDogZmlsZW5hbWUgJXIgZG9lc24ndCBzdGFydCB3aXRoICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZmlsZSwgcHJlZml4KSkKKyAgICAgICAgICAgICAgICBkZmlsZSA9IGRmaWxlW2xlbihwcmVmaXgpOl0KKyAgICAgICAgICAgIGlmIGJhc2VfZGlyOgorICAgICAgICAgICAgICAgIGRmaWxlID0gb3MucGF0aC5qb2luKGJhc2VfZGlyLCBkZmlsZSkKKworICAgICAgICAgICAgY2ZpbGVfYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUoY2ZpbGUpCisgICAgICAgICAgICBpZiBkaXJlY3Q6CisgICAgICAgICAgICAgICAgaWYgZm9yY2Ugb3IgbmV3ZXIoZmlsZSwgY2ZpbGUpOgorICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiYnl0ZS1jb21waWxpbmcgJXMgdG8gJXMiLCBmaWxlLCBjZmlsZV9iYXNlKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUoZmlsZSwgY2ZpbGUsIGRmaWxlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygic2tpcHBpbmcgYnl0ZS1jb21waWxhdGlvbiBvZiAlcyB0byAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBjZmlsZV9iYXNlKQorCisjIGJ5dGVfY29tcGlsZSAoKQorCitkZWYgcmZjODIyX2VzY2FwZSAoaGVhZGVyKToKKyAgICAiIiJSZXR1cm4gYSB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgZXNjYXBlZCBmb3IgaW5jbHVzaW9uIGluIGFuCisgICAgUkZDLTgyMiBoZWFkZXIsIGJ5IGVuc3VyaW5nIHRoZXJlIGFyZSA4IHNwYWNlcyBzcGFjZSBhZnRlciBlYWNoIG5ld2xpbmUuCisgICAgIiIiCisgICAgbGluZXMgPSBzdHJpbmcuc3BsaXQoaGVhZGVyLCAnXG4nKQorICAgIGhlYWRlciA9IHN0cmluZy5qb2luKGxpbmVzLCAnXG4nICsgOConICcpCisgICAgcmV0dXJuIGhlYWRlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdXRpbC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDc5M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdXRpbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdXRpbC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDc5M2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdXRpbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbi5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3ZlcnNpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiNWI2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3ZlcnNpb24ucHkKQEAgLTAsMCArMSwyOTkgQEAKKyMKKyMgZGlzdHV0aWxzL3ZlcnNpb24ucHkKKyMKKyMgSW1wbGVtZW50cyBtdWx0aXBsZSB2ZXJzaW9uIG51bWJlcmluZyBjb252ZW50aW9ucyBmb3IgdGhlCisjIFB5dGhvbiBNb2R1bGUgRGlzdHJpYnV0aW9uIFV0aWxpdGllcy4KKyMKKyMgJElkJAorIworCisiIiJQcm92aWRlcyBjbGFzc2VzIHRvIHJlcHJlc2VudCBtb2R1bGUgdmVyc2lvbiBudW1iZXJzIChvbmUgY2xhc3MgZm9yCitlYWNoIHN0eWxlIG9mIHZlcnNpb24gbnVtYmVyaW5nKS4gIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIHN1Y2ggY2xhc3NlcworaW1wbGVtZW50ZWQ6IFN0cmljdFZlcnNpb24gYW5kIExvb3NlVmVyc2lvbi4KKworRXZlcnkgdmVyc2lvbiBudW1iZXIgY2xhc3MgaW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIGludGVyZmFjZToKKyAgKiB0aGUgJ3BhcnNlJyBtZXRob2QgdGFrZXMgYSBzdHJpbmcgYW5kIHBhcnNlcyBpdCB0byBzb21lIGludGVybmFsCisgICAgcmVwcmVzZW50YXRpb247IGlmIHRoZSBzdHJpbmcgaXMgYW4gaW52YWxpZCB2ZXJzaW9uIG51bWJlciwKKyAgICAncGFyc2UnIHJhaXNlcyBhIFZhbHVlRXJyb3IgZXhjZXB0aW9uCisgICogdGhlIGNsYXNzIGNvbnN0cnVjdG9yIHRha2VzIGFuIG9wdGlvbmFsIHN0cmluZyBhcmd1bWVudCB3aGljaCwKKyAgICBpZiBzdXBwbGllZCwgaXMgcGFzc2VkIHRvICdwYXJzZScKKyAgKiBfX3N0cl9fIHJlY29uc3RydWN0cyB0aGUgc3RyaW5nIHRoYXQgd2FzIHBhc3NlZCB0byAncGFyc2UnIChvcgorICAgIGFuIGVxdWl2YWxlbnQgc3RyaW5nIC0tIGllLiBvbmUgdGhhdCB3aWxsIGdlbmVyYXRlIGFuIGVxdWl2YWxlbnQKKyAgICB2ZXJzaW9uIG51bWJlciBpbnN0YW5jZSkKKyAgKiBfX3JlcHJfXyBnZW5lcmF0ZXMgUHl0aG9uIGNvZGUgdG8gcmVjcmVhdGUgdGhlIHZlcnNpb24gbnVtYmVyIGluc3RhbmNlCisgICogX19jbXBfXyBjb21wYXJlcyB0aGUgY3VycmVudCBpbnN0YW5jZSB3aXRoIGVpdGhlciBhbm90aGVyIGluc3RhbmNlCisgICAgb2YgdGhlIHNhbWUgY2xhc3Mgb3IgYSBzdHJpbmcgKHdoaWNoIHdpbGwgYmUgcGFyc2VkIHRvIGFuIGluc3RhbmNlCisgICAgb2YgdGhlIHNhbWUgY2xhc3MsIHRodXMgbXVzdCBmb2xsb3cgdGhlIHNhbWUgcnVsZXMpCisiIiIKKworaW1wb3J0IHN0cmluZywgcmUKK2Zyb20gdHlwZXMgaW1wb3J0IFN0cmluZ1R5cGUKKworY2xhc3MgVmVyc2lvbjoKKyAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciB2ZXJzaW9uIG51bWJlcmluZyBjbGFzc2VzLiAgSnVzdCBwcm92aWRlcworICAgIGNvbnN0cnVjdG9yIChfX2luaXRfXykgYW5kIHJlcHJvZHVjZXIgKF9fcmVwcl9fKSwgYmVjYXVzZSB0aG9zZQorICAgIHNlZW0gdG8gYmUgdGhlIHNhbWUgZm9yIGFsbCB2ZXJzaW9uIG51bWJlcmluZyBjbGFzc2VzLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB2c3RyaW5nPU5vbmUpOgorICAgICAgICBpZiB2c3RyaW5nOgorICAgICAgICAgICAgc2VsZi5wYXJzZSh2c3RyaW5nKQorCisgICAgZGVmIF9fcmVwcl9fIChzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyAoJyVzJykiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZikpCisKKworIyBJbnRlcmZhY2UgZm9yIHZlcnNpb24tbnVtYmVyIGNsYXNzZXMgLS0gbXVzdCBiZSBpbXBsZW1lbnRlZAorIyBieSB0aGUgZm9sbG93aW5nIGNsYXNzZXMgKHRoZSBjb25jcmV0ZSBvbmVzIC0tIFZlcnNpb24gc2hvdWxkCisjIGJlIHRyZWF0ZWQgYXMgYW4gYWJzdHJhY3QgY2xhc3MpLgorIyAgICBfX2luaXRfXyAoc3RyaW5nKSAtIGNyZWF0ZSBhbmQgdGFrZSBzYW1lIGFjdGlvbiBhcyAncGFyc2UnCisjICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwpCisjICAgIHBhcnNlIChzdHJpbmcpICAgIC0gY29udmVydCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB0byB3aGF0ZXZlcgorIyAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGlzIGFwcHJvcHJpYXRlIGZvcgorIyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc3R5bGUgb2YgdmVyc2lvbiBudW1iZXJpbmcKKyMgICAgX19zdHJfXyAoc2VsZikgICAgLSBjb252ZXJ0IGJhY2sgdG8gYSBzdHJpbmc7IHNob3VsZCBiZSB2ZXJ5IHNpbWlsYXIKKyMgICAgICAgICAgICAgICAgICAgICAgICAoaWYgbm90IGlkZW50aWNhbCB0bykgdGhlIHN0cmluZyBzdXBwbGllZCB0byBwYXJzZQorIyAgICBfX3JlcHJfXyAoc2VsZikgICAtIGdlbmVyYXRlIFB5dGhvbiBjb2RlIHRvIHJlY3JlYXRlCisjICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGluc3RhbmNlCisjICAgIF9fY21wX18gKHNlbGYsIG90aGVyKSAtIGNvbXBhcmUgdHdvIHZlcnNpb24gbnVtYmVycyAoJ290aGVyJyBtYXkKKyMgICAgICAgICAgICAgICAgICAgICAgICBiZSBhbiB1bnBhcnNlZCB2ZXJzaW9uIHN0cmluZywgb3IgYW5vdGhlcgorIyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIG9mIHlvdXIgdmVyc2lvbiBjbGFzcykKKworCitjbGFzcyBTdHJpY3RWZXJzaW9uIChWZXJzaW9uKToKKworICAgICIiIlZlcnNpb24gbnVtYmVyaW5nIGZvciBhbmFsIHJldGVudGl2ZXMgYW5kIHNvZnR3YXJlIGlkZWFsaXN0cy4KKyAgICBJbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBpbnRlcmZhY2UgZm9yIHZlcnNpb24gbnVtYmVyIGNsYXNzZXMgYXMKKyAgICBkZXNjcmliZWQgYWJvdmUuICBBIHZlcnNpb24gbnVtYmVyIGNvbnNpc3RzIG9mIHR3byBvciB0aHJlZQorICAgIGRvdC1zZXBhcmF0ZWQgbnVtZXJpYyBjb21wb25lbnRzLCB3aXRoIGFuIG9wdGlvbmFsICJwcmUtcmVsZWFzZSIgdGFnCisgICAgb24gdGhlIGVuZC4gIFRoZSBwcmUtcmVsZWFzZSB0YWcgY29uc2lzdHMgb2YgdGhlIGxldHRlciAnYScgb3IgJ2InCisgICAgZm9sbG93ZWQgYnkgYSBudW1iZXIuICBJZiB0aGUgbnVtZXJpYyBjb21wb25lbnRzIG9mIHR3byB2ZXJzaW9uCisgICAgbnVtYmVycyBhcmUgZXF1YWwsIHRoZW4gb25lIHdpdGggYSBwcmUtcmVsZWFzZSB0YWcgd2lsbCBhbHdheXMKKyAgICBiZSBkZWVtZWQgZWFybGllciAobGVzc2VyKSB0aGFuIG9uZSB3aXRob3V0LgorCisgICAgVGhlIGZvbGxvd2luZyBhcmUgdmFsaWQgdmVyc2lvbiBudW1iZXJzIChzaG93biBpbiB0aGUgb3JkZXIgdGhhdAorICAgIHdvdWxkIGJlIG9idGFpbmVkIGJ5IHNvcnRpbmcgYWNjb3JkaW5nIHRvIHRoZSBzdXBwbGllZCBjbXAgZnVuY3Rpb24pOgorCisgICAgICAgIDAuNCAgICAgICAwLjQuMCAgKHRoZXNlIHR3byBhcmUgZXF1aXZhbGVudCkKKyAgICAgICAgMC40LjEKKyAgICAgICAgMC41YTEKKyAgICAgICAgMC41YjMKKyAgICAgICAgMC41CisgICAgICAgIDAuOS42CisgICAgICAgIDEuMAorICAgICAgICAxLjAuNGEzCisgICAgICAgIDEuMC40YjEKKyAgICAgICAgMS4wLjQKKworICAgIFRoZSBmb2xsb3dpbmcgYXJlIGV4YW1wbGVzIG9mIGludmFsaWQgdmVyc2lvbiBudW1iZXJzOgorCisgICAgICAgIDEKKyAgICAgICAgMi43LjIuMgorICAgICAgICAxLjMuYTQKKyAgICAgICAgMS4zcGwxCisgICAgICAgIDEuM2M0CisKKyAgICBUaGUgcmF0aW9uYWxlIGZvciB0aGlzIHZlcnNpb24gbnVtYmVyaW5nIHN5c3RlbSB3aWxsIGJlIGV4cGxhaW5lZAorICAgIGluIHRoZSBkaXN0dXRpbHMgZG9jdW1lbnRhdGlvbi4KKyAgICAiIiIKKworICAgIHZlcnNpb25fcmUgPSByZS5jb21waWxlKHInXihcZCspIFwuIChcZCspIChcLiAoXGQrKSk/IChbYWJdKFxkKykpPyQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLlZFUkJPU0UpCisKKworICAgIGRlZiBwYXJzZSAoc2VsZiwgdnN0cmluZyk6CisgICAgICAgIG1hdGNoID0gc2VsZi52ZXJzaW9uX3JlLm1hdGNoKHZzdHJpbmcpCisgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJpbnZhbGlkIHZlcnNpb24gbnVtYmVyICclcyciICUgdnN0cmluZworCisgICAgICAgIChtYWpvciwgbWlub3IsIHBhdGNoLCBwcmVyZWxlYXNlLCBwcmVyZWxlYXNlX251bSkgPSBcCisgICAgICAgICAgICBtYXRjaC5ncm91cCgxLCAyLCA0LCA1LCA2KQorCisgICAgICAgIGlmIHBhdGNoOgorICAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gdHVwbGUobWFwKHN0cmluZy5hdG9pLCBbbWFqb3IsIG1pbm9yLCBwYXRjaF0pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gdHVwbGUobWFwKHN0cmluZy5hdG9pLCBbbWFqb3IsIG1pbm9yXSkgKyBbMF0pCisKKyAgICAgICAgaWYgcHJlcmVsZWFzZToKKyAgICAgICAgICAgIHNlbGYucHJlcmVsZWFzZSA9IChwcmVyZWxlYXNlWzBdLCBzdHJpbmcuYXRvaShwcmVyZWxlYXNlX251bSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnByZXJlbGVhc2UgPSBOb25lCisKKworICAgIGRlZiBfX3N0cl9fIChzZWxmKToKKworICAgICAgICBpZiBzZWxmLnZlcnNpb25bMl0gPT0gMDoKKyAgICAgICAgICAgIHZzdHJpbmcgPSBzdHJpbmcuam9pbihtYXAoc3RyLCBzZWxmLnZlcnNpb25bMDoyXSksICcuJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZzdHJpbmcgPSBzdHJpbmcuam9pbihtYXAoc3RyLCBzZWxmLnZlcnNpb24pLCAnLicpCisKKyAgICAgICAgaWYgc2VsZi5wcmVyZWxlYXNlOgorICAgICAgICAgICAgdnN0cmluZyA9IHZzdHJpbmcgKyBzZWxmLnByZXJlbGVhc2VbMF0gKyBzdHIoc2VsZi5wcmVyZWxlYXNlWzFdKQorCisgICAgICAgIHJldHVybiB2c3RyaW5nCisKKworICAgIGRlZiBfX2NtcF9fIChzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFN0cmluZ1R5cGUpOgorICAgICAgICAgICAgb3RoZXIgPSBTdHJpY3RWZXJzaW9uKG90aGVyKQorCisgICAgICAgIGNvbXBhcmUgPSBjbXAoc2VsZi52ZXJzaW9uLCBvdGhlci52ZXJzaW9uKQorICAgICAgICBpZiAoY29tcGFyZSA9PSAwKTogICAgICAgICAgICAgICMgaGF2ZSB0byBjb21wYXJlIHByZXJlbGVhc2UKKworICAgICAgICAgICAgIyBjYXNlIDE6IG5laXRoZXIgaGFzIHByZXJlbGVhc2U7IHRoZXkncmUgZXF1YWwKKyAgICAgICAgICAgICMgY2FzZSAyOiBzZWxmIGhhcyBwcmVyZWxlYXNlLCBvdGhlciBkb2Vzbid0OyBvdGhlciBpcyBncmVhdGVyCisgICAgICAgICAgICAjIGNhc2UgMzogc2VsZiBkb2Vzbid0IGhhdmUgcHJlcmVsZWFzZSwgb3RoZXIgZG9lczogc2VsZiBpcyBncmVhdGVyCisgICAgICAgICAgICAjIGNhc2UgNDogYm90aCBoYXZlIHByZXJlbGVhc2U6IG11c3QgY29tcGFyZSB0aGVtIQorCisgICAgICAgICAgICBpZiAobm90IHNlbGYucHJlcmVsZWFzZSBhbmQgbm90IG90aGVyLnByZXJlbGVhc2UpOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbGlmIChzZWxmLnByZXJlbGVhc2UgYW5kIG5vdCBvdGhlci5wcmVyZWxlYXNlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGVsaWYgKG5vdCBzZWxmLnByZXJlbGVhc2UgYW5kIG90aGVyLnByZXJlbGVhc2UpOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICBlbGlmIChzZWxmLnByZXJlbGVhc2UgYW5kIG90aGVyLnByZXJlbGVhc2UpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5wcmVyZWxlYXNlLCBvdGhlci5wcmVyZWxlYXNlKQorCisgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBudW1lcmljIHZlcnNpb25zIGRvbid0IG1hdGNoIC0tCisgICAgICAgICAgICByZXR1cm4gY29tcGFyZSAgICAgICAgICAgICAgIyBwcmVyZWxlYXNlIHN0dWZmIGRvZXNuJ3QgbWF0dGVyCisKKworIyBlbmQgY2xhc3MgU3RyaWN0VmVyc2lvbgorCisKKyMgVGhlIHJ1bGVzIGFjY29yZGluZyB0byBHcmVnIFN0ZWluOgorIyAxKSBhIHZlcnNpb24gbnVtYmVyIGhhcyAxIG9yIG1vcmUgbnVtYmVycyBzZXBhcmF0ZWQgYnkgYSBwZXJpb2Qgb3IgYnkKKyMgICAgc2VxdWVuY2VzIG9mIGxldHRlcnMuIElmIG9ubHkgcGVyaW9kcywgdGhlbiB0aGVzZSBhcmUgY29tcGFyZWQKKyMgICAgbGVmdC10by1yaWdodCB0byBkZXRlcm1pbmUgYW4gb3JkZXJpbmcuCisjIDIpIHNlcXVlbmNlcyBvZiBsZXR0ZXJzIGFyZSBwYXJ0IG9mIHRoZSB0dXBsZSBmb3IgY29tcGFyaXNvbiBhbmQgYXJlCisjICAgIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5CisjIDMpIHJlY29nbml6ZSB0aGUgbnVtZXJpYyBjb21wb25lbnRzIG1heSBoYXZlIGxlYWRpbmcgemVyb2VzCisjCisjIFRoZSBMb29zZVZlcnNpb24gY2xhc3MgYmVsb3cgaW1wbGVtZW50cyB0aGVzZSBydWxlczogYSB2ZXJzaW9uIG51bWJlcgorIyBzdHJpbmcgaXMgc3BsaXQgdXAgaW50byBhIHR1cGxlIG9mIGludGVnZXIgYW5kIHN0cmluZyBjb21wb25lbnRzLCBhbmQKKyMgY29tcGFyaXNvbiBpcyBhIHNpbXBsZSB0dXBsZSBjb21wYXJpc29uLiAgVGhpcyBtZWFucyB0aGF0IHZlcnNpb24KKyMgbnVtYmVycyBiZWhhdmUgaW4gYSBwcmVkaWN0YWJsZSBhbmQgb2J2aW91cyB3YXksIGJ1dCBhIHdheSB0aGF0IG1pZ2h0CisjIG5vdCBuZWNlc3NhcmlseSBiZSBob3cgcGVvcGxlICp3YW50KiB2ZXJzaW9uIG51bWJlcnMgdG8gYmVoYXZlLiAgVGhlcmUKKyMgd291bGRuJ3QgYmUgYSBwcm9ibGVtIGlmIHBlb3BsZSBjb3VsZCBzdGljayB0byBwdXJlbHkgbnVtZXJpYyB2ZXJzaW9uCisjIG51bWJlcnM6IGp1c3Qgc3BsaXQgb24gcGVyaW9kIGFuZCBjb21wYXJlIHRoZSBudW1iZXJzIGFzIHR1cGxlcy4KKyMgSG93ZXZlciwgcGVvcGxlIGluc2lzdCBvbiBwdXR0aW5nIGxldHRlcnMgaW50byB0aGVpciB2ZXJzaW9uIG51bWJlcnM7CisjIHRoZSBtb3N0IGNvbW1vbiBwdXJwb3NlIHNlZW1zIHRvIGJlOgorIyAgIC0gaW5kaWNhdGluZyBhICJwcmUtcmVsZWFzZSIgdmVyc2lvbgorIyAgICAgKCdhbHBoYScsICdiZXRhJywgJ2EnLCAnYicsICdwcmUnLCAncCcpCisjICAgLSBpbmRpY2F0aW5nIGEgcG9zdC1yZWxlYXNlIHBhdGNoICgncCcsICdwbCcsICdwYXRjaCcpCisjIGJ1dCBvZiBjb3Vyc2UgdGhpcyBjYW4ndCBjb3ZlciBhbGwgdmVyc2lvbiBudW1iZXIgc2NoZW1lcywgYW5kIHRoZXJlJ3MKKyMgbm8gd2F5IHRvIGtub3cgd2hhdCBhIHByb2dyYW1tZXIgbWVhbnMgd2l0aG91dCBhc2tpbmcgaGltLgorIworIyBUaGUgcHJvYmxlbSBpcyB3aGF0IHRvIGRvIHdpdGggbGV0dGVycyAoYW5kIG90aGVyIG5vbi1udW1lcmljCisjIGNoYXJhY3RlcnMpIGluIGEgdmVyc2lvbiBudW1iZXIuICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2VzIHRoZQorIyBvYnZpb3VzIGFuZCBwcmVkaWN0YWJsZSB0aGluZzoga2VlcCB0aGVtIGFzIHN0cmluZ3MgYW5kIGNvbXBhcmUKKyMgbGV4aWNhbGx5IHdpdGhpbiBhIHR1cGxlIGNvbXBhcmlzb24uICBUaGlzIGhhcyB0aGUgZGVzaXJlZCBlZmZlY3QgaWYKKyMgYW4gYXBwZW5kZWQgbGV0dGVyIHNlcXVlbmNlIGltcGxpZXMgc29tZXRoaW5nICJwb3N0LXJlbGVhc2UiOgorIyBlZy4gIjAuOTkiIDwgIjAuOTlwbDE0IiA8ICIxLjAiLCBhbmQgIjUuMDAxIiA8ICI1LjAwMW0iIDwgIjUuMDAyIi4KKyMKKyMgSG93ZXZlciwgaWYgbGV0dGVycyBpbiBhIHZlcnNpb24gbnVtYmVyIGltcGx5IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwKKyMgdGhlICJvYnZpb3VzIiB0aGluZyBpc24ndCBjb3JyZWN0LiAgRWcuIHlvdSB3b3VsZCBleHBlY3QgdGhhdAorIyAiMS41LjEiIDwgIjEuNS4yYTIiIDwgIjEuNS4yIiwgYnV0IHVuZGVyIHRoZSB0dXBsZS9sZXhpY2FsIGNvbXBhcmlzb24KKyMgaW1wbGVtZW50ZWQgaGVyZSwgdGhpcyBqdXN0IGlzbid0IHNvLgorIworIyBUd28gcG9zc2libGUgc29sdXRpb25zIGNvbWUgdG8gbWluZC4gIFRoZSBmaXJzdCBpcyB0byB0aWUgdGhlCisjIGNvbXBhcmlzb24gYWxnb3JpdGhtIHRvIGEgcGFydGljdWxhciBzZXQgb2Ygc2VtYW50aWMgcnVsZXMsIGFzIGhhcworIyBiZWVuIGRvbmUgaW4gdGhlIFN0cmljdFZlcnNpb24gY2xhc3MgYWJvdmUuICBUaGlzIHdvcmtzIGdyZWF0IGFzIGxvbmcKKyMgYXMgZXZlcnlvbmUgY2FuIGdvIGFsb25nIHdpdGggYm9uZGFnZSBhbmQgZGlzY2lwbGluZS4gIEhvcGVmdWxseSBhCisjIChsYXJnZSkgc3Vic2V0IG9mIFB5dGhvbiBtb2R1bGUgcHJvZ3JhbW1lcnMgd2lsbCBhZ3JlZSB0aGF0IHRoZQorIyBwYXJ0aWN1bGFyIGZsYXZvdXIgb2YgYm9uZGFnZSBhbmQgZGlzY2lwbGluZSBwcm92aWRlZCBieSBTdHJpY3RWZXJzaW9uCisjIHByb3ZpZGVzIGVub3VnaCBiZW5lZml0IHRvIGJlIHdvcnRoIHVzaW5nLCBhbmQgd2lsbCBzdWJtaXQgdGhlaXIKKyMgdmVyc2lvbiBudW1iZXJpbmcgc2NoZW1lIHRvIGl0cyBkb21pbmF0aW9uLiAgVGhlIGZyZWUtdGhpbmtpbmcKKyMgYW5hcmNoaXN0cyBpbiB0aGUgbG90IHdpbGwgbmV2ZXIgZ2l2ZSBpbiwgdGhvdWdoLCBhbmQgc29tZXRoaW5nIG5lZWRzCisjIHRvIGJlIGRvbmUgdG8gYWNjb21tb2RhdGUgdGhlbS4KKyMKKyMgUGVyaGFwcyBhICJtb2RlcmF0ZWx5IHN0cmljdCIgdmVyc2lvbiBjbGFzcyBjb3VsZCBiZSBpbXBsZW1lbnRlZCB0aGF0CisjIGxldHMgYWxtb3N0IGFueXRoaW5nIHNsaWRlIChzeW50YWN0aWNhbGx5KSwgYW5kIG1ha2VzIHNvbWUgaGV1cmlzdGljCisjIGFzc3VtcHRpb25zIGFib3V0IG5vbi1kaWdpdHMgaW4gdmVyc2lvbiBudW1iZXIgc3RyaW5ncy4gIFRoaXMgY291bGQKKyMgc2luayBpbnRvIHNwZWNpYWwtY2FzZS1oZWxsLCB0aG91Z2g7IGlmIEkgd2FzIGFzIHRhbGVudGVkIGFuZAorIyBpZGlvc3luY3JhdGljIGFzIExhcnJ5IFdhbGwsIEknZCBnbyBhaGVhZCBhbmQgaW1wbGVtZW50IGEgY2xhc3MgdGhhdAorIyBzb21laG93IGtub3dzIHRoYXQgIjEuMi4xIiA8ICIxLjIuMmEyIiA8ICIxLjIuMiIgPCAiMS4yLjJwbDMiLCBhbmQgaXMKKyMganVzdCBhcyBoYXBweSBkZWFsaW5nIHdpdGggdGhpbmdzIGxpa2UgIjJnNiIgYW5kICIxLjEzKysiLiAgSSBkb24ndAorIyB0aGluayBJJ20gc21hcnQgZW5vdWdoIHRvIGRvIGl0IHJpZ2h0IHRob3VnaC4KKyMKKyMgSW4gYW55IGNhc2UsIEkndmUgY29kZWQgdGhlIHRlc3Qgc3VpdGUgZm9yIHRoaXMgbW9kdWxlIChzZWUKKyMgLi4vdGVzdC90ZXN0X3ZlcnNpb24ucHkpIHNwZWNpZmljYWxseSB0byBmYWlsIG9uIHRoaW5ncyBsaWtlIGNvbXBhcmluZworIyAiMS4yYTIiIGFuZCAiMS4yIi4gIFRoYXQncyBub3QgYmVjYXVzZSB0aGUgKmNvZGUqIGlzIGRvaW5nIGFueXRoaW5nCisjIHdyb25nLCBpdCdzIGJlY2F1c2UgdGhlIHNpbXBsZSwgb2J2aW91cyBkZXNpZ24gZG9lc24ndCBtYXRjaCBteQorIyBjb21wbGljYXRlZCwgaGFpcnkgZXhwZWN0YXRpb25zIGZvciByZWFsLXdvcmxkIHZlcnNpb24gbnVtYmVycy4gIEl0CisjIHdvdWxkIGJlIGEgc25hcCB0byBmaXggdGhlIHRlc3Qgc3VpdGUgdG8gc2F5LCAiWWVwLCBMb29zZVZlcnNpb24gZG9lcworIyB0aGUgUmlnaHQgVGhpbmciIChpZS4gdGhlIGNvZGUgbWF0Y2hlcyB0aGUgY29uY2VwdGlvbikuICBCdXQgSSdkIHJhdGhlcgorIyBoYXZlIGEgY29uY2VwdGlvbiB0aGF0IG1hdGNoZXMgY29tbW9uIG5vdGlvbnMgYWJvdXQgdmVyc2lvbiBudW1iZXJzLgorCitjbGFzcyBMb29zZVZlcnNpb24gKFZlcnNpb24pOgorCisgICAgIiIiVmVyc2lvbiBudW1iZXJpbmcgZm9yIGFuYXJjaGlzdHMgYW5kIHNvZnR3YXJlIHJlYWxpc3RzLgorICAgIEltcGxlbWVudHMgdGhlIHN0YW5kYXJkIGludGVyZmFjZSBmb3IgdmVyc2lvbiBudW1iZXIgY2xhc3NlcyBhcworICAgIGRlc2NyaWJlZCBhYm92ZS4gIEEgdmVyc2lvbiBudW1iZXIgY29uc2lzdHMgb2YgYSBzZXJpZXMgb2YgbnVtYmVycywKKyAgICBzZXBhcmF0ZWQgYnkgZWl0aGVyIHBlcmlvZHMgb3Igc3RyaW5ncyBvZiBsZXR0ZXJzLiAgV2hlbiBjb21wYXJpbmcKKyAgICB2ZXJzaW9uIG51bWJlcnMsIHRoZSBudW1lcmljIGNvbXBvbmVudHMgd2lsbCBiZSBjb21wYXJlZAorICAgIG51bWVyaWNhbGx5LCBhbmQgdGhlIGFscGhhYmV0aWMgY29tcG9uZW50cyBsZXhpY2FsbHkuICBUaGUgZm9sbG93aW5nCisgICAgYXJlIGFsbCB2YWxpZCB2ZXJzaW9uIG51bWJlcnMsIGluIG5vIHBhcnRpY3VsYXIgb3JkZXI6CisKKyAgICAgICAgMS41LjEKKyAgICAgICAgMS41LjJiMgorICAgICAgICAxNjEKKyAgICAgICAgMy4xMGEKKyAgICAgICAgOC4wMgorICAgICAgICAzLjRqCisgICAgICAgIDE5OTYuMDcuMTIKKyAgICAgICAgMy4yLnBsMAorICAgICAgICAzLjEuMS42CisgICAgICAgIDJnNgorICAgICAgICAxMWcKKyAgICAgICAgMC45NjA5MjMKKyAgICAgICAgMi4yYmV0YTI5CisgICAgICAgIDEuMTMrKworICAgICAgICA1LjUua3cKKyAgICAgICAgMi4wYjFwbDAKKworICAgIEluIGZhY3QsIHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgYW4gaW52YWxpZCB2ZXJzaW9uIG51bWJlciB1bmRlcgorICAgIHRoaXMgc2NoZW1lOyB0aGUgcnVsZXMgZm9yIGNvbXBhcmlzb24gYXJlIHNpbXBsZSBhbmQgcHJlZGljdGFibGUsCisgICAgYnV0IG1heSBub3QgYWx3YXlzIGdpdmUgdGhlIHJlc3VsdHMgeW91IHdhbnQgKGZvciBzb21lIGRlZmluaXRpb24KKyAgICBvZiAid2FudCIpLgorICAgICIiIgorCisgICAgY29tcG9uZW50X3JlID0gcmUuY29tcGlsZShyJyhcZCsgfCBbYS16XSsgfCBcLiknLCByZS5WRVJCT1NFKQorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB2c3RyaW5nPU5vbmUpOgorICAgICAgICBpZiB2c3RyaW5nOgorICAgICAgICAgICAgc2VsZi5wYXJzZSh2c3RyaW5nKQorCisKKyAgICBkZWYgcGFyc2UgKHNlbGYsIHZzdHJpbmcpOgorICAgICAgICAjIEkndmUgZ2l2ZW4gdXAgb24gdGhpbmtpbmcgSSBjYW4gcmVjb25zdHJ1Y3QgdGhlIHZlcnNpb24gc3RyaW5nCisgICAgICAgICMgZnJvbSB0aGUgcGFyc2VkIHR1cGxlIC0tIHNvIEkganVzdCBzdG9yZSB0aGUgc3RyaW5nIGhlcmUgZm9yCisgICAgICAgICMgdXNlIGJ5IF9fc3RyX18KKyAgICAgICAgc2VsZi52c3RyaW5nID0gdnN0cmluZworICAgICAgICBjb21wb25lbnRzID0gZmlsdGVyKGxhbWJkYSB4OiB4IGFuZCB4ICE9ICcuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbXBvbmVudF9yZS5zcGxpdCh2c3RyaW5nKSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGNvbXBvbmVudHMpKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb21wb25lbnRzW2ldID0gaW50KGNvbXBvbmVudHNbaV0pCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gY29tcG9uZW50cworCisKKyAgICBkZWYgX19zdHJfXyAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZzdHJpbmcKKworCisgICAgZGVmIF9fcmVwcl9fIChzZWxmKToKKyAgICAgICAgcmV0dXJuICJMb29zZVZlcnNpb24gKCclcycpIiAlIHN0cihzZWxmKQorCisKKyAgICBkZWYgX19jbXBfXyAoc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBTdHJpbmdUeXBlKToKKyAgICAgICAgICAgIG90aGVyID0gTG9vc2VWZXJzaW9uKG90aGVyKQorCisgICAgICAgIHJldHVybiBjbXAoc2VsZi52ZXJzaW9uLCBvdGhlci52ZXJzaW9uKQorCisKKyMgZW5kIGNsYXNzIExvb3NlVmVyc2lvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbi5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy92ZXJzaW9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjcxNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbi5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy92ZXJzaW9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjcxNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbnByZWRpY2F0ZS5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3ZlcnNpb25wcmVkaWNhdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE4YjZjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3ZlcnNpb25wcmVkaWNhdGUucHkKQEAgLTAsMCArMSwxNjQgQEAKKyIiIk1vZHVsZSBmb3IgcGFyc2luZyBhbmQgdGVzdGluZyBwYWNrYWdlIHZlcnNpb24gcHJlZGljYXRlIHN0cmluZ3MuCisiIiIKK2ltcG9ydCByZQoraW1wb3J0IGRpc3R1dGlscy52ZXJzaW9uCitpbXBvcnQgb3BlcmF0b3IKKworCityZV92YWxpZFBhY2thZ2UgPSByZS5jb21waWxlKHIiKD9pKV5ccyooW2Etel9dXHcqKD86XC5bYS16X11cdyopKikoLiopIikKKyMgKHBhY2thZ2UpIChyZXN0KQorCityZV9wYXJlbiA9IHJlLmNvbXBpbGUociJeXHMqXCgoLiopXClccyokIikgIyAobGlzdCkgaW5zaWRlIG9mIHBhcmVudGhlc2VzCityZV9zcGxpdENvbXBhcmlzb24gPSByZS5jb21waWxlKHIiXlxzKig8PXw+PXw8fD58IT18PT0pXHMqKFteXHMsXSspXHMqJCIpCisjIChjb21wKSAodmVyc2lvbikKKworCitkZWYgc3BsaXRVcChwcmVkKToKKyAgICAiIiJQYXJzZSBhIHNpbmdsZSB2ZXJzaW9uIGNvbXBhcmlzb24uCisKKyAgICBSZXR1cm4gKGNvbXBhcmlzb24gc3RyaW5nLCBTdHJpY3RWZXJzaW9uKQorICAgICIiIgorICAgIHJlcyA9IHJlX3NwbGl0Q29tcGFyaXNvbi5tYXRjaChwcmVkKQorICAgIGlmIG5vdCByZXM6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImJhZCBwYWNrYWdlIHJlc3RyaWN0aW9uIHN5bnRheDogJXIiICUgcHJlZCkKKyAgICBjb21wLCB2ZXJTdHIgPSByZXMuZ3JvdXBzKCkKKyAgICByZXR1cm4gKGNvbXAsIGRpc3R1dGlscy52ZXJzaW9uLlN0cmljdFZlcnNpb24odmVyU3RyKSkKKworY29tcG1hcCA9IHsiPCI6IG9wZXJhdG9yLmx0LCAiPD0iOiBvcGVyYXRvci5sZSwgIj09Ijogb3BlcmF0b3IuZXEsCisgICAgICAgICAgICI+Ijogb3BlcmF0b3IuZ3QsICI+PSI6IG9wZXJhdG9yLmdlLCAiIT0iOiBvcGVyYXRvci5uZX0KKworY2xhc3MgVmVyc2lvblByZWRpY2F0ZToKKyAgICAiIiJQYXJzZSBhbmQgdGVzdCBwYWNrYWdlIHZlcnNpb24gcHJlZGljYXRlcy4KKworICAgID4+PiB2ID0gVmVyc2lvblByZWRpY2F0ZSgncHllcGF0LmFiYyAoPjEuMCwgPDMzMzMuM2ExLCAhPTE1NTUuMWIzKScpCisKKyAgICBUaGUgYG5hbWVgIGF0dHJpYnV0ZSBwcm92aWRlcyB0aGUgZnVsbCBkb3R0ZWQgbmFtZSB0aGF0IGlzIGdpdmVuOjoKKworICAgID4+PiB2Lm5hbWUKKyAgICAncHllcGF0LmFiYycKKworICAgIFRoZSBzdHIoKSBvZiBhIGBWZXJzaW9uUHJlZGljYXRlYCBwcm92aWRlcyBhIG5vcm1hbGl6ZWQKKyAgICBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBleHByZXNzaW9uOjoKKworICAgID4+PiBwcmludCB2CisgICAgcHllcGF0LmFiYyAoPiAxLjAsIDwgMzMzMy4zYTEsICE9IDE1NTUuMWIzKQorCisgICAgVGhlIGBzYXRpc2ZpZWRfYnkoKWAgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSB3aXRoIGEgZ2l2ZW4KKyAgICB2ZXJzaW9uIG51bWJlciBpcyBpbmNsdWRlZCBpbiB0aGUgc2V0IGRlc2NyaWJlZCBieSB0aGUgdmVyc2lvbgorICAgIHJlc3RyaWN0aW9uczo6CisKKyAgICA+Pj4gdi5zYXRpc2ZpZWRfYnkoJzEuMScpCisgICAgVHJ1ZQorICAgID4+PiB2LnNhdGlzZmllZF9ieSgnMS40JykKKyAgICBUcnVlCisgICAgPj4+IHYuc2F0aXNmaWVkX2J5KCcxLjAnKQorICAgIEZhbHNlCisgICAgPj4+IHYuc2F0aXNmaWVkX2J5KCc0NDQ0LjQnKQorICAgIEZhbHNlCisgICAgPj4+IHYuc2F0aXNmaWVkX2J5KCcxNTU1LjFiMycpCisgICAgRmFsc2UKKworICAgIGBWZXJzaW9uUHJlZGljYXRlYCBpcyBmbGV4aWJsZSBpbiBhY2NlcHRpbmcgZXh0cmEgd2hpdGVzcGFjZTo6CisKKyAgICA+Pj4gdiA9IFZlcnNpb25QcmVkaWNhdGUoJyBwYXQoID09ICAwLjEgICkgICcpCisgICAgPj4+IHYubmFtZQorICAgICdwYXQnCisgICAgPj4+IHYuc2F0aXNmaWVkX2J5KCcwLjEnKQorICAgIFRydWUKKyAgICA+Pj4gdi5zYXRpc2ZpZWRfYnkoJzAuMicpCisgICAgRmFsc2UKKworICAgIElmIGFueSB2ZXJzaW9uIG51bWJlcnMgcGFzc2VkIGluIGRvIG5vdCBjb25mb3JtIHRvIHRoZQorICAgIHJlc3RyaWN0aW9ucyBvZiBgU3RyaWN0VmVyc2lvbmAsIGEgYFZhbHVlRXJyb3JgIGlzIHJhaXNlZDo6CisKKyAgICA+Pj4gdiA9IFZlcnNpb25QcmVkaWNhdGUoJ3AxLnAyLnAzLnA0KD49MS4wLCA8PTEuM2ExLCAhPTEuMnpiMyknKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFZhbHVlRXJyb3I6IGludmFsaWQgdmVyc2lvbiBudW1iZXIgJzEuMnpiMycKKworICAgIEl0IHRoZSBtb2R1bGUgb3IgcGFja2FnZSBuYW1lIGdpdmVuIGRvZXMgbm90IGNvbmZvcm0gdG8gd2hhdCdzCisgICAgYWxsb3dlZCBhcyBhIGxlZ2FsIG1vZHVsZSBvciBwYWNrYWdlIG5hbWUsIGBWYWx1ZUVycm9yYCBpcworICAgIHJhaXNlZDo6CisKKyAgICA+Pj4gdiA9IFZlcnNpb25QcmVkaWNhdGUoJ2Zvby1iYXInKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFZhbHVlRXJyb3I6IGV4cGVjdGVkIHBhcmVudGhlc2l6ZWQgbGlzdDogJy1iYXInCisKKyAgICA+Pj4gdiA9IFZlcnNpb25QcmVkaWNhdGUoJ2ZvbyBiYXIgKDEyLjIxKScpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVmFsdWVFcnJvcjogZXhwZWN0ZWQgcGFyZW50aGVzaXplZCBsaXN0OiAnYmFyICgxMi4yMSknCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJzaW9uUHJlZGljYXRlU3RyKToKKyAgICAgICAgIiIiUGFyc2UgYSB2ZXJzaW9uIHByZWRpY2F0ZSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICAjIEZpZWxkczoKKyAgICAgICAgIyAgICBuYW1lOiAgcGFja2FnZSBuYW1lCisgICAgICAgICMgICAgcHJlZDogIGxpc3Qgb2YgKGNvbXBhcmlzb24gc3RyaW5nLCBTdHJpY3RWZXJzaW9uKQorCisgICAgICAgIHZlcnNpb25QcmVkaWNhdGVTdHIgPSB2ZXJzaW9uUHJlZGljYXRlU3RyLnN0cmlwKCkKKyAgICAgICAgaWYgbm90IHZlcnNpb25QcmVkaWNhdGVTdHI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJlbXB0eSBwYWNrYWdlIHJlc3RyaWN0aW9uIikKKyAgICAgICAgbWF0Y2ggPSByZV92YWxpZFBhY2thZ2UubWF0Y2godmVyc2lvblByZWRpY2F0ZVN0cikKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYmFkIHBhY2thZ2UgbmFtZSBpbiAlciIgJSB2ZXJzaW9uUHJlZGljYXRlU3RyKQorICAgICAgICBzZWxmLm5hbWUsIHBhcmVuID0gbWF0Y2guZ3JvdXBzKCkKKyAgICAgICAgcGFyZW4gPSBwYXJlbi5zdHJpcCgpCisgICAgICAgIGlmIHBhcmVuOgorICAgICAgICAgICAgbWF0Y2ggPSByZV9wYXJlbi5tYXRjaChwYXJlbikKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJleHBlY3RlZCBwYXJlbnRoZXNpemVkIGxpc3Q6ICVyIiAlIHBhcmVuKQorICAgICAgICAgICAgc3RyID0gbWF0Y2guZ3JvdXBzKClbMF0KKyAgICAgICAgICAgIHNlbGYucHJlZCA9IFtzcGxpdFVwKGFQcmVkKSBmb3IgYVByZWQgaW4gc3RyLnNwbGl0KCIsIildCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5wcmVkOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImVtcHR5IHBhcmVudGhlc2l6ZWQgbGlzdCBpbiAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdmVyc2lvblByZWRpY2F0ZVN0cikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHJlZCA9IFtdCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wcmVkOgorICAgICAgICAgICAgc2VxID0gW2NvbmQgKyAiICIgKyBzdHIodmVyKSBmb3IgY29uZCwgdmVyIGluIHNlbGYucHJlZF0KKyAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUgKyAiICgiICsgIiwgIi5qb2luKHNlcSkgKyAiKSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWUKKworICAgIGRlZiBzYXRpc2ZpZWRfYnkoc2VsZiwgdmVyc2lvbik6CisgICAgICAgICIiIlRydWUgaWYgdmVyc2lvbiBpcyBjb21wYXRpYmxlIHdpdGggYWxsIHRoZSBwcmVkaWNhdGVzIGluIHNlbGYuCisgICAgICAgIFRoZSBwYXJhbWV0ZXIgdmVyc2lvbiBtdXN0IGJlIGFjY2VwdGFibGUgdG8gdGhlIFN0cmljdFZlcnNpb24KKyAgICAgICAgY29uc3RydWN0b3IuICBJdCBtYXkgYmUgZWl0aGVyIGEgc3RyaW5nIG9yIFN0cmljdFZlcnNpb24uCisgICAgICAgICIiIgorICAgICAgICBmb3IgY29uZCwgdmVyIGluIHNlbGYucHJlZDoKKyAgICAgICAgICAgIGlmIG5vdCBjb21wbWFwW2NvbmRdKHZlcnNpb24sIHZlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKworX3Byb3Zpc2lvbl9yeCA9IE5vbmUKKworZGVmIHNwbGl0X3Byb3Zpc2lvbih2YWx1ZSk6CisgICAgIiIiUmV0dXJuIHRoZSBuYW1lIGFuZCBvcHRpb25hbCB2ZXJzaW9uIG51bWJlciBvZiBhIHByb3Zpc2lvbi4KKworICAgIFRoZSB2ZXJzaW9uIG51bWJlciwgaWYgZ2l2ZW4sIHdpbGwgYmUgcmV0dXJuZWQgYXMgYSBgU3RyaWN0VmVyc2lvbmAKKyAgICBpbnN0YW5jZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYE5vbmVgLgorCisgICAgPj4+IHNwbGl0X3Byb3Zpc2lvbignbXlwa2cnKQorICAgICgnbXlwa2cnLCBOb25lKQorICAgID4+PiBzcGxpdF9wcm92aXNpb24oJyBteXBrZyggMS4yICkgJykKKyAgICAoJ215cGtnJywgU3RyaWN0VmVyc2lvbiAoJzEuMicpKQorICAgICIiIgorICAgIGdsb2JhbCBfcHJvdmlzaW9uX3J4CisgICAgaWYgX3Byb3Zpc2lvbl9yeCBpcyBOb25lOgorICAgICAgICBfcHJvdmlzaW9uX3J4ID0gcmUuY29tcGlsZSgKKyAgICAgICAgICAgICIoW2EtekEtWl9dXHcqKD86XC5bYS16QS1aX11cdyopKikoPzpccypcKFxzKihbXilcc10rKVxzKlwpKT8kIikKKyAgICB2YWx1ZSA9IHZhbHVlLnN0cmlwKCkKKyAgICBtID0gX3Byb3Zpc2lvbl9yeC5tYXRjaCh2YWx1ZSkKKyAgICBpZiBub3QgbToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaWxsZWdhbCBwcm92aWRlcyBzcGVjaWZpY2F0aW9uOiAlciIgJSB2YWx1ZSkKKyAgICB2ZXIgPSBtLmdyb3VwKDIpIG9yIE5vbmUKKyAgICBpZiB2ZXI6CisgICAgICAgIHZlciA9IGRpc3R1dGlscy52ZXJzaW9uLlN0cmljdFZlcnNpb24odmVyKQorICAgIHJldHVybiBtLmdyb3VwKDEpLCB2ZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3ZlcnNpb25wcmVkaWNhdGUucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbnByZWRpY2F0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5ODQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3ZlcnNpb25wcmVkaWNhdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3ZlcnNpb25wcmVkaWNhdGUucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbnByZWRpY2F0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY5ODQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3ZlcnNpb25wcmVkaWNhdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZG9jdGVzdC5weSBiL2xpYi9weXRob24yLjcvZG9jdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGJjY2ExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kb2N0ZXN0LnB5CkBAIC0wLDAgKzEsMjc5MiBAQAorIyBNb2R1bGUgZG9jdGVzdC4KKyMgUmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4gMTYtSmFuLTIwMDEsIGJ5IFRpbSBQZXRlcnMgKHRpbUBweXRob24ub3JnKS4KKyMgTWFqb3IgZW5oYW5jZW1lbnRzIGFuZCByZWZhY3RvcmluZyBieToKKyMgICAgIEppbSBGdWx0b24KKyMgICAgIEVkd2FyZCBMb3BlcgorCisjIFByb3ZpZGVkIGFzLWlzOyB1c2UgYXQgeW91ciBvd24gcmlzazsgbm8gd2FycmFudHk7IG5vIHByb21pc2VzOyBlbmpveSEKKworciIiIk1vZHVsZSBkb2N0ZXN0IC0tIGEgZnJhbWV3b3JrIGZvciBydW5uaW5nIGV4YW1wbGVzIGluIGRvY3N0cmluZ3MuCisKK0luIHNpbXBsZXN0IHVzZSwgZW5kIGVhY2ggbW9kdWxlIE0gdG8gYmUgdGVzdGVkIHdpdGg6CisKK2RlZiBfdGVzdCgpOgorICAgIGltcG9ydCBkb2N0ZXN0CisgICAgZG9jdGVzdC50ZXN0bW9kKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBfdGVzdCgpCisKK1RoZW4gcnVubmluZyB0aGUgbW9kdWxlIGFzIGEgc2NyaXB0IHdpbGwgY2F1c2UgdGhlIGV4YW1wbGVzIGluIHRoZQorZG9jc3RyaW5ncyB0byBnZXQgZXhlY3V0ZWQgYW5kIHZlcmlmaWVkOgorCitweXRob24gTS5weQorCitUaGlzIHdvbid0IGRpc3BsYXkgYW55dGhpbmcgdW5sZXNzIGFuIGV4YW1wbGUgZmFpbHMsIGluIHdoaWNoIGNhc2UgdGhlCitmYWlsaW5nIGV4YW1wbGUocykgYW5kIHRoZSBjYXVzZShzKSBvZiB0aGUgZmFpbHVyZShzKSBhcmUgcHJpbnRlZCB0byBzdGRvdXQKKyh3aHkgbm90IHN0ZGVycj8gYmVjYXVzZSBzdGRlcnIgaXMgYSBsYW1lIGhhY2sgPDAuMiB3aW5rPiksIGFuZCB0aGUgZmluYWwKK2xpbmUgb2Ygb3V0cHV0IGlzICJUZXN0IGZhaWxlZC4iLgorCitSdW4gaXQgd2l0aCB0aGUgLXYgc3dpdGNoIGluc3RlYWQ6CisKK3B5dGhvbiBNLnB5IC12CisKK2FuZCBhIGRldGFpbGVkIHJlcG9ydCBvZiBhbGwgZXhhbXBsZXMgdHJpZWQgaXMgcHJpbnRlZCB0byBzdGRvdXQsIGFsb25nCit3aXRoIGFzc29ydGVkIHN1bW1hcmllcyBhdCB0aGUgZW5kLgorCitZb3UgY2FuIGZvcmNlIHZlcmJvc2UgbW9kZSBieSBwYXNzaW5nICJ2ZXJib3NlPVRydWUiIHRvIHRlc3Rtb2QsIG9yIHByb2hpYml0CitpdCBieSBwYXNzaW5nICJ2ZXJib3NlPUZhbHNlIi4gIEluIGVpdGhlciBvZiB0aG9zZSBjYXNlcywgc3lzLmFyZ3YgaXMgbm90CitleGFtaW5lZCBieSB0ZXN0bW9kLgorCitUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIG90aGVyIHdheXMgdG8gcnVuIGRvY3Rlc3RzLCBpbmNsdWRpbmcgaW50ZWdyYXRpb24KK3dpdGggdGhlIHVuaXR0ZXN0IGZyYW1ld29yaywgYW5kIHN1cHBvcnQgZm9yIHJ1bm5pbmcgbm9uLVB5dGhvbiB0ZXh0CitmaWxlcyBjb250YWluaW5nIGRvY3Rlc3RzLiAgVGhlcmUgYXJlIGFsc28gbWFueSB3YXlzIHRvIG92ZXJyaWRlIHBhcnRzCitvZiBkb2N0ZXN0J3MgZGVmYXVsdCBiZWhhdmlvcnMuICBTZWUgdGhlIExpYnJhcnkgUmVmZXJlbmNlIE1hbnVhbCBmb3IKK2RldGFpbHMuCisiIiIKKworX19kb2Nmb3JtYXRfXyA9ICdyZVN0cnVjdHVyZWRUZXh0IGVuJworCitfX2FsbF9fID0gWworICAgICMgMCwgT3B0aW9uIEZsYWdzCisgICAgJ3JlZ2lzdGVyX29wdGlvbmZsYWcnLAorICAgICdET05UX0FDQ0VQVF9UUlVFX0ZPUl8xJywKKyAgICAnRE9OVF9BQ0NFUFRfQkxBTktMSU5FJywKKyAgICAnTk9STUFMSVpFX1dISVRFU1BBQ0UnLAorICAgICdFTExJUFNJUycsCisgICAgJ1NLSVAnLAorICAgICdJR05PUkVfRVhDRVBUSU9OX0RFVEFJTCcsCisgICAgJ0NPTVBBUklTT05fRkxBR1MnLAorICAgICdSRVBPUlRfVURJRkYnLAorICAgICdSRVBPUlRfQ0RJRkYnLAorICAgICdSRVBPUlRfTkRJRkYnLAorICAgICdSRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFJywKKyAgICAnUkVQT1JUSU5HX0ZMQUdTJywKKyAgICAjIDEuIFV0aWxpdHkgRnVuY3Rpb25zCisgICAgIyAyLiBFeGFtcGxlICYgRG9jVGVzdAorICAgICdFeGFtcGxlJywKKyAgICAnRG9jVGVzdCcsCisgICAgIyAzLiBEb2N0ZXN0IFBhcnNlcgorICAgICdEb2NUZXN0UGFyc2VyJywKKyAgICAjIDQuIERvY3Rlc3QgRmluZGVyCisgICAgJ0RvY1Rlc3RGaW5kZXInLAorICAgICMgNS4gRG9jdGVzdCBSdW5uZXIKKyAgICAnRG9jVGVzdFJ1bm5lcicsCisgICAgJ091dHB1dENoZWNrZXInLAorICAgICdEb2NUZXN0RmFpbHVyZScsCisgICAgJ1VuZXhwZWN0ZWRFeGNlcHRpb24nLAorICAgICdEZWJ1Z1J1bm5lcicsCisgICAgIyA2LiBUZXN0IEZ1bmN0aW9ucworICAgICd0ZXN0bW9kJywKKyAgICAndGVzdGZpbGUnLAorICAgICdydW5fZG9jc3RyaW5nX2V4YW1wbGVzJywKKyAgICAjIDcuIFRlc3RlcgorICAgICdUZXN0ZXInLAorICAgICMgOC4gVW5pdHRlc3QgU3VwcG9ydAorICAgICdEb2NUZXN0U3VpdGUnLAorICAgICdEb2NGaWxlU3VpdGUnLAorICAgICdzZXRfdW5pdHRlc3RfcmVwb3J0ZmxhZ3MnLAorICAgICMgOS4gRGVidWdnaW5nIFN1cHBvcnQKKyAgICAnc2NyaXB0X2Zyb21fZXhhbXBsZXMnLAorICAgICd0ZXN0c291cmNlJywKKyAgICAnZGVidWdfc3JjJywKKyAgICAnZGVidWcnLAorXQorCitpbXBvcnQgX19mdXR1cmVfXworCitpbXBvcnQgc3lzLCB0cmFjZWJhY2ssIGluc3BlY3QsIGxpbmVjYWNoZSwgb3MsIHJlCitpbXBvcnQgdW5pdHRlc3QsIGRpZmZsaWIsIHBkYiwgdGVtcGZpbGUKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKKworVGVzdFJlc3VsdHMgPSBuYW1lZHR1cGxlKCdUZXN0UmVzdWx0cycsICdmYWlsZWQgYXR0ZW1wdGVkJykKKworIyBUaGVyZSBhcmUgNCBiYXNpYyBjbGFzc2VzOgorIyAgLSBFeGFtcGxlOiBhIDxzb3VyY2UsIHdhbnQ+IHBhaXIsIHBsdXMgYW4gaW50cmEtZG9jc3RyaW5nIGxpbmUgbnVtYmVyLgorIyAgLSBEb2NUZXN0OiBhIGNvbGxlY3Rpb24gb2YgZXhhbXBsZXMsIHBhcnNlZCBmcm9tIGEgZG9jc3RyaW5nLCBwbHVzCisjICAgIGluZm8gYWJvdXQgd2hlcmUgdGhlIGRvY3N0cmluZyBjYW1lIGZyb20gKG5hbWUsIGZpbGVuYW1lLCBsaW5lbm8pLgorIyAgLSBEb2NUZXN0RmluZGVyOiBleHRyYWN0cyBEb2NUZXN0cyBmcm9tIGEgZ2l2ZW4gb2JqZWN0J3MgZG9jc3RyaW5nIGFuZAorIyAgICBpdHMgY29udGFpbmVkIG9iamVjdHMnIGRvY3N0cmluZ3MuCisjICAtIERvY1Rlc3RSdW5uZXI6IHJ1bnMgRG9jVGVzdCBjYXNlcywgYW5kIGFjY3VtdWxhdGVzIHN0YXRpc3RpY3MuCisjCisjIFNvIHRoZSBiYXNpYyBwaWN0dXJlIGlzOgorIworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBvZjoKKyMgKy0tLS0tLSsgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0rCisjIHxvYmplY3R8IC0tRG9jVGVzdEZpbmRlci0+IHwgRG9jVGVzdCB8IC0tRG9jVGVzdFJ1bm5lci0+IHxyZXN1bHRzfAorIyArLS0tLS0tKyAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeGFtcGxlIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIC4uLiAgIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeGFtcGxlIHwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLSsKKworIyBPcHRpb24gY29uc3RhbnRzLgorCitPUFRJT05GTEFHU19CWV9OQU1FID0ge30KK2RlZiByZWdpc3Rlcl9vcHRpb25mbGFnKG5hbWUpOgorICAgICMgQ3JlYXRlIGEgbmV3IGZsYWcgdW5sZXNzIGBuYW1lYCBpcyBhbHJlYWR5IGtub3duLgorICAgIHJldHVybiBPUFRJT05GTEFHU19CWV9OQU1FLnNldGRlZmF1bHQobmFtZSwgMSA8PCBsZW4oT1BUSU9ORkxBR1NfQllfTkFNRSkpCisKK0RPTlRfQUNDRVBUX1RSVUVfRk9SXzEgPSByZWdpc3Rlcl9vcHRpb25mbGFnKCdET05UX0FDQ0VQVF9UUlVFX0ZPUl8xJykKK0RPTlRfQUNDRVBUX0JMQU5LTElORSA9IHJlZ2lzdGVyX29wdGlvbmZsYWcoJ0RPTlRfQUNDRVBUX0JMQU5LTElORScpCitOT1JNQUxJWkVfV0hJVEVTUEFDRSA9IHJlZ2lzdGVyX29wdGlvbmZsYWcoJ05PUk1BTElaRV9XSElURVNQQUNFJykKK0VMTElQU0lTID0gcmVnaXN0ZXJfb3B0aW9uZmxhZygnRUxMSVBTSVMnKQorU0tJUCA9IHJlZ2lzdGVyX29wdGlvbmZsYWcoJ1NLSVAnKQorSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwgPSByZWdpc3Rlcl9vcHRpb25mbGFnKCdJR05PUkVfRVhDRVBUSU9OX0RFVEFJTCcpCisKK0NPTVBBUklTT05fRkxBR1MgPSAoRE9OVF9BQ0NFUFRfVFJVRV9GT1JfMSB8CisgICAgICAgICAgICAgICAgICAgIERPTlRfQUNDRVBUX0JMQU5LTElORSB8CisgICAgICAgICAgICAgICAgICAgIE5PUk1BTElaRV9XSElURVNQQUNFIHwKKyAgICAgICAgICAgICAgICAgICAgRUxMSVBTSVMgfAorICAgICAgICAgICAgICAgICAgICBTS0lQIHwKKyAgICAgICAgICAgICAgICAgICAgSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwpCisKK1JFUE9SVF9VRElGRiA9IHJlZ2lzdGVyX29wdGlvbmZsYWcoJ1JFUE9SVF9VRElGRicpCitSRVBPUlRfQ0RJRkYgPSByZWdpc3Rlcl9vcHRpb25mbGFnKCdSRVBPUlRfQ0RJRkYnKQorUkVQT1JUX05ESUZGID0gcmVnaXN0ZXJfb3B0aW9uZmxhZygnUkVQT1JUX05ESUZGJykKK1JFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUgPSByZWdpc3Rlcl9vcHRpb25mbGFnKCdSRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFJykKKworUkVQT1JUSU5HX0ZMQUdTID0gKFJFUE9SVF9VRElGRiB8CisgICAgICAgICAgICAgICAgICAgUkVQT1JUX0NESUZGIHwKKyAgICAgICAgICAgICAgICAgICBSRVBPUlRfTkRJRkYgfAorICAgICAgICAgICAgICAgICAgIFJFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUpCisKKyMgU3BlY2lhbCBzdHJpbmcgbWFya2VycyBmb3IgdXNlIGluIGB3YW50YCBzdHJpbmdzOgorQkxBTktMSU5FX01BUktFUiA9ICc8QkxBTktMSU5FPicKK0VMTElQU0lTX01BUktFUiA9ICcuLi4nCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIFRhYmxlIG9mIENvbnRlbnRzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICAxLiBVdGlsaXR5IEZ1bmN0aW9ucworIyAgMi4gRXhhbXBsZSAmIERvY1Rlc3QgLS0gc3RvcmUgdGVzdCBjYXNlcworIyAgMy4gRG9jVGVzdCBQYXJzZXIgLS0gZXh0cmFjdHMgZXhhbXBsZXMgZnJvbSBzdHJpbmdzCisjICA0LiBEb2NUZXN0IEZpbmRlciAtLSBleHRyYWN0cyB0ZXN0IGNhc2VzIGZyb20gb2JqZWN0cworIyAgNS4gRG9jVGVzdCBSdW5uZXIgLS0gcnVucyB0ZXN0IGNhc2VzCisjICA2LiBUZXN0IEZ1bmN0aW9ucyAtLSBjb252ZW5pZW50IHdyYXBwZXJzIGZvciB0ZXN0aW5nCisjICA3LiBUZXN0ZXIgQ2xhc3MgLS0gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisjICA4LiBVbml0dGVzdCBTdXBwb3J0CisjICA5LiBEZWJ1Z2dpbmcgU3VwcG9ydAorIyAxMC4gRXhhbXBsZSBVc2FnZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAxLiBVdGlsaXR5IEZ1bmN0aW9ucworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgX2V4dHJhY3RfZnV0dXJlX2ZsYWdzKGdsb2JzKToKKyAgICAiIiIKKyAgICBSZXR1cm4gdGhlIGNvbXBpbGVyLWZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnV0dXJlIGZlYXR1cmVzIHRoYXQKKyAgICBoYXZlIGJlZW4gaW1wb3J0ZWQgaW50byB0aGUgZ2l2ZW4gbmFtZXNwYWNlIChnbG9icykuCisgICAgIiIiCisgICAgZmxhZ3MgPSAwCisgICAgZm9yIGZuYW1lIGluIF9fZnV0dXJlX18uYWxsX2ZlYXR1cmVfbmFtZXM6CisgICAgICAgIGZlYXR1cmUgPSBnbG9icy5nZXQoZm5hbWUsIE5vbmUpCisgICAgICAgIGlmIGZlYXR1cmUgaXMgZ2V0YXR0cihfX2Z1dHVyZV9fLCBmbmFtZSk6CisgICAgICAgICAgICBmbGFncyB8PSBmZWF0dXJlLmNvbXBpbGVyX2ZsYWcKKyAgICByZXR1cm4gZmxhZ3MKKworZGVmIF9ub3JtYWxpemVfbW9kdWxlKG1vZHVsZSwgZGVwdGg9Mik6CisgICAgIiIiCisgICAgUmV0dXJuIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGJ5IGBtb2R1bGVgLiAgSW4gcGFydGljdWxhcjoKKyAgICAgIC0gSWYgYG1vZHVsZWAgaXMgYSBtb2R1bGUsIHRoZW4gcmV0dXJuIG1vZHVsZS4KKyAgICAgIC0gSWYgYG1vZHVsZWAgaXMgYSBzdHJpbmcsIHRoZW4gaW1wb3J0IGFuZCByZXR1cm4gdGhlCisgICAgICAgIG1vZHVsZSB3aXRoIHRoYXQgbmFtZS4KKyAgICAgIC0gSWYgYG1vZHVsZWAgaXMgTm9uZSwgdGhlbiByZXR1cm4gdGhlIGNhbGxpbmcgbW9kdWxlLgorICAgICAgICBUaGUgY2FsbGluZyBtb2R1bGUgaXMgYXNzdW1lZCB0byBiZSB0aGUgbW9kdWxlIG9mCisgICAgICAgIHRoZSBzdGFjayBmcmFtZSBhdCB0aGUgZ2l2ZW4gZGVwdGggaW4gdGhlIGNhbGwgc3RhY2suCisgICAgIiIiCisgICAgaWYgaW5zcGVjdC5pc21vZHVsZShtb2R1bGUpOgorICAgICAgICByZXR1cm4gbW9kdWxlCisgICAgZWxpZiBpc2luc3RhbmNlKG1vZHVsZSwgKHN0ciwgdW5pY29kZSkpOgorICAgICAgICByZXR1cm4gX19pbXBvcnRfXyhtb2R1bGUsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsiKiJdKQorICAgIGVsaWYgbW9kdWxlIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tzeXMuX2dldGZyYW1lKGRlcHRoKS5mX2dsb2JhbHNbJ19fbmFtZV9fJ11dCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJFeHBlY3RlZCBhIG1vZHVsZSwgc3RyaW5nLCBvciBOb25lIikKKworZGVmIF9sb2FkX3Rlc3RmaWxlKGZpbGVuYW1lLCBwYWNrYWdlLCBtb2R1bGVfcmVsYXRpdmUpOgorICAgIGlmIG1vZHVsZV9yZWxhdGl2ZToKKyAgICAgICAgcGFja2FnZSA9IF9ub3JtYWxpemVfbW9kdWxlKHBhY2thZ2UsIDMpCisgICAgICAgIGZpbGVuYW1lID0gX21vZHVsZV9yZWxhdGl2ZV9wYXRoKHBhY2thZ2UsIGZpbGVuYW1lKQorICAgICAgICBpZiBoYXNhdHRyKHBhY2thZ2UsICdfX2xvYWRlcl9fJyk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHBhY2thZ2UuX19sb2FkZXJfXywgJ2dldF9kYXRhJyk6CisgICAgICAgICAgICAgICAgZmlsZV9jb250ZW50cyA9IHBhY2thZ2UuX19sb2FkZXJfXy5nZXRfZGF0YShmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICAjIGdldF9kYXRhKCkgb3BlbnMgZmlsZXMgYXMgJ3JiJywgc28gb25lIG11c3QgZG8gdGhlIGVxdWl2YWxlbnQKKyAgICAgICAgICAgICAgICAjIGNvbnZlcnNpb24gYXMgdW5pdmVyc2FsIG5ld2xpbmVzIHdvdWxkIGRvLgorICAgICAgICAgICAgICAgIHJldHVybiBmaWxlX2NvbnRlbnRzLnJlcGxhY2Uob3MubGluZXNlcCwgJ1xuJyksIGZpbGVuYW1lCisgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmOgorICAgICAgICByZXR1cm4gZi5yZWFkKCksIGZpbGVuYW1lCisKKyMgVXNlIHN5cy5zdGRvdXQgZW5jb2RpbmcgZm9yIG91cHV0LgorX2VuY29kaW5nID0gZ2V0YXR0cihzeXMuX19zdGRvdXRfXywgJ2VuY29kaW5nJywgTm9uZSkgb3IgJ3V0Zi04JworCitkZWYgX2luZGVudChzLCBpbmRlbnQ9NCk6CisgICAgIiIiCisgICAgQWRkIHRoZSBnaXZlbiBudW1iZXIgb2Ygc3BhY2UgY2hhcmFjdGVycyB0byB0aGUgYmVnaW5uaW5nIG9mCisgICAgZXZlcnkgbm9uLWJsYW5rIGxpbmUgaW4gYHNgLCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCisgICAgSWYgdGhlIHN0cmluZyBgc2AgaXMgVW5pY29kZSwgaXQgaXMgZW5jb2RlZCB1c2luZyB0aGUgc3Rkb3V0CisgICAgZW5jb2RpbmcgYW5kIHRoZSBgYmFja3NsYXNocmVwbGFjZWAgZXJyb3IgaGFuZGxlci4KKyAgICAiIiIKKyAgICBpZiBpc2luc3RhbmNlKHMsIHVuaWNvZGUpOgorICAgICAgICBzID0gcy5lbmNvZGUoX2VuY29kaW5nLCAnYmFja3NsYXNocmVwbGFjZScpCisgICAgIyBUaGlzIHJlZ2V4cCBtYXRjaGVzIHRoZSBzdGFydCBvZiBub24tYmxhbmsgbGluZXM6CisgICAgcmV0dXJuIHJlLnN1YignKD9tKV4oPyEkKScsIGluZGVudConICcsIHMpCisKK2RlZiBfZXhjZXB0aW9uX3RyYWNlYmFjayhleGNfaW5mbyk6CisgICAgIiIiCisgICAgUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSB0cmFjZWJhY2sgbWVzc2FnZSBmb3IgdGhlIGdpdmVuCisgICAgZXhjX2luZm8gdHVwbGUgKGFzIHJldHVybmVkIGJ5IHN5cy5leGNfaW5mbygpKS4KKyAgICAiIiIKKyAgICAjIEdldCBhIHRyYWNlYmFjayBtZXNzYWdlLgorICAgIGV4Y291dCA9IFN0cmluZ0lPKCkKKyAgICBleGNfdHlwZSwgZXhjX3ZhbCwgZXhjX3RiID0gZXhjX2luZm8KKyAgICB0cmFjZWJhY2sucHJpbnRfZXhjZXB0aW9uKGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIsIGZpbGU9ZXhjb3V0KQorICAgIHJldHVybiBleGNvdXQuZ2V0dmFsdWUoKQorCisjIE92ZXJyaWRlIHNvbWUgU3RyaW5nSU8gbWV0aG9kcy4KK2NsYXNzIF9TcG9vZk91dChTdHJpbmdJTyk6CisgICAgZGVmIGdldHZhbHVlKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTy5nZXR2YWx1ZShzZWxmKQorICAgICAgICAjIElmIGFueXRoaW5nIGF0IGFsbCB3YXMgd3JpdHRlbiwgbWFrZSBzdXJlIHRoZXJlJ3MgYSB0cmFpbGluZworICAgICAgICAjIG5ld2xpbmUuICBUaGVyZSdzIG5vIHdheSBmb3IgdGhlIGV4cGVjdGVkIG91dHB1dCB0byBpbmRpY2F0ZQorICAgICAgICAjIHRoYXQgYSB0cmFpbGluZyBuZXdsaW5lIGlzIG1pc3NpbmcuCisgICAgICAgIGlmIHJlc3VsdCBhbmQgbm90IHJlc3VsdC5lbmRzd2l0aCgiXG4iKToKKyAgICAgICAgICAgIHJlc3VsdCArPSAiXG4iCisgICAgICAgICMgUHJldmVudCBzb2Z0c3BhY2UgZnJvbSBzY3Jld2luZyB1cCB0aGUgbmV4dCB0ZXN0IGNhc2UsIGluCisgICAgICAgICMgY2FzZSB0aGV5IHVzZWQgcHJpbnQgd2l0aCBhIHRyYWlsaW5nIGNvbW1hIGluIGFuIGV4YW1wbGUuCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgInNvZnRzcGFjZSIpOgorICAgICAgICAgICAgZGVsIHNlbGYuc29mdHNwYWNlCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiB0cnVuY2F0ZShzZWxmLCAgIHNpemU9Tm9uZSk6CisgICAgICAgIFN0cmluZ0lPLnRydW5jYXRlKHNlbGYsIHNpemUpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgInNvZnRzcGFjZSIpOgorICAgICAgICAgICAgZGVsIHNlbGYuc29mdHNwYWNlCisgICAgICAgIGlmIG5vdCBzZWxmLmJ1ZjoKKyAgICAgICAgICAgICMgUmVzZXQgaXQgdG8gYW4gZW1wdHkgc3RyaW5nLCB0byBtYWtlIHN1cmUgaXQncyBub3QgdW5pY29kZS4KKyAgICAgICAgICAgIHNlbGYuYnVmID0gJycKKworIyBXb3JzdC1jYXNlIGxpbmVhci10aW1lIGVsbGlwc2lzIG1hdGNoaW5nLgorZGVmIF9lbGxpcHNpc19tYXRjaCh3YW50LCBnb3QpOgorICAgICIiIgorICAgIEVzc2VudGlhbGx5IHRoZSBvbmx5IHN1YnRsZSBjYXNlOgorICAgID4+PiBfZWxsaXBzaXNfbWF0Y2goJ2FhLi4uYWEnLCAnYWFhJykKKyAgICBGYWxzZQorICAgICIiIgorICAgIGlmIEVMTElQU0lTX01BUktFUiBub3QgaW4gd2FudDoKKyAgICAgICAgcmV0dXJuIHdhbnQgPT0gZ290CisKKyAgICAjIEZpbmQgInRoZSByZWFsIiBzdHJpbmdzLgorICAgIHdzID0gd2FudC5zcGxpdChFTExJUFNJU19NQVJLRVIpCisgICAgYXNzZXJ0IGxlbih3cykgPj0gMgorCisgICAgIyBEZWFsIHdpdGggZXhhY3QgbWF0Y2hlcyBwb3NzaWJseSBuZWVkZWQgYXQgb25lIG9yIGJvdGggZW5kcy4KKyAgICBzdGFydHBvcywgZW5kcG9zID0gMCwgbGVuKGdvdCkKKyAgICB3ID0gd3NbMF0KKyAgICBpZiB3OiAgICMgc3RhcnRzIHdpdGggZXhhY3QgbWF0Y2gKKyAgICAgICAgaWYgZ290LnN0YXJ0c3dpdGgodyk6CisgICAgICAgICAgICBzdGFydHBvcyA9IGxlbih3KQorICAgICAgICAgICAgZGVsIHdzWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICB3ID0gd3NbLTFdCisgICAgaWYgdzogICAjIGVuZHMgd2l0aCBleGFjdCBtYXRjaAorICAgICAgICBpZiBnb3QuZW5kc3dpdGgodyk6CisgICAgICAgICAgICBlbmRwb3MgLT0gbGVuKHcpCisgICAgICAgICAgICBkZWwgd3NbLTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIHN0YXJ0cG9zID4gZW5kcG9zOgorICAgICAgICAjIEV4YWN0IGVuZCBtYXRjaGVzIHJlcXVpcmVkIG1vcmUgY2hhcmFjdGVycyB0aGFuIHdlIGhhdmUsIGFzIGluCisgICAgICAgICMgX2VsbGlwc2lzX21hdGNoKCdhYS4uLmFhJywgJ2FhYScpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBGb3IgdGhlIHJlc3QsIHdlIG9ubHkgbmVlZCB0byBmaW5kIHRoZSBsZWZ0bW9zdCBub24tb3ZlcmxhcHBpbmcKKyAgICAjIG1hdGNoIGZvciBlYWNoIHBpZWNlLiAgSWYgdGhlcmUncyBubyBvdmVyYWxsIG1hdGNoIHRoYXQgd2F5IGFsb25lLAorICAgICMgdGhlcmUncyBubyBvdmVyYWxsIG1hdGNoIHBlcmlvZC4KKyAgICBmb3IgdyBpbiB3czoKKyAgICAgICAgIyB3IG1heSBiZSAnJyBhdCB0aW1lcywgaWYgdGhlcmUgYXJlIGNvbnNlY3V0aXZlIGVsbGlwc2VzLCBvcgorICAgICAgICAjIGR1ZSB0byBhbiBlbGxpcHNpcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGB3YW50YC4gIFRoYXQncyBPSy4KKyAgICAgICAgIyBTZWFyY2ggZm9yIGFuIGVtcHR5IHN0cmluZyBzdWNjZWVkcywgYW5kIGRvZXNuJ3QgY2hhbmdlIHN0YXJ0cG9zLgorICAgICAgICBzdGFydHBvcyA9IGdvdC5maW5kKHcsIHN0YXJ0cG9zLCBlbmRwb3MpCisgICAgICAgIGlmIHN0YXJ0cG9zIDwgMDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBzdGFydHBvcyArPSBsZW4odykKKworICAgIHJldHVybiBUcnVlCisKK2RlZiBfY29tbWVudF9saW5lKGxpbmUpOgorICAgICJSZXR1cm4gYSBjb21tZW50ZWQgZm9ybSBvZiB0aGUgZ2l2ZW4gbGluZSIKKyAgICBsaW5lID0gbGluZS5yc3RyaXAoKQorICAgIGlmIGxpbmU6CisgICAgICAgIHJldHVybiAnIyAnK2xpbmUKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gJyMnCisKK2NsYXNzIF9PdXRwdXRSZWRpcmVjdGluZ1BkYihwZGIuUGRiKToKKyAgICAiIiIKKyAgICBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgdGhlIHB5dGhvbiBkZWJ1Z2dlciB0aGF0IHJlZGlyZWN0cyBzdGRvdXQKKyAgICB0byBhIGdpdmVuIHN0cmVhbSB3aGVuIGludGVyYWN0aW5nIHdpdGggdGhlIHVzZXIuICBTdGRvdXQgaXMgKm5vdCoKKyAgICByZWRpcmVjdGVkIHdoZW4gdHJhY2VkIGNvZGUgaXMgZXhlY3V0ZWQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG91dCk6CisgICAgICAgIHNlbGYuX19vdXQgPSBvdXQKKyAgICAgICAgc2VsZi5fX2RlYnVnZ2VyX3VzZWQgPSBGYWxzZQorICAgICAgICBwZGIuUGRiLl9faW5pdF9fKHNlbGYsIHN0ZG91dD1vdXQpCisgICAgICAgICMgc3RpbGwgdXNlIGlucHV0KCkgdG8gZ2V0IHVzZXIgaW5wdXQKKyAgICAgICAgc2VsZi51c2VfcmF3aW5wdXQgPSAxCisKKyAgICBkZWYgc2V0X3RyYWNlKHNlbGYsIGZyYW1lPU5vbmUpOgorICAgICAgICBzZWxmLl9fZGVidWdnZXJfdXNlZCA9IFRydWUKKyAgICAgICAgaWYgZnJhbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgpLmZfYmFjaworICAgICAgICBwZGIuUGRiLnNldF90cmFjZShzZWxmLCBmcmFtZSkKKworICAgIGRlZiBzZXRfY29udGludWUoc2VsZik6CisgICAgICAgICMgQ2FsbGluZyBzZXRfY29udGludWUgdW5jb25kaXRpb25hbGx5IHdvdWxkIGJyZWFrIHVuaXQgdGVzdAorICAgICAgICAjIGNvdmVyYWdlIHJlcG9ydGluZywgYXMgQmRiLnNldF9jb250aW51ZSBjYWxscyBzeXMuc2V0dHJhY2UoTm9uZSkuCisgICAgICAgIGlmIHNlbGYuX19kZWJ1Z2dlcl91c2VkOgorICAgICAgICAgICAgcGRiLlBkYi5zZXRfY29udGludWUoc2VsZikKKworICAgIGRlZiB0cmFjZV9kaXNwYXRjaChzZWxmLCAqYXJncyk6CisgICAgICAgICMgUmVkaXJlY3Qgc3Rkb3V0IHRvIHRoZSBnaXZlbiBzdHJlYW0uCisgICAgICAgIHNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5fX291dAorICAgICAgICAjIENhbGwgUGRiJ3MgdHJhY2UgZGlzcGF0Y2ggbWV0aG9kLgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gcGRiLlBkYi50cmFjZV9kaXNwYXRjaChzZWxmLCAqYXJncykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlX3N0ZG91dAorCisjIFtYWF0gTm9ybWFsaXplIHdpdGggcmVzcGVjdCB0byBvcy5wYXRoLnBhcmRpcj8KK2RlZiBfbW9kdWxlX3JlbGF0aXZlX3BhdGgobW9kdWxlLCBwYXRoKToKKyAgICBpZiBub3QgaW5zcGVjdC5pc21vZHVsZShtb2R1bGUpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICdFeHBlY3RlZCBhIG1vZHVsZTogJXInICUgbW9kdWxlCisgICAgaWYgcGF0aC5zdGFydHN3aXRoKCcvJyk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdNb2R1bGUtcmVsYXRpdmUgZmlsZXMgbWF5IG5vdCBoYXZlIGFic29sdXRlIHBhdGhzJworCisgICAgIyBGaW5kIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHBhdGguCisgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX2ZpbGVfXycpOgorICAgICAgICAjIEEgbm9ybWFsIG1vZHVsZS9wYWNrYWdlCisgICAgICAgIGJhc2VkaXIgPSBvcy5wYXRoLnNwbGl0KG1vZHVsZS5fX2ZpbGVfXylbMF0KKyAgICBlbGlmIG1vZHVsZS5fX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICAgICAjIEFuIGludGVyYWN0aXZlIHNlc3Npb24uCisgICAgICAgIGlmIGxlbihzeXMuYXJndik+MCBhbmQgc3lzLmFyZ3ZbMF0gIT0gJyc6CisgICAgICAgICAgICBiYXNlZGlyID0gb3MucGF0aC5zcGxpdChzeXMuYXJndlswXSlbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhc2VkaXIgPSBvcy5jdXJkaXIKKyAgICBlbHNlOgorICAgICAgICAjIEEgbW9kdWxlIHcvbyBfX2ZpbGVfXyAodGhpcyBpbmNsdWRlcyBidWlsdGlucykKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2FuJ3QgcmVzb2x2ZSBwYXRocyByZWxhdGl2ZSB0byB0aGUgbW9kdWxlICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSArICIgKGl0IGhhcyBubyBfX2ZpbGVfXykiKQorCisgICAgIyBDb21iaW5lIHRoZSBiYXNlIGRpcmVjdG9yeSBhbmQgdGhlIHBhdGguCisgICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlZGlyLCAqKHBhdGguc3BsaXQoJy8nKSkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIDIuIEV4YW1wbGUgJiBEb2NUZXN0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAtIEFuICJleGFtcGxlIiBpcyBhIDxzb3VyY2UsIHdhbnQ+IHBhaXIsIHdoZXJlICJzb3VyY2UiIGlzIGEKKyMjICAgZnJhZ21lbnQgb2Ygc291cmNlIGNvZGUsIGFuZCAid2FudCIgaXMgdGhlIGV4cGVjdGVkIG91dHB1dCBmb3IKKyMjICAgInNvdXJjZS4iICBUaGUgRXhhbXBsZSBjbGFzcyBhbHNvIGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0CisjIyAgIHdoZXJlIHRoZSBleGFtcGxlIHdhcyBleHRyYWN0ZWQgZnJvbS4KKyMjCisjIyAtIEEgImRvY3Rlc3QiIGlzIGEgY29sbGVjdGlvbiBvZiBleGFtcGxlcywgdHlwaWNhbGx5IGV4dHJhY3RlZCBmcm9tCisjIyAgIGEgc3RyaW5nIChzdWNoIGFzIGFuIG9iamVjdCdzIGRvY3N0cmluZykuICBUaGUgRG9jVGVzdCBjbGFzcyBhbHNvCisjIyAgIGluY2x1ZGVzIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoZSBzdHJpbmcgd2FzIGV4dHJhY3RlZCBmcm9tLgorCitjbGFzcyBFeGFtcGxlOgorICAgICIiIgorICAgIEEgc2luZ2xlIGRvY3Rlc3QgZXhhbXBsZSwgY29uc2lzdGluZyBvZiBzb3VyY2UgY29kZSBhbmQgZXhwZWN0ZWQKKyAgICBvdXRwdXQuICBgRXhhbXBsZWAgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisKKyAgICAgIC0gc291cmNlOiBBIHNpbmdsZSBQeXRob24gc3RhdGVtZW50LCBhbHdheXMgZW5kaW5nIHdpdGggYSBuZXdsaW5lLgorICAgICAgICBUaGUgY29uc3RydWN0b3IgYWRkcyBhIG5ld2xpbmUgaWYgbmVlZGVkLgorCisgICAgICAtIHdhbnQ6IFRoZSBleHBlY3RlZCBvdXRwdXQgZnJvbSBydW5uaW5nIHRoZSBzb3VyY2UgY29kZSAoZWl0aGVyCisgICAgICAgIGZyb20gc3Rkb3V0LCBvciBhIHRyYWNlYmFjayBpbiBjYXNlIG9mIGV4Y2VwdGlvbikuICBgd2FudGAgZW5kcworICAgICAgICB3aXRoIGEgbmV3bGluZSB1bmxlc3MgaXQncyBlbXB0eSwgaW4gd2hpY2ggY2FzZSBpdCdzIGFuIGVtcHR5CisgICAgICAgIHN0cmluZy4gIFRoZSBjb25zdHJ1Y3RvciBhZGRzIGEgbmV3bGluZSBpZiBuZWVkZWQuCisKKyAgICAgIC0gZXhjX21zZzogVGhlIGV4Y2VwdGlvbiBtZXNzYWdlIGdlbmVyYXRlZCBieSB0aGUgZXhhbXBsZSwgaWYKKyAgICAgICAgdGhlIGV4YW1wbGUgaXMgZXhwZWN0ZWQgdG8gZ2VuZXJhdGUgYW4gZXhjZXB0aW9uOyBvciBgTm9uZWAgaWYKKyAgICAgICAgaXQgaXMgbm90IGV4cGVjdGVkIHRvIGdlbmVyYXRlIGFuIGV4Y2VwdGlvbi4gIFRoaXMgZXhjZXB0aW9uCisgICAgICAgIG1lc3NhZ2UgaXMgY29tcGFyZWQgYWdhaW5zdCB0aGUgcmV0dXJuIHZhbHVlIG9mCisgICAgICAgIGB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KClgLiAgYGV4Y19tc2dgIGVuZHMgd2l0aCBhCisgICAgICAgIG5ld2xpbmUgdW5sZXNzIGl0J3MgYE5vbmVgLiAgVGhlIGNvbnN0cnVjdG9yIGFkZHMgYSBuZXdsaW5lCisgICAgICAgIGlmIG5lZWRlZC4KKworICAgICAgLSBsaW5lbm86IFRoZSBsaW5lIG51bWJlciB3aXRoaW4gdGhlIERvY1Rlc3Qgc3RyaW5nIGNvbnRhaW5pbmcKKyAgICAgICAgdGhpcyBFeGFtcGxlIHdoZXJlIHRoZSBFeGFtcGxlIGJlZ2lucy4gIFRoaXMgbGluZSBudW1iZXIgaXMKKyAgICAgICAgemVyby1iYXNlZCwgd2l0aCByZXNwZWN0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIERvY1Rlc3QuCisKKyAgICAgIC0gaW5kZW50OiBUaGUgZXhhbXBsZSdzIGluZGVudGF0aW9uIGluIHRoZSBEb2NUZXN0IHN0cmluZy4KKyAgICAgICAgSS5lLiwgdGhlIG51bWJlciBvZiBzcGFjZSBjaGFyYWN0ZXJzIHRoYXQgcHJlY2VlZCB0aGUKKyAgICAgICAgZXhhbXBsZSdzIGZpcnN0IHByb21wdC4KKworICAgICAgLSBvcHRpb25zOiBBIGRpY3Rpb25hcnkgbWFwcGluZyBmcm9tIG9wdGlvbiBmbGFncyB0byBUcnVlIG9yCisgICAgICAgIEZhbHNlLCB3aGljaCBpcyB1c2VkIHRvIG92ZXJyaWRlIGRlZmF1bHQgb3B0aW9ucyBmb3IgdGhpcworICAgICAgICBleGFtcGxlLiAgQW55IG9wdGlvbiBmbGFncyBub3QgY29udGFpbmVkIGluIHRoaXMgZGljdGlvbmFyeQorICAgICAgICBhcmUgbGVmdCBhdCB0aGVpciBkZWZhdWx0IHZhbHVlIChhcyBzcGVjaWZpZWQgYnkgdGhlCisgICAgICAgIERvY1Rlc3RSdW5uZXIncyBvcHRpb25mbGFncykuICBCeSBkZWZhdWx0LCBubyBvcHRpb25zIGFyZSBzZXQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSwgd2FudCwgZXhjX21zZz1Ob25lLCBsaW5lbm89MCwgaW5kZW50PTAsCisgICAgICAgICAgICAgICAgIG9wdGlvbnM9Tm9uZSk6CisgICAgICAgICMgTm9ybWFsaXplIGlucHV0cy4KKyAgICAgICAgaWYgbm90IHNvdXJjZS5lbmRzd2l0aCgnXG4nKToKKyAgICAgICAgICAgIHNvdXJjZSArPSAnXG4nCisgICAgICAgIGlmIHdhbnQgYW5kIG5vdCB3YW50LmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgd2FudCArPSAnXG4nCisgICAgICAgIGlmIGV4Y19tc2cgaXMgbm90IE5vbmUgYW5kIG5vdCBleGNfbXNnLmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgZXhjX21zZyArPSAnXG4nCisgICAgICAgICMgU3RvcmUgcHJvcGVydGllcy4KKyAgICAgICAgc2VsZi5zb3VyY2UgPSBzb3VyY2UKKyAgICAgICAgc2VsZi53YW50ID0gd2FudAorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworICAgICAgICBzZWxmLmluZGVudCA9IGluZGVudAorICAgICAgICBpZiBvcHRpb25zIGlzIE5vbmU6IG9wdGlvbnMgPSB7fQorICAgICAgICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIHNlbGYuZXhjX21zZyA9IGV4Y19tc2cKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiB0eXBlKHNlbGYpIGlzIG5vdCB0eXBlKG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgICAgIHJldHVybiBzZWxmLnNvdXJjZSA9PSBvdGhlci5zb3VyY2UgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYud2FudCA9PSBvdGhlci53YW50IGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9PSBvdGhlci5saW5lbm8gYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuaW5kZW50ID09IG90aGVyLmluZGVudCBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zID09IG90aGVyLm9wdGlvbnMgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuZXhjX21zZyA9PSBvdGhlci5leGNfbXNnCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKChzZWxmLnNvdXJjZSwgc2VsZi53YW50LCBzZWxmLmxpbmVubywgc2VsZi5pbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLmV4Y19tc2cpKQorCisKK2NsYXNzIERvY1Rlc3Q6CisgICAgIiIiCisgICAgQSBjb2xsZWN0aW9uIG9mIGRvY3Rlc3QgZXhhbXBsZXMgdGhhdCBzaG91bGQgYmUgcnVuIGluIGEgc2luZ2xlCisgICAgbmFtZXNwYWNlLiAgRWFjaCBgRG9jVGVzdGAgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisKKyAgICAgIC0gZXhhbXBsZXM6IHRoZSBsaXN0IG9mIGV4YW1wbGVzLgorCisgICAgICAtIGdsb2JzOiBUaGUgbmFtZXNwYWNlIChha2EgZ2xvYmFscykgdGhhdCB0aGUgZXhhbXBsZXMgc2hvdWxkCisgICAgICAgIGJlIHJ1biBpbi4KKworICAgICAgLSBuYW1lOiBBIG5hbWUgaWRlbnRpZnlpbmcgdGhlIERvY1Rlc3QgKHR5cGljYWxseSwgdGhlIG5hbWUgb2YKKyAgICAgICAgdGhlIG9iamVjdCB3aG9zZSBkb2NzdHJpbmcgdGhpcyBEb2NUZXN0IHdhcyBleHRyYWN0ZWQgZnJvbSkuCisKKyAgICAgIC0gZmlsZW5hbWU6IFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoYXQgdGhpcyBEb2NUZXN0IHdhcyBleHRyYWN0ZWQKKyAgICAgICAgZnJvbSwgb3IgYE5vbmVgIGlmIHRoZSBmaWxlbmFtZSBpcyB1bmtub3duLgorCisgICAgICAtIGxpbmVubzogVGhlIGxpbmUgbnVtYmVyIHdpdGhpbiBmaWxlbmFtZSB3aGVyZSB0aGlzIERvY1Rlc3QKKyAgICAgICAgYmVnaW5zLCBvciBgTm9uZWAgaWYgdGhlIGxpbmUgbnVtYmVyIGlzIHVuYXZhaWxhYmxlLiAgVGhpcworICAgICAgICBsaW5lIG51bWJlciBpcyB6ZXJvLWJhc2VkLCB3aXRoIHJlc3BlY3QgdG8gdGhlIGJlZ2lubmluZyBvZgorICAgICAgICB0aGUgZmlsZS4KKworICAgICAgLSBkb2NzdHJpbmc6IFRoZSBzdHJpbmcgdGhhdCB0aGUgZXhhbXBsZXMgd2VyZSBleHRyYWN0ZWQgZnJvbSwKKyAgICAgICAgb3IgYE5vbmVgIGlmIHRoZSBzdHJpbmcgaXMgdW5hdmFpbGFibGUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4YW1wbGVzLCBnbG9icywgbmFtZSwgZmlsZW5hbWUsIGxpbmVubywgZG9jc3RyaW5nKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBhIG5ldyBEb2NUZXN0IGNvbnRhaW5pbmcgdGhlIGdpdmVuIGV4YW1wbGVzLiAgVGhlCisgICAgICAgIERvY1Rlc3QncyBnbG9iYWxzIGFyZSBpbml0aWFsaXplZCB3aXRoIGEgY29weSBvZiBgZ2xvYnNgLgorICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IG5vdCBpc2luc3RhbmNlKGV4YW1wbGVzLCBiYXNlc3RyaW5nKSwgXAorICAgICAgICAgICAgICAgIkRvY1Rlc3Qgbm8gbG9uZ2VyIGFjY2VwdHMgc3RyOyB1c2UgRG9jVGVzdFBhcnNlciBpbnN0ZWFkIgorICAgICAgICBzZWxmLmV4YW1wbGVzID0gZXhhbXBsZXMKKyAgICAgICAgc2VsZi5kb2NzdHJpbmcgPSBkb2NzdHJpbmcKKyAgICAgICAgc2VsZi5nbG9icyA9IGdsb2JzLmNvcHkoKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBpZiBsZW4oc2VsZi5leGFtcGxlcykgPT0gMDoKKyAgICAgICAgICAgIGV4YW1wbGVzID0gJ25vIGV4YW1wbGVzJworICAgICAgICBlbGlmIGxlbihzZWxmLmV4YW1wbGVzKSA9PSAxOgorICAgICAgICAgICAgZXhhbXBsZXMgPSAnMSBleGFtcGxlJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhhbXBsZXMgPSAnJWQgZXhhbXBsZXMnICUgbGVuKHNlbGYuZXhhbXBsZXMpCisgICAgICAgIHJldHVybiAoJzxEb2NUZXN0ICVzIGZyb20gJXM6JXMgKCVzKT4nICUKKyAgICAgICAgICAgICAgICAoc2VsZi5uYW1lLCBzZWxmLmZpbGVuYW1lLCBzZWxmLmxpbmVubywgZXhhbXBsZXMpKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHR5cGUoc2VsZikgaXMgbm90IHR5cGUob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhhbXBsZXMgPT0gb3RoZXIuZXhhbXBsZXMgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuZG9jc3RyaW5nID09IG90aGVyLmRvY3N0cmluZyBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5nbG9icyA9PSBvdGhlci5nbG9icyBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5uYW1lID09IG90aGVyLm5hbWUgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPT0gb3RoZXIuZmlsZW5hbWUgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYubGluZW5vID09IG90aGVyLmxpbmVubworCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaCgoc2VsZi5kb2NzdHJpbmcsIHNlbGYubmFtZSwgc2VsZi5maWxlbmFtZSwgc2VsZi5saW5lbm8pKQorCisgICAgIyBUaGlzIGxldHMgdXMgc29ydCB0ZXN0cyBieSBuYW1lOgorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIERvY1Rlc3QpOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIHJldHVybiBjbXAoKHNlbGYubmFtZSwgc2VsZi5maWxlbmFtZSwgc2VsZi5saW5lbm8sIGlkKHNlbGYpKSwKKyAgICAgICAgICAgICAgICAgICAob3RoZXIubmFtZSwgb3RoZXIuZmlsZW5hbWUsIG90aGVyLmxpbmVubywgaWQob3RoZXIpKSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgMy4gRG9jVGVzdFBhcnNlcgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBEb2NUZXN0UGFyc2VyOgorICAgICIiIgorICAgIEEgY2xhc3MgdXNlZCB0byBwYXJzZSBzdHJpbmdzIGNvbnRhaW5pbmcgZG9jdGVzdCBleGFtcGxlcy4KKyAgICAiIiIKKyAgICAjIFRoaXMgcmVndWxhciBleHByZXNzaW9uIGlzIHVzZWQgdG8gZmluZCBkb2N0ZXN0IGV4YW1wbGVzIGluIGEKKyAgICAjIHN0cmluZy4gIEl0IGRlZmluZXMgdGhyZWUgZ3JvdXBzOiBgc291cmNlYCBpcyB0aGUgc291cmNlIGNvZGUKKyAgICAjIChpbmNsdWRpbmcgbGVhZGluZyBpbmRlbnRhdGlvbiBhbmQgcHJvbXB0cyk7IGBpbmRlbnRgIGlzIHRoZQorICAgICMgaW5kZW50YXRpb24gb2YgdGhlIGZpcnN0IChQUzEpIGxpbmUgb2YgdGhlIHNvdXJjZSBjb2RlOyBhbmQKKyAgICAjIGB3YW50YCBpcyB0aGUgZXhwZWN0ZWQgb3V0cHV0IChpbmNsdWRpbmcgbGVhZGluZyBpbmRlbnRhdGlvbikuCisgICAgX0VYQU1QTEVfUkUgPSByZS5jb21waWxlKHInJycKKyAgICAgICAgIyBTb3VyY2UgY29uc2lzdHMgb2YgYSBQUzEgbGluZSBmb2xsb3dlZCBieSB6ZXJvIG9yIG1vcmUgUFMyIGxpbmVzLgorICAgICAgICAoP1A8c291cmNlPgorICAgICAgICAgICAgKD86Xig/UDxpbmRlbnQ+IFsgXSopID4+PiAgICAuKikgICAgIyBQUzEgbGluZQorICAgICAgICAgICAgKD86XG4gICAgICAgICAgIFsgXSogIFwuXC5cLiAuKikqKSAgIyBQUzIgbGluZXMKKyAgICAgICAgXG4/CisgICAgICAgICMgV2FudCBjb25zaXN0cyBvZiBhbnkgbm9uLWJsYW5rIGxpbmVzIHRoYXQgZG8gbm90IHN0YXJ0IHdpdGggUFMxLgorICAgICAgICAoP1A8d2FudD4gKD86KD8hWyBdKiQpICAgICMgTm90IGEgYmxhbmsgbGluZQorICAgICAgICAgICAgICAgICAgICAgKD8hWyBdKj4+PikgICMgTm90IGEgbGluZSBzdGFydGluZyB3aXRoIFBTMQorICAgICAgICAgICAgICAgICAgICAgLiokXG4/ICAgICAgICMgQnV0IGFueSBvdGhlciBsaW5lCisgICAgICAgICAgICAgICAgICApKikKKyAgICAgICAgJycnLCByZS5NVUxUSUxJTkUgfCByZS5WRVJCT1NFKQorCisgICAgIyBBIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgaGFuZGxpbmcgYHdhbnRgIHN0cmluZ3MgdGhhdCBjb250YWluCisgICAgIyBleHBlY3RlZCBleGNlcHRpb25zLiAgSXQgZGl2aWRlcyBgd2FudGAgaW50byB0aHJlZSBwaWVjZXM6CisgICAgIyAgICAtIHRoZSB0cmFjZWJhY2sgaGVhZGVyIGxpbmUgKGBoZHJgKQorICAgICMgICAgLSB0aGUgdHJhY2ViYWNrIHN0YWNrIChgc3RhY2tgKQorICAgICMgICAgLSB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgKGBtc2dgKSwgYXMgZ2VuZXJhdGVkIGJ5CisgICAgIyAgICAgIHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkoKQorICAgICMgYG1zZ2AgbWF5IGhhdmUgbXVsdGlwbGUgbGluZXMuICBXZSBhc3N1bWUvcmVxdWlyZSB0aGF0IHRoZQorICAgICMgZXhjZXB0aW9uIG1lc3NhZ2UgaXMgdGhlIGZpcnN0IG5vbi1pbmRlbnRlZCBsaW5lIHN0YXJ0aW5nIHdpdGggYSB3b3JkCisgICAgIyBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZSB0cmFjZWJhY2sgaGVhZGVyIGxpbmUuCisgICAgX0VYQ0VQVElPTl9SRSA9IHJlLmNvbXBpbGUociIiIgorICAgICAgICAjIEdyYWIgdGhlIHRyYWNlYmFjayBoZWFkZXIuICBEaWZmZXJlbnQgdmVyc2lvbnMgb2YgUHl0aG9uIGhhdmUKKyAgICAgICAgIyBzYWlkIGRpZmZlcmVudCB0aGluZ3Mgb24gdGhlIGZpcnN0IHRyYWNlYmFjayBsaW5lLgorICAgICAgICBeKD9QPGhkcj4gVHJhY2ViYWNrXCBcKAorICAgICAgICAgICAgKD86IG1vc3RcIHJlY2VudFwgY2FsbFwgbGFzdAorICAgICAgICAgICAgfCAgIGlubmVybW9zdFwgbGFzdAorICAgICAgICAgICAgKSBcKSA6CisgICAgICAgICkKKyAgICAgICAgXHMqICQgICAgICAgICAgICAgICAgIyB0b3NzIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb24gdGhlIGhlYWRlci4KKyAgICAgICAgKD9QPHN0YWNrPiAuKj8pICAgICAgIyBkb24ndCBibGluazogYWJzb3JiIHN0dWZmIHVudGlsLi4uCisgICAgICAgIF4gKD9QPG1zZz4gXHcrIC4qKSAgICMgICAgIGEgbGluZSAqc3RhcnRzKiB3aXRoIGFscGhhbnVtLgorICAgICAgICAiIiIsIHJlLlZFUkJPU0UgfCByZS5NVUxUSUxJTkUgfCByZS5ET1RBTEwpCisKKyAgICAjIEEgY2FsbGFibGUgcmV0dXJuaW5nIGEgdHJ1ZSB2YWx1ZSBpZmYgaXRzIGFyZ3VtZW50IGlzIGEgYmxhbmsgbGluZQorICAgICMgb3IgY29udGFpbnMgYSBzaW5nbGUgY29tbWVudC4KKyAgICBfSVNfQkxBTktfT1JfQ09NTUVOVCA9IHJlLmNvbXBpbGUocideWyBdKigjLiopPyQnKS5tYXRjaAorCisgICAgZGVmIHBhcnNlKHNlbGYsIHN0cmluZywgbmFtZT0nPHN0cmluZz4nKToKKyAgICAgICAgIiIiCisgICAgICAgIERpdmlkZSB0aGUgZ2l2ZW4gc3RyaW5nIGludG8gZXhhbXBsZXMgYW5kIGludGVydmVuaW5nIHRleHQsCisgICAgICAgIGFuZCByZXR1cm4gdGhlbSBhcyBhIGxpc3Qgb2YgYWx0ZXJuYXRpbmcgRXhhbXBsZXMgYW5kIHN0cmluZ3MuCisgICAgICAgIExpbmUgbnVtYmVycyBmb3IgdGhlIEV4YW1wbGVzIGFyZSAwLWJhc2VkLiAgVGhlIG9wdGlvbmFsCisgICAgICAgIGFyZ3VtZW50IGBuYW1lYCBpcyBhIG5hbWUgaWRlbnRpZnlpbmcgdGhpcyBzdHJpbmcsIGFuZCBpcyBvbmx5CisgICAgICAgIHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLgorICAgICAgICAiIiIKKyAgICAgICAgc3RyaW5nID0gc3RyaW5nLmV4cGFuZHRhYnMoKQorICAgICAgICAjIElmIGFsbCBsaW5lcyBiZWdpbiB3aXRoIHRoZSBzYW1lIGluZGVudGF0aW9uLCB0aGVuIHN0cmlwIGl0LgorICAgICAgICBtaW5faW5kZW50ID0gc2VsZi5fbWluX2luZGVudChzdHJpbmcpCisgICAgICAgIGlmIG1pbl9pbmRlbnQgPiAwOgorICAgICAgICAgICAgc3RyaW5nID0gJ1xuJy5qb2luKFtsW21pbl9pbmRlbnQ6XSBmb3IgbCBpbiBzdHJpbmcuc3BsaXQoJ1xuJyldKQorCisgICAgICAgIG91dHB1dCA9IFtdCisgICAgICAgIGNoYXJubywgbGluZW5vID0gMCwgMAorICAgICAgICAjIEZpbmQgYWxsIGRvY3Rlc3QgZXhhbXBsZXMgaW4gdGhlIHN0cmluZzoKKyAgICAgICAgZm9yIG0gaW4gc2VsZi5fRVhBTVBMRV9SRS5maW5kaXRlcihzdHJpbmcpOgorICAgICAgICAgICAgIyBBZGQgdGhlIHByZS1leGFtcGxlIHRleHQgdG8gYG91dHB1dGAuCisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKHN0cmluZ1tjaGFybm86bS5zdGFydCgpXSkKKyAgICAgICAgICAgICMgVXBkYXRlIGxpbmVubyAobGluZXMgYmVmb3JlIHRoaXMgZXhhbXBsZSkKKyAgICAgICAgICAgIGxpbmVubyArPSBzdHJpbmcuY291bnQoJ1xuJywgY2hhcm5vLCBtLnN0YXJ0KCkpCisgICAgICAgICAgICAjIEV4dHJhY3QgaW5mbyBmcm9tIHRoZSByZWdleHAgbWF0Y2guCisgICAgICAgICAgICAoc291cmNlLCBvcHRpb25zLCB3YW50LCBleGNfbXNnKSA9IFwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlX2V4YW1wbGUobSwgbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgIyBDcmVhdGUgYW4gRXhhbXBsZSwgYW5kIGFkZCBpdCB0byB0aGUgbGlzdC4KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9JU19CTEFOS19PUl9DT01NRU5UKHNvdXJjZSk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCggRXhhbXBsZShzb3VyY2UsIHdhbnQsIGV4Y19tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50PW1pbl9pbmRlbnQrbGVuKG0uZ3JvdXAoJ2luZGVudCcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9b3B0aW9ucykgKQorICAgICAgICAgICAgIyBVcGRhdGUgbGluZW5vIChsaW5lcyBpbnNpZGUgdGhpcyBleGFtcGxlKQorICAgICAgICAgICAgbGluZW5vICs9IHN0cmluZy5jb3VudCgnXG4nLCBtLnN0YXJ0KCksIG0uZW5kKCkpCisgICAgICAgICAgICAjIFVwZGF0ZSBjaGFybm8uCisgICAgICAgICAgICBjaGFybm8gPSBtLmVuZCgpCisgICAgICAgICMgQWRkIGFueSByZW1haW5pbmcgcG9zdC1leGFtcGxlIHRleHQgdG8gYG91dHB1dGAuCisgICAgICAgIG91dHB1dC5hcHBlbmQoc3RyaW5nW2NoYXJubzpdKQorICAgICAgICByZXR1cm4gb3V0cHV0CisKKyAgICBkZWYgZ2V0X2RvY3Rlc3Qoc2VsZiwgc3RyaW5nLCBnbG9icywgbmFtZSwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgICAgICIiIgorICAgICAgICBFeHRyYWN0IGFsbCBkb2N0ZXN0IGV4YW1wbGVzIGZyb20gdGhlIGdpdmVuIHN0cmluZywgYW5kCisgICAgICAgIGNvbGxlY3QgdGhlbSBpbnRvIGEgYERvY1Rlc3RgIG9iamVjdC4KKworICAgICAgICBgZ2xvYnNgLCBgbmFtZWAsIGBmaWxlbmFtZWAsIGFuZCBgbGluZW5vYCBhcmUgYXR0cmlidXRlcyBmb3IKKyAgICAgICAgdGhlIG5ldyBgRG9jVGVzdGAgb2JqZWN0LiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgRG9jVGVzdGAKKyAgICAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gRG9jVGVzdChzZWxmLmdldF9leGFtcGxlcyhzdHJpbmcsIG5hbWUpLCBnbG9icywKKyAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZmlsZW5hbWUsIGxpbmVubywgc3RyaW5nKQorCisgICAgZGVmIGdldF9leGFtcGxlcyhzZWxmLCBzdHJpbmcsIG5hbWU9JzxzdHJpbmc+Jyk6CisgICAgICAgICIiIgorICAgICAgICBFeHRyYWN0IGFsbCBkb2N0ZXN0IGV4YW1wbGVzIGZyb20gdGhlIGdpdmVuIHN0cmluZywgYW5kIHJldHVybgorICAgICAgICB0aGVtIGFzIGEgbGlzdCBvZiBgRXhhbXBsZWAgb2JqZWN0cy4gIExpbmUgbnVtYmVycyBhcmUKKyAgICAgICAgMC1iYXNlZCwgYmVjYXVzZSBpdCdzIG1vc3QgY29tbW9uIGluIGRvY3Rlc3RzIHRoYXQgbm90aGluZworICAgICAgICBpbnRlcmVzdGluZyBhcHBlYXJzIG9uIHRoZSBzYW1lIGxpbmUgYXMgb3BlbmluZyB0cmlwbGUtcXVvdGUsCisgICAgICAgIGFuZCBzbyB0aGUgZmlyc3QgaW50ZXJlc3RpbmcgbGluZSBpcyBjYWxsZWQgXCJsaW5lIDFcIiB0aGVuLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBhcmd1bWVudCBgbmFtZWAgaXMgYSBuYW1lIGlkZW50aWZ5aW5nIHRoaXMKKyAgICAgICAgc3RyaW5nLCBhbmQgaXMgb25seSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBbeCBmb3IgeCBpbiBzZWxmLnBhcnNlKHN0cmluZywgbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHgsIEV4YW1wbGUpXQorCisgICAgZGVmIF9wYXJzZV9leGFtcGxlKHNlbGYsIG0sIG5hbWUsIGxpbmVubyk6CisgICAgICAgICIiIgorICAgICAgICBHaXZlbiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaCBmcm9tIGBfRVhBTVBMRV9SRWAgKGBtYCksCisgICAgICAgIHJldHVybiBhIHBhaXIgYChzb3VyY2UsIHdhbnQpYCwgd2hlcmUgYHNvdXJjZWAgaXMgdGhlIG1hdGNoZWQKKyAgICAgICAgZXhhbXBsZSdzIHNvdXJjZSBjb2RlICh3aXRoIHByb21wdHMgYW5kIGluZGVudGF0aW9uIHN0cmlwcGVkKTsKKyAgICAgICAgYW5kIGB3YW50YCBpcyB0aGUgZXhhbXBsZSdzIGV4cGVjdGVkIG91dHB1dCAod2l0aCBpbmRlbnRhdGlvbgorICAgICAgICBzdHJpcHBlZCkuCisKKyAgICAgICAgYG5hbWVgIGlzIHRoZSBzdHJpbmcncyBuYW1lLCBhbmQgYGxpbmVub2AgaXMgdGhlIGxpbmUgbnVtYmVyCisgICAgICAgIHdoZXJlIHRoZSBleGFtcGxlIHN0YXJ0czsgYm90aCBhcmUgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuCisgICAgICAgICIiIgorICAgICAgICAjIEdldCB0aGUgZXhhbXBsZSdzIGluZGVudGF0aW9uIGxldmVsLgorICAgICAgICBpbmRlbnQgPSBsZW4obS5ncm91cCgnaW5kZW50JykpCisKKyAgICAgICAgIyBEaXZpZGUgc291cmNlIGludG8gbGluZXM7IGNoZWNrIHRoYXQgdGhleSdyZSBwcm9wZXJseQorICAgICAgICAjIGluZGVudGVkOyBhbmQgdGhlbiBzdHJpcCB0aGVpciBpbmRlbnRhdGlvbiAmIHByb21wdHMuCisgICAgICAgIHNvdXJjZV9saW5lcyA9IG0uZ3JvdXAoJ3NvdXJjZScpLnNwbGl0KCdcbicpCisgICAgICAgIHNlbGYuX2NoZWNrX3Byb21wdF9ibGFuayhzb3VyY2VfbGluZXMsIGluZGVudCwgbmFtZSwgbGluZW5vKQorICAgICAgICBzZWxmLl9jaGVja19wcmVmaXgoc291cmNlX2xpbmVzWzE6XSwgJyAnKmluZGVudCArICcuJywgbmFtZSwgbGluZW5vKQorICAgICAgICBzb3VyY2UgPSAnXG4nLmpvaW4oW3NsW2luZGVudCs0Ol0gZm9yIHNsIGluIHNvdXJjZV9saW5lc10pCisKKyAgICAgICAgIyBEaXZpZGUgd2FudCBpbnRvIGxpbmVzOyBjaGVjayB0aGF0IGl0J3MgcHJvcGVybHkgaW5kZW50ZWQ7IGFuZAorICAgICAgICAjIHRoZW4gc3RyaXAgdGhlIGluZGVudGF0aW9uLiAgU3BhY2VzIGJlZm9yZSB0aGUgbGFzdCBuZXdsaW5lIHNob3VsZAorICAgICAgICAjIGJlIHByZXNlcnZlZCwgc28gcGxhaW4gcnN0cmlwKCkgaXNuJ3QgZ29vZCBlbm91Z2guCisgICAgICAgIHdhbnQgPSBtLmdyb3VwKCd3YW50JykKKyAgICAgICAgd2FudF9saW5lcyA9IHdhbnQuc3BsaXQoJ1xuJykKKyAgICAgICAgaWYgbGVuKHdhbnRfbGluZXMpID4gMSBhbmQgcmUubWF0Y2gocicgKiQnLCB3YW50X2xpbmVzWy0xXSk6CisgICAgICAgICAgICBkZWwgd2FudF9saW5lc1stMV0gICMgZm9yZ2V0IGZpbmFsIG5ld2xpbmUgJiBzcGFjZXMgYWZ0ZXIgaXQKKyAgICAgICAgc2VsZi5fY2hlY2tfcHJlZml4KHdhbnRfbGluZXMsICcgJyppbmRlbnQsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8gKyBsZW4oc291cmNlX2xpbmVzKSkKKyAgICAgICAgd2FudCA9ICdcbicuam9pbihbd2xbaW5kZW50Ol0gZm9yIHdsIGluIHdhbnRfbGluZXNdKQorCisgICAgICAgICMgSWYgYHdhbnRgIGNvbnRhaW5zIGEgdHJhY2ViYWNrIG1lc3NhZ2UsIHRoZW4gZXh0cmFjdCBpdC4KKyAgICAgICAgbSA9IHNlbGYuX0VYQ0VQVElPTl9SRS5tYXRjaCh3YW50KQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgZXhjX21zZyA9IG0uZ3JvdXAoJ21zZycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleGNfbXNnID0gTm9uZQorCisgICAgICAgICMgRXh0cmFjdCBvcHRpb25zIGZyb20gdGhlIHNvdXJjZS4KKyAgICAgICAgb3B0aW9ucyA9IHNlbGYuX2ZpbmRfb3B0aW9ucyhzb3VyY2UsIG5hbWUsIGxpbmVubykKKworICAgICAgICByZXR1cm4gc291cmNlLCBvcHRpb25zLCB3YW50LCBleGNfbXNnCisKKyAgICAjIFRoaXMgcmVndWxhciBleHByZXNzaW9uIGxvb2tzIGZvciBvcHRpb24gZGlyZWN0aXZlcyBpbiB0aGUKKyAgICAjIHNvdXJjZSBjb2RlIG9mIGFuIGV4YW1wbGUuICBPcHRpb24gZGlyZWN0aXZlcyBhcmUgY29tbWVudHMKKyAgICAjIHN0YXJ0aW5nIHdpdGggImRvY3Rlc3Q6Ii4gIFdhcm5pbmc6IHRoaXMgbWF5IGdpdmUgZmFsc2UKKyAgICAjIHBvc2l0aXZlcyBmb3Igc3RyaW5nLWxpdGVyYWxzIHRoYXQgY29udGFpbiB0aGUgc3RyaW5nCisgICAgIyAiI2RvY3Rlc3Q6Ii4gIEVsaW1pbmF0aW5nIHRoZXNlIGZhbHNlIHBvc2l0aXZlcyB3b3VsZCByZXF1aXJlCisgICAgIyBhY3R1YWxseSBwYXJzaW5nIHRoZSBzdHJpbmc7IGJ1dCB3ZSBsaW1pdCB0aGVtIGJ5IGlnbm9yaW5nIGFueQorICAgICMgbGluZSBjb250YWluaW5nICIjZG9jdGVzdDoiIHRoYXQgaXMgKmZvbGxvd2VkKiBieSBhIHF1b3RlIG1hcmsuCisgICAgX09QVElPTl9ESVJFQ1RJVkVfUkUgPSByZS5jb21waWxlKHInI1xzKmRvY3Rlc3Q6XHMqKFteXG5cJyJdKikkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuTVVMVElMSU5FKQorCisgICAgZGVmIF9maW5kX29wdGlvbnMoc2VsZiwgc291cmNlLCBuYW1lLCBsaW5lbm8pOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIG9wdGlvbiBvdmVycmlkZXMgZXh0cmFjdGVkIGZyb20KKyAgICAgICAgb3B0aW9uIGRpcmVjdGl2ZXMgaW4gdGhlIGdpdmVuIHNvdXJjZSBzdHJpbmcuCisKKyAgICAgICAgYG5hbWVgIGlzIHRoZSBzdHJpbmcncyBuYW1lLCBhbmQgYGxpbmVub2AgaXMgdGhlIGxpbmUgbnVtYmVyCisgICAgICAgIHdoZXJlIHRoZSBleGFtcGxlIHN0YXJ0czsgYm90aCBhcmUgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuCisgICAgICAgICIiIgorICAgICAgICBvcHRpb25zID0ge30KKyAgICAgICAgIyAobm90ZTogd2l0aCB0aGUgY3VycmVudCByZWdleHAsIHRoaXMgd2lsbCBtYXRjaCBhdCBtb3N0IG9uY2U6KQorICAgICAgICBmb3IgbSBpbiBzZWxmLl9PUFRJT05fRElSRUNUSVZFX1JFLmZpbmRpdGVyKHNvdXJjZSk6CisgICAgICAgICAgICBvcHRpb25fc3RyaW5ncyA9IG0uZ3JvdXAoMSkucmVwbGFjZSgnLCcsICcgJykuc3BsaXQoKQorICAgICAgICAgICAgZm9yIG9wdGlvbiBpbiBvcHRpb25fc3RyaW5nczoKKyAgICAgICAgICAgICAgICBpZiAob3B0aW9uWzBdIG5vdCBpbiAnKy0nIG9yCisgICAgICAgICAgICAgICAgICAgIG9wdGlvblsxOl0gbm90IGluIE9QVElPTkZMQUdTX0JZX05BTUUpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsaW5lICVyIG9mIHRoZSBkb2N0ZXN0IGZvciAlcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhcyBhbiBpbnZhbGlkIG9wdGlvbjogJXInICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGluZW5vKzEsIG5hbWUsIG9wdGlvbikpCisgICAgICAgICAgICAgICAgZmxhZyA9IE9QVElPTkZMQUdTX0JZX05BTUVbb3B0aW9uWzE6XV0KKyAgICAgICAgICAgICAgICBvcHRpb25zW2ZsYWddID0gKG9wdGlvblswXSA9PSAnKycpCisgICAgICAgIGlmIG9wdGlvbnMgYW5kIHNlbGYuX0lTX0JMQU5LX09SX0NPTU1FTlQoc291cmNlKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xpbmUgJXIgb2YgdGhlIGRvY3Rlc3QgZm9yICVzIGhhcyBhbiBvcHRpb24gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlyZWN0aXZlIG9uIGEgbGluZSB3aXRoIG5vIGV4YW1wbGU6ICVyJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5lbm8sIG5hbWUsIHNvdXJjZSkpCisgICAgICAgIHJldHVybiBvcHRpb25zCisKKyAgICAjIFRoaXMgcmVndWxhciBleHByZXNzaW9uIGZpbmRzIHRoZSBpbmRlbnRhdGlvbiBvZiBldmVyeSBub24tYmxhbmsKKyAgICAjIGxpbmUgaW4gYSBzdHJpbmcuCisgICAgX0lOREVOVF9SRSA9IHJlLmNvbXBpbGUoJ14oWyBdKikoPz1cUyknLCByZS5NVUxUSUxJTkUpCisKKyAgICBkZWYgX21pbl9pbmRlbnQoc2VsZiwgcyk6CisgICAgICAgICJSZXR1cm4gdGhlIG1pbmltdW0gaW5kZW50YXRpb24gb2YgYW55IG5vbi1ibGFuayBsaW5lIGluIGBzYCIKKyAgICAgICAgaW5kZW50cyA9IFtsZW4oaW5kZW50KSBmb3IgaW5kZW50IGluIHNlbGYuX0lOREVOVF9SRS5maW5kYWxsKHMpXQorICAgICAgICBpZiBsZW4oaW5kZW50cykgPiAwOgorICAgICAgICAgICAgcmV0dXJuIG1pbihpbmRlbnRzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBfY2hlY2tfcHJvbXB0X2JsYW5rKHNlbGYsIGxpbmVzLCBpbmRlbnQsIG5hbWUsIGxpbmVubyk6CisgICAgICAgICIiIgorICAgICAgICBHaXZlbiB0aGUgbGluZXMgb2YgYSBzb3VyY2Ugc3RyaW5nIChpbmNsdWRpbmcgcHJvbXB0cyBhbmQKKyAgICAgICAgbGVhZGluZyBpbmRlbnRhdGlvbiksIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IGV2ZXJ5IHByb21wdCBpcworICAgICAgICBmb2xsb3dlZCBieSBhIHNwYWNlIGNoYXJhY3Rlci4gIElmIGFueSBsaW5lIGlzIG5vdCBmb2xsb3dlZCBieQorICAgICAgICBhIHNwYWNlIGNoYXJhY3RlciwgdGhlbiByYWlzZSBWYWx1ZUVycm9yLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGksIGxpbmUgaW4gZW51bWVyYXRlKGxpbmVzKToKKyAgICAgICAgICAgIGlmIGxlbihsaW5lKSA+PSBpbmRlbnQrNCBhbmQgbGluZVtpbmRlbnQrM10gIT0gJyAnOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xpbmUgJXIgb2YgdGhlIGRvY3N0cmluZyBmb3IgJXMgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhY2tzIGJsYW5rIGFmdGVyICVzOiAlcicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbmVubytpKzEsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZVtpbmRlbnQ6aW5kZW50KzNdLCBsaW5lKSkKKworICAgIGRlZiBfY2hlY2tfcHJlZml4KHNlbGYsIGxpbmVzLCBwcmVmaXgsIG5hbWUsIGxpbmVubyk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayB0aGF0IGV2ZXJ5IGxpbmUgaW4gdGhlIGdpdmVuIGxpc3Qgc3RhcnRzIHdpdGggdGhlIGdpdmVuCisgICAgICAgIHByZWZpeDsgaWYgYW55IGxpbmUgZG9lcyBub3QsIHRoZW4gcmFpc2UgYSBWYWx1ZUVycm9yLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGksIGxpbmUgaW4gZW51bWVyYXRlKGxpbmVzKToKKyAgICAgICAgICAgIGlmIGxpbmUgYW5kIG5vdCBsaW5lLnN0YXJ0c3dpdGgocHJlZml4KToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsaW5lICVyIG9mIHRoZSBkb2NzdHJpbmcgZm9yICVzIGhhcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5jb25zaXN0ZW50IGxlYWRpbmcgd2hpdGVzcGFjZTogJXInICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5lbm8raSsxLCBuYW1lLCBsaW5lKSkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyA0LiBEb2NUZXN0IEZpbmRlcgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBEb2NUZXN0RmluZGVyOgorICAgICIiIgorICAgIEEgY2xhc3MgdXNlZCB0byBleHRyYWN0IHRoZSBEb2NUZXN0cyB0aGF0IGFyZSByZWxldmFudCB0byBhIGdpdmVuCisgICAgb2JqZWN0LCBmcm9tIGl0cyBkb2NzdHJpbmcgYW5kIHRoZSBkb2NzdHJpbmdzIG9mIGl0cyBjb250YWluZWQKKyAgICBvYmplY3RzLiAgRG9jdGVzdHMgY2FuIGN1cnJlbnRseSBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgZm9sbG93aW5nCisgICAgb2JqZWN0IHR5cGVzOiBtb2R1bGVzLCBmdW5jdGlvbnMsIGNsYXNzZXMsIG1ldGhvZHMsIHN0YXRpY21ldGhvZHMsCisgICAgY2xhc3NtZXRob2RzLCBhbmQgcHJvcGVydGllcy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJib3NlPUZhbHNlLCBwYXJzZXI9RG9jVGVzdFBhcnNlcigpLAorICAgICAgICAgICAgICAgICByZWN1cnNlPVRydWUsIGV4Y2x1ZGVfZW1wdHk9VHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGUgYSBuZXcgZG9jdGVzdCBmaW5kZXIuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBwYXJzZXJgIHNwZWNpZmllcyBhIGNsYXNzIG9yCisgICAgICAgIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBEb2NUZXN0IG9iamVjdHMgKG9yCisgICAgICAgIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIERvY1Rlc3QpLiAgVGhlCisgICAgICAgIHNpZ25hdHVyZSBmb3IgdGhpcyBmYWN0b3J5IGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc2lnbmF0dXJlCisgICAgICAgIG9mIHRoZSBEb2NUZXN0IGNvbnN0cnVjdG9yLgorCisgICAgICAgIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgcmVjdXJzZWAgaXMgZmFsc2UsIHRoZW4gYGZpbmRgIHdpbGwKKyAgICAgICAgb25seSBleGFtaW5lIHRoZSBnaXZlbiBvYmplY3QsIGFuZCBub3QgYW55IGNvbnRhaW5lZCBvYmplY3RzLgorCisgICAgICAgIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgZXhjbHVkZV9lbXB0eWAgaXMgZmFsc2UsIHRoZW4gYGZpbmRgCisgICAgICAgIHdpbGwgaW5jbHVkZSB0ZXN0cyBmb3Igb2JqZWN0cyB3aXRoIGVtcHR5IGRvY3N0cmluZ3MuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9wYXJzZXIgPSBwYXJzZXIKKyAgICAgICAgc2VsZi5fdmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgc2VsZi5fcmVjdXJzZSA9IHJlY3Vyc2UKKyAgICAgICAgc2VsZi5fZXhjbHVkZV9lbXB0eSA9IGV4Y2x1ZGVfZW1wdHkKKworICAgIGRlZiBmaW5kKHNlbGYsIG9iaiwgbmFtZT1Ob25lLCBtb2R1bGU9Tm9uZSwgZ2xvYnM9Tm9uZSwgZXh0cmFnbG9icz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIERvY1Rlc3RzIHRoYXQgYXJlIGRlZmluZWQgYnkgdGhlIGdpdmVuCisgICAgICAgIG9iamVjdCdzIGRvY3N0cmluZywgb3IgYnkgYW55IG9mIGl0cyBjb250YWluZWQgb2JqZWN0cycKKyAgICAgICAgZG9jc3RyaW5ncy4KKworICAgICAgICBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIGBtb2R1bGVgIGlzIHRoZSBtb2R1bGUgdGhhdCBjb250YWlucworICAgICAgICB0aGUgZ2l2ZW4gb2JqZWN0LiAgSWYgdGhlIG1vZHVsZSBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIE5vbmUsIHRoZW4KKyAgICAgICAgdGhlIHRlc3QgZmluZGVyIHdpbGwgYXR0ZW1wdCB0byBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0aGUKKyAgICAgICAgY29ycmVjdCBtb2R1bGUuICBUaGUgb2JqZWN0J3MgbW9kdWxlIGlzIHVzZWQ6CisKKyAgICAgICAgICAgIC0gQXMgYSBkZWZhdWx0IG5hbWVzcGFjZSwgaWYgYGdsb2JzYCBpcyBub3Qgc3BlY2lmaWVkLgorICAgICAgICAgICAgLSBUbyBwcmV2ZW50IHRoZSBEb2NUZXN0RmluZGVyIGZyb20gZXh0cmFjdGluZyBEb2NUZXN0cworICAgICAgICAgICAgICBmcm9tIG9iamVjdHMgdGhhdCBhcmUgaW1wb3J0ZWQgZnJvbSBvdGhlciBtb2R1bGVzLgorICAgICAgICAgICAgLSBUbyBmaW5kIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIG9iamVjdC4KKyAgICAgICAgICAgIC0gVG8gaGVscCBmaW5kIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgb2JqZWN0IHdpdGhpbiBpdHMKKyAgICAgICAgICAgICAgZmlsZS4KKworICAgICAgICBDb250YWluZWQgb2JqZWN0cyB3aG9zZSBtb2R1bGUgZG9lcyBub3QgbWF0Y2ggYG1vZHVsZWAgYXJlIGlnbm9yZWQuCisKKyAgICAgICAgSWYgYG1vZHVsZWAgaXMgRmFsc2UsIG5vIGF0dGVtcHQgdG8gZmluZCB0aGUgbW9kdWxlIHdpbGwgYmUgbWFkZS4KKyAgICAgICAgVGhpcyBpcyBvYnNjdXJlLCBvZiB1c2UgbW9zdGx5IGluIHRlc3RzOiAgaWYgYG1vZHVsZWAgaXMgRmFsc2UsIG9yCisgICAgICAgIGlzIE5vbmUgYnV0IGNhbm5vdCBiZSBmb3VuZCBhdXRvbWF0aWNhbGx5LCB0aGVuIGFsbCBvYmplY3RzIGFyZQorICAgICAgICBjb25zaWRlcmVkIHRvIGJlbG9uZyB0byB0aGUgKG5vbi1leGlzdGVudCkgbW9kdWxlLCBzbyBhbGwgY29udGFpbmVkCisgICAgICAgIG9iamVjdHMgd2lsbCAocmVjdXJzaXZlbHkpIGJlIHNlYXJjaGVkIGZvciBkb2N0ZXN0cy4KKworICAgICAgICBUaGUgZ2xvYmFscyBmb3IgZWFjaCBEb2NUZXN0IGlzIGZvcm1lZCBieSBjb21iaW5pbmcgYGdsb2JzYAorICAgICAgICBhbmQgYGV4dHJhZ2xvYnNgIChiaW5kaW5ncyBpbiBgZXh0cmFnbG9ic2Agb3ZlcnJpZGUgYmluZGluZ3MKKyAgICAgICAgaW4gYGdsb2JzYCkuICBBIG5ldyBjb3B5IG9mIHRoZSBnbG9iYWxzIGRpY3Rpb25hcnkgaXMgY3JlYXRlZAorICAgICAgICBmb3IgZWFjaCBEb2NUZXN0LiAgSWYgYGdsb2JzYCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGl0CisgICAgICAgIGRlZmF1bHRzIHRvIHRoZSBtb2R1bGUncyBgX19kaWN0X19gLCBpZiBzcGVjaWZpZWQsIG9yIHt9CisgICAgICAgIG90aGVyd2lzZS4gIElmIGBleHRyYWdsb2JzYCBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIGl0IGRlZmF1bHRzCisgICAgICAgIHRvIHt9LgorCisgICAgICAgICIiIgorICAgICAgICAjIElmIG5hbWUgd2FzIG5vdCBzcGVjaWZpZWQsIHRoZW4gZXh0cmFjdCBpdCBmcm9tIHRoZSBvYmplY3QuCisgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIG5hbWUgPSBnZXRhdHRyKG9iaiwgJ19fbmFtZV9fJywgTm9uZSkKKyAgICAgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEb2NUZXN0RmluZGVyLmZpbmQ6IG5hbWUgbXVzdCBiZSBnaXZlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAid2hlbiBvYmouX19uYW1lX18gZG9lc24ndCBleGlzdDogJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlKG9iaiksKSkKKworICAgICAgICAjIEZpbmQgdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBvYmplY3QgKGlmIG9iaiBpcworICAgICAgICAjIGEgbW9kdWxlLCB0aGVuIG1vZHVsZT1vYmouKS4gIE5vdGU6IHRoaXMgbWF5IGZhaWwsIGluIHdoaWNoCisgICAgICAgICMgY2FzZSBtb2R1bGUgd2lsbCBiZSBOb25lLgorICAgICAgICBpZiBtb2R1bGUgaXMgRmFsc2U6CisgICAgICAgICAgICBtb2R1bGUgPSBOb25lCisgICAgICAgIGVsaWYgbW9kdWxlIGlzIE5vbmU6CisgICAgICAgICAgICBtb2R1bGUgPSBpbnNwZWN0LmdldG1vZHVsZShvYmopCisKKyAgICAgICAgIyBSZWFkIHRoZSBtb2R1bGUncyBzb3VyY2UgY29kZS4gIFRoaXMgaXMgdXNlZCBieQorICAgICAgICAjIERvY1Rlc3RGaW5kZXIuX2ZpbmRfbGluZW5vIHRvIGZpbmQgdGhlIGxpbmUgbnVtYmVyIGZvciBhCisgICAgICAgICMgZ2l2ZW4gb2JqZWN0J3MgZG9jc3RyaW5nLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlID0gaW5zcGVjdC5nZXRzb3VyY2VmaWxlKG9iaikgb3IgaW5zcGVjdC5nZXRmaWxlKG9iaikKKyAgICAgICAgICAgIGlmIG1vZHVsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIFN1cHBseSB0aGUgbW9kdWxlIGdsb2JhbHMgaW4gY2FzZSB0aGUgbW9kdWxlIHdhcworICAgICAgICAgICAgICAgICMgb3JpZ2luYWxseSBsb2FkZWQgdmlhIGEgUEVQIDMwMiBsb2FkZXIgYW5kCisgICAgICAgICAgICAgICAgIyBmaWxlIGlzIG5vdCBhIHZhbGlkIGZpbGVzeXN0ZW0gcGF0aAorICAgICAgICAgICAgICAgIHNvdXJjZV9saW5lcyA9IGxpbmVjYWNoZS5nZXRsaW5lcyhmaWxlLCBtb2R1bGUuX19kaWN0X18pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgTm8gYWNjZXNzIHRvIGEgbG9hZGVyLCBzbyBhc3N1bWUgaXQncyBhIG5vcm1hbAorICAgICAgICAgICAgICAgICMgZmlsZXN5c3RlbSBwYXRoCisgICAgICAgICAgICAgICAgc291cmNlX2xpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzKGZpbGUpCisgICAgICAgICAgICBpZiBub3Qgc291cmNlX2xpbmVzOgorICAgICAgICAgICAgICAgIHNvdXJjZV9saW5lcyA9IE5vbmUKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHNvdXJjZV9saW5lcyA9IE5vbmUKKworICAgICAgICAjIEluaXRpYWxpemUgZ2xvYmFscywgYW5kIG1lcmdlIGluIGV4dHJhZ2xvYnMuCisgICAgICAgIGlmIGdsb2JzIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBnbG9icyA9IHt9CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGdsb2JzID0gbW9kdWxlLl9fZGljdF9fLmNvcHkoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ2xvYnMgPSBnbG9icy5jb3B5KCkKKyAgICAgICAgaWYgZXh0cmFnbG9icyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGdsb2JzLnVwZGF0ZShleHRyYWdsb2JzKQorICAgICAgICBpZiAnX19uYW1lX18nIG5vdCBpbiBnbG9iczoKKyAgICAgICAgICAgIGdsb2JzWydfX25hbWVfXyddID0gJ19fbWFpbl9fJyAgIyBwcm92aWRlIGEgZGVmYXVsdCBtb2R1bGUgbmFtZQorCisgICAgICAgICMgUmVjdXJzaXZlbHkgZXhwb3JlIGBvYmpgLCBleHRyYWN0aW5nIERvY1Rlc3RzLgorICAgICAgICB0ZXN0cyA9IFtdCisgICAgICAgIHNlbGYuX2ZpbmQodGVzdHMsIG9iaiwgbmFtZSwgbW9kdWxlLCBzb3VyY2VfbGluZXMsIGdsb2JzLCB7fSkKKyAgICAgICAgIyBTb3J0IHRoZSB0ZXN0cyBieSBhbHBoYSBvcmRlciBvZiBuYW1lcywgZm9yIGNvbnNpc3RlbmN5IGluCisgICAgICAgICMgdmVyYm9zZS1tb2RlIG91dHB1dC4gIFRoaXMgd2FzIGEgZmVhdHVyZSBvZiBkb2N0ZXN0IGluIFB5dGhvbnMKKyAgICAgICAgIyA8PSAyLjMgdGhhdCBnb3QgbG9zdCBieSBhY2NpZGVudCBpbiAyLjQuICBJdCB3YXMgcmVwYWlyZWQgaW4KKyAgICAgICAgIyAyLjQuNCBhbmQgMi41LgorICAgICAgICB0ZXN0cy5zb3J0KCkKKyAgICAgICAgcmV0dXJuIHRlc3RzCisKKyAgICBkZWYgX2Zyb21fbW9kdWxlKHNlbGYsIG1vZHVsZSwgb2JqZWN0KToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgZGVmaW5lZCBpbiB0aGUgZ2l2ZW4KKyAgICAgICAgbW9kdWxlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbW9kdWxlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbGlmIGluc3BlY3QuZ2V0bW9kdWxlKG9iamVjdCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gbW9kdWxlIGlzIGluc3BlY3QuZ2V0bW9kdWxlKG9iamVjdCkKKyAgICAgICAgZWxpZiBpbnNwZWN0LmlzZnVuY3Rpb24ob2JqZWN0KToKKyAgICAgICAgICAgIHJldHVybiBtb2R1bGUuX19kaWN0X18gaXMgb2JqZWN0LmZ1bmNfZ2xvYmFscworICAgICAgICBlbGlmIGluc3BlY3QuaXNjbGFzcyhvYmplY3QpOgorICAgICAgICAgICAgcmV0dXJuIG1vZHVsZS5fX25hbWVfXyA9PSBvYmplY3QuX19tb2R1bGVfXworICAgICAgICBlbGlmIGhhc2F0dHIob2JqZWN0LCAnX19tb2R1bGVfXycpOgorICAgICAgICAgICAgcmV0dXJuIG1vZHVsZS5fX25hbWVfXyA9PSBvYmplY3QuX19tb2R1bGVfXworICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqZWN0LCBwcm9wZXJ0eSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZSAjIFtYWF0gbm8gd2F5IG5vdCBiZSBzdXJlLgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigib2JqZWN0IG11c3QgYmUgYSBjbGFzcyBvciBmdW5jdGlvbiIpCisKKyAgICBkZWYgX2ZpbmQoc2VsZiwgdGVzdHMsIG9iaiwgbmFtZSwgbW9kdWxlLCBzb3VyY2VfbGluZXMsIGdsb2JzLCBzZWVuKToKKyAgICAgICAgIiIiCisgICAgICAgIEZpbmQgdGVzdHMgZm9yIHRoZSBnaXZlbiBvYmplY3QgYW5kIGFueSBjb250YWluZWQgb2JqZWN0cywgYW5kCisgICAgICAgIGFkZCB0aGVtIHRvIGB0ZXN0c2AuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl92ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ0ZpbmRpbmcgdGVzdHMgaW4gJXMnICUgbmFtZQorCisgICAgICAgICMgSWYgd2UndmUgYWxyZWFkeSBwcm9jZXNzZWQgdGhpcyBvYmplY3QsIHRoZW4gaWdub3JlIGl0LgorICAgICAgICBpZiBpZChvYmopIGluIHNlZW46CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VlbltpZChvYmopXSA9IDEKKworICAgICAgICAjIEZpbmQgYSB0ZXN0IGZvciB0aGlzIG9iamVjdCwgYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiB0ZXN0cy4KKyAgICAgICAgdGVzdCA9IHNlbGYuX2dldF90ZXN0KG9iaiwgbmFtZSwgbW9kdWxlLCBnbG9icywgc291cmNlX2xpbmVzKQorICAgICAgICBpZiB0ZXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdGVzdHMuYXBwZW5kKHRlc3QpCisKKyAgICAgICAgIyBMb29rIGZvciB0ZXN0cyBpbiBhIG1vZHVsZSdzIGNvbnRhaW5lZCBvYmplY3RzLgorICAgICAgICBpZiBpbnNwZWN0LmlzbW9kdWxlKG9iaikgYW5kIHNlbGYuX3JlY3Vyc2U6CisgICAgICAgICAgICBmb3IgdmFsbmFtZSwgdmFsIGluIG9iai5fX2RpY3RfXy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHZhbG5hbWUgPSAnJXMuJXMnICUgKG5hbWUsIHZhbG5hbWUpCisgICAgICAgICAgICAgICAgIyBSZWN1cnNlIHRvIGZ1bmN0aW9ucyAmIGNsYXNzZXMuCisgICAgICAgICAgICAgICAgaWYgKChpbnNwZWN0LmlzZnVuY3Rpb24odmFsKSBvciBpbnNwZWN0LmlzY2xhc3ModmFsKSkgYW5kCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Zyb21fbW9kdWxlKG1vZHVsZSwgdmFsKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbmQodGVzdHMsIHZhbCwgdmFsbmFtZSwgbW9kdWxlLCBzb3VyY2VfbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYnMsIHNlZW4pCisKKyAgICAgICAgIyBMb29rIGZvciB0ZXN0cyBpbiBhIG1vZHVsZSdzIF9fdGVzdF9fIGRpY3Rpb25hcnkuCisgICAgICAgIGlmIGluc3BlY3QuaXNtb2R1bGUob2JqKSBhbmQgc2VsZi5fcmVjdXJzZToKKyAgICAgICAgICAgIGZvciB2YWxuYW1lLCB2YWwgaW4gZ2V0YXR0cihvYmosICdfX3Rlc3RfXycsIHt9KS5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbG5hbWUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEb2NUZXN0RmluZGVyLmZpbmQ6IF9fdGVzdF9fIGtleXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHN0cmluZ3M6ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUodmFsbmFtZSksKSkKKyAgICAgICAgICAgICAgICBpZiBub3QgKGluc3BlY3QuaXNmdW5jdGlvbih2YWwpIG9yIGluc3BlY3QuaXNjbGFzcyh2YWwpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICBpbnNwZWN0LmlzbWV0aG9kKHZhbCkgb3IgaW5zcGVjdC5pc21vZHVsZSh2YWwpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHZhbCwgYmFzZXN0cmluZykpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJEb2NUZXN0RmluZGVyLmZpbmQ6IF9fdGVzdF9fIHZhbHVlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgc3RyaW5ncywgZnVuY3Rpb25zLCBtZXRob2RzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzZXMsIG9yIG1vZHVsZXM6ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUodmFsKSwpKQorICAgICAgICAgICAgICAgIHZhbG5hbWUgPSAnJXMuX190ZXN0X18uJXMnICUgKG5hbWUsIHZhbG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5fZmluZCh0ZXN0cywgdmFsLCB2YWxuYW1lLCBtb2R1bGUsIHNvdXJjZV9saW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JzLCBzZWVuKQorCisgICAgICAgICMgTG9vayBmb3IgdGVzdHMgaW4gYSBjbGFzcydzIGNvbnRhaW5lZCBvYmplY3RzLgorICAgICAgICBpZiBpbnNwZWN0LmlzY2xhc3Mob2JqKSBhbmQgc2VsZi5fcmVjdXJzZToKKyAgICAgICAgICAgIGZvciB2YWxuYW1lLCB2YWwgaW4gb2JqLl9fZGljdF9fLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgIyBTcGVjaWFsIGhhbmRsaW5nIGZvciBzdGF0aWNtZXRob2QvY2xhc3NtZXRob2QuCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIHN0YXRpY21ldGhvZCk6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IGdldGF0dHIob2JqLCB2YWxuYW1lKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBjbGFzc21ldGhvZCk6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IGdldGF0dHIob2JqLCB2YWxuYW1lKS5pbV9mdW5jCisKKyAgICAgICAgICAgICAgICAjIFJlY3Vyc2UgdG8gbWV0aG9kcywgcHJvcGVydGllcywgYW5kIG5lc3RlZCBjbGFzc2VzLgorICAgICAgICAgICAgICAgIGlmICgoaW5zcGVjdC5pc2Z1bmN0aW9uKHZhbCkgb3IgaW5zcGVjdC5pc2NsYXNzKHZhbCkgb3IKKyAgICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHZhbCwgcHJvcGVydHkpKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9mcm9tX21vZHVsZShtb2R1bGUsIHZhbCkpOgorICAgICAgICAgICAgICAgICAgICB2YWxuYW1lID0gJyVzLiVzJyAlIChuYW1lLCB2YWxuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9maW5kKHRlc3RzLCB2YWwsIHZhbG5hbWUsIG1vZHVsZSwgc291cmNlX2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JzLCBzZWVuKQorCisgICAgZGVmIF9nZXRfdGVzdChzZWxmLCBvYmosIG5hbWUsIG1vZHVsZSwgZ2xvYnMsIHNvdXJjZV9saW5lcyk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBEb2NUZXN0IGZvciB0aGUgZ2l2ZW4gb2JqZWN0LCBpZiBpdCBkZWZpbmVzIGEgZG9jc3RyaW5nOworICAgICAgICBvdGhlcndpc2UsIHJldHVybiBOb25lLgorICAgICAgICAiIiIKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBvYmplY3QncyBkb2NzdHJpbmcuICBJZiBpdCBkb2Vzbid0IGhhdmUgb25lLAorICAgICAgICAjIHRoZW4gcmV0dXJuIE5vbmUgKG5vIHRlc3QgZm9yIHRoaXMgb2JqZWN0KS4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgZG9jc3RyaW5nID0gb2JqCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgb2JqLl9fZG9jX18gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZG9jc3RyaW5nID0gJycKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkb2NzdHJpbmcgPSBvYmouX19kb2NfXworICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkb2NzdHJpbmcsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgICAgICAgICAgZG9jc3RyaW5nID0gc3RyKGRvY3N0cmluZykKKyAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICAgICAgZG9jc3RyaW5nID0gJycKKworICAgICAgICAjIEZpbmQgdGhlIGRvY3N0cmluZydzIGxvY2F0aW9uIGluIHRoZSBmaWxlLgorICAgICAgICBsaW5lbm8gPSBzZWxmLl9maW5kX2xpbmVubyhvYmosIHNvdXJjZV9saW5lcykKKworICAgICAgICAjIERvbid0IGJvdGhlciBpZiB0aGUgZG9jc3RyaW5nIGlzIGVtcHR5LgorICAgICAgICBpZiBzZWxmLl9leGNsdWRlX2VtcHR5IGFuZCBub3QgZG9jc3RyaW5nOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIFJldHVybiBhIERvY1Rlc3QgZm9yIHRoaXMgb2JqZWN0LgorICAgICAgICBpZiBtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBnZXRhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJywgbW9kdWxlLl9fbmFtZV9fKQorICAgICAgICAgICAgaWYgZmlsZW5hbWVbLTQ6XSBpbiAoIi5weWMiLCAiLnB5byIpOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi0xXQorICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VyLmdldF9kb2N0ZXN0KGRvY3N0cmluZywgZ2xvYnMsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVubykKKworICAgIGRlZiBfZmluZF9saW5lbm8oc2VsZiwgb2JqLCBzb3VyY2VfbGluZXMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbGluZSBudW1iZXIgb2YgdGhlIGdpdmVuIG9iamVjdCdzIGRvY3N0cmluZy4gIE5vdGU6CisgICAgICAgIHRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgb2JqZWN0IGhhcyBhIGRvY3N0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIGxpbmVubyA9IE5vbmUKKworICAgICAgICAjIEZpbmQgdGhlIGxpbmUgbnVtYmVyIGZvciBtb2R1bGVzLgorICAgICAgICBpZiBpbnNwZWN0LmlzbW9kdWxlKG9iaik6CisgICAgICAgICAgICBsaW5lbm8gPSAwCisKKyAgICAgICAgIyBGaW5kIHRoZSBsaW5lIG51bWJlciBmb3IgY2xhc3Nlcy4KKyAgICAgICAgIyBOb3RlOiB0aGlzIGNvdWxkIGJlIGZvb2xlZCBpZiBhIGNsYXNzIGlzIGRlZmluZWQgbXVsdGlwbGUKKyAgICAgICAgIyB0aW1lcyBpbiBhIHNpbmdsZSBmaWxlLgorICAgICAgICBpZiBpbnNwZWN0LmlzY2xhc3Mob2JqKToKKyAgICAgICAgICAgIGlmIHNvdXJjZV9saW5lcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBwYXQgPSByZS5jb21waWxlKHInXlxzKmNsYXNzXHMqJXNcYicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKG9iaiwgJ19fbmFtZV9fJywgJy0nKSkKKyAgICAgICAgICAgIGZvciBpLCBsaW5lIGluIGVudW1lcmF0ZShzb3VyY2VfbGluZXMpOgorICAgICAgICAgICAgICAgIGlmIHBhdC5tYXRjaChsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgbGluZW5vID0gaQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICMgRmluZCB0aGUgbGluZSBudW1iZXIgZm9yIGZ1bmN0aW9ucyAmIG1ldGhvZHMuCisgICAgICAgIGlmIGluc3BlY3QuaXNtZXRob2Qob2JqKTogb2JqID0gb2JqLmltX2Z1bmMKKyAgICAgICAgaWYgaW5zcGVjdC5pc2Z1bmN0aW9uKG9iaik6IG9iaiA9IG9iai5mdW5jX2NvZGUKKyAgICAgICAgaWYgaW5zcGVjdC5pc3RyYWNlYmFjayhvYmopOiBvYmogPSBvYmoudGJfZnJhbWUKKyAgICAgICAgaWYgaW5zcGVjdC5pc2ZyYW1lKG9iaik6IG9iaiA9IG9iai5mX2NvZGUKKyAgICAgICAgaWYgaW5zcGVjdC5pc2NvZGUob2JqKToKKyAgICAgICAgICAgIGxpbmVubyA9IGdldGF0dHIob2JqLCAnY29fZmlyc3RsaW5lbm8nLCBOb25lKS0xCisKKyAgICAgICAgIyBGaW5kIHRoZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgZG9jc3RyaW5nIHN0YXJ0cy4gIEFzc3VtZQorICAgICAgICAjIHRoYXQgaXQncyB0aGUgZmlyc3QgbGluZSB0aGF0IGJlZ2lucyB3aXRoIGEgcXVvdGUgbWFyay4KKyAgICAgICAgIyBOb3RlOiB0aGlzIGNvdWxkIGJlIGZvb2xlZCBieSBhIG11bHRpbGluZSBmdW5jdGlvbgorICAgICAgICAjIHNpZ25hdHVyZSwgd2hlcmUgYSBjb250aW51YXRpb24gbGluZSBiZWdpbnMgd2l0aCBhIHF1b3RlCisgICAgICAgICMgbWFyay4KKyAgICAgICAgaWYgbGluZW5vIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgc291cmNlX2xpbmVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVubysxCisgICAgICAgICAgICBwYXQgPSByZS5jb21waWxlKCcoXnwuKjopXHMqXHcqKCJ8XCcpJykKKyAgICAgICAgICAgIGZvciBsaW5lbm8gaW4gcmFuZ2UobGluZW5vLCBsZW4oc291cmNlX2xpbmVzKSk6CisgICAgICAgICAgICAgICAgaWYgcGF0Lm1hdGNoKHNvdXJjZV9saW5lc1tsaW5lbm9dKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVubworCisgICAgICAgICMgV2UgY291bGRuJ3QgZmluZCB0aGUgbGluZSBudW1iZXIuCisgICAgICAgIHJldHVybiBOb25lCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIDUuIERvY1Rlc3QgUnVubmVyCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIERvY1Rlc3RSdW5uZXI6CisgICAgIiIiCisgICAgQSBjbGFzcyB1c2VkIHRvIHJ1biBEb2NUZXN0IHRlc3QgY2FzZXMsIGFuZCBhY2N1bXVsYXRlIHN0YXRpc3RpY3MuCisgICAgVGhlIGBydW5gIG1ldGhvZCBpcyB1c2VkIHRvIHByb2Nlc3MgYSBzaW5nbGUgRG9jVGVzdCBjYXNlLiAgSXQKKyAgICByZXR1cm5zIGEgdHVwbGUgYChmLCB0KWAsIHdoZXJlIGB0YCBpcyB0aGUgbnVtYmVyIG9mIHRlc3QgY2FzZXMKKyAgICB0cmllZCwgYW5kIGBmYCBpcyB0aGUgbnVtYmVyIG9mIHRlc3QgY2FzZXMgdGhhdCBmYWlsZWQuCisKKyAgICAgICAgPj4+IHRlc3RzID0gRG9jVGVzdEZpbmRlcigpLmZpbmQoX1Rlc3RDbGFzcykKKyAgICAgICAgPj4+IHJ1bm5lciA9IERvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkKKyAgICAgICAgPj4+IHRlc3RzLnNvcnQoa2V5ID0gbGFtYmRhIHRlc3Q6IHRlc3QubmFtZSkKKyAgICAgICAgPj4+IGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgICAuLi4gICAgIHByaW50IHRlc3QubmFtZSwgJy0+JywgcnVubmVyLnJ1bih0ZXN0KQorICAgICAgICBfVGVzdENsYXNzIC0+IFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKKyAgICAgICAgX1Rlc3RDbGFzcy5fX2luaXRfXyAtPiBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCisgICAgICAgIF9UZXN0Q2xhc3MuZ2V0IC0+IFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKKyAgICAgICAgX1Rlc3RDbGFzcy5zcXVhcmUgLT4gVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0xKQorCisgICAgVGhlIGBzdW1tYXJpemVgIG1ldGhvZCBwcmludHMgYSBzdW1tYXJ5IG9mIGFsbCB0aGUgdGVzdCBjYXNlcyB0aGF0CisgICAgaGF2ZSBiZWVuIHJ1biBieSB0aGUgcnVubmVyLCBhbmQgcmV0dXJucyBhbiBhZ2dyZWdhdGVkIGAoZiwgdClgCisgICAgdHVwbGU6CisKKyAgICAgICAgPj4+IHJ1bm5lci5zdW1tYXJpemUodmVyYm9zZT0xKQorICAgICAgICA0IGl0ZW1zIHBhc3NlZCBhbGwgdGVzdHM6CisgICAgICAgICAgIDIgdGVzdHMgaW4gX1Rlc3RDbGFzcworICAgICAgICAgICAyIHRlc3RzIGluIF9UZXN0Q2xhc3MuX19pbml0X18KKyAgICAgICAgICAgMiB0ZXN0cyBpbiBfVGVzdENsYXNzLmdldAorICAgICAgICAgICAxIHRlc3RzIGluIF9UZXN0Q2xhc3Muc3F1YXJlCisgICAgICAgIDcgdGVzdHMgaW4gNCBpdGVtcy4KKyAgICAgICAgNyBwYXNzZWQgYW5kIDAgZmFpbGVkLgorICAgICAgICBUZXN0IHBhc3NlZC4KKyAgICAgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD03KQorCisgICAgVGhlIGFnZ3JlZ2F0ZWQgbnVtYmVyIG9mIHRyaWVkIGV4YW1wbGVzIGFuZCBmYWlsZWQgZXhhbXBsZXMgaXMKKyAgICBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIGB0cmllc2AgYW5kIGBmYWlsdXJlc2AgYXR0cmlidXRlczoKKworICAgICAgICA+Pj4gcnVubmVyLnRyaWVzCisgICAgICAgIDcKKyAgICAgICAgPj4+IHJ1bm5lci5mYWlsdXJlcworICAgICAgICAwCisKKyAgICBUaGUgY29tcGFyaXNvbiBiZXR3ZWVuIGV4cGVjdGVkIG91dHB1dHMgYW5kIGFjdHVhbCBvdXRwdXRzIGlzIGRvbmUKKyAgICBieSBhbiBgT3V0cHV0Q2hlY2tlcmAuICBUaGlzIGNvbXBhcmlzb24gbWF5IGJlIGN1c3RvbWl6ZWQgd2l0aCBhCisgICAgbnVtYmVyIG9mIG9wdGlvbiBmbGFnczsgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgdGVzdG1vZGAgZm9yCisgICAgbW9yZSBpbmZvcm1hdGlvbi4gIElmIHRoZSBvcHRpb24gZmxhZ3MgYXJlIGluc3VmZmljaWVudCwgdGhlbiB0aGUKKyAgICBjb21wYXJpc29uIG1heSBhbHNvIGJlIGN1c3RvbWl6ZWQgYnkgcGFzc2luZyBhIHN1YmNsYXNzIG9mCisgICAgYE91dHB1dENoZWNrZXJgIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKworICAgIFRoZSB0ZXN0IHJ1bm5lcidzIGRpc3BsYXkgb3V0cHV0IGNhbiBiZSBjb250cm9sbGVkIGluIHR3byB3YXlzLgorICAgIEZpcnN0LCBhbiBvdXRwdXQgZnVuY3Rpb24gKGBvdXQpIGNhbiBiZSBwYXNzZWQgdG8KKyAgICBgVGVzdFJ1bm5lci5ydW5gOyB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggc3RyaW5ncyB0aGF0CisgICAgc2hvdWxkIGJlIGRpc3BsYXllZC4gIEl0IGRlZmF1bHRzIHRvIGBzeXMuc3Rkb3V0LndyaXRlYC4gIElmCisgICAgY2FwdHVyaW5nIHRoZSBvdXRwdXQgaXMgbm90IHN1ZmZpY2llbnQsIHRoZW4gdGhlIGRpc3BsYXkgb3V0cHV0CisgICAgY2FuIGJlIGFsc28gY3VzdG9taXplZCBieSBzdWJjbGFzc2luZyBEb2NUZXN0UnVubmVyLCBhbmQKKyAgICBvdmVycmlkaW5nIHRoZSBtZXRob2RzIGByZXBvcnRfc3RhcnRgLCBgcmVwb3J0X3N1Y2Nlc3NgLAorICAgIGByZXBvcnRfdW5leHBlY3RlZF9leGNlcHRpb25gLCBhbmQgYHJlcG9ydF9mYWlsdXJlYC4KKyAgICAiIiIKKyAgICAjIFRoaXMgZGl2aWRlciBzdHJpbmcgaXMgdXNlZCB0byBzZXBhcmF0ZSBmYWlsdXJlIG1lc3NhZ2VzLCBhbmQgdG8KKyAgICAjIHNlcGFyYXRlIHNlY3Rpb25zIG9mIHRoZSBzdW1tYXJ5LgorICAgIERJVklERVIgPSAiKiIgKiA3MAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNoZWNrZXI9Tm9uZSwgdmVyYm9zZT1Ob25lLCBvcHRpb25mbGFncz0wKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBhIG5ldyB0ZXN0IHJ1bm5lci4KKworICAgICAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyBgY2hlY2tlcmAgaXMgdGhlIGBPdXRwdXRDaGVja2VyYCB0aGF0CisgICAgICAgIHNob3VsZCBiZSB1c2VkIHRvIGNvbXBhcmUgdGhlIGV4cGVjdGVkIG91dHB1dHMgYW5kIGFjdHVhbAorICAgICAgICBvdXRwdXRzIG9mIGRvY3Rlc3QgZXhhbXBsZXMuCisKKyAgICAgICAgT3B0aW9uYWwga2V5d29yZCBhcmcgJ3ZlcmJvc2UnIHByaW50cyBsb3RzIG9mIHN0dWZmIGlmIHRydWUsCisgICAgICAgIG9ubHkgZmFpbHVyZXMgaWYgZmFsc2U7IGJ5IGRlZmF1bHQsIGl0J3MgdHJ1ZSBpZmYgJy12JyBpcyBpbgorICAgICAgICBzeXMuYXJndi4KKworICAgICAgICBPcHRpb25hbCBhcmd1bWVudCBgb3B0aW9uZmxhZ3NgIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgaG93IHRoZQorICAgICAgICB0ZXN0IHJ1bm5lciBjb21wYXJlcyBleHBlY3RlZCBvdXRwdXQgdG8gYWN0dWFsIG91dHB1dCwgYW5kIGhvdworICAgICAgICBpdCBkaXNwbGF5cyBmYWlsdXJlcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYHRlc3Rtb2RgIGZvcgorICAgICAgICBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2hlY2tlciA9IGNoZWNrZXIgb3IgT3V0cHV0Q2hlY2tlcigpCisgICAgICAgIGlmIHZlcmJvc2UgaXMgTm9uZToKKyAgICAgICAgICAgIHZlcmJvc2UgPSAnLXYnIGluIHN5cy5hcmd2CisgICAgICAgIHNlbGYuX3ZlcmJvc2UgPSB2ZXJib3NlCisgICAgICAgIHNlbGYub3B0aW9uZmxhZ3MgPSBvcHRpb25mbGFncworICAgICAgICBzZWxmLm9yaWdpbmFsX29wdGlvbmZsYWdzID0gb3B0aW9uZmxhZ3MKKworICAgICAgICAjIEtlZXAgdHJhY2sgb2YgdGhlIGV4YW1wbGVzIHdlJ3ZlIHJ1bi4KKyAgICAgICAgc2VsZi50cmllcyA9IDAKKyAgICAgICAgc2VsZi5mYWlsdXJlcyA9IDAKKyAgICAgICAgc2VsZi5fbmFtZTJmdCA9IHt9CisKKyAgICAgICAgIyBDcmVhdGUgYSBmYWtlIG91dHB1dCB0YXJnZXQgZm9yIGNhcHR1cmluZyBkb2N0ZXN0IG91dHB1dC4KKyAgICAgICAgc2VsZi5fZmFrZW91dCA9IF9TcG9vZk91dCgpCisKKyAgICAjLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjIFJlcG9ydGluZyBtZXRob2RzCisgICAgIy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBkZWYgcmVwb3J0X3N0YXJ0KHNlbGYsIG91dCwgdGVzdCwgZXhhbXBsZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXBvcnQgdGhhdCB0aGUgdGVzdCBydW5uZXIgaXMgYWJvdXQgdG8gcHJvY2VzcyB0aGUgZ2l2ZW4KKyAgICAgICAgZXhhbXBsZS4gIChPbmx5IGRpc3BsYXlzIGEgbWVzc2FnZSBpZiB2ZXJib3NlPVRydWUpCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl92ZXJib3NlOgorICAgICAgICAgICAgaWYgZXhhbXBsZS53YW50OgorICAgICAgICAgICAgICAgIG91dCgnVHJ5aW5nOlxuJyArIF9pbmRlbnQoZXhhbXBsZS5zb3VyY2UpICsKKyAgICAgICAgICAgICAgICAgICAgJ0V4cGVjdGluZzpcbicgKyBfaW5kZW50KGV4YW1wbGUud2FudCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG91dCgnVHJ5aW5nOlxuJyArIF9pbmRlbnQoZXhhbXBsZS5zb3VyY2UpICsKKyAgICAgICAgICAgICAgICAgICAgJ0V4cGVjdGluZyBub3RoaW5nXG4nKQorCisgICAgZGVmIHJlcG9ydF9zdWNjZXNzKHNlbGYsIG91dCwgdGVzdCwgZXhhbXBsZSwgZ290KToKKyAgICAgICAgIiIiCisgICAgICAgIFJlcG9ydCB0aGF0IHRoZSBnaXZlbiBleGFtcGxlIHJhbiBzdWNjZXNzZnVsbHkuICAoT25seQorICAgICAgICBkaXNwbGF5cyBhIG1lc3NhZ2UgaWYgdmVyYm9zZT1UcnVlKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fdmVyYm9zZToKKyAgICAgICAgICAgIG91dCgib2tcbiIpCisKKyAgICBkZWYgcmVwb3J0X2ZhaWx1cmUoc2VsZiwgb3V0LCB0ZXN0LCBleGFtcGxlLCBnb3QpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVwb3J0IHRoYXQgdGhlIGdpdmVuIGV4YW1wbGUgZmFpbGVkLgorICAgICAgICAiIiIKKyAgICAgICAgb3V0KHNlbGYuX2ZhaWx1cmVfaGVhZGVyKHRlc3QsIGV4YW1wbGUpICsKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrZXIub3V0cHV0X2RpZmZlcmVuY2UoZXhhbXBsZSwgZ290LCBzZWxmLm9wdGlvbmZsYWdzKSkKKworICAgIGRlZiByZXBvcnRfdW5leHBlY3RlZF9leGNlcHRpb24oc2VsZiwgb3V0LCB0ZXN0LCBleGFtcGxlLCBleGNfaW5mbyk6CisgICAgICAgICIiIgorICAgICAgICBSZXBvcnQgdGhhdCB0aGUgZ2l2ZW4gZXhhbXBsZSByYWlzZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24uCisgICAgICAgICIiIgorICAgICAgICBvdXQoc2VsZi5fZmFpbHVyZV9oZWFkZXIodGVzdCwgZXhhbXBsZSkgKworICAgICAgICAgICAgJ0V4Y2VwdGlvbiByYWlzZWQ6XG4nICsgX2luZGVudChfZXhjZXB0aW9uX3RyYWNlYmFjayhleGNfaW5mbykpKQorCisgICAgZGVmIF9mYWlsdXJlX2hlYWRlcihzZWxmLCB0ZXN0LCBleGFtcGxlKToKKyAgICAgICAgb3V0ID0gW3NlbGYuRElWSURFUl0KKyAgICAgICAgaWYgdGVzdC5maWxlbmFtZToKKyAgICAgICAgICAgIGlmIHRlc3QubGluZW5vIGlzIG5vdCBOb25lIGFuZCBleGFtcGxlLmxpbmVubyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBsaW5lbm8gPSB0ZXN0LmxpbmVubyArIGV4YW1wbGUubGluZW5vICsgMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsaW5lbm8gPSAnPycKKyAgICAgICAgICAgIG91dC5hcHBlbmQoJ0ZpbGUgIiVzIiwgbGluZSAlcywgaW4gJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgKHRlc3QuZmlsZW5hbWUsIGxpbmVubywgdGVzdC5uYW1lKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dC5hcHBlbmQoJ0xpbmUgJXMsIGluICVzJyAlIChleGFtcGxlLmxpbmVubysxLCB0ZXN0Lm5hbWUpKQorICAgICAgICBvdXQuYXBwZW5kKCdGYWlsZWQgZXhhbXBsZTonKQorICAgICAgICBzb3VyY2UgPSBleGFtcGxlLnNvdXJjZQorICAgICAgICBvdXQuYXBwZW5kKF9pbmRlbnQoc291cmNlKSkKKyAgICAgICAgcmV0dXJuICdcbicuam9pbihvdXQpCisKKyAgICAjLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjIERvY1Rlc3QgUnVubmluZworICAgICMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgZGVmIF9fcnVuKHNlbGYsIHRlc3QsIGNvbXBpbGVmbGFncywgb3V0KToKKyAgICAgICAgIiIiCisgICAgICAgIFJ1biB0aGUgZXhhbXBsZXMgaW4gYHRlc3RgLiAgV3JpdGUgdGhlIG91dGNvbWUgb2YgZWFjaCBleGFtcGxlCisgICAgICAgIHdpdGggb25lIG9mIHRoZSBgRG9jVGVzdFJ1bm5lci5yZXBvcnRfKmAgbWV0aG9kcywgdXNpbmcgdGhlCisgICAgICAgIHdyaXRlciBmdW5jdGlvbiBgb3V0YC4gIGBjb21waWxlZmxhZ3NgIGlzIHRoZSBzZXQgb2YgY29tcGlsZXIKKyAgICAgICAgZmxhZ3MgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBleGVjdXRlIGV4YW1wbGVzLiAgUmV0dXJuIGEgdHVwbGUKKyAgICAgICAgYChmLCB0KWAsIHdoZXJlIGB0YCBpcyB0aGUgbnVtYmVyIG9mIGV4YW1wbGVzIHRyaWVkLCBhbmQgYGZgCisgICAgICAgIGlzIHRoZSBudW1iZXIgb2YgZXhhbXBsZXMgdGhhdCBmYWlsZWQuICBUaGUgZXhhbXBsZXMgYXJlIHJ1bgorICAgICAgICBpbiB0aGUgbmFtZXNwYWNlIGB0ZXN0Lmdsb2JzYC4KKyAgICAgICAgIiIiCisgICAgICAgICMgS2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGZhaWx1cmVzIGFuZCB0cmllcy4KKyAgICAgICAgZmFpbHVyZXMgPSB0cmllcyA9IDAKKworICAgICAgICAjIFNhdmUgdGhlIG9wdGlvbiBmbGFncyAoc2luY2Ugb3B0aW9uIGRpcmVjdGl2ZXMgY2FuIGJlIHVzZWQKKyAgICAgICAgIyB0byBtb2RpZnkgdGhlbSkuCisgICAgICAgIG9yaWdpbmFsX29wdGlvbmZsYWdzID0gc2VsZi5vcHRpb25mbGFncworCisgICAgICAgIFNVQ0NFU1MsIEZBSUxVUkUsIEJPT00gPSByYW5nZSgzKSAjIGBvdXRjb21lYCBzdGF0ZQorCisgICAgICAgIGNoZWNrID0gc2VsZi5fY2hlY2tlci5jaGVja19vdXRwdXQKKworICAgICAgICAjIFByb2Nlc3MgZWFjaCBleGFtcGxlLgorICAgICAgICBmb3IgZXhhbXBsZW51bSwgZXhhbXBsZSBpbiBlbnVtZXJhdGUodGVzdC5leGFtcGxlcyk6CisKKyAgICAgICAgICAgICMgSWYgUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRSBpcyBzZXQsIHRoZW4gc3VwcHJlc3MKKyAgICAgICAgICAgICMgcmVwb3J0aW5nIGFmdGVyIHRoZSBmaXJzdCBmYWlsdXJlLgorICAgICAgICAgICAgcXVpZXQgPSAoc2VsZi5vcHRpb25mbGFncyAmIFJFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUgYW5kCisgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlcyA+IDApCisKKyAgICAgICAgICAgICMgTWVyZ2UgaW4gdGhlIGV4YW1wbGUncyBvcHRpb25zLgorICAgICAgICAgICAgc2VsZi5vcHRpb25mbGFncyA9IG9yaWdpbmFsX29wdGlvbmZsYWdzCisgICAgICAgICAgICBpZiBleGFtcGxlLm9wdGlvbnM6CisgICAgICAgICAgICAgICAgZm9yIChvcHRpb25mbGFnLCB2YWwpIGluIGV4YW1wbGUub3B0aW9ucy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBpZiB2YWw6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbmZsYWdzIHw9IG9wdGlvbmZsYWcKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9uZmxhZ3MgJj0gfm9wdGlvbmZsYWcKKworICAgICAgICAgICAgIyBJZiAnU0tJUCcgaXMgc2V0LCB0aGVuIHNraXAgdGhpcyBleGFtcGxlLgorICAgICAgICAgICAgaWYgc2VsZi5vcHRpb25mbGFncyAmIFNLSVA6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBSZWNvcmQgdGhhdCB3ZSBzdGFydGVkIHRoaXMgZXhhbXBsZS4KKyAgICAgICAgICAgIHRyaWVzICs9IDEKKyAgICAgICAgICAgIGlmIG5vdCBxdWlldDoKKyAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydF9zdGFydChvdXQsIHRlc3QsIGV4YW1wbGUpCisKKyAgICAgICAgICAgICMgVXNlIGEgc3BlY2lhbCBmaWxlbmFtZSBmb3IgY29tcGlsZSgpLCBzbyB3ZSBjYW4gcmV0cmlldmUKKyAgICAgICAgICAgICMgdGhlIHNvdXJjZSBjb2RlIGR1cmluZyBpbnRlcmFjdGl2ZSBkZWJ1Z2dpbmcgKHNlZQorICAgICAgICAgICAgIyBfX3BhdGNoZWRfbGluZWNhY2hlX2dldGxpbmVzKS4KKyAgICAgICAgICAgIGZpbGVuYW1lID0gJzxkb2N0ZXN0ICVzWyVkXT4nICUgKHRlc3QubmFtZSwgZXhhbXBsZW51bSkKKworICAgICAgICAgICAgIyBSdW4gdGhlIGV4YW1wbGUgaW4gdGhlIGdpdmVuIGNvbnRleHQgKGdsb2JzKSwgYW5kIHJlY29yZAorICAgICAgICAgICAgIyBhbnkgZXhjZXB0aW9uIHRoYXQgZ2V0cyByYWlzZWQuICAoQnV0IGRvbid0IGludGVyY2VwdAorICAgICAgICAgICAgIyBrZXlib2FyZCBpbnRlcnJ1cHRzLikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIERvbid0IGJsaW5rISAgVGhpcyBpcyB3aGVyZSB0aGUgdXNlcidzIGNvZGUgZ2V0cyBydW4uCisgICAgICAgICAgICAgICAgZXhlYyBjb21waWxlKGV4YW1wbGUuc291cmNlLCBmaWxlbmFtZSwgInNpbmdsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVmbGFncywgMSkgaW4gdGVzdC5nbG9icworICAgICAgICAgICAgICAgIHNlbGYuZGVidWdnZXIuc2V0X2NvbnRpbnVlKCkgIyA9PT09IEV4YW1wbGUgRmluaXNoZWQgPT09PQorICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IE5vbmUKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z2dlci5zZXRfY29udGludWUoKSAjID09PT0gRXhhbXBsZSBGaW5pc2hlZCA9PT09CisKKyAgICAgICAgICAgIGdvdCA9IHNlbGYuX2Zha2VvdXQuZ2V0dmFsdWUoKSAgIyB0aGUgYWN0dWFsIG91dHB1dAorICAgICAgICAgICAgc2VsZi5fZmFrZW91dC50cnVuY2F0ZSgwKQorICAgICAgICAgICAgb3V0Y29tZSA9IEZBSUxVUkUgICAjIGd1aWx0eSB1bnRpbCBwcm92ZWQgaW5ub2NlbnQgb3IgaW5zYW5lCisKKyAgICAgICAgICAgICMgSWYgdGhlIGV4YW1wbGUgZXhlY3V0ZWQgd2l0aG91dCByYWlzaW5nIGFueSBleGNlcHRpb25zLAorICAgICAgICAgICAgIyB2ZXJpZnkgaXRzIG91dHB1dC4KKyAgICAgICAgICAgIGlmIGV4Y2VwdGlvbiBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIGNoZWNrKGV4YW1wbGUud2FudCwgZ290LCBzZWxmLm9wdGlvbmZsYWdzKToKKyAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSA9IFNVQ0NFU1MKKworICAgICAgICAgICAgIyBUaGUgZXhhbXBsZSByYWlzZWQgYW4gZXhjZXB0aW9uOiAgY2hlY2sgaWYgaXQgd2FzIGV4cGVjdGVkLgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleGNfaW5mbyA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICAgICAgZXhjX21zZyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkoKmV4Y19pbmZvWzoyXSlbLTFdCisgICAgICAgICAgICAgICAgaWYgbm90IHF1aWV0OgorICAgICAgICAgICAgICAgICAgICBnb3QgKz0gX2V4Y2VwdGlvbl90cmFjZWJhY2soZXhjX2luZm8pCisKKyAgICAgICAgICAgICAgICAjIElmIGBleGFtcGxlLmV4Y19tc2dgIGlzIE5vbmUsIHRoZW4gd2Ugd2VyZW4ndCBleHBlY3RpbmcKKyAgICAgICAgICAgICAgICAjIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAgICBpZiBleGFtcGxlLmV4Y19tc2cgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSA9IEJPT00KKworICAgICAgICAgICAgICAgICMgV2UgZXhwZWN0ZWQgYW4gZXhjZXB0aW9uOiAgc2VlIHdoZXRoZXIgaXQgbWF0Y2hlcy4KKyAgICAgICAgICAgICAgICBlbGlmIGNoZWNrKGV4YW1wbGUuZXhjX21zZywgZXhjX21zZywgc2VsZi5vcHRpb25mbGFncyk6CisgICAgICAgICAgICAgICAgICAgIG91dGNvbWUgPSBTVUNDRVNTCisKKyAgICAgICAgICAgICAgICAjIEFub3RoZXIgY2hhbmNlIGlmIHRoZXkgZGlkbid0IGNhcmUgYWJvdXQgdGhlIGRldGFpbC4KKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYub3B0aW9uZmxhZ3MgJiBJR05PUkVfRVhDRVBUSU9OX0RFVEFJTDoKKyAgICAgICAgICAgICAgICAgICAgbTEgPSByZS5tYXRjaChyJyg/OlteOl0qXC4pPyhbXjpdKjopJywgZXhhbXBsZS5leGNfbXNnKQorICAgICAgICAgICAgICAgICAgICBtMiA9IHJlLm1hdGNoKHInKD86W146XSpcLik/KFteOl0qOiknLCBleGNfbXNnKQorICAgICAgICAgICAgICAgICAgICBpZiBtMSBhbmQgbTIgYW5kIGNoZWNrKG0xLmdyb3VwKDEpLCBtMi5ncm91cCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbmZsYWdzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUgPSBTVUNDRVNTCisKKyAgICAgICAgICAgICMgUmVwb3J0IHRoZSBvdXRjb21lLgorICAgICAgICAgICAgaWYgb3V0Y29tZSBpcyBTVUNDRVNTOgorICAgICAgICAgICAgICAgIGlmIG5vdCBxdWlldDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRfc3VjY2VzcyhvdXQsIHRlc3QsIGV4YW1wbGUsIGdvdCkKKyAgICAgICAgICAgIGVsaWYgb3V0Y29tZSBpcyBGQUlMVVJFOgorICAgICAgICAgICAgICAgIGlmIG5vdCBxdWlldDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRfZmFpbHVyZShvdXQsIHRlc3QsIGV4YW1wbGUsIGdvdCkKKyAgICAgICAgICAgICAgICBmYWlsdXJlcyArPSAxCisgICAgICAgICAgICBlbGlmIG91dGNvbWUgaXMgQk9PTToKKyAgICAgICAgICAgICAgICBpZiBub3QgcXVpZXQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0X3VuZXhwZWN0ZWRfZXhjZXB0aW9uKG91dCwgdGVzdCwgZXhhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjX2luZm8pCisgICAgICAgICAgICAgICAgZmFpbHVyZXMgKz0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgRmFsc2UsICgidW5rbm93biBvdXRjb21lIiwgb3V0Y29tZSkKKworICAgICAgICAjIFJlc3RvcmUgdGhlIG9wdGlvbiBmbGFncyAoaW4gY2FzZSB0aGV5IHdlcmUgbW9kaWZpZWQpCisgICAgICAgIHNlbGYub3B0aW9uZmxhZ3MgPSBvcmlnaW5hbF9vcHRpb25mbGFncworCisgICAgICAgICMgUmVjb3JkIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBmYWlsdXJlcyBhbmQgdHJpZXMuCisgICAgICAgIHNlbGYuX19yZWNvcmRfb3V0Y29tZSh0ZXN0LCBmYWlsdXJlcywgdHJpZXMpCisgICAgICAgIHJldHVybiBUZXN0UmVzdWx0cyhmYWlsdXJlcywgdHJpZXMpCisKKyAgICBkZWYgX19yZWNvcmRfb3V0Y29tZShzZWxmLCB0ZXN0LCBmLCB0KToKKyAgICAgICAgIiIiCisgICAgICAgIFJlY29yZCB0aGUgZmFjdCB0aGF0IHRoZSBnaXZlbiBEb2NUZXN0IChgdGVzdGApIGdlbmVyYXRlZCBgZmAKKyAgICAgICAgZmFpbHVyZXMgb3V0IG9mIGB0YCB0cmllZCBleGFtcGxlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGYyLCB0MiA9IHNlbGYuX25hbWUyZnQuZ2V0KHRlc3QubmFtZSwgKDAsMCkpCisgICAgICAgIHNlbGYuX25hbWUyZnRbdGVzdC5uYW1lXSA9IChmK2YyLCB0K3QyKQorICAgICAgICBzZWxmLmZhaWx1cmVzICs9IGYKKyAgICAgICAgc2VsZi50cmllcyArPSB0CisKKyAgICBfX0xJTkVDQUNIRV9GSUxFTkFNRV9SRSA9IHJlLmNvbXBpbGUocic8ZG9jdGVzdCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInKD9QPG5hbWU+LispJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1xbKD9QPGV4YW1wbGVudW0+XGQrKVxdPiQnKQorICAgIGRlZiBfX3BhdGNoZWRfbGluZWNhY2hlX2dldGxpbmVzKHNlbGYsIGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscz1Ob25lKToKKyAgICAgICAgbSA9IHNlbGYuX19MSU5FQ0FDSEVfRklMRU5BTUVfUkUubWF0Y2goZmlsZW5hbWUpCisgICAgICAgIGlmIG0gYW5kIG0uZ3JvdXAoJ25hbWUnKSA9PSBzZWxmLnRlc3QubmFtZToKKyAgICAgICAgICAgIGV4YW1wbGUgPSBzZWxmLnRlc3QuZXhhbXBsZXNbaW50KG0uZ3JvdXAoJ2V4YW1wbGVudW0nKSldCisgICAgICAgICAgICBzb3VyY2UgPSBleGFtcGxlLnNvdXJjZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzb3VyY2UsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5lbmNvZGUoJ2FzY2lpJywgJ2JhY2tzbGFzaHJlcGxhY2UnKQorICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zcGxpdGxpbmVzKFRydWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zYXZlX2xpbmVjYWNoZV9nZXRsaW5lcyhmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHMpCisKKyAgICBkZWYgcnVuKHNlbGYsIHRlc3QsIGNvbXBpbGVmbGFncz1Ob25lLCBvdXQ9Tm9uZSwgY2xlYXJfZ2xvYnM9VHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBSdW4gdGhlIGV4YW1wbGVzIGluIGB0ZXN0YCwgYW5kIGRpc3BsYXkgdGhlIHJlc3VsdHMgdXNpbmcgdGhlCisgICAgICAgIHdyaXRlciBmdW5jdGlvbiBgb3V0YC4KKworICAgICAgICBUaGUgZXhhbXBsZXMgYXJlIHJ1biBpbiB0aGUgbmFtZXNwYWNlIGB0ZXN0Lmdsb2JzYC4gIElmCisgICAgICAgIGBjbGVhcl9nbG9ic2AgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGVuIHRoaXMgbmFtZXNwYWNlIHdpbGwKKyAgICAgICAgYmUgY2xlYXJlZCBhZnRlciB0aGUgdGVzdCBydW5zLCB0byBoZWxwIHdpdGggZ2FyYmFnZQorICAgICAgICBjb2xsZWN0aW9uLiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gZXhhbWluZSB0aGUgbmFtZXNwYWNlIGFmdGVyCisgICAgICAgIHRoZSB0ZXN0IGNvbXBsZXRlcywgdGhlbiB1c2UgYGNsZWFyX2dsb2JzPUZhbHNlYC4KKworICAgICAgICBgY29tcGlsZWZsYWdzYCBnaXZlcyB0aGUgc2V0IG9mIGZsYWdzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkKKyAgICAgICAgdGhlIFB5dGhvbiBjb21waWxlciB3aGVuIHJ1bm5pbmcgdGhlIGV4YW1wbGVzLiAgSWYgbm90CisgICAgICAgIHNwZWNpZmllZCwgdGhlbiBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIHNldCBvZiBmdXR1cmUtaW1wb3J0CisgICAgICAgIGZsYWdzIHRoYXQgYXBwbHkgdG8gYGdsb2JzYC4KKworICAgICAgICBUaGUgb3V0cHV0IG9mIGVhY2ggZXhhbXBsZSBpcyBjaGVja2VkIHVzaW5nCisgICAgICAgIGBEb2NUZXN0UnVubmVyLmNoZWNrX291dHB1dGAsIGFuZCB0aGUgcmVzdWx0cyBhcmUgZm9ybWF0dGVkIGJ5CisgICAgICAgIHRoZSBgRG9jVGVzdFJ1bm5lci5yZXBvcnRfKmAgbWV0aG9kcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudGVzdCA9IHRlc3QKKworICAgICAgICBpZiBjb21waWxlZmxhZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbXBpbGVmbGFncyA9IF9leHRyYWN0X2Z1dHVyZV9mbGFncyh0ZXN0Lmdsb2JzKQorCisgICAgICAgIHNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBpZiBvdXQgaXMgTm9uZToKKyAgICAgICAgICAgIG91dCA9IHNhdmVfc3Rkb3V0LndyaXRlCisgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLl9mYWtlb3V0CisKKyAgICAgICAgIyBQYXRjaCBwZGIuc2V0X3RyYWNlIHRvIHJlc3RvcmUgc3lzLnN0ZG91dCBkdXJpbmcgaW50ZXJhY3RpdmUKKyAgICAgICAgIyBkZWJ1Z2dpbmcgKHNvIGl0J3Mgbm90IHN0aWxsIHJlZGlyZWN0ZWQgdG8gc2VsZi5fZmFrZW91dCkuCisgICAgICAgICMgTm90ZSB0aGF0IHRoZSBpbnRlcmFjdGl2ZSBvdXRwdXQgd2lsbCBnbyB0byAqb3VyKgorICAgICAgICAjIHNhdmVfc3Rkb3V0LCBldmVuIGlmIHRoYXQncyBub3QgdGhlIHJlYWwgc3lzLnN0ZG91dDsgdGhpcworICAgICAgICAjIGFsbG93cyB1cyB0byB3cml0ZSB0ZXN0IGNhc2VzIGZvciB0aGUgc2V0X3RyYWNlIGJlaGF2aW9yLgorICAgICAgICBzYXZlX3NldF90cmFjZSA9IHBkYi5zZXRfdHJhY2UKKyAgICAgICAgc2VsZi5kZWJ1Z2dlciA9IF9PdXRwdXRSZWRpcmVjdGluZ1BkYihzYXZlX3N0ZG91dCkKKyAgICAgICAgc2VsZi5kZWJ1Z2dlci5yZXNldCgpCisgICAgICAgIHBkYi5zZXRfdHJhY2UgPSBzZWxmLmRlYnVnZ2VyLnNldF90cmFjZQorCisgICAgICAgICMgUGF0Y2ggbGluZWNhY2hlLmdldGxpbmVzLCBzbyB3ZSBjYW4gc2VlIHRoZSBleGFtcGxlJ3Mgc291cmNlCisgICAgICAgICMgd2hlbiB3ZSdyZSBpbnNpZGUgdGhlIGRlYnVnZ2VyLgorICAgICAgICBzZWxmLnNhdmVfbGluZWNhY2hlX2dldGxpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzCisgICAgICAgIGxpbmVjYWNoZS5nZXRsaW5lcyA9IHNlbGYuX19wYXRjaGVkX2xpbmVjYWNoZV9nZXRsaW5lcworCisgICAgICAgICMgTWFrZSBzdXJlIHN5cy5kaXNwbGF5aG9vayBqdXN0IHByaW50cyB0aGUgdmFsdWUgdG8gc3Rkb3V0CisgICAgICAgIHNhdmVfZGlzcGxheWhvb2sgPSBzeXMuZGlzcGxheWhvb2sKKyAgICAgICAgc3lzLmRpc3BsYXlob29rID0gc3lzLl9fZGlzcGxheWhvb2tfXworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fcnVuKHRlc3QsIGNvbXBpbGVmbGFncywgb3V0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CisgICAgICAgICAgICBwZGIuc2V0X3RyYWNlID0gc2F2ZV9zZXRfdHJhY2UKKyAgICAgICAgICAgIGxpbmVjYWNoZS5nZXRsaW5lcyA9IHNlbGYuc2F2ZV9saW5lY2FjaGVfZ2V0bGluZXMKKyAgICAgICAgICAgIHN5cy5kaXNwbGF5aG9vayA9IHNhdmVfZGlzcGxheWhvb2sKKyAgICAgICAgICAgIGlmIGNsZWFyX2dsb2JzOgorICAgICAgICAgICAgICAgIHRlc3QuZ2xvYnMuY2xlYXIoKQorCisgICAgIy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgIyBTdW1tYXJpemF0aW9uCisgICAgIy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgZGVmIHN1bW1hcml6ZShzZWxmLCB2ZXJib3NlPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIGFsbCB0aGUgdGVzdCBjYXNlcyB0aGF0IGhhdmUgYmVlbiBydW4gYnkKKyAgICAgICAgdGhpcyBEb2NUZXN0UnVubmVyLCBhbmQgcmV0dXJuIGEgdHVwbGUgYChmLCB0KWAsIHdoZXJlIGBmYCBpcworICAgICAgICB0aGUgdG90YWwgbnVtYmVyIG9mIGZhaWxlZCBleGFtcGxlcywgYW5kIGB0YCBpcyB0aGUgdG90YWwKKyAgICAgICAgbnVtYmVyIG9mIHRyaWVkIGV4YW1wbGVzLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBgdmVyYm9zZWAgYXJndW1lbnQgY29udHJvbHMgaG93IGRldGFpbGVkIHRoZQorICAgICAgICBzdW1tYXJ5IGlzLiAgSWYgdGhlIHZlcmJvc2l0eSBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZQorICAgICAgICBEb2NUZXN0UnVubmVyJ3MgdmVyYm9zaXR5IGlzIHVzZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiB2ZXJib3NlIGlzIE5vbmU6CisgICAgICAgICAgICB2ZXJib3NlID0gc2VsZi5fdmVyYm9zZQorICAgICAgICBub3Rlc3RzID0gW10KKyAgICAgICAgcGFzc2VkID0gW10KKyAgICAgICAgZmFpbGVkID0gW10KKyAgICAgICAgdG90YWx0ID0gdG90YWxmID0gMAorICAgICAgICBmb3IgeCBpbiBzZWxmLl9uYW1lMmZ0Lml0ZW1zKCk6CisgICAgICAgICAgICBuYW1lLCAoZiwgdCkgPSB4CisgICAgICAgICAgICBhc3NlcnQgZiA8PSB0CisgICAgICAgICAgICB0b3RhbHQgKz0gdAorICAgICAgICAgICAgdG90YWxmICs9IGYKKyAgICAgICAgICAgIGlmIHQgPT0gMDoKKyAgICAgICAgICAgICAgICBub3Rlc3RzLmFwcGVuZChuYW1lKQorICAgICAgICAgICAgZWxpZiBmID09IDA6CisgICAgICAgICAgICAgICAgcGFzc2VkLmFwcGVuZCggKG5hbWUsIHQpICkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmFpbGVkLmFwcGVuZCh4KQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgaWYgbm90ZXN0czoKKyAgICAgICAgICAgICAgICBwcmludCBsZW4obm90ZXN0cyksICJpdGVtcyBoYWQgbm8gdGVzdHM6IgorICAgICAgICAgICAgICAgIG5vdGVzdHMuc29ydCgpCisgICAgICAgICAgICAgICAgZm9yIHRoaW5nIGluIG5vdGVzdHM6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIgICAiLCB0aGluZworICAgICAgICAgICAgaWYgcGFzc2VkOgorICAgICAgICAgICAgICAgIHByaW50IGxlbihwYXNzZWQpLCAiaXRlbXMgcGFzc2VkIGFsbCB0ZXN0czoiCisgICAgICAgICAgICAgICAgcGFzc2VkLnNvcnQoKQorICAgICAgICAgICAgICAgIGZvciB0aGluZywgY291bnQgaW4gcGFzc2VkOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiICUzZCB0ZXN0cyBpbiAlcyIgJSAoY291bnQsIHRoaW5nKQorICAgICAgICBpZiBmYWlsZWQ6CisgICAgICAgICAgICBwcmludCBzZWxmLkRJVklERVIKKyAgICAgICAgICAgIHByaW50IGxlbihmYWlsZWQpLCAiaXRlbXMgaGFkIGZhaWx1cmVzOiIKKyAgICAgICAgICAgIGZhaWxlZC5zb3J0KCkKKyAgICAgICAgICAgIGZvciB0aGluZywgKGYsIHQpIGluIGZhaWxlZDoKKyAgICAgICAgICAgICAgICBwcmludCAiICUzZCBvZiAlM2QgaW4gJXMiICUgKGYsIHQsIHRoaW5nKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgdG90YWx0LCAidGVzdHMgaW4iLCBsZW4oc2VsZi5fbmFtZTJmdCksICJpdGVtcy4iCisgICAgICAgICAgICBwcmludCB0b3RhbHQgLSB0b3RhbGYsICJwYXNzZWQgYW5kIiwgdG90YWxmLCAiZmFpbGVkLiIKKyAgICAgICAgaWYgdG90YWxmOgorICAgICAgICAgICAgcHJpbnQgIioqKlRlc3QgRmFpbGVkKioqIiwgdG90YWxmLCAiZmFpbHVyZXMuIgorICAgICAgICBlbGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiVGVzdCBwYXNzZWQuIgorICAgICAgICByZXR1cm4gVGVzdFJlc3VsdHModG90YWxmLCB0b3RhbHQpCisKKyAgICAjLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgY3J1ZnQgdG8gbWFpbnRhaW4gZG9jdGVzdC5tYXN0ZXIuCisgICAgIy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgZGVmIG1lcmdlKHNlbGYsIG90aGVyKToKKyAgICAgICAgZCA9IHNlbGYuX25hbWUyZnQKKyAgICAgICAgZm9yIG5hbWUsIChmLCB0KSBpbiBvdGhlci5fbmFtZTJmdC5pdGVtcygpOgorICAgICAgICAgICAgaWYgbmFtZSBpbiBkOgorICAgICAgICAgICAgICAgICMgRG9uJ3QgcHJpbnQgaGVyZSBieSBkZWZhdWx0LCBzaW5jZSBkb2luZworICAgICAgICAgICAgICAgICMgICAgIHNvIGJyZWFrcyBzb21lIG9mIHRoZSBidWlsZGJvdHMKKyAgICAgICAgICAgICAgICAjcHJpbnQgIioqKiBEb2NUZXN0UnVubmVyLm1lcmdlOiAnIiArIG5hbWUgKyAiJyBpbiBib3RoIiBcCisgICAgICAgICAgICAgICAgIyAgICAiIHRlc3RlcnM7IHN1bW1pbmcgb3V0Y29tZXMuIgorICAgICAgICAgICAgICAgIGYyLCB0MiA9IGRbbmFtZV0KKyAgICAgICAgICAgICAgICBmID0gZiArIGYyCisgICAgICAgICAgICAgICAgdCA9IHQgKyB0MgorICAgICAgICAgICAgZFtuYW1lXSA9IGYsIHQKKworY2xhc3MgT3V0cHV0Q2hlY2tlcjoKKyAgICAiIiIKKyAgICBBIGNsYXNzIHVzZWQgdG8gY2hlY2sgdGhlIHdoZXRoZXIgdGhlIGFjdHVhbCBvdXRwdXQgZnJvbSBhIGRvY3Rlc3QKKyAgICBleGFtcGxlIG1hdGNoZXMgdGhlIGV4cGVjdGVkIG91dHB1dC4gIGBPdXRwdXRDaGVja2VyYCBkZWZpbmVzIHR3bworICAgIG1ldGhvZHM6IGBjaGVja19vdXRwdXRgLCB3aGljaCBjb21wYXJlcyBhIGdpdmVuIHBhaXIgb2Ygb3V0cHV0cywKKyAgICBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZXkgbWF0Y2g7IGFuZCBgb3V0cHV0X2RpZmZlcmVuY2VgLCB3aGljaAorICAgIHJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gb3V0cHV0cy4KKyAgICAiIiIKKyAgICBkZWYgY2hlY2tfb3V0cHV0KHNlbGYsIHdhbnQsIGdvdCwgb3B0aW9uZmxhZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIFRydWUgaWZmIHRoZSBhY3R1YWwgb3V0cHV0IGZyb20gYW4gZXhhbXBsZSAoYGdvdGApCisgICAgICAgIG1hdGNoZXMgdGhlIGV4cGVjdGVkIG91dHB1dCAoYHdhbnRgKS4gIFRoZXNlIHN0cmluZ3MgYXJlCisgICAgICAgIGFsd2F5cyBjb25zaWRlcmVkIHRvIG1hdGNoIGlmIHRoZXkgYXJlIGlkZW50aWNhbDsgYnV0CisgICAgICAgIGRlcGVuZGluZyBvbiB3aGF0IG9wdGlvbiBmbGFncyB0aGUgdGVzdCBydW5uZXIgaXMgdXNpbmcsCisgICAgICAgIHNldmVyYWwgbm9uLWV4YWN0IG1hdGNoIHR5cGVzIGFyZSBhbHNvIHBvc3NpYmxlLiAgU2VlIHRoZQorICAgICAgICBkb2N1bWVudGF0aW9uIGZvciBgVGVzdFJ1bm5lcmAgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgICAgb3B0aW9uIGZsYWdzLgorICAgICAgICAiIiIKKyAgICAgICAgIyBIYW5kbGUgdGhlIGNvbW1vbiBjYXNlIGZpcnN0LCBmb3IgZWZmaWNpZW5jeToKKyAgICAgICAgIyBpZiB0aGV5J3JlIHN0cmluZy1pZGVudGljYWwsIGFsd2F5cyByZXR1cm4gdHJ1ZS4KKyAgICAgICAgaWYgZ290ID09IHdhbnQ6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICMgVGhlIHZhbHVlcyBUcnVlIGFuZCBGYWxzZSByZXBsYWNlZCAxIGFuZCAwIGFzIHRoZSByZXR1cm4KKyAgICAgICAgIyB2YWx1ZSBmb3IgYm9vbGVhbiBjb21wYXJpc29ucyBpbiBQeXRob24gMi4zLgorICAgICAgICBpZiBub3QgKG9wdGlvbmZsYWdzICYgRE9OVF9BQ0NFUFRfVFJVRV9GT1JfMSk6CisgICAgICAgICAgICBpZiAoZ290LHdhbnQpID09ICgiVHJ1ZVxuIiwgIjFcbiIpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBpZiAoZ290LHdhbnQpID09ICgiRmFsc2VcbiIsICIwXG4iKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICMgPEJMQU5LTElORT4gY2FuIGJlIHVzZWQgYXMgYSBzcGVjaWFsIHNlcXVlbmNlIHRvIHNpZ25pZnkgYQorICAgICAgICAjIGJsYW5rIGxpbmUsIHVubGVzcyB0aGUgRE9OVF9BQ0NFUFRfQkxBTktMSU5FIGZsYWcgaXMgdXNlZC4KKyAgICAgICAgaWYgbm90IChvcHRpb25mbGFncyAmIERPTlRfQUNDRVBUX0JMQU5LTElORSk6CisgICAgICAgICAgICAjIFJlcGxhY2UgPEJMQU5LTElORT4gaW4gd2FudCB3aXRoIGEgYmxhbmsgbGluZS4KKyAgICAgICAgICAgIHdhbnQgPSByZS5zdWIoJyg/bSleJXNccyo/JCcgJSByZS5lc2NhcGUoQkxBTktMSU5FX01BUktFUiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICcnLCB3YW50KQorICAgICAgICAgICAgIyBJZiBhIGxpbmUgaW4gZ290IGNvbnRhaW5zIG9ubHkgc3BhY2VzLCB0aGVuIHJlbW92ZSB0aGUKKyAgICAgICAgICAgICMgc3BhY2VzLgorICAgICAgICAgICAgZ290ID0gcmUuc3ViKCcoP20pXlxzKj8kJywgJycsIGdvdCkKKyAgICAgICAgICAgIGlmIGdvdCA9PSB3YW50OgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgIyBUaGlzIGZsYWcgY2F1c2VzIGRvY3Rlc3QgdG8gaWdub3JlIGFueSBkaWZmZXJlbmNlcyBpbiB0aGUKKyAgICAgICAgIyBjb250ZW50cyBvZiB3aGl0ZXNwYWNlIHN0cmluZ3MuICBOb3RlIHRoYXQgdGhpcyBjYW4gYmUgdXNlZAorICAgICAgICAjIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEVMTElQU0lTIGZsYWcuCisgICAgICAgIGlmIG9wdGlvbmZsYWdzICYgTk9STUFMSVpFX1dISVRFU1BBQ0U6CisgICAgICAgICAgICBnb3QgPSAnICcuam9pbihnb3Quc3BsaXQoKSkKKyAgICAgICAgICAgIHdhbnQgPSAnICcuam9pbih3YW50LnNwbGl0KCkpCisgICAgICAgICAgICBpZiBnb3QgPT0gd2FudDoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICMgVGhlIEVMTElQU0lTIGZsYWcgc2F5cyB0byBsZXQgdGhlIHNlcXVlbmNlICIuLi4iIGluIGB3YW50YAorICAgICAgICAjIG1hdGNoIGFueSBzdWJzdHJpbmcgaW4gYGdvdGAuCisgICAgICAgIGlmIG9wdGlvbmZsYWdzICYgRUxMSVBTSVM6CisgICAgICAgICAgICBpZiBfZWxsaXBzaXNfbWF0Y2god2FudCwgZ290KToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICMgV2UgZGlkbid0IGZpbmQgYW55IG1hdGNoOyByZXR1cm4gZmFsc2UuCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBTaG91bGQgd2UgZG8gYSBmYW5jeSBkaWZmPworICAgIGRlZiBfZG9fYV9mYW5jeV9kaWZmKHNlbGYsIHdhbnQsIGdvdCwgb3B0aW9uZmxhZ3MpOgorICAgICAgICAjIE5vdCB1bmxlc3MgdGhleSBhc2tlZCBmb3IgYSBmYW5jeSBkaWZmLgorICAgICAgICBpZiBub3Qgb3B0aW9uZmxhZ3MgJiAoUkVQT1JUX1VESUZGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUE9SVF9DRElGRiB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVBPUlRfTkRJRkYpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgIyBJZiBleHBlY3RlZCBvdXRwdXQgdXNlcyBlbGxpcHNpcywgYSBtZWFuaW5nZnVsIGZhbmN5IGRpZmYgaXMKKyAgICAgICAgIyB0b28gaGFyZCAuLi4gb3IgbWF5YmUgbm90LiAgSW4gdHdvIHJlYWwtbGlmZSBmYWlsdXJlcyBUaW0gc2F3LAorICAgICAgICAjIGEgZGlmZiB3YXMgYSBtYWpvciBoZWxwIGFueXdheSwgc28gdGhpcyBpcyBjb21tZW50ZWQgb3V0LgorICAgICAgICAjIFt0b2RvXSBfZWxsaXBzaXNfbWF0Y2goKSBrbm93cyB3aGljaCBwaWVjZXMgZG8gYW5kIGRvbid0IG1hdGNoLAorICAgICAgICAjIGFuZCBjb3VsZCBiZSB0aGUgYmFzaXMgZm9yIGEga2ljay1hc3MgZGlmZiBpbiB0aGlzIGNhc2UuCisgICAgICAgICMjaWYgb3B0aW9uZmxhZ3MgJiBFTExJUFNJUyBhbmQgRUxMSVBTSVNfTUFSS0VSIGluIHdhbnQ6CisgICAgICAgICMjICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICMgbmRpZmYgZG9lcyBpbnRyYWxpbmUgZGlmZmVyZW5jZSBtYXJraW5nLCBzbyBjYW4gYmUgdXNlZnVsIGV2ZW4KKyAgICAgICAgIyBmb3IgMS1saW5lIGRpZmZlcmVuY2VzLgorICAgICAgICBpZiBvcHRpb25mbGFncyAmIFJFUE9SVF9ORElGRjoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgIyBUaGUgb3RoZXIgZGlmZiB0eXBlcyBuZWVkIGF0IGxlYXN0IGEgZmV3IGxpbmVzIHRvIGJlIGhlbHBmdWwuCisgICAgICAgIHJldHVybiB3YW50LmNvdW50KCdcbicpID4gMiBhbmQgZ290LmNvdW50KCdcbicpID4gMgorCisgICAgZGVmIG91dHB1dF9kaWZmZXJlbmNlKHNlbGYsIGV4YW1wbGUsIGdvdCwgb3B0aW9uZmxhZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlCisgICAgICAgIGV4cGVjdGVkIG91dHB1dCBmb3IgYSBnaXZlbiBleGFtcGxlIChgZXhhbXBsZWApIGFuZCB0aGUgYWN0dWFsCisgICAgICAgIG91dHB1dCAoYGdvdGApLiAgYG9wdGlvbmZsYWdzYCBpcyB0aGUgc2V0IG9mIG9wdGlvbiBmbGFncyB1c2VkCisgICAgICAgIHRvIGNvbXBhcmUgYHdhbnRgIGFuZCBgZ290YC4KKyAgICAgICAgIiIiCisgICAgICAgIHdhbnQgPSBleGFtcGxlLndhbnQKKyAgICAgICAgIyBJZiA8QkxBTktMSU5FPnMgYXJlIGJlaW5nIHVzZWQsIHRoZW4gcmVwbGFjZSBibGFuayBsaW5lcworICAgICAgICAjIHdpdGggPEJMQU5LTElORT4gaW4gdGhlIGFjdHVhbCBvdXRwdXQgc3RyaW5nLgorICAgICAgICBpZiBub3QgKG9wdGlvbmZsYWdzICYgRE9OVF9BQ0NFUFRfQkxBTktMSU5FKToKKyAgICAgICAgICAgIGdvdCA9IHJlLnN1YignKD9tKV5bIF0qKD89XG4pJywgQkxBTktMSU5FX01BUktFUiwgZ290KQorCisgICAgICAgICMgQ2hlY2sgaWYgd2Ugc2hvdWxkIHVzZSBkaWZmLgorICAgICAgICBpZiBzZWxmLl9kb19hX2ZhbmN5X2RpZmYod2FudCwgZ290LCBvcHRpb25mbGFncyk6CisgICAgICAgICAgICAjIFNwbGl0IHdhbnQgJiBnb3QgaW50byBsaW5lcy4KKyAgICAgICAgICAgIHdhbnRfbGluZXMgPSB3YW50LnNwbGl0bGluZXMoVHJ1ZSkgICMgVHJ1ZSA9PSBrZWVwIGxpbmUgZW5kcworICAgICAgICAgICAgZ290X2xpbmVzID0gZ290LnNwbGl0bGluZXMoVHJ1ZSkKKyAgICAgICAgICAgICMgVXNlIGRpZmZsaWIgdG8gZmluZCB0aGVpciBkaWZmZXJlbmNlcy4KKyAgICAgICAgICAgIGlmIG9wdGlvbmZsYWdzICYgUkVQT1JUX1VESUZGOgorICAgICAgICAgICAgICAgIGRpZmYgPSBkaWZmbGliLnVuaWZpZWRfZGlmZih3YW50X2xpbmVzLCBnb3RfbGluZXMsIG49MikKKyAgICAgICAgICAgICAgICBkaWZmID0gbGlzdChkaWZmKVsyOl0gIyBzdHJpcCB0aGUgZGlmZiBoZWFkZXIKKyAgICAgICAgICAgICAgICBraW5kID0gJ3VuaWZpZWQgZGlmZiB3aXRoIC1leHBlY3RlZCArYWN0dWFsJworICAgICAgICAgICAgZWxpZiBvcHRpb25mbGFncyAmIFJFUE9SVF9DRElGRjoKKyAgICAgICAgICAgICAgICBkaWZmID0gZGlmZmxpYi5jb250ZXh0X2RpZmYod2FudF9saW5lcywgZ290X2xpbmVzLCBuPTIpCisgICAgICAgICAgICAgICAgZGlmZiA9IGxpc3QoZGlmZilbMjpdICMgc3RyaXAgdGhlIGRpZmYgaGVhZGVyCisgICAgICAgICAgICAgICAga2luZCA9ICdjb250ZXh0IGRpZmYgd2l0aCBleHBlY3RlZCBmb2xsb3dlZCBieSBhY3R1YWwnCisgICAgICAgICAgICBlbGlmIG9wdGlvbmZsYWdzICYgUkVQT1JUX05ESUZGOgorICAgICAgICAgICAgICAgIGVuZ2luZSA9IGRpZmZsaWIuRGlmZmVyKGNoYXJqdW5rPWRpZmZsaWIuSVNfQ0hBUkFDVEVSX0pVTkspCisgICAgICAgICAgICAgICAgZGlmZiA9IGxpc3QoZW5naW5lLmNvbXBhcmUod2FudF9saW5lcywgZ290X2xpbmVzKSkKKyAgICAgICAgICAgICAgICBraW5kID0gJ25kaWZmIHdpdGggLWV4cGVjdGVkICthY3R1YWwnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFzc2VydCAwLCAnQmFkIGRpZmYgb3B0aW9uJworICAgICAgICAgICAgIyBSZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBvbiBkaWZmIG91dHB1dC4KKyAgICAgICAgICAgIGRpZmYgPSBbbGluZS5yc3RyaXAoKSArICdcbicgZm9yIGxpbmUgaW4gZGlmZl0KKyAgICAgICAgICAgIHJldHVybiAnRGlmZmVyZW5jZXMgKCVzKTpcbicgJSBraW5kICsgX2luZGVudCgnJy5qb2luKGRpZmYpKQorCisgICAgICAgICMgSWYgd2UncmUgbm90IHVzaW5nIGRpZmYsIHRoZW4gc2ltcGx5IGxpc3QgdGhlIGV4cGVjdGVkCisgICAgICAgICMgb3V0cHV0IGZvbGxvd2VkIGJ5IHRoZSBhY3R1YWwgb3V0cHV0LgorICAgICAgICBpZiB3YW50IGFuZCBnb3Q6CisgICAgICAgICAgICByZXR1cm4gJ0V4cGVjdGVkOlxuJXNHb3Q6XG4lcycgJSAoX2luZGVudCh3YW50KSwgX2luZGVudChnb3QpKQorICAgICAgICBlbGlmIHdhbnQ6CisgICAgICAgICAgICByZXR1cm4gJ0V4cGVjdGVkOlxuJXNHb3Qgbm90aGluZ1xuJyAlIF9pbmRlbnQod2FudCkKKyAgICAgICAgZWxpZiBnb3Q6CisgICAgICAgICAgICByZXR1cm4gJ0V4cGVjdGVkIG5vdGhpbmdcbkdvdDpcbiVzJyAlIF9pbmRlbnQoZ290KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdFeHBlY3RlZCBub3RoaW5nXG5Hb3Qgbm90aGluZ1xuJworCitjbGFzcyBEb2NUZXN0RmFpbHVyZShFeGNlcHRpb24pOgorICAgICIiIkEgRG9jVGVzdCBleGFtcGxlIGhhcyBmYWlsZWQgaW4gZGVidWdnaW5nIG1vZGUuCisKKyAgICBUaGUgZXhjZXB0aW9uIGluc3RhbmNlIGhhcyB2YXJpYWJsZXM6CisKKyAgICAtIHRlc3Q6IHRoZSBEb2NUZXN0IG9iamVjdCBiZWluZyBydW4KKworICAgIC0gZXhhbXBsZTogdGhlIEV4YW1wbGUgb2JqZWN0IHRoYXQgZmFpbGVkCisKKyAgICAtIGdvdDogdGhlIGFjdHVhbCBvdXRwdXQKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdCwgZXhhbXBsZSwgZ290KToKKyAgICAgICAgc2VsZi50ZXN0ID0gdGVzdAorICAgICAgICBzZWxmLmV4YW1wbGUgPSBleGFtcGxlCisgICAgICAgIHNlbGYuZ290ID0gZ290CisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLnRlc3QpCisKK2NsYXNzIFVuZXhwZWN0ZWRFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAiIiJBIERvY1Rlc3QgZXhhbXBsZSBoYXMgZW5jb3VudGVyZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24KKworICAgIFRoZSBleGNlcHRpb24gaW5zdGFuY2UgaGFzIHZhcmlhYmxlczoKKworICAgIC0gdGVzdDogdGhlIERvY1Rlc3Qgb2JqZWN0IGJlaW5nIHJ1bgorCisgICAgLSBleGFtcGxlOiB0aGUgRXhhbXBsZSBvYmplY3QgdGhhdCBmYWlsZWQKKworICAgIC0gZXhjX2luZm86IHRoZSBleGNlcHRpb24gaW5mbworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0LCBleGFtcGxlLCBleGNfaW5mbyk6CisgICAgICAgIHNlbGYudGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5leGFtcGxlID0gZXhhbXBsZQorICAgICAgICBzZWxmLmV4Y19pbmZvID0gZXhjX2luZm8KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYudGVzdCkKKworY2xhc3MgRGVidWdSdW5uZXIoRG9jVGVzdFJ1bm5lcik6CisgICAgciIiIlJ1biBkb2MgdGVzdHMgYnV0IHJhaXNlIGFuIGV4Y2VwdGlvbiBhcyBzb29uIGFzIHRoZXJlIGlzIGEgZmFpbHVyZS4KKworICAgICAgIElmIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9jY3VycywgYW4gVW5leHBlY3RlZEV4Y2VwdGlvbiBpcyByYWlzZWQuCisgICAgICAgSXQgY29udGFpbnMgdGhlIHRlc3QsIHRoZSBleGFtcGxlLCBhbmQgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbjoKKworICAgICAgICAgPj4+IHJ1bm5lciA9IERlYnVnUnVubmVyKHZlcmJvc2U9RmFsc2UpCisgICAgICAgICA+Pj4gdGVzdCA9IERvY1Rlc3RQYXJzZXIoKS5nZXRfZG9jdGVzdCgnPj4+IHJhaXNlIEtleUVycm9yXG40MicsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSwgJ2ZvbycsICdmb28ucHknLCAwKQorICAgICAgICAgPj4+IHRyeToKKyAgICAgICAgIC4uLiAgICAgcnVubmVyLnJ1bih0ZXN0KQorICAgICAgICAgLi4uIGV4Y2VwdCBVbmV4cGVjdGVkRXhjZXB0aW9uLCBmYWlsdXJlOgorICAgICAgICAgLi4uICAgICBwYXNzCisKKyAgICAgICAgID4+PiBmYWlsdXJlLnRlc3QgaXMgdGVzdAorICAgICAgICAgVHJ1ZQorCisgICAgICAgICA+Pj4gZmFpbHVyZS5leGFtcGxlLndhbnQKKyAgICAgICAgICc0MlxuJworCisgICAgICAgICA+Pj4gZXhjX2luZm8gPSBmYWlsdXJlLmV4Y19pbmZvCisgICAgICAgICA+Pj4gcmFpc2UgZXhjX2luZm9bMF0sIGV4Y19pbmZvWzFdLCBleGNfaW5mb1syXQorICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgICAgLi4uCisgICAgICAgICBLZXlFcnJvcgorCisgICAgICAgV2Ugd3JhcCB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uIHRvIGdpdmUgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24KKyAgICAgICBhY2Nlc3MgdG8gdGhlIHRlc3QgYW5kIGV4YW1wbGUgaW5mb3JtYXRpb24uCisKKyAgICAgICBJZiB0aGUgb3V0cHV0IGRvZXNuJ3QgbWF0Y2gsIHRoZW4gYSBEb2NUZXN0RmFpbHVyZSBpcyByYWlzZWQ6CisKKyAgICAgICAgID4+PiB0ZXN0ID0gRG9jVGVzdFBhcnNlcigpLmdldF9kb2N0ZXN0KCcnJworICAgICAgICAgLi4uICAgICAgPj4+IHggPSAxCisgICAgICAgICAuLi4gICAgICA+Pj4geAorICAgICAgICAgLi4uICAgICAgMgorICAgICAgICAgLi4uICAgICAgJycnLCB7fSwgJ2ZvbycsICdmb28ucHknLCAwKQorCisgICAgICAgICA+Pj4gdHJ5OgorICAgICAgICAgLi4uICAgIHJ1bm5lci5ydW4odGVzdCkKKyAgICAgICAgIC4uLiBleGNlcHQgRG9jVGVzdEZhaWx1cmUsIGZhaWx1cmU6CisgICAgICAgICAuLi4gICAgcGFzcworCisgICAgICAgRG9jVGVzdEZhaWx1cmUgb2JqZWN0cyBwcm92aWRlIGFjY2VzcyB0byB0aGUgdGVzdDoKKworICAgICAgICAgPj4+IGZhaWx1cmUudGVzdCBpcyB0ZXN0CisgICAgICAgICBUcnVlCisKKyAgICAgICBBcyB3ZWxsIGFzIHRvIHRoZSBleGFtcGxlOgorCisgICAgICAgICA+Pj4gZmFpbHVyZS5leGFtcGxlLndhbnQKKyAgICAgICAgICcyXG4nCisKKyAgICAgICBhbmQgdGhlIGFjdHVhbCBvdXRwdXQ6CisKKyAgICAgICAgID4+PiBmYWlsdXJlLmdvdAorICAgICAgICAgJzFcbicKKworICAgICAgIElmIGEgZmFpbHVyZSBvciBlcnJvciBvY2N1cnMsIHRoZSBnbG9iYWxzIGFyZSBsZWZ0IGludGFjdDoKKworICAgICAgICAgPj4+IGRlbCB0ZXN0Lmdsb2JzWydfX2J1aWx0aW5zX18nXQorICAgICAgICAgPj4+IHRlc3QuZ2xvYnMKKyAgICAgICAgIHsneCc6IDF9CisKKyAgICAgICAgID4+PiB0ZXN0ID0gRG9jVGVzdFBhcnNlcigpLmdldF9kb2N0ZXN0KCcnJworICAgICAgICAgLi4uICAgICAgPj4+IHggPSAyCisgICAgICAgICAuLi4gICAgICA+Pj4gcmFpc2UgS2V5RXJyb3IKKyAgICAgICAgIC4uLiAgICAgICcnJywge30sICdmb28nLCAnZm9vLnB5JywgMCkKKworICAgICAgICAgPj4+IHJ1bm5lci5ydW4odGVzdCkKKyAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgIC4uLgorICAgICAgICAgVW5leHBlY3RlZEV4Y2VwdGlvbjogPERvY1Rlc3QgZm9vIGZyb20gZm9vLnB5OjAgKDIgZXhhbXBsZXMpPgorCisgICAgICAgICA+Pj4gZGVsIHRlc3QuZ2xvYnNbJ19fYnVpbHRpbnNfXyddCisgICAgICAgICA+Pj4gdGVzdC5nbG9icworICAgICAgICAgeyd4JzogMn0KKworICAgICAgIEJ1dCB0aGUgZ2xvYmFscyBhcmUgY2xlYXJlZCBpZiB0aGVyZSBpcyBubyBlcnJvcjoKKworICAgICAgICAgPj4+IHRlc3QgPSBEb2NUZXN0UGFyc2VyKCkuZ2V0X2RvY3Rlc3QoJycnCisgICAgICAgICAuLi4gICAgICA+Pj4geCA9IDIKKyAgICAgICAgIC4uLiAgICAgICcnJywge30sICdmb28nLCAnZm9vLnB5JywgMCkKKworICAgICAgICAgPj4+IHJ1bm5lci5ydW4odGVzdCkKKyAgICAgICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKKworICAgICAgICAgPj4+IHRlc3QuZ2xvYnMKKyAgICAgICAgIHt9CisKKyAgICAgICAiIiIKKworICAgIGRlZiBydW4oc2VsZiwgdGVzdCwgY29tcGlsZWZsYWdzPU5vbmUsIG91dD1Ob25lLCBjbGVhcl9nbG9icz1UcnVlKToKKyAgICAgICAgciA9IERvY1Rlc3RSdW5uZXIucnVuKHNlbGYsIHRlc3QsIGNvbXBpbGVmbGFncywgb3V0LCBGYWxzZSkKKyAgICAgICAgaWYgY2xlYXJfZ2xvYnM6CisgICAgICAgICAgICB0ZXN0Lmdsb2JzLmNsZWFyKCkKKyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiByZXBvcnRfdW5leHBlY3RlZF9leGNlcHRpb24oc2VsZiwgb3V0LCB0ZXN0LCBleGFtcGxlLCBleGNfaW5mbyk6CisgICAgICAgIHJhaXNlIFVuZXhwZWN0ZWRFeGNlcHRpb24odGVzdCwgZXhhbXBsZSwgZXhjX2luZm8pCisKKyAgICBkZWYgcmVwb3J0X2ZhaWx1cmUoc2VsZiwgb3V0LCB0ZXN0LCBleGFtcGxlLCBnb3QpOgorICAgICAgICByYWlzZSBEb2NUZXN0RmFpbHVyZSh0ZXN0LCBleGFtcGxlLCBnb3QpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIDYuIFRlc3QgRnVuY3Rpb25zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRoZXNlIHNob3VsZCBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZS4KKworIyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgYSBnbG9iYWwgaW5zdGFuY2Ugb2YgYSBEb2NUZXN0UnVubmVyCisjIGNsYXNzLCB1cGRhdGVkIGJ5IHRlc3Rtb2QuCittYXN0ZXIgPSBOb25lCisKK2RlZiB0ZXN0bW9kKG09Tm9uZSwgbmFtZT1Ob25lLCBnbG9icz1Ob25lLCB2ZXJib3NlPU5vbmUsCisgICAgICAgICAgICByZXBvcnQ9VHJ1ZSwgb3B0aW9uZmxhZ3M9MCwgZXh0cmFnbG9icz1Ob25lLAorICAgICAgICAgICAgcmFpc2Vfb25fZXJyb3I9RmFsc2UsIGV4Y2x1ZGVfZW1wdHk9RmFsc2UpOgorICAgICIiIm09Tm9uZSwgbmFtZT1Ob25lLCBnbG9icz1Ob25lLCB2ZXJib3NlPU5vbmUsIHJlcG9ydD1UcnVlLAorICAgICAgIG9wdGlvbmZsYWdzPTAsIGV4dHJhZ2xvYnM9Tm9uZSwgcmFpc2Vfb25fZXJyb3I9RmFsc2UsCisgICAgICAgZXhjbHVkZV9lbXB0eT1GYWxzZQorCisgICAgVGVzdCBleGFtcGxlcyBpbiBkb2NzdHJpbmdzIGluIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyByZWFjaGFibGUKKyAgICBmcm9tIG1vZHVsZSBtIChvciB0aGUgY3VycmVudCBtb2R1bGUgaWYgbSBpcyBub3Qgc3VwcGxpZWQpLCBzdGFydGluZworICAgIHdpdGggbS5fX2RvY19fLgorCisgICAgQWxzbyB0ZXN0IGV4YW1wbGVzIHJlYWNoYWJsZSBmcm9tIGRpY3QgbS5fX3Rlc3RfXyBpZiBpdCBleGlzdHMgYW5kIGlzCisgICAgbm90IE5vbmUuICBtLl9fdGVzdF9fIG1hcHMgbmFtZXMgdG8gZnVuY3Rpb25zLCBjbGFzc2VzIGFuZCBzdHJpbmdzOworICAgIGZ1bmN0aW9uIGFuZCBjbGFzcyBkb2NzdHJpbmdzIGFyZSB0ZXN0ZWQgZXZlbiBpZiB0aGUgbmFtZSBpcyBwcml2YXRlOworICAgIHN0cmluZ3MgYXJlIHRlc3RlZCBkaXJlY3RseSwgYXMgaWYgdGhleSB3ZXJlIGRvY3N0cmluZ3MuCisKKyAgICBSZXR1cm4gKCNmYWlsdXJlcywgI3Rlc3RzKS4KKworICAgIFNlZSBoZWxwKGRvY3Rlc3QpIGZvciBhbiBvdmVydmlldy4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnICJuYW1lIiBnaXZlcyB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlOyBieSBkZWZhdWx0CisgICAgdXNlIG0uX19uYW1lX18uCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAiZ2xvYnMiIGdpdmVzIGEgZGljdCB0byBiZSB1c2VkIGFzIHRoZSBnbG9iYWxzCisgICAgd2hlbiBleGVjdXRpbmcgZXhhbXBsZXM7IGJ5IGRlZmF1bHQsIHVzZSBtLl9fZGljdF9fLiAgQSBjb3B5IG9mIHRoaXMKKyAgICBkaWN0IGlzIGFjdHVhbGx5IHVzZWQgZm9yIGVhY2ggZG9jc3RyaW5nLCBzbyB0aGF0IGVhY2ggZG9jc3RyaW5nJ3MKKyAgICBleGFtcGxlcyBzdGFydCB3aXRoIGEgY2xlYW4gc2xhdGUuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAiZXh0cmFnbG9icyIgZ2l2ZXMgYSBkaWN0aW9uYXJ5IHRoYXQgc2hvdWxkIGJlCisgICAgbWVyZ2VkIGludG8gdGhlIGdsb2JhbHMgdGhhdCBhcmUgdXNlZCB0byBleGVjdXRlIGV4YW1wbGVzLiAgQnkKKyAgICBkZWZhdWx0LCBubyBleHRyYSBnbG9iYWxzIGFyZSB1c2VkLiAgVGhpcyBpcyBuZXcgaW4gMi40LgorCisgICAgT3B0aW9uYWwga2V5d29yZCBhcmcgInZlcmJvc2UiIHByaW50cyBsb3RzIG9mIHN0dWZmIGlmIHRydWUsIHByaW50cworICAgIG9ubHkgZmFpbHVyZXMgaWYgZmFsc2U7IGJ5IGRlZmF1bHQsIGl0J3MgdHJ1ZSBpZmYgIi12IiBpcyBpbiBzeXMuYXJndi4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnICJyZXBvcnQiIHByaW50cyBhIHN1bW1hcnkgYXQgdGhlIGVuZCB3aGVuIHRydWUsCisgICAgZWxzZSBwcmludHMgbm90aGluZyBhdCB0aGUgZW5kLiAgSW4gdmVyYm9zZSBtb2RlLCB0aGUgc3VtbWFyeSBpcworICAgIGRldGFpbGVkLCBlbHNlIHZlcnkgYnJpZWYgKGluIGZhY3QsIGVtcHR5IGlmIGFsbCB0ZXN0cyBwYXNzZWQpLgorCisgICAgT3B0aW9uYWwga2V5d29yZCBhcmcgIm9wdGlvbmZsYWdzIiBvcidzIHRvZ2V0aGVyIG1vZHVsZSBjb25zdGFudHMsCisgICAgYW5kIGRlZmF1bHRzIHRvIDAuICBUaGlzIGlzIG5ldyBpbiAyLjMuICBQb3NzaWJsZSB2YWx1ZXMgKHNlZSB0aGUKKyAgICBkb2NzIGZvciBkZXRhaWxzKToKKworICAgICAgICBET05UX0FDQ0VQVF9UUlVFX0ZPUl8xCisgICAgICAgIERPTlRfQUNDRVBUX0JMQU5LTElORQorICAgICAgICBOT1JNQUxJWkVfV0hJVEVTUEFDRQorICAgICAgICBFTExJUFNJUworICAgICAgICBTS0lQCisgICAgICAgIElHTk9SRV9FWENFUFRJT05fREVUQUlMCisgICAgICAgIFJFUE9SVF9VRElGRgorICAgICAgICBSRVBPUlRfQ0RJRkYKKyAgICAgICAgUkVQT1JUX05ESUZGCisgICAgICAgIFJFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUKKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnICJyYWlzZV9vbl9lcnJvciIgcmFpc2VzIGFuIGV4Y2VwdGlvbiBvbiB0aGUKKyAgICBmaXJzdCB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBvciBmYWlsdXJlLiBUaGlzIGFsbG93cyBmYWlsdXJlcyB0byBiZQorICAgIHBvc3QtbW9ydGVtIGRlYnVnZ2VkLgorCisgICAgQWR2YW5jZWQgdG9tZm9vbGVyeTogIHRlc3Rtb2QgcnVucyBtZXRob2RzIG9mIGEgbG9jYWwgaW5zdGFuY2Ugb2YKKyAgICBjbGFzcyBkb2N0ZXN0LlRlc3RlciwgdGhlbiBtZXJnZXMgdGhlIHJlc3VsdHMgaW50byAob3IgY3JlYXRlcykKKyAgICBnbG9iYWwgVGVzdGVyIGluc3RhbmNlIGRvY3Rlc3QubWFzdGVyLiAgTWV0aG9kcyBvZiBkb2N0ZXN0Lm1hc3RlcgorICAgIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgdG9vLCBpZiB5b3Ugd2FudCB0byBkbyBzb21ldGhpbmcgdW51c3VhbC4KKyAgICBQYXNzaW5nIHJlcG9ydD0wIHRvIHRlc3Rtb2QgaXMgZXNwZWNpYWxseSB1c2VmdWwgdGhlbiwgdG8gZGVsYXkKKyAgICBkaXNwbGF5aW5nIGEgc3VtbWFyeS4gIEludm9rZSBkb2N0ZXN0Lm1hc3Rlci5zdW1tYXJpemUodmVyYm9zZSkKKyAgICB3aGVuIHlvdSdyZSBkb25lIGZpZGRsaW5nLgorICAgICIiIgorICAgIGdsb2JhbCBtYXN0ZXIKKworICAgICMgSWYgbm8gbW9kdWxlIHdhcyBnaXZlbiwgdGhlbiB1c2UgX19tYWluX18uCisgICAgaWYgbSBpcyBOb25lOgorICAgICAgICAjIERXQSAtIG0gd2lsbCBzdGlsbCBiZSBOb25lIGlmIHRoaXMgd2Fzbid0IGludm9rZWQgZnJvbSB0aGUgY29tbWFuZAorICAgICAgICAjIGxpbmUsIGluIHdoaWNoIGNhc2UgdGhlIGZvbGxvd2luZyBUeXBlRXJyb3IgaXMgYWJvdXQgYXMgZ29vZCBhbiBlcnJvcgorICAgICAgICAjIGFzIHdlIHNob3VsZCBleHBlY3QKKyAgICAgICAgbSA9IHN5cy5tb2R1bGVzLmdldCgnX19tYWluX18nKQorCisgICAgIyBDaGVjayB0aGF0IHdlIHdlcmUgYWN0dWFsbHkgZ2l2ZW4gYSBtb2R1bGUuCisgICAgaWYgbm90IGluc3BlY3QuaXNtb2R1bGUobSk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidGVzdG1vZDogbW9kdWxlIHJlcXVpcmVkOyAlciIgJSAobSwpKQorCisgICAgIyBJZiBubyBuYW1lIHdhcyBnaXZlbiwgdGhlbiB1c2UgdGhlIG1vZHVsZSdzIG5hbWUuCisgICAgaWYgbmFtZSBpcyBOb25lOgorICAgICAgICBuYW1lID0gbS5fX25hbWVfXworCisgICAgIyBGaW5kLCBwYXJzZSwgYW5kIHJ1biBhbGwgdGVzdHMgaW4gdGhlIGdpdmVuIG1vZHVsZS4KKyAgICBmaW5kZXIgPSBEb2NUZXN0RmluZGVyKGV4Y2x1ZGVfZW1wdHk9ZXhjbHVkZV9lbXB0eSkKKworICAgIGlmIHJhaXNlX29uX2Vycm9yOgorICAgICAgICBydW5uZXIgPSBEZWJ1Z1J1bm5lcih2ZXJib3NlPXZlcmJvc2UsIG9wdGlvbmZsYWdzPW9wdGlvbmZsYWdzKQorICAgIGVsc2U6CisgICAgICAgIHJ1bm5lciA9IERvY1Rlc3RSdW5uZXIodmVyYm9zZT12ZXJib3NlLCBvcHRpb25mbGFncz1vcHRpb25mbGFncykKKworICAgIGZvciB0ZXN0IGluIGZpbmRlci5maW5kKG0sIG5hbWUsIGdsb2JzPWdsb2JzLCBleHRyYWdsb2JzPWV4dHJhZ2xvYnMpOgorICAgICAgICBydW5uZXIucnVuKHRlc3QpCisKKyAgICBpZiByZXBvcnQ6CisgICAgICAgIHJ1bm5lci5zdW1tYXJpemUoKQorCisgICAgaWYgbWFzdGVyIGlzIE5vbmU6CisgICAgICAgIG1hc3RlciA9IHJ1bm5lcgorICAgIGVsc2U6CisgICAgICAgIG1hc3Rlci5tZXJnZShydW5uZXIpCisKKyAgICByZXR1cm4gVGVzdFJlc3VsdHMocnVubmVyLmZhaWx1cmVzLCBydW5uZXIudHJpZXMpCisKK2RlZiB0ZXN0ZmlsZShmaWxlbmFtZSwgbW9kdWxlX3JlbGF0aXZlPVRydWUsIG5hbWU9Tm9uZSwgcGFja2FnZT1Ob25lLAorICAgICAgICAgICAgIGdsb2JzPU5vbmUsIHZlcmJvc2U9Tm9uZSwgcmVwb3J0PVRydWUsIG9wdGlvbmZsYWdzPTAsCisgICAgICAgICAgICAgZXh0cmFnbG9icz1Ob25lLCByYWlzZV9vbl9lcnJvcj1GYWxzZSwgcGFyc2VyPURvY1Rlc3RQYXJzZXIoKSwKKyAgICAgICAgICAgICBlbmNvZGluZz1Ob25lKToKKyAgICAiIiIKKyAgICBUZXN0IGV4YW1wbGVzIGluIHRoZSBnaXZlbiBmaWxlLiAgUmV0dXJuICgjZmFpbHVyZXMsICN0ZXN0cykuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAibW9kdWxlX3JlbGF0aXZlIiBzcGVjaWZpZXMgaG93IGZpbGVuYW1lcworICAgIHNob3VsZCBiZSBpbnRlcnByZXRlZDoKKworICAgICAgLSBJZiAibW9kdWxlX3JlbGF0aXZlIiBpcyBUcnVlICh0aGUgZGVmYXVsdCksIHRoZW4gImZpbGVuYW1lIgorICAgICAgICAgc3BlY2lmaWVzIGEgbW9kdWxlLXJlbGF0aXZlIHBhdGguICBCeSBkZWZhdWx0LCB0aGlzIHBhdGggaXMKKyAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBjYWxsaW5nIG1vZHVsZSdzIGRpcmVjdG9yeTsgYnV0IGlmIHRoZQorICAgICAgICAgInBhY2thZ2UiIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgdGhlbiBpdCBpcyByZWxhdGl2ZSB0byB0aGF0CisgICAgICAgICBwYWNrYWdlLiAgVG8gZW5zdXJlIG9zLWluZGVwZW5kZW5jZSwgImZpbGVuYW1lIiBzaG91bGQgdXNlCisgICAgICAgICAiLyIgY2hhcmFjdGVycyB0byBzZXBhcmF0ZSBwYXRoIHNlZ21lbnRzLCBhbmQgc2hvdWxkIG5vdAorICAgICAgICAgYmUgYW4gYWJzb2x1dGUgcGF0aCAoaS5lLiwgaXQgbWF5IG5vdCBiZWdpbiB3aXRoICIvIikuCisKKyAgICAgIC0gSWYgIm1vZHVsZV9yZWxhdGl2ZSIgaXMgRmFsc2UsIHRoZW4gImZpbGVuYW1lIiBzcGVjaWZpZXMgYW4KKyAgICAgICAgb3Mtc3BlY2lmaWMgcGF0aC4gIFRoZSBwYXRoIG1heSBiZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSAodG8KKyAgICAgICAgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkpLgorCisgICAgT3B0aW9uYWwga2V5d29yZCBhcmcgIm5hbWUiIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0OyBieSBkZWZhdWx0CisgICAgdXNlIHRoZSBmaWxlJ3MgYmFzZW5hbWUuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50ICJwYWNrYWdlIiBpcyBhIFB5dGhvbiBwYWNrYWdlIG9yIHRoZQorICAgIG5hbWUgb2YgYSBQeXRob24gcGFja2FnZSB3aG9zZSBkaXJlY3Rvcnkgc2hvdWxkIGJlIHVzZWQgYXMgdGhlCisgICAgYmFzZSBkaXJlY3RvcnkgZm9yIGEgbW9kdWxlIHJlbGF0aXZlIGZpbGVuYW1lLiAgSWYgbm8gcGFja2FnZSBpcworICAgIHNwZWNpZmllZCwgdGhlbiB0aGUgY2FsbGluZyBtb2R1bGUncyBkaXJlY3RvcnkgaXMgdXNlZCBhcyB0aGUgYmFzZQorICAgIGRpcmVjdG9yeSBmb3IgbW9kdWxlIHJlbGF0aXZlIGZpbGVuYW1lcy4gIEl0IGlzIGFuIGVycm9yIHRvCisgICAgc3BlY2lmeSAicGFja2FnZSIgaWYgIm1vZHVsZV9yZWxhdGl2ZSIgaXMgRmFsc2UuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAiZ2xvYnMiIGdpdmVzIGEgZGljdCB0byBiZSB1c2VkIGFzIHRoZSBnbG9iYWxzCisgICAgd2hlbiBleGVjdXRpbmcgZXhhbXBsZXM7IGJ5IGRlZmF1bHQsIHVzZSB7fS4gIEEgY29weSBvZiB0aGlzIGRpY3QKKyAgICBpcyBhY3R1YWxseSB1c2VkIGZvciBlYWNoIGRvY3N0cmluZywgc28gdGhhdCBlYWNoIGRvY3N0cmluZydzCisgICAgZXhhbXBsZXMgc3RhcnQgd2l0aCBhIGNsZWFuIHNsYXRlLgorCisgICAgT3B0aW9uYWwga2V5d29yZCBhcmcgImV4dHJhZ2xvYnMiIGdpdmVzIGEgZGljdGlvbmFyeSB0aGF0IHNob3VsZCBiZQorICAgIG1lcmdlZCBpbnRvIHRoZSBnbG9iYWxzIHRoYXQgYXJlIHVzZWQgdG8gZXhlY3V0ZSBleGFtcGxlcy4gIEJ5CisgICAgZGVmYXVsdCwgbm8gZXh0cmEgZ2xvYmFscyBhcmUgdXNlZC4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnICJ2ZXJib3NlIiBwcmludHMgbG90cyBvZiBzdHVmZiBpZiB0cnVlLCBwcmludHMKKyAgICBvbmx5IGZhaWx1cmVzIGlmIGZhbHNlOyBieSBkZWZhdWx0LCBpdCdzIHRydWUgaWZmICItdiIgaXMgaW4gc3lzLmFyZ3YuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAicmVwb3J0IiBwcmludHMgYSBzdW1tYXJ5IGF0IHRoZSBlbmQgd2hlbiB0cnVlLAorICAgIGVsc2UgcHJpbnRzIG5vdGhpbmcgYXQgdGhlIGVuZC4gIEluIHZlcmJvc2UgbW9kZSwgdGhlIHN1bW1hcnkgaXMKKyAgICBkZXRhaWxlZCwgZWxzZSB2ZXJ5IGJyaWVmIChpbiBmYWN0LCBlbXB0eSBpZiBhbGwgdGVzdHMgcGFzc2VkKS4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnICJvcHRpb25mbGFncyIgb3IncyB0b2dldGhlciBtb2R1bGUgY29uc3RhbnRzLAorICAgIGFuZCBkZWZhdWx0cyB0byAwLiAgUG9zc2libGUgdmFsdWVzIChzZWUgdGhlIGRvY3MgZm9yIGRldGFpbHMpOgorCisgICAgICAgIERPTlRfQUNDRVBUX1RSVUVfRk9SXzEKKyAgICAgICAgRE9OVF9BQ0NFUFRfQkxBTktMSU5FCisgICAgICAgIE5PUk1BTElaRV9XSElURVNQQUNFCisgICAgICAgIEVMTElQU0lTCisgICAgICAgIFNLSVAKKyAgICAgICAgSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKKyAgICAgICAgUkVQT1JUX1VESUZGCisgICAgICAgIFJFUE9SVF9DRElGRgorICAgICAgICBSRVBPUlRfTkRJRkYKKyAgICAgICAgUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRQorCisgICAgT3B0aW9uYWwga2V5d29yZCBhcmcgInJhaXNlX29uX2Vycm9yIiByYWlzZXMgYW4gZXhjZXB0aW9uIG9uIHRoZQorICAgIGZpcnN0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9yIGZhaWx1cmUuIFRoaXMgYWxsb3dzIGZhaWx1cmVzIHRvIGJlCisgICAgcG9zdC1tb3J0ZW0gZGVidWdnZWQuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAicGFyc2VyIiBzcGVjaWZpZXMgYSBEb2NUZXN0UGFyc2VyIChvcgorICAgIHN1YmNsYXNzKSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGV4dHJhY3QgdGVzdHMgZnJvbSB0aGUgZmlsZXMuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAiZW5jb2RpbmciIHNwZWNpZmllcyBhbiBlbmNvZGluZyB0aGF0IHNob3VsZAorICAgIGJlIHVzZWQgdG8gY29udmVydCB0aGUgZmlsZSB0byB1bmljb2RlLgorCisgICAgQWR2YW5jZWQgdG9tZm9vbGVyeTogIHRlc3Rtb2QgcnVucyBtZXRob2RzIG9mIGEgbG9jYWwgaW5zdGFuY2Ugb2YKKyAgICBjbGFzcyBkb2N0ZXN0LlRlc3RlciwgdGhlbiBtZXJnZXMgdGhlIHJlc3VsdHMgaW50byAob3IgY3JlYXRlcykKKyAgICBnbG9iYWwgVGVzdGVyIGluc3RhbmNlIGRvY3Rlc3QubWFzdGVyLiAgTWV0aG9kcyBvZiBkb2N0ZXN0Lm1hc3RlcgorICAgIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgdG9vLCBpZiB5b3Ugd2FudCB0byBkbyBzb21ldGhpbmcgdW51c3VhbC4KKyAgICBQYXNzaW5nIHJlcG9ydD0wIHRvIHRlc3Rtb2QgaXMgZXNwZWNpYWxseSB1c2VmdWwgdGhlbiwgdG8gZGVsYXkKKyAgICBkaXNwbGF5aW5nIGEgc3VtbWFyeS4gIEludm9rZSBkb2N0ZXN0Lm1hc3Rlci5zdW1tYXJpemUodmVyYm9zZSkKKyAgICB3aGVuIHlvdSdyZSBkb25lIGZpZGRsaW5nLgorICAgICIiIgorICAgIGdsb2JhbCBtYXN0ZXIKKworICAgIGlmIHBhY2thZ2UgYW5kIG5vdCBtb2R1bGVfcmVsYXRpdmU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlBhY2thZ2UgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBtb2R1bGUtIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxhdGl2ZSBwYXRocy4iKQorCisgICAgIyBSZWxhdGl2aXplIHRoZSBwYXRoCisgICAgdGV4dCwgZmlsZW5hbWUgPSBfbG9hZF90ZXN0ZmlsZShmaWxlbmFtZSwgcGFja2FnZSwgbW9kdWxlX3JlbGF0aXZlKQorCisgICAgIyBJZiBubyBuYW1lIHdhcyBnaXZlbiwgdGhlbiB1c2UgdGhlIGZpbGUncyBuYW1lLgorICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCisKKyAgICAjIEFzc2VtYmxlIHRoZSBnbG9iYWxzLgorICAgIGlmIGdsb2JzIGlzIE5vbmU6CisgICAgICAgIGdsb2JzID0ge30KKyAgICBlbHNlOgorICAgICAgICBnbG9icyA9IGdsb2JzLmNvcHkoKQorICAgIGlmIGV4dHJhZ2xvYnMgaXMgbm90IE5vbmU6CisgICAgICAgIGdsb2JzLnVwZGF0ZShleHRyYWdsb2JzKQorICAgIGlmICdfX25hbWVfXycgbm90IGluIGdsb2JzOgorICAgICAgICBnbG9ic1snX19uYW1lX18nXSA9ICdfX21haW5fXycKKworICAgIGlmIHJhaXNlX29uX2Vycm9yOgorICAgICAgICBydW5uZXIgPSBEZWJ1Z1J1bm5lcih2ZXJib3NlPXZlcmJvc2UsIG9wdGlvbmZsYWdzPW9wdGlvbmZsYWdzKQorICAgIGVsc2U6CisgICAgICAgIHJ1bm5lciA9IERvY1Rlc3RSdW5uZXIodmVyYm9zZT12ZXJib3NlLCBvcHRpb25mbGFncz1vcHRpb25mbGFncykKKworICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICB0ZXh0ID0gdGV4dC5kZWNvZGUoZW5jb2RpbmcpCisKKyAgICAjIFJlYWQgdGhlIGZpbGUsIGNvbnZlcnQgaXQgdG8gYSB0ZXN0LCBhbmQgcnVuIGl0LgorICAgIHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QodGV4dCwgZ2xvYnMsIG5hbWUsIGZpbGVuYW1lLCAwKQorICAgIHJ1bm5lci5ydW4odGVzdCkKKworICAgIGlmIHJlcG9ydDoKKyAgICAgICAgcnVubmVyLnN1bW1hcml6ZSgpCisKKyAgICBpZiBtYXN0ZXIgaXMgTm9uZToKKyAgICAgICAgbWFzdGVyID0gcnVubmVyCisgICAgZWxzZToKKyAgICAgICAgbWFzdGVyLm1lcmdlKHJ1bm5lcikKKworICAgIHJldHVybiBUZXN0UmVzdWx0cyhydW5uZXIuZmFpbHVyZXMsIHJ1bm5lci50cmllcykKKworZGVmIHJ1bl9kb2NzdHJpbmdfZXhhbXBsZXMoZiwgZ2xvYnMsIHZlcmJvc2U9RmFsc2UsIG5hbWU9Ik5vTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZmxhZ3M9Tm9uZSwgb3B0aW9uZmxhZ3M9MCk6CisgICAgIiIiCisgICAgVGVzdCBleGFtcGxlcyBpbiB0aGUgZ2l2ZW4gb2JqZWN0J3MgZG9jc3RyaW5nIChgZmApLCB1c2luZyBgZ2xvYnNgCisgICAgYXMgZ2xvYmFscy4gIE9wdGlvbmFsIGFyZ3VtZW50IGBuYW1lYCBpcyB1c2VkIGluIGZhaWx1cmUgbWVzc2FnZXMuCisgICAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGB2ZXJib3NlYCBpcyB0cnVlLCB0aGVuIGdlbmVyYXRlIG91dHB1dAorICAgIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIGZhaWx1cmVzLgorCisgICAgYGNvbXBpbGVmbGFnc2AgZ2l2ZXMgdGhlIHNldCBvZiBmbGFncyB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZQorICAgIFB5dGhvbiBjb21waWxlciB3aGVuIHJ1bm5pbmcgdGhlIGV4YW1wbGVzLiAgSWYgbm90IHNwZWNpZmllZCwgdGhlbgorICAgIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgc2V0IG9mIGZ1dHVyZS1pbXBvcnQgZmxhZ3MgdGhhdCBhcHBseSB0bworICAgIGBnbG9ic2AuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyBgb3B0aW9uZmxhZ3NgIHNwZWNpZmllcyBvcHRpb25zIGZvciB0aGUKKyAgICB0ZXN0aW5nIGFuZCBvdXRwdXQuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGB0ZXN0bW9kYCBmb3IgbW9yZQorICAgIGluZm9ybWF0aW9uLgorICAgICIiIgorICAgICMgRmluZCwgcGFyc2UsIGFuZCBydW4gYWxsIHRlc3RzIGluIHRoZSBnaXZlbiBtb2R1bGUuCisgICAgZmluZGVyID0gRG9jVGVzdEZpbmRlcih2ZXJib3NlPXZlcmJvc2UsIHJlY3Vyc2U9RmFsc2UpCisgICAgcnVubmVyID0gRG9jVGVzdFJ1bm5lcih2ZXJib3NlPXZlcmJvc2UsIG9wdGlvbmZsYWdzPW9wdGlvbmZsYWdzKQorICAgIGZvciB0ZXN0IGluIGZpbmRlci5maW5kKGYsIG5hbWUsIGdsb2JzPWdsb2JzKToKKyAgICAgICAgcnVubmVyLnJ1bih0ZXN0LCBjb21waWxlZmxhZ3M9Y29tcGlsZWZsYWdzKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyA3LiBUZXN0ZXIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBpcyBwcm92aWRlZCBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEl0J3Mgbm90CisjIGFjdHVhbGx5IHVzZWQgaW4gYW55IHdheS4KKworY2xhc3MgVGVzdGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2Q9Tm9uZSwgZ2xvYnM9Tm9uZSwgdmVyYm9zZT1Ob25lLCBvcHRpb25mbGFncz0wKToKKworICAgICAgICB3YXJuaW5ncy53YXJuKCJjbGFzcyBUZXN0ZXIgaXMgZGVwcmVjYXRlZDsgIgorICAgICAgICAgICAgICAgICAgICAgICJ1c2UgY2xhc3MgZG9jdGVzdC5Eb2NUZXN0UnVubmVyIGluc3RlYWQiLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICBpZiBtb2QgaXMgTm9uZSBhbmQgZ2xvYnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVGVzdGVyLl9faW5pdF9fOiBtdXN0IHNwZWNpZnkgbW9kIG9yIGdsb2JzIikKKyAgICAgICAgaWYgbW9kIGlzIG5vdCBOb25lIGFuZCBub3QgaW5zcGVjdC5pc21vZHVsZShtb2QpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJUZXN0ZXIuX19pbml0X186IG1vZCBtdXN0IGJlIGEgbW9kdWxlOyAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb2QsKSkKKyAgICAgICAgaWYgZ2xvYnMgaXMgTm9uZToKKyAgICAgICAgICAgIGdsb2JzID0gbW9kLl9fZGljdF9fCisgICAgICAgIHNlbGYuZ2xvYnMgPSBnbG9icworCisgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgc2VsZi5vcHRpb25mbGFncyA9IG9wdGlvbmZsYWdzCisgICAgICAgIHNlbGYudGVzdGZpbmRlciA9IERvY1Rlc3RGaW5kZXIoKQorICAgICAgICBzZWxmLnRlc3RydW5uZXIgPSBEb2NUZXN0UnVubmVyKHZlcmJvc2U9dmVyYm9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25mbGFncz1vcHRpb25mbGFncykKKworICAgIGRlZiBydW5zdHJpbmcoc2VsZiwgcywgbmFtZSk6CisgICAgICAgIHRlc3QgPSBEb2NUZXN0UGFyc2VyKCkuZ2V0X2RvY3Rlc3Qocywgc2VsZi5nbG9icywgbmFtZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgc3RyaW5nIiwgbmFtZQorICAgICAgICAoZix0KSA9IHNlbGYudGVzdHJ1bm5lci5ydW4odGVzdCkKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgZiwgIm9mIiwgdCwgImV4YW1wbGVzIGZhaWxlZCBpbiBzdHJpbmciLCBuYW1lCisgICAgICAgIHJldHVybiBUZXN0UmVzdWx0cyhmLHQpCisKKyAgICBkZWYgcnVuZG9jKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2R1bGU9Tm9uZSk6CisgICAgICAgIGYgPSB0ID0gMAorICAgICAgICB0ZXN0cyA9IHNlbGYudGVzdGZpbmRlci5maW5kKG9iamVjdCwgbmFtZSwgbW9kdWxlPW1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9icz1zZWxmLmdsb2JzKQorICAgICAgICBmb3IgdGVzdCBpbiB0ZXN0czoKKyAgICAgICAgICAgIChmMiwgdDIpID0gc2VsZi50ZXN0cnVubmVyLnJ1bih0ZXN0KQorICAgICAgICAgICAgKGYsdCkgPSAoZitmMiwgdCt0MikKKyAgICAgICAgcmV0dXJuIFRlc3RSZXN1bHRzKGYsdCkKKworICAgIGRlZiBydW5kaWN0KHNlbGYsIGQsIG5hbWUsIG1vZHVsZT1Ob25lKToKKyAgICAgICAgaW1wb3J0IHR5cGVzCisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKG5hbWUpCisgICAgICAgIG0uX19kaWN0X18udXBkYXRlKGQpCisgICAgICAgIGlmIG1vZHVsZSBpcyBOb25lOgorICAgICAgICAgICAgbW9kdWxlID0gRmFsc2UKKyAgICAgICAgcmV0dXJuIHNlbGYucnVuZG9jKG0sIG5hbWUsIG1vZHVsZSkKKworICAgIGRlZiBydW5fX3Rlc3RfXyhzZWxmLCBkLCBuYW1lKToKKyAgICAgICAgaW1wb3J0IHR5cGVzCisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKG5hbWUpCisgICAgICAgIG0uX190ZXN0X18gPSBkCisgICAgICAgIHJldHVybiBzZWxmLnJ1bmRvYyhtLCBuYW1lKQorCisgICAgZGVmIHN1bW1hcml6ZShzZWxmLCB2ZXJib3NlPU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXN0cnVubmVyLnN1bW1hcml6ZSh2ZXJib3NlKQorCisgICAgZGVmIG1lcmdlKHNlbGYsIG90aGVyKToKKyAgICAgICAgc2VsZi50ZXN0cnVubmVyLm1lcmdlKG90aGVyLnRlc3RydW5uZXIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIDguIFVuaXR0ZXN0IFN1cHBvcnQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworX3VuaXR0ZXN0X3JlcG9ydGZsYWdzID0gMAorCitkZWYgc2V0X3VuaXR0ZXN0X3JlcG9ydGZsYWdzKGZsYWdzKToKKyAgICAiIiJTZXRzIHRoZSB1bml0dGVzdCBvcHRpb24gZmxhZ3MuCisKKyAgICBUaGUgb2xkIGZsYWcgaXMgcmV0dXJuZWQgc28gdGhhdCBhIHJ1bm5lciBjb3VsZCByZXN0b3JlIHRoZSBvbGQKKyAgICB2YWx1ZSBpZiBpdCB3aXNoZWQgdG86CisKKyAgICAgID4+PiBpbXBvcnQgZG9jdGVzdAorICAgICAgPj4+IG9sZCA9IGRvY3Rlc3QuX3VuaXR0ZXN0X3JlcG9ydGZsYWdzCisgICAgICA+Pj4gZG9jdGVzdC5zZXRfdW5pdHRlc3RfcmVwb3J0ZmxhZ3MoUkVQT1JUX05ESUZGIHwKKyAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRSkgPT0gb2xkCisgICAgICBUcnVlCisKKyAgICAgID4+PiBkb2N0ZXN0Ll91bml0dGVzdF9yZXBvcnRmbGFncyA9PSAoUkVQT1JUX05ESUZGIHwKKyAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRSkKKyAgICAgIFRydWUKKworICAgIE9ubHkgcmVwb3J0aW5nIGZsYWdzIGNhbiBiZSBzZXQ6CisKKyAgICAgID4+PiBkb2N0ZXN0LnNldF91bml0dGVzdF9yZXBvcnRmbGFncyhFTExJUFNJUykKKyAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgICAgVmFsdWVFcnJvcjogKCdPbmx5IHJlcG9ydGluZyBmbGFncyBhbGxvd2VkJywgOCkKKworICAgICAgPj4+IGRvY3Rlc3Quc2V0X3VuaXR0ZXN0X3JlcG9ydGZsYWdzKG9sZCkgPT0gKFJFUE9SVF9ORElGRiB8CisgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUpCisgICAgICBUcnVlCisgICAgIiIiCisgICAgZ2xvYmFsIF91bml0dGVzdF9yZXBvcnRmbGFncworCisgICAgaWYgKGZsYWdzICYgUkVQT1JUSU5HX0ZMQUdTKSAhPSBmbGFnczoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiT25seSByZXBvcnRpbmcgZmxhZ3MgYWxsb3dlZCIsIGZsYWdzKQorICAgIG9sZCA9IF91bml0dGVzdF9yZXBvcnRmbGFncworICAgIF91bml0dGVzdF9yZXBvcnRmbGFncyA9IGZsYWdzCisgICAgcmV0dXJuIG9sZAorCisKK2NsYXNzIERvY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0LCBvcHRpb25mbGFncz0wLCBzZXRVcD1Ob25lLCB0ZWFyRG93bj1Ob25lLAorICAgICAgICAgICAgICAgICBjaGVja2VyPU5vbmUpOgorCisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX2R0X29wdGlvbmZsYWdzID0gb3B0aW9uZmxhZ3MKKyAgICAgICAgc2VsZi5fZHRfY2hlY2tlciA9IGNoZWNrZXIKKyAgICAgICAgc2VsZi5fZHRfdGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5fZHRfc2V0VXAgPSBzZXRVcAorICAgICAgICBzZWxmLl9kdF90ZWFyRG93biA9IHRlYXJEb3duCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHRlc3QgPSBzZWxmLl9kdF90ZXN0CisKKyAgICAgICAgaWYgc2VsZi5fZHRfc2V0VXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9kdF9zZXRVcCh0ZXN0KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0ZXN0ID0gc2VsZi5fZHRfdGVzdAorCisgICAgICAgIGlmIHNlbGYuX2R0X3RlYXJEb3duIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fZHRfdGVhckRvd24odGVzdCkKKworICAgICAgICB0ZXN0Lmdsb2JzLmNsZWFyKCkKKworICAgIGRlZiBydW5UZXN0KHNlbGYpOgorICAgICAgICB0ZXN0ID0gc2VsZi5fZHRfdGVzdAorICAgICAgICBvbGQgPSBzeXMuc3Rkb3V0CisgICAgICAgIG5ldyA9IFN0cmluZ0lPKCkKKyAgICAgICAgb3B0aW9uZmxhZ3MgPSBzZWxmLl9kdF9vcHRpb25mbGFncworCisgICAgICAgIGlmIG5vdCAob3B0aW9uZmxhZ3MgJiBSRVBPUlRJTkdfRkxBR1MpOgorICAgICAgICAgICAgIyBUaGUgb3B0aW9uIGZsYWdzIGRvbid0IGluY2x1ZGUgYW55IHJlcG9ydGluZyBmbGFncywKKyAgICAgICAgICAgICMgc28gYWRkIHRoZSBkZWZhdWx0IHJlcG9ydGluZyBmbGFncworICAgICAgICAgICAgb3B0aW9uZmxhZ3MgfD0gX3VuaXR0ZXN0X3JlcG9ydGZsYWdzCisKKyAgICAgICAgcnVubmVyID0gRG9jVGVzdFJ1bm5lcihvcHRpb25mbGFncz1vcHRpb25mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyPXNlbGYuX2R0X2NoZWNrZXIsIHZlcmJvc2U9RmFsc2UpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnVubmVyLkRJVklERVIgPSAiLSIqNzAKKyAgICAgICAgICAgIGZhaWx1cmVzLCB0cmllcyA9IHJ1bm5lci5ydW4oCisgICAgICAgICAgICAgICAgdGVzdCwgb3V0PW5ldy53cml0ZSwgY2xlYXJfZ2xvYnM9RmFsc2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gb2xkCisKKyAgICAgICAgaWYgZmFpbHVyZXM6CisgICAgICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24oc2VsZi5mb3JtYXRfZmFpbHVyZShuZXcuZ2V0dmFsdWUoKSkpCisKKyAgICBkZWYgZm9ybWF0X2ZhaWx1cmUoc2VsZiwgZXJyKToKKyAgICAgICAgdGVzdCA9IHNlbGYuX2R0X3Rlc3QKKyAgICAgICAgaWYgdGVzdC5saW5lbm8gaXMgTm9uZToKKyAgICAgICAgICAgIGxpbmVubyA9ICd1bmtub3duIGxpbmUgbnVtYmVyJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGluZW5vID0gJyVzJyAlIHRlc3QubGluZW5vCisgICAgICAgIGxuYW1lID0gJy4nLmpvaW4odGVzdC5uYW1lLnNwbGl0KCcuJylbLTE6XSkKKyAgICAgICAgcmV0dXJuICgnRmFpbGVkIGRvY3Rlc3QgdGVzdCBmb3IgJXNcbicKKyAgICAgICAgICAgICAgICAnICBGaWxlICIlcyIsIGxpbmUgJXMsIGluICVzXG5cbiVzJworICAgICAgICAgICAgICAgICUgKHRlc3QubmFtZSwgdGVzdC5maWxlbmFtZSwgbGluZW5vLCBsbmFtZSwgZXJyKQorICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBkZWJ1ZyhzZWxmKToKKyAgICAgICAgciIiIlJ1biB0aGUgdGVzdCBjYXNlIHdpdGhvdXQgcmVzdWx0cyBhbmQgd2l0aG91dCBjYXRjaGluZyBleGNlcHRpb25zCisKKyAgICAgICAgICAgVGhlIHVuaXQgdGVzdCBmcmFtZXdvcmsgaW5jbHVkZXMgYSBkZWJ1ZyBtZXRob2Qgb24gdGVzdCBjYXNlcworICAgICAgICAgICBhbmQgdGVzdCBzdWl0ZXMgdG8gc3VwcG9ydCBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmcuICBUaGUgdGVzdCBjb2RlCisgICAgICAgICAgIGlzIHJ1biBpbiBzdWNoIGEgd2F5IHRoYXQgZXJyb3JzIGFyZSBub3QgY2F1Z2h0LiAgVGhpcyB3YXkgYQorICAgICAgICAgICBjYWxsZXIgY2FuIGNhdGNoIHRoZSBlcnJvcnMgYW5kIGluaXRpYXRlIHBvc3QtbW9ydGVtIGRlYnVnZ2luZy4KKworICAgICAgICAgICBUaGUgRG9jVGVzdENhc2UgcHJvdmlkZXMgYSBkZWJ1ZyBtZXRob2QgdGhhdCByYWlzZXMKKyAgICAgICAgICAgVW5leHBlY3RlZEV4Y2VwdGlvbiBlcnJvcnMgaWYgdGhlcmUgaXMgYW4gdW5leHBlY3RlZAorICAgICAgICAgICBleGNlcHRpb246CisKKyAgICAgICAgICAgICA+Pj4gdGVzdCA9IERvY1Rlc3RQYXJzZXIoKS5nZXRfZG9jdGVzdCgnPj4+IHJhaXNlIEtleUVycm9yXG40MicsCisgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgIHt9LCAnZm9vJywgJ2Zvby5weScsIDApCisgICAgICAgICAgICAgPj4+IGNhc2UgPSBEb2NUZXN0Q2FzZSh0ZXN0KQorICAgICAgICAgICAgID4+PiB0cnk6CisgICAgICAgICAgICAgLi4uICAgICBjYXNlLmRlYnVnKCkKKyAgICAgICAgICAgICAuLi4gZXhjZXB0IFVuZXhwZWN0ZWRFeGNlcHRpb24sIGZhaWx1cmU6CisgICAgICAgICAgICAgLi4uICAgICBwYXNzCisKKyAgICAgICAgICAgVGhlIFVuZXhwZWN0ZWRFeGNlcHRpb24gY29udGFpbnMgdGhlIHRlc3QsIHRoZSBleGFtcGxlLCBhbmQKKyAgICAgICAgICAgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbjoKKworICAgICAgICAgICAgID4+PiBmYWlsdXJlLnRlc3QgaXMgdGVzdAorICAgICAgICAgICAgIFRydWUKKworICAgICAgICAgICAgID4+PiBmYWlsdXJlLmV4YW1wbGUud2FudAorICAgICAgICAgICAgICc0MlxuJworCisgICAgICAgICAgICAgPj4+IGV4Y19pbmZvID0gZmFpbHVyZS5leGNfaW5mbworICAgICAgICAgICAgID4+PiByYWlzZSBleGNfaW5mb1swXSwgZXhjX2luZm9bMV0sIGV4Y19pbmZvWzJdCisgICAgICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgIEtleUVycm9yCisKKyAgICAgICAgICAgSWYgdGhlIG91dHB1dCBkb2Vzbid0IG1hdGNoLCB0aGVuIGEgRG9jVGVzdEZhaWx1cmUgaXMgcmFpc2VkOgorCisgICAgICAgICAgICAgPj4+IHRlc3QgPSBEb2NUZXN0UGFyc2VyKCkuZ2V0X2RvY3Rlc3QoJycnCisgICAgICAgICAgICAgLi4uICAgICAgPj4+IHggPSAxCisgICAgICAgICAgICAgLi4uICAgICAgPj4+IHgKKyAgICAgICAgICAgICAuLi4gICAgICAyCisgICAgICAgICAgICAgLi4uICAgICAgJycnLCB7fSwgJ2ZvbycsICdmb28ucHknLCAwKQorICAgICAgICAgICAgID4+PiBjYXNlID0gRG9jVGVzdENhc2UodGVzdCkKKworICAgICAgICAgICAgID4+PiB0cnk6CisgICAgICAgICAgICAgLi4uICAgIGNhc2UuZGVidWcoKQorICAgICAgICAgICAgIC4uLiBleGNlcHQgRG9jVGVzdEZhaWx1cmUsIGZhaWx1cmU6CisgICAgICAgICAgICAgLi4uICAgIHBhc3MKKworICAgICAgICAgICBEb2NUZXN0RmFpbHVyZSBvYmplY3RzIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSB0ZXN0OgorCisgICAgICAgICAgICAgPj4+IGZhaWx1cmUudGVzdCBpcyB0ZXN0CisgICAgICAgICAgICAgVHJ1ZQorCisgICAgICAgICAgIEFzIHdlbGwgYXMgdG8gdGhlIGV4YW1wbGU6CisKKyAgICAgICAgICAgICA+Pj4gZmFpbHVyZS5leGFtcGxlLndhbnQKKyAgICAgICAgICAgICAnMlxuJworCisgICAgICAgICAgIGFuZCB0aGUgYWN0dWFsIG91dHB1dDoKKworICAgICAgICAgICAgID4+PiBmYWlsdXJlLmdvdAorICAgICAgICAgICAgICcxXG4nCisKKyAgICAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5zZXRVcCgpCisgICAgICAgIHJ1bm5lciA9IERlYnVnUnVubmVyKG9wdGlvbmZsYWdzPXNlbGYuX2R0X29wdGlvbmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyPXNlbGYuX2R0X2NoZWNrZXIsIHZlcmJvc2U9RmFsc2UpCisgICAgICAgIHJ1bm5lci5ydW4oc2VsZi5fZHRfdGVzdCwgY2xlYXJfZ2xvYnM9RmFsc2UpCisgICAgICAgIHNlbGYudGVhckRvd24oKQorCisgICAgZGVmIGlkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZHRfdGVzdC5uYW1lCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgdHlwZShzZWxmKSBpcyBub3QgdHlwZShvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgICAgICByZXR1cm4gc2VsZi5fZHRfdGVzdCA9PSBvdGhlci5fZHRfdGVzdCBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5fZHRfb3B0aW9uZmxhZ3MgPT0gb3RoZXIuX2R0X29wdGlvbmZsYWdzIGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLl9kdF9zZXRVcCA9PSBvdGhlci5fZHRfc2V0VXAgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuX2R0X3RlYXJEb3duID09IG90aGVyLl9kdF90ZWFyRG93biBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5fZHRfY2hlY2tlciA9PSBvdGhlci5fZHRfY2hlY2tlcgorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaCgoc2VsZi5fZHRfb3B0aW9uZmxhZ3MsIHNlbGYuX2R0X3NldFVwLCBzZWxmLl9kdF90ZWFyRG93biwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R0X2NoZWNrZXIpKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBuYW1lID0gc2VsZi5fZHRfdGVzdC5uYW1lLnNwbGl0KCcuJykKKyAgICAgICAgcmV0dXJuICIlcyAoJXMpIiAlIChuYW1lWy0xXSwgJy4nLmpvaW4obmFtZVs6LTFdKSkKKworICAgIF9fc3RyX18gPSBfX3JlcHJfXworCisgICAgZGVmIHNob3J0RGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIHJldHVybiAiRG9jdGVzdDogIiArIHNlbGYuX2R0X3Rlc3QubmFtZQorCitjbGFzcyBTa2lwRG9jVGVzdENhc2UoRG9jVGVzdENhc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgorICAgICAgICBzZWxmLm1vZHVsZSA9IG1vZHVsZQorICAgICAgICBEb2NUZXN0Q2FzZS5fX2luaXRfXyhzZWxmLCBOb25lKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNraXBUZXN0KCJEb2NUZXN0U3VpdGUgd2lsbCBub3Qgd29yayB3aXRoIC1PMiBhbmQgYWJvdmUiKQorCisgICAgZGVmIHRlc3Rfc2tpcChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHNob3J0RGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIHJldHVybiAiU2tpcHBpbmcgdGVzdHMgZnJvbSAlcyIgJSBzZWxmLm1vZHVsZS5fX25hbWVfXworCisgICAgX19zdHJfXyA9IHNob3J0RGVzY3JpcHRpb24KKworCitkZWYgRG9jVGVzdFN1aXRlKG1vZHVsZT1Ob25lLCBnbG9icz1Ob25lLCBleHRyYWdsb2JzPU5vbmUsIHRlc3RfZmluZGVyPU5vbmUsCisgICAgICAgICAgICAgICAgICoqb3B0aW9ucyk6CisgICAgIiIiCisgICAgQ29udmVydCBkb2N0ZXN0IHRlc3RzIGZvciBhIG1vZHVsZSB0byBhIHVuaXR0ZXN0IHRlc3Qgc3VpdGUuCisKKyAgICBUaGlzIGNvbnZlcnRzIGVhY2ggZG9jdW1lbnRhdGlvbiBzdHJpbmcgaW4gYSBtb2R1bGUgdGhhdAorICAgIGNvbnRhaW5zIGRvY3Rlc3QgdGVzdHMgdG8gYSB1bml0dGVzdCB0ZXN0IGNhc2UuICBJZiBhbnkgb2YgdGhlCisgICAgdGVzdHMgaW4gYSBkb2Mgc3RyaW5nIGZhaWwsIHRoZW4gdGhlIHRlc3QgY2FzZSBmYWlscy4gIEFuIGV4Y2VwdGlvbgorICAgIGlzIHJhaXNlZCBzaG93aW5nIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHRlc3QgYW5kIGEKKyAgICAoc29tZXRpbWVzIGFwcHJveGltYXRlKSBsaW5lIG51bWJlci4KKworICAgIFRoZSBgbW9kdWxlYCBhcmd1bWVudCBwcm92aWRlcyB0aGUgbW9kdWxlIHRvIGJlIHRlc3RlZC4gIFRoZSBhcmd1bWVudAorICAgIGNhbiBiZSBlaXRoZXIgYSBtb2R1bGUgb3IgYSBtb2R1bGUgbmFtZS4KKworICAgIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgY2FsbGluZyBtb2R1bGUgaXMgdXNlZC4KKworICAgIEEgbnVtYmVyIG9mIG9wdGlvbnMgbWF5IGJlIHByb3ZpZGVkIGFzIGtleXdvcmQgYXJndW1lbnRzOgorCisgICAgc2V0VXAKKyAgICAgIEEgc2V0LXVwIGZ1bmN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlCisgICAgICB0ZXN0cyBpbiBlYWNoIGZpbGUuIFRoZSBzZXRVcCBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZCBhIERvY1Rlc3QKKyAgICAgIG9iamVjdC4gIFRoZSBzZXRVcCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSB0ZXN0IGdsb2JhbHMgYXMgdGhlCisgICAgICBnbG9icyBhdHRyaWJ1dGUgb2YgdGhlIHRlc3QgcGFzc2VkLgorCisgICAgdGVhckRvd24KKyAgICAgIEEgdGVhci1kb3duIGZ1bmN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgcnVubmluZyB0aGUKKyAgICAgIHRlc3RzIGluIGVhY2ggZmlsZS4gIFRoZSB0ZWFyRG93biBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZCBhIERvY1Rlc3QKKyAgICAgIG9iamVjdC4gIFRoZSB0ZWFyRG93biBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSB0ZXN0IGdsb2JhbHMgYXMgdGhlCisgICAgICBnbG9icyBhdHRyaWJ1dGUgb2YgdGhlIHRlc3QgcGFzc2VkLgorCisgICAgZ2xvYnMKKyAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGluaXRpYWwgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgdGhlIHRlc3RzLgorCisgICAgb3B0aW9uZmxhZ3MKKyAgICAgICBBIHNldCBvZiBkb2N0ZXN0IG9wdGlvbiBmbGFncyBleHByZXNzZWQgYXMgYW4gaW50ZWdlci4KKyAgICAiIiIKKworICAgIGlmIHRlc3RfZmluZGVyIGlzIE5vbmU6CisgICAgICAgIHRlc3RfZmluZGVyID0gRG9jVGVzdEZpbmRlcigpCisKKyAgICBtb2R1bGUgPSBfbm9ybWFsaXplX21vZHVsZShtb2R1bGUpCisgICAgdGVzdHMgPSB0ZXN0X2ZpbmRlci5maW5kKG1vZHVsZSwgZ2xvYnM9Z2xvYnMsIGV4dHJhZ2xvYnM9ZXh0cmFnbG9icykKKworICAgIGlmIG5vdCB0ZXN0cyBhbmQgc3lzLmZsYWdzLm9wdGltaXplID49MjoKKyAgICAgICAgIyBTa2lwIGRvY3Rlc3RzIHdoZW4gcnVubmluZyB3aXRoIC1PMgorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgICAgIHN1aXRlLmFkZFRlc3QoU2tpcERvY1Rlc3RDYXNlKG1vZHVsZSkpCisgICAgICAgIHJldHVybiBzdWl0ZQorICAgIGVsaWYgbm90IHRlc3RzOgorICAgICAgICAjIFdoeSBkbyB3ZSB3YW50IHRvIGRvIHRoaXM/IEJlY2F1c2UgaXQgcmV2ZWFscyBhIGJ1ZyB0aGF0IG1pZ2h0CisgICAgICAgICMgb3RoZXJ3aXNlIGJlIGhpZGRlbi4KKyAgICAgICAgIyBJdCBpcyBwcm9iYWJseSBhIGJ1ZyB0aGF0IHRoaXMgZXhjZXB0aW9uIGlzIG5vdCBhbHNvIHJhaXNlZCBpZiB0aGUKKyAgICAgICAgIyBudW1iZXIgb2YgZG9jdGVzdCBleGFtcGxlcyBpbiB0ZXN0cyBpcyB6ZXJvIChpLmUuIGlmIG5vIGRvY3Rlc3QKKyAgICAgICAgIyBleGFtcGxlcyB3ZXJlIGZvdW5kKS4gIEhvd2V2ZXIsIHdlIHNob3VsZCBwcm9iYWJseSBub3QgYmUgcmFpc2luZworICAgICAgICAjIGFuIGV4Y2VwdGlvbiBhdCBhbGwgaGVyZSwgdGhvdWdoIGl0IGlzIHRvbyBsYXRlIHRvIG1ha2UgdGhpcyBjaGFuZ2UKKyAgICAgICAgIyBmb3IgYSBtYWludGVuYW5jZSByZWxlYXNlLiAgU2VlIGFsc28gaXNzdWUgIzE0NjQ5LgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG1vZHVsZSwgImhhcyBubyBkb2NzdHJpbmdzIikKKworICAgIHRlc3RzLnNvcnQoKQorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgICBpZiBsZW4odGVzdC5leGFtcGxlcykgPT0gMDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIG5vdCB0ZXN0LmZpbGVuYW1lOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBtb2R1bGUuX19maWxlX18KKyAgICAgICAgICAgIGlmIGZpbGVuYW1lWy00Ol0gaW4gKCIucHljIiwgIi5weW8iKToKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotMV0KKyAgICAgICAgICAgIHRlc3QuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzdWl0ZS5hZGRUZXN0KERvY1Rlc3RDYXNlKHRlc3QsICoqb3B0aW9ucykpCisKKyAgICByZXR1cm4gc3VpdGUKKworY2xhc3MgRG9jRmlsZUNhc2UoRG9jVGVzdENhc2UpOgorCisgICAgZGVmIGlkKHNlbGYpOgorICAgICAgICByZXR1cm4gJ18nLmpvaW4oc2VsZi5fZHRfdGVzdC5uYW1lLnNwbGl0KCcuJykpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9kdF90ZXN0LmZpbGVuYW1lCisgICAgX19zdHJfXyA9IF9fcmVwcl9fCisKKyAgICBkZWYgZm9ybWF0X2ZhaWx1cmUoc2VsZiwgZXJyKToKKyAgICAgICAgcmV0dXJuICgnRmFpbGVkIGRvY3Rlc3QgdGVzdCBmb3IgJXNcbiAgRmlsZSAiJXMiLCBsaW5lIDBcblxuJXMnCisgICAgICAgICAgICAgICAgJSAoc2VsZi5fZHRfdGVzdC5uYW1lLCBzZWxmLl9kdF90ZXN0LmZpbGVuYW1lLCBlcnIpCisgICAgICAgICAgICAgICAgKQorCitkZWYgRG9jRmlsZVRlc3QocGF0aCwgbW9kdWxlX3JlbGF0aXZlPVRydWUsIHBhY2thZ2U9Tm9uZSwKKyAgICAgICAgICAgICAgICBnbG9icz1Ob25lLCBwYXJzZXI9RG9jVGVzdFBhcnNlcigpLAorICAgICAgICAgICAgICAgIGVuY29kaW5nPU5vbmUsICoqb3B0aW9ucyk6CisgICAgaWYgZ2xvYnMgaXMgTm9uZToKKyAgICAgICAgZ2xvYnMgPSB7fQorICAgIGVsc2U6CisgICAgICAgIGdsb2JzID0gZ2xvYnMuY29weSgpCisKKyAgICBpZiBwYWNrYWdlIGFuZCBub3QgbW9kdWxlX3JlbGF0aXZlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJQYWNrYWdlIG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgbW9kdWxlLSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVsYXRpdmUgcGF0aHMuIikKKworICAgICMgUmVsYXRpdml6ZSB0aGUgcGF0aC4KKyAgICBkb2MsIHBhdGggPSBfbG9hZF90ZXN0ZmlsZShwYXRoLCBwYWNrYWdlLCBtb2R1bGVfcmVsYXRpdmUpCisKKyAgICBpZiAiX19maWxlX18iIG5vdCBpbiBnbG9iczoKKyAgICAgICAgZ2xvYnNbIl9fZmlsZV9fIl0gPSBwYXRoCisKKyAgICAjIEZpbmQgdGhlIGZpbGUgYW5kIHJlYWQgaXQuCisgICAgbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKKworICAgICMgSWYgYW4gZW5jb2RpbmcgaXMgc3BlY2lmaWVkLCB1c2UgaXQgdG8gY29udmVydCB0aGUgZmlsZSB0byB1bmljb2RlCisgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgIGRvYyA9IGRvYy5kZWNvZGUoZW5jb2RpbmcpCisKKyAgICAjIENvbnZlcnQgaXQgdG8gYSB0ZXN0LCBhbmQgd3JhcCBpdCBpbiBhIERvY0ZpbGVDYXNlLgorICAgIHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jLCBnbG9icywgbmFtZSwgcGF0aCwgMCkKKyAgICByZXR1cm4gRG9jRmlsZUNhc2UodGVzdCwgKipvcHRpb25zKQorCitkZWYgRG9jRmlsZVN1aXRlKCpwYXRocywgKiprdyk6CisgICAgIiIiQSB1bml0dGVzdCBzdWl0ZSBmb3Igb25lIG9yIG1vcmUgZG9jdGVzdCBmaWxlcy4KKworICAgIFRoZSBwYXRoIHRvIGVhY2ggZG9jdGVzdCBmaWxlIGlzIGdpdmVuIGFzIGEgc3RyaW5nOyB0aGUKKyAgICBpbnRlcnByZXRhdGlvbiBvZiB0aGF0IHN0cmluZyBkZXBlbmRzIG9uIHRoZSBrZXl3b3JkIGFyZ3VtZW50CisgICAgIm1vZHVsZV9yZWxhdGl2ZSIuCisKKyAgICBBIG51bWJlciBvZiBvcHRpb25zIG1heSBiZSBwcm92aWRlZCBhcyBrZXl3b3JkIGFyZ3VtZW50czoKKworICAgIG1vZHVsZV9yZWxhdGl2ZQorICAgICAgSWYgIm1vZHVsZV9yZWxhdGl2ZSIgaXMgVHJ1ZSwgdGhlbiB0aGUgZ2l2ZW4gZmlsZSBwYXRocyBhcmUKKyAgICAgIGludGVycHJldGVkIGFzIG9zLWluZGVwZW5kZW50IG1vZHVsZS1yZWxhdGl2ZSBwYXRocy4gIEJ5CisgICAgICBkZWZhdWx0LCB0aGVzZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGNhbGxpbmcgbW9kdWxlJ3MKKyAgICAgIGRpcmVjdG9yeTsgYnV0IGlmIHRoZSAicGFja2FnZSIgYXJndW1lbnQgaXMgc3BlY2lmaWVkLCB0aGVuCisgICAgICB0aGV5IGFyZSByZWxhdGl2ZSB0byB0aGF0IHBhY2thZ2UuICBUbyBlbnN1cmUgb3MtaW5kZXBlbmRlbmNlLAorICAgICAgImZpbGVuYW1lIiBzaG91bGQgdXNlICIvIiBjaGFyYWN0ZXJzIHRvIHNlcGFyYXRlIHBhdGgKKyAgICAgIHNlZ21lbnRzLCBhbmQgbWF5IG5vdCBiZSBhbiBhYnNvbHV0ZSBwYXRoIChpLmUuLCBpdCBtYXkgbm90CisgICAgICBiZWdpbiB3aXRoICIvIikuCisKKyAgICAgIElmICJtb2R1bGVfcmVsYXRpdmUiIGlzIEZhbHNlLCB0aGVuIHRoZSBnaXZlbiBmaWxlIHBhdGhzIGFyZQorICAgICAgaW50ZXJwcmV0ZWQgYXMgb3Mtc3BlY2lmaWMgcGF0aHMuICBUaGVzZSBwYXRocyBtYXkgYmUgYWJzb2x1dGUKKyAgICAgIG9yIHJlbGF0aXZlICh0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSkuCisKKyAgICBwYWNrYWdlCisgICAgICBBIFB5dGhvbiBwYWNrYWdlIG9yIHRoZSBuYW1lIG9mIGEgUHl0aG9uIHBhY2thZ2Ugd2hvc2UgZGlyZWN0b3J5CisgICAgICBzaG91bGQgYmUgdXNlZCBhcyB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIG1vZHVsZSByZWxhdGl2ZSBwYXRocy4KKyAgICAgIElmICJwYWNrYWdlIiBpcyBub3Qgc3BlY2lmaWVkLCB0aGVuIHRoZSBjYWxsaW5nIG1vZHVsZSdzCisgICAgICBkaXJlY3RvcnkgaXMgdXNlZCBhcyB0aGUgYmFzZSBkaXJlY3RvcnkgZm9yIG1vZHVsZSByZWxhdGl2ZQorICAgICAgZmlsZW5hbWVzLiAgSXQgaXMgYW4gZXJyb3IgdG8gc3BlY2lmeSAicGFja2FnZSIgaWYKKyAgICAgICJtb2R1bGVfcmVsYXRpdmUiIGlzIEZhbHNlLgorCisgICAgc2V0VXAKKyAgICAgIEEgc2V0LXVwIGZ1bmN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgYmVmb3JlIHJ1bm5pbmcgdGhlCisgICAgICB0ZXN0cyBpbiBlYWNoIGZpbGUuIFRoZSBzZXRVcCBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZCBhIERvY1Rlc3QKKyAgICAgIG9iamVjdC4gIFRoZSBzZXRVcCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSB0ZXN0IGdsb2JhbHMgYXMgdGhlCisgICAgICBnbG9icyBhdHRyaWJ1dGUgb2YgdGhlIHRlc3QgcGFzc2VkLgorCisgICAgdGVhckRvd24KKyAgICAgIEEgdGVhci1kb3duIGZ1bmN0aW9uLiAgVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgcnVubmluZyB0aGUKKyAgICAgIHRlc3RzIGluIGVhY2ggZmlsZS4gIFRoZSB0ZWFyRG93biBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZCBhIERvY1Rlc3QKKyAgICAgIG9iamVjdC4gIFRoZSB0ZWFyRG93biBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSB0ZXN0IGdsb2JhbHMgYXMgdGhlCisgICAgICBnbG9icyBhdHRyaWJ1dGUgb2YgdGhlIHRlc3QgcGFzc2VkLgorCisgICAgZ2xvYnMKKyAgICAgIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGluaXRpYWwgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgdGhlIHRlc3RzLgorCisgICAgb3B0aW9uZmxhZ3MKKyAgICAgIEEgc2V0IG9mIGRvY3Rlc3Qgb3B0aW9uIGZsYWdzIGV4cHJlc3NlZCBhcyBhbiBpbnRlZ2VyLgorCisgICAgcGFyc2VyCisgICAgICBBIERvY1Rlc3RQYXJzZXIgKG9yIHN1YmNsYXNzKSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGV4dHJhY3QKKyAgICAgIHRlc3RzIGZyb20gdGhlIGZpbGVzLgorCisgICAgZW5jb2RpbmcKKyAgICAgIEFuIGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNvbnZlcnQgdGhlIGZpbGVzIHRvIHVuaWNvZGUuCisgICAgIiIiCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgIyBXZSBkbyB0aGlzIGhlcmUgc28gdGhhdCBfbm9ybWFsaXplX21vZHVsZSBpcyBjYWxsZWQgYXQgdGhlIHJpZ2h0CisgICAgIyBsZXZlbC4gIElmIGl0IHdlcmUgY2FsbGVkIGluIERvY0ZpbGVUZXN0LCB0aGVuIHRoaXMgZnVuY3Rpb24KKyAgICAjIHdvdWxkIGJlIHRoZSBjYWxsZXIgYW5kIHdlIG1pZ2h0IGd1ZXNzIHRoZSBwYWNrYWdlIGluY29ycmVjdGx5LgorICAgIGlmIGt3LmdldCgnbW9kdWxlX3JlbGF0aXZlJywgVHJ1ZSk6CisgICAgICAgIGt3WydwYWNrYWdlJ10gPSBfbm9ybWFsaXplX21vZHVsZShrdy5nZXQoJ3BhY2thZ2UnKSkKKworICAgIGZvciBwYXRoIGluIHBhdGhzOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KERvY0ZpbGVUZXN0KHBhdGgsICoqa3cpKQorCisgICAgcmV0dXJuIHN1aXRlCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIDkuIERlYnVnZ2luZyBTdXBwb3J0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiBzY3JpcHRfZnJvbV9leGFtcGxlcyhzKToKKyAgICByIiIiRXh0cmFjdCBzY3JpcHQgZnJvbSB0ZXh0IHdpdGggZXhhbXBsZXMuCisKKyAgICAgICBDb252ZXJ0cyB0ZXh0IHdpdGggZXhhbXBsZXMgdG8gYSBQeXRob24gc2NyaXB0LiAgRXhhbXBsZSBpbnB1dCBpcworICAgICAgIGNvbnZlcnRlZCB0byByZWd1bGFyIGNvZGUuICBFeGFtcGxlIG91dHB1dCBhbmQgYWxsIG90aGVyIHdvcmRzCisgICAgICAgYXJlIGNvbnZlcnRlZCB0byBjb21tZW50czoKKworICAgICAgID4+PiB0ZXh0ID0gJycnCisgICAgICAgLi4uICAgICAgIEhlcmUgYXJlIGV4YW1wbGVzIG9mIHNpbXBsZSBtYXRoLgorICAgICAgIC4uLgorICAgICAgIC4uLiAgICAgICAgICAgUHl0aG9uIGhhcyBzdXBlciBhY2N1cmF0ZSBpbnRlZ2VyIGFkZGl0aW9uCisgICAgICAgLi4uCisgICAgICAgLi4uICAgICAgICAgICA+Pj4gMiArIDIKKyAgICAgICAuLi4gICAgICAgICAgIDUKKyAgICAgICAuLi4KKyAgICAgICAuLi4gICAgICAgICAgIEFuZCB2ZXJ5IGZyaWVuZGx5IGVycm9yIG1lc3NhZ2VzOgorICAgICAgIC4uLgorICAgICAgIC4uLiAgICAgICAgICAgPj4+IDEvMAorICAgICAgIC4uLiAgICAgICAgICAgVG8gSW5maW5pdHkKKyAgICAgICAuLi4gICAgICAgICAgIEFuZAorICAgICAgIC4uLiAgICAgICAgICAgQmV5b25kCisgICAgICAgLi4uCisgICAgICAgLi4uICAgICAgICAgICBZb3UgY2FuIHVzZSBsb2dpYyBpZiB5b3Ugd2FudDoKKyAgICAgICAuLi4KKyAgICAgICAuLi4gICAgICAgICAgID4+PiBpZiAwOgorICAgICAgIC4uLiAgICAgICAgICAgLi4uICAgIGJsYWgKKyAgICAgICAuLi4gICAgICAgICAgIC4uLiAgICBibGFoCisgICAgICAgLi4uICAgICAgICAgICAuLi4KKyAgICAgICAuLi4KKyAgICAgICAuLi4gICAgICAgICAgIEhvIGh1bQorICAgICAgIC4uLiAgICAgICAgICAgJycnCisKKyAgICAgICA+Pj4gcHJpbnQgc2NyaXB0X2Zyb21fZXhhbXBsZXModGV4dCkKKyAgICAgICAjIEhlcmUgYXJlIGV4YW1wbGVzIG9mIHNpbXBsZSBtYXRoLgorICAgICAgICMKKyAgICAgICAjICAgICBQeXRob24gaGFzIHN1cGVyIGFjY3VyYXRlIGludGVnZXIgYWRkaXRpb24KKyAgICAgICAjCisgICAgICAgMiArIDIKKyAgICAgICAjIEV4cGVjdGVkOgorICAgICAgICMjIDUKKyAgICAgICAjCisgICAgICAgIyAgICAgQW5kIHZlcnkgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZXM6CisgICAgICAgIworICAgICAgIDEvMAorICAgICAgICMgRXhwZWN0ZWQ6CisgICAgICAgIyMgVG8gSW5maW5pdHkKKyAgICAgICAjIyBBbmQKKyAgICAgICAjIyBCZXlvbmQKKyAgICAgICAjCisgICAgICAgIyAgICAgWW91IGNhbiB1c2UgbG9naWMgaWYgeW91IHdhbnQ6CisgICAgICAgIworICAgICAgIGlmIDA6CisgICAgICAgICAgYmxhaAorICAgICAgICAgIGJsYWgKKyAgICAgICAjCisgICAgICAgIyAgICAgSG8gaHVtCisgICAgICAgPEJMQU5LTElORT4KKyAgICAgICAiIiIKKyAgICBvdXRwdXQgPSBbXQorICAgIGZvciBwaWVjZSBpbiBEb2NUZXN0UGFyc2VyKCkucGFyc2Uocyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UocGllY2UsIEV4YW1wbGUpOgorICAgICAgICAgICAgIyBBZGQgdGhlIGV4YW1wbGUncyBzb3VyY2UgY29kZSAoc3RyaXAgdHJhaWxpbmcgTkwpCisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKHBpZWNlLnNvdXJjZVs6LTFdKQorICAgICAgICAgICAgIyBBZGQgdGhlIGV4cGVjdGVkIG91dHB1dDoKKyAgICAgICAgICAgIHdhbnQgPSBwaWVjZS53YW50CisgICAgICAgICAgICBpZiB3YW50OgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoJyMgRXhwZWN0ZWQ6JykKKyAgICAgICAgICAgICAgICBvdXRwdXQgKz0gWycjIyAnK2wgZm9yIGwgaW4gd2FudC5zcGxpdCgnXG4nKVs6LTFdXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBBZGQgbm9uLWV4YW1wbGUgdGV4dC4KKyAgICAgICAgICAgIG91dHB1dCArPSBbX2NvbW1lbnRfbGluZShsKQorICAgICAgICAgICAgICAgICAgICAgICBmb3IgbCBpbiBwaWVjZS5zcGxpdCgnXG4nKVs6LTFdXQorCisgICAgIyBUcmltIGp1bmsgb24gYm90aCBlbmRzLgorICAgIHdoaWxlIG91dHB1dCBhbmQgb3V0cHV0Wy0xXSA9PSAnIyc6CisgICAgICAgIG91dHB1dC5wb3AoKQorICAgIHdoaWxlIG91dHB1dCBhbmQgb3V0cHV0WzBdID09ICcjJzoKKyAgICAgICAgb3V0cHV0LnBvcCgwKQorICAgICMgQ29tYmluZSB0aGUgb3V0cHV0LCBhbmQgcmV0dXJuIGl0LgorICAgICMgQWRkIGEgY291cnRlc3kgbmV3bGluZSB0byBwcmV2ZW50IGV4ZWMgZnJvbSBjaG9raW5nIChzZWUgYnVnICMxMTcyNzg1KQorICAgIHJldHVybiAnXG4nLmpvaW4ob3V0cHV0KSArICdcbicKKworZGVmIHRlc3Rzb3VyY2UobW9kdWxlLCBuYW1lKToKKyAgICAiIiJFeHRyYWN0IHRoZSB0ZXN0IHNvdXJjZXMgZnJvbSBhIGRvY3Rlc3QgZG9jc3RyaW5nIGFzIGEgc2NyaXB0LgorCisgICAgUHJvdmlkZSB0aGUgbW9kdWxlIChvciBkb3R0ZWQgbmFtZSBvZiB0aGUgbW9kdWxlKSBjb250YWluaW5nIHRoZQorICAgIHRlc3QgdG8gYmUgZGVidWdnZWQgYW5kIHRoZSBuYW1lICh3aXRoaW4gdGhlIG1vZHVsZSkgb2YgdGhlIG9iamVjdAorICAgIHdpdGggdGhlIGRvYyBzdHJpbmcgd2l0aCB0ZXN0cyB0byBiZSBkZWJ1Z2dlZC4KKyAgICAiIiIKKyAgICBtb2R1bGUgPSBfbm9ybWFsaXplX21vZHVsZShtb2R1bGUpCisgICAgdGVzdHMgPSBEb2NUZXN0RmluZGVyKCkuZmluZChtb2R1bGUpCisgICAgdGVzdCA9IFt0IGZvciB0IGluIHRlc3RzIGlmIHQubmFtZSA9PSBuYW1lXQorICAgIGlmIG5vdCB0ZXN0OgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG5hbWUsICJub3QgZm91bmQgaW4gdGVzdHMiKQorICAgIHRlc3QgPSB0ZXN0WzBdCisgICAgdGVzdHNyYyA9IHNjcmlwdF9mcm9tX2V4YW1wbGVzKHRlc3QuZG9jc3RyaW5nKQorICAgIHJldHVybiB0ZXN0c3JjCisKK2RlZiBkZWJ1Z19zcmMoc3JjLCBwbT1GYWxzZSwgZ2xvYnM9Tm9uZSk6CisgICAgIiIiRGVidWcgYSBzaW5nbGUgZG9jdGVzdCBkb2NzdHJpbmcsIGluIGFyZ3VtZW50IGBzcmNgJyIiIgorICAgIHRlc3RzcmMgPSBzY3JpcHRfZnJvbV9leGFtcGxlcyhzcmMpCisgICAgZGVidWdfc2NyaXB0KHRlc3RzcmMsIHBtLCBnbG9icykKKworZGVmIGRlYnVnX3NjcmlwdChzcmMsIHBtPUZhbHNlLCBnbG9icz1Ob25lKToKKyAgICAiRGVidWcgYSB0ZXN0IHNjcmlwdC4gIGBzcmNgIGlzIHRoZSBzY3JpcHQsIGFzIGEgc3RyaW5nLiIKKyAgICBpbXBvcnQgcGRiCisKKyAgICAjIE5vdGUgdGhhdCB0ZW1wZmlsZS5OYW1lVGVtcG9yYXJ5RmlsZSgpIGNhbm5vdCBiZSB1c2VkLiAgQXMgdGhlCisgICAgIyBkb2NzIHNheSwgYSBmaWxlIHNvIGNyZWF0ZWQgY2Fubm90IGJlIG9wZW5lZCBieSBuYW1lIGEgc2Vjb25kIHRpbWUKKyAgICAjIG9uIG1vZGVybiBXaW5kb3dzIGJveGVzLCBhbmQgZXhlY2ZpbGUoKSBuZWVkcyB0byBvcGVuIGl0LgorICAgIHNyY2ZpbGVuYW1lID0gdGVtcGZpbGUubWt0ZW1wKCIucHkiLCAiZG9jdGVzdGRlYnVnIikKKyAgICBmID0gb3BlbihzcmNmaWxlbmFtZSwgJ3cnKQorICAgIGYud3JpdGUoc3JjKQorICAgIGYuY2xvc2UoKQorCisgICAgdHJ5OgorICAgICAgICBpZiBnbG9iczoKKyAgICAgICAgICAgIGdsb2JzID0gZ2xvYnMuY29weSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBnbG9icyA9IHt9CisKKyAgICAgICAgaWYgcG06CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXhlY2ZpbGUoc3JjZmlsZW5hbWUsIGdsb2JzLCBnbG9icykKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwcmludCBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICAgICAgICAgIHBkYi5wb3N0X21vcnRlbShzeXMuZXhjX2luZm8oKVsyXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgTm90ZSB0aGF0ICVyIGlzIHZpdGFsIGhlcmUuICAnJXMnIGluc3RlYWQgY2FuLCBlLmcuLCBjYXVzZQorICAgICAgICAgICAgIyBiYWNrc2xhc2hlcyB0byBnZXQgdHJlYXRlZCBhcyBtZXRhY2hhcmFjdGVycyBvbiBXaW5kb3dzLgorICAgICAgICAgICAgcGRiLnJ1bigiZXhlY2ZpbGUoJXIpIiAlIHNyY2ZpbGVuYW1lLCBnbG9icywgZ2xvYnMpCisKKyAgICBmaW5hbGx5OgorICAgICAgICBvcy5yZW1vdmUoc3JjZmlsZW5hbWUpCisKK2RlZiBkZWJ1Zyhtb2R1bGUsIG5hbWUsIHBtPUZhbHNlKToKKyAgICAiIiJEZWJ1ZyBhIHNpbmdsZSBkb2N0ZXN0IGRvY3N0cmluZy4KKworICAgIFByb3ZpZGUgdGhlIG1vZHVsZSAob3IgZG90dGVkIG5hbWUgb2YgdGhlIG1vZHVsZSkgY29udGFpbmluZyB0aGUKKyAgICB0ZXN0IHRvIGJlIGRlYnVnZ2VkIGFuZCB0aGUgbmFtZSAod2l0aGluIHRoZSBtb2R1bGUpIG9mIHRoZSBvYmplY3QKKyAgICB3aXRoIHRoZSBkb2NzdHJpbmcgd2l0aCB0ZXN0cyB0byBiZSBkZWJ1Z2dlZC4KKyAgICAiIiIKKyAgICBtb2R1bGUgPSBfbm9ybWFsaXplX21vZHVsZShtb2R1bGUpCisgICAgdGVzdHNyYyA9IHRlc3Rzb3VyY2UobW9kdWxlLCBuYW1lKQorICAgIGRlYnVnX3NjcmlwdCh0ZXN0c3JjLCBwbSwgbW9kdWxlLl9fZGljdF9fKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAxMC4gRXhhbXBsZSBVc2FnZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworY2xhc3MgX1Rlc3RDbGFzczoKKyAgICAiIiIKKyAgICBBIHBvaW50bGVzcyBjbGFzcywgZm9yIHNhbml0eS1jaGVja2luZyBvZiBkb2NzdHJpbmcgdGVzdGluZy4KKworICAgIE1ldGhvZHM6CisgICAgICAgIHNxdWFyZSgpCisgICAgICAgIGdldCgpCisKKyAgICA+Pj4gX1Rlc3RDbGFzcygxMykuZ2V0KCkgKyBfVGVzdENsYXNzKC0xMikuZ2V0KCkKKyAgICAxCisgICAgPj4+IGhleChfVGVzdENsYXNzKDEzKS5zcXVhcmUoKS5nZXQoKSkKKyAgICAnMHhhOScKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWwpOgorICAgICAgICAiIiJ2YWwgLT4gX1Rlc3RDbGFzcyBvYmplY3Qgd2l0aCBhc3NvY2lhdGVkIHZhbHVlIHZhbC4KKworICAgICAgICA+Pj4gdCA9IF9UZXN0Q2xhc3MoMTIzKQorICAgICAgICA+Pj4gcHJpbnQgdC5nZXQoKQorICAgICAgICAxMjMKKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiBzcXVhcmUoc2VsZik6CisgICAgICAgICIiInNxdWFyZSgpIC0+IHNxdWFyZSBUZXN0Q2xhc3MncyBhc3NvY2lhdGVkIHZhbHVlCisKKyAgICAgICAgPj4+IF9UZXN0Q2xhc3MoMTMpLnNxdWFyZSgpLmdldCgpCisgICAgICAgIDE2OQorICAgICAgICAiIiIKKworICAgICAgICBzZWxmLnZhbCA9IHNlbGYudmFsICoqIDIKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgICIiImdldCgpIC0+IHJldHVybiBUZXN0Q2xhc3MncyBhc3NvY2lhdGVkIHZhbHVlLgorCisgICAgICAgID4+PiB4ID0gX1Rlc3RDbGFzcygtNDIpCisgICAgICAgID4+PiBwcmludCB4LmdldCgpCisgICAgICAgIC00MgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gc2VsZi52YWwKKworX190ZXN0X18gPSB7Il9UZXN0Q2xhc3MiOiBfVGVzdENsYXNzLAorICAgICAgICAgICAgInN0cmluZyI6IHIiIiIKKyAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlIG9mIGEgc3RyaW5nIG9iamVjdCwgc2VhcmNoZWQgYXMtaXMuCisgICAgICAgICAgICAgICAgICAgICAgPj4+IHggPSAxOyB5ID0gMgorICAgICAgICAgICAgICAgICAgICAgID4+PiB4ICsgeSwgeCAqIHkKKyAgICAgICAgICAgICAgICAgICAgICAoMywgMikKKyAgICAgICAgICAgICAgICAgICAgICAiIiIsCisKKyAgICAgICAgICAgICJib29sLWludCBlcXVpdmFsZW5jZSI6IHIiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIDIuMiwgYm9vbGVhbiBleHByZXNzaW9ucyBkaXNwbGF5ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgb3IgMS4gIEJ5IGRlZmF1bHQsIHdlIHN0aWxsIGFjY2VwdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbS4gIFRoaXMgY2FuIGJlIGRpc2FibGVkIGJ5IHBhc3NpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTlRfQUNDRVBUX1RSVUVfRk9SXzEgdG8gdGhlIG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uZmxhZ3MgYXJndW1lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Pj4gNCA9PSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Pj4gNCA9PSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+Pj4gNCA+IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+PiA0ID4gNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIiwKKworICAgICAgICAgICAgImJsYW5rIGxpbmVzIjogciIiIgorICAgICAgICAgICAgICAgIEJsYW5rIGxpbmVzIGNhbiBiZSBtYXJrZWQgd2l0aCA8QkxBTktMSU5FPjoKKyAgICAgICAgICAgICAgICAgICAgPj4+IHByaW50ICdmb29cblxuYmFyXG4nCisgICAgICAgICAgICAgICAgICAgIGZvbworICAgICAgICAgICAgICAgICAgICA8QkxBTktMSU5FPgorICAgICAgICAgICAgICAgICAgICBiYXIKKyAgICAgICAgICAgICAgICAgICAgPEJMQU5LTElORT4KKyAgICAgICAgICAgICIiIiwKKworICAgICAgICAgICAgImVsbGlwc2lzIjogciIiIgorICAgICAgICAgICAgICAgIElmIHRoZSBlbGxpcHNpcyBmbGFnIGlzIHVzZWQsIHRoZW4gJy4uLicgY2FuIGJlIHVzZWQgdG8KKyAgICAgICAgICAgICAgICBlbGlkZSBzdWJzdHJpbmdzIGluIHRoZSBkZXNpcmVkIG91dHB1dDoKKyAgICAgICAgICAgICAgICAgICAgPj4+IHByaW50IHJhbmdlKDEwMDApICNkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAgICAgICAgICAgICAgICAgWzAsIDEsIDIsIC4uLiwgOTk5XQorICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAid2hpdGVzcGFjZSBub3JtYWxpemF0aW9uIjogciIiIgorICAgICAgICAgICAgICAgIElmIHRoZSB3aGl0ZXNwYWNlIG5vcm1hbGl6YXRpb24gZmxhZyBpcyB1c2VkLCB0aGVuCisgICAgICAgICAgICAgICAgZGlmZmVyZW5jZXMgaW4gd2hpdGVzcGFjZSBhcmUgaWdub3JlZC4KKyAgICAgICAgICAgICAgICAgICAgPj4+IHByaW50IHJhbmdlKDMwKSAjZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFCisgICAgICAgICAgICAgICAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsCisgICAgICAgICAgICAgICAgICAgICAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LAorICAgICAgICAgICAgICAgICAgICAgMjcsIDI4LCAyOV0KKyAgICAgICAgICAgICIiIiwKKyAgICAgICAgICAgfQorCisKK2RlZiBfdGVzdCgpOgorICAgIHRlc3RmaWxlcyA9IFthcmcgZm9yIGFyZyBpbiBzeXMuYXJndlsxOl0gaWYgYXJnIGFuZCBhcmdbMF0gIT0gJy0nXQorICAgIGlmIG5vdCB0ZXN0ZmlsZXM6CisgICAgICAgIG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQorICAgICAgICBpZiAnX19sb2FkZXJfXycgaW4gZ2xvYmFscygpOiAgICAgICAgICAjIHB5dGhvbiAtbQorICAgICAgICAgICAgbmFtZSwgXyA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKKyAgICAgICAgcHJpbnQoInVzYWdlOiB7MH0gWy12XSBmaWxlIC4uLiIuZm9ybWF0KG5hbWUpKQorICAgICAgICByZXR1cm4gMgorICAgIGZvciBmaWxlbmFtZSBpbiB0ZXN0ZmlsZXM6CisgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCIucHkiKToKKyAgICAgICAgICAgICMgSXQgaXMgYSBtb2R1bGUgLS0gaW5zZXJ0IGl0cyBkaXIgaW50byBzeXMucGF0aCBhbmQgdHJ5IHRvCisgICAgICAgICAgICAjIGltcG9ydCBpdC4gSWYgaXQgaXMgcGFydCBvZiBhIHBhY2thZ2UsIHRoYXQgcG9zc2libHkKKyAgICAgICAgICAgICMgd29uJ3Qgd29yayBiZWNhdXNlIG9mIHBhY2thZ2UgaW1wb3J0cy4KKyAgICAgICAgICAgIGRpcm5hbWUsIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSkKKyAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBkaXJuYW1lKQorICAgICAgICAgICAgbSA9IF9faW1wb3J0X18oZmlsZW5hbWVbOi0zXSkKKyAgICAgICAgICAgIGRlbCBzeXMucGF0aFswXQorICAgICAgICAgICAgZmFpbHVyZXMsIF8gPSB0ZXN0bW9kKG0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmYWlsdXJlcywgXyA9IHRlc3RmaWxlKGZpbGVuYW1lLCBtb2R1bGVfcmVsYXRpdmU9RmFsc2UpCisgICAgICAgIGlmIGZhaWx1cmVzOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICByZXR1cm4gMAorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3lzLmV4aXQoX3Rlc3QoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZG9jdGVzdC5weWMgYi9saWIvcHl0aG9uMi43L2RvY3Rlc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYWRlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2RvY3Rlc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZG9jdGVzdC5weW8gYi9saWIvcHl0aG9uMi43L2RvY3Rlc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NzhhMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2RvY3Rlc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZHVtYmRibS5weSBiL2xpYi9weXRob24yLjcvZHVtYmRibS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjU0YTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kdW1iZGJtLnB5CkBAIC0wLDAgKzEsMjUwIEBACisiIiJBIGR1bWIgYW5kIHNsb3cgYnV0IHNpbXBsZSBkYm0gY2xvbmUuCisKK0ZvciBkYXRhYmFzZSBzcGFtLCBzcGFtLmRpciBjb250YWlucyB0aGUgaW5kZXggKGEgdGV4dCBmaWxlKSwKK3NwYW0uYmFrICptYXkqIGNvbnRhaW4gYSBiYWNrdXAgb2YgdGhlIGluZGV4IChhbHNvIGEgdGV4dCBmaWxlKSwKK3doaWxlIHNwYW0uZGF0IGNvbnRhaW5zIHRoZSBkYXRhIChhIGJpbmFyeSBmaWxlKS4KKworWFhYIFRPIERPOgorCistIHNlZW1zIHRvIGNvbnRhaW4gYSBidWcgd2hlbiB1cGRhdGluZy4uLgorCistIHJlY2xhaW0gZnJlZSBzcGFjZSAoY3VycmVudGx5LCBzcGFjZSBvbmNlIG9jY3VwaWVkIGJ5IGRlbGV0ZWQgb3IgZXhwYW5kZWQKK2l0ZW1zIGlzIG5ldmVyIHJldXNlZCkKKworLSBzdXBwb3J0IGNvbmN1cnJlbnQgYWNjZXNzIChjdXJyZW50bHksIGlmIHR3byBwcm9jZXNzZXMgdGFrZSB0dXJucyBtYWtpbmcKK3VwZGF0ZXMsIHRoZXkgY2FuIG1lc3MgdXAgdGhlIGluZGV4KQorCistIHN1cHBvcnQgZWZmaWNpZW50IGFjY2VzcyB0byBsYXJnZSBkYXRhYmFzZXMgKGN1cnJlbnRseSwgdGhlIHdob2xlIGluZGV4CitpcyByZWFkIHdoZW4gdGhlIGRhdGFiYXNlIGlzIG9wZW5lZCwgYW5kIHNvbWUgdXBkYXRlcyByZXdyaXRlIHRoZSB3aG9sZSBpbmRleCkKKworLSBzdXBwb3J0IG9wZW5pbmcgZm9yIHJlYWQtb25seSAoZmxhZyA9ICdtJykKKworIiIiCisKK2ltcG9ydCBvcyBhcyBfb3MKK2ltcG9ydCBfX2J1aWx0aW5fXworaW1wb3J0IFVzZXJEaWN0CisKK19vcGVuID0gX19idWlsdGluX18ub3BlbgorCitfQkxPQ0tTSVpFID0gNTEyCisKK2Vycm9yID0gSU9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAjIEZvciBhbnlkYm0KKworY2xhc3MgX0RhdGFiYXNlKFVzZXJEaWN0LkRpY3RNaXhpbik6CisKKyAgICAjIFRoZSBvbi1kaXNrIGRpcmVjdG9yeSBhbmQgZGF0YSBmaWxlcyBjYW4gcmVtYWluIGluIG11dHVhbGx5CisgICAgIyBpbmNvbnNpc3RlbnQgc3RhdGVzIGZvciBhbiBhcmJpdHJhcmlseSBsb25nIHRpbWUgKHNlZSBjb21tZW50cworICAgICMgYXQgdGhlIGVuZCBvZiBfX3NldGl0ZW1fXykuICBUaGlzIGlzIG9ubHkgcmVwYWlyZWQgd2hlbiBfY29tbWl0KCkKKyAgICAjIGdldHMgY2FsbGVkLiAgT25lIHBsYWNlIF9jb21taXQoKSBnZXRzIGNhbGxlZCBpcyBmcm9tIF9fZGVsX18oKSwKKyAgICAjIGFuZCBpZiB0aGF0IG9jY3VycyBhdCBwcm9ncmFtIHNodXRkb3duIHRpbWUsIG1vZHVsZSBnbG9iYWxzIG1heQorICAgICMgYWxyZWFkeSBoYXZlIGdvdHRlbiByZWJvdW5kIHRvIE5vbmUuICBTaW5jZSBpdCdzIGNydWNpYWwgdGhhdAorICAgICMgX2NvbW1pdCgpIGZpbmlzaCBzdWNjZXNzZnVsbHksIHdlIGNhbid0IGlnbm9yZSBzaHV0ZG93biByYWNlcworICAgICMgaGVyZSwgYW5kIF9jb21taXQoKSBtdXN0IG5vdCByZWZlcmVuY2UgYW55IGdsb2JhbHMuCisgICAgX29zID0gX29zICAgICAgICMgZm9yIF9jb21taXQoKQorICAgIF9vcGVuID0gX29wZW4gICAjIGZvciBfY29tbWl0KCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlYmFzZW5hbWUsIG1vZGUpOgorICAgICAgICBzZWxmLl9tb2RlID0gbW9kZQorCisgICAgICAgICMgVGhlIGRpcmVjdG9yeSBmaWxlIGlzIGEgdGV4dCBmaWxlLiAgRWFjaCBsaW5lIGxvb2tzIGxpa2UKKyAgICAgICAgIyAgICAiJXIsICglZCwgJWQpXG4iICUgKGtleSwgcG9zLCBzaXopCisgICAgICAgICMgd2hlcmUga2V5IGlzIHRoZSBzdHJpbmcga2V5LCBwb3MgaXMgdGhlIG9mZnNldCBpbnRvIHRoZSBkYXQKKyAgICAgICAgIyBmaWxlIG9mIHRoZSBhc3NvY2lhdGVkIHZhbHVlJ3MgZmlyc3QgYnl0ZSwgYW5kIHNpeiBpcyB0aGUgbnVtYmVyCisgICAgICAgICMgb2YgYnl0ZXMgaW4gdGhlIGFzc29jaWF0ZWQgdmFsdWUuCisgICAgICAgIHNlbGYuX2RpcmZpbGUgPSBmaWxlYmFzZW5hbWUgKyBfb3MuZXh0c2VwICsgJ2RpcicKKworICAgICAgICAjIFRoZSBkYXRhIGZpbGUgaXMgYSBiaW5hcnkgZmlsZSBwb2ludGVkIGludG8gYnkgdGhlIGRpcmVjdG9yeQorICAgICAgICAjIGZpbGUsIGFuZCBob2xkcyB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBrZXlzLiAgRWFjaCB2YWx1ZQorICAgICAgICAjIGJlZ2lucyBhdCBhIF9CTE9DS1NJWkUtYWxpZ25lZCBieXRlIG9mZnNldCwgYW5kIGlzIGEgcmF3CisgICAgICAgICMgYmluYXJ5IDgtYml0IHN0cmluZyB2YWx1ZS4KKyAgICAgICAgc2VsZi5fZGF0ZmlsZSA9IGZpbGViYXNlbmFtZSArIF9vcy5leHRzZXAgKyAnZGF0JworICAgICAgICBzZWxmLl9iYWtmaWxlID0gZmlsZWJhc2VuYW1lICsgX29zLmV4dHNlcCArICdiYWsnCisKKyAgICAgICAgIyBUaGUgaW5kZXggaXMgYW4gaW4tbWVtb3J5IGRpY3QsIG1pcnJvcmluZyB0aGUgZGlyZWN0b3J5IGZpbGUuCisgICAgICAgIHNlbGYuX2luZGV4ID0gTm9uZSAgIyBtYXBzIGtleXMgdG8gKHBvcywgc2l6KSBwYWlycworCisgICAgICAgICMgTW9kIGJ5IEphY2s6IGNyZWF0ZSBkYXRhIGZpbGUgaWYgbmVlZGVkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBfb3BlbihzZWxmLl9kYXRmaWxlLCAncicpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgZiA9IF9vcGVuKHNlbGYuX2RhdGZpbGUsICd3JykKKyAgICAgICAgICAgIHNlbGYuX2NobW9kKHNlbGYuX2RhdGZpbGUpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLl91cGRhdGUoKQorCisgICAgIyBSZWFkIGRpcmVjdG9yeSBmaWxlIGludG8gdGhlIGluLW1lbW9yeSBpbmRleCBkaWN0LgorICAgIGRlZiBfdXBkYXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9pbmRleCA9IHt9CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBfb3BlbihzZWxmLl9kaXJmaWxlKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKKyAgICAgICAgICAgICAgICBrZXksIHBvc19hbmRfc2l6X3BhaXIgPSBldmFsKGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi5faW5kZXhba2V5XSA9IHBvc19hbmRfc2l6X3BhaXIKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgIyBXcml0ZSB0aGUgaW5kZXggZGljdCB0byB0aGUgZGlyZWN0b3J5IGZpbGUuICBUaGUgb3JpZ2luYWwgZGlyZWN0b3J5CisgICAgIyBmaWxlIChpZiBhbnkpIGlzIHJlbmFtZWQgd2l0aCBhIC5iYWsgZXh0ZW5zaW9uIGZpcnN0LiAgSWYgYSAuYmFrCisgICAgIyBmaWxlIGN1cnJlbnRseSBleGlzdHMsIGl0J3MgZGVsZXRlZC4KKyAgICBkZWYgX2NvbW1pdChzZWxmKToKKyAgICAgICAgIyBDQVVUSU9OOiAgSXQncyB2aXRhbCB0aGF0IF9jb21taXQoKSBzdWNjZWVkLCBhbmQgX2NvbW1pdCgpIGNhbgorICAgICAgICAjIGJlIGNhbGxlZCBmcm9tIF9fZGVsX18oKS4gIFRoZXJlZm9yZSB3ZSBtdXN0IG5ldmVyIHJlZmVyZW5jZSBhCisgICAgICAgICMgZ2xvYmFsIGluIHRoaXMgcm91dGluZS4KKyAgICAgICAgaWYgc2VsZi5faW5kZXggaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAgIyBub3RoaW5nIHRvIGRvCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fb3MudW5saW5rKHNlbGYuX2Jha2ZpbGUpCisgICAgICAgIGV4Y2VwdCBzZWxmLl9vcy5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9vcy5yZW5hbWUoc2VsZi5fZGlyZmlsZSwgc2VsZi5fYmFrZmlsZSkKKyAgICAgICAgZXhjZXB0IHNlbGYuX29zLmVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGYgPSBzZWxmLl9vcGVuKHNlbGYuX2RpcmZpbGUsICd3JykKKyAgICAgICAgc2VsZi5fY2htb2Qoc2VsZi5fZGlyZmlsZSkKKyAgICAgICAgZm9yIGtleSwgcG9zX2FuZF9zaXpfcGFpciBpbiBzZWxmLl9pbmRleC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGYud3JpdGUoIiVyLCAlclxuIiAlIChrZXksIHBvc19hbmRfc2l6X3BhaXIpKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIHN5bmMgPSBfY29tbWl0CisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgcG9zLCBzaXogPSBzZWxmLl9pbmRleFtrZXldICAgICAjIG1heSByYWlzZSBLZXlFcnJvcgorICAgICAgICBmID0gX29wZW4oc2VsZi5fZGF0ZmlsZSwgJ3JiJykKKyAgICAgICAgZi5zZWVrKHBvcykKKyAgICAgICAgZGF0ID0gZi5yZWFkKHNpeikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHJldHVybiBkYXQKKworICAgICMgQXBwZW5kIHZhbCB0byB0aGUgZGF0YSBmaWxlLCBzdGFydGluZyBhdCBhIF9CTE9DS1NJWkUtYWxpZ25lZAorICAgICMgb2Zmc2V0LiAgVGhlIGRhdGEgZmlsZSBpcyBmaXJzdCBwYWRkZWQgd2l0aCBOVUwgYnl0ZXMgKGlmIG5lZWRlZCkKKyAgICAjIHRvIGdldCB0byBhbiBhbGlnbmVkIG9mZnNldC4gIFJldHVybiBwYWlyCisgICAgIyAgICAgKHN0YXJ0aW5nIG9mZnNldCBvZiB2YWwsIGxlbih2YWwpKQorICAgIGRlZiBfYWRkdmFsKHNlbGYsIHZhbCk6CisgICAgICAgIGYgPSBfb3BlbihzZWxmLl9kYXRmaWxlLCAncmIrJykKKyAgICAgICAgZi5zZWVrKDAsIDIpCisgICAgICAgIHBvcyA9IGludChmLnRlbGwoKSkKKyAgICAgICAgbnBvcyA9ICgocG9zICsgX0JMT0NLU0laRSAtIDEpIC8vIF9CTE9DS1NJWkUpICogX0JMT0NLU0laRQorICAgICAgICBmLndyaXRlKCdcMCcqKG5wb3MtcG9zKSkKKyAgICAgICAgcG9zID0gbnBvcworICAgICAgICBmLndyaXRlKHZhbCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHJldHVybiAocG9zLCBsZW4odmFsKSkKKworICAgICMgV3JpdGUgdmFsIHRvIHRoZSBkYXRhIGZpbGUsIHN0YXJ0aW5nIGF0IG9mZnNldCBwb3MuICBUaGUgY2FsbGVyCisgICAgIyBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGVyZSdzIGVub3VnaCByb29tIHN0YXJ0aW5nIGF0CisgICAgIyBwb3MgdG8gaG9sZCB2YWwsIHdpdGhvdXQgb3ZlcndyaXRpbmcgc29tZSBvdGhlciB2YWx1ZS4gIFJldHVybgorICAgICMgcGFpciAocG9zLCBsZW4odmFsKSkuCisgICAgZGVmIF9zZXR2YWwoc2VsZiwgcG9zLCB2YWwpOgorICAgICAgICBmID0gX29wZW4oc2VsZi5fZGF0ZmlsZSwgJ3JiKycpCisgICAgICAgIGYuc2Vlayhwb3MpCisgICAgICAgIGYud3JpdGUodmFsKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIChwb3MsIGxlbih2YWwpKQorCisgICAgIyBrZXkgaXMgYSBuZXcga2V5IHdob3NlIGFzc29jaWF0ZWQgdmFsdWUgc3RhcnRzIGluIHRoZSBkYXRhIGZpbGUKKyAgICAjIGF0IG9mZnNldCBwb3MgYW5kIHdpdGggbGVuZ3RoIHNpei4gIEFkZCBhbiBpbmRleCByZWNvcmQgdG8KKyAgICAjIHRoZSBpbi1tZW1vcnkgaW5kZXggZGljdCwgYW5kIGFwcGVuZCBvbmUgdG8gdGhlIGRpcmVjdG9yeSBmaWxlLgorICAgIGRlZiBfYWRka2V5KHNlbGYsIGtleSwgcG9zX2FuZF9zaXpfcGFpcik6CisgICAgICAgIHNlbGYuX2luZGV4W2tleV0gPSBwb3NfYW5kX3Npel9wYWlyCisgICAgICAgIGYgPSBfb3BlbihzZWxmLl9kaXJmaWxlLCAnYScpCisgICAgICAgIHNlbGYuX2NobW9kKHNlbGYuX2RpcmZpbGUpCisgICAgICAgIGYud3JpdGUoIiVyLCAlclxuIiAlIChrZXksIHBvc19hbmRfc2l6X3BhaXIpKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbCk6CisgICAgICAgIGlmIG5vdCB0eXBlKGtleSkgPT0gdHlwZSgnJykgPT0gdHlwZSh2YWwpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAia2V5cyBhbmQgdmFsdWVzIG11c3QgYmUgc3RyaW5ncyIKKyAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmLl9pbmRleDoKKyAgICAgICAgICAgIHNlbGYuX2FkZGtleShrZXksIHNlbGYuX2FkZHZhbCh2YWwpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBTZWUgd2hldGhlciB0aGUgbmV3IHZhbHVlIGlzIHNtYWxsIGVub3VnaCB0byBmaXQgaW4gdGhlCisgICAgICAgICAgICAjIChwYWRkZWQpIHNwYWNlIGN1cnJlbnRseSBvY2N1cGllZCBieSB0aGUgb2xkIHZhbHVlLgorICAgICAgICAgICAgcG9zLCBzaXogPSBzZWxmLl9pbmRleFtrZXldCisgICAgICAgICAgICBvbGRibG9ja3MgPSAoc2l6ICsgX0JMT0NLU0laRSAtIDEpIC8vIF9CTE9DS1NJWkUKKyAgICAgICAgICAgIG5ld2Jsb2NrcyA9IChsZW4odmFsKSArIF9CTE9DS1NJWkUgLSAxKSAvLyBfQkxPQ0tTSVpFCisgICAgICAgICAgICBpZiBuZXdibG9ja3MgPD0gb2xkYmxvY2tzOgorICAgICAgICAgICAgICAgIHNlbGYuX2luZGV4W2tleV0gPSBzZWxmLl9zZXR2YWwocG9zLCB2YWwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgVGhlIG5ldyB2YWx1ZSBkb2Vzbid0IGZpdCBpbiB0aGUgKHBhZGRlZCkgc3BhY2UgdXNlZAorICAgICAgICAgICAgICAgICMgYnkgdGhlIG9sZCB2YWx1ZS4gIFRoZSBibG9ja3MgdXNlZCBieSB0aGUgb2xkIHZhbHVlIGFyZQorICAgICAgICAgICAgICAgICMgZm9yZXZlciBsb3N0LgorICAgICAgICAgICAgICAgIHNlbGYuX2luZGV4W2tleV0gPSBzZWxmLl9hZGR2YWwodmFsKQorCisgICAgICAgICAgICAjIE5vdGUgdGhhdCBfaW5kZXggbWF5IGJlIG91dCBvZiBzeW5jaCB3aXRoIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgICAgICMgZmlsZSBub3c6ICBfc2V0dmFsKCkgYW5kIF9hZGR2YWwoKSBkb24ndCB1cGRhdGUgdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgIyBmaWxlLiAgVGhpcyBhbHNvIG1lYW5zIHRoYXQgdGhlIG9uLWRpc2sgZGlyZWN0b3J5IGFuZCBkYXRhCisgICAgICAgICAgICAjIGZpbGVzIGFyZSBpbiBhIG11dHVhbGx5IGluY29uc2lzdGVudCBzdGF0ZSwgYW5kIHRoZXknbGwKKyAgICAgICAgICAgICMgcmVtYWluIHRoYXQgd2F5IHVudGlsIF9jb21taXQoKSBpcyBjYWxsZWQuICBOb3RlIHRoYXQgdGhpcworICAgICAgICAgICAgIyBpcyBhIGRpc2FzdGVyIChmb3IgdGhlIGRhdGFiYXNlKSBpZiB0aGUgcHJvZ3JhbSBjcmFzaGVzCisgICAgICAgICAgICAjIChzbyB0aGF0IF9jb21taXQoKSBuZXZlciBnZXRzIGNhbGxlZCkuCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgIyBUaGUgYmxvY2tzIHVzZWQgYnkgdGhlIGFzc29jaWF0ZWQgdmFsdWUgYXJlIGxvc3QuCisgICAgICAgIGRlbCBzZWxmLl9pbmRleFtrZXldCisgICAgICAgICMgWFhYIEl0J3MgdW5jbGVhciB3aHkgd2UgZG8gYSBfY29tbWl0KCkgaGVyZSAodGhlIGNvZGUgYWx3YXlzCisgICAgICAgICMgWFhYIGhhcywgc28gSSdtIG5vdCBjaGFuZ2luZyBpdCkuICBfc2V0aXRlbV9fIGRvZXNuJ3QgdHJ5IHRvCisgICAgICAgICMgWFhYIGtlZXAgdGhlIGRpcmVjdG9yeSBmaWxlIGluIHN5bmNoLiAgV2h5IHNob3VsZCB3ZT8gIE9yCisgICAgICAgICMgWFhYIHdoeSBzaG91bGRuJ3QgX19zZXRpdGVtX18/CisgICAgICAgIHNlbGYuX2NvbW1pdCgpCisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2luZGV4LmtleXMoKQorCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLl9pbmRleAorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX2luZGV4CisKKyAgICBkZWYgaXRlcmtleXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pbmRleC5pdGVya2V5cygpCisgICAgX19pdGVyX18gPSBpdGVya2V5cworCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5faW5kZXgpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX2NvbW1pdCgpCisgICAgICAgIHNlbGYuX2luZGV4ID0gc2VsZi5fZGF0ZmlsZSA9IHNlbGYuX2RpcmZpbGUgPSBzZWxmLl9iYWtmaWxlID0gTm9uZQorCisgICAgX19kZWxfXyA9IGNsb3NlCisKKyAgICBkZWYgX2NobW9kIChzZWxmLCBmaWxlKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9vcywgJ2NobW9kJyk6CisgICAgICAgICAgICBzZWxmLl9vcy5jaG1vZChmaWxlLCBzZWxmLl9tb2RlKQorCisKK2RlZiBvcGVuKGZpbGUsIGZsYWc9Tm9uZSwgbW9kZT0wNjY2KToKKyAgICAiIiJPcGVuIHRoZSBkYXRhYmFzZSBmaWxlLCBmaWxlbmFtZSwgYW5kIHJldHVybiBjb3JyZXNwb25kaW5nIG9iamVjdC4KKworICAgIFRoZSBmbGFnIGFyZ3VtZW50LCB1c2VkIHRvIGNvbnRyb2wgaG93IHRoZSBkYXRhYmFzZSBpcyBvcGVuZWQgaW4gdGhlCisgICAgb3RoZXIgREJNIGltcGxlbWVudGF0aW9ucywgaXMgaWdub3JlZCBpbiB0aGUgZHVtYmRibSBtb2R1bGU7IHRoZQorICAgIGRhdGFiYXNlIGlzIGFsd2F5cyBvcGVuZWQgZm9yIHVwZGF0ZSwgYW5kIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzCisgICAgbm90IGV4aXN0LgorCisgICAgVGhlIG9wdGlvbmFsIG1vZGUgYXJndW1lbnQgaXMgdGhlIFVOSVggbW9kZSBvZiB0aGUgZmlsZSwgdXNlZCBvbmx5IHdoZW4KKyAgICB0aGUgZGF0YWJhc2UgaGFzIHRvIGJlIGNyZWF0ZWQuICBJdCBkZWZhdWx0cyB0byBvY3RhbCBjb2RlIDA2NjYgKGFuZAorICAgIHdpbGwgYmUgbW9kaWZpZWQgYnkgdGhlIHByZXZhaWxpbmcgdW1hc2spLgorCisgICAgIiIiCisgICAgIyBmbGFnIGFyZ3VtZW50IGlzIGN1cnJlbnRseSBpZ25vcmVkCisKKyAgICAjIE1vZGlmeSBtb2RlIGRlcGVuZGluZyBvbiB0aGUgdW1hc2sKKyAgICB0cnk6CisgICAgICAgIHVtID0gX29zLnVtYXNrKDApCisgICAgICAgIF9vcy51bWFzayh1bSkKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICAjIFR1cm4gb2ZmIGFueSBiaXRzIHRoYXQgYXJlIHNldCBpbiB0aGUgdW1hc2sKKyAgICAgICAgbW9kZSA9IG1vZGUgJiAofnVtKQorCisgICAgcmV0dXJuIF9EYXRhYmFzZShmaWxlLCBtb2RlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kdW1iZGJtLnB5YyBiL2xpYi9weXRob24yLjcvZHVtYmRibS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmMTI3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZHVtYmRibS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kdW1iZGJtLnB5byBiL2xpYi9weXRob24yLjcvZHVtYmRibS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmMTI3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZHVtYmRibS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWQucHkgYi9saWIvcHl0aG9uMi43L2R1bW15X3RocmVhZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOThkYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWQucHkKQEAgLTAsMCArMSwxNDUgQEAKKyIiIkRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIHRoZSB0aHJlYWQgbW9kdWxlLgorCitNZWFudCB0byBiZSB1c2VkIGFzIGEgYnJhaW4tZGVhZCBzdWJzdGl0dXRlIHNvIHRoYXQgdGhyZWFkZWQgY29kZSBkb2VzCitub3QgbmVlZCB0byBiZSByZXdyaXR0ZW4gZm9yIHdoZW4gdGhlIHRocmVhZCBtb2R1bGUgaXMgbm90IHByZXNlbnQuCisKK1N1Z2dlc3RlZCB1c2FnZSBpczo6CisKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB0aHJlYWQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGltcG9ydCBkdW1teV90aHJlYWQgYXMgdGhyZWFkCisKKyIiIgorIyBFeHBvcnRzIG9ubHkgdGhpbmdzIHNwZWNpZmllZCBieSB0aHJlYWQgZG9jdW1lbnRhdGlvbjsKKyMgc2tpcHBpbmcgb2Jzb2xldGUgc3lub255bXMgYWxsb2NhdGUoKSwgc3RhcnRfbmV3KCksIGV4aXRfdGhyZWFkKCkuCitfX2FsbF9fID0gWydlcnJvcicsICdzdGFydF9uZXdfdGhyZWFkJywgJ2V4aXQnLCAnZ2V0X2lkZW50JywgJ2FsbG9jYXRlX2xvY2snLAorICAgICAgICAgICAnaW50ZXJydXB0X21haW4nLCAnTG9ja1R5cGUnXQorCitpbXBvcnQgdHJhY2ViYWNrIGFzIF90cmFjZWJhY2sKKworY2xhc3MgZXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJEdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aHJlYWQuZXJyb3IuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLmFyZ3MgPSBhcmdzCisKK2RlZiBzdGFydF9uZXdfdGhyZWFkKGZ1bmN0aW9uLCBhcmdzLCBrd2FyZ3M9e30pOgorICAgICIiIkR1bW15IGltcGxlbWVudGF0aW9uIG9mIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKCkuCisKKyAgICBDb21wYXRpYmlsaXR5IGlzIG1haW50YWluZWQgYnkgbWFraW5nIHN1cmUgdGhhdCBgYGFyZ3NgYCBpcyBhCisgICAgdHVwbGUgYW5kIGBga3dhcmdzYGAgaXMgYSBkaWN0aW9uYXJ5LiAgSWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZAorICAgIGFuZCBpdCBpcyBTeXN0ZW1FeGl0ICh3aGljaCBjYW4gYmUgZG9uZSBieSB0aHJlYWQuZXhpdCgpKSBpdCBpcworICAgIGNhdWdodCBhbmQgbm90aGluZyBpcyBkb25lOyBhbGwgb3RoZXIgZXhjZXB0aW9ucyBhcmUgcHJpbnRlZCBvdXQKKyAgICBieSB1c2luZyB0cmFjZWJhY2sucHJpbnRfZXhjKCkuCisKKyAgICBJZiB0aGUgZXhlY3V0ZWQgZnVuY3Rpb24gY2FsbHMgaW50ZXJydXB0X21haW4gdGhlIEtleWJvYXJkSW50ZXJydXB0IHdpbGwgYmUKKyAgICByYWlzZWQgd2hlbiB0aGUgZnVuY3Rpb24gcmV0dXJucy4KKworICAgICIiIgorICAgIGlmIHR5cGUoYXJncykgIT0gdHlwZSh0dXBsZSgpKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIybmQgYXJnIG11c3QgYmUgYSB0dXBsZSIpCisgICAgaWYgdHlwZShrd2FyZ3MpICE9IHR5cGUoZGljdCgpKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIzcmQgYXJnIG11c3QgYmUgYSBkaWN0IikKKyAgICBnbG9iYWwgX21haW4KKyAgICBfbWFpbiA9IEZhbHNlCisgICAgdHJ5OgorICAgICAgICBmdW5jdGlvbigqYXJncywgKiprd2FyZ3MpCisgICAgZXhjZXB0IFN5c3RlbUV4aXQ6CisgICAgICAgIHBhc3MKKyAgICBleGNlcHQ6CisgICAgICAgIF90cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICBfbWFpbiA9IFRydWUKKyAgICBnbG9iYWwgX2ludGVycnVwdAorICAgIGlmIF9pbnRlcnJ1cHQ6CisgICAgICAgIF9pbnRlcnJ1cHQgPSBGYWxzZQorICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAorCitkZWYgZXhpdCgpOgorICAgICIiIkR1bW15IGltcGxlbWVudGF0aW9uIG9mIHRocmVhZC5leGl0KCkuIiIiCisgICAgcmFpc2UgU3lzdGVtRXhpdAorCitkZWYgZ2V0X2lkZW50KCk6CisgICAgIiIiRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhyZWFkLmdldF9pZGVudCgpLgorCisgICAgU2luY2UgdGhpcyBtb2R1bGUgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRocmVhZG1vZHVsZSBpcyBub3QKKyAgICBhdmFpbGFibGUsIGl0IGlzIHNhZmUgdG8gYXNzdW1lIHRoYXQgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyB0aGUKKyAgICBvbmx5IHRocmVhZC4gIFRodXMgYSBjb25zdGFudCBjYW4gYmUgc2FmZWx5IHJldHVybmVkLgorICAgICIiIgorICAgIHJldHVybiAtMQorCitkZWYgYWxsb2NhdGVfbG9jaygpOgorICAgICIiIkR1bW15IGltcGxlbWVudGF0aW9uIG9mIHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkuIiIiCisgICAgcmV0dXJuIExvY2tUeXBlKCkKKworZGVmIHN0YWNrX3NpemUoc2l6ZT1Ob25lKToKKyAgICAiIiJEdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aHJlYWQuc3RhY2tfc2l6ZSgpLiIiIgorICAgIGlmIHNpemUgaXMgbm90IE5vbmU6CisgICAgICAgIHJhaXNlIGVycm9yKCJzZXR0aW5nIHRocmVhZCBzdGFjayBzaXplIG5vdCBzdXBwb3J0ZWQiKQorICAgIHJldHVybiAwCisKK2NsYXNzIExvY2tUeXBlKG9iamVjdCk6CisgICAgIiIiQ2xhc3MgaW1wbGVtZW50aW5nIGR1bW15IGltcGxlbWVudGF0aW9uIG9mIHRocmVhZC5Mb2NrVHlwZS4KKworICAgIENvbXBhdGliaWxpdHkgaXMgbWFpbnRhaW5lZCBieSBtYWludGFpbmluZyBzZWxmLmxvY2tlZF9zdGF0dXMKKyAgICB3aGljaCBpcyBhIGJvb2xlYW4gdGhhdCBzdG9yZXMgdGhlIHN0YXRlIG9mIHRoZSBsb2NrLiAgUGlja2xpbmcgb2YKKyAgICB0aGUgbG9jaywgdGhvdWdoLCBzaG91bGQgbm90IGJlIGRvbmUgc2luY2UgaWYgdGhlIHRocmVhZCBtb2R1bGUgaXMKKyAgICB0aGVuIHVzZWQgd2l0aCBhbiB1bnBpY2tsZWQgYGBsb2NrKClgYCBmcm9tIGhlcmUgcHJvYmxlbXMgY291bGQKKyAgICBvY2N1ciBmcm9tIHRoaXMgY2xhc3Mgbm90IGhhdmluZyBhdG9taWMgbWV0aG9kcy4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmxvY2tlZF9zdGF0dXMgPSBGYWxzZQorCisgICAgZGVmIGFjcXVpcmUoc2VsZiwgd2FpdGZsYWc9Tm9uZSk6CisgICAgICAgICIiIkR1bW15IGltcGxlbWVudGF0aW9uIG9mIGFjcXVpcmUoKS4KKworICAgICAgICBGb3IgYmxvY2tpbmcgY2FsbHMsIHNlbGYubG9ja2VkX3N0YXR1cyBpcyBhdXRvbWF0aWNhbGx5IHNldCB0bworICAgICAgICBUcnVlIGFuZCByZXR1cm5lZCBhcHByb3ByaWF0ZWx5IGJhc2VkIG9uIHZhbHVlIG9mCisgICAgICAgIGBgd2FpdGZsYWdgYC4gIElmIGl0IGlzIG5vbi1ibG9ja2luZywgdGhlbiB0aGUgdmFsdWUgaXMKKyAgICAgICAgYWN0dWFsbHkgY2hlY2tlZCBhbmQgbm90IHNldCBpZiBpdCBpcyBhbHJlYWR5IGFjcXVpcmVkLiAgVGhpcworICAgICAgICBpcyBhbGwgZG9uZSBzbyB0aGF0IHRocmVhZGluZy5Db25kaXRpb24ncyBhc3NlcnQgc3RhdGVtZW50cworICAgICAgICBhcmVuJ3QgdHJpZ2dlcmVkIGFuZCB0aHJvdyBhIGxpdHRsZSBmaXQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHdhaXRmbGFnIGlzIE5vbmUgb3Igd2FpdGZsYWc6CisgICAgICAgICAgICBzZWxmLmxvY2tlZF9zdGF0dXMgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IHNlbGYubG9ja2VkX3N0YXR1czoKKyAgICAgICAgICAgICAgICBzZWxmLmxvY2tlZF9zdGF0dXMgPSBUcnVlCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBfX2VudGVyX18gPSBhY3F1aXJlCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwLCB2YWwsIHRiKToKKyAgICAgICAgc2VsZi5yZWxlYXNlKCkKKworICAgIGRlZiByZWxlYXNlKHNlbGYpOgorICAgICAgICAiIiJSZWxlYXNlIHRoZSBkdW1teSBsb2NrLiIiIgorICAgICAgICAjIFhYWCBQZXJoYXBzIHNob3VsZG4ndCBhY3R1YWxseSBib3RoZXIgdG8gdGVzdD8gIENvdWxkIGxlYWQKKyAgICAgICAgIyAgICAgdG8gcHJvYmxlbXMgZm9yIGNvbXBsZXgsIHRocmVhZGVkIGNvZGUuCisgICAgICAgIGlmIG5vdCBzZWxmLmxvY2tlZF9zdGF0dXM6CisgICAgICAgICAgICByYWlzZSBlcnJvcgorICAgICAgICBzZWxmLmxvY2tlZF9zdGF0dXMgPSBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGxvY2tlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubG9ja2VkX3N0YXR1cworCisjIFVzZWQgdG8gc2lnbmFsIHRoYXQgaW50ZXJydXB0X21haW4gd2FzIGNhbGxlZCBpbiBhICJ0aHJlYWQiCitfaW50ZXJydXB0ID0gRmFsc2UKKyMgVHJ1ZSB3aGVuIG5vdCBleGVjdXRpbmcgaW4gYSAidGhyZWFkIgorX21haW4gPSBUcnVlCisKK2RlZiBpbnRlcnJ1cHRfbWFpbigpOgorICAgICIiIlNldCBfaW50ZXJydXB0IGZsYWcgdG8gVHJ1ZSB0byBoYXZlIHN0YXJ0X25ld190aHJlYWQgcmFpc2UKKyAgICBLZXlib2FyZEludGVycnVwdCB1cG9uIGV4aXRpbmcuIiIiCisgICAgaWYgX21haW46CisgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgZWxzZToKKyAgICAgICAgZ2xvYmFsIF9pbnRlcnJ1cHQKKyAgICAgICAgX2ludGVycnVwdCA9IFRydWUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZHVtbXlfdGhyZWFkLnB5YyBiL2xpYi9weXRob24yLjcvZHVtbXlfdGhyZWFkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTViY2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZHVtbXlfdGhyZWFkLnB5byBiL2xpYi9weXRob24yLjcvZHVtbXlfdGhyZWFkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTViY2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZHVtbXlfdGhyZWFkaW5nLnB5IGIvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWRpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwMjhhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZHVtbXlfdGhyZWFkaW5nLnB5CkBAIC0wLDAgKzEsNzggQEAKKyIiIkZhdXggYGB0aHJlYWRpbmdgYCB2ZXJzaW9uIHVzaW5nIGBgZHVtbXlfdGhyZWFkYGAgaW5zdGVhZCBvZiBgYHRocmVhZGBgLgorCitUaGUgbW9kdWxlIGBgX2R1bW15X3RocmVhZGluZ2BgIGlzIGFkZGVkIHRvIGBgc3lzLm1vZHVsZXNgYCBpbiBvcmRlcgordG8gbm90IGhhdmUgYGB0aHJlYWRpbmdgYCBjb25zaWRlcmVkIGltcG9ydGVkLiAgSGFkIGBgdGhyZWFkaW5nYGAgYmVlbgorZGlyZWN0bHkgaW1wb3J0ZWQgaXQgd291bGQgaGF2ZSBtYWRlIGFsbCBzdWJzZXF1ZW50IGltcG9ydHMgc3VjY2VlZAorcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGBgdGhyZWFkYGAgd2FzIGF2YWlsYWJsZSB3aGljaCBpcyBub3QgZGVzaXJlZC4KKworIiIiCitmcm9tIHN5cyBpbXBvcnQgbW9kdWxlcyBhcyBzeXNfbW9kdWxlcworCitpbXBvcnQgZHVtbXlfdGhyZWFkCisKKyMgRGVjbGFyaW5nIG5vdyBzbyBhcyB0byBub3QgaGF2ZSB0byBuZXN0IGBgdHJ5YGBzIHRvIGdldCBwcm9wZXIgY2xlYW4tdXAuCitob2xkaW5nX3RocmVhZCA9IEZhbHNlCitob2xkaW5nX3RocmVhZGluZyA9IEZhbHNlCitob2xkaW5nX190aHJlYWRpbmdfbG9jYWwgPSBGYWxzZQorCit0cnk6CisgICAgIyBDb3VsZCBoYXZlIGNoZWNrZWQgaWYgYGB0aHJlYWRgYCB3YXMgbm90IGluIHN5cy5tb2R1bGVzIGFuZCBnb25lCisgICAgIyBhIGRpZmZlcmVudCByb3V0ZSwgYnV0IGRlY2lkZWQgdG8gbWlycm9yIHRlY2huaXF1ZSB1c2VkIHdpdGgKKyAgICAjIGBgdGhyZWFkaW5nYGAgYmVsb3cuCisgICAgaWYgJ3RocmVhZCcgaW4gc3lzX21vZHVsZXM6CisgICAgICAgIGhlbGRfdGhyZWFkID0gc3lzX21vZHVsZXNbJ3RocmVhZCddCisgICAgICAgIGhvbGRpbmdfdGhyZWFkID0gVHJ1ZQorICAgICMgTXVzdCBoYXZlIHNvbWUgbW9kdWxlIG5hbWVkIGBgdGhyZWFkYGAgdGhhdCBpbXBsZW1lbnRzIGl0cyBBUEkKKyAgICAjIGluIG9yZGVyIHRvIGluaXRpYWxseSBpbXBvcnQgYGB0aHJlYWRpbmdgYC4KKyAgICBzeXNfbW9kdWxlc1sndGhyZWFkJ10gPSBzeXNfbW9kdWxlc1snZHVtbXlfdGhyZWFkJ10KKworICAgIGlmICd0aHJlYWRpbmcnIGluIHN5c19tb2R1bGVzOgorICAgICAgICAjIElmIGBgdGhyZWFkaW5nYGAgaXMgYWxyZWFkeSBpbXBvcnRlZCwgbWlnaHQgYXMgd2VsbCBwcmV2ZW50CisgICAgICAgICMgdHJ5aW5nIHRvIGltcG9ydCBpdCBtb3JlIHRoYW4gbmVlZGVkIGJ5IHNhdmluZyBpdCBpZiBpdCBpcworICAgICAgICAjIGFscmVhZHkgaW1wb3J0ZWQgYmVmb3JlIGRlbGV0aW5nIGl0LgorICAgICAgICBoZWxkX3RocmVhZGluZyA9IHN5c19tb2R1bGVzWyd0aHJlYWRpbmcnXQorICAgICAgICBob2xkaW5nX3RocmVhZGluZyA9IFRydWUKKyAgICAgICAgZGVsIHN5c19tb2R1bGVzWyd0aHJlYWRpbmcnXQorCisgICAgaWYgJ190aHJlYWRpbmdfbG9jYWwnIGluIHN5c19tb2R1bGVzOgorICAgICAgICAjIElmIGBgX3RocmVhZGluZ19sb2NhbGBgIGlzIGFscmVhZHkgaW1wb3J0ZWQsIG1pZ2h0IGFzIHdlbGwgcHJldmVudAorICAgICAgICAjIHRyeWluZyB0byBpbXBvcnQgaXQgbW9yZSB0aGFuIG5lZWRlZCBieSBzYXZpbmcgaXQgaWYgaXQgaXMKKyAgICAgICAgIyBhbHJlYWR5IGltcG9ydGVkIGJlZm9yZSBkZWxldGluZyBpdC4KKyAgICAgICAgaGVsZF9fdGhyZWFkaW5nX2xvY2FsID0gc3lzX21vZHVsZXNbJ190aHJlYWRpbmdfbG9jYWwnXQorICAgICAgICBob2xkaW5nX190aHJlYWRpbmdfbG9jYWwgPSBUcnVlCisgICAgICAgIGRlbCBzeXNfbW9kdWxlc1snX3RocmVhZGluZ19sb2NhbCddCisKKyAgICBpbXBvcnQgdGhyZWFkaW5nCisgICAgIyBOZWVkIGEgY29weSBvZiB0aGUgY29kZSBrZXB0IHNvbWV3aGVyZS4uLgorICAgIHN5c19tb2R1bGVzWydfZHVtbXlfdGhyZWFkaW5nJ10gPSBzeXNfbW9kdWxlc1sndGhyZWFkaW5nJ10KKyAgICBkZWwgc3lzX21vZHVsZXNbJ3RocmVhZGluZyddCisgICAgc3lzX21vZHVsZXNbJ19kdW1teV9fdGhyZWFkaW5nX2xvY2FsJ10gPSBzeXNfbW9kdWxlc1snX3RocmVhZGluZ19sb2NhbCddCisgICAgZGVsIHN5c19tb2R1bGVzWydfdGhyZWFkaW5nX2xvY2FsJ10KKyAgICBmcm9tIF9kdW1teV90aHJlYWRpbmcgaW1wb3J0ICoKKyAgICBmcm9tIF9kdW1teV90aHJlYWRpbmcgaW1wb3J0IF9fYWxsX18KKworZmluYWxseToKKyAgICAjIFB1dCBiYWNrIGBgdGhyZWFkaW5nYGAgaWYgd2Ugb3Zlcndyb3RlIGVhcmxpZXIKKworICAgIGlmIGhvbGRpbmdfdGhyZWFkaW5nOgorICAgICAgICBzeXNfbW9kdWxlc1sndGhyZWFkaW5nJ10gPSBoZWxkX3RocmVhZGluZworICAgICAgICBkZWwgaGVsZF90aHJlYWRpbmcKKyAgICBkZWwgaG9sZGluZ190aHJlYWRpbmcKKworICAgICMgUHV0IGJhY2sgYGBfdGhyZWFkaW5nX2xvY2FsYGAgaWYgd2Ugb3Zlcndyb3RlIGVhcmxpZXIKKworICAgIGlmIGhvbGRpbmdfX3RocmVhZGluZ19sb2NhbDoKKyAgICAgICAgc3lzX21vZHVsZXNbJ190aHJlYWRpbmdfbG9jYWwnXSA9IGhlbGRfX3RocmVhZGluZ19sb2NhbAorICAgICAgICBkZWwgaGVsZF9fdGhyZWFkaW5nX2xvY2FsCisgICAgZGVsIGhvbGRpbmdfX3RocmVhZGluZ19sb2NhbAorCisgICAgIyBQdXQgYmFjayBgYHRocmVhZGBgIGlmIHdlIG92ZXJ3cm90ZSwgZWxzZSBkZWwgdGhlIGVudHJ5IHdlIG1hZGUKKyAgICBpZiBob2xkaW5nX3RocmVhZDoKKyAgICAgICAgc3lzX21vZHVsZXNbJ3RocmVhZCddID0gaGVsZF90aHJlYWQKKyAgICAgICAgZGVsIGhlbGRfdGhyZWFkCisgICAgZWxzZToKKyAgICAgICAgZGVsIHN5c19tb2R1bGVzWyd0aHJlYWQnXQorICAgIGRlbCBob2xkaW5nX3RocmVhZAorCisgICAgZGVsIGR1bW15X3RocmVhZAorICAgIGRlbCBzeXNfbW9kdWxlcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWRpbmcucHljIGIvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWRpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZGI0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2R1bW15X3RocmVhZGluZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWRpbmcucHlvIGIvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWRpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZGI0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2R1bW15X3RocmVhZGluZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvZW1haWwvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4MGViZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvX19pbml0X18ucHkKQEAgLTAsMCArMSwxMjMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQSBwYWNrYWdlIGZvciBwYXJzaW5nLCBoYW5kbGluZywgYW5kIGdlbmVyYXRpbmcgZW1haWwgbWVzc2FnZXMuIiIiCisKK19fdmVyc2lvbl9fID0gJzQuMC4zJworCitfX2FsbF9fID0gWworICAgICMgT2xkIG5hbWVzCisgICAgJ2Jhc2U2NE1JTUUnLAorICAgICdDaGFyc2V0JywKKyAgICAnRW5jb2RlcnMnLAorICAgICdFcnJvcnMnLAorICAgICdHZW5lcmF0b3InLAorICAgICdIZWFkZXInLAorICAgICdJdGVyYXRvcnMnLAorICAgICdNZXNzYWdlJywKKyAgICAnTUlNRUF1ZGlvJywKKyAgICAnTUlNRUJhc2UnLAorICAgICdNSU1FSW1hZ2UnLAorICAgICdNSU1FTWVzc2FnZScsCisgICAgJ01JTUVNdWx0aXBhcnQnLAorICAgICdNSU1FTm9uTXVsdGlwYXJ0JywKKyAgICAnTUlNRVRleHQnLAorICAgICdQYXJzZXInLAorICAgICdxdW9wcmlNSU1FJywKKyAgICAnVXRpbHMnLAorICAgICdtZXNzYWdlX2Zyb21fc3RyaW5nJywKKyAgICAnbWVzc2FnZV9mcm9tX2ZpbGUnLAorICAgICMgbmV3IG5hbWVzCisgICAgJ2Jhc2U2NG1pbWUnLAorICAgICdjaGFyc2V0JywKKyAgICAnZW5jb2RlcnMnLAorICAgICdlcnJvcnMnLAorICAgICdnZW5lcmF0b3InLAorICAgICdoZWFkZXInLAorICAgICdpdGVyYXRvcnMnLAorICAgICdtZXNzYWdlJywKKyAgICAnbWltZScsCisgICAgJ3BhcnNlcicsCisgICAgJ3F1b3ByaW1pbWUnLAorICAgICd1dGlscycsCisgICAgXQorCisKKwwKKyMgU29tZSBjb252ZW5pZW5jZSByb3V0aW5lcy4gIERvbid0IGltcG9ydCBQYXJzZXIgYW5kIE1lc3NhZ2UgYXMgc2lkZS1lZmZlY3RzCisjIG9mIGltcG9ydGluZyBlbWFpbCBzaW5jZSB0aG9zZSBjYXNjYWRpbmdseSBpbXBvcnQgbW9zdCBvZiB0aGUgcmVzdCBvZiB0aGUKKyMgZW1haWwgcGFja2FnZS4KK2RlZiBtZXNzYWdlX2Zyb21fc3RyaW5nKHMsICphcmdzLCAqKmt3cyk6CisgICAgIiIiUGFyc2UgYSBzdHJpbmcgaW50byBhIE1lc3NhZ2Ugb2JqZWN0IG1vZGVsLgorCisgICAgT3B0aW9uYWwgX2NsYXNzIGFuZCBzdHJpY3QgYXJlIHBhc3NlZCB0byB0aGUgUGFyc2VyIGNvbnN0cnVjdG9yLgorICAgICIiIgorICAgIGZyb20gZW1haWwucGFyc2VyIGltcG9ydCBQYXJzZXIKKyAgICByZXR1cm4gUGFyc2VyKCphcmdzLCAqKmt3cykucGFyc2VzdHIocykKKworCitkZWYgbWVzc2FnZV9mcm9tX2ZpbGUoZnAsICphcmdzLCAqKmt3cyk6CisgICAgIiIiUmVhZCBhIGZpbGUgYW5kIHBhcnNlIGl0cyBjb250ZW50cyBpbnRvIGEgTWVzc2FnZSBvYmplY3QgbW9kZWwuCisKKyAgICBPcHRpb25hbCBfY2xhc3MgYW5kIHN0cmljdCBhcmUgcGFzc2VkIHRvIHRoZSBQYXJzZXIgY29uc3RydWN0b3IuCisgICAgIiIiCisgICAgZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IFBhcnNlcgorICAgIHJldHVybiBQYXJzZXIoKmFyZ3MsICoqa3dzKS5wYXJzZShmcCkKKworCisMCisjIExhenkgbG9hZGluZyB0byBwcm92aWRlIG5hbWUgbWFwcGluZyBmcm9tIG5ldy1zdHlsZSBuYW1lcyAoUEVQIDggY29tcGF0aWJsZQorIyBlbWFpbCA0LjAgbW9kdWxlIG5hbWVzKSwgdG8gb2xkLXN0eWxlIG5hbWVzIChlbWFpbCAzLjAgbW9kdWxlIG5hbWVzKS4KK2ltcG9ydCBzeXMKKworY2xhc3MgTGF6eUltcG9ydGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZV9uYW1lKToKKyAgICAgICAgc2VsZi5fX25hbWVfXyA9ICdlbWFpbC4nICsgbW9kdWxlX25hbWUKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgX19pbXBvcnRfXyhzZWxmLl9fbmFtZV9fKQorICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1tzZWxmLl9fbmFtZV9fXQorICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShtb2QuX19kaWN0X18pCisgICAgICAgIHJldHVybiBnZXRhdHRyKG1vZCwgbmFtZSkKKworCitfTE9XRVJOQU1FUyA9IFsKKyAgICAjIGVtYWlsLjxvbGQgbmFtZT4gLT4gZW1haWwuPG5ldyBuYW1lIGlzIGxvd2VyY2FzZWQgb2xkIG5hbWU+CisgICAgJ0NoYXJzZXQnLAorICAgICdFbmNvZGVycycsCisgICAgJ0Vycm9ycycsCisgICAgJ0ZlZWRQYXJzZXInLAorICAgICdHZW5lcmF0b3InLAorICAgICdIZWFkZXInLAorICAgICdJdGVyYXRvcnMnLAorICAgICdNZXNzYWdlJywKKyAgICAnUGFyc2VyJywKKyAgICAnVXRpbHMnLAorICAgICdiYXNlNjRNSU1FJywKKyAgICAncXVvcHJpTUlNRScsCisgICAgXQorCitfTUlNRU5BTUVTID0gWworICAgICMgZW1haWwuTUlNRTxvbGQgbmFtZT4gLT4gZW1haWwubWltZS48bmV3IG5hbWUgaXMgbG93ZXJjYXNlZCBvbGQgbmFtZT4KKyAgICAnQXVkaW8nLAorICAgICdCYXNlJywKKyAgICAnSW1hZ2UnLAorICAgICdNZXNzYWdlJywKKyAgICAnTXVsdGlwYXJ0JywKKyAgICAnTm9uTXVsdGlwYXJ0JywKKyAgICAnVGV4dCcsCisgICAgXQorCitmb3IgX25hbWUgaW4gX0xPV0VSTkFNRVM6CisgICAgaW1wb3J0ZXIgPSBMYXp5SW1wb3J0ZXIoX25hbWUubG93ZXIoKSkKKyAgICBzeXMubW9kdWxlc1snZW1haWwuJyArIF9uYW1lXSA9IGltcG9ydGVyCisgICAgc2V0YXR0cihzeXMubW9kdWxlc1snZW1haWwnXSwgX25hbWUsIGltcG9ydGVyKQorCisKK2ltcG9ydCBlbWFpbC5taW1lCitmb3IgX25hbWUgaW4gX01JTUVOQU1FUzoKKyAgICBpbXBvcnRlciA9IExhenlJbXBvcnRlcignbWltZS4nICsgX25hbWUubG93ZXIoKSkKKyAgICBzeXMubW9kdWxlc1snZW1haWwuTUlNRScgKyBfbmFtZV0gPSBpbXBvcnRlcgorICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbJ2VtYWlsJ10sICdNSU1FJyArIF9uYW1lLCBpbXBvcnRlcikKKyAgICBzZXRhdHRyKHN5cy5tb2R1bGVzWydlbWFpbC5taW1lJ10sIF9uYW1lLCBpbXBvcnRlcikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzZjk2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzZjk2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvX3BhcnNlYWRkci5weSBiL2xpYi9weXRob24yLjcvZW1haWwvX3BhcnNlYWRkci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTBkYjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9fcGFyc2VhZGRyLnB5CkBAIC0wLDAgKzEsNDk3IEBACisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA3IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkVtYWlsIGFkZHJlc3MgcGFyc2luZyBjb2RlLgorCitMaWZ0ZWQgZGlyZWN0bHkgZnJvbSByZmM4MjIucHkuICBUaGlzIHNob3VsZCBldmVudHVhbGx5IGJlIHJld3JpdHRlbi4KKyIiIgorCitfX2FsbF9fID0gWworICAgICdta3RpbWVfdHonLAorICAgICdwYXJzZWRhdGUnLAorICAgICdwYXJzZWRhdGVfdHonLAorICAgICdxdW90ZScsCisgICAgXQorCitpbXBvcnQgdGltZSwgY2FsZW5kYXIKKworU1BBQ0UgPSAnICcKK0VNUFRZU1RSSU5HID0gJycKK0NPTU1BU1BBQ0UgPSAnLCAnCisKKyMgUGFyc2UgYSBkYXRlIGZpZWxkCitfbW9udGhuYW1lcyA9IFsnamFuJywgJ2ZlYicsICdtYXInLCAnYXByJywgJ21heScsICdqdW4nLCAnanVsJywKKyAgICAgICAgICAgICAgICdhdWcnLCAnc2VwJywgJ29jdCcsICdub3YnLCAnZGVjJywKKyAgICAgICAgICAgICAgICdqYW51YXJ5JywgJ2ZlYnJ1YXJ5JywgJ21hcmNoJywgJ2FwcmlsJywgJ21heScsICdqdW5lJywgJ2p1bHknLAorICAgICAgICAgICAgICAgJ2F1Z3VzdCcsICdzZXB0ZW1iZXInLCAnb2N0b2JlcicsICdub3ZlbWJlcicsICdkZWNlbWJlciddCisKK19kYXluYW1lcyA9IFsnbW9uJywgJ3R1ZScsICd3ZWQnLCAndGh1JywgJ2ZyaScsICdzYXQnLCAnc3VuJ10KKworIyBUaGUgdGltZXpvbmUgdGFibGUgZG9lcyBub3QgaW5jbHVkZSB0aGUgbWlsaXRhcnkgdGltZSB6b25lcyBkZWZpbmVkCisjIGluIFJGQzgyMiwgb3RoZXIgdGhhbiBaLiAgQWNjb3JkaW5nIHRvIFJGQzExMjMsIHRoZSBkZXNjcmlwdGlvbiBpbgorIyBSRkM4MjIgZ2V0cyB0aGUgc2lnbnMgd3JvbmcsIHNvIHdlIGNhbid0IHJlbHkgb24gYW55IHN1Y2ggdGltZQorIyB6b25lcy4gIFJGQzExMjMgcmVjb21tZW5kcyB0aGF0IG51bWVyaWMgdGltZXpvbmUgaW5kaWNhdG9ycyBiZSB1c2VkCisjIGluc3RlYWQgb2YgdGltZXpvbmUgbmFtZXMuCisKK190aW1lem9uZXMgPSB7J1VUJzowLCAnVVRDJzowLCAnR01UJzowLCAnWic6MCwKKyAgICAgICAgICAgICAgJ0FTVCc6IC00MDAsICdBRFQnOiAtMzAwLCAgIyBBdGxhbnRpYyAodXNlZCBpbiBDYW5hZGEpCisgICAgICAgICAgICAgICdFU1QnOiAtNTAwLCAnRURUJzogLTQwMCwgICMgRWFzdGVybgorICAgICAgICAgICAgICAnQ1NUJzogLTYwMCwgJ0NEVCc6IC01MDAsICAjIENlbnRyYWwKKyAgICAgICAgICAgICAgJ01TVCc6IC03MDAsICdNRFQnOiAtNjAwLCAgIyBNb3VudGFpbgorICAgICAgICAgICAgICAnUFNUJzogLTgwMCwgJ1BEVCc6IC03MDAgICAjIFBhY2lmaWMKKyAgICAgICAgICAgICAgfQorCisKK2RlZiBwYXJzZWRhdGVfdHooZGF0YSk6CisgICAgIiIiQ29udmVydCBhIGRhdGUgc3RyaW5nIHRvIGEgdGltZSB0dXBsZS4KKworICAgIEFjY291bnRzIGZvciBtaWxpdGFyeSB0aW1lem9uZXMuCisgICAgIiIiCisgICAgZGF0YSA9IGRhdGEuc3BsaXQoKQorICAgICMgVGhlIEZXUyBhZnRlciB0aGUgY29tbWEgYWZ0ZXIgdGhlIGRheS1vZi13ZWVrIGlzIG9wdGlvbmFsLCBzbyBzZWFyY2ggYW5kCisgICAgIyBhZGp1c3QgZm9yIHRoaXMuCisgICAgaWYgZGF0YVswXS5lbmRzd2l0aCgnLCcpIG9yIGRhdGFbMF0ubG93ZXIoKSBpbiBfZGF5bmFtZXM6CisgICAgICAgICMgVGhlcmUncyBhIGRheW5hbWUgaGVyZS4gU2tpcCBpdAorICAgICAgICBkZWwgZGF0YVswXQorICAgIGVsc2U6CisgICAgICAgIGkgPSBkYXRhWzBdLnJmaW5kKCcsJykKKyAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgZGF0YVswXSA9IGRhdGFbMF1baSsxOl0KKyAgICBpZiBsZW4oZGF0YSkgPT0gMzogIyBSRkMgODUwIGRhdGUsIGRlcHJlY2F0ZWQKKyAgICAgICAgc3R1ZmYgPSBkYXRhWzBdLnNwbGl0KCctJykKKyAgICAgICAgaWYgbGVuKHN0dWZmKSA9PSAzOgorICAgICAgICAgICAgZGF0YSA9IHN0dWZmICsgZGF0YVsxOl0KKyAgICBpZiBsZW4oZGF0YSkgPT0gNDoKKyAgICAgICAgcyA9IGRhdGFbM10KKyAgICAgICAgaSA9IHMuZmluZCgnKycpCisgICAgICAgIGlmIGkgPiAwOgorICAgICAgICAgICAgZGF0YVszOl0gPSBbc1s6aV0sIHNbaSsxOl1dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhLmFwcGVuZCgnJykgIyBEdW1teSB0egorICAgIGlmIGxlbihkYXRhKSA8IDU6CisgICAgICAgIHJldHVybiBOb25lCisgICAgZGF0YSA9IGRhdGFbOjVdCisgICAgW2RkLCBtbSwgeXksIHRtLCB0el0gPSBkYXRhCisgICAgbW0gPSBtbS5sb3dlcigpCisgICAgaWYgbW0gbm90IGluIF9tb250aG5hbWVzOgorICAgICAgICBkZCwgbW0gPSBtbSwgZGQubG93ZXIoKQorICAgICAgICBpZiBtbSBub3QgaW4gX21vbnRobmFtZXM6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgIG1tID0gX21vbnRobmFtZXMuaW5kZXgobW0pICsgMQorICAgIGlmIG1tID4gMTI6CisgICAgICAgIG1tIC09IDEyCisgICAgaWYgZGRbLTFdID09ICcsJzoKKyAgICAgICAgZGQgPSBkZFs6LTFdCisgICAgaSA9IHl5LmZpbmQoJzonKQorICAgIGlmIGkgPiAwOgorICAgICAgICB5eSwgdG0gPSB0bSwgeXkKKyAgICBpZiB5eVstMV0gPT0gJywnOgorICAgICAgICB5eSA9IHl5WzotMV0KKyAgICBpZiBub3QgeXlbMF0uaXNkaWdpdCgpOgorICAgICAgICB5eSwgdHogPSB0eiwgeXkKKyAgICBpZiB0bVstMV0gPT0gJywnOgorICAgICAgICB0bSA9IHRtWzotMV0KKyAgICB0bSA9IHRtLnNwbGl0KCc6JykKKyAgICBpZiBsZW4odG0pID09IDI6CisgICAgICAgIFt0aGgsIHRtbV0gPSB0bQorICAgICAgICB0c3MgPSAnMCcKKyAgICBlbGlmIGxlbih0bSkgPT0gMzoKKyAgICAgICAgW3RoaCwgdG1tLCB0c3NdID0gdG0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHRyeToKKyAgICAgICAgeXkgPSBpbnQoeXkpCisgICAgICAgIGRkID0gaW50KGRkKQorICAgICAgICB0aGggPSBpbnQodGhoKQorICAgICAgICB0bW0gPSBpbnQodG1tKQorICAgICAgICB0c3MgPSBpbnQodHNzKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorICAgICMgQ2hlY2sgZm9yIGEgeXkgc3BlY2lmaWVkIGluIHR3by1kaWdpdCBmb3JtYXQsIHRoZW4gY29udmVydCBpdCB0byB0aGUKKyAgICAjIGFwcHJvcHJpYXRlIGZvdXItZGlnaXQgZm9ybWF0LCBhY2NvcmRpbmcgdG8gdGhlIFBPU0lYIHN0YW5kYXJkLiBSRkMgODIyCisgICAgIyBjYWxscyBmb3IgYSB0d28tZGlnaXQgeXksIGJ1dCBSRkMgMjgyMiAod2hpY2ggb2Jzb2xldGVzIFJGQyA4MjIpCisgICAgIyBtYW5kYXRlcyBhIDQtZGlnaXQgeXkuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yCisgICAgIyB0aGUgdGltZSBtb2R1bGUuCisgICAgaWYgeXkgPCAxMDA6CisgICAgICAgICMgVGhlIHllYXIgaXMgYmV0d2VlbiAxOTY5IGFuZCAxOTk5IChpbmNsdXNpdmUpLgorICAgICAgICBpZiB5eSA+IDY4OgorICAgICAgICAgICAgeXkgKz0gMTkwMAorICAgICAgICAjIFRoZSB5ZWFyIGlzIGJldHdlZW4gMjAwMCBhbmQgMjA2OCAoaW5jbHVzaXZlKS4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHl5ICs9IDIwMDAKKyAgICB0em9mZnNldCA9IE5vbmUKKyAgICB0eiA9IHR6LnVwcGVyKCkKKyAgICBpZiB0eiBpbiBfdGltZXpvbmVzOgorICAgICAgICB0em9mZnNldCA9IF90aW1lem9uZXNbdHpdCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHpvZmZzZXQgPSBpbnQodHopCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICMgQ29udmVydCBhIHRpbWV6b25lIG9mZnNldCBpbnRvIHNlY29uZHMgOyAtMDUwMCAtPiAtMTgwMDAKKyAgICBpZiB0em9mZnNldDoKKyAgICAgICAgaWYgdHpvZmZzZXQgPCAwOgorICAgICAgICAgICAgdHpzaWduID0gLTEKKyAgICAgICAgICAgIHR6b2Zmc2V0ID0gLXR6b2Zmc2V0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0enNpZ24gPSAxCisgICAgICAgIHR6b2Zmc2V0ID0gdHpzaWduICogKCAodHpvZmZzZXQvLzEwMCkqMzYwMCArICh0em9mZnNldCAlIDEwMCkqNjApCisgICAgIyBEYXlsaWdodCBTYXZpbmcgVGltZSBmbGFnIGlzIHNldCB0byAtMSwgc2luY2UgRFNUIGlzIHVua25vd24uCisgICAgcmV0dXJuIHl5LCBtbSwgZGQsIHRoaCwgdG1tLCB0c3MsIDAsIDEsIC0xLCB0em9mZnNldAorCisKK2RlZiBwYXJzZWRhdGUoZGF0YSk6CisgICAgIiIiQ29udmVydCBhIHRpbWUgc3RyaW5nIHRvIGEgdGltZSB0dXBsZS4iIiIKKyAgICB0ID0gcGFyc2VkYXRlX3R6KGRhdGEpCisgICAgaWYgaXNpbnN0YW5jZSh0LCB0dXBsZSk6CisgICAgICAgIHJldHVybiB0Wzo5XQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiB0CisKKworZGVmIG1rdGltZV90eihkYXRhKToKKyAgICAiIiJUdXJuIGEgMTAtdHVwbGUgYXMgcmV0dXJuZWQgYnkgcGFyc2VkYXRlX3R6KCkgaW50byBhIFBPU0lYIHRpbWVzdGFtcC4iIiIKKyAgICBpZiBkYXRhWzldIGlzIE5vbmU6CisgICAgICAgICMgTm8gem9uZSBpbmZvLCBzbyBsb2NhbHRpbWUgaXMgYmV0dGVyIGFzc3VtcHRpb24gdGhhbiBHTVQKKyAgICAgICAgcmV0dXJuIHRpbWUubWt0aW1lKGRhdGFbOjhdICsgKC0xLCkpCisgICAgZWxzZToKKyAgICAgICAgdCA9IGNhbGVuZGFyLnRpbWVnbShkYXRhKQorICAgICAgICByZXR1cm4gdCAtIGRhdGFbOV0KKworCitkZWYgcXVvdGUoc3RyKToKKyAgICAiIiJQcmVwYXJlIHN0cmluZyB0byBiZSB1c2VkIGluIGEgcXVvdGVkIHN0cmluZy4KKworICAgIFR1cm5zIGJhY2tzbGFzaCBhbmQgZG91YmxlIHF1b3RlIGNoYXJhY3RlcnMgaW50byBxdW90ZWQgcGFpcnMuICBUaGVzZQorICAgIGFyZSB0aGUgb25seSBjaGFyYWN0ZXJzIHRoYXQgbmVlZCB0byBiZSBxdW90ZWQgaW5zaWRlIGEgcXVvdGVkIHN0cmluZy4KKyAgICBEb2VzIG5vdCBhZGQgdGhlIHN1cnJvdW5kaW5nIGRvdWJsZSBxdW90ZXMuCisgICAgIiIiCisgICAgcmV0dXJuIHN0ci5yZXBsYWNlKCdcXCcsICdcXFxcJykucmVwbGFjZSgnIicsICdcXCInKQorCisKK2NsYXNzIEFkZHJsaXN0Q2xhc3M6CisgICAgIiIiQWRkcmVzcyBwYXJzZXIgY2xhc3MgYnkgQmVuIEVzY290by4KKworICAgIFRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGNsYXNzIGRvZXMsIGl0IGhlbHBzIHRvIGhhdmUgYSBjb3B5IG9mIFJGQyAyODIyIGluCisgICAgZnJvbnQgb2YgeW91LgorCisgICAgTm90ZTogdGhpcyBjbGFzcyBpbnRlcmZhY2UgaXMgZGVwcmVjYXRlZCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKyAgICBVc2UgcmZjODIyLkFkZHJlc3NMaXN0IGluc3RlYWQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmllbGQpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlLgorCisgICAgICAgIGBmaWVsZCcgaXMgYW4gdW5wYXJzZWQgYWRkcmVzcyBoZWFkZXIgZmllbGQsIGNvbnRhaW5pbmcKKyAgICAgICAgb25lIG9yIG1vcmUgYWRkcmVzc2VzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zcGVjaWFscyA9ICcoKTw+QCw6Oy5cIltdJworICAgICAgICBzZWxmLnBvcyA9IDAKKyAgICAgICAgc2VsZi5MV1MgPSAnIFx0JworICAgICAgICBzZWxmLkNSID0gJ1xyXG4nCisgICAgICAgIHNlbGYuRldTID0gc2VsZi5MV1MgKyBzZWxmLkNSCisgICAgICAgIHNlbGYuYXRvbWVuZHMgPSBzZWxmLnNwZWNpYWxzICsgc2VsZi5MV1MgKyBzZWxmLkNSCisgICAgICAgICMgTm90ZSB0aGF0IFJGQyAyODIyIG5vdyBzcGVjaWZpZXMgYC4nIGFzIG9icy1waHJhc2UsIG1lYW5pbmcgdGhhdCBpdAorICAgICAgICAjIGlzIG9ic29sZXRlIHN5bnRheC4gIFJGQyAyODIyIHJlcXVpcmVzIHRoYXQgd2UgcmVjb2duaXplIG9ic29sZXRlCisgICAgICAgICMgc3ludGF4LCBzbyBhbGxvdyBkb3RzIGluIHBocmFzZXMuCisgICAgICAgIHNlbGYucGhyYXNlZW5kcyA9IHNlbGYuYXRvbWVuZHMucmVwbGFjZSgnLicsICcnKQorICAgICAgICBzZWxmLmZpZWxkID0gZmllbGQKKyAgICAgICAgc2VsZi5jb21tZW50bGlzdCA9IFtdCisKKyAgICBkZWYgZ290b25leHQoc2VsZik6CisgICAgICAgICIiIlBhcnNlIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBhZGRyZXNzLiIiIgorICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuTFdTICsgJ1xuXHInOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJygnOgorICAgICAgICAgICAgICAgIHNlbGYuY29tbWVudGxpc3QuYXBwZW5kKHNlbGYuZ2V0Y29tbWVudCgpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIGdldGFkZHJsaXN0KHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhbGwgYWRkcmVzc2VzLgorCisgICAgICAgIFJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBhZGRyZXNzZXMuCisgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGFkID0gc2VsZi5nZXRhZGRyZXNzKCkKKyAgICAgICAgICAgIGlmIGFkOgorICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCgnJywgJycpKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZ2V0YWRkcmVzcyhzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgdGhlIG5leHQgYWRkcmVzcy4iIiIKKyAgICAgICAgc2VsZi5jb21tZW50bGlzdCA9IFtdCisgICAgICAgIHNlbGYuZ290b25leHQoKQorCisgICAgICAgIG9sZHBvcyA9IHNlbGYucG9zCisgICAgICAgIG9sZGNsID0gc2VsZi5jb21tZW50bGlzdAorICAgICAgICBwbGlzdCA9IHNlbGYuZ2V0cGhyYXNlbGlzdCgpCisKKyAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisgICAgICAgIHJldHVybmxpc3QgPSBbXQorCisgICAgICAgIGlmIHNlbGYucG9zID49IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgICMgQmFkIGVtYWlsIGFkZHJlc3MgdGVjaG5pY2FsbHksIG5vIGRvbWFpbi4KKyAgICAgICAgICAgIGlmIHBsaXN0OgorICAgICAgICAgICAgICAgIHJldHVybmxpc3QgPSBbKFNQQUNFLmpvaW4oc2VsZi5jb21tZW50bGlzdCksIHBsaXN0WzBdKV0KKworICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluICcuQCc6CisgICAgICAgICAgICAjIGVtYWlsIGFkZHJlc3MgaXMganVzdCBhbiBhZGRyc3BlYworICAgICAgICAgICAgIyB0aGlzIGlzbid0IHZlcnkgZWZmaWNpZW50IHNpbmNlIHdlIHN0YXJ0IG92ZXIKKyAgICAgICAgICAgIHNlbGYucG9zID0gb2xkcG9zCisgICAgICAgICAgICBzZWxmLmNvbW1lbnRsaXN0ID0gb2xkY2wKKyAgICAgICAgICAgIGFkZHJzcGVjID0gc2VsZi5nZXRhZGRyc3BlYygpCisgICAgICAgICAgICByZXR1cm5saXN0ID0gWyhTUEFDRS5qb2luKHNlbGYuY29tbWVudGxpc3QpLCBhZGRyc3BlYyldCisKKyAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnOic6CisgICAgICAgICAgICAjIGFkZHJlc3MgaXMgYSBncm91cAorICAgICAgICAgICAgcmV0dXJubGlzdCA9IFtdCisKKyAgICAgICAgICAgIGZpZWxkbGVuID0gbGVuKHNlbGYuZmllbGQpCisgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnBvcyA8IGZpZWxkbGVuIGFuZCBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnOyc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICByZXR1cm5saXN0ID0gcmV0dXJubGlzdCArIHNlbGYuZ2V0YWRkcmVzcygpCisKKyAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnPCc6CisgICAgICAgICAgICAjIEFkZHJlc3MgaXMgYSBwaHJhc2UgdGhlbiBhIHJvdXRlIGFkZHIKKyAgICAgICAgICAgIHJvdXRlYWRkciA9IHNlbGYuZ2V0cm91dGVhZGRyKCkKKworICAgICAgICAgICAgaWYgc2VsZi5jb21tZW50bGlzdDoKKyAgICAgICAgICAgICAgICByZXR1cm5saXN0ID0gWyhTUEFDRS5qb2luKHBsaXN0KSArICcgKCcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgJy5qb2luKHNlbGYuY29tbWVudGxpc3QpICsgJyknLCByb3V0ZWFkZHIpXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm5saXN0ID0gWyhTUEFDRS5qb2luKHBsaXN0KSwgcm91dGVhZGRyKV0KKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgcGxpc3Q6CisgICAgICAgICAgICAgICAgcmV0dXJubGlzdCA9IFsoU1BBQ0Uuam9pbihzZWxmLmNvbW1lbnRsaXN0KSwgcGxpc3RbMF0pXQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLnNwZWNpYWxzOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKworICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgaWYgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCkgYW5kIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcsJzoKKyAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgcmV0dXJuIHJldHVybmxpc3QKKworICAgIGRlZiBnZXRyb3V0ZWFkZHIoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGEgcm91dGUgYWRkcmVzcyAoUmV0dXJuLXBhdGggdmFsdWUpLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGp1c3Qgc2tpcHMgYWxsIHRoZSByb3V0ZSBzdHVmZiBhbmQgcmV0dXJucyB0aGUgYWRkcnNwZWMuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSAhPSAnPCc6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBleHBlY3Ryb3V0ZSA9IEZhbHNlCisgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisgICAgICAgIGFkbGlzdCA9ICcnCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgZXhwZWN0cm91dGU6CisgICAgICAgICAgICAgICAgc2VsZi5nZXRkb21haW4oKQorICAgICAgICAgICAgICAgIGV4cGVjdHJvdXRlID0gRmFsc2UKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJz4nOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnQCc6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgICAgIGV4cGVjdHJvdXRlID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnOic6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhZGxpc3QgPSBzZWxmLmdldGFkZHJzcGVjKCkKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuZ290b25leHQoKQorCisgICAgICAgIHJldHVybiBhZGxpc3QKKworICAgIGRlZiBnZXRhZGRyc3BlYyhzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgYW4gUkZDIDI4MjIgYWRkci1zcGVjLiIiIgorICAgICAgICBhc2xpc3QgPSBbXQorCisgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcuJzoKKyAgICAgICAgICAgICAgICBhc2xpc3QuYXBwZW5kKCcuJykKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICciJzoKKyAgICAgICAgICAgICAgICBhc2xpc3QuYXBwZW5kKCciJXMiJyAlIHF1b3RlKHNlbGYuZ2V0cXVvdGUoKSkpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuYXRvbWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNsaXN0LmFwcGVuZChzZWxmLmdldGF0b20oKSkKKyAgICAgICAgICAgIHNlbGYuZ290b25leHQoKQorCisgICAgICAgIGlmIHNlbGYucG9zID49IGxlbihzZWxmLmZpZWxkKSBvciBzZWxmLmZpZWxkW3NlbGYucG9zXSAhPSAnQCc6CisgICAgICAgICAgICByZXR1cm4gRU1QVFlTVFJJTkcuam9pbihhc2xpc3QpCisKKyAgICAgICAgYXNsaXN0LmFwcGVuZCgnQCcpCisgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisgICAgICAgIHJldHVybiBFTVBUWVNUUklORy5qb2luKGFzbGlzdCkgKyBzZWxmLmdldGRvbWFpbigpCisKKyAgICBkZWYgZ2V0ZG9tYWluKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIGNvbXBsZXRlIGRvbWFpbiBuYW1lIGZyb20gYW4gYWRkcmVzcy4iIiIKKyAgICAgICAgc2RsaXN0ID0gW10KKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLkxXUzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcoJzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbW1lbnRsaXN0LmFwcGVuZChzZWxmLmdldGNvbW1lbnQoKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJ1snOgorICAgICAgICAgICAgICAgIHNkbGlzdC5hcHBlbmQoc2VsZi5nZXRkb21haW5saXRlcmFsKCkpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcuJzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICAgICAgc2RsaXN0LmFwcGVuZCgnLicpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuYXRvbWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2RsaXN0LmFwcGVuZChzZWxmLmdldGF0b20oKSkKKyAgICAgICAgcmV0dXJuIEVNUFRZU1RSSU5HLmpvaW4oc2RsaXN0KQorCisgICAgZGVmIGdldGRlbGltaXRlZChzZWxmLCBiZWdpbmNoYXIsIGVuZGNoYXJzLCBhbGxvd2NvbW1lbnRzPVRydWUpOgorICAgICAgICAiIiJQYXJzZSBhIGhlYWRlciBmcmFnbWVudCBkZWxpbWl0ZWQgYnkgc3BlY2lhbCBjaGFyYWN0ZXJzLgorCisgICAgICAgIGBiZWdpbmNoYXInIGlzIHRoZSBzdGFydCBjaGFyYWN0ZXIgZm9yIHRoZSBmcmFnbWVudC4KKyAgICAgICAgSWYgc2VsZiBpcyBub3QgbG9va2luZyBhdCBhbiBpbnN0YW5jZSBvZiBgYmVnaW5jaGFyJyB0aGVuCisgICAgICAgIGdldGRlbGltaXRlZCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuCisKKyAgICAgICAgYGVuZGNoYXJzJyBpcyBhIHNlcXVlbmNlIG9mIGFsbG93YWJsZSBlbmQtZGVsaW1pdGluZyBjaGFyYWN0ZXJzLgorICAgICAgICBQYXJzaW5nIHN0b3BzIHdoZW4gb25lIG9mIHRoZXNlIGlzIGVuY291bnRlcmVkLgorCisgICAgICAgIElmIGBhbGxvd2NvbW1lbnRzJyBpcyBub24temVybywgZW1iZWRkZWQgUkZDIDI4MjIgY29tbWVudHMgYXJlIGFsbG93ZWQKKyAgICAgICAgd2l0aGluIHRoZSBwYXJzZWQgZnJhZ21lbnQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSAhPSBiZWdpbmNoYXI6CisgICAgICAgICAgICByZXR1cm4gJycKKworICAgICAgICBzbGlzdCA9IFsnJ10KKyAgICAgICAgcXVvdGUgPSBGYWxzZQorICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgcXVvdGU6CisgICAgICAgICAgICAgICAgc2xpc3QuYXBwZW5kKHNlbGYuZmllbGRbc2VsZi5wb3NdKQorICAgICAgICAgICAgICAgIHF1b3RlID0gRmFsc2UKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gZW5kY2hhcnM6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIGFsbG93Y29tbWVudHMgYW5kIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcoJzoKKyAgICAgICAgICAgICAgICBzbGlzdC5hcHBlbmQoc2VsZi5nZXRjb21tZW50KCkpCisgICAgICAgICAgICAgICAgY29udGludWUgICAgICAgICMgaGF2ZSBhbHJlYWR5IGFkdmFuY2VkIHBvcyBmcm9tIGdldGNvbW1lbnQKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJ1xcJzoKKyAgICAgICAgICAgICAgICBxdW90ZSA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2xpc3QuYXBwZW5kKHNlbGYuZmllbGRbc2VsZi5wb3NdKQorICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorCisgICAgICAgIHJldHVybiBFTVBUWVNUUklORy5qb2luKHNsaXN0KQorCisgICAgZGVmIGdldHF1b3RlKHNlbGYpOgorICAgICAgICAiIiJHZXQgYSBxdW90ZS1kZWxpbWl0ZWQgZnJhZ21lbnQgZnJvbSBzZWxmJ3MgZmllbGQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldGRlbGltaXRlZCgnIicsICciXHInLCBGYWxzZSkKKworICAgIGRlZiBnZXRjb21tZW50KHNlbGYpOgorICAgICAgICAiIiJHZXQgYSBwYXJlbnRoZXNpcy1kZWxpbWl0ZWQgZnJhZ21lbnQgZnJvbSBzZWxmJ3MgZmllbGQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldGRlbGltaXRlZCgnKCcsICcpXHInLCBUcnVlKQorCisgICAgZGVmIGdldGRvbWFpbmxpdGVyYWwoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGFuIFJGQyAyODIyIGRvbWFpbi1saXRlcmFsLiIiIgorICAgICAgICByZXR1cm4gJ1slc10nICUgc2VsZi5nZXRkZWxpbWl0ZWQoJ1snLCAnXVxyJywgRmFsc2UpCisKKyAgICBkZWYgZ2V0YXRvbShzZWxmLCBhdG9tZW5kcz1Ob25lKToKKyAgICAgICAgIiIiUGFyc2UgYW4gUkZDIDI4MjIgYXRvbS4KKworICAgICAgICBPcHRpb25hbCBhdG9tZW5kcyBzcGVjaWZpZXMgYSBkaWZmZXJlbnQgc2V0IG9mIGVuZCB0b2tlbiBkZWxpbWl0ZXJzCisgICAgICAgICh0aGUgZGVmYXVsdCBpcyB0byB1c2Ugc2VsZi5hdG9tZW5kcykuICBUaGlzIGlzIHVzZWQgZS5nLiBpbgorICAgICAgICBnZXRwaHJhc2VsaXN0KCkgc2luY2UgcGhyYXNlIGVuZGluZ3MgbXVzdCBub3QgaW5jbHVkZSB0aGUgYC4nICh3aGljaAorICAgICAgICBpcyBsZWdhbCBpbiBwaHJhc2VzKS4iIiIKKyAgICAgICAgYXRvbWxpc3QgPSBbJyddCisgICAgICAgIGlmIGF0b21lbmRzIGlzIE5vbmU6CisgICAgICAgICAgICBhdG9tZW5kcyA9IHNlbGYuYXRvbWVuZHMKKworICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIGF0b21lbmRzOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGF0b21saXN0LmFwcGVuZChzZWxmLmZpZWxkW3NlbGYucG9zXSkKKyAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKworICAgICAgICByZXR1cm4gRU1QVFlTVFJJTkcuam9pbihhdG9tbGlzdCkKKworICAgIGRlZiBnZXRwaHJhc2VsaXN0KHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhIHNlcXVlbmNlIG9mIFJGQyAyODIyIHBocmFzZXMuCisKKyAgICAgICAgQSBwaHJhc2UgaXMgYSBzZXF1ZW5jZSBvZiB3b3Jkcywgd2hpY2ggYXJlIGluIHR1cm4gZWl0aGVyIFJGQyAyODIyCisgICAgICAgIGF0b21zIG9yIHF1b3RlZC1zdHJpbmdzLiAgUGhyYXNlcyBhcmUgY2Fub25pY2FsaXplZCBieSBzcXVlZXppbmcgYWxsCisgICAgICAgIHJ1bnMgb2YgY29udGludW91cyB3aGl0ZXNwYWNlIGludG8gb25lIHNwYWNlLgorICAgICAgICAiIiIKKyAgICAgICAgcGxpc3QgPSBbXQorCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5GV1M6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnIic6CisgICAgICAgICAgICAgICAgcGxpc3QuYXBwZW5kKHNlbGYuZ2V0cXVvdGUoKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJygnOgorICAgICAgICAgICAgICAgIHNlbGYuY29tbWVudGxpc3QuYXBwZW5kKHNlbGYuZ2V0Y29tbWVudCgpKQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLnBocmFzZWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGxpc3QuYXBwZW5kKHNlbGYuZ2V0YXRvbShzZWxmLnBocmFzZWVuZHMpKQorCisgICAgICAgIHJldHVybiBwbGlzdAorCitjbGFzcyBBZGRyZXNzTGlzdChBZGRybGlzdENsYXNzKToKKyAgICAiIiJBbiBBZGRyZXNzTGlzdCBlbmNhcHN1bGF0ZXMgYSBsaXN0IG9mIHBhcnNlZCBSRkMgMjgyMiBhZGRyZXNzZXMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpZWxkKToKKyAgICAgICAgQWRkcmxpc3RDbGFzcy5fX2luaXRfXyhzZWxmLCBmaWVsZCkKKyAgICAgICAgaWYgZmllbGQ6CisgICAgICAgICAgICBzZWxmLmFkZHJlc3NsaXN0ID0gc2VsZi5nZXRhZGRybGlzdCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFkZHJlc3NsaXN0ID0gW10KKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuYWRkcmVzc2xpc3QpCisKKyAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICMgU2V0IHVuaW9uCisgICAgICAgIG5ld2FkZHIgPSBBZGRyZXNzTGlzdChOb25lKQorICAgICAgICBuZXdhZGRyLmFkZHJlc3NsaXN0ID0gc2VsZi5hZGRyZXNzbGlzdFs6XQorICAgICAgICBmb3IgeCBpbiBvdGhlci5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCB4IGluIHNlbGYuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICAgICAgbmV3YWRkci5hZGRyZXNzbGlzdC5hcHBlbmQoeCkKKyAgICAgICAgcmV0dXJuIG5ld2FkZHIKKworICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICMgU2V0IHVuaW9uLCBpbi1wbGFjZQorICAgICAgICBmb3IgeCBpbiBvdGhlci5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCB4IGluIHNlbGYuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRyZXNzbGlzdC5hcHBlbmQoeCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIyBTZXQgZGlmZmVyZW5jZQorICAgICAgICBuZXdhZGRyID0gQWRkcmVzc0xpc3QoTm9uZSkKKyAgICAgICAgZm9yIHggaW4gc2VsZi5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCB4IGluIG90aGVyLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgICAgIG5ld2FkZHIuYWRkcmVzc2xpc3QuYXBwZW5kKHgpCisgICAgICAgIHJldHVybiBuZXdhZGRyCisKKyAgICBkZWYgX19pc3ViX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAjIFNldCBkaWZmZXJlbmNlLCBpbi1wbGFjZQorICAgICAgICBmb3IgeCBpbiBvdGhlci5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgIGlmIHggaW4gc2VsZi5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZHJlc3NsaXN0LnJlbW92ZSh4KQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgIyBNYWtlIGluZGV4aW5nLCBzbGljZXMsIGFuZCAnaW4nIHdvcmsKKyAgICAgICAgcmV0dXJuIHNlbGYuYWRkcmVzc2xpc3RbaW5kZXhdCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL19wYXJzZWFkZHIucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9fcGFyc2VhZGRyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmJmMjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9fcGFyc2VhZGRyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL19wYXJzZWFkZHIucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9fcGFyc2VhZGRyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmJmMjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9fcGFyc2VhZGRyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2Jhc2U2NG1pbWUucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL2Jhc2U2NG1pbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhODAwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvYmFzZTY0bWltZS5weQpAQCAtMCwwICsxLDE4MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJlbiBHZXJ0emZpZWxkCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkJhc2U2NCBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIHBlciBSRkNzIDIwNDUtMjA0Ny4KKworVGhpcyBtb2R1bGUgaGFuZGxlcyB0aGUgY29udGVudCB0cmFuc2ZlciBlbmNvZGluZyBtZXRob2QgZGVmaW5lZCBpbiBSRkMgMjA0NQordG8gZW5jb2RlIGFyYml0cmFyeSA4LWJpdCBkYXRhIHVzaW5nIHRoZSB0aHJlZSA4LWJpdCBieXRlcyBpbiBmb3VyIDctYml0CitjaGFyYWN0ZXJzIGVuY29kaW5nIGtub3duIGFzIEJhc2U2NC4KKworSXQgaXMgdXNlZCBpbiB0aGUgTUlNRSBzdGFuZGFyZHMgZm9yIGVtYWlsIHRvIGF0dGFjaCBpbWFnZXMsIGF1ZGlvLCBhbmQgdGV4dAordXNpbmcgc29tZSA4LWJpdCBjaGFyYWN0ZXIgc2V0cyB0byBtZXNzYWdlcy4KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGVuY29kZSBhbmQgZGVjb2RlIGJvdGggaGVhZGVycyBhbmQgYm9kaWVzCit3aXRoIEJhc2U2NCBlbmNvZGluZy4KKworUkZDIDIwNDUgZGVmaW5lcyBhIG1ldGhvZCBmb3IgaW5jbHVkaW5nIGNoYXJhY3RlciBzZXQgaW5mb3JtYXRpb24gaW4gYW4KK2BlbmNvZGVkLXdvcmQnIGluIGEgaGVhZGVyLiAgVGhpcyBtZXRob2QgaXMgY29tbW9ubHkgdXNlZCBmb3IgOC1iaXQgcmVhbCBuYW1lcworaW4gVG86LCBGcm9tOiwgQ2M6LCBldGMuIGZpZWxkcywgYXMgd2VsbCBhcyBTdWJqZWN0OiBsaW5lcy4KKworVGhpcyBtb2R1bGUgZG9lcyBub3QgZG8gdGhlIGxpbmUgd3JhcHBpbmcgb3IgZW5kLW9mLWxpbmUgY2hhcmFjdGVyIGNvbnZlcnNpb24KK25lY2Vzc2FyeSBmb3IgcHJvcGVyIGludGVybmF0aW9uYWxpemVkIGhlYWRlcnM7IGl0IG9ubHkgZG9lcyBkdW1iIGVuY29kaW5nIGFuZAorZGVjb2RpbmcuICBUbyBkZWFsIHdpdGggdGhlIHZhcmlvdXMgbGluZSB3cmFwcGluZyBpc3N1ZXMsIHVzZSB0aGUgZW1haWwuaGVhZGVyCittb2R1bGUuCisiIiIKKworX19hbGxfXyA9IFsKKyAgICAnYmFzZTY0X2xlbicsCisgICAgJ2JvZHlfZGVjb2RlJywKKyAgICAnYm9keV9lbmNvZGUnLAorICAgICdkZWNvZGUnLAorICAgICdkZWNvZGVzdHJpbmcnLAorICAgICdlbmNvZGUnLAorICAgICdlbmNvZGVzdHJpbmcnLAorICAgICdoZWFkZXJfZW5jb2RlJywKKyAgICBdCisKKworZnJvbSBiaW5hc2NpaSBpbXBvcnQgYjJhX2Jhc2U2NCwgYTJiX2Jhc2U2NAorZnJvbSBlbWFpbC51dGlscyBpbXBvcnQgZml4X2VvbHMKKworQ1JMRiA9ICdcclxuJworTkwgPSAnXG4nCitFTVBUWVNUUklORyA9ICcnCisKKyMgU2VlIGFsc28gQ2hhcnNldC5weQorTUlTQ19MRU4gPSA3CisKKworDAorIyBIZWxwZXJzCitkZWYgYmFzZTY0X2xlbihzKToKKyAgICAiIiJSZXR1cm4gdGhlIGxlbmd0aCBvZiBzIHdoZW4gaXQgaXMgZW5jb2RlZCB3aXRoIGJhc2U2NC4iIiIKKyAgICBncm91cHNfb2ZfMywgbGVmdG92ZXIgPSBkaXZtb2QobGVuKHMpLCAzKQorICAgICMgNCBieXRlcyBvdXQgZm9yIGVhY2ggMyBieXRlcyAob3Igbm9uemVybyBmcmFjdGlvbiB0aGVyZW9mKSBpbi4KKyAgICAjIFRoYW5rcywgVGltIQorICAgIG4gPSBncm91cHNfb2ZfMyAqIDQKKyAgICBpZiBsZWZ0b3ZlcjoKKyAgICAgICAgbiArPSA0CisgICAgcmV0dXJuIG4KKworCisMCitkZWYgaGVhZGVyX2VuY29kZShoZWFkZXIsIGNoYXJzZXQ9J2lzby04ODU5LTEnLCBrZWVwX2VvbHM9RmFsc2UsCisgICAgICAgICAgICAgICAgICBtYXhsaW5lbGVuPTc2LCBlb2w9TkwpOgorICAgICIiIkVuY29kZSBhIHNpbmdsZSBoZWFkZXIgbGluZSB3aXRoIEJhc2U2NCBlbmNvZGluZyBpbiBhIGdpdmVuIGNoYXJzZXQuCisKKyAgICBEZWZpbmVkIGluIFJGQyAyMDQ1LCB0aGlzIEJhc2U2NCBlbmNvZGluZyBpcyBpZGVudGljYWwgdG8gbm9ybWFsIEJhc2U2NAorICAgIGVuY29kaW5nLCBleGNlcHQgdGhhdCBlYWNoIGxpbmUgbXVzdCBiZSBpbnRlbGxpZ2VudGx5IHdyYXBwZWQgKHJlc3BlY3RpbmcKKyAgICB0aGUgQmFzZTY0IGVuY29kaW5nKSwgYW5kIHN1YnNlcXVlbnQgbGluZXMgbXVzdCBzdGFydCB3aXRoIGEgc3BhY2UuCisKKyAgICBjaGFyc2V0IG5hbWVzIHRoZSBjaGFyYWN0ZXIgc2V0IHRvIHVzZSB0byBlbmNvZGUgdGhlIGhlYWRlci4gIEl0IGRlZmF1bHRzCisgICAgdG8gaXNvLTg4NTktMS4KKworICAgIEVuZC1vZi1saW5lIGNoYXJhY3RlcnMgKFxcciwgXFxuLCBcXHJcXG4pIHdpbGwgYmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQKKyAgICB0byB0aGUgY2Fub25pY2FsIGVtYWlsIGxpbmUgc2VwYXJhdG9yIFxcclxcbiB1bmxlc3MgdGhlIGtlZXBfZW9scworICAgIHBhcmFtZXRlciBpcyBUcnVlICh0aGUgZGVmYXVsdCBpcyBGYWxzZSkuCisKKyAgICBFYWNoIGxpbmUgb2YgdGhlIGhlYWRlciB3aWxsIGJlIHRlcm1pbmF0ZWQgaW4gdGhlIHZhbHVlIG9mIGVvbCwgd2hpY2gKKyAgICBkZWZhdWx0cyB0byAiXFxuIi4gIFNldCB0aGlzIHRvICJcXHJcXG4iIGlmIHlvdSBhcmUgdXNpbmcgdGhlIHJlc3VsdCBvZgorICAgIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkgaW4gZW1haWwuCisKKyAgICBUaGUgcmVzdWx0aW5nIHN0cmluZyB3aWxsIGJlIGluIHRoZSBmb3JtOgorCisgICAgIj0/Y2hhcnNldD9iP1dXLzVjaUJ0WVhwNjZYTHJJSGY4ZWlCaElHaGhiWEJ6ZEdIdWNpQkJJRmx2K1hJZ2JXRjZldWx5Pz1cXG4KKyAgICAgID0/Y2hhcnNldD9iPzZ5QjMvSG9nWVNCb1lXMXdjM1JoN25JZ1FrTWdXVy81Y2lCdFlYcDY2WExySUhmOGVpQmhJR2hoPz0iCisKKyAgICB3aXRoIGVhY2ggbGluZSB3cmFwcGVkIGF0LCBhdCBtb3N0LCBtYXhsaW5lbGVuIGNoYXJhY3RlcnMgKGRlZmF1bHRzIHRvIDc2CisgICAgY2hhcmFjdGVycykuCisgICAgIiIiCisgICAgIyBSZXR1cm4gZW1wdHkgaGVhZGVycyB1bmNoYW5nZWQKKyAgICBpZiBub3QgaGVhZGVyOgorICAgICAgICByZXR1cm4gaGVhZGVyCisKKyAgICBpZiBub3Qga2VlcF9lb2xzOgorICAgICAgICBoZWFkZXIgPSBmaXhfZW9scyhoZWFkZXIpCisKKyAgICAjIEJhc2U2NCBlbmNvZGUgZWFjaCBsaW5lLCBpbiBlbmNvZGVkIGNodW5rcyBubyBncmVhdGVyIHRoYW4gbWF4bGluZWxlbiBpbgorICAgICMgbGVuZ3RoLCBhZnRlciB0aGUgUkZDIGNocm9tZSBpcyBhZGRlZCBpbi4KKyAgICBiYXNlNjRlZCA9IFtdCisgICAgbWF4X2VuY29kZWQgPSBtYXhsaW5lbGVuIC0gbGVuKGNoYXJzZXQpIC0gTUlTQ19MRU4KKyAgICBtYXhfdW5lbmNvZGVkID0gbWF4X2VuY29kZWQgKiAzIC8vIDQKKworICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihoZWFkZXIpLCBtYXhfdW5lbmNvZGVkKToKKyAgICAgICAgYmFzZTY0ZWQuYXBwZW5kKGIyYV9iYXNlNjQoaGVhZGVyW2k6aSttYXhfdW5lbmNvZGVkXSkpCisKKyAgICAjIE5vdyBhZGQgdGhlIFJGQyBjaHJvbWUgdG8gZWFjaCBlbmNvZGVkIGNodW5rCisgICAgbGluZXMgPSBbXQorICAgIGZvciBsaW5lIGluIGJhc2U2NGVkOgorICAgICAgICAjIElnbm9yZSB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgZWFjaCBsaW5lIGlmIGl0IGlzIGEgbmV3bGluZQorICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKE5MKToKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgIyBBZGQgdGhlIGNocm9tZQorICAgICAgICBsaW5lcy5hcHBlbmQoJz0/JXM/Yj8lcz89JyAlIChjaGFyc2V0LCBsaW5lKSkKKyAgICAjIEdsdWUgdGhlIGxpbmVzIHRvZ2V0aGVyIGFuZCByZXR1cm4gaXQuICBCQVc6IHNob3VsZCB3ZSBiZSBhYmxlIHRvCisgICAgIyBzcGVjaWZ5IHRoZSBsZWFkaW5nIHdoaXRlc3BhY2UgaW4gdGhlIGpvaW5lcj8KKyAgICBqb2luZXIgPSBlb2wgKyAnICcKKyAgICByZXR1cm4gam9pbmVyLmpvaW4obGluZXMpCisKKworDAorZGVmIGVuY29kZShzLCBiaW5hcnk9VHJ1ZSwgbWF4bGluZWxlbj03NiwgZW9sPU5MKToKKyAgICAiIiJFbmNvZGUgYSBzdHJpbmcgd2l0aCBiYXNlNjQuCisKKyAgICBFYWNoIGxpbmUgd2lsbCBiZSB3cmFwcGVkIGF0LCBhdCBtb3N0LCBtYXhsaW5lbGVuIGNoYXJhY3RlcnMgKGRlZmF1bHRzIHRvCisgICAgNzYgY2hhcmFjdGVycykuCisKKyAgICBJZiBiaW5hcnkgaXMgRmFsc2UsIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlCisgICAgY2Fub25pY2FsIGVtYWlsIGVuZC1vZi1saW5lIHNlcXVlbmNlIFxcclxcbi4gIE90aGVyd2lzZSB0aGV5IHdpbGwgYmUgbGVmdAorICAgIHZlcmJhdGltICh0aGlzIGlzIHRoZSBkZWZhdWx0KS4KKworICAgIEVhY2ggbGluZSBvZiBlbmNvZGVkIHRleHQgd2lsbCBlbmQgd2l0aCBlb2wsIHdoaWNoIGRlZmF1bHRzIHRvICJcXG4iLiAgU2V0CisgICAgdGhpcyB0byAiXFxyXFxuIiBpZiB5b3Ugd2lsbCBiZSB1c2luZyB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkKKyAgICBpbiBhbiBlbWFpbC4KKyAgICAiIiIKKyAgICBpZiBub3QgczoKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGlmIG5vdCBiaW5hcnk6CisgICAgICAgIHMgPSBmaXhfZW9scyhzKQorCisgICAgZW5jdmVjID0gW10KKyAgICBtYXhfdW5lbmNvZGVkID0gbWF4bGluZWxlbiAqIDMgLy8gNAorICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihzKSwgbWF4X3VuZW5jb2RlZCk6CisgICAgICAgICMgQkFXOiBzaG91bGQgZW5jb2RlKCkgaW5oZXJpdCBiMmFfYmFzZTY0KCkncyBkdWJpb3VzIGJlaGF2aW9yIGluCisgICAgICAgICMgYWRkaW5nIGEgbmV3bGluZSB0byB0aGUgZW5jb2RlZCBzdHJpbmc/CisgICAgICAgIGVuYyA9IGIyYV9iYXNlNjQoc1tpOmkgKyBtYXhfdW5lbmNvZGVkXSkKKyAgICAgICAgaWYgZW5jLmVuZHN3aXRoKE5MKSBhbmQgZW9sICE9IE5MOgorICAgICAgICAgICAgZW5jID0gZW5jWzotMV0gKyBlb2wKKyAgICAgICAgZW5jdmVjLmFwcGVuZChlbmMpCisgICAgcmV0dXJuIEVNUFRZU1RSSU5HLmpvaW4oZW5jdmVjKQorCisKKyMgRm9yIGNvbnZlbmllbmNlIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3LyBzdGFuZGFyZCBiYXNlNjQgbW9kdWxlCitib2R5X2VuY29kZSA9IGVuY29kZQorZW5jb2Rlc3RyaW5nID0gZW5jb2RlCisKKworDAorZGVmIGRlY29kZShzLCBjb252ZXJ0X2VvbHM9Tm9uZSk6CisgICAgIiIiRGVjb2RlIGEgcmF3IGJhc2U2NCBzdHJpbmcuCisKKyAgICBJZiBjb252ZXJ0X2VvbHMgaXMgc2V0IHRvIGEgc3RyaW5nIHZhbHVlLCBhbGwgY2Fub25pY2FsIGVtYWlsIGxpbmVmZWVkcywKKyAgICBlLmcuICJcXHJcXG4iLCBpbiB0aGUgZGVjb2RlZCB0ZXh0IHdpbGwgYmUgY29udmVydGVkIHRvIHRoZSB2YWx1ZSBvZgorICAgIGNvbnZlcnRfZW9scy4gIG9zLmxpbmVzZXAgaXMgYSBnb29kIGNob2ljZSBmb3IgY29udmVydF9lb2xzIGlmIHlvdSBhcmUKKyAgICBkZWNvZGluZyBhIHRleHQgYXR0YWNobWVudC4KKworICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGFyc2UgYSBmdWxsIE1JTUUgaGVhZGVyIHZhbHVlIGVuY29kZWQgd2l0aAorICAgIGJhc2U2NCAobGlrZSA9P2lzby04ODk1LTE/Yj9ibWxvSVNCdWFXZ2g/PSkgLS0gcGxlYXNlIHVzZSB0aGUgaGlnaAorICAgIGxldmVsIGVtYWlsLmhlYWRlciBjbGFzcyBmb3IgdGhhdCBmdW5jdGlvbmFsaXR5LgorICAgICIiIgorICAgIGlmIG5vdCBzOgorICAgICAgICByZXR1cm4gcworCisgICAgZGVjID0gYTJiX2Jhc2U2NChzKQorICAgIGlmIGNvbnZlcnRfZW9sczoKKyAgICAgICAgcmV0dXJuIGRlYy5yZXBsYWNlKENSTEYsIGNvbnZlcnRfZW9scykKKyAgICByZXR1cm4gZGVjCisKKworIyBGb3IgY29udmVuaWVuY2UgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHcvIHN0YW5kYXJkIGJhc2U2NCBtb2R1bGUKK2JvZHlfZGVjb2RlID0gZGVjb2RlCitkZWNvZGVzdHJpbmcgPSBkZWNvZGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvYmFzZTY0bWltZS5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL2Jhc2U2NG1pbWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNzhiZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2Jhc2U2NG1pbWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvYmFzZTY0bWltZS5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL2Jhc2U2NG1pbWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNzhiZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2Jhc2U2NG1pbWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvY2hhcnNldC5weSBiL2xpYi9weXRob24yLjcvZW1haWwvY2hhcnNldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGRhYTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9jaGFyc2V0LnB5CkBAIC0wLDAgKzEsMzk3IEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmVuIEdlcnR6ZmllbGQsIEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCitfX2FsbF9fID0gWworICAgICdDaGFyc2V0JywKKyAgICAnYWRkX2FsaWFzJywKKyAgICAnYWRkX2NoYXJzZXQnLAorICAgICdhZGRfY29kZWMnLAorICAgIF0KKworaW1wb3J0IGNvZGVjcworaW1wb3J0IGVtYWlsLmJhc2U2NG1pbWUKK2ltcG9ydCBlbWFpbC5xdW9wcmltaW1lCisKK2Zyb20gZW1haWwgaW1wb3J0IGVycm9ycworZnJvbSBlbWFpbC5lbmNvZGVycyBpbXBvcnQgZW5jb2RlXzdvcjhiaXQKKworCisMCisjIEZsYWdzIGZvciB0eXBlcyBvZiBoZWFkZXIgZW5jb2RpbmdzCitRUCAgICAgICAgICA9IDEgIyBRdW90ZWQtUHJpbnRhYmxlCitCQVNFNjQgICAgICA9IDIgIyBCYXNlNjQKK1NIT1JURVNUICAgID0gMyAjIHRoZSBzaG9ydGVyIG9mIFFQIGFuZCBiYXNlNjQsIGJ1dCBvbmx5IGZvciBoZWFkZXJzCisKKyMgSW4gIj0/Y2hhcnNldD9xP2hlbGxvX3dvcmxkPz0iLCB0aGUgPT8sID9xPywgYW5kID89IGFkZCB1cCB0byA3CitNSVNDX0xFTiA9IDcKKworREVGQVVMVF9DSEFSU0VUID0gJ3VzLWFzY2lpJworCisKKwwKKyMgRGVmYXVsdHMKK0NIQVJTRVRTID0geworICAgICMgaW5wdXQgICAgICAgIGhlYWRlciBlbmMgIGJvZHkgZW5jIG91dHB1dCBjb252CisgICAgJ2lzby04ODU5LTEnOiAgKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ2lzby04ODU5LTInOiAgKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ2lzby04ODU5LTMnOiAgKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ2lzby04ODU5LTQnOiAgKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgIyBpc28tODg1OS01IGlzIEN5cmlsbGljLCBhbmQgbm90IGVzcGVjaWFsbHkgdXNlZAorICAgICMgaXNvLTg4NTktNiBpcyBBcmFiaWMsIGFsc28gbm90IHBhcnRpY3VsYXJseSB1c2VkCisgICAgIyBpc28tODg1OS03IGlzIEdyZWVrLCBRUCB3aWxsIG5vdCBtYWtlIGl0IHJlYWRhYmxlCisgICAgIyBpc28tODg1OS04IGlzIEhlYnJldywgUVAgd2lsbCBub3QgbWFrZSBpdCByZWFkYWJsZQorICAgICdpc28tODg1OS05JzogIChRUCwgICAgICAgIFFQLCAgICAgIE5vbmUpLAorICAgICdpc28tODg1OS0xMCc6IChRUCwgICAgICAgIFFQLCAgICAgIE5vbmUpLAorICAgICMgaXNvLTg4NTktMTEgaXMgVGhhaSwgUVAgd2lsbCBub3QgbWFrZSBpdCByZWFkYWJsZQorICAgICdpc28tODg1OS0xMyc6IChRUCwgICAgICAgIFFQLCAgICAgIE5vbmUpLAorICAgICdpc28tODg1OS0xNCc6IChRUCwgICAgICAgIFFQLCAgICAgIE5vbmUpLAorICAgICdpc28tODg1OS0xNSc6IChRUCwgICAgICAgIFFQLCAgICAgIE5vbmUpLAorICAgICdpc28tODg1OS0xNic6IChRUCwgICAgICAgIFFQLCAgICAgIE5vbmUpLAorICAgICd3aW5kb3dzLTEyNTInOihRUCwgICAgICAgIFFQLCAgICAgIE5vbmUpLAorICAgICd2aXNjaWknOiAgICAgIChRUCwgICAgICAgIFFQLCAgICAgIE5vbmUpLAorICAgICd1cy1hc2NpaSc6ICAgIChOb25lLCAgICAgIE5vbmUsICAgIE5vbmUpLAorICAgICdiaWc1JzogICAgICAgIChCQVNFNjQsICAgIEJBU0U2NCwgIE5vbmUpLAorICAgICdnYjIzMTInOiAgICAgIChCQVNFNjQsICAgIEJBU0U2NCwgIE5vbmUpLAorICAgICdldWMtanAnOiAgICAgIChCQVNFNjQsICAgIE5vbmUsICAgICdpc28tMjAyMi1qcCcpLAorICAgICdzaGlmdF9qaXMnOiAgIChCQVNFNjQsICAgIE5vbmUsICAgICdpc28tMjAyMi1qcCcpLAorICAgICdpc28tMjAyMi1qcCc6IChCQVNFNjQsICAgIE5vbmUsICAgIE5vbmUpLAorICAgICdrb2k4LXInOiAgICAgIChCQVNFNjQsICAgIEJBU0U2NCwgIE5vbmUpLAorICAgICd1dGYtOCc6ICAgICAgIChTSE9SVEVTVCwgIEJBU0U2NCwgJ3V0Zi04JyksCisgICAgIyBXZSdyZSBtYWtpbmcgdGhpcyBvbmUgdXAgdG8gcmVwcmVzZW50IHJhdyB1bmVuY29kZWQgOC1iaXQKKyAgICAnOGJpdCc6ICAgICAgICAoTm9uZSwgICAgICBCQVNFNjQsICd1dGYtOCcpLAorICAgIH0KKworIyBBbGlhc2VzIGZvciBvdGhlciBjb21tb25seS11c2VkIG5hbWVzIGZvciBjaGFyYWN0ZXIgc2V0cy4gIE1hcAorIyB0aGVtIHRvIHRoZSByZWFsIG9uZXMgdXNlZCBpbiBlbWFpbC4KK0FMSUFTRVMgPSB7CisgICAgJ2xhdGluXzEnOiAnaXNvLTg4NTktMScsCisgICAgJ2xhdGluLTEnOiAnaXNvLTg4NTktMScsCisgICAgJ2xhdGluXzInOiAnaXNvLTg4NTktMicsCisgICAgJ2xhdGluLTInOiAnaXNvLTg4NTktMicsCisgICAgJ2xhdGluXzMnOiAnaXNvLTg4NTktMycsCisgICAgJ2xhdGluLTMnOiAnaXNvLTg4NTktMycsCisgICAgJ2xhdGluXzQnOiAnaXNvLTg4NTktNCcsCisgICAgJ2xhdGluLTQnOiAnaXNvLTg4NTktNCcsCisgICAgJ2xhdGluXzUnOiAnaXNvLTg4NTktOScsCisgICAgJ2xhdGluLTUnOiAnaXNvLTg4NTktOScsCisgICAgJ2xhdGluXzYnOiAnaXNvLTg4NTktMTAnLAorICAgICdsYXRpbi02JzogJ2lzby04ODU5LTEwJywKKyAgICAnbGF0aW5fNyc6ICdpc28tODg1OS0xMycsCisgICAgJ2xhdGluLTcnOiAnaXNvLTg4NTktMTMnLAorICAgICdsYXRpbl84JzogJ2lzby04ODU5LTE0JywKKyAgICAnbGF0aW4tOCc6ICdpc28tODg1OS0xNCcsCisgICAgJ2xhdGluXzknOiAnaXNvLTg4NTktMTUnLAorICAgICdsYXRpbi05JzogJ2lzby04ODU5LTE1JywKKyAgICAnbGF0aW5fMTAnOidpc28tODg1OS0xNicsCisgICAgJ2xhdGluLTEwJzonaXNvLTg4NTktMTYnLAorICAgICdjcDk0OSc6ICAgJ2tzX2NfNTYwMS0xOTg3JywKKyAgICAnZXVjX2pwJzogICdldWMtanAnLAorICAgICdldWNfa3InOiAgJ2V1Yy1rcicsCisgICAgJ2FzY2lpJzogICAndXMtYXNjaWknLAorICAgIH0KKworCisjIE1hcCBjaGFyc2V0cyB0byB0aGVpciBVbmljb2RlIGNvZGVjIHN0cmluZ3MuCitDT0RFQ19NQVAgPSB7CisgICAgJ2diMjMxMic6ICAgICAgJ2V1Y2diMjMxMl9jbicsCisgICAgJ2JpZzUnOiAgICAgICAgJ2JpZzVfdHcnLAorICAgICMgSGFjazogV2UgZG9uJ3Qgd2FudCAqYW55KiBjb252ZXJzaW9uIGZvciBzdHVmZiBtYXJrZWQgdXMtYXNjaWksIGFzIGFsbAorICAgICMgc29ydHMgb2YgZ2FyYmFnZSBtaWdodCBiZSBzZW50IHRvIHVzIGluIHRoZSBndWlzZSBvZiA3LWJpdCB1cy1hc2NpaS4KKyAgICAjIExldCB0aGF0IHN0dWZmIHBhc3MgdGhyb3VnaCB3aXRob3V0IGNvbnZlcnNpb24gdG8vZnJvbSBVbmljb2RlLgorICAgICd1cy1hc2NpaSc6ICAgIE5vbmUsCisgICAgfQorCisKKwwKKyMgQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBleHRlbmRpbmcgdGhlIGFib3ZlIG1hcHBpbmdzCitkZWYgYWRkX2NoYXJzZXQoY2hhcnNldCwgaGVhZGVyX2VuYz1Ob25lLCBib2R5X2VuYz1Ob25lLCBvdXRwdXRfY2hhcnNldD1Ob25lKToKKyAgICAiIiJBZGQgY2hhcmFjdGVyIHNldCBwcm9wZXJ0aWVzIHRvIHRoZSBnbG9iYWwgcmVnaXN0cnkuCisKKyAgICBjaGFyc2V0IGlzIHRoZSBpbnB1dCBjaGFyYWN0ZXIgc2V0LCBhbmQgbXVzdCBiZSB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYQorICAgIGNoYXJhY3RlciBzZXQuCisKKyAgICBPcHRpb25hbCBoZWFkZXJfZW5jIGFuZCBib2R5X2VuYyBpcyBlaXRoZXIgQ2hhcnNldC5RUCBmb3IKKyAgICBxdW90ZWQtcHJpbnRhYmxlLCBDaGFyc2V0LkJBU0U2NCBmb3IgYmFzZTY0IGVuY29kaW5nLCBDaGFyc2V0LlNIT1JURVNUIGZvcgorICAgIHRoZSBzaG9ydGVzdCBvZiBxcCBvciBiYXNlNjQgZW5jb2RpbmcsIG9yIE5vbmUgZm9yIG5vIGVuY29kaW5nLiAgU0hPUlRFU1QKKyAgICBpcyBvbmx5IHZhbGlkIGZvciBoZWFkZXJfZW5jLiAgSXQgZGVzY3JpYmVzIGhvdyBtZXNzYWdlIGhlYWRlcnMgYW5kCisgICAgbWVzc2FnZSBib2RpZXMgaW4gdGhlIGlucHV0IGNoYXJzZXQgYXJlIHRvIGJlIGVuY29kZWQuICBEZWZhdWx0IGlzIG5vCisgICAgZW5jb2RpbmcuCisKKyAgICBPcHRpb25hbCBvdXRwdXRfY2hhcnNldCBpcyB0aGUgY2hhcmFjdGVyIHNldCB0aGF0IHRoZSBvdXRwdXQgc2hvdWxkIGJlCisgICAgaW4uICBDb252ZXJzaW9ucyB3aWxsIHByb2NlZWQgZnJvbSBpbnB1dCBjaGFyc2V0LCB0byBVbmljb2RlLCB0byB0aGUKKyAgICBvdXRwdXQgY2hhcnNldCB3aGVuIHRoZSBtZXRob2QgQ2hhcnNldC5jb252ZXJ0KCkgaXMgY2FsbGVkLiAgVGhlIGRlZmF1bHQKKyAgICBpcyB0byBvdXRwdXQgaW4gdGhlIHNhbWUgY2hhcmFjdGVyIHNldCBhcyB0aGUgaW5wdXQuCisKKyAgICBCb3RoIGlucHV0X2NoYXJzZXQgYW5kIG91dHB1dF9jaGFyc2V0IG11c3QgaGF2ZSBVbmljb2RlIGNvZGVjIGVudHJpZXMgaW4KKyAgICB0aGUgbW9kdWxlJ3MgY2hhcnNldC10by1jb2RlYyBtYXBwaW5nOyB1c2UgYWRkX2NvZGVjKGNoYXJzZXQsIGNvZGVjbmFtZSkKKyAgICB0byBhZGQgY29kZWNzIHRoZSBtb2R1bGUgZG9lcyBub3Qga25vdyBhYm91dC4gIFNlZSB0aGUgY29kZWNzIG1vZHVsZSdzCisgICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAiIiIKKyAgICBpZiBib2R5X2VuYyA9PSBTSE9SVEVTVDoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignU0hPUlRFU1Qgbm90IGFsbG93ZWQgZm9yIGJvZHlfZW5jJykKKyAgICBDSEFSU0VUU1tjaGFyc2V0XSA9IChoZWFkZXJfZW5jLCBib2R5X2VuYywgb3V0cHV0X2NoYXJzZXQpCisKKworZGVmIGFkZF9hbGlhcyhhbGlhcywgY2Fub25pY2FsKToKKyAgICAiIiJBZGQgYSBjaGFyYWN0ZXIgc2V0IGFsaWFzLgorCisgICAgYWxpYXMgaXMgdGhlIGFsaWFzIG5hbWUsIGUuZy4gbGF0aW4tMQorICAgIGNhbm9uaWNhbCBpcyB0aGUgY2hhcmFjdGVyIHNldCdzIGNhbm9uaWNhbCBuYW1lLCBlLmcuIGlzby04ODU5LTEKKyAgICAiIiIKKyAgICBBTElBU0VTW2FsaWFzXSA9IGNhbm9uaWNhbAorCisKK2RlZiBhZGRfY29kZWMoY2hhcnNldCwgY29kZWNuYW1lKToKKyAgICAiIiJBZGQgYSBjb2RlYyB0aGF0IG1hcCBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBjaGFyc2V0IHRvL2Zyb20gVW5pY29kZS4KKworICAgIGNoYXJzZXQgaXMgdGhlIGNhbm9uaWNhbCBuYW1lIG9mIGEgY2hhcmFjdGVyIHNldC4gIGNvZGVjbmFtZSBpcyB0aGUgbmFtZQorICAgIG9mIGEgUHl0aG9uIGNvZGVjLCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCB0byB0aGUgdW5pY29kZSgpCisgICAgYnVpbHQtaW4sIG9yIHRvIHRoZSBlbmNvZGUoKSBtZXRob2Qgb2YgYSBVbmljb2RlIHN0cmluZy4KKyAgICAiIiIKKyAgICBDT0RFQ19NQVBbY2hhcnNldF0gPSBjb2RlY25hbWUKKworCisMCitjbGFzcyBDaGFyc2V0OgorICAgICIiIk1hcCBjaGFyYWN0ZXIgc2V0cyB0byB0aGVpciBlbWFpbCBwcm9wZXJ0aWVzLgorCisgICAgVGhpcyBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVxdWlyZW1lbnRzIGltcG9zZWQgb24gZW1haWwKKyAgICBmb3IgYSBzcGVjaWZpYyBjaGFyYWN0ZXIgc2V0LiAgSXQgYWxzbyBwcm92aWRlcyBjb252ZW5pZW5jZSByb3V0aW5lcyBmb3IKKyAgICBjb252ZXJ0aW5nIGJldHdlZW4gY2hhcmFjdGVyIHNldHMsIGdpdmVuIHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlCisgICAgYXBwbGljYWJsZSBjb2RlY3MuICBHaXZlbiBhIGNoYXJhY3RlciBzZXQsIGl0IHdpbGwgZG8gaXRzIGJlc3QgdG8gcHJvdmlkZQorICAgIGluZm9ybWF0aW9uIG9uIGhvdyB0byB1c2UgdGhhdCBjaGFyYWN0ZXIgc2V0IGluIGFuIGVtYWlsIGluIGFuCisgICAgUkZDLWNvbXBsaWFudCB3YXkuCisKKyAgICBDZXJ0YWluIGNoYXJhY3RlciBzZXRzIG11c3QgYmUgZW5jb2RlZCB3aXRoIHF1b3RlZC1wcmludGFibGUgb3IgYmFzZTY0CisgICAgd2hlbiB1c2VkIGluIGVtYWlsIGhlYWRlcnMgb3IgYm9kaWVzLiAgQ2VydGFpbiBjaGFyYWN0ZXIgc2V0cyBtdXN0IGJlCisgICAgY29udmVydGVkIG91dHJpZ2h0LCBhbmQgYXJlIG5vdCBhbGxvd2VkIGluIGVtYWlsLiAgSW5zdGFuY2VzIG9mIHRoaXMKKyAgICBtb2R1bGUgZXhwb3NlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBjaGFyYWN0ZXIgc2V0OgorCisgICAgaW5wdXRfY2hhcnNldDogVGhlIGluaXRpYWwgY2hhcmFjdGVyIHNldCBzcGVjaWZpZWQuICBDb21tb24gYWxpYXNlcworICAgICAgICAgICAgICAgICAgIGFyZSBjb252ZXJ0ZWQgdG8gdGhlaXIgYG9mZmljaWFsJyBlbWFpbCBuYW1lcyAoZS5nLiBsYXRpbl8xCisgICAgICAgICAgICAgICAgICAgaXMgY29udmVydGVkIHRvIGlzby04ODU5LTEpLiAgRGVmYXVsdHMgdG8gNy1iaXQgdXMtYXNjaWkuCisKKyAgICBoZWFkZXJfZW5jb2Rpbmc6IElmIHRoZSBjaGFyYWN0ZXIgc2V0IG11c3QgYmUgZW5jb2RlZCBiZWZvcmUgaXQgY2FuIGJlCisgICAgICAgICAgICAgICAgICAgICB1c2VkIGluIGFuIGVtYWlsIGhlYWRlciwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBzZXQgdG8KKyAgICAgICAgICAgICAgICAgICAgIENoYXJzZXQuUVAgKGZvciBxdW90ZWQtcHJpbnRhYmxlKSwgQ2hhcnNldC5CQVNFNjQgKGZvcgorICAgICAgICAgICAgICAgICAgICAgYmFzZTY0IGVuY29kaW5nKSwgb3IgQ2hhcnNldC5TSE9SVEVTVCBmb3IgdGhlIHNob3J0ZXN0IG9mCisgICAgICAgICAgICAgICAgICAgICBRUCBvciBCQVNFNjQgZW5jb2RpbmcuICBPdGhlcndpc2UsIGl0IHdpbGwgYmUgTm9uZS4KKworICAgIGJvZHlfZW5jb2Rpbmc6IFNhbWUgYXMgaGVhZGVyX2VuY29kaW5nLCBidXQgZGVzY3JpYmVzIHRoZSBlbmNvZGluZyBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgbWFpbCBtZXNzYWdlJ3MgYm9keSwgd2hpY2ggaW5kZWVkIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUKKyAgICAgICAgICAgICAgICAgICBoZWFkZXIgZW5jb2RpbmcuICBDaGFyc2V0LlNIT1JURVNUIGlzIG5vdCBhbGxvd2VkIGZvcgorICAgICAgICAgICAgICAgICAgIGJvZHlfZW5jb2RpbmcuCisKKyAgICBvdXRwdXRfY2hhcnNldDogU29tZSBjaGFyYWN0ZXIgc2V0cyBtdXN0IGJlIGNvbnZlcnRlZCBiZWZvcmUgdGhlIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICB1c2VkIGluIGVtYWlsIGhlYWRlcnMgb3IgYm9kaWVzLiAgSWYgdGhlIGlucHV0X2NoYXJzZXQgaXMKKyAgICAgICAgICAgICAgICAgICAgb25lIG9mIHRoZW0sIHRoaXMgYXR0cmlidXRlIHdpbGwgY29udGFpbiB0aGUgbmFtZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgY2hhcnNldCBvdXRwdXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8uICBPdGhlcndpc2UsIGl0IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgYmUgTm9uZS4KKworICAgIGlucHV0X2NvZGVjOiBUaGUgbmFtZSBvZiB0aGUgUHl0aG9uIGNvZGVjIHVzZWQgdG8gY29udmVydCB0aGUKKyAgICAgICAgICAgICAgICAgaW5wdXRfY2hhcnNldCB0byBVbmljb2RlLiAgSWYgbm8gY29udmVyc2lvbiBjb2RlYyBpcworICAgICAgICAgICAgICAgICBuZWNlc3NhcnksIHRoaXMgYXR0cmlidXRlIHdpbGwgYmUgTm9uZS4KKworICAgIG91dHB1dF9jb2RlYzogVGhlIG5hbWUgb2YgdGhlIFB5dGhvbiBjb2RlYyB1c2VkIHRvIGNvbnZlcnQgVW5pY29kZQorICAgICAgICAgICAgICAgICAgdG8gdGhlIG91dHB1dF9jaGFyc2V0LiAgSWYgbm8gY29udmVyc2lvbiBjb2RlYyBpcyBuZWNlc3NhcnksCisgICAgICAgICAgICAgICAgICB0aGlzIGF0dHJpYnV0ZSB3aWxsIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGlucHV0X2NvZGVjLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnB1dF9jaGFyc2V0PURFRkFVTFRfQ0hBUlNFVCk6CisgICAgICAgICMgUkZDIDIwNDYsICQ0LjEuMiBzYXlzIGNoYXJzZXRzIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUuICBXZSBjb2VyY2UgdG8KKyAgICAgICAgIyB1bmljb2RlIGJlY2F1c2UgaXRzIC5sb3dlcigpIGlzIGxvY2FsZSBpbnNlbnNpdGl2ZS4gIElmIHRoZSBhcmd1bWVudAorICAgICAgICAjIGlzIGFscmVhZHkgYSB1bmljb2RlLCB3ZSBsZWF2ZSBpdCBhdCB0aGF0LCBidXQgZW5zdXJlIHRoYXQgdGhlCisgICAgICAgICMgY2hhcnNldCBpcyBBU0NJSSwgYXMgdGhlIHN0YW5kYXJkIChSRkMgWFhYKSByZXF1aXJlcy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpbnB1dF9jaGFyc2V0LCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICBpbnB1dF9jaGFyc2V0LmVuY29kZSgnYXNjaWknKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbnB1dF9jaGFyc2V0ID0gdW5pY29kZShpbnB1dF9jaGFyc2V0LCAnYXNjaWknKQorICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgZXJyb3JzLkNoYXJzZXRFcnJvcihpbnB1dF9jaGFyc2V0KQorICAgICAgICBpbnB1dF9jaGFyc2V0ID0gaW5wdXRfY2hhcnNldC5sb3dlcigpLmVuY29kZSgnYXNjaWknKQorICAgICAgICAjIFNldCB0aGUgaW5wdXQgY2hhcnNldCBhZnRlciBmaWx0ZXJpbmcgdGhyb3VnaCB0aGUgYWxpYXNlcyBhbmQvb3IgY29kZWNzCisgICAgICAgIGlmIG5vdCAoaW5wdXRfY2hhcnNldCBpbiBBTElBU0VTIG9yIGlucHV0X2NoYXJzZXQgaW4gQ0hBUlNFVFMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlucHV0X2NoYXJzZXQgPSBjb2RlY3MubG9va3VwKGlucHV0X2NoYXJzZXQpLm5hbWUKKyAgICAgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuaW5wdXRfY2hhcnNldCA9IEFMSUFTRVMuZ2V0KGlucHV0X2NoYXJzZXQsIGlucHV0X2NoYXJzZXQpCisgICAgICAgICMgV2UgY2FuIHRyeSB0byBndWVzcyB3aGljaCBlbmNvZGluZyBhbmQgY29udmVyc2lvbiB0byB1c2UgYnkgdGhlCisgICAgICAgICMgY2hhcnNldF9tYXAgZGljdGlvbmFyeS4gIFRyeSB0aGF0IGZpcnN0LCBidXQgbGV0IHRoZSB1c2VyIG92ZXJyaWRlCisgICAgICAgICMgaXQuCisgICAgICAgIGhlbmMsIGJlbmMsIGNvbnYgPSBDSEFSU0VUUy5nZXQoc2VsZi5pbnB1dF9jaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTSE9SVEVTVCwgQkFTRTY0LCBOb25lKSkKKyAgICAgICAgaWYgbm90IGNvbnY6CisgICAgICAgICAgICBjb252ID0gc2VsZi5pbnB1dF9jaGFyc2V0CisgICAgICAgICMgU2V0IHRoZSBhdHRyaWJ1dGVzLCBhbGxvd2luZyB0aGUgYXJndW1lbnRzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0LgorICAgICAgICBzZWxmLmhlYWRlcl9lbmNvZGluZyA9IGhlbmMKKyAgICAgICAgc2VsZi5ib2R5X2VuY29kaW5nID0gYmVuYworICAgICAgICBzZWxmLm91dHB1dF9jaGFyc2V0ID0gQUxJQVNFUy5nZXQoY29udiwgY29udikKKyAgICAgICAgIyBOb3cgc2V0IHRoZSBjb2RlY3MuICBJZiBvbmUgaXNuJ3QgZGVmaW5lZCBmb3IgaW5wdXRfY2hhcnNldCwKKyAgICAgICAgIyBndWVzcyBhbmQgdHJ5IGEgVW5pY29kZSBjb2RlYyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgaW5wdXRfY29kZWMuCisgICAgICAgIHNlbGYuaW5wdXRfY29kZWMgPSBDT0RFQ19NQVAuZ2V0KHNlbGYuaW5wdXRfY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnB1dF9jaGFyc2V0KQorICAgICAgICBzZWxmLm91dHB1dF9jb2RlYyA9IENPREVDX01BUC5nZXQoc2VsZi5vdXRwdXRfY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0X2NoYXJzZXQpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5wdXRfY2hhcnNldC5sb3dlcigpCisKKyAgICBfX3JlcHJfXyA9IF9fc3RyX18KKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYpID09IHN0cihvdGhlcikubG93ZXIoKQorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5fX2VxX18ob3RoZXIpCisKKyAgICBkZWYgZ2V0X2JvZHlfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgY29udGVudC10cmFuc2Zlci1lbmNvZGluZyB1c2VkIGZvciBib2R5IGVuY29kaW5nLgorCisgICAgICAgIFRoaXMgaXMgZWl0aGVyIHRoZSBzdHJpbmcgYHF1b3RlZC1wcmludGFibGUnIG9yIGBiYXNlNjQnIGRlcGVuZGluZyBvbgorICAgICAgICB0aGUgZW5jb2RpbmcgdXNlZCwgb3IgaXQgaXMgYSBmdW5jdGlvbiBpbiB3aGljaCBjYXNlIHlvdSBzaG91bGQgY2FsbAorICAgICAgICB0aGUgZnVuY3Rpb24gd2l0aCBhIHNpbmdsZSBhcmd1bWVudCwgdGhlIE1lc3NhZ2Ugb2JqZWN0IGJlaW5nCisgICAgICAgIGVuY29kZWQuICBUaGUgZnVuY3Rpb24gc2hvdWxkIHRoZW4gc2V0IHRoZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nCisgICAgICAgIGhlYWRlciBpdHNlbGYgdG8gd2hhdGV2ZXIgaXMgYXBwcm9wcmlhdGUuCisKKyAgICAgICAgUmV0dXJucyAicXVvdGVkLXByaW50YWJsZSIgaWYgc2VsZi5ib2R5X2VuY29kaW5nIGlzIFFQLgorICAgICAgICBSZXR1cm5zICJiYXNlNjQiIGlmIHNlbGYuYm9keV9lbmNvZGluZyBpcyBCQVNFNjQuCisgICAgICAgIFJldHVybnMgIjdiaXQiIG90aGVyd2lzZS4KKyAgICAgICAgIiIiCisgICAgICAgIGFzc2VydCBzZWxmLmJvZHlfZW5jb2RpbmcgIT0gU0hPUlRFU1QKKyAgICAgICAgaWYgc2VsZi5ib2R5X2VuY29kaW5nID09IFFQOgorICAgICAgICAgICAgcmV0dXJuICdxdW90ZWQtcHJpbnRhYmxlJworICAgICAgICBlbGlmIHNlbGYuYm9keV9lbmNvZGluZyA9PSBCQVNFNjQ6CisgICAgICAgICAgICByZXR1cm4gJ2Jhc2U2NCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBlbmNvZGVfN29yOGJpdAorCisgICAgZGVmIGNvbnZlcnQoc2VsZiwgcyk6CisgICAgICAgICIiIkNvbnZlcnQgYSBzdHJpbmcgZnJvbSB0aGUgaW5wdXRfY29kZWMgdG8gdGhlIG91dHB1dF9jb2RlYy4iIiIKKyAgICAgICAgaWYgc2VsZi5pbnB1dF9jb2RlYyAhPSBzZWxmLm91dHB1dF9jb2RlYzoKKyAgICAgICAgICAgIHJldHVybiB1bmljb2RlKHMsIHNlbGYuaW5wdXRfY29kZWMpLmVuY29kZShzZWxmLm91dHB1dF9jb2RlYykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgdG9fc3BsaXR0YWJsZShzZWxmLCBzKToKKyAgICAgICAgIiIiQ29udmVydCBhIHBvc3NpYmx5IG11bHRpYnl0ZSBzdHJpbmcgdG8gYSBzYWZlbHkgc3BsaXR0YWJsZSBmb3JtYXQuCisKKyAgICAgICAgVXNlcyB0aGUgaW5wdXRfY29kZWMgdG8gdHJ5IGFuZCBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gVW5pY29kZSwgc28gaXQKKyAgICAgICAgY2FuIGJlIHNhZmVseSBzcGxpdCBvbiBjaGFyYWN0ZXIgYm91bmRhcmllcyAoZXZlbiBmb3IgbXVsdGlieXRlCisgICAgICAgIGNoYXJhY3RlcnMpLgorCisgICAgICAgIFJldHVybnMgdGhlIHN0cmluZyBhcy1pcyBpZiBpdCBpc24ndCBrbm93biBob3cgdG8gY29udmVydCBpdCB0bworICAgICAgICBVbmljb2RlIHdpdGggdGhlIGlucHV0X2NoYXJzZXQuCisKKyAgICAgICAgQ2hhcmFjdGVycyB0aGF0IGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgdG8gVW5pY29kZSB3aWxsIGJlIHJlcGxhY2VkCisgICAgICAgIHdpdGggdGhlIFVuaWNvZGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyIFUrRkZGRC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UocywgdW5pY29kZSkgb3Igc2VsZi5pbnB1dF9jb2RlYyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUocywgc2VsZi5pbnB1dF9jb2RlYywgJ3JlcGxhY2UnKQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICAjIElucHV0IGNvZGVjIG5vdCBpbnN0YWxsZWQgb24gc3lzdGVtLCBzbyByZXR1cm4gdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAjIHN0cmluZyB1bmNoYW5nZWQuCisgICAgICAgICAgICByZXR1cm4gcworCisgICAgZGVmIGZyb21fc3BsaXR0YWJsZShzZWxmLCB1c3RyLCB0b19vdXRwdXQ9VHJ1ZSk6CisgICAgICAgICIiIkNvbnZlcnQgYSBzcGxpdHRhYmxlIHN0cmluZyBiYWNrIGludG8gYW4gZW5jb2RlZCBzdHJpbmcuCisKKyAgICAgICAgVXNlcyB0aGUgcHJvcGVyIGNvZGVjIHRvIHRyeSBhbmQgY29udmVydCB0aGUgc3RyaW5nIGZyb20gVW5pY29kZSBiYWNrCisgICAgICAgIGludG8gYW4gZW5jb2RlZCBmb3JtYXQuICBSZXR1cm4gdGhlIHN0cmluZyBhcy1pcyBpZiBpdCBpcyBub3QgVW5pY29kZSwKKyAgICAgICAgb3IgaWYgaXQgY291bGQgbm90IGJlIGNvbnZlcnRlZCBmcm9tIFVuaWNvZGUuCisKKyAgICAgICAgQ2hhcmFjdGVycyB0aGF0IGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQgZnJvbSBVbmljb2RlIHdpbGwgYmUgcmVwbGFjZWQKKyAgICAgICAgd2l0aCBhbiBhcHByb3ByaWF0ZSBjaGFyYWN0ZXIgKHVzdWFsbHkgJz8nKS4KKworICAgICAgICBJZiB0b19vdXRwdXQgaXMgVHJ1ZSAodGhlIGRlZmF1bHQpLCB1c2VzIG91dHB1dF9jb2RlYyB0byBjb252ZXJ0IHRvIGFuCisgICAgICAgIGVuY29kZWQgZm9ybWF0LiAgSWYgdG9fb3V0cHV0IGlzIEZhbHNlLCB1c2VzIGlucHV0X2NvZGVjLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgdG9fb3V0cHV0OgorICAgICAgICAgICAgY29kZWMgPSBzZWxmLm91dHB1dF9jb2RlYworICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29kZWMgPSBzZWxmLmlucHV0X2NvZGVjCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHVzdHIsIHVuaWNvZGUpIG9yIGNvZGVjIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdXN0cgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gdXN0ci5lbmNvZGUoY29kZWMsICdyZXBsYWNlJykKKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgIyBPdXRwdXQgY29kZWMgbm90IGluc3RhbGxlZAorICAgICAgICAgICAgcmV0dXJuIHVzdHIKKworICAgIGRlZiBnZXRfb3V0cHV0X2NoYXJzZXQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgb3V0cHV0IGNoYXJhY3RlciBzZXQuCisKKyAgICAgICAgVGhpcyBpcyBzZWxmLm91dHB1dF9jaGFyc2V0IGlmIHRoYXQgaXMgbm90IE5vbmUsIG90aGVyd2lzZSBpdCBpcworICAgICAgICBzZWxmLmlucHV0X2NoYXJzZXQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5vdXRwdXRfY2hhcnNldCBvciBzZWxmLmlucHV0X2NoYXJzZXQKKworICAgIGRlZiBlbmNvZGVkX2hlYWRlcl9sZW4oc2VsZiwgcyk6CisgICAgICAgICIiIlJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBlbmNvZGVkIGhlYWRlciBzdHJpbmcuIiIiCisgICAgICAgIGNzZXQgPSBzZWxmLmdldF9vdXRwdXRfY2hhcnNldCgpCisgICAgICAgICMgVGhlIGxlbihzKSBvZiBhIDdiaXQgZW5jb2RpbmcgaXMgbGVuKHMpCisgICAgICAgIGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nID09IEJBU0U2NDoKKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRtaW1lLmJhc2U2NF9sZW4ocykgKyBsZW4oY3NldCkgKyBNSVNDX0xFTgorICAgICAgICBlbGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nID09IFFQOgorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9sZW4ocykgKyBsZW4oY3NldCkgKyBNSVNDX0xFTgorICAgICAgICBlbGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nID09IFNIT1JURVNUOgorICAgICAgICAgICAgbGVuYjY0ID0gZW1haWwuYmFzZTY0bWltZS5iYXNlNjRfbGVuKHMpCisgICAgICAgICAgICBsZW5xcCA9IGVtYWlsLnF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9sZW4ocykKKyAgICAgICAgICAgIHJldHVybiBtaW4obGVuYjY0LCBsZW5xcCkgKyBsZW4oY3NldCkgKyBNSVNDX0xFTgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGxlbihzKQorCisgICAgZGVmIGhlYWRlcl9lbmNvZGUoc2VsZiwgcywgY29udmVydD1GYWxzZSk6CisgICAgICAgICIiIkhlYWRlci1lbmNvZGUgYSBzdHJpbmcsIG9wdGlvbmFsbHkgY29udmVydGluZyBpdCB0byBvdXRwdXRfY2hhcnNldC4KKworICAgICAgICBJZiBjb252ZXJ0IGlzIFRydWUsIHRoZSBzdHJpbmcgd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbSB0aGUgaW5wdXQKKyAgICAgICAgY2hhcnNldCB0byB0aGUgb3V0cHV0IGNoYXJzZXQgYXV0b21hdGljYWxseS4gIFRoaXMgaXMgbm90IHVzZWZ1bCBmb3IKKyAgICAgICAgbXVsdGlieXRlIGNoYXJhY3RlciBzZXRzLCB3aGljaCBoYXZlIGxpbmUgbGVuZ3RoIGlzc3VlcyAobXVsdGlieXRlCisgICAgICAgIGNoYXJhY3RlcnMgbXVzdCBiZSBzcGxpdCBvbiBhIGNoYXJhY3Rlciwgbm90IGEgYnl0ZSBib3VuZGFyeSk7IHVzZSB0aGUKKyAgICAgICAgaGlnaC1sZXZlbCBIZWFkZXIgY2xhc3MgdG8gZGVhbCB3aXRoIHRoZXNlIGlzc3Vlcy4gIGNvbnZlcnQgZGVmYXVsdHMKKyAgICAgICAgdG8gRmFsc2UuCisKKyAgICAgICAgVGhlIHR5cGUgb2YgZW5jb2RpbmcgKGJhc2U2NCBvciBxdW90ZWQtcHJpbnRhYmxlKSB3aWxsIGJlIGJhc2VkIG9uCisgICAgICAgIHNlbGYuaGVhZGVyX2VuY29kaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgY3NldCA9IHNlbGYuZ2V0X291dHB1dF9jaGFyc2V0KCkKKyAgICAgICAgaWYgY29udmVydDoKKyAgICAgICAgICAgIHMgPSBzZWxmLmNvbnZlcnQocykKKyAgICAgICAgIyA3Yml0LzhiaXQgZW5jb2RpbmdzIHJldHVybiB0aGUgc3RyaW5nIHVuY2hhbmdlZCAobW9kdWxvIGNvbnZlcnNpb25zKQorICAgICAgICBpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyA9PSBCQVNFNjQ6CisgICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0bWltZS5oZWFkZXJfZW5jb2RlKHMsIGNzZXQpCisgICAgICAgIGVsaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gUVA6CisgICAgICAgICAgICByZXR1cm4gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfZW5jb2RlKHMsIGNzZXQsIG1heGxpbmVsZW49Tm9uZSkKKyAgICAgICAgZWxpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyA9PSBTSE9SVEVTVDoKKyAgICAgICAgICAgIGxlbmI2NCA9IGVtYWlsLmJhc2U2NG1pbWUuYmFzZTY0X2xlbihzKQorICAgICAgICAgICAgbGVucXAgPSBlbWFpbC5xdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfbGVuKHMpCisgICAgICAgICAgICBpZiBsZW5iNjQgPCBsZW5xcDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0bWltZS5oZWFkZXJfZW5jb2RlKHMsIGNzZXQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmltaW1lLmhlYWRlcl9lbmNvZGUocywgY3NldCwgbWF4bGluZWxlbj1Ob25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBib2R5X2VuY29kZShzZWxmLCBzLCBjb252ZXJ0PVRydWUpOgorICAgICAgICAiIiJCb2R5LWVuY29kZSBhIHN0cmluZyBhbmQgY29udmVydCBpdCB0byBvdXRwdXRfY2hhcnNldC4KKworICAgICAgICBJZiBjb252ZXJ0IGlzIFRydWUgKHRoZSBkZWZhdWx0KSwgdGhlIHN0cmluZyB3aWxsIGJlIGNvbnZlcnRlZCBmcm9tCisgICAgICAgIHRoZSBpbnB1dCBjaGFyc2V0IHRvIG91dHB1dCBjaGFyc2V0IGF1dG9tYXRpY2FsbHkuICBVbmxpa2UKKyAgICAgICAgaGVhZGVyX2VuY29kZSgpLCB0aGVyZSBhcmUgbm8gaXNzdWVzIHdpdGggYnl0ZSBib3VuZGFyaWVzIGFuZAorICAgICAgICBtdWx0aWJ5dGUgY2hhcnNldHMgaW4gZW1haWwgYm9kaWVzLCBzbyB0aGlzIGlzIHVzdWFsbHkgcHJldHR5IHNhZmUuCisKKyAgICAgICAgVGhlIHR5cGUgb2YgZW5jb2RpbmcgKGJhc2U2NCBvciBxdW90ZWQtcHJpbnRhYmxlKSB3aWxsIGJlIGJhc2VkIG9uCisgICAgICAgIHNlbGYuYm9keV9lbmNvZGluZy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNvbnZlcnQ6CisgICAgICAgICAgICBzID0gc2VsZi5jb252ZXJ0KHMpCisgICAgICAgICMgN2JpdC84Yml0IGVuY29kaW5ncyByZXR1cm4gdGhlIHN0cmluZyB1bmNoYW5nZWQgKG1vZHVsZSBjb252ZXJzaW9ucykKKyAgICAgICAgaWYgc2VsZi5ib2R5X2VuY29kaW5nIGlzIEJBU0U2NDoKKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRtaW1lLmJvZHlfZW5jb2RlKHMpCisgICAgICAgIGVsaWYgc2VsZi5ib2R5X2VuY29kaW5nIGlzIFFQOgorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnF1b3ByaW1pbWUuYm9keV9lbmNvZGUocykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2NoYXJzZXQucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9jaGFyc2V0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWJmZjQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9jaGFyc2V0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2NoYXJzZXQucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9jaGFyc2V0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGRhYjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9jaGFyc2V0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2VuY29kZXJzLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9lbmNvZGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjQ1ZTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9lbmNvZGVycy5weQpAQCAtMCwwICsxLDgyIEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkVuY29kaW5ncyBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuIiIiCisKK19fYWxsX18gPSBbCisgICAgJ2VuY29kZV83b3I4Yml0JywKKyAgICAnZW5jb2RlX2Jhc2U2NCcsCisgICAgJ2VuY29kZV9ub29wJywKKyAgICAnZW5jb2RlX3F1b3ByaScsCisgICAgXQorCitpbXBvcnQgYmFzZTY0CisKK2Zyb20gcXVvcHJpIGltcG9ydCBlbmNvZGVzdHJpbmcgYXMgX2VuY29kZXN0cmluZworCisKKwwKK2RlZiBfcWVuY29kZShzKToKKyAgICBlbmMgPSBfZW5jb2Rlc3RyaW5nKHMsIHF1b3RldGFicz1UcnVlKQorICAgICMgTXVzdCBlbmNvZGUgc3BhY2VzLCB3aGljaCBxdW9wcmkuZW5jb2Rlc3RyaW5nKCkgZG9lc24ndCBkbworICAgIHJldHVybiBlbmMucmVwbGFjZSgnICcsICc9MjAnKQorCisKK2RlZiBfYmVuY29kZShzKToKKyAgICAjIFdlIGNhbid0IHF1aXRlIHVzZSBiYXNlNjQuZW5jb2Rlc3RyaW5nKCkgc2luY2UgaXQgdGFja3Mgb24gYSAiY291cnRlc3kKKyAgICAjIG5ld2xpbmUiLiAgQmxlY2ghCisgICAgaWYgbm90IHM6CisgICAgICAgIHJldHVybiBzCisgICAgaGFzbmV3bGluZSA9IChzWy0xXSA9PSAnXG4nKQorICAgIHZhbHVlID0gYmFzZTY0LmVuY29kZXN0cmluZyhzKQorICAgIGlmIG5vdCBoYXNuZXdsaW5lIGFuZCB2YWx1ZVstMV0gPT0gJ1xuJzoKKyAgICAgICAgcmV0dXJuIHZhbHVlWzotMV0KKyAgICByZXR1cm4gdmFsdWUKKworCisMCitkZWYgZW5jb2RlX2Jhc2U2NChtc2cpOgorICAgICIiIkVuY29kZSB0aGUgbWVzc2FnZSdzIHBheWxvYWQgaW4gQmFzZTY0LgorCisgICAgQWxzbywgYWRkIGFuIGFwcHJvcHJpYXRlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyLgorICAgICIiIgorICAgIG9yaWcgPSBtc2cuZ2V0X3BheWxvYWQoKQorICAgIGVuY2RhdGEgPSBfYmVuY29kZShvcmlnKQorICAgIG1zZy5zZXRfcGF5bG9hZChlbmNkYXRhKQorICAgIG1zZ1snQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddID0gJ2Jhc2U2NCcKKworCisMCitkZWYgZW5jb2RlX3F1b3ByaShtc2cpOgorICAgICIiIkVuY29kZSB0aGUgbWVzc2FnZSdzIHBheWxvYWQgaW4gcXVvdGVkLXByaW50YWJsZS4KKworICAgIEFsc28sIGFkZCBhbiBhcHByb3ByaWF0ZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGhlYWRlci4KKyAgICAiIiIKKyAgICBvcmlnID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICBlbmNkYXRhID0gX3FlbmNvZGUob3JpZykKKyAgICBtc2cuc2V0X3BheWxvYWQoZW5jZGF0YSkKKyAgICBtc2dbJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnXSA9ICdxdW90ZWQtcHJpbnRhYmxlJworCisKKwwKK2RlZiBlbmNvZGVfN29yOGJpdChtc2cpOgorICAgICIiIlNldCB0aGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIgdG8gN2JpdCBvciA4Yml0LiIiIgorICAgIG9yaWcgPSBtc2cuZ2V0X3BheWxvYWQoKQorICAgIGlmIG9yaWcgaXMgTm9uZToKKyAgICAgICAgIyBUaGVyZSdzIG5vIHBheWxvYWQuICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2UgdXNlIDdiaXQKKyAgICAgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAnN2JpdCcKKyAgICAgICAgcmV0dXJuCisgICAgIyBXZSBwbGF5IGEgdHJpY2sgdG8gbWFrZSB0aGlzIGdvIGZhc3QuICBJZiBlbmNvZGluZyB0byBBU0NJSSBzdWNjZWVkcywgd2UKKyAgICAjIGtub3cgdGhlIGRhdGEgbXVzdCBiZSA3Yml0LCBvdGhlcndpc2UgdHJlYXQgaXQgYXMgOGJpdC4KKyAgICB0cnk6CisgICAgICAgIG9yaWcuZW5jb2RlKCdhc2NpaScpCisgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAnOGJpdCcKKyAgICBlbHNlOgorICAgICAgICBtc2dbJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnXSA9ICc3Yml0JworCisKKwwKK2RlZiBlbmNvZGVfbm9vcChtc2cpOgorICAgICIiIkRvIG5vdGhpbmcuIiIiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2VuY29kZXJzLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvZW5jb2RlcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTU4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2VuY29kZXJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2VuY29kZXJzLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvZW5jb2RlcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTU4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2VuY29kZXJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2Vycm9ycy5weSBiL2xpYi9weXRob24yLjcvZW1haWwvZXJyb3JzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MmE2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2Vycm9ycy5weQpAQCAtMCwwICsxLDU3IEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiImVtYWlsIHBhY2thZ2UgZXhjZXB0aW9uIGNsYXNzZXMuIiIiCisKKworDAorY2xhc3MgTWVzc2FnZUVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgZXJyb3JzIGluIHRoZSBlbWFpbCBwYWNrYWdlLiIiIgorCisKK2NsYXNzIE1lc3NhZ2VQYXJzZUVycm9yKE1lc3NhZ2VFcnJvcik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgbWVzc2FnZSBwYXJzaW5nIGVycm9ycy4iIiIKKworCitjbGFzcyBIZWFkZXJQYXJzZUVycm9yKE1lc3NhZ2VQYXJzZUVycm9yKToKKyAgICAiIiJFcnJvciB3aGlsZSBwYXJzaW5nIGhlYWRlcnMuIiIiCisKKworY2xhc3MgQm91bmRhcnlFcnJvcihNZXNzYWdlUGFyc2VFcnJvcik6CisgICAgIiIiQ291bGRuJ3QgZmluZCB0ZXJtaW5hdGluZyBib3VuZGFyeS4iIiIKKworCitjbGFzcyBNdWx0aXBhcnRDb252ZXJzaW9uRXJyb3IoTWVzc2FnZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICIiIkNvbnZlcnNpb24gdG8gYSBtdWx0aXBhcnQgaXMgcHJvaGliaXRlZC4iIiIKKworCitjbGFzcyBDaGFyc2V0RXJyb3IoTWVzc2FnZUVycm9yKToKKyAgICAiIiJBbiBpbGxlZ2FsIGNoYXJzZXQgd2FzIGdpdmVuLiIiIgorCisKKwwKKyMgVGhlc2UgYXJlIHBhcnNpbmcgZGVmZWN0cyB3aGljaCB0aGUgcGFyc2VyIHdhcyBhYmxlIHRvIHdvcmsgYXJvdW5kLgorY2xhc3MgTWVzc2FnZURlZmVjdDoKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBhIG1lc3NhZ2UgZGVmZWN0LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmU9Tm9uZSk6CisgICAgICAgIHNlbGYubGluZSA9IGxpbmUKKworY2xhc3MgTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0KE1lc3NhZ2VEZWZlY3QpOgorICAgICIiIkEgbWVzc2FnZSBjbGFpbWVkIHRvIGJlIGEgbXVsdGlwYXJ0IGJ1dCBoYWQgbm8gYm91bmRhcnkgcGFyYW1ldGVyLiIiIgorCitjbGFzcyBTdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QoTWVzc2FnZURlZmVjdCk6CisgICAgIiIiVGhlIGNsYWltZWQgc3RhcnQgYm91bmRhcnkgd2FzIG5ldmVyIGZvdW5kLiIiIgorCitjbGFzcyBGaXJzdEhlYWRlckxpbmVJc0NvbnRpbnVhdGlvbkRlZmVjdChNZXNzYWdlRGVmZWN0KToKKyAgICAiIiJBIG1lc3NhZ2UgaGFkIGEgY29udGludWF0aW9uIGxpbmUgYXMgaXRzIGZpcnN0IGhlYWRlciBsaW5lLiIiIgorCitjbGFzcyBNaXNwbGFjZWRFbnZlbG9wZUhlYWRlckRlZmVjdChNZXNzYWdlRGVmZWN0KToKKyAgICAiIiJBICdVbml4LWZyb20nIGhlYWRlciB3YXMgZm91bmQgaW4gdGhlIG1pZGRsZSBvZiBhIGhlYWRlciBibG9jay4iIiIKKworY2xhc3MgTWFsZm9ybWVkSGVhZGVyRGVmZWN0KE1lc3NhZ2VEZWZlY3QpOgorICAgICIiIkZvdW5kIGEgaGVhZGVyIHRoYXQgd2FzIG1pc3NpbmcgYSBjb2xvbiwgb3Igd2FzIG90aGVyd2lzZSBtYWxmb3JtZWQuIiIiCisKK2NsYXNzIE11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdChNZXNzYWdlRGVmZWN0KToKKyAgICAiIiJBIG1lc3NhZ2UgY2xhaW1lZCB0byBiZSBhIG11bHRpcGFydCBidXQgbm8gc3VicGFydHMgd2VyZSBmb3VuZC4iIiIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvZXJyb3JzLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvZXJyb3JzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjA0ZTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9lcnJvcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvZXJyb3JzLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvZXJyb3JzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjA0ZTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9lcnJvcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvZmVlZHBhcnNlci5weSBiL2xpYi9weXRob24yLjcvZW1haWwvZmVlZHBhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWRiMjZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9mZWVkcGFyc2VyLnB5CkBAIC0wLDAgKzEsNDg0IEBACisjIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcnM6IEJheHRlciwgV291dGVycyBhbmQgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkZlZWRQYXJzZXIgLSBBbiBlbWFpbCBmZWVkIHBhcnNlci4KKworVGhlIGZlZWQgcGFyc2VyIGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIGZvciBpbmNyZW1lbnRhbGx5IHBhcnNpbmcgYW4gZW1haWwKK21lc3NhZ2UsIGxpbmUgYnkgbGluZS4gIFRoaXMgaGFzIGFkdmFudGFnZXMgZm9yIGNlcnRhaW4gYXBwbGljYXRpb25zLCBzdWNoIGFzCit0aG9zZSByZWFkaW5nIGVtYWlsIG1lc3NhZ2VzIG9mZiBhIHNvY2tldC4KKworRmVlZFBhcnNlci5mZWVkKCkgaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGZvciBwdXNoaW5nIG5ldyBkYXRhIGludG8gdGhlCitwYXJzZXIuICBJdCByZXR1cm5zIHdoZW4gdGhlcmUncyBub3RoaW5nIG1vcmUgaXQgY2FuIGRvIHdpdGggdGhlIGF2YWlsYWJsZQorZGF0YS4gIFdoZW4geW91IGhhdmUgbm8gbW9yZSBkYXRhIHRvIHB1c2ggaW50byB0aGUgcGFyc2VyLCBjYWxsIC5jbG9zZSgpLgorVGhpcyBjb21wbGV0ZXMgdGhlIHBhcnNpbmcgYW5kIHJldHVybnMgdGhlIHJvb3QgbWVzc2FnZSBvYmplY3QuCisKK1RoZSBvdGhlciBhZHZhbnRhZ2Ugb2YgdGhpcyBwYXJzZXIgaXMgdGhhdCBpdCB3aWxsIG5ldmVyIHJhaXNlIGEgcGFyc2luZworZXhjZXB0aW9uLiAgSW5zdGVhZCwgd2hlbiBpdCBmaW5kcyBzb21ldGhpbmcgdW5leHBlY3RlZCwgaXQgYWRkcyBhICdkZWZlY3QnIHRvCit0aGUgY3VycmVudCBtZXNzYWdlLiAgRGVmZWN0cyBhcmUganVzdCBpbnN0YW5jZXMgdGhhdCBsaXZlIG9uIHRoZSBtZXNzYWdlCitvYmplY3QncyAuZGVmZWN0cyBhdHRyaWJ1dGUuCisiIiIKKworX19hbGxfXyA9IFsnRmVlZFBhcnNlciddCisKK2ltcG9ydCByZQorCitmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKK2Zyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2UKKworTkxDUkUgPSByZS5jb21waWxlKCdcclxufFxyfFxuJykKK05MQ1JFX2JvbCA9IHJlLmNvbXBpbGUoJyhcclxufFxyfFxuKScpCitOTENSRV9lb2wgPSByZS5jb21waWxlKCcoXHJcbnxccnxcbilcWicpCitOTENSRV9jcmFjayA9IHJlLmNvbXBpbGUoJyhcclxufFxyfFxuKScpCisjIFJGQyAyODIyICQzLjYuOCBPcHRpb25hbCBmaWVsZHMuICBmdGV4dCBpcyAlZDMzLTU3IC8gJWQ1OS0xMjYsIEFueSBjaGFyYWN0ZXIKKyMgZXhjZXB0IGNvbnRyb2xzLCBTUCwgYW5kICI6Ii4KK2hlYWRlclJFID0gcmUuY29tcGlsZShyJ14oRnJvbSB8W1wwNDEtXDA3MVwwNzMtXDE3Nl17MSx9OnxbXHQgXSknKQorRU1QVFlTVFJJTkcgPSAnJworTkwgPSAnXG4nCisKK05lZWRNb3JlRGF0YSA9IG9iamVjdCgpCisKKworDAorY2xhc3MgQnVmZmVyZWRTdWJGaWxlKG9iamVjdCk6CisgICAgIiIiQSBmaWxlLWlzaCBvYmplY3QgdGhhdCBjYW4gaGF2ZSBuZXcgZGF0YSBsb2FkZWQgaW50byBpdC4KKworICAgIFlvdSBjYW4gYWxzbyBwdXNoIGFuZCBwb3AgbGluZS1tYXRjaGluZyBwcmVkaWNhdGVzIG9udG8gYSBzdGFjay4gIFdoZW4gdGhlCisgICAgY3VycmVudCBwcmVkaWNhdGUgbWF0Y2hlcyB0aGUgY3VycmVudCBsaW5lLCBhIGZhbHNlIEVPRiByZXNwb25zZQorICAgIChpLmUuIGVtcHR5IHN0cmluZykgaXMgcmV0dXJuZWQgaW5zdGVhZC4gIFRoaXMgbGV0cyB0aGUgcGFyc2VyIGFkaGVyZSB0byBhCisgICAgc2ltcGxlIGFic3RyYWN0aW9uIC0tIGl0IHBhcnNlcyB1bnRpbCBFT0YgY2xvc2VzIHRoZSBjdXJyZW50IG1lc3NhZ2UuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIFRoZSBsYXN0IHBhcnRpYWwgbGluZSBwdXNoZWQgaW50byB0aGlzIG9iamVjdC4KKyAgICAgICAgc2VsZi5fcGFydGlhbCA9ICcnCisgICAgICAgICMgVGhlIGxpc3Qgb2YgZnVsbCwgcHVzaGVkIGxpbmVzLCBpbiByZXZlcnNlIG9yZGVyCisgICAgICAgIHNlbGYuX2xpbmVzID0gW10KKyAgICAgICAgIyBUaGUgc3RhY2sgb2YgZmFsc2UtRU9GIGNoZWNraW5nIHByZWRpY2F0ZXMuCisgICAgICAgIHNlbGYuX2VvZnN0YWNrID0gW10KKyAgICAgICAgIyBBIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmaWxlIGhhcyBiZWVuIGNsb3NlZCBvciBub3QuCisgICAgICAgIHNlbGYuX2Nsb3NlZCA9IEZhbHNlCisKKyAgICBkZWYgcHVzaF9lb2ZfbWF0Y2hlcihzZWxmLCBwcmVkKToKKyAgICAgICAgc2VsZi5fZW9mc3RhY2suYXBwZW5kKHByZWQpCisKKyAgICBkZWYgcG9wX2VvZl9tYXRjaGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZW9mc3RhY2sucG9wKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIyBEb24ndCBmb3JnZXQgYW55IHRyYWlsaW5nIHBhcnRpYWwgbGluZS4KKyAgICAgICAgc2VsZi5fbGluZXMuYXBwZW5kKHNlbGYuX3BhcnRpYWwpCisgICAgICAgIHNlbGYuX3BhcnRpYWwgPSAnJworICAgICAgICBzZWxmLl9jbG9zZWQgPSBUcnVlCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9saW5lczoKKyAgICAgICAgICAgIGlmIHNlbGYuX2Nsb3NlZDoKKyAgICAgICAgICAgICAgICByZXR1cm4gJycKKyAgICAgICAgICAgIHJldHVybiBOZWVkTW9yZURhdGEKKyAgICAgICAgIyBQb3AgdGhlIGxpbmUgb2ZmIHRoZSBzdGFjayBhbmQgc2VlIGlmIGl0IG1hdGNoZXMgdGhlIGN1cnJlbnQKKyAgICAgICAgIyBmYWxzZS1FT0YgcHJlZGljYXRlLgorICAgICAgICBsaW5lID0gc2VsZi5fbGluZXMucG9wKCkKKyAgICAgICAgIyBSRkMgMjA0Niwgc2VjdGlvbiA1LjEuMiByZXF1aXJlcyB1cyB0byByZWNvZ25pemUgb3V0ZXIgbGV2ZWwKKyAgICAgICAgIyBib3VuZGFyaWVzIGF0IGFueSBsZXZlbCBvZiBpbm5lciBuZXN0aW5nLiAgRG8gdGhpcywgYnV0IGJlIHN1cmUgaXQncworICAgICAgICAjIGluIHRoZSBvcmRlciBvZiBtb3N0IHRvIGxlYXN0IG5lc3RlZC4KKyAgICAgICAgZm9yIGF0ZW9mIGluIHNlbGYuX2VvZnN0YWNrWzo6LTFdOgorICAgICAgICAgICAgaWYgYXRlb2YobGluZSk6CisgICAgICAgICAgICAgICAgIyBXZSdyZSBhdCB0aGUgZmFsc2UgRU9GLiAgQnV0IHB1c2ggdGhlIGxhc3QgbGluZSBiYWNrIGZpcnN0LgorICAgICAgICAgICAgICAgIHNlbGYuX2xpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICByZXR1cm4gbGluZQorCisgICAgZGVmIHVucmVhZGxpbmUoc2VsZiwgbGluZSk6CisgICAgICAgICMgTGV0IHRoZSBjb25zdW1lciBwdXNoIGEgbGluZSBiYWNrIGludG8gdGhlIGJ1ZmZlci4KKyAgICAgICAgYXNzZXJ0IGxpbmUgaXMgbm90IE5lZWRNb3JlRGF0YQorICAgICAgICBzZWxmLl9saW5lcy5hcHBlbmQobGluZSkKKworICAgIGRlZiBwdXNoKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiJQdXNoIHNvbWUgbmV3IGRhdGEgaW50byB0aGlzIG9iamVjdC4iIiIKKyAgICAgICAgIyBIYW5kbGUgYW55IHByZXZpb3VzIGxlZnRvdmVycworICAgICAgICBkYXRhLCBzZWxmLl9wYXJ0aWFsID0gc2VsZi5fcGFydGlhbCArIGRhdGEsICcnCisgICAgICAgICMgQ3JhY2sgaW50byBsaW5lcywgYnV0IHByZXNlcnZlIHRoZSBuZXdsaW5lcyBvbiB0aGUgZW5kIG9mIGVhY2gKKyAgICAgICAgcGFydHMgPSBOTENSRV9jcmFjay5zcGxpdChkYXRhKQorICAgICAgICAjIFRoZSAqYWhlbSogaW50ZXJlc3RpbmcgYmVoYXZpb3VyIG9mIHJlLnNwbGl0IHdoZW4gc3VwcGxpZWQgZ3JvdXBpbmcKKyAgICAgICAgIyBwYXJlbnRoZXNlcyBpcyB0aGF0IHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHJlc3VsdGluZyBsaXN0IGlzIHRoZQorICAgICAgICAjIGRhdGEgYWZ0ZXIgdGhlIGZpbmFsIFJFLiAgSW4gdGhlIGNhc2Ugb2YgYSBOTC9DUiB0ZXJtaW5hdGVkIHN0cmluZywKKyAgICAgICAgIyB0aGlzIGlzIHRoZSBlbXB0eSBzdHJpbmcuCisgICAgICAgIHNlbGYuX3BhcnRpYWwgPSBwYXJ0cy5wb3AoKQorICAgICAgICAjR0FOIDI5TWFyMDkgIGJ1Z3MgMTU1NTU3MCwgMTcyMTg2MiAgQ29uZnVzaW9uIGF0IDhLIGJvdW5kYXJ5IGVuZGluZyB3aXRoIFxyOgorICAgICAgICAjIGlzIHRoZXJlIGEgXG4gdG8gZm9sbG93IGxhdGVyPworICAgICAgICBpZiBub3Qgc2VsZi5fcGFydGlhbCBhbmQgcGFydHMgYW5kIHBhcnRzWy0xXS5lbmRzd2l0aCgnXHInKToKKyAgICAgICAgICAgIHNlbGYuX3BhcnRpYWwgPSBwYXJ0cy5wb3AoLTIpK3BhcnRzLnBvcCgpCisgICAgICAgICMgcGFydHMgaXMgYSBsaXN0IG9mIHN0cmluZ3MsIGFsdGVybmF0aW5nIGJldHdlZW4gdGhlIGxpbmUgY29udGVudHMKKyAgICAgICAgIyBhbmQgdGhlIGVvbCBjaGFyYWN0ZXIocykuICBHYXRoZXIgdXAgYSBsaXN0IG9mIGxpbmVzIGFmdGVyCisgICAgICAgICMgcmUtYXR0YWNoaW5nIHRoZSBuZXdsaW5lcy4KKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4ocGFydHMpIC8vIDIpOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHBhcnRzW2kqMl0gKyBwYXJ0c1tpKjIrMV0pCisgICAgICAgIHNlbGYucHVzaGxpbmVzKGxpbmVzKQorCisgICAgZGVmIHB1c2hsaW5lcyhzZWxmLCBsaW5lcyk6CisgICAgICAgICMgUmV2ZXJzZSBhbmQgaW5zZXJ0IGF0IHRoZSBmcm9udCBvZiB0aGUgbGluZXMuCisgICAgICAgIHNlbGYuX2xpbmVzWzowXSA9IGxpbmVzWzo6LTFdCisKKyAgICBkZWYgaXNfY2xvc2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2xvc2VkCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICBpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICByZXR1cm4gbGluZQorCisKKwwKK2NsYXNzIEZlZWRQYXJzZXI6CisgICAgIiIiQSBmZWVkLXN0eWxlIHBhcnNlciBvZiBlbWFpbC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfZmFjdG9yeT1tZXNzYWdlLk1lc3NhZ2UpOgorICAgICAgICAiIiJfZmFjdG9yeSBpcyBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHMgdG8gY3JlYXRlIGEgbmV3IG1lc3NhZ2Ugb2JqIiIiCisgICAgICAgIHNlbGYuX2ZhY3RvcnkgPSBfZmFjdG9yeQorICAgICAgICBzZWxmLl9pbnB1dCA9IEJ1ZmZlcmVkU3ViRmlsZSgpCisgICAgICAgIHNlbGYuX21zZ3N0YWNrID0gW10KKyAgICAgICAgc2VsZi5fcGFyc2UgPSBzZWxmLl9wYXJzZWdlbigpLm5leHQKKyAgICAgICAgc2VsZi5fY3VyID0gTm9uZQorICAgICAgICBzZWxmLl9sYXN0ID0gTm9uZQorICAgICAgICBzZWxmLl9oZWFkZXJzb25seSA9IEZhbHNlCisKKyAgICAjIE5vbi1wdWJsaWMgaW50ZXJmYWNlIGZvciBzdXBwb3J0aW5nIFBhcnNlcidzIGhlYWRlcnNvbmx5IGZsYWcKKyAgICBkZWYgX3NldF9oZWFkZXJzb25seShzZWxmKToKKyAgICAgICAgc2VsZi5faGVhZGVyc29ubHkgPSBUcnVlCisKKyAgICBkZWYgZmVlZChzZWxmLCBkYXRhKToKKyAgICAgICAgIiIiUHVzaCBtb3JlIGRhdGEgaW50byB0aGUgcGFyc2VyLiIiIgorICAgICAgICBzZWxmLl9pbnB1dC5wdXNoKGRhdGEpCisgICAgICAgIHNlbGYuX2NhbGxfcGFyc2UoKQorCisgICAgZGVmIF9jYWxsX3BhcnNlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9wYXJzZSgpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhbGwgcmVtYWluaW5nIGRhdGEgYW5kIHJldHVybiB0aGUgcm9vdCBtZXNzYWdlIG9iamVjdC4iIiIKKyAgICAgICAgc2VsZi5faW5wdXQuY2xvc2UoKQorICAgICAgICBzZWxmLl9jYWxsX3BhcnNlKCkKKyAgICAgICAgcm9vdCA9IHNlbGYuX3BvcF9tZXNzYWdlKCkKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLl9tc2dzdGFjaworICAgICAgICAjIExvb2sgZm9yIGZpbmFsIHNldCBvZiBkZWZlY3RzCisgICAgICAgIGlmIHJvb3QuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSA9PSAnbXVsdGlwYXJ0JyBcCisgICAgICAgICAgICAgICBhbmQgbm90IHJvb3QuaXNfbXVsdGlwYXJ0KCk6CisgICAgICAgICAgICByb290LmRlZmVjdHMuYXBwZW5kKGVycm9ycy5NdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3QoKSkKKyAgICAgICAgcmV0dXJuIHJvb3QKKworICAgIGRlZiBfbmV3X21lc3NhZ2Uoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX2ZhY3RvcnkoKQorICAgICAgICBpZiBzZWxmLl9jdXIgYW5kIHNlbGYuX2N1ci5nZXRfY29udGVudF90eXBlKCkgPT0gJ211bHRpcGFydC9kaWdlc3QnOgorICAgICAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgaWYgc2VsZi5fbXNnc3RhY2s6CisgICAgICAgICAgICBzZWxmLl9tc2dzdGFja1stMV0uYXR0YWNoKG1zZykKKyAgICAgICAgc2VsZi5fbXNnc3RhY2suYXBwZW5kKG1zZykKKyAgICAgICAgc2VsZi5fY3VyID0gbXNnCisgICAgICAgIHNlbGYuX2xhc3QgPSBtc2cKKworICAgIGRlZiBfcG9wX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIHJldHZhbCA9IHNlbGYuX21zZ3N0YWNrLnBvcCgpCisgICAgICAgIGlmIHNlbGYuX21zZ3N0YWNrOgorICAgICAgICAgICAgc2VsZi5fY3VyID0gc2VsZi5fbXNnc3RhY2tbLTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9jdXIgPSBOb25lCisgICAgICAgIHJldHVybiByZXR2YWwKKworICAgIGRlZiBfcGFyc2VnZW4oc2VsZik6CisgICAgICAgICMgQ3JlYXRlIGEgbmV3IG1lc3NhZ2UgYW5kIHN0YXJ0IGJ5IHBhcnNpbmcgaGVhZGVycy4KKyAgICAgICAgc2VsZi5fbmV3X21lc3NhZ2UoKQorICAgICAgICBoZWFkZXJzID0gW10KKyAgICAgICAgIyBDb2xsZWN0IHRoZSBoZWFkZXJzLCBzZWFyY2hpbmcgZm9yIGEgbGluZSB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIFJGQworICAgICAgICAjIDI4MjIgaGVhZGVyIG9yIGNvbnRpbnVhdGlvbiBwYXR0ZXJuIChpbmNsdWRpbmcgYW4gZW1wdHkgbGluZSkuCisgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2lucHV0OgorICAgICAgICAgICAgaWYgbGluZSBpcyBOZWVkTW9yZURhdGE6CisgICAgICAgICAgICAgICAgeWllbGQgTmVlZE1vcmVEYXRhCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5vdCBoZWFkZXJSRS5tYXRjaChsaW5lKToKKyAgICAgICAgICAgICAgICAjIElmIHdlIHNhdyB0aGUgUkZDIGRlZmluZWQgaGVhZGVyL2JvZHkgc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgIyAoaS5lLiBuZXdsaW5lKSwganVzdCB0aHJvdyBpdCBhd2F5LiBPdGhlcndpc2UgdGhlIGxpbmUgaXMKKyAgICAgICAgICAgICAgICAjIHBhcnQgb2YgdGhlIGJvZHkgc28gcHVzaCBpdCBiYWNrLgorICAgICAgICAgICAgICAgIGlmIG5vdCBOTENSRS5tYXRjaChsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5wdXQudW5yZWFkbGluZShsaW5lKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBoZWFkZXJzLmFwcGVuZChsaW5lKQorICAgICAgICAjIERvbmUgd2l0aCB0aGUgaGVhZGVycywgc28gcGFyc2UgdGhlbSBhbmQgZmlndXJlIG91dCB3aGF0IHdlJ3JlCisgICAgICAgICMgc3VwcG9zZWQgdG8gc2VlIGluIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLgorICAgICAgICBzZWxmLl9wYXJzZV9oZWFkZXJzKGhlYWRlcnMpCisgICAgICAgICMgSGVhZGVycy1vbmx5IHBhcnNpbmcgaXMgYSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBoYWNrLCB3aGljaCB3YXMKKyAgICAgICAgIyBuZWNlc3NhcnkgaW4gdGhlIG9sZGVyIHBhcnNlciwgd2hpY2ggY291bGQgcmFpc2UgZXJyb3JzLiAgQWxsCisgICAgICAgICMgcmVtYWluaW5nIGxpbmVzIGluIHRoZSBpbnB1dCBhcmUgdGhyb3duIGludG8gdGhlIG1lc3NhZ2UgYm9keS4KKyAgICAgICAgaWYgc2VsZi5faGVhZGVyc29ubHk6CisgICAgICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9pbnB1dC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbGluZSBpcyBOZWVkTW9yZURhdGE6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICBzZWxmLl9jdXIuc2V0X3BheWxvYWQoRU1QVFlTVFJJTkcuam9pbihsaW5lcykpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fY3VyLmdldF9jb250ZW50X3R5cGUoKSA9PSAnbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMnOgorICAgICAgICAgICAgIyBtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cyBjb250YWlucyBibG9ja3Mgb2YgaGVhZGVycyBzZXBhcmF0ZWQgYnkKKyAgICAgICAgICAgICMgYSBibGFuayBsaW5lLiAgV2UnbGwgcmVwcmVzZW50IGVhY2ggaGVhZGVyIGJsb2NrIGFzIGEgc2VwYXJhdGUKKyAgICAgICAgICAgICMgbmVzdGVkIG1lc3NhZ2Ugb2JqZWN0LCBidXQgdGhlIHByb2Nlc3NpbmcgaXMgYSBiaXQgZGlmZmVyZW50CisgICAgICAgICAgICAjIHRoYW4gc3RhbmRhcmQgbWVzc2FnZS8qIHR5cGVzIGJlY2F1c2UgdGhlcmUgaXMgbm8gYm9keSBmb3IgdGhlCisgICAgICAgICAgICAjIG5lc3RlZCBtZXNzYWdlcy4gIEEgYmxhbmsgbGluZSBzZXBhcmF0ZXMgdGhlIHN1YnBhcnRzLgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dC5wdXNoX2VvZl9tYXRjaGVyKE5MQ1JFLm1hdGNoKQorICAgICAgICAgICAgICAgIGZvciByZXR2YWwgaW4gc2VsZi5fcGFyc2VnZW4oKToKKyAgICAgICAgICAgICAgICAgICAgaWYgcmV0dmFsIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLl9wb3BfbWVzc2FnZSgpCisgICAgICAgICAgICAgICAgIyBXZSBuZWVkIHRvIHBvcCB0aGUgRU9GIG1hdGNoZXIgaW4gb3JkZXIgdG8gdGVsbCBpZiB3ZSdyZSBhdAorICAgICAgICAgICAgICAgICMgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBmaWxlLCBub3QgdGhlIGVuZCBvZiB0aGUgbGFzdCBibG9jaworICAgICAgICAgICAgICAgICMgb2YgbWVzc2FnZSBoZWFkZXJzLgorICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0LnBvcF9lb2ZfbWF0Y2hlcigpCisgICAgICAgICAgICAgICAgIyBUaGUgaW5wdXQgc3RyZWFtIG11c3QgYmUgc2l0dGluZyBhdCB0aGUgbmV3bGluZSBvciBhdCB0aGUKKyAgICAgICAgICAgICAgICAjIEVPRi4gIFdlIHdhbnQgdG8gc2VlIGlmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhpcyBzdWJwYXJ0LCBzbworICAgICAgICAgICAgICAgICMgZmlyc3QgY29uc3VtZSB0aGUgYmxhbmsgbGluZSwgdGhlbiB0ZXN0IHRoZSBuZXh0IGxpbmUgdG8gc2VlCisgICAgICAgICAgICAgICAgIyBpZiB3ZSdyZSBhdCB0aGlzIHN1YnBhcnQncyBFT0YuCisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuX2lucHV0LnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZSBpcyBOZWVkTW9yZURhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuX2lucHV0LnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZSBpcyBOZWVkTW9yZURhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAjIE5vdCBhdCBFT0Ygc28gdGhpcyBpcyBhIGxpbmUgd2UncmUgZ29pbmcgdG8gbmVlZC4KKyAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dC51bnJlYWRsaW5lKGxpbmUpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fY3VyLmdldF9jb250ZW50X21haW50eXBlKCkgPT0gJ21lc3NhZ2UnOgorICAgICAgICAgICAgIyBUaGUgbWVzc2FnZSBjbGFpbXMgdG8gYmUgYSBtZXNzYWdlLyogdHlwZSwgdGhlbiB3aGF0IGZvbGxvd3MgaXMKKyAgICAgICAgICAgICMgYW5vdGhlciBSRkMgMjgyMiBtZXNzYWdlLgorICAgICAgICAgICAgZm9yIHJldHZhbCBpbiBzZWxmLl9wYXJzZWdlbigpOgorICAgICAgICAgICAgICAgIGlmIHJldHZhbCBpcyBOZWVkTW9yZURhdGE6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzZWxmLl9wb3BfbWVzc2FnZSgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fY3VyLmdldF9jb250ZW50X21haW50eXBlKCkgPT0gJ211bHRpcGFydCc6CisgICAgICAgICAgICBib3VuZGFyeSA9IHNlbGYuX2N1ci5nZXRfYm91bmRhcnkoKQorICAgICAgICAgICAgaWYgYm91bmRhcnkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIFRoZSBtZXNzYWdlIC9jbGFpbXMvIHRvIGJlIGEgbXVsdGlwYXJ0IGJ1dCBpdCBoYXMgbm90CisgICAgICAgICAgICAgICAgIyBkZWZpbmVkIGEgYm91bmRhcnkuICBUaGF0J3MgYSBwcm9ibGVtIHdoaWNoIHdlJ2xsIGhhbmRsZSBieQorICAgICAgICAgICAgICAgICMgcmVhZGluZyBldmVyeXRoaW5nIHVudGlsIHRoZSBFT0YgYW5kIG1hcmtpbmcgdGhlIG1lc3NhZ2UgYXMKKyAgICAgICAgICAgICAgICAjIGRlZmVjdGl2ZS4KKyAgICAgICAgICAgICAgICBzZWxmLl9jdXIuZGVmZWN0cy5hcHBlbmQoZXJyb3JzLk5vQm91bmRhcnlJbk11bHRpcGFydERlZmVjdCgpKQorICAgICAgICAgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLl9pbnB1dDoKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZSBpcyBOZWVkTW9yZURhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5zZXRfcGF5bG9hZChFTVBUWVNUUklORy5qb2luKGxpbmVzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICMgQ3JlYXRlIGEgbGluZSBtYXRjaCBwcmVkaWNhdGUgd2hpY2ggbWF0Y2hlcyB0aGUgaW50ZXItcGFydAorICAgICAgICAgICAgIyBib3VuZGFyeSBhcyB3ZWxsIGFzIHRoZSBlbmQtb2YtbXVsdGlwYXJ0IGJvdW5kYXJ5LiAgRG9uJ3QgcHVzaAorICAgICAgICAgICAgIyB0aGlzIG9udG8gdGhlIGlucHV0IHN0cmVhbSB1bnRpbCB3ZSd2ZSBzY2FubmVkIHBhc3QgdGhlCisgICAgICAgICAgICAjIHByZWFtYmxlLgorICAgICAgICAgICAgc2VwYXJhdG9yID0gJy0tJyArIGJvdW5kYXJ5CisgICAgICAgICAgICBib3VuZGFyeXJlID0gcmUuY29tcGlsZSgKKyAgICAgICAgICAgICAgICAnKD9QPHNlcD4nICsgcmUuZXNjYXBlKHNlcGFyYXRvcikgKworICAgICAgICAgICAgICAgIHInKSg/UDxlbmQ+LS0pPyg/UDx3cz5bIFx0XSopKD9QPGxpbmVzZXA+XHJcbnxccnxcbik/JCcpCisgICAgICAgICAgICBjYXB0dXJpbmdfcHJlYW1ibGUgPSBUcnVlCisgICAgICAgICAgICBwcmVhbWJsZSA9IFtdCisgICAgICAgICAgICBsaW5lc2VwID0gRmFsc2UKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuX2lucHV0LnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgTmVlZE1vcmVEYXRhCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBtbyA9IGJvdW5kYXJ5cmUubWF0Y2gobGluZSkKKyAgICAgICAgICAgICAgICBpZiBtbzoKKyAgICAgICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSBsb29raW5nIGF0IHRoZSBlbmQgYm91bmRhcnksIHdlJ3JlIGRvbmUgd2l0aAorICAgICAgICAgICAgICAgICAgICAjIHRoaXMgbXVsdGlwYXJ0LiAgSWYgdGhlcmUgd2FzIGEgbmV3bGluZSBhdCB0aGUgZW5kIG9mCisgICAgICAgICAgICAgICAgICAgICMgdGhlIGNsb3NpbmcgYm91bmRhcnksIHRoZW4gd2UgbmVlZCB0byBpbml0aWFsaXplIHRoZQorICAgICAgICAgICAgICAgICAgICAjIGVwaWxvZ3VlIHdpdGggdGhlIGVtcHR5IHN0cmluZyAoc2VlIGJlbG93KS4KKyAgICAgICAgICAgICAgICAgICAgaWYgbW8uZ3JvdXAoJ2VuZCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNlcCA9IG1vLmdyb3VwKCdsaW5lc2VwJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICMgV2Ugc2F3IGFuIGludGVyLXBhcnQgYm91bmRhcnkuICBXZXJlIHdlIGluIHRoZSBwcmVhbWJsZT8KKyAgICAgICAgICAgICAgICAgICAgaWYgY2FwdHVyaW5nX3ByZWFtYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJlYW1ibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBY2NvcmRpbmcgdG8gUkZDIDIwNDYsIHRoZSBsYXN0IG5ld2xpbmUgYmVsb25ncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdG8gdGhlIGJvdW5kYXJ5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RsaW5lID0gcHJlYW1ibGVbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW9sbW8gPSBOTENSRV9lb2wuc2VhcmNoKGxhc3RsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVvbG1vOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbWJsZVstMV0gPSBsYXN0bGluZVs6LWxlbihlb2xtby5ncm91cCgwKSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY3VyLnByZWFtYmxlID0gRU1QVFlTVFJJTkcuam9pbihwcmVhbWJsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmluZ19wcmVhbWJsZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dC51bnJlYWRsaW5lKGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAjIFdlIHNhdyBhIGJvdW5kYXJ5IHNlcGFyYXRpbmcgdHdvIHBhcnRzLiAgQ29uc3VtZSBhbnkKKyAgICAgICAgICAgICAgICAgICAgIyBtdWx0aXBsZSBib3VuZGFyeSBsaW5lcyB0aGF0IG1heSBiZSBmb2xsb3dpbmcuICBPdXIKKyAgICAgICAgICAgICAgICAgICAgIyBpbnRlcnByZXRhdGlvbiBvZiBSRkMgMjA0NiBCTkYgZ3JhbW1hciBkb2VzIG5vdCBwcm9kdWNlCisgICAgICAgICAgICAgICAgICAgICMgYm9keSBwYXJ0cyB3aXRoaW4gc3VjaCBkb3VibGUgYm91bmRhcmllcy4KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9pbnB1dC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgbW8gPSBib3VuZGFyeXJlLm1hdGNoKGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbW86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5wdXQudW5yZWFkbGluZShsaW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICMgUmVjdXJzZSB0byBwYXJzZSB0aGlzIHN1YnBhcnQ7IHRoZSBpbnB1dCBzdHJlYW0gcG9pbnRzCisgICAgICAgICAgICAgICAgICAgICMgYXQgdGhlIHN1YnBhcnQncyBmaXJzdCBsaW5lLgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dC5wdXNoX2VvZl9tYXRjaGVyKGJvdW5kYXJ5cmUubWF0Y2gpCisgICAgICAgICAgICAgICAgICAgIGZvciByZXR2YWwgaW4gc2VsZi5fcGFyc2VnZW4oKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJldHZhbCBpcyBOZWVkTW9yZURhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgTmVlZE1vcmVEYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICMgQmVjYXVzZSBvZiBSRkMgMjA0NiwgdGhlIG5ld2xpbmUgcHJlY2VkaW5nIHRoZSBib3VuZGFyeQorICAgICAgICAgICAgICAgICAgICAjIHNlcGFyYXRvciBhY3R1YWxseSBiZWxvbmdzIHRvIHRoZSBib3VuZGFyeSwgbm90IHRoZQorICAgICAgICAgICAgICAgICAgICAjIHByZXZpb3VzIHN1YnBhcnQncyBwYXlsb2FkIChvciBlcGlsb2d1ZSBpZiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgIyBwYXJ0IGlzIGEgbXVsdGlwYXJ0KS4KKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fbGFzdC5nZXRfY29udGVudF9tYWludHlwZSgpID09ICdtdWx0aXBhcnQnOgorICAgICAgICAgICAgICAgICAgICAgICAgZXBpbG9ndWUgPSBzZWxmLl9sYXN0LmVwaWxvZ3VlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcGlsb2d1ZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0LmVwaWxvZ3VlID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBlcGlsb2d1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbyA9IE5MQ1JFX2VvbC5zZWFyY2goZXBpbG9ndWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbW86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGxlbihtby5ncm91cCgwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGFzdC5lcGlsb2d1ZSA9IGVwaWxvZ3VlWzotZW5kXQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHNlbGYuX2xhc3QuZ2V0X3BheWxvYWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXlsb2FkLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbyA9IE5MQ1JFX2VvbC5zZWFyY2gocGF5bG9hZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtbzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHBheWxvYWRbOi1sZW4obW8uZ3JvdXAoMCkpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0LnNldF9wYXlsb2FkKHBheWxvYWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0LnBvcF9lb2ZfbWF0Y2hlcigpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BvcF9tZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgIyBTZXQgdGhlIG11bHRpcGFydCB1cCBmb3IgbmV3bGluZSBjbGVhbnNpbmcsIHdoaWNoIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgIyBoYXBwZW4gaWYgd2UncmUgaW4gYSBuZXN0ZWQgbXVsdGlwYXJ0LgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0ID0gc2VsZi5fY3VyCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBJIHRoaW5rIHdlIG11c3QgYmUgaW4gdGhlIHByZWFtYmxlCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBjYXB0dXJpbmdfcHJlYW1ibGUKKyAgICAgICAgICAgICAgICAgICAgcHJlYW1ibGUuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICAjIFdlJ3ZlIHNlZW4gZWl0aGVyIHRoZSBFT0Ygb3IgdGhlIGVuZCBib3VuZGFyeS4gIElmIHdlJ3JlIHN0aWxsCisgICAgICAgICAgICAjIGNhcHR1cmluZyB0aGUgcHJlYW1ibGUsIHdlIG5ldmVyIHNhdyB0aGUgc3RhcnQgYm91bmRhcnkuICBOb3RlCisgICAgICAgICAgICAjIHRoYXQgYXMgYSBkZWZlY3QgYW5kIHN0b3JlIHRoZSBjYXB0dXJlZCB0ZXh0IGFzIHRoZSBwYXlsb2FkLgorICAgICAgICAgICAgIyBFdmVyeXRoaW5nIGZyb20gaGVyZSB0byB0aGUgRU9GIGlzIGVwaWxvZ3VlLgorICAgICAgICAgICAgaWYgY2FwdHVyaW5nX3ByZWFtYmxlOgorICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChlcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KCkpCisgICAgICAgICAgICAgICAgc2VsZi5fY3VyLnNldF9wYXlsb2FkKEVNUFRZU1RSSU5HLmpvaW4ocHJlYW1ibGUpKQorICAgICAgICAgICAgICAgIGVwaWxvZ3VlID0gW10KKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLl9pbnB1dDoKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZSBpcyBOZWVkTW9yZURhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgc2VsZi5fY3VyLmVwaWxvZ3VlID0gRU1QVFlTVFJJTkcuam9pbihlcGlsb2d1ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICMgSWYgdGhlIGVuZCBib3VuZGFyeSBlbmRlZCBpbiBhIG5ld2xpbmUsIHdlJ2xsIG5lZWQgdG8gbWFrZSBzdXJlCisgICAgICAgICAgICAjIHRoZSBlcGlsb2d1ZSBpc24ndCBOb25lCisgICAgICAgICAgICBpZiBsaW5lc2VwOgorICAgICAgICAgICAgICAgIGVwaWxvZ3VlID0gWycnXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlcGlsb2d1ZSA9IFtdCisgICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLl9pbnB1dDoKKyAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgTmVlZE1vcmVEYXRhCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZXBpbG9ndWUuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICAjIEFueSBDUkxGIGF0IHRoZSBmcm9udCBvZiB0aGUgZXBpbG9ndWUgaXMgbm90IHRlY2huaWNhbGx5IHBhcnQgb2YKKyAgICAgICAgICAgICMgdGhlIGVwaWxvZ3VlLiAgQWxzbywgd2F0Y2ggb3V0IGZvciBhbiBlbXB0eSBzdHJpbmcgZXBpbG9ndWUsCisgICAgICAgICAgICAjIHdoaWNoIG1lYW5zIGEgc2luZ2xlIG5ld2xpbmUuCisgICAgICAgICAgICBpZiBlcGlsb2d1ZToKKyAgICAgICAgICAgICAgICBmaXJzdGxpbmUgPSBlcGlsb2d1ZVswXQorICAgICAgICAgICAgICAgIGJvbG1vID0gTkxDUkVfYm9sLm1hdGNoKGZpcnN0bGluZSkKKyAgICAgICAgICAgICAgICBpZiBib2xtbzoKKyAgICAgICAgICAgICAgICAgICAgZXBpbG9ndWVbMF0gPSBmaXJzdGxpbmVbbGVuKGJvbG1vLmdyb3VwKDApKTpdCisgICAgICAgICAgICBzZWxmLl9jdXIuZXBpbG9ndWUgPSBFTVBUWVNUUklORy5qb2luKGVwaWxvZ3VlKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgT3RoZXJ3aXNlLCBpdCdzIHNvbWUgbm9uLW11bHRpcGFydCB0eXBlLCBzbyB0aGUgZW50aXJlIHJlc3Qgb2YgdGhlCisgICAgICAgICMgZmlsZSBjb250ZW50cyBiZWNvbWVzIHRoZSBwYXlsb2FkLgorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2lucHV0OgorICAgICAgICAgICAgaWYgbGluZSBpcyBOZWVkTW9yZURhdGE6CisgICAgICAgICAgICAgICAgeWllbGQgTmVlZE1vcmVEYXRhCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICBzZWxmLl9jdXIuc2V0X3BheWxvYWQoRU1QVFlTVFJJTkcuam9pbihsaW5lcykpCisKKyAgICBkZWYgX3BhcnNlX2hlYWRlcnMoc2VsZiwgbGluZXMpOgorICAgICAgICAjIFBhc3NlZCBhIGxpc3Qgb2YgbGluZXMgdGhhdCBtYWtlIHVwIHRoZSBoZWFkZXJzIGZvciB0aGUgY3VycmVudCBtc2cKKyAgICAgICAgbGFzdGhlYWRlciA9ICcnCisgICAgICAgIGxhc3R2YWx1ZSA9IFtdCisgICAgICAgIGZvciBsaW5lbm8sIGxpbmUgaW4gZW51bWVyYXRlKGxpbmVzKToKKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIGNvbnRpbnVhdGlvbgorICAgICAgICAgICAgaWYgbGluZVswXSBpbiAnIFx0JzoKKyAgICAgICAgICAgICAgICBpZiBub3QgbGFzdGhlYWRlcjoKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgZmlyc3QgbGluZSBvZiB0aGUgaGVhZGVycyB3YXMgYSBjb250aW51YXRpb24uICBUaGlzCisgICAgICAgICAgICAgICAgICAgICMgaXMgaWxsZWdhbCwgc28gbGV0J3Mgbm90ZSB0aGUgZGVmZWN0LCBzdG9yZSB0aGUgaWxsZWdhbAorICAgICAgICAgICAgICAgICAgICAjIGxpbmUsIGFuZCBpZ25vcmUgaXQgZm9yIHB1cnBvc2VzIG9mIGhlYWRlcnMuCisgICAgICAgICAgICAgICAgICAgIGRlZmVjdCA9IGVycm9ycy5GaXJzdEhlYWRlckxpbmVJc0NvbnRpbnVhdGlvbkRlZmVjdChsaW5lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXIuZGVmZWN0cy5hcHBlbmQoZGVmZWN0KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGxhc3R2YWx1ZS5hcHBlbmQobGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbGFzdGhlYWRlcjoKKyAgICAgICAgICAgICAgICAjIFhYWCByZWNvbnNpZGVyIHRoZSBqb2luaW5nIG9mIGZvbGRlZCBsaW5lcworICAgICAgICAgICAgICAgIGxoZHIgPSBFTVBUWVNUUklORy5qb2luKGxhc3R2YWx1ZSlbOi0xXS5yc3RyaXAoJ1xyXG4nKQorICAgICAgICAgICAgICAgIHNlbGYuX2N1cltsYXN0aGVhZGVyXSA9IGxoZHIKKyAgICAgICAgICAgICAgICBsYXN0aGVhZGVyLCBsYXN0dmFsdWUgPSAnJywgW10KKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIGVudmVsb3BlIGhlYWRlciwgaS5lLiB1bml4LWZyb20KKyAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnRnJvbSAnKToKKyAgICAgICAgICAgICAgICBpZiBsaW5lbm8gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBTdHJpcCBvZmYgdGhlIHRyYWlsaW5nIG5ld2xpbmUKKyAgICAgICAgICAgICAgICAgICAgbW8gPSBOTENSRV9lb2wuc2VhcmNoKGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGlmIG1vOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi1sZW4obW8uZ3JvdXAoMCkpXQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXIuc2V0X3VuaXhmcm9tKGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxpZiBsaW5lbm8gPT0gbGVuKGxpbmVzKSAtIDE6CisgICAgICAgICAgICAgICAgICAgICMgU29tZXRoaW5nIGxvb2tpbmcgbGlrZSBhIHVuaXgtZnJvbSBhdCB0aGUgZW5kIC0gaXQncworICAgICAgICAgICAgICAgICAgICAjIHByb2JhYmx5IHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBib2R5LCBzbyBwdXNoIGJhY2sgdGhlCisgICAgICAgICAgICAgICAgICAgICMgbGluZSBhbmQgc3RvcC4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5wdXQudW5yZWFkbGluZShsaW5lKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIFdlaXJkbHkgcGxhY2VkIHVuaXgtZnJvbSBsaW5lLiAgTm90ZSB0aGlzIGFzIGEgZGVmZWN0CisgICAgICAgICAgICAgICAgICAgICMgYW5kIGlnbm9yZSBpdC4KKyAgICAgICAgICAgICAgICAgICAgZGVmZWN0ID0gZXJyb3JzLk1pc3BsYWNlZEVudmVsb3BlSGVhZGVyRGVmZWN0KGxpbmUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChkZWZlY3QpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIFNwbGl0IHRoZSBsaW5lIG9uIHRoZSBjb2xvbiBzZXBhcmF0aW5nIGZpZWxkIG5hbWUgZnJvbSB2YWx1ZS4KKyAgICAgICAgICAgIGkgPSBsaW5lLmZpbmQoJzonKQorICAgICAgICAgICAgaWYgaSA8IDA6CisgICAgICAgICAgICAgICAgZGVmZWN0ID0gZXJyb3JzLk1hbGZvcm1lZEhlYWRlckRlZmVjdChsaW5lKQorICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChkZWZlY3QpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxhc3RoZWFkZXIgPSBsaW5lWzppXQorICAgICAgICAgICAgbGFzdHZhbHVlID0gW2xpbmVbaSsxOl0ubHN0cmlwKCldCisgICAgICAgICMgRG9uZSB3aXRoIGFsbCB0aGUgbGluZXMsIHNvIGhhbmRsZSB0aGUgbGFzdCBoZWFkZXIuCisgICAgICAgIGlmIGxhc3RoZWFkZXI6CisgICAgICAgICAgICAjIFhYWCByZWNvbnNpZGVyIHRoZSBqb2luaW5nIG9mIGZvbGRlZCBsaW5lcworICAgICAgICAgICAgc2VsZi5fY3VyW2xhc3RoZWFkZXJdID0gRU1QVFlTVFJJTkcuam9pbihsYXN0dmFsdWUpLnJzdHJpcCgnXHJcbicpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2ZlZWRwYXJzZXIucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9mZWVkcGFyc2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmE4NTUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9mZWVkcGFyc2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2ZlZWRwYXJzZXIucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9mZWVkcGFyc2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmFlMWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9mZWVkcGFyc2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2dlbmVyYXRvci5weSBiL2xpYi9weXRob24yLjcvZW1haWwvZ2VuZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjZhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2dlbmVyYXRvci5weQpAQCAtMCwwICsxLDM3MiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJDbGFzc2VzIHRvIGdlbmVyYXRlIHBsYWluIHRleHQgZnJvbSBhIG1lc3NhZ2Ugb2JqZWN0IHRyZWUuIiIiCisKK19fYWxsX18gPSBbJ0dlbmVyYXRvcicsICdEZWNvZGVkR2VuZXJhdG9yJ10KKworaW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHdhcm5pbmdzCisKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSBlbWFpbC5oZWFkZXIgaW1wb3J0IEhlYWRlcgorCitVTkRFUlNDT1JFID0gJ18nCitOTCA9ICdcbicKKworZmNyZSA9IHJlLmNvbXBpbGUocideRnJvbSAnLCByZS5NVUxUSUxJTkUpCisKK2RlZiBfaXM4Yml0c3RyaW5nKHMpOgorICAgIGlmIGlzaW5zdGFuY2Uocywgc3RyKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdW5pY29kZShzLCAndXMtYXNjaWknKQorICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCisMCitjbGFzcyBHZW5lcmF0b3I6CisgICAgIiIiR2VuZXJhdGVzIG91dHB1dCBmcm9tIGEgTWVzc2FnZSBvYmplY3QgdHJlZS4KKworICAgIFRoaXMgYmFzaWMgZ2VuZXJhdG9yIHdyaXRlcyB0aGUgbWVzc2FnZSB0byB0aGUgZ2l2ZW4gZmlsZSBvYmplY3QgYXMgcGxhaW4KKyAgICB0ZXh0LgorICAgICIiIgorICAgICMKKyAgICAjIFB1YmxpYyBpbnRlcmZhY2UKKyAgICAjCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3V0ZnAsIG1hbmdsZV9mcm9tXz1UcnVlLCBtYXhoZWFkZXJsZW49NzgpOgorICAgICAgICAiIiJDcmVhdGUgdGhlIGdlbmVyYXRvciBmb3IgbWVzc2FnZSBmbGF0dGVuaW5nLgorCisgICAgICAgIG91dGZwIGlzIHRoZSBvdXRwdXQgZmlsZS1saWtlIG9iamVjdCBmb3Igd3JpdGluZyB0aGUgbWVzc2FnZSB0by4gIEl0CisgICAgICAgIG11c3QgaGF2ZSBhIHdyaXRlKCkgbWV0aG9kLgorCisgICAgICAgIE9wdGlvbmFsIG1hbmdsZV9mcm9tXyBpcyBhIGZsYWcgdGhhdCwgd2hlbiBUcnVlICh0aGUgZGVmYXVsdCksIGVzY2FwZXMKKyAgICAgICAgRnJvbV8gbGluZXMgaW4gdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UgYnkgcHV0dGluZyBhIGA+JyBpbiBmcm9udCBvZgorICAgICAgICB0aGVtLgorCisgICAgICAgIE9wdGlvbmFsIG1heGhlYWRlcmxlbiBzcGVjaWZpZXMgdGhlIGxvbmdlc3QgbGVuZ3RoIGZvciBhIG5vbi1jb250aW51ZWQKKyAgICAgICAgaGVhZGVyLiAgV2hlbiBhIGhlYWRlciBsaW5lIGlzIGxvbmdlciAoaW4gY2hhcmFjdGVycywgd2l0aCB0YWJzCisgICAgICAgIGV4cGFuZGVkIHRvIDggc3BhY2VzKSB0aGFuIG1heGhlYWRlcmxlbiwgdGhlIGhlYWRlciB3aWxsIHNwbGl0IGFzCisgICAgICAgIGRlZmluZWQgaW4gdGhlIEhlYWRlciBjbGFzcy4gIFNldCBtYXhoZWFkZXJsZW4gdG8gemVybyB0byBkaXNhYmxlCisgICAgICAgIGhlYWRlciB3cmFwcGluZy4gIFRoZSBkZWZhdWx0IGlzIDc4LCBhcyByZWNvbW1lbmRlZCAoYnV0IG5vdCByZXF1aXJlZCkKKyAgICAgICAgYnkgUkZDIDI4MjIuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9mcCA9IG91dGZwCisgICAgICAgIHNlbGYuX21hbmdsZV9mcm9tXyA9IG1hbmdsZV9mcm9tXworICAgICAgICBzZWxmLl9tYXhoZWFkZXJsZW4gPSBtYXhoZWFkZXJsZW4KKworICAgIGRlZiB3cml0ZShzZWxmLCBzKToKKyAgICAgICAgIyBKdXN0IGRlbGVnYXRlIHRvIHRoZSBmaWxlIG9iamVjdAorICAgICAgICBzZWxmLl9mcC53cml0ZShzKQorCisgICAgZGVmIGZsYXR0ZW4oc2VsZiwgbXNnLCB1bml4ZnJvbT1GYWxzZSk6CisgICAgICAgICIiIlByaW50IHRoZSBtZXNzYWdlIG9iamVjdCB0cmVlIHJvb3RlZCBhdCBtc2cgdG8gdGhlIG91dHB1dCBmaWxlCisgICAgICAgIHNwZWNpZmllZCB3aGVuIHRoZSBHZW5lcmF0b3IgaW5zdGFuY2Ugd2FzIGNyZWF0ZWQuCisKKyAgICAgICAgdW5peGZyb20gaXMgYSBmbGFnIHRoYXQgZm9yY2VzIHRoZSBwcmludGluZyBvZiBhIFVuaXggRnJvbV8gZGVsaW1pdGVyCisgICAgICAgIGJlZm9yZSB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBtZXNzYWdlIHRyZWUuICBJZiB0aGUgb3JpZ2luYWwgbWVzc2FnZQorICAgICAgICBoYXMgbm8gRnJvbV8gZGVsaW1pdGVyLCBhIGBzdGFuZGFyZCcgb25lIGlzIGNyYWZ0ZWQuICBCeSBkZWZhdWx0LCB0aGlzCisgICAgICAgIGlzIEZhbHNlIHRvIGluaGliaXQgdGhlIHByaW50aW5nIG9mIGFueSBGcm9tXyBkZWxpbWl0ZXIuCisKKyAgICAgICAgTm90ZSB0aGF0IGZvciBzdWJvYmplY3RzLCBubyBGcm9tXyBsaW5lIGlzIHByaW50ZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiB1bml4ZnJvbToKKyAgICAgICAgICAgIHVmcm9tID0gbXNnLmdldF91bml4ZnJvbSgpCisgICAgICAgICAgICBpZiBub3QgdWZyb206CisgICAgICAgICAgICAgICAgdWZyb20gPSAnRnJvbSBub2JvZHkgJyArIHRpbWUuY3RpbWUodGltZS50aW1lKCkpCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLl9mcCwgdWZyb20KKyAgICAgICAgc2VsZi5fd3JpdGUobXNnKQorCisgICAgZGVmIGNsb25lKHNlbGYsIGZwKToKKyAgICAgICAgIiIiQ2xvbmUgdGhpcyBnZW5lcmF0b3Igd2l0aCB0aGUgZXhhY3Qgc2FtZSBvcHRpb25zLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oZnAsIHNlbGYuX21hbmdsZV9mcm9tXywgc2VsZi5fbWF4aGVhZGVybGVuKQorCisgICAgIworICAgICMgUHJvdGVjdGVkIGludGVyZmFjZSAtIHVuZG9jdW1lbnRlZCA7LworICAgICMKKworICAgIGRlZiBfd3JpdGUoc2VsZiwgbXNnKToKKyAgICAgICAgIyBXZSBjYW4ndCB3cml0ZSB0aGUgaGVhZGVycyB5ZXQgYmVjYXVzZSBvZiB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOgorICAgICAgICAjIHNheSBhIG11bHRpcGFydCBtZXNzYWdlIGluY2x1ZGVzIHRoZSBib3VuZGFyeSBzdHJpbmcgc29tZXdoZXJlIGluCisgICAgICAgICMgaXRzIGJvZHkuICBXZSdkIGhhdmUgdG8gY2FsY3VsYXRlIHRoZSBuZXcgYm91bmRhcnkgL2JlZm9yZS8gd2Ugd3JpdGUKKyAgICAgICAgIyB0aGUgaGVhZGVycyBzbyB0aGF0IHdlIGNhbiB3cml0ZSB0aGUgY29ycmVjdCBDb250ZW50LVR5cGU6CisgICAgICAgICMgcGFyYW1ldGVyLgorICAgICAgICAjCisgICAgICAgICMgVGhlIHdheSB3ZSBkbyB0aGlzLCBzbyBhcyB0byBtYWtlIHRoZSBfaGFuZGxlXyooKSBtZXRob2RzIHNpbXBsZXIsCisgICAgICAgICMgaXMgdG8gY2FjaGUgYW55IHN1YnBhcnQgd3JpdGVzIGludG8gYSBTdHJpbmdJTy4gIFRoZSB3ZSB3cml0ZSB0aGUKKyAgICAgICAgIyBoZWFkZXJzIGFuZCB0aGUgU3RyaW5nSU8gY29udGVudHMuICBUaGF0IHdheSwgc3VicGFydCBoYW5kbGVycyBjYW4KKyAgICAgICAgIyBEbyBUaGUgUmlnaHQgVGhpbmcsIGFuZCBjYW4gc3RpbGwgbW9kaWZ5IHRoZSBDb250ZW50LVR5cGU6IGhlYWRlciBpZgorICAgICAgICAjIG5lY2Vzc2FyeS4KKyAgICAgICAgb2xkZnAgPSBzZWxmLl9mcAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9mcCA9IHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIHNlbGYuX2Rpc3BhdGNoKG1zZykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2ZwID0gb2xkZnAKKyAgICAgICAgIyBXcml0ZSB0aGUgaGVhZGVycy4gIEZpcnN0IHdlIHNlZSBpZiB0aGUgbWVzc2FnZSBvYmplY3Qgd2FudHMgdG8KKyAgICAgICAgIyBoYW5kbGUgdGhhdCBpdHNlbGYuICBJZiBub3QsIHdlJ2xsIGRvIGl0IGdlbmVyaWNhbGx5LgorICAgICAgICBtZXRoID0gZ2V0YXR0cihtc2csICdfd3JpdGVfaGVhZGVycycsIE5vbmUpCisgICAgICAgIGlmIG1ldGggaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcnMobXNnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWV0aChzZWxmKQorICAgICAgICBzZWxmLl9mcC53cml0ZShzZnAuZ2V0dmFsdWUoKSkKKworICAgIGRlZiBfZGlzcGF0Y2goc2VsZiwgbXNnKToKKyAgICAgICAgIyBHZXQgdGhlIENvbnRlbnQtVHlwZTogZm9yIHRoZSBtZXNzYWdlLCB0aGVuIHRyeSB0byBkaXNwYXRjaCB0bworICAgICAgICAjIHNlbGYuX2hhbmRsZV88bWFpbnR5cGU+XzxzdWJ0eXBlPigpLiAgSWYgdGhlcmUncyBubyBoYW5kbGVyIGZvciB0aGUKKyAgICAgICAgIyBmdWxsIE1JTUUgdHlwZSwgdGhlbiBkaXNwYXRjaCB0byBzZWxmLl9oYW5kbGVfPG1haW50eXBlPigpLiAgSWYKKyAgICAgICAgIyB0aGF0J3MgbWlzc2luZyB0b28sIHRoZW4gZGlzcGF0Y2ggdG8gc2VsZi5fd3JpdGVCb2R5KCkuCisgICAgICAgIG1haW4gPSBtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKQorICAgICAgICBzdWIgPSBtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpCisgICAgICAgIHNwZWNpZmljID0gVU5ERVJTQ09SRS5qb2luKChtYWluLCBzdWIpKS5yZXBsYWNlKCctJywgJ18nKQorICAgICAgICBtZXRoID0gZ2V0YXR0cihzZWxmLCAnX2hhbmRsZV8nICsgc3BlY2lmaWMsIE5vbmUpCisgICAgICAgIGlmIG1ldGggaXMgTm9uZToKKyAgICAgICAgICAgIGdlbmVyaWMgPSBtYWluLnJlcGxhY2UoJy0nLCAnXycpCisgICAgICAgICAgICBtZXRoID0gZ2V0YXR0cihzZWxmLCAnX2hhbmRsZV8nICsgZ2VuZXJpYywgTm9uZSkKKyAgICAgICAgICAgIGlmIG1ldGggaXMgTm9uZToKKyAgICAgICAgICAgICAgICBtZXRoID0gc2VsZi5fd3JpdGVCb2R5CisgICAgICAgIG1ldGgobXNnKQorCisgICAgIworICAgICMgRGVmYXVsdCBoYW5kbGVycworICAgICMKKworICAgIGRlZiBfd3JpdGVfaGVhZGVycyhzZWxmLCBtc2cpOgorICAgICAgICBmb3IgaCwgdiBpbiBtc2cuaXRlbXMoKToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuX2ZwLCAnJXM6JyAlIGgsCisgICAgICAgICAgICBpZiBzZWxmLl9tYXhoZWFkZXJsZW4gPT0gMDoKKyAgICAgICAgICAgICAgICAjIEV4cGxpY2l0IG5vLXdyYXBwaW5nCisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5fZnAsIHYKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2LCBIZWFkZXIpOgorICAgICAgICAgICAgICAgICMgSGVhZGVyIGluc3RhbmNlcyBrbm93IHdoYXQgdG8gZG8KKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLl9mcCwgdi5lbmNvZGUoKQorICAgICAgICAgICAgZWxpZiBfaXM4Yml0c3RyaW5nKHYpOgorICAgICAgICAgICAgICAgICMgSWYgd2UgaGF2ZSByYXcgOGJpdCBkYXRhIGluIGEgYnl0ZSBzdHJpbmcsIHdlIGhhdmUgbm8gaWRlYQorICAgICAgICAgICAgICAgICMgd2hhdCB0aGUgZW5jb2RpbmcgaXMuICBUaGVyZSBpcyBubyBzYWZlIHdheSB0byBzcGxpdCB0aGlzCisgICAgICAgICAgICAgICAgIyBzdHJpbmcuICBJZiBpdCdzIGFzY2lpLXN1YnNldCwgdGhlbiB3ZSBjb3VsZCBkbyBhIG5vcm1hbAorICAgICAgICAgICAgICAgICMgYXNjaWkgc3BsaXQsIGJ1dCBpZiBpdCdzIG11bHRpYnl0ZSB0aGVuIHdlIGNvdWxkIGJyZWFrIHRoZQorICAgICAgICAgICAgICAgICMgc3RyaW5nLiAgVGhlcmUncyBubyB3YXkgdG8ga25vdyBzbyB0aGUgbGVhc3QgaGFybSBzZWVtcyB0bworICAgICAgICAgICAgICAgICMgYmUgdG8gbm90IHNwbGl0IHRoZSBzdHJpbmcgYW5kIHJpc2sgaXQgYmVpbmcgdG9vIGxvbmcuCisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5fZnAsIHYKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBIZWFkZXIncyBnb3QgbG90cyBvZiBzbWFydHMsIHNvIHVzZSBpdC4gIE5vdGUgdGhhdCB0aGlzIGlzCisgICAgICAgICAgICAgICAgIyBmdW5kYW1lbnRhbGx5IGJyb2tlbiB0aG91Z2ggYmVjYXVzZSB3ZSBsb3NlIGlkZW1wb3RlbmN5IHdoZW4KKyAgICAgICAgICAgICAgICAjIHRoZSBoZWFkZXIgc3RyaW5nIGlzIGNvbnRpbnVlZCB3aXRoIHRhYnMuICBJdCB3aWxsIG5vdyBiZQorICAgICAgICAgICAgICAgICMgY29udGludWVkIHdpdGggc3BhY2VzLiAgVGhpcyB3YXMgcmV2ZXJzZWRseSBicm9rZW4gYmVmb3JlIHdlCisgICAgICAgICAgICAgICAgIyBmaXhlZCBidWcgMTk3NC4gIEVpdGhlciB3YXksIHdlIGxvc2UuCisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5fZnAsIEhlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgdiwgbWF4bGluZWxlbj1zZWxmLl9tYXhoZWFkZXJsZW4sIGhlYWRlcl9uYW1lPWgpLmVuY29kZSgpCisgICAgICAgICMgQSBibGFuayBsaW5lIGFsd2F5cyBzZXBhcmF0ZXMgaGVhZGVycyBmcm9tIGJvZHkKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5fZnAKKworICAgICMKKyAgICAjIEhhbmRsZXJzIGZvciB3cml0aW5nIHR5cGVzIGFuZCBzdWJ0eXBlcworICAgICMKKworICAgIGRlZiBfaGFuZGxlX3RleHQoc2VsZiwgbXNnKToKKyAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgICAgIGlmIHBheWxvYWQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwYXlsb2FkLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignc3RyaW5nIHBheWxvYWQgZXhwZWN0ZWQ6ICVzJyAlIHR5cGUocGF5bG9hZCkpCisgICAgICAgIGlmIHNlbGYuX21hbmdsZV9mcm9tXzoKKyAgICAgICAgICAgIHBheWxvYWQgPSBmY3JlLnN1YignPkZyb20gJywgcGF5bG9hZCkKKyAgICAgICAgc2VsZi5fZnAud3JpdGUocGF5bG9hZCkKKworICAgICMgRGVmYXVsdCBib2R5IGhhbmRsZXIKKyAgICBfd3JpdGVCb2R5ID0gX2hhbmRsZV90ZXh0CisKKyAgICBkZWYgX2hhbmRsZV9tdWx0aXBhcnQoc2VsZiwgbXNnKToKKyAgICAgICAgIyBUaGUgdHJpY2sgaGVyZSBpcyB0byB3cml0ZSBvdXQgZWFjaCBwYXJ0IHNlcGFyYXRlbHksIG1lcmdlIHRoZW0gYWxsCisgICAgICAgICMgdG9nZXRoZXIsIGFuZCB0aGVuIG1ha2Ugc3VyZSB0aGF0IHRoZSBib3VuZGFyeSB3ZSd2ZSBjaG9zZW4gaXNuJ3QKKyAgICAgICAgIyBwcmVzZW50IGluIHRoZSBwYXlsb2FkLgorICAgICAgICBtc2d0ZXh0cyA9IFtdCisgICAgICAgIHN1YnBhcnRzID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICAgICAgaWYgc3VicGFydHMgaXMgTm9uZToKKyAgICAgICAgICAgIHN1YnBhcnRzID0gW10KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN1YnBhcnRzLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICMgZS5nLiBhIG5vbi1zdHJpY3QgcGFyc2Ugb2YgYSBtZXNzYWdlIHdpdGggbm8gc3RhcnRpbmcgYm91bmRhcnkuCisgICAgICAgICAgICBzZWxmLl9mcC53cml0ZShzdWJwYXJ0cykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHN1YnBhcnRzLCBsaXN0KToKKyAgICAgICAgICAgICMgU2NhbGFyIHBheWxvYWQKKyAgICAgICAgICAgIHN1YnBhcnRzID0gW3N1YnBhcnRzXQorICAgICAgICBmb3IgcGFydCBpbiBzdWJwYXJ0czoKKyAgICAgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgICAgICBnID0gc2VsZi5jbG9uZShzKQorICAgICAgICAgICAgZy5mbGF0dGVuKHBhcnQsIHVuaXhmcm9tPUZhbHNlKQorICAgICAgICAgICAgbXNndGV4dHMuYXBwZW5kKHMuZ2V0dmFsdWUoKSkKKyAgICAgICAgIyBCQVc6IFdoYXQgYWJvdXQgYm91bmRhcmllcyB0aGF0IGFyZSB3cmFwcGVkIGluIGRvdWJsZS1xdW90ZXM/CisgICAgICAgIGJvdW5kYXJ5ID0gbXNnLmdldF9ib3VuZGFyeSgpCisgICAgICAgIGlmIG5vdCBib3VuZGFyeToKKyAgICAgICAgICAgICMgQ3JlYXRlIGEgYm91bmRhcnkgdGhhdCBkb2Vzbid0IGFwcGVhciBpbiBhbnkgb2YgdGhlCisgICAgICAgICAgICAjIG1lc3NhZ2UgdGV4dHMuCisgICAgICAgICAgICBhbGx0ZXh0ID0gTkwuam9pbihtc2d0ZXh0cykKKyAgICAgICAgICAgIGJvdW5kYXJ5ID0gX21ha2VfYm91bmRhcnkoYWxsdGV4dCkKKyAgICAgICAgICAgIG1zZy5zZXRfYm91bmRhcnkoYm91bmRhcnkpCisgICAgICAgICMgSWYgdGhlcmUncyBhIHByZWFtYmxlLCB3cml0ZSBpdCBvdXQsIHdpdGggYSB0cmFpbGluZyBDUkxGCisgICAgICAgIGlmIG1zZy5wcmVhbWJsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuX21hbmdsZV9mcm9tXzoKKyAgICAgICAgICAgICAgICBwcmVhbWJsZSA9IGZjcmUuc3ViKCc+RnJvbSAnLCBtc2cucHJlYW1ibGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByZWFtYmxlID0gbXNnLnByZWFtYmxlCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLl9mcCwgcHJlYW1ibGUKKyAgICAgICAgIyBkYXNoLWJvdW5kYXJ5IHRyYW5zcG9ydC1wYWRkaW5nIENSTEYKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5fZnAsICctLScgKyBib3VuZGFyeQorICAgICAgICAjIGJvZHktcGFydAorICAgICAgICBpZiBtc2d0ZXh0czoKKyAgICAgICAgICAgIHNlbGYuX2ZwLndyaXRlKG1zZ3RleHRzLnBvcCgwKSkKKyAgICAgICAgIyAqZW5jYXBzdWxhdGlvbgorICAgICAgICAjIC0tPiBkZWxpbWl0ZXIgdHJhbnNwb3J0LXBhZGRpbmcKKyAgICAgICAgIyAtLT4gQ1JMRiBib2R5LXBhcnQKKyAgICAgICAgZm9yIGJvZHlfcGFydCBpbiBtc2d0ZXh0czoKKyAgICAgICAgICAgICMgZGVsaW1pdGVyIHRyYW5zcG9ydC1wYWRkaW5nIENSTEYKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuX2ZwLCAnXG4tLScgKyBib3VuZGFyeQorICAgICAgICAgICAgIyBib2R5LXBhcnQKKyAgICAgICAgICAgIHNlbGYuX2ZwLndyaXRlKGJvZHlfcGFydCkKKyAgICAgICAgIyBjbG9zZS1kZWxpbWl0ZXIgdHJhbnNwb3J0LXBhZGRpbmcKKyAgICAgICAgc2VsZi5fZnAud3JpdGUoJ1xuLS0nICsgYm91bmRhcnkgKyAnLS0nKQorICAgICAgICBpZiBtc2cuZXBpbG9ndWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLl9mcAorICAgICAgICAgICAgaWYgc2VsZi5fbWFuZ2xlX2Zyb21fOgorICAgICAgICAgICAgICAgIGVwaWxvZ3VlID0gZmNyZS5zdWIoJz5Gcm9tICcsIG1zZy5lcGlsb2d1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXBpbG9ndWUgPSBtc2cuZXBpbG9ndWUKKyAgICAgICAgICAgIHNlbGYuX2ZwLndyaXRlKGVwaWxvZ3VlKQorCisgICAgZGVmIF9oYW5kbGVfbXVsdGlwYXJ0X3NpZ25lZChzZWxmLCBtc2cpOgorICAgICAgICAjIFRoZSBjb250ZW50cyBvZiBzaWduZWQgcGFydHMgaGFzIHRvIHN0YXkgdW5tb2RpZmllZCBpbiBvcmRlciB0byBrZWVwCisgICAgICAgICMgdGhlIHNpZ25hdHVyZSBpbnRhY3QgcGVyIFJGQzE4NDcgMi4xLCBzbyB3ZSBkaXNhYmxlIGhlYWRlciB3cmFwcGluZy4KKyAgICAgICAgIyBSRE06IFRoaXMgaXNuJ3QgZW5vdWdoIHRvIGNvbXBsZXRlbHkgcHJlc2VydmUgdGhlIHBhcnQsIGJ1dCBpdCBoZWxwcy4KKyAgICAgICAgb2xkX21heGhlYWRlcmxlbiA9IHNlbGYuX21heGhlYWRlcmxlbgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9tYXhoZWFkZXJsZW4gPSAwCisgICAgICAgICAgICBzZWxmLl9oYW5kbGVfbXVsdGlwYXJ0KG1zZykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX21heGhlYWRlcmxlbiA9IG9sZF9tYXhoZWFkZXJsZW4KKworICAgIGRlZiBfaGFuZGxlX21lc3NhZ2VfZGVsaXZlcnlfc3RhdHVzKHNlbGYsIG1zZyk6CisgICAgICAgICMgV2UgY2FuJ3QganVzdCB3cml0ZSB0aGUgaGVhZGVycyBkaXJlY3RseSB0byBzZWxmJ3MgZmlsZSBvYmplY3QKKyAgICAgICAgIyBiZWNhdXNlIHRoaXMgd2lsbCBsZWF2ZSBhbiBleHRyYSBuZXdsaW5lIGJldHdlZW4gdGhlIGxhc3QgaGVhZGVyCisgICAgICAgICMgYmxvY2sgYW5kIHRoZSBib3VuZGFyeS4gIFNpZ2guCisgICAgICAgIGJsb2NrcyA9IFtdCisgICAgICAgIGZvciBwYXJ0IGluIG1zZy5nZXRfcGF5bG9hZCgpOgorICAgICAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIGcgPSBzZWxmLmNsb25lKHMpCisgICAgICAgICAgICBnLmZsYXR0ZW4ocGFydCwgdW5peGZyb209RmFsc2UpCisgICAgICAgICAgICB0ZXh0ID0gcy5nZXR2YWx1ZSgpCisgICAgICAgICAgICBsaW5lcyA9IHRleHQuc3BsaXQoJ1xuJykKKyAgICAgICAgICAgICMgU3RyaXAgb2ZmIHRoZSB1bm5lY2Vzc2FyeSB0cmFpbGluZyBlbXB0eSBsaW5lCisgICAgICAgICAgICBpZiBsaW5lcyBhbmQgbGluZXNbLTFdID09ICcnOgorICAgICAgICAgICAgICAgIGJsb2Nrcy5hcHBlbmQoTkwuam9pbihsaW5lc1s6LTFdKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYmxvY2tzLmFwcGVuZCh0ZXh0KQorICAgICAgICAjIE5vdyBqb2luIGFsbCB0aGUgYmxvY2tzIHdpdGggYW4gZW1wdHkgbGluZS4gIFRoaXMgaGFzIHRoZSBsb3ZlbHkKKyAgICAgICAgIyBlZmZlY3Qgb2Ygc2VwYXJhdGluZyBlYWNoIGJsb2NrIHdpdGggYW4gZW1wdHkgbGluZSwgYnV0IG5vdCBhZGRpbmcKKyAgICAgICAgIyBhbiBleHRyYSBvbmUgYWZ0ZXIgdGhlIGxhc3Qgb25lLgorICAgICAgICBzZWxmLl9mcC53cml0ZShOTC5qb2luKGJsb2NrcykpCisKKyAgICBkZWYgX2hhbmRsZV9tZXNzYWdlKHNlbGYsIG1zZyk6CisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBzZWxmLmNsb25lKHMpCisgICAgICAgICMgVGhlIHBheWxvYWQgb2YgYSBtZXNzYWdlL3JmYzgyMiBwYXJ0IHNob3VsZCBiZSBhIG11bHRpcGFydCBzZXF1ZW5jZQorICAgICAgICAjIG9mIGxlbmd0aCAxLiAgVGhlIHplcm90aCBlbGVtZW50IG9mIHRoZSBsaXN0IHNob3VsZCBiZSB0aGUgTWVzc2FnZQorICAgICAgICAjIG9iamVjdCBmb3IgdGhlIHN1YnBhcnQuICBFeHRyYWN0IHRoYXQgb2JqZWN0LCBzdHJpbmdpZnkgaXQsIGFuZAorICAgICAgICAjIHdyaXRlIGl0IG91dC4KKyAgICAgICAgIyBFeGNlcHQsIGl0IHR1cm5zIG91dCwgd2hlbiBpdCdzIGEgc3RyaW5nIGluc3RlYWQsIHdoaWNoIGhhcHBlbnMgd2hlbgorICAgICAgICAjIGFuZCBvbmx5IHdoZW4gSGVhZGVyUGFyc2VyIGlzIHVzZWQgb24gYSBtZXNzYWdlIG9mIG1pbWUgdHlwZQorICAgICAgICAjIG1lc3NhZ2UvcmZjODIyLiAgU3VjaCBtZXNzYWdlcyBhcmUgZ2VuZXJhdGVkIGJ5LCBmb3IgZXhhbXBsZSwKKyAgICAgICAgIyBHcm91cHdpc2Ugd2hlbiBmb3J3YXJkaW5nIHVuYWRvcm5lZCBtZXNzYWdlcy4gIChJc3N1ZSA3OTcwLikgIFNvCisgICAgICAgICMgaW4gdGhhdCBjYXNlIHdlIGp1c3QgZW1pdCB0aGUgc3RyaW5nIGJvZHkuCisgICAgICAgIHBheWxvYWQgPSBtc2cuZ2V0X3BheWxvYWQoKQorICAgICAgICBpZiBpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpOgorICAgICAgICAgICAgZy5mbGF0dGVuKG1zZy5nZXRfcGF5bG9hZCgwKSwgdW5peGZyb209RmFsc2UpCisgICAgICAgICAgICBwYXlsb2FkID0gcy5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX2ZwLndyaXRlKHBheWxvYWQpCisKKworDAorX0ZNVCA9ICdbTm9uLXRleHQgKCUodHlwZSlzKSBwYXJ0IG9mIG1lc3NhZ2Ugb21pdHRlZCwgZmlsZW5hbWUgJShmaWxlbmFtZSlzXScKKworY2xhc3MgRGVjb2RlZEdlbmVyYXRvcihHZW5lcmF0b3IpOgorICAgICIiIkdlbmVyYXRlcyBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgYSBtZXNzYWdlLgorCisgICAgTGlrZSB0aGUgR2VuZXJhdG9yIGJhc2UgY2xhc3MsIGV4Y2VwdCB0aGF0IG5vbi10ZXh0IHBhcnRzIGFyZSBzdWJzdGl0dXRlZAorICAgIHdpdGggYSBmb3JtYXQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGFydC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3V0ZnAsIG1hbmdsZV9mcm9tXz1UcnVlLCBtYXhoZWFkZXJsZW49NzgsIGZtdD1Ob25lKToKKyAgICAgICAgIiIiTGlrZSBHZW5lcmF0b3IuX19pbml0X18oKSBleGNlcHQgdGhhdCBhbiBhZGRpdGlvbmFsIG9wdGlvbmFsCisgICAgICAgIGFyZ3VtZW50IGlzIGFsbG93ZWQuCisKKyAgICAgICAgV2Fsa3MgdGhyb3VnaCBhbGwgc3VicGFydHMgb2YgYSBtZXNzYWdlLiAgSWYgdGhlIHN1YnBhcnQgaXMgb2YgbWFpbgorICAgICAgICB0eXBlIGB0ZXh0JywgdGhlbiBpdCBwcmludHMgdGhlIGRlY29kZWQgcGF5bG9hZCBvZiB0aGUgc3VicGFydC4KKworICAgICAgICBPdGhlcndpc2UsIGZtdCBpcyBhIGZvcm1hdCBzdHJpbmcgdGhhdCBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIG1lc3NhZ2UKKyAgICAgICAgcGF5bG9hZC4gIGZtdCBpcyBleHBhbmRlZCB3aXRoIHRoZSBmb2xsb3dpbmcga2V5d29yZHMgKGluCisgICAgICAgICUoa2V5d29yZClzIGZvcm1hdCk6CisKKyAgICAgICAgdHlwZSAgICAgICA6IEZ1bGwgTUlNRSB0eXBlIG9mIHRoZSBub24tdGV4dCBwYXJ0CisgICAgICAgIG1haW50eXBlICAgOiBNYWluIE1JTUUgdHlwZSBvZiB0aGUgbm9uLXRleHQgcGFydAorICAgICAgICBzdWJ0eXBlICAgIDogU3ViLU1JTUUgdHlwZSBvZiB0aGUgbm9uLXRleHQgcGFydAorICAgICAgICBmaWxlbmFtZSAgIDogRmlsZW5hbWUgb2YgdGhlIG5vbi10ZXh0IHBhcnQKKyAgICAgICAgZGVzY3JpcHRpb246IERlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9uLXRleHQgcGFydAorICAgICAgICBlbmNvZGluZyAgIDogQ29udGVudCB0cmFuc2ZlciBlbmNvZGluZyBvZiB0aGUgbm9uLXRleHQgcGFydAorCisgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBmbXQgaXMgTm9uZSwgbWVhbmluZworCisgICAgICAgIFtOb24tdGV4dCAoJSh0eXBlKXMpIHBhcnQgb2YgbWVzc2FnZSBvbWl0dGVkLCBmaWxlbmFtZSAlKGZpbGVuYW1lKXNdCisgICAgICAgICIiIgorICAgICAgICBHZW5lcmF0b3IuX19pbml0X18oc2VsZiwgb3V0ZnAsIG1hbmdsZV9mcm9tXywgbWF4aGVhZGVybGVuKQorICAgICAgICBpZiBmbXQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2ZtdCA9IF9GTVQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2ZtdCA9IGZtdAorCisgICAgZGVmIF9kaXNwYXRjaChzZWxmLCBtc2cpOgorICAgICAgICBmb3IgcGFydCBpbiBtc2cud2FsaygpOgorICAgICAgICAgICAgbWFpbnR5cGUgPSBwYXJ0LmdldF9jb250ZW50X21haW50eXBlKCkKKyAgICAgICAgICAgIGlmIG1haW50eXBlID09ICd0ZXh0JzoKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLCBwYXJ0LmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKQorICAgICAgICAgICAgZWxpZiBtYWludHlwZSA9PSAnbXVsdGlwYXJ0JzoKKyAgICAgICAgICAgICAgICAjIEp1c3Qgc2tpcCB0aGlzCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLCBzZWxmLl9mbXQgJSB7CisgICAgICAgICAgICAgICAgICAgICd0eXBlJyAgICAgICA6IHBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAnbWFpbnR5cGUnICAgOiBwYXJ0LmdldF9jb250ZW50X21haW50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICdzdWJ0eXBlJyAgICA6IHBhcnQuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAnZmlsZW5hbWUnICAgOiBwYXJ0LmdldF9maWxlbmFtZSgnW25vIGZpbGVuYW1lXScpLAorICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiBwYXJ0LmdldCgnQ29udGVudC1EZXNjcmlwdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbbm8gZGVzY3JpcHRpb25dJyksCisgICAgICAgICAgICAgICAgICAgICdlbmNvZGluZycgICA6IHBhcnQuZ2V0KCdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1tubyBlbmNvZGluZ10nKSwKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKwwKKyMgSGVscGVyCitfd2lkdGggPSBsZW4ocmVwcihzeXMubWF4aW50LTEpKQorX2ZtdCA9ICclJTAlZGQnICUgX3dpZHRoCisKK2RlZiBfbWFrZV9ib3VuZGFyeSh0ZXh0PU5vbmUpOgorICAgICMgQ3JhZnQgYSByYW5kb20gYm91bmRhcnkuICBJZiB0ZXh0IGlzIGdpdmVuLCBlbnN1cmUgdGhhdCB0aGUgY2hvc2VuCisgICAgIyBib3VuZGFyeSBkb2Vzbid0IGFwcGVhciBpbiB0aGUgdGV4dC4KKyAgICB0b2tlbiA9IHJhbmRvbS5yYW5kcmFuZ2Uoc3lzLm1heGludCkKKyAgICBib3VuZGFyeSA9ICgnPScgKiAxNSkgKyAoX2ZtdCAlIHRva2VuKSArICc9PScKKyAgICBpZiB0ZXh0IGlzIE5vbmU6CisgICAgICAgIHJldHVybiBib3VuZGFyeQorICAgIGIgPSBib3VuZGFyeQorICAgIGNvdW50ZXIgPSAwCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgY3JlID0gcmUuY29tcGlsZSgnXi0tJyArIHJlLmVzY2FwZShiKSArICcoLS0pPyQnLCByZS5NVUxUSUxJTkUpCisgICAgICAgIGlmIG5vdCBjcmUuc2VhcmNoKHRleHQpOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgYiA9IGJvdW5kYXJ5ICsgJy4nICsgc3RyKGNvdW50ZXIpCisgICAgICAgIGNvdW50ZXIgKz0gMQorICAgIHJldHVybiBiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2dlbmVyYXRvci5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL2dlbmVyYXRvci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5ZjhhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvZ2VuZXJhdG9yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2dlbmVyYXRvci5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL2dlbmVyYXRvci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ5ZjhhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvZ2VuZXJhdG9yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2hlYWRlci5weSBiL2xpYi9weXRob24yLjcvZW1haWwvaGVhZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjg3MGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2hlYWRlci5weQpAQCAtMCwwICsxLDUxNCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJlbiBHZXJ0emZpZWxkLCBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiSGVhZGVyIGVuY29kaW5nIGFuZCBkZWNvZGluZyBmdW5jdGlvbmFsaXR5LiIiIgorCitfX2FsbF9fID0gWworICAgICdIZWFkZXInLAorICAgICdkZWNvZGVfaGVhZGVyJywKKyAgICAnbWFrZV9oZWFkZXInLAorICAgIF0KKworaW1wb3J0IHJlCitpbXBvcnQgYmluYXNjaWkKKworaW1wb3J0IGVtYWlsLnF1b3ByaW1pbWUKK2ltcG9ydCBlbWFpbC5iYXNlNjRtaW1lCisKK2Zyb20gZW1haWwuZXJyb3JzIGltcG9ydCBIZWFkZXJQYXJzZUVycm9yCitmcm9tIGVtYWlsLmNoYXJzZXQgaW1wb3J0IENoYXJzZXQKKworTkwgPSAnXG4nCitTUEFDRSA9ICcgJworVVNQQUNFID0gdScgJworU1BBQ0U4ID0gJyAnICogOAorVUVNUFRZU1RSSU5HID0gdScnCisKK01BWExJTkVMRU4gPSA3NgorCitVU0FTQ0lJID0gQ2hhcnNldCgndXMtYXNjaWknKQorVVRGOCA9IENoYXJzZXQoJ3V0Zi04JykKKworIyBNYXRjaCBlbmNvZGVkLXdvcmQgc3RyaW5ncyBpbiB0aGUgZm9ybSA9P2NoYXJzZXQ/cT9IZWxsb19Xb3JsZD89CitlY3JlID0gcmUuY29tcGlsZShyJycnCisgID1cPyAgICAgICAgICAgICAgICAgICAjIGxpdGVyYWwgPT8KKyAgKD9QPGNoYXJzZXQ+W14/XSo/KSAgICMgbm9uLWdyZWVkeSB1cCB0byB0aGUgbmV4dCA/IGlzIHRoZSBjaGFyc2V0CisgIFw/ICAgICAgICAgICAgICAgICAgICAjIGxpdGVyYWwgPworICAoP1A8ZW5jb2Rpbmc+W3FiXSkgICAgIyBlaXRoZXIgYSAicSIgb3IgYSAiYiIsIGNhc2UgaW5zZW5zaXRpdmUKKyAgXD8gICAgICAgICAgICAgICAgICAgICMgbGl0ZXJhbCA/CisgICg/UDxlbmNvZGVkPi4qPykgICAgICAjIG5vbi1ncmVlZHkgdXAgdG8gdGhlIG5leHQgPz0gaXMgdGhlIGVuY29kZWQgc3RyaW5nCisgIFw/PSAgICAgICAgICAgICAgICAgICAjIGxpdGVyYWwgPz0KKyAgKD89WyBcdF18JCkgICAgICAgICAgICMgd2hpdGVzcGFjZSBvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcKKyAgJycnLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSB8IHJlLk1VTFRJTElORSkKKworIyBGaWVsZCBuYW1lIHJlZ2V4cCwgaW5jbHVkaW5nIHRyYWlsaW5nIGNvbG9uLCBidXQgbm90IHNlcGFyYXRpbmcgd2hpdGVzcGFjZSwKKyMgYWNjb3JkaW5nIHRvIFJGQyAyODIyLiAgQ2hhcmFjdGVyIHJhbmdlIGlzIGZyb20gdGlsZGUgdG8gZXhjbGFtYXRpb24gbWFyay4KKyMgRm9yIHVzZSB3aXRoIC5tYXRjaCgpCitmY3JlID0gcmUuY29tcGlsZShyJ1tcMDQxLVwxNzZdKzokJykKKworIyBGaW5kIGEgaGVhZGVyIGVtYmVkZGVkIGluIGEgcHV0YXRpdmUgaGVhZGVyIHZhbHVlLiAgVXNlZCB0byBjaGVjayBmb3IKKyMgaGVhZGVyIGluamVjdGlvbiBhdHRhY2suCitfZW1iZWRlZF9oZWFkZXIgPSByZS5jb21waWxlKHInXG5bXiBcdF0rOicpCisKKworDAorIyBIZWxwZXJzCitfbWF4X2FwcGVuZCA9IGVtYWlsLnF1b3ByaW1pbWUuX21heF9hcHBlbmQKKworCisMCitkZWYgZGVjb2RlX2hlYWRlcihoZWFkZXIpOgorICAgICIiIkRlY29kZSBhIG1lc3NhZ2UgaGVhZGVyIHZhbHVlIHdpdGhvdXQgY29udmVydGluZyBjaGFyc2V0LgorCisgICAgUmV0dXJucyBhIGxpc3Qgb2YgKGRlY29kZWRfc3RyaW5nLCBjaGFyc2V0KSBwYWlycyBjb250YWluaW5nIGVhY2ggb2YgdGhlCisgICAgZGVjb2RlZCBwYXJ0cyBvZiB0aGUgaGVhZGVyLiAgQ2hhcnNldCBpcyBOb25lIGZvciBub24tZW5jb2RlZCBwYXJ0cyBvZiB0aGUKKyAgICBoZWFkZXIsIG90aGVyd2lzZSBhIGxvd2VyLWNhc2Ugc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGNoYXJhY3RlcgorICAgIHNldCBzcGVjaWZpZWQgaW4gdGhlIGVuY29kZWQgc3RyaW5nLgorCisgICAgQW4gZW1haWwuZXJyb3JzLkhlYWRlclBhcnNlRXJyb3IgbWF5IGJlIHJhaXNlZCB3aGVuIGNlcnRhaW4gZGVjb2RpbmcgZXJyb3IKKyAgICBvY2N1cnMgKGUuZy4gYSBiYXNlNjQgZGVjb2RpbmcgZXhjZXB0aW9uKS4KKyAgICAiIiIKKyAgICAjIElmIG5vIGVuY29kaW5nLCBqdXN0IHJldHVybiB0aGUgaGVhZGVyCisgICAgaGVhZGVyID0gc3RyKGhlYWRlcikKKyAgICBpZiBub3QgZWNyZS5zZWFyY2goaGVhZGVyKToKKyAgICAgICAgcmV0dXJuIFsoaGVhZGVyLCBOb25lKV0KKyAgICBkZWNvZGVkID0gW10KKyAgICBkZWMgPSAnJworICAgIGZvciBsaW5lIGluIGhlYWRlci5zcGxpdGxpbmVzKCk6CisgICAgICAgICMgVGhpcyBsaW5lIG1pZ2h0IG5vdCBoYXZlIGFuIGVuY29kaW5nIGluIGl0CisgICAgICAgIGlmIG5vdCBlY3JlLnNlYXJjaChsaW5lKToKKyAgICAgICAgICAgIGRlY29kZWQuYXBwZW5kKChsaW5lLCBOb25lKSkKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHBhcnRzID0gZWNyZS5zcGxpdChsaW5lKQorICAgICAgICB3aGlsZSBwYXJ0czoKKyAgICAgICAgICAgIHVuZW5jID0gcGFydHMucG9wKDApLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIHVuZW5jOgorICAgICAgICAgICAgICAgICMgU2hvdWxkIHdlIGNvbnRpbnVlIGEgbG9uZyBsaW5lPworICAgICAgICAgICAgICAgIGlmIGRlY29kZWQgYW5kIGRlY29kZWRbLTFdWzFdIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGRlY29kZWRbLTFdID0gKGRlY29kZWRbLTFdWzBdICsgU1BBQ0UgKyB1bmVuYywgTm9uZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLmFwcGVuZCgodW5lbmMsIE5vbmUpKQorICAgICAgICAgICAgaWYgcGFydHM6CisgICAgICAgICAgICAgICAgY2hhcnNldCwgZW5jb2RpbmcgPSBbcy5sb3dlcigpIGZvciBzIGluIHBhcnRzWzA6Ml1dCisgICAgICAgICAgICAgICAgZW5jb2RlZCA9IHBhcnRzWzJdCisgICAgICAgICAgICAgICAgZGVjID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIGVuY29kaW5nID09ICdxJzoKKyAgICAgICAgICAgICAgICAgICAgZGVjID0gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfZGVjb2RlKGVuY29kZWQpCisgICAgICAgICAgICAgICAgZWxpZiBlbmNvZGluZyA9PSAnYic6CisgICAgICAgICAgICAgICAgICAgIHBhZGVyciA9IGxlbihlbmNvZGVkKSAlIDQgICAjIFBvc3RlbCdzIGxhdzogYWRkIG1pc3NpbmcgcGFkZGluZworICAgICAgICAgICAgICAgICAgICBpZiBwYWRlcnI6CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkICs9ICc9PT0nWzo0IC0gcGFkZXJyXQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWMgPSBlbWFpbC5iYXNlNjRtaW1lLmRlY29kZShlbmNvZGVkKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgYmluYXNjaWkuRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFR1cm4gdGhpcyBpbnRvIGEgaGlnaGVyIGxldmVsIGV4Y2VwdGlvbi4gIEJBVzogUmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbm93IHdlIHRocm93IHRoZSBsb3dlciBsZXZlbCBleGNlcHRpb24gYXdheSBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2hlbi9pZiB3ZSBnZXQgZXhjZXB0aW9uIGNoYWluaW5nLCB3ZSdsbCBwcmVzZXJ2ZSBpdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEhlYWRlclBhcnNlRXJyb3IKKyAgICAgICAgICAgICAgICBpZiBkZWMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZGVjID0gZW5jb2RlZAorCisgICAgICAgICAgICAgICAgaWYgZGVjb2RlZCBhbmQgZGVjb2RlZFstMV1bMV0gPT0gY2hhcnNldDoKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFstMV0gPSAoZGVjb2RlZFstMV1bMF0gKyBkZWMsIGRlY29kZWRbLTFdWzFdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRlY29kZWQuYXBwZW5kKChkZWMsIGNoYXJzZXQpKQorICAgICAgICAgICAgZGVsIHBhcnRzWzA6M10KKyAgICByZXR1cm4gZGVjb2RlZAorCisKKwwKK2RlZiBtYWtlX2hlYWRlcihkZWNvZGVkX3NlcSwgbWF4bGluZWxlbj1Ob25lLCBoZWFkZXJfbmFtZT1Ob25lLAorICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbl93cz0nICcpOgorICAgICIiIkNyZWF0ZSBhIEhlYWRlciBmcm9tIGEgc2VxdWVuY2Ugb2YgcGFpcnMgYXMgcmV0dXJuZWQgYnkgZGVjb2RlX2hlYWRlcigpCisKKyAgICBkZWNvZGVfaGVhZGVyKCkgdGFrZXMgYSBoZWFkZXIgdmFsdWUgc3RyaW5nIGFuZCByZXR1cm5zIGEgc2VxdWVuY2Ugb2YKKyAgICBwYWlycyBvZiB0aGUgZm9ybWF0IChkZWNvZGVkX3N0cmluZywgY2hhcnNldCkgd2hlcmUgY2hhcnNldCBpcyB0aGUgc3RyaW5nCisgICAgbmFtZSBvZiB0aGUgY2hhcmFjdGVyIHNldC4KKworICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgb25lIG9mIHRob3NlIHNlcXVlbmNlIG9mIHBhaXJzIGFuZCByZXR1cm5zIGEgSGVhZGVyCisgICAgaW5zdGFuY2UuICBPcHRpb25hbCBtYXhsaW5lbGVuLCBoZWFkZXJfbmFtZSwgYW5kIGNvbnRpbnVhdGlvbl93cyBhcmUgYXMgaW4KKyAgICB0aGUgSGVhZGVyIGNvbnN0cnVjdG9yLgorICAgICIiIgorICAgIGggPSBIZWFkZXIobWF4bGluZWxlbj1tYXhsaW5lbGVuLCBoZWFkZXJfbmFtZT1oZWFkZXJfbmFtZSwKKyAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbl93cz1jb250aW51YXRpb25fd3MpCisgICAgZm9yIHMsIGNoYXJzZXQgaW4gZGVjb2RlZF9zZXE6CisgICAgICAgICMgTm9uZSBtZWFucyB1cy1hc2NpaSBidXQgd2UgY2FuIHNpbXBseSBwYXNzIGl0IG9uIHRvIGguYXBwZW5kKCkKKyAgICAgICAgaWYgY2hhcnNldCBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2UoY2hhcnNldCwgQ2hhcnNldCk6CisgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldChjaGFyc2V0KQorICAgICAgICBoLmFwcGVuZChzLCBjaGFyc2V0KQorICAgIHJldHVybiBoCisKKworDAorY2xhc3MgSGVhZGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzPU5vbmUsIGNoYXJzZXQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgbWF4bGluZWxlbj1Ob25lLCBoZWFkZXJfbmFtZT1Ob25lLAorICAgICAgICAgICAgICAgICBjb250aW51YXRpb25fd3M9JyAnLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICAiIiJDcmVhdGUgYSBNSU1FLWNvbXBsaWFudCBoZWFkZXIgdGhhdCBjYW4gY29udGFpbiBtYW55IGNoYXJhY3RlciBzZXRzLgorCisgICAgICAgIE9wdGlvbmFsIHMgaXMgdGhlIGluaXRpYWwgaGVhZGVyIHZhbHVlLiAgSWYgTm9uZSwgdGhlIGluaXRpYWwgaGVhZGVyCisgICAgICAgIHZhbHVlIGlzIG5vdCBzZXQuICBZb3UgY2FuIGxhdGVyIGFwcGVuZCB0byB0aGUgaGVhZGVyIHdpdGggLmFwcGVuZCgpCisgICAgICAgIG1ldGhvZCBjYWxscy4gIHMgbWF5IGJlIGEgYnl0ZSBzdHJpbmcgb3IgYSBVbmljb2RlIHN0cmluZywgYnV0IHNlZSB0aGUKKyAgICAgICAgLmFwcGVuZCgpIGRvY3VtZW50YXRpb24gZm9yIHNlbWFudGljcy4KKworICAgICAgICBPcHRpb25hbCBjaGFyc2V0IHNlcnZlcyB0d28gcHVycG9zZXM6IGl0IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHRoZQorICAgICAgICBjaGFyc2V0IGFyZ3VtZW50IHRvIHRoZSAuYXBwZW5kKCkgbWV0aG9kLiAgSXQgYWxzbyBzZXRzIHRoZSBkZWZhdWx0CisgICAgICAgIGNoYXJhY3RlciBzZXQgZm9yIGFsbCBzdWJzZXF1ZW50IC5hcHBlbmQoKSBjYWxscyB0aGF0IG9taXQgdGhlIGNoYXJzZXQKKyAgICAgICAgYXJndW1lbnQuICBJZiBjaGFyc2V0IGlzIG5vdCBwcm92aWRlZCBpbiB0aGUgY29uc3RydWN0b3IsIHRoZSB1cy1hc2NpaQorICAgICAgICBjaGFyc2V0IGlzIHVzZWQgYm90aCBhcyBzJ3MgaW5pdGlhbCBjaGFyc2V0IGFuZCBhcyB0aGUgZGVmYXVsdCBmb3IKKyAgICAgICAgc3Vic2VxdWVudCAuYXBwZW5kKCkgY2FsbHMuCisKKyAgICAgICAgVGhlIG1heGltdW0gbGluZSBsZW5ndGggY2FuIGJlIHNwZWNpZmllZCBleHBsaWNpdCB2aWEgbWF4bGluZWxlbi4gIEZvcgorICAgICAgICBzcGxpdHRpbmcgdGhlIGZpcnN0IGxpbmUgdG8gYSBzaG9ydGVyIHZhbHVlICh0byBhY2NvdW50IGZvciB0aGUgZmllbGQKKyAgICAgICAgaGVhZGVyIHdoaWNoIGlzbid0IGluY2x1ZGVkIGluIHMsIGUuZy4gYFN1YmplY3QnKSBwYXNzIGluIHRoZSBuYW1lIG9mCisgICAgICAgIHRoZSBmaWVsZCBpbiBoZWFkZXJfbmFtZS4gIFRoZSBkZWZhdWx0IG1heGxpbmVsZW4gaXMgNzYuCisKKyAgICAgICAgY29udGludWF0aW9uX3dzIG11c3QgYmUgUkZDIDI4MjIgY29tcGxpYW50IGZvbGRpbmcgd2hpdGVzcGFjZSAodXN1YWxseQorICAgICAgICBlaXRoZXIgYSBzcGFjZSBvciBhIGhhcmQgdGFiKSB3aGljaCB3aWxsIGJlIHByZXBlbmRlZCB0byBjb250aW51YXRpb24KKyAgICAgICAgbGluZXMuCisKKyAgICAgICAgZXJyb3JzIGlzIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSAuYXBwZW5kKCkgY2FsbC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNoYXJzZXQgaXMgTm9uZToKKyAgICAgICAgICAgIGNoYXJzZXQgPSBVU0FTQ0lJCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNoYXJzZXQsIENoYXJzZXQpOgorICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgc2VsZi5fY2hhcnNldCA9IGNoYXJzZXQKKyAgICAgICAgc2VsZi5fY29udGludWF0aW9uX3dzID0gY29udGludWF0aW9uX3dzCisgICAgICAgIGN3c19leHBhbmRlZF9sZW4gPSBsZW4oY29udGludWF0aW9uX3dzLnJlcGxhY2UoJ1x0JywgU1BBQ0U4KSkKKyAgICAgICAgIyBCQVc6IEkgYmVsaWV2ZSBgY2h1bmtzJyBhbmQgYG1heGxpbmVsZW4nIHNob3VsZCBiZSBub24tcHVibGljLgorICAgICAgICBzZWxmLl9jaHVua3MgPSBbXQorICAgICAgICBpZiBzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hcHBlbmQocywgY2hhcnNldCwgZXJyb3JzKQorICAgICAgICBpZiBtYXhsaW5lbGVuIGlzIE5vbmU6CisgICAgICAgICAgICBtYXhsaW5lbGVuID0gTUFYTElORUxFTgorICAgICAgICBpZiBoZWFkZXJfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgIyBXZSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IHRoZSBmaWVsZCBoZWFkZXIgc28gdGhlIGZpcnN0IGxpbmUKKyAgICAgICAgICAgICMgaXMgdGhlIHNhbWUgbGVuZ3RoIGFzIHN1YnNlcXVlbnQgbGluZXMuCisgICAgICAgICAgICBzZWxmLl9maXJzdGxpbmVsZW4gPSBtYXhsaW5lbGVuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRoZSBmaXJzdCBsaW5lIHNob3VsZCBiZSBzaG9ydGVyIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBmaWVsZAorICAgICAgICAgICAgIyBoZWFkZXIuICBBbHNvIHN1YnRyYWN0IG9mZiAyIGV4dHJhIGZvciB0aGUgY29sb24gYW5kIHNwYWNlLgorICAgICAgICAgICAgc2VsZi5fZmlyc3RsaW5lbGVuID0gbWF4bGluZWxlbiAtIGxlbihoZWFkZXJfbmFtZSkgLSAyCisgICAgICAgICMgU2Vjb25kIGFuZCBzdWJzZXF1ZW50IGxpbmVzIHNob3VsZCBzdWJ0cmFjdCBvZmYgdGhlIGxlbmd0aCBpbgorICAgICAgICAjIGNvbHVtbnMgb2YgdGhlIGNvbnRpbnVhdGlvbiB3aGl0ZXNwYWNlIHByZWZpeC4KKyAgICAgICAgc2VsZi5fbWF4bGluZWxlbiA9IG1heGxpbmVsZW4gLSBjd3NfZXhwYW5kZWRfbGVuCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgIiIiQSBzeW5vbnltIGZvciBzZWxmLmVuY29kZSgpLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5lbmNvZGUoKQorCisgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAiIiJIZWxwZXIgZm9yIHRoZSBidWlsdC1pbiB1bmljb2RlIGZ1bmN0aW9uLiIiIgorICAgICAgICB1Y2h1bmtzID0gW10KKyAgICAgICAgbGFzdGNzID0gTm9uZQorICAgICAgICBmb3IgcywgY2hhcnNldCBpbiBzZWxmLl9jaHVua3M6CisgICAgICAgICAgICAjIFdlIG11c3QgcHJlc2VydmUgc3BhY2VzIGJldHdlZW4gZW5jb2RlZCBhbmQgbm9uLWVuY29kZWQgd29yZAorICAgICAgICAgICAgIyBib3VuZGFyaWVzLCB3aGljaCBtZWFucyBmb3IgdXMgd2UgbmVlZCB0byBhZGQgYSBzcGFjZSB3aGVuIHdlIGdvCisgICAgICAgICAgICAjIGZyb20gYSBjaGFyc2V0IHRvIE5vbmUvdXMtYXNjaWksIG9yIGZyb20gTm9uZS91cy1hc2NpaSB0byBhCisgICAgICAgICAgICAjIGNoYXJzZXQuICBPbmx5IGRvIHRoaXMgZm9yIHRoZSBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgY2h1bmtzLgorICAgICAgICAgICAgbmV4dGNzID0gY2hhcnNldAorICAgICAgICAgICAgaWYgdWNodW5rczoKKyAgICAgICAgICAgICAgICBpZiBsYXN0Y3Mgbm90IGluIChOb25lLCAndXMtYXNjaWknKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbmV4dGNzIGluIChOb25lLCAndXMtYXNjaWknKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHVjaHVua3MuYXBwZW5kKFVTUEFDRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRjcyA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbGlmIG5leHRjcyBub3QgaW4gKE5vbmUsICd1cy1hc2NpaScpOgorICAgICAgICAgICAgICAgICAgICB1Y2h1bmtzLmFwcGVuZChVU1BBQ0UpCisgICAgICAgICAgICBsYXN0Y3MgPSBuZXh0Y3MKKyAgICAgICAgICAgIHVjaHVua3MuYXBwZW5kKHVuaWNvZGUocywgc3RyKGNoYXJzZXQpKSkKKyAgICAgICAgcmV0dXJuIFVFTVBUWVNUUklORy5qb2luKHVjaHVua3MpCisKKyAgICAjIFJpY2ggY29tcGFyaXNvbiBvcGVyYXRvcnMgZm9yIGVxdWFsaXR5IG9ubHkuICBCQVc6IGRvZXMgaXQgbWFrZSBzZW5zZSB0bworICAgICMgaGF2ZSBvciBleHBsaWNpdGx5IGRpc2FibGUgPCwgPD0sID4sID49IG9wZXJhdG9ycz8KKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIyBvdGhlciBtYXkgYmUgYSBIZWFkZXIgb3IgYSBzdHJpbmcuICBCb3RoIGFyZSBmaW5lIHNvIGNvZXJjZQorICAgICAgICAjIG91cnNlbHZlcyB0byBhIHN0cmluZywgc3dhcCB0aGUgYXJncyBhbmQgZG8gYW5vdGhlciBjb21wYXJpc29uLgorICAgICAgICByZXR1cm4gb3RoZXIgPT0gc2VsZi5lbmNvZGUoKQorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgorCisgICAgZGVmIGFwcGVuZChzZWxmLCBzLCBjaGFyc2V0PU5vbmUsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgICIiIkFwcGVuZCBhIHN0cmluZyB0byB0aGUgTUlNRSBoZWFkZXIuCisKKyAgICAgICAgT3B0aW9uYWwgY2hhcnNldCwgaWYgZ2l2ZW4sIHNob3VsZCBiZSBhIENoYXJzZXQgaW5zdGFuY2Ugb3IgdGhlIG5hbWUKKyAgICAgICAgb2YgYSBjaGFyYWN0ZXIgc2V0ICh3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIENoYXJzZXQgaW5zdGFuY2UpLiAgQQorICAgICAgICB2YWx1ZSBvZiBOb25lICh0aGUgZGVmYXVsdCkgbWVhbnMgdGhhdCB0aGUgY2hhcnNldCBnaXZlbiBpbiB0aGUKKyAgICAgICAgY29uc3RydWN0b3IgaXMgdXNlZC4KKworICAgICAgICBzIG1heSBiZSBhIGJ5dGUgc3RyaW5nIG9yIGEgVW5pY29kZSBzdHJpbmcuICBJZiBpdCBpcyBhIGJ5dGUgc3RyaW5nCisgICAgICAgIChpLmUuIGlzaW5zdGFuY2Uocywgc3RyKSBpcyB0cnVlKSwgdGhlbiBjaGFyc2V0IGlzIHRoZSBlbmNvZGluZyBvZgorICAgICAgICB0aGF0IGJ5dGUgc3RyaW5nLCBhbmQgYSBVbmljb2RlRXJyb3Igd2lsbCBiZSByYWlzZWQgaWYgdGhlIHN0cmluZworICAgICAgICBjYW5ub3QgYmUgZGVjb2RlZCB3aXRoIHRoYXQgY2hhcnNldC4gIElmIHMgaXMgYSBVbmljb2RlIHN0cmluZywgdGhlbgorICAgICAgICBjaGFyc2V0IGlzIGEgaGludCBzcGVjaWZ5aW5nIHRoZSBjaGFyYWN0ZXIgc2V0IG9mIHRoZSBjaGFyYWN0ZXJzIGluCisgICAgICAgIHRoZSBzdHJpbmcuICBJbiB0aGlzIGNhc2UsIHdoZW4gcHJvZHVjaW5nIGFuIFJGQyAyODIyIGNvbXBsaWFudCBoZWFkZXIKKyAgICAgICAgdXNpbmcgUkZDIDIwNDcgcnVsZXMsIHRoZSBVbmljb2RlIHN0cmluZyB3aWxsIGJlIGVuY29kZWQgdXNpbmcgdGhlCisgICAgICAgIGZvbGxvd2luZyBjaGFyc2V0cyBpbiBvcmRlcjogdXMtYXNjaWksIHRoZSBjaGFyc2V0IGhpbnQsIHV0Zi04LiAgVGhlCisgICAgICAgIGZpcnN0IGNoYXJhY3RlciBzZXQgbm90IHRvIHByb3Zva2UgYSBVbmljb2RlRXJyb3IgaXMgdXNlZC4KKworICAgICAgICBPcHRpb25hbCBgZXJyb3JzJyBpcyBwYXNzZWQgYXMgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIGFueSB1bmljb2RlKCkgb3IKKyAgICAgICAgdXN0ci5lbmNvZGUoKSBjYWxsLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgY2hhcnNldCBpcyBOb25lOgorICAgICAgICAgICAgY2hhcnNldCA9IHNlbGYuX2NoYXJzZXQKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShjaGFyc2V0LCBDaGFyc2V0KToKKyAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KGNoYXJzZXQpCisgICAgICAgICMgSWYgdGhlIGNoYXJzZXQgaXMgb3VyIGZhdXggOGJpdCBjaGFyc2V0LCBsZWF2ZSB0aGUgc3RyaW5nIHVuY2hhbmdlZAorICAgICAgICBpZiBjaGFyc2V0ICE9ICc4Yml0JzoKKyAgICAgICAgICAgICMgV2UgbmVlZCB0byB0ZXN0IHRoYXQgdGhlIHN0cmluZyBjYW4gYmUgY29udmVydGVkIHRvIHVuaWNvZGUgYW5kCisgICAgICAgICAgICAjIGJhY2sgdG8gYSBieXRlIHN0cmluZywgZ2l2ZW4gdGhlIGlucHV0IGFuZCBvdXRwdXQgY29kZWNzIG9mIHRoZQorICAgICAgICAgICAgIyBjaGFyc2V0LgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzLCBzdHIpOgorICAgICAgICAgICAgICAgICMgUG9zc2libHkgcmFpc2UgVW5pY29kZUVycm9yIGlmIHRoZSBieXRlIHN0cmluZyBjYW4ndCBiZQorICAgICAgICAgICAgICAgICMgY29udmVydGVkIHRvIGEgdW5pY29kZSB3aXRoIHRoZSBpbnB1dCBjb2RlYyBvZiB0aGUgY2hhcnNldC4KKyAgICAgICAgICAgICAgICBpbmNvZGVjID0gY2hhcnNldC5pbnB1dF9jb2RlYyBvciAndXMtYXNjaWknCisgICAgICAgICAgICAgICAgdXN0ciA9IHVuaWNvZGUocywgaW5jb2RlYywgZXJyb3JzKQorICAgICAgICAgICAgICAgICMgTm93IG1ha2Ugc3VyZSB0aGF0IHRoZSB1bmljb2RlIGNvdWxkIGJlIGNvbnZlcnRlZCBiYWNrIHRvIGEKKyAgICAgICAgICAgICAgICAjIGJ5dGUgc3RyaW5nIHdpdGggdGhlIG91dHB1dCBjb2RlYywgd2hpY2ggbWF5IGJlIGRpZmZlcmVudAorICAgICAgICAgICAgICAgICMgdGhhbiB0aGUgaXB1dCBjb2RlZC4gIFN0aWxsLCB1c2UgdGhlIG9yaWdpbmFsIGJ5dGUgc3RyaW5nLgorICAgICAgICAgICAgICAgIG91dGNvZGVjID0gY2hhcnNldC5vdXRwdXRfY29kZWMgb3IgJ3VzLWFzY2lpJworICAgICAgICAgICAgICAgIHVzdHIuZW5jb2RlKG91dGNvZGVjLCBlcnJvcnMpCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UocywgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgIyBOb3cgd2UgaGF2ZSB0byBiZSBzdXJlIHRoZSB1bmljb2RlIHN0cmluZyBjYW4gYmUgY29udmVydGVkCisgICAgICAgICAgICAgICAgIyB0byBhIGJ5dGUgc3RyaW5nIHdpdGggYSByZWFzb25hYmxlIG91dHB1dCBjb2RlYy4gIFdlIHdhbnQgdG8KKyAgICAgICAgICAgICAgICAjIHVzZSB0aGUgYnl0ZSBzdHJpbmcgaW4gdGhlIGNodW5rLgorICAgICAgICAgICAgICAgIGZvciBjaGFyc2V0IGluIFVTQVNDSUksIGNoYXJzZXQsIFVURjg6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvZGVjID0gY2hhcnNldC5vdXRwdXRfY29kZWMgb3IgJ3VzLWFzY2lpJworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMuZW5jb2RlKG91dGNvZGVjLCBlcnJvcnMpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgJ3V0Zi04IGNvbnZlcnNpb24gZmFpbGVkJworICAgICAgICBzZWxmLl9jaHVua3MuYXBwZW5kKChzLCBjaGFyc2V0KSkKKworICAgIGRlZiBfc3BsaXQoc2VsZiwgcywgY2hhcnNldCwgbWF4bGluZWxlbiwgc3BsaXRjaGFycyk6CisgICAgICAgICMgU3BsaXQgdXAgYSBoZWFkZXIgc2FmZWx5IGZvciB1c2Ugd2l0aCBlbmNvZGVfY2h1bmtzLgorICAgICAgICBzcGxpdHRhYmxlID0gY2hhcnNldC50b19zcGxpdHRhYmxlKHMpCisgICAgICAgIGVuY29kZWQgPSBjaGFyc2V0LmZyb21fc3BsaXR0YWJsZShzcGxpdHRhYmxlLCBUcnVlKQorICAgICAgICBlbGVuID0gY2hhcnNldC5lbmNvZGVkX2hlYWRlcl9sZW4oZW5jb2RlZCkKKyAgICAgICAgIyBJZiB0aGUgbGluZSdzIGVuY29kZWQgbGVuZ3RoIGZpcnN0LCBqdXN0IHJldHVybiBpdAorICAgICAgICBpZiBlbGVuIDw9IG1heGxpbmVsZW46CisgICAgICAgICAgICByZXR1cm4gWyhlbmNvZGVkLCBjaGFyc2V0KV0KKyAgICAgICAgIyBJZiB3ZSBoYXZlIHVuZGV0ZXJtaW5lZCByYXcgOGJpdCBjaGFyYWN0ZXJzIHNpdHRpbmcgaW4gYSBieXRlCisgICAgICAgICMgc3RyaW5nLCB3ZSByZWFsbHkgZG9uJ3Qga25vdyB3aGF0IHRoZSByaWdodCB0aGluZyB0byBkbyBpcy4gIFdlCisgICAgICAgICMgY2FuJ3QgcmVhbGx5IHNwbGl0IGl0IGJlY2F1c2UgaXQgbWlnaHQgYmUgbXVsdGlieXRlIGRhdGEgd2hpY2ggd2UKKyAgICAgICAgIyBjb3VsZCBicmVhayBpZiB3ZSBzcGxpdCBpdCBiZXR3ZWVuIHBhaXJzLiAgVGhlIGxlYXN0IGhhcm0gc2VlbXMgdG8KKyAgICAgICAgIyBiZSB0byBub3Qgc3BsaXQgdGhlIGhlYWRlciBhdCBhbGwsIGJ1dCB0aGF0IG1lYW5zIHRoZXkgY291bGQgZ28gb3V0CisgICAgICAgICMgbG9uZ2VyIHRoYW4gbWF4bGluZWxlbi4KKyAgICAgICAgaWYgY2hhcnNldCA9PSAnOGJpdCc6CisgICAgICAgICAgICByZXR1cm4gWyhzLCBjaGFyc2V0KV0KKyAgICAgICAgIyBCQVc6IEknbSBub3Qgc3VyZSB3aGF0IHRoZSByaWdodCB0ZXN0IGhlcmUgaXMuICBXaGF0IHdlJ3JlIHRyeWluZyB0bworICAgICAgICAjIGRvIGlzIGJlIGZhaXRoZnVsIHRvIFJGQyAyODIyJ3MgcmVjb21tZW5kYXRpb24gdGhhdCAoJDIuMi4zKToKKyAgICAgICAgIworICAgICAgICAjICJOb3RlOiBUaG91Z2ggc3RydWN0dXJlZCBmaWVsZCBib2RpZXMgYXJlIGRlZmluZWQgaW4gc3VjaCBhIHdheSB0aGF0CisgICAgICAgICMgIGZvbGRpbmcgY2FuIHRha2UgcGxhY2UgYmV0d2VlbiBtYW55IG9mIHRoZSBsZXhpY2FsIHRva2VucyAoYW5kIGV2ZW4KKyAgICAgICAgIyAgd2l0aGluIHNvbWUgb2YgdGhlIGxleGljYWwgdG9rZW5zKSwgZm9sZGluZyBTSE9VTEQgYmUgbGltaXRlZCB0bworICAgICAgICAjICBwbGFjaW5nIHRoZSBDUkxGIGF0IGhpZ2hlci1sZXZlbCBzeW50YWN0aWMgYnJlYWtzLiIKKyAgICAgICAgIworICAgICAgICAjIEZvciBub3csIEkgY2FuIG9ubHkgaW1hZ2luZSBkb2luZyB0aGlzIHdoZW4gdGhlIGNoYXJzZXQgaXMgdXMtYXNjaWksCisgICAgICAgICMgYWx0aG91Z2ggaXQncyBwb3NzaWJsZSB0aGF0IG90aGVyIGNoYXJzZXRzIG1heSBhbHNvIGJlbmVmaXQgZnJvbSB0aGUKKyAgICAgICAgIyBoaWdoZXItbGV2ZWwgc3ludGFjdGljIGJyZWFrcy4KKyAgICAgICAgZWxpZiBjaGFyc2V0ID09ICd1cy1hc2NpaSc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3BsaXRfYXNjaWkocywgY2hhcnNldCwgbWF4bGluZWxlbiwgc3BsaXRjaGFycykKKyAgICAgICAgIyBCQVc6IHNob3VsZCB3ZSB1c2UgZW5jb2RlZD8KKyAgICAgICAgZWxpZiBlbGVuID09IGxlbihzKToKKyAgICAgICAgICAgICMgV2UgY2FuIHNwbGl0IG9uIF9tYXhsaW5lbGVuIGJvdW5kYXJpZXMgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlCisgICAgICAgICAgICAjIGVuY29kaW5nIHdvbid0IGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nCisgICAgICAgICAgICBzcGxpdHBudCA9IG1heGxpbmVsZW4KKyAgICAgICAgICAgIGZpcnN0ID0gY2hhcnNldC5mcm9tX3NwbGl0dGFibGUoc3BsaXR0YWJsZVs6c3BsaXRwbnRdLCBGYWxzZSkKKyAgICAgICAgICAgIGxhc3QgPSBjaGFyc2V0LmZyb21fc3BsaXR0YWJsZShzcGxpdHRhYmxlW3NwbGl0cG50Ol0sIEZhbHNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBCaW5hcnkgc2VhcmNoIGZvciBzcGxpdCBwb2ludAorICAgICAgICAgICAgZmlyc3QsIGxhc3QgPSBfYmluc3BsaXQoc3BsaXR0YWJsZSwgY2hhcnNldCwgbWF4bGluZWxlbikKKyAgICAgICAgIyBmaXJzdCBpcyBvZiB0aGUgcHJvcGVyIGxlbmd0aCBzbyBqdXN0IHdyYXAgaXQgaW4gdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICMgY2hyb21lLiAgbGFzdCBtdXN0IGJlIHJlY3Vyc2l2ZWx5IHNwbGl0LgorICAgICAgICBmc3BsaXR0YWJsZSA9IGNoYXJzZXQudG9fc3BsaXR0YWJsZShmaXJzdCkKKyAgICAgICAgZmVuY29kZWQgPSBjaGFyc2V0LmZyb21fc3BsaXR0YWJsZShmc3BsaXR0YWJsZSwgVHJ1ZSkKKyAgICAgICAgY2h1bmsgPSBbKGZlbmNvZGVkLCBjaGFyc2V0KV0KKyAgICAgICAgcmV0dXJuIGNodW5rICsgc2VsZi5fc3BsaXQobGFzdCwgY2hhcnNldCwgc2VsZi5fbWF4bGluZWxlbiwgc3BsaXRjaGFycykKKworICAgIGRlZiBfc3BsaXRfYXNjaWkoc2VsZiwgcywgY2hhcnNldCwgZmlyc3RsZW4sIHNwbGl0Y2hhcnMpOgorICAgICAgICBjaHVua3MgPSBfc3BsaXRfYXNjaWkocywgZmlyc3RsZW4sIHNlbGYuX21heGxpbmVsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb250aW51YXRpb25fd3MsIHNwbGl0Y2hhcnMpCisgICAgICAgIHJldHVybiB6aXAoY2h1bmtzLCBbY2hhcnNldF0qbGVuKGNodW5rcykpCisKKyAgICBkZWYgX2VuY29kZV9jaHVua3Moc2VsZiwgbmV3Y2h1bmtzLCBtYXhsaW5lbGVuKToKKyAgICAgICAgIyBNSU1FLWVuY29kZSBhIGhlYWRlciB3aXRoIG1hbnkgZGlmZmVyZW50IGNoYXJzZXRzIGFuZC9vciBlbmNvZGluZ3MuCisgICAgICAgICMKKyAgICAgICAgIyBHaXZlbiBhIGxpc3Qgb2YgcGFpcnMgKHN0cmluZywgY2hhcnNldCksIHJldHVybiBhIE1JTUUtZW5jb2RlZAorICAgICAgICAjIHN0cmluZyBzdWl0YWJsZSBmb3IgdXNlIGluIGEgaGVhZGVyIGZpZWxkLiAgRWFjaCBwYWlyIG1heSBoYXZlCisgICAgICAgICMgZGlmZmVyZW50IGNoYXJzZXRzIGFuZC9vciBlbmNvZGluZ3MsIGFuZCB0aGUgcmVzdWx0aW5nIGhlYWRlciB3aWxsCisgICAgICAgICMgYWNjdXJhdGVseSByZWZsZWN0IGVhY2ggc2V0dGluZy4KKyAgICAgICAgIworICAgICAgICAjIEVhY2ggZW5jb2RpbmcgY2FuIGJlIGVtYWlsLnV0aWxzLlFQIChxdW90ZWQtcHJpbnRhYmxlLCBmb3IKKyAgICAgICAgIyBBU0NJSS1saWtlIGNoYXJhY3RlciBzZXRzIGxpa2UgaXNvLTg4NTktMSksIGVtYWlsLnV0aWxzLkJBU0U2NAorICAgICAgICAjIChCYXNlNjQsIGZvciBub24tQVNDSUkgbGlrZSBjaGFyYWN0ZXIgc2V0cyBsaWtlIEtPSTgtUiBhbmQKKyAgICAgICAgIyBpc28tMjAyMi1qcCksIG9yIE5vbmUgKG5vIGVuY29kaW5nKS4KKyAgICAgICAgIworICAgICAgICAjIEVhY2ggcGFpciB3aWxsIGJlIHJlcHJlc2VudGVkIG9uIGEgc2VwYXJhdGUgbGluZTsgdGhlIHJlc3VsdGluZworICAgICAgICAjIHN0cmluZyB3aWxsIGJlIGluIHRoZSBmb3JtYXQ6CisgICAgICAgICMKKyAgICAgICAgIyA9P2NoYXJzZXQxP3E/TWFyPUVEYV9Hb256PUUxbGV6X0Fsb25zbz89XG4KKyAgICAgICAgIyAgPT9jaGFyc2V0Mj9iP1N2eHlaMlZ1SUVMMmFXNW4/PSIKKyAgICAgICAgY2h1bmtzID0gW10KKyAgICAgICAgZm9yIGhlYWRlciwgY2hhcnNldCBpbiBuZXdjaHVua3M6CisgICAgICAgICAgICBpZiBub3QgaGVhZGVyOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBjaGFyc2V0IGlzIE5vbmUgb3IgY2hhcnNldC5oZWFkZXJfZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzID0gaGVhZGVyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHMgPSBjaGFyc2V0LmhlYWRlcl9lbmNvZGUoaGVhZGVyKQorICAgICAgICAgICAgIyBEb24ndCBhZGQgbW9yZSBmb2xkaW5nIHdoaXRlc3BhY2UgdGhhbiBuZWNlc3NhcnkKKyAgICAgICAgICAgIGlmIGNodW5rcyBhbmQgY2h1bmtzWy0xXS5lbmRzd2l0aCgnICcpOgorICAgICAgICAgICAgICAgIGV4dHJhID0gJycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXh0cmEgPSAnICcKKyAgICAgICAgICAgIF9tYXhfYXBwZW5kKGNodW5rcywgcywgbWF4bGluZWxlbiwgZXh0cmEpCisgICAgICAgIGpvaW5lciA9IE5MICsgc2VsZi5fY29udGludWF0aW9uX3dzCisgICAgICAgIHJldHVybiBqb2luZXIuam9pbihjaHVua3MpCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIHNwbGl0Y2hhcnM9JzssICcpOgorICAgICAgICAiIiJFbmNvZGUgYSBtZXNzYWdlIGhlYWRlciBpbnRvIGFuIFJGQy1jb21wbGlhbnQgZm9ybWF0LgorCisgICAgICAgIFRoZXJlIGFyZSBtYW55IGlzc3VlcyBpbnZvbHZlZCBpbiBjb252ZXJ0aW5nIGEgZ2l2ZW4gc3RyaW5nIGZvciB1c2UgaW4KKyAgICAgICAgYW4gZW1haWwgaGVhZGVyLiAgT25seSBjZXJ0YWluIGNoYXJhY3RlciBzZXRzIGFyZSByZWFkYWJsZSBpbiBtb3N0CisgICAgICAgIGVtYWlsIGNsaWVudHMsIGFuZCBhcyBoZWFkZXIgc3RyaW5ncyBjYW4gb25seSBjb250YWluIGEgc3Vic2V0IG9mCisgICAgICAgIDctYml0IEFTQ0lJLCBjYXJlIG11c3QgYmUgdGFrZW4gdG8gcHJvcGVybHkgY29udmVydCBhbmQgZW5jb2RlICh3aXRoCisgICAgICAgIEJhc2U2NCBvciBxdW90ZWQtcHJpbnRhYmxlKSBoZWFkZXIgc3RyaW5ncy4gIEluIGFkZGl0aW9uLCB0aGVyZSBpcyBhCisgICAgICAgIDc1LWNoYXJhY3RlciBsZW5ndGggbGltaXQgb24gYW55IGdpdmVuIGVuY29kZWQgaGVhZGVyIGZpZWxkLCBzbworICAgICAgICBsaW5lLXdyYXBwaW5nIG11c3QgYmUgcGVyZm9ybWVkLCBldmVuIHdpdGggZG91YmxlLWJ5dGUgY2hhcmFjdGVyIHNldHMuCisKKyAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBkbyBpdHMgYmVzdCB0byBjb252ZXJ0IHRoZSBzdHJpbmcgdG8gdGhlIGNvcnJlY3QKKyAgICAgICAgY2hhcmFjdGVyIHNldCB1c2VkIGluIGVtYWlsLCBhbmQgZW5jb2RlIGFuZCBsaW5lIHdyYXAgaXQgc2FmZWx5IHdpdGgKKyAgICAgICAgdGhlIGFwcHJvcHJpYXRlIHNjaGVtZSBmb3IgdGhhdCBjaGFyYWN0ZXIgc2V0LgorCisgICAgICAgIElmIHRoZSBnaXZlbiBjaGFyc2V0IGlzIG5vdCBrbm93biBvciBhbiBlcnJvciBvY2N1cnMgZHVyaW5nCisgICAgICAgIGNvbnZlcnNpb24sIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIGhlYWRlciB1bnRvdWNoZWQuCisKKyAgICAgICAgT3B0aW9uYWwgc3BsaXRjaGFycyBpcyBhIHN0cmluZyBjb250YWluaW5nIGNoYXJhY3RlcnMgdG8gc3BsaXQgbG9uZworICAgICAgICBBU0NJSSBsaW5lcyBvbiwgaW4gcm91Z2ggc3VwcG9ydCBvZiBSRkMgMjgyMidzIGBoaWdoZXN0IGxldmVsCisgICAgICAgIHN5bnRhY3RpYyBicmVha3MnLiAgVGhpcyBkb2Vzbid0IGFmZmVjdCBSRkMgMjA0NyBlbmNvZGVkIGxpbmVzLgorICAgICAgICAiIiIKKyAgICAgICAgbmV3Y2h1bmtzID0gW10KKyAgICAgICAgbWF4bGluZWxlbiA9IHNlbGYuX2ZpcnN0bGluZWxlbgorICAgICAgICBsYXN0bGVuID0gMAorICAgICAgICBmb3IgcywgY2hhcnNldCBpbiBzZWxmLl9jaHVua3M6CisgICAgICAgICAgICAjIFRoZSBmaXJzdCBiaXQgb2YgdGhlIG5leHQgY2h1bmsgc2hvdWxkIGJlIGp1c3QgbG9uZyBlbm91Z2ggdG8KKyAgICAgICAgICAgICMgZmlsbCB0aGUgbmV4dCBsaW5lLiAgRG9uJ3QgZm9yZ2V0IHRoZSBzcGFjZSBzZXBhcmF0aW5nIHRoZQorICAgICAgICAgICAgIyBlbmNvZGVkIHdvcmRzLgorICAgICAgICAgICAgdGFyZ2V0bGVuID0gbWF4bGluZWxlbiAtIGxhc3RsZW4gLSAxCisgICAgICAgICAgICBpZiB0YXJnZXRsZW4gPCBjaGFyc2V0LmVuY29kZWRfaGVhZGVyX2xlbignJyk6CisgICAgICAgICAgICAgICAgIyBTdGljayBpdCBvbiB0aGUgbmV4dCBsaW5lCisgICAgICAgICAgICAgICAgdGFyZ2V0bGVuID0gbWF4bGluZWxlbgorICAgICAgICAgICAgbmV3Y2h1bmtzICs9IHNlbGYuX3NwbGl0KHMsIGNoYXJzZXQsIHRhcmdldGxlbiwgc3BsaXRjaGFycykKKyAgICAgICAgICAgIGxhc3RjaHVuaywgbGFzdGNoYXJzZXQgPSBuZXdjaHVua3NbLTFdCisgICAgICAgICAgICBsYXN0bGVuID0gbGFzdGNoYXJzZXQuZW5jb2RlZF9oZWFkZXJfbGVuKGxhc3RjaHVuaykKKyAgICAgICAgdmFsdWUgPSBzZWxmLl9lbmNvZGVfY2h1bmtzKG5ld2NodW5rcywgbWF4bGluZWxlbikKKyAgICAgICAgaWYgX2VtYmVkZWRfaGVhZGVyLnNlYXJjaCh2YWx1ZSk6CisgICAgICAgICAgICByYWlzZSBIZWFkZXJQYXJzZUVycm9yKCJoZWFkZXIgdmFsdWUgYXBwZWFycyB0byBjb250YWluICIKKyAgICAgICAgICAgICAgICAiYW4gZW1iZWRkZWQgaGVhZGVyOiB7IXJ9Ii5mb3JtYXQodmFsdWUpKQorICAgICAgICByZXR1cm4gdmFsdWUKKworCisMCitkZWYgX3NwbGl0X2FzY2lpKHMsIGZpcnN0bGVuLCByZXN0bGVuLCBjb250aW51YXRpb25fd3MsIHNwbGl0Y2hhcnMpOgorICAgIGxpbmVzID0gW10KKyAgICBtYXhsZW4gPSBmaXJzdGxlbgorICAgIGZvciBsaW5lIGluIHMuc3BsaXRsaW5lcygpOgorICAgICAgICAjIElnbm9yZSBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlIChpLmUuIGNvbnRpbnVhdGlvbiB3aGl0ZXNwYWNlKSBhbHJlYWR5CisgICAgICAgICMgb24gdGhlIGxpbmUsIHNpbmNlIHdlJ2xsIGJlIGFkZGluZyBvdXIgb3duLgorICAgICAgICBsaW5lID0gbGluZS5sc3RyaXAoKQorICAgICAgICBpZiBsZW4obGluZSkgPCBtYXhsZW46CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIG1heGxlbiA9IHJlc3RsZW4KKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICMgQXR0ZW1wdCB0byBzcGxpdCB0aGUgbGluZSBhdCB0aGUgaGlnaGVzdC1sZXZlbCBzeW50YWN0aWMgYnJlYWsKKyAgICAgICAgIyBwb3NzaWJsZS4gIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIGEgbG90IG9mIHNtYXJ0cyBhYm91dCBmaWVsZAorICAgICAgICAjIHN5bnRheDsgd2UganVzdCB0cnkgdG8gYnJlYWsgb24gc2VtaS1jb2xvbnMsIHRoZW4gY29tbWFzLCB0aGVuCisgICAgICAgICMgd2hpdGVzcGFjZS4KKyAgICAgICAgZm9yIGNoIGluIHNwbGl0Y2hhcnM6CisgICAgICAgICAgICBpZiBjaCBpbiBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRoZXJlJ3Mgbm90aGluZyB1c2VmdWwgdG8gc3BsaXQgdGhlIGxpbmUgb24sIG5vdCBldmVuIHNwYWNlcywgc28KKyAgICAgICAgICAgICMganVzdCBhcHBlbmQgdGhpcyBsaW5lIHVuY2hhbmdlZAorICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICBtYXhsZW4gPSByZXN0bGVuCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAjIE5vdyBzcGxpdCB0aGUgbGluZSBvbiB0aGUgY2hhcmFjdGVyIHBsdXMgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgICAgICBjcmUgPSByZS5jb21waWxlKHInJXNccyonICUgY2gpCisgICAgICAgIGlmIGNoIGluICc7LCc6CisgICAgICAgICAgICBlb2wgPSBjaAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW9sID0gJycKKyAgICAgICAgam9pbmVyID0gZW9sICsgJyAnCisgICAgICAgIGpvaW5sZW4gPSBsZW4oam9pbmVyKQorICAgICAgICB3c2xlbiA9IGxlbihjb250aW51YXRpb25fd3MucmVwbGFjZSgnXHQnLCBTUEFDRTgpKQorICAgICAgICB0aGlzID0gW10KKyAgICAgICAgbGluZWxlbiA9IDAKKyAgICAgICAgZm9yIHBhcnQgaW4gY3JlLnNwbGl0KGxpbmUpOgorICAgICAgICAgICAgY3VybGVuID0gbGluZWxlbiArIG1heCgwLCBsZW4odGhpcyktMSkgKiBqb2lubGVuCisgICAgICAgICAgICBwYXJ0bGVuID0gbGVuKHBhcnQpCisgICAgICAgICAgICBvbmZpcnN0bGluZSA9IG5vdCBsaW5lcworICAgICAgICAgICAgIyBXZSBkb24ndCB3YW50IHRvIHNwbGl0IGFmdGVyIHRoZSBmaWVsZCBuYW1lLCBpZiB3ZSdyZSBvbiB0aGUKKyAgICAgICAgICAgICMgZmlyc3QgbGluZSBhbmQgdGhlIGZpZWxkIG5hbWUgaXMgcHJlc2VudCBpbiB0aGUgaGVhZGVyIHN0cmluZy4KKyAgICAgICAgICAgIGlmIGNoID09ICcgJyBhbmQgb25maXJzdGxpbmUgYW5kIFwKKyAgICAgICAgICAgICAgICAgICBsZW4odGhpcykgPT0gMSBhbmQgZmNyZS5tYXRjaCh0aGlzWzBdKToKKyAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZChwYXJ0KQorICAgICAgICAgICAgICAgIGxpbmVsZW4gKz0gcGFydGxlbgorICAgICAgICAgICAgZWxpZiBjdXJsZW4gKyBwYXJ0bGVuID4gbWF4bGVuOgorICAgICAgICAgICAgICAgIGlmIHRoaXM6CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChqb2luZXIuam9pbih0aGlzKSArIGVvbCkKKyAgICAgICAgICAgICAgICAjIElmIHRoaXMgcGFydCBpcyBsb25nZXIgdGhhbiBtYXhsZW4gYW5kIHdlIGFyZW4ndCBhbHJlYWR5CisgICAgICAgICAgICAgICAgIyBzcGxpdHRpbmcgb24gd2hpdGVzcGFjZSwgdHJ5IHRvIHJlY3Vyc2l2ZWx5IHNwbGl0IHRoaXMgbGluZQorICAgICAgICAgICAgICAgICMgb24gd2hpdGVzcGFjZS4KKyAgICAgICAgICAgICAgICBpZiBwYXJ0bGVuID4gbWF4bGVuIGFuZCBjaCAhPSAnICc6CisgICAgICAgICAgICAgICAgICAgIHN1YmwgPSBfc3BsaXRfYXNjaWkocGFydCwgbWF4bGVuLCByZXN0bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbl93cywgJyAnKQorICAgICAgICAgICAgICAgICAgICBsaW5lcy5leHRlbmQoc3VibFs6LTFdKQorICAgICAgICAgICAgICAgICAgICB0aGlzID0gW3N1YmxbLTFdXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPSBbcGFydF0KKyAgICAgICAgICAgICAgICBsaW5lbGVuID0gd3NsZW4gKyBsZW4odGhpc1stMV0pCisgICAgICAgICAgICAgICAgbWF4bGVuID0gcmVzdGxlbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0aGlzLmFwcGVuZChwYXJ0KQorICAgICAgICAgICAgICAgIGxpbmVsZW4gKz0gcGFydGxlbgorICAgICAgICAjIFB1dCBhbnkgbGVmdCBvdmVyIHBhcnRzIG9uIGEgbGluZSBieSB0aGVtc2VsdmVzCisgICAgICAgIGlmIHRoaXM6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoam9pbmVyLmpvaW4odGhpcykpCisgICAgcmV0dXJuIGxpbmVzCisKKworDAorZGVmIF9iaW5zcGxpdChzcGxpdHRhYmxlLCBjaGFyc2V0LCBtYXhsaW5lbGVuKToKKyAgICBpID0gMAorICAgIGogPSBsZW4oc3BsaXR0YWJsZSkKKyAgICB3aGlsZSBpIDwgajoKKyAgICAgICAgIyBJbnZhcmlhbnRzOgorICAgICAgICAjIDEuIHNwbGl0dGFibGVbOmtdIGZpdHMgZm9yIGFsbCBrIDw9IGkgKG5vdGUgdGhhdCB3ZSAqYXNzdW1lKiwKKyAgICAgICAgIyAgICBhdCB0aGUgc3RhcnQsIHRoYXQgc3BsaXR0YWJsZVs6MF0gZml0cykuCisgICAgICAgICMgMi4gc3BsaXR0YWJsZVs6a10gZG9lcyBub3QgZml0IGZvciBhbnkgayA+IGogKGF0IHRoZSBzdGFydCwKKyAgICAgICAgIyAgICB0aGlzIG1lYW5zIHdlIHNob3VsZG4ndCBsb29rIGF0IGFueSBrID4gbGVuKHNwbGl0dGFibGUpKS4KKyAgICAgICAgIyAzLiBXZSBkb24ndCBrbm93IGFib3V0IHNwbGl0dGFibGVbOmtdIGZvciBrIGluIGkrMS4uai4KKyAgICAgICAgIyA0LiBXZSB3YW50IHRvIHNldCBpIHRvIHRoZSBsYXJnZXN0IGsgdGhhdCBmaXRzLCB3aXRoIGkgPD0gayA8PSBqLgorICAgICAgICAjCisgICAgICAgIG0gPSAoaStqKzEpID4+IDEgICMgY2VpbGluZygoaStqKS8yKTsgaSA8IG0gPD0gagorICAgICAgICBjaHVuayA9IGNoYXJzZXQuZnJvbV9zcGxpdHRhYmxlKHNwbGl0dGFibGVbOm1dLCBUcnVlKQorICAgICAgICBjaHVua2xlbiA9IGNoYXJzZXQuZW5jb2RlZF9oZWFkZXJfbGVuKGNodW5rKQorICAgICAgICBpZiBjaHVua2xlbiA8PSBtYXhsaW5lbGVuOgorICAgICAgICAgICAgIyBtIGlzIGFjY2VwdGFibGUsIHNvIGlzIGEgbmV3IGxvd2VyIGJvdW5kLgorICAgICAgICAgICAgaSA9IG0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgbSBpcyBub3QgYWNjZXB0YWJsZSwgc28gZmluYWwgaSBtdXN0IGJlIDwgbS4KKyAgICAgICAgICAgIGogPSBtIC0gMQorICAgICMgaSA9PSBqLiAgSW52YXJpYW50ICMxIGltcGxpZXMgdGhhdCBzcGxpdHRhYmxlWzppXSBmaXRzLCBhbmQKKyAgICAjIGludmFyaWFudCAjMiBpbXBsaWVzIHRoYXQgc3BsaXR0YWJsZVs6aSsxXSBkb2VzIG5vdCBmaXQsIHNvIGkKKyAgICAjIGlzIHdoYXQgd2UncmUgbG9va2luZyBmb3IuCisgICAgZmlyc3QgPSBjaGFyc2V0LmZyb21fc3BsaXR0YWJsZShzcGxpdHRhYmxlWzppXSwgRmFsc2UpCisgICAgbGFzdCAgPSBjaGFyc2V0LmZyb21fc3BsaXR0YWJsZShzcGxpdHRhYmxlW2k6XSwgRmFsc2UpCisgICAgcmV0dXJuIGZpcnN0LCBsYXN0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2hlYWRlci5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL2hlYWRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1MWYzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvaGVhZGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2hlYWRlci5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL2hlYWRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlMmYzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvaGVhZGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2l0ZXJhdG9ycy5weSBiL2xpYi9weXRob24yLjcvZW1haWwvaXRlcmF0b3JzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OWYyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2l0ZXJhdG9ycy5weQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIlZhcmlvdXMgdHlwZXMgb2YgdXNlZnVsIGl0ZXJhdG9ycyBhbmQgZ2VuZXJhdG9ycy4iIiIKKworX19hbGxfXyA9IFsKKyAgICAnYm9keV9saW5lX2l0ZXJhdG9yJywKKyAgICAndHlwZWRfc3VicGFydF9pdGVyYXRvcicsCisgICAgJ3dhbGsnLAorICAgICMgRG8gbm90IGluY2x1ZGUgX3N0cnVjdHVyZSgpIHNpbmNlIGl0J3MgcGFydCBvZiB0aGUgZGVidWdnaW5nIEFQSS4KKyAgICBdCisKK2ltcG9ydCBzeXMKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCisKKwwKKyMgVGhpcyBmdW5jdGlvbiB3aWxsIGJlY29tZSBhIG1ldGhvZCBvZiB0aGUgTWVzc2FnZSBjbGFzcworZGVmIHdhbGsoc2VsZik6CisgICAgIiIiV2FsayBvdmVyIHRoZSBtZXNzYWdlIHRyZWUsIHlpZWxkaW5nIGVhY2ggc3VicGFydC4KKworICAgIFRoZSB3YWxrIGlzIHBlcmZvcm1lZCBpbiBkZXB0aC1maXJzdCBvcmRlci4gIFRoaXMgbWV0aG9kIGlzIGEKKyAgICBnZW5lcmF0b3IuCisgICAgIiIiCisgICAgeWllbGQgc2VsZgorICAgIGlmIHNlbGYuaXNfbXVsdGlwYXJ0KCk6CisgICAgICAgIGZvciBzdWJwYXJ0IGluIHNlbGYuZ2V0X3BheWxvYWQoKToKKyAgICAgICAgICAgIGZvciBzdWJzdWJwYXJ0IGluIHN1YnBhcnQud2FsaygpOgorICAgICAgICAgICAgICAgIHlpZWxkIHN1YnN1YnBhcnQKKworCisMCisjIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIGltcG9ydGVkIGludG8gdGhlIEl0ZXJhdG9ycy5weSBpbnRlcmZhY2UgbW9kdWxlLgorZGVmIGJvZHlfbGluZV9pdGVyYXRvcihtc2csIGRlY29kZT1GYWxzZSk6CisgICAgIiIiSXRlcmF0ZSBvdmVyIHRoZSBwYXJ0cywgcmV0dXJuaW5nIHN0cmluZyBwYXlsb2FkcyBsaW5lLWJ5LWxpbmUuCisKKyAgICBPcHRpb25hbCBkZWNvZGUgKGRlZmF1bHQgRmFsc2UpIGlzIHBhc3NlZCB0aHJvdWdoIHRvIC5nZXRfcGF5bG9hZCgpLgorICAgICIiIgorICAgIGZvciBzdWJwYXJ0IGluIG1zZy53YWxrKCk6CisgICAgICAgIHBheWxvYWQgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKGRlY29kZT1kZWNvZGUpCisgICAgICAgIGlmIGlzaW5zdGFuY2UocGF5bG9hZCwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBTdHJpbmdJTyhwYXlsb2FkKToKKyAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCisKKworZGVmIHR5cGVkX3N1YnBhcnRfaXRlcmF0b3IobXNnLCBtYWludHlwZT0ndGV4dCcsIHN1YnR5cGU9Tm9uZSk6CisgICAgIiIiSXRlcmF0ZSBvdmVyIHRoZSBzdWJwYXJ0cyB3aXRoIGEgZ2l2ZW4gTUlNRSB0eXBlLgorCisgICAgVXNlIGBtYWludHlwZScgYXMgdGhlIG1haW4gTUlNRSB0eXBlIHRvIG1hdGNoIGFnYWluc3Q7IHRoaXMgZGVmYXVsdHMgdG8KKyAgICAidGV4dCIuICBPcHRpb25hbCBgc3VidHlwZScgaXMgdGhlIE1JTUUgc3VidHlwZSB0byBtYXRjaCBhZ2FpbnN0OyBpZgorICAgIG9taXR0ZWQsIG9ubHkgdGhlIG1haW4gdHlwZSBpcyBtYXRjaGVkLgorICAgICIiIgorICAgIGZvciBzdWJwYXJ0IGluIG1zZy53YWxrKCk6CisgICAgICAgIGlmIHN1YnBhcnQuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSA9PSBtYWludHlwZToKKyAgICAgICAgICAgIGlmIHN1YnR5cGUgaXMgTm9uZSBvciBzdWJwYXJ0LmdldF9jb250ZW50X3N1YnR5cGUoKSA9PSBzdWJ0eXBlOgorICAgICAgICAgICAgICAgIHlpZWxkIHN1YnBhcnQKKworCisMCitkZWYgX3N0cnVjdHVyZShtc2csIGZwPU5vbmUsIGxldmVsPTAsIGluY2x1ZGVfZGVmYXVsdD1GYWxzZSk6CisgICAgIiIiQSBoYW5keSBkZWJ1Z2dpbmcgYWlkIiIiCisgICAgaWYgZnAgaXMgTm9uZToKKyAgICAgICAgZnAgPSBzeXMuc3Rkb3V0CisgICAgdGFiID0gJyAnICogKGxldmVsICogNCkKKyAgICBwcmludCA+PiBmcCwgdGFiICsgbXNnLmdldF9jb250ZW50X3R5cGUoKSwKKyAgICBpZiBpbmNsdWRlX2RlZmF1bHQ6CisgICAgICAgIHByaW50ID4+IGZwLCAnWyVzXScgJSBtc2cuZ2V0X2RlZmF1bHRfdHlwZSgpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgPj4gZnAKKyAgICBpZiBtc2cuaXNfbXVsdGlwYXJ0KCk6CisgICAgICAgIGZvciBzdWJwYXJ0IGluIG1zZy5nZXRfcGF5bG9hZCgpOgorICAgICAgICAgICAgX3N0cnVjdHVyZShzdWJwYXJ0LCBmcCwgbGV2ZWwrMSwgaW5jbHVkZV9kZWZhdWx0KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9pdGVyYXRvcnMucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9pdGVyYXRvcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZWMyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2l0ZXJhdG9ycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9pdGVyYXRvcnMucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9pdGVyYXRvcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZWMyMWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2l0ZXJhdG9ycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9tZXNzYWdlLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9tZXNzYWdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTMzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21lc3NhZ2UucHkKQEAgLTAsMCArMSw3OTcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQmFzaWMgbWVzc2FnZSBvYmplY3QgZm9yIHRoZSBlbWFpbCBwYWNrYWdlIG9iamVjdCBtb2RlbC4iIiIKKworX19hbGxfXyA9IFsnTWVzc2FnZSddCisKK2ltcG9ydCByZQoraW1wb3J0IHV1CitpbXBvcnQgYmluYXNjaWkKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKKyMgSW50cmFwYWNrYWdlIGltcG9ydHMKK2ltcG9ydCBlbWFpbC5jaGFyc2V0Citmcm9tIGVtYWlsIGltcG9ydCB1dGlscworZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCisKK1NFTUlTUEFDRSA9ICc7ICcKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGBzcGVjaWFsJyBjaGFyYWN0ZXJzIGluIHBhcmFtZXRlcnMsIHRoZQorIyBleGlzdGVuY2Ugb2Ygd2hpY2ggZm9yY2UgcXVvdGluZyBvZiB0aGUgcGFyYW1ldGVyIHZhbHVlLgordHNwZWNpYWxzID0gcmUuY29tcGlsZShyJ1sgXChcKTw+QCw7OlxcIi9cW1xdXD89XScpCisKKworIyBIZWxwZXIgZnVuY3Rpb25zCitkZWYgX3NwbGl0cGFyYW0ocGFyYW0pOgorICAgICMgU3BsaXQgaGVhZGVyIHBhcmFtZXRlcnMuICBCQVc6IHRoaXMgbWF5IGJlIHRvbyBzaW1wbGUuICBJdCBpc24ndAorICAgICMgc3RyaWN0bHkgUkZDIDIwNDUgKHNlY3Rpb24gNS4xKSBjb21wbGlhbnQsIGJ1dCBpdCBjYXRjaGVzIG1vc3QgaGVhZGVycworICAgICMgZm91bmQgaW4gdGhlIHdpbGQuICBXZSBtYXkgZXZlbnR1YWxseSBuZWVkIGEgZnVsbCBmbGVkZ2VkIHBhcnNlcgorICAgICMgZXZlbnR1YWxseS4KKyAgICBhLCBzZXAsIGIgPSBwYXJhbS5wYXJ0aXRpb24oJzsnKQorICAgIGlmIG5vdCBzZXA6CisgICAgICAgIHJldHVybiBhLnN0cmlwKCksIE5vbmUKKyAgICByZXR1cm4gYS5zdHJpcCgpLCBiLnN0cmlwKCkKKwwKK2RlZiBfZm9ybWF0cGFyYW0ocGFyYW0sIHZhbHVlPU5vbmUsIHF1b3RlPVRydWUpOgorICAgICIiIkNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGZvcm1hdCBhbmQgcmV0dXJuIGEga2V5PXZhbHVlIHBhaXIuCisKKyAgICBUaGlzIHdpbGwgcXVvdGUgdGhlIHZhbHVlIGlmIG5lZWRlZCBvciBpZiBxdW90ZSBpcyB0cnVlLiAgSWYgdmFsdWUgaXMgYQorICAgIHRocmVlIHR1cGxlIChjaGFyc2V0LCBsYW5ndWFnZSwgdmFsdWUpLCBpdCB3aWxsIGJlIGVuY29kZWQgYWNjb3JkaW5nCisgICAgdG8gUkZDMjIzMSBydWxlcy4KKyAgICAiIiIKKyAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZSBhbmQgbGVuKHZhbHVlKSA+IDA6CisgICAgICAgICMgQSB0dXBsZSBpcyB1c2VkIGZvciBSRkMgMjIzMSBlbmNvZGVkIHBhcmFtZXRlciB2YWx1ZXMgd2hlcmUgaXRlbXMKKyAgICAgICAgIyBhcmUgKGNoYXJzZXQsIGxhbmd1YWdlLCB2YWx1ZSkuICBjaGFyc2V0IGlzIGEgc3RyaW5nLCBub3QgYSBDaGFyc2V0CisgICAgICAgICMgaW5zdGFuY2UuCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKKyAgICAgICAgICAgICMgRW5jb2RlIGFzIHBlciBSRkMgMjIzMQorICAgICAgICAgICAgcGFyYW0gKz0gJyonCisgICAgICAgICAgICB2YWx1ZSA9IHV0aWxzLmVuY29kZV9yZmMyMjMxKHZhbHVlWzJdLCB2YWx1ZVswXSwgdmFsdWVbMV0pCisgICAgICAgICMgQkFXOiBQbGVhc2UgY2hlY2sgdGhpcy4gIEkgdGhpbmsgdGhhdCBpZiBxdW90ZSBpcyBzZXQgaXQgc2hvdWxkCisgICAgICAgICMgZm9yY2UgcXVvdGluZyBldmVuIGlmIG5vdCBuZWNlc3NhcnkuCisgICAgICAgIGlmIHF1b3RlIG9yIHRzcGVjaWFscy5zZWFyY2godmFsdWUpOgorICAgICAgICAgICAgcmV0dXJuICclcz0iJXMiJyAlIChwYXJhbSwgdXRpbHMucXVvdGUodmFsdWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICclcz0lcycgJSAocGFyYW0sIHZhbHVlKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBwYXJhbQorCitkZWYgX3BhcnNlcGFyYW0ocyk6CisgICAgcGxpc3QgPSBbXQorICAgIHdoaWxlIHNbOjFdID09ICc7JzoKKyAgICAgICAgcyA9IHNbMTpdCisgICAgICAgIGVuZCA9IHMuZmluZCgnOycpCisgICAgICAgIHdoaWxlIGVuZCA+IDAgYW5kIChzLmNvdW50KCciJywgMCwgZW5kKSAtIHMuY291bnQoJ1xcIicsIDAsIGVuZCkpICUgMjoKKyAgICAgICAgICAgIGVuZCA9IHMuZmluZCgnOycsIGVuZCArIDEpCisgICAgICAgIGlmIGVuZCA8IDA6CisgICAgICAgICAgICBlbmQgPSBsZW4ocykKKyAgICAgICAgZiA9IHNbOmVuZF0KKyAgICAgICAgaWYgJz0nIGluIGY6CisgICAgICAgICAgICBpID0gZi5pbmRleCgnPScpCisgICAgICAgICAgICBmID0gZls6aV0uc3RyaXAoKS5sb3dlcigpICsgJz0nICsgZltpKzE6XS5zdHJpcCgpCisgICAgICAgIHBsaXN0LmFwcGVuZChmLnN0cmlwKCkpCisgICAgICAgIHMgPSBzW2VuZDpdCisgICAgcmV0dXJuIHBsaXN0CisKKworZGVmIF91bnF1b3RldmFsdWUodmFsdWUpOgorICAgICMgVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB1dGlscy5jb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKCkgYmVjYXVzZSBpdCBkb2Vzbid0CisgICAgIyB0cnkgdG8gY29udmVydCB0aGUgdmFsdWUgdG8gYSB1bmljb2RlLiAgTWVzc2FnZS5nZXRfcGFyYW0oKSBhbmQKKyAgICAjIE1lc3NhZ2UuZ2V0X3BhcmFtcygpIGFyZSBib3RoIGN1cnJlbnRseSBkZWZpbmVkIHRvIHJldHVybiB0aGUgdHVwbGUgaW4KKyAgICAjIHRoZSBmYWNlIG9mIFJGQyAyMjMxIHBhcmFtZXRlcnMuCisgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgorICAgICAgICByZXR1cm4gdmFsdWVbMF0sIHZhbHVlWzFdLCB1dGlscy51bnF1b3RlKHZhbHVlWzJdKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiB1dGlscy51bnF1b3RlKHZhbHVlKQorCisKKwwKK2NsYXNzIE1lc3NhZ2U6CisgICAgIiIiQmFzaWMgbWVzc2FnZSBvYmplY3QuCisKKyAgICBBIG1lc3NhZ2Ugb2JqZWN0IGlzIGRlZmluZWQgYXMgc29tZXRoaW5nIHRoYXQgaGFzIGEgYnVuY2ggb2YgUkZDIDI4MjIKKyAgICBoZWFkZXJzIGFuZCBhIHBheWxvYWQuICBJdCBtYXkgb3B0aW9uYWxseSBoYXZlIGFuIGVudmVsb3BlIGhlYWRlcgorICAgIChhLmsuYS4gVW5peC1Gcm9tIG9yIEZyb21fIGhlYWRlcikuICBJZiB0aGUgbWVzc2FnZSBpcyBhIGNvbnRhaW5lciAoaS5lLiBhCisgICAgbXVsdGlwYXJ0IG9yIGEgbWVzc2FnZS9yZmM4MjIpLCB0aGVuIHRoZSBwYXlsb2FkIGlzIGEgbGlzdCBvZiBNZXNzYWdlCisgICAgb2JqZWN0cywgb3RoZXJ3aXNlIGl0IGlzIGEgc3RyaW5nLgorCisgICAgTWVzc2FnZSBvYmplY3RzIGltcGxlbWVudCBwYXJ0IG9mIHRoZSBgbWFwcGluZycgaW50ZXJmYWNlLCB3aGljaCBhc3N1bWVzCisgICAgdGhlcmUgaXMgZXhhY3RseSBvbmUgb2NjdXJyZW5jZSBvZiB0aGUgaGVhZGVyIHBlciBtZXNzYWdlLiAgU29tZSBoZWFkZXJzCisgICAgZG8gaW4gZmFjdCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgKGUuZy4gUmVjZWl2ZWQpIGFuZCBmb3IgdGhvc2UgaGVhZGVycywKKyAgICB5b3UgbXVzdCB1c2UgdGhlIGV4cGxpY2l0IEFQSSB0byBzZXQgb3IgZ2V0IGFsbCB0aGUgaGVhZGVycy4gIE5vdCBhbGwgb2YKKyAgICB0aGUgbWFwcGluZyBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2hlYWRlcnMgPSBbXQorICAgICAgICBzZWxmLl91bml4ZnJvbSA9IE5vbmUKKyAgICAgICAgc2VsZi5fcGF5bG9hZCA9IE5vbmUKKyAgICAgICAgc2VsZi5fY2hhcnNldCA9IE5vbmUKKyAgICAgICAgIyBEZWZhdWx0cyBmb3IgbXVsdGlwYXJ0IG1lc3NhZ2VzCisgICAgICAgIHNlbGYucHJlYW1ibGUgPSBzZWxmLmVwaWxvZ3VlID0gTm9uZQorICAgICAgICBzZWxmLmRlZmVjdHMgPSBbXQorICAgICAgICAjIERlZmF1bHQgY29udGVudCB0eXBlCisgICAgICAgIHNlbGYuX2RlZmF1bHRfdHlwZSA9ICd0ZXh0L3BsYWluJworCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgZW50aXJlIGZvcm1hdHRlZCBtZXNzYWdlIGFzIGEgc3RyaW5nLgorICAgICAgICBUaGlzIGluY2x1ZGVzIHRoZSBoZWFkZXJzLCBib2R5LCBhbmQgZW52ZWxvcGUgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuYXNfc3RyaW5nKHVuaXhmcm9tPVRydWUpCisKKyAgICBkZWYgYXNfc3RyaW5nKHNlbGYsIHVuaXhmcm9tPUZhbHNlKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBlbnRpcmUgZm9ybWF0dGVkIG1lc3NhZ2UgYXMgYSBzdHJpbmcuCisgICAgICAgIE9wdGlvbmFsIGB1bml4ZnJvbScgd2hlbiBUcnVlLCBtZWFucyBpbmNsdWRlIHRoZSBVbml4IEZyb21fIGVudmVsb3BlCisgICAgICAgIGhlYWRlci4KKworICAgICAgICBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGFuZCBtYXkgbm90IGdlbmVyYXRlIHRoZSBtZXNzYWdlIGV4YWN0bHkKKyAgICAgICAgYXMgeW91IGludGVuZCBiZWNhdXNlIGJ5IGRlZmF1bHQgaXQgbWFuZ2xlcyBsaW5lcyB0aGF0IGJlZ2luIHdpdGgKKyAgICAgICAgIkZyb20gIi4gIEZvciBtb3JlIGZsZXhpYmlsaXR5LCB1c2UgdGhlIGZsYXR0ZW4oKSBtZXRob2Qgb2YgYQorICAgICAgICBHZW5lcmF0b3IgaW5zdGFuY2UuCisgICAgICAgICIiIgorICAgICAgICBmcm9tIGVtYWlsLmdlbmVyYXRvciBpbXBvcnQgR2VuZXJhdG9yCisgICAgICAgIGZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKGZwKQorICAgICAgICBnLmZsYXR0ZW4oc2VsZiwgdW5peGZyb209dW5peGZyb20pCisgICAgICAgIHJldHVybiBmcC5nZXR2YWx1ZSgpCisKKyAgICBkZWYgaXNfbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgbWVzc2FnZSBjb25zaXN0cyBvZiBtdWx0aXBsZSBwYXJ0cy4iIiIKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uoc2VsZi5fcGF5bG9hZCwgbGlzdCkKKworICAgICMKKyAgICAjIFVuaXggRnJvbV8gbGluZQorICAgICMKKyAgICBkZWYgc2V0X3VuaXhmcm9tKHNlbGYsIHVuaXhmcm9tKToKKyAgICAgICAgc2VsZi5fdW5peGZyb20gPSB1bml4ZnJvbQorCisgICAgZGVmIGdldF91bml4ZnJvbShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VuaXhmcm9tCisKKyAgICAjCisgICAgIyBQYXlsb2FkIG1hbmlwdWxhdGlvbi4KKyAgICAjCisgICAgZGVmIGF0dGFjaChzZWxmLCBwYXlsb2FkKToKKyAgICAgICAgIiIiQWRkIHRoZSBnaXZlbiBwYXlsb2FkIHRvIHRoZSBjdXJyZW50IHBheWxvYWQuCisKKyAgICAgICAgVGhlIGN1cnJlbnQgcGF5bG9hZCB3aWxsIGFsd2F5cyBiZSBhIGxpc3Qgb2Ygb2JqZWN0cyBhZnRlciB0aGlzIG1ldGhvZAorICAgICAgICBpcyBjYWxsZWQuICBJZiB5b3Ugd2FudCB0byBzZXQgdGhlIHBheWxvYWQgdG8gYSBzY2FsYXIgb2JqZWN0LCB1c2UKKyAgICAgICAgc2V0X3BheWxvYWQoKSBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fcGF5bG9hZCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fcGF5bG9hZCA9IFtwYXlsb2FkXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fcGF5bG9hZC5hcHBlbmQocGF5bG9hZCkKKworICAgIGRlZiBnZXRfcGF5bG9hZChzZWxmLCBpPU5vbmUsIGRlY29kZT1GYWxzZSk6CisgICAgICAgICIiIlJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgcGF5bG9hZC4KKworICAgICAgICBUaGUgcGF5bG9hZCB3aWxsIGVpdGhlciBiZSBhIGxpc3Qgb2JqZWN0IG9yIGEgc3RyaW5nLiAgSWYgeW91IG11dGF0ZQorICAgICAgICB0aGUgbGlzdCBvYmplY3QsIHlvdSBtb2RpZnkgdGhlIG1lc3NhZ2UncyBwYXlsb2FkIGluIHBsYWNlLiAgT3B0aW9uYWwKKyAgICAgICAgaSByZXR1cm5zIHRoYXQgaW5kZXggaW50byB0aGUgcGF5bG9hZC4KKworICAgICAgICBPcHRpb25hbCBkZWNvZGUgaXMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGF5bG9hZCBzaG91bGQgYmUKKyAgICAgICAgZGVjb2RlZCBvciBub3QsIGFjY29yZGluZyB0byB0aGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIKKyAgICAgICAgKGRlZmF1bHQgaXMgRmFsc2UpLgorCisgICAgICAgIFdoZW4gVHJ1ZSBhbmQgdGhlIG1lc3NhZ2UgaXMgbm90IGEgbXVsdGlwYXJ0LCB0aGUgcGF5bG9hZCB3aWxsIGJlCisgICAgICAgIGRlY29kZWQgaWYgdGhpcyBoZWFkZXIncyB2YWx1ZSBpcyBgcXVvdGVkLXByaW50YWJsZScgb3IgYGJhc2U2NCcuICBJZgorICAgICAgICBzb21lIG90aGVyIGVuY29kaW5nIGlzIHVzZWQsIG9yIHRoZSBoZWFkZXIgaXMgbWlzc2luZywgb3IgaWYgdGhlCisgICAgICAgIHBheWxvYWQgaGFzIGJvZ3VzIGRhdGEgKGkuZS4gYm9ndXMgYmFzZTY0IG9yIHV1ZW5jb2RlZCBkYXRhKSwgdGhlCisgICAgICAgIHBheWxvYWQgaXMgcmV0dXJuZWQgYXMtaXMuCisKKyAgICAgICAgSWYgdGhlIG1lc3NhZ2UgaXMgYSBtdWx0aXBhcnQgYW5kIHRoZSBkZWNvZGUgZmxhZyBpcyBUcnVlLCB0aGVuIE5vbmUKKyAgICAgICAgaXMgcmV0dXJuZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBpIGlzIE5vbmU6CisgICAgICAgICAgICBwYXlsb2FkID0gc2VsZi5fcGF5bG9hZAorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHNlbGYuX3BheWxvYWQsIGxpc3QpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdFeHBlY3RlZCBsaXN0LCBnb3QgJXMnICUgdHlwZShzZWxmLl9wYXlsb2FkKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBheWxvYWQgPSBzZWxmLl9wYXlsb2FkW2ldCisgICAgICAgIGlmIGRlY29kZToKKyAgICAgICAgICAgIGlmIHNlbGYuaXNfbXVsdGlwYXJ0KCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGN0ZSA9IHNlbGYuZ2V0KCdjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJywgJycpLmxvd2VyKCkKKyAgICAgICAgICAgIGlmIGN0ZSA9PSAncXVvdGVkLXByaW50YWJsZSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLl9xZGVjb2RlKHBheWxvYWQpCisgICAgICAgICAgICBlbGlmIGN0ZSA9PSAnYmFzZTY0JzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB1dGlscy5fYmRlY29kZShwYXlsb2FkKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBiaW5hc2NpaS5FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyBJbmNvcnJlY3QgcGFkZGluZworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZAorICAgICAgICAgICAgZWxpZiBjdGUgaW4gKCd4LXV1ZW5jb2RlJywgJ3V1ZW5jb2RlJywgJ3V1ZScsICd4LXV1ZScpOgorICAgICAgICAgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHV1LmRlY29kZShTdHJpbmdJTyhwYXlsb2FkKydcbicpLCBzZnAsIHF1aWV0PVRydWUpCisgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBzZnAuZ2V0dmFsdWUoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCB1dS5FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyBTb21lIGRlY29kaW5nIHByb2JsZW0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQKKyAgICAgICAgIyBFdmVyeXRoaW5nIGVsc2UsIGluY2x1ZGluZyBlbmNvZGluZ3Mgd2l0aCA4Yml0IG9yIDdiaXQgYXJlIHJldHVybmVkCisgICAgICAgICMgdW5jaGFuZ2VkLgorICAgICAgICByZXR1cm4gcGF5bG9hZAorCisgICAgZGVmIHNldF9wYXlsb2FkKHNlbGYsIHBheWxvYWQsIGNoYXJzZXQ9Tm9uZSk6CisgICAgICAgICIiIlNldCB0aGUgcGF5bG9hZCB0byB0aGUgZ2l2ZW4gdmFsdWUuCisKKyAgICAgICAgT3B0aW9uYWwgY2hhcnNldCBzZXRzIHRoZSBtZXNzYWdlJ3MgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0LiAgU2VlCisgICAgICAgIHNldF9jaGFyc2V0KCkgZm9yIGRldGFpbHMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9wYXlsb2FkID0gcGF5bG9hZAorICAgICAgICBpZiBjaGFyc2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zZXRfY2hhcnNldChjaGFyc2V0KQorCisgICAgZGVmIHNldF9jaGFyc2V0KHNlbGYsIGNoYXJzZXQpOgorICAgICAgICAiIiJTZXQgdGhlIGNoYXJzZXQgb2YgdGhlIHBheWxvYWQgdG8gYSBnaXZlbiBjaGFyYWN0ZXIgc2V0LgorCisgICAgICAgIGNoYXJzZXQgY2FuIGJlIGEgQ2hhcnNldCBpbnN0YW5jZSwgYSBzdHJpbmcgbmFtaW5nIGEgY2hhcmFjdGVyIHNldCwgb3IKKyAgICAgICAgTm9uZS4gIElmIGl0IGlzIGEgc3RyaW5nIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGEgQ2hhcnNldCBpbnN0YW5jZS4KKyAgICAgICAgSWYgY2hhcnNldCBpcyBOb25lLCB0aGUgY2hhcnNldCBwYXJhbWV0ZXIgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlCisgICAgICAgIENvbnRlbnQtVHlwZSBmaWVsZC4gIEFueXRoaW5nIGVsc2Ugd2lsbCBnZW5lcmF0ZSBhIFR5cGVFcnJvci4KKworICAgICAgICBUaGUgbWVzc2FnZSB3aWxsIGJlIGFzc3VtZWQgdG8gYmUgb2YgdHlwZSB0ZXh0LyogZW5jb2RlZCB3aXRoCisgICAgICAgIGNoYXJzZXQuaW5wdXRfY2hhcnNldC4gIEl0IHdpbGwgYmUgY29udmVydGVkIHRvIGNoYXJzZXQub3V0cHV0X2NoYXJzZXQKKyAgICAgICAgYW5kIGVuY29kZWQgcHJvcGVybHksIGlmIG5lZWRlZCwgd2hlbiBnZW5lcmF0aW5nIHRoZSBwbGFpbiB0ZXh0CisgICAgICAgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiAgTUlNRSBoZWFkZXJzIChNSU1FLVZlcnNpb24sCisgICAgICAgIENvbnRlbnQtVHlwZSwgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZykgd2lsbCBiZSBhZGRlZCBhcyBuZWVkZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNoYXJzZXQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVsX3BhcmFtKCdjaGFyc2V0JykKKyAgICAgICAgICAgIHNlbGYuX2NoYXJzZXQgPSBOb25lCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShjaGFyc2V0LCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGNoYXJzZXQgPSBlbWFpbC5jaGFyc2V0LkNoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2hhcnNldCwgZW1haWwuY2hhcnNldC5DaGFyc2V0KToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcihjaGFyc2V0KQorICAgICAgICAjIEJBVzogc2hvdWxkIHdlIGFjY2VwdCBzdHJpbmdzIHRoYXQgY2FuIHNlcnZlIGFzIGFyZ3VtZW50cyB0byB0aGUKKyAgICAgICAgIyBDaGFyc2V0IGNvbnN0cnVjdG9yPworICAgICAgICBzZWxmLl9jaGFyc2V0ID0gY2hhcnNldAorICAgICAgICBpZiAnTUlNRS1WZXJzaW9uJyBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgIHNlbGYuYWRkX2hlYWRlcignTUlNRS1WZXJzaW9uJywgJzEuMCcpCisgICAgICAgIGlmICdDb250ZW50LVR5cGUnIG5vdCBpbiBzZWxmOgorICAgICAgICAgICAgc2VsZi5hZGRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9wbGFpbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD1jaGFyc2V0LmdldF9vdXRwdXRfY2hhcnNldCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZXRfcGFyYW0oJ2NoYXJzZXQnLCBjaGFyc2V0LmdldF9vdXRwdXRfY2hhcnNldCgpKQorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuX3BheWxvYWQsIHVuaWNvZGUpOgorICAgICAgICAgICAgc2VsZi5fcGF5bG9hZCA9IHNlbGYuX3BheWxvYWQuZW5jb2RlKGNoYXJzZXQub3V0cHV0X2NoYXJzZXQpCisgICAgICAgIGlmIHN0cihjaGFyc2V0KSAhPSBjaGFyc2V0LmdldF9vdXRwdXRfY2hhcnNldCgpOgorICAgICAgICAgICAgc2VsZi5fcGF5bG9hZCA9IGNoYXJzZXQuYm9keV9lbmNvZGUoc2VsZi5fcGF5bG9hZCkKKyAgICAgICAgaWYgJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnIG5vdCBpbiBzZWxmOgorICAgICAgICAgICAgY3RlID0gY2hhcnNldC5nZXRfYm9keV9lbmNvZGluZygpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3RlKHNlbGYpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuX3BheWxvYWQgPSBjaGFyc2V0LmJvZHlfZW5jb2RlKHNlbGYuX3BheWxvYWQpCisgICAgICAgICAgICAgICAgc2VsZi5hZGRfaGVhZGVyKCdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJywgY3RlKQorCisgICAgZGVmIGdldF9jaGFyc2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIENoYXJzZXQgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlJ3MgcGF5bG9hZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jaGFyc2V0CisKKyAgICAjCisgICAgIyBNQVBQSU5HIElOVEVSRkFDRSAocGFydGlhbCkKKyAgICAjCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGhlYWRlcnMsIGluY2x1ZGluZyBkdXBsaWNhdGVzLiIiIgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2hlYWRlcnMpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkdldCBhIGhlYWRlciB2YWx1ZS4KKworICAgICAgICBSZXR1cm4gTm9uZSBpZiB0aGUgaGVhZGVyIGlzIG1pc3NpbmcgaW5zdGVhZCBvZiByYWlzaW5nIGFuIGV4Y2VwdGlvbi4KKworICAgICAgICBOb3RlIHRoYXQgaWYgdGhlIGhlYWRlciBhcHBlYXJlZCBtdWx0aXBsZSB0aW1lcywgZXhhY3RseSB3aGljaAorICAgICAgICBvY2N1cnJlbmNlIGdldHMgcmV0dXJuZWQgaXMgdW5kZWZpbmVkLiAgVXNlIGdldF9hbGwoKSB0byBnZXQgYWxsCisgICAgICAgIHRoZSB2YWx1ZXMgbWF0Y2hpbmcgYSBoZWFkZXIgZmllbGQgbmFtZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldChuYW1lKQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG5hbWUsIHZhbCk6CisgICAgICAgICIiIlNldCB0aGUgdmFsdWUgb2YgYSBoZWFkZXIuCisKKyAgICAgICAgTm90ZTogdGhpcyBkb2VzIG5vdCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgaGVhZGVyIHdpdGggdGhlIHNhbWUgZmllbGQKKyAgICAgICAgbmFtZS4gIFVzZSBfX2RlbGl0ZW1fXygpIGZpcnN0IHRvIGRlbGV0ZSBhbnkgZXhpc3RpbmcgaGVhZGVycy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2hlYWRlcnMuYXBwZW5kKChuYW1lLCB2YWwpKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJEZWxldGUgYWxsIG9jY3VycmVuY2VzIG9mIGEgaGVhZGVyLCBpZiBwcmVzZW50LgorCisgICAgICAgIERvZXMgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgaGVhZGVyIGlzIG1pc3NpbmcuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIG5ld2hlYWRlcnMgPSBbXQorICAgICAgICBmb3IgaywgdiBpbiBzZWxmLl9oZWFkZXJzOgorICAgICAgICAgICAgaWYgay5sb3dlcigpICE9IG5hbWU6CisgICAgICAgICAgICAgICAgbmV3aGVhZGVycy5hcHBlbmQoKGssIHYpKQorICAgICAgICBzZWxmLl9oZWFkZXJzID0gbmV3aGVhZGVycworCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIG5hbWUubG93ZXIoKSBpbiBbay5sb3dlcigpIGZvciBrLCB2IGluIHNlbGYuX2hlYWRlcnNdCisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgdGhlIGhlYWRlci4iIiIKKyAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCisgICAgICAgIHJldHVybiBzZWxmLmdldChuYW1lLCBtaXNzaW5nKSBpcyBub3QgbWlzc2luZworCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBtZXNzYWdlJ3MgaGVhZGVyIGZpZWxkIG5hbWVzLgorCisgICAgICAgIFRoZXNlIHdpbGwgYmUgc29ydGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhcmVkIGluIHRoZSBvcmlnaW5hbAorICAgICAgICBtZXNzYWdlLCBvciB3ZXJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcy4KKyAgICAgICAgQW55IGZpZWxkcyBkZWxldGVkIGFuZCByZS1pbnNlcnRlZCBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBoZWFkZXIKKyAgICAgICAgbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBbayBmb3IgaywgdiBpbiBzZWxmLl9oZWFkZXJzXQorCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIG1lc3NhZ2UncyBoZWFkZXIgdmFsdWVzLgorCisgICAgICAgIFRoZXNlIHdpbGwgYmUgc29ydGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhcmVkIGluIHRoZSBvcmlnaW5hbAorICAgICAgICBtZXNzYWdlLCBvciB3ZXJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcy4KKyAgICAgICAgQW55IGZpZWxkcyBkZWxldGVkIGFuZCByZS1pbnNlcnRlZCBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBoZWFkZXIKKyAgICAgICAgbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBbdiBmb3IgaywgdiBpbiBzZWxmLl9oZWFkZXJzXQorCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICAiIiJHZXQgYWxsIHRoZSBtZXNzYWdlJ3MgaGVhZGVyIGZpZWxkcyBhbmQgdmFsdWVzLgorCisgICAgICAgIFRoZXNlIHdpbGwgYmUgc29ydGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhcmVkIGluIHRoZSBvcmlnaW5hbAorICAgICAgICBtZXNzYWdlLCBvciB3ZXJlIGFkZGVkIHRvIHRoZSBtZXNzYWdlLCBhbmQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcy4KKyAgICAgICAgQW55IGZpZWxkcyBkZWxldGVkIGFuZCByZS1pbnNlcnRlZCBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBoZWFkZXIKKyAgICAgICAgbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9oZWFkZXJzWzpdCisKKyAgICBkZWYgZ2V0KHNlbGYsIG5hbWUsIGZhaWxvYmo9Tm9uZSk6CisgICAgICAgICIiIkdldCBhIGhlYWRlciB2YWx1ZS4KKworICAgICAgICBMaWtlIF9fZ2V0aXRlbV9fKCkgYnV0IHJldHVybiBmYWlsb2JqIGluc3RlYWQgb2YgTm9uZSB3aGVuIHRoZSBmaWVsZAorICAgICAgICBpcyBtaXNzaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQorICAgICAgICBmb3IgaywgdiBpbiBzZWxmLl9oZWFkZXJzOgorICAgICAgICAgICAgaWYgay5sb3dlcigpID09IG5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHYKKyAgICAgICAgcmV0dXJuIGZhaWxvYmoKKworICAgICMKKyAgICAjIEFkZGl0aW9uYWwgdXNlZnVsIHN0dWZmCisgICAgIworCisgICAgZGVmIGdldF9hbGwoc2VsZiwgbmFtZSwgZmFpbG9iaj1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIHZhbHVlcyBmb3IgdGhlIG5hbWVkIGZpZWxkLgorCisgICAgICAgIFRoZXNlIHdpbGwgYmUgc29ydGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhcmVkIGluIHRoZSBvcmlnaW5hbAorICAgICAgICBtZXNzYWdlLCBhbmQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcy4gIEFueSBmaWVsZHMgZGVsZXRlZCBhbmQKKyAgICAgICAgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgaGVhZGVyIGxpc3QuCisKKyAgICAgICAgSWYgbm8gc3VjaCBmaWVsZHMgZXhpc3QsIGZhaWxvYmogaXMgcmV0dXJuZWQgKGRlZmF1bHRzIHRvIE5vbmUpLgorICAgICAgICAiIiIKKyAgICAgICAgdmFsdWVzID0gW10KKyAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQorICAgICAgICBmb3IgaywgdiBpbiBzZWxmLl9oZWFkZXJzOgorICAgICAgICAgICAgaWYgay5sb3dlcigpID09IG5hbWU6CisgICAgICAgICAgICAgICAgdmFsdWVzLmFwcGVuZCh2KQorICAgICAgICBpZiBub3QgdmFsdWVzOgorICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKKyAgICAgICAgcmV0dXJuIHZhbHVlcworCisgICAgZGVmIGFkZF9oZWFkZXIoc2VsZiwgX25hbWUsIF92YWx1ZSwgKipfcGFyYW1zKToKKyAgICAgICAgIiIiRXh0ZW5kZWQgaGVhZGVyIHNldHRpbmcuCisKKyAgICAgICAgbmFtZSBpcyB0aGUgaGVhZGVyIGZpZWxkIHRvIGFkZC4gIGtleXdvcmQgYXJndW1lbnRzIGNhbiBiZSB1c2VkIHRvIHNldAorICAgICAgICBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBoZWFkZXIgZmllbGQsIHdpdGggdW5kZXJzY29yZXMgY29udmVydGVkCisgICAgICAgIHRvIGRhc2hlcy4gIE5vcm1hbGx5IHRoZSBwYXJhbWV0ZXIgd2lsbCBiZSBhZGRlZCBhcyBrZXk9InZhbHVlIiB1bmxlc3MKKyAgICAgICAgdmFsdWUgaXMgTm9uZSwgaW4gd2hpY2ggY2FzZSBvbmx5IHRoZSBrZXkgd2lsbCBiZSBhZGRlZC4gIElmIGEKKyAgICAgICAgcGFyYW1ldGVyIHZhbHVlIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGl0IG11c3QgYmUgc3BlY2lmaWVkIGFzIGEKKyAgICAgICAgdGhyZWUtdHVwbGUgb2YgKGNoYXJzZXQsIGxhbmd1YWdlLCB2YWx1ZSksIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZQorICAgICAgICBlbmNvZGVkIGFjY29yZGluZyB0byBSRkMyMjMxIHJ1bGVzLgorCisgICAgICAgIEV4YW1wbGU6CisKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ2NvbnRlbnQtZGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsIGZpbGVuYW1lPSdidWQuZ2lmJykKKyAgICAgICAgIiIiCisgICAgICAgIHBhcnRzID0gW10KKyAgICAgICAgZm9yIGssIHYgaW4gX3BhcmFtcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgdiBpcyBOb25lOgorICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChrLnJlcGxhY2UoJ18nLCAnLScpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoX2Zvcm1hdHBhcmFtKGsucmVwbGFjZSgnXycsICctJyksIHYpKQorICAgICAgICBpZiBfdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwYXJ0cy5pbnNlcnQoMCwgX3ZhbHVlKQorICAgICAgICBzZWxmLl9oZWFkZXJzLmFwcGVuZCgoX25hbWUsIFNFTUlTUEFDRS5qb2luKHBhcnRzKSkpCisKKyAgICBkZWYgcmVwbGFjZV9oZWFkZXIoc2VsZiwgX25hbWUsIF92YWx1ZSk6CisgICAgICAgICIiIlJlcGxhY2UgYSBoZWFkZXIuCisKKyAgICAgICAgUmVwbGFjZSB0aGUgZmlyc3QgbWF0Y2hpbmcgaGVhZGVyIGZvdW5kIGluIHRoZSBtZXNzYWdlLCByZXRhaW5pbmcKKyAgICAgICAgaGVhZGVyIG9yZGVyIGFuZCBjYXNlLiAgSWYgbm8gbWF0Y2hpbmcgaGVhZGVyIHdhcyBmb3VuZCwgYSBLZXlFcnJvciBpcworICAgICAgICByYWlzZWQuCisgICAgICAgICIiIgorICAgICAgICBfbmFtZSA9IF9uYW1lLmxvd2VyKCkKKyAgICAgICAgZm9yIGksIChrLCB2KSBpbiB6aXAocmFuZ2UobGVuKHNlbGYuX2hlYWRlcnMpKSwgc2VsZi5faGVhZGVycyk6CisgICAgICAgICAgICBpZiBrLmxvd2VyKCkgPT0gX25hbWU6CisgICAgICAgICAgICAgICAgc2VsZi5faGVhZGVyc1tpXSA9IChrLCBfdmFsdWUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKF9uYW1lKQorCisgICAgIworICAgICMgVXNlIHRoZXNlIHRocmVlIG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgdGhyZWUgYWJvdmUuCisgICAgIworCisgICAgZGVmIGdldF9jb250ZW50X3R5cGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbWVzc2FnZSdzIGNvbnRlbnQgdHlwZS4KKworICAgICAgICBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGNvZXJjZWQgdG8gbG93ZXIgY2FzZSBvZiB0aGUgZm9ybQorICAgICAgICBgbWFpbnR5cGUvc3VidHlwZScuICBJZiB0aGVyZSB3YXMgbm8gQ29udGVudC1UeXBlIGhlYWRlciBpbiB0aGUKKyAgICAgICAgbWVzc2FnZSwgdGhlIGRlZmF1bHQgdHlwZSBhcyBnaXZlbiBieSBnZXRfZGVmYXVsdF90eXBlKCkgd2lsbCBiZQorICAgICAgICByZXR1cm5lZC4gIFNpbmNlIGFjY29yZGluZyB0byBSRkMgMjA0NSwgbWVzc2FnZXMgYWx3YXlzIGhhdmUgYSBkZWZhdWx0CisgICAgICAgIHR5cGUgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KKworICAgICAgICBSRkMgMjA0NSBkZWZpbmVzIGEgbWVzc2FnZSdzIGRlZmF1bHQgdHlwZSB0byBiZSB0ZXh0L3BsYWluIHVubGVzcyBpdAorICAgICAgICBhcHBlYXJzIGluc2lkZSBhIG11bHRpcGFydC9kaWdlc3QgY29udGFpbmVyLCBpbiB3aGljaCBjYXNlIGl0IHdvdWxkIGJlCisgICAgICAgIG1lc3NhZ2UvcmZjODIyLgorICAgICAgICAiIiIKKyAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCisgICAgICAgIHZhbHVlID0gc2VsZi5nZXQoJ2NvbnRlbnQtdHlwZScsIG1pc3NpbmcpCisgICAgICAgIGlmIHZhbHVlIGlzIG1pc3Npbmc6CisgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGhhdmUgbm8gcGFyYW1ldGVycworICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2RlZmF1bHRfdHlwZSgpCisgICAgICAgIGN0eXBlID0gX3NwbGl0cGFyYW0odmFsdWUpWzBdLmxvd2VyKCkKKyAgICAgICAgIyBSRkMgMjA0NSwgc2VjdGlvbiA1LjIgc2F5cyBpZiBpdHMgaW52YWxpZCwgdXNlIHRleHQvcGxhaW4KKyAgICAgICAgaWYgY3R5cGUuY291bnQoJy8nKSAhPSAxOgorICAgICAgICAgICAgcmV0dXJuICd0ZXh0L3BsYWluJworICAgICAgICByZXR1cm4gY3R5cGUKKworICAgIGRlZiBnZXRfY29udGVudF9tYWludHlwZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBtZXNzYWdlJ3MgbWFpbiBjb250ZW50IHR5cGUuCisKKyAgICAgICAgVGhpcyBpcyB0aGUgYG1haW50eXBlJyBwYXJ0IG9mIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkKKyAgICAgICAgZ2V0X2NvbnRlbnRfdHlwZSgpLgorICAgICAgICAiIiIKKyAgICAgICAgY3R5cGUgPSBzZWxmLmdldF9jb250ZW50X3R5cGUoKQorICAgICAgICByZXR1cm4gY3R5cGUuc3BsaXQoJy8nKVswXQorCisgICAgZGVmIGdldF9jb250ZW50X3N1YnR5cGUoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdGhlIG1lc3NhZ2UncyBzdWItY29udGVudCB0eXBlLgorCisgICAgICAgIFRoaXMgaXMgdGhlIGBzdWJ0eXBlJyBwYXJ0IG9mIHRoZSBzdHJpbmcgcmV0dXJuZWQgYnkKKyAgICAgICAgZ2V0X2NvbnRlbnRfdHlwZSgpLgorICAgICAgICAiIiIKKyAgICAgICAgY3R5cGUgPSBzZWxmLmdldF9jb250ZW50X3R5cGUoKQorICAgICAgICByZXR1cm4gY3R5cGUuc3BsaXQoJy8nKVsxXQorCisgICAgZGVmIGdldF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgYGRlZmF1bHQnIGNvbnRlbnQgdHlwZS4KKworICAgICAgICBNb3N0IG1lc3NhZ2VzIGhhdmUgYSBkZWZhdWx0IGNvbnRlbnQgdHlwZSBvZiB0ZXh0L3BsYWluLCBleGNlcHQgZm9yCisgICAgICAgIG1lc3NhZ2VzIHRoYXQgYXJlIHN1YnBhcnRzIG9mIG11bHRpcGFydC9kaWdlc3QgY29udGFpbmVycy4gIFN1Y2gKKyAgICAgICAgc3VicGFydHMgaGF2ZSBhIGRlZmF1bHQgY29udGVudCB0eXBlIG9mIG1lc3NhZ2UvcmZjODIyLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RlZmF1bHRfdHlwZQorCisgICAgZGVmIHNldF9kZWZhdWx0X3R5cGUoc2VsZiwgY3R5cGUpOgorICAgICAgICAiIiJTZXQgdGhlIGBkZWZhdWx0JyBjb250ZW50IHR5cGUuCisKKyAgICAgICAgY3R5cGUgc2hvdWxkIGJlIGVpdGhlciAidGV4dC9wbGFpbiIgb3IgIm1lc3NhZ2UvcmZjODIyIiwgYWx0aG91Z2ggdGhpcworICAgICAgICBpcyBub3QgZW5mb3JjZWQuICBUaGUgZGVmYXVsdCBjb250ZW50IHR5cGUgaXMgbm90IHN0b3JlZCBpbiB0aGUKKyAgICAgICAgQ29udGVudC1UeXBlIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2RlZmF1bHRfdHlwZSA9IGN0eXBlCisKKyAgICBkZWYgX2dldF9wYXJhbXNfcHJlc2VydmUoc2VsZiwgZmFpbG9iaiwgaGVhZGVyKToKKyAgICAgICAgIyBMaWtlIGdldF9wYXJhbXMoKSBidXQgcHJlc2VydmVzIHRoZSBxdW90aW5nIG9mIHZhbHVlcy4gIEJBVzoKKyAgICAgICAgIyBzaG91bGQgdGhpcyBiZSBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlPworICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKKyAgICAgICAgdmFsdWUgPSBzZWxmLmdldChoZWFkZXIsIG1pc3NpbmcpCisgICAgICAgIGlmIHZhbHVlIGlzIG1pc3Npbmc6CisgICAgICAgICAgICByZXR1cm4gZmFpbG9iagorICAgICAgICBwYXJhbXMgPSBbXQorICAgICAgICBmb3IgcCBpbiBfcGFyc2VwYXJhbSgnOycgKyB2YWx1ZSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbmFtZSwgdmFsID0gcC5zcGxpdCgnPScsIDEpCisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3RyaXAoKQorICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zdHJpcCgpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIE11c3QgaGF2ZSBiZWVuIGEgYmFyZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBuYW1lID0gcC5zdHJpcCgpCisgICAgICAgICAgICAgICAgdmFsID0gJycKKyAgICAgICAgICAgIHBhcmFtcy5hcHBlbmQoKG5hbWUsIHZhbCkpCisgICAgICAgIHBhcmFtcyA9IHV0aWxzLmRlY29kZV9wYXJhbXMocGFyYW1zKQorICAgICAgICByZXR1cm4gcGFyYW1zCisKKyAgICBkZWYgZ2V0X3BhcmFtcyhzZWxmLCBmYWlsb2JqPU5vbmUsIGhlYWRlcj0nY29udGVudC10eXBlJywgdW5xdW90ZT1UcnVlKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBtZXNzYWdlJ3MgQ29udGVudC1UeXBlIHBhcmFtZXRlcnMsIGFzIGEgbGlzdC4KKworICAgICAgICBUaGUgZWxlbWVudHMgb2YgdGhlIHJldHVybmVkIGxpc3QgYXJlIDItdHVwbGVzIG9mIGtleS92YWx1ZSBwYWlycywgYXMKKyAgICAgICAgc3BsaXQgb24gdGhlIGA9JyBzaWduLiAgVGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBgPScgaXMgdGhlIGtleSwKKyAgICAgICAgd2hpbGUgdGhlIHJpZ2h0IGhhbmQgc2lkZSBpcyB0aGUgdmFsdWUuICBJZiB0aGVyZSBpcyBubyBgPScgc2lnbiBpbgorICAgICAgICB0aGUgcGFyYW1ldGVyIHRoZSB2YWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nLiAgVGhlIHZhbHVlIGlzIGFzCisgICAgICAgIGRlc2NyaWJlZCBpbiB0aGUgZ2V0X3BhcmFtKCkgbWV0aG9kLgorCisgICAgICAgIE9wdGlvbmFsIGZhaWxvYmogaXMgdGhlIG9iamVjdCB0byByZXR1cm4gaWYgdGhlcmUgaXMgbm8gQ29udGVudC1UeXBlCisgICAgICAgIGhlYWRlci4gIE9wdGlvbmFsIGhlYWRlciBpcyB0aGUgaGVhZGVyIHRvIHNlYXJjaCBpbnN0ZWFkIG9mCisgICAgICAgIENvbnRlbnQtVHlwZS4gIElmIHVucXVvdGUgaXMgVHJ1ZSwgdGhlIHZhbHVlIGlzIHVucXVvdGVkLgorICAgICAgICAiIiIKKyAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCisgICAgICAgIHBhcmFtcyA9IHNlbGYuX2dldF9wYXJhbXNfcHJlc2VydmUobWlzc2luZywgaGVhZGVyKQorICAgICAgICBpZiBwYXJhbXMgaXMgbWlzc2luZzoKKyAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCisgICAgICAgIGlmIHVucXVvdGU6CisgICAgICAgICAgICByZXR1cm4gWyhrLCBfdW5xdW90ZXZhbHVlKHYpKSBmb3IgaywgdiBpbiBwYXJhbXNdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcGFyYW1zCisKKyAgICBkZWYgZ2V0X3BhcmFtKHNlbGYsIHBhcmFtLCBmYWlsb2JqPU5vbmUsIGhlYWRlcj0nY29udGVudC10eXBlJywKKyAgICAgICAgICAgICAgICAgIHVucXVvdGU9VHJ1ZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgcGFyYW1ldGVyIHZhbHVlIGlmIGZvdW5kIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLgorCisgICAgICAgIE9wdGlvbmFsIGZhaWxvYmogaXMgdGhlIG9iamVjdCB0byByZXR1cm4gaWYgdGhlcmUgaXMgbm8gQ29udGVudC1UeXBlCisgICAgICAgIGhlYWRlciwgb3IgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgaGFzIG5vIHN1Y2ggcGFyYW1ldGVyLiAgT3B0aW9uYWwKKyAgICAgICAgaGVhZGVyIGlzIHRoZSBoZWFkZXIgdG8gc2VhcmNoIGluc3RlYWQgb2YgQ29udGVudC1UeXBlLgorCisgICAgICAgIFBhcmFtZXRlciBrZXlzIGFyZSBhbHdheXMgY29tcGFyZWQgY2FzZSBpbnNlbnNpdGl2ZWx5LiAgVGhlIHJldHVybgorICAgICAgICB2YWx1ZSBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nLCBvciBhIDMtdHVwbGUgaWYgdGhlIHBhcmFtZXRlciB3YXMgUkZDCisgICAgICAgIDIyMzEgZW5jb2RlZC4gIFdoZW4gaXQncyBhIDMtdHVwbGUsIHRoZSBlbGVtZW50cyBvZiB0aGUgdmFsdWUgYXJlIG9mCisgICAgICAgIHRoZSBmb3JtIChDSEFSU0VULCBMQU5HVUFHRSwgVkFMVUUpLiAgTm90ZSB0aGF0IGJvdGggQ0hBUlNFVCBhbmQKKyAgICAgICAgTEFOR1VBR0UgY2FuIGJlIE5vbmUsIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBjb25zaWRlciBWQUxVRSB0byBiZQorICAgICAgICBlbmNvZGVkIGluIHRoZSB1cy1hc2NpaSBjaGFyc2V0LiAgWW91IGNhbiB1c3VhbGx5IGlnbm9yZSBMQU5HVUFHRS4KKworICAgICAgICBZb3VyIGFwcGxpY2F0aW9uIHNob3VsZCBiZSBwcmVwYXJlZCB0byBkZWFsIHdpdGggMy10dXBsZSByZXR1cm4KKyAgICAgICAgdmFsdWVzLCBhbmQgY2FuIGNvbnZlcnQgdGhlIHBhcmFtZXRlciB0byBhIFVuaWNvZGUgc3RyaW5nIGxpa2Ugc286CisKKyAgICAgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnZm9vJykKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKToKKyAgICAgICAgICAgICAgICBwYXJhbSA9IHVuaWNvZGUocGFyYW1bMl0sIHBhcmFtWzBdIG9yICd1cy1hc2NpaScpCisKKyAgICAgICAgSW4gYW55IGNhc2UsIHRoZSBwYXJhbWV0ZXIgdmFsdWUgKGVpdGhlciB0aGUgcmV0dXJuZWQgc3RyaW5nLCBvciB0aGUKKyAgICAgICAgVkFMVUUgaXRlbSBpbiB0aGUgMy10dXBsZSkgaXMgYWx3YXlzIHVucXVvdGVkLCB1bmxlc3MgdW5xdW90ZSBpcyBzZXQKKyAgICAgICAgdG8gRmFsc2UuCisgICAgICAgICIiIgorICAgICAgICBpZiBoZWFkZXIgbm90IGluIHNlbGY6CisgICAgICAgICAgICByZXR1cm4gZmFpbG9iagorICAgICAgICBmb3IgaywgdiBpbiBzZWxmLl9nZXRfcGFyYW1zX3ByZXNlcnZlKGZhaWxvYmosIGhlYWRlcik6CisgICAgICAgICAgICBpZiBrLmxvd2VyKCkgPT0gcGFyYW0ubG93ZXIoKToKKyAgICAgICAgICAgICAgICBpZiB1bnF1b3RlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3VucXVvdGV2YWx1ZSh2KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2CisgICAgICAgIHJldHVybiBmYWlsb2JqCisKKyAgICBkZWYgc2V0X3BhcmFtKHNlbGYsIHBhcmFtLCB2YWx1ZSwgaGVhZGVyPSdDb250ZW50LVR5cGUnLCByZXF1b3RlPVRydWUsCisgICAgICAgICAgICAgICAgICBjaGFyc2V0PU5vbmUsIGxhbmd1YWdlPScnKToKKyAgICAgICAgIiIiU2V0IGEgcGFyYW1ldGVyIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLgorCisgICAgICAgIElmIHRoZSBwYXJhbWV0ZXIgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGhlYWRlciwgaXRzIHZhbHVlIHdpbGwgYmUKKyAgICAgICAgcmVwbGFjZWQgd2l0aCB0aGUgbmV3IHZhbHVlLgorCisgICAgICAgIElmIGhlYWRlciBpcyBDb250ZW50LVR5cGUgYW5kIGhhcyBub3QgeWV0IGJlZW4gZGVmaW5lZCBmb3IgdGhpcworICAgICAgICBtZXNzYWdlLCBpdCB3aWxsIGJlIHNldCB0byAidGV4dC9wbGFpbiIgYW5kIHRoZSBuZXcgcGFyYW1ldGVyIGFuZAorICAgICAgICB2YWx1ZSB3aWxsIGJlIGFwcGVuZGVkIGFzIHBlciBSRkMgMjA0NS4KKworICAgICAgICBBbiBhbHRlcm5hdGUgaGVhZGVyIGNhbiBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciBhcmd1bWVudCwgYW5kIGFsbAorICAgICAgICBwYXJhbWV0ZXJzIHdpbGwgYmUgcXVvdGVkIGFzIG5lY2Vzc2FyeSB1bmxlc3MgcmVxdW90ZSBpcyBGYWxzZS4KKworICAgICAgICBJZiBjaGFyc2V0IGlzIHNwZWNpZmllZCwgdGhlIHBhcmFtZXRlciB3aWxsIGJlIGVuY29kZWQgYWNjb3JkaW5nIHRvIFJGQworICAgICAgICAyMjMxLiAgT3B0aW9uYWwgbGFuZ3VhZ2Ugc3BlY2lmaWVzIHRoZSBSRkMgMjIzMSBsYW5ndWFnZSwgZGVmYXVsdGluZworICAgICAgICB0byB0aGUgZW1wdHkgc3RyaW5nLiAgQm90aCBjaGFyc2V0IGFuZCBsYW5ndWFnZSBzaG91bGQgYmUgc3RyaW5ncy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSkgYW5kIGNoYXJzZXQ6CisgICAgICAgICAgICB2YWx1ZSA9IChjaGFyc2V0LCBsYW5ndWFnZSwgdmFsdWUpCisKKyAgICAgICAgaWYgaGVhZGVyIG5vdCBpbiBzZWxmIGFuZCBoZWFkZXIubG93ZXIoKSA9PSAnY29udGVudC10eXBlJzoKKyAgICAgICAgICAgIGN0eXBlID0gJ3RleHQvcGxhaW4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjdHlwZSA9IHNlbGYuZ2V0KGhlYWRlcikKKyAgICAgICAgaWYgbm90IHNlbGYuZ2V0X3BhcmFtKHBhcmFtLCBoZWFkZXI9aGVhZGVyKToKKyAgICAgICAgICAgIGlmIG5vdCBjdHlwZToKKyAgICAgICAgICAgICAgICBjdHlwZSA9IF9mb3JtYXRwYXJhbShwYXJhbSwgdmFsdWUsIHJlcXVvdGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGN0eXBlID0gU0VNSVNQQUNFLmpvaW4oCisgICAgICAgICAgICAgICAgICAgIFtjdHlwZSwgX2Zvcm1hdHBhcmFtKHBhcmFtLCB2YWx1ZSwgcmVxdW90ZSldKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3R5cGUgPSAnJworICAgICAgICAgICAgZm9yIG9sZF9wYXJhbSwgb2xkX3ZhbHVlIGluIHNlbGYuZ2V0X3BhcmFtcyhoZWFkZXI9aGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnF1b3RlPXJlcXVvdGUpOgorICAgICAgICAgICAgICAgIGFwcGVuZF9wYXJhbSA9ICcnCisgICAgICAgICAgICAgICAgaWYgb2xkX3BhcmFtLmxvd2VyKCkgPT0gcGFyYW0ubG93ZXIoKToKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kX3BhcmFtID0gX2Zvcm1hdHBhcmFtKHBhcmFtLCB2YWx1ZSwgcmVxdW90ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhcHBlbmRfcGFyYW0gPSBfZm9ybWF0cGFyYW0ob2xkX3BhcmFtLCBvbGRfdmFsdWUsIHJlcXVvdGUpCisgICAgICAgICAgICAgICAgaWYgbm90IGN0eXBlOgorICAgICAgICAgICAgICAgICAgICBjdHlwZSA9IGFwcGVuZF9wYXJhbQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGN0eXBlID0gU0VNSVNQQUNFLmpvaW4oW2N0eXBlLCBhcHBlbmRfcGFyYW1dKQorICAgICAgICBpZiBjdHlwZSAhPSBzZWxmLmdldChoZWFkZXIpOgorICAgICAgICAgICAgZGVsIHNlbGZbaGVhZGVyXQorICAgICAgICAgICAgc2VsZltoZWFkZXJdID0gY3R5cGUKKworICAgIGRlZiBkZWxfcGFyYW0oc2VsZiwgcGFyYW0sIGhlYWRlcj0nY29udGVudC10eXBlJywgcmVxdW90ZT1UcnVlKToKKyAgICAgICAgIiIiUmVtb3ZlIHRoZSBnaXZlbiBwYXJhbWV0ZXIgY29tcGxldGVseSBmcm9tIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLgorCisgICAgICAgIFRoZSBoZWFkZXIgd2lsbCBiZSByZS13cml0dGVuIGluIHBsYWNlIHdpdGhvdXQgdGhlIHBhcmFtZXRlciBvciBpdHMKKyAgICAgICAgdmFsdWUuIEFsbCB2YWx1ZXMgd2lsbCBiZSBxdW90ZWQgYXMgbmVjZXNzYXJ5IHVubGVzcyByZXF1b3RlIGlzCisgICAgICAgIEZhbHNlLiAgT3B0aW9uYWwgaGVhZGVyIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGUgQ29udGVudC1UeXBlCisgICAgICAgIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGhlYWRlciBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBuZXdfY3R5cGUgPSAnJworICAgICAgICBmb3IgcCwgdiBpbiBzZWxmLmdldF9wYXJhbXMoaGVhZGVyPWhlYWRlciwgdW5xdW90ZT1yZXF1b3RlKToKKyAgICAgICAgICAgIGlmIHAubG93ZXIoKSAhPSBwYXJhbS5sb3dlcigpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBuZXdfY3R5cGU6CisgICAgICAgICAgICAgICAgICAgIG5ld19jdHlwZSA9IF9mb3JtYXRwYXJhbShwLCB2LCByZXF1b3RlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5ld19jdHlwZSA9IFNFTUlTUEFDRS5qb2luKFtuZXdfY3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZm9ybWF0cGFyYW0ocCwgdiwgcmVxdW90ZSldKQorICAgICAgICBpZiBuZXdfY3R5cGUgIT0gc2VsZi5nZXQoaGVhZGVyKToKKyAgICAgICAgICAgIGRlbCBzZWxmW2hlYWRlcl0KKyAgICAgICAgICAgIHNlbGZbaGVhZGVyXSA9IG5ld19jdHlwZQorCisgICAgZGVmIHNldF90eXBlKHNlbGYsIHR5cGUsIGhlYWRlcj0nQ29udGVudC1UeXBlJywgcmVxdW90ZT1UcnVlKToKKyAgICAgICAgIiIiU2V0IHRoZSBtYWluIHR5cGUgYW5kIHN1YnR5cGUgZm9yIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLgorCisgICAgICAgIHR5cGUgbXVzdCBiZSBhIHN0cmluZyBpbiB0aGUgZm9ybSAibWFpbnR5cGUvc3VidHlwZSIsIG90aGVyd2lzZSBhCisgICAgICAgIFZhbHVlRXJyb3IgaXMgcmFpc2VkLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHJlcGxhY2VzIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLCBrZWVwaW5nIGFsbCB0aGUKKyAgICAgICAgcGFyYW1ldGVycyBpbiBwbGFjZS4gIElmIHJlcXVvdGUgaXMgRmFsc2UsIHRoaXMgbGVhdmVzIHRoZSBleGlzdGluZworICAgICAgICBoZWFkZXIncyBxdW90aW5nIGFzIGlzLiAgT3RoZXJ3aXNlLCB0aGUgcGFyYW1ldGVycyB3aWxsIGJlIHF1b3RlZCAodGhlCisgICAgICAgIGRlZmF1bHQpLgorCisgICAgICAgIEFuIGFsdGVybmF0aXZlIGhlYWRlciBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSBoZWFkZXIgYXJndW1lbnQuICBXaGVuCisgICAgICAgIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGlzIHNldCwgd2UnbGwgYWx3YXlzIGFsc28gYWRkIGEgTUlNRS1WZXJzaW9uCisgICAgICAgIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgICMgQkFXOiBzaG91bGQgd2UgYmUgc3RyaWN0PworICAgICAgICBpZiBub3QgdHlwZS5jb3VudCgnLycpID09IDE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgICMgU2V0IHRoZSBDb250ZW50LVR5cGUsIHlvdSBnZXQgYSBNSU1FLVZlcnNpb24KKyAgICAgICAgaWYgaGVhZGVyLmxvd2VyKCkgPT0gJ2NvbnRlbnQtdHlwZSc6CisgICAgICAgICAgICBkZWwgc2VsZlsnbWltZS12ZXJzaW9uJ10KKyAgICAgICAgICAgIHNlbGZbJ01JTUUtVmVyc2lvbiddID0gJzEuMCcKKyAgICAgICAgaWYgaGVhZGVyIG5vdCBpbiBzZWxmOgorICAgICAgICAgICAgc2VsZltoZWFkZXJdID0gdHlwZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHBhcmFtcyA9IHNlbGYuZ2V0X3BhcmFtcyhoZWFkZXI9aGVhZGVyLCB1bnF1b3RlPXJlcXVvdGUpCisgICAgICAgIGRlbCBzZWxmW2hlYWRlcl0KKyAgICAgICAgc2VsZltoZWFkZXJdID0gdHlwZQorICAgICAgICAjIFNraXAgdGhlIGZpcnN0IHBhcmFtOyBpdCdzIHRoZSBvbGQgdHlwZS4KKyAgICAgICAgZm9yIHAsIHYgaW4gcGFyYW1zWzE6XToKKyAgICAgICAgICAgIHNlbGYuc2V0X3BhcmFtKHAsIHYsIGhlYWRlciwgcmVxdW90ZSkKKworICAgIGRlZiBnZXRfZmlsZW5hbWUoc2VsZiwgZmFpbG9iaj1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBmaWxlbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHBheWxvYWQgaWYgcHJlc2VudC4KKworICAgICAgICBUaGUgZmlsZW5hbWUgaXMgZXh0cmFjdGVkIGZyb20gdGhlIENvbnRlbnQtRGlzcG9zaXRpb24gaGVhZGVyJ3MKKyAgICAgICAgYGZpbGVuYW1lJyBwYXJhbWV0ZXIsIGFuZCBpdCBpcyB1bnF1b3RlZC4gIElmIHRoYXQgaGVhZGVyIGlzIG1pc3NpbmcKKyAgICAgICAgdGhlIGBmaWxlbmFtZScgcGFyYW1ldGVyLCB0aGlzIG1ldGhvZCBmYWxscyBiYWNrIHRvIGxvb2tpbmcgZm9yIHRoZQorICAgICAgICBgbmFtZScgcGFyYW1ldGVyLgorICAgICAgICAiIiIKKyAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRfcGFyYW0oJ2ZpbGVuYW1lJywgbWlzc2luZywgJ2NvbnRlbnQtZGlzcG9zaXRpb24nKQorICAgICAgICBpZiBmaWxlbmFtZSBpcyBtaXNzaW5nOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldF9wYXJhbSgnbmFtZScsIG1pc3NpbmcsICdjb250ZW50LXR5cGUnKQorICAgICAgICBpZiBmaWxlbmFtZSBpcyBtaXNzaW5nOgorICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKKyAgICAgICAgcmV0dXJuIHV0aWxzLmNvbGxhcHNlX3JmYzIyMzFfdmFsdWUoZmlsZW5hbWUpLnN0cmlwKCkKKworICAgIGRlZiBnZXRfYm91bmRhcnkoc2VsZiwgZmFpbG9iaj1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBib3VuZGFyeSBhc3NvY2lhdGVkIHdpdGggdGhlIHBheWxvYWQgaWYgcHJlc2VudC4KKworICAgICAgICBUaGUgYm91bmRhcnkgaXMgZXh0cmFjdGVkIGZyb20gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIncyBgYm91bmRhcnknCisgICAgICAgIHBhcmFtZXRlciwgYW5kIGl0IGlzIHVucXVvdGVkLgorICAgICAgICAiIiIKKyAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCisgICAgICAgIGJvdW5kYXJ5ID0gc2VsZi5nZXRfcGFyYW0oJ2JvdW5kYXJ5JywgbWlzc2luZykKKyAgICAgICAgaWYgYm91bmRhcnkgaXMgbWlzc2luZzoKKyAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCisgICAgICAgICMgUkZDIDIwNDYgc2F5cyB0aGF0IGJvdW5kYXJpZXMgbWF5IGJlZ2luIGJ1dCBub3QgZW5kIGluIHcvcworICAgICAgICByZXR1cm4gdXRpbHMuY29sbGFwc2VfcmZjMjIzMV92YWx1ZShib3VuZGFyeSkucnN0cmlwKCkKKworICAgIGRlZiBzZXRfYm91bmRhcnkoc2VsZiwgYm91bmRhcnkpOgorICAgICAgICAiIiJTZXQgdGhlIGJvdW5kYXJ5IHBhcmFtZXRlciBpbiBDb250ZW50LVR5cGUgdG8gJ2JvdW5kYXJ5Jy4KKworICAgICAgICBUaGlzIGlzIHN1YnRseSBkaWZmZXJlbnQgdGhhbiBkZWxldGluZyB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBhbmQKKyAgICAgICAgYWRkaW5nIGEgbmV3IG9uZSB3aXRoIGEgbmV3IGJvdW5kYXJ5IHBhcmFtZXRlciB2aWEgYWRkX2hlYWRlcigpLiAgVGhlCisgICAgICAgIG1haW4gZGlmZmVyZW5jZSBpcyB0aGF0IHVzaW5nIHRoZSBzZXRfYm91bmRhcnkoKSBtZXRob2QgcHJlc2VydmVzIHRoZQorICAgICAgICBvcmRlciBvZiB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBpbiB0aGUgb3JpZ2luYWwgbWVzc2FnZS4KKworICAgICAgICBIZWFkZXJQYXJzZUVycm9yIGlzIHJhaXNlZCBpZiB0aGUgbWVzc2FnZSBoYXMgbm8gQ29udGVudC1UeXBlIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIG1pc3NpbmcgPSBvYmplY3QoKQorICAgICAgICBwYXJhbXMgPSBzZWxmLl9nZXRfcGFyYW1zX3ByZXNlcnZlKG1pc3NpbmcsICdjb250ZW50LXR5cGUnKQorICAgICAgICBpZiBwYXJhbXMgaXMgbWlzc2luZzoKKyAgICAgICAgICAgICMgVGhlcmUgd2FzIG5vIENvbnRlbnQtVHlwZSBoZWFkZXIsIGFuZCB3ZSBkb24ndCBrbm93IHdoYXQgdHlwZQorICAgICAgICAgICAgIyB0byBzZXQgaXQgdG8sIHNvIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIHJhaXNlIGVycm9ycy5IZWFkZXJQYXJzZUVycm9yKCdObyBDb250ZW50LVR5cGUgaGVhZGVyIGZvdW5kJykKKyAgICAgICAgbmV3cGFyYW1zID0gW10KKyAgICAgICAgZm91bmRwID0gRmFsc2UKKyAgICAgICAgZm9yIHBrLCBwdiBpbiBwYXJhbXM6CisgICAgICAgICAgICBpZiBway5sb3dlcigpID09ICdib3VuZGFyeSc6CisgICAgICAgICAgICAgICAgbmV3cGFyYW1zLmFwcGVuZCgoJ2JvdW5kYXJ5JywgJyIlcyInICUgYm91bmRhcnkpKQorICAgICAgICAgICAgICAgIGZvdW5kcCA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV3cGFyYW1zLmFwcGVuZCgocGssIHB2KSkKKyAgICAgICAgaWYgbm90IGZvdW5kcDoKKyAgICAgICAgICAgICMgVGhlIG9yaWdpbmFsIENvbnRlbnQtVHlwZSBoZWFkZXIgaGFkIG5vIGJvdW5kYXJ5IGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICMgVGFjayBvbmUgb24gdGhlIGVuZC4gIEJBVzogc2hvdWxkIHdlIHJhaXNlIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgIyBpbnN0ZWFkPz8/CisgICAgICAgICAgICBuZXdwYXJhbXMuYXBwZW5kKCgnYm91bmRhcnknLCAnIiVzIicgJSBib3VuZGFyeSkpCisgICAgICAgICMgUmVwbGFjZSB0aGUgZXhpc3RpbmcgQ29udGVudC1UeXBlIGhlYWRlciB3aXRoIHRoZSBuZXcgdmFsdWUKKyAgICAgICAgbmV3aGVhZGVycyA9IFtdCisgICAgICAgIGZvciBoLCB2IGluIHNlbGYuX2hlYWRlcnM6CisgICAgICAgICAgICBpZiBoLmxvd2VyKCkgPT0gJ2NvbnRlbnQtdHlwZSc6CisgICAgICAgICAgICAgICAgcGFydHMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIG5ld3BhcmFtczoKKyAgICAgICAgICAgICAgICAgICAgaWYgdiA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChrKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKCclcz0lcycgJSAoaywgdikpCisgICAgICAgICAgICAgICAgbmV3aGVhZGVycy5hcHBlbmQoKGgsIFNFTUlTUEFDRS5qb2luKHBhcnRzKSkpCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV3aGVhZGVycy5hcHBlbmQoKGgsIHYpKQorICAgICAgICBzZWxmLl9oZWFkZXJzID0gbmV3aGVhZGVycworCisgICAgZGVmIGdldF9jb250ZW50X2NoYXJzZXQoc2VsZiwgZmFpbG9iaj1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjaGFyc2V0IHBhcmFtZXRlciBvZiB0aGUgQ29udGVudC1UeXBlIGhlYWRlci4KKworICAgICAgICBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGFsd2F5cyBjb2VyY2VkIHRvIGxvd2VyIGNhc2UuICBJZiB0aGVyZSBpcyBubworICAgICAgICBDb250ZW50LVR5cGUgaGVhZGVyLCBvciBpZiB0aGF0IGhlYWRlciBoYXMgbm8gY2hhcnNldCBwYXJhbWV0ZXIsCisgICAgICAgIGZhaWxvYmogaXMgcmV0dXJuZWQuCisgICAgICAgICIiIgorICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKKyAgICAgICAgY2hhcnNldCA9IHNlbGYuZ2V0X3BhcmFtKCdjaGFyc2V0JywgbWlzc2luZykKKyAgICAgICAgaWYgY2hhcnNldCBpcyBtaXNzaW5nOgorICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShjaGFyc2V0LCB0dXBsZSk6CisgICAgICAgICAgICAjIFJGQyAyMjMxIGVuY29kZWQsIHNvIGRlY29kZSBpdCwgYW5kIGl0IGJldHRlciBlbmQgdXAgYXMgYXNjaWkuCisgICAgICAgICAgICBwY2hhcnNldCA9IGNoYXJzZXRbMF0gb3IgJ3VzLWFzY2lpJworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgTG9va3VwRXJyb3Igd2lsbCBiZSByYWlzZWQgaWYgdGhlIGNoYXJzZXQgaXNuJ3Qga25vd24gdG8KKyAgICAgICAgICAgICAgICAjIFB5dGhvbi4gIFVuaWNvZGVFcnJvciB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgZW5jb2RlZCB0ZXh0CisgICAgICAgICAgICAgICAgIyBjb250YWlucyBhIGNoYXJhY3RlciBub3QgaW4gdGhlIGNoYXJzZXQuCisgICAgICAgICAgICAgICAgY2hhcnNldCA9IHVuaWNvZGUoY2hhcnNldFsyXSwgcGNoYXJzZXQpLmVuY29kZSgndXMtYXNjaWknKQorICAgICAgICAgICAgZXhjZXB0IChMb29rdXBFcnJvciwgVW5pY29kZUVycm9yKToKKyAgICAgICAgICAgICAgICBjaGFyc2V0ID0gY2hhcnNldFsyXQorICAgICAgICAjIGNoYXJzZXQgY2hhcmFjdGVyIG11c3QgYmUgaW4gdXMtYXNjaWkgcmFuZ2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjaGFyc2V0LCBzdHIpOgorICAgICAgICAgICAgICAgIGNoYXJzZXQgPSB1bmljb2RlKGNoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgICAgICBjaGFyc2V0ID0gY2hhcnNldC5lbmNvZGUoJ3VzLWFzY2lpJykKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCisgICAgICAgICMgUkZDIDIwNDYsICQ0LjEuMiBzYXlzIGNoYXJzZXRzIGFyZSBub3QgY2FzZSBzZW5zaXRpdmUKKyAgICAgICAgcmV0dXJuIGNoYXJzZXQubG93ZXIoKQorCisgICAgZGVmIGdldF9jaGFyc2V0cyhzZWxmLCBmYWlsb2JqPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIGNoYXJzZXQocykgdXNlZCBpbiB0aGlzIG1lc3NhZ2UuCisKKyAgICAgICAgVGhlIHJldHVybmVkIGxpc3Qgb2YgaXRlbXMgZGVzY3JpYmVzIHRoZSBDb250ZW50LVR5cGUgaGVhZGVycycKKyAgICAgICAgY2hhcnNldCBwYXJhbWV0ZXIgZm9yIHRoaXMgbWVzc2FnZSBhbmQgYWxsIHRoZSBzdWJwYXJ0cyBpbiBpdHMKKyAgICAgICAgcGF5bG9hZC4KKworICAgICAgICBFYWNoIGl0ZW0gd2lsbCBlaXRoZXIgYmUgYSBzdHJpbmcgKHRoZSB2YWx1ZSBvZiB0aGUgY2hhcnNldCBwYXJhbWV0ZXIKKyAgICAgICAgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgb2YgdGhhdCBwYXJ0KSBvciB0aGUgdmFsdWUgb2YgdGhlCisgICAgICAgICdmYWlsb2JqJyBwYXJhbWV0ZXIgKGRlZmF1bHRzIHRvIE5vbmUpLCBpZiB0aGUgcGFydCBkb2VzIG5vdCBoYXZlIGEKKyAgICAgICAgbWFpbiBNSU1FIHR5cGUgb2YgInRleHQiLCBvciB0aGUgY2hhcnNldCBpcyBub3QgZGVmaW5lZC4KKworICAgICAgICBUaGUgbGlzdCB3aWxsIGNvbnRhaW4gb25lIHN0cmluZyBmb3IgZWFjaCBwYXJ0IG9mIHRoZSBtZXNzYWdlLCBwbHVzCisgICAgICAgIG9uZSBmb3IgdGhlIGNvbnRhaW5lciBtZXNzYWdlIChpLmUuIHNlbGYpLCBzbyB0aGF0IGEgbm9uLW11bHRpcGFydAorICAgICAgICBtZXNzYWdlIHdpbGwgc3RpbGwgcmV0dXJuIGEgbGlzdCBvZiBsZW5ndGggMS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBbcGFydC5nZXRfY29udGVudF9jaGFyc2V0KGZhaWxvYmopIGZvciBwYXJ0IGluIHNlbGYud2FsaygpXQorCisgICAgIyBJLmUuIGRlZiB3YWxrKHNlbGYpOiAuLi4KKyAgICBmcm9tIGVtYWlsLml0ZXJhdG9ycyBpbXBvcnQgd2FsawpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9tZXNzYWdlLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvbWVzc2FnZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4Y2UyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWVzc2FnZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9tZXNzYWdlLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvbWVzc2FnZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4Y2UyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWVzc2FnZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZjU4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZjU4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weSBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWM1OTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5CkBAIC0wLDAgKzEsMzYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBLZWl0aCBEYXJ0CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkNsYXNzIHJlcHJlc2VudGluZyBhcHBsaWNhdGlvbi8qIHR5cGUgTUlNRSBkb2N1bWVudHMuIiIiCisKK19fYWxsX18gPSBbIk1JTUVBcHBsaWNhdGlvbiJdCisKK2Zyb20gZW1haWwgaW1wb3J0IGVuY29kZXJzCitmcm9tIGVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CisKKworY2xhc3MgTUlNRUFwcGxpY2F0aW9uKE1JTUVOb25NdWx0aXBhcnQpOgorICAgICIiIkNsYXNzIGZvciBnZW5lcmF0aW5nIGFwcGxpY2F0aW9uLyogTUlNRSBkb2N1bWVudHMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX2RhdGEsIF9zdWJ0eXBlPSdvY3RldC1zdHJlYW0nLAorICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqKl9wYXJhbXMpOgorICAgICAgICAiIiJDcmVhdGUgYW4gYXBwbGljYXRpb24vKiB0eXBlIE1JTUUgZG9jdW1lbnQuCisKKyAgICAgICAgX2RhdGEgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmF3IGFwcGxpY2F0aW9uIGRhdGEuCisKKyAgICAgICAgX3N1YnR5cGUgaXMgdGhlIE1JTUUgY29udGVudCB0eXBlIHN1YnR5cGUsIGRlZmF1bHRpbmcgdG8KKyAgICAgICAgJ29jdGV0LXN0cmVhbScuCisKKyAgICAgICAgX2VuY29kZXIgaXMgYSBmdW5jdGlvbiB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIGFjdHVhbCBlbmNvZGluZyBmb3IKKyAgICAgICAgdHJhbnNwb3J0IG9mIHRoZSBhcHBsaWNhdGlvbiBkYXRhLCBkZWZhdWx0aW5nIHRvIGJhc2U2NCBlbmNvZGluZy4KKworICAgICAgICBBbnkgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBiYXNlIGNsYXNzCisgICAgICAgIGNvbnN0cnVjdG9yLCB3aGljaCB0dXJucyB0aGVtIGludG8gcGFyYW1ldGVycyBvbiB0aGUgQ29udGVudC1UeXBlCisgICAgICAgIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIF9zdWJ0eXBlIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0ludmFsaWQgYXBwbGljYXRpb24gTUlNRSBzdWJ0eXBlJykKKyAgICAgICAgTUlNRU5vbk11bHRpcGFydC5fX2luaXRfXyhzZWxmLCAnYXBwbGljYXRpb24nLCBfc3VidHlwZSwgKipfcGFyYW1zKQorICAgICAgICBzZWxmLnNldF9wYXlsb2FkKF9kYXRhKQorICAgICAgICBfZW5jb2RlcihzZWxmKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmMGNkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmMGNkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2F1ZGlvLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2F1ZGlvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MjkwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYXVkaW8ucHkKQEAgLTAsMCArMSw3MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEFudGhvbnkgQmF4dGVyCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkNsYXNzIHJlcHJlc2VudGluZyBhdWRpby8qIHR5cGUgTUlNRSBkb2N1bWVudHMuIiIiCisKK19fYWxsX18gPSBbJ01JTUVBdWRpbyddCisKK2ltcG9ydCBzbmRoZHIKKworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIGVtYWlsIGltcG9ydCBlbmNvZGVycworZnJvbSBlbWFpbC5taW1lLm5vbm11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAorCisKKwwKK19zbmRoZHJfTUlNRW1hcCA9IHsnYXUnICA6ICdiYXNpYycsCisgICAgICAgICAgICAgICAgICAgJ3dhdicgOid4LXdhdicsCisgICAgICAgICAgICAgICAgICAgJ2FpZmYnOid4LWFpZmYnLAorICAgICAgICAgICAgICAgICAgICdhaWZjJzoneC1haWZmJywKKyAgICAgICAgICAgICAgICAgICB9CisKKyMgVGhlcmUgYXJlIG90aGVycyBpbiBzbmRoZHIgdGhhdCBkb24ndCBoYXZlIE1JTUUgdHlwZXMuIDooCisjIEFkZGl0aW9uYWwgb25lcyB0byBiZSBhZGRlZCB0byBzbmRoZHI/IG1pZGksIG1wMywgcmVhbGF1ZGlvLCB3bWE/PworZGVmIF93aGF0c25kKGRhdGEpOgorICAgICIiIlRyeSB0byBpZGVudGlmeSBhIHNvdW5kIGZpbGUgdHlwZS4KKworICAgIHNuZGhkci53aGF0KCkgaGFzIGEgcHJldHR5IGNydWRkeSBpbnRlcmZhY2UsIHVuZm9ydHVuYXRlbHkuICBUaGlzIGlzIHdoeQorICAgIHdlIHJlLWRvIGl0IGhlcmUuICBJdCB3b3VsZCBiZSBlYXNpZXIgdG8gcmV2ZXJzZSBlbmdpbmVlciB0aGUgVW5peCAnZmlsZScKKyAgICBjb21tYW5kIGFuZCB1c2UgdGhlIHN0YW5kYXJkICdtYWdpYycgZmlsZSwgYXMgc2hpcHBlZCB3aXRoIGEgbW9kZXJuIFVuaXguCisgICAgIiIiCisgICAgaGRyID0gZGF0YVs6NTEyXQorICAgIGZha2VmaWxlID0gU3RyaW5nSU8oaGRyKQorICAgIGZvciB0ZXN0Zm4gaW4gc25kaGRyLnRlc3RzOgorICAgICAgICByZXMgPSB0ZXN0Zm4oaGRyLCBmYWtlZmlsZSkKKyAgICAgICAgaWYgcmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIF9zbmRoZHJfTUlNRW1hcC5nZXQocmVzWzBdKQorICAgIHJldHVybiBOb25lCisKKworDAorY2xhc3MgTUlNRUF1ZGlvKE1JTUVOb25NdWx0aXBhcnQpOgorICAgICIiIkNsYXNzIGZvciBnZW5lcmF0aW5nIGF1ZGlvLyogTUlNRSBkb2N1bWVudHMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX2F1ZGlvZGF0YSwgX3N1YnR5cGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgX2VuY29kZXI9ZW5jb2RlcnMuZW5jb2RlX2Jhc2U2NCwgKipfcGFyYW1zKToKKyAgICAgICAgIiIiQ3JlYXRlIGFuIGF1ZGlvLyogdHlwZSBNSU1FIGRvY3VtZW50LgorCisgICAgICAgIF9hdWRpb2RhdGEgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmF3IGF1ZGlvIGRhdGEuICBJZiB0aGlzIGRhdGEKKyAgICAgICAgY2FuIGJlIGRlY29kZWQgYnkgdGhlIHN0YW5kYXJkIFB5dGhvbiBgc25kaGRyJyBtb2R1bGUsIHRoZW4gdGhlCisgICAgICAgIHN1YnR5cGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluY2x1ZGVkIGluIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLgorICAgICAgICBPdGhlcndpc2UsIHlvdSBjYW4gc3BlY2lmeSAgdGhlIHNwZWNpZmljIGF1ZGlvIHN1YnR5cGUgdmlhIHRoZQorICAgICAgICBfc3VidHlwZSBwYXJhbWV0ZXIuICBJZiBfc3VidHlwZSBpcyBub3QgZ2l2ZW4sIGFuZCBubyBzdWJ0eXBlIGNhbiBiZQorICAgICAgICBndWVzc2VkLCBhIFR5cGVFcnJvciBpcyByYWlzZWQuCisKKyAgICAgICAgX2VuY29kZXIgaXMgYSBmdW5jdGlvbiB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIGFjdHVhbCBlbmNvZGluZyBmb3IKKyAgICAgICAgdHJhbnNwb3J0IG9mIHRoZSBpbWFnZSBkYXRhLiAgSXQgdGFrZXMgb25lIGFyZ3VtZW50LCB3aGljaCBpcyB0aGlzCisgICAgICAgIEltYWdlIGluc3RhbmNlLiAgSXQgc2hvdWxkIHVzZSBnZXRfcGF5bG9hZCgpIGFuZCBzZXRfcGF5bG9hZCgpIHRvCisgICAgICAgIGNoYW5nZSB0aGUgcGF5bG9hZCB0byB0aGUgZW5jb2RlZCBmb3JtLiAgSXQgc2hvdWxkIGFsc28gYWRkIGFueQorICAgICAgICBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIG9yIG90aGVyIGhlYWRlcnMgdG8gdGhlIG1lc3NhZ2UgYXMKKyAgICAgICAgbmVjZXNzYXJ5LiAgVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgQmFzZTY0LgorCisgICAgICAgIEFueSBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIGJhc2UgY2xhc3MKKyAgICAgICAgY29uc3RydWN0b3IsIHdoaWNoIHR1cm5zIHRoZW0gaW50byBwYXJhbWV0ZXJzIG9uIHRoZSBDb250ZW50LVR5cGUKKyAgICAgICAgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgX3N1YnR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIF9zdWJ0eXBlID0gX3doYXRzbmQoX2F1ZGlvZGF0YSkKKyAgICAgICAgaWYgX3N1YnR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ291bGQgbm90IGZpbmQgYXVkaW8gTUlNRSBzdWJ0eXBlJykKKyAgICAgICAgTUlNRU5vbk11bHRpcGFydC5fX2luaXRfXyhzZWxmLCAnYXVkaW8nLCBfc3VidHlwZSwgKipfcGFyYW1zKQorICAgICAgICBzZWxmLnNldF9wYXlsb2FkKF9hdWRpb2RhdGEpCisgICAgICAgIF9lbmNvZGVyKHNlbGYpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYXVkaW8ucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2F1ZGlvLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzMwNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2F1ZGlvLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYXVkaW8ucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2F1ZGlvLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzMwNmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2F1ZGlvLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYmFzZS5weSBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9iYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTE5MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYmFzZS5weQpAQCAtMCwwICsxLDI2IEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgc3BlY2lhbGl6YXRpb25zLiIiIgorCitfX2FsbF9fID0gWydNSU1FQmFzZSddCisKK2Zyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2UKKworCisMCitjbGFzcyBNSU1FQmFzZShtZXNzYWdlLk1lc3NhZ2UpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgc3BlY2lhbGl6YXRpb25zLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9tYWludHlwZSwgX3N1YnR5cGUsICoqX3BhcmFtcyk6CisgICAgICAgICIiIlRoaXMgY29uc3RydWN0b3IgYWRkcyBhIENvbnRlbnQtVHlwZTogYW5kIGEgTUlNRS1WZXJzaW9uOiBoZWFkZXIuCisKKyAgICAgICAgVGhlIENvbnRlbnQtVHlwZTogaGVhZGVyIGlzIHRha2VuIGZyb20gdGhlIF9tYWludHlwZSBhbmQgX3N1YnR5cGUKKyAgICAgICAgYXJndW1lbnRzLiAgQWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGlzIGhlYWRlciBhcmUgdGFrZW4gZnJvbSB0aGUKKyAgICAgICAga2V5d29yZCBhcmd1bWVudHMuCisgICAgICAgICIiIgorICAgICAgICBtZXNzYWdlLk1lc3NhZ2UuX19pbml0X18oc2VsZikKKyAgICAgICAgY3R5cGUgPSAnJXMvJXMnICUgKF9tYWludHlwZSwgX3N1YnR5cGUpCisgICAgICAgIHNlbGYuYWRkX2hlYWRlcignQ29udGVudC1UeXBlJywgY3R5cGUsICoqX3BhcmFtcykKKyAgICAgICAgc2VsZlsnTUlNRS1WZXJzaW9uJ10gPSAnMS4wJwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2Jhc2UucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2Jhc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOWQxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYmFzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2Jhc2UucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2Jhc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOWQxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYmFzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2ltYWdlLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2ltYWdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjM4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvaW1hZ2UucHkKQEAgLTAsMCArMSw0NiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJDbGFzcyByZXByZXNlbnRpbmcgaW1hZ2UvKiB0eXBlIE1JTUUgZG9jdW1lbnRzLiIiIgorCitfX2FsbF9fID0gWydNSU1FSW1hZ2UnXQorCitpbXBvcnQgaW1naGRyCisKK2Zyb20gZW1haWwgaW1wb3J0IGVuY29kZXJzCitmcm9tIGVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CisKKworDAorY2xhc3MgTUlNRUltYWdlKE1JTUVOb25NdWx0aXBhcnQpOgorICAgICIiIkNsYXNzIGZvciBnZW5lcmF0aW5nIGltYWdlLyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfaW1hZ2VkYXRhLCBfc3VidHlwZT1Ob25lLAorICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqKl9wYXJhbXMpOgorICAgICAgICAiIiJDcmVhdGUgYW4gaW1hZ2UvKiB0eXBlIE1JTUUgZG9jdW1lbnQuCisKKyAgICAgICAgX2ltYWdlZGF0YSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSByYXcgaW1hZ2UgZGF0YS4gIElmIHRoaXMgZGF0YQorICAgICAgICBjYW4gYmUgZGVjb2RlZCBieSB0aGUgc3RhbmRhcmQgUHl0aG9uIGBpbWdoZHInIG1vZHVsZSwgdGhlbiB0aGUKKyAgICAgICAgc3VidHlwZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIuCisgICAgICAgIE90aGVyd2lzZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBzcGVjaWZpYyBpbWFnZSBzdWJ0eXBlIHZpYSB0aGUgX3N1YnR5cGUKKyAgICAgICAgcGFyYW1ldGVyLgorCisgICAgICAgIF9lbmNvZGVyIGlzIGEgZnVuY3Rpb24gd2hpY2ggd2lsbCBwZXJmb3JtIHRoZSBhY3R1YWwgZW5jb2RpbmcgZm9yCisgICAgICAgIHRyYW5zcG9ydCBvZiB0aGUgaW1hZ2UgZGF0YS4gIEl0IHRha2VzIG9uZSBhcmd1bWVudCwgd2hpY2ggaXMgdGhpcworICAgICAgICBJbWFnZSBpbnN0YW5jZS4gIEl0IHNob3VsZCB1c2UgZ2V0X3BheWxvYWQoKSBhbmQgc2V0X3BheWxvYWQoKSB0bworICAgICAgICBjaGFuZ2UgdGhlIHBheWxvYWQgdG8gdGhlIGVuY29kZWQgZm9ybS4gIEl0IHNob3VsZCBhbHNvIGFkZCBhbnkKKyAgICAgICAgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBvciBvdGhlciBoZWFkZXJzIHRvIHRoZSBtZXNzYWdlIGFzCisgICAgICAgIG5lY2Vzc2FyeS4gIFRoZSBkZWZhdWx0IGVuY29kaW5nIGlzIEJhc2U2NC4KKworICAgICAgICBBbnkgYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZSBiYXNlIGNsYXNzCisgICAgICAgIGNvbnN0cnVjdG9yLCB3aGljaCB0dXJucyB0aGVtIGludG8gcGFyYW1ldGVycyBvbiB0aGUgQ29udGVudC1UeXBlCisgICAgICAgIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIF9zdWJ0eXBlIGlzIE5vbmU6CisgICAgICAgICAgICBfc3VidHlwZSA9IGltZ2hkci53aGF0KE5vbmUsIF9pbWFnZWRhdGEpCisgICAgICAgIGlmIF9zdWJ0eXBlIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0NvdWxkIG5vdCBndWVzcyBpbWFnZSBNSU1FIHN1YnR5cGUnKQorICAgICAgICBNSU1FTm9uTXVsdGlwYXJ0Ll9faW5pdF9fKHNlbGYsICdpbWFnZScsIF9zdWJ0eXBlLCAqKl9wYXJhbXMpCisgICAgICAgIHNlbGYuc2V0X3BheWxvYWQoX2ltYWdlZGF0YSkKKyAgICAgICAgX2VuY29kZXIoc2VsZikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9pbWFnZS5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvaW1hZ2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNDExYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvaW1hZ2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9pbWFnZS5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvaW1hZ2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNDExYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvaW1hZ2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tZXNzYWdlLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL21lc3NhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1ZGJmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tZXNzYWdlLnB5CkBAIC0wLDAgKzEsMzQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQ2xhc3MgcmVwcmVzZW50aW5nIG1lc3NhZ2UvKiBNSU1FIGRvY3VtZW50cy4iIiIKKworX19hbGxfXyA9IFsnTUlNRU1lc3NhZ2UnXQorCitmcm9tIGVtYWlsIGltcG9ydCBtZXNzYWdlCitmcm9tIGVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CisKKworDAorY2xhc3MgTUlNRU1lc3NhZ2UoTUlNRU5vbk11bHRpcGFydCk6CisgICAgIiIiQ2xhc3MgcmVwcmVzZW50aW5nIG1lc3NhZ2UvKiBNSU1FIGRvY3VtZW50cy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfbXNnLCBfc3VidHlwZT0ncmZjODIyJyk6CisgICAgICAgICIiIkNyZWF0ZSBhIG1lc3NhZ2UvKiB0eXBlIE1JTUUgZG9jdW1lbnQuCisKKyAgICAgICAgX21zZyBpcyBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIE1lc3NhZ2UsIG9yIGEKKyAgICAgICAgZGVyaXZlZCBjbGFzcyBvZiBNZXNzYWdlLCBvdGhlcndpc2UgYSBUeXBlRXJyb3IgaXMgcmFpc2VkLgorCisgICAgICAgIE9wdGlvbmFsIF9zdWJ0eXBlIGRlZmluZXMgdGhlIHN1YnR5cGUgb2YgdGhlIGNvbnRhaW5lZCBtZXNzYWdlLiAgVGhlCisgICAgICAgIGRlZmF1bHQgaXMgInJmYzgyMiIgKHRoaXMgaXMgZGVmaW5lZCBieSB0aGUgTUlNRSBzdGFuZGFyZCwgZXZlbiB0aG91Z2gKKyAgICAgICAgdGhlIHRlcm0gInJmYzgyMiIgaXMgdGVjaG5pY2FsbHkgb3V0ZGF0ZWQgYnkgUkZDIDI4MjIpLgorICAgICAgICAiIiIKKyAgICAgICAgTUlNRU5vbk11bHRpcGFydC5fX2luaXRfXyhzZWxmLCAnbWVzc2FnZScsIF9zdWJ0eXBlKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShfbXNnLCBtZXNzYWdlLk1lc3NhZ2UpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdBcmd1bWVudCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgTWVzc2FnZScpCisgICAgICAgICMgSXQncyBjb252ZW5pZW50IHRvIHVzZSB0aGlzIGJhc2UgY2xhc3MgbWV0aG9kLiAgV2UgbmVlZCB0byBkbyBpdAorICAgICAgICAjIHRoaXMgd2F5IG9yIHdlJ2xsIGdldCBhbiBleGNlcHRpb24KKyAgICAgICAgbWVzc2FnZS5NZXNzYWdlLmF0dGFjaChzZWxmLCBfbXNnKQorICAgICAgICAjIEFuZCBiZSBzdXJlIG91ciBkZWZhdWx0IHR5cGUgaXMgc2V0IGNvcnJlY3RseQorICAgICAgICBzZWxmLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tZXNzYWdlLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tZXNzYWdlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGNlM2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL21lc3NhZ2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tZXNzYWdlLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tZXNzYWdlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGNlM2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL21lc3NhZ2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tdWx0aXBhcnQucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvbXVsdGlwYXJ0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjE4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvbXVsdGlwYXJ0LnB5CkBAIC0wLDAgKzEsNDcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSBtdWx0aXBhcnQvKiB0eXBlIG1lc3NhZ2VzLiIiIgorCitfX2FsbF9fID0gWydNSU1FTXVsdGlwYXJ0J10KKworZnJvbSBlbWFpbC5taW1lLmJhc2UgaW1wb3J0IE1JTUVCYXNlCisKKworDAorY2xhc3MgTUlNRU11bHRpcGFydChNSU1FQmFzZSk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSBtdWx0aXBhcnQvKiB0eXBlIG1lc3NhZ2VzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9zdWJ0eXBlPSdtaXhlZCcsIGJvdW5kYXJ5PU5vbmUsIF9zdWJwYXJ0cz1Ob25lLAorICAgICAgICAgICAgICAgICAqKl9wYXJhbXMpOgorICAgICAgICAiIiJDcmVhdGVzIGEgbXVsdGlwYXJ0LyogdHlwZSBtZXNzYWdlLgorCisgICAgICAgIEJ5IGRlZmF1bHQsIGNyZWF0ZXMgYSBtdWx0aXBhcnQvbWl4ZWQgbWVzc2FnZSwgd2l0aCBwcm9wZXIKKyAgICAgICAgQ29udGVudC1UeXBlIGFuZCBNSU1FLVZlcnNpb24gaGVhZGVycy4KKworICAgICAgICBfc3VidHlwZSBpcyB0aGUgc3VidHlwZSBvZiB0aGUgbXVsdGlwYXJ0IGNvbnRlbnQgdHlwZSwgZGVmYXVsdGluZyB0bworICAgICAgICBgbWl4ZWQnLgorCisgICAgICAgIGJvdW5kYXJ5IGlzIHRoZSBtdWx0aXBhcnQgYm91bmRhcnkgc3RyaW5nLiAgQnkgZGVmYXVsdCBpdCBpcworICAgICAgICBjYWxjdWxhdGVkIGFzIG5lZWRlZC4KKworICAgICAgICBfc3VicGFydHMgaXMgYSBzZXF1ZW5jZSBvZiBpbml0aWFsIHN1YnBhcnRzIGZvciB0aGUgcGF5bG9hZC4gIEl0CisgICAgICAgIG11c3QgYmUgYW4gaXRlcmFibGUgb2JqZWN0LCBzdWNoIGFzIGEgbGlzdC4gIFlvdSBjYW4gYWx3YXlzCisgICAgICAgIGF0dGFjaCBuZXcgc3VicGFydHMgdG8gdGhlIG1lc3NhZ2UgYnkgdXNpbmcgdGhlIGF0dGFjaCgpIG1ldGhvZC4KKworICAgICAgICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGFyZSB0YWtlbiBmcm9tIHRoZQorICAgICAgICBrZXl3b3JkIGFyZ3VtZW50cyAob3IgcGFzc2VkIGludG8gdGhlIF9wYXJhbXMgYXJndW1lbnQpLgorICAgICAgICAiIiIKKyAgICAgICAgTUlNRUJhc2UuX19pbml0X18oc2VsZiwgJ211bHRpcGFydCcsIF9zdWJ0eXBlLCAqKl9wYXJhbXMpCisKKyAgICAgICAgIyBJbml0aWFsaXNlIF9wYXlsb2FkIHRvIGFuIGVtcHR5IGxpc3QgYXMgdGhlIE1lc3NhZ2Ugc3VwZXJjbGFzcydzCisgICAgICAgICMgaW1wbGVtZW50YXRpb24gb2YgaXNfbXVsdGlwYXJ0IGFzc3VtZXMgdGhhdCBfcGF5bG9hZCBpcyBhIGxpc3QgZm9yCisgICAgICAgICMgbXVsdGlwYXJ0IG1lc3NhZ2VzLgorICAgICAgICBzZWxmLl9wYXlsb2FkID0gW10KKworICAgICAgICBpZiBfc3VicGFydHM6CisgICAgICAgICAgICBmb3IgcCBpbiBfc3VicGFydHM6CisgICAgICAgICAgICAgICAgc2VsZi5hdHRhY2gocCkKKyAgICAgICAgaWYgYm91bmRhcnk6CisgICAgICAgICAgICBzZWxmLnNldF9ib3VuZGFyeShib3VuZGFyeSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tdWx0aXBhcnQucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL211bHRpcGFydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxZTI1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tdWx0aXBhcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tdWx0aXBhcnQucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL211bHRpcGFydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxZTI1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tdWx0aXBhcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9ub25tdWx0aXBhcnQucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvbm9ubXVsdGlwYXJ0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjM2I5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvbm9ubXVsdGlwYXJ0LnB5CkBAIC0wLDAgKzEsMjIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSB0eXBlIG1lc3NhZ2VzIHRoYXQgYXJlIG5vdCBtdWx0aXBhcnQuIiIiCisKK19fYWxsX18gPSBbJ01JTUVOb25NdWx0aXBhcnQnXQorCitmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKK2Zyb20gZW1haWwubWltZS5iYXNlIGltcG9ydCBNSU1FQmFzZQorCisKKwwKK2NsYXNzIE1JTUVOb25NdWx0aXBhcnQoTUlNRUJhc2UpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgbXVsdGlwYXJ0LyogdHlwZSBtZXNzYWdlcy4iIiIKKworICAgIGRlZiBhdHRhY2goc2VsZiwgcGF5bG9hZCk6CisgICAgICAgICMgVGhlIHB1YmxpYyBBUEkgcHJvaGliaXRzIGF0dGFjaGluZyBtdWx0aXBsZSBzdWJwYXJ0cyB0byBNSU1FQmFzZQorICAgICAgICAjIGRlcml2ZWQgc3VidHlwZXMgc2luY2Ugbm9uZSBvZiB0aGVtIGFyZSwgYnkgZGVmaW5pdGlvbiwgb2YgY29udGVudAorICAgICAgICAjIHR5cGUgbXVsdGlwYXJ0LyoKKyAgICAgICAgcmFpc2UgZXJyb3JzLk11bHRpcGFydENvbnZlcnNpb25FcnJvcigKKyAgICAgICAgICAgICdDYW5ub3QgYXR0YWNoIGFkZGl0aW9uYWwgc3VicGFydHMgdG8gbm9uLW11bHRpcGFydC8qJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9ub25tdWx0aXBhcnQucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL25vbm11bHRpcGFydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjNjI0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9ub25tdWx0aXBhcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9ub25tdWx0aXBhcnQucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL25vbm11bHRpcGFydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVjNjI0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9ub25tdWx0aXBhcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS90ZXh0LnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL3RleHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0N2RiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS90ZXh0LnB5CkBAIC0wLDAgKzEsMzAgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQ2xhc3MgcmVwcmVzZW50aW5nIHRleHQvKiB0eXBlIE1JTUUgZG9jdW1lbnRzLiIiIgorCitfX2FsbF9fID0gWydNSU1FVGV4dCddCisKK2Zyb20gZW1haWwuZW5jb2RlcnMgaW1wb3J0IGVuY29kZV83b3I4Yml0Citmcm9tIGVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CisKKworDAorY2xhc3MgTUlNRVRleHQoTUlNRU5vbk11bHRpcGFydCk6CisgICAgIiIiQ2xhc3MgZm9yIGdlbmVyYXRpbmcgdGV4dC8qIHR5cGUgTUlNRSBkb2N1bWVudHMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX3RleHQsIF9zdWJ0eXBlPSdwbGFpbicsIF9jaGFyc2V0PSd1cy1hc2NpaScpOgorICAgICAgICAiIiJDcmVhdGUgYSB0ZXh0LyogdHlwZSBNSU1FIGRvY3VtZW50LgorCisgICAgICAgIF90ZXh0IGlzIHRoZSBzdHJpbmcgZm9yIHRoaXMgbWVzc2FnZSBvYmplY3QuCisKKyAgICAgICAgX3N1YnR5cGUgaXMgdGhlIE1JTUUgc3ViIGNvbnRlbnQgdHlwZSwgZGVmYXVsdGluZyB0byAicGxhaW4iLgorCisgICAgICAgIF9jaGFyc2V0IGlzIHRoZSBjaGFyYWN0ZXIgc2V0IHBhcmFtZXRlciBhZGRlZCB0byB0aGUgQ29udGVudC1UeXBlCisgICAgICAgIGhlYWRlci4gIFRoaXMgZGVmYXVsdHMgdG8gInVzLWFzY2lpIi4gIE5vdGUgdGhhdCBhcyBhIHNpZGUtZWZmZWN0LCB0aGUKKyAgICAgICAgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIgd2lsbCBhbHNvIGJlIHNldC4KKyAgICAgICAgIiIiCisgICAgICAgIE1JTUVOb25NdWx0aXBhcnQuX19pbml0X18oc2VsZiwgJ3RleHQnLCBfc3VidHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKnsnY2hhcnNldCc6IF9jaGFyc2V0fSkKKyAgICAgICAgc2VsZi5zZXRfcGF5bG9hZChfdGV4dCwgX2NoYXJzZXQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvdGV4dC5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvdGV4dC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1ZjNmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS90ZXh0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvdGV4dC5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvdGV4dC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1ZjNmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS90ZXh0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3BhcnNlci5weSBiL2xpYi9weXRob24yLjcvZW1haWwvcGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmY2FmMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3BhcnNlci5weQpAQCAtMCwwICsxLDkxIEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3LCBUaG9tYXMgV291dGVycywgQW50aG9ueSBCYXh0ZXIKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQSBwYXJzZXIgb2YgUkZDIDI4MjIgYW5kIE1JTUUgZW1haWwgbWVzc2FnZXMuIiIiCisKK19fYWxsX18gPSBbJ1BhcnNlcicsICdIZWFkZXJQYXJzZXInXQorCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitmcm9tIGVtYWlsLmZlZWRwYXJzZXIgaW1wb3J0IEZlZWRQYXJzZXIKK2Zyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQorCisKKwwKK2NsYXNzIFBhcnNlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dzKToKKyAgICAgICAgIiIiUGFyc2VyIG9mIFJGQyAyODIyIGFuZCBNSU1FIGVtYWlsIG1lc3NhZ2VzLgorCisgICAgICAgIENyZWF0ZXMgYW4gaW4tbWVtb3J5IG9iamVjdCB0cmVlIHJlcHJlc2VudGluZyB0aGUgZW1haWwgbWVzc2FnZSwgd2hpY2gKKyAgICAgICAgY2FuIHRoZW4gYmUgbWFuaXB1bGF0ZWQgYW5kIHR1cm5lZCBvdmVyIHRvIGEgR2VuZXJhdG9yIHRvIHJldHVybiB0aGUKKyAgICAgICAgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZS4KKworICAgICAgICBUaGUgc3RyaW5nIG11c3QgYmUgZm9ybWF0dGVkIGFzIGEgYmxvY2sgb2YgUkZDIDI4MjIgaGVhZGVycyBhbmQgaGVhZGVyCisgICAgICAgIGNvbnRpbnVhdGlvbiBsaW5lcywgb3B0aW9uYWxseSBwcmVjZWVkZWQgYnkgYSBgVW5peC1mcm9tJyBoZWFkZXIuICBUaGUKKyAgICAgICAgaGVhZGVyIGJsb2NrIGlzIHRlcm1pbmF0ZWQgZWl0aGVyIGJ5IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBvciBieSBhCisgICAgICAgIGJsYW5rIGxpbmUuCisKKyAgICAgICAgX2NsYXNzIGlzIHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZSBmb3IgbmV3IG1lc3NhZ2Ugb2JqZWN0cyB3aGVuIHRoZXkKKyAgICAgICAgbXVzdCBiZSBjcmVhdGVkLiAgVGhpcyBjbGFzcyBtdXN0IGhhdmUgYSBjb25zdHJ1Y3RvciB0aGF0IGNhbiB0YWtlCisgICAgICAgIHplcm8gYXJndW1lbnRzLiAgRGVmYXVsdCBpcyBNZXNzYWdlLk1lc3NhZ2UuCisgICAgICAgICIiIgorICAgICAgICBpZiBsZW4oYXJncykgPj0gMToKKyAgICAgICAgICAgIGlmICdfY2xhc3MnIGluIGt3czoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmcgJ19jbGFzcyciKQorICAgICAgICAgICAga3dzWydfY2xhc3MnXSA9IGFyZ3NbMF0KKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDI6CisgICAgICAgICAgICBpZiAnc3RyaWN0JyBpbiBrd3M6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJNdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgYXJnICdzdHJpY3QnIikKKyAgICAgICAgICAgIGt3c1snc3RyaWN0J10gPSBhcmdzWzFdCisgICAgICAgIGlmIGxlbihhcmdzKSA+IDI6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RvbyBtYW55IGFyZ3VtZW50cycpCisgICAgICAgIGlmICdfY2xhc3MnIGluIGt3czoKKyAgICAgICAgICAgIHNlbGYuX2NsYXNzID0ga3dzWydfY2xhc3MnXQorICAgICAgICAgICAgZGVsIGt3c1snX2NsYXNzJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2NsYXNzID0gTWVzc2FnZQorICAgICAgICBpZiAnc3RyaWN0JyBpbiBrd3M6CisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCInc3RyaWN0JyBhcmd1bWVudCBpcyBkZXByZWNhdGVkIChhbmQgaWdub3JlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisgICAgICAgICAgICBkZWwga3dzWydzdHJpY3QnXQorICAgICAgICBpZiBrd3M6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1VuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudHMnKQorCisgICAgZGVmIHBhcnNlKHNlbGYsIGZwLCBoZWFkZXJzb25seT1GYWxzZSk6CisgICAgICAgICIiIkNyZWF0ZSBhIG1lc3NhZ2Ugc3RydWN0dXJlIGZyb20gdGhlIGRhdGEgaW4gYSBmaWxlLgorCisgICAgICAgIFJlYWRzIGFsbCB0aGUgZGF0YSBmcm9tIHRoZSBmaWxlIGFuZCByZXR1cm5zIHRoZSByb290IG9mIHRoZSBtZXNzYWdlCisgICAgICAgIHN0cnVjdHVyZS4gIE9wdGlvbmFsIGhlYWRlcnNvbmx5IGlzIGEgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgdG8gc3RvcAorICAgICAgICBwYXJzaW5nIGFmdGVyIHJlYWRpbmcgdGhlIGhlYWRlcnMgb3Igbm90LiAgVGhlIGRlZmF1bHQgaXMgRmFsc2UsCisgICAgICAgIG1lYW5pbmcgaXQgcGFyc2VzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICBmZWVkcGFyc2VyID0gRmVlZFBhcnNlcihzZWxmLl9jbGFzcykKKyAgICAgICAgaWYgaGVhZGVyc29ubHk6CisgICAgICAgICAgICBmZWVkcGFyc2VyLl9zZXRfaGVhZGVyc29ubHkoKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWQoODE5MikKKyAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmZWVkcGFyc2VyLmZlZWQoZGF0YSkKKyAgICAgICAgcmV0dXJuIGZlZWRwYXJzZXIuY2xvc2UoKQorCisgICAgZGVmIHBhcnNlc3RyKHNlbGYsIHRleHQsIGhlYWRlcnNvbmx5PUZhbHNlKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbWVzc2FnZSBzdHJ1Y3R1cmUgZnJvbSBhIHN0cmluZy4KKworICAgICAgICBSZXR1cm5zIHRoZSByb290IG9mIHRoZSBtZXNzYWdlIHN0cnVjdHVyZS4gIE9wdGlvbmFsIGhlYWRlcnNvbmx5IGlzIGEKKyAgICAgICAgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgdG8gc3RvcCBwYXJzaW5nIGFmdGVyIHJlYWRpbmcgdGhlIGhlYWRlcnMgb3IKKyAgICAgICAgbm90LiAgVGhlIGRlZmF1bHQgaXMgRmFsc2UsIG1lYW5pbmcgaXQgcGFyc2VzIHRoZSBlbnRpcmUgY29udGVudHMgb2YKKyAgICAgICAgdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5wYXJzZShTdHJpbmdJTyh0ZXh0KSwgaGVhZGVyc29ubHk9aGVhZGVyc29ubHkpCisKKworDAorY2xhc3MgSGVhZGVyUGFyc2VyKFBhcnNlcik6CisgICAgZGVmIHBhcnNlKHNlbGYsIGZwLCBoZWFkZXJzb25seT1UcnVlKToKKyAgICAgICAgcmV0dXJuIFBhcnNlci5wYXJzZShzZWxmLCBmcCwgVHJ1ZSkKKworICAgIGRlZiBwYXJzZXN0cihzZWxmLCB0ZXh0LCBoZWFkZXJzb25seT1UcnVlKToKKyAgICAgICAgcmV0dXJuIFBhcnNlci5wYXJzZXN0cihzZWxmLCB0ZXh0LCBUcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9wYXJzZXIucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9wYXJzZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZmY3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3BhcnNlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9wYXJzZXIucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9wYXJzZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZmY3ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3BhcnNlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9xdW9wcmltaW1lLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9xdW9wcmltaW1lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMThhOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3F1b3ByaW1pbWUucHkKQEAgLTAsMCArMSwzMzYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCZW4gR2VydHpmaWVsZAorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJRdW90ZWQtcHJpbnRhYmxlIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcgcGVyIFJGQ3MgMjA0NS0yMDQ3LgorCitUaGlzIG1vZHVsZSBoYW5kbGVzIHRoZSBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIG1ldGhvZCBkZWZpbmVkIGluIFJGQyAyMDQ1Cit0byBlbmNvZGUgVVMgQVNDSUktbGlrZSA4LWJpdCBkYXRhIGNhbGxlZCBgcXVvdGVkLXByaW50YWJsZScuICBJdCBpcyB1c2VkIHRvCitzYWZlbHkgZW5jb2RlIHRleHQgdGhhdCBpcyBpbiBhIGNoYXJhY3RlciBzZXQgc2ltaWxhciB0byB0aGUgNy1iaXQgVVMgQVNDSUkKK2NoYXJhY3RlciBzZXQsIGJ1dCB0aGF0IGluY2x1ZGVzIHNvbWUgOC1iaXQgY2hhcmFjdGVycyB0aGF0IGFyZSBub3JtYWxseSBub3QKK2FsbG93ZWQgaW4gZW1haWwgYm9kaWVzIG9yIGhlYWRlcnMuCisKK1F1b3RlZC1wcmludGFibGUgaXMgdmVyeSBzcGFjZS1pbmVmZmljaWVudCBmb3IgZW5jb2RpbmcgYmluYXJ5IGZpbGVzOyB1c2UgdGhlCitlbWFpbC5iYXNlNjRtaW1lIG1vZHVsZSBmb3IgdGhhdCBpbnN0ZWFkLgorCitUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gZW5jb2RlIGFuZCBkZWNvZGUgYm90aCBoZWFkZXJzIGFuZCBib2RpZXMKK3dpdGggcXVvdGVkLXByaW50YWJsZSBlbmNvZGluZy4KKworUkZDIDIwNDUgZGVmaW5lcyBhIG1ldGhvZCBmb3IgaW5jbHVkaW5nIGNoYXJhY3RlciBzZXQgaW5mb3JtYXRpb24gaW4gYW4KK2BlbmNvZGVkLXdvcmQnIGluIGEgaGVhZGVyLiAgVGhpcyBtZXRob2QgaXMgY29tbW9ubHkgdXNlZCBmb3IgOC1iaXQgcmVhbCBuYW1lcworaW4gVG86L0Zyb206L0NjOiBldGMuIGZpZWxkcywgYXMgd2VsbCBhcyBTdWJqZWN0OiBsaW5lcy4KKworVGhpcyBtb2R1bGUgZG9lcyBub3QgZG8gdGhlIGxpbmUgd3JhcHBpbmcgb3IgZW5kLW9mLWxpbmUgY2hhcmFjdGVyCitjb252ZXJzaW9uIG5lY2Vzc2FyeSBmb3IgcHJvcGVyIGludGVybmF0aW9uYWxpemVkIGhlYWRlcnM7IGl0IG9ubHkKK2RvZXMgZHVtYiBlbmNvZGluZyBhbmQgZGVjb2RpbmcuICBUbyBkZWFsIHdpdGggdGhlIHZhcmlvdXMgbGluZQord3JhcHBpbmcgaXNzdWVzLCB1c2UgdGhlIGVtYWlsLmhlYWRlciBtb2R1bGUuCisiIiIKKworX19hbGxfXyA9IFsKKyAgICAnYm9keV9kZWNvZGUnLAorICAgICdib2R5X2VuY29kZScsCisgICAgJ2JvZHlfcXVvcHJpX2NoZWNrJywKKyAgICAnYm9keV9xdW9wcmlfbGVuJywKKyAgICAnZGVjb2RlJywKKyAgICAnZGVjb2Rlc3RyaW5nJywKKyAgICAnZW5jb2RlJywKKyAgICAnZW5jb2Rlc3RyaW5nJywKKyAgICAnaGVhZGVyX2RlY29kZScsCisgICAgJ2hlYWRlcl9lbmNvZGUnLAorICAgICdoZWFkZXJfcXVvcHJpX2NoZWNrJywKKyAgICAnaGVhZGVyX3F1b3ByaV9sZW4nLAorICAgICdxdW90ZScsCisgICAgJ3VucXVvdGUnLAorICAgIF0KKworaW1wb3J0IHJlCisKK2Zyb20gc3RyaW5nIGltcG9ydCBoZXhkaWdpdHMKK2Zyb20gZW1haWwudXRpbHMgaW1wb3J0IGZpeF9lb2xzCisKK0NSTEYgPSAnXHJcbicKK05MID0gJ1xuJworCisjIFNlZSBhbHNvIENoYXJzZXQucHkKK01JU0NfTEVOID0gNworCitocXJlID0gcmUuY29tcGlsZShyJ1teLWEtekEtWjAtOSEqKy8gXScpCiticXJlID0gcmUuY29tcGlsZShyJ1teICEtPD4tflx0XScpCisKKworDAorIyBIZWxwZXJzCitkZWYgaGVhZGVyX3F1b3ByaV9jaGVjayhjKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIHNob3VsZCBiZSBlc2NhcGVkIHdpdGggaGVhZGVyIHF1b3ByaS4iIiIKKyAgICByZXR1cm4gYm9vbChocXJlLm1hdGNoKGMpKQorCisKK2RlZiBib2R5X3F1b3ByaV9jaGVjayhjKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgY2hhcmFjdGVyIHNob3VsZCBiZSBlc2NhcGVkIHdpdGggYm9keSBxdW9wcmkuIiIiCisgICAgcmV0dXJuIGJvb2woYnFyZS5tYXRjaChjKSkKKworCitkZWYgaGVhZGVyX3F1b3ByaV9sZW4ocyk6CisgICAgIiIiUmV0dXJuIHRoZSBsZW5ndGggb2Ygc3RyIHdoZW4gaXQgaXMgZW5jb2RlZCB3aXRoIGhlYWRlciBxdW9wcmkuIiIiCisgICAgY291bnQgPSAwCisgICAgZm9yIGMgaW4gczoKKyAgICAgICAgaWYgaHFyZS5tYXRjaChjKToKKyAgICAgICAgICAgIGNvdW50ICs9IDMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICByZXR1cm4gY291bnQKKworCitkZWYgYm9keV9xdW9wcmlfbGVuKHN0cik6CisgICAgIiIiUmV0dXJuIHRoZSBsZW5ndGggb2Ygc3RyIHdoZW4gaXQgaXMgZW5jb2RlZCB3aXRoIGJvZHkgcXVvcHJpLiIiIgorICAgIGNvdW50ID0gMAorICAgIGZvciBjIGluIHN0cjoKKyAgICAgICAgaWYgYnFyZS5tYXRjaChjKToKKyAgICAgICAgICAgIGNvdW50ICs9IDMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICByZXR1cm4gY291bnQKKworCitkZWYgX21heF9hcHBlbmQoTCwgcywgbWF4bGVuLCBleHRyYT0nJyk6CisgICAgaWYgbm90IEw6CisgICAgICAgIEwuYXBwZW5kKHMubHN0cmlwKCkpCisgICAgZWxpZiBsZW4oTFstMV0pICsgbGVuKHMpIDw9IG1heGxlbjoKKyAgICAgICAgTFstMV0gKz0gZXh0cmEgKyBzCisgICAgZWxzZToKKyAgICAgICAgTC5hcHBlbmQocy5sc3RyaXAoKSkKKworCitkZWYgdW5xdW90ZShzKToKKyAgICAiIiJUdXJuIGEgc3RyaW5nIGluIHRoZSBmb3JtID1BQiB0byB0aGUgQVNDSUkgY2hhcmFjdGVyIHdpdGggdmFsdWUgMHhhYiIiIgorICAgIHJldHVybiBjaHIoaW50KHNbMTozXSwgMTYpKQorCisKK2RlZiBxdW90ZShjKToKKyAgICByZXR1cm4gIj0lMDJYIiAlIG9yZChjKQorCisKKwwKK2RlZiBoZWFkZXJfZW5jb2RlKGhlYWRlciwgY2hhcnNldD0iaXNvLTg4NTktMSIsIGtlZXBfZW9scz1GYWxzZSwKKyAgICAgICAgICAgICAgICAgIG1heGxpbmVsZW49NzYsIGVvbD1OTCk6CisgICAgIiIiRW5jb2RlIGEgc2luZ2xlIGhlYWRlciBsaW5lIHdpdGggcXVvdGVkLXByaW50YWJsZSAobGlrZSkgZW5jb2RpbmcuCisKKyAgICBEZWZpbmVkIGluIFJGQyAyMDQ1LCB0aGlzIGBRJyBlbmNvZGluZyBpcyBzaW1pbGFyIHRvIHF1b3RlZC1wcmludGFibGUsIGJ1dAorICAgIHVzZWQgc3BlY2lmaWNhbGx5IGZvciBlbWFpbCBoZWFkZXIgZmllbGRzIHRvIGFsbG93IGNoYXJzZXRzIHdpdGggbW9zdGx5IDcKKyAgICBiaXQgY2hhcmFjdGVycyAoYW5kIHNvbWUgOCBiaXQpIHRvIHJlbWFpbiBtb3JlIG9yIGxlc3MgcmVhZGFibGUgaW4gbm9uLVJGQworICAgIDIwNDUgYXdhcmUgbWFpbCBjbGllbnRzLgorCisgICAgY2hhcnNldCBuYW1lcyB0aGUgY2hhcmFjdGVyIHNldCB0byB1c2UgdG8gZW5jb2RlIHRoZSBoZWFkZXIuICBJdCBkZWZhdWx0cworICAgIHRvIGlzby04ODU5LTEuCisKKyAgICBUaGUgcmVzdWx0aW5nIHN0cmluZyB3aWxsIGJlIGluIHRoZSBmb3JtOgorCisgICAgIj0/Y2hhcnNldD9xP0lfZj1FMnJ0X2luX3lvdXJfZz1FOG49RThyYWxfZGlyZT1FN3Rpb24/XFxuCisgICAgICA9P2NoYXJzZXQ/cT9TaWxseV89QzhuZ2xpc2hfS249RUVnaHRzPz0iCisKKyAgICB3aXRoIGVhY2ggbGluZSB3cmFwcGVkIHNhZmVseSBhdCwgYXQgbW9zdCwgbWF4bGluZWxlbiBjaGFyYWN0ZXJzIChkZWZhdWx0cworICAgIHRvIDc2IGNoYXJhY3RlcnMpLiAgSWYgbWF4bGluZWxlbiBpcyBOb25lLCB0aGUgZW50aXJlIHN0cmluZyBpcyBlbmNvZGVkIGluCisgICAgb25lIGNodW5rIHdpdGggbm8gc3BsaXR0aW5nLgorCisgICAgRW5kLW9mLWxpbmUgY2hhcmFjdGVycyAoXFxyLCBcXG4sIFxcclxcbikgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZAorICAgIHRvIHRoZSBjYW5vbmljYWwgZW1haWwgbGluZSBzZXBhcmF0b3IgXFxyXFxuIHVubGVzcyB0aGUga2VlcF9lb2xzCisgICAgcGFyYW1ldGVyIGlzIFRydWUgKHRoZSBkZWZhdWx0IGlzIEZhbHNlKS4KKworICAgIEVhY2ggbGluZSBvZiB0aGUgaGVhZGVyIHdpbGwgYmUgdGVybWluYXRlZCBpbiB0aGUgdmFsdWUgb2YgZW9sLCB3aGljaAorICAgIGRlZmF1bHRzIHRvICJcXG4iLiAgU2V0IHRoaXMgdG8gIlxcclxcbiIgaWYgeW91IGFyZSB1c2luZyB0aGUgcmVzdWx0IG9mCisgICAgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSBpbiBlbWFpbC4KKyAgICAiIiIKKyAgICAjIFJldHVybiBlbXB0eSBoZWFkZXJzIHVuY2hhbmdlZAorICAgIGlmIG5vdCBoZWFkZXI6CisgICAgICAgIHJldHVybiBoZWFkZXIKKworICAgIGlmIG5vdCBrZWVwX2VvbHM6CisgICAgICAgIGhlYWRlciA9IGZpeF9lb2xzKGhlYWRlcikKKworICAgICMgUXVvcHJpIGVuY29kZSBlYWNoIGxpbmUsIGluIGVuY29kZWQgY2h1bmtzIG5vIGdyZWF0ZXIgdGhhbiBtYXhsaW5lbGVuIGluCisgICAgIyBsZW5ndGgsIGFmdGVyIHRoZSBSRkMgY2hyb21lIGlzIGFkZGVkIGluLgorICAgIHF1b3RlZCA9IFtdCisgICAgaWYgbWF4bGluZWxlbiBpcyBOb25lOgorICAgICAgICAjIEFuIG9ibm94aW91c2x5IGxhcmdlIG51bWJlciB0aGF0J3MgZ29vZCBlbm91Z2gKKyAgICAgICAgbWF4X2VuY29kZWQgPSAxMDAwMDAKKyAgICBlbHNlOgorICAgICAgICBtYXhfZW5jb2RlZCA9IG1heGxpbmVsZW4gLSBsZW4oY2hhcnNldCkgLSBNSVNDX0xFTiAtIDEKKworICAgIGZvciBjIGluIGhlYWRlcjoKKyAgICAgICAgIyBTcGFjZSBtYXkgYmUgcmVwcmVzZW50ZWQgYXMgXyBpbnN0ZWFkIG9mID0yMCBmb3IgcmVhZGFiaWxpdHkKKyAgICAgICAgaWYgYyA9PSAnICc6CisgICAgICAgICAgICBfbWF4X2FwcGVuZChxdW90ZWQsICdfJywgbWF4X2VuY29kZWQpCisgICAgICAgICMgVGhlc2UgY2hhcmFjdGVycyBjYW4gYmUgaW5jbHVkZWQgdmVyYmF0aW0KKyAgICAgICAgZWxpZiBub3QgaHFyZS5tYXRjaChjKToKKyAgICAgICAgICAgIF9tYXhfYXBwZW5kKHF1b3RlZCwgYywgbWF4X2VuY29kZWQpCisgICAgICAgICMgT3RoZXJ3aXNlLCByZXBsYWNlIHdpdGggaGV4IHZhbHVlIGxpa2UgPUUyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfbWF4X2FwcGVuZChxdW90ZWQsICI9JTAyWCIgJSBvcmQoYyksIG1heF9lbmNvZGVkKQorCisgICAgIyBOb3cgYWRkIHRoZSBSRkMgY2hyb21lIHRvIGVhY2ggZW5jb2RlZCBjaHVuayBhbmQgZ2x1ZSB0aGUgY2h1bmtzCisgICAgIyB0b2dldGhlci4gIEJBVzogc2hvdWxkIHdlIGJlIGFibGUgdG8gc3BlY2lmeSB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIGluCisgICAgIyB0aGUgam9pbmVyPworICAgIGpvaW5lciA9IGVvbCArICcgJworICAgIHJldHVybiBqb2luZXIuam9pbihbJz0/JXM/cT8lcz89JyAlIChjaGFyc2V0LCBsaW5lKSBmb3IgbGluZSBpbiBxdW90ZWRdKQorCisKKwwKK2RlZiBlbmNvZGUoYm9keSwgYmluYXJ5PUZhbHNlLCBtYXhsaW5lbGVuPTc2LCBlb2w9TkwpOgorICAgICIiIkVuY29kZSB3aXRoIHF1b3RlZC1wcmludGFibGUsIHdyYXBwaW5nIGF0IG1heGxpbmVsZW4gY2hhcmFjdGVycy4KKworICAgIElmIGJpbmFyeSBpcyBGYWxzZSAodGhlIGRlZmF1bHQpLCBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzIHdpbGwgYmUgY29udmVydGVkCisgICAgdG8gdGhlIGNhbm9uaWNhbCBlbWFpbCBlbmQtb2YtbGluZSBzZXF1ZW5jZSBcXHJcXG4uICBPdGhlcndpc2UgdGhleSB3aWxsCisgICAgYmUgbGVmdCB2ZXJiYXRpbS4KKworICAgIEVhY2ggbGluZSBvZiBlbmNvZGVkIHRleHQgd2lsbCBlbmQgd2l0aCBlb2wsIHdoaWNoIGRlZmF1bHRzIHRvICJcXG4iLiAgU2V0CisgICAgdGhpcyB0byAiXFxyXFxuIiBpZiB5b3Ugd2lsbCBiZSB1c2luZyB0aGUgcmVzdWx0IG9mIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkKKyAgICBpbiBhbiBlbWFpbC4KKworICAgIEVhY2ggbGluZSB3aWxsIGJlIHdyYXBwZWQgYXQsIGF0IG1vc3QsIG1heGxpbmVsZW4gY2hhcmFjdGVycyAoZGVmYXVsdHMgdG8KKyAgICA3NiBjaGFyYWN0ZXJzKS4gIExvbmcgbGluZXMgd2lsbCBoYXZlIHRoZSBgc29mdCBsaW5lZmVlZCcgcXVvdGVkLXByaW50YWJsZQorICAgIGNoYXJhY3RlciAiPSIgYXBwZW5kZWQgdG8gdGhlbSwgc28gdGhlIGRlY29kZWQgdGV4dCB3aWxsIGJlIGlkZW50aWNhbCB0bworICAgIHRoZSBvcmlnaW5hbCB0ZXh0LgorICAgICIiIgorICAgIGlmIG5vdCBib2R5OgorICAgICAgICByZXR1cm4gYm9keQorCisgICAgaWYgbm90IGJpbmFyeToKKyAgICAgICAgYm9keSA9IGZpeF9lb2xzKGJvZHkpCisKKyAgICAjIEJBVzogV2UncmUgYWNjdW11bGF0aW5nIHRoZSBib2R5IHRleHQgYnkgc3RyaW5nIGNvbmNhdGVuYXRpb24uICBUaGF0CisgICAgIyBjYW4ndCBiZSB2ZXJ5IGVmZmljaWVudCwgYnV0IEkgZG9uJ3QgaGF2ZSB0aW1lIG5vdyB0byByZXdyaXRlIGl0LiAgSXQKKyAgICAjIGp1c3QgZmVlbHMgbGlrZSB0aGlzIGFsZ29yaXRobSBjb3VsZCBiZSBtb3JlIGVmZmljaWVudC4KKyAgICBlbmNvZGVkX2JvZHkgPSAnJworICAgIGxpbmVubyA9IC0xCisgICAgIyBQcmVzZXJ2ZSBsaW5lIGVuZGluZ3MgaGVyZSBzbyB3ZSBjYW4gY2hlY2sgbGF0ZXIgdG8gc2VlIGFuIGVvbCBuZWVkcyB0bworICAgICMgYmUgYWRkZWQgdG8gdGhlIG91dHB1dCBsYXRlci4KKyAgICBsaW5lcyA9IGJvZHkuc3BsaXRsaW5lcygxKQorICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAjIEJ1dCBzdHJpcCBvZmYgbGluZS1lbmRpbmdzIGZvciBwcm9jZXNzaW5nIHRoaXMgbGluZS4KKyAgICAgICAgaWYgbGluZS5lbmRzd2l0aChDUkxGKToKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMl0KKyAgICAgICAgZWxpZiBsaW5lWy0xXSBpbiBDUkxGOgorICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorCisgICAgICAgIGxpbmVubyArPSAxCisgICAgICAgIGVuY29kZWRfbGluZSA9ICcnCisgICAgICAgIHByZXYgPSBOb25lCisgICAgICAgIGxpbmVsZW4gPSBsZW4obGluZSkKKyAgICAgICAgIyBOb3cgd2UgbmVlZCB0byBleGFtaW5lIGV2ZXJ5IGNoYXJhY3RlciB0byBzZWUgaWYgaXQgbmVlZHMgdG8gYmUKKyAgICAgICAgIyBxdW9wcmkgZW5jb2RlZC4gIEJBVzogYWdhaW4sIHN0cmluZyBjb25jYXRlbmF0aW9uIGlzIGluZWZmaWNpZW50LgorICAgICAgICBmb3IgaiBpbiByYW5nZShsaW5lbGVuKToKKyAgICAgICAgICAgIGMgPSBsaW5lW2pdCisgICAgICAgICAgICBwcmV2ID0gYworICAgICAgICAgICAgaWYgYnFyZS5tYXRjaChjKToKKyAgICAgICAgICAgICAgICBjID0gcXVvdGUoYykKKyAgICAgICAgICAgIGVsaWYgaisxID09IGxpbmVsZW46CisgICAgICAgICAgICAgICAgIyBDaGVjayBmb3Igd2hpdGVzcGFjZSBhdCBlbmQgb2YgbGluZTsgc3BlY2lhbCBjYXNlCisgICAgICAgICAgICAgICAgaWYgYyBub3QgaW4gJyBcdCc6CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfbGluZSArPSBjCisgICAgICAgICAgICAgICAgcHJldiA9IGMKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBDaGVjayB0byBzZWUgdG8gc2VlIGlmIHRoZSBsaW5lIGhhcyByZWFjaGVkIGl0cyBtYXhpbXVtIGxlbmd0aAorICAgICAgICAgICAgaWYgbGVuKGVuY29kZWRfbGluZSkgKyBsZW4oYykgPj0gbWF4bGluZWxlbjoKKyAgICAgICAgICAgICAgICBlbmNvZGVkX2JvZHkgKz0gZW5jb2RlZF9saW5lICsgJz0nICsgZW9sCisgICAgICAgICAgICAgICAgZW5jb2RlZF9saW5lID0gJycKKyAgICAgICAgICAgIGVuY29kZWRfbGluZSArPSBjCisgICAgICAgICMgTm93IGF0IGVuZCBvZiBsaW5lLi4KKyAgICAgICAgaWYgcHJldiBhbmQgcHJldiBpbiAnIFx0JzoKKyAgICAgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciB3aGl0ZXNwYWNlIGF0IGVuZCBvZiBmaWxlCisgICAgICAgICAgICBpZiBsaW5lbm8gKyAxID09IGxlbihsaW5lcyk6CisgICAgICAgICAgICAgICAgcHJldiA9IHF1b3RlKHByZXYpCisgICAgICAgICAgICAgICAgaWYgbGVuKGVuY29kZWRfbGluZSkgKyBsZW4ocHJldikgPiBtYXhsaW5lbGVuOgorICAgICAgICAgICAgICAgICAgICBlbmNvZGVkX2JvZHkgKz0gZW5jb2RlZF9saW5lICsgJz0nICsgZW9sICsgcHJldgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfYm9keSArPSBlbmNvZGVkX2xpbmUgKyBwcmV2CisgICAgICAgICAgICAjIEp1c3Qgbm9ybWFsIHdoaXRlc3BhY2UgYXQgZW5kIG9mIGxpbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW5jb2RlZF9ib2R5ICs9IGVuY29kZWRfbGluZSArIHByZXYgKyAnPScgKyBlb2wKKyAgICAgICAgICAgIGVuY29kZWRfbGluZSA9ICcnCisgICAgICAgICMgTm93IGxvb2sgYXQgdGhlIGxpbmUgd2UganVzdCBmaW5pc2hlZCBhbmQgaXQgaGFzIGEgbGluZSBlbmRpbmcsIHdlCisgICAgICAgICMgbmVlZCB0byBhZGQgZW9sIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuCisgICAgICAgIGlmIGxpbmVzW2xpbmVub10uZW5kc3dpdGgoQ1JMRikgb3IgbGluZXNbbGluZW5vXVstMV0gaW4gQ1JMRjoKKyAgICAgICAgICAgIGVuY29kZWRfYm9keSArPSBlbmNvZGVkX2xpbmUgKyBlb2wKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVuY29kZWRfYm9keSArPSBlbmNvZGVkX2xpbmUKKyAgICAgICAgZW5jb2RlZF9saW5lID0gJycKKyAgICByZXR1cm4gZW5jb2RlZF9ib2R5CisKKworIyBGb3IgY29udmVuaWVuY2UgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHcvIHN0YW5kYXJkIGJhc2U2NCBtb2R1bGUKK2JvZHlfZW5jb2RlID0gZW5jb2RlCitlbmNvZGVzdHJpbmcgPSBlbmNvZGUKKworCisMCisjIEJBVzogSSdtIG5vdCBzdXJlIGlmIHRoZSBpbnRlbnQgd2FzIGZvciB0aGUgc2lnbmF0dXJlIG9mIHRoaXMgZnVuY3Rpb24gdG8gYmUKKyMgdGhlIHNhbWUgYXMgYmFzZTY0TUlNRS5kZWNvZGUoKSBvciBub3QuLi4KK2RlZiBkZWNvZGUoZW5jb2RlZCwgZW9sPU5MKToKKyAgICAiIiJEZWNvZGUgYSBxdW90ZWQtcHJpbnRhYmxlIHN0cmluZy4KKworICAgIExpbmVzIGFyZSBzZXBhcmF0ZWQgd2l0aCBlb2wsIHdoaWNoIGRlZmF1bHRzIHRvIFxcbi4KKyAgICAiIiIKKyAgICBpZiBub3QgZW5jb2RlZDoKKyAgICAgICAgcmV0dXJuIGVuY29kZWQKKyAgICAjIEJBVzogc2VlIGNvbW1lbnQgaW4gZW5jb2RlKCkgYWJvdmUuICBBZ2Fpbiwgd2UncmUgYnVpbGRpbmcgdXAgdGhlCisgICAgIyBkZWNvZGVkIHN0cmluZyB3aXRoIHN0cmluZyBjb25jYXRlbmF0aW9uLCB3aGljaCBjb3VsZCBiZSBkb25lIG11Y2ggbW9yZQorICAgICMgZWZmaWNpZW50bHkuCisgICAgZGVjb2RlZCA9ICcnCisKKyAgICBmb3IgbGluZSBpbiBlbmNvZGVkLnNwbGl0bGluZXMoKToKKyAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBkZWNvZGVkICs9IGVvbAorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpID0gMAorICAgICAgICBuID0gbGVuKGxpbmUpCisgICAgICAgIHdoaWxlIGkgPCBuOgorICAgICAgICAgICAgYyA9IGxpbmVbaV0KKyAgICAgICAgICAgIGlmIGMgIT0gJz0nOgorICAgICAgICAgICAgICAgIGRlY29kZWQgKz0gYworICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgIyBPdGhlcndpc2UsIGMgPT0gIj0iLiAgQXJlIHdlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmU/ICBJZiBzbywgYWRkCisgICAgICAgICAgICAjIGEgc29mdCBsaW5lIGJyZWFrLgorICAgICAgICAgICAgZWxpZiBpKzEgPT0gbjoKKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBEZWNvZGUgaWYgaW4gZm9ybSA9QUIKKyAgICAgICAgICAgIGVsaWYgaSsyIDwgbiBhbmQgbGluZVtpKzFdIGluIGhleGRpZ2l0cyBhbmQgbGluZVtpKzJdIGluIGhleGRpZ2l0czoKKyAgICAgICAgICAgICAgICBkZWNvZGVkICs9IHVucXVvdGUobGluZVtpOmkrM10pCisgICAgICAgICAgICAgICAgaSArPSAzCisgICAgICAgICAgICAjIE90aGVyd2lzZSwgbm90IGluIGZvcm0gPUFCLCBwYXNzIGxpdGVyYWxseQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWNvZGVkICs9IGMKKyAgICAgICAgICAgICAgICBpICs9IDEKKworICAgICAgICAgICAgaWYgaSA9PSBuOgorICAgICAgICAgICAgICAgIGRlY29kZWQgKz0gZW9sCisgICAgIyBTcGVjaWFsIGNhc2UgaWYgb3JpZ2luYWwgc3RyaW5nIGRpZCBub3QgZW5kIHdpdGggZW9sCisgICAgaWYgbm90IGVuY29kZWQuZW5kc3dpdGgoZW9sKSBhbmQgZGVjb2RlZC5lbmRzd2l0aChlb2wpOgorICAgICAgICBkZWNvZGVkID0gZGVjb2RlZFs6LTFdCisgICAgcmV0dXJuIGRlY29kZWQKKworCisjIEZvciBjb252ZW5pZW5jZSBhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdy8gc3RhbmRhcmQgYmFzZTY0IG1vZHVsZQorYm9keV9kZWNvZGUgPSBkZWNvZGUKK2RlY29kZXN0cmluZyA9IGRlY29kZQorCisKKwwKK2RlZiBfdW5xdW90ZV9tYXRjaChtYXRjaCk6CisgICAgIiIiVHVybiBhIG1hdGNoIGluIHRoZSBmb3JtID1BQiB0byB0aGUgQVNDSUkgY2hhcmFjdGVyIHdpdGggdmFsdWUgMHhhYiIiIgorICAgIHMgPSBtYXRjaC5ncm91cCgwKQorICAgIHJldHVybiB1bnF1b3RlKHMpCisKKworIyBIZWFkZXIgZGVjb2RpbmcgaXMgZG9uZSBhIGJpdCBkaWZmZXJlbnRseQorZGVmIGhlYWRlcl9kZWNvZGUocyk6CisgICAgIiIiRGVjb2RlIGEgc3RyaW5nIGVuY29kZWQgd2l0aCBSRkMgMjA0NSBNSU1FIGhlYWRlciBgUScgZW5jb2RpbmcuCisKKyAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBhcnNlIGEgZnVsbCBNSU1FIGhlYWRlciB2YWx1ZSBlbmNvZGVkIHdpdGgKKyAgICBxdW90ZWQtcHJpbnRhYmxlIChsaWtlID0/aXNvLTg4OTUtMT9xP0hlbGxvX1dvcmxkPz0pIC0tIHBsZWFzZSB1c2UKKyAgICB0aGUgaGlnaCBsZXZlbCBlbWFpbC5oZWFkZXIgY2xhc3MgZm9yIHRoYXQgZnVuY3Rpb25hbGl0eS4KKyAgICAiIiIKKyAgICBzID0gcy5yZXBsYWNlKCdfJywgJyAnKQorICAgIHJldHVybiByZS5zdWIocic9W2EtZkEtRjAtOV17Mn0nLCBfdW5xdW90ZV9tYXRjaCwgcykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvcXVvcHJpbWltZS5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL3F1b3ByaW1pbWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZjBmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3F1b3ByaW1pbWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvcXVvcHJpbWltZS5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL3F1b3ByaW1pbWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZjBmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3F1b3ByaW1pbWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODJhNDVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODJhNDVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9QeUJhbm5lcjA0OC5naWYgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9QeUJhbm5lcjA0OC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE1Yzg3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL1B5QmFubmVyMDQ4LmdpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9hdWRpb3Rlc3QuYXUgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9hdWRpb3Rlc3QuYXUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2YjA1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL2F1ZGlvdGVzdC5hdQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDEudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzAxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTMzYmNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzAxLnR4dApAQCAtMCwwICsxLDE5IEBACitSZXR1cm4tUGF0aDogPGJiYkB6enoub3JnPgorRGVsaXZlcmVkLVRvOiBiYmJAenp6Lm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwuenp6Lm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorCWlkIDI3Q0VBRDM4Q0M7IEZyaSwgIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK01lc3NhZ2UtSUQ6IDwxNTA5MC42MTMwNC4xMTA5MjkuNDU2ODRAYWFhLnp6ei5vcmc+CitGcm9tOiBiYmJAZGRkLmNvbSAoSm9obiBYLiBEb2UpCitUbzogYmJiQHp6ei5vcmcKK1N1YmplY3Q6IFRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UKK0RhdGU6IEZyaSwgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMAorCisKK0hpLAorCitEbyB5b3UgbGlrZSB0aGlzIG1lc3NhZ2U/CisKKy1NZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzAyLnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmMjQ4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wMi50eHQKQEAgLTAsMCArMSwxMzUgQEAKK01JTUUtdmVyc2lvbjogMS4wCitGcm9tOiBwcHAtcmVxdWVzdEB6enoub3JnCitTZW5kZXI6IHBwcC1hZG1pbkB6enoub3JnCitUbzogcHBwQHp6ei5vcmcKK1N1YmplY3Q6IFBwcCBkaWdlc3QsIFZvbCAxICMyIC0gNSBtc2dzCitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDIwOjE4OjAwIC0wNDAwIChFRFQpCitYLU1haWxlcjogTWFpbG1hbiB2Mi4wLjQKK1gtTWFpbG1hbi1WZXJzaW9uOiAyLjAuNAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSIxOTIuMTY4LjEuMi44ODkuMzI2MTQuOTg3ODEyMjU1LjUwMC4yMTgxNCIKKworLS0xOTIuMTY4LjEuMi44ODkuMzI2MTQuOTg3ODEyMjU1LjUwMC4yMTgxNAorQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LWRlc2NyaXB0aW9uOiBNYXN0aGVhZCAoUHBwIGRpZ2VzdCwgVm9sIDEgIzIpCisKK1NlbmQgUHBwIG1haWxpbmcgbGlzdCBzdWJtaXNzaW9ucyB0bworCXBwcEB6enoub3JnCisKK1RvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB2aWEgdGhlIFdvcmxkIFdpZGUgV2ViLCB2aXNpdAorCWh0dHA6Ly93d3cuenp6Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3BwcAorb3IsIHZpYSBlbWFpbCwgc2VuZCBhIG1lc3NhZ2Ugd2l0aCBzdWJqZWN0IG9yIGJvZHkgJ2hlbHAnIHRvCisJcHBwLXJlcXVlc3RAenp6Lm9yZworCitZb3UgY2FuIHJlYWNoIHRoZSBwZXJzb24gbWFuYWdpbmcgdGhlIGxpc3QgYXQKKwlwcHAtYWRtaW5Aenp6Lm9yZworCitXaGVuIHJlcGx5aW5nLCBwbGVhc2UgZWRpdCB5b3VyIFN1YmplY3QgbGluZSBzbyBpdCBpcyBtb3JlIHNwZWNpZmljCit0aGFuICJSZTogQ29udGVudHMgb2YgUHBwIGRpZ2VzdC4uLiIKKworCistLTE5Mi4xNjguMS4yLjg4OS4zMjYxNC45ODc4MTIyNTUuNTAwLjIxODE0CitDb250ZW50LXR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtZGVzY3JpcHRpb246IFRvZGF5J3MgVG9waWNzICg1IG1zZ3MpCisKK1RvZGF5J3MgVG9waWNzOgorCisgICAxLiB0ZXN0aW5nICMxIChCYXJyeSBBLiBXYXJzYXcpCisgICAyLiB0ZXN0aW5nICMyIChCYXJyeSBBLiBXYXJzYXcpCisgICAzLiB0ZXN0aW5nICMzIChCYXJyeSBBLiBXYXJzYXcpCisgICA0LiB0ZXN0aW5nICM0IChCYXJyeSBBLiBXYXJzYXcpCisgICA1LiB0ZXN0aW5nICM1IChCYXJyeSBBLiBXYXJzYXcpCisKKy0tMTkyLjE2OC4xLjIuODg5LjMyNjE0Ljk4NzgxMjI1NS41MDAuMjE4MTQKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2RpZ2VzdDsgYm91bmRhcnk9Il9fLS1fXy0tIgorCistLV9fLS1fXy0tCisKK01lc3NhZ2U6IDEKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAyMDoxNjoxMyAtMDQwMAorVG86IHBwcEB6enoub3JnCitGcm9tOiBiYXJyeUBkaWdpY29vbC5jb20gKEJhcnJ5IEEuIFdhcnNhdykKK1N1YmplY3Q6IFtQcHBdIHRlc3RpbmcgIzEKK1ByZWNlZGVuY2U6IGJ1bGsKKworCitoZWxsbworCisKKy0tX18tLV9fLS0KKworTWVzc2FnZTogMgorRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAyMDoxNjoyMSAtMDQwMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitUbzogcHBwQHp6ei5vcmcKK0Zyb206IGJhcnJ5QGRpZ2ljb29sLmNvbSAoQmFycnkgQS4gV2Fyc2F3KQorUHJlY2VkZW5jZTogYnVsaworCisKK2hlbGxvCisKKworLS1fXy0tX18tLQorCitNZXNzYWdlOiAzCitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDIwOjE2OjI1IC0wNDAwCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK1RvOiBwcHBAenp6Lm9yZworRnJvbTogYmFycnlAZGlnaWNvb2wuY29tIChCYXJyeSBBLiBXYXJzYXcpCitTdWJqZWN0OiBbUHBwXSB0ZXN0aW5nICMzCitQcmVjZWRlbmNlOiBidWxrCisKKworaGVsbG8KKworCistLV9fLS1fXy0tCisKK01lc3NhZ2U6IDQKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMjA6MTY6MjggLTA0MDAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorVG86IHBwcEB6enoub3JnCitGcm9tOiBiYXJyeUBkaWdpY29vbC5jb20gKEJhcnJ5IEEuIFdhcnNhdykKK1N1YmplY3Q6IFtQcHBdIHRlc3RpbmcgIzQKK1ByZWNlZGVuY2U6IGJ1bGsKKworCitoZWxsbworCisKKy0tX18tLV9fLS0KKworTWVzc2FnZTogNQorRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAyMDoxNjozMiAtMDQwMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitUbzogcHBwQHp6ei5vcmcKK0Zyb206IGJhcnJ5QGRpZ2ljb29sLmNvbSAoQmFycnkgQS4gV2Fyc2F3KQorU3ViamVjdDogW1BwcF0gdGVzdGluZyAjNQorUHJlY2VkZW5jZTogYnVsaworCisKK2hlbGxvCisKKworCisKKy0tX18tLV9fLS0tLQorLS0xOTIuMTY4LjEuMi44ODkuMzI2MTQuOTg3ODEyMjU1LjUwMC4yMTgxNAorQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LWRlc2NyaXB0aW9uOiBEaWdlc3QgRm9vdGVyCisKK19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitQcHAgbWFpbGluZyBsaXN0CitQcHBAenp6Lm9yZworaHR0cDovL3d3dy56enoub3JnL21haWxtYW4vbGlzdGluZm8vcHBwCisKKworLS0xOTIuMTY4LjEuMi44ODkuMzI2MTQuOTg3ODEyMjU1LjUwMC4yMTgxNC0tCisKK0VuZCBvZiBQcHAgRGlnZXN0CisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wMy50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NDhlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDMudHh0CkBAIC0wLDAgKzEsMTYgQEAKK1JldHVybi1QYXRoOiA8YmJiQHp6ei5vcmc+CitEZWxpdmVyZWQtVG86IGJiYkB6enoub3JnCitSZWNlaXZlZDogYnkgbWFpbC56enoub3JnIChQb3N0Zml4LCBmcm9tIHVzZXJpZCA4ODkpCisJaWQgMjdDRUFEMzhDQzsgRnJpLCAgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMCAoRURUKQorTWVzc2FnZS1JRDogPDE1MDkwLjYxMzA0LjExMDkyOS40NTY4NEBhYWEuenp6Lm9yZz4KK0Zyb206IGJiYkBkZGQuY29tIChKb2huIFguIERvZSkKK1RvOiBiYmJAenp6Lm9yZworU3ViamVjdDogVGhpcyBpcyBhIHRlc3QgbWVzc2FnZQorRGF0ZTogRnJpLCA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwCisKKworSGksCisKK0RvIHlvdSBsaWtlIHRoaXMgbWVzc2FnZT8KKworLU1lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDQudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzA0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjYzM2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzA0LnR4dApAQCAtMCwwICsxLDM3IEBACitSZXR1cm4tUGF0aDogPGJhcnJ5QHB5dGhvbi5vcmc+CitEZWxpdmVyZWQtVG86IGJhcnJ5QHB5dGhvbi5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnB5dGhvbi5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKKwlpZCBDMkJGMEQzN0M2OyBUdWUsIDExIFNlcCAyMDAxIDAwOjA1OjA1IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJoOTBWSUlJS214IgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MjYxLjM2MjA5LjM1ODg0Ni4xMTg2NzRAYW50aGVtLnB5dGhvbi5vcmc+CitGcm9tOiBiYXJyeUBweXRob24ub3JnIChCYXJyeSBBLiBXYXJzYXcpCitUbzogYmFycnlAcHl0aG9uLm9yZworU3ViamVjdDogYSBzaW1wbGUgbXVsdGlwYXJ0CitEYXRlOiBUdWUsIDExIFNlcCAyMDAxIDAwOjA1OjA1IC0wNDAwCitYLU1haWxlcjogVk0gNi45NSB1bmRlciAyMS40IChwYXRjaCA0KSAiQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2UiIFhFbWFjcyBMdWNpZAorWC1BdHRyaWJ1dGlvbjogQkFXCitYLU9ibGlxdWUtU3RyYXRlZ3k6IE1ha2UgYSBkb29yIGludG8gYSB3aW5kb3cKKworCistLWg5MFZJSUlLbXgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworCWZpbGVuYW1lPSJtc2cudHh0IgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCithIHNpbXBsZSBraW5kIG9mIG1pcnJvcgordG8gcmVmbGVjdCB1cG9uIG91ciBvd24KKworLS1oOTBWSUlJS214CitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKKwlmaWxlbmFtZT0ibXNnLnR4dCIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworYSBzaW1wbGUga2luZCBvZiBtaXJyb3IKK3RvIHJlZmxlY3QgdXBvbiBvdXIgb3duCisKKy0taDkwVklJSUtteC0tCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wNS50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDVlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDUudHh0CkBAIC0wLDAgKzEsMjggQEAKK0Zyb206IGZvbworU3ViamVjdDogYmFyCitUbzogYmF6CitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVwb3J0OyByZXBvcnQtdHlwZT1kZWxpdmVyeS1zdGF0dXM7CisJYm91bmRhcnk9IkQxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20iCitNZXNzYWdlLUlkOiA8MjAwMTA4MDMxNjI4MTAuMENBOEFBN0FDQ0BtYWlsLmV4YW1wbGUuY29tPgorCitUaGlzIGlzIGEgTUlNRS1lbmNhcHN1bGF0ZWQgbWVzc2FnZS4KKworLS1EMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworWWFkZGEgeWFkZGEgeWFkZGEKKworLS1EMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tCisKK1lhZGRhIHlhZGRhIHlhZGRhCisKKy0tRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbQorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorCitGcm9tOiBub2JvZHlAcHl0aG9uLm9yZworCitZYWRkYSB5YWRkYSB5YWRkYQorCistLUQxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20tLQorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDYudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzA2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWYzYTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzA2LnR4dApAQCAtMCwwICsxLDMzIEBACitSZXR1cm4tUGF0aDogPGJhcnJ5QHB5dGhvbi5vcmc+CitEZWxpdmVyZWQtVG86IGJhcnJ5QHB5dGhvbi5vcmcKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCitDb250ZW50LURlc2NyaXB0aW9uOiBmb3J3YXJkZWQgbWVzc2FnZQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MjY1Ljk0ODIuNjQxMzM4LjU1NTM1MkBweXRob24ub3JnPgorRnJvbTogYmFycnlAem9wZS5jb20gKEJhcnJ5IEEuIFdhcnNhdykKK1NlbmRlcjogYmFycnlAcHl0aG9uLm9yZworVG86IGJhcnJ5QHB5dGhvbi5vcmcKK1N1YmplY3Q6IGZvcndhcmRlZCBtZXNzYWdlIGZyb20gQmFycnkgQS4gV2Fyc2F3CitEYXRlOiBUaHUsIDEzIFNlcCAyMDAxIDE3OjI4OjQyIC0wNDAwCitYLU1haWxlcjogVk0gNi45NSB1bmRlciAyMS40IChwYXRjaCA0KSAiQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2UiIFhFbWFjcyBMdWNpZAorWC1BdHRyaWJ1dGlvbjogQkFXCitYLU9ibGlxdWUtU3RyYXRlZ3k6IEJlIGRpcnR5CitYLVVybDogaHR0cDovL2JhcnJ5Lndvb3oub3JnCisKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK1JldHVybi1QYXRoOiA8YmFycnlAcHl0aG9uLm9yZz4KK0RlbGl2ZXJlZC1UbzogYmFycnlAcHl0aG9uLm9yZworTWVzc2FnZS1JRDogPDE1MjY1Ljk0NjguNzEzNTMwLjk4NDQxQHB5dGhvbi5vcmc+CitGcm9tOiBiYXJyeUB6b3BlLmNvbSAoQmFycnkgQS4gV2Fyc2F3KQorU2VuZGVyOiBiYXJyeUBweXRob24ub3JnCitUbzogYmFycnlAcHl0aG9uLm9yZworU3ViamVjdDogdGVzdGluZworRGF0ZTogVGh1LCAxMyBTZXAgMjAwMSAxNzoyODoyOCAtMDQwMAorWC1NYWlsZXI6IFZNIDYuOTUgdW5kZXIgMjEuNCAocGF0Y2ggNCkgIkFydGlmaWNpYWwgSW50ZWxsaWdlbmNlIiBYRW1hY3MgTHVjaWQKK1gtQXR0cmlidXRpb246IEJBVworWC1PYmxpcXVlLVN0cmF0ZWd5OiBTcGVjdHJ1bSBhbmFseXNpcworWC1Vcmw6IGh0dHA6Ly9iYXJyeS53b296Lm9yZworCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wNy50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMWYzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDcudHh0CkBAIC0wLDAgKzEsODMgQEAKK01JTUUtVmVyc2lvbjogMS4wCitGcm9tOiBCYXJyeSA8YmFycnlAZGlnaWNvb2wuY29tPgorVG86IERpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+CitTdWJqZWN0OiBIZXJlIGlzIHlvdXIgZGluZ3VzIGZpc2gKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMTk6MzU6MDIgLTA0MDAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCisKK0hpIHRoZXJlLAorCitUaGlzIGlzIHRoZSBkaW5ndXMgZmlzaC4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiBpbWFnZS9naWY7IG5hbWU9ImRpbmd1c2Zpc2guZ2lmIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0Citjb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iZGluZ3VzZmlzaC5naWYiCisKK1IwbEdPRGRoQUFFQUFmQUFBUC8vL3dBQUFDd0FBQUFBQUFFQUFRQUMvb1NQcWN2dEQ2T2N0TnFMczk2OCt3K0c0a2lXNW9tbTZzcTIKKzdndkg4a3pYOW8zbitzNzMvZzhNQ29mRW92R0lUR0lDVEtieUNWMEZETk9vOVNxcFFxcE9ySmZYelRRajJ2RDNUR3RxTCtOdEdRMmYKK3FUWG14enVPZDdXWGRjYzlEeWpVNTNld0ZuaTRzMGZHaGRpWWFFaEdCZWxJQ1ROb1YxajVOVW5GY3JtVXFlbWpOaWZKVldwYU9xYUkKK29GcTNTc3Bac1NyYUU3c0hxM2pyMU1acVd2aTY2MnZ4VjR0RCtwdktXNmFMRE9DTHl1cjhQRHdiYW55RGVxME4zRGN0YlFZZUxEdlIKK1JZNnQ5NW02VUIwZDNtd0lyVjdlMlZHTnZqamZmdWtlSnA0dzdGNjVLZWNHRnNUSFFHQXlnT3JncldzMWp0MjhSYzg4S0VTWWNHTEEKKy9vYnZUa0g2cCtDaW5XSmlKbUlNcVhHUXdIL3k0cWswU1lqZ1FUY3pUM2FqS1pHZnVJMHVKNGtrVkkvRFQ1czMvZWpreEkwYVQ0WSsKK1lUWWdXYkltVWFYazlubExtblNoMXFKaUpGbDBPcFVxUks0b095N055UlF0SFdvZmhvWVZ4a3dXWEtVU24wWXNTK2ZVVjZsaHFmWWIKKzZheWQzWjVxUWRHMUI3YnZRemFKandVVjJsaXhNVVo3SlZzT2xmaldWci8zTkIvdUZ2bnlTQk42RGNiNnJHd2FSTTN3c29ybXc1Y0MKK005TnhXeS9iV2R1ZnVkQ3Z5OGJPQWpYalZWd3RhL3VPMjFzRTVSSEJDek5GWHRncTlPUnRINGVZalZQNFlyeW8wMjZudmtGbUNleUEKK0IyOWVmVjZyYXZDTUs1SndXZDU4OTdRcng3bGwzOG82aUhEWi9yWFBSLy9mZWV2aEY0bDd3alVHWDN4cTFlZVJmTTRSU0pHQklWMUQKK3oxZ0tQa2ZXYWczbVZCVnZ2YTFSbFg1YkFKVFBSLzJZcU50dy9Ga0lZWUVpL3BJWmlBZHBjeHBvSHRtbllZb1p0dmhVZnR6ZHg1WlgKK0pTS0RXNDA1emtHY1p6ekdaNktFdjRGSTIyNG9EbWlqbEVmK3hwNk1KSzVvalkvQVNlVlVSK3dzS1J1SitYRlo1bzdaZUVpbWU4dDEKK291VXNVNllqRjVadFVpaGhrR2ZDZEZRTFdRRkozVVh4bUVsZmhRblIrZUNkY0Ria0ZacDZ2VFJtajU2QXBDaWhuNVFHcGFUb05abVIKK24zTlZTcFpjUXBaMktFT051c2FpQ3NLQXVnMHdrUWJKU0ZPK1BUU2puZUd4T3VGalBsVWszb3ZXdmRJZXJqVWc5WkdJT3RHcS9xZVgKK2VDWXJyQ1grMVVQc2dUS0dHUlNiemQ1cTE1NmQvZ3BmYkp4ZTY2ZUQ1aVFLclhqN1JHZ3J1R3hzNjJxZWJCSFVLUzMyQ0tsdUNpcVoKK3FoK3BtZWhtRWI3MW5vQVVvZTVlOVptMTdTNzc3M1YxMHBqcnRHNENtdXVyQ1YvbjZ6TEs1dHVyV05ocU92Rlhiamhack1EMFloS2UKK3dSMHpPeXV2c2g2TVdyR29JdXp2eVd1NXkxV0lGQXFtSnNlbHlweFhoNmRLTE5PS0VCOThMODhiUzJya05xcWxLekNOSnA5YzBHMGoKK0d6aDBpUnJDYkhTWG1QUjY0M1FTKzRyV2hnRm1uU2JTdVhDalMweEFPV2tVMlVkTHF5dVVOZkhTRmRVb3V5M2JtNWk1R25ETTN0RzgKK2RvSjRyNXRxdTNwUGJSU1ZmdnM4dUp6ZU5YaHAzbjRqL3RaNDJTd0g3ZWFXVVVPamMzcUZWOTQ1M1VIVFhaZmNMSCtPZU5zNWczNngKK2xCbkh2VG03RWJNYkxldWFMbmNhbzh2V0NYaW1mbzFvKzg0M0FrNnk0Q2hOZUdudHZBWXZmTEs0ZXptb3lOSWJOQ0xUQ1hPOVpWM0EKK0U4L3M4OFJjelB6RHdJNE9iN1haeWw3KzlNaWJhbjI5aCt0SlpQckUyMXdndkJwaERmcnJmUGRDVFBLSkQveTk4TDFyWndIY1Y2SnEKK1phYjBtZXRwdU5JWC9xQUZQb3oxNzFXVWFVYjRIQWhCU3pIdUhmanpIYjNraGEvMkNjdGlzL09SQXJWSE5ZZkZ5WVJIMnBZSVJ6aWMKK2lzVk9mUFdEMWI2bVJUcXBDUkJvenpvZjZVWlZ2RlhSeFdJcjNHR3JFdmlHWWd5UE1mYWhoZWlTYUxzLzlRZUZ1N29aL25kU1k4REQKK3lhOXgrdVBlZCs3bXhOMkl6SUlTQk9NTEZZV1ZxQzNQZXcxVDJuRnV1Q2l3WlM1L3Y2SUkxMGk0dDFPSmNVSDJVOXp4S29kSHNHR3YKK09hK3prdk5VWVVPYS9UQ0NSdXRGOU16RHdkbFVNSkFEVENHU2JEUTVPVjRQVGFtRG9QRWk2RWNjL1JGNVJXd2tjZFNYdlNPYURXU24KK0k5TGx2dWJGVFFwdWM2SktYTGNLZWIreGRiS1JCbndSRWVtWHlqZzZNRTY1YUppT3VCZ3JrdHp5a2ZQTEpCS1I5Q2xNYXZKNjIvRmYKK0JsTkl5b2Q5eVg5d2NTWGV4blhGcHZrcmJYazY0eHN4NURiN3dYS1A1ZlNnc3Z3SU1NLzk2MzFWTEJma210YkhSWHBxbXRlaTUyaEcKK3BVd1NsbytCQVNRb2VJTERPQmdSRUVDeEJCaDUvaVltTnNROWRJdjUrT0krK1FrcWRzSlBjM3V5a3o1ZmtNK09yYWVla2NRRjdYNG4KK0I1UzY3emE1VTk2N1Btb29HUWhVWGZGN2FmWHlDRDdPTmRSZTE3UW9nWWpWeDM4dUx3dHJTNm5oVG5tMTVMUVVudTlFMnVLNkNOSS8KKzFIT0FCajBFU3dPanV0NEZFcEZRcGROQW00SzJMSG5EV0hOY21LQjJpb0tCb2d5c1ZadE1PMm5TeFVkWjhZazJrSmM3VVJpb0xWSTAKK1lnbXRJd1pqNExvZUtlbWduT25iVWRHbnpaNE9hNnNjcWlvbEJHcVM2UmdXTkx1MFJNaGNhRTZyaGhVNGhpdXFGWFBBRzhmR3dUUFcKK0ZLZUxNdGRWbVhMU3M1WUpHRi9ZZVZtN3JSRU1sWTNVWUUreUN4YmFNWFg4eTE1bTV6VkhxNkdPS0RNeW56SUkvamRVSGR5VnFJeTAKK2lmWDIrci9FZ3RaY3ZSelNiNzJnVTl1aTg3TTJWZWNqS2lsZFcvYUZxYVloS29yeVVqZkIvZzRxdHlWdWM2MHhGREdtQ3h3alcrcXUKK3pqdXdsMkdrT1duNjYrM1FpaUVjdHZkMDRPVnZjQ1Z6amdUN2xya3ZqVkdLS0htbWxEVUtvd1NlaWtiNWtLL21KUmV1V094T054K3MKK1VMc2wrTHFiMENWbjBTclZ5SjZ3dDR0NnlUZVNDYWZoUGhBZjBPWG42TDYwVU14aUxvbEZBdG1OMzVTMk9iMWxacFExci9uMFFiNUQKK29RMXpKaVJWRGdGOE4zUThUWWZiaTNEeVdDeTNsVDFueHlCczZGVDNTMkdPeldSbHh3S3ZsUlAwUlBKQTlTanhFeTBVb0Vua0ErTTQKK2NuekxNSnJCR1dMRkVhYVViNWx2cHFicS9sb09hVTUrREZ1SFB4bzgyL09adU04RlhHM29WTlpodFdwTXBiLzBYdTVtL0xmTGhIWlEKKzd5dVZJME1xWjdORTQzaW1DOGpIM0l3R1psYlBtMHhrSllzNysyVTQ4aFhUc0ZTTXFnR0R2YWkwa0x4eXluS05UL3dhaitxMWMxdHoKK0dqT3BQQmdkQ1NxM1VLWnhDU3NxRklZK082SmJBV0dXY1YxcHdxTHlqNXNHcUNGMXhiMUYzdmFyVVdxckp2NmNOM1ByVVh6aWp0ZloKK0ZzaHBCTDNYd3I0R0lQdlUyTjhFanJKZ1MxemwyMXJiWFFNWGVYYzVqakZ5cmhwQ3ppalN2L1JRdHlQU3pIQ0ZNaGxNRTk1ZkhnbHQKK3BSc1grZGZTUWpVZUhBbHBXeko1aU9vNzlMZG5heGFpNmJYVGNHTzNmcDA3cmk3SExFbVhYUGxZaThidi9xVnh2TmNkcmE2bTdSbGIKKzZKQlRiNWZkNjZWaEZSakdBcmgybjdSMXJEVzRQNU5PVDlLMEkxODNUMnNjWWtlWjNxL1ZGeUxiMDlVOWFqelhCUzhLZ2toYzRtQlMKK2tZWTljeTNWeTlsVW51TkpIOEhHSWNsVWlsd25CdGpVT0gwZ3RlR09aNGMvWE5yaFhMU1lEeXhmbkQ4ejFwRHk3cllSdkRvbGhuYmUKK1VNenhDWlVzNDBzNnM3VUl2Qm5MZ2MwK3ZLdU9rSVhlT3JEeW1scCtaeHJhNE1aTEJiVnJxRC9qVEo1OTdwRG1udzVjNCtEYnlCODgKKzlDZzlEb2RZY1N1TVpULzExNHBwdHFjL0V1VGpSUHZIL3o1c2x6STN0bHVPRUJCTHFPWExPWCswSTU5Mjl0Tzk3d2t2bC9hdEN6K3kKK3hKcmR3dGVXMkZOVy9OU21CUCtmL21hWXRWcy9iWXlCQzdPeDNqc1laSEwwNUNJckJhL25TK2IzYkhmaVltNFVlaWwxWVpaU2dBVUkKK2ZGWjFkeFVtZUEyb1FSUTNSdUdYTkdMRlY5L1hiR0ZHUFY2a2Z6azFUQkJDZCtpemM3cTFIK09ITUp3bWFCWDJJUU5ZVkFLSFllcFYKK1NTR0NlNkNuYllISEVUS0dOZTQzRUR2RmdacjBnQi9uVkhQSFo4MFZWMW9qT2lJM1hEdllJa2w0YXlvNGJ4UUlnckZYV1R2QkkwbkgKK1ZFbFdNdXcyYUxVV0NSSEhmOHltVkNIakZsSm5PU29qZmV2Q1l5eXlaREgwSWN2SGhyc25RNU8xT3NXek9OdVZWS0l4U3hpRlovdFIKK2ZLREFmNnhGVG53NE85UWlnMlZDZlcyaEpRcm1NT3VIVzBXM2RMUW1DTU8yY2NkVWQveHlmZmxIL29sVGlIWlZkR3diOG5Jd1J6U0UKK0oxNWpGbE9KdUJaQlo0Q2l5SHlkMklGeWxGbEIrSGdIaFlhYmhXT0d3WU8xWkgvT2cxZHRRbEZNazM1MkNHUlNJRlRhcG5XUUVVdE4KK2w0enY4UzBhYUNGRHlHQ0JxRFV4WllweEdIWDAxeS9KdUgxeGhuN1RPQ25OQ0k0ZUtEczVXR1g0UjQyNUY0dkYxbzNCSjR2TzBvdHEKK0kzcmltSTdqSlkxaklTcW5CeGtuQ0l2cnVGODNtRjV3TjRYN3FHTEloUjhBMlZnMHlGRVJTSVhuOVZ2M0dIeTNWai9XSWtLZGRsWWkKK3lJTXYySS9WTWpUTHBXN3B0MDVTV0laUjBSUHl4cEI0U0lVTTlsQlBHQmwwR0M3b1NFRXdSWUxlNHBKcFpZMlAwemJJMW4rT2M0NHcKK3FZM1BVbm1GMGl4alZwREQvbUo5d3BPQkdUVmdYbGFDYVppUGNJV0s1TmlLQklpUGRHYVEwVFdHdkFpRzduTWNoZFpiN1ZnZjh6TmkKK011TXl6UmR5L2xlUGU5aUM0VFJ4N1doaE9RSS9RaVNWTkFtQWEybFQvcGlGYnVoN29mSm9ZU1p6clNaMWJ2bVd3M2VOMm5LVVBWa3kKK3VQTjUvVlJmb2hSZDBWWVpvcWhLSWxVNlRYWWhKeG1QVUlsb0F3YzFiUG1IRXBhWllaT1JITmxYVUpNMDdoQVR3SFI4TUpZcWt3V1IKK1dhSWV6Rmh4U0ZsYzgvRnE4MmhFbnBlUm96ZzNVTGhocjlsQUd0VkVrQ2c1Wk5SdXVWbGVCUGFaYWRoRzBaZ2t5UG1ET1RPS3pWaU0KK1lnT2NwdWtLcVFjYmpBV1MwSWxlUTJST2pkaDZBK21kMXFXZEJSU1g3aVNZZ0ZSVHRSbUJwSmlvaWVYSmlIZkppTUdJUjlmSk9uOEkKK01TZlhZaHNwbjRvb1NhMm1TQWo0bis4Qm1nMDNmQkpab1BPSmdzVlpSeHUxb09NUlBYWVlqZHFqaWhGYUVvWnBYQlJFYW51Sm9SSTYKK2NpYkZpbnE0bmdVS2gvd1FkL0g1b2ZZQ1owSEpYUjYyb3BaRmFBVDBpRklabzRESWlVb2pramVxS2l1b1ppcktvNVkxYTdBV2NrR2EKK0JrdVlvRDVscERLNmVVczZDa0RxcEVUd2wxRXFwZmhKcFZlS3BWbDZFZ1VBQURzPQorCistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wOC50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NjMwODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDgudHh0CkBAIC0wLDAgKzEsMjQgQEAKK01JTUUtVmVyc2lvbjogMS4wCitGcm9tOiBCYXJyeSBXYXJzYXcgPGJhcnJ5QHpvcGUuY29tPgorVG86IERpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+CitTdWJqZWN0OiBMeXJpY3MKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMTk6MzU6MDIgLTA0MDAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0yIgorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0ia29pOC1yIgorCisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzA5LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wOS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1YzRjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wOS50eHQKQEAgLTAsMCArMSwyNCBAQAorTUlNRS1WZXJzaW9uOiAxLjAKK0Zyb206IEJhcnJ5IFdhcnNhdyA8YmFycnlAem9wZS5jb20+CitUbzogRGluZ3VzIExvdmVycyA8Y3JhdmluZG9nc0BjcmF2aW5kb2dzLmNvbT4KK1N1YmplY3Q6IEx5cmljcworRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAxOTozNTowMiAtMDQwMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD0iaXNvLTg4NTktMSIKKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9ImtvaTgtciIKKworCistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xMC50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTAzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTAudHh0CkBAIC0wLDAgKzEsMzkgQEAKK01JTUUtVmVyc2lvbjogMS4wCitGcm9tOiBCYXJyeSBXYXJzYXcgPGJhcnJ5QHpvcGUuY29tPgorVG86IERpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+CitTdWJqZWN0OiBMeXJpY3MKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMTk6MzU6MDIgLTA0MDAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK1RoaXMgaXMgYSA3Yml0IGVuY29kZWQgbWVzc2FnZS4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBRdW90ZWQtUHJpbnRhYmxlCisKKz1BMVRoaXMgaXMgYSBRdW90ZWQgUHJpbnRhYmxlIGVuY29kZWQgbWVzc2FnZSEKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogQmFzZTY0CisKK1ZHaHBjeUJwY3lCaElFSmhjMlUyTkNCbGJtTnZaR1ZrSUcxbGMzTmhaMlV1CisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogQmFzZTY0CisKK1ZHaHBjeUJwY3lCaElFSmhjMlUyTkNCbGJtTnZaR1ZrSUcxbGMzTmhaMlV1Q2c9PQorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMSIKKworVGhpcyBoYXMgbm8gQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogaGVhZGVyLgorCistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xMS50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmN2YxOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTEudHh0CkBAIC0wLDAgKzEsNyBAQAorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IFRoZSBlbmNsb3NpbmcgbWVzc2FnZQorCitTdWJqZWN0OiBBbiBlbmNsb3NlZCBtZXNzYWdlCisKK0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTIudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzEyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmVjOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzEyLnR4dApAQCAtMCwwICsxLDM2IEBACitNSU1FLVZlcnNpb246IDEuMAorRnJvbTogQmFycnkgV2Fyc2F3IDxiYXJyeUB6b3BlLmNvbT4KK1RvOiBEaW5ndXMgTG92ZXJzIDxjcmF2aW5kb2dzQGNyYXZpbmRvZ3MuY29tPgorU3ViamVjdDogTHlyaWNzCitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDE5OjM1OjAyIC0wNDAwCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PSJpc28tODg1OS0xIgorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQU5PVEhFUiIKKworLS1BTk9USEVSCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTIiCisKKworLS1BTk9USEVSCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTMiCisKKy0tQU5PVEhFUi0tCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJrb2k4LXIiCisKKworLS1CT1VOREFSWS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTJhLnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xMmEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NDIyNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTJhLnR4dApAQCAtMCwwICsxLDM4IEBACitNSU1FLVZlcnNpb246IDEuMAorRnJvbTogQmFycnkgV2Fyc2F3IDxiYXJyeUB6b3BlLmNvbT4KK1RvOiBEaW5ndXMgTG92ZXJzIDxjcmF2aW5kb2dzQGNyYXZpbmRvZ3MuY29tPgorU3ViamVjdDogTHlyaWNzCitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDE5OjM1OjAyIC0wNDAwCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PSJpc28tODg1OS0xIgorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQU5PVEhFUiIKKworLS1BTk9USEVSCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTIiCisKKworLS1BTk9USEVSCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTMiCisKKworLS1BTk9USEVSLS0KKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0ia29pOC1yIgorCisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzEzLnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2ZDUyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xMy50eHQKQEAgLTAsMCArMSw5NCBAQAorTUlNRS1WZXJzaW9uOiAxLjAKK0Zyb206IEJhcnJ5IDxiYXJyeUBkaWdpY29vbC5jb20+CitUbzogRGluZ3VzIExvdmVycyA8Y3JhdmluZG9nc0BjcmF2aW5kb2dzLmNvbT4KK1N1YmplY3Q6IEhlcmUgaXMgeW91ciBkaW5ndXMgZmlzaAorRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAxOTozNTowMiAtMDQwMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJPVVRFUiIKKworLS1PVVRFUgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKKworQSB0ZXh0L3BsYWluIHBhcnQKKworLS1PVVRFUgorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PUJPVU5EQVJZCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKKworSGkgdGhlcmUsCisKK1RoaXMgaXMgdGhlIGRpbmd1cyBmaXNoLgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IGltYWdlL2dpZjsgbmFtZT0iZGluZ3VzZmlzaC5naWYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKK2NvbnRlbnQtZGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJkaW5ndXNmaXNoLmdpZiIKKworUjBsR09EZGhBQUVBQWZBQUFQLy8vd0FBQUN3QUFBQUFBQUVBQVFBQy9vU1BxY3Z0RDZPY3ROcUxzOTY4K3crRzRraVc1b21tNnNxMgorN2d2SDhrelg5bzNuK3M3My9nOE1Db2ZFb3ZHSVRHSUNUS2J5Q1YwRkROT285U3FwUXFwT3JKZlh6VFFqMnZEM1RHdHFMK050R1EyZgorcVRYbXh6dU9kN1dYZGNjOUR5alU1M2V3Rm5pNHMwZkdoZGlZYUVoR0JlbElDVE5vVjFqNU5VbkZjcm1VcWVtak5pZkpWV3BhT3FhSQorb0ZxM1NzcFpzU3JhRTdzSHEzanIxTVpxV3ZpNjYydnhWNHREK3B2S1c2YUxET0NMeXVyOFBEd2JhbnlEZXEwTjNEY3RiUVllTER2UgorUlk2dDk1bTZVQjBkM213SXJWN2UyVkdOdmpqZmZ1a2VKcDR3N0Y2NUtlY0dGc1RIUUdBeWdPcmdyV3MxanQyOFJjODhLRVNZY0dMQQorL29idlRrSDZwK0NpbldKaUptSU1xWEdRd0gveTRxazBTWWpnUVRjelQzYWpLWkdmdUkwdUo0a2tWSS9EVDVzMy9lamt4STBhVDRZKworWVRZZ1diSW1VYVhrOW5sTG1uU2gxcUppSkZsME9wVXFSSzRvT3k3TnlSUXRIV29maG9ZVnhrd1dYS1VTbjBZc1MrZlVWNmxocWZZYgorNmF5ZDNaNXFRZEcxQjdidlF6YUpqd1VWMmxpeE1VWjdKVnNPbGZqV1ZyLzNOQi91RnZueVNCTjZEY2I2ckd3YVJNM3dzb3JtdzVjQworTTlOeFd5L2JXZHVmdWRDdnk4Yk9BalhqVlZ3dGEvdU8yMXNFNVJIQkN6TkZYdGdxOU9SdEg0ZVlqVlA0WXJ5bzAyNm52a0ZtQ2V5QQorQjI5ZWZWNnJhdkNNSzVKd1dkNTg5N1FyeDdsbDM4bzZpSERaL3JYUFIvL2ZlZXZoRjRsN3dqVUdYM3hxMWVlUmZNNFJTSkdCSVYxRAorejFnS1BrZldhZzNtVkJWdnZhMVJsWDViQUpUUFIvMllxTnR3L0ZrSVlZRWkvcElaaUFkcGN4cG9IdG1uWVlvWnR2aFVmdHpkeDVaWAorSlNLRFc0MDV6a0djWnp6R1o2S0V2NEZJMjI0b0RtaWpsRWYreHA2TUpLNW9qWS9BU2VWVVIrd3NLUnVKK1hGWjVvN1plRWltZTh0MQorb3VVc1U2WWpGNVp0VWloaGtHZkNkRlFMV1FGSjNVWHhtRWxmaFFuUitlQ2RjRGJrRlpwNnZUUm1qNTZBcENpaG41UUdwYVRvTlptUgorbjNOVlNwWmNRcFoyS0VPTnVzYWlDc0tBdWcwd2tRYkpTRk8rUFRTam5lR3hPdUZqUGxVazNvdld2ZEllcmpVZzlaR0lPdEdxL3FlWAorZUNZcnJDWCsxVVBzZ1RLR0dSU2J6ZDVxMTU2ZC9ncGZiSnhlNjZlRDVpUUtyWGo3UkdncnVHeHM2MnFlYkJIVUtTMzJDS2x1Q2lxWgorcWgrcG1laG1FYjcxbm9BVW9lNWU5Wm0xN1M3NzczVjEwcGpydEc0Q211dXJDVi9uNnpMSzV0dXJXTmhxT3ZGWGJqaFpyTUQwWWhLZQord1Iwek95dXZzaDZNV3JHb0l1enZ5V3U1eTFXSUZBcW1Kc2VseXB4WGg2ZEtMTk9LRUI5OEw4OGJTMnJrTnFxbEt6Q05KcDljMEcwagorR3poMGlSckNiSFNYbVBSNjQzUVMrNHJXaGdGbW5TYlN1WENqUzB4QU9Xa1UyVWRMcXl1VU5mSFNGZFVvdXkzYm01aTVHbkRNM3RHOAorZG9KNHI1dHF1M3BQYlJTVmZ2czh1SnplTlhocDNuNGovdFo0MlN3SDdlYVdVVU9qYzNxRlY5NDUzVUhUWFpmY0xIK09lTnM1ZzM2eAorbEJuSHZUbTdFYk1iTGV1YUxuY2FvOHZXQ1hpbWZvMW8rODQzQWs2eTRDaE5lR250dkFZdmZMSzRlem1veU5JYk5DTFRDWE85WlYzQQorRTgvczg4UmN6UHpEd0k0T2I3WFp5bDcrOU1pYmFuMjloK3RKWlByRTIxd2d2QnBoRGZycmZQZENUUEtKRC95OThMMXJad0hjVjZKcQorWmFiMG1ldHB1TklYL3FBRlBvejE3MVdVYVViNEhBaEJTekh1SGZqekhiM2toYS8yQ2N0aXMvT1JBclZITllmRnlZUkgycFlJUnppYworaXNWT2ZQV0QxYjZtUlRxcENSQm96em9mNlVaVnZGWFJ4V0lyM0dHckV2aUdZZ3lQTWZhaGhlaVNhTHMvOVFlRnU3b1ovbmRTWThERAoreWE5eCt1UGVkKzdteE4ySXpJSVNCT01MRllXVnFDM1BldzFUMm5GdXVDaXdaUzUvdjZJSTEwaTR0MU9KY1VIMlU5enhLb2RIc0dHdgorT2Eremt2TlVZVU9hL1RDQ1J1dEY5TXpEd2RsVU1KQURUQ0dTYkRRNU9WNFBUYW1Eb1BFaTZFY2MvUkY1Uld3a2NkU1h2U09hRFdTbgorSTlMbHZ1YkZUUXB1YzZKS1hMY0tlYit4ZGJLUkJud1JFZW1YeWpnNk1FNjVhSmlPdUJncmt0enlrZlBMSkJLUjlDbE1hdko2Mi9GZgorQmxOSXlvZDl5WDl3Y1NYZXhuWEZwdmtyYlhrNjR4c3g1RGI3d1hLUDVmU2dzdndJTU0vOTYzMVZMQmZrbXRiSFJYcHFtdGVpNTJoRworcFV3U2xvK0JBU1FvZUlMRE9CZ1JFRUN4QkJoNS9pWW1Oc1E5ZEl2NStPSSsrUWtxZHNKUGMzdXlrejVma00rT3JhZWVrY1FGN1g0bgorQjVTNjd6YTVVOTY3UG1vb0dRaFVYZkY3YWZYeUNEN09OZFJlMTdRb2dZalZ4Mzh1THd0clM2bmhUbm0xNUxRVW51OUUydUs2Q05JLworMUhPQUJqMEVTd09qdXQ0RkVwRlFwZE5BbTRLMkxIbkRXSE5jbUtCMmlvS0JvZ3lzVlp0TU8yblN4VWRaOFlrMmtKYzdVUmlvTFZJMAorWWdtdEl3Wmo0TG9lS2VtZ25PbmJVZEduelo0T2E2c2NxaW9sQkdxUzZSZ1dOTHUwUk1oY2FFNnJoaFU0aGl1cUZYUEFHOGZHd1RQVworRktlTE10ZFZtWExTczVZSkdGL1llVm03clJFTWxZM1VZRSt5Q3hiYU1YWDh5MTVtNXpWSHE2R09LRE15bnpJSS9qZFVIZHlWcUl5MAoraWZYMityL0VndFpjdlJ6U2I3MmdVOXVpODdNMlZlY2pLaWxkVy9hRnFhWWhLb3J5VWpmQi9nNHF0eVZ1YzYweEZER21DeHdqVytxdQoremp1d2wyR2tPV242NiszUWlpRWN0dmQwNE9WdmNDVnpqZ1Q3bHJrdmpWR0tLSG1tbERVS293U2Vpa2I1a0svbUpSZXVXT3hPTngrcworVUxzbCtMcWIwQ1ZuMFNyVnlKNnd0NHQ2eVRlU0NhZmhQaEFmME9YbjZMNjBVTXhpTG9sRkF0bU4zNVMyT2IxbFpwUTFyL24wUWI1RAorb1ExekppUlZEZ0Y4TjNROFRZZmJpM0R5V0N5M2xUMW54eUJzNkZUM1MyR096V1JseHdLdmxSUDBSUEpBOVNqeEV5MFVvRW5rQStNNAorY256TE1KckJHV0xGRWFhVWI1bHZwcWJxL2xvT2FVNStERnVIUHhvODIvT1p1TThGWEczb1ZOWmh0V3BNcGIvMFh1NW0vTGZMaEhaUQorN3l1VkkwTXFaN05FNDNpbUM4akgzSXdHWmxiUG0weGtKWXM3KzJVNDhoWFRzRlNNcWdHRHZhaTBrTHh5eW5LTlQvd2FqK3ExYzF0egorR2pPcFBCZ2RDU3EzVUtaeENTc3FGSVkrTzZKYkFXR1djVjFwd3FMeWo1c0dxQ0YxeGIxRjN2YXJVV3FySnY2Y04zUHJVWHppanRmWgorRnNocEJMM1h3cjRHSVB2VTJOOEVqckpnUzF6bDIxcmJYUU1YZVhjNWpqRnlyaHBDemlqU3YvUlF0eVBTekhDRk1obE1FOTVmSGdsdAorcFJzWCtkZlNRalVlSEFscFd6SjVpT283OUxkbmF4YWk2YlhUY0dPM2ZwMDdyaTdITEVtWFhQbFlpOGJ2L3FWeHZOY2RyYTZtN1JsYgorNkpCVGI1ZmQ2NlZoRlJqR0FyaDJuN1IxckRXNFA1Tk9UOUswSTE4M1Qyc2NZa2VaM3EvVkZ5TGIwOVU5YWp6WEJTOEtna2hjNG1CUwora1lZOWN5M1Z5OWxVbnVOSkg4SEdJY2xVaWx3bkJ0alVPSDBndGVHT1o0Yy9YTnJoWExTWUR5eGZuRDh6MXBEeTdyWVJ2RG9saG5iZQorVU16eENaVXM0MHM2czdVSXZCbkxnYzArdkt1T2tJWGVPckR5bWxwK1p4cmE0TVpMQmJWcnFEL2pUSjU5N3BEbW53NWM0K0RieUI4OAorOUNnOURvZFljU3VNWlQvMTE0cHB0cWMvRXVUalJQdkgvejVzbHpJM3RsdU9FQkJMcU9YTE9YKzBJNTkyOXRPOTd3a3ZsL2F0Q3oreQoreEpyZHd0ZVcyRk5XL05TbUJQK2YvbWFZdFZzL2JZeUJDN094M2pzWVpITDA1Q0lyQmEvblMrYjNiSGZpWW00VWVpbDFZWlpTZ0FVSQorZkZaMWR4VW1lQTJvUVJRM1J1R1hOR0xGVjkvWGJHRkdQVjZrZnprMVRCQkNkK2l6YzdxMUgrT0hNSndtYUJYMklRTllWQUtIWWVwVgorU1NHQ2U2Q25iWUhIRVRLR05lNDNFRHZGZ1pyMGdCL25WSFBIWjgwVlYxb2pPaUkzWER2WUlrbDRheW80YnhRSWdyRlhXVHZCSTBuSAorVkVsV011dzJhTFVXQ1JISGY4eW1WQ0hqRmxKbk9Tb2pmZXZDWXl5eVpESDBJY3ZIaHJzblE1TzFPc1d6T051VlZLSXhTeGlGWi90UgorZktEQWY2eEZUbnc0TzlRaWcyVkNmVzJoSlFybU1PdUhXMFczZExRbUNNTzJjY2RVZC94eWZmbEgvb2xUaUhaVmRHd2I4bkl3UnpTRQorSjE1akZsT0p1QlpCWjRDaXlIeWQySUZ5bEZsQitIZ0hoWWFiaFdPR3dZTzFaSC9PZzFkdFFsRk1rMzUyQ0dSU0lGVGFwbldRRVV0TgorbDR6djhTMGFhQ0ZEeUdDQnFEVXhaWXB4R0hYMDF5L0p1SDF4aG43VE9Dbk5DSTRlS0RzNVdHWDRSNDI1RjR2RjFvM0JKNHZPMG90cQorSTNyaW1JN2pKWTFqSVNxbkJ4a25DSXZydUY4M21GNXdONFg3cUdMSWhSOEEyVmcweUZFUlNJWG45VnYzR0h5M1ZqL1dJa0tkZGxZaQoreUlNdjJJL1ZNalRMcFc3cHQwNVNXSVpSMFJQeXhwQjRTSVVNOWxCUEdCbDBHQzdvU0VFd1JZTGU0cEpwWlkyUDB6YkkxbitPYzQ0dworcVkzUFVubUYwaXhqVnBERC9tSjl3cE9CR1RWZ1hsYUNhWmlQY0lXSzVOaUtCSWlQZEdhUTBUV0d2QWlHN25NY2hkWmI3VmdmOHpOaQorTXVNeXpSZHkvbGVQZTlpQzRUUng3V2hoT1FJL1FpU1ZOQW1BYTJsVC9waUZidWg3b2ZKb1lTWnpyU1oxYnZtV3czZU4ybktVUFZreQordVBONS9WUmZvaFJkMFZZWm9xaEtJbFU2VFhZaEp4bVBVSWxvQXdjMWJQbUhFcGFaWVpPUkhObFhVSk0wN2hBVHdIUjhNSllxa3dXUgorV2FJZXpGaHhTRmxjOC9GcTgyaEVucGVSb3pnM1VMaGhyOWxBR3RWRWtDZzVaTlJ1dVZsZUJQYVphZGhHMFpna3lQbURPVE9LelZpTQorWWdPY3B1a0txUWNiakFXUzBJbGVRMlJPamRoNkErbWQxcVdkQlJTWDdpU1lnRlJUdFJtQnBKaW9pZVhKaUhmSmlNR0lSOWZKT244SQorTVNmWFloc3BuNG9vU2EybVNBajRuKzhCbWcwM2ZCSlpvUE9KZ3NWWlJ4dTFvT01SUFhZWWpkcWppaEZhRW9acFhCUkVhbnVKb1JJNgorY2liRmlucTRuZ1VLaC93UWQvSDVvZllDWjBISlhSNjJvcFpGYUFUMGlGSVpvNERJaVVvamtqZXFLaXVvWmlyS281WTFhN0FXY2tHYQorQmt1WW9ENWxwREs2ZVVzNkNrRHFwRVR3bDFFcXBmaEpwVmVLcFZsNkVnVUFBRHM9CisKKy0tQk9VTkRBUlktLQorCistLU9VVEVSLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xNC50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOThkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTQudHh0CkBAIC0wLDAgKzEsMjMgQEAKK1JldHVybi1QYXRoOiA8YmJiQHp6ei5vcmc+CitEZWxpdmVyZWQtVG86IGJiYkB6enoub3JnCitSZWNlaXZlZDogYnkgbWFpbC56enoub3JnIChQb3N0Zml4LCBmcm9tIHVzZXJpZCA4ODkpCisJaWQgMjdDRUFEMzhDQzsgRnJpLCAgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMCAoRURUKQorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogdGV4dDsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MDkwLjYxMzA0LjExMDkyOS40NTY4NEBhYWEuenp6Lm9yZz4KK0Zyb206IGJiYkBkZGQuY29tIChKb2huIFguIERvZSkKK1RvOiBiYmJAenp6Lm9yZworU3ViamVjdDogVGhpcyBpcyBhIHRlc3QgbWVzc2FnZQorRGF0ZTogRnJpLCA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwCisKKworSGksCisKK0knbSBzb3JyeSBidXQgSSdtIHVzaW5nIGEgZHJhaW5icmVhZCBJU1AsIHdoaWNoIGFsdGhvdWdoIGJpZyBhbmQKK3dlYWx0aHkgY2FuJ3Qgc2VlbSB0byBnZW5lcmF0ZSBzdGFuZGFyZCBjb21wbGlhbnQgZW1haWwuIDooCisKK1RoaXMgbWVzc2FnZSBoYXMgYSBDb250ZW50LVR5cGU6IGhlYWRlciB3aXRoIG5vIHN1YnR5cGUuICBJIGhvcGUgeW91CitjYW4gc3RpbGwgcmVhZCBpdC4KKworLU1lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTUudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzE1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2I4NDg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzE1LnR4dApAQCAtMCwwICsxLDUyIEBACitSZXR1cm4tUGF0aDogPHh4QHh4LmRrPgorUmVjZWl2ZWQ6IGZyb20gZmVwRC5wb3N0LnRlbGUuZGsgKDE5NS40MS40Ni4xNDkpIGJ5IG1haWwuZ3JvdXBjYXJlLmRrIChMU01UUCBmb3IgV2luZG93cyBOVCB2MS4xYikgd2l0aCBTTVRQIGlkIDwwLjAwMTRGOEEyQG1haWwuZ3JvdXBjYXJlLmRrPjsgTW9uLCAzMCBBcHIgMjAwMSAxMjoxNzo1MCArMDIwMAorVXNlci1BZ2VudDogTWljcm9zb2Z0LU91dGxvb2stRXhwcmVzcy1NYWNpbnRvc2gtRWRpdGlvbi81LjAyLjIxMDYKK1N1YmplY3Q6IFhYCitGcm9tOiB4eEB4eC5kaworVG86IFhYCitNZXNzYWdlLUlEOiA8eHh4eD4KK01pbWUtdmVyc2lvbjogMS4wCitDb250ZW50LXR5cGU6IG11bHRpcGFydC9taXhlZDsKKyAgIGJvdW5kYXJ5PSJNU19NYWNfT0VfMzA3MTQ3Nzg0N183MjAyNTJfTUlNRV9QYXJ0IgorCis+IERlbm5lIG1lZGRlbGVsc2UgZXIgaSBNSU1FLWZvcm1hdC4gRGEgZGl0IHBvc3RsvnNuaW5nc3Byb2dyYW0gaWtrZSBmb3JzdIxyIGRldHRlIGZvcm1hdCwga2FuIGRlbCBhZiBlbGxlciBoZWxlIG1lZGRlbGVsc2VuIHa+cmUgdWy+c2VsaWcuCisKKy0tTVNfTWFjX09FXzMwNzE0Nzc4NDdfNzIwMjUyX01JTUVfUGFydAorQ29udGVudC10eXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7CisgICBib3VuZGFyeT0iTVNfTWFjX09FXzMwNzE0Nzc4NDdfNzIwMjUyX01JTUVfUGFydCIKKworCistLU1TX01hY19PRV8zMDcxNDc3ODQ3XzcyMDI1Ml9NSU1FX1BhcnQKK0NvbnRlbnQtdHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iSVNPLTg4NTktMSIKK0NvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6IHF1b3RlZC1wcmludGFibGUKKworU29tZSByZW1vdmVkIHRlc3QuIAorCistLU1TX01hY19PRV8zMDcxNDc3ODQ3XzcyMDI1Ml9NSU1FX1BhcnQKK0NvbnRlbnQtdHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PSJJU08tODg1OS0xIgorQ29udGVudC10cmFuc2Zlci1lbmNvZGluZzogcXVvdGVkLXByaW50YWJsZQorCis8SFRNTD4KKzxIRUFEPgorPFRJVExFPlNvbWUgcmVtb3ZlZCBIVE1MPC9USVRMRT4KKzwvSEVBRD4KKzxCT0RZPgorU29tZSByZW1vdmVkIHRleHQuCis8L0JPRFk+Cis8L0hUTUw+CisKKworLS1NU19NYWNfT0VfMzA3MTQ3Nzg0N183MjAyNTJfTUlNRV9QYXJ0LS0KKworCistLU1TX01hY19PRV8zMDcxNDc3ODQ3XzcyMDI1Ml9NSU1FX1BhcnQKK0NvbnRlbnQtdHlwZTogaW1hZ2UvZ2lmOyBuYW1lPSJ4eC5naWYiOworIHgtbWFjLWNyZWF0b3I9IjZGNjc2QzY1IjsKKyB4LW1hYy10eXBlPSI0NzQ5NDY2NiIKK0NvbnRlbnQtZGlzcG9zaXRpb246IGF0dGFjaG1lbnQKK0NvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6IGJhc2U2NAorCitTb21lIHJlbW92ZWQgYmFzZTY0IGVuY29kZWQgY2hhcnMuCisKKy0tTVNfTWFjX09FXzMwNzE0Nzc4NDdfNzIwMjUyX01JTUVfUGFydC0tCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xNi50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MTY3ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTYudHh0CkBAIC0wLDAgKzEsMTIzIEBACitSZXR1cm4tUGF0aDogPD4KK0RlbGl2ZXJlZC1Ubzogc2NyLWFkbWluQHNvY2FsLXJhdmVzLm9yZworUmVjZWl2ZWQ6IGZyb20gY291Z2FyLm5vYy51Y2xhLmVkdSAoY291Z2FyLm5vYy51Y2xhLmVkdSBbMTY5LjIzMi4xMC4xOF0pCisJYnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQ0NDMkM1MUI4NAorCWZvciA8c2NyLWFkbWluQHNvY2FsLXJhdmVzLm9yZz47IFN1biwgMjMgU2VwIDIwMDEgMjA6MTM6NTQgLTA3MDAgKFBEVCkKK1JlY2VpdmVkOiBmcm9tIHNpbXMtbXMtZGFlbW9uIGJ5IGNvdWdhci5ub2MudWNsYS5lZHUKKyAoU3VuIEludGVybmV0IE1haWwgU2VydmVyIHNpbXMuMy41LjIwMDAuMDMuMjMuMTguMDMucDEwKQorIGlkIDwwR0s1MDBCMDFEMEI4WUBjb3VnYXIubm9jLnVjbGEuZWR1PiBmb3Igc2NyLWFkbWluQHNvY2FsLXJhdmVzLm9yZzsgU3VuLAorIDIzIFNlcCAyMDAxIDIwOjE0OjM1IC0wNzAwIChQRFQpCitSZWNlaXZlZDogZnJvbSBjb3VnYXIubm9jLnVjbGEuZWR1CisgKFN1biBJbnRlcm5ldCBNYWlsIFNlcnZlciBzaW1zLjMuNS4yMDAwLjAzLjIzLjE4LjAzLnAxMCkKKyBpZCA8MEdLNTAwQjAxRDBCOFhAY291Z2FyLm5vYy51Y2xhLmVkdT47IFN1biwgMjMgU2VwIDIwMDEgMjA6MTQ6MzUgLTA3MDAgKFBEVCkKK0RhdGU6IFN1biwgMjMgU2VwIDIwMDEgMjA6MTQ6MzUgLTA3MDAgKFBEVCkKK0Zyb206IEludGVybmV0IE1haWwgRGVsaXZlcnkgPHBvc3RtYXN0ZXJAdWNsYS5lZHU+CitTdWJqZWN0OiBEZWxpdmVyeSBOb3RpZmljYXRpb246IERlbGl2ZXJ5IGhhcyBmYWlsZWQKK1RvOiBzY3ItYWRtaW5Ac29jYWwtcmF2ZXMub3JnCitNZXNzYWdlLWlkOiA8MEdLNTAwQjA0RDBCOFhAY291Z2FyLm5vYy51Y2xhLmVkdT4KK01JTUUtdmVyc2lvbjogMS4wCitTZW5kZXI6IHNjci1vd25lckBzb2NhbC1yYXZlcy5vcmcKK0Vycm9ycy1Ubzogc2NyLW93bmVyQHNvY2FsLXJhdmVzLm9yZworWC1CZWVuVGhlcmU6IHNjckBzb2NhbC1yYXZlcy5vcmcKK1gtTWFpbG1hbi1WZXJzaW9uOiAyLjFhMworUHJlY2VkZW5jZTogYnVsaworTGlzdC1IZWxwOiA8bWFpbHRvOnNjci1yZXF1ZXN0QHNvY2FsLXJhdmVzLm9yZz9zdWJqZWN0PWhlbHA+CitMaXN0LVBvc3Q6IDxtYWlsdG86c2NyQHNvY2FsLXJhdmVzLm9yZz4KK0xpc3QtU3Vic2NyaWJlOiA8aHR0cDovL3NvY2FsLXJhdmVzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3Njcj4sCisJPG1haWx0bzpzY3ItcmVxdWVzdEBzb2NhbC1yYXZlcy5vcmc/c3ViamVjdD1zdWJzY3JpYmU+CitMaXN0LUlkOiBTb0NhbC1SYXZlcyA8c2NyLnNvY2FsLXJhdmVzLm9yZz4KK0xpc3QtVW5zdWJzY3JpYmU6IDxodHRwOi8vc29jYWwtcmF2ZXMub3JnL21haWxtYW4vbGlzdGluZm8vc2NyPiwKKwk8bWFpbHRvOnNjci1yZXF1ZXN0QHNvY2FsLXJhdmVzLm9yZz9zdWJqZWN0PXVuc3Vic2NyaWJlPgorTGlzdC1BcmNoaXZlOiA8aHR0cDovL3NvY2FsLXJhdmVzLm9yZy9tYWlsbWFuL3ByaXZhdGUvc2NyLz4KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3JlcG9ydDsgYm91bmRhcnk9IkJvdW5kYXJ5XyhJRF9QR1MyRjJhK3orL2pMN2h1cEtnUmhBKSIKKworCistLUJvdW5kYXJ5XyhJRF9QR1MyRjJhK3orL2pMN2h1cEtnUmhBKQorQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTEKKworVGhpcyByZXBvcnQgcmVsYXRlcyB0byBhIG1lc3NhZ2UgeW91IHNlbnQgd2l0aCB0aGUgZm9sbG93aW5nIGhlYWRlciBmaWVsZHM6CisKKyAgTWVzc2FnZS1pZDogPDAwMjAwMWMxNDRhNiQ4NzUyZTA2MCQ1NjEwNDU4NkBveHkuZWR1PgorICBEYXRlOiBTdW4sIDIzIFNlcCAyMDAxIDIwOjEwOjU1IC0wNzAwCisgIEZyb206ICJJYW4gVC4gSGVucnkiIDxoZW5yeWlAb3h5LmVkdT4KKyAgVG86IFNvQ2FsIFJhdmVzIDxzY3JAc29jYWwtcmF2ZXMub3JnPgorICBTdWJqZWN0OiBbc2NyXSB5ZWFoIGZvciBJYW5zISEKKworWW91ciBtZXNzYWdlIGNhbm5vdCBiZSBkZWxpdmVyZWQgdG8gdGhlIGZvbGxvd2luZyByZWNpcGllbnRzOgorCisgIFJlY2lwaWVudCBhZGRyZXNzOiBqYW5nZWwxQGNvdWdhci5ub2MudWNsYS5lZHUKKyAgUmVhc29uOiByZWNpcGllbnQgcmVhY2hlZCBkaXNrIHF1b3RhCisKKworLS1Cb3VuZGFyeV8oSURfUEdTMkYyYSt6Ky9qTDdodXBLZ1JoQSkKK0NvbnRlbnQtdHlwZTogbWVzc2FnZS9ERUxJVkVSWS1TVEFUVVMKKworT3JpZ2luYWwtZW52ZWxvcGUtaWQ6IDBHSzUwMEI0SEQwODg4QGNvdWdhci5ub2MudWNsYS5lZHUKK1JlcG9ydGluZy1NVEE6IGRuczsgY291Z2FyLm5vYy51Y2xhLmVkdQorCitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjAuMCAocmVjaXBpZW50IHJlYWNoZWQgZGlzayBxdW90YSkKK09yaWdpbmFsLXJlY2lwaWVudDogcmZjODIyO2phbmdlbDFAY291Z2FyLm5vYy51Y2xhLmVkdQorRmluYWwtcmVjaXBpZW50OiByZmM4MjI7amFuZ2VsMUBjb3VnYXIubm9jLnVjbGEuZWR1CisKKy0tQm91bmRhcnlfKElEX1BHUzJGMmEreisvakw3aHVwS2dSaEEpCitDb250ZW50LXR5cGU6IE1FU1NBR0UvUkZDODIyCisKK1JldHVybi1wYXRoOiBzY3ItYWRtaW5Ac29jYWwtcmF2ZXMub3JnCitSZWNlaXZlZDogZnJvbSBzaW1zLW1zLWRhZW1vbiBieSBjb3VnYXIubm9jLnVjbGEuZWR1CisgKFN1biBJbnRlcm5ldCBNYWlsIFNlcnZlciBzaW1zLjMuNS4yMDAwLjAzLjIzLjE4LjAzLnAxMCkKKyBpZCA8MEdLNTAwQjAxRDBCOFhAY291Z2FyLm5vYy51Y2xhLmVkdT47IFN1biwgMjMgU2VwIDIwMDEgMjA6MTQ6MzUgLTA3MDAgKFBEVCkKK1JlY2VpdmVkOiBmcm9tIHBhbnRoZXIubm9jLnVjbGEuZWR1IGJ5IGNvdWdhci5ub2MudWNsYS5lZHUKKyAoU3VuIEludGVybmV0IE1haWwgU2VydmVyIHNpbXMuMy41LjIwMDAuMDMuMjMuMTguMDMucDEwKQorIHdpdGggRVNNVFAgaWQgPDBHSzUwMEI0R0QwODg4QGNvdWdhci5ub2MudWNsYS5lZHU+IGZvciBqYW5nZWwxQHNpbXMtbXMtZGFlbW9uOworIFN1biwgMjMgU2VwIDIwMDEgMjA6MTQ6MzMgLTA3MDAgKFBEVCkKK1JlY2VpdmVkOiBmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnCisgKGlwLTIwOS04NS0yMjItMTE3LmRyZWFtaG9zdC5jb20gWzIwOS44NS4yMjIuMTE3XSkKKyBieSBwYW50aGVyLm5vYy51Y2xhLmVkdSAoOC45LjFhLzguOS4xKSB3aXRoIEVTTVRQIGlkIFVBQTA5NzkzIGZvcgorIDxqYW5nZWwxQHVjbGEuZWR1PjsgU3VuLCAyMyBTZXAgMjAwMSAyMDoxNDozMiAtMDcwMCAoUERUKQorUmVjZWl2ZWQ6IGZyb20gYmFieWxvbiAobG9jYWxob3N0IFsxMjcuMC4wLjFdKSBieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZworIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEQzQjI5NTFCNzA7IFN1biwgMjMgU2VwIDIwMDEgMjA6MTM6NDcgLTA3MDAgKFBEVCkKK1JlY2VpdmVkOiBieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgNjAwMDEpCisgaWQgQTYxMUY1MUI4MjsgU3VuLCAyMyBTZXAgMjAwMSAyMDoxMzo0NiAtMDcwMCAoUERUKQorUmVjZWl2ZWQ6IGZyb20gdGlnZXIuY2Mub3h5LmVkdSAodGlnZXIuY2Mub3h5LmVkdSBbMTM0LjY5LjMuMTEyXSkKKyBieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBBREE3MzUxQjcwIGZvcgorIDxzY3JAc29jYWwtcmF2ZXMub3JnPjsgU3VuLCAyMyBTZXAgMjAwMSAyMDoxMzo0NCAtMDcwMCAoUERUKQorUmVjZWl2ZWQ6IGZyb20gZW50IChuMTZoODYuZGhjcC5veHkuZWR1IFsxMzQuNjkuMTYuODZdKQorIGJ5IHRpZ2VyLmNjLm94eS5lZHUgKDguOC44LzguOC44KSB3aXRoIFNNVFAgaWQgVUFBMDgxMDAgZm9yCisgPHNjckBzb2NhbC1yYXZlcy5vcmc+OyBTdW4sIDIzIFNlcCAyMDAxIDIwOjE0OjI0IC0wNzAwIChQRFQpCitEYXRlOiBTdW4sIDIzIFNlcCAyMDAxIDIwOjEwOjU1IC0wNzAwCitGcm9tOiAiSWFuIFQuIEhlbnJ5IiA8aGVucnlpQG94eS5lZHU+CitTdWJqZWN0OiBbc2NyXSB5ZWFoIGZvciBJYW5zISEKK1NlbmRlcjogc2NyLWFkbWluQHNvY2FsLXJhdmVzLm9yZworVG86IFNvQ2FsIFJhdmVzIDxzY3JAc29jYWwtcmF2ZXMub3JnPgorRXJyb3JzLXRvOiBzY3ItYWRtaW5Ac29jYWwtcmF2ZXMub3JnCitNZXNzYWdlLWlkOiA8MDAyMDAxYzE0NGE2JDg3NTJlMDYwJDU2MTA0NTg2QG94eS5lZHU+CitNSU1FLXZlcnNpb246IDEuMAorWC1NYWlsZXI6IE1pY3Jvc29mdCBPdXRsb29rIEV4cHJlc3MgNS41MC40NTIyLjEyMDAKK0NvbnRlbnQtdHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorUHJlY2VkZW5jZTogYnVsaworRGVsaXZlcmVkLXRvOiBzY3ItcG9zdEBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZworRGVsaXZlcmVkLXRvOiBzY3JAc29jYWwtcmF2ZXMub3JnCitYLUNvbnZlcnRlZC1Uby1QbGFpbi1UZXh0OiBmcm9tIG11bHRpcGFydC9hbHRlcm5hdGl2ZSBieSBkZW1pbWUgMC45OGUKK1gtQ29udmVydGVkLVRvLVBsYWluLVRleHQ6IEFsdGVybmF0aXZlIHNlY3Rpb24gdXNlZCB3YXMgdGV4dC9wbGFpbgorWC1CZWVuVGhlcmU6IHNjckBzb2NhbC1yYXZlcy5vcmcKK1gtTWFpbG1hbi1WZXJzaW9uOiAyLjFhMworTGlzdC1IZWxwOiA8bWFpbHRvOnNjci1yZXF1ZXN0QHNvY2FsLXJhdmVzLm9yZz9zdWJqZWN0PWhlbHA+CitMaXN0LVBvc3Q6IDxtYWlsdG86c2NyQHNvY2FsLXJhdmVzLm9yZz4KK0xpc3QtU3Vic2NyaWJlOiA8aHR0cDovL3NvY2FsLXJhdmVzLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3Njcj4sCisgPG1haWx0bzpzY3ItcmVxdWVzdEBzb2NhbC1yYXZlcy5vcmc/c3ViamVjdD1zdWJzY3JpYmU+CitMaXN0LUlkOiBTb0NhbC1SYXZlcyA8c2NyLnNvY2FsLXJhdmVzLm9yZz4KK0xpc3QtVW5zdWJzY3JpYmU6IDxodHRwOi8vc29jYWwtcmF2ZXMub3JnL21haWxtYW4vbGlzdGluZm8vc2NyPiwKKyA8bWFpbHRvOnNjci1yZXF1ZXN0QHNvY2FsLXJhdmVzLm9yZz9zdWJqZWN0PXVuc3Vic2NyaWJlPgorTGlzdC1BcmNoaXZlOiA8aHR0cDovL3NvY2FsLXJhdmVzLm9yZy9tYWlsbWFuL3ByaXZhdGUvc2NyLz4KKworSSBhbHdheXMgbG92ZSB0byBmaW5kIG1vcmUgSWFuJ3MgdGhhdCBhcmUgb3ZlciAzIHllYXJzIG9sZCEhCisKK0lhbgorX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KK0ZvciBldmVudCBpbmZvLCBsaXN0IHF1ZXN0aW9ucywgb3IgdG8gdW5zdWJzY3JpYmUsIHNlZSBodHRwOi8vd3d3LnNvY2FsLXJhdmVzLm9yZy8KKworCisKKy0tQm91bmRhcnlfKElEX1BHUzJGMmEreisvakw3aHVwS2dSaEEpLS0KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzE3LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4NmU0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xNy50eHQKQEAgLTAsMCArMSwxMiBAQAorTUlNRS1WZXJzaW9uOiAxLjAKK0Zyb206IEJhcnJ5IDxiYXJyeUBkaWdpY29vbC5jb20+CitUbzogRGluZ3VzIExvdmVycyA8Y3JhdmluZG9nc0BjcmF2aW5kb2dzLmNvbT4KK1N1YmplY3Q6IEhlcmUgaXMgeW91ciBkaW5ndXMgZmlzaAorRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAxOTozNTowMiAtMDQwMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKKworSGkgdGhlcmUsCisKK1RoaXMgaXMgdGhlIGRpbmd1cyBmaXNoLgorCitbTm9uLXRleHQgKGltYWdlL2dpZikgcGFydCBvZiBtZXNzYWdlIG9taXR0ZWQsIGZpbGVuYW1lIGRpbmd1c2Zpc2guZ2lmXQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzE4LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlmNDkwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xOC50eHQKQEAgLTAsMCArMSw2IEBACitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQ6IHdhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7CisJc3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xOS50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YmY3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTkudHh0CkBAIC0wLDAgKzEsNDMgQEAKK1NlbmQgUHBwIG1haWxpbmcgbGlzdCBzdWJtaXNzaW9ucyB0bworCXBwcEB6enoub3JnCisKK1RvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSB2aWEgdGhlIFdvcmxkIFdpZGUgV2ViLCB2aXNpdAorCWh0dHA6Ly93d3cuenp6Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3BwcAorb3IsIHZpYSBlbWFpbCwgc2VuZCBhIG1lc3NhZ2Ugd2l0aCBzdWJqZWN0IG9yIGJvZHkgJ2hlbHAnIHRvCisJcHBwLXJlcXVlc3RAenp6Lm9yZworCitZb3UgY2FuIHJlYWNoIHRoZSBwZXJzb24gbWFuYWdpbmcgdGhlIGxpc3QgYXQKKwlwcHAtYWRtaW5Aenp6Lm9yZworCitXaGVuIHJlcGx5aW5nLCBwbGVhc2UgZWRpdCB5b3VyIFN1YmplY3QgbGluZSBzbyBpdCBpcyBtb3JlIHNwZWNpZmljCit0aGFuICJSZTogQ29udGVudHMgb2YgUHBwIGRpZ2VzdC4uLiIKKworVG9kYXkncyBUb3BpY3M6CisKKyAgIDEuIHRlc3RpbmcgIzEgKEJhcnJ5IEEuIFdhcnNhdykKKyAgIDIuIHRlc3RpbmcgIzIgKEJhcnJ5IEEuIFdhcnNhdykKKyAgIDMuIHRlc3RpbmcgIzMgKEJhcnJ5IEEuIFdhcnNhdykKKyAgIDQuIHRlc3RpbmcgIzQgKEJhcnJ5IEEuIFdhcnNhdykKKyAgIDUuIHRlc3RpbmcgIzUgKEJhcnJ5IEEuIFdhcnNhdykKKworaGVsbG8KKworCitoZWxsbworCisKK2hlbGxvCisKKworaGVsbG8KKworCitoZWxsbworCisKKworX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KK1BwcCBtYWlsaW5nIGxpc3QKK1BwcEB6enoub3JnCitodHRwOi8vd3d3Lnp6ei5vcmcvbWFpbG1hbi9saXN0aW5mby9wcHAKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzIwLnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2YTg4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yMC50eHQKQEAgLTAsMCArMSwyMiBAQAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKKwlpZCAyN0NFQUQzOENDOyBGcmksICA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUwOTAuNjEzMDQuMTEwOTI5LjQ1Njg0QGFhYS56enoub3JnPgorRnJvbTogYmJiQGRkZC5jb20gKEpvaG4gWC4gRG9lKQorVG86IGJiYkB6enoub3JnCitDYzogY2NjQHp6ei5vcmcKK0NDOiBkZGRAenp6Lm9yZworY2M6IGVlZUB6enoub3JnCitTdWJqZWN0OiBUaGlzIGlzIGEgdGVzdCBtZXNzYWdlCitEYXRlOiBGcmksIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAKKworCitIaSwKKworRG8geW91IGxpa2UgdGhpcyBtZXNzYWdlPworCistTWUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yMS50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTkwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjEudHh0CkBAIC0wLDAgKzEsMjAgQEAKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorVG86IGJwZXJzb25AZG9tLmFpbgorU3ViamVjdDogVGVzdAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKKworTUlNRSBtZXNzYWdlCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworT25lCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworVHdvCistLUJPVU5EQVJZLS0KK0VuZCBvZiBNSU1FIG1lc3NhZ2UKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yMi50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOWRlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjIudHh0CkBAIC0wLDAgKzEsNDYgQEAKK01pbWUtVmVyc2lvbjogMS4wCitNZXNzYWdlLUlkOiA8YTA1MDAxOTAyYjdmMWMzMzc3M2U5QFsxMzQuODQuMTgzLjEzOF0+CitEYXRlOiBUdWUsIDE2IE9jdCAyMDAxIDEzOjU5OjI1ICswMzAwCitUbzogYUBleGFtcGxlLmNvbQorRnJvbTogYkBleGFtcGxlLmNvbQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSI9PT09PT09PT09PT1fLTEyMDg4OTI1MjM9PV89PT09PT09PT09PT0iCisKKy0tPT09PT09PT09PT09Xy0xMjA4ODkyNTIzPT1fPT09PT09PT09PT09CitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIiA7IGZvcm1hdD0iZmxvd2VkIgorCitUZXh0IHRleHQgdGV4dC4KKy0tPT09PT09PT09PT09Xy0xMjA4ODkyNTIzPT1fPT09PT09PT09PT09CitDb250ZW50LUlkOiA8YTA1MDAxOTAyYjdmMWMzMzc3M2U5QFsxMzQuODQuMTgzLjEzOF0uMC4wPgorQ29udGVudC1UeXBlOiBpbWFnZS9qcGVnOyBuYW1lPSJ3aWJibGUuSlBHIgorIDsgeC1tYWMtdHlwZT0iNEE1MDQ1NDciCisgOyB4LW1hYy1jcmVhdG9yPSI0NzRCNEY0RSIKK0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJ3aWJibGUuSlBHIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKKy85ai80QUFRU2taSlJnQUJBUUFBQVFBQkFBRC8yd0JEQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCCitBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvd0FBTENBWEFCSUVCQVJFQQorZzZiQ2pqdy9wSVpTak82RldGcGxkanlTT21DTnJPN0RCWmliVVhoVHd0Q2l4dytHdEFpalZkcXh4YVBwMGFLdm1HWGEKK3FyYkJRdm1zMG1BTWVZUy8zaVRWMWRHMGhIYVJOSzAxWGJsbld4dFZkamtITE1JZ1R5cW5rOVZCN0NyUDJLeklJTnBhCis0TzdJK3p4WU85V1Y4alpnNzFabGIrOHJNRGtFaXJBVlFGQVVBS0FGQUFBVUFZQVVEZ0FEZ1k2RGpwUnRYajVSeGpIQQorNHdRUmowd1FDTWRDQWV3cGFLS0svOWs9CistLT09PT09PT09PT09PV8tMTIwODg5MjUyMz09Xz09PT09PT09PT09PQorQ29udGVudC1JZDogPGEwNTAwMTkwMmI3ZjFjMzM3NzNlOUBbMTM0Ljg0LjE4My4xMzhdLjAuMT4KK0NvbnRlbnQtVHlwZTogaW1hZ2UvanBlZzsgbmFtZT0id2liYmxlMi5KUEciCisgOyB4LW1hYy10eXBlPSI0QTUwNDU0NyIKKyA7IHgtbWFjLWNyZWF0b3I9IjQ3NEI0RjRFIgorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IndpYmJsZTIuSlBHIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKKy85ai80QUFRU2taSlJnQUJBUUFBQVFBQkFBRC8yd0JEQUFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCCitBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUgvd0FBTENBWEFCSjBCQVJFQQorLzhRQUh3QUFBUVVCQVFFQkFRRUFBQUFBQUFBQUFBRUNBd1FGQmdjSUNRb0wvOFFBdFJBQUFnRURBd0lFQXdVRkJBUUEKK1c2TkZKSkJFa1UxMGtLR1RjV01Ed3h1VSswSkh2azhxQXRPcE53cVNSMG44YzNCbER5WEhscXNVbHRIRWlUdmRYTHhSCis3dk1pR0ROSkFKV2tBTWs4WmtDRnA1RzJvbzVXKytJTnJiUXROZlRReEpBdVhsdXB6OW9TNGQ1WTFXK0UyWGxXWkpKRQorWTdMV1lReFRMRTF6dU1iZkJQeHc4WDJmaWJWZEliU2JJNm5MWnhYNjM1dDlUanRZcmVXUjdXR0tKVExKRkZLU2xvek8KKzBTaHhJWE00M3VDMy85az0KKy0tPT09PT09PT09PT09Xy0xMjA4ODkyNTIzPT1fPT09PT09PT09PT09CitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIiA7IGZvcm1hdD0iZmxvd2VkIgorCitUZXh0IHRleHQgdGV4dC4KKy0tPT09PT09PT09PT09Xy0xMjA4ODkyNTIzPT1fPT09PT09PT09PT09LS0KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzIzLnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyZThlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yMy50eHQKQEAgLTAsMCArMSw4IEBACitGcm9tOiBhcGVyc29uQGRvbS5haW4KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCitBIG1lc3NhZ2UgcGFydAorLS1CT1VOREFSWS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjQudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTUyMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI0LnR4dApAQCAtMCwwICsxLDEwIEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKKworCistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yNS50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMzUyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjUudHh0CkBAIC0wLDAgKzEsMTE3IEBACitGcm9tIE1BSUxFUi1EQUVNT04gRnJpIEFwciAwNiAxNjo0NjowOSAyMDAxCitSZWNlaXZlZDogZnJvbSBbMjA0LjI0NS4xOTkuOThdIChoZWxvPXppbmZhbmRlbC5sYWNpdGEuY29tKQorCWJ5IHd3dy5saW51eC5vcmcudWsgd2l0aCBlc210cCAoRXhpbSAzLjEzICMxKQorCWlkIDE0bFlSNi0wMDA4SXYtMDAKKwlmb3IgbGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWs7IEZyaSwgMDYgQXByIDIwMDEgMTY6NDY6MDkgKzAxMDAKK1JlY2VpdmVkOiBmcm9tIGxvY2FsaG9zdCAobG9jYWxob3N0KSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBpbnRlcm5hbCBpZCBKQUIwMzIyNTsgRnJpLCA2IEFwciAyMDAxIDA5OjIzOjA2IC0wODAwIChHTVQtMDgwMCkKK0RhdGU6IEZyaSwgNiBBcHIgMjAwMSAwOToyMzowNiAtMDgwMCAoR01ULTA4MDApCitGcm9tOiBNYWlsIERlbGl2ZXJ5IFN1YnN5c3RlbSA8TUFJTEVSLURBRU1PTkB6aW5mYW5kZWwubGFjaXRhLmNvbT4KK1N1YmplY3Q6IFJldHVybmVkIG1haWw6IFRvbyBtYW55IGhvcHMgMTkgKDE3IG1heCk6IGZyb20gPGxpbnV4dXNlci1hZG1pbkB3d3cubGludXgub3JnLnVrPiB2aWEgWzE5OS4xNjQuMjM1LjIyNl0sIHRvIDxzY29mZm1hbkB3ZWxscGFydG5lci5jb20+CitNZXNzYWdlLUlkOiA8MjAwMTA0MDYxNzIzLkpBQjAzMjI1QHppbmZhbmRlbC5sYWNpdGEuY29tPgorVG86IDxsaW51eHVzZXItYWRtaW5Ad3d3LmxpbnV4Lm9yZy51az4KK1RvOiBwb3N0bWFzdGVyQHppbmZhbmRlbC5sYWNpdGEuY29tCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVwb3J0OyByZXBvcnQtdHlwZT1kZWxpdmVyeS1zdGF0dXM7CisJYm8KK0F1dG8tU3VibWl0dGVkOiBhdXRvLWdlbmVyYXRlZCAoZmFpbHVyZSkKKworVGhpcyBpcyBhIE1JTUUtZW5jYXBzdWxhdGVkIG1lc3NhZ2UKKworLS1KQUIwMzIyNS45ODY1Nzc3ODYvemluZmFuZGVsLmxhY2l0YS5jb20KKworVGhlIG9yaWdpbmFsIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIGF0IEZyaSwgNiBBcHIgMjAwMSAwOToyMzowMyAtMDgwMCAoR01ULTA4MDApCitmcm9tIFsxOTkuMTY0LjIzNS4yMjZdCisKKyAgIC0tLS0tIFRoZSBmb2xsb3dpbmcgYWRkcmVzc2VzIGhhdmUgZGVsaXZlcnkgbm90aWZpY2F0aW9ucyAtLS0tLQorPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT4gICh1bnJlY292ZXJhYmxlIGVycm9yKQorCisgICAtLS0tLSBUcmFuc2NyaXB0IG9mIHNlc3Npb24gZm9sbG93cyAtLS0tLQorNTU0IFRvbyBtYW55IGhvcHMgMTkgKDE3IG1heCk6IGZyb20gPGxpbnV4dXNlci1hZG1pbkB3d3cubGludXgub3JnLnVrPiB2aWEgWzE5OS4xNjQuMjM1LjIyNl0sIHRvIDxzY29mZm1hbkB3ZWxscGFydG5lci5jb20+CisKKy0tSkFCMDMyMjUuOTg2NTc3Nzg2L3ppbmZhbmRlbC5sYWNpdGEuY29tCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzCisKK1JlcG9ydGluZy1NVEE6IGRuczsgemluZmFuZGVsLmxhY2l0YS5jb20KK1JlY2VpdmVkLUZyb20tTVRBOiBkbnM7IFsxOTkuMTY0LjIzNS4yMjZdCitBcnJpdmFsLURhdGU6IEZyaSwgNiBBcHIgMjAwMSAwOToyMzowMyAtMDgwMCAoR01ULTA4MDApCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyBzY29mZm1hbkB3ZWxscGFydG5lci5jb20KK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNC42CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCA2IEFwciAyMDAxIDA5OjIzOjA2IC0wODAwIChHTVQtMDgwMCkKKworLS1KQUIwMzIyNS45ODY1Nzc3ODYvemluZmFuZGVsLmxhY2l0YS5jb20KK0NvbnRlbnQtVHlwZTogdGV4dC9yZmM4MjItaGVhZGVycworCitSZXR1cm4tUGF0aDogbGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWsKK1JlY2VpdmVkOiBmcm9tIG5zMS53ZWxscGFydG5lci5uZXQgKFsxOTkuMTY0LjIzNS4yMjZdKSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBFU01UUCBpZCBKQUEwMzIyNSBmb3IgPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT47IEZyaSwgNiBBcHIgMjAwMSAwOToyMzowMyAtMDgwMCAoR01ULTA4MDApCitSZWNlaXZlZDogZnJvbSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoWzIwNC4yNDUuMTk5Ljk4XSkKKwlieQorCWZvCitSZWNlaXZlZDogZnJvbSBuczEud2VsbHBhcnRuZXIubmV0IChbMTk5LjE2NC4yMzUuMjI2XSkgYnkgemluZmFuZGVsLmxhY2l0YS5jb20gKDguNy4zLzguNi4xMC1NVDQuMDApIHdpdGggRVNNVFAgaWQgSkFBMDMyMjEgZm9yIDxzY29mZm1hbkB3ZWxscGFydG5lci5jb20+OyBGcmksIDYgQXByIDIwMDEgMDk6MjI6MTggLTA4MDAgKEdNVC0wODAwKQorUmVjZWl2ZWQ6IGZyb20gemluZmFuZGVsLmxhY2l0YS5jb20gKFsyMDQuMjQ1LjE5OS45OF0pCisJYnkKKwlmbworUmVjZWl2ZWQ6IGZyb20gbnMxLndlbGxwYXJ0bmVyLm5ldCAoWzE5OS4xNjQuMjM1LjIyNl0pIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIEVTTVRQIGlkIEpBQTAzMjE3IGZvciA8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPjsgRnJpLCA2IEFwciAyMDAxIDA5OjIxOjM3IC0wODAwIChHTVQtMDgwMCkKK1JlY2VpdmVkOiBmcm9tIHppbmZhbmRlbC5sYWNpdGEuY29tIChbMjA0LjI0NS4xOTkuOThdKQorCWJ5CisJZm8KK1JlY2VpdmVkOiBmcm9tIG5zMS53ZWxscGFydG5lci5uZXQgKFsxOTkuMTY0LjIzNS4yMjZdKSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBFU01UUCBpZCBKQUEwMzIxMyBmb3IgPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT47IEZyaSwgNiBBcHIgMjAwMSAwOToyMDo1NiAtMDgwMCAoR01ULTA4MDApCitSZWNlaXZlZDogZnJvbSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoWzIwNC4yNDUuMTk5Ljk4XSkKKwlieQorCWZvCitSZWNlaXZlZDogZnJvbSBuczEud2VsbHBhcnRuZXIubmV0IChbMTk5LjE2NC4yMzUuMjI2XSkgYnkgemluZmFuZGVsLmxhY2l0YS5jb20gKDguNy4zLzguNi4xMC1NVDQuMDApIHdpdGggRVNNVFAgaWQgSkFBMDMyMDkgZm9yIDxzY29mZm1hbkB3ZWxscGFydG5lci5jb20+OyBGcmksIDYgQXByIDIwMDEgMDk6MjA6MTUgLTA4MDAgKEdNVC0wODAwKQorUmVjZWl2ZWQ6IGZyb20gemluZmFuZGVsLmxhY2l0YS5jb20gKFsyMDQuMjQ1LjE5OS45OF0pCisJYnkKKwlmbworUmVjZWl2ZWQ6IGZyb20gbnMxLndlbGxwYXJ0bmVyLm5ldCAoWzE5OS4xNjQuMjM1LjIyNl0pIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIEVTTVRQIGlkIEpBQTAzMjA1IGZvciA8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPjsgRnJpLCA2IEFwciAyMDAxIDA5OjE5OjMzIC0wODAwIChHTVQtMDgwMCkKK1JlY2VpdmVkOiBmcm9tIHppbmZhbmRlbC5sYWNpdGEuY29tIChbMjA0LjI0NS4xOTkuOThdKQorCWJ5CisJZm8KK1JlY2VpdmVkOiBmcm9tIG5zMS53ZWxscGFydG5lci5uZXQgKFsxOTkuMTY0LjIzNS4yMjZdKSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBFU01UUCBpZCBKQUEwMzIwMSBmb3IgPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT47IEZyaSwgNiBBcHIgMjAwMSAwOToxODo1MiAtMDgwMCAoR01ULTA4MDApCitSZWNlaXZlZDogZnJvbSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoWzIwNC4yNDUuMTk5Ljk4XSkKKwlieQorCWZvCitSZWNlaXZlZDogZnJvbSBuczEud2VsbHBhcnRuZXIubmV0IChbMTk5LjE2NC4yMzUuMjI2XSkgYnkgemluZmFuZGVsLmxhY2l0YS5jb20gKDguNy4zLzguNi4xMC1NVDQuMDApIHdpdGggRVNNVFAgaWQgSkFBMDMxOTcgZm9yIDxzY29mZm1hbkB3ZWxscGFydG5lci5jb20+OyBGcmksIDYgQXByIDIwMDEgMDk6MTc6NTQgLTA4MDAgKEdNVC0wODAwKQorUmVjZWl2ZWQ6IGZyb20gd3d3LmxpbnV4Lm9yZy51ayAocGFyY2VsZmFyY2UubGludXgudGhlcGxhbmV0LmNvLnVrIFsxOTUuOTIuMjQ5LjI1Ml0pCisJYnkKKwlmbworUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0LmxvY2FsZG9tYWluCisJKFsKKwlieQorCWlkCitSZWNlaXZlZDogZnJvbSBbMjEyLjEuMTMwLjExXSAoaGVsbz1zMS51a2xpbnV4Lm5ldCBpZGVudD1yb290KQorCWJ5CisJaWQKKwlmbworUmVjZWl2ZWQ6IGZyb20gc2VydmVyIChwcHAtMi0yMi5jdng0LnRlbGluY28ubmV0IFsyMTIuMS4xNDkuMjJdKQorCWJ5CisJZm8KK0Zyb206IERhbmllbCBKYW1lcyA8ZGFuaWVsQGxpbnV4dXNlci5jby51az4KK09yZ2FuaXphdGlvbjogTGludXhVc2VyCitUbzogbGludXh1c2VyQHd3dy5saW51eC5vcmcudWsKK1gtTWFpbGVyOiBLTWFpbCBbdmVyc2lvbiAxLjEuOTldCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47CisgIGMKK01JTUUtVmVyc2lvbjogMS4wCitNZXNzYWdlLUlkOiA8MDEwNDA2MTYwMzM5MDMuMDA5NjJAc2VydmVyPgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorU3ViamVjdDogW0xpbnV4VXNlcl0gYnVsbGV0aW4gbm8uIDQ1CitTZW5kZXI6IGxpbnV4dXNlci1hZG1pbkB3d3cubGludXgub3JnLnVrCitFcnJvcnMtVG86IGxpbnV4dXNlci1hZG1pbkB3d3cubGludXgub3JnLnVrCitYLUJlZW5UaGVyZTogbGludXh1c2VyQHd3dy5saW51eC5vcmcudWsKK1gtTWFpbG1hbi1WZXJzaW9uOiAyLjAuMworUHJlY2VkZW5jZTogYnVsaworTGlzdC1IZWxwOiA8bWFpbHRvOmxpbnV4dXNlci1yZXF1ZXN0QHd3dy5saW51eC5vcmcudWs/c3ViamVjdD1oZWxwPgorTGlzdC1Qb3N0OiA8bWFpbHRvOmxpbnV4dXNlckB3d3cubGludXgub3JnLnVrPgorTGlzdC1TdWJzY3JpYmU6IDxodHRwOi8vd3d3LmxpbnV4Lm9yZy51ay9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4dXNlcj4sCisJPG0KK0xpc3QtSWQ6IGJ1bGxldGlucyBmcm9tIExpbnV4VXNlciBtYWdhemluZSA8bGludXh1c2VyLnd3dy5saW51eC5vcmcudWs+CitMaXN0LVVuc3Vic2NyaWJlOiA8aHR0cDovL3d3dy5saW51eC5vcmcudWsvbWFpbG1hbi9saXN0aW5mby9saW51eHVzZXI+LAorCTxtCitMaXN0LUFyY2hpdmU6IDxodHRwOi8vd3d3LmxpbnV4Lm9yZy51ay9waXBlcm1haWwvbGludXh1c2VyLz4KK0RhdGU6IEZyaSwgNiBBcHIgMjAwMSAxNjowMzozOSArMDEwMAorCistLUpBQjAzMjI1Ljk4NjU3Nzc4Ni96aW5mYW5kZWwubGFjaXRhLmNvbS0tCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI2LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzMjAzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yNi50eHQKQEAgLTAsMCArMSw0NSBAQAorUmVjZWl2ZWQ6IGZyb20geGNhciBbMTkyLjE2OC4wLjJdIGJ5IGplZXZlcy53b29zdGVyLmxvY2FsDQorICAoU01UUEQzMi03LjA3IEVWQUwpIGlkIEFGRjkyRjAyMTQ7IFN1biwgMTIgTWF5IDIwMDIgMDg6NTU6MzcgKzAxMDANCitEYXRlOiBTdW4sIDEyIE1heSAyMDAyIDA4OjU2OjE1ICswMTAwDQorRnJvbTogRmF0aGVyIFRpbWUgPGZhdGhlci50aW1lQHhjYXIud29vc3Rlci5sb2NhbD4NCitUbzogdGltYm9AamVldmVzLndvb3N0ZXIubG9jYWwNCitTdWJqZWN0OiBJTUFQIGZpbGUgdGVzdA0KK01lc3NhZ2UtSUQ6IDw2ZGY2NWQzNTRiLmZhdGhlci50aW1lQHJwYy53b29zdGVyLmxvY2FsPg0KK1gtT3JnYW5pemF0aW9uOiBIb21lDQorVXNlci1BZ2VudDogTWVzc2VuZ2VyLVByby8yLjUwYSAoTXNnU2VydmUvMS41MCkgKFJJU0MtT1MvNC4wMikgUE9Qc3Rhci8yLjAzDQorTUlNRS1WZXJzaW9uOiAxLjANCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IjE2MTg0OTI4NjAtLTIwNTEzMDExOTAtLTExMzg1MzY4MCINCitTdGF0dXM6IFINCitYLVVJREw6IDMxOTk5ODMwMg0KKw0KK1RoaXMgbWVzc2FnZSBpcyBpbiBNSU1FIGZvcm1hdCB3aGljaCB5b3VyIG1haWxlciBhcHBhcmVudGx5IGRvZXMgbm90IHN1cHBvcnQuDQorWW91IGVpdGhlciByZXF1aXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiB5b3VyIHNvZnR3YXJlIHdoaWNoIHN1cHBvcnRzIE1JTUUsIG9yDQorYSBzZXBhcmF0ZSBNSU1FIGRlY29kaW5nIHV0aWxpdHkuICBBbHRlcm5hdGl2ZWx5LCBhc2sgdGhlIHNlbmRlciBvZiB0aGlzDQorbWVzc2FnZSB0byByZXNlbmQgaXQgaW4gYSBkaWZmZXJlbnQgZm9ybWF0Lg0KKw0KKy0tMTYxODQ5Mjg2MC0tMjA1MTMwMTE5MC0tMTEzODUzNjgwDQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpDQorDQorU2ltcGxlIGVtYWlsIHdpdGggYXR0YWNobWVudC4NCisNCisNCistLTE2MTg0OTI4NjAtLTIwNTEzMDExOTAtLTExMzg1MzY4MA0KK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vcmlzY29zOyBuYW1lPSJjbG9jay5ibXAsNjljIjsgdHlwZT1CTVA7IGxvYWQ9JmZmZjY5YzRiOyBleGVjPSYzNTVkZDRkMTsgYWNjZXNzPSYwMw0KK0NvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJjbG9jay5ibXAiDQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQorDQorUWsxMkFnQUFBQUFBQUhZQUFBQW9BQUFBSUFBQUFDQUFBQUFCQUFRQUFBQUFBQUFBQUFEWERRQUExdzBBQUFBQUFBQUENCitBQUFBQUFBQUFBQUFpQUFBaUFBQUFJaUlBSWdBQUFDSUFJZ0FpSWdBQUx1N3V3Q0lpSWdBRVJIZEFDTHVJZ0F6Ly84QQ0KK3pBQUFBTjBSM1FEdTdpSUEvLy8vQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFpM0FBQUFBQUFBQURlQUFBQUFBQUFBDQorQzNBRE16TXpNQU53QUFBQUFBQUFBQUFITUFBQUFBTndBQUFBQUFBQUFBQ0FNQWQzelBmd0F3Z0FBQUFBQUFBSUF3ZC8NCitmOHgvZjNBd2dBQUFBQUFBZ0RCMHgvZjMvL3pQQXdnQUFBQUFBQWNIZk05Ly8vLzh6L0F3QUFBQUFBaXdkL2YzLy8vLw0KKy8vLy9BNEFBQUFBQWNFeC9mLy8vLy8vL3pBTUFBQUFBaXdmTTkvLy8vMy8vLzh6d09BQUFBQWNIZjMvLy8vQi8vLy8vDQorOERBQUFBQUxCL2YzLy8vd2QzZDMvL0F3QUFBQUJ3VFBmLy93Q1FBQUQvekFNQUFBQUFzRXgvZi8vL0IvLy8vOHdEQUENCitBQUFIQjM5Ly8vL3dmLy8vLy9Bd0FBQUFDd2YzOS8vLzhILy8vLy93TUFBQUFJY0hmTTkvLy9CLy8vL004RGdBQUFBQQ0KK3NIVEgvLy93Zi8vL3hBTUFBQUFBQ0hCM2YzLy84SC8vLy9jRGdBQUFBQUFMQjN6SC8vRC8vTTl3TUFBQUFBQUFnTEIwDQorejM5Ly8veEhBd2dBQUFBQUFBZ0xCM2QzUkhkM2NEQ0FBQUFBQUFBQWdMQUhkMFIzY0FNSUFBQUFBQUFBZ0FnTGNBQUENCitBQU13Z0FnQUFBQUFDREFBQUF1N3Q3Y3dBQWdEZ0FBQUFBQnpjSUFBQUFBQUFBZ0RNd0FBQUFBQU43dXdnQUFBQUFnSA0KK016TUFBQUFBQ0g5N3R6QUFBQUFMdTNjM2dBQUFBQUFMKzd0ekRBQkF1N2Y3Y0FBQUFBQUFDQSszTUE3RVFBdi9zSUFBDQorQUFBQUFBQUlBQUFBQUFBQUFJQUFBQUFBDQorDQorLS0xNjE4NDkyODYwLS0yMDUxMzAxMTkwLS0xMTM4NTM2ODAtLQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yNy50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMTkxNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjcudHh0CkBAIC0wLDAgKzEsMTUgQEAKK1JldHVybi1QYXRoOiA8YXBlcnNvbkBkb20uYWluPgorUmVjZWl2ZWQ6IGJ5IG1haWwuZG9tLmFpbiAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorCWlkIEI5RDBBRDM1REI7IFR1ZSwgIDQgSnVuIDIwMDIgMjE6NDY6NTkgLTA0MDAgKEVEVCkKK01lc3NhZ2UtSUQ6IDwxNTYxMy4yODA1MS43MDcxMjYuNTY5NjkzQGRvbS5haW4+CitEYXRlOiBUdWUsIDQgSnVuIDIwMDIgMjE6NDY6NTkgLTA0MDAKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK1N1YmplY3Q6IGJ1ZyBkZW1vbnN0cmF0aW9uCisJMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKKwltb3JlIHRleHQKK0Zyb206IGFwZXJzb25AZG9tLmFpbiAoQW5uZSBQLiBFcnNvbikKK1RvOiBicGVyc29uQGRvbS5haW4gKEJhcm5leSBQLiBFcnNvbikKKwordGVzdApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI4LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0ODI0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yOC50eHQKQEAgLTAsMCArMSwyNSBAQAorRnJvbTogYXBlcnNvbkBkb20uYWluCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT1CT1VOREFSWQorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorVG86IGFhQGJiLm9yZworRnJvbTogY2NAZGQub3JnCitTdWJqZWN0OiBlZQorCittZXNzYWdlIDEKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK1RvOiBhYUBiYi5vcmcKK0Zyb206IGNjQGRkLm9yZworU3ViamVjdDogZWUKKworbWVzc2FnZSAyCisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI5LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yOS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhYjU2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yOS50eHQKQEAgLTAsMCArMSwyMiBAQAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKKwlpZCAyN0NFQUQzOENDOyBGcmksICA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpOworICAgICB0aXRsZSowKj0idXMtYXNjaWknZW4nVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworICAgICB0aXRsZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKKyAgICAgdGl0bGUqMj0iaXNuJ3QgaXQhIgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MDkwLjYxMzA0LjExMDkyOS40NTY4NEBhYWEuenp6Lm9yZz4KK0Zyb206IGJiYkBkZGQuY29tIChKb2huIFguIERvZSkKK1RvOiBiYmJAenp6Lm9yZworU3ViamVjdDogVGhpcyBpcyBhIHRlc3QgbWVzc2FnZQorRGF0ZTogRnJpLCA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwCisKKworSGksCisKK0RvIHlvdSBsaWtlIHRoaXMgbWVzc2FnZT8KKworLU1lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzAudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzMwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzM0YmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzMwLnR4dApAQCAtMCwwICsxLDIzIEBACitGcm9tOiBhcGVyc29uQGRvbS5haW4KK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PUJPVU5EQVJZCisKKy0tQk9VTkRBUlkKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitUbzogYWFAYmIub3JnCitGcm9tOiBjY0BkZC5vcmcKK1N1YmplY3Q6IGVlCisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorVG86IGFhQGJiLm9yZworRnJvbTogY2NAZGQub3JnCitTdWJqZWN0OiBlZQorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzEudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzMxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTU4ZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzMxLnR4dApAQCAtMCwwICsxLDE1IEBACitGcm9tOiBhcGVyc29uQGRvbS5haW4KK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Qk9VTkRBUllfCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCittZXNzYWdlIDEKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK21lc3NhZ2UgMgorCistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zMi50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZWM1YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzIudHh0CkBAIC0wLDAgKzEsMTQgQEAKK0RlbGl2ZXJlZC1UbzogZnJlZWJzZC1pc3BAZnJlZWJzZC5vcmcKK0RhdGU6IFR1ZSwgMjYgU2VwIDIwMDAgMTI6MjM6MDMgLTA1MDAKK0Zyb206IEFubmUgUGVyc29uIDxhcGVyc29uQGV4YW1wbGUuY29tPgorVG86IEJhcm5leSBEdWRlIDxiZHVkZUBleGFtcGxlLmNvbT4KK1N1YmplY3Q6IFJlOiBMaW1pdGluZyBQZXJsIENQVSBVdGlsaXphdGlvbi4uLgorTWltZS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldCo9YW5zaS14My40LTE5NjgnJ3VzLWFzY2lpCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUKK1VzZXItQWdlbnQ6IE11dHQvMS4zLjhpCitTZW5kZXI6IG93bmVyLWZyZWVic2QtaXNwQEZyZWVCU0QuT1JHCitQcmVjZWRlbmNlOiBidWxrCitYLUxvb3A6IEZyZWVCU0Qub3JnCisKK1NvbWUgbWVzc2FnZS4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zMy50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Mjc4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzMudHh0CkBAIC0wLDAgKzEsMjkgQEAKK0RlbGl2ZXJlZC1UbzogZnJlZWJzZC1pc3BAZnJlZWJzZC5vcmcKK0RhdGU6IFdlZCwgMjcgU2VwIDIwMDAgMTE6MTE6MDkgLTA1MDAKK0Zyb206IEFubmUgUGVyc29uIDxhcGVyc29uQGV4YW1wbGUuY29tPgorVG86IEJhcm5leSBEdWRlIDxiZHVkZUBleGFtcGxlLmNvbT4KK1N1YmplY3Q6IFJlOiBMaW1pdGluZyBQZXJsIENQVSBVdGlsaXphdGlvbi4uLgorTWltZS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3NpZ25lZDsgbWljYWxnKj1hbnNpLXgzLjQtMTk2OCcncGdwLW1kNTsKKwlwcm90b2NvbCo9YW5zaS14My40LTE5NjgnJ2FwcGxpY2F0aW9uJTJGcGdwLXNpZ25hdHVyZTsKKwlib3VuZGFyeSo9ImFuc2kteDMuNC0xOTY4JydFZVFmR3dQY1FTT0pCYVFVIgorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lCitTZW5kZXI6IG93bmVyLWZyZWVic2QtaXNwQEZyZWVCU0QuT1JHCitQcmVjZWRlbmNlOiBidWxrCitYLUxvb3A6IEZyZWVCU0Qub3JnCisKKworLS1FZVFmR3dQY1FTT0pCYVFVCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQqPWFuc2kteDMuNC0xOTY4Jyd1cy1hc2NpaQorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlCisKK3BhcnQgMQorCistLUVlUWZHd1BjUVNPSkJhUVUKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lCisKK3BhcnQgMgorCistLUVlUWZHd1BjUVNPSkJhUVUtLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM0LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zNC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU1ZGZlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zNC50eHQKQEAgLTAsMCArMSwxOSBAQAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PVhZWgorCistLVhZWgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKKworVGhpcyBpcyBhIHRleHQgcGxhaW4gcGFydCB0aGF0IGlzIGNvdW50ZXIgdG8gcmVjb21tZW5kZWQgcHJhY3RpY2UgaW4KK1JGQyAyMDQ2LCAkNS4xLjUsIGJ1dCBpcyBub3QgaWxsZWdhbAorCistLVhZWgorCitGcm9tOiBjcGVyc29uQGRvbS5haW4KK1RvOiBkcGVyc29uQGRvbS5haW4KKworQSBzdWJtZXNzYWdlCisKKy0tWFlaLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zNS50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlN2Q1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzUudHh0CkBAIC0wLDAgKzEsNCBAQAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitTdWJqZWN0OiBoZXJlJ3Mgc29tZXRoaW5nIGludGVyZXN0aW5nCitjb3VudGVyIHRvIFJGQyAyODIyLCB0aGVyZSdzIG5vIHNlcGFyYXRpbmcgbmV3bGluZSBoZXJlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzYudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjMyYzMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM2LnR4dApAQCAtMCwwICsxLDQwIEBACitNaW1lLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBNdWx0aXBhcnQvTWl4ZWQ7IEJvdW5kYXJ5PSJOZXh0UGFydCIKK1RvOiBJRVRGLUFubm91bmNlOjsKK0Zyb206IEludGVybmV0LURyYWZ0c0BpZXRmLm9yZworU3ViamVjdDogSS1EIEFDVElPTjpkcmFmdC1pZXRmLW1ib25lZC1taXgtMDAudHh0CitEYXRlOiBUdWUsIDIyIERlYyAxOTk4IDE2OjU1OjA2IC0wNTAwCisKKy0tTmV4dFBhcnQKKworQmxhaCBibGFoIGJsYWgKKworLS1OZXh0UGFydAorQ29udGVudC1UeXBlOiBNdWx0aXBhcnQvQWx0ZXJuYXRpdmU7IEJvdW5kYXJ5PSJPdGhlckFjY2VzcyIKKworLS1PdGhlckFjY2VzcworQ29udGVudC1UeXBlOiBNZXNzYWdlL0V4dGVybmFsLWJvZHk7CisJYWNjZXNzLXR5cGU9Im1haWwtc2VydmVyIjsKKwlzZXJ2ZXI9Im1haWxzZXJ2QGlldGYub3JnIgorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KK0NvbnRlbnQtSUQ6IDwxOTk4MTIyMjE1MTQwNi5JLURAaWV0Zi5vcmc+CisKK0VOQ09ESU5HIG1pbWUKK0ZJTEUgL2ludGVybmV0LWRyYWZ0cy9kcmFmdC1pZXRmLW1ib25lZC1taXgtMDAudHh0CisKKy0tT3RoZXJBY2Nlc3MKK0NvbnRlbnQtVHlwZTogTWVzc2FnZS9FeHRlcm5hbC1ib2R5OworCW5hbWU9ImRyYWZ0LWlldGYtbWJvbmVkLW1peC0wMC50eHQiOworCXNpdGU9ImZ0cC5pZXRmLm9yZyI7CisJYWNjZXNzLXR5cGU9ImFub24tZnRwIjsKKwlkaXJlY3Rvcnk9ImludGVybmV0LWRyYWZ0cyIKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitDb250ZW50LUlEOiA8MTk5ODEyMjIxNTE0MDYuSS1EQGlldGYub3JnPgorCisKKy0tT3RoZXJBY2Nlc3MtLQorCistLU5leHRQYXJ0LS0KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM3LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4ZDM0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zNy50eHQKQEAgLTAsMCArMSwyMiBAQAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PUFCQ0RFCisKKy0tQUJDREUKK0NvbnRlbnQtVHlwZTogdGV4dC94LW9uZQorCitCbGFoCisKKy0tQUJDREUKKy0tQUJDREUKK0NvbnRlbnQtVHlwZTogdGV4dC94LXR3bworCitCbGFoCisKKy0tQUJDREUKKy0tQUJDREUKKy0tQUJDREUKKy0tQUJDREUKK0NvbnRlbnQtVHlwZTogdGV4dC94LXR3bworCitCbGFoCisKKy0tQUJDREUtLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM4LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2ZGY4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zOC50eHQKQEAgLTAsMCArMSwxMDEgQEAKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tID1fYWFhYWFhYWFhYTAiCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLSA9X2FhYWFhYWFhYWExIgorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuMUBleGFtcGxlLmNvbT4KKworLS0tLS0tLSA9X2FhYWFhYWFhYWExCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsgYm91bmRhcnk9Ii0tLS0tID1fYWFhYWFhYWFhYTIiCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4yQGV4YW1wbGUuY29tPgorCistLS0tLS0tID1fYWFhYWFhYWFhYTIKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuM0BleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHZlcnkgdHJpY2t5CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKKworVW5saWtlIHRoZSB0ZXN0IHRlc3RfbmVzdGVkLW11bHRpcGxlcy13aXRoLWludGVybmFsLWJvdW5kYXJ5LCB0aGlzCitwaWVjZSBvZiB0ZXh0IG5vdCBvbmx5IGNvbnRhaW5zIHRoZSBvdXRlciBib3VuZGFyeSB0YWdzIAorLS0tLS0tLSA9X2FhYWFhYWFhYWExIAorYW5kIAorLS0tLS0tLSA9X2FhYWFhYWFhYWEwIAorYnV0IHB1dHMgdGhlbSBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lISBBbmQsIHRvIGJlIGV2ZW4gbmFzdGllciwgaXQKK2V2ZW4gaW5jbHVkZXMgYSBjb3VwbGUgb2YgZW5kIHRhZ3MsIHN1Y2ggYXMgdGhpcyBvbmU6CisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMS0tCisKK2FuZCB0aGlzIG9uZSwgd2hpY2ggaXMgZnJvbSBhIG11bHRpcGFydCB3ZSBoYXZlbid0IGV2ZW4gc2VlbiB5ZXQhCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhNC0tCisKK1RoaXMgd2lsbCwgSSdtIHN1cmUsIGNhdXNlIG11Y2ggYnJlYWthZ2Ugb2YgTUlNRSBwYXJzZXJzLiBCdXQsIGFzIAorZmFyIGFzIEkgY2FuIHRlbGwsIGl0J3MgcGVyZmVjdGx5IGxlZ2FsLiBJIGhhdmUgbm90IHlldCBldmVyIHNlZW4KK2EgY2FzZSBvZiB0aGlzIGluIHRoZSB3aWxkLCBidXQgSSd2ZSBzZWVuICpzaW1pbGFyKiB0aGluZ3MuCisKKworLS0tLS0tLSA9X2FhYWFhYWFhYWEyCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuNEBleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoMgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTItLQorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMyIKK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjZAZXhhbXBsZS5jb20+CisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMworQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjdAZXhhbXBsZS5jb20+CitDb250ZW50LURlc2NyaXB0aW9uOiBwYXRjaDMKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCitYWFgKKworLS0tLS0tLSA9X2FhYWFhYWFhYWEzCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuOEBleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoNAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTMtLQorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhNCIKK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjEwQGV4YW1wbGUuY29tPgorCistLS0tLS0tID1fYWFhYWFhYWFhYTQKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xMUBleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoNQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTQKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xMkBleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoNgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTQtLQorCistLS0tLS0tID1fYWFhYWFhYWFhYTEtLQorCistLS0tLS0tID1fYWFhYWFhYWFhYTAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xNUBleGFtcGxlLmNvbT4KKworLS0KK0l0J3MgbmV2ZXIgdG9vIGxhdGUgdG8gaGF2ZSBhIGhhcHB5IGNoaWxkaG9vZC4KKworLS0tLS0tLSA9X2FhYWFhYWFhYWEwLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zOS50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNGIyNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzkudHh0CkBAIC0wLDAgKzEsODMgQEAKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tID1fYWFhYWFhYWFhYTAiCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLSA9X2FhYWFhYWFhYWExIgorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuMUBleGFtcGxlLmNvbT4KKworLS0tLS0tLSA9X2FhYWFhYWFhYWExCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsgYm91bmRhcnk9Ii0tLS0tID1fYWFhYWFhYWFhYTEiCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4yQGV4YW1wbGUuY29tPgorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4zQGV4YW1wbGUuY29tPgorQ29udGVudC1EZXNjcmlwdGlvbjogcGF0Y2gxCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWFhYCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMQorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjRAZXhhbXBsZS5jb20+CitDb250ZW50LURlc2NyaXB0aW9uOiBwYXRjaDIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCitYWFgKKworLS0tLS0tLSA9X2FhYWFhYWFhYWExLS0KKworLS0tLS0tLSA9X2FhYWFhYWFhYWExCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsgYm91bmRhcnk9Ii0tLS0tID1fYWFhYWFhYWFhYTEiCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS42QGV4YW1wbGUuY29tPgorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS43QGV4YW1wbGUuY29tPgorQ29udGVudC1EZXNjcmlwdGlvbjogcGF0Y2gzCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWFhYCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMQorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjhAZXhhbXBsZS5jb20+CitDb250ZW50LURlc2NyaXB0aW9uOiBwYXRjaDQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCitYWFgKKworLS0tLS0tLSA9X2FhYWFhYWFhYWExLS0KKworLS0tLS0tLSA9X2FhYWFhYWFhYWExCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsgYm91bmRhcnk9Ii0tLS0tID1fYWFhYWFhYWFhYTEiCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xMEBleGFtcGxlLmNvbT4KKworLS0tLS0tLSA9X2FhYWFhYWFhYWExCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuMTFAZXhhbXBsZS5jb20+CitDb250ZW50LURlc2NyaXB0aW9uOiBwYXRjaDUKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCitYWFgKKworLS0tLS0tLSA9X2FhYWFhYWFhYWExCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuMTJAZXhhbXBsZS5jb20+CitDb250ZW50LURlc2NyaXB0aW9uOiBwYXRjaDYKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCitYWFgKKworLS0tLS0tLSA9X2FhYWFhYWFhYWExLS0KKworLS0tLS0tLSA9X2FhYWFhYWFhYWExLS0KKworLS0tLS0tLSA9X2FhYWFhYWFhYWEwCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuMTVAZXhhbXBsZS5jb20+CisKKy0tCitJdCdzIG5ldmVyIHRvbyBsYXRlIHRvIGhhdmUgYSBoYXBweSBjaGlsZGhvb2QuCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMC0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDAudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDM1ZmExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQwLnR4dApAQCAtMCwwICsxLDEwIEBACitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGJvdW5kYXJ5PSItLTk2MTI4NDIzNjU1MjUyMjI2OSIKKworLS0tLTk2MTI4NDIzNjU1MjUyMjI2OQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Qml0CisKKzxodG1sPjwvaHRtbD4KKworLS0tLTk2MTI4NDIzNjU1MjUyMjI2OS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDEudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmNkZDFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQxLnR4dApAQCAtMCwwICsxLDggQEAKK0Zyb206ICJBbGxpc29uIER1bmxhcCIgPHh4eEBleGFtcGxlLmNvbT4KK1RvOiB5eXlAZXhhbXBsZS5jb20KK1N1YmplY3Q6IDY0NDIzCitEYXRlOiBTdW4sIDExIEp1bCAyMDA0IDE2OjA5OjI3IC0wMzAwCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7CisKK0JsYWggYmxhaCBibGFoCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDIudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzVmOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQyLnR4dApAQCAtMCwwICsxLDIwIEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkFBQSIKK0Zyb206IE1haWwgRGVsaXZlcnkgU3Vic3lzdGVtIDx4eHhAZXhhbXBsZS5jb20+CitUbzogeXl5QGV4YW1wbGUuY29tCisKK1RoaXMgaXMgYSBNSU1FLWVuY2Fwc3VsYXRlZCBtZXNzYWdlCisKKy0tQUFBCisKK1N0dWZmCisKKy0tQUFBCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCisKK0Zyb206IHdlYm1hc3RlckBweXRob24ub3JnCitUbzogenp6QGV4YW1wbGUuY29tCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJCQiIKKworLS1CQkItLQorCistLUFBQS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDMudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTdkMTJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQzLnR4dApAQCAtMCwwICsxLDIxNyBAQAorRnJvbSBTUlMwPWFPL3A9T049YmFnLnB5dGhvbi5vcmc9Tm9uZUBib3VuY2UyLnBvYm94LmNvbSAgRnJpIE5vdiAyNiAyMTo0MDozNiAyMDA0CitYLVZNLXY1LURhdGE6IChbbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWxdCisJW25pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCAiTUFJTEVSIERBRU1PTiA8PiIgIk1BSUxFUiBEQUVNT04gPD4iIG5pbCBuaWwgIkJhbm5lZCBmaWxlOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQgaW4gbWFpbCBmcm9tIHlvdSIgIl5Gcm9tOiIgbmlsIG5pbCBuaWwgbmlsICJCYW5uZWQgZmlsZTogYXV0b19fbWFpbC5weXRob24uYmF0IGluIG1haWwgZnJvbSB5b3UiIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0KKwluaWwpCitNSU1FLVZlcnNpb246IDEuMAorTWVzc2FnZS1JZDogPGVkYWIuNzgwNGY1Y2I4MDcwQHB5dGhvbi5vcmc+CitDb250ZW50LVR5cGU6IG11bHRpcGFydC9yZXBvcnQ7IHJlcG9ydC10eXBlPWRlbGl2ZXJ5LXN0YXR1czsKKyAgICBjaGFyc2V0PXV0Zi04OworICAgIGJvdW5kYXJ5PSItLS0tLS0tLS0tPV8xMTAxNTI2OTA0LTE5NTYtNSIKK1gtVmlydXMtU2Nhbm5lZDogYnkgWFM0QUxMIFZpcnVzIFNjYW5uZXIKK1gtVUlETDogNFxHISEhPGMiIVVWWyIhTTdDISEKK0Zyb206IE1BSUxFUiBEQUVNT04gPD4KK1RvOiA8d2VibWFzdGVyQHB5dGhvbi5vcmc+CitTdWJqZWN0OiBCYW5uZWQgZmlsZTogYXV0b19fbWFpbC5weXRob24uYmF0IGluIG1haWwgZnJvbSB5b3UKK0RhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworVGhpcyBpcyBhIG11bHRpLXBhcnQgbWVzc2FnZSBpbiBNSU1FIGZvcm1hdC4uLgorCistLS0tLS0tLS0tLS09XzExMDE1MjY5MDQtMTk1Ni01CitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InV0Zi04IgorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK0JBTk5FRCBGSUxFTkFNRSBBTEVSVAorCitZb3VyIG1lc3NhZ2UgdG86IHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4QGRvdC5jYS5nb3YsIHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eEBkb3QuY2EuZ292LCB4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHh4eHh4eHhAZG90LmNhLmdvdgord2FzIGJsb2NrZWQgYnkgb3VyIFNwYW0gRmlyZXdhbGwuIFRoZSBlbWFpbCB5b3Ugc2VudCB3aXRoIHRoZSBmb2xsb3dpbmcgc3ViamVjdCBoYXMgTk9UIEJFRU4gREVMSVZFUkVEOgorCitTdWJqZWN0OiBEZWxpdmVyeV9mYWlsdXJlX25vdGljZQorCitBbiBhdHRhY2htZW50IGluIHRoYXQgbWFpbCB3YXMgb2YgYSBmaWxlIHR5cGUgdGhhdCB0aGUgU3BhbSBGaXJld2FsbCBpcyBzZXQgdG8gYmxvY2suCisKKworCistLS0tLS0tLS0tLS09XzExMDE1MjY5MDQtMTk1Ni01CitDb250ZW50LVR5cGU6IG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK0NvbnRlbnQtRGVzY3JpcHRpb246IERlbGl2ZXJ5IGVycm9yIHJlcG9ydAorCitSZXBvcnRpbmctTVRBOiBkbnM7IHNhY3NwYW0wMS5kb3QuY2EuZ292CitSZWNlaXZlZC1Gcm9tLU1UQTogc210cDsgc2Fjc3BhbTAxLmRvdC5jYS5nb3YgKFsxMjcuMC4wLjFdKQorQXJyaXZhbC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCistLS0tLS0tLS0tLS09XzExMDE1MjY5MDQtMTk1Ni01CitDb250ZW50LVR5cGU6IHRleHQvcmZjODIyLWhlYWRlcnMKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorQ29udGVudC1EZXNjcmlwdGlvbjogVW5kZWxpdmVyZWQtbWVzc2FnZSBoZWFkZXJzCisKK1JlY2VpdmVkOiBmcm9tIGtnc2F2Lm9yZyAocHBwLTcwLTI0Mi0xNjItNjMuZHNsLnNwZmRtby5zd2JlbGwubmV0IFs3MC4yNDIuMTYyLjYzXSkKKwlieSBzYWNzcGFtMDEuZG90LmNhLmdvdiAoU3BhbSBGaXJld2FsbCkgd2l0aCBTTVRQCisJaWQgQTIzMkFEMDNERTNBOyBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjM1IC0wODAwIChQU1QpCitGcm9tOiB3ZWJtYXN0ZXJAcHl0aG9uLm9yZworVG86IHh4eHh4QGRvdC5jYS5nb3YKK0RhdGU6IFNhdCwgMjcgTm92IDIwMDQgMDM6MzU6MzAgVVRDCitTdWJqZWN0OiBEZWxpdmVyeV9mYWlsdXJlX25vdGljZQorSW1wb3J0YW5jZTogTm9ybWFsCitYLVByaW9yaXR5OiAzIChOb3JtYWwpCitYLU1TTWFpbC1Qcmlvcml0eTogTm9ybWFsCitNZXNzYWdlLUlEOiA8ZWRhYi43ODA0ZjVjYjgwNzBAcHl0aG9uLm9yZz4KK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ij09PT02N2JkMmI3YTUuZjk5ZjciCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKKy0tLS0tLS0tLS0tLT1fMTEwMTUyNjkwNC0xOTU2LTUtLQorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDQudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQ0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWEyMjUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQ0LnR4dApAQCAtMCwwICsxLDMzIEBACitSZXR1cm4tUGF0aDogPGJhcnJ5QHB5dGhvbi5vcmc+CitEZWxpdmVyZWQtVG86IGJhcnJ5QHB5dGhvbi5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnB5dGhvbi5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKKwlpZCBDMkJGMEQzN0M2OyBUdWUsIDExIFNlcCAyMDAxIDAwOjA1OjA1IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJoOTBWSUlJS214IgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MjYxLjM2MjA5LjM1ODg0Ni4xMTg2NzRAYW50aGVtLnB5dGhvbi5vcmc+CitGcm9tOiBiYXJyeUBweXRob24ub3JnIChCYXJyeSBBLiBXYXJzYXcpCitUbzogYmFycnlAcHl0aG9uLm9yZworU3ViamVjdDogYSBzaW1wbGUgbXVsdGlwYXJ0CitEYXRlOiBUdWUsIDExIFNlcCAyMDAxIDAwOjA1OjA1IC0wNDAwCitYLU1haWxlcjogVk0gNi45NSB1bmRlciAyMS40IChwYXRjaCA0KSAiQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2UiIFhFbWFjcyBMdWNpZAorWC1BdHRyaWJ1dGlvbjogQkFXCitYLU9ibGlxdWUtU3RyYXRlZ3k6IE1ha2UgYSBkb29yIGludG8gYSB3aW5kb3cKKworCistLWg5MFZJSUlLbXgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgbmFtZT0ibXNnLnR4dCIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworYSBzaW1wbGUga2luZCBvZiBtaXJyb3IKK3RvIHJlZmxlY3QgdXBvbiBvdXIgb3duCisKKy0taDkwVklJSUtteAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBuYW1lPSJtc2cudHh0IgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCithIHNpbXBsZSBraW5kIG9mIG1pcnJvcgordG8gcmVmbGVjdCB1cG9uIG91ciBvd24KKworLS1oOTBWSUlJS214LS0KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQ1LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ180NS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThmZGU5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ180NS50eHQKQEAgLTAsMCArMSwzMyBAQAorRnJvbTogPGZvb0BiYXIuYmF6PgorVG86IDxiYXpAYmFyLmZvbz4KK1N1YmplY3Q6IHRlc3QKK1gtTG9uZy1MaW5lOiBTb21lIHJlYWxseSBsb25nIGxpbmUgY29udGFpbnMgYSBsb3Qgb2YgdGV4dCBhbmQgdGh1cyBoYXMgdG8gYmUgcmV3cmFwcGVkIGJlY2F1c2UgaXQgaXMgc29tZQorCXJlYWxseSBsb25nCisgICAgICAgIGxpbmUKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9zaWduZWQ7IGJvdW5kYXJ5PSJib3JkZXJsaW5lIjsKKwlwcm90b2NvbD0iYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZSI7IG1pY2FsZz1wZ3Atc2hhMQorCitUaGlzIGlzIGFuIE9wZW5QR1AvTUlNRSBzaWduZWQgbWVzc2FnZSAoUkZDIDI0NDAgYW5kIDMxNTYpCistLWJvcmRlcmxpbmUKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorWC1Mb25nLUxpbmU6IEFub3RoZXIgcmVhbGx5IGxvbmcgbGluZSBjb250YWlucyBhIGxvdCBvZiB0ZXh0IGFuZCB0aHVzIGhhcyB0byBiZSByZXdyYXBwZWQgYmVjYXVzZSBpdCBpcyBhbm90aGVyCisJcmVhbGx5IGxvbmcKKyAgICAgICAgbGluZQorCitUaGlzIGlzIHRoZSBzaWduZWQgY29udGVudHMuCisKKy0tYm9yZGVybGluZQorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9wZ3Atc2lnbmF0dXJlOyBuYW1lPSJzaWduYXR1cmUuYXNjIgorQ29udGVudC1EZXNjcmlwdGlvbjogT3BlblBHUCBkaWdpdGFsIHNpZ25hdHVyZQorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9InNpZ25hdHVyZS5hc2MiCisKKy0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tCitWZXJzaW9uOiBHbnVQRyB2Mi4wLjYgKEdOVS9MaW51eCkKKworaUQ4REJRRkcwM3ZvUmhwNm80bTlkRnNSQXBTWkFLQ0NBTjNJa0psVlJnNk52QWlNSGx2dkl1TUdQUUNlTFp0agorRkd3Zm5SSEZCRk8vUzQvREt5c20wbEk9Cis9dDcrcworLS0tLS1FTkQgUEdQIFNJR05BVFVSRS0tLS0tCisKKy0tYm9yZGVybGluZS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDYudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQ2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTIyYzRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQ2LnR4dApAQCAtMCwwICsxLDIzIEBACitSZXR1cm4tUGF0aDogPHNlbmRlckBleGFtcGxlLm5ldD4KK0RlbGl2ZXJ5LURhdGU6IE1vbiwgMDggRmViIDIwMTAgMTQ6MDU6MTYgKzAxMDAKK1JlY2VpdmVkOiBmcm9tIGV4YW1wbGUub3JnIChleGFtcGxlLm9yZyBbNjQuNS41My41OF0pCisgICAgYnkgZXhhbXBsZS5uZXQgKG5vZGU9bXhiYXAyKSB3aXRoIEVTTVRQIChOZW1lc2lzKQorICAgIGlkIFVOSVFVRSBmb3Igc29tZW9uZUBleGFtcGxlLmNvbTsgTW9uLCAwOCBGZWIgMjAxMCAxNDowNToxNiArMDEwMAorRGF0ZTogTW9uLCAwMSBGZWIgMjAxMCAxMjoyMToxNiArMDEwMAorRnJvbTogIlNlbmRlciIgPHNlbmRlckBleGFtcGxlLm5ldD4KK1RvOiA8c29tZW9uZUBleGFtcGxlLmNvbT4KK1N1YmplY3Q6IEdyb3Vwd2lzZUZvcndhcmRpbmdUZXN0CitNaW1lLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorCitSZXR1cm4tcGF0aDogPHNlbmRlckBleGFtcGxlLm5ldD4KK01lc3NhZ2UtSUQ6IDw0QjY2Qjg5MC40MDcwNDA4QHRlY29uY2VwdC5kZT4KK0RhdGU6IE1vbiwgMDEgRmViIDIwMTAgMTI6MTg6NDAgKzAxMDAKK0Zyb206ICJEci4gU2VuZGVyIiA8c2VuZGVyQGV4YW1wbGUubmV0PgorTUlNRS1WZXJzaW9uOiAxLjAKK1RvOiAiUmVjaXBpZW50IiA8cmVjaXBpZW50QGV4YW1wbGUuY29tPgorU3ViamVjdDogR3JvdXB3aXNlRm9yd2FyZGluZ1Rlc3QKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1JU08tODg1OS0xNQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitUZXN0aW5nIGVtYWlsIGZvcndhcmRpbmcgd2l0aCBHcm91cHdpc2UgMS4yLjIwMTAKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyZGE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5CkBAIC0wLDAgKzEsMzU1OCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworIyBlbWFpbCBwYWNrYWdlIHVuaXQgdGVzdHMKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IGJhc2U2NAoraW1wb3J0IGRpZmZsaWIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCitpbXBvcnQgdGV4dHdyYXAKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitpbXBvcnQgZW1haWwKKworZnJvbSBlbWFpbC5DaGFyc2V0IGltcG9ydCBDaGFyc2V0Citmcm9tIGVtYWlsLkhlYWRlciBpbXBvcnQgSGVhZGVyLCBkZWNvZGVfaGVhZGVyLCBtYWtlX2hlYWRlcgorZnJvbSBlbWFpbC5QYXJzZXIgaW1wb3J0IFBhcnNlciwgSGVhZGVyUGFyc2VyCitmcm9tIGVtYWlsLkdlbmVyYXRvciBpbXBvcnQgR2VuZXJhdG9yLCBEZWNvZGVkR2VuZXJhdG9yCitmcm9tIGVtYWlsLk1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKK2Zyb20gZW1haWwuTUlNRUF1ZGlvIGltcG9ydCBNSU1FQXVkaW8KK2Zyb20gZW1haWwuTUlNRVRleHQgaW1wb3J0IE1JTUVUZXh0Citmcm9tIGVtYWlsLk1JTUVJbWFnZSBpbXBvcnQgTUlNRUltYWdlCitmcm9tIGVtYWlsLk1JTUVCYXNlIGltcG9ydCBNSU1FQmFzZQorZnJvbSBlbWFpbC5NSU1FTWVzc2FnZSBpbXBvcnQgTUlNRU1lc3NhZ2UKK2Zyb20gZW1haWwuTUlNRU11bHRpcGFydCBpbXBvcnQgTUlNRU11bHRpcGFydAorZnJvbSBlbWFpbCBpbXBvcnQgVXRpbHMKK2Zyb20gZW1haWwgaW1wb3J0IEVycm9ycworZnJvbSBlbWFpbCBpbXBvcnQgRW5jb2RlcnMKK2Zyb20gZW1haWwgaW1wb3J0IEl0ZXJhdG9ycworZnJvbSBlbWFpbCBpbXBvcnQgYmFzZTY0TUlNRQorZnJvbSBlbWFpbCBpbXBvcnQgcXVvcHJpTUlNRQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBmaW5kZmlsZSwgcnVuX3VuaXR0ZXN0Citmcm9tIGVtYWlsLnRlc3QgaW1wb3J0IF9fZmlsZV9fIGFzIGxhbmRtYXJrCisKKworTkwgPSAnXG4nCitFTVBUWVNUUklORyA9ICcnCitTUEFDRSA9ICcgJworCisKKworZGVmIG9wZW5maWxlKGZpbGVuYW1lLCBtb2RlPSdyJyk6CisgICAgcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUobGFuZG1hcmspLCAnZGF0YScsIGZpbGVuYW1lKQorICAgIHJldHVybiBvcGVuKHBhdGgsIG1vZGUpCisKKworCisjIEJhc2UgdGVzdCBjbGFzcworY2xhc3MgVGVzdEVtYWlsQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIG5kaWZmQXNzZXJ0RXF1YWwoc2VsZiwgZmlyc3QsIHNlY29uZCk6CisgICAgICAgICIiIkxpa2UgYXNzZXJ0RXF1YWwgZXhjZXB0IHVzZSBuZGlmZiBmb3IgcmVhZGFibGUgb3V0cHV0LiIiIgorICAgICAgICBpZiBmaXJzdCAhPSBzZWNvbmQ6CisgICAgICAgICAgICBzZmlyc3QgPSBzdHIoZmlyc3QpCisgICAgICAgICAgICBzc2Vjb25kID0gc3RyKHNlY29uZCkKKyAgICAgICAgICAgIGRpZmYgPSBkaWZmbGliLm5kaWZmKHNmaXJzdC5zcGxpdGxpbmVzKCksIHNzZWNvbmQuc3BsaXRsaW5lcygpKQorICAgICAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgICAgICBwcmludCA+PiBmcCwgTkwsIE5MLmpvaW4oZGlmZikKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgZnAuZ2V0dmFsdWUoKQorCisgICAgZGVmIF9tc2dvYmooc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmcCA9IG9wZW5maWxlKGZpbmRmaWxlKGZpbGVuYW1lKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHJldHVybiBtc2cKKworCisKKyMgVGVzdCB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIE1lc3NhZ2UgY2xhc3MncyBBUEkKK2NsYXNzIFRlc3RNZXNzYWdlQVBJKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2dldF9hbGwoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yMC50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2FsbCgnY2MnKSwgWydjY2NAenp6Lm9yZycsICdkZGRAenp6Lm9yZycsICdlZWVAenp6Lm9yZyddKQorICAgICAgICBlcShtc2cuZ2V0X2FsbCgneHgnLCAnbi9hJyksICduL2EnKQorCisgICAgZGVmIHRlc3RfZ2V0c2V0X2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgZXEobXNnLmdldF9jaGFyc2V0KCksIE5vbmUpCisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KCdpc28tODg1OS0xJykKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KGNoYXJzZXQpCisgICAgICAgIGVxKG1zZ1snbWltZS12ZXJzaW9uJ10sICcxLjAnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xIicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ2lzby04ODU5LTEnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1b3RlZC1wcmludGFibGUnKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAnaXNvLTg4NTktMScpCisgICAgICAgICMgUmVtb3ZlIHRoZSBjaGFyc2V0CisgICAgICAgIG1zZy5zZXRfY2hhcnNldChOb25lKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKSwgTm9uZSkKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW4nKQorICAgICAgICAjIFRyeSBhZGRpbmcgYSBjaGFyc2V0IHdoZW4gdGhlcmUncyBhbHJlYWR5IE1JTUUgaGVhZGVycyBwcmVzZW50CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ01JTUUtVmVyc2lvbiddID0gJzIuMCcKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0L3gtd2VpcmQnCisgICAgICAgIG1zZ1snQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddID0gJ3F1aW50ZWQtcHVudGFibGUnCisgICAgICAgIG1zZy5zZXRfY2hhcnNldChjaGFyc2V0KQorICAgICAgICBlcShtc2dbJ21pbWUtdmVyc2lvbiddLCAnMi4wJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQveC13ZWlyZDsgY2hhcnNldD0iaXNvLTg4NTktMSInKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1aW50ZWQtcHVudGFibGUnKQorCisgICAgZGVmIHRlc3Rfc2V0X2NoYXJzZXRfZnJvbV9zdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KCd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLmlucHV0X2NoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSInKQorCisgICAgZGVmIHRlc3Rfc2V0X3BheWxvYWRfd2l0aF9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ1RoaXMgaXMgYSBzdHJpbmcgcGF5bG9hZCcsIGNoYXJzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jaGFyc2V0KCkuaW5wdXRfY2hhcnNldCwgJ2lzby04ODU5LTEnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NoYXJzZXRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wOC50eHQnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoKQorICAgICAgICBlcShjaGFyc2V0cywgW05vbmUsICd1cy1hc2NpaScsICdpc28tODg1OS0xJywgJ2lzby04ODU5LTInLCAna29pOC1yJ10pCisKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDkudHh0JykKKyAgICAgICAgY2hhcnNldHMgPSBtc2cuZ2V0X2NoYXJzZXRzKCdkaW5nYmF0JykKKyAgICAgICAgZXEoY2hhcnNldHMsIFsnZGluZ2JhdCcsICd1cy1hc2NpaScsICdpc28tODg1OS0xJywgJ2RpbmdiYXQnLAorICAgICAgICAgICAgICAgICAgICAgICdrb2k4LXInXSkKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xMi50eHQnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoKQorICAgICAgICBlcShjaGFyc2V0cywgW05vbmUsICd1cy1hc2NpaScsICdpc28tODg1OS0xJywgTm9uZSwgJ2lzby04ODU5LTInLAorICAgICAgICAgICAgICAgICAgICAgICdpc28tODg1OS0zJywgJ3VzLWFzY2lpJywgJ2tvaTgtciddKQorCisgICAgZGVmIHRlc3RfZ2V0X2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBmaWxlbmFtZXMgPSBbcC5nZXRfZmlsZW5hbWUoKSBmb3IgcCBpbiBtc2cuZ2V0X3BheWxvYWQoKV0KKyAgICAgICAgZXEoZmlsZW5hbWVzLCBbJ21zZy50eHQnLCAnbXNnLnR4dCddKQorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA3LnR4dCcpCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoc3VicGFydC5nZXRfZmlsZW5hbWUoKSwgJ2Rpbmd1c2Zpc2guZ2lmJykKKworICAgIGRlZiB0ZXN0X2dldF9maWxlbmFtZV93aXRoX25hbWVfcGFyYW1ldGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180NC50eHQnKQorICAgICAgICBmaWxlbmFtZXMgPSBbcC5nZXRfZmlsZW5hbWUoKSBmb3IgcCBpbiBtc2cuZ2V0X3BheWxvYWQoKV0KKyAgICAgICAgZXEoZmlsZW5hbWVzLCBbJ21zZy50eHQnLCAnbXNnLnR4dCddKQorCisgICAgZGVmIHRlc3RfZ2V0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDcudHh0JykKKyAgICAgICAgIyBObyBxdW90ZXMhCisgICAgICAgIGVxKG1zZy5nZXRfYm91bmRhcnkoKSwgJ0JPVU5EQVJZJykKKworICAgIGRlZiB0ZXN0X3NldF9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgVGhpcyBvbmUgaGFzIG5vIGV4aXN0aW5nIGJvdW5kYXJ5IHBhcmFtZXRlciwgYnV0IHRoZSBDb250ZW50LVR5cGU6CisgICAgICAgICMgaGVhZGVyIGFwcGVhcnMgZmlmdGguCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIG1zZy5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgaGVhZGVyLCB2YWx1ZSA9IG1zZy5pdGVtcygpWzRdCisgICAgICAgIGVxKGhlYWRlci5sb3dlcigpLCAnY29udGVudC10eXBlJykKKyAgICAgICAgZXEodmFsdWUsICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSI7IGJvdW5kYXJ5PSJCT1VOREFSWSInKQorICAgICAgICAjIFRoaXMgb25lIGhhcyBhIENvbnRlbnQtVHlwZTogaGVhZGVyLCB3aXRoIGEgYm91bmRhcnksIHN0dWNrIGluIHRoZQorICAgICAgICAjIG1pZGRsZSBvZiBpdHMgaGVhZGVycy4gIE1ha2Ugc3VyZSB0aGUgb3JkZXIgaXMgcHJlc2VydmVkOyBpdCBzaG91bGQKKyAgICAgICAgIyBiZSBmaWZ0aC4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDQudHh0JykKKyAgICAgICAgbXNnLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBoZWFkZXIsIHZhbHVlID0gbXNnLml0ZW1zKClbNF0KKyAgICAgICAgZXEoaGVhZGVyLmxvd2VyKCksICdjb250ZW50LXR5cGUnKQorICAgICAgICBlcSh2YWx1ZSwgJ211bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIicpCisgICAgICAgICMgQW5kIHRoaXMgb25lIGhhcyBubyBDb250ZW50LVR5cGU6IGhlYWRlciBhdCBhbGwuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVycm9ycy5IZWFkZXJQYXJzZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc2V0X2JvdW5kYXJ5LCAnQk9VTkRBUlknKQorCisgICAgZGVmIHRlc3RfbWFrZV9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgbXNnID0gTUlNRU11bHRpcGFydCgnZm9ybS1kYXRhJykKKyAgICAgICAgIyBOb3RlIHRoYXQgd2hlbiB0aGUgYm91bmRhcnkgZ2V0cyBjcmVhdGVkIGlzIGFuIGltcGxlbWVudGF0aW9uCisgICAgICAgICMgZGV0YWlsIGFuZCBtaWdodCBjaGFuZ2UuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLml0ZW1zKClbMF1bMV0sICdtdWx0aXBhcnQvZm9ybS1kYXRhJykKKyAgICAgICAgIyBUcmlnZ2VyIGNyZWF0aW9uIG9mIGJvdW5kYXJ5CisgICAgICAgIG1zZy5hc19zdHJpbmcoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5pdGVtcygpWzBdWzFdWzozM10sCisgICAgICAgICAgICAgICAgICAgICAgICAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9Ij09JykKKyAgICAgICAgIyBYWFg6IHRoZXJlIG91Z2h0IHRvIGJlIHRlc3RzIG9mIHRoZSB1bmlxdWVuZXNzIG9mIHRoZSBib3VuZGFyeSwgdG9vLgorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9yZmM4MjJfb25seShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA3OTcwOiBtZXNzYWdlL3JmYzgyMiBub3QgaW4gbXVsdGlwYXJ0IHBhcnNlZCBieQorICAgICAgICAjIEhlYWRlclBhcnNlciBjYXVzZWQgYW4gZXhjZXB0aW9uIHdoZW4gZmxhdHRlbmVkLgorICAgICAgICBmcCA9IG9wZW5maWxlKGZpbmRmaWxlKCdtc2dfNDYudHh0JykpCisgICAgICAgIG1zZ2RhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgcGFyc2VyID0gZW1haWwuUGFyc2VyLkhlYWRlclBhcnNlcigpCisgICAgICAgIG1zZyA9IHBhcnNlci5wYXJzZXN0cihtc2dkYXRhKQorICAgICAgICBvdXQgPSBTdHJpbmdJTygpCisgICAgICAgIGdlbiA9IGVtYWlsLkdlbmVyYXRvci5HZW5lcmF0b3Iob3V0LCBUcnVlLCAwKQorICAgICAgICBnZW4uZmxhdHRlbihtc2csIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLCBtc2dkYXRhKQorCisgICAgZGVmIHRlc3RfZ2V0X2RlY29kZWRfcGF5bG9hZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzEwLnR4dCcpCisgICAgICAgICMgVGhlIG91dGVyIG1lc3NhZ2UgaXMgYSBtdWx0aXBhcnQKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgTm9uZSkKKyAgICAgICAgIyBTdWJwYXJ0IDEgaXMgN2JpdCBlbmNvZGVkCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksCisgICAgICAgICAgICdUaGlzIGlzIGEgN2JpdCBlbmNvZGVkIG1lc3NhZ2UuXG4nKQorICAgICAgICAjIFN1YnBhcnQgMiBpcyBxdW9wcmkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDEpLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1x4YTFUaGlzIGlzIGEgUXVvdGVkIFByaW50YWJsZSBlbmNvZGVkIG1lc3NhZ2UhXG4nKQorICAgICAgICAjIFN1YnBhcnQgMyBpcyBiYXNlNjQKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDIpLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaXMgYSBCYXNlNjQgZW5jb2RlZCBtZXNzYWdlLicpCisgICAgICAgICMgU3VicGFydCA0IGlzIGJhc2U2NCB3aXRoIGEgdHJhaWxpbmcgbmV3bGluZSwgd2hpY2gKKyAgICAgICAgIyB1c2VkIHRvIGJlIHN0cmlwcGVkIChpc3N1ZSA3MTQzKS4KKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDMpLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaXMgYSBCYXNlNjQgZW5jb2RlZCBtZXNzYWdlLlxuJykKKyAgICAgICAgIyBTdWJwYXJ0IDUgaGFzIG5vIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGhlYWRlci4KKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDQpLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaGFzIG5vIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGhlYWRlci5cbicpCisKKyAgICBkZWYgdGVzdF9nZXRfZGVjb2RlZF91dV9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnYmVnaW4gNjY2IC1cbis6JjVMOyZcXEA9Vl1SOyYwIFxuIFxuZW5kXG4nKQorICAgICAgICBmb3IgY3RlIGluICgneC11dWVuY29kZScsICd1dWVuY29kZScsICd1dWUnLCAneC11dWUnKToKKyAgICAgICAgICAgIG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddID0gY3RlCisgICAgICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCAnaGVsbG8gd29ybGQnKQorICAgICAgICAjIE5vdyB0cnkgc29tZSBib2d1cyBkYXRhCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnZm9vJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgJ2ZvbycpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVfYm9ndXNfdXVfcGF5bG9hZF9xdWlldGx5KHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdiZWdpbiA2NjQgZm9vLnR4dFxuJTxXMUY9MDAwMEggXG4gXG5lbmRcbicpCisgICAgICAgIG1zZ1snQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddID0gJ3gtdXVlbmNvZGUnCisgICAgICAgIG9sZF9zdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgICAgICAjIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHBheWxvYWQKKyAgICAgICAgICAgIG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBvbGRfc3RkZXJyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2ZwLmdldHZhbHVlKCksICcnKQorCisgICAgZGVmIHRlc3RfZGVjb2RlZF9nZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNy50eHQnKQorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMTcudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gRGVjb2RlZEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzLmdldHZhbHVlKCksIHRleHQpCisKKyAgICBkZWYgdGVzdF9fY29udGFpbnNfXyhzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snRnJvbSddID0gJ01lJworICAgICAgICBtc2dbJ3RvJ10gPSAnWW91JworICAgICAgICAjIENoZWNrIGZvciBjYXNlIGluc2Vuc2l0aXZpdHkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdmcm9tJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnRnJvbScgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0ZST00nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCd0bycgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1RvJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnVE8nIGluIG1zZykKKworICAgIGRlZiB0ZXN0X2FzX3N0cmluZyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIEJBVyAzMC1NYXItMjAwOSBFdmlsIGJlIGhlcmUuICBTbywgdGhlIGdlbmVyYXRvciBpcyBicm9rZW4gd2l0aAorICAgICAgICAgICAgIyByZXNwZWN0IHRvIGxvbmcgbGluZSBicmVha2luZy4gIEl0J3MgYWxzbyBub3QgaWRlbXBvdGVudCB3aGVuIGEKKyAgICAgICAgICAgICMgaGVhZGVyIGZyb20gYSBwYXJzZWQgbWVzc2FnZSBpcyBjb250aW51ZWQgd2l0aCB0YWJzIHJhdGhlciB0aGFuCisgICAgICAgICAgICAjIHNwYWNlcy4gIEJlZm9yZSB3ZSBmaXhlZCBidWcgMTk3NCBpdCB3YXMgcmV2ZXJzZWRseSBicm9rZW4sCisgICAgICAgICAgICAjIGkuZS4gaGVhZGVycyB0aGF0IHdlcmUgY29udGludWVkIHdpdGggc3BhY2VzIGdvdCBjb250aW51ZWQgd2l0aAorICAgICAgICAgICAgIyB0YWJzLiAgRm9yIFB5dGhvbiAyLnggdGhlcmUncyByZWFsbHkgbm8gZ29vZCBmaXggYW5kIGluIFB5dGhvbgorICAgICAgICAgICAgIyAzLnggYWxsIHRoaXMgc3R1ZmYgaXMgcmUtd3JpdHRlbiB0byBiZSByaWdodChlcikuICBDaHJpcyBXaXRoZXJzCisgICAgICAgICAgICAjIGNvbnZpbmNlZCBtZSB0aGF0IHVzaW5nIHNwYWNlIGFzIHRoZSBkZWZhdWx0IGNvbnRpbnVhdGlvbgorICAgICAgICAgICAgIyBjaGFyYWN0ZXIgaXMgbGVzcyBiYWQgZm9yIG1vcmUgYXBwbGljYXRpb25zLgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKS5yZXBsYWNlKCdcdCcsICcgJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZXEodGV4dCwgbXNnLmFzX3N0cmluZygpKQorICAgICAgICBmdWxscmVwciA9IHN0cihtc2cpCisgICAgICAgIGxpbmVzID0gZnVsbHJlcHIuc3BsaXQoJ1xuJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzWzBdLnN0YXJ0c3dpdGgoJ0Zyb20gJykpCisgICAgICAgIGVxKHRleHQsIE5MLmpvaW4obGluZXNbMTpdKSkKKworICAgIGRlZiB0ZXN0X2JhZF9wYXJhbShzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiQ29udGVudC1UeXBlOiBibGFyZzsgYmF6OyBib29cbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnYmF6JyksICcnKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19maWxlbmFtZShzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiRnJvbTogZm9vXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2JvZ3VzX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAiQ29udGVudC1EaXNwb3NpdGlvbjogYmxhcmc7IGZpbGVuYW1lXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgJycpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCJGcm9tOiBmb29cbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9ib3VuZGFyeSgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAnWC1IZWFkZXI6IGZvbz1vbmU7IGJhcj10d287IGJhej10aHJlZVxuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoaGVhZGVyPSd4LWhlYWRlcicpLAorICAgICAgICAgICBbKCdmb28nLCAnb25lJyksICgnYmFyJywgJ3R3bycpLCAoJ2JheicsICd0aHJlZScpXSkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vOyBiYXI9b25lOyBiYXo9dHdvXG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcyhoZWFkZXI9J3gtaGVhZGVyJyksCisgICAgICAgICAgIFsoJ2ZvbycsICcnKSwgKCdiYXInLCAnb25lJyksICgnYmF6JywgJ3R3bycpXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwgTm9uZSkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vOyBiYXI9Im9uZSI7IGJhej10d29cbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKGhlYWRlcj0neC1oZWFkZXInKSwKKyAgICAgICAgICAgWygnZm9vJywgJycpLCAoJ2JhcicsICdvbmUnKSwgKCdiYXonLCAndHdvJyldKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtX2xpYmVyYWwoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ0NvbnRlbnQtVHlwZTogTXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeSA9ICJDUElNU1NNVFBDMDZwNWYzdEciJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGFyYW0oJ2JvdW5kYXJ5JyksICdDUElNU1NNVFBDMDZwNWYzdEcnKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICJYLUhlYWRlcjogZm9vPW9uZTsgYmFyPXR3bzsgYmF6PXRocmVlXG4iKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdiYXInLCBoZWFkZXI9J3gtaGVhZGVyJyksICd0d28nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdxdXV6JywgaGVhZGVyPSd4LWhlYWRlcicpLCBOb25lKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdxdXV6JyksIE5vbmUpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAnWC1IZWFkZXI6IGZvbzsgYmFyPSJvbmUiOyBiYXo9dHdvXG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdmb28nLCBoZWFkZXI9J3gtaGVhZGVyJyksICcnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdiYXInLCBoZWFkZXI9J3gtaGVhZGVyJyksICdvbmUnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdiYXonLCBoZWFkZXI9J3gtaGVhZGVyJyksICd0d28nKQorICAgICAgICAjIFhYWDogV2UgYXJlIG5vdCBSRkMtMjA0NSBjb21wbGlhbnQhICBXZSBjYW5ub3QgcGFyc2U6CisgICAgICAgICMgbXNnWyJDb250ZW50LVR5cGUiXSA9ICd0ZXh0L3BsYWluOyB3ZWlyZD0iaGV5OyBkb2xseT8gW3lvdV0gQCA8XFwiaG9tZVxcIj4/IicKKyAgICAgICAgIyBtc2cuZ2V0X3BhcmFtKCJ3ZWlyZCIpCisgICAgICAgICMgeWV0LgorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtX2Z1bmt5X2NvbnRpbnVhdGlvbl9saW5lcyhzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjIudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMSkuZ2V0X3BhcmFtKCduYW1lJyksICd3aWJibGUuSlBHJykKKworICAgIGRlZiB0ZXN0X2dldF9wYXJhbV93aXRoX3NlbWlzX2luX3F1b3RlcyhzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdDb250ZW50LVR5cGU6IGltYWdlL3BqcGVnOyBuYW1lPSJKaW0mYW1wOyZhbXA7SmlsbCJcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnbmFtZScpLCAnSmltJmFtcDsmYW1wO0ppbGwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGFyYW0oJ25hbWUnLCB1bnF1b3RlPUZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnIkppbSZhbXA7JmFtcDtKaWxsIicpCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW1fd2l0aF9xdW90ZXMoc2VsZik6CisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAnQ29udGVudC1UeXBlOiBmb287IGJhciowPSJiYXpcXCJmb29iYXIiOyBiYXIqMT0iXFwiYmF6IicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnYmFyJyksICdiYXoiZm9vYmFyImJheicpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiBmb287IGJhciowPVwiYmF6XFxcImZvb2JhclwiOyBiYXIqMT1cIlxcXCJiYXpcIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnYmFyJyksICdiYXoiZm9vYmFyImJheicpCisKKyAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCdIZWFkZXI6IGV4aXN0cycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnaGVhZGVyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnSGVhZGVyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnSEVBREVSJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLmhhc19rZXkoJ2hlYWRlcmknKSkKKworICAgIGRlZiB0ZXN0X3NldF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdjaGFyc2V0JywgJ2lzby0yMDIyLWpwJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAnaXNvLTIwMjItanAnKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdpbXBvcnRhbmNlJywgJ2hpZ2ggdmFsdWUnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdpbXBvcnRhbmNlJyksICdoaWdoIHZhbHVlJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnaW1wb3J0YW5jZScsIHVucXVvdGU9RmFsc2UpLCAnImhpZ2ggdmFsdWUiJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwgWygndGV4dC9wbGFpbicsICcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnY2hhcnNldCcsICdpc28tMjAyMi1qcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbXBvcnRhbmNlJywgJ2hpZ2ggdmFsdWUnKV0pCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKHVucXVvdGU9RmFsc2UpLCBbKCd0ZXh0L3BsYWluJywgJycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdjaGFyc2V0JywgJyJpc28tMjAyMi1qcCInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnaW1wb3J0YW5jZScsICciaGlnaCB2YWx1ZSInKV0pCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2NoYXJzZXQnLCAnaXNvLTk5OTkteHgnLCBoZWFkZXI9J1gtSmltbXknKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JywgaGVhZGVyPSdYLUppbW15JyksICdpc28tOTk5OS14eCcpCisKKyAgICBkZWYgdGVzdF9kZWxfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLAorICAgICAgICAgICBbKCdtdWx0aXBhcnQvcmVwb3J0JywgJycpLCAoJ3JlcG9ydC10eXBlJywgJ2RlbGl2ZXJ5LXN0YXR1cycpLAorICAgICAgICAgICAgKCdib3VuZGFyeScsICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJyldKQorICAgICAgICBvbGRfdmFsID0gbXNnLmdldF9wYXJhbSgicmVwb3J0LXR5cGUiKQorICAgICAgICBtc2cuZGVsX3BhcmFtKCJyZXBvcnQtdHlwZSIpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksCisgICAgICAgICAgIFsoJ211bHRpcGFydC9yZXBvcnQnLCAnJyksCisgICAgICAgICAgICAoJ2JvdW5kYXJ5JywgJ0QxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20nKV0pCisgICAgICAgIG1zZy5zZXRfcGFyYW0oInJlcG9ydC10eXBlIiwgb2xkX3ZhbCkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwKKyAgICAgICAgICAgWygnbXVsdGlwYXJ0L3JlcG9ydCcsICcnKSwKKyAgICAgICAgICAgICgnYm91bmRhcnknLCAnRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbScpLAorICAgICAgICAgICAgKCdyZXBvcnQtdHlwZScsIG9sZF92YWwpXSkKKworICAgIGRlZiB0ZXN0X2RlbF9wYXJhbV9vbl9vdGhlcl9oZWFkZXIoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywgZmlsZW5hbWU9J2J1ZC5naWYnKQorICAgICAgICBtc2cuZGVsX3BhcmFtKCdmaWxlbmFtZScsICdjb250ZW50LWRpc3Bvc2l0aW9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSwgJ2F0dGFjaG1lbnQnKQorCisgICAgZGVmIHRlc3Rfc2V0X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbXNnLnNldF90eXBlLCAndGV4dCcpCisgICAgICAgIG1zZy5zZXRfdHlwZSgndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluJykKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnY2hhcnNldCcsICd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSInKQorICAgICAgICBtc2cuc2V0X3R5cGUoJ3RleHQvaHRtbCcpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L2h0bWw7IGNoYXJzZXQ9InVzLWFzY2lpIicpCisKKyAgICBkZWYgdGVzdF9zZXRfdHlwZV9vbl9vdGhlcl9oZWFkZXIoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1gtQ29udGVudC1UeXBlJ10gPSAndGV4dC9wbGFpbicKKyAgICAgICAgbXNnLnNldF90eXBlKCdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCAnWC1Db250ZW50LVR5cGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1sneC1jb250ZW50LXR5cGUnXSwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX21pc3Npbmcoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfbWlzc2luZ193aXRoX2RlZmF1bHRfdHlwZShzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfZGVmYXVsdF90eXBlKCdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfZnJvbV9tZXNzYWdlX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UvcmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfZnJvbV9tZXNzYWdlX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yOC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UvcmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfZnJvbV9tZXNzYWdlX3RleHRfcGxhaW5faW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9taXNzaW5nKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfbWlzc2luZ193aXRoX2RlZmF1bHRfdHlwZShzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfZGVmYXVsdF90eXBlKCdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICdtZXNzYWdlJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX2Zyb21fbWVzc2FnZV9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzAudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ21lc3NhZ2UnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfZnJvbV9tZXNzYWdlX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yOC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF9tYWludHlwZSgpLCAnbWVzc2FnZScpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfZnJvbV9tZXNzYWdlX3RleHRfcGxhaW5fZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfbWlzc2luZyhzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfbWlzc2luZ193aXRoX2RlZmF1bHRfdHlwZShzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfZGVmYXVsdF90eXBlKCdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Zyb21fbWVzc2FnZV9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzAudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZnJvbV9tZXNzYWdlX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yOC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF9zdWJ0eXBlKCksICdyZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfZXJyb3Ioc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ25vLXNsYXNoLWluLXRoaXMtc3RyaW5nJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Vycm9yKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICduby1zbGFzaC1pbi10aGlzLXN0cmluZycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZV9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0ZpcnN0JywgJ09uZScpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdTZWNvbmQnLCAnVHdvJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ1RoaXJkJywgJ1RocmVlJykKKyAgICAgICAgZXEobXNnLmtleXMoKSwgWydGaXJzdCcsICdTZWNvbmQnLCAnVGhpcmQnXSkKKyAgICAgICAgZXEobXNnLnZhbHVlcygpLCBbJ09uZScsICdUd28nLCAnVGhyZWUnXSkKKyAgICAgICAgbXNnLnJlcGxhY2VfaGVhZGVyKCdTZWNvbmQnLCAnVHdlbnR5JykKKyAgICAgICAgZXEobXNnLmtleXMoKSwgWydGaXJzdCcsICdTZWNvbmQnLCAnVGhpcmQnXSkKKyAgICAgICAgZXEobXNnLnZhbHVlcygpLCBbJ09uZScsICdUd2VudHknLCAnVGhyZWUnXSkKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0ZpcnN0JywgJ0VsZXZlbicpCisgICAgICAgIG1zZy5yZXBsYWNlX2hlYWRlcignRmlyc3QnLCAnT25lIEh1bmRyZWQnKQorICAgICAgICBlcShtc2cua2V5cygpLCBbJ0ZpcnN0JywgJ1NlY29uZCcsICdUaGlyZCcsICdGaXJzdCddKQorICAgICAgICBlcShtc2cudmFsdWVzKCksIFsnT25lIEh1bmRyZWQnLCAnVHdlbnR5JywgJ1RocmVlJywgJ0VsZXZlbiddKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbXNnLnJlcGxhY2VfaGVhZGVyLCAnRm91cnRoJywgJ01pc3NpbmcnKQorCisgICAgZGVmIHRlc3RfYnJva2VuX2Jhc2U2NF9wYXlsb2FkKHNlbGYpOgorICAgICAgICB4ID0gJ0F3RHAwUDcvL3k2THdLRUFjUGEvNlE9OScKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snY29udGVudC10eXBlJ10gPSAnYXVkaW8veC1taWRpJworICAgICAgICBtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSA9ICdiYXNlNjQnCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksIHgpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KCd1cy1hc2NpaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3VzLWFzY2lpJywgbXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSkKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KHUndXMtYXNjaWknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd1cy1hc2NpaScsIG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCkpCisKKyAgICAjIElzc3VlIDU4NzE6IHJlamVjdCBhbiBhdHRlbXB0IHRvIGVtYmVkIGEgaGVhZGVyIGluc2lkZSBhIGhlYWRlciB2YWx1ZQorICAgICMgKGhlYWRlciBpbmplY3Rpb24gYXR0YWNrKS4KKyAgICBkZWYgdGVzdF9lbWJlZGVkX2hlYWRlcl92aWFfSGVhZGVyX3JlamVjdGVkKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydEdW1teSddID0gSGVhZGVyKCdkdW1teVxuWC1JbmplY3RlZC1IZWFkZXI6IHRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFcnJvcnMuSGVhZGVyUGFyc2VFcnJvciwgbXNnLmFzX3N0cmluZykKKworICAgIGRlZiB0ZXN0X2VtYmVkZWRfaGVhZGVyX3ZpYV9zdHJpbmdfcmVqZWN0ZWQoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0R1bW15J10gPSAnZHVtbXlcblgtSW5qZWN0ZWQtSGVhZGVyOiB0ZXN0JworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFcnJvcnMuSGVhZGVyUGFyc2VFcnJvciwgbXNnLmFzX3N0cmluZykKKworCisjIFRlc3QgdGhlIGVtYWlsLkVuY29kZXJzIG1vZHVsZQorY2xhc3MgVGVzdEVuY29kZXJzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGVfZW1wdHlfcGF5bG9hZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfY3RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyA3Yml0IGRhdGEgYW5kIHRoZSBkZWZhdWx0IHVzLWFzY2lpIF9jaGFyc2V0CisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAnN2JpdCcpCisgICAgICAgICMgU2ltaWxhciwgYnV0IHdpdGggOGJpdCBkYXRhCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyBceGY4IHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc4Yml0JykKKyAgICAgICAgIyBBbmQgbm93IHdpdGggYSBkaWZmZXJlbnQgY2hhcnNldAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gXHhmOCB3b3JsZCcsIF9jaGFyc2V0PSdpc28tODg1OS0xJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICdxdW90ZWQtcHJpbnRhYmxlJykKKworICAgIGRlZiB0ZXN0X2VuY29kZTdvcjhiaXQoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGEgY2hhcnNldCB3aG9zZSBpbnB1dCBjaGFyYWN0ZXIgc2V0IGlzIDhiaXQgYnV0CisgICAgICAgICMgd2hvc2Ugb3V0cHV0IGNoYXJhY3RlciBzZXQgaXMgN2JpdCBnZXRzIGEgdHJhbnNmZXItZW5jb2RpbmcKKyAgICAgICAgIyBvZiA3Yml0LgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gZW1haWwuTUlNRVRleHQuTUlNRVRleHQoJ1x4Y2FceGI4JywgX2NoYXJzZXQ9J2V1Yy1qcCcpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAnN2JpdCcpCisKKworIyBUZXN0IGxvbmcgaGVhZGVyIHdyYXBwaW5nCitjbGFzcyBUZXN0TG9uZ0hlYWRlcnMoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3Rfc3BsaXRfbG9uZ19jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIiIiXAorU3ViamVjdDogYnVnIGRlbW9uc3RyYXRpb24KK1x0MTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKK1x0bW9yZSB0ZXh0CisKK3Rlc3QKKyIiIikKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK1N1YmplY3Q6IGJ1ZyBkZW1vbnN0cmF0aW9uCisgMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKKyBtb3JlIHRleHQKKwordGVzdAorIiIiKQorCisgICAgZGVmIHRlc3RfYW5vdGhlcl9sb25nX2FsbW9zdF91bnNwbGl0dGFibGVfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gIiIiXAorYnVnIGRlbW9uc3RyYXRpb24KK1x0MTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKK1x0bW9yZSB0ZXh0IiIiCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK2J1ZyBkZW1vbnN0cmF0aW9uCitcdDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CitcdG1vcmUgdGV4dCIiIikKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitidWcgZGVtb25zdHJhdGlvbgorIDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CisgbW9yZSB0ZXh0IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19ub25zdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGcgPSBDaGFyc2V0KCJpc28tODg1OS0xIikKKyAgICAgICAgY3ogPSBDaGFyc2V0KCJpc28tODg1OS0yIikKKyAgICAgICAgdXRmOCA9IENoYXJzZXQoInV0Zi04IikKKyAgICAgICAgZ19oZWFkID0gIkRpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gRm9lcmRlcmJhbmQga29tZm9ydGFiZWwgZGVuIEtvcnJpZG9yIGVudGxhbmcsIGFuIHNceGZjZGxceGZjbmRpc2NoZW4gV2FuZGdlbVx4ZTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gYmVmXHhmNnJkZXJ0LiAiCisgICAgICAgIGN6X2hlYWQgPSAiRmluYW5ceGU4bmkgbWV0cm9wb2xlIHNlIGhyb3V0aWx5IHBvZCB0bGFrZW0gamVqaWNoIGRceGY5dnRpcHUuLiAiCisgICAgICAgIHV0ZjhfaGVhZCA9IHUiXHU2YjYzXHU3OGJhXHUzMDZiXHU4YTAwXHUzMDQ2XHUzMDY4XHU3ZmZiXHU4YTMzXHUzMDZmXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXHU0ZTAwXHU5MGU4XHUzMDZmXHUzMGM5XHUzMGE0XHUzMGM0XHU4YTllXHUzMDY3XHUzMDU5XHUzMDRjXHUzMDAxXHUzMDQyXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDVmXHUzMDg5XHUzMDgxXHUzMDY3XHUzMDU5XHUzMDAyXHU1YjlmXHU5NjliXHUzMDZiXHUzMDZmXHUzMDBjV2VubiBpc3QgZGFzIE51bnN0dWNrIGdpdCB1bmQgU2xvdGVybWV5ZXI/IEphISBCZWloZXJodW5kIGRhcyBPZGVyIGRpZSBGbGlwcGVyd2FsZHQgZ2Vyc3B1dC5cdTMwMGRcdTMwNjhcdThhMDBcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIiLmVuY29kZSgidXRmLTgiKQorICAgICAgICBoID0gSGVhZGVyKGdfaGVhZCwgZywgaGVhZGVyX25hbWU9J1N1YmplY3QnKQorICAgICAgICBoLmFwcGVuZChjel9oZWFkLCBjeikKKyAgICAgICAgaC5hcHBlbmQodXRmOF9oZWFkLCB1dGY4KQorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydTdWJqZWN0J10gPSBoCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzZnApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCitTdWJqZWN0OiA9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyX2Vpbl93ZXJkZW5fbWl0X2VpbmVtX0ZvZXJkPz0KKyA9P2lzby04ODU5LTE/cT9lcmJhbmRfa29tZm9ydGFiZWxfZGVuX0tvcnJpZG9yX2VudGxhbmc9MkNfYW5fcz1GQ2RsPUZDbmRpPz0KKyA9P2lzby04ODU5LTE/cT9zY2hlbl9XYW5kZ2VtPUU0bGRlbl92b3JiZWk9MkNfZ2VnZW5fZGllX3JvdGllcmVuZGVuX0tsaW5nPz0KKyA9P2lzby04ODU5LTE/cT9lbl9iZWY9RjZyZGVydD0yRV8/PSA9P2lzby04ODU5LTI/cT9GaW5hbj1FOG5pX21ldD89CisgPT9pc28tODg1OS0yP3E/cm9wb2xlX3NlX2hyb3V0aWx5X3BvZF90bGFrZW1famVqaWNoX2Q9Rjl2dGlwdT0yRT0yRV8/PQorID0/dXRmLTg/Yj81cTJqNTZLNjQ0R3I2S2lBNDRHRzQ0R281Nys3NktpejQ0R3Y0NEdWNDRLTTQ0R200NEdFPz0KKyA9P3V0Zi04P2I/NDRHKzQ0R2I0NEtUNDRDQzVMaUE2WU9vNDRHdjQ0T0o0NEtrNDRPRTZLcWU0NEduNDRHWjQ0R000NENCPz0KKyA9P3V0Zi04P2I/NDRHQzQ0R280NEd2NDRHbjQ0R2Y0NEtKNDRLQjQ0R240NEdaNDRDQzVhNmY2WnFiNDRHcjQ0R3Y0NENNPz0KKyA9P3V0Zi04P3E/V2Vubl9pc3RfZGFzX051bnN0dWNrX2dpdF91bmRfU2xvdGVybWV5ZXI9M0ZfSmEhX0JlaWhlcmh1bmRfZGFzPz0KKyA9P3V0Zi04P2I/SUU5a1pYSWdaR2xsSUVac2FYQndaWEozWVd4a2RDQm5aWEp6Y0hWMEx1T0FqZU9CcU9pb2dPT0Jvdz09Pz0KKyA9P3V0Zi04P2I/NDRHbTQ0R0U0NEcrNDRHWjQ0Q0M/PQorCisiIiIpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKKz0/aXNvLTg4NTktMT9xP0RpZV9NaWV0ZXJfdHJldGVuX2hpZXJfZWluX3dlcmRlbl9taXRfZWluZW1fRm9lcmQ/PQorID0/aXNvLTg4NTktMT9xP2VyYmFuZF9rb21mb3J0YWJlbF9kZW5fS29ycmlkb3JfZW50bGFuZz0yQ19hbl9zPUZDZGw9RkNuZGk/PQorID0/aXNvLTg4NTktMT9xP3NjaGVuX1dhbmRnZW09RTRsZGVuX3ZvcmJlaT0yQ19nZWdlbl9kaWVfcm90aWVyZW5kZW5fS2xpbmc/PQorID0/aXNvLTg4NTktMT9xP2VuX2JlZj1GNnJkZXJ0PTJFXz89ID0/aXNvLTg4NTktMj9xP0ZpbmFuPUU4bmlfbWV0Pz0KKyA9P2lzby04ODU5LTI/cT9yb3BvbGVfc2VfaHJvdXRpbHlfcG9kX3RsYWtlbV9qZWppY2hfZD1GOXZ0aXB1PTJFPTJFXz89CisgPT91dGYtOD9iPzVxMmo1Nks2NDRHcjZLaUE0NEdHNDRHbzU3Kzc2S2l6NDRHdjQ0R1Y0NEtNNDRHbTQ0R0U/PQorID0/dXRmLTg/Yj80NEcrNDRHYjQ0S1Q0NENDNUxpQTZZT280NEd2NDRPSjQ0S2s0NE9FNktxZTQ0R240NEdaNDRHTTQ0Q0I/PQorID0/dXRmLTg/Yj80NEdDNDRHbzQ0R3Y0NEduNDRHZjQ0S0o0NEtCNDRHbjQ0R1o0NENDNWE2ZjZacWI0NEdyNDRHdjQ0Q00/PQorID0/dXRmLTg/cT9XZW5uX2lzdF9kYXNfTnVuc3R1Y2tfZ2l0X3VuZF9TbG90ZXJtZXllcj0zRl9KYSFfQmVpaGVyaHVuZF9kYXM/PQorID0/dXRmLTg/Yj9JRTlrWlhJZ1pHbGxJRVpzYVhCd1pYSjNZV3hrZENCblpYSnpjSFYwTHVPQWplT0JxT2lvZ09PQm93PT0/PQorID0/dXRmLTg/Yj80NEdtNDRHRTQ0Rys0NEdaNDRDQz89IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19oZWFkZXJfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCd3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOyAnCisgICAgICAgICAgICAgICAgICAgJ3Nwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicsCisgICAgICAgICAgICAgICAgICAgaGVhZGVyX25hbWU9J1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnJydcCit3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOworIHNwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicnJykKKworICAgIGRlZiB0ZXN0X2xvbmdfaGVhZGVyX2VuY29kZV93aXRoX3RhYl9jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7ICcKKyAgICAgICAgICAgICAgICAgICAnc3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiJywKKyAgICAgICAgICAgICAgICAgICBoZWFkZXJfbmFtZT0nWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdCcsCisgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7CitcdHNwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicnJykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9zcGxpdHRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJycpCisgICAgICAgICMgSXQnZCBiZSBncmVhdCBpZiB3ZSBjb3VsZCB1c2UgYWRkX2hlYWRlcigpIGhlcmUsIGJ1dCB0aGF0IGRvZXNuJ3QKKyAgICAgICAgIyBndWFyYW50ZWUgYW4gb3JkZXIgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAgICAgIG1zZ1snWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdCddID0gKAorICAgICAgICAgICAgJ3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7ICcKKyAgICAgICAgICAgICdzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgJycnXAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitYLUZvb2Jhci1TcG9pbmstRGVmcm9ibml0OiB3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOworIHNwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IgorCisnJycpCisKKyAgICBkZWYgdGVzdF9ub19zZW1pc19oZWFkZXJfc3BsaXR0ZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0Zyb20nXSA9ICd0ZXN0QGRvbS5haW4nCisgICAgICAgIG1zZ1snUmVmZXJlbmNlcyddID0gU1BBQ0Uuam9pbihbJzwlZEBkb20uYWluPicgJSBpIGZvciBpIGluIHJhbmdlKDEwKV0pCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnVGVzdCcpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzZnApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCitGcm9tOiB0ZXN0QGRvbS5haW4KK1JlZmVyZW5jZXM6IDwwQGRvbS5haW4+IDwxQGRvbS5haW4+IDwyQGRvbS5haW4+IDwzQGRvbS5haW4+IDw0QGRvbS5haW4+CisgPDVAZG9tLmFpbj4gPDZAZG9tLmFpbj4gPDdAZG9tLmFpbj4gPDhAZG9tLmFpbj4gPDlAZG9tLmFpbj4KKworVGVzdCIiIikKKworICAgIGRlZiB0ZXN0X25vX3NwbGl0X2xvbmdfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gJ1JlZmVyZW5jZXM6ICcgKyAneCcgKiA4MAorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitSZWZlcmVuY2VzOiB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIiIikKKworICAgIGRlZiB0ZXN0X3NwbGl0dGluZ19tdWx0aXBsZV9sb25nX2xpbmVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gIiIiXAorZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsgYnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsgZm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsgU2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCitcdGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7IGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47IFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorXHRmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOyBieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOyBmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OyBTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKKyIiIgorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOworXHRieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOworXHRmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OworXHRTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKK1x0ZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsKK1x0YnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsKK1x0Zm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsKK1x0U2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCitcdGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7CitcdGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7CitcdGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47CitcdFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKSIiIikKKworICAgIGRlZiB0ZXN0X3NwbGl0dGluZ19maXJzdF9saW5lX29ubHlfaXNfbG9uZyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaHN0ciA9ICIiIlwKK2Zyb20gbW9kZW1jYWJsZTA5My4xMzktMjAxLTI0LnF1ZS5tYy52aWRlb3Ryb24uY2EgKFsyNC4yMDEuMTM5LjkzXSBoZWxvPWN0aHVsaHUuZ2VyZy5jYSkKK1x0Ynkga3Jvbm9zLm1lbXMtZXhjaGFuZ2Uub3JnIHdpdGggZXNtdHAgKEV4aW0gNC4wNSkKK1x0aWQgMTdrNGg1LTAwMDM0aS0wMAorXHRmb3IgdGVzdEBtZW1zLWV4Y2hhbmdlLm9yZzsgV2VkLCAyOCBBdWcgMjAwMiAxMToyNToyMCAtMDQwMCIiIgorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIG1heGxpbmVsZW49NzgsIGhlYWRlcl9uYW1lPSdSZWNlaXZlZCcsCisgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK2Zyb20gbW9kZW1jYWJsZTA5My4xMzktMjAxLTI0LnF1ZS5tYy52aWRlb3Ryb24uY2EgKFsyNC4yMDEuMTM5LjkzXQorXHRoZWxvPWN0aHVsaHUuZ2VyZy5jYSkKK1x0Ynkga3Jvbm9zLm1lbXMtZXhjaGFuZ2Uub3JnIHdpdGggZXNtdHAgKEV4aW0gNC4wNSkKK1x0aWQgMTdrNGg1LTAwMDM0aS0wMAorXHRmb3IgdGVzdEBtZW1zLWV4Y2hhbmdlLm9yZzsgV2VkLCAyOCBBdWcgMjAwMiAxMToyNToyMCAtMDQwMCIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfOGJpdF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBoID0gSGVhZGVyKCdCcml0aXNjaGUgUmVnaWVydW5nIGdpYnQnLCAnaXNvLTg4NTktMScsCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgaC5hcHBlbmQoJ2dyXHhmY25lcyBMaWNodCBmXHhmY3IgT2Zmc2hvcmUtV2luZGtyYWZ0cHJvamVrdGUnKQorICAgICAgICBtc2dbJ1N1YmplY3QnXSA9IGgKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitTdWJqZWN0OiA9P2lzby04ODU5LTE/cT9Ccml0aXNjaGVfUmVnaWVydW5nX2dpYnQ/PSA9P2lzby04ODU5LTE/cT9ncj1GQ25lcz89CisgPT9pc28tODg1OS0xP3E/X0xpY2h0X2Y9RkNyX09mZnNob3JlLVdpbmRrcmFmdHByb2pla3RlPz0KKworIiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ184Yml0X2hlYWRlcl9ub19jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydSZXBseS1UbyddID0gJ0JyaXRpc2NoZSBSZWdpZXJ1bmcgZ2lidCBnclx4ZmNuZXMgTGljaHQgZlx4ZmNyIE9mZnNob3JlLVdpbmRrcmFmdHByb2pla3RlIDxhLXZlcnktbG9uZy1hZGRyZXNzQGV4YW1wbGUuY29tPicKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZXBseS1UbzogQnJpdGlzY2hlIFJlZ2llcnVuZyBnaWJ0IGdyXHhmY25lcyBMaWNodCBmXHhmY3IgT2Zmc2hvcmUtV2luZGtyYWZ0cHJvamVrdGUgPGEtdmVyeS1sb25nLWFkZHJlc3NAZXhhbXBsZS5jb20+CisKKyIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfdG9faGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICB0byA9ICciU29tZW9uZSBUZXN0ICNBIiA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LCJTb21lb25lIFRlc3QgI0IiIDxzb21lb25lQHVtaWNoLmVkdT4sICJTb21lb25lIFRlc3QgI0MiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwgIlNvbWVvbmUgVGVzdCAjRCIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+JworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydUbyddID0gdG8KKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygwKSwgJycnXAorVG86ICJTb21lb25lIFRlc3QgI0EiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LAorICJTb21lb25lIFRlc3QgI0IiIDxzb21lb25lQHVtaWNoLmVkdT4sCisgIlNvbWVvbmUgVGVzdCAjQyIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LAorICJTb21lb25lIFRlc3QgI0QiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PgorCisnJycpCisKKyAgICBkZWYgdGVzdF9sb25nX2xpbmVfYWZ0ZXJfYXBwZW5kKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBzID0gJ1RoaXMgaXMgYW4gZXhhbXBsZSBvZiBzdHJpbmcgd2hpY2ggaGFzIGFsbW9zdCB0aGUgbGltaXQgb2YgaGVhZGVyIGxlbmd0aC4nCisgICAgICAgIGggPSBIZWFkZXIocykKKyAgICAgICAgaC5hcHBlbmQoJ0FkZCBhbm90aGVyIGxpbmUuJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorVGhpcyBpcyBhbiBleGFtcGxlIG9mIHN0cmluZyB3aGljaCBoYXMgYWxtb3N0IHRoZSBsaW1pdCBvZiBoZWFkZXIgbGVuZ3RoLgorIEFkZCBhbm90aGVyIGxpbmUuIiIiKQorCisgICAgZGVmIHRlc3Rfc2hvcnRlcl9saW5lX3dpdGhfYXBwZW5kKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBzID0gJ1RoaXMgaXMgYSBzaG9ydGVyIGxpbmUuJworICAgICAgICBoID0gSGVhZGVyKHMpCisgICAgICAgIGguYXBwZW5kKCdBZGQgYW5vdGhlciBzZW50ZW5jZS4gKFN1cnByaXNlPyknKQorICAgICAgICBlcShoLmVuY29kZSgpLAorICAgICAgICAgICAnVGhpcyBpcyBhIHNob3J0ZXIgbGluZS4gQWRkIGFub3RoZXIgc2VudGVuY2UuIChTdXJwcmlzZT8pJykKKworICAgIGRlZiB0ZXN0X2xvbmdfZmllbGRfbmFtZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgZm4gPSAnWC1WZXJ5LVZlcnktVmVyeS1Mb25nLUhlYWRlci1OYW1lJworICAgICAgICBncyA9ICJEaWUgTWlldGVyIHRyZXRlbiBoaWVyIGVpbiB3ZXJkZW4gbWl0IGVpbmVtIEZvZXJkZXJiYW5kIGtvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhmY2RsXHhmY25kaXNjaGVuIFdhbmRnZW1ceGU0bGRlbiB2b3JiZWksIGdlZ2VuIGRpZSByb3RpZXJlbmRlbiBLbGluZ2VuIGJlZlx4ZjZyZGVydC4gIgorICAgICAgICBoID0gSGVhZGVyKGdzLCAnaXNvLTg4NTktMScsIGhlYWRlcl9uYW1lPWZuKQorICAgICAgICAjIEJBVzogdGhpcyBzZWVtcyBicm9rZW4gYmVjYXVzZSB0aGUgZmlyc3QgbGluZSBpcyB0b28gbG9uZworICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCis9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyXz89CisgPT9pc28tODg1OS0xP3E/ZWluX3dlcmRlbl9taXRfZWluZW1fRm9lcmRlcmJhbmRfa29tZm9ydGFiZWxfZGVuX0tvcnJpZG9yXz89CisgPT9pc28tODg1OS0xP3E/ZW50bGFuZz0yQ19hbl9zPUZDZGw9RkNuZGlzY2hlbl9XYW5kZ2VtPUU0bGRlbl92b3JiZWk9MkNfZz89CisgPT9pc28tODg1OS0xP3E/ZWdlbl9kaWVfcm90aWVyZW5kZW5fS2xpbmdlbl9iZWY9RjZyZGVydD0yRV8/PSIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfcmVjZWl2ZWRfaGVhZGVyKHNlbGYpOgorICAgICAgICBoID0gJ2Zyb20gRk9PLlRMRCAodml6d29ybGQuYWNsLmZvby50bGQgWzEyMy40NTIuNjc4LjldKSBieSBocm90aGdhci5sYS5tYXN0YWxlci5jb20gKHRtZGEtb2ZtaXBkKSB3aXRoIEVTTVRQOyBXZWQsIDA1IE1hciAyMDAzIDE4OjEwOjE4IC0wNzAwJworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydSZWNlaXZlZC0xJ10gPSBIZWFkZXIoaCwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIG1zZ1snUmVjZWl2ZWQtMiddID0gaAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmVjZWl2ZWQtMTogZnJvbSBGT08uVExEICh2aXp3b3JsZC5hY2wuZm9vLnRsZCBbMTIzLjQ1Mi42NzguOV0pIGJ5CitcdGhyb3RoZ2FyLmxhLm1hc3RhbGVyLmNvbSAodG1kYS1vZm1pcGQpIHdpdGggRVNNVFA7CitcdFdlZCwgMDUgTWFyIDIwMDMgMTg6MTA6MTggLTA3MDAKK1JlY2VpdmVkLTI6IGZyb20gRk9PLlRMRCAodml6d29ybGQuYWNsLmZvby50bGQgWzEyMy40NTIuNjc4LjldKSBieQorIGhyb3RoZ2FyLmxhLm1hc3RhbGVyLmNvbSAodG1kYS1vZm1pcGQpIHdpdGggRVNNVFA7CisgV2VkLCAwNSBNYXIgMjAwMyAxODoxMDoxOCAtMDcwMAorCisiIiIpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfaGVhZGVyaW5zdF9lcShzZWxmKToKKyAgICAgICAgaCA9ICc8MTU5NzUuMTc5MDEuMjA3MjQwLjQxNDYwNEBzZ2lncml0em1hbm4xLm1hdGhlbWF0aWsudHUtbXVlbmNoZW4uZGU+IChEYXZpZCBCcmVtbmVyXCdzIG1lc3NhZ2Ugb2YgIlRodSwgNiBNYXIgMjAwMyAxMzo1ODoyMSArMDEwMCIpJworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydSZWNlaXZlZCddID0gSGVhZGVyKGgsIGhlYWRlcl9uYW1lPSdSZWNlaXZlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgbXNnWydSZWNlaXZlZCddID0gaAorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZWNlaXZlZDogPDE1OTc1LjE3OTAxLjIwNzI0MC40MTQ2MDRAc2dpZ3JpdHptYW5uMS5tYXRoZW1hdGlrLnR1LW11ZW5jaGVuLmRlPgorXHQoRGF2aWQgQnJlbW5lcidzIG1lc3NhZ2Ugb2YgIlRodSwgNiBNYXIgMjAwMyAxMzo1ODoyMSArMDEwMCIpCitSZWNlaXZlZDogPDE1OTc1LjE3OTAxLjIwNzI0MC40MTQ2MDRAc2dpZ3JpdHptYW5uMS5tYXRoZW1hdGlrLnR1LW11ZW5jaGVuLmRlPgorIChEYXZpZCBCcmVtbmVyJ3MgbWVzc2FnZSBvZiAiVGh1LCA2IE1hciAyMDAzIDEzOjU4OjIxICswMTAwIikKKworIiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ191bmJyZWFrYWJsZV9saW5lc193aXRoX2NvbnRpbnVhdGlvbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHQgPSAiIiJcCisgaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdCQU1BQUFDbExPUzBBQUFBR0ZCTVZFVUFBQUFrSGlKZVJVSWNHQmk5CisgbG9jUURRNHpKeWtGQkFYSmZXRGpBQUFDWVVsRVFWUjRuRjJUUVkvaklBeUZjNmx5ZGxHNXg4TnlwMVk2OXdqMVBOMkk1Z3pwIiIiCisgICAgICAgIG1zZ1snRmFjZS0xJ10gPSB0CisgICAgICAgIG1zZ1snRmFjZS0yJ10gPSBIZWFkZXIodCwgaGVhZGVyX25hbWU9J0ZhY2UtMicpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorRmFjZS0xOiBpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0JBTUFBQUNsTE9TMEFBQUFHRkJNVkVVQUFBQWtIaUplUlVJY0dCaTkKKyBsb2NRRFE0ekp5a0ZCQVhKZldEakFBQUNZVWxFUVZSNG5GMlRRWS9qSUF5RmM2bHlkbEc1eDhOeXAxWTY5d2oxUE4ySTVnenAKK0ZhY2UtMjogaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdCQU1BQUFDbExPUzBBQUFBR0ZCTVZFVUFBQUFrSGlKZVJVSWNHQmk5CisgbG9jUURRNHpKeWtGQkFYSmZXRGpBQUFDWVVsRVFWUjRuRjJUUVkvaklBeUZjNmx5ZGxHNXg4TnlwMVk2OXdqMVBOMkk1Z3pwCisKKyIiIikKKworICAgIGRlZiB0ZXN0X2Fub3RoZXJfbG9uZ19tdWx0aWxpbmVfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtID0gJycnXAorUmVjZWl2ZWQ6IGZyb20gc2lpbWFnZS5jb20gKFsxNzIuMjUuMS4zXSkgYnkgemltYS5zaWxpY29uaW1hZ2UuY29tIHdpdGggTWljcm9zb2Z0IFNNVFBTVkMoNS4wLjIxOTUuNDkwNSk7CisgV2VkLCAxNiBPY3QgMjAwMiAwNzo0MToxMSAtMDcwMCcnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgJycnXAorUmVjZWl2ZWQ6IGZyb20gc2lpbWFnZS5jb20gKFsxNzIuMjUuMS4zXSkgYnkgemltYS5zaWxpY29uaW1hZ2UuY29tIHdpdGgKKyBNaWNyb3NvZnQgU01UUFNWQyg1LjAuMjE5NS40OTA1KTsgV2VkLCAxNiBPY3QgMjAwMiAwNzo0MToxMSAtMDcwMAorCisnJycpCisKKyAgICBkZWYgdGVzdF9sb25nX2xpbmVzX3dpdGhfZGlmZmVyZW50X2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9ICIiIlwKK0xpc3QtVW5zdWJzY3JpYmU6IDxodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zcGFtYXNzYXNzaW4tdGFsaz4sCisgICAgICAgIDxtYWlsdG86c3BhbWFzc2Fzc2luLXRhbGstcmVxdWVzdEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ/c3ViamVjdD11bnN1YnNjcmliZT4iIiIKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snTGlzdCddID0gaAorICAgICAgICBtc2dbJ0xpc3QnXSA9IEhlYWRlcihoLCBoZWFkZXJfbmFtZT0nTGlzdCcpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorTGlzdDogTGlzdC1VbnN1YnNjcmliZTogPGh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3NwYW1hc3Nhc3Npbi10YWxrPiwKKyA8bWFpbHRvOnNwYW1hc3Nhc3Npbi10YWxrLXJlcXVlc3RAbGlzdHMuc291cmNlZm9yZ2UubmV0P3N1YmplY3Q9dW5zdWJzY3JpYmU+CitMaXN0OiBMaXN0LVVuc3Vic2NyaWJlOiA8aHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vc3BhbWFzc2Fzc2luLXRhbGs+LAorIDxtYWlsdG86c3BhbWFzc2Fzc2luLXRhbGstcmVxdWVzdEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ/c3ViamVjdD11bnN1YnNjcmliZT4KKworIiIiKQorCisKKworIyBUZXN0IG1hbmdsaW5nIG9mICJGcm9tICIgbGluZXMgaW4gdGhlIGJvZHkgb2YgYSBtZXNzYWdlCitjbGFzcyBUZXN0RnJvbU1hbmdsaW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYubXNnWydGcm9tJ10gPSAnYWFhQGJiYi5vcmcnCisgICAgICAgIHNlbGYubXNnLnNldF9wYXlsb2FkKCIiIlwKK0Zyb20gdGhlIGRlc2sgb2YgQS5BLkEuOgorQmxhaCBibGFoIGJsYWgKKyIiIikKKworICAgIGRlZiB0ZXN0X21hbmdsZWRfZnJvbShzZWxmKToKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYW5nbGVfZnJvbV89VHJ1ZSkKKyAgICAgICAgZy5mbGF0dGVuKHNlbGYubXNnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgIiIiXAorRnJvbTogYWFhQGJiYi5vcmcKKworPkZyb20gdGhlIGRlc2sgb2YgQS5BLkEuOgorQmxhaCBibGFoIGJsYWgKKyIiIikKKworICAgIGRlZiB0ZXN0X2RvbnRfbWFuZ2xlX2Zyb20oc2VsZik6CisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWFuZ2xlX2Zyb21fPUZhbHNlKQorICAgICAgICBnLmZsYXR0ZW4oc2VsZi5tc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAiIiJcCitGcm9tOiBhYWFAYmJiLm9yZworCitGcm9tIHRoZSBkZXNrIG9mIEEuQS5BLjoKK0JsYWggYmxhaCBibGFoCisiIiIpCisKKyAgICBkZWYgdGVzdF9tYW5nbGVfZnJvbV9pbl9wcmVhbWJsZV9hbmRfZXBpbG9nKHNlbGYpOgorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMsIG1hbmdsZV9mcm9tXz1UcnVlKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBGcm9tOiBmb29AYmFyLmNvbQorICAgICAgICAgICAgTWltZS1WZXJzaW9uOiAxLjAKKyAgICAgICAgICAgIENvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1YWFgKKworICAgICAgICAgICAgRnJvbSBzb21ld2hlcmUgdW5rbm93bgorCisgICAgICAgICAgICAtLVhYWAorICAgICAgICAgICAgQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKKyAgICAgICAgICAgIGZvbworCisgICAgICAgICAgICAtLVhYWC0tCisKKyAgICAgICAgICAgIEZyb20gc29tZXdoZXJlIHVua25vd2FibGUKKyAgICAgICAgICAgICIiIikpCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFsxIGZvciB4IGluIHMuZ2V0dmFsdWUoKS5zcGxpdCgnXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHguc3RhcnRzd2l0aCgnPkZyb20gJyldKSwgMikKKworCisjIFRlc3QgdGhlIGJhc2ljIE1JTUVBdWRpbyBjbGFzcworY2xhc3MgVGVzdE1JTUVBdWRpbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBwaWNrIHVwIHRoZSBhdWRpb3Rlc3QuYXUgdGhhdCBsaXZlcyBpbiBlbWFpbC90ZXN0L2RhdGEuCisgICAgICAgICMgSW4gUHl0aG9uLCB0aGVyZSdzIGFuIGF1ZGlvdGVzdC5hdSBsaXZpbmcgaW4gTGliL3Rlc3QgYnV0IHRoYXQgaXNuJ3QKKyAgICAgICAgIyBpbmNsdWRlZCBpbiBzb21lIGJpbmFyeSBkaXN0cm9zIHRoYXQgZG9uJ3QgaW5jbHVkZSB0aGUgdGVzdAorICAgICAgICAjIHBhY2thZ2UuICBUaGUgdHJhaWxpbmcgZW1wdHkgc3RyaW5nIG9uIHRoZSAuam9pbigpIGlzIHNpZ25pZmljYW50CisgICAgICAgICMgc2luY2UgZmluZGZpbGUoKSB3aWxsIGRvIGEgZGlybmFtZSgpLgorICAgICAgICBkYXRhZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShsYW5kbWFyayksICdkYXRhJywgJycpCisgICAgICAgIGZwID0gb3BlbihmaW5kZmlsZSgnYXVkaW90ZXN0LmF1JywgZGF0YWRpciksICdyYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2F1ZGlvZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzZWxmLl9hdSA9IE1JTUVBdWRpbyhzZWxmLl9hdWRpb2RhdGEpCisKKyAgICBkZWYgdGVzdF9ndWVzc19taW5vcl90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2F1LmdldF9jb250ZW50X3R5cGUoKSwgJ2F1ZGlvL2Jhc2ljJykKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICBwYXlsb2FkID0gc2VsZi5fYXUuZ2V0X3BheWxvYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2U2NC5kZWNvZGVzdHJpbmcocGF5bG9hZCksIHNlbGYuX2F1ZGlvZGF0YSkKKworICAgIGRlZiB0ZXN0X2NoZWNrU2V0TWlub3Ioc2VsZik6CisgICAgICAgIGF1ID0gTUlNRUF1ZGlvKHNlbGYuX2F1ZGlvZGF0YSwgJ2Zpc2gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1LmdldF9jb250ZW50X3R5cGUoKSwgJ2F1ZGlvL2Zpc2gnKQorCisgICAgZGVmIHRlc3RfYWRkX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBzZWxmLl9hdS5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdhdWRpb3Rlc3QuYXUnKQorICAgICAgICBlcShzZWxmLl9hdVsnY29udGVudC1kaXNwb3NpdGlvbiddLAorICAgICAgICAgICAnYXR0YWNobWVudDsgZmlsZW5hbWU9ImF1ZGlvdGVzdC5hdSInKQorICAgICAgICBlcShzZWxmLl9hdS5nZXRfcGFyYW1zKGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICBbKCdhdHRhY2htZW50JywgJycpLCAoJ2ZpbGVuYW1lJywgJ2F1ZGlvdGVzdC5hdScpXSkKKyAgICAgICAgZXEoc2VsZi5fYXUuZ2V0X3BhcmFtKCdmaWxlbmFtZScsIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICAnYXVkaW90ZXN0LmF1JykKKyAgICAgICAgbWlzc2luZyA9IFtdCisgICAgICAgIGVxKHNlbGYuX2F1LmdldF9wYXJhbSgnYXR0YWNobWVudCcsIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLCAnJykKKyAgICAgICAgdW5sZXNzKHNlbGYuX2F1LmdldF9wYXJhbSgnZm9vJywgZmFpbG9iaj1taXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpIGlzIG1pc3NpbmcpCisgICAgICAgICMgVHJ5IHNvbWUgbWlzc2luZyBzdHVmZgorICAgICAgICB1bmxlc3Moc2VsZi5fYXUuZ2V0X3BhcmFtKCdmb29iYXInLCBtaXNzaW5nKSBpcyBtaXNzaW5nKQorICAgICAgICB1bmxlc3Moc2VsZi5fYXUuZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgbWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2Zvb2JhcicpIGlzIG1pc3NpbmcpCisKKworCisjIFRlc3QgdGhlIGJhc2ljIE1JTUVJbWFnZSBjbGFzcworY2xhc3MgVGVzdE1JTUVJbWFnZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBmcCA9IG9wZW5maWxlKCdQeUJhbm5lcjA0OC5naWYnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9pbWdkYXRhID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHNlbGYuX2ltID0gTUlNRUltYWdlKHNlbGYuX2ltZ2RhdGEpCisKKyAgICBkZWYgdGVzdF9ndWVzc19taW5vcl90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2ltLmdldF9jb250ZW50X3R5cGUoKSwgJ2ltYWdlL2dpZicpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgcGF5bG9hZCA9IHNlbGYuX2ltLmdldF9wYXlsb2FkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlNjQuZGVjb2Rlc3RyaW5nKHBheWxvYWQpLCBzZWxmLl9pbWdkYXRhKQorCisgICAgZGVmIHRlc3RfY2hlY2tTZXRNaW5vcihzZWxmKToKKyAgICAgICAgaW0gPSBNSU1FSW1hZ2Uoc2VsZi5faW1nZGF0YSwgJ2Zpc2gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltLmdldF9jb250ZW50X3R5cGUoKSwgJ2ltYWdlL2Zpc2gnKQorCisgICAgZGVmIHRlc3RfYWRkX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBzZWxmLl9pbS5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdkaW5ndXNmaXNoLmdpZicpCisgICAgICAgIGVxKHNlbGYuX2ltWydjb250ZW50LWRpc3Bvc2l0aW9uJ10sCisgICAgICAgICAgICdhdHRhY2htZW50OyBmaWxlbmFtZT0iZGluZ3VzZmlzaC5naWYiJykKKyAgICAgICAgZXEoc2VsZi5faW0uZ2V0X3BhcmFtcyhoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwKKyAgICAgICAgICAgWygnYXR0YWNobWVudCcsICcnKSwgKCdmaWxlbmFtZScsICdkaW5ndXNmaXNoLmdpZicpXSkKKyAgICAgICAgZXEoc2VsZi5faW0uZ2V0X3BhcmFtKCdmaWxlbmFtZScsIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICAnZGluZ3VzZmlzaC5naWYnKQorICAgICAgICBtaXNzaW5nID0gW10KKyAgICAgICAgZXEoc2VsZi5faW0uZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksICcnKQorICAgICAgICB1bmxlc3Moc2VsZi5faW0uZ2V0X3BhcmFtKCdmb28nLCBmYWlsb2JqPW1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJykgaXMgbWlzc2luZykKKyAgICAgICAgIyBUcnkgc29tZSBtaXNzaW5nIHN0dWZmCisgICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpIGlzIG1pc3NpbmcpCisgICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBtaXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nZm9vYmFyJykgaXMgbWlzc2luZykKKworCisKKyMgVGVzdCB0aGUgYmFzaWMgTUlNRVRleHQgY2xhc3MKK2NsYXNzIFRlc3RNSU1FVGV4dCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9tc2cgPSBNSU1FVGV4dCgnaGVsbG8gdGhlcmUnKQorCisgICAgZGVmIHRlc3RfdHlwZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgZXEoc2VsZi5fbXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShzZWxmLl9tc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICd1cy1hc2NpaScpCisgICAgICAgIG1pc3NpbmcgPSBbXQorICAgICAgICB1bmxlc3Moc2VsZi5fbXNnLmdldF9wYXJhbSgnZm9vYmFyJywgbWlzc2luZykgaXMgbWlzc2luZykKKyAgICAgICAgdW5sZXNzKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnLCBtaXNzaW5nLCBoZWFkZXI9J2Zvb2JhcicpCisgICAgICAgICAgICAgICBpcyBtaXNzaW5nKQorCisgICAgZGVmIHRlc3RfcGF5bG9hZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9tc2cuZ2V0X3BheWxvYWQoKSwgJ2hlbGxvIHRoZXJlJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLl9tc2cuaXNfbXVsdGlwYXJ0KCkpCisKKyAgICBkZWYgdGVzdF9jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHRoZXJlJywgX2NoYXJzZXQ9J3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLmdldF9jaGFyc2V0KCkuaW5wdXRfY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisKKyAgICBkZWYgdGVzdF83Yml0X3VuaWNvZGVfaW5wdXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FVGV4dCh1J2hlbGxvIHRoZXJlJywgX2NoYXJzZXQ9J3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLmdldF9jaGFyc2V0KCkuaW5wdXRfY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisKKyAgICBkZWYgdGVzdF83Yml0X3VuaWNvZGVfaW5wdXRfbm9fY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KHUnaGVsbG8gdGhlcmUnKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKSwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnaGVsbG8gdGhlcmUnIGluIG1zZy5hc19zdHJpbmcoKSkKKworICAgIGRlZiB0ZXN0XzhiaXRfdW5pY29kZV9pbnB1dChzZWxmKToKKyAgICAgICAgdGVzdHN0ciA9IHUnXHUwNDNhXHUwNDM4XHUwNDQwXHUwNDM4XHUwNDNiXHUwNDM4XHUwNDQ2XHUwNDMwJworICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRVRleHQodGVzdHN0ciwgX2NoYXJzZXQ9J3V0Zi04JykKKyAgICAgICAgZXEobXNnLmdldF9jaGFyc2V0KCkub3V0cHV0X2NoYXJzZXQsICd1dGYtOCcpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1dGYtOCInKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCB0ZXN0c3RyLmVuY29kZSgndXRmLTgnKSkKKworICAgIGRlZiB0ZXN0XzhiaXRfdW5pY29kZV9pbnB1dF9ub19jaGFyc2V0KHNlbGYpOgorICAgICAgICB0ZXN0c3RyID0gdSdcdTA0M2FcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M2JcdTA0MzhcdTA0NDZcdTA0MzAnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgTUlNRVRleHQsIHRlc3RzdHIpCisKKworCisjIFRlc3QgY29tcGxpY2F0ZWQgbXVsdGlwYXJ0LyogbWVzc2FnZXMKK2NsYXNzIFRlc3RNdWx0aXBhcnQoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBmcCA9IG9wZW5maWxlKCdQeUJhbm5lcjA0OC5naWYnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgY29udGFpbmVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcsIGJvdW5kYXJ5PSdCT1VOREFSWScpCisgICAgICAgIGltYWdlID0gTUlNRUltYWdlKGRhdGEsIG5hbWU9J2Rpbmd1c2Zpc2guZ2lmJykKKyAgICAgICAgaW1hZ2UuYWRkX2hlYWRlcignY29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT0nZGluZ3VzZmlzaC5naWYnKQorICAgICAgICBpbnRybyA9IE1JTUVUZXh0KCcnJ1wKK0hpIHRoZXJlLAorCitUaGlzIGlzIHRoZSBkaW5ndXMgZmlzaC4KKycnJykKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChpbnRybykKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChpbWFnZSkKKyAgICAgICAgY29udGFpbmVyWydGcm9tJ10gPSAnQmFycnkgPGJhcnJ5QGRpZ2ljb29sLmNvbT4nCisgICAgICAgIGNvbnRhaW5lclsnVG8nXSA9ICdEaW5ndXMgTG92ZXJzIDxjcmF2aW5kb2dzQGNyYXZpbmRvZ3MuY29tPicKKyAgICAgICAgY29udGFpbmVyWydTdWJqZWN0J10gPSAnSGVyZSBpcyB5b3VyIGRpbmd1cyBmaXNoJworCisgICAgICAgIG5vdyA9IDk4NzgwOTcwMi41NDg0ODU5OQorICAgICAgICB0aW1ldHVwbGUgPSB0aW1lLmxvY2FsdGltZShub3cpCisgICAgICAgIGlmIHRpbWV0dXBsZVstMV0gPT0gMDoKKyAgICAgICAgICAgIHR6c2VjcyA9IHRpbWUudGltZXpvbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR6c2VjcyA9IHRpbWUuYWx0em9uZQorICAgICAgICBpZiB0enNlY3MgPiAwOgorICAgICAgICAgICAgc2lnbiA9ICctJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2lnbiA9ICcrJworICAgICAgICB0em9mZnNldCA9ICcgJXMlMDRkJyAlIChzaWduLCB0enNlY3MgLy8gMzYpCisgICAgICAgIGNvbnRhaW5lclsnRGF0ZSddID0gdGltZS5zdHJmdGltZSgKKyAgICAgICAgICAgICclYSwgJWQgJWIgJVkgJUg6JU06JVMnLAorICAgICAgICAgICAgdGltZS5sb2NhbHRpbWUobm93KSkgKyB0em9mZnNldAorICAgICAgICBzZWxmLl9tc2cgPSBjb250YWluZXIKKyAgICAgICAgc2VsZi5faW0gPSBpbWFnZQorICAgICAgICBzZWxmLl90eHQgPSBpbnRybworCisgICAgZGVmIHRlc3RfaGllcmFyY2h5KHNlbGYpOgorICAgICAgICAjIGNvbnZlbmllbmNlCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyAgICAgICAgIyB0ZXN0cworICAgICAgICBtID0gc2VsZi5fbXNnCisgICAgICAgIHVubGVzcyhtLmlzX211bHRpcGFydCgpKQorICAgICAgICBlcShtLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCisgICAgICAgIGVxKGxlbihtLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICByYWlzZXMoSW5kZXhFcnJvciwgbS5nZXRfcGF5bG9hZCwgMikKKyAgICAgICAgbTAgPSBtLmdldF9wYXlsb2FkKDApCisgICAgICAgIG0xID0gbS5nZXRfcGF5bG9hZCgxKQorICAgICAgICB1bmxlc3MobTAgaXMgc2VsZi5fdHh0KQorICAgICAgICB1bmxlc3MobTEgaXMgc2VsZi5faW0pCisgICAgICAgIGVxKG0uZ2V0X3BheWxvYWQoKSwgW20wLCBtMV0pCisgICAgICAgIHVubGVzcyhub3QgbTAuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHVubGVzcyhub3QgbTEuaXNfbXVsdGlwYXJ0KCkpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9tdWx0aXBhcnRfaWRlbXBvdGVudChzZWxmKToKKyAgICAgICAgdGV4dCA9ICIiIlwKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworCistLUJPVU5EQVJZCisKKworLS1CT1VOREFSWS0tCisiIiIKKyAgICAgICAgbXNnID0gUGFyc2VyKCkucGFyc2VzdHIodGV4dCkKKyAgICAgICAgc2VsZi5uZGlmZkFzc2VydEVxdWFsKHRleHQsIG1zZy5hc19zdHJpbmcoKSkKKworICAgIGRlZiB0ZXN0X25vX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfbm9uZV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorCistLUJPVU5EQVJZLS0nJycpCisKKyAgICBkZWYgdGVzdF9ub19wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX2VtcHR5X2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIucHJlYW1ibGUgPSAnJworICAgICAgICBvdXRlci5lcGlsb2d1ZSA9ICcnCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworCistLUJPVU5EQVJZCisKKy0tQk9VTkRBUlktLQorJycnKQorCisgICAgZGVmIHRlc3Rfb25lX3BhcnRfaW5fYV9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0nJycpCisKKyAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9lbXB0eV9wcmVhbWJsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnByZWFtYmxlID0gJycKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0nJycpCisKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25vbmVfcHJlYW1ibGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5wcmVhbWJsZSA9IE5vbmUKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tJycnKQorCisKKyAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9ub25lX2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuZXBpbG9ndWUgPSBOb25lCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLScnJykKKworCisgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfZW1wdHlfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5lcGlsb2d1ZSA9ICcnCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLQorJycnKQorCisKKyAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9ubF9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gJ1xuJworICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0KKworJycnKQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9leHRlcm5hbF9ib2R5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzYudHh0JykKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgbXNnMSA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9hbHRlcm5hdGl2ZScpCisgICAgICAgIGVxKGxlbihtc2cxLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBmb3Igc3VicGFydCBpbiBtc2cxLmdldF9wYXlsb2FkKCk6CisgICAgICAgICAgICBlcShzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvZXh0ZXJuYWwtYm9keScpCisgICAgICAgICAgICBlcShsZW4oc3VicGFydC5nZXRfcGF5bG9hZCgpKSwgMSkKKyAgICAgICAgICAgIHN1YnN1YnBhcnQgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKDApCisgICAgICAgICAgICBlcShzdWJzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZG91YmxlX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICAjIG1zZ18zNy50eHQgaXMgYSBtdWx0aXBhcnQgdGhhdCBjb250YWlucyB0d28gZGFzaC1ib3VuZGFyeSdzIGluIGEKKyAgICAgICAgIyByb3cuICBPdXIgaW50ZXJwcmV0YXRpb24gb2YgUkZDIDIwNDYgY2FsbHMgZm9yIGlnbm9yaW5nIHRoZSBzZWNvbmQKKyAgICAgICAgIyBhbmQgc3Vic2VxdWVudCBib3VuZGFyaWVzLgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zNy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDMpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfaW5uZXJfY29udGFpbnNfb3V0ZXJfYm91bmRhcnkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgICMgbXNnXzM4LnR4dCBoYXMgYW4gaW5uZXIgcGFydCB0aGF0IGNvbnRhaW5zIG91dGVyIGJvdW5kYXJpZXMuICBNeQorICAgICAgICAjIGludGVycHJldGF0aW9uIG9mIFJGQyAyMDQ2IChiYXNlZCBvbiBzZWN0aW9ucyA1LjEgYW5kIDUuMS4yKSBzYXkKKyAgICAgICAgIyB0aGVzZSBhcmUgaWxsZWdhbCBhbmQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIHVudGVybWluYXRlZCBpbm5lcgorICAgICAgICAjIHBhcnRzLgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zOC50eHQnKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIEl0ZXJhdG9ycy5fc3RydWN0dXJlKG1zZywgc2ZwKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorbXVsdGlwYXJ0L21peGVkCisgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgIG11bHRpcGFydC9hbHRlcm5hdGl2ZQorICAgICAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgdGV4dC9wbGFpbgorICAgIHRleHQvcGxhaW4KKyIiIikKKworICAgIGRlZiB0ZXN0X25lc3RlZF93aXRoX3NhbWVfYm91bmRhcnkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgICMgbXNnIDM5LnR4dCBpcyBzaW1pbGFybHkgZXZpbCBpbiB0aGF0IGl0J3MgZ290IGlubmVyIHBhcnRzIHRoYXQgdXNlCisgICAgICAgICMgdGhlIHNhbWUgYm91bmRhcnkgYXMgb3V0ZXIgcGFydHMuICBBZ2FpbiwgSSBiZWxpZXZlIHRoZSB3YXkgdGhpcyBpcworICAgICAgICAjIHBhcnNlZCBpcyBjbG9zZXN0IHRvIHRoZSBzcGlyaXQgb2YgUkZDIDIwNDYKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzkudHh0JykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBJdGVyYXRvcnMuX3N0cnVjdHVyZShtc2csIHNmcCkKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK211bHRpcGFydC9taXhlZAorICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKKyAgICAgICAgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCisgICAgICAgIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorICAgIHRleHQvcGxhaW4KKyIiIikKKworICAgIGRlZiB0ZXN0X2JvdW5kYXJ5X2luX25vbl9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzQwLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmFzX3N0cmluZygpLCAnJydcCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGJvdW5kYXJ5PSItLTk2MTI4NDIzNjU1MjUyMjI2OSIKKworLS0tLTk2MTI4NDIzNjU1MjUyMjI2OQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Qml0CisKKzxodG1sPjwvaHRtbD4KKworLS0tLTk2MTI4NDIzNjU1MjUyMjI2OS0tCisnJycpCisKKyAgICBkZWYgdGVzdF9ib3VuZGFyeV93aXRoX2xlYWRpbmdfc3BhY2Uoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCcnJ1wKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IiAgICBYWFhYIgorCistLSAgICBYWFhYCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworCistLSAgICBYWFhYCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworLS0gICAgWFhYWC0tCisnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIGVxKG1zZy5nZXRfYm91bmRhcnkoKSwgJyAgICBYWFhYJykKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKworICAgIGRlZiB0ZXN0X2JvdW5kYXJ5X3dpdGhvdXRfdHJhaWxpbmdfbmV3bGluZShzZWxmKToKKyAgICAgICAgbSA9IFBhcnNlcigpLnBhcnNlc3RyKCIiIlwKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iPT09PT09PT09PT09PT09MDAxMjM5NDE2ND09IgorTUlNRS1WZXJzaW9uOiAxLjAKKworLS09PT09PT09PT09PT09PT0wMDEyMzk0MTY0PT0KK0NvbnRlbnQtVHlwZTogaW1hZ2UvZmlsZTEuanBnCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1lYTmtaZz09CistLT09PT09PT09PT09PT09PTAwMTIzOTQxNjQ9PS0tIiIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ2V0X3BheWxvYWQoMCkuZ2V0X3BheWxvYWQoKSwgJ1lYTmtaZz09JykKKworCisKKyMgVGVzdCBzb21lIGJhZGx5IGZvcm1hdHRlZCBtZXNzYWdlcworY2xhc3MgVGVzdE5vbkNvbmZvcm1hbnQoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfcGFyc2VfbWlzc2luZ19taW5vcl90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTQudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3Rfc2FtZV9ib3VuZGFyeV9pbm5lcl9vdXRlcihzZWxmKToKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE1LnR4dCcpCisgICAgICAgICMgWFhYIFdlIGNhbiBwcm9iYWJseSBldmVudHVhbGx5IGRvIGJldHRlcgorICAgICAgICBpbm5lciA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICB1bmxlc3MoaGFzYXR0cihpbm5lciwgJ2RlZmVjdHMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaW5uZXIuZGVmZWN0cyksIDEpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGlubmVyLmRlZmVjdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QpKQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjUudHh0JykKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5kZWZlY3RzKSwgMikKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sIEVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QpKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCkpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2NvbnRlbnRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgIyBSRkMgMjA0NSwgJDUuMiBzYXlzIGludmFsaWQgeWllbGRzIHRleHQvcGxhaW4KKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0JworICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgICMgQ2xlYXIgdGhlIG9sZCB2YWx1ZSBhbmQgdHJ5IHNvbWV0aGluZyAvcmVhbGx5LyBpbnZhbGlkCisgICAgICAgIGRlbCBtc2dbJ2NvbnRlbnQtdHlwZSddCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnZm9vJworICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgICMgU3RpbGwsIG1ha2Ugc3VyZSB0aGF0IHRoZSBtZXNzYWdlIGlzIGlkZW1wb3RlbnRseSBnZW5lcmF0ZWQKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBuZXEocy5nZXR2YWx1ZSgpLCAnQ29udGVudC1UeXBlOiBmb29cblxuJykKKworICAgIGRlZiB0ZXN0X25vX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgIiIiXAorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworbWVzc2FnZSAyCisKKy0tQk9VTkRBUlktLQorIiIiKQorCisgICAgZGVmIHRlc3Rfbm9fc2VwYXJhdGluZ19ibGFua19saW5lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zNS50eHQnKQorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorVG86IGJwZXJzb25AZG9tLmFpbgorU3ViamVjdDogaGVyZSdzIHNvbWV0aGluZyBpbnRlcmVzdGluZworCitjb3VudGVyIHRvIFJGQyAyODIyLCB0aGVyZSdzIG5vIHNlcGFyYXRpbmcgbmV3bGluZSBoZXJlCisiIiIpCisKKyAgICBkZWYgdGVzdF9seWluZ19tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180MS50eHQnKQorICAgICAgICB1bmxlc3MoaGFzYXR0cihtc2csICdkZWZlY3RzJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5kZWZlY3RzKSwgMikKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sIEVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QpKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCkpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBvdXRlciA9IHNlbGYuX21zZ29iaignbXNnXzQyLnR4dCcpCisgICAgICAgICMgVGhlIG1lc3NhZ2Ugc3RydWN0dXJlIGlzOgorICAgICAgICAjCisgICAgICAgICMgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICMgICAgdGV4dC9wbGFpbgorICAgICAgICAjICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgICMgICAgICAgIG11bHRpcGFydC9taXhlZCBbKl0KKyAgICAgICAgIworICAgICAgICAjIFsqXSBUaGlzIG1lc3NhZ2UgaXMgbWlzc2luZyBpdHMgc3RhcnQgYm91bmRhcnkKKyAgICAgICAgYmFkID0gb3V0ZXIuZ2V0X3BheWxvYWQoMSkuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYmFkLmRlZmVjdHMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShiYWQuZGVmZWN0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLlN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdCkpCisKKyAgICBkZWYgdGVzdF9maXJzdF9saW5lX2lzX2NvbnRpbnVhdGlvbl9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gJyBMaW5lIDFcbkxpbmUgMlxuTGluZSAzJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKG1zZy5rZXlzKCksIFtdKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ0xpbmUgMlxuTGluZSAzJykKKyAgICAgICAgZXEobGVuKG1zZy5kZWZlY3RzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5GaXJzdEhlYWRlckxpbmVJc0NvbnRpbnVhdGlvbkRlZmVjdCkpCisgICAgICAgIGVxKG1zZy5kZWZlY3RzWzBdLmxpbmUsICcgTGluZSAxXG4nKQorCisKKworCisjIFRlc3QgUkZDIDIwNDcgaGVhZGVyIGVuY29kaW5nIGFuZCBkZWNvZGluZworY2xhc3MgVGVzdFJGQzIwNDcodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3JmYzIwNDdfbXVsdGlsaW5lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICIiIlJlOiA9P21hYy1pY2VsYW5kP3E/cj04QWtzbT05QXJnPThDcz89IGJhegorIGZvbyBiYXIgPT9tYWMtaWNlbGFuZD9xP3I9OEFrc209OUFyZz04Q3M/PSIiIgorICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEoZGgsIFsKKyAgICAgICAgICAgICgnUmU6JywgTm9uZSksCisgICAgICAgICAgICAoJ3JceDhha3NtXHg5YXJnXHg4Y3MnLCAnbWFjLWljZWxhbmQnKSwKKyAgICAgICAgICAgICgnYmF6IGZvbyBiYXInLCBOb25lKSwKKyAgICAgICAgICAgICgnclx4OGFrc21ceDlhcmdceDhjcycsICdtYWMtaWNlbGFuZCcpXSkKKyAgICAgICAgZXEoc3RyKG1ha2VfaGVhZGVyKGRoKSksCisgICAgICAgICAgICIiIlJlOiA9P21hYy1pY2VsYW5kP3E/cj04QWtzbT05QXJnPThDcz89IGJheiBmb28gYmFyCisgPT9tYWMtaWNlbGFuZD9xP3I9OEFrc209OUFyZz04Q3M/PSIiIikKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfZWF0ZXJfdW5pY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnPT9JU08tODg1OS0xP1E/QW5kcj1FOT89IFBpcmFyZCA8cGlyYXJkQGRvbS5haW4+JworICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEoZGgsIFsoJ0FuZHJceGU5JywgJ2lzby04ODU5LTEnKSwgKCdQaXJhcmQgPHBpcmFyZEBkb20uYWluPicsIE5vbmUpXSkKKyAgICAgICAgaHUgPSB1bmljb2RlKG1ha2VfaGVhZGVyKGRoKSkuZW5jb2RlKCdsYXRpbi0xJykKKyAgICAgICAgZXEoaHUsICdBbmRyXHhlOSBQaXJhcmQgPHBpcmFyZEBkb20uYWluPicpCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2VhdGVyX3VuaWNvZGVfMihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnVGhlID0/aXNvLTg4NTktMT9iP2NYVnBZMnNnWW5KdmQyNGdabTk0Pz0ganVtcGVkIG92ZXIgdGhlID0/aXNvLTg4NTktMT9iP2JHRjZlU0JrYjJjPT89JworICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEoZGgsIFsoJ1RoZScsIE5vbmUpLCAoJ3F1aWNrIGJyb3duIGZveCcsICdpc28tODg1OS0xJyksCisgICAgICAgICAgICAgICAgKCdqdW1wZWQgb3ZlciB0aGUnLCBOb25lKSwgKCdsYXp5IGRvZycsICdpc28tODg1OS0xJyldKQorICAgICAgICBodSA9IG1ha2VfaGVhZGVyKGRoKS5fX3VuaWNvZGVfXygpCisgICAgICAgIGVxKGh1LCB1J1RoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgZG9nJykKKworICAgIGRlZiB0ZXN0X3JmYzIwNDdfd2l0aG91dF93aGl0ZXNwYWNlKHNlbGYpOgorICAgICAgICBzID0gJ1NtPT9JU08tODg1OS0xP0I/OWc9PT89cmc9P0lTTy04ODU5LTE/Qj81UT09Pz1zYm9yZCcKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGgsIFsocywgTm9uZSldKQorCisgICAgZGVmIHRlc3RfcmZjMjA0N193aXRoX3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgIHMgPSAnU20gPT9JU08tODg1OS0xP0I/OWc9PT89IHJnID0/SVNPLTg4NTktMT9CPzVRPT0/PSBzYm9yZCcKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGgsIFsoJ1NtJywgTm9uZSksICgnXHhmNicsICdpc28tODg1OS0xJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3JnJywgTm9uZSksICgnXHhlNScsICdpc28tODg1OS0xJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3Nib3JkJywgTm9uZSldKQorCisgICAgZGVmIHRlc3RfcmZjMjA0N19CX2JhZF9wYWRkaW5nKHNlbGYpOgorICAgICAgICBzID0gJz0/aXNvLTg4NTktMT9CPyVzPz0nCisgICAgICAgIGRhdGEgPSBbICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgdGVzdCBjb21wbGV0ZSBieXRlcworICAgICAgICAgICAgKCdkbT09JywgJ3YnKSwgKCdkbT0nLCAndicpLCAoJ2RtJywgJ3YnKSwKKyAgICAgICAgICAgICgnZG1rPScsICd2aScpLCAoJ2RtaycsICd2aScpCisgICAgICAgICAgXQorICAgICAgICBmb3IgcSwgYSBpbiBkYXRhOgorICAgICAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMgJSBxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaCwgWyhhLCAnaXNvLTg4NTktMScpXSkKKworICAgIGRlZiB0ZXN0X3JmYzIwNDdfUV9pbnZhbGlkX2RpZ2l0cyhzZWxmKToKKyAgICAgICAgIyBpc3N1ZSAxMDAwNC4KKyAgICAgICAgcyA9ICc9P2lzby04NjU5LTE/UT9hbmRyPWU5PXp6Pz0nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlX2hlYWRlcihzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoYidhbmRyXHhlOT16eicsICdpc28tODY1OS0xJyldKQorCisKKyMgVGVzdCB0aGUgTUlNRU1lc3NhZ2UgY2xhc3MKK2NsYXNzIFRlc3RNSU1FTWVzc2FnZShUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18xMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl90ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF90eXBlX2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIE1JTUVNZXNzYWdlLCAnYSBwbGFpbiBzdHJpbmcnKQorCisgICAgZGVmIHRlc3RfdmFsaWRfYXJndW1lbnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgc3ViamVjdCA9ICdBIHN1Yi1tZXNzYWdlJworICAgICAgICBtID0gTWVzc2FnZSgpCisgICAgICAgIG1bJ1N1YmplY3QnXSA9IHN1YmplY3QKKyAgICAgICAgciA9IE1JTUVNZXNzYWdlKG0pCisgICAgICAgIGVxKHIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBwYXlsb2FkID0gci5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIHN1YnBhcnQgPSBwYXlsb2FkWzBdCisgICAgICAgIHVubGVzcyhzdWJwYXJ0IGlzIG0pCisgICAgICAgIGVxKHN1YnBhcnRbJ3N1YmplY3QnXSwgc3ViamVjdCkKKworICAgIGRlZiB0ZXN0X2JhZF9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cxID0gTWVzc2FnZSgpCisgICAgICAgIG1zZzFbJ1N1YmplY3QnXSA9ICdzdWJwYXJ0IDEnCisgICAgICAgIG1zZzIgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnMlsnU3ViamVjdCddID0gJ3N1YnBhcnQgMicKKyAgICAgICAgciA9IE1JTUVNZXNzYWdlKG1zZzEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVycm9ycy5NdWx0aXBhcnRDb252ZXJzaW9uRXJyb3IsIHIuYXR0YWNoLCBtc2cyKQorCisgICAgZGVmIHRlc3RfZ2VuZXJhdGUoc2VsZik6CisgICAgICAgICMgRmlyc3QgY3JhZnQgdGhlIG1lc3NhZ2UgdG8gYmUgZW5jYXBzdWxhdGVkCisgICAgICAgIG0gPSBNZXNzYWdlKCkKKyAgICAgICAgbVsnU3ViamVjdCddID0gJ0FuIGVuY2xvc2VkIG1lc3NhZ2UnCisgICAgICAgIG0uc2V0X3BheWxvYWQoJ0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuXG4nKQorICAgICAgICByID0gTUlNRU1lc3NhZ2UobSkKKyAgICAgICAgclsnU3ViamVjdCddID0gJ1RoZSBlbmNsb3NpbmcgbWVzc2FnZScKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4ocikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICIiIlwKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBUaGUgZW5jbG9zaW5nIG1lc3NhZ2UKKworU3ViamVjdDogQW4gZW5jbG9zZWQgbWVzc2FnZQorCitIZXJlIGlzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLgorIiIiKQorCisgICAgZGVmIHRlc3RfcGFyc2VfbWVzc2FnZV9yZmM4MjIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTEudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIHN1Ym1zZyA9IHBheWxvYWRbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3VibXNnLCBNZXNzYWdlKSkKKyAgICAgICAgZXEoc3VibXNnWydzdWJqZWN0J10sICdBbiBlbmNsb3NlZCBtZXNzYWdlJykKKyAgICAgICAgZXEoc3VibXNnLmdldF9wYXlsb2FkKCksICdIZXJlIGlzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLlxuJykKKworICAgIGRlZiB0ZXN0X2RzbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICAjIG1zZyAxNiBpcyBhIERlbGl2ZXJ5IFN0YXR1cyBOb3RpZmljYXRpb24sIHNlZSBSRkMgMTg5NAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xNi50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCisgICAgICAgIHVubGVzcyhtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDMpCisgICAgICAgICMgU3VicGFydCAxIGlzIGEgdGV4dC9wbGFpbiwgaHVtYW4gcmVhZGFibGUgc2VjdGlvbgorICAgICAgICBzdWJwYXJ0ID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSwgIiIiXAorVGhpcyByZXBvcnQgcmVsYXRlcyB0byBhIG1lc3NhZ2UgeW91IHNlbnQgd2l0aCB0aGUgZm9sbG93aW5nIGhlYWRlciBmaWVsZHM6CisKKyAgTWVzc2FnZS1pZDogPDAwMjAwMWMxNDRhNiQ4NzUyZTA2MCQ1NjEwNDU4NkBveHkuZWR1PgorICBEYXRlOiBTdW4sIDIzIFNlcCAyMDAxIDIwOjEwOjU1IC0wNzAwCisgIEZyb206ICJJYW4gVC4gSGVucnkiIDxoZW5yeWlAb3h5LmVkdT4KKyAgVG86IFNvQ2FsIFJhdmVzIDxzY3JAc29jYWwtcmF2ZXMub3JnPgorICBTdWJqZWN0OiBbc2NyXSB5ZWFoIGZvciBJYW5zISEKKworWW91ciBtZXNzYWdlIGNhbm5vdCBiZSBkZWxpdmVyZWQgdG8gdGhlIGZvbGxvd2luZyByZWNpcGllbnRzOgorCisgIFJlY2lwaWVudCBhZGRyZXNzOiBqYW5nZWwxQGNvdWdhci5ub2MudWNsYS5lZHUKKyAgUmVhc29uOiByZWNpcGllbnQgcmVhY2hlZCBkaXNrIHF1b3RhCisKKyIiIikKKyAgICAgICAgIyBTdWJwYXJ0IDIgY29udGFpbnMgdGhlIG1hY2hpbmUgcGFyc2FibGUgRFNOIGluZm9ybWF0aW9uLiAgSXQKKyAgICAgICAgIyBjb25zaXN0cyBvZiB0d28gYmxvY2tzIG9mIGhlYWRlcnMsIHJlcHJlc2VudGVkIGJ5IHR3byBuZXN0ZWQgTWVzc2FnZQorICAgICAgICAjIG9iamVjdHMuCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cycpCisgICAgICAgIGVxKGxlbihzdWJwYXJ0LmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIHNob3VsZCB0cmVhdCBlYWNoIGJsb2NrIGFzIGEgYnVuY2ggb2YKKyAgICAgICAgIyBoZWFkZXJzLCBpLmUuIGEgYnVuY2ggb2YgTWVzc2FnZSBvYmplY3RzLgorICAgICAgICBkc24xID0gc3VicGFydC5nZXRfcGF5bG9hZCgwKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShkc24xLCBNZXNzYWdlKSkKKyAgICAgICAgZXEoZHNuMVsnb3JpZ2luYWwtZW52ZWxvcGUtaWQnXSwgJzBHSzUwMEI0SEQwODg4QGNvdWdhci5ub2MudWNsYS5lZHUnKQorICAgICAgICBlcShkc24xLmdldF9wYXJhbSgnZG5zJywgaGVhZGVyPSdyZXBvcnRpbmctbXRhJyksICcnKQorICAgICAgICAjIFRyeSBhIG1pc3Npbmcgb25lIDx3aW5rPgorICAgICAgICBlcShkc24xLmdldF9wYXJhbSgnbnNkJywgaGVhZGVyPSdyZXBvcnRpbmctbXRhJyksIE5vbmUpCisgICAgICAgIGRzbjIgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKDEpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGRzbjIsIE1lc3NhZ2UpKQorICAgICAgICBlcShkc24yWydhY3Rpb24nXSwgJ2ZhaWxlZCcpCisgICAgICAgIGVxKGRzbjIuZ2V0X3BhcmFtcyhoZWFkZXI9J29yaWdpbmFsLXJlY2lwaWVudCcpLAorICAgICAgICAgICBbKCdyZmM4MjInLCAnJyksICgnamFuZ2VsMUBjb3VnYXIubm9jLnVjbGEuZWR1JywgJycpXSkKKyAgICAgICAgZXEoZHNuMi5nZXRfcGFyYW0oJ3JmYzgyMicsIGhlYWRlcj0nZmluYWwtcmVjaXBpZW50JyksICcnKQorICAgICAgICAjIFN1YnBhcnQgMyBpcyB0aGUgb3JpZ2luYWwgbWVzc2FnZQorICAgICAgICBzdWJwYXJ0ID0gbXNnLmdldF9wYXlsb2FkKDIpCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBwYXlsb2FkID0gc3VicGFydC5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIHN1YnN1YnBhcnQgPSBwYXlsb2FkWzBdCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnN1YnBhcnQsIE1lc3NhZ2UpKQorICAgICAgICBlcShzdWJzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShzdWJzdWJwYXJ0WydtZXNzYWdlLWlkJ10sCisgICAgICAgICAgICc8MDAyMDAxYzE0NGE2JDg3NTJlMDYwJDU2MTA0NTg2QG94eS5lZHU+JykKKworICAgIGRlZiB0ZXN0X2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMjEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1RvJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1N1YmplY3QnXSA9ICdUZXN0JworICAgICAgICBtc2cucHJlYW1ibGUgPSAnTUlNRSBtZXNzYWdlJworICAgICAgICBtc2cuZXBpbG9ndWUgPSAnRW5kIG9mIE1JTUUgbWVzc2FnZVxuJworICAgICAgICBtc2cxID0gTUlNRVRleHQoJ09uZScpCisgICAgICAgIG1zZzIgPSBNSU1FVGV4dCgnVHdvJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvbWl4ZWQnLCBib3VuZGFyeT0nQk9VTkRBUlknKQorICAgICAgICBtc2cuYXR0YWNoKG1zZzEpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMikKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksIHRleHQpCisKKyAgICBkZWYgdGVzdF9ub19ubF9wcmVhbWJsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snRnJvbSddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgbXNnWydUbyddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgbXNnWydTdWJqZWN0J10gPSAnVGVzdCcKKyAgICAgICAgbXNnLnByZWFtYmxlID0gJ01JTUUgbWVzc2FnZScKKyAgICAgICAgbXNnLmVwaWxvZ3VlID0gJycKKyAgICAgICAgbXNnMSA9IE1JTUVUZXh0KCdPbmUnKQorICAgICAgICBtc2cyID0gTUlNRVRleHQoJ1R3bycpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L21peGVkJywgYm91bmRhcnk9J0JPVU5EQVJZJykKKyAgICAgICAgbXNnLmF0dGFjaChtc2cxKQorICAgICAgICBtc2cuYXR0YWNoKG1zZzIpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitTdWJqZWN0OiBUZXN0CitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorCitNSU1FIG1lc3NhZ2UKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitPbmUKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitUd28KKy0tQk9VTkRBUlktLQorIiIiKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzMwLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBjb250YWluZXIxID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgY29udGFpbmVyMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGNvbnRhaW5lcjFhID0gY29udGFpbmVyMS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGNvbnRhaW5lcjJhID0gY29udGFpbmVyMi5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIyYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGVfd2l0aF9leHBsaWNpdF9jb250YWluZXJfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18yOC50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgY29udGFpbmVyMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGNvbnRhaW5lcjIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBjb250YWluZXIxYSA9IGNvbnRhaW5lcjEuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBjb250YWluZXIyYSA9IGNvbnRhaW5lcjIuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF90eXBlX25vbl9wYXJzZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBTZXQgdXAgY29udGFpbmVyCisgICAgICAgIGNvbnRhaW5lciA9IE1JTUVNdWx0aXBhcnQoJ2RpZ2VzdCcsICdCT1VOREFSWScpCisgICAgICAgIGNvbnRhaW5lci5lcGlsb2d1ZSA9ICcnCisgICAgICAgICMgU2V0IHVwIHN1YnBhcnRzCisgICAgICAgIHN1YnBhcnQxYSA9IE1JTUVUZXh0KCdtZXNzYWdlIDFcbicpCisgICAgICAgIHN1YnBhcnQyYSA9IE1JTUVUZXh0KCdtZXNzYWdlIDJcbicpCisgICAgICAgIHN1YnBhcnQxID0gTUlNRU1lc3NhZ2Uoc3VicGFydDFhKQorICAgICAgICBzdWJwYXJ0MiA9IE1JTUVNZXNzYWdlKHN1YnBhcnQyYSkKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChzdWJwYXJ0MSkKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChzdWJwYXJ0MikKKyAgICAgICAgZXEoc3VicGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBuZXEoY29udGFpbmVyLmFzX3N0cmluZygwKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCitNSU1FLVZlcnNpb246IDEuMAorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworbWVzc2FnZSAxCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK01JTUUtVmVyc2lvbjogMS4wCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCisnJycpCisgICAgICAgIGRlbCBzdWJwYXJ0MVsnY29udGVudC10eXBlJ10KKyAgICAgICAgZGVsIHN1YnBhcnQxWydtaW1lLXZlcnNpb24nXQorICAgICAgICBkZWwgc3VicGFydDJbJ2NvbnRlbnQtdHlwZSddCisgICAgICAgIGRlbCBzdWJwYXJ0MlsnbWltZS12ZXJzaW9uJ10KKyAgICAgICAgZXEoc3VicGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBuZXEoY29udGFpbmVyLmFzX3N0cmluZygwKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorCistLUJPVU5EQVJZCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDEKKworLS1CT1VOREFSWQorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworbWVzc2FnZSAyCisKKy0tQk9VTkRBUlktLQorJycnKQorCisgICAgZGVmIHRlc3RfbWltZV9hdHRhY2htZW50c19pbl9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHRleHQxID0gTUlNRVRleHQoJycpCisgICAgICAgIHRleHQyID0gTUlNRVRleHQoJycpCisgICAgICAgIG1zZyA9IE1JTUVNdWx0aXBhcnQoX3N1YnBhcnRzPSh0ZXh0MSwgdGV4dDIpKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMCksIHRleHQxKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMSksIHRleHQyKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9tdWx0aXBhcnRfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIG1zZyA9IE1JTUVNdWx0aXBhcnQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmlzX211bHRpcGFydCgpKQorCisKKyMgQSBnZW5lcmFsIHRlc3Qgb2YgcGFyc2VyLT5tb2RlbC0+Z2VuZXJhdG9yIGlkZW1wb3RlbmN5LiAgSU9XLCByZWFkIGEgbWVzc2FnZQorIyBpbiwgcGFyc2UgaXQgaW50byBhIG1lc3NhZ2Ugb2JqZWN0IHRyZWUsIHRoZW4gd2l0aG91dCB0b3VjaGluZyB0aGUgdHJlZSwKKyMgcmVnZW5lcmF0ZSB0aGUgcGxhaW4gdGV4dC4gIFRoZSBvcmlnaW5hbCB0ZXh0IGFuZCB0aGUgdHJhbnNmb3JtZWQgdGV4dAorIyBzaG91bGQgYmUgaWRlbnRpY2FsLiAgTm90ZTogdGhhdCB3ZSBpZ25vcmUgdGhlIFVuaXgtRnJvbSBzaW5jZSB0aGF0IG1heQorIyBjb250YWluIGEgY2hhbmdlZCBkYXRlLgorY2xhc3MgVGVzdElkZW1wb3RlbnQoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIF9tc2dvYmooc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmcCA9IG9wZW5maWxlKGZpbGVuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoZGF0YSkKKyAgICAgICAgcmV0dXJuIG1zZywgZGF0YQorCisgICAgZGVmIF9pZGVtcG90ZW50KHNlbGYsIG1zZywgdGV4dCk6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWF4aGVhZGVybGVuPTApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHRleHQsIHMuZ2V0dmFsdWUoKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlX3RleHRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKVsxXSwgKCdjaGFyc2V0JywgJ3VzLWFzY2lpJykpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLnByZWFtYmxlLCBOb25lKQorICAgICAgICBlcShtc2cuZXBpbG9ndWUsIE5vbmUpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfcGFyc2VfdW50eXBlZF9tZXNzYWdlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLCBOb25lKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksIE5vbmUpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX211bHRpcGFydChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDQudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9NSU1FX2RpZ2VzdChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDIudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9sb25nX2hlYWRlcihzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMjcudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9NSU1FX2RpZ2VzdF93aXRoX3BhcnRfaGVhZGVycyhzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMjgudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9taXhlZF93aXRoX2ltYWdlKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNi50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9yZXBvcnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA1LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfZHNuKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18xNi50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X3ByZWFtYmxlX2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yMS50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9vbmVfcGFydChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMjMudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfbm9fcGFydHMoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzI0LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3Rfbm9fc3RhcnRfYm91bmRhcnkoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzMxLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18zMi50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X21vcmVfcmZjMjIzMV9wYXJhbWV0ZXJzKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18zMy50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X3RleHRfcGxhaW5faW5fYV9tdWx0aXBhcnRfZGlnZXN0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18zNC50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X25lc3RlZF9tdWx0aXBhcnRfbWl4ZWRzKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18xMmEudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2V4dGVybmFsX2JvZHlfaWRlbXBvdGVudChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzYudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9jb250ZW50X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgIyBHZXQgYSBtZXNzYWdlIG9iamVjdCBhbmQgcmVzZXQgdGhlIHNlZWsgcG9pbnRlciBmb3Igb3RoZXIgdGVzdHMKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDUudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9yZXBvcnQnKQorICAgICAgICAjIFRlc3QgdGhlIENvbnRlbnQtVHlwZTogcGFyYW1ldGVycworICAgICAgICBwYXJhbXMgPSB7fQorICAgICAgICBmb3IgcGssIHB2IGluIG1zZy5nZXRfcGFyYW1zKCk6CisgICAgICAgICAgICBwYXJhbXNbcGtdID0gcHYKKyAgICAgICAgZXEocGFyYW1zWydyZXBvcnQtdHlwZSddLCAnZGVsaXZlcnktc3RhdHVzJykKKyAgICAgICAgZXEocGFyYW1zWydib3VuZGFyeSddLCAnRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbScpCisgICAgICAgIGVxKG1zZy5wcmVhbWJsZSwgJ1RoaXMgaXMgYSBNSU1FLWVuY2Fwc3VsYXRlZCBtZXNzYWdlLlxuJykKKyAgICAgICAgZXEobXNnLmVwaWxvZ3VlLCAnXG4nKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAzKQorICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgc3VicGFydHMgYXJlIHdoYXQgd2UgZXhwZWN0CisgICAgICAgIG1zZzEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEobXNnMS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnMS5nZXRfcGF5bG9hZCgpLCAnWWFkZGEgeWFkZGEgeWFkZGFcbicpCisgICAgICAgIG1zZzIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEobXNnMi5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnMi5nZXRfcGF5bG9hZCgpLCAnWWFkZGEgeWFkZGEgeWFkZGFcbicpCisgICAgICAgIG1zZzMgPSBtc2cuZ2V0X3BheWxvYWQoMikKKyAgICAgICAgZXEobXNnMy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZzMsIE1lc3NhZ2UpKQorICAgICAgICBwYXlsb2FkID0gbXNnMy5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIG1zZzQgPSBwYXlsb2FkWzBdCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZzQsIE1lc3NhZ2UpKQorICAgICAgICBlcShtc2c0LmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKKworICAgIGRlZiB0ZXN0X3BhcnNlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNi50eHQnKQorICAgICAgICAjIENoZWNrIHNvbWUgb2YgdGhlIG91dGVyIGhlYWRlcnMKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHBheWxvYWQgaXMgYSBsaXN0IG9mIGV4YWN0bHkgb25lIHN1Yi1NZXNzYWdlLCBhbmQgdGhhdAorICAgICAgICAjIHRoYXQgc3VibWVzc2FnZSBoYXMgYSB0eXBlIG9mIHRleHQvcGxhaW4KKyAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIG1zZzEgPSBwYXlsb2FkWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZzEsIE1lc3NhZ2UpKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cxLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIGVxKG1zZzEuZ2V0X3BheWxvYWQoKSwgJ1xuJykKKworCisKKyMgVGVzdCB2YXJpb3VzIG90aGVyIGJpdHMgb2YgdGhlIHBhY2thZ2UncyBmdW5jdGlvbmFsaXR5CitjbGFzcyBUZXN0TWlzY2VsbGFuZW91cyhUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fc3RyaW5nKHNlbGYpOgorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHRleHQpCisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgICMgRG9uJ3Qgd3JhcC9jb250aW51ZSBsb25nIGhlYWRlcnMgc2luY2Ugd2UncmUgdHJ5aW5nIHRvIHRlc3QKKyAgICAgICAgIyBpZGVtcG90ZW5jeS4KKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYXhoZWFkZXJsZW49MCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBzLmdldHZhbHVlKCkpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fZmlsZShzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgICAgIGZwLnNlZWsoMCkKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgICMgRG9uJ3Qgd3JhcC9jb250aW51ZSBsb25nIGhlYWRlcnMgc2luY2Ugd2UncmUgdHJ5aW5nIHRvIHRlc3QKKyAgICAgICAgICAgICMgaWRlbXBvdGVuY3kuCisgICAgICAgICAgICBnID0gR2VuZXJhdG9yKHMsIG1heGhlYWRlcmxlbj0wKQorICAgICAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgcy5nZXR2YWx1ZSgpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9mcm9tX3N0cmluZ193aXRoX2NsYXNzKHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgIyBDcmVhdGUgYSBzdWJjbGFzcworICAgICAgICBjbGFzcyBNeU1lc3NhZ2UoTWVzc2FnZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyh0ZXh0LCBNeU1lc3NhZ2UpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZywgTXlNZXNzYWdlKSkKKyAgICAgICAgIyBUcnkgc29tZXRoaW5nIG1vcmUgY29tcGxpY2F0ZWQKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAyLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyh0ZXh0LCBNeU1lc3NhZ2UpCisgICAgICAgIGZvciBzdWJwYXJ0IGluIG1zZy53YWxrKCk6CisgICAgICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzdWJwYXJ0LCBNeU1lc3NhZ2UpKQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9mcm9tX2ZpbGVfd2l0aF9jbGFzcyhzZWxmKToKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgICMgQ3JlYXRlIGEgc3ViY2xhc3MKKyAgICAgICAgY2xhc3MgTXlNZXNzYWdlKE1lc3NhZ2UpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCwgTXlNZXNzYWdlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2csIE15TWVzc2FnZSkpCisgICAgICAgICMgVHJ5IHNvbWV0aGluZyBtb3JlIGNvbXBsaWNhdGVkCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMi50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCwgTXlNZXNzYWdlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBmb3Igc3VicGFydCBpbiBtc2cud2FsaygpOgorICAgICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc3VicGFydCwgTXlNZXNzYWdlKSkKKworICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXygnZW1haWwnKQorICAgICAgICBhbGwgPSBtb2R1bGUuX19hbGxfXworICAgICAgICBhbGwuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsLCBbCisgICAgICAgICAgICAjIE9sZCBuYW1lcworICAgICAgICAgICAgJ0NoYXJzZXQnLCAnRW5jb2RlcnMnLCAnRXJyb3JzJywgJ0dlbmVyYXRvcicsCisgICAgICAgICAgICAnSGVhZGVyJywgJ0l0ZXJhdG9ycycsICdNSU1FQXVkaW8nLCAnTUlNRUJhc2UnLAorICAgICAgICAgICAgJ01JTUVJbWFnZScsICdNSU1FTWVzc2FnZScsICdNSU1FTXVsdGlwYXJ0JywKKyAgICAgICAgICAgICdNSU1FTm9uTXVsdGlwYXJ0JywgJ01JTUVUZXh0JywgJ01lc3NhZ2UnLAorICAgICAgICAgICAgJ1BhcnNlcicsICdVdGlscycsICdiYXNlNjRNSU1FJywKKyAgICAgICAgICAgICMgbmV3IG5hbWVzCisgICAgICAgICAgICAnYmFzZTY0bWltZScsICdjaGFyc2V0JywgJ2VuY29kZXJzJywgJ2Vycm9ycycsICdnZW5lcmF0b3InLAorICAgICAgICAgICAgJ2hlYWRlcicsICdpdGVyYXRvcnMnLCAnbWVzc2FnZScsICdtZXNzYWdlX2Zyb21fZmlsZScsCisgICAgICAgICAgICAnbWVzc2FnZV9mcm9tX3N0cmluZycsICdtaW1lJywgJ3BhcnNlcicsCisgICAgICAgICAgICAncXVvcHJpTUlNRScsICdxdW9wcmltaW1lJywgJ3V0aWxzJywKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9mb3JtYXRkYXRlKHNlbGYpOgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLnBhcnNlZGF0ZShVdGlscy5mb3JtYXRkYXRlKG5vdykpWzo2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLmdtdGltZShub3cpWzo2XSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdGRhdGVfbG9jYWx0aW1lKHNlbGYpOgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgVXRpbHMucGFyc2VkYXRlKFV0aWxzLmZvcm1hdGRhdGUobm93LCBsb2NhbHRpbWU9VHJ1ZSkpWzo2XSwKKyAgICAgICAgICAgIHRpbWUubG9jYWx0aW1lKG5vdylbOjZdKQorCisgICAgZGVmIHRlc3RfZm9ybWF0ZGF0ZV91c2VnbXQoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBVdGlscy5mb3JtYXRkYXRlKG5vdywgbG9jYWx0aW1lPUZhbHNlKSwKKyAgICAgICAgICAgIHRpbWUuc3RyZnRpbWUoJyVhLCAlZCAlYiAlWSAlSDolTTolUyAtMDAwMCcsIHRpbWUuZ210aW1lKG5vdykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgVXRpbHMuZm9ybWF0ZGF0ZShub3csIGxvY2FsdGltZT1GYWxzZSwgdXNlZ210PVRydWUpLAorICAgICAgICAgICAgdGltZS5zdHJmdGltZSgnJWEsICVkICViICVZICVIOiVNOiVTIEdNVCcsIHRpbWUuZ210aW1lKG5vdykpKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX25vbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMucGFyc2VkYXRlKCcnKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9jb21wYWN0KHNlbGYpOgorICAgICAgICAjIFRoZSBGV1MgYWZ0ZXIgdGhlIGNvbW1hIGlzIG9wdGlvbmFsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMucGFyc2VkYXRlKCdXZWQsMyBBcHIgMjAwMiAxNDo1ODoyNiArMDgwMCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnBhcnNlZGF0ZSgnV2VkLCAzIEFwciAyMDAyIDE0OjU4OjI2ICswODAwJykpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfbm9fZGF5b2Z3ZWVrKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoVXRpbHMucGFyc2VkYXRlX3R6KCcyNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpLAorICAgICAgICAgICAoMjAwMywgMiwgMjUsIDEzLCA0NywgMjYsIDAsIDEsIC0xLCAtMjg4MDApKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2NvbXBhY3Rfbm9fZGF5b2Z3ZWVrKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoVXRpbHMucGFyc2VkYXRlX3R6KCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJyksCisgICAgICAgICAgICgyMDAzLCAyLCA1LCAxMywgNDcsIDI2LCAwLCAxLCAtMSwgLTI4ODAwKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9hY2NlcHRhYmxlX3RvX3RpbWVfZnVuY3Rpb25zKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdGltZXR1cCA9IFV0aWxzLnBhcnNlZGF0ZSgnNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpCisgICAgICAgIHQgPSBpbnQodGltZS5ta3RpbWUodGltZXR1cCkpCisgICAgICAgIGVxKHRpbWUubG9jYWx0aW1lKHQpWzo2XSwgdGltZXR1cFs6Nl0pCisgICAgICAgIGVxKGludCh0aW1lLnN0cmZ0aW1lKCclWScsIHRpbWV0dXApKSwgMjAwMykKKyAgICAgICAgdGltZXR1cCA9IFV0aWxzLnBhcnNlZGF0ZV90eignNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpCisgICAgICAgIHQgPSBpbnQodGltZS5ta3RpbWUodGltZXR1cFs6OV0pKQorICAgICAgICBlcSh0aW1lLmxvY2FsdGltZSh0KVs6Nl0sIHRpbWV0dXBbOjZdKQorICAgICAgICBlcShpbnQodGltZS5zdHJmdGltZSgnJVknLCB0aW1ldHVwWzo5XSkpLCAyMDAzKQorCisgICAgZGVmIHRlc3RfbWt0aW1lX3R6KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLm1rdGltZV90eigoMTk3MCwgMSwgMSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIDApKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVdGlscy5ta3RpbWVfdHooKDE5NzAsIDEsIDEsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgLTEsIC0xLCAxMjM0KSksIC0xMjM0KQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX3kyayhzZWxmKToKKyAgICAgICAgIiIiVGVzdCBmb3IgcGFyc2luZyBhIGRhdGUgd2l0aCBhIHR3by1kaWdpdCB5ZWFyLgorCisgICAgICAgIFBhcnNpbmcgYSBkYXRlIHdpdGggYSB0d28tZGlnaXQgeWVhciBzaG91bGQgcmV0dXJuIHRoZSBjb3JyZWN0CisgICAgICAgIGZvdXItZGlnaXQgeWVhci4gUkZDODIyIGFsbG93cyB0d28tZGlnaXQgeWVhcnMsIGJ1dCBSRkMyODIyICh3aGljaAorICAgICAgICBvYnNvbGV0ZXMgUkZDODIyKSByZXF1aXJlcyBmb3VyLWRpZ2l0IHllYXJzLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLnBhcnNlZGF0ZV90eignMjUgRmViIDAzIDEzOjQ3OjI2IC0wODAwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMucGFyc2VkYXRlX3R6KCcyNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLnBhcnNlZGF0ZV90eignMjUgRmViIDcxIDEzOjQ3OjI2IC0wODAwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMucGFyc2VkYXRlX3R6KCcyNSBGZWIgMTk3MSAxMzo0NzoyNiAtMDgwMCcpKQorCisgICAgZGVmIHRlc3RfcGFyc2VhZGRyX2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLnBhcnNlYWRkcignPD4nKSwgKCcnLCAnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMuZm9ybWF0YWRkcihVdGlscy5wYXJzZWFkZHIoJzw+JykpLCAnJykKKworICAgIGRlZiB0ZXN0X25vcXVvdGVfZHVtcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIFV0aWxzLmZvcm1hdGFkZHIoKCdBIFNpbGx5IFBlcnNvbicsICdwZXJzb25AZG9tLmFpbicpKSwKKyAgICAgICAgICAgICdBIFNpbGx5IFBlcnNvbiA8cGVyc29uQGRvbS5haW4+JykKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9kdW1wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgVXRpbHMuZm9ybWF0YWRkcigoJ0EgKFZlcnkpIFNpbGx5IFBlcnNvbicsICdwZXJzb25AZG9tLmFpbicpKSwKKyAgICAgICAgICAgIHInIkEgXChWZXJ5XCkgU2lsbHkgUGVyc29uIiA8cGVyc29uQGRvbS5haW4+JykKKyAgICAgICAgYSA9IHInQSBcKFNwZWNpYWxcKSBQZXJzb24nCisgICAgICAgIGIgPSAncGVyc29uQGRvbS5haW4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMucGFyc2VhZGRyKFV0aWxzLmZvcm1hdGFkZHIoKGEsIGIpKSksIChhLCBiKSkKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9iYWNrc2xhc2hlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIFV0aWxzLmZvcm1hdGFkZHIoKCdBcnRodXIgXEJhY2tzbGFzaFwgRm9vYmFyJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgciciQXJ0aHVyIFxcQmFja3NsYXNoXFwgRm9vYmFyIiA8cGVyc29uQGRvbS5haW4+JykKKyAgICAgICAgYSA9IHInQXJ0aHVyIFxCYWNrc2xhc2hcIEZvb2JhcicKKyAgICAgICAgYiA9ICdwZXJzb25AZG9tLmFpbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVdGlscy5wYXJzZWFkZHIoVXRpbHMuZm9ybWF0YWRkcigoYSwgYikpKSwgKGEsIGIpKQorCisgICAgZGVmIHRlc3RfbmFtZV93aXRoX2RvdChzZWxmKToKKyAgICAgICAgeCA9ICdKb2huIFguIERvZSA8anhkQGV4YW1wbGUuY29tPicKKyAgICAgICAgeSA9ICciSm9obiBYLiBEb2UiIDxqeGRAZXhhbXBsZS5jb20+JworICAgICAgICBhLCBiID0gKCdKb2huIFguIERvZScsICdqeGRAZXhhbXBsZS5jb20nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLnBhcnNlYWRkcih4KSwgKGEsIGIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLnBhcnNlYWRkcih5KSwgKGEsIGIpKQorICAgICAgICAjIGZvcm1hdGFkZHIoKSBxdW90ZXMgdGhlIG5hbWUgaWYgdGhlcmUncyBhIGRvdCBpbiBpdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLmZvcm1hdGFkZHIoKGEsIGIpKSwgeSkKKworICAgIGRlZiB0ZXN0X3BhcnNlYWRkcl9wcmVzZXJ2ZXNfcXVvdGVkX3BhaXJzX2luX2FkZHJlc3NlcyhzZWxmKToKKyAgICAgICAgIyBpc3N1ZSAxMDAwNS4gIE5vdGUgdGhhdCBpbiB0aGUgdGhpcmQgdGVzdCB0aGUgc2Vjb25kIHBhaXIgb2YKKyAgICAgICAgIyBiYWNrc2xhc2hlcyBpcyBub3QgYWN0dWFsbHkgYSBxdW90ZWQgcGFpciBiZWNhdXNlIGl0IGlzIG5vdCBpbnNpZGUgYQorICAgICAgICAjIGNvbW1lbnQgb3IgcXVvdGVkIHN0cmluZzogdGhlIGFkZHJlc3MgYmVpbmcgcGFyc2VkIGhhcyBhIHF1b3RlZAorICAgICAgICAjIHN0cmluZyBjb250YWluaW5nIGEgcXVvdGVkIGJhY2tzbGFzaCwgZm9sbG93ZWQgYnkgJ2V4YW1wbGUnIGFuZCB0d28KKyAgICAgICAgIyBiYWNrc2xhc2hlcywgZm9sbG93ZWQgYnkgYW5vdGhlciBxdW90ZWQgc3RyaW5nIGNvbnRhaW5pbmcgYSBzcGFjZSBhbmQKKyAgICAgICAgIyB0aGUgd29yZCAnZXhhbXBsZScuICBwYXJzZWFkZHIgY29waWVzIHRob3NlIHR3byBiYWNrc2xhc2hlcworICAgICAgICAjIGxpdGVyYWxseS4gIFBlciByZmM1MzIyIHRoaXMgaXMgbm90IHRlY2huaWNhbGx5IGNvcnJlY3Qgc2luY2UgYSBcIG1heQorICAgICAgICAjIG5vdCBhcHBlYXIgaW4gYW4gYWRkcmVzcyBvdXRzaWRlIG9mIGEgcXVvdGVkIHN0cmluZy4gIEl0IGlzIHByb2JhYmx5CisgICAgICAgICMgYSBzZW5zaWJsZSBQb3N0ZWwgaW50ZXJwcmV0YXRpb24sIHRob3VnaC4KKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKFV0aWxzLnBhcnNlYWRkcignIiJleGFtcGxlIiBleGFtcGxlIkBleGFtcGxlLmNvbScpLAorICAgICAgICAgICgnJywgJyIiZXhhbXBsZSIgZXhhbXBsZSJAZXhhbXBsZS5jb20nKSkKKyAgICAgICAgZXEoVXRpbHMucGFyc2VhZGRyKCciXFwiZXhhbXBsZVxcIiBleGFtcGxlIkBleGFtcGxlLmNvbScpLAorICAgICAgICAgICgnJywgJyJcXCJleGFtcGxlXFwiIGV4YW1wbGUiQGV4YW1wbGUuY29tJykpCisgICAgICAgIGVxKFV0aWxzLnBhcnNlYWRkcignIlxcXFwiZXhhbXBsZVxcXFwiIGV4YW1wbGUiQGV4YW1wbGUuY29tJyksCisgICAgICAgICAgKCcnLCAnIlxcXFwiZXhhbXBsZVxcXFwiIGV4YW1wbGUiQGV4YW1wbGUuY29tJykpCisKKyAgICBkZWYgdGVzdF9tdWx0aWxpbmVfZnJvbV9jb21tZW50KHNlbGYpOgorICAgICAgICB4ID0gIiIiXAorRm9vCitcdEJhciA8Zm9vQGV4YW1wbGUuY29tPiIiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLnBhcnNlYWRkcih4KSwgKCdGb28gQmFyJywgJ2Zvb0BleGFtcGxlLmNvbScpKQorCisgICAgZGVmIHRlc3RfcXVvdGVfZHVtcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIFV0aWxzLmZvcm1hdGFkZHIoKCdBIFNpbGx5OyBQZXJzb24nLCAncGVyc29uQGRvbS5haW4nKSksCisgICAgICAgICAgICByJyJBIFNpbGx5OyBQZXJzb24iIDxwZXJzb25AZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3RfZml4X2VvbHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShVdGlscy5maXhfZW9scygnaGVsbG8nKSwgJ2hlbGxvJykKKyAgICAgICAgZXEoVXRpbHMuZml4X2VvbHMoJ2hlbGxvXG4nKSwgJ2hlbGxvXHJcbicpCisgICAgICAgIGVxKFV0aWxzLmZpeF9lb2xzKCdoZWxsb1xyJyksICdoZWxsb1xyXG4nKQorICAgICAgICBlcShVdGlscy5maXhfZW9scygnaGVsbG9cclxuJyksICdoZWxsb1xyXG4nKQorICAgICAgICBlcShVdGlscy5maXhfZW9scygnaGVsbG9cblxyJyksICdoZWxsb1xyXG5cclxuJykKKworICAgIGRlZiB0ZXN0X2NoYXJzZXRfcmljaGNvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbmUgPSBzZWxmLmFzc2VydE5vdEVxdWFsCisgICAgICAgIGNzZXQxID0gQ2hhcnNldCgpCisgICAgICAgIGNzZXQyID0gQ2hhcnNldCgpCisgICAgICAgIGVxKGNzZXQxLCAndXMtYXNjaWknKQorICAgICAgICBlcShjc2V0MSwgJ1VTLUFTQ0lJJykKKyAgICAgICAgZXEoY3NldDEsICdVcy1Bc0NpSScpCisgICAgICAgIGVxKCd1cy1hc2NpaScsIGNzZXQxKQorICAgICAgICBlcSgnVVMtQVNDSUknLCBjc2V0MSkKKyAgICAgICAgZXEoJ1VzLUFzQ2lJJywgY3NldDEpCisgICAgICAgIG5lKGNzZXQxLCAndXNhc2NpaScpCisgICAgICAgIG5lKGNzZXQxLCAnVVNBU0NJSScpCisgICAgICAgIG5lKGNzZXQxLCAnVXNBc0NpSScpCisgICAgICAgIG5lKCd1c2FzY2lpJywgY3NldDEpCisgICAgICAgIG5lKCdVU0FTQ0lJJywgY3NldDEpCisgICAgICAgIG5lKCdVc0FzQ2lJJywgY3NldDEpCisgICAgICAgIGVxKGNzZXQxLCBjc2V0MikKKyAgICAgICAgZXEoY3NldDIsIGNzZXQxKQorCisgICAgZGVmIHRlc3RfZ2V0YWRkcmVzc2VzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoVXRpbHMuZ2V0YWRkcmVzc2VzKFsnYXBlcnNvbkBkb20uYWluIChBbCBQZXJzb24pJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQnVkIFBlcnNvbiA8YnBlcnNvbkBkb20uYWluPiddKSwKKyAgICAgICAgICAgWygnQWwgUGVyc29uJywgJ2FwZXJzb25AZG9tLmFpbicpLAorICAgICAgICAgICAgKCdCdWQgUGVyc29uJywgJ2JwZXJzb25AZG9tLmFpbicpXSkKKworICAgIGRlZiB0ZXN0X2dldGFkZHJlc3Nlc19uYXN0eShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKFV0aWxzLmdldGFkZHJlc3NlcyhbJ2ZvbzogOyddKSwgWygnJywgJycpXSkKKyAgICAgICAgZXEoVXRpbHMuZ2V0YWRkcmVzc2VzKAorICAgICAgICAgICBbJ1tdKi0tID1+JCddKSwKKyAgICAgICAgICAgWygnJywgJycpLCAoJycsICcnKSwgKCcnLCAnKi0tJyldKQorICAgICAgICBlcShVdGlscy5nZXRhZGRyZXNzZXMoCisgICAgICAgICAgIFsnZm9vOiA7JywgJyJKYXNvbiBSLiBNYXN0YWxlciIgPGphc29uQGRvbS5haW4+J10pLAorICAgICAgICAgICBbKCcnLCAnJyksICgnSmFzb24gUi4gTWFzdGFsZXInLCAnamFzb25AZG9tLmFpbicpXSkKKworICAgIGRlZiB0ZXN0X2dldGFkZHJlc3Nlc19lbWJlZGRlZF9jb21tZW50KHNlbGYpOgorICAgICAgICAiIiJUZXN0IHByb3BlciBoYW5kbGluZyBvZiBhIG5lc3RlZCBjb21tZW50IiIiCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBhZGRycyA9IFV0aWxzLmdldGFkZHJlc3NlcyhbJ1VzZXIgKChuZXN0ZWQgY29tbWVudCkpIDxmb29AYmFyLmNvbT4nXSkKKyAgICAgICAgZXEoYWRkcnNbMF1bMV0sICdmb29AYmFyLmNvbScpCisKKyAgICBkZWYgdGVzdF91dGlsc19xdW90ZV91bnF1b3RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdjb250ZW50LWRpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT0nZm9vXFx3YWNreSJuYW1lJykKKyAgICAgICAgZXEobXNnLmdldF9maWxlbmFtZSgpLCAnZm9vXFx3YWNreSJuYW1lJykKKworICAgIGRlZiB0ZXN0X2dldF9ib2R5X2VuY29kaW5nX3dpdGhfYm9ndXNfY2hhcnNldChzZWxmKToKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ25vdCBhIGNoYXJzZXQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoYXJzZXQuZ2V0X2JvZHlfZW5jb2RpbmcoKSwgJ2Jhc2U2NCcpCisKKyAgICBkZWYgdGVzdF9nZXRfYm9keV9lbmNvZGluZ193aXRoX3VwcGVyY2FzZV9jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCcKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoKQorICAgICAgICBlcShsZW4oY2hhcnNldHMpLCAxKQorICAgICAgICBlcShjaGFyc2V0c1swXSwgJ3V0Zi04JykKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoY2hhcnNldHNbMF0pCisgICAgICAgIGVxKGNoYXJzZXQuZ2V0X2JvZHlfZW5jb2RpbmcoKSwgJ2Jhc2U2NCcpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnaGVsbG8gd29ybGQnLCBjaGFyc2V0PWNoYXJzZXQpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnYUdWc2JHOGdkMjl5YkdRPVxuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICdiYXNlNjQnKQorICAgICAgICAjIFRyeSBhbm90aGVyIG9uZQorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJVUy1BU0NJSSInCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGxlbihjaGFyc2V0cyksIDEpCisgICAgICAgIGVxKGNoYXJzZXRzWzBdLCAndXMtYXNjaWknKQorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldChjaGFyc2V0c1swXSkKKyAgICAgICAgZXEoY2hhcnNldC5nZXRfYm9keV9lbmNvZGluZygpLCBFbmNvZGVycy5lbmNvZGVfN29yOGJpdCkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdoZWxsbyB3b3JsZCcsIGNoYXJzZXQ9Y2hhcnNldCkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdoZWxsbyB3b3JsZCcpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAnN2JpdCcpCisKKyAgICBkZWYgdGVzdF9jaGFyc2V0c19jYXNlX2luc2Vuc2l0aXZlKHNlbGYpOgorICAgICAgICBsYyA9IENoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgdWMgPSBDaGFyc2V0KCdVUy1BU0NJSScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGMuZ2V0X2JvZHlfZW5jb2RpbmcoKSwgdWMuZ2V0X2JvZHlfZW5jb2RpbmcoKSkKKworICAgIGRlZiB0ZXN0X3BhcnRpYWxfZmFsbHNfaW5zaWRlX21lc3NhZ2VfZGVsaXZlcnlfc3RhdHVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICAjIFRoZSBQYXJzZXIgaW50ZXJmYWNlIHByb3ZpZGVzIGNodW5rcyBvZiBkYXRhIHRvIEZlZWRQYXJzZXIgaW4gODE5MgorICAgICAgICAjIGJ5dGUgZ3VscHMuICBTRiBidWcgIzEwNzY0ODUgZm91bmQgb25lIG9mIHRob3NlIGNodW5rcyBpbnNpZGUKKyAgICAgICAgIyBtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cyBoZWFkZXIgYmxvY2ssIHdoaWNoIHRyaWdnZXJlZCBhbgorICAgICAgICAjIHVucmVhZGxpbmUoKSBvZiBOZWVkTW9yZURhdGEuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzQzLnR4dCcpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgSXRlcmF0b3JzLl9zdHJ1Y3R1cmUobXNnLCBzZnApCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCittdWx0aXBhcnQvcmVwb3J0CisgICAgdGV4dC9wbGFpbgorICAgIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgIHRleHQvcmZjODIyLWhlYWRlcnMKKyIiIikKKworCisKKyMgVGVzdCB0aGUgaXRlcmF0b3IvZ2VuZXJhdG9ycworY2xhc3MgVGVzdEl0ZXJhdG9ycyhUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9ib2R5X2xpbmVfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBGaXJzdCBhIHNpbXBsZSBub24tbXVsdGlwYXJ0IG1lc3NhZ2UKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgaXQgPSBJdGVyYXRvcnMuYm9keV9saW5lX2l0ZXJhdG9yKG1zZykKKyAgICAgICAgbGluZXMgPSBsaXN0KGl0KQorICAgICAgICBlcShsZW4obGluZXMpLCA2KQorICAgICAgICBuZXEoRU1QVFlTVFJJTkcuam9pbihsaW5lcyksIG1zZy5nZXRfcGF5bG9hZCgpKQorICAgICAgICAjIE5vdyBhIG1vcmUgY29tcGxpY2F0ZWQgbXVsdGlwYXJ0CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAyLnR4dCcpCisgICAgICAgIGl0ID0gSXRlcmF0b3JzLmJvZHlfbGluZV9pdGVyYXRvcihtc2cpCisgICAgICAgIGxpbmVzID0gbGlzdChpdCkKKyAgICAgICAgZXEobGVuKGxpbmVzKSwgNDMpCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18xOS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXEoRU1QVFlTVFJJTkcuam9pbihsaW5lcyksIGZwLnJlYWQoKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3R5cGVkX3N1YnBhcnRfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBpdCA9IEl0ZXJhdG9ycy50eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yKG1zZywgJ3RleHQnKQorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIHN1YnBhcnRzID0gMAorICAgICAgICBmb3Igc3VicGFydCBpbiBpdDoKKyAgICAgICAgICAgIHN1YnBhcnRzICs9IDEKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChzdWJwYXJ0LmdldF9wYXlsb2FkKCkpCisgICAgICAgIGVxKHN1YnBhcnRzLCAyKQorICAgICAgICBlcShFTVBUWVNUUklORy5qb2luKGxpbmVzKSwgIiIiXAorYSBzaW1wbGUga2luZCBvZiBtaXJyb3IKK3RvIHJlZmxlY3QgdXBvbiBvdXIgb3duCithIHNpbXBsZSBraW5kIG9mIG1pcnJvcgordG8gcmVmbGVjdCB1cG9uIG91ciBvd24KKyIiIikKKworICAgIGRlZiB0ZXN0X3R5cGVkX3N1YnBhcnRfaXRlcmF0b3JfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgaXQgPSBJdGVyYXRvcnMudHlwZWRfc3VicGFydF9pdGVyYXRvcihtc2csICd0ZXh0JywgJ3BsYWluJykKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBzdWJwYXJ0cyA9IDAKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gaXQ6CisgICAgICAgICAgICBzdWJwYXJ0cyArPSAxCisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc3VicGFydC5nZXRfcGF5bG9hZCgpKQorICAgICAgICBlcShzdWJwYXJ0cywgMSkKKyAgICAgICAgZXEoRU1QVFlTVFJJTkcuam9pbihsaW5lcyksICIiIlwKKworSGksCisKK0RvIHlvdSBsaWtlIHRoaXMgbWVzc2FnZT8KKworLU1lCisiIiIpCisKKyAgICBkZWYgdGVzdF9wdXNoQ1JfTEYoc2VsZik6CisgICAgICAgICcnJ0ZlZWRQYXJzZXIgQnVmZmVyZWRTdWJGaWxlLnB1c2goKSBhc3N1bWVkIGl0IHJlY2VpdmVkIGNvbXBsZXRlCisgICAgICAgICAgIGxpbmUgZW5kaW5ncy4gIEEgQ1IgZW5kaW5nIG9uZSBwdXNoKCkgZm9sbG93ZWQgYnkgYSBMRiBzdGFydGluZworICAgICAgICAgICB0aGUgbmV4dCBwdXNoKCkgYWRkZWQgYW4gZW1wdHkgbGluZS4KKyAgICAgICAgJycnCisgICAgICAgIGltdCA9IFsKKyAgICAgICAgICAgICgiYVxyIFxuIiwgIDIpLAorICAgICAgICAgICAgKCJiIiwgICAgICAgMCksCisgICAgICAgICAgICAoImNcbiIsICAgICAxKSwKKyAgICAgICAgICAgICgiIiwgICAgICAgIDApLAorICAgICAgICAgICAgKCJkXHJcbiIsICAgMSksCisgICAgICAgICAgICAoImVcciIsICAgICAwKSwKKyAgICAgICAgICAgICgiXG5mIiwgICAgIDEpLAorICAgICAgICAgICAgKCJcclxuIiwgICAgMSksCisgICAgICAgICAgXQorICAgICAgICBmcm9tIGVtYWlsLmZlZWRwYXJzZXIgaW1wb3J0IEJ1ZmZlcmVkU3ViRmlsZSwgTmVlZE1vcmVEYXRhCisgICAgICAgIGJzZiA9IEJ1ZmZlcmVkU3ViRmlsZSgpCisgICAgICAgIG9tID0gW10KKyAgICAgICAgbnQgPSAwCisgICAgICAgIGZvciBpbCwgbiBpbiBpbXQ6CisgICAgICAgICAgICBic2YucHVzaChpbCkKKyAgICAgICAgICAgIG50ICs9IG4KKyAgICAgICAgICAgIG4xID0gMAorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBvbCA9IGJzZi5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgb2wgPT0gTmVlZE1vcmVEYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG9tLmFwcGVuZChvbCkKKyAgICAgICAgICAgICAgICBuMSArPSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobiA9PSBuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihvbSkgPT0gbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnJy5qb2luKFtpbCBmb3IgaWwsIG4gaW4gaW10XSkgPT0gJycuam9pbihvbSkpCisKKworCitjbGFzcyBUZXN0UGFyc2VycyhUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9oZWFkZXJfcGFyc2VyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBQYXJzZSBvbmx5IHRoZSBoZWFkZXJzIG9mIGEgY29tcGxleCBtdWx0aXBhcnQgTUlNRSBkb2N1bWVudAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDIudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gSGVhZGVyUGFyc2VyKCkucGFyc2UoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGVxKG1zZ1snZnJvbSddLCAncHBwLXJlcXVlc3RAenp6Lm9yZycpCisgICAgICAgIGVxKG1zZ1sndG8nXSwgJ3BwcEB6enoub3JnJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfY29udGludWF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUaGlzIG1lc3NhZ2UgY29udGFpbnMgYSBsaW5lIGFmdGVyIHRoZSBTdWJqZWN0OiBoZWFkZXIgdGhhdCBoYXMgb25seQorICAgICAgICAjIHdoaXRlc3BhY2UsIGJ1dCBpdCBpcyBub3QgZW1wdHkhCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIiIiXAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitTdWJqZWN0OiB0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0CitceDIwCitEYXRlOiBNb24sIDggQXByIDIwMDIgMTU6MDk6MTkgLTA0MDAKK01lc3NhZ2UtSUQ6IHNwYW0KKworSGVyZSdzIHRoZSBtZXNzYWdlIGJvZHkKKyIiIikKKyAgICAgICAgZXEobXNnWydzdWJqZWN0J10sICd0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0XG4gJykKKyAgICAgICAgZXEobXNnWydtZXNzYWdlLWlkJ10sICdzcGFtJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICJIZXJlJ3MgdGhlIG1lc3NhZ2UgYm9keVxuIikKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfY29udGludWF0aW9uX2xhc3RfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBMaWtlIHRoZSBwcmV2aW91cyB0ZXN0LCBidXQgdGhlIHN1YmplY3QgbGluZSBpcyB0aGUgbGFzdAorICAgICAgICAjIGhlYWRlci4KKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK0RhdGU6IE1vbiwgOCBBcHIgMjAwMiAxNTowOToxOSAtMDQwMAorTWVzc2FnZS1JRDogc3BhbQorU3ViamVjdDogdGhlIG5leHQgbGluZSBoYXMgYSBzcGFjZSBvbiBpdAorXHgyMAorCitIZXJlJ3MgdGhlIG1lc3NhZ2UgYm9keQorIiIiKQorICAgICAgICBlcShtc2dbJ3N1YmplY3QnXSwgJ3RoZSBuZXh0IGxpbmUgaGFzIGEgc3BhY2Ugb24gaXRcbiAnKQorICAgICAgICBlcShtc2dbJ21lc3NhZ2UtaWQnXSwgJ3NwYW0nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgIkhlcmUncyB0aGUgbWVzc2FnZSBib2R5XG4iKQorCisgICAgZGVmIHRlc3RfY3JsZl9zZXBhcmF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzI2LnR4dCcsIG1vZGU9J3JiJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gUGFyc2VyKCkucGFyc2UoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIHBhcnQxID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKHBhcnQxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShwYXJ0MS5nZXRfcGF5bG9hZCgpLCAnU2ltcGxlIGVtYWlsIHdpdGggYXR0YWNobWVudC5cclxuXHJcbicpCisgICAgICAgIHBhcnQyID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKHBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ2FwcGxpY2F0aW9uL3Jpc2NvcycpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfZGlnZXN0X3dpdGhfZXh0cmFfbWltZV9oZWFkZXJzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbmVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18yOC50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgIyBTdHJ1Y3R1cmUgaXM6CisgICAgICAgICMgbXVsdGlwYXJ0L2RpZ2VzdAorICAgICAgICAjICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgIyAgICAgdGV4dC9wbGFpbgorICAgICAgICAjICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgIyAgICAgdGV4dC9wbGFpbgorICAgICAgICBlcShtc2cuaXNfbXVsdGlwYXJ0KCksIDEpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIHBhcnQxID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKHBhcnQxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEocGFydDEuaXNfbXVsdGlwYXJ0KCksIDEpCisgICAgICAgIGVxKGxlbihwYXJ0MS5nZXRfcGF5bG9hZCgpKSwgMSkKKyAgICAgICAgcGFydDFhID0gcGFydDEuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDFhLmlzX211bHRpcGFydCgpLCAwKQorICAgICAgICBlcShwYXJ0MWEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIG5lcShwYXJ0MWEuZ2V0X3BheWxvYWQoKSwgJ21lc3NhZ2UgMVxuJykKKyAgICAgICAgIyBuZXh0IG1lc3NhZ2UvcmZjODIyCisgICAgICAgIHBhcnQyID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKHBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEocGFydDIuaXNfbXVsdGlwYXJ0KCksIDEpCisgICAgICAgIGVxKGxlbihwYXJ0Mi5nZXRfcGF5bG9hZCgpKSwgMSkKKyAgICAgICAgcGFydDJhID0gcGFydDIuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDJhLmlzX211bHRpcGFydCgpLCAwKQorICAgICAgICBlcShwYXJ0MmEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIG5lcShwYXJ0MmEuZ2V0X3BheWxvYWQoKSwgJ21lc3NhZ2UgMlxuJykKKworICAgIGRlZiB0ZXN0X3RocmVlX2xpbmVzKHNlbGYpOgorICAgICAgICAjIEEgYnVnIHJlcG9ydCBieSBBbmRyZXcgTWNOYW1hcmEKKyAgICAgICAgbGluZXMgPSBbJ0Zyb206IEFuZHJldyBQZXJzb24gPGFwZXJzb25AZG9tLmFpbicsCisgICAgICAgICAgICAgICAgICdTdWJqZWN0OiBUZXN0JywKKyAgICAgICAgICAgICAgICAgJ0RhdGU6IFR1ZSwgMjAgQXVnIDIwMDIgMTY6NDM6NDUgKzEwMDAnXQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKE5MLmpvaW4obGluZXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1snZGF0ZSddLCAnVHVlLCAyMCBBdWcgMjAwMiAxNjo0Mzo0NSArMTAwMCcpCisKKyAgICBkZWYgdGVzdF9zdHJpcF9saW5lX2ZlZWRfYW5kX2NhcnJpYWdlX3JldHVybl9pbl9oZWFkZXJzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBGb3IgWyAxMDAyNDc1IF0gZW1haWwgbWVzc2FnZSBwYXJzZXIgZG9lc24ndCBoYW5kbGUgXHJcbiBjb3JyZWN0bHkKKyAgICAgICAgdmFsdWUxID0gJ3RleHQnCisgICAgICAgIHZhbHVlMiA9ICdtb3JlIHRleHQnCisgICAgICAgIG0gPSAnSGVhZGVyOiAlc1xyXG5OZXh0LUhlYWRlcjogJXNcclxuXHJcbkJvZHlcclxuXHJcbicgJSAoCisgICAgICAgICAgICB2YWx1ZTEsIHZhbHVlMikKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBlcShtc2cuZ2V0KCdIZWFkZXInKSwgdmFsdWUxKQorICAgICAgICBlcShtc2cuZ2V0KCdOZXh0LUhlYWRlcicpLCB2YWx1ZTIpCisKKyAgICBkZWYgdGVzdF9yZmMyODIyX2hlYWRlcl9zeW50YXgoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gJz5Gcm9tOiBmb29cbkZyb206IGJhclxuISIjUVVYO346IHpvb1xuXG5ib2R5JworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKGxlbihtc2cua2V5cygpKSwgMykKKyAgICAgICAga2V5cyA9IG1zZy5rZXlzKCkKKyAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgZXEoa2V5cywgWychIiNRVVg7ficsICc+RnJvbScsICdGcm9tJ10pCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnYm9keScpCisKKyAgICBkZWYgdGVzdF9yZmMyODIyX3NwYWNlX25vdF9hbGxvd2VkX2luX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAnPkZyb20gZm9vQGV4YW1wbGUuY29tIDExOjI1OjUzXG5Gcm9tOiBiYXJcbiEiI1FVWDt+OiB6b29cblxuYm9keScKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBlcShsZW4obXNnLmtleXMoKSksIDApCisKKyAgICBkZWYgdGVzdF9yZmMyODIyX29uZV9jaGFyYWN0ZXJfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICdBOiBmaXJzdCBoZWFkZXJcbkI6IHNlY29uZCBoZWFkZXJcbkNDOiB0aGlyZCBoZWFkZXJcblxuYm9keScKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBoZWFkZXJzID0gbXNnLmtleXMoKQorICAgICAgICBoZWFkZXJzLnNvcnQoKQorICAgICAgICBlcShoZWFkZXJzLCBbJ0EnLCAnQicsICdDQyddKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ2JvZHknKQorCisgICAgZGVmIHRlc3RfQ1JMRkxGX2F0X2VuZF9vZl9wYXJ0KHNlbGYpOgorICAgICAgICAjIGlzc3VlIDU2MTA6IGZlZWRwYXJzZXIgc2hvdWxkIG5vdCBlYXQgdHdvIGNoYXJzIGZyb20gYm9keSBwYXJ0IGVuZGluZworICAgICAgICAjIHdpdGggIlxyXG5cbiIuCisgICAgICAgIG0gPSAoCisgICAgICAgICAgICAiRnJvbTogZm9vQGJhci5jb21cbiIKKyAgICAgICAgICAgICJUbzogYmF6XG4iCisgICAgICAgICAgICAiTWltZS1WZXJzaW9uOiAxLjBcbiIKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Qk9VTkRBUllcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICItLUJPVU5EQVJZXG4iCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiYm9keSBlbmRpbmcgd2l0aCBDUkxGIG5ld2xpbmVcclxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIi0tQk9VTkRBUlktLVxuIgorICAgICAgICAgICkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9wYXlsb2FkKDApLmdldF9wYXlsb2FkKCkuZW5kc3dpdGgoJ1xyXG4nKSkKKworCitjbGFzcyBUZXN0QmFzZTY0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9sZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjRNSU1FLmJhc2U2NF9sZW4oJ2hlbGxvJyksCisgICAgICAgICAgIGxlbihiYXNlNjRNSU1FLmVuY29kZSgnaGVsbG8nLCBlb2w9JycpKSkKKyAgICAgICAgZm9yIHNpemUgaW4gcmFuZ2UoMTUpOgorICAgICAgICAgICAgaWYgICBzaXplID09IDAgOiBic2l6ZSA9IDAKKyAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSAzIDogYnNpemUgPSA0CisgICAgICAgICAgICBlbGlmIHNpemUgPD0gNiA6IGJzaXplID0gOAorICAgICAgICAgICAgZWxpZiBzaXplIDw9IDkgOiBic2l6ZSA9IDEyCisgICAgICAgICAgICBlbGlmIHNpemUgPD0gMTI6IGJzaXplID0gMTYKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgIDogYnNpemUgPSAyMAorICAgICAgICAgICAgZXEoYmFzZTY0TUlNRS5iYXNlNjRfbGVuKCd4JypzaXplKSwgYnNpemUpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjRNSU1FLmRlY29kZSgnJyksICcnKQorICAgICAgICBlcShiYXNlNjRNSU1FLmRlY29kZSgnYUdWc2JHOD0nKSwgJ2hlbGxvJykKKyAgICAgICAgZXEoYmFzZTY0TUlNRS5kZWNvZGUoJ2FHVnNiRzg9JywgJ1gnKSwgJ2hlbGxvJykKKyAgICAgICAgZXEoYmFzZTY0TUlNRS5kZWNvZGUoJ2FHVnNiRzhOQ25kdmNteGtcbicsICdYJyksICdoZWxsb1h3b3JsZCcpCisKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjRNSU1FLmVuY29kZSgnJyksICcnKQorICAgICAgICBlcShiYXNlNjRNSU1FLmVuY29kZSgnaGVsbG8nKSwgJ2FHVnNiRzg9XG4nKQorICAgICAgICAjIFRlc3QgdGhlIGJpbmFyeSBmbGFnCisgICAgICAgIGVxKGJhc2U2NE1JTUUuZW5jb2RlKCdoZWxsb1xuJyksICdhR1ZzYkc4S1xuJykKKyAgICAgICAgZXEoYmFzZTY0TUlNRS5lbmNvZGUoJ2hlbGxvXG4nLCAwKSwgJ2FHVnNiRzhOQ2c9PVxuJykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZworICAgICAgICBlcShiYXNlNjRNSU1FLmVuY29kZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDApLCAiIiJcCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnCitlSGg0ZUNCNGVIaDRJQT09CisiIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKGJhc2U2NE1JTUUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2dccgorZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZ1xyCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnXHIKK2VIaDRlQ0I0ZUhoNElBPT1ccgorIiIiKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGhlID0gYmFzZTY0TUlNRS5oZWFkZXJfZW5jb2RlCisgICAgICAgIGVxKGhlKCdoZWxsbycpLCAnPT9pc28tODg1OS0xP2I/YUdWc2JHOD0/PScpCisgICAgICAgIGVxKGhlKCdoZWxsb1xud29ybGQnKSwgJz0/aXNvLTg4NTktMT9iP2FHVnNiRzhOQ25kdmNteGs/PScpCisgICAgICAgICMgVGVzdCB0aGUgY2hhcnNldCBvcHRpb24KKyAgICAgICAgZXEoaGUoJ2hlbGxvJywgY2hhcnNldD0naXNvLTg4NTktMicpLCAnPT9pc28tODg1OS0yP2I/YUdWc2JHOD0/PScpCisgICAgICAgICMgVGVzdCB0aGUga2VlcF9lb2xzIGZsYWcKKyAgICAgICAgZXEoaGUoJ2hlbGxvXG53b3JsZCcsIGtlZXBfZW9scz1UcnVlKSwKKyAgICAgICAgICAgJz0/aXNvLTg4NTktMT9iP2FHVnNiRzhLZDI5eWJHUT0/PScpCisgICAgICAgICMgVGVzdCB0aGUgbWF4bGluZWxlbiBhcmd1bWVudAorICAgICAgICBlcShoZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDApLCAiIiJcCis9P2lzby04ODU5LTE/Yj9lSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIZz0/PQorID0/aXNvLTg4NTktMT9iP2VIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnPT89CisgPT9pc28tODg1OS0xP2I/SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGc9Pz0KKyA9P2lzby04ODU5LTE/Yj9lSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIZz0/PQorID0/aXNvLTg4NTktMT9iP2VDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNBPT89CisgPT9pc28tODg1OS0xP2I/ZUhoNGVDQjRlSGg0SUhoNGVIZ2c/PSIiIikKKyAgICAgICAgIyBUZXN0IHRoZSBlb2wgYXJndW1lbnQKKyAgICAgICAgZXEoaGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwLCBlb2w9J1xyXG4nKSwgIiIiXAorPT9pc28tODg1OS0xP2I/ZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGc9Pz1ccgorID0/aXNvLTg4NTktMT9iP2VIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnPT89XHIKKyA9P2lzby04ODU5LTE/Yj9JSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGc9Pz1ccgorID0/aXNvLTg4NTktMT9iP2VDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNBPT89XHIKKyA9P2lzby04ODU5LTE/Yj9lSGg0ZUNCNGVIaDRJSGg0ZUhnZz89IiIiKQorCisKKworY2xhc3MgVGVzdFF1b3ByaSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmhsaXQgPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnYScpLCBvcmQoJ3onKSsxKV0gKyBcCisgICAgICAgICAgICAgICAgICAgIFtjaHIoeCkgZm9yIHggaW4gcmFuZ2Uob3JkKCdBJyksIG9yZCgnWicpKzEpXSArIFwKKyAgICAgICAgICAgICAgICAgICAgW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJzAnKSwgb3JkKCc5JykrMSldICsgXAorICAgICAgICAgICAgICAgICAgICBbJyEnLCAnKicsICcrJywgJy0nLCAnLycsICcgJ10KKyAgICAgICAgc2VsZi5obm9uID0gW2Nocih4KSBmb3IgeCBpbiByYW5nZSgyNTYpIGlmIGNocih4KSBub3QgaW4gc2VsZi5obGl0XQorICAgICAgICBhc3NlcnQgbGVuKHNlbGYuaGxpdCkgKyBsZW4oc2VsZi5obm9uKSA9PSAyNTYKKyAgICAgICAgc2VsZi5ibGl0ID0gW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJyAnKSwgb3JkKCd+JykrMSldICsgWydcdCddCisgICAgICAgIHNlbGYuYmxpdC5yZW1vdmUoJz0nKQorICAgICAgICBzZWxmLmJub24gPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKDI1NikgaWYgY2hyKHgpIG5vdCBpbiBzZWxmLmJsaXRdCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5ibGl0KSArIGxlbihzZWxmLmJub24pID09IDI1NgorCisgICAgZGVmIHRlc3RfaGVhZGVyX3F1b3ByaV9jaGVjayhzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obGl0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxdW9wcmlNSU1FLmhlYWRlcl9xdW9wcmlfY2hlY2soYykpCisgICAgICAgIGZvciBjIGluIHNlbGYuaG5vbjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmlNSU1FLmhlYWRlcl9xdW9wcmlfY2hlY2soYykpCisKKyAgICBkZWYgdGVzdF9ib2R5X3F1b3ByaV9jaGVjayhzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5ibGl0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxdW9wcmlNSU1FLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmJub246CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocXVvcHJpTUlNRS5ib2R5X3F1b3ByaV9jaGVjayhjKSkKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9xdW9wcmlfbGVuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaHFsID0gcXVvcHJpTUlNRS5oZWFkZXJfcXVvcHJpX2xlbgorICAgICAgICBlbmMgPSBxdW9wcmlNSU1FLmhlYWRlcl9lbmNvZGUKKyAgICAgICAgZm9yIHMgaW4gKCdoZWxsbycsICdoQGVAbEBsQG9AJyk6CisgICAgICAgICAgICAjIEVtcHR5IGNoYXJzZXQgYW5kIG5vIGxpbmUtZW5kaW5ncy4gIDcgPT0gUkZDIGNocm9tZQorICAgICAgICAgICAgZXEoaHFsKHMpLCBsZW4oZW5jKHMsIGNoYXJzZXQ9JycsIGVvbD0nJykpLTcpCisgICAgICAgIGZvciBjIGluIHNlbGYuaGxpdDoKKyAgICAgICAgICAgIGVxKGhxbChjKSwgMSkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obm9uOgorICAgICAgICAgICAgZXEoaHFsKGMpLCAzKQorCisgICAgZGVmIHRlc3RfYm9keV9xdW9wcmlfbGVuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgYnFsID0gcXVvcHJpTUlNRS5ib2R5X3F1b3ByaV9sZW4KKyAgICAgICAgZm9yIGMgaW4gc2VsZi5ibGl0OgorICAgICAgICAgICAgZXEoYnFsKGMpLCAxKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmJub246CisgICAgICAgICAgICBlcShicWwoYyksIDMpCisKKyAgICBkZWYgdGVzdF9xdW90ZV91bnF1b3RlX2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIGZvciB4IGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBjID0gY2hyKHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1b3ByaU1JTUUudW5xdW90ZShxdW9wcmlNSU1FLnF1b3RlKGMpKSwgYykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoZSA9IHF1b3ByaU1JTUUuaGVhZGVyX2VuY29kZQorICAgICAgICBlcShoZSgnaGVsbG8nKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPz0nKQorICAgICAgICBlcShoZSgnaGVsbG9cbndvcmxkJyksICc9P2lzby04ODU5LTE/cT9oZWxsbz0wRD0wQXdvcmxkPz0nKQorICAgICAgICAjIFRlc3QgdGhlIGNoYXJzZXQgb3B0aW9uCisgICAgICAgIGVxKGhlKCdoZWxsbycsIGNoYXJzZXQ9J2lzby04ODU5LTInKSwgJz0/aXNvLTg4NTktMj9xP2hlbGxvPz0nKQorICAgICAgICAjIFRlc3QgdGhlIGtlZXBfZW9scyBmbGFnCisgICAgICAgIGVxKGhlKCdoZWxsb1xud29ybGQnLCBrZWVwX2VvbHM9VHJ1ZSksICc9P2lzby04ODU5LTE/cT9oZWxsbz0wQXdvcmxkPz0nKQorICAgICAgICAjIFRlc3QgYSBub24tQVNDSUkgY2hhcmFjdGVyCisgICAgICAgIGVxKGhlKCdoZWxsb1x4Yzd0aGVyZScpLCAnPT9pc28tODg1OS0xP3E/aGVsbG89Qzd0aGVyZT89JykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCksICIiIlwKKz0/aXNvLTg4NTktMT9xP3h4eHhfeHh4eF94eHh4X3h4eHhfeHg/PQorID0/aXNvLTg4NTktMT9xP3h4X3h4eHhfeHh4eF94eHh4X3h4eHg/PQorID0/aXNvLTg4NTktMT9xP194eHh4X3h4eHhfeHh4eF94eHh4X3g/PQorID0/aXNvLTg4NTktMT9xP3h4eF94eHh4X3h4eHhfeHh4eF94eHg/PQorID0/aXNvLTg4NTktMT9xP3hfeHh4eF94eHh4Xz89IiIiKQorICAgICAgICAjIFRlc3QgdGhlIGVvbCBhcmd1bWVudAorICAgICAgICBlcShoZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDAsIGVvbD0nXHJcbicpLCAiIiJcCis9P2lzby04ODU5LTE/cT94eHh4X3h4eHhfeHh4eF94eHh4X3h4Pz1ccgorID0/aXNvLTg4NTktMT9xP3h4X3h4eHhfeHh4eF94eHh4X3h4eHg/PVxyCisgPT9pc28tODg1OS0xP3E/X3h4eHhfeHh4eF94eHh4X3h4eHhfeD89XHIKKyA9P2lzby04ODU5LTE/cT94eHhfeHh4eF94eHh4X3h4eHhfeHh4Pz1ccgorID0/aXNvLTg4NTktMT9xP3hfeHh4eF94eHh4Xz89IiIiKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEocXVvcHJpTUlNRS5kZWNvZGUoJycpLCAnJykKKyAgICAgICAgZXEocXVvcHJpTUlNRS5kZWNvZGUoJ2hlbGxvJyksICdoZWxsbycpCisgICAgICAgIGVxKHF1b3ByaU1JTUUuZGVjb2RlKCdoZWxsbycsICdYJyksICdoZWxsbycpCisgICAgICAgIGVxKHF1b3ByaU1JTUUuZGVjb2RlKCdoZWxsb1xud29ybGQnLCAnWCcpLCAnaGVsbG9Yd29ybGQnKQorCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEocXVvcHJpTUlNRS5lbmNvZGUoJycpLCAnJykKKyAgICAgICAgZXEocXVvcHJpTUlNRS5lbmNvZGUoJ2hlbGxvJyksICdoZWxsbycpCisgICAgICAgICMgVGVzdCB0aGUgYmluYXJ5IGZsYWcKKyAgICAgICAgZXEocXVvcHJpTUlNRS5lbmNvZGUoJ2hlbGxvXHJcbndvcmxkJyksICdoZWxsb1xud29ybGQnKQorICAgICAgICBlcShxdW9wcmlNSU1FLmVuY29kZSgnaGVsbG9cclxud29ybGQnLCAwKSwgJ2hlbGxvXG53b3JsZCcpCisgICAgICAgICMgVGVzdCB0aGUgbWF4bGluZWxlbiBhcmcKKyAgICAgICAgZXEocXVvcHJpTUlNRS5lbmNvZGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwKSwgIiIiXAoreHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4PQorIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4PQoreCB4eHh4IHh4eHggeHh4eCB4eHh4PTIwIiIiKQorICAgICAgICAjIFRlc3QgdGhlIGVvbCBhcmd1bWVudAorICAgICAgICBlcShxdW9wcmlNSU1FLmVuY29kZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDAsIGVvbD0nXHJcbicpLCAiIiJcCit4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHg9XHIKKyB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eD1ccgoreCB4eHh4IHh4eHggeHh4eCB4eHh4PTIwIiIiKQorICAgICAgICBlcShxdW9wcmlNSU1FLmVuY29kZSgiIiJcCitvbmUgbGluZQorCit0d28gbGluZSIiIiksICIiIlwKK29uZSBsaW5lCisKK3R3byBsaW5lIiIiKQorCisKKworIyBUZXN0IHRoZSBDaGFyc2V0IGNsYXNzCitjbGFzcyBUZXN0Q2hhcnNldCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmcm9tIGVtYWlsIGltcG9ydCBDaGFyc2V0IGFzIENoYXJzZXRNb2R1bGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIENoYXJzZXRNb2R1bGUuQ0hBUlNFVFNbJ2Zha2UnXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBNYWtlIHN1cmUgdXMtYXNjaWkgPSBubyBVbmljb2RlIGNvbnZlcnNpb24KKyAgICAgICAgYyA9IENoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgcyA9ICdIZWxsbyBXb3JsZCEnCisgICAgICAgIHNwID0gYy50b19zcGxpdHRhYmxlKHMpCisgICAgICAgIGVxKHMsIGMuZnJvbV9zcGxpdHRhYmxlKHNwKSkKKyAgICAgICAgIyB0ZXN0IDgtYml0IGlkZW1wb3RlbmN5IHdpdGggdXMtYXNjaWkKKyAgICAgICAgcyA9ICdceGE0XHhhMlx4YTRceGE0XHhhNFx4YTZceGE0XHhhOFx4YTRceGFhJworICAgICAgICBzcCA9IGMudG9fc3BsaXR0YWJsZShzKQorICAgICAgICBlcShzLCBjLmZyb21fc3BsaXR0YWJsZShzcCkpCisKKyAgICBkZWYgdGVzdF9ib2R5X2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgVHJ5IGEgY2hhcnNldCB3aXRoIFFQIGJvZHkgZW5jb2RpbmcKKyAgICAgICAgYyA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBlcSgnaGVsbG8gdz1GNnJsZCcsIGMuYm9keV9lbmNvZGUoJ2hlbGxvIHdceGY2cmxkJykpCisgICAgICAgICMgVHJ5IGEgY2hhcnNldCB3aXRoIEJhc2U2NCBib2R5IGVuY29kaW5nCisgICAgICAgIGMgPSBDaGFyc2V0KCd1dGYtOCcpCisgICAgICAgIGVxKCdhR1ZzYkc4Z2QyOXliR1E9XG4nLCBjLmJvZHlfZW5jb2RlKCdoZWxsbyB3b3JsZCcpKQorICAgICAgICAjIFRyeSBhIGNoYXJzZXQgd2l0aCBOb25lIGJvZHkgZW5jb2RpbmcKKyAgICAgICAgYyA9IENoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgZXEoJ2hlbGxvIHdvcmxkJywgYy5ib2R5X2VuY29kZSgnaGVsbG8gd29ybGQnKSkKKyAgICAgICAgIyBUcnkgdGhlIGNvbnZlcnQgYXJndW1lbnQsIHdoZXJlIGlucHV0IGNvZGVjICE9IG91dHB1dCBjb2RlYworICAgICAgICBjID0gQ2hhcnNldCgnZXVjLWpwJykKKyAgICAgICAgIyBXaXRoIGFwb2xvZ2llcyB0byBUb2tpbyBLaWt1Y2hpIDspCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVxKCdceDFiJEI1RkNPO35JV1x4MWIoQicsCisgICAgICAgICAgICAgICBjLmJvZHlfZW5jb2RlKCdceGI1XHhjNlx4YzNceGNmXHhiYlx4ZmVceGM5XHhkNycpKQorICAgICAgICAgICAgZXEoJ1x4YjVceGM2XHhjM1x4Y2ZceGJiXHhmZVx4YzlceGQ3JywKKyAgICAgICAgICAgICAgIGMuYm9keV9lbmNvZGUoJ1x4YjVceGM2XHhjM1x4Y2ZceGJiXHhmZVx4YzlceGQ3JywgRmFsc2UpKQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICAjIFdlIHByb2JhYmx5IGRvbid0IGhhdmUgdGhlIEphcGFuZXNlIGNvZGVjcyBpbnN0YWxsZWQKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBUZXN0aW5nIFNGIGJ1ZyAjNjI1NTA5LCB3aGljaCB3ZSBoYXZlIHRvIGZha2UsIHNpbmNlIHRoZXJlIGFyZSBubworICAgICAgICAjIGJ1aWx0LWluIGVuY29kaW5ncyB3aGVyZSB0aGUgaGVhZGVyIGVuY29kaW5nIGlzIFFQIGJ1dCB0aGUgYm9keQorICAgICAgICAjIGVuY29kaW5nIGlzIG5vdC4KKyAgICAgICAgZnJvbSBlbWFpbCBpbXBvcnQgQ2hhcnNldCBhcyBDaGFyc2V0TW9kdWxlCisgICAgICAgIENoYXJzZXRNb2R1bGUuYWRkX2NoYXJzZXQoJ2Zha2UnLCBDaGFyc2V0TW9kdWxlLlFQLCBOb25lKQorICAgICAgICBjID0gQ2hhcnNldCgnZmFrZScpCisgICAgICAgIGVxKCdoZWxsbyB3XHhmNnJsZCcsIGMuYm9keV9lbmNvZGUoJ2hlbGxvIHdceGY2cmxkJykpCisKKyAgICBkZWYgdGVzdF91bmljb2RlX2NoYXJzZXRfbmFtZShzZWxmKToKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQodSd1cy1hc2NpaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNoYXJzZXQpLCAndXMtYXNjaWknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFcnJvcnMuQ2hhcnNldEVycm9yLCBDaGFyc2V0LCAnYXNjXHhmZmlpJykKKworICAgIGRlZiB0ZXN0X2NvZGVjc19hbGlhc2VzX2FjY2VwdGVkKHNlbGYpOgorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCgndXRmOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNoYXJzZXQpLCAndXRmLTgnKQorCisKKyMgVGVzdCBtdWx0aWxpbmd1YWwgTUlNRSBoZWFkZXJzLgorY2xhc3MgVGVzdEhlYWRlcihUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ0hlbGxvIFdvcmxkIScpCisgICAgICAgIGVxKGguZW5jb2RlKCksICdIZWxsbyBXb3JsZCEnKQorICAgICAgICBoLmFwcGVuZCgnIEdvb2RieWUgV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkISAgR29vZGJ5ZSBXb3JsZCEnKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX3N1cnByaXNlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCdIZWxsbyBXb3JsZCEnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnSGVsbG8gV29ybGQhJykKKyAgICAgICAgaC5hcHBlbmQoJ0dvb2RieWUgV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkISBHb29kYnllIFdvcmxkIScpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfbmVlZHNfbm9fZGVjb2Rpbmcoc2VsZik6CisgICAgICAgIGggPSAnbm8gZGVjb2RpbmcgbmVlZGVkJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZV9oZWFkZXIoaCksIFsoaCwgTm9uZSldKQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgaCA9IEhlYWRlcigiSSBhbSB0aGUgdmVyeSBtb2RlbCBvZiBhIG1vZGVybiBNYWpvci1HZW5lcmFsOyBJJ3ZlIGluZm9ybWF0aW9uIHZlZ2V0YWJsZSwgYW5pbWFsLCBhbmQgbWluZXJhbDsgSSBrbm93IHRoZSBraW5ncyBvZiBFbmdsYW5kLCBhbmQgSSBxdW90ZSB0aGUgZmlnaHRzIGhpc3RvcmljYWwgZnJvbSBNYXJhdGhvbiB0byBXYXRlcmxvbywgaW4gb3JkZXIgY2F0ZWdvcmljYWw7IEknbSB2ZXJ5IHdlbGwgYWNxdWFpbnRlZCwgdG9vLCB3aXRoIG1hdHRlcnMgbWF0aGVtYXRpY2FsOyBJIHVuZGVyc3RhbmQgZXF1YXRpb25zLCBib3RoIHRoZSBzaW1wbGUgYW5kIHF1YWRyYXRpY2FsOyBhYm91dCBiaW5vbWlhbCB0aGVvcmVtIEknbSB0ZWVtaW5nIHdpdGggYSBsb3QgbycgbmV3cywgd2l0aCBtYW55IGNoZWVyZnVsIGZhY3RzIGFib3V0IHRoZSBzcXVhcmUgb2YgdGhlIGh5cG90ZW51c2UuIiwKKyAgICAgICAgICAgICAgICAgICBtYXhsaW5lbGVuPTc2KQorICAgICAgICBmb3IgbCBpbiBoLmVuY29kZShzcGxpdGNoYXJzPScgJykuc3BsaXQoJ1xuICcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihsKSA8PSA3NikKKworICAgIGRlZiB0ZXN0X211bHRpbGluZ3VhbChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgZyA9IENoYXJzZXQoImlzby04ODU5LTEiKQorICAgICAgICBjeiA9IENoYXJzZXQoImlzby04ODU5LTIiKQorICAgICAgICB1dGY4ID0gQ2hhcnNldCgidXRmLTgiKQorICAgICAgICBnX2hlYWQgPSAiRGllIE1pZXRlciB0cmV0ZW4gaGllciBlaW4gd2VyZGVuIG1pdCBlaW5lbSBGb2VyZGVyYmFuZCBrb21mb3J0YWJlbCBkZW4gS29ycmlkb3IgZW50bGFuZywgYW4gc1x4ZmNkbFx4ZmNuZGlzY2hlbiBXYW5kZ2VtXHhlNGxkZW4gdm9yYmVpLCBnZWdlbiBkaWUgcm90aWVyZW5kZW4gS2xpbmdlbiBiZWZceGY2cmRlcnQuICIKKyAgICAgICAgY3pfaGVhZCA9ICJGaW5hblx4ZThuaSBtZXRyb3BvbGUgc2UgaHJvdXRpbHkgcG9kIHRsYWtlbSBqZWppY2ggZFx4Zjl2dGlwdS4uICIKKyAgICAgICAgdXRmOF9oZWFkID0gdSJcdTZiNjNcdTc4YmFcdTMwNmJcdThhMDBcdTMwNDZcdTMwNjhcdTdmZmJcdThhMzNcdTMwNmZcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTRlMDBcdTkwZThcdTMwNmZcdTMwYzlcdTMwYTRcdTMwYzRcdThhOWVcdTMwNjdcdTMwNTlcdTMwNGNcdTMwMDFcdTMwNDJcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNWZcdTMwODlcdTMwODFcdTMwNjdcdTMwNTlcdTMwMDJcdTViOWZcdTk2OWJcdTMwNmJcdTMwNmZcdTMwMGNXZW5uIGlzdCBkYXMgTnVuc3R1Y2sgZ2l0IHVuZCBTbG90ZXJtZXllcj8gSmEhIEJlaWhlcmh1bmQgZGFzIE9kZXIgZGllIEZsaXBwZXJ3YWxkdCBnZXJzcHV0Llx1MzAwZFx1MzA2OFx1OGEwMFx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiIuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgIGggPSBIZWFkZXIoZ19oZWFkLCBnKQorICAgICAgICBoLmFwcGVuZChjel9oZWFkLCBjeikKKyAgICAgICAgaC5hcHBlbmQodXRmOF9oZWFkLCB1dGY4KQorICAgICAgICBlbmMgPSBoLmVuY29kZSgpCisgICAgICAgIGVxKGVuYywgIiIiXAorPT9pc28tODg1OS0xP3E/RGllX01pZXRlcl90cmV0ZW5faGllcl9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZGVyYmFuZF9rbz89CisgPT9pc28tODg1OS0xP3E/bWZvcnRhYmVsX2Rlbl9Lb3JyaWRvcl9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaXNjaGVuX1dhbj89CisgPT9pc28tODg1OS0xP3E/ZGdlbT1FNGxkZW5fdm9yYmVpPTJDX2dlZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZ2VuX2JlZj1GNj89CisgPT9pc28tODg1OS0xP3E/cmRlcnQ9MkVfPz0gPT9pc28tODg1OS0yP3E/RmluYW49RThuaV9tZXRyb3BvbGVfc2VfaHJvdXRpbHk/PQorID0/aXNvLTg4NTktMj9xP19wb2RfdGxha2VtX2plamljaF9kPUY5dnRpcHU9MkU9MkVfPz0gPT91dGYtOD9iPzVxMmo1Nks2Pz0KKyA9P3V0Zi04P2I/NDRHcjZLaUE0NEdHNDRHbzU3Kzc2S2l6NDRHdjQ0R1Y0NEtNNDRHbTQ0R0U0NEcrNDRHYjQ0S1Q0NENDPz0KKyA9P3V0Zi04P2I/NUxpQTZZT280NEd2NDRPSjQ0S2s0NE9FNktxZTQ0R240NEdaNDRHTTQ0Q0I0NEdDNDRHbzQ0R3Y0NEduPz0KKyA9P3V0Zi04P2I/NDRHZjQ0S0o0NEtCNDRHbjQ0R1o0NENDNWE2ZjZacWI0NEdyNDRHdjQ0Q01WMlZ1YmlCcGMzUWdaR0Z6Pz0KKyA9P3V0Zi04P3E/X051bnN0dWNrX2dpdF91bmRfU2xvdGVybWV5ZXI9M0ZfSmEhX0JlaWhlcmh1bmRfZGFzX09kZXJfZGllX0ZsPz0KKyA9P3V0Zi04P2I/YVhCd1pYSjNZV3hrZENCblpYSnpjSFYwTHVPQWplT0JxT2lvZ09PQm8rT0JwdU9CaE9PQnZ1T0JtUT09Pz0KKyA9P3V0Zi04P2I/NDRDQz89IiIiKQorICAgICAgICBlcShkZWNvZGVfaGVhZGVyKGVuYyksCisgICAgICAgICAgIFsoZ19oZWFkLCAiaXNvLTg4NTktMSIpLCAoY3pfaGVhZCwgImlzby04ODU5LTIiKSwKKyAgICAgICAgICAgICh1dGY4X2hlYWQsICJ1dGYtOCIpXSkKKyAgICAgICAgdXN0ciA9IHVuaWNvZGUoaCkKKyAgICAgICAgZXEodXN0ci5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICdEaWUgTWlldGVyIHRyZXRlbiBoaWVyIGVpbiB3ZXJkZW4gbWl0IGVpbmVtIEZvZXJkZXJiYW5kICcKKyAgICAgICAgICAgJ2tvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhjM1x4YmNkbFx4YzNceGJjbmRpc2NoZW4gJworICAgICAgICAgICAnV2FuZGdlbVx4YzNceGE0bGRlbiB2b3JiZWksIGdlZ2VuIGRpZSByb3RpZXJlbmRlbiBLbGluZ2VuICcKKyAgICAgICAgICAgJ2JlZlx4YzNceGI2cmRlcnQuIEZpbmFuXHhjNFx4OGRuaSBtZXRyb3BvbGUgc2UgaHJvdXRpbHkgcG9kICcKKyAgICAgICAgICAgJ3RsYWtlbSBqZWppY2ggZFx4YzVceGFmdnRpcHUuLiBceGU2XHhhZFx4YTNceGU3XHhhMlx4YmFceGUzXHg4MScKKyAgICAgICAgICAgJ1x4YWJceGU4XHhhOFx4ODBceGUzXHg4MVx4ODZceGUzXHg4MVx4YThceGU3XHhiZlx4YmJceGU4XHhhOFx4YjMnCisgICAgICAgICAgICdceGUzXHg4MVx4YWZceGUzXHg4MVx4OTVceGUzXHg4Mlx4OGNceGUzXHg4MVx4YTZceGUzXHg4MVx4ODRceGUzJworICAgICAgICAgICAnXHg4MVx4YmVceGUzXHg4MVx4OWJceGUzXHg4Mlx4OTNceGUzXHg4MFx4ODJceGU0XHhiOFx4ODBceGU5XHg4MycKKyAgICAgICAgICAgJ1x4YThceGUzXHg4MVx4YWZceGUzXHg4M1x4ODlceGUzXHg4Mlx4YTRceGUzXHg4M1x4ODRceGU4XHhhYVx4OWUnCisgICAgICAgICAgICdceGUzXHg4MVx4YTdceGUzXHg4MVx4OTlceGUzXHg4MVx4OGNceGUzXHg4MFx4ODFceGUzXHg4MVx4ODJceGUzJworICAgICAgICAgICAnXHg4MVx4YThceGUzXHg4MVx4YWZceGUzXHg4MVx4YTdceGUzXHg4MVx4OWZceGUzXHg4Mlx4ODlceGUzXHg4MicKKyAgICAgICAgICAgJ1x4ODFceGUzXHg4MVx4YTdceGUzXHg4MVx4OTlceGUzXHg4MFx4ODJceGU1XHhhZVx4OWZceGU5XHg5YVx4OWInCisgICAgICAgICAgICdceGUzXHg4MVx4YWJceGUzXHg4MVx4YWZceGUzXHg4MFx4OGNXZW5uIGlzdCBkYXMgTnVuc3R1Y2sgZ2l0ICcKKyAgICAgICAgICAgJ3VuZCBTbG90ZXJtZXllcj8gSmEhIEJlaWhlcmh1bmQgZGFzIE9kZXIgZGllIEZsaXBwZXJ3YWxkdCAnCisgICAgICAgICAgICdnZXJzcHV0Llx4ZTNceDgwXHg4ZFx4ZTNceDgxXHhhOFx4ZThceGE4XHg4MFx4ZTNceDgxXHhhM1x4ZTNceDgxJworICAgICAgICAgICAnXHhhNlx4ZTNceDgxXHg4NFx4ZTNceDgxXHhiZVx4ZTNceDgxXHg5OVx4ZTNceDgwXHg4MicpCisgICAgICAgICMgVGVzdCBtYWtlX2hlYWRlcigpCisgICAgICAgIG5ld2ggPSBtYWtlX2hlYWRlcihkZWNvZGVfaGVhZGVyKGVuYykpCisgICAgICAgIGVxKG5ld2gsIGVuYykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9jdG9yX2RlZmF1bHRfYXJncyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIGVxKGgsICcnKQorICAgICAgICBoLmFwcGVuZCgnZm9vJywgQ2hhcnNldCgnaXNvLTg4NTktMScpKQorICAgICAgICBlcShoLCAnPT9pc28tODg1OS0xP3E/Zm9vPz0nKQorCisgICAgZGVmIHRlc3RfZXhwbGljaXRfbWF4bGluZWxlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaHN0ciA9ICdBIHZlcnkgbG9uZyBsaW5lIHRoYXQgbXVzdCBnZXQgc3BsaXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYXQgdGhlIDc2dGggY2hhcmFjdGVyIGJvdW5kYXJ5IHRvIHRlc3QgdGhlIG5vbi1kZWZhdWx0IGJlaGF2aW9yJworICAgICAgICBoID0gSGVhZGVyKGhzdHIpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK0EgdmVyeSBsb25nIGxpbmUgdGhhdCBtdXN0IGdldCBzcGxpdCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhdCB0aGUgNzZ0aAorIGNoYXJhY3RlciBib3VuZGFyeSB0byB0ZXN0IHRoZSBub24tZGVmYXVsdCBiZWhhdmlvcicnJykKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBoZWFkZXJfbmFtZT0nU3ViamVjdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK0EgdmVyeSBsb25nIGxpbmUgdGhhdCBtdXN0IGdldCBzcGxpdCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhdCB0aGUKKyA3NnRoIGNoYXJhY3RlciBib3VuZGFyeSB0byB0ZXN0IHRoZSBub24tZGVmYXVsdCBiZWhhdmlvcicnJykKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBtYXhsaW5lbGVuPTEwMjQsIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgaHN0cikKKworICAgIGRlZiB0ZXN0X3VzX2FzY2lpX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnaGVsbG8nCisgICAgICAgIHggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKHgsIFsoJ2hlbGxvJywgTm9uZSldKQorICAgICAgICBoID0gbWFrZV9oZWFkZXIoeCkKKyAgICAgICAgZXEocywgaC5lbmNvZGUoKSkKKworICAgIGRlZiB0ZXN0X3N0cmluZ19jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIGguYXBwZW5kKCdoZWxsbycsICdpc28tODg1OS0xJykKKyAgICAgICAgZXEoaCwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPz0nKQorCisjIyAgICBkZWYgdGVzdF91bmljb2RlX2Vycm9yKHNlbGYpOgorIyMgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgSGVhZGVyLCB1J1tQXHhmNnN0YWxdJywgJ3VzLWFzY2lpJykKKyMjICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBIZWFkZXIsICdbUFx4ZjZzdGFsXScsICd1cy1hc2NpaScpCisjIyAgICAgICAgaCA9IEhlYWRlcigpCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgaC5hcHBlbmQsIHUnW1BceGY2c3RhbF0nLCAndXMtYXNjaWknKQorIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIGguYXBwZW5kLCAnW1BceGY2c3RhbF0nLCAndXMtYXNjaWknKQorIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIEhlYWRlciwgdSdcdTgzY2FcdTU3MzBcdTY2NDJcdTU5MmInLCAnaXNvLTg4NTktMScpCisKKyAgICBkZWYgdGVzdF91dGY4X3Nob3J0ZXN0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcih1J3BceGY2c3RhbCcsICd1dGYtOCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICc9P3V0Zi04P3E/cD1DMz1CNnN0YWw/PScpCisgICAgICAgIGggPSBIZWFkZXIodSdcdTgzY2FcdTU3MzBcdTY2NDJcdTU5MmInLCAndXRmLTgnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnPT91dGYtOD9iPzZJK0s1Wnl3NXBtQzVhU3I/PScpCisKKyAgICBkZWYgdGVzdF9iYWRfOGJpdF9oZWFkZXIoc2VsZik6CisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB4ID0gJ1lud3A0ZFVFYmF5IEF1Y3Rpb24gU2VtaWFyLSBObyBDaGFyZ2UgXHg5NiBFYXJuIEJpZycKKyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgSGVhZGVyLCB4KQorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgaC5hcHBlbmQsIHgpCisgICAgICAgIGVxKHN0cihIZWFkZXIoeCwgZXJyb3JzPSdyZXBsYWNlJykpLCB4KQorICAgICAgICBoLmFwcGVuZCh4LCBlcnJvcnM9J3JlcGxhY2UnKQorICAgICAgICBlcShzdHIoaCksIHgpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVkX2FkamFjZW50X25vbmVuY29kZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgaC5hcHBlbmQoJ2hlbGxvJywgJ2lzby04ODU5LTEnKQorICAgICAgICBoLmFwcGVuZCgnd29ybGQnKQorICAgICAgICBzID0gaC5lbmNvZGUoKQorICAgICAgICBlcShzLCAnPT9pc28tODg1OS0xP3E/aGVsbG8/PSB3b3JsZCcpCisgICAgICAgIGggPSBtYWtlX2hlYWRlcihkZWNvZGVfaGVhZGVyKHMpKQorICAgICAgICBlcShoLmVuY29kZSgpLCBzKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9lYXRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnU3ViamVjdDogPT9rb2k4LXI/Yj84TkxQMThYU3k4RWd6c0VneHNuT3djell6dGs9Pz0gPT9rb2k4LXI/cT89Q0E/PSB6ei4nCisgICAgICAgIHBhcnRzID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBlcShwYXJ0cywgWygnU3ViamVjdDonLCBOb25lKSwgKCdceGYwXHhkMlx4Y2ZceGQ3XHhjNVx4ZDJceGNiXHhjMSBceGNlXHhjMSBceGM2XHhjOVx4Y2VceGMxXHhjY1x4ZDhceGNlXHhkOVx4Y2EnLCAna29pOC1yJyksICgnenouJywgTm9uZSldKQorICAgICAgICBoZHIgPSBtYWtlX2hlYWRlcihwYXJ0cykKKyAgICAgICAgZXEoaGRyLmVuY29kZSgpLAorICAgICAgICAgICAnU3ViamVjdDogPT9rb2k4LXI/Yj84TkxQMThYU3k4RWd6c0VneHNuT3djell6dG5LPz0genouJykKKworICAgIGRlZiB0ZXN0X2Jyb2tlbl9iYXNlNjRfaGVhZGVyKHNlbGYpOgorICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcworICAgICAgICBzID0gJ1N1YmplY3Q6ID0/RVVDLUtSP0I/Q1NpeHBMRHRLU0MvN0xpdXZzYXg0aUM2dUxtd01jaWpJS0hhSUx6U3dkL0gwU0M4K0xDandMc2d2N1cvK01qM0kgPz0nCisgICAgICAgIHJhaXNlcyhFcnJvcnMuSGVhZGVyUGFyc2VFcnJvciwgZGVjb2RlX2hlYWRlciwgcykKKworICAgICMgSXNzdWUgMTA3ODkxOQorICAgIGRlZiB0ZXN0X2FzY2lpX2FkZF9oZWFkZXIoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2J1ZC5naWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhdHRhY2htZW50OyBmaWxlbmFtZT0iYnVkLmdpZiInLAorICAgICAgICAgICAgbXNnWydDb250ZW50LURpc3Bvc2l0aW9uJ10pCisKKyAgICBkZWYgdGVzdF9ub25hc2NpaV9hZGRfaGVhZGVyX3ZpYV90cmlwbGUoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywKKyAgICAgICAgICAgIGZpbGVuYW1lPSgnaXNvLTg4NTktMScsICcnLCAnRnVceGRmYmFsbGVyLnBwdCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lKj0iaXNvLTg4NTktMVwnXCdGdSVERmJhbGxlci5wcHQiJywKKyAgICAgICAgICAgIG1zZ1snQ29udGVudC1EaXNwb3NpdGlvbiddKQorCisgICAgZGVmIHRlc3RfZW5jb2RlX3VuYWxpYXNlZF9jaGFyc2V0KHNlbGYpOgorICAgICAgICAjIElzc3VlIDEzNzk0MTY6IHdoZW4gdGhlIGNoYXJzZXQgaGFzIG5vIG91dHB1dCBjb252ZXJzaW9uLAorICAgICAgICAjIG91dHB1dCB3YXMgYWNjaWRlbnRhbGx5IGdldHRpbmcgY29lcmNlZCB0byB1bmljb2RlLgorICAgICAgICByZXMgPSBIZWFkZXIoJ2FiYycsJ2lzby04ODU5LTInKS5lbmNvZGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgJz0/aXNvLTg4NTktMj9xP2FiYz89JykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHJlcywgc3RyKQorCisKKyMgVGVzdCBSRkMgMjIzMSBoZWFkZXIgcGFyYW1ldGVycyAoZW4vZGUpY29kaW5nCitjbGFzcyBUZXN0UkZDMjIzMShUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yOS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCd0aXRsZScpLAorICAgICAgICAgICAoJ3VzLWFzY2lpJywgJ2VuJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJykpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3RpdGxlJywgdW5xdW90ZT1GYWxzZSksCisgICAgICAgICAgICgndXMtYXNjaWknLCAnZW4nLCAnIlRoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhIicpKQorCisgICAgZGVmIHRlc3Rfc2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ3RpdGxlJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0PSd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3RpdGxlJyksCisgICAgICAgICAgICgndXMtYXNjaWknLCAnJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJykpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ3RpdGxlJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0PSd1cy1hc2NpaScsIGxhbmd1YWdlPSdlbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3RpdGxlJyksCisgICAgICAgICAgICgndXMtYXNjaWknLCAnZW4nLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnKSkKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgbXNnLnNldF9wYXJhbSgndGl0bGUnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ9J3VzLWFzY2lpJywgbGFuZ3VhZ2U9J2VuJykKKyAgICAgICAgc2VsZi5uZGlmZkFzc2VydEVxdWFsKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKKyBpZCAyN0NFQUQzOENDOyBGcmksICA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MDkwLjYxMzA0LjExMDkyOS40NTY4NEBhYWEuenp6Lm9yZz4KK0Zyb206IGJiYkBkZGQuY29tIChKb2huIFguIERvZSkKK1RvOiBiYmJAenp6Lm9yZworU3ViamVjdDogVGhpcyBpcyBhIHRlc3QgbWVzc2FnZQorRGF0ZTogRnJpLCA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWk7CisgdGl0bGUqPSJ1cy1hc2NpaSdlbidUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMGlzbiUyN3QlMjBpdCUyMSIKKworCitIaSwKKworRG8geW91IGxpa2UgdGhpcyBtZXNzYWdlPworCistTWUKKyIiIikKKworICAgIGRlZiB0ZXN0X2RlbF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnZm9vJywgJ2JhcicsIGNoYXJzZXQ9J3VzLWFzY2lpJywgbGFuZ3VhZ2U9J2VuJykKKyAgICAgICAgbXNnLnNldF9wYXJhbSgndGl0bGUnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnLAorICAgICAgICAgICAgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBtc2cuZGVsX3BhcmFtKCdmb28nLCBoZWFkZXI9J0NvbnRlbnQtVHlwZScpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKKyBpZCAyN0NFQUQzOENDOyBGcmksICA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MDkwLjYxMzA0LjExMDkyOS40NTY4NEBhYWEuenp6Lm9yZz4KK0Zyb206IGJiYkBkZGQuY29tIChKb2huIFguIERvZSkKK1RvOiBiYmJAenp6Lm9yZworU3ViamVjdDogVGhpcyBpcyBhIHRlc3QgbWVzc2FnZQorRGF0ZTogRnJpLCA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIjsKKyB0aXRsZSo9InVzLWFzY2lpJ2VuJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwaXNuJTI3dCUyMGl0JTIxIgorCisKK0hpLAorCitEbyB5b3UgbGlrZSB0aGlzIG1lc3NhZ2U/CisKKy1NZQorIiIiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9nZXRfY29udGVudF9jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzIudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwgJ3VzLWFzY2lpJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9ImZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNUF9uc21haWwuaHRtIgorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IE5BTUUqMD1maWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTTsgTkFNRSoxPVBfbnNtYWlsLmh0bQorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ05BTUUnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHBhcmFtLAorICAgICAgICAgICAgJ2ZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNUF9uc21haWwuaHRtJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9maWxlbmFtZShzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9maWxlbmFtZV9lbmNvZGVkKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9wYXJ0bHlfZW5jb2RlZChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMD0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9wYXJ0bHlfbm9uZW5jb2RlZChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMD0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXRfaW5fYm91bmRhcnkoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsKK1x0Ym91bmRhcnkqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRib3VuZGFyeSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Ym91bmRhcnkqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2JvdW5kYXJ5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9jaGFyc2V0KHNlbGYpOgorICAgICAgICAjIFRoaXMgaXMgYSBub25zZW5zaWNhbCBjaGFyc2V0IHZhbHVlLCBidXQgdGVzdHMgdGhlIGNvZGUgYW55d2F5CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47CitcdGNoYXJzZXQqMCo9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0Y2hhcnNldCoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Y2hhcnNldCoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2VuY29kaW5nX2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iYm9ndXMneHgnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2VuY29kaW5nX2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQqPWJvZ3VzJyd1dGYtOCVFMiU4MCU5RAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICAjIFRoaXMgc2hvdWxkIHJldHVybiBOb25lIGJlY2F1c2Ugbm9uLWFzY2lpIGNoYXJhY3RlcnMgaW4gdGhlIGNoYXJzZXQKKyAgICAgICAgIyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2NoYXJhY3Rlcl9pbl9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0Kj1hc2NpaScndXRmLTglRTIlODAlOUQKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgIyBUaGlzIHNob3VsZCByZXR1cm4gTm9uZSBiZWNhdXNlIG5vbi1hc2NpaSBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyc2V0CisgICAgICAgICMgYXJlIG5vdCBhbGxvd2VkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2JhZF9jaGFyYWN0ZXJfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSJhc2NpaSd4eCdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyKj0iaXMgaXQgbm90LnBkZiVFMiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZlx1ZmZmZCcpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3Vua25vd25fZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lKj1YLVVOS05PV04nJ215ZmlsZS50eHQKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksICdteWZpbGUudHh0JykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfc2luZ2xlX3RpY2tfaW5fZmlsZW5hbWVfZXh0ZW5kZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowKj1cIkZyYW5rJ3NcIjsgbmFtZSoxKj1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsIE5vbmUpCisgICAgICAgIGVxKGxhbmd1YWdlLCBOb25lKQorICAgICAgICBlcShzLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3NpbmdsZV90aWNrX2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsgbmFtZSowPVwiRnJhbmsnc1wiOyBuYW1lKjE9XCIgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV90aWNrX2F0dGFja19leHRlbmRlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwidXMtYXNjaWknZW4tdXMnRnJhbmsnc1wiOyBuYW1lKjEqPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdGlja19hdHRhY2soc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjA9XCJ1cy1hc2NpaSdlbi11cydGcmFuaydzXCI7IG5hbWUqMT1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLCAidXMtYXNjaWknZW4tdXMnRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2V4dGVuZGVkX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOyBuYW1lPVwiRnJhbmsncyBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ25hbWUnKSwgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9lbmNvZGVkX3RoZW5fdW5lbmNvZGVkX3NlZ21lbnRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMCo9XCJ1cy1hc2NpaSdlbi11cydNeVwiOworXHRuYW1lKjE9XCIgRG9jdW1lbnRcIjsKK1x0bmFtZSoyKj1cIiBGb3IgWW91XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICdNeSBEb2N1bWVudCBGb3IgWW91JykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdW5lbmNvZGVkX3RoZW5fZW5jb2RlZF9zZWdtZW50cyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjA9XCJ1cy1hc2NpaSdlbi11cydNeVwiOworXHRuYW1lKjEqPVwiIERvY3VtZW50XCI7CitcdG5hbWUqMio9XCIgRm9yIFlvdVwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKGxhbmd1YWdlLCAnZW4tdXMnKQorICAgICAgICBlcShzLCAnTXkgRG9jdW1lbnQgRm9yIFlvdScpCisKKworCisjIFRlc3RzIHRvIGVuc3VyZSB0aGF0IHNpZ25lZCBwYXJ0cyBvZiBhbiBlbWFpbCBhcmUgY29tcGxldGVseSBwcmVzZXJ2ZWQsIGFzCisjIHJlcXVpcmVkIGJ5IFJGQzE4NDcgc2VjdGlvbiAyLjEuICBOb3RlIHRoYXQgdGhlc2UgYXJlIGluY29tcGxldGUsIGJlY2F1c2UgdGhlCisjIGVtYWlsIHBhY2thZ2UgZG9lcyBub3QgY3VycmVudGx5IGFsd2F5cyBwcmVzZXJ2ZSB0aGUgYm9keS4gIFNlZSBpc3N1ZSAxNjcwNzY1LgorY2xhc3MgVGVzdFNpZ25lZChUZXN0RW1haWxCYXNlKToKKworICAgIGRlZiBfbXNnX2FuZF9vYmooc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmcCA9IG9wZW5maWxlKGZpbmRmaWxlKGZpbGVuYW1lKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3JpZ2luYWwgPSBmcC5yZWFkKCkKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcob3JpZ2luYWwpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHJldHVybiBvcmlnaW5hbCwgbXNnCisKKyAgICBkZWYgX3NpZ25lZF9wYXJ0c19lcShzZWxmLCBvcmlnaW5hbCwgcmVzdWx0KToKKyAgICAgICAgIyBFeHRyYWN0IHRoZSBmaXJzdCBtaW1lIHBhcnQgb2YgZWFjaCBtZXNzYWdlCisgICAgICAgIGltcG9ydCByZQorICAgICAgICByZXBhcnQgPSByZS5jb21waWxlKHInXi0tKFteXG5dKylcbiguKj8pXG4tLVwxJCcsIHJlLlMgfCByZS5NKQorICAgICAgICBpbnBhcnQgPSByZXBhcnQuc2VhcmNoKG9yaWdpbmFsKS5ncm91cCgyKQorICAgICAgICBvdXRwYXJ0ID0gcmVwYXJ0LnNlYXJjaChyZXN1bHQpLmdyb3VwKDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cGFydCwgaW5wYXJ0KQorCisgICAgZGVmIHRlc3RfbG9uZ19oZWFkZXJzX2FzX3N0cmluZyhzZWxmKToKKyAgICAgICAgb3JpZ2luYWwsIG1zZyA9IHNlbGYuX21zZ19hbmRfb2JqKCdtc2dfNDUudHh0JykKKyAgICAgICAgcmVzdWx0ID0gbXNnLmFzX3N0cmluZygpCisgICAgICAgIHNlbGYuX3NpZ25lZF9wYXJ0c19lcShvcmlnaW5hbCwgcmVzdWx0KQorCisgICAgZGVmIHRlc3RfbG9uZ19oZWFkZXJzX2ZsYXR0ZW4oc2VsZik6CisgICAgICAgIG9yaWdpbmFsLCBtc2cgPSBzZWxmLl9tc2dfYW5kX29iaignbXNnXzQ1LnR4dCcpCisgICAgICAgIGZwID0gU3RyaW5nSU8oKQorICAgICAgICBHZW5lcmF0b3IoZnApLmZsYXR0ZW4obXNnKQorICAgICAgICByZXN1bHQgPSBmcC5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuX3NpZ25lZF9wYXJ0c19lcShvcmlnaW5hbCwgcmVzdWx0KQorCisKKworZGVmIF90ZXN0Y2xhc3NlcygpOgorICAgIG1vZCA9IHN5cy5tb2R1bGVzW19fbmFtZV9fXQorICAgIHJldHVybiBbZ2V0YXR0cihtb2QsIG5hbWUpIGZvciBuYW1lIGluIGRpcihtb2QpIGlmIG5hbWUuc3RhcnRzd2l0aCgnVGVzdCcpXQorCisKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBmb3IgdGVzdGNsYXNzIGluIF90ZXN0Y2xhc3NlcygpOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZSh0ZXN0Y2xhc3MpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBmb3IgdGVzdGNsYXNzIGluIF90ZXN0Y2xhc3NlcygpOgorICAgICAgICBydW5fdW5pdHRlc3QodGVzdGNsYXNzKQorCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSdzdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY5Njg5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiNWI5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyNzUwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weQpAQCAtMCwwICsxLDc3IEBACisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisjIGVtYWlsIHBhY2thZ2UgdW5pdCB0ZXN0cyBmb3IgKG9wdGlvbmFsKSBBc2lhbiBjb2RlY3MKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworZnJvbSBlbWFpbC50ZXN0LnRlc3RfZW1haWwgaW1wb3J0IFRlc3RFbWFpbEJhc2UKK2Zyb20gZW1haWwuY2hhcnNldCBpbXBvcnQgQ2hhcnNldAorZnJvbSBlbWFpbC5oZWFkZXIgaW1wb3J0IEhlYWRlciwgZGVjb2RlX2hlYWRlcgorZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCisKKyMgV2UncmUgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgdGhlIGJ1aWx0LWluIEFzaWFuCisjIGNvZGVjcywgc28gd2UgaGF2ZSB0byBza2lwIGFsbCB0aGVzZSB0ZXN0cy4KK3RyeToKKyAgICB1bmljb2RlKCdmb28nLCAnZXVjLWpwJykKK2V4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdAorCisKKwwKK2NsYXNzIFRlc3RFbWFpbEFzaWFuQ29kZWNzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2phcGFuZXNlX2NvZGVjcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaiA9IENoYXJzZXQoImV1Yy1qcCIpCisgICAgICAgIGcgPSBDaGFyc2V0KCJpc28tODg1OS0xIikKKyAgICAgICAgaCA9IEhlYWRlcigiSGVsbG8gV29ybGQhIikKKyAgICAgICAgamhlbGxvID0gJ1x4YTVceGNmXHhhNVx4ZWRceGExXHhiY1x4YTVceGVmXHhhMVx4YmNceGE1XHhlYlx4YTVceGM5XHhhMVx4YWEnCisgICAgICAgIGdoZWxsbyA9ICdHclx4ZmNceGRmIEdvdHQhJworICAgICAgICBoLmFwcGVuZChqaGVsbG8sIGopCisgICAgICAgIGguYXBwZW5kKGdoZWxsbywgZykKKyAgICAgICAgIyBCQVc6IFRoaXMgdXNlZCB0byAtLSBhbmQgbWF5YmUgc2hvdWxkIC0tIGZvbGQgdGhlIHR3byBpc28tODg1OS0xCisgICAgICAgICMgY2h1bmtzIGludG8gYSBzaW5nbGUgZW5jb2RlZCB3b3JkLiAgSG93ZXZlciBpdCBkb2Vzbid0IHZpb2xhdGUgdGhlCisgICAgICAgICMgc3RhbmRhcmQgdG8gaGF2ZSB0aGVtIGFzIHR3byBlbmNvZGVkIGNodW5rcyBhbmQgbWF5YmUgaXQncworICAgICAgICAjIHJlYXNvbmFibGUgPHdpbms+IGZvciBlYWNoIC5hcHBlbmQoKSBjYWxsIHRvIHJlc3VsdCBpbiBhIHNlcGFyYXRlCisgICAgICAgICMgZW5jb2RlZCB3b3JkLgorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitIZWxsbyBXb3JsZCEgPT9pc28tMjAyMi1qcD9iP0d5UkNKVThsYlNFOEpXOGhQQ1ZySlVraEtoc29RZz09Pz0KKyA9P2lzby04ODU5LTE/cT9Hcj1GQz1ERj89ID0/aXNvLTg4NTktMT9xP19Hb3R0IT89IiIiKQorICAgICAgICBlcShkZWNvZGVfaGVhZGVyKGguZW5jb2RlKCkpLAorICAgICAgICAgICBbKCdIZWxsbyBXb3JsZCEnLCBOb25lKSwKKyAgICAgICAgICAgICgnXHgxYiRCJU8lbSE8JW8hPCVrJUkhKlx4MWIoQicsICdpc28tMjAyMi1qcCcpLAorICAgICAgICAgICAgKCdHclx4ZmNceGRmIEdvdHQhJywgJ2lzby04ODU5LTEnKV0pCisgICAgICAgIGxvbmcgPSAndGVzdC1qYSBceGE0XHhkOFx4YzVceGVhXHhiOVx4YzZceGE0XHhiNVx4YTRceGVjXHhhNFx4YmZceGE1XHhlMVx4YTFceGJjXHhhNVx4ZWJceGE0XHhjZlx4YmJceGNhXHhiMlx4ZjFceGJjXHhkNFx4YTRceGNlXHhiZVx4YjVceGM3XHhhN1x4YTRceGYyXHhjMlx4ZDRceGE0XHhjM1x4YTRceGM2XHhhNFx4YTRceGE0XHhkZVx4YTRceGI5JworICAgICAgICBoID0gSGVhZGVyKGxvbmcsIGosIGhlYWRlcl9uYW1lPSJTdWJqZWN0IikKKyAgICAgICAgIyB0ZXN0IGEgdmVyeSBsb25nIGhlYWRlcgorICAgICAgICBlbmMgPSBoLmVuY29kZSgpCisgICAgICAgICMgVEs6IHNwbGl0dGluZyBwb2ludCBtYXkgZGlmZmVyIGJ5IGNvZGVjIGRlc2lnbiBhbmQvb3IgSGVhZGVyIGVuY29kaW5nCisgICAgICAgIGVxKGVuYyAsICIiIlwKKz0/aXNvLTIwMjItanA/Yj9kR1Z6ZEMxcVlTQWJKRUlrV0VWcU9VWWtOU1JzSkQ4bFlTRThKV3NrVHp0S0d5aEM/PQorID0/aXNvLTIwMjItanA/Yj9HeVJDTW5FOFZDUk9QalZISnlSeVFsUWtReVJHSkNRa1hpUTVHeWhDPz0iIiIpCisgICAgICAgICMgVEs6IGZ1bGwgZGVjb2RlIGNvbXBhcmlzb24KKyAgICAgICAgZXEoaC5fX3VuaWNvZGVfXygpLmVuY29kZSgnZXVjLWpwJyksIGxvbmcpCisKKyAgICBkZWYgdGVzdF9wYXlsb2FkX2VuY29kaW5nKHNlbGYpOgorICAgICAgICBqaGVsbG8gPSAnXHhhNVx4Y2ZceGE1XHhlZFx4YTFceGJjXHhhNVx4ZWZceGExXHhiY1x4YTVceGViXHhhNVx4YzlceGExXHhhYScKKyAgICAgICAgamNvZGUgID0gJ2V1Yy1qcCcKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZChqaGVsbG8sIGpjb2RlKQorICAgICAgICB1c3RyID0gdW5pY29kZShtc2cuZ2V0X3BheWxvYWQoKSwgbXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqaGVsbG8sIHVzdHIuZW5jb2RlKGpjb2RlKSkKKworCisMCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdEVtYWlsQXNpYW5Db2RlY3MpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdEVtYWlsQXNpYW5Db2RlY3MpCisKKworDAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSdzdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2IwMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2IwMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5weSBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjc1MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5weQpAQCAtMCwwICsxLDc3IEBACisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisjIGVtYWlsIHBhY2thZ2UgdW5pdCB0ZXN0cyBmb3IgKG9wdGlvbmFsKSBBc2lhbiBjb2RlY3MKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworZnJvbSBlbWFpbC50ZXN0LnRlc3RfZW1haWwgaW1wb3J0IFRlc3RFbWFpbEJhc2UKK2Zyb20gZW1haWwuY2hhcnNldCBpbXBvcnQgQ2hhcnNldAorZnJvbSBlbWFpbC5oZWFkZXIgaW1wb3J0IEhlYWRlciwgZGVjb2RlX2hlYWRlcgorZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCisKKyMgV2UncmUgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIGJ1dCBpdCBkb2Vzbid0IGhhdmUgdGhlIGJ1aWx0LWluIEFzaWFuCisjIGNvZGVjcywgc28gd2UgaGF2ZSB0byBza2lwIGFsbCB0aGVzZSB0ZXN0cy4KK3RyeToKKyAgICB1bmljb2RlKCdmb28nLCAnZXVjLWpwJykKK2V4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdAorCisKKwwKK2NsYXNzIFRlc3RFbWFpbEFzaWFuQ29kZWNzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2phcGFuZXNlX2NvZGVjcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaiA9IENoYXJzZXQoImV1Yy1qcCIpCisgICAgICAgIGcgPSBDaGFyc2V0KCJpc28tODg1OS0xIikKKyAgICAgICAgaCA9IEhlYWRlcigiSGVsbG8gV29ybGQhIikKKyAgICAgICAgamhlbGxvID0gJ1x4YTVceGNmXHhhNVx4ZWRceGExXHhiY1x4YTVceGVmXHhhMVx4YmNceGE1XHhlYlx4YTVceGM5XHhhMVx4YWEnCisgICAgICAgIGdoZWxsbyA9ICdHclx4ZmNceGRmIEdvdHQhJworICAgICAgICBoLmFwcGVuZChqaGVsbG8sIGopCisgICAgICAgIGguYXBwZW5kKGdoZWxsbywgZykKKyAgICAgICAgIyBCQVc6IFRoaXMgdXNlZCB0byAtLSBhbmQgbWF5YmUgc2hvdWxkIC0tIGZvbGQgdGhlIHR3byBpc28tODg1OS0xCisgICAgICAgICMgY2h1bmtzIGludG8gYSBzaW5nbGUgZW5jb2RlZCB3b3JkLiAgSG93ZXZlciBpdCBkb2Vzbid0IHZpb2xhdGUgdGhlCisgICAgICAgICMgc3RhbmRhcmQgdG8gaGF2ZSB0aGVtIGFzIHR3byBlbmNvZGVkIGNodW5rcyBhbmQgbWF5YmUgaXQncworICAgICAgICAjIHJlYXNvbmFibGUgPHdpbms+IGZvciBlYWNoIC5hcHBlbmQoKSBjYWxsIHRvIHJlc3VsdCBpbiBhIHNlcGFyYXRlCisgICAgICAgICMgZW5jb2RlZCB3b3JkLgorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitIZWxsbyBXb3JsZCEgPT9pc28tMjAyMi1qcD9iP0d5UkNKVThsYlNFOEpXOGhQQ1ZySlVraEtoc29RZz09Pz0KKyA9P2lzby04ODU5LTE/cT9Hcj1GQz1ERj89ID0/aXNvLTg4NTktMT9xP19Hb3R0IT89IiIiKQorICAgICAgICBlcShkZWNvZGVfaGVhZGVyKGguZW5jb2RlKCkpLAorICAgICAgICAgICBbKCdIZWxsbyBXb3JsZCEnLCBOb25lKSwKKyAgICAgICAgICAgICgnXHgxYiRCJU8lbSE8JW8hPCVrJUkhKlx4MWIoQicsICdpc28tMjAyMi1qcCcpLAorICAgICAgICAgICAgKCdHclx4ZmNceGRmIEdvdHQhJywgJ2lzby04ODU5LTEnKV0pCisgICAgICAgIGxvbmcgPSAndGVzdC1qYSBceGE0XHhkOFx4YzVceGVhXHhiOVx4YzZceGE0XHhiNVx4YTRceGVjXHhhNFx4YmZceGE1XHhlMVx4YTFceGJjXHhhNVx4ZWJceGE0XHhjZlx4YmJceGNhXHhiMlx4ZjFceGJjXHhkNFx4YTRceGNlXHhiZVx4YjVceGM3XHhhN1x4YTRceGYyXHhjMlx4ZDRceGE0XHhjM1x4YTRceGM2XHhhNFx4YTRceGE0XHhkZVx4YTRceGI5JworICAgICAgICBoID0gSGVhZGVyKGxvbmcsIGosIGhlYWRlcl9uYW1lPSJTdWJqZWN0IikKKyAgICAgICAgIyB0ZXN0IGEgdmVyeSBsb25nIGhlYWRlcgorICAgICAgICBlbmMgPSBoLmVuY29kZSgpCisgICAgICAgICMgVEs6IHNwbGl0dGluZyBwb2ludCBtYXkgZGlmZmVyIGJ5IGNvZGVjIGRlc2lnbiBhbmQvb3IgSGVhZGVyIGVuY29kaW5nCisgICAgICAgIGVxKGVuYyAsICIiIlwKKz0/aXNvLTIwMjItanA/Yj9kR1Z6ZEMxcVlTQWJKRUlrV0VWcU9VWWtOU1JzSkQ4bFlTRThKV3NrVHp0S0d5aEM/PQorID0/aXNvLTIwMjItanA/Yj9HeVJDTW5FOFZDUk9QalZISnlSeVFsUWtReVJHSkNRa1hpUTVHeWhDPz0iIiIpCisgICAgICAgICMgVEs6IGZ1bGwgZGVjb2RlIGNvbXBhcmlzb24KKyAgICAgICAgZXEoaC5fX3VuaWNvZGVfXygpLmVuY29kZSgnZXVjLWpwJyksIGxvbmcpCisKKyAgICBkZWYgdGVzdF9wYXlsb2FkX2VuY29kaW5nKHNlbGYpOgorICAgICAgICBqaGVsbG8gPSAnXHhhNVx4Y2ZceGE1XHhlZFx4YTFceGJjXHhhNVx4ZWZceGExXHhiY1x4YTVceGViXHhhNVx4YzlceGExXHhhYScKKyAgICAgICAgamNvZGUgID0gJ2V1Yy1qcCcKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZChqaGVsbG8sIGpjb2RlKQorICAgICAgICB1c3RyID0gdW5pY29kZShtc2cuZ2V0X3BheWxvYWQoKSwgbXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqaGVsbG8sIHVzdHIuZW5jb2RlKGpjb2RlKSkKKworCisMCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdEVtYWlsQXNpYW5Db2RlY3MpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdEVtYWlsQXNpYW5Db2RlY3MpCisKKworDAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSdzdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlNTFiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlNTFiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzk3ZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQpAQCAtMCwwICsxLDMzMjkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKyMgZW1haWwgcGFja2FnZSB1bml0IHRlc3RzCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCBkaWZmbGliCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2ltcG9ydCBlbWFpbAorCitmcm9tIGVtYWlsLmNoYXJzZXQgaW1wb3J0IENoYXJzZXQKK2Zyb20gZW1haWwuaGVhZGVyIGltcG9ydCBIZWFkZXIsIGRlY29kZV9oZWFkZXIsIG1ha2VfaGVhZGVyCitmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgUGFyc2VyLCBIZWFkZXJQYXJzZXIKK2Zyb20gZW1haWwuZ2VuZXJhdG9yIGltcG9ydCBHZW5lcmF0b3IsIERlY29kZWRHZW5lcmF0b3IKK2Zyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQorZnJvbSBlbWFpbC5taW1lLmFwcGxpY2F0aW9uIGltcG9ydCBNSU1FQXBwbGljYXRpb24KK2Zyb20gZW1haWwubWltZS5hdWRpbyBpbXBvcnQgTUlNRUF1ZGlvCitmcm9tIGVtYWlsLm1pbWUudGV4dCBpbXBvcnQgTUlNRVRleHQKK2Zyb20gZW1haWwubWltZS5pbWFnZSBpbXBvcnQgTUlNRUltYWdlCitmcm9tIGVtYWlsLm1pbWUuYmFzZSBpbXBvcnQgTUlNRUJhc2UKK2Zyb20gZW1haWwubWltZS5tZXNzYWdlIGltcG9ydCBNSU1FTWVzc2FnZQorZnJvbSBlbWFpbC5taW1lLm11bHRpcGFydCBpbXBvcnQgTUlNRU11bHRpcGFydAorZnJvbSBlbWFpbCBpbXBvcnQgdXRpbHMKK2Zyb20gZW1haWwgaW1wb3J0IGVycm9ycworZnJvbSBlbWFpbCBpbXBvcnQgZW5jb2RlcnMKK2Zyb20gZW1haWwgaW1wb3J0IGl0ZXJhdG9ycworZnJvbSBlbWFpbCBpbXBvcnQgYmFzZTY0bWltZQorZnJvbSBlbWFpbCBpbXBvcnQgcXVvcHJpbWltZQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBmaW5kZmlsZSwgcnVuX3VuaXR0ZXN0Citmcm9tIGVtYWlsLnRlc3QgaW1wb3J0IF9fZmlsZV9fIGFzIGxhbmRtYXJrCisKKworTkwgPSAnXG4nCitFTVBUWVNUUklORyA9ICcnCitTUEFDRSA9ICcgJworCisKKworZGVmIG9wZW5maWxlKGZpbGVuYW1lLCBtb2RlPSdyJyk6CisgICAgcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUobGFuZG1hcmspLCAnZGF0YScsIGZpbGVuYW1lKQorICAgIHJldHVybiBvcGVuKHBhdGgsIG1vZGUpCisKKworCisjIEJhc2UgdGVzdCBjbGFzcworY2xhc3MgVGVzdEVtYWlsQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIG5kaWZmQXNzZXJ0RXF1YWwoc2VsZiwgZmlyc3QsIHNlY29uZCk6CisgICAgICAgICIiIkxpa2UgYXNzZXJ0RXF1YWwgZXhjZXB0IHVzZSBuZGlmZiBmb3IgcmVhZGFibGUgb3V0cHV0LiIiIgorICAgICAgICBpZiBmaXJzdCAhPSBzZWNvbmQ6CisgICAgICAgICAgICBzZmlyc3QgPSBzdHIoZmlyc3QpCisgICAgICAgICAgICBzc2Vjb25kID0gc3RyKHNlY29uZCkKKyAgICAgICAgICAgIGRpZmYgPSBkaWZmbGliLm5kaWZmKHNmaXJzdC5zcGxpdGxpbmVzKCksIHNzZWNvbmQuc3BsaXRsaW5lcygpKQorICAgICAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgICAgICBwcmludCA+PiBmcCwgTkwsIE5MLmpvaW4oZGlmZikKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgZnAuZ2V0dmFsdWUoKQorCisgICAgZGVmIF9tc2dvYmooc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmcCA9IG9wZW5maWxlKGZpbmRmaWxlKGZpbGVuYW1lKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHJldHVybiBtc2cKKworCisKKyMgVGVzdCB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIE1lc3NhZ2UgY2xhc3MncyBBUEkKK2NsYXNzIFRlc3RNZXNzYWdlQVBJKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2dldF9hbGwoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yMC50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2FsbCgnY2MnKSwgWydjY2NAenp6Lm9yZycsICdkZGRAenp6Lm9yZycsICdlZWVAenp6Lm9yZyddKQorICAgICAgICBlcShtc2cuZ2V0X2FsbCgneHgnLCAnbi9hJyksICduL2EnKQorCisgICAgZGVmIHRlc3RfZ2V0c2V0X2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgZXEobXNnLmdldF9jaGFyc2V0KCksIE5vbmUpCisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KCdpc28tODg1OS0xJykKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KGNoYXJzZXQpCisgICAgICAgIGVxKG1zZ1snbWltZS12ZXJzaW9uJ10sICcxLjAnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xIicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ2lzby04ODU5LTEnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1b3RlZC1wcmludGFibGUnKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAnaXNvLTg4NTktMScpCisgICAgICAgICMgUmVtb3ZlIHRoZSBjaGFyc2V0CisgICAgICAgIG1zZy5zZXRfY2hhcnNldChOb25lKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKSwgTm9uZSkKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW4nKQorICAgICAgICAjIFRyeSBhZGRpbmcgYSBjaGFyc2V0IHdoZW4gdGhlcmUncyBhbHJlYWR5IE1JTUUgaGVhZGVycyBwcmVzZW50CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ01JTUUtVmVyc2lvbiddID0gJzIuMCcKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0L3gtd2VpcmQnCisgICAgICAgIG1zZ1snQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddID0gJ3F1aW50ZWQtcHVudGFibGUnCisgICAgICAgIG1zZy5zZXRfY2hhcnNldChjaGFyc2V0KQorICAgICAgICBlcShtc2dbJ21pbWUtdmVyc2lvbiddLCAnMi4wJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQveC13ZWlyZDsgY2hhcnNldD0iaXNvLTg4NTktMSInKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1aW50ZWQtcHVudGFibGUnKQorCisgICAgZGVmIHRlc3Rfc2V0X2NoYXJzZXRfZnJvbV9zdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KCd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLmlucHV0X2NoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSInKQorCisgICAgZGVmIHRlc3Rfc2V0X3BheWxvYWRfd2l0aF9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ1RoaXMgaXMgYSBzdHJpbmcgcGF5bG9hZCcsIGNoYXJzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jaGFyc2V0KCkuaW5wdXRfY2hhcnNldCwgJ2lzby04ODU5LTEnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NoYXJzZXRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wOC50eHQnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoKQorICAgICAgICBlcShjaGFyc2V0cywgW05vbmUsICd1cy1hc2NpaScsICdpc28tODg1OS0xJywgJ2lzby04ODU5LTInLCAna29pOC1yJ10pCisKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDkudHh0JykKKyAgICAgICAgY2hhcnNldHMgPSBtc2cuZ2V0X2NoYXJzZXRzKCdkaW5nYmF0JykKKyAgICAgICAgZXEoY2hhcnNldHMsIFsnZGluZ2JhdCcsICd1cy1hc2NpaScsICdpc28tODg1OS0xJywgJ2RpbmdiYXQnLAorICAgICAgICAgICAgICAgICAgICAgICdrb2k4LXInXSkKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xMi50eHQnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoKQorICAgICAgICBlcShjaGFyc2V0cywgW05vbmUsICd1cy1hc2NpaScsICdpc28tODg1OS0xJywgTm9uZSwgJ2lzby04ODU5LTInLAorICAgICAgICAgICAgICAgICAgICAgICdpc28tODg1OS0zJywgJ3VzLWFzY2lpJywgJ2tvaTgtciddKQorCisgICAgZGVmIHRlc3RfZ2V0X2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBmaWxlbmFtZXMgPSBbcC5nZXRfZmlsZW5hbWUoKSBmb3IgcCBpbiBtc2cuZ2V0X3BheWxvYWQoKV0KKyAgICAgICAgZXEoZmlsZW5hbWVzLCBbJ21zZy50eHQnLCAnbXNnLnR4dCddKQorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA3LnR4dCcpCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoc3VicGFydC5nZXRfZmlsZW5hbWUoKSwgJ2Rpbmd1c2Zpc2guZ2lmJykKKworICAgIGRlZiB0ZXN0X2dldF9maWxlbmFtZV93aXRoX25hbWVfcGFyYW1ldGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180NC50eHQnKQorICAgICAgICBmaWxlbmFtZXMgPSBbcC5nZXRfZmlsZW5hbWUoKSBmb3IgcCBpbiBtc2cuZ2V0X3BheWxvYWQoKV0KKyAgICAgICAgZXEoZmlsZW5hbWVzLCBbJ21zZy50eHQnLCAnbXNnLnR4dCddKQorCisgICAgZGVmIHRlc3RfZ2V0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDcudHh0JykKKyAgICAgICAgIyBObyBxdW90ZXMhCisgICAgICAgIGVxKG1zZy5nZXRfYm91bmRhcnkoKSwgJ0JPVU5EQVJZJykKKworICAgIGRlZiB0ZXN0X3NldF9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgVGhpcyBvbmUgaGFzIG5vIGV4aXN0aW5nIGJvdW5kYXJ5IHBhcmFtZXRlciwgYnV0IHRoZSBDb250ZW50LVR5cGU6CisgICAgICAgICMgaGVhZGVyIGFwcGVhcnMgZmlmdGguCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIG1zZy5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgaGVhZGVyLCB2YWx1ZSA9IG1zZy5pdGVtcygpWzRdCisgICAgICAgIGVxKGhlYWRlci5sb3dlcigpLCAnY29udGVudC10eXBlJykKKyAgICAgICAgZXEodmFsdWUsICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSI7IGJvdW5kYXJ5PSJCT1VOREFSWSInKQorICAgICAgICAjIFRoaXMgb25lIGhhcyBhIENvbnRlbnQtVHlwZTogaGVhZGVyLCB3aXRoIGEgYm91bmRhcnksIHN0dWNrIGluIHRoZQorICAgICAgICAjIG1pZGRsZSBvZiBpdHMgaGVhZGVycy4gIE1ha2Ugc3VyZSB0aGUgb3JkZXIgaXMgcHJlc2VydmVkOyBpdCBzaG91bGQKKyAgICAgICAgIyBiZSBmaWZ0aC4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDQudHh0JykKKyAgICAgICAgbXNnLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBoZWFkZXIsIHZhbHVlID0gbXNnLml0ZW1zKClbNF0KKyAgICAgICAgZXEoaGVhZGVyLmxvd2VyKCksICdjb250ZW50LXR5cGUnKQorICAgICAgICBlcSh2YWx1ZSwgJ211bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIicpCisgICAgICAgICMgQW5kIHRoaXMgb25lIGhhcyBubyBDb250ZW50LVR5cGU6IGhlYWRlciBhdCBhbGwuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9ycy5IZWFkZXJQYXJzZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cuc2V0X2JvdW5kYXJ5LCAnQk9VTkRBUlknKQorCisgICAgZGVmIHRlc3RfZ2V0X2RlY29kZWRfcGF5bG9hZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzEwLnR4dCcpCisgICAgICAgICMgVGhlIG91dGVyIG1lc3NhZ2UgaXMgYSBtdWx0aXBhcnQKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgTm9uZSkKKyAgICAgICAgIyBTdWJwYXJ0IDEgaXMgN2JpdCBlbmNvZGVkCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksCisgICAgICAgICAgICdUaGlzIGlzIGEgN2JpdCBlbmNvZGVkIG1lc3NhZ2UuXG4nKQorICAgICAgICAjIFN1YnBhcnQgMiBpcyBxdW9wcmkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDEpLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1x4YTFUaGlzIGlzIGEgUXVvdGVkIFByaW50YWJsZSBlbmNvZGVkIG1lc3NhZ2UhXG4nKQorICAgICAgICAjIFN1YnBhcnQgMyBpcyBiYXNlNjQKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDIpLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaXMgYSBCYXNlNjQgZW5jb2RlZCBtZXNzYWdlLicpCisgICAgICAgICMgU3VicGFydCA0IGlzIGJhc2U2NCB3aXRoIGEgdHJhaWxpbmcgbmV3bGluZSwgd2hpY2gKKyAgICAgICAgIyB1c2VkIHRvIGJlIHN0cmlwcGVkIChpc3N1ZSA3MTQzKS4KKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDMpLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaXMgYSBCYXNlNjQgZW5jb2RlZCBtZXNzYWdlLlxuJykKKyAgICAgICAgIyBTdWJwYXJ0IDUgaGFzIG5vIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGhlYWRlci4KKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDQpLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaGFzIG5vIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGhlYWRlci5cbicpCisKKyAgICBkZWYgdGVzdF9nZXRfZGVjb2RlZF91dV9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnYmVnaW4gNjY2IC1cbis6JjVMOyZcXEA9Vl1SOyYwIFxuIFxuZW5kXG4nKQorICAgICAgICBmb3IgY3RlIGluICgneC11dWVuY29kZScsICd1dWVuY29kZScsICd1dWUnLCAneC11dWUnKToKKyAgICAgICAgICAgIG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddID0gY3RlCisgICAgICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCAnaGVsbG8gd29ybGQnKQorICAgICAgICAjIE5vdyB0cnkgc29tZSBib2d1cyBkYXRhCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnZm9vJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgJ2ZvbycpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVkX2dlbmVyYXRvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA3LnR4dCcpCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18xNy50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBEZWNvZGVkR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHMuZ2V0dmFsdWUoKSwgdGV4dCkKKworICAgIGRlZiB0ZXN0X19jb250YWluc19fKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnTWUnCisgICAgICAgIG1zZ1sndG8nXSA9ICdZb3UnCisgICAgICAgICMgQ2hlY2sgZm9yIGNhc2UgaW5zZW5zaXRpdml0eQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2Zyb20nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdGcm9tJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnRlJPTScgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3RvJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnVG8nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdUTycgaW4gbXNnKQorCisgICAgZGVmIHRlc3RfYXNfc3RyaW5nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgQkFXIDMwLU1hci0yMDA5IEV2aWwgYmUgaGVyZS4gIFNvLCB0aGUgZ2VuZXJhdG9yIGlzIGJyb2tlbiB3aXRoCisgICAgICAgICAgICAjIHJlc3BlY3QgdG8gbG9uZyBsaW5lIGJyZWFraW5nLiAgSXQncyBhbHNvIG5vdCBpZGVtcG90ZW50IHdoZW4gYQorICAgICAgICAgICAgIyBoZWFkZXIgZnJvbSBhIHBhcnNlZCBtZXNzYWdlIGlzIGNvbnRpbnVlZCB3aXRoIHRhYnMgcmF0aGVyIHRoYW4KKyAgICAgICAgICAgICMgc3BhY2VzLiAgQmVmb3JlIHdlIGZpeGVkIGJ1ZyAxOTc0IGl0IHdhcyByZXZlcnNlZGx5IGJyb2tlbiwKKyAgICAgICAgICAgICMgaS5lLiBoZWFkZXJzIHRoYXQgd2VyZSBjb250aW51ZWQgd2l0aCBzcGFjZXMgZ290IGNvbnRpbnVlZCB3aXRoCisgICAgICAgICAgICAjIHRhYnMuICBGb3IgUHl0aG9uIDIueCB0aGVyZSdzIHJlYWxseSBubyBnb29kIGZpeCBhbmQgaW4gUHl0aG9uCisgICAgICAgICAgICAjIDMueCBhbGwgdGhpcyBzdHVmZiBpcyByZS13cml0dGVuIHRvIGJlIHJpZ2h0KGVyKS4gIENocmlzIFdpdGhlcnMKKyAgICAgICAgICAgICMgY29udmluY2VkIG1lIHRoYXQgdXNpbmcgc3BhY2UgYXMgdGhlIGRlZmF1bHQgY29udGludWF0aW9uCisgICAgICAgICAgICAjIGNoYXJhY3RlciBpcyBsZXNzIGJhZCBmb3IgbW9yZSBhcHBsaWNhdGlvbnMuCisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpLnJlcGxhY2UoJ1x0JywgJyAnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwodGV4dCwgbXNnLmFzX3N0cmluZygpKQorICAgICAgICBmdWxscmVwciA9IHN0cihtc2cpCisgICAgICAgIGxpbmVzID0gZnVsbHJlcHIuc3BsaXQoJ1xuJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzWzBdLnN0YXJ0c3dpdGgoJ0Zyb20gJykpCisgICAgICAgIGVxKHRleHQsIE5MLmpvaW4obGluZXNbMTpdKSkKKworICAgIGRlZiB0ZXN0X2JhZF9wYXJhbShzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiQ29udGVudC1UeXBlOiBibGFyZzsgYmF6OyBib29cbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnYmF6JyksICcnKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19maWxlbmFtZShzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiRnJvbTogZm9vXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2JvZ3VzX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAiQ29udGVudC1EaXNwb3NpdGlvbjogYmxhcmc7IGZpbGVuYW1lXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgJycpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCJGcm9tOiBmb29cbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9ib3VuZGFyeSgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAnWC1IZWFkZXI6IGZvbz1vbmU7IGJhcj10d287IGJhej10aHJlZVxuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoaGVhZGVyPSd4LWhlYWRlcicpLAorICAgICAgICAgICBbKCdmb28nLCAnb25lJyksICgnYmFyJywgJ3R3bycpLCAoJ2JheicsICd0aHJlZScpXSkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vOyBiYXI9b25lOyBiYXo9dHdvXG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcyhoZWFkZXI9J3gtaGVhZGVyJyksCisgICAgICAgICAgIFsoJ2ZvbycsICcnKSwgKCdiYXInLCAnb25lJyksICgnYmF6JywgJ3R3bycpXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwgTm9uZSkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vOyBiYXI9Im9uZSI7IGJhej10d29cbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKGhlYWRlcj0neC1oZWFkZXInKSwKKyAgICAgICAgICAgWygnZm9vJywgJycpLCAoJ2JhcicsICdvbmUnKSwgKCdiYXonLCAndHdvJyldKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtX2xpYmVyYWwoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ0NvbnRlbnQtVHlwZTogTXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeSA9ICJDUElNU1NNVFBDMDZwNWYzdEciJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGFyYW0oJ2JvdW5kYXJ5JyksICdDUElNU1NNVFBDMDZwNWYzdEcnKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICJYLUhlYWRlcjogZm9vPW9uZTsgYmFyPXR3bzsgYmF6PXRocmVlXG4iKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdiYXInLCBoZWFkZXI9J3gtaGVhZGVyJyksICd0d28nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdxdXV6JywgaGVhZGVyPSd4LWhlYWRlcicpLCBOb25lKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdxdXV6JyksIE5vbmUpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAnWC1IZWFkZXI6IGZvbzsgYmFyPSJvbmUiOyBiYXo9dHdvXG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdmb28nLCBoZWFkZXI9J3gtaGVhZGVyJyksICcnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdiYXInLCBoZWFkZXI9J3gtaGVhZGVyJyksICdvbmUnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdiYXonLCBoZWFkZXI9J3gtaGVhZGVyJyksICd0d28nKQorICAgICAgICAjIFhYWDogV2UgYXJlIG5vdCBSRkMtMjA0NSBjb21wbGlhbnQhICBXZSBjYW5ub3QgcGFyc2U6CisgICAgICAgICMgbXNnWyJDb250ZW50LVR5cGUiXSA9ICd0ZXh0L3BsYWluOyB3ZWlyZD0iaGV5OyBkb2xseT8gW3lvdV0gQCA8XFwiaG9tZVxcIj4/IicKKyAgICAgICAgIyBtc2cuZ2V0X3BhcmFtKCJ3ZWlyZCIpCisgICAgICAgICMgeWV0LgorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtX2Z1bmt5X2NvbnRpbnVhdGlvbl9saW5lcyhzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjIudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMSkuZ2V0X3BhcmFtKCduYW1lJyksICd3aWJibGUuSlBHJykKKworICAgIGRlZiB0ZXN0X2dldF9wYXJhbV93aXRoX3NlbWlzX2luX3F1b3RlcyhzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdDb250ZW50LVR5cGU6IGltYWdlL3BqcGVnOyBuYW1lPSJKaW0mYW1wOyZhbXA7SmlsbCJcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnbmFtZScpLCAnSmltJmFtcDsmYW1wO0ppbGwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGFyYW0oJ25hbWUnLCB1bnF1b3RlPUZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnIkppbSZhbXA7JmFtcDtKaWxsIicpCisKKyAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCdIZWFkZXI6IGV4aXN0cycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnaGVhZGVyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnSGVhZGVyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnSEVBREVSJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLmhhc19rZXkoJ2hlYWRlcmknKSkKKworICAgIGRlZiB0ZXN0X3NldF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdjaGFyc2V0JywgJ2lzby0yMDIyLWpwJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAnaXNvLTIwMjItanAnKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdpbXBvcnRhbmNlJywgJ2hpZ2ggdmFsdWUnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdpbXBvcnRhbmNlJyksICdoaWdoIHZhbHVlJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnaW1wb3J0YW5jZScsIHVucXVvdGU9RmFsc2UpLCAnImhpZ2ggdmFsdWUiJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwgWygndGV4dC9wbGFpbicsICcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnY2hhcnNldCcsICdpc28tMjAyMi1qcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbXBvcnRhbmNlJywgJ2hpZ2ggdmFsdWUnKV0pCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKHVucXVvdGU9RmFsc2UpLCBbKCd0ZXh0L3BsYWluJywgJycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdjaGFyc2V0JywgJyJpc28tMjAyMi1qcCInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnaW1wb3J0YW5jZScsICciaGlnaCB2YWx1ZSInKV0pCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2NoYXJzZXQnLCAnaXNvLTk5OTkteHgnLCBoZWFkZXI9J1gtSmltbXknKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JywgaGVhZGVyPSdYLUppbW15JyksICdpc28tOTk5OS14eCcpCisKKyAgICBkZWYgdGVzdF9kZWxfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLAorICAgICAgICAgICBbKCdtdWx0aXBhcnQvcmVwb3J0JywgJycpLCAoJ3JlcG9ydC10eXBlJywgJ2RlbGl2ZXJ5LXN0YXR1cycpLAorICAgICAgICAgICAgKCdib3VuZGFyeScsICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJyldKQorICAgICAgICBvbGRfdmFsID0gbXNnLmdldF9wYXJhbSgicmVwb3J0LXR5cGUiKQorICAgICAgICBtc2cuZGVsX3BhcmFtKCJyZXBvcnQtdHlwZSIpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksCisgICAgICAgICAgIFsoJ211bHRpcGFydC9yZXBvcnQnLCAnJyksCisgICAgICAgICAgICAoJ2JvdW5kYXJ5JywgJ0QxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20nKV0pCisgICAgICAgIG1zZy5zZXRfcGFyYW0oInJlcG9ydC10eXBlIiwgb2xkX3ZhbCkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwKKyAgICAgICAgICAgWygnbXVsdGlwYXJ0L3JlcG9ydCcsICcnKSwKKyAgICAgICAgICAgICgnYm91bmRhcnknLCAnRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbScpLAorICAgICAgICAgICAgKCdyZXBvcnQtdHlwZScsIG9sZF92YWwpXSkKKworICAgIGRlZiB0ZXN0X2RlbF9wYXJhbV9vbl9vdGhlcl9oZWFkZXIoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywgZmlsZW5hbWU9J2J1ZC5naWYnKQorICAgICAgICBtc2cuZGVsX3BhcmFtKCdmaWxlbmFtZScsICdjb250ZW50LWRpc3Bvc2l0aW9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSwgJ2F0dGFjaG1lbnQnKQorCisgICAgZGVmIHRlc3Rfc2V0X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbXNnLnNldF90eXBlLCAndGV4dCcpCisgICAgICAgIG1zZy5zZXRfdHlwZSgndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluJykKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnY2hhcnNldCcsICd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSInKQorICAgICAgICBtc2cuc2V0X3R5cGUoJ3RleHQvaHRtbCcpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L2h0bWw7IGNoYXJzZXQ9InVzLWFzY2lpIicpCisKKyAgICBkZWYgdGVzdF9zZXRfdHlwZV9vbl9vdGhlcl9oZWFkZXIoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1gtQ29udGVudC1UeXBlJ10gPSAndGV4dC9wbGFpbicKKyAgICAgICAgbXNnLnNldF90eXBlKCdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLCAnWC1Db250ZW50LVR5cGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1sneC1jb250ZW50LXR5cGUnXSwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX21pc3Npbmcoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfbWlzc2luZ193aXRoX2RlZmF1bHRfdHlwZShzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfZGVmYXVsdF90eXBlKCdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfZnJvbV9tZXNzYWdlX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UvcmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfZnJvbV9tZXNzYWdlX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yOC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UvcmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfZnJvbV9tZXNzYWdlX3RleHRfcGxhaW5faW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9taXNzaW5nKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfbWlzc2luZ193aXRoX2RlZmF1bHRfdHlwZShzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfZGVmYXVsdF90eXBlKCdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICdtZXNzYWdlJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX2Zyb21fbWVzc2FnZV9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzAudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ21lc3NhZ2UnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfZnJvbV9tZXNzYWdlX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yOC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF9tYWludHlwZSgpLCAnbWVzc2FnZScpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfZnJvbV9tZXNzYWdlX3RleHRfcGxhaW5fZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfbWlzc2luZyhzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfbWlzc2luZ193aXRoX2RlZmF1bHRfdHlwZShzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfZGVmYXVsdF90eXBlKCdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Zyb21fbWVzc2FnZV9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzAudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZnJvbV9tZXNzYWdlX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yOC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF9zdWJ0eXBlKCksICdyZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfZXJyb3Ioc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ25vLXNsYXNoLWluLXRoaXMtc3RyaW5nJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Vycm9yKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICduby1zbGFzaC1pbi10aGlzLXN0cmluZycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZV9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0ZpcnN0JywgJ09uZScpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdTZWNvbmQnLCAnVHdvJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ1RoaXJkJywgJ1RocmVlJykKKyAgICAgICAgZXEobXNnLmtleXMoKSwgWydGaXJzdCcsICdTZWNvbmQnLCAnVGhpcmQnXSkKKyAgICAgICAgZXEobXNnLnZhbHVlcygpLCBbJ09uZScsICdUd28nLCAnVGhyZWUnXSkKKyAgICAgICAgbXNnLnJlcGxhY2VfaGVhZGVyKCdTZWNvbmQnLCAnVHdlbnR5JykKKyAgICAgICAgZXEobXNnLmtleXMoKSwgWydGaXJzdCcsICdTZWNvbmQnLCAnVGhpcmQnXSkKKyAgICAgICAgZXEobXNnLnZhbHVlcygpLCBbJ09uZScsICdUd2VudHknLCAnVGhyZWUnXSkKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0ZpcnN0JywgJ0VsZXZlbicpCisgICAgICAgIG1zZy5yZXBsYWNlX2hlYWRlcignRmlyc3QnLCAnT25lIEh1bmRyZWQnKQorICAgICAgICBlcShtc2cua2V5cygpLCBbJ0ZpcnN0JywgJ1NlY29uZCcsICdUaGlyZCcsICdGaXJzdCddKQorICAgICAgICBlcShtc2cudmFsdWVzKCksIFsnT25lIEh1bmRyZWQnLCAnVHdlbnR5JywgJ1RocmVlJywgJ0VsZXZlbiddKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbXNnLnJlcGxhY2VfaGVhZGVyLCAnRm91cnRoJywgJ01pc3NpbmcnKQorCisgICAgZGVmIHRlc3RfYnJva2VuX2Jhc2U2NF9wYXlsb2FkKHNlbGYpOgorICAgICAgICB4ID0gJ0F3RHAwUDcvL3k2THdLRUFjUGEvNlE9OScKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snY29udGVudC10eXBlJ10gPSAnYXVkaW8veC1taWRpJworICAgICAgICBtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSA9ICdiYXNlNjQnCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksIHgpCisKKworCisjIFRlc3QgdGhlIGVtYWlsLmVuY29kZXJzIG1vZHVsZQorY2xhc3MgVGVzdEVuY29kZXJzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGVfZW1wdHlfcGF5bG9hZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfY3RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfY3RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBXaXRoIG5vIGV4cGxpY2l0IF9jaGFyc2V0IGl0cyB1cy1hc2NpaSwgYW5kIGFsbCBhcmUgNy1iaXQKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKyAgICAgICAgIyBTaW1pbGFyLCBidXQgd2l0aCA4LWJpdCBkYXRhCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyBceGY4IHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc4Yml0JykKKyAgICAgICAgIyBBbmQgbm93IHdpdGggYSBkaWZmZXJlbnQgY2hhcnNldAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gXHhmOCB3b3JsZCcsIF9jaGFyc2V0PSdpc28tODg1OS0xJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICdxdW90ZWQtcHJpbnRhYmxlJykKKworCisKKyMgVGVzdCBsb25nIGhlYWRlciB3cmFwcGluZworY2xhc3MgVGVzdExvbmdIZWFkZXJzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X3NwbGl0X2xvbmdfY29udGludWF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCIiIlwKK1N1YmplY3Q6IGJ1ZyBkZW1vbnN0cmF0aW9uCitcdDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CitcdG1vcmUgdGV4dAorCit0ZXN0CisiIiIpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzZnApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCitTdWJqZWN0OiBidWcgZGVtb25zdHJhdGlvbgorIDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CisgbW9yZSB0ZXh0CisKK3Rlc3QKKyIiIikKKworICAgIGRlZiB0ZXN0X2Fub3RoZXJfbG9uZ19hbG1vc3RfdW5zcGxpdHRhYmxlX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaHN0ciA9ICIiIlwKK2J1ZyBkZW1vbnN0cmF0aW9uCitcdDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CitcdG1vcmUgdGV4dCIiIgorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitidWcgZGVtb25zdHJhdGlvbgorXHQxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorXHRtb3JlIHRleHQiIiIpCisgICAgICAgIGggPSBIZWFkZXIoaHN0cikKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorYnVnIGRlbW9uc3RyYXRpb24KKyAxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorIG1vcmUgdGV4dCIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfbm9uc3RyaW5nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBnID0gQ2hhcnNldCgiaXNvLTg4NTktMSIpCisgICAgICAgIGN6ID0gQ2hhcnNldCgiaXNvLTg4NTktMiIpCisgICAgICAgIHV0ZjggPSBDaGFyc2V0KCJ1dGYtOCIpCisgICAgICAgIGdfaGVhZCA9ICJEaWUgTWlldGVyIHRyZXRlbiBoaWVyIGVpbiB3ZXJkZW4gbWl0IGVpbmVtIEZvZXJkZXJiYW5kIGtvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhmY2RsXHhmY25kaXNjaGVuIFdhbmRnZW1ceGU0bGRlbiB2b3JiZWksIGdlZ2VuIGRpZSByb3RpZXJlbmRlbiBLbGluZ2VuIGJlZlx4ZjZyZGVydC4gIgorICAgICAgICBjel9oZWFkID0gIkZpbmFuXHhlOG5pIG1ldHJvcG9sZSBzZSBocm91dGlseSBwb2QgdGxha2VtIGplamljaCBkXHhmOXZ0aXB1Li4gIgorICAgICAgICB1dGY4X2hlYWQgPSB1Ilx1NmI2M1x1NzhiYVx1MzA2Ylx1OGEwMFx1MzA0Nlx1MzA2OFx1N2ZmYlx1OGEzM1x1MzA2Zlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1NGUwMFx1OTBlOFx1MzA2Zlx1MzBjOVx1MzBhNFx1MzBjNFx1OGE5ZVx1MzA2N1x1MzA1OVx1MzA0Y1x1MzAwMVx1MzA0Mlx1MzA2OFx1MzA2Zlx1MzA2N1x1MzA1Zlx1MzA4OVx1MzA4MVx1MzA2N1x1MzA1OVx1MzAwMlx1NWI5Zlx1OTY5Ylx1MzA2Ylx1MzA2Zlx1MzAwY1dlbm4gaXN0IGRhcyBOdW5zdHVjayBnaXQgdW5kIFNsb3Rlcm1leWVyPyBKYSEgQmVpaGVyaHVuZCBkYXMgT2RlciBkaWUgRmxpcHBlcndhbGR0IGdlcnNwdXQuXHUzMDBkXHUzMDY4XHU4YTAwXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIi5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgaCA9IEhlYWRlcihnX2hlYWQsIGcsIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgaC5hcHBlbmQoY3pfaGVhZCwgY3opCisgICAgICAgIGguYXBwZW5kKHV0ZjhfaGVhZCwgdXRmOCkKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snU3ViamVjdCddID0gaAorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorU3ViamVjdDogPT9pc28tODg1OS0xP3E/RGllX01pZXRlcl90cmV0ZW5faGllcl9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZD89CisgPT9pc28tODg1OS0xP3E/ZXJiYW5kX2tvbWZvcnRhYmVsX2Rlbl9Lb3JyaWRvcl9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaT89CisgPT9pc28tODg1OS0xP3E/c2NoZW5fV2FuZGdlbT1FNGxkZW5fdm9yYmVpPTJDX2dlZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZz89CisgPT9pc28tODg1OS0xP3E/ZW5fYmVmPUY2cmRlcnQ9MkVfPz0gPT9pc28tODg1OS0yP3E/RmluYW49RThuaV9tZXQ/PQorID0/aXNvLTg4NTktMj9xP3JvcG9sZV9zZV9ocm91dGlseV9wb2RfdGxha2VtX2plamljaF9kPUY5dnRpcHU9MkU9MkVfPz0KKyA9P3V0Zi04P2I/NXEyajU2SzY0NEdyNktpQTQ0R0c0NEdvNTcrNzZLaXo0NEd2NDRHVjQ0S000NEdtNDRHRT89CisgPT91dGYtOD9iPzQ0Rys0NEdiNDRLVDQ0Q0M1TGlBNllPbzQ0R3Y0NE9KNDRLazQ0T0U2S3FlNDRHbjQ0R1o0NEdNNDRDQj89CisgPT91dGYtOD9iPzQ0R0M0NEdvNDRHdjQ0R240NEdmNDRLSjQ0S0I0NEduNDRHWjQ0Q0M1YTZmNlpxYjQ0R3I0NEd2NDRDTT89CisgPT91dGYtOD9xP1dlbm5faXN0X2Rhc19OdW5zdHVja19naXRfdW5kX1Nsb3Rlcm1leWVyPTNGX0phIV9CZWloZXJodW5kX2Rhcz89CisgPT91dGYtOD9iP0lFOWtaWElnWkdsbElFWnNhWEJ3WlhKM1lXeGtkQ0JuWlhKemNIVjBMdU9BamVPQnFPaW9nT09Cb3c9PT89CisgPT91dGYtOD9iPzQ0R200NEdFNDRHKzQ0R1o0NENDPz0KKworIiIiKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCis9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyX2Vpbl93ZXJkZW5fbWl0X2VpbmVtX0ZvZXJkPz0KKyA9P2lzby04ODU5LTE/cT9lcmJhbmRfa29tZm9ydGFiZWxfZGVuX0tvcnJpZG9yX2VudGxhbmc9MkNfYW5fcz1GQ2RsPUZDbmRpPz0KKyA9P2lzby04ODU5LTE/cT9zY2hlbl9XYW5kZ2VtPUU0bGRlbl92b3JiZWk9MkNfZ2VnZW5fZGllX3JvdGllcmVuZGVuX0tsaW5nPz0KKyA9P2lzby04ODU5LTE/cT9lbl9iZWY9RjZyZGVydD0yRV8/PSA9P2lzby04ODU5LTI/cT9GaW5hbj1FOG5pX21ldD89CisgPT9pc28tODg1OS0yP3E/cm9wb2xlX3NlX2hyb3V0aWx5X3BvZF90bGFrZW1famVqaWNoX2Q9Rjl2dGlwdT0yRT0yRV8/PQorID0/dXRmLTg/Yj81cTJqNTZLNjQ0R3I2S2lBNDRHRzQ0R281Nys3NktpejQ0R3Y0NEdWNDRLTTQ0R200NEdFPz0KKyA9P3V0Zi04P2I/NDRHKzQ0R2I0NEtUNDRDQzVMaUE2WU9vNDRHdjQ0T0o0NEtrNDRPRTZLcWU0NEduNDRHWjQ0R000NENCPz0KKyA9P3V0Zi04P2I/NDRHQzQ0R280NEd2NDRHbjQ0R2Y0NEtKNDRLQjQ0R240NEdaNDRDQzVhNmY2WnFiNDRHcjQ0R3Y0NENNPz0KKyA9P3V0Zi04P3E/V2Vubl9pc3RfZGFzX051bnN0dWNrX2dpdF91bmRfU2xvdGVybWV5ZXI9M0ZfSmEhX0JlaWhlcmh1bmRfZGFzPz0KKyA9P3V0Zi04P2I/SUU5a1pYSWdaR2xsSUVac2FYQndaWEozWVd4a2RDQm5aWEp6Y0hWMEx1T0FqZU9CcU9pb2dPT0Jvdz09Pz0KKyA9P3V0Zi04P2I/NDRHbTQ0R0U0NEcrNDRHWjQ0Q0M/PSIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfaGVhZGVyX2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcignd2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsgJworICAgICAgICAgICAgICAgICAgICdzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInLAorICAgICAgICAgICAgICAgICAgIGhlYWRlcl9uYW1lPSdYLUZvb2Jhci1TcG9pbmstRGVmcm9ibml0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJycnXAord2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsKKyBzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInJycpCisKKyAgICBkZWYgdGVzdF9sb25nX2hlYWRlcl9lbmNvZGVfd2l0aF90YWJfY29udGludWF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCd3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOyAnCisgICAgICAgICAgICAgICAgICAgJ3Nwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicsCisgICAgICAgICAgICAgICAgICAgaGVhZGVyX25hbWU9J1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQnLAorICAgICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnJydcCit3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOworXHRzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInJycpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfc3BsaXR0ZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCcnKQorICAgICAgICAjIEl0J2QgYmUgZ3JlYXQgaWYgd2UgY291bGQgdXNlIGFkZF9oZWFkZXIoKSBoZXJlLCBidXQgdGhhdCBkb2Vzbid0CisgICAgICAgICMgZ3VhcmFudGVlIGFuIG9yZGVyIG9mIHRoZSBwYXJhbWV0ZXJzLgorICAgICAgICBtc2dbJ1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQnXSA9ICgKKyAgICAgICAgICAgICd3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOyAnCisgICAgICAgICAgICAnc3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiJykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdDogd2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsKKyBzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSIKKworJycnKQorCisgICAgZGVmIHRlc3Rfbm9fc2VtaXNfaGVhZGVyX3NwbGl0dGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAndGVzdEBkb20uYWluJworICAgICAgICBtc2dbJ1JlZmVyZW5jZXMnXSA9IFNQQUNFLmpvaW4oWyc8JWRAZG9tLmFpbj4nICUgaSBmb3IgaSBpbiByYW5nZSgxMCldKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ1Rlc3QnKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorRnJvbTogdGVzdEBkb20uYWluCitSZWZlcmVuY2VzOiA8MEBkb20uYWluPiA8MUBkb20uYWluPiA8MkBkb20uYWluPiA8M0Bkb20uYWluPiA8NEBkb20uYWluPgorIDw1QGRvbS5haW4+IDw2QGRvbS5haW4+IDw3QGRvbS5haW4+IDw4QGRvbS5haW4+IDw5QGRvbS5haW4+CisKK1Rlc3QiIiIpCisKKyAgICBkZWYgdGVzdF9ub19zcGxpdF9sb25nX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaHN0ciA9ICdSZWZlcmVuY2VzOiAnICsgJ3gnICogODAKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorUmVmZXJlbmNlczogeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgiIiIpCisKKyAgICBkZWYgdGVzdF9zcGxpdHRpbmdfbXVsdGlwbGVfbG9uZ19saW5lcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaHN0ciA9ICIiIlwKK2Zyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7IGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47IFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorXHRmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOyBieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOyBmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OyBTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKK1x0ZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsgYnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsgZm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsgU2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCisiIiIKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsKK1x0YnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsKK1x0Zm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsKK1x0U2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCitcdGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7CitcdGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7CitcdGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47CitcdFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorXHRmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOworXHRieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOworXHRmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OworXHRTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkiIiIpCisKKyAgICBkZWYgdGVzdF9zcGxpdHRpbmdfZmlyc3RfbGluZV9vbmx5X2lzX2xvbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGhzdHIgPSAiIiJcCitmcm9tIG1vZGVtY2FibGUwOTMuMTM5LTIwMS0yNC5xdWUubWMudmlkZW90cm9uLmNhIChbMjQuMjAxLjEzOS45M10gaGVsbz1jdGh1bGh1LmdlcmcuY2EpCitcdGJ5IGtyb25vcy5tZW1zLWV4Y2hhbmdlLm9yZyB3aXRoIGVzbXRwIChFeGltIDQuMDUpCitcdGlkIDE3azRoNS0wMDAzNGktMDAKK1x0Zm9yIHRlc3RAbWVtcy1leGNoYW5nZS5vcmc7IFdlZCwgMjggQXVnIDIwMDIgMTE6MjU6MjAgLTA0MDAiIiIKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBtYXhsaW5lbGVuPTc4LCBoZWFkZXJfbmFtZT0nUmVjZWl2ZWQnLAorICAgICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitmcm9tIG1vZGVtY2FibGUwOTMuMTM5LTIwMS0yNC5xdWUubWMudmlkZW90cm9uLmNhIChbMjQuMjAxLjEzOS45M10KK1x0aGVsbz1jdGh1bGh1LmdlcmcuY2EpCitcdGJ5IGtyb25vcy5tZW1zLWV4Y2hhbmdlLm9yZyB3aXRoIGVzbXRwIChFeGltIDQuMDUpCitcdGlkIDE3azRoNS0wMDAzNGktMDAKK1x0Zm9yIHRlc3RAbWVtcy1leGNoYW5nZS5vcmc7IFdlZCwgMjggQXVnIDIwMDIgMTE6MjU6MjAgLTA0MDAiIiIpCisKKyAgICBkZWYgdGVzdF9sb25nXzhiaXRfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgaCA9IEhlYWRlcignQnJpdGlzY2hlIFJlZ2llcnVuZyBnaWJ0JywgJ2lzby04ODU5LTEnLAorICAgICAgICAgICAgICAgICAgICBoZWFkZXJfbmFtZT0nU3ViamVjdCcpCisgICAgICAgIGguYXBwZW5kKCdnclx4ZmNuZXMgTGljaHQgZlx4ZmNyIE9mZnNob3JlLVdpbmRrcmFmdHByb2pla3RlJykKKyAgICAgICAgbXNnWydTdWJqZWN0J10gPSBoCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorU3ViamVjdDogPT9pc28tODg1OS0xP3E/QnJpdGlzY2hlX1JlZ2llcnVuZ19naWJ0Pz0gPT9pc28tODg1OS0xP3E/Z3I9RkNuZXM/PQorID0/aXNvLTg4NTktMT9xP19MaWNodF9mPUZDcl9PZmZzaG9yZS1XaW5ka3JhZnRwcm9qZWt0ZT89CisKKyIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfOGJpdF9oZWFkZXJfbm9fY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snUmVwbHktVG8nXSA9ICdCcml0aXNjaGUgUmVnaWVydW5nIGdpYnQgZ3JceGZjbmVzIExpY2h0IGZceGZjciBPZmZzaG9yZS1XaW5ka3JhZnRwcm9qZWt0ZSA8YS12ZXJ5LWxvbmctYWRkcmVzc0BleGFtcGxlLmNvbT4nCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmVwbHktVG86IEJyaXRpc2NoZSBSZWdpZXJ1bmcgZ2lidCBnclx4ZmNuZXMgTGljaHQgZlx4ZmNyIE9mZnNob3JlLVdpbmRrcmFmdHByb2pla3RlIDxhLXZlcnktbG9uZy1hZGRyZXNzQGV4YW1wbGUuY29tPgorCisiIiIpCisKKyAgICBkZWYgdGVzdF9sb25nX3RvX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgdG8gPSAnIlNvbWVvbmUgVGVzdCAjQSIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwiU29tZW9uZSBUZXN0ICNCIiA8c29tZW9uZUB1bWljaC5lZHU+LCAiU29tZW9uZSBUZXN0ICNDIiA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sICJTb21lb25lIFRlc3QgI0QiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PicKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snVG8nXSA9IHRvCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoMCksICcnJ1wKK1RvOiAiU29tZW9uZSBUZXN0ICNBIiA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sIDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwKKyAiU29tZW9uZSBUZXN0ICNCIiA8c29tZW9uZUB1bWljaC5lZHU+LAorICJTb21lb25lIFRlc3QgI0MiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwKKyAiU29tZW9uZSBUZXN0ICNEIiA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4KKworJycnKQorCisgICAgZGVmIHRlc3RfbG9uZ19saW5lX2FmdGVyX2FwcGVuZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICdUaGlzIGlzIGFuIGV4YW1wbGUgb2Ygc3RyaW5nIHdoaWNoIGhhcyBhbG1vc3QgdGhlIGxpbWl0IG9mIGhlYWRlciBsZW5ndGguJworICAgICAgICBoID0gSGVhZGVyKHMpCisgICAgICAgIGguYXBwZW5kKCdBZGQgYW5vdGhlciBsaW5lLicpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK1RoaXMgaXMgYW4gZXhhbXBsZSBvZiBzdHJpbmcgd2hpY2ggaGFzIGFsbW9zdCB0aGUgbGltaXQgb2YgaGVhZGVyIGxlbmd0aC4KKyBBZGQgYW5vdGhlciBsaW5lLiIiIikKKworICAgIGRlZiB0ZXN0X3Nob3J0ZXJfbGluZV93aXRoX2FwcGVuZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICdUaGlzIGlzIGEgc2hvcnRlciBsaW5lLicKKyAgICAgICAgaCA9IEhlYWRlcihzKQorICAgICAgICBoLmFwcGVuZCgnQWRkIGFub3RoZXIgc2VudGVuY2UuIChTdXJwcmlzZT8pJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwKKyAgICAgICAgICAgJ1RoaXMgaXMgYSBzaG9ydGVyIGxpbmUuIEFkZCBhbm90aGVyIHNlbnRlbmNlLiAoU3VycHJpc2U/KScpCisKKyAgICBkZWYgdGVzdF9sb25nX2ZpZWxkX25hbWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGZuID0gJ1gtVmVyeS1WZXJ5LVZlcnktTG9uZy1IZWFkZXItTmFtZScKKyAgICAgICAgZ3MgPSAiRGllIE1pZXRlciB0cmV0ZW4gaGllciBlaW4gd2VyZGVuIG1pdCBlaW5lbSBGb2VyZGVyYmFuZCBrb21mb3J0YWJlbCBkZW4gS29ycmlkb3IgZW50bGFuZywgYW4gc1x4ZmNkbFx4ZmNuZGlzY2hlbiBXYW5kZ2VtXHhlNGxkZW4gdm9yYmVpLCBnZWdlbiBkaWUgcm90aWVyZW5kZW4gS2xpbmdlbiBiZWZceGY2cmRlcnQuICIKKyAgICAgICAgaCA9IEhlYWRlcihncywgJ2lzby04ODU5LTEnLCBoZWFkZXJfbmFtZT1mbikKKyAgICAgICAgIyBCQVc6IHRoaXMgc2VlbXMgYnJva2VuIGJlY2F1c2UgdGhlIGZpcnN0IGxpbmUgaXMgdG9vIGxvbmcKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorPT9pc28tODg1OS0xP3E/RGllX01pZXRlcl90cmV0ZW5faGllcl8/PQorID0/aXNvLTg4NTktMT9xP2Vpbl93ZXJkZW5fbWl0X2VpbmVtX0ZvZXJkZXJiYW5kX2tvbWZvcnRhYmVsX2Rlbl9Lb3JyaWRvcl8/PQorID0/aXNvLTg4NTktMT9xP2VudGxhbmc9MkNfYW5fcz1GQ2RsPUZDbmRpc2NoZW5fV2FuZGdlbT1FNGxkZW5fdm9yYmVpPTJDX2c/PQorID0/aXNvLTg4NTktMT9xP2VnZW5fZGllX3JvdGllcmVuZGVuX0tsaW5nZW5fYmVmPUY2cmRlcnQ9MkVfPz0iIiIpCisKKyAgICBkZWYgdGVzdF9sb25nX3JlY2VpdmVkX2hlYWRlcihzZWxmKToKKyAgICAgICAgaCA9ICdmcm9tIEZPTy5UTEQgKHZpendvcmxkLmFjbC5mb28udGxkIFsxMjMuNDUyLjY3OC45XSkgYnkgaHJvdGhnYXIubGEubWFzdGFsZXIuY29tICh0bWRhLW9mbWlwZCkgd2l0aCBFU01UUDsgV2VkLCAwNSBNYXIgMjAwMyAxODoxMDoxOCAtMDcwMCcKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snUmVjZWl2ZWQtMSddID0gSGVhZGVyKGgsIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBtc2dbJ1JlY2VpdmVkLTInXSA9IGgKKyAgICAgICAgc2VsZi5uZGlmZkFzc2VydEVxdWFsKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmVjZWl2ZWQtMTogZnJvbSBGT08uVExEICh2aXp3b3JsZC5hY2wuZm9vLnRsZCBbMTIzLjQ1Mi42NzguOV0pIGJ5CitcdGhyb3RoZ2FyLmxhLm1hc3RhbGVyLmNvbSAodG1kYS1vZm1pcGQpIHdpdGggRVNNVFA7CitcdFdlZCwgMDUgTWFyIDIwMDMgMTg6MTA6MTggLTA3MDAKK1JlY2VpdmVkLTI6IGZyb20gRk9PLlRMRCAodml6d29ybGQuYWNsLmZvby50bGQgWzEyMy40NTIuNjc4LjldKSBieQorIGhyb3RoZ2FyLmxhLm1hc3RhbGVyLmNvbSAodG1kYS1vZm1pcGQpIHdpdGggRVNNVFA7CisgV2VkLCAwNSBNYXIgMjAwMyAxODoxMDoxOCAtMDcwMAorCisiIiIpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfaGVhZGVyaW5zdF9lcShzZWxmKToKKyAgICAgICAgaCA9ICc8MTU5NzUuMTc5MDEuMjA3MjQwLjQxNDYwNEBzZ2lncml0em1hbm4xLm1hdGhlbWF0aWsudHUtbXVlbmNoZW4uZGU+IChEYXZpZCBCcmVtbmVyXCdzIG1lc3NhZ2Ugb2YgIlRodSwgNiBNYXIgMjAwMyAxMzo1ODoyMSArMDEwMCIpJworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydSZWNlaXZlZCddID0gSGVhZGVyKGgsIGhlYWRlcl9uYW1lPSdSZWNlaXZlZC0xJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBtc2dbJ1JlY2VpdmVkJ10gPSBoCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbChtc2cuYXNfc3RyaW5nKCksICIiIlwKK1JlY2VpdmVkOiA8MTU5NzUuMTc5MDEuMjA3MjQwLjQxNDYwNEBzZ2lncml0em1hbm4xLm1hdGhlbWF0aWsudHUtbXVlbmNoZW4uZGU+CitcdChEYXZpZCBCcmVtbmVyJ3MgbWVzc2FnZSBvZiAiVGh1LCA2IE1hciAyMDAzIDEzOjU4OjIxICswMTAwIikKK1JlY2VpdmVkOiA8MTU5NzUuMTc5MDEuMjA3MjQwLjQxNDYwNEBzZ2lncml0em1hbm4xLm1hdGhlbWF0aWsudHUtbXVlbmNoZW4uZGU+CisgKERhdmlkIEJyZW1uZXIncyBtZXNzYWdlIG9mICJUaHUsIDYgTWFyIDIwMDMgMTM6NTg6MjEgKzAxMDAiKQorCisiIiIpCisKKyAgICBkZWYgdGVzdF9sb25nX3VuYnJlYWthYmxlX2xpbmVzX3dpdGhfY29udGludWF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgdCA9ICIiIlwKKyBpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0JBTUFBQUNsTE9TMEFBQUFHRkJNVkVVQUFBQWtIaUplUlVJY0dCaTkKKyBsb2NRRFE0ekp5a0ZCQVhKZldEakFBQUNZVWxFUVZSNG5GMlRRWS9qSUF5RmM2bHlkbEc1eDhOeXAxWTY5d2oxUE4ySTVnenAiIiIKKyAgICAgICAgbXNnWydGYWNlLTEnXSA9IHQKKyAgICAgICAgbXNnWydGYWNlLTInXSA9IEhlYWRlcih0LCBoZWFkZXJfbmFtZT0nRmFjZS0yJykKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitGYWNlLTE6IGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3QkFNQUFBQ2xMT1MwQUFBQUdGQk1WRVVBQUFBa0hpSmVSVUljR0JpOQorIGxvY1FEUTR6SnlrRkJBWEpmV0RqQUFBQ1lVbEVRVlI0bkYyVFFZL2pJQXlGYzZseWRsRzV4OE55cDFZNjl3ajFQTjJJNWd6cAorRmFjZS0yOiBpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0JBTUFBQUNsTE9TMEFBQUFHRkJNVkVVQUFBQWtIaUplUlVJY0dCaTkKKyBsb2NRRFE0ekp5a0ZCQVhKZldEakFBQUNZVWxFUVZSNG5GMlRRWS9qSUF5RmM2bHlkbEc1eDhOeXAxWTY5d2oxUE4ySTVnenAKKworIiIiKQorCisgICAgZGVmIHRlc3RfYW5vdGhlcl9sb25nX211bHRpbGluZV9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG0gPSAnJydcCitSZWNlaXZlZDogZnJvbSBzaWltYWdlLmNvbSAoWzE3Mi4yNS4xLjNdKSBieSB6aW1hLnNpbGljb25pbWFnZS5jb20gd2l0aCBNaWNyb3NvZnQgU01UUFNWQyg1LjAuMjE5NS40OTA1KTsKKyBXZWQsIDE2IE9jdCAyMDAyIDA3OjQxOjExIC0wNzAwJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAnJydcCitSZWNlaXZlZDogZnJvbSBzaWltYWdlLmNvbSAoWzE3Mi4yNS4xLjNdKSBieSB6aW1hLnNpbGljb25pbWFnZS5jb20gd2l0aAorIE1pY3Jvc29mdCBTTVRQU1ZDKDUuMC4yMTk1LjQ5MDUpOyBXZWQsIDE2IE9jdCAyMDAyIDA3OjQxOjExIC0wNzAwCisKKycnJykKKworICAgIGRlZiB0ZXN0X2xvbmdfbGluZXNfd2l0aF9kaWZmZXJlbnRfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gIiIiXAorTGlzdC1VbnN1YnNjcmliZTogPGh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3NwYW1hc3Nhc3Npbi10YWxrPiwKKyAgICAgICAgPG1haWx0bzpzcGFtYXNzYXNzaW4tdGFsay1yZXF1ZXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD9zdWJqZWN0PXVuc3Vic2NyaWJlPiIiIgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydMaXN0J10gPSBoCisgICAgICAgIG1zZ1snTGlzdCddID0gSGVhZGVyKGgsIGhlYWRlcl9uYW1lPSdMaXN0JykKKyAgICAgICAgc2VsZi5uZGlmZkFzc2VydEVxdWFsKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorTGlzdDogTGlzdC1VbnN1YnNjcmliZTogPGh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3NwYW1hc3Nhc3Npbi10YWxrPiwKKyA8bWFpbHRvOnNwYW1hc3Nhc3Npbi10YWxrLXJlcXVlc3RAbGlzdHMuc291cmNlZm9yZ2UubmV0P3N1YmplY3Q9dW5zdWJzY3JpYmU+CitMaXN0OiBMaXN0LVVuc3Vic2NyaWJlOiA8aHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vc3BhbWFzc2Fzc2luLXRhbGs+LAorIDxtYWlsdG86c3BhbWFzc2Fzc2luLXRhbGstcmVxdWVzdEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ/c3ViamVjdD11bnN1YnNjcmliZT4KKworIiIiKQorCisKKworIyBUZXN0IG1hbmdsaW5nIG9mICJGcm9tICIgbGluZXMgaW4gdGhlIGJvZHkgb2YgYSBtZXNzYWdlCitjbGFzcyBUZXN0RnJvbU1hbmdsaW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYubXNnWydGcm9tJ10gPSAnYWFhQGJiYi5vcmcnCisgICAgICAgIHNlbGYubXNnLnNldF9wYXlsb2FkKCIiIlwKK0Zyb20gdGhlIGRlc2sgb2YgQS5BLkEuOgorQmxhaCBibGFoIGJsYWgKKyIiIikKKworICAgIGRlZiB0ZXN0X21hbmdsZWRfZnJvbShzZWxmKToKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYW5nbGVfZnJvbV89VHJ1ZSkKKyAgICAgICAgZy5mbGF0dGVuKHNlbGYubXNnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgIiIiXAorRnJvbTogYWFhQGJiYi5vcmcKKworPkZyb20gdGhlIGRlc2sgb2YgQS5BLkEuOgorQmxhaCBibGFoIGJsYWgKKyIiIikKKworICAgIGRlZiB0ZXN0X2RvbnRfbWFuZ2xlX2Zyb20oc2VsZik6CisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWFuZ2xlX2Zyb21fPUZhbHNlKQorICAgICAgICBnLmZsYXR0ZW4oc2VsZi5tc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAiIiJcCitGcm9tOiBhYWFAYmJiLm9yZworCitGcm9tIHRoZSBkZXNrIG9mIEEuQS5BLjoKK0JsYWggYmxhaCBibGFoCisiIiIpCisKKworCisjIFRlc3QgdGhlIGJhc2ljIE1JTUVBdWRpbyBjbGFzcworY2xhc3MgVGVzdE1JTUVBdWRpbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBwaWNrIHVwIHRoZSBhdWRpb3Rlc3QuYXUgdGhhdCBsaXZlcyBpbiBlbWFpbC90ZXN0L2RhdGEuCisgICAgICAgICMgSW4gUHl0aG9uLCB0aGVyZSdzIGFuIGF1ZGlvdGVzdC5hdSBsaXZpbmcgaW4gTGliL3Rlc3QgYnV0IHRoYXQgaXNuJ3QKKyAgICAgICAgIyBpbmNsdWRlZCBpbiBzb21lIGJpbmFyeSBkaXN0cm9zIHRoYXQgZG9uJ3QgaW5jbHVkZSB0aGUgdGVzdAorICAgICAgICAjIHBhY2thZ2UuICBUaGUgdHJhaWxpbmcgZW1wdHkgc3RyaW5nIG9uIHRoZSAuam9pbigpIGlzIHNpZ25pZmljYW50CisgICAgICAgICMgc2luY2UgZmluZGZpbGUoKSB3aWxsIGRvIGEgZGlybmFtZSgpLgorICAgICAgICBkYXRhZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShsYW5kbWFyayksICdkYXRhJywgJycpCisgICAgICAgIGZwID0gb3BlbihmaW5kZmlsZSgnYXVkaW90ZXN0LmF1JywgZGF0YWRpciksICdyYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2F1ZGlvZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzZWxmLl9hdSA9IE1JTUVBdWRpbyhzZWxmLl9hdWRpb2RhdGEpCisKKyAgICBkZWYgdGVzdF9ndWVzc19taW5vcl90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2F1LmdldF9jb250ZW50X3R5cGUoKSwgJ2F1ZGlvL2Jhc2ljJykKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICBwYXlsb2FkID0gc2VsZi5fYXUuZ2V0X3BheWxvYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2U2NC5kZWNvZGVzdHJpbmcocGF5bG9hZCksIHNlbGYuX2F1ZGlvZGF0YSkKKworICAgIGRlZiB0ZXN0X2NoZWNrU2V0TWlub3Ioc2VsZik6CisgICAgICAgIGF1ID0gTUlNRUF1ZGlvKHNlbGYuX2F1ZGlvZGF0YSwgJ2Zpc2gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1LmdldF9jb250ZW50X3R5cGUoKSwgJ2F1ZGlvL2Zpc2gnKQorCisgICAgZGVmIHRlc3RfYWRkX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBzZWxmLl9hdS5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdhdWRpb3Rlc3QuYXUnKQorICAgICAgICBlcShzZWxmLl9hdVsnY29udGVudC1kaXNwb3NpdGlvbiddLAorICAgICAgICAgICAnYXR0YWNobWVudDsgZmlsZW5hbWU9ImF1ZGlvdGVzdC5hdSInKQorICAgICAgICBlcShzZWxmLl9hdS5nZXRfcGFyYW1zKGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICBbKCdhdHRhY2htZW50JywgJycpLCAoJ2ZpbGVuYW1lJywgJ2F1ZGlvdGVzdC5hdScpXSkKKyAgICAgICAgZXEoc2VsZi5fYXUuZ2V0X3BhcmFtKCdmaWxlbmFtZScsIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICAnYXVkaW90ZXN0LmF1JykKKyAgICAgICAgbWlzc2luZyA9IFtdCisgICAgICAgIGVxKHNlbGYuX2F1LmdldF9wYXJhbSgnYXR0YWNobWVudCcsIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLCAnJykKKyAgICAgICAgdW5sZXNzKHNlbGYuX2F1LmdldF9wYXJhbSgnZm9vJywgZmFpbG9iaj1taXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpIGlzIG1pc3NpbmcpCisgICAgICAgICMgVHJ5IHNvbWUgbWlzc2luZyBzdHVmZgorICAgICAgICB1bmxlc3Moc2VsZi5fYXUuZ2V0X3BhcmFtKCdmb29iYXInLCBtaXNzaW5nKSBpcyBtaXNzaW5nKQorICAgICAgICB1bmxlc3Moc2VsZi5fYXUuZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgbWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2Zvb2JhcicpIGlzIG1pc3NpbmcpCisKKworCisjIFRlc3QgdGhlIGJhc2ljIE1JTUVJbWFnZSBjbGFzcworY2xhc3MgVGVzdE1JTUVJbWFnZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBmcCA9IG9wZW5maWxlKCdQeUJhbm5lcjA0OC5naWYnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9pbWdkYXRhID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHNlbGYuX2ltID0gTUlNRUltYWdlKHNlbGYuX2ltZ2RhdGEpCisKKyAgICBkZWYgdGVzdF9ndWVzc19taW5vcl90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2ltLmdldF9jb250ZW50X3R5cGUoKSwgJ2ltYWdlL2dpZicpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgcGF5bG9hZCA9IHNlbGYuX2ltLmdldF9wYXlsb2FkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlNjQuZGVjb2Rlc3RyaW5nKHBheWxvYWQpLCBzZWxmLl9pbWdkYXRhKQorCisgICAgZGVmIHRlc3RfY2hlY2tTZXRNaW5vcihzZWxmKToKKyAgICAgICAgaW0gPSBNSU1FSW1hZ2Uoc2VsZi5faW1nZGF0YSwgJ2Zpc2gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGltLmdldF9jb250ZW50X3R5cGUoKSwgJ2ltYWdlL2Zpc2gnKQorCisgICAgZGVmIHRlc3RfYWRkX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBzZWxmLl9pbS5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdkaW5ndXNmaXNoLmdpZicpCisgICAgICAgIGVxKHNlbGYuX2ltWydjb250ZW50LWRpc3Bvc2l0aW9uJ10sCisgICAgICAgICAgICdhdHRhY2htZW50OyBmaWxlbmFtZT0iZGluZ3VzZmlzaC5naWYiJykKKyAgICAgICAgZXEoc2VsZi5faW0uZ2V0X3BhcmFtcyhoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwKKyAgICAgICAgICAgWygnYXR0YWNobWVudCcsICcnKSwgKCdmaWxlbmFtZScsICdkaW5ndXNmaXNoLmdpZicpXSkKKyAgICAgICAgZXEoc2VsZi5faW0uZ2V0X3BhcmFtKCdmaWxlbmFtZScsIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICAnZGluZ3VzZmlzaC5naWYnKQorICAgICAgICBtaXNzaW5nID0gW10KKyAgICAgICAgZXEoc2VsZi5faW0uZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksICcnKQorICAgICAgICB1bmxlc3Moc2VsZi5faW0uZ2V0X3BhcmFtKCdmb28nLCBmYWlsb2JqPW1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJykgaXMgbWlzc2luZykKKyAgICAgICAgIyBUcnkgc29tZSBtaXNzaW5nIHN0dWZmCisgICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpIGlzIG1pc3NpbmcpCisgICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBtaXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nZm9vYmFyJykgaXMgbWlzc2luZykKKworCisKKyMgVGVzdCB0aGUgYmFzaWMgTUlNRUFwcGxpY2F0aW9uIGNsYXNzCitjbGFzcyBUZXN0TUlNRUFwcGxpY2F0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9oZWFkZXJzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRUFwcGxpY2F0aW9uKCdceGZhXHhmYlx4ZmNceGZkXHhmZVx4ZmYnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICdiYXNlNjQnKQorCisgICAgZGVmIHRlc3RfYm9keShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGJ5dGVzID0gJ1x4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZicKKyAgICAgICAgbXNnID0gTUlNRUFwcGxpY2F0aW9uKGJ5dGVzKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJyt2djgvZjcvJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgYnl0ZXMpCisKKyAgICBkZWYgdGVzdF9iaW5hcnlfYm9keV93aXRoX2VuY29kZV83b3I4Yml0KHNlbGYpOgorICAgICAgICAjIElzc3VlIDE3MTcxLgorICAgICAgICBieXRlc2RhdGEgPSBiJ1x4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZicKKyAgICAgICAgbXNnID0gTUlNRUFwcGxpY2F0aW9uKGJ5dGVzZGF0YSwgX2VuY29kZXI9ZW5jb2RlcnMuZW5jb2RlXzdvcjhiaXQpCisgICAgICAgICMgVHJlYXRlZCBhcyBhIHN0cmluZywgdGhpcyB3aWxsIGJlIGludmFsaWQgY29kZSBwb2ludHMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKCksIGJ5dGVzZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBieXRlc2RhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10sICc4Yml0JykKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICB3aXJlZm9ybSA9IHMuZ2V0dmFsdWUoKQorICAgICAgICBtc2cyID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyh3aXJlZm9ybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoKSwgYnl0ZXNkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzIuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBieXRlc2RhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMlsnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddLCAnOGJpdCcpCisKKyAgICBkZWYgdGVzdF9iaW5hcnlfYm9keV93aXRoX2VuY29kZV9ub29wKHNlbGYpOgorICAgICAgICAjIElzc3VlIDE2NTY0OiBUaGlzIGRvZXMgbm90IHByb2R1Y2UgYW4gUkZDIHZhbGlkIG1lc3NhZ2UsIHNpbmNlIHRvIGJlCisgICAgICAgICMgdmFsaWQgaXQgc2hvdWxkIGhhdmUgYSBDVEUgb2YgYmluYXJ5LiAgQnV0IHRoZSBiZWxvdyB3b3JrcywgYW5kIGlzCisgICAgICAgICMgZG9jdW1lbnRlZCBhcyB3b3JraW5nIHRoaXMgd2F5LgorICAgICAgICBieXRlc2RhdGEgPSBiJ1x4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZicKKyAgICAgICAgbXNnID0gTUlNRUFwcGxpY2F0aW9uKGJ5dGVzZGF0YSwgX2VuY29kZXI9ZW5jb2RlcnMuZW5jb2RlX25vb3ApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKCksIGJ5dGVzZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBieXRlc2RhdGEpCisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3IocykKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgd2lyZWZvcm0gPSBzLmdldHZhbHVlKCkKKyAgICAgICAgbXNnMiA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcod2lyZWZvcm0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKCksIGJ5dGVzZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cyLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgYnl0ZXNkYXRhKQorCisKKyMgVGVzdCB0aGUgYmFzaWMgTUlNRVRleHQgY2xhc3MKK2NsYXNzIFRlc3RNSU1FVGV4dCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9tc2cgPSBNSU1FVGV4dCgnaGVsbG8gdGhlcmUnKQorCisgICAgZGVmIHRlc3RfdHlwZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgZXEoc2VsZi5fbXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShzZWxmLl9tc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICd1cy1hc2NpaScpCisgICAgICAgIG1pc3NpbmcgPSBbXQorICAgICAgICB1bmxlc3Moc2VsZi5fbXNnLmdldF9wYXJhbSgnZm9vYmFyJywgbWlzc2luZykgaXMgbWlzc2luZykKKyAgICAgICAgdW5sZXNzKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnLCBtaXNzaW5nLCBoZWFkZXI9J2Zvb2JhcicpCisgICAgICAgICAgICAgICBpcyBtaXNzaW5nKQorCisgICAgZGVmIHRlc3RfcGF5bG9hZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9tc2cuZ2V0X3BheWxvYWQoKSwgJ2hlbGxvIHRoZXJlJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLl9tc2cuaXNfbXVsdGlwYXJ0KCkpCisKKyAgICBkZWYgdGVzdF9jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHRoZXJlJywgX2NoYXJzZXQ9J3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLmdldF9jaGFyc2V0KCkuaW5wdXRfY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisKKworCisjIFRlc3QgY29tcGxpY2F0ZWQgbXVsdGlwYXJ0LyogbWVzc2FnZXMKK2NsYXNzIFRlc3RNdWx0aXBhcnQoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBmcCA9IG9wZW5maWxlKCdQeUJhbm5lcjA0OC5naWYnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgY29udGFpbmVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcsIGJvdW5kYXJ5PSdCT1VOREFSWScpCisgICAgICAgIGltYWdlID0gTUlNRUltYWdlKGRhdGEsIG5hbWU9J2Rpbmd1c2Zpc2guZ2lmJykKKyAgICAgICAgaW1hZ2UuYWRkX2hlYWRlcignY29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT0nZGluZ3VzZmlzaC5naWYnKQorICAgICAgICBpbnRybyA9IE1JTUVUZXh0KCcnJ1wKK0hpIHRoZXJlLAorCitUaGlzIGlzIHRoZSBkaW5ndXMgZmlzaC4KKycnJykKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChpbnRybykKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChpbWFnZSkKKyAgICAgICAgY29udGFpbmVyWydGcm9tJ10gPSAnQmFycnkgPGJhcnJ5QGRpZ2ljb29sLmNvbT4nCisgICAgICAgIGNvbnRhaW5lclsnVG8nXSA9ICdEaW5ndXMgTG92ZXJzIDxjcmF2aW5kb2dzQGNyYXZpbmRvZ3MuY29tPicKKyAgICAgICAgY29udGFpbmVyWydTdWJqZWN0J10gPSAnSGVyZSBpcyB5b3VyIGRpbmd1cyBmaXNoJworCisgICAgICAgIG5vdyA9IDk4NzgwOTcwMi41NDg0ODU5OQorICAgICAgICB0aW1ldHVwbGUgPSB0aW1lLmxvY2FsdGltZShub3cpCisgICAgICAgIGlmIHRpbWV0dXBsZVstMV0gPT0gMDoKKyAgICAgICAgICAgIHR6c2VjcyA9IHRpbWUudGltZXpvbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR6c2VjcyA9IHRpbWUuYWx0em9uZQorICAgICAgICBpZiB0enNlY3MgPiAwOgorICAgICAgICAgICAgc2lnbiA9ICctJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2lnbiA9ICcrJworICAgICAgICB0em9mZnNldCA9ICcgJXMlMDRkJyAlIChzaWduLCB0enNlY3MgLy8gMzYpCisgICAgICAgIGNvbnRhaW5lclsnRGF0ZSddID0gdGltZS5zdHJmdGltZSgKKyAgICAgICAgICAgICclYSwgJWQgJWIgJVkgJUg6JU06JVMnLAorICAgICAgICAgICAgdGltZS5sb2NhbHRpbWUobm93KSkgKyB0em9mZnNldAorICAgICAgICBzZWxmLl9tc2cgPSBjb250YWluZXIKKyAgICAgICAgc2VsZi5faW0gPSBpbWFnZQorICAgICAgICBzZWxmLl90eHQgPSBpbnRybworCisgICAgZGVmIHRlc3RfaGllcmFyY2h5KHNlbGYpOgorICAgICAgICAjIGNvbnZlbmllbmNlCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyAgICAgICAgIyB0ZXN0cworICAgICAgICBtID0gc2VsZi5fbXNnCisgICAgICAgIHVubGVzcyhtLmlzX211bHRpcGFydCgpKQorICAgICAgICBlcShtLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCisgICAgICAgIGVxKGxlbihtLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICByYWlzZXMoSW5kZXhFcnJvciwgbS5nZXRfcGF5bG9hZCwgMikKKyAgICAgICAgbTAgPSBtLmdldF9wYXlsb2FkKDApCisgICAgICAgIG0xID0gbS5nZXRfcGF5bG9hZCgxKQorICAgICAgICB1bmxlc3MobTAgaXMgc2VsZi5fdHh0KQorICAgICAgICB1bmxlc3MobTEgaXMgc2VsZi5faW0pCisgICAgICAgIGVxKG0uZ2V0X3BheWxvYWQoKSwgW20wLCBtMV0pCisgICAgICAgIHVubGVzcyhub3QgbTAuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHVubGVzcyhub3QgbTEuaXNfbXVsdGlwYXJ0KCkpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9tdWx0aXBhcnRfaWRlbXBvdGVudChzZWxmKToKKyAgICAgICAgdGV4dCA9ICIiIlwKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworCistLUJPVU5EQVJZCisKKworLS1CT1VOREFSWS0tCisiIiIKKyAgICAgICAgbXNnID0gUGFyc2VyKCkucGFyc2VzdHIodGV4dCkKKyAgICAgICAgc2VsZi5uZGlmZkFzc2VydEVxdWFsKHRleHQsIG1zZy5hc19zdHJpbmcoKSkKKworICAgIGRlZiB0ZXN0X25vX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfbm9uZV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorCistLUJPVU5EQVJZLS0nJycpCisKKyAgICBkZWYgdGVzdF9ub19wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX2VtcHR5X2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIucHJlYW1ibGUgPSAnJworICAgICAgICBvdXRlci5lcGlsb2d1ZSA9ICcnCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworCistLUJPVU5EQVJZCisKKy0tQk9VTkRBUlktLQorJycnKQorCisgICAgZGVmIHRlc3Rfb25lX3BhcnRfaW5fYV9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0nJycpCisKKyAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9lbXB0eV9wcmVhbWJsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnByZWFtYmxlID0gJycKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0nJycpCisKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25vbmVfcHJlYW1ibGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5wcmVhbWJsZSA9IE5vbmUKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tJycnKQorCisKKyAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9ub25lX2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuZXBpbG9ndWUgPSBOb25lCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLScnJykKKworCisgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfZW1wdHlfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5lcGlsb2d1ZSA9ICcnCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLQorJycnKQorCisKKyAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9ubF9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gJ1xuJworICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0KKworJycnKQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9leHRlcm5hbF9ib2R5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzYudHh0JykKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgbXNnMSA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9hbHRlcm5hdGl2ZScpCisgICAgICAgIGVxKGxlbihtc2cxLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBmb3Igc3VicGFydCBpbiBtc2cxLmdldF9wYXlsb2FkKCk6CisgICAgICAgICAgICBlcShzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvZXh0ZXJuYWwtYm9keScpCisgICAgICAgICAgICBlcShsZW4oc3VicGFydC5nZXRfcGF5bG9hZCgpKSwgMSkKKyAgICAgICAgICAgIHN1YnN1YnBhcnQgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKDApCisgICAgICAgICAgICBlcShzdWJzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZG91YmxlX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICAjIG1zZ18zNy50eHQgaXMgYSBtdWx0aXBhcnQgdGhhdCBjb250YWlucyB0d28gZGFzaC1ib3VuZGFyeSdzIGluIGEKKyAgICAgICAgIyByb3cuICBPdXIgaW50ZXJwcmV0YXRpb24gb2YgUkZDIDIwNDYgY2FsbHMgZm9yIGlnbm9yaW5nIHRoZSBzZWNvbmQKKyAgICAgICAgIyBhbmQgc3Vic2VxdWVudCBib3VuZGFyaWVzLgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zNy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDMpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfaW5uZXJfY29udGFpbnNfb3V0ZXJfYm91bmRhcnkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgICMgbXNnXzM4LnR4dCBoYXMgYW4gaW5uZXIgcGFydCB0aGF0IGNvbnRhaW5zIG91dGVyIGJvdW5kYXJpZXMuICBNeQorICAgICAgICAjIGludGVycHJldGF0aW9uIG9mIFJGQyAyMDQ2IChiYXNlZCBvbiBzZWN0aW9ucyA1LjEgYW5kIDUuMS4yKSBzYXkKKyAgICAgICAgIyB0aGVzZSBhcmUgaWxsZWdhbCBhbmQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIHVudGVybWluYXRlZCBpbm5lcgorICAgICAgICAjIHBhcnRzLgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zOC50eHQnKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGl0ZXJhdG9ycy5fc3RydWN0dXJlKG1zZywgc2ZwKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorbXVsdGlwYXJ0L21peGVkCisgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgIG11bHRpcGFydC9hbHRlcm5hdGl2ZQorICAgICAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgdGV4dC9wbGFpbgorICAgIHRleHQvcGxhaW4KKyIiIikKKworICAgIGRlZiB0ZXN0X25lc3RlZF93aXRoX3NhbWVfYm91bmRhcnkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgICMgbXNnIDM5LnR4dCBpcyBzaW1pbGFybHkgZXZpbCBpbiB0aGF0IGl0J3MgZ290IGlubmVyIHBhcnRzIHRoYXQgdXNlCisgICAgICAgICMgdGhlIHNhbWUgYm91bmRhcnkgYXMgb3V0ZXIgcGFydHMuICBBZ2FpbiwgSSBiZWxpZXZlIHRoZSB3YXkgdGhpcyBpcworICAgICAgICAjIHBhcnNlZCBpcyBjbG9zZXN0IHRvIHRoZSBzcGlyaXQgb2YgUkZDIDIwNDYKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzkudHh0JykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBpdGVyYXRvcnMuX3N0cnVjdHVyZShtc2csIHNmcCkKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK211bHRpcGFydC9taXhlZAorICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKKyAgICAgICAgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCisgICAgICAgIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorICAgIHRleHQvcGxhaW4KKyIiIikKKworICAgIGRlZiB0ZXN0X2JvdW5kYXJ5X2luX25vbl9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzQwLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmFzX3N0cmluZygpLCAnJydcCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGJvdW5kYXJ5PSItLTk2MTI4NDIzNjU1MjUyMjI2OSIKKworLS0tLTk2MTI4NDIzNjU1MjUyMjI2OQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Qml0CisKKzxodG1sPjwvaHRtbD4KKworLS0tLTk2MTI4NDIzNjU1MjUyMjI2OS0tCisnJycpCisKKyAgICBkZWYgdGVzdF9ib3VuZGFyeV93aXRoX2xlYWRpbmdfc3BhY2Uoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCcnJ1wKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IiAgICBYWFhYIgorCistLSAgICBYWFhYCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworCistLSAgICBYWFhYCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworLS0gICAgWFhYWC0tCisnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIGVxKG1zZy5nZXRfYm91bmRhcnkoKSwgJyAgICBYWFhYJykKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKworICAgIGRlZiB0ZXN0X2JvdW5kYXJ5X3dpdGhvdXRfdHJhaWxpbmdfbmV3bGluZShzZWxmKToKKyAgICAgICAgbSA9IFBhcnNlcigpLnBhcnNlc3RyKCIiIlwKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iPT09PT09PT09PT09PT09MDAxMjM5NDE2ND09IgorTUlNRS1WZXJzaW9uOiAxLjAKKworLS09PT09PT09PT09PT09PT0wMDEyMzk0MTY0PT0KK0NvbnRlbnQtVHlwZTogaW1hZ2UvZmlsZTEuanBnCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1lYTmtaZz09CistLT09PT09PT09PT09PT09PTAwMTIzOTQxNjQ9PS0tIiIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ2V0X3BheWxvYWQoMCkuZ2V0X3BheWxvYWQoKSwgJ1lYTmtaZz09JykKKworCisKKyMgVGVzdCBzb21lIGJhZGx5IGZvcm1hdHRlZCBtZXNzYWdlcworY2xhc3MgVGVzdE5vbkNvbmZvcm1hbnQoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfcGFyc2VfbWlzc2luZ19taW5vcl90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTQudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3Rfc2FtZV9ib3VuZGFyeV9pbm5lcl9vdXRlcihzZWxmKToKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE1LnR4dCcpCisgICAgICAgICMgWFhYIFdlIGNhbiBwcm9iYWJseSBldmVudHVhbGx5IGRvIGJldHRlcgorICAgICAgICBpbm5lciA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICB1bmxlc3MoaGFzYXR0cihpbm5lciwgJ2RlZmVjdHMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaW5uZXIuZGVmZWN0cyksIDEpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGlubmVyLmRlZmVjdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QpKQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjUudHh0JykKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5kZWZlY3RzKSwgMikKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sIGVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QpKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCkpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2NvbnRlbnRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgIyBSRkMgMjA0NSwgJDUuMiBzYXlzIGludmFsaWQgeWllbGRzIHRleHQvcGxhaW4KKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0JworICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgICMgQ2xlYXIgdGhlIG9sZCB2YWx1ZSBhbmQgdHJ5IHNvbWV0aGluZyAvcmVhbGx5LyBpbnZhbGlkCisgICAgICAgIGRlbCBtc2dbJ2NvbnRlbnQtdHlwZSddCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnZm9vJworICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgICMgU3RpbGwsIG1ha2Ugc3VyZSB0aGF0IHRoZSBtZXNzYWdlIGlzIGlkZW1wb3RlbnRseSBnZW5lcmF0ZWQKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBuZXEocy5nZXR2YWx1ZSgpLCAnQ29udGVudC1UeXBlOiBmb29cblxuJykKKworICAgIGRlZiB0ZXN0X25vX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgIiIiXAorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworbWVzc2FnZSAyCisKKy0tQk9VTkRBUlktLQorIiIiKQorCisgICAgZGVmIHRlc3Rfbm9fc2VwYXJhdGluZ19ibGFua19saW5lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zNS50eHQnKQorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorVG86IGJwZXJzb25AZG9tLmFpbgorU3ViamVjdDogaGVyZSdzIHNvbWV0aGluZyBpbnRlcmVzdGluZworCitjb3VudGVyIHRvIFJGQyAyODIyLCB0aGVyZSdzIG5vIHNlcGFyYXRpbmcgbmV3bGluZSBoZXJlCisiIiIpCisKKyAgICBkZWYgdGVzdF9seWluZ19tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180MS50eHQnKQorICAgICAgICB1bmxlc3MoaGFzYXR0cihtc2csICdkZWZlY3RzJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5kZWZlY3RzKSwgMikKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sIGVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QpKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCkpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBvdXRlciA9IHNlbGYuX21zZ29iaignbXNnXzQyLnR4dCcpCisgICAgICAgICMgVGhlIG1lc3NhZ2Ugc3RydWN0dXJlIGlzOgorICAgICAgICAjCisgICAgICAgICMgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICMgICAgdGV4dC9wbGFpbgorICAgICAgICAjICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgICMgICAgICAgIG11bHRpcGFydC9taXhlZCBbKl0KKyAgICAgICAgIworICAgICAgICAjIFsqXSBUaGlzIG1lc3NhZ2UgaXMgbWlzc2luZyBpdHMgc3RhcnQgYm91bmRhcnkKKyAgICAgICAgYmFkID0gb3V0ZXIuZ2V0X3BheWxvYWQoMSkuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYmFkLmRlZmVjdHMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShiYWQuZGVmZWN0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLlN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdCkpCisKKyAgICBkZWYgdGVzdF9maXJzdF9saW5lX2lzX2NvbnRpbnVhdGlvbl9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gJyBMaW5lIDFcbkxpbmUgMlxuTGluZSAzJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKG1zZy5rZXlzKCksIFtdKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ0xpbmUgMlxuTGluZSAzJykKKyAgICAgICAgZXEobGVuKG1zZy5kZWZlY3RzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5GaXJzdEhlYWRlckxpbmVJc0NvbnRpbnVhdGlvbkRlZmVjdCkpCisgICAgICAgIGVxKG1zZy5kZWZlY3RzWzBdLmxpbmUsICcgTGluZSAxXG4nKQorCisKKworIyBUZXN0IFJGQyAyMDQ3IGhlYWRlciBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK2NsYXNzIFRlc3RSRkMyMDQ3KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9yZmMyMDQ3X211bHRpbGluZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAiIiJSZTogPT9tYWMtaWNlbGFuZD9xP3I9OEFrc209OUFyZz04Q3M/PSBiYXoKKyBmb28gYmFyID0/bWFjLWljZWxhbmQ/cT9yPThBa3NtPTlBcmc9OENzPz0iIiIKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKGRoLCBbCisgICAgICAgICAgICAoJ1JlOicsIE5vbmUpLAorICAgICAgICAgICAgKCdyXHg4YWtzbVx4OWFyZ1x4OGNzJywgJ21hYy1pY2VsYW5kJyksCisgICAgICAgICAgICAoJ2JheiBmb28gYmFyJywgTm9uZSksCisgICAgICAgICAgICAoJ3JceDhha3NtXHg5YXJnXHg4Y3MnLCAnbWFjLWljZWxhbmQnKV0pCisgICAgICAgIGVxKHN0cihtYWtlX2hlYWRlcihkaCkpLAorICAgICAgICAgICAiIiJSZTogPT9tYWMtaWNlbGFuZD9xP3I9OEFrc209OUFyZz04Q3M/PSBiYXogZm9vIGJhcgorID0/bWFjLWljZWxhbmQ/cT9yPThBa3NtPTlBcmc9OENzPz0iIiIpCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2VhdGVyX3VuaWNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gJz0/SVNPLTg4NTktMT9RP0FuZHI9RTk/PSBQaXJhcmQgPHBpcmFyZEBkb20uYWluPicKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKGRoLCBbKCdBbmRyXHhlOScsICdpc28tODg1OS0xJyksICgnUGlyYXJkIDxwaXJhcmRAZG9tLmFpbj4nLCBOb25lKV0pCisgICAgICAgIGh1ID0gdW5pY29kZShtYWtlX2hlYWRlcihkaCkpLmVuY29kZSgnbGF0aW4tMScpCisgICAgICAgIGVxKGh1LCAnQW5kclx4ZTkgUGlyYXJkIDxwaXJhcmRAZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9lYXRlcl91bmljb2RlXzIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gJ1RoZSA9P2lzby04ODU5LTE/Yj9jWFZwWTJzZ1luSnZkMjRnWm05ND89IGp1bXBlZCBvdmVyIHRoZSA9P2lzby04ODU5LTE/Yj9iR0Y2ZVNCa2IyYz0/PScKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKGRoLCBbKCdUaGUnLCBOb25lKSwgKCdxdWljayBicm93biBmb3gnLCAnaXNvLTg4NTktMScpLAorICAgICAgICAgICAgICAgICgnanVtcGVkIG92ZXIgdGhlJywgTm9uZSksICgnbGF6eSBkb2cnLCAnaXNvLTg4NTktMScpXSkKKyAgICAgICAgaHUgPSBtYWtlX2hlYWRlcihkaCkuX191bmljb2RlX18oKQorICAgICAgICBlcShodSwgdSdUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5IGRvZycpCisKKyAgICBkZWYgdGVzdF9yZmMyMDQ3X21pc3Npbmdfd2hpdGVzcGFjZShzZWxmKToKKyAgICAgICAgcyA9ICdTbT0/SVNPLTg4NTktMT9CPzlnPT0/PXJnPT9JU08tODg1OS0xP0I/NVE9PT89c2JvcmQnCisgICAgICAgIGRoID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRoLCBbKHMsIE5vbmUpXSkKKworICAgIGRlZiB0ZXN0X3JmYzIwNDdfd2l0aF93aGl0ZXNwYWNlKHNlbGYpOgorICAgICAgICBzID0gJ1NtID0/SVNPLTg4NTktMT9CPzlnPT0/PSByZyA9P0lTTy04ODU5LTE/Qj81UT09Pz0gc2JvcmQnCisgICAgICAgIGRoID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRoLCBbKCdTbScsIE5vbmUpLCAoJ1x4ZjYnLCAnaXNvLTg4NTktMScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdyZycsIE5vbmUpLCAoJ1x4ZTUnLCAnaXNvLTg4NTktMScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdzYm9yZCcsIE5vbmUpXSkKKworCisKKyMgVGVzdCB0aGUgTUlNRU1lc3NhZ2UgY2xhc3MKK2NsYXNzIFRlc3RNSU1FTWVzc2FnZShUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18xMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl90ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF90eXBlX2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIE1JTUVNZXNzYWdlLCAnYSBwbGFpbiBzdHJpbmcnKQorCisgICAgZGVmIHRlc3RfdmFsaWRfYXJndW1lbnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgc3ViamVjdCA9ICdBIHN1Yi1tZXNzYWdlJworICAgICAgICBtID0gTWVzc2FnZSgpCisgICAgICAgIG1bJ1N1YmplY3QnXSA9IHN1YmplY3QKKyAgICAgICAgciA9IE1JTUVNZXNzYWdlKG0pCisgICAgICAgIGVxKHIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBwYXlsb2FkID0gci5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIHN1YnBhcnQgPSBwYXlsb2FkWzBdCisgICAgICAgIHVubGVzcyhzdWJwYXJ0IGlzIG0pCisgICAgICAgIGVxKHN1YnBhcnRbJ3N1YmplY3QnXSwgc3ViamVjdCkKKworICAgIGRlZiB0ZXN0X2JhZF9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cxID0gTWVzc2FnZSgpCisgICAgICAgIG1zZzFbJ1N1YmplY3QnXSA9ICdzdWJwYXJ0IDEnCisgICAgICAgIG1zZzIgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnMlsnU3ViamVjdCddID0gJ3N1YnBhcnQgMicKKyAgICAgICAgciA9IE1JTUVNZXNzYWdlKG1zZzEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9ycy5NdWx0aXBhcnRDb252ZXJzaW9uRXJyb3IsIHIuYXR0YWNoLCBtc2cyKQorCisgICAgZGVmIHRlc3RfZ2VuZXJhdGUoc2VsZik6CisgICAgICAgICMgRmlyc3QgY3JhZnQgdGhlIG1lc3NhZ2UgdG8gYmUgZW5jYXBzdWxhdGVkCisgICAgICAgIG0gPSBNZXNzYWdlKCkKKyAgICAgICAgbVsnU3ViamVjdCddID0gJ0FuIGVuY2xvc2VkIG1lc3NhZ2UnCisgICAgICAgIG0uc2V0X3BheWxvYWQoJ0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuXG4nKQorICAgICAgICByID0gTUlNRU1lc3NhZ2UobSkKKyAgICAgICAgclsnU3ViamVjdCddID0gJ1RoZSBlbmNsb3NpbmcgbWVzc2FnZScKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4ocikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICIiIlwKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBUaGUgZW5jbG9zaW5nIG1lc3NhZ2UKKworU3ViamVjdDogQW4gZW5jbG9zZWQgbWVzc2FnZQorCitIZXJlIGlzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLgorIiIiKQorCisgICAgZGVmIHRlc3RfcGFyc2VfbWVzc2FnZV9yZmM4MjIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTEudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIHN1Ym1zZyA9IHBheWxvYWRbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3VibXNnLCBNZXNzYWdlKSkKKyAgICAgICAgZXEoc3VibXNnWydzdWJqZWN0J10sICdBbiBlbmNsb3NlZCBtZXNzYWdlJykKKyAgICAgICAgZXEoc3VibXNnLmdldF9wYXlsb2FkKCksICdIZXJlIGlzIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLlxuJykKKworICAgIGRlZiB0ZXN0X2RzbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICAjIG1zZyAxNiBpcyBhIERlbGl2ZXJ5IFN0YXR1cyBOb3RpZmljYXRpb24sIHNlZSBSRkMgMTg5NAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xNi50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCisgICAgICAgIHVubGVzcyhtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDMpCisgICAgICAgICMgU3VicGFydCAxIGlzIGEgdGV4dC9wbGFpbiwgaHVtYW4gcmVhZGFibGUgc2VjdGlvbgorICAgICAgICBzdWJwYXJ0ID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSwgIiIiXAorVGhpcyByZXBvcnQgcmVsYXRlcyB0byBhIG1lc3NhZ2UgeW91IHNlbnQgd2l0aCB0aGUgZm9sbG93aW5nIGhlYWRlciBmaWVsZHM6CisKKyAgTWVzc2FnZS1pZDogPDAwMjAwMWMxNDRhNiQ4NzUyZTA2MCQ1NjEwNDU4NkBveHkuZWR1PgorICBEYXRlOiBTdW4sIDIzIFNlcCAyMDAxIDIwOjEwOjU1IC0wNzAwCisgIEZyb206ICJJYW4gVC4gSGVucnkiIDxoZW5yeWlAb3h5LmVkdT4KKyAgVG86IFNvQ2FsIFJhdmVzIDxzY3JAc29jYWwtcmF2ZXMub3JnPgorICBTdWJqZWN0OiBbc2NyXSB5ZWFoIGZvciBJYW5zISEKKworWW91ciBtZXNzYWdlIGNhbm5vdCBiZSBkZWxpdmVyZWQgdG8gdGhlIGZvbGxvd2luZyByZWNpcGllbnRzOgorCisgIFJlY2lwaWVudCBhZGRyZXNzOiBqYW5nZWwxQGNvdWdhci5ub2MudWNsYS5lZHUKKyAgUmVhc29uOiByZWNpcGllbnQgcmVhY2hlZCBkaXNrIHF1b3RhCisKKyIiIikKKyAgICAgICAgIyBTdWJwYXJ0IDIgY29udGFpbnMgdGhlIG1hY2hpbmUgcGFyc2FibGUgRFNOIGluZm9ybWF0aW9uLiAgSXQKKyAgICAgICAgIyBjb25zaXN0cyBvZiB0d28gYmxvY2tzIG9mIGhlYWRlcnMsIHJlcHJlc2VudGVkIGJ5IHR3byBuZXN0ZWQgTWVzc2FnZQorICAgICAgICAjIG9iamVjdHMuCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cycpCisgICAgICAgIGVxKGxlbihzdWJwYXJ0LmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIHNob3VsZCB0cmVhdCBlYWNoIGJsb2NrIGFzIGEgYnVuY2ggb2YKKyAgICAgICAgIyBoZWFkZXJzLCBpLmUuIGEgYnVuY2ggb2YgTWVzc2FnZSBvYmplY3RzLgorICAgICAgICBkc24xID0gc3VicGFydC5nZXRfcGF5bG9hZCgwKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShkc24xLCBNZXNzYWdlKSkKKyAgICAgICAgZXEoZHNuMVsnb3JpZ2luYWwtZW52ZWxvcGUtaWQnXSwgJzBHSzUwMEI0SEQwODg4QGNvdWdhci5ub2MudWNsYS5lZHUnKQorICAgICAgICBlcShkc24xLmdldF9wYXJhbSgnZG5zJywgaGVhZGVyPSdyZXBvcnRpbmctbXRhJyksICcnKQorICAgICAgICAjIFRyeSBhIG1pc3Npbmcgb25lIDx3aW5rPgorICAgICAgICBlcShkc24xLmdldF9wYXJhbSgnbnNkJywgaGVhZGVyPSdyZXBvcnRpbmctbXRhJyksIE5vbmUpCisgICAgICAgIGRzbjIgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKDEpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGRzbjIsIE1lc3NhZ2UpKQorICAgICAgICBlcShkc24yWydhY3Rpb24nXSwgJ2ZhaWxlZCcpCisgICAgICAgIGVxKGRzbjIuZ2V0X3BhcmFtcyhoZWFkZXI9J29yaWdpbmFsLXJlY2lwaWVudCcpLAorICAgICAgICAgICBbKCdyZmM4MjInLCAnJyksICgnamFuZ2VsMUBjb3VnYXIubm9jLnVjbGEuZWR1JywgJycpXSkKKyAgICAgICAgZXEoZHNuMi5nZXRfcGFyYW0oJ3JmYzgyMicsIGhlYWRlcj0nZmluYWwtcmVjaXBpZW50JyksICcnKQorICAgICAgICAjIFN1YnBhcnQgMyBpcyB0aGUgb3JpZ2luYWwgbWVzc2FnZQorICAgICAgICBzdWJwYXJ0ID0gbXNnLmdldF9wYXlsb2FkKDIpCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBwYXlsb2FkID0gc3VicGFydC5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIHN1YnN1YnBhcnQgPSBwYXlsb2FkWzBdCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnN1YnBhcnQsIE1lc3NhZ2UpKQorICAgICAgICBlcShzdWJzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShzdWJzdWJwYXJ0WydtZXNzYWdlLWlkJ10sCisgICAgICAgICAgICc8MDAyMDAxYzE0NGE2JDg3NTJlMDYwJDU2MTA0NTg2QG94eS5lZHU+JykKKworICAgIGRlZiB0ZXN0X2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMjEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1RvJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1N1YmplY3QnXSA9ICdUZXN0JworICAgICAgICBtc2cucHJlYW1ibGUgPSAnTUlNRSBtZXNzYWdlJworICAgICAgICBtc2cuZXBpbG9ndWUgPSAnRW5kIG9mIE1JTUUgbWVzc2FnZVxuJworICAgICAgICBtc2cxID0gTUlNRVRleHQoJ09uZScpCisgICAgICAgIG1zZzIgPSBNSU1FVGV4dCgnVHdvJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvbWl4ZWQnLCBib3VuZGFyeT0nQk9VTkRBUlknKQorICAgICAgICBtc2cuYXR0YWNoKG1zZzEpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMikKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksIHRleHQpCisKKyAgICBkZWYgdGVzdF9ub19ubF9wcmVhbWJsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snRnJvbSddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgbXNnWydUbyddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgbXNnWydTdWJqZWN0J10gPSAnVGVzdCcKKyAgICAgICAgbXNnLnByZWFtYmxlID0gJ01JTUUgbWVzc2FnZScKKyAgICAgICAgbXNnLmVwaWxvZ3VlID0gJycKKyAgICAgICAgbXNnMSA9IE1JTUVUZXh0KCdPbmUnKQorICAgICAgICBtc2cyID0gTUlNRVRleHQoJ1R3bycpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCAnbXVsdGlwYXJ0L21peGVkJywgYm91bmRhcnk9J0JPVU5EQVJZJykKKyAgICAgICAgbXNnLmF0dGFjaChtc2cxKQorICAgICAgICBtc2cuYXR0YWNoKG1zZzIpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitTdWJqZWN0OiBUZXN0CitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorCitNSU1FIG1lc3NhZ2UKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitPbmUKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitUd28KKy0tQk9VTkRBUlktLQorIiIiKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzMwLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBjb250YWluZXIxID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgY29udGFpbmVyMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGNvbnRhaW5lcjFhID0gY29udGFpbmVyMS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGNvbnRhaW5lcjJhID0gY29udGFpbmVyMi5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIyYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGVfd2l0aF9leHBsaWNpdF9jb250YWluZXJfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18yOC50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgY29udGFpbmVyMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGNvbnRhaW5lcjIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBjb250YWluZXIxYSA9IGNvbnRhaW5lcjEuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBjb250YWluZXIyYSA9IGNvbnRhaW5lcjIuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF90eXBlX25vbl9wYXJzZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBTZXQgdXAgY29udGFpbmVyCisgICAgICAgIGNvbnRhaW5lciA9IE1JTUVNdWx0aXBhcnQoJ2RpZ2VzdCcsICdCT1VOREFSWScpCisgICAgICAgIGNvbnRhaW5lci5lcGlsb2d1ZSA9ICcnCisgICAgICAgICMgU2V0IHVwIHN1YnBhcnRzCisgICAgICAgIHN1YnBhcnQxYSA9IE1JTUVUZXh0KCdtZXNzYWdlIDFcbicpCisgICAgICAgIHN1YnBhcnQyYSA9IE1JTUVUZXh0KCdtZXNzYWdlIDJcbicpCisgICAgICAgIHN1YnBhcnQxID0gTUlNRU1lc3NhZ2Uoc3VicGFydDFhKQorICAgICAgICBzdWJwYXJ0MiA9IE1JTUVNZXNzYWdlKHN1YnBhcnQyYSkKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChzdWJwYXJ0MSkKKyAgICAgICAgY29udGFpbmVyLmF0dGFjaChzdWJwYXJ0MikKKyAgICAgICAgZXEoc3VicGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBuZXEoY29udGFpbmVyLmFzX3N0cmluZygwKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCitNSU1FLVZlcnNpb246IDEuMAorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworbWVzc2FnZSAxCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK01JTUUtVmVyc2lvbjogMS4wCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCisnJycpCisgICAgICAgIGRlbCBzdWJwYXJ0MVsnY29udGVudC10eXBlJ10KKyAgICAgICAgZGVsIHN1YnBhcnQxWydtaW1lLXZlcnNpb24nXQorICAgICAgICBkZWwgc3VicGFydDJbJ2NvbnRlbnQtdHlwZSddCisgICAgICAgIGRlbCBzdWJwYXJ0MlsnbWltZS12ZXJzaW9uJ10KKyAgICAgICAgZXEoc3VicGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBuZXEoY29udGFpbmVyLmFzX3N0cmluZygwKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorCistLUJPVU5EQVJZCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDEKKworLS1CT1VOREFSWQorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworbWVzc2FnZSAyCisKKy0tQk9VTkRBUlktLQorJycnKQorCisgICAgZGVmIHRlc3RfbWltZV9hdHRhY2htZW50c19pbl9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHRleHQxID0gTUlNRVRleHQoJycpCisgICAgICAgIHRleHQyID0gTUlNRVRleHQoJycpCisgICAgICAgIG1zZyA9IE1JTUVNdWx0aXBhcnQoX3N1YnBhcnRzPSh0ZXh0MSwgdGV4dDIpKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMCksIHRleHQxKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMSksIHRleHQyKQorCisKKworIyBBIGdlbmVyYWwgdGVzdCBvZiBwYXJzZXItPm1vZGVsLT5nZW5lcmF0b3IgaWRlbXBvdGVuY3kuICBJT1csIHJlYWQgYSBtZXNzYWdlCisjIGluLCBwYXJzZSBpdCBpbnRvIGEgbWVzc2FnZSBvYmplY3QgdHJlZSwgdGhlbiB3aXRob3V0IHRvdWNoaW5nIHRoZSB0cmVlLAorIyByZWdlbmVyYXRlIHRoZSBwbGFpbiB0ZXh0LiAgVGhlIG9yaWdpbmFsIHRleHQgYW5kIHRoZSB0cmFuc2Zvcm1lZCB0ZXh0CisjIHNob3VsZCBiZSBpZGVudGljYWwuICBOb3RlOiB0aGF0IHdlIGlnbm9yZSB0aGUgVW5peC1Gcm9tIHNpbmNlIHRoYXQgbWF5CisjIGNvbnRhaW4gYSBjaGFuZ2VkIGRhdGUuCitjbGFzcyBUZXN0SWRlbXBvdGVudChUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgX21zZ29iaihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZwID0gb3BlbmZpbGUoZmlsZW5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhkYXRhKQorICAgICAgICByZXR1cm4gbXNnLCBkYXRhCisKKyAgICBkZWYgX2lkZW1wb3RlbnQoc2VsZiwgbXNnLCB0ZXh0KToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYXhoZWFkZXJsZW49MCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEodGV4dCwgcy5nZXR2YWx1ZSgpKQorCisgICAgZGVmIHRlc3RfcGFyc2VfdGV4dF9tZXNzYWdlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpWzFdLCAoJ2NoYXJzZXQnLCAndXMtYXNjaWknKSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAndXMtYXNjaWknKQorICAgICAgICBlcShtc2cucHJlYW1ibGUsIE5vbmUpCisgICAgICAgIGVxKG1zZy5lcGlsb2d1ZSwgTm9uZSkKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9wYXJzZV91bnR5cGVkX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksIE5vbmUpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgTm9uZSkKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X01JTUVfZGlnZXN0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wMi50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X2xvbmdfaGVhZGVyKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yNy50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X01JTUVfZGlnZXN0X3dpdGhfcGFydF9oZWFkZXJzKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yOC50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X21peGVkX3dpdGhfaW1hZ2Uoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA2LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X3JlcG9ydChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDUudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9kc24oc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzE2LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfcHJlYW1ibGVfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzIxLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X29uZV9wYXJ0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yMy50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9ub19wYXJ0cyhzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMjQudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9ub19zdGFydF9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzEudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzMyLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbW9yZV9yZmMyMjMxX3BhcmFtZXRlcnMoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzMzLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfdGV4dF9wbGFpbl9pbl9hX211bHRpcGFydF9kaWdlc3Qoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzM0LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbmVzdGVkX211bHRpcGFydF9taXhlZHMoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzEyYS50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZXh0ZXJuYWxfYm9keV9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18zNi50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X2NvbnRlbnRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICAjIEdldCBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCByZXNldCB0aGUgc2VlayBwb2ludGVyIGZvciBvdGhlciB0ZXN0cworICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCisgICAgICAgICMgVGVzdCB0aGUgQ29udGVudC1UeXBlOiBwYXJhbWV0ZXJzCisgICAgICAgIHBhcmFtcyA9IHt9CisgICAgICAgIGZvciBwaywgcHYgaW4gbXNnLmdldF9wYXJhbXMoKToKKyAgICAgICAgICAgIHBhcmFtc1twa10gPSBwdgorICAgICAgICBlcShwYXJhbXNbJ3JlcG9ydC10eXBlJ10sICdkZWxpdmVyeS1zdGF0dXMnKQorICAgICAgICBlcShwYXJhbXNbJ2JvdW5kYXJ5J10sICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJykKKyAgICAgICAgZXEobXNnLnByZWFtYmxlLCAnVGhpcyBpcyBhIE1JTUUtZW5jYXBzdWxhdGVkIG1lc3NhZ2UuXG4nKQorICAgICAgICBlcShtc2cuZXBpbG9ndWUsICdcbicpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDMpCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdWJwYXJ0cyBhcmUgd2hhdCB3ZSBleHBlY3QKKyAgICAgICAgbXNnMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKKyAgICAgICAgbXNnMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShtc2cyLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cyLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKKyAgICAgICAgbXNnMyA9IG1zZy5nZXRfcGF5bG9hZCgyKQorICAgICAgICBlcShtc2czLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMywgTWVzc2FnZSkpCisgICAgICAgIHBheWxvYWQgPSBtc2czLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgbXNnNCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnNCwgTWVzc2FnZSkpCisgICAgICAgIGVxKG1zZzQuZ2V0X3BheWxvYWQoKSwgJ1lhZGRhIHlhZGRhIHlhZGRhXG4nKQorCisgICAgZGVmIHRlc3RfcGFyc2VyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA2LnR4dCcpCisgICAgICAgICMgQ2hlY2sgc29tZSBvZiB0aGUgb3V0ZXIgaGVhZGVycworICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgcGF5bG9hZCBpcyBhIGxpc3Qgb2YgZXhhY3RseSBvbmUgc3ViLU1lc3NhZ2UsIGFuZCB0aGF0CisgICAgICAgICMgdGhhdCBzdWJtZXNzYWdlIGhhcyBhIHR5cGUgb2YgdGV4dC9wbGFpbgorICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgbXNnMSA9IHBheWxvYWRbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMSwgTWVzc2FnZSkpCisgICAgICAgIGVxKG1zZzEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZzEuZ2V0X3BheWxvYWQoKSwgc3RyKSkKKyAgICAgICAgZXEobXNnMS5nZXRfcGF5bG9hZCgpLCAnXG4nKQorCisKKworIyBUZXN0IHZhcmlvdXMgb3RoZXIgYml0cyBvZiB0aGUgcGFja2FnZSdzIGZ1bmN0aW9uYWxpdHkKK2NsYXNzIFRlc3RNaXNjZWxsYW5lb3VzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9zdHJpbmcoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcodGV4dCkKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgIyBEb24ndCB3cmFwL2NvbnRpbnVlIGxvbmcgaGVhZGVycyBzaW5jZSB3ZSdyZSB0cnlpbmcgdG8gdGVzdAorICAgICAgICAjIGlkZW1wb3RlbmN5LgorICAgICAgICBnID0gR2VuZXJhdG9yKHMsIG1heGhlYWRlcmxlbj0wKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIHMuZ2V0dmFsdWUoKSkKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9maWxlKHNlbGYpOgorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICAgICAgZnAuc2VlaygwKQorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgIyBEb24ndCB3cmFwL2NvbnRpbnVlIGxvbmcgaGVhZGVycyBzaW5jZSB3ZSdyZSB0cnlpbmcgdG8gdGVzdAorICAgICAgICAgICAgIyBpZGVtcG90ZW5jeS4KKyAgICAgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWF4aGVhZGVybGVuPTApCisgICAgICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBzLmdldHZhbHVlKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fc3RyaW5nX3dpdGhfY2xhc3Moc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAjIENyZWF0ZSBhIHN1YmNsYXNzCisgICAgICAgIGNsYXNzIE15TWVzc2FnZShNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHRleHQsIE15TWVzc2FnZSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLCBNeU1lc3NhZ2UpKQorICAgICAgICAjIFRyeSBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDIudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHRleHQsIE15TWVzc2FnZSkKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnBhcnQsIE15TWVzc2FnZSkpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fZmlsZV93aXRoX2NsYXNzKHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgIyBDcmVhdGUgYSBzdWJjbGFzcworICAgICAgICBjbGFzcyBNeU1lc3NhZ2UoTWVzc2FnZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwLCBNeU1lc3NhZ2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZywgTXlNZXNzYWdlKSkKKyAgICAgICAgIyBUcnkgc29tZXRoaW5nIG1vcmUgY29tcGxpY2F0ZWQKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAyLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwLCBNeU1lc3NhZ2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGZvciBzdWJwYXJ0IGluIG1zZy53YWxrKCk6CisgICAgICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzdWJwYXJ0LCBNeU1lc3NhZ2UpKQorCisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKCdlbWFpbCcpCisgICAgICAgICMgQ2FuJ3QgdXNlIHNvcnRlZCgpIGhlcmUgZHVlIHRvIFB5dGhvbiAyLjMgY29tcGF0aWJpbGl0eQorICAgICAgICBhbGwgPSBtb2R1bGUuX19hbGxfX1s6XQorICAgICAgICBhbGwuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsLCBbCisgICAgICAgICAgICAjIE9sZCBuYW1lcworICAgICAgICAgICAgJ0NoYXJzZXQnLCAnRW5jb2RlcnMnLCAnRXJyb3JzJywgJ0dlbmVyYXRvcicsCisgICAgICAgICAgICAnSGVhZGVyJywgJ0l0ZXJhdG9ycycsICdNSU1FQXVkaW8nLCAnTUlNRUJhc2UnLAorICAgICAgICAgICAgJ01JTUVJbWFnZScsICdNSU1FTWVzc2FnZScsICdNSU1FTXVsdGlwYXJ0JywKKyAgICAgICAgICAgICdNSU1FTm9uTXVsdGlwYXJ0JywgJ01JTUVUZXh0JywgJ01lc3NhZ2UnLAorICAgICAgICAgICAgJ1BhcnNlcicsICdVdGlscycsICdiYXNlNjRNSU1FJywKKyAgICAgICAgICAgICMgbmV3IG5hbWVzCisgICAgICAgICAgICAnYmFzZTY0bWltZScsICdjaGFyc2V0JywgJ2VuY29kZXJzJywgJ2Vycm9ycycsICdnZW5lcmF0b3InLAorICAgICAgICAgICAgJ2hlYWRlcicsICdpdGVyYXRvcnMnLCAnbWVzc2FnZScsICdtZXNzYWdlX2Zyb21fZmlsZScsCisgICAgICAgICAgICAnbWVzc2FnZV9mcm9tX3N0cmluZycsICdtaW1lJywgJ3BhcnNlcicsCisgICAgICAgICAgICAncXVvcHJpTUlNRScsICdxdW9wcmltaW1lJywgJ3V0aWxzJywKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9mb3JtYXRkYXRlKHNlbGYpOgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLnBhcnNlZGF0ZSh1dGlscy5mb3JtYXRkYXRlKG5vdykpWzo2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLmdtdGltZShub3cpWzo2XSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdGRhdGVfbG9jYWx0aW1lKHNlbGYpOgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMucGFyc2VkYXRlKHV0aWxzLmZvcm1hdGRhdGUobm93LCBsb2NhbHRpbWU9VHJ1ZSkpWzo2XSwKKyAgICAgICAgICAgIHRpbWUubG9jYWx0aW1lKG5vdylbOjZdKQorCisgICAgZGVmIHRlc3RfZm9ybWF0ZGF0ZV91c2VnbXQoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRkYXRlKG5vdywgbG9jYWx0aW1lPUZhbHNlKSwKKyAgICAgICAgICAgIHRpbWUuc3RyZnRpbWUoJyVhLCAlZCAlYiAlWSAlSDolTTolUyAtMDAwMCcsIHRpbWUuZ210aW1lKG5vdykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0ZGF0ZShub3csIGxvY2FsdGltZT1GYWxzZSwgdXNlZ210PVRydWUpLAorICAgICAgICAgICAgdGltZS5zdHJmdGltZSgnJWEsICVkICViICVZICVIOiVNOiVTIEdNVCcsIHRpbWUuZ210aW1lKG5vdykpKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX25vbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VkYXRlKCcnKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9jb21wYWN0KHNlbGYpOgorICAgICAgICAjIFRoZSBGV1MgYWZ0ZXIgdGhlIGNvbW1hIGlzIG9wdGlvbmFsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VkYXRlKCdXZWQsMyBBcHIgMjAwMiAxNDo1ODoyNiArMDgwMCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnBhcnNlZGF0ZSgnV2VkLCAzIEFwciAyMDAyIDE0OjU4OjI2ICswODAwJykpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfbm9fZGF5b2Z3ZWVrKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEodXRpbHMucGFyc2VkYXRlX3R6KCcyNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpLAorICAgICAgICAgICAoMjAwMywgMiwgMjUsIDEzLCA0NywgMjYsIDAsIDEsIC0xLCAtMjg4MDApKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2NvbXBhY3Rfbm9fZGF5b2Z3ZWVrKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEodXRpbHMucGFyc2VkYXRlX3R6KCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJyksCisgICAgICAgICAgICgyMDAzLCAyLCA1LCAxMywgNDcsIDI2LCAwLCAxLCAtMSwgLTI4ODAwKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9hY2NlcHRhYmxlX3RvX3RpbWVfZnVuY3Rpb25zKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdGltZXR1cCA9IHV0aWxzLnBhcnNlZGF0ZSgnNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpCisgICAgICAgIHQgPSBpbnQodGltZS5ta3RpbWUodGltZXR1cCkpCisgICAgICAgIGVxKHRpbWUubG9jYWx0aW1lKHQpWzo2XSwgdGltZXR1cFs6Nl0pCisgICAgICAgIGVxKGludCh0aW1lLnN0cmZ0aW1lKCclWScsIHRpbWV0dXApKSwgMjAwMykKKyAgICAgICAgdGltZXR1cCA9IHV0aWxzLnBhcnNlZGF0ZV90eignNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpCisgICAgICAgIHQgPSBpbnQodGltZS5ta3RpbWUodGltZXR1cFs6OV0pKQorICAgICAgICBlcSh0aW1lLmxvY2FsdGltZSh0KVs6Nl0sIHRpbWV0dXBbOjZdKQorICAgICAgICBlcShpbnQodGltZS5zdHJmdGltZSgnJVknLCB0aW1ldHVwWzo5XSkpLCAyMDAzKQorCisgICAgZGVmIHRlc3RfcGFyc2VhZGRyX2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLnBhcnNlYWRkcignPD4nKSwgKCcnLCAnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMuZm9ybWF0YWRkcih1dGlscy5wYXJzZWFkZHIoJzw+JykpLCAnJykKKworICAgIGRlZiB0ZXN0X25vcXVvdGVfZHVtcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHV0aWxzLmZvcm1hdGFkZHIoKCdBIFNpbGx5IFBlcnNvbicsICdwZXJzb25AZG9tLmFpbicpKSwKKyAgICAgICAgICAgICdBIFNpbGx5IFBlcnNvbiA8cGVyc29uQGRvbS5haW4+JykKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9kdW1wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0YWRkcigoJ0EgKFZlcnkpIFNpbGx5IFBlcnNvbicsICdwZXJzb25AZG9tLmFpbicpKSwKKyAgICAgICAgICAgIHInIkEgXChWZXJ5XCkgU2lsbHkgUGVyc29uIiA8cGVyc29uQGRvbS5haW4+JykKKyAgICAgICAgYSA9IHInQSBcKFNwZWNpYWxcKSBQZXJzb24nCisgICAgICAgIGIgPSAncGVyc29uQGRvbS5haW4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKHV0aWxzLmZvcm1hdGFkZHIoKGEsIGIpKSksIChhLCBiKSkKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9iYWNrc2xhc2hlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHV0aWxzLmZvcm1hdGFkZHIoKCdBcnRodXIgXEJhY2tzbGFzaFwgRm9vYmFyJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgciciQXJ0aHVyIFxcQmFja3NsYXNoXFwgRm9vYmFyIiA8cGVyc29uQGRvbS5haW4+JykKKyAgICAgICAgYSA9IHInQXJ0aHVyIFxCYWNrc2xhc2hcIEZvb2JhcicKKyAgICAgICAgYiA9ICdwZXJzb25AZG9tLmFpbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWFkZHIodXRpbHMuZm9ybWF0YWRkcigoYSwgYikpKSwgKGEsIGIpKQorCisgICAgZGVmIHRlc3RfbmFtZV93aXRoX2RvdChzZWxmKToKKyAgICAgICAgeCA9ICdKb2huIFguIERvZSA8anhkQGV4YW1wbGUuY29tPicKKyAgICAgICAgeSA9ICciSm9obiBYLiBEb2UiIDxqeGRAZXhhbXBsZS5jb20+JworICAgICAgICBhLCBiID0gKCdKb2huIFguIERvZScsICdqeGRAZXhhbXBsZS5jb20nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLnBhcnNlYWRkcih4KSwgKGEsIGIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLnBhcnNlYWRkcih5KSwgKGEsIGIpKQorICAgICAgICAjIGZvcm1hdGFkZHIoKSBxdW90ZXMgdGhlIG5hbWUgaWYgdGhlcmUncyBhIGRvdCBpbiBpdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLmZvcm1hdGFkZHIoKGEsIGIpKSwgeSkKKworICAgIGRlZiB0ZXN0X211bHRpbGluZV9mcm9tX2NvbW1lbnQoc2VsZik6CisgICAgICAgIHggPSAiIiJcCitGb28KK1x0QmFyIDxmb29AZXhhbXBsZS5jb20+IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKHgpLCAoJ0ZvbyBCYXInLCAnZm9vQGV4YW1wbGUuY29tJykpCisKKyAgICBkZWYgdGVzdF9xdW90ZV9kdW1wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0YWRkcigoJ0EgU2lsbHk7IFBlcnNvbicsICdwZXJzb25AZG9tLmFpbicpKSwKKyAgICAgICAgICAgIHInIkEgU2lsbHk7IFBlcnNvbiIgPHBlcnNvbkBkb20uYWluPicpCisKKyAgICBkZWYgdGVzdF9maXhfZW9scyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHV0aWxzLmZpeF9lb2xzKCdoZWxsbycpLCAnaGVsbG8nKQorICAgICAgICBlcSh1dGlscy5maXhfZW9scygnaGVsbG9cbicpLCAnaGVsbG9cclxuJykKKyAgICAgICAgZXEodXRpbHMuZml4X2VvbHMoJ2hlbGxvXHInKSwgJ2hlbGxvXHJcbicpCisgICAgICAgIGVxKHV0aWxzLmZpeF9lb2xzKCdoZWxsb1xyXG4nKSwgJ2hlbGxvXHJcbicpCisgICAgICAgIGVxKHV0aWxzLmZpeF9lb2xzKCdoZWxsb1xuXHInKSwgJ2hlbGxvXHJcblxyXG4nKQorCisgICAgZGVmIHRlc3RfY2hhcnNldF9yaWNoY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZSA9IHNlbGYuYXNzZXJ0Tm90RXF1YWwKKyAgICAgICAgY3NldDEgPSBDaGFyc2V0KCkKKyAgICAgICAgY3NldDIgPSBDaGFyc2V0KCkKKyAgICAgICAgZXEoY3NldDEsICd1cy1hc2NpaScpCisgICAgICAgIGVxKGNzZXQxLCAnVVMtQVNDSUknKQorICAgICAgICBlcShjc2V0MSwgJ1VzLUFzQ2lJJykKKyAgICAgICAgZXEoJ3VzLWFzY2lpJywgY3NldDEpCisgICAgICAgIGVxKCdVUy1BU0NJSScsIGNzZXQxKQorICAgICAgICBlcSgnVXMtQXNDaUknLCBjc2V0MSkKKyAgICAgICAgbmUoY3NldDEsICd1c2FzY2lpJykKKyAgICAgICAgbmUoY3NldDEsICdVU0FTQ0lJJykKKyAgICAgICAgbmUoY3NldDEsICdVc0FzQ2lJJykKKyAgICAgICAgbmUoJ3VzYXNjaWknLCBjc2V0MSkKKyAgICAgICAgbmUoJ1VTQVNDSUknLCBjc2V0MSkKKyAgICAgICAgbmUoJ1VzQXNDaUknLCBjc2V0MSkKKyAgICAgICAgZXEoY3NldDEsIGNzZXQyKQorICAgICAgICBlcShjc2V0MiwgY3NldDEpCisKKyAgICBkZWYgdGVzdF9nZXRhZGRyZXNzZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5nZXRhZGRyZXNzZXMoWydhcGVyc29uQGRvbS5haW4gKEFsIFBlcnNvbiknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCdWQgUGVyc29uIDxicGVyc29uQGRvbS5haW4+J10pLAorICAgICAgICAgICBbKCdBbCBQZXJzb24nLCAnYXBlcnNvbkBkb20uYWluJyksCisgICAgICAgICAgICAoJ0J1ZCBQZXJzb24nLCAnYnBlcnNvbkBkb20uYWluJyldKQorCisgICAgZGVmIHRlc3RfZ2V0YWRkcmVzc2VzX25hc3R5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEodXRpbHMuZ2V0YWRkcmVzc2VzKFsnZm9vOiA7J10pLCBbKCcnLCAnJyldKQorICAgICAgICBlcSh1dGlscy5nZXRhZGRyZXNzZXMoCisgICAgICAgICAgIFsnW10qLS0gPX4kJ10pLAorICAgICAgICAgICBbKCcnLCAnJyksICgnJywgJycpLCAoJycsICcqLS0nKV0pCisgICAgICAgIGVxKHV0aWxzLmdldGFkZHJlc3NlcygKKyAgICAgICAgICAgWydmb286IDsnLCAnIkphc29uIFIuIE1hc3RhbGVyIiA8amFzb25AZG9tLmFpbj4nXSksCisgICAgICAgICAgIFsoJycsICcnKSwgKCdKYXNvbiBSLiBNYXN0YWxlcicsICdqYXNvbkBkb20uYWluJyldKQorCisgICAgZGVmIHRlc3RfZ2V0YWRkcmVzc2VzX2VtYmVkZGVkX2NvbW1lbnQoc2VsZik6CisgICAgICAgICIiIlRlc3QgcHJvcGVyIGhhbmRsaW5nIG9mIGEgbmVzdGVkIGNvbW1lbnQiIiIKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGFkZHJzID0gdXRpbHMuZ2V0YWRkcmVzc2VzKFsnVXNlciAoKG5lc3RlZCBjb21tZW50KSkgPGZvb0BiYXIuY29tPiddKQorICAgICAgICBlcShhZGRyc1swXVsxXSwgJ2Zvb0BiYXIuY29tJykKKworICAgIGRlZiB0ZXN0X3V0aWxzX3F1b3RlX3VucXVvdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ2NvbnRlbnQtZGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdmb29cXHdhY2t5Im5hbWUnKQorICAgICAgICBlcShtc2cuZ2V0X2ZpbGVuYW1lKCksICdmb29cXHdhY2t5Im5hbWUnKQorCisgICAgZGVmIHRlc3RfZ2V0X2JvZHlfZW5jb2Rpbmdfd2l0aF9ib2d1c19jaGFyc2V0KHNlbGYpOgorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCgnbm90IGEgY2hhcnNldCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2hhcnNldC5nZXRfYm9keV9lbmNvZGluZygpLCAnYmFzZTY0JykKKworICAgIGRlZiB0ZXN0X2dldF9ib2R5X2VuY29kaW5nX3dpdGhfdXBwZXJjYXNlX2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04JworICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCcpCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGxlbihjaGFyc2V0cyksIDEpCisgICAgICAgIGVxKGNoYXJzZXRzWzBdLCAndXRmLTgnKQorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldChjaGFyc2V0c1swXSkKKyAgICAgICAgZXEoY2hhcnNldC5nZXRfYm9keV9lbmNvZGluZygpLCAnYmFzZTY0JykKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdoZWxsbyB3b3JsZCcsIGNoYXJzZXQ9Y2hhcnNldCkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdhR1ZzYkc4Z2QyOXliR1E9XG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCAnaGVsbG8gd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ2Jhc2U2NCcpCisgICAgICAgICMgVHJ5IGFub3RoZXIgb25lCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9IlVTLUFTQ0lJIicKKyAgICAgICAgY2hhcnNldHMgPSBtc2cuZ2V0X2NoYXJzZXRzKCkKKyAgICAgICAgZXEobGVuKGNoYXJzZXRzKSwgMSkKKyAgICAgICAgZXEoY2hhcnNldHNbMF0sICd1cy1hc2NpaScpCisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KGNoYXJzZXRzWzBdKQorICAgICAgICBlcShjaGFyc2V0LmdldF9ib2R5X2VuY29kaW5nKCksIGVuY29kZXJzLmVuY29kZV83b3I4Yml0KQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ2hlbGxvIHdvcmxkJywgY2hhcnNldD1jaGFyc2V0KQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKworICAgIGRlZiB0ZXN0X2NoYXJzZXRzX2Nhc2VfaW5zZW5zaXRpdmUoc2VsZik6CisgICAgICAgIGxjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICB1YyA9IENoYXJzZXQoJ1VTLUFTQ0lJJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYy5nZXRfYm9keV9lbmNvZGluZygpLCB1Yy5nZXRfYm9keV9lbmNvZGluZygpKQorCisgICAgZGVmIHRlc3RfcGFydGlhbF9mYWxsc19pbnNpZGVfbWVzc2FnZV9kZWxpdmVyeV9zdGF0dXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgICMgVGhlIFBhcnNlciBpbnRlcmZhY2UgcHJvdmlkZXMgY2h1bmtzIG9mIGRhdGEgdG8gRmVlZFBhcnNlciBpbiA4MTkyCisgICAgICAgICMgYnl0ZSBndWxwcy4gIFNGIGJ1ZyAjMTA3NjQ4NSBmb3VuZCBvbmUgb2YgdGhvc2UgY2h1bmtzIGluc2lkZQorICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIGhlYWRlciBibG9jaywgd2hpY2ggdHJpZ2dlcmVkIGFuCisgICAgICAgICMgdW5yZWFkbGluZSgpIG9mIE5lZWRNb3JlRGF0YS4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfNDMudHh0JykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBpdGVyYXRvcnMuX3N0cnVjdHVyZShtc2csIHNmcCkKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK211bHRpcGFydC9yZXBvcnQKKyAgICB0ZXh0L3BsYWluCisgICAgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMKKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgdGV4dC9yZmM4MjItaGVhZGVycworIiIiKQorCisKKworIyBUZXN0IHRoZSBpdGVyYXRvci9nZW5lcmF0b3JzCitjbGFzcyBUZXN0SXRlcmF0b3JzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2JvZHlfbGluZV9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICAjIEZpcnN0IGEgc2ltcGxlIG5vbi1tdWx0aXBhcnQgbWVzc2FnZQorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBpdCA9IGl0ZXJhdG9ycy5ib2R5X2xpbmVfaXRlcmF0b3IobXNnKQorICAgICAgICBsaW5lcyA9IGxpc3QoaXQpCisgICAgICAgIGVxKGxlbihsaW5lcyksIDYpCisgICAgICAgIG5lcShFTVBUWVNUUklORy5qb2luKGxpbmVzKSwgbXNnLmdldF9wYXlsb2FkKCkpCisgICAgICAgICMgTm93IGEgbW9yZSBjb21wbGljYXRlZCBtdWx0aXBhcnQKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDIudHh0JykKKyAgICAgICAgaXQgPSBpdGVyYXRvcnMuYm9keV9saW5lX2l0ZXJhdG9yKG1zZykKKyAgICAgICAgbGluZXMgPSBsaXN0KGl0KQorICAgICAgICBlcShsZW4obGluZXMpLCA0MykKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzE5LnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5lcShFTVBUWVNUUklORy5qb2luKGxpbmVzKSwgZnAucmVhZCgpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfdHlwZWRfc3VicGFydF9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA0LnR4dCcpCisgICAgICAgIGl0ID0gaXRlcmF0b3JzLnR5cGVkX3N1YnBhcnRfaXRlcmF0b3IobXNnLCAndGV4dCcpCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgc3VicGFydHMgPSAwCisgICAgICAgIGZvciBzdWJwYXJ0IGluIGl0OgorICAgICAgICAgICAgc3VicGFydHMgKz0gMQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSkKKyAgICAgICAgZXEoc3VicGFydHMsIDIpCisgICAgICAgIGVxKEVNUFRZU1RSSU5HLmpvaW4obGluZXMpLCAiIiJcCithIHNpbXBsZSBraW5kIG9mIG1pcnJvcgordG8gcmVmbGVjdCB1cG9uIG91ciBvd24KK2Egc2ltcGxlIGtpbmQgb2YgbWlycm9yCit0byByZWZsZWN0IHVwb24gb3VyIG93bgorIiIiKQorCisgICAgZGVmIHRlc3RfdHlwZWRfc3VicGFydF9pdGVyYXRvcl9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBpdCA9IGl0ZXJhdG9ycy50eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yKG1zZywgJ3RleHQnLCAncGxhaW4nKQorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIHN1YnBhcnRzID0gMAorICAgICAgICBmb3Igc3VicGFydCBpbiBpdDoKKyAgICAgICAgICAgIHN1YnBhcnRzICs9IDEKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChzdWJwYXJ0LmdldF9wYXlsb2FkKCkpCisgICAgICAgIGVxKHN1YnBhcnRzLCAxKQorICAgICAgICBlcShFTVBUWVNUUklORy5qb2luKGxpbmVzKSwgIiIiXAorCitIaSwKKworRG8geW91IGxpa2UgdGhpcyBtZXNzYWdlPworCistTWUKKyIiIikKKworCisKK2NsYXNzIFRlc3RQYXJzZXJzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2hlYWRlcl9wYXJzZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFBhcnNlIG9ubHkgdGhlIGhlYWRlcnMgb2YgYSBjb21wbGV4IG11bHRpcGFydCBNSU1FIGRvY3VtZW50CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMi50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBIZWFkZXJQYXJzZXIoKS5wYXJzZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZXEobXNnWydmcm9tJ10sICdwcHAtcmVxdWVzdEB6enoub3JnJykKKyAgICAgICAgZXEobXNnWyd0byddLCAncHBwQHp6ei5vcmcnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L21peGVkJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFRoaXMgbWVzc2FnZSBjb250YWlucyBhIGxpbmUgYWZ0ZXIgdGhlIFN1YmplY3Q6IGhlYWRlciB0aGF0IGhhcyBvbmx5CisgICAgICAgICMgd2hpdGVzcGFjZSwgYnV0IGl0IGlzIG5vdCBlbXB0eSEKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IHRoZSBuZXh0IGxpbmUgaGFzIGEgc3BhY2Ugb24gaXQKK1x4MjAKK0RhdGU6IE1vbiwgOCBBcHIgMjAwMiAxNTowOToxOSAtMDQwMAorTWVzc2FnZS1JRDogc3BhbQorCitIZXJlJ3MgdGhlIG1lc3NhZ2UgYm9keQorIiIiKQorICAgICAgICBlcShtc2dbJ3N1YmplY3QnXSwgJ3RoZSBuZXh0IGxpbmUgaGFzIGEgc3BhY2Ugb24gaXRcbiAnKQorICAgICAgICBlcShtc2dbJ21lc3NhZ2UtaWQnXSwgJ3NwYW0nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgIkhlcmUncyB0aGUgbWVzc2FnZSBib2R5XG4iKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9jb250aW51YXRpb25fbGFzdF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIExpa2UgdGhlIHByZXZpb3VzIHRlc3QsIGJ1dCB0aGUgc3ViamVjdCBsaW5lIGlzIHRoZSBsYXN0CisgICAgICAgICMgaGVhZGVyLgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCIiIlwKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorVG86IGJwZXJzb25AZG9tLmFpbgorRGF0ZTogTW9uLCA4IEFwciAyMDAyIDE1OjA5OjE5IC0wNDAwCitNZXNzYWdlLUlEOiBzcGFtCitTdWJqZWN0OiB0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0CitceDIwCisKK0hlcmUncyB0aGUgbWVzc2FnZSBib2R5CisiIiIpCisgICAgICAgIGVxKG1zZ1snc3ViamVjdCddLCAndGhlIG5leHQgbGluZSBoYXMgYSBzcGFjZSBvbiBpdFxuICcpCisgICAgICAgIGVxKG1zZ1snbWVzc2FnZS1pZCddLCAnc3BhbScpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAiSGVyZSdzIHRoZSBtZXNzYWdlIGJvZHlcbiIpCisKKyAgICBkZWYgdGVzdF9jcmxmX3NlcGFyYXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMjYudHh0JywgbW9kZT0ncmInKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBQYXJzZXIoKS5wYXJzZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgcGFydDEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHBhcnQxLmdldF9wYXlsb2FkKCksICdTaW1wbGUgZW1haWwgd2l0aCBhdHRhY2htZW50LlxyXG5cclxuJykKKyAgICAgICAgcGFydDIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEocGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXBwbGljYXRpb24vcmlzY29zJykKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9kaWdlc3Rfd2l0aF9leHRyYV9taW1lX2hlYWRlcnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzI4LnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAjIFN0cnVjdHVyZSBpczoKKyAgICAgICAgIyBtdWx0aXBhcnQvZGlnZXN0CisgICAgICAgICMgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAjICAgICB0ZXh0L3BsYWluCisgICAgICAgICMgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAjICAgICB0ZXh0L3BsYWluCisgICAgICAgIGVxKG1zZy5pc19tdWx0aXBhcnQoKSwgMSkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgcGFydDEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShwYXJ0MS5pc19tdWx0aXBhcnQoKSwgMSkKKyAgICAgICAgZXEobGVuKHBhcnQxLmdldF9wYXlsb2FkKCkpLCAxKQorICAgICAgICBwYXJ0MWEgPSBwYXJ0MS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShwYXJ0MWEuaXNfbXVsdGlwYXJ0KCksIDApCisgICAgICAgIGVxKHBhcnQxYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgbmVxKHBhcnQxYS5nZXRfcGF5bG9hZCgpLCAnbWVzc2FnZSAxXG4nKQorICAgICAgICAjIG5leHQgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgcGFydDIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEocGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShwYXJ0Mi5pc19tdWx0aXBhcnQoKSwgMSkKKyAgICAgICAgZXEobGVuKHBhcnQyLmdldF9wYXlsb2FkKCkpLCAxKQorICAgICAgICBwYXJ0MmEgPSBwYXJ0Mi5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShwYXJ0MmEuaXNfbXVsdGlwYXJ0KCksIDApCisgICAgICAgIGVxKHBhcnQyYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgbmVxKHBhcnQyYS5nZXRfcGF5bG9hZCgpLCAnbWVzc2FnZSAyXG4nKQorCisgICAgZGVmIHRlc3RfdGhyZWVfbGluZXMoc2VsZik6CisgICAgICAgICMgQSBidWcgcmVwb3J0IGJ5IEFuZHJldyBNY05hbWFyYQorICAgICAgICBsaW5lcyA9IFsnRnJvbTogQW5kcmV3IFBlcnNvbiA8YXBlcnNvbkBkb20uYWluJywKKyAgICAgICAgICAgICAgICAgJ1N1YmplY3Q6IFRlc3QnLAorICAgICAgICAgICAgICAgICAnRGF0ZTogVHVlLCAyMCBBdWcgMjAwMiAxNjo0Mzo0NSArMTAwMCddCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoTkwuam9pbihsaW5lcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWydkYXRlJ10sICdUdWUsIDIwIEF1ZyAyMDAyIDE2OjQzOjQ1ICsxMDAwJykKKworICAgIGRlZiB0ZXN0X3N0cmlwX2xpbmVfZmVlZF9hbmRfY2FycmlhZ2VfcmV0dXJuX2luX2hlYWRlcnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIEZvciBbIDEwMDI0NzUgXSBlbWFpbCBtZXNzYWdlIHBhcnNlciBkb2Vzbid0IGhhbmRsZSBcclxuIGNvcnJlY3RseQorICAgICAgICB2YWx1ZTEgPSAndGV4dCcKKyAgICAgICAgdmFsdWUyID0gJ21vcmUgdGV4dCcKKyAgICAgICAgbSA9ICdIZWFkZXI6ICVzXHJcbk5leHQtSGVhZGVyOiAlc1xyXG5cclxuQm9keVxyXG5cclxuJyAlICgKKyAgICAgICAgICAgIHZhbHVlMSwgdmFsdWUyKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKG1zZy5nZXQoJ0hlYWRlcicpLCB2YWx1ZTEpCisgICAgICAgIGVxKG1zZy5nZXQoJ05leHQtSGVhZGVyJyksIHZhbHVlMikKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfaGVhZGVyX3N5bnRheChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAnPkZyb206IGZvb1xuRnJvbTogYmFyXG4hIiNRVVg7fjogem9vXG5cbmJvZHknCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobGVuKG1zZy5rZXlzKCkpLCAzKQorICAgICAgICBrZXlzID0gbXNnLmtleXMoKQorICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICBlcShrZXlzLCBbJyEiI1FVWDt+JywgJz5Gcm9tJywgJ0Zyb20nXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdib2R5JykKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfc3BhY2Vfbm90X2FsbG93ZWRfaW5faGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICc+RnJvbSBmb29AZXhhbXBsZS5jb20gMTE6MjU6NTNcbkZyb206IGJhclxuISIjUVVYO346IHpvb1xuXG5ib2R5JworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKGxlbihtc2cua2V5cygpKSwgMCkKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfb25lX2NoYXJhY3Rlcl9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gJ0E6IGZpcnN0IGhlYWRlclxuQjogc2Vjb25kIGhlYWRlclxuQ0M6IHRoaXJkIGhlYWRlclxuXG5ib2R5JworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGhlYWRlcnMgPSBtc2cua2V5cygpCisgICAgICAgIGhlYWRlcnMuc29ydCgpCisgICAgICAgIGVxKGhlYWRlcnMsIFsnQScsICdCJywgJ0NDJ10pCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnYm9keScpCisKKworCitjbGFzcyBUZXN0QmFzZTY0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9sZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjRtaW1lLmJhc2U2NF9sZW4oJ2hlbGxvJyksCisgICAgICAgICAgIGxlbihiYXNlNjRtaW1lLmVuY29kZSgnaGVsbG8nLCBlb2w9JycpKSkKKyAgICAgICAgZm9yIHNpemUgaW4gcmFuZ2UoMTUpOgorICAgICAgICAgICAgaWYgICBzaXplID09IDAgOiBic2l6ZSA9IDAKKyAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSAzIDogYnNpemUgPSA0CisgICAgICAgICAgICBlbGlmIHNpemUgPD0gNiA6IGJzaXplID0gOAorICAgICAgICAgICAgZWxpZiBzaXplIDw9IDkgOiBic2l6ZSA9IDEyCisgICAgICAgICAgICBlbGlmIHNpemUgPD0gMTI6IGJzaXplID0gMTYKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgIDogYnNpemUgPSAyMAorICAgICAgICAgICAgZXEoYmFzZTY0bWltZS5iYXNlNjRfbGVuKCd4JypzaXplKSwgYnNpemUpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjRtaW1lLmRlY29kZSgnJyksICcnKQorICAgICAgICBlcShiYXNlNjRtaW1lLmRlY29kZSgnYUdWc2JHOD0nKSwgJ2hlbGxvJykKKyAgICAgICAgZXEoYmFzZTY0bWltZS5kZWNvZGUoJ2FHVnNiRzg9JywgJ1gnKSwgJ2hlbGxvJykKKyAgICAgICAgZXEoYmFzZTY0bWltZS5kZWNvZGUoJ2FHVnNiRzhOQ25kdmNteGtcbicsICdYJyksICdoZWxsb1h3b3JsZCcpCisKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjRtaW1lLmVuY29kZSgnJyksICcnKQorICAgICAgICBlcShiYXNlNjRtaW1lLmVuY29kZSgnaGVsbG8nKSwgJ2FHVnNiRzg9XG4nKQorICAgICAgICAjIFRlc3QgdGhlIGJpbmFyeSBmbGFnCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZW5jb2RlKCdoZWxsb1xuJyksICdhR1ZzYkc4S1xuJykKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJ2hlbGxvXG4nLCAwKSwgJ2FHVnNiRzhOQ2c9PVxuJykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZworICAgICAgICBlcShiYXNlNjRtaW1lLmVuY29kZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDApLCAiIiJcCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnCitlSGg0ZUNCNGVIaDRJQT09CisiIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKGJhc2U2NG1pbWUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2dccgorZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZ1xyCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnXHIKK2VIaDRlQ0I0ZUhoNElBPT1ccgorIiIiKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGhlID0gYmFzZTY0bWltZS5oZWFkZXJfZW5jb2RlCisgICAgICAgIGVxKGhlKCdoZWxsbycpLCAnPT9pc28tODg1OS0xP2I/YUdWc2JHOD0/PScpCisgICAgICAgIGVxKGhlKCdoZWxsb1xud29ybGQnKSwgJz0/aXNvLTg4NTktMT9iP2FHVnNiRzhOQ25kdmNteGs/PScpCisgICAgICAgICMgVGVzdCB0aGUgY2hhcnNldCBvcHRpb24KKyAgICAgICAgZXEoaGUoJ2hlbGxvJywgY2hhcnNldD0naXNvLTg4NTktMicpLCAnPT9pc28tODg1OS0yP2I/YUdWc2JHOD0/PScpCisgICAgICAgICMgVGVzdCB0aGUga2VlcF9lb2xzIGZsYWcKKyAgICAgICAgZXEoaGUoJ2hlbGxvXG53b3JsZCcsIGtlZXBfZW9scz1UcnVlKSwKKyAgICAgICAgICAgJz0/aXNvLTg4NTktMT9iP2FHVnNiRzhLZDI5eWJHUT0/PScpCisgICAgICAgICMgVGVzdCB0aGUgbWF4bGluZWxlbiBhcmd1bWVudAorICAgICAgICBlcShoZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDApLCAiIiJcCis9P2lzby04ODU5LTE/Yj9lSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIZz0/PQorID0/aXNvLTg4NTktMT9iP2VIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnPT89CisgPT9pc28tODg1OS0xP2I/SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGc9Pz0KKyA9P2lzby04ODU5LTE/Yj9lSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIZz0/PQorID0/aXNvLTg4NTktMT9iP2VDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNBPT89CisgPT9pc28tODg1OS0xP2I/ZUhoNGVDQjRlSGg0SUhoNGVIZ2c/PSIiIikKKyAgICAgICAgIyBUZXN0IHRoZSBlb2wgYXJndW1lbnQKKyAgICAgICAgZXEoaGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwLCBlb2w9J1xyXG4nKSwgIiIiXAorPT9pc28tODg1OS0xP2I/ZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGc9Pz1ccgorID0/aXNvLTg4NTktMT9iP2VIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnPT89XHIKKyA9P2lzby04ODU5LTE/Yj9JSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGc9Pz1ccgorID0/aXNvLTg4NTktMT9iP2VDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNBPT89XHIKKyA9P2lzby04ODU5LTE/Yj9lSGg0ZUNCNGVIaDRJSGg0ZUhnZz89IiIiKQorCisKKworY2xhc3MgVGVzdFF1b3ByaSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmhsaXQgPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnYScpLCBvcmQoJ3onKSsxKV0gKyBcCisgICAgICAgICAgICAgICAgICAgIFtjaHIoeCkgZm9yIHggaW4gcmFuZ2Uob3JkKCdBJyksIG9yZCgnWicpKzEpXSArIFwKKyAgICAgICAgICAgICAgICAgICAgW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJzAnKSwgb3JkKCc5JykrMSldICsgXAorICAgICAgICAgICAgICAgICAgICBbJyEnLCAnKicsICcrJywgJy0nLCAnLycsICcgJ10KKyAgICAgICAgc2VsZi5obm9uID0gW2Nocih4KSBmb3IgeCBpbiByYW5nZSgyNTYpIGlmIGNocih4KSBub3QgaW4gc2VsZi5obGl0XQorICAgICAgICBhc3NlcnQgbGVuKHNlbGYuaGxpdCkgKyBsZW4oc2VsZi5obm9uKSA9PSAyNTYKKyAgICAgICAgc2VsZi5ibGl0ID0gW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJyAnKSwgb3JkKCd+JykrMSldICsgWydcdCddCisgICAgICAgIHNlbGYuYmxpdC5yZW1vdmUoJz0nKQorICAgICAgICBzZWxmLmJub24gPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKDI1NikgaWYgY2hyKHgpIG5vdCBpbiBzZWxmLmJsaXRdCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5ibGl0KSArIGxlbihzZWxmLmJub24pID09IDI1NgorCisgICAgZGVmIHRlc3RfaGVhZGVyX3F1b3ByaV9jaGVjayhzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obGl0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfY2hlY2soYykpCisgICAgICAgIGZvciBjIGluIHNlbGYuaG5vbjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfY2hlY2soYykpCisKKyAgICBkZWYgdGVzdF9ib2R5X3F1b3ByaV9jaGVjayhzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5ibGl0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxdW9wcmltaW1lLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmJub246CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocXVvcHJpbWltZS5ib2R5X3F1b3ByaV9jaGVjayhjKSkKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9xdW9wcmlfbGVuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaHFsID0gcXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2xlbgorICAgICAgICBlbmMgPSBxdW9wcmltaW1lLmhlYWRlcl9lbmNvZGUKKyAgICAgICAgZm9yIHMgaW4gKCdoZWxsbycsICdoQGVAbEBsQG9AJyk6CisgICAgICAgICAgICAjIEVtcHR5IGNoYXJzZXQgYW5kIG5vIGxpbmUtZW5kaW5ncy4gIDcgPT0gUkZDIGNocm9tZQorICAgICAgICAgICAgZXEoaHFsKHMpLCBsZW4oZW5jKHMsIGNoYXJzZXQ9JycsIGVvbD0nJykpLTcpCisgICAgICAgIGZvciBjIGluIHNlbGYuaGxpdDoKKyAgICAgICAgICAgIGVxKGhxbChjKSwgMSkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obm9uOgorICAgICAgICAgICAgZXEoaHFsKGMpLCAzKQorCisgICAgZGVmIHRlc3RfYm9keV9xdW9wcmlfbGVuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgYnFsID0gcXVvcHJpbWltZS5ib2R5X3F1b3ByaV9sZW4KKyAgICAgICAgZm9yIGMgaW4gc2VsZi5ibGl0OgorICAgICAgICAgICAgZXEoYnFsKGMpLCAxKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmJub246CisgICAgICAgICAgICBlcShicWwoYyksIDMpCisKKyAgICBkZWYgdGVzdF9xdW90ZV91bnF1b3RlX2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIGZvciB4IGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBjID0gY2hyKHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1b3ByaW1pbWUudW5xdW90ZShxdW9wcmltaW1lLnF1b3RlKGMpKSwgYykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoZSA9IHF1b3ByaW1pbWUuaGVhZGVyX2VuY29kZQorICAgICAgICBlcShoZSgnaGVsbG8nKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPz0nKQorICAgICAgICBlcShoZSgnaGVsbG9cbndvcmxkJyksICc9P2lzby04ODU5LTE/cT9oZWxsbz0wRD0wQXdvcmxkPz0nKQorICAgICAgICAjIFRlc3QgdGhlIGNoYXJzZXQgb3B0aW9uCisgICAgICAgIGVxKGhlKCdoZWxsbycsIGNoYXJzZXQ9J2lzby04ODU5LTInKSwgJz0/aXNvLTg4NTktMj9xP2hlbGxvPz0nKQorICAgICAgICAjIFRlc3QgdGhlIGtlZXBfZW9scyBmbGFnCisgICAgICAgIGVxKGhlKCdoZWxsb1xud29ybGQnLCBrZWVwX2VvbHM9VHJ1ZSksICc9P2lzby04ODU5LTE/cT9oZWxsbz0wQXdvcmxkPz0nKQorICAgICAgICAjIFRlc3QgYSBub24tQVNDSUkgY2hhcmFjdGVyCisgICAgICAgIGVxKGhlKCdoZWxsb1x4Yzd0aGVyZScpLCAnPT9pc28tODg1OS0xP3E/aGVsbG89Qzd0aGVyZT89JykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCksICIiIlwKKz0/aXNvLTg4NTktMT9xP3h4eHhfeHh4eF94eHh4X3h4eHhfeHg/PQorID0/aXNvLTg4NTktMT9xP3h4X3h4eHhfeHh4eF94eHh4X3h4eHg/PQorID0/aXNvLTg4NTktMT9xP194eHh4X3h4eHhfeHh4eF94eHh4X3g/PQorID0/aXNvLTg4NTktMT9xP3h4eF94eHh4X3h4eHhfeHh4eF94eHg/PQorID0/aXNvLTg4NTktMT9xP3hfeHh4eF94eHh4Xz89IiIiKQorICAgICAgICAjIFRlc3QgdGhlIGVvbCBhcmd1bWVudAorICAgICAgICBlcShoZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDAsIGVvbD0nXHJcbicpLCAiIiJcCis9P2lzby04ODU5LTE/cT94eHh4X3h4eHhfeHh4eF94eHh4X3h4Pz1ccgorID0/aXNvLTg4NTktMT9xP3h4X3h4eHhfeHh4eF94eHh4X3h4eHg/PVxyCisgPT9pc28tODg1OS0xP3E/X3h4eHhfeHh4eF94eHh4X3h4eHhfeD89XHIKKyA9P2lzby04ODU5LTE/cT94eHhfeHh4eF94eHh4X3h4eHhfeHh4Pz1ccgorID0/aXNvLTg4NTktMT9xP3hfeHh4eF94eHh4Xz89IiIiKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEocXVvcHJpbWltZS5kZWNvZGUoJycpLCAnJykKKyAgICAgICAgZXEocXVvcHJpbWltZS5kZWNvZGUoJ2hlbGxvJyksICdoZWxsbycpCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZGVjb2RlKCdoZWxsbycsICdYJyksICdoZWxsbycpCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZGVjb2RlKCdoZWxsb1xud29ybGQnLCAnWCcpLCAnaGVsbG9Yd29ybGQnKQorCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoJycpLCAnJykKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoJ2hlbGxvJyksICdoZWxsbycpCisgICAgICAgICMgVGVzdCB0aGUgYmluYXJ5IGZsYWcKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoJ2hlbGxvXHJcbndvcmxkJyksICdoZWxsb1xud29ybGQnKQorICAgICAgICBlcShxdW9wcmltaW1lLmVuY29kZSgnaGVsbG9cclxud29ybGQnLCAwKSwgJ2hlbGxvXG53b3JsZCcpCisgICAgICAgICMgVGVzdCB0aGUgbWF4bGluZWxlbiBhcmcKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwKSwgIiIiXAoreHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4PQorIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4PQoreCB4eHh4IHh4eHggeHh4eCB4eHh4PTIwIiIiKQorICAgICAgICAjIFRlc3QgdGhlIGVvbCBhcmd1bWVudAorICAgICAgICBlcShxdW9wcmltaW1lLmVuY29kZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDAsIGVvbD0nXHJcbicpLCAiIiJcCit4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHg9XHIKKyB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eD1ccgoreCB4eHh4IHh4eHggeHh4eCB4eHh4PTIwIiIiKQorICAgICAgICBlcShxdW9wcmltaW1lLmVuY29kZSgiIiJcCitvbmUgbGluZQorCit0d28gbGluZSIiIiksICIiIlwKK29uZSBsaW5lCisKK3R3byBsaW5lIiIiKQorCisKKworIyBUZXN0IHRoZSBDaGFyc2V0IGNsYXNzCitjbGFzcyBUZXN0Q2hhcnNldCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmcm9tIGVtYWlsIGltcG9ydCBjaGFyc2V0IGFzIENoYXJzZXRNb2R1bGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIENoYXJzZXRNb2R1bGUuQ0hBUlNFVFNbJ2Zha2UnXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBNYWtlIHN1cmUgdXMtYXNjaWkgPSBubyBVbmljb2RlIGNvbnZlcnNpb24KKyAgICAgICAgYyA9IENoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgcyA9ICdIZWxsbyBXb3JsZCEnCisgICAgICAgIHNwID0gYy50b19zcGxpdHRhYmxlKHMpCisgICAgICAgIGVxKHMsIGMuZnJvbV9zcGxpdHRhYmxlKHNwKSkKKyAgICAgICAgIyB0ZXN0IDgtYml0IGlkZW1wb3RlbmN5IHdpdGggdXMtYXNjaWkKKyAgICAgICAgcyA9ICdceGE0XHhhMlx4YTRceGE0XHhhNFx4YTZceGE0XHhhOFx4YTRceGFhJworICAgICAgICBzcCA9IGMudG9fc3BsaXR0YWJsZShzKQorICAgICAgICBlcShzLCBjLmZyb21fc3BsaXR0YWJsZShzcCkpCisKKyAgICBkZWYgdGVzdF9ib2R5X2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgVHJ5IGEgY2hhcnNldCB3aXRoIFFQIGJvZHkgZW5jb2RpbmcKKyAgICAgICAgYyA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBlcSgnaGVsbG8gdz1GNnJsZCcsIGMuYm9keV9lbmNvZGUoJ2hlbGxvIHdceGY2cmxkJykpCisgICAgICAgICMgVHJ5IGEgY2hhcnNldCB3aXRoIEJhc2U2NCBib2R5IGVuY29kaW5nCisgICAgICAgIGMgPSBDaGFyc2V0KCd1dGYtOCcpCisgICAgICAgIGVxKCdhR1ZzYkc4Z2QyOXliR1E9XG4nLCBjLmJvZHlfZW5jb2RlKCdoZWxsbyB3b3JsZCcpKQorICAgICAgICAjIFRyeSBhIGNoYXJzZXQgd2l0aCBOb25lIGJvZHkgZW5jb2RpbmcKKyAgICAgICAgYyA9IENoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgZXEoJ2hlbGxvIHdvcmxkJywgYy5ib2R5X2VuY29kZSgnaGVsbG8gd29ybGQnKSkKKyAgICAgICAgIyBUcnkgdGhlIGNvbnZlcnQgYXJndW1lbnQsIHdoZXJlIGlucHV0IGNvZGVjICE9IG91dHB1dCBjb2RlYworICAgICAgICBjID0gQ2hhcnNldCgnZXVjLWpwJykKKyAgICAgICAgIyBXaXRoIGFwb2xvZ2llcyB0byBUb2tpbyBLaWt1Y2hpIDspCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVxKCdceDFiJEI1RkNPO35JV1x4MWIoQicsCisgICAgICAgICAgICAgICBjLmJvZHlfZW5jb2RlKCdceGI1XHhjNlx4YzNceGNmXHhiYlx4ZmVceGM5XHhkNycpKQorICAgICAgICAgICAgZXEoJ1x4YjVceGM2XHhjM1x4Y2ZceGJiXHhmZVx4YzlceGQ3JywKKyAgICAgICAgICAgICAgIGMuYm9keV9lbmNvZGUoJ1x4YjVceGM2XHhjM1x4Y2ZceGJiXHhmZVx4YzlceGQ3JywgRmFsc2UpKQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICAjIFdlIHByb2JhYmx5IGRvbid0IGhhdmUgdGhlIEphcGFuZXNlIGNvZGVjcyBpbnN0YWxsZWQKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBUZXN0aW5nIFNGIGJ1ZyAjNjI1NTA5LCB3aGljaCB3ZSBoYXZlIHRvIGZha2UsIHNpbmNlIHRoZXJlIGFyZSBubworICAgICAgICAjIGJ1aWx0LWluIGVuY29kaW5ncyB3aGVyZSB0aGUgaGVhZGVyIGVuY29kaW5nIGlzIFFQIGJ1dCB0aGUgYm9keQorICAgICAgICAjIGVuY29kaW5nIGlzIG5vdC4KKyAgICAgICAgZnJvbSBlbWFpbCBpbXBvcnQgY2hhcnNldCBhcyBDaGFyc2V0TW9kdWxlCisgICAgICAgIENoYXJzZXRNb2R1bGUuYWRkX2NoYXJzZXQoJ2Zha2UnLCBDaGFyc2V0TW9kdWxlLlFQLCBOb25lKQorICAgICAgICBjID0gQ2hhcnNldCgnZmFrZScpCisgICAgICAgIGVxKCdoZWxsbyB3XHhmNnJsZCcsIGMuYm9keV9lbmNvZGUoJ2hlbGxvIHdceGY2cmxkJykpCisKKyAgICBkZWYgdGVzdF91bmljb2RlX2NoYXJzZXRfbmFtZShzZWxmKToKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQodSd1cy1hc2NpaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNoYXJzZXQpLCAndXMtYXNjaWknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhlcnJvcnMuQ2hhcnNldEVycm9yLCBDaGFyc2V0LCAnYXNjXHhmZmlpJykKKworCisKKyMgVGVzdCBtdWx0aWxpbmd1YWwgTUlNRSBoZWFkZXJzLgorY2xhc3MgVGVzdEhlYWRlcihUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ0hlbGxvIFdvcmxkIScpCisgICAgICAgIGVxKGguZW5jb2RlKCksICdIZWxsbyBXb3JsZCEnKQorICAgICAgICBoLmFwcGVuZCgnIEdvb2RieWUgV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkISAgR29vZGJ5ZSBXb3JsZCEnKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX3N1cnByaXNlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCdIZWxsbyBXb3JsZCEnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnSGVsbG8gV29ybGQhJykKKyAgICAgICAgaC5hcHBlbmQoJ0dvb2RieWUgV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkISBHb29kYnllIFdvcmxkIScpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfbmVlZHNfbm9fZGVjb2Rpbmcoc2VsZik6CisgICAgICAgIGggPSAnbm8gZGVjb2RpbmcgbmVlZGVkJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZV9oZWFkZXIoaCksIFsoaCwgTm9uZSldKQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgaCA9IEhlYWRlcigiSSBhbSB0aGUgdmVyeSBtb2RlbCBvZiBhIG1vZGVybiBNYWpvci1HZW5lcmFsOyBJJ3ZlIGluZm9ybWF0aW9uIHZlZ2V0YWJsZSwgYW5pbWFsLCBhbmQgbWluZXJhbDsgSSBrbm93IHRoZSBraW5ncyBvZiBFbmdsYW5kLCBhbmQgSSBxdW90ZSB0aGUgZmlnaHRzIGhpc3RvcmljYWwgZnJvbSBNYXJhdGhvbiB0byBXYXRlcmxvbywgaW4gb3JkZXIgY2F0ZWdvcmljYWw7IEknbSB2ZXJ5IHdlbGwgYWNxdWFpbnRlZCwgdG9vLCB3aXRoIG1hdHRlcnMgbWF0aGVtYXRpY2FsOyBJIHVuZGVyc3RhbmQgZXF1YXRpb25zLCBib3RoIHRoZSBzaW1wbGUgYW5kIHF1YWRyYXRpY2FsOyBhYm91dCBiaW5vbWlhbCB0aGVvcmVtIEknbSB0ZWVtaW5nIHdpdGggYSBsb3QgbycgbmV3cywgd2l0aCBtYW55IGNoZWVyZnVsIGZhY3RzIGFib3V0IHRoZSBzcXVhcmUgb2YgdGhlIGh5cG90ZW51c2UuIiwKKyAgICAgICAgICAgICAgICAgICBtYXhsaW5lbGVuPTc2KQorICAgICAgICBmb3IgbCBpbiBoLmVuY29kZShzcGxpdGNoYXJzPScgJykuc3BsaXQoJ1xuICcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihsKSA8PSA3NikKKworICAgIGRlZiB0ZXN0X211bHRpbGluZ3VhbChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgZyA9IENoYXJzZXQoImlzby04ODU5LTEiKQorICAgICAgICBjeiA9IENoYXJzZXQoImlzby04ODU5LTIiKQorICAgICAgICB1dGY4ID0gQ2hhcnNldCgidXRmLTgiKQorICAgICAgICBnX2hlYWQgPSAiRGllIE1pZXRlciB0cmV0ZW4gaGllciBlaW4gd2VyZGVuIG1pdCBlaW5lbSBGb2VyZGVyYmFuZCBrb21mb3J0YWJlbCBkZW4gS29ycmlkb3IgZW50bGFuZywgYW4gc1x4ZmNkbFx4ZmNuZGlzY2hlbiBXYW5kZ2VtXHhlNGxkZW4gdm9yYmVpLCBnZWdlbiBkaWUgcm90aWVyZW5kZW4gS2xpbmdlbiBiZWZceGY2cmRlcnQuICIKKyAgICAgICAgY3pfaGVhZCA9ICJGaW5hblx4ZThuaSBtZXRyb3BvbGUgc2UgaHJvdXRpbHkgcG9kIHRsYWtlbSBqZWppY2ggZFx4Zjl2dGlwdS4uICIKKyAgICAgICAgdXRmOF9oZWFkID0gdSJcdTZiNjNcdTc4YmFcdTMwNmJcdThhMDBcdTMwNDZcdTMwNjhcdTdmZmJcdThhMzNcdTMwNmZcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTRlMDBcdTkwZThcdTMwNmZcdTMwYzlcdTMwYTRcdTMwYzRcdThhOWVcdTMwNjdcdTMwNTlcdTMwNGNcdTMwMDFcdTMwNDJcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNWZcdTMwODlcdTMwODFcdTMwNjdcdTMwNTlcdTMwMDJcdTViOWZcdTk2OWJcdTMwNmJcdTMwNmZcdTMwMGNXZW5uIGlzdCBkYXMgTnVuc3R1Y2sgZ2l0IHVuZCBTbG90ZXJtZXllcj8gSmEhIEJlaWhlcmh1bmQgZGFzIE9kZXIgZGllIEZsaXBwZXJ3YWxkdCBnZXJzcHV0Llx1MzAwZFx1MzA2OFx1OGEwMFx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiIuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgIGggPSBIZWFkZXIoZ19oZWFkLCBnKQorICAgICAgICBoLmFwcGVuZChjel9oZWFkLCBjeikKKyAgICAgICAgaC5hcHBlbmQodXRmOF9oZWFkLCB1dGY4KQorICAgICAgICBlbmMgPSBoLmVuY29kZSgpCisgICAgICAgIGVxKGVuYywgIiIiXAorPT9pc28tODg1OS0xP3E/RGllX01pZXRlcl90cmV0ZW5faGllcl9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZGVyYmFuZF9rbz89CisgPT9pc28tODg1OS0xP3E/bWZvcnRhYmVsX2Rlbl9Lb3JyaWRvcl9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaXNjaGVuX1dhbj89CisgPT9pc28tODg1OS0xP3E/ZGdlbT1FNGxkZW5fdm9yYmVpPTJDX2dlZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZ2VuX2JlZj1GNj89CisgPT9pc28tODg1OS0xP3E/cmRlcnQ9MkVfPz0gPT9pc28tODg1OS0yP3E/RmluYW49RThuaV9tZXRyb3BvbGVfc2VfaHJvdXRpbHk/PQorID0/aXNvLTg4NTktMj9xP19wb2RfdGxha2VtX2plamljaF9kPUY5dnRpcHU9MkU9MkVfPz0gPT91dGYtOD9iPzVxMmo1Nks2Pz0KKyA9P3V0Zi04P2I/NDRHcjZLaUE0NEdHNDRHbzU3Kzc2S2l6NDRHdjQ0R1Y0NEtNNDRHbTQ0R0U0NEcrNDRHYjQ0S1Q0NENDPz0KKyA9P3V0Zi04P2I/NUxpQTZZT280NEd2NDRPSjQ0S2s0NE9FNktxZTQ0R240NEdaNDRHTTQ0Q0I0NEdDNDRHbzQ0R3Y0NEduPz0KKyA9P3V0Zi04P2I/NDRHZjQ0S0o0NEtCNDRHbjQ0R1o0NENDNWE2ZjZacWI0NEdyNDRHdjQ0Q01WMlZ1YmlCcGMzUWdaR0Z6Pz0KKyA9P3V0Zi04P3E/X051bnN0dWNrX2dpdF91bmRfU2xvdGVybWV5ZXI9M0ZfSmEhX0JlaWhlcmh1bmRfZGFzX09kZXJfZGllX0ZsPz0KKyA9P3V0Zi04P2I/YVhCd1pYSjNZV3hrZENCblpYSnpjSFYwTHVPQWplT0JxT2lvZ09PQm8rT0JwdU9CaE9PQnZ1T0JtUT09Pz0KKyA9P3V0Zi04P2I/NDRDQz89IiIiKQorICAgICAgICBlcShkZWNvZGVfaGVhZGVyKGVuYyksCisgICAgICAgICAgIFsoZ19oZWFkLCAiaXNvLTg4NTktMSIpLCAoY3pfaGVhZCwgImlzby04ODU5LTIiKSwKKyAgICAgICAgICAgICh1dGY4X2hlYWQsICJ1dGYtOCIpXSkKKyAgICAgICAgdXN0ciA9IHVuaWNvZGUoaCkKKyAgICAgICAgZXEodXN0ci5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICdEaWUgTWlldGVyIHRyZXRlbiBoaWVyIGVpbiB3ZXJkZW4gbWl0IGVpbmVtIEZvZXJkZXJiYW5kICcKKyAgICAgICAgICAgJ2tvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhjM1x4YmNkbFx4YzNceGJjbmRpc2NoZW4gJworICAgICAgICAgICAnV2FuZGdlbVx4YzNceGE0bGRlbiB2b3JiZWksIGdlZ2VuIGRpZSByb3RpZXJlbmRlbiBLbGluZ2VuICcKKyAgICAgICAgICAgJ2JlZlx4YzNceGI2cmRlcnQuIEZpbmFuXHhjNFx4OGRuaSBtZXRyb3BvbGUgc2UgaHJvdXRpbHkgcG9kICcKKyAgICAgICAgICAgJ3RsYWtlbSBqZWppY2ggZFx4YzVceGFmdnRpcHUuLiBceGU2XHhhZFx4YTNceGU3XHhhMlx4YmFceGUzXHg4MScKKyAgICAgICAgICAgJ1x4YWJceGU4XHhhOFx4ODBceGUzXHg4MVx4ODZceGUzXHg4MVx4YThceGU3XHhiZlx4YmJceGU4XHhhOFx4YjMnCisgICAgICAgICAgICdceGUzXHg4MVx4YWZceGUzXHg4MVx4OTVceGUzXHg4Mlx4OGNceGUzXHg4MVx4YTZceGUzXHg4MVx4ODRceGUzJworICAgICAgICAgICAnXHg4MVx4YmVceGUzXHg4MVx4OWJceGUzXHg4Mlx4OTNceGUzXHg4MFx4ODJceGU0XHhiOFx4ODBceGU5XHg4MycKKyAgICAgICAgICAgJ1x4YThceGUzXHg4MVx4YWZceGUzXHg4M1x4ODlceGUzXHg4Mlx4YTRceGUzXHg4M1x4ODRceGU4XHhhYVx4OWUnCisgICAgICAgICAgICdceGUzXHg4MVx4YTdceGUzXHg4MVx4OTlceGUzXHg4MVx4OGNceGUzXHg4MFx4ODFceGUzXHg4MVx4ODJceGUzJworICAgICAgICAgICAnXHg4MVx4YThceGUzXHg4MVx4YWZceGUzXHg4MVx4YTdceGUzXHg4MVx4OWZceGUzXHg4Mlx4ODlceGUzXHg4MicKKyAgICAgICAgICAgJ1x4ODFceGUzXHg4MVx4YTdceGUzXHg4MVx4OTlceGUzXHg4MFx4ODJceGU1XHhhZVx4OWZceGU5XHg5YVx4OWInCisgICAgICAgICAgICdceGUzXHg4MVx4YWJceGUzXHg4MVx4YWZceGUzXHg4MFx4OGNXZW5uIGlzdCBkYXMgTnVuc3R1Y2sgZ2l0ICcKKyAgICAgICAgICAgJ3VuZCBTbG90ZXJtZXllcj8gSmEhIEJlaWhlcmh1bmQgZGFzIE9kZXIgZGllIEZsaXBwZXJ3YWxkdCAnCisgICAgICAgICAgICdnZXJzcHV0Llx4ZTNceDgwXHg4ZFx4ZTNceDgxXHhhOFx4ZThceGE4XHg4MFx4ZTNceDgxXHhhM1x4ZTNceDgxJworICAgICAgICAgICAnXHhhNlx4ZTNceDgxXHg4NFx4ZTNceDgxXHhiZVx4ZTNceDgxXHg5OVx4ZTNceDgwXHg4MicpCisgICAgICAgICMgVGVzdCBtYWtlX2hlYWRlcigpCisgICAgICAgIG5ld2ggPSBtYWtlX2hlYWRlcihkZWNvZGVfaGVhZGVyKGVuYykpCisgICAgICAgIGVxKG5ld2gsIGVuYykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9jdG9yX2RlZmF1bHRfYXJncyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIGVxKGgsICcnKQorICAgICAgICBoLmFwcGVuZCgnZm9vJywgQ2hhcnNldCgnaXNvLTg4NTktMScpKQorICAgICAgICBlcShoLCAnPT9pc28tODg1OS0xP3E/Zm9vPz0nKQorCisgICAgZGVmIHRlc3RfZXhwbGljaXRfbWF4bGluZWxlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaHN0ciA9ICdBIHZlcnkgbG9uZyBsaW5lIHRoYXQgbXVzdCBnZXQgc3BsaXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYXQgdGhlIDc2dGggY2hhcmFjdGVyIGJvdW5kYXJ5IHRvIHRlc3QgdGhlIG5vbi1kZWZhdWx0IGJlaGF2aW9yJworICAgICAgICBoID0gSGVhZGVyKGhzdHIpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK0EgdmVyeSBsb25nIGxpbmUgdGhhdCBtdXN0IGdldCBzcGxpdCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhdCB0aGUgNzZ0aAorIGNoYXJhY3RlciBib3VuZGFyeSB0byB0ZXN0IHRoZSBub24tZGVmYXVsdCBiZWhhdmlvcicnJykKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBoZWFkZXJfbmFtZT0nU3ViamVjdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK0EgdmVyeSBsb25nIGxpbmUgdGhhdCBtdXN0IGdldCBzcGxpdCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhdCB0aGUKKyA3NnRoIGNoYXJhY3RlciBib3VuZGFyeSB0byB0ZXN0IHRoZSBub24tZGVmYXVsdCBiZWhhdmlvcicnJykKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBtYXhsaW5lbGVuPTEwMjQsIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgaHN0cikKKworICAgIGRlZiB0ZXN0X3VzX2FzY2lpX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnaGVsbG8nCisgICAgICAgIHggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKHgsIFsoJ2hlbGxvJywgTm9uZSldKQorICAgICAgICBoID0gbWFrZV9oZWFkZXIoeCkKKyAgICAgICAgZXEocywgaC5lbmNvZGUoKSkKKworICAgIGRlZiB0ZXN0X3N0cmluZ19jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIGguYXBwZW5kKCdoZWxsbycsICdpc28tODg1OS0xJykKKyAgICAgICAgZXEoaCwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPz0nKQorCisjIyAgICBkZWYgdGVzdF91bmljb2RlX2Vycm9yKHNlbGYpOgorIyMgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgSGVhZGVyLCB1J1tQXHhmNnN0YWxdJywgJ3VzLWFzY2lpJykKKyMjICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBIZWFkZXIsICdbUFx4ZjZzdGFsXScsICd1cy1hc2NpaScpCisjIyAgICAgICAgaCA9IEhlYWRlcigpCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgaC5hcHBlbmQsIHUnW1BceGY2c3RhbF0nLCAndXMtYXNjaWknKQorIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIGguYXBwZW5kLCAnW1BceGY2c3RhbF0nLCAndXMtYXNjaWknKQorIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIEhlYWRlciwgdSdcdTgzY2FcdTU3MzBcdTY2NDJcdTU5MmInLCAnaXNvLTg4NTktMScpCisKKyAgICBkZWYgdGVzdF91dGY4X3Nob3J0ZXN0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcih1J3BceGY2c3RhbCcsICd1dGYtOCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICc9P3V0Zi04P3E/cD1DMz1CNnN0YWw/PScpCisgICAgICAgIGggPSBIZWFkZXIodSdcdTgzY2FcdTU3MzBcdTY2NDJcdTU5MmInLCAndXRmLTgnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnPT91dGYtOD9iPzZJK0s1Wnl3NXBtQzVhU3I/PScpCisKKyAgICBkZWYgdGVzdF9iYWRfOGJpdF9oZWFkZXIoc2VsZik6CisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB4ID0gJ1lud3A0ZFVFYmF5IEF1Y3Rpb24gU2VtaWFyLSBObyBDaGFyZ2UgXHg5NiBFYXJuIEJpZycKKyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgSGVhZGVyLCB4KQorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgaC5hcHBlbmQsIHgpCisgICAgICAgIGVxKHN0cihIZWFkZXIoeCwgZXJyb3JzPSdyZXBsYWNlJykpLCB4KQorICAgICAgICBoLmFwcGVuZCh4LCBlcnJvcnM9J3JlcGxhY2UnKQorICAgICAgICBlcShzdHIoaCksIHgpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVkX2FkamFjZW50X25vbmVuY29kZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgaC5hcHBlbmQoJ2hlbGxvJywgJ2lzby04ODU5LTEnKQorICAgICAgICBoLmFwcGVuZCgnd29ybGQnKQorICAgICAgICBzID0gaC5lbmNvZGUoKQorICAgICAgICBlcShzLCAnPT9pc28tODg1OS0xP3E/aGVsbG8/PSB3b3JsZCcpCisgICAgICAgIGggPSBtYWtlX2hlYWRlcihkZWNvZGVfaGVhZGVyKHMpKQorICAgICAgICBlcShoLmVuY29kZSgpLCBzKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9lYXRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnU3ViamVjdDogPT9rb2k4LXI/Yj84TkxQMThYU3k4RWd6c0VneHNuT3djell6dGs9Pz0gPT9rb2k4LXI/cT89Q0E/PSB6ei4nCisgICAgICAgIHBhcnRzID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBlcShwYXJ0cywgWygnU3ViamVjdDonLCBOb25lKSwgKCdceGYwXHhkMlx4Y2ZceGQ3XHhjNVx4ZDJceGNiXHhjMSBceGNlXHhjMSBceGM2XHhjOVx4Y2VceGMxXHhjY1x4ZDhceGNlXHhkOVx4Y2EnLCAna29pOC1yJyksICgnenouJywgTm9uZSldKQorICAgICAgICBoZHIgPSBtYWtlX2hlYWRlcihwYXJ0cykKKyAgICAgICAgZXEoaGRyLmVuY29kZSgpLAorICAgICAgICAgICAnU3ViamVjdDogPT9rb2k4LXI/Yj84TkxQMThYU3k4RWd6c0VneHNuT3djell6dG5LPz0genouJykKKworICAgIGRlZiB0ZXN0X2Jyb2tlbl9iYXNlNjRfaGVhZGVyKHNlbGYpOgorICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcworICAgICAgICBzID0gJ1N1YmplY3Q6ID0/RVVDLUtSP0I/Q1NpeHBMRHRLU0MvN0xpdXZzYXg0aUM2dUxtd01jaWpJS0hhSUx6U3dkL0gwU0M4K0xDandMc2d2N1cvK01qM0kgPz0nCisgICAgICAgIHJhaXNlcyhlcnJvcnMuSGVhZGVyUGFyc2VFcnJvciwgZGVjb2RlX2hlYWRlciwgcykKKworCisKKyMgVGVzdCBSRkMgMjIzMSBoZWFkZXIgcGFyYW1ldGVycyAoZW4vZGUpY29kaW5nCitjbGFzcyBUZXN0UkZDMjIzMShUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yOS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCd0aXRsZScpLAorICAgICAgICAgICAoJ3VzLWFzY2lpJywgJ2VuJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJykpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3RpdGxlJywgdW5xdW90ZT1GYWxzZSksCisgICAgICAgICAgICgndXMtYXNjaWknLCAnZW4nLCAnIlRoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhIicpKQorCisgICAgZGVmIHRlc3Rfc2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ3RpdGxlJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0PSd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3RpdGxlJyksCisgICAgICAgICAgICgndXMtYXNjaWknLCAnJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJykpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ3RpdGxlJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0PSd1cy1hc2NpaScsIGxhbmd1YWdlPSdlbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3RpdGxlJyksCisgICAgICAgICAgICgndXMtYXNjaWknLCAnZW4nLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnKSkKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgbXNnLnNldF9wYXJhbSgndGl0bGUnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ9J3VzLWFzY2lpJywgbGFuZ3VhZ2U9J2VuJykKKyAgICAgICAgc2VsZi5uZGlmZkFzc2VydEVxdWFsKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKKyBpZCAyN0NFQUQzOENDOyBGcmksICA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MDkwLjYxMzA0LjExMDkyOS40NTY4NEBhYWEuenp6Lm9yZz4KK0Zyb206IGJiYkBkZGQuY29tIChKb2huIFguIERvZSkKK1RvOiBiYmJAenp6Lm9yZworU3ViamVjdDogVGhpcyBpcyBhIHRlc3QgbWVzc2FnZQorRGF0ZTogRnJpLCA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWk7CisgdGl0bGUqPSJ1cy1hc2NpaSdlbidUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMGlzbiUyN3QlMjBpdCUyMSIKKworCitIaSwKKworRG8geW91IGxpa2UgdGhpcyBtZXNzYWdlPworCistTWUKKyIiIikKKworICAgIGRlZiB0ZXN0X2RlbF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnZm9vJywgJ2JhcicsIGNoYXJzZXQ9J3VzLWFzY2lpJywgbGFuZ3VhZ2U9J2VuJykKKyAgICAgICAgbXNnLnNldF9wYXJhbSgndGl0bGUnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnLAorICAgICAgICAgICAgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBtc2cuZGVsX3BhcmFtKCdmb28nLCBoZWFkZXI9J0NvbnRlbnQtVHlwZScpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKKyBpZCAyN0NFQUQzOENDOyBGcmksICA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MDkwLjYxMzA0LjExMDkyOS40NTY4NEBhYWEuenp6Lm9yZz4KK0Zyb206IGJiYkBkZGQuY29tIChKb2huIFguIERvZSkKK1RvOiBiYmJAenp6Lm9yZworU3ViamVjdDogVGhpcyBpcyBhIHRlc3QgbWVzc2FnZQorRGF0ZTogRnJpLCA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIjsKKyB0aXRsZSo9InVzLWFzY2lpJ2VuJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwaXNuJTI3dCUyMGl0JTIxIgorCisKK0hpLAorCitEbyB5b3UgbGlrZSB0aGlzIG1lc3NhZ2U/CisKKy1NZQorIiIiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9nZXRfY29udGVudF9jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzIudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwgJ3VzLWFzY2lpJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9ImZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNUF9uc21haWwuaHRtIgorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IE5BTUUqMD1maWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTTsgTkFNRSoxPVBfbnNtYWlsLmh0bQorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ05BTUUnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHBhcmFtLAorICAgICAgICAgICAgJ2ZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNUF9uc21haWwuaHRtJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9maWxlbmFtZShzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9maWxlbmFtZV9lbmNvZGVkKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9wYXJ0bHlfZW5jb2RlZChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMD0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9wYXJ0bHlfbm9uZW5jb2RlZChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMD0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXRfaW5fYm91bmRhcnkoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsKK1x0Ym91bmRhcnkqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRib3VuZGFyeSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Ym91bmRhcnkqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2JvdW5kYXJ5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9jaGFyc2V0KHNlbGYpOgorICAgICAgICAjIFRoaXMgaXMgYSBub25zZW5zaWNhbCBjaGFyc2V0IHZhbHVlLCBidXQgdGVzdHMgdGhlIGNvZGUgYW55d2F5CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47CitcdGNoYXJzZXQqMCo9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0Y2hhcnNldCoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Y2hhcnNldCoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2VuY29kaW5nX2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iYm9ndXMneHgnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2VuY29kaW5nX2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQqPWJvZ3VzJyd1dGYtOCVFMiU4MCU5RAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICAjIFRoaXMgc2hvdWxkIHJldHVybiBOb25lIGJlY2F1c2Ugbm9uLWFzY2lpIGNoYXJhY3RlcnMgaW4gdGhlIGNoYXJzZXQKKyAgICAgICAgIyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2NoYXJhY3Rlcl9pbl9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0Kj1hc2NpaScndXRmLTglRTIlODAlOUQKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgIyBUaGlzIHNob3VsZCByZXR1cm4gTm9uZSBiZWNhdXNlIG5vbi1hc2NpaSBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyc2V0CisgICAgICAgICMgYXJlIG5vdCBhbGxvd2VkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2JhZF9jaGFyYWN0ZXJfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSJhc2NpaSd4eCdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyKj0iaXMgaXQgbm90LnBkZiVFMiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZlx1ZmZmZCcpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3Vua25vd25fZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lKj1YLVVOS05PV04nJ215ZmlsZS50eHQKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksICdteWZpbGUudHh0JykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfc2luZ2xlX3RpY2tfaW5fZmlsZW5hbWVfZXh0ZW5kZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowKj1cIkZyYW5rJ3NcIjsgbmFtZSoxKj1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsIE5vbmUpCisgICAgICAgIGVxKGxhbmd1YWdlLCBOb25lKQorICAgICAgICBlcShzLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3NpbmdsZV90aWNrX2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsgbmFtZSowPVwiRnJhbmsnc1wiOyBuYW1lKjE9XCIgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV90aWNrX2F0dGFja19leHRlbmRlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwidXMtYXNjaWknZW4tdXMnRnJhbmsnc1wiOyBuYW1lKjEqPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdGlja19hdHRhY2soc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjA9XCJ1cy1hc2NpaSdlbi11cydGcmFuaydzXCI7IG5hbWUqMT1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLCAidXMtYXNjaWknZW4tdXMnRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2V4dGVuZGVkX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOyBuYW1lPVwiRnJhbmsncyBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ25hbWUnKSwgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9lbmNvZGVkX3RoZW5fdW5lbmNvZGVkX3NlZ21lbnRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMCo9XCJ1cy1hc2NpaSdlbi11cydNeVwiOworXHRuYW1lKjE9XCIgRG9jdW1lbnRcIjsKK1x0bmFtZSoyKj1cIiBGb3IgWW91XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICdNeSBEb2N1bWVudCBGb3IgWW91JykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdW5lbmNvZGVkX3RoZW5fZW5jb2RlZF9zZWdtZW50cyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjA9XCJ1cy1hc2NpaSdlbi11cydNeVwiOworXHRuYW1lKjEqPVwiIERvY3VtZW50XCI7CitcdG5hbWUqMio9XCIgRm9yIFlvdVwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKGxhbmd1YWdlLCAnZW4tdXMnKQorICAgICAgICBlcShzLCAnTXkgRG9jdW1lbnQgRm9yIFlvdScpCisKKworCitkZWYgX3Rlc3RjbGFzc2VzKCk6CisgICAgbW9kID0gc3lzLm1vZHVsZXNbX19uYW1lX19dCisgICAgcmV0dXJuIFtnZXRhdHRyKG1vZCwgbmFtZSkgZm9yIG5hbWUgaW4gZGlyKG1vZCkgaWYgbmFtZS5zdGFydHN3aXRoKCdUZXN0JyldCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGZvciB0ZXN0Y2xhc3MgaW4gX3Rlc3RjbGFzc2VzKCk6CisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKHRlc3RjbGFzcykpCisgICAgcmV0dXJuIHN1aXRlCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGZvciB0ZXN0Y2xhc3MgaW4gX3Rlc3RjbGFzc2VzKCk6CisgICAgICAgIHJ1bl91bml0dGVzdCh0ZXN0Y2xhc3MpCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyMmEwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2ZDRiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3RvcnR1cmUucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF90b3J0dXJlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZmE2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF90b3J0dXJlLnB5CkBAIC0wLDAgKzEsMTM2IEBACisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjCisjIEEgdG9ydHVyZSB0ZXN0IG9mIHRoZSBlbWFpbCBwYWNrYWdlLiAgVGhpcyBzaG91bGQgbm90IGJlIHJ1biBhcyBwYXJ0IG9mIHRoZQorIyBzdGFuZGFyZCBQeXRob24gdGVzdCBzdWl0ZSBzaW5jZSBpdCByZXF1aXJlcyBzZXZlcmFsIG1lZyBvZiBlbWFpbCBtZXNzYWdlcworIyBjb2xsZWN0ZWQgaW4gdGhlIHdpbGQuICBUaGVzZSBzb3VyY2UgbWVzc2FnZXMgYXJlIG5vdCBjaGVja2VkIGludG8gdGhlCisjIFB5dGhvbiBkaXN0cm8sIGJ1dCBhcmUgYXZhaWxhYmxlIGFzIHBhcnQgb2YgdGhlIHN0YW5kYWxvbmUgZW1haWwgcGFja2FnZSBhdAorIyBodHRwOi8vc2YubmV0L3Byb2plY3RzL21pbWVsaWIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSB0eXBlcyBpbXBvcnQgTGlzdFR5cGUKKworZnJvbSBlbWFpbC50ZXN0LnRlc3RfZW1haWwgaW1wb3J0IFRlc3RFbWFpbEJhc2UKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QKKworaW1wb3J0IGVtYWlsCitmcm9tIGVtYWlsIGltcG9ydCBfX2ZpbGVfXyBhcyB0ZXN0ZmlsZQorZnJvbSBlbWFpbC5pdGVyYXRvcnMgaW1wb3J0IF9zdHJ1Y3R1cmUKKworZGVmIG9wZW5maWxlKGZpbGVuYW1lKToKKyAgICBmcm9tIG9zLnBhdGggaW1wb3J0IGpvaW4sIGRpcm5hbWUsIGFic3BhdGgKKyAgICBwYXRoID0gYWJzcGF0aChqb2luKGRpcm5hbWUodGVzdGZpbGUpLCBvcy5wYXJkaXIsICdtb3JlZGF0YScsIGZpbGVuYW1lKSkKKyAgICByZXR1cm4gb3BlbihwYXRoLCAncicpCisKKyMgUHJldmVudCB0aGlzIHRlc3QgZnJvbSBydW5uaW5nIGluIHRoZSBQeXRob24gZGlzdHJvCit0cnk6CisgICAgb3BlbmZpbGUoJ2NyaXNwaW4tdG9ydHVyZS50eHQnKQorZXhjZXB0IElPRXJyb3I6CisgICAgcmFpc2UgVGVzdFNraXBwZWQKKworCisMCitjbGFzcyBUb3J0dXJlQmFzZShUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgX21zZ29iaihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZwID0gb3BlbmZpbGUoZmlsZW5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICByZXR1cm4gbXNnCisKKworDAorY2xhc3MgVGVzdENyaXNwaW5Ub3J0dXJlKFRvcnR1cmVCYXNlKToKKyAgICAjIE1hcmsgQ3Jpc3BpbidzIHRvcnR1cmUgdGVzdCBmcm9tIHRoZSBTcXVpcnJlbE1haWwgcHJvamVjdAorICAgIGRlZiB0ZXN0X21vbmRvX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdjcmlzcGluLXRvcnR1cmUudHh0JykKKyAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgICAgIGVxKHR5cGUocGF5bG9hZCksIExpc3RUeXBlKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEyKQorICAgICAgICBlcShtc2cucHJlYW1ibGUsIE5vbmUpCisgICAgICAgIGVxKG1zZy5lcGlsb2d1ZSwgJ1xuJykKKyAgICAgICAgIyBQcm9iYWJseSB0aGUgYmVzdCB3YXkgdG8gdmVyaWZ5IHRoZSBtZXNzYWdlIGlzIHBhcnNlZCBjb3JyZWN0bHkgaXMgdG8KKyAgICAgICAgIyBkdW1wIGl0cyBzdHJ1Y3R1cmUgYW5kIGNvbXBhcmUgaXQgYWdhaW5zdCB0aGUga25vd24gc3RydWN0dXJlLgorICAgICAgICBmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgX3N0cnVjdHVyZShtc2csIGZwPWZwKQorICAgICAgICBuZXEoZnAuZ2V0dmFsdWUoKSwgIiIiXAorbXVsdGlwYXJ0L21peGVkCisgICAgdGV4dC9wbGFpbgorICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgIG11bHRpcGFydC9hbHRlcm5hdGl2ZQorICAgICAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICAgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICAgICAgICAgdGV4dC9yaWNodGV4dAorICAgICAgICAgICAgYXBwbGljYXRpb24vYW5kcmV3LWluc2V0CisgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgYXVkaW8vYmFzaWMKKyAgICBhdWRpby9iYXNpYworICAgIGltYWdlL3BibQorICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICAgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICAgICAgICAgIGF1ZGlvL3gtc3VuCisgICAgICAgICAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgICAgICAgICBpbWFnZS9naWYKKyAgICAgICAgICAgICAgICBpbWFnZS9naWYKKyAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi94LWJlMgorICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uL2F0b21pY21haWwKKyAgICAgICAgICAgIGF1ZGlvL3gtc3VuCisgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgICAgICBpbWFnZS9wZ20KKyAgICAgICAgICAgIHRleHQvcGxhaW4KKyAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgICAgIGltYWdlL3BibQorICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgIGFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQKKyAgICBpbWFnZS9naWYKKyAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgICAgIGF1ZGlvL2Jhc2ljCisgICAgICAgICAgICBhdWRpby9iYXNpYworICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICAgICAgYXBwbGljYXRpb24vcG9zdHNjcmlwdAorICAgICAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICAgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgICAgICAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgICAgICAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICAgICAgICAgICAgICBtdWx0aXBhcnQvcGFyYWxsZWwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlL2dpZgorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8vYmFzaWMKKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24vYXRvbWljbWFpbAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8veC1zdW4KKyIiIikKKworDAorZGVmIF90ZXN0Y2xhc3NlcygpOgorICAgIG1vZCA9IHN5cy5tb2R1bGVzW19fbmFtZV9fXQorICAgIHJldHVybiBbZ2V0YXR0cihtb2QsIG5hbWUpIGZvciBuYW1lIGluIGRpcihtb2QpIGlmIG5hbWUuc3RhcnRzd2l0aCgnVGVzdCcpXQorCisKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBmb3IgdGVzdGNsYXNzIGluIF90ZXN0Y2xhc3NlcygpOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZSh0ZXN0Y2xhc3MpKQorICAgIHJldHVybiBzdWl0ZQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBmb3IgdGVzdGNsYXNzIGluIF90ZXN0Y2xhc3NlcygpOgorICAgICAgICBydW5fdW5pdHRlc3QodGVzdGNsYXNzKQorCisKKwwKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0nc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfdG9ydHVyZS5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF90b3J0dXJlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQ4OGZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfdG9ydHVyZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfdG9ydHVyZS5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF90b3J0dXJlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQ4OGZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfdG9ydHVyZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC91dGlscy5weSBiL2xpYi9weXRob24yLjcvZW1haWwvdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3NjAyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdXRpbHMucHkKQEAgLTAsMCArMSwzMjQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiTWlzY2VsbGFuZW91cyB1dGlsaXRpZXMuIiIiCisKK19fYWxsX18gPSBbCisgICAgJ2NvbGxhcHNlX3JmYzIyMzFfdmFsdWUnLAorICAgICdkZWNvZGVfcGFyYW1zJywKKyAgICAnZGVjb2RlX3JmYzIyMzEnLAorICAgICdlbmNvZGVfcmZjMjIzMScsCisgICAgJ2Zvcm1hdGFkZHInLAorICAgICdmb3JtYXRkYXRlJywKKyAgICAnZ2V0YWRkcmVzc2VzJywKKyAgICAnbWFrZV9tc2dpZCcsCisgICAgJ21rdGltZV90eicsCisgICAgJ3BhcnNlYWRkcicsCisgICAgJ3BhcnNlZGF0ZScsCisgICAgJ3BhcnNlZGF0ZV90eicsCisgICAgJ3VucXVvdGUnLAorICAgIF0KKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCB0aW1lCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgcmFuZG9tCitpbXBvcnQgc29ja2V0CitpbXBvcnQgdXJsbGliCitpbXBvcnQgd2FybmluZ3MKKworZnJvbSBlbWFpbC5fcGFyc2VhZGRyIGltcG9ydCBxdW90ZQorZnJvbSBlbWFpbC5fcGFyc2VhZGRyIGltcG9ydCBBZGRyZXNzTGlzdCBhcyBfQWRkcmVzc0xpc3QKK2Zyb20gZW1haWwuX3BhcnNlYWRkciBpbXBvcnQgbWt0aW1lX3R6CisKKyMgV2UgbmVlZCB3b3JtYXJvdW5kcyBmb3IgYnVncyBpbiB0aGVzZSBtZXRob2RzIGluIG9sZGVyIFB5dGhvbnMgKHNlZSBiZWxvdykKK2Zyb20gZW1haWwuX3BhcnNlYWRkciBpbXBvcnQgcGFyc2VkYXRlIGFzIF9wYXJzZWRhdGUKK2Zyb20gZW1haWwuX3BhcnNlYWRkciBpbXBvcnQgcGFyc2VkYXRlX3R6IGFzIF9wYXJzZWRhdGVfdHoKKworZnJvbSBxdW9wcmkgaW1wb3J0IGRlY29kZXN0cmluZyBhcyBfcWRlY29kZQorCisjIEludHJhcGFja2FnZSBpbXBvcnRzCitmcm9tIGVtYWlsLmVuY29kZXJzIGltcG9ydCBfYmVuY29kZSwgX3FlbmNvZGUKKworQ09NTUFTUEFDRSA9ICcsICcKK0VNUFRZU1RSSU5HID0gJycKK1VFTVBUWVNUUklORyA9IHUnJworQ1JMRiA9ICdcclxuJworVElDSyA9ICInIgorCitzcGVjaWFsc3JlID0gcmUuY29tcGlsZShyJ1tdW1xcKCk8PkAsOjsiLl0nKQorZXNjYXBlc3JlID0gcmUuY29tcGlsZShyJ1tdW1xcKCkiXScpCisKKworDAorIyBIZWxwZXJzCisKK2RlZiBfaWRlbnRpdHkocyk6CisgICAgcmV0dXJuIHMKKworCitkZWYgX2JkZWNvZGUocyk6CisgICAgIiIiRGVjb2RlcyBhIGJhc2U2NCBzdHJpbmcuCisKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYmFzZTY0LmRlY29kZXN0cmluZyBhbmQgaXQncyByZXRhaW5lZCBvbmx5CisgICAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIEl0IHVzZWQgdG8gcmVtb3ZlIHRoZSBsYXN0IFxcbiBvZiB0aGUgZGVjb2RlZAorICAgIHN0cmluZywgaWYgaXQgaGFkIGFueSAoc2VlIGlzc3VlIDcxNDMpLgorICAgICIiIgorICAgIGlmIG5vdCBzOgorICAgICAgICByZXR1cm4gcworICAgIHJldHVybiBiYXNlNjQuZGVjb2Rlc3RyaW5nKHMpCisKKworDAorZGVmIGZpeF9lb2xzKHMpOgorICAgICIiIlJlcGxhY2UgYWxsIGxpbmUtZW5kaW5nIGNoYXJhY3RlcnMgd2l0aCBcXHJcXG4uIiIiCisgICAgIyBGaXggbmV3bGluZXMgd2l0aCBubyBwcmVjZWRpbmcgY2FycmlhZ2UgcmV0dXJuCisgICAgcyA9IHJlLnN1YihyJyg/PCFccilcbicsIENSTEYsIHMpCisgICAgIyBGaXggY2FycmlhZ2UgcmV0dXJucyB3aXRoIG5vIGZvbGxvd2luZyBuZXdsaW5lCisgICAgcyA9IHJlLnN1YihyJ1xyKD8hXG4pJywgQ1JMRiwgcykKKyAgICByZXR1cm4gcworCisKKwwKK2RlZiBmb3JtYXRhZGRyKHBhaXIpOgorICAgICIiIlRoZSBpbnZlcnNlIG9mIHBhcnNlYWRkcigpLCB0aGlzIHRha2VzIGEgMi10dXBsZSBvZiB0aGUgZm9ybQorICAgIChyZWFsbmFtZSwgZW1haWxfYWRkcmVzcykgYW5kIHJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBzdWl0YWJsZQorICAgIGZvciBhbiBSRkMgMjgyMiBGcm9tLCBUbyBvciBDYyBoZWFkZXIuCisKKyAgICBJZiB0aGUgZmlyc3QgZWxlbWVudCBvZiBwYWlyIGlzIGZhbHNlLCB0aGVuIHRoZSBzZWNvbmQgZWxlbWVudCBpcworICAgIHJldHVybmVkIHVubW9kaWZpZWQuCisgICAgIiIiCisgICAgbmFtZSwgYWRkcmVzcyA9IHBhaXIKKyAgICBpZiBuYW1lOgorICAgICAgICBxdW90ZXMgPSAnJworICAgICAgICBpZiBzcGVjaWFsc3JlLnNlYXJjaChuYW1lKToKKyAgICAgICAgICAgIHF1b3RlcyA9ICciJworICAgICAgICBuYW1lID0gZXNjYXBlc3JlLnN1YihyJ1xcXGc8MD4nLCBuYW1lKQorICAgICAgICByZXR1cm4gJyVzJXMlcyA8JXM+JyAlIChxdW90ZXMsIG5hbWUsIHF1b3RlcywgYWRkcmVzcykKKyAgICByZXR1cm4gYWRkcmVzcworCisKKwwKK2RlZiBnZXRhZGRyZXNzZXMoZmllbGR2YWx1ZXMpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgKFJFQUxOQU1FLCBFTUFJTCkgZm9yIGVhY2ggZmllbGR2YWx1ZS4iIiIKKyAgICBhbGwgPSBDT01NQVNQQUNFLmpvaW4oZmllbGR2YWx1ZXMpCisgICAgYSA9IF9BZGRyZXNzTGlzdChhbGwpCisgICAgcmV0dXJuIGEuYWRkcmVzc2xpc3QKKworCisMCitlY3JlID0gcmUuY29tcGlsZShyJycnCisgID1cPyAgICAgICAgICAgICAgICAgICAjIGxpdGVyYWwgPT8KKyAgKD9QPGNoYXJzZXQ+W14/XSo/KSAgICMgbm9uLWdyZWVkeSB1cCB0byB0aGUgbmV4dCA/IGlzIHRoZSBjaGFyc2V0CisgIFw/ICAgICAgICAgICAgICAgICAgICAjIGxpdGVyYWwgPworICAoP1A8ZW5jb2Rpbmc+W3FiXSkgICAgIyBlaXRoZXIgYSAicSIgb3IgYSAiYiIsIGNhc2UgaW5zZW5zaXRpdmUKKyAgXD8gICAgICAgICAgICAgICAgICAgICMgbGl0ZXJhbCA/CisgICg/UDxhdG9tPi4qPykgICAgICAgICAjIG5vbi1ncmVlZHkgdXAgdG8gdGhlIG5leHQgPz0gaXMgdGhlIGF0b20KKyAgXD89ICAgICAgICAgICAgICAgICAgICMgbGl0ZXJhbCA/PQorICAnJycsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQorCisKKwwKK2RlZiBmb3JtYXRkYXRlKHRpbWV2YWw9Tm9uZSwgbG9jYWx0aW1lPUZhbHNlLCB1c2VnbXQ9RmFsc2UpOgorICAgICIiIlJldHVybnMgYSBkYXRlIHN0cmluZyBhcyBzcGVjaWZpZWQgYnkgUkZDIDI4MjIsIGUuZy46CisKKyAgICBGcmksIDA5IE5vdiAyMDAxIDAxOjA4OjQ3IC0wMDAwCisKKyAgICBPcHRpb25hbCB0aW1ldmFsIGlmIGdpdmVuIGlzIGEgZmxvYXRpbmcgcG9pbnQgdGltZSB2YWx1ZSBhcyBhY2NlcHRlZCBieQorICAgIGdtdGltZSgpIGFuZCBsb2NhbHRpbWUoKSwgb3RoZXJ3aXNlIHRoZSBjdXJyZW50IHRpbWUgaXMgdXNlZC4KKworICAgIE9wdGlvbmFsIGxvY2FsdGltZSBpcyBhIGZsYWcgdGhhdCB3aGVuIFRydWUsIGludGVycHJldHMgdGltZXZhbCwgYW5kCisgICAgcmV0dXJucyBhIGRhdGUgcmVsYXRpdmUgdG8gdGhlIGxvY2FsIHRpbWV6b25lIGluc3RlYWQgb2YgVVRDLCBwcm9wZXJseQorICAgIHRha2luZyBkYXlsaWdodCBzYXZpbmdzIHRpbWUgaW50byBhY2NvdW50LgorCisgICAgT3B0aW9uYWwgYXJndW1lbnQgdXNlZ210IG1lYW5zIHRoYXQgdGhlIHRpbWV6b25lIGlzIHdyaXR0ZW4gb3V0IGFzCisgICAgYW4gYXNjaWkgc3RyaW5nLCBub3QgbnVtZXJpYyBvbmUgKHNvICJHTVQiIGluc3RlYWQgb2YgIiswMDAwIikuIFRoaXMKKyAgICBpcyBuZWVkZWQgZm9yIEhUVFAsIGFuZCBpcyBvbmx5IHVzZWQgd2hlbiBsb2NhbHRpbWU9PUZhbHNlLgorICAgICIiIgorICAgICMgTm90ZTogd2UgY2Fubm90IHVzZSBzdHJmdGltZSgpIGJlY2F1c2UgdGhhdCBob25vcnMgdGhlIGxvY2FsZSBhbmQgUkZDCisgICAgIyAyODIyIHJlcXVpcmVzIHRoYXQgZGF5IGFuZCBtb250aCBuYW1lcyBiZSB0aGUgRW5nbGlzaCBhYmJyZXZpYXRpb25zLgorICAgIGlmIHRpbWV2YWwgaXMgTm9uZToKKyAgICAgICAgdGltZXZhbCA9IHRpbWUudGltZSgpCisgICAgaWYgbG9jYWx0aW1lOgorICAgICAgICBub3cgPSB0aW1lLmxvY2FsdGltZSh0aW1ldmFsKQorICAgICAgICAjIENhbGN1bGF0ZSB0aW1lem9uZSBvZmZzZXQsIGJhc2VkIG9uIHdoZXRoZXIgdGhlIGxvY2FsIHpvbmUgaGFzCisgICAgICAgICMgZGF5bGlnaHQgc2F2aW5ncyB0aW1lLCBhbmQgd2hldGhlciBEU1QgaXMgaW4gZWZmZWN0LgorICAgICAgICBpZiB0aW1lLmRheWxpZ2h0IGFuZCBub3dbLTFdOgorICAgICAgICAgICAgb2Zmc2V0ID0gdGltZS5hbHR6b25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvZmZzZXQgPSB0aW1lLnRpbWV6b25lCisgICAgICAgIGhvdXJzLCBtaW51dGVzID0gZGl2bW9kKGFicyhvZmZzZXQpLCAzNjAwKQorICAgICAgICAjIFJlbWVtYmVyIG9mZnNldCBpcyBpbiBzZWNvbmRzIHdlc3Qgb2YgVVRDLCBidXQgdGhlIHRpbWV6b25lIGlzIGluCisgICAgICAgICMgbWludXRlcyBlYXN0IG9mIFVUQywgc28gdGhlIHNpZ25zIGRpZmZlci4KKyAgICAgICAgaWYgb2Zmc2V0ID4gMDoKKyAgICAgICAgICAgIHNpZ24gPSAnLScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNpZ24gPSAnKycKKyAgICAgICAgem9uZSA9ICclcyUwMmQlMDJkJyAlIChzaWduLCBob3VycywgbWludXRlcyAvLyA2MCkKKyAgICBlbHNlOgorICAgICAgICBub3cgPSB0aW1lLmdtdGltZSh0aW1ldmFsKQorICAgICAgICAjIFRpbWV6b25lIG9mZnNldCBpcyBhbHdheXMgLTAwMDAKKyAgICAgICAgaWYgdXNlZ210OgorICAgICAgICAgICAgem9uZSA9ICdHTVQnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB6b25lID0gJy0wMDAwJworICAgIHJldHVybiAnJXMsICUwMmQgJXMgJTA0ZCAlMDJkOiUwMmQ6JTAyZCAlcycgJSAoCisgICAgICAgIFsnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnLCAnU3VuJ11bbm93WzZdXSwKKyAgICAgICAgbm93WzJdLAorICAgICAgICBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywKKyAgICAgICAgICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddW25vd1sxXSAtIDFdLAorICAgICAgICBub3dbMF0sIG5vd1szXSwgbm93WzRdLCBub3dbNV0sCisgICAgICAgIHpvbmUpCisKKworDAorZGVmIG1ha2VfbXNnaWQoaWRzdHJpbmc9Tm9uZSk6CisgICAgIiIiUmV0dXJucyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgUkZDIDI4MjIgY29tcGxpYW50IE1lc3NhZ2UtSUQsIGUuZzoKKworICAgIDwyMDAyMDIwMTE5NTYyNy4zMzUzOS45NjY3MUBuaWdodHNoYWRlLmxhLm1hc3RhbGVyLmNvbT4KKworICAgIE9wdGlvbmFsIGlkc3RyaW5nIGlmIGdpdmVuIGlzIGEgc3RyaW5nIHVzZWQgdG8gc3RyZW5ndGhlbiB0aGUKKyAgICB1bmlxdWVuZXNzIG9mIHRoZSBtZXNzYWdlIGlkLgorICAgICIiIgorICAgIHRpbWV2YWwgPSB0aW1lLnRpbWUoKQorICAgIHV0Y2RhdGUgPSB0aW1lLnN0cmZ0aW1lKCclWSVtJWQlSCVNJVMnLCB0aW1lLmdtdGltZSh0aW1ldmFsKSkKKyAgICBwaWQgPSBvcy5nZXRwaWQoKQorICAgIHJhbmRpbnQgPSByYW5kb20ucmFuZHJhbmdlKDEwMDAwMCkKKyAgICBpZiBpZHN0cmluZyBpcyBOb25lOgorICAgICAgICBpZHN0cmluZyA9ICcnCisgICAgZWxzZToKKyAgICAgICAgaWRzdHJpbmcgPSAnLicgKyBpZHN0cmluZworICAgIGlkaG9zdCA9IHNvY2tldC5nZXRmcWRuKCkKKyAgICBtc2dpZCA9ICc8JXMuJXMuJXMlc0Alcz4nICUgKHV0Y2RhdGUsIHBpZCwgcmFuZGludCwgaWRzdHJpbmcsIGlkaG9zdCkKKyAgICByZXR1cm4gbXNnaWQKKworCisMCisjIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW4gdGhlIHN0YW5kYWxvbmUgbWltZWxpYiB2ZXJzaW9uIG9ubHkgYmVjYXVzZSB0aGV5J3ZlCisjIHN1YnNlcXVlbnRseSBiZWVuIGZpeGVkIGluIHRoZSBsYXRlc3QgUHl0aG9uIHZlcnNpb25zLiAgV2UgdXNlIHRoaXMgdG8gd29ybQorIyBhcm91bmQgYnJva2VuIG9sZGVyIFB5dGhvbnMuCitkZWYgcGFyc2VkYXRlKGRhdGEpOgorICAgIGlmIG5vdCBkYXRhOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiBfcGFyc2VkYXRlKGRhdGEpCisKKworZGVmIHBhcnNlZGF0ZV90eihkYXRhKToKKyAgICBpZiBub3QgZGF0YToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gX3BhcnNlZGF0ZV90eihkYXRhKQorCisKK2RlZiBwYXJzZWFkZHIoYWRkcik6CisgICAgYWRkcnMgPSBfQWRkcmVzc0xpc3QoYWRkcikuYWRkcmVzc2xpc3QKKyAgICBpZiBub3QgYWRkcnM6CisgICAgICAgIHJldHVybiAnJywgJycKKyAgICByZXR1cm4gYWRkcnNbMF0KKworCisjIHJmYzgyMi51bnF1b3RlKCkgZG9lc24ndCBwcm9wZXJseSBkZS1iYWNrc2xhc2gtaWZ5IGluIFB5dGhvbiBwcmUtMi4zLgorZGVmIHVucXVvdGUoc3RyKToKKyAgICAiIiJSZW1vdmUgcXVvdGVzIGZyb20gYSBzdHJpbmcuIiIiCisgICAgaWYgbGVuKHN0cikgPiAxOgorICAgICAgICBpZiBzdHIuc3RhcnRzd2l0aCgnIicpIGFuZCBzdHIuZW5kc3dpdGgoJyInKToKKyAgICAgICAgICAgIHJldHVybiBzdHJbMTotMV0ucmVwbGFjZSgnXFxcXCcsICdcXCcpLnJlcGxhY2UoJ1xcIicsICciJykKKyAgICAgICAgaWYgc3RyLnN0YXJ0c3dpdGgoJzwnKSBhbmQgc3RyLmVuZHN3aXRoKCc+Jyk6CisgICAgICAgICAgICByZXR1cm4gc3RyWzE6LTFdCisgICAgcmV0dXJuIHN0cgorCisKKwwKKyMgUkZDMjIzMS1yZWxhdGVkIGZ1bmN0aW9ucyAtIHBhcmFtZXRlciBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK2RlZiBkZWNvZGVfcmZjMjIzMShzKToKKyAgICAiIiJEZWNvZGUgc3RyaW5nIGFjY29yZGluZyB0byBSRkMgMjIzMSIiIgorICAgIHBhcnRzID0gcy5zcGxpdChUSUNLLCAyKQorICAgIGlmIGxlbihwYXJ0cykgPD0gMjoKKyAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUsIHMKKyAgICByZXR1cm4gcGFydHMKKworCitkZWYgZW5jb2RlX3JmYzIyMzEocywgY2hhcnNldD1Ob25lLCBsYW5ndWFnZT1Ob25lKToKKyAgICAiIiJFbmNvZGUgc3RyaW5nIGFjY29yZGluZyB0byBSRkMgMjIzMS4KKworICAgIElmIG5laXRoZXIgY2hhcnNldCBub3IgbGFuZ3VhZ2UgaXMgZ2l2ZW4sIHRoZW4gcyBpcyByZXR1cm5lZCBhcy1pcy4gIElmCisgICAgY2hhcnNldCBpcyBnaXZlbiBidXQgbm90IGxhbmd1YWdlLCB0aGUgc3RyaW5nIGlzIGVuY29kZWQgdXNpbmcgdGhlIGVtcHR5CisgICAgc3RyaW5nIGZvciBsYW5ndWFnZS4KKyAgICAiIiIKKyAgICBpbXBvcnQgdXJsbGliCisgICAgcyA9IHVybGxpYi5xdW90ZShzLCBzYWZlPScnKQorICAgIGlmIGNoYXJzZXQgaXMgTm9uZSBhbmQgbGFuZ3VhZ2UgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIHMKKyAgICBpZiBsYW5ndWFnZSBpcyBOb25lOgorICAgICAgICBsYW5ndWFnZSA9ICcnCisgICAgcmV0dXJuICIlcyclcyclcyIgJSAoY2hhcnNldCwgbGFuZ3VhZ2UsIHMpCisKKworcmZjMjIzMV9jb250aW51YXRpb24gPSByZS5jb21waWxlKHInXig/UDxuYW1lPlx3KylcKigoP1A8bnVtPlswLTldKylcKj8pPyQnKQorCitkZWYgZGVjb2RlX3BhcmFtcyhwYXJhbXMpOgorICAgICIiIkRlY29kZSBwYXJhbWV0ZXJzIGxpc3QgYWNjb3JkaW5nIHRvIFJGQyAyMjMxLgorCisgICAgcGFyYW1zIGlzIGEgc2VxdWVuY2Ugb2YgMi10dXBsZXMgY29udGFpbmluZyAocGFyYW0gbmFtZSwgc3RyaW5nIHZhbHVlKS4KKyAgICAiIiIKKyAgICAjIENvcHkgcGFyYW1zIHNvIHdlIGRvbid0IG1lc3Mgd2l0aCB0aGUgb3JpZ2luYWwKKyAgICBwYXJhbXMgPSBwYXJhbXNbOl0KKyAgICBuZXdfcGFyYW1zID0gW10KKyAgICAjIE1hcCBwYXJhbWV0ZXIncyBuYW1lIHRvIGEgbGlzdCBvZiBjb250aW51YXRpb25zLiAgVGhlIHZhbHVlcyBhcmUgYQorICAgICMgMy10dXBsZSBvZiB0aGUgY29udGludWF0aW9uIG51bWJlciwgdGhlIHN0cmluZyB2YWx1ZSwgYW5kIGEgZmxhZworICAgICMgc3BlY2lmeWluZyB3aGV0aGVyIGEgcGFydGljdWxhciBzZWdtZW50IGlzICUtZW5jb2RlZC4KKyAgICByZmMyMjMxX3BhcmFtcyA9IHt9CisgICAgbmFtZSwgdmFsdWUgPSBwYXJhbXMucG9wKDApCisgICAgbmV3X3BhcmFtcy5hcHBlbmQoKG5hbWUsIHZhbHVlKSkKKyAgICB3aGlsZSBwYXJhbXM6CisgICAgICAgIG5hbWUsIHZhbHVlID0gcGFyYW1zLnBvcCgwKQorICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcqJyk6CisgICAgICAgICAgICBlbmNvZGVkID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW5jb2RlZCA9IEZhbHNlCisgICAgICAgIHZhbHVlID0gdW5xdW90ZSh2YWx1ZSkKKyAgICAgICAgbW8gPSByZmMyMjMxX2NvbnRpbnVhdGlvbi5tYXRjaChuYW1lKQorICAgICAgICBpZiBtbzoKKyAgICAgICAgICAgIG5hbWUsIG51bSA9IG1vLmdyb3VwKCduYW1lJywgJ251bScpCisgICAgICAgICAgICBpZiBudW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbnVtID0gaW50KG51bSkKKyAgICAgICAgICAgIHJmYzIyMzFfcGFyYW1zLnNldGRlZmF1bHQobmFtZSwgW10pLmFwcGVuZCgobnVtLCB2YWx1ZSwgZW5jb2RlZCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgJyIlcyInICUgcXVvdGUodmFsdWUpKSkKKyAgICBpZiByZmMyMjMxX3BhcmFtczoKKyAgICAgICAgZm9yIG5hbWUsIGNvbnRpbnVhdGlvbnMgaW4gcmZjMjIzMV9wYXJhbXMuaXRlbXMoKToKKyAgICAgICAgICAgIHZhbHVlID0gW10KKyAgICAgICAgICAgIGV4dGVuZGVkID0gRmFsc2UKKyAgICAgICAgICAgICMgU29ydCBieSBudW1iZXIKKyAgICAgICAgICAgIGNvbnRpbnVhdGlvbnMuc29ydCgpCisgICAgICAgICAgICAjIEFuZCBub3cgYXBwZW5kIGFsbCB2YWx1ZXMgaW4gbnVtZXJpY2FsIG9yZGVyLCBjb252ZXJ0aW5nCisgICAgICAgICAgICAjICUtZW5jb2RpbmdzIGZvciB0aGUgZW5jb2RlZCBzZWdtZW50cy4gIElmIGFueSBvZiB0aGUKKyAgICAgICAgICAgICMgY29udGludWF0aW9uIG5hbWVzIGVuZHMgaW4gYSAqLCB0aGVuIHRoZSBlbnRpcmUgc3RyaW5nLCBhZnRlcgorICAgICAgICAgICAgIyBkZWNvZGluZyBzZWdtZW50cyBhbmQgY29uY2F0ZW5hdGluZywgbXVzdCBoYXZlIHRoZSBjaGFyc2V0IGFuZAorICAgICAgICAgICAgIyBsYW5ndWFnZSBzcGVjaWZpZXJzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4KKyAgICAgICAgICAgIGZvciBudW0sIHMsIGVuY29kZWQgaW4gY29udGludWF0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBlbmNvZGVkOgorICAgICAgICAgICAgICAgICAgICBzID0gdXJsbGliLnVucXVvdGUocykKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdmFsdWUuYXBwZW5kKHMpCisgICAgICAgICAgICB2YWx1ZSA9IHF1b3RlKEVNUFRZU1RSSU5HLmpvaW4odmFsdWUpKQorICAgICAgICAgICAgaWYgZXh0ZW5kZWQ6CisgICAgICAgICAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHZhbHVlID0gZGVjb2RlX3JmYzIyMzEodmFsdWUpCisgICAgICAgICAgICAgICAgbmV3X3BhcmFtcy5hcHBlbmQoKG5hbWUsIChjaGFyc2V0LCBsYW5ndWFnZSwgJyIlcyInICUgdmFsdWUpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV3X3BhcmFtcy5hcHBlbmQoKG5hbWUsICciJXMiJyAlIHZhbHVlKSkKKyAgICByZXR1cm4gbmV3X3BhcmFtcworCitkZWYgY29sbGFwc2VfcmZjMjIzMV92YWx1ZSh2YWx1ZSwgZXJyb3JzPSdyZXBsYWNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrX2NoYXJzZXQ9J3VzLWFzY2lpJyk6CisgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgorICAgICAgICByYXd2YWwgPSB1bnF1b3RlKHZhbHVlWzJdKQorICAgICAgICBjaGFyc2V0ID0gdmFsdWVbMF0gb3IgJ3VzLWFzY2lpJworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gdW5pY29kZShyYXd2YWwsIGNoYXJzZXQsIGVycm9ycykKKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgIyBYWFggY2hhcnNldCBpcyB1bmtub3duIHRvIFB5dGhvbi4KKyAgICAgICAgICAgIHJldHVybiB1bmljb2RlKHJhd3ZhbCwgZmFsbGJhY2tfY2hhcnNldCwgZXJyb3JzKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiB1bnF1b3RlKHZhbHVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC91dGlscy5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL3V0aWxzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGUxNjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC91dGlscy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC91dGlscy5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL3V0aWxzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGUxNjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC91dGlscy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODVjYTgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvX19pbml0X18ucHkKQEAgLTAsMCArMSwxNTcgQEAKKyIiIiBTdGFuZGFyZCAiZW5jb2RpbmdzIiBQYWNrYWdlCisKKyAgICBTdGFuZGFyZCBQeXRob24gZW5jb2RpbmcgbW9kdWxlcyBhcmUgc3RvcmVkIGluIHRoaXMgcGFja2FnZQorICAgIGRpcmVjdG9yeS4KKworICAgIENvZGVjIG1vZHVsZXMgbXVzdCBoYXZlIG5hbWVzIGNvcnJlc3BvbmRpbmcgdG8gbm9ybWFsaXplZCBlbmNvZGluZworICAgIG5hbWVzIGFzIGRlZmluZWQgaW4gdGhlIG5vcm1hbGl6ZV9lbmNvZGluZygpIGZ1bmN0aW9uIGJlbG93LCBlLmcuCisgICAgJ3V0Zi04JyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBtb2R1bGUgJ3V0Zl84LnB5Jy4KKworICAgIEVhY2ggY29kZWMgbW9kdWxlIG11c3QgZXhwb3J0IHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlOgorCisgICAgKiBnZXRyZWdlbnRyeSgpIC0+IGNvZGVjcy5Db2RlY0luZm8gb2JqZWN0CisgICAgVGhlIGdldHJlZ2VudHJ5KCkgQVBJIG11c3QgYSBDb2RlY0luZm8gb2JqZWN0IHdpdGggZW5jb2RlciwgZGVjb2RlciwKKyAgICBpbmNyZW1lbnRhbGVuY29kZXIsIGluY3JlbWVudGFsZGVjb2Rlciwgc3RyZWFtd3JpdGVyIGFuZCBzdHJlYW1yZWFkZXIKKyAgICBhdHR0cmlidXRlcyB3aGljaCBhZGhlcmUgdG8gdGhlIFB5dGhvbiBDb2RlYyBJbnRlcmZhY2UgU3RhbmRhcmQuCisKKyAgICBJbiBhZGRpdGlvbiwgYSBtb2R1bGUgbWF5IG9wdGlvbmFsbHkgYWxzbyBkZWZpbmUgdGhlIGZvbGxvd2luZworICAgIEFQSXMgd2hpY2ggYXJlIHRoZW4gdXNlZCBieSB0aGUgcGFja2FnZSdzIGNvZGVjIHNlYXJjaCBmdW5jdGlvbjoKKworICAgICogZ2V0YWxpYXNlcygpIC0+IHNlcXVlbmNlIG9mIGVuY29kaW5nIG5hbWUgc3RyaW5ncyB0byB1c2UgYXMgYWxpYXNlcworCisgICAgQWxpYXMgbmFtZXMgcmV0dXJuZWQgYnkgZ2V0YWxpYXNlcygpIG11c3QgYmUgbm9ybWFsaXplZCBlbmNvZGluZworICAgIG5hbWVzIGFzIGRlZmluZWQgYnkgbm9ybWFsaXplX2VuY29kaW5nKCkuCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCitmcm9tIGVuY29kaW5ncyBpbXBvcnQgYWxpYXNlcworaW1wb3J0IF9fYnVpbHRpbl9fCisKK19jYWNoZSA9IHt9CitfdW5rbm93biA9ICctLXVua25vd24tLScKK19pbXBvcnRfdGFpbCA9IFsnKiddCitfbm9ybV9lbmNvZGluZ19tYXAgPSAoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICcKKyAgICAgICAgICAgICAgICAgICAgICAnMDEyMzQ1Njc4OSAgICAgICBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiAgICAgJworICAgICAgICAgICAgICAgICAgICAgICcgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgJykKK19hbGlhc2VzID0gYWxpYXNlcy5hbGlhc2VzCisKK2NsYXNzIENvZGVjUmVnaXN0cnlFcnJvcihMb29rdXBFcnJvciwgU3lzdGVtRXJyb3IpOgorICAgIHBhc3MKKworZGVmIG5vcm1hbGl6ZV9lbmNvZGluZyhlbmNvZGluZyk6CisKKyAgICAiIiIgTm9ybWFsaXplIGFuIGVuY29kaW5nIG5hbWUuCisKKyAgICAgICAgTm9ybWFsaXphdGlvbiB3b3JrcyBhcyBmb2xsb3dzOiBhbGwgbm9uLWFscGhhbnVtZXJpYworICAgICAgICBjaGFyYWN0ZXJzIGV4Y2VwdCB0aGUgZG90IHVzZWQgZm9yIFB5dGhvbiBwYWNrYWdlIG5hbWVzIGFyZQorICAgICAgICBjb2xsYXBzZWQgYW5kIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgdW5kZXJzY29yZSwgZS5nLiAnICAtOyMnCisgICAgICAgIGJlY29tZXMgJ18nLiBMZWFkaW5nIGFuZCB0cmFpbGluZyB1bmRlcnNjb3JlcyBhcmUgcmVtb3ZlZC4KKworICAgICAgICBOb3RlIHRoYXQgZW5jb2RpbmcgbmFtZXMgc2hvdWxkIGJlIEFTQ0lJIG9ubHk7IGlmIHRoZXkgZG8gdXNlCisgICAgICAgIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCB0aGVzZSBtdXN0IGJlIExhdGluLTEgY29tcGF0aWJsZS4KKworICAgICIiIgorICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYW4gOC1iaXQgc3RyaW5nLCBiZWNhdXNlIC50cmFuc2xhdGUoKSB3b3JrcworICAgICMgZGlmZmVyZW50bHkgZm9yIFVuaWNvZGUgc3RyaW5ncy4KKyAgICBpZiBoYXNhdHRyKF9fYnVpbHRpbl9fLCAidW5pY29kZSIpIGFuZCBpc2luc3RhbmNlKGVuY29kaW5nLCB1bmljb2RlKToKKyAgICAgICAgIyBOb3RlIHRoYXQgLmVuY29kZSgnbGF0aW4tMScpIGRvZXMgKm5vdCogdXNlIHRoZSBjb2RlYworICAgICAgICAjIHJlZ2lzdHJ5LCBzbyB0aGlzIGNhbGwgZG9lc24ndCByZWN1cnNlLiAoU2VlIHVuaWNvZGVvYmplY3QuYworICAgICAgICAjIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoKSBmb3IgZGV0YWlscykKKyAgICAgICAgZW5jb2RpbmcgPSBlbmNvZGluZy5lbmNvZGUoJ2xhdGluLTEnKQorICAgIHJldHVybiAnXycuam9pbihlbmNvZGluZy50cmFuc2xhdGUoX25vcm1fZW5jb2RpbmdfbWFwKS5zcGxpdCgpKQorCitkZWYgc2VhcmNoX2Z1bmN0aW9uKGVuY29kaW5nKToKKworICAgICMgQ2FjaGUgbG9va3VwCisgICAgZW50cnkgPSBfY2FjaGUuZ2V0KGVuY29kaW5nLCBfdW5rbm93bikKKyAgICBpZiBlbnRyeSBpcyBub3QgX3Vua25vd246CisgICAgICAgIHJldHVybiBlbnRyeQorCisgICAgIyBJbXBvcnQgdGhlIG1vZHVsZToKKyAgICAjCisgICAgIyBGaXJzdCB0cnkgdG8gZmluZCBhbiBhbGlhcyBmb3IgdGhlIG5vcm1hbGl6ZWQgZW5jb2RpbmcKKyAgICAjIG5hbWUgYW5kIGxvb2t1cCB0aGUgbW9kdWxlIHVzaW5nIHRoZSBhbGlhc2VkIG5hbWUsIHRoZW4gdHJ5IHRvCisgICAgIyBsb29rdXAgdGhlIG1vZHVsZSB1c2luZyB0aGUgc3RhbmRhcmQgaW1wb3J0IHNjaGVtZSwgaS5lLiBmaXJzdAorICAgICMgdHJ5IGluIHRoZSBlbmNvZGluZ3MgcGFja2FnZSwgdGhlbiBhdCB0b3AtbGV2ZWwuCisgICAgIworICAgIG5vcm1fZW5jb2RpbmcgPSBub3JtYWxpemVfZW5jb2RpbmcoZW5jb2RpbmcpCisgICAgYWxpYXNlZF9lbmNvZGluZyA9IF9hbGlhc2VzLmdldChub3JtX2VuY29kaW5nKSBvciBcCisgICAgICAgICAgICAgICAgICAgICAgIF9hbGlhc2VzLmdldChub3JtX2VuY29kaW5nLnJlcGxhY2UoJy4nLCAnXycpKQorICAgIGlmIGFsaWFzZWRfZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgIG1vZG5hbWVzID0gW2FsaWFzZWRfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgIG5vcm1fZW5jb2RpbmddCisgICAgZWxzZToKKyAgICAgICAgbW9kbmFtZXMgPSBbbm9ybV9lbmNvZGluZ10KKyAgICBmb3IgbW9kbmFtZSBpbiBtb2RuYW1lczoKKyAgICAgICAgaWYgbm90IG1vZG5hbWUgb3IgJy4nIGluIG1vZG5hbWU6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIEltcG9ydCBpcyBhYnNvbHV0ZSB0byBwcmV2ZW50IHRoZSBwb3NzaWJseSBtYWxpY2lvdXMgaW1wb3J0IG9mIGEKKyAgICAgICAgICAgICMgbW9kdWxlIHdpdGggc2lkZS1lZmZlY3RzIHRoYXQgaXMgbm90IGluIHRoZSAnZW5jb2RpbmdzJyBwYWNrYWdlLgorICAgICAgICAgICAgbW9kID0gX19pbXBvcnRfXygnZW5jb2RpbmdzLicgKyBtb2RuYW1lLCBmcm9tbGlzdD1faW1wb3J0X3RhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsPTApCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgbW9kID0gTm9uZQorCisgICAgdHJ5OgorICAgICAgICBnZXRyZWdlbnRyeSA9IG1vZC5nZXRyZWdlbnRyeQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgIyBOb3QgYSBjb2RlYyBtb2R1bGUKKyAgICAgICAgbW9kID0gTm9uZQorCisgICAgaWYgbW9kIGlzIE5vbmU6CisgICAgICAgICMgQ2FjaGUgbWlzc2VzCisgICAgICAgIF9jYWNoZVtlbmNvZGluZ10gPSBOb25lCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIE5vdyBhc2sgdGhlIG1vZHVsZSBmb3IgdGhlIHJlZ2lzdHJ5IGVudHJ5CisgICAgZW50cnkgPSBnZXRyZWdlbnRyeSgpCisgICAgaWYgbm90IGlzaW5zdGFuY2UoZW50cnksIGNvZGVjcy5Db2RlY0luZm8pOgorICAgICAgICBpZiBub3QgNCA8PSBsZW4oZW50cnkpIDw9IDc6CisgICAgICAgICAgICByYWlzZSBDb2RlY1JlZ2lzdHJ5RXJyb3IsXAorICAgICAgICAgICAgICAgICAnbW9kdWxlICIlcyIgKCVzKSBmYWlsZWQgdG8gcmVnaXN0ZXInICUgXAorICAgICAgICAgICAgICAgICAgKG1vZC5fX25hbWVfXywgbW9kLl9fZmlsZV9fKQorICAgICAgICBpZiBub3QgaGFzYXR0cihlbnRyeVswXSwgJ19fY2FsbF9fJykgb3IgXAorICAgICAgICAgICBub3QgaGFzYXR0cihlbnRyeVsxXSwgJ19fY2FsbF9fJykgb3IgXAorICAgICAgICAgICAoZW50cnlbMl0gaXMgbm90IE5vbmUgYW5kIG5vdCBoYXNhdHRyKGVudHJ5WzJdLCAnX19jYWxsX18nKSkgb3IgXAorICAgICAgICAgICAoZW50cnlbM10gaXMgbm90IE5vbmUgYW5kIG5vdCBoYXNhdHRyKGVudHJ5WzNdLCAnX19jYWxsX18nKSkgb3IgXAorICAgICAgICAgICAobGVuKGVudHJ5KSA+IDQgYW5kIGVudHJ5WzRdIGlzIG5vdCBOb25lIGFuZCBub3QgaGFzYXR0cihlbnRyeVs0XSwgJ19fY2FsbF9fJykpIG9yIFwKKyAgICAgICAgICAgKGxlbihlbnRyeSkgPiA1IGFuZCBlbnRyeVs1XSBpcyBub3QgTm9uZSBhbmQgbm90IGhhc2F0dHIoZW50cnlbNV0sICdfX2NhbGxfXycpKToKKyAgICAgICAgICAgIHJhaXNlIENvZGVjUmVnaXN0cnlFcnJvcixcCisgICAgICAgICAgICAgICAgJ2luY29tcGF0aWJsZSBjb2RlY3MgaW4gbW9kdWxlICIlcyIgKCVzKScgJSBcCisgICAgICAgICAgICAgICAgKG1vZC5fX25hbWVfXywgbW9kLl9fZmlsZV9fKQorICAgICAgICBpZiBsZW4oZW50cnkpPDcgb3IgZW50cnlbNl0gaXMgTm9uZToKKyAgICAgICAgICAgIGVudHJ5ICs9IChOb25lLCkqKDYtbGVuKGVudHJ5KSkgKyAobW9kLl9fbmFtZV9fLnNwbGl0KCIuIiwgMSlbMV0sKQorICAgICAgICBlbnRyeSA9IGNvZGVjcy5Db2RlY0luZm8oKmVudHJ5KQorCisgICAgIyBDYWNoZSB0aGUgY29kZWMgcmVnaXN0cnkgZW50cnkKKyAgICBfY2FjaGVbZW5jb2RpbmddID0gZW50cnkKKworICAgICMgUmVnaXN0ZXIgaXRzIGFsaWFzZXMgKHdpdGhvdXQgb3ZlcndyaXRpbmcgcHJldmlvdXNseSByZWdpc3RlcmVkCisgICAgIyBhbGlhc2VzKQorICAgIHRyeToKKyAgICAgICAgY29kZWNhbGlhc2VzID0gbW9kLmdldGFsaWFzZXMoKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGZvciBhbGlhcyBpbiBjb2RlY2FsaWFzZXM6CisgICAgICAgICAgICBpZiBhbGlhcyBub3QgaW4gX2FsaWFzZXM6CisgICAgICAgICAgICAgICAgX2FsaWFzZXNbYWxpYXNdID0gbW9kbmFtZQorCisgICAgIyBSZXR1cm4gdGhlIHJlZ2lzdHJ5IGVudHJ5CisgICAgcmV0dXJuIGVudHJ5CisKKyMgUmVnaXN0ZXIgdGhlIHNlYXJjaF9mdW5jdGlvbiBpbiB0aGUgUHl0aG9uIGNvZGVjIHJlZ2lzdHJ5Citjb2RlY3MucmVnaXN0ZXIoc2VhcmNoX2Z1bmN0aW9uKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OWYxMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OWYxMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYWxpYXNlcy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2FsaWFzZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0Y2Y3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2FsaWFzZXMucHkKQEAgLTAsMCArMSw1MjcgQEAKKyIiIiBFbmNvZGluZyBBbGlhc2VzIFN1cHBvcnQKKworICAgIFRoaXMgbW9kdWxlIGlzIHVzZWQgYnkgdGhlIGVuY29kaW5ncyBwYWNrYWdlIHNlYXJjaCBmdW5jdGlvbiB0bworICAgIG1hcCBlbmNvZGluZ3MgbmFtZXMgdG8gbW9kdWxlIG5hbWVzLgorCisgICAgTm90ZSB0aGF0IHRoZSBzZWFyY2ggZnVuY3Rpb24gbm9ybWFsaXplcyB0aGUgZW5jb2RpbmcgbmFtZXMgYmVmb3JlCisgICAgZG9pbmcgdGhlIGxvb2t1cCwgc28gdGhlIG1hcHBpbmcgd2lsbCBoYXZlIHRvIG1hcCBub3JtYWxpemVkCisgICAgZW5jb2RpbmcgbmFtZXMgdG8gbW9kdWxlIG5hbWVzLgorCisgICAgQ29udGVudHM6CisKKyAgICAgICAgVGhlIGZvbGxvd2luZyBhbGlhc2VzIGRpY3Rpb25hcnkgY29udGFpbnMgbWFwcGluZ3Mgb2YgYWxsIElBTkEKKyAgICAgICAgY2hhcmFjdGVyIHNldCBuYW1lcyBmb3Igd2hpY2ggdGhlIFB5dGhvbiBjb3JlIGxpYnJhcnkgcHJvdmlkZXMKKyAgICAgICAgY29kZWNzLiBJbiBhZGRpdGlvbiB0byB0aGVzZSwgYSBmZXcgUHl0aG9uIHNwZWNpZmljIGNvZGVjCisgICAgICAgIGFsaWFzZXMgaGF2ZSBhbHNvIGJlZW4gYWRkZWQuCisKKyIiIgorYWxpYXNlcyA9IHsKKworICAgICMgUGxlYXNlIGtlZXAgdGhpcyBsaXN0IHNvcnRlZCBhbHBoYWJldGljYWxseSBieSB2YWx1ZSAhCisKKyAgICAjIGFzY2lpIGNvZGVjCisgICAgJzY0NicgICAgICAgICAgICAgICAgOiAnYXNjaWknLAorICAgICdhbnNpX3gzLjRfMTk2OCcgICAgIDogJ2FzY2lpJywKKyAgICAnYW5zaV94M180XzE5NjgnICAgICA6ICdhc2NpaScsICMgc29tZSBlbWFpbCBoZWFkZXJzIHVzZSB0aGlzIG5vbi1zdGFuZGFyZCBuYW1lCisgICAgJ2Fuc2lfeDMuNF8xOTg2JyAgICAgOiAnYXNjaWknLAorICAgICdjcDM2NycgICAgICAgICAgICAgIDogJ2FzY2lpJywKKyAgICAnY3Nhc2NpaScgICAgICAgICAgICA6ICdhc2NpaScsCisgICAgJ2libTM2NycgICAgICAgICAgICAgOiAnYXNjaWknLAorICAgICdpc282NDZfdXMnICAgICAgICAgIDogJ2FzY2lpJywKKyAgICAnaXNvXzY0Ni5pcnZfMTk5MScgICA6ICdhc2NpaScsCisgICAgJ2lzb19pcl82JyAgICAgICAgICAgOiAnYXNjaWknLAorICAgICd1cycgICAgICAgICAgICAgICAgIDogJ2FzY2lpJywKKyAgICAndXNfYXNjaWknICAgICAgICAgICA6ICdhc2NpaScsCisKKyAgICAjIGJhc2U2NF9jb2RlYyBjb2RlYworICAgICdiYXNlNjQnICAgICAgICAgICAgIDogJ2Jhc2U2NF9jb2RlYycsCisgICAgJ2Jhc2VfNjQnICAgICAgICAgICAgOiAnYmFzZTY0X2NvZGVjJywKKworICAgICMgYmlnNSBjb2RlYworICAgICdiaWc1X3R3JyAgICAgICAgICAgIDogJ2JpZzUnLAorICAgICdjc2JpZzUnICAgICAgICAgICAgIDogJ2JpZzUnLAorCisgICAgIyBiaWc1aGtzY3MgY29kZWMKKyAgICAnYmlnNV9oa3NjcycgICAgICAgICA6ICdiaWc1aGtzY3MnLAorICAgICdoa3NjcycgICAgICAgICAgICAgIDogJ2JpZzVoa3NjcycsCisKKyAgICAjIGJ6Ml9jb2RlYyBjb2RlYworICAgICdiejInICAgICAgICAgICAgICAgIDogJ2J6Ml9jb2RlYycsCisKKyAgICAjIGNwMDM3IGNvZGVjCisgICAgJzAzNycgICAgICAgICAgICAgICAgOiAnY3AwMzcnLAorICAgICdjc2libTAzNycgICAgICAgICAgIDogJ2NwMDM3JywKKyAgICAnZWJjZGljX2NwX2NhJyAgICAgICA6ICdjcDAzNycsCisgICAgJ2ViY2RpY19jcF9ubCcgICAgICAgOiAnY3AwMzcnLAorICAgICdlYmNkaWNfY3BfdXMnICAgICAgIDogJ2NwMDM3JywKKyAgICAnZWJjZGljX2NwX3d0JyAgICAgICA6ICdjcDAzNycsCisgICAgJ2libTAzNycgICAgICAgICAgICAgOiAnY3AwMzcnLAorICAgICdpYm0wMzknICAgICAgICAgICAgIDogJ2NwMDM3JywKKworICAgICMgY3AxMDI2IGNvZGVjCisgICAgJzEwMjYnICAgICAgICAgICAgICAgOiAnY3AxMDI2JywKKyAgICAnY3NpYm0xMDI2JyAgICAgICAgICA6ICdjcDEwMjYnLAorICAgICdpYm0xMDI2JyAgICAgICAgICAgIDogJ2NwMTAyNicsCisKKyAgICAjIGNwMTE0MCBjb2RlYworICAgICcxMTQwJyAgICAgICAgICAgICAgIDogJ2NwMTE0MCcsCisgICAgJ2libTExNDAnICAgICAgICAgICAgOiAnY3AxMTQwJywKKworICAgICMgY3AxMjUwIGNvZGVjCisgICAgJzEyNTAnICAgICAgICAgICAgICAgOiAnY3AxMjUwJywKKyAgICAnd2luZG93c18xMjUwJyAgICAgICA6ICdjcDEyNTAnLAorCisgICAgIyBjcDEyNTEgY29kZWMKKyAgICAnMTI1MScgICAgICAgICAgICAgICA6ICdjcDEyNTEnLAorICAgICd3aW5kb3dzXzEyNTEnICAgICAgIDogJ2NwMTI1MScsCisKKyAgICAjIGNwMTI1MiBjb2RlYworICAgICcxMjUyJyAgICAgICAgICAgICAgIDogJ2NwMTI1MicsCisgICAgJ3dpbmRvd3NfMTI1MicgICAgICAgOiAnY3AxMjUyJywKKworICAgICMgY3AxMjUzIGNvZGVjCisgICAgJzEyNTMnICAgICAgICAgICAgICAgOiAnY3AxMjUzJywKKyAgICAnd2luZG93c18xMjUzJyAgICAgICA6ICdjcDEyNTMnLAorCisgICAgIyBjcDEyNTQgY29kZWMKKyAgICAnMTI1NCcgICAgICAgICAgICAgICA6ICdjcDEyNTQnLAorICAgICd3aW5kb3dzXzEyNTQnICAgICAgIDogJ2NwMTI1NCcsCisKKyAgICAjIGNwMTI1NSBjb2RlYworICAgICcxMjU1JyAgICAgICAgICAgICAgIDogJ2NwMTI1NScsCisgICAgJ3dpbmRvd3NfMTI1NScgICAgICAgOiAnY3AxMjU1JywKKworICAgICMgY3AxMjU2IGNvZGVjCisgICAgJzEyNTYnICAgICAgICAgICAgICAgOiAnY3AxMjU2JywKKyAgICAnd2luZG93c18xMjU2JyAgICAgICA6ICdjcDEyNTYnLAorCisgICAgIyBjcDEyNTcgY29kZWMKKyAgICAnMTI1NycgICAgICAgICAgICAgICA6ICdjcDEyNTcnLAorICAgICd3aW5kb3dzXzEyNTcnICAgICAgIDogJ2NwMTI1NycsCisKKyAgICAjIGNwMTI1OCBjb2RlYworICAgICcxMjU4JyAgICAgICAgICAgICAgIDogJ2NwMTI1OCcsCisgICAgJ3dpbmRvd3NfMTI1OCcgICAgICAgOiAnY3AxMjU4JywKKworICAgICMgY3A0MjQgY29kZWMKKyAgICAnNDI0JyAgICAgICAgICAgICAgICA6ICdjcDQyNCcsCisgICAgJ2NzaWJtNDI0JyAgICAgICAgICAgOiAnY3A0MjQnLAorICAgICdlYmNkaWNfY3BfaGUnICAgICAgIDogJ2NwNDI0JywKKyAgICAnaWJtNDI0JyAgICAgICAgICAgICA6ICdjcDQyNCcsCisKKyAgICAjIGNwNDM3IGNvZGVjCisgICAgJzQzNycgICAgICAgICAgICAgICAgOiAnY3A0MzcnLAorICAgICdjc3BjOGNvZGVwYWdlNDM3JyAgIDogJ2NwNDM3JywKKyAgICAnaWJtNDM3JyAgICAgICAgICAgICA6ICdjcDQzNycsCisKKyAgICAjIGNwNTAwIGNvZGVjCisgICAgJzUwMCcgICAgICAgICAgICAgICAgOiAnY3A1MDAnLAorICAgICdjc2libTUwMCcgICAgICAgICAgIDogJ2NwNTAwJywKKyAgICAnZWJjZGljX2NwX2JlJyAgICAgICA6ICdjcDUwMCcsCisgICAgJ2ViY2RpY19jcF9jaCcgICAgICAgOiAnY3A1MDAnLAorICAgICdpYm01MDAnICAgICAgICAgICAgIDogJ2NwNTAwJywKKworICAgICMgY3A3NzUgY29kZWMKKyAgICAnNzc1JyAgICAgICAgICAgICAgICA6ICdjcDc3NScsCisgICAgJ2NzcGM3NzViYWx0aWMnICAgICAgOiAnY3A3NzUnLAorICAgICdpYm03NzUnICAgICAgICAgICAgIDogJ2NwNzc1JywKKworICAgICMgY3A4NTAgY29kZWMKKyAgICAnODUwJyAgICAgICAgICAgICAgICA6ICdjcDg1MCcsCisgICAgJ2NzcGM4NTBtdWx0aWxpbmd1YWwnIDogJ2NwODUwJywKKyAgICAnaWJtODUwJyAgICAgICAgICAgICA6ICdjcDg1MCcsCisKKyAgICAjIGNwODUyIGNvZGVjCisgICAgJzg1MicgICAgICAgICAgICAgICAgOiAnY3A4NTInLAorICAgICdjc3BjcDg1MicgICAgICAgICAgIDogJ2NwODUyJywKKyAgICAnaWJtODUyJyAgICAgICAgICAgICA6ICdjcDg1MicsCisKKyAgICAjIGNwODU1IGNvZGVjCisgICAgJzg1NScgICAgICAgICAgICAgICAgOiAnY3A4NTUnLAorICAgICdjc2libTg1NScgICAgICAgICAgIDogJ2NwODU1JywKKyAgICAnaWJtODU1JyAgICAgICAgICAgICA6ICdjcDg1NScsCisKKyAgICAjIGNwODU3IGNvZGVjCisgICAgJzg1NycgICAgICAgICAgICAgICAgOiAnY3A4NTcnLAorICAgICdjc2libTg1NycgICAgICAgICAgIDogJ2NwODU3JywKKyAgICAnaWJtODU3JyAgICAgICAgICAgICA6ICdjcDg1NycsCisKKyAgICAjIGNwODU4IGNvZGVjCisgICAgJzg1OCcgICAgICAgICAgICAgICAgOiAnY3A4NTgnLAorICAgICdjc2libTg1OCcgICAgICAgICAgIDogJ2NwODU4JywKKyAgICAnaWJtODU4JyAgICAgICAgICAgICA6ICdjcDg1OCcsCisKKyAgICAjIGNwODYwIGNvZGVjCisgICAgJzg2MCcgICAgICAgICAgICAgICAgOiAnY3A4NjAnLAorICAgICdjc2libTg2MCcgICAgICAgICAgIDogJ2NwODYwJywKKyAgICAnaWJtODYwJyAgICAgICAgICAgICA6ICdjcDg2MCcsCisKKyAgICAjIGNwODYxIGNvZGVjCisgICAgJzg2MScgICAgICAgICAgICAgICAgOiAnY3A4NjEnLAorICAgICdjcF9pcycgICAgICAgICAgICAgIDogJ2NwODYxJywKKyAgICAnY3NpYm04NjEnICAgICAgICAgICA6ICdjcDg2MScsCisgICAgJ2libTg2MScgICAgICAgICAgICAgOiAnY3A4NjEnLAorCisgICAgIyBjcDg2MiBjb2RlYworICAgICc4NjInICAgICAgICAgICAgICAgIDogJ2NwODYyJywKKyAgICAnY3NwYzg2MmxhdGluaGVicmV3JyA6ICdjcDg2MicsCisgICAgJ2libTg2MicgICAgICAgICAgICAgOiAnY3A4NjInLAorCisgICAgIyBjcDg2MyBjb2RlYworICAgICc4NjMnICAgICAgICAgICAgICAgIDogJ2NwODYzJywKKyAgICAnY3NpYm04NjMnICAgICAgICAgICA6ICdjcDg2MycsCisgICAgJ2libTg2MycgICAgICAgICAgICAgOiAnY3A4NjMnLAorCisgICAgIyBjcDg2NCBjb2RlYworICAgICc4NjQnICAgICAgICAgICAgICAgIDogJ2NwODY0JywKKyAgICAnY3NpYm04NjQnICAgICAgICAgICA6ICdjcDg2NCcsCisgICAgJ2libTg2NCcgICAgICAgICAgICAgOiAnY3A4NjQnLAorCisgICAgIyBjcDg2NSBjb2RlYworICAgICc4NjUnICAgICAgICAgICAgICAgIDogJ2NwODY1JywKKyAgICAnY3NpYm04NjUnICAgICAgICAgICA6ICdjcDg2NScsCisgICAgJ2libTg2NScgICAgICAgICAgICAgOiAnY3A4NjUnLAorCisgICAgIyBjcDg2NiBjb2RlYworICAgICc4NjYnICAgICAgICAgICAgICAgIDogJ2NwODY2JywKKyAgICAnY3NpYm04NjYnICAgICAgICAgICA6ICdjcDg2NicsCisgICAgJ2libTg2NicgICAgICAgICAgICAgOiAnY3A4NjYnLAorCisgICAgIyBjcDg2OSBjb2RlYworICAgICc4NjknICAgICAgICAgICAgICAgIDogJ2NwODY5JywKKyAgICAnY3BfZ3InICAgICAgICAgICAgICA6ICdjcDg2OScsCisgICAgJ2NzaWJtODY5JyAgICAgICAgICAgOiAnY3A4NjknLAorICAgICdpYm04NjknICAgICAgICAgICAgIDogJ2NwODY5JywKKworICAgICMgY3A5MzIgY29kZWMKKyAgICAnOTMyJyAgICAgICAgICAgICAgICA6ICdjcDkzMicsCisgICAgJ21zOTMyJyAgICAgICAgICAgICAgOiAnY3A5MzInLAorICAgICdtc2thbmppJyAgICAgICAgICAgIDogJ2NwOTMyJywKKyAgICAnbXNfa2FuamknICAgICAgICAgICA6ICdjcDkzMicsCisKKyAgICAjIGNwOTQ5IGNvZGVjCisgICAgJzk0OScgICAgICAgICAgICAgICAgOiAnY3A5NDknLAorICAgICdtczk0OScgICAgICAgICAgICAgIDogJ2NwOTQ5JywKKyAgICAndWhjJyAgICAgICAgICAgICAgICA6ICdjcDk0OScsCisKKyAgICAjIGNwOTUwIGNvZGVjCisgICAgJzk1MCcgICAgICAgICAgICAgICAgOiAnY3A5NTAnLAorICAgICdtczk1MCcgICAgICAgICAgICAgIDogJ2NwOTUwJywKKworICAgICMgZXVjX2ppc18yMDA0IGNvZGVjCisgICAgJ2ppc3gwMjEzJyAgICAgICAgICAgOiAnZXVjX2ppc18yMDA0JywKKyAgICAnZXVjamlzMjAwNCcgICAgICAgICA6ICdldWNfamlzXzIwMDQnLAorICAgICdldWNfamlzMjAwNCcgICAgICAgIDogJ2V1Y19qaXNfMjAwNCcsCisKKyAgICAjIGV1Y19qaXN4MDIxMyBjb2RlYworICAgICdldWNqaXN4MDIxMycgICAgICAgIDogJ2V1Y19qaXN4MDIxMycsCisKKyAgICAjIGV1Y19qcCBjb2RlYworICAgICdldWNqcCcgICAgICAgICAgICAgIDogJ2V1Y19qcCcsCisgICAgJ3VqaXMnICAgICAgICAgICAgICAgOiAnZXVjX2pwJywKKyAgICAndV9qaXMnICAgICAgICAgICAgICA6ICdldWNfanAnLAorCisgICAgIyBldWNfa3IgY29kZWMKKyAgICAnZXVja3InICAgICAgICAgICAgICA6ICdldWNfa3InLAorICAgICdrb3JlYW4nICAgICAgICAgICAgIDogJ2V1Y19rcicsCisgICAgJ2tzYzU2MDEnICAgICAgICAgICAgOiAnZXVjX2tyJywKKyAgICAna3NfY181NjAxJyAgICAgICAgICA6ICdldWNfa3InLAorICAgICdrc19jXzU2MDFfMTk4NycgICAgIDogJ2V1Y19rcicsCisgICAgJ2tzeDEwMDEnICAgICAgICAgICAgOiAnZXVjX2tyJywKKyAgICAna3NfeF8xMDAxJyAgICAgICAgICA6ICdldWNfa3InLAorCisgICAgIyBnYjE4MDMwIGNvZGVjCisgICAgJ2diMTgwMzBfMjAwMCcgICAgICAgOiAnZ2IxODAzMCcsCisKKyAgICAjIGdiMjMxMiBjb2RlYworICAgICdjaGluZXNlJyAgICAgICAgICAgIDogJ2diMjMxMicsCisgICAgJ2NzaXNvNThnYjIzMTI4MCcgICAgOiAnZ2IyMzEyJywKKyAgICAnZXVjX2NuJyAgICAgICAgICAgICA6ICdnYjIzMTInLAorICAgICdldWNjbicgICAgICAgICAgICAgIDogJ2diMjMxMicsCisgICAgJ2V1Y2diMjMxMl9jbicgICAgICAgOiAnZ2IyMzEyJywKKyAgICAnZ2IyMzEyXzE5ODAnICAgICAgICA6ICdnYjIzMTInLAorICAgICdnYjIzMTJfODAnICAgICAgICAgIDogJ2diMjMxMicsCisgICAgJ2lzb19pcl81OCcgICAgICAgICAgOiAnZ2IyMzEyJywKKworICAgICMgZ2JrIGNvZGVjCisgICAgJzkzNicgICAgICAgICAgICAgICAgOiAnZ2JrJywKKyAgICAnY3A5MzYnICAgICAgICAgICAgICA6ICdnYmsnLAorICAgICdtczkzNicgICAgICAgICAgICAgIDogJ2diaycsCisKKyAgICAjIGhleF9jb2RlYyBjb2RlYworICAgICdoZXgnICAgICAgICAgICAgICAgIDogJ2hleF9jb2RlYycsCisKKyAgICAjIGhwX3JvbWFuOCBjb2RlYworICAgICdyb21hbjgnICAgICAgICAgICAgIDogJ2hwX3JvbWFuOCcsCisgICAgJ3I4JyAgICAgICAgICAgICAgICAgOiAnaHBfcm9tYW44JywKKyAgICAnY3NIUFJvbWFuOCcgICAgICAgICA6ICdocF9yb21hbjgnLAorCisgICAgIyBoeiBjb2RlYworICAgICdoemdiJyAgICAgICAgICAgICAgIDogJ2h6JywKKyAgICAnaHpfZ2InICAgICAgICAgICAgICA6ICdoeicsCisgICAgJ2h6X2diXzIzMTInICAgICAgICAgOiAnaHonLAorCisgICAgIyBpc28yMDIyX2pwIGNvZGVjCisgICAgJ2NzaXNvMjAyMmpwJyAgICAgICAgOiAnaXNvMjAyMl9qcCcsCisgICAgJ2lzbzIwMjJqcCcgICAgICAgICAgOiAnaXNvMjAyMl9qcCcsCisgICAgJ2lzb18yMDIyX2pwJyAgICAgICAgOiAnaXNvMjAyMl9qcCcsCisKKyAgICAjIGlzbzIwMjJfanBfMSBjb2RlYworICAgICdpc28yMDIyanBfMScgICAgICAgIDogJ2lzbzIwMjJfanBfMScsCisgICAgJ2lzb18yMDIyX2pwXzEnICAgICAgOiAnaXNvMjAyMl9qcF8xJywKKworICAgICMgaXNvMjAyMl9qcF8yIGNvZGVjCisgICAgJ2lzbzIwMjJqcF8yJyAgICAgICAgOiAnaXNvMjAyMl9qcF8yJywKKyAgICAnaXNvXzIwMjJfanBfMicgICAgICA6ICdpc28yMDIyX2pwXzInLAorCisgICAgIyBpc28yMDIyX2pwXzIwMDQgY29kZWMKKyAgICAnaXNvXzIwMjJfanBfMjAwNCcgICA6ICdpc28yMDIyX2pwXzIwMDQnLAorICAgICdpc28yMDIyanBfMjAwNCcgICAgIDogJ2lzbzIwMjJfanBfMjAwNCcsCisKKyAgICAjIGlzbzIwMjJfanBfMyBjb2RlYworICAgICdpc28yMDIyanBfMycgICAgICAgIDogJ2lzbzIwMjJfanBfMycsCisgICAgJ2lzb18yMDIyX2pwXzMnICAgICAgOiAnaXNvMjAyMl9qcF8zJywKKworICAgICMgaXNvMjAyMl9qcF9leHQgY29kZWMKKyAgICAnaXNvMjAyMmpwX2V4dCcgICAgICA6ICdpc28yMDIyX2pwX2V4dCcsCisgICAgJ2lzb18yMDIyX2pwX2V4dCcgICAgOiAnaXNvMjAyMl9qcF9leHQnLAorCisgICAgIyBpc28yMDIyX2tyIGNvZGVjCisgICAgJ2NzaXNvMjAyMmtyJyAgICAgICAgOiAnaXNvMjAyMl9rcicsCisgICAgJ2lzbzIwMjJrcicgICAgICAgICAgOiAnaXNvMjAyMl9rcicsCisgICAgJ2lzb18yMDIyX2tyJyAgICAgICAgOiAnaXNvMjAyMl9rcicsCisKKyAgICAjIGlzbzg4NTlfMTAgY29kZWMKKyAgICAnY3Npc29sYXRpbjYnICAgICAgICA6ICdpc284ODU5XzEwJywKKyAgICAnaXNvXzg4NTlfMTAnICAgICAgICA6ICdpc284ODU5XzEwJywKKyAgICAnaXNvXzg4NTlfMTBfMTk5MicgICA6ICdpc284ODU5XzEwJywKKyAgICAnaXNvX2lyXzE1NycgICAgICAgICA6ICdpc284ODU5XzEwJywKKyAgICAnbDYnICAgICAgICAgICAgICAgICA6ICdpc284ODU5XzEwJywKKyAgICAnbGF0aW42JyAgICAgICAgICAgICA6ICdpc284ODU5XzEwJywKKworICAgICMgaXNvODg1OV8xMSBjb2RlYworICAgICd0aGFpJyAgICAgICAgICAgICAgIDogJ2lzbzg4NTlfMTEnLAorICAgICdpc29fODg1OV8xMScgICAgICAgIDogJ2lzbzg4NTlfMTEnLAorICAgICdpc29fODg1OV8xMV8yMDAxJyAgIDogJ2lzbzg4NTlfMTEnLAorCisgICAgIyBpc284ODU5XzEzIGNvZGVjCisgICAgJ2lzb184ODU5XzEzJyAgICAgICAgOiAnaXNvODg1OV8xMycsCisgICAgJ2w3JyAgICAgICAgICAgICAgICAgOiAnaXNvODg1OV8xMycsCisgICAgJ2xhdGluNycgICAgICAgICAgICAgOiAnaXNvODg1OV8xMycsCisKKyAgICAjIGlzbzg4NTlfMTQgY29kZWMKKyAgICAnaXNvXzg4NTlfMTQnICAgICAgICA6ICdpc284ODU5XzE0JywKKyAgICAnaXNvXzg4NTlfMTRfMTk5OCcgICA6ICdpc284ODU5XzE0JywKKyAgICAnaXNvX2NlbHRpYycgICAgICAgICA6ICdpc284ODU5XzE0JywKKyAgICAnaXNvX2lyXzE5OScgICAgICAgICA6ICdpc284ODU5XzE0JywKKyAgICAnbDgnICAgICAgICAgICAgICAgICA6ICdpc284ODU5XzE0JywKKyAgICAnbGF0aW44JyAgICAgICAgICAgICA6ICdpc284ODU5XzE0JywKKworICAgICMgaXNvODg1OV8xNSBjb2RlYworICAgICdpc29fODg1OV8xNScgICAgICAgIDogJ2lzbzg4NTlfMTUnLAorICAgICdsOScgICAgICAgICAgICAgICAgIDogJ2lzbzg4NTlfMTUnLAorICAgICdsYXRpbjknICAgICAgICAgICAgIDogJ2lzbzg4NTlfMTUnLAorCisgICAgIyBpc284ODU5XzE2IGNvZGVjCisgICAgJ2lzb184ODU5XzE2JyAgICAgICAgOiAnaXNvODg1OV8xNicsCisgICAgJ2lzb184ODU5XzE2XzIwMDEnICAgOiAnaXNvODg1OV8xNicsCisgICAgJ2lzb19pcl8yMjYnICAgICAgICAgOiAnaXNvODg1OV8xNicsCisgICAgJ2wxMCcgICAgICAgICAgICAgICAgOiAnaXNvODg1OV8xNicsCisgICAgJ2xhdGluMTAnICAgICAgICAgICAgOiAnaXNvODg1OV8xNicsCisKKyAgICAjIGlzbzg4NTlfMiBjb2RlYworICAgICdjc2lzb2xhdGluMicgICAgICAgIDogJ2lzbzg4NTlfMicsCisgICAgJ2lzb184ODU5XzInICAgICAgICAgOiAnaXNvODg1OV8yJywKKyAgICAnaXNvXzg4NTlfMl8xOTg3JyAgICA6ICdpc284ODU5XzInLAorICAgICdpc29faXJfMTAxJyAgICAgICAgIDogJ2lzbzg4NTlfMicsCisgICAgJ2wyJyAgICAgICAgICAgICAgICAgOiAnaXNvODg1OV8yJywKKyAgICAnbGF0aW4yJyAgICAgICAgICAgICA6ICdpc284ODU5XzInLAorCisgICAgIyBpc284ODU5XzMgY29kZWMKKyAgICAnY3Npc29sYXRpbjMnICAgICAgICA6ICdpc284ODU5XzMnLAorICAgICdpc29fODg1OV8zJyAgICAgICAgIDogJ2lzbzg4NTlfMycsCisgICAgJ2lzb184ODU5XzNfMTk4OCcgICAgOiAnaXNvODg1OV8zJywKKyAgICAnaXNvX2lyXzEwOScgICAgICAgICA6ICdpc284ODU5XzMnLAorICAgICdsMycgICAgICAgICAgICAgICAgIDogJ2lzbzg4NTlfMycsCisgICAgJ2xhdGluMycgICAgICAgICAgICAgOiAnaXNvODg1OV8zJywKKworICAgICMgaXNvODg1OV80IGNvZGVjCisgICAgJ2NzaXNvbGF0aW40JyAgICAgICAgOiAnaXNvODg1OV80JywKKyAgICAnaXNvXzg4NTlfNCcgICAgICAgICA6ICdpc284ODU5XzQnLAorICAgICdpc29fODg1OV80XzE5ODgnICAgIDogJ2lzbzg4NTlfNCcsCisgICAgJ2lzb19pcl8xMTAnICAgICAgICAgOiAnaXNvODg1OV80JywKKyAgICAnbDQnICAgICAgICAgICAgICAgICA6ICdpc284ODU5XzQnLAorICAgICdsYXRpbjQnICAgICAgICAgICAgIDogJ2lzbzg4NTlfNCcsCisKKyAgICAjIGlzbzg4NTlfNSBjb2RlYworICAgICdjc2lzb2xhdGluY3lyaWxsaWMnIDogJ2lzbzg4NTlfNScsCisgICAgJ2N5cmlsbGljJyAgICAgICAgICAgOiAnaXNvODg1OV81JywKKyAgICAnaXNvXzg4NTlfNScgICAgICAgICA6ICdpc284ODU5XzUnLAorICAgICdpc29fODg1OV81XzE5ODgnICAgIDogJ2lzbzg4NTlfNScsCisgICAgJ2lzb19pcl8xNDQnICAgICAgICAgOiAnaXNvODg1OV81JywKKworICAgICMgaXNvODg1OV82IGNvZGVjCisgICAgJ2FyYWJpYycgICAgICAgICAgICAgOiAnaXNvODg1OV82JywKKyAgICAnYXNtb183MDgnICAgICAgICAgICA6ICdpc284ODU5XzYnLAorICAgICdjc2lzb2xhdGluYXJhYmljJyAgIDogJ2lzbzg4NTlfNicsCisgICAgJ2VjbWFfMTE0JyAgICAgICAgICAgOiAnaXNvODg1OV82JywKKyAgICAnaXNvXzg4NTlfNicgICAgICAgICA6ICdpc284ODU5XzYnLAorICAgICdpc29fODg1OV82XzE5ODcnICAgIDogJ2lzbzg4NTlfNicsCisgICAgJ2lzb19pcl8xMjcnICAgICAgICAgOiAnaXNvODg1OV82JywKKworICAgICMgaXNvODg1OV83IGNvZGVjCisgICAgJ2NzaXNvbGF0aW5ncmVlaycgICAgOiAnaXNvODg1OV83JywKKyAgICAnZWNtYV8xMTgnICAgICAgICAgICA6ICdpc284ODU5XzcnLAorICAgICdlbG90XzkyOCcgICAgICAgICAgIDogJ2lzbzg4NTlfNycsCisgICAgJ2dyZWVrJyAgICAgICAgICAgICAgOiAnaXNvODg1OV83JywKKyAgICAnZ3JlZWs4JyAgICAgICAgICAgICA6ICdpc284ODU5XzcnLAorICAgICdpc29fODg1OV83JyAgICAgICAgIDogJ2lzbzg4NTlfNycsCisgICAgJ2lzb184ODU5XzdfMTk4NycgICAgOiAnaXNvODg1OV83JywKKyAgICAnaXNvX2lyXzEyNicgICAgICAgICA6ICdpc284ODU5XzcnLAorCisgICAgIyBpc284ODU5XzggY29kZWMKKyAgICAnY3Npc29sYXRpbmhlYnJldycgICA6ICdpc284ODU5XzgnLAorICAgICdoZWJyZXcnICAgICAgICAgICAgIDogJ2lzbzg4NTlfOCcsCisgICAgJ2lzb184ODU5XzgnICAgICAgICAgOiAnaXNvODg1OV84JywKKyAgICAnaXNvXzg4NTlfOF8xOTg4JyAgICA6ICdpc284ODU5XzgnLAorICAgICdpc29faXJfMTM4JyAgICAgICAgIDogJ2lzbzg4NTlfOCcsCisKKyAgICAjIGlzbzg4NTlfOSBjb2RlYworICAgICdjc2lzb2xhdGluNScgICAgICAgIDogJ2lzbzg4NTlfOScsCisgICAgJ2lzb184ODU5XzknICAgICAgICAgOiAnaXNvODg1OV85JywKKyAgICAnaXNvXzg4NTlfOV8xOTg5JyAgICA6ICdpc284ODU5XzknLAorICAgICdpc29faXJfMTQ4JyAgICAgICAgIDogJ2lzbzg4NTlfOScsCisgICAgJ2w1JyAgICAgICAgICAgICAgICAgOiAnaXNvODg1OV85JywKKyAgICAnbGF0aW41JyAgICAgICAgICAgICA6ICdpc284ODU5XzknLAorCisgICAgIyBqb2hhYiBjb2RlYworICAgICdjcDEzNjEnICAgICAgICAgICAgIDogJ2pvaGFiJywKKyAgICAnbXMxMzYxJyAgICAgICAgICAgICA6ICdqb2hhYicsCisKKyAgICAjIGtvaThfciBjb2RlYworICAgICdjc2tvaThyJyAgICAgICAgICAgIDogJ2tvaThfcicsCisKKyAgICAjIGxhdGluXzEgY29kZWMKKyAgICAjCisgICAgIyBOb3RlIHRoYXQgdGhlIGxhdGluXzEgY29kZWMgaXMgaW1wbGVtZW50ZWQgaW50ZXJuYWxseSBpbiBDIGFuZCBhCisgICAgIyBsb3QgZmFzdGVyIHRoYW4gdGhlIGNoYXJtYXAgY29kZWMgaXNvODg1OV8xIHdoaWNoIHVzZXMgdGhlIHNhbWUKKyAgICAjIGVuY29kaW5nLiBUaGlzIGlzIHdoeSB3ZSBkaXNjb3VyYWdlIHRoZSB1c2Ugb2YgdGhlIGlzbzg4NTlfMQorICAgICMgY29kZWMgYW5kIGFsaWFzIGl0IHRvIGxhdGluXzEgaW5zdGVhZC4KKyAgICAjCisgICAgJzg4NTknICAgICAgICAgICAgICAgOiAnbGF0aW5fMScsCisgICAgJ2NwODE5JyAgICAgICAgICAgICAgOiAnbGF0aW5fMScsCisgICAgJ2NzaXNvbGF0aW4xJyAgICAgICAgOiAnbGF0aW5fMScsCisgICAgJ2libTgxOScgICAgICAgICAgICAgOiAnbGF0aW5fMScsCisgICAgJ2lzbzg4NTknICAgICAgICAgICAgOiAnbGF0aW5fMScsCisgICAgJ2lzbzg4NTlfMScgICAgICAgICAgOiAnbGF0aW5fMScsCisgICAgJ2lzb184ODU5XzEnICAgICAgICAgOiAnbGF0aW5fMScsCisgICAgJ2lzb184ODU5XzFfMTk4NycgICAgOiAnbGF0aW5fMScsCisgICAgJ2lzb19pcl8xMDAnICAgICAgICAgOiAnbGF0aW5fMScsCisgICAgJ2wxJyAgICAgICAgICAgICAgICAgOiAnbGF0aW5fMScsCisgICAgJ2xhdGluJyAgICAgICAgICAgICAgOiAnbGF0aW5fMScsCisgICAgJ2xhdGluMScgICAgICAgICAgICAgOiAnbGF0aW5fMScsCisKKyAgICAjIG1hY19jeXJpbGxpYyBjb2RlYworICAgICdtYWNjeXJpbGxpYycgICAgICAgIDogJ21hY19jeXJpbGxpYycsCisKKyAgICAjIG1hY19ncmVlayBjb2RlYworICAgICdtYWNncmVlaycgICAgICAgICAgIDogJ21hY19ncmVlaycsCisKKyAgICAjIG1hY19pY2VsYW5kIGNvZGVjCisgICAgJ21hY2ljZWxhbmQnICAgICAgICAgOiAnbWFjX2ljZWxhbmQnLAorCisgICAgIyBtYWNfbGF0aW4yIGNvZGVjCisgICAgJ21hY2NlbnRyYWxldXJvcGUnICAgOiAnbWFjX2xhdGluMicsCisgICAgJ21hY2xhdGluMicgICAgICAgICAgOiAnbWFjX2xhdGluMicsCisKKyAgICAjIG1hY19yb21hbiBjb2RlYworICAgICdtYWNyb21hbicgICAgICAgICAgIDogJ21hY19yb21hbicsCisKKyAgICAjIG1hY190dXJraXNoIGNvZGVjCisgICAgJ21hY3R1cmtpc2gnICAgICAgICAgOiAnbWFjX3R1cmtpc2gnLAorCisgICAgIyBtYmNzIGNvZGVjCisgICAgJ2RiY3MnICAgICAgICAgICAgICAgOiAnbWJjcycsCisKKyAgICAjIHB0Y3AxNTQgY29kZWMKKyAgICAnY3NwdGNwMTU0JyAgICAgICAgICA6ICdwdGNwMTU0JywKKyAgICAncHQxNTQnICAgICAgICAgICAgICA6ICdwdGNwMTU0JywKKyAgICAnY3AxNTQnICAgICAgICAgICAgICA6ICdwdGNwMTU0JywKKyAgICAnY3lyaWxsaWNfYXNpYW4nICAgICA6ICdwdGNwMTU0JywKKworICAgICMgcXVvcHJpX2NvZGVjIGNvZGVjCisgICAgJ3F1b3ByaScgICAgICAgICAgICAgOiAncXVvcHJpX2NvZGVjJywKKyAgICAncXVvdGVkX3ByaW50YWJsZScgICA6ICdxdW9wcmlfY29kZWMnLAorICAgICdxdW90ZWRwcmludGFibGUnICAgIDogJ3F1b3ByaV9jb2RlYycsCisKKyAgICAjIHJvdF8xMyBjb2RlYworICAgICdyb3QxMycgICAgICAgICAgICAgIDogJ3JvdF8xMycsCisKKyAgICAjIHNoaWZ0X2ppcyBjb2RlYworICAgICdjc3NoaWZ0amlzJyAgICAgICAgIDogJ3NoaWZ0X2ppcycsCisgICAgJ3NoaWZ0amlzJyAgICAgICAgICAgOiAnc2hpZnRfamlzJywKKyAgICAnc2ppcycgICAgICAgICAgICAgICA6ICdzaGlmdF9qaXMnLAorICAgICdzX2ppcycgICAgICAgICAgICAgIDogJ3NoaWZ0X2ppcycsCisKKyAgICAjIHNoaWZ0X2ppc18yMDA0IGNvZGVjCisgICAgJ3NoaWZ0amlzMjAwNCcgICAgICAgOiAnc2hpZnRfamlzXzIwMDQnLAorICAgICdzamlzXzIwMDQnICAgICAgICAgIDogJ3NoaWZ0X2ppc18yMDA0JywKKyAgICAnc19qaXNfMjAwNCcgICAgICAgICA6ICdzaGlmdF9qaXNfMjAwNCcsCisKKyAgICAjIHNoaWZ0X2ppc3gwMjEzIGNvZGVjCisgICAgJ3NoaWZ0amlzeDAyMTMnICAgICAgOiAnc2hpZnRfamlzeDAyMTMnLAorICAgICdzamlzeDAyMTMnICAgICAgICAgIDogJ3NoaWZ0X2ppc3gwMjEzJywKKyAgICAnc19qaXN4MDIxMycgICAgICAgICA6ICdzaGlmdF9qaXN4MDIxMycsCisKKyAgICAjIHRhY3RpcyBjb2RlYworICAgICd0aXMyNjAnICAgICAgICAgICAgIDogJ3RhY3RpcycsCisKKyAgICAjIHRpc182MjAgY29kZWMKKyAgICAndGlzNjIwJyAgICAgICAgICAgICA6ICd0aXNfNjIwJywKKyAgICAndGlzXzYyMF8wJyAgICAgICAgICA6ICd0aXNfNjIwJywKKyAgICAndGlzXzYyMF8yNTI5XzAnICAgICA6ICd0aXNfNjIwJywKKyAgICAndGlzXzYyMF8yNTI5XzEnICAgICA6ICd0aXNfNjIwJywKKyAgICAnaXNvX2lyXzE2NicgICAgICAgICA6ICd0aXNfNjIwJywKKworICAgICMgdXRmXzE2IGNvZGVjCisgICAgJ3UxNicgICAgICAgICAgICAgICAgOiAndXRmXzE2JywKKyAgICAndXRmMTYnICAgICAgICAgICAgICA6ICd1dGZfMTYnLAorCisgICAgIyB1dGZfMTZfYmUgY29kZWMKKyAgICAndW5pY29kZWJpZ3VubWFya2VkJyA6ICd1dGZfMTZfYmUnLAorICAgICd1dGZfMTZiZScgICAgICAgICAgIDogJ3V0Zl8xNl9iZScsCisKKyAgICAjIHV0Zl8xNl9sZSBjb2RlYworICAgICd1bmljb2RlbGl0dGxldW5tYXJrZWQnIDogJ3V0Zl8xNl9sZScsCisgICAgJ3V0Zl8xNmxlJyAgICAgICAgICAgOiAndXRmXzE2X2xlJywKKworICAgICMgdXRmXzMyIGNvZGVjCisgICAgJ3UzMicgICAgICAgICAgICAgICAgOiAndXRmXzMyJywKKyAgICAndXRmMzInICAgICAgICAgICAgICA6ICd1dGZfMzInLAorCisgICAgIyB1dGZfMzJfYmUgY29kZWMKKyAgICAndXRmXzMyYmUnICAgICAgICAgICA6ICd1dGZfMzJfYmUnLAorCisgICAgIyB1dGZfMzJfbGUgY29kZWMKKyAgICAndXRmXzMybGUnICAgICAgICAgICA6ICd1dGZfMzJfbGUnLAorCisgICAgIyB1dGZfNyBjb2RlYworICAgICd1NycgICAgICAgICAgICAgICAgIDogJ3V0Zl83JywKKyAgICAndXRmNycgICAgICAgICAgICAgICA6ICd1dGZfNycsCisgICAgJ3VuaWNvZGVfMV8xX3V0Zl83JyAgOiAndXRmXzcnLAorCisgICAgIyB1dGZfOCBjb2RlYworICAgICd1OCcgICAgICAgICAgICAgICAgIDogJ3V0Zl84JywKKyAgICAndXRmJyAgICAgICAgICAgICAgICA6ICd1dGZfOCcsCisgICAgJ3V0ZjgnICAgICAgICAgICAgICAgOiAndXRmXzgnLAorICAgICd1dGY4X3VjczInICAgICAgICAgIDogJ3V0Zl84JywKKyAgICAndXRmOF91Y3M0JyAgICAgICAgICA6ICd1dGZfOCcsCisKKyAgICAjIHV1X2NvZGVjIGNvZGVjCisgICAgJ3V1JyAgICAgICAgICAgICAgICAgOiAndXVfY29kZWMnLAorCisgICAgIyB6bGliX2NvZGVjIGNvZGVjCisgICAgJ3ppcCcgICAgICAgICAgICAgICAgOiAnemxpYl9jb2RlYycsCisgICAgJ3psaWInICAgICAgICAgICAgICAgOiAnemxpYl9jb2RlYycsCisKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2FsaWFzZXMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYWxpYXNlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiNTU5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2FsaWFzZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2FsaWFzZXMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYWxpYXNlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiNTU5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2FsaWFzZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2FzY2lpLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYXNjaWkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzM2NkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2FzY2lpLnB5CkBAIC0wLDAgKzEsNTAgQEAKKyIiIiBQeXRob24gJ2FzY2lpJyBDb2RlYworCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgICMgTm90ZTogQmluZGluZyB0aGVzZSBhcyBDIGZ1bmN0aW9ucyB3aWxsIHJlc3VsdCBpbiB0aGUgY2xhc3Mgbm90CisgICAgIyBjb252ZXJ0aW5nIHRoZW0gdG8gbWV0aG9kcy4gVGhpcyBpcyBpbnRlbmRlZC4KKyAgICBlbmNvZGUgPSBjb2RlY3MuYXNjaWlfZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWNzLmFzY2lpX2RlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmFzY2lpX2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuYXNjaWlfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtQ29udmVydGVyKFN0cmVhbVdyaXRlcixTdHJlYW1SZWFkZXIpOgorCisgICAgZW5jb2RlID0gY29kZWNzLmFzY2lpX2RlY29kZQorICAgIGRlY29kZSA9IGNvZGVjcy5hc2NpaV9lbmNvZGUKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdhc2NpaScsCisgICAgICAgIGVuY29kZT1Db2RlYy5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYy5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYXNjaWkucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYXNjaWkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Zjg4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9hc2NpaS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYXNjaWkucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYXNjaWkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1Zjg4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9hc2NpaS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmFzZTY0X2NvZGVjLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmFzZTY0X2NvZGVjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NGU3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iYXNlNjRfY29kZWMucHkKQEAgLTAsMCArMSw3OSBAQAorIiIiIFB5dGhvbiAnYmFzZTY0X2NvZGVjJyBDb2RlYyAtIGJhc2U2NCBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nCisKKyAgICBVbmxpa2UgbW9zdCBvZiB0aGUgb3RoZXIgY29kZWNzIHdoaWNoIHRhcmdldCBVbmljb2RlLCB0aGlzIGNvZGVjCisgICAgd2lsbCByZXR1cm4gUHl0aG9uIHN0cmluZyBvYmplY3RzIGZvciBib3RoIGVuY29kZSBhbmQgZGVjb2RlLgorCisgICAgV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyIiIgoraW1wb3J0IGNvZGVjcywgYmFzZTY0CisKKyMjIyBDb2RlYyBBUElzCisKK2RlZiBiYXNlNjRfZW5jb2RlKGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAiIiIgRW5jb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAorICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCisKKyAgICAgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bworICAgICAgICAnc3RyaWN0JyBoYW5kbGluZyB3aGljaCBpcyB0aGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgorCisgICAgIiIiCisgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgIG91dHB1dCA9IGJhc2U2NC5lbmNvZGVzdHJpbmcoaW5wdXQpCisgICAgcmV0dXJuIChvdXRwdXQsIGxlbihpbnB1dCkpCisKK2RlZiBiYXNlNjRfZGVjb2RlKGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAiIiIgRGVjb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAorICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCisKKyAgICAgICAgaW5wdXQgbXVzdCBiZSBhbiBvYmplY3Qgd2hpY2ggcHJvdmlkZXMgdGhlIGJmX2dldHJlYWRidWYKKyAgICAgICAgYnVmZmVyIHNsb3QuIFB5dGhvbiBzdHJpbmdzLCBidWZmZXIgb2JqZWN0cyBhbmQgbWVtb3J5CisgICAgICAgIG1hcHBlZCBmaWxlcyBhcmUgZXhhbXBsZXMgb2Ygb2JqZWN0cyBwcm92aWRpbmcgdGhpcyBzbG90LgorCisgICAgICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KKyAgICAgICAgJ3N0cmljdCcgaGFuZGxpbmcgd2hpY2ggaXMgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZAorICAgICAgICBlcnJvciBoYW5kbGluZyBmb3IgdGhpcyBjb2RlYy4KKworICAgICIiIgorICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKKyAgICBvdXRwdXQgPSBiYXNlNjQuZGVjb2Rlc3RyaW5nKGlucHV0KQorICAgIHJldHVybiAob3V0cHV0LCBsZW4oaW5wdXQpKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gYmFzZTY0X2VuY29kZShpbnB1dCxlcnJvcnMpCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gYmFzZTY0X2RlY29kZShpbnB1dCxlcnJvcnMpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIGFzc2VydCBzZWxmLmVycm9ycyA9PSAnc3RyaWN0JworICAgICAgICByZXR1cm4gYmFzZTY0LmVuY29kZXN0cmluZyhpbnB1dCkKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuZXJyb3JzID09ICdzdHJpY3QnCisgICAgICAgIHJldHVybiBiYXNlNjQuZGVjb2Rlc3RyaW5nKGlucHV0KQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2Jhc2U2NCcsCisgICAgICAgIGVuY29kZT1iYXNlNjRfZW5jb2RlLAorICAgICAgICBkZWNvZGU9YmFzZTY0X2RlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iYXNlNjRfY29kZWMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmFzZTY0X2NvZGVjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTJkYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmFzZTY0X2NvZGVjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iYXNlNjRfY29kZWMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmFzZTY0X2NvZGVjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2IwNzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmFzZTY0X2NvZGVjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iaWc1LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWRlYjBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNS5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIGJpZzUucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBCSUc1CisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc190dywgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfdHcuZ2V0Y29kZWMoJ2JpZzUnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nYmlnNScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2JpZzUucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhNTk0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2JpZzUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2JpZzUucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhNTk0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2JpZzUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2JpZzVoa3Njcy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2JpZzVoa3Njcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTBkZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNWhrc2NzLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgYmlnNWhrc2NzLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgQklHNUhLU0NTCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19oaywgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfaGsuZ2V0Y29kZWMoJ2JpZzVoa3NjcycpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdiaWc1aGtzY3MnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iaWc1aGtzY3MucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNWhrc2NzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDJlMGMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNWhrc2NzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iaWc1aGtzY3MucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNWhrc2NzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDJlMGMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNWhrc2NzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iejJfY29kZWMucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iejJfY29kZWMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0YjM2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2J6Ml9jb2RlYy5weQpAQCAtMCwwICsxLDEwMiBAQAorIiIiIFB5dGhvbiAnYnoyX2NvZGVjJyBDb2RlYyAtIGJ6MiBjb21wcmVzc2lvbiBlbmNvZGluZworCisgICAgVW5saWtlIG1vc3Qgb2YgdGhlIG90aGVyIGNvZGVjcyB3aGljaCB0YXJnZXQgVW5pY29kZSwgdGhpcyBjb2RlYworICAgIHdpbGwgcmV0dXJuIFB5dGhvbiBzdHJpbmcgb2JqZWN0cyBmb3IgYm90aCBlbmNvZGUgYW5kIGRlY29kZS4KKworICAgIEFkYXB0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIgZnJvbSB6bGliX2NvZGVjLnB5IHdoaWNoIHdhcyB3cml0dGVuCisgICAgYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisiIiIKK2ltcG9ydCBjb2RlY3MKK2ltcG9ydCBiejIgIyB0aGlzIGNvZGVjIG5lZWRzIHRoZSBvcHRpb25hbCBiejIgbW9kdWxlICEKKworIyMjIENvZGVjIEFQSXMKKworZGVmIGJ6Ml9lbmNvZGUoaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKworICAgICIiIiBFbmNvZGVzIHRoZSBvYmplY3QgaW5wdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0CisgICAgICAgIG9iamVjdCwgbGVuZ3RoIGNvbnN1bWVkKS4KKworICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCisgICAgICAgICdzdHJpY3QnIGhhbmRsaW5nIHdoaWNoIGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICAgICAgZXJyb3IgaGFuZGxpbmcgZm9yIHRoaXMgY29kZWMuCisKKyAgICAiIiIKKyAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCisgICAgb3V0cHV0ID0gYnoyLmNvbXByZXNzKGlucHV0KQorICAgIHJldHVybiAob3V0cHV0LCBsZW4oaW5wdXQpKQorCitkZWYgYnoyX2RlY29kZShpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorCisgICAgIiIiIERlY29kZXMgdGhlIG9iamVjdCBpbnB1dCBhbmQgcmV0dXJucyBhIHR1cGxlIChvdXRwdXQKKyAgICAgICAgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgorCisgICAgICAgIGlucHV0IG11c3QgYmUgYW4gb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBiZl9nZXRyZWFkYnVmCisgICAgICAgIGJ1ZmZlciBzbG90LiBQeXRob24gc3RyaW5ncywgYnVmZmVyIG9iamVjdHMgYW5kIG1lbW9yeQorICAgICAgICBtYXBwZWQgZmlsZXMgYXJlIGV4YW1wbGVzIG9mIG9iamVjdHMgcHJvdmlkaW5nIHRoaXMgc2xvdC4KKworICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCisgICAgICAgICdzdHJpY3QnIGhhbmRsaW5nIHdoaWNoIGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICAgICAgZXJyb3IgaGFuZGxpbmcgZm9yIHRoaXMgY29kZWMuCisKKyAgICAiIiIKKyAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCisgICAgb3V0cHV0ID0gYnoyLmRlY29tcHJlc3MoaW5wdXQpCisgICAgcmV0dXJuIChvdXRwdXQsIGxlbihpbnB1dCkpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gYnoyX2VuY29kZShpbnB1dCwgZXJyb3JzKQorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBiejJfZGVjb2RlKGlucHV0LCBlcnJvcnMpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycworICAgICAgICBzZWxmLmNvbXByZXNzb2JqID0gYnoyLkJaMkNvbXByZXNzb3IoKQorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICBpZiBmaW5hbDoKKyAgICAgICAgICAgIGMgPSBzZWxmLmNvbXByZXNzb2JqLmNvbXByZXNzKGlucHV0KQorICAgICAgICAgICAgcmV0dXJuIGMgKyBzZWxmLmNvbXByZXNzb2JqLmZsdXNoKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbXByZXNzb2JqLmNvbXByZXNzKGlucHV0KQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbXByZXNzb2JqID0gYnoyLkJaMkNvbXByZXNzb3IoKQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKKyAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKKyAgICAgICAgc2VsZi5kZWNvbXByZXNzb2JqID0gYnoyLkJaMkRlY29tcHJlc3NvcigpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlY29tcHJlc3NvYmouZGVjb21wcmVzcyhpbnB1dCkKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgcmV0dXJuICcnCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuZGVjb21wcmVzc29iaiA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9ImJ6MiIsCisgICAgICAgIGVuY29kZT1iejJfZW5jb2RlLAorICAgICAgICBkZWNvZGU9YnoyX2RlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iejJfY29kZWMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYnoyX2NvZGVjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmIwNTIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYnoyX2NvZGVjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iejJfY29kZWMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYnoyX2NvZGVjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA5ZDVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYnoyX2NvZGVjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jaGFybWFwLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY2hhcm1hcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTE4OWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY2hhcm1hcC5weQpAQCAtMCwwICsxLDY5IEBACisiIiIgR2VuZXJpYyBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMuCisKKyAgICBVc2UgdGhpcyBjb2RlYyBkaXJlY3RseSByYXRoZXIgdGhhbiB0aHJvdWdoIHRoZSBhdXRvbWF0aWMKKyAgICBjb252ZXJzaW9uIG1lY2hhbmlzbXMgc3VwcGxpZWQgYnkgdW5pY29kZSgpIGFuZCAuZW5jb2RlKCkuCisKKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgICMgTm90ZTogQmluZGluZyB0aGVzZSBhcyBDIGZ1bmN0aW9ucyB3aWxsIHJlc3VsdCBpbiB0aGUgY2xhc3Mgbm90CisgICAgIyBjb252ZXJ0aW5nIHRoZW0gdG8gbWV0aG9kcy4gVGhpcyBpcyBpbnRlbmRlZC4KKyAgICBlbmNvZGUgPSBjb2RlY3MuY2hhcm1hcF9lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlY3MuY2hhcm1hcF9kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcsIG1hcHBpbmc9Tm9uZSk6CisgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIuX19pbml0X18oc2VsZiwgZXJyb3JzKQorICAgICAgICBzZWxmLm1hcHBpbmcgPSBtYXBwaW5nCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzLCBzZWxmLm1hcHBpbmcpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnLCBtYXBwaW5nPU5vbmUpOgorICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyLl9faW5pdF9fKHNlbGYsIGVycm9ycykKKyAgICAgICAgc2VsZi5tYXBwaW5nID0gbWFwcGluZworCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycywgc2VsZi5tYXBwaW5nKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZixzdHJlYW0sZXJyb3JzPSdzdHJpY3QnLG1hcHBpbmc9Tm9uZSk6CisgICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZixzdHJlYW0sZXJyb3JzKQorICAgICAgICBzZWxmLm1hcHBpbmcgPSBtYXBwaW5nCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIENvZGVjLmVuY29kZShpbnB1dCxlcnJvcnMsc2VsZi5tYXBwaW5nKQorCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZixzdHJlYW0sZXJyb3JzPSdzdHJpY3QnLG1hcHBpbmc9Tm9uZSk6CisgICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZixzdHJlYW0sZXJyb3JzKQorICAgICAgICBzZWxmLm1hcHBpbmcgPSBtYXBwaW5nCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIENvZGVjLmRlY29kZShpbnB1dCxlcnJvcnMsc2VsZi5tYXBwaW5nKQorCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NoYXJtYXAnLAorICAgICAgICBlbmNvZGU9Q29kZWMuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NoYXJtYXAucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY2hhcm1hcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyZDEyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NoYXJtYXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NoYXJtYXAucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY2hhcm1hcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyZDEyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NoYXJtYXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMDM3LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AwMzcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwMmI4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMDM3LnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwMDM3IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9FQkNESUMvQ1AwMzcuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3AwMzcnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4OWMnICAgICAjICAweDA0IC0+IENPTlRST0wKKyAgICB1J1x0JyAgICAgICAjICAweDA1IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXHg4NicgICAgICMgIDB4MDYgLT4gQ09OVFJPTAorICAgIHUnXHg3ZicgICAgICMgIDB4MDcgLT4gREVMRVRFCisgICAgdSdceDk3JyAgICAgIyAgMHgwOCAtPiBDT05UUk9MCisgICAgdSdceDhkJyAgICAgIyAgMHgwOSAtPiBDT05UUk9MCisgICAgdSdceDhlJyAgICAgIyAgMHgwQSAtPiBDT05UUk9MCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDlkJyAgICAgIyAgMHgxNCAtPiBDT05UUk9MCisgICAgdSdceDg1JyAgICAgIyAgMHgxNSAtPiBDT05UUk9MCisgICAgdSdceDA4JyAgICAgIyAgMHgxNiAtPiBCQUNLU1BBQ0UKKyAgICB1J1x4ODcnICAgICAjICAweDE3IC0+IENPTlRST0wKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHg5MicgICAgICMgIDB4MUEgLT4gQ09OVFJPTAorICAgIHUnXHg4ZicgICAgICMgIDB4MUIgLT4gQ09OVFJPTAorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1J1x4ODAnICAgICAjICAweDIwIC0+IENPTlRST0wKKyAgICB1J1x4ODEnICAgICAjICAweDIxIC0+IENPTlRST0wKKyAgICB1J1x4ODInICAgICAjICAweDIyIC0+IENPTlRST0wKKyAgICB1J1x4ODMnICAgICAjICAweDIzIC0+IENPTlRST0wKKyAgICB1J1x4ODQnICAgICAjICAweDI0IC0+IENPTlRST0wKKyAgICB1J1xuJyAgICAgICAjICAweDI1IC0+IExJTkUgRkVFRAorICAgIHUnXHgxNycgICAgICMgIDB4MjYgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxYicgICAgICMgIDB4MjcgLT4gRVNDQVBFCisgICAgdSdceDg4JyAgICAgIyAgMHgyOCAtPiBDT05UUk9MCisgICAgdSdceDg5JyAgICAgIyAgMHgyOSAtPiBDT05UUk9MCisgICAgdSdceDhhJyAgICAgIyAgMHgyQSAtPiBDT05UUk9MCisgICAgdSdceDhiJyAgICAgIyAgMHgyQiAtPiBDT05UUk9MCisgICAgdSdceDhjJyAgICAgIyAgMHgyQyAtPiBDT05UUk9MCisgICAgdSdceDA1JyAgICAgIyAgMHgyRCAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgyRSAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MkYgLT4gQkVMTAorICAgIHUnXHg5MCcgICAgICMgIDB4MzAgLT4gQ09OVFJPTAorICAgIHUnXHg5MScgICAgICMgIDB4MzEgLT4gQ09OVFJPTAorICAgIHUnXHgxNicgICAgICMgIDB4MzIgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHg5MycgICAgICMgIDB4MzMgLT4gQ09OVFJPTAorICAgIHUnXHg5NCcgICAgICMgIDB4MzQgLT4gQ09OVFJPTAorICAgIHUnXHg5NScgICAgICMgIDB4MzUgLT4gQ09OVFJPTAorICAgIHUnXHg5NicgICAgICMgIDB4MzYgLT4gQ09OVFJPTAorICAgIHUnXHgwNCcgICAgICMgIDB4MzcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHg5OCcgICAgICMgIDB4MzggLT4gQ09OVFJPTAorICAgIHUnXHg5OScgICAgICMgIDB4MzkgLT4gQ09OVFJPTAorICAgIHUnXHg5YScgICAgICMgIDB4M0EgLT4gQ09OVFJPTAorICAgIHUnXHg5YicgICAgICMgIDB4M0IgLT4gQ09OVFJPTAorICAgIHUnXHgxNCcgICAgICMgIDB4M0MgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4M0QgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4OWUnICAgICAjICAweDNFIC0+IENPTlRST0wKKyAgICB1J1x4MWEnICAgICAjICAweDNGIC0+IFNVQlNUSVRVVEUKKyAgICB1JyAnICAgICAgICAjICAweDQwIC0+IFNQQUNFCisgICAgdSdceGEwJyAgICAgIyAgMHg0MSAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHhlMicgICAgICMgIDB4NDIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU0JyAgICAgIyAgMHg0MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMCcgICAgICMgIDB4NDQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMScgICAgICMgIDB4NDUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMycgICAgICMgIDB4NDYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhlNScgICAgICMgIDB4NDcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU3JyAgICAgIyAgMHg0OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZjEnICAgICAjICAweDQ5IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4YTInICAgICAjICAweDRBIC0+IENFTlQgU0lHTgorICAgIHUnLicgICAgICAgICMgIDB4NEIgLT4gRlVMTCBTVE9QCisgICAgdSc8JyAgICAgICAgIyAgMHg0QyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnKCcgICAgICAgICMgIDB4NEQgLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKycgICAgICAgICMgIDB4NEUgLT4gUExVUyBTSUdOCisgICAgdSd8JyAgICAgICAgIyAgMHg0RiAtPiBWRVJUSUNBTCBMSU5FCisgICAgdScmJyAgICAgICAgIyAgMHg1MCAtPiBBTVBFUlNBTkQKKyAgICB1J1x4ZTknICAgICAjICAweDUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZWEnICAgICAjICAweDUyIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4NTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTgnICAgICAjICAweDU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZWQnICAgICAjICAweDU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZWUnICAgICAjICAweDU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4NTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWMnICAgICAjICAweDU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZGYnICAgICAjICAweDU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHRVJNQU4pCisgICAgdSchJyAgICAgICAgIyAgMHg1QSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSckJyAgICAgICAgIyAgMHg1QiAtPiBET0xMQVIgU0lHTgorICAgIHUnKicgICAgICAgICMgIDB4NUMgLT4gQVNURVJJU0sKKyAgICB1JyknICAgICAgICAjICAweDVEIC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdSc7JyAgICAgICAgIyAgMHg1RSAtPiBTRU1JQ09MT04KKyAgICB1J1x4YWMnICAgICAjICAweDVGIC0+IE5PVCBTSUdOCisgICAgdSctJyAgICAgICAgIyAgMHg2MCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy8nICAgICAgICAjICAweDYxIC0+IFNPTElEVVMKKyAgICB1J1x4YzInICAgICAjICAweDYyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGM0JyAgICAgIyAgMHg2MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGMwJyAgICAgIyAgMHg2NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzEnICAgICAjICAweDY1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMycgICAgICMgIDB4NjYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGM1JyAgICAgIyAgMHg2NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNycgICAgICMgIDB4NjggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZDEnICAgICAjICAweDY5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhhNicgICAgICMgIDB4NkEgLT4gQlJPS0VOIEJBUgorICAgIHUnLCcgICAgICAgICMgIDB4NkIgLT4gQ09NTUEKKyAgICB1JyUnICAgICAgICAjICAweDZDIC0+IFBFUkNFTlQgU0lHTgorICAgIHUnXycgICAgICAgICMgIDB4NkQgLT4gTE9XIExJTkUKKyAgICB1Jz4nICAgICAgICAjICAweDZFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHg2RiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdceGY4JyAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhjOScgICAgICMgIDB4NzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGNhJyAgICAgIyAgMHg3MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjYicgICAgICMgIDB4NzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjOCcgICAgICMgIDB4NzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGNkJyAgICAgIyAgMHg3NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweDc2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHg3NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHg3OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J2AnICAgICAgICAjICAweDc5IC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnOicgICAgICAgICMgIDB4N0EgLT4gQ09MT04KKyAgICB1JyMnICAgICAgICAjICAweDdCIC0+IE5VTUJFUiBTSUdOCisgICAgdSdAJyAgICAgICAgIyAgMHg3QyAtPiBDT01NRVJDSUFMIEFUCisgICAgdSInIiAgICAgICAgIyAgMHg3RCAtPiBBUE9TVFJPUEhFCisgICAgdSc9JyAgICAgICAgIyAgMHg3RSAtPiBFUVVBTFMgU0lHTgorICAgIHUnIicgICAgICAgICMgIDB4N0YgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZDgnICAgICAjICAweDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J2EnICAgICAgICAjICAweDgxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4ODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDg0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg4NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4ODYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4ODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J1x4YWInICAgICAjICAweDhBIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHg4QiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZjAnICAgICAjICAweDhDIC0+IExBVElOIFNNQUxMIExFVFRFUiBFVEggKElDRUxBTkRJQykKKyAgICB1J1x4ZmQnICAgICAjICAweDhEIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZmUnICAgICAjICAweDhFIC0+IExBVElOIFNNQUxMIExFVFRFUiBUSE9STiAoSUNFTEFORElDKQorICAgIHUnXHhiMScgICAgICMgIDB4OEYgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdceGIwJyAgICAgIyAgMHg5MCAtPiBERUdSRUUgU0lHTgorICAgIHUnaicgICAgICAgICMgIDB4OTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDkyIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4OTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4OTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDk4IC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg5OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUnXHhhYScgICAgICMgIDB4OUEgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmEnICAgICAjICAweDlCIC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhlNicgICAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICB1J1x4YjgnICAgICAjICAweDlEIC0+IENFRElMTEEKKyAgICB1J1x4YzYnICAgICAjICAweDlFIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICB1J1x4YTQnICAgICAjICAweDlGIC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4YjUnICAgICAjICAweEEwIC0+IE1JQ1JPIFNJR04KKyAgICB1J34nICAgICAgICAjICAweEExIC0+IFRJTERFCisgICAgdSdzJyAgICAgICAgIyAgMHhBMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4QTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweEE0IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHhBNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4QTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweEE3IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHhBOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4QTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J1x4YTEnICAgICAjICAweEFBIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YmYnICAgICAjICAweEFCIC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4ZDAnICAgICAjICAweEFDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEVUSCAoSUNFTEFORElDKQorICAgIHUnXHhkZCcgICAgICMgIDB4QUQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGRlJyAgICAgIyAgMHhBRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STiAoSUNFTEFORElDKQorICAgIHUnXHhhZScgICAgICMgIDB4QUYgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdeJyAgICAgICAgIyAgMHhCMCAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXHhhMycgICAgICMgIDB4QjEgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhhNScgICAgICMgIDB4QjIgLT4gWUVOIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEIzIC0+IE1JRERMRSBET1QKKyAgICB1J1x4YTknICAgICAjICAweEI0IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdceGE3JyAgICAgIyAgMHhCNSAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YjYnICAgICAjICAweEI2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhiYycgICAgICMgIDB4QjcgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGJkJyAgICAgIyAgMHhCOCAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmUnICAgICAjICAweEI5IC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnWycgICAgICAgICMgIDB4QkEgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXScgICAgICAgICMgIDB4QkIgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1x4YWYnICAgICAjICAweEJDIC0+IE1BQ1JPTgorICAgIHUnXHhhOCcgICAgICMgIDB4QkQgLT4gRElBRVJFU0lTCisgICAgdSdceGI0JyAgICAgIyAgMHhCRSAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4ZDcnICAgICAjICAweEJGIC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J3snICAgICAgICAjICAweEMwIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnQScgICAgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4QzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4QzkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnXHhhZCcgICAgICMgIDB4Q0EgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4ZjQnICAgICAjICAweENCIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNicgICAgICMgIDB4Q0MgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjInICAgICAjICAweENEIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjMnICAgICAjICAweENFIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZjUnICAgICAjICAweENGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J30nICAgICAgICAjICAweEQwIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J0onICAgICAgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweEQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweEQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1x4YjknICAgICAjICAweERBIC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhmYicgICAgICMgIDB4REIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHhEQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmOScgICAgICMgIDB4REQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYScgICAgICMgIDB4REUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmZicgICAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1xcJyAgICAgICAjICAweEUwIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXHhmNycgICAgICMgIDB4RTEgLT4gRElWSVNJT04gU0lHTgorICAgIHUnUycgICAgICAgICMgIDB4RTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4RTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4RTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4RTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4RTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4RTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4RTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4RTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnXHhiMicgICAgICMgIDB4RUEgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGQ0JyAgICAgIyAgMHhFQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkNicgICAgICMgIDB4RUMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkMicgICAgICMgIDB4RUQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGQzJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDUnICAgICAjICAweEVGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnMCcgICAgICAgICMgIDB4RjAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4RjEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHhGMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweEYzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHhGNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHhGNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHhGNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweEY3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHhGOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4RjkgLT4gRElHSVQgTklORQorICAgIHUnXHhiMycgICAgICMgIDB4RkEgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4ZGInICAgICAjICAweEZCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGRjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ5JyAgICAgIyAgMHhGRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweEZFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHg5ZicgICAgICMgIDB4RkYgLT4gQ09OVFJPTAorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AwMzcucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AwMzcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWI3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDAzNy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AwMzcucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AwMzcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWI3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDAzNy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMDA2LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMDA2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMWU4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMDYucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3AxMDA2IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL01JU0MvQ1AxMDA2LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwMTAwNicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MDZmMCcgICAjICAweEExIC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPCisgICAgdSdcdTA2ZjEnICAgIyAgMHhBMiAtPiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgT05FCisgICAgdSdcdTA2ZjInICAgIyAgMHhBMyAtPiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgVFdPCisgICAgdSdcdTA2ZjMnICAgIyAgMHhBNCAtPiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgVEhSRUUKKyAgICB1J1x1MDZmNCcgICAjICAweEE1IC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBGT1VSCisgICAgdSdcdTA2ZjUnICAgIyAgMHhBNiAtPiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgRklWRQorICAgIHUnXHUwNmY2JyAgICMgIDB4QTcgLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFNJWAorICAgIHUnXHUwNmY3JyAgICMgIDB4QTggLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFNFVkVOCisgICAgdSdcdTA2ZjgnICAgIyAgMHhBOSAtPiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgRUlHSFQKKyAgICB1J1x1MDZmOScgICAjICAweEFBIC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBOSU5FCisgICAgdSdcdTA2MGMnICAgIyAgMHhBQiAtPiBBUkFCSUMgQ09NTUEKKyAgICB1J1x1MDYxYicgICAjICAweEFDIC0+IEFSQUJJQyBTRU1JQ09MT04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdcdTA2MWYnICAgIyAgMHhBRSAtPiBBUkFCSUMgUVVFU1RJT04gTUFSSworICAgIHUnXHVmZTgxJyAgICMgIDB4QUYgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZThkJyAgICMgIDB4QjAgLT4gQVJBQklDIExFVFRFUiBBTEVGIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmU4ZScgICAjICAweEIxIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBGSU5BTCBGT1JNCisgICAgdSdcdWZlOGUnICAgIyAgMHhCMiAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgRklOQUwgRk9STQorICAgIHUnXHVmZThmJyAgICMgIDB4QjMgLT4gQVJBQklDIExFVFRFUiBCRUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZTkxJyAgICMgIDB4QjQgLT4gQVJBQklDIExFVFRFUiBCRUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZiNTYnICAgIyAgMHhCNSAtPiBBUkFCSUMgTEVUVEVSIFBFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZiNTgnICAgIyAgMHhCNiAtPiBBUkFCSUMgTEVUVEVSIFBFSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmU5MycgICAjICAweEI3IC0+IEFSQUJJQyBMRVRURVIgVEVIIE1BUkJVVEEgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZTk1JyAgICMgIDB4QjggLT4gQVJBQklDIExFVFRFUiBURUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZTk3JyAgICMgIDB4QjkgLT4gQVJBQklDIExFVFRFUiBURUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZiNjYnICAgIyAgMHhCQSAtPiBBUkFCSUMgTEVUVEVSIFRURUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmYjY4JyAgICMgIDB4QkIgLT4gQVJBQklDIExFVFRFUiBUVEVIIElOSVRJQUwgRk9STQorICAgIHUnXHVmZTk5JyAgICMgIDB4QkMgLT4gQVJBQklDIExFVFRFUiBUSEVIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmU5YicgICAjICAweEJEIC0+IEFSQUJJQyBMRVRURVIgVEhFSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmU5ZCcgICAjICAweEJFIC0+IEFSQUJJQyBMRVRURVIgSkVFTSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlOWYnICAgIyAgMHhCRiAtPiBBUkFCSUMgTEVUVEVSIEpFRU0gSU5JVElBTCBGT1JNCisgICAgdSdcdWZiN2EnICAgIyAgMHhDMCAtPiBBUkFCSUMgTEVUVEVSIFRDSEVIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmI3YycgICAjICAweEMxIC0+IEFSQUJJQyBMRVRURVIgVENIRUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZlYTEnICAgIyAgMHhDMiAtPiBBUkFCSUMgTEVUVEVSIEhBSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYTMnICAgIyAgMHhDMyAtPiBBUkFCSUMgTEVUVEVSIEhBSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVhNScgICAjICAweEM0IC0+IEFSQUJJQyBMRVRURVIgS0hBSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYTcnICAgIyAgMHhDNSAtPiBBUkFCSUMgTEVUVEVSIEtIQUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZlYTknICAgIyAgMHhDNiAtPiBBUkFCSUMgTEVUVEVSIERBTCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZiODQnICAgIyAgMHhDNyAtPiBBUkFCSUMgTEVUVEVSIERBSEFMIElTT0xBVEVEIEZPUk1OCisgICAgdSdcdWZlYWInICAgIyAgMHhDOCAtPiBBUkFCSUMgTEVUVEVSIFRIQUwgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWFkJyAgICMgIDB4QzkgLT4gQVJBQklDIExFVFRFUiBSRUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmYjhjJyAgICMgIDB4Q0EgLT4gQVJBQklDIExFVFRFUiBSUkVIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVhZicgICAjICAweENCIC0+IEFSQUJJQyBMRVRURVIgWkFJTiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZiOGEnICAgIyAgMHhDQyAtPiBBUkFCSUMgTEVUVEVSIEpFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYjEnICAgIyAgMHhDRCAtPiBBUkFCSUMgTEVUVEVSIFNFRU4gSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWIzJyAgICMgIDB4Q0UgLT4gQVJBQklDIExFVFRFUiBTRUVOIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWI1JyAgICMgIDB4Q0YgLT4gQVJBQklDIExFVFRFUiBTSEVFTiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYjcnICAgIyAgMHhEMCAtPiBBUkFCSUMgTEVUVEVSIFNIRUVOIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWI5JyAgICMgIDB4RDEgLT4gQVJBQklDIExFVFRFUiBTQUQgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWJiJyAgICMgIDB4RDIgLT4gQVJBQklDIExFVFRFUiBTQUQgSU5JVElBTCBGT1JNCisgICAgdSdcdWZlYmQnICAgIyAgMHhEMyAtPiBBUkFCSUMgTEVUVEVSIERBRCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYmYnICAgIyAgMHhENCAtPiBBUkFCSUMgTEVUVEVSIERBRCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVjMScgICAjICAweEQ1IC0+IEFSQUJJQyBMRVRURVIgVEFIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVjNScgICAjICAweEQ2IC0+IEFSQUJJQyBMRVRURVIgWkFIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVjOScgICAjICAweEQ3IC0+IEFSQUJJQyBMRVRURVIgQUlOIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVjYScgICAjICAweEQ4IC0+IEFSQUJJQyBMRVRURVIgQUlOIEZJTkFMIEZPUk0KKyAgICB1J1x1ZmVjYicgICAjICAweEQ5IC0+IEFSQUJJQyBMRVRURVIgQUlOIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWNjJyAgICMgIDB4REEgLT4gQVJBQklDIExFVFRFUiBBSU4gTUVESUFMIEZPUk0KKyAgICB1J1x1ZmVjZCcgICAjICAweERCIC0+IEFSQUJJQyBMRVRURVIgR0hBSU4gSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWNlJyAgICMgIDB4REMgLT4gQVJBQklDIExFVFRFUiBHSEFJTiBGSU5BTCBGT1JNCisgICAgdSdcdWZlY2YnICAgIyAgMHhERCAtPiBBUkFCSUMgTEVUVEVSIEdIQUlOIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWQwJyAgICMgIDB4REUgLT4gQVJBQklDIExFVFRFUiBHSEFJTiBNRURJQUwgRk9STQorICAgIHUnXHVmZWQxJyAgICMgIDB4REYgLT4gQVJBQklDIExFVFRFUiBGRUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWQzJyAgICMgIDB4RTAgLT4gQVJBQklDIExFVFRFUiBGRUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZlZDUnICAgIyAgMHhFMSAtPiBBUkFCSUMgTEVUVEVSIFFBRiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZDcnICAgIyAgMHhFMiAtPiBBUkFCSUMgTEVUVEVSIFFBRiBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVkOScgICAjICAweEUzIC0+IEFSQUJJQyBMRVRURVIgS0FGIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVkYicgICAjICAweEU0IC0+IEFSQUJJQyBMRVRURVIgS0FGIElOSVRJQUwgRk9STQorICAgIHUnXHVmYjkyJyAgICMgIDB4RTUgLT4gQVJBQklDIExFVFRFUiBHQUYgSVNPTEFURUQgRk9STQorICAgIHUnXHVmYjk0JyAgICMgIDB4RTYgLT4gQVJBQklDIExFVFRFUiBHQUYgSU5JVElBTCBGT1JNCisgICAgdSdcdWZlZGQnICAgIyAgMHhFNyAtPiBBUkFCSUMgTEVUVEVSIExBTSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZGYnICAgIyAgMHhFOCAtPiBBUkFCSUMgTEVUVEVSIExBTSBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVlMCcgICAjICAweEU5IC0+IEFSQUJJQyBMRVRURVIgTEFNIE1FRElBTCBGT1JNCisgICAgdSdcdWZlZTEnICAgIyAgMHhFQSAtPiBBUkFCSUMgTEVUVEVSIE1FRU0gSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWUzJyAgICMgIDB4RUIgLT4gQVJBQklDIExFVFRFUiBNRUVNIElOSVRJQUwgRk9STQorICAgIHUnXHVmYjllJyAgICMgIDB4RUMgLT4gQVJBQklDIExFVFRFUiBOT09OIEdIVU5OQSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZTUnICAgIyAgMHhFRCAtPiBBUkFCSUMgTEVUVEVSIE5PT04gSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWU3JyAgICMgIDB4RUUgLT4gQVJBQklDIExFVFRFUiBOT09OIElOSVRJQUwgRk9STQorICAgIHUnXHVmZTg1JyAgICMgIDB4RUYgLT4gQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZWQnICAgIyAgMHhGMCAtPiBBUkFCSUMgTEVUVEVSIFdBVyBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZiYTYnICAgIyAgMHhGMSAtPiBBUkFCSUMgTEVUVEVSIEhFSCBHT0FMIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmJhOCcgICAjICAweEYyIC0+IEFSQUJJQyBMRVRURVIgSEVIIEdPQUwgSU5JVElBTCBGT1JNCisgICAgdSdcdWZiYTknICAgIyAgMHhGMyAtPiBBUkFCSUMgTEVUVEVSIEhFSCBHT0FMIE1FRElBTCBGT1JNCisgICAgdSdcdWZiYWEnICAgIyAgMHhGNCAtPiBBUkFCSUMgTEVUVEVSIEhFSCBET0FDSEFTSE1FRSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlODAnICAgIyAgMHhGNSAtPiBBUkFCSUMgTEVUVEVSIEhBTVpBIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmU4OScgICAjICAweEY2IC0+IEFSQUJJQyBMRVRURVIgWUVIIFdJVEggSEFNWkEgQUJPVkUgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZThhJyAgICMgIDB4RjcgLT4gQVJBQklDIExFVFRFUiBZRUggV0lUSCBIQU1aQSBBQk9WRSBGSU5BTCBGT1JNCisgICAgdSdcdWZlOGInICAgIyAgMHhGOCAtPiBBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWYxJyAgICMgIDB4RjkgLT4gQVJBQklDIExFVFRFUiBZRUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWYyJyAgICMgIDB4RkEgLT4gQVJBQklDIExFVFRFUiBZRUggRklOQUwgRk9STQorICAgIHUnXHVmZWYzJyAgICMgIDB4RkIgLT4gQVJBQklDIExFVFRFUiBZRUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZiYjAnICAgIyAgMHhGQyAtPiBBUkFCSUMgTEVUVEVSIFlFSCBCQVJSRUUgV0lUSCBIQU1aQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZiYWUnICAgIyAgMHhGRCAtPiBBUkFCSUMgTEVUVEVSIFlFSCBCQVJSRUUgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZTdjJyAgICMgIDB4RkUgLT4gQVJBQklDIFNIQUREQSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlN2QnICAgIyAgMHhGRiAtPiBBUkFCSUMgU0hBRERBIE1FRElBTCBGT1JNCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMDYucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMDA2LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzY3ZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMDA2LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMDYucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMDA2LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzY3ZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMDA2LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMjYucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMjYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViYmU2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTAyNi5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDEwMjYgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL0VCQ0RJQy9DUDEwMjYuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3AxMDI2JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDljJyAgICAgIyAgMHgwNCAtPiBDT05UUk9MCisgICAgdSdcdCcgICAgICAgIyAgMHgwNSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1x4ODYnICAgICAjICAweDA2IC0+IENPTlRST0wKKyAgICB1J1x4N2YnICAgICAjICAweDA3IC0+IERFTEVURQorICAgIHUnXHg5NycgICAgICMgIDB4MDggLT4gQ09OVFJPTAorICAgIHUnXHg4ZCcgICAgICMgIDB4MDkgLT4gQ09OVFJPTAorICAgIHUnXHg4ZScgICAgICMgIDB4MEEgLT4gQ09OVFJPTAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHg5ZCcgICAgICMgIDB4MTQgLT4gQ09OVFJPTAorICAgIHUnXHg4NScgICAgICMgIDB4MTUgLT4gQ09OVFJPTAorICAgIHUnXHgwOCcgICAgICMgIDB4MTYgLT4gQkFDS1NQQUNFCisgICAgdSdceDg3JyAgICAgIyAgMHgxNyAtPiBDT05UUk9MCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4OTInICAgICAjICAweDFBIC0+IENPTlRST0wKKyAgICB1J1x4OGYnICAgICAjICAweDFCIC0+IENPTlRST0wKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdSdceDgwJyAgICAgIyAgMHgyMCAtPiBDT05UUk9MCisgICAgdSdceDgxJyAgICAgIyAgMHgyMSAtPiBDT05UUk9MCisgICAgdSdceDgyJyAgICAgIyAgMHgyMiAtPiBDT05UUk9MCisgICAgdSdceDgzJyAgICAgIyAgMHgyMyAtPiBDT05UUk9MCisgICAgdSdceDg0JyAgICAgIyAgMHgyNCAtPiBDT05UUk9MCisgICAgdSdcbicgICAgICAgIyAgMHgyNSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MTcnICAgICAjICAweDI2IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MWInICAgICAjICAweDI3IC0+IEVTQ0FQRQorICAgIHUnXHg4OCcgICAgICMgIDB4MjggLT4gQ09OVFJPTAorICAgIHUnXHg4OScgICAgICMgIDB4MjkgLT4gQ09OVFJPTAorICAgIHUnXHg4YScgICAgICMgIDB4MkEgLT4gQ09OVFJPTAorICAgIHUnXHg4YicgICAgICMgIDB4MkIgLT4gQ09OVFJPTAorICAgIHUnXHg4YycgICAgICMgIDB4MkMgLT4gQ09OVFJPTAorICAgIHUnXHgwNScgICAgICMgIDB4MkQgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MkUgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDJGIC0+IEJFTEwKKyAgICB1J1x4OTAnICAgICAjICAweDMwIC0+IENPTlRST0wKKyAgICB1J1x4OTEnICAgICAjICAweDMxIC0+IENPTlRST0wKKyAgICB1J1x4MTYnICAgICAjICAweDMyIC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4OTMnICAgICAjICAweDMzIC0+IENPTlRST0wKKyAgICB1J1x4OTQnICAgICAjICAweDM0IC0+IENPTlRST0wKKyAgICB1J1x4OTUnICAgICAjICAweDM1IC0+IENPTlRST0wKKyAgICB1J1x4OTYnICAgICAjICAweDM2IC0+IENPTlRST0wKKyAgICB1J1x4MDQnICAgICAjICAweDM3IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4OTgnICAgICAjICAweDM4IC0+IENPTlRST0wKKyAgICB1J1x4OTknICAgICAjICAweDM5IC0+IENPTlRST0wKKyAgICB1J1x4OWEnICAgICAjICAweDNBIC0+IENPTlRST0wKKyAgICB1J1x4OWInICAgICAjICAweDNCIC0+IENPTlRST0wKKyAgICB1J1x4MTQnICAgICAjICAweDNDIC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDNEIC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDllJyAgICAgIyAgMHgzRSAtPiBDT05UUk9MCisgICAgdSdceDFhJyAgICAgIyAgMHgzRiAtPiBTVUJTVElUVVRFCisgICAgdScgJyAgICAgICAgIyAgMHg0MCAtPiBTUEFDRQorICAgIHUnXHhhMCcgICAgICMgIDB4NDEgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x4ZTInICAgICAjICAweDQyIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4NDMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTAnICAgICAjICAweDQ0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTEnICAgICAjICAweDQ1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTMnICAgICAjICAweDQ2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZTUnICAgICAjICAweDQ3IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUneycgICAgICAgICMgIDB4NDggLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSdceGYxJyAgICAgIyAgMHg0OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGM3JyAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnLicgICAgICAgICMgIDB4NEIgLT4gRlVMTCBTVE9QCisgICAgdSc8JyAgICAgICAgIyAgMHg0QyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnKCcgICAgICAgICMgIDB4NEQgLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKycgICAgICAgICMgIDB4NEUgLT4gUExVUyBTSUdOCisgICAgdSchJyAgICAgICAgIyAgMHg0RiAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdScmJyAgICAgICAgIyAgMHg1MCAtPiBBTVBFUlNBTkQKKyAgICB1J1x4ZTknICAgICAjICAweDUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZWEnICAgICAjICAweDUyIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4NTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTgnICAgICAjICAweDU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZWQnICAgICAjICAweDU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZWUnICAgICAjICAweDU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4NTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWMnICAgICAjICAweDU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZGYnICAgICAjICAweDU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHRVJNQU4pCisgICAgdSdcdTAxMWUnICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICB1J1x1MDEzMCcgICAjICAweDVCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1QgQUJPVkUKKyAgICB1JyonICAgICAgICAjICAweDVDIC0+IEFTVEVSSVNLCisgICAgdScpJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnOycgICAgICAgICMgIDB4NUUgLT4gU0VNSUNPTE9OCisgICAgdSdeJyAgICAgICAgIyAgMHg1RiAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnLScgICAgICAgICMgIDB4NjAgLT4gSFlQSEVOLU1JTlVTCisgICAgdScvJyAgICAgICAgIyAgMHg2MSAtPiBTT0xJRFVTCisgICAgdSdceGMyJyAgICAgIyAgMHg2MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjNCcgICAgICMgIDB4NjMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjMCcgICAgICMgIDB4NjQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGMxJyAgICAgIyAgMHg2NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4YzMnICAgICAjICAweDY2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhjNScgICAgICMgIDB4NjcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1snICAgICAgICAjICAweDY4IC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1x4ZDEnICAgICAjICAweDY5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHUwMTVmJyAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdScsJyAgICAgICAgIyAgMHg2QiAtPiBDT01NQQorICAgIHUnJScgICAgICAgICMgIDB4NkMgLT4gUEVSQ0VOVCBTSUdOCisgICAgdSdfJyAgICAgICAgIyAgMHg2RCAtPiBMT1cgTElORQorICAgIHUnPicgICAgICAgICMgIDB4NkUgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDZGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J1x4ZjgnICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGM5JyAgICAgIyAgMHg3MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4Y2EnICAgICAjICAweDcyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNiJyAgICAgIyAgMHg3MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM4JyAgICAgIyAgMHg3NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4Y2QnICAgICAjICAweDc1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4NzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweDc3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweDc4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHUwMTMxJyAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorICAgIHUnOicgICAgICAgICMgIDB4N0EgLT4gQ09MT04KKyAgICB1J1x4ZDYnICAgICAjICAweDdCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE1ZScgICAjICAweDdDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdSInIiAgICAgICAgIyAgMHg3RCAtPiBBUE9TVFJPUEhFCisgICAgdSc9JyAgICAgICAgIyAgMHg3RSAtPiBFUVVBTFMgU0lHTgorICAgIHUnXHhkYycgICAgICMgIDB4N0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkOCcgICAgICMgIDB4ODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnYScgICAgICAgICMgIDB4ODEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDgyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4ODQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDg1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg4NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4ODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnXHhhYicgICAgICMgIDB4OEEgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweDhCIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnfScgICAgICAgICMgIDB4OEMgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnYCcgICAgICAgICMgIDB4OEQgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdceGE2JyAgICAgIyAgMHg4RSAtPiBCUk9LRU4gQkFSCisgICAgdSdceGIxJyAgICAgIyAgMHg4RiAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjAnICAgICAjICAweDkwIC0+IERFR1JFRSBTSUdOCisgICAgdSdqJyAgICAgICAgIyAgMHg5MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4OTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4OTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4OTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDk5IC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdceGFhJyAgICAgIyAgMHg5QSAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYScgICAgICMgIDB4OUIgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGU2JyAgICAgIyAgMHg5QyAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIHUnXHhiOCcgICAgICMgIDB4OUQgLT4gQ0VESUxMQQorICAgIHUnXHhjNicgICAgICMgIDB4OUUgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIHUnXHhhNCcgICAgICMgIDB4OUYgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHhiNScgICAgICMgIDB4QTAgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhmNicgICAgICMgIDB4QTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J3MnICAgICAgICAjICAweEEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHhBMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4QTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweEE1IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHhBNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4QTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweEE4IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHhBOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUnXHhhMScgICAgICMgIDB4QUEgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhiZicgICAgICMgIDB4QUIgLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXScgICAgICAgICMgIDB4QUMgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1JyQnICAgICAgICAjICAweEFEIC0+IERPTExBUiBTSUdOCisgICAgdSdAJyAgICAgICAgIyAgMHhBRSAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdceGFlJyAgICAgIyAgMHhBRiAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YTInICAgICAjICAweEIwIC0+IENFTlQgU0lHTgorICAgIHUnXHhhMycgICAgICMgIDB4QjEgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhhNScgICAgICMgIDB4QjIgLT4gWUVOIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEIzIC0+IE1JRERMRSBET1QKKyAgICB1J1x4YTknICAgICAjICAweEI0IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdceGE3JyAgICAgIyAgMHhCNSAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YjYnICAgICAjICAweEI2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhiYycgICAgICMgIDB4QjcgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGJkJyAgICAgIyAgMHhCOCAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmUnICAgICAjICAweEI5IC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnXHhhYycgICAgICMgIDB4QkEgLT4gTk9UIFNJR04KKyAgICB1J3wnICAgICAgICAjICAweEJCIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J1x4YWYnICAgICAjICAweEJDIC0+IE1BQ1JPTgorICAgIHUnXHhhOCcgICAgICMgIDB4QkQgLT4gRElBRVJFU0lTCisgICAgdSdceGI0JyAgICAgIyAgMHhCRSAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4ZDcnICAgICAjICAweEJGIC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x4ZTcnICAgICAjICAweEMwIC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnQScgICAgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4QzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4QzkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnXHhhZCcgICAgICMgIDB4Q0EgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4ZjQnICAgICAjICAweENCIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnficgICAgICAgICMgIDB4Q0MgLT4gVElMREUKKyAgICB1J1x4ZjInICAgICAjICAweENEIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjMnICAgICAjICAweENFIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZjUnICAgICAjICAweENGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x1MDExZicgICAjICAweEQwIC0+IExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICB1J0onICAgICAgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweEQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweEQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1x4YjknICAgICAjICAweERBIC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhmYicgICAgICMgIDB4REIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcXCcgICAgICAgIyAgMHhEQyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J1x4ZjknICAgICAjICAweEREIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmEnICAgICAjICAweERFIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZmYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdceGZjJyAgICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4RTEgLT4gRElWSVNJT04gU0lHTgorICAgIHUnUycgICAgICAgICMgIDB4RTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4RTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4RTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4RTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4RTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4RTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4RTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4RTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnXHhiMicgICAgICMgIDB4RUEgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGQ0JyAgICAgIyAgMHhFQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnIycgICAgICAgICMgIDB4RUMgLT4gTlVNQkVSIFNJR04KKyAgICB1J1x4ZDInICAgICAjICAweEVEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkMycgICAgICMgIDB4RUUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ1JyAgICAgIyAgMHhFRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1JzAnICAgICAgICAjICAweEYwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweEYxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4RjIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHhGMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4RjQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4RjUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4RjYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHhGNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4RjggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweEY5IC0+IERJR0lUIE5JTkUKKyAgICB1J1x4YjMnICAgICAjICAweEZBIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdceGRiJyAgICAgIyAgMHhGQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnIicgICAgICAgICMgIDB4RkMgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZDknICAgICAjICAweEZEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4RkUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceDlmJyAgICAgIyAgMHhGRiAtPiBDT05UUk9MCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMjYucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMDI2LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGVlZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMDI2LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMjYucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMDI2LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGVlZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMDI2LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDExNDAucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDExNDAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U1MDdmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTE0MC5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDExNDAgZ2VuZXJhdGVkIGZyb20gJ3B5dGhvbi1tYXBwaW5ncy9DUDExNDAuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3AxMTQwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDljJyAgICAgIyAgMHgwNCAtPiBDT05UUk9MCisgICAgdSdcdCcgICAgICAgIyAgMHgwNSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1x4ODYnICAgICAjICAweDA2IC0+IENPTlRST0wKKyAgICB1J1x4N2YnICAgICAjICAweDA3IC0+IERFTEVURQorICAgIHUnXHg5NycgICAgICMgIDB4MDggLT4gQ09OVFJPTAorICAgIHUnXHg4ZCcgICAgICMgIDB4MDkgLT4gQ09OVFJPTAorICAgIHUnXHg4ZScgICAgICMgIDB4MEEgLT4gQ09OVFJPTAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHg5ZCcgICAgICMgIDB4MTQgLT4gQ09OVFJPTAorICAgIHUnXHg4NScgICAgICMgIDB4MTUgLT4gQ09OVFJPTAorICAgIHUnXHgwOCcgICAgICMgIDB4MTYgLT4gQkFDS1NQQUNFCisgICAgdSdceDg3JyAgICAgIyAgMHgxNyAtPiBDT05UUk9MCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4OTInICAgICAjICAweDFBIC0+IENPTlRST0wKKyAgICB1J1x4OGYnICAgICAjICAweDFCIC0+IENPTlRST0wKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdSdceDgwJyAgICAgIyAgMHgyMCAtPiBDT05UUk9MCisgICAgdSdceDgxJyAgICAgIyAgMHgyMSAtPiBDT05UUk9MCisgICAgdSdceDgyJyAgICAgIyAgMHgyMiAtPiBDT05UUk9MCisgICAgdSdceDgzJyAgICAgIyAgMHgyMyAtPiBDT05UUk9MCisgICAgdSdceDg0JyAgICAgIyAgMHgyNCAtPiBDT05UUk9MCisgICAgdSdcbicgICAgICAgIyAgMHgyNSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MTcnICAgICAjICAweDI2IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MWInICAgICAjICAweDI3IC0+IEVTQ0FQRQorICAgIHUnXHg4OCcgICAgICMgIDB4MjggLT4gQ09OVFJPTAorICAgIHUnXHg4OScgICAgICMgIDB4MjkgLT4gQ09OVFJPTAorICAgIHUnXHg4YScgICAgICMgIDB4MkEgLT4gQ09OVFJPTAorICAgIHUnXHg4YicgICAgICMgIDB4MkIgLT4gQ09OVFJPTAorICAgIHUnXHg4YycgICAgICMgIDB4MkMgLT4gQ09OVFJPTAorICAgIHUnXHgwNScgICAgICMgIDB4MkQgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MkUgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDJGIC0+IEJFTEwKKyAgICB1J1x4OTAnICAgICAjICAweDMwIC0+IENPTlRST0wKKyAgICB1J1x4OTEnICAgICAjICAweDMxIC0+IENPTlRST0wKKyAgICB1J1x4MTYnICAgICAjICAweDMyIC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4OTMnICAgICAjICAweDMzIC0+IENPTlRST0wKKyAgICB1J1x4OTQnICAgICAjICAweDM0IC0+IENPTlRST0wKKyAgICB1J1x4OTUnICAgICAjICAweDM1IC0+IENPTlRST0wKKyAgICB1J1x4OTYnICAgICAjICAweDM2IC0+IENPTlRST0wKKyAgICB1J1x4MDQnICAgICAjICAweDM3IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4OTgnICAgICAjICAweDM4IC0+IENPTlRST0wKKyAgICB1J1x4OTknICAgICAjICAweDM5IC0+IENPTlRST0wKKyAgICB1J1x4OWEnICAgICAjICAweDNBIC0+IENPTlRST0wKKyAgICB1J1x4OWInICAgICAjICAweDNCIC0+IENPTlRST0wKKyAgICB1J1x4MTQnICAgICAjICAweDNDIC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDNEIC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDllJyAgICAgIyAgMHgzRSAtPiBDT05UUk9MCisgICAgdSdceDFhJyAgICAgIyAgMHgzRiAtPiBTVUJTVElUVVRFCisgICAgdScgJyAgICAgICAgIyAgMHg0MCAtPiBTUEFDRQorICAgIHUnXHhhMCcgICAgICMgIDB4NDEgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x4ZTInICAgICAjICAweDQyIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4NDMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTAnICAgICAjICAweDQ0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTEnICAgICAjICAweDQ1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTMnICAgICAjICAweDQ2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZTUnICAgICAjICAweDQ3IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNycgICAgICMgIDB4NDggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGYxJyAgICAgIyAgMHg0OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGEyJyAgICAgIyAgMHg0QSAtPiBDRU5UIFNJR04KKyAgICB1Jy4nICAgICAgICAjICAweDRCIC0+IEZVTEwgU1RPUAorICAgIHUnPCcgICAgICAgICMgIDB4NEMgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1JygnICAgICAgICAjICAweDREIC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JysnICAgICAgICAjICAweDRFIC0+IFBMVVMgU0lHTgorICAgIHUnfCcgICAgICAgICMgIDB4NEYgLT4gVkVSVElDQUwgTElORQorICAgIHUnJicgICAgICAgICMgIDB4NTAgLT4gQU1QRVJTQU5ECisgICAgdSdceGU5JyAgICAgIyAgMHg1MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGVhJyAgICAgIyAgMHg1MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweDUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU4JyAgICAgIyAgMHg1NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGVkJyAgICAgIyAgMHg1NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVlJyAgICAgIyAgMHg1NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweDU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVjJyAgICAgIyAgMHg1OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGRmJyAgICAgIyAgMHg1OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAoR0VSTUFOKQorICAgIHUnIScgICAgICAgICMgIDB4NUEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnJCcgICAgICAgICMgIDB4NUIgLT4gRE9MTEFSIFNJR04KKyAgICB1JyonICAgICAgICAjICAweDVDIC0+IEFTVEVSSVNLCisgICAgdScpJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnOycgICAgICAgICMgIDB4NUUgLT4gU0VNSUNPTE9OCisgICAgdSdceGFjJyAgICAgIyAgMHg1RiAtPiBOT1QgU0lHTgorICAgIHUnLScgICAgICAgICMgIDB4NjAgLT4gSFlQSEVOLU1JTlVTCisgICAgdScvJyAgICAgICAgIyAgMHg2MSAtPiBTT0xJRFVTCisgICAgdSdceGMyJyAgICAgIyAgMHg2MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjNCcgICAgICMgIDB4NjMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjMCcgICAgICMgIDB4NjQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGMxJyAgICAgIyAgMHg2NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4YzMnICAgICAjICAweDY2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhjNScgICAgICMgIDB4NjcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzcnICAgICAjICAweDY4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGQxJyAgICAgIyAgMHg2OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4YTYnICAgICAjICAweDZBIC0+IEJST0tFTiBCQVIKKyAgICB1JywnICAgICAgICAjICAweDZCIC0+IENPTU1BCisgICAgdSclJyAgICAgICAgIyAgMHg2QyAtPiBQRVJDRU5UIFNJR04KKyAgICB1J18nICAgICAgICAjICAweDZEIC0+IExPVyBMSU5FCisgICAgdSc+JyAgICAgICAgIyAgMHg2RSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4NkYgLT4gUVVFU1RJT04gTUFSSworICAgIHUnXHhmOCcgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4YzknICAgICAjICAweDcxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjYScgICAgICMgIDB4NzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweDczIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzgnICAgICAjICAweDc0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4NzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHg3NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4NzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjYycgICAgICMgIDB4NzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdgJyAgICAgICAgIyAgMHg3OSAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1JzonICAgICAgICAjICAweDdBIC0+IENPTE9OCisgICAgdScjJyAgICAgICAgIyAgMHg3QiAtPiBOVU1CRVIgU0lHTgorICAgIHUnQCcgICAgICAgICMgIDB4N0MgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUiJyIgICAgICAgICMgIDB4N0QgLT4gQVBPU1RST1BIRQorICAgIHUnPScgICAgICAgICMgIDB4N0UgLT4gRVFVQUxTIFNJR04KKyAgICB1JyInICAgICAgICAjICAweDdGIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdSdceGQ4JyAgICAgIyAgMHg4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdhJyAgICAgICAgIyAgMHg4MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4ODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg4NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4ODUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDg2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4ODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdceGFiJyAgICAgIyAgMHg4QSAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4OEIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGYwJyAgICAgIyAgMHg4QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRVRIIChJQ0VMQU5ESUMpCisgICAgdSdceGZkJyAgICAgIyAgMHg4RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGZlJyAgICAgIyAgMHg4RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVEhPUk4gKElDRUxBTkRJQykKKyAgICB1J1x4YjEnICAgICAjICAweDhGIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMCcgICAgICMgIDB4OTAgLT4gREVHUkVFIFNJR04KKyAgICB1J2onICAgICAgICAjICAweDkxIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg5MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4OTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4OTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4OTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J1x4YWEnICAgICAjICAweDlBIC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJhJyAgICAgIyAgMHg5QiAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4ZTYnICAgICAjICAweDlDIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgdSdceGI4JyAgICAgIyAgMHg5RCAtPiBDRURJTExBCisgICAgdSdceGM2JyAgICAgIyAgMHg5RSAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgdSdcdTIwYWMnICAgIyAgMHg5RiAtPiBFVVJPIFNJR04KKyAgICB1J1x4YjUnICAgICAjICAweEEwIC0+IE1JQ1JPIFNJR04KKyAgICB1J34nICAgICAgICAjICAweEExIC0+IFRJTERFCisgICAgdSdzJyAgICAgICAgIyAgMHhBMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4QTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweEE0IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHhBNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4QTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweEE3IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHhBOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4QTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J1x4YTEnICAgICAjICAweEFBIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YmYnICAgICAjICAweEFCIC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4ZDAnICAgICAjICAweEFDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEVUSCAoSUNFTEFORElDKQorICAgIHUnXHhkZCcgICAgICMgIDB4QUQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGRlJyAgICAgIyAgMHhBRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STiAoSUNFTEFORElDKQorICAgIHUnXHhhZScgICAgICMgIDB4QUYgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdeJyAgICAgICAgIyAgMHhCMCAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXHhhMycgICAgICMgIDB4QjEgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhhNScgICAgICMgIDB4QjIgLT4gWUVOIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEIzIC0+IE1JRERMRSBET1QKKyAgICB1J1x4YTknICAgICAjICAweEI0IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdceGE3JyAgICAgIyAgMHhCNSAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YjYnICAgICAjICAweEI2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhiYycgICAgICMgIDB4QjcgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGJkJyAgICAgIyAgMHhCOCAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmUnICAgICAjICAweEI5IC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnWycgICAgICAgICMgIDB4QkEgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXScgICAgICAgICMgIDB4QkIgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1x4YWYnICAgICAjICAweEJDIC0+IE1BQ1JPTgorICAgIHUnXHhhOCcgICAgICMgIDB4QkQgLT4gRElBRVJFU0lTCisgICAgdSdceGI0JyAgICAgIyAgMHhCRSAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4ZDcnICAgICAjICAweEJGIC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J3snICAgICAgICAjICAweEMwIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnQScgICAgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4QzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4QzkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnXHhhZCcgICAgICMgIDB4Q0EgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4ZjQnICAgICAjICAweENCIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNicgICAgICMgIDB4Q0MgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjInICAgICAjICAweENEIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjMnICAgICAjICAweENFIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZjUnICAgICAjICAweENGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J30nICAgICAgICAjICAweEQwIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J0onICAgICAgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweEQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweEQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1x4YjknICAgICAjICAweERBIC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhmYicgICAgICMgIDB4REIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHhEQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmOScgICAgICMgIDB4REQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYScgICAgICMgIDB4REUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmZicgICAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1xcJyAgICAgICAjICAweEUwIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXHhmNycgICAgICMgIDB4RTEgLT4gRElWSVNJT04gU0lHTgorICAgIHUnUycgICAgICAgICMgIDB4RTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4RTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4RTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4RTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4RTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4RTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4RTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4RTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnXHhiMicgICAgICMgIDB4RUEgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGQ0JyAgICAgIyAgMHhFQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkNicgICAgICMgIDB4RUMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkMicgICAgICMgIDB4RUQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGQzJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDUnICAgICAjICAweEVGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnMCcgICAgICAgICMgIDB4RjAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4RjEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHhGMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweEYzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHhGNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHhGNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHhGNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweEY3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHhGOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4RjkgLT4gRElHSVQgTklORQorICAgIHUnXHhiMycgICAgICMgIDB4RkEgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4ZGInICAgICAjICAweEZCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGRjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ5JyAgICAgIyAgMHhGRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweEZFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHg5ZicgICAgICMgIDB4RkYgLT4gQ09OVFJPTAorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMTQwLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTE0MC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmMTE4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTE0MC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMTQwLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTE0MC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVmMTE4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTE0MC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUwLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MjBiODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTAucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3AxMjUwIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQMTI1MC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDEyNTAnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHUyMGFjJyAgICMgIDB4ODAgLT4gRVVSTyBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg4MSAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxYScgICAjICAweDgyIC0+IFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHVmZmZlJyAgICMgIDB4ODMgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMWUnICAgIyAgMHg4NCAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyNicgICAjICAweDg1IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x1MjAyMCcgICAjICAweDg2IC0+IERBR0dFUgorICAgIHUnXHUyMDIxJyAgICMgIDB4ODcgLT4gRE9VQkxFIERBR0dFUgorICAgIHUnXHVmZmZlJyAgICMgIDB4ODggLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMzAnICAgIyAgMHg4OSAtPiBQRVIgTUlMTEUgU0lHTgorICAgIHUnXHUwMTYwJyAgICMgIDB4OEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTIwMzknICAgIyAgMHg4QiAtPiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTVhJyAgICMgIDB4OEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgdSdcdTAxNjQnICAgIyAgMHg4RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0FST04KKyAgICB1J1x1MDE3ZCcgICAjICAweDhFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHUwMTc5JyAgICMgIDB4OEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdcdWZmZmUnICAgIyAgMHg5MCAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxOCcgICAjICAweDkxIC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHg5MiAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxYycgICAjICAweDkzIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHg5NCAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyMicgICAjICAweDk1IC0+IEJVTExFVAorICAgIHUnXHUyMDEzJyAgICMgIDB4OTYgLT4gRU4gREFTSAorICAgIHUnXHUyMDE0JyAgICMgIDB4OTcgLT4gRU0gREFTSAorICAgIHUnXHVmZmZlJyAgICMgIDB4OTggLT4gVU5ERUZJTkVECisgICAgdSdcdTIxMjInICAgIyAgMHg5OSAtPiBUUkFERSBNQVJLIFNJR04KKyAgICB1J1x1MDE2MScgICAjICAweDlBIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MjAzYScgICAjICAweDlCIC0+IFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTViJyAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIHUnXHUwMTY1JyAgICMgIDB4OUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgIHUnXHUwMTdlJyAgICMgIDB4OUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHUwMTdhJyAgICMgIDB4OUYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MDJjNycgICAjICAweEExIC0+IENBUk9OCisgICAgdSdcdTAyZDgnICAgIyAgMHhBMiAtPiBCUkVWRQorICAgIHUnXHUwMTQxJyAgICMgIDB4QTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIHUnXHhhNCcgICAgICMgIDB4QTQgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHUwMTA0JyAgICMgIDB4QTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIHUnXHhhNicgICAgICMgIDB4QTYgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhBOCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTAxNWUnICAgIyAgMHhBQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIHUnXHhhYicgICAgICMgIDB4QUIgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEFDIC0+IE5PVCBTSUdOCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhhZScgICAgICMgIDB4QUUgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdcdTAxN2InICAgIyAgMHhBRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGIwJyAgICAgIyAgMHhCMCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTAyZGInICAgIyAgMHhCMiAtPiBPR09ORUsKKyAgICB1J1x1MDE0MicgICAjICAweEIzIC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdceGI0JyAgICAgIyAgMHhCNCAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4YjUnICAgICAjICAweEI1IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x4YjYnICAgICAjICAweEI2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjcgLT4gTUlERExFIERPVAorICAgIHUnXHhiOCcgICAgICMgIDB4QjggLT4gQ0VESUxMQQorICAgIHUnXHUwMTA1JyAgICMgIDB4QjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDE1ZicgICAjICAweEJBIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxM2QnICAgIyAgMHhCQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0FST04KKyAgICB1J1x1MDJkZCcgICAjICAweEJEIC0+IERPVUJMRSBBQ1VURSBBQ0NFTlQKKyAgICB1J1x1MDEzZScgICAjICAweEJFIC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0FST04KKyAgICB1J1x1MDE3YycgICAjICAweEJGIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxNTQnICAgIyAgMHhDMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQUNVVEUKKyAgICB1J1x4YzEnICAgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMicgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEwMicgICAjICAweEMzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRQorICAgIHUnXHhjNCcgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTM5JyAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEFDVVRFCisgICAgdSdcdTAxMDYnICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4YzcnICAgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdcdTAxMGMnICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTE4JyAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIHUnXHhjYicgICAgICMgIDB4Q0IgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTFhJyAgICMgIDB4Q0MgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgdSdceGNkJyAgICAgIyAgMHhDRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweENFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxMGUnICAgIyAgMHhDRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICB1J1x1MDExMCcgICAjICAweEQwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE0MycgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIHUnXHUwMTQ3JyAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENBUk9OCisgICAgdSdceGQzJyAgICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxNTAnICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ3JyAgICAgIyAgMHhENyAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdcdTAxNTgnICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0FST04KKyAgICB1J1x1MDE2ZScgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGRhJyAgICAgIyAgMHhEQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x1MDE3MCcgICAjICAweERCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGQnICAgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHUwMTYyJyAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENFRElMTEEKKyAgICB1J1x4ZGYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdcdTAxNTUnICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIEFDVVRFCisgICAgdSdceGUxJyAgICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEwMycgICAjICAweEUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxM2EnICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIEFDVVRFCisgICAgdSdcdTAxMDcnICAgIyAgMHhFNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgdSdceGU3JyAgICAgIyAgMHhFNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEwZCcgICAjICAweEU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x4ZTknICAgICAjICAweEU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x1MDExOScgICAjICAweEVBIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdceGViJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTFiJyAgICMgIDB4RUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDQVJPTgorICAgIHUnXHhlZCcgICAgICMgIDB4RUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4RUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxMGYnICAgIyAgMHhFRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIENBUk9OCisgICAgdSdcdTAxMTEnICAgIyAgMHhGMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTQ0JyAgICMgIDB4RjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIHUnXHUwMTQ4JyAgICMgIDB4RjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBDQVJPTgorICAgIHUnXHhmMycgICAgICMgIDB4RjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmNCcgICAgICMgIDB4RjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxNTEnICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHhmNicgICAgICMgIDB4RjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjcnICAgICAjICAweEY3IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MDE1OScgICAjICAweEY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0FST04KKyAgICB1J1x1MDE2ZicgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhmYScgICAgICMgIDB4RkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTcxJyAgICMgIDB4RkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZmMnICAgICAjICAweEZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGZkJyAgICAgIyAgMHhGRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNjMnICAgIyAgMHhGRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENFRElMTEEKKyAgICB1J1x1MDJkOScgICAjICAweEZGIC0+IERPVCBBQk9WRQorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUwLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1MC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1YWJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1MC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUwLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1MC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1YWJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1MC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUxLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUxLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjc3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTEucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3AxMjUxIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQMTI1MS5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDEyNTEnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHUwNDAyJyAgICMgIDB4ODAgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREpFCisgICAgdSdcdTA0MDMnICAgIyAgMHg4MSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSkUKKyAgICB1J1x1MjAxYScgICAjICAweDgyIC0+IFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwNDUzJyAgICMgIDB4ODMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdKRQorICAgIHUnXHUyMDFlJyAgICMgIDB4ODQgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHg4NSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdcdTIwMjAnICAgIyAgMHg4NiAtPiBEQUdHRVIKKyAgICB1J1x1MjAyMScgICAjICAweDg3IC0+IERPVUJMRSBEQUdHRVIKKyAgICB1J1x1MjBhYycgICAjICAweDg4IC0+IEVVUk8gU0lHTgorICAgIHUnXHUyMDMwJyAgICMgIDB4ODkgLT4gUEVSIE1JTExFIFNJR04KKyAgICB1J1x1MDQwOScgICAjICAweDhBIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIExKRQorICAgIHUnXHUyMDM5JyAgICMgIDB4OEIgLT4gU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDQwYScgICAjICAweDhDIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIE5KRQorICAgIHUnXHUwNDBjJyAgICMgIDB4OEQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0pFCisgICAgdSdcdTA0MGInICAgIyAgMHg4RSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0hFCisgICAgdSdcdTA0MGYnICAgIyAgMHg4RiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkhFCisgICAgdSdcdTA0NTInICAgIyAgMHg5MCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgREpFCisgICAgdSdcdTIwMTgnICAgIyAgMHg5MSAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4OTIgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWMnICAgIyAgMHg5MyAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFkJyAgICMgIDB4OTQgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjInICAgIyAgMHg5NSAtPiBCVUxMRVQKKyAgICB1J1x1MjAxMycgICAjICAweDk2IC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweDk3IC0+IEVNIERBU0gKKyAgICB1J1x1ZmZmZScgICAjICAweDk4IC0+IFVOREVGSU5FRAorICAgIHUnXHUyMTIyJyAgICMgIDB4OTkgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdcdTA0NTknICAgIyAgMHg5QSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgTEpFCisgICAgdSdcdTIwM2EnICAgIyAgMHg5QiAtPiBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDQ1YScgICAjICAweDlDIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBOSkUKKyAgICB1J1x1MDQ1YycgICAjICAweDlEIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBLSkUKKyAgICB1J1x1MDQ1YicgICAjICAweDlFIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBUU0hFCisgICAgdSdcdTA0NWYnICAgIyAgMHg5RiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpIRQorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MDQwZScgICAjICAweEExIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIFUKKyAgICB1J1x1MDQ1ZScgICAjICAweEEyIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBVCisgICAgdSdcdTA0MDgnICAgIyAgMHhBMyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBKRQorICAgIHUnXHhhNCcgICAgICMgIDB4QTQgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHUwNDkwJyAgICMgIDB4QTUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFIFdJVEggVVBUVVJOCisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MDQwMScgICAjICAweEE4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUwNDA0JyAgICMgIDB4QUEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgdSdceGFiJyAgICAgIyAgMHhBQiAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QUMgLT4gTk9UIFNJR04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGFlJyAgICAgIyAgMHhBRSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x1MDQwNycgICAjICAweEFGIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlJCisgICAgdSdceGIwJyAgICAgIyAgMHhCMCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTA0MDYnICAgIyAgMHhCMiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEkKKyAgICB1J1x1MDQ1NicgICAjICAweEIzIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEkKKyAgICB1J1x1MDQ5MScgICAjICAweEI0IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUgV0lUSCBVUFRVUk4KKyAgICB1J1x4YjUnICAgICAjICAweEI1IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x4YjYnICAgICAjICAweEI2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjcgLT4gTUlERExFIERPVAorICAgIHUnXHUwNDUxJyAgICMgIDB4QjggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPCisgICAgdSdcdTIxMTYnICAgIyAgMHhCOSAtPiBOVU1FUk8gU0lHTgorICAgIHUnXHUwNDU0JyAgICMgIDB4QkEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTA0NTgnICAgIyAgMHhCQyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSkUKKyAgICB1J1x1MDQwNScgICAjICAweEJEIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERaRQorICAgIHUnXHUwNDU1JyAgICMgIDB4QkUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERaRQorICAgIHUnXHUwNDU3JyAgICMgIDB4QkYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlJCisgICAgdSdcdTA0MTAnICAgIyAgMHhDMCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdcdTA0MTEnICAgIyAgMHhDMSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCRQorICAgIHUnXHUwNDEyJyAgICMgIDB4QzIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVkUKKyAgICB1J1x1MDQxMycgICAjICAweEMzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRQorICAgIHUnXHUwNDE0JyAgICMgIDB4QzQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUKKyAgICB1J1x1MDQxNScgICAjICAweEM1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElFCisgICAgdSdcdTA0MTYnICAgIyAgMHhDNiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaSEUKKyAgICB1J1x1MDQxNycgICAjICAweEM3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpFCisgICAgdSdcdTA0MTgnICAgIyAgMHhDOCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdcdTA0MTknICAgIyAgMHhDOSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBJCisgICAgdSdcdTA0MWEnICAgIyAgMHhDQSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQQorICAgIHUnXHUwNDFiJyAgICMgIDB4Q0IgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUwKKyAgICB1J1x1MDQxYycgICAjICAweENDIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVNCisgICAgdSdcdTA0MWQnICAgIyAgMHhDRCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTgorICAgIHUnXHUwNDFlJyAgICMgIDB4Q0UgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTworICAgIHUnXHUwNDFmJyAgICMgIDB4Q0YgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgUEUKKyAgICB1J1x1MDQyMCcgICAjICAweEQwIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVSCisgICAgdSdcdTA0MjEnICAgIyAgMHhEMSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUworICAgIHUnXHUwNDIyJyAgICMgIDB4RDIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVEUKKyAgICB1J1x1MDQyMycgICAjICAweEQzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1x1MDQyNCcgICAjICAweEQ0IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVGCisgICAgdSdcdTA0MjUnICAgIyAgMHhENSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQQorICAgIHUnXHUwNDI2JyAgICMgIDB4RDYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNFCisgICAgdSdcdTA0MjcnICAgIyAgMHhENyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUKKyAgICB1J1x1MDQyOCcgICAjICAweEQ4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQQorICAgIHUnXHUwNDI5JyAgICMgIDB4RDkgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hDSEEKKyAgICB1J1x1MDQyYScgICAjICAweERBIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBUkQgU0lHTgorICAgIHUnXHUwNDJiJyAgICMgIDB4REIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSVQorICAgIHUnXHUwNDJjJyAgICMgIDB4REMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTA0MmQnICAgIyAgMHhERCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdcdTA0MmUnICAgIyAgMHhERSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZVQorICAgIHUnXHUwNDJmJyAgICMgIDB4REYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUEKKyAgICB1J1x1MDQzMCcgICAjICAweEUwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBBCisgICAgdSdcdTA0MzEnICAgIyAgMHhFMSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQkUKKyAgICB1J1x1MDQzMicgICAjICAweEUyIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBWRQorICAgIHUnXHUwNDMzJyAgICMgIDB4RTMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRQorICAgIHUnXHUwNDM0JyAgICMgIDB4RTQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERFCisgICAgdSdcdTA0MzUnICAgIyAgMHhFNSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSUUKKyAgICB1J1x1MDQzNicgICAjICAweEU2IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBaSEUKKyAgICB1J1x1MDQzNycgICAjICAweEU3IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBaRQorICAgIHUnXHUwNDM4JyAgICMgIDB4RTggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkKKyAgICB1J1x1MDQzOScgICAjICAweEU5IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBJCisgICAgdSdcdTA0M2EnICAgIyAgMHhFQSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0EKKyAgICB1J1x1MDQzYicgICAjICAweEVCIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTAorICAgIHUnXHUwNDNjJyAgICMgIDB4RUMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVNCisgICAgdSdcdTA0M2QnICAgIyAgMHhFRCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU4KKyAgICB1J1x1MDQzZScgICAjICAweEVFIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBPCisgICAgdSdcdTA0M2YnICAgIyAgMHhFRiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgUEUKKyAgICB1J1x1MDQ0MCcgICAjICAweEYwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFUgorICAgIHUnXHUwNDQxJyAgICMgIDB4RjEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVTCisgICAgdSdcdTA0NDInICAgIyAgMHhGMiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVEUKKyAgICB1J1x1MDQ0MycgICAjICAweEYzIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBVCisgICAgdSdcdTA0NDQnICAgIyAgMHhGNCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUYKKyAgICB1J1x1MDQ0NScgICAjICAweEY1IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBIQQorICAgIHUnXHUwNDQ2JyAgICMgIDB4RjYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRQorICAgIHUnXHUwNDQ3JyAgICMgIDB4RjcgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRQorICAgIHUnXHUwNDQ4JyAgICMgIDB4RjggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQQorICAgIHUnXHUwNDQ5JyAgICMgIDB4RjkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisgICAgdSdcdTA0NGEnICAgIyAgMHhGQSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEFSRCBTSUdOCisgICAgdSdcdTA0NGInICAgIyAgMHhGQiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUVSVQorICAgIHUnXHUwNDRjJyAgICMgIDB4RkMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNPRlQgU0lHTgorICAgIHUnXHUwNDRkJyAgICMgIDB4RkQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEUKKyAgICB1J1x1MDQ0ZScgICAjICAweEZFIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZVQorICAgIHUnXHUwNDRmJyAgICMgIDB4RkYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTEucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUxLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTRkN2U4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUxLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTEucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUxLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTRkN2U4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUxLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTIucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwYTMyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Mi5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDEyNTIgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1AxMjUyLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwMTI1MicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdcdTIwYWMnICAgIyAgMHg4MCAtPiBFVVJPIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDgxIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDFhJyAgICMgIDB4ODIgLT4gU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxOTInICAgIyAgMHg4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x1MjAxZScgICAjICAweDg0IC0+IERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDI2JyAgICMgIDB4ODUgLT4gSE9SSVpPTlRBTCBFTExJUFNJUworICAgIHUnXHUyMDIwJyAgICMgIDB4ODYgLT4gREFHR0VSCisgICAgdSdcdTIwMjEnICAgIyAgMHg4NyAtPiBET1VCTEUgREFHR0VSCisgICAgdSdcdTAyYzYnICAgIyAgMHg4OCAtPiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J1x1MjAzMCcgICAjICAweDg5IC0+IFBFUiBNSUxMRSBTSUdOCisgICAgdSdcdTAxNjAnICAgIyAgMHg4QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MjAzOScgICAjICAweDhCIC0+IFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNTInICAgIyAgMHg4QyAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisgICAgdSdcdWZmZmUnICAgIyAgMHg4RCAtPiBVTkRFRklORUQKKyAgICB1J1x1MDE3ZCcgICAjICAweDhFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHVmZmZlJyAgICMgIDB4OEYgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5MCAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxOCcgICAjICAweDkxIC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHg5MiAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxYycgICAjICAweDkzIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHg5NCAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyMicgICAjICAweDk1IC0+IEJVTExFVAorICAgIHUnXHUyMDEzJyAgICMgIDB4OTYgLT4gRU4gREFTSAorICAgIHUnXHUyMDE0JyAgICMgIDB4OTcgLT4gRU0gREFTSAorICAgIHUnXHUwMmRjJyAgICMgIDB4OTggLT4gU01BTEwgVElMREUKKyAgICB1J1x1MjEyMicgICAjICAweDk5IC0+IFRSQURFIE1BUksgU0lHTgorICAgIHUnXHUwMTYxJyAgICMgIDB4OUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUyMDNhJyAgICMgIDB4OUIgLT4gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNTMnICAgIyAgMHg5QyAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRQorICAgIHUnXHVmZmZlJyAgICMgIDB4OUQgLT4gVU5ERUZJTkVECisgICAgdSdcdTAxN2UnICAgIyAgMHg5RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTAxNzgnICAgIyAgMHg5RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHhhMScgICAgICMgIDB4QTEgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhBNSAtPiBZRU4gU0lHTgorICAgIHUnXHhhNicgICAgICMgIDB4QTYgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhBOCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdceGFhJyAgICAgIyAgMHhBQSAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhhYicgICAgICMgIDB4QUIgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEFDIC0+IE5PVCBTSUdOCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhhZScgICAgICMgIDB4QUUgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGFmJyAgICAgIyAgMHhBRiAtPiBNQUNST04KKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjInICAgICAjICAweEIyIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiMycgICAgICMgIDB4QjMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4YjQnICAgICAjICAweEI0IC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdceGI4JyAgICAgIyAgMHhCOCAtPiBDRURJTExBCisgICAgdSdceGI5JyAgICAgIyAgMHhCOSAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x4YmEnICAgICAjICAweEJBIC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJjJyAgICAgIyAgMHhCQyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEJEIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QkUgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdceGJmJyAgICAgIyAgMHhCRiAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdceGMwJyAgICAgIyAgMHhDMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzEnICAgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMicgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzMnICAgICAjICAweEMzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhjNCcgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzYnICAgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgdSdceGM3JyAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhjOCcgICAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGM5JyAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4Y2EnICAgICAjICAweENBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNiJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4Y2QnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDAnICAgICAjICAweEQwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEVUSAorICAgIHUnXHhkMScgICAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQyJyAgICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDUnICAgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhkNicgICAgICMgIDB4RDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkNycgICAgICMgIDB4RDcgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHhkOCcgICAgICMgIDB4RDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhkOScgICAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGRhJyAgICAgIyAgMHhEQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZGInICAgICAjICAweERCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGRjJyAgICAgIyAgMHhEQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRkJyAgICAgIyAgMHhERCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZGUnICAgICAjICAweERFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisgICAgdSdceGRmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhlMCcgICAgICMgIDB4RTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMScgICAgICMgIDB4RTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4RTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGUzJyAgICAgIyAgMHhFMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU0JyAgICAgIyAgMHhFNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlNScgICAgICMgIDB4RTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU2JyAgICAgIyAgMHhFNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x4ZTcnICAgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOCcgICAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlOScgICAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlYScgICAgICMgIDB4RUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlYycgICAgICMgIDB4RUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhlZCcgICAgICMgIDB4RUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4RUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHhFRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMCcgICAgICMgIDB4RjAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEVUSAorICAgIHUnXHhmMScgICAgICMgIDB4RjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhmMicgICAgICMgIDB4RjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmMycgICAgICMgIDB4RjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmNCcgICAgICMgIDB4RjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY1JyAgICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4RjcgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHhmOCcgICAgICMgIDB4RjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4ZjknICAgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmEnICAgICAjICAweEZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZmInICAgICAjICAweEZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZmQnICAgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZmUnICAgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBUSE9STgorICAgIHUnXHhmZicgICAgICMgIDB4RkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Mi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTQxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Mi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTQxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1My5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1My5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY2Y2NjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUzLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwMTI1MyBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDEyNTMuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3AxMjUzJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBERUxFVEUKKyAgICB1J1x1MjBhYycgICAjICAweDgwIC0+IEVVUk8gU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4ODEgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMWEnICAgIyAgMHg4MiAtPiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDE5MicgICAjICAweDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIHUnXHUyMDFlJyAgICMgIDB4ODQgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHg4NSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdcdTIwMjAnICAgIyAgMHg4NiAtPiBEQUdHRVIKKyAgICB1J1x1MjAyMScgICAjICAweDg3IC0+IERPVUJMRSBEQUdHRVIKKyAgICB1J1x1ZmZmZScgICAjICAweDg4IC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDMwJyAgICMgIDB4ODkgLT4gUEVSIE1JTExFIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDhBIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDM5JyAgICMgIDB4OEIgLT4gU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1ZmZmZScgICAjICAweDhDIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OEQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4RSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhGIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OTAgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMTgnICAgIyAgMHg5MSAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4OTIgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWMnICAgIyAgMHg5MyAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFkJyAgICMgIDB4OTQgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjInICAgIyAgMHg5NSAtPiBCVUxMRVQKKyAgICB1J1x1MjAxMycgICAjICAweDk2IC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweDk3IC0+IEVNIERBU0gKKyAgICB1J1x1ZmZmZScgICAjICAweDk4IC0+IFVOREVGSU5FRAorICAgIHUnXHUyMTIyJyAgICMgIDB4OTkgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg5QSAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAzYScgICAjICAweDlCIC0+IFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHVmZmZlJyAgICMgIDB4OUMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5RCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDlFIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OUYgLT4gVU5ERUZJTkVECisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUwMzg1JyAgICMgIDB4QTEgLT4gR1JFRUsgRElBTFlUSUtBIFRPTk9TCisgICAgdSdcdTAzODYnICAgIyAgMHhBMiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhBNSAtPiBZRU4gU0lHTgorICAgIHUnXHhhNicgICAgICMgIDB4QTYgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhBOCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHhBQSAtPiBVTkRFRklORUQKKyAgICB1J1x4YWInICAgICAjICAweEFCIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhBQyAtPiBOT1QgU0lHTgorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4YWUnICAgICAjICAweEFFIC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHUyMDE1JyAgICMgIDB4QUYgLT4gSE9SSVpPTlRBTCBCQVIKKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjInICAgICAjICAweEIyIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiMycgICAgICMgIDB4QjMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x1MDM4NCcgICAjICAweEI0IC0+IEdSRUVLIFRPTk9TCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdceGI2JyAgICAgIyAgMHhCNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEI3IC0+IE1JRERMRSBET1QKKyAgICB1J1x1MDM4OCcgICAjICAweEI4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwMzg5JyAgICMgIDB4QjkgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4YScgICAjICAweEJBIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAzOGMnICAgIyAgMHhCQyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKyAgICB1J1x4YmQnICAgICAjICAweEJEIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHUwMzhlJyAgICMgIDB4QkUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzOGYnICAgIyAgMHhCRiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzOTAnICAgIyAgMHhDMCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQSBBTkQgVE9OT1MKKyAgICB1J1x1MDM5MScgICAjICAweEMxIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBCisgICAgdSdcdTAzOTInICAgIyAgMHhDMiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBCRVRBCisgICAgdSdcdTAzOTMnICAgIyAgMHhDMyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIHUnXHUwMzk0JyAgICMgIDB4QzQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MDM5NScgICAjICAweEM1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04KKyAgICB1J1x1MDM5NicgICAjICAweEM2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFpFVEEKKyAgICB1J1x1MDM5NycgICAjICAweEM3IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVUQQorICAgIHUnXHUwMzk4JyAgICMgIDB4QzggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICB1J1x1MDM5OScgICAjICAweEM5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEKKyAgICB1J1x1MDM5YScgICAjICAweENBIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBCisgICAgdSdcdTAzOWInICAgIyAgMHhDQiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBMQU1EQQorICAgIHUnXHUwMzljJyAgICMgIDB4Q0MgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTVUKKyAgICB1J1x1MDM5ZCcgICAjICAweENEIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE5VCisgICAgdSdcdTAzOWUnICAgIyAgMHhDRSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBYSQorICAgIHUnXHUwMzlmJyAgICMgIDB4Q0YgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTgorICAgIHUnXHUwM2EwJyAgICMgIDB4RDAgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEkKKyAgICB1J1x1MDNhMScgICAjICAweEQxIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFJITworICAgIHUnXHVmZmZlJyAgICMgIDB4RDIgLT4gVU5ERUZJTkVECisgICAgdSdcdTAzYTMnICAgIyAgMHhEMyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIHUnXHUwM2E0JyAgICMgIDB4RDQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCisgICAgdSdcdTAzYTUnICAgIyAgMHhENSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCisgICAgdSdcdTAzYTYnICAgIyAgMHhENiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICB1J1x1MDNhNycgICAjICAweEQ3IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIENISQorICAgIHUnXHUwM2E4JyAgICMgIDB4RDggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJCisgICAgdSdcdTAzYTknICAgIyAgMHhEOSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwM2FhJyAgICMgIDB4REEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwM2FiJyAgICMgIDB4REIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwM2FjJyAgICMgIDB4REMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICB1J1x1MDNhZCcgICAjICAweEREIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDNhZScgICAjICAweERFIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIHUnXHUwM2FmJyAgICMgIDB4REYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIHUnXHUwM2IwJyAgICMgIDB4RTAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TCisgICAgdSdcdTAzYjEnICAgIyAgMHhFMSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICB1J1x1MDNiMicgICAjICAweEUyIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBCRVRBCisgICAgdSdcdTAzYjMnICAgIyAgMHhFMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgR0FNTUEKKyAgICB1J1x1MDNiNCcgICAjICAweEU0IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIHUnXHUwM2I1JyAgICMgIDB4RTUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICB1J1x1MDNiNicgICAjICAweEU2IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBaRVRBCisgICAgdSdcdTAzYjcnICAgIyAgMHhFNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVRBCisgICAgdSdcdTAzYjgnICAgIyAgMHhFOCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEEKKyAgICB1J1x1MDNiOScgICAjICAweEU5IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBCisgICAgdSdcdTAzYmEnICAgIyAgMHhFQSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgS0FQUEEKKyAgICB1J1x1MDNiYicgICAjICAweEVCIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQorICAgIHUnXHUwM2JjJyAgICMgIDB4RUMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE1VCisgICAgdSdcdTAzYmQnICAgIyAgMHhFRCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgTlUKKyAgICB1J1x1MDNiZScgICAjICAweEVFIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBYSQorICAgIHUnXHUwM2JmJyAgICMgIDB4RUYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04KKyAgICB1J1x1MDNjMCcgICAjICAweEYwIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHUwM2MxJyAgICMgIDB4RjEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFJITworICAgIHUnXHUwM2MyJyAgICMgIDB4RjIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BCisgICAgdSdcdTAzYzMnICAgIyAgMHhGMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICB1J1x1MDNjNCcgICAjICAweEY0IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICB1J1x1MDNjNScgICAjICAweEY1IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OCisgICAgdSdcdTAzYzYnICAgIyAgMHhGNiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgdSdcdTAzYzcnICAgIyAgMHhGNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQ0hJCisgICAgdSdcdTAzYzgnICAgIyAgMHhGOCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUFNJCisgICAgdSdcdTAzYzknICAgIyAgMHhGOSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EKKyAgICB1J1x1MDNjYScgICAjICAweEZBIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzY2InICAgIyAgMHhGQiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwM2NjJyAgICMgIDB4RkMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUworICAgIHUnXHUwM2NkJyAgICMgIDB4RkQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwM2NlJyAgICMgIDB4RkUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICB1J1x1ZmZmZScgICAjICAweEZGIC0+IFVOREVGSU5FRAorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUzLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1My5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4ODU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1My5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUzLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1My5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4ODU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1My5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU0LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTMwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTQucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3AxMjU0IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQMTI1NC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDEyNTQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHUyMGFjJyAgICMgIDB4ODAgLT4gRVVSTyBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg4MSAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxYScgICAjICAweDgyIC0+IFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTkyJyAgICMgIDB4ODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdcdTIwMWUnICAgIyAgMHg4NCAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyNicgICAjICAweDg1IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x1MjAyMCcgICAjICAweDg2IC0+IERBR0dFUgorICAgIHUnXHUyMDIxJyAgICMgIDB4ODcgLT4gRE9VQkxFIERBR0dFUgorICAgIHUnXHUwMmM2JyAgICMgIDB4ODggLT4gTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdcdTIwMzAnICAgIyAgMHg4OSAtPiBQRVIgTUlMTEUgU0lHTgorICAgIHUnXHUwMTYwJyAgICMgIDB4OEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTIwMzknICAgIyAgMHg4QiAtPiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTUyJyAgICMgIDB4OEMgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRQorICAgIHUnXHVmZmZlJyAgICMgIDB4OEQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4RSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhGIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OTAgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMTgnICAgIyAgMHg5MSAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4OTIgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWMnICAgIyAgMHg5MyAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFkJyAgICMgIDB4OTQgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjInICAgIyAgMHg5NSAtPiBCVUxMRVQKKyAgICB1J1x1MjAxMycgICAjICAweDk2IC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweDk3IC0+IEVNIERBU0gKKyAgICB1J1x1MDJkYycgICAjICAweDk4IC0+IFNNQUxMIFRJTERFCisgICAgdSdcdTIxMjInICAgIyAgMHg5OSAtPiBUUkFERSBNQVJLIFNJR04KKyAgICB1J1x1MDE2MScgICAjICAweDlBIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MjAzYScgICAjICAweDlCIC0+IFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTUzJyAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKyAgICB1J1x1ZmZmZScgICAjICAweDlEIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OUUgLT4gVU5ERUZJTkVECisgICAgdSdcdTAxNzgnICAgIyAgMHg5RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHhhMScgICAgICMgIDB4QTEgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhBNSAtPiBZRU4gU0lHTgorICAgIHUnXHhhNicgICAgICMgIDB4QTYgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhBOCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdceGFhJyAgICAgIyAgMHhBQSAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhhYicgICAgICMgIDB4QUIgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEFDIC0+IE5PVCBTSUdOCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhhZScgICAgICMgIDB4QUUgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGFmJyAgICAgIyAgMHhBRiAtPiBNQUNST04KKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjInICAgICAjICAweEIyIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiMycgICAgICMgIDB4QjMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4YjQnICAgICAjICAweEI0IC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdceGI4JyAgICAgIyAgMHhCOCAtPiBDRURJTExBCisgICAgdSdceGI5JyAgICAgIyAgMHhCOSAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x4YmEnICAgICAjICAweEJBIC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJjJyAgICAgIyAgMHhCQyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEJEIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QkUgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdceGJmJyAgICAgIyAgMHhCRiAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdceGMwJyAgICAgIyAgMHhDMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzEnICAgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMicgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzMnICAgICAjICAweEMzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhjNCcgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzYnICAgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgdSdceGM3JyAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhjOCcgICAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGM5JyAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4Y2EnICAgICAjICAweENBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNiJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4Y2QnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDExZScgICAjICAweEQwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBCUkVWRQorICAgIHUnXHhkMScgICAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQyJyAgICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDUnICAgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhkNicgICAgICMgIDB4RDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkNycgICAgICMgIDB4RDcgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHhkOCcgICAgICMgIDB4RDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhkOScgICAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGRhJyAgICAgIyAgMHhEQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZGInICAgICAjICAweERCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGRjJyAgICAgIyAgMHhEQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMzAnICAgIyAgMHhERCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxNWUnICAgIyAgMHhERSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIHUnXHhkZicgICAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x4ZTAnICAgICAjICAweEUwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTEnICAgICAjICAweEUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTInICAgICAjICAweEUyIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlMycgICAgICMgIDB4RTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhlNCcgICAgICMgIDB4RTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTUnICAgICAjICAweEU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNicgICAgICMgIDB4RTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEFFCisgICAgdSdceGU3JyAgICAgIyAgMHhFNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZTgnICAgICAjICAweEU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZTknICAgICAjICAweEU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZWEnICAgICAjICAweEVBIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4RUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWMnICAgICAjICAweEVDIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZWQnICAgICAjICAweEVEIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZWUnICAgICAjICAweEVFIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4RUYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDExZicgICAjICAweEYwIC0+IExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICB1J1x4ZjEnICAgICAjICAweEYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZjInICAgICAjICAweEYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjMnICAgICAjICAweEYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZjQnICAgICAjICAweEY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNScgICAgICMgIDB4RjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhmNicgICAgICMgIDB4RjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjcnICAgICAjICAweEY3IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x4ZjgnICAgICAjICAweEY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGY5JyAgICAgIyAgMHhGOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZhJyAgICAgIyAgMHhGQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGZiJyAgICAgIyAgMHhGQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweEZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMzEnICAgIyAgMHhGRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJCisgICAgdSdcdTAxNWYnICAgIyAgMHhGRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZmYnICAgICAjICAweEZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTQucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmE0YTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTQucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmE0YTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTUucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxNDU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1NS5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDEyNTUgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1AxMjU1LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwMTI1NScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdcdTIwYWMnICAgIyAgMHg4MCAtPiBFVVJPIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDgxIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDFhJyAgICMgIDB4ODIgLT4gU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxOTInICAgIyAgMHg4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x1MjAxZScgICAjICAweDg0IC0+IERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDI2JyAgICMgIDB4ODUgLT4gSE9SSVpPTlRBTCBFTExJUFNJUworICAgIHUnXHUyMDIwJyAgICMgIDB4ODYgLT4gREFHR0VSCisgICAgdSdcdTIwMjEnICAgIyAgMHg4NyAtPiBET1VCTEUgREFHR0VSCisgICAgdSdcdTAyYzYnICAgIyAgMHg4OCAtPiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J1x1MjAzMCcgICAjICAweDg5IC0+IFBFUiBNSUxMRSBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg4QSAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAzOScgICAjICAweDhCIC0+IFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdWZmZmUnICAgIyAgMHg4QyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhEIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OEUgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4RiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDkwIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDE4JyAgICMgIDB4OTEgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOScgICAjICAweDkyIC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFjJyAgICMgIDB4OTMgLT4gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZCcgICAjICAweDk0IC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDIyJyAgICMgIDB4OTUgLT4gQlVMTEVUCisgICAgdSdcdTIwMTMnICAgIyAgMHg5NiAtPiBFTiBEQVNICisgICAgdSdcdTIwMTQnICAgIyAgMHg5NyAtPiBFTSBEQVNICisgICAgdSdcdTAyZGMnICAgIyAgMHg5OCAtPiBTTUFMTCBUSUxERQorICAgIHUnXHUyMTIyJyAgICMgIDB4OTkgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg5QSAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAzYScgICAjICAweDlCIC0+IFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHVmZmZlJyAgICMgIDB4OUMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5RCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDlFIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OUYgLT4gVU5ERUZJTkVECisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHhhMScgICAgICMgIDB4QTEgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdcdTIwYWEnICAgIyAgMHhBNCAtPiBORVcgU0hFUUVMIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweEE1IC0+IFlFTiBTSUdOCisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweEE4IC0+IERJQUVSRVNJUworICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4ZDcnICAgICAjICAweEFBIC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x4YWInICAgICAjICAweEFCIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhBQyAtPiBOT1QgU0lHTgorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4YWUnICAgICAjICAweEFFIC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhhZicgICAgICMgIDB4QUYgLT4gTUFDUk9OCisgICAgdSdceGIwJyAgICAgIyAgMHhCMCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdceGIyJyAgICAgIyAgMHhCMiAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4YjMnICAgICAjICAweEIzIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdceGI0JyAgICAgIyAgMHhCNCAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4YjUnICAgICAjICAweEI1IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x4YjYnICAgICAjICAweEI2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjcgLT4gTUlERExFIERPVAorICAgIHUnXHhiOCcgICAgICMgIDB4QjggLT4gQ0VESUxMQQorICAgIHUnXHhiOScgICAgICMgIDB4QjkgLT4gU1VQRVJTQ1JJUFQgT05FCisgICAgdSdceGY3JyAgICAgIyAgMHhCQSAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdceGJiJyAgICAgIyAgMHhCQiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmMnICAgICAjICAweEJDIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhiZCcgICAgICMgIDB4QkQgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJlJyAgICAgIyAgMHhCRSAtPiBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICB1J1x4YmYnICAgICAjICAweEJGIC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x1MDViMCcgICAjICAweEMwIC0+IEhFQlJFVyBQT0lOVCBTSEVWQQorICAgIHUnXHUwNWIxJyAgICMgIDB4QzEgLT4gSEVCUkVXIFBPSU5UIEhBVEFGIFNFR09MCisgICAgdSdcdTA1YjInICAgIyAgMHhDMiAtPiBIRUJSRVcgUE9JTlQgSEFUQUYgUEFUQUgKKyAgICB1J1x1MDViMycgICAjICAweEMzIC0+IEhFQlJFVyBQT0lOVCBIQVRBRiBRQU1BVFMKKyAgICB1J1x1MDViNCcgICAjICAweEM0IC0+IEhFQlJFVyBQT0lOVCBISVJJUQorICAgIHUnXHUwNWI1JyAgICMgIDB4QzUgLT4gSEVCUkVXIFBPSU5UIFRTRVJFCisgICAgdSdcdTA1YjYnICAgIyAgMHhDNiAtPiBIRUJSRVcgUE9JTlQgU0VHT0wKKyAgICB1J1x1MDViNycgICAjICAweEM3IC0+IEhFQlJFVyBQT0lOVCBQQVRBSAorICAgIHUnXHUwNWI4JyAgICMgIDB4QzggLT4gSEVCUkVXIFBPSU5UIFFBTUFUUworICAgIHUnXHUwNWI5JyAgICMgIDB4QzkgLT4gSEVCUkVXIFBPSU5UIEhPTEFNCisgICAgdSdcdWZmZmUnICAgIyAgMHhDQSAtPiBVTkRFRklORUQKKyAgICB1J1x1MDViYicgICAjICAweENCIC0+IEhFQlJFVyBQT0lOVCBRVUJVVFMKKyAgICB1J1x1MDViYycgICAjICAweENDIC0+IEhFQlJFVyBQT0lOVCBEQUdFU0ggT1IgTUFQSVEKKyAgICB1J1x1MDViZCcgICAjICAweENEIC0+IEhFQlJFVyBQT0lOVCBNRVRFRworICAgIHUnXHUwNWJlJyAgICMgIDB4Q0UgLT4gSEVCUkVXIFBVTkNUVUFUSU9OIE1BUUFGCisgICAgdSdcdTA1YmYnICAgIyAgMHhDRiAtPiBIRUJSRVcgUE9JTlQgUkFGRQorICAgIHUnXHUwNWMwJyAgICMgIDB4RDAgLT4gSEVCUkVXIFBVTkNUVUFUSU9OIFBBU0VRCisgICAgdSdcdTA1YzEnICAgIyAgMHhEMSAtPiBIRUJSRVcgUE9JTlQgU0hJTiBET1QKKyAgICB1J1x1MDVjMicgICAjICAweEQyIC0+IEhFQlJFVyBQT0lOVCBTSU4gRE9UCisgICAgdSdcdTA1YzMnICAgIyAgMHhEMyAtPiBIRUJSRVcgUFVOQ1RVQVRJT04gU09GIFBBU1VRCisgICAgdSdcdTA1ZjAnICAgIyAgMHhENCAtPiBIRUJSRVcgTElHQVRVUkUgWUlERElTSCBET1VCTEUgVkFWCisgICAgdSdcdTA1ZjEnICAgIyAgMHhENSAtPiBIRUJSRVcgTElHQVRVUkUgWUlERElTSCBWQVYgWU9ECisgICAgdSdcdTA1ZjInICAgIyAgMHhENiAtPiBIRUJSRVcgTElHQVRVUkUgWUlERElTSCBET1VCTEUgWU9ECisgICAgdSdcdTA1ZjMnICAgIyAgMHhENyAtPiBIRUJSRVcgUFVOQ1RVQVRJT04gR0VSRVNICisgICAgdSdcdTA1ZjQnICAgIyAgMHhEOCAtPiBIRUJSRVcgUFVOQ1RVQVRJT04gR0VSU0hBWUlNCisgICAgdSdcdWZmZmUnICAgIyAgMHhEOSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweERBIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4REIgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhEQyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEREIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4REUgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhERiAtPiBVTkRFRklORUQKKyAgICB1J1x1MDVkMCcgICAjICAweEUwIC0+IEhFQlJFVyBMRVRURVIgQUxFRgorICAgIHUnXHUwNWQxJyAgICMgIDB4RTEgLT4gSEVCUkVXIExFVFRFUiBCRVQKKyAgICB1J1x1MDVkMicgICAjICAweEUyIC0+IEhFQlJFVyBMRVRURVIgR0lNRUwKKyAgICB1J1x1MDVkMycgICAjICAweEUzIC0+IEhFQlJFVyBMRVRURVIgREFMRVQKKyAgICB1J1x1MDVkNCcgICAjICAweEU0IC0+IEhFQlJFVyBMRVRURVIgSEUKKyAgICB1J1x1MDVkNScgICAjICAweEU1IC0+IEhFQlJFVyBMRVRURVIgVkFWCisgICAgdSdcdTA1ZDYnICAgIyAgMHhFNiAtPiBIRUJSRVcgTEVUVEVSIFpBWUlOCisgICAgdSdcdTA1ZDcnICAgIyAgMHhFNyAtPiBIRUJSRVcgTEVUVEVSIEhFVAorICAgIHUnXHUwNWQ4JyAgICMgIDB4RTggLT4gSEVCUkVXIExFVFRFUiBURVQKKyAgICB1J1x1MDVkOScgICAjICAweEU5IC0+IEhFQlJFVyBMRVRURVIgWU9ECisgICAgdSdcdTA1ZGEnICAgIyAgMHhFQSAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIEtBRgorICAgIHUnXHUwNWRiJyAgICMgIDB4RUIgLT4gSEVCUkVXIExFVFRFUiBLQUYKKyAgICB1J1x1MDVkYycgICAjICAweEVDIC0+IEhFQlJFVyBMRVRURVIgTEFNRUQKKyAgICB1J1x1MDVkZCcgICAjICAweEVEIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgTUVNCisgICAgdSdcdTA1ZGUnICAgIyAgMHhFRSAtPiBIRUJSRVcgTEVUVEVSIE1FTQorICAgIHUnXHUwNWRmJyAgICMgIDB4RUYgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBOVU4KKyAgICB1J1x1MDVlMCcgICAjICAweEYwIC0+IEhFQlJFVyBMRVRURVIgTlVOCisgICAgdSdcdTA1ZTEnICAgIyAgMHhGMSAtPiBIRUJSRVcgTEVUVEVSIFNBTUVLSAorICAgIHUnXHUwNWUyJyAgICMgIDB4RjIgLT4gSEVCUkVXIExFVFRFUiBBWUlOCisgICAgdSdcdTA1ZTMnICAgIyAgMHhGMyAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIFBFCisgICAgdSdcdTA1ZTQnICAgIyAgMHhGNCAtPiBIRUJSRVcgTEVUVEVSIFBFCisgICAgdSdcdTA1ZTUnICAgIyAgMHhGNSAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIFRTQURJCisgICAgdSdcdTA1ZTYnICAgIyAgMHhGNiAtPiBIRUJSRVcgTEVUVEVSIFRTQURJCisgICAgdSdcdTA1ZTcnICAgIyAgMHhGNyAtPiBIRUJSRVcgTEVUVEVSIFFPRgorICAgIHUnXHUwNWU4JyAgICMgIDB4RjggLT4gSEVCUkVXIExFVFRFUiBSRVNICisgICAgdSdcdTA1ZTknICAgIyAgMHhGOSAtPiBIRUJSRVcgTEVUVEVSIFNISU4KKyAgICB1J1x1MDVlYScgICAjICAweEZBIC0+IEhFQlJFVyBMRVRURVIgVEFWCisgICAgdSdcdWZmZmUnICAgIyAgMHhGQiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEZDIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDBlJyAgICMgIDB4RkQgLT4gTEVGVC1UTy1SSUdIVCBNQVJLCisgICAgdSdcdTIwMGYnICAgIyAgMHhGRSAtPiBSSUdIVC1UTy1MRUZUIE1BUksKKyAgICB1J1x1ZmZmZScgICAjICAweEZGIC0+IFVOREVGSU5FRAorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU1LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1NS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1MDMxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1NS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU1LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1NS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1MDMxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1NS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU2LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMmI1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTYucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3AxMjU2IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQMTI1Ni5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDEyNTYnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHUyMGFjJyAgICMgIDB4ODAgLT4gRVVSTyBTSUdOCisgICAgdSdcdTA2N2UnICAgIyAgMHg4MSAtPiBBUkFCSUMgTEVUVEVSIFBFSAorICAgIHUnXHUyMDFhJyAgICMgIDB4ODIgLT4gU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxOTInICAgIyAgMHg4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x1MjAxZScgICAjICAweDg0IC0+IERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDI2JyAgICMgIDB4ODUgLT4gSE9SSVpPTlRBTCBFTExJUFNJUworICAgIHUnXHUyMDIwJyAgICMgIDB4ODYgLT4gREFHR0VSCisgICAgdSdcdTIwMjEnICAgIyAgMHg4NyAtPiBET1VCTEUgREFHR0VSCisgICAgdSdcdTAyYzYnICAgIyAgMHg4OCAtPiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J1x1MjAzMCcgICAjICAweDg5IC0+IFBFUiBNSUxMRSBTSUdOCisgICAgdSdcdTA2NzknICAgIyAgMHg4QSAtPiBBUkFCSUMgTEVUVEVSIFRURUgKKyAgICB1J1x1MjAzOScgICAjICAweDhCIC0+IFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNTInICAgIyAgMHg4QyAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisgICAgdSdcdTA2ODYnICAgIyAgMHg4RCAtPiBBUkFCSUMgTEVUVEVSIFRDSEVICisgICAgdSdcdTA2OTgnICAgIyAgMHg4RSAtPiBBUkFCSUMgTEVUVEVSIEpFSAorICAgIHUnXHUwNjg4JyAgICMgIDB4OEYgLT4gQVJBQklDIExFVFRFUiBEREFMCisgICAgdSdcdTA2YWYnICAgIyAgMHg5MCAtPiBBUkFCSUMgTEVUVEVSIEdBRgorICAgIHUnXHUyMDE4JyAgICMgIDB4OTEgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOScgICAjICAweDkyIC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFjJyAgICMgIDB4OTMgLT4gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZCcgICAjICAweDk0IC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDIyJyAgICMgIDB4OTUgLT4gQlVMTEVUCisgICAgdSdcdTIwMTMnICAgIyAgMHg5NiAtPiBFTiBEQVNICisgICAgdSdcdTIwMTQnICAgIyAgMHg5NyAtPiBFTSBEQVNICisgICAgdSdcdTA2YTknICAgIyAgMHg5OCAtPiBBUkFCSUMgTEVUVEVSIEtFSEVICisgICAgdSdcdTIxMjInICAgIyAgMHg5OSAtPiBUUkFERSBNQVJLIFNJR04KKyAgICB1J1x1MDY5MScgICAjICAweDlBIC0+IEFSQUJJQyBMRVRURVIgUlJFSAorICAgIHUnXHUyMDNhJyAgICMgIDB4OUIgLT4gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNTMnICAgIyAgMHg5QyAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRQorICAgIHUnXHUyMDBjJyAgICMgIDB4OUQgLT4gWkVSTyBXSURUSCBOT04tSk9JTkVSCisgICAgdSdcdTIwMGQnICAgIyAgMHg5RSAtPiBaRVJPIFdJRFRIIEpPSU5FUgorICAgIHUnXHUwNmJhJyAgICMgIDB4OUYgLT4gQVJBQklDIExFVFRFUiBOT09OIEdIVU5OQQorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MDYwYycgICAjICAweEExIC0+IEFSQUJJQyBDT01NQQorICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhBNSAtPiBZRU4gU0lHTgorICAgIHUnXHhhNicgICAgICMgIDB4QTYgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhBOCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTA2YmUnICAgIyAgMHhBQSAtPiBBUkFCSUMgTEVUVEVSIEhFSCBET0FDSEFTSE1FRQorICAgIHUnXHhhYicgICAgICMgIDB4QUIgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEFDIC0+IE5PVCBTSUdOCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhhZScgICAgICMgIDB4QUUgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGFmJyAgICAgIyAgMHhBRiAtPiBNQUNST04KKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjInICAgICAjICAweEIyIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiMycgICAgICMgIDB4QjMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4YjQnICAgICAjICAweEI0IC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdceGI4JyAgICAgIyAgMHhCOCAtPiBDRURJTExBCisgICAgdSdceGI5JyAgICAgIyAgMHhCOSAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x1MDYxYicgICAjICAweEJBIC0+IEFSQUJJQyBTRU1JQ09MT04KKyAgICB1J1x4YmInICAgICAjICAweEJCIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYycgICAgICMgIDB4QkMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGJkJyAgICAgIyAgMHhCRCAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmUnICAgICAjICAweEJFIC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnXHUwNjFmJyAgICMgIDB4QkYgLT4gQVJBQklDIFFVRVNUSU9OIE1BUksKKyAgICB1J1x1MDZjMScgICAjICAweEMwIC0+IEFSQUJJQyBMRVRURVIgSEVIIEdPQUwKKyAgICB1J1x1MDYyMScgICAjICAweEMxIC0+IEFSQUJJQyBMRVRURVIgSEFNWkEKKyAgICB1J1x1MDYyMicgICAjICAweEMyIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIE1BRERBIEFCT1ZFCisgICAgdSdcdTA2MjMnICAgIyAgMHhDMyAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBBQk9WRQorICAgIHUnXHUwNjI0JyAgICMgIDB4QzQgLT4gQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRQorICAgIHUnXHUwNjI1JyAgICMgIDB4QzUgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQkVMT1cKKyAgICB1J1x1MDYyNicgICAjICAweEM2IC0+IEFSQUJJQyBMRVRURVIgWUVIIFdJVEggSEFNWkEgQUJPVkUKKyAgICB1J1x1MDYyNycgICAjICAweEM3IC0+IEFSQUJJQyBMRVRURVIgQUxFRgorICAgIHUnXHUwNjI4JyAgICMgIDB4QzggLT4gQVJBQklDIExFVFRFUiBCRUgKKyAgICB1J1x1MDYyOScgICAjICAweEM5IC0+IEFSQUJJQyBMRVRURVIgVEVIIE1BUkJVVEEKKyAgICB1J1x1MDYyYScgICAjICAweENBIC0+IEFSQUJJQyBMRVRURVIgVEVICisgICAgdSdcdTA2MmInICAgIyAgMHhDQiAtPiBBUkFCSUMgTEVUVEVSIFRIRUgKKyAgICB1J1x1MDYyYycgICAjICAweENDIC0+IEFSQUJJQyBMRVRURVIgSkVFTQorICAgIHUnXHUwNjJkJyAgICMgIDB4Q0QgLT4gQVJBQklDIExFVFRFUiBIQUgKKyAgICB1J1x1MDYyZScgICAjICAweENFIC0+IEFSQUJJQyBMRVRURVIgS0hBSAorICAgIHUnXHUwNjJmJyAgICMgIDB4Q0YgLT4gQVJBQklDIExFVFRFUiBEQUwKKyAgICB1J1x1MDYzMCcgICAjICAweEQwIC0+IEFSQUJJQyBMRVRURVIgVEhBTAorICAgIHUnXHUwNjMxJyAgICMgIDB4RDEgLT4gQVJBQklDIExFVFRFUiBSRUgKKyAgICB1J1x1MDYzMicgICAjICAweEQyIC0+IEFSQUJJQyBMRVRURVIgWkFJTgorICAgIHUnXHUwNjMzJyAgICMgIDB4RDMgLT4gQVJBQklDIExFVFRFUiBTRUVOCisgICAgdSdcdTA2MzQnICAgIyAgMHhENCAtPiBBUkFCSUMgTEVUVEVSIFNIRUVOCisgICAgdSdcdTA2MzUnICAgIyAgMHhENSAtPiBBUkFCSUMgTEVUVEVSIFNBRAorICAgIHUnXHUwNjM2JyAgICMgIDB4RDYgLT4gQVJBQklDIExFVFRFUiBEQUQKKyAgICB1J1x4ZDcnICAgICAjICAweEQ3IC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x1MDYzNycgICAjICAweEQ4IC0+IEFSQUJJQyBMRVRURVIgVEFICisgICAgdSdcdTA2MzgnICAgIyAgMHhEOSAtPiBBUkFCSUMgTEVUVEVSIFpBSAorICAgIHUnXHUwNjM5JyAgICMgIDB4REEgLT4gQVJBQklDIExFVFRFUiBBSU4KKyAgICB1J1x1MDYzYScgICAjICAweERCIC0+IEFSQUJJQyBMRVRURVIgR0hBSU4KKyAgICB1J1x1MDY0MCcgICAjICAweERDIC0+IEFSQUJJQyBUQVRXRUVMCisgICAgdSdcdTA2NDEnICAgIyAgMHhERCAtPiBBUkFCSUMgTEVUVEVSIEZFSAorICAgIHUnXHUwNjQyJyAgICMgIDB4REUgLT4gQVJBQklDIExFVFRFUiBRQUYKKyAgICB1J1x1MDY0MycgICAjICAweERGIC0+IEFSQUJJQyBMRVRURVIgS0FGCisgICAgdSdceGUwJyAgICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdcdTA2NDQnICAgIyAgMHhFMSAtPiBBUkFCSUMgTEVUVEVSIExBTQorICAgIHUnXHhlMicgICAgICMgIDB4RTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTA2NDUnICAgIyAgMHhFMyAtPiBBUkFCSUMgTEVUVEVSIE1FRU0KKyAgICB1J1x1MDY0NicgICAjICAweEU0IC0+IEFSQUJJQyBMRVRURVIgTk9PTgorICAgIHUnXHUwNjQ3JyAgICMgIDB4RTUgLT4gQVJBQklDIExFVFRFUiBIRUgKKyAgICB1J1x1MDY0OCcgICAjICAweEU2IC0+IEFSQUJJQyBMRVRURVIgV0FXCisgICAgdSdceGU3JyAgICAgIyAgMHhFNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZTgnICAgICAjICAweEU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZTknICAgICAjICAweEU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZWEnICAgICAjICAweEVBIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4RUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDY0OScgICAjICAweEVDIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBCisgICAgdSdcdTA2NGEnICAgIyAgMHhFRCAtPiBBUkFCSUMgTEVUVEVSIFlFSAorICAgIHUnXHhlZScgICAgICMgIDB4RUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHhFRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwNjRiJyAgICMgIDB4RjAgLT4gQVJBQklDIEZBVEhBVEFOCisgICAgdSdcdTA2NGMnICAgIyAgMHhGMSAtPiBBUkFCSUMgREFNTUFUQU4KKyAgICB1J1x1MDY0ZCcgICAjICAweEYyIC0+IEFSQUJJQyBLQVNSQVRBTgorICAgIHUnXHUwNjRlJyAgICMgIDB4RjMgLT4gQVJBQklDIEZBVEhBCisgICAgdSdceGY0JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDY0ZicgICAjICAweEY1IC0+IEFSQUJJQyBEQU1NQQorICAgIHUnXHUwNjUwJyAgICMgIDB4RjYgLT4gQVJBQklDIEtBU1JBCisgICAgdSdceGY3JyAgICAgIyAgMHhGNyAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdcdTA2NTEnICAgIyAgMHhGOCAtPiBBUkFCSUMgU0hBRERBCisgICAgdSdceGY5JyAgICAgIyAgMHhGOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdcdTA2NTInICAgIyAgMHhGQSAtPiBBUkFCSUMgU1VLVU4KKyAgICB1J1x4ZmInICAgICAjICAweEZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MjAwZScgICAjICAweEZEIC0+IExFRlQtVE8tUklHSFQgTUFSSworICAgIHUnXHUyMDBmJyAgICMgIDB4RkUgLT4gUklHSFQtVE8tTEVGVCBNQVJLCisgICAgdSdcdTA2ZDInICAgIyAgMHhGRiAtPiBBUkFCSUMgTEVUVEVSIFlFSCBCQVJSRUUKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ni5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTlhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ni5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTlhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ny5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ny5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2E2YjI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU3LnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwMTI1NyBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDEyNTcuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3AxMjU3JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBERUxFVEUKKyAgICB1J1x1MjBhYycgICAjICAweDgwIC0+IEVVUk8gU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4ODEgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMWEnICAgIyAgMHg4MiAtPiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1ZmZmZScgICAjICAweDgzIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDFlJyAgICMgIDB4ODQgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHg4NSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdcdTIwMjAnICAgIyAgMHg4NiAtPiBEQUdHRVIKKyAgICB1J1x1MjAyMScgICAjICAweDg3IC0+IERPVUJMRSBEQUdHRVIKKyAgICB1J1x1ZmZmZScgICAjICAweDg4IC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDMwJyAgICMgIDB4ODkgLT4gUEVSIE1JTExFIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDhBIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDM5JyAgICMgIDB4OEIgLT4gU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1ZmZmZScgICAjICAweDhDIC0+IFVOREVGSU5FRAorICAgIHUnXHhhOCcgICAgICMgIDB4OEQgLT4gRElBRVJFU0lTCisgICAgdSdcdTAyYzcnICAgIyAgMHg4RSAtPiBDQVJPTgorICAgIHUnXHhiOCcgICAgICMgIDB4OEYgLT4gQ0VESUxMQQorICAgIHUnXHVmZmZlJyAgICMgIDB4OTAgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMTgnICAgIyAgMHg5MSAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4OTIgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWMnICAgIyAgMHg5MyAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFkJyAgICMgIDB4OTQgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjInICAgIyAgMHg5NSAtPiBCVUxMRVQKKyAgICB1J1x1MjAxMycgICAjICAweDk2IC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweDk3IC0+IEVNIERBU0gKKyAgICB1J1x1ZmZmZScgICAjICAweDk4IC0+IFVOREVGSU5FRAorICAgIHUnXHUyMTIyJyAgICMgIDB4OTkgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg5QSAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAzYScgICAjICAweDlCIC0+IFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHVmZmZlJyAgICMgIDB4OUMgLT4gVU5ERUZJTkVECisgICAgdSdceGFmJyAgICAgIyAgMHg5RCAtPiBNQUNST04KKyAgICB1J1x1MDJkYicgICAjICAweDlFIC0+IE9HT05FSworICAgIHUnXHVmZmZlJyAgICMgIDB4OUYgLT4gVU5ERUZJTkVECisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHVmZmZlJyAgICMgIDB4QTEgLT4gVU5ERUZJTkVECisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTQnICAgICAjICAweEE0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweEE1IC0+IFVOREVGSU5FRAorICAgIHUnXHhhNicgICAgICMgIDB4QTYgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHhBOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUwMTU2JyAgICMgIDB4QUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENFRElMTEEKKyAgICB1J1x4YWInICAgICAjICAweEFCIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhBQyAtPiBOT1QgU0lHTgorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4YWUnICAgICAjICAweEFFIC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhjNicgICAgICMgIDB4QUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjInICAgICAjICAweEIyIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiMycgICAgICMgIDB4QjMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4YjQnICAgICAjICAweEI0IC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdceGY4JyAgICAgIyAgMHhCOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhiOScgICAgICMgIDB4QjkgLT4gU1VQRVJTQ1JJUFQgT05FCisgICAgdSdcdTAxNTcnICAgIyAgMHhCQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENFRElMTEEKKyAgICB1J1x4YmInICAgICAjICAweEJCIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYycgICAgICMgIDB4QkMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGJkJyAgICAgIyAgMHhCRCAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmUnICAgICAjICAweEJFIC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnXHhlNicgICAgICMgIDB4QkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEFFCisgICAgdSdcdTAxMDQnICAgIyAgMHhDMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMmUnICAgIyAgMHhDMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMDAnICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMDYnICAgIyAgMHhDMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4YzQnICAgICAjICAweEM0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweEM1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdcdTAxMTgnICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMTInICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMGMnICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTc5JyAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdcdTAxMTYnICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxMjInICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTM2JyAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEyYScgICAjICAweENFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICB1J1x1MDEzYicgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgdSdcdTAxNjAnICAgIyAgMHhEMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MDE0MycgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIHUnXHUwMTQ1JyAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICB1J1x4ZDMnICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHUwMTRjJyAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIE1BQ1JPTgorICAgIHUnXHhkNScgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ3JyAgICAgIyAgMHhENyAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdcdTAxNzInICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggT0dPTkVLCisgICAgdSdcdTAxNDEnICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdcdTAxNWEnICAgIyAgMHhEQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICB1J1x1MDE2YScgICAjICAweERCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE3YicgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDE3ZCcgICAjICAweERFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHhkZicgICAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x1MDEwNScgICAjICAweEUwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMmYnICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE9HT05FSworICAgIHUnXHUwMTAxJyAgICMgIDB4RTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICB1J1x1MDEwNycgICAjICAweEUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU1JyAgICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x1MDExOScgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMTMnICAgIyAgMHhFNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTBkJyAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhlOScgICAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTdhJyAgICMgIDB4RUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIHUnXHUwMTE3JyAgICMgIDB4RUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDEyMycgICAjICAweEVDIC0+IExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTM3JyAgICMgIDB4RUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBDRURJTExBCisgICAgdSdcdTAxMmInICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTNjJyAgICMgIDB4RUYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgdSdcdTAxNjEnICAgIyAgMHhGMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTAxNDQnICAgIyAgMHhGMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdcdTAxNDYnICAgIyAgMHhGMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICB1J1x4ZjMnICAgICAjICAweEYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x1MDE0ZCcgICAjICAweEY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgdSdceGY1JyAgICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4RjcgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUwMTczJyAgICMgIDB4RjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDE0MicgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdcdTAxNWInICAgIyAgMHhGQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgdSdcdTAxNmInICAgIyAgMHhGQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE3YycgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxN2UnICAgIyAgMHhGRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTAyZDknICAgIyAgMHhGRiAtPiBET1QgQUJPVkUKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ny5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWJmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ny5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWJmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1OC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1OC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI1ZDhlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU4LnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwMTI1OCBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDEyNTguVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3AxMjU4JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBERUxFVEUKKyAgICB1J1x1MjBhYycgICAjICAweDgwIC0+IEVVUk8gU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4ODEgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMWEnICAgIyAgMHg4MiAtPiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDE5MicgICAjICAweDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIHUnXHUyMDFlJyAgICMgIDB4ODQgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHg4NSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdcdTIwMjAnICAgIyAgMHg4NiAtPiBEQUdHRVIKKyAgICB1J1x1MjAyMScgICAjICAweDg3IC0+IERPVUJMRSBEQUdHRVIKKyAgICB1J1x1MDJjNicgICAjICAweDg4IC0+IE1PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXHUyMDMwJyAgICMgIDB4ODkgLT4gUEVSIE1JTExFIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDhBIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDM5JyAgICMgIDB4OEIgLT4gU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDE1MicgICAjICAweDhDIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgT0UKKyAgICB1J1x1ZmZmZScgICAjICAweDhEIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OEUgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4RiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDkwIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDE4JyAgICMgIDB4OTEgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOScgICAjICAweDkyIC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFjJyAgICMgIDB4OTMgLT4gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZCcgICAjICAweDk0IC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDIyJyAgICMgIDB4OTUgLT4gQlVMTEVUCisgICAgdSdcdTIwMTMnICAgIyAgMHg5NiAtPiBFTiBEQVNICisgICAgdSdcdTIwMTQnICAgIyAgMHg5NyAtPiBFTSBEQVNICisgICAgdSdcdTAyZGMnICAgIyAgMHg5OCAtPiBTTUFMTCBUSUxERQorICAgIHUnXHUyMTIyJyAgICMgIDB4OTkgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg5QSAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAzYScgICAjICAweDlCIC0+IFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTUzJyAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKyAgICB1J1x1ZmZmZScgICAjICAweDlEIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OUUgLT4gVU5ERUZJTkVECisgICAgdSdcdTAxNzgnICAgIyAgMHg5RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHhhMScgICAgICMgIDB4QTEgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhBNSAtPiBZRU4gU0lHTgorICAgIHUnXHhhNicgICAgICMgIDB4QTYgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhBOCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdceGFhJyAgICAgIyAgMHhBQSAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhhYicgICAgICMgIDB4QUIgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEFDIC0+IE5PVCBTSUdOCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhhZScgICAgICMgIDB4QUUgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGFmJyAgICAgIyAgMHhBRiAtPiBNQUNST04KKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjInICAgICAjICAweEIyIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiMycgICAgICMgIDB4QjMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4YjQnICAgICAjICAweEI0IC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdceGI4JyAgICAgIyAgMHhCOCAtPiBDRURJTExBCisgICAgdSdceGI5JyAgICAgIyAgMHhCOSAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x4YmEnICAgICAjICAweEJBIC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJjJyAgICAgIyAgMHhCQyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEJEIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QkUgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdceGJmJyAgICAgIyAgMHhCRiAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdceGMwJyAgICAgIyAgMHhDMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzEnICAgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMicgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEwMicgICAjICAweEMzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRQorICAgIHUnXHhjNCcgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzYnICAgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgdSdceGM3JyAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhjOCcgICAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGM5JyAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4Y2EnICAgICAjICAweENBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNiJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAzMDAnICAgIyAgMHhDQyAtPiBDT01CSU5JTkcgR1JBVkUgQUNDRU5UCisgICAgdSdceGNkJyAgICAgIyAgMHhDRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweENFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHhDRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMTAnICAgIyAgMHhEMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggU1RST0tFCisgICAgdSdceGQxJyAgICAgIyAgMHhEMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x1MDMwOScgICAjICAweEQyIC0+IENPTUJJTklORyBIT09LIEFCT1ZFCisgICAgdSdceGQzJyAgICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxYTAnICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggSE9STgorICAgIHUnXHhkNicgICAgICMgIDB4RDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkNycgICAgICMgIDB4RDcgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHhkOCcgICAgICMgIDB4RDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhkOScgICAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGRhJyAgICAgIyAgMHhEQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZGInICAgICAjICAweERCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGRjJyAgICAgIyAgMHhEQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxYWYnICAgIyAgMHhERCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggSE9STgorICAgIHUnXHUwMzAzJyAgICMgIDB4REUgLT4gQ09NQklOSU5HIFRJTERFCisgICAgdSdceGRmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhlMCcgICAgICMgIDB4RTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMScgICAgICMgIDB4RTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4RTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxMDMnICAgIyAgMHhFMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFCisgICAgdSdceGU0JyAgICAgIyAgMHhFNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlNScgICAgICMgIDB4RTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU2JyAgICAgIyAgMHhFNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x4ZTcnICAgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOCcgICAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlOScgICAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlYScgICAgICMgIDB4RUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMzAxJyAgICMgIDB4RUMgLT4gQ09NQklOSU5HIEFDVVRFIEFDQ0VOVAorICAgIHUnXHhlZCcgICAgICMgIDB4RUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4RUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHhFRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTExJyAgICMgIDB4RjAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICB1J1x4ZjEnICAgICAjICAweEYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x1MDMyMycgICAjICAweEYyIC0+IENPTUJJTklORyBET1QgQkVMT1cKKyAgICB1J1x4ZjMnICAgICAjICAweEYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZjQnICAgICAjICAweEY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMWExJyAgICMgIDB4RjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4RjcgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHhmOCcgICAgICMgIDB4RjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4ZjknICAgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmEnICAgICAjICAweEZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZmInICAgICAjICAweEZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDFiMCcgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggSE9STgorICAgIHUnXHUyMGFiJyAgICMgIDB4RkUgLT4gRE9ORyBTSUdOCisgICAgdSdceGZmJyAgICAgIyAgMHhGRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU4LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1OC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1NDRkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1OC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU4LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1OC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE1NDRkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1OC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MjQucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDQyNC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2FkZTIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MjQucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3A0MjQgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlTQy9DUDQyNC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDQyNCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHg5YycgICAgICMgIDB4MDQgLT4gU0VMRUNUCisgICAgdSdcdCcgICAgICAgIyAgMHgwNSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1x4ODYnICAgICAjICAweDA2IC0+IFJFUVVJUkVEIE5FVyBMSU5FCisgICAgdSdceDdmJyAgICAgIyAgMHgwNyAtPiBERUxFVEUKKyAgICB1J1x4OTcnICAgICAjICAweDA4IC0+IEdSQVBISUMgRVNDQVBFCisgICAgdSdceDhkJyAgICAgIyAgMHgwOSAtPiBTVVBFUlNDUklQVAorICAgIHUnXHg4ZScgICAgICMgIDB4MEEgLT4gUkVQRUFUCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDlkJyAgICAgIyAgMHgxNCAtPiBSRVNUT1JFL0VOQUJMRSBQUkVTRU5UQVRJT04KKyAgICB1J1x4ODUnICAgICAjICAweDE1IC0+IE5FVyBMSU5FCisgICAgdSdceDA4JyAgICAgIyAgMHgxNiAtPiBCQUNLU1BBQ0UKKyAgICB1J1x4ODcnICAgICAjICAweDE3IC0+IFBST0dSQU0gT1BFUkFUT1IgQ09NTVVOSUNBVElPTgorICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDkyJyAgICAgIyAgMHgxQSAtPiBVTklUIEJBQ0sgU1BBQ0UKKyAgICB1J1x4OGYnICAgICAjICAweDFCIC0+IENVU1RPTUVSIFVTRSBPTkUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdSdceDgwJyAgICAgIyAgMHgyMCAtPiBESUdJVCBTRUxFQ1QKKyAgICB1J1x4ODEnICAgICAjICAweDIxIC0+IFNUQVJUIE9GIFNJR05JRklDQU5DRQorICAgIHUnXHg4MicgICAgICMgIDB4MjIgLT4gRklFTEQgU0VQQVJBVE9SCisgICAgdSdceDgzJyAgICAgIyAgMHgyMyAtPiBXT1JEIFVOREVSU0NPUkUKKyAgICB1J1x4ODQnICAgICAjICAweDI0IC0+IEJZUEFTUyBPUiBJTkhJQklUIFBSRVNFTlRBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MjUgLT4gTElORSBGRUVECisgICAgdSdceDE3JyAgICAgIyAgMHgyNiAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDFiJyAgICAgIyAgMHgyNyAtPiBFU0NBUEUKKyAgICB1J1x4ODgnICAgICAjICAweDI4IC0+IFNFVCBBVFRSSUJVVEUKKyAgICB1J1x4ODknICAgICAjICAweDI5IC0+IFNUQVJUIEZJRUxEIEVYVEVOREVECisgICAgdSdceDhhJyAgICAgIyAgMHgyQSAtPiBTRVQgTU9ERSBPUiBTV0lUQ0gKKyAgICB1J1x4OGInICAgICAjICAweDJCIC0+IENPTlRST0wgU0VRVUVOQ0UgUFJFRklYCisgICAgdSdceDhjJyAgICAgIyAgMHgyQyAtPiBNT0RJRlkgRklFTEQgQVRUUklCVVRFCisgICAgdSdceDA1JyAgICAgIyAgMHgyRCAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgyRSAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MkYgLT4gQkVMTAorICAgIHUnXHg5MCcgICAgICMgIDB4MzAgLT4gPHJlc2VydmVkPgorICAgIHUnXHg5MScgICAgICMgIDB4MzEgLT4gPHJlc2VydmVkPgorICAgIHUnXHgxNicgICAgICMgIDB4MzIgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHg5MycgICAgICMgIDB4MzMgLT4gSU5ERVggUkVUVVJOCisgICAgdSdceDk0JyAgICAgIyAgMHgzNCAtPiBQUkVTRU5UQVRJT04gUE9TSVRJT04KKyAgICB1J1x4OTUnICAgICAjICAweDM1IC0+IFRSQU5TUEFSRU5UCisgICAgdSdceDk2JyAgICAgIyAgMHgzNiAtPiBOVU1FUklDIEJBQ0tTUEFDRQorICAgIHUnXHgwNCcgICAgICMgIDB4MzcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHg5OCcgICAgICMgIDB4MzggLT4gU1VCU0NSSVBUCisgICAgdSdceDk5JyAgICAgIyAgMHgzOSAtPiBJTkRFTlQgVEFCVUxBVElPTgorICAgIHUnXHg5YScgICAgICMgIDB4M0EgLT4gUkVWRVJTRSBGT1JNIEZFRUQKKyAgICB1J1x4OWInICAgICAjICAweDNCIC0+IENVU1RPTUVSIFVTRSBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4M0MgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4M0QgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4OWUnICAgICAjICAweDNFIC0+IDxyZXNlcnZlZD4KKyAgICB1J1x4MWEnICAgICAjICAweDNGIC0+IFNVQlNUSVRVVEUKKyAgICB1JyAnICAgICAgICAjICAweDQwIC0+IFNQQUNFCisgICAgdSdcdTA1ZDAnICAgIyAgMHg0MSAtPiBIRUJSRVcgTEVUVEVSIEFMRUYKKyAgICB1J1x1MDVkMScgICAjICAweDQyIC0+IEhFQlJFVyBMRVRURVIgQkVUCisgICAgdSdcdTA1ZDInICAgIyAgMHg0MyAtPiBIRUJSRVcgTEVUVEVSIEdJTUVMCisgICAgdSdcdTA1ZDMnICAgIyAgMHg0NCAtPiBIRUJSRVcgTEVUVEVSIERBTEVUCisgICAgdSdcdTA1ZDQnICAgIyAgMHg0NSAtPiBIRUJSRVcgTEVUVEVSIEhFCisgICAgdSdcdTA1ZDUnICAgIyAgMHg0NiAtPiBIRUJSRVcgTEVUVEVSIFZBVgorICAgIHUnXHUwNWQ2JyAgICMgIDB4NDcgLT4gSEVCUkVXIExFVFRFUiBaQVlJTgorICAgIHUnXHUwNWQ3JyAgICMgIDB4NDggLT4gSEVCUkVXIExFVFRFUiBIRVQKKyAgICB1J1x1MDVkOCcgICAjICAweDQ5IC0+IEhFQlJFVyBMRVRURVIgVEVUCisgICAgdSdceGEyJyAgICAgIyAgMHg0QSAtPiBDRU5UIFNJR04KKyAgICB1Jy4nICAgICAgICAjICAweDRCIC0+IEZVTEwgU1RPUAorICAgIHUnPCcgICAgICAgICMgIDB4NEMgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1JygnICAgICAgICAjICAweDREIC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JysnICAgICAgICAjICAweDRFIC0+IFBMVVMgU0lHTgorICAgIHUnfCcgICAgICAgICMgIDB4NEYgLT4gVkVSVElDQUwgTElORQorICAgIHUnJicgICAgICAgICMgIDB4NTAgLT4gQU1QRVJTQU5ECisgICAgdSdcdTA1ZDknICAgIyAgMHg1MSAtPiBIRUJSRVcgTEVUVEVSIFlPRAorICAgIHUnXHUwNWRhJyAgICMgIDB4NTIgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBLQUYKKyAgICB1J1x1MDVkYicgICAjICAweDUzIC0+IEhFQlJFVyBMRVRURVIgS0FGCisgICAgdSdcdTA1ZGMnICAgIyAgMHg1NCAtPiBIRUJSRVcgTEVUVEVSIExBTUVECisgICAgdSdcdTA1ZGQnICAgIyAgMHg1NSAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIE1FTQorICAgIHUnXHUwNWRlJyAgICMgIDB4NTYgLT4gSEVCUkVXIExFVFRFUiBNRU0KKyAgICB1J1x1MDVkZicgICAjICAweDU3IC0+IEhFQlJFVyBMRVRURVIgRklOQUwgTlVOCisgICAgdSdcdTA1ZTAnICAgIyAgMHg1OCAtPiBIRUJSRVcgTEVUVEVSIE5VTgorICAgIHUnXHUwNWUxJyAgICMgIDB4NTkgLT4gSEVCUkVXIExFVFRFUiBTQU1FS0gKKyAgICB1JyEnICAgICAgICAjICAweDVBIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyQnICAgICAgICAjICAweDVCIC0+IERPTExBUiBTSUdOCisgICAgdScqJyAgICAgICAgIyAgMHg1QyAtPiBBU1RFUklTSworICAgIHUnKScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JzsnICAgICAgICAjICAweDVFIC0+IFNFTUlDT0xPTgorICAgIHUnXHhhYycgICAgICMgIDB4NUYgLT4gTk9UIFNJR04KKyAgICB1Jy0nICAgICAgICAjICAweDYwIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLycgICAgICAgICMgIDB4NjEgLT4gU09MSURVUworICAgIHUnXHUwNWUyJyAgICMgIDB4NjIgLT4gSEVCUkVXIExFVFRFUiBBWUlOCisgICAgdSdcdTA1ZTMnICAgIyAgMHg2MyAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIFBFCisgICAgdSdcdTA1ZTQnICAgIyAgMHg2NCAtPiBIRUJSRVcgTEVUVEVSIFBFCisgICAgdSdcdTA1ZTUnICAgIyAgMHg2NSAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIFRTQURJCisgICAgdSdcdTA1ZTYnICAgIyAgMHg2NiAtPiBIRUJSRVcgTEVUVEVSIFRTQURJCisgICAgdSdcdTA1ZTcnICAgIyAgMHg2NyAtPiBIRUJSRVcgTEVUVEVSIFFPRgorICAgIHUnXHUwNWU4JyAgICMgIDB4NjggLT4gSEVCUkVXIExFVFRFUiBSRVNICisgICAgdSdcdTA1ZTknICAgIyAgMHg2OSAtPiBIRUJSRVcgTEVUVEVSIFNISU4KKyAgICB1J1x4YTYnICAgICAjICAweDZBIC0+IEJST0tFTiBCQVIKKyAgICB1JywnICAgICAgICAjICAweDZCIC0+IENPTU1BCisgICAgdSclJyAgICAgICAgIyAgMHg2QyAtPiBQRVJDRU5UIFNJR04KKyAgICB1J18nICAgICAgICAjICAweDZEIC0+IExPVyBMSU5FCisgICAgdSc+JyAgICAgICAgIyAgMHg2RSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4NkYgLT4gUVVFU1RJT04gTUFSSworICAgIHUnXHVmZmZlJyAgICMgIDB4NzAgLT4gVU5ERUZJTkVECisgICAgdSdcdTA1ZWEnICAgIyAgMHg3MSAtPiBIRUJSRVcgTEVUVEVSIFRBVgorICAgIHUnXHVmZmZlJyAgICMgIDB4NzIgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg3MyAtPiBVTkRFRklORUQKKyAgICB1J1x4YTAnICAgICAjICAweDc0IC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdWZmZmUnICAgIyAgMHg3NSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDc2IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4NzcgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMTcnICAgIyAgMHg3OCAtPiBET1VCTEUgTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDc5IC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnOicgICAgICAgICMgIDB4N0EgLT4gQ09MT04KKyAgICB1JyMnICAgICAgICAjICAweDdCIC0+IE5VTUJFUiBTSUdOCisgICAgdSdAJyAgICAgICAgIyAgMHg3QyAtPiBDT01NRVJDSUFMIEFUCisgICAgdSInIiAgICAgICAgIyAgMHg3RCAtPiBBUE9TVFJPUEhFCisgICAgdSc9JyAgICAgICAgIyAgMHg3RSAtPiBFUVVBTFMgU0lHTgorICAgIHUnIicgICAgICAgICMgIDB4N0YgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1ZmZmZScgICAjICAweDgwIC0+IFVOREVGSU5FRAorICAgIHUnYScgICAgICAgICMgIDB4ODEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDgyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4ODQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDg1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg4NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4ODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnXHhhYicgICAgICMgIDB4OEEgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweDhCIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHVmZmZlJyAgICMgIDB4OEMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4RCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhFIC0+IFVOREVGSU5FRAorICAgIHUnXHhiMScgICAgICMgIDB4OEYgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdceGIwJyAgICAgIyAgMHg5MCAtPiBERUdSRUUgU0lHTgorICAgIHUnaicgICAgICAgICMgIDB4OTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDkyIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4OTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4OTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDk4IC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg5OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUnXHVmZmZlJyAgICMgIDB4OUEgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5QiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDlDIC0+IFVOREVGSU5FRAorICAgIHUnXHhiOCcgICAgICMgIDB4OUQgLT4gQ0VESUxMQQorICAgIHUnXHVmZmZlJyAgICMgIDB4OUUgLT4gVU5ERUZJTkVECisgICAgdSdceGE0JyAgICAgIyAgMHg5RiAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdceGI1JyAgICAgIyAgMHhBMCAtPiBNSUNSTyBTSUdOCisgICAgdSd+JyAgICAgICAgIyAgMHhBMSAtPiBUSUxERQorICAgIHUncycgICAgICAgICMgIDB4QTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweEEzIC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHhBNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4QTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweEE2IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHhBNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4QTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweEE5IC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSdcdWZmZmUnICAgIyAgMHhBQSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEFCIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4QUMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhBRCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEFFIC0+IFVOREVGSU5FRAorICAgIHUnXHhhZScgICAgICMgIDB4QUYgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdeJyAgICAgICAgIyAgMHhCMCAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXHhhMycgICAgICMgIDB4QjEgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhhNScgICAgICMgIDB4QjIgLT4gWUVOIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEIzIC0+IE1JRERMRSBET1QKKyAgICB1J1x4YTknICAgICAjICAweEI0IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdceGE3JyAgICAgIyAgMHhCNSAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YjYnICAgICAjICAweEI2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhiYycgICAgICMgIDB4QjcgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGJkJyAgICAgIyAgMHhCOCAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmUnICAgICAjICAweEI5IC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnWycgICAgICAgICMgIDB4QkEgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXScgICAgICAgICMgIDB4QkIgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1x4YWYnICAgICAjICAweEJDIC0+IE1BQ1JPTgorICAgIHUnXHhhOCcgICAgICMgIDB4QkQgLT4gRElBRVJFU0lTCisgICAgdSdceGI0JyAgICAgIyAgMHhCRSAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4ZDcnICAgICAjICAweEJGIC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J3snICAgICAgICAjICAweEMwIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnQScgICAgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4QzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4QzkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnXHhhZCcgICAgICMgIDB4Q0EgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x1ZmZmZScgICAjICAweENCIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4Q0MgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhDRCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweENFIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4Q0YgLT4gVU5ERUZJTkVECisgICAgdSd9JyAgICAgICAgIyAgMHhEMCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSdKJyAgICAgICAgIyAgMHhEMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHhENyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdceGI5JyAgICAgIyAgMHhEQSAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x1ZmZmZScgICAjICAweERCIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4REMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhERCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweERFIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4REYgLT4gVU5ERUZJTkVECisgICAgdSdcXCcgICAgICAgIyAgMHhFMCAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J1x4ZjcnICAgICAjICAweEUxIC0+IERJVklTSU9OIFNJR04KKyAgICB1J1MnICAgICAgICAjICAweEUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweEUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweEU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweEU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweEU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweEU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweEU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweEU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1x4YjInICAgICAjICAweEVBIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHVmZmZlJyAgICMgIDB4RUIgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhFQyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEVEIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RUUgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhFRiAtPiBVTkRFRklORUQKKyAgICB1JzAnICAgICAgICAjICAweEYwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweEYxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4RjIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHhGMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4RjQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4RjUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4RjYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHhGNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4RjggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweEY5IC0+IERJR0lUIE5JTkUKKyAgICB1J1x4YjMnICAgICAjICAweEZBIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdcdWZmZmUnICAgIyAgMHhGQiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEZDIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RkQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhGRSAtPiBVTkRFRklORUQKKyAgICB1J1x4OWYnICAgICAjICAweEZGIC0+IEVJR0hUIE9ORVMKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNDI0LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNDI0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWFhNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MjQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNDI0LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNDI0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWFhNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MjQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNDM3LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MzcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjZDg4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNDM3LnB5CkBAIC0wLDAgKzEsNjk4IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwNDM3IGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL01JQ1NGVC9QQy9DUDQzNy5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwNDM3JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDA4MDogMHgwMGM3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwODE6IDB4MDBmYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDgyOiAweDAwZTksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDgzOiAweDAwZTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODQ6IDB4MDBlNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDg1OiAweDAwZTAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMDg2OiAweDAwZTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwODc6IDB4MDBlNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4ODogMHgwMGVhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDg5OiAweDAwZWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4YTogMHgwMGU4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDA4YjogMHgwMGVmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOGM6IDB4MDBlZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4ZDogMHgwMGVjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIDB4MDA4ZTogMHgwMGM0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4ZjogMHgwMGM1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwOTA6IDB4MDBjOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA5MTogMHgwMGU2LCAgICAgIyAgTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICAweDAwOTI6IDB4MDBjNiwgICAgICMgIExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICAweDAwOTM6IDB4MDBmNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5NDogMHgwMGY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOTU6IDB4MDBmMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAweDAwOTY6IDB4MDBmYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5NzogMHgwMGY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDA5ODogMHgwMGZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOTk6IDB4MDBkNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWE6IDB4MDBkYywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWI6IDB4MDBhMiwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDA5YzogMHgwMGEzLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDA5ZDogMHgwMGE1LCAgICAgIyAgWUVOIFNJR04KKyAgICAweDAwOWU6IDB4MjBhNywgICAgICMgIFBFU0VUQSBTSUdOCisgICAgMHgwMDlmOiAweDAxOTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICAweDAwYTA6IDB4MDBlMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwYTE6IDB4MDBlZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwYTI6IDB4MDBmMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwYTM6IDB4MDBmYSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwYTQ6IDB4MDBmMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwYTU6IDB4MDBkMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBhNjogMHgwMGFhLCAgICAgIyAgRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYTc6IDB4MDBiYSwgICAgICMgIE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBhODogMHgwMGJmLCAgICAgIyAgSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIDB4MDBhOTogMHgyMzEwLCAgICAgIyAgUkVWRVJTRUQgTk9UIFNJR04KKyAgICAweDAwYWE6IDB4MDBhYywgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGFiOiAweDAwYmQsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYWM6IDB4MDBiYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBhZDogMHgwMGExLCAgICAgIyAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDBhZTogMHgwMGFiLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWY6IDB4MDBiYiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiMDogMHgyNTkxLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDAwYjE6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDBiMjogMHgyNTkzLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MDBiMzogMHgyNTAyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgwMGI0OiAweDI1MjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYjU6IDB4MjU2MSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGI2OiAweDI1NjIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiNzogMHgyNTU2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiODogMHgyNTU1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiOTogMHgyNTYzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiYTogMHgyNTUxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MDBiYjogMHgyNTU3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgwMGJjOiAweDI1NWQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgwMGJkOiAweDI1NWMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiZTogMHgyNTViLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYmY6IDB4MjUxMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgwMGMwOiAweDI1MTQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgwMGMxOiAweDI1MzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzI6IDB4MjUyYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMzOiAweDI1MWMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGM0OiAweDI1MDAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MDBjNTogMHgyNTNjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGM2OiAweDI1NWUsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwYzc6IDB4MjU1ZiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgyNTY3LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDA6IDB4MjU2OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQxOiAweDI1NjQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQyOiAweDI1NjUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQzOiAweDI1NTksICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwZDQ6IDB4MjU1OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBkNTogMHgyNTUyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwZDY6IDB4MjU1MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGQ3OiAweDI1NmIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkODogMHgyNTZhLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDk6IDB4MjUxOCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MDBkYTogMHgyNTBjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGRiOiAweDI1ODgsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgwMGRjOiAweDI1ODQsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgwMGRkOiAweDI1OGMsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGU6IDB4MjU5MCwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGY6IDB4MjU4MCwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDAwZTA6IDB4MDNiMSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDBlMTogMHgwMGRmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTI6IDB4MDM5MywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMGUzOiAweDAzYzAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICAweDAwZTQ6IDB4MDNhMywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgMHgwMGU1OiAweDAzYzMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAwZTY6IDB4MDBiNSwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwZTc6IDB4MDNjNCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICAweDAwZTg6IDB4MDNhNiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIDB4MDBlOTogMHgwMzk4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICAweDAwZWE6IDB4MDNhOSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgMHgwMGViOiAweDAzYjQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICAweDAwZWM6IDB4MjIxZSwgICAgICMgIElORklOSVRZCisgICAgMHgwMGVkOiAweDAzYzYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgMHgwMGVlOiAweDAzYjUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDBlZjogMHgyMjI5LCAgICAgIyAgSU5URVJTRUNUSU9OCisgICAgMHgwMGYwOiAweDIyNjEsICAgICAjICBJREVOVElDQUwgVE8KKyAgICAweDAwZjE6IDB4MDBiMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBmMjogMHgyMjY1LCAgICAgIyAgR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgwMGYzOiAweDIyNjQsICAgICAjICBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDAwZjQ6IDB4MjMyMCwgICAgICMgIFRPUCBIQUxGIElOVEVHUkFMCisgICAgMHgwMGY1OiAweDIzMjEsICAgICAjICBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIDB4MDBmNjogMHgwMGY3LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmNzogMHgyMjQ4LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgwMGY4OiAweDAwYjAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBmOTogMHgyMjE5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgwMGZhOiAweDAwYjcsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGZiOiAweDIyMWEsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MDBmYzogMHgyMDdmLCAgICAgIyAgU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwZmQ6IDB4MDBiMiwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBmZTogMHgyNWEwLCAgICAgIyAgQkxBQ0sgU1FVQVJFCisgICAgMHgwMGZmOiAweDAwYTAsICAgICAjICBOTy1CUkVBSyBTUEFDRQorfSkKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAwMDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDAwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDAwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwMDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDAwMDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDAwMDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDAwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDAwMDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwMDBhIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MDAwYiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwMDBjIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MDAwZCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDAwMGUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwMDBmIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgwMDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDAwMTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgwMDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MDAxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MDAxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgwMDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgwMDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDAwMTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MDAxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDAwMTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MDAxYSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgwMDFiIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MDAxYyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MDAxZCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDAwMWUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MDAxZiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MDAyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MDAyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgwMDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgwMDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgwMDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgwMDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MDAyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDAwMjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MDAyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgwMDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgwMDJhIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgwMDJiIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MDAyYyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MDAyZCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDAwMmUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgwMDJmIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDAwMzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MDAzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDAwMzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgwMDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgwMDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDAwMzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MDAzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDAwMzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDAwMzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDAwMzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4MDAzYSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4MDAzYiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDAwM2MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDAwM2QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDAwM2UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDAwM2YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4MDA0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHgwMDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDAwNDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4MDA0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHgwMDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDAwNDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4MDA0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHgwMDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDAwNDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4MDA0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHgwMDRhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDAwNGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4MDA0YyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHgwMDRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDAwNGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4MDA0ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHgwMDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDAwNTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4MDA1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHgwMDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDAwNTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4MDA1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHgwMDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDAwNTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4MDA1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHgwMDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDAwNWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4MDA1YiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHgwMDVjIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4MDA1ZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4MDA1ZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4MDA1ZiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4MDA2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDAwNjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDAwNjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDAwNjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDAwNjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDAwNjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDAwNjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDAwNjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDAwNjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDAwNjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDAwNmEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDAwNmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDAwNmMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDAwNmQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDAwNmUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDAwNmYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDAwNzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDAwNzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDAwNzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDAwNzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDAwNzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDAwNzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDAwNzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDAwNzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDAwNzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDAwNzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDAwN2EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDAwN2IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHgwMDdjIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDAwN2QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4MDA3ZSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4MDA3ZiAtPiBERUxFVEUKKyAgICB1J1x4YzcnICAgICAjICAweDAwODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZmMnICAgICAjICAweDAwODEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTknICAgICAjICAweDAwODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4MDA4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDAwODQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTAnICAgICAjICAweDAwODUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlNScgICAgICMgIDB4MDA4NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTcnICAgICAjICAweDAwODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGVhJyAgICAgIyAgMHgwMDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4MDA4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOCcgICAgICMgIDB4MDA4YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGVmJyAgICAgIyAgMHgwMDhiIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVlJyAgICAgIyAgMHgwMDhjIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYycgICAgICMgIDB4MDA4ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGM0JyAgICAgIyAgMHgwMDhlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweDAwOGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzknICAgICAjICAweDAwOTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGU2JyAgICAgIyAgMHgwMDkxIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgdSdceGM2JyAgICAgIyAgMHgwMDkyIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICB1J1x4ZjQnICAgICAjICAweDAwOTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHgwMDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGYyJyAgICAgIyAgMHgwMDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZmInICAgICAjICAweDAwOTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY5JyAgICAgIyAgMHgwMDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmYnICAgICAjICAweDAwOTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDYnICAgICAjICAweDAwOTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkYycgICAgICMgIDB4MDA5YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGEyJyAgICAgIyAgMHgwMDliIC0+IENFTlQgU0lHTgorICAgIHUnXHhhMycgICAgICMgIDB4MDA5YyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHgwMDlkIC0+IFlFTiBTSUdOCisgICAgdSdcdTIwYTcnICAgIyAgMHgwMDllIC0+IFBFU0VUQSBTSUdOCisgICAgdSdcdTAxOTInICAgIyAgMHgwMDlmIC0+IExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIHUnXHhlMScgICAgICMgIDB4MDBhMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGVkJyAgICAgIyAgMHgwMGExIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZjMnICAgICAjICAweDAwYTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmYScgICAgICMgIDB4MDBhMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGYxJyAgICAgIyAgMHgwMGE0IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDEnICAgICAjICAweDAwYTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGFhJyAgICAgIyAgMHgwMGE2IC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJhJyAgICAgIyAgMHgwMGE3IC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiZicgICAgICMgIDB4MDBhOCAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdcdTIzMTAnICAgIyAgMHgwMGE5IC0+IFJFVkVSU0VEIE5PVCBTSUdOCisgICAgdSdceGFjJyAgICAgIyAgMHgwMGFhIC0+IE5PVCBTSUdOCisgICAgdSdceGJkJyAgICAgIyAgMHgwMGFiIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiYycgICAgICMgIDB4MDBhYyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YTEnICAgICAjICAweDAwYWQgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhhYicgICAgICMgIDB4MDBhZSAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4MDBhZiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjU5MScgICAjICAweDAwYjAgLT4gTElHSFQgU0hBREUKKyAgICB1J1x1MjU5MicgICAjICAweDAwYjEgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1OTMnICAgIyAgMHgwMGIyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjUwMicgICAjICAweDAwYjMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MjQnICAgIyAgMHgwMGI0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTYxJyAgICMgIDB4MDBiNSAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYyJyAgICMgIDB4MDBiNiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU2JyAgICMgIDB4MDBiNyAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NTUnICAgIyAgMHgwMGI4IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjU2MycgICAjICAweDAwYjkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTUxJyAgICMgIDB4MDBiYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTcnICAgIyAgMHgwMGJiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTVkJyAgICMgIDB4MDBiYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdcdTI1NWMnICAgIyAgMHgwMGJkIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NWInICAgIyAgMHgwMGJlIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1MTAnICAgIyAgMHgwMGJmIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHgwMGMwIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjUzNCcgICAjICAweDAwYzEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MmMnICAgIyAgMHgwMGMyIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHgwMGMzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUwMCcgICAjICAweDAwYzQgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweDAwYzUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NWUnICAgIyAgMHgwMGM2IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTVmJyAgICMgIDB4MDBjNyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1YScgICAjICAweDAwYzggLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjU1NCcgICAjICAweDAwYzkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTY5JyAgICMgIDB4MDBjYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjYnICAgIyAgMHgwMGNiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTYwJyAgICMgIDB4MDBjYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTUwJyAgICMgIDB4MDBjZCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICB1J1x1MjU2YycgICAjICAweDAwY2UgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY3JyAgICMgIDB4MDBjZiAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY4JyAgICMgIDB4MDBkMCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTY0JyAgICMgIDB4MDBkMSAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjUnICAgIyAgMHgwMGQyIC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU1OScgICAjICAweDAwZDMgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NTgnICAgIyAgMHgwMGQ0IC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTUyJyAgICMgIDB4MDBkNSAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTUzJyAgICMgIDB4MDBkNiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTZiJyAgICMgIDB4MDBkNyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTZhJyAgICMgIDB4MDBkOCAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTE4JyAgICMgIDB4MDBkOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweDAwZGEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHgwMGRiIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweDAwZGMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHUyNThjJyAgICMgIDB4MDBkZCAtPiBMRUZUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU5MCcgICAjICAweDAwZGUgLT4gUklHSFQgSEFMRiBCTE9DSworICAgIHUnXHUyNTgwJyAgICMgIDB4MDBkZiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdcdTAzYjEnICAgIyAgMHgwMGUwIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIHUnXHhkZicgICAgICMgIDB4MDBlMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHUwMzkzJyAgICMgIDB4MDBlMiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIHUnXHUwM2MwJyAgICMgIDB4MDBlMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICB1J1x1MDNhMycgICAjICAweDAwZTQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICB1J1x1MDNjMycgICAjICAweDAwZTUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgdSdceGI1JyAgICAgIyAgMHgwMGU2IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x1MDNjNCcgICAjICAweDAwZTcgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIHUnXHUwM2E2JyAgICMgIDB4MDBlOCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICB1J1x1MDM5OCcgICAjICAweDAwZTkgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICB1J1x1MDNhOScgICAjICAweDAwZWEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICB1J1x1MDNiNCcgICAjICAweDAwZWIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgdSdcdTIyMWUnICAgIyAgMHgwMGVjIC0+IElORklOSVRZCisgICAgdSdcdTAzYzYnICAgIyAgMHgwMGVkIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICB1J1x1MDNiNScgICAjICAweDAwZWUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICB1J1x1MjIyOScgICAjICAweDAwZWYgLT4gSU5URVJTRUNUSU9OCisgICAgdSdcdTIyNjEnICAgIyAgMHgwMGYwIC0+IElERU5USUNBTCBUTworICAgIHUnXHhiMScgICAgICMgIDB4MDBmMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MjI2NScgICAjICAweDAwZjIgLT4gR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIyNjQnICAgIyAgMHgwMGYzIC0+IExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMzIwJyAgICMgIDB4MDBmNCAtPiBUT1AgSEFMRiBJTlRFR1JBTAorICAgIHUnXHUyMzIxJyAgICMgIDB4MDBmNSAtPiBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIHUnXHhmNycgICAgICMgIDB4MDBmNiAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdcdTIyNDgnICAgIyAgMHgwMGY3IC0+IEFMTU9TVCBFUVVBTCBUTworICAgIHUnXHhiMCcgICAgICMgIDB4MDBmOCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHUyMjE5JyAgICMgIDB4MDBmOSAtPiBCVUxMRVQgT1BFUkFUT1IKKyAgICB1J1x4YjcnICAgICAjICAweDAwZmEgLT4gTUlERExFIERPVAorICAgIHUnXHUyMjFhJyAgICMgIDB4MDBmYiAtPiBTUVVBUkUgUk9PVAorICAgIHUnXHUyMDdmJyAgICMgIDB4MDBmYyAtPiBTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnXHhiMicgICAgICMgIDB4MDBmZCAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHgwMGZmIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQKKyAgICAweDAwMjc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUKKyAgICAweDAwMjg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMKKyAgICAweDAwMjk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSworICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOCisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQQorICAgIDB4MDAyZDogMHgwMDJkLCAgICAgIyAgSFlQSEVOLU1JTlVTCisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OCisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04KKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOCisgICAgMHgwMDNkOiAweDAwM2QsICAgICAjICBFUVVBTFMgU0lHTgorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04KKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUksKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUworICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5UCisgICAgMHgwMDVmOiAweDAwNWYsICAgICAjICBMT1cgTElORQorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3YzogMHgwMDdjLCAgICAgIyAgVkVSVElDQUwgTElORQorICAgIDB4MDA3ZDogMHgwMDdkLCAgICAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3ZTogMHgwMDdlLCAgICAgIyAgVElMREUKKyAgICAweDAwN2Y6IDB4MDA3ZiwgICAgICMgIERFTEVURQorICAgIDB4MDBhMDogMHgwMGZmLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKKyAgICAweDAwYTE6IDB4MDBhZCwgICAgICMgIElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwYTI6IDB4MDA5YiwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDBhMzogMHgwMDljLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDBhNTogMHgwMDlkLCAgICAgIyAgWUVOIFNJR04KKyAgICAweDAwYWE6IDB4MDBhNiwgICAgICMgIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGFiOiAweDAwYWUsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhYzogMHgwMGFhLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYjA6IDB4MDBmOCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGIxOiAweDAwZjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwYjI6IDB4MDBmZCwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBiNTogMHgwMGU2LCAgICAgIyAgTUlDUk8gU0lHTgorICAgIDB4MDBiNzogMHgwMGZhLCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBiYTogMHgwMGE3LCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGJiOiAweDAwYWYsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYmM6IDB4MDBhYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBiZDogMHgwMGFiLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgMHgwMGJmOiAweDAwYTgsICAgICAjICBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgMHgwMGM0OiAweDAwOGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGM1OiAweDAwOGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBjNjogMHgwMDkyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDBjNzogMHgwMDgwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwYzk6IDB4MDA5MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDBkMTogMHgwMGE1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGQ2OiAweDAwOTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGRjOiAweDAwOWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGRmOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMDogMHgwMDg1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBlMTogMHgwMGEwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBlMjogMHgwMDgzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGU0OiAweDAwODQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlNTogMHgwMDg2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMGU2OiAweDAwOTEsICAgICAjICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIDB4MDBlNzogMHgwMDg3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGU4OiAweDAwOGEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGU5OiAweDAwODIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGVhOiAweDAwODgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWI6IDB4MDA4OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGVjOiAweDAwOGQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMGVkOiAweDAwYTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGVlOiAweDAwOGMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWY6IDB4MDA4YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGYxOiAweDAwYTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGYyOiAweDAwOTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMGYzOiAweDAwYTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGY0OiAweDAwOTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZjY6IDB4MDA5NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGY3OiAweDAwZjYsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY5OiAweDAwOTcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMGZhOiAweDAwYTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGZiOiAweDAwOTYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZmM6IDB4MDA4MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGZmOiAweDAwOTgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIDB4MDE5MjogMHgwMDlmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgMHgwMzkzOiAweDAwZTIsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIDB4MDM5ODogMHgwMGU5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICAweDAzYTM6IDB4MDBlNCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgMHgwM2E2OiAweDAwZTgsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICAweDAzYTk6IDB4MDBlYSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgMHgwM2IxOiAweDAwZTAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICAweDAzYjQ6IDB4MDBlYiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIDB4MDNiNTogMHgwMGVlLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICAweDAzYzA6IDB4MDBlMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIDB4MDNjMzogMHgwMGU1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgMHgwM2M0OiAweDAwZTcsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgMHgwM2M2OiAweDAwZWQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgMHgyMDdmOiAweDAwZmMsICAgICAjICBTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MjBhNzogMHgwMDllLCAgICAgIyAgUEVTRVRBIFNJR04KKyAgICAweDIyMTk6IDB4MDBmOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MjIxYTogMHgwMGZiLCAgICAgIyAgU1FVQVJFIFJPT1QKKyAgICAweDIyMWU6IDB4MDBlYywgICAgICMgIElORklOSVRZCisgICAgMHgyMjI5OiAweDAwZWYsICAgICAjICBJTlRFUlNFQ1RJT04KKyAgICAweDIyNDg6IDB4MDBmNywgICAgICMgIEFMTU9TVCBFUVVBTCBUTworICAgIDB4MjI2MTogMHgwMGYwLCAgICAgIyAgSURFTlRJQ0FMIFRPCisgICAgMHgyMjY0OiAweDAwZjMsICAgICAjICBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDIyNjU6IDB4MDBmMiwgICAgICMgIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MjMxMDogMHgwMGE5LCAgICAgIyAgUkVWRVJTRUQgTk9UIFNJR04KKyAgICAweDIzMjA6IDB4MDBmNCwgICAgICMgIFRPUCBIQUxGIElOVEVHUkFMCisgICAgMHgyMzIxOiAweDAwZjUsICAgICAjICBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIDB4MjUwMDogMHgwMGM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDI1MDI6IDB4MDBiMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MjUwYzogMHgwMGRhLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTEwOiAweDAwYmYsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MjUxNDogMHgwMGMwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MjUxODogMHgwMGQ5LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgyNTFjOiAweDAwYzMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTI0OiAweDAwYjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1MmM6IDB4MDBjMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTM0OiAweDAwYzEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1M2M6IDB4MDBjNSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU1MDogMHgwMGNkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgyNTUxOiAweDAwYmEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgyNTUyOiAweDAwZDUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1MzogMHgwMGQ2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NTQ6IDB4MDBjOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1NTU6IDB4MDBiOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NTY6IDB4MDBiNywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NTc6IDB4MDBiYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MjU1ODogMHgwMGQ0LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTU5OiAweDAwZDMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NWE6IDB4MDBjOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgyNTViOiAweDAwYmUsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU1YzogMHgwMGJkLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NWQ6IDB4MDBiYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDI1NWU6IDB4MDBjNiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1ZjogMHgwMGM3LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTYwOiAweDAwY2MsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjU2MTogMHgwMGI1LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NjI6IDB4MDBiNiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTYzOiAweDAwYjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTY0OiAweDAwZDEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTY1OiAweDAwZDIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTY2OiAweDAwY2IsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1Njc6IDB4MDBjZiwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTY4OiAweDAwZDAsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2OTogMHgwMGNhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2YTogMHgwMGQ4LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1NmI6IDB4MDBkNywgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTZjOiAweDAwY2UsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTgwOiAweDAwZGYsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg0OiAweDAwZGMsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg4OiAweDAwZGIsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgyNThjOiAweDAwZGQsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTA6IDB4MDBkZSwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTE6IDB4MDBiMCwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgyNTkyOiAweDAwYjEsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDI1OTM6IDB4MDBiMiwgICAgICMgIERBUksgU0hBREUKKyAgICAweDI1YTA6IDB4MDBmZSwgICAgICMgIEJMQUNLIFNRVUFSRQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MzcucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MzcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzA5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDQzNy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MzcucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MzcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzA5OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDQzNy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A1MDAucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDUwMC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDc2NmMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A1MDAucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3A1MDAgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL0VCQ0RJQy9DUDUwMC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDUwMCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHg5YycgICAgICMgIDB4MDQgLT4gQ09OVFJPTAorICAgIHUnXHQnICAgICAgICMgIDB4MDUgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdceDg2JyAgICAgIyAgMHgwNiAtPiBDT05UUk9MCisgICAgdSdceDdmJyAgICAgIyAgMHgwNyAtPiBERUxFVEUKKyAgICB1J1x4OTcnICAgICAjICAweDA4IC0+IENPTlRST0wKKyAgICB1J1x4OGQnICAgICAjICAweDA5IC0+IENPTlRST0wKKyAgICB1J1x4OGUnICAgICAjICAweDBBIC0+IENPTlRST0wKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4OWQnICAgICAjICAweDE0IC0+IENPTlRST0wKKyAgICB1J1x4ODUnICAgICAjICAweDE1IC0+IENPTlRST0wKKyAgICB1J1x4MDgnICAgICAjICAweDE2IC0+IEJBQ0tTUEFDRQorICAgIHUnXHg4NycgICAgICMgIDB4MTcgLT4gQ09OVFJPTAorICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDkyJyAgICAgIyAgMHgxQSAtPiBDT05UUk9MCisgICAgdSdceDhmJyAgICAgIyAgMHgxQiAtPiBDT05UUk9MCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnXHg4MCcgICAgICMgIDB4MjAgLT4gQ09OVFJPTAorICAgIHUnXHg4MScgICAgICMgIDB4MjEgLT4gQ09OVFJPTAorICAgIHUnXHg4MicgICAgICMgIDB4MjIgLT4gQ09OVFJPTAorICAgIHUnXHg4MycgICAgICMgIDB4MjMgLT4gQ09OVFJPTAorICAgIHUnXHg4NCcgICAgICMgIDB4MjQgLT4gQ09OVFJPTAorICAgIHUnXG4nICAgICAgICMgIDB4MjUgLT4gTElORSBGRUVECisgICAgdSdceDE3JyAgICAgIyAgMHgyNiAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDFiJyAgICAgIyAgMHgyNyAtPiBFU0NBUEUKKyAgICB1J1x4ODgnICAgICAjICAweDI4IC0+IENPTlRST0wKKyAgICB1J1x4ODknICAgICAjICAweDI5IC0+IENPTlRST0wKKyAgICB1J1x4OGEnICAgICAjICAweDJBIC0+IENPTlRST0wKKyAgICB1J1x4OGInICAgICAjICAweDJCIC0+IENPTlRST0wKKyAgICB1J1x4OGMnICAgICAjICAweDJDIC0+IENPTlRST0wKKyAgICB1J1x4MDUnICAgICAjICAweDJEIC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDJFIC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgyRiAtPiBCRUxMCisgICAgdSdceDkwJyAgICAgIyAgMHgzMCAtPiBDT05UUk9MCisgICAgdSdceDkxJyAgICAgIyAgMHgzMSAtPiBDT05UUk9MCisgICAgdSdceDE2JyAgICAgIyAgMHgzMiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDkzJyAgICAgIyAgMHgzMyAtPiBDT05UUk9MCisgICAgdSdceDk0JyAgICAgIyAgMHgzNCAtPiBDT05UUk9MCisgICAgdSdceDk1JyAgICAgIyAgMHgzNSAtPiBDT05UUk9MCisgICAgdSdceDk2JyAgICAgIyAgMHgzNiAtPiBDT05UUk9MCisgICAgdSdceDA0JyAgICAgIyAgMHgzNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDk4JyAgICAgIyAgMHgzOCAtPiBDT05UUk9MCisgICAgdSdceDk5JyAgICAgIyAgMHgzOSAtPiBDT05UUk9MCisgICAgdSdceDlhJyAgICAgIyAgMHgzQSAtPiBDT05UUk9MCisgICAgdSdceDliJyAgICAgIyAgMHgzQiAtPiBDT05UUk9MCisgICAgdSdceDE0JyAgICAgIyAgMHgzQyAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgzRCAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHg5ZScgICAgICMgIDB4M0UgLT4gQ09OVFJPTAorICAgIHUnXHgxYScgICAgICMgIDB4M0YgLT4gU1VCU1RJVFVURQorICAgIHUnICcgICAgICAgICMgIDB4NDAgLT4gU1BBQ0UKKyAgICB1J1x4YTAnICAgICAjICAweDQxIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGUyJyAgICAgIyAgMHg0MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDQzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUwJyAgICAgIyAgMHg0NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUxJyAgICAgIyAgMHg0NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUzJyAgICAgIyAgMHg0NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU1JyAgICAgIyAgMHg0NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTcnICAgICAjICAweDQ4IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhmMScgICAgICMgIDB4NDkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnWycgICAgICAgICMgIDB4NEEgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnLicgICAgICAgICMgIDB4NEIgLT4gRlVMTCBTVE9QCisgICAgdSc8JyAgICAgICAgIyAgMHg0QyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnKCcgICAgICAgICMgIDB4NEQgLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKycgICAgICAgICMgIDB4NEUgLT4gUExVUyBTSUdOCisgICAgdSchJyAgICAgICAgIyAgMHg0RiAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdScmJyAgICAgICAgIyAgMHg1MCAtPiBBTVBFUlNBTkQKKyAgICB1J1x4ZTknICAgICAjICAweDUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZWEnICAgICAjICAweDUyIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4NTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTgnICAgICAjICAweDU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZWQnICAgICAjICAweDU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZWUnICAgICAjICAweDU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4NTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWMnICAgICAjICAweDU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZGYnICAgICAjICAweDU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHRVJNQU4pCisgICAgdSddJyAgICAgICAgIyAgMHg1QSAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnJCcgICAgICAgICMgIDB4NUIgLT4gRE9MTEFSIFNJR04KKyAgICB1JyonICAgICAgICAjICAweDVDIC0+IEFTVEVSSVNLCisgICAgdScpJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnOycgICAgICAgICMgIDB4NUUgLT4gU0VNSUNPTE9OCisgICAgdSdeJyAgICAgICAgIyAgMHg1RiAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnLScgICAgICAgICMgIDB4NjAgLT4gSFlQSEVOLU1JTlVTCisgICAgdScvJyAgICAgICAgIyAgMHg2MSAtPiBTT0xJRFVTCisgICAgdSdceGMyJyAgICAgIyAgMHg2MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjNCcgICAgICMgIDB4NjMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjMCcgICAgICMgIDB4NjQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGMxJyAgICAgIyAgMHg2NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4YzMnICAgICAjICAweDY2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhjNScgICAgICMgIDB4NjcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzcnICAgICAjICAweDY4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGQxJyAgICAgIyAgMHg2OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4YTYnICAgICAjICAweDZBIC0+IEJST0tFTiBCQVIKKyAgICB1JywnICAgICAgICAjICAweDZCIC0+IENPTU1BCisgICAgdSclJyAgICAgICAgIyAgMHg2QyAtPiBQRVJDRU5UIFNJR04KKyAgICB1J18nICAgICAgICAjICAweDZEIC0+IExPVyBMSU5FCisgICAgdSc+JyAgICAgICAgIyAgMHg2RSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4NkYgLT4gUVVFU1RJT04gTUFSSworICAgIHUnXHhmOCcgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4YzknICAgICAjICAweDcxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjYScgICAgICMgIDB4NzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweDczIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzgnICAgICAjICAweDc0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4NzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHg3NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4NzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjYycgICAgICMgIDB4NzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdgJyAgICAgICAgIyAgMHg3OSAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1JzonICAgICAgICAjICAweDdBIC0+IENPTE9OCisgICAgdScjJyAgICAgICAgIyAgMHg3QiAtPiBOVU1CRVIgU0lHTgorICAgIHUnQCcgICAgICAgICMgIDB4N0MgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUiJyIgICAgICAgICMgIDB4N0QgLT4gQVBPU1RST1BIRQorICAgIHUnPScgICAgICAgICMgIDB4N0UgLT4gRVFVQUxTIFNJR04KKyAgICB1JyInICAgICAgICAjICAweDdGIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdSdceGQ4JyAgICAgIyAgMHg4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdhJyAgICAgICAgIyAgMHg4MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4ODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg4NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4ODUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDg2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4ODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdceGFiJyAgICAgIyAgMHg4QSAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4OEIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGYwJyAgICAgIyAgMHg4QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRVRIIChJQ0VMQU5ESUMpCisgICAgdSdceGZkJyAgICAgIyAgMHg4RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGZlJyAgICAgIyAgMHg4RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVEhPUk4gKElDRUxBTkRJQykKKyAgICB1J1x4YjEnICAgICAjICAweDhGIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMCcgICAgICMgIDB4OTAgLT4gREVHUkVFIFNJR04KKyAgICB1J2onICAgICAgICAjICAweDkxIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg5MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4OTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4OTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4OTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J1x4YWEnICAgICAjICAweDlBIC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJhJyAgICAgIyAgMHg5QiAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4ZTYnICAgICAjICAweDlDIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgdSdceGI4JyAgICAgIyAgMHg5RCAtPiBDRURJTExBCisgICAgdSdceGM2JyAgICAgIyAgMHg5RSAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgdSdceGE0JyAgICAgIyAgMHg5RiAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdceGI1JyAgICAgIyAgMHhBMCAtPiBNSUNSTyBTSUdOCisgICAgdSd+JyAgICAgICAgIyAgMHhBMSAtPiBUSUxERQorICAgIHUncycgICAgICAgICMgIDB4QTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweEEzIC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHhBNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4QTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweEE2IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHhBNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4QTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweEE5IC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSdceGExJyAgICAgIyAgMHhBQSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGJmJyAgICAgIyAgMHhBQiAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdceGQwJyAgICAgIyAgMHhBQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEggKElDRUxBTkRJQykKKyAgICB1J1x4ZGQnICAgICAjICAweEFEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhkZScgICAgICMgIDB4QUUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVEhPUk4gKElDRUxBTkRJQykKKyAgICB1J1x4YWUnICAgICAjICAweEFGIC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhhMicgICAgICMgIDB4QjAgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhCMSAtPiBQT1VORCBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhCMiAtPiBZRU4gU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjMgLT4gTUlERExFIERPVAorICAgIHUnXHhhOScgICAgICMgIDB4QjQgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweEI1IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGJjJyAgICAgIyAgMHhCNyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEI4IC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QjkgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdceGFjJyAgICAgIyAgMHhCQSAtPiBOT1QgU0lHTgorICAgIHUnfCcgICAgICAgICMgIDB4QkIgLT4gVkVSVElDQUwgTElORQorICAgIHUnXHhhZicgICAgICMgIDB4QkMgLT4gTUFDUk9OCisgICAgdSdceGE4JyAgICAgIyAgMHhCRCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YjQnICAgICAjICAweEJFIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhkNycgICAgICMgIDB4QkYgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUneycgICAgICAgICMgIDB4QzAgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSdBJyAgICAgICAgIyAgMHhDMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHhDMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdceGFkJyAgICAgIyAgMHhDQSAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhmNCcgICAgICMgIDB4Q0IgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHhDQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMicgICAgICMgIDB4Q0QgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmMycgICAgICMgIDB4Q0UgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmNScgICAgICMgIDB4Q0YgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnfScgICAgICAgICMgIDB4RDAgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnSicgICAgICAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4RDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4RDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4RDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnXHhiOScgICAgICMgIDB4REEgLT4gU1VQRVJTQ1JJUFQgT05FCisgICAgdSdceGZiJyAgICAgIyAgMHhEQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweERDIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY5JyAgICAgIyAgMHhERCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZhJyAgICAgIyAgMHhERSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGZmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIHUnXFwnICAgICAgICMgIDB4RTAgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSdceGY3JyAgICAgIyAgMHhFMSAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdTJyAgICAgICAgIyAgMHhFMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHhFMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHhFNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHhFNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHhFNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHhFNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHhFOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHhFOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdceGIyJyAgICAgIyAgMHhFQSAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4ZDQnICAgICAjICAweEVCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQ2JyAgICAgIyAgMHhFQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQyJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEVFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNScgICAgICMgIDB4RUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdScwJyAgICAgICAgIyAgMHhGMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHhGMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweEYyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4RjMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweEY0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweEY1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweEY2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4RjcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweEY4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHhGOSAtPiBESUdJVCBOSU5FCisgICAgdSdceGIzJyAgICAgIyAgMHhGQSAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhkYicgICAgICMgIDB4RkIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweEZDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDknICAgICAjICAweEZEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4RkUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceDlmJyAgICAgIyAgMHhGRiAtPiBDT05UUk9MCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDUwMC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDUwMC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlMDBkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNTAwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDUwMC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDUwMC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlMDBkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNTAwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDcyMC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzIwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOTZkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDcyMC5weQpAQCAtMCwwICsxLDMwOSBAQAorIiIiUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwNzIwIGdlbmVyYXRlZCBvbiBXaW5kb3dzOgorVmlzdGEgNi4wLjYwMDIgU1AyIE11bHRpcHJvY2Vzc29yIEZyZWUgd2l0aCB0aGUgY29tbWFuZDoKKyAgcHl0aG9uIFRvb2xzL3VuaWNvZGUvZ2Vud2luY29kZWMucHkgNzIwCisiIiIjIgorCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDcyMCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4ODAnCisgICAgdSdceDgxJworICAgIHUnXHhlOScgICAgICMgIDB4ODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4ODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceDg0JworICAgIHUnXHhlMCcgICAgICMgIDB4ODUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHg4NicKKyAgICB1J1x4ZTcnICAgICAjICAweDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlYScgICAgICMgIDB4ODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHg4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOCcgICAgICMgIDB4OEEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlZicgICAgICMgIDB4OEIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWUnICAgICAjICAweDhDIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHg4ZCcKKyAgICB1J1x4OGUnCisgICAgdSdceDhmJworICAgIHUnXHg5MCcKKyAgICB1J1x1MDY1MScgICAjICAweDkxIC0+IEFSQUJJQyBTSEFEREEKKyAgICB1J1x1MDY1MicgICAjICAweDkyIC0+IEFSQUJJQyBTVUtVTgorICAgIHUnXHhmNCcgICAgICMgIDB4OTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGE0JyAgICAgIyAgMHg5NCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdcdTA2NDAnICAgIyAgMHg5NSAtPiBBUkFCSUMgVEFUV0VFTAorICAgIHUnXHhmYicgICAgICMgIDB4OTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY5JyAgICAgIyAgMHg5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdcdTA2MjEnICAgIyAgMHg5OCAtPiBBUkFCSUMgTEVUVEVSIEhBTVpBCisgICAgdSdcdTA2MjInICAgIyAgMHg5OSAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRQorICAgIHUnXHUwNjIzJyAgICMgIDB4OUEgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUKKyAgICB1J1x1MDYyNCcgICAjICAweDlCIC0+IEFSQUJJQyBMRVRURVIgV0FXIFdJVEggSEFNWkEgQUJPVkUKKyAgICB1J1x4YTMnICAgICAjICAweDlDIC0+IFBPVU5EIFNJR04KKyAgICB1J1x1MDYyNScgICAjICAweDlEIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEJFTE9XCisgICAgdSdcdTA2MjYnICAgIyAgMHg5RSAtPiBBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFCisgICAgdSdcdTA2MjcnICAgIyAgMHg5RiAtPiBBUkFCSUMgTEVUVEVSIEFMRUYKKyAgICB1J1x1MDYyOCcgICAjICAweEEwIC0+IEFSQUJJQyBMRVRURVIgQkVICisgICAgdSdcdTA2MjknICAgIyAgMHhBMSAtPiBBUkFCSUMgTEVUVEVSIFRFSCBNQVJCVVRBCisgICAgdSdcdTA2MmEnICAgIyAgMHhBMiAtPiBBUkFCSUMgTEVUVEVSIFRFSAorICAgIHUnXHUwNjJiJyAgICMgIDB4QTMgLT4gQVJBQklDIExFVFRFUiBUSEVICisgICAgdSdcdTA2MmMnICAgIyAgMHhBNCAtPiBBUkFCSUMgTEVUVEVSIEpFRU0KKyAgICB1J1x1MDYyZCcgICAjICAweEE1IC0+IEFSQUJJQyBMRVRURVIgSEFICisgICAgdSdcdTA2MmUnICAgIyAgMHhBNiAtPiBBUkFCSUMgTEVUVEVSIEtIQUgKKyAgICB1J1x1MDYyZicgICAjICAweEE3IC0+IEFSQUJJQyBMRVRURVIgREFMCisgICAgdSdcdTA2MzAnICAgIyAgMHhBOCAtPiBBUkFCSUMgTEVUVEVSIFRIQUwKKyAgICB1J1x1MDYzMScgICAjICAweEE5IC0+IEFSQUJJQyBMRVRURVIgUkVICisgICAgdSdcdTA2MzInICAgIyAgMHhBQSAtPiBBUkFCSUMgTEVUVEVSIFpBSU4KKyAgICB1J1x1MDYzMycgICAjICAweEFCIC0+IEFSQUJJQyBMRVRURVIgU0VFTgorICAgIHUnXHUwNjM0JyAgICMgIDB4QUMgLT4gQVJBQklDIExFVFRFUiBTSEVFTgorICAgIHUnXHUwNjM1JyAgICMgIDB4QUQgLT4gQVJBQklDIExFVFRFUiBTQUQKKyAgICB1J1x4YWInICAgICAjICAweEFFIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHhBRiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjU5MScgICAjICAweEIwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHhCMSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweEIyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjUwMicgICAjICAweEIzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4QjQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NjEnICAgIyAgMHhCNSAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYyJyAgICMgIDB4QjYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NicgICAjICAweEI3IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NScgICAjICAweEI4IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjU2MycgICAjICAweEI5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU1MScgICAjICAweEJBIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICB1J1x1MjU1NycgICAjICAweEJCIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTVkJyAgICMgIDB4QkMgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTVjJyAgICMgIDB4QkQgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1YicgICAjICAweEJFIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1MTAnICAgIyAgMHhCRiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4QzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4QzEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MmMnICAgIyAgMHhDMiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTFjJyAgICMgIDB4QzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4QzQgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweEM1IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTVlJyAgICMgIDB4QzYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NWYnICAgIyAgMHhDNyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1YScgICAjICAweEM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHhDOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHhDQSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjYnICAgIyAgMHhDQiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweENDIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHhDRCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICB1J1x1MjU2YycgICAjICAweENFIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NycgICAjICAweENGIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjgnICAgIyAgMHhEMCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTY0JyAgICMgIDB4RDEgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY1JyAgICMgIDB4RDIgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTU5JyAgICMgIDB4RDMgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NTgnICAgIyAgMHhENCAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1MicgICAjICAweEQ1IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTMnICAgIyAgMHhENiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTZiJyAgICMgIDB4RDcgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU2YScgICAjICAweEQ4IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1MTgnICAgIyAgMHhEOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweERBIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTg4JyAgICMgIDB4REIgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4REMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHUyNThjJyAgICMgIDB4REQgLT4gTEVGVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1OTAnICAgIyAgMHhERSAtPiBSSUdIVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1ODAnICAgIyAgMHhERiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdcdTA2MzYnICAgIyAgMHhFMCAtPiBBUkFCSUMgTEVUVEVSIERBRAorICAgIHUnXHUwNjM3JyAgICMgIDB4RTEgLT4gQVJBQklDIExFVFRFUiBUQUgKKyAgICB1J1x1MDYzOCcgICAjICAweEUyIC0+IEFSQUJJQyBMRVRURVIgWkFICisgICAgdSdcdTA2MzknICAgIyAgMHhFMyAtPiBBUkFCSUMgTEVUVEVSIEFJTgorICAgIHUnXHUwNjNhJyAgICMgIDB4RTQgLT4gQVJBQklDIExFVFRFUiBHSEFJTgorICAgIHUnXHUwNjQxJyAgICMgIDB4RTUgLT4gQVJBQklDIExFVFRFUiBGRUgKKyAgICB1J1x4YjUnICAgICAjICAweEU2IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x1MDY0MicgICAjICAweEU3IC0+IEFSQUJJQyBMRVRURVIgUUFGCisgICAgdSdcdTA2NDMnICAgIyAgMHhFOCAtPiBBUkFCSUMgTEVUVEVSIEtBRgorICAgIHUnXHUwNjQ0JyAgICMgIDB4RTkgLT4gQVJBQklDIExFVFRFUiBMQU0KKyAgICB1J1x1MDY0NScgICAjICAweEVBIC0+IEFSQUJJQyBMRVRURVIgTUVFTQorICAgIHUnXHUwNjQ2JyAgICMgIDB4RUIgLT4gQVJBQklDIExFVFRFUiBOT09OCisgICAgdSdcdTA2NDcnICAgIyAgMHhFQyAtPiBBUkFCSUMgTEVUVEVSIEhFSAorICAgIHUnXHUwNjQ4JyAgICMgIDB4RUQgLT4gQVJBQklDIExFVFRFUiBXQVcKKyAgICB1J1x1MDY0OScgICAjICAweEVFIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBCisgICAgdSdcdTA2NGEnICAgIyAgMHhFRiAtPiBBUkFCSUMgTEVUVEVSIFlFSAorICAgIHUnXHUyMjYxJyAgICMgIDB4RjAgLT4gSURFTlRJQ0FMIFRPCisgICAgdSdcdTA2NGInICAgIyAgMHhGMSAtPiBBUkFCSUMgRkFUSEFUQU4KKyAgICB1J1x1MDY0YycgICAjICAweEYyIC0+IEFSQUJJQyBEQU1NQVRBTgorICAgIHUnXHUwNjRkJyAgICMgIDB4RjMgLT4gQVJBQklDIEtBU1JBVEFOCisgICAgdSdcdTA2NGUnICAgIyAgMHhGNCAtPiBBUkFCSUMgRkFUSEEKKyAgICB1J1x1MDY0ZicgICAjICAweEY1IC0+IEFSQUJJQyBEQU1NQQorICAgIHUnXHUwNjUwJyAgICMgIDB4RjYgLT4gQVJBQklDIEtBU1JBCisgICAgdSdcdTIyNDgnICAgIyAgMHhGNyAtPiBBTE1PU1QgRVFVQUwgVE8KKyAgICB1J1x4YjAnICAgICAjICAweEY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdcdTIyMTknICAgIyAgMHhGOSAtPiBCVUxMRVQgT1BFUkFUT1IKKyAgICB1J1x4YjcnICAgICAjICAweEZBIC0+IE1JRERMRSBET1QKKyAgICB1J1x1MjIxYScgICAjICAweEZCIC0+IFNRVUFSRSBST09UCisgICAgdSdcdTIwN2YnICAgIyAgMHhGQyAtPiBTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnXHhiMicgICAgICMgIDB4RkQgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdcdTI1YTAnICAgIyAgMHhGRSAtPiBCTEFDSyBTUVVBUkUKKyAgICB1J1x4YTAnICAgICAjICAweEZGIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDcyMC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDcyMC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhNGVjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzIwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDcyMC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDcyMC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhNGVjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzIwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDczNy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzM3LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NTQ0NDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDczNy5weQpAQCAtMCwwICsxLDY5OCBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDczNyBnZW5lcmF0ZWQgZnJvbSAnVkVORE9SUy9NSUNTRlQvUEMvQ1A3MzcuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDczNycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCitkZWNvZGluZ19tYXAudXBkYXRlKHsKKyAgICAweDAwODA6IDB4MDM5MSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBCisgICAgMHgwMDgxOiAweDAzOTIsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBCRVRBCisgICAgMHgwMDgyOiAweDAzOTMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIDB4MDA4MzogMHgwMzk0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEKKyAgICAweDAwODQ6IDB4MDM5NSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04KKyAgICAweDAwODU6IDB4MDM5NiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFpFVEEKKyAgICAweDAwODY6IDB4MDM5NywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEVUQQorICAgIDB4MDA4NzogMHgwMzk4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICAweDAwODg6IDB4MDM5OSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEKKyAgICAweDAwODk6IDB4MDM5YSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBCisgICAgMHgwMDhhOiAweDAzOWIsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBMQU1EQQorICAgIDB4MDA4YjogMHgwMzljLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgTVUKKyAgICAweDAwOGM6IDB4MDM5ZCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE5VCisgICAgMHgwMDhkOiAweDAzOWUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBYSQorICAgIDB4MDA4ZTogMHgwMzlmLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTgorICAgIDB4MDA4ZjogMHgwM2EwLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEkKKyAgICAweDAwOTA6IDB4MDNhMSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFJITworICAgIDB4MDA5MTogMHgwM2EzLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICAweDAwOTI6IDB4MDNhNCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFRBVQorICAgIDB4MDA5MzogMHgwM2E1LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTgorICAgIDB4MDA5NDogMHgwM2E2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgMHgwMDk1OiAweDAzYTcsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkKKyAgICAweDAwOTY6IDB4MDNhOCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBTSQorICAgIDB4MDA5NzogMHgwM2E5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICAweDAwOTg6IDB4MDNiMSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDA5OTogMHgwM2IyLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEJFVEEKKyAgICAweDAwOWE6IDB4MDNiMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBHQU1NQQorICAgIDB4MDA5YjogMHgwM2I0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwMDljOiAweDAzYjUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDA5ZDogMHgwM2I2LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEKKyAgICAweDAwOWU6IDB4MDNiNywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFVEEKKyAgICAweDAwOWY6IDB4MDNiOCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQQorICAgIDB4MDBhMDogMHgwM2I5LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEKKyAgICAweDAwYTE6IDB4MDNiYSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQorICAgIDB4MDBhMjogMHgwM2JiLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIExBTURBCisgICAgMHgwMGEzOiAweDAzYmMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgTVUKKyAgICAweDAwYTQ6IDB4MDNiZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBOVQorICAgIDB4MDBhNTogMHgwM2JlLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFhJCisgICAgMHgwMGE2OiAweDAzYmYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgorICAgIDB4MDBhNzogMHgwM2MwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwMGE4OiAweDAzYzEsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUkhPCisgICAgMHgwMGE5OiAweDAzYzMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAwYWE6IDB4MDNjMiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBGSU5BTCBTSUdNQQorICAgIDB4MDBhYjogMHgwM2M0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIDB4MDBhYzogMHgwM2M1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04KKyAgICAweDAwYWQ6IDB4MDNjNiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICAweDAwYWU6IDB4MDNjNywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBDSEkKKyAgICAweDAwYWY6IDB4MDNjOCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQU0kKKyAgICAweDAwYjA6IDB4MjU5MSwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgwMGIxOiAweDI1OTIsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDAwYjI6IDB4MjU5MywgICAgICMgIERBUksgU0hBREUKKyAgICAweDAwYjM6IDB4MjUwMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MDBiNDogMHgyNTI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGI1OiAweDI1NjEsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiNjogMHgyNTYyLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYjc6IDB4MjU1NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYjg6IDB4MjU1NSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYjk6IDB4MjU2MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYmE6IDB4MjU1MSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDAwYmI6IDB4MjU1NywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBiYzogMHgyNTVkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MDBiZDogMHgyNTVjLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYmU6IDB4MjU1YiwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGJmOiAweDI1MTAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBjMDogMHgyNTE0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MDBjMTogMHgyNTM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMyOiAweDI1MmMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMzogMHgyNTFjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjNDogMHgyNTAwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDAwYzU6IDB4MjUzYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjNjogMHgyNTVlLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGM3OiAweDI1NWYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwYzg6IDB4MjU1YSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgwMGM5OiAweDI1NTQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGNhOiAweDI1NjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNiOiAweDI1NjYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2M6IDB4MjU2MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGNkOiAweDI1NTAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDAwY2U6IDB4MjU2YywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2Y6IDB4MjU2NywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQwOiAweDI1NjgsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkMTogMHgyNTY0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkMjogMHgyNTY1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkMzogMHgyNTU5LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGQ0OiAweDI1NTgsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwZDU6IDB4MjU1MiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGQ2OiAweDI1NTMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBkNzogMHgyNTZiLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDg6IDB4MjU2YSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQ5OiAweDI1MTgsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDAwZGE6IDB4MjUwYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MDBkYjogMHgyNTg4LCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MDBkYzogMHgyNTg0LCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MDBkZDogMHgyNThjLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgwMGRlOiAweDI1OTAsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgwMGRmOiAweDI1ODAsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgwMGUwOiAweDAzYzksICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EKKyAgICAweDAwZTE6IDB4MDNhYywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TCisgICAgMHgwMGUyOiAweDAzYWQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisgICAgMHgwMGUzOiAweDAzYWUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICAweDAwZTQ6IDB4MDNjYSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisgICAgMHgwMGU1OiAweDAzYWYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgMHgwMGU2OiAweDAzY2MsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgMHgwMGU3OiAweDAzY2QsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisgICAgMHgwMGU4OiAweDAzY2IsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIDB4MDBlOTogMHgwM2NlLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICAweDAwZWE6IDB4MDM4NiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICAweDAwZWI6IDB4MDM4OCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIDB4MDBlYzogMHgwMzg5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICAweDAwZWQ6IDB4MDM4YSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIDB4MDBlZTogMHgwMzhjLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgMHgwMGVmOiAweDAzOGUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICAweDAwZjA6IDB4MDM4ZiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICAweDAwZjE6IDB4MDBiMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBmMjogMHgyMjY1LCAgICAgIyAgR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgwMGYzOiAweDIyNjQsICAgICAjICBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDAwZjQ6IDB4MDNhYSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICAweDAwZjU6IDB4MDNhYiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EKKyAgICAweDAwZjY6IDB4MDBmNywgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAwZjc6IDB4MjI0OCwgICAgICMgIEFMTU9TVCBFUVVBTCBUTworICAgIDB4MDBmODogMHgwMGIwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwZjk6IDB4MjIxOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MDBmYTogMHgwMGI3LCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBmYjogMHgyMjFhLCAgICAgIyAgU1FVQVJFIFJPT1QKKyAgICAweDAwZmM6IDB4MjA3ZiwgICAgICMgIFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMGZkOiAweDAwYjIsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwZmU6IDB4MjVhMCwgICAgICMgIEJMQUNLIFNRVUFSRQorICAgIDB4MDBmZjogMHgwMGEwLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKK30pCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwMDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDAwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAwMDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDAwMDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDAwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwMDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwMDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDAwMDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwMDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MDAwYSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDAwMGIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MDAwYyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDAwMGQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwMDBlIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MDAwZiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MDAxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgwMDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MDAxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDAwMTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDAwMTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MDAxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MDAxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgwMDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDAwMTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgwMDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDAwMWEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MDAxYiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDAwMWMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDAwMWQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgwMDFlIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDAwMWYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDAwMjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDAwMjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MDAyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MDAyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MDAyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MDAyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDAwMjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgwMDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDAwMjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MDAyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MDAyYSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MDAyYiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDAwMmMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDAwMmQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgwMDJlIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MDAyZiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgwMDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDAwMzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgwMDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MDAzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MDAzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgwMDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDAwMzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgwMDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgwMDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgwMDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDAwM2EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDAwM2IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgwMDNjIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgwMDNkIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgwMDNlIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgwMDNmIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDAwNDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4MDA0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHgwMDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDAwNDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4MDA0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHgwMDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDAwNDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4MDA0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHgwMDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDAwNDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4MDA0YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHgwMDRiIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDAwNGMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4MDA0ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHgwMDRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDAwNGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4MDA1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHgwMDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDAwNTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4MDA1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHgwMDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDAwNTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4MDA1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHgwMDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDAwNTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4MDA1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHgwMDVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDAwNWIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4MDA1YyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDAwNWQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDAwNWUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDAwNWYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDAwNjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHgwMDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHgwMDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHgwMDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHgwMDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHgwMDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHgwMDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHgwMDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHgwMDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHgwMDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHgwMDZhIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHgwMDZiIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHgwMDZjIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHgwMDZkIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHgwMDZlIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHgwMDZmIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHgwMDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHgwMDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHgwMDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHgwMDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHgwMDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHgwMDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHgwMDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHgwMDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHgwMDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHgwMDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHgwMDdhIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHgwMDdiIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4MDA3YyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHgwMDdkIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDAwN2UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDAwN2YgLT4gREVMRVRFCisgICAgdSdcdTAzOTEnICAgIyAgMHgwMDgwIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBCisgICAgdSdcdTAzOTInICAgIyAgMHgwMDgxIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEKKyAgICB1J1x1MDM5MycgICAjICAweDAwODIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICB1J1x1MDM5NCcgICAjICAweDAwODMgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MDM5NScgICAjICAweDAwODQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTgorICAgIHUnXHUwMzk2JyAgICMgIDB4MDA4NSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBaRVRBCisgICAgdSdcdTAzOTcnICAgIyAgMHgwMDg2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVUQQorICAgIHUnXHUwMzk4JyAgICMgIDB4MDA4NyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwMzk5JyAgICMgIDB4MDA4OCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBCisgICAgdSdcdTAzOWEnICAgIyAgMHgwMDg5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBCisgICAgdSdcdTAzOWInICAgIyAgMHgwMDhhIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBCisgICAgdSdcdTAzOWMnICAgIyAgMHgwMDhiIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE1VCisgICAgdSdcdTAzOWQnICAgIyAgMHgwMDhjIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE5VCisgICAgdSdcdTAzOWUnICAgIyAgMHgwMDhkIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFhJCisgICAgdSdcdTAzOWYnICAgIyAgMHgwMDhlIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04KKyAgICB1J1x1MDNhMCcgICAjICAweDAwOGYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEkKKyAgICB1J1x1MDNhMScgICAjICAweDAwOTAgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPCisgICAgdSdcdTAzYTMnICAgIyAgMHgwMDkxIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgdSdcdTAzYTQnICAgIyAgMHgwMDkyIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFRBVQorICAgIHUnXHUwM2E1JyAgICMgIDB4MDA5MyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCisgICAgdSdcdTAzYTYnICAgIyAgMHgwMDk0IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIHUnXHUwM2E3JyAgICMgIDB4MDA5NSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkKKyAgICB1J1x1MDNhOCcgICAjICAweDAwOTYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJCisgICAgdSdcdTAzYTknICAgIyAgMHgwMDk3IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzYjEnICAgIyAgMHgwMDk4IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIHUnXHUwM2IyJyAgICMgIDB4MDA5OSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQkVUQQorICAgIHUnXHUwM2IzJyAgICMgIDB4MDA5YSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgR0FNTUEKKyAgICB1J1x1MDNiNCcgICAjICAweDAwOWIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgdSdcdTAzYjUnICAgIyAgMHgwMDljIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTAzYjYnICAgIyAgMHgwMDlkIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBaRVRBCisgICAgdSdcdTAzYjcnICAgIyAgMHgwMDllIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEKKyAgICB1J1x1MDNiOCcgICAjICAweDAwOWYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBCisgICAgdSdcdTAzYjknICAgIyAgMHgwMGEwIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBCisgICAgdSdcdTAzYmEnICAgIyAgMHgwMGExIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQorICAgIHUnXHUwM2JiJyAgICMgIDB4MDBhMiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgTEFNREEKKyAgICB1J1x1MDNiYycgICAjICAweDAwYTMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE1VCisgICAgdSdcdTAzYmQnICAgIyAgMHgwMGE0IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBOVQorICAgIHUnXHUwM2JlJyAgICMgIDB4MDBhNSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgWEkKKyAgICB1J1x1MDNiZicgICAjICAweDAwYTYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04KKyAgICB1J1x1MDNjMCcgICAjICAweDAwYTcgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgdSdcdTAzYzEnICAgIyAgMHgwMGE4IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBSSE8KKyAgICB1J1x1MDNjMycgICAjICAweDAwYTkgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgdSdcdTAzYzInICAgIyAgMHgwMGFhIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBGSU5BTCBTSUdNQQorICAgIHUnXHUwM2M0JyAgICMgIDB4MDBhYiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgdSdcdTAzYzUnICAgIyAgMHgwMGFjIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OCisgICAgdSdcdTAzYzYnICAgIyAgMHgwMGFkIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICB1J1x1MDNjNycgICAjICAweDAwYWUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIENISQorICAgIHUnXHUwM2M4JyAgICMgIDB4MDBhZiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUFNJCisgICAgdSdcdTI1OTEnICAgIyAgMHgwMGIwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHgwMGIxIC0+IE1FRElVTSBTSEFERQorICAgIHUnXHUyNTkzJyAgICMgIDB4MDBiMiAtPiBEQVJLIFNIQURFCisgICAgdSdcdTI1MDInICAgIyAgMHgwMGIzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4MDBiNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU2MScgICAjICAweDAwYjUgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjU2MicgICAjICAweDAwYjYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NicgICAjICAweDAwYjcgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU1JyAgICMgIDB4MDBiOCAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NjMnICAgIyAgMHgwMGI5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU1MScgICAjICAweDAwYmEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTU3JyAgICMgIDB4MDBiYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjU1ZCcgICAjICAweDAwYmMgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTVjJyAgICMgIDB4MDBiZCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTViJyAgICMgIDB4MDBiZSAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTEwJyAgICMgIDB4MDBiZiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4MDBjMCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MzQnICAgIyAgMHgwMGMxIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTJjJyAgICMgIDB4MDBjMiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTFjJyAgICMgIDB4MDBjMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MDAnICAgIyAgMHgwMGM0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgdSdcdTI1M2MnICAgIyAgMHgwMGM1IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTVlJyAgICMgIDB4MDBjNiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1ZicgICAjICAweDAwYzcgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NWEnICAgIyAgMHgwMGM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHgwMGM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweDAwY2EgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY2JyAgICMgIDB4MDBjYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweDAwY2MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweDAwY2QgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NmMnICAgIyAgMHgwMGNlIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NycgICAjICAweDAwY2YgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2OCcgICAjICAweDAwZDAgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU2NCcgICAjICAweDAwZDEgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY1JyAgICMgIDB4MDBkMiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NTknICAgIyAgMHgwMGQzIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTU4JyAgICMgIDB4MDBkNCAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1MicgICAjICAweDAwZDUgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1MycgICAjICAweDAwZDYgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU2YicgICAjICAweDAwZDcgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU2YScgICAjICAweDAwZDggLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjUxOCcgICAjICAweDAwZDkgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgdSdcdTI1MGMnICAgIyAgMHgwMGRhIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTg4JyAgICMgIDB4MDBkYiAtPiBGVUxMIEJMT0NLCisgICAgdSdcdTI1ODQnICAgIyAgMHgwMGRjIC0+IExPV0VSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU4YycgICAjICAweDAwZGQgLT4gTEVGVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1OTAnICAgIyAgMHgwMGRlIC0+IFJJR0hUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU4MCcgICAjICAweDAwZGYgLT4gVVBQRVIgSEFMRiBCTE9DSworICAgIHUnXHUwM2M5JyAgICMgIDB4MDBlMCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EKKyAgICB1J1x1MDNhYycgICAjICAweDAwZTEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICB1J1x1MDNhZCcgICAjICAweDAwZTIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwM2FlJyAgICMgIDB4MDBlMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICB1J1x1MDNjYScgICAjICAweDAwZTQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICB1J1x1MDNhZicgICAjICAweDAwZTUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIHUnXHUwM2NjJyAgICMgIDB4MDBlNiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2QnICAgIyAgMHgwMGU3IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDNjYicgICAjICAweDAwZTggLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EKKyAgICB1J1x1MDNjZScgICAjICAweDAwZTkgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4NicgICAjICAweDAwZWEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIHUnXHUwMzg4JyAgICMgIDB4MDBlYiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4OScgICAjICAweDAwZWMgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4YScgICAjICAweDAwZWQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzOGMnICAgIyAgMHgwMGVlIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUworICAgIHUnXHUwMzhlJyAgICMgIDB4MDBlZiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4ZicgICAjICAweDAwZjAgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIHUnXHhiMScgICAgICMgIDB4MDBmMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MjI2NScgICAjICAweDAwZjIgLT4gR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIyNjQnICAgIyAgMHgwMGYzIC0+IExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUwM2FhJyAgICMgIDB4MDBmNCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzYWInICAgIyAgMHgwMGY1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EKKyAgICB1J1x4ZjcnICAgICAjICAweDAwZjYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyMjQ4JyAgICMgIDB4MDBmNyAtPiBBTE1PU1QgRVFVQUwgVE8KKyAgICB1J1x4YjAnICAgICAjICAweDAwZjggLT4gREVHUkVFIFNJR04KKyAgICB1J1x1MjIxOScgICAjICAweDAwZjkgLT4gQlVMTEVUIE9QRVJBVE9SCisgICAgdSdceGI3JyAgICAgIyAgMHgwMGZhIC0+IE1JRERMRSBET1QKKyAgICB1J1x1MjIxYScgICAjICAweDAwZmIgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MjA3ZicgICAjICAweDAwZmMgLT4gU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J1x4YjInICAgICAjICAweDAwZmQgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdcdTI1YTAnICAgIyAgMHgwMGZlIC0+IEJMQUNLIFNRVUFSRQorICAgIHUnXHhhMCcgICAgICMgIDB4MDBmZiAtPiBOTy1CUkVBSyBTUEFDRQorKQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHsKKyAgICAweDAwMDA6IDB4MDAwMCwgICAgICMgIE5VTEwKKyAgICAweDAwMDE6IDB4MDAwMSwgICAgICMgIFNUQVJUIE9GIEhFQURJTkcKKyAgICAweDAwMDI6IDB4MDAwMiwgICAgICMgIFNUQVJUIE9GIFRFWFQKKyAgICAweDAwMDM6IDB4MDAwMywgICAgICMgIEVORCBPRiBURVhUCisgICAgMHgwMDA0OiAweDAwMDQsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgMHgwMDA1OiAweDAwMDUsICAgICAjICBFTlFVSVJZCisgICAgMHgwMDA2OiAweDAwMDYsICAgICAjICBBQ0tOT1dMRURHRQorICAgIDB4MDAwNzogMHgwMDA3LCAgICAgIyAgQkVMTAorICAgIDB4MDAwODogMHgwMDA4LCAgICAgIyAgQkFDS1NQQUNFCisgICAgMHgwMDA5OiAweDAwMDksICAgICAjICBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICAweDAwMGE6IDB4MDAwYSwgICAgICMgIExJTkUgRkVFRAorICAgIDB4MDAwYjogMHgwMDBiLCAgICAgIyAgVkVSVElDQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYzogMHgwMDBjLCAgICAgIyAgRk9STSBGRUVECisgICAgMHgwMDBkOiAweDAwMGQsICAgICAjICBDQVJSSUFHRSBSRVRVUk4KKyAgICAweDAwMGU6IDB4MDAwZSwgICAgICMgIFNISUZUIE9VVAorICAgIDB4MDAwZjogMHgwMDBmLCAgICAgIyAgU0hJRlQgSU4KKyAgICAweDAwMTA6IDB4MDAxMCwgICAgICMgIERBVEEgTElOSyBFU0NBUEUKKyAgICAweDAwMTE6IDB4MDAxMSwgICAgICMgIERFVklDRSBDT05UUk9MIE9ORQorICAgIDB4MDAxMjogMHgwMDEyLCAgICAgIyAgREVWSUNFIENPTlRST0wgVFdPCisgICAgMHgwMDEzOiAweDAwMTMsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIDB4MDAxNDogMHgwMDE0LCAgICAgIyAgREVWSUNFIENPTlRST0wgRk9VUgorICAgIDB4MDAxNTogMHgwMDE1LCAgICAgIyAgTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICAweDAwMTY6IDB4MDAxNiwgICAgICMgIFNZTkNIUk9OT1VTIElETEUKKyAgICAweDAwMTc6IDB4MDAxNywgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICAweDAwMTg6IDB4MDAxOCwgICAgICMgIENBTkNFTAorICAgIDB4MDAxOTogMHgwMDE5LCAgICAgIyAgRU5EIE9GIE1FRElVTQorICAgIDB4MDAxYTogMHgwMDFhLCAgICAgIyAgU1VCU1RJVFVURQorICAgIDB4MDAxYjogMHgwMDFiLCAgICAgIyAgRVNDQVBFCisgICAgMHgwMDFjOiAweDAwMWMsICAgICAjICBGSUxFIFNFUEFSQVRPUgorICAgIDB4MDAxZDogMHgwMDFkLCAgICAgIyAgR1JPVVAgU0VQQVJBVE9SCisgICAgMHgwMDFlOiAweDAwMWUsICAgICAjICBSRUNPUkQgU0VQQVJBVE9SCisgICAgMHgwMDFmOiAweDAwMWYsICAgICAjICBVTklUIFNFUEFSQVRPUgorICAgIDB4MDAyMDogMHgwMDIwLCAgICAgIyAgU1BBQ0UKKyAgICAweDAwMjE6IDB4MDAyMSwgICAgICMgIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwMjI6IDB4MDAyMiwgICAgICMgIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMDIzOiAweDAwMjMsICAgICAjICBOVU1CRVIgU0lHTgorICAgIDB4MDAyNDogMHgwMDI0LCAgICAgIyAgRE9MTEFSIFNJR04KKyAgICAweDAwMjU6IDB4MDAyNSwgICAgICMgIFBFUkNFTlQgU0lHTgorICAgIDB4MDAyNjogMHgwMDI2LCAgICAgIyAgQU1QRVJTQU5ECisgICAgMHgwMDI3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFCisgICAgMHgwMDI4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTCisgICAgMHgwMDI5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUworICAgIDB4MDAyYTogMHgwMDJhLCAgICAgIyAgQVNURVJJU0sKKyAgICAweDAwMmI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTgorICAgIDB4MDAyYzogMHgwMDJjLCAgICAgIyAgQ09NTUEKKyAgICAweDAwMmQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUworICAgIDB4MDAyZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QCisgICAgMHgwMDJmOiAweDAwMmYsICAgICAjICBTT0xJRFVTCisgICAgMHgwMDMwOiAweDAwMzAsICAgICAjICBESUdJVCBaRVJPCisgICAgMHgwMDMxOiAweDAwMzEsICAgICAjICBESUdJVCBPTkUKKyAgICAweDAwMzI6IDB4MDAzMiwgICAgICMgIERJR0lUIFRXTworICAgIDB4MDAzMzogMHgwMDMzLCAgICAgIyAgRElHSVQgVEhSRUUKKyAgICAweDAwMzQ6IDB4MDAzNCwgICAgICMgIERJR0lUIEZPVVIKKyAgICAweDAwMzU6IDB4MDAzNSwgICAgICMgIERJR0lUIEZJVkUKKyAgICAweDAwMzY6IDB4MDAzNiwgICAgICMgIERJR0lUIFNJWAorICAgIDB4MDAzNzogMHgwMDM3LCAgICAgIyAgRElHSVQgU0VWRU4KKyAgICAweDAwMzg6IDB4MDAzOCwgICAgICMgIERJR0lUIEVJR0hUCisgICAgMHgwMDM5OiAweDAwMzksICAgICAjICBESUdJVCBOSU5FCisgICAgMHgwMDNhOiAweDAwM2EsICAgICAjICBDT0xPTgorICAgIDB4MDAzYjogMHgwMDNiLCAgICAgIyAgU0VNSUNPTE9OCisgICAgMHgwMDNjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTgorICAgIDB4MDAzZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04KKyAgICAweDAwM2U6IDB4MDAzZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOCisgICAgMHgwMDNmOiAweDAwM2YsICAgICAjICBRVUVTVElPTiBNQVJLCisgICAgMHgwMDQwOiAweDAwNDAsICAgICAjICBDT01NRVJDSUFMIEFUCisgICAgMHgwMDQxOiAweDAwNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMDQyOiAweDAwNDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgMHgwMDQzOiAweDAwNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgMHgwMDQ0OiAweDAwNDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgMHgwMDQ1OiAweDAwNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwMDQ2OiAweDAwNDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgMHgwMDQ3OiAweDAwNDcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgMHgwMDQ4OiAweDAwNDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgMHgwMDQ5OiAweDAwNDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMDRhOiAweDAwNGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgMHgwMDRiOiAweDAwNGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgMHgwMDRjOiAweDAwNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgMHgwMDRkOiAweDAwNGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgMHgwMDRlOiAweDAwNGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgMHgwMDRmOiAweDAwNGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDUwOiAweDAwNTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgMHgwMDUxOiAweDAwNTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgMHgwMDUyOiAweDAwNTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgMHgwMDUzOiAweDAwNTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgMHgwMDU0OiAweDAwNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgMHgwMDU1OiAweDAwNTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDU2OiAweDAwNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgMHgwMDU3OiAweDAwNTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgMHgwMDU4OiAweDAwNTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgMHgwMDU5OiAweDAwNTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgMHgwMDVhOiAweDAwNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgMHgwMDViOiAweDAwNWIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVjOiAweDAwNWMsICAgICAjICBSRVZFUlNFIFNPTElEVVMKKyAgICAweDAwNWQ6IDB4MDA1ZCwgICAgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVlOiAweDAwNWUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIDB4MDA1ZjogMHgwMDVmLCAgICAgIyAgTE9XIExJTkUKKyAgICAweDAwNjA6IDB4MDA2MCwgICAgICMgIEdSQVZFIEFDQ0VOVAorICAgIDB4MDA2MTogMHgwMDYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICAweDAwNjI6IDB4MDA2MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgMHgwMDYzOiAweDAwNjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIDB4MDA2NDogMHgwMDY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICAweDAwNjU6IDB4MDA2NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgMHgwMDY2OiAweDAwNjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIDB4MDA2NzogMHgwMDY3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICAweDAwNjg6IDB4MDA2OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBICisgICAgMHgwMDY5OiAweDAwNjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIDB4MDA2YTogMHgwMDZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICAweDAwNmI6IDB4MDA2YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgMHgwMDZjOiAweDAwNmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIDB4MDA2ZDogMHgwMDZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICAweDAwNmU6IDB4MDA2ZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMDZmOiAweDAwNmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIDB4MDA3MDogMHgwMDcwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICAweDAwNzE6IDB4MDA3MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgMHgwMDcyOiAweDAwNzIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIDB4MDA3MzogMHgwMDczLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICAweDAwNzQ6IDB4MDA3NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgMHgwMDc1OiAweDAwNzUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIDB4MDA3NjogMHgwMDc2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICAweDAwNzc6IDB4MDA3NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgMHgwMDc4OiAweDAwNzgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIDB4MDA3OTogMHgwMDc5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICAweDAwN2E6IDB4MDA3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgMHgwMDdiOiAweDAwN2IsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2M6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUKKyAgICAweDAwN2Q6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2U6IDB4MDA3ZSwgICAgICMgIFRJTERFCisgICAgMHgwMDdmOiAweDAwN2YsICAgICAjICBERUxFVEUKKyAgICAweDAwYTA6IDB4MDBmZiwgICAgICMgIE5PLUJSRUFLIFNQQUNFCisgICAgMHgwMGIwOiAweDAwZjgsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiMTogMHgwMGYxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGIyOiAweDAwZmQsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwYjc6IDB4MDBmYSwgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwZjc6IDB4MDBmNiwgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAzODY6IDB4MDBlYSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICAweDAzODg6IDB4MDBlYiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIDB4MDM4OTogMHgwMGVjLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICAweDAzOGE6IDB4MDBlZCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIDB4MDM4YzogMHgwMGVlLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgMHgwMzhlOiAweDAwZWYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICAweDAzOGY6IDB4MDBmMCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICAweDAzOTE6IDB4MDA4MCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBCisgICAgMHgwMzkyOiAweDAwODEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBCRVRBCisgICAgMHgwMzkzOiAweDAwODIsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIDB4MDM5NDogMHgwMDgzLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEKKyAgICAweDAzOTU6IDB4MDA4NCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04KKyAgICAweDAzOTY6IDB4MDA4NSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFpFVEEKKyAgICAweDAzOTc6IDB4MDA4NiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEVUQQorICAgIDB4MDM5ODogMHgwMDg3LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICAweDAzOTk6IDB4MDA4OCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEKKyAgICAweDAzOWE6IDB4MDA4OSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBCisgICAgMHgwMzliOiAweDAwOGEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBMQU1EQQorICAgIDB4MDM5YzogMHgwMDhiLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgTVUKKyAgICAweDAzOWQ6IDB4MDA4YywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE5VCisgICAgMHgwMzllOiAweDAwOGQsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBYSQorICAgIDB4MDM5ZjogMHgwMDhlLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTgorICAgIDB4MDNhMDogMHgwMDhmLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEkKKyAgICAweDAzYTE6IDB4MDA5MCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFJITworICAgIDB4MDNhMzogMHgwMDkxLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICAweDAzYTQ6IDB4MDA5MiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFRBVQorICAgIDB4MDNhNTogMHgwMDkzLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTgorICAgIDB4MDNhNjogMHgwMDk0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgMHgwM2E3OiAweDAwOTUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkKKyAgICAweDAzYTg6IDB4MDA5NiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBTSQorICAgIDB4MDNhOTogMHgwMDk3LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICAweDAzYWE6IDB4MDBmNCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICAweDAzYWI6IDB4MDBmNSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EKKyAgICAweDAzYWM6IDB4MDBlMSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TCisgICAgMHgwM2FkOiAweDAwZTIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisgICAgMHgwM2FlOiAweDAwZTMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICAweDAzYWY6IDB4MDBlNSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggVE9OT1MKKyAgICAweDAzYjE6IDB4MDA5OCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDNiMjogMHgwMDk5LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEJFVEEKKyAgICAweDAzYjM6IDB4MDA5YSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBHQU1NQQorICAgIDB4MDNiNDogMHgwMDliLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwM2I1OiAweDAwOWMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDNiNjogMHgwMDlkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEKKyAgICAweDAzYjc6IDB4MDA5ZSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFVEEKKyAgICAweDAzYjg6IDB4MDA5ZiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQQorICAgIDB4MDNiOTogMHgwMGEwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEKKyAgICAweDAzYmE6IDB4MDBhMSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQorICAgIDB4MDNiYjogMHgwMGEyLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIExBTURBCisgICAgMHgwM2JjOiAweDAwYTMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgTVUKKyAgICAweDAzYmQ6IDB4MDBhNCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBOVQorICAgIDB4MDNiZTogMHgwMGE1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFhJCisgICAgMHgwM2JmOiAweDAwYTYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgorICAgIDB4MDNjMDogMHgwMGE3LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwM2MxOiAweDAwYTgsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUkhPCisgICAgMHgwM2MyOiAweDAwYWEsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUEKKyAgICAweDAzYzM6IDB4MDBhOSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIDB4MDNjNDogMHgwMGFiLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIDB4MDNjNTogMHgwMGFjLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04KKyAgICAweDAzYzY6IDB4MDBhZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICAweDAzYzc6IDB4MDBhZSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBDSEkKKyAgICAweDAzYzg6IDB4MDBhZiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQU0kKKyAgICAweDAzYzk6IDB4MDBlMCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQQorICAgIDB4MDNjYTogMHgwMGU0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICAweDAzY2I6IDB4MDBlOCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgMHgwM2NjOiAweDAwZTYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgMHgwM2NkOiAweDAwZTcsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisgICAgMHgwM2NlOiAweDAwZTksICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIDB4MjA3ZjogMHgwMGZjLCAgICAgIyAgU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDIyMTk6IDB4MDBmOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MjIxYTogMHgwMGZiLCAgICAgIyAgU1FVQVJFIFJPT1QKKyAgICAweDIyNDg6IDB4MDBmNywgICAgICMgIEFMTU9TVCBFUVVBTCBUTworICAgIDB4MjI2NDogMHgwMGYzLCAgICAgIyAgTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgyMjY1OiAweDAwZjIsICAgICAjICBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDI1MDA6IDB4MDBjNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwYjMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDI1MGM6IDB4MDBkYSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMGJmLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDBjMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDI1MTg6IDB4MDBkOSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMGMzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMGI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTJjOiAweDAwYzIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMGMxLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwYzUsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NTA6IDB4MDBjZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MjU1MTogMHgwMGJhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MjU1MjogMHgwMGQ1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NTM6IDB4MDBkNiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTU0OiAweDAwYzksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTU1OiAweDAwYjgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTU2OiAweDAwYjcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTU3OiAweDAwYmIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDI1NTg6IDB4MDBkNCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1OTogMHgwMGQzLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTVhOiAweDAwYzgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MjU1YjogMHgwMGJlLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NWM6IDB4MDBiZCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTVkOiAweDAwYmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgyNTVlOiAweDAwYzYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NWY6IDB4MDBjNywgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU2MDogMHgwMGNjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1NjE6IDB4MDBiNSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTYyOiAweDAwYjYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU2MzogMHgwMGI5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjU2NDogMHgwMGQxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2NTogMHgwMGQyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2NjogMHgwMGNiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTY3OiAweDAwY2YsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2ODogMHgwMGQwLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1Njk6IDB4MDBjYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NmE6IDB4MDBkOCwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTZiOiAweDAwZDcsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2YzogMHgwMGNlLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU4MDogMHgwMGRmLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MjU4NDogMHgwMGRjLCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MjU4ODogMHgwMGRiLCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MjU4YzogMHgwMGRkLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgyNTkwOiAweDAwZGUsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgyNTkxOiAweDAwYjAsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MjU5MjogMHgwMGIxLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgyNTkzOiAweDAwYjIsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgyNWEwOiAweDAwZmUsICAgICAjICBCTEFDSyBTUVVBUkUKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzM3LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzM3LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmE3YTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3MzcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzM3LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzM3LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmE3YTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3MzcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzc1LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3NzUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0NTZhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzc1LnB5CkBAIC0wLDAgKzEsNjk3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwNzc1IGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL01JQ1NGVC9QQy9DUDc3NS5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwNzc1JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCitkZWNvZGluZ19tYXAudXBkYXRlKHsKKyAgICAweDAwODA6IDB4MDEwNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIDB4MDA4MTogMHgwMGZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODI6IDB4MDBlOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwODM6IDB4MDEwMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgMHgwMDg0OiAweDAwZTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4NTogMHgwMTIzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisgICAgMHgwMDg2OiAweDAwZTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwODc6IDB4MDEwNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICAweDAwODg6IDB4MDE0MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgMHgwMDg5OiAweDAxMTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorICAgIDB4MDA4YTogMHgwMTU2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENFRElMTEEKKyAgICAweDAwOGI6IDB4MDE1NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgIDB4MDA4YzogMHgwMTJiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICAweDAwOGQ6IDB4MDE3OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIDB4MDA4ZTogMHgwMGM0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4ZjogMHgwMGM1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwOTA6IDB4MDBjOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA5MTogMHgwMGU2LCAgICAgIyAgTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICAweDAwOTI6IDB4MDBjNiwgICAgICMgIExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICAweDAwOTM6IDB4MDE0ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgMHgwMDk0OiAweDAwZjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5NTogMHgwMTIyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKyAgICAweDAwOTY6IDB4MDBhMiwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDA5NzogMHgwMTVhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgMHgwMDk4OiAweDAxNWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgMHgwMDk5OiAweDAwZDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDlhOiAweDAwZGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDliOiAweDAwZjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDA5YzogMHgwMGEzLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDA5ZDogMHgwMGQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDA5ZTogMHgwMGQ3LCAgICAgIyAgTVVMVElQTElDQVRJT04gU0lHTgorICAgIDB4MDA5ZjogMHgwMGE0LCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBhMDogMHgwMTAwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorICAgIDB4MDBhMTogMHgwMTJhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgIDB4MDBhMjogMHgwMGYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBhMzogMHgwMTdiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIDB4MDBhNDogMHgwMTdjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICAweDAwYTU6IDB4MDE3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICAweDAwYTY6IDB4MjAxZCwgICAgICMgIFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhNzogMHgwMGE2LCAgICAgIyAgQlJPS0VOIEJBUgorICAgIDB4MDBhODogMHgwMGE5LCAgICAgIyAgQ09QWVJJR0hUIFNJR04KKyAgICAweDAwYTk6IDB4MDBhZSwgICAgICMgIFJFR0lTVEVSRUQgU0lHTgorICAgIDB4MDBhYTogMHgwMGFjLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWI6IDB4MDBiZCwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBhYzogMHgwMGJjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGFkOiAweDAxNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgMHgwMGFlOiAweDAwYWIsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhZjogMHgwMGJiLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGIwOiAweDI1OTEsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MDBiMTogMHgyNTkyLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgwMGIyOiAweDI1OTMsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgwMGIzOiAweDI1MDIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDAwYjQ6IDB4MjUyNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiNTogMHgwMTA0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIDB4MDBiNjogMHgwMTBjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgMHgwMGI3OiAweDAxMTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgMHgwMGI4OiAweDAxMTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisgICAgMHgwMGI5OiAweDI1NjMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGJhOiAweDI1NTEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgwMGJiOiAweDI1NTcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDAwYmM6IDB4MjU1ZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDAwYmQ6IDB4MDEyZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKyAgICAweDAwYmU6IDB4MDE2MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIDB4MDBiZjogMHgyNTEwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDAwYzA6IDB4MjUxNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDAwYzE6IDB4MjUzNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMjogMHgyNTJjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzM6IDB4MjUxYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwYzQ6IDB4MjUwMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgwMGM1OiAweDI1M2MsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzY6IDB4MDE3MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICAweDAwYzc6IDB4MDE2YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICAweDAwYzg6IDB4MjU1YSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgwMGM5OiAweDI1NTQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGNhOiAweDI1NjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNiOiAweDI1NjYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2M6IDB4MjU2MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGNkOiAweDI1NTAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDAwY2U6IDB4MjU2YywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2Y6IDB4MDE3ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIDB4MDBkMDogMHgwMTA1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICAweDAwZDE6IDB4MDEwZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICAweDAwZDI6IDB4MDExOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgMHgwMGQzOiAweDAxMTcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorICAgIDB4MDBkNDogMHgwMTJmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKyAgICAweDAwZDU6IDB4MDE2MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICAweDAwZDY6IDB4MDE3MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggT0dPTkVLCisgICAgMHgwMGQ3OiAweDAxNmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIDB4MDBkODogMHgwMTdlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIDB4MDBkOTogMHgyNTE4LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgwMGRhOiAweDI1MGMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwZGI6IDB4MjU4OCwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDAwZGM6IDB4MjU4NCwgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDAwZGQ6IDB4MjU4YywgICAgICMgIExFRlQgSEFMRiBCTE9DSworICAgIDB4MDBkZTogMHgyNTkwLCAgICAgIyAgUklHSFQgSEFMRiBCTE9DSworICAgIDB4MDBkZjogMHgyNTgwLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MDBlMDogMHgwMGQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGUxOiAweDAwZGYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAoR0VSTUFOKQorICAgIDB4MDBlMjogMHgwMTRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIE1BQ1JPTgorICAgIDB4MDBlMzogMHgwMTQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgMHgwMGU0OiAweDAwZjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGU1OiAweDAwZDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZTY6IDB4MDBiNSwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwZTc6IDB4MDE0NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQUNVVEUKKyAgICAweDAwZTg6IDB4MDEzNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBDRURJTExBCisgICAgMHgwMGU5OiAweDAxMzcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICAweDAwZWE6IDB4MDEzYiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgMHgwMGViOiAweDAxM2MsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICAweDAwZWM6IDB4MDE0NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIDB4MDBlZDogMHgwMTEyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorICAgIDB4MDBlZTogMHgwMTQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICAweDAwZWY6IDB4MjAxOSwgICAgICMgIFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBmMDogMHgwMGFkLCAgICAgIyAgU09GVCBIWVBIRU4KKyAgICAweDAwZjE6IDB4MDBiMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBmMjogMHgyMDFjLCAgICAgIyAgTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwZjM6IDB4MDBiZSwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIDB4MDBmNDogMHgwMGI2LCAgICAgIyAgUElMQ1JPVyBTSUdOCisgICAgMHgwMGY1OiAweDAwYTcsICAgICAjICBTRUNUSU9OIFNJR04KKyAgICAweDAwZjY6IDB4MDBmNywgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAwZjc6IDB4MjAxZSwgICAgICMgIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBmODogMHgwMGIwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwZjk6IDB4MjIxOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MDBmYTogMHgwMGI3LCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBmYjogMHgwMGI5LCAgICAgIyAgU1VQRVJTQ1JJUFQgT05FCisgICAgMHgwMGZjOiAweDAwYjMsICAgICAjICBTVVBFUlNDUklQVCBUSFJFRQorICAgIDB4MDBmZDogMHgwMGIyLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGZlOiAweDI1YTAsICAgICAjICBCTEFDSyBTUVVBUkUKKyAgICAweDAwZmY6IDB4MDBhMCwgICAgICMgIE5PLUJSRUFLIFNQQUNFCit9KQorCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAwMDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDAwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwMDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDAwMDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDAwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDAwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwMDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDAwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDAwMGEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwMDBiIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDAwMGMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwMDBkIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MDAwZSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDAwMGYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDAwMTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MDAxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDAwMTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgwMDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgwMDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDAwMTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDAwMTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MDAxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgwMDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MDAxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgwMDFhIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDAwMWIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgwMDFjIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgwMDFkIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MDAxZSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgwMDFmIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgwMDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgwMDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDAwMjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDAwMjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDAwMjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDAwMjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgwMDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MDAyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgwMDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDAwMjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDAwMmEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDAwMmIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgwMDJjIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgwMDJkIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MDAyZSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDAwMmYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MDAzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgwMDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MDAzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDAwMzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDAwMzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MDAzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgwMDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MDAzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MDAzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MDAzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgwMDNhIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgwMDNiIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4MDAzYyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4MDAzZCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4MDAzZSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4MDAzZiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHgwMDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDAwNDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4MDA0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHgwMDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDAwNDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4MDA0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHgwMDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDAwNDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4MDA0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHgwMDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDAwNGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4MDA0YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHgwMDRjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDAwNGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4MDA0ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHgwMDRmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDAwNTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4MDA1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHgwMDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDAwNTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4MDA1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHgwMDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDAwNTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4MDA1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHgwMDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDAwNTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4MDA1YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHgwMDViIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDAwNWMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHgwMDVkIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHgwMDVlIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHgwMDVmIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHgwMDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4MDA2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4MDA2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4MDA2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4MDA2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4MDA2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4MDA2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4MDA2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4MDA2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4MDA2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4MDA2YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4MDA2YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4MDA2YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4MDA2ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4MDA2ZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4MDA2ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4MDA3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4MDA3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4MDA3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4MDA3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4MDA3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4MDA3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4MDA3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4MDA3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4MDA3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4MDA3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4MDA3YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4MDA3YiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDAwN2MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4MDA3ZCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHgwMDdlIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHgwMDdmIC0+IERFTEVURQorICAgIHUnXHUwMTA2JyAgICMgIDB4MDA4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4ZmMnICAgICAjICAweDAwODEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTknICAgICAjICAweDAwODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTAxJyAgICMgIDB4MDA4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorICAgIHUnXHhlNCcgICAgICMgIDB4MDA4NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTIzJyAgICMgIDB4MDA4NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZTUnICAgICAjICAweDAwODYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdcdTAxMDcnICAgIyAgMHgwMDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x1MDE0MicgICAjICAweDAwODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDExMycgICAjICAweDAwODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBNQUNST04KKyAgICB1J1x1MDE1NicgICAjICAweDAwOGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE1NycgICAjICAweDAwOGIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisgICAgdSdcdTAxMmInICAgIyAgMHgwMDhjIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggTUFDUk9OCisgICAgdSdcdTAxNzknICAgIyAgMHgwMDhkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIHUnXHhjNCcgICAgICMgIDB4MDA4ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHgwMDhmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGM5JyAgICAgIyAgMHgwMDkwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlNicgICAgICMgIDB4MDA5MSAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIHUnXHhjNicgICAgICMgIDB4MDA5MiAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgdSdcdTAxNGQnICAgIyAgMHgwMDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgdSdceGY2JyAgICAgIyAgMHgwMDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMjInICAgIyAgMHgwMDk1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisgICAgdSdceGEyJyAgICAgIyAgMHgwMDk2IC0+IENFTlQgU0lHTgorICAgIHUnXHUwMTVhJyAgICMgIDB4MDA5NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICB1J1x1MDE1YicgICAjICAweDAwOTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIHUnXHhkNicgICAgICMgIDB4MDA5OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRjJyAgICAgIyAgMHgwMDlhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjgnICAgICAjICAweDAwOWIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4YTMnICAgICAjICAweDAwOWMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhkOCcgICAgICMgIDB4MDA5ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGQ3JyAgICAgIyAgMHgwMDllIC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x4YTQnICAgICAjICAweDAwOWYgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHUwMTAwJyAgICMgIDB4MDBhMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMmEnICAgIyAgMHgwMGExIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICB1J1x4ZjMnICAgICAjICAweDAwYTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHUwMTdiJyAgICMgIDB4MDBhMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxN2MnICAgIyAgMHgwMGE0IC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxN2EnICAgIyAgMHgwMGE1IC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICB1J1x1MjAxZCcgICAjICAweDAwYTYgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGE2JyAgICAgIyAgMHgwMGE3IC0+IEJST0tFTiBCQVIKKyAgICB1J1x4YTknICAgICAjICAweDAwYTggLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4YWUnICAgICAjICAweDAwYTkgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGFjJyAgICAgIyAgMHgwMGFhIC0+IE5PVCBTSUdOCisgICAgdSdceGJkJyAgICAgIyAgMHgwMGFiIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiYycgICAgICMgIDB4MDBhYyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x1MDE0MScgICAjICAweDAwYWQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIHUnXHhhYicgICAgICMgIDB4MDBhZSAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4MDBhZiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjU5MScgICAjICAweDAwYjAgLT4gTElHSFQgU0hBREUKKyAgICB1J1x1MjU5MicgICAjICAweDAwYjEgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1OTMnICAgIyAgMHgwMGIyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjUwMicgICAjICAweDAwYjMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MjQnICAgIyAgMHgwMGI0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUwMTA0JyAgICMgIDB4MDBiNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMGMnICAgIyAgMHgwMGI2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHUwMTE4JyAgICMgIDB4MDBiNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMTYnICAgIyAgMHgwMGI4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MjU2MycgICAjICAweDAwYjkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTUxJyAgICMgIDB4MDBiYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTcnICAgIyAgMHgwMGJiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTVkJyAgICMgIDB4MDBiYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdcdTAxMmUnICAgIyAgMHgwMGJkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKyAgICB1J1x1MDE2MCcgICAjICAweDAwYmUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTI1MTAnICAgIyAgMHgwMGJmIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHgwMGMwIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjUzNCcgICAjICAweDAwYzEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MmMnICAgIyAgMHgwMGMyIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHgwMGMzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUwMCcgICAjICAweDAwYzQgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweDAwYzUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTAxNzInICAgIyAgMHgwMGM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDE2YScgICAjICAweDAwYzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIHUnXHUyNTVhJyAgICMgIDB4MDBjOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTU0JyAgICMgIDB4MDBjOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHgwMGNhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweDAwY2IgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjAnICAgIyAgMHgwMGNjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHgwMGNkIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4MDBjZSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTAxN2QnICAgIyAgMHgwMGNmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHUwMTA1JyAgICMgIDB4MDBkMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIHUnXHUwMTBkJyAgICMgIDB4MDBkMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdcdTAxMTknICAgIyAgMHgwMGQyIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMTcnICAgIyAgMHgwMGQzIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxMmYnICAgIyAgMHgwMGQ0IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgdSdcdTAxNjEnICAgIyAgMHgwMGQ1IC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MDE3MycgICAjICAweDAwZDYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDE2YicgICAjICAweDAwZDcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICB1J1x1MDE3ZScgICAjICAweDAwZDggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHUyNTE4JyAgICMgIDB4MDBkOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweDAwZGEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHgwMGRiIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweDAwZGMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHUyNThjJyAgICMgIDB4MDBkZCAtPiBMRUZUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU5MCcgICAjICAweDAwZGUgLT4gUklHSFQgSEFMRiBCTE9DSworICAgIHUnXHUyNTgwJyAgICMgIDB4MDBkZiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdceGQzJyAgICAgIyAgMHgwMGUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkZicgICAgICMgIDB4MDBlMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAoR0VSTUFOKQorICAgIHUnXHUwMTRjJyAgICMgIDB4MDBlMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgdSdcdTAxNDMnICAgIyAgMHgwMGUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIHUnXHhmNScgICAgICMgIDB4MDBlNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGQ1JyAgICAgIyAgMHgwMGU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhiNScgICAgICMgIDB4MDBlNiAtPiBNSUNSTyBTSUdOCisgICAgdSdcdTAxNDQnICAgIyAgMHgwMGU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQUNVVEUKKyAgICB1J1x1MDEzNicgICAjICAweDAwZTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEzNycgICAjICAweDAwZTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBDRURJTExBCisgICAgdSdcdTAxM2InICAgIyAgMHgwMGVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgdSdcdTAxM2MnICAgIyAgMHgwMGViIC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTQ2JyAgICMgIDB4MDBlYyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICB1J1x1MDExMicgICAjICAweDAwZWQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTQ1JyAgICMgIDB4MDBlZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIHUnXHUyMDE5JyAgICMgIDB4MDBlZiAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YWQnICAgICAjICAweDAwZjAgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4YjEnICAgICAjICAweDAwZjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTIwMWMnICAgIyAgMHgwMGYyIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJlJyAgICAgIyAgMHgwMGYzIC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnXHhiNicgICAgICMgIDB4MDBmNCAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweDAwZjUgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGY3JyAgICAgIyAgMHgwMGY2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjAxZScgICAjICAweDAwZjcgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdceGIwJyAgICAgIyAgMHgwMGY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdcdTIyMTknICAgIyAgMHgwMGY5IC0+IEJVTExFVCBPUEVSQVRPUgorICAgIHUnXHhiNycgICAgICMgIDB4MDBmYSAtPiBNSURETEUgRE9UCisgICAgdSdceGI5JyAgICAgIyAgMHgwMGZiIC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhiMycgICAgICMgIDB4MDBmYyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiMicgICAgICMgIDB4MDBmZCAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHgwMGZmIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQKKyAgICAweDAwMjc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUKKyAgICAweDAwMjg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMKKyAgICAweDAwMjk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSworICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOCisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQQorICAgIDB4MDAyZDogMHgwMDJkLCAgICAgIyAgSFlQSEVOLU1JTlVTCisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OCisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04KKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOCisgICAgMHgwMDNkOiAweDAwM2QsICAgICAjICBFUVVBTFMgU0lHTgorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04KKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUksKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUworICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5UCisgICAgMHgwMDVmOiAweDAwNWYsICAgICAjICBMT1cgTElORQorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3YzogMHgwMDdjLCAgICAgIyAgVkVSVElDQUwgTElORQorICAgIDB4MDA3ZDogMHgwMDdkLCAgICAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3ZTogMHgwMDdlLCAgICAgIyAgVElMREUKKyAgICAweDAwN2Y6IDB4MDA3ZiwgICAgICMgIERFTEVURQorICAgIDB4MDBhMDogMHgwMGZmLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKKyAgICAweDAwYTI6IDB4MDA5NiwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDBhMzogMHgwMDljLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDBhNDogMHgwMDlmLCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBhNjogMHgwMGE3LCAgICAgIyAgQlJPS0VOIEJBUgorICAgIDB4MDBhNzogMHgwMGY1LCAgICAgIyAgU0VDVElPTiBTSUdOCisgICAgMHgwMGE5OiAweDAwYTgsICAgICAjICBDT1BZUklHSFQgU0lHTgorICAgIDB4MDBhYjogMHgwMGFlLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWM6IDB4MDBhYSwgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGFkOiAweDAwZjAsICAgICAjICBTT0ZUIEhZUEhFTgorICAgIDB4MDBhZTogMHgwMGE5LCAgICAgIyAgUkVHSVNURVJFRCBTSUdOCisgICAgMHgwMGIwOiAweDAwZjgsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiMTogMHgwMGYxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGIyOiAweDAwZmQsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwYjM6IDB4MDBmYywgICAgICMgIFNVUEVSU0NSSVBUIFRIUkVFCisgICAgMHgwMGI1OiAweDAwZTYsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGI2OiAweDAwZjQsICAgICAjICBQSUxDUk9XIFNJR04KKyAgICAweDAwYjc6IDB4MDBmYSwgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwYjk6IDB4MDBmYiwgICAgICMgIFNVUEVSU0NSSVBUIE9ORQorICAgIDB4MDBiYjogMHgwMGFmLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGJjOiAweDAwYWMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICAweDAwYmQ6IDB4MDBhYiwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBiZTogMHgwMGYzLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgMHgwMGM0OiAweDAwOGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGM1OiAweDAwOGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBjNjogMHgwMDkyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDBjOTogMHgwMDkwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGQzOiAweDAwZTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZDU6IDB4MDBlNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIDB4MDBkNjogMHgwMDk5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkNzogMHgwMDllLCAgICAgIyAgTVVMVElQTElDQVRJT04gU0lHTgorICAgIDB4MDBkODogMHgwMDlkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDBkYzogMHgwMDlhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkZjogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKEdFUk1BTikKKyAgICAweDAwZTQ6IDB4MDA4NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGU1OiAweDAwODYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwZTY6IDB4MDA5MSwgICAgICMgIExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgMHgwMGU5OiAweDAwODIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGYzOiAweDAwYTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGY1OiAweDAwZTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGY2OiAweDAwOTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmNzogMHgwMGY2LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmODogMHgwMDliLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwZmM6IDB4MDA4MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMTAwOiAweDAwYTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgMHgwMTAxOiAweDAwODMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorICAgIDB4MDEwNDogMHgwMGI1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIDB4MDEwNTogMHgwMGQwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICAweDAxMDY6IDB4MDA4MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIDB4MDEwNzogMHgwMDg3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIDB4MDEwYzogMHgwMGI2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgMHgwMTBkOiAweDAwZDEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgMHgwMTEyOiAweDAwZWQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgMHgwMTEzOiAweDAwODksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorICAgIDB4MDExNjogMHgwMGI4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorICAgIDB4MDExNzogMHgwMGQzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKyAgICAweDAxMTg6IDB4MDBiNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICAweDAxMTk6IDB4MDBkMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgMHgwMTIyOiAweDAwOTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgIDB4MDEyMzogMHgwMDg1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisgICAgMHgwMTJhOiAweDAwYTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggTUFDUk9OCisgICAgMHgwMTJiOiAweDAwOGMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgIDB4MDEyZTogMHgwMGJkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE9HT05FSworICAgIDB4MDEyZjogMHgwMGQ0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKyAgICAweDAxMzY6IDB4MDBlOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBDRURJTExBCisgICAgMHgwMTM3OiAweDAwZTksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICAweDAxM2I6IDB4MDBlYSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgMHgwMTNjOiAweDAwZWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICAweDAxNDE6IDB4MDBhZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICAweDAxNDI6IDB4MDA4OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgMHgwMTQzOiAweDAwZTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQUNVVEUKKyAgICAweDAxNDQ6IDB4MDBlNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQUNVVEUKKyAgICAweDAxNDU6IDB4MDBlZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBCisgICAgMHgwMTQ2OiAweDAwZWMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICAweDAxNGM6IDB4MDBlMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICAweDAxNGQ6IDB4MDA5MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgMHgwMTU2OiAweDAwOGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgIDB4MDE1NzogMHgwMDhiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisgICAgMHgwMTVhOiAweDAwOTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICAweDAxNWI6IDB4MDA5OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICAweDAxNjA6IDB4MDBiZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIDB4MDE2MTogMHgwMGQ1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIDB4MDE2YTogMHgwMGM3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIDB4MDE2YjogMHgwMGQ3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICAweDAxNzI6IDB4MDBjNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICAweDAxNzM6IDB4MDBkNiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggT0dPTkVLCisgICAgMHgwMTc5OiAweDAwOGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICAweDAxN2E6IDB4MDBhNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICAweDAxN2I6IDB4MDBhMywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICAweDAxN2M6IDB4MDBhNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgMHgwMTdkOiAweDAwY2YsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICAweDAxN2U6IDB4MDBkOCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICAweDIwMTk6IDB4MDBlZiwgICAgICMgIFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MjAxYzogMHgwMGYyLCAgICAgIyAgTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDIwMWQ6IDB4MDBhNiwgICAgICMgIFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MjAxZTogMHgwMGY3LCAgICAgIyAgRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgMHgyMjE5OiAweDAwZjksICAgICAjICBCVUxMRVQgT1BFUkFUT1IKKyAgICAweDI1MDA6IDB4MDBjNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwYjMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDI1MGM6IDB4MDBkYSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMGJmLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDBjMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDI1MTg6IDB4MDBkOSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMGMzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMGI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTJjOiAweDAwYzIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMGMxLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwYzUsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NTA6IDB4MDBjZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MjU1MTogMHgwMGJhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MjU1NDogMHgwMGM5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MjU1NzogMHgwMGJiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgyNTVhOiAweDAwYzgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MjU1ZDogMHgwMGJjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MjU2MDogMHgwMGNjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1NjM6IDB4MDBiOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1NjY6IDB4MDBjYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2OTogMHgwMGNhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2YzogMHgwMGNlLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU4MDogMHgwMGRmLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MjU4NDogMHgwMGRjLCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MjU4ODogMHgwMGRiLCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MjU4YzogMHgwMGRkLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgyNTkwOiAweDAwZGUsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgyNTkxOiAweDAwYjAsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MjU5MjogMHgwMGIxLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgyNTkzOiAweDAwYjIsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgyNWEwOiAweDAwZmUsICAgICAjICBCTEFDSyBTUVVBUkUKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzc1LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzc1LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzMxM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3NzUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzc1LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzc1LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzMxM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3NzUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODUwLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM4NDc4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODUwLnB5CkBAIC0wLDAgKzEsNjk4IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL01JQ1NGVC9QQy9DUDg1MC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwODUwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDA4MDogMHgwMGM3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwODE6IDB4MDBmYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDgyOiAweDAwZTksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDgzOiAweDAwZTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODQ6IDB4MDBlNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDg1OiAweDAwZTAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMDg2OiAweDAwZTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwODc6IDB4MDBlNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4ODogMHgwMGVhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDg5OiAweDAwZWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4YTogMHgwMGU4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDA4YjogMHgwMGVmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOGM6IDB4MDBlZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4ZDogMHgwMGVjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIDB4MDA4ZTogMHgwMGM0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4ZjogMHgwMGM1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwOTA6IDB4MDBjOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA5MTogMHgwMGU2LCAgICAgIyAgTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICAweDAwOTI6IDB4MDBjNiwgICAgICMgIExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICAweDAwOTM6IDB4MDBmNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5NDogMHgwMGY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOTU6IDB4MDBmMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAweDAwOTY6IDB4MDBmYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5NzogMHgwMGY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDA5ODogMHgwMGZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOTk6IDB4MDBkNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWE6IDB4MDBkYywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWI6IDB4MDBmOCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgMHgwMDljOiAweDAwYTMsICAgICAjICBQT1VORCBTSUdOCisgICAgMHgwMDlkOiAweDAwZDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgMHgwMDllOiAweDAwZDcsICAgICAjICBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgMHgwMDlmOiAweDAxOTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICAweDAwYTA6IDB4MDBlMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwYTE6IDB4MDBlZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwYTI6IDB4MDBmMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwYTM6IDB4MDBmYSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwYTQ6IDB4MDBmMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwYTU6IDB4MDBkMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBhNjogMHgwMGFhLCAgICAgIyAgRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYTc6IDB4MDBiYSwgICAgICMgIE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBhODogMHgwMGJmLCAgICAgIyAgSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIDB4MDBhOTogMHgwMGFlLCAgICAgIyAgUkVHSVNURVJFRCBTSUdOCisgICAgMHgwMGFhOiAweDAwYWMsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDBhYjogMHgwMGJkLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgMHgwMGFjOiAweDAwYmMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICAweDAwYWQ6IDB4MDBhMSwgICAgICMgIElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwYWU6IDB4MDBhYiwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFmOiAweDAwYmIsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYjA6IDB4MjU5MSwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgwMGIxOiAweDI1OTIsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDAwYjI6IDB4MjU5MywgICAgICMgIERBUksgU0hBREUKKyAgICAweDAwYjM6IDB4MjUwMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MDBiNDogMHgyNTI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGI1OiAweDAwYzEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwYjY6IDB4MDBjMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGI3OiAweDAwYzAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwYjg6IDB4MDBhOSwgICAgICMgIENPUFlSSUdIVCBTSUdOCisgICAgMHgwMGI5OiAweDI1NjMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGJhOiAweDI1NTEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgwMGJiOiAweDI1NTcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDAwYmM6IDB4MjU1ZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDAwYmQ6IDB4MDBhMiwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDBiZTogMHgwMGE1LCAgICAgIyAgWUVOIFNJR04KKyAgICAweDAwYmY6IDB4MjUxMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgwMGMwOiAweDI1MTQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgwMGMxOiAweDI1MzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzI6IDB4MjUyYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMzOiAweDI1MWMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGM0OiAweDI1MDAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MDBjNTogMHgyNTNjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGM2OiAweDAwZTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgMHgwMGM3OiAweDAwYzMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAweDAwYzg6IDB4MjU1YSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgwMGM5OiAweDI1NTQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGNhOiAweDI1NjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNiOiAweDI1NjYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2M6IDB4MjU2MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGNkOiAweDI1NTAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDAwY2U6IDB4MjU2YywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2Y6IDB4MDBhNCwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwZDA6IDB4MDBmMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFVEgKKyAgICAweDAwZDE6IDB4MDBkMCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEVUSAorICAgIDB4MDBkMjogMHgwMGNhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZDM6IDB4MDBjYiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDQ6IDB4MDBjOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBkNTogMHgwMTMxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorICAgIDB4MDBkNjogMHgwMGNkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGQ3OiAweDAwY2UsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBkODogMHgwMGNmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkOTogMHgyNTE4LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgwMGRhOiAweDI1MGMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwZGI6IDB4MjU4OCwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDAwZGM6IDB4MjU4NCwgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDAwZGQ6IDB4MDBhNiwgICAgICMgIEJST0tFTiBCQVIKKyAgICAweDAwZGU6IDB4MDBjYywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIDB4MDBkZjogMHgyNTgwLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MDBlMDogMHgwMGQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGUxOiAweDAwZGYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMjogMHgwMGQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZTM6IDB4MDBkMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDBlNDogMHgwMGY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIDB4MDBlNTogMHgwMGQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGU2OiAweDAwYjUsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGU3OiAweDAwZmUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVEhPUk4KKyAgICAweDAwZTg6IDB4MDBkZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisgICAgMHgwMGU5OiAweDAwZGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwZWE6IDB4MDBkYiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGViOiAweDAwZDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwZWM6IDB4MDBmZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAwZWQ6IDB4MDBkZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIDB4MDBlZTogMHgwMGFmLCAgICAgIyAgTUFDUk9OCisgICAgMHgwMGVmOiAweDAwYjQsICAgICAjICBBQ1VURSBBQ0NFTlQKKyAgICAweDAwZjA6IDB4MDBhZCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGYxOiAweDAwYjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwZjI6IDB4MjAxNywgICAgICMgIERPVUJMRSBMT1cgTElORQorICAgIDB4MDBmMzogMHgwMGJlLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgMHgwMGY0OiAweDAwYjYsICAgICAjICBQSUxDUk9XIFNJR04KKyAgICAweDAwZjU6IDB4MDBhNywgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBmNjogMHgwMGY3LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmNzogMHgwMGI4LCAgICAgIyAgQ0VESUxMQQorICAgIDB4MDBmODogMHgwMGIwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwZjk6IDB4MDBhOCwgICAgICMgIERJQUVSRVNJUworICAgIDB4MDBmYTogMHgwMGI3LCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBmYjogMHgwMGI5LCAgICAgIyAgU1VQRVJTQ1JJUFQgT05FCisgICAgMHgwMGZjOiAweDAwYjMsICAgICAjICBTVVBFUlNDUklQVCBUSFJFRQorICAgIDB4MDBmZDogMHgwMGIyLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGZlOiAweDI1YTAsICAgICAjICBCTEFDSyBTUVVBUkUKKyAgICAweDAwZmY6IDB4MDBhMCwgICAgICMgIE5PLUJSRUFLIFNQQUNFCit9KQorCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAwMDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDAwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwMDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDAwMDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDAwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDAwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwMDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDAwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDAwMGEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwMDBiIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDAwMGMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwMDBkIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MDAwZSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDAwMGYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDAwMTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MDAxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDAwMTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgwMDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgwMDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDAwMTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDAwMTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MDAxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgwMDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MDAxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgwMDFhIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDAwMWIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgwMDFjIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgwMDFkIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MDAxZSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgwMDFmIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgwMDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgwMDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDAwMjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDAwMjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDAwMjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDAwMjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgwMDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MDAyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgwMDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDAwMjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDAwMmEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDAwMmIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgwMDJjIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgwMDJkIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MDAyZSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDAwMmYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MDAzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgwMDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MDAzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDAwMzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDAwMzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MDAzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgwMDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MDAzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MDAzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MDAzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgwMDNhIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgwMDNiIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4MDAzYyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4MDAzZCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4MDAzZSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4MDAzZiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHgwMDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDAwNDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4MDA0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHgwMDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDAwNDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4MDA0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHgwMDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDAwNDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4MDA0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHgwMDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDAwNGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4MDA0YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHgwMDRjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDAwNGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4MDA0ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHgwMDRmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDAwNTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4MDA1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHgwMDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDAwNTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4MDA1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHgwMDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDAwNTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4MDA1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHgwMDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDAwNTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4MDA1YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHgwMDViIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDAwNWMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHgwMDVkIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHgwMDVlIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHgwMDVmIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHgwMDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4MDA2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4MDA2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4MDA2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4MDA2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4MDA2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4MDA2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4MDA2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4MDA2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4MDA2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4MDA2YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4MDA2YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4MDA2YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4MDA2ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4MDA2ZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4MDA2ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4MDA3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4MDA3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4MDA3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4MDA3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4MDA3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4MDA3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4MDA3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4MDA3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4MDA3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4MDA3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4MDA3YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4MDA3YiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDAwN2MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4MDA3ZCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHgwMDdlIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHgwMDdmIC0+IERFTEVURQorICAgIHUnXHhjNycgICAgICMgIDB4MDA4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhmYycgICAgICMgIDB4MDA4MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOScgICAgICMgIDB4MDA4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHgwMDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4MDA4NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMCcgICAgICMgIDB4MDA4NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGU1JyAgICAgIyAgMHgwMDg2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNycgICAgICMgIDB4MDA4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZWEnICAgICAjICAweDAwODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHgwMDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU4JyAgICAgIyAgMHgwMDhhIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZWYnICAgICAjICAweDAwOGIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWUnICAgICAjICAweDAwOGMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVjJyAgICAgIyAgMHgwMDhkIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4YzQnICAgICAjICAweDAwOGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4MDA4ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjOScgICAgICMgIDB4MDA5MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTYnICAgICAjICAweDAwOTEgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICB1J1x4YzYnICAgICAjICAweDAwOTIgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIHUnXHhmNCcgICAgICMgIDB4MDA5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjYnICAgICAjICAweDAwOTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjInICAgICAjICAweDAwOTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmYicgICAgICMgIDB4MDA5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjknICAgICAjICAweDAwOTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmZicgICAgICMgIDB4MDA5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkNicgICAgICMgIDB4MDA5OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRjJyAgICAgIyAgMHgwMDlhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjgnICAgICAjICAweDAwOWIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4YTMnICAgICAjICAweDAwOWMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhkOCcgICAgICMgIDB4MDA5ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGQ3JyAgICAgIyAgMHgwMDllIC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x1MDE5MicgICAjICAweDAwOWYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdceGUxJyAgICAgIyAgMHgwMGEwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZWQnICAgICAjICAweDAwYTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhmMycgICAgICMgIDB4MDBhMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGZhJyAgICAgIyAgMHgwMGEzIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZjEnICAgICAjICAweDAwYTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkMScgICAgICMgIDB4MDBhNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4YWEnICAgICAjICAweDAwYTYgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmEnICAgICAjICAweDAwYTcgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJmJyAgICAgIyAgMHgwMGE4IC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4YWUnICAgICAjICAweDAwYTkgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGFjJyAgICAgIyAgMHgwMGFhIC0+IE5PVCBTSUdOCisgICAgdSdceGJkJyAgICAgIyAgMHgwMGFiIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiYycgICAgICMgIDB4MDBhYyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YTEnICAgICAjICAweDAwYWQgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhhYicgICAgICMgIDB4MDBhZSAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4MDBhZiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjU5MScgICAjICAweDAwYjAgLT4gTElHSFQgU0hBREUKKyAgICB1J1x1MjU5MicgICAjICAweDAwYjEgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1OTMnICAgIyAgMHgwMGIyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjUwMicgICAjICAweDAwYjMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MjQnICAgIyAgMHgwMGI0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHhjMScgICAgICMgIDB4MDBiNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4YzInICAgICAjICAweDAwYjYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzAnICAgICAjICAweDAwYjcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGE5JyAgICAgIyAgMHgwMGI4IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTI1NjMnICAgIyAgMHgwMGI5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU1MScgICAjICAweDAwYmEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTU3JyAgICMgIDB4MDBiYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjU1ZCcgICAjICAweDAwYmMgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIHUnXHhhMicgICAgICMgIDB4MDBiZCAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweDAwYmUgLT4gWUVOIFNJR04KKyAgICB1J1x1MjUxMCcgICAjICAweDAwYmYgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjUxNCcgICAjICAweDAwYzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4MDBjMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweDAwYzIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUxYycgICAjICAweDAwYzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4MDBjNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4MDBjNSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x4ZTMnICAgICAjICAweDAwYzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhjMycgICAgICMgIDB4MDBjNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x1MjU1YScgICAjICAweDAwYzggLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjU1NCcgICAjICAweDAwYzkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTY5JyAgICMgIDB4MDBjYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjYnICAgIyAgMHgwMGNiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTYwJyAgICMgIDB4MDBjYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTUwJyAgICMgIDB4MDBjZCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICB1J1x1MjU2YycgICAjICAweDAwY2UgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHhhNCcgICAgICMgIDB4MDBjZiAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdceGYwJyAgICAgIyAgMHgwMGQwIC0+IExBVElOIFNNQUxMIExFVFRFUiBFVEgKKyAgICB1J1x4ZDAnICAgICAjICAweDAwZDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRICisgICAgdSdceGNhJyAgICAgIyAgMHgwMGQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNiJyAgICAgIyAgMHgwMGQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzgnICAgICAjICAweDAwZDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdcdTAxMzEnICAgIyAgMHgwMGQ1IC0+IExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkKKyAgICB1J1x4Y2QnICAgICAjICAweDAwZDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHgwMGQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHgwMGQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MjUxOCcgICAjICAweDAwZDkgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgdSdcdTI1MGMnICAgIyAgMHgwMGRhIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTg4JyAgICMgIDB4MDBkYiAtPiBGVUxMIEJMT0NLCisgICAgdSdcdTI1ODQnICAgIyAgMHgwMGRjIC0+IExPV0VSIEhBTEYgQkxPQ0sKKyAgICB1J1x4YTYnICAgICAjICAweDAwZGQgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhjYycgICAgICMgIDB4MDBkZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x1MjU4MCcgICAjICAweDAwZGYgLT4gVVBQRVIgSEFMRiBCTE9DSworICAgIHUnXHhkMycgICAgICMgIDB4MDBlMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZGYnICAgICAjICAweDAwZTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x4ZDQnICAgICAjICAweDAwZTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDInICAgICAjICAweDAwZTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGY1JyAgICAgIyAgMHgwMGU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZDUnICAgICAjICAweDAwZTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGI1JyAgICAgIyAgMHgwMGU2IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x4ZmUnICAgICAjICAweDAwZTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOCisgICAgdSdceGRlJyAgICAgIyAgMHgwMGU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisgICAgdSdceGRhJyAgICAgIyAgMHgwMGU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4MDBlYSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkOScgICAgICMgIDB4MDBlYiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmQnICAgICAjICAweDAwZWMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhkZCcgICAgICMgIDB4MDBlZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4YWYnICAgICAjICAweDAwZWUgLT4gTUFDUk9OCisgICAgdSdceGI0JyAgICAgIyAgMHgwMGVmIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhhZCcgICAgICMgIDB4MDBmMCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhiMScgICAgICMgIDB4MDBmMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MjAxNycgICAjICAweDAwZjIgLT4gRE9VQkxFIExPVyBMSU5FCisgICAgdSdceGJlJyAgICAgIyAgMHgwMGYzIC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnXHhiNicgICAgICMgIDB4MDBmNCAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweDAwZjUgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGY3JyAgICAgIyAgMHgwMGY2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x4YjgnICAgICAjICAweDAwZjcgLT4gQ0VESUxMQQorICAgIHUnXHhiMCcgICAgICMgIDB4MDBmOCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhhOCcgICAgICMgIDB4MDBmOSAtPiBESUFFUkVTSVMKKyAgICB1J1x4YjcnICAgICAjICAweDAwZmEgLT4gTUlERExFIERPVAorICAgIHUnXHhiOScgICAgICMgIDB4MDBmYiAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x4YjMnICAgICAjICAweDAwZmMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4YjInICAgICAjICAweDAwZmQgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdcdTI1YTAnICAgIyAgMHgwMGZlIC0+IEJMQUNLIFNRVUFSRQorICAgIHUnXHhhMCcgICAgICMgIDB4MDBmZiAtPiBOTy1CUkVBSyBTUEFDRQorKQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHsKKyAgICAweDAwMDA6IDB4MDAwMCwgICAgICMgIE5VTEwKKyAgICAweDAwMDE6IDB4MDAwMSwgICAgICMgIFNUQVJUIE9GIEhFQURJTkcKKyAgICAweDAwMDI6IDB4MDAwMiwgICAgICMgIFNUQVJUIE9GIFRFWFQKKyAgICAweDAwMDM6IDB4MDAwMywgICAgICMgIEVORCBPRiBURVhUCisgICAgMHgwMDA0OiAweDAwMDQsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgMHgwMDA1OiAweDAwMDUsICAgICAjICBFTlFVSVJZCisgICAgMHgwMDA2OiAweDAwMDYsICAgICAjICBBQ0tOT1dMRURHRQorICAgIDB4MDAwNzogMHgwMDA3LCAgICAgIyAgQkVMTAorICAgIDB4MDAwODogMHgwMDA4LCAgICAgIyAgQkFDS1NQQUNFCisgICAgMHgwMDA5OiAweDAwMDksICAgICAjICBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICAweDAwMGE6IDB4MDAwYSwgICAgICMgIExJTkUgRkVFRAorICAgIDB4MDAwYjogMHgwMDBiLCAgICAgIyAgVkVSVElDQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYzogMHgwMDBjLCAgICAgIyAgRk9STSBGRUVECisgICAgMHgwMDBkOiAweDAwMGQsICAgICAjICBDQVJSSUFHRSBSRVRVUk4KKyAgICAweDAwMGU6IDB4MDAwZSwgICAgICMgIFNISUZUIE9VVAorICAgIDB4MDAwZjogMHgwMDBmLCAgICAgIyAgU0hJRlQgSU4KKyAgICAweDAwMTA6IDB4MDAxMCwgICAgICMgIERBVEEgTElOSyBFU0NBUEUKKyAgICAweDAwMTE6IDB4MDAxMSwgICAgICMgIERFVklDRSBDT05UUk9MIE9ORQorICAgIDB4MDAxMjogMHgwMDEyLCAgICAgIyAgREVWSUNFIENPTlRST0wgVFdPCisgICAgMHgwMDEzOiAweDAwMTMsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIDB4MDAxNDogMHgwMDE0LCAgICAgIyAgREVWSUNFIENPTlRST0wgRk9VUgorICAgIDB4MDAxNTogMHgwMDE1LCAgICAgIyAgTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICAweDAwMTY6IDB4MDAxNiwgICAgICMgIFNZTkNIUk9OT1VTIElETEUKKyAgICAweDAwMTc6IDB4MDAxNywgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICAweDAwMTg6IDB4MDAxOCwgICAgICMgIENBTkNFTAorICAgIDB4MDAxOTogMHgwMDE5LCAgICAgIyAgRU5EIE9GIE1FRElVTQorICAgIDB4MDAxYTogMHgwMDFhLCAgICAgIyAgU1VCU1RJVFVURQorICAgIDB4MDAxYjogMHgwMDFiLCAgICAgIyAgRVNDQVBFCisgICAgMHgwMDFjOiAweDAwMWMsICAgICAjICBGSUxFIFNFUEFSQVRPUgorICAgIDB4MDAxZDogMHgwMDFkLCAgICAgIyAgR1JPVVAgU0VQQVJBVE9SCisgICAgMHgwMDFlOiAweDAwMWUsICAgICAjICBSRUNPUkQgU0VQQVJBVE9SCisgICAgMHgwMDFmOiAweDAwMWYsICAgICAjICBVTklUIFNFUEFSQVRPUgorICAgIDB4MDAyMDogMHgwMDIwLCAgICAgIyAgU1BBQ0UKKyAgICAweDAwMjE6IDB4MDAyMSwgICAgICMgIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwMjI6IDB4MDAyMiwgICAgICMgIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMDIzOiAweDAwMjMsICAgICAjICBOVU1CRVIgU0lHTgorICAgIDB4MDAyNDogMHgwMDI0LCAgICAgIyAgRE9MTEFSIFNJR04KKyAgICAweDAwMjU6IDB4MDAyNSwgICAgICMgIFBFUkNFTlQgU0lHTgorICAgIDB4MDAyNjogMHgwMDI2LCAgICAgIyAgQU1QRVJTQU5ECisgICAgMHgwMDI3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFCisgICAgMHgwMDI4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTCisgICAgMHgwMDI5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUworICAgIDB4MDAyYTogMHgwMDJhLCAgICAgIyAgQVNURVJJU0sKKyAgICAweDAwMmI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTgorICAgIDB4MDAyYzogMHgwMDJjLCAgICAgIyAgQ09NTUEKKyAgICAweDAwMmQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUworICAgIDB4MDAyZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QCisgICAgMHgwMDJmOiAweDAwMmYsICAgICAjICBTT0xJRFVTCisgICAgMHgwMDMwOiAweDAwMzAsICAgICAjICBESUdJVCBaRVJPCisgICAgMHgwMDMxOiAweDAwMzEsICAgICAjICBESUdJVCBPTkUKKyAgICAweDAwMzI6IDB4MDAzMiwgICAgICMgIERJR0lUIFRXTworICAgIDB4MDAzMzogMHgwMDMzLCAgICAgIyAgRElHSVQgVEhSRUUKKyAgICAweDAwMzQ6IDB4MDAzNCwgICAgICMgIERJR0lUIEZPVVIKKyAgICAweDAwMzU6IDB4MDAzNSwgICAgICMgIERJR0lUIEZJVkUKKyAgICAweDAwMzY6IDB4MDAzNiwgICAgICMgIERJR0lUIFNJWAorICAgIDB4MDAzNzogMHgwMDM3LCAgICAgIyAgRElHSVQgU0VWRU4KKyAgICAweDAwMzg6IDB4MDAzOCwgICAgICMgIERJR0lUIEVJR0hUCisgICAgMHgwMDM5OiAweDAwMzksICAgICAjICBESUdJVCBOSU5FCisgICAgMHgwMDNhOiAweDAwM2EsICAgICAjICBDT0xPTgorICAgIDB4MDAzYjogMHgwMDNiLCAgICAgIyAgU0VNSUNPTE9OCisgICAgMHgwMDNjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTgorICAgIDB4MDAzZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04KKyAgICAweDAwM2U6IDB4MDAzZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOCisgICAgMHgwMDNmOiAweDAwM2YsICAgICAjICBRVUVTVElPTiBNQVJLCisgICAgMHgwMDQwOiAweDAwNDAsICAgICAjICBDT01NRVJDSUFMIEFUCisgICAgMHgwMDQxOiAweDAwNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMDQyOiAweDAwNDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgMHgwMDQzOiAweDAwNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgMHgwMDQ0OiAweDAwNDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgMHgwMDQ1OiAweDAwNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwMDQ2OiAweDAwNDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgMHgwMDQ3OiAweDAwNDcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgMHgwMDQ4OiAweDAwNDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgMHgwMDQ5OiAweDAwNDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMDRhOiAweDAwNGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgMHgwMDRiOiAweDAwNGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgMHgwMDRjOiAweDAwNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgMHgwMDRkOiAweDAwNGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgMHgwMDRlOiAweDAwNGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgMHgwMDRmOiAweDAwNGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDUwOiAweDAwNTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgMHgwMDUxOiAweDAwNTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgMHgwMDUyOiAweDAwNTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgMHgwMDUzOiAweDAwNTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgMHgwMDU0OiAweDAwNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgMHgwMDU1OiAweDAwNTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDU2OiAweDAwNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgMHgwMDU3OiAweDAwNTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgMHgwMDU4OiAweDAwNTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgMHgwMDU5OiAweDAwNTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgMHgwMDVhOiAweDAwNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgMHgwMDViOiAweDAwNWIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVjOiAweDAwNWMsICAgICAjICBSRVZFUlNFIFNPTElEVVMKKyAgICAweDAwNWQ6IDB4MDA1ZCwgICAgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVlOiAweDAwNWUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIDB4MDA1ZjogMHgwMDVmLCAgICAgIyAgTE9XIExJTkUKKyAgICAweDAwNjA6IDB4MDA2MCwgICAgICMgIEdSQVZFIEFDQ0VOVAorICAgIDB4MDA2MTogMHgwMDYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICAweDAwNjI6IDB4MDA2MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgMHgwMDYzOiAweDAwNjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIDB4MDA2NDogMHgwMDY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICAweDAwNjU6IDB4MDA2NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgMHgwMDY2OiAweDAwNjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIDB4MDA2NzogMHgwMDY3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICAweDAwNjg6IDB4MDA2OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBICisgICAgMHgwMDY5OiAweDAwNjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIDB4MDA2YTogMHgwMDZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICAweDAwNmI6IDB4MDA2YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgMHgwMDZjOiAweDAwNmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIDB4MDA2ZDogMHgwMDZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICAweDAwNmU6IDB4MDA2ZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMDZmOiAweDAwNmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIDB4MDA3MDogMHgwMDcwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICAweDAwNzE6IDB4MDA3MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgMHgwMDcyOiAweDAwNzIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIDB4MDA3MzogMHgwMDczLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICAweDAwNzQ6IDB4MDA3NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgMHgwMDc1OiAweDAwNzUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIDB4MDA3NjogMHgwMDc2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICAweDAwNzc6IDB4MDA3NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgMHgwMDc4OiAweDAwNzgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIDB4MDA3OTogMHgwMDc5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICAweDAwN2E6IDB4MDA3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgMHgwMDdiOiAweDAwN2IsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2M6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUKKyAgICAweDAwN2Q6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2U6IDB4MDA3ZSwgICAgICMgIFRJTERFCisgICAgMHgwMDdmOiAweDAwN2YsICAgICAjICBERUxFVEUKKyAgICAweDAwYTA6IDB4MDBmZiwgICAgICMgIE5PLUJSRUFLIFNQQUNFCisgICAgMHgwMGExOiAweDAwYWQsICAgICAjICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMGEyOiAweDAwYmQsICAgICAjICBDRU5UIFNJR04KKyAgICAweDAwYTM6IDB4MDA5YywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwYTQ6IDB4MDBjZiwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwYTU6IDB4MDBiZSwgICAgICMgIFlFTiBTSUdOCisgICAgMHgwMGE2OiAweDAwZGQsICAgICAjICBCUk9LRU4gQkFSCisgICAgMHgwMGE3OiAweDAwZjUsICAgICAjICBTRUNUSU9OIFNJR04KKyAgICAweDAwYTg6IDB4MDBmOSwgICAgICMgIERJQUVSRVNJUworICAgIDB4MDBhOTogMHgwMGI4LCAgICAgIyAgQ09QWVJJR0hUIFNJR04KKyAgICAweDAwYWE6IDB4MDBhNiwgICAgICMgIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGFiOiAweDAwYWUsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhYzogMHgwMGFhLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWQ6IDB4MDBmMCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGFlOiAweDAwYTksICAgICAjICBSRUdJU1RFUkVEIFNJR04KKyAgICAweDAwYWY6IDB4MDBlZSwgICAgICMgIE1BQ1JPTgorICAgIDB4MDBiMDogMHgwMGY4LCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwYjE6IDB4MDBmMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBiMjogMHgwMGZkLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGIzOiAweDAwZmMsICAgICAjICBTVVBFUlNDUklQVCBUSFJFRQorICAgIDB4MDBiNDogMHgwMGVmLCAgICAgIyAgQUNVVEUgQUNDRU5UCisgICAgMHgwMGI1OiAweDAwZTYsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGI2OiAweDAwZjQsICAgICAjICBQSUxDUk9XIFNJR04KKyAgICAweDAwYjc6IDB4MDBmYSwgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwYjg6IDB4MDBmNywgICAgICMgIENFRElMTEEKKyAgICAweDAwYjk6IDB4MDBmYiwgICAgICMgIFNVUEVSU0NSSVBUIE9ORQorICAgIDB4MDBiYTogMHgwMGE3LCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGJiOiAweDAwYWYsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYmM6IDB4MDBhYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBiZDogMHgwMGFiLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgMHgwMGJlOiAweDAwZjMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICAweDAwYmY6IDB4MDBhOCwgICAgICMgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICAweDAwYzA6IDB4MDBiNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBjMTogMHgwMGI1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGMyOiAweDAwYjYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBjMzogMHgwMGM3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgMHgwMGM0OiAweDAwOGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGM1OiAweDAwOGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBjNjogMHgwMDkyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDBjNzogMHgwMDgwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwYzg6IDB4MDBkNCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBjOTogMHgwMDkwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGNhOiAweDAwZDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBjYjogMHgwMGQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBjYzogMHgwMGRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMGNkOiAweDAwZDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwY2U6IDB4MDBkNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGNmOiAweDAwZDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGQwOiAweDAwZDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEgKKyAgICAweDAwZDE6IDB4MDBhNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBkMjogMHgwMGUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMGQzOiAweDAwZTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZDQ6IDB4MDBlMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGQ1OiAweDAwZTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZDY6IDB4MDA5OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDc6IDB4MDA5ZSwgICAgICMgIE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICAweDAwZDg6IDB4MDA5ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwZDk6IDB4MDBlYiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDBkYTogMHgwMGU5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGRiOiAweDAwZWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBkYzogMHgwMDlhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkZDogMHgwMGVkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgMHgwMGRlOiAweDAwZTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STgorICAgIDB4MDBkZjogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTA6IDB4MDA4NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwZTE6IDB4MDBhMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwZTI6IDB4MDA4MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlMzogMHgwMGM2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIDB4MDBlNDogMHgwMDg0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZTU6IDB4MDA4NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBlNjogMHgwMDkxLCAgICAgIyAgTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICAweDAwZTc6IDB4MDA4NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBlODogMHgwMDhhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBlOTogMHgwMDgyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDBlYTogMHgwMDg4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGViOiAweDAwODksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlYzogMHgwMDhkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIDB4MDBlZDogMHgwMGExLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBlZTogMHgwMDhjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGVmOiAweDAwOGIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmMDogMHgwMGQwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEVUSAorICAgIDB4MDBmMTogMHgwMGE0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBmMjogMHgwMDk1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDBmMzogMHgwMGEyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBmNDogMHgwMDkzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGY1OiAweDAwZTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGY2OiAweDAwOTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmNzogMHgwMGY2LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmODogMHgwMDliLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwZjk6IDB4MDA5NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwZmE6IDB4MDBhMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwZmI6IDB4MDA5NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBmYzogMHgwMDgxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZmQ6IDB4MDBlYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAwZmU6IDB4MDBlNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUSE9STgorICAgIDB4MDBmZjogMHgwMDk4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAxMzE6IDB4MDBkNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkKKyAgICAweDAxOTI6IDB4MDA5ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIDB4MjAxNzogMHgwMGYyLCAgICAgIyAgRE9VQkxFIExPVyBMSU5FCisgICAgMHgyNTAwOiAweDAwYzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MjUwMjogMHgwMGIzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgyNTBjOiAweDAwZGEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1MTA6IDB4MDBiZiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgyNTE0OiAweDAwYzAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgyNTE4OiAweDAwZDksICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDI1MWM6IDB4MDBjMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1MjQ6IDB4MDBiNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjUyYzogMHgwMGMyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1MzQ6IDB4MDBjMSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzYzogMHgwMGM1LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTUwOiAweDAwY2QsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDI1NTE6IDB4MDBiYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDI1NTQ6IDB4MDBjOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1NTc6IDB4MDBiYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MjU1YTogMHgwMGM4LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDI1NWQ6IDB4MDBiYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDI1NjA6IDB4MDBjYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTYzOiAweDAwYjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTY2OiAweDAwY2IsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1Njk6IDB4MDBjYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NmM6IDB4MDBjZSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1ODA6IDB4MDBkZiwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODQ6IDB4MDBkYywgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODg6IDB4MDBkYiwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDI1OTE6IDB4MDBiMCwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgyNTkyOiAweDAwYjEsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDI1OTM6IDB4MDBiMiwgICAgICMgIERBUksgU0hBREUKKyAgICAweDI1YTA6IDB4MDBmZSwgICAgICMgIEJMQUNLIFNRVUFSRQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTAucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTQ2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1MC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTAucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNTQ2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1MC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTIucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Mi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlkNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTIucHkKQEAgLTAsMCArMSw2OTggQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgZ2VuZXJhdGVkIGZyb20gJ1ZFTkRPUlMvTUlDU0ZUL1BDL0NQODUyLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A4NTInLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgMHgwMDgwOiAweDAwYzcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4MTogMHgwMGZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODI6IDB4MDBlOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwODM6IDB4MDBlMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4NDogMHgwMGU0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODU6IDB4MDE2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA4NjogMHgwMTA3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIDB4MDA4NzogMHgwMGU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDg4OiAweDAxNDIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIDB4MDA4OTogMHgwMGViLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOGE6IDB4MDE1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICAweDAwOGI6IDB4MDE1MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisgICAgMHgwMDhjOiAweDAwZWUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOGQ6IDB4MDE3OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIDB4MDA4ZTogMHgwMGM0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4ZjogMHgwMTA2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgMHgwMDkwOiAweDAwYzksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwOTE6IDB4MDEzOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBBQ1VURQorICAgIDB4MDA5MjogMHgwMTNhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBBQ1VURQorICAgIDB4MDA5MzogMHgwMGY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk0OiAweDAwZjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5NTogMHgwMTNkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENBUk9OCisgICAgMHgwMDk2OiAweDAxM2UsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENBUk9OCisgICAgMHgwMDk3OiAweDAxNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICAweDAwOTg6IDB4MDE1YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICAweDAwOTk6IDB4MDBkNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWE6IDB4MDBkYywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWI6IDB4MDE2NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgIDB4MDA5YzogMHgwMTY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgIDB4MDA5ZDogMHgwMTQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIDB4MDA5ZTogMHgwMGQ3LCAgICAgIyAgTVVMVElQTElDQVRJT04gU0lHTgorICAgIDB4MDA5ZjogMHgwMTBkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIDB4MDBhMDogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBhMTogMHgwMGVkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBhMjogMHgwMGYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBhMzogMHgwMGZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBhNDogMHgwMTA0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIDB4MDBhNTogMHgwMTA1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICAweDAwYTY6IDB4MDE3ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIDB4MDBhNzogMHgwMTdlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIDB4MDBhODogMHgwMTE4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIDB4MDBhOTogMHgwMTE5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICAweDAwYWE6IDB4MDBhYywgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGFiOiAweDAxN2EsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgMHgwMGFjOiAweDAxMGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICAweDAwYWQ6IDB4MDE1ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIDB4MDBhZTogMHgwMGFiLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWY6IDB4MDBiYiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiMDogMHgyNTkxLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDAwYjE6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDBiMjogMHgyNTkzLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MDBiMzogMHgyNTAyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgwMGI0OiAweDI1MjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYjU6IDB4MDBjMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBiNjogMHgwMGMyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwYjc6IDB4MDExYSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDQVJPTgorICAgIDB4MDBiODogMHgwMTVlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICAweDAwYjk6IDB4MjU2MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYmE6IDB4MjU1MSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDAwYmI6IDB4MjU1NywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBiYzogMHgyNTVkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MDBiZDogMHgwMTdiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIDB4MDBiZTogMHgwMTdjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICAweDAwYmY6IDB4MjUxMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgwMGMwOiAweDI1MTQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgwMGMxOiAweDI1MzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzI6IDB4MjUyYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMzOiAweDI1MWMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGM0OiAweDI1MDAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MDBjNTogMHgyNTNjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGM2OiAweDAxMDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUKKyAgICAweDAwYzc6IDB4MDEwMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUKKyAgICAweDAwYzg6IDB4MjU1YSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgwMGM5OiAweDI1NTQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGNhOiAweDI1NjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNiOiAweDI1NjYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2M6IDB4MjU2MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGNkOiAweDI1NTAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDAwY2U6IDB4MjU2YywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2Y6IDB4MDBhNCwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwZDA6IDB4MDExMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggU1RST0tFCisgICAgMHgwMGQxOiAweDAxMTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggU1RST0tFCisgICAgMHgwMGQyOiAweDAxMGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICAweDAwZDM6IDB4MDBjYiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDQ6IDB4MDEwZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICAweDAwZDU6IDB4MDE0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDQVJPTgorICAgIDB4MDBkNjogMHgwMGNkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGQ3OiAweDAwY2UsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBkODogMHgwMTFiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDQVJPTgorICAgIDB4MDBkOTogMHgyNTE4LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgwMGRhOiAweDI1MGMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwZGI6IDB4MjU4OCwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDAwZGM6IDB4MjU4NCwgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDAwZGQ6IDB4MDE2MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDRURJTExBCisgICAgMHgwMGRlOiAweDAxNmUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBkZjogMHgyNTgwLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MDBlMDogMHgwMGQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGUxOiAweDAwZGYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMjogMHgwMGQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZTM6IDB4MDE0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIDB4MDBlNDogMHgwMTQ0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIDB4MDBlNTogMHgwMTQ4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBDQVJPTgorICAgIDB4MDBlNjogMHgwMTYwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgMHgwMGU3OiAweDAxNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgMHgwMGU4OiAweDAxNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQUNVVEUKKyAgICAweDAwZTk6IDB4MDBkYSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBlYTogMHgwMTU1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBBQ1VURQorICAgIDB4MDBlYjogMHgwMTcwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorICAgIDB4MDBlYzogMHgwMGZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIDB4MDBlZDogMHgwMGRkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgMHgwMGVlOiAweDAxNjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENFRElMTEEKKyAgICAweDAwZWY6IDB4MDBiNCwgICAgICMgIEFDVVRFIEFDQ0VOVAorICAgIDB4MDBmMDogMHgwMGFkLCAgICAgIyAgU09GVCBIWVBIRU4KKyAgICAweDAwZjE6IDB4MDJkZCwgICAgICMgIERPVUJMRSBBQ1VURSBBQ0NFTlQKKyAgICAweDAwZjI6IDB4MDJkYiwgICAgICMgIE9HT05FSworICAgIDB4MDBmMzogMHgwMmM3LCAgICAgIyAgQ0FST04KKyAgICAweDAwZjQ6IDB4MDJkOCwgICAgICMgIEJSRVZFCisgICAgMHgwMGY1OiAweDAwYTcsICAgICAjICBTRUNUSU9OIFNJR04KKyAgICAweDAwZjY6IDB4MDBmNywgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAwZjc6IDB4MDBiOCwgICAgICMgIENFRElMTEEKKyAgICAweDAwZjg6IDB4MDBiMCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGY5OiAweDAwYTgsICAgICAjICBESUFFUkVTSVMKKyAgICAweDAwZmE6IDB4MDJkOSwgICAgICMgIERPVCBBQk9WRQorICAgIDB4MDBmYjogMHgwMTcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICAweDAwZmM6IDB4MDE1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgIDB4MDBmZDogMHgwMTU5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgIDB4MDBmZTogMHgyNWEwLCAgICAgIyAgQkxBQ0sgU1FVQVJFCisgICAgMHgwMGZmOiAweDAwYTAsICAgICAjICBOTy1CUkVBSyBTUEFDRQorfSkKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAwMDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDAwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDAwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwMDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDAwMDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDAwMDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDAwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDAwMDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwMDBhIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MDAwYiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwMDBjIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MDAwZCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDAwMGUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwMDBmIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgwMDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDAwMTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgwMDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MDAxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MDAxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgwMDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgwMDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDAwMTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MDAxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDAwMTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MDAxYSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgwMDFiIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MDAxYyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MDAxZCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDAwMWUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MDAxZiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MDAyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MDAyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgwMDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgwMDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgwMDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgwMDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MDAyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDAwMjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MDAyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgwMDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgwMDJhIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgwMDJiIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MDAyYyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MDAyZCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDAwMmUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgwMDJmIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDAwMzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MDAzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDAwMzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgwMDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgwMDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDAwMzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MDAzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDAwMzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDAwMzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDAwMzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4MDAzYSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4MDAzYiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDAwM2MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDAwM2QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDAwM2UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDAwM2YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4MDA0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHgwMDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDAwNDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4MDA0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHgwMDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDAwNDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4MDA0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHgwMDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDAwNDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4MDA0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHgwMDRhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDAwNGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4MDA0YyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHgwMDRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDAwNGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4MDA0ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHgwMDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDAwNTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4MDA1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHgwMDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDAwNTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4MDA1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHgwMDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDAwNTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4MDA1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHgwMDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDAwNWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4MDA1YiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHgwMDVjIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4MDA1ZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4MDA1ZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4MDA1ZiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4MDA2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDAwNjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDAwNjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDAwNjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDAwNjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDAwNjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDAwNjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDAwNjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDAwNjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDAwNjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDAwNmEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDAwNmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDAwNmMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDAwNmQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDAwNmUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDAwNmYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDAwNzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDAwNzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDAwNzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDAwNzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDAwNzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDAwNzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDAwNzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDAwNzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDAwNzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDAwNzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDAwN2EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDAwN2IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHgwMDdjIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDAwN2QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4MDA3ZSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4MDA3ZiAtPiBERUxFVEUKKyAgICB1J1x4YzcnICAgICAjICAweDAwODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZmMnICAgICAjICAweDAwODEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTknICAgICAjICAweDAwODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4MDA4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDAwODQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE2ZicgICAjICAweDAwODUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdcdTAxMDcnICAgIyAgMHgwMDg2IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4ZTcnICAgICAjICAweDAwODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdcdTAxNDInICAgIyAgMHgwMDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdceGViJyAgICAgIyAgMHgwMDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNTAnICAgIyAgMHgwMDhhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x1MDE1MScgICAjICAweDAwOGIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZWUnICAgICAjICAweDAwOGMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxNzknICAgIyAgMHgwMDhkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIHUnXHhjNCcgICAgICMgIDB4MDA4ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMDYnICAgIyAgMHgwMDhmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhjOScgICAgICMgIDB4MDA5MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x1MDEzOScgICAjICAweDAwOTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEFDVVRFCisgICAgdSdcdTAxM2EnICAgIyAgMHgwMDkyIC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQUNVVEUKKyAgICB1J1x4ZjQnICAgICAjICAweDAwOTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHgwMDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxM2QnICAgIyAgMHgwMDk1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDQVJPTgorICAgIHUnXHUwMTNlJyAgICMgIDB4MDA5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENBUk9OCisgICAgdSdcdTAxNWEnICAgIyAgMHgwMDk3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIHUnXHUwMTViJyAgICMgIDB4MDA5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgdSdceGQ2JyAgICAgIyAgMHgwMDk5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGMnICAgICAjICAweDAwOWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTY0JyAgICMgIDB4MDA5YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0FST04KKyAgICB1J1x1MDE2NScgICAjICAweDAwOWMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgIHUnXHUwMTQxJyAgICMgIDB4MDA5ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdceGQ3JyAgICAgIyAgMHgwMDllIC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x1MDEwZCcgICAjICAweDAwOWYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhlMScgICAgICMgIDB4MDBhMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGVkJyAgICAgIyAgMHgwMGExIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZjMnICAgICAjICAweDAwYTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmYScgICAgICMgIDB4MDBhMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdcdTAxMDQnICAgIyAgMHgwMGE0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEwNScgICAjICAweDAwYTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDE3ZCcgICAjICAweDAwYTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTAxN2UnICAgIyAgMHgwMGE3IC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x1MDExOCcgICAjICAweDAwYTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIHUnXHUwMTE5JyAgICMgIDB4MDBhOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIHUnXHhhYycgICAgICMgIDB4MDBhYSAtPiBOT1QgU0lHTgorICAgIHUnXHUwMTdhJyAgICMgIDB4MDBhYiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdcdTAxMGMnICAgIyAgMHgwMGFjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHUwMTVmJyAgICMgIDB4MDBhZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICB1J1x4YWInICAgICAjICAweDAwYWUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweDAwYWYgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTI1OTEnICAgIyAgMHgwMGIwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHgwMGIxIC0+IE1FRElVTSBTSEFERQorICAgIHUnXHUyNTkzJyAgICMgIDB4MDBiMiAtPiBEQVJLIFNIQURFCisgICAgdSdcdTI1MDInICAgIyAgMHgwMGIzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4MDBiNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x4YzEnICAgICAjICAweDAwYjUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHgwMGI2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxMWEnICAgIyAgMHgwMGI3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDQVJPTgorICAgIHUnXHUwMTVlJyAgICMgIDB4MDBiOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIHUnXHUyNTYzJyAgICMgIDB4MDBiOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NTEnICAgIyAgMHgwMGJhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICB1J1x1MjU1NycgICAjICAweDAwYmIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHgwMGJjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x1MDE3YicgICAjICAweDAwYmQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTdjJyAgICMgIDB4MDBiZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUyNTEwJyAgICMgIDB4MDBiZiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4MDBjMCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MzQnICAgIyAgMHgwMGMxIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTJjJyAgICMgIDB4MDBjMiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTFjJyAgICMgIDB4MDBjMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MDAnICAgIyAgMHgwMGM0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgdSdcdTI1M2MnICAgIyAgMHgwMGM1IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUwMTAyJyAgICMgIDB4MDBjNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUKKyAgICB1J1x1MDEwMycgICAjICAweDAwYzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRQorICAgIHUnXHUyNTVhJyAgICMgIDB4MDBjOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTU0JyAgICMgIDB4MDBjOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHgwMGNhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweDAwY2IgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjAnICAgIyAgMHgwMGNjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHgwMGNkIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4MDBjZSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdceGE0JyAgICAgIyAgMHgwMGNmIC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x1MDExMScgICAjICAweDAwZDAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDExMCcgICAjICAweDAwZDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTBlJyAgICMgIDB4MDBkMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICB1J1x4Y2InICAgICAjICAweDAwZDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTBmJyAgICMgIDB4MDBkNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIENBUk9OCisgICAgdSdcdTAxNDcnICAgIyAgMHgwMGQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDQVJPTgorICAgIHUnXHhjZCcgICAgICMgIDB4MDBkNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweDAwZDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDExYicgICAjICAweDAwZDggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDQVJPTgorICAgIHUnXHUyNTE4JyAgICMgIDB4MDBkOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweDAwZGEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHgwMGRiIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweDAwZGMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHUwMTYyJyAgICMgIDB4MDBkZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTZlJyAgICMgIDB4MDBkZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRQorICAgIHUnXHUyNTgwJyAgICMgIDB4MDBkZiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdceGQzJyAgICAgIyAgMHgwMGUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkZicgICAgICMgIDB4MDBlMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhkNCcgICAgICMgIDB4MDBlMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTQzJyAgICMgIDB4MDBlMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQUNVVEUKKyAgICB1J1x1MDE0NCcgICAjICAweDAwZTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIHUnXHUwMTQ4JyAgICMgIDB4MDBlNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENBUk9OCisgICAgdSdcdTAxNjAnICAgIyAgMHgwMGU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUwMTYxJyAgICMgIDB4MDBlNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTAxNTQnICAgIyAgMHgwMGU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBBQ1VURQorICAgIHUnXHhkYScgICAgICMgIDB4MDBlOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x1MDE1NScgICAjICAweDAwZWEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBBQ1VURQorICAgIHUnXHUwMTcwJyAgICMgIDB4MDBlYiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFCisgICAgdSdceGZkJyAgICAgIyAgMHgwMGVjIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZGQnICAgICAjICAweDAwZWQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNjMnICAgIyAgMHgwMGVlIC0+IExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0VESUxMQQorICAgIHUnXHhiNCcgICAgICMgIDB4MDBlZiAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4YWQnICAgICAjICAweDAwZjAgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x1MDJkZCcgICAjICAweDAwZjEgLT4gRE9VQkxFIEFDVVRFIEFDQ0VOVAorICAgIHUnXHUwMmRiJyAgICMgIDB4MDBmMiAtPiBPR09ORUsKKyAgICB1J1x1MDJjNycgICAjICAweDAwZjMgLT4gQ0FST04KKyAgICB1J1x1MDJkOCcgICAjICAweDAwZjQgLT4gQlJFVkUKKyAgICB1J1x4YTcnICAgICAjICAweDAwZjUgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGY3JyAgICAgIyAgMHgwMGY2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x4YjgnICAgICAjICAweDAwZjcgLT4gQ0VESUxMQQorICAgIHUnXHhiMCcgICAgICMgIDB4MDBmOCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhhOCcgICAgICMgIDB4MDBmOSAtPiBESUFFUkVTSVMKKyAgICB1J1x1MDJkOScgICAjICAweDAwZmEgLT4gRE9UIEFCT1ZFCisgICAgdSdcdTAxNzEnICAgIyAgMHgwMGZiIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFCisgICAgdSdcdTAxNTgnICAgIyAgMHgwMGZjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgIHUnXHUwMTU5JyAgICMgIDB4MDBmZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENBUk9OCisgICAgdSdcdTI1YTAnICAgIyAgMHgwMGZlIC0+IEJMQUNLIFNRVUFSRQorICAgIHUnXHhhMCcgICAgICMgIDB4MDBmZiAtPiBOTy1CUkVBSyBTUEFDRQorKQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHsKKyAgICAweDAwMDA6IDB4MDAwMCwgICAgICMgIE5VTEwKKyAgICAweDAwMDE6IDB4MDAwMSwgICAgICMgIFNUQVJUIE9GIEhFQURJTkcKKyAgICAweDAwMDI6IDB4MDAwMiwgICAgICMgIFNUQVJUIE9GIFRFWFQKKyAgICAweDAwMDM6IDB4MDAwMywgICAgICMgIEVORCBPRiBURVhUCisgICAgMHgwMDA0OiAweDAwMDQsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgMHgwMDA1OiAweDAwMDUsICAgICAjICBFTlFVSVJZCisgICAgMHgwMDA2OiAweDAwMDYsICAgICAjICBBQ0tOT1dMRURHRQorICAgIDB4MDAwNzogMHgwMDA3LCAgICAgIyAgQkVMTAorICAgIDB4MDAwODogMHgwMDA4LCAgICAgIyAgQkFDS1NQQUNFCisgICAgMHgwMDA5OiAweDAwMDksICAgICAjICBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICAweDAwMGE6IDB4MDAwYSwgICAgICMgIExJTkUgRkVFRAorICAgIDB4MDAwYjogMHgwMDBiLCAgICAgIyAgVkVSVElDQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYzogMHgwMDBjLCAgICAgIyAgRk9STSBGRUVECisgICAgMHgwMDBkOiAweDAwMGQsICAgICAjICBDQVJSSUFHRSBSRVRVUk4KKyAgICAweDAwMGU6IDB4MDAwZSwgICAgICMgIFNISUZUIE9VVAorICAgIDB4MDAwZjogMHgwMDBmLCAgICAgIyAgU0hJRlQgSU4KKyAgICAweDAwMTA6IDB4MDAxMCwgICAgICMgIERBVEEgTElOSyBFU0NBUEUKKyAgICAweDAwMTE6IDB4MDAxMSwgICAgICMgIERFVklDRSBDT05UUk9MIE9ORQorICAgIDB4MDAxMjogMHgwMDEyLCAgICAgIyAgREVWSUNFIENPTlRST0wgVFdPCisgICAgMHgwMDEzOiAweDAwMTMsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIDB4MDAxNDogMHgwMDE0LCAgICAgIyAgREVWSUNFIENPTlRST0wgRk9VUgorICAgIDB4MDAxNTogMHgwMDE1LCAgICAgIyAgTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICAweDAwMTY6IDB4MDAxNiwgICAgICMgIFNZTkNIUk9OT1VTIElETEUKKyAgICAweDAwMTc6IDB4MDAxNywgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICAweDAwMTg6IDB4MDAxOCwgICAgICMgIENBTkNFTAorICAgIDB4MDAxOTogMHgwMDE5LCAgICAgIyAgRU5EIE9GIE1FRElVTQorICAgIDB4MDAxYTogMHgwMDFhLCAgICAgIyAgU1VCU1RJVFVURQorICAgIDB4MDAxYjogMHgwMDFiLCAgICAgIyAgRVNDQVBFCisgICAgMHgwMDFjOiAweDAwMWMsICAgICAjICBGSUxFIFNFUEFSQVRPUgorICAgIDB4MDAxZDogMHgwMDFkLCAgICAgIyAgR1JPVVAgU0VQQVJBVE9SCisgICAgMHgwMDFlOiAweDAwMWUsICAgICAjICBSRUNPUkQgU0VQQVJBVE9SCisgICAgMHgwMDFmOiAweDAwMWYsICAgICAjICBVTklUIFNFUEFSQVRPUgorICAgIDB4MDAyMDogMHgwMDIwLCAgICAgIyAgU1BBQ0UKKyAgICAweDAwMjE6IDB4MDAyMSwgICAgICMgIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwMjI6IDB4MDAyMiwgICAgICMgIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMDIzOiAweDAwMjMsICAgICAjICBOVU1CRVIgU0lHTgorICAgIDB4MDAyNDogMHgwMDI0LCAgICAgIyAgRE9MTEFSIFNJR04KKyAgICAweDAwMjU6IDB4MDAyNSwgICAgICMgIFBFUkNFTlQgU0lHTgorICAgIDB4MDAyNjogMHgwMDI2LCAgICAgIyAgQU1QRVJTQU5ECisgICAgMHgwMDI3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFCisgICAgMHgwMDI4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTCisgICAgMHgwMDI5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUworICAgIDB4MDAyYTogMHgwMDJhLCAgICAgIyAgQVNURVJJU0sKKyAgICAweDAwMmI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTgorICAgIDB4MDAyYzogMHgwMDJjLCAgICAgIyAgQ09NTUEKKyAgICAweDAwMmQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUworICAgIDB4MDAyZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QCisgICAgMHgwMDJmOiAweDAwMmYsICAgICAjICBTT0xJRFVTCisgICAgMHgwMDMwOiAweDAwMzAsICAgICAjICBESUdJVCBaRVJPCisgICAgMHgwMDMxOiAweDAwMzEsICAgICAjICBESUdJVCBPTkUKKyAgICAweDAwMzI6IDB4MDAzMiwgICAgICMgIERJR0lUIFRXTworICAgIDB4MDAzMzogMHgwMDMzLCAgICAgIyAgRElHSVQgVEhSRUUKKyAgICAweDAwMzQ6IDB4MDAzNCwgICAgICMgIERJR0lUIEZPVVIKKyAgICAweDAwMzU6IDB4MDAzNSwgICAgICMgIERJR0lUIEZJVkUKKyAgICAweDAwMzY6IDB4MDAzNiwgICAgICMgIERJR0lUIFNJWAorICAgIDB4MDAzNzogMHgwMDM3LCAgICAgIyAgRElHSVQgU0VWRU4KKyAgICAweDAwMzg6IDB4MDAzOCwgICAgICMgIERJR0lUIEVJR0hUCisgICAgMHgwMDM5OiAweDAwMzksICAgICAjICBESUdJVCBOSU5FCisgICAgMHgwMDNhOiAweDAwM2EsICAgICAjICBDT0xPTgorICAgIDB4MDAzYjogMHgwMDNiLCAgICAgIyAgU0VNSUNPTE9OCisgICAgMHgwMDNjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTgorICAgIDB4MDAzZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04KKyAgICAweDAwM2U6IDB4MDAzZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOCisgICAgMHgwMDNmOiAweDAwM2YsICAgICAjICBRVUVTVElPTiBNQVJLCisgICAgMHgwMDQwOiAweDAwNDAsICAgICAjICBDT01NRVJDSUFMIEFUCisgICAgMHgwMDQxOiAweDAwNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMDQyOiAweDAwNDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgMHgwMDQzOiAweDAwNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgMHgwMDQ0OiAweDAwNDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgMHgwMDQ1OiAweDAwNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwMDQ2OiAweDAwNDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgMHgwMDQ3OiAweDAwNDcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgMHgwMDQ4OiAweDAwNDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgMHgwMDQ5OiAweDAwNDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMDRhOiAweDAwNGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgMHgwMDRiOiAweDAwNGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgMHgwMDRjOiAweDAwNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgMHgwMDRkOiAweDAwNGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgMHgwMDRlOiAweDAwNGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgMHgwMDRmOiAweDAwNGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDUwOiAweDAwNTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgMHgwMDUxOiAweDAwNTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgMHgwMDUyOiAweDAwNTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgMHgwMDUzOiAweDAwNTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgMHgwMDU0OiAweDAwNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgMHgwMDU1OiAweDAwNTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDU2OiAweDAwNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgMHgwMDU3OiAweDAwNTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgMHgwMDU4OiAweDAwNTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgMHgwMDU5OiAweDAwNTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgMHgwMDVhOiAweDAwNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgMHgwMDViOiAweDAwNWIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVjOiAweDAwNWMsICAgICAjICBSRVZFUlNFIFNPTElEVVMKKyAgICAweDAwNWQ6IDB4MDA1ZCwgICAgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVlOiAweDAwNWUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIDB4MDA1ZjogMHgwMDVmLCAgICAgIyAgTE9XIExJTkUKKyAgICAweDAwNjA6IDB4MDA2MCwgICAgICMgIEdSQVZFIEFDQ0VOVAorICAgIDB4MDA2MTogMHgwMDYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICAweDAwNjI6IDB4MDA2MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgMHgwMDYzOiAweDAwNjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIDB4MDA2NDogMHgwMDY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICAweDAwNjU6IDB4MDA2NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgMHgwMDY2OiAweDAwNjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIDB4MDA2NzogMHgwMDY3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICAweDAwNjg6IDB4MDA2OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBICisgICAgMHgwMDY5OiAweDAwNjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIDB4MDA2YTogMHgwMDZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICAweDAwNmI6IDB4MDA2YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgMHgwMDZjOiAweDAwNmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIDB4MDA2ZDogMHgwMDZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICAweDAwNmU6IDB4MDA2ZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMDZmOiAweDAwNmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIDB4MDA3MDogMHgwMDcwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICAweDAwNzE6IDB4MDA3MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgMHgwMDcyOiAweDAwNzIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIDB4MDA3MzogMHgwMDczLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICAweDAwNzQ6IDB4MDA3NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgMHgwMDc1OiAweDAwNzUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIDB4MDA3NjogMHgwMDc2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICAweDAwNzc6IDB4MDA3NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgMHgwMDc4OiAweDAwNzgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIDB4MDA3OTogMHgwMDc5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICAweDAwN2E6IDB4MDA3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgMHgwMDdiOiAweDAwN2IsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2M6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUKKyAgICAweDAwN2Q6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2U6IDB4MDA3ZSwgICAgICMgIFRJTERFCisgICAgMHgwMDdmOiAweDAwN2YsICAgICAjICBERUxFVEUKKyAgICAweDAwYTA6IDB4MDBmZiwgICAgICMgIE5PLUJSRUFLIFNQQUNFCisgICAgMHgwMGE0OiAweDAwY2YsICAgICAjICBDVVJSRU5DWSBTSUdOCisgICAgMHgwMGE3OiAweDAwZjUsICAgICAjICBTRUNUSU9OIFNJR04KKyAgICAweDAwYTg6IDB4MDBmOSwgICAgICMgIERJQUVSRVNJUworICAgIDB4MDBhYjogMHgwMGFlLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWM6IDB4MDBhYSwgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGFkOiAweDAwZjAsICAgICAjICBTT0ZUIEhZUEhFTgorICAgIDB4MDBiMDogMHgwMGY4LCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwYjQ6IDB4MDBlZiwgICAgICMgIEFDVVRFIEFDQ0VOVAorICAgIDB4MDBiODogMHgwMGY3LCAgICAgIyAgQ0VESUxMQQorICAgIDB4MDBiYjogMHgwMGFmLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGMxOiAweDAwYjUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwYzI6IDB4MDBiNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGM0OiAweDAwOGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGM3OiAweDAwODAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBjOTogMHgwMDkwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGNiOiAweDAwZDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGNkOiAweDAwZDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwY2U6IDB4MDBkNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGQzOiAweDAwZTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZDQ6IDB4MDBlMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGQ2OiAweDAwOTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGQ3OiAweDAwOWUsICAgICAjICBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgMHgwMGRhOiAweDAwZTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwZGM6IDB4MDA5YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZGQ6IDB4MDBlZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIDB4MDBkZjogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTE6IDB4MDBhMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwZTI6IDB4MDA4MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlNDogMHgwMDg0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZTc6IDB4MDA4NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBlOTogMHgwMDgyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDBlYjogMHgwMDg5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZWQ6IDB4MDBhMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwZWU6IDB4MDA4YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBmMzogMHgwMGEyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBmNDogMHgwMDkzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGY2OiAweDAwOTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmNzogMHgwMGY2LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmYTogMHgwMGEzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBmYzogMHgwMDgxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZmQ6IDB4MDBlYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAxMDI6IDB4MDBjNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRQorICAgIDB4MDEwMzogMHgwMGM3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRQorICAgIDB4MDEwNDogMHgwMGE0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIDB4MDEwNTogMHgwMGE1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICAweDAxMDY6IDB4MDA4ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIDB4MDEwNzogMHgwMDg2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIDB4MDEwYzogMHgwMGFjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgMHgwMTBkOiAweDAwOWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgMHgwMTBlOiAweDAwZDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICAweDAxMGY6IDB4MDBkNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICAweDAxMTA6IDB4MDBkMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICAweDAxMTE6IDB4MDBkMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggU1RST0tFCisgICAgMHgwMTE4OiAweDAwYTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgMHgwMTE5OiAweDAwYTksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIDB4MDExYTogMHgwMGI3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgMHgwMTFiOiAweDAwZDgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgMHgwMTM5OiAweDAwOTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQUNVVEUKKyAgICAweDAxM2E6IDB4MDA5MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQUNVVEUKKyAgICAweDAxM2Q6IDB4MDA5NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDQVJPTgorICAgIDB4MDEzZTogMHgwMDk2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDQVJPTgorICAgIDB4MDE0MTogMHgwMDlkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIDB4MDE0MjogMHgwMDg4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICAweDAxNDM6IDB4MDBlMywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIDB4MDE0NDogMHgwMGU0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIDB4MDE0NzogMHgwMGQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENBUk9OCisgICAgMHgwMTQ4OiAweDAwZTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENBUk9OCisgICAgMHgwMTUwOiAweDAwOGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisgICAgMHgwMTUxOiAweDAwOGIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURQorICAgIDB4MDE1NDogMHgwMGU4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIEFDVVRFCisgICAgMHgwMTU1OiAweDAwZWEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIEFDVVRFCisgICAgMHgwMTU4OiAweDAwZmMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0FST04KKyAgICAweDAxNTk6IDB4MDBmZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0FST04KKyAgICAweDAxNWE6IDB4MDA5NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIDB4MDE1YjogMHgwMDk4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIDB4MDE1ZTogMHgwMGI4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICAweDAxNWY6IDB4MDBhZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIDB4MDE2MDogMHgwMGU2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgMHgwMTYxOiAweDAwZTcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgMHgwMTYyOiAweDAwZGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0VESUxMQQorICAgIDB4MDE2MzogMHgwMGVlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDRURJTExBCisgICAgMHgwMTY0OiAweDAwOWIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0FST04KKyAgICAweDAxNjU6IDB4MDA5YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0FST04KKyAgICAweDAxNmU6IDB4MDBkZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMTZmOiAweDAwODUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAxNzA6IDB4MDBlYiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICAweDAxNzE6IDB4MDBmYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFCisgICAgMHgwMTc5OiAweDAwOGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICAweDAxN2E6IDB4MDBhYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICAweDAxN2I6IDB4MDBiZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICAweDAxN2M6IDB4MDBiZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgMHgwMTdkOiAweDAwYTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICAweDAxN2U6IDB4MDBhNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICAweDAyYzc6IDB4MDBmMywgICAgICMgIENBUk9OCisgICAgMHgwMmQ4OiAweDAwZjQsICAgICAjICBCUkVWRQorICAgIDB4MDJkOTogMHgwMGZhLCAgICAgIyAgRE9UIEFCT1ZFCisgICAgMHgwMmRiOiAweDAwZjIsICAgICAjICBPR09ORUsKKyAgICAweDAyZGQ6IDB4MDBmMSwgICAgICMgIERPVUJMRSBBQ1VURSBBQ0NFTlQKKyAgICAweDI1MDA6IDB4MDBjNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwYjMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDI1MGM6IDB4MDBkYSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMGJmLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDBjMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDI1MTg6IDB4MDBkOSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMGMzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMGI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTJjOiAweDAwYzIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMGMxLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwYzUsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NTA6IDB4MDBjZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MjU1MTogMHgwMGJhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MjU1NDogMHgwMGM5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MjU1NzogMHgwMGJiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgyNTVhOiAweDAwYzgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MjU1ZDogMHgwMGJjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MjU2MDogMHgwMGNjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1NjM6IDB4MDBiOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1NjY6IDB4MDBjYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2OTogMHgwMGNhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2YzogMHgwMGNlLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU4MDogMHgwMGRmLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MjU4NDogMHgwMGRjLCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MjU4ODogMHgwMGRiLCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MjU5MTogMHgwMGIwLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDI1OTI6IDB4MDBiMSwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MjU5MzogMHgwMGIyLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MjVhMDogMHgwMGZlLCAgICAgIyAgQkxBQ0sgU1FVQVJFCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Mi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Mi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzNzAxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODUyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Mi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Mi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzNzAxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODUyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1NS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MWVmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1NS5weQpAQCAtMCwwICsxLDY5OCBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBnZW5lcmF0ZWQgZnJvbSAnVkVORE9SUy9NSUNTRlQvUEMvQ1A4NTUuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDg1NScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCitkZWNvZGluZ19tYXAudXBkYXRlKHsKKyAgICAweDAwODA6IDB4MDQ1MiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBESkUKKyAgICAweDAwODE6IDB4MDQwMiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIERKRQorICAgIDB4MDA4MjogMHgwNDUzLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdKRQorICAgIDB4MDA4MzogMHgwNDAzLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0pFCisgICAgMHgwMDg0OiAweDA0NTEsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSU8KKyAgICAweDAwODU6IDB4MDQwMSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisgICAgMHgwMDg2OiAweDA0NTQsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgMHgwMDg3OiAweDA0MDQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVS1JBSU5JQU4gSUUKKyAgICAweDAwODg6IDB4MDQ1NSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBEWkUKKyAgICAweDAwODk6IDB4MDQwNSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIERaRQorICAgIDB4MDA4YTogMHgwNDU2LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIDB4MDA4YjogMHgwNDA2LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJCisgICAgMHgwMDhjOiAweDA0NTcsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUkKKyAgICAweDAwOGQ6IDB4MDQwNywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlJCisgICAgMHgwMDhlOiAweDA0NTgsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSkUKKyAgICAweDAwOGY6IDB4MDQwOCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEpFCisgICAgMHgwMDkwOiAweDA0NTksICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgTEpFCisgICAgMHgwMDkxOiAweDA0MDksICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBMSkUKKyAgICAweDAwOTI6IDB4MDQ1YSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBOSkUKKyAgICAweDAwOTM6IDB4MDQwYSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIE5KRQorICAgIDB4MDA5NDogMHgwNDViLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTSEUKKyAgICAweDAwOTU6IDB4MDQwYiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTSEUKKyAgICAweDAwOTY6IDB4MDQ1YywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBLSkUKKyAgICAweDAwOTc6IDB4MDQwYywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtKRQorICAgIDB4MDA5ODogMHgwNDVlLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIFUKKyAgICAweDAwOTk6IDB4MDQwZSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIFUKKyAgICAweDAwOWE6IDB4MDQ1ZiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBEWkhFCisgICAgMHgwMDliOiAweDA0MGYsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkhFCisgICAgMHgwMDljOiAweDA0NGUsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUKKyAgICAweDAwOWQ6IDB4MDQyZSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlVCisgICAgMHgwMDllOiAweDA0NGEsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEFSRCBTSUdOCisgICAgMHgwMDlmOiAweDA0MmEsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04KKyAgICAweDAwYTA6IDB4MDQzMCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBBCisgICAgMHgwMGExOiAweDA0MTAsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMGEyOiAweDA0MzEsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQkUKKyAgICAweDAwYTM6IDB4MDQxMSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEJFCisgICAgMHgwMGE0OiAweDA0NDYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFCisgICAgMHgwMGE1OiAweDA0MjYsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0UKKyAgICAweDAwYTY6IDB4MDQzNCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBERQorICAgIDB4MDBhNzogMHgwNDE0LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUKKyAgICAweDAwYTg6IDB4MDQzNSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBJRQorICAgIDB4MDBhOTogMHgwNDE1LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUKKyAgICAweDAwYWE6IDB4MDQ0NCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorICAgIDB4MDBhYjogMHgwNDI0LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUYKKyAgICAweDAwYWM6IDB4MDQzMywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUKKyAgICAweDAwYWQ6IDB4MDQxMywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRQorICAgIDB4MDBhZTogMHgwMGFiLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWY6IDB4MDBiYiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiMDogMHgyNTkxLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDAwYjE6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDBiMjogMHgyNTkzLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MDBiMzogMHgyNTAyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgwMGI0OiAweDI1MjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYjU6IDB4MDQ0NSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBIQQorICAgIDB4MDBiNjogMHgwNDI1LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEEKKyAgICAweDAwYjc6IDB4MDQzOCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMGI4OiAweDA0MTgsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMGI5OiAweDI1NjMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGJhOiAweDI1NTEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgwMGJiOiAweDI1NTcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDAwYmM6IDB4MjU1ZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDAwYmQ6IDB4MDQzOSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBJCisgICAgMHgwMGJlOiAweDA0MTksICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBJCisgICAgMHgwMGJmOiAweDI1MTAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBjMDogMHgyNTE0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MDBjMTogMHgyNTM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMyOiAweDI1MmMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMzogMHgyNTFjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjNDogMHgyNTAwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDAwYzU6IDB4MjUzYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjNjogMHgwNDNhLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBCisgICAgMHgwMGM3OiAweDA0MWEsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQQorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgwMGE0LCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBkMDogMHgwNDNiLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMCisgICAgMHgwMGQxOiAweDA0MWIsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTAorICAgIDB4MDBkMjogMHgwNDNjLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVNCisgICAgMHgwMGQzOiAweDA0MWMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTQorICAgIDB4MDBkNDogMHgwNDNkLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOCisgICAgMHgwMGQ1OiAweDA0MWQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTgorICAgIDB4MDBkNjogMHgwNDNlLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8KKyAgICAweDAwZDc6IDB4MDQxZSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwZDg6IDB4MDQzZiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBQRQorICAgIDB4MDBkOTogMHgyNTE4LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgwMGRhOiAweDI1MGMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwZGI6IDB4MjU4OCwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDAwZGM6IDB4MjU4NCwgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDAwZGQ6IDB4MDQxZiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisgICAgMHgwMGRlOiAweDA0NGYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUEKKyAgICAweDAwZGY6IDB4MjU4MCwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDAwZTA6IDB4MDQyZiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisgICAgMHgwMGUxOiAweDA0NDAsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVIKKyAgICAweDAwZTI6IDB4MDQyMCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVSCisgICAgMHgwMGUzOiAweDA0NDEsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKyAgICAweDAwZTQ6IDB4MDQyMSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTCisgICAgMHgwMGU1OiAweDA0NDIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVEUKKyAgICAweDAwZTY6IDB4MDQyMiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisgICAgMHgwMGU3OiAweDA0NDMsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVQorICAgIDB4MDBlODogMHgwNDIzLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDBlOTogMHgwNDM2LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorICAgIDB4MDBlYTogMHgwNDE2LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFCisgICAgMHgwMGViOiAweDA0MzIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVkUKKyAgICAweDAwZWM6IDB4MDQxMiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFZFCisgICAgMHgwMGVkOiAweDA0NGMsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisgICAgMHgwMGVlOiAweDA0MmMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTT0ZUIFNJR04KKyAgICAweDAwZWY6IDB4MjExNiwgICAgICMgIE5VTUVSTyBTSUdOCisgICAgMHgwMGYwOiAweDAwYWQsICAgICAjICBTT0ZUIEhZUEhFTgorICAgIDB4MDBmMTogMHgwNDRiLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlFUlUKKyAgICAweDAwZjI6IDB4MDQyYiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlFUlUKKyAgICAweDAwZjM6IDB4MDQzNywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBaRQorICAgIDB4MDBmNDogMHgwNDE3LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkUKKyAgICAweDAwZjU6IDB4MDQ0OCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBTSEEKKyAgICAweDAwZjY6IDB4MDQyOCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQQorICAgIDB4MDBmNzogMHgwNDRkLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEUKKyAgICAweDAwZjg6IDB4MDQyZCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwZjk6IDB4MDQ0OSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBTSENIQQorICAgIDB4MDBmYTogMHgwNDI5LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hDSEEKKyAgICAweDAwZmI6IDB4MDQ0NywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBDSEUKKyAgICAweDAwZmM6IDB4MDQyNywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIENIRQorICAgIDB4MDBmZDogMHgwMGE3LCAgICAgIyAgU0VDVElPTiBTSUdOCisgICAgMHgwMGZlOiAweDI1YTAsICAgICAjICBCTEFDSyBTUVVBUkUKKyAgICAweDAwZmY6IDB4MDBhMCwgICAgICMgIE5PLUJSRUFLIFNQQUNFCit9KQorCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAwMDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDAwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwMDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDAwMDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDAwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDAwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwMDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDAwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDAwMGEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwMDBiIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDAwMGMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwMDBkIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MDAwZSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDAwMGYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDAwMTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MDAxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDAwMTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgwMDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgwMDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDAwMTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDAwMTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MDAxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgwMDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MDAxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgwMDFhIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDAwMWIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgwMDFjIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgwMDFkIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MDAxZSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgwMDFmIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgwMDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgwMDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDAwMjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDAwMjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDAwMjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDAwMjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgwMDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MDAyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgwMDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDAwMjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDAwMmEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDAwMmIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgwMDJjIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgwMDJkIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MDAyZSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDAwMmYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MDAzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgwMDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MDAzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDAwMzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDAwMzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MDAzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgwMDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MDAzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MDAzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MDAzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgwMDNhIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgwMDNiIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4MDAzYyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4MDAzZCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4MDAzZSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4MDAzZiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHgwMDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDAwNDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4MDA0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHgwMDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDAwNDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4MDA0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHgwMDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDAwNDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4MDA0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHgwMDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDAwNGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4MDA0YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHgwMDRjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDAwNGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4MDA0ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHgwMDRmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDAwNTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4MDA1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHgwMDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDAwNTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4MDA1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHgwMDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDAwNTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4MDA1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHgwMDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDAwNTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4MDA1YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHgwMDViIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDAwNWMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHgwMDVkIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHgwMDVlIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHgwMDVmIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHgwMDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4MDA2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4MDA2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4MDA2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4MDA2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4MDA2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4MDA2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4MDA2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4MDA2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4MDA2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4MDA2YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4MDA2YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4MDA2YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4MDA2ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4MDA2ZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4MDA2ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4MDA3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4MDA3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4MDA3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4MDA3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4MDA3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4MDA3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4MDA3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4MDA3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4MDA3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4MDA3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4MDA3YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4MDA3YiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDAwN2MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4MDA3ZCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHgwMDdlIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHgwMDdmIC0+IERFTEVURQorICAgIHUnXHUwNDUyJyAgICMgIDB4MDA4MCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgREpFCisgICAgdSdcdTA0MDInICAgIyAgMHgwMDgxIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERKRQorICAgIHUnXHUwNDUzJyAgICMgIDB4MDA4MiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0pFCisgICAgdSdcdTA0MDMnICAgIyAgMHgwMDgzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEdKRQorICAgIHUnXHUwNDUxJyAgICMgIDB4MDA4NCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSU8KKyAgICB1J1x1MDQwMScgICAjICAweDAwODUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8KKyAgICB1J1x1MDQ1NCcgICAjICAweDAwODYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIHUnXHUwNDA0JyAgICMgIDB4MDA4NyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVS1JBSU5JQU4gSUUKKyAgICB1J1x1MDQ1NScgICAjICAweDAwODggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERaRQorICAgIHUnXHUwNDA1JyAgICMgIDB4MDA4OSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkUKKyAgICB1J1x1MDQ1NicgICAjICAweDAwOGEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIHUnXHUwNDA2JyAgICMgIDB4MDA4YiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEkKKyAgICB1J1x1MDQ1NycgICAjICAweDAwOGMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlJCisgICAgdSdcdTA0MDcnICAgIyAgMHgwMDhkIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlJCisgICAgdSdcdTA0NTgnICAgIyAgMHgwMDhlIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBKRQorICAgIHUnXHUwNDA4JyAgICMgIDB4MDA4ZiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBKRQorICAgIHUnXHUwNDU5JyAgICMgIDB4MDA5MCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgTEpFCisgICAgdSdcdTA0MDknICAgIyAgMHgwMDkxIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIExKRQorICAgIHUnXHUwNDVhJyAgICMgIDB4MDA5MiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgTkpFCisgICAgdSdcdTA0MGEnICAgIyAgMHgwMDkzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIE5KRQorICAgIHUnXHUwNDViJyAgICMgIDB4MDA5NCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNIRQorICAgIHUnXHUwNDBiJyAgICMgIDB4MDA5NSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0hFCisgICAgdSdcdTA0NWMnICAgIyAgMHgwMDk2IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBLSkUKKyAgICB1J1x1MDQwYycgICAjICAweDAwOTcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0pFCisgICAgdSdcdTA0NWUnICAgIyAgMHgwMDk4IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBVCisgICAgdSdcdTA0MGUnICAgIyAgMHgwMDk5IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIFUKKyAgICB1J1x1MDQ1ZicgICAjICAweDAwOWEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERaSEUKKyAgICB1J1x1MDQwZicgICAjICAweDAwOWIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRFpIRQorICAgIHUnXHUwNDRlJyAgICMgIDB4MDA5YyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUKKyAgICB1J1x1MDQyZScgICAjICAweDAwOWQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUKKyAgICB1J1x1MDQ0YScgICAjICAweDAwOWUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBUkQgU0lHTgorICAgIHUnXHUwNDJhJyAgICMgIDB4MDA5ZiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04KKyAgICB1J1x1MDQzMCcgICAjICAweDAwYTAgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKyAgICB1J1x1MDQxMCcgICAjICAweDAwYTEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnXHUwNDMxJyAgICMgIDB4MDBhMiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQkUKKyAgICB1J1x1MDQxMScgICAjICAweDAwYTMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKyAgICB1J1x1MDQ0NicgICAjICAweDAwYTQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRQorICAgIHUnXHUwNDI2JyAgICMgIDB4MDBhNSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0UKKyAgICB1J1x1MDQzNCcgICAjICAweDAwYTYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERFCisgICAgdSdcdTA0MTQnICAgIyAgMHgwMGE3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERFCisgICAgdSdcdTA0MzUnICAgIyAgMHgwMGE4IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJRQorICAgIHUnXHUwNDE1JyAgICMgIDB4MDBhOSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJRQorICAgIHUnXHUwNDQ0JyAgICMgIDB4MDBhYSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUYKKyAgICB1J1x1MDQyNCcgICAjICAweDAwYWIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUYKKyAgICB1J1x1MDQzMycgICAjICAweDAwYWMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRQorICAgIHUnXHUwNDEzJyAgICMgIDB4MDBhZCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUKKyAgICB1J1x4YWInICAgICAjICAweDAwYWUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweDAwYWYgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTI1OTEnICAgIyAgMHgwMGIwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHgwMGIxIC0+IE1FRElVTSBTSEFERQorICAgIHUnXHUyNTkzJyAgICMgIDB4MDBiMiAtPiBEQVJLIFNIQURFCisgICAgdSdcdTI1MDInICAgIyAgMHgwMGIzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4MDBiNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MDQ0NScgICAjICAweDAwYjUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisgICAgdSdcdTA0MjUnICAgIyAgMHgwMGI2IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBCisgICAgdSdcdTA0MzgnICAgIyAgMHgwMGI3IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJCisgICAgdSdcdTA0MTgnICAgIyAgMHgwMGI4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J1x1MjU2MycgICAjICAweDAwYjkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTUxJyAgICMgIDB4MDBiYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTcnICAgIyAgMHgwMGJiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTVkJyAgICMgIDB4MDBiYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdcdTA0MzknICAgIyAgMHgwMGJkIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBJCisgICAgdSdcdTA0MTknICAgIyAgMHgwMGJlIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkKKyAgICB1J1x1MjUxMCcgICAjICAweDAwYmYgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjUxNCcgICAjICAweDAwYzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4MDBjMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweDAwYzIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUxYycgICAjICAweDAwYzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4MDBjNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4MDBjNSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MDQzYScgICAjICAweDAwYzYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBCisgICAgdSdcdTA0MWEnICAgIyAgMHgwMGM3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBCisgICAgdSdcdTI1NWEnICAgIyAgMHgwMGM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHgwMGM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweDAwY2EgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY2JyAgICMgIDB4MDBjYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweDAwY2MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweDAwY2QgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NmMnICAgIyAgMHgwMGNlIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x4YTQnICAgICAjICAweDAwY2YgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHUwNDNiJyAgICMgIDB4MDBkMCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUwKKyAgICB1J1x1MDQxYicgICAjICAweDAwZDEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUwKKyAgICB1J1x1MDQzYycgICAjICAweDAwZDIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVNCisgICAgdSdcdTA0MWMnICAgIyAgMHgwMGQzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVNCisgICAgdSdcdTA0M2QnICAgIyAgMHgwMGQ0IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTgorICAgIHUnXHUwNDFkJyAgICMgIDB4MDBkNSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTgorICAgIHUnXHUwNDNlJyAgICMgIDB4MDBkNiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgTworICAgIHUnXHUwNDFlJyAgICMgIDB4MDBkNyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdcdTA0M2YnICAgIyAgMHgwMGQ4IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBQRQorICAgIHUnXHUyNTE4JyAgICMgIDB4MDBkOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweDAwZGEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHgwMGRiIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweDAwZGMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHUwNDFmJyAgICMgIDB4MDBkZCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBQRQorICAgIHUnXHUwNDRmJyAgICMgIDB4MDBkZSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUEKKyAgICB1J1x1MjU4MCcgICAjICAweDAwZGYgLT4gVVBQRVIgSEFMRiBCTE9DSworICAgIHUnXHUwNDJmJyAgICMgIDB4MDBlMCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZQQorICAgIHUnXHUwNDQwJyAgICMgIDB4MDBlMSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVIKKyAgICB1J1x1MDQyMCcgICAjICAweDAwZTIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKyAgICB1J1x1MDQ0MScgICAjICAweDAwZTMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVTCisgICAgdSdcdTA0MjEnICAgIyAgMHgwMGU0IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTCisgICAgdSdcdTA0NDInICAgIyAgMHgwMGU1IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBURQorICAgIHUnXHUwNDIyJyAgICMgIDB4MDBlNiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBURQorICAgIHUnXHUwNDQzJyAgICMgIDB4MDBlNyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVQorICAgIHUnXHUwNDIzJyAgICMgIDB4MDBlOCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdcdTA0MzYnICAgIyAgMHgwMGU5IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBaSEUKKyAgICB1J1x1MDQxNicgICAjICAweDAwZWEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFCisgICAgdSdcdTA0MzInICAgIyAgMHgwMGViIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBWRQorICAgIHUnXHUwNDEyJyAgICMgIDB4MDBlYyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRQorICAgIHUnXHUwNDRjJyAgICMgIDB4MDBlZCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTA0MmMnICAgIyAgMHgwMGVlIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTgorICAgIHUnXHUyMTE2JyAgICMgIDB4MDBlZiAtPiBOVU1FUk8gU0lHTgorICAgIHUnXHhhZCcgICAgICMgIDB4MDBmMCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHUwNDRiJyAgICMgIDB4MDBmMSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUVSVQorICAgIHUnXHUwNDJiJyAgICMgIDB4MDBmMiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZRVJVCisgICAgdSdcdTA0MzcnICAgIyAgMHgwMGYzIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBaRQorICAgIHUnXHUwNDE3JyAgICMgIDB4MDBmNCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRQorICAgIHUnXHUwNDQ4JyAgICMgIDB4MDBmNSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBCisgICAgdSdcdTA0MjgnICAgIyAgMHgwMGY2IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQQorICAgIHUnXHUwNDRkJyAgICMgIDB4MDBmNyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorICAgIHUnXHUwNDJkJyAgICMgIDB4MDBmOCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdcdTA0NDknICAgIyAgMHgwMGY5IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSENIQQorICAgIHUnXHUwNDI5JyAgICMgIDB4MDBmYSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQQorICAgIHUnXHUwNDQ3JyAgICMgIDB4MDBmYiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFCisgICAgdSdcdTA0MjcnICAgIyAgMHgwMGZjIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIENIRQorICAgIHUnXHhhNycgICAgICMgIDB4MDBmZCAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHgwMGZmIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQKKyAgICAweDAwMjc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUKKyAgICAweDAwMjg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMKKyAgICAweDAwMjk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSworICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOCisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQQorICAgIDB4MDAyZDogMHgwMDJkLCAgICAgIyAgSFlQSEVOLU1JTlVTCisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OCisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04KKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOCisgICAgMHgwMDNkOiAweDAwM2QsICAgICAjICBFUVVBTFMgU0lHTgorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04KKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUksKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUworICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5UCisgICAgMHgwMDVmOiAweDAwNWYsICAgICAjICBMT1cgTElORQorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3YzogMHgwMDdjLCAgICAgIyAgVkVSVElDQUwgTElORQorICAgIDB4MDA3ZDogMHgwMDdkLCAgICAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3ZTogMHgwMDdlLCAgICAgIyAgVElMREUKKyAgICAweDAwN2Y6IDB4MDA3ZiwgICAgICMgIERFTEVURQorICAgIDB4MDBhMDogMHgwMGZmLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKKyAgICAweDAwYTQ6IDB4MDBjZiwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwYTc6IDB4MDBmZCwgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBhYjogMHgwMGFlLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWQ6IDB4MDBmMCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGJiOiAweDAwYWYsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDA0MDE6IDB4MDA4NSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisgICAgMHgwNDAyOiAweDAwODEsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBESkUKKyAgICAweDA0MDM6IDB4MDA4MywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEdKRQorICAgIDB4MDQwNDogMHgwMDg3LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgMHgwNDA1OiAweDAwODksICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkUKKyAgICAweDA0MDY6IDB4MDA4YiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIDB4MDQwNzogMHgwMDhkLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUkKKyAgICAweDA0MDg6IDB4MDA4ZiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEpFCisgICAgMHgwNDA5OiAweDAwOTEsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBMSkUKKyAgICAweDA0MGE6IDB4MDA5MywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIE5KRQorICAgIDB4MDQwYjogMHgwMDk1LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNIRQorICAgIDB4MDQwYzogMHgwMDk3LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0pFCisgICAgMHgwNDBlOiAweDAwOTksICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBVCisgICAgMHgwNDBmOiAweDAwOWIsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkhFCisgICAgMHgwNDEwOiAweDAwYTEsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwNDExOiAweDAwYTMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCRQorICAgIDB4MDQxMjogMHgwMGVjLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVkUKKyAgICAweDA0MTM6IDB4MDBhZCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRQorICAgIDB4MDQxNDogMHgwMGE3LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUKKyAgICAweDA0MTU6IDB4MDBhOSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIElFCisgICAgMHgwNDE2OiAweDAwZWEsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaSEUKKyAgICAweDA0MTc6IDB4MDBmNCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFpFCisgICAgMHgwNDE4OiAweDAwYjgsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwNDE5OiAweDAwYmUsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBJCisgICAgMHgwNDFhOiAweDAwYzcsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQQorICAgIDB4MDQxYjogMHgwMGQxLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUwKKyAgICAweDA0MWM6IDB4MDBkMywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVNCisgICAgMHgwNDFkOiAweDAwZDUsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTgorICAgIDB4MDQxZTogMHgwMGQ3LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTworICAgIDB4MDQxZjogMHgwMGRkLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgUEUKKyAgICAweDA0MjA6IDB4MDBlMiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVSCisgICAgMHgwNDIxOiAweDAwZTQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUworICAgIDB4MDQyMjogMHgwMGU2LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVEUKKyAgICAweDA0MjM6IDB4MDBlOCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDA0MjQ6IDB4MDBhYiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVGCisgICAgMHgwNDI1OiAweDAwYjYsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQQorICAgIDB4MDQyNjogMHgwMGE1LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNFCisgICAgMHgwNDI3OiAweDAwZmMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUKKyAgICAweDA0Mjg6IDB4MDBmNiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQQorICAgIDB4MDQyOTogMHgwMGZhLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hDSEEKKyAgICAweDA0MmE6IDB4MDA5ZiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBUkQgU0lHTgorICAgIDB4MDQyYjogMHgwMGYyLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSVQorICAgIDB4MDQyYzogMHgwMGVlLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU09GVCBTSUdOCisgICAgMHgwNDJkOiAweDAwZjgsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwNDJlOiAweDAwOWQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZVQorICAgIDB4MDQyZjogMHgwMGUwLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUEKKyAgICAweDA0MzA6IDB4MDBhMCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBBCisgICAgMHgwNDMxOiAweDAwYTIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQkUKKyAgICAweDA0MzI6IDB4MDBlYiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBWRQorICAgIDB4MDQzMzogMHgwMGFjLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRQorICAgIDB4MDQzNDogMHgwMGE2LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERFCisgICAgMHgwNDM1OiAweDAwYTgsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSUUKKyAgICAweDA0MzY6IDB4MDBlOSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBaSEUKKyAgICAweDA0Mzc6IDB4MDBmMywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBaRQorICAgIDB4MDQzODogMHgwMGI3LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkKKyAgICAweDA0Mzk6IDB4MDBiZCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBJCisgICAgMHgwNDNhOiAweDAwYzYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0EKKyAgICAweDA0M2I6IDB4MDBkMCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTAorICAgIDB4MDQzYzogMHgwMGQyLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVNCisgICAgMHgwNDNkOiAweDAwZDQsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU4KKyAgICAweDA0M2U6IDB4MDBkNiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBPCisgICAgMHgwNDNmOiAweDAwZDgsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgUEUKKyAgICAweDA0NDA6IDB4MDBlMSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFUgorICAgIDB4MDQ0MTogMHgwMGUzLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVTCisgICAgMHgwNDQyOiAweDAwZTUsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVEUKKyAgICAweDA0NDM6IDB4MDBlNywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBVCisgICAgMHgwNDQ0OiAweDAwYWEsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUYKKyAgICAweDA0NDU6IDB4MDBiNSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBIQQorICAgIDB4MDQ0NjogMHgwMGE0LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRQorICAgIDB4MDQ0NzogMHgwMGZiLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRQorICAgIDB4MDQ0ODogMHgwMGY1LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQQorICAgIDB4MDQ0OTogMHgwMGY5LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisgICAgMHgwNDRhOiAweDAwOWUsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEFSRCBTSUdOCisgICAgMHgwNDRiOiAweDAwZjEsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUVSVQorICAgIDB4MDQ0YzogMHgwMGVkLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNPRlQgU0lHTgorICAgIDB4MDQ0ZDogMHgwMGY3LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEUKKyAgICAweDA0NGU6IDB4MDA5YywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZVQorICAgIDB4MDQ0ZjogMHgwMGRlLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCisgICAgMHgwNDUxOiAweDAwODQsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSU8KKyAgICAweDA0NTI6IDB4MDA4MCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBESkUKKyAgICAweDA0NTM6IDB4MDA4MiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBHSkUKKyAgICAweDA0NTQ6IDB4MDA4NiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBVS1JBSU5JQU4gSUUKKyAgICAweDA0NTU6IDB4MDA4OCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBEWkUKKyAgICAweDA0NTY6IDB4MDA4YSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEkKKyAgICAweDA0NTc6IDB4MDA4YywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZSQorICAgIDB4MDQ1ODogMHgwMDhlLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEpFCisgICAgMHgwNDU5OiAweDAwOTAsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgTEpFCisgICAgMHgwNDVhOiAweDAwOTIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgTkpFCisgICAgMHgwNDViOiAweDAwOTQsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNIRQorICAgIDB4MDQ1YzogMHgwMDk2LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtKRQorICAgIDB4MDQ1ZTogMHgwMDk4LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIFUKKyAgICAweDA0NWY6IDB4MDA5YSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBEWkhFCisgICAgMHgyMTE2OiAweDAwZWYsICAgICAjICBOVU1FUk8gU0lHTgorICAgIDB4MjUwMDogMHgwMGM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDI1MDI6IDB4MDBiMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MjUwYzogMHgwMGRhLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTEwOiAweDAwYmYsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MjUxNDogMHgwMGMwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MjUxODogMHgwMGQ5LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgyNTFjOiAweDAwYzMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTI0OiAweDAwYjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1MmM6IDB4MDBjMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTM0OiAweDAwYzEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1M2M6IDB4MDBjNSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU1MDogMHgwMGNkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgyNTUxOiAweDAwYmEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgyNTU0OiAweDAwYzksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTU3OiAweDAwYmIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDI1NWE6IDB4MDBjOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgyNTVkOiAweDAwYmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgyNTYwOiAweDAwY2MsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjU2MzogMHgwMGI5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjU2NjogMHgwMGNiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTY5OiAweDAwY2EsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTZjOiAweDAwY2UsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTgwOiAweDAwZGYsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg0OiAweDAwZGMsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg4OiAweDAwZGIsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgyNTkxOiAweDAwYjAsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MjU5MjogMHgwMGIxLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgyNTkzOiAweDAwYjIsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgyNWEwOiAweDAwZmUsICAgICAjICBCTEFDSyBTUVVBUkUKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU1LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU1LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjMxYWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU1LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU1LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjMxYWE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU2LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzYzJjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU2LnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwODU2IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL01JU0MvQ1A4NTYuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A4NTYnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHUwNWQwJyAgICMgIDB4ODAgLT4gSEVCUkVXIExFVFRFUiBBTEVGCisgICAgdSdcdTA1ZDEnICAgIyAgMHg4MSAtPiBIRUJSRVcgTEVUVEVSIEJFVAorICAgIHUnXHUwNWQyJyAgICMgIDB4ODIgLT4gSEVCUkVXIExFVFRFUiBHSU1FTAorICAgIHUnXHUwNWQzJyAgICMgIDB4ODMgLT4gSEVCUkVXIExFVFRFUiBEQUxFVAorICAgIHUnXHUwNWQ0JyAgICMgIDB4ODQgLT4gSEVCUkVXIExFVFRFUiBIRQorICAgIHUnXHUwNWQ1JyAgICMgIDB4ODUgLT4gSEVCUkVXIExFVFRFUiBWQVYKKyAgICB1J1x1MDVkNicgICAjICAweDg2IC0+IEhFQlJFVyBMRVRURVIgWkFZSU4KKyAgICB1J1x1MDVkNycgICAjICAweDg3IC0+IEhFQlJFVyBMRVRURVIgSEVUCisgICAgdSdcdTA1ZDgnICAgIyAgMHg4OCAtPiBIRUJSRVcgTEVUVEVSIFRFVAorICAgIHUnXHUwNWQ5JyAgICMgIDB4ODkgLT4gSEVCUkVXIExFVFRFUiBZT0QKKyAgICB1J1x1MDVkYScgICAjICAweDhBIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgS0FGCisgICAgdSdcdTA1ZGInICAgIyAgMHg4QiAtPiBIRUJSRVcgTEVUVEVSIEtBRgorICAgIHUnXHUwNWRjJyAgICMgIDB4OEMgLT4gSEVCUkVXIExFVFRFUiBMQU1FRAorICAgIHUnXHUwNWRkJyAgICMgIDB4OEQgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBNRU0KKyAgICB1J1x1MDVkZScgICAjICAweDhFIC0+IEhFQlJFVyBMRVRURVIgTUVNCisgICAgdSdcdTA1ZGYnICAgIyAgMHg4RiAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIE5VTgorICAgIHUnXHUwNWUwJyAgICMgIDB4OTAgLT4gSEVCUkVXIExFVFRFUiBOVU4KKyAgICB1J1x1MDVlMScgICAjICAweDkxIC0+IEhFQlJFVyBMRVRURVIgU0FNRUtICisgICAgdSdcdTA1ZTInICAgIyAgMHg5MiAtPiBIRUJSRVcgTEVUVEVSIEFZSU4KKyAgICB1J1x1MDVlMycgICAjICAweDkzIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgUEUKKyAgICB1J1x1MDVlNCcgICAjICAweDk0IC0+IEhFQlJFVyBMRVRURVIgUEUKKyAgICB1J1x1MDVlNScgICAjICAweDk1IC0+IEhFQlJFVyBMRVRURVIgRklOQUwgVFNBREkKKyAgICB1J1x1MDVlNicgICAjICAweDk2IC0+IEhFQlJFVyBMRVRURVIgVFNBREkKKyAgICB1J1x1MDVlNycgICAjICAweDk3IC0+IEhFQlJFVyBMRVRURVIgUU9GCisgICAgdSdcdTA1ZTgnICAgIyAgMHg5OCAtPiBIRUJSRVcgTEVUVEVSIFJFU0gKKyAgICB1J1x1MDVlOScgICAjICAweDk5IC0+IEhFQlJFVyBMRVRURVIgU0hJTgorICAgIHUnXHUwNWVhJyAgICMgIDB4OUEgLT4gSEVCUkVXIExFVFRFUiBUQVYKKyAgICB1J1x1ZmZmZScgICAjICAweDlCIC0+IFVOREVGSU5FRAorICAgIHUnXHhhMycgICAgICMgIDB4OUMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4OUQgLT4gVU5ERUZJTkVECisgICAgdSdceGQ3JyAgICAgIyAgMHg5RSAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg5RiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEEwIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4QTEgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhBMiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEEzIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4QTQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhBNSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEE2IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4QTcgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhBOCAtPiBVTkRFRklORUQKKyAgICB1J1x4YWUnICAgICAjICAweEE5IC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhhYycgICAgICMgIDB4QUEgLT4gTk9UIFNJR04KKyAgICB1J1x4YmQnICAgICAjICAweEFCIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiYycgICAgICMgIDB4QUMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdcdWZmZmUnICAgIyAgMHhBRCAtPiBVTkRFRklORUQKKyAgICB1J1x4YWInICAgICAjICAweEFFIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHhBRiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjU5MScgICAjICAweEIwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHhCMSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweEIyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjUwMicgICAjICAweEIzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4QjQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdWZmZmUnICAgIyAgMHhCNSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEI2IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4QjcgLT4gVU5ERUZJTkVECisgICAgdSdceGE5JyAgICAgIyAgMHhCOCAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUyNTYzJyAgICMgIDB4QjkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTUxJyAgICMgIDB4QkEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTU3JyAgICMgIDB4QkIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHhCQyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdceGEyJyAgICAgIyAgMHhCRCAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweEJFIC0+IFlFTiBTSUdOCisgICAgdSdcdTI1MTAnICAgIyAgMHhCRiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4QzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4QzEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MmMnICAgIyAgMHhDMiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTFjJyAgICMgIDB4QzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4QzQgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweEM1IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHVmZmZlJyAgICMgIDB4QzYgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhDNyAtPiBVTkRFRklORUQKKyAgICB1J1x1MjU1YScgICAjICAweEM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHhDOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHhDQSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjYnICAgIyAgMHhDQiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweENDIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHhDRCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICB1J1x1MjU2YycgICAjICAweENFIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x4YTQnICAgICAjICAweENGIC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweEQwIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RDEgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhEMiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEQzIC0+IFVOREVGSU5FRFMKKyAgICB1J1x1ZmZmZScgICAjICAweEQ0IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RDUgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhENiAtPiBVTkRFRklORURFCisgICAgdSdcdWZmZmUnICAgIyAgMHhENyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEQ4IC0+IFVOREVGSU5FRAorICAgIHUnXHUyNTE4JyAgICMgIDB4RDkgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgdSdcdTI1MGMnICAgIyAgMHhEQSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU4OCcgICAjICAweERCIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweERDIC0+IExPV0VSIEhBTEYgQkxPQ0sKKyAgICB1J1x4YTYnICAgICAjICAweEREIC0+IEJST0tFTiBCQVIKKyAgICB1J1x1ZmZmZScgICAjICAweERFIC0+IFVOREVGSU5FRAorICAgIHUnXHUyNTgwJyAgICMgIDB4REYgLT4gVVBQRVIgSEFMRiBCTE9DSworICAgIHUnXHVmZmZlJyAgICMgIDB4RTAgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhFMSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEUyIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RTMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhFNCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEU1IC0+IFVOREVGSU5FRAorICAgIHUnXHhiNScgICAgICMgIDB4RTYgLT4gTUlDUk8gU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4RTcgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhFOCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEU5IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RUEgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhFQiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEVDIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RUQgLT4gVU5ERUZJTkVECisgICAgdSdceGFmJyAgICAgIyAgMHhFRSAtPiBNQUNST04KKyAgICB1J1x4YjQnICAgICAjICAweEVGIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhhZCcgICAgICMgIDB4RjAgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4YjEnICAgICAjICAweEYxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMDE3JyAgICMgIDB4RjIgLT4gRE9VQkxFIExPVyBMSU5FCisgICAgdSdceGJlJyAgICAgIyAgMHhGMyAtPiBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICB1J1x4YjYnICAgICAjICAweEY0IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhhNycgICAgICMgIDB4RjUgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGY3JyAgICAgIyAgMHhGNiAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdceGI4JyAgICAgIyAgMHhGNyAtPiBDRURJTExBCisgICAgdSdceGIwJyAgICAgIyAgMHhGOCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhhOCcgICAgICMgIDB4RjkgLT4gRElBRVJFU0lTCisgICAgdSdceGI3JyAgICAgIyAgMHhGQSAtPiBNSURETEUgRE9UCisgICAgdSdceGI5JyAgICAgIyAgMHhGQiAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x4YjMnICAgICAjICAweEZDIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdceGIyJyAgICAgIyAgMHhGRCAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x1MjVhMCcgICAjICAweEZFIC0+IEJMQUNLIFNRVUFSRQorICAgIHUnXHhhMCcgICAgICMgIDB4RkYgLT4gTk8tQlJFQUsgU1BBQ0UKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU2LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU2LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTZiMjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU2LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU2LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTZiMjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU3LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0MTkxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU3LnB5CkBAIC0wLDAgKzEsNjk0IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL01JQ1NGVC9QQy9DUDg1Ny5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwODU3JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDA4MDogMHgwMGM3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwODE6IDB4MDBmYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDgyOiAweDAwZTksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDgzOiAweDAwZTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODQ6IDB4MDBlNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDg1OiAweDAwZTAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMDg2OiAweDAwZTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwODc6IDB4MDBlNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4ODogMHgwMGVhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDg5OiAweDAwZWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4YTogMHgwMGU4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDA4YjogMHgwMGVmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOGM6IDB4MDBlZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4ZDogMHgwMTMxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorICAgIDB4MDA4ZTogMHgwMGM0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4ZjogMHgwMGM1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwOTA6IDB4MDBjOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA5MTogMHgwMGU2LCAgICAgIyAgTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICAweDAwOTI6IDB4MDBjNiwgICAgICMgIExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICAweDAwOTM6IDB4MDBmNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5NDogMHgwMGY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOTU6IDB4MDBmMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAweDAwOTY6IDB4MDBmYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5NzogMHgwMGY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDA5ODogMHgwMTMwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERPVCBBQk9WRQorICAgIDB4MDA5OTogMHgwMGQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YTogMHgwMGRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YjogMHgwMGY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwOWM6IDB4MDBhMywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwOWQ6IDB4MDBkOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwOWU6IDB4MDE1ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgMHgwMDlmOiAweDAxNWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICAweDAwYTA6IDB4MDBlMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwYTE6IDB4MDBlZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwYTI6IDB4MDBmMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwYTM6IDB4MDBmYSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwYTQ6IDB4MDBmMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwYTU6IDB4MDBkMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBhNjogMHgwMTFlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIEJSRVZFCisgICAgMHgwMGE3OiAweDAxMWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEJSRVZFCisgICAgMHgwMGE4OiAweDAwYmYsICAgICAjICBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgMHgwMGE5OiAweDAwYWUsICAgICAjICBSRUdJU1RFUkVEIFNJR04KKyAgICAweDAwYWE6IDB4MDBhYywgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGFiOiAweDAwYmQsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYWM6IDB4MDBiYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBhZDogMHgwMGExLCAgICAgIyAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDBhZTogMHgwMGFiLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWY6IDB4MDBiYiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiMDogMHgyNTkxLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDAwYjE6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDBiMjogMHgyNTkzLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MDBiMzogMHgyNTAyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgwMGI0OiAweDI1MjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYjU6IDB4MDBjMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBiNjogMHgwMGMyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwYjc6IDB4MDBjMCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBiODogMHgwMGE5LCAgICAgIyAgQ09QWVJJR0hUIFNJR04KKyAgICAweDAwYjk6IDB4MjU2MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYmE6IDB4MjU1MSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDAwYmI6IDB4MjU1NywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBiYzogMHgyNTVkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MDBiZDogMHgwMGEyLCAgICAgIyAgQ0VOVCBTSUdOCisgICAgMHgwMGJlOiAweDAwYTUsICAgICAjICBZRU4gU0lHTgorICAgIDB4MDBiZjogMHgyNTEwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDAwYzA6IDB4MjUxNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDAwYzE6IDB4MjUzNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMjogMHgyNTJjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzM6IDB4MjUxYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwYzQ6IDB4MjUwMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgwMGM1OiAweDI1M2MsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzY6IDB4MDBlMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAweDAwYzc6IDB4MDBjMywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgwMGE0LCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBkMDogMHgwMGJhLCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGQxOiAweDAwYWEsICAgICAjICBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBkMjogMHgwMGNhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZDM6IDB4MDBjYiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDQ6IDB4MDBjOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBkNTogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECisgICAgMHgwMGQ2OiAweDAwY2QsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwZDc6IDB4MDBjZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGQ4OiAweDAwY2YsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGQ5OiAweDI1MTgsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDAwZGE6IDB4MjUwYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MDBkYjogMHgyNTg4LCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MDBkYzogMHgyNTg0LCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MDBkZDogMHgwMGE2LCAgICAgIyAgQlJPS0VOIEJBUgorICAgIDB4MDBkZTogMHgwMGNjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMGRmOiAweDI1ODAsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgwMGUwOiAweDAwZDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZTE6IDB4MDBkZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgMHgwMGUyOiAweDAwZDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlMzogMHgwMGQyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMGU0OiAweDAwZjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGU1OiAweDAwZDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZTY6IDB4MDBiNSwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwZTc6IE5vbmUsICAgICAgICMgIFVOREVGSU5FRAorICAgIDB4MDBlODogMHgwMGQ3LCAgICAgIyAgTVVMVElQTElDQVRJT04gU0lHTgorICAgIDB4MDBlOTogMHgwMGRhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGVhOiAweDAwZGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlYjogMHgwMGQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMGVkOiAweDAwZmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlZTogMHgwMGFmLCAgICAgIyAgTUFDUk9OCisgICAgMHgwMGVmOiAweDAwYjQsICAgICAjICBBQ1VURSBBQ0NFTlQKKyAgICAweDAwZjA6IDB4MDBhZCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGYxOiAweDAwYjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwZjI6IE5vbmUsICAgICAgICMgIFVOREVGSU5FRAorICAgIDB4MDBmMzogMHgwMGJlLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgMHgwMGY0OiAweDAwYjYsICAgICAjICBQSUxDUk9XIFNJR04KKyAgICAweDAwZjU6IDB4MDBhNywgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBmNjogMHgwMGY3LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmNzogMHgwMGI4LCAgICAgIyAgQ0VESUxMQQorICAgIDB4MDBmODogMHgwMGIwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwZjk6IDB4MDBhOCwgICAgICMgIERJQUVSRVNJUworICAgIDB4MDBmYTogMHgwMGI3LCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBmYjogMHgwMGI5LCAgICAgIyAgU1VQRVJTQ1JJUFQgT05FCisgICAgMHgwMGZjOiAweDAwYjMsICAgICAjICBTVVBFUlNDUklQVCBUSFJFRQorICAgIDB4MDBmZDogMHgwMGIyLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGZlOiAweDI1YTAsICAgICAjICBCTEFDSyBTUVVBUkUKKyAgICAweDAwZmY6IDB4MDBhMCwgICAgICMgIE5PLUJSRUFLIFNQQUNFCit9KQorCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAwMDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDAwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwMDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDAwMDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDAwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDAwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwMDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDAwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDAwMGEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwMDBiIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDAwMGMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwMDBkIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MDAwZSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDAwMGYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDAwMTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MDAxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDAwMTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgwMDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgwMDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDAwMTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDAwMTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MDAxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgwMDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MDAxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgwMDFhIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDAwMWIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgwMDFjIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgwMDFkIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MDAxZSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgwMDFmIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgwMDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgwMDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDAwMjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDAwMjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDAwMjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDAwMjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgwMDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MDAyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgwMDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDAwMjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDAwMmEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDAwMmIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgwMDJjIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgwMDJkIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MDAyZSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDAwMmYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MDAzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgwMDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MDAzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDAwMzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDAwMzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MDAzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgwMDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MDAzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MDAzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MDAzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgwMDNhIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgwMDNiIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4MDAzYyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4MDAzZCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4MDAzZSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4MDAzZiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHgwMDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDAwNDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4MDA0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHgwMDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDAwNDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4MDA0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHgwMDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDAwNDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4MDA0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHgwMDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDAwNGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4MDA0YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHgwMDRjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDAwNGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4MDA0ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHgwMDRmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDAwNTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4MDA1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHgwMDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDAwNTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4MDA1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHgwMDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDAwNTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4MDA1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHgwMDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDAwNTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4MDA1YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHgwMDViIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDAwNWMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHgwMDVkIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHgwMDVlIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHgwMDVmIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHgwMDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4MDA2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4MDA2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4MDA2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4MDA2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4MDA2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4MDA2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4MDA2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4MDA2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4MDA2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4MDA2YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4MDA2YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4MDA2YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4MDA2ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4MDA2ZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4MDA2ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4MDA3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4MDA3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4MDA3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4MDA3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4MDA3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4MDA3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4MDA3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4MDA3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4MDA3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4MDA3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4MDA3YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4MDA3YiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDAwN2MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4MDA3ZCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHgwMDdlIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHgwMDdmIC0+IERFTEVURQorICAgIHUnXHhjNycgICAgICMgIDB4MDA4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhmYycgICAgICMgIDB4MDA4MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOScgICAgICMgIDB4MDA4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHgwMDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4MDA4NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMCcgICAgICMgIDB4MDA4NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGU1JyAgICAgIyAgMHgwMDg2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNycgICAgICMgIDB4MDA4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZWEnICAgICAjICAweDAwODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHgwMDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU4JyAgICAgIyAgMHgwMDhhIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZWYnICAgICAjICAweDAwOGIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWUnICAgICAjICAweDAwOGMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxMzEnICAgIyAgMHgwMDhkIC0+IExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkKKyAgICB1J1x4YzQnICAgICAjICAweDAwOGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4MDA4ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjOScgICAgICMgIDB4MDA5MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTYnICAgICAjICAweDAwOTEgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICB1J1x4YzYnICAgICAjICAweDAwOTIgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIHUnXHhmNCcgICAgICMgIDB4MDA5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjYnICAgICAjICAweDAwOTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjInICAgICAjICAweDAwOTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmYicgICAgICMgIDB4MDA5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjknICAgICAjICAweDAwOTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHUwMTMwJyAgICMgIDB4MDA5OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGQ2JyAgICAgIyAgMHgwMDk5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGMnICAgICAjICAweDAwOWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmOCcgICAgICMgIDB4MDA5YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhhMycgICAgICMgIDB4MDA5YyAtPiBQT1VORCBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHgwMDlkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE1ZScgICAjICAweDAwOWUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE1ZicgICAjICAweDAwOWYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdSdceGUxJyAgICAgIyAgMHgwMGEwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZWQnICAgICAjICAweDAwYTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhmMycgICAgICMgIDB4MDBhMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGZhJyAgICAgIyAgMHgwMGEzIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZjEnICAgICAjICAweDAwYTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkMScgICAgICMgIDB4MDBhNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x1MDExZScgICAjICAweDAwYTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIEJSRVZFCisgICAgdSdcdTAxMWYnICAgIyAgMHgwMGE3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICB1J1x4YmYnICAgICAjICAweDAwYTggLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHhhZScgICAgICMgIDB4MDBhOSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YWMnICAgICAjICAweDAwYWEgLT4gTk9UIFNJR04KKyAgICB1J1x4YmQnICAgICAjICAweDAwYWIgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJjJyAgICAgIyAgMHgwMGFjIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhhMScgICAgICMgIDB4MDBhZCAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGFiJyAgICAgIyAgMHgwMGFlIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHgwMGFmIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyNTkxJyAgICMgIDB4MDBiMCAtPiBMSUdIVCBTSEFERQorICAgIHUnXHUyNTkyJyAgICMgIDB4MDBiMSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweDAwYjIgLT4gREFSSyBTSEFERQorICAgIHUnXHUyNTAyJyAgICMgIDB4MDBiMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICB1J1x1MjUyNCcgICAjICAweDAwYjQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdceGMxJyAgICAgIyAgMHgwMGI1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMicgICAgICMgIDB4MDBiNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjMCcgICAgICMgIDB4MDBiNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YTknICAgICAjICAweDAwYjggLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MjU2MycgICAjICAweDAwYjkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTUxJyAgICMgIDB4MDBiYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTcnICAgIyAgMHgwMGJiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTVkJyAgICMgIDB4MDBiYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdceGEyJyAgICAgIyAgMHgwMGJkIC0+IENFTlQgU0lHTgorICAgIHUnXHhhNScgICAgICMgIDB4MDBiZSAtPiBZRU4gU0lHTgorICAgIHUnXHUyNTEwJyAgICMgIDB4MDBiZiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4MDBjMCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MzQnICAgIyAgMHgwMGMxIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTJjJyAgICMgIDB4MDBjMiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTFjJyAgICMgIDB4MDBjMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MDAnICAgIyAgMHgwMGM0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgdSdcdTI1M2MnICAgIyAgMHgwMGM1IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHhlMycgICAgICMgIDB4MDBjNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGMzJyAgICAgIyAgMHgwMGM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHUyNTVhJyAgICMgIDB4MDBjOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTU0JyAgICMgIDB4MDBjOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHgwMGNhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweDAwY2IgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjAnICAgIyAgMHgwMGNjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHgwMGNkIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4MDBjZSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdceGE0JyAgICAgIyAgMHgwMGNmIC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4YmEnICAgICAjICAweDAwZDAgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGFhJyAgICAgIyAgMHgwMGQxIC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGNhJyAgICAgIyAgMHgwMGQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNiJyAgICAgIyAgMHgwMGQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzgnICAgICAjICAweDAwZDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdcdWZmZmUnICAgIyAgMHgwMGQ1IC0+IFVOREVGSU5FRAorICAgIHUnXHhjZCcgICAgICMgIDB4MDBkNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweDAwZDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweDAwZDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUyNTE4JyAgICMgIDB4MDBkOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweDAwZGEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHgwMGRiIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweDAwZGMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHhhNicgICAgICMgIDB4MDBkZCAtPiBCUk9LRU4gQkFSCisgICAgdSdceGNjJyAgICAgIyAgMHgwMGRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHUyNTgwJyAgICMgIDB4MDBkZiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdceGQzJyAgICAgIyAgMHgwMGUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkZicgICAgICMgIDB4MDBlMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhkNCcgICAgICMgIDB4MDBlMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkMicgICAgICMgIDB4MDBlMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjUnICAgICAjICAweDAwZTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhkNScgICAgICMgIDB4MDBlNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4YjUnICAgICAjICAweDAwZTYgLT4gTUlDUk8gU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4MDBlNyAtPiBVTkRFRklORUQKKyAgICB1J1x4ZDcnICAgICAjICAweDAwZTggLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHhkYScgICAgICMgIDB4MDBlOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZGInICAgICAjICAweDAwZWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDknICAgICAjICAweDAwZWIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGVjJyAgICAgIyAgMHgwMGVjIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZmYnICAgICAjICAweDAwZWQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YWYnICAgICAjICAweDAwZWUgLT4gTUFDUk9OCisgICAgdSdceGI0JyAgICAgIyAgMHgwMGVmIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhhZCcgICAgICMgIDB4MDBmMCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhiMScgICAgICMgIDB4MDBmMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDAwZjIgLT4gVU5ERUZJTkVECisgICAgdSdceGJlJyAgICAgIyAgMHgwMGYzIC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnXHhiNicgICAgICMgIDB4MDBmNCAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweDAwZjUgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGY3JyAgICAgIyAgMHgwMGY2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x4YjgnICAgICAjICAweDAwZjcgLT4gQ0VESUxMQQorICAgIHUnXHhiMCcgICAgICMgIDB4MDBmOCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhhOCcgICAgICMgIDB4MDBmOSAtPiBESUFFUkVTSVMKKyAgICB1J1x4YjcnICAgICAjICAweDAwZmEgLT4gTUlERExFIERPVAorICAgIHUnXHhiOScgICAgICMgIDB4MDBmYiAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x4YjMnICAgICAjICAweDAwZmMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4YjInICAgICAjICAweDAwZmQgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdcdTI1YTAnICAgIyAgMHgwMGZlIC0+IEJMQUNLIFNRVUFSRQorICAgIHUnXHhhMCcgICAgICMgIDB4MDBmZiAtPiBOTy1CUkVBSyBTUEFDRQorKQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHsKKyAgICAweDAwMDA6IDB4MDAwMCwgICAgICMgIE5VTEwKKyAgICAweDAwMDE6IDB4MDAwMSwgICAgICMgIFNUQVJUIE9GIEhFQURJTkcKKyAgICAweDAwMDI6IDB4MDAwMiwgICAgICMgIFNUQVJUIE9GIFRFWFQKKyAgICAweDAwMDM6IDB4MDAwMywgICAgICMgIEVORCBPRiBURVhUCisgICAgMHgwMDA0OiAweDAwMDQsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgMHgwMDA1OiAweDAwMDUsICAgICAjICBFTlFVSVJZCisgICAgMHgwMDA2OiAweDAwMDYsICAgICAjICBBQ0tOT1dMRURHRQorICAgIDB4MDAwNzogMHgwMDA3LCAgICAgIyAgQkVMTAorICAgIDB4MDAwODogMHgwMDA4LCAgICAgIyAgQkFDS1NQQUNFCisgICAgMHgwMDA5OiAweDAwMDksICAgICAjICBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICAweDAwMGE6IDB4MDAwYSwgICAgICMgIExJTkUgRkVFRAorICAgIDB4MDAwYjogMHgwMDBiLCAgICAgIyAgVkVSVElDQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYzogMHgwMDBjLCAgICAgIyAgRk9STSBGRUVECisgICAgMHgwMDBkOiAweDAwMGQsICAgICAjICBDQVJSSUFHRSBSRVRVUk4KKyAgICAweDAwMGU6IDB4MDAwZSwgICAgICMgIFNISUZUIE9VVAorICAgIDB4MDAwZjogMHgwMDBmLCAgICAgIyAgU0hJRlQgSU4KKyAgICAweDAwMTA6IDB4MDAxMCwgICAgICMgIERBVEEgTElOSyBFU0NBUEUKKyAgICAweDAwMTE6IDB4MDAxMSwgICAgICMgIERFVklDRSBDT05UUk9MIE9ORQorICAgIDB4MDAxMjogMHgwMDEyLCAgICAgIyAgREVWSUNFIENPTlRST0wgVFdPCisgICAgMHgwMDEzOiAweDAwMTMsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIDB4MDAxNDogMHgwMDE0LCAgICAgIyAgREVWSUNFIENPTlRST0wgRk9VUgorICAgIDB4MDAxNTogMHgwMDE1LCAgICAgIyAgTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICAweDAwMTY6IDB4MDAxNiwgICAgICMgIFNZTkNIUk9OT1VTIElETEUKKyAgICAweDAwMTc6IDB4MDAxNywgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICAweDAwMTg6IDB4MDAxOCwgICAgICMgIENBTkNFTAorICAgIDB4MDAxOTogMHgwMDE5LCAgICAgIyAgRU5EIE9GIE1FRElVTQorICAgIDB4MDAxYTogMHgwMDFhLCAgICAgIyAgU1VCU1RJVFVURQorICAgIDB4MDAxYjogMHgwMDFiLCAgICAgIyAgRVNDQVBFCisgICAgMHgwMDFjOiAweDAwMWMsICAgICAjICBGSUxFIFNFUEFSQVRPUgorICAgIDB4MDAxZDogMHgwMDFkLCAgICAgIyAgR1JPVVAgU0VQQVJBVE9SCisgICAgMHgwMDFlOiAweDAwMWUsICAgICAjICBSRUNPUkQgU0VQQVJBVE9SCisgICAgMHgwMDFmOiAweDAwMWYsICAgICAjICBVTklUIFNFUEFSQVRPUgorICAgIDB4MDAyMDogMHgwMDIwLCAgICAgIyAgU1BBQ0UKKyAgICAweDAwMjE6IDB4MDAyMSwgICAgICMgIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwMjI6IDB4MDAyMiwgICAgICMgIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMDIzOiAweDAwMjMsICAgICAjICBOVU1CRVIgU0lHTgorICAgIDB4MDAyNDogMHgwMDI0LCAgICAgIyAgRE9MTEFSIFNJR04KKyAgICAweDAwMjU6IDB4MDAyNSwgICAgICMgIFBFUkNFTlQgU0lHTgorICAgIDB4MDAyNjogMHgwMDI2LCAgICAgIyAgQU1QRVJTQU5ECisgICAgMHgwMDI3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFCisgICAgMHgwMDI4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTCisgICAgMHgwMDI5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUworICAgIDB4MDAyYTogMHgwMDJhLCAgICAgIyAgQVNURVJJU0sKKyAgICAweDAwMmI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTgorICAgIDB4MDAyYzogMHgwMDJjLCAgICAgIyAgQ09NTUEKKyAgICAweDAwMmQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUworICAgIDB4MDAyZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QCisgICAgMHgwMDJmOiAweDAwMmYsICAgICAjICBTT0xJRFVTCisgICAgMHgwMDMwOiAweDAwMzAsICAgICAjICBESUdJVCBaRVJPCisgICAgMHgwMDMxOiAweDAwMzEsICAgICAjICBESUdJVCBPTkUKKyAgICAweDAwMzI6IDB4MDAzMiwgICAgICMgIERJR0lUIFRXTworICAgIDB4MDAzMzogMHgwMDMzLCAgICAgIyAgRElHSVQgVEhSRUUKKyAgICAweDAwMzQ6IDB4MDAzNCwgICAgICMgIERJR0lUIEZPVVIKKyAgICAweDAwMzU6IDB4MDAzNSwgICAgICMgIERJR0lUIEZJVkUKKyAgICAweDAwMzY6IDB4MDAzNiwgICAgICMgIERJR0lUIFNJWAorICAgIDB4MDAzNzogMHgwMDM3LCAgICAgIyAgRElHSVQgU0VWRU4KKyAgICAweDAwMzg6IDB4MDAzOCwgICAgICMgIERJR0lUIEVJR0hUCisgICAgMHgwMDM5OiAweDAwMzksICAgICAjICBESUdJVCBOSU5FCisgICAgMHgwMDNhOiAweDAwM2EsICAgICAjICBDT0xPTgorICAgIDB4MDAzYjogMHgwMDNiLCAgICAgIyAgU0VNSUNPTE9OCisgICAgMHgwMDNjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTgorICAgIDB4MDAzZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04KKyAgICAweDAwM2U6IDB4MDAzZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOCisgICAgMHgwMDNmOiAweDAwM2YsICAgICAjICBRVUVTVElPTiBNQVJLCisgICAgMHgwMDQwOiAweDAwNDAsICAgICAjICBDT01NRVJDSUFMIEFUCisgICAgMHgwMDQxOiAweDAwNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMDQyOiAweDAwNDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgMHgwMDQzOiAweDAwNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgMHgwMDQ0OiAweDAwNDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgMHgwMDQ1OiAweDAwNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwMDQ2OiAweDAwNDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgMHgwMDQ3OiAweDAwNDcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgMHgwMDQ4OiAweDAwNDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgMHgwMDQ5OiAweDAwNDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMDRhOiAweDAwNGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgMHgwMDRiOiAweDAwNGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgMHgwMDRjOiAweDAwNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgMHgwMDRkOiAweDAwNGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgMHgwMDRlOiAweDAwNGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgMHgwMDRmOiAweDAwNGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDUwOiAweDAwNTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgMHgwMDUxOiAweDAwNTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgMHgwMDUyOiAweDAwNTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgMHgwMDUzOiAweDAwNTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgMHgwMDU0OiAweDAwNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgMHgwMDU1OiAweDAwNTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDU2OiAweDAwNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgMHgwMDU3OiAweDAwNTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgMHgwMDU4OiAweDAwNTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgMHgwMDU5OiAweDAwNTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgMHgwMDVhOiAweDAwNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgMHgwMDViOiAweDAwNWIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVjOiAweDAwNWMsICAgICAjICBSRVZFUlNFIFNPTElEVVMKKyAgICAweDAwNWQ6IDB4MDA1ZCwgICAgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVlOiAweDAwNWUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIDB4MDA1ZjogMHgwMDVmLCAgICAgIyAgTE9XIExJTkUKKyAgICAweDAwNjA6IDB4MDA2MCwgICAgICMgIEdSQVZFIEFDQ0VOVAorICAgIDB4MDA2MTogMHgwMDYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICAweDAwNjI6IDB4MDA2MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgMHgwMDYzOiAweDAwNjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIDB4MDA2NDogMHgwMDY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICAweDAwNjU6IDB4MDA2NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgMHgwMDY2OiAweDAwNjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIDB4MDA2NzogMHgwMDY3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICAweDAwNjg6IDB4MDA2OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBICisgICAgMHgwMDY5OiAweDAwNjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIDB4MDA2YTogMHgwMDZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICAweDAwNmI6IDB4MDA2YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgMHgwMDZjOiAweDAwNmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIDB4MDA2ZDogMHgwMDZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICAweDAwNmU6IDB4MDA2ZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMDZmOiAweDAwNmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIDB4MDA3MDogMHgwMDcwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICAweDAwNzE6IDB4MDA3MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgMHgwMDcyOiAweDAwNzIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIDB4MDA3MzogMHgwMDczLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICAweDAwNzQ6IDB4MDA3NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgMHgwMDc1OiAweDAwNzUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIDB4MDA3NjogMHgwMDc2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICAweDAwNzc6IDB4MDA3NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgMHgwMDc4OiAweDAwNzgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIDB4MDA3OTogMHgwMDc5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICAweDAwN2E6IDB4MDA3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgMHgwMDdiOiAweDAwN2IsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2M6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUKKyAgICAweDAwN2Q6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2U6IDB4MDA3ZSwgICAgICMgIFRJTERFCisgICAgMHgwMDdmOiAweDAwN2YsICAgICAjICBERUxFVEUKKyAgICAweDAwYTA6IDB4MDBmZiwgICAgICMgIE5PLUJSRUFLIFNQQUNFCisgICAgMHgwMGExOiAweDAwYWQsICAgICAjICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMGEyOiAweDAwYmQsICAgICAjICBDRU5UIFNJR04KKyAgICAweDAwYTM6IDB4MDA5YywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwYTQ6IDB4MDBjZiwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwYTU6IDB4MDBiZSwgICAgICMgIFlFTiBTSUdOCisgICAgMHgwMGE2OiAweDAwZGQsICAgICAjICBCUk9LRU4gQkFSCisgICAgMHgwMGE3OiAweDAwZjUsICAgICAjICBTRUNUSU9OIFNJR04KKyAgICAweDAwYTg6IDB4MDBmOSwgICAgICMgIERJQUVSRVNJUworICAgIDB4MDBhOTogMHgwMGI4LCAgICAgIyAgQ09QWVJJR0hUIFNJR04KKyAgICAweDAwYWE6IDB4MDBkMSwgICAgICMgIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGFiOiAweDAwYWUsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhYzogMHgwMGFhLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWQ6IDB4MDBmMCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGFlOiAweDAwYTksICAgICAjICBSRUdJU1RFUkVEIFNJR04KKyAgICAweDAwYWY6IDB4MDBlZSwgICAgICMgIE1BQ1JPTgorICAgIDB4MDBiMDogMHgwMGY4LCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwYjE6IDB4MDBmMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBiMjogMHgwMGZkLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGIzOiAweDAwZmMsICAgICAjICBTVVBFUlNDUklQVCBUSFJFRQorICAgIDB4MDBiNDogMHgwMGVmLCAgICAgIyAgQUNVVEUgQUNDRU5UCisgICAgMHgwMGI1OiAweDAwZTYsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGI2OiAweDAwZjQsICAgICAjICBQSUxDUk9XIFNJR04KKyAgICAweDAwYjc6IDB4MDBmYSwgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwYjg6IDB4MDBmNywgICAgICMgIENFRElMTEEKKyAgICAweDAwYjk6IDB4MDBmYiwgICAgICMgIFNVUEVSU0NSSVBUIE9ORQorICAgIDB4MDBiYTogMHgwMGQwLCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGJiOiAweDAwYWYsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYmM6IDB4MDBhYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBiZDogMHgwMGFiLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgMHgwMGJlOiAweDAwZjMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICAweDAwYmY6IDB4MDBhOCwgICAgICMgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICAweDAwYzA6IDB4MDBiNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBjMTogMHgwMGI1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGMyOiAweDAwYjYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBjMzogMHgwMGM3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgMHgwMGM0OiAweDAwOGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGM1OiAweDAwOGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBjNjogMHgwMDkyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDBjNzogMHgwMDgwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwYzg6IDB4MDBkNCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBjOTogMHgwMDkwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGNhOiAweDAwZDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBjYjogMHgwMGQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBjYzogMHgwMGRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMGNkOiAweDAwZDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwY2U6IDB4MDBkNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGNmOiAweDAwZDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGQxOiAweDAwYTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwZDI6IDB4MDBlMywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDBkMzogMHgwMGUwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGQ0OiAweDAwZTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBkNTogMHgwMGU1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGQ2OiAweDAwOTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGQ3OiAweDAwZTgsICAgICAjICBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgMHgwMGQ4OiAweDAwOWQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgMHgwMGQ5OiAweDAwZWIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwZGE6IDB4MDBlOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBkYjogMHgwMGVhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZGM6IDB4MDA5YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZGY6IDB4MDBlMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgMHgwMGUwOiAweDAwODUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMGUxOiAweDAwYTAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGUyOiAweDAwODMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZTM6IDB4MDBjNiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAweDAwZTQ6IDB4MDA4NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGU1OiAweDAwODYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwZTY6IDB4MDA5MSwgICAgICMgIExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgMHgwMGU3OiAweDAwODcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwZTg6IDB4MDA4YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICAweDAwZTk6IDB4MDA4MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwZWE6IDB4MDA4OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlYjogMHgwMDg5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZWM6IDB4MDBlYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICAweDAwZWQ6IDB4MDBhMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwZWU6IDB4MDA4YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlZjogMHgwMDhiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZjE6IDB4MDBhNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwZjI6IDB4MDA5NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAweDAwZjM6IDB4MDBhMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZjQ6IDB4MDA5MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBmNTogMHgwMGU0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIDB4MDBmNjogMHgwMDk0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZjc6IDB4MDBmNiwgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAwZjg6IDB4MDA5YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgMHgwMGY5OiAweDAwOTcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMGZhOiAweDAwYTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGZiOiAweDAwOTYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZmM6IDB4MDA4MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGZmOiAweDAwZWQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIDB4MDExZTogMHgwMGE2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIEJSRVZFCisgICAgMHgwMTFmOiAweDAwYTcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEJSRVZFCisgICAgMHgwMTMwOiAweDAwOTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRE9UIEFCT1ZFCisgICAgMHgwMTMxOiAweDAwOGQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJCisgICAgMHgwMTVlOiAweDAwOWUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIDB4MDE1ZjogMHgwMDlmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgMHgyNTAwOiAweDAwYzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MjUwMjogMHgwMGIzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgyNTBjOiAweDAwZGEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1MTA6IDB4MDBiZiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgyNTE0OiAweDAwYzAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgyNTE4OiAweDAwZDksICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDI1MWM6IDB4MDBjMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1MjQ6IDB4MDBiNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjUyYzogMHgwMGMyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1MzQ6IDB4MDBjMSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzYzogMHgwMGM1LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTUwOiAweDAwY2QsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDI1NTE6IDB4MDBiYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDI1NTQ6IDB4MDBjOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1NTc6IDB4MDBiYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MjU1YTogMHgwMGM4LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDI1NWQ6IDB4MDBiYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDI1NjA6IDB4MDBjYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTYzOiAweDAwYjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTY2OiAweDAwY2IsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1Njk6IDB4MDBjYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NmM6IDB4MDBjZSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1ODA6IDB4MDBkZiwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODQ6IDB4MDBkYywgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODg6IDB4MDBkYiwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDI1OTE6IDB4MDBiMCwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgyNTkyOiAweDAwYjEsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDI1OTM6IDB4MDBiMiwgICAgICMgIERBUksgU0hBREUKKyAgICAweDI1YTA6IDB4MDBmZSwgICAgICMgIEJMQUNLIFNRVUFSRQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTcucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNWZkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Ny5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTcucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNWZkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Ny5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTgucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1OC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE3NjIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTgucHkKQEAgLTAsMCArMSw2OTggQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgZm9yIENQODU4LCBtb2RpZmllZCBmcm9tIGNwODUwLgorCisiIiIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A4NTgnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgMHgwMDgwOiAweDAwYzcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4MTogMHgwMGZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODI6IDB4MDBlOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwODM6IDB4MDBlMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4NDogMHgwMGU0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODU6IDB4MDBlMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwODY6IDB4MDBlNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA4NzogMHgwMGU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDg4OiAweDAwZWEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODk6IDB4MDBlYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhhOiAweDAwZTgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMDhiOiAweDAwZWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4YzogMHgwMGVlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDhkOiAweDAwZWMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMDhlOiAweDAwYzQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhmOiAweDAwYzUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA5MDogMHgwMGM5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDkxOiAweDAwZTYsICAgICAjICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MjogMHgwMGM2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MzogMHgwMGY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk0OiAweDAwZjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5NTogMHgwMGYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDA5NjogMHgwMGZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk3OiAweDAwZjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMDk4OiAweDAwZmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5OTogMHgwMGQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YTogMHgwMGRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YjogMHgwMGY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwOWM6IDB4MDBhMywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwOWQ6IDB4MDBkOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwOWU6IDB4MDBkNywgICAgICMgIE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICAweDAwOWY6IDB4MDE5MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIDB4MDBhMDogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBhMTogMHgwMGVkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBhMjogMHgwMGYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBhMzogMHgwMGZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBhNDogMHgwMGYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBhNTogMHgwMGQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGE2OiAweDAwYWEsICAgICAjICBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBhNzogMHgwMGJhLCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGE4OiAweDAwYmYsICAgICAjICBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgMHgwMGE5OiAweDAwYWUsICAgICAjICBSRUdJU1RFUkVEIFNJR04KKyAgICAweDAwYWE6IDB4MDBhYywgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGFiOiAweDAwYmQsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYWM6IDB4MDBiYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBhZDogMHgwMGExLCAgICAgIyAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDBhZTogMHgwMGFiLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWY6IDB4MDBiYiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiMDogMHgyNTkxLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDAwYjE6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDBiMjogMHgyNTkzLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MDBiMzogMHgyNTAyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgwMGI0OiAweDI1MjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYjU6IDB4MDBjMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBiNjogMHgwMGMyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwYjc6IDB4MDBjMCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBiODogMHgwMGE5LCAgICAgIyAgQ09QWVJJR0hUIFNJR04KKyAgICAweDAwYjk6IDB4MjU2MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYmE6IDB4MjU1MSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDAwYmI6IDB4MjU1NywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBiYzogMHgyNTVkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MDBiZDogMHgwMGEyLCAgICAgIyAgQ0VOVCBTSUdOCisgICAgMHgwMGJlOiAweDAwYTUsICAgICAjICBZRU4gU0lHTgorICAgIDB4MDBiZjogMHgyNTEwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDAwYzA6IDB4MjUxNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDAwYzE6IDB4MjUzNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMjogMHgyNTJjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzM6IDB4MjUxYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwYzQ6IDB4MjUwMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgwMGM1OiAweDI1M2MsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzY6IDB4MDBlMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAweDAwYzc6IDB4MDBjMywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgwMGE0LCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBkMDogMHgwMGYwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEVUSAorICAgIDB4MDBkMTogMHgwMGQwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRICisgICAgMHgwMGQyOiAweDAwY2EsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBkMzogMHgwMGNiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkNDogMHgwMGM4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGQ1OiAweDIwYWMsICAgICAjICBFVVJPIFNJR04KKyAgICAweDAwZDY6IDB4MDBjZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBkNzogMHgwMGNlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZDg6IDB4MDBjZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDk6IDB4MjUxOCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MDBkYTogMHgyNTBjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGRiOiAweDI1ODgsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgwMGRjOiAweDI1ODQsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgwMGRkOiAweDAwYTYsICAgICAjICBCUk9LRU4gQkFSCisgICAgMHgwMGRlOiAweDAwY2MsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICAweDAwZGY6IDB4MjU4MCwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDAwZTA6IDB4MDBkMywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBlMTogMHgwMGRmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTI6IDB4MDBkNCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGUzOiAweDAwZDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAweDAwZTQ6IDB4MDBmNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZTU6IDB4MDBkNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIDB4MDBlNjogMHgwMGI1LCAgICAgIyAgTUlDUk8gU0lHTgorICAgIDB4MDBlNzogMHgwMGZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOCisgICAgMHgwMGU4OiAweDAwZGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STgorICAgIDB4MDBlOTogMHgwMGRhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGVhOiAweDAwZGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlYjogMHgwMGQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMGVjOiAweDAwZmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgMHgwMGVkOiAweDAwZGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAwZWU6IDB4MDBhZiwgICAgICMgIE1BQ1JPTgorICAgIDB4MDBlZjogMHgwMGI0LCAgICAgIyAgQUNVVEUgQUNDRU5UCisgICAgMHgwMGYwOiAweDAwYWQsICAgICAjICBTT0ZUIEhZUEhFTgorICAgIDB4MDBmMTogMHgwMGIxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGYyOiAweDIwMTcsICAgICAjICBET1VCTEUgTE9XIExJTkUKKyAgICAweDAwZjM6IDB4MDBiZSwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIDB4MDBmNDogMHgwMGI2LCAgICAgIyAgUElMQ1JPVyBTSUdOCisgICAgMHgwMGY1OiAweDAwYTcsICAgICAjICBTRUNUSU9OIFNJR04KKyAgICAweDAwZjY6IDB4MDBmNywgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAwZjc6IDB4MDBiOCwgICAgICMgIENFRElMTEEKKyAgICAweDAwZjg6IDB4MDBiMCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGY5OiAweDAwYTgsICAgICAjICBESUFFUkVTSVMKKyAgICAweDAwZmE6IDB4MDBiNywgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwZmI6IDB4MDBiOSwgICAgICMgIFNVUEVSU0NSSVBUIE9ORQorICAgIDB4MDBmYzogMHgwMGIzLCAgICAgIyAgU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICAweDAwZmQ6IDB4MDBiMiwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBmZTogMHgyNWEwLCAgICAgIyAgQkxBQ0sgU1FVQVJFCisgICAgMHgwMGZmOiAweDAwYTAsICAgICAjICBOTy1CUkVBSyBTUEFDRQorfSkKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAwMDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDAwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDAwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwMDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDAwMDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDAwMDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDAwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDAwMDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwMDBhIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MDAwYiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwMDBjIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MDAwZCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDAwMGUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwMDBmIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgwMDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDAwMTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgwMDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MDAxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MDAxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgwMDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgwMDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDAwMTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MDAxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDAwMTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MDAxYSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgwMDFiIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MDAxYyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MDAxZCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDAwMWUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MDAxZiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MDAyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MDAyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgwMDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgwMDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgwMDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgwMDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MDAyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDAwMjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MDAyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgwMDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgwMDJhIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgwMDJiIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MDAyYyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MDAyZCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDAwMmUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgwMDJmIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDAwMzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MDAzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDAwMzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgwMDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgwMDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDAwMzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MDAzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDAwMzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDAwMzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDAwMzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4MDAzYSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4MDAzYiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDAwM2MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDAwM2QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDAwM2UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDAwM2YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4MDA0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHgwMDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDAwNDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4MDA0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHgwMDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDAwNDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4MDA0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHgwMDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDAwNDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4MDA0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHgwMDRhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDAwNGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4MDA0YyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHgwMDRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDAwNGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4MDA0ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHgwMDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDAwNTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4MDA1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHgwMDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDAwNTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4MDA1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHgwMDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDAwNTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4MDA1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHgwMDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDAwNWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4MDA1YiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHgwMDVjIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4MDA1ZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4MDA1ZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4MDA1ZiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4MDA2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDAwNjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDAwNjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDAwNjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDAwNjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDAwNjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDAwNjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDAwNjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDAwNjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDAwNjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDAwNmEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDAwNmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDAwNmMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDAwNmQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDAwNmUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDAwNmYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDAwNzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDAwNzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDAwNzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDAwNzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDAwNzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDAwNzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDAwNzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDAwNzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDAwNzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDAwNzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDAwN2EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDAwN2IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHgwMDdjIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDAwN2QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4MDA3ZSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4MDA3ZiAtPiBERUxFVEUKKyAgICB1J1x4YzcnICAgICAjICAweDAwODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZmMnICAgICAjICAweDAwODEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTknICAgICAjICAweDAwODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4MDA4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDAwODQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTAnICAgICAjICAweDAwODUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlNScgICAgICMgIDB4MDA4NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTcnICAgICAjICAweDAwODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGVhJyAgICAgIyAgMHgwMDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4MDA4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOCcgICAgICMgIDB4MDA4YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGVmJyAgICAgIyAgMHgwMDhiIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVlJyAgICAgIyAgMHgwMDhjIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYycgICAgICMgIDB4MDA4ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGM0JyAgICAgIyAgMHgwMDhlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweDAwOGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzknICAgICAjICAweDAwOTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGU2JyAgICAgIyAgMHgwMDkxIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgdSdceGM2JyAgICAgIyAgMHgwMDkyIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICB1J1x4ZjQnICAgICAjICAweDAwOTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHgwMDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGYyJyAgICAgIyAgMHgwMDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZmInICAgICAjICAweDAwOTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY5JyAgICAgIyAgMHgwMDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmYnICAgICAjICAweDAwOTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDYnICAgICAjICAweDAwOTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkYycgICAgICMgIDB4MDA5YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY4JyAgICAgIyAgMHgwMDliIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGEzJyAgICAgIyAgMHgwMDljIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4ZDgnICAgICAjICAweDAwOWQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhkNycgICAgICMgIDB4MDA5ZSAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdcdTAxOTInICAgIyAgMHgwMDlmIC0+IExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIHUnXHhlMScgICAgICMgIDB4MDBhMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGVkJyAgICAgIyAgMHgwMGExIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZjMnICAgICAjICAweDAwYTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmYScgICAgICMgIDB4MDBhMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGYxJyAgICAgIyAgMHgwMGE0IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDEnICAgICAjICAweDAwYTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGFhJyAgICAgIyAgMHgwMGE2IC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJhJyAgICAgIyAgMHgwMGE3IC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiZicgICAgICMgIDB4MDBhOCAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdceGFlJyAgICAgIyAgMHgwMGE5IC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhhYycgICAgICMgIDB4MDBhYSAtPiBOT1QgU0lHTgorICAgIHUnXHhiZCcgICAgICMgIDB4MDBhYiAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmMnICAgICAjICAweDAwYWMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGExJyAgICAgIyAgMHgwMGFkIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YWInICAgICAjICAweDAwYWUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweDAwYWYgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTI1OTEnICAgIyAgMHgwMGIwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHgwMGIxIC0+IE1FRElVTSBTSEFERQorICAgIHUnXHUyNTkzJyAgICMgIDB4MDBiMiAtPiBEQVJLIFNIQURFCisgICAgdSdcdTI1MDInICAgIyAgMHgwMGIzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4MDBiNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x4YzEnICAgICAjICAweDAwYjUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHgwMGI2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGMwJyAgICAgIyAgMHgwMGI3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhhOScgICAgICMgIDB4MDBiOCAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUyNTYzJyAgICMgIDB4MDBiOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NTEnICAgIyAgMHgwMGJhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICB1J1x1MjU1NycgICAjICAweDAwYmIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHgwMGJjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x4YTInICAgICAjICAweDAwYmQgLT4gQ0VOVCBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHgwMGJlIC0+IFlFTiBTSUdOCisgICAgdSdcdTI1MTAnICAgIyAgMHgwMGJmIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHgwMGMwIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjUzNCcgICAjICAweDAwYzEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MmMnICAgIyAgMHgwMGMyIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHgwMGMzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUwMCcgICAjICAweDAwYzQgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweDAwYzUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdceGUzJyAgICAgIyAgMHgwMGM2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4YzMnICAgICAjICAweDAwYzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdcdTI1NWEnICAgIyAgMHgwMGM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHgwMGM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweDAwY2EgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY2JyAgICMgIDB4MDBjYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweDAwY2MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweDAwY2QgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NmMnICAgIyAgMHgwMGNlIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x4YTQnICAgICAjICAweDAwY2YgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHhmMCcgICAgICMgIDB4MDBkMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRVRICisgICAgdSdceGQwJyAgICAgIyAgMHgwMGQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEVUSAorICAgIHUnXHhjYScgICAgICMgIDB4MDBkMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjYicgICAgICMgIDB4MDBkMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM4JyAgICAgIyAgMHgwMGQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHUyMGFjJyAgICMgIDB4MDBkNSAtPiBFVVJPIFNJR04KKyAgICB1J1x4Y2QnICAgICAjICAweDAwZDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHgwMGQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHgwMGQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MjUxOCcgICAjICAweDAwZDkgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgdSdcdTI1MGMnICAgIyAgMHgwMGRhIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTg4JyAgICMgIDB4MDBkYiAtPiBGVUxMIEJMT0NLCisgICAgdSdcdTI1ODQnICAgIyAgMHgwMGRjIC0+IExPV0VSIEhBTEYgQkxPQ0sKKyAgICB1J1x4YTYnICAgICAjICAweDAwZGQgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhjYycgICAgICMgIDB4MDBkZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x1MjU4MCcgICAjICAweDAwZGYgLT4gVVBQRVIgSEFMRiBCTE9DSworICAgIHUnXHhkMycgICAgICMgIDB4MDBlMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZGYnICAgICAjICAweDAwZTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x4ZDQnICAgICAjICAweDAwZTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDInICAgICAjICAweDAwZTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGY1JyAgICAgIyAgMHgwMGU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZDUnICAgICAjICAweDAwZTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGI1JyAgICAgIyAgMHgwMGU2IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x4ZmUnICAgICAjICAweDAwZTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOCisgICAgdSdceGRlJyAgICAgIyAgMHgwMGU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisgICAgdSdceGRhJyAgICAgIyAgMHgwMGU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4MDBlYSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkOScgICAgICMgIDB4MDBlYiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmQnICAgICAjICAweDAwZWMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhkZCcgICAgICMgIDB4MDBlZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4YWYnICAgICAjICAweDAwZWUgLT4gTUFDUk9OCisgICAgdSdceGI0JyAgICAgIyAgMHgwMGVmIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhhZCcgICAgICMgIDB4MDBmMCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhiMScgICAgICMgIDB4MDBmMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MjAxNycgICAjICAweDAwZjIgLT4gRE9VQkxFIExPVyBMSU5FCisgICAgdSdceGJlJyAgICAgIyAgMHgwMGYzIC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnXHhiNicgICAgICMgIDB4MDBmNCAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweDAwZjUgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGY3JyAgICAgIyAgMHgwMGY2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x4YjgnICAgICAjICAweDAwZjcgLT4gQ0VESUxMQQorICAgIHUnXHhiMCcgICAgICMgIDB4MDBmOCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhhOCcgICAgICMgIDB4MDBmOSAtPiBESUFFUkVTSVMKKyAgICB1J1x4YjcnICAgICAjICAweDAwZmEgLT4gTUlERExFIERPVAorICAgIHUnXHhiOScgICAgICMgIDB4MDBmYiAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x4YjMnICAgICAjICAweDAwZmMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4YjInICAgICAjICAweDAwZmQgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdcdTI1YTAnICAgIyAgMHgwMGZlIC0+IEJMQUNLIFNRVUFSRQorICAgIHUnXHhhMCcgICAgICMgIDB4MDBmZiAtPiBOTy1CUkVBSyBTUEFDRQorKQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHsKKyAgICAweDAwMDA6IDB4MDAwMCwgICAgICMgIE5VTEwKKyAgICAweDAwMDE6IDB4MDAwMSwgICAgICMgIFNUQVJUIE9GIEhFQURJTkcKKyAgICAweDAwMDI6IDB4MDAwMiwgICAgICMgIFNUQVJUIE9GIFRFWFQKKyAgICAweDAwMDM6IDB4MDAwMywgICAgICMgIEVORCBPRiBURVhUCisgICAgMHgwMDA0OiAweDAwMDQsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgMHgwMDA1OiAweDAwMDUsICAgICAjICBFTlFVSVJZCisgICAgMHgwMDA2OiAweDAwMDYsICAgICAjICBBQ0tOT1dMRURHRQorICAgIDB4MDAwNzogMHgwMDA3LCAgICAgIyAgQkVMTAorICAgIDB4MDAwODogMHgwMDA4LCAgICAgIyAgQkFDS1NQQUNFCisgICAgMHgwMDA5OiAweDAwMDksICAgICAjICBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICAweDAwMGE6IDB4MDAwYSwgICAgICMgIExJTkUgRkVFRAorICAgIDB4MDAwYjogMHgwMDBiLCAgICAgIyAgVkVSVElDQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYzogMHgwMDBjLCAgICAgIyAgRk9STSBGRUVECisgICAgMHgwMDBkOiAweDAwMGQsICAgICAjICBDQVJSSUFHRSBSRVRVUk4KKyAgICAweDAwMGU6IDB4MDAwZSwgICAgICMgIFNISUZUIE9VVAorICAgIDB4MDAwZjogMHgwMDBmLCAgICAgIyAgU0hJRlQgSU4KKyAgICAweDAwMTA6IDB4MDAxMCwgICAgICMgIERBVEEgTElOSyBFU0NBUEUKKyAgICAweDAwMTE6IDB4MDAxMSwgICAgICMgIERFVklDRSBDT05UUk9MIE9ORQorICAgIDB4MDAxMjogMHgwMDEyLCAgICAgIyAgREVWSUNFIENPTlRST0wgVFdPCisgICAgMHgwMDEzOiAweDAwMTMsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIDB4MDAxNDogMHgwMDE0LCAgICAgIyAgREVWSUNFIENPTlRST0wgRk9VUgorICAgIDB4MDAxNTogMHgwMDE1LCAgICAgIyAgTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICAweDAwMTY6IDB4MDAxNiwgICAgICMgIFNZTkNIUk9OT1VTIElETEUKKyAgICAweDAwMTc6IDB4MDAxNywgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICAweDAwMTg6IDB4MDAxOCwgICAgICMgIENBTkNFTAorICAgIDB4MDAxOTogMHgwMDE5LCAgICAgIyAgRU5EIE9GIE1FRElVTQorICAgIDB4MDAxYTogMHgwMDFhLCAgICAgIyAgU1VCU1RJVFVURQorICAgIDB4MDAxYjogMHgwMDFiLCAgICAgIyAgRVNDQVBFCisgICAgMHgwMDFjOiAweDAwMWMsICAgICAjICBGSUxFIFNFUEFSQVRPUgorICAgIDB4MDAxZDogMHgwMDFkLCAgICAgIyAgR1JPVVAgU0VQQVJBVE9SCisgICAgMHgwMDFlOiAweDAwMWUsICAgICAjICBSRUNPUkQgU0VQQVJBVE9SCisgICAgMHgwMDFmOiAweDAwMWYsICAgICAjICBVTklUIFNFUEFSQVRPUgorICAgIDB4MDAyMDogMHgwMDIwLCAgICAgIyAgU1BBQ0UKKyAgICAweDAwMjE6IDB4MDAyMSwgICAgICMgIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwMjI6IDB4MDAyMiwgICAgICMgIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMDIzOiAweDAwMjMsICAgICAjICBOVU1CRVIgU0lHTgorICAgIDB4MDAyNDogMHgwMDI0LCAgICAgIyAgRE9MTEFSIFNJR04KKyAgICAweDAwMjU6IDB4MDAyNSwgICAgICMgIFBFUkNFTlQgU0lHTgorICAgIDB4MDAyNjogMHgwMDI2LCAgICAgIyAgQU1QRVJTQU5ECisgICAgMHgwMDI3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFCisgICAgMHgwMDI4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTCisgICAgMHgwMDI5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUworICAgIDB4MDAyYTogMHgwMDJhLCAgICAgIyAgQVNURVJJU0sKKyAgICAweDAwMmI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTgorICAgIDB4MDAyYzogMHgwMDJjLCAgICAgIyAgQ09NTUEKKyAgICAweDAwMmQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUworICAgIDB4MDAyZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QCisgICAgMHgwMDJmOiAweDAwMmYsICAgICAjICBTT0xJRFVTCisgICAgMHgwMDMwOiAweDAwMzAsICAgICAjICBESUdJVCBaRVJPCisgICAgMHgwMDMxOiAweDAwMzEsICAgICAjICBESUdJVCBPTkUKKyAgICAweDAwMzI6IDB4MDAzMiwgICAgICMgIERJR0lUIFRXTworICAgIDB4MDAzMzogMHgwMDMzLCAgICAgIyAgRElHSVQgVEhSRUUKKyAgICAweDAwMzQ6IDB4MDAzNCwgICAgICMgIERJR0lUIEZPVVIKKyAgICAweDAwMzU6IDB4MDAzNSwgICAgICMgIERJR0lUIEZJVkUKKyAgICAweDAwMzY6IDB4MDAzNiwgICAgICMgIERJR0lUIFNJWAorICAgIDB4MDAzNzogMHgwMDM3LCAgICAgIyAgRElHSVQgU0VWRU4KKyAgICAweDAwMzg6IDB4MDAzOCwgICAgICMgIERJR0lUIEVJR0hUCisgICAgMHgwMDM5OiAweDAwMzksICAgICAjICBESUdJVCBOSU5FCisgICAgMHgwMDNhOiAweDAwM2EsICAgICAjICBDT0xPTgorICAgIDB4MDAzYjogMHgwMDNiLCAgICAgIyAgU0VNSUNPTE9OCisgICAgMHgwMDNjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTgorICAgIDB4MDAzZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04KKyAgICAweDAwM2U6IDB4MDAzZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOCisgICAgMHgwMDNmOiAweDAwM2YsICAgICAjICBRVUVTVElPTiBNQVJLCisgICAgMHgwMDQwOiAweDAwNDAsICAgICAjICBDT01NRVJDSUFMIEFUCisgICAgMHgwMDQxOiAweDAwNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMDQyOiAweDAwNDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgMHgwMDQzOiAweDAwNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgMHgwMDQ0OiAweDAwNDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgMHgwMDQ1OiAweDAwNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwMDQ2OiAweDAwNDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgMHgwMDQ3OiAweDAwNDcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgMHgwMDQ4OiAweDAwNDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgMHgwMDQ5OiAweDAwNDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMDRhOiAweDAwNGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgMHgwMDRiOiAweDAwNGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgMHgwMDRjOiAweDAwNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgMHgwMDRkOiAweDAwNGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgMHgwMDRlOiAweDAwNGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgMHgwMDRmOiAweDAwNGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDUwOiAweDAwNTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgMHgwMDUxOiAweDAwNTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgMHgwMDUyOiAweDAwNTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgMHgwMDUzOiAweDAwNTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgMHgwMDU0OiAweDAwNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgMHgwMDU1OiAweDAwNTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDU2OiAweDAwNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgMHgwMDU3OiAweDAwNTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgMHgwMDU4OiAweDAwNTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgMHgwMDU5OiAweDAwNTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgMHgwMDVhOiAweDAwNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgMHgwMDViOiAweDAwNWIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVjOiAweDAwNWMsICAgICAjICBSRVZFUlNFIFNPTElEVVMKKyAgICAweDAwNWQ6IDB4MDA1ZCwgICAgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVlOiAweDAwNWUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIDB4MDA1ZjogMHgwMDVmLCAgICAgIyAgTE9XIExJTkUKKyAgICAweDAwNjA6IDB4MDA2MCwgICAgICMgIEdSQVZFIEFDQ0VOVAorICAgIDB4MDA2MTogMHgwMDYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICAweDAwNjI6IDB4MDA2MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgMHgwMDYzOiAweDAwNjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIDB4MDA2NDogMHgwMDY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICAweDAwNjU6IDB4MDA2NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgMHgwMDY2OiAweDAwNjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIDB4MDA2NzogMHgwMDY3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICAweDAwNjg6IDB4MDA2OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBICisgICAgMHgwMDY5OiAweDAwNjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIDB4MDA2YTogMHgwMDZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICAweDAwNmI6IDB4MDA2YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgMHgwMDZjOiAweDAwNmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIDB4MDA2ZDogMHgwMDZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICAweDAwNmU6IDB4MDA2ZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMDZmOiAweDAwNmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIDB4MDA3MDogMHgwMDcwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICAweDAwNzE6IDB4MDA3MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgMHgwMDcyOiAweDAwNzIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIDB4MDA3MzogMHgwMDczLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICAweDAwNzQ6IDB4MDA3NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgMHgwMDc1OiAweDAwNzUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIDB4MDA3NjogMHgwMDc2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICAweDAwNzc6IDB4MDA3NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgMHgwMDc4OiAweDAwNzgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIDB4MDA3OTogMHgwMDc5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICAweDAwN2E6IDB4MDA3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgMHgwMDdiOiAweDAwN2IsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2M6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUKKyAgICAweDAwN2Q6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2U6IDB4MDA3ZSwgICAgICMgIFRJTERFCisgICAgMHgwMDdmOiAweDAwN2YsICAgICAjICBERUxFVEUKKyAgICAweDAwYTA6IDB4MDBmZiwgICAgICMgIE5PLUJSRUFLIFNQQUNFCisgICAgMHgwMGExOiAweDAwYWQsICAgICAjICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMGEyOiAweDAwYmQsICAgICAjICBDRU5UIFNJR04KKyAgICAweDAwYTM6IDB4MDA5YywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwYTQ6IDB4MDBjZiwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwYTU6IDB4MDBiZSwgICAgICMgIFlFTiBTSUdOCisgICAgMHgwMGE2OiAweDAwZGQsICAgICAjICBCUk9LRU4gQkFSCisgICAgMHgwMGE3OiAweDAwZjUsICAgICAjICBTRUNUSU9OIFNJR04KKyAgICAweDAwYTg6IDB4MDBmOSwgICAgICMgIERJQUVSRVNJUworICAgIDB4MDBhOTogMHgwMGI4LCAgICAgIyAgQ09QWVJJR0hUIFNJR04KKyAgICAweDAwYWE6IDB4MDBhNiwgICAgICMgIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGFiOiAweDAwYWUsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhYzogMHgwMGFhLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWQ6IDB4MDBmMCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGFlOiAweDAwYTksICAgICAjICBSRUdJU1RFUkVEIFNJR04KKyAgICAweDAwYWY6IDB4MDBlZSwgICAgICMgIE1BQ1JPTgorICAgIDB4MDBiMDogMHgwMGY4LCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwYjE6IDB4MDBmMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBiMjogMHgwMGZkLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGIzOiAweDAwZmMsICAgICAjICBTVVBFUlNDUklQVCBUSFJFRQorICAgIDB4MDBiNDogMHgwMGVmLCAgICAgIyAgQUNVVEUgQUNDRU5UCisgICAgMHgwMGI1OiAweDAwZTYsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGI2OiAweDAwZjQsICAgICAjICBQSUxDUk9XIFNJR04KKyAgICAweDAwYjc6IDB4MDBmYSwgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwYjg6IDB4MDBmNywgICAgICMgIENFRElMTEEKKyAgICAweDAwYjk6IDB4MDBmYiwgICAgICMgIFNVUEVSU0NSSVBUIE9ORQorICAgIDB4MDBiYTogMHgwMGE3LCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGJiOiAweDAwYWYsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYmM6IDB4MDBhYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBiZDogMHgwMGFiLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgMHgwMGJlOiAweDAwZjMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICAweDAwYmY6IDB4MDBhOCwgICAgICMgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICAweDAwYzA6IDB4MDBiNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBjMTogMHgwMGI1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGMyOiAweDAwYjYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBjMzogMHgwMGM3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgMHgwMGM0OiAweDAwOGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGM1OiAweDAwOGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBjNjogMHgwMDkyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDBjNzogMHgwMDgwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwYzg6IDB4MDBkNCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBjOTogMHgwMDkwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGNhOiAweDAwZDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBjYjogMHgwMGQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBjYzogMHgwMGRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMGNkOiAweDAwZDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwY2U6IDB4MDBkNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGNmOiAweDAwZDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGQwOiAweDAwZDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEgKKyAgICAweDAwZDE6IDB4MDBhNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBkMjogMHgwMGUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMGQzOiAweDAwZTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZDQ6IDB4MDBlMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGQ1OiAweDAwZTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZDY6IDB4MDA5OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDc6IDB4MDA5ZSwgICAgICMgIE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICAweDAwZDg6IDB4MDA5ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwZDk6IDB4MDBlYiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDBkYTogMHgwMGU5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGRiOiAweDAwZWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBkYzogMHgwMDlhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkZDogMHgwMGVkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgMHgwMGRlOiAweDAwZTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STgorICAgIDB4MDBkZjogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTA6IDB4MDA4NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwZTE6IDB4MDBhMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwZTI6IDB4MDA4MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlMzogMHgwMGM2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIDB4MDBlNDogMHgwMDg0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZTU6IDB4MDA4NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBlNjogMHgwMDkxLCAgICAgIyAgTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICAweDAwZTc6IDB4MDA4NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBlODogMHgwMDhhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBlOTogMHgwMDgyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDBlYTogMHgwMDg4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGViOiAweDAwODksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlYzogMHgwMDhkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIDB4MDBlZDogMHgwMGExLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBlZTogMHgwMDhjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGVmOiAweDAwOGIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmMDogMHgwMGQwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEVUSAorICAgIDB4MDBmMTogMHgwMGE0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBmMjogMHgwMDk1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDBmMzogMHgwMGEyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBmNDogMHgwMDkzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGY1OiAweDAwZTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGY2OiAweDAwOTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmNzogMHgwMGY2LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmODogMHgwMDliLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwZjk6IDB4MDA5NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwZmE6IDB4MDBhMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwZmI6IDB4MDA5NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBmYzogMHgwMDgxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZmQ6IDB4MDBlYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAwZmU6IDB4MDBlNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUSE9STgorICAgIDB4MDBmZjogMHgwMDk4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICAweDIwYWM6IDB4MDBkNSwgICAgICMgIEVVUk8gU0lHTgorICAgIDB4MDE5MjogMHgwMDlmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgMHgyMDE3OiAweDAwZjIsICAgICAjICBET1VCTEUgTE9XIExJTkUKKyAgICAweDI1MDA6IDB4MDBjNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwYjMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDI1MGM6IDB4MDBkYSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMGJmLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDBjMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDI1MTg6IDB4MDBkOSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMGMzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMGI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTJjOiAweDAwYzIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMGMxLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwYzUsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NTA6IDB4MDBjZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MjU1MTogMHgwMGJhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MjU1NDogMHgwMGM5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MjU1NzogMHgwMGJiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgyNTVhOiAweDAwYzgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MjU1ZDogMHgwMGJjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MjU2MDogMHgwMGNjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1NjM6IDB4MDBiOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1NjY6IDB4MDBjYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2OTogMHgwMGNhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2YzogMHgwMGNlLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU4MDogMHgwMGRmLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MjU4NDogMHgwMGRjLCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MjU4ODogMHgwMGRiLCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MjU5MTogMHgwMGIwLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDI1OTI6IDB4MDBiMSwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MjU5MzogMHgwMGIyLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MjVhMDogMHgwMGZlLCAgICAgIyAgQkxBQ0sgU1FVQVJFCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1OC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1OC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmZjhlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1OC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1OC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThmZjhlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2MC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhY2IwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2MC5weQpAQCAtMCwwICsxLDY5OCBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBnZW5lcmF0ZWQgZnJvbSAnVkVORE9SUy9NSUNTRlQvUEMvQ1A4NjAuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDg2MCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCitkZWNvZGluZ19tYXAudXBkYXRlKHsKKyAgICAweDAwODA6IDB4MDBjNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDgxOiAweDAwZmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4MjogMHgwMGU5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA4MzogMHgwMGUyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDg0OiAweDAwZTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgMHgwMDg1OiAweDAwZTAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMDg2OiAweDAwYzEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwODc6IDB4MDBlNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4ODogMHgwMGVhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDg5OiAweDAwY2EsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4YTogMHgwMGU4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDA4YjogMHgwMGNkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMDhjOiAweDAwZDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4ZDogMHgwMGVjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIDB4MDA4ZTogMHgwMGMzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgMHgwMDhmOiAweDAwYzIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5MDogMHgwMGM5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDkxOiAweDAwYzAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwOTI6IDB4MDBjOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDA5MzogMHgwMGY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk0OiAweDAwZjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMDk1OiAweDAwZjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMDk2OiAweDAwZGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwOTc6IDB4MDBmOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwOTg6IDB4MDBjYywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIDB4MDA5OTogMHgwMGQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMDlhOiAweDAwZGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDliOiAweDAwYTIsICAgICAjICBDRU5UIFNJR04KKyAgICAweDAwOWM6IDB4MDBhMywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwOWQ6IDB4MDBkOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDA5ZTogMHgyMGE3LCAgICAgIyAgUEVTRVRBIFNJR04KKyAgICAweDAwOWY6IDB4MDBkMywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBhMDogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBhMTogMHgwMGVkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBhMjogMHgwMGYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBhMzogMHgwMGZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBhNDogMHgwMGYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBhNTogMHgwMGQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGE2OiAweDAwYWEsICAgICAjICBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBhNzogMHgwMGJhLCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGE4OiAweDAwYmYsICAgICAjICBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgMHgwMGE5OiAweDAwZDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAweDAwYWE6IDB4MDBhYywgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGFiOiAweDAwYmQsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYWM6IDB4MDBiYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBhZDogMHgwMGExLCAgICAgIyAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDBhZTogMHgwMGFiLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWY6IDB4MDBiYiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiMDogMHgyNTkxLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDAwYjE6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDBiMjogMHgyNTkzLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MDBiMzogMHgyNTAyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgwMGI0OiAweDI1MjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYjU6IDB4MjU2MSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGI2OiAweDI1NjIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiNzogMHgyNTU2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiODogMHgyNTU1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiOTogMHgyNTYzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiYTogMHgyNTUxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MDBiYjogMHgyNTU3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgwMGJjOiAweDI1NWQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgwMGJkOiAweDI1NWMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiZTogMHgyNTViLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYmY6IDB4MjUxMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgwMGMwOiAweDI1MTQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgwMGMxOiAweDI1MzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzI6IDB4MjUyYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMzOiAweDI1MWMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGM0OiAweDI1MDAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MDBjNTogMHgyNTNjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGM2OiAweDI1NWUsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwYzc6IDB4MjU1ZiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgyNTY3LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDA6IDB4MjU2OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQxOiAweDI1NjQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQyOiAweDI1NjUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQzOiAweDI1NTksICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwZDQ6IDB4MjU1OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBkNTogMHgyNTUyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwZDY6IDB4MjU1MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGQ3OiAweDI1NmIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkODogMHgyNTZhLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDk6IDB4MjUxOCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MDBkYTogMHgyNTBjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGRiOiAweDI1ODgsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgwMGRjOiAweDI1ODQsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgwMGRkOiAweDI1OGMsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGU6IDB4MjU5MCwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGY6IDB4MjU4MCwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDAwZTA6IDB4MDNiMSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDBlMTogMHgwMGRmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTI6IDB4MDM5MywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMGUzOiAweDAzYzAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICAweDAwZTQ6IDB4MDNhMywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgMHgwMGU1OiAweDAzYzMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAwZTY6IDB4MDBiNSwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwZTc6IDB4MDNjNCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICAweDAwZTg6IDB4MDNhNiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIDB4MDBlOTogMHgwMzk4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICAweDAwZWE6IDB4MDNhOSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgMHgwMGViOiAweDAzYjQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICAweDAwZWM6IDB4MjIxZSwgICAgICMgIElORklOSVRZCisgICAgMHgwMGVkOiAweDAzYzYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgMHgwMGVlOiAweDAzYjUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDBlZjogMHgyMjI5LCAgICAgIyAgSU5URVJTRUNUSU9OCisgICAgMHgwMGYwOiAweDIyNjEsICAgICAjICBJREVOVElDQUwgVE8KKyAgICAweDAwZjE6IDB4MDBiMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBmMjogMHgyMjY1LCAgICAgIyAgR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgwMGYzOiAweDIyNjQsICAgICAjICBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDAwZjQ6IDB4MjMyMCwgICAgICMgIFRPUCBIQUxGIElOVEVHUkFMCisgICAgMHgwMGY1OiAweDIzMjEsICAgICAjICBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIDB4MDBmNjogMHgwMGY3LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmNzogMHgyMjQ4LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgwMGY4OiAweDAwYjAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBmOTogMHgyMjE5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgwMGZhOiAweDAwYjcsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGZiOiAweDIyMWEsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MDBmYzogMHgyMDdmLCAgICAgIyAgU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwZmQ6IDB4MDBiMiwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBmZTogMHgyNWEwLCAgICAgIyAgQkxBQ0sgU1FVQVJFCisgICAgMHgwMGZmOiAweDAwYTAsICAgICAjICBOTy1CUkVBSyBTUEFDRQorfSkKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAwMDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDAwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDAwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwMDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDAwMDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDAwMDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDAwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDAwMDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwMDBhIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MDAwYiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwMDBjIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MDAwZCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDAwMGUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwMDBmIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgwMDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDAwMTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgwMDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MDAxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MDAxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgwMDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgwMDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDAwMTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MDAxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDAwMTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MDAxYSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgwMDFiIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MDAxYyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MDAxZCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDAwMWUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MDAxZiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MDAyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MDAyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgwMDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgwMDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgwMDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgwMDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MDAyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDAwMjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MDAyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgwMDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgwMDJhIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgwMDJiIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MDAyYyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MDAyZCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDAwMmUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgwMDJmIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDAwMzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MDAzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDAwMzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgwMDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgwMDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDAwMzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MDAzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDAwMzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDAwMzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDAwMzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4MDAzYSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4MDAzYiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDAwM2MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDAwM2QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDAwM2UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDAwM2YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4MDA0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHgwMDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDAwNDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4MDA0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHgwMDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDAwNDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4MDA0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHgwMDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDAwNDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4MDA0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHgwMDRhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDAwNGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4MDA0YyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHgwMDRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDAwNGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4MDA0ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHgwMDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDAwNTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4MDA1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHgwMDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDAwNTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4MDA1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHgwMDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDAwNTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4MDA1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHgwMDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDAwNWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4MDA1YiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHgwMDVjIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4MDA1ZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4MDA1ZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4MDA1ZiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4MDA2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDAwNjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDAwNjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDAwNjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDAwNjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDAwNjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDAwNjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDAwNjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDAwNjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDAwNjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDAwNmEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDAwNmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDAwNmMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDAwNmQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDAwNmUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDAwNmYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDAwNzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDAwNzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDAwNzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDAwNzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDAwNzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDAwNzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDAwNzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDAwNzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDAwNzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDAwNzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDAwN2EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDAwN2IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHgwMDdjIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDAwN2QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4MDA3ZSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4MDA3ZiAtPiBERUxFVEUKKyAgICB1J1x4YzcnICAgICAjICAweDAwODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZmMnICAgICAjICAweDAwODEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTknICAgICAjICAweDAwODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4MDA4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTMnICAgICAjICAweDAwODQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhlMCcgICAgICMgIDB4MDA4NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGMxJyAgICAgIyAgMHgwMDg2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlNycgICAgICMgIDB4MDA4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZWEnICAgICAjICAweDAwODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNhJyAgICAgIyAgMHgwMDg5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU4JyAgICAgIyAgMHgwMDhhIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4Y2QnICAgICAjICAweDAwOGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGQ0JyAgICAgIyAgMHgwMDhjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVjJyAgICAgIyAgMHgwMDhkIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4YzMnICAgICAjICAweDAwOGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGMyJyAgICAgIyAgMHgwMDhmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGM5JyAgICAgIyAgMHgwMDkwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjMCcgICAgICMgIDB4MDA5MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzgnICAgICAjICAweDAwOTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGY0JyAgICAgIyAgMHgwMDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNScgICAgICMgIDB4MDA5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGYyJyAgICAgIyAgMHgwMDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweDAwOTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGY5JyAgICAgIyAgMHgwMDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4Y2MnICAgICAjICAweDAwOTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGQ1JyAgICAgIyAgMHgwMDk5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhkYycgICAgICMgIDB4MDA5YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGEyJyAgICAgIyAgMHgwMDliIC0+IENFTlQgU0lHTgorICAgIHUnXHhhMycgICAgICMgIDB4MDA5YyAtPiBQT1VORCBTSUdOCisgICAgdSdceGQ5JyAgICAgIyAgMHgwMDlkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHUyMGE3JyAgICMgIDB4MDA5ZSAtPiBQRVNFVEEgU0lHTgorICAgIHUnXHhkMycgICAgICMgIDB4MDA5ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZTEnICAgICAjICAweDAwYTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlZCcgICAgICMgIDB4MDBhMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGYzJyAgICAgIyAgMHgwMGEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZmEnICAgICAjICAweDAwYTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmMScgICAgICMgIDB4MDBhNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQxJyAgICAgIyAgMHgwMGE1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhhYScgICAgICMgIDB4MDBhNiAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYScgICAgICMgIDB4MDBhNyAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmYnICAgICAjICAweDAwYTggLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHhkMicgICAgICMgIDB4MDBhOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4YWMnICAgICAjICAweDAwYWEgLT4gTk9UIFNJR04KKyAgICB1J1x4YmQnICAgICAjICAweDAwYWIgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJjJyAgICAgIyAgMHgwMGFjIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhhMScgICAgICMgIDB4MDBhZCAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGFiJyAgICAgIyAgMHgwMGFlIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHgwMGFmIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyNTkxJyAgICMgIDB4MDBiMCAtPiBMSUdIVCBTSEFERQorICAgIHUnXHUyNTkyJyAgICMgIDB4MDBiMSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweDAwYjIgLT4gREFSSyBTSEFERQorICAgIHUnXHUyNTAyJyAgICMgIDB4MDBiMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICB1J1x1MjUyNCcgICAjICAweDAwYjQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NjEnICAgIyAgMHgwMGI1IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NjInICAgIyAgMHgwMGI2IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NTYnICAgIyAgMHgwMGI3IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NScgICAjICAweDAwYjggLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYzJyAgICMgIDB4MDBiOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NTEnICAgIyAgMHgwMGJhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICB1J1x1MjU1NycgICAjICAweDAwYmIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHgwMGJjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x1MjU1YycgICAjICAweDAwYmQgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1YicgICAjICAweDAwYmUgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjUxMCcgICAjICAweDAwYmYgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjUxNCcgICAjICAweDAwYzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4MDBjMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweDAwYzIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUxYycgICAjICAweDAwYzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4MDBjNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4MDBjNSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU1ZScgICAjICAweDAwYzYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NWYnICAgIyAgMHgwMGM3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTVhJyAgICMgIDB4MDBjOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTU0JyAgICMgIDB4MDBjOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHgwMGNhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweDAwY2IgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjAnICAgIyAgMHgwMGNjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHgwMGNkIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4MDBjZSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjcnICAgIyAgMHgwMGNmIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjgnICAgIyAgMHgwMGQwIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NjQnICAgIyAgMHgwMGQxIC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2NScgICAjICAweDAwZDIgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTU5JyAgICMgIDB4MDBkMyAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1OCcgICAjICAweDAwZDQgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTInICAgIyAgMHgwMGQ1IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTMnICAgIyAgMHgwMGQ2IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NmInICAgIyAgMHgwMGQ3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NmEnICAgIyAgMHgwMGQ4IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1MTgnICAgIyAgMHgwMGQ5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTBjJyAgICMgIDB4MDBkYSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU4OCcgICAjICAweDAwZGIgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4MDBkYyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdcdTI1OGMnICAgIyAgMHgwMGRkIC0+IExFRlQgSEFMRiBCTE9DSworICAgIHUnXHUyNTkwJyAgICMgIDB4MDBkZSAtPiBSSUdIVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1ODAnICAgIyAgMHgwMGRmIC0+IFVQUEVSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MDNiMScgICAjICAweDAwZTAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgdSdceGRmJyAgICAgIyAgMHgwMGUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdcdTAzOTMnICAgIyAgMHgwMGUyIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgdSdcdTAzYzAnICAgIyAgMHgwMGUzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHUwM2EzJyAgICMgIDB4MDBlNCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIHUnXHUwM2MzJyAgICMgIDB4MDBlNSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICB1J1x4YjUnICAgICAjICAweDAwZTYgLT4gTUlDUk8gU0lHTgorICAgIHUnXHUwM2M0JyAgICMgIDB4MDBlNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgdSdcdTAzYTYnICAgIyAgMHgwMGU4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIHUnXHUwMzk4JyAgICMgIDB4MDBlOSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwM2E5JyAgICMgIDB4MDBlYSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwM2I0JyAgICMgIDB4MDBlYiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MjIxZScgICAjICAweDAwZWMgLT4gSU5GSU5JVFkKKyAgICB1J1x1MDNjNicgICAjICAweDAwZWQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIHUnXHUwM2I1JyAgICMgIDB4MDBlZSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIHUnXHUyMjI5JyAgICMgIDB4MDBlZiAtPiBJTlRFUlNFQ1RJT04KKyAgICB1J1x1MjI2MScgICAjICAweDAwZjAgLT4gSURFTlRJQ0FMIFRPCisgICAgdSdceGIxJyAgICAgIyAgMHgwMGYxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMjY1JyAgICMgIDB4MDBmMiAtPiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NCcgICAjICAweDAwZjMgLT4gTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIzMjAnICAgIyAgMHgwMGY0IC0+IFRPUCBIQUxGIElOVEVHUkFMCisgICAgdSdcdTIzMjEnICAgIyAgMHgwMGY1IC0+IEJPVFRPTSBIQUxGIElOVEVHUkFMCisgICAgdSdceGY3JyAgICAgIyAgMHgwMGY2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjI0OCcgICAjICAweDAwZjcgLT4gQUxNT1NUIEVRVUFMIFRPCisgICAgdSdceGIwJyAgICAgIyAgMHgwMGY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdcdTIyMTknICAgIyAgMHgwMGY5IC0+IEJVTExFVCBPUEVSQVRPUgorICAgIHUnXHhiNycgICAgICMgIDB4MDBmYSAtPiBNSURETEUgRE9UCisgICAgdSdcdTIyMWEnICAgIyAgMHgwMGZiIC0+IFNRVUFSRSBST09UCisgICAgdSdcdTIwN2YnICAgIyAgMHgwMGZjIC0+IFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdceGIyJyAgICAgIyAgMHgwMGZkIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHUyNWEwJyAgICMgIDB4MDBmZSAtPiBCTEFDSyBTUVVBUkUKKyAgICB1J1x4YTAnICAgICAjICAweDAwZmYgLT4gTk8tQlJFQUsgU1BBQ0UKKykKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSB7CisgICAgMHgwMDAwOiAweDAwMDAsICAgICAjICBOVUxMCisgICAgMHgwMDAxOiAweDAwMDEsICAgICAjICBTVEFSVCBPRiBIRUFESU5HCisgICAgMHgwMDAyOiAweDAwMDIsICAgICAjICBTVEFSVCBPRiBURVhUCisgICAgMHgwMDAzOiAweDAwMDMsICAgICAjICBFTkQgT0YgVEVYVAorICAgIDB4MDAwNDogMHgwMDA0LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIDB4MDAwNTogMHgwMDA1LCAgICAgIyAgRU5RVUlSWQorICAgIDB4MDAwNjogMHgwMDA2LCAgICAgIyAgQUNLTk9XTEVER0UKKyAgICAweDAwMDc6IDB4MDAwNywgICAgICMgIEJFTEwKKyAgICAweDAwMDg6IDB4MDAwOCwgICAgICMgIEJBQ0tTUEFDRQorICAgIDB4MDAwOTogMHgwMDA5LCAgICAgIyAgSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBhOiAweDAwMGEsICAgICAjICBMSU5FIEZFRUQKKyAgICAweDAwMGI6IDB4MDAwYiwgICAgICMgIFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICAweDAwMGM6IDB4MDAwYywgICAgICMgIEZPUk0gRkVFRAorICAgIDB4MDAwZDogMHgwMDBkLCAgICAgIyAgQ0FSUklBR0UgUkVUVVJOCisgICAgMHgwMDBlOiAweDAwMGUsICAgICAjICBTSElGVCBPVVQKKyAgICAweDAwMGY6IDB4MDAwZiwgICAgICMgIFNISUZUIElOCisgICAgMHgwMDEwOiAweDAwMTAsICAgICAjICBEQVRBIExJTksgRVNDQVBFCisgICAgMHgwMDExOiAweDAwMTEsICAgICAjICBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICAweDAwMTI6IDB4MDAxMiwgICAgICMgIERFVklDRSBDT05UUk9MIFRXTworICAgIDB4MDAxMzogMHgwMDEzLCAgICAgIyAgREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICAweDAwMTQ6IDB4MDAxNCwgICAgICMgIERFVklDRSBDT05UUk9MIEZPVVIKKyAgICAweDAwMTU6IDB4MDAxNSwgICAgICMgIE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgMHgwMDE2OiAweDAwMTYsICAgICAjICBTWU5DSFJPTk9VUyBJRExFCisgICAgMHgwMDE3OiAweDAwMTcsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgMHgwMDE4OiAweDAwMTgsICAgICAjICBDQU5DRUwKKyAgICAweDAwMTk6IDB4MDAxOSwgICAgICMgIEVORCBPRiBNRURJVU0KKyAgICAweDAwMWE6IDB4MDAxYSwgICAgICMgIFNVQlNUSVRVVEUKKyAgICAweDAwMWI6IDB4MDAxYiwgICAgICMgIEVTQ0FQRQorICAgIDB4MDAxYzogMHgwMDFjLCAgICAgIyAgRklMRSBTRVBBUkFUT1IKKyAgICAweDAwMWQ6IDB4MDAxZCwgICAgICMgIEdST1VQIFNFUEFSQVRPUgorICAgIDB4MDAxZTogMHgwMDFlLCAgICAgIyAgUkVDT1JEIFNFUEFSQVRPUgorICAgIDB4MDAxZjogMHgwMDFmLCAgICAgIyAgVU5JVCBTRVBBUkFUT1IKKyAgICAweDAwMjA6IDB4MDAyMCwgICAgICMgIFNQQUNFCisgICAgMHgwMDIxOiAweDAwMjEsICAgICAjICBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMDIyOiAweDAwMjIsICAgICAjICBRVU9UQVRJT04gTUFSSworICAgIDB4MDAyMzogMHgwMDIzLCAgICAgIyAgTlVNQkVSIFNJR04KKyAgICAweDAwMjQ6IDB4MDAyNCwgICAgICMgIERPTExBUiBTSUdOCisgICAgMHgwMDI1OiAweDAwMjUsICAgICAjICBQRVJDRU5UIFNJR04KKyAgICAweDAwMjY6IDB4MDAyNiwgICAgICMgIEFNUEVSU0FORAorICAgIDB4MDAyNzogMHgwMDI3LCAgICAgIyAgQVBPU1RST1BIRQorICAgIDB4MDAyODogMHgwMDI4LCAgICAgIyAgTEVGVCBQQVJFTlRIRVNJUworICAgIDB4MDAyOTogMHgwMDI5LCAgICAgIyAgUklHSFQgUEFSRU5USEVTSVMKKyAgICAweDAwMmE6IDB4MDAyYSwgICAgICMgIEFTVEVSSVNLCisgICAgMHgwMDJiOiAweDAwMmIsICAgICAjICBQTFVTIFNJR04KKyAgICAweDAwMmM6IDB4MDAyYywgICAgICMgIENPTU1BCisgICAgMHgwMDJkOiAweDAwMmQsICAgICAjICBIWVBIRU4tTUlOVVMKKyAgICAweDAwMmU6IDB4MDAyZSwgICAgICMgIEZVTEwgU1RPUAorICAgIDB4MDAyZjogMHgwMDJmLCAgICAgIyAgU09MSURVUworICAgIDB4MDAzMDogMHgwMDMwLCAgICAgIyAgRElHSVQgWkVSTworICAgIDB4MDAzMTogMHgwMDMxLCAgICAgIyAgRElHSVQgT05FCisgICAgMHgwMDMyOiAweDAwMzIsICAgICAjICBESUdJVCBUV08KKyAgICAweDAwMzM6IDB4MDAzMywgICAgICMgIERJR0lUIFRIUkVFCisgICAgMHgwMDM0OiAweDAwMzQsICAgICAjICBESUdJVCBGT1VSCisgICAgMHgwMDM1OiAweDAwMzUsICAgICAjICBESUdJVCBGSVZFCisgICAgMHgwMDM2OiAweDAwMzYsICAgICAjICBESUdJVCBTSVgKKyAgICAweDAwMzc6IDB4MDAzNywgICAgICMgIERJR0lUIFNFVkVOCisgICAgMHgwMDM4OiAweDAwMzgsICAgICAjICBESUdJVCBFSUdIVAorICAgIDB4MDAzOTogMHgwMDM5LCAgICAgIyAgRElHSVQgTklORQorICAgIDB4MDAzYTogMHgwMDNhLCAgICAgIyAgQ09MT04KKyAgICAweDAwM2I6IDB4MDAzYiwgICAgICMgIFNFTUlDT0xPTgorICAgIDB4MDAzYzogMHgwMDNjLCAgICAgIyAgTEVTUy1USEFOIFNJR04KKyAgICAweDAwM2Q6IDB4MDAzZCwgICAgICMgIEVRVUFMUyBTSUdOCisgICAgMHgwMDNlOiAweDAwM2UsICAgICAjICBHUkVBVEVSLVRIQU4gU0lHTgorICAgIDB4MDAzZjogMHgwMDNmLCAgICAgIyAgUVVFU1RJT04gTUFSSworICAgIDB4MDA0MDogMHgwMDQwLCAgICAgIyAgQ09NTUVSQ0lBTCBBVAorICAgIDB4MDA0MTogMHgwMDQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIDB4MDA0MjogMHgwMDQyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIDB4MDA0MzogMHgwMDQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIDB4MDA0NDogMHgwMDQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIDB4MDA0NTogMHgwMDQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIDB4MDA0NjogMHgwMDQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIDB4MDA0NzogMHgwMDQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIDB4MDA0ODogMHgwMDQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIDB4MDA0OTogMHgwMDQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIDB4MDA0YTogMHgwMDRhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIDB4MDA0YjogMHgwMDRiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIDB4MDA0YzogMHgwMDRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIDB4MDA0ZDogMHgwMDRkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIDB4MDA0ZTogMHgwMDRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIDB4MDA0ZjogMHgwMDRmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIDB4MDA1MDogMHgwMDUwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIDB4MDA1MTogMHgwMDUxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIDB4MDA1MjogMHgwMDUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIDB4MDA1MzogMHgwMDUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIDB4MDA1NDogMHgwMDU0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIDB4MDA1NTogMHgwMDU1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDA1NjogMHgwMDU2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIDB4MDA1NzogMHgwMDU3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIDB4MDA1ODogMHgwMDU4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIDB4MDA1OTogMHgwMDU5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIDB4MDA1YTogMHgwMDVhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIDB4MDA1YjogMHgwMDViLCAgICAgIyAgTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1YzogMHgwMDVjLCAgICAgIyAgUkVWRVJTRSBTT0xJRFVTCisgICAgMHgwMDVkOiAweDAwNWQsICAgICAjICBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1ZTogMHgwMDVlLCAgICAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICAweDAwNWY6IDB4MDA1ZiwgICAgICMgIExPVyBMSU5FCisgICAgMHgwMDYwOiAweDAwNjAsICAgICAjICBHUkFWRSBBQ0NFTlQKKyAgICAweDAwNjE6IDB4MDA2MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgMHgwMDYyOiAweDAwNjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIDB4MDA2MzogMHgwMDYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICAweDAwNjQ6IDB4MDA2NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBECisgICAgMHgwMDY1OiAweDAwNjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIDB4MDA2NjogMHgwMDY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICAweDAwNjc6IDB4MDA2NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgMHgwMDY4OiAweDAwNjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIDB4MDA2OTogMHgwMDY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICAweDAwNmE6IDB4MDA2YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgMHgwMDZiOiAweDAwNmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIDB4MDA2YzogMHgwMDZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICAweDAwNmQ6IDB4MDA2ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgMHgwMDZlOiAweDAwNmUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDA2ZjogMHgwMDZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICAweDAwNzA6IDB4MDA3MCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgMHgwMDcxOiAweDAwNzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIDB4MDA3MjogMHgwMDcyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICAweDAwNzM6IDB4MDA3MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgMHgwMDc0OiAweDAwNzQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIDB4MDA3NTogMHgwMDc1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICAweDAwNzY6IDB4MDA3NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgMHgwMDc3OiAweDAwNzcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIDB4MDA3ODogMHgwMDc4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICAweDAwNzk6IDB4MDA3OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgMHgwMDdhOiAweDAwN2EsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIDB4MDA3YjogMHgwMDdiLCAgICAgIyAgTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdjOiAweDAwN2MsICAgICAjICBWRVJUSUNBTCBMSU5FCisgICAgMHgwMDdkOiAweDAwN2QsICAgICAjICBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdlOiAweDAwN2UsICAgICAjICBUSUxERQorICAgIDB4MDA3ZjogMHgwMDdmLCAgICAgIyAgREVMRVRFCisgICAgMHgwMGEwOiAweDAwZmYsICAgICAjICBOTy1CUkVBSyBTUEFDRQorICAgIDB4MDBhMTogMHgwMGFkLCAgICAgIyAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDBhMjogMHgwMDliLCAgICAgIyAgQ0VOVCBTSUdOCisgICAgMHgwMGEzOiAweDAwOWMsICAgICAjICBQT1VORCBTSUdOCisgICAgMHgwMGFhOiAweDAwYTYsICAgICAjICBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBhYjogMHgwMGFlLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWM6IDB4MDBhYSwgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGIwOiAweDAwZjgsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiMTogMHgwMGYxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGIyOiAweDAwZmQsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwYjU6IDB4MDBlNiwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwYjc6IDB4MDBmYSwgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwYmE6IDB4MDBhNywgICAgICMgIE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBiYjogMHgwMGFmLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGJjOiAweDAwYWMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICAweDAwYmQ6IDB4MDBhYiwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBiZjogMHgwMGE4LCAgICAgIyAgSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIDB4MDBjMDogMHgwMDkxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMGMxOiAweDAwODYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwYzI6IDB4MDA4ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGMzOiAweDAwOGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAweDAwYzc6IDB4MDA4MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGM4OiAweDAwOTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICAweDAwYzk6IDB4MDA5MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDBjYTogMHgwMDg5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwY2M6IDB4MDA5OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIDB4MDBjZDogMHgwMDhiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGQxOiAweDAwYTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwZDI6IDB4MDBhOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDBkMzogMHgwMDlmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGQ0OiAweDAwOGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBkNTogMHgwMDk5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGQ5OiAweDAwOWQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwZGE6IDB4MDA5NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBkYzogMHgwMDlhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkZjogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTA6IDB4MDA4NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwZTE6IDB4MDBhMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwZTI6IDB4MDA4MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlMzogMHgwMDg0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIDB4MDBlNzogMHgwMDg3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGU4OiAweDAwOGEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGU5OiAweDAwODIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGVhOiAweDAwODgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWM6IDB4MDA4ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICAweDAwZWQ6IDB4MDBhMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwZjE6IDB4MDBhNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwZjI6IDB4MDA5NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAweDAwZjM6IDB4MDBhMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZjQ6IDB4MDA5MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBmNTogMHgwMDk0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIDB4MDBmNzogMHgwMGY2LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmOTogMHgwMDk3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDBmYTogMHgwMGEzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBmYzogMHgwMDgxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAzOTM6IDB4MDBlMiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMzk4OiAweDAwZTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIDB4MDNhMzogMHgwMGU0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICAweDAzYTY6IDB4MDBlOCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIDB4MDNhOTogMHgwMGVhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICAweDAzYjE6IDB4MDBlMCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDNiNDogMHgwMGViLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwM2I1OiAweDAwZWUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDNjMDogMHgwMGUzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwM2MzOiAweDAwZTUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAzYzQ6IDB4MDBlNywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICAweDAzYzY6IDB4MDBlZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICAweDIwN2Y6IDB4MDBmYywgICAgICMgIFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgyMGE3OiAweDAwOWUsICAgICAjICBQRVNFVEEgU0lHTgorICAgIDB4MjIxOTogMHgwMGY5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgyMjFhOiAweDAwZmIsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MjIxZTogMHgwMGVjLCAgICAgIyAgSU5GSU5JVFkKKyAgICAweDIyMjk6IDB4MDBlZiwgICAgICMgIElOVEVSU0VDVElPTgorICAgIDB4MjI0ODogMHgwMGY3LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgyMjYxOiAweDAwZjAsICAgICAjICBJREVOVElDQUwgVE8KKyAgICAweDIyNjQ6IDB4MDBmMywgICAgICMgIExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MjI2NTogMHgwMGYyLCAgICAgIyAgR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgyMzIwOiAweDAwZjQsICAgICAjICBUT1AgSEFMRiBJTlRFR1JBTAorICAgIDB4MjMyMTogMHgwMGY1LCAgICAgIyAgQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICAweDI1MDA6IDB4MDBjNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwYjMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDI1MGM6IDB4MDBkYSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMGJmLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDBjMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDI1MTg6IDB4MDBkOSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMGMzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMGI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTJjOiAweDAwYzIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMGMxLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwYzUsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NTA6IDB4MDBjZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MjU1MTogMHgwMGJhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MjU1MjogMHgwMGQ1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NTM6IDB4MDBkNiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTU0OiAweDAwYzksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTU1OiAweDAwYjgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTU2OiAweDAwYjcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTU3OiAweDAwYmIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDI1NTg6IDB4MDBkNCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1OTogMHgwMGQzLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTVhOiAweDAwYzgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MjU1YjogMHgwMGJlLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NWM6IDB4MDBiZCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTVkOiAweDAwYmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgyNTVlOiAweDAwYzYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NWY6IDB4MDBjNywgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU2MDogMHgwMGNjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1NjE6IDB4MDBiNSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTYyOiAweDAwYjYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU2MzogMHgwMGI5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjU2NDogMHgwMGQxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2NTogMHgwMGQyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2NjogMHgwMGNiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTY3OiAweDAwY2YsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2ODogMHgwMGQwLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1Njk6IDB4MDBjYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NmE6IDB4MDBkOCwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTZiOiAweDAwZDcsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2YzogMHgwMGNlLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU4MDogMHgwMGRmLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MjU4NDogMHgwMGRjLCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MjU4ODogMHgwMGRiLCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MjU4YzogMHgwMGRkLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgyNTkwOiAweDAwZGUsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgyNTkxOiAweDAwYjAsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MjU5MjogMHgwMGIxLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgyNTkzOiAweDAwYjIsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgyNWEwOiAweDAwZmUsICAgICAjICBCTEFDSyBTUVVBUkUKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYwLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODMwOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYwLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODMwOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYxLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzOWI1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYxLnB5CkBAIC0wLDAgKzEsNjk4IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL01JQ1NGVC9QQy9DUDg2MS5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwODYxJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDA4MDogMHgwMGM3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwODE6IDB4MDBmYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDgyOiAweDAwZTksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDgzOiAweDAwZTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODQ6IDB4MDBlNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDg1OiAweDAwZTAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMDg2OiAweDAwZTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwODc6IDB4MDBlNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4ODogMHgwMGVhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDg5OiAweDAwZWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4YTogMHgwMGU4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDA4YjogMHgwMGQwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRICisgICAgMHgwMDhjOiAweDAwZjAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRVRICisgICAgMHgwMDhkOiAweDAwZGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STgorICAgIDB4MDA4ZTogMHgwMGM0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4ZjogMHgwMGM1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwOTA6IDB4MDBjOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA5MTogMHgwMGU2LCAgICAgIyAgTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICAweDAwOTI6IDB4MDBjNiwgICAgICMgIExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICAweDAwOTM6IDB4MDBmNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5NDogMHgwMGY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOTU6IDB4MDBmZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUSE9STgorICAgIDB4MDA5NjogMHgwMGZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk3OiAweDAwZGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAwOTg6IDB4MDBmZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAwOTk6IDB4MDBkNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWE6IDB4MDBkYywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWI6IDB4MDBmOCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgMHgwMDljOiAweDAwYTMsICAgICAjICBQT1VORCBTSUdOCisgICAgMHgwMDlkOiAweDAwZDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgMHgwMDllOiAweDIwYTcsICAgICAjICBQRVNFVEEgU0lHTgorICAgIDB4MDA5ZjogMHgwMTkyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgMHgwMGEwOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGExOiAweDAwZWQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGEyOiAweDAwZjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGEzOiAweDAwZmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGE0OiAweDAwYzEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwYTU6IDB4MDBjZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBhNjogMHgwMGQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGE3OiAweDAwZGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwYTg6IDB4MDBiZiwgICAgICMgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICAweDAwYTk6IDB4MjMxMCwgICAgICMgIFJFVkVSU0VEIE5PVCBTSUdOCisgICAgMHgwMGFhOiAweDAwYWMsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDBhYjogMHgwMGJkLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgMHgwMGFjOiAweDAwYmMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICAweDAwYWQ6IDB4MDBhMSwgICAgICMgIElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwYWU6IDB4MDBhYiwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFmOiAweDAwYmIsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYjA6IDB4MjU5MSwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgwMGIxOiAweDI1OTIsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDAwYjI6IDB4MjU5MywgICAgICMgIERBUksgU0hBREUKKyAgICAweDAwYjM6IDB4MjUwMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MDBiNDogMHgyNTI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGI1OiAweDI1NjEsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiNjogMHgyNTYyLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYjc6IDB4MjU1NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYjg6IDB4MjU1NSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYjk6IDB4MjU2MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYmE6IDB4MjU1MSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDAwYmI6IDB4MjU1NywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBiYzogMHgyNTVkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MDBiZDogMHgyNTVjLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYmU6IDB4MjU1YiwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGJmOiAweDI1MTAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBjMDogMHgyNTE0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MDBjMTogMHgyNTM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMyOiAweDI1MmMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMzogMHgyNTFjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjNDogMHgyNTAwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDAwYzU6IDB4MjUzYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjNjogMHgyNTVlLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGM3OiAweDI1NWYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwYzg6IDB4MjU1YSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgwMGM5OiAweDI1NTQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGNhOiAweDI1NjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNiOiAweDI1NjYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2M6IDB4MjU2MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGNkOiAweDI1NTAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDAwY2U6IDB4MjU2YywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2Y6IDB4MjU2NywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQwOiAweDI1NjgsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkMTogMHgyNTY0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkMjogMHgyNTY1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkMzogMHgyNTU5LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGQ0OiAweDI1NTgsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwZDU6IDB4MjU1MiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGQ2OiAweDI1NTMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBkNzogMHgyNTZiLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDg6IDB4MjU2YSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQ5OiAweDI1MTgsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDAwZGE6IDB4MjUwYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MDBkYjogMHgyNTg4LCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MDBkYzogMHgyNTg0LCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MDBkZDogMHgyNThjLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgwMGRlOiAweDI1OTAsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgwMGRmOiAweDI1ODAsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgwMGUwOiAweDAzYjEsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICAweDAwZTE6IDB4MDBkZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgMHgwMGUyOiAweDAzOTMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIDB4MDBlMzogMHgwM2MwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwMGU0OiAweDAzYTMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIDB4MDBlNTogMHgwM2MzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgMHgwMGU2OiAweDAwYjUsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGU3OiAweDAzYzQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgMHgwMGU4OiAweDAzYTYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICAweDAwZTk6IDB4MDM5OCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgMHgwMGVhOiAweDAzYTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIDB4MDBlYjogMHgwM2I0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwMGVjOiAweDIyMWUsICAgICAjICBJTkZJTklUWQorICAgIDB4MDBlZDogMHgwM2M2LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIDB4MDBlZTogMHgwM2I1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICAweDAwZWY6IDB4MjIyOSwgICAgICMgIElOVEVSU0VDVElPTgorICAgIDB4MDBmMDogMHgyMjYxLCAgICAgIyAgSURFTlRJQ0FMIFRPCisgICAgMHgwMGYxOiAweDAwYjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwZjI6IDB4MjI2NSwgICAgICMgIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MDBmMzogMHgyMjY0LCAgICAgIyAgTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgwMGY0OiAweDIzMjAsICAgICAjICBUT1AgSEFMRiBJTlRFR1JBTAorICAgIDB4MDBmNTogMHgyMzIxLCAgICAgIyAgQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICAweDAwZjY6IDB4MDBmNywgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAwZjc6IDB4MjI0OCwgICAgICMgIEFMTU9TVCBFUVVBTCBUTworICAgIDB4MDBmODogMHgwMGIwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwZjk6IDB4MjIxOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MDBmYTogMHgwMGI3LCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBmYjogMHgyMjFhLCAgICAgIyAgU1FVQVJFIFJPT1QKKyAgICAweDAwZmM6IDB4MjA3ZiwgICAgICMgIFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMGZkOiAweDAwYjIsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwZmU6IDB4MjVhMCwgICAgICMgIEJMQUNLIFNRVUFSRQorICAgIDB4MDBmZjogMHgwMGEwLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKK30pCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwMDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDAwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAwMDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDAwMDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDAwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwMDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwMDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDAwMDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwMDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MDAwYSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDAwMGIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MDAwYyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDAwMGQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwMDBlIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MDAwZiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MDAxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgwMDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MDAxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDAwMTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDAwMTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MDAxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MDAxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgwMDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDAwMTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgwMDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDAwMWEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MDAxYiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDAwMWMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDAwMWQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgwMDFlIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDAwMWYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDAwMjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDAwMjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MDAyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MDAyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MDAyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MDAyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDAwMjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgwMDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDAwMjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MDAyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MDAyYSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MDAyYiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDAwMmMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDAwMmQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgwMDJlIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MDAyZiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgwMDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDAwMzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgwMDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MDAzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MDAzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgwMDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDAwMzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgwMDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgwMDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgwMDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDAwM2EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDAwM2IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgwMDNjIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgwMDNkIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgwMDNlIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgwMDNmIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDAwNDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4MDA0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHgwMDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDAwNDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4MDA0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHgwMDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDAwNDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4MDA0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHgwMDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDAwNDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4MDA0YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHgwMDRiIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDAwNGMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4MDA0ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHgwMDRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDAwNGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4MDA1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHgwMDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDAwNTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4MDA1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHgwMDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDAwNTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4MDA1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHgwMDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDAwNTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4MDA1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHgwMDVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDAwNWIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4MDA1YyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDAwNWQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDAwNWUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDAwNWYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDAwNjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHgwMDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHgwMDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHgwMDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHgwMDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHgwMDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHgwMDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHgwMDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHgwMDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHgwMDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHgwMDZhIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHgwMDZiIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHgwMDZjIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHgwMDZkIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHgwMDZlIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHgwMDZmIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHgwMDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHgwMDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHgwMDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHgwMDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHgwMDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHgwMDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHgwMDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHgwMDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHgwMDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHgwMDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHgwMDdhIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHgwMDdiIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4MDA3YyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHgwMDdkIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDAwN2UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDAwN2YgLT4gREVMRVRFCisgICAgdSdceGM3JyAgICAgIyAgMHgwMDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGZjJyAgICAgIyAgMHgwMDgxIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU5JyAgICAgIyAgMHgwMDgyIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTInICAgICAjICAweDAwODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU0JyAgICAgIyAgMHgwMDg0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUwJyAgICAgIyAgMHgwMDg1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTUnICAgICAjICAweDAwODYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU3JyAgICAgIyAgMHgwMDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlYScgICAgICMgIDB4MDA4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweDAwODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTgnICAgICAjICAweDAwOGEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhkMCcgICAgICMgIDB4MDA4YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEgKKyAgICB1J1x4ZjAnICAgICAjICAweDAwOGMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEVUSAorICAgIHUnXHhkZScgICAgICMgIDB4MDA4ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STgorICAgIHUnXHhjNCcgICAgICMgIDB4MDA4ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHgwMDhmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGM5JyAgICAgIyAgMHgwMDkwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlNicgICAgICMgIDB4MDA5MSAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIHUnXHhjNicgICAgICMgIDB4MDA5MiAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgdSdceGY0JyAgICAgIyAgMHgwMDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNicgICAgICMgIDB4MDA5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmZScgICAgICMgIDB4MDA5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVEhPUk4KKyAgICB1J1x4ZmInICAgICAjICAweDAwOTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGRkJyAgICAgIyAgMHgwMDk3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhmZCcgICAgICMgIDB4MDA5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGQ2JyAgICAgIyAgMHgwMDk5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGMnICAgICAjICAweDAwOWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmOCcgICAgICMgIDB4MDA5YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhhMycgICAgICMgIDB4MDA5YyAtPiBQT1VORCBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHgwMDlkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x1MjBhNycgICAjICAweDAwOWUgLT4gUEVTRVRBIFNJR04KKyAgICB1J1x1MDE5MicgICAjICAweDAwOWYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdceGUxJyAgICAgIyAgMHgwMGEwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZWQnICAgICAjICAweDAwYTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhmMycgICAgICMgIDB4MDBhMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGZhJyAgICAgIyAgMHgwMGEzIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4YzEnICAgICAjICAweDAwYTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGNkJyAgICAgIyAgMHgwMGE1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhkMycgICAgICMgIDB4MDBhNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZGEnICAgICAjICAweDAwYTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGJmJyAgICAgIyAgMHgwMGE4IC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x1MjMxMCcgICAjICAweDAwYTkgLT4gUkVWRVJTRUQgTk9UIFNJR04KKyAgICB1J1x4YWMnICAgICAjICAweDAwYWEgLT4gTk9UIFNJR04KKyAgICB1J1x4YmQnICAgICAjICAweDAwYWIgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJjJyAgICAgIyAgMHgwMGFjIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhhMScgICAgICMgIDB4MDBhZCAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGFiJyAgICAgIyAgMHgwMGFlIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHgwMGFmIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyNTkxJyAgICMgIDB4MDBiMCAtPiBMSUdIVCBTSEFERQorICAgIHUnXHUyNTkyJyAgICMgIDB4MDBiMSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweDAwYjIgLT4gREFSSyBTSEFERQorICAgIHUnXHUyNTAyJyAgICMgIDB4MDBiMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICB1J1x1MjUyNCcgICAjICAweDAwYjQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NjEnICAgIyAgMHgwMGI1IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NjInICAgIyAgMHgwMGI2IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NTYnICAgIyAgMHgwMGI3IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NScgICAjICAweDAwYjggLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYzJyAgICMgIDB4MDBiOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NTEnICAgIyAgMHgwMGJhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICB1J1x1MjU1NycgICAjICAweDAwYmIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHgwMGJjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x1MjU1YycgICAjICAweDAwYmQgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1YicgICAjICAweDAwYmUgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjUxMCcgICAjICAweDAwYmYgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjUxNCcgICAjICAweDAwYzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4MDBjMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweDAwYzIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUxYycgICAjICAweDAwYzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4MDBjNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4MDBjNSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU1ZScgICAjICAweDAwYzYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NWYnICAgIyAgMHgwMGM3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTVhJyAgICMgIDB4MDBjOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTU0JyAgICMgIDB4MDBjOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHgwMGNhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweDAwY2IgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjAnICAgIyAgMHgwMGNjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHgwMGNkIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4MDBjZSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjcnICAgIyAgMHgwMGNmIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjgnICAgIyAgMHgwMGQwIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NjQnICAgIyAgMHgwMGQxIC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2NScgICAjICAweDAwZDIgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTU5JyAgICMgIDB4MDBkMyAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1OCcgICAjICAweDAwZDQgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTInICAgIyAgMHgwMGQ1IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTMnICAgIyAgMHgwMGQ2IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NmInICAgIyAgMHgwMGQ3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NmEnICAgIyAgMHgwMGQ4IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1MTgnICAgIyAgMHgwMGQ5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTBjJyAgICMgIDB4MDBkYSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU4OCcgICAjICAweDAwZGIgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4MDBkYyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdcdTI1OGMnICAgIyAgMHgwMGRkIC0+IExFRlQgSEFMRiBCTE9DSworICAgIHUnXHUyNTkwJyAgICMgIDB4MDBkZSAtPiBSSUdIVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1ODAnICAgIyAgMHgwMGRmIC0+IFVQUEVSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MDNiMScgICAjICAweDAwZTAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgdSdceGRmJyAgICAgIyAgMHgwMGUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdcdTAzOTMnICAgIyAgMHgwMGUyIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgdSdcdTAzYzAnICAgIyAgMHgwMGUzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHUwM2EzJyAgICMgIDB4MDBlNCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIHUnXHUwM2MzJyAgICMgIDB4MDBlNSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICB1J1x4YjUnICAgICAjICAweDAwZTYgLT4gTUlDUk8gU0lHTgorICAgIHUnXHUwM2M0JyAgICMgIDB4MDBlNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgdSdcdTAzYTYnICAgIyAgMHgwMGU4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIHUnXHUwMzk4JyAgICMgIDB4MDBlOSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwM2E5JyAgICMgIDB4MDBlYSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwM2I0JyAgICMgIDB4MDBlYiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MjIxZScgICAjICAweDAwZWMgLT4gSU5GSU5JVFkKKyAgICB1J1x1MDNjNicgICAjICAweDAwZWQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIHUnXHUwM2I1JyAgICMgIDB4MDBlZSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIHUnXHUyMjI5JyAgICMgIDB4MDBlZiAtPiBJTlRFUlNFQ1RJT04KKyAgICB1J1x1MjI2MScgICAjICAweDAwZjAgLT4gSURFTlRJQ0FMIFRPCisgICAgdSdceGIxJyAgICAgIyAgMHgwMGYxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMjY1JyAgICMgIDB4MDBmMiAtPiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NCcgICAjICAweDAwZjMgLT4gTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIzMjAnICAgIyAgMHgwMGY0IC0+IFRPUCBIQUxGIElOVEVHUkFMCisgICAgdSdcdTIzMjEnICAgIyAgMHgwMGY1IC0+IEJPVFRPTSBIQUxGIElOVEVHUkFMCisgICAgdSdceGY3JyAgICAgIyAgMHgwMGY2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjI0OCcgICAjICAweDAwZjcgLT4gQUxNT1NUIEVRVUFMIFRPCisgICAgdSdceGIwJyAgICAgIyAgMHgwMGY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdcdTIyMTknICAgIyAgMHgwMGY5IC0+IEJVTExFVCBPUEVSQVRPUgorICAgIHUnXHhiNycgICAgICMgIDB4MDBmYSAtPiBNSURETEUgRE9UCisgICAgdSdcdTIyMWEnICAgIyAgMHgwMGZiIC0+IFNRVUFSRSBST09UCisgICAgdSdcdTIwN2YnICAgIyAgMHgwMGZjIC0+IFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdceGIyJyAgICAgIyAgMHgwMGZkIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHUyNWEwJyAgICMgIDB4MDBmZSAtPiBCTEFDSyBTUVVBUkUKKyAgICB1J1x4YTAnICAgICAjICAweDAwZmYgLT4gTk8tQlJFQUsgU1BBQ0UKKykKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSB7CisgICAgMHgwMDAwOiAweDAwMDAsICAgICAjICBOVUxMCisgICAgMHgwMDAxOiAweDAwMDEsICAgICAjICBTVEFSVCBPRiBIRUFESU5HCisgICAgMHgwMDAyOiAweDAwMDIsICAgICAjICBTVEFSVCBPRiBURVhUCisgICAgMHgwMDAzOiAweDAwMDMsICAgICAjICBFTkQgT0YgVEVYVAorICAgIDB4MDAwNDogMHgwMDA0LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIDB4MDAwNTogMHgwMDA1LCAgICAgIyAgRU5RVUlSWQorICAgIDB4MDAwNjogMHgwMDA2LCAgICAgIyAgQUNLTk9XTEVER0UKKyAgICAweDAwMDc6IDB4MDAwNywgICAgICMgIEJFTEwKKyAgICAweDAwMDg6IDB4MDAwOCwgICAgICMgIEJBQ0tTUEFDRQorICAgIDB4MDAwOTogMHgwMDA5LCAgICAgIyAgSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBhOiAweDAwMGEsICAgICAjICBMSU5FIEZFRUQKKyAgICAweDAwMGI6IDB4MDAwYiwgICAgICMgIFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICAweDAwMGM6IDB4MDAwYywgICAgICMgIEZPUk0gRkVFRAorICAgIDB4MDAwZDogMHgwMDBkLCAgICAgIyAgQ0FSUklBR0UgUkVUVVJOCisgICAgMHgwMDBlOiAweDAwMGUsICAgICAjICBTSElGVCBPVVQKKyAgICAweDAwMGY6IDB4MDAwZiwgICAgICMgIFNISUZUIElOCisgICAgMHgwMDEwOiAweDAwMTAsICAgICAjICBEQVRBIExJTksgRVNDQVBFCisgICAgMHgwMDExOiAweDAwMTEsICAgICAjICBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICAweDAwMTI6IDB4MDAxMiwgICAgICMgIERFVklDRSBDT05UUk9MIFRXTworICAgIDB4MDAxMzogMHgwMDEzLCAgICAgIyAgREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICAweDAwMTQ6IDB4MDAxNCwgICAgICMgIERFVklDRSBDT05UUk9MIEZPVVIKKyAgICAweDAwMTU6IDB4MDAxNSwgICAgICMgIE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgMHgwMDE2OiAweDAwMTYsICAgICAjICBTWU5DSFJPTk9VUyBJRExFCisgICAgMHgwMDE3OiAweDAwMTcsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgMHgwMDE4OiAweDAwMTgsICAgICAjICBDQU5DRUwKKyAgICAweDAwMTk6IDB4MDAxOSwgICAgICMgIEVORCBPRiBNRURJVU0KKyAgICAweDAwMWE6IDB4MDAxYSwgICAgICMgIFNVQlNUSVRVVEUKKyAgICAweDAwMWI6IDB4MDAxYiwgICAgICMgIEVTQ0FQRQorICAgIDB4MDAxYzogMHgwMDFjLCAgICAgIyAgRklMRSBTRVBBUkFUT1IKKyAgICAweDAwMWQ6IDB4MDAxZCwgICAgICMgIEdST1VQIFNFUEFSQVRPUgorICAgIDB4MDAxZTogMHgwMDFlLCAgICAgIyAgUkVDT1JEIFNFUEFSQVRPUgorICAgIDB4MDAxZjogMHgwMDFmLCAgICAgIyAgVU5JVCBTRVBBUkFUT1IKKyAgICAweDAwMjA6IDB4MDAyMCwgICAgICMgIFNQQUNFCisgICAgMHgwMDIxOiAweDAwMjEsICAgICAjICBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMDIyOiAweDAwMjIsICAgICAjICBRVU9UQVRJT04gTUFSSworICAgIDB4MDAyMzogMHgwMDIzLCAgICAgIyAgTlVNQkVSIFNJR04KKyAgICAweDAwMjQ6IDB4MDAyNCwgICAgICMgIERPTExBUiBTSUdOCisgICAgMHgwMDI1OiAweDAwMjUsICAgICAjICBQRVJDRU5UIFNJR04KKyAgICAweDAwMjY6IDB4MDAyNiwgICAgICMgIEFNUEVSU0FORAorICAgIDB4MDAyNzogMHgwMDI3LCAgICAgIyAgQVBPU1RST1BIRQorICAgIDB4MDAyODogMHgwMDI4LCAgICAgIyAgTEVGVCBQQVJFTlRIRVNJUworICAgIDB4MDAyOTogMHgwMDI5LCAgICAgIyAgUklHSFQgUEFSRU5USEVTSVMKKyAgICAweDAwMmE6IDB4MDAyYSwgICAgICMgIEFTVEVSSVNLCisgICAgMHgwMDJiOiAweDAwMmIsICAgICAjICBQTFVTIFNJR04KKyAgICAweDAwMmM6IDB4MDAyYywgICAgICMgIENPTU1BCisgICAgMHgwMDJkOiAweDAwMmQsICAgICAjICBIWVBIRU4tTUlOVVMKKyAgICAweDAwMmU6IDB4MDAyZSwgICAgICMgIEZVTEwgU1RPUAorICAgIDB4MDAyZjogMHgwMDJmLCAgICAgIyAgU09MSURVUworICAgIDB4MDAzMDogMHgwMDMwLCAgICAgIyAgRElHSVQgWkVSTworICAgIDB4MDAzMTogMHgwMDMxLCAgICAgIyAgRElHSVQgT05FCisgICAgMHgwMDMyOiAweDAwMzIsICAgICAjICBESUdJVCBUV08KKyAgICAweDAwMzM6IDB4MDAzMywgICAgICMgIERJR0lUIFRIUkVFCisgICAgMHgwMDM0OiAweDAwMzQsICAgICAjICBESUdJVCBGT1VSCisgICAgMHgwMDM1OiAweDAwMzUsICAgICAjICBESUdJVCBGSVZFCisgICAgMHgwMDM2OiAweDAwMzYsICAgICAjICBESUdJVCBTSVgKKyAgICAweDAwMzc6IDB4MDAzNywgICAgICMgIERJR0lUIFNFVkVOCisgICAgMHgwMDM4OiAweDAwMzgsICAgICAjICBESUdJVCBFSUdIVAorICAgIDB4MDAzOTogMHgwMDM5LCAgICAgIyAgRElHSVQgTklORQorICAgIDB4MDAzYTogMHgwMDNhLCAgICAgIyAgQ09MT04KKyAgICAweDAwM2I6IDB4MDAzYiwgICAgICMgIFNFTUlDT0xPTgorICAgIDB4MDAzYzogMHgwMDNjLCAgICAgIyAgTEVTUy1USEFOIFNJR04KKyAgICAweDAwM2Q6IDB4MDAzZCwgICAgICMgIEVRVUFMUyBTSUdOCisgICAgMHgwMDNlOiAweDAwM2UsICAgICAjICBHUkVBVEVSLVRIQU4gU0lHTgorICAgIDB4MDAzZjogMHgwMDNmLCAgICAgIyAgUVVFU1RJT04gTUFSSworICAgIDB4MDA0MDogMHgwMDQwLCAgICAgIyAgQ09NTUVSQ0lBTCBBVAorICAgIDB4MDA0MTogMHgwMDQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIDB4MDA0MjogMHgwMDQyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIDB4MDA0MzogMHgwMDQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIDB4MDA0NDogMHgwMDQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIDB4MDA0NTogMHgwMDQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIDB4MDA0NjogMHgwMDQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIDB4MDA0NzogMHgwMDQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIDB4MDA0ODogMHgwMDQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIDB4MDA0OTogMHgwMDQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIDB4MDA0YTogMHgwMDRhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIDB4MDA0YjogMHgwMDRiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIDB4MDA0YzogMHgwMDRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIDB4MDA0ZDogMHgwMDRkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIDB4MDA0ZTogMHgwMDRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIDB4MDA0ZjogMHgwMDRmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIDB4MDA1MDogMHgwMDUwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIDB4MDA1MTogMHgwMDUxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIDB4MDA1MjogMHgwMDUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIDB4MDA1MzogMHgwMDUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIDB4MDA1NDogMHgwMDU0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIDB4MDA1NTogMHgwMDU1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDA1NjogMHgwMDU2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIDB4MDA1NzogMHgwMDU3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIDB4MDA1ODogMHgwMDU4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIDB4MDA1OTogMHgwMDU5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIDB4MDA1YTogMHgwMDVhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIDB4MDA1YjogMHgwMDViLCAgICAgIyAgTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1YzogMHgwMDVjLCAgICAgIyAgUkVWRVJTRSBTT0xJRFVTCisgICAgMHgwMDVkOiAweDAwNWQsICAgICAjICBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1ZTogMHgwMDVlLCAgICAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICAweDAwNWY6IDB4MDA1ZiwgICAgICMgIExPVyBMSU5FCisgICAgMHgwMDYwOiAweDAwNjAsICAgICAjICBHUkFWRSBBQ0NFTlQKKyAgICAweDAwNjE6IDB4MDA2MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgMHgwMDYyOiAweDAwNjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIDB4MDA2MzogMHgwMDYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICAweDAwNjQ6IDB4MDA2NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBECisgICAgMHgwMDY1OiAweDAwNjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIDB4MDA2NjogMHgwMDY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICAweDAwNjc6IDB4MDA2NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgMHgwMDY4OiAweDAwNjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIDB4MDA2OTogMHgwMDY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICAweDAwNmE6IDB4MDA2YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgMHgwMDZiOiAweDAwNmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIDB4MDA2YzogMHgwMDZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICAweDAwNmQ6IDB4MDA2ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgMHgwMDZlOiAweDAwNmUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDA2ZjogMHgwMDZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICAweDAwNzA6IDB4MDA3MCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgMHgwMDcxOiAweDAwNzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIDB4MDA3MjogMHgwMDcyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICAweDAwNzM6IDB4MDA3MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgMHgwMDc0OiAweDAwNzQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIDB4MDA3NTogMHgwMDc1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICAweDAwNzY6IDB4MDA3NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgMHgwMDc3OiAweDAwNzcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIDB4MDA3ODogMHgwMDc4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICAweDAwNzk6IDB4MDA3OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgMHgwMDdhOiAweDAwN2EsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIDB4MDA3YjogMHgwMDdiLCAgICAgIyAgTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdjOiAweDAwN2MsICAgICAjICBWRVJUSUNBTCBMSU5FCisgICAgMHgwMDdkOiAweDAwN2QsICAgICAjICBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdlOiAweDAwN2UsICAgICAjICBUSUxERQorICAgIDB4MDA3ZjogMHgwMDdmLCAgICAgIyAgREVMRVRFCisgICAgMHgwMGEwOiAweDAwZmYsICAgICAjICBOTy1CUkVBSyBTUEFDRQorICAgIDB4MDBhMTogMHgwMGFkLCAgICAgIyAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDBhMzogMHgwMDljLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDBhYjogMHgwMGFlLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWM6IDB4MDBhYSwgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGIwOiAweDAwZjgsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiMTogMHgwMGYxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGIyOiAweDAwZmQsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwYjU6IDB4MDBlNiwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwYjc6IDB4MDBmYSwgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwYmI6IDB4MDBhZiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiYzogMHgwMGFjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGJkOiAweDAwYWIsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYmY6IDB4MDBhOCwgICAgICMgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICAweDAwYzE6IDB4MDBhNCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBjNDogMHgwMDhlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBjNTogMHgwMDhmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwYzY6IDB4MDA5MiwgICAgICMgIExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICAweDAwYzc6IDB4MDA4MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGM5OiAweDAwOTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwY2Q6IDB4MDBhNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBkMDogMHgwMDhiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRICisgICAgMHgwMGQzOiAweDAwYTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZDY6IDB4MDA5OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDg6IDB4MDA5ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwZGE6IDB4MDBhNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBkYzogMHgwMDlhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkZDogMHgwMDk3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgMHgwMGRlOiAweDAwOGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STgorICAgIDB4MDBkZjogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTA6IDB4MDA4NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwZTE6IDB4MDBhMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwZTI6IDB4MDA4MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlNDogMHgwMDg0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZTU6IDB4MDA4NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBlNjogMHgwMDkxLCAgICAgIyAgTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICAweDAwZTc6IDB4MDA4NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBlODogMHgwMDhhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBlOTogMHgwMDgyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDBlYTogMHgwMDg4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGViOiAweDAwODksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlZDogMHgwMGExLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBmMDogMHgwMDhjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEVUSAorICAgIDB4MDBmMzogMHgwMGEyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBmNDogMHgwMDkzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGY2OiAweDAwOTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmNzogMHgwMGY2LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmODogMHgwMDliLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwZmE6IDB4MDBhMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwZmI6IDB4MDA5NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBmYzogMHgwMDgxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZmQ6IDB4MDA5OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAwZmU6IDB4MDA5NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUSE9STgorICAgIDB4MDE5MjogMHgwMDlmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgMHgwMzkzOiAweDAwZTIsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIDB4MDM5ODogMHgwMGU5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICAweDAzYTM6IDB4MDBlNCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgMHgwM2E2OiAweDAwZTgsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICAweDAzYTk6IDB4MDBlYSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgMHgwM2IxOiAweDAwZTAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICAweDAzYjQ6IDB4MDBlYiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIDB4MDNiNTogMHgwMGVlLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICAweDAzYzA6IDB4MDBlMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIDB4MDNjMzogMHgwMGU1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgMHgwM2M0OiAweDAwZTcsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgMHgwM2M2OiAweDAwZWQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgMHgyMDdmOiAweDAwZmMsICAgICAjICBTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MjBhNzogMHgwMDllLCAgICAgIyAgUEVTRVRBIFNJR04KKyAgICAweDIyMTk6IDB4MDBmOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MjIxYTogMHgwMGZiLCAgICAgIyAgU1FVQVJFIFJPT1QKKyAgICAweDIyMWU6IDB4MDBlYywgICAgICMgIElORklOSVRZCisgICAgMHgyMjI5OiAweDAwZWYsICAgICAjICBJTlRFUlNFQ1RJT04KKyAgICAweDIyNDg6IDB4MDBmNywgICAgICMgIEFMTU9TVCBFUVVBTCBUTworICAgIDB4MjI2MTogMHgwMGYwLCAgICAgIyAgSURFTlRJQ0FMIFRPCisgICAgMHgyMjY0OiAweDAwZjMsICAgICAjICBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDIyNjU6IDB4MDBmMiwgICAgICMgIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MjMxMDogMHgwMGE5LCAgICAgIyAgUkVWRVJTRUQgTk9UIFNJR04KKyAgICAweDIzMjA6IDB4MDBmNCwgICAgICMgIFRPUCBIQUxGIElOVEVHUkFMCisgICAgMHgyMzIxOiAweDAwZjUsICAgICAjICBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIDB4MjUwMDogMHgwMGM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDI1MDI6IDB4MDBiMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MjUwYzogMHgwMGRhLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTEwOiAweDAwYmYsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MjUxNDogMHgwMGMwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MjUxODogMHgwMGQ5LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgyNTFjOiAweDAwYzMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTI0OiAweDAwYjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1MmM6IDB4MDBjMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTM0OiAweDAwYzEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1M2M6IDB4MDBjNSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU1MDogMHgwMGNkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgyNTUxOiAweDAwYmEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgyNTUyOiAweDAwZDUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1MzogMHgwMGQ2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NTQ6IDB4MDBjOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1NTU6IDB4MDBiOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NTY6IDB4MDBiNywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NTc6IDB4MDBiYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MjU1ODogMHgwMGQ0LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTU5OiAweDAwZDMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NWE6IDB4MDBjOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgyNTViOiAweDAwYmUsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU1YzogMHgwMGJkLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NWQ6IDB4MDBiYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDI1NWU6IDB4MDBjNiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1ZjogMHgwMGM3LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTYwOiAweDAwY2MsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjU2MTogMHgwMGI1LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NjI6IDB4MDBiNiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTYzOiAweDAwYjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTY0OiAweDAwZDEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTY1OiAweDAwZDIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTY2OiAweDAwY2IsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1Njc6IDB4MDBjZiwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTY4OiAweDAwZDAsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2OTogMHgwMGNhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2YTogMHgwMGQ4LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1NmI6IDB4MDBkNywgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTZjOiAweDAwY2UsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTgwOiAweDAwZGYsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg0OiAweDAwZGMsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg4OiAweDAwZGIsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgyNThjOiAweDAwZGQsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTA6IDB4MDBkZSwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTE6IDB4MDBiMCwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgyNTkyOiAweDAwYjEsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDI1OTM6IDB4MDBiMiwgICAgICMgIERBUksgU0hBREUKKyAgICAweDI1YTA6IDB4MDBmZSwgICAgICMgIEJMQUNLIFNRVUFSRQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjEucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNDlkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2MS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjEucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNDlkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2MS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjIucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2Mi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTA0MDVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjIucHkKQEAgLTAsMCArMSw2OTggQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgZ2VuZXJhdGVkIGZyb20gJ1ZFTkRPUlMvTUlDU0ZUL1BDL0NQODYyLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A4NjInLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgMHgwMDgwOiAweDA1ZDAsICAgICAjICBIRUJSRVcgTEVUVEVSIEFMRUYKKyAgICAweDAwODE6IDB4MDVkMSwgICAgICMgIEhFQlJFVyBMRVRURVIgQkVUCisgICAgMHgwMDgyOiAweDA1ZDIsICAgICAjICBIRUJSRVcgTEVUVEVSIEdJTUVMCisgICAgMHgwMDgzOiAweDA1ZDMsICAgICAjICBIRUJSRVcgTEVUVEVSIERBTEVUCisgICAgMHgwMDg0OiAweDA1ZDQsICAgICAjICBIRUJSRVcgTEVUVEVSIEhFCisgICAgMHgwMDg1OiAweDA1ZDUsICAgICAjICBIRUJSRVcgTEVUVEVSIFZBVgorICAgIDB4MDA4NjogMHgwNWQ2LCAgICAgIyAgSEVCUkVXIExFVFRFUiBaQVlJTgorICAgIDB4MDA4NzogMHgwNWQ3LCAgICAgIyAgSEVCUkVXIExFVFRFUiBIRVQKKyAgICAweDAwODg6IDB4MDVkOCwgICAgICMgIEhFQlJFVyBMRVRURVIgVEVUCisgICAgMHgwMDg5OiAweDA1ZDksICAgICAjICBIRUJSRVcgTEVUVEVSIFlPRAorICAgIDB4MDA4YTogMHgwNWRhLCAgICAgIyAgSEVCUkVXIExFVFRFUiBGSU5BTCBLQUYKKyAgICAweDAwOGI6IDB4MDVkYiwgICAgICMgIEhFQlJFVyBMRVRURVIgS0FGCisgICAgMHgwMDhjOiAweDA1ZGMsICAgICAjICBIRUJSRVcgTEVUVEVSIExBTUVECisgICAgMHgwMDhkOiAweDA1ZGQsICAgICAjICBIRUJSRVcgTEVUVEVSIEZJTkFMIE1FTQorICAgIDB4MDA4ZTogMHgwNWRlLCAgICAgIyAgSEVCUkVXIExFVFRFUiBNRU0KKyAgICAweDAwOGY6IDB4MDVkZiwgICAgICMgIEhFQlJFVyBMRVRURVIgRklOQUwgTlVOCisgICAgMHgwMDkwOiAweDA1ZTAsICAgICAjICBIRUJSRVcgTEVUVEVSIE5VTgorICAgIDB4MDA5MTogMHgwNWUxLCAgICAgIyAgSEVCUkVXIExFVFRFUiBTQU1FS0gKKyAgICAweDAwOTI6IDB4MDVlMiwgICAgICMgIEhFQlJFVyBMRVRURVIgQVlJTgorICAgIDB4MDA5MzogMHgwNWUzLCAgICAgIyAgSEVCUkVXIExFVFRFUiBGSU5BTCBQRQorICAgIDB4MDA5NDogMHgwNWU0LCAgICAgIyAgSEVCUkVXIExFVFRFUiBQRQorICAgIDB4MDA5NTogMHgwNWU1LCAgICAgIyAgSEVCUkVXIExFVFRFUiBGSU5BTCBUU0FESQorICAgIDB4MDA5NjogMHgwNWU2LCAgICAgIyAgSEVCUkVXIExFVFRFUiBUU0FESQorICAgIDB4MDA5NzogMHgwNWU3LCAgICAgIyAgSEVCUkVXIExFVFRFUiBRT0YKKyAgICAweDAwOTg6IDB4MDVlOCwgICAgICMgIEhFQlJFVyBMRVRURVIgUkVTSAorICAgIDB4MDA5OTogMHgwNWU5LCAgICAgIyAgSEVCUkVXIExFVFRFUiBTSElOCisgICAgMHgwMDlhOiAweDA1ZWEsICAgICAjICBIRUJSRVcgTEVUVEVSIFRBVgorICAgIDB4MDA5YjogMHgwMGEyLCAgICAgIyAgQ0VOVCBTSUdOCisgICAgMHgwMDljOiAweDAwYTMsICAgICAjICBQT1VORCBTSUdOCisgICAgMHgwMDlkOiAweDAwYTUsICAgICAjICBZRU4gU0lHTgorICAgIDB4MDA5ZTogMHgyMGE3LCAgICAgIyAgUEVTRVRBIFNJR04KKyAgICAweDAwOWY6IDB4MDE5MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIDB4MDBhMDogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBhMTogMHgwMGVkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBhMjogMHgwMGYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBhMzogMHgwMGZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBhNDogMHgwMGYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBhNTogMHgwMGQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGE2OiAweDAwYWEsICAgICAjICBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBhNzogMHgwMGJhLCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGE4OiAweDAwYmYsICAgICAjICBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgMHgwMGE5OiAweDIzMTAsICAgICAjICBSRVZFUlNFRCBOT1QgU0lHTgorICAgIDB4MDBhYTogMHgwMGFjLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWI6IDB4MDBiZCwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBhYzogMHgwMGJjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGFkOiAweDAwYTEsICAgICAjICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMGFlOiAweDAwYWIsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhZjogMHgwMGJiLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGIwOiAweDI1OTEsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MDBiMTogMHgyNTkyLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgwMGIyOiAweDI1OTMsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgwMGIzOiAweDI1MDIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDAwYjQ6IDB4MjUyNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiNTogMHgyNTYxLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYjY6IDB4MjU2MiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgwMGI3OiAweDI1NTYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgwMGI4OiAweDI1NTUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGI5OiAweDI1NjMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGJhOiAweDI1NTEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgwMGJiOiAweDI1NTcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDAwYmM6IDB4MjU1ZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDAwYmQ6IDB4MjU1YywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgwMGJlOiAweDI1NWIsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiZjogMHgyNTEwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDAwYzA6IDB4MjUxNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDAwYzE6IDB4MjUzNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMjogMHgyNTJjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzM6IDB4MjUxYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwYzQ6IDB4MjUwMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgwMGM1OiAweDI1M2MsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzY6IDB4MjU1ZSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBjNzogMHgyNTVmLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGM4OiAweDI1NWEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MDBjOTogMHgyNTU0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MDBjYTogMHgyNTY5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYjogMHgyNTY2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNjOiAweDI1NjAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjZDogMHgyNTUwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgwMGNlOiAweDI1NmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNmOiAweDI1NjcsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkMDogMHgyNTY4LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDE6IDB4MjU2NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDI6IDB4MjU2NSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDM6IDB4MjU1OSwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBkNDogMHgyNTU4LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGQ1OiAweDI1NTIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBkNjogMHgyNTUzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwZDc6IDB4MjU2YiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQ4OiAweDI1NmEsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkOTogMHgyNTE4LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgwMGRhOiAweDI1MGMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwZGI6IDB4MjU4OCwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDAwZGM6IDB4MjU4NCwgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDAwZGQ6IDB4MjU4YywgICAgICMgIExFRlQgSEFMRiBCTE9DSworICAgIDB4MDBkZTogMHgyNTkwLCAgICAgIyAgUklHSFQgSEFMRiBCTE9DSworICAgIDB4MDBkZjogMHgyNTgwLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MDBlMDogMHgwM2IxLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgMHgwMGUxOiAweDAwZGYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAoR0VSTUFOKQorICAgIDB4MDBlMjogMHgwMzkzLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICAweDAwZTM6IDB4MDNjMCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIDB4MDBlNDogMHgwM2EzLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICAweDAwZTU6IDB4MDNjMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIDB4MDBlNjogMHgwMGI1LCAgICAgIyAgTUlDUk8gU0lHTgorICAgIDB4MDBlNzogMHgwM2M0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIDB4MDBlODogMHgwM2E2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgMHgwMGU5OiAweDAzOTgsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIDB4MDBlYTogMHgwM2E5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICAweDAwZWI6IDB4MDNiNCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIDB4MDBlYzogMHgyMjFlLCAgICAgIyAgSU5GSU5JVFkKKyAgICAweDAwZWQ6IDB4MDNjNiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICAweDAwZWU6IDB4MDNiNSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgMHgwMGVmOiAweDIyMjksICAgICAjICBJTlRFUlNFQ1RJT04KKyAgICAweDAwZjA6IDB4MjI2MSwgICAgICMgIElERU5USUNBTCBUTworICAgIDB4MDBmMTogMHgwMGIxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGYyOiAweDIyNjUsICAgICAjICBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDAwZjM6IDB4MjI2NCwgICAgICMgIExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MDBmNDogMHgyMzIwLCAgICAgIyAgVE9QIEhBTEYgSU5URUdSQUwKKyAgICAweDAwZjU6IDB4MjMyMSwgICAgICMgIEJPVFRPTSBIQUxGIElOVEVHUkFMCisgICAgMHgwMGY2OiAweDAwZjcsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY3OiAweDIyNDgsICAgICAjICBBTE1PU1QgRVFVQUwgVE8KKyAgICAweDAwZjg6IDB4MDBiMCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGY5OiAweDIyMTksICAgICAjICBCVUxMRVQgT1BFUkFUT1IKKyAgICAweDAwZmE6IDB4MDBiNywgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwZmI6IDB4MjIxYSwgICAgICMgIFNRVUFSRSBST09UCisgICAgMHgwMGZjOiAweDIwN2YsICAgICAjICBTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDBmZDogMHgwMGIyLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGZlOiAweDI1YTAsICAgICAjICBCTEFDSyBTUVVBUkUKKyAgICAweDAwZmY6IDB4MDBhMCwgICAgICMgIE5PLUJSRUFLIFNQQUNFCit9KQorCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAwMDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDAwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwMDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDAwMDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDAwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDAwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwMDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDAwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDAwMGEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwMDBiIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDAwMGMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwMDBkIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MDAwZSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDAwMGYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDAwMTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MDAxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDAwMTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgwMDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgwMDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDAwMTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDAwMTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MDAxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgwMDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MDAxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgwMDFhIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDAwMWIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgwMDFjIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgwMDFkIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MDAxZSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgwMDFmIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgwMDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgwMDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDAwMjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDAwMjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDAwMjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDAwMjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgwMDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MDAyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgwMDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDAwMjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDAwMmEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDAwMmIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgwMDJjIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgwMDJkIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MDAyZSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDAwMmYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MDAzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgwMDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MDAzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDAwMzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDAwMzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MDAzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgwMDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MDAzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MDAzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MDAzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgwMDNhIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgwMDNiIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4MDAzYyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4MDAzZCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4MDAzZSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4MDAzZiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHgwMDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDAwNDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4MDA0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHgwMDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDAwNDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4MDA0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHgwMDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDAwNDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4MDA0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHgwMDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDAwNGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4MDA0YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHgwMDRjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDAwNGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4MDA0ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHgwMDRmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDAwNTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4MDA1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHgwMDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDAwNTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4MDA1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHgwMDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDAwNTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4MDA1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHgwMDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDAwNTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4MDA1YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHgwMDViIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDAwNWMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHgwMDVkIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHgwMDVlIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHgwMDVmIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHgwMDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4MDA2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4MDA2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4MDA2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4MDA2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4MDA2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4MDA2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4MDA2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4MDA2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4MDA2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4MDA2YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4MDA2YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4MDA2YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4MDA2ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4MDA2ZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4MDA2ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4MDA3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4MDA3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4MDA3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4MDA3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4MDA3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4MDA3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4MDA3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4MDA3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4MDA3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4MDA3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4MDA3YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4MDA3YiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDAwN2MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4MDA3ZCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHgwMDdlIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHgwMDdmIC0+IERFTEVURQorICAgIHUnXHUwNWQwJyAgICMgIDB4MDA4MCAtPiBIRUJSRVcgTEVUVEVSIEFMRUYKKyAgICB1J1x1MDVkMScgICAjICAweDAwODEgLT4gSEVCUkVXIExFVFRFUiBCRVQKKyAgICB1J1x1MDVkMicgICAjICAweDAwODIgLT4gSEVCUkVXIExFVFRFUiBHSU1FTAorICAgIHUnXHUwNWQzJyAgICMgIDB4MDA4MyAtPiBIRUJSRVcgTEVUVEVSIERBTEVUCisgICAgdSdcdTA1ZDQnICAgIyAgMHgwMDg0IC0+IEhFQlJFVyBMRVRURVIgSEUKKyAgICB1J1x1MDVkNScgICAjICAweDAwODUgLT4gSEVCUkVXIExFVFRFUiBWQVYKKyAgICB1J1x1MDVkNicgICAjICAweDAwODYgLT4gSEVCUkVXIExFVFRFUiBaQVlJTgorICAgIHUnXHUwNWQ3JyAgICMgIDB4MDA4NyAtPiBIRUJSRVcgTEVUVEVSIEhFVAorICAgIHUnXHUwNWQ4JyAgICMgIDB4MDA4OCAtPiBIRUJSRVcgTEVUVEVSIFRFVAorICAgIHUnXHUwNWQ5JyAgICMgIDB4MDA4OSAtPiBIRUJSRVcgTEVUVEVSIFlPRAorICAgIHUnXHUwNWRhJyAgICMgIDB4MDA4YSAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIEtBRgorICAgIHUnXHUwNWRiJyAgICMgIDB4MDA4YiAtPiBIRUJSRVcgTEVUVEVSIEtBRgorICAgIHUnXHUwNWRjJyAgICMgIDB4MDA4YyAtPiBIRUJSRVcgTEVUVEVSIExBTUVECisgICAgdSdcdTA1ZGQnICAgIyAgMHgwMDhkIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgTUVNCisgICAgdSdcdTA1ZGUnICAgIyAgMHgwMDhlIC0+IEhFQlJFVyBMRVRURVIgTUVNCisgICAgdSdcdTA1ZGYnICAgIyAgMHgwMDhmIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgTlVOCisgICAgdSdcdTA1ZTAnICAgIyAgMHgwMDkwIC0+IEhFQlJFVyBMRVRURVIgTlVOCisgICAgdSdcdTA1ZTEnICAgIyAgMHgwMDkxIC0+IEhFQlJFVyBMRVRURVIgU0FNRUtICisgICAgdSdcdTA1ZTInICAgIyAgMHgwMDkyIC0+IEhFQlJFVyBMRVRURVIgQVlJTgorICAgIHUnXHUwNWUzJyAgICMgIDB4MDA5MyAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIFBFCisgICAgdSdcdTA1ZTQnICAgIyAgMHgwMDk0IC0+IEhFQlJFVyBMRVRURVIgUEUKKyAgICB1J1x1MDVlNScgICAjICAweDAwOTUgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBUU0FESQorICAgIHUnXHUwNWU2JyAgICMgIDB4MDA5NiAtPiBIRUJSRVcgTEVUVEVSIFRTQURJCisgICAgdSdcdTA1ZTcnICAgIyAgMHgwMDk3IC0+IEhFQlJFVyBMRVRURVIgUU9GCisgICAgdSdcdTA1ZTgnICAgIyAgMHgwMDk4IC0+IEhFQlJFVyBMRVRURVIgUkVTSAorICAgIHUnXHUwNWU5JyAgICMgIDB4MDA5OSAtPiBIRUJSRVcgTEVUVEVSIFNISU4KKyAgICB1J1x1MDVlYScgICAjICAweDAwOWEgLT4gSEVCUkVXIExFVFRFUiBUQVYKKyAgICB1J1x4YTInICAgICAjICAweDAwOWIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHgwMDljIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweDAwOWQgLT4gWUVOIFNJR04KKyAgICB1J1x1MjBhNycgICAjICAweDAwOWUgLT4gUEVTRVRBIFNJR04KKyAgICB1J1x1MDE5MicgICAjICAweDAwOWYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdceGUxJyAgICAgIyAgMHgwMGEwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZWQnICAgICAjICAweDAwYTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhmMycgICAgICMgIDB4MDBhMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGZhJyAgICAgIyAgMHgwMGEzIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZjEnICAgICAjICAweDAwYTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkMScgICAgICMgIDB4MDBhNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4YWEnICAgICAjICAweDAwYTYgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmEnICAgICAjICAweDAwYTcgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJmJyAgICAgIyAgMHgwMGE4IC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x1MjMxMCcgICAjICAweDAwYTkgLT4gUkVWRVJTRUQgTk9UIFNJR04KKyAgICB1J1x4YWMnICAgICAjICAweDAwYWEgLT4gTk9UIFNJR04KKyAgICB1J1x4YmQnICAgICAjICAweDAwYWIgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJjJyAgICAgIyAgMHgwMGFjIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhhMScgICAgICMgIDB4MDBhZCAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGFiJyAgICAgIyAgMHgwMGFlIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHgwMGFmIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyNTkxJyAgICMgIDB4MDBiMCAtPiBMSUdIVCBTSEFERQorICAgIHUnXHUyNTkyJyAgICMgIDB4MDBiMSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweDAwYjIgLT4gREFSSyBTSEFERQorICAgIHUnXHUyNTAyJyAgICMgIDB4MDBiMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICB1J1x1MjUyNCcgICAjICAweDAwYjQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NjEnICAgIyAgMHgwMGI1IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NjInICAgIyAgMHgwMGI2IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NTYnICAgIyAgMHgwMGI3IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NScgICAjICAweDAwYjggLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYzJyAgICMgIDB4MDBiOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NTEnICAgIyAgMHgwMGJhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICB1J1x1MjU1NycgICAjICAweDAwYmIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHgwMGJjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x1MjU1YycgICAjICAweDAwYmQgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1YicgICAjICAweDAwYmUgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjUxMCcgICAjICAweDAwYmYgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjUxNCcgICAjICAweDAwYzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4MDBjMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweDAwYzIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUxYycgICAjICAweDAwYzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4MDBjNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4MDBjNSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU1ZScgICAjICAweDAwYzYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NWYnICAgIyAgMHgwMGM3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTVhJyAgICMgIDB4MDBjOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTU0JyAgICMgIDB4MDBjOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHgwMGNhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweDAwY2IgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjAnICAgIyAgMHgwMGNjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHgwMGNkIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4MDBjZSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjcnICAgIyAgMHgwMGNmIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjgnICAgIyAgMHgwMGQwIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NjQnICAgIyAgMHgwMGQxIC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2NScgICAjICAweDAwZDIgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTU5JyAgICMgIDB4MDBkMyAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1OCcgICAjICAweDAwZDQgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTInICAgIyAgMHgwMGQ1IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTMnICAgIyAgMHgwMGQ2IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NmInICAgIyAgMHgwMGQ3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NmEnICAgIyAgMHgwMGQ4IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1MTgnICAgIyAgMHgwMGQ5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTBjJyAgICMgIDB4MDBkYSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU4OCcgICAjICAweDAwZGIgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4MDBkYyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdcdTI1OGMnICAgIyAgMHgwMGRkIC0+IExFRlQgSEFMRiBCTE9DSworICAgIHUnXHUyNTkwJyAgICMgIDB4MDBkZSAtPiBSSUdIVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1ODAnICAgIyAgMHgwMGRmIC0+IFVQUEVSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MDNiMScgICAjICAweDAwZTAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgdSdceGRmJyAgICAgIyAgMHgwMGUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHRVJNQU4pCisgICAgdSdcdTAzOTMnICAgIyAgMHgwMGUyIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgdSdcdTAzYzAnICAgIyAgMHgwMGUzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHUwM2EzJyAgICMgIDB4MDBlNCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIHUnXHUwM2MzJyAgICMgIDB4MDBlNSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICB1J1x4YjUnICAgICAjICAweDAwZTYgLT4gTUlDUk8gU0lHTgorICAgIHUnXHUwM2M0JyAgICMgIDB4MDBlNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgdSdcdTAzYTYnICAgIyAgMHgwMGU4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIHUnXHUwMzk4JyAgICMgIDB4MDBlOSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwM2E5JyAgICMgIDB4MDBlYSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwM2I0JyAgICMgIDB4MDBlYiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MjIxZScgICAjICAweDAwZWMgLT4gSU5GSU5JVFkKKyAgICB1J1x1MDNjNicgICAjICAweDAwZWQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIHUnXHUwM2I1JyAgICMgIDB4MDBlZSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIHUnXHUyMjI5JyAgICMgIDB4MDBlZiAtPiBJTlRFUlNFQ1RJT04KKyAgICB1J1x1MjI2MScgICAjICAweDAwZjAgLT4gSURFTlRJQ0FMIFRPCisgICAgdSdceGIxJyAgICAgIyAgMHgwMGYxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMjY1JyAgICMgIDB4MDBmMiAtPiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NCcgICAjICAweDAwZjMgLT4gTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIzMjAnICAgIyAgMHgwMGY0IC0+IFRPUCBIQUxGIElOVEVHUkFMCisgICAgdSdcdTIzMjEnICAgIyAgMHgwMGY1IC0+IEJPVFRPTSBIQUxGIElOVEVHUkFMCisgICAgdSdceGY3JyAgICAgIyAgMHgwMGY2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjI0OCcgICAjICAweDAwZjcgLT4gQUxNT1NUIEVRVUFMIFRPCisgICAgdSdceGIwJyAgICAgIyAgMHgwMGY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdcdTIyMTknICAgIyAgMHgwMGY5IC0+IEJVTExFVCBPUEVSQVRPUgorICAgIHUnXHhiNycgICAgICMgIDB4MDBmYSAtPiBNSURETEUgRE9UCisgICAgdSdcdTIyMWEnICAgIyAgMHgwMGZiIC0+IFNRVUFSRSBST09UCisgICAgdSdcdTIwN2YnICAgIyAgMHgwMGZjIC0+IFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdceGIyJyAgICAgIyAgMHgwMGZkIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHUyNWEwJyAgICMgIDB4MDBmZSAtPiBCTEFDSyBTUVVBUkUKKyAgICB1J1x4YTAnICAgICAjICAweDAwZmYgLT4gTk8tQlJFQUsgU1BBQ0UKKykKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSB7CisgICAgMHgwMDAwOiAweDAwMDAsICAgICAjICBOVUxMCisgICAgMHgwMDAxOiAweDAwMDEsICAgICAjICBTVEFSVCBPRiBIRUFESU5HCisgICAgMHgwMDAyOiAweDAwMDIsICAgICAjICBTVEFSVCBPRiBURVhUCisgICAgMHgwMDAzOiAweDAwMDMsICAgICAjICBFTkQgT0YgVEVYVAorICAgIDB4MDAwNDogMHgwMDA0LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIDB4MDAwNTogMHgwMDA1LCAgICAgIyAgRU5RVUlSWQorICAgIDB4MDAwNjogMHgwMDA2LCAgICAgIyAgQUNLTk9XTEVER0UKKyAgICAweDAwMDc6IDB4MDAwNywgICAgICMgIEJFTEwKKyAgICAweDAwMDg6IDB4MDAwOCwgICAgICMgIEJBQ0tTUEFDRQorICAgIDB4MDAwOTogMHgwMDA5LCAgICAgIyAgSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBhOiAweDAwMGEsICAgICAjICBMSU5FIEZFRUQKKyAgICAweDAwMGI6IDB4MDAwYiwgICAgICMgIFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICAweDAwMGM6IDB4MDAwYywgICAgICMgIEZPUk0gRkVFRAorICAgIDB4MDAwZDogMHgwMDBkLCAgICAgIyAgQ0FSUklBR0UgUkVUVVJOCisgICAgMHgwMDBlOiAweDAwMGUsICAgICAjICBTSElGVCBPVVQKKyAgICAweDAwMGY6IDB4MDAwZiwgICAgICMgIFNISUZUIElOCisgICAgMHgwMDEwOiAweDAwMTAsICAgICAjICBEQVRBIExJTksgRVNDQVBFCisgICAgMHgwMDExOiAweDAwMTEsICAgICAjICBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICAweDAwMTI6IDB4MDAxMiwgICAgICMgIERFVklDRSBDT05UUk9MIFRXTworICAgIDB4MDAxMzogMHgwMDEzLCAgICAgIyAgREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICAweDAwMTQ6IDB4MDAxNCwgICAgICMgIERFVklDRSBDT05UUk9MIEZPVVIKKyAgICAweDAwMTU6IDB4MDAxNSwgICAgICMgIE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgMHgwMDE2OiAweDAwMTYsICAgICAjICBTWU5DSFJPTk9VUyBJRExFCisgICAgMHgwMDE3OiAweDAwMTcsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgMHgwMDE4OiAweDAwMTgsICAgICAjICBDQU5DRUwKKyAgICAweDAwMTk6IDB4MDAxOSwgICAgICMgIEVORCBPRiBNRURJVU0KKyAgICAweDAwMWE6IDB4MDAxYSwgICAgICMgIFNVQlNUSVRVVEUKKyAgICAweDAwMWI6IDB4MDAxYiwgICAgICMgIEVTQ0FQRQorICAgIDB4MDAxYzogMHgwMDFjLCAgICAgIyAgRklMRSBTRVBBUkFUT1IKKyAgICAweDAwMWQ6IDB4MDAxZCwgICAgICMgIEdST1VQIFNFUEFSQVRPUgorICAgIDB4MDAxZTogMHgwMDFlLCAgICAgIyAgUkVDT1JEIFNFUEFSQVRPUgorICAgIDB4MDAxZjogMHgwMDFmLCAgICAgIyAgVU5JVCBTRVBBUkFUT1IKKyAgICAweDAwMjA6IDB4MDAyMCwgICAgICMgIFNQQUNFCisgICAgMHgwMDIxOiAweDAwMjEsICAgICAjICBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMDIyOiAweDAwMjIsICAgICAjICBRVU9UQVRJT04gTUFSSworICAgIDB4MDAyMzogMHgwMDIzLCAgICAgIyAgTlVNQkVSIFNJR04KKyAgICAweDAwMjQ6IDB4MDAyNCwgICAgICMgIERPTExBUiBTSUdOCisgICAgMHgwMDI1OiAweDAwMjUsICAgICAjICBQRVJDRU5UIFNJR04KKyAgICAweDAwMjY6IDB4MDAyNiwgICAgICMgIEFNUEVSU0FORAorICAgIDB4MDAyNzogMHgwMDI3LCAgICAgIyAgQVBPU1RST1BIRQorICAgIDB4MDAyODogMHgwMDI4LCAgICAgIyAgTEVGVCBQQVJFTlRIRVNJUworICAgIDB4MDAyOTogMHgwMDI5LCAgICAgIyAgUklHSFQgUEFSRU5USEVTSVMKKyAgICAweDAwMmE6IDB4MDAyYSwgICAgICMgIEFTVEVSSVNLCisgICAgMHgwMDJiOiAweDAwMmIsICAgICAjICBQTFVTIFNJR04KKyAgICAweDAwMmM6IDB4MDAyYywgICAgICMgIENPTU1BCisgICAgMHgwMDJkOiAweDAwMmQsICAgICAjICBIWVBIRU4tTUlOVVMKKyAgICAweDAwMmU6IDB4MDAyZSwgICAgICMgIEZVTEwgU1RPUAorICAgIDB4MDAyZjogMHgwMDJmLCAgICAgIyAgU09MSURVUworICAgIDB4MDAzMDogMHgwMDMwLCAgICAgIyAgRElHSVQgWkVSTworICAgIDB4MDAzMTogMHgwMDMxLCAgICAgIyAgRElHSVQgT05FCisgICAgMHgwMDMyOiAweDAwMzIsICAgICAjICBESUdJVCBUV08KKyAgICAweDAwMzM6IDB4MDAzMywgICAgICMgIERJR0lUIFRIUkVFCisgICAgMHgwMDM0OiAweDAwMzQsICAgICAjICBESUdJVCBGT1VSCisgICAgMHgwMDM1OiAweDAwMzUsICAgICAjICBESUdJVCBGSVZFCisgICAgMHgwMDM2OiAweDAwMzYsICAgICAjICBESUdJVCBTSVgKKyAgICAweDAwMzc6IDB4MDAzNywgICAgICMgIERJR0lUIFNFVkVOCisgICAgMHgwMDM4OiAweDAwMzgsICAgICAjICBESUdJVCBFSUdIVAorICAgIDB4MDAzOTogMHgwMDM5LCAgICAgIyAgRElHSVQgTklORQorICAgIDB4MDAzYTogMHgwMDNhLCAgICAgIyAgQ09MT04KKyAgICAweDAwM2I6IDB4MDAzYiwgICAgICMgIFNFTUlDT0xPTgorICAgIDB4MDAzYzogMHgwMDNjLCAgICAgIyAgTEVTUy1USEFOIFNJR04KKyAgICAweDAwM2Q6IDB4MDAzZCwgICAgICMgIEVRVUFMUyBTSUdOCisgICAgMHgwMDNlOiAweDAwM2UsICAgICAjICBHUkVBVEVSLVRIQU4gU0lHTgorICAgIDB4MDAzZjogMHgwMDNmLCAgICAgIyAgUVVFU1RJT04gTUFSSworICAgIDB4MDA0MDogMHgwMDQwLCAgICAgIyAgQ09NTUVSQ0lBTCBBVAorICAgIDB4MDA0MTogMHgwMDQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIDB4MDA0MjogMHgwMDQyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIDB4MDA0MzogMHgwMDQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIDB4MDA0NDogMHgwMDQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIDB4MDA0NTogMHgwMDQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIDB4MDA0NjogMHgwMDQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIDB4MDA0NzogMHgwMDQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIDB4MDA0ODogMHgwMDQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIDB4MDA0OTogMHgwMDQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIDB4MDA0YTogMHgwMDRhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIDB4MDA0YjogMHgwMDRiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIDB4MDA0YzogMHgwMDRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIDB4MDA0ZDogMHgwMDRkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIDB4MDA0ZTogMHgwMDRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIDB4MDA0ZjogMHgwMDRmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIDB4MDA1MDogMHgwMDUwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIDB4MDA1MTogMHgwMDUxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIDB4MDA1MjogMHgwMDUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIDB4MDA1MzogMHgwMDUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIDB4MDA1NDogMHgwMDU0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIDB4MDA1NTogMHgwMDU1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDA1NjogMHgwMDU2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIDB4MDA1NzogMHgwMDU3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIDB4MDA1ODogMHgwMDU4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIDB4MDA1OTogMHgwMDU5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIDB4MDA1YTogMHgwMDVhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIDB4MDA1YjogMHgwMDViLCAgICAgIyAgTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1YzogMHgwMDVjLCAgICAgIyAgUkVWRVJTRSBTT0xJRFVTCisgICAgMHgwMDVkOiAweDAwNWQsICAgICAjICBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1ZTogMHgwMDVlLCAgICAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICAweDAwNWY6IDB4MDA1ZiwgICAgICMgIExPVyBMSU5FCisgICAgMHgwMDYwOiAweDAwNjAsICAgICAjICBHUkFWRSBBQ0NFTlQKKyAgICAweDAwNjE6IDB4MDA2MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgMHgwMDYyOiAweDAwNjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIDB4MDA2MzogMHgwMDYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICAweDAwNjQ6IDB4MDA2NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBECisgICAgMHgwMDY1OiAweDAwNjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIDB4MDA2NjogMHgwMDY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICAweDAwNjc6IDB4MDA2NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgMHgwMDY4OiAweDAwNjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIDB4MDA2OTogMHgwMDY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICAweDAwNmE6IDB4MDA2YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgMHgwMDZiOiAweDAwNmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIDB4MDA2YzogMHgwMDZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICAweDAwNmQ6IDB4MDA2ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgMHgwMDZlOiAweDAwNmUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDA2ZjogMHgwMDZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICAweDAwNzA6IDB4MDA3MCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgMHgwMDcxOiAweDAwNzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIDB4MDA3MjogMHgwMDcyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICAweDAwNzM6IDB4MDA3MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgMHgwMDc0OiAweDAwNzQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIDB4MDA3NTogMHgwMDc1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICAweDAwNzY6IDB4MDA3NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgMHgwMDc3OiAweDAwNzcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIDB4MDA3ODogMHgwMDc4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICAweDAwNzk6IDB4MDA3OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgMHgwMDdhOiAweDAwN2EsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIDB4MDA3YjogMHgwMDdiLCAgICAgIyAgTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdjOiAweDAwN2MsICAgICAjICBWRVJUSUNBTCBMSU5FCisgICAgMHgwMDdkOiAweDAwN2QsICAgICAjICBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdlOiAweDAwN2UsICAgICAjICBUSUxERQorICAgIDB4MDA3ZjogMHgwMDdmLCAgICAgIyAgREVMRVRFCisgICAgMHgwMGEwOiAweDAwZmYsICAgICAjICBOTy1CUkVBSyBTUEFDRQorICAgIDB4MDBhMTogMHgwMGFkLCAgICAgIyAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDBhMjogMHgwMDliLCAgICAgIyAgQ0VOVCBTSUdOCisgICAgMHgwMGEzOiAweDAwOWMsICAgICAjICBQT1VORCBTSUdOCisgICAgMHgwMGE1OiAweDAwOWQsICAgICAjICBZRU4gU0lHTgorICAgIDB4MDBhYTogMHgwMGE2LCAgICAgIyAgRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYWI6IDB4MDBhZSwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFjOiAweDAwYWEsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDBiMDogMHgwMGY4LCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwYjE6IDB4MDBmMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBiMjogMHgwMGZkLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGI1OiAweDAwZTYsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGI3OiAweDAwZmEsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGJhOiAweDAwYTcsICAgICAjICBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYmI6IDB4MDBhZiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiYzogMHgwMGFjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGJkOiAweDAwYWIsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYmY6IDB4MDBhOCwgICAgICMgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICAweDAwZDE6IDB4MDBhNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBkZjogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKEdFUk1BTikKKyAgICAweDAwZTE6IDB4MDBhMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwZWQ6IDB4MDBhMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwZjE6IDB4MDBhNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwZjM6IDB4MDBhMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZjc6IDB4MDBmNiwgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAwZmE6IDB4MDBhMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAxOTI6IDB4MDA5ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIDB4MDM5MzogMHgwMGUyLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICAweDAzOTg6IDB4MDBlOSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgMHgwM2EzOiAweDAwZTQsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIDB4MDNhNjogMHgwMGU4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgMHgwM2E5OiAweDAwZWEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIDB4MDNiMTogMHgwMGUwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgMHgwM2I0OiAweDAwZWIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICAweDAzYjU6IDB4MDBlZSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgMHgwM2MwOiAweDAwZTMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICAweDAzYzM6IDB4MDBlNSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIDB4MDNjNDogMHgwMGU3LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIDB4MDNjNjogMHgwMGVkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIDB4MDVkMDogMHgwMDgwLCAgICAgIyAgSEVCUkVXIExFVFRFUiBBTEVGCisgICAgMHgwNWQxOiAweDAwODEsICAgICAjICBIRUJSRVcgTEVUVEVSIEJFVAorICAgIDB4MDVkMjogMHgwMDgyLCAgICAgIyAgSEVCUkVXIExFVFRFUiBHSU1FTAorICAgIDB4MDVkMzogMHgwMDgzLCAgICAgIyAgSEVCUkVXIExFVFRFUiBEQUxFVAorICAgIDB4MDVkNDogMHgwMDg0LCAgICAgIyAgSEVCUkVXIExFVFRFUiBIRQorICAgIDB4MDVkNTogMHgwMDg1LCAgICAgIyAgSEVCUkVXIExFVFRFUiBWQVYKKyAgICAweDA1ZDY6IDB4MDA4NiwgICAgICMgIEhFQlJFVyBMRVRURVIgWkFZSU4KKyAgICAweDA1ZDc6IDB4MDA4NywgICAgICMgIEhFQlJFVyBMRVRURVIgSEVUCisgICAgMHgwNWQ4OiAweDAwODgsICAgICAjICBIRUJSRVcgTEVUVEVSIFRFVAorICAgIDB4MDVkOTogMHgwMDg5LCAgICAgIyAgSEVCUkVXIExFVFRFUiBZT0QKKyAgICAweDA1ZGE6IDB4MDA4YSwgICAgICMgIEhFQlJFVyBMRVRURVIgRklOQUwgS0FGCisgICAgMHgwNWRiOiAweDAwOGIsICAgICAjICBIRUJSRVcgTEVUVEVSIEtBRgorICAgIDB4MDVkYzogMHgwMDhjLCAgICAgIyAgSEVCUkVXIExFVFRFUiBMQU1FRAorICAgIDB4MDVkZDogMHgwMDhkLCAgICAgIyAgSEVCUkVXIExFVFRFUiBGSU5BTCBNRU0KKyAgICAweDA1ZGU6IDB4MDA4ZSwgICAgICMgIEhFQlJFVyBMRVRURVIgTUVNCisgICAgMHgwNWRmOiAweDAwOGYsICAgICAjICBIRUJSRVcgTEVUVEVSIEZJTkFMIE5VTgorICAgIDB4MDVlMDogMHgwMDkwLCAgICAgIyAgSEVCUkVXIExFVFRFUiBOVU4KKyAgICAweDA1ZTE6IDB4MDA5MSwgICAgICMgIEhFQlJFVyBMRVRURVIgU0FNRUtICisgICAgMHgwNWUyOiAweDAwOTIsICAgICAjICBIRUJSRVcgTEVUVEVSIEFZSU4KKyAgICAweDA1ZTM6IDB4MDA5MywgICAgICMgIEhFQlJFVyBMRVRURVIgRklOQUwgUEUKKyAgICAweDA1ZTQ6IDB4MDA5NCwgICAgICMgIEhFQlJFVyBMRVRURVIgUEUKKyAgICAweDA1ZTU6IDB4MDA5NSwgICAgICMgIEhFQlJFVyBMRVRURVIgRklOQUwgVFNBREkKKyAgICAweDA1ZTY6IDB4MDA5NiwgICAgICMgIEhFQlJFVyBMRVRURVIgVFNBREkKKyAgICAweDA1ZTc6IDB4MDA5NywgICAgICMgIEhFQlJFVyBMRVRURVIgUU9GCisgICAgMHgwNWU4OiAweDAwOTgsICAgICAjICBIRUJSRVcgTEVUVEVSIFJFU0gKKyAgICAweDA1ZTk6IDB4MDA5OSwgICAgICMgIEhFQlJFVyBMRVRURVIgU0hJTgorICAgIDB4MDVlYTogMHgwMDlhLCAgICAgIyAgSEVCUkVXIExFVFRFUiBUQVYKKyAgICAweDIwN2Y6IDB4MDBmYywgICAgICMgIFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgyMGE3OiAweDAwOWUsICAgICAjICBQRVNFVEEgU0lHTgorICAgIDB4MjIxOTogMHgwMGY5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgyMjFhOiAweDAwZmIsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MjIxZTogMHgwMGVjLCAgICAgIyAgSU5GSU5JVFkKKyAgICAweDIyMjk6IDB4MDBlZiwgICAgICMgIElOVEVSU0VDVElPTgorICAgIDB4MjI0ODogMHgwMGY3LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgyMjYxOiAweDAwZjAsICAgICAjICBJREVOVElDQUwgVE8KKyAgICAweDIyNjQ6IDB4MDBmMywgICAgICMgIExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MjI2NTogMHgwMGYyLCAgICAgIyAgR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgyMzEwOiAweDAwYTksICAgICAjICBSRVZFUlNFRCBOT1QgU0lHTgorICAgIDB4MjMyMDogMHgwMGY0LCAgICAgIyAgVE9QIEhBTEYgSU5URUdSQUwKKyAgICAweDIzMjE6IDB4MDBmNSwgICAgICMgIEJPVFRPTSBIQUxGIElOVEVHUkFMCisgICAgMHgyNTAwOiAweDAwYzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MjUwMjogMHgwMGIzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgyNTBjOiAweDAwZGEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1MTA6IDB4MDBiZiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgyNTE0OiAweDAwYzAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgyNTE4OiAweDAwZDksICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDI1MWM6IDB4MDBjMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1MjQ6IDB4MDBiNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjUyYzogMHgwMGMyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1MzQ6IDB4MDBjMSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzYzogMHgwMGM1LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTUwOiAweDAwY2QsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDI1NTE6IDB4MDBiYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDI1NTI6IDB4MDBkNSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTUzOiAweDAwZDYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU1NDogMHgwMGM5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MjU1NTogMHgwMGI4LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU1NjogMHgwMGI3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU1NzogMHgwMGJiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgyNTU4OiAweDAwZDQsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NTk6IDB4MDBkMywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU1YTogMHgwMGM4LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDI1NWI6IDB4MDBiZSwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTVjOiAweDAwYmQsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU1ZDogMHgwMGJjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MjU1ZTogMHgwMGM2LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTVmOiAweDAwYzcsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NjA6IDB4MDBjYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTYxOiAweDAwYjUsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU2MjogMHgwMGI2LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NjM6IDB4MDBiOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1NjQ6IDB4MDBkMSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1NjU6IDB4MDBkMiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1NjY6IDB4MDBjYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2NzogMHgwMGNmLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1Njg6IDB4MDBkMCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTY5OiAweDAwY2EsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTZhOiAweDAwZDgsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2YjogMHgwMGQ3LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1NmM6IDB4MDBjZSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1ODA6IDB4MDBkZiwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODQ6IDB4MDBkYywgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODg6IDB4MDBkYiwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDI1OGM6IDB4MDBkZCwgICAgICMgIExFRlQgSEFMRiBCTE9DSworICAgIDB4MjU5MDogMHgwMGRlLCAgICAgIyAgUklHSFQgSEFMRiBCTE9DSworICAgIDB4MjU5MTogMHgwMGIwLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDI1OTI6IDB4MDBiMSwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MjU5MzogMHgwMGIyLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MjVhMDogMHgwMGZlLCAgICAgIyAgQkxBQ0sgU1FVQVJFCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2Mi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2Mi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4ODBmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2Mi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2Mi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4ODBmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2My5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGZhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2My5weQpAQCAtMCwwICsxLDY5OCBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBnZW5lcmF0ZWQgZnJvbSAnVkVORE9SUy9NSUNTRlQvUEMvQ1A4NjMuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDg2MycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCitkZWNvZGluZ19tYXAudXBkYXRlKHsKKyAgICAweDAwODA6IDB4MDBjNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDgxOiAweDAwZmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4MjogMHgwMGU5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA4MzogMHgwMGUyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDg0OiAweDAwYzIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4NTogMHgwMGUwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDA4NjogMHgwMGI2LCAgICAgIyAgUElMQ1JPVyBTSUdOCisgICAgMHgwMDg3OiAweDAwZTcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwODg6IDB4MDBlYSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4OTogMHgwMGViLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOGE6IDB4MDBlOCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICAweDAwOGI6IDB4MDBlZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhjOiAweDAwZWUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOGQ6IDB4MjAxNywgICAgICMgIERPVUJMRSBMT1cgTElORQorICAgIDB4MDA4ZTogMHgwMGMwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMDhmOiAweDAwYTcsICAgICAjICBTRUNUSU9OIFNJR04KKyAgICAweDAwOTA6IDB4MDBjOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA5MTogMHgwMGM4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMDkyOiAweDAwY2EsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5MzogMHgwMGY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk0OiAweDAwY2IsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDk1OiAweDAwY2YsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDk2OiAweDAwZmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOTc6IDB4MDBmOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwOTg6IDB4MDBhNCwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwOTk6IDB4MDBkNCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDlhOiAweDAwZGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDliOiAweDAwYTIsICAgICAjICBDRU5UIFNJR04KKyAgICAweDAwOWM6IDB4MDBhMywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwOWQ6IDB4MDBkOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDA5ZTogMHgwMGRiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOWY6IDB4MDE5MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIDB4MDBhMDogMHgwMGE2LCAgICAgIyAgQlJPS0VOIEJBUgorICAgIDB4MDBhMTogMHgwMGI0LCAgICAgIyAgQUNVVEUgQUNDRU5UCisgICAgMHgwMGEyOiAweDAwZjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGEzOiAweDAwZmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGE0OiAweDAwYTgsICAgICAjICBESUFFUkVTSVMKKyAgICAweDAwYTU6IDB4MDBiOCwgICAgICMgIENFRElMTEEKKyAgICAweDAwYTY6IDB4MDBiMywgICAgICMgIFNVUEVSU0NSSVBUIFRIUkVFCisgICAgMHgwMGE3OiAweDAwYWYsICAgICAjICBNQUNST04KKyAgICAweDAwYTg6IDB4MDBjZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGE5OiAweDIzMTAsICAgICAjICBSRVZFUlNFRCBOT1QgU0lHTgorICAgIDB4MDBhYTogMHgwMGFjLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWI6IDB4MDBiZCwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBhYzogMHgwMGJjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGFkOiAweDAwYmUsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICAweDAwYWU6IDB4MDBhYiwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFmOiAweDAwYmIsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYjA6IDB4MjU5MSwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgwMGIxOiAweDI1OTIsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDAwYjI6IDB4MjU5MywgICAgICMgIERBUksgU0hBREUKKyAgICAweDAwYjM6IDB4MjUwMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MDBiNDogMHgyNTI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGI1OiAweDI1NjEsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiNjogMHgyNTYyLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYjc6IDB4MjU1NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYjg6IDB4MjU1NSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYjk6IDB4MjU2MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYmE6IDB4MjU1MSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDAwYmI6IDB4MjU1NywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBiYzogMHgyNTVkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MDBiZDogMHgyNTVjLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYmU6IDB4MjU1YiwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGJmOiAweDI1MTAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBjMDogMHgyNTE0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MDBjMTogMHgyNTM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMyOiAweDI1MmMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMzogMHgyNTFjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjNDogMHgyNTAwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDAwYzU6IDB4MjUzYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjNjogMHgyNTVlLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGM3OiAweDI1NWYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwYzg6IDB4MjU1YSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgwMGM5OiAweDI1NTQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGNhOiAweDI1NjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNiOiAweDI1NjYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2M6IDB4MjU2MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGNkOiAweDI1NTAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDAwY2U6IDB4MjU2YywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2Y6IDB4MjU2NywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQwOiAweDI1NjgsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkMTogMHgyNTY0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkMjogMHgyNTY1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkMzogMHgyNTU5LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGQ0OiAweDI1NTgsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwZDU6IDB4MjU1MiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGQ2OiAweDI1NTMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBkNzogMHgyNTZiLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDg6IDB4MjU2YSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQ5OiAweDI1MTgsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDAwZGE6IDB4MjUwYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MDBkYjogMHgyNTg4LCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MDBkYzogMHgyNTg0LCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MDBkZDogMHgyNThjLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgwMGRlOiAweDI1OTAsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgwMGRmOiAweDI1ODAsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgwMGUwOiAweDAzYjEsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICAweDAwZTE6IDB4MDBkZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgMHgwMGUyOiAweDAzOTMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIDB4MDBlMzogMHgwM2MwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwMGU0OiAweDAzYTMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIDB4MDBlNTogMHgwM2MzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgMHgwMGU2OiAweDAwYjUsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGU3OiAweDAzYzQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgMHgwMGU4OiAweDAzYTYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICAweDAwZTk6IDB4MDM5OCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgMHgwMGVhOiAweDAzYTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIDB4MDBlYjogMHgwM2I0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwMGVjOiAweDIyMWUsICAgICAjICBJTkZJTklUWQorICAgIDB4MDBlZDogMHgwM2M2LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIDB4MDBlZTogMHgwM2I1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICAweDAwZWY6IDB4MjIyOSwgICAgICMgIElOVEVSU0VDVElPTgorICAgIDB4MDBmMDogMHgyMjYxLCAgICAgIyAgSURFTlRJQ0FMIFRPCisgICAgMHgwMGYxOiAweDAwYjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwZjI6IDB4MjI2NSwgICAgICMgIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MDBmMzogMHgyMjY0LCAgICAgIyAgTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgwMGY0OiAweDIzMjAsICAgICAjICBUT1AgSEFMRiBJTlRFR1JBTAorICAgIDB4MDBmNTogMHgyMzIxLCAgICAgIyAgQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICAweDAwZjY6IDB4MDBmNywgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAwZjc6IDB4MjI0OCwgICAgICMgIEFMTU9TVCBFUVVBTCBUTworICAgIDB4MDBmODogMHgwMGIwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwZjk6IDB4MjIxOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MDBmYTogMHgwMGI3LCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBmYjogMHgyMjFhLCAgICAgIyAgU1FVQVJFIFJPT1QKKyAgICAweDAwZmM6IDB4MjA3ZiwgICAgICMgIFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMGZkOiAweDAwYjIsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwZmU6IDB4MjVhMCwgICAgICMgIEJMQUNLIFNRVUFSRQorICAgIDB4MDBmZjogMHgwMGEwLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKK30pCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwMDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDAwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAwMDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDAwMDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDAwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwMDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwMDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDAwMDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwMDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MDAwYSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDAwMGIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MDAwYyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDAwMGQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwMDBlIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MDAwZiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MDAxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgwMDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MDAxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDAwMTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDAwMTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MDAxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MDAxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgwMDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDAwMTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgwMDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDAwMWEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MDAxYiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDAwMWMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDAwMWQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgwMDFlIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDAwMWYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDAwMjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDAwMjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MDAyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MDAyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MDAyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MDAyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDAwMjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgwMDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDAwMjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MDAyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MDAyYSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MDAyYiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDAwMmMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDAwMmQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgwMDJlIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MDAyZiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgwMDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDAwMzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgwMDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MDAzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MDAzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgwMDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDAwMzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgwMDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgwMDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgwMDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDAwM2EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDAwM2IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgwMDNjIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgwMDNkIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgwMDNlIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgwMDNmIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDAwNDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4MDA0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHgwMDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDAwNDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4MDA0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHgwMDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDAwNDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4MDA0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHgwMDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDAwNDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4MDA0YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHgwMDRiIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDAwNGMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4MDA0ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHgwMDRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDAwNGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4MDA1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHgwMDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDAwNTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4MDA1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHgwMDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDAwNTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4MDA1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHgwMDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDAwNTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4MDA1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHgwMDVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDAwNWIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4MDA1YyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDAwNWQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDAwNWUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDAwNWYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDAwNjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHgwMDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHgwMDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHgwMDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHgwMDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHgwMDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHgwMDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHgwMDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHgwMDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHgwMDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHgwMDZhIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHgwMDZiIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHgwMDZjIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHgwMDZkIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHgwMDZlIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHgwMDZmIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHgwMDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHgwMDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHgwMDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHgwMDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHgwMDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHgwMDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHgwMDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHgwMDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHgwMDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHgwMDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHgwMDdhIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHgwMDdiIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4MDA3YyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHgwMDdkIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDAwN2UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDAwN2YgLT4gREVMRVRFCisgICAgdSdceGM3JyAgICAgIyAgMHgwMDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGZjJyAgICAgIyAgMHgwMDgxIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU5JyAgICAgIyAgMHgwMDgyIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTInICAgICAjICAweDAwODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGMyJyAgICAgIyAgMHgwMDg0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGUwJyAgICAgIyAgMHgwMDg1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YjYnICAgICAjICAweDAwODYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGU3JyAgICAgIyAgMHgwMDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlYScgICAgICMgIDB4MDA4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweDAwODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTgnICAgICAjICAweDAwOGEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlZicgICAgICMgIDB4MDA4YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlZScgICAgICMgIDB4MDA4YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MjAxNycgICAjICAweDAwOGQgLT4gRE9VQkxFIExPVyBMSU5FCisgICAgdSdceGMwJyAgICAgIyAgMHgwMDhlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhhNycgICAgICMgIDB4MDA4ZiAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YzknICAgICAjICAweDAwOTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGM4JyAgICAgIyAgMHgwMDkxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhjYScgICAgICMgIDB4MDA5MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNCcgICAgICMgIDB4MDA5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweDAwOTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjZicgICAgICMgIDB4MDA5NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGZiJyAgICAgIyAgMHgwMDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmOScgICAgICMgIDB4MDA5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGE0JyAgICAgIyAgMHgwMDk4IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4ZDQnICAgICAjICAweDAwOTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweDAwOWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhhMicgICAgICMgIDB4MDA5YiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweDAwOWMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhkOScgICAgICMgIDB4MDA5ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZGInICAgICAjICAweDAwOWUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDE5MicgICAjICAweDAwOWYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdceGE2JyAgICAgIyAgMHgwMGEwIC0+IEJST0tFTiBCQVIKKyAgICB1J1x4YjQnICAgICAjICAweDAwYTEgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGYzJyAgICAgIyAgMHgwMGEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZmEnICAgICAjICAweDAwYTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhhOCcgICAgICMgIDB4MDBhNCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YjgnICAgICAjICAweDAwYTUgLT4gQ0VESUxMQQorICAgIHUnXHhiMycgICAgICMgIDB4MDBhNiAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhhZicgICAgICMgIDB4MDBhNyAtPiBNQUNST04KKyAgICB1J1x4Y2UnICAgICAjICAweDAwYTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MjMxMCcgICAjICAweDAwYTkgLT4gUkVWRVJTRUQgTk9UIFNJR04KKyAgICB1J1x4YWMnICAgICAjICAweDAwYWEgLT4gTk9UIFNJR04KKyAgICB1J1x4YmQnICAgICAjICAweDAwYWIgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJjJyAgICAgIyAgMHgwMGFjIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhiZScgICAgICMgIDB4MDBhZCAtPiBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICB1J1x4YWInICAgICAjICAweDAwYWUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweDAwYWYgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTI1OTEnICAgIyAgMHgwMGIwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHgwMGIxIC0+IE1FRElVTSBTSEFERQorICAgIHUnXHUyNTkzJyAgICMgIDB4MDBiMiAtPiBEQVJLIFNIQURFCisgICAgdSdcdTI1MDInICAgIyAgMHgwMGIzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4MDBiNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU2MScgICAjICAweDAwYjUgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjU2MicgICAjICAweDAwYjYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NicgICAjICAweDAwYjcgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU1JyAgICMgIDB4MDBiOCAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NjMnICAgIyAgMHgwMGI5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU1MScgICAjICAweDAwYmEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTU3JyAgICMgIDB4MDBiYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjU1ZCcgICAjICAweDAwYmMgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTVjJyAgICMgIDB4MDBiZCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTViJyAgICMgIDB4MDBiZSAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTEwJyAgICMgIDB4MDBiZiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4MDBjMCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MzQnICAgIyAgMHgwMGMxIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTJjJyAgICMgIDB4MDBjMiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTFjJyAgICMgIDB4MDBjMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MDAnICAgIyAgMHgwMGM0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgdSdcdTI1M2MnICAgIyAgMHgwMGM1IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTVlJyAgICMgIDB4MDBjNiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1ZicgICAjICAweDAwYzcgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NWEnICAgIyAgMHgwMGM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHgwMGM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweDAwY2EgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY2JyAgICMgIDB4MDBjYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweDAwY2MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweDAwY2QgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NmMnICAgIyAgMHgwMGNlIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NycgICAjICAweDAwY2YgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2OCcgICAjICAweDAwZDAgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU2NCcgICAjICAweDAwZDEgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY1JyAgICMgIDB4MDBkMiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NTknICAgIyAgMHgwMGQzIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTU4JyAgICMgIDB4MDBkNCAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1MicgICAjICAweDAwZDUgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1MycgICAjICAweDAwZDYgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU2YicgICAjICAweDAwZDcgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU2YScgICAjICAweDAwZDggLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjUxOCcgICAjICAweDAwZDkgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgdSdcdTI1MGMnICAgIyAgMHgwMGRhIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTg4JyAgICMgIDB4MDBkYiAtPiBGVUxMIEJMT0NLCisgICAgdSdcdTI1ODQnICAgIyAgMHgwMGRjIC0+IExPV0VSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU4YycgICAjICAweDAwZGQgLT4gTEVGVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1OTAnICAgIyAgMHgwMGRlIC0+IFJJR0hUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU4MCcgICAjICAweDAwZGYgLT4gVVBQRVIgSEFMRiBCTE9DSworICAgIHUnXHUwM2IxJyAgICMgIDB4MDBlMCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICB1J1x4ZGYnICAgICAjICAweDAwZTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x1MDM5MycgICAjICAweDAwZTIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICB1J1x1MDNjMCcgICAjICAweDAwZTMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgdSdcdTAzYTMnICAgIyAgMHgwMGU0IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgdSdcdTAzYzMnICAgIyAgMHgwMGU1IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIHUnXHhiNScgICAgICMgIDB4MDBlNiAtPiBNSUNSTyBTSUdOCisgICAgdSdcdTAzYzQnICAgIyAgMHgwMGU3IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICB1J1x1MDNhNicgICAjICAweDAwZTggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgdSdcdTAzOTgnICAgIyAgMHgwMGU5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgdSdcdTAzYTknICAgIyAgMHgwMGVhIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzYjQnICAgIyAgMHgwMGViIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIHUnXHUyMjFlJyAgICMgIDB4MDBlYyAtPiBJTkZJTklUWQorICAgIHUnXHUwM2M2JyAgICMgIDB4MDBlZCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgdSdcdTAzYjUnICAgIyAgMHgwMGVlIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTIyMjknICAgIyAgMHgwMGVmIC0+IElOVEVSU0VDVElPTgorICAgIHUnXHUyMjYxJyAgICMgIDB4MDBmMCAtPiBJREVOVElDQUwgVE8KKyAgICB1J1x4YjEnICAgICAjICAweDAwZjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTIyNjUnICAgIyAgMHgwMGYyIC0+IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMjY0JyAgICMgIDB4MDBmMyAtPiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjMyMCcgICAjICAweDAwZjQgLT4gVE9QIEhBTEYgSU5URUdSQUwKKyAgICB1J1x1MjMyMScgICAjICAweDAwZjUgLT4gQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICB1J1x4ZjcnICAgICAjICAweDAwZjYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyMjQ4JyAgICMgIDB4MDBmNyAtPiBBTE1PU1QgRVFVQUwgVE8KKyAgICB1J1x4YjAnICAgICAjICAweDAwZjggLT4gREVHUkVFIFNJR04KKyAgICB1J1x1MjIxOScgICAjICAweDAwZjkgLT4gQlVMTEVUIE9QRVJBVE9SCisgICAgdSdceGI3JyAgICAgIyAgMHgwMGZhIC0+IE1JRERMRSBET1QKKyAgICB1J1x1MjIxYScgICAjICAweDAwZmIgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MjA3ZicgICAjICAweDAwZmMgLT4gU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J1x4YjInICAgICAjICAweDAwZmQgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdcdTI1YTAnICAgIyAgMHgwMGZlIC0+IEJMQUNLIFNRVUFSRQorICAgIHUnXHhhMCcgICAgICMgIDB4MDBmZiAtPiBOTy1CUkVBSyBTUEFDRQorKQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHsKKyAgICAweDAwMDA6IDB4MDAwMCwgICAgICMgIE5VTEwKKyAgICAweDAwMDE6IDB4MDAwMSwgICAgICMgIFNUQVJUIE9GIEhFQURJTkcKKyAgICAweDAwMDI6IDB4MDAwMiwgICAgICMgIFNUQVJUIE9GIFRFWFQKKyAgICAweDAwMDM6IDB4MDAwMywgICAgICMgIEVORCBPRiBURVhUCisgICAgMHgwMDA0OiAweDAwMDQsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgMHgwMDA1OiAweDAwMDUsICAgICAjICBFTlFVSVJZCisgICAgMHgwMDA2OiAweDAwMDYsICAgICAjICBBQ0tOT1dMRURHRQorICAgIDB4MDAwNzogMHgwMDA3LCAgICAgIyAgQkVMTAorICAgIDB4MDAwODogMHgwMDA4LCAgICAgIyAgQkFDS1NQQUNFCisgICAgMHgwMDA5OiAweDAwMDksICAgICAjICBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICAweDAwMGE6IDB4MDAwYSwgICAgICMgIExJTkUgRkVFRAorICAgIDB4MDAwYjogMHgwMDBiLCAgICAgIyAgVkVSVElDQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYzogMHgwMDBjLCAgICAgIyAgRk9STSBGRUVECisgICAgMHgwMDBkOiAweDAwMGQsICAgICAjICBDQVJSSUFHRSBSRVRVUk4KKyAgICAweDAwMGU6IDB4MDAwZSwgICAgICMgIFNISUZUIE9VVAorICAgIDB4MDAwZjogMHgwMDBmLCAgICAgIyAgU0hJRlQgSU4KKyAgICAweDAwMTA6IDB4MDAxMCwgICAgICMgIERBVEEgTElOSyBFU0NBUEUKKyAgICAweDAwMTE6IDB4MDAxMSwgICAgICMgIERFVklDRSBDT05UUk9MIE9ORQorICAgIDB4MDAxMjogMHgwMDEyLCAgICAgIyAgREVWSUNFIENPTlRST0wgVFdPCisgICAgMHgwMDEzOiAweDAwMTMsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIDB4MDAxNDogMHgwMDE0LCAgICAgIyAgREVWSUNFIENPTlRST0wgRk9VUgorICAgIDB4MDAxNTogMHgwMDE1LCAgICAgIyAgTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICAweDAwMTY6IDB4MDAxNiwgICAgICMgIFNZTkNIUk9OT1VTIElETEUKKyAgICAweDAwMTc6IDB4MDAxNywgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICAweDAwMTg6IDB4MDAxOCwgICAgICMgIENBTkNFTAorICAgIDB4MDAxOTogMHgwMDE5LCAgICAgIyAgRU5EIE9GIE1FRElVTQorICAgIDB4MDAxYTogMHgwMDFhLCAgICAgIyAgU1VCU1RJVFVURQorICAgIDB4MDAxYjogMHgwMDFiLCAgICAgIyAgRVNDQVBFCisgICAgMHgwMDFjOiAweDAwMWMsICAgICAjICBGSUxFIFNFUEFSQVRPUgorICAgIDB4MDAxZDogMHgwMDFkLCAgICAgIyAgR1JPVVAgU0VQQVJBVE9SCisgICAgMHgwMDFlOiAweDAwMWUsICAgICAjICBSRUNPUkQgU0VQQVJBVE9SCisgICAgMHgwMDFmOiAweDAwMWYsICAgICAjICBVTklUIFNFUEFSQVRPUgorICAgIDB4MDAyMDogMHgwMDIwLCAgICAgIyAgU1BBQ0UKKyAgICAweDAwMjE6IDB4MDAyMSwgICAgICMgIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwMjI6IDB4MDAyMiwgICAgICMgIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMDIzOiAweDAwMjMsICAgICAjICBOVU1CRVIgU0lHTgorICAgIDB4MDAyNDogMHgwMDI0LCAgICAgIyAgRE9MTEFSIFNJR04KKyAgICAweDAwMjU6IDB4MDAyNSwgICAgICMgIFBFUkNFTlQgU0lHTgorICAgIDB4MDAyNjogMHgwMDI2LCAgICAgIyAgQU1QRVJTQU5ECisgICAgMHgwMDI3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFCisgICAgMHgwMDI4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTCisgICAgMHgwMDI5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUworICAgIDB4MDAyYTogMHgwMDJhLCAgICAgIyAgQVNURVJJU0sKKyAgICAweDAwMmI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTgorICAgIDB4MDAyYzogMHgwMDJjLCAgICAgIyAgQ09NTUEKKyAgICAweDAwMmQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUworICAgIDB4MDAyZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QCisgICAgMHgwMDJmOiAweDAwMmYsICAgICAjICBTT0xJRFVTCisgICAgMHgwMDMwOiAweDAwMzAsICAgICAjICBESUdJVCBaRVJPCisgICAgMHgwMDMxOiAweDAwMzEsICAgICAjICBESUdJVCBPTkUKKyAgICAweDAwMzI6IDB4MDAzMiwgICAgICMgIERJR0lUIFRXTworICAgIDB4MDAzMzogMHgwMDMzLCAgICAgIyAgRElHSVQgVEhSRUUKKyAgICAweDAwMzQ6IDB4MDAzNCwgICAgICMgIERJR0lUIEZPVVIKKyAgICAweDAwMzU6IDB4MDAzNSwgICAgICMgIERJR0lUIEZJVkUKKyAgICAweDAwMzY6IDB4MDAzNiwgICAgICMgIERJR0lUIFNJWAorICAgIDB4MDAzNzogMHgwMDM3LCAgICAgIyAgRElHSVQgU0VWRU4KKyAgICAweDAwMzg6IDB4MDAzOCwgICAgICMgIERJR0lUIEVJR0hUCisgICAgMHgwMDM5OiAweDAwMzksICAgICAjICBESUdJVCBOSU5FCisgICAgMHgwMDNhOiAweDAwM2EsICAgICAjICBDT0xPTgorICAgIDB4MDAzYjogMHgwMDNiLCAgICAgIyAgU0VNSUNPTE9OCisgICAgMHgwMDNjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTgorICAgIDB4MDAzZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04KKyAgICAweDAwM2U6IDB4MDAzZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOCisgICAgMHgwMDNmOiAweDAwM2YsICAgICAjICBRVUVTVElPTiBNQVJLCisgICAgMHgwMDQwOiAweDAwNDAsICAgICAjICBDT01NRVJDSUFMIEFUCisgICAgMHgwMDQxOiAweDAwNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMDQyOiAweDAwNDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgMHgwMDQzOiAweDAwNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgMHgwMDQ0OiAweDAwNDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgMHgwMDQ1OiAweDAwNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwMDQ2OiAweDAwNDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgMHgwMDQ3OiAweDAwNDcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgMHgwMDQ4OiAweDAwNDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgMHgwMDQ5OiAweDAwNDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMDRhOiAweDAwNGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgMHgwMDRiOiAweDAwNGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgMHgwMDRjOiAweDAwNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgMHgwMDRkOiAweDAwNGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgMHgwMDRlOiAweDAwNGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgMHgwMDRmOiAweDAwNGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDUwOiAweDAwNTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgMHgwMDUxOiAweDAwNTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgMHgwMDUyOiAweDAwNTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgMHgwMDUzOiAweDAwNTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgMHgwMDU0OiAweDAwNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgMHgwMDU1OiAweDAwNTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDU2OiAweDAwNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgMHgwMDU3OiAweDAwNTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgMHgwMDU4OiAweDAwNTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgMHgwMDU5OiAweDAwNTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgMHgwMDVhOiAweDAwNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgMHgwMDViOiAweDAwNWIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVjOiAweDAwNWMsICAgICAjICBSRVZFUlNFIFNPTElEVVMKKyAgICAweDAwNWQ6IDB4MDA1ZCwgICAgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVlOiAweDAwNWUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIDB4MDA1ZjogMHgwMDVmLCAgICAgIyAgTE9XIExJTkUKKyAgICAweDAwNjA6IDB4MDA2MCwgICAgICMgIEdSQVZFIEFDQ0VOVAorICAgIDB4MDA2MTogMHgwMDYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICAweDAwNjI6IDB4MDA2MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgMHgwMDYzOiAweDAwNjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIDB4MDA2NDogMHgwMDY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICAweDAwNjU6IDB4MDA2NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgMHgwMDY2OiAweDAwNjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIDB4MDA2NzogMHgwMDY3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICAweDAwNjg6IDB4MDA2OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBICisgICAgMHgwMDY5OiAweDAwNjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIDB4MDA2YTogMHgwMDZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICAweDAwNmI6IDB4MDA2YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgMHgwMDZjOiAweDAwNmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIDB4MDA2ZDogMHgwMDZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICAweDAwNmU6IDB4MDA2ZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMDZmOiAweDAwNmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIDB4MDA3MDogMHgwMDcwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICAweDAwNzE6IDB4MDA3MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgMHgwMDcyOiAweDAwNzIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIDB4MDA3MzogMHgwMDczLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICAweDAwNzQ6IDB4MDA3NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgMHgwMDc1OiAweDAwNzUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIDB4MDA3NjogMHgwMDc2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICAweDAwNzc6IDB4MDA3NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgMHgwMDc4OiAweDAwNzgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIDB4MDA3OTogMHgwMDc5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICAweDAwN2E6IDB4MDA3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgMHgwMDdiOiAweDAwN2IsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2M6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUKKyAgICAweDAwN2Q6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2U6IDB4MDA3ZSwgICAgICMgIFRJTERFCisgICAgMHgwMDdmOiAweDAwN2YsICAgICAjICBERUxFVEUKKyAgICAweDAwYTA6IDB4MDBmZiwgICAgICMgIE5PLUJSRUFLIFNQQUNFCisgICAgMHgwMGEyOiAweDAwOWIsICAgICAjICBDRU5UIFNJR04KKyAgICAweDAwYTM6IDB4MDA5YywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwYTQ6IDB4MDA5OCwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwYTY6IDB4MDBhMCwgICAgICMgIEJST0tFTiBCQVIKKyAgICAweDAwYTc6IDB4MDA4ZiwgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBhODogMHgwMGE0LCAgICAgIyAgRElBRVJFU0lTCisgICAgMHgwMGFiOiAweDAwYWUsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhYzogMHgwMGFhLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWY6IDB4MDBhNywgICAgICMgIE1BQ1JPTgorICAgIDB4MDBiMDogMHgwMGY4LCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwYjE6IDB4MDBmMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBiMjogMHgwMGZkLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGIzOiAweDAwYTYsICAgICAjICBTVVBFUlNDUklQVCBUSFJFRQorICAgIDB4MDBiNDogMHgwMGExLCAgICAgIyAgQUNVVEUgQUNDRU5UCisgICAgMHgwMGI1OiAweDAwZTYsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGI2OiAweDAwODYsICAgICAjICBQSUxDUk9XIFNJR04KKyAgICAweDAwYjc6IDB4MDBmYSwgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwYjg6IDB4MDBhNSwgICAgICMgIENFRElMTEEKKyAgICAweDAwYmI6IDB4MDBhZiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiYzogMHgwMGFjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGJkOiAweDAwYWIsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYmU6IDB4MDBhZCwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIDB4MDBjMDogMHgwMDhlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMGMyOiAweDAwODQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBjNzogMHgwMDgwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwYzg6IDB4MDA5MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBjOTogMHgwMDkwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGNhOiAweDAwOTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBjYjogMHgwMDk0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBjZTogMHgwMGE4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwY2Y6IDB4MDA5NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDQ6IDB4MDA5OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGQ5OiAweDAwOWQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwZGI6IDB4MDA5ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGRjOiAweDAwOWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGRmOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMDogMHgwMDg1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBlMjogMHgwMDgzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGU3OiAweDAwODcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwZTg6IDB4MDA4YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICAweDAwZTk6IDB4MDA4MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwZWE6IDB4MDA4OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlYjogMHgwMDg5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZWU6IDB4MDA4YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlZjogMHgwMDhiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZjM6IDB4MDBhMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZjQ6IDB4MDA5MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBmNzogMHgwMGY2LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmOTogMHgwMDk3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDBmYTogMHgwMGEzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBmYjogMHgwMDk2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGZjOiAweDAwODEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDE5MjogMHgwMDlmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgMHgwMzkzOiAweDAwZTIsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIDB4MDM5ODogMHgwMGU5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICAweDAzYTM6IDB4MDBlNCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgMHgwM2E2OiAweDAwZTgsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICAweDAzYTk6IDB4MDBlYSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgMHgwM2IxOiAweDAwZTAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICAweDAzYjQ6IDB4MDBlYiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIDB4MDNiNTogMHgwMGVlLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICAweDAzYzA6IDB4MDBlMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIDB4MDNjMzogMHgwMGU1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgMHgwM2M0OiAweDAwZTcsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgMHgwM2M2OiAweDAwZWQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgMHgyMDE3OiAweDAwOGQsICAgICAjICBET1VCTEUgTE9XIExJTkUKKyAgICAweDIwN2Y6IDB4MDBmYywgICAgICMgIFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgyMjE5OiAweDAwZjksICAgICAjICBCVUxMRVQgT1BFUkFUT1IKKyAgICAweDIyMWE6IDB4MDBmYiwgICAgICMgIFNRVUFSRSBST09UCisgICAgMHgyMjFlOiAweDAwZWMsICAgICAjICBJTkZJTklUWQorICAgIDB4MjIyOTogMHgwMGVmLCAgICAgIyAgSU5URVJTRUNUSU9OCisgICAgMHgyMjQ4OiAweDAwZjcsICAgICAjICBBTE1PU1QgRVFVQUwgVE8KKyAgICAweDIyNjE6IDB4MDBmMCwgICAgICMgIElERU5USUNBTCBUTworICAgIDB4MjI2NDogMHgwMGYzLCAgICAgIyAgTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgyMjY1OiAweDAwZjIsICAgICAjICBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDIzMTA6IDB4MDBhOSwgICAgICMgIFJFVkVSU0VEIE5PVCBTSUdOCisgICAgMHgyMzIwOiAweDAwZjQsICAgICAjICBUT1AgSEFMRiBJTlRFR1JBTAorICAgIDB4MjMyMTogMHgwMGY1LCAgICAgIyAgQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICAweDI1MDA6IDB4MDBjNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwYjMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDI1MGM6IDB4MDBkYSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMGJmLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDBjMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDI1MTg6IDB4MDBkOSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMGMzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMGI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTJjOiAweDAwYzIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMGMxLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwYzUsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NTA6IDB4MDBjZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MjU1MTogMHgwMGJhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MjU1MjogMHgwMGQ1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NTM6IDB4MDBkNiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTU0OiAweDAwYzksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTU1OiAweDAwYjgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTU2OiAweDAwYjcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTU3OiAweDAwYmIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDI1NTg6IDB4MDBkNCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1OTogMHgwMGQzLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTVhOiAweDAwYzgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MjU1YjogMHgwMGJlLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NWM6IDB4MDBiZCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTVkOiAweDAwYmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgyNTVlOiAweDAwYzYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NWY6IDB4MDBjNywgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU2MDogMHgwMGNjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1NjE6IDB4MDBiNSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTYyOiAweDAwYjYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU2MzogMHgwMGI5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjU2NDogMHgwMGQxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2NTogMHgwMGQyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2NjogMHgwMGNiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTY3OiAweDAwY2YsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2ODogMHgwMGQwLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1Njk6IDB4MDBjYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NmE6IDB4MDBkOCwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTZiOiAweDAwZDcsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2YzogMHgwMGNlLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU4MDogMHgwMGRmLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MjU4NDogMHgwMGRjLCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MjU4ODogMHgwMGRiLCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MjU4YzogMHgwMGRkLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgyNTkwOiAweDAwZGUsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgyNTkxOiAweDAwYjAsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MjU5MjogMHgwMGIxLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgyNTkzOiAweDAwYjIsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgyNWEwOiAweDAwZmUsICAgICAjICBCTEFDSyBTUVVBUkUKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYzLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTFjZTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYzLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTFjZTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY0LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhMGU3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY0LnB5CkBAIC0wLDAgKzEsNjkwIEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL01JQ1NGVC9QQy9DUDg2NC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwODY0JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDAyNTogMHgwNjZhLCAgICAgIyAgQVJBQklDIFBFUkNFTlQgU0lHTgorICAgIDB4MDA4MDogMHgwMGIwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwODE6IDB4MDBiNywgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwODI6IDB4MjIxOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MDA4MzogMHgyMjFhLCAgICAgIyAgU1FVQVJFIFJPT1QKKyAgICAweDAwODQ6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDA4NTogMHgyNTAwLCAgICAgIyAgRk9STVMgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MDA4NjogMHgyNTAyLCAgICAgIyAgRk9STVMgTElHSFQgVkVSVElDQUwKKyAgICAweDAwODc6IDB4MjUzYywgICAgICMgIEZPUk1TIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMDg4OiAweDI1MjQsICAgICAjICBGT1JNUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDA4OTogMHgyNTJjLCAgICAgIyAgRk9STVMgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDA4YTogMHgyNTFjLCAgICAgIyAgRk9STVMgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMDhiOiAweDI1MzQsICAgICAjICBGT1JNUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDA4YzogMHgyNTEwLCAgICAgIyAgRk9STVMgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MDA4ZDogMHgyNTBjLCAgICAgIyAgRk9STVMgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwOGU6IDB4MjUxNCwgICAgICMgIEZPUk1TIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MDA4ZjogMHgyNTE4LCAgICAgIyAgRk9STVMgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDAwOTA6IDB4MDNiMiwgICAgICMgIEdSRUVLIFNNQUxMIEJFVEEKKyAgICAweDAwOTE6IDB4MjIxZSwgICAgICMgIElORklOSVRZCisgICAgMHgwMDkyOiAweDAzYzYsICAgICAjICBHUkVFSyBTTUFMTCBQSEkKKyAgICAweDAwOTM6IDB4MDBiMSwgICAgICMgIFBMVVMtT1ItTUlOVVMgU0lHTgorICAgIDB4MDA5NDogMHgwMGJkLCAgICAgIyAgRlJBQ1RJT04gMS8yCisgICAgMHgwMDk1OiAweDAwYmMsICAgICAjICBGUkFDVElPTiAxLzQKKyAgICAweDAwOTY6IDB4MjI0OCwgICAgICMgIEFMTU9TVCBFUVVBTCBUTworICAgIDB4MDA5NzogMHgwMGFiLCAgICAgIyAgTEVGVCBQT0lOVElORyBHVUlMTEVNRVQKKyAgICAweDAwOTg6IDB4MDBiYiwgICAgICMgIFJJR0hUIFBPSU5USU5HIEdVSUxMRU1FVAorICAgIDB4MDA5OTogMHhmZWY3LCAgICAgIyAgQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgV0lUSCBIQU1aQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgMHgwMDlhOiAweGZlZjgsICAgICAjICBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIEhBTVpBIEFCT1ZFIEZJTkFMIEZPUk0KKyAgICAweDAwOWI6IE5vbmUsICAgICAgICMgIFVOREVGSU5FRAorICAgIDB4MDA5YzogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECisgICAgMHgwMDlkOiAweGZlZmIsICAgICAjICBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBJU09MQVRFRCBGT1JNCisgICAgMHgwMDllOiAweGZlZmMsICAgICAjICBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBGSU5BTCBGT1JNCisgICAgMHgwMDlmOiBOb25lLCAgICAgICAjICBVTkRFRklORUQKKyAgICAweDAwYTE6IDB4MDBhZCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGEyOiAweGZlODIsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBGSU5BTCBGT1JNCisgICAgMHgwMGE1OiAweGZlODQsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBBQk9WRSBGSU5BTCBGT1JNCisgICAgMHgwMGE2OiBOb25lLCAgICAgICAjICBVTkRFRklORUQKKyAgICAweDAwYTc6IE5vbmUsICAgICAgICMgIFVOREVGSU5FRAorICAgIDB4MDBhODogMHhmZThlLCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIEZJTkFMIEZPUk0KKyAgICAweDAwYTk6IDB4ZmU4ZiwgICAgICMgIEFSQUJJQyBMRVRURVIgQkVIIElTT0xBVEVEIEZPUk0KKyAgICAweDAwYWE6IDB4ZmU5NSwgICAgICMgIEFSQUJJQyBMRVRURVIgVEVIIElTT0xBVEVEIEZPUk0KKyAgICAweDAwYWI6IDB4ZmU5OSwgICAgICMgIEFSQUJJQyBMRVRURVIgVEhFSCBJU09MQVRFRCBGT1JNCisgICAgMHgwMGFjOiAweDA2MGMsICAgICAjICBBUkFCSUMgQ09NTUEKKyAgICAweDAwYWQ6IDB4ZmU5ZCwgICAgICMgIEFSQUJJQyBMRVRURVIgSkVFTSBJU09MQVRFRCBGT1JNCisgICAgMHgwMGFlOiAweGZlYTEsICAgICAjICBBUkFCSUMgTEVUVEVSIEhBSCBJU09MQVRFRCBGT1JNCisgICAgMHgwMGFmOiAweGZlYTUsICAgICAjICBBUkFCSUMgTEVUVEVSIEtIQUggSVNPTEFURUQgRk9STQorICAgIDB4MDBiMDogMHgwNjYwLCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFpFUk8KKyAgICAweDAwYjE6IDB4MDY2MSwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBPTkUKKyAgICAweDAwYjI6IDB4MDY2MiwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBUV08KKyAgICAweDAwYjM6IDB4MDY2MywgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBUSFJFRQorICAgIDB4MDBiNDogMHgwNjY0LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIEZPVVIKKyAgICAweDAwYjU6IDB4MDY2NSwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBGSVZFCisgICAgMHgwMGI2OiAweDA2NjYsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgU0lYCisgICAgMHgwMGI3OiAweDA2NjcsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgU0VWRU4KKyAgICAweDAwYjg6IDB4MDY2OCwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBFSUdIVAorICAgIDB4MDBiOTogMHgwNjY5LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIE5JTkUKKyAgICAweDAwYmE6IDB4ZmVkMSwgICAgICMgIEFSQUJJQyBMRVRURVIgRkVIIElTT0xBVEVEIEZPUk0KKyAgICAweDAwYmI6IDB4MDYxYiwgICAgICMgIEFSQUJJQyBTRU1JQ09MT04KKyAgICAweDAwYmM6IDB4ZmViMSwgICAgICMgIEFSQUJJQyBMRVRURVIgU0VFTiBJU09MQVRFRCBGT1JNCisgICAgMHgwMGJkOiAweGZlYjUsICAgICAjICBBUkFCSUMgTEVUVEVSIFNIRUVOIElTT0xBVEVEIEZPUk0KKyAgICAweDAwYmU6IDB4ZmViOSwgICAgICMgIEFSQUJJQyBMRVRURVIgU0FEIElTT0xBVEVEIEZPUk0KKyAgICAweDAwYmY6IDB4MDYxZiwgICAgICMgIEFSQUJJQyBRVUVTVElPTiBNQVJLCisgICAgMHgwMGMwOiAweDAwYTIsICAgICAjICBDRU5UIFNJR04KKyAgICAweDAwYzE6IDB4ZmU4MCwgICAgICMgIEFSQUJJQyBMRVRURVIgSEFNWkEgSVNPTEFURUQgRk9STQorICAgIDB4MDBjMjogMHhmZTgxLCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUgSVNPTEFURUQgRk9STQorICAgIDB4MDBjMzogMHhmZTgzLCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUgSVNPTEFURUQgRk9STQorICAgIDB4MDBjNDogMHhmZTg1LCAgICAgIyAgQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgMHgwMGM1OiAweGZlY2EsICAgICAjICBBUkFCSUMgTEVUVEVSIEFJTiBGSU5BTCBGT1JNCisgICAgMHgwMGM2OiAweGZlOGIsICAgICAjICBBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFIElOSVRJQUwgRk9STQorICAgIDB4MDBjNzogMHhmZThkLCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIElTT0xBVEVEIEZPUk0KKyAgICAweDAwYzg6IDB4ZmU5MSwgICAgICMgIEFSQUJJQyBMRVRURVIgQkVIIElOSVRJQUwgRk9STQorICAgIDB4MDBjOTogMHhmZTkzLCAgICAgIyAgQVJBQklDIExFVFRFUiBURUggTUFSQlVUQSBJU09MQVRFRCBGT1JNCisgICAgMHgwMGNhOiAweGZlOTcsICAgICAjICBBUkFCSUMgTEVUVEVSIFRFSCBJTklUSUFMIEZPUk0KKyAgICAweDAwY2I6IDB4ZmU5YiwgICAgICMgIEFSQUJJQyBMRVRURVIgVEhFSCBJTklUSUFMIEZPUk0KKyAgICAweDAwY2M6IDB4ZmU5ZiwgICAgICMgIEFSQUJJQyBMRVRURVIgSkVFTSBJTklUSUFMIEZPUk0KKyAgICAweDAwY2Q6IDB4ZmVhMywgICAgICMgIEFSQUJJQyBMRVRURVIgSEFIIElOSVRJQUwgRk9STQorICAgIDB4MDBjZTogMHhmZWE3LCAgICAgIyAgQVJBQklDIExFVFRFUiBLSEFIIElOSVRJQUwgRk9STQorICAgIDB4MDBjZjogMHhmZWE5LCAgICAgIyAgQVJBQklDIExFVFRFUiBEQUwgSVNPTEFURUQgRk9STQorICAgIDB4MDBkMDogMHhmZWFiLCAgICAgIyAgQVJBQklDIExFVFRFUiBUSEFMIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZDE6IDB4ZmVhZCwgICAgICMgIEFSQUJJQyBMRVRURVIgUkVIIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZDI6IDB4ZmVhZiwgICAgICMgIEFSQUJJQyBMRVRURVIgWkFJTiBJU09MQVRFRCBGT1JNCisgICAgMHgwMGQzOiAweGZlYjMsICAgICAjICBBUkFCSUMgTEVUVEVSIFNFRU4gSU5JVElBTCBGT1JNCisgICAgMHgwMGQ0OiAweGZlYjcsICAgICAjICBBUkFCSUMgTEVUVEVSIFNIRUVOIElOSVRJQUwgRk9STQorICAgIDB4MDBkNTogMHhmZWJiLCAgICAgIyAgQVJBQklDIExFVFRFUiBTQUQgSU5JVElBTCBGT1JNCisgICAgMHgwMGQ2OiAweGZlYmYsICAgICAjICBBUkFCSUMgTEVUVEVSIERBRCBJTklUSUFMIEZPUk0KKyAgICAweDAwZDc6IDB4ZmVjMSwgICAgICMgIEFSQUJJQyBMRVRURVIgVEFIIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZDg6IDB4ZmVjNSwgICAgICMgIEFSQUJJQyBMRVRURVIgWkFIIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZDk6IDB4ZmVjYiwgICAgICMgIEFSQUJJQyBMRVRURVIgQUlOIElOSVRJQUwgRk9STQorICAgIDB4MDBkYTogMHhmZWNmLCAgICAgIyAgQVJBQklDIExFVFRFUiBHSEFJTiBJTklUSUFMIEZPUk0KKyAgICAweDAwZGI6IDB4MDBhNiwgICAgICMgIEJST0tFTiBWRVJUSUNBTCBCQVIKKyAgICAweDAwZGM6IDB4MDBhYywgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGRkOiAweDAwZjcsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGRlOiAweDAwZDcsICAgICAjICBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgMHgwMGRmOiAweGZlYzksICAgICAjICBBUkFCSUMgTEVUVEVSIEFJTiBJU09MQVRFRCBGT1JNCisgICAgMHgwMGUwOiAweDA2NDAsICAgICAjICBBUkFCSUMgVEFUV0VFTAorICAgIDB4MDBlMTogMHhmZWQzLCAgICAgIyAgQVJBQklDIExFVFRFUiBGRUggSU5JVElBTCBGT1JNCisgICAgMHgwMGUyOiAweGZlZDcsICAgICAjICBBUkFCSUMgTEVUVEVSIFFBRiBJTklUSUFMIEZPUk0KKyAgICAweDAwZTM6IDB4ZmVkYiwgICAgICMgIEFSQUJJQyBMRVRURVIgS0FGIElOSVRJQUwgRk9STQorICAgIDB4MDBlNDogMHhmZWRmLCAgICAgIyAgQVJBQklDIExFVFRFUiBMQU0gSU5JVElBTCBGT1JNCisgICAgMHgwMGU1OiAweGZlZTMsICAgICAjICBBUkFCSUMgTEVUVEVSIE1FRU0gSU5JVElBTCBGT1JNCisgICAgMHgwMGU2OiAweGZlZTcsICAgICAjICBBUkFCSUMgTEVUVEVSIE5PT04gSU5JVElBTCBGT1JNCisgICAgMHgwMGU3OiAweGZlZWIsICAgICAjICBBUkFCSUMgTEVUVEVSIEhFSCBJTklUSUFMIEZPUk0KKyAgICAweDAwZTg6IDB4ZmVlZCwgICAgICMgIEFSQUJJQyBMRVRURVIgV0FXIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZTk6IDB4ZmVlZiwgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZWE6IDB4ZmVmMywgICAgICMgIEFSQUJJQyBMRVRURVIgWUVIIElOSVRJQUwgRk9STQorICAgIDB4MDBlYjogMHhmZWJkLCAgICAgIyAgQVJBQklDIExFVFRFUiBEQUQgSVNPTEFURUQgRk9STQorICAgIDB4MDBlYzogMHhmZWNjLCAgICAgIyAgQVJBQklDIExFVFRFUiBBSU4gTUVESUFMIEZPUk0KKyAgICAweDAwZWQ6IDB4ZmVjZSwgICAgICMgIEFSQUJJQyBMRVRURVIgR0hBSU4gRklOQUwgRk9STQorICAgIDB4MDBlZTogMHhmZWNkLCAgICAgIyAgQVJBQklDIExFVFRFUiBHSEFJTiBJU09MQVRFRCBGT1JNCisgICAgMHgwMGVmOiAweGZlZTEsICAgICAjICBBUkFCSUMgTEVUVEVSIE1FRU0gSVNPTEFURUQgRk9STQorICAgIDB4MDBmMDogMHhmZTdkLCAgICAgIyAgQVJBQklDIFNIQUREQSBNRURJQUwgRk9STQorICAgIDB4MDBmMTogMHgwNjUxLCAgICAgIyAgQVJBQklDIFNIQUREQUgKKyAgICAweDAwZjI6IDB4ZmVlNSwgICAgICMgIEFSQUJJQyBMRVRURVIgTk9PTiBJU09MQVRFRCBGT1JNCisgICAgMHgwMGYzOiAweGZlZTksICAgICAjICBBUkFCSUMgTEVUVEVSIEhFSCBJU09MQVRFRCBGT1JNCisgICAgMHgwMGY0OiAweGZlZWMsICAgICAjICBBUkFCSUMgTEVUVEVSIEhFSCBNRURJQUwgRk9STQorICAgIDB4MDBmNTogMHhmZWYwLCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIE1BS1NVUkEgRklOQUwgRk9STQorICAgIDB4MDBmNjogMHhmZWYyLCAgICAgIyAgQVJBQklDIExFVFRFUiBZRUggRklOQUwgRk9STQorICAgIDB4MDBmNzogMHhmZWQwLCAgICAgIyAgQVJBQklDIExFVFRFUiBHSEFJTiBNRURJQUwgRk9STQorICAgIDB4MDBmODogMHhmZWQ1LCAgICAgIyAgQVJBQklDIExFVFRFUiBRQUYgSVNPTEFURUQgRk9STQorICAgIDB4MDBmOTogMHhmZWY1LCAgICAgIyAgQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgMHgwMGZhOiAweGZlZjYsICAgICAjICBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIE1BRERBIEFCT1ZFIEZJTkFMIEZPUk0KKyAgICAweDAwZmI6IDB4ZmVkZCwgICAgICMgIEFSQUJJQyBMRVRURVIgTEFNIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZmM6IDB4ZmVkOSwgICAgICMgIEFSQUJJQyBMRVRURVIgS0FGIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZmQ6IDB4ZmVmMSwgICAgICMgIEFSQUJJQyBMRVRURVIgWUVIIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZmU6IDB4MjVhMCwgICAgICMgIEJMQUNLIFNRVUFSRQorICAgIDB4MDBmZjogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECit9KQorCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAwMDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDAwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwMDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDAwMDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDAwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDAwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwMDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDAwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDAwMGEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwMDBiIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDAwMGMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwMDBkIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MDAwZSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDAwMGYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDAwMTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MDAxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDAwMTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgwMDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgwMDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDAwMTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDAwMTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MDAxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgwMDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MDAxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgwMDFhIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDAwMWIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgwMDFjIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgwMDFkIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MDAxZSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgwMDFmIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgwMDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgwMDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDAwMjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDAwMjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDAwMjQgLT4gRE9MTEFSIFNJR04KKyAgICB1J1x1MDY2YScgICAjICAweDAwMjUgLT4gQVJBQklDIFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MDAyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDAwMjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MDAyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgwMDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgwMDJhIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgwMDJiIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MDAyYyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MDAyZCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDAwMmUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgwMDJmIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDAwMzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MDAzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDAwMzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgwMDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgwMDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDAwMzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MDAzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDAwMzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDAwMzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDAwMzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4MDAzYSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4MDAzYiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDAwM2MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDAwM2QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDAwM2UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDAwM2YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4MDA0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHgwMDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDAwNDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4MDA0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHgwMDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDAwNDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4MDA0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHgwMDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDAwNDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4MDA0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHgwMDRhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDAwNGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4MDA0YyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHgwMDRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDAwNGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4MDA0ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHgwMDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDAwNTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4MDA1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHgwMDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDAwNTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4MDA1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHgwMDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDAwNTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4MDA1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHgwMDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDAwNWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4MDA1YiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHgwMDVjIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4MDA1ZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4MDA1ZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4MDA1ZiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4MDA2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDAwNjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDAwNjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDAwNjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDAwNjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDAwNjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDAwNjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDAwNjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDAwNjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDAwNjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDAwNmEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDAwNmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDAwNmMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDAwNmQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDAwNmUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDAwNmYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDAwNzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDAwNzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDAwNzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDAwNzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDAwNzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDAwNzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDAwNzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDAwNzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDAwNzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDAwNzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDAwN2EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDAwN2IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHgwMDdjIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDAwN2QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4MDA3ZSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4MDA3ZiAtPiBERUxFVEUKKyAgICB1J1x4YjAnICAgICAjICAweDAwODAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweDAwODEgLT4gTUlERExFIERPVAorICAgIHUnXHUyMjE5JyAgICMgIDB4MDA4MiAtPiBCVUxMRVQgT1BFUkFUT1IKKyAgICB1J1x1MjIxYScgICAjICAweDAwODMgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MjU5MicgICAjICAweDAwODQgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1MDAnICAgIyAgMHgwMDg1IC0+IEZPUk1TIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUwMicgICAjICAweDAwODYgLT4gRk9STVMgTElHSFQgVkVSVElDQUwKKyAgICB1J1x1MjUzYycgICAjICAweDAwODcgLT4gRk9STVMgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyNCcgICAjICAweDAwODggLT4gRk9STVMgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjUyYycgICAjICAweDAwODkgLT4gRk9STVMgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTFjJyAgICMgIDB4MDA4YSAtPiBGT1JNUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUzNCcgICAjICAweDAwOGIgLT4gRk9STVMgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUxMCcgICAjICAweDAwOGMgLT4gRk9STVMgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTBjJyAgICMgIDB4MDA4ZCAtPiBGT1JNUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTE0JyAgICMgIDB4MDA4ZSAtPiBGT1JNUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjUxOCcgICAjICAweDAwOGYgLT4gRk9STVMgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MDNiMicgICAjICAweDAwOTAgLT4gR1JFRUsgU01BTEwgQkVUQQorICAgIHUnXHUyMjFlJyAgICMgIDB4MDA5MSAtPiBJTkZJTklUWQorICAgIHUnXHUwM2M2JyAgICMgIDB4MDA5MiAtPiBHUkVFSyBTTUFMTCBQSEkKKyAgICB1J1x4YjEnICAgICAjICAweDAwOTMgLT4gUExVUy1PUi1NSU5VUyBTSUdOCisgICAgdSdceGJkJyAgICAgIyAgMHgwMDk0IC0+IEZSQUNUSU9OIDEvMgorICAgIHUnXHhiYycgICAgICMgIDB4MDA5NSAtPiBGUkFDVElPTiAxLzQKKyAgICB1J1x1MjI0OCcgICAjICAweDAwOTYgLT4gQUxNT1NUIEVRVUFMIFRPCisgICAgdSdceGFiJyAgICAgIyAgMHgwMDk3IC0+IExFRlQgUE9JTlRJTkcgR1VJTExFTUVUCisgICAgdSdceGJiJyAgICAgIyAgMHgwMDk4IC0+IFJJR0hUIFBPSU5USU5HIEdVSUxMRU1FVAorICAgIHUnXHVmZWY3JyAgICMgIDB4MDA5OSAtPiBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIEhBTVpBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVmOCcgICAjICAweDAwOWEgLT4gQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgV0lUSCBIQU1aQSBBQk9WRSBGSU5BTCBGT1JNCisgICAgdSdcdWZmZmUnICAgIyAgMHgwMDliIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4MDA5YyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmVmYicgICAjICAweDAwOWQgLT4gQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWZjJyAgICMgIDB4MDA5ZSAtPiBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBGSU5BTCBGT1JNCisgICAgdSdcdWZmZmUnICAgIyAgMHgwMDlmIC0+IFVOREVGSU5FRAorICAgIHUnXHhhMCcgICAgICMgIDB4MDBhMCAtPiBOT04tQlJFQUtJTkcgU1BBQ0UKKyAgICB1J1x4YWQnICAgICAjICAweDAwYTEgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x1ZmU4MicgICAjICAweDAwYTIgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUgRklOQUwgRk9STQorICAgIHUnXHhhMycgICAgICMgIDB4MDBhMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE0JyAgICAgIyAgMHgwMGE0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x1ZmU4NCcgICAjICAweDAwYTUgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUgRklOQUwgRk9STQorICAgIHUnXHVmZmZlJyAgICMgIDB4MDBhNiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDAwYTcgLT4gVU5ERUZJTkVECisgICAgdSdcdWZlOGUnICAgIyAgMHgwMGE4IC0+IEFSQUJJQyBMRVRURVIgQUxFRiBGSU5BTCBGT1JNCisgICAgdSdcdWZlOGYnICAgIyAgMHgwMGE5IC0+IEFSQUJJQyBMRVRURVIgQkVIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmU5NScgICAjICAweDAwYWEgLT4gQVJBQklDIExFVFRFUiBURUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZTk5JyAgICMgIDB4MDBhYiAtPiBBUkFCSUMgTEVUVEVSIFRIRUggSVNPTEFURUQgRk9STQorICAgIHUnXHUwNjBjJyAgICMgIDB4MDBhYyAtPiBBUkFCSUMgQ09NTUEKKyAgICB1J1x1ZmU5ZCcgICAjICAweDAwYWQgLT4gQVJBQklDIExFVFRFUiBKRUVNIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVhMScgICAjICAweDAwYWUgLT4gQVJBQklDIExFVFRFUiBIQUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWE1JyAgICMgIDB4MDBhZiAtPiBBUkFCSUMgTEVUVEVSIEtIQUggSVNPTEFURUQgRk9STQorICAgIHUnXHUwNjYwJyAgICMgIDB4MDBiMCAtPiBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTworICAgIHUnXHUwNjYxJyAgICMgIDB4MDBiMSAtPiBBUkFCSUMtSU5ESUMgRElHSVQgT05FCisgICAgdSdcdTA2NjInICAgIyAgMHgwMGIyIC0+IEFSQUJJQy1JTkRJQyBESUdJVCBUV08KKyAgICB1J1x1MDY2MycgICAjICAweDAwYjMgLT4gQVJBQklDLUlORElDIERJR0lUIFRIUkVFCisgICAgdSdcdTA2NjQnICAgIyAgMHgwMGI0IC0+IEFSQUJJQy1JTkRJQyBESUdJVCBGT1VSCisgICAgdSdcdTA2NjUnICAgIyAgMHgwMGI1IC0+IEFSQUJJQy1JTkRJQyBESUdJVCBGSVZFCisgICAgdSdcdTA2NjYnICAgIyAgMHgwMGI2IC0+IEFSQUJJQy1JTkRJQyBESUdJVCBTSVgKKyAgICB1J1x1MDY2NycgICAjICAweDAwYjcgLT4gQVJBQklDLUlORElDIERJR0lUIFNFVkVOCisgICAgdSdcdTA2NjgnICAgIyAgMHgwMGI4IC0+IEFSQUJJQy1JTkRJQyBESUdJVCBFSUdIVAorICAgIHUnXHUwNjY5JyAgICMgIDB4MDBiOSAtPiBBUkFCSUMtSU5ESUMgRElHSVQgTklORQorICAgIHUnXHVmZWQxJyAgICMgIDB4MDBiYSAtPiBBUkFCSUMgTEVUVEVSIEZFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdTA2MWInICAgIyAgMHgwMGJiIC0+IEFSQUJJQyBTRU1JQ09MT04KKyAgICB1J1x1ZmViMScgICAjICAweDAwYmMgLT4gQVJBQklDIExFVFRFUiBTRUVOIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmViNScgICAjICAweDAwYmQgLT4gQVJBQklDIExFVFRFUiBTSEVFTiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYjknICAgIyAgMHgwMGJlIC0+IEFSQUJJQyBMRVRURVIgU0FEIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1MDYxZicgICAjICAweDAwYmYgLT4gQVJBQklDIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4YTInICAgICAjICAweDAwYzAgLT4gQ0VOVCBTSUdOCisgICAgdSdcdWZlODAnICAgIyAgMHgwMGMxIC0+IEFSQUJJQyBMRVRURVIgSEFNWkEgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZTgxJyAgICMgIDB4MDBjMiAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlODMnICAgIyAgMHgwMGMzIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmU4NScgICAjICAweDAwYzQgLT4gQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlY2EnICAgIyAgMHgwMGM1IC0+IEFSQUJJQyBMRVRURVIgQUlOIEZJTkFMIEZPUk0KKyAgICB1J1x1ZmU4YicgICAjICAweDAwYzYgLT4gQVJBQklDIExFVFRFUiBZRUggV0lUSCBIQU1aQSBBQk9WRSBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmU4ZCcgICAjICAweDAwYzcgLT4gQVJBQklDIExFVFRFUiBBTEVGIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmU5MScgICAjICAweDAwYzggLT4gQVJBQklDIExFVFRFUiBCRUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZlOTMnICAgIyAgMHgwMGM5IC0+IEFSQUJJQyBMRVRURVIgVEVIIE1BUkJVVEEgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZTk3JyAgICMgIDB4MDBjYSAtPiBBUkFCSUMgTEVUVEVSIFRFSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmU5YicgICAjICAweDAwY2IgLT4gQVJBQklDIExFVFRFUiBUSEVIIElOSVRJQUwgRk9STQorICAgIHUnXHVmZTlmJyAgICMgIDB4MDBjYyAtPiBBUkFCSUMgTEVUVEVSIEpFRU0gSU5JVElBTCBGT1JNCisgICAgdSdcdWZlYTMnICAgIyAgMHgwMGNkIC0+IEFSQUJJQyBMRVRURVIgSEFIIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWE3JyAgICMgIDB4MDBjZSAtPiBBUkFCSUMgTEVUVEVSIEtIQUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZlYTknICAgIyAgMHgwMGNmIC0+IEFSQUJJQyBMRVRURVIgREFMIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVhYicgICAjICAweDAwZDAgLT4gQVJBQklDIExFVFRFUiBUSEFMIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVhZCcgICAjICAweDAwZDEgLT4gQVJBQklDIExFVFRFUiBSRUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWFmJyAgICMgIDB4MDBkMiAtPiBBUkFCSUMgTEVUVEVSIFpBSU4gSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWIzJyAgICMgIDB4MDBkMyAtPiBBUkFCSUMgTEVUVEVSIFNFRU4gSU5JVElBTCBGT1JNCisgICAgdSdcdWZlYjcnICAgIyAgMHgwMGQ0IC0+IEFSQUJJQyBMRVRURVIgU0hFRU4gSU5JVElBTCBGT1JNCisgICAgdSdcdWZlYmInICAgIyAgMHgwMGQ1IC0+IEFSQUJJQyBMRVRURVIgU0FEIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWJmJyAgICMgIDB4MDBkNiAtPiBBUkFCSUMgTEVUVEVSIERBRCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVjMScgICAjICAweDAwZDcgLT4gQVJBQklDIExFVFRFUiBUQUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWM1JyAgICMgIDB4MDBkOCAtPiBBUkFCSUMgTEVUVEVSIFpBSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlY2InICAgIyAgMHgwMGQ5IC0+IEFSQUJJQyBMRVRURVIgQUlOIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWNmJyAgICMgIDB4MDBkYSAtPiBBUkFCSUMgTEVUVEVSIEdIQUlOIElOSVRJQUwgRk9STQorICAgIHUnXHhhNicgICAgICMgIDB4MDBkYiAtPiBCUk9LRU4gVkVSVElDQUwgQkFSCisgICAgdSdceGFjJyAgICAgIyAgMHgwMGRjIC0+IE5PVCBTSUdOCisgICAgdSdceGY3JyAgICAgIyAgMHgwMGRkIC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x4ZDcnICAgICAjICAweDAwZGUgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHVmZWM5JyAgICMgIDB4MDBkZiAtPiBBUkFCSUMgTEVUVEVSIEFJTiBJU09MQVRFRCBGT1JNCisgICAgdSdcdTA2NDAnICAgIyAgMHgwMGUwIC0+IEFSQUJJQyBUQVRXRUVMCisgICAgdSdcdWZlZDMnICAgIyAgMHgwMGUxIC0+IEFSQUJJQyBMRVRURVIgRkVIIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWQ3JyAgICMgIDB4MDBlMiAtPiBBUkFCSUMgTEVUVEVSIFFBRiBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVkYicgICAjICAweDAwZTMgLT4gQVJBQklDIExFVFRFUiBLQUYgSU5JVElBTCBGT1JNCisgICAgdSdcdWZlZGYnICAgIyAgMHgwMGU0IC0+IEFSQUJJQyBMRVRURVIgTEFNIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWUzJyAgICMgIDB4MDBlNSAtPiBBUkFCSUMgTEVUVEVSIE1FRU0gSU5JVElBTCBGT1JNCisgICAgdSdcdWZlZTcnICAgIyAgMHgwMGU2IC0+IEFSQUJJQyBMRVRURVIgTk9PTiBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVlYicgICAjICAweDAwZTcgLT4gQVJBQklDIExFVFRFUiBIRUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZlZWQnICAgIyAgMHgwMGU4IC0+IEFSQUJJQyBMRVRURVIgV0FXIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVlZicgICAjICAweDAwZTkgLT4gQVJBQklDIExFVFRFUiBBTEVGIE1BS1NVUkEgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWYzJyAgICMgIDB4MDBlYSAtPiBBUkFCSUMgTEVUVEVSIFlFSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmViZCcgICAjICAweDAwZWIgLT4gQVJBQklDIExFVFRFUiBEQUQgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWNjJyAgICMgIDB4MDBlYyAtPiBBUkFCSUMgTEVUVEVSIEFJTiBNRURJQUwgRk9STQorICAgIHUnXHVmZWNlJyAgICMgIDB4MDBlZCAtPiBBUkFCSUMgTEVUVEVSIEdIQUlOIEZJTkFMIEZPUk0KKyAgICB1J1x1ZmVjZCcgICAjICAweDAwZWUgLT4gQVJBQklDIExFVFRFUiBHSEFJTiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZTEnICAgIyAgMHgwMGVmIC0+IEFSQUJJQyBMRVRURVIgTUVFTSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlN2QnICAgIyAgMHgwMGYwIC0+IEFSQUJJQyBTSEFEREEgTUVESUFMIEZPUk0KKyAgICB1J1x1MDY1MScgICAjICAweDAwZjEgLT4gQVJBQklDIFNIQUREQUgKKyAgICB1J1x1ZmVlNScgICAjICAweDAwZjIgLT4gQVJBQklDIExFVFRFUiBOT09OIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVlOScgICAjICAweDAwZjMgLT4gQVJBQklDIExFVFRFUiBIRUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWVjJyAgICMgIDB4MDBmNCAtPiBBUkFCSUMgTEVUVEVSIEhFSCBNRURJQUwgRk9STQorICAgIHUnXHVmZWYwJyAgICMgIDB4MDBmNSAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQSBGSU5BTCBGT1JNCisgICAgdSdcdWZlZjInICAgIyAgMHgwMGY2IC0+IEFSQUJJQyBMRVRURVIgWUVIIEZJTkFMIEZPUk0KKyAgICB1J1x1ZmVkMCcgICAjICAweDAwZjcgLT4gQVJBQklDIExFVFRFUiBHSEFJTiBNRURJQUwgRk9STQorICAgIHUnXHVmZWQ1JyAgICMgIDB4MDBmOCAtPiBBUkFCSUMgTEVUVEVSIFFBRiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZjUnICAgIyAgMHgwMGY5IC0+IEFSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIFdJVEggTUFEREEgQUJPVkUgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWY2JyAgICMgIDB4MDBmYSAtPiBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIE1BRERBIEFCT1ZFIEZJTkFMIEZPUk0KKyAgICB1J1x1ZmVkZCcgICAjICAweDAwZmIgLT4gQVJBQklDIExFVFRFUiBMQU0gSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWQ5JyAgICMgIDB4MDBmYyAtPiBBUkFCSUMgTEVUVEVSIEtBRiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZjEnICAgIyAgMHgwMGZkIC0+IEFSQUJJQyBMRVRURVIgWUVIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdcdWZmZmUnICAgIyAgMHgwMGZmIC0+IFVOREVGSU5FRAorKQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHsKKyAgICAweDAwMDA6IDB4MDAwMCwgICAgICMgIE5VTEwKKyAgICAweDAwMDE6IDB4MDAwMSwgICAgICMgIFNUQVJUIE9GIEhFQURJTkcKKyAgICAweDAwMDI6IDB4MDAwMiwgICAgICMgIFNUQVJUIE9GIFRFWFQKKyAgICAweDAwMDM6IDB4MDAwMywgICAgICMgIEVORCBPRiBURVhUCisgICAgMHgwMDA0OiAweDAwMDQsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgMHgwMDA1OiAweDAwMDUsICAgICAjICBFTlFVSVJZCisgICAgMHgwMDA2OiAweDAwMDYsICAgICAjICBBQ0tOT1dMRURHRQorICAgIDB4MDAwNzogMHgwMDA3LCAgICAgIyAgQkVMTAorICAgIDB4MDAwODogMHgwMDA4LCAgICAgIyAgQkFDS1NQQUNFCisgICAgMHgwMDA5OiAweDAwMDksICAgICAjICBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICAweDAwMGE6IDB4MDAwYSwgICAgICMgIExJTkUgRkVFRAorICAgIDB4MDAwYjogMHgwMDBiLCAgICAgIyAgVkVSVElDQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYzogMHgwMDBjLCAgICAgIyAgRk9STSBGRUVECisgICAgMHgwMDBkOiAweDAwMGQsICAgICAjICBDQVJSSUFHRSBSRVRVUk4KKyAgICAweDAwMGU6IDB4MDAwZSwgICAgICMgIFNISUZUIE9VVAorICAgIDB4MDAwZjogMHgwMDBmLCAgICAgIyAgU0hJRlQgSU4KKyAgICAweDAwMTA6IDB4MDAxMCwgICAgICMgIERBVEEgTElOSyBFU0NBUEUKKyAgICAweDAwMTE6IDB4MDAxMSwgICAgICMgIERFVklDRSBDT05UUk9MIE9ORQorICAgIDB4MDAxMjogMHgwMDEyLCAgICAgIyAgREVWSUNFIENPTlRST0wgVFdPCisgICAgMHgwMDEzOiAweDAwMTMsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIDB4MDAxNDogMHgwMDE0LCAgICAgIyAgREVWSUNFIENPTlRST0wgRk9VUgorICAgIDB4MDAxNTogMHgwMDE1LCAgICAgIyAgTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICAweDAwMTY6IDB4MDAxNiwgICAgICMgIFNZTkNIUk9OT1VTIElETEUKKyAgICAweDAwMTc6IDB4MDAxNywgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICAweDAwMTg6IDB4MDAxOCwgICAgICMgIENBTkNFTAorICAgIDB4MDAxOTogMHgwMDE5LCAgICAgIyAgRU5EIE9GIE1FRElVTQorICAgIDB4MDAxYTogMHgwMDFhLCAgICAgIyAgU1VCU1RJVFVURQorICAgIDB4MDAxYjogMHgwMDFiLCAgICAgIyAgRVNDQVBFCisgICAgMHgwMDFjOiAweDAwMWMsICAgICAjICBGSUxFIFNFUEFSQVRPUgorICAgIDB4MDAxZDogMHgwMDFkLCAgICAgIyAgR1JPVVAgU0VQQVJBVE9SCisgICAgMHgwMDFlOiAweDAwMWUsICAgICAjICBSRUNPUkQgU0VQQVJBVE9SCisgICAgMHgwMDFmOiAweDAwMWYsICAgICAjICBVTklUIFNFUEFSQVRPUgorICAgIDB4MDAyMDogMHgwMDIwLCAgICAgIyAgU1BBQ0UKKyAgICAweDAwMjE6IDB4MDAyMSwgICAgICMgIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwMjI6IDB4MDAyMiwgICAgICMgIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMDIzOiAweDAwMjMsICAgICAjICBOVU1CRVIgU0lHTgorICAgIDB4MDAyNDogMHgwMDI0LCAgICAgIyAgRE9MTEFSIFNJR04KKyAgICAweDAwMjY6IDB4MDAyNiwgICAgICMgIEFNUEVSU0FORAorICAgIDB4MDAyNzogMHgwMDI3LCAgICAgIyAgQVBPU1RST1BIRQorICAgIDB4MDAyODogMHgwMDI4LCAgICAgIyAgTEVGVCBQQVJFTlRIRVNJUworICAgIDB4MDAyOTogMHgwMDI5LCAgICAgIyAgUklHSFQgUEFSRU5USEVTSVMKKyAgICAweDAwMmE6IDB4MDAyYSwgICAgICMgIEFTVEVSSVNLCisgICAgMHgwMDJiOiAweDAwMmIsICAgICAjICBQTFVTIFNJR04KKyAgICAweDAwMmM6IDB4MDAyYywgICAgICMgIENPTU1BCisgICAgMHgwMDJkOiAweDAwMmQsICAgICAjICBIWVBIRU4tTUlOVVMKKyAgICAweDAwMmU6IDB4MDAyZSwgICAgICMgIEZVTEwgU1RPUAorICAgIDB4MDAyZjogMHgwMDJmLCAgICAgIyAgU09MSURVUworICAgIDB4MDAzMDogMHgwMDMwLCAgICAgIyAgRElHSVQgWkVSTworICAgIDB4MDAzMTogMHgwMDMxLCAgICAgIyAgRElHSVQgT05FCisgICAgMHgwMDMyOiAweDAwMzIsICAgICAjICBESUdJVCBUV08KKyAgICAweDAwMzM6IDB4MDAzMywgICAgICMgIERJR0lUIFRIUkVFCisgICAgMHgwMDM0OiAweDAwMzQsICAgICAjICBESUdJVCBGT1VSCisgICAgMHgwMDM1OiAweDAwMzUsICAgICAjICBESUdJVCBGSVZFCisgICAgMHgwMDM2OiAweDAwMzYsICAgICAjICBESUdJVCBTSVgKKyAgICAweDAwMzc6IDB4MDAzNywgICAgICMgIERJR0lUIFNFVkVOCisgICAgMHgwMDM4OiAweDAwMzgsICAgICAjICBESUdJVCBFSUdIVAorICAgIDB4MDAzOTogMHgwMDM5LCAgICAgIyAgRElHSVQgTklORQorICAgIDB4MDAzYTogMHgwMDNhLCAgICAgIyAgQ09MT04KKyAgICAweDAwM2I6IDB4MDAzYiwgICAgICMgIFNFTUlDT0xPTgorICAgIDB4MDAzYzogMHgwMDNjLCAgICAgIyAgTEVTUy1USEFOIFNJR04KKyAgICAweDAwM2Q6IDB4MDAzZCwgICAgICMgIEVRVUFMUyBTSUdOCisgICAgMHgwMDNlOiAweDAwM2UsICAgICAjICBHUkVBVEVSLVRIQU4gU0lHTgorICAgIDB4MDAzZjogMHgwMDNmLCAgICAgIyAgUVVFU1RJT04gTUFSSworICAgIDB4MDA0MDogMHgwMDQwLCAgICAgIyAgQ09NTUVSQ0lBTCBBVAorICAgIDB4MDA0MTogMHgwMDQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIDB4MDA0MjogMHgwMDQyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIDB4MDA0MzogMHgwMDQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIDB4MDA0NDogMHgwMDQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIDB4MDA0NTogMHgwMDQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIDB4MDA0NjogMHgwMDQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIDB4MDA0NzogMHgwMDQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIDB4MDA0ODogMHgwMDQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIDB4MDA0OTogMHgwMDQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIDB4MDA0YTogMHgwMDRhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIDB4MDA0YjogMHgwMDRiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIDB4MDA0YzogMHgwMDRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIDB4MDA0ZDogMHgwMDRkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIDB4MDA0ZTogMHgwMDRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIDB4MDA0ZjogMHgwMDRmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIDB4MDA1MDogMHgwMDUwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIDB4MDA1MTogMHgwMDUxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIDB4MDA1MjogMHgwMDUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIDB4MDA1MzogMHgwMDUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIDB4MDA1NDogMHgwMDU0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIDB4MDA1NTogMHgwMDU1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDA1NjogMHgwMDU2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIDB4MDA1NzogMHgwMDU3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIDB4MDA1ODogMHgwMDU4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIDB4MDA1OTogMHgwMDU5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIDB4MDA1YTogMHgwMDVhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIDB4MDA1YjogMHgwMDViLCAgICAgIyAgTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1YzogMHgwMDVjLCAgICAgIyAgUkVWRVJTRSBTT0xJRFVTCisgICAgMHgwMDVkOiAweDAwNWQsICAgICAjICBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1ZTogMHgwMDVlLCAgICAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICAweDAwNWY6IDB4MDA1ZiwgICAgICMgIExPVyBMSU5FCisgICAgMHgwMDYwOiAweDAwNjAsICAgICAjICBHUkFWRSBBQ0NFTlQKKyAgICAweDAwNjE6IDB4MDA2MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgMHgwMDYyOiAweDAwNjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIDB4MDA2MzogMHgwMDYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICAweDAwNjQ6IDB4MDA2NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBECisgICAgMHgwMDY1OiAweDAwNjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIDB4MDA2NjogMHgwMDY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICAweDAwNjc6IDB4MDA2NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgMHgwMDY4OiAweDAwNjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIDB4MDA2OTogMHgwMDY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICAweDAwNmE6IDB4MDA2YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgMHgwMDZiOiAweDAwNmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIDB4MDA2YzogMHgwMDZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICAweDAwNmQ6IDB4MDA2ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgMHgwMDZlOiAweDAwNmUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDA2ZjogMHgwMDZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICAweDAwNzA6IDB4MDA3MCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgMHgwMDcxOiAweDAwNzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIDB4MDA3MjogMHgwMDcyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICAweDAwNzM6IDB4MDA3MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgMHgwMDc0OiAweDAwNzQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIDB4MDA3NTogMHgwMDc1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICAweDAwNzY6IDB4MDA3NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgMHgwMDc3OiAweDAwNzcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIDB4MDA3ODogMHgwMDc4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICAweDAwNzk6IDB4MDA3OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgMHgwMDdhOiAweDAwN2EsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIDB4MDA3YjogMHgwMDdiLCAgICAgIyAgTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdjOiAweDAwN2MsICAgICAjICBWRVJUSUNBTCBMSU5FCisgICAgMHgwMDdkOiAweDAwN2QsICAgICAjICBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdlOiAweDAwN2UsICAgICAjICBUSUxERQorICAgIDB4MDA3ZjogMHgwMDdmLCAgICAgIyAgREVMRVRFCisgICAgMHgwMGEwOiAweDAwYTAsICAgICAjICBOT04tQlJFQUtJTkcgU1BBQ0UKKyAgICAweDAwYTI6IDB4MDBjMCwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDBhMzogMHgwMGEzLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDBhNDogMHgwMGE0LCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBhNjogMHgwMGRiLCAgICAgIyAgQlJPS0VOIFZFUlRJQ0FMIEJBUgorICAgIDB4MDBhYjogMHgwMDk3LCAgICAgIyAgTEVGVCBQT0lOVElORyBHVUlMTEVNRVQKKyAgICAweDAwYWM6IDB4MDBkYywgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGFkOiAweDAwYTEsICAgICAjICBTT0ZUIEhZUEhFTgorICAgIDB4MDBiMDogMHgwMDgwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwYjE6IDB4MDA5MywgICAgICMgIFBMVVMtT1ItTUlOVVMgU0lHTgorICAgIDB4MDBiNzogMHgwMDgxLCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBiYjogMHgwMDk4LCAgICAgIyAgUklHSFQgUE9JTlRJTkcgR1VJTExFTUVUCisgICAgMHgwMGJjOiAweDAwOTUsICAgICAjICBGUkFDVElPTiAxLzQKKyAgICAweDAwYmQ6IDB4MDA5NCwgICAgICMgIEZSQUNUSU9OIDEvMgorICAgIDB4MDBkNzogMHgwMGRlLCAgICAgIyAgTVVMVElQTElDQVRJT04gU0lHTgorICAgIDB4MDBmNzogMHgwMGRkLCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDNiMjogMHgwMDkwLCAgICAgIyAgR1JFRUsgU01BTEwgQkVUQQorICAgIDB4MDNjNjogMHgwMDkyLCAgICAgIyAgR1JFRUsgU01BTEwgUEhJCisgICAgMHgwNjBjOiAweDAwYWMsICAgICAjICBBUkFCSUMgQ09NTUEKKyAgICAweDA2MWI6IDB4MDBiYiwgICAgICMgIEFSQUJJQyBTRU1JQ09MT04KKyAgICAweDA2MWY6IDB4MDBiZiwgICAgICMgIEFSQUJJQyBRVUVTVElPTiBNQVJLCisgICAgMHgwNjQwOiAweDAwZTAsICAgICAjICBBUkFCSUMgVEFUV0VFTAorICAgIDB4MDY1MTogMHgwMGYxLCAgICAgIyAgQVJBQklDIFNIQUREQUgKKyAgICAweDA2NjA6IDB4MDBiMCwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPCisgICAgMHgwNjYxOiAweDAwYjEsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgT05FCisgICAgMHgwNjYyOiAweDAwYjIsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgVFdPCisgICAgMHgwNjYzOiAweDAwYjMsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgVEhSRUUKKyAgICAweDA2NjQ6IDB4MDBiNCwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBGT1VSCisgICAgMHgwNjY1OiAweDAwYjUsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgRklWRQorICAgIDB4MDY2NjogMHgwMGI2LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFNJWAorICAgIDB4MDY2NzogMHgwMGI3LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFNFVkVOCisgICAgMHgwNjY4OiAweDAwYjgsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgRUlHSFQKKyAgICAweDA2Njk6IDB4MDBiOSwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBOSU5FCisgICAgMHgwNjZhOiAweDAwMjUsICAgICAjICBBUkFCSUMgUEVSQ0VOVCBTSUdOCisgICAgMHgyMjE5OiAweDAwODIsICAgICAjICBCVUxMRVQgT1BFUkFUT1IKKyAgICAweDIyMWE6IDB4MDA4MywgICAgICMgIFNRVUFSRSBST09UCisgICAgMHgyMjFlOiAweDAwOTEsICAgICAjICBJTkZJTklUWQorICAgIDB4MjI0ODogMHgwMDk2LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgyNTAwOiAweDAwODUsICAgICAjICBGT1JNUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwODYsICAgICAjICBGT1JNUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MjUwYzogMHgwMDhkLCAgICAgIyAgRk9STVMgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1MTA6IDB4MDA4YywgICAgICMgIEZPUk1TIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDA4ZSwgICAgICMgIEZPUk1TIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MjUxODogMHgwMDhmLCAgICAgIyAgRk9STVMgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDI1MWM6IDB4MDA4YSwgICAgICMgIEZPUk1TIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMDg4LCAgICAgIyAgRk9STVMgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1MmM6IDB4MDA4OSwgICAgICMgIEZPUk1TIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1MzQ6IDB4MDA4YiwgICAgICMgIEZPUk1TIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwODcsICAgICAjICBGT1JNUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU5MjogMHgwMDg0LCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgyNWEwOiAweDAwZmUsICAgICAjICBCTEFDSyBTUVVBUkUKKyAgICAweGZlN2Q6IDB4MDBmMCwgICAgICMgIEFSQUJJQyBTSEFEREEgTUVESUFMIEZPUk0KKyAgICAweGZlODA6IDB4MDBjMSwgICAgICMgIEFSQUJJQyBMRVRURVIgSEFNWkEgSVNPTEFURUQgRk9STQorICAgIDB4ZmU4MTogMHgwMGMyLCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUgSVNPTEFURUQgRk9STQorICAgIDB4ZmU4MjogMHgwMGEyLCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUgRklOQUwgRk9STQorICAgIDB4ZmU4MzogMHgwMGMzLCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUgSVNPTEFURUQgRk9STQorICAgIDB4ZmU4NDogMHgwMGE1LCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUgRklOQUwgRk9STQorICAgIDB4ZmU4NTogMHgwMGM0LCAgICAgIyAgQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgMHhmZThiOiAweDAwYzYsICAgICAjICBBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFIElOSVRJQUwgRk9STQorICAgIDB4ZmU4ZDogMHgwMGM3LCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIElTT0xBVEVEIEZPUk0KKyAgICAweGZlOGU6IDB4MDBhOCwgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRiBGSU5BTCBGT1JNCisgICAgMHhmZThmOiAweDAwYTksICAgICAjICBBUkFCSUMgTEVUVEVSIEJFSCBJU09MQVRFRCBGT1JNCisgICAgMHhmZTkxOiAweDAwYzgsICAgICAjICBBUkFCSUMgTEVUVEVSIEJFSCBJTklUSUFMIEZPUk0KKyAgICAweGZlOTM6IDB4MDBjOSwgICAgICMgIEFSQUJJQyBMRVRURVIgVEVIIE1BUkJVVEEgSVNPTEFURUQgRk9STQorICAgIDB4ZmU5NTogMHgwMGFhLCAgICAgIyAgQVJBQklDIExFVFRFUiBURUggSVNPTEFURUQgRk9STQorICAgIDB4ZmU5NzogMHgwMGNhLCAgICAgIyAgQVJBQklDIExFVFRFUiBURUggSU5JVElBTCBGT1JNCisgICAgMHhmZTk5OiAweDAwYWIsICAgICAjICBBUkFCSUMgTEVUVEVSIFRIRUggSVNPTEFURUQgRk9STQorICAgIDB4ZmU5YjogMHgwMGNiLCAgICAgIyAgQVJBQklDIExFVFRFUiBUSEVIIElOSVRJQUwgRk9STQorICAgIDB4ZmU5ZDogMHgwMGFkLCAgICAgIyAgQVJBQklDIExFVFRFUiBKRUVNIElTT0xBVEVEIEZPUk0KKyAgICAweGZlOWY6IDB4MDBjYywgICAgICMgIEFSQUJJQyBMRVRURVIgSkVFTSBJTklUSUFMIEZPUk0KKyAgICAweGZlYTE6IDB4MDBhZSwgICAgICMgIEFSQUJJQyBMRVRURVIgSEFIIElTT0xBVEVEIEZPUk0KKyAgICAweGZlYTM6IDB4MDBjZCwgICAgICMgIEFSQUJJQyBMRVRURVIgSEFIIElOSVRJQUwgRk9STQorICAgIDB4ZmVhNTogMHgwMGFmLCAgICAgIyAgQVJBQklDIExFVFRFUiBLSEFIIElTT0xBVEVEIEZPUk0KKyAgICAweGZlYTc6IDB4MDBjZSwgICAgICMgIEFSQUJJQyBMRVRURVIgS0hBSCBJTklUSUFMIEZPUk0KKyAgICAweGZlYTk6IDB4MDBjZiwgICAgICMgIEFSQUJJQyBMRVRURVIgREFMIElTT0xBVEVEIEZPUk0KKyAgICAweGZlYWI6IDB4MDBkMCwgICAgICMgIEFSQUJJQyBMRVRURVIgVEhBTCBJU09MQVRFRCBGT1JNCisgICAgMHhmZWFkOiAweDAwZDEsICAgICAjICBBUkFCSUMgTEVUVEVSIFJFSCBJU09MQVRFRCBGT1JNCisgICAgMHhmZWFmOiAweDAwZDIsICAgICAjICBBUkFCSUMgTEVUVEVSIFpBSU4gSVNPTEFURUQgRk9STQorICAgIDB4ZmViMTogMHgwMGJjLCAgICAgIyAgQVJBQklDIExFVFRFUiBTRUVOIElTT0xBVEVEIEZPUk0KKyAgICAweGZlYjM6IDB4MDBkMywgICAgICMgIEFSQUJJQyBMRVRURVIgU0VFTiBJTklUSUFMIEZPUk0KKyAgICAweGZlYjU6IDB4MDBiZCwgICAgICMgIEFSQUJJQyBMRVRURVIgU0hFRU4gSVNPTEFURUQgRk9STQorICAgIDB4ZmViNzogMHgwMGQ0LCAgICAgIyAgQVJBQklDIExFVFRFUiBTSEVFTiBJTklUSUFMIEZPUk0KKyAgICAweGZlYjk6IDB4MDBiZSwgICAgICMgIEFSQUJJQyBMRVRURVIgU0FEIElTT0xBVEVEIEZPUk0KKyAgICAweGZlYmI6IDB4MDBkNSwgICAgICMgIEFSQUJJQyBMRVRURVIgU0FEIElOSVRJQUwgRk9STQorICAgIDB4ZmViZDogMHgwMGViLCAgICAgIyAgQVJBQklDIExFVFRFUiBEQUQgSVNPTEFURUQgRk9STQorICAgIDB4ZmViZjogMHgwMGQ2LCAgICAgIyAgQVJBQklDIExFVFRFUiBEQUQgSU5JVElBTCBGT1JNCisgICAgMHhmZWMxOiAweDAwZDcsICAgICAjICBBUkFCSUMgTEVUVEVSIFRBSCBJU09MQVRFRCBGT1JNCisgICAgMHhmZWM1OiAweDAwZDgsICAgICAjICBBUkFCSUMgTEVUVEVSIFpBSCBJU09MQVRFRCBGT1JNCisgICAgMHhmZWM5OiAweDAwZGYsICAgICAjICBBUkFCSUMgTEVUVEVSIEFJTiBJU09MQVRFRCBGT1JNCisgICAgMHhmZWNhOiAweDAwYzUsICAgICAjICBBUkFCSUMgTEVUVEVSIEFJTiBGSU5BTCBGT1JNCisgICAgMHhmZWNiOiAweDAwZDksICAgICAjICBBUkFCSUMgTEVUVEVSIEFJTiBJTklUSUFMIEZPUk0KKyAgICAweGZlY2M6IDB4MDBlYywgICAgICMgIEFSQUJJQyBMRVRURVIgQUlOIE1FRElBTCBGT1JNCisgICAgMHhmZWNkOiAweDAwZWUsICAgICAjICBBUkFCSUMgTEVUVEVSIEdIQUlOIElTT0xBVEVEIEZPUk0KKyAgICAweGZlY2U6IDB4MDBlZCwgICAgICMgIEFSQUJJQyBMRVRURVIgR0hBSU4gRklOQUwgRk9STQorICAgIDB4ZmVjZjogMHgwMGRhLCAgICAgIyAgQVJBQklDIExFVFRFUiBHSEFJTiBJTklUSUFMIEZPUk0KKyAgICAweGZlZDA6IDB4MDBmNywgICAgICMgIEFSQUJJQyBMRVRURVIgR0hBSU4gTUVESUFMIEZPUk0KKyAgICAweGZlZDE6IDB4MDBiYSwgICAgICMgIEFSQUJJQyBMRVRURVIgRkVIIElTT0xBVEVEIEZPUk0KKyAgICAweGZlZDM6IDB4MDBlMSwgICAgICMgIEFSQUJJQyBMRVRURVIgRkVIIElOSVRJQUwgRk9STQorICAgIDB4ZmVkNTogMHgwMGY4LCAgICAgIyAgQVJBQklDIExFVFRFUiBRQUYgSVNPTEFURUQgRk9STQorICAgIDB4ZmVkNzogMHgwMGUyLCAgICAgIyAgQVJBQklDIExFVFRFUiBRQUYgSU5JVElBTCBGT1JNCisgICAgMHhmZWQ5OiAweDAwZmMsICAgICAjICBBUkFCSUMgTEVUVEVSIEtBRiBJU09MQVRFRCBGT1JNCisgICAgMHhmZWRiOiAweDAwZTMsICAgICAjICBBUkFCSUMgTEVUVEVSIEtBRiBJTklUSUFMIEZPUk0KKyAgICAweGZlZGQ6IDB4MDBmYiwgICAgICMgIEFSQUJJQyBMRVRURVIgTEFNIElTT0xBVEVEIEZPUk0KKyAgICAweGZlZGY6IDB4MDBlNCwgICAgICMgIEFSQUJJQyBMRVRURVIgTEFNIElOSVRJQUwgRk9STQorICAgIDB4ZmVlMTogMHgwMGVmLCAgICAgIyAgQVJBQklDIExFVFRFUiBNRUVNIElTT0xBVEVEIEZPUk0KKyAgICAweGZlZTM6IDB4MDBlNSwgICAgICMgIEFSQUJJQyBMRVRURVIgTUVFTSBJTklUSUFMIEZPUk0KKyAgICAweGZlZTU6IDB4MDBmMiwgICAgICMgIEFSQUJJQyBMRVRURVIgTk9PTiBJU09MQVRFRCBGT1JNCisgICAgMHhmZWU3OiAweDAwZTYsICAgICAjICBBUkFCSUMgTEVUVEVSIE5PT04gSU5JVElBTCBGT1JNCisgICAgMHhmZWU5OiAweDAwZjMsICAgICAjICBBUkFCSUMgTEVUVEVSIEhFSCBJU09MQVRFRCBGT1JNCisgICAgMHhmZWViOiAweDAwZTcsICAgICAjICBBUkFCSUMgTEVUVEVSIEhFSCBJTklUSUFMIEZPUk0KKyAgICAweGZlZWM6IDB4MDBmNCwgICAgICMgIEFSQUJJQyBMRVRURVIgSEVIIE1FRElBTCBGT1JNCisgICAgMHhmZWVkOiAweDAwZTgsICAgICAjICBBUkFCSUMgTEVUVEVSIFdBVyBJU09MQVRFRCBGT1JNCisgICAgMHhmZWVmOiAweDAwZTksICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQSBJU09MQVRFRCBGT1JNCisgICAgMHhmZWYwOiAweDAwZjUsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQSBGSU5BTCBGT1JNCisgICAgMHhmZWYxOiAweDAwZmQsICAgICAjICBBUkFCSUMgTEVUVEVSIFlFSCBJU09MQVRFRCBGT1JNCisgICAgMHhmZWYyOiAweDAwZjYsICAgICAjICBBUkFCSUMgTEVUVEVSIFlFSCBGSU5BTCBGT1JNCisgICAgMHhmZWYzOiAweDAwZWEsICAgICAjICBBUkFCSUMgTEVUVEVSIFlFSCBJTklUSUFMIEZPUk0KKyAgICAweGZlZjU6IDB4MDBmOSwgICAgICMgIEFSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIFdJVEggTUFEREEgQUJPVkUgSVNPTEFURUQgRk9STQorICAgIDB4ZmVmNjogMHgwMGZhLCAgICAgIyAgQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBGSU5BTCBGT1JNCisgICAgMHhmZWY3OiAweDAwOTksICAgICAjICBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIEhBTVpBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKyAgICAweGZlZjg6IDB4MDA5YSwgICAgICMgIEFSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIFdJVEggSEFNWkEgQUJPVkUgRklOQUwgRk9STQorICAgIDB4ZmVmYjogMHgwMDlkLCAgICAgIyAgQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgSVNPTEFURUQgRk9STQorICAgIDB4ZmVmYzogMHgwMDllLCAgICAgIyAgQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgRklOQUwgRk9STQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjQucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMmI0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjQucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMmI0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjUucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWY0NWYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjUucHkKQEAgLTAsMCArMSw2OTggQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgZ2VuZXJhdGVkIGZyb20gJ1ZFTkRPUlMvTUlDU0ZUL1BDL0NQODY1LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A4NjUnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgMHgwMDgwOiAweDAwYzcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4MTogMHgwMGZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODI6IDB4MDBlOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwODM6IDB4MDBlMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4NDogMHgwMGU0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODU6IDB4MDBlMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwODY6IDB4MDBlNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA4NzogMHgwMGU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDg4OiAweDAwZWEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODk6IDB4MDBlYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhhOiAweDAwZTgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMDhiOiAweDAwZWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4YzogMHgwMGVlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDhkOiAweDAwZWMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMDhlOiAweDAwYzQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhmOiAweDAwYzUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA5MDogMHgwMGM5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDkxOiAweDAwZTYsICAgICAjICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MjogMHgwMGM2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MzogMHgwMGY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk0OiAweDAwZjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5NTogMHgwMGYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDA5NjogMHgwMGZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk3OiAweDAwZjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMDk4OiAweDAwZmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5OTogMHgwMGQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YTogMHgwMGRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YjogMHgwMGY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwOWM6IDB4MDBhMywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwOWQ6IDB4MDBkOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwOWU6IDB4MjBhNywgICAgICMgIFBFU0VUQSBTSUdOCisgICAgMHgwMDlmOiAweDAxOTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICAweDAwYTA6IDB4MDBlMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwYTE6IDB4MDBlZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwYTI6IDB4MDBmMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwYTM6IDB4MDBmYSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwYTQ6IDB4MDBmMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwYTU6IDB4MDBkMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBhNjogMHgwMGFhLCAgICAgIyAgRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYTc6IDB4MDBiYSwgICAgICMgIE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBhODogMHgwMGJmLCAgICAgIyAgSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIDB4MDBhOTogMHgyMzEwLCAgICAgIyAgUkVWRVJTRUQgTk9UIFNJR04KKyAgICAweDAwYWE6IDB4MDBhYywgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGFiOiAweDAwYmQsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYWM6IDB4MDBiYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBhZDogMHgwMGExLCAgICAgIyAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDBhZTogMHgwMGFiLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWY6IDB4MDBhNCwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwYjA6IDB4MjU5MSwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgwMGIxOiAweDI1OTIsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDAwYjI6IDB4MjU5MywgICAgICMgIERBUksgU0hBREUKKyAgICAweDAwYjM6IDB4MjUwMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MDBiNDogMHgyNTI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGI1OiAweDI1NjEsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiNjogMHgyNTYyLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYjc6IDB4MjU1NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYjg6IDB4MjU1NSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYjk6IDB4MjU2MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYmE6IDB4MjU1MSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDAwYmI6IDB4MjU1NywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBiYzogMHgyNTVkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MDBiZDogMHgyNTVjLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYmU6IDB4MjU1YiwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGJmOiAweDI1MTAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBjMDogMHgyNTE0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MDBjMTogMHgyNTM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMyOiAweDI1MmMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMzogMHgyNTFjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjNDogMHgyNTAwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDAwYzU6IDB4MjUzYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjNjogMHgyNTVlLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGM3OiAweDI1NWYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwYzg6IDB4MjU1YSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgwMGM5OiAweDI1NTQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGNhOiAweDI1NjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNiOiAweDI1NjYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2M6IDB4MjU2MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGNkOiAweDI1NTAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDAwY2U6IDB4MjU2YywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2Y6IDB4MjU2NywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQwOiAweDI1NjgsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkMTogMHgyNTY0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkMjogMHgyNTY1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkMzogMHgyNTU5LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGQ0OiAweDI1NTgsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwZDU6IDB4MjU1MiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGQ2OiAweDI1NTMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBkNzogMHgyNTZiLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDg6IDB4MjU2YSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQ5OiAweDI1MTgsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDAwZGE6IDB4MjUwYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MDBkYjogMHgyNTg4LCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MDBkYzogMHgyNTg0LCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MDBkZDogMHgyNThjLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgwMGRlOiAweDI1OTAsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgwMGRmOiAweDI1ODAsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgwMGUwOiAweDAzYjEsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICAweDAwZTE6IDB4MDBkZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgMHgwMGUyOiAweDAzOTMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIDB4MDBlMzogMHgwM2MwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwMGU0OiAweDAzYTMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIDB4MDBlNTogMHgwM2MzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgMHgwMGU2OiAweDAwYjUsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGU3OiAweDAzYzQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgMHgwMGU4OiAweDAzYTYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICAweDAwZTk6IDB4MDM5OCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgMHgwMGVhOiAweDAzYTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIDB4MDBlYjogMHgwM2I0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwMGVjOiAweDIyMWUsICAgICAjICBJTkZJTklUWQorICAgIDB4MDBlZDogMHgwM2M2LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIDB4MDBlZTogMHgwM2I1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICAweDAwZWY6IDB4MjIyOSwgICAgICMgIElOVEVSU0VDVElPTgorICAgIDB4MDBmMDogMHgyMjYxLCAgICAgIyAgSURFTlRJQ0FMIFRPCisgICAgMHgwMGYxOiAweDAwYjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwZjI6IDB4MjI2NSwgICAgICMgIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MDBmMzogMHgyMjY0LCAgICAgIyAgTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgwMGY0OiAweDIzMjAsICAgICAjICBUT1AgSEFMRiBJTlRFR1JBTAorICAgIDB4MDBmNTogMHgyMzIxLCAgICAgIyAgQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICAweDAwZjY6IDB4MDBmNywgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAwZjc6IDB4MjI0OCwgICAgICMgIEFMTU9TVCBFUVVBTCBUTworICAgIDB4MDBmODogMHgwMGIwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwZjk6IDB4MjIxOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MDBmYTogMHgwMGI3LCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBmYjogMHgyMjFhLCAgICAgIyAgU1FVQVJFIFJPT1QKKyAgICAweDAwZmM6IDB4MjA3ZiwgICAgICMgIFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMGZkOiAweDAwYjIsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwZmU6IDB4MjVhMCwgICAgICMgIEJMQUNLIFNRVUFSRQorICAgIDB4MDBmZjogMHgwMGEwLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKK30pCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwMDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDAwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAwMDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDAwMDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDAwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwMDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwMDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDAwMDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwMDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MDAwYSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDAwMGIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MDAwYyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDAwMGQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwMDBlIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MDAwZiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MDAxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgwMDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MDAxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDAwMTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDAwMTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MDAxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MDAxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgwMDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDAwMTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgwMDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDAwMWEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MDAxYiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDAwMWMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDAwMWQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgwMDFlIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDAwMWYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDAwMjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDAwMjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MDAyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MDAyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MDAyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MDAyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDAwMjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgwMDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDAwMjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MDAyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MDAyYSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MDAyYiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDAwMmMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDAwMmQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgwMDJlIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MDAyZiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgwMDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDAwMzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgwMDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MDAzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MDAzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgwMDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDAwMzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgwMDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgwMDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgwMDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDAwM2EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDAwM2IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgwMDNjIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgwMDNkIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgwMDNlIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgwMDNmIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDAwNDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4MDA0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHgwMDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDAwNDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4MDA0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHgwMDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDAwNDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4MDA0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHgwMDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDAwNDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4MDA0YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHgwMDRiIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDAwNGMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4MDA0ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHgwMDRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDAwNGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4MDA1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHgwMDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDAwNTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4MDA1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHgwMDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDAwNTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4MDA1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHgwMDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDAwNTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4MDA1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHgwMDVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDAwNWIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4MDA1YyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDAwNWQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDAwNWUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDAwNWYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDAwNjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHgwMDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHgwMDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHgwMDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHgwMDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHgwMDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHgwMDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHgwMDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHgwMDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHgwMDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHgwMDZhIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHgwMDZiIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHgwMDZjIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHgwMDZkIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHgwMDZlIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHgwMDZmIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHgwMDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHgwMDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHgwMDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHgwMDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHgwMDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHgwMDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHgwMDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHgwMDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHgwMDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHgwMDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHgwMDdhIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHgwMDdiIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4MDA3YyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHgwMDdkIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDAwN2UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDAwN2YgLT4gREVMRVRFCisgICAgdSdceGM3JyAgICAgIyAgMHgwMDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGZjJyAgICAgIyAgMHgwMDgxIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU5JyAgICAgIyAgMHgwMDgyIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTInICAgICAjICAweDAwODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU0JyAgICAgIyAgMHgwMDg0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUwJyAgICAgIyAgMHgwMDg1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTUnICAgICAjICAweDAwODYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU3JyAgICAgIyAgMHgwMDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlYScgICAgICMgIDB4MDA4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweDAwODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTgnICAgICAjICAweDAwOGEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlZicgICAgICMgIDB4MDA4YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlZScgICAgICMgIDB4MDA4YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWMnICAgICAjICAweDAwOGQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhjNCcgICAgICMgIDB4MDA4ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHgwMDhmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGM5JyAgICAgIyAgMHgwMDkwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlNicgICAgICMgIDB4MDA5MSAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIHUnXHhjNicgICAgICMgIDB4MDA5MiAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgdSdceGY0JyAgICAgIyAgMHgwMDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNicgICAgICMgIDB4MDA5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMicgICAgICMgIDB4MDA5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGZiJyAgICAgIyAgMHgwMDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmOScgICAgICMgIDB4MDA5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZmJyAgICAgIyAgMHgwMDk4IC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ2JyAgICAgIyAgMHgwMDk5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGMnICAgICAjICAweDAwOWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmOCcgICAgICMgIDB4MDA5YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhhMycgICAgICMgIDB4MDA5YyAtPiBQT1VORCBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHgwMDlkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x1MjBhNycgICAjICAweDAwOWUgLT4gUEVTRVRBIFNJR04KKyAgICB1J1x1MDE5MicgICAjICAweDAwOWYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdceGUxJyAgICAgIyAgMHgwMGEwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZWQnICAgICAjICAweDAwYTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhmMycgICAgICMgIDB4MDBhMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGZhJyAgICAgIyAgMHgwMGEzIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZjEnICAgICAjICAweDAwYTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkMScgICAgICMgIDB4MDBhNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4YWEnICAgICAjICAweDAwYTYgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmEnICAgICAjICAweDAwYTcgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJmJyAgICAgIyAgMHgwMGE4IC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x1MjMxMCcgICAjICAweDAwYTkgLT4gUkVWRVJTRUQgTk9UIFNJR04KKyAgICB1J1x4YWMnICAgICAjICAweDAwYWEgLT4gTk9UIFNJR04KKyAgICB1J1x4YmQnICAgICAjICAweDAwYWIgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJjJyAgICAgIyAgMHgwMGFjIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhhMScgICAgICMgIDB4MDBhZCAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGFiJyAgICAgIyAgMHgwMGFlIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGE0JyAgICAgIyAgMHgwMGFmIC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x1MjU5MScgICAjICAweDAwYjAgLT4gTElHSFQgU0hBREUKKyAgICB1J1x1MjU5MicgICAjICAweDAwYjEgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1OTMnICAgIyAgMHgwMGIyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjUwMicgICAjICAweDAwYjMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MjQnICAgIyAgMHgwMGI0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTYxJyAgICMgIDB4MDBiNSAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYyJyAgICMgIDB4MDBiNiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU2JyAgICMgIDB4MDBiNyAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NTUnICAgIyAgMHgwMGI4IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjU2MycgICAjICAweDAwYjkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTUxJyAgICMgIDB4MDBiYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTcnICAgIyAgMHgwMGJiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTVkJyAgICMgIDB4MDBiYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdcdTI1NWMnICAgIyAgMHgwMGJkIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NWInICAgIyAgMHgwMGJlIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1MTAnICAgIyAgMHgwMGJmIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHgwMGMwIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjUzNCcgICAjICAweDAwYzEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MmMnICAgIyAgMHgwMGMyIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHgwMGMzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUwMCcgICAjICAweDAwYzQgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweDAwYzUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NWUnICAgIyAgMHgwMGM2IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTVmJyAgICMgIDB4MDBjNyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1YScgICAjICAweDAwYzggLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjU1NCcgICAjICAweDAwYzkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTY5JyAgICMgIDB4MDBjYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjYnICAgIyAgMHgwMGNiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTYwJyAgICMgIDB4MDBjYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTUwJyAgICMgIDB4MDBjZCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICB1J1x1MjU2YycgICAjICAweDAwY2UgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY3JyAgICMgIDB4MDBjZiAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY4JyAgICMgIDB4MDBkMCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTY0JyAgICMgIDB4MDBkMSAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjUnICAgIyAgMHgwMGQyIC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU1OScgICAjICAweDAwZDMgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NTgnICAgIyAgMHgwMGQ0IC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTUyJyAgICMgIDB4MDBkNSAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTUzJyAgICMgIDB4MDBkNiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTZiJyAgICMgIDB4MDBkNyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTZhJyAgICMgIDB4MDBkOCAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTE4JyAgICMgIDB4MDBkOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweDAwZGEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHgwMGRiIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweDAwZGMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHUyNThjJyAgICMgIDB4MDBkZCAtPiBMRUZUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU5MCcgICAjICAweDAwZGUgLT4gUklHSFQgSEFMRiBCTE9DSworICAgIHUnXHUyNTgwJyAgICMgIDB4MDBkZiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdcdTAzYjEnICAgIyAgMHgwMGUwIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIHUnXHhkZicgICAgICMgIDB4MDBlMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHUwMzkzJyAgICMgIDB4MDBlMiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIHUnXHUwM2MwJyAgICMgIDB4MDBlMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICB1J1x1MDNhMycgICAjICAweDAwZTQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICB1J1x1MDNjMycgICAjICAweDAwZTUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgdSdceGI1JyAgICAgIyAgMHgwMGU2IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x1MDNjNCcgICAjICAweDAwZTcgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIHUnXHUwM2E2JyAgICMgIDB4MDBlOCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICB1J1x1MDM5OCcgICAjICAweDAwZTkgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICB1J1x1MDNhOScgICAjICAweDAwZWEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICB1J1x1MDNiNCcgICAjICAweDAwZWIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgdSdcdTIyMWUnICAgIyAgMHgwMGVjIC0+IElORklOSVRZCisgICAgdSdcdTAzYzYnICAgIyAgMHgwMGVkIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICB1J1x1MDNiNScgICAjICAweDAwZWUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICB1J1x1MjIyOScgICAjICAweDAwZWYgLT4gSU5URVJTRUNUSU9OCisgICAgdSdcdTIyNjEnICAgIyAgMHgwMGYwIC0+IElERU5USUNBTCBUTworICAgIHUnXHhiMScgICAgICMgIDB4MDBmMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MjI2NScgICAjICAweDAwZjIgLT4gR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIyNjQnICAgIyAgMHgwMGYzIC0+IExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMzIwJyAgICMgIDB4MDBmNCAtPiBUT1AgSEFMRiBJTlRFR1JBTAorICAgIHUnXHUyMzIxJyAgICMgIDB4MDBmNSAtPiBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIHUnXHhmNycgICAgICMgIDB4MDBmNiAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdcdTIyNDgnICAgIyAgMHgwMGY3IC0+IEFMTU9TVCBFUVVBTCBUTworICAgIHUnXHhiMCcgICAgICMgIDB4MDBmOCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHUyMjE5JyAgICMgIDB4MDBmOSAtPiBCVUxMRVQgT1BFUkFUT1IKKyAgICB1J1x4YjcnICAgICAjICAweDAwZmEgLT4gTUlERExFIERPVAorICAgIHUnXHUyMjFhJyAgICMgIDB4MDBmYiAtPiBTUVVBUkUgUk9PVAorICAgIHUnXHUyMDdmJyAgICMgIDB4MDBmYyAtPiBTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnXHhiMicgICAgICMgIDB4MDBmZCAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHgwMGZmIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQKKyAgICAweDAwMjc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUKKyAgICAweDAwMjg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMKKyAgICAweDAwMjk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSworICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOCisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQQorICAgIDB4MDAyZDogMHgwMDJkLCAgICAgIyAgSFlQSEVOLU1JTlVTCisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OCisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04KKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOCisgICAgMHgwMDNkOiAweDAwM2QsICAgICAjICBFUVVBTFMgU0lHTgorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04KKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUksKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUworICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5UCisgICAgMHgwMDVmOiAweDAwNWYsICAgICAjICBMT1cgTElORQorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3YzogMHgwMDdjLCAgICAgIyAgVkVSVElDQUwgTElORQorICAgIDB4MDA3ZDogMHgwMDdkLCAgICAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3ZTogMHgwMDdlLCAgICAgIyAgVElMREUKKyAgICAweDAwN2Y6IDB4MDA3ZiwgICAgICMgIERFTEVURQorICAgIDB4MDBhMDogMHgwMGZmLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKKyAgICAweDAwYTE6IDB4MDBhZCwgICAgICMgIElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwYTM6IDB4MDA5YywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwYTQ6IDB4MDBhZiwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwYWE6IDB4MDBhNiwgICAgICMgIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGFiOiAweDAwYWUsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhYzogMHgwMGFhLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYjA6IDB4MDBmOCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGIxOiAweDAwZjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwYjI6IDB4MDBmZCwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBiNTogMHgwMGU2LCAgICAgIyAgTUlDUk8gU0lHTgorICAgIDB4MDBiNzogMHgwMGZhLCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBiYTogMHgwMGE3LCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGJjOiAweDAwYWMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICAweDAwYmQ6IDB4MDBhYiwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBiZjogMHgwMGE4LCAgICAgIyAgSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIDB4MDBjNDogMHgwMDhlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBjNTogMHgwMDhmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwYzY6IDB4MDA5MiwgICAgICMgIExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICAweDAwYzc6IDB4MDA4MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGM5OiAweDAwOTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwZDE6IDB4MDBhNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBkNjogMHgwMDk5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkODogMHgwMDlkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDBkYzogMHgwMDlhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkZjogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTA6IDB4MDA4NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwZTE6IDB4MDBhMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwZTI6IDB4MDA4MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlNDogMHgwMDg0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZTU6IDB4MDA4NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBlNjogMHgwMDkxLCAgICAgIyAgTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICAweDAwZTc6IDB4MDA4NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBlODogMHgwMDhhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBlOTogMHgwMDgyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDBlYTogMHgwMDg4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGViOiAweDAwODksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlYzogMHgwMDhkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIDB4MDBlZDogMHgwMGExLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBlZTogMHgwMDhjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGVmOiAweDAwOGIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmMTogMHgwMGE0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBmMjogMHgwMDk1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDBmMzogMHgwMGEyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBmNDogMHgwMDkzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGY2OiAweDAwOTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmNzogMHgwMGY2LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmODogMHgwMDliLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwZjk6IDB4MDA5NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwZmE6IDB4MDBhMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwZmI6IDB4MDA5NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBmYzogMHgwMDgxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZmY6IDB4MDA5OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgMHgwMTkyOiAweDAwOWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICAweDAzOTM6IDB4MDBlMiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMzk4OiAweDAwZTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIDB4MDNhMzogMHgwMGU0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICAweDAzYTY6IDB4MDBlOCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIDB4MDNhOTogMHgwMGVhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICAweDAzYjE6IDB4MDBlMCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDNiNDogMHgwMGViLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwM2I1OiAweDAwZWUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDNjMDogMHgwMGUzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwM2MzOiAweDAwZTUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAzYzQ6IDB4MDBlNywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICAweDAzYzY6IDB4MDBlZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICAweDIwN2Y6IDB4MDBmYywgICAgICMgIFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgyMGE3OiAweDAwOWUsICAgICAjICBQRVNFVEEgU0lHTgorICAgIDB4MjIxOTogMHgwMGY5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgyMjFhOiAweDAwZmIsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MjIxZTogMHgwMGVjLCAgICAgIyAgSU5GSU5JVFkKKyAgICAweDIyMjk6IDB4MDBlZiwgICAgICMgIElOVEVSU0VDVElPTgorICAgIDB4MjI0ODogMHgwMGY3LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgyMjYxOiAweDAwZjAsICAgICAjICBJREVOVElDQUwgVE8KKyAgICAweDIyNjQ6IDB4MDBmMywgICAgICMgIExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MjI2NTogMHgwMGYyLCAgICAgIyAgR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgyMzEwOiAweDAwYTksICAgICAjICBSRVZFUlNFRCBOT1QgU0lHTgorICAgIDB4MjMyMDogMHgwMGY0LCAgICAgIyAgVE9QIEhBTEYgSU5URUdSQUwKKyAgICAweDIzMjE6IDB4MDBmNSwgICAgICMgIEJPVFRPTSBIQUxGIElOVEVHUkFMCisgICAgMHgyNTAwOiAweDAwYzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MjUwMjogMHgwMGIzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgyNTBjOiAweDAwZGEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1MTA6IDB4MDBiZiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgyNTE0OiAweDAwYzAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgyNTE4OiAweDAwZDksICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDI1MWM6IDB4MDBjMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1MjQ6IDB4MDBiNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjUyYzogMHgwMGMyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1MzQ6IDB4MDBjMSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzYzogMHgwMGM1LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTUwOiAweDAwY2QsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDI1NTE6IDB4MDBiYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDI1NTI6IDB4MDBkNSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTUzOiAweDAwZDYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU1NDogMHgwMGM5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MjU1NTogMHgwMGI4LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU1NjogMHgwMGI3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU1NzogMHgwMGJiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgyNTU4OiAweDAwZDQsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NTk6IDB4MDBkMywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU1YTogMHgwMGM4LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDI1NWI6IDB4MDBiZSwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTVjOiAweDAwYmQsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU1ZDogMHgwMGJjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MjU1ZTogMHgwMGM2LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTVmOiAweDAwYzcsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NjA6IDB4MDBjYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTYxOiAweDAwYjUsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU2MjogMHgwMGI2LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NjM6IDB4MDBiOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1NjQ6IDB4MDBkMSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1NjU6IDB4MDBkMiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1NjY6IDB4MDBjYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2NzogMHgwMGNmLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1Njg6IDB4MDBkMCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTY5OiAweDAwY2EsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTZhOiAweDAwZDgsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2YjogMHgwMGQ3LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1NmM6IDB4MDBjZSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1ODA6IDB4MDBkZiwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODQ6IDB4MDBkYywgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODg6IDB4MDBkYiwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDI1OGM6IDB4MDBkZCwgICAgICMgIExFRlQgSEFMRiBCTE9DSworICAgIDB4MjU5MDogMHgwMGRlLCAgICAgIyAgUklHSFQgSEFMRiBCTE9DSworICAgIDB4MjU5MTogMHgwMGIwLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDI1OTI6IDB4MDBiMSwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MjU5MzogMHgwMGIyLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MjVhMDogMHgwMGZlLCAgICAgIyAgQkxBQ0sgU1FVQVJFCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4MGE1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY1LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4MGE1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY1LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2Ni5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Y2Q4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2Ni5weQpAQCAtMCwwICsxLDY5OCBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBnZW5lcmF0ZWQgZnJvbSAnVkVORE9SUy9NSUNTRlQvUEMvQ1A4NjYuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDg2NicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCitkZWNvZGluZ19tYXAudXBkYXRlKHsKKyAgICAweDAwODA6IDB4MDQxMCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwODE6IDB4MDQxMSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEJFCisgICAgMHgwMDgyOiAweDA0MTIsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRQorICAgIDB4MDA4MzogMHgwNDEzLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFCisgICAgMHgwMDg0OiAweDA0MTQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBERQorICAgIDB4MDA4NTogMHgwNDE1LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUKKyAgICAweDAwODY6IDB4MDQxNiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRQorICAgIDB4MDA4NzogMHgwNDE3LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkUKKyAgICAweDAwODg6IDB4MDQxOCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwODk6IDB4MDQxOSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkKKyAgICAweDAwOGE6IDB4MDQxYSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBCisgICAgMHgwMDhiOiAweDA0MWIsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTAorICAgIDB4MDA4YzogMHgwNDFjLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU0KKyAgICAweDAwOGQ6IDB4MDQxZCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVOCisgICAgMHgwMDhlOiAweDA0MWUsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDhmOiAweDA0MWYsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBQRQorICAgIDB4MDA5MDogMHgwNDIwLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKyAgICAweDAwOTE6IDB4MDQyMSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTCisgICAgMHgwMDkyOiAweDA0MjIsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBURQorICAgIDB4MDA5MzogMHgwNDIzLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDA5NDogMHgwNDI0LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUYKKyAgICAweDAwOTU6IDB4MDQyNSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBCisgICAgMHgwMDk2OiAweDA0MjYsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0UKKyAgICAweDAwOTc6IDB4MDQyNywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIENIRQorICAgIDB4MDA5ODogMHgwNDI4LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hBCisgICAgMHgwMDk5OiAweDA0MjksICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQQorICAgIDB4MDA5YTogMHgwNDJhLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEFSRCBTSUdOCisgICAgMHgwMDliOiAweDA0MmIsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZRVJVCisgICAgMHgwMDljOiAweDA0MmMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTT0ZUIFNJR04KKyAgICAweDAwOWQ6IDB4MDQyZCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwOWU6IDB4MDQyZSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlVCisgICAgMHgwMDlmOiAweDA0MmYsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZQQorICAgIDB4MDBhMDogMHgwNDMwLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKyAgICAweDAwYTE6IDB4MDQzMSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorICAgIDB4MDBhMjogMHgwNDMyLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisgICAgMHgwMGEzOiAweDA0MzMsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFCisgICAgMHgwMGE0OiAweDA0MzQsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUKKyAgICAweDAwYTU6IDB4MDQzNSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBJRQorICAgIDB4MDBhNjogMHgwNDM2LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorICAgIDB4MDBhNzogMHgwNDM3LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisgICAgMHgwMGE4OiAweDA0MzgsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSQorICAgIDB4MDBhOTogMHgwNDM5LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkKKyAgICAweDAwYWE6IDB4MDQzYSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBLQQorICAgIDB4MDBhYjogMHgwNDNiLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMCisgICAgMHgwMGFjOiAweDA0M2MsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0KKyAgICAweDAwYWQ6IDB4MDQzZCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTgorICAgIDB4MDBhZTogMHgwNDNlLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8KKyAgICAweDAwYWY6IDB4MDQzZiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBQRQorICAgIDB4MDBiMDogMHgyNTkxLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDAwYjE6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDBiMjogMHgyNTkzLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MDBiMzogMHgyNTAyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgwMGI0OiAweDI1MjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYjU6IDB4MjU2MSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGI2OiAweDI1NjIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiNzogMHgyNTU2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiODogMHgyNTU1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiOTogMHgyNTYzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiYTogMHgyNTUxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MDBiYjogMHgyNTU3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgwMGJjOiAweDI1NWQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgwMGJkOiAweDI1NWMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiZTogMHgyNTViLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYmY6IDB4MjUxMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgwMGMwOiAweDI1MTQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgwMGMxOiAweDI1MzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzI6IDB4MjUyYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMzOiAweDI1MWMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGM0OiAweDI1MDAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MDBjNTogMHgyNTNjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGM2OiAweDI1NWUsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwYzc6IDB4MjU1ZiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgyNTY3LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDA6IDB4MjU2OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQxOiAweDI1NjQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQyOiAweDI1NjUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQzOiAweDI1NTksICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwZDQ6IDB4MjU1OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBkNTogMHgyNTUyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwZDY6IDB4MjU1MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGQ3OiAweDI1NmIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkODogMHgyNTZhLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDk6IDB4MjUxOCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MDBkYTogMHgyNTBjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGRiOiAweDI1ODgsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgwMGRjOiAweDI1ODQsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgwMGRkOiAweDI1OGMsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGU6IDB4MjU5MCwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGY6IDB4MjU4MCwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDAwZTA6IDB4MDQ0MCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFUgorICAgIDB4MDBlMTogMHgwNDQxLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVTCisgICAgMHgwMGUyOiAweDA0NDIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVEUKKyAgICAweDAwZTM6IDB4MDQ0MywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMGU0OiAweDA0NDQsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUYKKyAgICAweDAwZTU6IDB4MDQ0NSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBIQQorICAgIDB4MDBlNjogMHgwNDQ2LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRQorICAgIDB4MDBlNzogMHgwNDQ3LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRQorICAgIDB4MDBlODogMHgwNDQ4LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQQorICAgIDB4MDBlOTogMHgwNDQ5LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisgICAgMHgwMGVhOiAweDA0NGEsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEFSRCBTSUdOCisgICAgMHgwMGViOiAweDA0NGIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUVSVQorICAgIDB4MDBlYzogMHgwNDRjLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNPRlQgU0lHTgorICAgIDB4MDBlZDogMHgwNDRkLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEUKKyAgICAweDAwZWU6IDB4MDQ0ZSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZVQorICAgIDB4MDBlZjogMHgwNDRmLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCisgICAgMHgwMGYwOiAweDA0MDEsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJTworICAgIDB4MDBmMTogMHgwNDUxLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPCisgICAgMHgwMGYyOiAweDA0MDQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVS1JBSU5JQU4gSUUKKyAgICAweDAwZjM6IDB4MDQ1NCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBVS1JBSU5JQU4gSUUKKyAgICAweDAwZjQ6IDB4MDQwNywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlJCisgICAgMHgwMGY1OiAweDA0NTcsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUkKKyAgICAweDAwZjY6IDB4MDQwZSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIFUKKyAgICAweDAwZjc6IDB4MDQ1ZSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBVCisgICAgMHgwMGY4OiAweDAwYjAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBmOTogMHgyMjE5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgwMGZhOiAweDAwYjcsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGZiOiAweDIyMWEsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MDBmYzogMHgyMTE2LCAgICAgIyAgTlVNRVJPIFNJR04KKyAgICAweDAwZmQ6IDB4MDBhNCwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwZmU6IDB4MjVhMCwgICAgICMgIEJMQUNLIFNRVUFSRQorICAgIDB4MDBmZjogMHgwMGEwLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKK30pCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwMDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDAwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAwMDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDAwMDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDAwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwMDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwMDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDAwMDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwMDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MDAwYSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDAwMGIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MDAwYyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDAwMGQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwMDBlIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MDAwZiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MDAxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgwMDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MDAxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDAwMTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDAwMTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MDAxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MDAxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgwMDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDAwMTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgwMDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDAwMWEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MDAxYiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDAwMWMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDAwMWQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgwMDFlIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDAwMWYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDAwMjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDAwMjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MDAyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MDAyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MDAyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MDAyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDAwMjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgwMDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDAwMjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MDAyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MDAyYSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MDAyYiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDAwMmMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDAwMmQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgwMDJlIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MDAyZiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgwMDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDAwMzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgwMDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MDAzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MDAzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgwMDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDAwMzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgwMDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgwMDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgwMDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDAwM2EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDAwM2IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgwMDNjIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgwMDNkIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgwMDNlIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgwMDNmIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDAwNDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4MDA0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHgwMDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDAwNDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4MDA0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHgwMDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDAwNDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4MDA0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHgwMDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDAwNDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4MDA0YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHgwMDRiIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDAwNGMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4MDA0ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHgwMDRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDAwNGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4MDA1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHgwMDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDAwNTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4MDA1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHgwMDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDAwNTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4MDA1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHgwMDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDAwNTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4MDA1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHgwMDVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDAwNWIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4MDA1YyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDAwNWQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDAwNWUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDAwNWYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDAwNjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHgwMDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHgwMDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHgwMDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHgwMDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHgwMDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHgwMDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHgwMDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHgwMDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHgwMDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHgwMDZhIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHgwMDZiIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHgwMDZjIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHgwMDZkIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHgwMDZlIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHgwMDZmIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHgwMDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHgwMDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHgwMDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHgwMDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHgwMDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHgwMDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHgwMDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHgwMDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHgwMDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHgwMDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHgwMDdhIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHgwMDdiIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4MDA3YyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHgwMDdkIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDAwN2UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDAwN2YgLT4gREVMRVRFCisgICAgdSdcdTA0MTAnICAgIyAgMHgwMDgwIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J1x1MDQxMScgICAjICAweDAwODEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKyAgICB1J1x1MDQxMicgICAjICAweDAwODIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVkUKKyAgICB1J1x1MDQxMycgICAjICAweDAwODMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFCisgICAgdSdcdTA0MTQnICAgIyAgMHgwMDg0IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERFCisgICAgdSdcdTA0MTUnICAgIyAgMHgwMDg1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElFCisgICAgdSdcdTA0MTYnICAgIyAgMHgwMDg2IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRQorICAgIHUnXHUwNDE3JyAgICMgIDB4MDA4NyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRQorICAgIHUnXHUwNDE4JyAgICMgIDB4MDA4OCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdcdTA0MTknICAgIyAgMHgwMDg5IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkKKyAgICB1J1x1MDQxYScgICAjICAweDAwOGEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EKKyAgICB1J1x1MDQxYicgICAjICAweDAwOGIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUwKKyAgICB1J1x1MDQxYycgICAjICAweDAwOGMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU0KKyAgICB1J1x1MDQxZCcgICAjICAweDAwOGQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4KKyAgICB1J1x1MDQxZScgICAjICAweDAwOGUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTworICAgIHUnXHUwNDFmJyAgICMgIDB4MDA4ZiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBQRQorICAgIHUnXHUwNDIwJyAgICMgIDB4MDA5MCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUgorICAgIHUnXHUwNDIxJyAgICMgIDB4MDA5MSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUworICAgIHUnXHUwNDIyJyAgICMgIDB4MDA5MiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBURQorICAgIHUnXHUwNDIzJyAgICMgIDB4MDA5MyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdcdTA0MjQnICAgIyAgMHgwMDk0IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVGCisgICAgdSdcdTA0MjUnICAgIyAgMHgwMDk1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBCisgICAgdSdcdTA0MjYnICAgIyAgMHgwMDk2IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorICAgIHUnXHUwNDI3JyAgICMgIDB4MDA5NyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUKKyAgICB1J1x1MDQyOCcgICAjICAweDAwOTggLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hBCisgICAgdSdcdTA0MjknICAgIyAgMHgwMDk5IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBCisgICAgdSdcdTA0MmEnICAgIyAgMHgwMDlhIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBUkQgU0lHTgorICAgIHUnXHUwNDJiJyAgICMgIDB4MDA5YiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZRVJVCisgICAgdSdcdTA0MmMnICAgIyAgMHgwMDljIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTgorICAgIHUnXHUwNDJkJyAgICMgIDB4MDA5ZCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdcdTA0MmUnICAgIyAgMHgwMDllIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlVCisgICAgdSdcdTA0MmYnICAgIyAgMHgwMDlmIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisgICAgdSdcdTA0MzAnICAgIyAgMHgwMGEwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBBCisgICAgdSdcdTA0MzEnICAgIyAgMHgwMGExIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorICAgIHUnXHUwNDMyJyAgICMgIDB4MDBhMiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVkUKKyAgICB1J1x1MDQzMycgICAjICAweDAwYTMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRQorICAgIHUnXHUwNDM0JyAgICMgIDB4MDBhNCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUKKyAgICB1J1x1MDQzNScgICAjICAweDAwYTUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElFCisgICAgdSdcdTA0MzYnICAgIyAgMHgwMGE2IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBaSEUKKyAgICB1J1x1MDQzNycgICAjICAweDAwYTcgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisgICAgdSdcdTA0MzgnICAgIyAgMHgwMGE4IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJCisgICAgdSdcdTA0MzknICAgIyAgMHgwMGE5IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBJCisgICAgdSdcdTA0M2EnICAgIyAgMHgwMGFhIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBLQQorICAgIHUnXHUwNDNiJyAgICMgIDB4MDBhYiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUwKKyAgICB1J1x1MDQzYycgICAjICAweDAwYWMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVNCisgICAgdSdcdTA0M2QnICAgIyAgMHgwMGFkIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTgorICAgIHUnXHUwNDNlJyAgICMgIDB4MDBhZSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgTworICAgIHUnXHUwNDNmJyAgICMgIDB4MDBhZiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgUEUKKyAgICB1J1x1MjU5MScgICAjICAweDAwYjAgLT4gTElHSFQgU0hBREUKKyAgICB1J1x1MjU5MicgICAjICAweDAwYjEgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1OTMnICAgIyAgMHgwMGIyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjUwMicgICAjICAweDAwYjMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MjQnICAgIyAgMHgwMGI0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTYxJyAgICMgIDB4MDBiNSAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYyJyAgICMgIDB4MDBiNiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU2JyAgICMgIDB4MDBiNyAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NTUnICAgIyAgMHgwMGI4IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjU2MycgICAjICAweDAwYjkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTUxJyAgICMgIDB4MDBiYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTcnICAgIyAgMHgwMGJiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTVkJyAgICMgIDB4MDBiYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdcdTI1NWMnICAgIyAgMHgwMGJkIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NWInICAgIyAgMHgwMGJlIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1MTAnICAgIyAgMHgwMGJmIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHgwMGMwIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjUzNCcgICAjICAweDAwYzEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MmMnICAgIyAgMHgwMGMyIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHgwMGMzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUwMCcgICAjICAweDAwYzQgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweDAwYzUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NWUnICAgIyAgMHgwMGM2IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTVmJyAgICMgIDB4MDBjNyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1YScgICAjICAweDAwYzggLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjU1NCcgICAjICAweDAwYzkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTY5JyAgICMgIDB4MDBjYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjYnICAgIyAgMHgwMGNiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTYwJyAgICMgIDB4MDBjYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTUwJyAgICMgIDB4MDBjZCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICB1J1x1MjU2YycgICAjICAweDAwY2UgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY3JyAgICMgIDB4MDBjZiAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY4JyAgICMgIDB4MDBkMCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTY0JyAgICMgIDB4MDBkMSAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjUnICAgIyAgMHgwMGQyIC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU1OScgICAjICAweDAwZDMgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NTgnICAgIyAgMHgwMGQ0IC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTUyJyAgICMgIDB4MDBkNSAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTUzJyAgICMgIDB4MDBkNiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTZiJyAgICMgIDB4MDBkNyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTZhJyAgICMgIDB4MDBkOCAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTE4JyAgICMgIDB4MDBkOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweDAwZGEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHgwMGRiIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweDAwZGMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHUyNThjJyAgICMgIDB4MDBkZCAtPiBMRUZUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU5MCcgICAjICAweDAwZGUgLT4gUklHSFQgSEFMRiBCTE9DSworICAgIHUnXHUyNTgwJyAgICMgIDB4MDBkZiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdcdTA0NDAnICAgIyAgMHgwMGUwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFUgorICAgIHUnXHUwNDQxJyAgICMgIDB4MDBlMSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKyAgICB1J1x1MDQ0MicgICAjICAweDAwZTIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRFCisgICAgdSdcdTA0NDMnICAgIyAgMHgwMGUzIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBVCisgICAgdSdcdTA0NDQnICAgIyAgMHgwMGU0IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorICAgIHUnXHUwNDQ1JyAgICMgIDB4MDBlNSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEEKKyAgICB1J1x1MDQ0NicgICAjICAweDAwZTYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRQorICAgIHUnXHUwNDQ3JyAgICMgIDB4MDBlNyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFCisgICAgdSdcdTA0NDgnICAgIyAgMHgwMGU4IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSEEKKyAgICB1J1x1MDQ0OScgICAjICAweDAwZTkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisgICAgdSdcdTA0NGEnICAgIyAgMHgwMGVhIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04KKyAgICB1J1x1MDQ0YicgICAjICAweDAwZWIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlFUlUKKyAgICB1J1x1MDQ0YycgICAjICAweDAwZWMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNPRlQgU0lHTgorICAgIHUnXHUwNDRkJyAgICMgIDB4MDBlZCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorICAgIHUnXHUwNDRlJyAgICMgIDB4MDBlZSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUKKyAgICB1J1x1MDQ0ZicgICAjICAweDAwZWYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCisgICAgdSdcdTA0MDEnICAgIyAgMHgwMGYwIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisgICAgdSdcdTA0NTEnICAgIyAgMHgwMGYxIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJTworICAgIHUnXHUwNDA0JyAgICMgIDB4MDBmMiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVS1JBSU5JQU4gSUUKKyAgICB1J1x1MDQ1NCcgICAjICAweDAwZjMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIHUnXHUwNDA3JyAgICMgIDB4MDBmNCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZSQorICAgIHUnXHUwNDU3JyAgICMgIDB4MDBmNSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUkKKyAgICB1J1x1MDQwZScgICAjICAweDAwZjYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgVQorICAgIHUnXHUwNDVlJyAgICMgIDB4MDBmNyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgVQorICAgIHUnXHhiMCcgICAgICMgIDB4MDBmOCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHUyMjE5JyAgICMgIDB4MDBmOSAtPiBCVUxMRVQgT1BFUkFUT1IKKyAgICB1J1x4YjcnICAgICAjICAweDAwZmEgLT4gTUlERExFIERPVAorICAgIHUnXHUyMjFhJyAgICMgIDB4MDBmYiAtPiBTUVVBUkUgUk9PVAorICAgIHUnXHUyMTE2JyAgICMgIDB4MDBmYyAtPiBOVU1FUk8gU0lHTgorICAgIHUnXHhhNCcgICAgICMgIDB4MDBmZCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdcdTI1YTAnICAgIyAgMHgwMGZlIC0+IEJMQUNLIFNRVUFSRQorICAgIHUnXHhhMCcgICAgICMgIDB4MDBmZiAtPiBOTy1CUkVBSyBTUEFDRQorKQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHsKKyAgICAweDAwMDA6IDB4MDAwMCwgICAgICMgIE5VTEwKKyAgICAweDAwMDE6IDB4MDAwMSwgICAgICMgIFNUQVJUIE9GIEhFQURJTkcKKyAgICAweDAwMDI6IDB4MDAwMiwgICAgICMgIFNUQVJUIE9GIFRFWFQKKyAgICAweDAwMDM6IDB4MDAwMywgICAgICMgIEVORCBPRiBURVhUCisgICAgMHgwMDA0OiAweDAwMDQsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgMHgwMDA1OiAweDAwMDUsICAgICAjICBFTlFVSVJZCisgICAgMHgwMDA2OiAweDAwMDYsICAgICAjICBBQ0tOT1dMRURHRQorICAgIDB4MDAwNzogMHgwMDA3LCAgICAgIyAgQkVMTAorICAgIDB4MDAwODogMHgwMDA4LCAgICAgIyAgQkFDS1NQQUNFCisgICAgMHgwMDA5OiAweDAwMDksICAgICAjICBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICAweDAwMGE6IDB4MDAwYSwgICAgICMgIExJTkUgRkVFRAorICAgIDB4MDAwYjogMHgwMDBiLCAgICAgIyAgVkVSVElDQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYzogMHgwMDBjLCAgICAgIyAgRk9STSBGRUVECisgICAgMHgwMDBkOiAweDAwMGQsICAgICAjICBDQVJSSUFHRSBSRVRVUk4KKyAgICAweDAwMGU6IDB4MDAwZSwgICAgICMgIFNISUZUIE9VVAorICAgIDB4MDAwZjogMHgwMDBmLCAgICAgIyAgU0hJRlQgSU4KKyAgICAweDAwMTA6IDB4MDAxMCwgICAgICMgIERBVEEgTElOSyBFU0NBUEUKKyAgICAweDAwMTE6IDB4MDAxMSwgICAgICMgIERFVklDRSBDT05UUk9MIE9ORQorICAgIDB4MDAxMjogMHgwMDEyLCAgICAgIyAgREVWSUNFIENPTlRST0wgVFdPCisgICAgMHgwMDEzOiAweDAwMTMsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIDB4MDAxNDogMHgwMDE0LCAgICAgIyAgREVWSUNFIENPTlRST0wgRk9VUgorICAgIDB4MDAxNTogMHgwMDE1LCAgICAgIyAgTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICAweDAwMTY6IDB4MDAxNiwgICAgICMgIFNZTkNIUk9OT1VTIElETEUKKyAgICAweDAwMTc6IDB4MDAxNywgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICAweDAwMTg6IDB4MDAxOCwgICAgICMgIENBTkNFTAorICAgIDB4MDAxOTogMHgwMDE5LCAgICAgIyAgRU5EIE9GIE1FRElVTQorICAgIDB4MDAxYTogMHgwMDFhLCAgICAgIyAgU1VCU1RJVFVURQorICAgIDB4MDAxYjogMHgwMDFiLCAgICAgIyAgRVNDQVBFCisgICAgMHgwMDFjOiAweDAwMWMsICAgICAjICBGSUxFIFNFUEFSQVRPUgorICAgIDB4MDAxZDogMHgwMDFkLCAgICAgIyAgR1JPVVAgU0VQQVJBVE9SCisgICAgMHgwMDFlOiAweDAwMWUsICAgICAjICBSRUNPUkQgU0VQQVJBVE9SCisgICAgMHgwMDFmOiAweDAwMWYsICAgICAjICBVTklUIFNFUEFSQVRPUgorICAgIDB4MDAyMDogMHgwMDIwLCAgICAgIyAgU1BBQ0UKKyAgICAweDAwMjE6IDB4MDAyMSwgICAgICMgIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwMjI6IDB4MDAyMiwgICAgICMgIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMDIzOiAweDAwMjMsICAgICAjICBOVU1CRVIgU0lHTgorICAgIDB4MDAyNDogMHgwMDI0LCAgICAgIyAgRE9MTEFSIFNJR04KKyAgICAweDAwMjU6IDB4MDAyNSwgICAgICMgIFBFUkNFTlQgU0lHTgorICAgIDB4MDAyNjogMHgwMDI2LCAgICAgIyAgQU1QRVJTQU5ECisgICAgMHgwMDI3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFCisgICAgMHgwMDI4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTCisgICAgMHgwMDI5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUworICAgIDB4MDAyYTogMHgwMDJhLCAgICAgIyAgQVNURVJJU0sKKyAgICAweDAwMmI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTgorICAgIDB4MDAyYzogMHgwMDJjLCAgICAgIyAgQ09NTUEKKyAgICAweDAwMmQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUworICAgIDB4MDAyZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QCisgICAgMHgwMDJmOiAweDAwMmYsICAgICAjICBTT0xJRFVTCisgICAgMHgwMDMwOiAweDAwMzAsICAgICAjICBESUdJVCBaRVJPCisgICAgMHgwMDMxOiAweDAwMzEsICAgICAjICBESUdJVCBPTkUKKyAgICAweDAwMzI6IDB4MDAzMiwgICAgICMgIERJR0lUIFRXTworICAgIDB4MDAzMzogMHgwMDMzLCAgICAgIyAgRElHSVQgVEhSRUUKKyAgICAweDAwMzQ6IDB4MDAzNCwgICAgICMgIERJR0lUIEZPVVIKKyAgICAweDAwMzU6IDB4MDAzNSwgICAgICMgIERJR0lUIEZJVkUKKyAgICAweDAwMzY6IDB4MDAzNiwgICAgICMgIERJR0lUIFNJWAorICAgIDB4MDAzNzogMHgwMDM3LCAgICAgIyAgRElHSVQgU0VWRU4KKyAgICAweDAwMzg6IDB4MDAzOCwgICAgICMgIERJR0lUIEVJR0hUCisgICAgMHgwMDM5OiAweDAwMzksICAgICAjICBESUdJVCBOSU5FCisgICAgMHgwMDNhOiAweDAwM2EsICAgICAjICBDT0xPTgorICAgIDB4MDAzYjogMHgwMDNiLCAgICAgIyAgU0VNSUNPTE9OCisgICAgMHgwMDNjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTgorICAgIDB4MDAzZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04KKyAgICAweDAwM2U6IDB4MDAzZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOCisgICAgMHgwMDNmOiAweDAwM2YsICAgICAjICBRVUVTVElPTiBNQVJLCisgICAgMHgwMDQwOiAweDAwNDAsICAgICAjICBDT01NRVJDSUFMIEFUCisgICAgMHgwMDQxOiAweDAwNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMDQyOiAweDAwNDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgMHgwMDQzOiAweDAwNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgMHgwMDQ0OiAweDAwNDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgMHgwMDQ1OiAweDAwNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwMDQ2OiAweDAwNDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgMHgwMDQ3OiAweDAwNDcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgMHgwMDQ4OiAweDAwNDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgMHgwMDQ5OiAweDAwNDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMDRhOiAweDAwNGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgMHgwMDRiOiAweDAwNGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgMHgwMDRjOiAweDAwNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgMHgwMDRkOiAweDAwNGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgMHgwMDRlOiAweDAwNGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgMHgwMDRmOiAweDAwNGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDUwOiAweDAwNTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgMHgwMDUxOiAweDAwNTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgMHgwMDUyOiAweDAwNTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgMHgwMDUzOiAweDAwNTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgMHgwMDU0OiAweDAwNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgMHgwMDU1OiAweDAwNTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDU2OiAweDAwNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgMHgwMDU3OiAweDAwNTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgMHgwMDU4OiAweDAwNTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgMHgwMDU5OiAweDAwNTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgMHgwMDVhOiAweDAwNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgMHgwMDViOiAweDAwNWIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVjOiAweDAwNWMsICAgICAjICBSRVZFUlNFIFNPTElEVVMKKyAgICAweDAwNWQ6IDB4MDA1ZCwgICAgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVlOiAweDAwNWUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIDB4MDA1ZjogMHgwMDVmLCAgICAgIyAgTE9XIExJTkUKKyAgICAweDAwNjA6IDB4MDA2MCwgICAgICMgIEdSQVZFIEFDQ0VOVAorICAgIDB4MDA2MTogMHgwMDYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICAweDAwNjI6IDB4MDA2MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgMHgwMDYzOiAweDAwNjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIDB4MDA2NDogMHgwMDY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICAweDAwNjU6IDB4MDA2NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgMHgwMDY2OiAweDAwNjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIDB4MDA2NzogMHgwMDY3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICAweDAwNjg6IDB4MDA2OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBICisgICAgMHgwMDY5OiAweDAwNjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIDB4MDA2YTogMHgwMDZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICAweDAwNmI6IDB4MDA2YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgMHgwMDZjOiAweDAwNmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIDB4MDA2ZDogMHgwMDZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICAweDAwNmU6IDB4MDA2ZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMDZmOiAweDAwNmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIDB4MDA3MDogMHgwMDcwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICAweDAwNzE6IDB4MDA3MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgMHgwMDcyOiAweDAwNzIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIDB4MDA3MzogMHgwMDczLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICAweDAwNzQ6IDB4MDA3NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgMHgwMDc1OiAweDAwNzUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIDB4MDA3NjogMHgwMDc2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICAweDAwNzc6IDB4MDA3NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgMHgwMDc4OiAweDAwNzgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIDB4MDA3OTogMHgwMDc5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICAweDAwN2E6IDB4MDA3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgMHgwMDdiOiAweDAwN2IsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2M6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUKKyAgICAweDAwN2Q6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2U6IDB4MDA3ZSwgICAgICMgIFRJTERFCisgICAgMHgwMDdmOiAweDAwN2YsICAgICAjICBERUxFVEUKKyAgICAweDAwYTA6IDB4MDBmZiwgICAgICMgIE5PLUJSRUFLIFNQQUNFCisgICAgMHgwMGE0OiAweDAwZmQsICAgICAjICBDVVJSRU5DWSBTSUdOCisgICAgMHgwMGIwOiAweDAwZjgsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiNzogMHgwMGZhLCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDQwMTogMHgwMGYwLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8KKyAgICAweDA0MDQ6IDB4MDBmMiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIDB4MDQwNzogMHgwMGY0LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUkKKyAgICAweDA0MGU6IDB4MDBmNiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIFUKKyAgICAweDA0MTA6IDB4MDA4MCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDA0MTE6IDB4MDA4MSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEJFCisgICAgMHgwNDEyOiAweDAwODIsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRQorICAgIDB4MDQxMzogMHgwMDgzLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFCisgICAgMHgwNDE0OiAweDAwODQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBERQorICAgIDB4MDQxNTogMHgwMDg1LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUKKyAgICAweDA0MTY6IDB4MDA4NiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRQorICAgIDB4MDQxNzogMHgwMDg3LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkUKKyAgICAweDA0MTg6IDB4MDA4OCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDA0MTk6IDB4MDA4OSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkKKyAgICAweDA0MWE6IDB4MDA4YSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBCisgICAgMHgwNDFiOiAweDAwOGIsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTAorICAgIDB4MDQxYzogMHgwMDhjLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU0KKyAgICAweDA0MWQ6IDB4MDA4ZCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVOCisgICAgMHgwNDFlOiAweDAwOGUsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwNDFmOiAweDAwOGYsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBQRQorICAgIDB4MDQyMDogMHgwMDkwLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKyAgICAweDA0MjE6IDB4MDA5MSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTCisgICAgMHgwNDIyOiAweDAwOTIsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBURQorICAgIDB4MDQyMzogMHgwMDkzLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDQyNDogMHgwMDk0LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUYKKyAgICAweDA0MjU6IDB4MDA5NSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBCisgICAgMHgwNDI2OiAweDAwOTYsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0UKKyAgICAweDA0Mjc6IDB4MDA5NywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIENIRQorICAgIDB4MDQyODogMHgwMDk4LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hBCisgICAgMHgwNDI5OiAweDAwOTksICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQQorICAgIDB4MDQyYTogMHgwMDlhLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEFSRCBTSUdOCisgICAgMHgwNDJiOiAweDAwOWIsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZRVJVCisgICAgMHgwNDJjOiAweDAwOWMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTT0ZUIFNJR04KKyAgICAweDA0MmQ6IDB4MDA5ZCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDA0MmU6IDB4MDA5ZSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlVCisgICAgMHgwNDJmOiAweDAwOWYsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZQQorICAgIDB4MDQzMDogMHgwMGEwLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKyAgICAweDA0MzE6IDB4MDBhMSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorICAgIDB4MDQzMjogMHgwMGEyLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisgICAgMHgwNDMzOiAweDAwYTMsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFCisgICAgMHgwNDM0OiAweDAwYTQsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUKKyAgICAweDA0MzU6IDB4MDBhNSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBJRQorICAgIDB4MDQzNjogMHgwMGE2LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorICAgIDB4MDQzNzogMHgwMGE3LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisgICAgMHgwNDM4OiAweDAwYTgsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSQorICAgIDB4MDQzOTogMHgwMGE5LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkKKyAgICAweDA0M2E6IDB4MDBhYSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBLQQorICAgIDB4MDQzYjogMHgwMGFiLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMCisgICAgMHgwNDNjOiAweDAwYWMsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0KKyAgICAweDA0M2Q6IDB4MDBhZCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTgorICAgIDB4MDQzZTogMHgwMGFlLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8KKyAgICAweDA0M2Y6IDB4MDBhZiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBQRQorICAgIDB4MDQ0MDogMHgwMGUwLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCisgICAgMHgwNDQxOiAweDAwZTEsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKyAgICAweDA0NDI6IDB4MDBlMiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBURQorICAgIDB4MDQ0MzogMHgwMGUzLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUKKyAgICAweDA0NDQ6IDB4MDBlNCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorICAgIDB4MDQ0NTogMHgwMGU1LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisgICAgMHgwNDQ2OiAweDAwZTYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFCisgICAgMHgwNDQ3OiAweDAwZTcsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFCisgICAgMHgwNDQ4OiAweDAwZTgsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBCisgICAgMHgwNDQ5OiAweDAwZTksICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEEKKyAgICAweDA0NGE6IDB4MDBlYSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04KKyAgICAweDA0NGI6IDB4MDBlYiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVCisgICAgMHgwNDRjOiAweDAwZWMsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisgICAgMHgwNDRkOiAweDAwZWQsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorICAgIDB4MDQ0ZTogMHgwMGVlLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlVCisgICAgMHgwNDRmOiAweDAwZWYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUEKKyAgICAweDA0NTE6IDB4MDBmMSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBJTworICAgIDB4MDQ1NDogMHgwMGYzLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIDB4MDQ1NzogMHgwMGY1LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlJCisgICAgMHgwNDVlOiAweDAwZjcsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgVQorICAgIDB4MjExNjogMHgwMGZjLCAgICAgIyAgTlVNRVJPIFNJR04KKyAgICAweDIyMTk6IDB4MDBmOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MjIxYTogMHgwMGZiLCAgICAgIyAgU1FVQVJFIFJPT1QKKyAgICAweDI1MDA6IDB4MDBjNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwYjMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDI1MGM6IDB4MDBkYSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMGJmLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDBjMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDI1MTg6IDB4MDBkOSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMGMzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMGI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTJjOiAweDAwYzIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMGMxLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwYzUsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NTA6IDB4MDBjZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MjU1MTogMHgwMGJhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MjU1MjogMHgwMGQ1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NTM6IDB4MDBkNiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTU0OiAweDAwYzksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTU1OiAweDAwYjgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTU2OiAweDAwYjcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTU3OiAweDAwYmIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDI1NTg6IDB4MDBkNCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1OTogMHgwMGQzLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTVhOiAweDAwYzgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MjU1YjogMHgwMGJlLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NWM6IDB4MDBiZCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTVkOiAweDAwYmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgyNTVlOiAweDAwYzYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NWY6IDB4MDBjNywgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU2MDogMHgwMGNjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1NjE6IDB4MDBiNSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTYyOiAweDAwYjYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU2MzogMHgwMGI5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjU2NDogMHgwMGQxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2NTogMHgwMGQyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2NjogMHgwMGNiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTY3OiAweDAwY2YsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2ODogMHgwMGQwLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1Njk6IDB4MDBjYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NmE6IDB4MDBkOCwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTZiOiAweDAwZDcsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2YzogMHgwMGNlLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU4MDogMHgwMGRmLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MjU4NDogMHgwMGRjLCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MjU4ODogMHgwMGRiLCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MjU4YzogMHgwMGRkLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgyNTkwOiAweDAwZGUsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgyNTkxOiAweDAwYjAsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MjU5MjogMHgwMGIxLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgyNTkzOiAweDAwYjIsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgyNWEwOiAweDAwZmUsICAgICAjICBCTEFDSyBTUVVBUkUKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY2LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY2LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQzYTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY2LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY2LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQzYTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY5LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkYzk5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY5LnB5CkBAIC0wLDAgKzEsNjg5IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL01JQ1NGVC9QQy9DUDg2OS5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwODY5JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDA4MDogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECisgICAgMHgwMDgxOiBOb25lLCAgICAgICAjICBVTkRFRklORUQKKyAgICAweDAwODI6IE5vbmUsICAgICAgICMgIFVOREVGSU5FRAorICAgIDB4MDA4MzogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECisgICAgMHgwMDg0OiBOb25lLCAgICAgICAjICBVTkRFRklORUQKKyAgICAweDAwODU6IE5vbmUsICAgICAgICMgIFVOREVGSU5FRAorICAgIDB4MDA4NjogMHgwMzg2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIDB4MDA4NzogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECisgICAgMHgwMDg4OiAweDAwYjcsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMDg5OiAweDAwYWMsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDA4YTogMHgwMGE2LCAgICAgIyAgQlJPS0VOIEJBUgorICAgIDB4MDA4YjogMHgyMDE4LCAgICAgIyAgTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwOGM6IDB4MjAxOSwgICAgICMgIFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDA4ZDogMHgwMzg4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisgICAgMHgwMDhlOiAweDIwMTUsICAgICAjICBIT1JJWk9OVEFMIEJBUgorICAgIDB4MDA4ZjogMHgwMzg5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICAweDAwOTA6IDB4MDM4YSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIDB4MDA5MTogMHgwM2FhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIDB4MDA5MjogMHgwMzhjLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgMHgwMDkzOiBOb25lLCAgICAgICAjICBVTkRFRklORUQKKyAgICAweDAwOTQ6IE5vbmUsICAgICAgICMgIFVOREVGSU5FRAorICAgIDB4MDA5NTogMHgwMzhlLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisgICAgMHgwMDk2OiAweDAzYWIsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgMHgwMDk3OiAweDAwYTksICAgICAjICBDT1BZUklHSFQgU0lHTgorICAgIDB4MDA5ODogMHgwMzhmLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIDB4MDA5OTogMHgwMGIyLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMDlhOiAweDAwYjMsICAgICAjICBTVVBFUlNDUklQVCBUSFJFRQorICAgIDB4MDA5YjogMHgwM2FjLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICAweDAwOWM6IDB4MDBhMywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwOWQ6IDB4MDNhZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICAweDAwOWU6IDB4MDNhZSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIDB4MDA5ZjogMHgwM2FmLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIDB4MDBhMDogMHgwM2NhLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICAweDAwYTE6IDB4MDM5MCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBIEFORCBUT05PUworICAgIDB4MDBhMjogMHgwM2NjLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUworICAgIDB4MDBhMzogMHgwM2NkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIDB4MDBhNDogMHgwMzkxLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEKKyAgICAweDAwYTU6IDB4MDM5MiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEKKyAgICAweDAwYTY6IDB4MDM5MywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMGE3OiAweDAzOTQsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQQorICAgIDB4MDBhODogMHgwMzk1LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDBhOTogMHgwMzk2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQorICAgIDB4MDBhYTogMHgwMzk3LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBCisgICAgMHgwMGFiOiAweDAwYmQsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYWM6IDB4MDM5OCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgMHgwMGFkOiAweDAzOTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBCisgICAgMHgwMGFlOiAweDAwYWIsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhZjogMHgwMGJiLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGIwOiAweDI1OTEsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MDBiMTogMHgyNTkyLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgwMGIyOiAweDI1OTMsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgwMGIzOiAweDI1MDIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDAwYjQ6IDB4MjUyNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiNTogMHgwMzlhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEEKKyAgICAweDAwYjY6IDB4MDM5YiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBCisgICAgMHgwMGI3OiAweDAzOWMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQorICAgIDB4MDBiODogMHgwMzlkLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUKKyAgICAweDAwYjk6IDB4MjU2MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYmE6IDB4MjU1MSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDAwYmI6IDB4MjU1NywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBiYzogMHgyNTVkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MDBiZDogMHgwMzllLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgWEkKKyAgICAweDAwYmU6IDB4MDM5ZiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04KKyAgICAweDAwYmY6IDB4MjUxMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgwMGMwOiAweDI1MTQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgwMGMxOiAweDI1MzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzI6IDB4MjUyYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMzOiAweDI1MWMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGM0OiAweDI1MDAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MDBjNTogMHgyNTNjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGM2OiAweDAzYTAsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSQorICAgIDB4MDBjNzogMHgwM2ExLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPCisgICAgMHgwMGM4OiAweDI1NWEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MDBjOTogMHgyNTU0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MDBjYTogMHgyNTY5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYjogMHgyNTY2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNjOiAweDI1NjAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjZDogMHgyNTUwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgwMGNlOiAweDI1NmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNmOiAweDAzYTMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIDB4MDBkMDogMHgwM2E0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCisgICAgMHgwMGQxOiAweDAzYTUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCisgICAgMHgwMGQyOiAweDAzYTYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICAweDAwZDM6IDB4MDNhNywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIENISQorICAgIDB4MDBkNDogMHgwM2E4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJCisgICAgMHgwMGQ1OiAweDAzYTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIDB4MDBkNjogMHgwM2IxLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgMHgwMGQ3OiAweDAzYjIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQkVUQQorICAgIDB4MDBkODogMHgwM2IzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEdBTU1BCisgICAgMHgwMGQ5OiAweDI1MTgsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDAwZGE6IDB4MjUwYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MDBkYjogMHgyNTg4LCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MDBkYzogMHgyNTg0LCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MDBkZDogMHgwM2I0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwMGRlOiAweDAzYjUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDBkZjogMHgyNTgwLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MDBlMDogMHgwM2I2LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEKKyAgICAweDAwZTE6IDB4MDNiNywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFVEEKKyAgICAweDAwZTI6IDB4MDNiOCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQQorICAgIDB4MDBlMzogMHgwM2I5LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEKKyAgICAweDAwZTQ6IDB4MDNiYSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQorICAgIDB4MDBlNTogMHgwM2JiLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIExBTURBCisgICAgMHgwMGU2OiAweDAzYmMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgTVUKKyAgICAweDAwZTc6IDB4MDNiZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBOVQorICAgIDB4MDBlODogMHgwM2JlLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFhJCisgICAgMHgwMGU5OiAweDAzYmYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgorICAgIDB4MDBlYTogMHgwM2MwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwMGViOiAweDAzYzEsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUkhPCisgICAgMHgwMGVjOiAweDAzYzMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAwZWQ6IDB4MDNjMiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBGSU5BTCBTSUdNQQorICAgIDB4MDBlZTogMHgwM2M0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIDB4MDBlZjogMHgwMzg0LCAgICAgIyAgR1JFRUsgVE9OT1MKKyAgICAweDAwZjA6IDB4MDBhZCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGYxOiAweDAwYjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwZjI6IDB4MDNjNSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OCisgICAgMHgwMGYzOiAweDAzYzYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgMHgwMGY0OiAweDAzYzcsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQ0hJCisgICAgMHgwMGY1OiAweDAwYTcsICAgICAjICBTRUNUSU9OIFNJR04KKyAgICAweDAwZjY6IDB4MDNjOCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQU0kKKyAgICAweDAwZjc6IDB4MDM4NSwgICAgICMgIEdSRUVLIERJQUxZVElLQSBUT05PUworICAgIDB4MDBmODogMHgwMGIwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwZjk6IDB4MDBhOCwgICAgICMgIERJQUVSRVNJUworICAgIDB4MDBmYTogMHgwM2M5LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBCisgICAgMHgwMGZiOiAweDAzY2IsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIDB4MDBmYzogMHgwM2IwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TCisgICAgMHgwMGZkOiAweDAzY2UsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIDB4MDBmZTogMHgyNWEwLCAgICAgIyAgQkxBQ0sgU1FVQVJFCisgICAgMHgwMGZmOiAweDAwYTAsICAgICAjICBOTy1CUkVBSyBTUEFDRQorfSkKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAwMDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDAwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDAwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwMDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDAwMDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDAwMDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDAwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDAwMDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwMDBhIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MDAwYiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwMDBjIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MDAwZCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDAwMGUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwMDBmIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgwMDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDAwMTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgwMDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MDAxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MDAxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgwMDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgwMDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDAwMTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MDAxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDAwMTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MDAxYSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgwMDFiIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MDAxYyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MDAxZCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDAwMWUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MDAxZiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MDAyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MDAyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgwMDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgwMDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgwMDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgwMDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MDAyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDAwMjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MDAyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgwMDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgwMDJhIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgwMDJiIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MDAyYyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MDAyZCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDAwMmUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgwMDJmIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDAwMzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MDAzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDAwMzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgwMDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgwMDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDAwMzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MDAzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDAwMzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDAwMzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDAwMzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4MDAzYSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4MDAzYiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDAwM2MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDAwM2QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDAwM2UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDAwM2YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4MDA0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHgwMDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDAwNDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4MDA0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHgwMDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDAwNDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4MDA0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHgwMDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDAwNDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4MDA0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHgwMDRhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDAwNGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4MDA0YyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHgwMDRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDAwNGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4MDA0ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHgwMDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDAwNTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4MDA1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHgwMDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDAwNTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4MDA1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHgwMDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDAwNTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4MDA1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHgwMDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDAwNWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4MDA1YiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHgwMDVjIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4MDA1ZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4MDA1ZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4MDA1ZiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4MDA2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDAwNjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDAwNjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDAwNjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDAwNjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDAwNjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDAwNjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDAwNjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDAwNjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDAwNjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDAwNmEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDAwNmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDAwNmMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDAwNmQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDAwNmUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDAwNmYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDAwNzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDAwNzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDAwNzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDAwNzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDAwNzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDAwNzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDAwNzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDAwNzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDAwNzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDAwNzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDAwN2EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDAwN2IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHgwMDdjIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDAwN2QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4MDA3ZSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4MDA3ZiAtPiBERUxFVEUKKyAgICB1J1x1ZmZmZScgICAjICAweDAwODAgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHgwMDgxIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4MDA4MiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDAwODMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHgwMDg0IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4MDA4NSAtPiBVTkRFRklORUQKKyAgICB1J1x1MDM4NicgICAjICAweDAwODYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIHUnXHVmZmZlJyAgICMgIDB4MDA4NyAtPiBVTkRFRklORUQKKyAgICB1J1x4YjcnICAgICAjICAweDAwODggLT4gTUlERExFIERPVAorICAgIHUnXHhhYycgICAgICMgIDB4MDA4OSAtPiBOT1QgU0lHTgorICAgIHUnXHhhNicgICAgICMgIDB4MDA4YSAtPiBCUk9LRU4gQkFSCisgICAgdSdcdTIwMTgnICAgIyAgMHgwMDhiIC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHgwMDhjIC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMzg4JyAgICMgIDB4MDA4ZCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MjAxNScgICAjICAweDAwOGUgLT4gSE9SSVpPTlRBTCBCQVIKKyAgICB1J1x1MDM4OScgICAjICAweDAwOGYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4YScgICAjICAweDAwOTAgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzYWEnICAgIyAgMHgwMDkxIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICB1J1x1MDM4YycgICAjICAweDAwOTIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgdSdcdWZmZmUnICAgIyAgMHgwMDkzIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4MDA5NCAtPiBVTkRFRklORUQKKyAgICB1J1x1MDM4ZScgICAjICAweDAwOTUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzYWInICAgIyAgMHgwMDk2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EKKyAgICB1J1x4YTknICAgICAjICAweDAwOTcgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MDM4ZicgICAjICAweDAwOTggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIHUnXHhiMicgICAgICMgIDB4MDA5OSAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4YjMnICAgICAjICAweDAwOWEgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x1MDNhYycgICAjICAweDAwOWIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICB1J1x4YTMnICAgICAjICAweDAwOWMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHUwM2FkJyAgICMgIDB4MDA5ZCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzYWUnICAgIyAgMHgwMDllIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIHUnXHUwM2FmJyAgICMgIDB4MDA5ZiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2EnICAgIyAgMHgwMGEwIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzOTAnICAgIyAgMHgwMGExIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBIEFORCBUT05PUworICAgIHUnXHUwM2NjJyAgICMgIDB4MDBhMiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2QnICAgIyAgMHgwMGEzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDM5MScgICAjICAweDAwYTQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEKKyAgICB1J1x1MDM5MicgICAjICAweDAwYTUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQkVUQQorICAgIHUnXHUwMzkzJyAgICMgIDB4MDBhNiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIHUnXHUwMzk0JyAgICMgIDB4MDBhNyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQQorICAgIHUnXHUwMzk1JyAgICMgIDB4MDBhOCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTAzOTYnICAgIyAgMHgwMGE5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFpFVEEKKyAgICB1J1x1MDM5NycgICAjICAweDAwYWEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBCisgICAgdSdceGJkJyAgICAgIyAgMHgwMGFiIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHUwMzk4JyAgICMgIDB4MDBhYyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwMzk5JyAgICMgIDB4MDBhZCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBCisgICAgdSdceGFiJyAgICAgIyAgMHgwMGFlIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHgwMGFmIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyNTkxJyAgICMgIDB4MDBiMCAtPiBMSUdIVCBTSEFERQorICAgIHUnXHUyNTkyJyAgICMgIDB4MDBiMSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweDAwYjIgLT4gREFSSyBTSEFERQorICAgIHUnXHUyNTAyJyAgICMgIDB4MDBiMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICB1J1x1MjUyNCcgICAjICAweDAwYjQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTAzOWEnICAgIyAgMHgwMGI1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBCisgICAgdSdcdTAzOWInICAgIyAgMHgwMGI2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBCisgICAgdSdcdTAzOWMnICAgIyAgMHgwMGI3IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE1VCisgICAgdSdcdTAzOWQnICAgIyAgMHgwMGI4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE5VCisgICAgdSdcdTI1NjMnICAgIyAgMHgwMGI5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU1MScgICAjICAweDAwYmEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTU3JyAgICMgIDB4MDBiYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjU1ZCcgICAjICAweDAwYmMgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIHUnXHUwMzllJyAgICMgIDB4MDBiZCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBYSQorICAgIHUnXHUwMzlmJyAgICMgIDB4MDBiZSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCisgICAgdSdcdTI1MTAnICAgIyAgMHgwMGJmIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHgwMGMwIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjUzNCcgICAjICAweDAwYzEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MmMnICAgIyAgMHgwMGMyIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHgwMGMzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUwMCcgICAjICAweDAwYzQgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweDAwYzUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTAzYTAnICAgIyAgMHgwMGM2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBJCisgICAgdSdcdTAzYTEnICAgIyAgMHgwMGM3IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFJITworICAgIHUnXHUyNTVhJyAgICMgIDB4MDBjOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTU0JyAgICMgIDB4MDBjOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHgwMGNhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweDAwY2IgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjAnICAgIyAgMHgwMGNjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHgwMGNkIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4MDBjZSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTAzYTMnICAgIyAgMHgwMGNmIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgdSdcdTAzYTQnICAgIyAgMHgwMGQwIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFRBVQorICAgIHUnXHUwM2E1JyAgICMgIDB4MDBkMSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCisgICAgdSdcdTAzYTYnICAgIyAgMHgwMGQyIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIHUnXHUwM2E3JyAgICMgIDB4MDBkMyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkKKyAgICB1J1x1MDNhOCcgICAjICAweDAwZDQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJCisgICAgdSdcdTAzYTknICAgIyAgMHgwMGQ1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzYjEnICAgIyAgMHgwMGQ2IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIHUnXHUwM2IyJyAgICMgIDB4MDBkNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQkVUQQorICAgIHUnXHUwM2IzJyAgICMgIDB4MDBkOCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgR0FNTUEKKyAgICB1J1x1MjUxOCcgICAjICAweDAwZDkgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgdSdcdTI1MGMnICAgIyAgMHgwMGRhIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTg4JyAgICMgIDB4MDBkYiAtPiBGVUxMIEJMT0NLCisgICAgdSdcdTI1ODQnICAgIyAgMHgwMGRjIC0+IExPV0VSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MDNiNCcgICAjICAweDAwZGQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgdSdcdTAzYjUnICAgIyAgMHgwMGRlIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTI1ODAnICAgIyAgMHgwMGRmIC0+IFVQUEVSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MDNiNicgICAjICAweDAwZTAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEKKyAgICB1J1x1MDNiNycgICAjICAweDAwZTEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVUQQorICAgIHUnXHUwM2I4JyAgICMgIDB4MDBlMiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEEKKyAgICB1J1x1MDNiOScgICAjICAweDAwZTMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEKKyAgICB1J1x1MDNiYScgICAjICAweDAwZTQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEtBUFBBCisgICAgdSdcdTAzYmInICAgIyAgMHgwMGU1IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQorICAgIHUnXHUwM2JjJyAgICMgIDB4MDBlNiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgTVUKKyAgICB1J1x1MDNiZCcgICAjICAweDAwZTcgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE5VCisgICAgdSdcdTAzYmUnICAgIyAgMHgwMGU4IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBYSQorICAgIHUnXHUwM2JmJyAgICMgIDB4MDBlOSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgorICAgIHUnXHUwM2MwJyAgICMgIDB4MDBlYSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICB1J1x1MDNjMScgICAjICAweDAwZWIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFJITworICAgIHUnXHUwM2MzJyAgICMgIDB4MDBlYyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICB1J1x1MDNjMicgICAjICAweDAwZWQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BCisgICAgdSdcdTAzYzQnICAgIyAgMHgwMGVlIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICB1J1x1MDM4NCcgICAjICAweDAwZWYgLT4gR1JFRUsgVE9OT1MKKyAgICB1J1x4YWQnICAgICAjICAweDAwZjAgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4YjEnICAgICAjICAweDAwZjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTAzYzUnICAgIyAgMHgwMGYyIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OCisgICAgdSdcdTAzYzYnICAgIyAgMHgwMGYzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICB1J1x1MDNjNycgICAjICAweDAwZjQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIENISQorICAgIHUnXHhhNycgICAgICMgIDB4MDBmNSAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MDNjOCcgICAjICAweDAwZjYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBTSQorICAgIHUnXHUwMzg1JyAgICMgIDB4MDBmNyAtPiBHUkVFSyBESUFMWVRJS0EgVE9OT1MKKyAgICB1J1x4YjAnICAgICAjICAweDAwZjggLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweDAwZjkgLT4gRElBRVJFU0lTCisgICAgdSdcdTAzYzknICAgIyAgMHgwMGZhIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwM2NiJyAgICMgIDB4MDBmYiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwM2IwJyAgICMgIDB4MDBmYyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQSBBTkQgVE9OT1MKKyAgICB1J1x1MDNjZScgICAjICAweDAwZmQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHgwMGZmIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQKKyAgICAweDAwMjc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUKKyAgICAweDAwMjg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMKKyAgICAweDAwMjk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSworICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOCisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQQorICAgIDB4MDAyZDogMHgwMDJkLCAgICAgIyAgSFlQSEVOLU1JTlVTCisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OCisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04KKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOCisgICAgMHgwMDNkOiAweDAwM2QsICAgICAjICBFUVVBTFMgU0lHTgorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04KKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUksKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUworICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5UCisgICAgMHgwMDVmOiAweDAwNWYsICAgICAjICBMT1cgTElORQorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3YzogMHgwMDdjLCAgICAgIyAgVkVSVElDQUwgTElORQorICAgIDB4MDA3ZDogMHgwMDdkLCAgICAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3ZTogMHgwMDdlLCAgICAgIyAgVElMREUKKyAgICAweDAwN2Y6IDB4MDA3ZiwgICAgICMgIERFTEVURQorICAgIDB4MDBhMDogMHgwMGZmLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKKyAgICAweDAwYTM6IDB4MDA5YywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwYTY6IDB4MDA4YSwgICAgICMgIEJST0tFTiBCQVIKKyAgICAweDAwYTc6IDB4MDBmNSwgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBhODogMHgwMGY5LCAgICAgIyAgRElBRVJFU0lTCisgICAgMHgwMGE5OiAweDAwOTcsICAgICAjICBDT1BZUklHSFQgU0lHTgorICAgIDB4MDBhYjogMHgwMGFlLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWM6IDB4MDA4OSwgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGFkOiAweDAwZjAsICAgICAjICBTT0ZUIEhZUEhFTgorICAgIDB4MDBiMDogMHgwMGY4LCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwYjE6IDB4MDBmMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBiMjogMHgwMDk5LCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGIzOiAweDAwOWEsICAgICAjICBTVVBFUlNDUklQVCBUSFJFRQorICAgIDB4MDBiNzogMHgwMDg4LCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBiYjogMHgwMGFmLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGJkOiAweDAwYWIsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAzODQ6IDB4MDBlZiwgICAgICMgIEdSRUVLIFRPTk9TCisgICAgMHgwMzg1OiAweDAwZjcsICAgICAjICBHUkVFSyBESUFMWVRJS0EgVE9OT1MKKyAgICAweDAzODY6IDB4MDA4NiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICAweDAzODg6IDB4MDA4ZCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIDB4MDM4OTogMHgwMDhmLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICAweDAzOGE6IDB4MDA5MCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIDB4MDM4YzogMHgwMDkyLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgMHgwMzhlOiAweDAwOTUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICAweDAzOGY6IDB4MDA5OCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICAweDAzOTA6IDB4MDBhMSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBIEFORCBUT05PUworICAgIDB4MDM5MTogMHgwMGE0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEKKyAgICAweDAzOTI6IDB4MDBhNSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEKKyAgICAweDAzOTM6IDB4MDBhNiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMzk0OiAweDAwYTcsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQQorICAgIDB4MDM5NTogMHgwMGE4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDM5NjogMHgwMGE5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQorICAgIDB4MDM5NzogMHgwMGFhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBCisgICAgMHgwMzk4OiAweDAwYWMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIDB4MDM5OTogMHgwMGFkLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQQorICAgIDB4MDM5YTogMHgwMGI1LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEEKKyAgICAweDAzOWI6IDB4MDBiNiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBCisgICAgMHgwMzljOiAweDAwYjcsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQorICAgIDB4MDM5ZDogMHgwMGI4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUKKyAgICAweDAzOWU6IDB4MDBiZCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFhJCisgICAgMHgwMzlmOiAweDAwYmUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCisgICAgMHgwM2EwOiAweDAwYzYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSQorICAgIDB4MDNhMTogMHgwMGM3LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPCisgICAgMHgwM2EzOiAweDAwY2YsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIDB4MDNhNDogMHgwMGQwLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCisgICAgMHgwM2E1OiAweDAwZDEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCisgICAgMHgwM2E2OiAweDAwZDIsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICAweDAzYTc6IDB4MDBkMywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIENISQorICAgIDB4MDNhODogMHgwMGQ0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJCisgICAgMHgwM2E5OiAweDAwZDUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIDB4MDNhYTogMHgwMDkxLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIDB4MDNhYjogMHgwMDk2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIDB4MDNhYzogMHgwMDliLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICAweDAzYWQ6IDB4MDA5ZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICAweDAzYWU6IDB4MDA5ZSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIDB4MDNhZjogMHgwMDlmLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIDB4MDNiMDogMHgwMGZjLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TCisgICAgMHgwM2IxOiAweDAwZDYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICAweDAzYjI6IDB4MDBkNywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBCRVRBCisgICAgMHgwM2IzOiAweDAwZDgsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgR0FNTUEKKyAgICAweDAzYjQ6IDB4MDBkZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIDB4MDNiNTogMHgwMGRlLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICAweDAzYjY6IDB4MDBlMCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBaRVRBCisgICAgMHgwM2I3OiAweDAwZTEsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVRBCisgICAgMHgwM2I4OiAweDAwZTIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEEKKyAgICAweDAzYjk6IDB4MDBlMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBCisgICAgMHgwM2JhOiAweDAwZTQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgS0FQUEEKKyAgICAweDAzYmI6IDB4MDBlNSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQorICAgIDB4MDNiYzogMHgwMGU2LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIE1VCisgICAgMHgwM2JkOiAweDAwZTcsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgTlUKKyAgICAweDAzYmU6IDB4MDBlOCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBYSQorICAgIDB4MDNiZjogMHgwMGU5LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04KKyAgICAweDAzYzA6IDB4MDBlYSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIDB4MDNjMTogMHgwMGViLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFJITworICAgIDB4MDNjMjogMHgwMGVkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BCisgICAgMHgwM2MzOiAweDAwZWMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAzYzQ6IDB4MDBlZSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICAweDAzYzU6IDB4MDBmMiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OCisgICAgMHgwM2M2OiAweDAwZjMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgMHgwM2M3OiAweDAwZjQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQ0hJCisgICAgMHgwM2M4OiAweDAwZjYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUFNJCisgICAgMHgwM2M5OiAweDAwZmEsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EKKyAgICAweDAzY2E6IDB4MDBhMCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisgICAgMHgwM2NiOiAweDAwZmIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIDB4MDNjYzogMHgwMGEyLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUworICAgIDB4MDNjZDogMHgwMGEzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIDB4MDNjZTogMHgwMGZkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICAweDIwMTU6IDB4MDA4ZSwgICAgICMgIEhPUklaT05UQUwgQkFSCisgICAgMHgyMDE4OiAweDAwOGIsICAgICAjICBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MjAxOTogMHgwMDhjLCAgICAgIyAgUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgyNTAwOiAweDAwYzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MjUwMjogMHgwMGIzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgyNTBjOiAweDAwZGEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1MTA6IDB4MDBiZiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgyNTE0OiAweDAwYzAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgyNTE4OiAweDAwZDksICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDI1MWM6IDB4MDBjMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1MjQ6IDB4MDBiNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjUyYzogMHgwMGMyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1MzQ6IDB4MDBjMSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzYzogMHgwMGM1LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTUwOiAweDAwY2QsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDI1NTE6IDB4MDBiYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDI1NTQ6IDB4MDBjOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1NTc6IDB4MDBiYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MjU1YTogMHgwMGM4LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDI1NWQ6IDB4MDBiYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDI1NjA6IDB4MDBjYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTYzOiAweDAwYjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTY2OiAweDAwY2IsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1Njk6IDB4MDBjYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NmM6IDB4MDBjZSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1ODA6IDB4MDBkZiwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODQ6IDB4MDBkYywgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODg6IDB4MDBkYiwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDI1OTE6IDB4MDBiMCwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgyNTkyOiAweDAwYjEsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDI1OTM6IDB4MDBiMiwgICAgICMgIERBUksgU0hBREUKKyAgICAweDI1YTA6IDB4MDBmZSwgICAgICMgIEJMQUNLIFNRVUFSRQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjkucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MWIwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2OS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjkucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MWIwMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2OS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzQucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg3NC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTEwZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzQucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3A4NzQgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1A4NzQuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A4NzQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHUyMGFjJyAgICMgIDB4ODAgLT4gRVVSTyBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg4MSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDgyIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4ODMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4NCAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAyNicgICAjICAweDg1IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x1ZmZmZScgICAjICAweDg2IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4ODcgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4OCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDg5IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OEEgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4QiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhDIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OEQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4RSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhGIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OTAgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMTgnICAgIyAgMHg5MSAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4OTIgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWMnICAgIyAgMHg5MyAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFkJyAgICMgIDB4OTQgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjInICAgIyAgMHg5NSAtPiBCVUxMRVQKKyAgICB1J1x1MjAxMycgICAjICAweDk2IC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweDk3IC0+IEVNIERBU0gKKyAgICB1J1x1ZmZmZScgICAjICAweDk4IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OTkgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5QSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDlCIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OUMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5RCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDlFIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OUYgLT4gVU5ERUZJTkVECisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUwZTAxJyAgICMgIDB4QTEgLT4gVEhBSSBDSEFSQUNURVIgS08gS0FJCisgICAgdSdcdTBlMDInICAgIyAgMHhBMiAtPiBUSEFJIENIQVJBQ1RFUiBLSE8gS0hBSQorICAgIHUnXHUwZTAzJyAgICMgIDB4QTMgLT4gVEhBSSBDSEFSQUNURVIgS0hPIEtIVUFUCisgICAgdSdcdTBlMDQnICAgIyAgMHhBNCAtPiBUSEFJIENIQVJBQ1RFUiBLSE8gS0hXQUkKKyAgICB1J1x1MGUwNScgICAjICAweEE1IC0+IFRIQUkgQ0hBUkFDVEVSIEtITyBLSE9OCisgICAgdSdcdTBlMDYnICAgIyAgMHhBNiAtPiBUSEFJIENIQVJBQ1RFUiBLSE8gUkFLSEFORworICAgIHUnXHUwZTA3JyAgICMgIDB4QTcgLT4gVEhBSSBDSEFSQUNURVIgTkdPIE5HVQorICAgIHUnXHUwZTA4JyAgICMgIDB4QTggLT4gVEhBSSBDSEFSQUNURVIgQ0hPIENIQU4KKyAgICB1J1x1MGUwOScgICAjICAweEE5IC0+IFRIQUkgQ0hBUkFDVEVSIENITyBDSElORworICAgIHUnXHUwZTBhJyAgICMgIDB4QUEgLT4gVEhBSSBDSEFSQUNURVIgQ0hPIENIQU5HCisgICAgdSdcdTBlMGInICAgIyAgMHhBQiAtPiBUSEFJIENIQVJBQ1RFUiBTTyBTTworICAgIHUnXHUwZTBjJyAgICMgIDB4QUMgLT4gVEhBSSBDSEFSQUNURVIgQ0hPIENIT0UKKyAgICB1J1x1MGUwZCcgICAjICAweEFEIC0+IFRIQUkgQ0hBUkFDVEVSIFlPIFlJTkcKKyAgICB1J1x1MGUwZScgICAjICAweEFFIC0+IFRIQUkgQ0hBUkFDVEVSIERPIENIQURBCisgICAgdSdcdTBlMGYnICAgIyAgMHhBRiAtPiBUSEFJIENIQVJBQ1RFUiBUTyBQQVRBSworICAgIHUnXHUwZTEwJyAgICMgIDB4QjAgLT4gVEhBSSBDSEFSQUNURVIgVEhPIFRIQU4KKyAgICB1J1x1MGUxMScgICAjICAweEIxIC0+IFRIQUkgQ0hBUkFDVEVSIFRITyBOQU5HTU9OVEhPCisgICAgdSdcdTBlMTInICAgIyAgMHhCMiAtPiBUSEFJIENIQVJBQ1RFUiBUSE8gUEhVVEhBTworICAgIHUnXHUwZTEzJyAgICMgIDB4QjMgLT4gVEhBSSBDSEFSQUNURVIgTk8gTkVOCisgICAgdSdcdTBlMTQnICAgIyAgMHhCNCAtPiBUSEFJIENIQVJBQ1RFUiBETyBERUsKKyAgICB1J1x1MGUxNScgICAjICAweEI1IC0+IFRIQUkgQ0hBUkFDVEVSIFRPIFRBTworICAgIHUnXHUwZTE2JyAgICMgIDB4QjYgLT4gVEhBSSBDSEFSQUNURVIgVEhPIFRIVU5HCisgICAgdSdcdTBlMTcnICAgIyAgMHhCNyAtPiBUSEFJIENIQVJBQ1RFUiBUSE8gVEhBSEFOCisgICAgdSdcdTBlMTgnICAgIyAgMHhCOCAtPiBUSEFJIENIQVJBQ1RFUiBUSE8gVEhPTkcKKyAgICB1J1x1MGUxOScgICAjICAweEI5IC0+IFRIQUkgQ0hBUkFDVEVSIE5PIE5VCisgICAgdSdcdTBlMWEnICAgIyAgMHhCQSAtPiBUSEFJIENIQVJBQ1RFUiBCTyBCQUlNQUkKKyAgICB1J1x1MGUxYicgICAjICAweEJCIC0+IFRIQUkgQ0hBUkFDVEVSIFBPIFBMQQorICAgIHUnXHUwZTFjJyAgICMgIDB4QkMgLT4gVEhBSSBDSEFSQUNURVIgUEhPIFBIVU5HCisgICAgdSdcdTBlMWQnICAgIyAgMHhCRCAtPiBUSEFJIENIQVJBQ1RFUiBGTyBGQQorICAgIHUnXHUwZTFlJyAgICMgIDB4QkUgLT4gVEhBSSBDSEFSQUNURVIgUEhPIFBIQU4KKyAgICB1J1x1MGUxZicgICAjICAweEJGIC0+IFRIQUkgQ0hBUkFDVEVSIEZPIEZBTgorICAgIHUnXHUwZTIwJyAgICMgIDB4QzAgLT4gVEhBSSBDSEFSQUNURVIgUEhPIFNBTVBIQU8KKyAgICB1J1x1MGUyMScgICAjICAweEMxIC0+IFRIQUkgQ0hBUkFDVEVSIE1PIE1BCisgICAgdSdcdTBlMjInICAgIyAgMHhDMiAtPiBUSEFJIENIQVJBQ1RFUiBZTyBZQUsKKyAgICB1J1x1MGUyMycgICAjICAweEMzIC0+IFRIQUkgQ0hBUkFDVEVSIFJPIFJVQQorICAgIHUnXHUwZTI0JyAgICMgIDB4QzQgLT4gVEhBSSBDSEFSQUNURVIgUlUKKyAgICB1J1x1MGUyNScgICAjICAweEM1IC0+IFRIQUkgQ0hBUkFDVEVSIExPIExJTkcKKyAgICB1J1x1MGUyNicgICAjICAweEM2IC0+IFRIQUkgQ0hBUkFDVEVSIExVCisgICAgdSdcdTBlMjcnICAgIyAgMHhDNyAtPiBUSEFJIENIQVJBQ1RFUiBXTyBXQUVOCisgICAgdSdcdTBlMjgnICAgIyAgMHhDOCAtPiBUSEFJIENIQVJBQ1RFUiBTTyBTQUxBCisgICAgdSdcdTBlMjknICAgIyAgMHhDOSAtPiBUSEFJIENIQVJBQ1RFUiBTTyBSVVNJCisgICAgdSdcdTBlMmEnICAgIyAgMHhDQSAtPiBUSEFJIENIQVJBQ1RFUiBTTyBTVUEKKyAgICB1J1x1MGUyYicgICAjICAweENCIC0+IFRIQUkgQ0hBUkFDVEVSIEhPIEhJUAorICAgIHUnXHUwZTJjJyAgICMgIDB4Q0MgLT4gVEhBSSBDSEFSQUNURVIgTE8gQ0hVTEEKKyAgICB1J1x1MGUyZCcgICAjICAweENEIC0+IFRIQUkgQ0hBUkFDVEVSIE8gQU5HCisgICAgdSdcdTBlMmUnICAgIyAgMHhDRSAtPiBUSEFJIENIQVJBQ1RFUiBITyBOT0tIVUsKKyAgICB1J1x1MGUyZicgICAjICAweENGIC0+IFRIQUkgQ0hBUkFDVEVSIFBBSVlBTk5PSQorICAgIHUnXHUwZTMwJyAgICMgIDB4RDAgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBBCisgICAgdSdcdTBlMzEnICAgIyAgMHhEMSAtPiBUSEFJIENIQVJBQ1RFUiBNQUkgSEFOLUFLQVQKKyAgICB1J1x1MGUzMicgICAjICAweEQyIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUEKKyAgICB1J1x1MGUzMycgICAjICAweEQzIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgQU0KKyAgICB1J1x1MGUzNCcgICAjICAweEQ0IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgSQorICAgIHUnXHUwZTM1JyAgICMgIDB4RDUgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBJSQorICAgIHUnXHUwZTM2JyAgICMgIDB4RDYgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBVRQorICAgIHUnXHUwZTM3JyAgICMgIDB4RDcgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBVRUUKKyAgICB1J1x1MGUzOCcgICAjICAweEQ4IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgVQorICAgIHUnXHUwZTM5JyAgICMgIDB4RDkgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBVVQorICAgIHUnXHUwZTNhJyAgICMgIDB4REEgLT4gVEhBSSBDSEFSQUNURVIgUEhJTlRIVQorICAgIHUnXHVmZmZlJyAgICMgIDB4REIgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhEQyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEREIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4REUgLT4gVU5ERUZJTkVECisgICAgdSdcdTBlM2YnICAgIyAgMHhERiAtPiBUSEFJIENVUlJFTkNZIFNZTUJPTCBCQUhUCisgICAgdSdcdTBlNDAnICAgIyAgMHhFMCAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEUKKyAgICB1J1x1MGU0MScgICAjICAweEUxIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUUKKyAgICB1J1x1MGU0MicgICAjICAweEUyIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgTworICAgIHUnXHUwZTQzJyAgICMgIDB4RTMgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBBSSBNQUlNVUFOCisgICAgdSdcdTBlNDQnICAgIyAgMHhFNCAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEFJIE1BSU1BTEFJCisgICAgdSdcdTBlNDUnICAgIyAgMHhFNSAtPiBUSEFJIENIQVJBQ1RFUiBMQUtLSEFOR1lBTworICAgIHUnXHUwZTQ2JyAgICMgIDB4RTYgLT4gVEhBSSBDSEFSQUNURVIgTUFJWUFNT0sKKyAgICB1J1x1MGU0NycgICAjICAweEU3IC0+IFRIQUkgQ0hBUkFDVEVSIE1BSVRBSUtIVQorICAgIHUnXHUwZTQ4JyAgICMgIDB4RTggLT4gVEhBSSBDSEFSQUNURVIgTUFJIEVLCisgICAgdSdcdTBlNDknICAgIyAgMHhFOSAtPiBUSEFJIENIQVJBQ1RFUiBNQUkgVEhPCisgICAgdSdcdTBlNGEnICAgIyAgMHhFQSAtPiBUSEFJIENIQVJBQ1RFUiBNQUkgVFJJCisgICAgdSdcdTBlNGInICAgIyAgMHhFQiAtPiBUSEFJIENIQVJBQ1RFUiBNQUkgQ0hBVFRBV0EKKyAgICB1J1x1MGU0YycgICAjICAweEVDIC0+IFRIQUkgQ0hBUkFDVEVSIFRIQU5USEFLSEFUCisgICAgdSdcdTBlNGQnICAgIyAgMHhFRCAtPiBUSEFJIENIQVJBQ1RFUiBOSUtIQUhJVAorICAgIHUnXHUwZTRlJyAgICMgIDB4RUUgLT4gVEhBSSBDSEFSQUNURVIgWUFNQUtLQU4KKyAgICB1J1x1MGU0ZicgICAjICAweEVGIC0+IFRIQUkgQ0hBUkFDVEVSIEZPTkdNQU4KKyAgICB1J1x1MGU1MCcgICAjICAweEYwIC0+IFRIQUkgRElHSVQgWkVSTworICAgIHUnXHUwZTUxJyAgICMgIDB4RjEgLT4gVEhBSSBESUdJVCBPTkUKKyAgICB1J1x1MGU1MicgICAjICAweEYyIC0+IFRIQUkgRElHSVQgVFdPCisgICAgdSdcdTBlNTMnICAgIyAgMHhGMyAtPiBUSEFJIERJR0lUIFRIUkVFCisgICAgdSdcdTBlNTQnICAgIyAgMHhGNCAtPiBUSEFJIERJR0lUIEZPVVIKKyAgICB1J1x1MGU1NScgICAjICAweEY1IC0+IFRIQUkgRElHSVQgRklWRQorICAgIHUnXHUwZTU2JyAgICMgIDB4RjYgLT4gVEhBSSBESUdJVCBTSVgKKyAgICB1J1x1MGU1NycgICAjICAweEY3IC0+IFRIQUkgRElHSVQgU0VWRU4KKyAgICB1J1x1MGU1OCcgICAjICAweEY4IC0+IFRIQUkgRElHSVQgRUlHSFQKKyAgICB1J1x1MGU1OScgICAjICAweEY5IC0+IFRIQUkgRElHSVQgTklORQorICAgIHUnXHUwZTVhJyAgICMgIDB4RkEgLT4gVEhBSSBDSEFSQUNURVIgQU5HS0hBTktIVQorICAgIHUnXHUwZTViJyAgICMgIDB4RkIgLT4gVEhBSSBDSEFSQUNURVIgS0hPTVVUCisgICAgdSdcdWZmZmUnICAgIyAgMHhGQyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEZEIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RkUgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhGRiAtPiBVTkRFRklORUQKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODc0LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODc0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGY4YjVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODc0LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODc0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGY4YjVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODc1LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiMTYwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODc1LnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwODc1IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9FQkNESUMvQ1A4NzUuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A4NzUnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4OWMnICAgICAjICAweDA0IC0+IENPTlRST0wKKyAgICB1J1x0JyAgICAgICAjICAweDA1IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXHg4NicgICAgICMgIDB4MDYgLT4gQ09OVFJPTAorICAgIHUnXHg3ZicgICAgICMgIDB4MDcgLT4gREVMRVRFCisgICAgdSdceDk3JyAgICAgIyAgMHgwOCAtPiBDT05UUk9MCisgICAgdSdceDhkJyAgICAgIyAgMHgwOSAtPiBDT05UUk9MCisgICAgdSdceDhlJyAgICAgIyAgMHgwQSAtPiBDT05UUk9MCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDlkJyAgICAgIyAgMHgxNCAtPiBDT05UUk9MCisgICAgdSdceDg1JyAgICAgIyAgMHgxNSAtPiBDT05UUk9MCisgICAgdSdceDA4JyAgICAgIyAgMHgxNiAtPiBCQUNLU1BBQ0UKKyAgICB1J1x4ODcnICAgICAjICAweDE3IC0+IENPTlRST0wKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHg5MicgICAgICMgIDB4MUEgLT4gQ09OVFJPTAorICAgIHUnXHg4ZicgICAgICMgIDB4MUIgLT4gQ09OVFJPTAorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1J1x4ODAnICAgICAjICAweDIwIC0+IENPTlRST0wKKyAgICB1J1x4ODEnICAgICAjICAweDIxIC0+IENPTlRST0wKKyAgICB1J1x4ODInICAgICAjICAweDIyIC0+IENPTlRST0wKKyAgICB1J1x4ODMnICAgICAjICAweDIzIC0+IENPTlRST0wKKyAgICB1J1x4ODQnICAgICAjICAweDI0IC0+IENPTlRST0wKKyAgICB1J1xuJyAgICAgICAjICAweDI1IC0+IExJTkUgRkVFRAorICAgIHUnXHgxNycgICAgICMgIDB4MjYgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxYicgICAgICMgIDB4MjcgLT4gRVNDQVBFCisgICAgdSdceDg4JyAgICAgIyAgMHgyOCAtPiBDT05UUk9MCisgICAgdSdceDg5JyAgICAgIyAgMHgyOSAtPiBDT05UUk9MCisgICAgdSdceDhhJyAgICAgIyAgMHgyQSAtPiBDT05UUk9MCisgICAgdSdceDhiJyAgICAgIyAgMHgyQiAtPiBDT05UUk9MCisgICAgdSdceDhjJyAgICAgIyAgMHgyQyAtPiBDT05UUk9MCisgICAgdSdceDA1JyAgICAgIyAgMHgyRCAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgyRSAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MkYgLT4gQkVMTAorICAgIHUnXHg5MCcgICAgICMgIDB4MzAgLT4gQ09OVFJPTAorICAgIHUnXHg5MScgICAgICMgIDB4MzEgLT4gQ09OVFJPTAorICAgIHUnXHgxNicgICAgICMgIDB4MzIgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHg5MycgICAgICMgIDB4MzMgLT4gQ09OVFJPTAorICAgIHUnXHg5NCcgICAgICMgIDB4MzQgLT4gQ09OVFJPTAorICAgIHUnXHg5NScgICAgICMgIDB4MzUgLT4gQ09OVFJPTAorICAgIHUnXHg5NicgICAgICMgIDB4MzYgLT4gQ09OVFJPTAorICAgIHUnXHgwNCcgICAgICMgIDB4MzcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHg5OCcgICAgICMgIDB4MzggLT4gQ09OVFJPTAorICAgIHUnXHg5OScgICAgICMgIDB4MzkgLT4gQ09OVFJPTAorICAgIHUnXHg5YScgICAgICMgIDB4M0EgLT4gQ09OVFJPTAorICAgIHUnXHg5YicgICAgICMgIDB4M0IgLT4gQ09OVFJPTAorICAgIHUnXHgxNCcgICAgICMgIDB4M0MgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4M0QgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4OWUnICAgICAjICAweDNFIC0+IENPTlRST0wKKyAgICB1J1x4MWEnICAgICAjICAweDNGIC0+IFNVQlNUSVRVVEUKKyAgICB1JyAnICAgICAgICAjICAweDQwIC0+IFNQQUNFCisgICAgdSdcdTAzOTEnICAgIyAgMHg0MSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQQorICAgIHUnXHUwMzkyJyAgICMgIDB4NDIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQkVUQQorICAgIHUnXHUwMzkzJyAgICMgIDB4NDMgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICB1J1x1MDM5NCcgICAjICAweDQ0IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBCisgICAgdSdcdTAzOTUnICAgIyAgMHg0NSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTAzOTYnICAgIyAgMHg0NiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBaRVRBCisgICAgdSdcdTAzOTcnICAgIyAgMHg0NyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEKKyAgICB1J1x1MDM5OCcgICAjICAweDQ4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgdSdcdTAzOTknICAgIyAgMHg0OSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBCisgICAgdSdbJyAgICAgICAgIyAgMHg0QSAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdScuJyAgICAgICAgIyAgMHg0QiAtPiBGVUxMIFNUT1AKKyAgICB1JzwnICAgICAgICAjICAweDRDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdScoJyAgICAgICAgIyAgMHg0RCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScrJyAgICAgICAgIyAgMHg0RSAtPiBQTFVTIFNJR04KKyAgICB1JyEnICAgICAgICAjICAweDRGIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyYnICAgICAgICAjICAweDUwIC0+IEFNUEVSU0FORAorICAgIHUnXHUwMzlhJyAgICMgIDB4NTEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEEKKyAgICB1J1x1MDM5YicgICAjICAweDUyIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBCisgICAgdSdcdTAzOWMnICAgIyAgMHg1MyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQorICAgIHUnXHUwMzlkJyAgICMgIDB4NTQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUKKyAgICB1J1x1MDM5ZScgICAjICAweDU1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFhJCisgICAgdSdcdTAzOWYnICAgIyAgMHg1NiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCisgICAgdSdcdTAzYTAnICAgIyAgMHg1NyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSQorICAgIHUnXHUwM2ExJyAgICMgIDB4NTggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPCisgICAgdSdcdTAzYTMnICAgIyAgMHg1OSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIHUnXScgICAgICAgICMgIDB4NUEgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1JyQnICAgICAgICAjICAweDVCIC0+IERPTExBUiBTSUdOCisgICAgdScqJyAgICAgICAgIyAgMHg1QyAtPiBBU1RFUklTSworICAgIHUnKScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JzsnICAgICAgICAjICAweDVFIC0+IFNFTUlDT0xPTgorICAgIHUnXicgICAgICAgICMgIDB4NUYgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1Jy0nICAgICAgICAjICAweDYwIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLycgICAgICAgICMgIDB4NjEgLT4gU09MSURVUworICAgIHUnXHUwM2E0JyAgICMgIDB4NjIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCisgICAgdSdcdTAzYTUnICAgIyAgMHg2MyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCisgICAgdSdcdTAzYTYnICAgIyAgMHg2NCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICB1J1x1MDNhNycgICAjICAweDY1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIENISQorICAgIHUnXHUwM2E4JyAgICMgIDB4NjYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJCisgICAgdSdcdTAzYTknICAgIyAgMHg2NyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwM2FhJyAgICMgIDB4NjggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwM2FiJyAgICMgIDB4NjkgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIHUnfCcgICAgICAgICMgIDB4NkEgLT4gVkVSVElDQUwgTElORQorICAgIHUnLCcgICAgICAgICMgIDB4NkIgLT4gQ09NTUEKKyAgICB1JyUnICAgICAgICAjICAweDZDIC0+IFBFUkNFTlQgU0lHTgorICAgIHUnXycgICAgICAgICMgIDB4NkQgLT4gTE9XIExJTkUKKyAgICB1Jz4nICAgICAgICAjICAweDZFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHg2RiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdceGE4JyAgICAgIyAgMHg3MCAtPiBESUFFUkVTSVMKKyAgICB1J1x1MDM4NicgICAjICAweDcxIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4OCcgICAjICAweDcyIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwMzg5JyAgICMgIDB4NzMgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICB1J1x4YTAnICAgICAjICAweDc0IC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTAzOGEnICAgIyAgMHg3NSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4YycgICAjICAweDc2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUworICAgIHUnXHUwMzhlJyAgICMgIDB4NzcgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzOGYnICAgIyAgMHg3OCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisgICAgdSdgJyAgICAgICAgIyAgMHg3OSAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1JzonICAgICAgICAjICAweDdBIC0+IENPTE9OCisgICAgdScjJyAgICAgICAgIyAgMHg3QiAtPiBOVU1CRVIgU0lHTgorICAgIHUnQCcgICAgICAgICMgIDB4N0MgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUiJyIgICAgICAgICMgIDB4N0QgLT4gQVBPU1RST1BIRQorICAgIHUnPScgICAgICAgICMgIDB4N0UgLT4gRVFVQUxTIFNJR04KKyAgICB1JyInICAgICAgICAjICAweDdGIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAzODUnICAgIyAgMHg4MCAtPiBHUkVFSyBESUFMWVRJS0EgVE9OT1MKKyAgICB1J2EnICAgICAgICAjICAweDgxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4ODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDg0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg4NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4ODYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4ODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J1x1MDNiMScgICAjICAweDhBIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIHUnXHUwM2IyJyAgICMgIDB4OEIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEJFVEEKKyAgICB1J1x1MDNiMycgICAjICAweDhDIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBHQU1NQQorICAgIHUnXHUwM2I0JyAgICMgIDB4OEQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgdSdcdTAzYjUnICAgIyAgMHg4RSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIHUnXHUwM2I2JyAgICMgIDB4OEYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEKKyAgICB1J1x4YjAnICAgICAjICAweDkwIC0+IERFR1JFRSBTSUdOCisgICAgdSdqJyAgICAgICAgIyAgMHg5MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4OTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4OTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4OTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDk5IC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdcdTAzYjcnICAgIyAgMHg5QSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVRBCisgICAgdSdcdTAzYjgnICAgIyAgMHg5QiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEEKKyAgICB1J1x1MDNiOScgICAjICAweDlDIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBCisgICAgdSdcdTAzYmEnICAgIyAgMHg5RCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgS0FQUEEKKyAgICB1J1x1MDNiYicgICAjICAweDlFIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQorICAgIHUnXHUwM2JjJyAgICMgIDB4OUYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE1VCisgICAgdSdceGI0JyAgICAgIyAgMHhBMCAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J34nICAgICAgICAjICAweEExIC0+IFRJTERFCisgICAgdSdzJyAgICAgICAgIyAgMHhBMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4QTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweEE0IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHhBNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4QTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweEE3IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHhBOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4QTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J1x1MDNiZCcgICAjICAweEFBIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBOVQorICAgIHUnXHUwM2JlJyAgICMgIDB4QUIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFhJCisgICAgdSdcdTAzYmYnICAgIyAgMHhBQyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgorICAgIHUnXHUwM2MwJyAgICMgIDB4QUQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgdSdcdTAzYzEnICAgIyAgMHhBRSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUkhPCisgICAgdSdcdTAzYzMnICAgIyAgMHhBRiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICB1J1x4YTMnICAgICAjICAweEIwIC0+IFBPVU5EIFNJR04KKyAgICB1J1x1MDNhYycgICAjICAweEIxIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzYWQnICAgIyAgMHhCMiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzYWUnICAgIyAgMHhCMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICB1J1x1MDNjYScgICAjICAweEI0IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzYWYnICAgIyAgMHhCNSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2MnICAgIyAgMHhCNiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2QnICAgIyAgMHhCNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2InICAgIyAgMHhCOCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwM2NlJyAgICMgIDB4QjkgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICB1J1x1MDNjMicgICAjICAweEJBIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBGSU5BTCBTSUdNQQorICAgIHUnXHUwM2M0JyAgICMgIDB4QkIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIHUnXHUwM2M1JyAgICMgIDB4QkMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04KKyAgICB1J1x1MDNjNicgICAjICAweEJEIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICB1J1x1MDNjNycgICAjICAweEJFIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBDSEkKKyAgICB1J1x1MDNjOCcgICAjICAweEJGIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQU0kKKyAgICB1J3snICAgICAgICAjICAweEMwIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnQScgICAgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4QzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4QzkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnXHhhZCcgICAgICMgIDB4Q0EgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x1MDNjOScgICAjICAweENCIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwMzkwJyAgICMgIDB4Q0MgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TCisgICAgdSdcdTAzYjAnICAgIyAgMHhDRCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQSBBTkQgVE9OT1MKKyAgICB1J1x1MjAxOCcgICAjICAweENFIC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTUnICAgIyAgMHhDRiAtPiBIT1JJWk9OVEFMIEJBUgorICAgIHUnfScgICAgICAgICMgIDB4RDAgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnSicgICAgICAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4RDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4RDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4RDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnXHhiMScgICAgICMgIDB4REEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdceGJkJyAgICAgIyAgMHhEQiAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4MWEnICAgICAjICAweERDIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x1MDM4NycgICAjICAweEREIC0+IEdSRUVLIEFOTyBURUxFSUEKKyAgICB1J1x1MjAxOScgICAjICAweERFIC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhNicgICAgICMgIDB4REYgLT4gQlJPS0VOIEJBUgorICAgIHUnXFwnICAgICAgICMgIDB4RTAgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSdceDFhJyAgICAgIyAgMHhFMSAtPiBTVUJTVElUVVRFCisgICAgdSdTJyAgICAgICAgIyAgMHhFMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHhFMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHhFNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHhFNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHhFNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHhFNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHhFOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHhFOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdceGIyJyAgICAgIyAgMHhFQSAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4YTcnICAgICAjICAweEVCIC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHgxYScgICAgICMgIDB4RUMgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYScgICAgICMgIDB4RUQgLT4gU1VCU1RJVFVURQorICAgIHUnXHhhYicgICAgICMgIDB4RUUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEVGIC0+IE5PVCBTSUdOCisgICAgdScwJyAgICAgICAgIyAgMHhGMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHhGMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweEYyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4RjMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweEY0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweEY1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweEY2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4RjcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweEY4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHhGOSAtPiBESUdJVCBOSU5FCisgICAgdSdceGIzJyAgICAgIyAgMHhGQSAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhhOScgICAgICMgIDB4RkIgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4MWEnICAgICAjICAweEZDIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWEnICAgICAjICAweEZEIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4YmInICAgICAjICAweEZFIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHg5ZicgICAgICMgIDB4RkYgLT4gQ09OVFJPTAorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzUucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYmUxMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg3NS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzUucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYmUxMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg3NS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5MzIucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDkzMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDFmNTliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5MzIucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBjcDkzMi5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIENQOTMyCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ2NwOTMyJykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwOTMyJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5MzIucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5MzIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNmIwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDkzMi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5MzIucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5MzIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNmIwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDkzMi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5NDkucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk0OS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjdjODcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5NDkucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBjcDk0OS5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIENQOTQ5CisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19rciwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3Nfa3IuZ2V0Y29kZWMoJ2NwOTQ5JykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwOTQ5JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5NDkucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5NDkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzRiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk0OS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5NDkucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5NDkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MzRiNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk0OS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5NTAucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk1MC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWVlYzVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5NTAucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBjcDk1MC5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIENQOTUwCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc190dywgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfdHcuZ2V0Y29kZWMoJ2NwOTUwJykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwOTUwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5NTAucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5NTAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOTRhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk1MC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5NTAucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A5NTAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOTRhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk1MC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2ppc18yMDA0LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2ppc18yMDA0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYjg3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBldWNfamlzXzIwMDQucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBFVUNfSklTXzIwMDQKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2pwLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19qcC5nZXRjb2RlYygnZXVjX2ppc18yMDA0JykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2V1Y19qaXNfMjAwNCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qaXNfMjAwNC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwODY1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qaXNfMjAwNC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwODY1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qaXN4MDIxMy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qaXN4MDIxMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzQ3ZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2ppc3gwMjEzLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgZXVjX2ppc3gwMjEzLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgRVVDX0pJU1gwMjEzCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ2V1Y19qaXN4MDIxMycpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdldWNfamlzeDAyMTMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2ppc3gwMjEzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjljYjQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2ppc3gwMjEzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2ppc3gwMjEzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjljYjQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2ppc3gwMjEzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfanAucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfanAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjYmU0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qcC5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIGV1Y19qcC5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEVVQ19KUAorIworIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KKyMKKworaW1wb3J0IF9jb2RlY3NfanAsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2pwLmdldGNvZGVjKCdldWNfanAnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nZXVjX2pwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2pwLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjMzFiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2pwLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjMzFiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2tyLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2tyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZmIxMjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfa3IucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBldWNfa3IucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBFVUNfS1IKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2tyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19rci5nZXRjb2RlYygnZXVjX2tyJykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2V1Y19rcicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19rci5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfa3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMGEzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfa3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19rci5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfa3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMGEzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfa3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diMTgwMzAucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjE4MDMwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZmI2YzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjE4MDMwLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgZ2IxODAzMC5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEdCMTgwMzAKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2NuLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19jbi5nZXRjb2RlYygnZ2IxODAzMCcpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdnYjE4MDMwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2IxODAzMC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjE4MDMwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTA4MTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2IxODAzMC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2IxODAzMC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjE4MDMwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTA4MTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2IxODAzMC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2IyMzEyLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2IyMzEyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjM2I4MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjIzMTIucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBnYjIzMTIucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBHQjIzMTIKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2NuLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19jbi5nZXRjb2RlYygnZ2IyMzEyJykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2diMjMxMicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diMjMxMi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjIzMTIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTc3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjIzMTIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diMjMxMi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjIzMTIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTc3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjIzMTIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diay5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjQ1ZGI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2JrLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgZ2JrLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgR0JLCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19jbiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfY24uZ2V0Y29kZWMoJ2diaycpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdnYmsnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYmsucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2JrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzJiYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2JrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYmsucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2JrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzJiYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2JrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9oZXhfY29kZWMucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9oZXhfY29kZWMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFiMzhkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hleF9jb2RlYy5weQpAQCAtMCwwICsxLDc5IEBACisiIiIgUHl0aG9uICdoZXhfY29kZWMnIENvZGVjIC0gMi1kaWdpdCBoZXggY29udGVudCB0cmFuc2ZlciBlbmNvZGluZworCisgICAgVW5saWtlIG1vc3Qgb2YgdGhlIG90aGVyIGNvZGVjcyB3aGljaCB0YXJnZXQgVW5pY29kZSwgdGhpcyBjb2RlYworICAgIHdpbGwgcmV0dXJuIFB5dGhvbiBzdHJpbmcgb2JqZWN0cyBmb3IgYm90aCBlbmNvZGUgYW5kIGRlY29kZS4KKworICAgIFdyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisiIiIKK2ltcG9ydCBjb2RlY3MsIGJpbmFzY2lpCisKKyMjIyBDb2RlYyBBUElzCisKK2RlZiBoZXhfZW5jb2RlKGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAiIiIgRW5jb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAorICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCisKKyAgICAgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bworICAgICAgICAnc3RyaWN0JyBoYW5kbGluZyB3aGljaCBpcyB0aGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgorCisgICAgIiIiCisgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgIG91dHB1dCA9IGJpbmFzY2lpLmIyYV9oZXgoaW5wdXQpCisgICAgcmV0dXJuIChvdXRwdXQsIGxlbihpbnB1dCkpCisKK2RlZiBoZXhfZGVjb2RlKGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAiIiIgRGVjb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAorICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCisKKyAgICAgICAgaW5wdXQgbXVzdCBiZSBhbiBvYmplY3Qgd2hpY2ggcHJvdmlkZXMgdGhlIGJmX2dldHJlYWRidWYKKyAgICAgICAgYnVmZmVyIHNsb3QuIFB5dGhvbiBzdHJpbmdzLCBidWZmZXIgb2JqZWN0cyBhbmQgbWVtb3J5CisgICAgICAgIG1hcHBlZCBmaWxlcyBhcmUgZXhhbXBsZXMgb2Ygb2JqZWN0cyBwcm92aWRpbmcgdGhpcyBzbG90LgorCisgICAgICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KKyAgICAgICAgJ3N0cmljdCcgaGFuZGxpbmcgd2hpY2ggaXMgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZAorICAgICAgICBlcnJvciBoYW5kbGluZyBmb3IgdGhpcyBjb2RlYy4KKworICAgICIiIgorICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKKyAgICBvdXRwdXQgPSBiaW5hc2NpaS5hMmJfaGV4KGlucHV0KQorICAgIHJldHVybiAob3V0cHV0LCBsZW4oaW5wdXQpKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gaGV4X2VuY29kZShpbnB1dCxlcnJvcnMpCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gaGV4X2RlY29kZShpbnB1dCxlcnJvcnMpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIGFzc2VydCBzZWxmLmVycm9ycyA9PSAnc3RyaWN0JworICAgICAgICByZXR1cm4gYmluYXNjaWkuYjJhX2hleChpbnB1dCkKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuZXJyb3JzID09ICdzdHJpY3QnCisgICAgICAgIHJldHVybiBiaW5hc2NpaS5hMmJfaGV4KGlucHV0KQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2hleCcsCisgICAgICAgIGVuY29kZT1oZXhfZW5jb2RlLAorICAgICAgICBkZWNvZGU9aGV4X2RlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9oZXhfY29kZWMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaGV4X2NvZGVjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGMwZDRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaGV4X2NvZGVjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9oZXhfY29kZWMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaGV4X2NvZGVjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTE3YWIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaGV4X2NvZGVjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ocF9yb21hbjgucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ocF9yb21hbjgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJhYWE3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hwX3JvbWFuOC5weQpAQCAtMCwwICsxLDE1MiBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBnZW5lcmF0ZWQgZnJvbSAnaHBfcm9tYW44LnR4dCcgd2l0aCBnZW5jb2RlYy5weS4KKworICAgIEJhc2VkIG9uIGRhdGEgZnJvbSBmdHA6Ly9ka3V1Zy5kay9pMThuL2NoYXJtYXBzL0hQLVJPTUFOOCAoS2VsZCBTaW1vbnNlbikKKworICAgIE9yaWdpbmFsIHNvdXJjZTogTGFzZXJKZXQgSUlQIFByaW50ZXIgVXNlcidzIE1hbnVhbCBIUCBwYXJ0IG5vCisgICAgMzM0NzEtOTA5MDEsIEhld2xldC1QYWNrYXJkLCBKdW5lIDE5ODkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfbWFwKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ19tYXApWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naHAtcm9tYW44JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgICAgICAweDAwYTE6IDB4MDBjMCwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAgICAgMHgwMGEyOiAweDAwYzIsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAgICAgMHgwMGEzOiAweDAwYzgsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgICAgIDB4MDBhNDogMHgwMGNhLCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgICAgIDB4MDBhNTogMHgwMGNiLCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAgICAgMHgwMGE2OiAweDAwY2UsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAgICAgMHgwMGE3OiAweDAwY2YsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgICAgICAweDAwYTg6IDB4MDBiNCwgIyAgICAgICBBQ1VURSBBQ0NFTlQKKyAgICAgICAgMHgwMGE5OiAweDAyY2IsICMgICAgICAgTU9ESUZJRVIgTEVUVEVSIEdSQVZFIEFDQ0VOVCAoTWFuZGFyaW4gQ2hpbmVzZSBmb3VydGggdG9uZSkKKyAgICAgICAgMHgwMGFhOiAweDAyYzYsICMgICAgICAgTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UCisgICAgICAgIDB4MDBhYjogMHgwMGE4LCAjICAgICAgIERJQUVSRVNJUworICAgICAgICAweDAwYWM6IDB4MDJkYywgIyAgICAgICBTTUFMTCBUSUxERQorICAgICAgICAweDAwYWQ6IDB4MDBkOSwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAgICAgMHgwMGFlOiAweDAwZGIsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAgICAgMHgwMGFmOiAweDIwYTQsICMgICAgICAgTElSQSBTSUdOCisgICAgICAgIDB4MDBiMDogMHgwMGFmLCAjICAgICAgIE1BQ1JPTgorICAgICAgICAweDAwYjE6IDB4MDBkZCwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGIyOiAweDAwZmQsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgICAgICAweDAwYjM6IDB4MDBiMCwgIyAgICAgICBERUdSRUUgU0lHTgorICAgICAgICAweDAwYjQ6IDB4MDBjNywgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgICAgICAweDAwYjU6IDB4MDBlNywgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAgICAgMHgwMGI2OiAweDAwZDEsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgICAgIDB4MDBiNzogMHgwMGYxLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAgICAgMHgwMGI4OiAweDAwYTEsICMgICAgICAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgICAgICAweDAwYjk6IDB4MDBiZiwgIyAgICAgICBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgICAgIDB4MDBiYTogMHgwMGE0LCAjICAgICAgIENVUlJFTkNZIFNJR04KKyAgICAgICAgMHgwMGJiOiAweDAwYTMsICMgICAgICAgUE9VTkQgU0lHTgorICAgICAgICAweDAwYmM6IDB4MDBhNSwgIyAgICAgICBZRU4gU0lHTgorICAgICAgICAweDAwYmQ6IDB4MDBhNywgIyAgICAgICBTRUNUSU9OIFNJR04KKyAgICAgICAgMHgwMGJlOiAweDAxOTIsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgICAgIDB4MDBiZjogMHgwMGEyLCAjICAgICAgIENFTlQgU0lHTgorICAgICAgICAweDAwYzA6IDB4MDBlMiwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAgICAgMHgwMGMxOiAweDAwZWEsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgICAgIDB4MDBjMjogMHgwMGY0LCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgICAgICAweDAwYzM6IDB4MDBmYiwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAgICAgMHgwMGM0OiAweDAwZTEsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgICAgICAweDAwYzU6IDB4MDBlOSwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBjNjogMHgwMGYzLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGM3OiAweDAwZmEsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgICAgICAweDAwYzg6IDB4MDBlMCwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgICAgIDB4MDBjOTogMHgwMGU4LCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICAgICAgMHgwMGNhOiAweDAwZjIsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgICAgICAweDAwY2I6IDB4MDBmOSwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgICAgIDB4MDBjYzogMHgwMGU0LCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDBjZDogMHgwMGViLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDBjZTogMHgwMGY2LCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDBjZjogMHgwMGZjLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDBkMDogMHgwMGM1LCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgICAgIDB4MDBkMTogMHgwMGVlLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgICAgICAweDAwZDI6IDB4MDBkOCwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgICAgIDB4MDBkMzogMHgwMGM2LCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgICAgIDB4MDBkNDogMHgwMGU1LCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgICAgICAweDAwZDU6IDB4MDBlZCwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBkNjogMHgwMGY4LCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgICAgIDB4MDBkNzogMHgwMGU2LCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBBRQorICAgICAgICAweDAwZDg6IDB4MDBjNCwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDBkOTogMHgwMGVjLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICAgICAgMHgwMGRhOiAweDAwZDYsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgICAgICAweDAwZGI6IDB4MDBkYywgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDBkYzogMHgwMGM5LCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgICAgICAweDAwZGQ6IDB4MDBlZiwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgICAgICAweDAwZGU6IDB4MDBkZiwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAoR2VybWFuKQorICAgICAgICAweDAwZGY6IDB4MDBkNCwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgICAgICAweDAwZTA6IDB4MDBjMSwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGUxOiAweDAwYzMsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgICAgIDB4MDBlMjogMHgwMGUzLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAgICAgMHgwMGUzOiAweDAwZDAsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRIIChJY2VsYW5kaWMpCisgICAgICAgIDB4MDBlNDogMHgwMGYwLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBFVEggKEljZWxhbmRpYykKKyAgICAgICAgMHgwMGU1OiAweDAwY2QsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBlNjogMHgwMGNjLCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgICAgICAweDAwZTc6IDB4MDBkMywgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGU4OiAweDAwZDIsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgICAgIDB4MDBlOTogMHgwMGQ1LCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgICAgICAweDAwZWE6IDB4MDBmNSwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgICAgIDB4MDBlYjogMHgwMTYwLCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgICAgICAweDAwZWM6IDB4MDE2MSwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgICAgIDB4MDBlZDogMHgwMGRhLCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgICAgICAweDAwZWU6IDB4MDE3OCwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDBlZjogMHgwMGZmLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDBmMDogMHgwMGRlLCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOIChJY2VsYW5kaWMpCisgICAgICAgIDB4MDBmMTogMHgwMGZlLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBUSE9STiAoSWNlbGFuZGljKQorICAgICAgICAweDAwZjI6IDB4MDBiNywgIyAgICAgICBNSURETEUgRE9UCisgICAgICAgIDB4MDBmMzogMHgwMGI1LCAjICAgICAgIE1JQ1JPIFNJR04KKyAgICAgICAgMHgwMGY0OiAweDAwYjYsICMgICAgICAgUElMQ1JPVyBTSUdOCisgICAgICAgIDB4MDBmNTogMHgwMGJlLCAjICAgICAgIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgICAgICAweDAwZjY6IDB4MjAxNCwgIyAgICAgICBFTSBEQVNICisgICAgICAgIDB4MDBmNzogMHgwMGJjLCAjICAgICAgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgICAgICAweDAwZjg6IDB4MDBiZCwgIyAgICAgICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAgICAgMHgwMGY5OiAweDAwYWEsICMgICAgICAgRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAgICAgMHgwMGZhOiAweDAwYmEsICMgICAgICAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgICAgIDB4MDBmYjogMHgwMGFiLCAjICAgICAgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDBmYzogMHgyNWEwLCAjICAgICAgIEJMQUNLIFNRVUFSRQorICAgICAgICAweDAwZmQ6IDB4MDBiYiwgIyAgICAgICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMGZlOiAweDAwYjEsICMgICAgICAgUExVUy1NSU5VUyBTSUdOCisgICAgICAgIDB4MDBmZjogTm9uZSwKK30pCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfZW5jb2RpbmdfbWFwKGRlY29kaW5nX21hcCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hwX3JvbWFuOC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ocF9yb21hbjgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZTVlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ocF9yb21hbjgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hwX3JvbWFuOC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ocF9yb21hbjgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZTVlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ocF9yb21hbjgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2h6LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaHoucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgzNDQyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2h6LnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgaHoucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBIWgorIworIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KKyMKKworaW1wb3J0IF9jb2RlY3NfY24sIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2NuLmdldGNvZGVjKCdoeicpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdoeicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2h6LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2h6LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmIxZWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaHoucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2h6LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2h6LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmIxZWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaHoucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lkbmEucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pZG5hLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOTBkNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pZG5hLnB5CkBAIC0wLDAgKzEsMjg4IEBACisjIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIFJGQ3MgMzQ5MCAoSUROQSkgYW5kIDM0OTEgKE5hbWVwcmVwKQorCitpbXBvcnQgc3RyaW5ncHJlcCwgcmUsIGNvZGVjcworZnJvbSB1bmljb2RlZGF0YSBpbXBvcnQgdWNkXzNfMl8wIGFzIHVuaWNvZGVkYXRhCisKKyMgSUROQSBzZWN0aW9uIDMuMQorZG90cyA9IHJlLmNvbXBpbGUodSJbXHUwMDJFXHUzMDAyXHVGRjBFXHVGRjYxXSIpCisKKyMgSUROQSBzZWN0aW9uIDUKK2FjZV9wcmVmaXggPSAieG4tLSIKK3VhY2VfcHJlZml4ID0gdW5pY29kZShhY2VfcHJlZml4LCAiYXNjaWkiKQorCisjIFRoaXMgYXNzdW1lcyBxdWVyeSBzdHJpbmdzLCBzbyBBbGxvd1VuYXNzaWduZWQgaXMgdHJ1ZQorZGVmIG5hbWVwcmVwKGxhYmVsKToKKyAgICAjIE1hcAorICAgIG5ld2xhYmVsID0gW10KKyAgICBmb3IgYyBpbiBsYWJlbDoKKyAgICAgICAgaWYgc3RyaW5ncHJlcC5pbl90YWJsZV9iMShjKToKKyAgICAgICAgICAgICMgTWFwIHRvIG5vdGhpbmcKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG5ld2xhYmVsLmFwcGVuZChzdHJpbmdwcmVwLm1hcF90YWJsZV9iMihjKSkKKyAgICBsYWJlbCA9IHUiIi5qb2luKG5ld2xhYmVsKQorCisgICAgIyBOb3JtYWxpemUKKyAgICBsYWJlbCA9IHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgiTkZLQyIsIGxhYmVsKQorCisgICAgIyBQcm9oaWJpdAorICAgIGZvciBjIGluIGxhYmVsOgorICAgICAgICBpZiBzdHJpbmdwcmVwLmluX3RhYmxlX2MxMihjKSBvciBcCisgICAgICAgICAgIHN0cmluZ3ByZXAuaW5fdGFibGVfYzIyKGMpIG9yIFwKKyAgICAgICAgICAgc3RyaW5ncHJlcC5pbl90YWJsZV9jMyhjKSBvciBcCisgICAgICAgICAgIHN0cmluZ3ByZXAuaW5fdGFibGVfYzQoYykgb3IgXAorICAgICAgICAgICBzdHJpbmdwcmVwLmluX3RhYmxlX2M1KGMpIG9yIFwKKyAgICAgICAgICAgc3RyaW5ncHJlcC5pbl90YWJsZV9jNihjKSBvciBcCisgICAgICAgICAgIHN0cmluZ3ByZXAuaW5fdGFibGVfYzcoYykgb3IgXAorICAgICAgICAgICBzdHJpbmdwcmVwLmluX3RhYmxlX2M4KGMpIG9yIFwKKyAgICAgICAgICAgc3RyaW5ncHJlcC5pbl90YWJsZV9jOShjKToKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgJXIiICUgYykKKworICAgICMgQ2hlY2sgYmlkaQorICAgIFJhbmRBTCA9IG1hcChzdHJpbmdwcmVwLmluX3RhYmxlX2QxLCBsYWJlbCkKKyAgICBmb3IgYyBpbiBSYW5kQUw6CisgICAgICAgIGlmIGM6CisgICAgICAgICAgICAjIFRoZXJlIGlzIGEgUmFuZEFMIGNoYXIgaW4gdGhlIHN0cmluZy4gTXVzdCBwZXJmb3JtIGZ1cnRoZXIKKyAgICAgICAgICAgICMgdGVzdHM6CisgICAgICAgICAgICAjIDEpIFRoZSBjaGFyYWN0ZXJzIGluIHNlY3Rpb24gNS44IE1VU1QgYmUgcHJvaGliaXRlZC4KKyAgICAgICAgICAgICMgVGhpcyBpcyB0YWJsZSBDLjgsIHdoaWNoIHdhcyBhbHJlYWR5IGNoZWNrZWQKKyAgICAgICAgICAgICMgMikgSWYgYSBzdHJpbmcgY29udGFpbnMgYW55IFJhbmRBTENhdCBjaGFyYWN0ZXIsIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICMgTVVTVCBOT1QgY29udGFpbiBhbnkgTENhdCBjaGFyYWN0ZXIuCisgICAgICAgICAgICBpZiBmaWx0ZXIoc3RyaW5ncHJlcC5pbl90YWJsZV9kMiwgbGFiZWwpOgorICAgICAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiVmlvbGF0aW9uIG9mIEJJREkgcmVxdWlyZW1lbnQgMiIpCisKKyAgICAgICAgICAgICMgMykgSWYgYSBzdHJpbmcgY29udGFpbnMgYW55IFJhbmRBTENhdCBjaGFyYWN0ZXIsIGEKKyAgICAgICAgICAgICMgUmFuZEFMQ2F0IGNoYXJhY3RlciBNVVNUIGJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlCisgICAgICAgICAgICAjIHN0cmluZywgYW5kIGEgUmFuZEFMQ2F0IGNoYXJhY3RlciBNVVNUIGJlIHRoZSBsYXN0CisgICAgICAgICAgICAjIGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nLgorICAgICAgICAgICAgaWYgbm90IFJhbmRBTFswXSBvciBub3QgUmFuZEFMWy0xXToKKyAgICAgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlZpb2xhdGlvbiBvZiBCSURJIHJlcXVpcmVtZW50IDMiKQorCisgICAgcmV0dXJuIGxhYmVsCisKK2RlZiBUb0FTQ0lJKGxhYmVsKToKKyAgICB0cnk6CisgICAgICAgICMgU3RlcCAxOiB0cnkgQVNDSUkKKyAgICAgICAgbGFiZWwgPSBsYWJlbC5lbmNvZGUoImFzY2lpIikKKyAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgIyBTa2lwIHRvIHN0ZXAgMzogVXNlU1REM0FTQ0lJUnVsZXMgaXMgZmFsc2UsIHNvCisgICAgICAgICMgU2tpcCB0byBzdGVwIDguCisgICAgICAgIGlmIDAgPCBsZW4obGFiZWwpIDwgNjQ6CisgICAgICAgICAgICByZXR1cm4gbGFiZWwKKyAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJsYWJlbCBlbXB0eSBvciB0b28gbG9uZyIpCisKKyAgICAjIFN0ZXAgMjogbmFtZXByZXAKKyAgICBsYWJlbCA9IG5hbWVwcmVwKGxhYmVsKQorCisgICAgIyBTdGVwIDM6IFVzZVNURDNBU0NJSVJ1bGVzIGlzIGZhbHNlCisgICAgIyBTdGVwIDQ6IHRyeSBBU0NJSQorICAgIHRyeToKKyAgICAgICAgbGFiZWwgPSBsYWJlbC5lbmNvZGUoImFzY2lpIikKKyAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgIyBTa2lwIHRvIHN0ZXAgOC4KKyAgICAgICAgaWYgMCA8IGxlbihsYWJlbCkgPCA2NDoKKyAgICAgICAgICAgIHJldHVybiBsYWJlbAorICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoImxhYmVsIGVtcHR5IG9yIHRvbyBsb25nIikKKworICAgICMgU3RlcCA1OiBDaGVjayBBQ0UgcHJlZml4CisgICAgaWYgbGFiZWwuc3RhcnRzd2l0aCh1YWNlX3ByZWZpeCk6CisgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiTGFiZWwgc3RhcnRzIHdpdGggQUNFIHByZWZpeCIpCisKKyAgICAjIFN0ZXAgNjogRW5jb2RlIHdpdGggUFVOWUNPREUKKyAgICBsYWJlbCA9IGxhYmVsLmVuY29kZSgicHVueWNvZGUiKQorCisgICAgIyBTdGVwIDc6IFByZXBlbmQgQUNFIHByZWZpeAorICAgIGxhYmVsID0gYWNlX3ByZWZpeCArIGxhYmVsCisKKyAgICAjIFN0ZXAgODogQ2hlY2sgc2l6ZQorICAgIGlmIDAgPCBsZW4obGFiZWwpIDwgNjQ6CisgICAgICAgIHJldHVybiBsYWJlbAorICAgIHJhaXNlIFVuaWNvZGVFcnJvcigibGFiZWwgZW1wdHkgb3IgdG9vIGxvbmciKQorCitkZWYgVG9Vbmljb2RlKGxhYmVsKToKKyAgICAjIFN0ZXAgMTogQ2hlY2sgZm9yIEFTQ0lJCisgICAgaWYgaXNpbnN0YW5jZShsYWJlbCwgc3RyKToKKyAgICAgICAgcHVyZV9hc2NpaSA9IFRydWUKKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsYWJlbCA9IGxhYmVsLmVuY29kZSgiYXNjaWkiKQorICAgICAgICAgICAgcHVyZV9hc2NpaSA9IFRydWUKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHB1cmVfYXNjaWkgPSBGYWxzZQorICAgIGlmIG5vdCBwdXJlX2FzY2lpOgorICAgICAgICAjIFN0ZXAgMjogUGVyZm9ybSBuYW1lcHJlcAorICAgICAgICBsYWJlbCA9IG5hbWVwcmVwKGxhYmVsKQorICAgICAgICAjIEl0IGRvZXNuJ3Qgc2F5IHRoaXMsIGJ1dCBhcHBhcmVudGx5LCBpdCBzaG91bGQgYmUgQVNDSUkgbm93CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxhYmVsID0gbGFiZWwuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIkludmFsaWQgY2hhcmFjdGVyIGluIElETiBsYWJlbCIpCisgICAgIyBTdGVwIDM6IENoZWNrIGZvciBBQ0UgcHJlZml4CisgICAgaWYgbm90IGxhYmVsLnN0YXJ0c3dpdGgoYWNlX3ByZWZpeCk6CisgICAgICAgIHJldHVybiB1bmljb2RlKGxhYmVsLCAiYXNjaWkiKQorCisgICAgIyBTdGVwIDQ6IFJlbW92ZSBBQ0UgcHJlZml4CisgICAgbGFiZWwxID0gbGFiZWxbbGVuKGFjZV9wcmVmaXgpOl0KKworICAgICMgU3RlcCA1OiBEZWNvZGUgdXNpbmcgUFVOWUNPREUKKyAgICByZXN1bHQgPSBsYWJlbDEuZGVjb2RlKCJwdW55Y29kZSIpCisKKyAgICAjIFN0ZXAgNjogQXBwbHkgVG9BU0NJSQorICAgIGxhYmVsMiA9IFRvQVNDSUkocmVzdWx0KQorCisgICAgIyBTdGVwIDc6IENvbXBhcmUgdGhlIHJlc3VsdCBvZiBzdGVwIDYgd2l0aCB0aGUgb25lIG9mIHN0ZXAgMworICAgICMgbGFiZWwyIHdpbGwgYWxyZWFkeSBiZSBpbiBsb3dlciBjYXNlLgorICAgIGlmIGxhYmVsLmxvd2VyKCkgIT0gbGFiZWwyOgorICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIklETkEgZG9lcyBub3Qgcm91bmQtdHJpcCIsIGxhYmVsLCBsYWJlbDIpCisKKyAgICAjIFN0ZXAgODogcmV0dXJuIHRoZSByZXN1bHQgb2Ygc3RlcCA1CisgICAgcmV0dXJuIHJlc3VsdAorCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorCisgICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKKyAgICAgICAgICAgICMgSUROQSBpcyBxdWl0ZSBjbGVhciB0aGF0IGltcGxlbWVudGF0aW9ucyBtdXN0IGJlIHN0cmljdAorICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJ1bnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyAiK2Vycm9ycykKKworICAgICAgICBpZiBub3QgaW5wdXQ6CisgICAgICAgICAgICByZXR1cm4gIiIsIDAKKworICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBsYWJlbHMgPSBkb3RzLnNwbGl0KGlucHV0KQorICAgICAgICBpZiBsYWJlbHMgYW5kIGxlbihsYWJlbHNbLTFdKT09MDoKKyAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9ICcuJworICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9ICcnCisgICAgICAgIGZvciBsYWJlbCBpbiBsYWJlbHM6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKFRvQVNDSUkobGFiZWwpKQorICAgICAgICAjIEpvaW4gd2l0aCBVKzAwMkUKKyAgICAgICAgcmV0dXJuICIuIi5qb2luKHJlc3VsdCkrdHJhaWxpbmdfZG90LCBsZW4oaW5wdXQpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKworICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzKQorCisgICAgICAgIGlmIG5vdCBpbnB1dDoKKyAgICAgICAgICAgIHJldHVybiB1IiIsIDAKKworICAgICAgICAjIElETkEgYWxsb3dzIGRlY29kaW5nIHRvIG9wZXJhdGUgb24gVW5pY29kZSBzdHJpbmdzLCB0b28uCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5wdXQsIHVuaWNvZGUpOgorICAgICAgICAgICAgbGFiZWxzID0gZG90cy5zcGxpdChpbnB1dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgTXVzdCBiZSBBU0NJSSBzdHJpbmcKKyAgICAgICAgICAgIGlucHV0ID0gc3RyKGlucHV0KQorICAgICAgICAgICAgdW5pY29kZShpbnB1dCwgImFzY2lpIikKKyAgICAgICAgICAgIGxhYmVscyA9IGlucHV0LnNwbGl0KCIuIikKKworICAgICAgICBpZiBsYWJlbHMgYW5kIGxlbihsYWJlbHNbLTFdKSA9PSAwOgorICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gdScuJworICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnJworCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciBsYWJlbCBpbiBsYWJlbHM6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKFRvVW5pY29kZShsYWJlbCkpCisKKyAgICAgICAgcmV0dXJuIHUiLiIuam9pbihyZXN1bHQpK3RyYWlsaW5nX2RvdCwgbGVuKGlucHV0KQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgX2J1ZmZlcl9lbmNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycywgZmluYWwpOgorICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CisgICAgICAgICAgICAjIElETkEgaXMgcXVpdGUgY2xlYXIgdGhhdCBpbXBsZW1lbnRhdGlvbnMgbXVzdCBiZSBzdHJpY3QKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigidW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgIitlcnJvcnMpCisKKyAgICAgICAgaWYgbm90IGlucHV0OgorICAgICAgICAgICAgcmV0dXJuICgiIiwgMCkKKworICAgICAgICBsYWJlbHMgPSBkb3RzLnNwbGl0KGlucHV0KQorICAgICAgICB0cmFpbGluZ19kb3QgPSB1JycKKyAgICAgICAgaWYgbGFiZWxzOgorICAgICAgICAgICAgaWYgbm90IGxhYmVsc1stMV06CisgICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gJy4nCisgICAgICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KKyAgICAgICAgICAgIGVsaWYgbm90IGZpbmFsOgorICAgICAgICAgICAgICAgICMgS2VlcCBwb3RlbnRpYWxseSB1bmZpbmlzaGVkIGxhYmVsIHVudGlsIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQorICAgICAgICAgICAgICAgIGlmIGxhYmVsczoKKyAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gJy4nCisKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgc2l6ZSA9IDAKKyAgICAgICAgZm9yIGxhYmVsIGluIGxhYmVsczoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoVG9BU0NJSShsYWJlbCkpCisgICAgICAgICAgICBpZiBzaXplOgorICAgICAgICAgICAgICAgIHNpemUgKz0gMQorICAgICAgICAgICAgc2l6ZSArPSBsZW4obGFiZWwpCisKKyAgICAgICAgIyBKb2luIHdpdGggVSswMDJFCisgICAgICAgIHJlc3VsdCA9ICIuIi5qb2luKHJlc3VsdCkgKyB0cmFpbGluZ19kb3QKKyAgICAgICAgc2l6ZSArPSBsZW4odHJhaWxpbmdfZG90KQorICAgICAgICByZXR1cm4gKHJlc3VsdCwgc2l6ZSkKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIF9idWZmZXJfZGVjb2RlKHNlbGYsIGlucHV0LCBlcnJvcnMsIGZpbmFsKToKKyAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgorICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJVbnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyAiK2Vycm9ycykKKworICAgICAgICBpZiBub3QgaW5wdXQ6CisgICAgICAgICAgICByZXR1cm4gKHUiIiwgMCkKKworICAgICAgICAjIElETkEgYWxsb3dzIGRlY29kaW5nIHRvIG9wZXJhdGUgb24gVW5pY29kZSBzdHJpbmdzLCB0b28uCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5wdXQsIHVuaWNvZGUpOgorICAgICAgICAgICAgbGFiZWxzID0gZG90cy5zcGxpdChpbnB1dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgTXVzdCBiZSBBU0NJSSBzdHJpbmcKKyAgICAgICAgICAgIGlucHV0ID0gc3RyKGlucHV0KQorICAgICAgICAgICAgdW5pY29kZShpbnB1dCwgImFzY2lpIikKKyAgICAgICAgICAgIGxhYmVscyA9IGlucHV0LnNwbGl0KCIuIikKKworICAgICAgICB0cmFpbGluZ19kb3QgPSB1JycKKyAgICAgICAgaWYgbGFiZWxzOgorICAgICAgICAgICAgaWYgbm90IGxhYmVsc1stMV06CisgICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gdScuJworICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCisgICAgICAgICAgICBlbGlmIG5vdCBmaW5hbDoKKyAgICAgICAgICAgICAgICAjIEtlZXAgcG90ZW50aWFsbHkgdW5maW5pc2hlZCBsYWJlbCB1bnRpbCB0aGUgbmV4dCBjYWxsCisgICAgICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KKyAgICAgICAgICAgICAgICBpZiBsYWJlbHM6CisgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnLicKKworICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBzaXplID0gMAorICAgICAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChUb1VuaWNvZGUobGFiZWwpKQorICAgICAgICAgICAgaWYgc2l6ZToKKyAgICAgICAgICAgICAgICBzaXplICs9IDEKKyAgICAgICAgICAgIHNpemUgKz0gbGVuKGxhYmVsKQorCisgICAgICAgIHJlc3VsdCA9IHUiLiIuam9pbihyZXN1bHQpICsgdHJhaWxpbmdfZG90CisgICAgICAgIHNpemUgKz0gbGVuKHRyYWlsaW5nX2RvdCkKKyAgICAgICAgcmV0dXJuIChyZXN1bHQsIHNpemUpCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naWRuYScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lkbmEucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaWRuYS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwMDM2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lkbmEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lkbmEucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaWRuYS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwMDM2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lkbmEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanAucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMDQwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgaXNvMjAyMl9qcC5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIElTTzIwMjJfSlAKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2lzbzIwMjIsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2lzbzIwMjIuZ2V0Y29kZWMoJ2lzbzIwMjJfanAnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvMjAyMl9qcCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanAucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwYjcxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanAucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwYjcxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTcwNDRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgaXNvMjAyMl9qcF8xLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSVNPMjAyMl9KUF8xCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19pc28yMDIyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19pc28yMDIyLmdldGNvZGVjKCdpc28yMDIyX2pwXzEnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvMjAyMl9qcF8xJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiMDk4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiMDk4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMDZiZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBpc28yMDIyX2pwXzIucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBJU08yMDIyX0pQXzIKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2lzbzIwMjIsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2lzbzIwMjIuZ2V0Y29kZWMoJ2lzbzIwMjJfanBfMicpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc28yMDIyX2pwXzInLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmQ2Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmQ2Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAxOThiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMjAwNC5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIGlzbzIwMjJfanBfMjAwNC5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIElTTzIwMjJfSlBfMjAwNAorIworIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KKyMKKworaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9qcF8yMDA0JykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzIwMjJfanBfMjAwNCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMjAwNC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDY1YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMjAwNC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDY1YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDZlMDhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgaXNvMjAyMl9qcF8zLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSVNPMjAyMl9KUF8zCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19pc28yMDIyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19pc28yMDIyLmdldGNvZGVjKCdpc28yMDIyX2pwXzMnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvMjAyMl9qcF8zJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2ZGZlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ2ZGZlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF9leHQucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwX2V4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTJiYWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF9leHQucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBpc28yMDIyX2pwX2V4dC5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIElTTzIwMjJfSlBfRVhUCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19pc28yMDIyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19pc28yMDIyLmdldGNvZGVjKCdpc28yMDIyX2pwX2V4dCcpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc28yMDIyX2pwX2V4dCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfZXh0LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfZXh0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTkzZjlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF9leHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfZXh0LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfZXh0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTkzZjlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF9leHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfa3IucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2tyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNzAxODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2tyLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgaXNvMjAyMl9rci5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIElTTzIwMjJfS1IKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2lzbzIwMjIsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2lzbzIwMjIuZ2V0Y29kZWMoJ2lzbzIwMjJfa3InKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvMjAyMl9rcicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfa3IucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9rci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4Yjc1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfa3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfa3IucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9rci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4Yjc1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfa3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWJjMTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGlzbzg4NTlfMSBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvSVNPODg1OS84ODU5LTEuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvODg1OS0xJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBERUxFVEUKKyAgICB1J1x4ODAnICAgICAjICAweDgwIC0+IDxjb250cm9sPgorICAgIHUnXHg4MScgICAgICMgIDB4ODEgLT4gPGNvbnRyb2w+CisgICAgdSdceDgyJyAgICAgIyAgMHg4MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODMnICAgICAjICAweDgzIC0+IDxjb250cm9sPgorICAgIHUnXHg4NCcgICAgICMgIDB4ODQgLT4gPGNvbnRyb2w+CisgICAgdSdceDg1JyAgICAgIyAgMHg4NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODYnICAgICAjICAweDg2IC0+IDxjb250cm9sPgorICAgIHUnXHg4NycgICAgICMgIDB4ODcgLT4gPGNvbnRyb2w+CisgICAgdSdceDg4JyAgICAgIyAgMHg4OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODknICAgICAjICAweDg5IC0+IDxjb250cm9sPgorICAgIHUnXHg4YScgICAgICMgIDB4OEEgLT4gPGNvbnRyb2w+CisgICAgdSdceDhiJyAgICAgIyAgMHg4QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGMnICAgICAjICAweDhDIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZCcgICAgICMgIDB4OEQgLT4gPGNvbnRyb2w+CisgICAgdSdceDhlJyAgICAgIyAgMHg4RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGYnICAgICAjICAweDhGIC0+IDxjb250cm9sPgorICAgIHUnXHg5MCcgICAgICMgIDB4OTAgLT4gPGNvbnRyb2w+CisgICAgdSdceDkxJyAgICAgIyAgMHg5MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTInICAgICAjICAweDkyIC0+IDxjb250cm9sPgorICAgIHUnXHg5MycgICAgICMgIDB4OTMgLT4gPGNvbnRyb2w+CisgICAgdSdceDk0JyAgICAgIyAgMHg5NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTUnICAgICAjICAweDk1IC0+IDxjb250cm9sPgorICAgIHUnXHg5NicgICAgICMgIDB4OTYgLT4gPGNvbnRyb2w+CisgICAgdSdceDk3JyAgICAgIyAgMHg5NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTgnICAgICAjICAweDk4IC0+IDxjb250cm9sPgorICAgIHUnXHg5OScgICAgICMgIDB4OTkgLT4gPGNvbnRyb2w+CisgICAgdSdceDlhJyAgICAgIyAgMHg5QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWInICAgICAjICAweDlCIC0+IDxjb250cm9sPgorICAgIHUnXHg5YycgICAgICMgIDB4OUMgLT4gPGNvbnRyb2w+CisgICAgdSdceDlkJyAgICAgIyAgMHg5RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWUnICAgICAjICAweDlFIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZicgICAgICMgIDB4OUYgLT4gPGNvbnRyb2w+CisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHhhMScgICAgICMgIDB4QTEgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhBNSAtPiBZRU4gU0lHTgorICAgIHUnXHhhNicgICAgICMgIDB4QTYgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhBOCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdceGFhJyAgICAgIyAgMHhBQSAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhhYicgICAgICMgIDB4QUIgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEFDIC0+IE5PVCBTSUdOCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhhZScgICAgICMgIDB4QUUgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGFmJyAgICAgIyAgMHhBRiAtPiBNQUNST04KKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjInICAgICAjICAweEIyIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiMycgICAgICMgIDB4QjMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4YjQnICAgICAjICAweEI0IC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdceGI4JyAgICAgIyAgMHhCOCAtPiBDRURJTExBCisgICAgdSdceGI5JyAgICAgIyAgMHhCOSAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x4YmEnICAgICAjICAweEJBIC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJjJyAgICAgIyAgMHhCQyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEJEIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QkUgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdceGJmJyAgICAgIyAgMHhCRiAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdceGMwJyAgICAgIyAgMHhDMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzEnICAgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMicgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzMnICAgICAjICAweEMzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhjNCcgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzYnICAgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgdSdceGM3JyAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhjOCcgICAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGM5JyAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4Y2EnICAgICAjICAweENBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNiJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4Y2QnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDAnICAgICAjICAweEQwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEVUSCAoSWNlbGFuZGljKQorICAgIHUnXHhkMScgICAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQyJyAgICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDUnICAgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhkNicgICAgICMgIDB4RDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkNycgICAgICMgIDB4RDcgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHhkOCcgICAgICMgIDB4RDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhkOScgICAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGRhJyAgICAgIyAgMHhEQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZGInICAgICAjICAweERCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGRjJyAgICAgIyAgMHhEQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRkJyAgICAgIyAgMHhERCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZGUnICAgICAjICAweERFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOIChJY2VsYW5kaWMpCisgICAgdSdceGRmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAoR2VybWFuKQorICAgIHUnXHhlMCcgICAgICMgIDB4RTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMScgICAgICMgIDB4RTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4RTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGUzJyAgICAgIyAgMHhFMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU0JyAgICAgIyAgMHhFNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlNScgICAgICMgIDB4RTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU2JyAgICAgIyAgMHhFNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x4ZTcnICAgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOCcgICAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlOScgICAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlYScgICAgICMgIDB4RUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlYycgICAgICMgIDB4RUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhlZCcgICAgICMgIDB4RUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4RUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHhFRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMCcgICAgICMgIDB4RjAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEVUSCAoSWNlbGFuZGljKQorICAgIHUnXHhmMScgICAgICMgIDB4RjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhmMicgICAgICMgIDB4RjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmMycgICAgICMgIDB4RjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmNCcgICAgICMgIDB4RjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY1JyAgICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4RjcgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHhmOCcgICAgICMgIDB4RjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4ZjknICAgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmEnICAgICAjICAweEZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZmInICAgICAjICAweEZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZmQnICAgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZmUnICAgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBUSE9STiAoSWNlbGFuZGljKQorICAgIHUnXHhmZicgICAgICMgIDB4RkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTExMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTExMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTAucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1N2U1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEwLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGlzbzg4NTlfMTAgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL0lTTzg4NTkvODg1OS0xMC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc284ODU5LTEwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBERUxFVEUKKyAgICB1J1x4ODAnICAgICAjICAweDgwIC0+IDxjb250cm9sPgorICAgIHUnXHg4MScgICAgICMgIDB4ODEgLT4gPGNvbnRyb2w+CisgICAgdSdceDgyJyAgICAgIyAgMHg4MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODMnICAgICAjICAweDgzIC0+IDxjb250cm9sPgorICAgIHUnXHg4NCcgICAgICMgIDB4ODQgLT4gPGNvbnRyb2w+CisgICAgdSdceDg1JyAgICAgIyAgMHg4NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODYnICAgICAjICAweDg2IC0+IDxjb250cm9sPgorICAgIHUnXHg4NycgICAgICMgIDB4ODcgLT4gPGNvbnRyb2w+CisgICAgdSdceDg4JyAgICAgIyAgMHg4OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODknICAgICAjICAweDg5IC0+IDxjb250cm9sPgorICAgIHUnXHg4YScgICAgICMgIDB4OEEgLT4gPGNvbnRyb2w+CisgICAgdSdceDhiJyAgICAgIyAgMHg4QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGMnICAgICAjICAweDhDIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZCcgICAgICMgIDB4OEQgLT4gPGNvbnRyb2w+CisgICAgdSdceDhlJyAgICAgIyAgMHg4RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGYnICAgICAjICAweDhGIC0+IDxjb250cm9sPgorICAgIHUnXHg5MCcgICAgICMgIDB4OTAgLT4gPGNvbnRyb2w+CisgICAgdSdceDkxJyAgICAgIyAgMHg5MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTInICAgICAjICAweDkyIC0+IDxjb250cm9sPgorICAgIHUnXHg5MycgICAgICMgIDB4OTMgLT4gPGNvbnRyb2w+CisgICAgdSdceDk0JyAgICAgIyAgMHg5NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTUnICAgICAjICAweDk1IC0+IDxjb250cm9sPgorICAgIHUnXHg5NicgICAgICMgIDB4OTYgLT4gPGNvbnRyb2w+CisgICAgdSdceDk3JyAgICAgIyAgMHg5NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTgnICAgICAjICAweDk4IC0+IDxjb250cm9sPgorICAgIHUnXHg5OScgICAgICMgIDB4OTkgLT4gPGNvbnRyb2w+CisgICAgdSdceDlhJyAgICAgIyAgMHg5QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWInICAgICAjICAweDlCIC0+IDxjb250cm9sPgorICAgIHUnXHg5YycgICAgICMgIDB4OUMgLT4gPGNvbnRyb2w+CisgICAgdSdceDlkJyAgICAgIyAgMHg5RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWUnICAgICAjICAweDlFIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZicgICAgICMgIDB4OUYgLT4gPGNvbnRyb2w+CisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUwMTA0JyAgICMgIDB4QTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIHUnXHUwMTEyJyAgICMgIDB4QTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTIyJyAgICMgIDB4QTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEyYScgICAjICAweEE0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICB1J1x1MDEyOCcgICAjICAweEE1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBUSUxERQorICAgIHUnXHUwMTM2JyAgICMgIDB4QTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICB1J1x4YTcnICAgICAjICAweEE3IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHUwMTNiJyAgICMgIDB4QTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICB1J1x1MDExMCcgICAjICAweEE5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE2MCcgICAjICAweEFBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUwMTY2JyAgICMgIDB4QUIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTdkJyAgICMgIDB4QUMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHUwMTZhJyAgICMgIDB4QUUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTRhJyAgICMgIDB4QUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRU5HCisgICAgdSdceGIwJyAgICAgIyAgMHhCMCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHUwMTA1JyAgICMgIDB4QjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDExMycgICAjICAweEIyIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMjMnICAgIyAgMHhCMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEyYicgICAjICAweEI0IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMjknICAgIyAgMHhCNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIFRJTERFCisgICAgdSdcdTAxMzcnICAgIyAgMHhCNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICB1J1x4YjcnICAgICAjICAweEI3IC0+IE1JRERMRSBET1QKKyAgICB1J1x1MDEzYycgICAjICAweEI4IC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTExJyAgICMgIDB4QjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE2MScgICAjICAweEJBIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MDE2NycgICAjICAweEJCIC0+IExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggU1RST0tFCisgICAgdSdcdTAxN2UnICAgIyAgMHhCQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTIwMTUnICAgIyAgMHhCRCAtPiBIT1JJWk9OVEFMIEJBUgorICAgIHUnXHUwMTZiJyAgICMgIDB4QkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICB1J1x1MDE0YicgICAjICAweEJGIC0+IExBVElOIFNNQUxMIExFVFRFUiBFTkcKKyAgICB1J1x1MDEwMCcgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICB1J1x4YzEnICAgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMicgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzMnICAgICAjICAweEMzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhjNCcgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzYnICAgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgdSdcdTAxMmUnICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMGMnICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTE4JyAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIHUnXHhjYicgICAgICMgIDB4Q0IgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTE2JyAgICMgIDB4Q0MgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorICAgIHUnXHhjZCcgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkMCcgICAgICMgIDB4RDAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRIIChJY2VsYW5kaWMpCisgICAgdSdcdTAxNDUnICAgIyAgMHhEMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTRjJyAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIE1BQ1JPTgorICAgIHUnXHhkMycgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ0JyAgICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkNScgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNjgnICAgIyAgMHhENyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggVElMREUKKyAgICB1J1x4ZDgnICAgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE3MicgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICB1J1x4ZGEnICAgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGQnICAgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhkZScgICAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVEhPUk4gKEljZWxhbmRpYykKKyAgICB1J1x4ZGYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHZXJtYW4pCisgICAgdSdcdTAxMDEnICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorICAgIHUnXHhlMScgICAgICMgIDB4RTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4RTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGUzJyAgICAgIyAgMHhFMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU0JyAgICAgIyAgMHhFNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlNScgICAgICMgIDB4RTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU2JyAgICAgIyAgMHhFNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x1MDEyZicgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMGQnICAgIyAgMHhFOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdceGU5JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdcdTAxMTknICAgIyAgMHhFQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIHUnXHhlYicgICAgICMgIDB4RUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDExNycgICAjICAweEVDIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGVkJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVlJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweEVGIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGYwJyAgICAgIyAgMHhGMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRVRIIChJY2VsYW5kaWMpCisgICAgdSdcdTAxNDYnICAgIyAgMHhGMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE0ZCcgICAjICAweEYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgdSdceGYzJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGY0JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjUnICAgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZjYnICAgICAjICAweEY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNjknICAgIyAgMHhGNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFRJTERFCisgICAgdSdceGY4JyAgICAgIyAgMHhGOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTczJyAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICB1J1x4ZmEnICAgICAjICAweEZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZmInICAgICAjICAweEZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZmQnICAgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZmUnICAgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBUSE9STiAoSWNlbGFuZGljKQorICAgIHUnXHUwMTM4JyAgICMgIDB4RkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEtSQQorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDA3ZTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDA3ZTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdlY2U4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTEucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV8xMSBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvSVNPODg1OS84ODU5LTExLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzg4NTktMTEnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTBlMDEnICAgIyAgMHhBMSAtPiBUSEFJIENIQVJBQ1RFUiBLTyBLQUkKKyAgICB1J1x1MGUwMicgICAjICAweEEyIC0+IFRIQUkgQ0hBUkFDVEVSIEtITyBLSEFJCisgICAgdSdcdTBlMDMnICAgIyAgMHhBMyAtPiBUSEFJIENIQVJBQ1RFUiBLSE8gS0hVQVQKKyAgICB1J1x1MGUwNCcgICAjICAweEE0IC0+IFRIQUkgQ0hBUkFDVEVSIEtITyBLSFdBSQorICAgIHUnXHUwZTA1JyAgICMgIDB4QTUgLT4gVEhBSSBDSEFSQUNURVIgS0hPIEtIT04KKyAgICB1J1x1MGUwNicgICAjICAweEE2IC0+IFRIQUkgQ0hBUkFDVEVSIEtITyBSQUtIQU5HCisgICAgdSdcdTBlMDcnICAgIyAgMHhBNyAtPiBUSEFJIENIQVJBQ1RFUiBOR08gTkdVCisgICAgdSdcdTBlMDgnICAgIyAgMHhBOCAtPiBUSEFJIENIQVJBQ1RFUiBDSE8gQ0hBTgorICAgIHUnXHUwZTA5JyAgICMgIDB4QTkgLT4gVEhBSSBDSEFSQUNURVIgQ0hPIENISU5HCisgICAgdSdcdTBlMGEnICAgIyAgMHhBQSAtPiBUSEFJIENIQVJBQ1RFUiBDSE8gQ0hBTkcKKyAgICB1J1x1MGUwYicgICAjICAweEFCIC0+IFRIQUkgQ0hBUkFDVEVSIFNPIFNPCisgICAgdSdcdTBlMGMnICAgIyAgMHhBQyAtPiBUSEFJIENIQVJBQ1RFUiBDSE8gQ0hPRQorICAgIHUnXHUwZTBkJyAgICMgIDB4QUQgLT4gVEhBSSBDSEFSQUNURVIgWU8gWUlORworICAgIHUnXHUwZTBlJyAgICMgIDB4QUUgLT4gVEhBSSBDSEFSQUNURVIgRE8gQ0hBREEKKyAgICB1J1x1MGUwZicgICAjICAweEFGIC0+IFRIQUkgQ0hBUkFDVEVSIFRPIFBBVEFLCisgICAgdSdcdTBlMTAnICAgIyAgMHhCMCAtPiBUSEFJIENIQVJBQ1RFUiBUSE8gVEhBTgorICAgIHUnXHUwZTExJyAgICMgIDB4QjEgLT4gVEhBSSBDSEFSQUNURVIgVEhPIE5BTkdNT05USE8KKyAgICB1J1x1MGUxMicgICAjICAweEIyIC0+IFRIQUkgQ0hBUkFDVEVSIFRITyBQSFVUSEFPCisgICAgdSdcdTBlMTMnICAgIyAgMHhCMyAtPiBUSEFJIENIQVJBQ1RFUiBOTyBORU4KKyAgICB1J1x1MGUxNCcgICAjICAweEI0IC0+IFRIQUkgQ0hBUkFDVEVSIERPIERFSworICAgIHUnXHUwZTE1JyAgICMgIDB4QjUgLT4gVEhBSSBDSEFSQUNURVIgVE8gVEFPCisgICAgdSdcdTBlMTYnICAgIyAgMHhCNiAtPiBUSEFJIENIQVJBQ1RFUiBUSE8gVEhVTkcKKyAgICB1J1x1MGUxNycgICAjICAweEI3IC0+IFRIQUkgQ0hBUkFDVEVSIFRITyBUSEFIQU4KKyAgICB1J1x1MGUxOCcgICAjICAweEI4IC0+IFRIQUkgQ0hBUkFDVEVSIFRITyBUSE9ORworICAgIHUnXHUwZTE5JyAgICMgIDB4QjkgLT4gVEhBSSBDSEFSQUNURVIgTk8gTlUKKyAgICB1J1x1MGUxYScgICAjICAweEJBIC0+IFRIQUkgQ0hBUkFDVEVSIEJPIEJBSU1BSQorICAgIHUnXHUwZTFiJyAgICMgIDB4QkIgLT4gVEhBSSBDSEFSQUNURVIgUE8gUExBCisgICAgdSdcdTBlMWMnICAgIyAgMHhCQyAtPiBUSEFJIENIQVJBQ1RFUiBQSE8gUEhVTkcKKyAgICB1J1x1MGUxZCcgICAjICAweEJEIC0+IFRIQUkgQ0hBUkFDVEVSIEZPIEZBCisgICAgdSdcdTBlMWUnICAgIyAgMHhCRSAtPiBUSEFJIENIQVJBQ1RFUiBQSE8gUEhBTgorICAgIHUnXHUwZTFmJyAgICMgIDB4QkYgLT4gVEhBSSBDSEFSQUNURVIgRk8gRkFOCisgICAgdSdcdTBlMjAnICAgIyAgMHhDMCAtPiBUSEFJIENIQVJBQ1RFUiBQSE8gU0FNUEhBTworICAgIHUnXHUwZTIxJyAgICMgIDB4QzEgLT4gVEhBSSBDSEFSQUNURVIgTU8gTUEKKyAgICB1J1x1MGUyMicgICAjICAweEMyIC0+IFRIQUkgQ0hBUkFDVEVSIFlPIFlBSworICAgIHUnXHUwZTIzJyAgICMgIDB4QzMgLT4gVEhBSSBDSEFSQUNURVIgUk8gUlVBCisgICAgdSdcdTBlMjQnICAgIyAgMHhDNCAtPiBUSEFJIENIQVJBQ1RFUiBSVQorICAgIHUnXHUwZTI1JyAgICMgIDB4QzUgLT4gVEhBSSBDSEFSQUNURVIgTE8gTElORworICAgIHUnXHUwZTI2JyAgICMgIDB4QzYgLT4gVEhBSSBDSEFSQUNURVIgTFUKKyAgICB1J1x1MGUyNycgICAjICAweEM3IC0+IFRIQUkgQ0hBUkFDVEVSIFdPIFdBRU4KKyAgICB1J1x1MGUyOCcgICAjICAweEM4IC0+IFRIQUkgQ0hBUkFDVEVSIFNPIFNBTEEKKyAgICB1J1x1MGUyOScgICAjICAweEM5IC0+IFRIQUkgQ0hBUkFDVEVSIFNPIFJVU0kKKyAgICB1J1x1MGUyYScgICAjICAweENBIC0+IFRIQUkgQ0hBUkFDVEVSIFNPIFNVQQorICAgIHUnXHUwZTJiJyAgICMgIDB4Q0IgLT4gVEhBSSBDSEFSQUNURVIgSE8gSElQCisgICAgdSdcdTBlMmMnICAgIyAgMHhDQyAtPiBUSEFJIENIQVJBQ1RFUiBMTyBDSFVMQQorICAgIHUnXHUwZTJkJyAgICMgIDB4Q0QgLT4gVEhBSSBDSEFSQUNURVIgTyBBTkcKKyAgICB1J1x1MGUyZScgICAjICAweENFIC0+IFRIQUkgQ0hBUkFDVEVSIEhPIE5PS0hVSworICAgIHUnXHUwZTJmJyAgICMgIDB4Q0YgLT4gVEhBSSBDSEFSQUNURVIgUEFJWUFOTk9JCisgICAgdSdcdTBlMzAnICAgIyAgMHhEMCAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEEKKyAgICB1J1x1MGUzMScgICAjICAweEQxIC0+IFRIQUkgQ0hBUkFDVEVSIE1BSSBIQU4tQUtBVAorICAgIHUnXHUwZTMyJyAgICMgIDB4RDIgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBBQQorICAgIHUnXHUwZTMzJyAgICMgIDB4RDMgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBBTQorICAgIHUnXHUwZTM0JyAgICMgIDB4RDQgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBJCisgICAgdSdcdTBlMzUnICAgIyAgMHhENSAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIElJCisgICAgdSdcdTBlMzYnICAgIyAgMHhENiAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIFVFCisgICAgdSdcdTBlMzcnICAgIyAgMHhENyAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIFVFRQorICAgIHUnXHUwZTM4JyAgICMgIDB4RDggLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBVCisgICAgdSdcdTBlMzknICAgIyAgMHhEOSAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIFVVCisgICAgdSdcdTBlM2EnICAgIyAgMHhEQSAtPiBUSEFJIENIQVJBQ1RFUiBQSElOVEhVCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdTBlM2YnICAgIyAgMHhERiAtPiBUSEFJIENVUlJFTkNZIFNZTUJPTCBCQUhUCisgICAgdSdcdTBlNDAnICAgIyAgMHhFMCAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEUKKyAgICB1J1x1MGU0MScgICAjICAweEUxIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUUKKyAgICB1J1x1MGU0MicgICAjICAweEUyIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgTworICAgIHUnXHUwZTQzJyAgICMgIDB4RTMgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBBSSBNQUlNVUFOCisgICAgdSdcdTBlNDQnICAgIyAgMHhFNCAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEFJIE1BSU1BTEFJCisgICAgdSdcdTBlNDUnICAgIyAgMHhFNSAtPiBUSEFJIENIQVJBQ1RFUiBMQUtLSEFOR1lBTworICAgIHUnXHUwZTQ2JyAgICMgIDB4RTYgLT4gVEhBSSBDSEFSQUNURVIgTUFJWUFNT0sKKyAgICB1J1x1MGU0NycgICAjICAweEU3IC0+IFRIQUkgQ0hBUkFDVEVSIE1BSVRBSUtIVQorICAgIHUnXHUwZTQ4JyAgICMgIDB4RTggLT4gVEhBSSBDSEFSQUNURVIgTUFJIEVLCisgICAgdSdcdTBlNDknICAgIyAgMHhFOSAtPiBUSEFJIENIQVJBQ1RFUiBNQUkgVEhPCisgICAgdSdcdTBlNGEnICAgIyAgMHhFQSAtPiBUSEFJIENIQVJBQ1RFUiBNQUkgVFJJCisgICAgdSdcdTBlNGInICAgIyAgMHhFQiAtPiBUSEFJIENIQVJBQ1RFUiBNQUkgQ0hBVFRBV0EKKyAgICB1J1x1MGU0YycgICAjICAweEVDIC0+IFRIQUkgQ0hBUkFDVEVSIFRIQU5USEFLSEFUCisgICAgdSdcdTBlNGQnICAgIyAgMHhFRCAtPiBUSEFJIENIQVJBQ1RFUiBOSUtIQUhJVAorICAgIHUnXHUwZTRlJyAgICMgIDB4RUUgLT4gVEhBSSBDSEFSQUNURVIgWUFNQUtLQU4KKyAgICB1J1x1MGU0ZicgICAjICAweEVGIC0+IFRIQUkgQ0hBUkFDVEVSIEZPTkdNQU4KKyAgICB1J1x1MGU1MCcgICAjICAweEYwIC0+IFRIQUkgRElHSVQgWkVSTworICAgIHUnXHUwZTUxJyAgICMgIDB4RjEgLT4gVEhBSSBESUdJVCBPTkUKKyAgICB1J1x1MGU1MicgICAjICAweEYyIC0+IFRIQUkgRElHSVQgVFdPCisgICAgdSdcdTBlNTMnICAgIyAgMHhGMyAtPiBUSEFJIERJR0lUIFRIUkVFCisgICAgdSdcdTBlNTQnICAgIyAgMHhGNCAtPiBUSEFJIERJR0lUIEZPVVIKKyAgICB1J1x1MGU1NScgICAjICAweEY1IC0+IFRIQUkgRElHSVQgRklWRQorICAgIHUnXHUwZTU2JyAgICMgIDB4RjYgLT4gVEhBSSBESUdJVCBTSVgKKyAgICB1J1x1MGU1NycgICAjICAweEY3IC0+IFRIQUkgRElHSVQgU0VWRU4KKyAgICB1J1x1MGU1OCcgICAjICAweEY4IC0+IFRIQUkgRElHSVQgRUlHSFQKKyAgICB1J1x1MGU1OScgICAjICAweEY5IC0+IFRIQUkgRElHSVQgTklORQorICAgIHUnXHUwZTVhJyAgICMgIDB4RkEgLT4gVEhBSSBDSEFSQUNURVIgQU5HS0hBTktIVQorICAgIHUnXHUwZTViJyAgICMgIDB4RkIgLT4gVEhBSSBDSEFSQUNURVIgS0hPTVVUCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzExLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MjI2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzExLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzExLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MjI2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzExLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEzLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWFkYjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMy5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBpc284ODU5XzEzIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9JU084ODU5Lzg4NTktMTMuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvODg1OS0xMycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MjAxZCcgICAjICAweEExIC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdcdTIwMWUnICAgIyAgMHhBNSAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YTYnICAgICAjICAweEE2IC0+IEJST0tFTiBCQVIKKyAgICB1J1x4YTcnICAgICAjICAweEE3IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHhkOCcgICAgICMgIDB4QTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MDE1NicgICAjICAweEFBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisgICAgdSdceGFiJyAgICAgIyAgMHhBQiAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QUMgLT4gTk9UIFNJR04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGFlJyAgICAgIyAgMHhBRSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YzYnICAgICAjICAweEFGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgdSdceGIwJyAgICAgIyAgMHhCMCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdceGIyJyAgICAgIyAgMHhCMiAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4YjMnICAgICAjICAweEIzIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdcdTIwMWMnICAgIyAgMHhCNCAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdceGY4JyAgICAgIyAgMHhCOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhiOScgICAgICMgIDB4QjkgLT4gU1VQRVJTQ1JJUFQgT05FCisgICAgdSdcdTAxNTcnICAgIyAgMHhCQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENFRElMTEEKKyAgICB1J1x4YmInICAgICAjICAweEJCIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYycgICAgICMgIDB4QkMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGJkJyAgICAgIyAgMHhCRCAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmUnICAgICAjICAweEJFIC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnXHhlNicgICAgICMgIDB4QkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEFFCisgICAgdSdcdTAxMDQnICAgIyAgMHhDMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMmUnICAgIyAgMHhDMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMDAnICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMDYnICAgIyAgMHhDMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4YzQnICAgICAjICAweEM0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweEM1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdcdTAxMTgnICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMTInICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMGMnICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTc5JyAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdcdTAxMTYnICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxMjInICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTM2JyAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEyYScgICAjICAweENFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICB1J1x1MDEzYicgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgdSdcdTAxNjAnICAgIyAgMHhEMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MDE0MycgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIHUnXHUwMTQ1JyAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICB1J1x4ZDMnICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHUwMTRjJyAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIE1BQ1JPTgorICAgIHUnXHhkNScgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ3JyAgICAgIyAgMHhENyAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdcdTAxNzInICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggT0dPTkVLCisgICAgdSdcdTAxNDEnICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdcdTAxNWEnICAgIyAgMHhEQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICB1J1x1MDE2YScgICAjICAweERCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE3YicgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDE3ZCcgICAjICAweERFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHhkZicgICAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKEdlcm1hbikKKyAgICB1J1x1MDEwNScgICAjICAweEUwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMmYnICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE9HT05FSworICAgIHUnXHUwMTAxJyAgICMgIDB4RTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICB1J1x1MDEwNycgICAjICAweEUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU1JyAgICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x1MDExOScgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMTMnICAgIyAgMHhFNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTBkJyAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhlOScgICAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTdhJyAgICMgIDB4RUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIHUnXHUwMTE3JyAgICMgIDB4RUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDEyMycgICAjICAweEVDIC0+IExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTM3JyAgICMgIDB4RUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBDRURJTExBCisgICAgdSdcdTAxMmInICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTNjJyAgICMgIDB4RUYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgdSdcdTAxNjEnICAgIyAgMHhGMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTAxNDQnICAgIyAgMHhGMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdcdTAxNDYnICAgIyAgMHhGMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICB1J1x4ZjMnICAgICAjICAweEYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x1MDE0ZCcgICAjICAweEY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgdSdceGY1JyAgICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4RjcgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUwMTczJyAgICMgIDB4RjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDE0MicgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdcdTAxNWInICAgIyAgMHhGQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgdSdcdTAxNmInICAgIyAgMHhGQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE3YycgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxN2UnICAgIyAgMHhGRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTIwMTknICAgIyAgMHhGRiAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1NWE5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc1NWE5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTQucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ODQzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE0LnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGlzbzg4NTlfMTQgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL0lTTzg4NTkvODg1OS0xNC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc284ODU5LTE0JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBERUxFVEUKKyAgICB1J1x4ODAnICAgICAjICAweDgwIC0+IDxjb250cm9sPgorICAgIHUnXHg4MScgICAgICMgIDB4ODEgLT4gPGNvbnRyb2w+CisgICAgdSdceDgyJyAgICAgIyAgMHg4MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODMnICAgICAjICAweDgzIC0+IDxjb250cm9sPgorICAgIHUnXHg4NCcgICAgICMgIDB4ODQgLT4gPGNvbnRyb2w+CisgICAgdSdceDg1JyAgICAgIyAgMHg4NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODYnICAgICAjICAweDg2IC0+IDxjb250cm9sPgorICAgIHUnXHg4NycgICAgICMgIDB4ODcgLT4gPGNvbnRyb2w+CisgICAgdSdceDg4JyAgICAgIyAgMHg4OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODknICAgICAjICAweDg5IC0+IDxjb250cm9sPgorICAgIHUnXHg4YScgICAgICMgIDB4OEEgLT4gPGNvbnRyb2w+CisgICAgdSdceDhiJyAgICAgIyAgMHg4QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGMnICAgICAjICAweDhDIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZCcgICAgICMgIDB4OEQgLT4gPGNvbnRyb2w+CisgICAgdSdceDhlJyAgICAgIyAgMHg4RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGYnICAgICAjICAweDhGIC0+IDxjb250cm9sPgorICAgIHUnXHg5MCcgICAgICMgIDB4OTAgLT4gPGNvbnRyb2w+CisgICAgdSdceDkxJyAgICAgIyAgMHg5MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTInICAgICAjICAweDkyIC0+IDxjb250cm9sPgorICAgIHUnXHg5MycgICAgICMgIDB4OTMgLT4gPGNvbnRyb2w+CisgICAgdSdceDk0JyAgICAgIyAgMHg5NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTUnICAgICAjICAweDk1IC0+IDxjb250cm9sPgorICAgIHUnXHg5NicgICAgICMgIDB4OTYgLT4gPGNvbnRyb2w+CisgICAgdSdceDk3JyAgICAgIyAgMHg5NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTgnICAgICAjICAweDk4IC0+IDxjb250cm9sPgorICAgIHUnXHg5OScgICAgICMgIDB4OTkgLT4gPGNvbnRyb2w+CisgICAgdSdceDlhJyAgICAgIyAgMHg5QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWInICAgICAjICAweDlCIC0+IDxjb250cm9sPgorICAgIHUnXHg5YycgICAgICMgIDB4OUMgLT4gPGNvbnRyb2w+CisgICAgdSdceDlkJyAgICAgIyAgMHg5RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWUnICAgICAjICAweDlFIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZicgICAgICMgIDB4OUYgLT4gPGNvbnRyb2w+CisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUxZTAyJyAgICMgIDB4QTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUxZTAzJyAgICMgIDB4QTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x1MDEwYScgICAjICAweEE0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDEwYicgICAjICAweEE1IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTFlMGEnICAgIyAgMHhBNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MWU4MCcgICAjICAweEE4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBHUkFWRQorICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MWU4MicgICAjICAweEFBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBBQ1VURQorICAgIHUnXHUxZTBiJyAgICMgIDB4QUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MWVmMicgICAjICAweEFDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBHUkFWRQorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4YWUnICAgICAjICAweEFFIC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHUwMTc4JyAgICMgIDB4QUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUxZTFlJyAgICMgIDB4QjAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUxZTFmJyAgICMgIDB4QjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDEyMCcgICAjICAweEIyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDEyMScgICAjICAweEIzIC0+IExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTFlNDAnICAgIyAgMHhCNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTFlNDEnICAgIyAgMHhCNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTSBXSVRIIERPVCBBQk9WRQorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdcdTFlNTYnICAgIyAgMHhCNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTFlODEnICAgIyAgMHhCOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIEdSQVZFCisgICAgdSdcdTFlNTcnICAgIyAgMHhCOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUCBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUxZTgzJyAgICMgIDB4QkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBBQ1VURQorICAgIHUnXHUxZTYwJyAgICMgIDB4QkIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUxZWYzJyAgICMgIDB4QkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBHUkFWRQorICAgIHUnXHUxZTg0JyAgICMgIDB4QkQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIERJQUVSRVNJUworICAgIHUnXHUxZTg1JyAgICMgIDB4QkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MWU2MScgICAjICAweEJGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGMwJyAgICAgIyAgMHhDMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzEnICAgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMicgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzMnICAgICAjICAweEMzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhjNCcgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzYnICAgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgdSdceGM3JyAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhjOCcgICAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGM5JyAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4Y2EnICAgICAjICAweENBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNiJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4Y2QnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE3NCcgICAjICAweEQwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQxJyAgICAgIyAgMHhEMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDInICAgICAjICAweEQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkMycgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ0JyAgICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkNScgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTFlNmEnICAgIyAgMHhENyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGQ4JyAgICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGQ5JyAgICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGQnICAgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHUwMTc2JyAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGUwJyAgICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUxJyAgICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTMnICAgICAjICAweEUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU1JyAgICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTYnICAgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBRQorICAgIHUnXHhlNycgICAgICMgIDB4RTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGU4JyAgICAgIyAgMHhFOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGU5JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGVhJyAgICAgIyAgMHhFQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweEVCIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVjJyAgICAgIyAgMHhFQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGVkJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVlJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweEVGIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNzUnICAgIyAgMHhGMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjEnICAgICAjICAweEYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZjInICAgICAjICAweEYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjMnICAgICAjICAweEYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZjQnICAgICAjICAweEY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNScgICAgICMgIDB4RjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhmNicgICAgICMgIDB4RjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MWU2YicgICAjICAweEY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGY4JyAgICAgIyAgMHhGOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhmOScgICAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYScgICAgICMgIDB4RkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmYicgICAgICMgIDB4RkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmZCcgICAgICMgIDB4RkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHUwMTc3JyAgICMgIDB4RkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZmJyAgICAgIyAgMHhGRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTkyMmU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTkyMmU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiMTQwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTUucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV8xNSBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvSVNPODg1OS84ODU5LTE1LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzg4NTktMTUnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGExJyAgICAgIyAgMHhBMSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x1MjBhYycgICAjICAweEE0IC0+IEVVUk8gU0lHTgorICAgIHUnXHhhNScgICAgICMgIDB4QTUgLT4gWUVOIFNJR04KKyAgICB1J1x1MDE2MCcgICAjICAweEE2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdcdTAxNjEnICAgIyAgMHhBOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHhhYScgICAgICMgIDB4QUEgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YWInICAgICAjICAweEFCIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhBQyAtPiBOT1QgU0lHTgorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4YWUnICAgICAjICAweEFFIC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhhZicgICAgICMgIDB4QUYgLT4gTUFDUk9OCisgICAgdSdceGIwJyAgICAgIyAgMHhCMCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdceGIyJyAgICAgIyAgMHhCMiAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4YjMnICAgICAjICAweEIzIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdcdTAxN2QnICAgIyAgMHhCNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x4YjUnICAgICAjICAweEI1IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x4YjYnICAgICAjICAweEI2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjcgLT4gTUlERExFIERPVAorICAgIHUnXHUwMTdlJyAgICMgIDB4QjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHhiOScgICAgICMgIDB4QjkgLT4gU1VQRVJTQ1JJUFQgT05FCisgICAgdSdceGJhJyAgICAgIyAgMHhCQSAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmInICAgICAjICAweEJCIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTUyJyAgICMgIDB4QkMgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRQorICAgIHUnXHUwMTUzJyAgICMgIDB4QkQgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKyAgICB1J1x1MDE3OCcgICAjICAweEJFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YmYnICAgICAjICAweEJGIC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4YzAnICAgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjMScgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjMycgICAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGM0JyAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNicgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x4YzcnICAgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM4JyAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjYScgICAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkMCcgICAgICMgIDB4RDAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRICisgICAgdSdceGQxJyAgICAgIyAgMHhEMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDInICAgICAjICAweEQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkMycgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ0JyAgICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkNScgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ3JyAgICAgIyAgMHhENyAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGQ5JyAgICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGQnICAgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhkZScgICAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVEhPUk4KKyAgICB1J1x4ZGYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGUwJyAgICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUxJyAgICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTMnICAgICAjICAweEUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU1JyAgICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTYnICAgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBRQorICAgIHUnXHhlNycgICAgICMgIDB4RTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGU4JyAgICAgIyAgMHhFOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGU5JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGVhJyAgICAgIyAgMHhFQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweEVCIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVjJyAgICAgIyAgMHhFQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGVkJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVlJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweEVGIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGYwJyAgICAgIyAgMHhGMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRVRICisgICAgdSdceGYxJyAgICAgIyAgMHhGMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGYyJyAgICAgIyAgMHhGMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGYzJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGY0JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjUnICAgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZjYnICAgICAjICAweEY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY3JyAgICAgIyAgMHhGNyAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdceGY4JyAgICAgIyAgMHhGOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhmOScgICAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYScgICAgICMgIDB4RkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmYicgICAgICMgIDB4RkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmZCcgICAgICMgIDB4RkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhmZScgICAgICMgIDB4RkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOCisgICAgdSdceGZmJyAgICAgIyAgMHhGRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE1LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzMyZjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE1LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzMyZjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNi5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiOWFjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTYucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV8xNiBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvSVNPODg1OS84ODU5LTE2LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzg4NTktMTYnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTAxMDQnICAgIyAgMHhBMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMDUnICAgIyAgMHhBMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIHUnXHUwMTQxJyAgICMgIDB4QTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIHUnXHUyMGFjJyAgICMgIDB4QTQgLT4gRVVSTyBTSUdOCisgICAgdSdcdTIwMWUnICAgIyAgMHhBNSAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDE2MCcgICAjICAweEE2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdcdTAxNjEnICAgIyAgMHhBOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUwMjE4JyAgICMgIDB4QUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENPTU1BIEJFTE9XCisgICAgdSdceGFiJyAgICAgIyAgMHhBQiAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTc5JyAgICMgIDB4QUMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHUwMTdhJyAgICMgIDB4QUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIHUnXHUwMTdiJyAgICMgIDB4QUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUwMTBjJyAgICMgIDB4QjIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdcdTAxNDInICAgIyAgMHhCMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTdkJyAgICMgIDB4QjQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTIwMWQnICAgIyAgMHhCNSAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YjYnICAgICAjICAweEI2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjcgLT4gTUlERExFIERPVAorICAgIHUnXHUwMTdlJyAgICMgIDB4QjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHUwMTBkJyAgICMgIDB4QjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHUwMjE5JyAgICMgIDB4QkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDT01NQSBCRUxPVworICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNTInICAgIyAgMHhCQyAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisgICAgdSdcdTAxNTMnICAgIyAgMHhCRCAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRQorICAgIHUnXHUwMTc4JyAgICMgIDB4QkUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTdjJyAgICMgIDB4QkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4YzAnICAgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjMScgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTAyJyAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFCisgICAgdSdceGM0JyAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMDYnICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4YzYnICAgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgdSdceGM3JyAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhjOCcgICAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGM5JyAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4Y2EnICAgICAjICAweENBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNiJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4Y2QnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDExMCcgICAjICAweEQwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE0MycgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIHUnXHhkMicgICAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGQzJyAgICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxNTAnICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNWEnICAgIyAgMHhENyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICB1J1x1MDE3MCcgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZDknICAgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4REEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGRiJyAgICAgIyAgMHhEQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkYycgICAgICMgIDB4REMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTE4JyAgICMgIDB4REQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIHUnXHUwMjFhJyAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENPTU1BIEJFTE9XCisgICAgdSdceGRmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhlMCcgICAgICMgIDB4RTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMScgICAgICMgIDB4RTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4RTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxMDMnICAgIyAgMHhFMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFCisgICAgdSdceGU0JyAgICAgIyAgMHhFNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTA3JyAgICMgIDB4RTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhlNicgICAgICMgIDB4RTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEFFCisgICAgdSdceGU3JyAgICAgIyAgMHhFNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZTgnICAgICAjICAweEU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZTknICAgICAjICAweEU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZWEnICAgICAjICAweEVBIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4RUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWMnICAgICAjICAweEVDIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZWQnICAgICAjICAweEVEIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZWUnICAgICAjICAweEVFIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4RUYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDExMScgICAjICAweEYwIC0+IExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggU1RST0tFCisgICAgdSdcdTAxNDQnICAgIyAgMHhGMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdceGYyJyAgICAgIyAgMHhGMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGYzJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGY0JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDE1MScgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTViJyAgICMgIDB4RjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIHUnXHUwMTcxJyAgICMgIDB4RjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZjknICAgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmEnICAgICAjICAweEZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZmInICAgICAjICAweEZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDExOScgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdcdTAyMWInICAgIyAgMHhGRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENPTU1BIEJFTE9XCisgICAgdSdceGZmJyAgICAgIyAgMHhGRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE2LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWIyNzY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE2LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWIyNzY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8yLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZTkxZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzIucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV8yIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9JU084ODU5Lzg4NTktMi5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc284ODU5LTInLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTAxMDQnICAgIyAgMHhBMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAyZDgnICAgIyAgMHhBMiAtPiBCUkVWRQorICAgIHUnXHUwMTQxJyAgICMgIDB4QTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIHUnXHhhNCcgICAgICMgIDB4QTQgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHUwMTNkJyAgICMgIDB4QTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENBUk9OCisgICAgdSdcdTAxNWEnICAgIyAgMHhBNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICB1J1x4YTcnICAgICAjICAweEE3IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHhhOCcgICAgICMgIDB4QTggLT4gRElBRVJFU0lTCisgICAgdSdcdTAxNjAnICAgIyAgMHhBOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MDE1ZScgICAjICAweEFBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdSdcdTAxNjQnICAgIyAgMHhBQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0FST04KKyAgICB1J1x1MDE3OScgICAjICAweEFDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x1MDE3ZCcgICAjICAweEFFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHUwMTdiJyAgICMgIDB4QUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x1MDEwNScgICAjICAweEIxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAyZGInICAgIyAgMHhCMiAtPiBPR09ORUsKKyAgICB1J1x1MDE0MicgICAjICAweEIzIC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdceGI0JyAgICAgIyAgMHhCNCAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x1MDEzZScgICAjICAweEI1IC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0FST04KKyAgICB1J1x1MDE1YicgICAjICAweEI2IC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICB1J1x1MDJjNycgICAjICAweEI3IC0+IENBUk9OCisgICAgdSdceGI4JyAgICAgIyAgMHhCOCAtPiBDRURJTExBCisgICAgdSdcdTAxNjEnICAgIyAgMHhCOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTAxNWYnICAgIyAgMHhCQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE2NScgICAjICAweEJCIC0+IExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0FST04KKyAgICB1J1x1MDE3YScgICAjICAweEJDIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICB1J1x1MDJkZCcgICAjICAweEJEIC0+IERPVUJMRSBBQ1VURSBBQ0NFTlQKKyAgICB1J1x1MDE3ZScgICAjICAweEJFIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x1MDE3YycgICAjICAweEJGIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxNTQnICAgIyAgMHhDMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQUNVVEUKKyAgICB1J1x4YzEnICAgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMicgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEwMicgICAjICAweEMzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRQorICAgIHUnXHhjNCcgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTM5JyAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEFDVVRFCisgICAgdSdcdTAxMDYnICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4YzcnICAgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdcdTAxMGMnICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTE4JyAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIHUnXHhjYicgICAgICMgIDB4Q0IgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTFhJyAgICMgIDB4Q0MgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgdSdceGNkJyAgICAgIyAgMHhDRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweENFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxMGUnICAgIyAgMHhDRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICB1J1x1MDExMCcgICAjICAweEQwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE0MycgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIHUnXHUwMTQ3JyAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENBUk9OCisgICAgdSdceGQzJyAgICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxNTAnICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ3JyAgICAgIyAgMHhENyAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdcdTAxNTgnICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0FST04KKyAgICB1J1x1MDE2ZScgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGRhJyAgICAgIyAgMHhEQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x1MDE3MCcgICAjICAweERCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGQnICAgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHUwMTYyJyAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENFRElMTEEKKyAgICB1J1x4ZGYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdcdTAxNTUnICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIEFDVVRFCisgICAgdSdceGUxJyAgICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEwMycgICAjICAweEUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxM2EnICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIEFDVVRFCisgICAgdSdcdTAxMDcnICAgIyAgMHhFNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgdSdceGU3JyAgICAgIyAgMHhFNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEwZCcgICAjICAweEU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x4ZTknICAgICAjICAweEU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x1MDExOScgICAjICAweEVBIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdceGViJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTFiJyAgICMgIDB4RUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDQVJPTgorICAgIHUnXHhlZCcgICAgICMgIDB4RUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4RUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxMGYnICAgIyAgMHhFRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIENBUk9OCisgICAgdSdcdTAxMTEnICAgIyAgMHhGMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTQ0JyAgICMgIDB4RjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIHUnXHUwMTQ4JyAgICMgIDB4RjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBDQVJPTgorICAgIHUnXHhmMycgICAgICMgIDB4RjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmNCcgICAgICMgIDB4RjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxNTEnICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHhmNicgICAgICMgIDB4RjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjcnICAgICAjICAweEY3IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MDE1OScgICAjICAweEY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0FST04KKyAgICB1J1x1MDE2ZicgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhmYScgICAgICMgIDB4RkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTcxJyAgICMgIDB4RkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZmMnICAgICAjICAweEZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGZkJyAgICAgIyAgMHhGRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNjMnICAgIyAgMHhGRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENFRElMTEEKKyAgICB1J1x1MDJkOScgICAjICAweEZGIC0+IERPVCBBQk9WRQorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8yLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQwM2M4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8yLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQwM2M4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8zLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZGFhZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzMucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV8zIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9JU084ODU5Lzg4NTktMy5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc284ODU5LTMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTAxMjYnICAgIyAgMHhBMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggU1RST0tFCisgICAgdSdcdTAyZDgnICAgIyAgMHhBMiAtPiBCUkVWRQorICAgIHUnXHhhMycgICAgICMgIDB4QTMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhhNCcgICAgICMgIDB4QTQgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHVmZmZlJworICAgIHUnXHUwMTI0JyAgICMgIDB4QTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSCBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YTcnICAgICAjICAweEE3IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHhhOCcgICAgICMgIDB4QTggLT4gRElBRVJFU0lTCisgICAgdSdcdTAxMzAnICAgIyAgMHhBOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxNWUnICAgIyAgMHhBQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTFlJyAgICMgIDB4QUIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIEJSRVZFCisgICAgdSdcdTAxMzQnICAgIyAgMHhBQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1MDE3YicgICAjICAweEFGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdcdTAxMjcnICAgIyAgMHhCMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIFNUUk9LRQorICAgIHUnXHhiMicgICAgICMgIDB4QjIgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGIzJyAgICAgIyAgMHhCMyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiNCcgICAgICMgIDB4QjQgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdcdTAxMjUnICAgIyAgMHhCNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSCBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YjcnICAgICAjICAweEI3IC0+IE1JRERMRSBET1QKKyAgICB1J1x4YjgnICAgICAjICAweEI4IC0+IENFRElMTEEKKyAgICB1J1x1MDEzMScgICAjICAweEI5IC0+IExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkKKyAgICB1J1x1MDE1ZicgICAjICAweEJBIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTFmJyAgICMgIDB4QkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBCUkVWRQorICAgIHUnXHUwMTM1JyAgICMgIDB4QkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEogV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGJkJyAgICAgIyAgMHhCRCAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1MDE3YycgICAjICAweEJGIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGMwJyAgICAgIyAgMHhDMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzEnICAgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMicgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x4YzQnICAgICAjICAweEM0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDEwYScgICAjICAweEM1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDEwOCcgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGM3JyAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhjOCcgICAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGM5JyAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4Y2EnICAgICAjICAweENBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNiJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4Y2QnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x4ZDEnICAgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkMicgICAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGQzJyAgICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxMjAnICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ3JyAgICAgIyAgMHhENyAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdcdTAxMWMnICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkOScgICAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGRhJyAgICAgIyAgMHhEQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZGInICAgICAjICAweERCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGRjJyAgICAgIyAgMHhEQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNmMnICAgIyAgMHhERCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQlJFVkUKKyAgICB1J1x1MDE1YycgICAjICAweERFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGRmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhlMCcgICAgICMgIDB4RTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMScgICAgICMgIDB4RTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4RTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdWZmZmUnCisgICAgdSdceGU0JyAgICAgIyAgMHhFNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTBiJyAgICMgIDB4RTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDEwOScgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNycgICAgICMgIDB4RTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGU4JyAgICAgIyAgMHhFOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGU5JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGVhJyAgICAgIyAgMHhFQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweEVCIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVjJyAgICAgIyAgMHhFQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGVkJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVlJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweEVGIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdcdWZmZmUnCisgICAgdSdceGYxJyAgICAgIyAgMHhGMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGYyJyAgICAgIyAgMHhGMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGYzJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGY0JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEyMScgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4RjcgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUwMTFkJyAgICMgIDB4RjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY5JyAgICAgIyAgMHhGOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZhJyAgICAgIyAgMHhGQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGZiJyAgICAgIyAgMHhGQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweEZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNmQnICAgIyAgMHhGRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEJSRVZFCisgICAgdSdcdTAxNWQnICAgIyAgMHhGRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDJkOScgICAjICAweEZGIC0+IERPVCBBQk9WRQorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8zLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzZDE2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8zLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzZDE2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV80LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV80LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTAzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzQucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV80IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9JU084ODU5Lzg4NTktNC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc284ODU5LTQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTAxMDQnICAgIyAgMHhBMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMzgnICAgIyAgMHhBMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgS1JBCisgICAgdSdcdTAxNTYnICAgIyAgMHhBMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgIHUnXHhhNCcgICAgICMgIDB4QTQgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHUwMTI4JyAgICMgIDB4QTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIFRJTERFCisgICAgdSdcdTAxM2InICAgIyAgMHhBNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhBOCAtPiBESUFFUkVTSVMKKyAgICB1J1x1MDE2MCcgICAjICAweEE5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUwMTEyJyAgICMgIDB4QUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTIyJyAgICMgIDB4QUIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE2NicgICAjICAweEFDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBTVFJPS0UKKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdcdTAxN2QnICAgIyAgMHhBRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x4YWYnICAgICAjICAweEFGIC0+IE1BQ1JPTgorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x1MDEwNScgICAjICAweEIxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAyZGInICAgIyAgMHhCMiAtPiBPR09ORUsKKyAgICB1J1x1MDE1NycgICAjICAweEIzIC0+IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgIHUnXHhiNCcgICAgICMgIDB4QjQgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdcdTAxMjknICAgIyAgMHhCNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIFRJTERFCisgICAgdSdcdTAxM2MnICAgIyAgMHhCNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICB1J1x1MDJjNycgICAjICAweEI3IC0+IENBUk9OCisgICAgdSdceGI4JyAgICAgIyAgMHhCOCAtPiBDRURJTExBCisgICAgdSdcdTAxNjEnICAgIyAgMHhCOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTAxMTMnICAgIyAgMHhCQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTIzJyAgICMgIDB4QkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisgICAgdSdcdTAxNjcnICAgIyAgMHhCQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTRhJyAgICMgIDB4QkQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRU5HCisgICAgdSdcdTAxN2UnICAgIyAgMHhCRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTAxNGInICAgIyAgMHhCRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRU5HCisgICAgdSdcdTAxMDAnICAgIyAgMHhDMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgdSdceGMxJyAgICAgIyAgMHhDMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4YzInICAgICAjICAweEMyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGMzJyAgICAgIyAgMHhDMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4YzQnICAgICAjICAweEM0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweEM1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGM2JyAgICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRQorICAgIHUnXHUwMTJlJyAgICMgIDB4QzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE9HT05FSworICAgIHUnXHUwMTBjJyAgICMgIDB4QzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdceGM5JyAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x1MDExOCcgICAjICAweENBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICB1J1x4Y2InICAgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDExNicgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4Y2QnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEyYScgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICB1J1x1MDExMCcgICAjICAweEQwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE0NScgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBCisgICAgdSdcdTAxNGMnICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMzYnICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorICAgIHUnXHhkNCcgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDUnICAgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhkNicgICAgICMgIDB4RDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkNycgICAgICMgIDB4RDcgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHhkOCcgICAgICMgIDB4RDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTcyJyAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE9HT05FSworICAgIHUnXHhkYScgICAgICMgIDB4REEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGRiJyAgICAgIyAgMHhEQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkYycgICAgICMgIDB4REMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTY4JyAgICMgIDB4REQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFRJTERFCisgICAgdSdcdTAxNmEnICAgIyAgMHhERSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OCisgICAgdSdceGRmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHUwMTAxJyAgICMgIDB4RTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICB1J1x4ZTEnICAgICAjICAweEUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTInICAgICAjICAweEUyIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlMycgICAgICMgIDB4RTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhlNCcgICAgICMgIDB4RTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTUnICAgICAjICAweEU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNicgICAgICMgIDB4RTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEFFCisgICAgdSdcdTAxMmYnICAgIyAgMHhFNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE9HT05FSworICAgIHUnXHUwMTBkJyAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhlOScgICAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTE5JyAgICMgIDB4RUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICB1J1x4ZWInICAgICAjICAweEVCIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMTcnICAgIyAgMHhFQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorICAgIHUnXHhlZCcgICAgICMgIDB4RUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4RUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxMmInICAgIyAgMHhFRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTExJyAgICMgIDB4RjAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE0NicgICAjICAweEYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTRkJyAgICMgIDB4RjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICB1J1x1MDEzNycgICAjICAweEYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorICAgIHUnXHhmNCcgICAgICMgIDB4RjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY1JyAgICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4RjcgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHhmOCcgICAgICMgIDB4RjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE3MycgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggT0dPTkVLCisgICAgdSdceGZhJyAgICAgIyAgMHhGQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGZiJyAgICAgIyAgMHhGQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweEZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNjknICAgIyAgMHhGRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFRJTERFCisgICAgdSdcdTAxNmInICAgIyAgMHhGRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMmQ5JyAgICMgIDB4RkYgLT4gRE9UIEFCT1ZFCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzQucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV80LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWEzYmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV80LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzQucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV80LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWEzYmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV80LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzUucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAxY2QxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNS5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBpc284ODU5XzUgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL0lTTzg4NTkvODg1OS01LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzg4NTktNScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MDQwMScgICAjICAweEExIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisgICAgdSdcdTA0MDInICAgIyAgMHhBMiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBESkUKKyAgICB1J1x1MDQwMycgICAjICAweEEzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEdKRQorICAgIHUnXHUwNDA0JyAgICMgIDB4QTQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgdSdcdTA0MDUnICAgIyAgMHhBNSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkUKKyAgICB1J1x1MDQwNicgICAjICAweEE2IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIHUnXHUwNDA3JyAgICMgIDB4QTcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUkKKyAgICB1J1x1MDQwOCcgICAjICAweEE4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEpFCisgICAgdSdcdTA0MDknICAgIyAgMHhBOSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBMSkUKKyAgICB1J1x1MDQwYScgICAjICAweEFBIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIE5KRQorICAgIHUnXHUwNDBiJyAgICMgIDB4QUIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNIRQorICAgIHUnXHUwNDBjJyAgICMgIDB4QUMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0pFCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHUwNDBlJyAgICMgIDB4QUUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgVQorICAgIHUnXHUwNDBmJyAgICMgIDB4QUYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRFpIRQorICAgIHUnXHUwNDEwJyAgICMgIDB4QjAgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnXHUwNDExJyAgICMgIDB4QjEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKyAgICB1J1x1MDQxMicgICAjICAweEIyIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFZFCisgICAgdSdcdTA0MTMnICAgIyAgMHhCMyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUKKyAgICB1J1x1MDQxNCcgICAjICAweEI0IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERFCisgICAgdSdcdTA0MTUnICAgIyAgMHhCNSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJRQorICAgIHUnXHUwNDE2JyAgICMgIDB4QjYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFCisgICAgdSdcdTA0MTcnICAgIyAgMHhCNyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRQorICAgIHUnXHUwNDE4JyAgICMgIDB4QjggLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnXHUwNDE5JyAgICMgIDB4QjkgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSQorICAgIHUnXHUwNDFhJyAgICMgIDB4QkEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EKKyAgICB1J1x1MDQxYicgICAjICAweEJCIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVMCisgICAgdSdcdTA0MWMnICAgIyAgMHhCQyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTQorICAgIHUnXHUwNDFkJyAgICMgIDB4QkQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4KKyAgICB1J1x1MDQxZScgICAjICAweEJFIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1x1MDQxZicgICAjICAweEJGIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisgICAgdSdcdTA0MjAnICAgIyAgMHhDMCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUgorICAgIHUnXHUwNDIxJyAgICMgIDB4QzEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVMKKyAgICB1J1x1MDQyMicgICAjICAweEMyIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisgICAgdSdcdTA0MjMnICAgIyAgMHhDMyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdcdTA0MjQnICAgIyAgMHhDNCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFRgorICAgIHUnXHUwNDI1JyAgICMgIDB4QzUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEEKKyAgICB1J1x1MDQyNicgICAjICAweEM2IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorICAgIHUnXHUwNDI3JyAgICMgIDB4QzcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFCisgICAgdSdcdTA0MjgnICAgIyAgMHhDOCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEEKKyAgICB1J1x1MDQyOScgICAjICAweEM5IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBCisgICAgdSdcdTA0MmEnICAgIyAgMHhDQSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04KKyAgICB1J1x1MDQyYicgICAjICAweENCIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlFUlUKKyAgICB1J1x1MDQyYycgICAjICAweENDIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTgorICAgIHUnXHUwNDJkJyAgICMgIDB4Q0QgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnXHUwNDJlJyAgICMgIDB4Q0UgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUKKyAgICB1J1x1MDQyZicgICAjICAweENGIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisgICAgdSdcdTA0MzAnICAgIyAgMHhEMCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQQorICAgIHUnXHUwNDMxJyAgICMgIDB4RDEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJFCisgICAgdSdcdTA0MzInICAgIyAgMHhEMiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVkUKKyAgICB1J1x1MDQzMycgICAjICAweEQzIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUKKyAgICB1J1x1MDQzNCcgICAjICAweEQ0IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBERQorICAgIHUnXHUwNDM1JyAgICMgIDB4RDUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElFCisgICAgdSdcdTA0MzYnICAgIyAgMHhENiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFCisgICAgdSdcdTA0MzcnICAgIyAgMHhENyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkUKKyAgICB1J1x1MDQzOCcgICAjICAweEQ4IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJCisgICAgdSdcdTA0MzknICAgIyAgMHhEOSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSQorICAgIHUnXHUwNDNhJyAgICMgIDB4REEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBCisgICAgdSdcdTA0M2InICAgIyAgMHhEQiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUwKKyAgICB1J1x1MDQzYycgICAjICAweERDIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTQorICAgIHUnXHUwNDNkJyAgICMgIDB4REQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOCisgICAgdSdcdTA0M2UnICAgIyAgMHhERSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgTworICAgIHUnXHUwNDNmJyAgICMgIDB4REYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFCisgICAgdSdcdTA0NDAnICAgIyAgMHhFMCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVIKKyAgICB1J1x1MDQ0MScgICAjICAweEUxIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFUworICAgIHUnXHUwNDQyJyAgICMgIDB4RTIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRFCisgICAgdSdcdTA0NDMnICAgIyAgMHhFMyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVQorICAgIHUnXHUwNDQ0JyAgICMgIDB4RTQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVGCisgICAgdSdcdTA0NDUnICAgIyAgMHhFNSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEEKKyAgICB1J1x1MDQ0NicgICAjICAweEU2IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBUU0UKKyAgICB1J1x1MDQ0NycgICAjICAweEU3IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBDSEUKKyAgICB1J1x1MDQ0OCcgICAjICAweEU4IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSEEKKyAgICB1J1x1MDQ0OScgICAjICAweEU5IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSENIQQorICAgIHUnXHUwNDRhJyAgICMgIDB4RUEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBUkQgU0lHTgorICAgIHUnXHUwNDRiJyAgICMgIDB4RUIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlFUlUKKyAgICB1J1x1MDQ0YycgICAjICAweEVDIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTT0ZUIFNJR04KKyAgICB1J1x1MDQ0ZCcgICAjICAweEVEIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFCisgICAgdSdcdTA0NGUnICAgIyAgMHhFRSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUKKyAgICB1J1x1MDQ0ZicgICAjICAweEVGIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZQQorICAgIHUnXHUyMTE2JyAgICMgIDB4RjAgLT4gTlVNRVJPIFNJR04KKyAgICB1J1x1MDQ1MScgICAjICAweEYxIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJTworICAgIHUnXHUwNDUyJyAgICMgIDB4RjIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERKRQorICAgIHUnXHUwNDUzJyAgICMgIDB4RjMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdKRQorICAgIHUnXHUwNDU0JyAgICMgIDB4RjQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIHUnXHUwNDU1JyAgICMgIDB4RjUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERaRQorICAgIHUnXHUwNDU2JyAgICMgIDB4RjYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIHUnXHUwNDU3JyAgICMgIDB4RjcgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlJCisgICAgdSdcdTA0NTgnICAgIyAgMHhGOCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSkUKKyAgICB1J1x1MDQ1OScgICAjICAweEY5IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBMSkUKKyAgICB1J1x1MDQ1YScgICAjICAweEZBIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBOSkUKKyAgICB1J1x1MDQ1YicgICAjICAweEZCIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBUU0hFCisgICAgdSdcdTA0NWMnICAgIyAgMHhGQyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0pFCisgICAgdSdceGE3JyAgICAgIyAgMHhGRCAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MDQ1ZScgICAjICAweEZFIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBVCisgICAgdSdcdTA0NWYnICAgIyAgMHhGRiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpIRQorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV81LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiNDZiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV81LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiNDZiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV82LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV82LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YzM0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzYucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV82IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9JU084ODU5Lzg4NTktNi5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc284ODU5LTYnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdTA2MGMnICAgIyAgMHhBQyAtPiBBUkFCSUMgQ09NTUEKKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdTA2MWInICAgIyAgMHhCQiAtPiBBUkFCSUMgU0VNSUNPTE9OCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdTA2MWYnICAgIyAgMHhCRiAtPiBBUkFCSUMgUVVFU1RJT04gTUFSSworICAgIHUnXHVmZmZlJworICAgIHUnXHUwNjIxJyAgICMgIDB4QzEgLT4gQVJBQklDIExFVFRFUiBIQU1aQQorICAgIHUnXHUwNjIyJyAgICMgIDB4QzIgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUKKyAgICB1J1x1MDYyMycgICAjICAweEMzIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEFCT1ZFCisgICAgdSdcdTA2MjQnICAgIyAgMHhDNCAtPiBBUkFCSUMgTEVUVEVSIFdBVyBXSVRIIEhBTVpBIEFCT1ZFCisgICAgdSdcdTA2MjUnICAgIyAgMHhDNSAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBCRUxPVworICAgIHUnXHUwNjI2JyAgICMgIDB4QzYgLT4gQVJBQklDIExFVFRFUiBZRUggV0lUSCBIQU1aQSBBQk9WRQorICAgIHUnXHUwNjI3JyAgICMgIDB4QzcgLT4gQVJBQklDIExFVFRFUiBBTEVGCisgICAgdSdcdTA2MjgnICAgIyAgMHhDOCAtPiBBUkFCSUMgTEVUVEVSIEJFSAorICAgIHUnXHUwNjI5JyAgICMgIDB4QzkgLT4gQVJBQklDIExFVFRFUiBURUggTUFSQlVUQQorICAgIHUnXHUwNjJhJyAgICMgIDB4Q0EgLT4gQVJBQklDIExFVFRFUiBURUgKKyAgICB1J1x1MDYyYicgICAjICAweENCIC0+IEFSQUJJQyBMRVRURVIgVEhFSAorICAgIHUnXHUwNjJjJyAgICMgIDB4Q0MgLT4gQVJBQklDIExFVFRFUiBKRUVNCisgICAgdSdcdTA2MmQnICAgIyAgMHhDRCAtPiBBUkFCSUMgTEVUVEVSIEhBSAorICAgIHUnXHUwNjJlJyAgICMgIDB4Q0UgLT4gQVJBQklDIExFVFRFUiBLSEFICisgICAgdSdcdTA2MmYnICAgIyAgMHhDRiAtPiBBUkFCSUMgTEVUVEVSIERBTAorICAgIHUnXHUwNjMwJyAgICMgIDB4RDAgLT4gQVJBQklDIExFVFRFUiBUSEFMCisgICAgdSdcdTA2MzEnICAgIyAgMHhEMSAtPiBBUkFCSUMgTEVUVEVSIFJFSAorICAgIHUnXHUwNjMyJyAgICMgIDB4RDIgLT4gQVJBQklDIExFVFRFUiBaQUlOCisgICAgdSdcdTA2MzMnICAgIyAgMHhEMyAtPiBBUkFCSUMgTEVUVEVSIFNFRU4KKyAgICB1J1x1MDYzNCcgICAjICAweEQ0IC0+IEFSQUJJQyBMRVRURVIgU0hFRU4KKyAgICB1J1x1MDYzNScgICAjICAweEQ1IC0+IEFSQUJJQyBMRVRURVIgU0FECisgICAgdSdcdTA2MzYnICAgIyAgMHhENiAtPiBBUkFCSUMgTEVUVEVSIERBRAorICAgIHUnXHUwNjM3JyAgICMgIDB4RDcgLT4gQVJBQklDIExFVFRFUiBUQUgKKyAgICB1J1x1MDYzOCcgICAjICAweEQ4IC0+IEFSQUJJQyBMRVRURVIgWkFICisgICAgdSdcdTA2MzknICAgIyAgMHhEOSAtPiBBUkFCSUMgTEVUVEVSIEFJTgorICAgIHUnXHUwNjNhJyAgICMgIDB4REEgLT4gQVJBQklDIExFVFRFUiBHSEFJTgorICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHUwNjQwJyAgICMgIDB4RTAgLT4gQVJBQklDIFRBVFdFRUwKKyAgICB1J1x1MDY0MScgICAjICAweEUxIC0+IEFSQUJJQyBMRVRURVIgRkVICisgICAgdSdcdTA2NDInICAgIyAgMHhFMiAtPiBBUkFCSUMgTEVUVEVSIFFBRgorICAgIHUnXHUwNjQzJyAgICMgIDB4RTMgLT4gQVJBQklDIExFVFRFUiBLQUYKKyAgICB1J1x1MDY0NCcgICAjICAweEU0IC0+IEFSQUJJQyBMRVRURVIgTEFNCisgICAgdSdcdTA2NDUnICAgIyAgMHhFNSAtPiBBUkFCSUMgTEVUVEVSIE1FRU0KKyAgICB1J1x1MDY0NicgICAjICAweEU2IC0+IEFSQUJJQyBMRVRURVIgTk9PTgorICAgIHUnXHUwNjQ3JyAgICMgIDB4RTcgLT4gQVJBQklDIExFVFRFUiBIRUgKKyAgICB1J1x1MDY0OCcgICAjICAweEU4IC0+IEFSQUJJQyBMRVRURVIgV0FXCisgICAgdSdcdTA2NDknICAgIyAgMHhFOSAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQQorICAgIHUnXHUwNjRhJyAgICMgIDB4RUEgLT4gQVJBQklDIExFVFRFUiBZRUgKKyAgICB1J1x1MDY0YicgICAjICAweEVCIC0+IEFSQUJJQyBGQVRIQVRBTgorICAgIHUnXHUwNjRjJyAgICMgIDB4RUMgLT4gQVJBQklDIERBTU1BVEFOCisgICAgdSdcdTA2NGQnICAgIyAgMHhFRCAtPiBBUkFCSUMgS0FTUkFUQU4KKyAgICB1J1x1MDY0ZScgICAjICAweEVFIC0+IEFSQUJJQyBGQVRIQQorICAgIHUnXHUwNjRmJyAgICMgIDB4RUYgLT4gQVJBQklDIERBTU1BCisgICAgdSdcdTA2NTAnICAgIyAgMHhGMCAtPiBBUkFCSUMgS0FTUkEKKyAgICB1J1x1MDY1MScgICAjICAweEYxIC0+IEFSQUJJQyBTSEFEREEKKyAgICB1J1x1MDY1MicgICAjICAweEYyIC0+IEFSQUJJQyBTVUtVTgorICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV82LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlYmY3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV82LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlYmY3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV83LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV83LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NjAwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzcucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV83IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9JU084ODU5Lzg4NTktNy5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc284ODU5LTcnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTIwMTgnICAgIyAgMHhBMSAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4QTIgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdcdTIwYWMnICAgIyAgMHhBNCAtPiBFVVJPIFNJR04KKyAgICB1J1x1MjBhZicgICAjICAweEE1IC0+IERSQUNITUEgU0lHTgorICAgIHUnXHhhNicgICAgICMgIDB4QTYgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhBOCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTAzN2EnICAgIyAgMHhBQSAtPiBHUkVFSyBZUE9HRUdSQU1NRU5JCisgICAgdSdceGFiJyAgICAgIyAgMHhBQiAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QUMgLT4gTk9UIFNJR04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdcdWZmZmUnCisgICAgdSdcdTIwMTUnICAgIyAgMHhBRiAtPiBIT1JJWk9OVEFMIEJBUgorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMicgICAgICMgIDB4QjIgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGIzJyAgICAgIyAgMHhCMyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHUwMzg0JyAgICMgIDB4QjQgLT4gR1JFRUsgVE9OT1MKKyAgICB1J1x1MDM4NScgICAjICAweEI1IC0+IEdSRUVLIERJQUxZVElLQSBUT05PUworICAgIHUnXHUwMzg2JyAgICMgIDB4QjYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIHUnXHhiNycgICAgICMgIDB4QjcgLT4gTUlERExFIERPVAorICAgIHUnXHUwMzg4JyAgICMgIDB4QjggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzODknICAgIyAgMHhCOSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIHUnXHUwMzhhJyAgICMgIDB4QkEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgdSdceGJiJyAgICAgIyAgMHhCQiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDM4YycgICAjICAweEJDIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUworICAgIHUnXHhiZCcgICAgICMgIDB4QkQgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdcdTAzOGUnICAgIyAgMHhCRSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4ZicgICAjICAweEJGIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICB1J1x1MDM5MCcgICAjICAweEMwIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBIEFORCBUT05PUworICAgIHUnXHUwMzkxJyAgICMgIDB4QzEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEKKyAgICB1J1x1MDM5MicgICAjICAweEMyIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEKKyAgICB1J1x1MDM5MycgICAjICAweEMzIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgdSdcdTAzOTQnICAgIyAgMHhDNCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQQorICAgIHUnXHUwMzk1JyAgICMgIDB4QzUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTgorICAgIHUnXHUwMzk2JyAgICMgIDB4QzYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQorICAgIHUnXHUwMzk3JyAgICMgIDB4QzcgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBCisgICAgdSdcdTAzOTgnICAgIyAgMHhDOCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwMzk5JyAgICMgIDB4QzkgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQQorICAgIHUnXHUwMzlhJyAgICMgIDB4Q0EgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEEKKyAgICB1J1x1MDM5YicgICAjICAweENCIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBCisgICAgdSdcdTAzOWMnICAgIyAgMHhDQyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQorICAgIHUnXHUwMzlkJyAgICMgIDB4Q0QgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUKKyAgICB1J1x1MDM5ZScgICAjICAweENFIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFhJCisgICAgdSdcdTAzOWYnICAgIyAgMHhDRiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCisgICAgdSdcdTAzYTAnICAgIyAgMHhEMCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSQorICAgIHUnXHUwM2ExJyAgICMgIDB4RDEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPCisgICAgdSdcdWZmZmUnCisgICAgdSdcdTAzYTMnICAgIyAgMHhEMyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIHUnXHUwM2E0JyAgICMgIDB4RDQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCisgICAgdSdcdTAzYTUnICAgIyAgMHhENSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCisgICAgdSdcdTAzYTYnICAgIyAgMHhENiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICB1J1x1MDNhNycgICAjICAweEQ3IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIENISQorICAgIHUnXHUwM2E4JyAgICMgIDB4RDggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJCisgICAgdSdcdTAzYTknICAgIyAgMHhEOSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwM2FhJyAgICMgIDB4REEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwM2FiJyAgICMgIDB4REIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwM2FjJyAgICMgIDB4REMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICB1J1x1MDNhZCcgICAjICAweEREIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDNhZScgICAjICAweERFIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIHUnXHUwM2FmJyAgICMgIDB4REYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIHUnXHUwM2IwJyAgICMgIDB4RTAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TCisgICAgdSdcdTAzYjEnICAgIyAgMHhFMSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICB1J1x1MDNiMicgICAjICAweEUyIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBCRVRBCisgICAgdSdcdTAzYjMnICAgIyAgMHhFMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgR0FNTUEKKyAgICB1J1x1MDNiNCcgICAjICAweEU0IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIHUnXHUwM2I1JyAgICMgIDB4RTUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICB1J1x1MDNiNicgICAjICAweEU2IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBaRVRBCisgICAgdSdcdTAzYjcnICAgIyAgMHhFNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVRBCisgICAgdSdcdTAzYjgnICAgIyAgMHhFOCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEEKKyAgICB1J1x1MDNiOScgICAjICAweEU5IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBCisgICAgdSdcdTAzYmEnICAgIyAgMHhFQSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgS0FQUEEKKyAgICB1J1x1MDNiYicgICAjICAweEVCIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQorICAgIHUnXHUwM2JjJyAgICMgIDB4RUMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE1VCisgICAgdSdcdTAzYmQnICAgIyAgMHhFRCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgTlUKKyAgICB1J1x1MDNiZScgICAjICAweEVFIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBYSQorICAgIHUnXHUwM2JmJyAgICMgIDB4RUYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04KKyAgICB1J1x1MDNjMCcgICAjICAweEYwIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHUwM2MxJyAgICMgIDB4RjEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFJITworICAgIHUnXHUwM2MyJyAgICMgIDB4RjIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BCisgICAgdSdcdTAzYzMnICAgIyAgMHhGMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICB1J1x1MDNjNCcgICAjICAweEY0IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICB1J1x1MDNjNScgICAjICAweEY1IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OCisgICAgdSdcdTAzYzYnICAgIyAgMHhGNiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgdSdcdTAzYzcnICAgIyAgMHhGNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQ0hJCisgICAgdSdcdTAzYzgnICAgIyAgMHhGOCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUFNJCisgICAgdSdcdTAzYzknICAgIyAgMHhGOSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EKKyAgICB1J1x1MDNjYScgICAjICAweEZBIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzY2InICAgIyAgMHhGQiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwM2NjJyAgICMgIDB4RkMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUworICAgIHUnXHUwM2NkJyAgICMgIDB4RkQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwM2NlJyAgICMgIDB4RkUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICB1J1x1ZmZmZScKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNGM2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNGM2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2NmMjEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV84LnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGlzbzg4NTlfOCBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvSVNPODg1OS84ODU5LTguVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvODg1OS04JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBERUxFVEUKKyAgICB1J1x4ODAnICAgICAjICAweDgwIC0+IDxjb250cm9sPgorICAgIHUnXHg4MScgICAgICMgIDB4ODEgLT4gPGNvbnRyb2w+CisgICAgdSdceDgyJyAgICAgIyAgMHg4MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODMnICAgICAjICAweDgzIC0+IDxjb250cm9sPgorICAgIHUnXHg4NCcgICAgICMgIDB4ODQgLT4gPGNvbnRyb2w+CisgICAgdSdceDg1JyAgICAgIyAgMHg4NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODYnICAgICAjICAweDg2IC0+IDxjb250cm9sPgorICAgIHUnXHg4NycgICAgICMgIDB4ODcgLT4gPGNvbnRyb2w+CisgICAgdSdceDg4JyAgICAgIyAgMHg4OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODknICAgICAjICAweDg5IC0+IDxjb250cm9sPgorICAgIHUnXHg4YScgICAgICMgIDB4OEEgLT4gPGNvbnRyb2w+CisgICAgdSdceDhiJyAgICAgIyAgMHg4QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGMnICAgICAjICAweDhDIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZCcgICAgICMgIDB4OEQgLT4gPGNvbnRyb2w+CisgICAgdSdceDhlJyAgICAgIyAgMHg4RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGYnICAgICAjICAweDhGIC0+IDxjb250cm9sPgorICAgIHUnXHg5MCcgICAgICMgIDB4OTAgLT4gPGNvbnRyb2w+CisgICAgdSdceDkxJyAgICAgIyAgMHg5MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTInICAgICAjICAweDkyIC0+IDxjb250cm9sPgorICAgIHUnXHg5MycgICAgICMgIDB4OTMgLT4gPGNvbnRyb2w+CisgICAgdSdceDk0JyAgICAgIyAgMHg5NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTUnICAgICAjICAweDk1IC0+IDxjb250cm9sPgorICAgIHUnXHg5NicgICAgICMgIDB4OTYgLT4gPGNvbnRyb2w+CisgICAgdSdceDk3JyAgICAgIyAgMHg5NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTgnICAgICAjICAweDk4IC0+IDxjb250cm9sPgorICAgIHUnXHg5OScgICAgICMgIDB4OTkgLT4gPGNvbnRyb2w+CisgICAgdSdceDlhJyAgICAgIyAgMHg5QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWInICAgICAjICAweDlCIC0+IDxjb250cm9sPgorICAgIHUnXHg5YycgICAgICMgIDB4OUMgLT4gPGNvbnRyb2w+CisgICAgdSdceDlkJyAgICAgIyAgMHg5RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWUnICAgICAjICAweDlFIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZicgICAgICMgIDB4OUYgLT4gPGNvbnRyb2w+CisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHVmZmZlJworICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhBNSAtPiBZRU4gU0lHTgorICAgIHUnXHhhNicgICAgICMgIDB4QTYgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhBOCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdceGQ3JyAgICAgIyAgMHhBQSAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdceGFiJyAgICAgIyAgMHhBQiAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QUMgLT4gTk9UIFNJR04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGFlJyAgICAgIyAgMHhBRSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YWYnICAgICAjICAweEFGIC0+IE1BQ1JPTgorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMicgICAgICMgIDB4QjIgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGIzJyAgICAgIyAgMHhCMyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiNCcgICAgICMgIDB4QjQgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdceGI2JyAgICAgIyAgMHhCNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEI3IC0+IE1JRERMRSBET1QKKyAgICB1J1x4YjgnICAgICAjICAweEI4IC0+IENFRElMTEEKKyAgICB1J1x4YjknICAgICAjICAweEI5IC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhmNycgICAgICMgIDB4QkEgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJjJyAgICAgIyAgMHhCQyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEJEIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QkUgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdTIwMTcnICAgIyAgMHhERiAtPiBET1VCTEUgTE9XIExJTkUKKyAgICB1J1x1MDVkMCcgICAjICAweEUwIC0+IEhFQlJFVyBMRVRURVIgQUxFRgorICAgIHUnXHUwNWQxJyAgICMgIDB4RTEgLT4gSEVCUkVXIExFVFRFUiBCRVQKKyAgICB1J1x1MDVkMicgICAjICAweEUyIC0+IEhFQlJFVyBMRVRURVIgR0lNRUwKKyAgICB1J1x1MDVkMycgICAjICAweEUzIC0+IEhFQlJFVyBMRVRURVIgREFMRVQKKyAgICB1J1x1MDVkNCcgICAjICAweEU0IC0+IEhFQlJFVyBMRVRURVIgSEUKKyAgICB1J1x1MDVkNScgICAjICAweEU1IC0+IEhFQlJFVyBMRVRURVIgVkFWCisgICAgdSdcdTA1ZDYnICAgIyAgMHhFNiAtPiBIRUJSRVcgTEVUVEVSIFpBWUlOCisgICAgdSdcdTA1ZDcnICAgIyAgMHhFNyAtPiBIRUJSRVcgTEVUVEVSIEhFVAorICAgIHUnXHUwNWQ4JyAgICMgIDB4RTggLT4gSEVCUkVXIExFVFRFUiBURVQKKyAgICB1J1x1MDVkOScgICAjICAweEU5IC0+IEhFQlJFVyBMRVRURVIgWU9ECisgICAgdSdcdTA1ZGEnICAgIyAgMHhFQSAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIEtBRgorICAgIHUnXHUwNWRiJyAgICMgIDB4RUIgLT4gSEVCUkVXIExFVFRFUiBLQUYKKyAgICB1J1x1MDVkYycgICAjICAweEVDIC0+IEhFQlJFVyBMRVRURVIgTEFNRUQKKyAgICB1J1x1MDVkZCcgICAjICAweEVEIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgTUVNCisgICAgdSdcdTA1ZGUnICAgIyAgMHhFRSAtPiBIRUJSRVcgTEVUVEVSIE1FTQorICAgIHUnXHUwNWRmJyAgICMgIDB4RUYgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBOVU4KKyAgICB1J1x1MDVlMCcgICAjICAweEYwIC0+IEhFQlJFVyBMRVRURVIgTlVOCisgICAgdSdcdTA1ZTEnICAgIyAgMHhGMSAtPiBIRUJSRVcgTEVUVEVSIFNBTUVLSAorICAgIHUnXHUwNWUyJyAgICMgIDB4RjIgLT4gSEVCUkVXIExFVFRFUiBBWUlOCisgICAgdSdcdTA1ZTMnICAgIyAgMHhGMyAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIFBFCisgICAgdSdcdTA1ZTQnICAgIyAgMHhGNCAtPiBIRUJSRVcgTEVUVEVSIFBFCisgICAgdSdcdTA1ZTUnICAgIyAgMHhGNSAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIFRTQURJCisgICAgdSdcdTA1ZTYnICAgIyAgMHhGNiAtPiBIRUJSRVcgTEVUVEVSIFRTQURJCisgICAgdSdcdTA1ZTcnICAgIyAgMHhGNyAtPiBIRUJSRVcgTEVUVEVSIFFPRgorICAgIHUnXHUwNWU4JyAgICMgIDB4RjggLT4gSEVCUkVXIExFVFRFUiBSRVNICisgICAgdSdcdTA1ZTknICAgIyAgMHhGOSAtPiBIRUJSRVcgTEVUVEVSIFNISU4KKyAgICB1J1x1MDVlYScgICAjICAweEZBIC0+IEhFQlJFVyBMRVRURVIgVEFWCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdTIwMGUnICAgIyAgMHhGRCAtPiBMRUZULVRPLVJJR0hUIE1BUksKKyAgICB1J1x1MjAwZicgICAjICAweEZFIC0+IFJJR0hULVRPLUxFRlQgTUFSSworICAgIHUnXHVmZmZlJworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV84LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2N2M4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV84LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2N2M4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV85LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV85LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDI5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzkucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV85IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9JU084ODU5Lzg4NTktOS5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc284ODU5LTknLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGExJyAgICAgIyAgMHhBMSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTQnICAgICAjICAweEE0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweEE1IC0+IFlFTiBTSUdOCisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweEE4IC0+IERJQUVSRVNJUworICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4YWEnICAgICAjICAweEFBIC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGFiJyAgICAgIyAgMHhBQiAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QUMgLT4gTk9UIFNJR04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGFlJyAgICAgIyAgMHhBRSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YWYnICAgICAjICAweEFGIC0+IE1BQ1JPTgorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMicgICAgICMgIDB4QjIgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGIzJyAgICAgIyAgMHhCMyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiNCcgICAgICMgIDB4QjQgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdceGI2JyAgICAgIyAgMHhCNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEI3IC0+IE1JRERMRSBET1QKKyAgICB1J1x4YjgnICAgICAjICAweEI4IC0+IENFRElMTEEKKyAgICB1J1x4YjknICAgICAjICAweEI5IC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhiYScgICAgICMgIDB4QkEgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJiJyAgICAgIyAgMHhCQiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmMnICAgICAjICAweEJDIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhiZCcgICAgICMgIDB4QkQgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJlJyAgICAgIyAgMHhCRSAtPiBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICB1J1x4YmYnICAgICAjICAweEJGIC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4YzAnICAgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjMScgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjMycgICAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGM0JyAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNicgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x4YzcnICAgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM4JyAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjYScgICAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTFlJyAgICMgIDB4RDAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIEJSRVZFCisgICAgdSdceGQxJyAgICAgIyAgMHhEMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDInICAgICAjICAweEQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkMycgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ0JyAgICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkNScgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ3JyAgICAgIyAgMHhENyAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGQ5JyAgICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDEzMCcgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDE1ZScgICAjICAweERFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdSdceGRmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhlMCcgICAgICMgIDB4RTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMScgICAgICMgIDB4RTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4RTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGUzJyAgICAgIyAgMHhFMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU0JyAgICAgIyAgMHhFNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlNScgICAgICMgIDB4RTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU2JyAgICAgIyAgMHhFNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x4ZTcnICAgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOCcgICAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlOScgICAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlYScgICAgICMgIDB4RUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlYycgICAgICMgIDB4RUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhlZCcgICAgICMgIDB4RUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4RUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHhFRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTFmJyAgICMgIDB4RjAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBCUkVWRQorICAgIHUnXHhmMScgICAgICMgIDB4RjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhmMicgICAgICMgIDB4RjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmMycgICAgICMgIDB4RjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmNCcgICAgICMgIDB4RjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY1JyAgICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4RjcgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHhmOCcgICAgICMgIDB4RjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4ZjknICAgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmEnICAgICAjICAweEZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZmInICAgICAjICAweEZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDEzMScgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkKKyAgICB1J1x1MDE1ZicgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIHUnXHhmZicgICAgICMgIDB4RkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZTI4YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZTI4YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2pvaGFiLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvam9oYWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyYWVlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2pvaGFiLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgam9oYWIucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBKT0hBQgorIworIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KKyMKKworaW1wb3J0IF9jb2RlY3Nfa3IsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2tyLmdldGNvZGVjKCdqb2hhYicpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdqb2hhYicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2pvaGFiLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2pvaGFiLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDdiYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvam9oYWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2pvaGFiLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2pvaGFiLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDdiYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvam9oYWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2tvaThfci5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2tvaThfci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWViODJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mva29pOF9yLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGtvaThfciBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9NSVNDL0tPSTgtUi5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdrb2k4LXInLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHUyNTAwJyAgICMgIDB4ODAgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUwMicgICAjICAweDgxIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTBjJyAgICMgIDB4ODIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1MTAnICAgIyAgMHg4MyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4ODQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTE4JyAgICMgIDB4ODUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgdSdcdTI1MWMnICAgIyAgMHg4NiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MjQnICAgIyAgMHg4NyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjUyYycgICAjICAweDg4IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MzQnICAgIyAgMHg4OSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweDhBIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTgwJyAgICMgIDB4OEIgLT4gVVBQRVIgSEFMRiBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4OEMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHUyNTg4JyAgICMgIDB4OEQgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNThjJyAgICMgIDB4OEUgLT4gTEVGVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1OTAnICAgIyAgMHg4RiAtPiBSSUdIVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1OTEnICAgIyAgMHg5MCAtPiBMSUdIVCBTSEFERQorICAgIHUnXHUyNTkyJyAgICMgIDB4OTEgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1OTMnICAgIyAgMHg5MiAtPiBEQVJLIFNIQURFCisgICAgdSdcdTIzMjAnICAgIyAgMHg5MyAtPiBUT1AgSEFMRiBJTlRFR1JBTAorICAgIHUnXHUyNWEwJyAgICMgIDB4OTQgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdcdTIyMTknICAgIyAgMHg5NSAtPiBCVUxMRVQgT1BFUkFUT1IKKyAgICB1J1x1MjIxYScgICAjICAweDk2IC0+IFNRVUFSRSBST09UCisgICAgdSdcdTIyNDgnICAgIyAgMHg5NyAtPiBBTE1PU1QgRVFVQUwgVE8KKyAgICB1J1x1MjI2NCcgICAjICAweDk4IC0+IExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMjY1JyAgICMgIDB4OTkgLT4gR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdceGEwJyAgICAgIyAgMHg5QSAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUyMzIxJyAgICMgIDB4OUIgLT4gQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICB1J1x4YjAnICAgICAjICAweDlDIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIyJyAgICAgIyAgMHg5RCAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4YjcnICAgICAjICAweDlFIC0+IE1JRERMRSBET1QKKyAgICB1J1x4ZjcnICAgICAjICAweDlGIC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjU1MCcgICAjICAweEEwIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTUxJyAgICMgIDB4QTEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTUyJyAgICMgIDB4QTIgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MDQ1MScgICAjICAweEEzIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJTworICAgIHUnXHUyNTUzJyAgICMgIDB4QTQgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1NCcgICAjICAweEE1IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU1NScgICAjICAweEE2IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjU1NicgICAjICAweEE3IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NycgICAjICAweEE4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTU4JyAgICMgIDB4QTkgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTknICAgIyAgMHhBQSAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1YScgICAjICAweEFCIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NWInICAgIyAgMHhBQyAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTVjJyAgICMgIDB4QUQgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1ZCcgICAjICAweEFFIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x1MjU1ZScgICAjICAweEFGIC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTVmJyAgICMgIDB4QjAgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NjAnICAgIyAgMHhCMSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTYxJyAgICMgIDB4QjIgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MDQwMScgICAjICAweEIzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisgICAgdSdcdTI1NjInICAgIyAgMHhCNCAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTYzJyAgICMgIDB4QjUgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTY0JyAgICMgIDB4QjYgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY1JyAgICMgIDB4QjcgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTY2JyAgICMgIDB4QjggLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjcnICAgIyAgMHhCOSAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY4JyAgICMgIDB4QkEgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU2OScgICAjICAweEJCIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2YScgICAjICAweEJDIC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NmInICAgIyAgMHhCRCAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTZjJyAgICMgIDB4QkUgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHhhOScgICAgICMgIDB4QkYgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MDQ0ZScgICAjICAweEMwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZVQorICAgIHUnXHUwNDMwJyAgICMgIDB4QzEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKyAgICB1J1x1MDQzMScgICAjICAweEMyIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorICAgIHUnXHUwNDQ2JyAgICMgIDB4QzMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRQorICAgIHUnXHUwNDM0JyAgICMgIDB4QzQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERFCisgICAgdSdcdTA0MzUnICAgIyAgMHhDNSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSUUKKyAgICB1J1x1MDQ0NCcgICAjICAweEM2IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorICAgIHUnXHUwNDMzJyAgICMgIDB4QzcgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRQorICAgIHUnXHUwNDQ1JyAgICMgIDB4QzggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisgICAgdSdcdTA0MzgnICAgIyAgMHhDOSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSQorICAgIHUnXHUwNDM5JyAgICMgIDB4Q0EgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkKKyAgICB1J1x1MDQzYScgICAjICAweENCIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBLQQorICAgIHUnXHUwNDNiJyAgICMgIDB4Q0MgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMCisgICAgdSdcdTA0M2MnICAgIyAgMHhDRCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0KKyAgICB1J1x1MDQzZCcgICAjICAweENFIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTgorICAgIHUnXHUwNDNlJyAgICMgIDB4Q0YgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8KKyAgICB1J1x1MDQzZicgICAjICAweEQwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBQRQorICAgIHUnXHUwNDRmJyAgICMgIDB4RDEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCisgICAgdSdcdTA0NDAnICAgIyAgMHhEMiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVIKKyAgICB1J1x1MDQ0MScgICAjICAweEQzIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFUworICAgIHUnXHUwNDQyJyAgICMgIDB4RDQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRFCisgICAgdSdcdTA0NDMnICAgIyAgMHhENSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVQorICAgIHUnXHUwNDM2JyAgICMgIDB4RDYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorICAgIHUnXHUwNDMyJyAgICMgIDB4RDcgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisgICAgdSdcdTA0NGMnICAgIyAgMHhEOCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTA0NGInICAgIyAgMHhEOSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUVSVQorICAgIHUnXHUwNDM3JyAgICMgIDB4REEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisgICAgdSdcdTA0NDgnICAgIyAgMHhEQiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBCisgICAgdSdcdTA0NGQnICAgIyAgMHhEQyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorICAgIHUnXHUwNDQ5JyAgICMgIDB4REQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisgICAgdSdcdTA0NDcnICAgIyAgMHhERSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFCisgICAgdSdcdTA0NGEnICAgIyAgMHhERiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEFSRCBTSUdOCisgICAgdSdcdTA0MmUnICAgIyAgMHhFMCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZVQorICAgIHUnXHUwNDEwJyAgICMgIDB4RTEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnXHUwNDExJyAgICMgIDB4RTIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKyAgICB1J1x1MDQyNicgICAjICAweEUzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorICAgIHUnXHUwNDE0JyAgICMgIDB4RTQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUKKyAgICB1J1x1MDQxNScgICAjICAweEU1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElFCisgICAgdSdcdTA0MjQnICAgIyAgMHhFNiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFRgorICAgIHUnXHUwNDEzJyAgICMgIDB4RTcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFCisgICAgdSdcdTA0MjUnICAgIyAgMHhFOCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQQorICAgIHUnXHUwNDE4JyAgICMgIDB4RTkgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnXHUwNDE5JyAgICMgIDB4RUEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSQorICAgIHUnXHUwNDFhJyAgICMgIDB4RUIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EKKyAgICB1J1x1MDQxYicgICAjICAweEVDIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVMCisgICAgdSdcdTA0MWMnICAgIyAgMHhFRCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTQorICAgIHUnXHUwNDFkJyAgICMgIDB4RUUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4KKyAgICB1J1x1MDQxZScgICAjICAweEVGIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1x1MDQxZicgICAjICAweEYwIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisgICAgdSdcdTA0MmYnICAgIyAgMHhGMSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZQQorICAgIHUnXHUwNDIwJyAgICMgIDB4RjIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKyAgICB1J1x1MDQyMScgICAjICAweEYzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTCisgICAgdSdcdTA0MjInICAgIyAgMHhGNCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBURQorICAgIHUnXHUwNDIzJyAgICMgIDB4RjUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnXHUwNDE2JyAgICMgIDB4RjYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFCisgICAgdSdcdTA0MTInICAgIyAgMHhGNyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRQorICAgIHUnXHUwNDJjJyAgICMgIDB4RjggLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTA0MmInICAgIyAgMHhGOSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZRVJVCisgICAgdSdcdTA0MTcnICAgIyAgMHhGQSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRQorICAgIHUnXHUwNDI4JyAgICMgIDB4RkIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hBCisgICAgdSdcdTA0MmQnICAgIyAgMHhGQyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdcdTA0MjknICAgIyAgMHhGRCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQQorICAgIHUnXHUwNDI3JyAgICMgIDB4RkUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFCisgICAgdSdcdTA0MmEnICAgIyAgMHhGRiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04KKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2tvaThfci5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9rb2k4X3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOWNjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9rb2k4X3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2tvaThfci5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9rb2k4X3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOWNjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9rb2k4X3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2tvaThfdS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2tvaThfdS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTMxN2IxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mva29pOF91LnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGtvaThfdSBnZW5lcmF0ZWQgZnJvbSAncHl0aG9uLW1hcHBpbmdzL0tPSTgtVS5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdrb2k4LXUnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHUyNTAwJyAgICMgIDB4ODAgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUwMicgICAjICAweDgxIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTBjJyAgICMgIDB4ODIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1MTAnICAgIyAgMHg4MyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4ODQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTE4JyAgICMgIDB4ODUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgdSdcdTI1MWMnICAgIyAgMHg4NiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MjQnICAgIyAgMHg4NyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjUyYycgICAjICAweDg4IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MzQnICAgIyAgMHg4OSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweDhBIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTgwJyAgICMgIDB4OEIgLT4gVVBQRVIgSEFMRiBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4OEMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHUyNTg4JyAgICMgIDB4OEQgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNThjJyAgICMgIDB4OEUgLT4gTEVGVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1OTAnICAgIyAgMHg4RiAtPiBSSUdIVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1OTEnICAgIyAgMHg5MCAtPiBMSUdIVCBTSEFERQorICAgIHUnXHUyNTkyJyAgICMgIDB4OTEgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1OTMnICAgIyAgMHg5MiAtPiBEQVJLIFNIQURFCisgICAgdSdcdTIzMjAnICAgIyAgMHg5MyAtPiBUT1AgSEFMRiBJTlRFR1JBTAorICAgIHUnXHUyNWEwJyAgICMgIDB4OTQgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdcdTIyMTknICAgIyAgMHg5NSAtPiBCVUxMRVQgT1BFUkFUT1IKKyAgICB1J1x1MjIxYScgICAjICAweDk2IC0+IFNRVUFSRSBST09UCisgICAgdSdcdTIyNDgnICAgIyAgMHg5NyAtPiBBTE1PU1QgRVFVQUwgVE8KKyAgICB1J1x1MjI2NCcgICAjICAweDk4IC0+IExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMjY1JyAgICMgIDB4OTkgLT4gR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdceGEwJyAgICAgIyAgMHg5QSAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUyMzIxJyAgICMgIDB4OUIgLT4gQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICB1J1x4YjAnICAgICAjICAweDlDIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIyJyAgICAgIyAgMHg5RCAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4YjcnICAgICAjICAweDlFIC0+IE1JRERMRSBET1QKKyAgICB1J1x4ZjcnICAgICAjICAweDlGIC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjU1MCcgICAjICAweEEwIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTUxJyAgICMgIDB4QTEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTUyJyAgICMgIDB4QTIgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MDQ1MScgICAjICAweEEzIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJTworICAgIHUnXHUwNDU0JyAgICMgIDB4QTQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIHUnXHUyNTU0JyAgICMgIDB4QTUgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIHUnXHUwNDU2JyAgICMgIDB4QTYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIHUnXHUwNDU3JyAgICMgIDB4QTcgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlJIChVS1JBSU5JQU4pCisgICAgdSdcdTI1NTcnICAgIyAgMHhBOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjU1OCcgICAjICAweEE5IC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTU5JyAgICMgIDB4QUEgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NWEnICAgIyAgMHhBQiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTViJyAgICMgIDB4QUMgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MDQ5MScgICAjICAweEFEIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBVS1JBSU5JQU4gR0hFIFdJVEggVVBUVVJOCisgICAgdSdcdTI1NWQnICAgIyAgMHhBRSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdcdTI1NWUnICAgIyAgMHhBRiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1ZicgICAjICAweEIwIC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTYwJyAgICMgIDB4QjEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU2MScgICAjICAweEIyIC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTA0MDEnICAgIyAgMHhCMyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJTworICAgIHUnXHUwNDA0JyAgICMgIDB4QjQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgdSdcdTI1NjMnICAgIyAgMHhCNSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTA0MDYnICAgIyAgMHhCNiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEkKKyAgICB1J1x1MDQwNycgICAjICAweEI3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlJIChVS1JBSU5JQU4pCisgICAgdSdcdTI1NjYnICAgIyAgMHhCOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NycgICAjICAweEI5IC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjgnICAgIyAgMHhCQSAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTY5JyAgICMgIDB4QkIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZhJyAgICMgIDB4QkMgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MDQ5MCcgICAjICAweEJEIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFVLUkFJTklBTiBHSEUgV0lUSCBVUFRVUk4KKyAgICB1J1x1MjU2YycgICAjICAweEJFIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x4YTknICAgICAjICAweEJGIC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTA0NGUnICAgIyAgMHhDMCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUKKyAgICB1J1x1MDQzMCcgICAjICAweEMxIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBBCisgICAgdSdcdTA0MzEnICAgIyAgMHhDMiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQkUKKyAgICB1J1x1MDQ0NicgICAjICAweEMzIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBUU0UKKyAgICB1J1x1MDQzNCcgICAjICAweEM0IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBERQorICAgIHUnXHUwNDM1JyAgICMgIDB4QzUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElFCisgICAgdSdcdTA0NDQnICAgIyAgMHhDNiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUYKKyAgICB1J1x1MDQzMycgICAjICAweEM3IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUKKyAgICB1J1x1MDQ0NScgICAjICAweEM4IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBIQQorICAgIHUnXHUwNDM4JyAgICMgIDB4QzkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkKKyAgICB1J1x1MDQzOScgICAjICAweENBIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBJCisgICAgdSdcdTA0M2EnICAgIyAgMHhDQiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0EKKyAgICB1J1x1MDQzYicgICAjICAweENDIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTAorICAgIHUnXHUwNDNjJyAgICMgIDB4Q0QgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVNCisgICAgdSdcdTA0M2QnICAgIyAgMHhDRSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU4KKyAgICB1J1x1MDQzZScgICAjICAweENGIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBPCisgICAgdSdcdTA0M2YnICAgIyAgMHhEMCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgUEUKKyAgICB1J1x1MDQ0ZicgICAjICAweEQxIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZQQorICAgIHUnXHUwNDQwJyAgICMgIDB4RDIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCisgICAgdSdcdTA0NDEnICAgIyAgMHhEMyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKyAgICB1J1x1MDQ0MicgICAjICAweEQ0IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBURQorICAgIHUnXHUwNDQzJyAgICMgIDB4RDUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUKKyAgICB1J1x1MDQzNicgICAjICAweEQ2IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBaSEUKKyAgICB1J1x1MDQzMicgICAjICAweEQ3IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBWRQorICAgIHUnXHUwNDRjJyAgICMgIDB4RDggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNPRlQgU0lHTgorICAgIHUnXHUwNDRiJyAgICMgIDB4RDkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlFUlUKKyAgICB1J1x1MDQzNycgICAjICAweERBIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBaRQorICAgIHUnXHUwNDQ4JyAgICMgIDB4REIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQQorICAgIHUnXHUwNDRkJyAgICMgIDB4REMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEUKKyAgICB1J1x1MDQ0OScgICAjICAweEREIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSENIQQorICAgIHUnXHUwNDQ3JyAgICMgIDB4REUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRQorICAgIHUnXHUwNDRhJyAgICMgIDB4REYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBUkQgU0lHTgorICAgIHUnXHUwNDJlJyAgICMgIDB4RTAgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUKKyAgICB1J1x1MDQxMCcgICAjICAweEUxIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J1x1MDQxMScgICAjICAweEUyIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEJFCisgICAgdSdcdTA0MjYnICAgIyAgMHhFMyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0UKKyAgICB1J1x1MDQxNCcgICAjICAweEU0IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERFCisgICAgdSdcdTA0MTUnICAgIyAgMHhFNSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJRQorICAgIHUnXHUwNDI0JyAgICMgIDB4RTYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUYKKyAgICB1J1x1MDQxMycgICAjICAweEU3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRQorICAgIHUnXHUwNDI1JyAgICMgIDB4RTggLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEEKKyAgICB1J1x1MDQxOCcgICAjICAweEU5IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J1x1MDQxOScgICAjICAweEVBIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkKKyAgICB1J1x1MDQxYScgICAjICAweEVCIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBCisgICAgdSdcdTA0MWInICAgIyAgMHhFQyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTAorICAgIHUnXHUwNDFjJyAgICMgIDB4RUQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU0KKyAgICB1J1x1MDQxZCcgICAjICAweEVFIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVOCisgICAgdSdcdTA0MWUnICAgIyAgMHhFRiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdcdTA0MWYnICAgIyAgMHhGMCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBQRQorICAgIHUnXHUwNDJmJyAgICMgIDB4RjEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUEKKyAgICB1J1x1MDQyMCcgICAjICAweEYyIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVSCisgICAgdSdcdTA0MjEnICAgIyAgMHhGMyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUworICAgIHUnXHUwNDIyJyAgICMgIDB4RjQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVEUKKyAgICB1J1x1MDQyMycgICAjICAweEY1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1x1MDQxNicgICAjICAweEY2IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRQorICAgIHUnXHUwNDEyJyAgICMgIDB4RjcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVkUKKyAgICB1J1x1MDQyYycgICAjICAweEY4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTgorICAgIHUnXHUwNDJiJyAgICMgIDB4RjkgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSVQorICAgIHUnXHUwNDE3JyAgICMgIDB4RkEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkUKKyAgICB1J1x1MDQyOCcgICAjICAweEZCIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQQorICAgIHUnXHUwNDJkJyAgICMgIDB4RkMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnXHUwNDI5JyAgICMgIDB4RkQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hDSEEKKyAgICB1J1x1MDQyNycgICAjICAweEZFIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIENIRQorICAgIHUnXHUwNDJhJyAgICMgIDB4RkYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEFSRCBTSUdOCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9rb2k4X3UucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mva29pOF91LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGI3MDE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mva29pOF91LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9rb2k4X3UucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mva29pOF91LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGI3MDE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mva29pOF91LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9sYXRpbl8xLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbGF0aW5fMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzAxNjBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbGF0aW5fMS5weQpAQCAtMCwwICsxLDUwIEBACisiIiIgUHl0aG9uICdsYXRpbi0xJyBDb2RlYworCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgICMgTm90ZTogQmluZGluZyB0aGVzZSBhcyBDIGZ1bmN0aW9ucyB3aWxsIHJlc3VsdCBpbiB0aGUgY2xhc3Mgbm90CisgICAgIyBjb252ZXJ0aW5nIHRoZW0gdG8gbWV0aG9kcy4gVGhpcyBpcyBpbnRlbmRlZC4KKyAgICBlbmNvZGUgPSBjb2RlY3MubGF0aW5fMV9lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlY3MubGF0aW5fMV9kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5sYXRpbl8xX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5sYXRpbl8xX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycylbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtQ29udmVydGVyKFN0cmVhbVdyaXRlcixTdHJlYW1SZWFkZXIpOgorCisgICAgZW5jb2RlID0gY29kZWNzLmxhdGluXzFfZGVjb2RlCisgICAgZGVjb2RlID0gY29kZWNzLmxhdGluXzFfZW5jb2RlCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvODg1OS0xJywKKyAgICAgICAgZW5jb2RlPUNvZGVjLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9sYXRpbl8xLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2xhdGluXzEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYzFiYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9sYXRpbl8xLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9sYXRpbl8xLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2xhdGluXzEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYzFiYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9sYXRpbl8xLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfYXJhYmljLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2FyYWJpYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTdkM2M1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2FyYWJpYy5weQpAQCAtMCwwICsxLDY5OCBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBnZW5lcmF0ZWQgZnJvbSAnVkVORE9SUy9BUFBMRS9BUkFCSUMuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdtYWMtYXJhYmljJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDA4MDogMHgwMGM0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4MTogMHgwMGEwLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UsIHJpZ2h0LWxlZnQKKyAgICAweDAwODI6IDB4MDBjNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDgzOiAweDAwYzksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwODQ6IDB4MDBkMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDA4NTogMHgwMGQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4NjogMHgwMGRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4NzogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDA4ODogMHgwMGUwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDA4OTogMHgwMGUyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDhhOiAweDAwZTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4YjogMHgwNmJhLCAgICAgIyAgQVJBQklDIExFVFRFUiBOT09OIEdIVU5OQQorICAgIDB4MDA4YzogMHgwMGFiLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUkssIHJpZ2h0LWxlZnQKKyAgICAweDAwOGQ6IDB4MDBlNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4ZTogMHgwMGU5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA4ZjogMHgwMGU4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDA5MDogMHgwMGVhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDkxOiAweDAwZWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5MjogMHgwMGVkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDA5MzogMHgyMDI2LCAgICAgIyAgSE9SSVpPTlRBTCBFTExJUFNJUywgcmlnaHQtbGVmdAorICAgIDB4MDA5NDogMHgwMGVlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk1OiAweDAwZWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5NjogMHgwMGYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDA5NzogMHgwMGYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDA5ODogMHgwMGJiLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLLCByaWdodC1sZWZ0CisgICAgMHgwMDk5OiAweDAwZjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOWE6IDB4MDBmNiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDliOiAweDAwZjcsICAgICAjICBESVZJU0lPTiBTSUdOLCByaWdodC1sZWZ0CisgICAgMHgwMDljOiAweDAwZmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMDlkOiAweDAwZjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMDllOiAweDAwZmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOWY6IDB4MDBmYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGEwOiAweDAwMjAsICAgICAjICBTUEFDRSwgcmlnaHQtbGVmdAorICAgIDB4MDBhMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSywgcmlnaHQtbGVmdAorICAgIDB4MDBhMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUkssIHJpZ2h0LWxlZnQKKyAgICAweDAwYTM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOLCByaWdodC1sZWZ0CisgICAgMHgwMGE0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTiwgcmlnaHQtbGVmdAorICAgIDB4MDBhNTogMHgwNjZhLCAgICAgIyAgQVJBQklDIFBFUkNFTlQgU0lHTgorICAgIDB4MDBhNjogMHgwMDI2LCAgICAgIyAgQU1QRVJTQU5ELCByaWdodC1sZWZ0CisgICAgMHgwMGE3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFLCByaWdodC1sZWZ0CisgICAgMHgwMGE4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTLCByaWdodC1sZWZ0CisgICAgMHgwMGE5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUywgcmlnaHQtbGVmdAorICAgIDB4MDBhYTogMHgwMDJhLCAgICAgIyAgQVNURVJJU0ssIHJpZ2h0LWxlZnQKKyAgICAweDAwYWI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTiwgcmlnaHQtbGVmdAorICAgIDB4MDBhYzogMHgwNjBjLCAgICAgIyAgQVJBQklDIENPTU1BCisgICAgMHgwMGFkOiAweDAwMmQsICAgICAjICBIWVBIRU4tTUlOVVMsIHJpZ2h0LWxlZnQKKyAgICAweDAwYWU6IDB4MDAyZSwgICAgICMgIEZVTEwgU1RPUCwgcmlnaHQtbGVmdAorICAgIDB4MDBhZjogMHgwMDJmLCAgICAgIyAgU09MSURVUywgcmlnaHQtbGVmdAorICAgIDB4MDBiMDogMHgwNjYwLCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFpFUk8sIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwMGIxOiAweDA2NjEsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgT05FLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDBiMjogMHgwNjYyLCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFRXTywgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICAweDAwYjM6IDB4MDY2MywgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBUSFJFRSwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICAweDAwYjQ6IDB4MDY2NCwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBGT1VSLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDBiNTogMHgwNjY1LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIEZJVkUsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwMGI2OiAweDA2NjYsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgU0lYLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDBiNzogMHgwNjY3LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFNFVkVOLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDBiODogMHgwNjY4LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIEVJR0hULCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDBiOTogMHgwNjY5LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIE5JTkUsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwMGJhOiAweDAwM2EsICAgICAjICBDT0xPTiwgcmlnaHQtbGVmdAorICAgIDB4MDBiYjogMHgwNjFiLCAgICAgIyAgQVJBQklDIFNFTUlDT0xPTgorICAgIDB4MDBiYzogMHgwMDNjLCAgICAgIyAgTEVTUy1USEFOIFNJR04sIHJpZ2h0LWxlZnQKKyAgICAweDAwYmQ6IDB4MDAzZCwgICAgICMgIEVRVUFMUyBTSUdOLCByaWdodC1sZWZ0CisgICAgMHgwMGJlOiAweDAwM2UsICAgICAjICBHUkVBVEVSLVRIQU4gU0lHTiwgcmlnaHQtbGVmdAorICAgIDB4MDBiZjogMHgwNjFmLCAgICAgIyAgQVJBQklDIFFVRVNUSU9OIE1BUksKKyAgICAweDAwYzA6IDB4Mjc0YSwgICAgICMgIEVJR0hUIFRFQVJEUk9QLVNQT0tFRCBQUk9QRUxMRVIgQVNURVJJU0ssIHJpZ2h0LWxlZnQKKyAgICAweDAwYzE6IDB4MDYyMSwgICAgICMgIEFSQUJJQyBMRVRURVIgSEFNWkEKKyAgICAweDAwYzI6IDB4MDYyMiwgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIE1BRERBIEFCT1ZFCisgICAgMHgwMGMzOiAweDA2MjMsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBBQk9WRQorICAgIDB4MDBjNDogMHgwNjI0LCAgICAgIyAgQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRQorICAgIDB4MDBjNTogMHgwNjI1LCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQkVMT1cKKyAgICAweDAwYzY6IDB4MDYyNiwgICAgICMgIEFSQUJJQyBMRVRURVIgWUVIIFdJVEggSEFNWkEgQUJPVkUKKyAgICAweDAwYzc6IDB4MDYyNywgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRgorICAgIDB4MDBjODogMHgwNjI4LCAgICAgIyAgQVJBQklDIExFVFRFUiBCRUgKKyAgICAweDAwYzk6IDB4MDYyOSwgICAgICMgIEFSQUJJQyBMRVRURVIgVEVIIE1BUkJVVEEKKyAgICAweDAwY2E6IDB4MDYyYSwgICAgICMgIEFSQUJJQyBMRVRURVIgVEVICisgICAgMHgwMGNiOiAweDA2MmIsICAgICAjICBBUkFCSUMgTEVUVEVSIFRIRUgKKyAgICAweDAwY2M6IDB4MDYyYywgICAgICMgIEFSQUJJQyBMRVRURVIgSkVFTQorICAgIDB4MDBjZDogMHgwNjJkLCAgICAgIyAgQVJBQklDIExFVFRFUiBIQUgKKyAgICAweDAwY2U6IDB4MDYyZSwgICAgICMgIEFSQUJJQyBMRVRURVIgS0hBSAorICAgIDB4MDBjZjogMHgwNjJmLCAgICAgIyAgQVJBQklDIExFVFRFUiBEQUwKKyAgICAweDAwZDA6IDB4MDYzMCwgICAgICMgIEFSQUJJQyBMRVRURVIgVEhBTAorICAgIDB4MDBkMTogMHgwNjMxLCAgICAgIyAgQVJBQklDIExFVFRFUiBSRUgKKyAgICAweDAwZDI6IDB4MDYzMiwgICAgICMgIEFSQUJJQyBMRVRURVIgWkFJTgorICAgIDB4MDBkMzogMHgwNjMzLCAgICAgIyAgQVJBQklDIExFVFRFUiBTRUVOCisgICAgMHgwMGQ0OiAweDA2MzQsICAgICAjICBBUkFCSUMgTEVUVEVSIFNIRUVOCisgICAgMHgwMGQ1OiAweDA2MzUsICAgICAjICBBUkFCSUMgTEVUVEVSIFNBRAorICAgIDB4MDBkNjogMHgwNjM2LCAgICAgIyAgQVJBQklDIExFVFRFUiBEQUQKKyAgICAweDAwZDc6IDB4MDYzNywgICAgICMgIEFSQUJJQyBMRVRURVIgVEFICisgICAgMHgwMGQ4OiAweDA2MzgsICAgICAjICBBUkFCSUMgTEVUVEVSIFpBSAorICAgIDB4MDBkOTogMHgwNjM5LCAgICAgIyAgQVJBQklDIExFVFRFUiBBSU4KKyAgICAweDAwZGE6IDB4MDYzYSwgICAgICMgIEFSQUJJQyBMRVRURVIgR0hBSU4KKyAgICAweDAwZGI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQsIHJpZ2h0LWxlZnQKKyAgICAweDAwZGM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUywgcmlnaHQtbGVmdAorICAgIDB4MDBkZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQsIHJpZ2h0LWxlZnQKKyAgICAweDAwZGU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5ULCByaWdodC1sZWZ0CisgICAgMHgwMGRmOiAweDAwNWYsICAgICAjICBMT1cgTElORSwgcmlnaHQtbGVmdAorICAgIDB4MDBlMDogMHgwNjQwLCAgICAgIyAgQVJBQklDIFRBVFdFRUwKKyAgICAweDAwZTE6IDB4MDY0MSwgICAgICMgIEFSQUJJQyBMRVRURVIgRkVICisgICAgMHgwMGUyOiAweDA2NDIsICAgICAjICBBUkFCSUMgTEVUVEVSIFFBRgorICAgIDB4MDBlMzogMHgwNjQzLCAgICAgIyAgQVJBQklDIExFVFRFUiBLQUYKKyAgICAweDAwZTQ6IDB4MDY0NCwgICAgICMgIEFSQUJJQyBMRVRURVIgTEFNCisgICAgMHgwMGU1OiAweDA2NDUsICAgICAjICBBUkFCSUMgTEVUVEVSIE1FRU0KKyAgICAweDAwZTY6IDB4MDY0NiwgICAgICMgIEFSQUJJQyBMRVRURVIgTk9PTgorICAgIDB4MDBlNzogMHgwNjQ3LCAgICAgIyAgQVJBQklDIExFVFRFUiBIRUgKKyAgICAweDAwZTg6IDB4MDY0OCwgICAgICMgIEFSQUJJQyBMRVRURVIgV0FXCisgICAgMHgwMGU5OiAweDA2NDksICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQQorICAgIDB4MDBlYTogMHgwNjRhLCAgICAgIyAgQVJBQklDIExFVFRFUiBZRUgKKyAgICAweDAwZWI6IDB4MDY0YiwgICAgICMgIEFSQUJJQyBGQVRIQVRBTgorICAgIDB4MDBlYzogMHgwNjRjLCAgICAgIyAgQVJBQklDIERBTU1BVEFOCisgICAgMHgwMGVkOiAweDA2NGQsICAgICAjICBBUkFCSUMgS0FTUkFUQU4KKyAgICAweDAwZWU6IDB4MDY0ZSwgICAgICMgIEFSQUJJQyBGQVRIQQorICAgIDB4MDBlZjogMHgwNjRmLCAgICAgIyAgQVJBQklDIERBTU1BCisgICAgMHgwMGYwOiAweDA2NTAsICAgICAjICBBUkFCSUMgS0FTUkEKKyAgICAweDAwZjE6IDB4MDY1MSwgICAgICMgIEFSQUJJQyBTSEFEREEKKyAgICAweDAwZjI6IDB4MDY1MiwgICAgICMgIEFSQUJJQyBTVUtVTgorICAgIDB4MDBmMzogMHgwNjdlLCAgICAgIyAgQVJBQklDIExFVFRFUiBQRUgKKyAgICAweDAwZjQ6IDB4MDY3OSwgICAgICMgIEFSQUJJQyBMRVRURVIgVFRFSAorICAgIDB4MDBmNTogMHgwNjg2LCAgICAgIyAgQVJBQklDIExFVFRFUiBUQ0hFSAorICAgIDB4MDBmNjogMHgwNmQ1LCAgICAgIyAgQVJBQklDIExFVFRFUiBBRQorICAgIDB4MDBmNzogMHgwNmE0LCAgICAgIyAgQVJBQklDIExFVFRFUiBWRUgKKyAgICAweDAwZjg6IDB4MDZhZiwgICAgICMgIEFSQUJJQyBMRVRURVIgR0FGCisgICAgMHgwMGY5OiAweDA2ODgsICAgICAjICBBUkFCSUMgTEVUVEVSIEREQUwKKyAgICAweDAwZmE6IDB4MDY5MSwgICAgICMgIEFSQUJJQyBMRVRURVIgUlJFSAorICAgIDB4MDBmYjogMHgwMDdiLCAgICAgIyAgTEVGVCBDVVJMWSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgMHgwMGZjOiAweDAwN2MsICAgICAjICBWRVJUSUNBTCBMSU5FLCByaWdodC1sZWZ0CisgICAgMHgwMGZkOiAweDAwN2QsICAgICAjICBSSUdIVCBDVVJMWSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgMHgwMGZlOiAweDA2OTgsICAgICAjICBBUkFCSUMgTEVUVEVSIEpFSAorICAgIDB4MDBmZjogMHgwNmQyLCAgICAgIyAgQVJBQklDIExFVFRFUiBZRUggQkFSUkVFCit9KQorCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMDAwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAxJyAgICAgIyAgMHgwMDAxIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAyJyAgICAgIyAgMHgwMDAyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAzJyAgICAgIyAgMHgwMDAzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA0JyAgICAgIyAgMHgwMDA0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA1JyAgICAgIyAgMHgwMDA1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA2JyAgICAgIyAgMHgwMDA2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA3JyAgICAgIyAgMHgwMDA3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA4JyAgICAgIyAgMHgwMDA4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcdCcgICAgICAgIyAgMHgwMDA5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcbicgICAgICAgIyAgMHgwMDBhIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBiJyAgICAgIyAgMHgwMDBiIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBjJyAgICAgIyAgMHgwMDBjIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdccicgICAgICAgIyAgMHgwMDBkIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBlJyAgICAgIyAgMHgwMDBlIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBmJyAgICAgIyAgMHgwMDBmIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEwJyAgICAgIyAgMHgwMDEwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDExJyAgICAgIyAgMHgwMDExIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEyJyAgICAgIyAgMHgwMDEyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEzJyAgICAgIyAgMHgwMDEzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE0JyAgICAgIyAgMHgwMDE0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE1JyAgICAgIyAgMHgwMDE1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE2JyAgICAgIyAgMHgwMDE2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE3JyAgICAgIyAgMHgwMDE3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE4JyAgICAgIyAgMHgwMDE4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE5JyAgICAgIyAgMHgwMDE5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFhJyAgICAgIyAgMHgwMDFhIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFiJyAgICAgIyAgMHgwMDFiIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFjJyAgICAgIyAgMHgwMDFjIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFkJyAgICAgIyAgMHgwMDFkIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFlJyAgICAgIyAgMHgwMDFlIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFmJyAgICAgIyAgMHgwMDFmIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdScgJyAgICAgICAgIyAgMHgwMDIwIC0+IFNQQUNFLCBsZWZ0LXJpZ2h0CisgICAgdSchJyAgICAgICAgIyAgMHgwMDIxIC0+IEVYQ0xBTUFUSU9OIE1BUkssIGxlZnQtcmlnaHQKKyAgICB1JyInICAgICAgICAjICAweDAwMjIgLT4gUVVPVEFUSU9OIE1BUkssIGxlZnQtcmlnaHQKKyAgICB1JyMnICAgICAgICAjICAweDAwMjMgLT4gTlVNQkVSIFNJR04sIGxlZnQtcmlnaHQKKyAgICB1JyQnICAgICAgICAjICAweDAwMjQgLT4gRE9MTEFSIFNJR04sIGxlZnQtcmlnaHQKKyAgICB1JyUnICAgICAgICAjICAweDAwMjUgLT4gUEVSQ0VOVCBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgdScmJyAgICAgICAgIyAgMHgwMDI2IC0+IEFNUEVSU0FORCwgbGVmdC1yaWdodAorICAgIHUiJyIgICAgICAgICMgIDB4MDAyNyAtPiBBUE9TVFJPUEhFLCBsZWZ0LXJpZ2h0CisgICAgdScoJyAgICAgICAgIyAgMHgwMDI4IC0+IExFRlQgUEFSRU5USEVTSVMsIGxlZnQtcmlnaHQKKyAgICB1JyknICAgICAgICAjICAweDAwMjkgLT4gUklHSFQgUEFSRU5USEVTSVMsIGxlZnQtcmlnaHQKKyAgICB1JyonICAgICAgICAjICAweDAwMmEgLT4gQVNURVJJU0ssIGxlZnQtcmlnaHQKKyAgICB1JysnICAgICAgICAjICAweDAwMmIgLT4gUExVUyBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgdScsJyAgICAgICAgIyAgMHgwMDJjIC0+IENPTU1BLCBsZWZ0LXJpZ2h0OyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NkMgQVJBQklDIFRIT1VTQU5EUyBTRVBBUkFUT1IKKyAgICB1Jy0nICAgICAgICAjICAweDAwMmQgLT4gSFlQSEVOLU1JTlVTLCBsZWZ0LXJpZ2h0CisgICAgdScuJyAgICAgICAgIyAgMHgwMDJlIC0+IEZVTEwgU1RPUCwgbGVmdC1yaWdodDsgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjZCIEFSQUJJQyBERUNJTUFMIFNFUEFSQVRPUgorICAgIHUnLycgICAgICAgICMgIDB4MDAyZiAtPiBTT0xJRFVTLCBsZWZ0LXJpZ2h0CisgICAgdScwJyAgICAgICAgIyAgMHgwMDMwIC0+IERJR0lUIFpFUk87ICBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjAgQVJBQklDLUlORElDIERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDAwMzEgLT4gRElHSVQgT05FOyAgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2MSBBUkFCSUMtSU5ESUMgRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgwMDMyIC0+IERJR0lUIFRXTzsgICBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjIgQVJBQklDLUlORElDIERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MDAzMyAtPiBESUdJVCBUSFJFRTsgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjYzIEFSQUJJQy1JTkRJQyBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MDAzNCAtPiBESUdJVCBGT1VSOyAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjY0IEFSQUJJQy1JTkRJQyBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgwMDM1IC0+IERJR0lUIEZJVkU7ICBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjUgQVJBQklDLUlORElDIERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDAwMzYgLT4gRElHSVQgU0lYOyAgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2NiBBUkFCSUMtSU5ESUMgRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgwMDM3IC0+IERJR0lUIFNFVkVOOyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjcgQVJBQklDLUlORElDIERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgwMDM4IC0+IERJR0lUIEVJR0hUOyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjggQVJBQklDLUlORElDIERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgwMDM5IC0+IERJR0lUIE5JTkU7ICBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjkgQVJBQklDLUlORElDIERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDAwM2EgLT4gQ09MT04sIGxlZnQtcmlnaHQKKyAgICB1JzsnICAgICAgICAjICAweDAwM2IgLT4gU0VNSUNPTE9OLCBsZWZ0LXJpZ2h0CisgICAgdSc8JyAgICAgICAgIyAgMHgwMDNjIC0+IExFU1MtVEhBTiBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgdSc9JyAgICAgICAgIyAgMHgwMDNkIC0+IEVRVUFMUyBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgdSc+JyAgICAgICAgIyAgMHgwMDNlIC0+IEdSRUFURVItVEhBTiBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgdSc/JyAgICAgICAgIyAgMHgwMDNmIC0+IFFVRVNUSU9OIE1BUkssIGxlZnQtcmlnaHQKKyAgICB1J0AnICAgICAgICAjICAweDAwNDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4MDA0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHgwMDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDAwNDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4MDA0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHgwMDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDAwNDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4MDA0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHgwMDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDAwNDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4MDA0YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHgwMDRiIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDAwNGMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4MDA0ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHgwMDRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDAwNGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4MDA1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHgwMDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDAwNTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4MDA1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHgwMDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDAwNTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4MDA1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHgwMDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDAwNTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4MDA1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHgwMDVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDAwNWIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVCwgbGVmdC1yaWdodAorICAgIHUnXFwnICAgICAgICMgIDB4MDA1YyAtPiBSRVZFUlNFIFNPTElEVVMsIGxlZnQtcmlnaHQKKyAgICB1J10nICAgICAgICAjICAweDAwNWQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQsIGxlZnQtcmlnaHQKKyAgICB1J14nICAgICAgICAjICAweDAwNWUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQsIGxlZnQtcmlnaHQKKyAgICB1J18nICAgICAgICAjICAweDAwNWYgLT4gTE9XIExJTkUsIGxlZnQtcmlnaHQKKyAgICB1J2AnICAgICAgICAjICAweDAwNjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHgwMDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHgwMDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHgwMDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHgwMDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHgwMDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHgwMDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHgwMDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHgwMDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHgwMDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHgwMDZhIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHgwMDZiIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHgwMDZjIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHgwMDZkIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHgwMDZlIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHgwMDZmIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHgwMDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHgwMDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHgwMDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHgwMDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHgwMDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHgwMDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHgwMDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHgwMDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHgwMDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHgwMDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHgwMDdhIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHgwMDdiIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVCwgbGVmdC1yaWdodAorICAgIHUnfCcgICAgICAgICMgIDB4MDA3YyAtPiBWRVJUSUNBTCBMSU5FLCBsZWZ0LXJpZ2h0CisgICAgdSd9JyAgICAgICAgIyAgMHgwMDdkIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQsIGxlZnQtcmlnaHQKKyAgICB1J34nICAgICAgICAjICAweDAwN2UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDAwN2YgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4YzQnICAgICAjICAweDAwODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhhMCcgICAgICMgIDB4MDA4MSAtPiBOTy1CUkVBSyBTUEFDRSwgcmlnaHQtbGVmdAorICAgIHUnXHhjNycgICAgICMgIDB4MDA4MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhjOScgICAgICMgIDB4MDA4MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZDEnICAgICAjICAweDAwODQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHgwMDg1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGMnICAgICAjICAweDAwODYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMScgICAgICMgIDB4MDA4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUwJyAgICAgIyAgMHgwMDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTInICAgICAjICAweDAwODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU0JyAgICAgIyAgMHgwMDhhIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTA2YmEnICAgIyAgMHgwMDhiIC0+IEFSQUJJQyBMRVRURVIgTk9PTiBHSFVOTkEKKyAgICB1J1x4YWInICAgICAjICAweDAwOGMgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUkssIHJpZ2h0LWxlZnQKKyAgICB1J1x4ZTcnICAgICAjICAweDAwOGQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGU5JyAgICAgIyAgMHgwMDhlIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTgnICAgICAjICAweDAwOGYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlYScgICAgICMgIDB4MDA5MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweDAwOTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWQnICAgICAjICAweDAwOTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHUyMDI2JyAgICMgIDB4MDA5MyAtPiBIT1JJWk9OVEFMIEVMTElQU0lTLCByaWdodC1sZWZ0CisgICAgdSdceGVlJyAgICAgIyAgMHgwMDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4MDA5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMScgICAgICMgIDB4MDA5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGYzJyAgICAgIyAgMHgwMDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4YmInICAgICAjICAweDAwOTggLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLLCByaWdodC1sZWZ0CisgICAgdSdceGY0JyAgICAgIyAgMHgwMDk5IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNicgICAgICMgIDB4MDA5YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4MDA5YiAtPiBESVZJU0lPTiBTSUdOLCByaWdodC1sZWZ0CisgICAgdSdceGZhJyAgICAgIyAgMHgwMDljIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZjknICAgICAjICAweDAwOWQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYicgICAgICMgIDB4MDA5ZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweDAwOWYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1JyAnICAgICAgICAjICAweDAwYTAgLT4gU1BBQ0UsIHJpZ2h0LWxlZnQKKyAgICB1JyEnICAgICAgICAjICAweDAwYTEgLT4gRVhDTEFNQVRJT04gTUFSSywgcmlnaHQtbGVmdAorICAgIHUnIicgICAgICAgICMgIDB4MDBhMiAtPiBRVU9UQVRJT04gTUFSSywgcmlnaHQtbGVmdAorICAgIHUnIycgICAgICAgICMgIDB4MDBhMyAtPiBOVU1CRVIgU0lHTiwgcmlnaHQtbGVmdAorICAgIHUnJCcgICAgICAgICMgIDB4MDBhNCAtPiBET0xMQVIgU0lHTiwgcmlnaHQtbGVmdAorICAgIHUnXHUwNjZhJyAgICMgIDB4MDBhNSAtPiBBUkFCSUMgUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgwMGE2IC0+IEFNUEVSU0FORCwgcmlnaHQtbGVmdAorICAgIHUiJyIgICAgICAgICMgIDB4MDBhNyAtPiBBUE9TVFJPUEhFLCByaWdodC1sZWZ0CisgICAgdScoJyAgICAgICAgIyAgMHgwMGE4IC0+IExFRlQgUEFSRU5USEVTSVMsIHJpZ2h0LWxlZnQKKyAgICB1JyknICAgICAgICAjICAweDAwYTkgLT4gUklHSFQgUEFSRU5USEVTSVMsIHJpZ2h0LWxlZnQKKyAgICB1JyonICAgICAgICAjICAweDAwYWEgLT4gQVNURVJJU0ssIHJpZ2h0LWxlZnQKKyAgICB1JysnICAgICAgICAjICAweDAwYWIgLT4gUExVUyBTSUdOLCByaWdodC1sZWZ0CisgICAgdSdcdTA2MGMnICAgIyAgMHgwMGFjIC0+IEFSQUJJQyBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MDBhZCAtPiBIWVBIRU4tTUlOVVMsIHJpZ2h0LWxlZnQKKyAgICB1Jy4nICAgICAgICAjICAweDAwYWUgLT4gRlVMTCBTVE9QLCByaWdodC1sZWZ0CisgICAgdScvJyAgICAgICAgIyAgMHgwMGFmIC0+IFNPTElEVVMsIHJpZ2h0LWxlZnQKKyAgICB1J1x1MDY2MCcgICAjICAweDAwYjAgLT4gQVJBQklDLUlORElDIERJR0lUIFpFUk8sIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSdcdTA2NjEnICAgIyAgMHgwMGIxIC0+IEFSQUJJQy1JTkRJQyBESUdJVCBPTkUsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSdcdTA2NjInICAgIyAgMHgwMGIyIC0+IEFSQUJJQy1JTkRJQyBESUdJVCBUV08sIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSdcdTA2NjMnICAgIyAgMHgwMGIzIC0+IEFSQUJJQy1JTkRJQyBESUdJVCBUSFJFRSwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDY2NCcgICAjICAweDAwYjQgLT4gQVJBQklDLUlORElDIERJR0lUIEZPVVIsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSdcdTA2NjUnICAgIyAgMHgwMGI1IC0+IEFSQUJJQy1JTkRJQyBESUdJVCBGSVZFLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIHUnXHUwNjY2JyAgICMgIDB4MDBiNiAtPiBBUkFCSUMtSU5ESUMgRElHSVQgU0lYLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIHUnXHUwNjY3JyAgICMgIDB4MDBiNyAtPiBBUkFCSUMtSU5ESUMgRElHSVQgU0VWRU4sIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSdcdTA2NjgnICAgIyAgMHgwMGI4IC0+IEFSQUJJQy1JTkRJQyBESUdJVCBFSUdIVCwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDY2OScgICAjICAweDAwYjkgLT4gQVJBQklDLUlORElDIERJR0lUIE5JTkUsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSc6JyAgICAgICAgIyAgMHgwMGJhIC0+IENPTE9OLCByaWdodC1sZWZ0CisgICAgdSdcdTA2MWInICAgIyAgMHgwMGJiIC0+IEFSQUJJQyBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDAwYmMgLT4gTEVTUy1USEFOIFNJR04sIHJpZ2h0LWxlZnQKKyAgICB1Jz0nICAgICAgICAjICAweDAwYmQgLT4gRVFVQUxTIFNJR04sIHJpZ2h0LWxlZnQKKyAgICB1Jz4nICAgICAgICAjICAweDAwYmUgLT4gR1JFQVRFUi1USEFOIFNJR04sIHJpZ2h0LWxlZnQKKyAgICB1J1x1MDYxZicgICAjICAweDAwYmYgLT4gQVJBQklDIFFVRVNUSU9OIE1BUksKKyAgICB1J1x1Mjc0YScgICAjICAweDAwYzAgLT4gRUlHSFQgVEVBUkRST1AtU1BPS0VEIFBST1BFTExFUiBBU1RFUklTSywgcmlnaHQtbGVmdAorICAgIHUnXHUwNjIxJyAgICMgIDB4MDBjMSAtPiBBUkFCSUMgTEVUVEVSIEhBTVpBCisgICAgdSdcdTA2MjInICAgIyAgMHgwMGMyIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIE1BRERBIEFCT1ZFCisgICAgdSdcdTA2MjMnICAgIyAgMHgwMGMzIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEFCT1ZFCisgICAgdSdcdTA2MjQnICAgIyAgMHgwMGM0IC0+IEFSQUJJQyBMRVRURVIgV0FXIFdJVEggSEFNWkEgQUJPVkUKKyAgICB1J1x1MDYyNScgICAjICAweDAwYzUgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQkVMT1cKKyAgICB1J1x1MDYyNicgICAjICAweDAwYzYgLT4gQVJBQklDIExFVFRFUiBZRUggV0lUSCBIQU1aQSBBQk9WRQorICAgIHUnXHUwNjI3JyAgICMgIDB4MDBjNyAtPiBBUkFCSUMgTEVUVEVSIEFMRUYKKyAgICB1J1x1MDYyOCcgICAjICAweDAwYzggLT4gQVJBQklDIExFVFRFUiBCRUgKKyAgICB1J1x1MDYyOScgICAjICAweDAwYzkgLT4gQVJBQklDIExFVFRFUiBURUggTUFSQlVUQQorICAgIHUnXHUwNjJhJyAgICMgIDB4MDBjYSAtPiBBUkFCSUMgTEVUVEVSIFRFSAorICAgIHUnXHUwNjJiJyAgICMgIDB4MDBjYiAtPiBBUkFCSUMgTEVUVEVSIFRIRUgKKyAgICB1J1x1MDYyYycgICAjICAweDAwY2MgLT4gQVJBQklDIExFVFRFUiBKRUVNCisgICAgdSdcdTA2MmQnICAgIyAgMHgwMGNkIC0+IEFSQUJJQyBMRVRURVIgSEFICisgICAgdSdcdTA2MmUnICAgIyAgMHgwMGNlIC0+IEFSQUJJQyBMRVRURVIgS0hBSAorICAgIHUnXHUwNjJmJyAgICMgIDB4MDBjZiAtPiBBUkFCSUMgTEVUVEVSIERBTAorICAgIHUnXHUwNjMwJyAgICMgIDB4MDBkMCAtPiBBUkFCSUMgTEVUVEVSIFRIQUwKKyAgICB1J1x1MDYzMScgICAjICAweDAwZDEgLT4gQVJBQklDIExFVFRFUiBSRUgKKyAgICB1J1x1MDYzMicgICAjICAweDAwZDIgLT4gQVJBQklDIExFVFRFUiBaQUlOCisgICAgdSdcdTA2MzMnICAgIyAgMHgwMGQzIC0+IEFSQUJJQyBMRVRURVIgU0VFTgorICAgIHUnXHUwNjM0JyAgICMgIDB4MDBkNCAtPiBBUkFCSUMgTEVUVEVSIFNIRUVOCisgICAgdSdcdTA2MzUnICAgIyAgMHgwMGQ1IC0+IEFSQUJJQyBMRVRURVIgU0FECisgICAgdSdcdTA2MzYnICAgIyAgMHgwMGQ2IC0+IEFSQUJJQyBMRVRURVIgREFECisgICAgdSdcdTA2MzcnICAgIyAgMHgwMGQ3IC0+IEFSQUJJQyBMRVRURVIgVEFICisgICAgdSdcdTA2MzgnICAgIyAgMHgwMGQ4IC0+IEFSQUJJQyBMRVRURVIgWkFICisgICAgdSdcdTA2MzknICAgIyAgMHgwMGQ5IC0+IEFSQUJJQyBMRVRURVIgQUlOCisgICAgdSdcdTA2M2EnICAgIyAgMHgwMGRhIC0+IEFSQUJJQyBMRVRURVIgR0hBSU4KKyAgICB1J1snICAgICAgICAjICAweDAwZGIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVCwgcmlnaHQtbGVmdAorICAgIHUnXFwnICAgICAgICMgIDB4MDBkYyAtPiBSRVZFUlNFIFNPTElEVVMsIHJpZ2h0LWxlZnQKKyAgICB1J10nICAgICAgICAjICAweDAwZGQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQsIHJpZ2h0LWxlZnQKKyAgICB1J14nICAgICAgICAjICAweDAwZGUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQsIHJpZ2h0LWxlZnQKKyAgICB1J18nICAgICAgICAjICAweDAwZGYgLT4gTE9XIExJTkUsIHJpZ2h0LWxlZnQKKyAgICB1J1x1MDY0MCcgICAjICAweDAwZTAgLT4gQVJBQklDIFRBVFdFRUwKKyAgICB1J1x1MDY0MScgICAjICAweDAwZTEgLT4gQVJBQklDIExFVFRFUiBGRUgKKyAgICB1J1x1MDY0MicgICAjICAweDAwZTIgLT4gQVJBQklDIExFVFRFUiBRQUYKKyAgICB1J1x1MDY0MycgICAjICAweDAwZTMgLT4gQVJBQklDIExFVFRFUiBLQUYKKyAgICB1J1x1MDY0NCcgICAjICAweDAwZTQgLT4gQVJBQklDIExFVFRFUiBMQU0KKyAgICB1J1x1MDY0NScgICAjICAweDAwZTUgLT4gQVJBQklDIExFVFRFUiBNRUVNCisgICAgdSdcdTA2NDYnICAgIyAgMHgwMGU2IC0+IEFSQUJJQyBMRVRURVIgTk9PTgorICAgIHUnXHUwNjQ3JyAgICMgIDB4MDBlNyAtPiBBUkFCSUMgTEVUVEVSIEhFSAorICAgIHUnXHUwNjQ4JyAgICMgIDB4MDBlOCAtPiBBUkFCSUMgTEVUVEVSIFdBVworICAgIHUnXHUwNjQ5JyAgICMgIDB4MDBlOSAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQQorICAgIHUnXHUwNjRhJyAgICMgIDB4MDBlYSAtPiBBUkFCSUMgTEVUVEVSIFlFSAorICAgIHUnXHUwNjRiJyAgICMgIDB4MDBlYiAtPiBBUkFCSUMgRkFUSEFUQU4KKyAgICB1J1x1MDY0YycgICAjICAweDAwZWMgLT4gQVJBQklDIERBTU1BVEFOCisgICAgdSdcdTA2NGQnICAgIyAgMHgwMGVkIC0+IEFSQUJJQyBLQVNSQVRBTgorICAgIHUnXHUwNjRlJyAgICMgIDB4MDBlZSAtPiBBUkFCSUMgRkFUSEEKKyAgICB1J1x1MDY0ZicgICAjICAweDAwZWYgLT4gQVJBQklDIERBTU1BCisgICAgdSdcdTA2NTAnICAgIyAgMHgwMGYwIC0+IEFSQUJJQyBLQVNSQQorICAgIHUnXHUwNjUxJyAgICMgIDB4MDBmMSAtPiBBUkFCSUMgU0hBRERBCisgICAgdSdcdTA2NTInICAgIyAgMHgwMGYyIC0+IEFSQUJJQyBTVUtVTgorICAgIHUnXHUwNjdlJyAgICMgIDB4MDBmMyAtPiBBUkFCSUMgTEVUVEVSIFBFSAorICAgIHUnXHUwNjc5JyAgICMgIDB4MDBmNCAtPiBBUkFCSUMgTEVUVEVSIFRURUgKKyAgICB1J1x1MDY4NicgICAjICAweDAwZjUgLT4gQVJBQklDIExFVFRFUiBUQ0hFSAorICAgIHUnXHUwNmQ1JyAgICMgIDB4MDBmNiAtPiBBUkFCSUMgTEVUVEVSIEFFCisgICAgdSdcdTA2YTQnICAgIyAgMHgwMGY3IC0+IEFSQUJJQyBMRVRURVIgVkVICisgICAgdSdcdTA2YWYnICAgIyAgMHgwMGY4IC0+IEFSQUJJQyBMRVRURVIgR0FGCisgICAgdSdcdTA2ODgnICAgIyAgMHgwMGY5IC0+IEFSQUJJQyBMRVRURVIgRERBTAorICAgIHUnXHUwNjkxJyAgICMgIDB4MDBmYSAtPiBBUkFCSUMgTEVUVEVSIFJSRUgKKyAgICB1J3snICAgICAgICAjICAweDAwZmIgLT4gTEVGVCBDVVJMWSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgdSd8JyAgICAgICAgIyAgMHgwMGZjIC0+IFZFUlRJQ0FMIExJTkUsIHJpZ2h0LWxlZnQKKyAgICB1J30nICAgICAgICAjICAweDAwZmQgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVCwgcmlnaHQtbGVmdAorICAgIHUnXHUwNjk4JyAgICMgIDB4MDBmZSAtPiBBUkFCSUMgTEVUVEVSIEpFSAorICAgIHUnXHUwNmQyJyAgICMgIDB4MDBmZiAtPiBBUkFCSUMgTEVUVEVSIFlFSCBCQVJSRUUKKykKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSB7CisgICAgMHgwMDAwOiAweDAwMDAsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMDI6IDB4MDAwMiwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDAzOiAweDAwMDMsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAwNDogMHgwMDA0LCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDA2OiAweDAwMDYsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAwNzogMHgwMDA3LCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMDg6IDB4MDAwOCwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDA5OiAweDAwMDksICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMGI6IDB4MDAwYiwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAwZDogMHgwMDBkLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMGU6IDB4MDAwZSwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMTE6IDB4MDAxMSwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAxMzogMHgwMDEzLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMTQ6IDB4MDAxNCwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMTc6IDB4MDAxNywgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDE4OiAweDAwMTgsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAxOTogMHgwMDE5LCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMWE6IDB4MDAxYSwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAxYzogMHgwMDFjLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMWQ6IDB4MDAxZCwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDFlOiAweDAwMWUsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAxZjogMHgwMDFmLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMjA6IDB4MDAyMCwgICAgICMgIFNQQUNFLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDIwOiAweDAwYTAsICAgICAjICBTUEFDRSwgcmlnaHQtbGVmdAorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSywgbGVmdC1yaWdodAorICAgIDB4MDAyMTogMHgwMGExLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSywgcmlnaHQtbGVmdAorICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUkssIGxlZnQtcmlnaHQKKyAgICAweDAwMjI6IDB4MDBhMiwgICAgICMgIFFVT1RBVElPTiBNQVJLLCByaWdodC1sZWZ0CisgICAgMHgwMDIzOiAweDAwMjMsICAgICAjICBOVU1CRVIgU0lHTiwgbGVmdC1yaWdodAorICAgIDB4MDAyMzogMHgwMGEzLCAgICAgIyAgTlVNQkVSIFNJR04sIHJpZ2h0LWxlZnQKKyAgICAweDAwMjQ6IDB4MDAyNCwgICAgICMgIERPTExBUiBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDI0OiAweDAwYTQsICAgICAjICBET0xMQVIgU0lHTiwgcmlnaHQtbGVmdAorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQsIGxlZnQtcmlnaHQKKyAgICAweDAwMjY6IDB4MDBhNiwgICAgICMgIEFNUEVSU0FORCwgcmlnaHQtbGVmdAorICAgIDB4MDAyNzogMHgwMDI3LCAgICAgIyAgQVBPU1RST1BIRSwgbGVmdC1yaWdodAorICAgIDB4MDAyNzogMHgwMGE3LCAgICAgIyAgQVBPU1RST1BIRSwgcmlnaHQtbGVmdAorICAgIDB4MDAyODogMHgwMDI4LCAgICAgIyAgTEVGVCBQQVJFTlRIRVNJUywgbGVmdC1yaWdodAorICAgIDB4MDAyODogMHgwMGE4LCAgICAgIyAgTEVGVCBQQVJFTlRIRVNJUywgcmlnaHQtbGVmdAorICAgIDB4MDAyOTogMHgwMDI5LCAgICAgIyAgUklHSFQgUEFSRU5USEVTSVMsIGxlZnQtcmlnaHQKKyAgICAweDAwMjk6IDB4MDBhOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTLCByaWdodC1sZWZ0CisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSywgbGVmdC1yaWdodAorICAgIDB4MDAyYTogMHgwMGFhLCAgICAgIyAgQVNURVJJU0ssIHJpZ2h0LWxlZnQKKyAgICAweDAwMmI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTiwgbGVmdC1yaWdodAorICAgIDB4MDAyYjogMHgwMGFiLCAgICAgIyAgUExVUyBTSUdOLCByaWdodC1sZWZ0CisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQSwgbGVmdC1yaWdodDsgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjZDIEFSQUJJQyBUSE9VU0FORFMgU0VQQVJBVE9SCisgICAgMHgwMDJkOiAweDAwMmQsICAgICAjICBIWVBIRU4tTUlOVVMsIGxlZnQtcmlnaHQKKyAgICAweDAwMmQ6IDB4MDBhZCwgICAgICMgIEhZUEhFTi1NSU5VUywgcmlnaHQtbGVmdAorICAgIDB4MDAyZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QLCBsZWZ0LXJpZ2h0OyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NkIgQVJBQklDIERFQ0lNQUwgU0VQQVJBVE9SCisgICAgMHgwMDJlOiAweDAwYWUsICAgICAjICBGVUxMIFNUT1AsIHJpZ2h0LWxlZnQKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMsIGxlZnQtcmlnaHQKKyAgICAweDAwMmY6IDB4MDBhZiwgICAgICMgIFNPTElEVVMsIHJpZ2h0LWxlZnQKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk87ICBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjAgQVJBQklDLUlORElDIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORTsgICBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjEgQVJBQklDLUlORElDIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPOyAgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2MiBBUkFCSUMtSU5ESUMgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRTsgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjYzIEFSQUJJQy1JTkRJQyBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUjsgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2NCBBUkFCSUMtSU5ESUMgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRTsgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2NSBBUkFCSUMtSU5ESUMgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYOyAgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2NiBBUkFCSUMtSU5ESUMgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTjsgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjY3IEFSQUJJQy1JTkRJQyBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQ7IGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2OCBBUkFCSUMtSU5ESUMgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkU7ICBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjkgQVJBQklDLUlORElDIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDNhOiAweDAwYmEsICAgICAjICBDT0xPTiwgcmlnaHQtbGVmdAorICAgIDB4MDAzYjogMHgwMDNiLCAgICAgIyAgU0VNSUNPTE9OLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDNjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTiwgbGVmdC1yaWdodAorICAgIDB4MDAzYzogMHgwMGJjLCAgICAgIyAgTEVTUy1USEFOIFNJR04sIHJpZ2h0LWxlZnQKKyAgICAweDAwM2Q6IDB4MDAzZCwgICAgICMgIEVRVUFMUyBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDNkOiAweDAwYmQsICAgICAjICBFUVVBTFMgU0lHTiwgcmlnaHQtbGVmdAorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04sIGxlZnQtcmlnaHQKKyAgICAweDAwM2U6IDB4MDBiZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOLCByaWdodC1sZWZ0CisgICAgMHgwMDNmOiAweDAwM2YsICAgICAjICBRVUVTVElPTiBNQVJLLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDQwOiAweDAwNDAsICAgICAjICBDT01NRVJDSUFMIEFUCisgICAgMHgwMDQxOiAweDAwNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMDQyOiAweDAwNDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgMHgwMDQzOiAweDAwNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgMHgwMDQ0OiAweDAwNDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgMHgwMDQ1OiAweDAwNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwMDQ2OiAweDAwNDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgMHgwMDQ3OiAweDAwNDcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgMHgwMDQ4OiAweDAwNDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgMHgwMDQ5OiAweDAwNDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMDRhOiAweDAwNGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgMHgwMDRiOiAweDAwNGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgMHgwMDRjOiAweDAwNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgMHgwMDRkOiAweDAwNGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgMHgwMDRlOiAweDAwNGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgMHgwMDRmOiAweDAwNGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDUwOiAweDAwNTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgMHgwMDUxOiAweDAwNTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgMHgwMDUyOiAweDAwNTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgMHgwMDUzOiAweDAwNTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgMHgwMDU0OiAweDAwNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgMHgwMDU1OiAweDAwNTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDU2OiAweDAwNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgMHgwMDU3OiAweDAwNTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgMHgwMDU4OiAweDAwNTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgMHgwMDU5OiAweDAwNTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgMHgwMDVhOiAweDAwNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgMHgwMDViOiAweDAwNWIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VULCBsZWZ0LXJpZ2h0CisgICAgMHgwMDViOiAweDAwZGIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgMHgwMDVjOiAweDAwNWMsICAgICAjICBSRVZFUlNFIFNPTElEVVMsIGxlZnQtcmlnaHQKKyAgICAweDAwNWM6IDB4MDBkYywgICAgICMgIFJFVkVSU0UgU09MSURVUywgcmlnaHQtbGVmdAorICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQsIGxlZnQtcmlnaHQKKyAgICAweDAwNWQ6IDB4MDBkZCwgICAgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgMHgwMDVlOiAweDAwNWUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVCwgbGVmdC1yaWdodAorICAgIDB4MDA1ZTogMHgwMGRlLCAgICAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQsIHJpZ2h0LWxlZnQKKyAgICAweDAwNWY6IDB4MDA1ZiwgICAgICMgIExPVyBMSU5FLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDVmOiAweDAwZGYsICAgICAjICBMT1cgTElORSwgcmlnaHQtbGVmdAorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVCwgbGVmdC1yaWdodAorICAgIDB4MDA3YjogMHgwMGZiLCAgICAgIyAgTEVGVCBDVVJMWSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgMHgwMDdjOiAweDAwN2MsICAgICAjICBWRVJUSUNBTCBMSU5FLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDdjOiAweDAwZmMsICAgICAjICBWRVJUSUNBTCBMSU5FLCByaWdodC1sZWZ0CisgICAgMHgwMDdkOiAweDAwN2QsICAgICAjICBSSUdIVCBDVVJMWSBCUkFDS0VULCBsZWZ0LXJpZ2h0CisgICAgMHgwMDdkOiAweDAwZmQsICAgICAjICBSSUdIVCBDVVJMWSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgMHgwMDdlOiAweDAwN2UsICAgICAjICBUSUxERQorICAgIDB4MDA3ZjogMHgwMDdmLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwYTA6IDB4MDA4MSwgICAgICMgIE5PLUJSRUFLIFNQQUNFLCByaWdodC1sZWZ0CisgICAgMHgwMGFiOiAweDAwOGMsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSywgcmlnaHQtbGVmdAorICAgIDB4MDBiYjogMHgwMDk4LCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLLCByaWdodC1sZWZ0CisgICAgMHgwMGM0OiAweDAwODAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGM3OiAweDAwODIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBjOTogMHgwMDgzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGQxOiAweDAwODQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwZDY6IDB4MDA4NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZGM6IDB4MDA4NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZTA6IDB4MDA4OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwZTE6IDB4MDA4NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwZTI6IDB4MDA4OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlNDogMHgwMDhhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZTc6IDB4MDA4ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBlODogMHgwMDhmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBlOTogMHgwMDhlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDBlYTogMHgwMDkwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGViOiAweDAwOTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlZDogMHgwMDkyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBlZTogMHgwMDk0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGVmOiAweDAwOTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmMTogMHgwMDk2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBmMzogMHgwMDk3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBmNDogMHgwMDk5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGY2OiAweDAwOWEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmNzogMHgwMDliLCAgICAgIyAgRElWSVNJT04gU0lHTiwgcmlnaHQtbGVmdAorICAgIDB4MDBmOTogMHgwMDlkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDBmYTogMHgwMDljLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBmYjogMHgwMDllLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGZjOiAweDAwOWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDYwYzogMHgwMGFjLCAgICAgIyAgQVJBQklDIENPTU1BCisgICAgMHgwNjFiOiAweDAwYmIsICAgICAjICBBUkFCSUMgU0VNSUNPTE9OCisgICAgMHgwNjFmOiAweDAwYmYsICAgICAjICBBUkFCSUMgUVVFU1RJT04gTUFSSworICAgIDB4MDYyMTogMHgwMGMxLCAgICAgIyAgQVJBQklDIExFVFRFUiBIQU1aQQorICAgIDB4MDYyMjogMHgwMGMyLCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUKKyAgICAweDA2MjM6IDB4MDBjMywgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEFCT1ZFCisgICAgMHgwNjI0OiAweDAwYzQsICAgICAjICBBUkFCSUMgTEVUVEVSIFdBVyBXSVRIIEhBTVpBIEFCT1ZFCisgICAgMHgwNjI1OiAweDAwYzUsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBCRUxPVworICAgIDB4MDYyNjogMHgwMGM2LCAgICAgIyAgQVJBQklDIExFVFRFUiBZRUggV0lUSCBIQU1aQSBBQk9WRQorICAgIDB4MDYyNzogMHgwMGM3LCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGCisgICAgMHgwNjI4OiAweDAwYzgsICAgICAjICBBUkFCSUMgTEVUVEVSIEJFSAorICAgIDB4MDYyOTogMHgwMGM5LCAgICAgIyAgQVJBQklDIExFVFRFUiBURUggTUFSQlVUQQorICAgIDB4MDYyYTogMHgwMGNhLCAgICAgIyAgQVJBQklDIExFVFRFUiBURUgKKyAgICAweDA2MmI6IDB4MDBjYiwgICAgICMgIEFSQUJJQyBMRVRURVIgVEhFSAorICAgIDB4MDYyYzogMHgwMGNjLCAgICAgIyAgQVJBQklDIExFVFRFUiBKRUVNCisgICAgMHgwNjJkOiAweDAwY2QsICAgICAjICBBUkFCSUMgTEVUVEVSIEhBSAorICAgIDB4MDYyZTogMHgwMGNlLCAgICAgIyAgQVJBQklDIExFVFRFUiBLSEFICisgICAgMHgwNjJmOiAweDAwY2YsICAgICAjICBBUkFCSUMgTEVUVEVSIERBTAorICAgIDB4MDYzMDogMHgwMGQwLCAgICAgIyAgQVJBQklDIExFVFRFUiBUSEFMCisgICAgMHgwNjMxOiAweDAwZDEsICAgICAjICBBUkFCSUMgTEVUVEVSIFJFSAorICAgIDB4MDYzMjogMHgwMGQyLCAgICAgIyAgQVJBQklDIExFVFRFUiBaQUlOCisgICAgMHgwNjMzOiAweDAwZDMsICAgICAjICBBUkFCSUMgTEVUVEVSIFNFRU4KKyAgICAweDA2MzQ6IDB4MDBkNCwgICAgICMgIEFSQUJJQyBMRVRURVIgU0hFRU4KKyAgICAweDA2MzU6IDB4MDBkNSwgICAgICMgIEFSQUJJQyBMRVRURVIgU0FECisgICAgMHgwNjM2OiAweDAwZDYsICAgICAjICBBUkFCSUMgTEVUVEVSIERBRAorICAgIDB4MDYzNzogMHgwMGQ3LCAgICAgIyAgQVJBQklDIExFVFRFUiBUQUgKKyAgICAweDA2Mzg6IDB4MDBkOCwgICAgICMgIEFSQUJJQyBMRVRURVIgWkFICisgICAgMHgwNjM5OiAweDAwZDksICAgICAjICBBUkFCSUMgTEVUVEVSIEFJTgorICAgIDB4MDYzYTogMHgwMGRhLCAgICAgIyAgQVJBQklDIExFVFRFUiBHSEFJTgorICAgIDB4MDY0MDogMHgwMGUwLCAgICAgIyAgQVJBQklDIFRBVFdFRUwKKyAgICAweDA2NDE6IDB4MDBlMSwgICAgICMgIEFSQUJJQyBMRVRURVIgRkVICisgICAgMHgwNjQyOiAweDAwZTIsICAgICAjICBBUkFCSUMgTEVUVEVSIFFBRgorICAgIDB4MDY0MzogMHgwMGUzLCAgICAgIyAgQVJBQklDIExFVFRFUiBLQUYKKyAgICAweDA2NDQ6IDB4MDBlNCwgICAgICMgIEFSQUJJQyBMRVRURVIgTEFNCisgICAgMHgwNjQ1OiAweDAwZTUsICAgICAjICBBUkFCSUMgTEVUVEVSIE1FRU0KKyAgICAweDA2NDY6IDB4MDBlNiwgICAgICMgIEFSQUJJQyBMRVRURVIgTk9PTgorICAgIDB4MDY0NzogMHgwMGU3LCAgICAgIyAgQVJBQklDIExFVFRFUiBIRUgKKyAgICAweDA2NDg6IDB4MDBlOCwgICAgICMgIEFSQUJJQyBMRVRURVIgV0FXCisgICAgMHgwNjQ5OiAweDAwZTksICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQQorICAgIDB4MDY0YTogMHgwMGVhLCAgICAgIyAgQVJBQklDIExFVFRFUiBZRUgKKyAgICAweDA2NGI6IDB4MDBlYiwgICAgICMgIEFSQUJJQyBGQVRIQVRBTgorICAgIDB4MDY0YzogMHgwMGVjLCAgICAgIyAgQVJBQklDIERBTU1BVEFOCisgICAgMHgwNjRkOiAweDAwZWQsICAgICAjICBBUkFCSUMgS0FTUkFUQU4KKyAgICAweDA2NGU6IDB4MDBlZSwgICAgICMgIEFSQUJJQyBGQVRIQQorICAgIDB4MDY0ZjogMHgwMGVmLCAgICAgIyAgQVJBQklDIERBTU1BCisgICAgMHgwNjUwOiAweDAwZjAsICAgICAjICBBUkFCSUMgS0FTUkEKKyAgICAweDA2NTE6IDB4MDBmMSwgICAgICMgIEFSQUJJQyBTSEFEREEKKyAgICAweDA2NTI6IDB4MDBmMiwgICAgICMgIEFSQUJJQyBTVUtVTgorICAgIDB4MDY2MDogMHgwMGIwLCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFpFUk8sIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwNjYxOiAweDAwYjEsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgT05FLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDY2MjogMHgwMGIyLCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFRXTywgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICAweDA2NjM6IDB4MDBiMywgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBUSFJFRSwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICAweDA2NjQ6IDB4MDBiNCwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBGT1VSLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDY2NTogMHgwMGI1LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIEZJVkUsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwNjY2OiAweDAwYjYsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgU0lYLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDY2NzogMHgwMGI3LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFNFVkVOLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDY2ODogMHgwMGI4LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIEVJR0hULCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDY2OTogMHgwMGI5LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIE5JTkUsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwNjZhOiAweDAwYTUsICAgICAjICBBUkFCSUMgUEVSQ0VOVCBTSUdOCisgICAgMHgwNjc5OiAweDAwZjQsICAgICAjICBBUkFCSUMgTEVUVEVSIFRURUgKKyAgICAweDA2N2U6IDB4MDBmMywgICAgICMgIEFSQUJJQyBMRVRURVIgUEVICisgICAgMHgwNjg2OiAweDAwZjUsICAgICAjICBBUkFCSUMgTEVUVEVSIFRDSEVICisgICAgMHgwNjg4OiAweDAwZjksICAgICAjICBBUkFCSUMgTEVUVEVSIEREQUwKKyAgICAweDA2OTE6IDB4MDBmYSwgICAgICMgIEFSQUJJQyBMRVRURVIgUlJFSAorICAgIDB4MDY5ODogMHgwMGZlLCAgICAgIyAgQVJBQklDIExFVFRFUiBKRUgKKyAgICAweDA2YTQ6IDB4MDBmNywgICAgICMgIEFSQUJJQyBMRVRURVIgVkVICisgICAgMHgwNmFmOiAweDAwZjgsICAgICAjICBBUkFCSUMgTEVUVEVSIEdBRgorICAgIDB4MDZiYTogMHgwMDhiLCAgICAgIyAgQVJBQklDIExFVFRFUiBOT09OIEdIVU5OQQorICAgIDB4MDZkMjogMHgwMGZmLCAgICAgIyAgQVJBQklDIExFVFRFUiBZRUggQkFSUkVFCisgICAgMHgwNmQ1OiAweDAwZjYsICAgICAjICBBUkFCSUMgTEVUVEVSIEFFCisgICAgMHgyMDI2OiAweDAwOTMsICAgICAjICBIT1JJWk9OVEFMIEVMTElQU0lTLCByaWdodC1sZWZ0CisgICAgMHgyNzRhOiAweDAwYzAsICAgICAjICBFSUdIVCBURUFSRFJPUC1TUE9LRUQgUFJPUEVMTEVSIEFTVEVSSVNLLCByaWdodC1sZWZ0Cit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfYXJhYmljLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19hcmFiaWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MzlmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfYXJhYmljLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfYXJhYmljLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19hcmFiaWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MzlmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfYXJhYmljLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY2VudGV1cm8ucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY2VudGV1cm8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzYzgyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jZW50ZXVyby5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBtYWNfY2VudGV1cm8gZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvQVBQTEUvQ0VOVEVVUk8uVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nbWFjLWNlbnRldXJvJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHhjNCcgICAgICMgIDB4ODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTAwJyAgICMgIDB4ODEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTAxJyAgICMgIDB4ODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICB1J1x4YzknICAgICAjICAweDgzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTA0JyAgICMgIDB4ODQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIHUnXHhkNicgICAgICMgIDB4ODUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkYycgICAgICMgIDB4ODYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMScgICAgICMgIDB4ODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHUwMTA1JyAgICMgIDB4ODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEwYycgICAjICAweDg5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhlNCcgICAgICMgIDB4OEEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDEwZCcgICAjICAweDhCIC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x1MDEwNicgICAjICAweDhDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHUwMTA3JyAgICMgIDB4OEQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhlOScgICAgICMgIDB4OEUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTc5JyAgICMgIDB4OEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdcdTAxN2EnICAgIyAgMHg5MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdcdTAxMGUnICAgIyAgMHg5MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICB1J1x4ZWQnICAgICAjICAweDkyIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x1MDEwZicgICAjICAweDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICB1J1x1MDExMicgICAjICAweDk0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBNQUNST04KKyAgICB1J1x1MDExMycgICAjICAweDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMTYnICAgIyAgMHg5NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGYzJyAgICAgIyAgMHg5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdcdTAxMTcnICAgIyAgMHg5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorICAgIHUnXHhmNCcgICAgICMgIDB4OTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHg5QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNScgICAgICMgIDB4OUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhmYScgICAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTFhJyAgICMgIDB4OUQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgdSdcdTAxMWInICAgIyAgMHg5RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgdSdceGZjJyAgICAgIyAgMHg5RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUyMDIwJyAgICMgIDB4QTAgLT4gREFHR0VSCisgICAgdSdceGIwJyAgICAgIyAgMHhBMSAtPiBERUdSRUUgU0lHTgorICAgIHUnXHUwMTE4JyAgICMgIDB4QTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIHUnXHhhMycgICAgICMgIDB4QTMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhhNycgICAgICMgIDB4QTQgLT4gU0VDVElPTiBTSUdOCisgICAgdSdcdTIwMjInICAgIyAgMHhBNSAtPiBCVUxMRVQKKyAgICB1J1x4YjYnICAgICAjICAweEE2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhkZicgICAgICMgIDB4QTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x4YWUnICAgICAjICAweEE4IC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MjEyMicgICAjICAweEFBIC0+IFRSQURFIE1BUksgU0lHTgorICAgIHUnXHUwMTE5JyAgICMgIDB4QUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICB1J1x4YTgnICAgICAjICAweEFDIC0+IERJQUVSRVNJUworICAgIHUnXHUyMjYwJyAgICMgIDB4QUQgLT4gTk9UIEVRVUFMIFRPCisgICAgdSdcdTAxMjMnICAgIyAgMHhBRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEyZScgICAjICAweEFGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEyZicgICAjICAweEIwIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMmEnICAgIyAgMHhCMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggTUFDUk9OCisgICAgdSdcdTIyNjQnICAgIyAgMHhCMiAtPiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NScgICAjICAweEIzIC0+IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUwMTJiJyAgICMgIDB4QjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICB1J1x1MDEzNicgICAjICAweEI1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBDRURJTExBCisgICAgdSdcdTIyMDInICAgIyAgMHhCNiAtPiBQQVJUSUFMIERJRkZFUkVOVElBTAorICAgIHUnXHUyMjExJyAgICMgIDB4QjcgLT4gTi1BUlkgU1VNTUFUSU9OCisgICAgdSdcdTAxNDInICAgIyAgMHhCOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTNiJyAgICMgIDB4QjkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEzYycgICAjICAweEJBIC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTNkJyAgICMgIDB4QkIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENBUk9OCisgICAgdSdcdTAxM2UnICAgIyAgMHhCQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENBUk9OCisgICAgdSdcdTAxMzknICAgIyAgMHhCRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQUNVVEUKKyAgICB1J1x1MDEzYScgICAjICAweEJFIC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQUNVVEUKKyAgICB1J1x1MDE0NScgICAjICAweEJGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBCisgICAgdSdcdTAxNDYnICAgIyAgMHhDMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE0MycgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIHUnXHhhYycgICAgICMgIDB4QzIgLT4gTk9UIFNJR04KKyAgICB1J1x1MjIxYScgICAjICAweEMzIC0+IFNRVUFSRSBST09UCisgICAgdSdcdTAxNDQnICAgIyAgMHhDNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdcdTAxNDcnICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0FST04KKyAgICB1J1x1MjIwNicgICAjICAweEM2IC0+IElOQ1JFTUVOVAorICAgIHUnXHhhYicgICAgICMgIDB4QzcgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweEM4IC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDI2JyAgICMgIDB4QzkgLT4gSE9SSVpPTlRBTCBFTExJUFNJUworICAgIHUnXHhhMCcgICAgICMgIDB4Q0EgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MDE0OCcgICAjICAweENCIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0FST04KKyAgICB1J1x1MDE1MCcgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZDUnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHUwMTUxJyAgICMgIDB4Q0UgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x1MDE0YycgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICB1J1x1MjAxMycgICAjICAweEQwIC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweEQxIC0+IEVNIERBU0gKKyAgICB1J1x1MjAxYycgICAjICAweEQyIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHhEMyAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOCcgICAjICAweEQ0IC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHhENSAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZjcnICAgICAjICAweEQ2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjVjYScgICAjICAweEQ3IC0+IExPWkVOR0UKKyAgICB1J1x1MDE0ZCcgICAjICAweEQ4IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgdSdcdTAxNTQnICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQUNVVEUKKyAgICB1J1x1MDE1NScgICAjICAweERBIC0+IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQUNVVEUKKyAgICB1J1x1MDE1OCcgICAjICAweERCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgIHUnXHUyMDM5JyAgICMgIDB4REMgLT4gU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAzYScgICAjICAweEREIC0+IFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTU5JyAgICMgIDB4REUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgIHUnXHUwMTU2JyAgICMgIDB4REYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE1NycgICAjICAweEUwIC0+IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTYwJyAgICMgIDB4RTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTIwMWEnICAgIyAgMHhFMiAtPiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZScgICAjICAweEUzIC0+IERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTYxJyAgICMgIDB4RTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUwMTVhJyAgICMgIDB4RTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgdSdcdTAxNWInICAgIyAgMHhFNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgdSdceGMxJyAgICAgIyAgMHhFNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x1MDE2NCcgICAjICAweEU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgIHUnXHUwMTY1JyAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgIHUnXHhjZCcgICAgICMgIDB4RUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdcdTAxN2QnICAgIyAgMHhFQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x1MDE3ZScgICAjICAweEVDIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x1MDE2YScgICAjICAweEVEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICB1J1x4ZDMnICAgICAjICAweEVFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDE2YicgICAjICAweEYwIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggTUFDUk9OCisgICAgdSdcdTAxNmUnICAgIyAgMHhGMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhkYScgICAgICMgIDB4RjIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNmYnICAgIyAgMHhGMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x1MDE3MCcgICAjICAweEY0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x1MDE3MScgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFCisgICAgdSdcdTAxNzInICAgIyAgMHhGNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggT0dPTkVLCisgICAgdSdcdTAxNzMnICAgIyAgMHhGNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE9HT05FSworICAgIHUnXHhkZCcgICAgICMgIDB4RjggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGZkJyAgICAgIyAgMHhGOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdcdTAxMzcnICAgIyAgMHhGQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE3YicgICAjICAweEZCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDE0MScgICAjICAweEZDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE3YycgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxMjInICAgIyAgMHhGRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMmM3JyAgICMgIDB4RkYgLT4gQ0FST04KKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jZW50ZXVyby5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY2VudGV1cm8ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YmM0YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY2VudGV1cm8ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jZW50ZXVyby5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY2VudGV1cm8ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YmM0YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY2VudGV1cm8ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jcm9hdGlhbi5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jcm9hdGlhbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTdmN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2Nyb2F0aWFuLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIG1hY19jcm9hdGlhbiBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9BUFBMRS9DUk9BVElBTi5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdtYWMtY3JvYXRpYW4nLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceGM0JyAgICAgIyAgMHg4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHg4MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNycgICAgICMgIDB4ODIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4YzknICAgICAjICAweDgzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhkMScgICAgICMgIDB4ODQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHg4NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRjJyAgICAgIyAgMHg4NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUxJyAgICAgIyAgMHg4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUwJyAgICAgIyAgMHg4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUyJyAgICAgIyAgMHg4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDhBIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUzJyAgICAgIyAgMHg4QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU1JyAgICAgIyAgMHg4QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTcnICAgICAjICAweDhEIC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOScgICAgICMgIDB4OEUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlOCcgICAgICMgIDB4OEYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlYScgICAgICMgIDB4OTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHg5MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlZCcgICAgICMgIDB4OTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlYycgICAgICMgIDB4OTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhlZScgICAgICMgIDB4OTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHg5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMScgICAgICMgIDB4OTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhmMycgICAgICMgIDB4OTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmMicgICAgICMgIDB4OTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmNCcgICAgICMgIDB4OTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHg5QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNScgICAgICMgIDB4OUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhmYScgICAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmOScgICAgICMgIDB4OUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYicgICAgICMgIDB4OUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHg5RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUyMDIwJyAgICMgIDB4QTAgLT4gREFHR0VSCisgICAgdSdceGIwJyAgICAgIyAgMHhBMSAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE3JyAgICAgIyAgMHhBNCAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MjAyMicgICAjICAweEE1IC0+IEJVTExFVAorICAgIHUnXHhiNicgICAgICMgIDB4QTYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGRmJyAgICAgIyAgMHhBNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhhZScgICAgICMgIDB4QTggLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdcdTAxNjAnICAgIyAgMHhBOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MjEyMicgICAjICAweEFBIC0+IFRSQURFIE1BUksgU0lHTgorICAgIHUnXHhiNCcgICAgICMgIDB4QUIgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGE4JyAgICAgIyAgMHhBQyAtPiBESUFFUkVTSVMKKyAgICB1J1x1MjI2MCcgICAjICAweEFEIC0+IE5PVCBFUVVBTCBUTworICAgIHUnXHUwMTdkJyAgICMgIDB4QUUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdceGQ4JyAgICAgIyAgMHhBRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdcdTIyMWUnICAgIyAgMHhCMCAtPiBJTkZJTklUWQorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTIyNjQnICAgIyAgMHhCMiAtPiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NScgICAjICAweEIzIC0+IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMjA2JyAgICMgIDB4QjQgLT4gSU5DUkVNRU5UCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdcdTIyMDInICAgIyAgMHhCNiAtPiBQQVJUSUFMIERJRkZFUkVOVElBTAorICAgIHUnXHUyMjExJyAgICMgIDB4QjcgLT4gTi1BUlkgU1VNTUFUSU9OCisgICAgdSdcdTIyMGYnICAgIyAgMHhCOCAtPiBOLUFSWSBQUk9EVUNUCisgICAgdSdcdTAxNjEnICAgIyAgMHhCOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTIyMmInICAgIyAgMHhCQSAtPiBJTlRFR1JBTAorICAgIHUnXHhhYScgICAgICMgIDB4QkIgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmEnICAgICAjICAweEJDIC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHUwM2E5JyAgICMgIDB4QkQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICB1J1x1MDE3ZScgICAjICAweEJFIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x4ZjgnICAgICAjICAweEJGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGJmJyAgICAgIyAgMHhDMCAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdceGExJyAgICAgIyAgMHhDMSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhDMiAtPiBOT1QgU0lHTgorICAgIHUnXHUyMjFhJyAgICMgIDB4QzMgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MDE5MicgICAjICAweEM0IC0+IExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIHUnXHUyMjQ4JyAgICMgIDB4QzUgLT4gQUxNT1NUIEVRVUFMIFRPCisgICAgdSdcdTAxMDYnICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4YWInICAgICAjICAweEM3IC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxMGMnICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x1MjAyNicgICAjICAweEM5IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x4YTAnICAgICAjICAweENBIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGMwJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzMnICAgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhkNScgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdcdTAxNTInICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisgICAgdSdcdTAxNTMnICAgIyAgMHhDRiAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRQorICAgIHUnXHUwMTEwJyAgICMgIDB4RDAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHUyMDE0JyAgICMgIDB4RDEgLT4gRU0gREFTSAorICAgIHUnXHUyMDFjJyAgICMgIDB4RDIgLT4gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZCcgICAjICAweEQzIC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE4JyAgICMgIDB4RDQgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOScgICAjICAweEQ1IC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhmNycgICAgICMgIDB4RDYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyNWNhJyAgICMgIDB4RDcgLT4gTE9aRU5HRQorICAgIHUnXHVmOGZmJyAgICMgIDB4RDggLT4gQXBwbGUgbG9nbworICAgIHUnXHhhOScgICAgICMgIDB4RDkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MjA0NCcgICAjICAweERBIC0+IEZSQUNUSU9OIFNMQVNICisgICAgdSdcdTIwYWMnICAgIyAgMHhEQiAtPiBFVVJPIFNJR04KKyAgICB1J1x1MjAzOScgICAjICAweERDIC0+IFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwM2EnICAgIyAgMHhERCAtPiBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YzYnICAgICAjICAweERFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgdSdceGJiJyAgICAgIyAgMHhERiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxMycgICAjICAweEUwIC0+IEVOIERBU0gKKyAgICB1J1x4YjcnICAgICAjICAweEUxIC0+IE1JRERMRSBET1QKKyAgICB1J1x1MjAxYScgICAjICAweEUyIC0+IFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFlJyAgICMgIDB4RTMgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMzAnICAgIyAgMHhFNCAtPiBQRVIgTUlMTEUgU0lHTgorICAgIHUnXHhjMicgICAgICMgIDB4RTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEwNycgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4YzEnICAgICAjICAweEU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHUwMTBkJyAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhjOCcgICAgICMgIDB4RTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGNkJyAgICAgIyAgMHhFQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweEVCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHhFQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEVFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDExMScgICAjICAweEYwIC0+IExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggU1RST0tFCisgICAgdSdceGQyJyAgICAgIyAgMHhGMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweEYyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4RjMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDknICAgICAjICAweEY0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHUwMTMxJyAgICMgIDB4RjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorICAgIHUnXHUwMmM2JyAgICMgIDB4RjYgLT4gTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdcdTAyZGMnICAgIyAgMHhGNyAtPiBTTUFMTCBUSUxERQorICAgIHUnXHhhZicgICAgICMgIDB4RjggLT4gTUFDUk9OCisgICAgdSdcdTAzYzAnICAgIyAgMHhGOSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICB1J1x4Y2InICAgICAjICAweEZBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDJkYScgICAjICAweEZCIC0+IFJJTkcgQUJPVkUKKyAgICB1J1x4YjgnICAgICAjICAweEZDIC0+IENFRElMTEEKKyAgICB1J1x4Y2EnICAgICAjICAweEZEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU2JyAgICAgIyAgMHhGRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x1MDJjNycgICAjICAweEZGIC0+IENBUk9OCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3JvYXRpYW4ucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2Nyb2F0aWFuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ4NmNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2Nyb2F0aWFuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3JvYXRpYW4ucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2Nyb2F0aWFuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ4NmNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2Nyb2F0aWFuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3lyaWxsaWMucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3lyaWxsaWMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzMjRhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jeXJpbGxpYy5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBtYWNfY3lyaWxsaWMgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvQVBQTEUvQ1lSSUxMSUMuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nbWFjLWN5cmlsbGljJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHUwNDEwJyAgICMgIDB4ODAgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnXHUwNDExJyAgICMgIDB4ODEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKyAgICB1J1x1MDQxMicgICAjICAweDgyIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFZFCisgICAgdSdcdTA0MTMnICAgIyAgMHg4MyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUKKyAgICB1J1x1MDQxNCcgICAjICAweDg0IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERFCisgICAgdSdcdTA0MTUnICAgIyAgMHg4NSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJRQorICAgIHUnXHUwNDE2JyAgICMgIDB4ODYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFCisgICAgdSdcdTA0MTcnICAgIyAgMHg4NyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRQorICAgIHUnXHUwNDE4JyAgICMgIDB4ODggLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnXHUwNDE5JyAgICMgIDB4ODkgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSQorICAgIHUnXHUwNDFhJyAgICMgIDB4OEEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EKKyAgICB1J1x1MDQxYicgICAjICAweDhCIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVMCisgICAgdSdcdTA0MWMnICAgIyAgMHg4QyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTQorICAgIHUnXHUwNDFkJyAgICMgIDB4OEQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4KKyAgICB1J1x1MDQxZScgICAjICAweDhFIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1x1MDQxZicgICAjICAweDhGIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisgICAgdSdcdTA0MjAnICAgIyAgMHg5MCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUgorICAgIHUnXHUwNDIxJyAgICMgIDB4OTEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVMKKyAgICB1J1x1MDQyMicgICAjICAweDkyIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisgICAgdSdcdTA0MjMnICAgIyAgMHg5MyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdcdTA0MjQnICAgIyAgMHg5NCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFRgorICAgIHUnXHUwNDI1JyAgICMgIDB4OTUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEEKKyAgICB1J1x1MDQyNicgICAjICAweDk2IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorICAgIHUnXHUwNDI3JyAgICMgIDB4OTcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFCisgICAgdSdcdTA0MjgnICAgIyAgMHg5OCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEEKKyAgICB1J1x1MDQyOScgICAjICAweDk5IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBCisgICAgdSdcdTA0MmEnICAgIyAgMHg5QSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04KKyAgICB1J1x1MDQyYicgICAjICAweDlCIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlFUlUKKyAgICB1J1x1MDQyYycgICAjICAweDlDIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTgorICAgIHUnXHUwNDJkJyAgICMgIDB4OUQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnXHUwNDJlJyAgICMgIDB4OUUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUKKyAgICB1J1x1MDQyZicgICAjICAweDlGIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisgICAgdSdcdTIwMjAnICAgIyAgMHhBMCAtPiBEQUdHRVIKKyAgICB1J1x4YjAnICAgICAjICAweEExIC0+IERFR1JFRSBTSUdOCisgICAgdSdcdTA0OTAnICAgIyAgMHhBMiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUgV0lUSCBVUFRVUk4KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweEE0IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHUyMDIyJyAgICMgIDB4QTUgLT4gQlVMTEVUCisgICAgdSdceGI2JyAgICAgIyAgMHhBNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x1MDQwNicgICAjICAweEE3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIHUnXHhhZScgICAgICMgIDB4QTggLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUyMTIyJyAgICMgIDB4QUEgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdcdTA0MDInICAgIyAgMHhBQiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBESkUKKyAgICB1J1x1MDQ1MicgICAjICAweEFDIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBESkUKKyAgICB1J1x1MjI2MCcgICAjICAweEFEIC0+IE5PVCBFUVVBTCBUTworICAgIHUnXHUwNDAzJyAgICMgIDB4QUUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0pFCisgICAgdSdcdTA0NTMnICAgIyAgMHhBRiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0pFCisgICAgdSdcdTIyMWUnICAgIyAgMHhCMCAtPiBJTkZJTklUWQorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTIyNjQnICAgIyAgMHhCMiAtPiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NScgICAjICAweEIzIC0+IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUwNDU2JyAgICMgIDB4QjQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHUwNDkxJyAgICMgIDB4QjYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRSBXSVRIIFVQVFVSTgorICAgIHUnXHUwNDA4JyAgICMgIDB4QjcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSkUKKyAgICB1J1x1MDQwNCcgICAjICAweEI4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIHUnXHUwNDU0JyAgICMgIDB4QjkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIHUnXHUwNDA3JyAgICMgIDB4QkEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUkKKyAgICB1J1x1MDQ1NycgICAjICAweEJCIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZSQorICAgIHUnXHUwNDA5JyAgICMgIDB4QkMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTEpFCisgICAgdSdcdTA0NTknICAgIyAgMHhCRCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgTEpFCisgICAgdSdcdTA0MGEnICAgIyAgMHhCRSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBOSkUKKyAgICB1J1x1MDQ1YScgICAjICAweEJGIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBOSkUKKyAgICB1J1x1MDQ1OCcgICAjICAweEMwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBKRQorICAgIHUnXHUwNDA1JyAgICMgIDB4QzEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRFpFCisgICAgdSdceGFjJyAgICAgIyAgMHhDMiAtPiBOT1QgU0lHTgorICAgIHUnXHUyMjFhJyAgICMgIDB4QzMgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MDE5MicgICAjICAweEM0IC0+IExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIHUnXHUyMjQ4JyAgICMgIDB4QzUgLT4gQUxNT1NUIEVRVUFMIFRPCisgICAgdSdcdTIyMDYnICAgIyAgMHhDNiAtPiBJTkNSRU1FTlQKKyAgICB1J1x4YWInICAgICAjICAweEM3IC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHhDOCAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyNicgICAjICAweEM5IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x4YTAnICAgICAjICAweENBIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTA0MGInICAgIyAgMHhDQiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0hFCisgICAgdSdcdTA0NWInICAgIyAgMHhDQyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNIRQorICAgIHUnXHUwNDBjJyAgICMgIDB4Q0QgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0pFCisgICAgdSdcdTA0NWMnICAgIyAgMHhDRSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0pFCisgICAgdSdcdTA0NTUnICAgIyAgMHhDRiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpFCisgICAgdSdcdTIwMTMnICAgIyAgMHhEMCAtPiBFTiBEQVNICisgICAgdSdcdTIwMTQnICAgIyAgMHhEMSAtPiBFTSBEQVNICisgICAgdSdcdTIwMWMnICAgIyAgMHhEMiAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFkJyAgICMgIDB4RDMgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTgnICAgIyAgMHhENCAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4RDUgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGY3JyAgICAgIyAgMHhENiAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdcdTIwMWUnICAgIyAgMHhENyAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDQwZScgICAjICAweEQ4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIFUKKyAgICB1J1x1MDQ1ZScgICAjICAweEQ5IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBVCisgICAgdSdcdTA0MGYnICAgIyAgMHhEQSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkhFCisgICAgdSdcdTA0NWYnICAgIyAgMHhEQiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpIRQorICAgIHUnXHUyMTE2JyAgICMgIDB4REMgLT4gTlVNRVJPIFNJR04KKyAgICB1J1x1MDQwMScgICAjICAweEREIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisgICAgdSdcdTA0NTEnICAgIyAgMHhERSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSU8KKyAgICB1J1x1MDQ0ZicgICAjICAweERGIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZQQorICAgIHUnXHUwNDMwJyAgICMgIDB4RTAgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKyAgICB1J1x1MDQzMScgICAjICAweEUxIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorICAgIHUnXHUwNDMyJyAgICMgIDB4RTIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisgICAgdSdcdTA0MzMnICAgIyAgMHhFMyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFCisgICAgdSdcdTA0MzQnICAgIyAgMHhFNCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUKKyAgICB1J1x1MDQzNScgICAjICAweEU1IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJRQorICAgIHUnXHUwNDM2JyAgICMgIDB4RTYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorICAgIHUnXHUwNDM3JyAgICMgIDB4RTcgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisgICAgdSdcdTA0MzgnICAgIyAgMHhFOCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSQorICAgIHUnXHUwNDM5JyAgICMgIDB4RTkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkKKyAgICB1J1x1MDQzYScgICAjICAweEVBIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBLQQorICAgIHUnXHUwNDNiJyAgICMgIDB4RUIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMCisgICAgdSdcdTA0M2MnICAgIyAgMHhFQyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0KKyAgICB1J1x1MDQzZCcgICAjICAweEVEIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTgorICAgIHUnXHUwNDNlJyAgICMgIDB4RUUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8KKyAgICB1J1x1MDQzZicgICAjICAweEVGIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBQRQorICAgIHUnXHUwNDQwJyAgICMgIDB4RjAgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCisgICAgdSdcdTA0NDEnICAgIyAgMHhGMSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKyAgICB1J1x1MDQ0MicgICAjICAweEYyIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBURQorICAgIHUnXHUwNDQzJyAgICMgIDB4RjMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUKKyAgICB1J1x1MDQ0NCcgICAjICAweEY0IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorICAgIHUnXHUwNDQ1JyAgICMgIDB4RjUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisgICAgdSdcdTA0NDYnICAgIyAgMHhGNiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFCisgICAgdSdcdTA0NDcnICAgIyAgMHhGNyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFCisgICAgdSdcdTA0NDgnICAgIyAgMHhGOCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBCisgICAgdSdcdTA0NDknICAgIyAgMHhGOSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEEKKyAgICB1J1x1MDQ0YScgICAjICAweEZBIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04KKyAgICB1J1x1MDQ0YicgICAjICAweEZCIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVCisgICAgdSdcdTA0NGMnICAgIyAgMHhGQyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTA0NGQnICAgIyAgMHhGRCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorICAgIHUnXHUwNDRlJyAgICMgIDB4RkUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlVCisgICAgdSdcdTIwYWMnICAgIyAgMHhGRiAtPiBFVVJPIFNJR04KKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jeXJpbGxpYy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3lyaWxsaWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMTU4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3lyaWxsaWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jeXJpbGxpYy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3lyaWxsaWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMTU4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3lyaWxsaWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19mYXJzaS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19mYXJzaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGJkNzZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ZhcnNpLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIG1hY19mYXJzaSBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9BUFBMRS9GQVJTSS5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdtYWMtZmFyc2knLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRSwgbGVmdC1yaWdodAorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSywgbGVmdC1yaWdodAorICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUkssIGxlZnQtcmlnaHQKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTiwgbGVmdC1yaWdodAorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQsIGxlZnQtcmlnaHQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUsIGxlZnQtcmlnaHQKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMsIGxlZnQtcmlnaHQKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTLCBsZWZ0LXJpZ2h0CisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSywgbGVmdC1yaWdodAorICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQSwgbGVmdC1yaWdodDsgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjZDIEFSQUJJQyBUSE9VU0FORFMgU0VQQVJBVE9SCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMsIGxlZnQtcmlnaHQKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUCwgbGVmdC1yaWdodDsgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjZCIEFSQUJJQyBERUNJTUFMIFNFUEFSQVRPUgorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUywgbGVmdC1yaWdodAorICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTzsgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDZGMCBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FOyAgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDZGMSBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV087ICAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNkYyIEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFOyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2RjMgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSOyAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNkY0IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFOyAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNkY1IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVg7ICAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNkY2IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOOyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2RjcgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVDsgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNkY4IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORTsgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDZGOSBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04sIGxlZnQtcmlnaHQKKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTiwgbGVmdC1yaWdodAorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04sIGxlZnQtcmlnaHQKKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTiwgbGVmdC1yaWdodAorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSywgbGVmdC1yaWdodAorICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVCwgbGVmdC1yaWdodAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTLCBsZWZ0LXJpZ2h0CisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCwgbGVmdC1yaWdodAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQsIGxlZnQtcmlnaHQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FLCBsZWZ0LXJpZ2h0CisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VULCBsZWZ0LXJpZ2h0CisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FLCBsZWZ0LXJpZ2h0CisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VULCBsZWZ0LXJpZ2h0CisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4YzQnICAgICAjICAweDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YTAnICAgICAjICAweDgxIC0+IE5PLUJSRUFLIFNQQUNFLCByaWdodC1sZWZ0CisgICAgdSdceGM3JyAgICAgIyAgMHg4MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhjOScgICAgICMgIDB4ODMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGQxJyAgICAgIyAgMHg4NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDYnICAgICAjICAweDg1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGMnICAgICAjICAweDg2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTEnICAgICAjICAweDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTAnICAgICAjICAweDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTInICAgICAjICAweDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4OEEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDZiYScgICAjICAweDhCIC0+IEFSQUJJQyBMRVRURVIgTk9PTiBHSFVOTkEKKyAgICB1J1x4YWInICAgICAjICAweDhDIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLLCByaWdodC1sZWZ0CisgICAgdSdceGU3JyAgICAgIyAgMHg4RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZTknICAgICAjICAweDhFIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTgnICAgICAjICAweDhGIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZWEnICAgICAjICAweDkwIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4OTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWQnICAgICAjICAweDkyIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x1MjAyNicgICAjICAweDkzIC0+IEhPUklaT05UQUwgRUxMSVBTSVMsIHJpZ2h0LWxlZnQKKyAgICB1J1x4ZWUnICAgICAjICAweDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4OTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjEnICAgICAjICAweDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZjMnICAgICAjICAweDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4YmInICAgICAjICAweDk4IC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSywgcmlnaHQtbGVmdAorICAgIHUnXHhmNCcgICAgICMgIDB4OTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHg5QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4OUIgLT4gRElWSVNJT04gU0lHTiwgcmlnaHQtbGVmdAorICAgIHUnXHhmYScgICAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmOScgICAgICMgIDB4OUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYicgICAgICMgIDB4OUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHg5RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnICcgICAgICAgICMgIDB4QTAgLT4gU1BBQ0UsIHJpZ2h0LWxlZnQKKyAgICB1JyEnICAgICAgICAjICAweEExIC0+IEVYQ0xBTUFUSU9OIE1BUkssIHJpZ2h0LWxlZnQKKyAgICB1JyInICAgICAgICAjICAweEEyIC0+IFFVT1RBVElPTiBNQVJLLCByaWdodC1sZWZ0CisgICAgdScjJyAgICAgICAgIyAgMHhBMyAtPiBOVU1CRVIgU0lHTiwgcmlnaHQtbGVmdAorICAgIHUnJCcgICAgICAgICMgIDB4QTQgLT4gRE9MTEFSIFNJR04sIHJpZ2h0LWxlZnQKKyAgICB1J1x1MDY2YScgICAjICAweEE1IC0+IEFSQUJJQyBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweEE2IC0+IEFNUEVSU0FORCwgcmlnaHQtbGVmdAorICAgIHUiJyIgICAgICAgICMgIDB4QTcgLT4gQVBPU1RST1BIRSwgcmlnaHQtbGVmdAorICAgIHUnKCcgICAgICAgICMgIDB4QTggLT4gTEVGVCBQQVJFTlRIRVNJUywgcmlnaHQtbGVmdAorICAgIHUnKScgICAgICAgICMgIDB4QTkgLT4gUklHSFQgUEFSRU5USEVTSVMsIHJpZ2h0LWxlZnQKKyAgICB1JyonICAgICAgICAjICAweEFBIC0+IEFTVEVSSVNLLCByaWdodC1sZWZ0CisgICAgdScrJyAgICAgICAgIyAgMHhBQiAtPiBQTFVTIFNJR04sIHJpZ2h0LWxlZnQKKyAgICB1J1x1MDYwYycgICAjICAweEFDIC0+IEFSQUJJQyBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4QUQgLT4gSFlQSEVOLU1JTlVTLCByaWdodC1sZWZ0CisgICAgdScuJyAgICAgICAgIyAgMHhBRSAtPiBGVUxMIFNUT1AsIHJpZ2h0LWxlZnQKKyAgICB1Jy8nICAgICAgICAjICAweEFGIC0+IFNPTElEVVMsIHJpZ2h0LWxlZnQKKyAgICB1J1x1MDZmMCcgICAjICAweEIwIC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIHUnXHUwNmYxJyAgICMgIDB4QjEgLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIE9ORSwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDZmMicgICAjICAweEIyIC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBUV08sIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSdcdTA2ZjMnICAgIyAgMHhCMyAtPiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgVEhSRUUsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSdcdTA2ZjQnICAgIyAgMHhCNCAtPiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgRk9VUiwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDZmNScgICAjICAweEI1IC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBGSVZFLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIHUnXHUwNmY2JyAgICMgIDB4QjYgLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFNJWCwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDZmNycgICAjICAweEI3IC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBTRVZFTiwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDZmOCcgICAjICAweEI4IC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBFSUdIVCwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDZmOScgICAjICAweEI5IC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBOSU5FLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIHUnOicgICAgICAgICMgIDB4QkEgLT4gQ09MT04sIHJpZ2h0LWxlZnQKKyAgICB1J1x1MDYxYicgICAjICAweEJCIC0+IEFSQUJJQyBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweEJDIC0+IExFU1MtVEhBTiBTSUdOLCByaWdodC1sZWZ0CisgICAgdSc9JyAgICAgICAgIyAgMHhCRCAtPiBFUVVBTFMgU0lHTiwgcmlnaHQtbGVmdAorICAgIHUnPicgICAgICAgICMgIDB4QkUgLT4gR1JFQVRFUi1USEFOIFNJR04sIHJpZ2h0LWxlZnQKKyAgICB1J1x1MDYxZicgICAjICAweEJGIC0+IEFSQUJJQyBRVUVTVElPTiBNQVJLCisgICAgdSdcdTI3NGEnICAgIyAgMHhDMCAtPiBFSUdIVCBURUFSRFJPUC1TUE9LRUQgUFJPUEVMTEVSIEFTVEVSSVNLLCByaWdodC1sZWZ0CisgICAgdSdcdTA2MjEnICAgIyAgMHhDMSAtPiBBUkFCSUMgTEVUVEVSIEhBTVpBCisgICAgdSdcdTA2MjInICAgIyAgMHhDMiAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRQorICAgIHUnXHUwNjIzJyAgICMgIDB4QzMgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUKKyAgICB1J1x1MDYyNCcgICAjICAweEM0IC0+IEFSQUJJQyBMRVRURVIgV0FXIFdJVEggSEFNWkEgQUJPVkUKKyAgICB1J1x1MDYyNScgICAjICAweEM1IC0+IEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEJFTE9XCisgICAgdSdcdTA2MjYnICAgIyAgMHhDNiAtPiBBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFCisgICAgdSdcdTA2MjcnICAgIyAgMHhDNyAtPiBBUkFCSUMgTEVUVEVSIEFMRUYKKyAgICB1J1x1MDYyOCcgICAjICAweEM4IC0+IEFSQUJJQyBMRVRURVIgQkVICisgICAgdSdcdTA2MjknICAgIyAgMHhDOSAtPiBBUkFCSUMgTEVUVEVSIFRFSCBNQVJCVVRBCisgICAgdSdcdTA2MmEnICAgIyAgMHhDQSAtPiBBUkFCSUMgTEVUVEVSIFRFSAorICAgIHUnXHUwNjJiJyAgICMgIDB4Q0IgLT4gQVJBQklDIExFVFRFUiBUSEVICisgICAgdSdcdTA2MmMnICAgIyAgMHhDQyAtPiBBUkFCSUMgTEVUVEVSIEpFRU0KKyAgICB1J1x1MDYyZCcgICAjICAweENEIC0+IEFSQUJJQyBMRVRURVIgSEFICisgICAgdSdcdTA2MmUnICAgIyAgMHhDRSAtPiBBUkFCSUMgTEVUVEVSIEtIQUgKKyAgICB1J1x1MDYyZicgICAjICAweENGIC0+IEFSQUJJQyBMRVRURVIgREFMCisgICAgdSdcdTA2MzAnICAgIyAgMHhEMCAtPiBBUkFCSUMgTEVUVEVSIFRIQUwKKyAgICB1J1x1MDYzMScgICAjICAweEQxIC0+IEFSQUJJQyBMRVRURVIgUkVICisgICAgdSdcdTA2MzInICAgIyAgMHhEMiAtPiBBUkFCSUMgTEVUVEVSIFpBSU4KKyAgICB1J1x1MDYzMycgICAjICAweEQzIC0+IEFSQUJJQyBMRVRURVIgU0VFTgorICAgIHUnXHUwNjM0JyAgICMgIDB4RDQgLT4gQVJBQklDIExFVFRFUiBTSEVFTgorICAgIHUnXHUwNjM1JyAgICMgIDB4RDUgLT4gQVJBQklDIExFVFRFUiBTQUQKKyAgICB1J1x1MDYzNicgICAjICAweEQ2IC0+IEFSQUJJQyBMRVRURVIgREFECisgICAgdSdcdTA2MzcnICAgIyAgMHhENyAtPiBBUkFCSUMgTEVUVEVSIFRBSAorICAgIHUnXHUwNjM4JyAgICMgIDB4RDggLT4gQVJBQklDIExFVFRFUiBaQUgKKyAgICB1J1x1MDYzOScgICAjICAweEQ5IC0+IEFSQUJJQyBMRVRURVIgQUlOCisgICAgdSdcdTA2M2EnICAgIyAgMHhEQSAtPiBBUkFCSUMgTEVUVEVSIEdIQUlOCisgICAgdSdbJyAgICAgICAgIyAgMHhEQiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgdSdcXCcgICAgICAgIyAgMHhEQyAtPiBSRVZFUlNFIFNPTElEVVMsIHJpZ2h0LWxlZnQKKyAgICB1J10nICAgICAgICAjICAweEREIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgdSdeJyAgICAgICAgIyAgMHhERSAtPiBDSVJDVU1GTEVYIEFDQ0VOVCwgcmlnaHQtbGVmdAorICAgIHUnXycgICAgICAgICMgIDB4REYgLT4gTE9XIExJTkUsIHJpZ2h0LWxlZnQKKyAgICB1J1x1MDY0MCcgICAjICAweEUwIC0+IEFSQUJJQyBUQVRXRUVMCisgICAgdSdcdTA2NDEnICAgIyAgMHhFMSAtPiBBUkFCSUMgTEVUVEVSIEZFSAorICAgIHUnXHUwNjQyJyAgICMgIDB4RTIgLT4gQVJBQklDIExFVFRFUiBRQUYKKyAgICB1J1x1MDY0MycgICAjICAweEUzIC0+IEFSQUJJQyBMRVRURVIgS0FGCisgICAgdSdcdTA2NDQnICAgIyAgMHhFNCAtPiBBUkFCSUMgTEVUVEVSIExBTQorICAgIHUnXHUwNjQ1JyAgICMgIDB4RTUgLT4gQVJBQklDIExFVFRFUiBNRUVNCisgICAgdSdcdTA2NDYnICAgIyAgMHhFNiAtPiBBUkFCSUMgTEVUVEVSIE5PT04KKyAgICB1J1x1MDY0NycgICAjICAweEU3IC0+IEFSQUJJQyBMRVRURVIgSEVICisgICAgdSdcdTA2NDgnICAgIyAgMHhFOCAtPiBBUkFCSUMgTEVUVEVSIFdBVworICAgIHUnXHUwNjQ5JyAgICMgIDB4RTkgLT4gQVJBQklDIExFVFRFUiBBTEVGIE1BS1NVUkEKKyAgICB1J1x1MDY0YScgICAjICAweEVBIC0+IEFSQUJJQyBMRVRURVIgWUVICisgICAgdSdcdTA2NGInICAgIyAgMHhFQiAtPiBBUkFCSUMgRkFUSEFUQU4KKyAgICB1J1x1MDY0YycgICAjICAweEVDIC0+IEFSQUJJQyBEQU1NQVRBTgorICAgIHUnXHUwNjRkJyAgICMgIDB4RUQgLT4gQVJBQklDIEtBU1JBVEFOCisgICAgdSdcdTA2NGUnICAgIyAgMHhFRSAtPiBBUkFCSUMgRkFUSEEKKyAgICB1J1x1MDY0ZicgICAjICAweEVGIC0+IEFSQUJJQyBEQU1NQQorICAgIHUnXHUwNjUwJyAgICMgIDB4RjAgLT4gQVJBQklDIEtBU1JBCisgICAgdSdcdTA2NTEnICAgIyAgMHhGMSAtPiBBUkFCSUMgU0hBRERBCisgICAgdSdcdTA2NTInICAgIyAgMHhGMiAtPiBBUkFCSUMgU1VLVU4KKyAgICB1J1x1MDY3ZScgICAjICAweEYzIC0+IEFSQUJJQyBMRVRURVIgUEVICisgICAgdSdcdTA2NzknICAgIyAgMHhGNCAtPiBBUkFCSUMgTEVUVEVSIFRURUgKKyAgICB1J1x1MDY4NicgICAjICAweEY1IC0+IEFSQUJJQyBMRVRURVIgVENIRUgKKyAgICB1J1x1MDZkNScgICAjICAweEY2IC0+IEFSQUJJQyBMRVRURVIgQUUKKyAgICB1J1x1MDZhNCcgICAjICAweEY3IC0+IEFSQUJJQyBMRVRURVIgVkVICisgICAgdSdcdTA2YWYnICAgIyAgMHhGOCAtPiBBUkFCSUMgTEVUVEVSIEdBRgorICAgIHUnXHUwNjg4JyAgICMgIDB4RjkgLT4gQVJBQklDIExFVFRFUiBEREFMCisgICAgdSdcdTA2OTEnICAgIyAgMHhGQSAtPiBBUkFCSUMgTEVUVEVSIFJSRUgKKyAgICB1J3snICAgICAgICAjICAweEZCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVCwgcmlnaHQtbGVmdAorICAgIHUnfCcgICAgICAgICMgIDB4RkMgLT4gVkVSVElDQUwgTElORSwgcmlnaHQtbGVmdAorICAgIHUnfScgICAgICAgICMgIDB4RkQgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVCwgcmlnaHQtbGVmdAorICAgIHUnXHUwNjk4JyAgICMgIDB4RkUgLT4gQVJBQklDIExFVFRFUiBKRUgKKyAgICB1J1x1MDZkMicgICAjICAweEZGIC0+IEFSQUJJQyBMRVRURVIgWUVIIEJBUlJFRQorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ZhcnNpLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19mYXJzaS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlYzRlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19mYXJzaS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ZhcnNpLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19mYXJzaS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlYzRlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19mYXJzaS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2dyZWVrLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2dyZWVrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjRmZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfZ3JlZWsucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgbWFjX2dyZWVrIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL0FQUExFL0dSRUVLLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J21hYy1ncmVlaycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4YzQnICAgICAjICAweDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YjknICAgICAjICAweDgxIC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhiMicgICAgICMgIDB4ODIgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGM5JyAgICAgIyAgMHg4MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4YjMnICAgICAjICAweDg0IC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdceGQ2JyAgICAgIyAgMHg4NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRjJyAgICAgIyAgMHg4NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAzODUnICAgIyAgMHg4NyAtPiBHUkVFSyBESUFMWVRJS0EgVE9OT1MKKyAgICB1J1x4ZTAnICAgICAjICAweDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTInICAgICAjICAweDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4OEEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDM4NCcgICAjICAweDhCIC0+IEdSRUVLIFRPTk9TCisgICAgdSdceGE4JyAgICAgIyAgMHg4QyAtPiBESUFFUkVTSVMKKyAgICB1J1x4ZTcnICAgICAjICAweDhEIC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOScgICAgICMgIDB4OEUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlOCcgICAgICMgIDB4OEYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlYScgICAgICMgIDB4OTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHg5MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhhMycgICAgICMgIDB4OTIgLT4gUE9VTkQgU0lHTgorICAgIHUnXHUyMTIyJyAgICMgIDB4OTMgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdceGVlJyAgICAgIyAgMHg5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTIwMjInICAgIyAgMHg5NiAtPiBCVUxMRVQKKyAgICB1J1x4YmQnICAgICAjICAweDk3IC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHUyMDMwJyAgICMgIDB4OTggLT4gUEVSIE1JTExFIFNJR04KKyAgICB1J1x4ZjQnICAgICAjICAweDk5IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNicgICAgICMgIDB4OUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YTYnICAgICAjICAweDlCIC0+IEJST0tFTiBCQVIKKyAgICB1J1x1MjBhYycgICAjICAweDlDIC0+IEVVUk8gU0lHTiAjIGJlZm9yZSBNYWMgT1MgOS4yLjIsIHdhcyBTT0ZUIEhZUEhFTgorICAgIHUnXHhmOScgICAgICMgIDB4OUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYicgICAgICMgIDB4OUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHg5RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUyMDIwJyAgICMgIDB4QTAgLT4gREFHR0VSCisgICAgdSdcdTAzOTMnICAgIyAgMHhBMSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIHUnXHUwMzk0JyAgICMgIDB4QTIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MDM5OCcgICAjICAweEEzIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgdSdcdTAzOWInICAgIyAgMHhBNCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBMQU1EQQorICAgIHUnXHUwMzllJyAgICMgIDB4QTUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgWEkKKyAgICB1J1x1MDNhMCcgICAjICAweEE2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBJCisgICAgdSdceGRmJyAgICAgIyAgMHhBNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhhZScgICAgICMgIDB4QTggLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUwM2EzJyAgICMgIDB4QUEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICB1J1x1MDNhYScgICAjICAweEFCIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICB1J1x4YTcnICAgICAjICAweEFDIC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHUyMjYwJyAgICMgIDB4QUQgLT4gTk9UIEVRVUFMIFRPCisgICAgdSdceGIwJyAgICAgIyAgMHhBRSAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QUYgLT4gTUlERExFIERPVAorICAgIHUnXHUwMzkxJyAgICMgIDB4QjAgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEKKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMjY0JyAgICMgIDB4QjIgLT4gTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIyNjUnICAgIyAgMHhCMyAtPiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x4YTUnICAgICAjICAweEI0IC0+IFlFTiBTSUdOCisgICAgdSdcdTAzOTInICAgIyAgMHhCNSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBCRVRBCisgICAgdSdcdTAzOTUnICAgIyAgMHhCNiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTAzOTYnICAgIyAgMHhCNyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBaRVRBCisgICAgdSdcdTAzOTcnICAgIyAgMHhCOCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEKKyAgICB1J1x1MDM5OScgICAjICAweEI5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEKKyAgICB1J1x1MDM5YScgICAjICAweEJBIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEtBUFBBCisgICAgdSdcdTAzOWMnICAgIyAgMHhCQiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQorICAgIHUnXHUwM2E2JyAgICMgIDB4QkMgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgdSdcdTAzYWInICAgIyAgMHhCRCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzYTgnICAgIyAgMHhCRSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kKKyAgICB1J1x1MDNhOScgICAjICAweEJGIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzYWMnICAgIyAgMHhDMCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIHUnXHUwMzlkJyAgICMgIDB4QzEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUKKyAgICB1J1x4YWMnICAgICAjICAweEMyIC0+IE5PVCBTSUdOCisgICAgdSdcdTAzOWYnICAgIyAgMHhDMyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCisgICAgdSdcdTAzYTEnICAgIyAgMHhDNCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBSSE8KKyAgICB1J1x1MjI0OCcgICAjICAweEM1IC0+IEFMTU9TVCBFUVVBTCBUTworICAgIHUnXHUwM2E0JyAgICMgIDB4QzYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCisgICAgdSdceGFiJyAgICAgIyAgMHhDNyAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4QzggLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHhDOSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdceGEwJyAgICAgIyAgMHhDQSAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUwM2E1JyAgICMgIDB4Q0IgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTgorICAgIHUnXHUwM2E3JyAgICMgIDB4Q0MgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQ0hJCisgICAgdSdcdTAzODYnICAgIyAgMHhDRCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzODgnICAgIyAgMHhDRSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDE1MycgICAjICAweENGIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIE9FCisgICAgdSdcdTIwMTMnICAgIyAgMHhEMCAtPiBFTiBEQVNICisgICAgdSdcdTIwMTUnICAgIyAgMHhEMSAtPiBIT1JJWk9OVEFMIEJBUgorICAgIHUnXHUyMDFjJyAgICMgIDB4RDIgLT4gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZCcgICAjICAweEQzIC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE4JyAgICMgIDB4RDQgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOScgICAjICAweEQ1IC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhmNycgICAgICMgIDB4RDYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUwMzg5JyAgICMgIDB4RDcgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4YScgICAjICAweEQ4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIHUnXHUwMzhjJyAgICMgIDB4RDkgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzOGUnICAgIyAgMHhEQSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDNhZCcgICAjICAweERCIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDNhZScgICAjICAweERDIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIHUnXHUwM2FmJyAgICMgIDB4REQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIHUnXHUwM2NjJyAgICMgIDB4REUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUworICAgIHUnXHUwMzhmJyAgICMgIDB4REYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIHUnXHUwM2NkJyAgICMgIDB4RTAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwM2IxJyAgICMgIDB4RTEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgdSdcdTAzYjInICAgIyAgMHhFMiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQkVUQQorICAgIHUnXHUwM2M4JyAgICMgIDB4RTMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBTSQorICAgIHUnXHUwM2I0JyAgICMgIDB4RTQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgdSdcdTAzYjUnICAgIyAgMHhFNSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIHUnXHUwM2M2JyAgICMgIDB4RTYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIHUnXHUwM2IzJyAgICMgIDB4RTcgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEdBTU1BCisgICAgdSdcdTAzYjcnICAgIyAgMHhFOCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVRBCisgICAgdSdcdTAzYjknICAgIyAgMHhFOSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQQorICAgIHUnXHUwM2JlJyAgICMgIDB4RUEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFhJCisgICAgdSdcdTAzYmEnICAgIyAgMHhFQiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgS0FQUEEKKyAgICB1J1x1MDNiYicgICAjICAweEVDIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQorICAgIHUnXHUwM2JjJyAgICMgIDB4RUQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE1VCisgICAgdSdcdTAzYmQnICAgIyAgMHhFRSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgTlUKKyAgICB1J1x1MDNiZicgICAjICAweEVGIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OCisgICAgdSdcdTAzYzAnICAgIyAgMHhGMCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICB1J1x1MDNjZScgICAjICAweEYxIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzYzEnICAgIyAgMHhGMiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUkhPCisgICAgdSdcdTAzYzMnICAgIyAgMHhGMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICB1J1x1MDNjNCcgICAjICAweEY0IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICB1J1x1MDNiOCcgICAjICAweEY1IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwM2M5JyAgICMgIDB4RjYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzYzInICAgIyAgMHhGNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUEKKyAgICB1J1x1MDNjNycgICAjICAweEY4IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBDSEkKKyAgICB1J1x1MDNjNScgICAjICAweEY5IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OCisgICAgdSdcdTAzYjYnICAgIyAgMHhGQSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgWkVUQQorICAgIHUnXHUwM2NhJyAgICMgIDB4RkIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICB1J1x1MDNjYicgICAjICAweEZDIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzOTAnICAgIyAgMHhGRCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQSBBTkQgVE9OT1MKKyAgICB1J1x1MDNiMCcgICAjICAweEZFIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBIEFORCBUT05PUworICAgIHUnXHhhZCcgICAgICMgIDB4RkYgLT4gU09GVCBIWVBIRU4gIyBiZWZvcmUgTWFjIE9TIDkuMi4yLCB3YXMgdW5kZWZpbmVkCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfZ3JlZWsucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2dyZWVrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWEwN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2dyZWVrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfZ3JlZWsucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2dyZWVrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWEwN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2dyZWVrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfaWNlbGFuZC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19pY2VsYW5kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNGFkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfaWNlbGFuZC5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBtYWNfaWNlbGFuZCBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9BUFBMRS9JQ0VMQU5ELlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J21hYy1pY2VsYW5kJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHhjNCcgICAgICMgIDB4ODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4ODEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzcnICAgICAjICAweDgyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM5JyAgICAgIyAgMHg4MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZDEnICAgICAjICAweDg0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkNicgICAgICMgIDB4ODUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkYycgICAgICMgIDB4ODYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMScgICAgICMgIDB4ODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMCcgICAgICMgIDB4ODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMicgICAgICMgIDB4ODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU0JyAgICAgIyAgMHg4QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMycgICAgICMgIDB4OEIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhlNScgICAgICMgIDB4OEMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU3JyAgICAgIyAgMHg4RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZTknICAgICAjICAweDhFIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTgnICAgICAjICAweDhGIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZWEnICAgICAjICAweDkwIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4OTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWQnICAgICAjICAweDkyIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZWMnICAgICAjICAweDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZWUnICAgICAjICAweDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4OTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjEnICAgICAjICAweDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZjMnICAgICAjICAweDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZjInICAgICAjICAweDk4IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjQnICAgICAjICAweDk5IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNicgICAgICMgIDB4OUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjUnICAgICAjICAweDlCIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZmEnICAgICAjICAweDlDIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZjknICAgICAjICAweDlEIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmInICAgICAjICAweDlFIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4OUYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGQnICAgICAjICAweEEwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhiMCcgICAgICMgIDB4QTEgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YTInICAgICAjICAweEEyIC0+IENFTlQgU0lHTgorICAgIHUnXHhhMycgICAgICMgIDB4QTMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhhNycgICAgICMgIDB4QTQgLT4gU0VDVElPTiBTSUdOCisgICAgdSdcdTIwMjInICAgIyAgMHhBNSAtPiBCVUxMRVQKKyAgICB1J1x4YjYnICAgICAjICAweEE2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhkZicgICAgICMgIDB4QTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x4YWUnICAgICAjICAweEE4IC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MjEyMicgICAjICAweEFBIC0+IFRSQURFIE1BUksgU0lHTgorICAgIHUnXHhiNCcgICAgICMgIDB4QUIgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGE4JyAgICAgIyAgMHhBQyAtPiBESUFFUkVTSVMKKyAgICB1J1x1MjI2MCcgICAjICAweEFEIC0+IE5PVCBFUVVBTCBUTworICAgIHUnXHhjNicgICAgICMgIDB4QUUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x4ZDgnICAgICAjICAweEFGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x1MjIxZScgICAjICAweEIwIC0+IElORklOSVRZCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MjI2NCcgICAjICAweEIyIC0+IExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMjY1JyAgICMgIDB4QjMgLT4gR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdceGE1JyAgICAgIyAgMHhCNCAtPiBZRU4gU0lHTgorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHUyMjAyJyAgICMgIDB4QjYgLT4gUEFSVElBTCBESUZGRVJFTlRJQUwKKyAgICB1J1x1MjIxMScgICAjICAweEI3IC0+IE4tQVJZIFNVTU1BVElPTgorICAgIHUnXHUyMjBmJyAgICMgIDB4QjggLT4gTi1BUlkgUFJPRFVDVAorICAgIHUnXHUwM2MwJyAgICMgIDB4QjkgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgdSdcdTIyMmInICAgIyAgMHhCQSAtPiBJTlRFR1JBTAorICAgIHUnXHhhYScgICAgICMgIDB4QkIgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmEnICAgICAjICAweEJDIC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHUwM2E5JyAgICMgIDB4QkQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICB1J1x4ZTYnICAgICAjICAweEJFIC0+IExBVElOIFNNQUxMIExFVFRFUiBBRQorICAgIHUnXHhmOCcgICAgICMgIDB4QkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4YmYnICAgICAjICAweEMwIC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4YTEnICAgICAjICAweEMxIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEMyIC0+IE5PVCBTSUdOCisgICAgdSdcdTIyMWEnICAgIyAgMHhDMyAtPiBTUVVBUkUgUk9PVAorICAgIHUnXHUwMTkyJyAgICMgIDB4QzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdcdTIyNDgnICAgIyAgMHhDNSAtPiBBTE1PU1QgRVFVQUwgVE8KKyAgICB1J1x1MjIwNicgICAjICAweEM2IC0+IElOQ1JFTUVOVAorICAgIHUnXHhhYicgICAgICMgIDB4QzcgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweEM4IC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDI2JyAgICMgIDB4QzkgLT4gSE9SSVpPTlRBTCBFTExJUFNJUworICAgIHUnXHhhMCcgICAgICMgIDB4Q0EgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x4YzAnICAgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjMycgICAgICMgIDB4Q0MgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGQ1JyAgICAgIyAgMHhDRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x1MDE1MicgICAjICAweENFIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgT0UKKyAgICB1J1x1MDE1MycgICAjICAweENGIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIE9FCisgICAgdSdcdTIwMTMnICAgIyAgMHhEMCAtPiBFTiBEQVNICisgICAgdSdcdTIwMTQnICAgIyAgMHhEMSAtPiBFTSBEQVNICisgICAgdSdcdTIwMWMnICAgIyAgMHhEMiAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFkJyAgICMgIDB4RDMgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTgnICAgIyAgMHhENCAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4RDUgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGY3JyAgICAgIyAgMHhENiAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdcdTI1Y2EnICAgIyAgMHhENyAtPiBMT1pFTkdFCisgICAgdSdceGZmJyAgICAgIyAgMHhEOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTc4JyAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUyMDQ0JyAgICMgIDB4REEgLT4gRlJBQ1RJT04gU0xBU0gKKyAgICB1J1x1MjBhYycgICAjICAweERCIC0+IEVVUk8gU0lHTgorICAgIHUnXHhkMCcgICAgICMgIDB4REMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRICisgICAgdSdceGYwJyAgICAgIyAgMHhERCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRVRICisgICAgdSdceGRlJyAgICAgIyAgMHhERSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STgorICAgIHUnXHhmZScgICAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOCisgICAgdSdceGZkJyAgICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGI3JyAgICAgIyAgMHhFMSAtPiBNSURETEUgRE9UCisgICAgdSdcdTIwMWEnICAgIyAgMHhFMiAtPiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZScgICAjICAweEUzIC0+IERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDMwJyAgICMgIDB4RTQgLT4gUEVSIE1JTExFIFNJR04KKyAgICB1J1x4YzInICAgICAjICAweEU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNhJyAgICAgIyAgMHhFNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjMScgICAgICMgIDB4RTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGNiJyAgICAgIyAgMHhFOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM4JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4Y2QnICAgICAjICAweEVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4RUIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweEVDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweEVEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhkMycgICAgICMgIDB4RUUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ0JyAgICAgIyAgMHhFRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHVmOGZmJyAgICMgIDB4RjAgLT4gQXBwbGUgbG9nbworICAgIHUnXHhkMicgICAgICMgIDB4RjEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGRhJyAgICAgIyAgMHhGMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZGInICAgICAjICAweEYzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQ5JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x1MDEzMScgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkKKyAgICB1J1x1MDJjNicgICAjICAweEY2IC0+IE1PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXHUwMmRjJyAgICMgIDB4RjcgLT4gU01BTEwgVElMREUKKyAgICB1J1x4YWYnICAgICAjICAweEY4IC0+IE1BQ1JPTgorICAgIHUnXHUwMmQ4JyAgICMgIDB4RjkgLT4gQlJFVkUKKyAgICB1J1x1MDJkOScgICAjICAweEZBIC0+IERPVCBBQk9WRQorICAgIHUnXHUwMmRhJyAgICMgIDB4RkIgLT4gUklORyBBQk9WRQorICAgIHUnXHhiOCcgICAgICMgIDB4RkMgLT4gQ0VESUxMQQorICAgIHUnXHUwMmRkJyAgICMgIDB4RkQgLT4gRE9VQkxFIEFDVVRFIEFDQ0VOVAorICAgIHUnXHUwMmRiJyAgICMgIDB4RkUgLT4gT0dPTkVLCisgICAgdSdcdTAyYzcnICAgIyAgMHhGRiAtPiBDQVJPTgorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ljZWxhbmQucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ljZWxhbmQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MWViMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfaWNlbGFuZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ljZWxhbmQucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ljZWxhbmQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MWViMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfaWNlbGFuZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2xhdGluMi5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19sYXRpbjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyMmJlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19sYXRpbjIucHkKQEAgLTAsMCArMSwxODMgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgZ2VuZXJhdGVkIGZyb20gJ0xBVElOMi5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorKGMpIENvcHlyaWdodCAyMDAwIEd1aWRvIHZhbiBSb3NzdW0uCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfbWFwKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ19tYXApWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nbWFjLWxhdGluMicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCitkZWNvZGluZ19tYXAudXBkYXRlKHsKKyAgICAgICAgMHgwMDgwOiAweDAwYzQsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgICAgICAweDAwODE6IDB4MDEwMCwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgICAgIDB4MDA4MjogMHgwMTAxLCAjIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgICAgIDB4MDA4MzogMHgwMGM5LCAjIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgICAgICAweDAwODQ6IDB4MDEwNCwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgICAgIDB4MDA4NTogMHgwMGQ2LCAjIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAgICAgMHgwMDg2OiAweDAwZGMsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgICAgICAweDAwODc6IDB4MDBlMSwgIyBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDA4ODogMHgwMTA1LCAjIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgICAgIDB4MDA4OTogMHgwMTBjLCAjIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgICAgICAweDAwOGE6IDB4MDBlNCwgIyBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgICAgICAweDAwOGI6IDB4MDEwZCwgIyBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgICAgIDB4MDA4YzogMHgwMTA2LCAjIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgICAgICAweDAwOGQ6IDB4MDEwNywgIyBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgICAgIDB4MDA4ZTogMHgwMGU5LCAjIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMDhmOiAweDAxNzksICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgICAgIDB4MDA5MDogMHgwMTdhLCAjIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMDkxOiAweDAxMGUsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIENBUk9OCisgICAgICAgIDB4MDA5MjogMHgwMGVkLCAjIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMDkzOiAweDAxMGYsICMgTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBDQVJPTgorICAgICAgICAweDAwOTQ6IDB4MDExMiwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgICAgIDB4MDA5NTogMHgwMTEzLCAjIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgICAgIDB4MDA5NjogMHgwMTE2LCAjIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKyAgICAgICAgMHgwMDk3OiAweDAwZjMsICMgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgICAgICAweDAwOTg6IDB4MDExNywgIyBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorICAgICAgICAweDAwOTk6IDB4MDBmNCwgIyBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAgICAgMHgwMDlhOiAweDAwZjYsICMgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAgICAgMHgwMDliOiAweDAwZjUsICMgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgICAgICAweDAwOWM6IDB4MDBmYSwgIyBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDA5ZDogMHgwMTFhLCAjIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDQVJPTgorICAgICAgICAweDAwOWU6IDB4MDExYiwgIyBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgICAgIDB4MDA5ZjogMHgwMGZjLCAjIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDBhMDogMHgyMDIwLCAjIERBR0dFUgorICAgICAgICAweDAwYTE6IDB4MDBiMCwgIyBERUdSRUUgU0lHTgorICAgICAgICAweDAwYTI6IDB4MDExOCwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgICAgIDB4MDBhNDogMHgwMGE3LCAjIFNFQ1RJT04gU0lHTgorICAgICAgICAweDAwYTU6IDB4MjAyMiwgIyBCVUxMRVQKKyAgICAgICAgMHgwMGE2OiAweDAwYjYsICMgUElMQ1JPVyBTSUdOCisgICAgICAgIDB4MDBhNzogMHgwMGRmLCAjIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgICAgIDB4MDBhODogMHgwMGFlLCAjIFJFR0lTVEVSRUQgU0lHTgorICAgICAgICAweDAwYWE6IDB4MjEyMiwgIyBUUkFERSBNQVJLIFNJR04KKyAgICAgICAgMHgwMGFiOiAweDAxMTksICMgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICAgICAgMHgwMGFjOiAweDAwYTgsICMgRElBRVJFU0lTCisgICAgICAgIDB4MDBhZDogMHgyMjYwLCAjIE5PVCBFUVVBTCBUTworICAgICAgICAweDAwYWU6IDB4MDEyMywgIyBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKyAgICAgICAgMHgwMGFmOiAweDAxMmUsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE9HT05FSworICAgICAgICAweDAwYjA6IDB4MDEyZiwgIyBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE9HT05FSworICAgICAgICAweDAwYjE6IDB4MDEyYSwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggTUFDUk9OCisgICAgICAgIDB4MDBiMjogMHgyMjY0LCAjIExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgICAgICAweDAwYjM6IDB4MjI2NSwgIyBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAgICAgMHgwMGI0OiAweDAxMmIsICMgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICAgICAgMHgwMGI1OiAweDAxMzYsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICAgICAgMHgwMGI2OiAweDIyMDIsICMgUEFSVElBTCBESUZGRVJFTlRJQUwKKyAgICAgICAgMHgwMGI3OiAweDIyMTEsICMgTi1BUlkgU1VNTUFUSU9OCisgICAgICAgIDB4MDBiODogMHgwMTQyLCAjIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgICAgIDB4MDBiOTogMHgwMTNiLCAjIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgICAgIDB4MDBiYTogMHgwMTNjLCAjIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorICAgICAgICAweDAwYmI6IDB4MDEzZCwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0FST04KKyAgICAgICAgMHgwMGJjOiAweDAxM2UsICMgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDQVJPTgorICAgICAgICAweDAwYmQ6IDB4MDEzOSwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGJlOiAweDAxM2EsICMgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBBQ1VURQorICAgICAgICAweDAwYmY6IDB4MDE0NSwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgICAgICAweDAwYzA6IDB4MDE0NiwgIyBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICAgICAgMHgwMGMxOiAweDAxNDMsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBjMjogMHgwMGFjLCAjIE5PVCBTSUdOCisgICAgICAgIDB4MDBjMzogMHgyMjFhLCAjIFNRVUFSRSBST09UCisgICAgICAgIDB4MDBjNDogMHgwMTQ0LCAjIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGM1OiAweDAxNDcsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENBUk9OCisgICAgICAgIDB4MDBjNjogMHgyMjA2LCAjIElOQ1JFTUVOVAorICAgICAgICAweDAwYzc6IDB4MDBhYiwgIyBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwYzg6IDB4MDBiYiwgIyBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMGM5OiAweDIwMjYsICMgSE9SSVpPTlRBTCBFTExJUFNJUworICAgICAgICAweDAwY2E6IDB4MDBhMCwgIyBOTy1CUkVBSyBTUEFDRQorICAgICAgICAweDAwY2I6IDB4MDE0OCwgIyBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENBUk9OCisgICAgICAgIDB4MDBjYzogMHgwMTUwLCAjIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICAgICAgMHgwMGNkOiAweDAwZDUsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgICAgIDB4MDBjZTogMHgwMTUxLCAjIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisgICAgICAgIDB4MDBjZjogMHgwMTRjLCAjIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICAgICAgMHgwMGQwOiAweDIwMTMsICMgRU4gREFTSAorICAgICAgICAweDAwZDE6IDB4MjAxNCwgIyBFTSBEQVNICisgICAgICAgIDB4MDBkMjogMHgyMDFjLCAjIExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDBkMzogMHgyMDFkLCAjIFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwZDQ6IDB4MjAxOCwgIyBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwZDU6IDB4MjAxOSwgIyBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMGQ2OiAweDAwZjcsICMgRElWSVNJT04gU0lHTgorICAgICAgICAweDAwZDc6IDB4MjVjYSwgIyBMT1pFTkdFCisgICAgICAgIDB4MDBkODogMHgwMTRkLCAjIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgICAgIDB4MDBkOTogMHgwMTU0LCAjIExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBBQ1VURQorICAgICAgICAweDAwZGE6IDB4MDE1NSwgIyBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBkYjogMHgwMTU4LCAjIExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgICAgICAweDAwZGM6IDB4MjAzOSwgIyBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwZGQ6IDB4MjAzYSwgIyBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMGRlOiAweDAxNTksICMgTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgICAgICAweDAwZGY6IDB4MDE1NiwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgICAgICAweDAwZTA6IDB4MDE1NywgIyBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENFRElMTEEKKyAgICAgICAgMHgwMGUxOiAweDAxNjAsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgICAgIDB4MDBlMjogMHgyMDFhLCAjIFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwZTM6IDB4MjAxZSwgIyBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMGU0OiAweDAxNjEsICMgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgICAgICAweDAwZTU6IDB4MDE1YSwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGU2OiAweDAxNWIsICMgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgICAgICAweDAwZTc6IDB4MDBjMSwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGU4OiAweDAxNjQsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENBUk9OCisgICAgICAgIDB4MDBlOTogMHgwMTY1LCAjIExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0FST04KKyAgICAgICAgMHgwMGVhOiAweDAwY2QsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBlYjogMHgwMTdkLCAjIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgICAgICAweDAwZWM6IDB4MDE3ZSwgIyBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgICAgIDB4MDBlZDogMHgwMTZhLCAjIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICAgICAgMHgwMGVlOiAweDAwZDMsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBlZjogMHgwMGQ0LCAjIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgICAgIDB4MDBmMDogMHgwMTZiLCAjIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggTUFDUk9OCisgICAgICAgIDB4MDBmMTogMHgwMTZlLCAjIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisgICAgICAgIDB4MDBmMjogMHgwMGRhLCAjIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgICAgICAweDAwZjM6IDB4MDE2ZiwgIyBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFJJTkcgQUJPVkUKKyAgICAgICAgMHgwMGY0OiAweDAxNzAsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorICAgICAgICAweDAwZjU6IDB4MDE3MSwgIyBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorICAgICAgICAweDAwZjY6IDB4MDE3MiwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggT0dPTkVLCisgICAgICAgIDB4MDBmNzogMHgwMTczLCAjIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggT0dPTkVLCisgICAgICAgIDB4MDBmODogMHgwMGRkLCAjIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgICAgICAweDAwZjk6IDB4MDBmZCwgIyBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBmYTogMHgwMTM3LCAjIExBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorICAgICAgICAweDAwZmI6IDB4MDE3YiwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgICAgIDB4MDBmYzogMHgwMTQxLCAjIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICAgICAgMHgwMGZkOiAweDAxN2MsICMgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICAgICAgMHgwMGZlOiAweDAxMjIsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKyAgICAgICAgMHgwMGZmOiAweDAyYzcsICMgQ0FST04KK30pCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfZW5jb2RpbmdfbWFwKGRlY29kaW5nX21hcCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19sYXRpbjIucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2xhdGluMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjYmQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19sYXRpbjIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19sYXRpbjIucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2xhdGluMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjYmQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19sYXRpbjIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbi5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjYwNWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3JvbWFuLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIG1hY19yb21hbiBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9BUFBMRS9ST01BTi5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdtYWMtcm9tYW4nLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceGM0JyAgICAgIyAgMHg4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHg4MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNycgICAgICMgIDB4ODIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4YzknICAgICAjICAweDgzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhkMScgICAgICMgIDB4ODQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHg4NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRjJyAgICAgIyAgMHg4NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUxJyAgICAgIyAgMHg4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUwJyAgICAgIyAgMHg4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUyJyAgICAgIyAgMHg4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDhBIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUzJyAgICAgIyAgMHg4QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU1JyAgICAgIyAgMHg4QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTcnICAgICAjICAweDhEIC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOScgICAgICMgIDB4OEUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlOCcgICAgICMgIDB4OEYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlYScgICAgICMgIDB4OTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHg5MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlZCcgICAgICMgIDB4OTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlYycgICAgICMgIDB4OTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhlZScgICAgICMgIDB4OTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHg5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMScgICAgICMgIDB4OTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhmMycgICAgICMgIDB4OTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmMicgICAgICMgIDB4OTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmNCcgICAgICMgIDB4OTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHg5QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNScgICAgICMgIDB4OUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhmYScgICAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmOScgICAgICMgIDB4OUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYicgICAgICMgIDB4OUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHg5RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUyMDIwJyAgICMgIDB4QTAgLT4gREFHR0VSCisgICAgdSdceGIwJyAgICAgIyAgMHhBMSAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE3JyAgICAgIyAgMHhBNCAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MjAyMicgICAjICAweEE1IC0+IEJVTExFVAorICAgIHUnXHhiNicgICAgICMgIDB4QTYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGRmJyAgICAgIyAgMHhBNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhhZScgICAgICMgIDB4QTggLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUyMTIyJyAgICMgIDB4QUEgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdceGI0JyAgICAgIyAgMHhBQiAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4YTgnICAgICAjICAweEFDIC0+IERJQUVSRVNJUworICAgIHUnXHUyMjYwJyAgICMgIDB4QUQgLT4gTk9UIEVRVUFMIFRPCisgICAgdSdceGM2JyAgICAgIyAgMHhBRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRQorICAgIHUnXHhkOCcgICAgICMgIDB4QUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHUyMjFlJyAgICMgIDB4QjAgLT4gSU5GSU5JVFkKKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMjY0JyAgICMgIDB4QjIgLT4gTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIyNjUnICAgIyAgMHhCMyAtPiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x4YTUnICAgICAjICAweEI0IC0+IFlFTiBTSUdOCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdcdTIyMDInICAgIyAgMHhCNiAtPiBQQVJUSUFMIERJRkZFUkVOVElBTAorICAgIHUnXHUyMjExJyAgICMgIDB4QjcgLT4gTi1BUlkgU1VNTUFUSU9OCisgICAgdSdcdTIyMGYnICAgIyAgMHhCOCAtPiBOLUFSWSBQUk9EVUNUCisgICAgdSdcdTAzYzAnICAgIyAgMHhCOSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICB1J1x1MjIyYicgICAjICAweEJBIC0+IElOVEVHUkFMCisgICAgdSdceGFhJyAgICAgIyAgMHhCQiAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYScgICAgICMgIDB4QkMgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdcdTAzYTknICAgIyAgMHhCRCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIHUnXHhlNicgICAgICMgIDB4QkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEFFCisgICAgdSdceGY4JyAgICAgIyAgMHhCRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhiZicgICAgICMgIDB4QzAgLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHhhMScgICAgICMgIDB4QzEgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QzIgLT4gTk9UIFNJR04KKyAgICB1J1x1MjIxYScgICAjICAweEMzIC0+IFNRVUFSRSBST09UCisgICAgdSdcdTAxOTInICAgIyAgMHhDNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x1MjI0OCcgICAjICAweEM1IC0+IEFMTU9TVCBFUVVBTCBUTworICAgIHUnXHUyMjA2JyAgICMgIDB4QzYgLT4gSU5DUkVNRU5UCisgICAgdSdceGFiJyAgICAgIyAgMHhDNyAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4QzggLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHhDOSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdceGEwJyAgICAgIyAgMHhDQSAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHhjMCcgICAgICMgIDB4Q0IgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGMzJyAgICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZDUnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHUwMTUyJyAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRQorICAgIHUnXHUwMTUzJyAgICMgIDB4Q0YgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKyAgICB1J1x1MjAxMycgICAjICAweEQwIC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweEQxIC0+IEVNIERBU0gKKyAgICB1J1x1MjAxYycgICAjICAweEQyIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHhEMyAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOCcgICAjICAweEQ0IC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHhENSAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZjcnICAgICAjICAweEQ2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjVjYScgICAjICAweEQ3IC0+IExPWkVOR0UKKyAgICB1J1x4ZmYnICAgICAjICAweEQ4IC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNzgnICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTIwNDQnICAgIyAgMHhEQSAtPiBGUkFDVElPTiBTTEFTSAorICAgIHUnXHUyMGFjJyAgICMgIDB4REIgLT4gRVVSTyBTSUdOCisgICAgdSdcdTIwMzknICAgIyAgMHhEQyAtPiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDNhJyAgICMgIDB4REQgLT4gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdWZiMDEnICAgIyAgMHhERSAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBGSQorICAgIHUnXHVmYjAyJyAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgRkwKKyAgICB1J1x1MjAyMScgICAjICAweEUwIC0+IERPVUJMRSBEQUdHRVIKKyAgICB1J1x4YjcnICAgICAjICAweEUxIC0+IE1JRERMRSBET1QKKyAgICB1J1x1MjAxYScgICAjICAweEUyIC0+IFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFlJyAgICMgIDB4RTMgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMzAnICAgIyAgMHhFNCAtPiBQRVIgTUlMTEUgU0lHTgorICAgIHUnXHhjMicgICAgICMgIDB4RTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2EnICAgICAjICAweEU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGMxJyAgICAgIyAgMHhFNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4Y2InICAgICAjICAweEU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzgnICAgICAjICAweEU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4RUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4RUMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjYycgICAgICMgIDB4RUQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGQzJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweEVGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdWY4ZmYnICAgIyAgMHhGMCAtPiBBcHBsZSBsb2dvCisgICAgdSdceGQyJyAgICAgIyAgMHhGMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweEYyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4RjMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDknICAgICAjICAweEY0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHUwMTMxJyAgICMgIDB4RjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorICAgIHUnXHUwMmM2JyAgICMgIDB4RjYgLT4gTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdcdTAyZGMnICAgIyAgMHhGNyAtPiBTTUFMTCBUSUxERQorICAgIHUnXHhhZicgICAgICMgIDB4RjggLT4gTUFDUk9OCisgICAgdSdcdTAyZDgnICAgIyAgMHhGOSAtPiBCUkVWRQorICAgIHUnXHUwMmQ5JyAgICMgIDB4RkEgLT4gRE9UIEFCT1ZFCisgICAgdSdcdTAyZGEnICAgIyAgMHhGQiAtPiBSSU5HIEFCT1ZFCisgICAgdSdceGI4JyAgICAgIyAgMHhGQyAtPiBDRURJTExBCisgICAgdSdcdTAyZGQnICAgIyAgMHhGRCAtPiBET1VCTEUgQUNVVEUgQUNDRU5UCisgICAgdSdcdTAyZGInICAgIyAgMHhGRSAtPiBPR09ORUsKKyAgICB1J1x1MDJjNycgICAjICAweEZGIC0+IENBUk9OCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW4ucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3JvbWFuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzY3MWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3JvbWFuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW4ucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3JvbWFuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzY3MWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3JvbWFuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW5pYW4ucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW5pYW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkNWFlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbmlhbi5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBtYWNfcm9tYW5pYW4gZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvQVBQTEUvUk9NQU5JQU4uVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nbWFjLXJvbWFuaWFuJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHhjNCcgICAgICMgIDB4ODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4ODEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzcnICAgICAjICAweDgyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM5JyAgICAgIyAgMHg4MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZDEnICAgICAjICAweDg0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkNicgICAgICMgIDB4ODUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkYycgICAgICMgIDB4ODYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMScgICAgICMgIDB4ODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMCcgICAgICMgIDB4ODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMicgICAgICMgIDB4ODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU0JyAgICAgIyAgMHg4QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMycgICAgICMgIDB4OEIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhlNScgICAgICMgIDB4OEMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU3JyAgICAgIyAgMHg4RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZTknICAgICAjICAweDhFIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTgnICAgICAjICAweDhGIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZWEnICAgICAjICAweDkwIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4OTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWQnICAgICAjICAweDkyIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZWMnICAgICAjICAweDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZWUnICAgICAjICAweDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4OTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjEnICAgICAjICAweDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZjMnICAgICAjICAweDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZjInICAgICAjICAweDk4IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjQnICAgICAjICAweDk5IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNicgICAgICMgIDB4OUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjUnICAgICAjICAweDlCIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZmEnICAgICAjICAweDlDIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZjknICAgICAjICAweDlEIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmInICAgICAjICAweDlFIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4OUYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MjAyMCcgICAjICAweEEwIC0+IERBR0dFUgorICAgIHUnXHhiMCcgICAgICMgIDB4QTEgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YTInICAgICAjICAweEEyIC0+IENFTlQgU0lHTgorICAgIHUnXHhhMycgICAgICMgIDB4QTMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhhNycgICAgICMgIDB4QTQgLT4gU0VDVElPTiBTSUdOCisgICAgdSdcdTIwMjInICAgIyAgMHhBNSAtPiBCVUxMRVQKKyAgICB1J1x4YjYnICAgICAjICAweEE2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhkZicgICAgICMgIDB4QTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x4YWUnICAgICAjICAweEE4IC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MjEyMicgICAjICAweEFBIC0+IFRSQURFIE1BUksgU0lHTgorICAgIHUnXHhiNCcgICAgICMgIDB4QUIgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGE4JyAgICAgIyAgMHhBQyAtPiBESUFFUkVTSVMKKyAgICB1J1x1MjI2MCcgICAjICAweEFEIC0+IE5PVCBFUVVBTCBUTworICAgIHUnXHUwMTAyJyAgICMgIDB4QUUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFCisgICAgdSdcdTAyMTgnICAgIyAgMHhBRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ09NTUEgQkVMT1cgIyBmb3IgVW5pY29kZSAzLjAgYW5kIGxhdGVyCisgICAgdSdcdTIyMWUnICAgIyAgMHhCMCAtPiBJTkZJTklUWQorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTIyNjQnICAgIyAgMHhCMiAtPiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NScgICAjICAweEIzIC0+IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHhhNScgICAgICMgIDB4QjQgLT4gWUVOIFNJR04KKyAgICB1J1x4YjUnICAgICAjICAweEI1IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x1MjIwMicgICAjICAweEI2IC0+IFBBUlRJQUwgRElGRkVSRU5USUFMCisgICAgdSdcdTIyMTEnICAgIyAgMHhCNyAtPiBOLUFSWSBTVU1NQVRJT04KKyAgICB1J1x1MjIwZicgICAjICAweEI4IC0+IE4tQVJZIFBST0RVQ1QKKyAgICB1J1x1MDNjMCcgICAjICAweEI5IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHUyMjJiJyAgICMgIDB4QkEgLT4gSU5URUdSQUwKKyAgICB1J1x4YWEnICAgICAjICAweEJCIC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJhJyAgICAgIyAgMHhCQyAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x1MDNhOScgICAjICAweEJEIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAxMDMnICAgIyAgMHhCRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFCisgICAgdSdcdTAyMTknICAgIyAgMHhCRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENPTU1BIEJFTE9XICMgZm9yIFVuaWNvZGUgMy4wIGFuZCBsYXRlcgorICAgIHUnXHhiZicgICAgICMgIDB4QzAgLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHhhMScgICAgICMgIDB4QzEgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QzIgLT4gTk9UIFNJR04KKyAgICB1J1x1MjIxYScgICAjICAweEMzIC0+IFNRVUFSRSBST09UCisgICAgdSdcdTAxOTInICAgIyAgMHhDNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x1MjI0OCcgICAjICAweEM1IC0+IEFMTU9TVCBFUVVBTCBUTworICAgIHUnXHUyMjA2JyAgICMgIDB4QzYgLT4gSU5DUkVNRU5UCisgICAgdSdceGFiJyAgICAgIyAgMHhDNyAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4QzggLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHhDOSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdceGEwJyAgICAgIyAgMHhDQSAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHhjMCcgICAgICMgIDB4Q0IgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGMzJyAgICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZDUnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHUwMTUyJyAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRQorICAgIHUnXHUwMTUzJyAgICMgIDB4Q0YgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKyAgICB1J1x1MjAxMycgICAjICAweEQwIC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweEQxIC0+IEVNIERBU0gKKyAgICB1J1x1MjAxYycgICAjICAweEQyIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHhEMyAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOCcgICAjICAweEQ0IC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHhENSAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZjcnICAgICAjICAweEQ2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjVjYScgICAjICAweEQ3IC0+IExPWkVOR0UKKyAgICB1J1x4ZmYnICAgICAjICAweEQ4IC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNzgnICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTIwNDQnICAgIyAgMHhEQSAtPiBGUkFDVElPTiBTTEFTSAorICAgIHUnXHUyMGFjJyAgICMgIDB4REIgLT4gRVVSTyBTSUdOCisgICAgdSdcdTIwMzknICAgIyAgMHhEQyAtPiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDNhJyAgICMgIDB4REQgLT4gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAyMWEnICAgIyAgMHhERSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ09NTUEgQkVMT1cgIyBmb3IgVW5pY29kZSAzLjAgYW5kIGxhdGVyCisgICAgdSdcdTAyMWInICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENPTU1BIEJFTE9XICMgZm9yIFVuaWNvZGUgMy4wIGFuZCBsYXRlcgorICAgIHUnXHUyMDIxJyAgICMgIDB4RTAgLT4gRE9VQkxFIERBR0dFUgorICAgIHUnXHhiNycgICAgICMgIDB4RTEgLT4gTUlERExFIERPVAorICAgIHUnXHUyMDFhJyAgICMgIDB4RTIgLT4gU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWUnICAgIyAgMHhFMyAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAzMCcgICAjICAweEU0IC0+IFBFUiBNSUxMRSBTSUdOCisgICAgdSdceGMyJyAgICAgIyAgMHhFNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjYScgICAgICMgIDB4RTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzEnICAgICAjICAweEU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjYicgICAgICMgIDB4RTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjOCcgICAgICMgIDB4RTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGNkJyAgICAgIyAgMHhFQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweEVCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHhFQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEVFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1ZjhmZicgICAjICAweEYwIC0+IEFwcGxlIGxvZ28KKyAgICB1J1x4ZDInICAgICAjICAweEYxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4RjIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGRiJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkOScgICAgICMgIDB4RjQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdcdTAxMzEnICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJCisgICAgdSdcdTAyYzYnICAgIyAgMHhGNiAtPiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J1x1MDJkYycgICAjICAweEY3IC0+IFNNQUxMIFRJTERFCisgICAgdSdceGFmJyAgICAgIyAgMHhGOCAtPiBNQUNST04KKyAgICB1J1x1MDJkOCcgICAjICAweEY5IC0+IEJSRVZFCisgICAgdSdcdTAyZDknICAgIyAgMHhGQSAtPiBET1QgQUJPVkUKKyAgICB1J1x1MDJkYScgICAjICAweEZCIC0+IFJJTkcgQUJPVkUKKyAgICB1J1x4YjgnICAgICAjICAweEZDIC0+IENFRElMTEEKKyAgICB1J1x1MDJkZCcgICAjICAweEZEIC0+IERPVUJMRSBBQ1VURSBBQ0NFTlQKKyAgICB1J1x1MDJkYicgICAjICAweEZFIC0+IE9HT05FSworICAgIHUnXHUwMmM3JyAgICMgIDB4RkYgLT4gQ0FST04KKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbmlhbi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW5pYW4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMDQ0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW5pYW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbmlhbi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW5pYW4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMDQ0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW5pYW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY190dXJraXNoLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3R1cmtpc2gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4N2Y0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY190dXJraXNoLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIG1hY190dXJraXNoIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL0FQUExFL1RVUktJU0guVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nbWFjLXR1cmtpc2gnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceGM0JyAgICAgIyAgMHg4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHg4MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNycgICAgICMgIDB4ODIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4YzknICAgICAjICAweDgzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhkMScgICAgICMgIDB4ODQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHg4NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRjJyAgICAgIyAgMHg4NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUxJyAgICAgIyAgMHg4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUwJyAgICAgIyAgMHg4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUyJyAgICAgIyAgMHg4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDhBIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUzJyAgICAgIyAgMHg4QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU1JyAgICAgIyAgMHg4QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTcnICAgICAjICAweDhEIC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOScgICAgICMgIDB4OEUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlOCcgICAgICMgIDB4OEYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlYScgICAgICMgIDB4OTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHg5MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlZCcgICAgICMgIDB4OTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlYycgICAgICMgIDB4OTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhlZScgICAgICMgIDB4OTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHg5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMScgICAgICMgIDB4OTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhmMycgICAgICMgIDB4OTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmMicgICAgICMgIDB4OTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmNCcgICAgICMgIDB4OTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHg5QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNScgICAgICMgIDB4OUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhmYScgICAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmOScgICAgICMgIDB4OUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYicgICAgICMgIDB4OUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHg5RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUyMDIwJyAgICMgIDB4QTAgLT4gREFHR0VSCisgICAgdSdceGIwJyAgICAgIyAgMHhBMSAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE3JyAgICAgIyAgMHhBNCAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MjAyMicgICAjICAweEE1IC0+IEJVTExFVAorICAgIHUnXHhiNicgICAgICMgIDB4QTYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGRmJyAgICAgIyAgMHhBNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhhZScgICAgICMgIDB4QTggLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUyMTIyJyAgICMgIDB4QUEgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdceGI0JyAgICAgIyAgMHhBQiAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4YTgnICAgICAjICAweEFDIC0+IERJQUVSRVNJUworICAgIHUnXHUyMjYwJyAgICMgIDB4QUQgLT4gTk9UIEVRVUFMIFRPCisgICAgdSdceGM2JyAgICAgIyAgMHhBRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRQorICAgIHUnXHhkOCcgICAgICMgIDB4QUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHUyMjFlJyAgICMgIDB4QjAgLT4gSU5GSU5JVFkKKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMjY0JyAgICMgIDB4QjIgLT4gTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIyNjUnICAgIyAgMHhCMyAtPiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x4YTUnICAgICAjICAweEI0IC0+IFlFTiBTSUdOCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdcdTIyMDInICAgIyAgMHhCNiAtPiBQQVJUSUFMIERJRkZFUkVOVElBTAorICAgIHUnXHUyMjExJyAgICMgIDB4QjcgLT4gTi1BUlkgU1VNTUFUSU9OCisgICAgdSdcdTIyMGYnICAgIyAgMHhCOCAtPiBOLUFSWSBQUk9EVUNUCisgICAgdSdcdTAzYzAnICAgIyAgMHhCOSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICB1J1x1MjIyYicgICAjICAweEJBIC0+IElOVEVHUkFMCisgICAgdSdceGFhJyAgICAgIyAgMHhCQiAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYScgICAgICMgIDB4QkMgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdcdTAzYTknICAgIyAgMHhCRCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIHUnXHhlNicgICAgICMgIDB4QkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEFFCisgICAgdSdceGY4JyAgICAgIyAgMHhCRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhiZicgICAgICMgIDB4QzAgLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHhhMScgICAgICMgIDB4QzEgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QzIgLT4gTk9UIFNJR04KKyAgICB1J1x1MjIxYScgICAjICAweEMzIC0+IFNRVUFSRSBST09UCisgICAgdSdcdTAxOTInICAgIyAgMHhDNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x1MjI0OCcgICAjICAweEM1IC0+IEFMTU9TVCBFUVVBTCBUTworICAgIHUnXHUyMjA2JyAgICMgIDB4QzYgLT4gSU5DUkVNRU5UCisgICAgdSdceGFiJyAgICAgIyAgMHhDNyAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4QzggLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHhDOSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdceGEwJyAgICAgIyAgMHhDQSAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHhjMCcgICAgICMgIDB4Q0IgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGMzJyAgICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZDUnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHUwMTUyJyAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRQorICAgIHUnXHUwMTUzJyAgICMgIDB4Q0YgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKyAgICB1J1x1MjAxMycgICAjICAweEQwIC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweEQxIC0+IEVNIERBU0gKKyAgICB1J1x1MjAxYycgICAjICAweEQyIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHhEMyAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOCcgICAjICAweEQ0IC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHhENSAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZjcnICAgICAjICAweEQ2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjVjYScgICAjICAweEQ3IC0+IExPWkVOR0UKKyAgICB1J1x4ZmYnICAgICAjICAweEQ4IC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNzgnICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMWUnICAgIyAgMHhEQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICB1J1x1MDExZicgICAjICAweERCIC0+IExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICB1J1x1MDEzMCcgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDEzMScgICAjICAweEREIC0+IExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkKKyAgICB1J1x1MDE1ZScgICAjICAweERFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdSdcdTAxNWYnICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICB1J1x1MjAyMScgICAjICAweEUwIC0+IERPVUJMRSBEQUdHRVIKKyAgICB1J1x4YjcnICAgICAjICAweEUxIC0+IE1JRERMRSBET1QKKyAgICB1J1x1MjAxYScgICAjICAweEUyIC0+IFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFlJyAgICMgIDB4RTMgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMzAnICAgIyAgMHhFNCAtPiBQRVIgTUlMTEUgU0lHTgorICAgIHUnXHhjMicgICAgICMgIDB4RTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2EnICAgICAjICAweEU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGMxJyAgICAgIyAgMHhFNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4Y2InICAgICAjICAweEU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzgnICAgICAjICAweEU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4RUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4RUMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjYycgICAgICMgIDB4RUQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGQzJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweEVGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdWY4ZmYnICAgIyAgMHhGMCAtPiBBcHBsZSBsb2dvCisgICAgdSdceGQyJyAgICAgIyAgMHhGMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweEYyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4RjMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDknICAgICAjICAweEY0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHVmOGEwJyAgICMgIDB4RjUgLT4gdW5kZWZpbmVkMQorICAgIHUnXHUwMmM2JyAgICMgIDB4RjYgLT4gTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdcdTAyZGMnICAgIyAgMHhGNyAtPiBTTUFMTCBUSUxERQorICAgIHUnXHhhZicgICAgICMgIDB4RjggLT4gTUFDUk9OCisgICAgdSdcdTAyZDgnICAgIyAgMHhGOSAtPiBCUkVWRQorICAgIHUnXHUwMmQ5JyAgICMgIDB4RkEgLT4gRE9UIEFCT1ZFCisgICAgdSdcdTAyZGEnICAgIyAgMHhGQiAtPiBSSU5HIEFCT1ZFCisgICAgdSdceGI4JyAgICAgIyAgMHhGQyAtPiBDRURJTExBCisgICAgdSdcdTAyZGQnICAgIyAgMHhGRCAtPiBET1VCTEUgQUNVVEUgQUNDRU5UCisgICAgdSdcdTAyZGInICAgIyAgMHhGRSAtPiBPR09ORUsKKyAgICB1J1x1MDJjNycgICAjICAweEZGIC0+IENBUk9OCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfdHVya2lzaC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfdHVya2lzaC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkYzIzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY190dXJraXNoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfdHVya2lzaC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfdHVya2lzaC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkYzIzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY190dXJraXNoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYmNzLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWJjcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWY0NmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWJjcy5weQpAQCAtMCwwICsxLDQ3IEBACisiIiIgUHl0aG9uICdtYmNzJyBDb2RlYyBmb3IgV2luZG93cworCisKK0Nsb25lZCBieSBNYXJrIEhhbW1vbmQgKG1oYW1tb25kQHNraXBwaW5ldC5jb20uYXUpIGZyb20gYXNjaWkucHksCit3aGljaCB3YXMgd3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisKKyIiIgorIyBJbXBvcnQgdGhlbSBleHBsaWNpdGx5IHRvIGNhdXNlIGFuIEltcG9ydEVycm9yCisjIG9uIG5vbi1XaW5kb3dzIHN5c3RlbXMKK2Zyb20gY29kZWNzIGltcG9ydCBtYmNzX2VuY29kZSwgbWJjc19kZWNvZGUKKyMgZm9yIEluY3JlbWVudGFsRGVjb2RlciwgSW5jcmVtZW50YWxFbmNvZGVyLCAuLi4KK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworZW5jb2RlID0gbWJjc19lbmNvZGUKKworZGVmIGRlY29kZShpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICByZXR1cm4gbWJjc19kZWNvZGUoaW5wdXQsIGVycm9ycywgVHJ1ZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIG1iY3NfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgX2J1ZmZlcl9kZWNvZGUgPSBtYmNzX2RlY29kZQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgZW5jb2RlID0gbWJjc19lbmNvZGUKKworY2xhc3MgU3RyZWFtUmVhZGVyKGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGRlY29kZSA9IG1iY3NfZGVjb2RlCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nbWJjcycsCisgICAgICAgIGVuY29kZT1lbmNvZGUsCisgICAgICAgIGRlY29kZT1kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWJjcy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYmNzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZlN2NkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWJjcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWJjcy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYmNzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDZlN2NkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWJjcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcGFsbW9zLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcGFsbW9zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNzdlMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wYWxtb3MucHkKQEAgLTAsMCArMSw4MyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBmb3IgUGFsbU9TIDMuNS4KKworV3JpdHRlbiBieSBTam9lcmQgTXVsbGVuZGVyIChzam9lcmRAYWNtLm9yZyk7IGJhc2VkIG9uIGlzbzg4NTlfMTUucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX21hcCkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfbWFwKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3BhbG1vcycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCisKKyMgVGhlIFBhbG1PUyBjaGFyYWN0ZXIgc2V0IGlzIG1vc3RseSBpc28tODg1OS0xIHdpdGggc29tZSBkaWZmZXJlbmNlcy4KK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgICAgICAweDAwODA6IDB4MjBhYywgIyAgICAgICBFVVJPIFNJR04KKyAgICAgICAgMHgwMDgyOiAweDIwMWEsICMgICAgICAgU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDA4MzogMHgwMTkyLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgICAgICAweDAwODQ6IDB4MjAxZSwgIyAgICAgICBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMDg1OiAweDIwMjYsICMgICAgICAgSE9SSVpPTlRBTCBFTExJUFNJUworICAgICAgICAweDAwODY6IDB4MjAyMCwgIyAgICAgICBEQUdHRVIKKyAgICAgICAgMHgwMDg3OiAweDIwMjEsICMgICAgICAgRE9VQkxFIERBR0dFUgorICAgICAgICAweDAwODg6IDB4MDJjNiwgIyAgICAgICBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICAgICAgMHgwMDg5OiAweDIwMzAsICMgICAgICAgUEVSIE1JTExFIFNJR04KKyAgICAgICAgMHgwMDhhOiAweDAxNjAsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgICAgIDB4MDA4YjogMHgyMDM5LCAjICAgICAgIFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDA4YzogMHgwMTUyLCAjICAgICAgIExBVElOIENBUElUQUwgTElHQVRVUkUgT0UKKyAgICAgICAgMHgwMDhkOiAweDI2NjYsICMgICAgICAgQkxBQ0sgRElBTU9ORCBTVUlUCisgICAgICAgIDB4MDA4ZTogMHgyNjYzLCAjICAgICAgIEJMQUNLIENMVUIgU1VJVAorICAgICAgICAweDAwOGY6IDB4MjY2NSwgIyAgICAgICBCTEFDSyBIRUFSVCBTVUlUCisgICAgICAgIDB4MDA5MDogMHgyNjYwLCAjICAgICAgIEJMQUNLIFNQQURFIFNVSVQKKyAgICAgICAgMHgwMDkxOiAweDIwMTgsICMgICAgICAgTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMDkyOiAweDIwMTksICMgICAgICAgUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDA5MzogMHgyMDFjLCAjICAgICAgIExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDA5NDogMHgyMDFkLCAjICAgICAgIFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwOTU6IDB4MjAyMiwgIyAgICAgICBCVUxMRVQKKyAgICAgICAgMHgwMDk2OiAweDIwMTMsICMgICAgICAgRU4gREFTSAorICAgICAgICAweDAwOTc6IDB4MjAxNCwgIyAgICAgICBFTSBEQVNICisgICAgICAgIDB4MDA5ODogMHgwMmRjLCAjICAgICAgIFNNQUxMIFRJTERFCisgICAgICAgIDB4MDA5OTogMHgyMTIyLCAjICAgICAgIFRSQURFIE1BUksgU0lHTgorICAgICAgICAweDAwOWE6IDB4MDE2MSwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgICAgIDB4MDA5YzogMHgwMTUzLCAjICAgICAgIExBVElOIFNNQUxMIExJR0FUVVJFIE9FCisgICAgICAgIDB4MDA5ZjogMHgwMTc4LCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKK30pCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfZW5jb2RpbmdfbWFwKGRlY29kaW5nX21hcCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3BhbG1vcy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wYWxtb3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNWUzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wYWxtb3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3BhbG1vcy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wYWxtb3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNWUzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wYWxtb3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3B0Y3AxNTQucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wdGNwMTU0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZjg5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wdGNwMTU0LnB5CkBAIC0wLDAgKzEsMTc1IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGdlbmVyYXRlZCBmcm9tICdQVENQMTU0LnR4dCcgd2l0aCBnZW5jb2RlYy5weS4KKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisoYykgQ29weXJpZ2h0IDIwMDAgR3VpZG8gdmFuIFJvc3N1bS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ19tYXApCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX21hcClbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdwdGNwMTU0JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgICAgICAweDAwODA6IDB4MDQ5NiwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDA4MTogMHgwNDkyLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUgV0lUSCBTVFJPS0UKKyAgICAgICAgMHgwMDgyOiAweDA0ZWUsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICAgICAgMHgwMDgzOiAweDA0OTMsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUgV0lUSCBTVFJPS0UKKyAgICAgICAgMHgwMDg0OiAweDIwMWUsICMgICAgICAgIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwODU6IDB4MjAyNiwgIyAgICAgICAgSE9SSVpPTlRBTCBFTExJUFNJUworICAgICAgICAweDAwODY6IDB4MDRiNiwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDA4NzogMHgwNGFlLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTVFJBSUdIVCBVCisgICAgICAgIDB4MDA4ODogMHgwNGIyLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQSBXSVRIIERFU0NFTkRFUgorICAgICAgICAweDAwODk6IDB4MDRhZiwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNUUkFJR0hUIFUKKyAgICAgICAgMHgwMDhhOiAweDA0YTAsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEJBU0hLSVIgS0EKKyAgICAgICAgMHgwMDhiOiAweDA0ZTIsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICAgICAgMHgwMDhjOiAweDA0YTIsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVOIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDA4ZDogMHgwNDlhLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQSBXSVRIIERFU0NFTkRFUgorICAgICAgICAweDAwOGU6IDB4MDRiYSwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hIQQorICAgICAgICAweDAwOGY6IDB4MDRiOCwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFIFdJVEggVkVSVElDQUwgU1RST0tFCisgICAgICAgIDB4MDA5MDogMHgwNDk3LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDA5MTogMHgyMDE4LCAjICAgICAgICBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwOTI6IDB4MjAxOSwgIyAgICAgICAgUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDA5MzogMHgyMDFjLCAjICAgICAgICBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwOTQ6IDB4MjAxZCwgIyAgICAgICAgUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDA5NTogMHgyMDIyLCAjICAgICAgICBCVUxMRVQKKyAgICAgICAgMHgwMDk2OiAweDIwMTMsICMgICAgICAgIEVOIERBU0gKKyAgICAgICAgMHgwMDk3OiAweDIwMTQsICMgICAgICAgIEVNIERBU0gKKyAgICAgICAgMHgwMDk4OiAweDA0YjMsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBIQSBXSVRIIERFU0NFTkRFUgorICAgICAgICAweDAwOTk6IDB4MDRiNywgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRSBXSVRIIERFU0NFTkRFUgorICAgICAgICAweDAwOWE6IDB4MDRhMSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJBU0hLSVIgS0EKKyAgICAgICAgMHgwMDliOiAweDA0ZTMsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBJIFdJVEggTUFDUk9OCisgICAgICAgIDB4MDA5YzogMHgwNGEzLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU4gV0lUSCBERVNDRU5ERVIKKyAgICAgICAgMHgwMDlkOiAweDA0OWIsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBLQSBXSVRIIERFU0NFTkRFUgorICAgICAgICAweDAwOWU6IDB4MDRiYiwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNISEEKKyAgICAgICAgMHgwMDlmOiAweDA0YjksICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBDSEUgV0lUSCBWRVJUSUNBTCBTVFJPS0UKKyAgICAgICAgMHgwMGExOiAweDA0MGUsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIFUgKEJ5ZWxvcnVzc2lhbikKKyAgICAgICAgMHgwMGEyOiAweDA0NWUsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBVIChCeWVsb3J1c3NpYW4pCisgICAgICAgIDB4MDBhMzogMHgwNDA4LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBKRQorICAgICAgICAweDAwYTQ6IDB4MDRlOCwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkFSUkVEIE8KKyAgICAgICAgMHgwMGE1OiAweDA0OTgsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFpFIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDBhNjogMHgwNGIwLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTVFJBSUdIVCBVIFdJVEggU1RST0tFCisgICAgICAgIDB4MDBhODogMHgwNDAxLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJTworICAgICAgICAweDAwYWE6IDB4MDRkOCwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0NIV0EKKyAgICAgICAgMHgwMGFkOiAweDA0ZWYsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBVIFdJVEggTUFDUk9OCisgICAgICAgIDB4MDBhZjogMHgwNDljLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQSBXSVRIIFZFUlRJQ0FMIFNUUk9LRQorICAgICAgICAweDAwYjE6IDB4MDRiMSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNUUkFJR0hUIFUgV0lUSCBTVFJPS0UKKyAgICAgICAgMHgwMGIyOiAweDA0MDYsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgICAgICAweDAwYjM6IDB4MDQ1NiwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgICAgICAweDAwYjQ6IDB4MDQ5OSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDBiNTogMHgwNGU5LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQkFSUkVEIE8KKyAgICAgICAgMHgwMGI4OiAweDA0NTEsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBJTworICAgICAgICAweDAwYjk6IDB4MjExNiwgIyAgICAgICAgTlVNRVJPIFNJR04KKyAgICAgICAgMHgwMGJhOiAweDA0ZDksICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBTQ0hXQQorICAgICAgICAweDAwYmM6IDB4MDQ1OCwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEpFCisgICAgICAgIDB4MDBiZDogMHgwNGFhLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUyBXSVRIIERFU0NFTkRFUgorICAgICAgICAweDAwYmU6IDB4MDRhYiwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVTIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDBiZjogMHgwNDlkLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0EgV0lUSCBWRVJUSUNBTCBTVFJPS0UKKyAgICAgICAgMHgwMGMwOiAweDA0MTAsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEEKKyAgICAgICAgMHgwMGMxOiAweDA0MTEsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEJFCisgICAgICAgIDB4MDBjMjogMHgwNDEyLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRQorICAgICAgICAweDAwYzM6IDB4MDQxMywgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFCisgICAgICAgIDB4MDBjNDogMHgwNDE0LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBERQorICAgICAgICAweDAwYzU6IDB4MDQxNSwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUKKyAgICAgICAgMHgwMGM2OiAweDA0MTYsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRQorICAgICAgICAweDAwYzc6IDB4MDQxNywgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkUKKyAgICAgICAgMHgwMGM4OiAweDA0MTgsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEkKKyAgICAgICAgMHgwMGM5OiAweDA0MTksICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkKKyAgICAgICAgMHgwMGNhOiAweDA0MWEsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBCisgICAgICAgIDB4MDBjYjogMHgwNDFiLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTAorICAgICAgICAweDAwY2M6IDB4MDQxYywgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU0KKyAgICAgICAgMHgwMGNkOiAweDA0MWQsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVOCisgICAgICAgIDB4MDBjZTogMHgwNDFlLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBPCisgICAgICAgIDB4MDBjZjogMHgwNDFmLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBQRQorICAgICAgICAweDAwZDA6IDB4MDQyMCwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKyAgICAgICAgMHgwMGQxOiAweDA0MjEsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTCisgICAgICAgIDB4MDBkMjogMHgwNDIyLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBURQorICAgICAgICAweDAwZDM6IDB4MDQyMywgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVQorICAgICAgICAweDAwZDQ6IDB4MDQyNCwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUYKKyAgICAgICAgMHgwMGQ1OiAweDA0MjUsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBCisgICAgICAgIDB4MDBkNjogMHgwNDI2LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0UKKyAgICAgICAgMHgwMGQ3OiAweDA0MjcsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIENIRQorICAgICAgICAweDAwZDg6IDB4MDQyOCwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hBCisgICAgICAgIDB4MDBkOTogMHgwNDI5LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQQorICAgICAgICAweDAwZGE6IDB4MDQyYSwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEFSRCBTSUdOCisgICAgICAgIDB4MDBkYjogMHgwNDJiLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZRVJVCisgICAgICAgIDB4MDBkYzogMHgwNDJjLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTT0ZUIFNJR04KKyAgICAgICAgMHgwMGRkOiAweDA0MmQsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEUKKyAgICAgICAgMHgwMGRlOiAweDA0MmUsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlVCisgICAgICAgIDB4MDBkZjogMHgwNDJmLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZQQorICAgICAgICAweDAwZTA6IDB4MDQzMCwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKyAgICAgICAgMHgwMGUxOiAweDA0MzEsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorICAgICAgICAweDAwZTI6IDB4MDQzMiwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisgICAgICAgIDB4MDBlMzogMHgwNDMzLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFCisgICAgICAgIDB4MDBlNDogMHgwNDM0LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUKKyAgICAgICAgMHgwMGU1OiAweDA0MzUsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBJRQorICAgICAgICAweDAwZTY6IDB4MDQzNiwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorICAgICAgICAweDAwZTc6IDB4MDQzNywgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisgICAgICAgIDB4MDBlODogMHgwNDM4LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSQorICAgICAgICAweDAwZTk6IDB4MDQzOSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkKKyAgICAgICAgMHgwMGVhOiAweDA0M2EsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBLQQorICAgICAgICAweDAwZWI6IDB4MDQzYiwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMCisgICAgICAgIDB4MDBlYzogMHgwNDNjLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0KKyAgICAgICAgMHgwMGVkOiAweDA0M2QsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTgorICAgICAgICAweDAwZWU6IDB4MDQzZSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8KKyAgICAgICAgMHgwMGVmOiAweDA0M2YsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBQRQorICAgICAgICAweDAwZjA6IDB4MDQ0MCwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCisgICAgICAgIDB4MDBmMTogMHgwNDQxLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKyAgICAgICAgMHgwMGYyOiAweDA0NDIsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBURQorICAgICAgICAweDAwZjM6IDB4MDQ0MywgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUKKyAgICAgICAgMHgwMGY0OiAweDA0NDQsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorICAgICAgICAweDAwZjU6IDB4MDQ0NSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisgICAgICAgIDB4MDBmNjogMHgwNDQ2LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFCisgICAgICAgIDB4MDBmNzogMHgwNDQ3LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFCisgICAgICAgIDB4MDBmODogMHgwNDQ4LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBCisgICAgICAgIDB4MDBmOTogMHgwNDQ5LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEEKKyAgICAgICAgMHgwMGZhOiAweDA0NGEsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04KKyAgICAgICAgMHgwMGZiOiAweDA0NGIsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVCisgICAgICAgIDB4MDBmYzogMHgwNDRjLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisgICAgICAgIDB4MDBmZDogMHgwNDRkLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorICAgICAgICAweDAwZmU6IDB4MDQ0ZSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlVCisgICAgICAgIDB4MDBmZjogMHgwNDRmLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUEKK30pCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfZW5jb2RpbmdfbWFwKGRlY29kaW5nX21hcCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3B0Y3AxNTQucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHRjcDE1NC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwYmVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3B0Y3AxNTQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3B0Y3AxNTQucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHRjcDE1NC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwYmVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3B0Y3AxNTQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3B1bnljb2RlLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHVueWNvZGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3MjAwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3B1bnljb2RlLnB5CkBAIC0wLDAgKzEsMjM4IEBACisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCisiIiIgQ29kZWMgZm9yIHRoZSBQdW5pY29kZSBlbmNvZGluZywgYXMgc3BlY2lmaWVkIGluIFJGQyAzNDkyCisKK1dyaXR0ZW4gYnkgTWFydGluIHYuIEz2d2lzLgorIiIiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIEVuY29kaW5nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIHNlZ3JlZ2F0ZShzdHIpOgorICAgICIiIjMuMSBCYXNpYyBjb2RlIHBvaW50IHNlZ3JlZ2F0aW9uIiIiCisgICAgYmFzZSA9IFtdCisgICAgZXh0ZW5kZWQgPSB7fQorICAgIGZvciBjIGluIHN0cjoKKyAgICAgICAgaWYgb3JkKGMpIDwgMTI4OgorICAgICAgICAgICAgYmFzZS5hcHBlbmQoYykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV4dGVuZGVkW2NdID0gMQorICAgIGV4dGVuZGVkID0gZXh0ZW5kZWQua2V5cygpCisgICAgZXh0ZW5kZWQuc29ydCgpCisgICAgcmV0dXJuICIiLmpvaW4oYmFzZSkuZW5jb2RlKCJhc2NpaSIpLGV4dGVuZGVkCisKK2RlZiBzZWxlY3RpdmVfbGVuKHN0ciwgbWF4KToKKyAgICAiIiJSZXR1cm4gdGhlIGxlbmd0aCBvZiBzdHIsIGNvbnNpZGVyaW5nIG9ubHkgY2hhcmFjdGVycyBiZWxvdyBtYXguIiIiCisgICAgcmVzID0gMAorICAgIGZvciBjIGluIHN0cjoKKyAgICAgICAgaWYgb3JkKGMpIDwgbWF4OgorICAgICAgICAgICAgcmVzICs9IDEKKyAgICByZXR1cm4gcmVzCisKK2RlZiBzZWxlY3RpdmVfZmluZChzdHIsIGNoYXIsIGluZGV4LCBwb3MpOgorICAgICIiIlJldHVybiBhIHBhaXIgKGluZGV4LCBwb3MpLCBpbmRpY2F0aW5nIHRoZSBuZXh0IG9jY3VycmVuY2Ugb2YKKyAgICBjaGFyIGluIHN0ci4gaW5kZXggaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgY29uc2lkZXJpbmcKKyAgICBvbmx5IG9yZGluYWxzIHVwIHRvIGFuZCBpbmNsdWRpbmcgY2hhciwgYW5kIHBvcyBpcyB0aGUgcG9zaXRpb24gaW4KKyAgICB0aGUgZnVsbCBzdHJpbmcuIGluZGV4L3BvcyBpcyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gaW4gdGhlIGZ1bGwKKyAgICBzdHJpbmcuIiIiCisKKyAgICBsID0gbGVuKHN0cikKKyAgICB3aGlsZSAxOgorICAgICAgICBwb3MgKz0gMQorICAgICAgICBpZiBwb3MgPT0gbDoKKyAgICAgICAgICAgIHJldHVybiAoLTEsIC0xKQorICAgICAgICBjID0gc3RyW3Bvc10KKyAgICAgICAgaWYgYyA9PSBjaGFyOgorICAgICAgICAgICAgcmV0dXJuIGluZGV4KzEsIHBvcworICAgICAgICBlbGlmIGMgPCBjaGFyOgorICAgICAgICAgICAgaW5kZXggKz0gMQorCitkZWYgaW5zZXJ0aW9uX3Vuc29ydChzdHIsIGV4dGVuZGVkKToKKyAgICAiIiIzLjIgSW5zZXJ0aW9uIHVuc29ydCBjb2RpbmciIiIKKyAgICBvbGRjaGFyID0gMHg4MAorICAgIHJlc3VsdCA9IFtdCisgICAgb2xkaW5kZXggPSAtMQorICAgIGZvciBjIGluIGV4dGVuZGVkOgorICAgICAgICBpbmRleCA9IHBvcyA9IC0xCisgICAgICAgIGNoYXIgPSBvcmQoYykKKyAgICAgICAgY3VybGVuID0gc2VsZWN0aXZlX2xlbihzdHIsIGNoYXIpCisgICAgICAgIGRlbHRhID0gKGN1cmxlbisxKSAqIChjaGFyIC0gb2xkY2hhcikKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGluZGV4LHBvcyA9IHNlbGVjdGl2ZV9maW5kKHN0cixjLGluZGV4LHBvcykKKyAgICAgICAgICAgIGlmIGluZGV4ID09IC0xOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBkZWx0YSArPSBpbmRleCAtIG9sZGluZGV4CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGRlbHRhLTEpCisgICAgICAgICAgICBvbGRpbmRleCA9IGluZGV4CisgICAgICAgICAgICBkZWx0YSA9IDAKKyAgICAgICAgb2xkY2hhciA9IGNoYXIKKworICAgIHJldHVybiByZXN1bHQKKworZGVmIFQoaiwgYmlhcyk6CisgICAgIyBQdW55Y29kZSBwYXJhbWV0ZXJzOiB0bWluID0gMSwgdG1heCA9IDI2LCBiYXNlID0gMzYKKyAgICByZXMgPSAzNiAqIChqICsgMSkgLSBiaWFzCisgICAgaWYgcmVzIDwgMTogcmV0dXJuIDEKKyAgICBpZiByZXMgPiAyNjogcmV0dXJuIDI2CisgICAgcmV0dXJuIHJlcworCitkaWdpdHMgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IgorZGVmIGdlbmVyYXRlX2dlbmVyYWxpemVkX2ludGVnZXIoTiwgYmlhcyk6CisgICAgIiIiMy4zIEdlbmVyYWxpemVkIHZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VycyIiIgorICAgIHJlc3VsdCA9IFtdCisgICAgaiA9IDAKKyAgICB3aGlsZSAxOgorICAgICAgICB0ID0gVChqLCBiaWFzKQorICAgICAgICBpZiBOIDwgdDoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGlnaXRzW05dKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICByZXN1bHQuYXBwZW5kKGRpZ2l0c1t0ICsgKChOIC0gdCkgJSAoMzYgLSB0KSldKQorICAgICAgICBOID0gKE4gLSB0KSAvLyAoMzYgLSB0KQorICAgICAgICBqICs9IDEKKworZGVmIGFkYXB0KGRlbHRhLCBmaXJzdCwgbnVtY2hhcnMpOgorICAgIGlmIGZpcnN0OgorICAgICAgICBkZWx0YSAvLz0gNzAwCisgICAgZWxzZToKKyAgICAgICAgZGVsdGEgLy89IDIKKyAgICBkZWx0YSArPSBkZWx0YSAvLyBudW1jaGFycworICAgICMgKChiYXNlIC0gdG1pbikgKiB0bWF4KSAvLyAyID09IDQ1NQorICAgIGRpdmlzaW9ucyA9IDAKKyAgICB3aGlsZSBkZWx0YSA+IDQ1NToKKyAgICAgICAgZGVsdGEgPSBkZWx0YSAvLyAzNSAjIGJhc2UgLSB0bWluCisgICAgICAgIGRpdmlzaW9ucyArPSAzNgorICAgIGJpYXMgPSBkaXZpc2lvbnMgKyAoMzYgKiBkZWx0YSAvLyAoZGVsdGEgKyAzOCkpCisgICAgcmV0dXJuIGJpYXMKKworCitkZWYgZ2VuZXJhdGVfaW50ZWdlcnMoYmFzZWxlbiwgZGVsdGFzKToKKyAgICAiIiIzLjQgQmlhcyBhZGFwdGF0aW9uIiIiCisgICAgIyBQdW55Y29kZSBwYXJhbWV0ZXJzOiBpbml0aWFsIGJpYXMgPSA3MiwgZGFtcCA9IDcwMCwgc2tldyA9IDM4CisgICAgcmVzdWx0ID0gW10KKyAgICBiaWFzID0gNzIKKyAgICBmb3IgcG9pbnRzLCBkZWx0YSBpbiBlbnVtZXJhdGUoZGVsdGFzKToKKyAgICAgICAgcyA9IGdlbmVyYXRlX2dlbmVyYWxpemVkX2ludGVnZXIoZGVsdGEsIGJpYXMpCisgICAgICAgIHJlc3VsdC5leHRlbmQocykKKyAgICAgICAgYmlhcyA9IGFkYXB0KGRlbHRhLCBwb2ludHM9PTAsIGJhc2VsZW4rcG9pbnRzKzEpCisgICAgcmV0dXJuICIiLmpvaW4ocmVzdWx0KQorCitkZWYgcHVueWNvZGVfZW5jb2RlKHRleHQpOgorICAgIGJhc2UsIGV4dGVuZGVkID0gc2VncmVnYXRlKHRleHQpCisgICAgYmFzZSA9IGJhc2UuZW5jb2RlKCJhc2NpaSIpCisgICAgZGVsdGFzID0gaW5zZXJ0aW9uX3Vuc29ydCh0ZXh0LCBleHRlbmRlZCkKKyAgICBleHRlbmRlZCA9IGdlbmVyYXRlX2ludGVnZXJzKGxlbihiYXNlKSwgZGVsdGFzKQorICAgIGlmIGJhc2U6CisgICAgICAgIHJldHVybiBiYXNlICsgIi0iICsgZXh0ZW5kZWQKKyAgICByZXR1cm4gZXh0ZW5kZWQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIERlY29kaW5nICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIGRlY29kZV9nZW5lcmFsaXplZF9udW1iZXIoZXh0ZW5kZWQsIGV4dHBvcywgYmlhcywgZXJyb3JzKToKKyAgICAiIiIzLjMgR2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXJzIiIiCisgICAgcmVzdWx0ID0gMAorICAgIHcgPSAxCisgICAgaiA9IDAKKyAgICB3aGlsZSAxOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjaGFyID0gb3JkKGV4dGVuZGVkW2V4dHBvc10pCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgaWYgZXJyb3JzID09ICJzdHJpY3QiOgorICAgICAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgImluY29tcGxldGUgcHVuaWNvZGUgc3RyaW5nIgorICAgICAgICAgICAgcmV0dXJuIGV4dHBvcyArIDEsIE5vbmUKKyAgICAgICAgZXh0cG9zICs9IDEKKyAgICAgICAgaWYgMHg0MSA8PSBjaGFyIDw9IDB4NUE6ICMgQS1aCisgICAgICAgICAgICBkaWdpdCA9IGNoYXIgLSAweDQxCisgICAgICAgIGVsaWYgMHgzMCA8PSBjaGFyIDw9IDB4Mzk6CisgICAgICAgICAgICBkaWdpdCA9IGNoYXIgLSAyMiAjIDB4MzAtMjYKKyAgICAgICAgZWxpZiBlcnJvcnMgPT0gInN0cmljdCI6CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIkludmFsaWQgZXh0ZW5kZWQgY29kZSBwb2ludCAnJXMnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgZXh0ZW5kZWRbZXh0cG9zXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBleHRwb3MsIE5vbmUKKyAgICAgICAgdCA9IFQoaiwgYmlhcykKKyAgICAgICAgcmVzdWx0ICs9IGRpZ2l0ICogdworICAgICAgICBpZiBkaWdpdCA8IHQ6CisgICAgICAgICAgICByZXR1cm4gZXh0cG9zLCByZXN1bHQKKyAgICAgICAgdyA9IHcgKiAoMzYgLSB0KQorICAgICAgICBqICs9IDEKKworCitkZWYgaW5zZXJ0aW9uX3NvcnQoYmFzZSwgZXh0ZW5kZWQsIGVycm9ycyk6CisgICAgIiIiMy4yIEluc2VydGlvbiB1bnNvcnQgY29kaW5nIiIiCisgICAgY2hhciA9IDB4ODAKKyAgICBwb3MgPSAtMQorICAgIGJpYXMgPSA3MgorICAgIGV4dHBvcyA9IDAKKyAgICB3aGlsZSBleHRwb3MgPCBsZW4oZXh0ZW5kZWQpOgorICAgICAgICBuZXdwb3MsIGRlbHRhID0gZGVjb2RlX2dlbmVyYWxpemVkX251bWJlcihleHRlbmRlZCwgZXh0cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWFzLCBlcnJvcnMpCisgICAgICAgIGlmIGRlbHRhIGlzIE5vbmU6CisgICAgICAgICAgICAjIFRoZXJlIHdhcyBhbiBlcnJvciBpbiBkZWNvZGluZy4gV2UgY2FuJ3QgY29udGludWUgYmVjYXVzZQorICAgICAgICAgICAgIyBzeW5jaHJvbml6YXRpb24gaXMgbG9zdC4KKyAgICAgICAgICAgIHJldHVybiBiYXNlCisgICAgICAgIHBvcyArPSBkZWx0YSsxCisgICAgICAgIGNoYXIgKz0gcG9zIC8vIChsZW4oYmFzZSkgKyAxKQorICAgICAgICBpZiBjaGFyID4gMHgxMEZGRkY6CisgICAgICAgICAgICBpZiBlcnJvcnMgPT0gInN0cmljdCI6CisgICAgICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAoIkludmFsaWQgY2hhcmFjdGVyIFUrJXgiICUgY2hhcikKKyAgICAgICAgICAgIGNoYXIgPSBvcmQoJz8nKQorICAgICAgICBwb3MgPSBwb3MgJSAobGVuKGJhc2UpICsgMSkKKyAgICAgICAgYmFzZSA9IGJhc2VbOnBvc10gKyB1bmljaHIoY2hhcikgKyBiYXNlW3BvczpdCisgICAgICAgIGJpYXMgPSBhZGFwdChkZWx0YSwgKGV4dHBvcyA9PSAwKSwgbGVuKGJhc2UpKQorICAgICAgICBleHRwb3MgPSBuZXdwb3MKKyAgICByZXR1cm4gYmFzZQorCitkZWYgcHVueWNvZGVfZGVjb2RlKHRleHQsIGVycm9ycyk6CisgICAgcG9zID0gdGV4dC5yZmluZCgiLSIpCisgICAgaWYgcG9zID09IC0xOgorICAgICAgICBiYXNlID0gIiIKKyAgICAgICAgZXh0ZW5kZWQgPSB0ZXh0CisgICAgZWxzZToKKyAgICAgICAgYmFzZSA9IHRleHRbOnBvc10KKyAgICAgICAgZXh0ZW5kZWQgPSB0ZXh0W3BvcysxOl0KKyAgICBiYXNlID0gdW5pY29kZShiYXNlLCAiYXNjaWkiLCBlcnJvcnMpCisgICAgZXh0ZW5kZWQgPSBleHRlbmRlZC51cHBlcigpCisgICAgcmV0dXJuIGluc2VydGlvbl9zb3J0KGJhc2UsIGV4dGVuZGVkLCBlcnJvcnMpCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmVzID0gcHVueWNvZGVfZW5jb2RlKGlucHV0KQorICAgICAgICByZXR1cm4gcmVzLCBsZW4oaW5wdXQpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgaWYgZXJyb3JzIG5vdCBpbiAoJ3N0cmljdCcsICdyZXBsYWNlJywgJ2lnbm9yZScpOgorICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgIitlcnJvcnMKKyAgICAgICAgcmVzID0gcHVueWNvZGVfZGVjb2RlKGlucHV0LCBlcnJvcnMpCisgICAgICAgIHJldHVybiByZXMsIGxlbihpbnB1dCkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIHB1bnljb2RlX2VuY29kZShpbnB1dCkKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgaWYgc2VsZi5lcnJvcnMgbm90IGluICgnc3RyaWN0JywgJ3JlcGxhY2UnLCAnaWdub3JlJyk6CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICJVbnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyAiK3NlbGYuZXJyb3JzCisgICAgICAgIHJldHVybiBwdW55Y29kZV9kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3B1bnljb2RlJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHVueWNvZGUucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHVueWNvZGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYjA5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wdW55Y29kZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHVueWNvZGUucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHVueWNvZGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYjA5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wdW55Y29kZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcXVvcHJpX2NvZGVjLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcXVvcHJpX2NvZGVjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjgzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9xdW9wcmlfY29kZWMucHkKQEAgLTAsMCArMSw3NSBAQAorIiIiQ29kZWMgZm9yIHF1b3RlZC1wcmludGFibGUgZW5jb2RpbmcuCisKK0xpa2UgYmFzZTY0IGFuZCByb3QxMywgdGhpcyByZXR1cm5zIFB5dGhvbiBzdHJpbmdzLCBub3QgVW5pY29kZS4KKyIiIgorCitpbXBvcnQgY29kZWNzLCBxdW9wcmkKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitkZWYgcXVvcHJpX2VuY29kZShpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAiIiJFbmNvZGUgdGhlIGlucHV0LCByZXR1cm5pbmcgYSB0dXBsZSAob3V0cHV0IG9iamVjdCwgbGVuZ3RoIGNvbnN1bWVkKS4KKworICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KKyAgICAnc3RyaWN0JyBoYW5kbGluZyB3aGljaCBpcyB0aGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgZXJyb3IgaGFuZGxpbmcgZm9yIHRoaXMgY29kZWMuCisKKyAgICAiIiIKKyAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCisgICAgIyB1c2luZyBzdHIoKSBiZWNhdXNlIG9mIGNTdHJpbmdJTydzIFVuaWNvZGUgdW5kZXNpcmVkIFVuaWNvZGUgYmVoYXZpb3IuCisgICAgZiA9IFN0cmluZ0lPKHN0cihpbnB1dCkpCisgICAgZyA9IFN0cmluZ0lPKCkKKyAgICBxdW9wcmkuZW5jb2RlKGYsIGcsIDEpCisgICAgb3V0cHV0ID0gZy5nZXR2YWx1ZSgpCisgICAgcmV0dXJuIChvdXRwdXQsIGxlbihpbnB1dCkpCisKK2RlZiBxdW9wcmlfZGVjb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgICIiIkRlY29kZSB0aGUgaW5wdXQsIHJldHVybmluZyBhIHR1cGxlIChvdXRwdXQgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgorCisgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bworICAgICdzdHJpY3QnIGhhbmRsaW5nIHdoaWNoIGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICBlcnJvciBoYW5kbGluZyBmb3IgdGhpcyBjb2RlYy4KKworICAgICIiIgorICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKKyAgICBmID0gU3RyaW5nSU8oc3RyKGlucHV0KSkKKyAgICBnID0gU3RyaW5nSU8oKQorICAgIHF1b3ByaS5kZWNvZGUoZiwgZykKKyAgICBvdXRwdXQgPSBnLmdldHZhbHVlKCkKKyAgICByZXR1cm4gKG91dHB1dCwgbGVuKGlucHV0KSkKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIHF1b3ByaV9lbmNvZGUoaW5wdXQsZXJyb3JzKQorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIHF1b3ByaV9kZWNvZGUoaW5wdXQsZXJyb3JzKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gcXVvcHJpX2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBxdW9wcmlfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3F1b3ByaScsCisgICAgICAgIGVuY29kZT1xdW9wcmlfZW5jb2RlLAorICAgICAgICBkZWNvZGU9cXVvcHJpX2RlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9xdW9wcmlfY29kZWMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcXVvcHJpX2NvZGVjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmIyYmMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcXVvcHJpX2NvZGVjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9xdW9wcmlfY29kZWMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcXVvcHJpX2NvZGVjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzg1MGIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcXVvcHJpX2NvZGVjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yYXdfdW5pY29kZV9lc2NhcGUucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yYXdfdW5pY29kZV9lc2NhcGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI5MTliNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Jhd191bmljb2RlX2VzY2FwZS5weQpAQCAtMCwwICsxLDQ1IEBACisiIiIgUHl0aG9uICdyYXctdW5pY29kZS1lc2NhcGUnIENvZGVjCisKKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisKKyIiIgoraW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgIyBOb3RlOiBCaW5kaW5nIHRoZXNlIGFzIEMgZnVuY3Rpb25zIHdpbGwgcmVzdWx0IGluIHRoZSBjbGFzcyBub3QKKyAgICAjIGNvbnZlcnRpbmcgdGhlbSB0byBtZXRob2RzLiBUaGlzIGlzIGludGVuZGVkLgorICAgIGVuY29kZSA9IGNvZGVjcy5yYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5yYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5yYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdyYXctdW5pY29kZS1lc2NhcGUnLAorICAgICAgICBlbmNvZGU9Q29kZWMuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Jhd191bmljb2RlX2VzY2FwZS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yYXdfdW5pY29kZV9lc2NhcGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZDUyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yYXdfdW5pY29kZV9lc2NhcGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Jhd191bmljb2RlX2VzY2FwZS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yYXdfdW5pY29kZV9lc2NhcGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZDUyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yYXdfdW5pY29kZV9lc2NhcGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3JvdF8xMy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3JvdF8xMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmI2NDMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvcm90XzEzLnB5CkBAIC0wLDAgKzEsMTE4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgZm9yIFJPVDEzLgorCisgICAgU2VlIGh0dHA6Ly91Y3N1Yi5jb2xvcmFkby5lZHUvfmtvbWluZWsvcm90MTMvIGZvciBkZXRhaWxzLgorCisgICAgV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfbWFwKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ19tYXApWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ncm90LTEzJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgMHgwMDQxOiAweDAwNGUsCisgICAweDAwNDI6IDB4MDA0ZiwKKyAgIDB4MDA0MzogMHgwMDUwLAorICAgMHgwMDQ0OiAweDAwNTEsCisgICAweDAwNDU6IDB4MDA1MiwKKyAgIDB4MDA0NjogMHgwMDUzLAorICAgMHgwMDQ3OiAweDAwNTQsCisgICAweDAwNDg6IDB4MDA1NSwKKyAgIDB4MDA0OTogMHgwMDU2LAorICAgMHgwMDRhOiAweDAwNTcsCisgICAweDAwNGI6IDB4MDA1OCwKKyAgIDB4MDA0YzogMHgwMDU5LAorICAgMHgwMDRkOiAweDAwNWEsCisgICAweDAwNGU6IDB4MDA0MSwKKyAgIDB4MDA0ZjogMHgwMDQyLAorICAgMHgwMDUwOiAweDAwNDMsCisgICAweDAwNTE6IDB4MDA0NCwKKyAgIDB4MDA1MjogMHgwMDQ1LAorICAgMHgwMDUzOiAweDAwNDYsCisgICAweDAwNTQ6IDB4MDA0NywKKyAgIDB4MDA1NTogMHgwMDQ4LAorICAgMHgwMDU2OiAweDAwNDksCisgICAweDAwNTc6IDB4MDA0YSwKKyAgIDB4MDA1ODogMHgwMDRiLAorICAgMHgwMDU5OiAweDAwNGMsCisgICAweDAwNWE6IDB4MDA0ZCwKKyAgIDB4MDA2MTogMHgwMDZlLAorICAgMHgwMDYyOiAweDAwNmYsCisgICAweDAwNjM6IDB4MDA3MCwKKyAgIDB4MDA2NDogMHgwMDcxLAorICAgMHgwMDY1OiAweDAwNzIsCisgICAweDAwNjY6IDB4MDA3MywKKyAgIDB4MDA2NzogMHgwMDc0LAorICAgMHgwMDY4OiAweDAwNzUsCisgICAweDAwNjk6IDB4MDA3NiwKKyAgIDB4MDA2YTogMHgwMDc3LAorICAgMHgwMDZiOiAweDAwNzgsCisgICAweDAwNmM6IDB4MDA3OSwKKyAgIDB4MDA2ZDogMHgwMDdhLAorICAgMHgwMDZlOiAweDAwNjEsCisgICAweDAwNmY6IDB4MDA2MiwKKyAgIDB4MDA3MDogMHgwMDYzLAorICAgMHgwMDcxOiAweDAwNjQsCisgICAweDAwNzI6IDB4MDA2NSwKKyAgIDB4MDA3MzogMHgwMDY2LAorICAgMHgwMDc0OiAweDAwNjcsCisgICAweDAwNzU6IDB4MDA2OCwKKyAgIDB4MDA3NjogMHgwMDY5LAorICAgMHgwMDc3OiAweDAwNmEsCisgICAweDAwNzg6IDB4MDA2YiwKKyAgIDB4MDA3OTogMHgwMDZjLAorICAgMHgwMDdhOiAweDAwNmQsCit9KQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2VuY29kaW5nX21hcChkZWNvZGluZ19tYXApCisKKyMjIyBGaWx0ZXIgQVBJCisKK2RlZiByb3QxMyhpbmZpbGUsIG91dGZpbGUpOgorICAgIG91dGZpbGUud3JpdGUoaW5maWxlLnJlYWQoKS5lbmNvZGUoJ3JvdC0xMycpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBzeXMKKyAgICByb3QxMyhzeXMuc3RkaW4sIHN5cy5zdGRvdXQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yb3RfMTMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvcm90XzEzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjc0OTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvcm90XzEzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yb3RfMTMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvcm90XzEzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjc0OTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvcm90XzEzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXMucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzODExNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppcy5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIHNoaWZ0X2ppcy5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIFNISUZUX0pJUworIworIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KKyMKKworaW1wb3J0IF9jb2RlY3NfanAsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2pwLmdldGNvZGVjKCdzaGlmdF9qaXMnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nc2hpZnRfamlzJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjMzYzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjMzYzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzXzIwMDQucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjFiMWU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzXzIwMDQucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBzaGlmdF9qaXNfMjAwNC5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIFNISUZUX0pJU18yMDA0CisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ3NoaWZ0X2ppc18yMDA0JykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3NoaWZ0X2ppc18yMDA0JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzXzIwMDQucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzXzIwMDQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYzVkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzXzIwMDQucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzXzIwMDQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYzVkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjY1M2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBzaGlmdF9qaXN4MDIxMy5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIFNISUZUX0pJU1gwMjEzCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ3NoaWZ0X2ppc3gwMjEzJykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3NoaWZ0X2ppc3gwMjEzJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYjM1NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYjM1NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc3RyaW5nX2VzY2FwZS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3N0cmluZ19lc2NhcGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyOWEyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3N0cmluZ19lc2NhcGUucHkKQEAgLTAsMCArMSwzOCBAQAorIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQorIiIiIFB5dGhvbiAnZXNjYXBlJyBDb2RlYworCisKK1dyaXR0ZW4gYnkgTWFydGluIHYuIEz2d2lzIChtYXJ0aW5Adi5sb2V3aXMuZGUpLgorCisiIiIKK2ltcG9ydCBjb2RlY3MKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGVuY29kZSA9IGNvZGVjcy5lc2NhcGVfZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWNzLmVzY2FwZV9kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5lc2NhcGVfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5lc2NhcGVfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3N0cmluZy1lc2NhcGUnLAorICAgICAgICBlbmNvZGU9Q29kZWMuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3N0cmluZ19lc2NhcGUucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc3RyaW5nX2VzY2FwZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2NzYxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3N0cmluZ19lc2NhcGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3N0cmluZ19lc2NhcGUucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc3RyaW5nX2VzY2FwZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2NzYxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3N0cmluZ19lc2NhcGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Rpc182MjAucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy90aXNfNjIwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyY2QyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy90aXNfNjIwLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIHRpc182MjAgZ2VuZXJhdGVkIGZyb20gJ3B5dGhvbi1tYXBwaW5ncy9USVMtNjIwLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3Rpcy02MjAnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1MGUwMScgICAjICAweEExIC0+IFRIQUkgQ0hBUkFDVEVSIEtPIEtBSQorICAgIHUnXHUwZTAyJyAgICMgIDB4QTIgLT4gVEhBSSBDSEFSQUNURVIgS0hPIEtIQUkKKyAgICB1J1x1MGUwMycgICAjICAweEEzIC0+IFRIQUkgQ0hBUkFDVEVSIEtITyBLSFVBVAorICAgIHUnXHUwZTA0JyAgICMgIDB4QTQgLT4gVEhBSSBDSEFSQUNURVIgS0hPIEtIV0FJCisgICAgdSdcdTBlMDUnICAgIyAgMHhBNSAtPiBUSEFJIENIQVJBQ1RFUiBLSE8gS0hPTgorICAgIHUnXHUwZTA2JyAgICMgIDB4QTYgLT4gVEhBSSBDSEFSQUNURVIgS0hPIFJBS0hBTkcKKyAgICB1J1x1MGUwNycgICAjICAweEE3IC0+IFRIQUkgQ0hBUkFDVEVSIE5HTyBOR1UKKyAgICB1J1x1MGUwOCcgICAjICAweEE4IC0+IFRIQUkgQ0hBUkFDVEVSIENITyBDSEFOCisgICAgdSdcdTBlMDknICAgIyAgMHhBOSAtPiBUSEFJIENIQVJBQ1RFUiBDSE8gQ0hJTkcKKyAgICB1J1x1MGUwYScgICAjICAweEFBIC0+IFRIQUkgQ0hBUkFDVEVSIENITyBDSEFORworICAgIHUnXHUwZTBiJyAgICMgIDB4QUIgLT4gVEhBSSBDSEFSQUNURVIgU08gU08KKyAgICB1J1x1MGUwYycgICAjICAweEFDIC0+IFRIQUkgQ0hBUkFDVEVSIENITyBDSE9FCisgICAgdSdcdTBlMGQnICAgIyAgMHhBRCAtPiBUSEFJIENIQVJBQ1RFUiBZTyBZSU5HCisgICAgdSdcdTBlMGUnICAgIyAgMHhBRSAtPiBUSEFJIENIQVJBQ1RFUiBETyBDSEFEQQorICAgIHUnXHUwZTBmJyAgICMgIDB4QUYgLT4gVEhBSSBDSEFSQUNURVIgVE8gUEFUQUsKKyAgICB1J1x1MGUxMCcgICAjICAweEIwIC0+IFRIQUkgQ0hBUkFDVEVSIFRITyBUSEFOCisgICAgdSdcdTBlMTEnICAgIyAgMHhCMSAtPiBUSEFJIENIQVJBQ1RFUiBUSE8gTkFOR01PTlRITworICAgIHUnXHUwZTEyJyAgICMgIDB4QjIgLT4gVEhBSSBDSEFSQUNURVIgVEhPIFBIVVRIQU8KKyAgICB1J1x1MGUxMycgICAjICAweEIzIC0+IFRIQUkgQ0hBUkFDVEVSIE5PIE5FTgorICAgIHUnXHUwZTE0JyAgICMgIDB4QjQgLT4gVEhBSSBDSEFSQUNURVIgRE8gREVLCisgICAgdSdcdTBlMTUnICAgIyAgMHhCNSAtPiBUSEFJIENIQVJBQ1RFUiBUTyBUQU8KKyAgICB1J1x1MGUxNicgICAjICAweEI2IC0+IFRIQUkgQ0hBUkFDVEVSIFRITyBUSFVORworICAgIHUnXHUwZTE3JyAgICMgIDB4QjcgLT4gVEhBSSBDSEFSQUNURVIgVEhPIFRIQUhBTgorICAgIHUnXHUwZTE4JyAgICMgIDB4QjggLT4gVEhBSSBDSEFSQUNURVIgVEhPIFRIT05HCisgICAgdSdcdTBlMTknICAgIyAgMHhCOSAtPiBUSEFJIENIQVJBQ1RFUiBOTyBOVQorICAgIHUnXHUwZTFhJyAgICMgIDB4QkEgLT4gVEhBSSBDSEFSQUNURVIgQk8gQkFJTUFJCisgICAgdSdcdTBlMWInICAgIyAgMHhCQiAtPiBUSEFJIENIQVJBQ1RFUiBQTyBQTEEKKyAgICB1J1x1MGUxYycgICAjICAweEJDIC0+IFRIQUkgQ0hBUkFDVEVSIFBITyBQSFVORworICAgIHUnXHUwZTFkJyAgICMgIDB4QkQgLT4gVEhBSSBDSEFSQUNURVIgRk8gRkEKKyAgICB1J1x1MGUxZScgICAjICAweEJFIC0+IFRIQUkgQ0hBUkFDVEVSIFBITyBQSEFOCisgICAgdSdcdTBlMWYnICAgIyAgMHhCRiAtPiBUSEFJIENIQVJBQ1RFUiBGTyBGQU4KKyAgICB1J1x1MGUyMCcgICAjICAweEMwIC0+IFRIQUkgQ0hBUkFDVEVSIFBITyBTQU1QSEFPCisgICAgdSdcdTBlMjEnICAgIyAgMHhDMSAtPiBUSEFJIENIQVJBQ1RFUiBNTyBNQQorICAgIHUnXHUwZTIyJyAgICMgIDB4QzIgLT4gVEhBSSBDSEFSQUNURVIgWU8gWUFLCisgICAgdSdcdTBlMjMnICAgIyAgMHhDMyAtPiBUSEFJIENIQVJBQ1RFUiBSTyBSVUEKKyAgICB1J1x1MGUyNCcgICAjICAweEM0IC0+IFRIQUkgQ0hBUkFDVEVSIFJVCisgICAgdSdcdTBlMjUnICAgIyAgMHhDNSAtPiBUSEFJIENIQVJBQ1RFUiBMTyBMSU5HCisgICAgdSdcdTBlMjYnICAgIyAgMHhDNiAtPiBUSEFJIENIQVJBQ1RFUiBMVQorICAgIHUnXHUwZTI3JyAgICMgIDB4QzcgLT4gVEhBSSBDSEFSQUNURVIgV08gV0FFTgorICAgIHUnXHUwZTI4JyAgICMgIDB4QzggLT4gVEhBSSBDSEFSQUNURVIgU08gU0FMQQorICAgIHUnXHUwZTI5JyAgICMgIDB4QzkgLT4gVEhBSSBDSEFSQUNURVIgU08gUlVTSQorICAgIHUnXHUwZTJhJyAgICMgIDB4Q0EgLT4gVEhBSSBDSEFSQUNURVIgU08gU1VBCisgICAgdSdcdTBlMmInICAgIyAgMHhDQiAtPiBUSEFJIENIQVJBQ1RFUiBITyBISVAKKyAgICB1J1x1MGUyYycgICAjICAweENDIC0+IFRIQUkgQ0hBUkFDVEVSIExPIENIVUxBCisgICAgdSdcdTBlMmQnICAgIyAgMHhDRCAtPiBUSEFJIENIQVJBQ1RFUiBPIEFORworICAgIHUnXHUwZTJlJyAgICMgIDB4Q0UgLT4gVEhBSSBDSEFSQUNURVIgSE8gTk9LSFVLCisgICAgdSdcdTBlMmYnICAgIyAgMHhDRiAtPiBUSEFJIENIQVJBQ1RFUiBQQUlZQU5OT0kKKyAgICB1J1x1MGUzMCcgICAjICAweEQwIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgQQorICAgIHUnXHUwZTMxJyAgICMgIDB4RDEgLT4gVEhBSSBDSEFSQUNURVIgTUFJIEhBTi1BS0FUCisgICAgdSdcdTBlMzInICAgIyAgMHhEMiAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEFBCisgICAgdSdcdTBlMzMnICAgIyAgMHhEMyAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEFNCisgICAgdSdcdTBlMzQnICAgIyAgMHhENCAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEkKKyAgICB1J1x1MGUzNScgICAjICAweEQ1IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgSUkKKyAgICB1J1x1MGUzNicgICAjICAweEQ2IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgVUUKKyAgICB1J1x1MGUzNycgICAjICAweEQ3IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgVUVFCisgICAgdSdcdTBlMzgnICAgIyAgMHhEOCAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIFUKKyAgICB1J1x1MGUzOScgICAjICAweEQ5IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgVVUKKyAgICB1J1x1MGUzYScgICAjICAweERBIC0+IFRIQUkgQ0hBUkFDVEVSIFBISU5USFUKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1MGUzZicgICAjICAweERGIC0+IFRIQUkgQ1VSUkVOQ1kgU1lNQk9MIEJBSFQKKyAgICB1J1x1MGU0MCcgICAjICAweEUwIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgRQorICAgIHUnXHUwZTQxJyAgICMgIDB4RTEgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBBRQorICAgIHUnXHUwZTQyJyAgICMgIDB4RTIgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBPCisgICAgdSdcdTBlNDMnICAgIyAgMHhFMyAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEFJIE1BSU1VQU4KKyAgICB1J1x1MGU0NCcgICAjICAweEU0IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUkgTUFJTUFMQUkKKyAgICB1J1x1MGU0NScgICAjICAweEU1IC0+IFRIQUkgQ0hBUkFDVEVSIExBS0tIQU5HWUFPCisgICAgdSdcdTBlNDYnICAgIyAgMHhFNiAtPiBUSEFJIENIQVJBQ1RFUiBNQUlZQU1PSworICAgIHUnXHUwZTQ3JyAgICMgIDB4RTcgLT4gVEhBSSBDSEFSQUNURVIgTUFJVEFJS0hVCisgICAgdSdcdTBlNDgnICAgIyAgMHhFOCAtPiBUSEFJIENIQVJBQ1RFUiBNQUkgRUsKKyAgICB1J1x1MGU0OScgICAjICAweEU5IC0+IFRIQUkgQ0hBUkFDVEVSIE1BSSBUSE8KKyAgICB1J1x1MGU0YScgICAjICAweEVBIC0+IFRIQUkgQ0hBUkFDVEVSIE1BSSBUUkkKKyAgICB1J1x1MGU0YicgICAjICAweEVCIC0+IFRIQUkgQ0hBUkFDVEVSIE1BSSBDSEFUVEFXQQorICAgIHUnXHUwZTRjJyAgICMgIDB4RUMgLT4gVEhBSSBDSEFSQUNURVIgVEhBTlRIQUtIQVQKKyAgICB1J1x1MGU0ZCcgICAjICAweEVEIC0+IFRIQUkgQ0hBUkFDVEVSIE5JS0hBSElUCisgICAgdSdcdTBlNGUnICAgIyAgMHhFRSAtPiBUSEFJIENIQVJBQ1RFUiBZQU1BS0tBTgorICAgIHUnXHUwZTRmJyAgICMgIDB4RUYgLT4gVEhBSSBDSEFSQUNURVIgRk9OR01BTgorICAgIHUnXHUwZTUwJyAgICMgIDB4RjAgLT4gVEhBSSBESUdJVCBaRVJPCisgICAgdSdcdTBlNTEnICAgIyAgMHhGMSAtPiBUSEFJIERJR0lUIE9ORQorICAgIHUnXHUwZTUyJyAgICMgIDB4RjIgLT4gVEhBSSBESUdJVCBUV08KKyAgICB1J1x1MGU1MycgICAjICAweEYzIC0+IFRIQUkgRElHSVQgVEhSRUUKKyAgICB1J1x1MGU1NCcgICAjICAweEY0IC0+IFRIQUkgRElHSVQgRk9VUgorICAgIHUnXHUwZTU1JyAgICMgIDB4RjUgLT4gVEhBSSBESUdJVCBGSVZFCisgICAgdSdcdTBlNTYnICAgIyAgMHhGNiAtPiBUSEFJIERJR0lUIFNJWAorICAgIHUnXHUwZTU3JyAgICMgIDB4RjcgLT4gVEhBSSBESUdJVCBTRVZFTgorICAgIHUnXHUwZTU4JyAgICMgIDB4RjggLT4gVEhBSSBESUdJVCBFSUdIVAorICAgIHUnXHUwZTU5JyAgICMgIDB4RjkgLT4gVEhBSSBESUdJVCBOSU5FCisgICAgdSdcdTBlNWEnICAgIyAgMHhGQSAtPiBUSEFJIENIQVJBQ1RFUiBBTkdLSEFOS0hVCisgICAgdSdcdTBlNWInICAgIyAgMHhGQiAtPiBUSEFJIENIQVJBQ1RFUiBLSE9NVVQKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Rpc182MjAucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdGlzXzYyMC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2OWZhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Rpc182MjAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Rpc182MjAucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdGlzXzYyMC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY2OWZhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Rpc182MjAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuZGVmaW5lZC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuZGVmaW5lZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjkwMjg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5kZWZpbmVkLnB5CkBAIC0wLDAgKzEsNDkgQEAKKyIiIiBQeXRob24gJ3VuZGVmaW5lZCcgQ29kZWMKKworICAgIFRoaXMgY29kZWMgd2lsbCBhbHdheXMgcmFpc2UgYSBWYWx1ZUVycm9yIGV4Y2VwdGlvbiB3aGVuIGJlaW5nCisgICAgdXNlZC4gSXQgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSB0aGUgc2l0ZS5weSBmaWxlIHRvIHN3aXRjaCBvZmYKKyAgICBhdXRvbWF0aWMgc3RyaW5nIHRvIFVuaWNvZGUgY29lcmNpb24uCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoInVuZGVmaW5lZCBlbmNvZGluZyIpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJ1bmRlZmluZWQgZW5jb2RpbmciKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoInVuZGVmaW5lZCBlbmNvZGluZyIpCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigidW5kZWZpbmVkIGVuY29kaW5nIikKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSd1bmRlZmluZWQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmRlZmluZWQucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5kZWZpbmVkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzRkNmFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5kZWZpbmVkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmRlZmluZWQucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5kZWZpbmVkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzRkNmFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5kZWZpbmVkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmljb2RlX2VzY2FwZS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuaWNvZGVfZXNjYXBlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxN2Y5MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmljb2RlX2VzY2FwZS5weQpAQCAtMCwwICsxLDQ1IEBACisiIiIgUHl0aG9uICd1bmljb2RlLWVzY2FwZScgQ29kZWMKKworCitXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KKworIiIiCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICAjIE5vdGU6IEJpbmRpbmcgdGhlc2UgYXMgQyBmdW5jdGlvbnMgd2lsbCByZXN1bHQgaW4gdGhlIGNsYXNzIG5vdAorICAgICMgY29udmVydGluZyB0aGVtIHRvIG1ldGhvZHMuIFRoaXMgaXMgaW50ZW5kZWQuCisgICAgZW5jb2RlID0gY29kZWNzLnVuaWNvZGVfZXNjYXBlX2VuY29kZQorICAgIGRlY29kZSA9IGNvZGVjcy51bmljb2RlX2VzY2FwZV9kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy51bmljb2RlX2VzY2FwZV9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLnVuaWNvZGVfZXNjYXBlX2RlY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ndW5pY29kZS1lc2NhcGUnLAorICAgICAgICBlbmNvZGU9Q29kZWMuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuaWNvZGVfZXNjYXBlLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuaWNvZGVfZXNjYXBlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc2MzJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5pY29kZV9lc2NhcGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuaWNvZGVfZXNjYXBlLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuaWNvZGVfZXNjYXBlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc2MzJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5pY29kZV9lc2NhcGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuaWNvZGVfaW50ZXJuYWwucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmljb2RlX2ludGVybmFsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmM2U3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmljb2RlX2ludGVybmFsLnB5CkBAIC0wLDAgKzEsNDUgQEAKKyIiIiBQeXRob24gJ3VuaWNvZGUtaW50ZXJuYWwnIENvZGVjCisKKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisKKyIiIgoraW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgIyBOb3RlOiBCaW5kaW5nIHRoZXNlIGFzIEMgZnVuY3Rpb25zIHdpbGwgcmVzdWx0IGluIHRoZSBjbGFzcyBub3QKKyAgICAjIGNvbnZlcnRpbmcgdGhlbSB0byBtZXRob2RzLiBUaGlzIGlzIGludGVuZGVkLgorICAgIGVuY29kZSA9IGNvZGVjcy51bmljb2RlX2ludGVybmFsX2VuY29kZQorICAgIGRlY29kZSA9IGNvZGVjcy51bmljb2RlX2ludGVybmFsX2RlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLnVuaWNvZGVfaW50ZXJuYWxfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy51bmljb2RlX2ludGVybmFsX2RlY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ndW5pY29kZS1pbnRlcm5hbCcsCisgICAgICAgIGVuY29kZT1Db2RlYy5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYy5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5pY29kZV9pbnRlcm5hbC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmljb2RlX2ludGVybmFsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjUzYjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5pY29kZV9pbnRlcm5hbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5pY29kZV9pbnRlcm5hbC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmljb2RlX2ludGVybmFsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjUzYjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5pY29kZV9pbnRlcm5hbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZmFkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTYucHkKQEAgLTAsMCArMSwxMjYgQEAKKyIiIiBQeXRob24gJ3V0Zi0xNicgQ29kZWMKKworCitXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KKworIiIiCitpbXBvcnQgY29kZWNzLCBzeXMKKworIyMjIENvZGVjIEFQSXMKKworZW5jb2RlID0gY29kZWNzLnV0Zl8xNl9lbmNvZGUKKworZGVmIGRlY29kZShpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICByZXR1cm4gY29kZWNzLnV0Zl8xNl9kZWNvZGUoaW5wdXQsIGVycm9ycywgVHJ1ZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyLl9faW5pdF9fKHNlbGYsIGVycm9ycykKKyAgICAgICAgc2VsZi5lbmNvZGVyID0gTm9uZQorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICBpZiBzZWxmLmVuY29kZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHJlc3VsdCA9IGNvZGVjcy51dGZfMTZfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKyAgICAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gJ2xpdHRsZSc6CisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGVyID0gY29kZWNzLnV0Zl8xNl9sZV9lbmNvZGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGVyID0gY29kZWNzLnV0Zl8xNl9iZV9lbmNvZGUKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RlcihpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5lbmNvZGVyID0gTm9uZQorCisgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICAjIHN0YXRlIGluZm8gd2UgcmV0dXJuIHRvIHRoZSBjYWxsZXI6CisgICAgICAgICMgMDogc3RyZWFtIGlzIGluIG5hdHVyYWwgb3JkZXIgZm9yIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgIyAyOiBlbmRpYW5uZXNzIGhhc24ndCBiZWVuIGRldGVybWluZWQgeWV0CisgICAgICAgICMgKHdlJ3JlIG5ldmVyIHdyaXRpbmcgaW4gdW5uYXR1cmFsIG9yZGVyKQorICAgICAgICByZXR1cm4gKDIgaWYgc2VsZi5lbmNvZGVyIGlzIE5vbmUgZWxzZSAwKQorCisgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgaWYgc3RhdGU6CisgICAgICAgICAgICBzZWxmLmVuY29kZXIgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgorICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RlciA9IGNvZGVjcy51dGZfMTZfbGVfZW5jb2RlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RlciA9IGNvZGVjcy51dGZfMTZfYmVfZW5jb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIuX19pbml0X18oc2VsZiwgZXJyb3JzKQorICAgICAgICBzZWxmLmRlY29kZXIgPSBOb25lCisKKyAgICBkZWYgX2J1ZmZlcl9kZWNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycywgZmluYWwpOgorICAgICAgICBpZiBzZWxmLmRlY29kZXIgaXMgTm9uZToKKyAgICAgICAgICAgIChvdXRwdXQsIGNvbnN1bWVkLCBieXRlb3JkZXIpID0gXAorICAgICAgICAgICAgICAgIGNvZGVjcy51dGZfMTZfZXhfZGVjb2RlKGlucHV0LCBlcnJvcnMsIDAsIGZpbmFsKQorICAgICAgICAgICAgaWYgYnl0ZW9yZGVyID09IC0xOgorICAgICAgICAgICAgICAgIHNlbGYuZGVjb2RlciA9IGNvZGVjcy51dGZfMTZfbGVfZGVjb2RlCisgICAgICAgICAgICBlbGlmIGJ5dGVvcmRlciA9PSAxOgorICAgICAgICAgICAgICAgIHNlbGYuZGVjb2RlciA9IGNvZGVjcy51dGZfMTZfYmVfZGVjb2RlCisgICAgICAgICAgICBlbGlmIGNvbnN1bWVkID49IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJVVEYtMTYgc3RyZWFtIGRvZXMgbm90IHN0YXJ0IHdpdGggQk9NIikKKyAgICAgICAgICAgIHJldHVybiAob3V0cHV0LCBjb25zdW1lZCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZGVjb2RlcihpbnB1dCwgc2VsZi5lcnJvcnMsIGZpbmFsKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5kZWNvZGVyID0gTm9uZQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKKyAgICAgICAgc2VsZi5lbmNvZGVyID0gTm9uZQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLnJlc2V0KHNlbGYpCisgICAgICAgIHNlbGYuZW5jb2RlciA9IE5vbmUKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIGlmIHNlbGYuZW5jb2RlciBpcyBOb25lOgorICAgICAgICAgICAgcmVzdWx0ID0gY29kZWNzLnV0Zl8xNl9lbmNvZGUoaW5wdXQsIGVycm9ycykKKyAgICAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gJ2xpdHRsZSc6CisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGVyID0gY29kZWNzLnV0Zl8xNl9sZV9lbmNvZGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGVyID0gY29kZWNzLnV0Zl8xNl9iZV9lbmNvZGUKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmVuY29kZXIoaW5wdXQsIGVycm9ycykKKworY2xhc3MgU3RyZWFtUmVhZGVyKGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLnJlc2V0KHNlbGYpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBzZWxmLmRlY29kZQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICAob2JqZWN0LCBjb25zdW1lZCwgYnl0ZW9yZGVyKSA9IFwKKyAgICAgICAgICAgIGNvZGVjcy51dGZfMTZfZXhfZGVjb2RlKGlucHV0LCBlcnJvcnMsIDAsIEZhbHNlKQorICAgICAgICBpZiBieXRlb3JkZXIgPT0gLTE6CisgICAgICAgICAgICBzZWxmLmRlY29kZSA9IGNvZGVjcy51dGZfMTZfbGVfZGVjb2RlCisgICAgICAgIGVsaWYgYnl0ZW9yZGVyID09IDE6CisgICAgICAgICAgICBzZWxmLmRlY29kZSA9IGNvZGVjcy51dGZfMTZfYmVfZGVjb2RlCisgICAgICAgIGVsaWYgY29uc3VtZWQ+PTI6CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsIlVURi0xNiBzdHJlYW0gZG9lcyBub3Qgc3RhcnQgd2l0aCBCT00iCisgICAgICAgIHJldHVybiAob2JqZWN0LCBjb25zdW1lZCkKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSd1dGYtMTYnLAorICAgICAgICBlbmNvZGU9ZW5jb2RlLAorICAgICAgICBkZWNvZGU9ZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTczOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTczOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNl9iZS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNl9iZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmI0NThlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2JlLnB5CkBAIC0wLDAgKzEsNDIgQEAKKyIiIiBQeXRob24gJ3V0Zi0xNi1iZScgQ29kZWMKKworCitXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KKworIiIiCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2VuY29kZSA9IGNvZGVjcy51dGZfMTZfYmVfZW5jb2RlCisKK2RlZiBkZWNvZGUoaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgcmV0dXJuIGNvZGVjcy51dGZfMTZfYmVfZGVjb2RlKGlucHV0LCBlcnJvcnMsIFRydWUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MudXRmXzE2X2JlX2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIpOgorICAgIF9idWZmZXJfZGVjb2RlID0gY29kZWNzLnV0Zl8xNl9iZV9kZWNvZGUKKworY2xhc3MgU3RyZWFtV3JpdGVyKGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGVuY29kZSA9IGNvZGVjcy51dGZfMTZfYmVfZW5jb2RlCisKK2NsYXNzIFN0cmVhbVJlYWRlcihjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBkZWNvZGUgPSBjb2RlY3MudXRmXzE2X2JlX2RlY29kZQorCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3V0Zi0xNi1iZScsCisgICAgICAgIGVuY29kZT1lbmNvZGUsCisgICAgICAgIGRlY29kZT1kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2JlLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNl9iZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjYThjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNl9iZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2JlLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNl9iZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjYThjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNl9iZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2xlLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2xlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNDU0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTZfbGUucHkKQEAgLTAsMCArMSw0MiBAQAorIiIiIFB5dGhvbiAndXRmLTE2LWxlJyBDb2RlYworCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworZW5jb2RlID0gY29kZWNzLnV0Zl8xNl9sZV9lbmNvZGUKKworZGVmIGRlY29kZShpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICByZXR1cm4gY29kZWNzLnV0Zl8xNl9sZV9kZWNvZGUoaW5wdXQsIGVycm9ycywgVHJ1ZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy51dGZfMTZfbGVfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgX2J1ZmZlcl9kZWNvZGUgPSBjb2RlY3MudXRmXzE2X2xlX2RlY29kZQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgZW5jb2RlID0gY29kZWNzLnV0Zl8xNl9sZV9lbmNvZGUKKworY2xhc3MgU3RyZWFtUmVhZGVyKGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGRlY29kZSA9IGNvZGVjcy51dGZfMTZfbGVfZGVjb2RlCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ndXRmLTE2LWxlJywKKyAgICAgICAgZW5jb2RlPWVuY29kZSwKKyAgICAgICAgZGVjb2RlPWRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTZfbGUucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2xlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTE5Y2YxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2xlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTZfbGUucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2xlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTE5Y2YxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2xlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzIucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4MDE2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMi5weQpAQCAtMCwwICsxLDE1MCBAQAorIiIiCitQeXRob24gJ3V0Zi0zMicgQ29kZWMKKyIiIgoraW1wb3J0IGNvZGVjcywgc3lzCisKKyMjIyBDb2RlYyBBUElzCisKK2VuY29kZSA9IGNvZGVjcy51dGZfMzJfZW5jb2RlCisKK2RlZiBkZWNvZGUoaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgcmV0dXJuIGNvZGVjcy51dGZfMzJfZGVjb2RlKGlucHV0LCBlcnJvcnMsIFRydWUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlci5fX2luaXRfXyhzZWxmLCBlcnJvcnMpCisgICAgICAgIHNlbGYuZW5jb2RlciA9IE5vbmUKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgaWYgc2VsZi5lbmNvZGVyIGlzIE5vbmU6CisgICAgICAgICAgICByZXN1bHQgPSBjb2RlY3MudXRmXzMyX2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgorICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RlciA9IGNvZGVjcy51dGZfMzJfbGVfZW5jb2RlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RlciA9IGNvZGVjcy51dGZfMzJfYmVfZW5jb2RlCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHJldHVybiBzZWxmLmVuY29kZXIoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyLnJlc2V0KHNlbGYpCisgICAgICAgIHNlbGYuZW5jb2RlciA9IE5vbmUKKworICAgIGRlZiBnZXRzdGF0ZShzZWxmKToKKyAgICAgICAgIyBzdGF0ZSBpbmZvIHdlIHJldHVybiB0byB0aGUgY2FsbGVyOgorICAgICAgICAjIDA6IHN0cmVhbSBpcyBpbiBuYXR1cmFsIG9yZGVyIGZvciB0aGlzIHBsYXRmb3JtCisgICAgICAgICMgMjogZW5kaWFubmVzcyBoYXNuJ3QgYmVlbiBkZXRlcm1pbmVkIHlldAorICAgICAgICAjICh3ZSdyZSBuZXZlciB3cml0aW5nIGluIHVubmF0dXJhbCBvcmRlcikKKyAgICAgICAgcmV0dXJuICgyIGlmIHNlbGYuZW5jb2RlciBpcyBOb25lIGVsc2UgMCkKKworICAgIGRlZiBzZXRzdGF0ZShzZWxmLCBzdGF0ZSk6CisgICAgICAgIGlmIHN0YXRlOgorICAgICAgICAgICAgc2VsZi5lbmNvZGVyID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAnbGl0dGxlJzoKKyAgICAgICAgICAgICAgICBzZWxmLmVuY29kZXIgPSBjb2RlY3MudXRmXzMyX2xlX2VuY29kZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVuY29kZXIgPSBjb2RlY3MudXRmXzMyX2JlX2VuY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyLl9faW5pdF9fKHNlbGYsIGVycm9ycykKKyAgICAgICAgc2VsZi5kZWNvZGVyID0gTm9uZQorCisgICAgZGVmIF9idWZmZXJfZGVjb2RlKHNlbGYsIGlucHV0LCBlcnJvcnMsIGZpbmFsKToKKyAgICAgICAgaWYgc2VsZi5kZWNvZGVyIGlzIE5vbmU6CisgICAgICAgICAgICAob3V0cHV0LCBjb25zdW1lZCwgYnl0ZW9yZGVyKSA9IFwKKyAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2V4X2RlY29kZShpbnB1dCwgZXJyb3JzLCAwLCBmaW5hbCkKKyAgICAgICAgICAgIGlmIGJ5dGVvcmRlciA9PSAtMToKKyAgICAgICAgICAgICAgICBzZWxmLmRlY29kZXIgPSBjb2RlY3MudXRmXzMyX2xlX2RlY29kZQorICAgICAgICAgICAgZWxpZiBieXRlb3JkZXIgPT0gMToKKyAgICAgICAgICAgICAgICBzZWxmLmRlY29kZXIgPSBjb2RlY3MudXRmXzMyX2JlX2RlY29kZQorICAgICAgICAgICAgZWxpZiBjb25zdW1lZCA+PSA0OgorICAgICAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiVVRGLTMyIHN0cmVhbSBkb2VzIG5vdCBzdGFydCB3aXRoIEJPTSIpCisgICAgICAgICAgICByZXR1cm4gKG91dHB1dCwgY29uc3VtZWQpCisgICAgICAgIHJldHVybiBzZWxmLmRlY29kZXIoaW5wdXQsIHNlbGYuZXJyb3JzLCBmaW5hbCkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyLnJlc2V0KHNlbGYpCisgICAgICAgIHNlbGYuZGVjb2RlciA9IE5vbmUKKworICAgIGRlZiBnZXRzdGF0ZShzZWxmKToKKyAgICAgICAgIyBhZGRpdG9uYWwgc3RhdGUgaW5mbyBmcm9tIHRoZSBiYXNlIGNsYXNzIG11c3QgYmUgTm9uZSBoZXJlLAorICAgICAgICAjIGFzIGl0IGlzbid0IHBhc3NlZCBhbG9uZyB0byB0aGUgY2FsbGVyCisgICAgICAgIHN0YXRlID0gY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyLmdldHN0YXRlKHNlbGYpWzBdCisgICAgICAgICMgYWRkaXRpb25hbCBzdGF0ZSBpbmZvIHdlIHBhc3MgdG8gdGhlIGNhbGxlcjoKKyAgICAgICAgIyAwOiBzdHJlYW0gaXMgaW4gbmF0dXJhbCBvcmRlciBmb3IgdGhpcyBwbGF0Zm9ybQorICAgICAgICAjIDE6IHN0cmVhbSBpcyBpbiB1bm5hdHVyYWwgb3JkZXIKKyAgICAgICAgIyAyOiBlbmRpYW5uZXNzIGhhc24ndCBiZWVuIGRldGVybWluZWQgeWV0CisgICAgICAgIGlmIHNlbGYuZGVjb2RlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIChzdGF0ZSwgMikKKyAgICAgICAgYWRkc3RhdGUgPSBpbnQoKHN5cy5ieXRlb3JkZXIgPT0gImJpZyIpICE9CisgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmRlY29kZXIgaXMgY29kZWNzLnV0Zl8zMl9iZV9kZWNvZGUpKQorICAgICAgICByZXR1cm4gKHN0YXRlLCBhZGRzdGF0ZSkKKworICAgIGRlZiBzZXRzdGF0ZShzZWxmLCBzdGF0ZSk6CisgICAgICAgICMgc3RhdGVbMV0gd2lsbCBiZSBpZ25vcmVkIGJ5IEJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyLnNldHN0YXRlKCkKKyAgICAgICAgY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyLnNldHN0YXRlKHNlbGYsIHN0YXRlKQorICAgICAgICBzdGF0ZSA9IHN0YXRlWzFdCisgICAgICAgIGlmIHN0YXRlID09IDA6CisgICAgICAgICAgICBzZWxmLmRlY29kZXIgPSAoY29kZWNzLnV0Zl8zMl9iZV9kZWNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJiaWciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBjb2RlY3MudXRmXzMyX2xlX2RlY29kZSkKKyAgICAgICAgZWxpZiBzdGF0ZSA9PSAxOgorICAgICAgICAgICAgc2VsZi5kZWNvZGVyID0gKGNvZGVjcy51dGZfMzJfbGVfZGVjb2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAiYmlnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgY29kZWNzLnV0Zl8zMl9iZV9kZWNvZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRlY29kZXIgPSBOb25lCisKK2NsYXNzIFN0cmVhbVdyaXRlcihjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBzZWxmLmVuY29kZXIgPSBOb25lCisgICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5lbmNvZGVyID0gTm9uZQorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgaWYgc2VsZi5lbmNvZGVyIGlzIE5vbmU6CisgICAgICAgICAgICByZXN1bHQgPSBjb2RlY3MudXRmXzMyX2VuY29kZShpbnB1dCwgZXJyb3JzKQorICAgICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAnbGl0dGxlJzoKKyAgICAgICAgICAgICAgICBzZWxmLmVuY29kZXIgPSBjb2RlY3MudXRmXzMyX2xlX2VuY29kZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVuY29kZXIgPSBjb2RlY3MudXRmXzMyX2JlX2VuY29kZQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RlcihpbnB1dCwgZXJyb3JzKQorCitjbGFzcyBTdHJlYW1SZWFkZXIoY29kZWNzLlN0cmVhbVJlYWRlcik6CisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIucmVzZXQoc2VsZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHNlbGYuZGVjb2RlCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIChvYmplY3QsIGNvbnN1bWVkLCBieXRlb3JkZXIpID0gXAorICAgICAgICAgICAgY29kZWNzLnV0Zl8zMl9leF9kZWNvZGUoaW5wdXQsIGVycm9ycywgMCwgRmFsc2UpCisgICAgICAgIGlmIGJ5dGVvcmRlciA9PSAtMToKKyAgICAgICAgICAgIHNlbGYuZGVjb2RlID0gY29kZWNzLnV0Zl8zMl9sZV9kZWNvZGUKKyAgICAgICAgZWxpZiBieXRlb3JkZXIgPT0gMToKKyAgICAgICAgICAgIHNlbGYuZGVjb2RlID0gY29kZWNzLnV0Zl8zMl9iZV9kZWNvZGUKKyAgICAgICAgZWxpZiBjb25zdW1lZD49NDoKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwiVVRGLTMyIHN0cmVhbSBkb2VzIG5vdCBzdGFydCB3aXRoIEJPTSIKKyAgICAgICAgcmV0dXJuIChvYmplY3QsIGNvbnN1bWVkKQorCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3V0Zi0zMicsCisgICAgICAgIGVuY29kZT1lbmNvZGUsCisgICAgICAgIGRlY29kZT1kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5ZWNiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5ZWNiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyX2JlLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyX2JlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjcyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfYmUucHkKQEAgLTAsMCArMSwzNyBAQAorIiIiCitQeXRob24gJ3V0Zi0zMi1iZScgQ29kZWMKKyIiIgoraW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitlbmNvZGUgPSBjb2RlY3MudXRmXzMyX2JlX2VuY29kZQorCitkZWYgZGVjb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgIHJldHVybiBjb2RlY3MudXRmXzMyX2JlX2RlY29kZShpbnB1dCwgZXJyb3JzLCBUcnVlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLnV0Zl8zMl9iZV9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBfYnVmZmVyX2RlY29kZSA9IGNvZGVjcy51dGZfMzJfYmVfZGVjb2RlCisKK2NsYXNzIFN0cmVhbVdyaXRlcihjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBlbmNvZGUgPSBjb2RlY3MudXRmXzMyX2JlX2VuY29kZQorCitjbGFzcyBTdHJlYW1SZWFkZXIoY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgZGVjb2RlID0gY29kZWNzLnV0Zl8zMl9iZV9kZWNvZGUKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSd1dGYtMzItYmUnLAorICAgICAgICBlbmNvZGU9ZW5jb2RlLAorICAgICAgICBkZWNvZGU9ZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMl9iZS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfYmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NWY4NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfYmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMl9iZS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfYmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NWY4NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfYmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMl9sZS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMl9sZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTQ4MjEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyX2xlLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyIiIgorUHl0aG9uICd1dGYtMzItbGUnIENvZGVjCisiIiIKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworZW5jb2RlID0gY29kZWNzLnV0Zl8zMl9sZV9lbmNvZGUKKworZGVmIGRlY29kZShpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICByZXR1cm4gY29kZWNzLnV0Zl8zMl9sZV9kZWNvZGUoaW5wdXQsIGVycm9ycywgVHJ1ZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy51dGZfMzJfbGVfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgX2J1ZmZlcl9kZWNvZGUgPSBjb2RlY3MudXRmXzMyX2xlX2RlY29kZQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgZW5jb2RlID0gY29kZWNzLnV0Zl8zMl9sZV9lbmNvZGUKKworY2xhc3MgU3RyZWFtUmVhZGVyKGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGRlY29kZSA9IGNvZGVjcy51dGZfMzJfbGVfZGVjb2RlCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ndXRmLTMyLWxlJywKKyAgICAgICAgZW5jb2RlPWVuY29kZSwKKyAgICAgICAgZGVjb2RlPWRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfbGUucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyX2xlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjJmMTcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyX2xlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfbGUucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyX2xlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjJmMTcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyX2xlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfNy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl83LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDU2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfNy5weQpAQCAtMCwwICsxLDM4IEBACisiIiIgUHl0aG9uICd1dGYtNycgQ29kZWMKKworV3JpdHRlbiBieSBCcmlhbiBRdWlubGFuIChicmlhbkBzd2VldGFwcC5jb20pLgorIiIiCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2VuY29kZSA9IGNvZGVjcy51dGZfN19lbmNvZGUKKworZGVmIGRlY29kZShpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICByZXR1cm4gY29kZWNzLnV0Zl83X2RlY29kZShpbnB1dCwgZXJyb3JzLCBUcnVlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLnV0Zl83X2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIpOgorICAgIF9idWZmZXJfZGVjb2RlID0gY29kZWNzLnV0Zl83X2RlY29kZQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgZW5jb2RlID0gY29kZWNzLnV0Zl83X2VuY29kZQorCitjbGFzcyBTdHJlYW1SZWFkZXIoY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgZGVjb2RlID0gY29kZWNzLnV0Zl83X2RlY29kZQorCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3V0Zi03JywKKyAgICAgICAgZW5jb2RlPWVuY29kZSwKKyAgICAgICAgZGVjb2RlPWRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfNy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfNy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UyY2EyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl83LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfNy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfNy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UyY2EyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl83LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfOC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjYzMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfOC5weQpAQCAtMCwwICsxLDQyIEBACisiIiIgUHl0aG9uICd1dGYtOCcgQ29kZWMKKworCitXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KKworIiIiCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2VuY29kZSA9IGNvZGVjcy51dGZfOF9lbmNvZGUKKworZGVmIGRlY29kZShpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICByZXR1cm4gY29kZWNzLnV0Zl84X2RlY29kZShpbnB1dCwgZXJyb3JzLCBUcnVlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLnV0Zl84X2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIpOgorICAgIF9idWZmZXJfZGVjb2RlID0gY29kZWNzLnV0Zl84X2RlY29kZQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgZW5jb2RlID0gY29kZWNzLnV0Zl84X2VuY29kZQorCitjbGFzcyBTdHJlYW1SZWFkZXIoY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgZGVjb2RlID0gY29kZWNzLnV0Zl84X2RlY29kZQorCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3V0Zi04JywKKyAgICAgICAgZW5jb2RlPWVuY29kZSwKKyAgICAgICAgZGVjb2RlPWRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfOC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfOC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjZmE0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfOC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfOC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjZmE0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfOF9zaWcucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfOF9zaWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4NDY5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84X3NpZy5weQpAQCAtMCwwICsxLDExNyBAQAorIiIiIFB5dGhvbiAndXRmLTgtc2lnJyBDb2RlYworVGhpcyB3b3JrIHNpbWlsYXIgdG8gVVRGLTggd2l0aCB0aGUgZm9sbG93aW5nIGNoYW5nZXM6CisKKyogT24gZW5jb2Rpbmcvd3JpdGluZyBhIFVURi04IGVuY29kZWQgQk9NIHdpbGwgYmUgcHJlcGVuZGVkL3dyaXR0ZW4gYXMgdGhlCisgIGZpcnN0IHRocmVlIGJ5dGVzLgorCisqIE9uIGRlY29kaW5nL3JlYWRpbmcgaWYgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIGFyZSBhIFVURi04IGVuY29kZWQgQk9NLCB0aGVzZQorICBieXRlcyB3aWxsIGJlIHNraXBwZWQuCisiIiIKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworZGVmIGVuY29kZShpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICByZXR1cm4gKGNvZGVjcy5CT01fVVRGOCArIGNvZGVjcy51dGZfOF9lbmNvZGUoaW5wdXQsIGVycm9ycylbMF0sIGxlbihpbnB1dCkpCisKK2RlZiBkZWNvZGUoaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgcHJlZml4ID0gMAorICAgIGlmIGlucHV0WzozXSA9PSBjb2RlY3MuQk9NX1VURjg6CisgICAgICAgIGlucHV0ID0gaW5wdXRbMzpdCisgICAgICAgIHByZWZpeCA9IDMKKyAgICAob3V0cHV0LCBjb25zdW1lZCkgPSBjb2RlY3MudXRmXzhfZGVjb2RlKGlucHV0LCBlcnJvcnMsIFRydWUpCisgICAgcmV0dXJuIChvdXRwdXQsIGNvbnN1bWVkK3ByZWZpeCkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyLl9faW5pdF9fKHNlbGYsIGVycm9ycykKKyAgICAgICAgc2VsZi5maXJzdCA9IDEKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgaWYgc2VsZi5maXJzdDoKKyAgICAgICAgICAgIHNlbGYuZmlyc3QgPSAwCisgICAgICAgICAgICByZXR1cm4gY29kZWNzLkJPTV9VVEY4ICsgY29kZWNzLnV0Zl84X2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY29kZWNzLnV0Zl84X2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5maXJzdCA9IDEKKworICAgIGRlZiBnZXRzdGF0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZmlyc3QKKworICAgIGRlZiBzZXRzdGF0ZShzZWxmLCBzdGF0ZSk6CisgICAgICAgIHNlbGYuZmlyc3QgPSBzdGF0ZQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyLl9faW5pdF9fKHNlbGYsIGVycm9ycykKKyAgICAgICAgc2VsZi5maXJzdCA9IFRydWUKKworICAgIGRlZiBfYnVmZmVyX2RlY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzLCBmaW5hbCk6CisgICAgICAgIGlmIHNlbGYuZmlyc3Q6CisgICAgICAgICAgICBpZiBsZW4oaW5wdXQpIDwgMzoKKyAgICAgICAgICAgICAgICBpZiBjb2RlY3MuQk9NX1VURjguc3RhcnRzd2l0aChpbnB1dCk6CisgICAgICAgICAgICAgICAgICAgICMgbm90IGVub3VnaCBkYXRhIHRvIGRlY2lkZSBpZiB0aGlzIHJlYWxseSBpcyBhIEJPTQorICAgICAgICAgICAgICAgICAgICAjID0+IHRyeSBhZ2FpbiBvbiB0aGUgbmV4dCBjYWxsCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodSIiLCAwKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBOb25lCisgICAgICAgICAgICAgICAgaWYgaW5wdXRbOjNdID09IGNvZGVjcy5CT01fVVRGODoKKyAgICAgICAgICAgICAgICAgICAgKG91dHB1dCwgY29uc3VtZWQpID0gY29kZWNzLnV0Zl84X2RlY29kZShpbnB1dFszOl0sIGVycm9ycywgZmluYWwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAob3V0cHV0LCBjb25zdW1lZCszKQorICAgICAgICByZXR1cm4gY29kZWNzLnV0Zl84X2RlY29kZShpbnB1dCwgZXJyb3JzLCBmaW5hbCkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyLnJlc2V0KHNlbGYpCisgICAgICAgIHNlbGYuZmlyc3QgPSBUcnVlCisKK2NsYXNzIFN0cmVhbVdyaXRlcihjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIucmVzZXQoc2VsZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHNlbGYuZW5jb2RlCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHNlbGYuZW5jb2RlID0gY29kZWNzLnV0Zl84X2VuY29kZQorICAgICAgICByZXR1cm4gZW5jb2RlKGlucHV0LCBlcnJvcnMpCisKK2NsYXNzIFN0cmVhbVJlYWRlcihjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIucmVzZXQoc2VsZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHNlbGYuZGVjb2RlCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIGlmIGxlbihpbnB1dCkgPCAzOgorICAgICAgICAgICAgaWYgY29kZWNzLkJPTV9VVEY4LnN0YXJ0c3dpdGgoaW5wdXQpOgorICAgICAgICAgICAgICAgICMgbm90IGVub3VnaCBkYXRhIHRvIGRlY2lkZSBpZiB0aGlzIGlzIGEgQk9NCisgICAgICAgICAgICAgICAgIyA9PiB0cnkgYWdhaW4gb24gdGhlIG5leHQgY2FsbAorICAgICAgICAgICAgICAgIHJldHVybiAodSIiLCAwKQorICAgICAgICBlbGlmIGlucHV0WzozXSA9PSBjb2RlY3MuQk9NX1VURjg6CisgICAgICAgICAgICBzZWxmLmRlY29kZSA9IGNvZGVjcy51dGZfOF9kZWNvZGUKKyAgICAgICAgICAgIChvdXRwdXQsIGNvbnN1bWVkKSA9IGNvZGVjcy51dGZfOF9kZWNvZGUoaW5wdXRbMzpdLGVycm9ycykKKyAgICAgICAgICAgIHJldHVybiAob3V0cHV0LCBjb25zdW1lZCszKQorICAgICAgICAjIChlbHNlKSBubyBCT00gcHJlc2VudAorICAgICAgICBzZWxmLmRlY29kZSA9IGNvZGVjcy51dGZfOF9kZWNvZGUKKyAgICAgICAgcmV0dXJuIGNvZGVjcy51dGZfOF9kZWNvZGUoaW5wdXQsIGVycm9ycykKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSd1dGYtOC1zaWcnLAorICAgICAgICBlbmNvZGU9ZW5jb2RlLAorICAgICAgICBkZWNvZGU9ZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84X3NpZy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfOF9zaWcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ODNmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfOF9zaWcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84X3NpZy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfOF9zaWcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ODNmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfOF9zaWcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V1X2NvZGVjLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXVfY29kZWMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIwMzc1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V1X2NvZGVjLnB5CkBAIC0wLDAgKzEsMTI5IEBACisiIiIgUHl0aG9uICd1dV9jb2RlYycgQ29kZWMgLSBVVSBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nCisKKyAgICBVbmxpa2UgbW9zdCBvZiB0aGUgb3RoZXIgY29kZWNzIHdoaWNoIHRhcmdldCBVbmljb2RlLCB0aGlzIGNvZGVjCisgICAgd2lsbCByZXR1cm4gUHl0aG9uIHN0cmluZyBvYmplY3RzIGZvciBib3RoIGVuY29kZSBhbmQgZGVjb2RlLgorCisgICAgV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuIFNvbWUgZGV0YWlscyB3ZXJlCisgICAgYWRhcHRlZCBmcm9tIHV1LnB5IHdoaWNoIHdhcyB3cml0dGVuIGJ5IExhbmNlIEVsbGluZ2hvdXNlIGFuZAorICAgIG1vZGlmaWVkIGJ5IEphY2sgSmFuc2VuIGFuZCBGcmVkcmlrIEx1bmRoLgorCisiIiIKK2ltcG9ydCBjb2RlY3MsIGJpbmFzY2lpCisKKyMjIyBDb2RlYyBBUElzCisKK2RlZiB1dV9lbmNvZGUoaW5wdXQsZXJyb3JzPSdzdHJpY3QnLGZpbGVuYW1lPSc8ZGF0YT4nLG1vZGU9MDY2Nik6CisKKyAgICAiIiIgRW5jb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAorICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCisKKyAgICAgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bworICAgICAgICAnc3RyaWN0JyBoYW5kbGluZyB3aGljaCBpcyB0aGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgorCisgICAgIiIiCisgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgIGZyb20gYmluYXNjaWkgaW1wb3J0IGIyYV91dQorICAgICMgdXNpbmcgc3RyKCkgYmVjYXVzZSBvZiBjU3RyaW5nSU8ncyBVbmljb2RlIHVuZGVzaXJlZCBVbmljb2RlIGJlaGF2aW9yLgorICAgIGluZmlsZSA9IFN0cmluZ0lPKHN0cihpbnB1dCkpCisgICAgb3V0ZmlsZSA9IFN0cmluZ0lPKCkKKyAgICByZWFkID0gaW5maWxlLnJlYWQKKyAgICB3cml0ZSA9IG91dGZpbGUud3JpdGUKKworICAgICMgRW5jb2RlCisgICAgd3JpdGUoJ2JlZ2luICVvICVzXG4nICUgKG1vZGUgJiAwNzc3LCBmaWxlbmFtZSkpCisgICAgY2h1bmsgPSByZWFkKDQ1KQorICAgIHdoaWxlIGNodW5rOgorICAgICAgICB3cml0ZShiMmFfdXUoY2h1bmspKQorICAgICAgICBjaHVuayA9IHJlYWQoNDUpCisgICAgd3JpdGUoJyBcbmVuZFxuJykKKworICAgIHJldHVybiAob3V0ZmlsZS5nZXR2YWx1ZSgpLCBsZW4oaW5wdXQpKQorCitkZWYgdXVfZGVjb2RlKGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAiIiIgRGVjb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAorICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCisKKyAgICAgICAgaW5wdXQgbXVzdCBiZSBhbiBvYmplY3Qgd2hpY2ggcHJvdmlkZXMgdGhlIGJmX2dldHJlYWRidWYKKyAgICAgICAgYnVmZmVyIHNsb3QuIFB5dGhvbiBzdHJpbmdzLCBidWZmZXIgb2JqZWN0cyBhbmQgbWVtb3J5CisgICAgICAgIG1hcHBlZCBmaWxlcyBhcmUgZXhhbXBsZXMgb2Ygb2JqZWN0cyBwcm92aWRpbmcgdGhpcyBzbG90LgorCisgICAgICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KKyAgICAgICAgJ3N0cmljdCcgaGFuZGxpbmcgd2hpY2ggaXMgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZAorICAgICAgICBlcnJvciBoYW5kbGluZyBmb3IgdGhpcyBjb2RlYy4KKworICAgICAgICBOb3RlOiBmaWxlbmFtZSBhbmQgZmlsZSBtb2RlIGluZm9ybWF0aW9uIGluIHRoZSBpbnB1dCBkYXRhIGlzCisgICAgICAgIGlnbm9yZWQuCisKKyAgICAiIiIKKyAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgZnJvbSBiaW5hc2NpaSBpbXBvcnQgYTJiX3V1CisgICAgaW5maWxlID0gU3RyaW5nSU8oc3RyKGlucHV0KSkKKyAgICBvdXRmaWxlID0gU3RyaW5nSU8oKQorICAgIHJlYWRsaW5lID0gaW5maWxlLnJlYWRsaW5lCisgICAgd3JpdGUgPSBvdXRmaWxlLndyaXRlCisKKyAgICAjIEZpbmQgc3RhcnQgb2YgZW5jb2RlZCBkYXRhCisgICAgd2hpbGUgMToKKyAgICAgICAgcyA9IHJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IHM6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnTWlzc2luZyAiYmVnaW4iIGxpbmUgaW4gaW5wdXQgZGF0YScKKyAgICAgICAgaWYgc1s6NV0gPT0gJ2JlZ2luJzoKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAjIERlY29kZQorICAgIHdoaWxlIDE6CisgICAgICAgIHMgPSByZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBzIG9yIFwKKyAgICAgICAgICAgcyA9PSAnZW5kXG4nOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IGEyYl91dShzKQorICAgICAgICBleGNlcHQgYmluYXNjaWkuRXJyb3IsIHY6CisgICAgICAgICAgICAjIFdvcmthcm91bmQgZm9yIGJyb2tlbiB1dWVuY29kZXJzIGJ5IC9GcmVkcmlrIEx1bmRoCisgICAgICAgICAgICBuYnl0ZXMgPSAoKChvcmQoc1swXSktMzIpICYgNjMpICogNCArIDUpIC8gMworICAgICAgICAgICAgZGF0YSA9IGEyYl91dShzWzpuYnl0ZXNdKQorICAgICAgICAgICAgI3N5cy5zdGRlcnIud3JpdGUoIldhcm5pbmc6ICVzXG4iICUgc3RyKHYpKQorICAgICAgICB3cml0ZShkYXRhKQorICAgIGlmIG5vdCBzOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnVHJ1bmNhdGVkIGlucHV0IGRhdGEnCisKKyAgICByZXR1cm4gKG91dGZpbGUuZ2V0dmFsdWUoKSwgbGVuKGlucHV0KSkKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gdXVfZW5jb2RlKGlucHV0LGVycm9ycykKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gdXVfZGVjb2RlKGlucHV0LGVycm9ycykKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIHV1X2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiB1dV9kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3V1JywKKyAgICAgICAgZW5jb2RlPXV1X2VuY29kZSwKKyAgICAgICAgZGVjb2RlPXV1X2RlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dV9jb2RlYy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dV9jb2RlYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlNDQ5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V1X2NvZGVjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dV9jb2RlYy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dV9jb2RlYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExNDk3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V1X2NvZGVjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy96bGliX2NvZGVjLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvemxpYl9jb2RlYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDE5ZjlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvemxpYl9jb2RlYy5weQpAQCAtMCwwICsxLDEwMiBAQAorIiIiIFB5dGhvbiAnemxpYl9jb2RlYycgQ29kZWMgLSB6bGliIGNvbXByZXNzaW9uIGVuY29kaW5nCisKKyAgICBVbmxpa2UgbW9zdCBvZiB0aGUgb3RoZXIgY29kZWNzIHdoaWNoIHRhcmdldCBVbmljb2RlLCB0aGlzIGNvZGVjCisgICAgd2lsbCByZXR1cm4gUHl0aG9uIHN0cmluZyBvYmplY3RzIGZvciBib3RoIGVuY29kZSBhbmQgZGVjb2RlLgorCisgICAgV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyIiIgoraW1wb3J0IGNvZGVjcworaW1wb3J0IHpsaWIgIyB0aGlzIGNvZGVjIG5lZWRzIHRoZSBvcHRpb25hbCB6bGliIG1vZHVsZSAhCisKKyMjIyBDb2RlYyBBUElzCisKK2RlZiB6bGliX2VuY29kZShpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorCisgICAgIiIiIEVuY29kZXMgdGhlIG9iamVjdCBpbnB1dCBhbmQgcmV0dXJucyBhIHR1cGxlIChvdXRwdXQKKyAgICAgICAgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgorCisgICAgICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KKyAgICAgICAgJ3N0cmljdCcgaGFuZGxpbmcgd2hpY2ggaXMgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZAorICAgICAgICBlcnJvciBoYW5kbGluZyBmb3IgdGhpcyBjb2RlYy4KKworICAgICIiIgorICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKKyAgICBvdXRwdXQgPSB6bGliLmNvbXByZXNzKGlucHV0KQorICAgIHJldHVybiAob3V0cHV0LCBsZW4oaW5wdXQpKQorCitkZWYgemxpYl9kZWNvZGUoaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKworICAgICIiIiBEZWNvZGVzIHRoZSBvYmplY3QgaW5wdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0CisgICAgICAgIG9iamVjdCwgbGVuZ3RoIGNvbnN1bWVkKS4KKworICAgICAgICBpbnB1dCBtdXN0IGJlIGFuIG9iamVjdCB3aGljaCBwcm92aWRlcyB0aGUgYmZfZ2V0cmVhZGJ1ZgorICAgICAgICBidWZmZXIgc2xvdC4gUHl0aG9uIHN0cmluZ3MsIGJ1ZmZlciBvYmplY3RzIGFuZCBtZW1vcnkKKyAgICAgICAgbWFwcGVkIGZpbGVzIGFyZSBleGFtcGxlcyBvZiBvYmplY3RzIHByb3ZpZGluZyB0aGlzIHNsb3QuCisKKyAgICAgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bworICAgICAgICAnc3RyaWN0JyBoYW5kbGluZyB3aGljaCBpcyB0aGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgorCisgICAgIiIiCisgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgIG91dHB1dCA9IHpsaWIuZGVjb21wcmVzcyhpbnB1dCkKKyAgICByZXR1cm4gKG91dHB1dCwgbGVuKGlucHV0KSkKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiB6bGliX2VuY29kZShpbnB1dCwgZXJyb3JzKQorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiB6bGliX2RlY29kZShpbnB1dCwgZXJyb3JzKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKKyAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKKyAgICAgICAgc2VsZi5jb21wcmVzc29iaiA9IHpsaWIuY29tcHJlc3NvYmooKQorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICBpZiBmaW5hbDoKKyAgICAgICAgICAgIGMgPSBzZWxmLmNvbXByZXNzb2JqLmNvbXByZXNzKGlucHV0KQorICAgICAgICAgICAgcmV0dXJuIGMgKyBzZWxmLmNvbXByZXNzb2JqLmZsdXNoKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbXByZXNzb2JqLmNvbXByZXNzKGlucHV0KQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbXByZXNzb2JqID0gemxpYi5jb21wcmVzc29iaigpCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycworICAgICAgICBzZWxmLmRlY29tcHJlc3NvYmogPSB6bGliLmRlY29tcHJlc3NvYmooKQorCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICBpZiBmaW5hbDoKKyAgICAgICAgICAgIGMgPSBzZWxmLmRlY29tcHJlc3NvYmouZGVjb21wcmVzcyhpbnB1dCkKKyAgICAgICAgICAgIHJldHVybiBjICsgc2VsZi5kZWNvbXByZXNzb2JqLmZsdXNoKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlY29tcHJlc3NvYmouZGVjb21wcmVzcyhpbnB1dCkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5kZWNvbXByZXNzb2JqID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSd6bGliJywKKyAgICAgICAgZW5jb2RlPXpsaWJfZW5jb2RlLAorICAgICAgICBkZWNvZGU9emxpYl9kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvemxpYl9jb2RlYy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy96bGliX2NvZGVjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmY1ODFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvemxpYl9jb2RlYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvemxpYl9jb2RlYy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy96bGliX2NvZGVjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWVlNzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvemxpYl9jb2RlYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9maWxlY21wLnB5IGIvbGliL3B5dGhvbjIuNy9maWxlY21wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzkzODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ZpbGVjbXAucHkKQEAgLTAsMCArMSwyOTYgQEAKKyIiIlV0aWxpdGllcyBmb3IgY29tcGFyaW5nIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KKworQ2xhc3NlczoKKyAgICBkaXJjbXAKKworRnVuY3Rpb25zOgorICAgIGNtcChmMSwgZjIsIHNoYWxsb3c9MSkgLT4gaW50CisgICAgY21wZmlsZXMoYSwgYiwgY29tbW9uKSAtPiAoW10sIFtdLCBbXSkKKworIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN0YXQKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBpZmlsdGVyLCBpZmlsdGVyZmFsc2UsIGltYXAsIGl6aXAKKworX19hbGxfXyA9IFsiY21wIiwiZGlyY21wIiwiY21wZmlsZXMiXQorCitfY2FjaGUgPSB7fQorQlVGU0laRT04KjEwMjQKKworZGVmIGNtcChmMSwgZjIsIHNoYWxsb3c9MSk6CisgICAgIiIiQ29tcGFyZSB0d28gZmlsZXMuCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBmMSAtLSBGaXJzdCBmaWxlIG5hbWUKKworICAgIGYyIC0tIFNlY29uZCBmaWxlIG5hbWUKKworICAgIHNoYWxsb3cgLS0gSnVzdCBjaGVjayBzdGF0IHNpZ25hdHVyZSAoZG8gbm90IHJlYWQgdGhlIGZpbGVzKS4KKyAgICAgICAgICAgICAgIGRlZmF1bHRzIHRvIDEuCisKKyAgICBSZXR1cm4gdmFsdWU6CisKKyAgICBUcnVlIGlmIHRoZSBmaWxlcyBhcmUgdGhlIHNhbWUsIEZhbHNlIG90aGVyd2lzZS4KKworICAgIFRoaXMgZnVuY3Rpb24gdXNlcyBhIGNhY2hlIGZvciBwYXN0IGNvbXBhcmlzb25zIGFuZCB0aGUgcmVzdWx0cywKKyAgICB3aXRoIGEgY2FjaGUgaW52YWxpZGF0aW9uIG1lY2hhbmlzbSByZWx5aW5nIG9uIHN0YWxlIHNpZ25hdHVyZXMuCisKKyAgICAiIiIKKworICAgIHMxID0gX3NpZyhvcy5zdGF0KGYxKSkKKyAgICBzMiA9IF9zaWcob3Muc3RhdChmMikpCisgICAgaWYgczFbMF0gIT0gc3RhdC5TX0lGUkVHIG9yIHMyWzBdICE9IHN0YXQuU19JRlJFRzoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgc2hhbGxvdyBhbmQgczEgPT0gczI6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgaWYgczFbMV0gIT0gczJbMV06CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgb3V0Y29tZSA9IF9jYWNoZS5nZXQoKGYxLCBmMiwgczEsIHMyKSkKKyAgICBpZiBvdXRjb21lIGlzIE5vbmU6CisgICAgICAgIG91dGNvbWUgPSBfZG9fY21wKGYxLCBmMikKKyAgICAgICAgaWYgbGVuKF9jYWNoZSkgPiAxMDA6ICAgICAgIyBsaW1pdCB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBjYWNoZQorICAgICAgICAgICAgX2NhY2hlLmNsZWFyKCkKKyAgICAgICAgX2NhY2hlW2YxLCBmMiwgczEsIHMyXSA9IG91dGNvbWUKKyAgICByZXR1cm4gb3V0Y29tZQorCitkZWYgX3NpZyhzdCk6CisgICAgcmV0dXJuIChzdGF0LlNfSUZNVChzdC5zdF9tb2RlKSwKKyAgICAgICAgICAgIHN0LnN0X3NpemUsCisgICAgICAgICAgICBzdC5zdF9tdGltZSkKKworZGVmIF9kb19jbXAoZjEsIGYyKToKKyAgICBidWZzaXplID0gQlVGU0laRQorICAgIHdpdGggb3BlbihmMSwgJ3JiJykgYXMgZnAxLCBvcGVuKGYyLCAncmInKSBhcyBmcDI6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBiMSA9IGZwMS5yZWFkKGJ1ZnNpemUpCisgICAgICAgICAgICBiMiA9IGZwMi5yZWFkKGJ1ZnNpemUpCisgICAgICAgICAgICBpZiBiMSAhPSBiMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIG5vdCBiMToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisjIERpcmVjdG9yeSBjb21wYXJpc29uIGNsYXNzLgorIworY2xhc3MgZGlyY21wOgorICAgICIiIkEgY2xhc3MgdGhhdCBtYW5hZ2VzIHRoZSBjb21wYXJpc29uIG9mIDIgZGlyZWN0b3JpZXMuCisKKyAgICBkaXJjbXAoYSxiLGlnbm9yZT1Ob25lLGhpZGU9Tm9uZSkKKyAgICAgIEEgYW5kIEIgYXJlIGRpcmVjdG9yaWVzLgorICAgICAgSUdOT1JFIGlzIGEgbGlzdCBvZiBuYW1lcyB0byBpZ25vcmUsCisgICAgICAgIGRlZmF1bHRzIHRvIFsnUkNTJywgJ0NWUycsICd0YWdzJ10uCisgICAgICBISURFIGlzIGEgbGlzdCBvZiBuYW1lcyB0byBoaWRlLAorICAgICAgICBkZWZhdWx0cyB0byBbb3MuY3VyZGlyLCBvcy5wYXJkaXJdLgorCisgICAgSGlnaCBsZXZlbCB1c2FnZToKKyAgICAgIHggPSBkaXJjbXAoZGlyMSwgZGlyMikKKyAgICAgIHgucmVwb3J0KCkgLT4gcHJpbnRzIGEgcmVwb3J0IG9uIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRpcjEgYW5kIGRpcjIKKyAgICAgICBvcgorICAgICAgeC5yZXBvcnRfcGFydGlhbF9jbG9zdXJlKCkgLT4gcHJpbnRzIHJlcG9ydCBvbiBkaWZmZXJlbmNlcyBiZXR3ZWVuIGRpcjEKKyAgICAgICAgICAgIGFuZCBkaXIyLCBhbmQgcmVwb3J0cyBvbiBjb21tb24gaW1tZWRpYXRlIHN1YmRpcmVjdG9yaWVzLgorICAgICAgeC5yZXBvcnRfZnVsbF9jbG9zdXJlKCkgLT4gbGlrZSByZXBvcnRfcGFydGlhbF9jbG9zdXJlLAorICAgICAgICAgICAgYnV0IGZ1bGx5IHJlY3Vyc2l2ZS4KKworICAgIEF0dHJpYnV0ZXM6CisgICAgIGxlZnRfbGlzdCwgcmlnaHRfbGlzdDogVGhlIGZpbGVzIGluIGRpcjEgYW5kIGRpcjIsCisgICAgICAgIGZpbHRlcmVkIGJ5IGhpZGUgYW5kIGlnbm9yZS4KKyAgICAgY29tbW9uOiBhIGxpc3Qgb2YgbmFtZXMgaW4gYm90aCBkaXIxIGFuZCBkaXIyLgorICAgICBsZWZ0X29ubHksIHJpZ2h0X29ubHk6IG5hbWVzIG9ubHkgaW4gZGlyMSwgZGlyMi4KKyAgICAgY29tbW9uX2RpcnM6IHN1YmRpcmVjdG9yaWVzIGluIGJvdGggZGlyMSBhbmQgZGlyMi4KKyAgICAgY29tbW9uX2ZpbGVzOiBmaWxlcyBpbiBib3RoIGRpcjEgYW5kIGRpcjIuCisgICAgIGNvbW1vbl9mdW5ueTogbmFtZXMgaW4gYm90aCBkaXIxIGFuZCBkaXIyIHdoZXJlIHRoZSB0eXBlIGRpZmZlcnMgYmV0d2VlbgorICAgICAgICBkaXIxIGFuZCBkaXIyLCBvciB0aGUgbmFtZSBpcyBub3Qgc3RhdC1hYmxlLgorICAgICBzYW1lX2ZpbGVzOiBsaXN0IG9mIGlkZW50aWNhbCBmaWxlcy4KKyAgICAgZGlmZl9maWxlczogbGlzdCBvZiBmaWxlbmFtZXMgd2hpY2ggZGlmZmVyLgorICAgICBmdW5ueV9maWxlczogbGlzdCBvZiBmaWxlcyB3aGljaCBjb3VsZCBub3QgYmUgY29tcGFyZWQuCisgICAgIHN1YmRpcnM6IGEgZGljdGlvbmFyeSBvZiBkaXJjbXAgb2JqZWN0cywga2V5ZWQgYnkgbmFtZXMgaW4gY29tbW9uX2RpcnMuCisgICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGEsIGIsIGlnbm9yZT1Ob25lLCBoaWRlPU5vbmUpOiAjIEluaXRpYWxpemUKKyAgICAgICAgc2VsZi5sZWZ0ID0gYQorICAgICAgICBzZWxmLnJpZ2h0ID0gYgorICAgICAgICBpZiBoaWRlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmhpZGUgPSBbb3MuY3VyZGlyLCBvcy5wYXJkaXJdICMgTmFtZXMgbmV2ZXIgdG8gYmUgc2hvd24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaGlkZSA9IGhpZGUKKyAgICAgICAgaWYgaWdub3JlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmlnbm9yZSA9IFsnUkNTJywgJ0NWUycsICd0YWdzJ10gIyBOYW1lcyBpZ25vcmVkIGluIGNvbXBhcmlzb24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaWdub3JlID0gaWdub3JlCisKKyAgICBkZWYgcGhhc2UwKHNlbGYpOiAjIENvbXBhcmUgZXZlcnl0aGluZyBleGNlcHQgY29tbW9uIHN1YmRpcmVjdG9yaWVzCisgICAgICAgIHNlbGYubGVmdF9saXN0ID0gX2ZpbHRlcihvcy5saXN0ZGlyKHNlbGYubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhpZGUrc2VsZi5pZ25vcmUpCisgICAgICAgIHNlbGYucmlnaHRfbGlzdCA9IF9maWx0ZXIob3MubGlzdGRpcihzZWxmLnJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhpZGUrc2VsZi5pZ25vcmUpCisgICAgICAgIHNlbGYubGVmdF9saXN0LnNvcnQoKQorICAgICAgICBzZWxmLnJpZ2h0X2xpc3Quc29ydCgpCisKKyAgICBkZWYgcGhhc2UxKHNlbGYpOiAjIENvbXB1dGUgY29tbW9uIG5hbWVzCisgICAgICAgIGEgPSBkaWN0KGl6aXAoaW1hcChvcy5wYXRoLm5vcm1jYXNlLCBzZWxmLmxlZnRfbGlzdCksIHNlbGYubGVmdF9saXN0KSkKKyAgICAgICAgYiA9IGRpY3QoaXppcChpbWFwKG9zLnBhdGgubm9ybWNhc2UsIHNlbGYucmlnaHRfbGlzdCksIHNlbGYucmlnaHRfbGlzdCkpCisgICAgICAgIHNlbGYuY29tbW9uID0gbWFwKGEuX19nZXRpdGVtX18sIGlmaWx0ZXIoYi5fX2NvbnRhaW5zX18sIGEpKQorICAgICAgICBzZWxmLmxlZnRfb25seSA9IG1hcChhLl9fZ2V0aXRlbV9fLCBpZmlsdGVyZmFsc2UoYi5fX2NvbnRhaW5zX18sIGEpKQorICAgICAgICBzZWxmLnJpZ2h0X29ubHkgPSBtYXAoYi5fX2dldGl0ZW1fXywgaWZpbHRlcmZhbHNlKGEuX19jb250YWluc19fLCBiKSkKKworICAgIGRlZiBwaGFzZTIoc2VsZik6ICMgRGlzdGluZ3Vpc2ggZmlsZXMsIGRpcmVjdG9yaWVzLCBmdW5uaWVzCisgICAgICAgIHNlbGYuY29tbW9uX2RpcnMgPSBbXQorICAgICAgICBzZWxmLmNvbW1vbl9maWxlcyA9IFtdCisgICAgICAgIHNlbGYuY29tbW9uX2Z1bm55ID0gW10KKworICAgICAgICBmb3IgeCBpbiBzZWxmLmNvbW1vbjoKKyAgICAgICAgICAgIGFfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmxlZnQsIHgpCisgICAgICAgICAgICBiX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5yaWdodCwgeCkKKworICAgICAgICAgICAgb2sgPSAxCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYV9zdGF0ID0gb3Muc3RhdChhX3BhdGgpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3IsIHdoeToKKyAgICAgICAgICAgICAgICAjIHByaW50ICdDYW5cJ3Qgc3RhdCcsIGFfcGF0aCwgJzonLCB3aHlbMV0KKyAgICAgICAgICAgICAgICBvayA9IDAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiX3N0YXQgPSBvcy5zdGF0KGJfcGF0aCkKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgd2h5OgorICAgICAgICAgICAgICAgICMgcHJpbnQgJ0NhblwndCBzdGF0JywgYl9wYXRoLCAnOicsIHdoeVsxXQorICAgICAgICAgICAgICAgIG9rID0gMAorCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBhX3R5cGUgPSBzdGF0LlNfSUZNVChhX3N0YXQuc3RfbW9kZSkKKyAgICAgICAgICAgICAgICBiX3R5cGUgPSBzdGF0LlNfSUZNVChiX3N0YXQuc3RfbW9kZSkKKyAgICAgICAgICAgICAgICBpZiBhX3R5cGUgIT0gYl90eXBlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbW1vbl9mdW5ueS5hcHBlbmQoeCkKKyAgICAgICAgICAgICAgICBlbGlmIHN0YXQuU19JU0RJUihhX3R5cGUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbW1vbl9kaXJzLmFwcGVuZCh4KQorICAgICAgICAgICAgICAgIGVsaWYgc3RhdC5TX0lTUkVHKGFfdHlwZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbW9uX2ZpbGVzLmFwcGVuZCh4KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbW9uX2Z1bm55LmFwcGVuZCh4KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbW1vbl9mdW5ueS5hcHBlbmQoeCkKKworICAgIGRlZiBwaGFzZTMoc2VsZik6ICMgRmluZCBvdXQgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb21tb24gZmlsZXMKKyAgICAgICAgeHggPSBjbXBmaWxlcyhzZWxmLmxlZnQsIHNlbGYucmlnaHQsIHNlbGYuY29tbW9uX2ZpbGVzKQorICAgICAgICBzZWxmLnNhbWVfZmlsZXMsIHNlbGYuZGlmZl9maWxlcywgc2VsZi5mdW5ueV9maWxlcyA9IHh4CisKKyAgICBkZWYgcGhhc2U0KHNlbGYpOiAjIEZpbmQgb3V0IGRpZmZlcmVuY2VzIGJldHdlZW4gY29tbW9uIHN1YmRpcmVjdG9yaWVzCisgICAgICAgICMgQSBuZXcgZGlyY21wIG9iamVjdCBpcyBjcmVhdGVkIGZvciBlYWNoIGNvbW1vbiBzdWJkaXJlY3RvcnksCisgICAgICAgICMgdGhlc2UgYXJlIHN0b3JlZCBpbiBhIGRpY3Rpb25hcnkgaW5kZXhlZCBieSBmaWxlbmFtZS4KKyAgICAgICAgIyBUaGUgaGlkZSBhbmQgaWdub3JlIHByb3BlcnRpZXMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBwYXJlbnQKKyAgICAgICAgc2VsZi5zdWJkaXJzID0ge30KKyAgICAgICAgZm9yIHggaW4gc2VsZi5jb21tb25fZGlyczoKKyAgICAgICAgICAgIGFfeCA9IG9zLnBhdGguam9pbihzZWxmLmxlZnQsIHgpCisgICAgICAgICAgICBiX3ggPSBvcy5wYXRoLmpvaW4oc2VsZi5yaWdodCwgeCkKKyAgICAgICAgICAgIHNlbGYuc3ViZGlyc1t4XSAgPSBkaXJjbXAoYV94LCBiX3gsIHNlbGYuaWdub3JlLCBzZWxmLmhpZGUpCisKKyAgICBkZWYgcGhhc2U0X2Nsb3N1cmUoc2VsZik6ICMgUmVjdXJzaXZlbHkgY2FsbCBwaGFzZTQoKSBvbiBzdWJkaXJlY3RvcmllcworICAgICAgICBzZWxmLnBoYXNlNCgpCisgICAgICAgIGZvciBzZCBpbiBzZWxmLnN1YmRpcnMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgc2QucGhhc2U0X2Nsb3N1cmUoKQorCisgICAgZGVmIHJlcG9ydChzZWxmKTogIyBQcmludCBhIHJlcG9ydCBvbiB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhIGFuZCBiCisgICAgICAgICMgT3V0cHV0IGZvcm1hdCBpcyBwdXJwb3NlbHkgbG91c3kKKyAgICAgICAgcHJpbnQgJ2RpZmYnLCBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKyAgICAgICAgaWYgc2VsZi5sZWZ0X29ubHk6CisgICAgICAgICAgICBzZWxmLmxlZnRfb25seS5zb3J0KCkKKyAgICAgICAgICAgIHByaW50ICdPbmx5IGluJywgc2VsZi5sZWZ0LCAnOicsIHNlbGYubGVmdF9vbmx5CisgICAgICAgIGlmIHNlbGYucmlnaHRfb25seToKKyAgICAgICAgICAgIHNlbGYucmlnaHRfb25seS5zb3J0KCkKKyAgICAgICAgICAgIHByaW50ICdPbmx5IGluJywgc2VsZi5yaWdodCwgJzonLCBzZWxmLnJpZ2h0X29ubHkKKyAgICAgICAgaWYgc2VsZi5zYW1lX2ZpbGVzOgorICAgICAgICAgICAgc2VsZi5zYW1lX2ZpbGVzLnNvcnQoKQorICAgICAgICAgICAgcHJpbnQgJ0lkZW50aWNhbCBmaWxlcyA6Jywgc2VsZi5zYW1lX2ZpbGVzCisgICAgICAgIGlmIHNlbGYuZGlmZl9maWxlczoKKyAgICAgICAgICAgIHNlbGYuZGlmZl9maWxlcy5zb3J0KCkKKyAgICAgICAgICAgIHByaW50ICdEaWZmZXJpbmcgZmlsZXMgOicsIHNlbGYuZGlmZl9maWxlcworICAgICAgICBpZiBzZWxmLmZ1bm55X2ZpbGVzOgorICAgICAgICAgICAgc2VsZi5mdW5ueV9maWxlcy5zb3J0KCkKKyAgICAgICAgICAgIHByaW50ICdUcm91YmxlIHdpdGggY29tbW9uIGZpbGVzIDonLCBzZWxmLmZ1bm55X2ZpbGVzCisgICAgICAgIGlmIHNlbGYuY29tbW9uX2RpcnM6CisgICAgICAgICAgICBzZWxmLmNvbW1vbl9kaXJzLnNvcnQoKQorICAgICAgICAgICAgcHJpbnQgJ0NvbW1vbiBzdWJkaXJlY3RvcmllcyA6Jywgc2VsZi5jb21tb25fZGlycworICAgICAgICBpZiBzZWxmLmNvbW1vbl9mdW5ueToKKyAgICAgICAgICAgIHNlbGYuY29tbW9uX2Z1bm55LnNvcnQoKQorICAgICAgICAgICAgcHJpbnQgJ0NvbW1vbiBmdW5ueSBjYXNlcyA6Jywgc2VsZi5jb21tb25fZnVubnkKKworICAgIGRlZiByZXBvcnRfcGFydGlhbF9jbG9zdXJlKHNlbGYpOiAjIFByaW50IHJlcG9ydHMgb24gc2VsZiBhbmQgb24gc3ViZGlycworICAgICAgICBzZWxmLnJlcG9ydCgpCisgICAgICAgIGZvciBzZCBpbiBzZWxmLnN1YmRpcnMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHNkLnJlcG9ydCgpCisKKyAgICBkZWYgcmVwb3J0X2Z1bGxfY2xvc3VyZShzZWxmKTogIyBSZXBvcnQgb24gc2VsZiBhbmQgc3ViZGlycyByZWN1cnNpdmVseQorICAgICAgICBzZWxmLnJlcG9ydCgpCisgICAgICAgIGZvciBzZCBpbiBzZWxmLnN1YmRpcnMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHNkLnJlcG9ydF9mdWxsX2Nsb3N1cmUoKQorCisgICAgbWV0aG9kbWFwID0gZGljdChzdWJkaXJzPXBoYXNlNCwKKyAgICAgICAgICAgICAgICAgICAgIHNhbWVfZmlsZXM9cGhhc2UzLCBkaWZmX2ZpbGVzPXBoYXNlMywgZnVubnlfZmlsZXM9cGhhc2UzLAorICAgICAgICAgICAgICAgICAgICAgY29tbW9uX2RpcnMgPSBwaGFzZTIsIGNvbW1vbl9maWxlcz1waGFzZTIsIGNvbW1vbl9mdW5ueT1waGFzZTIsCisgICAgICAgICAgICAgICAgICAgICBjb21tb249cGhhc2UxLCBsZWZ0X29ubHk9cGhhc2UxLCByaWdodF9vbmx5PXBoYXNlMSwKKyAgICAgICAgICAgICAgICAgICAgIGxlZnRfbGlzdD1waGFzZTAsIHJpZ2h0X2xpc3Q9cGhhc2UwKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICBpZiBhdHRyIG5vdCBpbiBzZWxmLm1ldGhvZG1hcDoKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBhdHRyCisgICAgICAgIHNlbGYubWV0aG9kbWFwW2F0dHJdKHNlbGYpCisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIGF0dHIpCisKK2RlZiBjbXBmaWxlcyhhLCBiLCBjb21tb24sIHNoYWxsb3c9MSk6CisgICAgIiIiQ29tcGFyZSBjb21tb24gZmlsZXMgaW4gdHdvIGRpcmVjdG9yaWVzLgorCisgICAgYSwgYiAtLSBkaXJlY3RvcnkgbmFtZXMKKyAgICBjb21tb24gLS0gbGlzdCBvZiBmaWxlIG5hbWVzIGZvdW5kIGluIGJvdGggZGlyZWN0b3JpZXMKKyAgICBzaGFsbG93IC0tIGlmIHRydWUsIGRvIGNvbXBhcmlzb24gYmFzZWQgc29sZWx5IG9uIHN0YXQoKSBpbmZvcm1hdGlvbgorCisgICAgUmV0dXJucyBhIHR1cGxlIG9mIHRocmVlIGxpc3RzOgorICAgICAgZmlsZXMgdGhhdCBjb21wYXJlIGVxdWFsCisgICAgICBmaWxlcyB0aGF0IGFyZSBkaWZmZXJlbnQKKyAgICAgIGZpbGVuYW1lcyB0aGF0IGFyZW4ndCByZWd1bGFyIGZpbGVzLgorCisgICAgIiIiCisgICAgcmVzID0gKFtdLCBbXSwgW10pCisgICAgZm9yIHggaW4gY29tbW9uOgorICAgICAgICBheCA9IG9zLnBhdGguam9pbihhLCB4KQorICAgICAgICBieCA9IG9zLnBhdGguam9pbihiLCB4KQorICAgICAgICByZXNbX2NtcChheCwgYngsIHNoYWxsb3cpXS5hcHBlbmQoeCkKKyAgICByZXR1cm4gcmVzCisKKworIyBDb21wYXJlIHR3byBmaWxlcy4KKyMgUmV0dXJuOgorIyAgICAgICAwIGZvciBlcXVhbAorIyAgICAgICAxIGZvciBkaWZmZXJlbnQKKyMgICAgICAgMiBmb3IgZnVubnkgY2FzZXMgKGNhbid0IHN0YXQsIGV0Yy4pCisjCitkZWYgX2NtcChhLCBiLCBzaCwgYWJzPWFicywgY21wPWNtcCk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gbm90IGFicyhjbXAoYSwgYiwgc2gpKQorICAgIGV4Y2VwdCAob3MuZXJyb3IsIElPRXJyb3IpOgorICAgICAgICByZXR1cm4gMgorCisKKyMgUmV0dXJuIGEgY29weSB3aXRoIGl0ZW1zIHRoYXQgb2NjdXIgaW4gc2tpcCByZW1vdmVkLgorIworZGVmIF9maWx0ZXIoZmxpc3QsIHNraXApOgorICAgIHJldHVybiBsaXN0KGlmaWx0ZXJmYWxzZShza2lwLl9fY29udGFpbnNfXywgZmxpc3QpKQorCisKKyMgRGVtb25zdHJhdGlvbiBhbmQgdGVzdGluZy4KKyMKK2RlZiBkZW1vKCk6CisgICAgaW1wb3J0IHN5cworICAgIGltcG9ydCBnZXRvcHQKKyAgICBvcHRpb25zLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdyJykKKyAgICBpZiBsZW4oYXJncykgIT0gMjoKKyAgICAgICAgcmFpc2UgZ2V0b3B0LkdldG9wdEVycm9yKCduZWVkIGV4YWN0bHkgdHdvIGFyZ3MnLCBOb25lKQorICAgIGRkID0gZGlyY21wKGFyZ3NbMF0sIGFyZ3NbMV0pCisgICAgaWYgKCctcicsICcnKSBpbiBvcHRpb25zOgorICAgICAgICBkZC5yZXBvcnRfZnVsbF9jbG9zdXJlKCkKKyAgICBlbHNlOgorICAgICAgICBkZC5yZXBvcnQoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGRlbW8oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9maWxlY21wLnB5YyBiL2xpYi9weXRob24yLjcvZmlsZWNtcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlZGUyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZmlsZWNtcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9maWxlY21wLnB5byBiL2xpYi9weXRob24yLjcvZmlsZWNtcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlZGUyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZmlsZWNtcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9maWxlaW5wdXQucHkgYi9saWIvcHl0aG9uMi43L2ZpbGVpbnB1dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTQ4NTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9maWxlaW5wdXQucHkKQEAgLTAsMCArMSw0MTMgQEAKKyIiIkhlbHBlciBjbGFzcyB0byBxdWlja2x5IHdyaXRlIGEgbG9vcCBvdmVyIGFsbCBzdGFuZGFyZCBpbnB1dCBmaWxlcy4KKworVHlwaWNhbCB1c2UgaXM6CisKKyAgICBpbXBvcnQgZmlsZWlucHV0CisgICAgZm9yIGxpbmUgaW4gZmlsZWlucHV0LmlucHV0KCk6CisgICAgICAgIHByb2Nlc3MobGluZSkKKworVGhpcyBpdGVyYXRlcyBvdmVyIHRoZSBsaW5lcyBvZiBhbGwgZmlsZXMgbGlzdGVkIGluIHN5cy5hcmd2WzE6XSwKK2RlZmF1bHRpbmcgdG8gc3lzLnN0ZGluIGlmIHRoZSBsaXN0IGlzIGVtcHR5LiAgSWYgYSBmaWxlbmFtZSBpcyAnLScgaXQKK2lzIGFsc28gcmVwbGFjZWQgYnkgc3lzLnN0ZGluLiAgVG8gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZSBsaXN0IG9mCitmaWxlbmFtZXMsIHBhc3MgaXQgYXMgdGhlIGFyZ3VtZW50IHRvIGlucHV0KCkuICBBIHNpbmdsZSBmaWxlIG5hbWUgaXMKK2Fsc28gYWxsb3dlZC4KKworRnVuY3Rpb25zIGZpbGVuYW1lKCksIGxpbmVubygpIHJldHVybiB0aGUgZmlsZW5hbWUgYW5kIGN1bXVsYXRpdmUgbGluZQorbnVtYmVyIG9mIHRoZSBsaW5lIHRoYXQgaGFzIGp1c3QgYmVlbiByZWFkOyBmaWxlbGluZW5vKCkgcmV0dXJucyBpdHMKK2xpbmUgbnVtYmVyIGluIHRoZSBjdXJyZW50IGZpbGU7IGlzZmlyc3RsaW5lKCkgcmV0dXJucyB0cnVlIGlmZiB0aGUKK2xpbmUganVzdCByZWFkIGlzIHRoZSBmaXJzdCBsaW5lIG9mIGl0cyBmaWxlOyBpc3N0ZGluKCkgcmV0dXJucyB0cnVlCitpZmYgdGhlIGxpbmUgd2FzIHJlYWQgZnJvbSBzeXMuc3RkaW4uICBGdW5jdGlvbiBuZXh0ZmlsZSgpIGNsb3NlcyB0aGUKK2N1cnJlbnQgZmlsZSBzbyB0aGF0IHRoZSBuZXh0IGl0ZXJhdGlvbiB3aWxsIHJlYWQgdGhlIGZpcnN0IGxpbmUgZnJvbQordGhlIG5leHQgZmlsZSAoaWYgYW55KTsgbGluZXMgbm90IHJlYWQgZnJvbSB0aGUgZmlsZSB3aWxsIG5vdCBjb3VudAordG93YXJkcyB0aGUgY3VtdWxhdGl2ZSBsaW5lIGNvdW50OyB0aGUgZmlsZW5hbWUgaXMgbm90IGNoYW5nZWQgdW50aWwKK2FmdGVyIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBuZXh0IGZpbGUgaGFzIGJlZW4gcmVhZC4gIEZ1bmN0aW9uIGNsb3NlKCkKK2Nsb3NlcyB0aGUgc2VxdWVuY2UuCisKK0JlZm9yZSBhbnkgbGluZXMgaGF2ZSBiZWVuIHJlYWQsIGZpbGVuYW1lKCkgcmV0dXJucyBOb25lIGFuZCBib3RoIGxpbmUKK251bWJlcnMgYXJlIHplcm87IG5leHRmaWxlKCkgaGFzIG5vIGVmZmVjdC4gIEFmdGVyIGFsbCBsaW5lcyBoYXZlIGJlZW4KK3JlYWQsIGZpbGVuYW1lKCkgYW5kIHRoZSBsaW5lIG51bWJlciBmdW5jdGlvbnMgcmV0dXJuIHRoZSB2YWx1ZXMKK3BlcnRhaW5pbmcgdG8gdGhlIGxhc3QgbGluZSByZWFkOyBuZXh0ZmlsZSgpIGhhcyBubyBlZmZlY3QuCisKK0FsbCBmaWxlcyBhcmUgb3BlbmVkIGluIHRleHQgbW9kZSBieSBkZWZhdWx0LCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkKK3NldHRpbmcgdGhlIG1vZGUgcGFyYW1ldGVyIHRvIGlucHV0KCkgb3IgRmlsZUlucHV0Ll9faW5pdF9fKCkuCitJZiBhbiBJL08gZXJyb3Igb2NjdXJzIGR1cmluZyBvcGVuaW5nIG9yIHJlYWRpbmcgYSBmaWxlLCB0aGUgSU9FcnJvcgorZXhjZXB0aW9uIGlzIHJhaXNlZC4KKworSWYgc3lzLnN0ZGluIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UsIHRoZSBzZWNvbmQgYW5kIGZ1cnRoZXIgdXNlIHdpbGwKK3JldHVybiBubyBsaW5lcywgZXhjZXB0IHBlcmhhcHMgZm9yIGludGVyYWN0aXZlIHVzZSwgb3IgaWYgaXQgaGFzIGJlZW4KK2V4cGxpY2l0bHkgcmVzZXQgKGUuZy4gdXNpbmcgc3lzLnN0ZGluLnNlZWsoMCkpLgorCitFbXB0eSBmaWxlcyBhcmUgb3BlbmVkIGFuZCBpbW1lZGlhdGVseSBjbG9zZWQ7IHRoZSBvbmx5IHRpbWUgdGhlaXIKK3ByZXNlbmNlIGluIHRoZSBsaXN0IG9mIGZpbGVuYW1lcyBpcyBub3RpY2VhYmxlIGF0IGFsbCBpcyB3aGVuIHRoZQorbGFzdCBmaWxlIG9wZW5lZCBpcyBlbXB0eS4KKworSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgbGFzdCBsaW5lIG9mIGEgZmlsZSBkb2Vzbid0IGVuZCBpbiBhIG5ld2xpbmUKK2NoYXJhY3Rlcjsgb3RoZXJ3aXNlIGxpbmVzIGFyZSByZXR1cm5lZCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nCituZXdsaW5lLgorCitDbGFzcyBGaWxlSW5wdXQgaXMgdGhlIGltcGxlbWVudGF0aW9uOyBpdHMgbWV0aG9kcyBmaWxlbmFtZSgpLAorbGluZW5vKCksIGZpbGVsaW5lKCksIGlzZmlyc3RsaW5lKCksIGlzc3RkaW4oKSwgbmV4dGZpbGUoKSBhbmQgY2xvc2UoKQorY29ycmVzcG9uZCB0byB0aGUgZnVuY3Rpb25zIGluIHRoZSBtb2R1bGUuICBJbiBhZGRpdGlvbiBpdCBoYXMgYQorcmVhZGxpbmUoKSBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgbmV4dCBpbnB1dCBsaW5lLCBhbmQgYQorX19nZXRpdGVtX18oKSBtZXRob2Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgc2VxdWVuY2UgYmVoYXZpb3IuICBUaGUKK3NlcXVlbmNlIG11c3QgYmUgYWNjZXNzZWQgaW4gc3RyaWN0bHkgc2VxdWVudGlhbCBvcmRlcjsgc2VxdWVuY2UKK2FjY2VzcyBhbmQgcmVhZGxpbmUoKSBjYW5ub3QgYmUgbWl4ZWQuCisKK09wdGlvbmFsIGluLXBsYWNlIGZpbHRlcmluZzogaWYgdGhlIGtleXdvcmQgYXJndW1lbnQgaW5wbGFjZT0xIGlzCitwYXNzZWQgdG8gaW5wdXQoKSBvciB0byB0aGUgRmlsZUlucHV0IGNvbnN0cnVjdG9yLCB0aGUgZmlsZSBpcyBtb3ZlZAordG8gYSBiYWNrdXAgZmlsZSBhbmQgc3RhbmRhcmQgb3V0cHV0IGlzIGRpcmVjdGVkIHRvIHRoZSBpbnB1dCBmaWxlLgorVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byB3cml0ZSBhIGZpbHRlciB0aGF0IHJld3JpdGVzIGl0cyBpbnB1dCBmaWxlCitpbiBwbGFjZS4gIElmIHRoZSBrZXl3b3JkIGFyZ3VtZW50IGJhY2t1cD0iLjxzb21lIGV4dGVuc2lvbj4iIGlzIGFsc28KK2dpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIGV4dGVuc2lvbiBmb3IgdGhlIGJhY2t1cCBmaWxlLCBhbmQgdGhlIGJhY2t1cAorZmlsZSByZW1haW5zIGFyb3VuZDsgYnkgZGVmYXVsdCwgdGhlIGV4dGVuc2lvbiBpcyAiLmJhayIgYW5kIGl0IGlzCitkZWxldGVkIHdoZW4gdGhlIG91dHB1dCBmaWxlIGlzIGNsb3NlZC4gIEluLXBsYWNlIGZpbHRlcmluZyBpcworZGlzYWJsZWQgd2hlbiBzdGFuZGFyZCBpbnB1dCBpcyByZWFkLiAgWFhYIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uCitkb2VzIG5vdCB3b3JrIGZvciBNUy1ET1MgOCszIGZpbGVzeXN0ZW1zLgorCitQZXJmb3JtYW5jZTogdGhpcyBtb2R1bGUgaXMgdW5mb3J0dW5hdGVseSBvbmUgb2YgdGhlIHNsb3dlciB3YXlzIG9mCitwcm9jZXNzaW5nIGxhcmdlIG51bWJlcnMgb2YgaW5wdXQgbGluZXMuICBOZXZlcnRoZWxlc3MsIGEgc2lnbmlmaWNhbnQKK3NwZWVkLXVwIGhhcyBiZWVuIG9idGFpbmVkIGJ5IHVzaW5nIHJlYWRsaW5lcyhidWZzaXplKSBpbnN0ZWFkIG9mCityZWFkbGluZSgpLiAgQSBuZXcga2V5d29yZCBhcmd1bWVudCwgYnVmc2l6ZT1OLCBpcyBwcmVzZW50IG9uIHRoZQoraW5wdXQoKSBmdW5jdGlvbiBhbmQgdGhlIEZpbGVJbnB1dCgpIGNsYXNzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0CitidWZmZXIgc2l6ZS4KKworWFhYIFBvc3NpYmxlIGFkZGl0aW9uczoKKworLSBvcHRpb25hbCBnZXRvcHQgYXJndW1lbnQgcHJvY2Vzc2luZworLSBpc2F0dHkoKQorLSByZWFkKCksIHJlYWQoc2l6ZSksIGV2ZW4gcmVhZGxpbmVzKCkKKworIiIiCisKK2ltcG9ydCBzeXMsIG9zCisKK19fYWxsX18gPSBbImlucHV0IiwiY2xvc2UiLCJuZXh0ZmlsZSIsImZpbGVuYW1lIiwibGluZW5vIiwiZmlsZWxpbmVubyIsCisgICAgICAgICAgICJpc2ZpcnN0bGluZSIsImlzc3RkaW4iLCJGaWxlSW5wdXQiXQorCitfc3RhdGUgPSBOb25lCisKK0RFRkFVTFRfQlVGU0laRSA9IDgqMTAyNAorCitkZWYgaW5wdXQoZmlsZXM9Tm9uZSwgaW5wbGFjZT0wLCBiYWNrdXA9IiIsIGJ1ZnNpemU9MCwKKyAgICAgICAgICBtb2RlPSJyIiwgb3Blbmhvb2s9Tm9uZSk6CisgICAgIiIiaW5wdXQoW2ZpbGVzWywgaW5wbGFjZVssIGJhY2t1cFssIG1vZGVbLCBvcGVuaG9va11dXV1dKQorCisgICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBGaWxlSW5wdXQgY2xhc3MuIFRoZSBpbnN0YW5jZSB3aWxsIGJlIHVzZWQKKyAgICBhcyBnbG9iYWwgc3RhdGUgZm9yIHRoZSBmdW5jdGlvbnMgb2YgdGhpcyBtb2R1bGUsIGFuZCBpcyBhbHNvIHJldHVybmVkCisgICAgdG8gdXNlIGR1cmluZyBpdGVyYXRpb24uIFRoZSBwYXJhbWV0ZXJzIHRvIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBwYXNzZWQKKyAgICBhbG9uZyB0byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIEZpbGVJbnB1dCBjbGFzcy4KKyAgICAiIiIKKyAgICBnbG9iYWwgX3N0YXRlCisgICAgaWYgX3N0YXRlIGFuZCBfc3RhdGUuX2ZpbGU6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgImlucHV0KCkgYWxyZWFkeSBhY3RpdmUiCisgICAgX3N0YXRlID0gRmlsZUlucHV0KGZpbGVzLCBpbnBsYWNlLCBiYWNrdXAsIGJ1ZnNpemUsIG1vZGUsIG9wZW5ob29rKQorICAgIHJldHVybiBfc3RhdGUKKworZGVmIGNsb3NlKCk6CisgICAgIiIiQ2xvc2UgdGhlIHNlcXVlbmNlLiIiIgorICAgIGdsb2JhbCBfc3RhdGUKKyAgICBzdGF0ZSA9IF9zdGF0ZQorICAgIF9zdGF0ZSA9IE5vbmUKKyAgICBpZiBzdGF0ZToKKyAgICAgICAgc3RhdGUuY2xvc2UoKQorCitkZWYgbmV4dGZpbGUoKToKKyAgICAiIiIKKyAgICBDbG9zZSB0aGUgY3VycmVudCBmaWxlIHNvIHRoYXQgdGhlIG5leHQgaXRlcmF0aW9uIHdpbGwgcmVhZCB0aGUgZmlyc3QKKyAgICBsaW5lIGZyb20gdGhlIG5leHQgZmlsZSAoaWYgYW55KTsgbGluZXMgbm90IHJlYWQgZnJvbSB0aGUgZmlsZSB3aWxsCisgICAgbm90IGNvdW50IHRvd2FyZHMgdGhlIGN1bXVsYXRpdmUgbGluZSBjb3VudC4gVGhlIGZpbGVuYW1lIGlzIG5vdAorICAgIGNoYW5nZWQgdW50aWwgYWZ0ZXIgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIG5leHQgZmlsZSBoYXMgYmVlbiByZWFkLgorICAgIEJlZm9yZSB0aGUgZmlyc3QgbGluZSBoYXMgYmVlbiByZWFkLCB0aGlzIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3Q7CisgICAgaXQgY2Fubm90IGJlIHVzZWQgdG8gc2tpcCB0aGUgZmlyc3QgZmlsZS4gQWZ0ZXIgdGhlIGxhc3QgbGluZSBvZiB0aGUKKyAgICBsYXN0IGZpbGUgaGFzIGJlZW4gcmVhZCwgdGhpcyBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0LgorICAgICIiIgorICAgIGlmIG5vdCBfc3RhdGU6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIm5vIGFjdGl2ZSBpbnB1dCgpIgorICAgIHJldHVybiBfc3RhdGUubmV4dGZpbGUoKQorCitkZWYgZmlsZW5hbWUoKToKKyAgICAiIiIKKyAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGZpbGUgY3VycmVudGx5IGJlaW5nIHJlYWQuCisgICAgQmVmb3JlIHRoZSBmaXJzdCBsaW5lIGhhcyBiZWVuIHJlYWQsIHJldHVybnMgTm9uZS4KKyAgICAiIiIKKyAgICBpZiBub3QgX3N0YXRlOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJubyBhY3RpdmUgaW5wdXQoKSIKKyAgICByZXR1cm4gX3N0YXRlLmZpbGVuYW1lKCkKKworZGVmIGxpbmVubygpOgorICAgICIiIgorICAgIFJldHVybiB0aGUgY3VtdWxhdGl2ZSBsaW5lIG51bWJlciBvZiB0aGUgbGluZSB0aGF0IGhhcyBqdXN0IGJlZW4gcmVhZC4KKyAgICBCZWZvcmUgdGhlIGZpcnN0IGxpbmUgaGFzIGJlZW4gcmVhZCwgcmV0dXJucyAwLiBBZnRlciB0aGUgbGFzdCBsaW5lCisgICAgb2YgdGhlIGxhc3QgZmlsZSBoYXMgYmVlbiByZWFkLCByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGF0IGxpbmUuCisgICAgIiIiCisgICAgaWYgbm90IF9zdGF0ZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm8gYWN0aXZlIGlucHV0KCkiCisgICAgcmV0dXJuIF9zdGF0ZS5saW5lbm8oKQorCitkZWYgZmlsZWxpbmVubygpOgorICAgICIiIgorICAgIFJldHVybiB0aGUgbGluZSBudW1iZXIgaW4gdGhlIGN1cnJlbnQgZmlsZS4gQmVmb3JlIHRoZSBmaXJzdCBsaW5lCisgICAgaGFzIGJlZW4gcmVhZCwgcmV0dXJucyAwLiBBZnRlciB0aGUgbGFzdCBsaW5lIG9mIHRoZSBsYXN0IGZpbGUgaGFzCisgICAgYmVlbiByZWFkLCByZXR1cm5zIHRoZSBsaW5lIG51bWJlciBvZiB0aGF0IGxpbmUgd2l0aGluIHRoZSBmaWxlLgorICAgICIiIgorICAgIGlmIG5vdCBfc3RhdGU6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIm5vIGFjdGl2ZSBpbnB1dCgpIgorICAgIHJldHVybiBfc3RhdGUuZmlsZWxpbmVubygpCisKK2RlZiBmaWxlbm8oKToKKyAgICAiIiIKKyAgICBSZXR1cm4gdGhlIGZpbGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IGZpbGUuIFdoZW4gbm8gZmlsZSBpcyBjdXJyZW50bHkKKyAgICBvcGVuZWQsIHJldHVybnMgLTEuCisgICAgIiIiCisgICAgaWYgbm90IF9zdGF0ZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm8gYWN0aXZlIGlucHV0KCkiCisgICAgcmV0dXJuIF9zdGF0ZS5maWxlbm8oKQorCitkZWYgaXNmaXJzdGxpbmUoKToKKyAgICAiIiIKKyAgICBSZXR1cm5zIHRydWUgdGhlIGxpbmUganVzdCByZWFkIGlzIHRoZSBmaXJzdCBsaW5lIG9mIGl0cyBmaWxlLAorICAgIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICAgICIiIgorICAgIGlmIG5vdCBfc3RhdGU6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIm5vIGFjdGl2ZSBpbnB1dCgpIgorICAgIHJldHVybiBfc3RhdGUuaXNmaXJzdGxpbmUoKQorCitkZWYgaXNzdGRpbigpOgorICAgICIiIgorICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGFzdCBsaW5lIHdhcyByZWFkIGZyb20gc3lzLnN0ZGluLAorICAgIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICAgICIiIgorICAgIGlmIG5vdCBfc3RhdGU6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIm5vIGFjdGl2ZSBpbnB1dCgpIgorICAgIHJldHVybiBfc3RhdGUuaXNzdGRpbigpCisKK2NsYXNzIEZpbGVJbnB1dDoKKyAgICAiIiJjbGFzcyBGaWxlSW5wdXQoW2ZpbGVzWywgaW5wbGFjZVssIGJhY2t1cFssIG1vZGVbLCBvcGVuaG9va11dXV1dKQorCisgICAgQ2xhc3MgRmlsZUlucHV0IGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kdWxlOyBpdHMgbWV0aG9kcworICAgIGZpbGVuYW1lKCksIGxpbmVubygpLCBmaWxlbGluZSgpLCBpc2ZpcnN0bGluZSgpLCBpc3N0ZGluKCksIGZpbGVubygpLAorICAgIG5leHRmaWxlKCkgYW5kIGNsb3NlKCkgY29ycmVzcG9uZCB0byB0aGUgZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUKKyAgICBpbiB0aGUgbW9kdWxlLgorICAgIEluIGFkZGl0aW9uIGl0IGhhcyBhIHJlYWRsaW5lKCkgbWV0aG9kIHdoaWNoIHJldHVybnMgdGhlIG5leHQKKyAgICBpbnB1dCBsaW5lLCBhbmQgYSBfX2dldGl0ZW1fXygpIG1ldGhvZCB3aGljaCBpbXBsZW1lbnRzIHRoZQorICAgIHNlcXVlbmNlIGJlaGF2aW9yLiBUaGUgc2VxdWVuY2UgbXVzdCBiZSBhY2Nlc3NlZCBpbiBzdHJpY3RseQorICAgIHNlcXVlbnRpYWwgb3JkZXI7IHJhbmRvbSBhY2Nlc3MgYW5kIHJlYWRsaW5lKCkgY2Fubm90IGJlIG1peGVkLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVzPU5vbmUsIGlucGxhY2U9MCwgYmFja3VwPSIiLCBidWZzaXplPTAsCisgICAgICAgICAgICAgICAgIG1vZGU9InIiLCBvcGVuaG9vaz1Ob25lKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlcywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBmaWxlcyA9IChmaWxlcywpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBmaWxlcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGZpbGVzID0gc3lzLmFyZ3ZbMTpdCisgICAgICAgICAgICBpZiBub3QgZmlsZXM6CisgICAgICAgICAgICAgICAgZmlsZXMgPSAoJy0nLCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmlsZXMgPSB0dXBsZShmaWxlcykKKyAgICAgICAgc2VsZi5fZmlsZXMgPSBmaWxlcworICAgICAgICBzZWxmLl9pbnBsYWNlID0gaW5wbGFjZQorICAgICAgICBzZWxmLl9iYWNrdXAgPSBiYWNrdXAKKyAgICAgICAgc2VsZi5fYnVmc2l6ZSA9IGJ1ZnNpemUgb3IgREVGQVVMVF9CVUZTSVpFCisgICAgICAgIHNlbGYuX3NhdmVzdGRvdXQgPSBOb25lCisgICAgICAgIHNlbGYuX291dHB1dCA9IE5vbmUKKyAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBOb25lCisgICAgICAgIHNlbGYuX2xpbmVubyA9IDAKKyAgICAgICAgc2VsZi5fZmlsZWxpbmVubyA9IDAKKyAgICAgICAgc2VsZi5fZmlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5faXNzdGRpbiA9IEZhbHNlCisgICAgICAgIHNlbGYuX2JhY2t1cGZpbGVuYW1lID0gTm9uZQorICAgICAgICBzZWxmLl9idWZmZXIgPSBbXQorICAgICAgICBzZWxmLl9idWZpbmRleCA9IDAKKyAgICAgICAgIyByZXN0cmljdCBtb2RlIGFyZ3VtZW50IHRvIHJlYWRpbmcgbW9kZXMKKyAgICAgICAgaWYgbW9kZSBub3QgaW4gKCdyJywgJ3JVJywgJ1UnLCAncmInKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkZpbGVJbnB1dCBvcGVuaW5nIG1vZGUgbXVzdCBiZSBvbmUgb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3InLCAnclUnLCAnVScgYW5kICdyYiciKQorICAgICAgICBzZWxmLl9tb2RlID0gbW9kZQorICAgICAgICBpZiBpbnBsYWNlIGFuZCBvcGVuaG9vazoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkZpbGVJbnB1dCBjYW5ub3QgdXNlIGFuIG9wZW5pbmcgaG9vayBpbiBpbnBsYWNlIG1vZGUiKQorICAgICAgICBlbGlmIG9wZW5ob29rIGFuZCBub3QgaGFzYXR0cihvcGVuaG9vaywgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJGaWxlSW5wdXQgb3Blbmhvb2sgbXVzdCBiZSBjYWxsYWJsZSIpCisgICAgICAgIHNlbGYuX29wZW5ob29rID0gb3Blbmhvb2sKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5uZXh0ZmlsZSgpCisgICAgICAgIHNlbGYuX2ZpbGVzID0gKCkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5fYnVmZmVyW3NlbGYuX2J1ZmluZGV4XQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2J1ZmluZGV4ICs9IDEKKyAgICAgICAgICAgIHNlbGYuX2xpbmVubyArPSAxCisgICAgICAgICAgICBzZWxmLl9maWxlbGluZW5vICs9IDEKKyAgICAgICAgICAgIHJldHVybiBsaW5lCisgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHJldHVybiBsaW5lCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgIGlmIGkgIT0gc2VsZi5fbGluZW5vOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiYWNjZXNzaW5nIGxpbmVzIG91dCBvZiBvcmRlciIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubmV4dCgpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvciwgImVuZCBvZiBpbnB1dCByZWFjaGVkIgorCisgICAgZGVmIG5leHRmaWxlKHNlbGYpOgorICAgICAgICBzYXZlc3Rkb3V0ID0gc2VsZi5fc2F2ZXN0ZG91dAorICAgICAgICBzZWxmLl9zYXZlc3Rkb3V0ID0gMAorICAgICAgICBpZiBzYXZlc3Rkb3V0OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVzdGRvdXQKKworICAgICAgICBvdXRwdXQgPSBzZWxmLl9vdXRwdXQKKyAgICAgICAgc2VsZi5fb3V0cHV0ID0gMAorICAgICAgICBpZiBvdXRwdXQ6CisgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKQorCisgICAgICAgIGZpbGUgPSBzZWxmLl9maWxlCisgICAgICAgIHNlbGYuX2ZpbGUgPSAwCisgICAgICAgIGlmIGZpbGUgYW5kIG5vdCBzZWxmLl9pc3N0ZGluOgorICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisKKyAgICAgICAgYmFja3VwZmlsZW5hbWUgPSBzZWxmLl9iYWNrdXBmaWxlbmFtZQorICAgICAgICBzZWxmLl9iYWNrdXBmaWxlbmFtZSA9IDAKKyAgICAgICAgaWYgYmFja3VwZmlsZW5hbWUgYW5kIG5vdCBzZWxmLl9iYWNrdXA6CisgICAgICAgICAgICB0cnk6IG9zLnVubGluayhiYWNrdXBmaWxlbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOiBwYXNzCisKKyAgICAgICAgc2VsZi5faXNzdGRpbiA9IEZhbHNlCisgICAgICAgIHNlbGYuX2J1ZmZlciA9IFtdCisgICAgICAgIHNlbGYuX2J1ZmluZGV4ID0gMAorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5fYnVmZmVyW3NlbGYuX2J1ZmluZGV4XQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2J1ZmluZGV4ICs9IDEKKyAgICAgICAgICAgIHNlbGYuX2xpbmVubyArPSAxCisgICAgICAgICAgICBzZWxmLl9maWxlbGluZW5vICs9IDEKKyAgICAgICAgICAgIHJldHVybiBsaW5lCisgICAgICAgIGlmIG5vdCBzZWxmLl9maWxlOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2ZpbGVzOgorICAgICAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICAgICAgc2VsZi5fZmlsZW5hbWUgPSBzZWxmLl9maWxlc1swXQorICAgICAgICAgICAgc2VsZi5fZmlsZXMgPSBzZWxmLl9maWxlc1sxOl0KKyAgICAgICAgICAgIHNlbGYuX2ZpbGVsaW5lbm8gPSAwCisgICAgICAgICAgICBzZWxmLl9maWxlID0gTm9uZQorICAgICAgICAgICAgc2VsZi5faXNzdGRpbiA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLl9iYWNrdXBmaWxlbmFtZSA9IDAKKyAgICAgICAgICAgIGlmIHNlbGYuX2ZpbGVuYW1lID09ICctJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlbmFtZSA9ICc8c3RkaW4+JworICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUgPSBzeXMuc3RkaW4KKyAgICAgICAgICAgICAgICBzZWxmLl9pc3N0ZGluID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9pbnBsYWNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9iYWNrdXBmaWxlbmFtZSA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVuYW1lICsgKHNlbGYuX2JhY2t1cCBvciBvcy5leHRzZXArImJhayIpKQorICAgICAgICAgICAgICAgICAgICB0cnk6IG9zLnVubGluayhzZWxmLl9iYWNrdXBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOiBwYXNzCisgICAgICAgICAgICAgICAgICAgICMgVGhlIG5leHQgZmV3IGxpbmVzIG1heSByYWlzZSBJT0Vycm9yCisgICAgICAgICAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLl9maWxlbmFtZSwgc2VsZi5fYmFja3VwZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUgPSBvcGVuKHNlbGYuX2JhY2t1cGZpbGVuYW1lLCBzZWxmLl9tb2RlKQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBwZXJtID0gb3MuZnN0YXQoc2VsZi5fZmlsZS5maWxlbm8oKSkuc3RfbW9kZQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCA9IG9wZW4oc2VsZi5fZmlsZW5hbWUsICJ3IikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkID0gb3Mub3BlbihzZWxmLl9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX0NSRUFUIHwgb3MuT19XUk9OTFkgfCBvcy5PX1RSVU5DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm0pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9vdXRwdXQgPSBvcy5mZG9wZW4oZmQsICJ3IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAnY2htb2QnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2htb2Qoc2VsZi5fZmlsZW5hbWUsIHBlcm0pCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NhdmVzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLl9vdXRwdXQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIFRoaXMgbWF5IHJhaXNlIElPRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fb3Blbmhvb2s6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9maWxlID0gc2VsZi5fb3Blbmhvb2soc2VsZi5fZmlsZW5hbWUsIHNlbGYuX21vZGUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9maWxlID0gb3BlbihzZWxmLl9maWxlbmFtZSwgc2VsZi5fbW9kZSkKKyAgICAgICAgc2VsZi5fYnVmZmVyID0gc2VsZi5fZmlsZS5yZWFkbGluZXMoc2VsZi5fYnVmc2l6ZSkKKyAgICAgICAgc2VsZi5fYnVmaW5kZXggPSAwCisgICAgICAgIGlmIG5vdCBzZWxmLl9idWZmZXI6CisgICAgICAgICAgICBzZWxmLm5leHRmaWxlKCkKKyAgICAgICAgIyBSZWN1cnNpdmUgY2FsbAorICAgICAgICByZXR1cm4gc2VsZi5yZWFkbGluZSgpCisKKyAgICBkZWYgZmlsZW5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlbmFtZQorCisgICAgZGVmIGxpbmVubyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xpbmVubworCisgICAgZGVmIGZpbGVsaW5lbm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlbGluZW5vCisKKyAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9maWxlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9maWxlLmZpbGVubygpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAtMQorCisgICAgZGVmIGlzZmlyc3RsaW5lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZWxpbmVubyA9PSAxCisKKyAgICBkZWYgaXNzdGRpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2lzc3RkaW4KKworCitkZWYgaG9va19jb21wcmVzc2VkKGZpbGVuYW1lLCBtb2RlKToKKyAgICBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKVsxXQorICAgIGlmIGV4dCA9PSAnLmd6JzoKKyAgICAgICAgaW1wb3J0IGd6aXAKKyAgICAgICAgcmV0dXJuIGd6aXAub3BlbihmaWxlbmFtZSwgbW9kZSkKKyAgICBlbGlmIGV4dCA9PSAnLmJ6Mic6CisgICAgICAgIGltcG9ydCBiejIKKyAgICAgICAgcmV0dXJuIGJ6Mi5CWjJGaWxlKGZpbGVuYW1lLCBtb2RlKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBvcGVuKGZpbGVuYW1lLCBtb2RlKQorCisKK2RlZiBob29rX2VuY29kZWQoZW5jb2RpbmcpOgorICAgIGltcG9ydCBjb2RlY3MKKyAgICBkZWYgb3Blbmhvb2soZmlsZW5hbWUsIG1vZGUpOgorICAgICAgICByZXR1cm4gY29kZWNzLm9wZW4oZmlsZW5hbWUsIG1vZGUsIGVuY29kaW5nKQorICAgIHJldHVybiBvcGVuaG9vaworCisKK2RlZiBfdGVzdCgpOgorICAgIGltcG9ydCBnZXRvcHQKKyAgICBpbnBsYWNlID0gMAorICAgIGJhY2t1cCA9IDAKKyAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJpYjoiKQorICAgIGZvciBvLCBhIGluIG9wdHM6CisgICAgICAgIGlmIG8gPT0gJy1pJzogaW5wbGFjZSA9IDEKKyAgICAgICAgaWYgbyA9PSAnLWInOiBiYWNrdXAgPSBhCisgICAgZm9yIGxpbmUgaW4gaW5wdXQoYXJncywgaW5wbGFjZT1pbnBsYWNlLCBiYWNrdXA9YmFja3VwKToKKyAgICAgICAgaWYgbGluZVstMTpdID09ICdcbic6IGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgaWYgbGluZVstMTpdID09ICdccic6IGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgcHJpbnQgIiVkOiAlc1slZF0lcyAlcyIgJSAobGluZW5vKCksIGZpbGVuYW1lKCksIGZpbGVsaW5lbm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNmaXJzdGxpbmUoKSBhbmQgIioiIG9yICIiLCBsaW5lKQorICAgIHByaW50ICIlZDogJXNbJWRdIiAlIChsaW5lbm8oKSwgZmlsZW5hbWUoKSwgZmlsZWxpbmVubygpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZmlsZWlucHV0LnB5YyBiL2xpYi9weXRob24yLjcvZmlsZWlucHV0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU4MDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9maWxlaW5wdXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZmlsZWlucHV0LnB5byBiL2xpYi9weXRob24yLjcvZmlsZWlucHV0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU4MDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9maWxlaW5wdXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZm5tYXRjaC5weSBiL2xpYi9weXRob24yLjcvZm5tYXRjaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmU5OWI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mbm1hdGNoLnB5CkBAIC0wLDAgKzEsMTE2IEBACisiIiJGaWxlbmFtZSBtYXRjaGluZyB3aXRoIHNoZWxsIHBhdHRlcm5zLgorCitmbm1hdGNoKEZJTEVOQU1FLCBQQVRURVJOKSBtYXRjaGVzIGFjY29yZGluZyB0byB0aGUgbG9jYWwgY29udmVudGlvbi4KK2ZubWF0Y2hjYXNlKEZJTEVOQU1FLCBQQVRURVJOKSBhbHdheXMgdGFrZXMgY2FzZSBpbiBhY2NvdW50LgorCitUaGUgZnVuY3Rpb25zIG9wZXJhdGUgYnkgdHJhbnNsYXRpbmcgdGhlIHBhdHRlcm4gaW50byBhIHJlZ3VsYXIKK2V4cHJlc3Npb24uICBUaGV5IGNhY2hlIHRoZSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb25zIGZvciBzcGVlZC4KKworVGhlIGZ1bmN0aW9uIHRyYW5zbGF0ZShQQVRURVJOKSByZXR1cm5zIGEgcmVndWxhciBleHByZXNzaW9uCitjb3JyZXNwb25kaW5nIHRvIFBBVFRFUk4uICAoSXQgZG9lcyBub3QgY29tcGlsZSBpdC4pCisiIiIKKworaW1wb3J0IHJlCisKK19fYWxsX18gPSBbImZpbHRlciIsICJmbm1hdGNoIiwgImZubWF0Y2hjYXNlIiwgInRyYW5zbGF0ZSJdCisKK19jYWNoZSA9IHt9CitfTUFYQ0FDSEUgPSAxMDAKKworZGVmIF9wdXJnZSgpOgorICAgICIiIkNsZWFyIHRoZSBwYXR0ZXJuIGNhY2hlIiIiCisgICAgX2NhY2hlLmNsZWFyKCkKKworZGVmIGZubWF0Y2gobmFtZSwgcGF0KToKKyAgICAiIiJUZXN0IHdoZXRoZXIgRklMRU5BTUUgbWF0Y2hlcyBQQVRURVJOLgorCisgICAgUGF0dGVybnMgYXJlIFVuaXggc2hlbGwgc3R5bGU6CisKKyAgICAqICAgICAgIG1hdGNoZXMgZXZlcnl0aGluZworICAgID8gICAgICAgbWF0Y2hlcyBhbnkgc2luZ2xlIGNoYXJhY3RlcgorICAgIFtzZXFdICAgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGluIHNlcQorICAgIFshc2VxXSAgbWF0Y2hlcyBhbnkgY2hhciBub3QgaW4gc2VxCisKKyAgICBBbiBpbml0aWFsIHBlcmlvZCBpbiBGSUxFTkFNRSBpcyBub3Qgc3BlY2lhbC4KKyAgICBCb3RoIEZJTEVOQU1FIGFuZCBQQVRURVJOIGFyZSBmaXJzdCBjYXNlLW5vcm1hbGl6ZWQKKyAgICBpZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSByZXF1aXJlcyBpdC4KKyAgICBJZiB5b3UgZG9uJ3Qgd2FudCB0aGlzLCB1c2UgZm5tYXRjaGNhc2UoRklMRU5BTUUsIFBBVFRFUk4pLgorICAgICIiIgorCisgICAgaW1wb3J0IG9zCisgICAgbmFtZSA9IG9zLnBhdGgubm9ybWNhc2UobmFtZSkKKyAgICBwYXQgPSBvcy5wYXRoLm5vcm1jYXNlKHBhdCkKKyAgICByZXR1cm4gZm5tYXRjaGNhc2UobmFtZSwgcGF0KQorCitkZWYgZmlsdGVyKG5hbWVzLCBwYXQpOgorICAgICIiIlJldHVybiB0aGUgc3Vic2V0IG9mIHRoZSBsaXN0IE5BTUVTIHRoYXQgbWF0Y2ggUEFUIiIiCisgICAgaW1wb3J0IG9zLHBvc2l4cGF0aAorICAgIHJlc3VsdD1bXQorICAgIHBhdD1vcy5wYXRoLm5vcm1jYXNlKHBhdCkKKyAgICBpZiBub3QgcGF0IGluIF9jYWNoZToKKyAgICAgICAgcmVzID0gdHJhbnNsYXRlKHBhdCkKKyAgICAgICAgaWYgbGVuKF9jYWNoZSkgPj0gX01BWENBQ0hFOgorICAgICAgICAgICAgX2NhY2hlLmNsZWFyKCkKKyAgICAgICAgX2NhY2hlW3BhdF0gPSByZS5jb21waWxlKHJlcykKKyAgICBtYXRjaD1fY2FjaGVbcGF0XS5tYXRjaAorICAgIGlmIG9zLnBhdGggaXMgcG9zaXhwYXRoOgorICAgICAgICAjIG5vcm1jYXNlIG9uIHBvc2l4IGlzIE5PUC4gT3B0aW1pemUgaXQgYXdheSBmcm9tIHRoZSBsb29wLgorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGlmIG1hdGNoKG5hbWUpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobmFtZSkKKyAgICBlbHNlOgorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGlmIG1hdGNoKG9zLnBhdGgubm9ybWNhc2UobmFtZSkpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobmFtZSkKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBmbm1hdGNoY2FzZShuYW1lLCBwYXQpOgorICAgICIiIlRlc3Qgd2hldGhlciBGSUxFTkFNRSBtYXRjaGVzIFBBVFRFUk4sIGluY2x1ZGluZyBjYXNlLgorCisgICAgVGhpcyBpcyBhIHZlcnNpb24gb2YgZm5tYXRjaCgpIHdoaWNoIGRvZXNuJ3QgY2FzZS1ub3JtYWxpemUKKyAgICBpdHMgYXJndW1lbnRzLgorICAgICIiIgorCisgICAgaWYgbm90IHBhdCBpbiBfY2FjaGU6CisgICAgICAgIHJlcyA9IHRyYW5zbGF0ZShwYXQpCisgICAgICAgIGlmIGxlbihfY2FjaGUpID49IF9NQVhDQUNIRToKKyAgICAgICAgICAgIF9jYWNoZS5jbGVhcigpCisgICAgICAgIF9jYWNoZVtwYXRdID0gcmUuY29tcGlsZShyZXMpCisgICAgcmV0dXJuIF9jYWNoZVtwYXRdLm1hdGNoKG5hbWUpIGlzIG5vdCBOb25lCisKK2RlZiB0cmFuc2xhdGUocGF0KToKKyAgICAiIiJUcmFuc2xhdGUgYSBzaGVsbCBQQVRURVJOIHRvIGEgcmVndWxhciBleHByZXNzaW9uLgorCisgICAgVGhlcmUgaXMgbm8gd2F5IHRvIHF1b3RlIG1ldGEtY2hhcmFjdGVycy4KKyAgICAiIiIKKworICAgIGksIG4gPSAwLCBsZW4ocGF0KQorICAgIHJlcyA9ICcnCisgICAgd2hpbGUgaSA8IG46CisgICAgICAgIGMgPSBwYXRbaV0KKyAgICAgICAgaSA9IGkrMQorICAgICAgICBpZiBjID09ICcqJzoKKyAgICAgICAgICAgIHJlcyA9IHJlcyArICcuKicKKyAgICAgICAgZWxpZiBjID09ICc/JzoKKyAgICAgICAgICAgIHJlcyA9IHJlcyArICcuJworICAgICAgICBlbGlmIGMgPT0gJ1snOgorICAgICAgICAgICAgaiA9IGkKKyAgICAgICAgICAgIGlmIGogPCBuIGFuZCBwYXRbal0gPT0gJyEnOgorICAgICAgICAgICAgICAgIGogPSBqKzEKKyAgICAgICAgICAgIGlmIGogPCBuIGFuZCBwYXRbal0gPT0gJ10nOgorICAgICAgICAgICAgICAgIGogPSBqKzEKKyAgICAgICAgICAgIHdoaWxlIGogPCBuIGFuZCBwYXRbal0gIT0gJ10nOgorICAgICAgICAgICAgICAgIGogPSBqKzEKKyAgICAgICAgICAgIGlmIGogPj0gbjoKKyAgICAgICAgICAgICAgICByZXMgPSByZXMgKyAnXFxbJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdHVmZiA9IHBhdFtpOmpdLnJlcGxhY2UoJ1xcJywnXFxcXCcpCisgICAgICAgICAgICAgICAgaSA9IGorMQorICAgICAgICAgICAgICAgIGlmIHN0dWZmWzBdID09ICchJzoKKyAgICAgICAgICAgICAgICAgICAgc3R1ZmYgPSAnXicgKyBzdHVmZlsxOl0KKyAgICAgICAgICAgICAgICBlbGlmIHN0dWZmWzBdID09ICdeJzoKKyAgICAgICAgICAgICAgICAgICAgc3R1ZmYgPSAnXFwnICsgc3R1ZmYKKyAgICAgICAgICAgICAgICByZXMgPSAnJXNbJXNdJyAlIChyZXMsIHN0dWZmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzID0gcmVzICsgcmUuZXNjYXBlKGMpCisgICAgcmV0dXJuIHJlcyArICdcWig/bXMpJwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mbm1hdGNoLnB5YyBiL2xpYi9weXRob24yLjcvZm5tYXRjaC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5ZDI0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZm5tYXRjaC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mbm1hdGNoLnB5byBiL2xpYi9weXRob24yLjcvZm5tYXRjaC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5ZDI0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZm5tYXRjaC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mb3JtYXR0ZXIucHkgYi9saWIvcHl0aG9uMi43L2Zvcm1hdHRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE4ZmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mb3JtYXR0ZXIucHkKQEAgLTAsMCArMSw0NDUgQEAKKyIiIkdlbmVyaWMgb3V0cHV0IGZvcm1hdHRpbmcuCisKK0Zvcm1hdHRlciBvYmplY3RzIHRyYW5zZm9ybSBhbiBhYnN0cmFjdCBmbG93IG9mIGZvcm1hdHRpbmcgZXZlbnRzIGludG8KK3NwZWNpZmljIG91dHB1dCBldmVudHMgb24gd3JpdGVyIG9iamVjdHMuIEZvcm1hdHRlcnMgbWFuYWdlIHNldmVyYWwgc3RhY2sKK3N0cnVjdHVyZXMgdG8gYWxsb3cgdmFyaW91cyBwcm9wZXJ0aWVzIG9mIGEgd3JpdGVyIG9iamVjdCB0byBiZSBjaGFuZ2VkIGFuZAorcmVzdG9yZWQ7IHdyaXRlcnMgbmVlZCBub3QgYmUgYWJsZSB0byBoYW5kbGUgcmVsYXRpdmUgY2hhbmdlcyBub3IgYW55IHNvcnQKK29mIGBgY2hhbmdlIGJhY2snJyBvcGVyYXRpb24uIFNwZWNpZmljIHdyaXRlciBwcm9wZXJ0aWVzIHdoaWNoIG1heSBiZQorY29udHJvbGxlZCB2aWEgZm9ybWF0dGVyIG9iamVjdHMgYXJlIGhvcml6b250YWwgYWxpZ25tZW50LCBmb250LCBhbmQgbGVmdAorbWFyZ2luIGluZGVudGF0aW9ucy4gQSBtZWNoYW5pc20gaXMgcHJvdmlkZWQgd2hpY2ggc3VwcG9ydHMgcHJvdmlkaW5nCithcmJpdHJhcnksIG5vbi1leGNsdXNpdmUgc3R5bGUgc2V0dGluZ3MgdG8gYSB3cml0ZXIgYXMgd2VsbC4gQWRkaXRpb25hbAoraW50ZXJmYWNlcyBmYWNpbGl0YXRlIGZvcm1hdHRpbmcgZXZlbnRzIHdoaWNoIGFyZSBub3QgcmV2ZXJzaWJsZSwgc3VjaCBhcworcGFyYWdyYXBoIHNlcGFyYXRpb24uCisKK1dyaXRlciBvYmplY3RzIGVuY2Fwc3VsYXRlIGRldmljZSBpbnRlcmZhY2VzLiBBYnN0cmFjdCBkZXZpY2VzLCBzdWNoIGFzCitmaWxlIGZvcm1hdHMsIGFyZSBzdXBwb3J0ZWQgYXMgd2VsbCBhcyBwaHlzaWNhbCBkZXZpY2VzLiBUaGUgcHJvdmlkZWQKK2ltcGxlbWVudGF0aW9ucyBhbGwgd29yayB3aXRoIGFic3RyYWN0IGRldmljZXMuIFRoZSBpbnRlcmZhY2UgbWFrZXMKK2F2YWlsYWJsZSBtZWNoYW5pc21zIGZvciBzZXR0aW5nIHRoZSBwcm9wZXJ0aWVzIHdoaWNoIGZvcm1hdHRlciBvYmplY3RzCittYW5hZ2UgYW5kIGluc2VydGluZyBkYXRhIGludG8gdGhlIG91dHB1dC4KKyIiIgorCitpbXBvcnQgc3lzCisKKworQVNfSVMgPSBOb25lCisKKworY2xhc3MgTnVsbEZvcm1hdHRlcjoKKyAgICAiIiJBIGZvcm1hdHRlciB3aGljaCBkb2VzIG5vdGhpbmcuCisKKyAgICBJZiB0aGUgd3JpdGVyIHBhcmFtZXRlciBpcyBvbWl0dGVkLCBhIE51bGxXcml0ZXIgaW5zdGFuY2UgaXMgY3JlYXRlZC4KKyAgICBObyBtZXRob2RzIG9mIHRoZSB3cml0ZXIgYXJlIGNhbGxlZCBieSBOdWxsRm9ybWF0dGVyIGluc3RhbmNlcy4KKworICAgIEltcGxlbWVudGF0aW9ucyBzaG91bGQgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MgaWYgaW1wbGVtZW50aW5nIGEgd3JpdGVyCisgICAgaW50ZXJmYWNlIGJ1dCBkb24ndCBuZWVkIHRvIGluaGVyaXQgYW55IGltcGxlbWVudGF0aW9uLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd3JpdGVyPU5vbmUpOgorICAgICAgICBpZiB3cml0ZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHdyaXRlciA9IE51bGxXcml0ZXIoKQorICAgICAgICBzZWxmLndyaXRlciA9IHdyaXRlcgorICAgIGRlZiBlbmRfcGFyYWdyYXBoKHNlbGYsIGJsYW5rbGluZSk6IHBhc3MKKyAgICBkZWYgYWRkX2xpbmVfYnJlYWsoc2VsZik6IHBhc3MKKyAgICBkZWYgYWRkX2hvcl9ydWxlKHNlbGYsICphcmdzLCAqKmt3KTogcGFzcworICAgIGRlZiBhZGRfbGFiZWxfZGF0YShzZWxmLCBmb3JtYXQsIGNvdW50ZXIsIGJsYW5rbGluZT1Ob25lKTogcGFzcworICAgIGRlZiBhZGRfZmxvd2luZ19kYXRhKHNlbGYsIGRhdGEpOiBwYXNzCisgICAgZGVmIGFkZF9saXRlcmFsX2RhdGEoc2VsZiwgZGF0YSk6IHBhc3MKKyAgICBkZWYgZmx1c2hfc29mdHNwYWNlKHNlbGYpOiBwYXNzCisgICAgZGVmIHB1c2hfYWxpZ25tZW50KHNlbGYsIGFsaWduKTogcGFzcworICAgIGRlZiBwb3BfYWxpZ25tZW50KHNlbGYpOiBwYXNzCisgICAgZGVmIHB1c2hfZm9udChzZWxmLCB4KTogcGFzcworICAgIGRlZiBwb3BfZm9udChzZWxmKTogcGFzcworICAgIGRlZiBwdXNoX21hcmdpbihzZWxmLCBtYXJnaW4pOiBwYXNzCisgICAgZGVmIHBvcF9tYXJnaW4oc2VsZik6IHBhc3MKKyAgICBkZWYgc2V0X3NwYWNpbmcoc2VsZiwgc3BhY2luZyk6IHBhc3MKKyAgICBkZWYgcHVzaF9zdHlsZShzZWxmLCAqc3R5bGVzKTogcGFzcworICAgIGRlZiBwb3Bfc3R5bGUoc2VsZiwgbj0xKTogcGFzcworICAgIGRlZiBhc3NlcnRfbGluZV9kYXRhKHNlbGYsIGZsYWc9MSk6IHBhc3MKKworCitjbGFzcyBBYnN0cmFjdEZvcm1hdHRlcjoKKyAgICAiIiJUaGUgc3RhbmRhcmQgZm9ybWF0dGVyLgorCisgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgZGVtb25zdHJhdGVkIHdpZGUgYXBwbGljYWJpbGl0eSB0byBtYW55IHdyaXRlcnMsCisgICAgYW5kIG1heSBiZSB1c2VkIGRpcmVjdGx5IGluIG1vc3QgY2lyY3Vtc3RhbmNlcy4gIEl0IGhhcyBiZWVuIHVzZWQgdG8KKyAgICBpbXBsZW1lbnQgYSBmdWxsLWZlYXR1cmVkIFdvcmxkIFdpZGUgV2ViIGJyb3dzZXIuCisKKyAgICAiIiIKKworICAgICMgIFNwYWNlIGhhbmRsaW5nIHBvbGljeTogIGJsYW5rIHNwYWNlcyBhdCB0aGUgYm91bmRhcnkgYmV0d2VlbiBlbGVtZW50cworICAgICMgIGFyZSBoYW5kbGVkIGJ5IHRoZSBvdXRlcm1vc3QgY29udGV4dC4gICJMaXRlcmFsIiBkYXRhIGlzIG5vdCBjaGVja2VkCisgICAgIyAgdG8gZGV0ZXJtaW5lIGNvbnRleHQsIHNvIHNwYWNlcyBpbiBsaXRlcmFsIGRhdGEgYXJlIGhhbmRsZWQgZGlyZWN0bHkKKyAgICAjICBpbiBhbGwgY2lyY3Vtc3RhbmNlcy4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cml0ZXIpOgorICAgICAgICBzZWxmLndyaXRlciA9IHdyaXRlciAgICAgICAgICAgICMgT3V0cHV0IGRldmljZQorICAgICAgICBzZWxmLmFsaWduID0gTm9uZSAgICAgICAgICAgICAgICMgQ3VycmVudCBhbGlnbm1lbnQKKyAgICAgICAgc2VsZi5hbGlnbl9zdGFjayA9IFtdICAgICAgICAgICAjIEFsaWdubWVudCBzdGFjaworICAgICAgICBzZWxmLmZvbnRfc3RhY2sgPSBbXSAgICAgICAgICAgICMgRm9udCBzdGF0ZQorICAgICAgICBzZWxmLm1hcmdpbl9zdGFjayA9IFtdICAgICAgICAgICMgTWFyZ2luIHN0YXRlCisgICAgICAgIHNlbGYuc3BhY2luZyA9IE5vbmUgICAgICAgICAgICAgIyBWZXJ0aWNhbCBzcGFjaW5nIHN0YXRlCisgICAgICAgIHNlbGYuc3R5bGVfc3RhY2sgPSBbXSAgICAgICAgICAgIyBPdGhlciBzdGF0ZSwgZS5nLiBjb2xvcgorICAgICAgICBzZWxmLm5vc3BhY2UgPSAxICAgICAgICAgICAgICAgICMgU2hvdWxkIGxlYWRpbmcgc3BhY2UgYmUgc3VwcHJlc3NlZAorICAgICAgICBzZWxmLnNvZnRzcGFjZSA9IDAgICAgICAgICAgICAgICMgU2hvdWxkIGEgc3BhY2UgYmUgaW5zZXJ0ZWQKKyAgICAgICAgc2VsZi5wYXJhX2VuZCA9IDEgICAgICAgICAgICAgICAjIEp1c3QgZW5kZWQgYSBwYXJhZ3JhcGgKKyAgICAgICAgc2VsZi5wYXJza2lwID0gMCAgICAgICAgICAgICAgICAjIFNraXBwZWQgc3BhY2UgYmV0d2VlbiBwYXJhZ3JhcGhzPworICAgICAgICBzZWxmLmhhcmRfYnJlYWsgPSAxICAgICAgICAgICAgICMgSGF2ZSBhIGhhcmQgYnJlYWsKKyAgICAgICAgc2VsZi5oYXZlX2xhYmVsID0gMAorCisgICAgZGVmIGVuZF9wYXJhZ3JhcGgoc2VsZiwgYmxhbmtsaW5lKToKKyAgICAgICAgaWYgbm90IHNlbGYuaGFyZF9icmVhazoKKyAgICAgICAgICAgIHNlbGYud3JpdGVyLnNlbmRfbGluZV9icmVhaygpCisgICAgICAgICAgICBzZWxmLmhhdmVfbGFiZWwgPSAwCisgICAgICAgIGlmIHNlbGYucGFyc2tpcCA8IGJsYW5rbGluZSBhbmQgbm90IHNlbGYuaGF2ZV9sYWJlbDoKKyAgICAgICAgICAgIHNlbGYud3JpdGVyLnNlbmRfcGFyYWdyYXBoKGJsYW5rbGluZSAtIHNlbGYucGFyc2tpcCkKKyAgICAgICAgICAgIHNlbGYucGFyc2tpcCA9IGJsYW5rbGluZQorICAgICAgICAgICAgc2VsZi5oYXZlX2xhYmVsID0gMAorICAgICAgICBzZWxmLmhhcmRfYnJlYWsgPSBzZWxmLm5vc3BhY2UgPSBzZWxmLnBhcmFfZW5kID0gMQorICAgICAgICBzZWxmLnNvZnRzcGFjZSA9IDAKKworICAgIGRlZiBhZGRfbGluZV9icmVhayhzZWxmKToKKyAgICAgICAgaWYgbm90IChzZWxmLmhhcmRfYnJlYWsgb3Igc2VsZi5wYXJhX2VuZCk6CisgICAgICAgICAgICBzZWxmLndyaXRlci5zZW5kX2xpbmVfYnJlYWsoKQorICAgICAgICAgICAgc2VsZi5oYXZlX2xhYmVsID0gc2VsZi5wYXJza2lwID0gMAorICAgICAgICBzZWxmLmhhcmRfYnJlYWsgPSBzZWxmLm5vc3BhY2UgPSAxCisgICAgICAgIHNlbGYuc29mdHNwYWNlID0gMAorCisgICAgZGVmIGFkZF9ob3JfcnVsZShzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgIGlmIG5vdCBzZWxmLmhhcmRfYnJlYWs6CisgICAgICAgICAgICBzZWxmLndyaXRlci5zZW5kX2xpbmVfYnJlYWsoKQorICAgICAgICBzZWxmLndyaXRlci5zZW5kX2hvcl9ydWxlKCphcmdzLCAqKmt3KQorICAgICAgICBzZWxmLmhhcmRfYnJlYWsgPSBzZWxmLm5vc3BhY2UgPSAxCisgICAgICAgIHNlbGYuaGF2ZV9sYWJlbCA9IHNlbGYucGFyYV9lbmQgPSBzZWxmLnNvZnRzcGFjZSA9IHNlbGYucGFyc2tpcCA9IDAKKworICAgIGRlZiBhZGRfbGFiZWxfZGF0YShzZWxmLCBmb3JtYXQsIGNvdW50ZXIsIGJsYW5rbGluZSA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLmhhdmVfbGFiZWwgb3Igbm90IHNlbGYuaGFyZF9icmVhazoKKyAgICAgICAgICAgIHNlbGYud3JpdGVyLnNlbmRfbGluZV9icmVhaygpCisgICAgICAgIGlmIG5vdCBzZWxmLnBhcmFfZW5kOgorICAgICAgICAgICAgc2VsZi53cml0ZXIuc2VuZF9wYXJhZ3JhcGgoKGJsYW5rbGluZSBhbmQgMSkgb3IgMCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmb3JtYXQsIHN0cik6CisgICAgICAgICAgICBzZWxmLndyaXRlci5zZW5kX2xhYmVsX2RhdGEoc2VsZi5mb3JtYXRfY291bnRlcihmb3JtYXQsIGNvdW50ZXIpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZXIuc2VuZF9sYWJlbF9kYXRhKGZvcm1hdCkKKyAgICAgICAgc2VsZi5ub3NwYWNlID0gc2VsZi5oYXZlX2xhYmVsID0gc2VsZi5oYXJkX2JyZWFrID0gc2VsZi5wYXJhX2VuZCA9IDEKKyAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSBzZWxmLnBhcnNraXAgPSAwCisKKyAgICBkZWYgZm9ybWF0X2NvdW50ZXIoc2VsZiwgZm9ybWF0LCBjb3VudGVyKToKKyAgICAgICAgbGFiZWwgPSAnJworICAgICAgICBmb3IgYyBpbiBmb3JtYXQ6CisgICAgICAgICAgICBpZiBjID09ICcxJzoKKyAgICAgICAgICAgICAgICBsYWJlbCA9IGxhYmVsICsgKCclZCcgJSBjb3VudGVyKQorICAgICAgICAgICAgZWxpZiBjIGluICdhQSc6CisgICAgICAgICAgICAgICAgaWYgY291bnRlciA+IDA6CisgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwgKyBzZWxmLmZvcm1hdF9sZXR0ZXIoYywgY291bnRlcikKKyAgICAgICAgICAgIGVsaWYgYyBpbiAnaUknOgorICAgICAgICAgICAgICAgIGlmIGNvdW50ZXIgPiAwOgorICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGxhYmVsICsgc2VsZi5mb3JtYXRfcm9tYW4oYywgY291bnRlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbCArIGMKKyAgICAgICAgcmV0dXJuIGxhYmVsCisKKyAgICBkZWYgZm9ybWF0X2xldHRlcihzZWxmLCBjYXNlLCBjb3VudGVyKToKKyAgICAgICAgbGFiZWwgPSAnJworICAgICAgICB3aGlsZSBjb3VudGVyID4gMDoKKyAgICAgICAgICAgIGNvdW50ZXIsIHggPSBkaXZtb2QoY291bnRlci0xLCAyNikKKyAgICAgICAgICAgICMgVGhpcyBtYWtlcyBhIHN0cm9uZyBhc3N1bXB0aW9uIHRoYXQgbG93ZXJjYXNlIGxldHRlcnMKKyAgICAgICAgICAgICMgYW5kIHVwcGVyY2FzZSBsZXR0ZXJzIGZvcm0gdHdvIGNvbnRpZ3VvdXMgYmxvY2tzLCB3aXRoCisgICAgICAgICAgICAjIGxldHRlcnMgaW4gb3JkZXIhCisgICAgICAgICAgICBzID0gY2hyKG9yZChjYXNlKSArIHgpCisgICAgICAgICAgICBsYWJlbCA9IHMgKyBsYWJlbAorICAgICAgICByZXR1cm4gbGFiZWwKKworICAgIGRlZiBmb3JtYXRfcm9tYW4oc2VsZiwgY2FzZSwgY291bnRlcik6CisgICAgICAgIG9uZXMgPSBbJ2knLCAneCcsICdjJywgJ20nXQorICAgICAgICBmaXZlcyA9IFsndicsICdsJywgJ2QnXQorICAgICAgICBsYWJlbCwgaW5kZXggPSAnJywgMAorICAgICAgICAjIFRoaXMgd2lsbCBkaWUgb2YgSW5kZXhFcnJvciB3aGVuIGNvdW50ZXIgaXMgdG9vIGJpZworICAgICAgICB3aGlsZSBjb3VudGVyID4gMDoKKyAgICAgICAgICAgIGNvdW50ZXIsIHggPSBkaXZtb2QoY291bnRlciwgMTApCisgICAgICAgICAgICBpZiB4ID09IDk6CisgICAgICAgICAgICAgICAgbGFiZWwgPSBvbmVzW2luZGV4XSArIG9uZXNbaW5kZXgrMV0gKyBsYWJlbAorICAgICAgICAgICAgZWxpZiB4ID09IDQ6CisgICAgICAgICAgICAgICAgbGFiZWwgPSBvbmVzW2luZGV4XSArIGZpdmVzW2luZGV4XSArIGxhYmVsCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHggPj0gNToKKyAgICAgICAgICAgICAgICAgICAgcyA9IGZpdmVzW2luZGV4XQorICAgICAgICAgICAgICAgICAgICB4ID0geC01CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcyA9ICcnCisgICAgICAgICAgICAgICAgcyA9IHMgKyBvbmVzW2luZGV4XSp4CisgICAgICAgICAgICAgICAgbGFiZWwgPSBzICsgbGFiZWwKKyAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCisgICAgICAgIGlmIGNhc2UgPT0gJ0knOgorICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnVwcGVyKCkKKyAgICAgICAgcmV0dXJuIGxhYmVsCisKKyAgICBkZWYgYWRkX2Zsb3dpbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgbm90IGRhdGE6IHJldHVybgorICAgICAgICBwcmVzcGFjZSA9IGRhdGFbOjFdLmlzc3BhY2UoKQorICAgICAgICBwb3N0c3BhY2UgPSBkYXRhWy0xOl0uaXNzcGFjZSgpCisgICAgICAgIGRhdGEgPSAiICIuam9pbihkYXRhLnNwbGl0KCkpCisgICAgICAgIGlmIHNlbGYubm9zcGFjZSBhbmQgbm90IGRhdGE6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiBwcmVzcGFjZSBvciBzZWxmLnNvZnRzcGFjZToKKyAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLm5vc3BhY2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc29mdHNwYWNlID0gMQorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcnNraXAgPSAwCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5ub3NwYWNlOgorICAgICAgICAgICAgICAgIGRhdGEgPSAnICcgKyBkYXRhCisgICAgICAgIHNlbGYuaGFyZF9icmVhayA9IHNlbGYubm9zcGFjZSA9IHNlbGYucGFyYV9lbmQgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2tpcCA9IHNlbGYuaGF2ZV9sYWJlbCA9IDAKKyAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSBwb3N0c3BhY2UKKyAgICAgICAgc2VsZi53cml0ZXIuc2VuZF9mbG93aW5nX2RhdGEoZGF0YSkKKworICAgIGRlZiBhZGRfbGl0ZXJhbF9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBub3QgZGF0YTogcmV0dXJuCisgICAgICAgIGlmIHNlbGYuc29mdHNwYWNlOgorICAgICAgICAgICAgc2VsZi53cml0ZXIuc2VuZF9mbG93aW5nX2RhdGEoIiAiKQorICAgICAgICBzZWxmLmhhcmRfYnJlYWsgPSBkYXRhWy0xOl0gPT0gJ1xuJworICAgICAgICBzZWxmLm5vc3BhY2UgPSBzZWxmLnBhcmFfZW5kID0gc2VsZi5zb2Z0c3BhY2UgPSBcCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2tpcCA9IHNlbGYuaGF2ZV9sYWJlbCA9IDAKKyAgICAgICAgc2VsZi53cml0ZXIuc2VuZF9saXRlcmFsX2RhdGEoZGF0YSkKKworICAgIGRlZiBmbHVzaF9zb2Z0c3BhY2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc29mdHNwYWNlOgorICAgICAgICAgICAgc2VsZi5oYXJkX2JyZWFrID0gc2VsZi5wYXJhX2VuZCA9IHNlbGYucGFyc2tpcCA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGF2ZV9sYWJlbCA9IHNlbGYuc29mdHNwYWNlID0gMAorICAgICAgICAgICAgc2VsZi5ub3NwYWNlID0gMQorICAgICAgICAgICAgc2VsZi53cml0ZXIuc2VuZF9mbG93aW5nX2RhdGEoJyAnKQorCisgICAgZGVmIHB1c2hfYWxpZ25tZW50KHNlbGYsIGFsaWduKToKKyAgICAgICAgaWYgYWxpZ24gYW5kIGFsaWduICE9IHNlbGYuYWxpZ246CisgICAgICAgICAgICBzZWxmLndyaXRlci5uZXdfYWxpZ25tZW50KGFsaWduKQorICAgICAgICAgICAgc2VsZi5hbGlnbiA9IGFsaWduCisgICAgICAgICAgICBzZWxmLmFsaWduX3N0YWNrLmFwcGVuZChhbGlnbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYWxpZ25fc3RhY2suYXBwZW5kKHNlbGYuYWxpZ24pCisKKyAgICBkZWYgcG9wX2FsaWdubWVudChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5hbGlnbl9zdGFjazoKKyAgICAgICAgICAgIGRlbCBzZWxmLmFsaWduX3N0YWNrWy0xXQorICAgICAgICBpZiBzZWxmLmFsaWduX3N0YWNrOgorICAgICAgICAgICAgc2VsZi5hbGlnbiA9IGFsaWduID0gc2VsZi5hbGlnbl9zdGFja1stMV0KKyAgICAgICAgICAgIHNlbGYud3JpdGVyLm5ld19hbGlnbm1lbnQoYWxpZ24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFsaWduID0gTm9uZQorICAgICAgICAgICAgc2VsZi53cml0ZXIubmV3X2FsaWdubWVudChOb25lKQorCisgICAgZGVmIHB1c2hfZm9udChzZWxmLCBmb250KToKKyAgICAgICAgc2l6ZSwgaSwgYiwgdHQgPSBmb250CisgICAgICAgIGlmIHNlbGYuc29mdHNwYWNlOgorICAgICAgICAgICAgc2VsZi5oYXJkX2JyZWFrID0gc2VsZi5wYXJhX2VuZCA9IHNlbGYuc29mdHNwYWNlID0gMAorICAgICAgICAgICAgc2VsZi5ub3NwYWNlID0gMQorICAgICAgICAgICAgc2VsZi53cml0ZXIuc2VuZF9mbG93aW5nX2RhdGEoJyAnKQorICAgICAgICBpZiBzZWxmLmZvbnRfc3RhY2s6CisgICAgICAgICAgICBjc2l6ZSwgY2ksIGNiLCBjdHQgPSBzZWxmLmZvbnRfc3RhY2tbLTFdCisgICAgICAgICAgICBpZiBzaXplIGlzIEFTX0lTOiBzaXplID0gY3NpemUKKyAgICAgICAgICAgIGlmIGkgaXMgQVNfSVM6IGkgPSBjaQorICAgICAgICAgICAgaWYgYiBpcyBBU19JUzogYiA9IGNiCisgICAgICAgICAgICBpZiB0dCBpcyBBU19JUzogdHQgPSBjdHQKKyAgICAgICAgZm9udCA9IChzaXplLCBpLCBiLCB0dCkKKyAgICAgICAgc2VsZi5mb250X3N0YWNrLmFwcGVuZChmb250KQorICAgICAgICBzZWxmLndyaXRlci5uZXdfZm9udChmb250KQorCisgICAgZGVmIHBvcF9mb250KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZvbnRfc3RhY2s6CisgICAgICAgICAgICBkZWwgc2VsZi5mb250X3N0YWNrWy0xXQorICAgICAgICBpZiBzZWxmLmZvbnRfc3RhY2s6CisgICAgICAgICAgICBmb250ID0gc2VsZi5mb250X3N0YWNrWy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9udCA9IE5vbmUKKyAgICAgICAgc2VsZi53cml0ZXIubmV3X2ZvbnQoZm9udCkKKworICAgIGRlZiBwdXNoX21hcmdpbihzZWxmLCBtYXJnaW4pOgorICAgICAgICBzZWxmLm1hcmdpbl9zdGFjay5hcHBlbmQobWFyZ2luKQorICAgICAgICBmc3RhY2sgPSBmaWx0ZXIoTm9uZSwgc2VsZi5tYXJnaW5fc3RhY2spCisgICAgICAgIGlmIG5vdCBtYXJnaW4gYW5kIGZzdGFjazoKKyAgICAgICAgICAgIG1hcmdpbiA9IGZzdGFja1stMV0KKyAgICAgICAgc2VsZi53cml0ZXIubmV3X21hcmdpbihtYXJnaW4sIGxlbihmc3RhY2spKQorCisgICAgZGVmIHBvcF9tYXJnaW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYubWFyZ2luX3N0YWNrOgorICAgICAgICAgICAgZGVsIHNlbGYubWFyZ2luX3N0YWNrWy0xXQorICAgICAgICBmc3RhY2sgPSBmaWx0ZXIoTm9uZSwgc2VsZi5tYXJnaW5fc3RhY2spCisgICAgICAgIGlmIGZzdGFjazoKKyAgICAgICAgICAgIG1hcmdpbiA9IGZzdGFja1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hcmdpbiA9IE5vbmUKKyAgICAgICAgc2VsZi53cml0ZXIubmV3X21hcmdpbihtYXJnaW4sIGxlbihmc3RhY2spKQorCisgICAgZGVmIHNldF9zcGFjaW5nKHNlbGYsIHNwYWNpbmcpOgorICAgICAgICBzZWxmLnNwYWNpbmcgPSBzcGFjaW5nCisgICAgICAgIHNlbGYud3JpdGVyLm5ld19zcGFjaW5nKHNwYWNpbmcpCisKKyAgICBkZWYgcHVzaF9zdHlsZShzZWxmLCAqc3R5bGVzKToKKyAgICAgICAgaWYgc2VsZi5zb2Z0c3BhY2U6CisgICAgICAgICAgICBzZWxmLmhhcmRfYnJlYWsgPSBzZWxmLnBhcmFfZW5kID0gc2VsZi5zb2Z0c3BhY2UgPSAwCisgICAgICAgICAgICBzZWxmLm5vc3BhY2UgPSAxCisgICAgICAgICAgICBzZWxmLndyaXRlci5zZW5kX2Zsb3dpbmdfZGF0YSgnICcpCisgICAgICAgIGZvciBzdHlsZSBpbiBzdHlsZXM6CisgICAgICAgICAgICBzZWxmLnN0eWxlX3N0YWNrLmFwcGVuZChzdHlsZSkKKyAgICAgICAgc2VsZi53cml0ZXIubmV3X3N0eWxlcyh0dXBsZShzZWxmLnN0eWxlX3N0YWNrKSkKKworICAgIGRlZiBwb3Bfc3R5bGUoc2VsZiwgbj0xKToKKyAgICAgICAgZGVsIHNlbGYuc3R5bGVfc3RhY2tbLW46XQorICAgICAgICBzZWxmLndyaXRlci5uZXdfc3R5bGVzKHR1cGxlKHNlbGYuc3R5bGVfc3RhY2spKQorCisgICAgZGVmIGFzc2VydF9saW5lX2RhdGEoc2VsZiwgZmxhZz0xKToKKyAgICAgICAgc2VsZi5ub3NwYWNlID0gc2VsZi5oYXJkX2JyZWFrID0gbm90IGZsYWcKKyAgICAgICAgc2VsZi5wYXJhX2VuZCA9IHNlbGYucGFyc2tpcCA9IHNlbGYuaGF2ZV9sYWJlbCA9IDAKKworCitjbGFzcyBOdWxsV3JpdGVyOgorICAgICIiIk1pbmltYWwgd3JpdGVyIGludGVyZmFjZSB0byB1c2UgaW4gdGVzdGluZyAmIGluaGVyaXRhbmNlLgorCisgICAgQSB3cml0ZXIgd2hpY2ggb25seSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGRlZmluaXRpb247IG5vIGFjdGlvbnMgYXJlCisgICAgdGFrZW4gb24gYW55IG1ldGhvZHMuICBUaGlzIHNob3VsZCBiZSB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIHdyaXRlcnMKKyAgICB3aGljaCBkbyBub3QgbmVlZCB0byBpbmhlcml0IGFueSBpbXBsZW1lbnRhdGlvbiBtZXRob2RzLgorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBwYXNzCisgICAgZGVmIGZsdXNoKHNlbGYpOiBwYXNzCisgICAgZGVmIG5ld19hbGlnbm1lbnQoc2VsZiwgYWxpZ24pOiBwYXNzCisgICAgZGVmIG5ld19mb250KHNlbGYsIGZvbnQpOiBwYXNzCisgICAgZGVmIG5ld19tYXJnaW4oc2VsZiwgbWFyZ2luLCBsZXZlbCk6IHBhc3MKKyAgICBkZWYgbmV3X3NwYWNpbmcoc2VsZiwgc3BhY2luZyk6IHBhc3MKKyAgICBkZWYgbmV3X3N0eWxlcyhzZWxmLCBzdHlsZXMpOiBwYXNzCisgICAgZGVmIHNlbmRfcGFyYWdyYXBoKHNlbGYsIGJsYW5rbGluZSk6IHBhc3MKKyAgICBkZWYgc2VuZF9saW5lX2JyZWFrKHNlbGYpOiBwYXNzCisgICAgZGVmIHNlbmRfaG9yX3J1bGUoc2VsZiwgKmFyZ3MsICoqa3cpOiBwYXNzCisgICAgZGVmIHNlbmRfbGFiZWxfZGF0YShzZWxmLCBkYXRhKTogcGFzcworICAgIGRlZiBzZW5kX2Zsb3dpbmdfZGF0YShzZWxmLCBkYXRhKTogcGFzcworICAgIGRlZiBzZW5kX2xpdGVyYWxfZGF0YShzZWxmLCBkYXRhKTogcGFzcworCisKK2NsYXNzIEFic3RyYWN0V3JpdGVyKE51bGxXcml0ZXIpOgorICAgICIiIkEgd3JpdGVyIHdoaWNoIGNhbiBiZSB1c2VkIGluIGRlYnVnZ2luZyBmb3JtYXR0ZXJzLCBidXQgbm90IG11Y2ggZWxzZS4KKworICAgIEVhY2ggbWV0aG9kIHNpbXBseSBhbm5vdW5jZXMgaXRzZWxmIGJ5IHByaW50aW5nIGl0cyBuYW1lIGFuZAorICAgIGFyZ3VtZW50cyBvbiBzdGFuZGFyZCBvdXRwdXQuCisKKyAgICAiIiIKKworICAgIGRlZiBuZXdfYWxpZ25tZW50KHNlbGYsIGFsaWduKToKKyAgICAgICAgcHJpbnQgIm5ld19hbGlnbm1lbnQoJXIpIiAlIChhbGlnbiwpCisKKyAgICBkZWYgbmV3X2ZvbnQoc2VsZiwgZm9udCk6CisgICAgICAgIHByaW50ICJuZXdfZm9udCglcikiICUgKGZvbnQsKQorCisgICAgZGVmIG5ld19tYXJnaW4oc2VsZiwgbWFyZ2luLCBsZXZlbCk6CisgICAgICAgIHByaW50ICJuZXdfbWFyZ2luKCVyLCAlZCkiICUgKG1hcmdpbiwgbGV2ZWwpCisKKyAgICBkZWYgbmV3X3NwYWNpbmcoc2VsZiwgc3BhY2luZyk6CisgICAgICAgIHByaW50ICJuZXdfc3BhY2luZyglcikiICUgKHNwYWNpbmcsKQorCisgICAgZGVmIG5ld19zdHlsZXMoc2VsZiwgc3R5bGVzKToKKyAgICAgICAgcHJpbnQgIm5ld19zdHlsZXMoJXIpIiAlIChzdHlsZXMsKQorCisgICAgZGVmIHNlbmRfcGFyYWdyYXBoKHNlbGYsIGJsYW5rbGluZSk6CisgICAgICAgIHByaW50ICJzZW5kX3BhcmFncmFwaCglcikiICUgKGJsYW5rbGluZSwpCisKKyAgICBkZWYgc2VuZF9saW5lX2JyZWFrKHNlbGYpOgorICAgICAgICBwcmludCAic2VuZF9saW5lX2JyZWFrKCkiCisKKyAgICBkZWYgc2VuZF9ob3JfcnVsZShzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgIHByaW50ICJzZW5kX2hvcl9ydWxlKCkiCisKKyAgICBkZWYgc2VuZF9sYWJlbF9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBwcmludCAic2VuZF9sYWJlbF9kYXRhKCVyKSIgJSAoZGF0YSwpCisKKyAgICBkZWYgc2VuZF9mbG93aW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHByaW50ICJzZW5kX2Zsb3dpbmdfZGF0YSglcikiICUgKGRhdGEsKQorCisgICAgZGVmIHNlbmRfbGl0ZXJhbF9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBwcmludCAic2VuZF9saXRlcmFsX2RhdGEoJXIpIiAlIChkYXRhLCkKKworCitjbGFzcyBEdW1iV3JpdGVyKE51bGxXcml0ZXIpOgorICAgICIiIlNpbXBsZSB3cml0ZXIgY2xhc3Mgd2hpY2ggd3JpdGVzIG91dHB1dCBvbiB0aGUgZmlsZSBvYmplY3QgcGFzc2VkIGluCisgICAgYXMgdGhlIGZpbGUgcGFyYW1ldGVyIG9yLCBpZiBmaWxlIGlzIG9taXR0ZWQsIG9uIHN0YW5kYXJkIG91dHB1dC4gIFRoZQorICAgIG91dHB1dCBpcyBzaW1wbHkgd29yZC13cmFwcGVkIHRvIHRoZSBudW1iZXIgb2YgY29sdW1ucyBzcGVjaWZpZWQgYnkKKyAgICB0aGUgbWF4Y29sIHBhcmFtZXRlci4gIFRoaXMgY2xhc3MgaXMgc3VpdGFibGUgZm9yIHJlZmxvd2luZyBhIHNlcXVlbmNlCisgICAgb2YgcGFyYWdyYXBocy4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGU9Tm9uZSwgbWF4Y29sPTcyKToKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZSBvciBzeXMuc3Rkb3V0CisgICAgICAgIHNlbGYubWF4Y29sID0gbWF4Y29sCisgICAgICAgIE51bGxXcml0ZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5yZXNldCgpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuY29sID0gMAorICAgICAgICBzZWxmLmF0YnJlYWsgPSAwCisKKyAgICBkZWYgc2VuZF9wYXJhZ3JhcGgoc2VsZiwgYmxhbmtsaW5lKToKKyAgICAgICAgc2VsZi5maWxlLndyaXRlKCdcbicqYmxhbmtsaW5lKQorICAgICAgICBzZWxmLmNvbCA9IDAKKyAgICAgICAgc2VsZi5hdGJyZWFrID0gMAorCisgICAgZGVmIHNlbmRfbGluZV9icmVhayhzZWxmKToKKyAgICAgICAgc2VsZi5maWxlLndyaXRlKCdcbicpCisgICAgICAgIHNlbGYuY29sID0gMAorICAgICAgICBzZWxmLmF0YnJlYWsgPSAwCisKKyAgICBkZWYgc2VuZF9ob3JfcnVsZShzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgIHNlbGYuZmlsZS53cml0ZSgnXG4nKQorICAgICAgICBzZWxmLmZpbGUud3JpdGUoJy0nKnNlbGYubWF4Y29sKQorICAgICAgICBzZWxmLmZpbGUud3JpdGUoJ1xuJykKKyAgICAgICAgc2VsZi5jb2wgPSAwCisgICAgICAgIHNlbGYuYXRicmVhayA9IDAKKworICAgIGRlZiBzZW5kX2xpdGVyYWxfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5maWxlLndyaXRlKGRhdGEpCisgICAgICAgIGkgPSBkYXRhLnJmaW5kKCdcbicpCisgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgIHNlbGYuY29sID0gMAorICAgICAgICAgICAgZGF0YSA9IGRhdGFbaSsxOl0KKyAgICAgICAgZGF0YSA9IGRhdGEuZXhwYW5kdGFicygpCisgICAgICAgIHNlbGYuY29sID0gc2VsZi5jb2wgKyBsZW4oZGF0YSkKKyAgICAgICAgc2VsZi5hdGJyZWFrID0gMAorCisgICAgZGVmIHNlbmRfZmxvd2luZ19kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBub3QgZGF0YTogcmV0dXJuCisgICAgICAgIGF0YnJlYWsgPSBzZWxmLmF0YnJlYWsgb3IgZGF0YVswXS5pc3NwYWNlKCkKKyAgICAgICAgY29sID0gc2VsZi5jb2wKKyAgICAgICAgbWF4Y29sID0gc2VsZi5tYXhjb2wKKyAgICAgICAgd3JpdGUgPSBzZWxmLmZpbGUud3JpdGUKKyAgICAgICAgZm9yIHdvcmQgaW4gZGF0YS5zcGxpdCgpOgorICAgICAgICAgICAgaWYgYXRicmVhazoKKyAgICAgICAgICAgICAgICBpZiBjb2wgKyBsZW4od29yZCkgPj0gbWF4Y29sOgorICAgICAgICAgICAgICAgICAgICB3cml0ZSgnXG4nKQorICAgICAgICAgICAgICAgICAgICBjb2wgPSAwCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoJyAnKQorICAgICAgICAgICAgICAgICAgICBjb2wgPSBjb2wgKyAxCisgICAgICAgICAgICB3cml0ZSh3b3JkKQorICAgICAgICAgICAgY29sID0gY29sICsgbGVuKHdvcmQpCisgICAgICAgICAgICBhdGJyZWFrID0gMQorICAgICAgICBzZWxmLmNvbCA9IGNvbAorICAgICAgICBzZWxmLmF0YnJlYWsgPSBkYXRhWy0xXS5pc3NwYWNlKCkKKworCitkZWYgdGVzdChmaWxlID0gTm9uZSk6CisgICAgdyA9IER1bWJXcml0ZXIoKQorICAgIGYgPSBBYnN0cmFjdEZvcm1hdHRlcih3KQorICAgIGlmIGZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgIGZwID0gb3BlbihmaWxlKQorICAgIGVsaWYgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBmcCA9IG9wZW4oc3lzLmFyZ3ZbMV0pCisgICAgZWxzZToKKyAgICAgICAgZnAgPSBzeXMuc3RkaW4KKyAgICBmb3IgbGluZSBpbiBmcDoKKyAgICAgICAgaWYgbGluZSA9PSAnXG4nOgorICAgICAgICAgICAgZi5lbmRfcGFyYWdyYXBoKDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmLmFkZF9mbG93aW5nX2RhdGEobGluZSkKKyAgICBmLmVuZF9wYXJhZ3JhcGgoMCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mb3JtYXR0ZXIucHljIGIvbGliL3B5dGhvbjIuNy9mb3JtYXR0ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjFhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Zvcm1hdHRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mb3JtYXR0ZXIucHlvIGIvbGliL3B5dGhvbjIuNy9mb3JtYXR0ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjFhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Zvcm1hdHRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mcGZvcm1hdC5weSBiL2xpYi9weXRob24yLjcvZnBmb3JtYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjYmIyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZnBmb3JtYXQucHkKQEAgLTAsMCArMSwxNDUgQEAKKyIiIkdlbmVyYWwgZmxvYXRpbmcgcG9pbnQgZm9ybWF0dGluZyBmdW5jdGlvbnMuCisKK0Z1bmN0aW9uczoKK2ZpeCh4LCBkaWdpdHNfYmVoaW5kKQorc2NpKHgsIGRpZ2l0c19iZWhpbmQpCisKK0VhY2ggdGFrZXMgYSBudW1iZXIgb3IgYSBzdHJpbmcgYW5kIGEgbnVtYmVyIG9mIGRpZ2l0cyBhcyBhcmd1bWVudHMuCisKK1BhcmFtZXRlcnM6Cit4OiAgICAgICAgICAgICBudW1iZXIgdG8gYmUgZm9ybWF0dGVkOyBvciBhIHN0cmluZyByZXNlbWJsaW5nIGEgbnVtYmVyCitkaWdpdHNfYmVoaW5kOiBudW1iZXIgb2YgZGlnaXRzIGJlaGluZCB0aGUgZGVjaW1hbCBwb2ludAorIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSBmcGZvcm1hdCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKK2ltcG9ydCByZQorCitfX2FsbF9fID0gWyJmaXgiLCJzY2kiLCJOb3RBTnVtYmVyIl0KKworIyBDb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24gdG8gImRlY29kZSIgYSBudW1iZXIKK2RlY29kZXIgPSByZS5jb21waWxlKHInXihbLStdPykwKihcZCopKCg/OlwuXGQqKT8pKChbZUVdWy0rXT9cZCspPykkJykKKyMgXDAgdGhlIHdob2xlIHRoaW5nCisjIFwxIGxlYWRpbmcgc2lnbiBvciBlbXB0eQorIyBcMiBkaWdpdHMgbGVmdCBvZiBkZWNpbWFsIHBvaW50CisjIFwzIGZyYWN0aW9uIChlbXB0eSBvciBiZWdpbnMgd2l0aCBwb2ludCkKKyMgXDQgZXhwb25lbnQgcGFydCAoZW1wdHkgb3IgYmVnaW5zIHdpdGggJ2UnIG9yICdFJykKKwordHJ5OgorICAgIGNsYXNzIE5vdEFOdW1iZXIoVmFsdWVFcnJvcik6CisgICAgICAgIHBhc3MKK2V4Y2VwdCBUeXBlRXJyb3I6CisgICAgTm90QU51bWJlciA9ICdmcGZvcm1hdC5Ob3RBTnVtYmVyJworCitkZWYgZXh0cmFjdChzKToKKyAgICAiIiJSZXR1cm4gKHNpZ24sIGludHBhcnQsIGZyYWN0aW9uLCBleHBvKSBvciByYWlzZSBhbiBleGNlcHRpb246CisgICAgc2lnbiBpcyAnKycgb3IgJy0nCisgICAgaW50cGFydCBpcyAwIG9yIG1vcmUgZGlnaXRzIGJlZ2lubmluZyB3aXRoIGEgbm9uemVybworICAgIGZyYWN0aW9uIGlzIDAgb3IgbW9yZSBkaWdpdHMKKyAgICBleHBvIGlzIGFuIGludGVnZXIiIiIKKyAgICByZXMgPSBkZWNvZGVyLm1hdGNoKHMpCisgICAgaWYgcmVzIGlzIE5vbmU6IHJhaXNlIE5vdEFOdW1iZXIsIHMKKyAgICBzaWduLCBpbnRwYXJ0LCBmcmFjdGlvbiwgZXhwcGFydCA9IHJlcy5ncm91cCgxLDIsMyw0KQorICAgIGlmIHNpZ24gPT0gJysnOiBzaWduID0gJycKKyAgICBpZiBmcmFjdGlvbjogZnJhY3Rpb24gPSBmcmFjdGlvblsxOl0KKyAgICBpZiBleHBwYXJ0OiBleHBvID0gaW50KGV4cHBhcnRbMTpdKQorICAgIGVsc2U6IGV4cG8gPSAwCisgICAgcmV0dXJuIHNpZ24sIGludHBhcnQsIGZyYWN0aW9uLCBleHBvCisKK2RlZiB1bmV4cG8oaW50cGFydCwgZnJhY3Rpb24sIGV4cG8pOgorICAgICIiIlJlbW92ZSB0aGUgZXhwb25lbnQgYnkgY2hhbmdpbmcgaW50cGFydCBhbmQgZnJhY3Rpb24uIiIiCisgICAgaWYgZXhwbyA+IDA6ICMgTW92ZSB0aGUgcG9pbnQgbGVmdAorICAgICAgICBmID0gbGVuKGZyYWN0aW9uKQorICAgICAgICBpbnRwYXJ0LCBmcmFjdGlvbiA9IGludHBhcnQgKyBmcmFjdGlvbls6ZXhwb10sIGZyYWN0aW9uW2V4cG86XQorICAgICAgICBpZiBleHBvID4gZjoKKyAgICAgICAgICAgIGludHBhcnQgPSBpbnRwYXJ0ICsgJzAnKihleHBvLWYpCisgICAgZWxpZiBleHBvIDwgMDogIyBNb3ZlIHRoZSBwb2ludCByaWdodAorICAgICAgICBpID0gbGVuKGludHBhcnQpCisgICAgICAgIGludHBhcnQsIGZyYWN0aW9uID0gaW50cGFydFs6ZXhwb10sIGludHBhcnRbZXhwbzpdICsgZnJhY3Rpb24KKyAgICAgICAgaWYgZXhwbyA8IC1pOgorICAgICAgICAgICAgZnJhY3Rpb24gPSAnMCcqKC1leHBvLWkpICsgZnJhY3Rpb24KKyAgICByZXR1cm4gaW50cGFydCwgZnJhY3Rpb24KKworZGVmIHJvdW5kZnJhYyhpbnRwYXJ0LCBmcmFjdGlvbiwgZGlncyk6CisgICAgIiIiUm91bmQgb3IgZXh0ZW5kIHRoZSBmcmFjdGlvbiB0byBzaXplIGRpZ3MuIiIiCisgICAgZiA9IGxlbihmcmFjdGlvbikKKyAgICBpZiBmIDw9IGRpZ3M6CisgICAgICAgIHJldHVybiBpbnRwYXJ0LCBmcmFjdGlvbiArICcwJyooZGlncy1mKQorICAgIGkgPSBsZW4oaW50cGFydCkKKyAgICBpZiBpK2RpZ3MgPCAwOgorICAgICAgICByZXR1cm4gJzAnKi1kaWdzLCAnJworICAgIHRvdGFsID0gaW50cGFydCArIGZyYWN0aW9uCisgICAgbmV4dGRpZ2l0ID0gdG90YWxbaStkaWdzXQorICAgIGlmIG5leHRkaWdpdCA+PSAnNSc6ICMgSGFyZCBjYXNlOiBpbmNyZW1lbnQgbGFzdCBkaWdpdCwgbWF5IGhhdmUgY2FycnkhCisgICAgICAgIG4gPSBpICsgZGlncyAtIDEKKyAgICAgICAgd2hpbGUgbiA+PSAwOgorICAgICAgICAgICAgaWYgdG90YWxbbl0gIT0gJzknOiBicmVhaworICAgICAgICAgICAgbiA9IG4tMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdG90YWwgPSAnMCcgKyB0b3RhbAorICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgbiA9IDAKKyAgICAgICAgdG90YWwgPSB0b3RhbFs6bl0gKyBjaHIob3JkKHRvdGFsW25dKSArIDEpICsgJzAnKihsZW4odG90YWwpLW4tMSkKKyAgICAgICAgaW50cGFydCwgZnJhY3Rpb24gPSB0b3RhbFs6aV0sIHRvdGFsW2k6XQorICAgIGlmIGRpZ3MgPj0gMDoKKyAgICAgICAgcmV0dXJuIGludHBhcnQsIGZyYWN0aW9uWzpkaWdzXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBpbnRwYXJ0WzpkaWdzXSArICcwJyotZGlncywgJycKKworZGVmIGZpeCh4LCBkaWdzKToKKyAgICAiIiJGb3JtYXQgeCBhcyBbLV1kZGQuZGRkIHdpdGggJ2RpZ3MnIGRpZ2l0cyBhZnRlciB0aGUgcG9pbnQKKyAgICBhbmQgYXQgbGVhc3Qgb25lIGRpZ2l0IGJlZm9yZS4KKyAgICBJZiBkaWdzIDw9IDAsIHRoZSBwb2ludCBpcyBzdXBwcmVzc2VkLiIiIgorICAgIGlmIHR5cGUoeCkgIT0gdHlwZSgnJyk6IHggPSByZXByKHgpCisgICAgdHJ5OgorICAgICAgICBzaWduLCBpbnRwYXJ0LCBmcmFjdGlvbiwgZXhwbyA9IGV4dHJhY3QoeCkKKyAgICBleGNlcHQgTm90QU51bWJlcjoKKyAgICAgICAgcmV0dXJuIHgKKyAgICBpbnRwYXJ0LCBmcmFjdGlvbiA9IHVuZXhwbyhpbnRwYXJ0LCBmcmFjdGlvbiwgZXhwbykKKyAgICBpbnRwYXJ0LCBmcmFjdGlvbiA9IHJvdW5kZnJhYyhpbnRwYXJ0LCBmcmFjdGlvbiwgZGlncykKKyAgICB3aGlsZSBpbnRwYXJ0IGFuZCBpbnRwYXJ0WzBdID09ICcwJzogaW50cGFydCA9IGludHBhcnRbMTpdCisgICAgaWYgaW50cGFydCA9PSAnJzogaW50cGFydCA9ICcwJworICAgIGlmIGRpZ3MgPiAwOiByZXR1cm4gc2lnbiArIGludHBhcnQgKyAnLicgKyBmcmFjdGlvbgorICAgIGVsc2U6IHJldHVybiBzaWduICsgaW50cGFydAorCitkZWYgc2NpKHgsIGRpZ3MpOgorICAgICIiIkZvcm1hdCB4IGFzIFstXWQuZGRkRVsrLV1kZGQgd2l0aCAnZGlncycgZGlnaXRzIGFmdGVyIHRoZSBwb2ludAorICAgIGFuZCBleGFjdGx5IG9uZSBkaWdpdCBiZWZvcmUuCisgICAgSWYgZGlncyBpcyA8PSAwLCBvbmUgZGlnaXQgaXMga2VwdCBhbmQgdGhlIHBvaW50IGlzIHN1cHByZXNzZWQuIiIiCisgICAgaWYgdHlwZSh4KSAhPSB0eXBlKCcnKTogeCA9IHJlcHIoeCkKKyAgICBzaWduLCBpbnRwYXJ0LCBmcmFjdGlvbiwgZXhwbyA9IGV4dHJhY3QoeCkKKyAgICBpZiBub3QgaW50cGFydDoKKyAgICAgICAgd2hpbGUgZnJhY3Rpb24gYW5kIGZyYWN0aW9uWzBdID09ICcwJzoKKyAgICAgICAgICAgIGZyYWN0aW9uID0gZnJhY3Rpb25bMTpdCisgICAgICAgICAgICBleHBvID0gZXhwbyAtIDEKKyAgICAgICAgaWYgZnJhY3Rpb246CisgICAgICAgICAgICBpbnRwYXJ0LCBmcmFjdGlvbiA9IGZyYWN0aW9uWzBdLCBmcmFjdGlvblsxOl0KKyAgICAgICAgICAgIGV4cG8gPSBleHBvIC0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW50cGFydCA9ICcwJworICAgIGVsc2U6CisgICAgICAgIGV4cG8gPSBleHBvICsgbGVuKGludHBhcnQpIC0gMQorICAgICAgICBpbnRwYXJ0LCBmcmFjdGlvbiA9IGludHBhcnRbMF0sIGludHBhcnRbMTpdICsgZnJhY3Rpb24KKyAgICBkaWdzID0gbWF4KDAsIGRpZ3MpCisgICAgaW50cGFydCwgZnJhY3Rpb24gPSByb3VuZGZyYWMoaW50cGFydCwgZnJhY3Rpb24sIGRpZ3MpCisgICAgaWYgbGVuKGludHBhcnQpID4gMToKKyAgICAgICAgaW50cGFydCwgZnJhY3Rpb24sIGV4cG8gPSBcCisgICAgICAgICAgICBpbnRwYXJ0WzBdLCBpbnRwYXJ0WzE6XSArIGZyYWN0aW9uWzotMV0sIFwKKyAgICAgICAgICAgIGV4cG8gKyBsZW4oaW50cGFydCkgLSAxCisgICAgcyA9IHNpZ24gKyBpbnRwYXJ0CisgICAgaWYgZGlncyA+IDA6IHMgPSBzICsgJy4nICsgZnJhY3Rpb24KKyAgICBlID0gcmVwcihhYnMoZXhwbykpCisgICAgZSA9ICcwJyooMy1sZW4oZSkpICsgZQorICAgIGlmIGV4cG8gPCAwOiBlID0gJy0nICsgZQorICAgIGVsc2U6IGUgPSAnKycgKyBlCisgICAgcmV0dXJuIHMgKyAnZScgKyBlCisKK2RlZiB0ZXN0KCk6CisgICAgIiIiSW50ZXJhY3RpdmUgdGVzdCBydW4uIiIiCisgICAgdHJ5OgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgeCwgZGlncyA9IGlucHV0KCdFbnRlciAoeCwgZGlncyk6ICcpCisgICAgICAgICAgICBwcmludCB4LCBmaXgoeCwgZGlncyksIHNjaSh4LCBkaWdzKQorICAgIGV4Y2VwdCAoRU9GRXJyb3IsIEtleWJvYXJkSW50ZXJydXB0KToKKyAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mcGZvcm1hdC5weWMgYi9saWIvcHl0aG9uMi43L2ZwZm9ybWF0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDYxYjE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mcGZvcm1hdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mcGZvcm1hdC5weW8gYi9saWIvcHl0aG9uMi43L2ZwZm9ybWF0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDYxYjE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mcGZvcm1hdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mcmFjdGlvbnMucHkgYi9saWIvcHl0aG9uMi43L2ZyYWN0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGQ4NmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mcmFjdGlvbnMucHkKQEAgLTAsMCArMSw2MDUgQEAKKyMgT3JpZ2luYWxseSBjb250cmlidXRlZCBieSBTam9lcmQgTXVsbGVuZGVyLgorIyBTaWduaWZpY2FudGx5IG1vZGlmaWVkIGJ5IEplZmZyZXkgWWFzc2tpbiA8anlhc3NraW4gYXQgZ21haWwuY29tPi4KKworIiIiUmF0aW9uYWwsIGluZmluaXRlLXByZWNpc2lvbiwgcmVhbCBudW1iZXJzLiIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKK2ltcG9ydCBtYXRoCitpbXBvcnQgbnVtYmVycworaW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgcmUKKworX19hbGxfXyA9IFsnRnJhY3Rpb24nLCAnZ2NkJ10KKworUmF0aW9uYWwgPSBudW1iZXJzLlJhdGlvbmFsCisKKworZGVmIGdjZChhLCBiKToKKyAgICAiIiJDYWxjdWxhdGUgdGhlIEdyZWF0ZXN0IENvbW1vbiBEaXZpc29yIG9mIGEgYW5kIGIuCisKKyAgICBVbmxlc3MgYj09MCwgdGhlIHJlc3VsdCB3aWxsIGhhdmUgdGhlIHNhbWUgc2lnbiBhcyBiIChzbyB0aGF0IHdoZW4KKyAgICBiIGlzIGRpdmlkZWQgYnkgaXQsIHRoZSByZXN1bHQgY29tZXMgb3V0IHBvc2l0aXZlKS4KKyAgICAiIiIKKyAgICB3aGlsZSBiOgorICAgICAgICBhLCBiID0gYiwgYSViCisgICAgcmV0dXJuIGEKKworCitfUkFUSU9OQUxfRk9STUFUID0gcmUuY29tcGlsZShyIiIiCisgICAgXEFccyogICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCwgdGhlbgorICAgICg/UDxzaWduPlstK10/KSAgICAgICAgICAgICMgYW4gb3B0aW9uYWwgc2lnbiwgdGhlbgorICAgICg/PVxkfFwuXGQpICAgICAgICAgICAgICAgICMgbG9va2FoZWFkIGZvciBkaWdpdCBvciAuZGlnaXQKKyAgICAoP1A8bnVtPlxkKikgICAgICAgICAgICAgICAjIG51bWVyYXRvciAocG9zc2libHkgZW1wdHkpCisgICAgKD86ICAgICAgICAgICAgICAgICAgICAgICAgIyBmb2xsb3dlZCBieQorICAgICAgICg/Oi8oP1A8ZGVub20+XGQrKSk/ICAgICMgYW4gb3B0aW9uYWwgZGVub21pbmF0b3IKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yCisgICAgICAgKD86XC4oP1A8ZGVjaW1hbD5cZCopKT8gIyBhbiBvcHRpb25hbCBmcmFjdGlvbmFsIHBhcnQKKyAgICAgICAoPzpFKD9QPGV4cD5bLStdP1xkKykpPyAjIGFuZCBvcHRpb25hbCBleHBvbmVudAorICAgICkKKyAgICBccypcWiAgICAgICAgICAgICAgICAgICAgICAjIGFuZCBvcHRpb25hbCB3aGl0ZXNwYWNlIHRvIGZpbmlzaAorIiIiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKKworCitjbGFzcyBGcmFjdGlvbihSYXRpb25hbCk6CisgICAgIiIiVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHJhdGlvbmFsIG51bWJlcnMuCisKKyAgICBJbiB0aGUgdHdvLWFyZ3VtZW50IGZvcm0gb2YgdGhlIGNvbnN0cnVjdG9yLCBGcmFjdGlvbig4LCA2KSB3aWxsCisgICAgcHJvZHVjZSBhIHJhdGlvbmFsIG51bWJlciBlcXVpdmFsZW50IHRvIDQvMy4gQm90aCBhcmd1bWVudHMgbXVzdAorICAgIGJlIFJhdGlvbmFsLiBUaGUgbnVtZXJhdG9yIGRlZmF1bHRzIHRvIDAgYW5kIHRoZSBkZW5vbWluYXRvcgorICAgIGRlZmF1bHRzIHRvIDEgc28gdGhhdCBGcmFjdGlvbigzKSA9PSAzIGFuZCBGcmFjdGlvbigpID09IDAuCisKKyAgICBGcmFjdGlvbnMgY2FuIGFsc28gYmUgY29uc3RydWN0ZWQgZnJvbToKKworICAgICAgLSBudW1lcmljIHN0cmluZ3Mgc2ltaWxhciB0byB0aG9zZSBhY2NlcHRlZCBieSB0aGUKKyAgICAgICAgZmxvYXQgY29uc3RydWN0b3IgKGZvciBleGFtcGxlLCAnLTIuMycgb3IgJzFlMTAnKQorCisgICAgICAtIHN0cmluZ3Mgb2YgdGhlIGZvcm0gJzEyMy80NTYnCisKKyAgICAgIC0gZmxvYXQgYW5kIERlY2ltYWwgaW5zdGFuY2VzCisKKyAgICAgIC0gb3RoZXIgUmF0aW9uYWwgaW5zdGFuY2VzIChpbmNsdWRpbmcgaW50ZWdlcnMpCisKKyAgICAiIiIKKworICAgIF9fc2xvdHNfXyA9ICgnX251bWVyYXRvcicsICdfZGVub21pbmF0b3InKQorCisgICAgIyBXZSdyZSBpbW11dGFibGUsIHNvIHVzZSBfX25ld19fIG5vdCBfX2luaXRfXworICAgIGRlZiBfX25ld19fKGNscywgbnVtZXJhdG9yPTAsIGRlbm9taW5hdG9yPU5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3RzIGEgRnJhY3Rpb24uCisKKyAgICAgICAgVGFrZXMgYSBzdHJpbmcgbGlrZSAnMy8yJyBvciAnMS41JywgYW5vdGhlciBSYXRpb25hbCBpbnN0YW5jZSwgYQorICAgICAgICBudW1lcmF0b3IvZGVub21pbmF0b3IgcGFpciwgb3IgYSBmbG9hdC4KKworICAgICAgICBFeGFtcGxlcworICAgICAgICAtLS0tLS0tLQorCisgICAgICAgID4+PiBGcmFjdGlvbigxMCwgLTgpCisgICAgICAgIEZyYWN0aW9uKC01LCA0KQorICAgICAgICA+Pj4gRnJhY3Rpb24oRnJhY3Rpb24oMSwgNyksIDUpCisgICAgICAgIEZyYWN0aW9uKDEsIDM1KQorICAgICAgICA+Pj4gRnJhY3Rpb24oRnJhY3Rpb24oMSwgNyksIEZyYWN0aW9uKDIsIDMpKQorICAgICAgICBGcmFjdGlvbigzLCAxNCkKKyAgICAgICAgPj4+IEZyYWN0aW9uKCczMTQnKQorICAgICAgICBGcmFjdGlvbigzMTQsIDEpCisgICAgICAgID4+PiBGcmFjdGlvbignLTM1LzQnKQorICAgICAgICBGcmFjdGlvbigtMzUsIDQpCisgICAgICAgID4+PiBGcmFjdGlvbignMy4xNDE1JykgIyBjb252ZXJzaW9uIGZyb20gbnVtZXJpYyBzdHJpbmcKKyAgICAgICAgRnJhY3Rpb24oNjI4MywgMjAwMCkKKyAgICAgICAgPj4+IEZyYWN0aW9uKCctNDdlLTInKSAjIHN0cmluZyBtYXkgaW5jbHVkZSBhIGRlY2ltYWwgZXhwb25lbnQKKyAgICAgICAgRnJhY3Rpb24oLTQ3LCAxMDApCisgICAgICAgID4+PiBGcmFjdGlvbigxLjQ3KSAgIyBkaXJlY3QgY29uc3RydWN0aW9uIGZyb20gZmxvYXQgKGV4YWN0IGNvbnZlcnNpb24pCisgICAgICAgIEZyYWN0aW9uKDY2MjAyOTE0NTIyMzQ2MjksIDQ1MDM1OTk2MjczNzA0OTYpCisgICAgICAgID4+PiBGcmFjdGlvbigyLjI1KQorICAgICAgICBGcmFjdGlvbig5LCA0KQorICAgICAgICA+Pj4gRnJhY3Rpb24oRGVjaW1hbCgnMS40NycpKQorICAgICAgICBGcmFjdGlvbigxNDcsIDEwMCkKKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZiA9IHN1cGVyKEZyYWN0aW9uLCBjbHMpLl9fbmV3X18oY2xzKQorCisgICAgICAgIGlmIGRlbm9taW5hdG9yIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG51bWVyYXRvciwgUmF0aW9uYWwpOgorICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciA9IG51bWVyYXRvci5udW1lcmF0b3IKKyAgICAgICAgICAgICAgICBzZWxmLl9kZW5vbWluYXRvciA9IG51bWVyYXRvci5kZW5vbWluYXRvcgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIGZsb2F0KToKKyAgICAgICAgICAgICAgICAjIEV4YWN0IGNvbnZlcnNpb24gZnJvbSBmbG9hdAorICAgICAgICAgICAgICAgIHZhbHVlID0gRnJhY3Rpb24uZnJvbV9mbG9hdChudW1lcmF0b3IpCisgICAgICAgICAgICAgICAgc2VsZi5fbnVtZXJhdG9yID0gdmFsdWUuX251bWVyYXRvcgorICAgICAgICAgICAgICAgIHNlbGYuX2Rlbm9taW5hdG9yID0gdmFsdWUuX2Rlbm9taW5hdG9yCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG51bWVyYXRvciwgRGVjaW1hbCk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBGcmFjdGlvbi5mcm9tX2RlY2ltYWwobnVtZXJhdG9yKQorICAgICAgICAgICAgICAgIHNlbGYuX251bWVyYXRvciA9IHZhbHVlLl9udW1lcmF0b3IKKyAgICAgICAgICAgICAgICBzZWxmLl9kZW5vbWluYXRvciA9IHZhbHVlLl9kZW5vbWluYXRvcgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShudW1lcmF0b3IsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgICMgSGFuZGxlIGNvbnN0cnVjdGlvbiBmcm9tIHN0cmluZ3MuCisgICAgICAgICAgICAgICAgbSA9IF9SQVRJT05BTF9GT1JNQVQubWF0Y2gobnVtZXJhdG9yKQorICAgICAgICAgICAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCBsaXRlcmFsIGZvciBGcmFjdGlvbjogJXInICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmF0b3IpCisgICAgICAgICAgICAgICAgbnVtZXJhdG9yID0gaW50KG0uZ3JvdXAoJ251bScpIG9yICcwJykKKyAgICAgICAgICAgICAgICBkZW5vbSA9IG0uZ3JvdXAoJ2Rlbm9tJykKKyAgICAgICAgICAgICAgICBpZiBkZW5vbToKKyAgICAgICAgICAgICAgICAgICAgZGVub21pbmF0b3IgPSBpbnQoZGVub20pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGVub21pbmF0b3IgPSAxCisgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgPSBtLmdyb3VwKCdkZWNpbWFsJykKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVjaW1hbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gMTAqKmxlbihkZWNpbWFsKQorICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJhdG9yID0gbnVtZXJhdG9yICogc2NhbGUgKyBpbnQoZGVjaW1hbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yICo9IHNjYWxlCisgICAgICAgICAgICAgICAgICAgIGV4cCA9IG0uZ3JvdXAoJ2V4cCcpCisgICAgICAgICAgICAgICAgICAgIGlmIGV4cDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cCA9IGludChleHApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBleHAgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmF0b3IgKj0gMTAqKmV4cAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciAqPSAxMCoqLWV4cAorICAgICAgICAgICAgICAgIGlmIG0uZ3JvdXAoJ3NpZ24nKSA9PSAnLSc6CisgICAgICAgICAgICAgICAgICAgIG51bWVyYXRvciA9IC1udW1lcmF0b3IKKworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImFyZ3VtZW50IHNob3VsZCBiZSBhIHN0cmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBhIFJhdGlvbmFsIGluc3RhbmNlIikKKworICAgICAgICBlbGlmIChpc2luc3RhbmNlKG51bWVyYXRvciwgUmF0aW9uYWwpIGFuZAorICAgICAgICAgICAgaXNpbnN0YW5jZShkZW5vbWluYXRvciwgUmF0aW9uYWwpKToKKyAgICAgICAgICAgIG51bWVyYXRvciwgZGVub21pbmF0b3IgPSAoCisgICAgICAgICAgICAgICAgbnVtZXJhdG9yLm51bWVyYXRvciAqIGRlbm9taW5hdG9yLmRlbm9taW5hdG9yLAorICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yLm51bWVyYXRvciAqIG51bWVyYXRvci5kZW5vbWluYXRvcgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYm90aCBhcmd1bWVudHMgc2hvdWxkIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmF0aW9uYWwgaW5zdGFuY2VzIikKKworICAgICAgICBpZiBkZW5vbWluYXRvciA9PSAwOgorICAgICAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IoJ0ZyYWN0aW9uKCVzLCAwKScgJSBudW1lcmF0b3IpCisgICAgICAgIGcgPSBnY2QobnVtZXJhdG9yLCBkZW5vbWluYXRvcikKKyAgICAgICAgc2VsZi5fbnVtZXJhdG9yID0gbnVtZXJhdG9yIC8vIGcKKyAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgPSBkZW5vbWluYXRvciAvLyBnCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9mbG9hdChjbHMsIGYpOgorICAgICAgICAiIiJDb252ZXJ0cyBhIGZpbml0ZSBmbG9hdCB0byBhIHJhdGlvbmFsIG51bWJlciwgZXhhY3RseS4KKworICAgICAgICBCZXdhcmUgdGhhdCBGcmFjdGlvbi5mcm9tX2Zsb2F0KDAuMykgIT0gRnJhY3Rpb24oMywgMTApLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKGYsIG51bWJlcnMuSW50ZWdyYWwpOgorICAgICAgICAgICAgcmV0dXJuIGNscyhmKQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGYsIGZsb2F0KToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXMuZnJvbV9mbG9hdCgpIG9ubHkgdGFrZXMgZmxvYXRzLCBub3QgJXIgKCVzKSIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbHMuX19uYW1lX18sIGYsIHR5cGUoZikuX19uYW1lX18pKQorICAgICAgICBpZiBtYXRoLmlzbmFuKGYpIG9yIG1hdGguaXNpbmYoZik6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbm5vdCBjb252ZXJ0ICVyIHRvICVzLiIgJSAoZiwgY2xzLl9fbmFtZV9fKSkKKyAgICAgICAgcmV0dXJuIGNscygqZi5hc19pbnRlZ2VyX3JhdGlvKCkpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9kZWNpbWFsKGNscywgZGVjKToKKyAgICAgICAgIiIiQ29udmVydHMgYSBmaW5pdGUgRGVjaW1hbCBpbnN0YW5jZSB0byBhIHJhdGlvbmFsIG51bWJlciwgZXhhY3RseS4iIiIKKyAgICAgICAgZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZGVjLCBudW1iZXJzLkludGVncmFsKToKKyAgICAgICAgICAgIGRlYyA9IERlY2ltYWwoaW50KGRlYykpCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoZGVjLCBEZWNpbWFsKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAgICAgICAiJXMuZnJvbV9kZWNpbWFsKCkgb25seSB0YWtlcyBEZWNpbWFscywgbm90ICVyICglcykiICUKKyAgICAgICAgICAgICAgICAoY2xzLl9fbmFtZV9fLCBkZWMsIHR5cGUoZGVjKS5fX25hbWVfXykpCisgICAgICAgIGlmIG5vdCBkZWMuaXNfZmluaXRlKCk6CisgICAgICAgICAgICAjIENhdGNoZXMgaW5maW5pdGllcyBhbmQgbmFucy4KKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgJXMgdG8gJXMuIiAlIChkZWMsIGNscy5fX25hbWVfXykpCisgICAgICAgIHNpZ24sIGRpZ2l0cywgZXhwID0gZGVjLmFzX3R1cGxlKCkKKyAgICAgICAgZGlnaXRzID0gaW50KCcnLmpvaW4obWFwKHN0ciwgZGlnaXRzKSkpCisgICAgICAgIGlmIHNpZ246CisgICAgICAgICAgICBkaWdpdHMgPSAtZGlnaXRzCisgICAgICAgIGlmIGV4cCA+PSAwOgorICAgICAgICAgICAgcmV0dXJuIGNscyhkaWdpdHMgKiAxMCAqKiBleHApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY2xzKGRpZ2l0cywgMTAgKiogLWV4cCkKKworICAgIGRlZiBsaW1pdF9kZW5vbWluYXRvcihzZWxmLCBtYXhfZGVub21pbmF0b3I9MTAwMDAwMCk6CisgICAgICAgICIiIkNsb3Nlc3QgRnJhY3Rpb24gdG8gc2VsZiB3aXRoIGRlbm9taW5hdG9yIGF0IG1vc3QgbWF4X2Rlbm9taW5hdG9yLgorCisgICAgICAgID4+PiBGcmFjdGlvbignMy4xNDE1OTI2NTM1ODk3OTMnKS5saW1pdF9kZW5vbWluYXRvcigxMCkKKyAgICAgICAgRnJhY3Rpb24oMjIsIDcpCisgICAgICAgID4+PiBGcmFjdGlvbignMy4xNDE1OTI2NTM1ODk3OTMnKS5saW1pdF9kZW5vbWluYXRvcigxMDApCisgICAgICAgIEZyYWN0aW9uKDMxMSwgOTkpCisgICAgICAgID4+PiBGcmFjdGlvbig0MzIxLCA4NzY1KS5saW1pdF9kZW5vbWluYXRvcigxMDAwMCkKKyAgICAgICAgRnJhY3Rpb24oNDMyMSwgODc2NSkKKworICAgICAgICAiIiIKKyAgICAgICAgIyBBbGdvcml0aG0gbm90ZXM6IEZvciBhbnkgcmVhbCBudW1iZXIgeCwgZGVmaW5lIGEgKmJlc3QgdXBwZXIKKyAgICAgICAgIyBhcHByb3hpbWF0aW9uKiB0byB4IHRvIGJlIGEgcmF0aW9uYWwgbnVtYmVyIHAvcSBzdWNoIHRoYXQ6CisgICAgICAgICMKKyAgICAgICAgIyAgICgxKSBwL3EgPj0geCwgYW5kCisgICAgICAgICMgICAoMikgaWYgcC9xID4gci9zID49IHggdGhlbiBzID4gcSwgZm9yIGFueSByYXRpb25hbCByL3MuCisgICAgICAgICMKKyAgICAgICAgIyBEZWZpbmUgKmJlc3QgbG93ZXIgYXBwcm94aW1hdGlvbiogc2ltaWxhcmx5LiAgVGhlbiBpdCBjYW4gYmUKKyAgICAgICAgIyBwcm92ZWQgdGhhdCBhIHJhdGlvbmFsIG51bWJlciBpcyBhIGJlc3QgdXBwZXIgb3IgbG93ZXIKKyAgICAgICAgIyBhcHByb3hpbWF0aW9uIHRvIHggaWYsIGFuZCBvbmx5IGlmLCBpdCBpcyBhIGNvbnZlcmdlbnQgb3IKKyAgICAgICAgIyBzZW1pY29udmVyZ2VudCBvZiB0aGUgKHVuaXF1ZSBzaG9ydGVzdCkgY29udGludWVkIGZyYWN0aW9uCisgICAgICAgICMgYXNzb2NpYXRlZCB0byB4LgorICAgICAgICAjCisgICAgICAgICMgVG8gZmluZCBhIGJlc3QgcmF0aW9uYWwgYXBwcm94aW1hdGlvbiB3aXRoIGRlbm9taW5hdG9yIDw9IE0sCisgICAgICAgICMgd2UgZmluZCB0aGUgYmVzdCB1cHBlciBhbmQgbG93ZXIgYXBwcm94aW1hdGlvbnMgd2l0aAorICAgICAgICAjIGRlbm9taW5hdG9yIDw9IE0gYW5kIHRha2Ugd2hpY2hldmVyIG9mIHRoZXNlIGlzIGNsb3NlciB0byB4LgorICAgICAgICAjIEluIHRoZSBldmVudCBvZiBhIHRpZSwgdGhlIGJvdW5kIHdpdGggc21hbGxlciBkZW5vbWluYXRvciBpcworICAgICAgICAjIGNob3Nlbi4gIElmIGJvdGggZGVub21pbmF0b3JzIGFyZSBlcXVhbCAod2hpY2ggY2FuIGhhcHBlbgorICAgICAgICAjIG9ubHkgd2hlbiBtYXhfZGVub21pbmF0b3IgPT0gMSBhbmQgc2VsZiBpcyBtaWR3YXkgYmV0d2VlbgorICAgICAgICAjIHR3byBpbnRlZ2VycykgdGhlIGxvd2VyIGJvdW5kLS0taS5lLiwgdGhlIGZsb29yIG9mIHNlbGYsIGlzCisgICAgICAgICMgdGFrZW4uCisKKyAgICAgICAgaWYgbWF4X2Rlbm9taW5hdG9yIDwgMToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1heF9kZW5vbWluYXRvciBzaG91bGQgYmUgYXQgbGVhc3QgMSIpCisgICAgICAgIGlmIHNlbGYuX2Rlbm9taW5hdG9yIDw9IG1heF9kZW5vbWluYXRvcjoKKyAgICAgICAgICAgIHJldHVybiBGcmFjdGlvbihzZWxmKQorCisgICAgICAgIHAwLCBxMCwgcDEsIHExID0gMCwgMSwgMSwgMAorICAgICAgICBuLCBkID0gc2VsZi5fbnVtZXJhdG9yLCBzZWxmLl9kZW5vbWluYXRvcgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgYSA9IG4vL2QKKyAgICAgICAgICAgIHEyID0gcTArYSpxMQorICAgICAgICAgICAgaWYgcTIgPiBtYXhfZGVub21pbmF0b3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHAwLCBxMCwgcDEsIHExID0gcDEsIHExLCBwMCthKnAxLCBxMgorICAgICAgICAgICAgbiwgZCA9IGQsIG4tYSpkCisKKyAgICAgICAgayA9IChtYXhfZGVub21pbmF0b3ItcTApLy9xMQorICAgICAgICBib3VuZDEgPSBGcmFjdGlvbihwMCtrKnAxLCBxMCtrKnExKQorICAgICAgICBib3VuZDIgPSBGcmFjdGlvbihwMSwgcTEpCisgICAgICAgIGlmIGFicyhib3VuZDIgLSBzZWxmKSA8PSBhYnMoYm91bmQxLXNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIGJvdW5kMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGJvdW5kMQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG51bWVyYXRvcihhKToKKyAgICAgICAgcmV0dXJuIGEuX251bWVyYXRvcgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRlbm9taW5hdG9yKGEpOgorICAgICAgICByZXR1cm4gYS5fZGVub21pbmF0b3IKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIicmVwcihzZWxmKSIiIgorICAgICAgICByZXR1cm4gKCdGcmFjdGlvbiglcywgJXMpJyAlIChzZWxmLl9udW1lcmF0b3IsIHNlbGYuX2Rlbm9taW5hdG9yKSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAiIiJzdHIoc2VsZikiIiIKKyAgICAgICAgaWYgc2VsZi5fZGVub21pbmF0b3IgPT0gMToKKyAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZi5fbnVtZXJhdG9yKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICclcy8lcycgJSAoc2VsZi5fbnVtZXJhdG9yLCBzZWxmLl9kZW5vbWluYXRvcikKKworICAgIGRlZiBfb3BlcmF0b3JfZmFsbGJhY2tzKG1vbm9tb3JwaGljX29wZXJhdG9yLCBmYWxsYmFja19vcGVyYXRvcik6CisgICAgICAgICIiIkdlbmVyYXRlcyBmb3J3YXJkIGFuZCByZXZlcnNlIG9wZXJhdG9ycyBnaXZlbiBhIHB1cmVseS1yYXRpb25hbAorICAgICAgICBvcGVyYXRvciBhbmQgYSBmdW5jdGlvbiBmcm9tIHRoZSBvcGVyYXRvciBtb2R1bGUuCisKKyAgICAgICAgVXNlIHRoaXMgbGlrZToKKyAgICAgICAgX19vcF9fLCBfX3JvcF9fID0gX29wZXJhdG9yX2ZhbGxiYWNrcyhqdXN0X3JhdGlvbmFsX29wLCBvcGVyYXRvci5vcCkKKworICAgICAgICBJbiBnZW5lcmFsLCB3ZSB3YW50IHRvIGltcGxlbWVudCB0aGUgYXJpdGhtZXRpYyBvcGVyYXRpb25zIHNvCisgICAgICAgIHRoYXQgbWl4ZWQtbW9kZSBvcGVyYXRpb25zIGVpdGhlciBjYWxsIGFuIGltcGxlbWVudGF0aW9uIHdob3NlCisgICAgICAgIGF1dGhvciBrbmV3IGFib3V0IHRoZSB0eXBlcyBvZiBib3RoIGFyZ3VtZW50cywgb3IgY29udmVydCBib3RoCisgICAgICAgIHRvIHRoZSBuZWFyZXN0IGJ1aWx0IGluIHR5cGUgYW5kIGRvIHRoZSBvcGVyYXRpb24gdGhlcmUuIEluCisgICAgICAgIEZyYWN0aW9uLCB0aGF0IG1lYW5zIHRoYXQgd2UgZGVmaW5lIF9fYWRkX18gYW5kIF9fcmFkZF9fIGFzOgorCisgICAgICAgICAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgIyBCb3RoIHR5cGVzIGhhdmUgbnVtZXJhdG9ycy9kZW5vbWluYXRvciBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICMgc28gZG8gdGhlIG9wZXJhdGlvbiBkaXJlY3RseQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIChpbnQsIGxvbmcsIEZyYWN0aW9uKSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGcmFjdGlvbihzZWxmLm51bWVyYXRvciAqIG90aGVyLmRlbm9taW5hdG9yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLm51bWVyYXRvciAqIHNlbGYuZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbm9taW5hdG9yICogb3RoZXIuZGVub21pbmF0b3IpCisgICAgICAgICAgICAgICAgIyBmbG9hdCBhbmQgY29tcGxleCBkb24ndCBoYXZlIHRob3NlIG9wZXJhdGlvbnMsIGJ1dCB3ZQorICAgICAgICAgICAgICAgICMga25vdyBhYm91dCB0aG9zZSB0eXBlcywgc28gc3BlY2lhbCBjYXNlIHRoZW0uCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBmbG9hdCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdChzZWxmKSArIG90aGVyCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBjb21wbGV4KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXgoc2VsZikgKyBvdGhlcgorICAgICAgICAgICAgICAgICMgTGV0IHRoZSBvdGhlciB0eXBlIHRha2Ugb3Zlci4KKyAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgICAgICAgICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICAjIHJhZGQgaGFuZGxlcyBtb3JlIHR5cGVzIHRoYW4gYWRkIGJlY2F1c2UgdGhlcmUncworICAgICAgICAgICAgICAgICMgbm90aGluZyBsZWZ0IHRvIGZhbGwgYmFjayB0by4KKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBSYXRpb25hbCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGcmFjdGlvbihzZWxmLm51bWVyYXRvciAqIG90aGVyLmRlbm9taW5hdG9yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLm51bWVyYXRvciAqIHNlbGYuZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbm9taW5hdG9yICogb3RoZXIuZGVub21pbmF0b3IpCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBSZWFsKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KG90aGVyKSArIGZsb2F0KHNlbGYpCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBDb21wbGV4KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXgob3RoZXIpICsgY29tcGxleChzZWxmKQorICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisKKyAgICAgICAgVGhlcmUgYXJlIDUgZGlmZmVyZW50IGNhc2VzIGZvciBhIG1peGVkLXR5cGUgYWRkaXRpb24gb24KKyAgICAgICAgRnJhY3Rpb24uIEknbGwgcmVmZXIgdG8gYWxsIG9mIHRoZSBhYm92ZSBjb2RlIHRoYXQgZG9lc24ndAorICAgICAgICByZWZlciB0byBGcmFjdGlvbiwgZmxvYXQsIG9yIGNvbXBsZXggYXMgImJvaWxlcnBsYXRlIi4gJ3InCisgICAgICAgIHdpbGwgYmUgYW4gaW5zdGFuY2Ugb2YgRnJhY3Rpb24sIHdoaWNoIGlzIGEgc3VidHlwZSBvZgorICAgICAgICBSYXRpb25hbCAociA6IEZyYWN0aW9uIDw6IFJhdGlvbmFsKSwgYW5kIGIgOiBCIDw6CisgICAgICAgIENvbXBsZXguIFRoZSBmaXJzdCB0aHJlZSBpbnZvbHZlICdyICsgYic6CisKKyAgICAgICAgICAgIDEuIElmIEIgPDogRnJhY3Rpb24sIGludCwgZmxvYXQsIG9yIGNvbXBsZXgsIHdlIGhhbmRsZQorICAgICAgICAgICAgICAgdGhhdCBzcGVjaWFsbHksIGFuZCBhbGwgaXMgd2VsbC4KKyAgICAgICAgICAgIDIuIElmIEZyYWN0aW9uIGZhbGxzIGJhY2sgdG8gdGhlIGJvaWxlcnBsYXRlIGNvZGUsIGFuZCBpdAorICAgICAgICAgICAgICAgd2VyZSB0byByZXR1cm4gYSB2YWx1ZSBmcm9tIF9fYWRkX18sIHdlJ2QgbWlzcyB0aGUKKyAgICAgICAgICAgICAgIHBvc3NpYmlsaXR5IHRoYXQgQiBkZWZpbmVzIGEgbW9yZSBpbnRlbGxpZ2VudCBfX3JhZGRfXywKKyAgICAgICAgICAgICAgIHNvIHRoZSBib2lsZXJwbGF0ZSBzaG91bGQgcmV0dXJuIE5vdEltcGxlbWVudGVkIGZyb20KKyAgICAgICAgICAgICAgIF9fYWRkX18uIEluIHBhcnRpY3VsYXIsIHdlIGRvbid0IGhhbmRsZSBSYXRpb25hbAorICAgICAgICAgICAgICAgaGVyZSwgZXZlbiB0aG91Z2ggd2UgY291bGQgZ2V0IGFuIGV4YWN0IGFuc3dlciwgaW4gY2FzZQorICAgICAgICAgICAgICAgdGhlIG90aGVyIHR5cGUgd2FudHMgdG8gZG8gc29tZXRoaW5nIHNwZWNpYWwuCisgICAgICAgICAgICAzLiBJZiBCIDw6IEZyYWN0aW9uLCBQeXRob24gdHJpZXMgQi5fX3JhZGRfXyBiZWZvcmUKKyAgICAgICAgICAgICAgIEZyYWN0aW9uLl9fYWRkX18uIFRoaXMgaXMgb2ssIGJlY2F1c2UgaXQgd2FzCisgICAgICAgICAgICAgICBpbXBsZW1lbnRlZCB3aXRoIGtub3dsZWRnZSBvZiBGcmFjdGlvbiwgc28gaXQgY2FuCisgICAgICAgICAgICAgICBoYW5kbGUgdGhvc2UgaW5zdGFuY2VzIGJlZm9yZSBkZWxlZ2F0aW5nIHRvIFJlYWwgb3IKKyAgICAgICAgICAgICAgIENvbXBsZXguCisKKyAgICAgICAgVGhlIG5leHQgdHdvIHNpdHVhdGlvbnMgZGVzY3JpYmUgJ2IgKyByJy4gV2UgYXNzdW1lIHRoYXQgYgorICAgICAgICBkaWRuJ3Qga25vdyBhYm91dCBGcmFjdGlvbiBpbiBpdHMgaW1wbGVtZW50YXRpb24sIGFuZCB0aGF0IGl0CisgICAgICAgIHVzZXMgc2ltaWxhciBib2lsZXJwbGF0ZSBjb2RlOgorCisgICAgICAgICAgICA0LiBJZiBCIDw6IFJhdGlvbmFsLCB0aGVuIF9fcmFkZF8gY29udmVydHMgYm90aCB0byB0aGUKKyAgICAgICAgICAgICAgIGJ1aWx0aW4gcmF0aW9uYWwgdHlwZSAoaGV5IGxvb2ssIHRoYXQncyB1cykgYW5kCisgICAgICAgICAgICAgICBwcm9jZWVkcy4KKyAgICAgICAgICAgIDUuIE90aGVyd2lzZSwgX19yYWRkX18gdHJpZXMgdG8gZmluZCB0aGUgbmVhcmVzdCBjb21tb24KKyAgICAgICAgICAgICAgIGJhc2UgQUJDLCBhbmQgZmFsbCBiYWNrIHRvIGl0cyBidWlsdGluIHR5cGUuIFNpbmNlIHRoaXMKKyAgICAgICAgICAgICAgIGNsYXNzIGRvZXNuJ3Qgc3ViY2xhc3MgYSBjb25jcmV0ZSB0eXBlLCB0aGVyZSdzIG5vCisgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB0byBmYWxsIGJhY2sgdG8sIHNvIHdlIG5lZWQgdG8gdHJ5IGFzCisgICAgICAgICAgICAgICBoYXJkIGFzIHBvc3NpYmxlIHRvIHJldHVybiBhbiBhY3R1YWwgdmFsdWUsIG9yIHRoZSB1c2VyCisgICAgICAgICAgICAgICB3aWxsIGdldCBhIFR5cGVFcnJvci4KKworICAgICAgICAiIiIKKyAgICAgICAgZGVmIGZvcndhcmQoYSwgYik6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGIsIChpbnQsIGxvbmcsIEZyYWN0aW9uKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vbm9tb3JwaGljX29wZXJhdG9yKGEsIGIpCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYiwgZmxvYXQpOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFja19vcGVyYXRvcihmbG9hdChhKSwgYikKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShiLCBjb21wbGV4KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2tfb3BlcmF0b3IoY29tcGxleChhKSwgYikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIGZvcndhcmQuX19uYW1lX18gPSAnX18nICsgZmFsbGJhY2tfb3BlcmF0b3IuX19uYW1lX18gKyAnX18nCisgICAgICAgIGZvcndhcmQuX19kb2NfXyA9IG1vbm9tb3JwaGljX29wZXJhdG9yLl9fZG9jX18KKworICAgICAgICBkZWYgcmV2ZXJzZShiLCBhKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYSwgUmF0aW9uYWwpOgorICAgICAgICAgICAgICAgICMgSW5jbHVkZXMgaW50cy4KKyAgICAgICAgICAgICAgICByZXR1cm4gbW9ub21vcnBoaWNfb3BlcmF0b3IoYSwgYikKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShhLCBudW1iZXJzLlJlYWwpOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFja19vcGVyYXRvcihmbG9hdChhKSwgZmxvYXQoYikpCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYSwgbnVtYmVycy5Db21wbGV4KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsbGJhY2tfb3BlcmF0b3IoY29tcGxleChhKSwgY29tcGxleChiKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldmVyc2UuX19uYW1lX18gPSAnX19yJyArIGZhbGxiYWNrX29wZXJhdG9yLl9fbmFtZV9fICsgJ19fJworICAgICAgICByZXZlcnNlLl9fZG9jX18gPSBtb25vbW9ycGhpY19vcGVyYXRvci5fX2RvY19fCisKKyAgICAgICAgcmV0dXJuIGZvcndhcmQsIHJldmVyc2UKKworICAgIGRlZiBfYWRkKGEsIGIpOgorICAgICAgICAiIiJhICsgYiIiIgorICAgICAgICByZXR1cm4gRnJhY3Rpb24oYS5udW1lcmF0b3IgKiBiLmRlbm9taW5hdG9yICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIubnVtZXJhdG9yICogYS5kZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuZGVub21pbmF0b3IgKiBiLmRlbm9taW5hdG9yKQorCisgICAgX19hZGRfXywgX19yYWRkX18gPSBfb3BlcmF0b3JfZmFsbGJhY2tzKF9hZGQsIG9wZXJhdG9yLmFkZCkKKworICAgIGRlZiBfc3ViKGEsIGIpOgorICAgICAgICAiIiJhIC0gYiIiIgorICAgICAgICByZXR1cm4gRnJhY3Rpb24oYS5udW1lcmF0b3IgKiBiLmRlbm9taW5hdG9yIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGIubnVtZXJhdG9yICogYS5kZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuZGVub21pbmF0b3IgKiBiLmRlbm9taW5hdG9yKQorCisgICAgX19zdWJfXywgX19yc3ViX18gPSBfb3BlcmF0b3JfZmFsbGJhY2tzKF9zdWIsIG9wZXJhdG9yLnN1YikKKworICAgIGRlZiBfbXVsKGEsIGIpOgorICAgICAgICAiIiJhICogYiIiIgorICAgICAgICByZXR1cm4gRnJhY3Rpb24oYS5udW1lcmF0b3IgKiBiLm51bWVyYXRvciwgYS5kZW5vbWluYXRvciAqIGIuZGVub21pbmF0b3IpCisKKyAgICBfX211bF9fLCBfX3JtdWxfXyA9IF9vcGVyYXRvcl9mYWxsYmFja3MoX211bCwgb3BlcmF0b3IubXVsKQorCisgICAgZGVmIF9kaXYoYSwgYik6CisgICAgICAgICIiImEgLyBiIiIiCisgICAgICAgIHJldHVybiBGcmFjdGlvbihhLm51bWVyYXRvciAqIGIuZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBhLmRlbm9taW5hdG9yICogYi5udW1lcmF0b3IpCisKKyAgICBfX3RydWVkaXZfXywgX19ydHJ1ZWRpdl9fID0gX29wZXJhdG9yX2ZhbGxiYWNrcyhfZGl2LCBvcGVyYXRvci50cnVlZGl2KQorICAgIF9fZGl2X18sIF9fcmRpdl9fID0gX29wZXJhdG9yX2ZhbGxiYWNrcyhfZGl2LCBvcGVyYXRvci5kaXYpCisKKyAgICBkZWYgX19mbG9vcmRpdl9fKGEsIGIpOgorICAgICAgICAiIiJhIC8vIGIiIiIKKyAgICAgICAgIyBXaWxsIGJlIG1hdGguZmxvb3IoYSAvIGIpIGluIDMuMC4KKyAgICAgICAgZGl2ID0gYSAvIGIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShkaXYsIFJhdGlvbmFsKToKKyAgICAgICAgICAgICMgdHJ1bmMobWF0aC5mbG9vcihkaXYpKSBkb2Vzbid0IHdvcmsgaWYgdGhlIHJhdGlvbmFsIGlzCisgICAgICAgICAgICAjIG1vcmUgcHJlY2lzZSB0aGFuIGEgZmxvYXQgYmVjYXVzZSB0aGUgaW50ZXJtZWRpYXRlCisgICAgICAgICAgICAjIHJvdW5kaW5nIG1heSBjcm9zcyBhbiBpbnRlZ2VyIGJvdW5kYXJ5LgorICAgICAgICAgICAgcmV0dXJuIGRpdi5udW1lcmF0b3IgLy8gZGl2LmRlbm9taW5hdG9yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbWF0aC5mbG9vcihkaXYpCisKKyAgICBkZWYgX19yZmxvb3JkaXZfXyhiLCBhKToKKyAgICAgICAgIiIiYSAvLyBiIiIiCisgICAgICAgICMgV2lsbCBiZSBtYXRoLmZsb29yKGEgLyBiKSBpbiAzLjAuCisgICAgICAgIGRpdiA9IGEgLyBiCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZGl2LCBSYXRpb25hbCk6CisgICAgICAgICAgICAjIHRydW5jKG1hdGguZmxvb3IoZGl2KSkgZG9lc24ndCB3b3JrIGlmIHRoZSByYXRpb25hbCBpcworICAgICAgICAgICAgIyBtb3JlIHByZWNpc2UgdGhhbiBhIGZsb2F0IGJlY2F1c2UgdGhlIGludGVybWVkaWF0ZQorICAgICAgICAgICAgIyByb3VuZGluZyBtYXkgY3Jvc3MgYW4gaW50ZWdlciBib3VuZGFyeS4KKyAgICAgICAgICAgIHJldHVybiBkaXYubnVtZXJhdG9yIC8vIGRpdi5kZW5vbWluYXRvcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG1hdGguZmxvb3IoZGl2KQorCisgICAgZGVmIF9fbW9kX18oYSwgYik6CisgICAgICAgICIiImEgJSBiIiIiCisgICAgICAgIGRpdiA9IGEgLy8gYgorICAgICAgICByZXR1cm4gYSAtIGIgKiBkaXYKKworICAgIGRlZiBfX3Jtb2RfXyhiLCBhKToKKyAgICAgICAgIiIiYSAlIGIiIiIKKyAgICAgICAgZGl2ID0gYSAvLyBiCisgICAgICAgIHJldHVybiBhIC0gYiAqIGRpdgorCisgICAgZGVmIF9fcG93X18oYSwgYik6CisgICAgICAgICIiImEgKiogYgorCisgICAgICAgIElmIGIgaXMgbm90IGFuIGludGVnZXIsIHRoZSByZXN1bHQgd2lsbCBiZSBhIGZsb2F0IG9yIGNvbXBsZXgKKyAgICAgICAgc2luY2Ugcm9vdHMgYXJlIGdlbmVyYWxseSBpcnJhdGlvbmFsLiBJZiBiIGlzIGFuIGludGVnZXIsIHRoZQorICAgICAgICByZXN1bHQgd2lsbCBiZSByYXRpb25hbC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShiLCBSYXRpb25hbCk6CisgICAgICAgICAgICBpZiBiLmRlbm9taW5hdG9yID09IDE6CisgICAgICAgICAgICAgICAgcG93ZXIgPSBiLm51bWVyYXRvcgorICAgICAgICAgICAgICAgIGlmIHBvd2VyID49IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGcmFjdGlvbihhLl9udW1lcmF0b3IgKiogcG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLl9kZW5vbWluYXRvciAqKiBwb3dlcikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRnJhY3Rpb24oYS5fZGVub21pbmF0b3IgKiogLXBvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5fbnVtZXJhdG9yICoqIC1wb3dlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBIGZyYWN0aW9uYWwgcG93ZXIgd2lsbCBnZW5lcmFsbHkgcHJvZHVjZSBhbgorICAgICAgICAgICAgICAgICMgaXJyYXRpb25hbCBudW1iZXIuCisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KGEpICoqIGZsb2F0KGIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoYSkgKiogYgorCisgICAgZGVmIF9fcnBvd19fKGIsIGEpOgorICAgICAgICAiIiJhICoqIGIiIiIKKyAgICAgICAgaWYgYi5fZGVub21pbmF0b3IgPT0gMSBhbmQgYi5fbnVtZXJhdG9yID49IDA6CisgICAgICAgICAgICAjIElmIGEgaXMgYW4gaW50LCBrZWVwIGl0IHRoYXQgd2F5IGlmIHBvc3NpYmxlLgorICAgICAgICAgICAgcmV0dXJuIGEgKiogYi5fbnVtZXJhdG9yCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhLCBSYXRpb25hbCk6CisgICAgICAgICAgICByZXR1cm4gRnJhY3Rpb24oYS5udW1lcmF0b3IsIGEuZGVub21pbmF0b3IpICoqIGIKKworICAgICAgICBpZiBiLl9kZW5vbWluYXRvciA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIGEgKiogYi5fbnVtZXJhdG9yCisKKyAgICAgICAgcmV0dXJuIGEgKiogZmxvYXQoYikKKworICAgIGRlZiBfX3Bvc19fKGEpOgorICAgICAgICAiIiIrYTogQ29lcmNlcyBhIHN1YmNsYXNzIGluc3RhbmNlIHRvIEZyYWN0aW9uIiIiCisgICAgICAgIHJldHVybiBGcmFjdGlvbihhLl9udW1lcmF0b3IsIGEuX2Rlbm9taW5hdG9yKQorCisgICAgZGVmIF9fbmVnX18oYSk6CisgICAgICAgICIiIi1hIiIiCisgICAgICAgIHJldHVybiBGcmFjdGlvbigtYS5fbnVtZXJhdG9yLCBhLl9kZW5vbWluYXRvcikKKworICAgIGRlZiBfX2Fic19fKGEpOgorICAgICAgICAiIiJhYnMoYSkiIiIKKyAgICAgICAgcmV0dXJuIEZyYWN0aW9uKGFicyhhLl9udW1lcmF0b3IpLCBhLl9kZW5vbWluYXRvcikKKworICAgIGRlZiBfX3RydW5jX18oYSk6CisgICAgICAgICIiInRydW5jKGEpIiIiCisgICAgICAgIGlmIGEuX251bWVyYXRvciA8IDA6CisgICAgICAgICAgICByZXR1cm4gLSgtYS5fbnVtZXJhdG9yIC8vIGEuX2Rlbm9taW5hdG9yKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGEuX251bWVyYXRvciAvLyBhLl9kZW5vbWluYXRvcgorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAiIiJoYXNoKHNlbGYpCisKKyAgICAgICAgVHJpY2t5IGJlY2F1c2UgdmFsdWVzIHRoYXQgYXJlIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBhcyBhCisgICAgICAgIGZsb2F0IG11c3QgaGF2ZSB0aGUgc2FtZSBoYXNoIGFzIHRoYXQgZmxvYXQuCisKKyAgICAgICAgIiIiCisgICAgICAgICMgWFhYIHNpbmNlIHRoaXMgbWV0aG9kIGlzIGV4cGVuc2l2ZSwgY29uc2lkZXIgY2FjaGluZyB0aGUgcmVzdWx0CisgICAgICAgIGlmIHNlbGYuX2Rlbm9taW5hdG9yID09IDE6CisgICAgICAgICAgICAjIEdldCBpbnRlZ2VycyByaWdodC4KKyAgICAgICAgICAgIHJldHVybiBoYXNoKHNlbGYuX251bWVyYXRvcikKKyAgICAgICAgIyBFeHBlbnNpdmUgY2hlY2ssIGJ1dCBkZWZpbml0ZWx5IGNvcnJlY3QuCisgICAgICAgIGlmIHNlbGYgPT0gZmxvYXQoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gaGFzaChmbG9hdChzZWxmKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVXNlIHR1cGxlJ3MgaGFzaCB0byBhdm9pZCBhIGhpZ2ggY29sbGlzaW9uIHJhdGUgb24KKyAgICAgICAgICAgICMgc2ltcGxlIGZyYWN0aW9ucy4KKyAgICAgICAgICAgIHJldHVybiBoYXNoKChzZWxmLl9udW1lcmF0b3IsIHNlbGYuX2Rlbm9taW5hdG9yKSkKKworICAgIGRlZiBfX2VxX18oYSwgYik6CisgICAgICAgICIiImEgPT0gYiIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKGIsIFJhdGlvbmFsKToKKyAgICAgICAgICAgIHJldHVybiAoYS5fbnVtZXJhdG9yID09IGIubnVtZXJhdG9yIGFuZAorICAgICAgICAgICAgICAgICAgICBhLl9kZW5vbWluYXRvciA9PSBiLmRlbm9taW5hdG9yKQorICAgICAgICBpZiBpc2luc3RhbmNlKGIsIG51bWJlcnMuQ29tcGxleCkgYW5kIGIuaW1hZyA9PSAwOgorICAgICAgICAgICAgYiA9IGIucmVhbAorICAgICAgICBpZiBpc2luc3RhbmNlKGIsIGZsb2F0KToKKyAgICAgICAgICAgIGlmIG1hdGguaXNuYW4oYikgb3IgbWF0aC5pc2luZihiKToKKyAgICAgICAgICAgICAgICAjIGNvbXBhcmlzb25zIHdpdGggYW4gaW5maW5pdHkgb3IgbmFuIHNob3VsZCBiZWhhdmUgaW4KKyAgICAgICAgICAgICAgICAjIHRoZSBzYW1lIHdheSBmb3IgYW55IGZpbml0ZSBhLCBzbyB0cmVhdCBhIGFzIHplcm8uCisgICAgICAgICAgICAgICAgcmV0dXJuIDAuMCA9PSBiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBhID09IGEuZnJvbV9mbG9hdChiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBTaW5jZSBhIGRvZXNuJ3Qga25vdyBob3cgdG8gY29tcGFyZSB3aXRoIGIsIGxldCdzIGdpdmUgYgorICAgICAgICAgICAgIyBhIGNoYW5jZSB0byBjb21wYXJlIGl0c2VsZiB3aXRoIGEuCisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgIGRlZiBfcmljaGNtcChzZWxmLCBvdGhlciwgb3ApOgorICAgICAgICAiIiJIZWxwZXIgZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzLCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCisKKyAgICAgICAgSW1wbGVtZW50IGNvbXBhcmlzb24gYmV0d2VlbiBhIFJhdGlvbmFsIGluc3RhbmNlIGBzZWxmYCwgYW5kCisgICAgICAgIGVpdGhlciBhbm90aGVyIFJhdGlvbmFsIGluc3RhbmNlIG9yIGEgZmxvYXQgYG90aGVyYC4gIElmCisgICAgICAgIGBvdGhlcmAgaXMgbm90IGEgUmF0aW9uYWwgaW5zdGFuY2Ugb3IgYSBmbG9hdCwgcmV0dXJuCisgICAgICAgIE5vdEltcGxlbWVudGVkLiBgb3BgIHNob3VsZCBiZSBvbmUgb2YgdGhlIHNpeCBzdGFuZGFyZAorICAgICAgICBjb21wYXJpc29uIG9wZXJhdG9ycy4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBjb252ZXJ0IG90aGVyIHRvIGEgUmF0aW9uYWwgaW5zdGFuY2Ugd2hlcmUgcmVhc29uYWJsZS4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgUmF0aW9uYWwpOgorICAgICAgICAgICAgcmV0dXJuIG9wKHNlbGYuX251bWVyYXRvciAqIG90aGVyLmRlbm9taW5hdG9yLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Rlbm9taW5hdG9yICogb3RoZXIubnVtZXJhdG9yKQorICAgICAgICAjIGNvbXBhcmlzb25zIHdpdGggY29tcGxleCBzaG91bGQgcmFpc2UgYSBUeXBlRXJyb3IsIGZvciBjb25zaXN0ZW5jeQorICAgICAgICAjIHdpdGggaW50PC0+Y29tcGxleCwgZmxvYXQ8LT5jb21wbGV4LCBhbmQgY29tcGxleDwtPmNvbXBsZXggY29tcGFyaXNvbnMuCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGNvbXBsZXgpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJubyBvcmRlcmluZyByZWxhdGlvbiBpcyBkZWZpbmVkIGZvciBjb21wbGV4IG51bWJlcnMiKQorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBmbG9hdCk6CisgICAgICAgICAgICBpZiBtYXRoLmlzbmFuKG90aGVyKSBvciBtYXRoLmlzaW5mKG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gb3AoMC4wLCBvdGhlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIG9wKHNlbGYsIHNlbGYuZnJvbV9mbG9hdChvdGhlcikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgIGRlZiBfX2x0X18oYSwgYik6CisgICAgICAgICIiImEgPCBiIiIiCisgICAgICAgIHJldHVybiBhLl9yaWNoY21wKGIsIG9wZXJhdG9yLmx0KQorCisgICAgZGVmIF9fZ3RfXyhhLCBiKToKKyAgICAgICAgIiIiYSA+IGIiIiIKKyAgICAgICAgcmV0dXJuIGEuX3JpY2hjbXAoYiwgb3BlcmF0b3IuZ3QpCisKKyAgICBkZWYgX19sZV9fKGEsIGIpOgorICAgICAgICAiIiJhIDw9IGIiIiIKKyAgICAgICAgcmV0dXJuIGEuX3JpY2hjbXAoYiwgb3BlcmF0b3IubGUpCisKKyAgICBkZWYgX19nZV9fKGEsIGIpOgorICAgICAgICAiIiJhID49IGIiIiIKKyAgICAgICAgcmV0dXJuIGEuX3JpY2hjbXAoYiwgb3BlcmF0b3IuZ2UpCisKKyAgICBkZWYgX19ub256ZXJvX18oYSk6CisgICAgICAgICIiImEgIT0gMCIiIgorICAgICAgICByZXR1cm4gYS5fbnVtZXJhdG9yICE9IDAKKworICAgICMgc3VwcG9ydCBmb3IgcGlja2xpbmcsIGNvcHksIGFuZCBkZWVwY29weQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi5fX2NsYXNzX18sIChzdHIoc2VsZiksKSkKKworICAgIGRlZiBfX2NvcHlfXyhzZWxmKToKKyAgICAgICAgaWYgdHlwZShzZWxmKSA9PSBGcmFjdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmICAgICAjIEknbSBpbW11dGFibGU7IHRoZXJlZm9yZSBJIGFtIG15IG93biBjbG9uZQorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fbnVtZXJhdG9yLCBzZWxmLl9kZW5vbWluYXRvcikKKworICAgIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbyk6CisgICAgICAgIGlmIHR5cGUoc2VsZikgPT0gRnJhY3Rpb246CisgICAgICAgICAgICByZXR1cm4gc2VsZiAgICAgIyBNeSBjb21wb25lbnRzIGFyZSBhbHNvIGltbXV0YWJsZQorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fbnVtZXJhdG9yLCBzZWxmLl9kZW5vbWluYXRvcikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZnJhY3Rpb25zLnB5YyBiL2xpYi9weXRob24yLjcvZnJhY3Rpb25zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzEzOTUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mcmFjdGlvbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZnJhY3Rpb25zLnB5byBiL2xpYi9weXRob24yLjcvZnJhY3Rpb25zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzEzOTUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mcmFjdGlvbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZnRwbGliLnB5IGIvbGliL3B5dGhvbjIuNy9mdHBsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyMjE4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZnRwbGliLnB5CkBAIC0wLDAgKzEsMTA0NiBAQAorIiIiQW4gRlRQIGNsaWVudCBjbGFzcyBhbmQgc29tZSBoZWxwZXIgZnVuY3Rpb25zLgorCitCYXNlZCBvbiBSRkMgOTU5OiBGaWxlIFRyYW5zZmVyIFByb3RvY29sIChGVFApLCBieSBKLiBQb3N0ZWwgYW5kIEouIFJleW5vbGRzCisKK0V4YW1wbGU6CisKKz4+PiBmcm9tIGZ0cGxpYiBpbXBvcnQgRlRQCis+Pj4gZnRwID0gRlRQKCdmdHAucHl0aG9uLm9yZycpICMgY29ubmVjdCB0byBob3N0LCBkZWZhdWx0IHBvcnQKKz4+PiBmdHAubG9naW4oKSAjIGRlZmF1bHQsIGkuZS46IHVzZXIgYW5vbnltb3VzLCBwYXNzd2QgYW5vbnltb3VzQAorJzIzMCBHdWVzdCBsb2dpbiBvaywgYWNjZXNzIHJlc3RyaWN0aW9ucyBhcHBseS4nCis+Pj4gZnRwLnJldHJsaW5lcygnTElTVCcpICMgbGlzdCBkaXJlY3RvcnkgY29udGVudHMKK3RvdGFsIDkKK2Ryd3hyLXhyLXggICA4IHJvb3QgICAgIHdoZWVsICAgICAgICAxMDI0IEphbiAgMyAgMTk5NCAuCitkcnd4ci14ci14ICAgOCByb290ICAgICB3aGVlbCAgICAgICAgMTAyNCBKYW4gIDMgIDE5OTQgLi4KK2Ryd3hyLXhyLXggICAyIHJvb3QgICAgIHdoZWVsICAgICAgICAxMDI0IEphbiAgMyAgMTk5NCBiaW4KK2Ryd3hyLXhyLXggICAyIHJvb3QgICAgIHdoZWVsICAgICAgICAxMDI0IEphbiAgMyAgMTk5NCBldGMKK2Qtd3hyd3hyLXggICAyIGZ0cCAgICAgIHdoZWVsICAgICAgICAxMDI0IFNlcCAgNSAxMzo0MyBpbmNvbWluZworZHJ3eHIteHIteCAgIDIgcm9vdCAgICAgd2hlZWwgICAgICAgIDEwMjQgTm92IDE3ICAxOTkzIGxpYgorZHJ3eHIteHIteCAgIDYgMTA5NCAgICAgd2hlZWwgICAgICAgIDEwMjQgU2VwIDEzIDE5OjA3IHB1YgorZHJ3eHIteHIteCAgIDMgcm9vdCAgICAgd2hlZWwgICAgICAgIDEwMjQgSmFuICAzICAxOTk0IHVzcgorLXJ3LXItLXItLSAgIDEgcm9vdCAgICAgcm9vdCAgICAgICAgICAzMTIgQXVnICAxICAxOTk0IHdlbGNvbWUubXNnCisnMjI2IFRyYW5zZmVyIGNvbXBsZXRlLicKKz4+PiBmdHAucXVpdCgpCisnMjIxIEdvb2RieWUuJworPj4+CisKK0EgbmljZSB0ZXN0IHRoYXQgcmV2ZWFscyBzb21lIG9mIHRoZSBuZXR3b3JrIGRpYWxvZ3VlIHdvdWxkIGJlOgorcHl0aG9uIGZ0cGxpYi5weSAtZCBsb2NhbGhvc3QgLWwgLXAgLWwKKyIiIgorCisjCisjIENoYW5nZXMgYW5kIGltcHJvdmVtZW50cyBzdWdnZXN0ZWQgYnkgU3RldmUgTWFqZXdza2kuCisjIE1vZGlmaWVkIGJ5IEphY2sgdG8gd29yayBvbiB0aGUgbWFjLgorIyBNb2RpZmllZCBieSBTaWVicmVuIHRvIHN1cHBvcnQgZG9jc3RyaW5ncyBhbmQgUEFTVi4KKyMgTW9kaWZpZWQgYnkgUGhpbCBTY2h3YXJ0eiB0byBhZGQgc3RvcmJpbmFyeSBhbmQgc3RvcmxpbmVzIGNhbGxiYWNrcy4KKyMgTW9kaWZpZWQgYnkgR2lhbXBhb2xvIFJvZG9sYScgdG8gYWRkIFRMUyBzdXBwb3J0LgorIworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworIyBJbXBvcnQgU09DS1MgbW9kdWxlIGlmIGl0IGV4aXN0cywgZWxzZSBzdGFuZGFyZCBzb2NrZXQgbW9kdWxlIHNvY2tldAordHJ5OgorICAgIGltcG9ydCBTT0NLUzsgc29ja2V0ID0gU09DS1M7IGRlbCBTT0NLUyAjIGltcG9ydCBTT0NLUyBhcyBzb2NrZXQKKyAgICBmcm9tIHNvY2tldCBpbXBvcnQgZ2V0ZnFkbjsgc29ja2V0LmdldGZxZG4gPSBnZXRmcWRuOyBkZWwgZ2V0ZnFkbgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBzb2NrZXQKK2Zyb20gc29ja2V0IGltcG9ydCBfR0xPQkFMX0RFRkFVTFRfVElNRU9VVAorCitfX2FsbF9fID0gWyJGVFAiLCJOZXRyYyJdCisKKyMgTWFnaWMgbnVtYmVyIGZyb20gPHNvY2tldC5oPgorTVNHX09PQiA9IDB4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgUHJvY2VzcyBkYXRhIG91dCBvZiBiYW5kCisKKworIyBUaGUgc3RhbmRhcmQgRlRQIHNlcnZlciBjb250cm9sIHBvcnQKK0ZUUF9QT1JUID0gMjEKKworCisjIEV4Y2VwdGlvbiByYWlzZWQgd2hlbiBhbiBlcnJvciBvciBpbnZhbGlkIHJlc3BvbnNlIGlzIHJlY2VpdmVkCitjbGFzcyBFcnJvcihFeGNlcHRpb24pOiBwYXNzCitjbGFzcyBlcnJvcl9yZXBseShFcnJvcik6IHBhc3MgICAgICAgICAgIyB1bmV4cGVjdGVkIFsxMjNdeHggcmVwbHkKK2NsYXNzIGVycm9yX3RlbXAoRXJyb3IpOiBwYXNzICAgICAgICAgICAjIDR4eCBlcnJvcnMKK2NsYXNzIGVycm9yX3Blcm0oRXJyb3IpOiBwYXNzICAgICAgICAgICAjIDV4eCBlcnJvcnMKK2NsYXNzIGVycm9yX3Byb3RvKEVycm9yKTogcGFzcyAgICAgICAgICAjIHJlc3BvbnNlIGRvZXMgbm90IGJlZ2luIHdpdGggWzEtNV0KKworCisjIEFsbCBleGNlcHRpb25zIChob3BlZnVsbHkpIHRoYXQgbWF5IGJlIHJhaXNlZCBoZXJlIGFuZCB0aGF0IGFyZW4ndAorIyAoYWx3YXlzKSBwcm9ncmFtbWluZyBlcnJvcnMgb24gb3VyIHNpZGUKK2FsbF9lcnJvcnMgPSAoRXJyb3IsIElPRXJyb3IsIEVPRkVycm9yKQorCisKKyMgTGluZSB0ZXJtaW5hdG9ycyAod2UgYWx3YXlzIG91dHB1dCBDUkxGLCBidXQgYWNjZXB0IGFueSBvZiBDUkxGLCBDUiwgTEYpCitDUkxGID0gJ1xyXG4nCisKKyMgVGhlIGNsYXNzIGl0c2VsZgorY2xhc3MgRlRQOgorCisgICAgJycnQW4gRlRQIGNsaWVudCBjbGFzcy4KKworICAgIFRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24sIGNhbGwgdGhlIGNsYXNzIHVzaW5nIHRoZXNlIGFyZ3VtZW50czoKKyAgICAgICAgICAgIGhvc3QsIHVzZXIsIHBhc3N3ZCwgYWNjdCwgdGltZW91dAorCisgICAgVGhlIGZpcnN0IGZvdXIgYXJndW1lbnRzIGFyZSBhbGwgc3RyaW5ncywgYW5kIGhhdmUgZGVmYXVsdCB2YWx1ZSAnJy4KKyAgICB0aW1lb3V0IG11c3QgYmUgbnVtZXJpYyBhbmQgZGVmYXVsdHMgdG8gTm9uZSBpZiBub3QgcGFzc2VkLAorICAgIG1lYW5pbmcgdGhhdCBubyB0aW1lb3V0IHdpbGwgYmUgc2V0IG9uIGFueSBmdHAgc29ja2V0KHMpCisgICAgSWYgYSB0aW1lb3V0IGlzIHBhc3NlZCwgdGhlbiB0aGlzIGlzIG5vdyB0aGUgZGVmYXVsdCB0aW1lb3V0IGZvciBhbGwgZnRwCisgICAgc29ja2V0IG9wZXJhdGlvbnMgZm9yIHRoaXMgaW5zdGFuY2UuCisKKyAgICBUaGVuIHVzZSBzZWxmLmNvbm5lY3QoKSB3aXRoIG9wdGlvbmFsIGhvc3QgYW5kIHBvcnQgYXJndW1lbnQuCisKKyAgICBUbyBkb3dubG9hZCBhIGZpbGUsIHVzZSBmdHAucmV0cmxpbmVzKCdSRVRSICcgKyBmaWxlbmFtZSksCisgICAgb3IgZnRwLnJldHJiaW5hcnkoKSB3aXRoIHNsaWdodGx5IGRpZmZlcmVudCBhcmd1bWVudHMuCisgICAgVG8gdXBsb2FkIGEgZmlsZSwgdXNlIGZ0cC5zdG9ybGluZXMoKSBvciBmdHAuc3RvcmJpbmFyeSgpLAorICAgIHdoaWNoIGhhdmUgYW4gb3BlbiBmaWxlIGFzIGFyZ3VtZW50IChzZWUgdGhlaXIgZGVmaW5pdGlvbnMKKyAgICBiZWxvdyBmb3IgZGV0YWlscykuCisgICAgVGhlIGRvd25sb2FkL3VwbG9hZCBmdW5jdGlvbnMgZmlyc3QgaXNzdWUgYXBwcm9wcmlhdGUgVFlQRQorICAgIGFuZCBQT1JUIG9yIFBBU1YgY29tbWFuZHMuCisnJycKKworICAgIGRlYnVnZ2luZyA9IDAKKyAgICBob3N0ID0gJycKKyAgICBwb3J0ID0gRlRQX1BPUlQKKyAgICBzb2NrID0gTm9uZQorICAgIGZpbGUgPSBOb25lCisgICAgd2VsY29tZSA9IE5vbmUKKyAgICBwYXNzaXZlc2VydmVyID0gMQorCisgICAgIyBJbml0aWFsaXphdGlvbiBtZXRob2QgKGNhbGxlZCBieSBjbGFzcyBpbnN0YW50aWF0aW9uKS4KKyAgICAjIEluaXRpYWxpemUgaG9zdCB0byBsb2NhbGhvc3QsIHBvcnQgdG8gc3RhbmRhcmQgZnRwIHBvcnQKKyAgICAjIE9wdGlvbmFsIGFyZ3VtZW50cyBhcmUgaG9zdCAoZm9yIGNvbm5lY3QoKSksCisgICAgIyBhbmQgdXNlciwgcGFzc3dkLCBhY2N0IChmb3IgbG9naW4oKSkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nJywgdXNlcj0nJywgcGFzc3dkPScnLCBhY2N0PScnLAorICAgICAgICAgICAgICAgICB0aW1lb3V0PV9HTE9CQUxfREVGQVVMVF9USU1FT1VUKToKKyAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICAgICAgICBpZiBob3N0OgorICAgICAgICAgICAgc2VsZi5jb25uZWN0KGhvc3QpCisgICAgICAgICAgICBpZiB1c2VyOgorICAgICAgICAgICAgICAgIHNlbGYubG9naW4odXNlciwgcGFzc3dkLCBhY2N0KQorCisgICAgZGVmIGNvbm5lY3Qoc2VsZiwgaG9zdD0nJywgcG9ydD0wLCB0aW1lb3V0PS05OTkpOgorICAgICAgICAnJydDb25uZWN0IHRvIGhvc3QuICBBcmd1bWVudHMgYXJlOgorICAgICAgICAgLSBob3N0OiBob3N0bmFtZSB0byBjb25uZWN0IHRvIChzdHJpbmcsIGRlZmF1bHQgcHJldmlvdXMgaG9zdCkKKyAgICAgICAgIC0gcG9ydDogcG9ydCB0byBjb25uZWN0IHRvIChpbnRlZ2VyLCBkZWZhdWx0IHByZXZpb3VzIHBvcnQpCisgICAgICAgICcnJworICAgICAgICBpZiBob3N0ICE9ICcnOgorICAgICAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBpZiBwb3J0ID4gMDoKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgaWYgdGltZW91dCAhPSAtOTk5OgorICAgICAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSwgc2VsZi50aW1lb3V0KQorICAgICAgICBzZWxmLmFmID0gc2VsZi5zb2NrLmZhbWlseQorICAgICAgICBzZWxmLmZpbGUgPSBzZWxmLnNvY2subWFrZWZpbGUoJ3JiJykKKyAgICAgICAgc2VsZi53ZWxjb21lID0gc2VsZi5nZXRyZXNwKCkKKyAgICAgICAgcmV0dXJuIHNlbGYud2VsY29tZQorCisgICAgZGVmIGdldHdlbGNvbWUoc2VsZik6CisgICAgICAgICcnJ0dldCB0aGUgd2VsY29tZSBtZXNzYWdlIGZyb20gdGhlIHNlcnZlci4KKyAgICAgICAgKHRoaXMgaXMgcmVhZCBhbmQgc3F1aXJyZWxlZCBhd2F5IGJ5IGNvbm5lY3QoKSknJycKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2dpbmc6CisgICAgICAgICAgICBwcmludCAnKndlbGNvbWUqJywgc2VsZi5zYW5pdGl6ZShzZWxmLndlbGNvbWUpCisgICAgICAgIHJldHVybiBzZWxmLndlbGNvbWUKKworICAgIGRlZiBzZXRfZGVidWdsZXZlbChzZWxmLCBsZXZlbCk6CisgICAgICAgICcnJ1NldCB0aGUgZGVidWdnaW5nIGxldmVsLgorICAgICAgICBUaGUgcmVxdWlyZWQgYXJndW1lbnQgbGV2ZWwgbWVhbnM6CisgICAgICAgIDA6IG5vIGRlYnVnZ2luZyBvdXRwdXQgKGRlZmF1bHQpCisgICAgICAgIDE6IHByaW50IGNvbW1hbmRzIGFuZCByZXNwb25zZXMgYnV0IG5vdCBib2R5IHRleHQgZXRjLgorICAgICAgICAyOiBhbHNvIHByaW50IHJhdyBsaW5lcyByZWFkIGFuZCBzZW50IGJlZm9yZSBzdHJpcHBpbmcgQ1IvTEYnJycKKyAgICAgICAgc2VsZi5kZWJ1Z2dpbmcgPSBsZXZlbAorICAgIGRlYnVnID0gc2V0X2RlYnVnbGV2ZWwKKworICAgIGRlZiBzZXRfcGFzdihzZWxmLCB2YWwpOgorICAgICAgICAnJydVc2UgcGFzc2l2ZSBvciBhY3RpdmUgbW9kZSBmb3IgZGF0YSB0cmFuc2ZlcnMuCisgICAgICAgIFdpdGggYSBmYWxzZSBhcmd1bWVudCwgdXNlIHRoZSBub3JtYWwgUE9SVCBtb2RlLAorICAgICAgICBXaXRoIGEgdHJ1ZSBhcmd1bWVudCwgdXNlIHRoZSBQQVNWIGNvbW1hbmQuJycnCisgICAgICAgIHNlbGYucGFzc2l2ZXNlcnZlciA9IHZhbAorCisgICAgIyBJbnRlcm5hbDogInNhbml0aXplIiBhIHN0cmluZyBmb3IgcHJpbnRpbmcKKyAgICBkZWYgc2FuaXRpemUoc2VsZiwgcyk6CisgICAgICAgIGlmIHNbOjVdID09ICdwYXNzICcgb3Igc1s6NV0gPT0gJ1BBU1MgJzoKKyAgICAgICAgICAgIGkgPSBsZW4ocykKKyAgICAgICAgICAgIHdoaWxlIGkgPiA1IGFuZCBzW2ktMV0gaW4gJ1xyXG4nOgorICAgICAgICAgICAgICAgIGkgPSBpLTEKKyAgICAgICAgICAgIHMgPSBzWzo1XSArICcqJyooaS01KSArIHNbaTpdCisgICAgICAgIHJldHVybiByZXByKHMpCisKKyAgICAjIEludGVybmFsOiBzZW5kIG9uZSBsaW5lIHRvIHRoZSBzZXJ2ZXIsIGFwcGVuZGluZyBDUkxGCisgICAgZGVmIHB1dGxpbmUoc2VsZiwgbGluZSk6CisgICAgICAgIGxpbmUgPSBsaW5lICsgQ1JMRgorICAgICAgICBpZiBzZWxmLmRlYnVnZ2luZyA+IDE6IHByaW50ICcqcHV0KicsIHNlbGYuc2FuaXRpemUobGluZSkKKyAgICAgICAgc2VsZi5zb2NrLnNlbmRhbGwobGluZSkKKworICAgICMgSW50ZXJuYWw6IHNlbmQgb25lIGNvbW1hbmQgdG8gdGhlIHNlcnZlciAodGhyb3VnaCBwdXRsaW5lKCkpCisgICAgZGVmIHB1dGNtZChzZWxmLCBsaW5lKToKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2dpbmc6IHByaW50ICcqY21kKicsIHNlbGYuc2FuaXRpemUobGluZSkKKyAgICAgICAgc2VsZi5wdXRsaW5lKGxpbmUpCisKKyAgICAjIEludGVybmFsOiByZXR1cm4gb25lIGxpbmUgZnJvbSB0aGUgc2VydmVyLCBzdHJpcHBpbmcgQ1JMRi4KKyAgICAjIFJhaXNlIEVPRkVycm9yIGlmIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZAorICAgIGRlZiBnZXRsaW5lKHNlbGYpOgorICAgICAgICBsaW5lID0gc2VsZi5maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2dpbmcgPiAxOgorICAgICAgICAgICAgcHJpbnQgJypnZXQqJywgc2VsZi5zYW5pdGl6ZShsaW5lKQorICAgICAgICBpZiBub3QgbGluZTogcmFpc2UgRU9GRXJyb3IKKyAgICAgICAgaWYgbGluZVstMjpdID09IENSTEY6IGxpbmUgPSBsaW5lWzotMl0KKyAgICAgICAgZWxpZiBsaW5lWy0xOl0gaW4gQ1JMRjogbGluZSA9IGxpbmVbOi0xXQorICAgICAgICByZXR1cm4gbGluZQorCisgICAgIyBJbnRlcm5hbDogZ2V0IGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLCB3aGljaCBtYXkgcG9zc2libHkKKyAgICAjIGNvbnNpc3Qgb2YgbXVsdGlwbGUgbGluZXMuICBSZXR1cm4gYSBzaW5nbGUgc3RyaW5nIHdpdGggbm8KKyAgICAjIHRyYWlsaW5nIENSTEYuICBJZiB0aGUgcmVzcG9uc2UgY29uc2lzdHMgb2YgbXVsdGlwbGUgbGluZXMsCisgICAgIyB0aGVzZSBhcmUgc2VwYXJhdGVkIGJ5ICdcbicgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nCisgICAgZGVmIGdldG11bHRpbGluZShzZWxmKToKKyAgICAgICAgbGluZSA9IHNlbGYuZ2V0bGluZSgpCisgICAgICAgIGlmIGxpbmVbMzo0XSA9PSAnLSc6CisgICAgICAgICAgICBjb2RlID0gbGluZVs6M10KKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgbmV4dGxpbmUgPSBzZWxmLmdldGxpbmUoKQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgKCdcbicgKyBuZXh0bGluZSkKKyAgICAgICAgICAgICAgICBpZiBuZXh0bGluZVs6M10gPT0gY29kZSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGxpbmVbMzo0XSAhPSAnLSc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBsaW5lCisKKyAgICAjIEludGVybmFsOiBnZXQgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuCisgICAgIyBSYWlzZSB2YXJpb3VzIGVycm9ycyBpZiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIGFuIGVycm9yCisgICAgZGVmIGdldHJlc3Aoc2VsZik6CisgICAgICAgIHJlc3AgPSBzZWxmLmdldG11bHRpbGluZSgpCisgICAgICAgIGlmIHNlbGYuZGVidWdnaW5nOiBwcmludCAnKnJlc3AqJywgc2VsZi5zYW5pdGl6ZShyZXNwKQorICAgICAgICBzZWxmLmxhc3RyZXNwID0gcmVzcFs6M10KKyAgICAgICAgYyA9IHJlc3BbOjFdCisgICAgICAgIGlmIGMgaW4gKCcxJywgJzInLCAnMycpOgorICAgICAgICAgICAgcmV0dXJuIHJlc3AKKyAgICAgICAgaWYgYyA9PSAnNCc6CisgICAgICAgICAgICByYWlzZSBlcnJvcl90ZW1wLCByZXNwCisgICAgICAgIGlmIGMgPT0gJzUnOgorICAgICAgICAgICAgcmFpc2UgZXJyb3JfcGVybSwgcmVzcAorICAgICAgICByYWlzZSBlcnJvcl9wcm90bywgcmVzcAorCisgICAgZGVmIHZvaWRyZXNwKHNlbGYpOgorICAgICAgICAiIiJFeHBlY3QgYSByZXNwb25zZSBiZWdpbm5pbmcgd2l0aCAnMicuIiIiCisgICAgICAgIHJlc3AgPSBzZWxmLmdldHJlc3AoKQorICAgICAgICBpZiByZXNwWzoxXSAhPSAnMic6CisgICAgICAgICAgICByYWlzZSBlcnJvcl9yZXBseSwgcmVzcAorICAgICAgICByZXR1cm4gcmVzcAorCisgICAgZGVmIGFib3J0KHNlbGYpOgorICAgICAgICAnJydBYm9ydCBhIGZpbGUgdHJhbnNmZXIuICBVc2VzIG91dC1vZi1iYW5kIGRhdGEuCisgICAgICAgIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBwcm9jZWR1cmUgZnJvbSB0aGUgUkZDIHRvIHNlbmQgVGVsbmV0CisgICAgICAgIElQIGFuZCBTeW5jaDsgdGhhdCBkb2Vzbid0IHNlZW0gdG8gd29yayB3aXRoIHRoZSBzZXJ2ZXJzIEkndmUKKyAgICAgICAgdHJpZWQuICBJbnN0ZWFkLCBqdXN0IHNlbmQgdGhlIEFCT1IgY29tbWFuZCBhcyBPT0IgZGF0YS4nJycKKyAgICAgICAgbGluZSA9ICdBQk9SJyArIENSTEYKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2dpbmcgPiAxOiBwcmludCAnKnB1dCB1cmdlbnQqJywgc2VsZi5zYW5pdGl6ZShsaW5lKQorICAgICAgICBzZWxmLnNvY2suc2VuZGFsbChsaW5lLCBNU0dfT09CKQorICAgICAgICByZXNwID0gc2VsZi5nZXRtdWx0aWxpbmUoKQorICAgICAgICBpZiByZXNwWzozXSBub3QgaW4gKCc0MjYnLCAnMjI1JywgJzIyNicpOgorICAgICAgICAgICAgcmFpc2UgZXJyb3JfcHJvdG8sIHJlc3AKKworICAgIGRlZiBzZW5kY21kKHNlbGYsIGNtZCk6CisgICAgICAgICcnJ1NlbmQgYSBjb21tYW5kIGFuZCByZXR1cm4gdGhlIHJlc3BvbnNlLicnJworICAgICAgICBzZWxmLnB1dGNtZChjbWQpCisgICAgICAgIHJldHVybiBzZWxmLmdldHJlc3AoKQorCisgICAgZGVmIHZvaWRjbWQoc2VsZiwgY21kKToKKyAgICAgICAgIiIiU2VuZCBhIGNvbW1hbmQgYW5kIGV4cGVjdCBhIHJlc3BvbnNlIGJlZ2lubmluZyB3aXRoICcyJy4iIiIKKyAgICAgICAgc2VsZi5wdXRjbWQoY21kKQorICAgICAgICByZXR1cm4gc2VsZi52b2lkcmVzcCgpCisKKyAgICBkZWYgc2VuZHBvcnQoc2VsZiwgaG9zdCwgcG9ydCk6CisgICAgICAgICcnJ1NlbmQgYSBQT1JUIGNvbW1hbmQgd2l0aCB0aGUgY3VycmVudCBob3N0IGFuZCB0aGUgZ2l2ZW4KKyAgICAgICAgcG9ydCBudW1iZXIuCisgICAgICAgICcnJworICAgICAgICBoYnl0ZXMgPSBob3N0LnNwbGl0KCcuJykKKyAgICAgICAgcGJ5dGVzID0gW3JlcHIocG9ydC8vMjU2KSwgcmVwcihwb3J0JTI1NildCisgICAgICAgIGJ5dGVzID0gaGJ5dGVzICsgcGJ5dGVzCisgICAgICAgIGNtZCA9ICdQT1JUICcgKyAnLCcuam9pbihieXRlcykKKyAgICAgICAgcmV0dXJuIHNlbGYudm9pZGNtZChjbWQpCisKKyAgICBkZWYgc2VuZGVwcnQoc2VsZiwgaG9zdCwgcG9ydCk6CisgICAgICAgICcnJ1NlbmQgYSBFUFJUIGNvbW1hbmQgd2l0aCB0aGUgY3VycmVudCBob3N0IGFuZCB0aGUgZ2l2ZW4gcG9ydCBudW1iZXIuJycnCisgICAgICAgIGFmID0gMAorICAgICAgICBpZiBzZWxmLmFmID09IHNvY2tldC5BRl9JTkVUOgorICAgICAgICAgICAgYWYgPSAxCisgICAgICAgIGlmIHNlbGYuYWYgPT0gc29ja2V0LkFGX0lORVQ2OgorICAgICAgICAgICAgYWYgPSAyCisgICAgICAgIGlmIGFmID09IDA6CisgICAgICAgICAgICByYWlzZSBlcnJvcl9wcm90bywgJ3Vuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5JworICAgICAgICBmaWVsZHMgPSBbJycsIHJlcHIoYWYpLCBob3N0LCByZXByKHBvcnQpLCAnJ10KKyAgICAgICAgY21kID0gJ0VQUlQgJyArICd8Jy5qb2luKGZpZWxkcykKKyAgICAgICAgcmV0dXJuIHNlbGYudm9pZGNtZChjbWQpCisKKyAgICBkZWYgbWFrZXBvcnQoc2VsZik6CisgICAgICAgICcnJ0NyZWF0ZSBhIG5ldyBzb2NrZXQgYW5kIHNlbmQgYSBQT1JUIGNvbW1hbmQgZm9yIGl0LicnJworICAgICAgICBlcnIgPSBOb25lCisgICAgICAgIHNvY2sgPSBOb25lCisgICAgICAgIGZvciByZXMgaW4gc29ja2V0LmdldGFkZHJpbmZvKE5vbmUsIDAsIHNlbGYuYWYsIHNvY2tldC5TT0NLX1NUUkVBTSwgMCwgc29ja2V0LkFJX1BBU1NJVkUpOgorICAgICAgICAgICAgYWYsIHNvY2t0eXBlLCBwcm90bywgY2Fub25uYW1lLCBzYSA9IHJlcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KGFmLCBzb2NrdHlwZSwgcHJvdG8pCisgICAgICAgICAgICAgICAgc29jay5iaW5kKHNhKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIGlmIHNvY2s6CisgICAgICAgICAgICAgICAgICAgIHNvY2suY2xvc2UoKQorICAgICAgICAgICAgICAgIHNvY2sgPSBOb25lCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIHNvY2sgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIGVyciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBlcnIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmVycm9yKCJnZXRhZGRyaW5mbyByZXR1cm5zIGFuIGVtcHR5IGxpc3QiKQorICAgICAgICBzb2NrLmxpc3RlbigxKQorICAgICAgICBwb3J0ID0gc29jay5nZXRzb2NrbmFtZSgpWzFdICMgR2V0IHByb3BlciBwb3J0CisgICAgICAgIGhvc3QgPSBzZWxmLnNvY2suZ2V0c29ja25hbWUoKVswXSAjIEdldCBwcm9wZXIgaG9zdAorICAgICAgICBpZiBzZWxmLmFmID09IHNvY2tldC5BRl9JTkVUOgorICAgICAgICAgICAgcmVzcCA9IHNlbGYuc2VuZHBvcnQoaG9zdCwgcG9ydCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3AgPSBzZWxmLnNlbmRlcHJ0KGhvc3QsIHBvcnQpCisgICAgICAgIGlmIHNlbGYudGltZW91dCBpcyBub3QgX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQ6CisgICAgICAgICAgICBzb2NrLnNldHRpbWVvdXQoc2VsZi50aW1lb3V0KQorICAgICAgICByZXR1cm4gc29jaworCisgICAgZGVmIG1ha2VwYXN2KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmFmID09IHNvY2tldC5BRl9JTkVUOgorICAgICAgICAgICAgaG9zdCwgcG9ydCA9IHBhcnNlMjI3KHNlbGYuc2VuZGNtZCgnUEFTVicpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaG9zdCwgcG9ydCA9IHBhcnNlMjI5KHNlbGYuc2VuZGNtZCgnRVBTVicpLCBzZWxmLnNvY2suZ2V0cGVlcm5hbWUoKSkKKyAgICAgICAgcmV0dXJuIGhvc3QsIHBvcnQKKworICAgIGRlZiBudHJhbnNmZXJjbWQoc2VsZiwgY21kLCByZXN0PU5vbmUpOgorICAgICAgICAiIiJJbml0aWF0ZSBhIHRyYW5zZmVyIG92ZXIgdGhlIGRhdGEgY29ubmVjdGlvbi4KKworICAgICAgICBJZiB0aGUgdHJhbnNmZXIgaXMgYWN0aXZlLCBzZW5kIGEgcG9ydCBjb21tYW5kIGFuZCB0aGUKKyAgICAgICAgdHJhbnNmZXIgY29tbWFuZCwgYW5kIGFjY2VwdCB0aGUgY29ubmVjdGlvbi4gIElmIHRoZSBzZXJ2ZXIgaXMKKyAgICAgICAgcGFzc2l2ZSwgc2VuZCBhIHBhc3YgY29tbWFuZCwgY29ubmVjdCB0byBpdCwgYW5kIHN0YXJ0IHRoZQorICAgICAgICB0cmFuc2ZlciBjb21tYW5kLiAgRWl0aGVyIHdheSwgcmV0dXJuIHRoZSBzb2NrZXQgZm9yIHRoZQorICAgICAgICBjb25uZWN0aW9uIGFuZCB0aGUgZXhwZWN0ZWQgc2l6ZSBvZiB0aGUgdHJhbnNmZXIuICBUaGUKKyAgICAgICAgZXhwZWN0ZWQgc2l6ZSBtYXkgYmUgTm9uZSBpZiBpdCBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4KKworICAgICAgICBPcHRpb25hbCBgcmVzdCcgYXJndW1lbnQgY2FuIGJlIGEgc3RyaW5nIHRoYXQgaXMgc2VudCBhcyB0aGUKKyAgICAgICAgYXJndW1lbnQgdG8gYSBSRVNUIGNvbW1hbmQuICBUaGlzIGlzIGVzc2VudGlhbGx5IGEgc2VydmVyCisgICAgICAgIG1hcmtlciB1c2VkIHRvIHRlbGwgdGhlIHNlcnZlciB0byBza2lwIG92ZXIgYW55IGRhdGEgdXAgdG8gdGhlCisgICAgICAgIGdpdmVuIG1hcmtlci4KKyAgICAgICAgIiIiCisgICAgICAgIHNpemUgPSBOb25lCisgICAgICAgIGlmIHNlbGYucGFzc2l2ZXNlcnZlcjoKKyAgICAgICAgICAgIGhvc3QsIHBvcnQgPSBzZWxmLm1ha2VwYXN2KCkKKyAgICAgICAgICAgIGNvbm4gPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKGhvc3QsIHBvcnQpLCBzZWxmLnRpbWVvdXQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgcmVzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kY21kKCJSRVNUICVzIiAlIHJlc3QpCisgICAgICAgICAgICAgICAgcmVzcCA9IHNlbGYuc2VuZGNtZChjbWQpCisgICAgICAgICAgICAgICAgIyBTb21lIHNlcnZlcnMgYXBwYXJlbnRseSBzZW5kIGEgMjAwIHJlcGx5IHRvCisgICAgICAgICAgICAgICAgIyBhIExJU1Qgb3IgU1RPUiBjb21tYW5kLCBiZWZvcmUgdGhlIDE1MCByZXBseQorICAgICAgICAgICAgICAgICMgKGFuZCB3YXkgYmVmb3JlIHRoZSAyMjYgcmVwbHkpLiBUaGlzIHNlZW1zIHRvCisgICAgICAgICAgICAgICAgIyBiZSBpbiB2aW9sYXRpb24gb2YgdGhlIHByb3RvY29sICh3aGljaCBvbmx5IGFsbG93cworICAgICAgICAgICAgICAgICMgMXh4IG9yIGVycm9yIG1lc3NhZ2VzIGZvciBMSVNUKSwgc28gd2UganVzdCBkaXNjYXJkCisgICAgICAgICAgICAgICAgIyB0aGlzIHJlc3BvbnNlLgorICAgICAgICAgICAgICAgIGlmIHJlc3BbMF0gPT0gJzInOgorICAgICAgICAgICAgICAgICAgICByZXNwID0gc2VsZi5nZXRyZXNwKCkKKyAgICAgICAgICAgICAgICBpZiByZXNwWzBdICE9ICcxJzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3JfcmVwbHksIHJlc3AKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc29jayA9IHNlbGYubWFrZXBvcnQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHJlc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZGNtZCgiUkVTVCAlcyIgJSByZXN0KQorICAgICAgICAgICAgICAgIHJlc3AgPSBzZWxmLnNlbmRjbWQoY21kKQorICAgICAgICAgICAgICAgICMgU2VlIGFib3ZlLgorICAgICAgICAgICAgICAgIGlmIHJlc3BbMF0gPT0gJzInOgorICAgICAgICAgICAgICAgICAgICByZXNwID0gc2VsZi5nZXRyZXNwKCkKKyAgICAgICAgICAgICAgICBpZiByZXNwWzBdICE9ICcxJzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3JfcmVwbHksIHJlc3AKKyAgICAgICAgICAgICAgICBjb25uLCBzb2NrYWRkciA9IHNvY2suYWNjZXB0KCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnRpbWVvdXQgaXMgbm90IF9HTE9CQUxfREVGQVVMVF9USU1FT1VUOgorICAgICAgICAgICAgICAgICAgICBjb25uLnNldHRpbWVvdXQoc2VsZi50aW1lb3V0KQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzb2NrLmNsb3NlKCkKKyAgICAgICAgaWYgcmVzcFs6M10gPT0gJzE1MCc6CisgICAgICAgICAgICAjIHRoaXMgaXMgY29uZGl0aW9uYWwgaW4gY2FzZSB3ZSByZWNlaXZlZCBhIDEyNQorICAgICAgICAgICAgc2l6ZSA9IHBhcnNlMTUwKHJlc3ApCisgICAgICAgIHJldHVybiBjb25uLCBzaXplCisKKyAgICBkZWYgdHJhbnNmZXJjbWQoc2VsZiwgY21kLCByZXN0PU5vbmUpOgorICAgICAgICAiIiJMaWtlIG50cmFuc2ZlcmNtZCgpIGJ1dCByZXR1cm5zIG9ubHkgdGhlIHNvY2tldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYubnRyYW5zZmVyY21kKGNtZCwgcmVzdClbMF0KKworICAgIGRlZiBsb2dpbihzZWxmLCB1c2VyID0gJycsIHBhc3N3ZCA9ICcnLCBhY2N0ID0gJycpOgorICAgICAgICAnJydMb2dpbiwgZGVmYXVsdCBhbm9ueW1vdXMuJycnCisgICAgICAgIGlmIG5vdCB1c2VyOiB1c2VyID0gJ2Fub255bW91cycKKyAgICAgICAgaWYgbm90IHBhc3N3ZDogcGFzc3dkID0gJycKKyAgICAgICAgaWYgbm90IGFjY3Q6IGFjY3QgPSAnJworICAgICAgICBpZiB1c2VyID09ICdhbm9ueW1vdXMnIGFuZCBwYXNzd2QgaW4gKCcnLCAnLScpOgorICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBhbm9ueW1vdXMgZnRwIHBhc3N3b3JkIHNwZWNpZmllZAorICAgICAgICAgICAgIyB0aGVuIHdlJ2xsIGp1c3QgdXNlIGFub255bW91c0AKKyAgICAgICAgICAgICMgV2UgZG9uJ3Qgc2VuZCBhbnkgb3RoZXIgdGhpbmcgYmVjYXVzZToKKyAgICAgICAgICAgICMgLSBXZSB3YW50IHRvIHJlbWFpbiBhbm9ueW1vdXMKKyAgICAgICAgICAgICMgLSBXZSB3YW50IHRvIHN0b3AgU1BBTQorICAgICAgICAgICAgIyAtIFdlIGRvbid0IHdhbnQgdG8gbGV0IGZ0cCBzaXRlcyB0byBkaXNjcmltaW5hdGUgYnkgdGhlIHVzZXIsCisgICAgICAgICAgICAjICAgaG9zdCBvciBjb3VudHJ5LgorICAgICAgICAgICAgcGFzc3dkID0gcGFzc3dkICsgJ2Fub255bW91c0AnCisgICAgICAgIHJlc3AgPSBzZWxmLnNlbmRjbWQoJ1VTRVIgJyArIHVzZXIpCisgICAgICAgIGlmIHJlc3BbMF0gPT0gJzMnOiByZXNwID0gc2VsZi5zZW5kY21kKCdQQVNTICcgKyBwYXNzd2QpCisgICAgICAgIGlmIHJlc3BbMF0gPT0gJzMnOiByZXNwID0gc2VsZi5zZW5kY21kKCdBQ0NUICcgKyBhY2N0KQorICAgICAgICBpZiByZXNwWzBdICE9ICcyJzoKKyAgICAgICAgICAgIHJhaXNlIGVycm9yX3JlcGx5LCByZXNwCisgICAgICAgIHJldHVybiByZXNwCisKKyAgICBkZWYgcmV0cmJpbmFyeShzZWxmLCBjbWQsIGNhbGxiYWNrLCBibG9ja3NpemU9ODE5MiwgcmVzdD1Ob25lKToKKyAgICAgICAgIiIiUmV0cmlldmUgZGF0YSBpbiBiaW5hcnkgbW9kZS4gIEEgbmV3IHBvcnQgaXMgY3JlYXRlZCBmb3IgeW91LgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgY21kOiBBIFJFVFIgY29tbWFuZC4KKyAgICAgICAgICBjYWxsYmFjazogQSBzaW5nbGUgcGFyYW1ldGVyIGNhbGxhYmxlIHRvIGJlIGNhbGxlZCBvbiBlYWNoCisgICAgICAgICAgICAgICAgICAgIGJsb2NrIG9mIGRhdGEgcmVhZC4KKyAgICAgICAgICBibG9ja3NpemU6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICBzb2NrZXQgYXQgb25lIHRpbWUuICBbZGVmYXVsdDogODE5Ml0KKyAgICAgICAgICByZXN0OiBQYXNzZWQgdG8gdHJhbnNmZXJjbWQoKS4gIFtkZWZhdWx0OiBOb25lXQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgVGhlIHJlc3BvbnNlIGNvZGUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnZvaWRjbWQoJ1RZUEUgSScpCisgICAgICAgIGNvbm4gPSBzZWxmLnRyYW5zZmVyY21kKGNtZCwgcmVzdCkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGRhdGEgPSBjb25uLnJlY3YoYmxvY2tzaXplKQorICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEpCisgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICByZXR1cm4gc2VsZi52b2lkcmVzcCgpCisKKyAgICBkZWYgcmV0cmxpbmVzKHNlbGYsIGNtZCwgY2FsbGJhY2sgPSBOb25lKToKKyAgICAgICAgIiIiUmV0cmlldmUgZGF0YSBpbiBsaW5lIG1vZGUuICBBIG5ldyBwb3J0IGlzIGNyZWF0ZWQgZm9yIHlvdS4KKworICAgICAgICBBcmdzOgorICAgICAgICAgIGNtZDogQSBSRVRSLCBMSVNULCBOTFNULCBvciBNTFNEIGNvbW1hbmQuCisgICAgICAgICAgY2FsbGJhY2s6IEFuIG9wdGlvbmFsIHNpbmdsZSBwYXJhbWV0ZXIgY2FsbGFibGUgdGhhdCBpcyBjYWxsZWQKKyAgICAgICAgICAgICAgICAgICAgZm9yIGVhY2ggbGluZSB3aXRoIHRoZSB0cmFpbGluZyBDUkxGIHN0cmlwcGVkLgorICAgICAgICAgICAgICAgICAgICBbZGVmYXVsdDogcHJpbnRfbGluZSgpXQorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgVGhlIHJlc3BvbnNlIGNvZGUuCisgICAgICAgICIiIgorICAgICAgICBpZiBjYWxsYmFjayBpcyBOb25lOiBjYWxsYmFjayA9IHByaW50X2xpbmUKKyAgICAgICAgcmVzcCA9IHNlbGYuc2VuZGNtZCgnVFlQRSBBJykKKyAgICAgICAgY29ubiA9IHNlbGYudHJhbnNmZXJjbWQoY21kKQorICAgICAgICBmcCA9IGNvbm4ubWFrZWZpbGUoJ3JiJykKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnZ2luZyA+IDI6IHByaW50ICcqcmV0cionLCByZXByKGxpbmUpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbGluZVstMjpdID09IENSTEY6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0yXQorICAgICAgICAgICAgZWxpZiBsaW5lWy0xOl0gPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCisgICAgICAgICAgICBjYWxsYmFjayhsaW5lKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICByZXR1cm4gc2VsZi52b2lkcmVzcCgpCisKKyAgICBkZWYgc3RvcmJpbmFyeShzZWxmLCBjbWQsIGZwLCBibG9ja3NpemU9ODE5MiwgY2FsbGJhY2s9Tm9uZSwgcmVzdD1Ob25lKToKKyAgICAgICAgIiIiU3RvcmUgYSBmaWxlIGluIGJpbmFyeSBtb2RlLiAgQSBuZXcgcG9ydCBpcyBjcmVhdGVkIGZvciB5b3UuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICBjbWQ6IEEgU1RPUiBjb21tYW5kLgorICAgICAgICAgIGZwOiBBIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCBhIHJlYWQobnVtX2J5dGVzKSBtZXRob2QuCisgICAgICAgICAgYmxvY2tzaXplOiBUaGUgbWF4aW11bSBkYXRhIHNpemUgdG8gcmVhZCBmcm9tIGZwIGFuZCBzZW5kIG92ZXIKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25uZWN0aW9uIGF0IG9uY2UuICBbZGVmYXVsdDogODE5Ml0KKyAgICAgICAgICBjYWxsYmFjazogQW4gb3B0aW9uYWwgc2luZ2xlIHBhcmFtZXRlciBjYWxsYWJsZSB0aGF0IGlzIGNhbGxlZCBvbgorICAgICAgICAgICAgICAgICAgICBlYWNoIGJsb2NrIG9mIGRhdGEgYWZ0ZXIgaXQgaXMgc2VudC4gIFtkZWZhdWx0OiBOb25lXQorICAgICAgICAgIHJlc3Q6IFBhc3NlZCB0byB0cmFuc2ZlcmNtZCgpLiAgW2RlZmF1bHQ6IE5vbmVdCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBUaGUgcmVzcG9uc2UgY29kZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudm9pZGNtZCgnVFlQRSBJJykKKyAgICAgICAgY29ubiA9IHNlbGYudHJhbnNmZXJjbWQoY21kLCByZXN0KQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgYnVmID0gZnAucmVhZChibG9ja3NpemUpCisgICAgICAgICAgICBpZiBub3QgYnVmOiBicmVhaworICAgICAgICAgICAgY29ubi5zZW5kYWxsKGJ1ZikKKyAgICAgICAgICAgIGlmIGNhbGxiYWNrOiBjYWxsYmFjayhidWYpCisgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICByZXR1cm4gc2VsZi52b2lkcmVzcCgpCisKKyAgICBkZWYgc3RvcmxpbmVzKHNlbGYsIGNtZCwgZnAsIGNhbGxiYWNrPU5vbmUpOgorICAgICAgICAiIiJTdG9yZSBhIGZpbGUgaW4gbGluZSBtb2RlLiAgQSBuZXcgcG9ydCBpcyBjcmVhdGVkIGZvciB5b3UuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICBjbWQ6IEEgU1RPUiBjb21tYW5kLgorICAgICAgICAgIGZwOiBBIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCBhIHJlYWRsaW5lKCkgbWV0aG9kLgorICAgICAgICAgIGNhbGxiYWNrOiBBbiBvcHRpb25hbCBzaW5nbGUgcGFyYW1ldGVyIGNhbGxhYmxlIHRoYXQgaXMgY2FsbGVkIG9uCisgICAgICAgICAgICAgICAgICAgIGVhY2ggbGluZSBhZnRlciBpdCBpcyBzZW50LiAgW2RlZmF1bHQ6IE5vbmVdCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBUaGUgcmVzcG9uc2UgY29kZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudm9pZGNtZCgnVFlQRSBBJykKKyAgICAgICAgY29ubiA9IHNlbGYudHJhbnNmZXJjbWQoY21kKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgYnVmID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGJ1ZjogYnJlYWsKKyAgICAgICAgICAgIGlmIGJ1ZlstMjpdICE9IENSTEY6CisgICAgICAgICAgICAgICAgaWYgYnVmWy0xXSBpbiBDUkxGOiBidWYgPSBidWZbOi0xXQorICAgICAgICAgICAgICAgIGJ1ZiA9IGJ1ZiArIENSTEYKKyAgICAgICAgICAgIGNvbm4uc2VuZGFsbChidWYpCisgICAgICAgICAgICBpZiBjYWxsYmFjazogY2FsbGJhY2soYnVmKQorICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYudm9pZHJlc3AoKQorCisgICAgZGVmIGFjY3Qoc2VsZiwgcGFzc3dvcmQpOgorICAgICAgICAnJydTZW5kIG5ldyBhY2NvdW50IG5hbWUuJycnCisgICAgICAgIGNtZCA9ICdBQ0NUICcgKyBwYXNzd29yZAorICAgICAgICByZXR1cm4gc2VsZi52b2lkY21kKGNtZCkKKworICAgIGRlZiBubHN0KHNlbGYsICphcmdzKToKKyAgICAgICAgJycnUmV0dXJuIGEgbGlzdCBvZiBmaWxlcyBpbiBhIGdpdmVuIGRpcmVjdG9yeSAoZGVmYXVsdCB0aGUgY3VycmVudCkuJycnCisgICAgICAgIGNtZCA9ICdOTFNUJworICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICBjbWQgPSBjbWQgKyAoJyAnICsgYXJnKQorICAgICAgICBmaWxlcyA9IFtdCisgICAgICAgIHNlbGYucmV0cmxpbmVzKGNtZCwgZmlsZXMuYXBwZW5kKQorICAgICAgICByZXR1cm4gZmlsZXMKKworICAgIGRlZiBkaXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICAnJydMaXN0IGEgZGlyZWN0b3J5IGluIGxvbmcgZm9ybS4KKyAgICAgICAgQnkgZGVmYXVsdCBsaXN0IGN1cnJlbnQgZGlyZWN0b3J5IHRvIHN0ZG91dC4KKyAgICAgICAgT3B0aW9uYWwgbGFzdCBhcmd1bWVudCBpcyBjYWxsYmFjayBmdW5jdGlvbjsgYWxsCisgICAgICAgIG5vbi1lbXB0eSBhcmd1bWVudHMgYmVmb3JlIGl0IGFyZSBjb25jYXRlbmF0ZWQgdG8gdGhlCisgICAgICAgIExJU1QgY29tbWFuZC4gIChUaGlzICpzaG91bGQqIG9ubHkgYmUgdXNlZCBmb3IgYSBwYXRobmFtZS4pJycnCisgICAgICAgIGNtZCA9ICdMSVNUJworICAgICAgICBmdW5jID0gTm9uZQorICAgICAgICBpZiBhcmdzWy0xOl0gYW5kIHR5cGUoYXJnc1stMV0pICE9IHR5cGUoJycpOgorICAgICAgICAgICAgYXJncywgZnVuYyA9IGFyZ3NbOi0xXSwgYXJnc1stMV0KKyAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICAgICAgaWYgYXJnOgorICAgICAgICAgICAgICAgIGNtZCA9IGNtZCArICgnICcgKyBhcmcpCisgICAgICAgIHNlbGYucmV0cmxpbmVzKGNtZCwgZnVuYykKKworICAgIGRlZiByZW5hbWUoc2VsZiwgZnJvbW5hbWUsIHRvbmFtZSk6CisgICAgICAgICcnJ1JlbmFtZSBhIGZpbGUuJycnCisgICAgICAgIHJlc3AgPSBzZWxmLnNlbmRjbWQoJ1JORlIgJyArIGZyb21uYW1lKQorICAgICAgICBpZiByZXNwWzBdICE9ICczJzoKKyAgICAgICAgICAgIHJhaXNlIGVycm9yX3JlcGx5LCByZXNwCisgICAgICAgIHJldHVybiBzZWxmLnZvaWRjbWQoJ1JOVE8gJyArIHRvbmFtZSkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAnJydEZWxldGUgYSBmaWxlLicnJworICAgICAgICByZXNwID0gc2VsZi5zZW5kY21kKCdERUxFICcgKyBmaWxlbmFtZSkKKyAgICAgICAgaWYgcmVzcFs6M10gaW4gKCcyNTAnLCAnMjAwJyk6CisgICAgICAgICAgICByZXR1cm4gcmVzcAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgZXJyb3JfcmVwbHksIHJlc3AKKworICAgIGRlZiBjd2Qoc2VsZiwgZGlybmFtZSk6CisgICAgICAgICcnJ0NoYW5nZSB0byBhIGRpcmVjdG9yeS4nJycKKyAgICAgICAgaWYgZGlybmFtZSA9PSAnLi4nOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZvaWRjbWQoJ0NEVVAnKQorICAgICAgICAgICAgZXhjZXB0IGVycm9yX3Blcm0sIG1zZzoKKyAgICAgICAgICAgICAgICBpZiBtc2cuYXJnc1swXVs6M10gIT0gJzUwMCc6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsaWYgZGlybmFtZSA9PSAnJzoKKyAgICAgICAgICAgIGRpcm5hbWUgPSAnLicgICMgZG9lcyBub3RoaW5nLCBidXQgY291bGQgcmV0dXJuIGVycm9yCisgICAgICAgIGNtZCA9ICdDV0QgJyArIGRpcm5hbWUKKyAgICAgICAgcmV0dXJuIHNlbGYudm9pZGNtZChjbWQpCisKKyAgICBkZWYgc2l6ZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICcnJ1JldHJpZXZlIHRoZSBzaXplIG9mIGEgZmlsZS4nJycKKyAgICAgICAgIyBUaGUgU0laRSBjb21tYW5kIGlzIGRlZmluZWQgaW4gUkZDLTM2NTkKKyAgICAgICAgcmVzcCA9IHNlbGYuc2VuZGNtZCgnU0laRSAnICsgZmlsZW5hbWUpCisgICAgICAgIGlmIHJlc3BbOjNdID09ICcyMTMnOgorICAgICAgICAgICAgcyA9IHJlc3BbMzpdLnN0cmlwKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50KHMpCisgICAgICAgICAgICBleGNlcHQgKE92ZXJmbG93RXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIHJldHVybiBsb25nKHMpCisKKyAgICBkZWYgbWtkKHNlbGYsIGRpcm5hbWUpOgorICAgICAgICAnJydNYWtlIGEgZGlyZWN0b3J5LCByZXR1cm4gaXRzIGZ1bGwgcGF0aG5hbWUuJycnCisgICAgICAgIHJlc3AgPSBzZWxmLnNlbmRjbWQoJ01LRCAnICsgZGlybmFtZSkKKyAgICAgICAgcmV0dXJuIHBhcnNlMjU3KHJlc3ApCisKKyAgICBkZWYgcm1kKHNlbGYsIGRpcm5hbWUpOgorICAgICAgICAnJydSZW1vdmUgYSBkaXJlY3RvcnkuJycnCisgICAgICAgIHJldHVybiBzZWxmLnZvaWRjbWQoJ1JNRCAnICsgZGlybmFtZSkKKworICAgIGRlZiBwd2Qoc2VsZik6CisgICAgICAgICcnJ1JldHVybiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LicnJworICAgICAgICByZXNwID0gc2VsZi5zZW5kY21kKCdQV0QnKQorICAgICAgICByZXR1cm4gcGFyc2UyNTcocmVzcCkKKworICAgIGRlZiBxdWl0KHNlbGYpOgorICAgICAgICAnJydRdWl0LCBhbmQgY2xvc2UgdGhlIGNvbm5lY3Rpb24uJycnCisgICAgICAgIHJlc3AgPSBzZWxmLnZvaWRjbWQoJ1FVSVQnKQorICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIHJlc3AKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgJycnQ2xvc2UgdGhlIGNvbm5lY3Rpb24gd2l0aG91dCBhc3N1bWluZyBhbnl0aGluZyBhYm91dCBpdC4nJycKKyAgICAgICAgaWYgc2VsZi5maWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5zb2NrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKyAgICAgICAgc2VsZi5maWxlID0gc2VsZi5zb2NrID0gTm9uZQorCit0cnk6CisgICAgaW1wb3J0IHNzbAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3MgRlRQX1RMUyhGVFApOgorICAgICAgICAnJydBIEZUUCBzdWJjbGFzcyB3aGljaCBhZGRzIFRMUyBzdXBwb3J0IHRvIEZUUCBhcyBkZXNjcmliZWQKKyAgICAgICAgaW4gUkZDLTQyMTcuCisKKyAgICAgICAgQ29ubmVjdCBhcyB1c3VhbCB0byBwb3J0IDIxIGltcGxpY2l0bHkgc2VjdXJpbmcgdGhlIEZUUCBjb250cm9sCisgICAgICAgIGNvbm5lY3Rpb24gYmVmb3JlIGF1dGhlbnRpY2F0aW5nLgorCisgICAgICAgIFNlY3VyaW5nIHRoZSBkYXRhIGNvbm5lY3Rpb24gcmVxdWlyZXMgdXNlciB0byBleHBsaWNpdGx5IGFzaworICAgICAgICBmb3IgaXQgYnkgY2FsbGluZyBwcm90X3AoKSBtZXRob2QuCisKKyAgICAgICAgVXNhZ2UgZXhhbXBsZToKKyAgICAgICAgPj4+IGZyb20gZnRwbGliIGltcG9ydCBGVFBfVExTCisgICAgICAgID4+PiBmdHBzID0gRlRQX1RMUygnZnRwLnB5dGhvbi5vcmcnKQorICAgICAgICA+Pj4gZnRwcy5sb2dpbigpICAjIGxvZ2luIGFub255bW91c2x5IHByZXZpb3VzbHkgc2VjdXJpbmcgY29udHJvbCBjaGFubmVsCisgICAgICAgICcyMzAgR3Vlc3QgbG9naW4gb2ssIGFjY2VzcyByZXN0cmljdGlvbnMgYXBwbHkuJworICAgICAgICA+Pj4gZnRwcy5wcm90X3AoKSAgIyBzd2l0Y2ggdG8gc2VjdXJlIGRhdGEgY29ubmVjdGlvbgorICAgICAgICAnMjAwIFByb3RlY3Rpb24gbGV2ZWwgc2V0IHRvIFAnCisgICAgICAgID4+PiBmdHBzLnJldHJsaW5lcygnTElTVCcpICAjIGxpc3QgZGlyZWN0b3J5IGNvbnRlbnQgc2VjdXJlbHkKKyAgICAgICAgdG90YWwgOQorICAgICAgICBkcnd4ci14ci14ICAgOCByb290ICAgICB3aGVlbCAgICAgICAgMTAyNCBKYW4gIDMgIDE5OTQgLgorICAgICAgICBkcnd4ci14ci14ICAgOCByb290ICAgICB3aGVlbCAgICAgICAgMTAyNCBKYW4gIDMgIDE5OTQgLi4KKyAgICAgICAgZHJ3eHIteHIteCAgIDIgcm9vdCAgICAgd2hlZWwgICAgICAgIDEwMjQgSmFuICAzICAxOTk0IGJpbgorICAgICAgICBkcnd4ci14ci14ICAgMiByb290ICAgICB3aGVlbCAgICAgICAgMTAyNCBKYW4gIDMgIDE5OTQgZXRjCisgICAgICAgIGQtd3hyd3hyLXggICAyIGZ0cCAgICAgIHdoZWVsICAgICAgICAxMDI0IFNlcCAgNSAxMzo0MyBpbmNvbWluZworICAgICAgICBkcnd4ci14ci14ICAgMiByb290ICAgICB3aGVlbCAgICAgICAgMTAyNCBOb3YgMTcgIDE5OTMgbGliCisgICAgICAgIGRyd3hyLXhyLXggICA2IDEwOTQgICAgIHdoZWVsICAgICAgICAxMDI0IFNlcCAxMyAxOTowNyBwdWIKKyAgICAgICAgZHJ3eHIteHIteCAgIDMgcm9vdCAgICAgd2hlZWwgICAgICAgIDEwMjQgSmFuICAzICAxOTk0IHVzcgorICAgICAgICAtcnctci0tci0tICAgMSByb290ICAgICByb290ICAgICAgICAgIDMxMiBBdWcgIDEgIDE5OTQgd2VsY29tZS5tc2cKKyAgICAgICAgJzIyNiBUcmFuc2ZlciBjb21wbGV0ZS4nCisgICAgICAgID4+PiBmdHBzLnF1aXQoKQorICAgICAgICAnMjIxIEdvb2RieWUuJworICAgICAgICA+Pj4KKyAgICAgICAgJycnCisgICAgICAgIHNzbF92ZXJzaW9uID0gc3NsLlBST1RPQ09MX1RMU3YxCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9JycsIHVzZXI9JycsIHBhc3N3ZD0nJywgYWNjdD0nJywga2V5ZmlsZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9Tm9uZSwgdGltZW91dD1fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCk6CisgICAgICAgICAgICBzZWxmLmtleWZpbGUgPSBrZXlmaWxlCisgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKKyAgICAgICAgICAgIHNlbGYuX3Byb3RfcCA9IEZhbHNlCisgICAgICAgICAgICBGVFAuX19pbml0X18oc2VsZiwgaG9zdCwgdXNlciwgcGFzc3dkLCBhY2N0LCB0aW1lb3V0KQorCisgICAgICAgIGRlZiBsb2dpbihzZWxmLCB1c2VyPScnLCBwYXNzd2Q9JycsIGFjY3Q9JycsIHNlY3VyZT1UcnVlKToKKyAgICAgICAgICAgIGlmIHNlY3VyZSBhbmQgbm90IGlzaW5zdGFuY2Uoc2VsZi5zb2NrLCBzc2wuU1NMU29ja2V0KToKKyAgICAgICAgICAgICAgICBzZWxmLmF1dGgoKQorICAgICAgICAgICAgcmV0dXJuIEZUUC5sb2dpbihzZWxmLCB1c2VyLCBwYXNzd2QsIGFjY3QpCisKKyAgICAgICAgZGVmIGF1dGgoc2VsZik6CisgICAgICAgICAgICAnJydTZXQgdXAgc2VjdXJlIGNvbnRyb2wgY29ubmVjdGlvbiBieSB1c2luZyBUTFMvU1NMLicnJworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnNvY2ssIHNzbC5TU0xTb2NrZXQpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkFscmVhZHkgdXNpbmcgVExTIikKKyAgICAgICAgICAgIGlmIHNlbGYuc3NsX3ZlcnNpb24gPT0gc3NsLlBST1RPQ09MX1RMU3YxOgorICAgICAgICAgICAgICAgIHJlc3AgPSBzZWxmLnZvaWRjbWQoJ0FVVEggVExTJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzcCA9IHNlbGYudm9pZGNtZCgnQVVUSCBTU0wnKQorICAgICAgICAgICAgc2VsZi5zb2NrID0gc3NsLndyYXBfc29ja2V0KHNlbGYuc29jaywgc2VsZi5rZXlmaWxlLCBzZWxmLmNlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNlbGYuc3NsX3ZlcnNpb24pCisgICAgICAgICAgICBzZWxmLmZpbGUgPSBzZWxmLnNvY2subWFrZWZpbGUobW9kZT0ncmInKQorICAgICAgICAgICAgcmV0dXJuIHJlc3AKKworICAgICAgICBkZWYgcHJvdF9wKHNlbGYpOgorICAgICAgICAgICAgJycnU2V0IHVwIHNlY3VyZSBkYXRhIGNvbm5lY3Rpb24uJycnCisgICAgICAgICAgICAjIFBST1QgZGVmaW5lcyB3aGV0aGVyIG9yIG5vdCB0aGUgZGF0YSBjaGFubmVsIGlzIHRvIGJlIHByb3RlY3RlZC4KKyAgICAgICAgICAgICMgVGhvdWdoIFJGQy0yMjI4IGRlZmluZXMgZm91ciBwb3NzaWJsZSBwcm90ZWN0aW9uIGxldmVscywKKyAgICAgICAgICAgICMgUkZDLTQyMTcgb25seSByZWNvbW1lbmRzIHR3bywgQ2xlYXIgYW5kIFByaXZhdGUuCisgICAgICAgICAgICAjIENsZWFyIChQUk9UIEMpIG1lYW5zIHRoYXQgbm8gc2VjdXJpdHkgaXMgdG8gYmUgdXNlZCBvbiB0aGUKKyAgICAgICAgICAgICMgZGF0YS1jaGFubmVsLCBQcml2YXRlIChQUk9UIFApIG1lYW5zIHRoYXQgdGhlIGRhdGEtY2hhbm5lbAorICAgICAgICAgICAgIyBzaG91bGQgYmUgcHJvdGVjdGVkIGJ5IFRMUy4KKyAgICAgICAgICAgICMgUEJTWiBjb21tYW5kIE1VU1Qgc3RpbGwgYmUgaXNzdWVkLCBidXQgbXVzdCBoYXZlIGEgcGFyYW1ldGVyIG9mCisgICAgICAgICAgICAjICcwJyB0byBpbmRpY2F0ZSB0aGF0IG5vIGJ1ZmZlcmluZyBpcyB0YWtpbmcgcGxhY2UgYW5kIHRoZSBkYXRhCisgICAgICAgICAgICAjIGNvbm5lY3Rpb24gc2hvdWxkIG5vdCBiZSBlbmNhcHN1bGF0ZWQuCisgICAgICAgICAgICBzZWxmLnZvaWRjbWQoJ1BCU1ogMCcpCisgICAgICAgICAgICByZXNwID0gc2VsZi52b2lkY21kKCdQUk9UIFAnKQorICAgICAgICAgICAgc2VsZi5fcHJvdF9wID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIHJlc3AKKworICAgICAgICBkZWYgcHJvdF9jKHNlbGYpOgorICAgICAgICAgICAgJycnU2V0IHVwIGNsZWFyIHRleHQgZGF0YSBjb25uZWN0aW9uLicnJworICAgICAgICAgICAgcmVzcCA9IHNlbGYudm9pZGNtZCgnUFJPVCBDJykKKyAgICAgICAgICAgIHNlbGYuX3Byb3RfcCA9IEZhbHNlCisgICAgICAgICAgICByZXR1cm4gcmVzcAorCisgICAgICAgICMgLS0tIE92ZXJyaWRkZW4gRlRQIG1ldGhvZHMKKworICAgICAgICBkZWYgbnRyYW5zZmVyY21kKHNlbGYsIGNtZCwgcmVzdD1Ob25lKToKKyAgICAgICAgICAgIGNvbm4sIHNpemUgPSBGVFAubnRyYW5zZmVyY21kKHNlbGYsIGNtZCwgcmVzdCkKKyAgICAgICAgICAgIGlmIHNlbGYuX3Byb3RfcDoKKyAgICAgICAgICAgICAgICBjb25uID0gc3NsLndyYXBfc29ja2V0KGNvbm4sIHNlbGYua2V5ZmlsZSwgc2VsZi5jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNlbGYuc3NsX3ZlcnNpb24pCisgICAgICAgICAgICByZXR1cm4gY29ubiwgc2l6ZQorCisgICAgICAgIGRlZiByZXRyYmluYXJ5KHNlbGYsIGNtZCwgY2FsbGJhY2ssIGJsb2Nrc2l6ZT04MTkyLCByZXN0PU5vbmUpOgorICAgICAgICAgICAgc2VsZi52b2lkY21kKCdUWVBFIEknKQorICAgICAgICAgICAgY29ubiA9IHNlbGYudHJhbnNmZXJjbWQoY21kLCByZXN0KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBjb25uLnJlY3YoYmxvY2tzaXplKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEpCisgICAgICAgICAgICAgICAgIyBzaHV0ZG93biBzc2wgbGF5ZXIKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNvbm4sIHNzbC5TU0xTb2NrZXQpOgorICAgICAgICAgICAgICAgICAgICBjb25uLnVud3JhcCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYudm9pZHJlc3AoKQorCisgICAgICAgIGRlZiByZXRybGluZXMoc2VsZiwgY21kLCBjYWxsYmFjayA9IE5vbmUpOgorICAgICAgICAgICAgaWYgY2FsbGJhY2sgaXMgTm9uZTogY2FsbGJhY2sgPSBwcmludF9saW5lCisgICAgICAgICAgICByZXNwID0gc2VsZi5zZW5kY21kKCdUWVBFIEEnKQorICAgICAgICAgICAgY29ubiA9IHNlbGYudHJhbnNmZXJjbWQoY21kKQorICAgICAgICAgICAgZnAgPSBjb25uLm1ha2VmaWxlKCdyYicpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2dpbmcgPiAyOiBwcmludCAnKnJldHIqJywgcmVwcihsaW5lKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVbLTI6XSA9PSBDUkxGOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0yXQorICAgICAgICAgICAgICAgICAgICBlbGlmIGxpbmVbLTE6XSA9PSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhsaW5lKQorICAgICAgICAgICAgICAgICMgc2h1dGRvd24gc3NsIGxheWVyCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjb25uLCBzc2wuU1NMU29ja2V0KToKKyAgICAgICAgICAgICAgICAgICAgY29ubi51bndyYXAoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi52b2lkcmVzcCgpCisKKyAgICAgICAgZGVmIHN0b3JiaW5hcnkoc2VsZiwgY21kLCBmcCwgYmxvY2tzaXplPTgxOTIsIGNhbGxiYWNrPU5vbmUsIHJlc3Q9Tm9uZSk6CisgICAgICAgICAgICBzZWxmLnZvaWRjbWQoJ1RZUEUgSScpCisgICAgICAgICAgICBjb25uID0gc2VsZi50cmFuc2ZlcmNtZChjbWQsIHJlc3QpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICAgICAgYnVmID0gZnAucmVhZChibG9ja3NpemUpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBidWY6IGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGNvbm4uc2VuZGFsbChidWYpCisgICAgICAgICAgICAgICAgICAgIGlmIGNhbGxiYWNrOiBjYWxsYmFjayhidWYpCisgICAgICAgICAgICAgICAgIyBzaHV0ZG93biBzc2wgbGF5ZXIKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNvbm4sIHNzbC5TU0xTb2NrZXQpOgorICAgICAgICAgICAgICAgICAgICBjb25uLnVud3JhcCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYudm9pZHJlc3AoKQorCisgICAgICAgIGRlZiBzdG9ybGluZXMoc2VsZiwgY21kLCBmcCwgY2FsbGJhY2s9Tm9uZSk6CisgICAgICAgICAgICBzZWxmLnZvaWRjbWQoJ1RZUEUgQScpCisgICAgICAgICAgICBjb25uID0gc2VsZi50cmFuc2ZlcmNtZChjbWQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICAgICAgYnVmID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgYnVmOiBicmVhaworICAgICAgICAgICAgICAgICAgICBpZiBidWZbLTI6XSAhPSBDUkxGOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYnVmWy0xXSBpbiBDUkxGOiBidWYgPSBidWZbOi0xXQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gYnVmICsgQ1JMRgorICAgICAgICAgICAgICAgICAgICBjb25uLnNlbmRhbGwoYnVmKQorICAgICAgICAgICAgICAgICAgICBpZiBjYWxsYmFjazogY2FsbGJhY2soYnVmKQorICAgICAgICAgICAgICAgICMgc2h1dGRvd24gc3NsIGxheWVyCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjb25uLCBzc2wuU1NMU29ja2V0KToKKyAgICAgICAgICAgICAgICAgICAgY29ubi51bndyYXAoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZvaWRyZXNwKCkKKworICAgIF9fYWxsX18uYXBwZW5kKCdGVFBfVExTJykKKyAgICBhbGxfZXJyb3JzID0gKEVycm9yLCBJT0Vycm9yLCBFT0ZFcnJvciwgc3NsLlNTTEVycm9yKQorCisKK18xNTBfcmUgPSBOb25lCisKK2RlZiBwYXJzZTE1MChyZXNwKToKKyAgICAnJydQYXJzZSB0aGUgJzE1MCcgcmVzcG9uc2UgZm9yIGEgUkVUUiByZXF1ZXN0LgorICAgIFJldHVybnMgdGhlIGV4cGVjdGVkIHRyYW5zZmVyIHNpemUgb3IgTm9uZTsgc2l6ZSBpcyBub3QgZ3VhcmFudGVlZCB0bworICAgIGJlIHByZXNlbnQgaW4gdGhlIDE1MCBtZXNzYWdlLgorICAgICcnJworICAgIGlmIHJlc3BbOjNdICE9ICcxNTAnOgorICAgICAgICByYWlzZSBlcnJvcl9yZXBseSwgcmVzcAorICAgIGdsb2JhbCBfMTUwX3JlCisgICAgaWYgXzE1MF9yZSBpcyBOb25lOgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgXzE1MF9yZSA9IHJlLmNvbXBpbGUoIjE1MCAuKiBcKChcZCspIGJ5dGVzXCkiLCByZS5JR05PUkVDQVNFKQorICAgIG0gPSBfMTUwX3JlLm1hdGNoKHJlc3ApCisgICAgaWYgbm90IG06CisgICAgICAgIHJldHVybiBOb25lCisgICAgcyA9IG0uZ3JvdXAoMSkKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBpbnQocykKKyAgICBleGNlcHQgKE92ZXJmbG93RXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICByZXR1cm4gbG9uZyhzKQorCisKK18yMjdfcmUgPSBOb25lCisKK2RlZiBwYXJzZTIyNyhyZXNwKToKKyAgICAnJydQYXJzZSB0aGUgJzIyNycgcmVzcG9uc2UgZm9yIGEgUEFTViByZXF1ZXN0LgorICAgIFJhaXNlcyBlcnJvcl9wcm90byBpZiBpdCBkb2VzIG5vdCBjb250YWluICcoaDEsaDIsaDMsaDQscDEscDIpJworICAgIFJldHVybiAoJ2hvc3QuYWRkci5hcy5udW1iZXJzJywgcG9ydCMpIHR1cGxlLicnJworCisgICAgaWYgcmVzcFs6M10gIT0gJzIyNyc6CisgICAgICAgIHJhaXNlIGVycm9yX3JlcGx5LCByZXNwCisgICAgZ2xvYmFsIF8yMjdfcmUKKyAgICBpZiBfMjI3X3JlIGlzIE5vbmU6CisgICAgICAgIGltcG9ydCByZQorICAgICAgICBfMjI3X3JlID0gcmUuY29tcGlsZShyJyhcZCspLChcZCspLChcZCspLChcZCspLChcZCspLChcZCspJykKKyAgICBtID0gXzIyN19yZS5zZWFyY2gocmVzcCkKKyAgICBpZiBub3QgbToKKyAgICAgICAgcmFpc2UgZXJyb3JfcHJvdG8sIHJlc3AKKyAgICBudW1iZXJzID0gbS5ncm91cHMoKQorICAgIGhvc3QgPSAnLicuam9pbihudW1iZXJzWzo0XSkKKyAgICBwb3J0ID0gKGludChudW1iZXJzWzRdKSA8PCA4KSArIGludChudW1iZXJzWzVdKQorICAgIHJldHVybiBob3N0LCBwb3J0CisKKworZGVmIHBhcnNlMjI5KHJlc3AsIHBlZXIpOgorICAgICcnJ1BhcnNlIHRoZSAnMjI5JyByZXNwb25zZSBmb3IgYSBFUFNWIHJlcXVlc3QuCisgICAgUmFpc2VzIGVycm9yX3Byb3RvIGlmIGl0IGRvZXMgbm90IGNvbnRhaW4gJyh8fHxwb3J0fCknCisgICAgUmV0dXJuICgnaG9zdC5hZGRyLmFzLm51bWJlcnMnLCBwb3J0IykgdHVwbGUuJycnCisKKyAgICBpZiByZXNwWzozXSAhPSAnMjI5JzoKKyAgICAgICAgcmFpc2UgZXJyb3JfcmVwbHksIHJlc3AKKyAgICBsZWZ0ID0gcmVzcC5maW5kKCcoJykKKyAgICBpZiBsZWZ0IDwgMDogcmFpc2UgZXJyb3JfcHJvdG8sIHJlc3AKKyAgICByaWdodCA9IHJlc3AuZmluZCgnKScsIGxlZnQgKyAxKQorICAgIGlmIHJpZ2h0IDwgMDoKKyAgICAgICAgcmFpc2UgZXJyb3JfcHJvdG8sIHJlc3AgIyBzaG91bGQgY29udGFpbiAnKHx8fHBvcnR8KScKKyAgICBpZiByZXNwW2xlZnQgKyAxXSAhPSByZXNwW3JpZ2h0IC0gMV06CisgICAgICAgIHJhaXNlIGVycm9yX3Byb3RvLCByZXNwCisgICAgcGFydHMgPSByZXNwW2xlZnQgKyAxOnJpZ2h0XS5zcGxpdChyZXNwW2xlZnQrMV0pCisgICAgaWYgbGVuKHBhcnRzKSAhPSA1OgorICAgICAgICByYWlzZSBlcnJvcl9wcm90bywgcmVzcAorICAgIGhvc3QgPSBwZWVyWzBdCisgICAgcG9ydCA9IGludChwYXJ0c1szXSkKKyAgICByZXR1cm4gaG9zdCwgcG9ydAorCisKK2RlZiBwYXJzZTI1NyhyZXNwKToKKyAgICAnJydQYXJzZSB0aGUgJzI1NycgcmVzcG9uc2UgZm9yIGEgTUtEIG9yIFBXRCByZXF1ZXN0LgorICAgIFRoaXMgaXMgYSByZXNwb25zZSB0byBhIE1LRCBvciBQV0QgcmVxdWVzdDogYSBkaXJlY3RvcnkgbmFtZS4KKyAgICBSZXR1cm5zIHRoZSBkaXJlY3RvcnluYW1lIGluIHRoZSAyNTcgcmVwbHkuJycnCisKKyAgICBpZiByZXNwWzozXSAhPSAnMjU3JzoKKyAgICAgICAgcmFpc2UgZXJyb3JfcmVwbHksIHJlc3AKKyAgICBpZiByZXNwWzM6NV0gIT0gJyAiJzoKKyAgICAgICAgcmV0dXJuICcnICMgTm90IGNvbXBsaWFudCB0byBSRkMgOTU5LCBidXQgVU5JWCBmdHBkIGRvZXMgdGhpcworICAgIGRpcm5hbWUgPSAnJworICAgIGkgPSA1CisgICAgbiA9IGxlbihyZXNwKQorICAgIHdoaWxlIGkgPCBuOgorICAgICAgICBjID0gcmVzcFtpXQorICAgICAgICBpID0gaSsxCisgICAgICAgIGlmIGMgPT0gJyInOgorICAgICAgICAgICAgaWYgaSA+PSBuIG9yIHJlc3BbaV0gIT0gJyInOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpID0gaSsxCisgICAgICAgIGRpcm5hbWUgPSBkaXJuYW1lICsgYworICAgIHJldHVybiBkaXJuYW1lCisKKworZGVmIHByaW50X2xpbmUobGluZSk6CisgICAgJycnRGVmYXVsdCByZXRybGluZXMgY2FsbGJhY2sgdG8gcHJpbnQgYSBsaW5lLicnJworICAgIHByaW50IGxpbmUKKworCitkZWYgZnRwY3Aoc291cmNlLCBzb3VyY2VuYW1lLCB0YXJnZXQsIHRhcmdldG5hbWUgPSAnJywgdHlwZSA9ICdJJyk6CisgICAgJycnQ29weSBmaWxlIGZyb20gb25lIEZUUC1pbnN0YW5jZSB0byBhbm90aGVyLicnJworICAgIGlmIG5vdCB0YXJnZXRuYW1lOiB0YXJnZXRuYW1lID0gc291cmNlbmFtZQorICAgIHR5cGUgPSAnVFlQRSAnICsgdHlwZQorICAgIHNvdXJjZS52b2lkY21kKHR5cGUpCisgICAgdGFyZ2V0LnZvaWRjbWQodHlwZSkKKyAgICBzb3VyY2Vob3N0LCBzb3VyY2Vwb3J0ID0gcGFyc2UyMjcoc291cmNlLnNlbmRjbWQoJ1BBU1YnKSkKKyAgICB0YXJnZXQuc2VuZHBvcnQoc291cmNlaG9zdCwgc291cmNlcG9ydCkKKyAgICAjIFJGQyA5NTk6IHRoZSB1c2VyIG11c3QgImxpc3RlbiIgWy4uLl0gQkVGT1JFIHNlbmRpbmcgdGhlCisgICAgIyB0cmFuc2ZlciByZXF1ZXN0LgorICAgICMgU286IFNUT1IgYmVmb3JlIFJFVFIsIGJlY2F1c2UgaGVyZSB0aGUgdGFyZ2V0IGlzIGEgInVzZXIiLgorICAgIHRyZXBseSA9IHRhcmdldC5zZW5kY21kKCdTVE9SICcgKyB0YXJnZXRuYW1lKQorICAgIGlmIHRyZXBseVs6M10gbm90IGluICgnMTI1JywgJzE1MCcpOiByYWlzZSBlcnJvcl9wcm90byAgIyBSRkMgOTU5CisgICAgc3JlcGx5ID0gc291cmNlLnNlbmRjbWQoJ1JFVFIgJyArIHNvdXJjZW5hbWUpCisgICAgaWYgc3JlcGx5WzozXSBub3QgaW4gKCcxMjUnLCAnMTUwJyk6IHJhaXNlIGVycm9yX3Byb3RvICAjIFJGQyA5NTkKKyAgICBzb3VyY2Uudm9pZHJlc3AoKQorICAgIHRhcmdldC52b2lkcmVzcCgpCisKKworY2xhc3MgTmV0cmM6CisgICAgIiIiQ2xhc3MgdG8gcGFyc2UgJiBwcm92aWRlIGFjY2VzcyB0byAnbmV0cmMnIGZvcm1hdCBmaWxlcy4KKworICAgIFNlZSB0aGUgbmV0cmMoNCkgbWFuIHBhZ2UgZm9yIGluZm9ybWF0aW9uIG9uIHRoZSBmaWxlIGZvcm1hdC4KKworICAgIFdBUk5JTkc6IFRoaXMgY2xhc3MgaXMgb2Jzb2xldGUgLS0gdXNlIG1vZHVsZSBuZXRyYyBpbnN0ZWFkLgorCisgICAgIiIiCisgICAgX19kZWZ1c2VyID0gTm9uZQorICAgIF9fZGVmcGFzc3dkID0gTm9uZQorICAgIF9fZGVmYWNjdCA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZT1Ob25lKToKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmICJIT01FIiBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKG9zLmVudmlyb25bIkhPTUUiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLm5ldHJjIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJzcGVjaWZ5IGZpbGUgdG8gbG9hZCBvciBzZXQgJEhPTUUiCisgICAgICAgIHNlbGYuX19ob3N0cyA9IHt9CisgICAgICAgIHNlbGYuX19tYWNyb3MgPSB7fQorICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICJyIikKKyAgICAgICAgaW5fbWFjcm8gPSAwCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgICAgICBpZiBpbl9tYWNybyBhbmQgbGluZS5zdHJpcCgpOgorICAgICAgICAgICAgICAgIG1hY3JvX2xpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIGluX21hY3JvOgorICAgICAgICAgICAgICAgIHNlbGYuX19tYWNyb3NbbWFjcm9fbmFtZV0gPSB0dXBsZShtYWNyb19saW5lcykKKyAgICAgICAgICAgICAgICBpbl9tYWNybyA9IDAKKyAgICAgICAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCisgICAgICAgICAgICBob3N0ID0gdXNlciA9IHBhc3N3ZCA9IGFjY3QgPSBOb25lCisgICAgICAgICAgICBkZWZhdWx0ID0gMAorICAgICAgICAgICAgaSA9IDAKKyAgICAgICAgICAgIHdoaWxlIGkgPCBsZW4od29yZHMpOgorICAgICAgICAgICAgICAgIHcxID0gd29yZHNbaV0KKyAgICAgICAgICAgICAgICBpZiBpKzEgPCBsZW4od29yZHMpOgorICAgICAgICAgICAgICAgICAgICB3MiA9IHdvcmRzW2kgKyAxXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHcyID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIHcxID09ICdkZWZhdWx0JzoKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA9IDEKKyAgICAgICAgICAgICAgICBlbGlmIHcxID09ICdtYWNoaW5lJyBhbmQgdzI6CisgICAgICAgICAgICAgICAgICAgIGhvc3QgPSB3Mi5sb3dlcigpCisgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAgICAgICAgIGVsaWYgdzEgPT0gJ2xvZ2luJyBhbmQgdzI6CisgICAgICAgICAgICAgICAgICAgIHVzZXIgPSB3MgorICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgICAgICBlbGlmIHcxID09ICdwYXNzd29yZCcgYW5kIHcyOgorICAgICAgICAgICAgICAgICAgICBwYXNzd2QgPSB3MgorICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgICAgICBlbGlmIHcxID09ICdhY2NvdW50JyBhbmQgdzI6CisgICAgICAgICAgICAgICAgICAgIGFjY3QgPSB3MgorICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgICAgICBlbGlmIHcxID09ICdtYWNkZWYnIGFuZCB3MjoKKyAgICAgICAgICAgICAgICAgICAgbWFjcm9fbmFtZSA9IHcyCisgICAgICAgICAgICAgICAgICAgIG1hY3JvX2xpbmVzID0gW10KKyAgICAgICAgICAgICAgICAgICAgaW5fbWFjcm8gPSAxCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgICAgICBpZiBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHNlbGYuX19kZWZ1c2VyID0gdXNlciBvciBzZWxmLl9fZGVmdXNlcgorICAgICAgICAgICAgICAgIHNlbGYuX19kZWZwYXNzd2QgPSBwYXNzd2Qgb3Igc2VsZi5fX2RlZnBhc3N3ZAorICAgICAgICAgICAgICAgIHNlbGYuX19kZWZhY2N0ID0gYWNjdCBvciBzZWxmLl9fZGVmYWNjdAorICAgICAgICAgICAgaWYgaG9zdDoKKyAgICAgICAgICAgICAgICBpZiBob3N0IGluIHNlbGYuX19ob3N0czoKKyAgICAgICAgICAgICAgICAgICAgb3VzZXIsIG9wYXNzd2QsIG9hY2N0ID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2hvc3RzW2hvc3RdCisgICAgICAgICAgICAgICAgICAgIHVzZXIgPSB1c2VyIG9yIG91c2VyCisgICAgICAgICAgICAgICAgICAgIHBhc3N3ZCA9IHBhc3N3ZCBvciBvcGFzc3dkCisgICAgICAgICAgICAgICAgICAgIGFjY3QgPSBhY2N0IG9yIG9hY2N0CisgICAgICAgICAgICAgICAgc2VsZi5fX2hvc3RzW2hvc3RdID0gdXNlciwgcGFzc3dkLCBhY2N0CisgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiBnZXRfaG9zdHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgaG9zdHMgbWVudGlvbmVkIGluIHRoZSAubmV0cmMgZmlsZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19ob3N0cy5rZXlzKCkKKworICAgIGRlZiBnZXRfYWNjb3VudChzZWxmLCBob3N0KToKKyAgICAgICAgIiIiUmV0dXJucyBsb2dpbiBpbmZvcm1hdGlvbiBmb3IgdGhlIG5hbWVkIGhvc3QuCisKKyAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHRyaXBsZSBjb250YWluaW5nIHVzZXJpZCwKKyAgICAgICAgcGFzc3dvcmQsIGFuZCB0aGUgYWNjb3VudGluZyBmaWVsZC4KKworICAgICAgICAiIiIKKyAgICAgICAgaG9zdCA9IGhvc3QubG93ZXIoKQorICAgICAgICB1c2VyID0gcGFzc3dkID0gYWNjdCA9IE5vbmUKKyAgICAgICAgaWYgaG9zdCBpbiBzZWxmLl9faG9zdHM6CisgICAgICAgICAgICB1c2VyLCBwYXNzd2QsIGFjY3QgPSBzZWxmLl9faG9zdHNbaG9zdF0KKyAgICAgICAgdXNlciA9IHVzZXIgb3Igc2VsZi5fX2RlZnVzZXIKKyAgICAgICAgcGFzc3dkID0gcGFzc3dkIG9yIHNlbGYuX19kZWZwYXNzd2QKKyAgICAgICAgYWNjdCA9IGFjY3Qgb3Igc2VsZi5fX2RlZmFjY3QKKyAgICAgICAgcmV0dXJuIHVzZXIsIHBhc3N3ZCwgYWNjdAorCisgICAgZGVmIGdldF9tYWNyb3Moc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIGRlZmluZWQgbWFjcm8gbmFtZXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fbWFjcm9zLmtleXMoKQorCisgICAgZGVmIGdldF9tYWNybyhzZWxmLCBtYWNybyk6CisgICAgICAgICIiIlJldHVybiBhIHNlcXVlbmNlIG9mIGxpbmVzIHdoaWNoIGRlZmluZSBhIG5hbWVkIG1hY3JvLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX21hY3Jvc1ttYWNyb10KKworCisKK2RlZiB0ZXN0KCk6CisgICAgJycnVGVzdCBwcm9ncmFtLgorICAgIFVzYWdlOiBmdHAgWy1kXSBbLXJbZmlsZV1dIGhvc3QgWy1sW2Rpcl1dIFstZFtkaXJdXSBbLXBdIFtmaWxlXSAuLi4KKworICAgIC1kIGRpcgorICAgIC1sIGxpc3QKKyAgICAtcCBwYXNzd29yZAorICAgICcnJworCisgICAgaWYgbGVuKHN5cy5hcmd2KSA8IDI6CisgICAgICAgIHByaW50IHRlc3QuX19kb2NfXworICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgZGVidWdnaW5nID0gMAorICAgIHJjZmlsZSA9IE5vbmUKKyAgICB3aGlsZSBzeXMuYXJndlsxXSA9PSAnLWQnOgorICAgICAgICBkZWJ1Z2dpbmcgPSBkZWJ1Z2dpbmcrMQorICAgICAgICBkZWwgc3lzLmFyZ3ZbMV0KKyAgICBpZiBzeXMuYXJndlsxXVs6Ml0gPT0gJy1yJzoKKyAgICAgICAgIyBnZXQgbmFtZSBvZiBhbHRlcm5hdGUgfi8ubmV0cmMgZmlsZToKKyAgICAgICAgcmNmaWxlID0gc3lzLmFyZ3ZbMV1bMjpdCisgICAgICAgIGRlbCBzeXMuYXJndlsxXQorICAgIGhvc3QgPSBzeXMuYXJndlsxXQorICAgIGZ0cCA9IEZUUChob3N0KQorICAgIGZ0cC5zZXRfZGVidWdsZXZlbChkZWJ1Z2dpbmcpCisgICAgdXNlcmlkID0gcGFzc3dkID0gYWNjdCA9ICcnCisgICAgdHJ5OgorICAgICAgICBuZXRyYyA9IE5ldHJjKHJjZmlsZSkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgaWYgcmNmaWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ291bGQgbm90IG9wZW4gYWNjb3VudCBmaWxlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIC0tIHVzaW5nIGFub255bW91cyBsb2dpbi4iKQorICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVzZXJpZCwgcGFzc3dkLCBhY2N0ID0gbmV0cmMuZ2V0X2FjY291bnQoaG9zdCkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgIyBubyBhY2NvdW50IGZvciBob3N0CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKAorICAgICAgICAgICAgICAgICAgICAiTm8gYWNjb3VudCAtLSB1c2luZyBhbm9ueW1vdXMgbG9naW4uIikKKyAgICBmdHAubG9naW4odXNlcmlkLCBwYXNzd2QsIGFjY3QpCisgICAgZm9yIGZpbGUgaW4gc3lzLmFyZ3ZbMjpdOgorICAgICAgICBpZiBmaWxlWzoyXSA9PSAnLWwnOgorICAgICAgICAgICAgZnRwLmRpcihmaWxlWzI6XSkKKyAgICAgICAgZWxpZiBmaWxlWzoyXSA9PSAnLWQnOgorICAgICAgICAgICAgY21kID0gJ0NXRCcKKyAgICAgICAgICAgIGlmIGZpbGVbMjpdOiBjbWQgPSBjbWQgKyAnICcgKyBmaWxlWzI6XQorICAgICAgICAgICAgcmVzcCA9IGZ0cC5zZW5kY21kKGNtZCkKKyAgICAgICAgZWxpZiBmaWxlID09ICctcCc6CisgICAgICAgICAgICBmdHAuc2V0X3Bhc3Yobm90IGZ0cC5wYXNzaXZlc2VydmVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnRwLnJldHJiaW5hcnkoJ1JFVFIgJyArIGZpbGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUsIDEwMjQpCisgICAgZnRwLnF1aXQoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Z0cGxpYi5weWMgYi9saWIvcHl0aG9uMi43L2Z0cGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0OTExNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZnRwbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Z0cGxpYi5weW8gYi9saWIvcHl0aG9uMi43L2Z0cGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0OTExNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZnRwbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Z1bmN0b29scy5weSBiL2xpYi9weXRob24yLjcvZnVuY3Rvb2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjgwYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Z1bmN0b29scy5weQpAQCAtMCwwICsxLDEwMCBAQAorIiIiZnVuY3Rvb2xzLnB5IC0gVG9vbHMgZm9yIHdvcmtpbmcgd2l0aCBmdW5jdGlvbnMgYW5kIGNhbGxhYmxlIG9iamVjdHMKKyIiIgorIyBQeXRob24gbW9kdWxlIHdyYXBwZXIgZm9yIF9mdW5jdG9vbHMgQyBtb2R1bGUKKyMgdG8gYWxsb3cgdXRpbGl0aWVzIHdyaXR0ZW4gaW4gUHl0aG9uIHRvIGJlIGFkZGVkCisjIHRvIHRoZSBmdW5jdG9vbHMgbW9kdWxlLgorIyBXcml0dGVuIGJ5IE5pY2sgQ29naGxhbiA8bmNvZ2hsYW4gYXQgZ21haWwuY29tPgorIyAgIENvcHlyaWdodCAoQykgMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KKyMgU2VlIEMgc291cmNlIGNvZGUgZm9yIF9mdW5jdG9vbHMgY3JlZGl0cy9jb3B5cmlnaHQKKworZnJvbSBfZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsLCByZWR1Y2UKKworIyB1cGRhdGVfd3JhcHBlcigpIGFuZCB3cmFwcygpIGFyZSB0b29scyB0byBoZWxwIHdyaXRlCisjIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgY2FuIGhhbmRsZSBuYWl2ZSBpbnRyb3NwZWN0aW9uCisKK1dSQVBQRVJfQVNTSUdOTUVOVFMgPSAoJ19fbW9kdWxlX18nLCAnX19uYW1lX18nLCAnX19kb2NfXycpCitXUkFQUEVSX1VQREFURVMgPSAoJ19fZGljdF9fJywpCitkZWYgdXBkYXRlX3dyYXBwZXIod3JhcHBlciwKKyAgICAgICAgICAgICAgICAgICB3cmFwcGVkLAorICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkID0gV1JBUFBFUl9BU1NJR05NRU5UUywKKyAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gV1JBUFBFUl9VUERBVEVTKToKKyAgICAiIiJVcGRhdGUgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIGxvb2sgbGlrZSB0aGUgd3JhcHBlZCBmdW5jdGlvbgorCisgICAgICAgd3JhcHBlciBpcyB0aGUgZnVuY3Rpb24gdG8gYmUgdXBkYXRlZAorICAgICAgIHdyYXBwZWQgaXMgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uCisgICAgICAgYXNzaWduZWQgaXMgYSB0dXBsZSBuYW1pbmcgdGhlIGF0dHJpYnV0ZXMgYXNzaWduZWQgZGlyZWN0bHkKKyAgICAgICBmcm9tIHRoZSB3cmFwcGVkIGZ1bmN0aW9uIHRvIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIChkZWZhdWx0cyB0bworICAgICAgIGZ1bmN0b29scy5XUkFQUEVSX0FTU0lHTk1FTlRTKQorICAgICAgIHVwZGF0ZWQgaXMgYSB0dXBsZSBuYW1pbmcgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIHdyYXBwZXIgdGhhdAorICAgICAgIGFyZSB1cGRhdGVkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIGZyb20gdGhlIHdyYXBwZWQKKyAgICAgICBmdW5jdGlvbiAoZGVmYXVsdHMgdG8gZnVuY3Rvb2xzLldSQVBQRVJfVVBEQVRFUykKKyAgICAiIiIKKyAgICBmb3IgYXR0ciBpbiBhc3NpZ25lZDoKKyAgICAgICAgc2V0YXR0cih3cmFwcGVyLCBhdHRyLCBnZXRhdHRyKHdyYXBwZWQsIGF0dHIpKQorICAgIGZvciBhdHRyIGluIHVwZGF0ZWQ6CisgICAgICAgIGdldGF0dHIod3JhcHBlciwgYXR0cikudXBkYXRlKGdldGF0dHIod3JhcHBlZCwgYXR0ciwge30pKQorICAgICMgUmV0dXJuIHRoZSB3cmFwcGVyIHNvIHRoaXMgY2FuIGJlIHVzZWQgYXMgYSBkZWNvcmF0b3IgdmlhIHBhcnRpYWwoKQorICAgIHJldHVybiB3cmFwcGVyCisKK2RlZiB3cmFwcyh3cmFwcGVkLAorICAgICAgICAgIGFzc2lnbmVkID0gV1JBUFBFUl9BU1NJR05NRU5UUywKKyAgICAgICAgICB1cGRhdGVkID0gV1JBUFBFUl9VUERBVEVTKToKKyAgICAiIiJEZWNvcmF0b3IgZmFjdG9yeSB0byBhcHBseSB1cGRhdGVfd3JhcHBlcigpIHRvIGEgd3JhcHBlciBmdW5jdGlvbgorCisgICAgICAgUmV0dXJucyBhIGRlY29yYXRvciB0aGF0IGludm9rZXMgdXBkYXRlX3dyYXBwZXIoKSB3aXRoIHRoZSBkZWNvcmF0ZWQKKyAgICAgICBmdW5jdGlvbiBhcyB0aGUgd3JhcHBlciBhcmd1bWVudCBhbmQgdGhlIGFyZ3VtZW50cyB0byB3cmFwcygpIGFzIHRoZQorICAgICAgIHJlbWFpbmluZyBhcmd1bWVudHMuIERlZmF1bHQgYXJndW1lbnRzIGFyZSBhcyBmb3IgdXBkYXRlX3dyYXBwZXIoKS4KKyAgICAgICBUaGlzIGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdG8gc2ltcGxpZnkgYXBwbHlpbmcgcGFydGlhbCgpIHRvCisgICAgICAgdXBkYXRlX3dyYXBwZXIoKS4KKyAgICAiIiIKKyAgICByZXR1cm4gcGFydGlhbCh1cGRhdGVfd3JhcHBlciwgd3JhcHBlZD13cmFwcGVkLAorICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkPWFzc2lnbmVkLCB1cGRhdGVkPXVwZGF0ZWQpCisKK2RlZiB0b3RhbF9vcmRlcmluZyhjbHMpOgorICAgICIiIkNsYXNzIGRlY29yYXRvciB0aGF0IGZpbGxzIGluIG1pc3Npbmcgb3JkZXJpbmcgbWV0aG9kcyIiIgorICAgIGNvbnZlcnQgPSB7CisgICAgICAgICdfX2x0X18nOiBbKCdfX2d0X18nLCBsYW1iZGEgc2VsZiwgb3RoZXI6IG5vdCAoc2VsZiA8IG90aGVyIG9yIHNlbGYgPT0gb3RoZXIpKSwKKyAgICAgICAgICAgICAgICAgICAoJ19fbGVfXycsIGxhbWJkYSBzZWxmLCBvdGhlcjogc2VsZiA8IG90aGVyIG9yIHNlbGYgPT0gb3RoZXIpLAorICAgICAgICAgICAgICAgICAgICgnX19nZV9fJywgbGFtYmRhIHNlbGYsIG90aGVyOiBub3Qgc2VsZiA8IG90aGVyKV0sCisgICAgICAgICdfX2xlX18nOiBbKCdfX2dlX18nLCBsYW1iZGEgc2VsZiwgb3RoZXI6IG5vdCBzZWxmIDw9IG90aGVyIG9yIHNlbGYgPT0gb3RoZXIpLAorICAgICAgICAgICAgICAgICAgICgnX19sdF9fJywgbGFtYmRhIHNlbGYsIG90aGVyOiBzZWxmIDw9IG90aGVyIGFuZCBub3Qgc2VsZiA9PSBvdGhlciksCisgICAgICAgICAgICAgICAgICAgKCdfX2d0X18nLCBsYW1iZGEgc2VsZiwgb3RoZXI6IG5vdCBzZWxmIDw9IG90aGVyKV0sCisgICAgICAgICdfX2d0X18nOiBbKCdfX2x0X18nLCBsYW1iZGEgc2VsZiwgb3RoZXI6IG5vdCAoc2VsZiA+IG90aGVyIG9yIHNlbGYgPT0gb3RoZXIpKSwKKyAgICAgICAgICAgICAgICAgICAoJ19fZ2VfXycsIGxhbWJkYSBzZWxmLCBvdGhlcjogc2VsZiA+IG90aGVyIG9yIHNlbGYgPT0gb3RoZXIpLAorICAgICAgICAgICAgICAgICAgICgnX19sZV9fJywgbGFtYmRhIHNlbGYsIG90aGVyOiBub3Qgc2VsZiA+IG90aGVyKV0sCisgICAgICAgICdfX2dlX18nOiBbKCdfX2xlX18nLCBsYW1iZGEgc2VsZiwgb3RoZXI6IChub3Qgc2VsZiA+PSBvdGhlcikgb3Igc2VsZiA9PSBvdGhlciksCisgICAgICAgICAgICAgICAgICAgKCdfX2d0X18nLCBsYW1iZGEgc2VsZiwgb3RoZXI6IHNlbGYgPj0gb3RoZXIgYW5kIG5vdCBzZWxmID09IG90aGVyKSwKKyAgICAgICAgICAgICAgICAgICAoJ19fbHRfXycsIGxhbWJkYSBzZWxmLCBvdGhlcjogbm90IHNlbGYgPj0gb3RoZXIpXQorICAgIH0KKyAgICByb290cyA9IHNldChkaXIoY2xzKSkgJiBzZXQoY29udmVydCkKKyAgICBpZiBub3Qgcm9vdHM6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ211c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBvcmRlcmluZyBvcGVyYXRpb246IDwgPiA8PSA+PScpCisgICAgcm9vdCA9IG1heChyb290cykgICAgICAgIyBwcmVmZXIgX19sdF9fIHRvIF9fbGVfXyB0byBfX2d0X18gdG8gX19nZV9fCisgICAgZm9yIG9wbmFtZSwgb3BmdW5jIGluIGNvbnZlcnRbcm9vdF06CisgICAgICAgIGlmIG9wbmFtZSBub3QgaW4gcm9vdHM6CisgICAgICAgICAgICBvcGZ1bmMuX19uYW1lX18gPSBvcG5hbWUKKyAgICAgICAgICAgIG9wZnVuYy5fX2RvY19fID0gZ2V0YXR0cihpbnQsIG9wbmFtZSkuX19kb2NfXworICAgICAgICAgICAgc2V0YXR0cihjbHMsIG9wbmFtZSwgb3BmdW5jKQorICAgIHJldHVybiBjbHMKKworZGVmIGNtcF90b19rZXkobXljbXApOgorICAgICIiIkNvbnZlcnQgYSBjbXA9IGZ1bmN0aW9uIGludG8gYSBrZXk9IGZ1bmN0aW9uIiIiCisgICAgY2xhc3MgSyhvYmplY3QpOgorICAgICAgICBfX3Nsb3RzX18gPSBbJ29iaiddCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYmosICphcmdzKToKKyAgICAgICAgICAgIHNlbGYub2JqID0gb2JqCisgICAgICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIG15Y21wKHNlbGYub2JqLCBvdGhlci5vYmopIDwgMAorICAgICAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBteWNtcChzZWxmLm9iaiwgb3RoZXIub2JqKSA+IDAKKyAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gbXljbXAoc2VsZi5vYmosIG90aGVyLm9iaikgPT0gMAorICAgICAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBteWNtcChzZWxmLm9iaiwgb3RoZXIub2JqKSA8PSAwCisgICAgICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIG15Y21wKHNlbGYub2JqLCBvdGhlci5vYmopID49IDAKKyAgICAgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gbXljbXAoc2VsZi5vYmosIG90aGVyLm9iaikgIT0gMAorICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2hhc2ggbm90IGltcGxlbWVudGVkJykKKyAgICByZXR1cm4gSwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mdW5jdG9vbHMucHljIGIvbGliL3B5dGhvbjIuNy9mdW5jdG9vbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Njc1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Z1bmN0b29scy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mdW5jdG9vbHMucHlvIGIvbGliL3B5dGhvbjIuNy9mdW5jdG9vbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Njc1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Z1bmN0b29scy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nZW5lcmljcGF0aC5weSBiL2xpYi9weXRob24yLjcvZ2VuZXJpY3BhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiZjYwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2VuZXJpY3BhdGgucHkKQEAgLTAsMCArMSwxMDUgQEAKKyIiIgorUGF0aCBvcGVyYXRpb25zIGNvbW1vbiB0byBtb3JlIHRoYW4gb25lIE9TCitEbyBub3QgdXNlIGRpcmVjdGx5LiAgVGhlIE9TIHNwZWNpZmljIG1vZHVsZXMgaW1wb3J0IHRoZSBhcHByb3ByaWF0ZQorZnVuY3Rpb25zIGZyb20gdGhpcyBtb2R1bGUgdGhlbXNlbHZlcy4KKyIiIgoraW1wb3J0IG9zCitpbXBvcnQgc3RhdAorCitfX2FsbF9fID0gWydjb21tb25wcmVmaXgnLCAnZXhpc3RzJywgJ2dldGF0aW1lJywgJ2dldGN0aW1lJywgJ2dldG10aW1lJywKKyAgICAgICAgICAgJ2dldHNpemUnLCAnaXNkaXInLCAnaXNmaWxlJ10KKworCisjIERvZXMgYSBwYXRoIGV4aXN0PworIyBUaGlzIGlzIGZhbHNlIGZvciBkYW5nbGluZyBzeW1ib2xpYyBsaW5rcyBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCB0aGVtLgorZGVmIGV4aXN0cyhwYXRoKToKKyAgICAiIiJUZXN0IHdoZXRoZXIgYSBwYXRoIGV4aXN0cy4gIFJldHVybnMgRmFsc2UgZm9yIGJyb2tlbiBzeW1ib2xpYyBsaW5rcyIiIgorICAgIHRyeToKKyAgICAgICAgb3Muc3RhdChwYXRoKQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworCisjIFRoaXMgZm9sbG93cyBzeW1ib2xpYyBsaW5rcywgc28gYm90aCBpc2xpbmsoKSBhbmQgaXNkaXIoKSBjYW4gYmUgdHJ1ZQorIyBmb3IgdGhlIHNhbWUgcGF0aCBvbm8gc3lzdGVtcyB0aGF0IHN1cHBvcnQgc3ltbGlua3MKK2RlZiBpc2ZpbGUocGF0aCk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBpcyBhIHJlZ3VsYXIgZmlsZSIiIgorICAgIHRyeToKKyAgICAgICAgc3QgPSBvcy5zdGF0KHBhdGgpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gc3RhdC5TX0lTUkVHKHN0LnN0X21vZGUpCisKKworIyBJcyBhIHBhdGggYSBkaXJlY3Rvcnk/CisjIFRoaXMgZm9sbG93cyBzeW1ib2xpYyBsaW5rcywgc28gYm90aCBpc2xpbmsoKSBhbmQgaXNkaXIoKQorIyBjYW4gYmUgdHJ1ZSBmb3IgdGhlIHNhbWUgcGF0aCBvbiBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBzeW1saW5rcworZGVmIGlzZGlyKHMpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBwYXRobmFtZSByZWZlcnMgdG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIiIgorICAgIHRyeToKKyAgICAgICAgc3QgPSBvcy5zdGF0KHMpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gc3RhdC5TX0lTRElSKHN0LnN0X21vZGUpCisKKworZGVmIGdldHNpemUoZmlsZW5hbWUpOgorICAgICIiIlJldHVybiB0aGUgc2l6ZSBvZiBhIGZpbGUsIHJlcG9ydGVkIGJ5IG9zLnN0YXQoKS4iIiIKKyAgICByZXR1cm4gb3Muc3RhdChmaWxlbmFtZSkuc3Rfc2l6ZQorCisKK2RlZiBnZXRtdGltZShmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgorICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9tdGltZQorCisKK2RlZiBnZXRhdGltZShmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIHRoZSBsYXN0IGFjY2VzcyB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgorICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9hdGltZQorCisKK2RlZiBnZXRjdGltZShmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIHRoZSBtZXRhZGF0YSBjaGFuZ2UgdGltZSBvZiBhIGZpbGUsIHJlcG9ydGVkIGJ5IG9zLnN0YXQoKS4iIiIKKyAgICByZXR1cm4gb3Muc3RhdChmaWxlbmFtZSkuc3RfY3RpbWUKKworCisjIFJldHVybiB0aGUgbG9uZ2VzdCBwcmVmaXggb2YgYWxsIGxpc3QgZWxlbWVudHMuCitkZWYgY29tbW9ucHJlZml4KG0pOgorICAgICJHaXZlbiBhIGxpc3Qgb2YgcGF0aG5hbWVzLCByZXR1cm5zIHRoZSBsb25nZXN0IGNvbW1vbiBsZWFkaW5nIGNvbXBvbmVudCIKKyAgICBpZiBub3QgbTogcmV0dXJuICcnCisgICAgczEgPSBtaW4obSkKKyAgICBzMiA9IG1heChtKQorICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZShzMSk6CisgICAgICAgIGlmIGMgIT0gczJbaV06CisgICAgICAgICAgICByZXR1cm4gczFbOmldCisgICAgcmV0dXJuIHMxCisKKyMgU3BsaXQgYSBwYXRoIGluIHJvb3QgYW5kIGV4dGVuc2lvbi4KKyMgVGhlIGV4dGVuc2lvbiBpcyBldmVyeXRoaW5nIHN0YXJ0aW5nIGF0IHRoZSBsYXN0IGRvdCBpbiB0aGUgbGFzdAorIyBwYXRobmFtZSBjb21wb25lbnQ7IHRoZSByb290IGlzIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoYXQuCisjIEl0IGlzIGFsd2F5cyB0cnVlIHRoYXQgcm9vdCArIGV4dCA9PSBwLgorCisjIEdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2Ygc3BsaXRleHQsIHRvIGJlIHBhcmFtZXRyaXplZCB3aXRoCisjIHRoZSBzZXBhcmF0b3JzCitkZWYgX3NwbGl0ZXh0KHAsIHNlcCwgYWx0c2VwLCBleHRzZXApOgorICAgICIiIlNwbGl0IHRoZSBleHRlbnNpb24gZnJvbSBhIHBhdGhuYW1lLgorCisgICAgRXh0ZW5zaW9uIGlzIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgbGFzdCBkb3QgdG8gdGhlIGVuZCwgaWdub3JpbmcKKyAgICBsZWFkaW5nIGRvdHMuICBSZXR1cm5zICIocm9vdCwgZXh0KSI7IGV4dCBtYXkgYmUgZW1wdHkuIiIiCisKKyAgICBzZXBJbmRleCA9IHAucmZpbmQoc2VwKQorICAgIGlmIGFsdHNlcDoKKyAgICAgICAgYWx0c2VwSW5kZXggPSBwLnJmaW5kKGFsdHNlcCkKKyAgICAgICAgc2VwSW5kZXggPSBtYXgoc2VwSW5kZXgsIGFsdHNlcEluZGV4KQorCisgICAgZG90SW5kZXggPSBwLnJmaW5kKGV4dHNlcCkKKyAgICBpZiBkb3RJbmRleCA+IHNlcEluZGV4OgorICAgICAgICAjIHNraXAgYWxsIGxlYWRpbmcgZG90cworICAgICAgICBmaWxlbmFtZUluZGV4ID0gc2VwSW5kZXggKyAxCisgICAgICAgIHdoaWxlIGZpbGVuYW1lSW5kZXggPCBkb3RJbmRleDoKKyAgICAgICAgICAgIGlmIHBbZmlsZW5hbWVJbmRleF0gIT0gZXh0c2VwOgorICAgICAgICAgICAgICAgIHJldHVybiBwWzpkb3RJbmRleF0sIHBbZG90SW5kZXg6XQorICAgICAgICAgICAgZmlsZW5hbWVJbmRleCArPSAxCisKKyAgICByZXR1cm4gcCwgJycKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZ2VuZXJpY3BhdGgucHljIGIvbGliL3B5dGhvbjIuNy9nZW5lcmljcGF0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3YzExYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2VuZXJpY3BhdGgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZ2VuZXJpY3BhdGgucHlvIGIvbGliL3B5dGhvbjIuNy9nZW5lcmljcGF0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3YzExYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2VuZXJpY3BhdGgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZ2V0b3B0LnB5IGIvbGliL3B5dGhvbjIuNy9nZXRvcHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxZDg5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2V0b3B0LnB5CkBAIC0wLDAgKzEsMjEwIEBACisiIiJQYXJzZXIgZm9yIGNvbW1hbmQgbGluZSBvcHRpb25zLgorCitUaGlzIG1vZHVsZSBoZWxwcyBzY3JpcHRzIHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGluCitzeXMuYXJndi4gIEl0IHN1cHBvcnRzIHRoZSBzYW1lIGNvbnZlbnRpb25zIGFzIHRoZSBVbml4IGdldG9wdCgpCitmdW5jdGlvbiAoaW5jbHVkaW5nIHRoZSBzcGVjaWFsIG1lYW5pbmdzIG9mIGFyZ3VtZW50cyBvZiB0aGUgZm9ybSBgLScKK2FuZCBgLS0nKS4gIExvbmcgb3B0aW9ucyBzaW1pbGFyIHRvIHRob3NlIHN1cHBvcnRlZCBieSBHTlUgc29mdHdhcmUKK21heSBiZSB1c2VkIGFzIHdlbGwgdmlhIGFuIG9wdGlvbmFsIHRoaXJkIGFyZ3VtZW50LiAgVGhpcyBtb2R1bGUKK3Byb3ZpZGVzIHR3byBmdW5jdGlvbnMgYW5kIGFuIGV4Y2VwdGlvbjoKKworZ2V0b3B0KCkgLS0gUGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMKK2dudV9nZXRvcHQoKSAtLSBMaWtlIGdldG9wdCgpLCBidXQgYWxsb3cgb3B0aW9uIGFuZCBub24tb3B0aW9uIGFyZ3VtZW50cwordG8gYmUgaW50ZXJtaXhlZC4KK0dldG9wdEVycm9yIC0tIGV4Y2VwdGlvbiAoY2xhc3MpIHJhaXNlZCB3aXRoICdvcHQnIGF0dHJpYnV0ZSwgd2hpY2ggaXMgdGhlCitvcHRpb24gaW52b2x2ZWQgd2l0aCB0aGUgZXhjZXB0aW9uLgorIiIiCisKKyMgTG9uZyBvcHRpb24gc3VwcG9ydCBhZGRlZCBieSBMYXJzIFdpcnplbml1cyA8bGl3QGlraS5maT4uCisjCisjIEdlcnJpdCBIb2xsIDxnZXJyaXRAbmwubGludXgub3JnPiBtb3ZlZCB0aGUgc3RyaW5nLWJhc2VkIGV4Y2VwdGlvbnMKKyMgdG8gY2xhc3MtYmFzZWQgZXhjZXB0aW9ucy4KKyMKKyMgUGV0ZXIgQXN0cmFuZCA8YXN0cmFuZEBseXNhdG9yLmxpdS5zZT4gYWRkZWQgZ251X2dldG9wdCgpLgorIworIyBUT0RPIGZvciBnbnVfZ2V0b3B0KCk6CisjCisjIC0gR05VIGdldG9wdF9sb25nX29ubHkgbWVjaGFuaXNtCisjIC0gYWxsb3cgdGhlIGNhbGxlciB0byBzcGVjaWZ5IG9yZGVyaW5nCisjIC0gUkVUVVJOX0lOX09SREVSIG9wdGlvbgorIyAtIEdOVSBleHRlbnNpb24gd2l0aCAnLScgYXMgZmlyc3QgY2hhcmFjdGVyIG9mIG9wdGlvbiBzdHJpbmcKKyMgLSBvcHRpb25hbCBhcmd1bWVudHMsIHNwZWNpZmllZCBieSBkb3VibGUgY29sb25zCisjIC0gYSBvcHRpb24gc3RyaW5nIHdpdGggYSBXIGZvbGxvd2VkIGJ5IHNlbWljb2xvbiBzaG91bGQKKyMgICB0cmVhdCAiLVcgZm9vIiBhcyAiLS1mb28iCisKK19fYWxsX18gPSBbIkdldG9wdEVycm9yIiwiZXJyb3IiLCJnZXRvcHQiLCJnbnVfZ2V0b3B0Il0KKworaW1wb3J0IG9zCisKK2NsYXNzIEdldG9wdEVycm9yKEV4Y2VwdGlvbik6CisgICAgb3B0ID0gJycKKyAgICBtc2cgPSAnJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIG9wdD0nJyk6CisgICAgICAgIHNlbGYubXNnID0gbXNnCisgICAgICAgIHNlbGYub3B0ID0gb3B0CisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtc2csIG9wdCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5tc2cKKworZXJyb3IgPSBHZXRvcHRFcnJvciAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKworZGVmIGdldG9wdChhcmdzLCBzaG9ydG9wdHMsIGxvbmdvcHRzID0gW10pOgorICAgICIiImdldG9wdChhcmdzLCBvcHRpb25zWywgbG9uZ19vcHRpb25zXSkgLT4gb3B0cywgYXJncworCisgICAgUGFyc2VzIGNvbW1hbmQgbGluZSBvcHRpb25zIGFuZCBwYXJhbWV0ZXIgbGlzdC4gIGFyZ3MgaXMgdGhlCisgICAgYXJndW1lbnQgbGlzdCB0byBiZSBwYXJzZWQsIHdpdGhvdXQgdGhlIGxlYWRpbmcgcmVmZXJlbmNlIHRvIHRoZQorICAgIHJ1bm5pbmcgcHJvZ3JhbS4gIFR5cGljYWxseSwgdGhpcyBtZWFucyAic3lzLmFyZ3ZbMTpdIi4gIHNob3J0b3B0cworICAgIGlzIHRoZSBzdHJpbmcgb2Ygb3B0aW9uIGxldHRlcnMgdGhhdCB0aGUgc2NyaXB0IHdhbnRzIHRvCisgICAgcmVjb2duaXplLCB3aXRoIG9wdGlvbnMgdGhhdCByZXF1aXJlIGFuIGFyZ3VtZW50IGZvbGxvd2VkIGJ5IGEKKyAgICBjb2xvbiAoaS5lLiwgdGhlIHNhbWUgZm9ybWF0IHRoYXQgVW5peCBnZXRvcHQoKSB1c2VzKS4gIElmCisgICAgc3BlY2lmaWVkLCBsb25nb3B0cyBpcyBhIGxpc3Qgb2Ygc3RyaW5ncyB3aXRoIHRoZSBuYW1lcyBvZiB0aGUKKyAgICBsb25nIG9wdGlvbnMgd2hpY2ggc2hvdWxkIGJlIHN1cHBvcnRlZC4gIFRoZSBsZWFkaW5nICctLScKKyAgICBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIG9wdGlvbiBuYW1lLiAgT3B0aW9ucworICAgIHdoaWNoIHJlcXVpcmUgYW4gYXJndW1lbnQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGFuIGVxdWFsIHNpZ24KKyAgICAoJz0nKS4KKworICAgIFRoZSByZXR1cm4gdmFsdWUgY29uc2lzdHMgb2YgdHdvIGVsZW1lbnRzOiB0aGUgZmlyc3QgaXMgYSBsaXN0IG9mCisgICAgKG9wdGlvbiwgdmFsdWUpIHBhaXJzOyB0aGUgc2Vjb25kIGlzIHRoZSBsaXN0IG9mIHByb2dyYW0gYXJndW1lbnRzCisgICAgbGVmdCBhZnRlciB0aGUgb3B0aW9uIGxpc3Qgd2FzIHN0cmlwcGVkICh0aGlzIGlzIGEgdHJhaWxpbmcgc2xpY2UKKyAgICBvZiB0aGUgZmlyc3QgYXJndW1lbnQpLiAgRWFjaCBvcHRpb24tYW5kLXZhbHVlIHBhaXIgcmV0dXJuZWQgaGFzCisgICAgdGhlIG9wdGlvbiBhcyBpdHMgZmlyc3QgZWxlbWVudCwgcHJlZml4ZWQgd2l0aCBhIGh5cGhlbiAoZS5nLiwKKyAgICAnLXgnKSwgYW5kIHRoZSBvcHRpb24gYXJndW1lbnQgYXMgaXRzIHNlY29uZCBlbGVtZW50LCBvciBhbiBlbXB0eQorICAgIHN0cmluZyBpZiB0aGUgb3B0aW9uIGhhcyBubyBhcmd1bWVudC4gIFRoZSBvcHRpb25zIG9jY3VyIGluIHRoZQorICAgIGxpc3QgaW4gdGhlIHNhbWUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGZvdW5kLCB0aHVzIGFsbG93aW5nCisgICAgbXVsdGlwbGUgb2NjdXJyZW5jZXMuICBMb25nIGFuZCBzaG9ydCBvcHRpb25zIG1heSBiZSBtaXhlZC4KKworICAgICIiIgorCisgICAgb3B0cyA9IFtdCisgICAgaWYgdHlwZShsb25nb3B0cykgPT0gdHlwZSgiIik6CisgICAgICAgIGxvbmdvcHRzID0gW2xvbmdvcHRzXQorICAgIGVsc2U6CisgICAgICAgIGxvbmdvcHRzID0gbGlzdChsb25nb3B0cykKKyAgICB3aGlsZSBhcmdzIGFuZCBhcmdzWzBdLnN0YXJ0c3dpdGgoJy0nKSBhbmQgYXJnc1swXSAhPSAnLSc6CisgICAgICAgIGlmIGFyZ3NbMF0gPT0gJy0tJzoKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzE6XQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgYXJnc1swXS5zdGFydHN3aXRoKCctLScpOgorICAgICAgICAgICAgb3B0cywgYXJncyA9IGRvX2xvbmdzKG9wdHMsIGFyZ3NbMF1bMjpdLCBsb25nb3B0cywgYXJnc1sxOl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcHRzLCBhcmdzID0gZG9fc2hvcnRzKG9wdHMsIGFyZ3NbMF1bMTpdLCBzaG9ydG9wdHMsIGFyZ3NbMTpdKQorCisgICAgcmV0dXJuIG9wdHMsIGFyZ3MKKworZGVmIGdudV9nZXRvcHQoYXJncywgc2hvcnRvcHRzLCBsb25nb3B0cyA9IFtdKToKKyAgICAiIiJnZXRvcHQoYXJncywgb3B0aW9uc1ssIGxvbmdfb3B0aW9uc10pIC0+IG9wdHMsIGFyZ3MKKworICAgIFRoaXMgZnVuY3Rpb24gd29ya3MgbGlrZSBnZXRvcHQoKSwgZXhjZXB0IHRoYXQgR05VIHN0eWxlIHNjYW5uaW5nCisgICAgbW9kZSBpcyB1c2VkIGJ5IGRlZmF1bHQuIFRoaXMgbWVhbnMgdGhhdCBvcHRpb24gYW5kIG5vbi1vcHRpb24KKyAgICBhcmd1bWVudHMgbWF5IGJlIGludGVybWl4ZWQuIFRoZSBnZXRvcHQoKSBmdW5jdGlvbiBzdG9wcworICAgIHByb2Nlc3Npbmcgb3B0aW9ucyBhcyBzb29uIGFzIGEgbm9uLW9wdGlvbiBhcmd1bWVudCBpcworICAgIGVuY291bnRlcmVkLgorCisgICAgSWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgb3B0aW9uIHN0cmluZyBpcyBgKycsIG9yIGlmIHRoZQorICAgIGVudmlyb25tZW50IHZhcmlhYmxlIFBPU0lYTFlfQ09SUkVDVCBpcyBzZXQsIHRoZW4gb3B0aW9uCisgICAgcHJvY2Vzc2luZyBzdG9wcyBhcyBzb29uIGFzIGEgbm9uLW9wdGlvbiBhcmd1bWVudCBpcyBlbmNvdW50ZXJlZC4KKworICAgICIiIgorCisgICAgb3B0cyA9IFtdCisgICAgcHJvZ19hcmdzID0gW10KKyAgICBpZiBpc2luc3RhbmNlKGxvbmdvcHRzLCBzdHIpOgorICAgICAgICBsb25nb3B0cyA9IFtsb25nb3B0c10KKyAgICBlbHNlOgorICAgICAgICBsb25nb3B0cyA9IGxpc3QobG9uZ29wdHMpCisKKyAgICAjIEFsbG93IG9wdGlvbnMgYWZ0ZXIgbm9uLW9wdGlvbiBhcmd1bWVudHM/CisgICAgaWYgc2hvcnRvcHRzLnN0YXJ0c3dpdGgoJysnKToKKyAgICAgICAgc2hvcnRvcHRzID0gc2hvcnRvcHRzWzE6XQorICAgICAgICBhbGxfb3B0aW9uc19maXJzdCA9IFRydWUKKyAgICBlbGlmIG9zLmVudmlyb24uZ2V0KCJQT1NJWExZX0NPUlJFQ1QiKToKKyAgICAgICAgYWxsX29wdGlvbnNfZmlyc3QgPSBUcnVlCisgICAgZWxzZToKKyAgICAgICAgYWxsX29wdGlvbnNfZmlyc3QgPSBGYWxzZQorCisgICAgd2hpbGUgYXJnczoKKyAgICAgICAgaWYgYXJnc1swXSA9PSAnLS0nOgorICAgICAgICAgICAgcHJvZ19hcmdzICs9IGFyZ3NbMTpdCisgICAgICAgICAgICBicmVhaworCisgICAgICAgIGlmIGFyZ3NbMF1bOjJdID09ICctLSc6CisgICAgICAgICAgICBvcHRzLCBhcmdzID0gZG9fbG9uZ3Mob3B0cywgYXJnc1swXVsyOl0sIGxvbmdvcHRzLCBhcmdzWzE6XSkKKyAgICAgICAgZWxpZiBhcmdzWzBdWzoxXSA9PSAnLScgYW5kIGFyZ3NbMF0gIT0gJy0nOgorICAgICAgICAgICAgb3B0cywgYXJncyA9IGRvX3Nob3J0cyhvcHRzLCBhcmdzWzBdWzE6XSwgc2hvcnRvcHRzLCBhcmdzWzE6XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGFsbF9vcHRpb25zX2ZpcnN0OgorICAgICAgICAgICAgICAgIHByb2dfYXJncyArPSBhcmdzCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJvZ19hcmdzLmFwcGVuZChhcmdzWzBdKQorICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzE6XQorCisgICAgcmV0dXJuIG9wdHMsIHByb2dfYXJncworCitkZWYgZG9fbG9uZ3Mob3B0cywgb3B0LCBsb25nb3B0cywgYXJncyk6CisgICAgdHJ5OgorICAgICAgICBpID0gb3B0LmluZGV4KCc9JykKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgb3B0YXJnID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIG9wdCwgb3B0YXJnID0gb3B0WzppXSwgb3B0W2krMTpdCisKKyAgICBoYXNfYXJnLCBvcHQgPSBsb25nX2hhc19hcmdzKG9wdCwgbG9uZ29wdHMpCisgICAgaWYgaGFzX2FyZzoKKyAgICAgICAgaWYgb3B0YXJnIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgICAgICByYWlzZSBHZXRvcHRFcnJvcignb3B0aW9uIC0tJXMgcmVxdWlyZXMgYXJndW1lbnQnICUgb3B0LCBvcHQpCisgICAgICAgICAgICBvcHRhcmcsIGFyZ3MgPSBhcmdzWzBdLCBhcmdzWzE6XQorICAgIGVsaWYgb3B0YXJnIGlzIG5vdCBOb25lOgorICAgICAgICByYWlzZSBHZXRvcHRFcnJvcignb3B0aW9uIC0tJXMgbXVzdCBub3QgaGF2ZSBhbiBhcmd1bWVudCcgJSBvcHQsIG9wdCkKKyAgICBvcHRzLmFwcGVuZCgoJy0tJyArIG9wdCwgb3B0YXJnIG9yICcnKSkKKyAgICByZXR1cm4gb3B0cywgYXJncworCisjIFJldHVybjoKKyMgICBoYXNfYXJnPworIyAgIGZ1bGwgb3B0aW9uIG5hbWUKK2RlZiBsb25nX2hhc19hcmdzKG9wdCwgbG9uZ29wdHMpOgorICAgIHBvc3NpYmlsaXRpZXMgPSBbbyBmb3IgbyBpbiBsb25nb3B0cyBpZiBvLnN0YXJ0c3dpdGgob3B0KV0KKyAgICBpZiBub3QgcG9zc2liaWxpdGllczoKKyAgICAgICAgcmFpc2UgR2V0b3B0RXJyb3IoJ29wdGlvbiAtLSVzIG5vdCByZWNvZ25pemVkJyAlIG9wdCwgb3B0KQorICAgICMgSXMgdGhlcmUgYW4gZXhhY3QgbWF0Y2g/CisgICAgaWYgb3B0IGluIHBvc3NpYmlsaXRpZXM6CisgICAgICAgIHJldHVybiBGYWxzZSwgb3B0CisgICAgZWxpZiBvcHQgKyAnPScgaW4gcG9zc2liaWxpdGllczoKKyAgICAgICAgcmV0dXJuIFRydWUsIG9wdAorICAgICMgTm8gZXhhY3QgbWF0Y2gsIHNvIGJldHRlciBiZSB1bmlxdWUuCisgICAgaWYgbGVuKHBvc3NpYmlsaXRpZXMpID4gMToKKyAgICAgICAgIyBYWFggc2luY2UgcG9zc2liaWxpdGllcyBjb250YWlucyBhbGwgdmFsaWQgY29udGludWF0aW9ucywgbWlnaHQgYmUKKyAgICAgICAgIyBuaWNlIHRvIHdvcmsgdGhlbSBpbnRvIHRoZSBlcnJvciBtc2cKKyAgICAgICAgcmFpc2UgR2V0b3B0RXJyb3IoJ29wdGlvbiAtLSVzIG5vdCBhIHVuaXF1ZSBwcmVmaXgnICUgb3B0LCBvcHQpCisgICAgYXNzZXJ0IGxlbihwb3NzaWJpbGl0aWVzKSA9PSAxCisgICAgdW5pcXVlX21hdGNoID0gcG9zc2liaWxpdGllc1swXQorICAgIGhhc19hcmcgPSB1bmlxdWVfbWF0Y2guZW5kc3dpdGgoJz0nKQorICAgIGlmIGhhc19hcmc6CisgICAgICAgIHVuaXF1ZV9tYXRjaCA9IHVuaXF1ZV9tYXRjaFs6LTFdCisgICAgcmV0dXJuIGhhc19hcmcsIHVuaXF1ZV9tYXRjaAorCitkZWYgZG9fc2hvcnRzKG9wdHMsIG9wdHN0cmluZywgc2hvcnRvcHRzLCBhcmdzKToKKyAgICB3aGlsZSBvcHRzdHJpbmcgIT0gJyc6CisgICAgICAgIG9wdCwgb3B0c3RyaW5nID0gb3B0c3RyaW5nWzBdLCBvcHRzdHJpbmdbMTpdCisgICAgICAgIGlmIHNob3J0X2hhc19hcmcob3B0LCBzaG9ydG9wdHMpOgorICAgICAgICAgICAgaWYgb3B0c3RyaW5nID09ICcnOgorICAgICAgICAgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBHZXRvcHRFcnJvcignb3B0aW9uIC0lcyByZXF1aXJlcyBhcmd1bWVudCcgJSBvcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdCkKKyAgICAgICAgICAgICAgICBvcHRzdHJpbmcsIGFyZ3MgPSBhcmdzWzBdLCBhcmdzWzE6XQorICAgICAgICAgICAgb3B0YXJnLCBvcHRzdHJpbmcgPSBvcHRzdHJpbmcsICcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcHRhcmcgPSAnJworICAgICAgICBvcHRzLmFwcGVuZCgoJy0nICsgb3B0LCBvcHRhcmcpKQorICAgIHJldHVybiBvcHRzLCBhcmdzCisKK2RlZiBzaG9ydF9oYXNfYXJnKG9wdCwgc2hvcnRvcHRzKToKKyAgICBmb3IgaSBpbiByYW5nZShsZW4oc2hvcnRvcHRzKSk6CisgICAgICAgIGlmIG9wdCA9PSBzaG9ydG9wdHNbaV0gIT0gJzonOgorICAgICAgICAgICAgcmV0dXJuIHNob3J0b3B0cy5zdGFydHN3aXRoKCc6JywgaSsxKQorICAgIHJhaXNlIEdldG9wdEVycm9yKCdvcHRpb24gLSVzIG5vdCByZWNvZ25pemVkJyAlIG9wdCwgb3B0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBzeXMKKyAgICBwcmludCBnZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiYTpiIiwgWyJhbHBoYT0iLCAiYmV0YSJdKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nZXRvcHQucHljIGIvbGliL3B5dGhvbjIuNy9nZXRvcHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNzYwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2dldG9wdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nZXRvcHQucHlvIGIvbGliL3B5dGhvbjIuNy9nZXRvcHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDBmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2dldG9wdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nZXRwYXNzLnB5IGIvbGliL3B5dGhvbjIuNy9nZXRwYXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYzZmZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2dldHBhc3MucHkKQEAgLTAsMCArMSwxNzkgQEAKKyIiIlV0aWxpdGllcyB0byBnZXQgYSBwYXNzd29yZCBhbmQvb3IgdGhlIGN1cnJlbnQgdXNlciBuYW1lLgorCitnZXRwYXNzKHByb21wdFssIHN0cmVhbV0pIC0gUHJvbXB0IGZvciBhIHBhc3N3b3JkLCB3aXRoIGVjaG8gdHVybmVkIG9mZi4KK2dldHVzZXIoKSAtIEdldCB0aGUgdXNlciBuYW1lIGZyb20gdGhlIGVudmlyb25tZW50IG9yIHBhc3N3b3JkIGRhdGFiYXNlLgorCitHZXRQYXNzV2FybmluZyAtIFRoaXMgVXNlcldhcm5pbmcgaXMgaXNzdWVkIHdoZW4gZ2V0cGFzcygpIGNhbm5vdCBwcmV2ZW50CisgICAgICAgICAgICAgICAgIGVjaG9pbmcgb2YgdGhlIHBhc3N3b3JkIGNvbnRlbnRzIHdoaWxlIHJlYWRpbmcuCisKK09uIFdpbmRvd3MsIHRoZSBtc3ZjcnQgbW9kdWxlIHdpbGwgYmUgdXNlZC4KK09uIHRoZSBNYWMgRWFzeURpYWxvZ3MuQXNrUGFzc3dvcmQgaXMgdXNlZCwgaWYgYXZhaWxhYmxlLgorCisiIiIKKworIyBBdXRob3JzOiBQaWVycyBMYXVkZXIgKG9yaWdpbmFsKQorIyAgICAgICAgICBHdWlkbyB2YW4gUm9zc3VtIChXaW5kb3dzIHN1cHBvcnQgYW5kIGNsZWFudXApCisjICAgICAgICAgIEdyZWdvcnkgUC4gU21pdGggKHR0eSBzdXBwb3J0ICYgR2V0UGFzc1dhcm5pbmcpCisKK2ltcG9ydCBvcywgc3lzLCB3YXJuaW5ncworCitfX2FsbF9fID0gWyJnZXRwYXNzIiwiZ2V0dXNlciIsIkdldFBhc3NXYXJuaW5nIl0KKworCitjbGFzcyBHZXRQYXNzV2FybmluZyhVc2VyV2FybmluZyk6IHBhc3MKKworCitkZWYgdW5peF9nZXRwYXNzKHByb21wdD0nUGFzc3dvcmQ6ICcsIHN0cmVhbT1Ob25lKToKKyAgICAiIiJQcm9tcHQgZm9yIGEgcGFzc3dvcmQsIHdpdGggZWNobyB0dXJuZWQgb2ZmLgorCisgICAgQXJnczoKKyAgICAgIHByb21wdDogV3JpdHRlbiBvbiBzdHJlYW0gdG8gYXNrIGZvciB0aGUgaW5wdXQuICBEZWZhdWx0OiAnUGFzc3dvcmQ6ICcKKyAgICAgIHN0cmVhbTogQSB3cml0YWJsZSBmaWxlIG9iamVjdCB0byBkaXNwbGF5IHRoZSBwcm9tcHQuICBEZWZhdWx0cyB0bworICAgICAgICAgICAgICB0aGUgdHR5LiAgSWYgbm8gdHR5IGlzIGF2YWlsYWJsZSBkZWZhdWx0cyB0byBzeXMuc3RkZXJyLgorICAgIFJldHVybnM6CisgICAgICBUaGUgc2VLcjN0IGlucHV0LgorICAgIFJhaXNlczoKKyAgICAgIEVPRkVycm9yOiBJZiBvdXIgaW5wdXQgdHR5IG9yIHN0ZGluIHdhcyBjbG9zZWQuCisgICAgICBHZXRQYXNzV2FybmluZzogV2hlbiB3ZSB3ZXJlIHVuYWJsZSB0byB0dXJuIGVjaG8gb2ZmIG9uIHRoZSBpbnB1dC4KKworICAgIEFsd2F5cyByZXN0b3JlcyB0ZXJtaW5hbCBzZXR0aW5ncyBiZWZvcmUgcmV0dXJuaW5nLgorICAgICIiIgorICAgIGZkID0gTm9uZQorICAgIHR0eSA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgICMgQWx3YXlzIHRyeSByZWFkaW5nIGFuZCB3cml0aW5nIGRpcmVjdGx5IG9uIHRoZSB0dHkgZmlyc3QuCisgICAgICAgIGZkID0gb3Mub3BlbignL2Rldi90dHknLCBvcy5PX1JEV1J8b3MuT19OT0NUVFkpCisgICAgICAgIHR0eSA9IG9zLmZkb3BlbihmZCwgJ3crJywgMSkKKyAgICAgICAgaW5wdXQgPSB0dHkKKyAgICAgICAgaWYgbm90IHN0cmVhbToKKyAgICAgICAgICAgIHN0cmVhbSA9IHR0eQorICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOgorICAgICAgICAjIElmIHRoYXQgZmFpbHMsIHNlZSBpZiBzdGRpbiBjYW4gYmUgY29udHJvbGxlZC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmQgPSBzeXMuc3RkaW4uZmlsZW5vKCkKKyAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICBwYXNzd2QgPSBmYWxsYmFja19nZXRwYXNzKHByb21wdCwgc3RyZWFtKQorICAgICAgICBpbnB1dCA9IHN5cy5zdGRpbgorICAgICAgICBpZiBub3Qgc3RyZWFtOgorICAgICAgICAgICAgc3RyZWFtID0gc3lzLnN0ZGVycgorCisgICAgaWYgZmQgaXMgbm90IE5vbmU6CisgICAgICAgIHBhc3N3ZCA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2xkID0gdGVybWlvcy50Y2dldGF0dHIoZmQpICAgICAjIGEgY29weSB0byBzYXZlCisgICAgICAgICAgICBuZXcgPSBvbGRbOl0KKyAgICAgICAgICAgIG5ld1szXSAmPSB+dGVybWlvcy5FQ0hPICAjIDMgPT0gJ2xmbGFncycKKyAgICAgICAgICAgIHRjc2V0YXR0cl9mbGFncyA9IHRlcm1pb3MuVENTQUZMVVNICisgICAgICAgICAgICBpZiBoYXNhdHRyKHRlcm1pb3MsICdUQ1NBU09GVCcpOgorICAgICAgICAgICAgICAgIHRjc2V0YXR0cl9mbGFncyB8PSB0ZXJtaW9zLlRDU0FTT0ZUCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGVybWlvcy50Y3NldGF0dHIoZmQsIHRjc2V0YXR0cl9mbGFncywgbmV3KQorICAgICAgICAgICAgICAgIHBhc3N3ZCA9IF9yYXdfaW5wdXQocHJvbXB0LCBzdHJlYW0sIGlucHV0PWlucHV0KQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0ZXJtaW9zLnRjc2V0YXR0cihmZCwgdGNzZXRhdHRyX2ZsYWdzLCBvbGQpCisgICAgICAgICAgICAgICAgc3RyZWFtLmZsdXNoKCkgICMgaXNzdWU3MjA4CisgICAgICAgIGV4Y2VwdCB0ZXJtaW9zLmVycm9yLCBlOgorICAgICAgICAgICAgaWYgcGFzc3dkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgX3Jhd19pbnB1dCBzdWNjZWVkZWQuICBUaGUgZmluYWwgdGNzZXRhdHRyIGZhaWxlZC4gIFJlcmFpc2UKKyAgICAgICAgICAgICAgICAjIGluc3RlYWQgb2YgbGVhdmluZyB0aGUgdGVybWluYWwgaW4gYW4gdW5rbm93biBzdGF0ZS4KKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgIyBXZSBjYW4ndCBjb250cm9sIHRoZSB0dHkgb3Igc3RkaW4uICBHaXZlIHVwIGFuZCB1c2Ugbm9ybWFsIElPLgorICAgICAgICAgICAgIyBmYWxsYmFja19nZXRwYXNzKCkgcmFpc2VzIGFuIGFwcHJvcHJpYXRlIHdhcm5pbmcuCisgICAgICAgICAgICBkZWwgaW5wdXQsIHR0eSAgIyBjbGVhbiB1cCB1bnVzZWQgZmlsZSBvYmplY3RzIGJlZm9yZSBibG9ja2luZworICAgICAgICAgICAgcGFzc3dkID0gZmFsbGJhY2tfZ2V0cGFzcyhwcm9tcHQsIHN0cmVhbSkKKworICAgIHN0cmVhbS53cml0ZSgnXG4nKQorICAgIHJldHVybiBwYXNzd2QKKworCitkZWYgd2luX2dldHBhc3MocHJvbXB0PSdQYXNzd29yZDogJywgc3RyZWFtPU5vbmUpOgorICAgICIiIlByb21wdCBmb3IgcGFzc3dvcmQgd2l0aCBlY2hvIG9mZiwgdXNpbmcgV2luZG93cyBnZXRjaCgpLiIiIgorICAgIGlmIHN5cy5zdGRpbiBpcyBub3Qgc3lzLl9fc3RkaW5fXzoKKyAgICAgICAgcmV0dXJuIGZhbGxiYWNrX2dldHBhc3MocHJvbXB0LCBzdHJlYW0pCisgICAgaW1wb3J0IG1zdmNydAorICAgIGZvciBjIGluIHByb21wdDoKKyAgICAgICAgbXN2Y3J0LnB1dGNoKGMpCisgICAgcHcgPSAiIgorICAgIHdoaWxlIDE6CisgICAgICAgIGMgPSBtc3ZjcnQuZ2V0Y2goKQorICAgICAgICBpZiBjID09ICdccicgb3IgYyA9PSAnXG4nOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgYyA9PSAnXDAwMyc6CisgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAorICAgICAgICBpZiBjID09ICdcYic6CisgICAgICAgICAgICBwdyA9IHB3WzotMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHB3ID0gcHcgKyBjCisgICAgbXN2Y3J0LnB1dGNoKCdccicpCisgICAgbXN2Y3J0LnB1dGNoKCdcbicpCisgICAgcmV0dXJuIHB3CisKKworZGVmIGZhbGxiYWNrX2dldHBhc3MocHJvbXB0PSdQYXNzd29yZDogJywgc3RyZWFtPU5vbmUpOgorICAgIHdhcm5pbmdzLndhcm4oIkNhbiBub3QgY29udHJvbCBlY2hvIG9uIHRoZSB0ZXJtaW5hbC4iLCBHZXRQYXNzV2FybmluZywKKyAgICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MikKKyAgICBpZiBub3Qgc3RyZWFtOgorICAgICAgICBzdHJlYW0gPSBzeXMuc3RkZXJyCisgICAgcHJpbnQgPj5zdHJlYW0sICJXYXJuaW5nOiBQYXNzd29yZCBpbnB1dCBtYXkgYmUgZWNob2VkLiIKKyAgICByZXR1cm4gX3Jhd19pbnB1dChwcm9tcHQsIHN0cmVhbSkKKworCitkZWYgX3Jhd19pbnB1dChwcm9tcHQ9IiIsIHN0cmVhbT1Ob25lLCBpbnB1dD1Ob25lKToKKyAgICAjIEEgcmF3X2lucHV0KCkgcmVwbGFjZW1lbnQgdGhhdCBkb2Vzbid0IHNhdmUgdGhlIHN0cmluZyBpbiB0aGUKKyAgICAjIEdOVSByZWFkbGluZSBoaXN0b3J5LgorICAgIGlmIG5vdCBzdHJlYW06CisgICAgICAgIHN0cmVhbSA9IHN5cy5zdGRlcnIKKyAgICBpZiBub3QgaW5wdXQ6CisgICAgICAgIGlucHV0ID0gc3lzLnN0ZGluCisgICAgcHJvbXB0ID0gc3RyKHByb21wdCkKKyAgICBpZiBwcm9tcHQ6CisgICAgICAgIHN0cmVhbS53cml0ZShwcm9tcHQpCisgICAgICAgIHN0cmVhbS5mbHVzaCgpCisgICAgIyBOT1RFOiBUaGUgUHl0aG9uIEMgQVBJIGNhbGxzIGZsb2NrZmlsZSgpIChhbmQgdW5sb2NrKSBkdXJpbmcgcmVhZGxpbmUuCisgICAgbGluZSA9IGlucHV0LnJlYWRsaW5lKCkKKyAgICBpZiBub3QgbGluZToKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IKKyAgICBpZiBsaW5lWy0xXSA9PSAnXG4nOgorICAgICAgICBsaW5lID0gbGluZVs6LTFdCisgICAgcmV0dXJuIGxpbmUKKworCitkZWYgZ2V0dXNlcigpOgorICAgICIiIkdldCB0aGUgdXNlcm5hbWUgZnJvbSB0aGUgZW52aXJvbm1lbnQgb3IgcGFzc3dvcmQgZGF0YWJhc2UuCisKKyAgICBGaXJzdCB0cnkgdmFyaW91cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIHRoZW4gdGhlIHBhc3N3b3JkCisgICAgZGF0YWJhc2UuICBUaGlzIHdvcmtzIG9uIFdpbmRvd3MgYXMgbG9uZyBhcyBVU0VSTkFNRSBpcyBzZXQuCisKKyAgICAiIiIKKworICAgIGltcG9ydCBvcworCisgICAgZm9yIG5hbWUgaW4gKCdMT0dOQU1FJywgJ1VTRVInLCAnTE5BTUUnLCAnVVNFUk5BTUUnKToKKyAgICAgICAgdXNlciA9IG9zLmVudmlyb24uZ2V0KG5hbWUpCisgICAgICAgIGlmIHVzZXI6CisgICAgICAgICAgICByZXR1cm4gdXNlcgorCisgICAgIyBJZiB0aGlzIGZhaWxzLCB0aGUgZXhjZXB0aW9uIHdpbGwgImV4cGxhaW4iIHdoeQorICAgIGltcG9ydCBwd2QKKyAgICByZXR1cm4gcHdkLmdldHB3dWlkKG9zLmdldHVpZCgpKVswXQorCisjIEJpbmQgdGhlIG5hbWUgZ2V0cGFzcyB0byB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb24KK3RyeToKKyAgICBpbXBvcnQgdGVybWlvcworICAgICMgaXQncyBwb3NzaWJsZSB0aGVyZSBpcyBhbiBpbmNvbXBhdGlibGUgdGVybWlvcyBmcm9tIHRoZQorICAgICMgTWNNaWxsYW4gSW5zdGFsbGVyLCBtYWtlIHN1cmUgd2UgaGF2ZSBhIFVOSVgtY29tcGF0aWJsZSB0ZXJtaW9zCisgICAgdGVybWlvcy50Y2dldGF0dHIsIHRlcm1pb3MudGNzZXRhdHRyCitleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgbXN2Y3J0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIEVhc3lEaWFsb2dzIGltcG9ydCBBc2tQYXNzd29yZAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBnZXRwYXNzID0gZmFsbGJhY2tfZ2V0cGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ2V0cGFzcyA9IEFza1Bhc3N3b3JkCisgICAgZWxzZToKKyAgICAgICAgZ2V0cGFzcyA9IHdpbl9nZXRwYXNzCitlbHNlOgorICAgIGdldHBhc3MgPSB1bml4X2dldHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZ2V0cGFzcy5weWMgYi9saWIvcHl0aG9uMi43L2dldHBhc3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMGZlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2dldHBhc3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZ2V0cGFzcy5weW8gYi9saWIvcHl0aG9uMi43L2dldHBhc3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMGZlMjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2dldHBhc3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZ2V0dGV4dC5weSBiL2xpYi9weXRob24yLjcvZ2V0dGV4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQ3NTgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9nZXR0ZXh0LnB5CkBAIC0wLDAgKzEsNTkxIEBACisiIiJJbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9uIHN1cHBvcnQuCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGludGVybmF0aW9uYWxpemF0aW9uIChJMThOKSBhbmQgbG9jYWxpemF0aW9uIChMMTBOKQorc3VwcG9ydCBmb3IgeW91ciBQeXRob24gcHJvZ3JhbXMgYnkgcHJvdmlkaW5nIGFuIGludGVyZmFjZSB0byB0aGUgR05VIGdldHRleHQKK21lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgorCitJMThOIHJlZmVycyB0byB0aGUgb3BlcmF0aW9uIGJ5IHdoaWNoIGEgcHJvZ3JhbSBpcyBtYWRlIGF3YXJlIG9mIG11bHRpcGxlCitsYW5ndWFnZXMuICBMMTBOIHJlZmVycyB0byB0aGUgYWRhcHRhdGlvbiBvZiB5b3VyIHByb2dyYW0sIG9uY2UKK2ludGVybmF0aW9uYWxpemVkLCB0byB0aGUgbG9jYWwgbGFuZ3VhZ2UgYW5kIGN1bHR1cmFsIGhhYml0cy4KKworIiIiCisKKyMgVGhpcyBtb2R1bGUgcmVwcmVzZW50cyB0aGUgaW50ZWdyYXRpb24gb2Ygd29yaywgY29udHJpYnV0aW9ucywgZmVlZGJhY2ssIGFuZAorIyBzdWdnZXN0aW9ucyBmcm9tIHRoZSBmb2xsb3dpbmcgcGVvcGxlOgorIworIyBNYXJ0aW4gdm9uIExvZXdpcywgd2hvIHdyb3RlIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nCisjIEMtYmFzZWQgbGliaW50bG1vZHVsZSAobGF0ZXIgcmVuYW1lZCBfZ2V0dGV4dCksIGFsb25nIHdpdGggYSBza2VsZXRhbAorIyBnZXR0ZXh0LnB5IGltcGxlbWVudGF0aW9uLgorIworIyBQZXRlciBGdW5rLCB3aG8gd3JvdGUgZmludGwucHksIGEgZmFpcmx5IGNvbXBsZXRlIHdyYXBwZXIgYXJvdW5kIGludGxtb2R1bGUsCisjIHdoaWNoIGFsc28gaW5jbHVkZWQgYSBwdXJlLVB5dGhvbiBpbXBsZW1lbnRhdGlvbiB0byByZWFkIC5tbyBmaWxlcyBpZgorIyBpbnRsbW9kdWxlIHdhc24ndCBhdmFpbGFibGUuCisjCisjIEphbWVzIEhlbnN0cmlkZ2UsIHdobyBhbHNvIHdyb3RlIGEgZ2V0dGV4dC5weSBtb2R1bGUsIHdoaWNoIGhhcyBzb21lCisjIGludGVyZXN0aW5nLCBidXQgY3VycmVudGx5IHVuc3VwcG9ydGVkIGV4cGVyaW1lbnRhbCBmZWF0dXJlczogdGhlIG5vdGlvbiBvZgorIyBhIENhdGFsb2cgY2xhc3MgYW5kIGluc3RhbmNlcywgYW5kIHRoZSBhYmlsaXR5IHRvIGFkZCB0byBhIGNhdGFsb2cgZmlsZSB2aWEKKyMgYSBQeXRob24gQVBJLgorIworIyBCYXJyeSBXYXJzYXcgaW50ZWdyYXRlZCB0aGVzZSBtb2R1bGVzLCB3cm90ZSB0aGUgLmluc3RhbGwoKSBBUEkgYW5kIGNvZGUsCisjIGFuZCBjb25mb3JtZWQgYWxsIEMgYW5kIFB5dGhvbiBjb2RlIHRvIFB5dGhvbidzIGNvZGluZyBzdGFuZGFyZHMuCisjCisjIEZyYW5jb2lzIFBpbmFyZCBhbmQgTWFyYy1BbmRyZSBMZW1idXJnIGFsc28gY29udHJpYnV0ZWQgdmFsdWFibHkgdG8gdGhpcworIyBtb2R1bGUuCisjCisjIEouIERhdmlkIEliYW5leiBpbXBsZW1lbnRlZCBwbHVyYWwgZm9ybXMuIEJydW5vIEhhaWJsZSBmaXhlZCBzb21lIGJ1Z3MuCisjCisjIFRPRE86CisjIC0gTGF6eSBsb2FkaW5nIG9mIC5tbyBmaWxlcy4gIEN1cnJlbnRseSB0aGUgZW50aXJlIGNhdGFsb2cgaXMgbG9hZGVkIGludG8KKyMgICBtZW1vcnksIGJ1dCB0aGF0J3MgcHJvYmFibHkgYmFkIGZvciBsYXJnZSB0cmFuc2xhdGVkIHByb2dyYW1zLiAgSW5zdGVhZCwKKyMgICB0aGUgbGV4aWNhbCBzb3J0IG9mIG9yaWdpbmFsIHN0cmluZ3MgaW4gR05VIC5tbyBmaWxlcyBzaG91bGQgYmUgZXhwbG9pdGVkCisjICAgdG8gZG8gYmluYXJ5IHNlYXJjaGVzIGFuZCBsYXp5IGluaXRpYWxpemF0aW9ucy4gIE9yIHlvdSBtaWdodCB3YW50IHRvIHVzZQorIyAgIHRoZSB1bmRvY3VtZW50ZWQgZG91YmxlLWhhc2ggYWxnb3JpdGhtIGZvciAubW8gZmlsZXMgd2l0aCBoYXNoIHRhYmxlcywgYnV0CisjICAgeW91J2xsIG5lZWQgdG8gc3R1ZHkgdGhlIEdOVSBnZXR0ZXh0IGNvZGUgdG8gZG8gdGhpcy4KKyMKKyMgLSBTdXBwb3J0IFNvbGFyaXMgLm1vIGZpbGUgZm9ybWF0cy4gIFVuZm9ydHVuYXRlbHksIHdlJ3ZlIGJlZW4gdW5hYmxlIHRvCisjICAgZmluZCB0aGlzIGZvcm1hdCBkb2N1bWVudGVkIGFueXdoZXJlLgorCisKK2ltcG9ydCBsb2NhbGUsIGNvcHksIG9zLCByZSwgc3RydWN0LCBzeXMKK2Zyb20gZXJybm8gaW1wb3J0IEVOT0VOVAorCisKK19fYWxsX18gPSBbJ051bGxUcmFuc2xhdGlvbnMnLCAnR05VVHJhbnNsYXRpb25zJywgJ0NhdGFsb2cnLAorICAgICAgICAgICAnZmluZCcsICd0cmFuc2xhdGlvbicsICdpbnN0YWxsJywgJ3RleHRkb21haW4nLCAnYmluZHRleHRkb21haW4nLAorICAgICAgICAgICAnZGdldHRleHQnLCAnZG5nZXR0ZXh0JywgJ2dldHRleHQnLCAnbmdldHRleHQnLAorICAgICAgICAgICBdCisKK19kZWZhdWx0X2xvY2FsZWRpciA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnc2hhcmUnLCAnbG9jYWxlJykKKworCitkZWYgdGVzdChjb25kaXRpb24sIHRydWUsIGZhbHNlKToKKyAgICAiIiIKKyAgICBJbXBsZW1lbnRzIHRoZSBDIGV4cHJlc3Npb246CisKKyAgICAgIGNvbmRpdGlvbiA/IHRydWUgOiBmYWxzZQorCisgICAgUmVxdWlyZWQgdG8gY29ycmVjdGx5IGludGVycHJldCBwbHVyYWwgZm9ybXMuCisgICAgIiIiCisgICAgaWYgY29uZGl0aW9uOgorICAgICAgICByZXR1cm4gdHJ1ZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBmYWxzZQorCisKK2RlZiBjMnB5KHBsdXJhbCk6CisgICAgIiIiR2V0cyBhIEMgZXhwcmVzc2lvbiBhcyB1c2VkIGluIFBPIGZpbGVzIGZvciBwbHVyYWwgZm9ybXMgYW5kIHJldHVybnMgYQorICAgIFB5dGhvbiBsYW1iZGEgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIGFuIGVxdWl2YWxlbnQgZXhwcmVzc2lvbi4KKyAgICAiIiIKKyAgICAjIFNlY3VyaXR5IGNoZWNrLCBhbGxvdyBvbmx5IHRoZSAibiIgaWRlbnRpZmllcgorICAgIHRyeToKKyAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgIGltcG9ydCB0b2tlbiwgdG9rZW5pemUKKyAgICB0b2tlbnMgPSB0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoU3RyaW5nSU8ocGx1cmFsKS5yZWFkbGluZSkKKyAgICB0cnk6CisgICAgICAgIGRhbmdlciA9IFt4IGZvciB4IGluIHRva2VucyBpZiB4WzBdID09IHRva2VuLk5BTUUgYW5kIHhbMV0gIT0gJ24nXQorICAgIGV4Y2VwdCB0b2tlbml6ZS5Ub2tlbkVycm9yOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCBcCisgICAgICAgICAgICAgICdwbHVyYWwgZm9ybXMgZXhwcmVzc2lvbiBlcnJvciwgbWF5YmUgdW5iYWxhbmNlZCBwYXJlbnRoZXNpcycKKyAgICBlbHNlOgorICAgICAgICBpZiBkYW5nZXI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAncGx1cmFsIGZvcm1zIGV4cHJlc3Npb24gY291bGQgYmUgZGFuZ2Vyb3VzJworCisgICAgIyBSZXBsYWNlIHNvbWUgQyBvcGVyYXRvcnMgYnkgdGhlaXIgUHl0aG9uIGVxdWl2YWxlbnRzCisgICAgcGx1cmFsID0gcGx1cmFsLnJlcGxhY2UoJyYmJywgJyBhbmQgJykKKyAgICBwbHVyYWwgPSBwbHVyYWwucmVwbGFjZSgnfHwnLCAnIG9yICcpCisKKyAgICBleHByID0gcmUuY29tcGlsZShyJ1whKFtePV0pJykKKyAgICBwbHVyYWwgPSBleHByLnN1YignIG5vdCBcXDEnLCBwbHVyYWwpCisKKyAgICAjIFJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgcmVwbGFjZW1lbnQgZnVuY3Rpb24gdXNlZCB0byB0cmFuc2Zvcm0KKyAgICAjICJhP2I6YyIgdG8gInRlc3QoYSxiLGMpIi4KKyAgICBleHByID0gcmUuY29tcGlsZShyJyguKj8pXD8oLio/KTooLiopJykKKyAgICBkZWYgcmVwbCh4KToKKyAgICAgICAgcmV0dXJuICJ0ZXN0KCVzLCAlcywgJXMpIiAlICh4Lmdyb3VwKDEpLCB4Lmdyb3VwKDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIuc3ViKHJlcGwsIHguZ3JvdXAoMykpKQorCisgICAgIyBDb2RlIHRvIHRyYW5zZm9ybSB0aGUgcGx1cmFsIGV4cHJlc3Npb24sIHRha2luZyBjYXJlIG9mIHBhcmVudGhlc2VzCisgICAgc3RhY2sgPSBbJyddCisgICAgZm9yIGMgaW4gcGx1cmFsOgorICAgICAgICBpZiBjID09ICcoJzoKKyAgICAgICAgICAgIHN0YWNrLmFwcGVuZCgnJykKKyAgICAgICAgZWxpZiBjID09ICcpJzoKKyAgICAgICAgICAgIGlmIGxlbihzdGFjaykgPT0gMToKKyAgICAgICAgICAgICAgICAjIEFjdHVhbGx5LCB3ZSBuZXZlciByZWFjaCB0aGlzIGNvZGUsIGJlY2F1c2UgdW5iYWxhbmNlZAorICAgICAgICAgICAgICAgICMgcGFyZW50aGVzZXMgZ2V0IGNhdWdodCBpbiB0aGUgc2VjdXJpdHkgY2hlY2sgYXQgdGhlCisgICAgICAgICAgICAgICAgIyBiZWdpbm5pbmcuCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ3VuYmFsYW5jZWQgcGFyZW50aGVzaXMgaW4gcGx1cmFsIGZvcm0nCisgICAgICAgICAgICBzID0gZXhwci5zdWIocmVwbCwgc3RhY2sucG9wKCkpCisgICAgICAgICAgICBzdGFja1stMV0gKz0gJyglcyknICUgcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhY2tbLTFdICs9IGMKKyAgICBwbHVyYWwgPSBleHByLnN1YihyZXBsLCBzdGFjay5wb3AoKSkKKworICAgIHJldHVybiBldmFsKCdsYW1iZGEgbjogaW50KCVzKScgJSBwbHVyYWwpCisKKworCitkZWYgX2V4cGFuZF9sYW5nKGxvY2FsZSk6CisgICAgZnJvbSBsb2NhbGUgaW1wb3J0IG5vcm1hbGl6ZQorICAgIGxvY2FsZSA9IG5vcm1hbGl6ZShsb2NhbGUpCisgICAgQ09NUE9ORU5UX0NPREVTRVQgICA9IDEgPDwgMAorICAgIENPTVBPTkVOVF9URVJSSVRPUlkgPSAxIDw8IDEKKyAgICBDT01QT05FTlRfTU9ESUZJRVIgID0gMSA8PCAyCisgICAgIyBzcGxpdCB1cCB0aGUgbG9jYWxlIGludG8gaXRzIGJhc2UgY29tcG9uZW50cworICAgIG1hc2sgPSAwCisgICAgcG9zID0gbG9jYWxlLmZpbmQoJ0AnKQorICAgIGlmIHBvcyA+PSAwOgorICAgICAgICBtb2RpZmllciA9IGxvY2FsZVtwb3M6XQorICAgICAgICBsb2NhbGUgPSBsb2NhbGVbOnBvc10KKyAgICAgICAgbWFzayB8PSBDT01QT05FTlRfTU9ESUZJRVIKKyAgICBlbHNlOgorICAgICAgICBtb2RpZmllciA9ICcnCisgICAgcG9zID0gbG9jYWxlLmZpbmQoJy4nKQorICAgIGlmIHBvcyA+PSAwOgorICAgICAgICBjb2Rlc2V0ID0gbG9jYWxlW3BvczpdCisgICAgICAgIGxvY2FsZSA9IGxvY2FsZVs6cG9zXQorICAgICAgICBtYXNrIHw9IENPTVBPTkVOVF9DT0RFU0VUCisgICAgZWxzZToKKyAgICAgICAgY29kZXNldCA9ICcnCisgICAgcG9zID0gbG9jYWxlLmZpbmQoJ18nKQorICAgIGlmIHBvcyA+PSAwOgorICAgICAgICB0ZXJyaXRvcnkgPSBsb2NhbGVbcG9zOl0KKyAgICAgICAgbG9jYWxlID0gbG9jYWxlWzpwb3NdCisgICAgICAgIG1hc2sgfD0gQ09NUE9ORU5UX1RFUlJJVE9SWQorICAgIGVsc2U6CisgICAgICAgIHRlcnJpdG9yeSA9ICcnCisgICAgbGFuZ3VhZ2UgPSBsb2NhbGUKKyAgICByZXQgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKG1hc2srMSk6CisgICAgICAgIGlmIG5vdCAoaSAmIH5tYXNrKTogICMgaWYgYWxsIGNvbXBvbmVudHMgZm9yIHRoaXMgY29tYm8gZXhpc3QgLi4uCisgICAgICAgICAgICB2YWwgPSBsYW5ndWFnZQorICAgICAgICAgICAgaWYgaSAmIENPTVBPTkVOVF9URVJSSVRPUlk6IHZhbCArPSB0ZXJyaXRvcnkKKyAgICAgICAgICAgIGlmIGkgJiBDT01QT05FTlRfQ09ERVNFVDogICB2YWwgKz0gY29kZXNldAorICAgICAgICAgICAgaWYgaSAmIENPTVBPTkVOVF9NT0RJRklFUjogIHZhbCArPSBtb2RpZmllcgorICAgICAgICAgICAgcmV0LmFwcGVuZCh2YWwpCisgICAgcmV0LnJldmVyc2UoKQorICAgIHJldHVybiByZXQKKworCisKK2NsYXNzIE51bGxUcmFuc2xhdGlvbnM6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZwPU5vbmUpOgorICAgICAgICBzZWxmLl9pbmZvID0ge30KKyAgICAgICAgc2VsZi5fY2hhcnNldCA9IE5vbmUKKyAgICAgICAgc2VsZi5fb3V0cHV0X2NoYXJzZXQgPSBOb25lCisgICAgICAgIHNlbGYuX2ZhbGxiYWNrID0gTm9uZQorICAgICAgICBpZiBmcCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlKGZwKQorCisgICAgZGVmIF9wYXJzZShzZWxmLCBmcCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBhZGRfZmFsbGJhY2soc2VsZiwgZmFsbGJhY2spOgorICAgICAgICBpZiBzZWxmLl9mYWxsYmFjazoKKyAgICAgICAgICAgIHNlbGYuX2ZhbGxiYWNrLmFkZF9mYWxsYmFjayhmYWxsYmFjaykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2ZhbGxiYWNrID0gZmFsbGJhY2sKKworICAgIGRlZiBnZXR0ZXh0KHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBpZiBzZWxmLl9mYWxsYmFjazoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWxsYmFjay5nZXR0ZXh0KG1lc3NhZ2UpCisgICAgICAgIHJldHVybiBtZXNzYWdlCisKKyAgICBkZWYgbGdldHRleHQoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIGlmIHNlbGYuX2ZhbGxiYWNrOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZhbGxiYWNrLmxnZXR0ZXh0KG1lc3NhZ2UpCisgICAgICAgIHJldHVybiBtZXNzYWdlCisKKyAgICBkZWYgbmdldHRleHQoc2VsZiwgbXNnaWQxLCBtc2dpZDIsIG4pOgorICAgICAgICBpZiBzZWxmLl9mYWxsYmFjazoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWxsYmFjay5uZ2V0dGV4dChtc2dpZDEsIG1zZ2lkMiwgbikKKyAgICAgICAgaWYgbiA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIG1zZ2lkMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG1zZ2lkMgorCisgICAgZGVmIGxuZ2V0dGV4dChzZWxmLCBtc2dpZDEsIG1zZ2lkMiwgbik6CisgICAgICAgIGlmIHNlbGYuX2ZhbGxiYWNrOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZhbGxiYWNrLmxuZ2V0dGV4dChtc2dpZDEsIG1zZ2lkMiwgbikKKyAgICAgICAgaWYgbiA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIG1zZ2lkMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG1zZ2lkMgorCisgICAgZGVmIHVnZXR0ZXh0KHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBpZiBzZWxmLl9mYWxsYmFjazoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWxsYmFjay51Z2V0dGV4dChtZXNzYWdlKQorICAgICAgICByZXR1cm4gdW5pY29kZShtZXNzYWdlKQorCisgICAgZGVmIHVuZ2V0dGV4dChzZWxmLCBtc2dpZDEsIG1zZ2lkMiwgbik6CisgICAgICAgIGlmIHNlbGYuX2ZhbGxiYWNrOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZhbGxiYWNrLnVuZ2V0dGV4dChtc2dpZDEsIG1zZ2lkMiwgbikKKyAgICAgICAgaWYgbiA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUobXNnaWQxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUobXNnaWQyKQorCisgICAgZGVmIGluZm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pbmZvCisKKyAgICBkZWYgY2hhcnNldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoYXJzZXQKKworICAgIGRlZiBvdXRwdXRfY2hhcnNldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX291dHB1dF9jaGFyc2V0CisKKyAgICBkZWYgc2V0X291dHB1dF9jaGFyc2V0KHNlbGYsIGNoYXJzZXQpOgorICAgICAgICBzZWxmLl9vdXRwdXRfY2hhcnNldCA9IGNoYXJzZXQKKworICAgIGRlZiBpbnN0YWxsKHNlbGYsIHVuaWNvZGU9RmFsc2UsIG5hbWVzPU5vbmUpOgorICAgICAgICBpbXBvcnQgX19idWlsdGluX18KKyAgICAgICAgX19idWlsdGluX18uX19kaWN0X19bJ18nXSA9IHVuaWNvZGUgYW5kIHNlbGYudWdldHRleHQgb3Igc2VsZi5nZXR0ZXh0CisgICAgICAgIGlmIGhhc2F0dHIobmFtZXMsICJfX2NvbnRhaW5zX18iKToKKyAgICAgICAgICAgIGlmICJnZXR0ZXh0IiBpbiBuYW1lczoKKyAgICAgICAgICAgICAgICBfX2J1aWx0aW5fXy5fX2RpY3RfX1snZ2V0dGV4dCddID0gX19idWlsdGluX18uX19kaWN0X19bJ18nXQorICAgICAgICAgICAgaWYgIm5nZXR0ZXh0IiBpbiBuYW1lczoKKyAgICAgICAgICAgICAgICBfX2J1aWx0aW5fXy5fX2RpY3RfX1snbmdldHRleHQnXSA9ICh1bmljb2RlIGFuZCBzZWxmLnVuZ2V0dGV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYubmdldHRleHQpCisgICAgICAgICAgICBpZiAibGdldHRleHQiIGluIG5hbWVzOgorICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9fLl9fZGljdF9fWydsZ2V0dGV4dCddID0gc2VsZi5sZ2V0dGV4dAorICAgICAgICAgICAgaWYgImxuZ2V0dGV4dCIgaW4gbmFtZXM6CisgICAgICAgICAgICAgICAgX19idWlsdGluX18uX19kaWN0X19bJ2xuZ2V0dGV4dCddID0gc2VsZi5sbmdldHRleHQKKworCitjbGFzcyBHTlVUcmFuc2xhdGlvbnMoTnVsbFRyYW5zbGF0aW9ucyk6CisgICAgIyBNYWdpYyBudW1iZXIgb2YgLm1vIGZpbGVzCisgICAgTEVfTUFHSUMgPSAweDk1MDQxMmRlTAorICAgIEJFX01BR0lDID0gMHhkZTEyMDQ5NUwKKworICAgIGRlZiBfcGFyc2Uoc2VsZiwgZnApOgorICAgICAgICAiIiJPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBzdXBwb3J0IGFsdGVybmF0aXZlIC5tbyBmb3JtYXRzLiIiIgorICAgICAgICB1bnBhY2sgPSBzdHJ1Y3QudW5wYWNrCisgICAgICAgIGZpbGVuYW1lID0gZ2V0YXR0cihmcCwgJ25hbWUnLCAnJykKKyAgICAgICAgIyBQYXJzZSB0aGUgLm1vIGZpbGUgaGVhZGVyLCB3aGljaCBjb25zaXN0cyBvZiA1IGxpdHRsZSBlbmRpYW4gMzIKKyAgICAgICAgIyBiaXQgd29yZHMuCisgICAgICAgIHNlbGYuX2NhdGFsb2cgPSBjYXRhbG9nID0ge30KKyAgICAgICAgc2VsZi5wbHVyYWwgPSBsYW1iZGEgbjogaW50KG4gIT0gMSkgIyBnZXJtYW5pYyBwbHVyYWwgYnkgZGVmYXVsdAorICAgICAgICBidWYgPSBmcC5yZWFkKCkKKyAgICAgICAgYnVmbGVuID0gbGVuKGJ1ZikKKyAgICAgICAgIyBBcmUgd2UgYmlnIGVuZGlhbiBvciBsaXR0bGUgZW5kaWFuPworICAgICAgICBtYWdpYyA9IHVucGFjaygnPEknLCBidWZbOjRdKVswXQorICAgICAgICBpZiBtYWdpYyA9PSBzZWxmLkxFX01BR0lDOgorICAgICAgICAgICAgdmVyc2lvbiwgbXNnY291bnQsIG1hc3RlcmlkeCwgdHJhbnNpZHggPSB1bnBhY2soJzw0SScsIGJ1Zls0OjIwXSkKKyAgICAgICAgICAgIGlpID0gJzxJSScKKyAgICAgICAgZWxpZiBtYWdpYyA9PSBzZWxmLkJFX01BR0lDOgorICAgICAgICAgICAgdmVyc2lvbiwgbXNnY291bnQsIG1hc3RlcmlkeCwgdHJhbnNpZHggPSB1bnBhY2soJz40SScsIGJ1Zls0OjIwXSkKKyAgICAgICAgICAgIGlpID0gJz5JSScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoMCwgJ0JhZCBtYWdpYyBudW1iZXInLCBmaWxlbmFtZSkKKyAgICAgICAgIyBOb3cgcHV0IGFsbCBtZXNzYWdlcyBmcm9tIHRoZSAubW8gZmlsZSBidWZmZXIgaW50byB0aGUgY2F0YWxvZworICAgICAgICAjIGRpY3Rpb25hcnkuCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgwLCBtc2djb3VudCk6CisgICAgICAgICAgICBtbGVuLCBtb2ZmID0gdW5wYWNrKGlpLCBidWZbbWFzdGVyaWR4Om1hc3RlcmlkeCs4XSkKKyAgICAgICAgICAgIG1lbmQgPSBtb2ZmICsgbWxlbgorICAgICAgICAgICAgdGxlbiwgdG9mZiA9IHVucGFjayhpaSwgYnVmW3RyYW5zaWR4OnRyYW5zaWR4KzhdKQorICAgICAgICAgICAgdGVuZCA9IHRvZmYgKyB0bGVuCisgICAgICAgICAgICBpZiBtZW5kIDwgYnVmbGVuIGFuZCB0ZW5kIDwgYnVmbGVuOgorICAgICAgICAgICAgICAgIG1zZyA9IGJ1Zlttb2ZmOm1lbmRdCisgICAgICAgICAgICAgICAgdG1zZyA9IGJ1Zlt0b2ZmOnRlbmRdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoMCwgJ0ZpbGUgaXMgY29ycnVwdCcsIGZpbGVuYW1lKQorICAgICAgICAgICAgIyBTZWUgaWYgd2UncmUgbG9va2luZyBhdCBHTlUgLm1vIGNvbnZlbnRpb25zIGZvciBtZXRhZGF0YQorICAgICAgICAgICAgaWYgbWxlbiA9PSAwOgorICAgICAgICAgICAgICAgICMgQ2F0YWxvZyBkZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgIGxhc3RrID0gayA9IE5vbmUKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB0bXNnLnNwbGl0bGluZXMoKToKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW0uc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXRlbToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmICc6JyBpbiBpdGVtOgorICAgICAgICAgICAgICAgICAgICAgICAgaywgdiA9IGl0ZW0uc3BsaXQoJzonLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgayA9IGsuc3RyaXAoKS5sb3dlcigpCisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdi5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbmZvW2tdID0gdgorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGsgPSBrCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbGFzdGs6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbmZvW2xhc3RrXSArPSAnXG4nICsgaXRlbQorICAgICAgICAgICAgICAgICAgICBpZiBrID09ICdjb250ZW50LXR5cGUnOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2hhcnNldCA9IHYuc3BsaXQoJ2NoYXJzZXQ9JylbMV0KKyAgICAgICAgICAgICAgICAgICAgZWxpZiBrID09ICdwbHVyYWwtZm9ybXMnOgorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHYuc3BsaXQoJzsnKQorICAgICAgICAgICAgICAgICAgICAgICAgcGx1cmFsID0gdlsxXS5zcGxpdCgncGx1cmFsPScpWzFdCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBsdXJhbCA9IGMycHkocGx1cmFsKQorICAgICAgICAgICAgIyBOb3RlOiB3ZSB1bmNvbmRpdGlvbmFsbHkgY29udmVydCBib3RoIG1zZ2lkcyBhbmQgbXNnc3RycyB0bworICAgICAgICAgICAgIyBVbmljb2RlIHVzaW5nIHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgc3BlY2lmaWVkIGluIHRoZSBjaGFyc2V0CisgICAgICAgICAgICAjIHBhcmFtZXRlciBvZiB0aGUgQ29udGVudC1UeXBlIGhlYWRlci4gIFRoZSBnZXR0ZXh0IGRvY3VtZW50YXRpb24KKyAgICAgICAgICAgICMgc3Ryb25nbHkgZW5jb3VyYWdlcyBtc2dpZHMgdG8gYmUgdXMtYXNjaWksIGJ1dCBzb21lIGFwcGxpY2F0aW9ucworICAgICAgICAgICAgIyByZXF1aXJlIGFsdGVybmF0aXZlIGVuY29kaW5ncyAoZS5nLiBab3BlJ3MgWkNNTCBhbmQgWlBUKS4gIEZvcgorICAgICAgICAgICAgIyB0cmFkaXRpb25hbCBnZXR0ZXh0IGFwcGxpY2F0aW9ucywgdGhlIG1zZ2lkIGNvbnZlcnNpb24gd2lsbAorICAgICAgICAgICAgIyBjYXVzZSBubyBwcm9ibGVtcyBzaW5jZSB1cy1hc2NpaSBzaG91bGQgYWx3YXlzIGJlIGEgc3Vic2V0IG9mCisgICAgICAgICAgICAjIHRoZSBjaGFyc2V0IGVuY29kaW5nLiAgV2UgbWF5IHdhbnQgdG8gZmFsbCBiYWNrIHRvIDgtYml0IG1zZ2lkcworICAgICAgICAgICAgIyBpZiB0aGUgVW5pY29kZSBjb252ZXJzaW9uIGZhaWxzLgorICAgICAgICAgICAgaWYgJ1x4MDAnIGluIG1zZzoKKyAgICAgICAgICAgICAgICAjIFBsdXJhbCBmb3JtcworICAgICAgICAgICAgICAgIG1zZ2lkMSwgbXNnaWQyID0gbXNnLnNwbGl0KCdceDAwJykKKyAgICAgICAgICAgICAgICB0bXNnID0gdG1zZy5zcGxpdCgnXHgwMCcpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fY2hhcnNldDoKKyAgICAgICAgICAgICAgICAgICAgbXNnaWQxID0gdW5pY29kZShtc2dpZDEsIHNlbGYuX2NoYXJzZXQpCisgICAgICAgICAgICAgICAgICAgIHRtc2cgPSBbdW5pY29kZSh4LCBzZWxmLl9jaGFyc2V0KSBmb3IgeCBpbiB0bXNnXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbih0bXNnKSk6CisgICAgICAgICAgICAgICAgICAgIGNhdGFsb2dbKG1zZ2lkMSwgaSldID0gdG1zZ1tpXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9jaGFyc2V0OgorICAgICAgICAgICAgICAgICAgICBtc2cgPSB1bmljb2RlKG1zZywgc2VsZi5fY2hhcnNldCkKKyAgICAgICAgICAgICAgICAgICAgdG1zZyA9IHVuaWNvZGUodG1zZywgc2VsZi5fY2hhcnNldCkKKyAgICAgICAgICAgICAgICBjYXRhbG9nW21zZ10gPSB0bXNnCisgICAgICAgICAgICAjIGFkdmFuY2UgdG8gbmV4dCBlbnRyeSBpbiB0aGUgc2VlayB0YWJsZXMKKyAgICAgICAgICAgIG1hc3RlcmlkeCArPSA4CisgICAgICAgICAgICB0cmFuc2lkeCArPSA4CisKKyAgICBkZWYgZ2V0dGV4dChzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCisgICAgICAgIHRtc2cgPSBzZWxmLl9jYXRhbG9nLmdldChtZXNzYWdlLCBtaXNzaW5nKQorICAgICAgICBpZiB0bXNnIGlzIG1pc3Npbmc6CisgICAgICAgICAgICBpZiBzZWxmLl9mYWxsYmFjazoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFsbGJhY2suZ2V0dGV4dChtZXNzYWdlKQorICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UKKyAgICAgICAgIyBFbmNvZGUgdGhlIFVuaWNvZGUgdG1zZyBiYWNrIHRvIGFuIDgtYml0IHN0cmluZywgaWYgcG9zc2libGUKKyAgICAgICAgaWYgc2VsZi5fb3V0cHV0X2NoYXJzZXQ6CisgICAgICAgICAgICByZXR1cm4gdG1zZy5lbmNvZGUoc2VsZi5fb3V0cHV0X2NoYXJzZXQpCisgICAgICAgIGVsaWYgc2VsZi5fY2hhcnNldDoKKyAgICAgICAgICAgIHJldHVybiB0bXNnLmVuY29kZShzZWxmLl9jaGFyc2V0KQorICAgICAgICByZXR1cm4gdG1zZworCisgICAgZGVmIGxnZXR0ZXh0KHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKKyAgICAgICAgdG1zZyA9IHNlbGYuX2NhdGFsb2cuZ2V0KG1lc3NhZ2UsIG1pc3NpbmcpCisgICAgICAgIGlmIHRtc2cgaXMgbWlzc2luZzoKKyAgICAgICAgICAgIGlmIHNlbGYuX2ZhbGxiYWNrOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWxsYmFjay5sZ2V0dGV4dChtZXNzYWdlKQorICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UKKyAgICAgICAgaWYgc2VsZi5fb3V0cHV0X2NoYXJzZXQ6CisgICAgICAgICAgICByZXR1cm4gdG1zZy5lbmNvZGUoc2VsZi5fb3V0cHV0X2NoYXJzZXQpCisgICAgICAgIHJldHVybiB0bXNnLmVuY29kZShsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoKSkKKworICAgIGRlZiBuZ2V0dGV4dChzZWxmLCBtc2dpZDEsIG1zZ2lkMiwgbik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRtc2cgPSBzZWxmLl9jYXRhbG9nWyhtc2dpZDEsIHNlbGYucGx1cmFsKG4pKV0KKyAgICAgICAgICAgIGlmIHNlbGYuX291dHB1dF9jaGFyc2V0OgorICAgICAgICAgICAgICAgIHJldHVybiB0bXNnLmVuY29kZShzZWxmLl9vdXRwdXRfY2hhcnNldCkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5fY2hhcnNldDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdG1zZy5lbmNvZGUoc2VsZi5fY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiB0bXNnCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGlmIHNlbGYuX2ZhbGxiYWNrOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWxsYmFjay5uZ2V0dGV4dChtc2dpZDEsIG1zZ2lkMiwgbikKKyAgICAgICAgICAgIGlmIG4gPT0gMToKKyAgICAgICAgICAgICAgICByZXR1cm4gbXNnaWQxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBtc2dpZDIKKworICAgIGRlZiBsbmdldHRleHQoc2VsZiwgbXNnaWQxLCBtc2dpZDIsIG4pOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0bXNnID0gc2VsZi5fY2F0YWxvZ1sobXNnaWQxLCBzZWxmLnBsdXJhbChuKSldCisgICAgICAgICAgICBpZiBzZWxmLl9vdXRwdXRfY2hhcnNldDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdG1zZy5lbmNvZGUoc2VsZi5fb3V0cHV0X2NoYXJzZXQpCisgICAgICAgICAgICByZXR1cm4gdG1zZy5lbmNvZGUobG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nKCkpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGlmIHNlbGYuX2ZhbGxiYWNrOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWxsYmFjay5sbmdldHRleHQobXNnaWQxLCBtc2dpZDIsIG4pCisgICAgICAgICAgICBpZiBuID09IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zZ2lkMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbXNnaWQyCisKKyAgICBkZWYgdWdldHRleHQoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIG1pc3NpbmcgPSBvYmplY3QoKQorICAgICAgICB0bXNnID0gc2VsZi5fY2F0YWxvZy5nZXQobWVzc2FnZSwgbWlzc2luZykKKyAgICAgICAgaWYgdG1zZyBpcyBtaXNzaW5nOgorICAgICAgICAgICAgaWYgc2VsZi5fZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZhbGxiYWNrLnVnZXR0ZXh0KG1lc3NhZ2UpCisgICAgICAgICAgICByZXR1cm4gdW5pY29kZShtZXNzYWdlKQorICAgICAgICByZXR1cm4gdG1zZworCisgICAgZGVmIHVuZ2V0dGV4dChzZWxmLCBtc2dpZDEsIG1zZ2lkMiwgbik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRtc2cgPSBzZWxmLl9jYXRhbG9nWyhtc2dpZDEsIHNlbGYucGx1cmFsKG4pKV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgc2VsZi5fZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZhbGxiYWNrLnVuZ2V0dGV4dChtc2dpZDEsIG1zZ2lkMiwgbikKKyAgICAgICAgICAgIGlmIG4gPT0gMToKKyAgICAgICAgICAgICAgICB0bXNnID0gdW5pY29kZShtc2dpZDEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRtc2cgPSB1bmljb2RlKG1zZ2lkMikKKyAgICAgICAgcmV0dXJuIHRtc2cKKworCisjIExvY2F0ZSBhIC5tbyBmaWxlIHVzaW5nIHRoZSBnZXR0ZXh0IHN0cmF0ZWd5CitkZWYgZmluZChkb21haW4sIGxvY2FsZWRpcj1Ob25lLCBsYW5ndWFnZXM9Tm9uZSwgYWxsPTApOgorICAgICMgR2V0IHNvbWUgcmVhc29uYWJsZSBkZWZhdWx0cyBmb3IgYXJndW1lbnRzIHRoYXQgd2VyZSBub3Qgc3VwcGxpZWQKKyAgICBpZiBsb2NhbGVkaXIgaXMgTm9uZToKKyAgICAgICAgbG9jYWxlZGlyID0gX2RlZmF1bHRfbG9jYWxlZGlyCisgICAgaWYgbGFuZ3VhZ2VzIGlzIE5vbmU6CisgICAgICAgIGxhbmd1YWdlcyA9IFtdCisgICAgICAgIGZvciBlbnZhciBpbiAoJ0xBTkdVQUdFJywgJ0xDX0FMTCcsICdMQ19NRVNTQUdFUycsICdMQU5HJyk6CisgICAgICAgICAgICB2YWwgPSBvcy5lbnZpcm9uLmdldChlbnZhcikKKyAgICAgICAgICAgIGlmIHZhbDoKKyAgICAgICAgICAgICAgICBsYW5ndWFnZXMgPSB2YWwuc3BsaXQoJzonKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmICdDJyBub3QgaW4gbGFuZ3VhZ2VzOgorICAgICAgICAgICAgbGFuZ3VhZ2VzLmFwcGVuZCgnQycpCisgICAgIyBub3cgbm9ybWFsaXplIGFuZCBleHBhbmQgdGhlIGxhbmd1YWdlcworICAgIG5lbGFuZ3MgPSBbXQorICAgIGZvciBsYW5nIGluIGxhbmd1YWdlczoKKyAgICAgICAgZm9yIG5lbGFuZyBpbiBfZXhwYW5kX2xhbmcobGFuZyk6CisgICAgICAgICAgICBpZiBuZWxhbmcgbm90IGluIG5lbGFuZ3M6CisgICAgICAgICAgICAgICAgbmVsYW5ncy5hcHBlbmQobmVsYW5nKQorICAgICMgc2VsZWN0IGEgbGFuZ3VhZ2UKKyAgICBpZiBhbGw6CisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgZWxzZToKKyAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgIGZvciBsYW5nIGluIG5lbGFuZ3M6CisgICAgICAgIGlmIGxhbmcgPT0gJ0MnOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgbW9maWxlID0gb3MucGF0aC5qb2luKGxvY2FsZWRpciwgbGFuZywgJ0xDX01FU1NBR0VTJywgJyVzLm1vJyAlIGRvbWFpbikKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobW9maWxlKToKKyAgICAgICAgICAgIGlmIGFsbDoKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKG1vZmlsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZmlsZQorICAgIHJldHVybiByZXN1bHQKKworCisKKyMgYSBtYXBwaW5nIGJldHdlZW4gYWJzb2x1dGUgLm1vIGZpbGUgcGF0aCBhbmQgVHJhbnNsYXRpb24gb2JqZWN0CitfdHJhbnNsYXRpb25zID0ge30KKworZGVmIHRyYW5zbGF0aW9uKGRvbWFpbiwgbG9jYWxlZGlyPU5vbmUsIGxhbmd1YWdlcz1Ob25lLAorICAgICAgICAgICAgICAgIGNsYXNzXz1Ob25lLCBmYWxsYmFjaz1GYWxzZSwgY29kZXNldD1Ob25lKToKKyAgICBpZiBjbGFzc18gaXMgTm9uZToKKyAgICAgICAgY2xhc3NfID0gR05VVHJhbnNsYXRpb25zCisgICAgbW9maWxlcyA9IGZpbmQoZG9tYWluLCBsb2NhbGVkaXIsIGxhbmd1YWdlcywgYWxsPTEpCisgICAgaWYgbm90IG1vZmlsZXM6CisgICAgICAgIGlmIGZhbGxiYWNrOgorICAgICAgICAgICAgcmV0dXJuIE51bGxUcmFuc2xhdGlvbnMoKQorICAgICAgICByYWlzZSBJT0Vycm9yKEVOT0VOVCwgJ05vIHRyYW5zbGF0aW9uIGZpbGUgZm91bmQgZm9yIGRvbWFpbicsIGRvbWFpbikKKyAgICAjIEF2b2lkIG9wZW5pbmcsIHJlYWRpbmcsIGFuZCBwYXJzaW5nIHRoZSAubW8gZmlsZSBhZnRlciBpdCdzIGJlZW4gZG9uZQorICAgICMgb25jZS4KKyAgICByZXN1bHQgPSBOb25lCisgICAgZm9yIG1vZmlsZSBpbiBtb2ZpbGVzOgorICAgICAgICBrZXkgPSAoY2xhc3NfLCBvcy5wYXRoLmFic3BhdGgobW9maWxlKSkKKyAgICAgICAgdCA9IF90cmFuc2xhdGlvbnMuZ2V0KGtleSkKKyAgICAgICAgaWYgdCBpcyBOb25lOgorICAgICAgICAgICAgd2l0aCBvcGVuKG1vZmlsZSwgJ3JiJykgYXMgZnA6CisgICAgICAgICAgICAgICAgdCA9IF90cmFuc2xhdGlvbnMuc2V0ZGVmYXVsdChrZXksIGNsYXNzXyhmcCkpCisgICAgICAgICMgQ29weSB0aGUgdHJhbnNsYXRpb24gb2JqZWN0IHRvIGFsbG93IHNldHRpbmcgZmFsbGJhY2tzIGFuZAorICAgICAgICAjIG91dHB1dCBjaGFyc2V0LiBBbGwgb3RoZXIgaW5zdGFuY2UgZGF0YSBpcyBzaGFyZWQgd2l0aCB0aGUKKyAgICAgICAgIyBjYWNoZWQgb2JqZWN0LgorICAgICAgICB0ID0gY29weS5jb3B5KHQpCisgICAgICAgIGlmIGNvZGVzZXQ6CisgICAgICAgICAgICB0LnNldF9vdXRwdXRfY2hhcnNldChjb2Rlc2V0KQorICAgICAgICBpZiByZXN1bHQgaXMgTm9uZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdC5hZGRfZmFsbGJhY2sodCkKKyAgICByZXR1cm4gcmVzdWx0CisKKworZGVmIGluc3RhbGwoZG9tYWluLCBsb2NhbGVkaXI9Tm9uZSwgdW5pY29kZT1GYWxzZSwgY29kZXNldD1Ob25lLCBuYW1lcz1Ob25lKToKKyAgICB0ID0gdHJhbnNsYXRpb24oZG9tYWluLCBsb2NhbGVkaXIsIGZhbGxiYWNrPVRydWUsIGNvZGVzZXQ9Y29kZXNldCkKKyAgICB0Lmluc3RhbGwodW5pY29kZSwgbmFtZXMpCisKKworCisjIGEgbWFwcGluZyBiL3cgZG9tYWlucyBhbmQgbG9jYWxlIGRpcmVjdG9yaWVzCitfbG9jYWxlZGlycyA9IHt9CisjIGEgbWFwcGluZyBiL3cgZG9tYWlucyBhbmQgY29kZXNldHMKK19sb2NhbGVjb2Rlc2V0cyA9IHt9CisjIGN1cnJlbnQgZ2xvYmFsIGRvbWFpbiwgYG1lc3NhZ2VzJyB1c2VkIGZvciBjb21wYXRpYmlsaXR5IHcvIEdOVSBnZXR0ZXh0CitfY3VycmVudF9kb21haW4gPSAnbWVzc2FnZXMnCisKKworZGVmIHRleHRkb21haW4oZG9tYWluPU5vbmUpOgorICAgIGdsb2JhbCBfY3VycmVudF9kb21haW4KKyAgICBpZiBkb21haW4gaXMgbm90IE5vbmU6CisgICAgICAgIF9jdXJyZW50X2RvbWFpbiA9IGRvbWFpbgorICAgIHJldHVybiBfY3VycmVudF9kb21haW4KKworCitkZWYgYmluZHRleHRkb21haW4oZG9tYWluLCBsb2NhbGVkaXI9Tm9uZSk6CisgICAgZ2xvYmFsIF9sb2NhbGVkaXJzCisgICAgaWYgbG9jYWxlZGlyIGlzIG5vdCBOb25lOgorICAgICAgICBfbG9jYWxlZGlyc1tkb21haW5dID0gbG9jYWxlZGlyCisgICAgcmV0dXJuIF9sb2NhbGVkaXJzLmdldChkb21haW4sIF9kZWZhdWx0X2xvY2FsZWRpcikKKworCitkZWYgYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoZG9tYWluLCBjb2Rlc2V0PU5vbmUpOgorICAgIGdsb2JhbCBfbG9jYWxlY29kZXNldHMKKyAgICBpZiBjb2Rlc2V0IGlzIG5vdCBOb25lOgorICAgICAgICBfbG9jYWxlY29kZXNldHNbZG9tYWluXSA9IGNvZGVzZXQKKyAgICByZXR1cm4gX2xvY2FsZWNvZGVzZXRzLmdldChkb21haW4pCisKKworZGVmIGRnZXR0ZXh0KGRvbWFpbiwgbWVzc2FnZSk6CisgICAgdHJ5OgorICAgICAgICB0ID0gdHJhbnNsYXRpb24oZG9tYWluLCBfbG9jYWxlZGlycy5nZXQoZG9tYWluLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQ9X2xvY2FsZWNvZGVzZXRzLmdldChkb21haW4pKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICByZXR1cm4gbWVzc2FnZQorICAgIHJldHVybiB0LmdldHRleHQobWVzc2FnZSkKKworZGVmIGxkZ2V0dGV4dChkb21haW4sIG1lc3NhZ2UpOgorICAgIHRyeToKKyAgICAgICAgdCA9IHRyYW5zbGF0aW9uKGRvbWFpbiwgX2xvY2FsZWRpcnMuZ2V0KGRvbWFpbiwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0PV9sb2NhbGVjb2Rlc2V0cy5nZXQoZG9tYWluKSkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UKKyAgICByZXR1cm4gdC5sZ2V0dGV4dChtZXNzYWdlKQorCitkZWYgZG5nZXR0ZXh0KGRvbWFpbiwgbXNnaWQxLCBtc2dpZDIsIG4pOgorICAgIHRyeToKKyAgICAgICAgdCA9IHRyYW5zbGF0aW9uKGRvbWFpbiwgX2xvY2FsZWRpcnMuZ2V0KGRvbWFpbiwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0PV9sb2NhbGVjb2Rlc2V0cy5nZXQoZG9tYWluKSkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgaWYgbiA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIG1zZ2lkMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG1zZ2lkMgorICAgIHJldHVybiB0Lm5nZXR0ZXh0KG1zZ2lkMSwgbXNnaWQyLCBuKQorCitkZWYgbGRuZ2V0dGV4dChkb21haW4sIG1zZ2lkMSwgbXNnaWQyLCBuKToKKyAgICB0cnk6CisgICAgICAgIHQgPSB0cmFuc2xhdGlvbihkb21haW4sIF9sb2NhbGVkaXJzLmdldChkb21haW4sIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldD1fbG9jYWxlY29kZXNldHMuZ2V0KGRvbWFpbikpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIGlmIG4gPT0gMToKKyAgICAgICAgICAgIHJldHVybiBtc2dpZDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBtc2dpZDIKKyAgICByZXR1cm4gdC5sbmdldHRleHQobXNnaWQxLCBtc2dpZDIsIG4pCisKK2RlZiBnZXR0ZXh0KG1lc3NhZ2UpOgorICAgIHJldHVybiBkZ2V0dGV4dChfY3VycmVudF9kb21haW4sIG1lc3NhZ2UpCisKK2RlZiBsZ2V0dGV4dChtZXNzYWdlKToKKyAgICByZXR1cm4gbGRnZXR0ZXh0KF9jdXJyZW50X2RvbWFpbiwgbWVzc2FnZSkKKworZGVmIG5nZXR0ZXh0KG1zZ2lkMSwgbXNnaWQyLCBuKToKKyAgICByZXR1cm4gZG5nZXR0ZXh0KF9jdXJyZW50X2RvbWFpbiwgbXNnaWQxLCBtc2dpZDIsIG4pCisKK2RlZiBsbmdldHRleHQobXNnaWQxLCBtc2dpZDIsIG4pOgorICAgIHJldHVybiBsZG5nZXR0ZXh0KF9jdXJyZW50X2RvbWFpbiwgbXNnaWQxLCBtc2dpZDIsIG4pCisKKyMgZGNnZXR0ZXh0KCkgaGFzIGJlZW4gZGVlbWVkIHVubmVjZXNzYXJ5IGFuZCBpcyBub3QgaW1wbGVtZW50ZWQuCisKKyMgSmFtZXMgSGVuc3RyaWRnZSdzIENhdGFsb2cgY29uc3RydWN0b3IgZnJvbSBHTk9NRSBnZXR0ZXh0LiAgRG9jdW1lbnRlZCB1c2FnZQorIyB3YXM6CisjCisjICAgIGltcG9ydCBnZXR0ZXh0CisjICAgIGNhdCA9IGdldHRleHQuQ2F0YWxvZyhQQUNLQUdFLCBsb2NhbGVkaXI9TE9DQUxFRElSKQorIyAgICBfID0gY2F0LmdldHRleHQKKyMgICAgcHJpbnQgXygnSGVsbG8gV29ybGQnKQorCisjIFRoZSByZXN1bHRpbmcgY2F0YWxvZyBvYmplY3QgY3VycmVudGx5IGRvbid0IHN1cHBvcnQgYWNjZXNzIHRocm91Z2ggYQorIyBkaWN0aW9uYXJ5IEFQSSwgd2hpY2ggd2FzIHN1cHBvcnRlZCAoYnV0IGFwcGFyZW50bHkgdW51c2VkKSBpbiBHTk9NRQorIyBnZXR0ZXh0LgorCitDYXRhbG9nID0gdHJhbnNsYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZ2V0dGV4dC5weWMgYi9saWIvcHl0aG9uMi43L2dldHRleHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTI0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2dldHRleHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZ2V0dGV4dC5weW8gYi9saWIvcHl0aG9uMi43L2dldHRleHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOTI0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2dldHRleHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZ2xvYi5weSBiL2xpYi9weXRob24yLjcvZ2xvYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQ1MzRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9nbG9iLnB5CkBAIC0wLDAgKzEsOTUgQEAKKyIiIkZpbGVuYW1lIGdsb2JiaW5nIHV0aWxpdHkuIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgZm5tYXRjaAorCit0cnk6CisgICAgX3VuaWNvZGUgPSB1bmljb2RlCitleGNlcHQgTmFtZUVycm9yOgorICAgICMgSWYgUHl0aG9uIGlzIGJ1aWx0IHdpdGhvdXQgVW5pY29kZSBzdXBwb3J0LCB0aGUgdW5pY29kZSB0eXBlCisgICAgIyB3aWxsIG5vdCBleGlzdC4gRmFrZSBvbmUuCisgICAgY2xhc3MgX3VuaWNvZGUob2JqZWN0KToKKyAgICAgICAgcGFzcworCitfX2FsbF9fID0gWyJnbG9iIiwgImlnbG9iIl0KKworZGVmIGdsb2IocGF0aG5hbWUpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgcGF0aHMgbWF0Y2hpbmcgYSBwYXRobmFtZSBwYXR0ZXJuLgorCisgICAgVGhlIHBhdHRlcm4gbWF5IGNvbnRhaW4gc2ltcGxlIHNoZWxsLXN0eWxlIHdpbGRjYXJkcyBhIGxhCisgICAgZm5tYXRjaC4gSG93ZXZlciwgdW5saWtlIGZubWF0Y2gsIGZpbGVuYW1lcyBzdGFydGluZyB3aXRoIGEKKyAgICBkb3QgYXJlIHNwZWNpYWwgY2FzZXMgdGhhdCBhcmUgbm90IG1hdGNoZWQgYnkgJyonIGFuZCAnPycKKyAgICBwYXR0ZXJucy4KKworICAgICIiIgorICAgIHJldHVybiBsaXN0KGlnbG9iKHBhdGhuYW1lKSkKKworZGVmIGlnbG9iKHBhdGhuYW1lKToKKyAgICAiIiJSZXR1cm4gYW4gaXRlcmF0b3Igd2hpY2ggeWllbGRzIHRoZSBwYXRocyBtYXRjaGluZyBhIHBhdGhuYW1lIHBhdHRlcm4uCisKKyAgICBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBzaW1wbGUgc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGEgbGEKKyAgICBmbm1hdGNoLiBIb3dldmVyLCB1bmxpa2UgZm5tYXRjaCwgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggYQorICAgIGRvdCBhcmUgc3BlY2lhbCBjYXNlcyB0aGF0IGFyZSBub3QgbWF0Y2hlZCBieSAnKicgYW5kICc/JworICAgIHBhdHRlcm5zLgorCisgICAgIiIiCisgICAgaWYgbm90IGhhc19tYWdpYyhwYXRobmFtZSk6CisgICAgICAgIGlmIG9zLnBhdGgubGV4aXN0cyhwYXRobmFtZSk6CisgICAgICAgICAgICB5aWVsZCBwYXRobmFtZQorICAgICAgICByZXR1cm4KKyAgICBkaXJuYW1lLCBiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aG5hbWUpCisgICAgaWYgbm90IGRpcm5hbWU6CisgICAgICAgIGZvciBuYW1lIGluIGdsb2IxKG9zLmN1cmRpciwgYmFzZW5hbWUpOgorICAgICAgICAgICAgeWllbGQgbmFtZQorICAgICAgICByZXR1cm4KKyAgICAjIGBvcy5wYXRoLnNwbGl0KClgIHJldHVybnMgdGhlIGFyZ3VtZW50IGl0c2VsZiBhcyBhIGRpcm5hbWUgaWYgaXQgaXMgYQorICAgICMgZHJpdmUgb3IgVU5DIHBhdGguICBQcmV2ZW50IGFuIGluZmluaXRlIHJlY3Vyc2lvbiBpZiBhIGRyaXZlIG9yIFVOQyBwYXRoCisgICAgIyBjb250YWlucyBtYWdpYyBjaGFyYWN0ZXJzIChpLmUuIHInXFw/XEM6JykuCisgICAgaWYgZGlybmFtZSAhPSBwYXRobmFtZSBhbmQgaGFzX21hZ2ljKGRpcm5hbWUpOgorICAgICAgICBkaXJzID0gaWdsb2IoZGlybmFtZSkKKyAgICBlbHNlOgorICAgICAgICBkaXJzID0gW2Rpcm5hbWVdCisgICAgaWYgaGFzX21hZ2ljKGJhc2VuYW1lKToKKyAgICAgICAgZ2xvYl9pbl9kaXIgPSBnbG9iMQorICAgIGVsc2U6CisgICAgICAgIGdsb2JfaW5fZGlyID0gZ2xvYjAKKyAgICBmb3IgZGlybmFtZSBpbiBkaXJzOgorICAgICAgICBmb3IgbmFtZSBpbiBnbG9iX2luX2RpcihkaXJuYW1lLCBiYXNlbmFtZSk6CisgICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oZGlybmFtZSwgbmFtZSkKKworIyBUaGVzZSAyIGhlbHBlciBmdW5jdGlvbnMgbm9uLXJlY3Vyc2l2ZWx5IGdsb2IgaW5zaWRlIGEgbGl0ZXJhbCBkaXJlY3RvcnkuCisjIFRoZXkgcmV0dXJuIGEgbGlzdCBvZiBiYXNlbmFtZXMuIGBnbG9iMWAgYWNjZXB0cyBhIHBhdHRlcm4gd2hpbGUgYGdsb2IwYAorIyB0YWtlcyBhIGxpdGVyYWwgYmFzZW5hbWUgKHNvIGl0IG9ubHkgaGFzIHRvIGNoZWNrIGZvciBpdHMgZXhpc3RlbmNlKS4KKworZGVmIGdsb2IxKGRpcm5hbWUsIHBhdHRlcm4pOgorICAgIGlmIG5vdCBkaXJuYW1lOgorICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCisgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBfdW5pY29kZSkgYW5kIG5vdCBpc2luc3RhbmNlKGRpcm5hbWUsIHVuaWNvZGUpOgorICAgICAgICBkaXJuYW1lID0gdW5pY29kZShkaXJuYW1lLCBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmdldGRlZmF1bHRlbmNvZGluZygpKQorICAgIHRyeToKKyAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4gW10KKyAgICBpZiBwYXR0ZXJuWzBdICE9ICcuJzoKKyAgICAgICAgbmFtZXMgPSBmaWx0ZXIobGFtYmRhIHg6IHhbMF0gIT0gJy4nLCBuYW1lcykKKyAgICByZXR1cm4gZm5tYXRjaC5maWx0ZXIobmFtZXMsIHBhdHRlcm4pCisKK2RlZiBnbG9iMChkaXJuYW1lLCBiYXNlbmFtZSk6CisgICAgaWYgYmFzZW5hbWUgPT0gJyc6CisgICAgICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyBhbiBlbXB0eSBiYXNlbmFtZSBmb3IgcGF0aHMgZW5kaW5nIHdpdGggYQorICAgICAgICAjIGRpcmVjdG9yeSBzZXBhcmF0b3IuICAncSp4Lycgc2hvdWxkIG1hdGNoIG9ubHkgZGlyZWN0b3JpZXMuCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CisgICAgICAgICAgICByZXR1cm4gW2Jhc2VuYW1lXQorICAgIGVsc2U6CisgICAgICAgIGlmIG9zLnBhdGgubGV4aXN0cyhvcy5wYXRoLmpvaW4oZGlybmFtZSwgYmFzZW5hbWUpKToKKyAgICAgICAgICAgIHJldHVybiBbYmFzZW5hbWVdCisgICAgcmV0dXJuIFtdCisKKworbWFnaWNfY2hlY2sgPSByZS5jb21waWxlKCdbKj9bXScpCisKK2RlZiBoYXNfbWFnaWMocyk6CisgICAgcmV0dXJuIG1hZ2ljX2NoZWNrLnNlYXJjaChzKSBpcyBub3QgTm9uZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nbG9iLnB5YyBiL2xpYi9weXRob24yLjcvZ2xvYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0YjU4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2xvYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nbG9iLnB5byBiL2xpYi9weXRob24yLjcvZ2xvYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ0YjU4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2xvYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nemlwLnB5IGIvbGliL3B5dGhvbjIuNy9nemlwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MTNiYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2d6aXAucHkKQEAgLTAsMCArMSw1MTggQEAKKyIiIkZ1bmN0aW9ucyB0aGF0IHJlYWQgYW5kIHdyaXRlIGd6aXBwZWQgZmlsZXMuCisKK1RoZSB1c2VyIG9mIHRoZSBmaWxlIGRvZXNuJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgY29tcHJlc3Npb24sCitidXQgcmFuZG9tIGFjY2VzcyBpcyBub3QgYWxsb3dlZC4iIiIKKworIyBiYXNlZCBvbiBBbmRyZXcgS3VjaGxpbmcncyBtaW5pZ3ppcC5weSBkaXN0cmlidXRlZCB3aXRoIHRoZSB6bGliIG1vZHVsZQorCitpbXBvcnQgc3RydWN0LCBzeXMsIHRpbWUsIG9zCitpbXBvcnQgemxpYgoraW1wb3J0IGlvCitpbXBvcnQgX19idWlsdGluX18KKworX19hbGxfXyA9IFsiR3ppcEZpbGUiLCJvcGVuIl0KKworRlRFWFQsIEZIQ1JDLCBGRVhUUkEsIEZOQU1FLCBGQ09NTUVOVCA9IDEsIDIsIDQsIDgsIDE2CisKK1JFQUQsIFdSSVRFID0gMSwgMgorCitkZWYgd3JpdGUzMnUob3V0cHV0LCB2YWx1ZSk6CisgICAgIyBUaGUgTCBmb3JtYXQgd3JpdGVzIHRoZSBiaXQgcGF0dGVybiBjb3JyZWN0bHkgd2hldGhlciBzaWduZWQKKyAgICAjIG9yIHVuc2lnbmVkLgorICAgIG91dHB1dC53cml0ZShzdHJ1Y3QucGFjaygiPEwiLCB2YWx1ZSkpCisKK2RlZiByZWFkMzIoaW5wdXQpOgorICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCI8SSIsIGlucHV0LnJlYWQoNCkpWzBdCisKK2RlZiBvcGVuKGZpbGVuYW1lLCBtb2RlPSJyYiIsIGNvbXByZXNzbGV2ZWw9OSk6CisgICAgIiIiU2hvcnRoYW5kIGZvciBHemlwRmlsZShmaWxlbmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbCkuCisKKyAgICBUaGUgZmlsZW5hbWUgYXJndW1lbnQgaXMgcmVxdWlyZWQ7IG1vZGUgZGVmYXVsdHMgdG8gJ3JiJworICAgIGFuZCBjb21wcmVzc2xldmVsIGRlZmF1bHRzIHRvIDkuCisKKyAgICAiIiIKKyAgICByZXR1cm4gR3ppcEZpbGUoZmlsZW5hbWUsIG1vZGUsIGNvbXByZXNzbGV2ZWwpCisKK2NsYXNzIEd6aXBGaWxlKGlvLkJ1ZmZlcmVkSU9CYXNlKToKKyAgICAiIiJUaGUgR3ppcEZpbGUgY2xhc3Mgc2ltdWxhdGVzIG1vc3Qgb2YgdGhlIG1ldGhvZHMgb2YgYSBmaWxlIG9iamVjdCB3aXRoCisgICAgdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcmVhZGludG8oKSBhbmQgdHJ1bmNhdGUoKSBtZXRob2RzLgorCisgICAgIiIiCisKKyAgICBteWZpbGVvYmogPSBOb25lCisgICAgbWF4X3JlYWRfY2h1bmsgPSAxMCAqIDEwMjQgKiAxMDI0ICAgIyAxME1iCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWU9Tm9uZSwgbW9kZT1Ob25lLAorICAgICAgICAgICAgICAgICBjb21wcmVzc2xldmVsPTksIGZpbGVvYmo9Tm9uZSwgbXRpbWU9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdG9yIGZvciB0aGUgR3ppcEZpbGUgY2xhc3MuCisKKyAgICAgICAgQXQgbGVhc3Qgb25lIG9mIGZpbGVvYmogYW5kIGZpbGVuYW1lIG11c3QgYmUgZ2l2ZW4gYQorICAgICAgICBub24tdHJpdmlhbCB2YWx1ZS4KKworICAgICAgICBUaGUgbmV3IGNsYXNzIGluc3RhbmNlIGlzIGJhc2VkIG9uIGZpbGVvYmosIHdoaWNoIGNhbiBiZSBhIHJlZ3VsYXIKKyAgICAgICAgZmlsZSwgYSBTdHJpbmdJTyBvYmplY3QsIG9yIGFueSBvdGhlciBvYmplY3Qgd2hpY2ggc2ltdWxhdGVzIGEgZmlsZS4KKyAgICAgICAgSXQgZGVmYXVsdHMgdG8gTm9uZSwgaW4gd2hpY2ggY2FzZSBmaWxlbmFtZSBpcyBvcGVuZWQgdG8gcHJvdmlkZQorICAgICAgICBhIGZpbGUgb2JqZWN0LgorCisgICAgICAgIFdoZW4gZmlsZW9iaiBpcyBub3QgTm9uZSwgdGhlIGZpbGVuYW1lIGFyZ3VtZW50IGlzIG9ubHkgdXNlZCB0byBiZQorICAgICAgICBpbmNsdWRlZCBpbiB0aGUgZ3ppcCBmaWxlIGhlYWRlciwgd2hpY2ggbWF5IGluY2x1ZGVzIHRoZSBvcmlnaW5hbAorICAgICAgICBmaWxlbmFtZSBvZiB0aGUgdW5jb21wcmVzc2VkIGZpbGUuICBJdCBkZWZhdWx0cyB0byB0aGUgZmlsZW5hbWUgb2YKKyAgICAgICAgZmlsZW9iaiwgaWYgZGlzY2VybmlibGU7IG90aGVyd2lzZSwgaXQgZGVmYXVsdHMgdG8gdGhlIGVtcHR5IHN0cmluZywKKyAgICAgICAgYW5kIGluIHRoaXMgY2FzZSB0aGUgb3JpZ2luYWwgZmlsZW5hbWUgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBoZWFkZXIuCisKKyAgICAgICAgVGhlIG1vZGUgYXJndW1lbnQgY2FuIGJlIGFueSBvZiAncicsICdyYicsICdhJywgJ2FiJywgJ3cnLCBvciAnd2InLAorICAgICAgICBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZmlsZSB3aWxsIGJlIHJlYWQgb3Igd3JpdHRlbi4gIFRoZSBkZWZhdWx0CisgICAgICAgIGlzIHRoZSBtb2RlIG9mIGZpbGVvYmogaWYgZGlzY2VybmlibGU7IG90aGVyd2lzZSwgdGhlIGRlZmF1bHQgaXMgJ3JiJy4KKyAgICAgICAgQmUgYXdhcmUgdGhhdCBvbmx5IHRoZSAncmInLCAnYWInLCBhbmQgJ3diJyB2YWx1ZXMgc2hvdWxkIGJlIHVzZWQKKyAgICAgICAgZm9yIGNyb3NzLXBsYXRmb3JtIHBvcnRhYmlsaXR5LgorCisgICAgICAgIFRoZSBjb21wcmVzc2xldmVsIGFyZ3VtZW50IGlzIGFuIGludGVnZXIgZnJvbSAwIHRvIDkgY29udHJvbGxpbmcgdGhlCisgICAgICAgIGxldmVsIG9mIGNvbXByZXNzaW9uOyAxIGlzIGZhc3Rlc3QgYW5kIHByb2R1Y2VzIHRoZSBsZWFzdCBjb21wcmVzc2lvbiwKKyAgICAgICAgYW5kIDkgaXMgc2xvd2VzdCBhbmQgcHJvZHVjZXMgdGhlIG1vc3QgY29tcHJlc3Npb24uIDAgaXMgbm8gY29tcHJlc3Npb24KKyAgICAgICAgYXQgYWxsLiBUaGUgZGVmYXVsdCBpcyA5LgorCisgICAgICAgIFRoZSBtdGltZSBhcmd1bWVudCBpcyBhbiBvcHRpb25hbCBudW1lcmljIHRpbWVzdGFtcCB0byBiZSB3cml0dGVuCisgICAgICAgIHRvIHRoZSBzdHJlYW0gd2hlbiBjb21wcmVzc2luZy4gIEFsbCBnemlwIGNvbXByZXNzZWQgc3RyZWFtcworICAgICAgICBhcmUgcmVxdWlyZWQgdG8gY29udGFpbiBhIHRpbWVzdGFtcC4gIElmIG9taXR0ZWQgb3IgTm9uZSwgdGhlCisgICAgICAgIGN1cnJlbnQgdGltZSBpcyB1c2VkLiAgVGhpcyBtb2R1bGUgaWdub3JlcyB0aGUgdGltZXN0YW1wIHdoZW4KKyAgICAgICAgZGVjb21wcmVzc2luZzsgaG93ZXZlciwgc29tZSBwcm9ncmFtcywgc3VjaCBhcyBndW56aXAsIG1ha2UgdXNlCisgICAgICAgIG9mIGl0LiAgVGhlIGZvcm1hdCBvZiB0aGUgdGltZXN0YW1wIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlCisgICAgICAgIHJldHVybiB2YWx1ZSBvZiB0aW1lLnRpbWUoKSBhbmQgb2YgdGhlIHN0X210aW1lIG1lbWJlciBvZiB0aGUKKyAgICAgICAgb2JqZWN0IHJldHVybmVkIGJ5IG9zLnN0YXQoKS4KKworICAgICAgICAiIiIKKworICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBkb24ndCBpbmFkdmVydGVudGx5IGVuYWJsZSB1bml2ZXJzYWwgbmV3bGluZXMgb24gdGhlCisgICAgICAgICMgdW5kZXJseWluZyBmaWxlIG9iamVjdCAtIGluIHJlYWQgbW9kZSwgdGhpcyBjYXVzZXMgZGF0YSBjb3JydXB0aW9uLgorICAgICAgICBpZiBtb2RlOgorICAgICAgICAgICAgbW9kZSA9IG1vZGUucmVwbGFjZSgnVScsICcnKQorICAgICAgICAjIGd1YXJhbnRlZSB0aGUgZmlsZSBpcyBvcGVuZWQgaW4gYmluYXJ5IG1vZGUgb24gcGxhdGZvcm1zCisgICAgICAgICMgdGhhdCBjYXJlIGFib3V0IHRoYXQgc29ydCBvZiB0aGluZworICAgICAgICBpZiBtb2RlIGFuZCAnYicgbm90IGluIG1vZGU6CisgICAgICAgICAgICBtb2RlICs9ICdiJworICAgICAgICBpZiBmaWxlb2JqIGlzIE5vbmU6CisgICAgICAgICAgICBmaWxlb2JqID0gc2VsZi5teWZpbGVvYmogPSBfX2J1aWx0aW5fXy5vcGVuKGZpbGVuYW1lLCBtb2RlIG9yICdyYicpCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAjIElzc3VlICMxMzc4MTogb3MuZmRvcGVuKCkgY3JlYXRlcyBhIGZpbGVvYmogd2l0aCBhIGJvZ3VzIG5hbWUKKyAgICAgICAgICAgICMgYXR0cmlidXRlLiBBdm9pZCBzYXZpbmcgdGhpcyBpbiB0aGUgZ3ppcCBoZWFkZXIncyBmaWxlbmFtZSBmaWVsZC4KKyAgICAgICAgICAgIGlmIGhhc2F0dHIoZmlsZW9iaiwgJ25hbWUnKSBhbmQgZmlsZW9iai5uYW1lICE9ICc8ZmRvcGVuPic6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlb2JqLm5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAnJworICAgICAgICBpZiBtb2RlIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBoYXNhdHRyKGZpbGVvYmosICdtb2RlJyk6IG1vZGUgPSBmaWxlb2JqLm1vZGUKKyAgICAgICAgICAgIGVsc2U6IG1vZGUgPSAncmInCisKKyAgICAgICAgaWYgbW9kZVswOjFdID09ICdyJzoKKyAgICAgICAgICAgIHNlbGYubW9kZSA9IFJFQUQKKyAgICAgICAgICAgICMgU2V0IGZsYWcgaW5kaWNhdGluZyBzdGFydCBvZiBhIG5ldyBtZW1iZXIKKyAgICAgICAgICAgIHNlbGYuX25ld19tZW1iZXIgPSBUcnVlCisgICAgICAgICAgICAjIEJ1ZmZlciBkYXRhIHJlYWQgZnJvbSBnemlwIGZpbGUuIGV4dHJhc3RhcnQgaXMgb2Zmc2V0IGluCisgICAgICAgICAgICAjIHN0cmVhbSB3aGVyZSBidWZmZXIgc3RhcnRzLiBleHRyYXNpemUgaXMgbnVtYmVyIG9mCisgICAgICAgICAgICAjIGJ5dGVzIHJlbWFpbmluZyBpbiBidWZmZXIgZnJvbSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbi4KKyAgICAgICAgICAgIHNlbGYuZXh0cmFidWYgPSAiIgorICAgICAgICAgICAgc2VsZi5leHRyYXNpemUgPSAwCisgICAgICAgICAgICBzZWxmLmV4dHJhc3RhcnQgPSAwCisgICAgICAgICAgICBzZWxmLm5hbWUgPSBmaWxlbmFtZQorICAgICAgICAgICAgIyBTdGFydHMgc21hbGwsIHNjYWxlcyBleHBvbmVudGlhbGx5CisgICAgICAgICAgICBzZWxmLm1pbl9yZWFkc2l6ZSA9IDEwMAorCisgICAgICAgIGVsaWYgbW9kZVswOjFdID09ICd3JyBvciBtb2RlWzA6MV0gPT0gJ2EnOgorICAgICAgICAgICAgc2VsZi5tb2RlID0gV1JJVEUKKyAgICAgICAgICAgIHNlbGYuX2luaXRfd3JpdGUoZmlsZW5hbWUpCisgICAgICAgICAgICBzZWxmLmNvbXByZXNzID0gemxpYi5jb21wcmVzc29iaihjb21wcmVzc2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemxpYi5ERUZMQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC16bGliLk1BWF9XQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWIuREVGX01FTV9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAiTW9kZSAiICsgbW9kZSArICIgbm90IHN1cHBvcnRlZCIKKworICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCisgICAgICAgIHNlbGYub2Zmc2V0ID0gMAorICAgICAgICBzZWxmLm10aW1lID0gbXRpbWUKKworICAgICAgICBpZiBzZWxmLm1vZGUgPT0gV1JJVEU6CisgICAgICAgICAgICBzZWxmLl93cml0ZV9nemlwX2hlYWRlcigpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICB3YXJuaW5ncy53YXJuKCJ1c2UgdGhlIG5hbWUgYXR0cmlidXRlIiwgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgICAgICBpZiBzZWxmLm1vZGUgPT0gV1JJVEUgYW5kIHNlbGYubmFtZVstMzpdICE9ICIuZ3oiOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZSArICIuZ3oiCisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcyA9IHJlcHIoc2VsZi5maWxlb2JqKQorICAgICAgICByZXR1cm4gJzxnemlwICcgKyBzWzE6LTFdICsgJyAnICsgaGV4KGlkKHNlbGYpKSArICc+JworCisgICAgZGVmIF9jaGVja19jbG9zZWQoc2VsZik6CisgICAgICAgICIiIlJhaXNlcyBhIFZhbHVlRXJyb3IgaWYgdGhlIHVuZGVybHlpbmcgZmlsZSBvYmplY3QgaGFzIGJlZW4gY2xvc2VkLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0kvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUuJykKKworICAgIGRlZiBfaW5pdF93cml0ZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYubmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuY3JjID0gemxpYi5jcmMzMigiIikgJiAweGZmZmZmZmZmTAorICAgICAgICBzZWxmLnNpemUgPSAwCisgICAgICAgIHNlbGYud3JpdGVidWYgPSBbXQorICAgICAgICBzZWxmLmJ1ZnNpemUgPSAwCisKKyAgICBkZWYgX3dyaXRlX2d6aXBfaGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoJ1wwMzdcMjEzJykgICAgICAgICAgICAgIyBtYWdpYyBoZWFkZXIKKyAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKCdcMDEwJykgICAgICAgICAgICAgICAgICMgY29tcHJlc3Npb24gbWV0aG9kCisgICAgICAgIGZuYW1lID0gb3MucGF0aC5iYXNlbmFtZShzZWxmLm5hbWUpCisgICAgICAgIGlmIGZuYW1lLmVuZHN3aXRoKCIuZ3oiKToKKyAgICAgICAgICAgIGZuYW1lID0gZm5hbWVbOi0zXQorICAgICAgICBmbGFncyA9IDAKKyAgICAgICAgaWYgZm5hbWU6CisgICAgICAgICAgICBmbGFncyA9IEZOQU1FCisgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShjaHIoZmxhZ3MpKQorICAgICAgICBtdGltZSA9IHNlbGYubXRpbWUKKyAgICAgICAgaWYgbXRpbWUgaXMgTm9uZToKKyAgICAgICAgICAgIG10aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgd3JpdGUzMnUoc2VsZi5maWxlb2JqLCBsb25nKG10aW1lKSkKKyAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKCdcMDAyJykKKyAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKCdcMzc3JykKKyAgICAgICAgaWYgZm5hbWU6CisgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoZm5hbWUgKyAnXDAwMCcpCisKKyAgICBkZWYgX2luaXRfcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5jcmMgPSB6bGliLmNyYzMyKCIiKSAmIDB4ZmZmZmZmZmZMCisgICAgICAgIHNlbGYuc2l6ZSA9IDAKKworICAgIGRlZiBfcmVhZF9nemlwX2hlYWRlcihzZWxmKToKKyAgICAgICAgbWFnaWMgPSBzZWxmLmZpbGVvYmoucmVhZCgyKQorICAgICAgICBpZiBtYWdpYyAhPSAnXDAzN1wyMTMnOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgJ05vdCBhIGd6aXBwZWQgZmlsZScKKyAgICAgICAgbWV0aG9kID0gb3JkKCBzZWxmLmZpbGVvYmoucmVhZCgxKSApCisgICAgICAgIGlmIG1ldGhvZCAhPSA4OgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgJ1Vua25vd24gY29tcHJlc3Npb24gbWV0aG9kJworICAgICAgICBmbGFnID0gb3JkKCBzZWxmLmZpbGVvYmoucmVhZCgxKSApCisgICAgICAgIHNlbGYubXRpbWUgPSByZWFkMzIoc2VsZi5maWxlb2JqKQorICAgICAgICAjIGV4dHJhZmxhZyA9IHNlbGYuZmlsZW9iai5yZWFkKDEpCisgICAgICAgICMgb3MgPSBzZWxmLmZpbGVvYmoucmVhZCgxKQorICAgICAgICBzZWxmLmZpbGVvYmoucmVhZCgyKQorCisgICAgICAgIGlmIGZsYWcgJiBGRVhUUkE6CisgICAgICAgICAgICAjIFJlYWQgJiBkaXNjYXJkIHRoZSBleHRyYSBmaWVsZCwgaWYgcHJlc2VudAorICAgICAgICAgICAgeGxlbiA9IG9yZChzZWxmLmZpbGVvYmoucmVhZCgxKSkKKyAgICAgICAgICAgIHhsZW4gPSB4bGVuICsgMjU2Km9yZChzZWxmLmZpbGVvYmoucmVhZCgxKSkKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai5yZWFkKHhsZW4pCisgICAgICAgIGlmIGZsYWcgJiBGTkFNRToKKyAgICAgICAgICAgICMgUmVhZCBhbmQgZGlzY2FyZCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgZmlsZW5hbWUKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYuZmlsZW9iai5yZWFkKDEpCisgICAgICAgICAgICAgICAgaWYgbm90IHMgb3Igcz09J1wwMDAnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBmbGFnICYgRkNPTU1FTlQ6CisgICAgICAgICAgICAjIFJlYWQgYW5kIGRpc2NhcmQgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb21tZW50CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHMgPSBzZWxmLmZpbGVvYmoucmVhZCgxKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzIG9yIHM9PSdcMDAwJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgZmxhZyAmIEZIQ1JDOgorICAgICAgICAgICAgc2VsZi5maWxlb2JqLnJlYWQoMikgICAgICMgUmVhZCAmIGRpc2NhcmQgdGhlIDE2LWJpdCBoZWFkZXIgQ1JDCisKKyAgICBkZWYgd3JpdGUoc2VsZixkYXRhKToKKyAgICAgICAgc2VsZi5fY2hlY2tfY2xvc2VkKCkKKyAgICAgICAgaWYgc2VsZi5tb2RlICE9IFdSSVRFOgorICAgICAgICAgICAgaW1wb3J0IGVycm5vCisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKGVycm5vLkVCQURGLCAid3JpdGUoKSBvbiByZWFkLW9ubHkgR3ppcEZpbGUgb2JqZWN0IikKKworICAgICAgICBpZiBzZWxmLmZpbGVvYmogaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ3cml0ZSgpIG9uIGNsb3NlZCBHemlwRmlsZSBvYmplY3QiCisKKyAgICAgICAgIyBDb252ZXJ0IGRhdGEgdHlwZSBpZiBjYWxsZWQgYnkgaW8uQnVmZmVyZWRXcml0ZXIuCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgbWVtb3J5dmlldyk6CisgICAgICAgICAgICBkYXRhID0gZGF0YS50b2J5dGVzKCkKKworICAgICAgICBpZiBsZW4oZGF0YSkgPiAwOgorICAgICAgICAgICAgc2VsZi5zaXplID0gc2VsZi5zaXplICsgbGVuKGRhdGEpCisgICAgICAgICAgICBzZWxmLmNyYyA9IHpsaWIuY3JjMzIoZGF0YSwgc2VsZi5jcmMpICYgMHhmZmZmZmZmZkwKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZSggc2VsZi5jb21wcmVzcy5jb21wcmVzcyhkYXRhKSApCisgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBsZW4oZGF0YSkKKworICAgICAgICByZXR1cm4gbGVuKGRhdGEpCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplPS0xKToKKyAgICAgICAgc2VsZi5fY2hlY2tfY2xvc2VkKCkKKyAgICAgICAgaWYgc2VsZi5tb2RlICE9IFJFQUQ6CisgICAgICAgICAgICBpbXBvcnQgZXJybm8KKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoZXJybm8uRUJBREYsICJyZWFkKCkgb24gd3JpdGUtb25seSBHemlwRmlsZSBvYmplY3QiKQorCisgICAgICAgIGlmIHNlbGYuZXh0cmFzaXplIDw9IDAgYW5kIHNlbGYuZmlsZW9iaiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICcnCisKKyAgICAgICAgcmVhZHNpemUgPSAxMDI0CisgICAgICAgIGlmIHNpemUgPCAwOiAgICAgICAgIyBnZXQgdGhlIHdob2xlIHRoaW5nCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVhZChyZWFkc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgcmVhZHNpemUgPSBtaW4oc2VsZi5tYXhfcmVhZF9jaHVuaywgcmVhZHNpemUgKiAyKQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIHNpemUgPSBzZWxmLmV4dHJhc2l6ZQorICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICMganVzdCBnZXQgc29tZSBtb3JlIG9mIGl0CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2hpbGUgc2l6ZSA+IHNlbGYuZXh0cmFzaXplOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkKHJlYWRzaXplKQorICAgICAgICAgICAgICAgICAgICByZWFkc2l6ZSA9IG1pbihzZWxmLm1heF9yZWFkX2NodW5rLCByZWFkc2l6ZSAqIDIpCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgaWYgc2l6ZSA+IHNlbGYuZXh0cmFzaXplOgorICAgICAgICAgICAgICAgICAgICBzaXplID0gc2VsZi5leHRyYXNpemUKKworICAgICAgICBvZmZzZXQgPSBzZWxmLm9mZnNldCAtIHNlbGYuZXh0cmFzdGFydAorICAgICAgICBjaHVuayA9IHNlbGYuZXh0cmFidWZbb2Zmc2V0OiBvZmZzZXQgKyBzaXplXQorICAgICAgICBzZWxmLmV4dHJhc2l6ZSA9IHNlbGYuZXh0cmFzaXplIC0gc2l6ZQorCisgICAgICAgIHNlbGYub2Zmc2V0ICs9IHNpemUKKyAgICAgICAgcmV0dXJuIGNodW5rCisKKyAgICBkZWYgX3VucmVhZChzZWxmLCBidWYpOgorICAgICAgICBzZWxmLmV4dHJhc2l6ZSA9IGxlbihidWYpICsgc2VsZi5leHRyYXNpemUKKyAgICAgICAgc2VsZi5vZmZzZXQgLT0gbGVuKGJ1ZikKKworICAgIGRlZiBfcmVhZChzZWxmLCBzaXplPTEwMjQpOgorICAgICAgICBpZiBzZWxmLmZpbGVvYmogaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yLCAiUmVhY2hlZCBFT0YiCisKKyAgICAgICAgaWYgc2VsZi5fbmV3X21lbWJlcjoKKyAgICAgICAgICAgICMgSWYgdGhlIF9uZXdfbWVtYmVyIGZsYWcgaXMgc2V0LCB3ZSBoYXZlIHRvCisgICAgICAgICAgICAjIGp1bXAgdG8gdGhlIG5leHQgbWVtYmVyLCBpZiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIEZpcnN0LCBjaGVjayBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlOworICAgICAgICAgICAgIyBpZiBzbywgaXQncyB0aW1lIHRvIHN0b3A7IG5vIG1vcmUgbWVtYmVycyB0byByZWFkLgorICAgICAgICAgICAgcG9zID0gc2VsZi5maWxlb2JqLnRlbGwoKSAgICMgU2F2ZSBjdXJyZW50IHBvc2l0aW9uCisgICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlaygwLCAyKSAgICAgIyBTZWVrIHRvIGVuZCBvZiBmaWxlCisgICAgICAgICAgICBpZiBwb3MgPT0gc2VsZi5maWxlb2JqLnRlbGwoKToKKyAgICAgICAgICAgICAgICByYWlzZSBFT0ZFcnJvciwgIlJlYWNoZWQgRU9GIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlayggcG9zICkgIyBSZXR1cm4gdG8gb3JpZ2luYWwgcG9zaXRpb24KKworICAgICAgICAgICAgc2VsZi5faW5pdF9yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfZ3ppcF9oZWFkZXIoKQorICAgICAgICAgICAgc2VsZi5kZWNvbXByZXNzID0gemxpYi5kZWNvbXByZXNzb2JqKC16bGliLk1BWF9XQklUUykKKyAgICAgICAgICAgIHNlbGYuX25ld19tZW1iZXIgPSBGYWxzZQorCisgICAgICAgICMgUmVhZCBhIGNodW5rIG9mIGRhdGEgZnJvbSB0aGUgZmlsZQorICAgICAgICBidWYgPSBzZWxmLmZpbGVvYmoucmVhZChzaXplKQorCisgICAgICAgICMgSWYgdGhlIEVPRiBoYXMgYmVlbiByZWFjaGVkLCBmbHVzaCB0aGUgZGVjb21wcmVzc2lvbiBvYmplY3QKKyAgICAgICAgIyBhbmQgbWFyayB0aGlzIG9iamVjdCBhcyBmaW5pc2hlZC4KKworICAgICAgICBpZiBidWYgPT0gIiI6CisgICAgICAgICAgICB1bmNvbXByZXNzID0gc2VsZi5kZWNvbXByZXNzLmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfZW9mKCkKKyAgICAgICAgICAgIHNlbGYuX2FkZF9yZWFkX2RhdGEoIHVuY29tcHJlc3MgKQorICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IsICdSZWFjaGVkIEVPRicKKworICAgICAgICB1bmNvbXByZXNzID0gc2VsZi5kZWNvbXByZXNzLmRlY29tcHJlc3MoYnVmKQorICAgICAgICBzZWxmLl9hZGRfcmVhZF9kYXRhKCB1bmNvbXByZXNzICkKKworICAgICAgICBpZiBzZWxmLmRlY29tcHJlc3MudW51c2VkX2RhdGEgIT0gIiI6CisgICAgICAgICAgICAjIEVuZGluZyBjYXNlOiB3ZSd2ZSBjb21lIHRvIHRoZSBlbmQgb2YgYSBtZW1iZXIgaW4gdGhlIGZpbGUsCisgICAgICAgICAgICAjIHNvIHNlZWsgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIHVudXNlZCBkYXRhLCBmaW5pc2ggdXAKKyAgICAgICAgICAgICMgdGhpcyBtZW1iZXIsIGFuZCByZWFkIGEgbmV3IGd6aXAgaGVhZGVyLgorICAgICAgICAgICAgIyAoVGhlIG51bWJlciBvZiBieXRlcyB0byBzZWVrIGJhY2sgaXMgdGhlIGxlbmd0aCBvZiB0aGUgdW51c2VkCisgICAgICAgICAgICAjIGRhdGEsIG1pbnVzIDggYmVjYXVzZSBfcmVhZF9lb2YoKSB3aWxsIHJld2luZCBhIGZ1cnRoZXIgOCBieXRlcykKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKCAtbGVuKHNlbGYuZGVjb21wcmVzcy51bnVzZWRfZGF0YSkrOCwgMSkKKworICAgICAgICAgICAgIyBDaGVjayB0aGUgQ1JDIGFuZCBmaWxlIHNpemUsIGFuZCBzZXQgdGhlIGZsYWcgc28gd2UgcmVhZAorICAgICAgICAgICAgIyBhIG5ldyBtZW1iZXIgb24gdGhlIG5leHQgY2FsbAorICAgICAgICAgICAgc2VsZi5fcmVhZF9lb2YoKQorICAgICAgICAgICAgc2VsZi5fbmV3X21lbWJlciA9IFRydWUKKworICAgIGRlZiBfYWRkX3JlYWRfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5jcmMgPSB6bGliLmNyYzMyKGRhdGEsIHNlbGYuY3JjKSAmIDB4ZmZmZmZmZmZMCisgICAgICAgIG9mZnNldCA9IHNlbGYub2Zmc2V0IC0gc2VsZi5leHRyYXN0YXJ0CisgICAgICAgIHNlbGYuZXh0cmFidWYgPSBzZWxmLmV4dHJhYnVmW29mZnNldDpdICsgZGF0YQorICAgICAgICBzZWxmLmV4dHJhc2l6ZSA9IHNlbGYuZXh0cmFzaXplICsgbGVuKGRhdGEpCisgICAgICAgIHNlbGYuZXh0cmFzdGFydCA9IHNlbGYub2Zmc2V0CisgICAgICAgIHNlbGYuc2l6ZSA9IHNlbGYuc2l6ZSArIGxlbihkYXRhKQorCisgICAgZGVmIF9yZWFkX2VvZihzZWxmKToKKyAgICAgICAgIyBXZSd2ZSByZWFkIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIHNvIHdlIGhhdmUgdG8gcmV3aW5kIGluIG9yZGVyCisgICAgICAgICMgdG8gcmVyZWFkIHRoZSA4IGJ5dGVzIGNvbnRhaW5pbmcgdGhlIENSQyBhbmQgdGhlIGZpbGUgc2l6ZS4KKyAgICAgICAgIyBXZSBjaGVjayB0aGUgdGhhdCB0aGUgY29tcHV0ZWQgQ1JDIGFuZCBzaXplIG9mIHRoZQorICAgICAgICAjIHVuY29tcHJlc3NlZCBkYXRhIG1hdGNoZXMgdGhlIHN0b3JlZCB2YWx1ZXMuICBOb3RlIHRoYXQgdGhlIHNpemUKKyAgICAgICAgIyBzdG9yZWQgaXMgdGhlIHRydWUgZmlsZSBzaXplIG1vZCAyKiozMi4KKyAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoLTgsIDEpCisgICAgICAgIGNyYzMyID0gcmVhZDMyKHNlbGYuZmlsZW9iaikKKyAgICAgICAgaXNpemUgPSByZWFkMzIoc2VsZi5maWxlb2JqKSAgIyBtYXkgZXhjZWVkIDJHQgorICAgICAgICBpZiBjcmMzMiAhPSBzZWxmLmNyYzoKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkNSQyBjaGVjayBmYWlsZWQgJXMgIT0gJXMiICUgKGhleChjcmMzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXgoc2VsZi5jcmMpKSkKKyAgICAgICAgZWxpZiBpc2l6ZSAhPSAoc2VsZi5zaXplICYgMHhmZmZmZmZmZkwpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgIkluY29ycmVjdCBsZW5ndGggb2YgZGF0YSBwcm9kdWNlZCIKKworICAgICAgICAjIEd6aXAgZmlsZXMgY2FuIGJlIHBhZGRlZCB3aXRoIHplcm9lcyBhbmQgc3RpbGwgaGF2ZSBhcmNoaXZlcy4KKyAgICAgICAgIyBDb25zdW1lIGFsbCB6ZXJvIGJ5dGVzIGFuZCBzZXQgdGhlIGZpbGUgcG9zaXRpb24gdG8gdGhlIGZpcnN0CisgICAgICAgICMgbm9uLXplcm8gYnl0ZS4gU2VlIGh0dHA6Ly93d3cuZ3ppcC5vcmcvI2ZhcTgKKyAgICAgICAgYyA9ICJceDAwIgorICAgICAgICB3aGlsZSBjID09ICJceDAwIjoKKyAgICAgICAgICAgIGMgPSBzZWxmLmZpbGVvYmoucmVhZCgxKQorICAgICAgICBpZiBjOgorICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoLTEsIDEpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY2xvc2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqIGlzIE5vbmUKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5maWxlb2JqIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5tb2RlID09IFdSSVRFOgorICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHNlbGYuY29tcHJlc3MuZmx1c2goKSkKKyAgICAgICAgICAgIHdyaXRlMzJ1KHNlbGYuZmlsZW9iaiwgc2VsZi5jcmMpCisgICAgICAgICAgICAjIHNlbGYuc2l6ZSBtYXkgZXhjZWVkIDJHQiwgb3IgZXZlbiA0R0IKKyAgICAgICAgICAgIHdyaXRlMzJ1KHNlbGYuZmlsZW9iaiwgc2VsZi5zaXplICYgMHhmZmZmZmZmZkwpCisgICAgICAgICAgICBzZWxmLmZpbGVvYmogPSBOb25lCisgICAgICAgIGVsaWYgc2VsZi5tb2RlID09IFJFQUQ6CisgICAgICAgICAgICBzZWxmLmZpbGVvYmogPSBOb25lCisgICAgICAgIGlmIHNlbGYubXlmaWxlb2JqOgorICAgICAgICAgICAgc2VsZi5teWZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5teWZpbGVvYmogPSBOb25lCisKKyAgICBkZWYgZmx1c2goc2VsZix6bGliX21vZGU9emxpYi5aX1NZTkNfRkxVU0gpOgorICAgICAgICBzZWxmLl9jaGVja19jbG9zZWQoKQorICAgICAgICBpZiBzZWxmLm1vZGUgPT0gV1JJVEU6CisgICAgICAgICAgICAjIEVuc3VyZSB0aGUgY29tcHJlc3NvcidzIGJ1ZmZlciBpcyBmbHVzaGVkCisgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc2VsZi5jb21wcmVzcy5mbHVzaCh6bGliX21vZGUpKQorICAgICAgICAgICAgc2VsZi5maWxlb2JqLmZsdXNoKCkKKworICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgICIiIkludm9rZSB0aGUgdW5kZXJseWluZyBmaWxlIG9iamVjdCdzIGZpbGVubygpIG1ldGhvZC4KKworICAgICAgICBUaGlzIHdpbGwgcmFpc2UgQXR0cmlidXRlRXJyb3IgaWYgdGhlIHVuZGVybHlpbmcgZmlsZSBvYmplY3QKKyAgICAgICAgZG9lc24ndCBzdXBwb3J0IGZpbGVubygpLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iai5maWxlbm8oKQorCisgICAgZGVmIHJld2luZChzZWxmKToKKyAgICAgICAgJycnUmV0dXJuIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtIGZpbGUgcG9zaXRpb24gaW5kaWNhdG9yIHRvIHRoZQorICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIGZpbGUnJycKKyAgICAgICAgaWYgc2VsZi5tb2RlICE9IFJFQUQ6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJDYW4ndCByZXdpbmQgaW4gd3JpdGUgbW9kZSIpCisgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKDApCisgICAgICAgIHNlbGYuX25ld19tZW1iZXIgPSBUcnVlCisgICAgICAgIHNlbGYuZXh0cmFidWYgPSAiIgorICAgICAgICBzZWxmLmV4dHJhc2l6ZSA9IDAKKyAgICAgICAgc2VsZi5leHRyYXN0YXJ0ID0gMAorICAgICAgICBzZWxmLm9mZnNldCA9IDAKKworICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubW9kZSA9PSBSRUFECisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1vZGUgPT0gV1JJVEUKKworICAgIGRlZiBzZWVrYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZWVrKHNlbGYsIG9mZnNldCwgd2hlbmNlPTApOgorICAgICAgICBpZiB3aGVuY2U6CisgICAgICAgICAgICBpZiB3aGVuY2UgPT0gMToKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBzZWxmLm9mZnNldCArIG9mZnNldAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdTZWVrIGZyb20gZW5kIG5vdCBzdXBwb3J0ZWQnKQorICAgICAgICBpZiBzZWxmLm1vZGUgPT0gV1JJVEU6CisgICAgICAgICAgICBpZiBvZmZzZXQgPCBzZWxmLm9mZnNldDoKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdOZWdhdGl2ZSBzZWVrIGluIHdyaXRlIG1vZGUnKQorICAgICAgICAgICAgY291bnQgPSBvZmZzZXQgLSBzZWxmLm9mZnNldAorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGNvdW50IC8vIDEwMjQpOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoMTAyNCAqICdcMCcpCisgICAgICAgICAgICBzZWxmLndyaXRlKChjb3VudCAlIDEwMjQpICogJ1wwJykKKyAgICAgICAgZWxpZiBzZWxmLm1vZGUgPT0gUkVBRDoKKyAgICAgICAgICAgIGlmIG9mZnNldCA8IHNlbGYub2Zmc2V0OgorICAgICAgICAgICAgICAgICMgZm9yIG5lZ2F0aXZlIHNlZWssIHJld2luZCBhbmQgZG8gcG9zaXRpdmUgc2VlaworICAgICAgICAgICAgICAgIHNlbGYucmV3aW5kKCkKKyAgICAgICAgICAgIGNvdW50ID0gb2Zmc2V0IC0gc2VsZi5vZmZzZXQKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShjb3VudCAvLyAxMDI0KToKKyAgICAgICAgICAgICAgICBzZWxmLnJlYWQoMTAyNCkKKyAgICAgICAgICAgIHNlbGYucmVhZChjb3VudCAlIDEwMjQpCisKKyAgICAgICAgcmV0dXJuIHNlbGYub2Zmc2V0CisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT0tMSk6CisgICAgICAgIGlmIHNpemUgPCAwOgorICAgICAgICAgICAgIyBTaG9ydGN1dCBjb21tb24gY2FzZSAtIG5ld2xpbmUgZm91bmQgaW4gYnVmZmVyLgorICAgICAgICAgICAgb2Zmc2V0ID0gc2VsZi5vZmZzZXQgLSBzZWxmLmV4dHJhc3RhcnQKKyAgICAgICAgICAgIGkgPSBzZWxmLmV4dHJhYnVmLmZpbmQoJ1xuJywgb2Zmc2V0KSArIDEKKyAgICAgICAgICAgIGlmIGkgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYuZXh0cmFzaXplIC09IGkgLSBvZmZzZXQKKyAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBpIC0gb2Zmc2V0CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXh0cmFidWZbb2Zmc2V0OiBpXQorCisgICAgICAgICAgICBzaXplID0gc3lzLm1heGludAorICAgICAgICAgICAgcmVhZHNpemUgPSBzZWxmLm1pbl9yZWFkc2l6ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVhZHNpemUgPSBzaXplCisgICAgICAgIGJ1ZnMgPSBbXQorICAgICAgICB3aGlsZSBzaXplICE9IDA6CisgICAgICAgICAgICBjID0gc2VsZi5yZWFkKHJlYWRzaXplKQorICAgICAgICAgICAgaSA9IGMuZmluZCgnXG4nKQorCisgICAgICAgICAgICAjIFdlIHNldCBpPXNpemUgdG8gYnJlYWsgb3V0IG9mIHRoZSBsb29wIHVuZGVyIHR3bworICAgICAgICAgICAgIyBjb25kaXRpb25zOiAxKSB0aGVyZSdzIG5vIG5ld2xpbmUsIGFuZCB0aGUgY2h1bmsgaXMKKyAgICAgICAgICAgICMgbGFyZ2VyIHRoYW4gc2l6ZSwgb3IgMikgdGhlcmUgaXMgYSBuZXdsaW5lLCBidXQgdGhlCisgICAgICAgICAgICAjIHJlc3VsdGluZyBsaW5lIHdvdWxkIGJlIGxvbmdlciB0aGFuICdzaXplJy4KKyAgICAgICAgICAgIGlmIChzaXplIDw9IGkpIG9yIChpID09IC0xIGFuZCBsZW4oYykgPiBzaXplKToKKyAgICAgICAgICAgICAgICBpID0gc2l6ZSAtIDEKKworICAgICAgICAgICAgaWYgaSA+PSAwIG9yIGMgPT0gJyc6CisgICAgICAgICAgICAgICAgYnVmcy5hcHBlbmQoY1s6aSArIDFdKSAgICAjIEFkZCBwb3J0aW9uIG9mIGxhc3QgY2h1bmsKKyAgICAgICAgICAgICAgICBzZWxmLl91bnJlYWQoY1tpICsgMTpdKSAgICMgUHVzaCBiYWNrIHJlc3Qgb2YgY2h1bmsKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAjIEFwcGVuZCBjaHVuayB0byBsaXN0LCBkZWNyZWFzZSAnc2l6ZScsCisgICAgICAgICAgICBidWZzLmFwcGVuZChjKQorICAgICAgICAgICAgc2l6ZSA9IHNpemUgLSBsZW4oYykKKyAgICAgICAgICAgIHJlYWRzaXplID0gbWluKHNpemUsIHJlYWRzaXplICogMikKKyAgICAgICAgaWYgcmVhZHNpemUgPiBzZWxmLm1pbl9yZWFkc2l6ZToKKyAgICAgICAgICAgIHNlbGYubWluX3JlYWRzaXplID0gbWluKHJlYWRzaXplLCBzZWxmLm1pbl9yZWFkc2l6ZSAqIDIsIDUxMikKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oYnVmcykgIyBSZXR1cm4gcmVzdWx0aW5nIGxpbmUKKworCitkZWYgX3Rlc3QoKToKKyAgICAjIEFjdCBsaWtlIGd6aXA7IHdpdGggLWQsIGFjdCBsaWtlIGd1bnppcC4KKyAgICAjIFRoZSBpbnB1dCBmaWxlIGlzIG5vdCBkZWxldGVkLCBob3dldmVyLCBub3IgYXJlIGFueSBvdGhlciBnemlwCisgICAgIyBvcHRpb25zIG9yIGZlYXR1cmVzIHN1cHBvcnRlZC4KKyAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCisgICAgZGVjb21wcmVzcyA9IGFyZ3MgYW5kIGFyZ3NbMF0gPT0gIi1kIgorICAgIGlmIGRlY29tcHJlc3M6CisgICAgICAgIGFyZ3MgPSBhcmdzWzE6XQorICAgIGlmIG5vdCBhcmdzOgorICAgICAgICBhcmdzID0gWyItIl0KKyAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgIGlmIGRlY29tcHJlc3M6CisgICAgICAgICAgICBpZiBhcmcgPT0gIi0iOgorICAgICAgICAgICAgICAgIGYgPSBHemlwRmlsZShmaWxlbmFtZT0iIiwgbW9kZT0icmIiLCBmaWxlb2JqPXN5cy5zdGRpbikKKyAgICAgICAgICAgICAgICBnID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBhcmdbLTM6XSAhPSAiLmd6IjoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgImZpbGVuYW1lIGRvZXNuJ3QgZW5kIGluIC5nejoiLCByZXByKGFyZykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBmID0gb3BlbihhcmcsICJyYiIpCisgICAgICAgICAgICAgICAgZyA9IF9fYnVpbHRpbl9fLm9wZW4oYXJnWzotM10sICJ3YiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBhcmcgPT0gIi0iOgorICAgICAgICAgICAgICAgIGYgPSBzeXMuc3RkaW4KKyAgICAgICAgICAgICAgICBnID0gR3ppcEZpbGUoZmlsZW5hbWU9IiIsIG1vZGU9IndiIiwgZmlsZW9iaj1zeXMuc3Rkb3V0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmID0gX19idWlsdGluX18ub3BlbihhcmcsICJyYiIpCisgICAgICAgICAgICAgICAgZyA9IG9wZW4oYXJnICsgIi5neiIsICJ3YiIpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjaHVuayA9IGYucmVhZCgxMDI0KQorICAgICAgICAgICAgaWYgbm90IGNodW5rOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBnLndyaXRlKGNodW5rKQorICAgICAgICBpZiBnIGlzIG5vdCBzeXMuc3Rkb3V0OgorICAgICAgICAgICAgZy5jbG9zZSgpCisgICAgICAgIGlmIGYgaXMgbm90IHN5cy5zdGRpbjoKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZ3ppcC5weWMgYi9saWIvcHl0aG9uMi43L2d6aXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDVmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2d6aXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZ3ppcC5weW8gYi9saWIvcHl0aG9uMi43L2d6aXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDVmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2d6aXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaGFzaGxpYi5weSBiL2xpYi9weXRob24yLjcvaGFzaGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjBlMWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9oYXNobGliLnB5CkBAIC0wLDAgKzEsMTQ2IEBACisjICRJZCQKKyMKKyMgIENvcHlyaWdodCAoQykgMjAwNSAgIEdyZWdvcnkgUC4gU21pdGggKGdyZWdAa3J5cHRvLm9yZykKKyMgIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKyMKKworX19kb2NfXyA9ICIiImhhc2hsaWIgbW9kdWxlIC0gQSBjb21tb24gaW50ZXJmYWNlIHRvIG1hbnkgaGFzaCBmdW5jdGlvbnMuCisKK25ldyhuYW1lLCBzdHJpbmc9JycpIC0gcmV0dXJucyBhIG5ldyBoYXNoIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGhhc2ggZnVuY3Rpb247IGluaXRpYWxpemluZyB0aGUgaGFzaAorICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGUgZ2l2ZW4gc3RyaW5nIGRhdGEuCisKK05hbWVkIGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyBhcmUgYWxzbyBhdmFpbGFibGUsIHRoZXNlIGFyZSBtdWNoIGZhc3RlcgordGhhbiB1c2luZyBuZXcoKToKKworbWQ1KCksIHNoYTEoKSwgc2hhMjI0KCksIHNoYTI1NigpLCBzaGEzODQoKSwgYW5kIHNoYTUxMigpCisKK01vcmUgYWxnb3JpdGhtcyBtYXkgYmUgYXZhaWxhYmxlIG9uIHlvdXIgcGxhdGZvcm0gYnV0IHRoZSBhYm92ZSBhcmUKK2d1YXJhbnRlZWQgdG8gZXhpc3QuCisKK05PVEU6IElmIHlvdSB3YW50IHRoZSBhZGxlcjMyIG9yIGNyYzMyIGhhc2ggZnVuY3Rpb25zIHRoZXkgYXJlIGF2YWlsYWJsZSBpbgordGhlIHpsaWIgbW9kdWxlLgorCitDaG9vc2UgeW91ciBoYXNoIGZ1bmN0aW9uIHdpc2VseS4gIFNvbWUgaGF2ZSBrbm93biBjb2xsaXNpb24gd2Vha25lc3Nlcy4KK3NoYTM4NCBhbmQgc2hhNTEyIHdpbGwgYmUgc2xvdyBvbiAzMiBiaXQgcGxhdGZvcm1zLgorCitIYXNoIG9iamVjdHMgaGF2ZSB0aGVzZSBtZXRob2RzOgorIC0gdXBkYXRlKGFyZyk6IFVwZGF0ZSB0aGUgaGFzaCBvYmplY3Qgd2l0aCB0aGUgc3RyaW5nIGFyZy4gUmVwZWF0ZWQgY2FsbHMKKyAgICAgICAgICAgICAgICBhcmUgZXF1aXZhbGVudCB0byBhIHNpbmdsZSBjYWxsIHdpdGggdGhlIGNvbmNhdGVuYXRpb24gb2YgYWxsCisgICAgICAgICAgICAgICAgdGhlIGFyZ3VtZW50cy4KKyAtIGRpZ2VzdCgpOiAgICBSZXR1cm4gdGhlIGRpZ2VzdCBvZiB0aGUgc3RyaW5ncyBwYXNzZWQgdG8gdGhlIHVwZGF0ZSgpIG1ldGhvZAorICAgICAgICAgICAgICAgIHNvIGZhci4gVGhpcyBtYXkgY29udGFpbiBub24tQVNDSUkgY2hhcmFjdGVycywgaW5jbHVkaW5nCisgICAgICAgICAgICAgICAgTlVMIGJ5dGVzLgorIC0gaGV4ZGlnZXN0KCk6IExpa2UgZGlnZXN0KCkgZXhjZXB0IHRoZSBkaWdlc3QgaXMgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2YKKyAgICAgICAgICAgICAgICBkb3VibGUgbGVuZ3RoLCBjb250YWluaW5nIG9ubHkgaGV4YWRlY2ltYWwgZGlnaXRzLgorIC0gY29weSgpOiAgICAgIFJldHVybiBhIGNvcHkgKGNsb25lKSBvZiB0aGUgaGFzaCBvYmplY3QuIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAgICAgICAgICAgICAgICBlZmZpY2llbnRseSBjb21wdXRlIHRoZSBkaWdlc3RzIG9mIHN0cmluZ3MgdGhhdCBzaGFyZSBhIGNvbW1vbgorICAgICAgICAgICAgICAgIGluaXRpYWwgc3Vic3RyaW5nLgorCitGb3IgZXhhbXBsZSwgdG8gb2J0YWluIHRoZSBkaWdlc3Qgb2YgdGhlIHN0cmluZyAnTm9ib2R5IGluc3BlY3RzIHRoZQorc3BhbW1pc2ggcmVwZXRpdGlvbic6CisKKyAgICA+Pj4gaW1wb3J0IGhhc2hsaWIKKyAgICA+Pj4gbSA9IGhhc2hsaWIubWQ1KCkKKyAgICA+Pj4gbS51cGRhdGUoIk5vYm9keSBpbnNwZWN0cyIpCisgICAgPj4+IG0udXBkYXRlKCIgdGhlIHNwYW1taXNoIHJlcGV0aXRpb24iKQorICAgID4+PiBtLmRpZ2VzdCgpCisgICAgJ1xceGJiZFxceDljXFx4ODNcXHhkZFxceDFlXFx4YTVcXHhjOVxceGQ5XFx4ZGVcXHhjOVxceGExXFx4OGRcXHhmMFxceGZmXFx4ZTknCisKK01vcmUgY29uZGVuc2VkOgorCisgICAgPj4+IGhhc2hsaWIuc2hhMjI0KCJOb2JvZHkgaW5zcGVjdHMgdGhlIHNwYW1taXNoIHJlcGV0aXRpb24iKS5oZXhkaWdlc3QoKQorICAgICdhNDMzN2JjNDVhOGZjNTQ0YzAzZjUyZGM1NTBjZDZlMWU4NzAyMWJjODk2NTg4YmQ3OWU5MDFlMicKKworIiIiCisKKyMgVGhpcyB0dXBsZSBhbmQgX19nZXRfYnVpbHRpbl9jb25zdHJ1Y3RvcigpIG11c3QgYmUgbW9kaWZpZWQgaWYgYSBuZXcKKyMgYWx3YXlzIGF2YWlsYWJsZSBhbGdvcml0aG0gaXMgYWRkZWQuCitfX2Fsd2F5c19zdXBwb3J0ZWQgPSAoJ21kNScsICdzaGExJywgJ3NoYTIyNCcsICdzaGEyNTYnLCAnc2hhMzg0JywgJ3NoYTUxMicpCisKK2FsZ29yaXRobXMgPSBfX2Fsd2F5c19zdXBwb3J0ZWQKKworX19hbGxfXyA9IF9fYWx3YXlzX3N1cHBvcnRlZCArICgnbmV3JywgJ2FsZ29yaXRobXMnKQorCisKK2RlZiBfX2dldF9idWlsdGluX2NvbnN0cnVjdG9yKG5hbWUpOgorICAgIHRyeToKKyAgICAgICAgaWYgbmFtZSBpbiAoJ1NIQTEnLCAnc2hhMScpOgorICAgICAgICAgICAgaW1wb3J0IF9zaGEKKyAgICAgICAgICAgIHJldHVybiBfc2hhLm5ldworICAgICAgICBlbGlmIG5hbWUgaW4gKCdNRDUnLCAnbWQ1Jyk6CisgICAgICAgICAgICBpbXBvcnQgX21kNQorICAgICAgICAgICAgcmV0dXJuIF9tZDUubmV3CisgICAgICAgIGVsaWYgbmFtZSBpbiAoJ1NIQTI1NicsICdzaGEyNTYnLCAnU0hBMjI0JywgJ3NoYTIyNCcpOgorICAgICAgICAgICAgaW1wb3J0IF9zaGEyNTYKKyAgICAgICAgICAgIGJzID0gbmFtZVszOl0KKyAgICAgICAgICAgIGlmIGJzID09ICcyNTYnOgorICAgICAgICAgICAgICAgIHJldHVybiBfc2hhMjU2LnNoYTI1NgorICAgICAgICAgICAgZWxpZiBicyA9PSAnMjI0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gX3NoYTI1Ni5zaGEyMjQKKyAgICAgICAgZWxpZiBuYW1lIGluICgnU0hBNTEyJywgJ3NoYTUxMicsICdTSEEzODQnLCAnc2hhMzg0Jyk6CisgICAgICAgICAgICBpbXBvcnQgX3NoYTUxMgorICAgICAgICAgICAgYnMgPSBuYW1lWzM6XQorICAgICAgICAgICAgaWYgYnMgPT0gJzUxMic6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zaGE1MTIuc2hhNTEyCisgICAgICAgICAgICBlbGlmIGJzID09ICczODQnOgorICAgICAgICAgICAgICAgIHJldHVybiBfc2hhNTEyLnNoYTM4NAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcyAgIyBubyBleHRlbnNpb24gbW9kdWxlLCB0aGlzIGhhc2ggaXMgdW5zdXBwb3J0ZWQuCisKKyAgICByYWlzZSBWYWx1ZUVycm9yKCd1bnN1cHBvcnRlZCBoYXNoIHR5cGUgJyArIG5hbWUpCisKKworZGVmIF9fZ2V0X29wZW5zc2xfY29uc3RydWN0b3IobmFtZSk6CisgICAgdHJ5OgorICAgICAgICBmID0gZ2V0YXR0cihfaGFzaGxpYiwgJ29wZW5zc2xfJyArIG5hbWUpCisgICAgICAgICMgQWxsb3cgdGhlIEMgbW9kdWxlIHRvIHJhaXNlIFZhbHVlRXJyb3IuICBUaGUgZnVuY3Rpb24gd2lsbCBiZQorICAgICAgICAjIGRlZmluZWQgYnV0IHRoZSBoYXNoIG5vdCBhY3R1YWxseSBhdmFpbGFibGUgdGhhbmtzIHRvIE9wZW5TU0wuCisgICAgICAgIGYoKQorICAgICAgICAjIFVzZSB0aGUgQyBmdW5jdGlvbiBkaXJlY3RseSAodmVyeSBmYXN0KQorICAgICAgICByZXR1cm4gZgorICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICByZXR1cm4gX19nZXRfYnVpbHRpbl9jb25zdHJ1Y3RvcihuYW1lKQorCisKK2RlZiBfX3B5X25ldyhuYW1lLCBzdHJpbmc9JycpOgorICAgICIiIm5ldyhuYW1lLCBzdHJpbmc9JycpIC0gUmV0dXJuIGEgbmV3IGhhc2hpbmcgb2JqZWN0IHVzaW5nIHRoZSBuYW1lZCBhbGdvcml0aG07CisgICAgb3B0aW9uYWxseSBpbml0aWFsaXplZCB3aXRoIGEgc3RyaW5nLgorICAgICIiIgorICAgIHJldHVybiBfX2dldF9idWlsdGluX2NvbnN0cnVjdG9yKG5hbWUpKHN0cmluZykKKworCitkZWYgX19oYXNoX25ldyhuYW1lLCBzdHJpbmc9JycpOgorICAgICIiIm5ldyhuYW1lLCBzdHJpbmc9JycpIC0gUmV0dXJuIGEgbmV3IGhhc2hpbmcgb2JqZWN0IHVzaW5nIHRoZSBuYW1lZCBhbGdvcml0aG07CisgICAgb3B0aW9uYWxseSBpbml0aWFsaXplZCB3aXRoIGEgc3RyaW5nLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIF9oYXNobGliLm5ldyhuYW1lLCBzdHJpbmcpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICMgSWYgdGhlIF9oYXNobGliIG1vZHVsZSAoT3BlblNTTCkgZG9lc24ndCBzdXBwb3J0IHRoZSBuYW1lZAorICAgICAgICAjIGhhc2gsIHRyeSB1c2luZyBvdXIgYnVpbHRpbiBpbXBsZW1lbnRhdGlvbnMuCisgICAgICAgICMgVGhpcyBhbGxvd3MgZm9yIFNIQTIyNC8yNTYgYW5kIFNIQTM4NC81MTIgc3VwcG9ydCBldmVuIHRob3VnaAorICAgICAgICAjIHRoZSBPcGVuU1NMIGxpYnJhcnkgcHJpb3IgdG8gMC45LjggZG9lc24ndCBwcm92aWRlIHRoZW0uCisgICAgICAgIHJldHVybiBfX2dldF9idWlsdGluX2NvbnN0cnVjdG9yKG5hbWUpKHN0cmluZykKKworCit0cnk6CisgICAgaW1wb3J0IF9oYXNobGliCisgICAgbmV3ID0gX19oYXNoX25ldworICAgIF9fZ2V0X2hhc2ggPSBfX2dldF9vcGVuc3NsX2NvbnN0cnVjdG9yCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgbmV3ID0gX19weV9uZXcKKyAgICBfX2dldF9oYXNoID0gX19nZXRfYnVpbHRpbl9jb25zdHJ1Y3RvcgorCitmb3IgX19mdW5jX25hbWUgaW4gX19hbHdheXNfc3VwcG9ydGVkOgorICAgICMgdHJ5IHRoZW0gYWxsLCBzb21lIG1heSBub3Qgd29yayBkdWUgdG8gdGhlIE9wZW5TU0wKKyAgICAjIHZlcnNpb24gbm90IHN1cHBvcnRpbmcgdGhhdCBhbGdvcml0aG0uCisgICAgdHJ5OgorICAgICAgICBnbG9iYWxzKClbX19mdW5jX25hbWVdID0gX19nZXRfaGFzaChfX2Z1bmNfbmFtZSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgaW1wb3J0IGxvZ2dpbmcKKyAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oJ2NvZGUgZm9yIGhhc2ggJXMgd2FzIG5vdCBmb3VuZC4nLCBfX2Z1bmNfbmFtZSkKKworIyBDbGVhbnVwIGxvY2FscygpCitkZWwgX19hbHdheXNfc3VwcG9ydGVkLCBfX2Z1bmNfbmFtZSwgX19nZXRfaGFzaAorZGVsIF9fcHlfbmV3LCBfX2hhc2hfbmV3LCBfX2dldF9vcGVuc3NsX2NvbnN0cnVjdG9yCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hhc2hsaWIucHljIGIvbGliL3B5dGhvbjIuNy9oYXNobGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTlkNjkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9oYXNobGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hhc2hsaWIucHlvIGIvbGliL3B5dGhvbjIuNy9oYXNobGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTlkNjkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9oYXNobGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hlYXBxLnB5IGIvbGliL3B5dGhvbjIuNy9oZWFwcS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc5ZGIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9oZWFwcS5weQpAQCAtMCwwICsxLDQ4MCBAQAorIyAtKi0gY29kaW5nOiBsYXRpbi0xIC0qLQorCisiIiJIZWFwIHF1ZXVlIGFsZ29yaXRobSAoYS5rLmEuIHByaW9yaXR5IHF1ZXVlKS4KKworSGVhcHMgYXJlIGFycmF5cyBmb3Igd2hpY2ggYVtrXSA8PSBhWzIqaysxXSBhbmQgYVtrXSA8PSBhWzIqaysyXSBmb3IKK2FsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbiwKK25vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZworcHJvcGVydHkgb2YgYSBoZWFwIGlzIHRoYXQgYVswXSBpcyBhbHdheXMgaXRzIHNtYWxsZXN0IGVsZW1lbnQuCisKK1VzYWdlOgorCitoZWFwID0gW10gICAgICAgICAgICAjIGNyZWF0ZXMgYW4gZW1wdHkgaGVhcAoraGVhcHB1c2goaGVhcCwgaXRlbSkgIyBwdXNoZXMgYSBuZXcgaXRlbSBvbiB0aGUgaGVhcAoraXRlbSA9IGhlYXBwb3AoaGVhcCkgIyBwb3BzIHRoZSBzbWFsbGVzdCBpdGVtIGZyb20gdGhlIGhlYXAKK2l0ZW0gPSBoZWFwWzBdICAgICAgICMgc21hbGxlc3QgaXRlbSBvbiB0aGUgaGVhcCB3aXRob3V0IHBvcHBpbmcgaXQKK2hlYXBpZnkoeCkgICAgICAgICAgICMgdHJhbnNmb3JtcyBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gbGluZWFyIHRpbWUKK2l0ZW0gPSBoZWFwcmVwbGFjZShoZWFwLCBpdGVtKSAjIHBvcHMgYW5kIHJldHVybnMgc21hbGxlc3QgaXRlbSwgYW5kIGFkZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5ldyBpdGVtOyB0aGUgaGVhcCBzaXplIGlzIHVuY2hhbmdlZAorCitPdXIgQVBJIGRpZmZlcnMgZnJvbSB0ZXh0Ym9vayBoZWFwIGFsZ29yaXRobXMgYXMgZm9sbG93czoKKworLSBXZSB1c2UgMC1iYXNlZCBpbmRleGluZy4gIFRoaXMgbWFrZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZQorICBpbmRleCBmb3IgYSBub2RlIGFuZCB0aGUgaW5kZXhlcyBmb3IgaXRzIGNoaWxkcmVuIHNsaWdodGx5IGxlc3MKKyAgb2J2aW91cywgYnV0IGlzIG1vcmUgc3VpdGFibGUgc2luY2UgUHl0aG9uIHVzZXMgMC1iYXNlZCBpbmRleGluZy4KKworLSBPdXIgaGVhcHBvcCgpIG1ldGhvZCByZXR1cm5zIHRoZSBzbWFsbGVzdCBpdGVtLCBub3QgdGhlIGxhcmdlc3QuCisKK1RoZXNlIHR3byBtYWtlIGl0IHBvc3NpYmxlIHRvIHZpZXcgdGhlIGhlYXAgYXMgYSByZWd1bGFyIFB5dGhvbiBsaXN0Cit3aXRob3V0IHN1cnByaXNlczogaGVhcFswXSBpcyB0aGUgc21hbGxlc3QgaXRlbSwgYW5kIGhlYXAuc29ydCgpCittYWludGFpbnMgdGhlIGhlYXAgaW52YXJpYW50IQorIiIiCisKKyMgT3JpZ2luYWwgY29kZSBieSBLZXZpbiBPJ0Nvbm5vciwgYXVnbWVudGVkIGJ5IFRpbSBQZXRlcnMgYW5kIFJheW1vbmQgSGV0dGluZ2VyCisKK19fYWJvdXRfXyA9ICIiIkhlYXAgcXVldWVzCisKK1tleHBsYW5hdGlvbiBieSBGcmFu529pcyBQaW5hcmRdCisKK0hlYXBzIGFyZSBhcnJheXMgZm9yIHdoaWNoIGFba10gPD0gYVsyKmsrMV0gYW5kIGFba10gPD0gYVsyKmsrMl0gZm9yCithbGwgaywgY291bnRpbmcgZWxlbWVudHMgZnJvbSAwLiAgRm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24sCitub24tZXhpc3RpbmcgZWxlbWVudHMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW5maW5pdGUuICBUaGUgaW50ZXJlc3RpbmcKK3Byb3BlcnR5IG9mIGEgaGVhcCBpcyB0aGF0IGFbMF0gaXMgYWx3YXlzIGl0cyBzbWFsbGVzdCBlbGVtZW50LgorCitUaGUgc3RyYW5nZSBpbnZhcmlhbnQgYWJvdmUgaXMgbWVhbnQgdG8gYmUgYW4gZWZmaWNpZW50IG1lbW9yeQorcmVwcmVzZW50YXRpb24gZm9yIGEgdG91cm5hbWVudC4gIFRoZSBudW1iZXJzIGJlbG93IGFyZSBgaycsIG5vdCBhW2tdOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKworICAgICAgICAgIDMgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIDUgICAgICAgICAgICAgICA2CisKKyAgICAgIDcgICAgICAgOCAgICAgICA5ICAgICAgIDEwICAgICAgMTEgICAgICAxMiAgICAgIDEzICAgICAgMTQKKworICAgIDE1IDE2ICAgMTcgMTggICAxOSAyMCAgIDIxIDIyICAgMjMgMjQgICAyNSAyNiAgIDI3IDI4ICAgMjkgMzAKKworCitJbiB0aGUgdHJlZSBhYm92ZSwgZWFjaCBjZWxsIGBrJyBpcyB0b3BwaW5nIGAyKmsrMScgYW5kIGAyKmsrMicuICBJbgorYW4gdXN1YWwgYmluYXJ5IHRvdXJuYW1lbnQgd2Ugc2VlIGluIHNwb3J0cywgZWFjaCBjZWxsIGlzIHRoZSB3aW5uZXIKK292ZXIgdGhlIHR3byBjZWxscyBpdCB0b3BzLCBhbmQgd2UgY2FuIHRyYWNlIHRoZSB3aW5uZXIgZG93biB0aGUgdHJlZQordG8gc2VlIGFsbCBvcHBvbmVudHMgcy9oZSBoYWQuICBIb3dldmVyLCBpbiBtYW55IGNvbXB1dGVyIGFwcGxpY2F0aW9ucworb2Ygc3VjaCB0b3VybmFtZW50cywgd2UgZG8gbm90IG5lZWQgdG8gdHJhY2UgdGhlIGhpc3Rvcnkgb2YgYSB3aW5uZXIuCitUbyBiZSBtb3JlIG1lbW9yeSBlZmZpY2llbnQsIHdoZW4gYSB3aW5uZXIgaXMgcHJvbW90ZWQsIHdlIHRyeSB0bworcmVwbGFjZSBpdCBieSBzb21ldGhpbmcgZWxzZSBhdCBhIGxvd2VyIGxldmVsLCBhbmQgdGhlIHJ1bGUgYmVjb21lcwordGhhdCBhIGNlbGwgYW5kIHRoZSB0d28gY2VsbHMgaXQgdG9wcyBjb250YWluIHRocmVlIGRpZmZlcmVudCBpdGVtcywKK2J1dCB0aGUgdG9wIGNlbGwgIndpbnMiIG92ZXIgdGhlIHR3byB0b3BwZWQgY2VsbHMuCisKK0lmIHRoaXMgaGVhcCBpbnZhcmlhbnQgaXMgcHJvdGVjdGVkIGF0IGFsbCB0aW1lLCBpbmRleCAwIGlzIGNsZWFybHkKK3RoZSBvdmVyYWxsIHdpbm5lci4gIFRoZSBzaW1wbGVzdCBhbGdvcml0aG1pYyB3YXkgdG8gcmVtb3ZlIGl0IGFuZAorZmluZCB0aGUgIm5leHQiIHdpbm5lciBpcyB0byBtb3ZlIHNvbWUgbG9zZXIgKGxldCdzIHNheSBjZWxsIDMwIGluIHRoZQorZGlhZ3JhbSBhYm92ZSkgaW50byB0aGUgMCBwb3NpdGlvbiwgYW5kIHRoZW4gcGVyY29sYXRlIHRoaXMgbmV3IDAgZG93bgordGhlIHRyZWUsIGV4Y2hhbmdpbmcgdmFsdWVzLCB1bnRpbCB0aGUgaW52YXJpYW50IGlzIHJlLWVzdGFibGlzaGVkLgorVGhpcyBpcyBjbGVhcmx5IGxvZ2FyaXRobWljIG9uIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIHRyZWUuCitCeSBpdGVyYXRpbmcgb3ZlciBhbGwgaXRlbXMsIHlvdSBnZXQgYW4gTyhuIGxuIG4pIHNvcnQuCisKK0EgbmljZSBmZWF0dXJlIG9mIHRoaXMgc29ydCBpcyB0aGF0IHlvdSBjYW4gZWZmaWNpZW50bHkgaW5zZXJ0IG5ldworaXRlbXMgd2hpbGUgdGhlIHNvcnQgaXMgZ29pbmcgb24sIHByb3ZpZGVkIHRoYXQgdGhlIGluc2VydGVkIGl0ZW1zIGFyZQorbm90ICJiZXR0ZXIiIHRoYW4gdGhlIGxhc3QgMCd0aCBlbGVtZW50IHlvdSBleHRyYWN0ZWQuICBUaGlzIGlzCitlc3BlY2lhbGx5IHVzZWZ1bCBpbiBzaW11bGF0aW9uIGNvbnRleHRzLCB3aGVyZSB0aGUgdHJlZSBob2xkcyBhbGwKK2luY29taW5nIGV2ZW50cywgYW5kIHRoZSAid2luIiBjb25kaXRpb24gbWVhbnMgdGhlIHNtYWxsZXN0IHNjaGVkdWxlZAordGltZS4gIFdoZW4gYW4gZXZlbnQgc2NoZWR1bGUgb3RoZXIgZXZlbnRzIGZvciBleGVjdXRpb24sIHRoZXkgYXJlCitzY2hlZHVsZWQgaW50byB0aGUgZnV0dXJlLCBzbyB0aGV5IGNhbiBlYXNpbHkgZ28gaW50byB0aGUgaGVhcC4gIFNvLCBhCitoZWFwIGlzIGEgZ29vZCBzdHJ1Y3R1cmUgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzICh0aGlzIGlzIHdoYXQgSQordXNlZCBmb3IgbXkgTUlESSBzZXF1ZW5jZXIgOi0pLgorCitWYXJpb3VzIHN0cnVjdHVyZXMgZm9yIGltcGxlbWVudGluZyBzY2hlZHVsZXJzIGhhdmUgYmVlbiBleHRlbnNpdmVseQorc3R1ZGllZCwgYW5kIGhlYXBzIGFyZSBnb29kIGZvciB0aGlzLCBhcyB0aGV5IGFyZSByZWFzb25hYmx5IHNwZWVkeSwKK3RoZSBzcGVlZCBpcyBhbG1vc3QgY29uc3RhbnQsIGFuZCB0aGUgd29yc3QgY2FzZSBpcyBub3QgbXVjaCBkaWZmZXJlbnQKK3RoYW4gdGhlIGF2ZXJhZ2UgY2FzZS4gIEhvd2V2ZXIsIHRoZXJlIGFyZSBvdGhlciByZXByZXNlbnRhdGlvbnMgd2hpY2gKK2FyZSBtb3JlIGVmZmljaWVudCBvdmVyYWxsLCB5ZXQgdGhlIHdvcnN0IGNhc2VzIG1pZ2h0IGJlIHRlcnJpYmxlLgorCitIZWFwcyBhcmUgYWxzbyB2ZXJ5IHVzZWZ1bCBpbiBiaWcgZGlzayBzb3J0cy4gIFlvdSBtb3N0IHByb2JhYmx5IGFsbAora25vdyB0aGF0IGEgYmlnIHNvcnQgaW1wbGllcyBwcm9kdWNpbmcgInJ1bnMiICh3aGljaCBhcmUgcHJlLXNvcnRlZAorc2VxdWVuY2VzLCB3aGljaCBzaXplIGlzIHVzdWFsbHkgcmVsYXRlZCB0byB0aGUgYW1vdW50IG9mIENQVSBtZW1vcnkpLAorZm9sbG93ZWQgYnkgYSBtZXJnaW5nIHBhc3NlcyBmb3IgdGhlc2UgcnVucywgd2hpY2ggbWVyZ2luZyBpcyBvZnRlbgordmVyeSBjbGV2ZXJseSBvcmdhbmlzZWRbMV0uICBJdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHRoZSBpbml0aWFsCitzb3J0IHByb2R1Y2VzIHRoZSBsb25nZXN0IHJ1bnMgcG9zc2libGUuICBUb3VybmFtZW50cyBhcmUgYSBnb29kIHdheQordG8gdGhhdC4gIElmLCB1c2luZyBhbGwgdGhlIG1lbW9yeSBhdmFpbGFibGUgdG8gaG9sZCBhIHRvdXJuYW1lbnQsIHlvdQorcmVwbGFjZSBhbmQgcGVyY29sYXRlIGl0ZW1zIHRoYXQgaGFwcGVuIHRvIGZpdCB0aGUgY3VycmVudCBydW4sIHlvdSdsbAorcHJvZHVjZSBydW5zIHdoaWNoIGFyZSB0d2ljZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGZvciByYW5kb20gaW5wdXQsCithbmQgbXVjaCBiZXR0ZXIgZm9yIGlucHV0IGZ1enppbHkgb3JkZXJlZC4KKworTW9yZW92ZXIsIGlmIHlvdSBvdXRwdXQgdGhlIDAndGggaXRlbSBvbiBkaXNrIGFuZCBnZXQgYW4gaW5wdXQgd2hpY2gKK21heSBub3QgZml0IGluIHRoZSBjdXJyZW50IHRvdXJuYW1lbnQgKGJlY2F1c2UgdGhlIHZhbHVlICJ3aW5zIiBvdmVyCit0aGUgbGFzdCBvdXRwdXQgdmFsdWUpLCBpdCBjYW5ub3QgZml0IGluIHRoZSBoZWFwLCBzbyB0aGUgc2l6ZSBvZiB0aGUKK2hlYXAgZGVjcmVhc2VzLiAgVGhlIGZyZWVkIG1lbW9yeSBjb3VsZCBiZSBjbGV2ZXJseSByZXVzZWQgaW1tZWRpYXRlbHkKK2ZvciBwcm9ncmVzc2l2ZWx5IGJ1aWxkaW5nIGEgc2Vjb25kIGhlYXAsIHdoaWNoIGdyb3dzIGF0IGV4YWN0bHkgdGhlCitzYW1lIHJhdGUgdGhlIGZpcnN0IGhlYXAgaXMgbWVsdGluZy4gIFdoZW4gdGhlIGZpcnN0IGhlYXAgY29tcGxldGVseQordmFuaXNoZXMsIHlvdSBzd2l0Y2ggaGVhcHMgYW5kIHN0YXJ0IGEgbmV3IHJ1bi4gIENsZXZlciBhbmQgcXVpdGUKK2VmZmVjdGl2ZSEKKworSW4gYSB3b3JkLCBoZWFwcyBhcmUgdXNlZnVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHRvIGtub3cuICBJIHVzZSB0aGVtIGluCithIGZldyBhcHBsaWNhdGlvbnMsIGFuZCBJIHRoaW5rIGl0IGlzIGdvb2QgdG8ga2VlcCBhIGBoZWFwJyBtb2R1bGUKK2Fyb3VuZC4gOi0pCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitbMV0gVGhlIGRpc2sgYmFsYW5jaW5nIGFsZ29yaXRobXMgd2hpY2ggYXJlIGN1cnJlbnQsIG5vd2FkYXlzLCBhcmUKK21vcmUgYW5ub3lpbmcgdGhhbiBjbGV2ZXIsIGFuZCB0aGlzIGlzIGEgY29uc2VxdWVuY2Ugb2YgdGhlIHNlZWtpbmcKK2NhcGFiaWxpdGllcyBvZiB0aGUgZGlza3MuICBPbiBkZXZpY2VzIHdoaWNoIGNhbm5vdCBzZWVrLCBsaWtlIGJpZwordGFwZSBkcml2ZXMsIHRoZSBzdG9yeSB3YXMgcXVpdGUgZGlmZmVyZW50LCBhbmQgb25lIGhhZCB0byBiZSB2ZXJ5CitjbGV2ZXIgdG8gZW5zdXJlIChmYXIgaW4gYWR2YW5jZSkgdGhhdCBlYWNoIHRhcGUgbW92ZW1lbnQgd2lsbCBiZSB0aGUKK21vc3QgZWZmZWN0aXZlIHBvc3NpYmxlICh0aGF0IGlzLCB3aWxsIGJlc3QgcGFydGljaXBhdGUgYXQKKyJwcm9ncmVzc2luZyIgdGhlIG1lcmdlKS4gIFNvbWUgdGFwZXMgd2VyZSBldmVuIGFibGUgdG8gcmVhZAorYmFja3dhcmRzLCBhbmQgdGhpcyB3YXMgYWxzbyB1c2VkIHRvIGF2b2lkIHRoZSByZXdpbmRpbmcgdGltZS4KK0JlbGlldmUgbWUsIHJlYWwgZ29vZCB0YXBlIHNvcnRzIHdlcmUgcXVpdGUgc3BlY3RhY3VsYXIgdG8gd2F0Y2ghCitGcm9tIGFsbCB0aW1lcywgc29ydGluZyBoYXMgYWx3YXlzIGJlZW4gYSBHcmVhdCBBcnQhIDotKQorIiIiCisKK19fYWxsX18gPSBbJ2hlYXBwdXNoJywgJ2hlYXBwb3AnLCAnaGVhcGlmeScsICdoZWFwcmVwbGFjZScsICdtZXJnZScsCisgICAgICAgICAgICdubGFyZ2VzdCcsICduc21hbGxlc3QnLCAnaGVhcHB1c2hwb3AnXQorCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlLCBjb3VudCwgaW1hcCwgaXppcCwgdGVlLCBjaGFpbgorZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgorCitkZWYgY21wX2x0KHgsIHkpOgorICAgICMgVXNlIF9fbHRfXyBpZiBhdmFpbGFibGU7IG90aGVyd2lzZSwgdHJ5IF9fbGVfXy4KKyAgICAjIEluIFB5My54LCBvbmx5IF9fbHRfXyB3aWxsIGJlIGNhbGxlZC4KKyAgICByZXR1cm4gKHggPCB5KSBpZiBoYXNhdHRyKHgsICdfX2x0X18nKSBlbHNlIChub3QgeSA8PSB4KQorCitkZWYgaGVhcHB1c2goaGVhcCwgaXRlbSk6CisgICAgIiIiUHVzaCBpdGVtIG9udG8gaGVhcCwgbWFpbnRhaW5pbmcgdGhlIGhlYXAgaW52YXJpYW50LiIiIgorICAgIGhlYXAuYXBwZW5kKGl0ZW0pCisgICAgX3NpZnRkb3duKGhlYXAsIDAsIGxlbihoZWFwKS0xKQorCitkZWYgaGVhcHBvcChoZWFwKToKKyAgICAiIiJQb3AgdGhlIHNtYWxsZXN0IGl0ZW0gb2ZmIHRoZSBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIiIiCisgICAgbGFzdGVsdCA9IGhlYXAucG9wKCkgICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5CisgICAgaWYgaGVhcDoKKyAgICAgICAgcmV0dXJuaXRlbSA9IGhlYXBbMF0KKyAgICAgICAgaGVhcFswXSA9IGxhc3RlbHQKKyAgICAgICAgX3NpZnR1cChoZWFwLCAwKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybml0ZW0gPSBsYXN0ZWx0CisgICAgcmV0dXJuIHJldHVybml0ZW0KKworZGVmIGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pOgorICAgICIiIlBvcCBhbmQgcmV0dXJuIHRoZSBjdXJyZW50IHNtYWxsZXN0IHZhbHVlLCBhbmQgYWRkIHRoZSBuZXcgaXRlbS4KKworICAgIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBoZWFwcG9wKCkgZm9sbG93ZWQgYnkgaGVhcHB1c2goKSwgYW5kIGNhbiBiZQorICAgIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiB1c2luZyBhIGZpeGVkLXNpemUgaGVhcC4gIE5vdGUgdGhhdCB0aGUgdmFsdWUKKyAgICByZXR1cm5lZCBtYXkgYmUgbGFyZ2VyIHRoYW4gaXRlbSEgIFRoYXQgY29uc3RyYWlucyByZWFzb25hYmxlIHVzZXMgb2YKKyAgICB0aGlzIHJvdXRpbmUgdW5sZXNzIHdyaXR0ZW4gYXMgcGFydCBvZiBhIGNvbmRpdGlvbmFsIHJlcGxhY2VtZW50OgorCisgICAgICAgIGlmIGl0ZW0gPiBoZWFwWzBdOgorICAgICAgICAgICAgaXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pCisgICAgIiIiCisgICAgcmV0dXJuaXRlbSA9IGhlYXBbMF0gICAgIyByYWlzZXMgYXBwcm9wcmlhdGUgSW5kZXhFcnJvciBpZiBoZWFwIGlzIGVtcHR5CisgICAgaGVhcFswXSA9IGl0ZW0KKyAgICBfc2lmdHVwKGhlYXAsIDApCisgICAgcmV0dXJuIHJldHVybml0ZW0KKworZGVmIGhlYXBwdXNocG9wKGhlYXAsIGl0ZW0pOgorICAgICIiIkZhc3QgdmVyc2lvbiBvZiBhIGhlYXBwdXNoIGZvbGxvd2VkIGJ5IGEgaGVhcHBvcC4iIiIKKyAgICBpZiBoZWFwIGFuZCBjbXBfbHQoaGVhcFswXSwgaXRlbSk6CisgICAgICAgIGl0ZW0sIGhlYXBbMF0gPSBoZWFwWzBdLCBpdGVtCisgICAgICAgIF9zaWZ0dXAoaGVhcCwgMCkKKyAgICByZXR1cm4gaXRlbQorCitkZWYgaGVhcGlmeSh4KToKKyAgICAiIiJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgaGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKHgpKSB0aW1lLiIiIgorICAgIG4gPSBsZW4oeCkKKyAgICAjIFRyYW5zZm9ybSBib3R0b20tdXAuICBUaGUgbGFyZ2VzdCBpbmRleCB0aGVyZSdzIGFueSBwb2ludCB0byBsb29raW5nIGF0CisgICAgIyBpcyB0aGUgbGFyZ2VzdCB3aXRoIGEgY2hpbGQgaW5kZXggaW4tcmFuZ2UsIHNvIG11c3QgaGF2ZSAyKmkgKyAxIDwgbiwKKyAgICAjIG9yIGkgPCAobi0xKS8yLiAgSWYgbiBpcyBldmVuID0gMipqLCB0aGlzIGlzICgyKmotMSkvMiA9IGotMS8yIHNvCisgICAgIyBqLTEgaXMgdGhlIGxhcmdlc3QsIHdoaWNoIGlzIG4vLzIgLSAxLiAgSWYgbiBpcyBvZGQgPSAyKmorMSwgdGhpcyBpcworICAgICMgKDIqaisxLTEpLzIgPSBqIHNvIGotMSBpcyB0aGUgbGFyZ2VzdCwgYW5kIHRoYXQncyBhZ2FpbiBuLy8yLTEuCisgICAgZm9yIGkgaW4gcmV2ZXJzZWQoeHJhbmdlKG4vLzIpKToKKyAgICAgICAgX3NpZnR1cCh4LCBpKQorCitkZWYgX2hlYXBwdXNocG9wX21heChoZWFwLCBpdGVtKToKKyAgICAiIiJNYXhoZWFwIHZlcnNpb24gb2YgYSBoZWFwcHVzaCBmb2xsb3dlZCBieSBhIGhlYXBwb3AuIiIiCisgICAgaWYgaGVhcCBhbmQgY21wX2x0KGl0ZW0sIGhlYXBbMF0pOgorICAgICAgICBpdGVtLCBoZWFwWzBdID0gaGVhcFswXSwgaXRlbQorICAgICAgICBfc2lmdHVwX21heChoZWFwLCAwKQorICAgIHJldHVybiBpdGVtCisKK2RlZiBfaGVhcGlmeV9tYXgoeCk6CisgICAgIiIiVHJhbnNmb3JtIGxpc3QgaW50byBhIG1heGhlYXAsIGluLXBsYWNlLCBpbiBPKGxlbih4KSkgdGltZS4iIiIKKyAgICBuID0gbGVuKHgpCisgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2Uobi8vMikpOgorICAgICAgICBfc2lmdHVwX21heCh4LCBpKQorCitkZWYgbmxhcmdlc3QobiwgaXRlcmFibGUpOgorICAgICIiIkZpbmQgdGhlIG4gbGFyZ2VzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuCisKKyAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCByZXZlcnNlPVRydWUpWzpuXQorICAgICIiIgorICAgIGlmIG4gPCAwOgorICAgICAgICByZXR1cm4gW10KKyAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCisgICAgcmVzdWx0ID0gbGlzdChpc2xpY2UoaXQsIG4pKQorICAgIGlmIG5vdCByZXN1bHQ6CisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICBoZWFwaWZ5KHJlc3VsdCkKKyAgICBfaGVhcHB1c2hwb3AgPSBoZWFwcHVzaHBvcAorICAgIGZvciBlbGVtIGluIGl0OgorICAgICAgICBfaGVhcHB1c2hwb3AocmVzdWx0LCBlbGVtKQorICAgIHJlc3VsdC5zb3J0KHJldmVyc2U9VHJ1ZSkKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBuc21hbGxlc3QobiwgaXRlcmFibGUpOgorICAgICIiIkZpbmQgdGhlIG4gc21hbGxlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LgorCisgICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSlbOm5dCisgICAgIiIiCisgICAgaWYgbiA8IDA6CisgICAgICAgIHJldHVybiBbXQorICAgIGl0ID0gaXRlcihpdGVyYWJsZSkKKyAgICByZXN1bHQgPSBsaXN0KGlzbGljZShpdCwgbikpCisgICAgaWYgbm90IHJlc3VsdDoKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIF9oZWFwaWZ5X21heChyZXN1bHQpCisgICAgX2hlYXBwdXNocG9wID0gX2hlYXBwdXNocG9wX21heAorICAgIGZvciBlbGVtIGluIGl0OgorICAgICAgICBfaGVhcHB1c2hwb3AocmVzdWx0LCBlbGVtKQorICAgIHJlc3VsdC5zb3J0KCkKKyAgICByZXR1cm4gcmVzdWx0CisKKyMgJ2hlYXAnIGlzIGEgaGVhcCBhdCBhbGwgaW5kaWNlcyA+PSBzdGFydHBvcywgZXhjZXB0IHBvc3NpYmx5IGZvciBwb3MuICBwb3MKKyMgaXMgdGhlIGluZGV4IG9mIGEgbGVhZiB3aXRoIGEgcG9zc2libHkgb3V0LW9mLW9yZGVyIHZhbHVlLiAgUmVzdG9yZSB0aGUKKyMgaGVhcCBpbnZhcmlhbnQuCitkZWYgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpOgorICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc10KKyAgICAjIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nIGEgcGxhY2UKKyAgICAjIG5ld2l0ZW0gZml0cy4KKyAgICB3aGlsZSBwb3MgPiBzdGFydHBvczoKKyAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDEKKyAgICAgICAgcGFyZW50ID0gaGVhcFtwYXJlbnRwb3NdCisgICAgICAgIGlmIGNtcF9sdChuZXdpdGVtLCBwYXJlbnQpOgorICAgICAgICAgICAgaGVhcFtwb3NdID0gcGFyZW50CisgICAgICAgICAgICBwb3MgPSBwYXJlbnRwb3MKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGJyZWFrCisgICAgaGVhcFtwb3NdID0gbmV3aXRlbQorCisjIFRoZSBjaGlsZCBpbmRpY2VzIG9mIGhlYXAgaW5kZXggcG9zIGFyZSBhbHJlYWR5IGhlYXBzLCBhbmQgd2Ugd2FudCB0byBtYWtlCisjIGEgaGVhcCBhdCBpbmRleCBwb3MgdG9vLiAgV2UgZG8gdGhpcyBieSBidWJibGluZyB0aGUgc21hbGxlciBjaGlsZCBvZgorIyBwb3MgdXAgKGFuZCBzbyBvbiB3aXRoIHRoYXQgY2hpbGQncyBjaGlsZHJlbiwgZXRjKSB1bnRpbCBoaXR0aW5nIGEgbGVhZiwKKyMgdGhlbiB1c2luZyBfc2lmdGRvd24gdG8gbW92ZSB0aGUgb2RkYmFsbCBvcmlnaW5hbGx5IGF0IGluZGV4IHBvcyBpbnRvIHBsYWNlLgorIworIyBXZSAqY291bGQqIGJyZWFrIG91dCBvZiB0aGUgbG9vcCBhcyBzb29uIGFzIHdlIGZpbmQgYSBwb3Mgd2hlcmUgbmV3aXRlbSA8PQorIyBib3RoIGl0cyBjaGlsZHJlbiwgYnV0IHR1cm5zIG91dCB0aGF0J3Mgbm90IGEgZ29vZCBpZGVhLCBhbmQgZGVzcGl0ZSB0aGF0CisjIG1hbnkgYm9va3Mgd3JpdGUgdGhlIGFsZ29yaXRobSB0aGF0IHdheS4gIER1cmluZyBhIGhlYXAgcG9wLCB0aGUgbGFzdCBhcnJheQorIyBlbGVtZW50IGlzIHNpZnRlZCBpbiwgYW5kIHRoYXQgdGVuZHMgdG8gYmUgbGFyZ2UsIHNvIHRoYXQgY29tcGFyaW5nIGl0CisjIGFnYWluc3QgdmFsdWVzIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgdXN1YWxseSBkb2Vzbid0IHBheSAoPSB1c3VhbGx5IGRvZXNuJ3QKKyMgZ2V0IHVzIG91dCBvZiB0aGUgbG9vcCBlYXJseSkuICBTZWUgS251dGgsIFZvbHVtZSAzLCB3aGVyZSB0aGlzIGlzCisjIGV4cGxhaW5lZCBhbmQgcXVhbnRpZmllZCBpbiBhbiBleGVyY2lzZS4KKyMKKyMgQ3V0dGluZyB0aGUgIyBvZiBjb21wYXJpc29ucyBpcyBpbXBvcnRhbnQsIHNpbmNlIHRoZXNlIHJvdXRpbmVzIGhhdmUgbm8KKyMgd2F5IHRvIGV4dHJhY3QgInRoZSBwcmlvcml0eSIgZnJvbSBhbiBhcnJheSBlbGVtZW50LCBzbyB0aGF0IGludGVsbGlnZW5jZQorIyBpcyBsaWtlbHkgdG8gYmUgaGlkaW5nIGluIGN1c3RvbSBfX2NtcF9fIG1ldGhvZHMsIG9yIGluIGFycmF5IGVsZW1lbnRzCisjIHN0b3JpbmcgKHByaW9yaXR5LCByZWNvcmQpIHR1cGxlcy4gIENvbXBhcmlzb25zIGFyZSB0aHVzIHBvdGVudGlhbGx5CisjIGV4cGVuc2l2ZS4KKyMKKyMgT24gcmFuZG9tIGFycmF5cyBvZiBsZW5ndGggMTAwMCwgbWFraW5nIHRoaXMgY2hhbmdlIGN1dCB0aGUgbnVtYmVyIG9mCisjIGNvbXBhcmlzb25zIG1hZGUgYnkgaGVhcGlmeSgpIGEgbGl0dGxlLCBhbmQgdGhvc2UgbWFkZSBieSBleGhhdXN0aXZlCisjIGhlYXBwb3AoKSBhIGxvdCwgaW4gYWNjb3JkIHdpdGggdGhlb3J5LiAgSGVyZSBhcmUgdHlwaWNhbCByZXN1bHRzIGZyb20gMworIyBydW5zICgzIGp1c3QgdG8gZGVtb25zdHJhdGUgaG93IHNtYWxsIHRoZSB2YXJpYW5jZSBpcyk6CisjCisjIENvbXBhcmVzIG5lZWRlZCBieSBoZWFwaWZ5ICAgICBDb21wYXJlcyBuZWVkZWQgYnkgMTAwMCBoZWFwcG9wcworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgMTgzNyBjdXQgdG8gMTY2MyAgICAgICAgICAgICAgIDE0OTk2IGN1dCB0byA4NjgwCisjIDE4NTUgY3V0IHRvIDE2NTkgICAgICAgICAgICAgICAxNDk2NiBjdXQgdG8gODY3OAorIyAxODQ3IGN1dCB0byAxNjYwICAgICAgICAgICAgICAgMTUwMjQgY3V0IHRvIDg3MDMKKyMKKyMgQnVpbGRpbmcgdGhlIGhlYXAgYnkgdXNpbmcgaGVhcHB1c2goKSAxMDAwIHRpbWVzIGluc3RlYWQgcmVxdWlyZWQKKyMgMjE5OCwgMjE0OCwgYW5kIDIyMTkgY29tcGFyZXM6ICBoZWFwaWZ5KCkgaXMgbW9yZSBlZmZpY2llbnQsIHdoZW4KKyMgeW91IGNhbiB1c2UgaXQuCisjCisjIFRoZSB0b3RhbCBjb21wYXJlcyBuZWVkZWQgYnkgbGlzdC5zb3J0KCkgb24gdGhlIHNhbWUgbGlzdHMgd2VyZSA4NjI3LAorIyA4NjI3LCBhbmQgODYzMiAodGhpcyBzaG91bGQgYmUgY29tcGFyZWQgdG8gdGhlIHN1bSBvZiBoZWFwaWZ5KCkgYW5kCisjIGhlYXBwb3AoKSBjb21wYXJlcyk6ICBsaXN0LnNvcnQoKSBpcyAodW5zdXJwcmlzaW5nbHkhKSBtb3JlIGVmZmljaWVudAorIyBmb3Igc29ydGluZy4KKworZGVmIF9zaWZ0dXAoaGVhcCwgcG9zKToKKyAgICBlbmRwb3MgPSBsZW4oaGVhcCkKKyAgICBzdGFydHBvcyA9IHBvcworICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc10KKyAgICAjIEJ1YmJsZSB1cCB0aGUgc21hbGxlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4KKyAgICBjaGlsZHBvcyA9IDIqcG9zICsgMSAgICAjIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uCisgICAgd2hpbGUgY2hpbGRwb3MgPCBlbmRwb3M6CisgICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIHNtYWxsZXIgY2hpbGQuCisgICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxCisgICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgY21wX2x0KGhlYXBbY2hpbGRwb3NdLCBoZWFwW3JpZ2h0cG9zXSk6CisgICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zCisgICAgICAgICMgTW92ZSB0aGUgc21hbGxlciBjaGlsZCB1cC4KKyAgICAgICAgaGVhcFtwb3NdID0gaGVhcFtjaGlsZHBvc10KKyAgICAgICAgcG9zID0gY2hpbGRwb3MKKyAgICAgICAgY2hpbGRwb3MgPSAyKnBvcyArIDEKKyAgICAjIFRoZSBsZWFmIGF0IHBvcyBpcyBlbXB0eSBub3cuICBQdXQgbmV3aXRlbSB0aGVyZSwgYW5kIGJ1YmJsZSBpdCB1cAorICAgICMgdG8gaXRzIGZpbmFsIHJlc3RpbmcgcGxhY2UgKGJ5IHNpZnRpbmcgaXRzIHBhcmVudHMgZG93bikuCisgICAgaGVhcFtwb3NdID0gbmV3aXRlbQorICAgIF9zaWZ0ZG93bihoZWFwLCBzdGFydHBvcywgcG9zKQorCitkZWYgX3NpZnRkb3duX21heChoZWFwLCBzdGFydHBvcywgcG9zKToKKyAgICAnTWF4aGVhcCB2YXJpYW50IG9mIF9zaWZ0ZG93bicKKyAgICBuZXdpdGVtID0gaGVhcFtwb3NdCisgICAgIyBGb2xsb3cgdGhlIHBhdGggdG8gdGhlIHJvb3QsIG1vdmluZyBwYXJlbnRzIGRvd24gdW50aWwgZmluZGluZyBhIHBsYWNlCisgICAgIyBuZXdpdGVtIGZpdHMuCisgICAgd2hpbGUgcG9zID4gc3RhcnRwb3M6CisgICAgICAgIHBhcmVudHBvcyA9IChwb3MgLSAxKSA+PiAxCisgICAgICAgIHBhcmVudCA9IGhlYXBbcGFyZW50cG9zXQorICAgICAgICBpZiBjbXBfbHQocGFyZW50LCBuZXdpdGVtKToKKyAgICAgICAgICAgIGhlYXBbcG9zXSA9IHBhcmVudAorICAgICAgICAgICAgcG9zID0gcGFyZW50cG9zCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBicmVhaworICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW0KKworZGVmIF9zaWZ0dXBfbWF4KGhlYXAsIHBvcyk6CisgICAgJ01heGhlYXAgdmFyaWFudCBvZiBfc2lmdHVwJworICAgIGVuZHBvcyA9IGxlbihoZWFwKQorICAgIHN0YXJ0cG9zID0gcG9zCisgICAgbmV3aXRlbSA9IGhlYXBbcG9zXQorICAgICMgQnViYmxlIHVwIHRoZSBsYXJnZXIgY2hpbGQgdW50aWwgaGl0dGluZyBhIGxlYWYuCisgICAgY2hpbGRwb3MgPSAyKnBvcyArIDEgICAgIyBsZWZ0bW9zdCBjaGlsZCBwb3NpdGlvbgorICAgIHdoaWxlIGNoaWxkcG9zIDwgZW5kcG9zOgorICAgICAgICAjIFNldCBjaGlsZHBvcyB0byBpbmRleCBvZiBsYXJnZXIgY2hpbGQuCisgICAgICAgIHJpZ2h0cG9zID0gY2hpbGRwb3MgKyAxCisgICAgICAgIGlmIHJpZ2h0cG9zIDwgZW5kcG9zIGFuZCBub3QgY21wX2x0KGhlYXBbcmlnaHRwb3NdLCBoZWFwW2NoaWxkcG9zXSk6CisgICAgICAgICAgICBjaGlsZHBvcyA9IHJpZ2h0cG9zCisgICAgICAgICMgTW92ZSB0aGUgbGFyZ2VyIGNoaWxkIHVwLgorICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXQorICAgICAgICBwb3MgPSBjaGlsZHBvcworICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMQorICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwCisgICAgIyB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4KKyAgICBoZWFwW3Bvc10gPSBuZXdpdGVtCisgICAgX3NpZnRkb3duX21heChoZWFwLCBzdGFydHBvcywgcG9zKQorCisjIElmIGF2YWlsYWJsZSwgdXNlIEMgaW1wbGVtZW50YXRpb24KK3RyeToKKyAgICBmcm9tIF9oZWFwcSBpbXBvcnQgKgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKKworZGVmIG1lcmdlKCppdGVyYWJsZXMpOgorICAgICcnJ01lcmdlIG11bHRpcGxlIHNvcnRlZCBpbnB1dHMgaW50byBhIHNpbmdsZSBzb3J0ZWQgb3V0cHV0LgorCisgICAgU2ltaWxhciB0byBzb3J0ZWQoaXRlcnRvb2xzLmNoYWluKCppdGVyYWJsZXMpKSBidXQgcmV0dXJucyBhIGdlbmVyYXRvciwKKyAgICBkb2VzIG5vdCBwdWxsIHRoZSBkYXRhIGludG8gbWVtb3J5IGFsbCBhdCBvbmNlLCBhbmQgYXNzdW1lcyB0aGF0IGVhY2ggb2YKKyAgICB0aGUgaW5wdXQgc3RyZWFtcyBpcyBhbHJlYWR5IHNvcnRlZCAoc21hbGxlc3QgdG8gbGFyZ2VzdCkuCisKKyAgICA+Pj4gbGlzdChtZXJnZShbMSwzLDUsN10sIFswLDIsNCw4XSwgWzUsMTAsMTUsMjBdLCBbXSwgWzI1XSkpCisgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDUsIDcsIDgsIDEwLCAxNSwgMjAsIDI1XQorCisgICAgJycnCisgICAgX2hlYXBwb3AsIF9oZWFwcmVwbGFjZSwgX1N0b3BJdGVyYXRpb24gPSBoZWFwcG9wLCBoZWFwcmVwbGFjZSwgU3RvcEl0ZXJhdGlvbgorCisgICAgaCA9IFtdCisgICAgaF9hcHBlbmQgPSBoLmFwcGVuZAorICAgIGZvciBpdG51bSwgaXQgaW4gZW51bWVyYXRlKG1hcChpdGVyLCBpdGVyYWJsZXMpKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV4dCA9IGl0Lm5leHQKKyAgICAgICAgICAgIGhfYXBwZW5kKFtuZXh0KCksIGl0bnVtLCBuZXh0XSkKKyAgICAgICAgZXhjZXB0IF9TdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcGFzcworICAgIGhlYXBpZnkoaCkKKworICAgIHdoaWxlIDE6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgdiwgaXRudW0sIG5leHQgPSBzID0gaFswXSAgICMgcmFpc2VzIEluZGV4RXJyb3Igd2hlbiBoIGlzIGVtcHR5CisgICAgICAgICAgICAgICAgeWllbGQgdgorICAgICAgICAgICAgICAgIHNbMF0gPSBuZXh0KCkgICAgICAgICAgICAgICAjIHJhaXNlcyBTdG9wSXRlcmF0aW9uIHdoZW4gZXhoYXVzdGVkCisgICAgICAgICAgICAgICAgX2hlYXByZXBsYWNlKGgsIHMpICAgICAgICAgICMgcmVzdG9yZSBoZWFwIGNvbmRpdGlvbgorICAgICAgICBleGNlcHQgX1N0b3BJdGVyYXRpb246CisgICAgICAgICAgICBfaGVhcHBvcChoKSAgICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGVtcHR5IGl0ZXJhdG9yCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisKKyMgRXh0ZW5kIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgbnNtYWxsZXN0IGFuZCBubGFyZ2VzdCB0byB1c2UgYSBrZXk9IGFyZ3VtZW50CitfbnNtYWxsZXN0ID0gbnNtYWxsZXN0CitkZWYgbnNtYWxsZXN0KG4sIGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CisgICAgIiIiRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuCisKKyAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl0KKyAgICAiIiIKKyAgICAjIFNob3J0LWN1dCBmb3Igbj09MSBpcyB0byB1c2UgbWluKCkgd2hlbiBsZW4oaXRlcmFibGUpPjAKKyAgICBpZiBuID09IDE6CisgICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSkKKyAgICAgICAgaGVhZCA9IGxpc3QoaXNsaWNlKGl0LCAxKSkKKyAgICAgICAgaWYgbm90IGhlYWQ6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgaWYga2V5IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gW21pbihjaGFpbihoZWFkLCBpdCkpXQorICAgICAgICByZXR1cm4gW21pbihjaGFpbihoZWFkLCBpdCksIGtleT1rZXkpXQorCisgICAgIyBXaGVuIG4+PXNpemUsIGl0J3MgZmFzdGVyIHRvIHVzZSBzb3J0ZWQoKQorICAgIHRyeToKKyAgICAgICAgc2l6ZSA9IGxlbihpdGVyYWJsZSkKKyAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgaWYgbiA+PSBzaXplOgorICAgICAgICAgICAgcmV0dXJuIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSlbOm5dCisKKyAgICAjIFdoZW4ga2V5IGlzIG5vbmUsIHVzZSBzaW1wbGVyIGRlY29yYXRpb24KKyAgICBpZiBrZXkgaXMgTm9uZToKKyAgICAgICAgaXQgPSBpemlwKGl0ZXJhYmxlLCBjb3VudCgpKSAgICAgICAgICAgICAgICAgICAgICAgICMgZGVjb3JhdGUKKyAgICAgICAgcmVzdWx0ID0gX25zbWFsbGVzdChuLCBpdCkKKyAgICAgICAgcmV0dXJuIG1hcChpdGVtZ2V0dGVyKDApLCByZXN1bHQpICAgICAgICAgICAgICAgICAgICMgdW5kZWNvcmF0ZQorCisgICAgIyBHZW5lcmFsIGNhc2UsIHNsb3dlc3QgbWV0aG9kCisgICAgaW4xLCBpbjIgPSB0ZWUoaXRlcmFibGUpCisgICAgaXQgPSBpemlwKGltYXAoa2V5LCBpbjEpLCBjb3VudCgpLCBpbjIpICAgICAgICAgICAgICAgICAjIGRlY29yYXRlCisgICAgcmVzdWx0ID0gX25zbWFsbGVzdChuLCBpdCkKKyAgICByZXR1cm4gbWFwKGl0ZW1nZXR0ZXIoMiksIHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICMgdW5kZWNvcmF0ZQorCitfbmxhcmdlc3QgPSBubGFyZ2VzdAorZGVmIG5sYXJnZXN0KG4sIGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CisgICAgIiIiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4KKworICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXksIHJldmVyc2U9VHJ1ZSlbOm5dCisgICAgIiIiCisKKyAgICAjIFNob3J0LWN1dCBmb3Igbj09MSBpcyB0byB1c2UgbWF4KCkgd2hlbiBsZW4oaXRlcmFibGUpPjAKKyAgICBpZiBuID09IDE6CisgICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSkKKyAgICAgICAgaGVhZCA9IGxpc3QoaXNsaWNlKGl0LCAxKSkKKyAgICAgICAgaWYgbm90IGhlYWQ6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgaWYga2V5IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gW21heChjaGFpbihoZWFkLCBpdCkpXQorICAgICAgICByZXR1cm4gW21heChjaGFpbihoZWFkLCBpdCksIGtleT1rZXkpXQorCisgICAgIyBXaGVuIG4+PXNpemUsIGl0J3MgZmFzdGVyIHRvIHVzZSBzb3J0ZWQoKQorICAgIHRyeToKKyAgICAgICAgc2l6ZSA9IGxlbihpdGVyYWJsZSkKKyAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgaWYgbiA+PSBzaXplOgorICAgICAgICAgICAgcmV0dXJuIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl0KKworICAgICMgV2hlbiBrZXkgaXMgbm9uZSwgdXNlIHNpbXBsZXIgZGVjb3JhdGlvbgorICAgIGlmIGtleSBpcyBOb25lOgorICAgICAgICBpdCA9IGl6aXAoaXRlcmFibGUsIGNvdW50KDAsLTEpKSAgICAgICAgICAgICAgICAgICAgIyBkZWNvcmF0ZQorICAgICAgICByZXN1bHQgPSBfbmxhcmdlc3QobiwgaXQpCisgICAgICAgIHJldHVybiBtYXAoaXRlbWdldHRlcigwKSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAjIHVuZGVjb3JhdGUKKworICAgICMgR2VuZXJhbCBjYXNlLCBzbG93ZXN0IG1ldGhvZAorICAgIGluMSwgaW4yID0gdGVlKGl0ZXJhYmxlKQorICAgIGl0ID0gaXppcChpbWFwKGtleSwgaW4xKSwgY291bnQoMCwtMSksIGluMikgICAgICAgICAgICAgIyBkZWNvcmF0ZQorICAgIHJlc3VsdCA9IF9ubGFyZ2VzdChuLCBpdCkKKyAgICByZXR1cm4gbWFwKGl0ZW1nZXR0ZXIoMiksIHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICMgdW5kZWNvcmF0ZQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICMgU2ltcGxlIHNhbml0eSB0ZXN0CisgICAgaGVhcCA9IFtdCisgICAgZGF0YSA9IFsxLCAzLCA1LCA3LCA5LCAyLCA0LCA2LCA4LCAwXQorICAgIGZvciBpdGVtIGluIGRhdGE6CisgICAgICAgIGhlYXBwdXNoKGhlYXAsIGl0ZW0pCisgICAgc29ydCA9IFtdCisgICAgd2hpbGUgaGVhcDoKKyAgICAgICAgc29ydC5hcHBlbmQoaGVhcHBvcChoZWFwKSkKKyAgICBwcmludCBzb3J0CisKKyAgICBpbXBvcnQgZG9jdGVzdAorICAgIGRvY3Rlc3QudGVzdG1vZCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hlYXBxLnB5YyBiL2xpYi9weXRob24yLjcvaGVhcHEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1M2MyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2hlYXBxLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hlYXBxLnB5byBiL2xpYi9weXRob24yLjcvaGVhcHEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1M2MyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2hlYXBxLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2htYWMucHkgYi9saWIvcHl0aG9uMi43L2htYWMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4ODEwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaG1hYy5weQpAQCAtMCwwICsxLDEzMyBAQAorIiIiSE1BQyAoS2V5ZWQtSGFzaGluZyBmb3IgTWVzc2FnZSBBdXRoZW50aWNhdGlvbikgUHl0aG9uIG1vZHVsZS4KKworSW1wbGVtZW50cyB0aGUgSE1BQyBhbGdvcml0aG0gYXMgZGVzY3JpYmVkIGJ5IFJGQyAyMTA0LgorIiIiCisKK2ltcG9ydCB3YXJuaW5ncyBhcyBfd2FybmluZ3MKKwordHJhbnNfNUMgPSAiIi5qb2luIChbY2hyICh4IF4gMHg1QykgZm9yIHggaW4geHJhbmdlKDI1NildKQordHJhbnNfMzYgPSAiIi5qb2luIChbY2hyICh4IF4gMHgzNikgZm9yIHggaW4geHJhbmdlKDI1NildKQorCisjIFRoZSBzaXplIG9mIHRoZSBkaWdlc3RzIHJldHVybmVkIGJ5IEhNQUMgZGVwZW5kcyBvbiB0aGUgdW5kZXJseWluZworIyBoYXNoaW5nIG1vZHVsZSB1c2VkLiAgVXNlIGRpZ2VzdF9zaXplIGZyb20gdGhlIGluc3RhbmNlIG9mIEhNQUMgaW5zdGVhZC4KK2RpZ2VzdF9zaXplID0gTm9uZQorCisjIEEgdW5pcXVlIG9iamVjdCBwYXNzZWQgYnkgSE1BQy5jb3B5KCkgdG8gdGhlIEhNQUMgY29uc3RydWN0b3IsIGluIG9yZGVyCisjIHRoYXQgdGhlIGxhdHRlciByZXR1cm4gdmVyeSBxdWlja2x5LiAgSE1BQygiIikgaW4gY29udHJhc3QgaXMgcXVpdGUKKyMgZXhwZW5zaXZlLgorX3NlY3JldF9iYWNrZG9vcl9rZXkgPSBbXQorCitjbGFzcyBITUFDOgorICAgICIiIlJGQyAyMTA0IEhNQUMgY2xhc3MuICBBbHNvIGNvbXBsaWVzIHdpdGggUkZDIDQyMzEuCisKKyAgICBUaGlzIHN1cHBvcnRzIHRoZSBBUEkgZm9yIENyeXB0b2dyYXBoaWMgSGFzaCBGdW5jdGlvbnMgKFBFUCAyNDcpLgorICAgICIiIgorICAgIGJsb2Nrc2l6ZSA9IDY0ICAjIDUxMi1iaXQgSE1BQzsgY2FuIGJlIGNoYW5nZWQgaW4gc3ViY2xhc3Nlcy4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXksIG1zZyA9IE5vbmUsIGRpZ2VzdG1vZCA9IE5vbmUpOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgSE1BQyBvYmplY3QuCisKKyAgICAgICAga2V5OiAgICAgICBrZXkgZm9yIHRoZSBrZXllZCBoYXNoIG9iamVjdC4KKyAgICAgICAgbXNnOiAgICAgICBJbml0aWFsIGlucHV0IGZvciB0aGUgaGFzaCwgaWYgcHJvdmlkZWQuCisgICAgICAgIGRpZ2VzdG1vZDogQSBtb2R1bGUgc3VwcG9ydGluZyBQRVAgMjQ3LiAgKk9SKgorICAgICAgICAgICAgICAgICAgIEEgaGFzaGxpYiBjb25zdHJ1Y3RvciByZXR1cm5pbmcgYSBuZXcgaGFzaCBvYmplY3QuCisgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gaGFzaGxpYi5tZDUuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGtleSBpcyBfc2VjcmV0X2JhY2tkb29yX2tleTogIyBjaGVhcAorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgZGlnZXN0bW9kIGlzIE5vbmU6CisgICAgICAgICAgICBpbXBvcnQgaGFzaGxpYgorICAgICAgICAgICAgZGlnZXN0bW9kID0gaGFzaGxpYi5tZDUKKworICAgICAgICBpZiBoYXNhdHRyKGRpZ2VzdG1vZCwgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICBzZWxmLmRpZ2VzdF9jb25zID0gZGlnZXN0bW9kCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRpZ2VzdF9jb25zID0gbGFtYmRhIGQ9Jyc6IGRpZ2VzdG1vZC5uZXcoZCkKKworICAgICAgICBzZWxmLm91dGVyID0gc2VsZi5kaWdlc3RfY29ucygpCisgICAgICAgIHNlbGYuaW5uZXIgPSBzZWxmLmRpZ2VzdF9jb25zKCkKKyAgICAgICAgc2VsZi5kaWdlc3Rfc2l6ZSA9IHNlbGYuaW5uZXIuZGlnZXN0X3NpemUKKworICAgICAgICBpZiBoYXNhdHRyKHNlbGYuaW5uZXIsICdibG9ja19zaXplJyk6CisgICAgICAgICAgICBibG9ja3NpemUgPSBzZWxmLmlubmVyLmJsb2NrX3NpemUKKyAgICAgICAgICAgIGlmIGJsb2Nrc2l6ZSA8IDE2OgorICAgICAgICAgICAgICAgICMgVmVyeSBsb3cgYmxvY2tzaXplLCBtb3N0IGxpa2VseSBhIGxlZ2FjeSB2YWx1ZSBsaWtlCisgICAgICAgICAgICAgICAgIyBMaWIvc2hhLnB5IGFuZCBMaWIvbWQ1LnB5IGhhdmUuCisgICAgICAgICAgICAgICAgX3dhcm5pbmdzLndhcm4oJ2Jsb2NrX3NpemUgb2YgJWQgc2VlbXMgdG9vIHNtYWxsOyB1c2luZyBvdXIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0IG9mICVkLicgJSAoYmxvY2tzaXplLCBzZWxmLmJsb2Nrc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnVudGltZVdhcm5pbmcsIDIpCisgICAgICAgICAgICAgICAgYmxvY2tzaXplID0gc2VsZi5ibG9ja3NpemUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIF93YXJuaW5ncy53YXJuKCdObyBibG9ja19zaXplIGF0dHJpYnV0ZSBvbiBnaXZlbiBkaWdlc3Qgb2JqZWN0OyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnQXNzdW1pbmcgJWQuJyAlIChzZWxmLmJsb2Nrc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lV2FybmluZywgMikKKyAgICAgICAgICAgIGJsb2Nrc2l6ZSA9IHNlbGYuYmxvY2tzaXplCisKKyAgICAgICAgaWYgbGVuKGtleSkgPiBibG9ja3NpemU6CisgICAgICAgICAgICBrZXkgPSBzZWxmLmRpZ2VzdF9jb25zKGtleSkuZGlnZXN0KCkKKworICAgICAgICBrZXkgPSBrZXkgKyBjaHIoMCkgKiAoYmxvY2tzaXplIC0gbGVuKGtleSkpCisgICAgICAgIHNlbGYub3V0ZXIudXBkYXRlKGtleS50cmFuc2xhdGUodHJhbnNfNUMpKQorICAgICAgICBzZWxmLmlubmVyLnVwZGF0ZShrZXkudHJhbnNsYXRlKHRyYW5zXzM2KSkKKyAgICAgICAgaWYgbXNnIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi51cGRhdGUobXNnKQorCisjIyAgICBkZWYgY2xlYXIoc2VsZik6CisjIyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgImNsZWFyKCkgbWV0aG9kIG5vdCBhdmFpbGFibGUgaW4gSE1BQy4iCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIG1zZyk6CisgICAgICAgICIiIlVwZGF0ZSB0aGlzIGhhc2hpbmcgb2JqZWN0IHdpdGggdGhlIHN0cmluZyBtc2cuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmlubmVyLnVwZGF0ZShtc2cpCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc2VwYXJhdGUgY29weSBvZiB0aGlzIGhhc2hpbmcgb2JqZWN0LgorCisgICAgICAgIEFuIHVwZGF0ZSB0byB0aGlzIGNvcHkgd29uJ3QgYWZmZWN0IHRoZSBvcmlnaW5hbCBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICBvdGhlciA9IHNlbGYuX19jbGFzc19fKF9zZWNyZXRfYmFja2Rvb3Jfa2V5KQorICAgICAgICBvdGhlci5kaWdlc3RfY29ucyA9IHNlbGYuZGlnZXN0X2NvbnMKKyAgICAgICAgb3RoZXIuZGlnZXN0X3NpemUgPSBzZWxmLmRpZ2VzdF9zaXplCisgICAgICAgIG90aGVyLmlubmVyID0gc2VsZi5pbm5lci5jb3B5KCkKKyAgICAgICAgb3RoZXIub3V0ZXIgPSBzZWxmLm91dGVyLmNvcHkoKQorICAgICAgICByZXR1cm4gb3RoZXIKKworICAgIGRlZiBfY3VycmVudChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgaGFzaCBvYmplY3QgZm9yIHRoZSBjdXJyZW50IHN0YXRlLgorCisgICAgICAgIFRvIGJlIHVzZWQgb25seSBpbnRlcm5hbGx5IHdpdGggZGlnZXN0KCkgYW5kIGhleGRpZ2VzdCgpLgorICAgICAgICAiIiIKKyAgICAgICAgaCA9IHNlbGYub3V0ZXIuY29weSgpCisgICAgICAgIGgudXBkYXRlKHNlbGYuaW5uZXIuZGlnZXN0KCkpCisgICAgICAgIHJldHVybiBoCisKKyAgICBkZWYgZGlnZXN0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGhhc2ggdmFsdWUgb2YgdGhpcyBoYXNoaW5nIG9iamVjdC4KKworICAgICAgICBUaGlzIHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyA4LWJpdCBkYXRhLiAgVGhlIG9iamVjdCBpcworICAgICAgICBub3QgYWx0ZXJlZCBpbiBhbnkgd2F5IGJ5IHRoaXMgZnVuY3Rpb247IHlvdSBjYW4gY29udGludWUKKyAgICAgICAgdXBkYXRpbmcgdGhlIG9iamVjdCBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICBoID0gc2VsZi5fY3VycmVudCgpCisgICAgICAgIHJldHVybiBoLmRpZ2VzdCgpCisKKyAgICBkZWYgaGV4ZGlnZXN0KHNlbGYpOgorICAgICAgICAiIiJMaWtlIGRpZ2VzdCgpLCBidXQgcmV0dXJucyBhIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMgaW5zdGVhZC4KKyAgICAgICAgIiIiCisgICAgICAgIGggPSBzZWxmLl9jdXJyZW50KCkKKyAgICAgICAgcmV0dXJuIGguaGV4ZGlnZXN0KCkKKworZGVmIG5ldyhrZXksIG1zZyA9IE5vbmUsIGRpZ2VzdG1vZCA9IE5vbmUpOgorICAgICIiIkNyZWF0ZSBhIG5ldyBoYXNoaW5nIG9iamVjdCBhbmQgcmV0dXJuIGl0LgorCisgICAga2V5OiBUaGUgc3RhcnRpbmcga2V5IGZvciB0aGUgaGFzaC4KKyAgICBtc2c6IGlmIGF2YWlsYWJsZSwgd2lsbCBpbW1lZGlhdGVseSBiZSBoYXNoZWQgaW50byB0aGUgb2JqZWN0J3Mgc3RhcnRpbmcKKyAgICBzdGF0ZS4KKworICAgIFlvdSBjYW4gbm93IGZlZWQgYXJiaXRyYXJ5IHN0cmluZ3MgaW50byB0aGUgb2JqZWN0IHVzaW5nIGl0cyB1cGRhdGUoKQorICAgIG1ldGhvZCwgYW5kIGNhbiBhc2sgZm9yIHRoZSBoYXNoIHZhbHVlIGF0IGFueSB0aW1lIGJ5IGNhbGxpbmcgaXRzIGRpZ2VzdCgpCisgICAgbWV0aG9kLgorICAgICIiIgorICAgIHJldHVybiBITUFDKGtleSwgbXNnLCBkaWdlc3Rtb2QpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2htYWMucHljIGIvbGliL3B5dGhvbjIuNy9obWFjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGZlMDQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9obWFjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2htYWMucHlvIGIvbGliL3B5dGhvbjIuNy9obWFjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGZlMDQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9obWFjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hvdHNob3QvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2hvdHNob3QvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1NmFiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaG90c2hvdC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDc4IEBACisiIiJIaWdoLXBlcmZvbWFuY2UgbG9nZ2luZyBwcm9maWxlciwgbW9zdGx5IHdyaXR0ZW4gaW4gQy4iIiIKKworaW1wb3J0IF9ob3RzaG90Citmcm9tIF9ob3RzaG90IGltcG9ydCBQcm9maWxlckVycm9yCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrIGFzIF93YXJucHkzaworX3dhcm5weTNrKCJUaGUgJ2hvdHNob3QnIG1vZHVsZSBpcyBub3Qgc3VwcG9ydGVkIGluIDMueCwgIgorICAgICAgICAgICJ1c2UgdGhlICdwcm9maWxlJyBtb2R1bGUgaW5zdGVhZC4iLCBzdGFja2xldmVsPTIpCisKK2NsYXNzIFByb2ZpbGU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvZ2ZuLCBsaW5lZXZlbnRzPTAsIGxpbmV0aW1pbmdzPTEpOgorICAgICAgICBzZWxmLmxpbmVldmVudHMgPSBsaW5lZXZlbnRzIGFuZCAxIG9yIDAKKyAgICAgICAgc2VsZi5saW5ldGltaW5ncyA9IChsaW5ldGltaW5ncyBhbmQgbGluZWV2ZW50cykgYW5kIDEgb3IgMAorICAgICAgICBzZWxmLl9wcm9mID0gcCA9IF9ob3RzaG90LnByb2ZpbGVyKAorICAgICAgICAgICAgbG9nZm4sIHNlbGYubGluZWV2ZW50cywgc2VsZi5saW5ldGltaW5ncykKKworICAgICAgICAjIEF0dGVtcHQgdG8gYXZvaWQgY29uZnVzaW5nIHJlc3VsdHMgY2F1c2VkIGJ5IHRoZSBwcmVzZW5jZSBvZgorICAgICAgICAjIFB5dGhvbiB3cmFwcGVycyBhcm91bmQgdGhlc2UgZnVuY3Rpb25zLCBidXQgb25seSBpZiB3ZSBjYW4KKyAgICAgICAgIyBiZSBzdXJlIHRoZSBtZXRob2RzIGhhdmUgbm90IGJlZW4gb3ZlcnJpZGRlbiBvciBleHRlbmRlZC4KKyAgICAgICAgaWYgc2VsZi5fX2NsYXNzX18gaXMgUHJvZmlsZToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UgPSBwLmNsb3NlCisgICAgICAgICAgICBzZWxmLnN0YXJ0ID0gcC5zdGFydAorICAgICAgICAgICAgc2VsZi5zdG9wID0gcC5zdG9wCisgICAgICAgICAgICBzZWxmLmFkZGluZm8gPSBwLmFkZGluZm8KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIGxvZ2ZpbGUgYW5kIHRlcm1pbmF0ZSB0aGUgcHJvZmlsZXIuIiIiCisgICAgICAgIHNlbGYuX3Byb2YuY2xvc2UoKQorCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIHByb2ZpbGVyJ3MgbG9nIGZpbGUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9wcm9mLmZpbGVubygpCisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgICIiIlN0YXJ0IHRoZSBwcm9maWxlci4iIiIKKyAgICAgICAgc2VsZi5fcHJvZi5zdGFydCgpCisKKyAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgIiIiU3RvcCB0aGUgcHJvZmlsZXIuIiIiCisgICAgICAgIHNlbGYuX3Byb2Yuc3RvcCgpCisKKyAgICBkZWYgYWRkaW5mbyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgIiIiQWRkIGFuIGFyYml0cmFyeSBsYWJlbGxlZCB2YWx1ZSB0byB0aGUgcHJvZmlsZSBsb2cuIiIiCisgICAgICAgIHNlbGYuX3Byb2YuYWRkaW5mbyhrZXksIHZhbHVlKQorCisgICAgIyBUaGVzZSBtZXRob2RzIG9mZmVyIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUgcHJvZmlsZS5Qcm9maWxlIGNsYXNzLAorICAgICMgYnV0IGRlbGVnYXRlIG1vc3Qgb2YgdGhlIHdvcmsgdG8gdGhlIEMgaW1wbGVtZW50YXRpb24gdW5kZXJuZWF0aC4KKworICAgIGRlZiBydW4oc2VsZiwgY21kKToKKyAgICAgICAgIiIiUHJvZmlsZSBhbiBleGVjLWNvbXBhdGlibGUgc3RyaW5nIGluIHRoZSBzY3JpcHQKKyAgICAgICAgZW52aXJvbm1lbnQuCisKKyAgICAgICAgVGhlIGdsb2JhbHMgZnJvbSB0aGUgX19tYWluX18gbW9kdWxlIGFyZSB1c2VkIGFzIGJvdGggdGhlCisgICAgICAgIGdsb2JhbHMgYW5kIGxvY2FscyBmb3IgdGhlIHNjcmlwdC4KKyAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBfX21haW5fXworICAgICAgICBkaWN0ID0gX19tYWluX18uX19kaWN0X18KKyAgICAgICAgcmV0dXJuIHNlbGYucnVuY3R4KGNtZCwgZGljdCwgZGljdCkKKworICAgIGRlZiBydW5jdHgoc2VsZiwgY21kLCBnbG9iYWxzLCBsb2NhbHMpOgorICAgICAgICAiIiJFdmFsdWF0ZSBhbiBleGVjLWNvbXBhdGlibGUgc3RyaW5nIGluIGEgc3BlY2lmaWMKKyAgICAgICAgZW52aXJvbm1lbnQuCisKKyAgICAgICAgVGhlIHN0cmluZyBpcyBjb21waWxlZCBiZWZvcmUgcHJvZmlsaW5nIGJlZ2lucy4KKyAgICAgICAgIiIiCisgICAgICAgIGNvZGUgPSBjb21waWxlKGNtZCwgIjxzdHJpbmc+IiwgImV4ZWMiKQorICAgICAgICBzZWxmLl9wcm9mLnJ1bmNvZGUoY29kZSwgZ2xvYmFscywgbG9jYWxzKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHJ1bmNhbGwoc2VsZiwgZnVuYywgKmFyZ3MsICoqa3cpOgorICAgICAgICAiIiJQcm9maWxlIGEgc2luZ2xlIGNhbGwgb2YgYSBjYWxsYWJsZS4KKworICAgICAgICBBZGRpdGlvbmFsIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzIG1heSBiZSBwYXNzZWQKKyAgICAgICAgYWxvbmc7IHRoZSByZXN1bHQgb2YgdGhlIGNhbGwgaXMgcmV0dXJuZWQsIGFuZCBleGNlcHRpb25zIGFyZQorICAgICAgICBhbGxvd2VkIHRvIHByb3BvZ2F0ZSBjbGVhbmx5LCB3aGlsZSBlbnN1cmluZyB0aGF0IHByb2ZpbGluZyBpcworICAgICAgICBkaXNhYmxlZCBvbiB0aGUgd2F5IG91dC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9wcm9mLnJ1bmNhbGwoZnVuYywgYXJncywga3cpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hvdHNob3QvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzg2YzAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hvdHNob3QvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzg2YzAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hvdHNob3QvbG9nLnB5IGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L2xvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2U4YjUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L2xvZy5weQpAQCAtMCwwICsxLDE5NCBAQAoraW1wb3J0IF9ob3RzaG90CitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHBhcnNlcgoraW1wb3J0IHN5bWJvbAorCitmcm9tIF9ob3RzaG90IGltcG9ydCBcCisgICAgIFdIQVRfRU5URVIsIFwKKyAgICAgV0hBVF9FWElULCBcCisgICAgIFdIQVRfTElORU5PLCBcCisgICAgIFdIQVRfREVGSU5FX0ZJTEUsIFwKKyAgICAgV0hBVF9ERUZJTkVfRlVOQywgXAorICAgICBXSEFUX0FERF9JTkZPCisKKworX19hbGxfXyA9IFsiTG9nUmVhZGVyIiwgIkVOVEVSIiwgIkVYSVQiLCAiTElORSJdCisKKworRU5URVIgPSBXSEFUX0VOVEVSCitFWElUICA9IFdIQVRfRVhJVAorTElORSAgPSBXSEFUX0xJTkVOTworCisKK2NsYXNzIExvZ1JlYWRlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9nZm4pOgorICAgICAgICAjIGZpbGVubyAtPiBmaWxlbmFtZQorICAgICAgICBzZWxmLl9maWxlbWFwID0ge30KKyAgICAgICAgIyAoZmlsZW5vLCBsaW5lbm8pIC0+IGZpbGVuYW1lLCBmdW5jbmFtZQorICAgICAgICBzZWxmLl9mdW5jbWFwID0ge30KKworICAgICAgICBzZWxmLl9yZWFkZXIgPSBfaG90c2hvdC5sb2dyZWFkZXIobG9nZm4pCisgICAgICAgIHNlbGYuX25leHRpdGVtID0gc2VsZi5fcmVhZGVyLm5leHQKKyAgICAgICAgc2VsZi5faW5mbyA9IHNlbGYuX3JlYWRlci5pbmZvCisgICAgICAgIGlmICdjdXJyZW50LWRpcmVjdG9yeScgaW4gc2VsZi5faW5mbzoKKyAgICAgICAgICAgIHNlbGYuY3dkID0gc2VsZi5faW5mb1snY3VycmVudC1kaXJlY3RvcnknXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jd2QgPSBOb25lCisKKyAgICAgICAgIyBUaGlzIG1pcnJvcnMgdGhlIGNhbGwgc3RhY2sgb2YgdGhlIHByb2ZpbGVkIGNvZGUgYXMgdGhlIGxvZworICAgICAgICAjIGlzIHJlYWQgYmFjayBpbi4gIEl0IGNvbnRhaW5zIHR1cGxlcyBvZiB0aGUgZm9ybToKKyAgICAgICAgIworICAgICAgICAjICAgKGZpbGUgbmFtZSwgbGluZSBudW1iZXIgb2YgZnVuY3Rpb24gZGVmLCBmdW5jdGlvbiBuYW1lKQorICAgICAgICAjCisgICAgICAgIHNlbGYuX3N0YWNrID0gW10KKyAgICAgICAgc2VsZi5fYXBwZW5kID0gc2VsZi5fc3RhY2suYXBwZW5kCisgICAgICAgIHNlbGYuX3BvcCA9IHNlbGYuX3N0YWNrLnBvcAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9yZWFkZXIuY2xvc2UoKQorCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3Igb2YgdGhlIGxvZyByZWFkZXIncyBsb2cgZmlsZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRlci5maWxlbm8oKQorCisgICAgZGVmIGFkZGluZm8oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgZWFjaCBhZGRpdGlvbmFsIEFERF9JTkZPIHJlY29yZC4KKworICAgICAgICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgdG8gcmVjZWl2ZQorICAgICAgICB0aGVzZSBldmVudHMuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBuZWVkIHRvIGJlCisgICAgICAgIGNhbGxlZCBieSBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zLgorCisgICAgICAgIFRoZSBpbml0aWFsIHNldCBvZiBBRERfSU5GTyByZWNvcmRzIGRvIG5vdCBwYXNzIHRocm91Z2ggdGhpcworICAgICAgICBtZWNoYW5pc207IHRoaXMgaXMgb25seSBuZWVkZWQgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbgorICAgICAgICBuZXcgdmFsdWVzIGFyZSBhZGRlZC4gIFN1YmNsYXNzZXMgY2FuIGluc3BlY3Qgc2VsZi5faW5mbyBhZnRlcgorICAgICAgICBjYWxsaW5nIExvZ1JlYWRlci5fX2luaXRfXygpLgorICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIGdldF9maWxlbmFtZShzZWxmLCBmaWxlbm8pOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmlsZW1hcFtmaWxlbm9dCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bmtub3duIGZpbGVubyIKKworICAgIGRlZiBnZXRfZmlsZW5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZW1hcC52YWx1ZXMoKQorCisgICAgZGVmIGdldF9maWxlbm8oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5ub3JtcGF0aChmaWxlbmFtZSkpCisgICAgICAgIGZvciBmaWxlbm8sIG5hbWUgaW4gc2VsZi5fZmlsZW1hcC5pdGVtcygpOgorICAgICAgICAgICAgaWYgbmFtZSA9PSBmaWxlbmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsZW5vCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bmtub3duIGZpbGVuYW1lIgorCisgICAgZGVmIGdldF9mdW5jbmFtZShzZWxmLCBmaWxlbm8sIGxpbmVubyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9mdW5jbWFwWyhmaWxlbm8sIGxpbmVubyldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bmtub3duIGZ1bmN0aW9uIGxvY2F0aW9uIgorCisgICAgIyBJdGVyYXRpb24gc3VwcG9ydDoKKyAgICAjIFRoaXMgYWRkcyBhbiBvcHRpb25hbCAoJiBpZ25vcmVkKSBwYXJhbWV0ZXIgdG8gbmV4dCgpIHNvIHRoYXQgdGhlCisgICAgIyBzYW1lIGJvdW5kIG1ldGhvZCBjYW4gYmUgdXNlZCBhcyB0aGUgX19nZXRpdGVtX18oKSBtZXRob2QgLS0gdGhpcworICAgICMgYXZvaWRzIHVzaW5nIGFuIGFkZGl0aW9uYWwgbWV0aG9kIGNhbGwgd2hpY2gga2lsbHMgdGhlIHBlcmZvcm1hbmNlLgorCisgICAgZGVmIG5leHQoc2VsZiwgaW5kZXg9MCk6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAjIFRoaXMgY2FsbCBtYXkgcmFpc2UgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHdoYXQsIHRkZWx0YSwgZmlsZW5vLCBsaW5lbm8gPSBzZWxmLl9uZXh0aXRlbSgpCisKKyAgICAgICAgICAgICMgaGFuZGxlIHRoZSBtb3N0IGNvbW1vbiBjYXNlcyBmaXJzdAorCisgICAgICAgICAgICBpZiB3aGF0ID09IFdIQVRfRU5URVI6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmNuYW1lID0gc2VsZi5fZGVjb2RlX2xvY2F0aW9uKGZpbGVubywgbGluZW5vKQorICAgICAgICAgICAgICAgIHQgPSAoZmlsZW5hbWUsIGxpbmVubywgZnVuY25hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5fYXBwZW5kKHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHdoYXQsIHQsIHRkZWx0YQorCisgICAgICAgICAgICBpZiB3aGF0ID09IFdIQVRfRVhJVDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aGF0LCBzZWxmLl9wb3AoKSwgdGRlbHRhCisgICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworICAgICAgICAgICAgaWYgd2hhdCA9PSBXSEFUX0xJTkVOTzoKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSwgZmlyc3RsaW5lbm8sIGZ1bmNuYW1lID0gc2VsZi5fc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgcmV0dXJuIHdoYXQsIChmaWxlbmFtZSwgbGluZW5vLCBmdW5jbmFtZSksIHRkZWx0YQorCisgICAgICAgICAgICBpZiB3aGF0ID09IFdIQVRfREVGSU5FX0ZJTEU6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgubm9ybXBhdGgodGRlbHRhKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlbWFwW2ZpbGVub10gPSBmaWxlbmFtZQorICAgICAgICAgICAgZWxpZiB3aGF0ID09IFdIQVRfREVGSU5FX0ZVTkM6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLl9maWxlbWFwW2ZpbGVub10KKyAgICAgICAgICAgICAgICBzZWxmLl9mdW5jbWFwWyhmaWxlbm8sIGxpbmVubyldID0gKGZpbGVuYW1lLCB0ZGVsdGEpCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gV0hBVF9BRERfSU5GTzoKKyAgICAgICAgICAgICAgICAjIHZhbHVlIGFscmVhZHkgbG9hZGVkIGludG8gc2VsZi5pbmZvOyBjYWxsIHRoZQorICAgICAgICAgICAgICAgICMgb3ZlcnJpZGFibGUgYWRkaW5mbygpIGhhbmRsZXIgc28gaGlnaGVyLWxldmVsIGNvZGUKKyAgICAgICAgICAgICAgICAjIGNhbiBwaWNrIHVwIHRoZSBuZXcgdmFsdWUKKyAgICAgICAgICAgICAgICBpZiB0ZGVsdGEgPT0gJ2N1cnJlbnQtZGlyZWN0b3J5JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jd2QgPSBsaW5lbm8KKyAgICAgICAgICAgICAgICBzZWxmLmFkZGluZm8odGRlbHRhLCBsaW5lbm8pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bmtub3duIGV2ZW50IHR5cGUiCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAjCisgICAgIyAgaGVscGVycworICAgICMKKworICAgIGRlZiBfZGVjb2RlX2xvY2F0aW9uKHNlbGYsIGZpbGVubywgbGluZW5vKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Z1bmNtYXBbKGZpbGVubywgbGluZW5vKV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBvbmx5IGJlIG5lZWRlZCB3aGVuIHRoZSBsb2cgZmlsZSBkb2VzIG5vdAorICAgICAgICAgICAgIyBjb250YWluIGFsbCB0aGUgREVGSU5FX0ZVTkMgcmVjb3JkcyBuZWVkZWQgdG8gYWxsb3cgdGhlCisgICAgICAgICAgICAjIGZ1bmN0aW9uIG5hbWUgdG8gYmUgcmV0cmlldmVkIGZyb20gdGhlIGxvZyBmaWxlLgorICAgICAgICAgICAgIworICAgICAgICAgICAgaWYgc2VsZi5fbG9hZGZpbGUoZmlsZW5vKToKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZ1bmNuYW1lID0gTm9uZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBmdW5jbmFtZSA9IHNlbGYuX2Z1bmNtYXBbKGZpbGVubywgbGluZW5vKV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYuX2ZpbGVtYXAuZ2V0KGZpbGVubykKKyAgICAgICAgICAgICAgICBmdW5jbmFtZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBzZWxmLl9mdW5jbWFwWyhmaWxlbm8sIGxpbmVubyldID0gKGZpbGVuYW1lLCBmdW5jbmFtZSkKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lLCBmdW5jbmFtZQorCisgICAgZGVmIF9sb2FkZmlsZShzZWxmLCBmaWxlbm8pOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYuX2ZpbGVtYXBbZmlsZW5vXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwcmludCAiQ291bGQgbm90IGlkZW50aWZ5IGZpbGVJZCIsIGZpbGVubworICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGFic25hbWUgPSBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguam9pbihzZWxmLmN3ZCwgZmlsZW5hbWUpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwID0gb3BlbihhYnNuYW1lKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzdCA9IHBhcnNlci5zdWl0ZShmcC5yZWFkKCkpCisgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICAjIFNjYW4gdGhlIHRyZWUgbG9va2luZyBmb3IgZGVmIGFuZCBsYW1iZGEgbm9kZXMsIGZpbGxpbmcgaW4KKyAgICAgICAgIyBzZWxmLl9mdW5jbWFwIHdpdGggYWxsIHRoZSBhdmFpbGFibGUgaW5mb3JtYXRpb24uCisgICAgICAgIGZ1bmNkZWYgPSBzeW1ib2wuZnVuY2RlZgorICAgICAgICBsYW1iZGVmID0gc3ltYm9sLmxhbWJkZWYKKworICAgICAgICBzdGFjayA9IFtzdC50b3R1cGxlKDEpXQorCisgICAgICAgIHdoaWxlIHN0YWNrOgorICAgICAgICAgICAgdHJlZSA9IHN0YWNrLnBvcCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3ltID0gdHJlZVswXQorICAgICAgICAgICAgZXhjZXB0IChJbmRleEVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBzeW0gPT0gZnVuY2RlZjoKKyAgICAgICAgICAgICAgICBzZWxmLl9mdW5jbWFwWyhmaWxlbm8sIHRyZWVbMl1bMl0pXSA9IGZpbGVuYW1lLCB0cmVlWzJdWzFdCisgICAgICAgICAgICBlbGlmIHN5bSA9PSBsYW1iZGVmOgorICAgICAgICAgICAgICAgIHNlbGYuX2Z1bmNtYXBbKGZpbGVubywgdHJlZVsxXVsyXSldID0gZmlsZW5hbWUsICI8bGFtYmRhPiIKKyAgICAgICAgICAgIHN0YWNrLmV4dGVuZChsaXN0KHRyZWVbMTpdKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaG90c2hvdC9sb2cucHljIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L2xvZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyNjRlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaG90c2hvdC9sb2cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaG90c2hvdC9sb2cucHlvIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L2xvZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyNjRlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaG90c2hvdC9sb2cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaG90c2hvdC9zdGF0cy5weSBiL2xpYi9weXRob24yLjcvaG90c2hvdC9zdGF0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmYyMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0YXRzLnB5CkBAIC0wLDAgKzEsOTMgQEAKKyIiIlN0YXRpc3RpY3MgYW5hbHl6ZXIgZm9yIEhvdFNob3QuIiIiCisKK2ltcG9ydCBwcm9maWxlCitpbXBvcnQgcHN0YXRzCisKK2ltcG9ydCBob3RzaG90LmxvZworCitmcm9tIGhvdHNob3QubG9nIGltcG9ydCBFTlRFUiwgRVhJVAorCisKK2RlZiBsb2FkKGZpbGVuYW1lKToKKyAgICByZXR1cm4gU3RhdHNMb2FkZXIoZmlsZW5hbWUpLmxvYWQoKQorCisKK2NsYXNzIFN0YXRzTG9hZGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2dmbik6CisgICAgICAgIHNlbGYuX2xvZ2ZuID0gbG9nZm4KKyAgICAgICAgc2VsZi5fY29kZSA9IHt9CisgICAgICAgIHNlbGYuX3N0YWNrID0gW10KKyAgICAgICAgc2VsZi5wb3BfZnJhbWUgPSBzZWxmLl9zdGFjay5wb3AKKworICAgIGRlZiBsb2FkKHNlbGYpOgorICAgICAgICAjIFRoZSB0aW1lciBzZWxlY3RlZCBieSB0aGUgcHJvZmlsZXIgc2hvdWxkIG5ldmVyIGJlIHVzZWQsIHNvIG1ha2UKKyAgICAgICAgIyBzdXJlIGl0IGRvZXNuJ3Qgd29yazoKKyAgICAgICAgcCA9IFByb2ZpbGUoKQorICAgICAgICBwLmdldF90aW1lID0gX2Jyb2tlbnRpbWVyCisgICAgICAgIGxvZyA9IGhvdHNob3QubG9nLkxvZ1JlYWRlcihzZWxmLl9sb2dmbikKKyAgICAgICAgdGFjY3VtID0gMAorICAgICAgICBmb3IgZXZlbnQgaW4gbG9nOgorICAgICAgICAgICAgd2hhdCwgKGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmNuYW1lKSwgdGRlbHRhID0gZXZlbnQKKyAgICAgICAgICAgIGlmIHRkZWx0YSA+IDA6CisgICAgICAgICAgICAgICAgdGFjY3VtICs9IHRkZWx0YQorCisgICAgICAgICAgICAjIFdlIG11bHRpcGx5IHRhY2N1bSB0byBjb252ZXJ0IGZyb20gdGhlIG1pY3Jvc2Vjb25kcyB3ZQorICAgICAgICAgICAgIyBoYXZlIHRvIHRoZSBzZWNvbmRzIHRoYXQgdGhlIHByb2ZpbGUvcHN0YXRzIG1vZHVsZSB3b3JrCisgICAgICAgICAgICAjIHdpdGg7IHRoaXMgYWxsb3dzIHRoZSBudW1iZXJzIHRvIGhhdmUgc29tZSBiYXNpcyBpbgorICAgICAgICAgICAgIyByZWFsaXR5IChpZ25vcmluZyBjYWxpYnJhdGlvbiBpc3N1ZXMgZm9yIG5vdykuCisKKyAgICAgICAgICAgIGlmIHdoYXQgPT0gRU5URVI6CisgICAgICAgICAgICAgICAgZnJhbWUgPSBzZWxmLm5ld19mcmFtZShmaWxlbmFtZSwgbGluZW5vLCBmdW5jbmFtZSkKKyAgICAgICAgICAgICAgICBwLnRyYWNlX2Rpc3BhdGNoX2NhbGwoZnJhbWUsIHRhY2N1bSAqIC4wMDAwMDEpCisgICAgICAgICAgICAgICAgdGFjY3VtID0gMAorCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gRVhJVDoKKyAgICAgICAgICAgICAgICBmcmFtZSA9IHNlbGYucG9wX2ZyYW1lKCkKKyAgICAgICAgICAgICAgICBwLnRyYWNlX2Rpc3BhdGNoX3JldHVybihmcmFtZSwgdGFjY3VtICogLjAwMDAwMSkKKyAgICAgICAgICAgICAgICB0YWNjdW0gPSAwCisKKyAgICAgICAgICAgICMgbm8gZnVydGhlciB3b3JrIGZvciBsaW5lIGV2ZW50cworCisgICAgICAgIGFzc2VydCBub3Qgc2VsZi5fc3RhY2sKKyAgICAgICAgcmV0dXJuIHBzdGF0cy5TdGF0cyhwKQorCisgICAgZGVmIG5ld19mcmFtZShzZWxmLCAqYXJncyk6CisgICAgICAgICMgYXJncyBtdXN0IGJlIGZpbGVuYW1lLCBmaXJzdGxpbmVubywgZnVuY25hbWUKKyAgICAgICAgIyBvdXIgY29kZSBvYmplY3RzIGFyZSBjYWNoZWQgc2luY2Ugd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUKKyAgICAgICAgIyBuZXcgb25lcyBldmVyeSB0aW1lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvZGUgPSBzZWxmLl9jb2RlW2FyZ3NdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGNvZGUgPSBGYWtlQ29kZSgqYXJncykKKyAgICAgICAgICAgIHNlbGYuX2NvZGVbYXJnc10gPSBjb2RlCisgICAgICAgICMgZnJhbWUgb2JqZWN0cyBhcmUgY3JlYXRlIGZyZXNoLCBzaW5jZSB0aGUgYmFjayBwb2ludGVyIHdpbGwKKyAgICAgICAgIyB2YXJ5IGNvbnNpZGVyYWJseQorICAgICAgICBpZiBzZWxmLl9zdGFjazoKKyAgICAgICAgICAgIGJhY2sgPSBzZWxmLl9zdGFja1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhY2sgPSBOb25lCisgICAgICAgIGZyYW1lID0gRmFrZUZyYW1lKGNvZGUsIGJhY2spCisgICAgICAgIHNlbGYuX3N0YWNrLmFwcGVuZChmcmFtZSkKKyAgICAgICAgcmV0dXJuIGZyYW1lCisKKworY2xhc3MgUHJvZmlsZShwcm9maWxlLlByb2ZpbGUpOgorICAgIGRlZiBzaW11bGF0ZV9jbWRfY29tcGxldGUoc2VsZik6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBGYWtlQ29kZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGZpcnN0bGluZW5vLCBmdW5jbmFtZSk6CisgICAgICAgIHNlbGYuY29fZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmNvX2ZpcnN0bGluZW5vID0gZmlyc3RsaW5lbm8KKyAgICAgICAgc2VsZi5jb19uYW1lID0gc2VsZi5fX25hbWVfXyA9IGZ1bmNuYW1lCisKKworY2xhc3MgRmFrZUZyYW1lOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2RlLCBiYWNrKToKKyAgICAgICAgc2VsZi5mX2JhY2sgPSBiYWNrCisgICAgICAgIHNlbGYuZl9jb2RlID0gY29kZQorCisKK2RlZiBfYnJva2VudGltZXIoKToKKyAgICByYWlzZSBSdW50aW1lRXJyb3IsICJ0aGlzIHRpbWVyIHNob3VsZCBub3QgYmUgY2FsbGVkIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0YXRzLnB5YyBiL2xpYi9weXRob24yLjcvaG90c2hvdC9zdGF0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1ZTRlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaG90c2hvdC9zdGF0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0YXRzLnB5byBiL2xpYi9weXRob24yLjcvaG90c2hvdC9zdGF0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEyYjAwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaG90c2hvdC9zdGF0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0b25lcy5weSBiL2xpYi9weXRob24yLjcvaG90c2hvdC9zdG9uZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4OGQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaG90c2hvdC9zdG9uZXMucHkKQEAgLTAsMCArMSwzMCBAQAoraW1wb3J0IGVycm5vCitpbXBvcnQgaG90c2hvdAoraW1wb3J0IGhvdHNob3Quc3RhdHMKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZXN0LnB5c3RvbmUKKworZGVmIG1haW4obG9nZmlsZSk6CisgICAgcCA9IGhvdHNob3QuUHJvZmlsZShsb2dmaWxlKQorICAgIGJlbmNodGltZSwgc3RvbmVzID0gcC5ydW5jYWxsKHRlc3QucHlzdG9uZS5weXN0b25lcykKKyAgICBwLmNsb3NlKCkKKworICAgIHByaW50ICJQeXN0b25lKCVzKSB0aW1lIGZvciAlZCBwYXNzZXMgPSAlZyIgJSBcCisgICAgICAgICAgKHRlc3QucHlzdG9uZS5fX3ZlcnNpb25fXywgdGVzdC5weXN0b25lLkxPT1BTLCBiZW5jaHRpbWUpCisgICAgcHJpbnQgIlRoaXMgbWFjaGluZSBiZW5jaG1hcmtzIGF0ICVnIHB5c3RvbmVzL3NlY29uZCIgJSBzdG9uZXMKKworICAgIHN0YXRzID0gaG90c2hvdC5zdGF0cy5sb2FkKGxvZ2ZpbGUpCisgICAgc3RhdHMuc3RyaXBfZGlycygpCisgICAgc3RhdHMuc29ydF9zdGF0cygndGltZScsICdjYWxscycpCisgICAgdHJ5OgorICAgICAgICBzdGF0cy5wcmludF9zdGF0cygyMCkKKyAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FUElQRToKKyAgICAgICAgICAgIHJhaXNlCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaWYgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBtYWluKHN5cy5hcmd2WzFdKQorICAgIGVsc2U6CisgICAgICAgIGltcG9ydCB0ZW1wZmlsZQorICAgICAgICBtYWluKHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpLm5hbWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hvdHNob3Qvc3RvbmVzLnB5YyBiL2xpYi9weXRob24yLjcvaG90c2hvdC9zdG9uZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZGVlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2hvdHNob3Qvc3RvbmVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hvdHNob3Qvc3RvbmVzLnB5byBiL2xpYi9weXRob24yLjcvaG90c2hvdC9zdG9uZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZGVlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2hvdHNob3Qvc3RvbmVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2h0bWxlbnRpdHlkZWZzLnB5IGIvbGliL3B5dGhvbjIuNy9odG1sZW50aXR5ZGVmcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQxNGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9odG1sZW50aXR5ZGVmcy5weQpAQCAtMCwwICsxLDI3MyBAQAorIiIiSFRNTCBjaGFyYWN0ZXIgZW50aXR5IHJlZmVyZW5jZXMuIiIiCisKKyMgbWFwcyB0aGUgSFRNTCBlbnRpdHkgbmFtZSB0byB0aGUgVW5pY29kZSBjb2RlcG9pbnQKK25hbWUyY29kZXBvaW50ID0geworICAgICdBRWxpZyc6ICAgIDB4MDBjNiwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBBRSA9IGxhdGluIGNhcGl0YWwgbGlnYXR1cmUgQUUsIFUrMDBDNiBJU09sYXQxCisgICAgJ0FhY3V0ZSc6ICAgMHgwMGMxLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBhY3V0ZSwgVSswMEMxIElTT2xhdDEKKyAgICAnQWNpcmMnOiAgICAweDAwYzIsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBDMiBJU09sYXQxCisgICAgJ0FncmF2ZSc6ICAgMHgwMGMwLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCBncmF2ZSA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgZ3JhdmUsIFUrMDBDMCBJU09sYXQxCisgICAgJ0FscGhhJzogICAgMHgwMzkxLCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGFscGhhLCBVKzAzOTEKKyAgICAnQXJpbmcnOiAgICAweDAwYzUsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHJpbmcgYWJvdmUgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHJpbmcsIFUrMDBDNSBJU09sYXQxCisgICAgJ0F0aWxkZSc6ICAgMHgwMGMzLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgd2l0aCB0aWxkZSwgVSswMEMzIElTT2xhdDEKKyAgICAnQXVtbCc6ICAgICAweDAwYzQsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGRpYWVyZXNpcywgVSswMEM0IElTT2xhdDEKKyAgICAnQmV0YSc6ICAgICAweDAzOTIsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYmV0YSwgVSswMzkyCisgICAgJ0NjZWRpbCc6ICAgMHgwMGM3LCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEMgd2l0aCBjZWRpbGxhLCBVKzAwQzcgSVNPbGF0MQorICAgICdDaGknOiAgICAgIDB4MDNhNywgIyBncmVlayBjYXBpdGFsIGxldHRlciBjaGksIFUrMDNBNworICAgICdEYWdnZXInOiAgIDB4MjAyMSwgIyBkb3VibGUgZGFnZ2VyLCBVKzIwMjEgSVNPcHViCisgICAgJ0RlbHRhJzogICAgMHgwMzk0LCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGRlbHRhLCBVKzAzOTQgSVNPZ3JrMworICAgICdFVEgnOiAgICAgIDB4MDBkMCwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBFVEgsIFUrMDBEMCBJU09sYXQxCisgICAgJ0VhY3V0ZSc6ICAgMHgwMGM5LCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBhY3V0ZSwgVSswMEM5IElTT2xhdDEKKyAgICAnRWNpcmMnOiAgICAweDAwY2EsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBDQSBJU09sYXQxCisgICAgJ0VncmF2ZSc6ICAgMHgwMGM4LCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBncmF2ZSwgVSswMEM4IElTT2xhdDEKKyAgICAnRXBzaWxvbic6ICAweDAzOTUsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXBzaWxvbiwgVSswMzk1CisgICAgJ0V0YSc6ICAgICAgMHgwMzk3LCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGV0YSwgVSswMzk3CisgICAgJ0V1bWwnOiAgICAgMHgwMGNiLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEUgd2l0aCBkaWFlcmVzaXMsIFUrMDBDQiBJU09sYXQxCisgICAgJ0dhbW1hJzogICAgMHgwMzkzLCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGdhbW1hLCBVKzAzOTMgSVNPZ3JrMworICAgICdJYWN1dGUnOiAgIDB4MDBjZCwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggYWN1dGUsIFUrMDBDRCBJU09sYXQxCisgICAgJ0ljaXJjJzogICAgMHgwMGNlLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBjaXJjdW1mbGV4LCBVKzAwQ0UgSVNPbGF0MQorICAgICdJZ3JhdmUnOiAgIDB4MDBjYywgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZ3JhdmUsIFUrMDBDQyBJU09sYXQxCisgICAgJ0lvdGEnOiAgICAgMHgwMzk5LCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGlvdGEsIFUrMDM5OQorICAgICdJdW1sJzogICAgIDB4MDBjZiwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBJIHdpdGggZGlhZXJlc2lzLCBVKzAwQ0YgSVNPbGF0MQorICAgICdLYXBwYSc6ICAgIDB4MDM5YSwgIyBncmVlayBjYXBpdGFsIGxldHRlciBrYXBwYSwgVSswMzlBCisgICAgJ0xhbWJkYSc6ICAgMHgwMzliLCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGxhbWJkYSwgVSswMzlCIElTT2dyazMKKyAgICAnTXUnOiAgICAgICAweDAzOWMsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbXUsIFUrMDM5QworICAgICdOdGlsZGUnOiAgIDB4MDBkMSwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBOIHdpdGggdGlsZGUsIFUrMDBEMSBJU09sYXQxCisgICAgJ051JzogICAgICAgMHgwMzlkLCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG51LCBVKzAzOUQKKyAgICAnT0VsaWcnOiAgICAweDAxNTIsICMgbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBPRSwgVSswMTUyIElTT2xhdDIKKyAgICAnT2FjdXRlJzogICAweDAwZDMsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGFjdXRlLCBVKzAwRDMgSVNPbGF0MQorICAgICdPY2lyYyc6ICAgIDB4MDBkNCwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggY2lyY3VtZmxleCwgVSswMEQ0IElTT2xhdDEKKyAgICAnT2dyYXZlJzogICAweDAwZDIsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGdyYXZlLCBVKzAwRDIgSVNPbGF0MQorICAgICdPbWVnYSc6ICAgIDB4MDNhOSwgIyBncmVlayBjYXBpdGFsIGxldHRlciBvbWVnYSwgVSswM0E5IElTT2dyazMKKyAgICAnT21pY3Jvbic6ICAweDAzOWYsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgb21pY3JvbiwgVSswMzlGCisgICAgJ09zbGFzaCc6ICAgMHgwMGQ4LCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBzdHJva2UgPSBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHNsYXNoLCBVKzAwRDggSVNPbGF0MQorICAgICdPdGlsZGUnOiAgIDB4MDBkNSwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggdGlsZGUsIFUrMDBENSBJU09sYXQxCisgICAgJ091bWwnOiAgICAgMHgwMGQ2LCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBkaWFlcmVzaXMsIFUrMDBENiBJU09sYXQxCisgICAgJ1BoaSc6ICAgICAgMHgwM2E2LCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBoaSwgVSswM0E2IElTT2dyazMKKyAgICAnUGknOiAgICAgICAweDAzYTAsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGksIFUrMDNBMCBJU09ncmszCisgICAgJ1ByaW1lJzogICAgMHgyMDMzLCAjIGRvdWJsZSBwcmltZSA9IHNlY29uZHMgPSBpbmNoZXMsIFUrMjAzMyBJU090ZWNoCisgICAgJ1BzaSc6ICAgICAgMHgwM2E4LCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHBzaSwgVSswM0E4IElTT2dyazMKKyAgICAnUmhvJzogICAgICAweDAzYTEsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcmhvLCBVKzAzQTEKKyAgICAnU2Nhcm9uJzogICAweDAxNjAsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgUyB3aXRoIGNhcm9uLCBVKzAxNjAgSVNPbGF0MgorICAgICdTaWdtYSc6ICAgIDB4MDNhMywgIyBncmVlayBjYXBpdGFsIGxldHRlciBzaWdtYSwgVSswM0EzIElTT2dyazMKKyAgICAnVEhPUk4nOiAgICAweDAwZGUsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVEhPUk4sIFUrMDBERSBJU09sYXQxCisgICAgJ1RhdSc6ICAgICAgMHgwM2E0LCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRhdSwgVSswM0E0CisgICAgJ1RoZXRhJzogICAgMHgwMzk4LCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHRoZXRhLCBVKzAzOTggSVNPZ3JrMworICAgICdVYWN1dGUnOiAgIDB4MDBkYSwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggYWN1dGUsIFUrMDBEQSBJU09sYXQxCisgICAgJ1VjaXJjJzogICAgMHgwMGRiLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBjaXJjdW1mbGV4LCBVKzAwREIgSVNPbGF0MQorICAgICdVZ3JhdmUnOiAgIDB4MDBkOSwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBVIHdpdGggZ3JhdmUsIFUrMDBEOSBJU09sYXQxCisgICAgJ1Vwc2lsb24nOiAgMHgwM2E1LCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHVwc2lsb24sIFUrMDNBNSBJU09ncmszCisgICAgJ1V1bWwnOiAgICAgMHgwMGRjLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBkaWFlcmVzaXMsIFUrMDBEQyBJU09sYXQxCisgICAgJ1hpJzogICAgICAgMHgwMzllLCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHhpLCBVKzAzOUUgSVNPZ3JrMworICAgICdZYWN1dGUnOiAgIDB4MDBkZCwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBZIHdpdGggYWN1dGUsIFUrMDBERCBJU09sYXQxCisgICAgJ1l1bWwnOiAgICAgMHgwMTc4LCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBkaWFlcmVzaXMsIFUrMDE3OCBJU09sYXQyCisgICAgJ1pldGEnOiAgICAgMHgwMzk2LCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHpldGEsIFUrMDM5NgorICAgICdhYWN1dGUnOiAgIDB4MDBlMSwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGFjdXRlLCBVKzAwRTEgSVNPbGF0MQorICAgICdhY2lyYyc6ICAgIDB4MDBlMiwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBFMiBJU09sYXQxCisgICAgJ2FjdXRlJzogICAgMHgwMGI0LCAjIGFjdXRlIGFjY2VudCA9IHNwYWNpbmcgYWN1dGUsIFUrMDBCNCBJU09kaWEKKyAgICAnYWVsaWcnOiAgICAweDAwZTYsICMgbGF0aW4gc21hbGwgbGV0dGVyIGFlID0gbGF0aW4gc21hbGwgbGlnYXR1cmUgYWUsIFUrMDBFNiBJU09sYXQxCisgICAgJ2FncmF2ZSc6ICAgMHgwMGUwLCAjIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggZ3JhdmUgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSBncmF2ZSwgVSswMEUwIElTT2xhdDEKKyAgICAnYWxlZnN5bSc6ICAweDIxMzUsICMgYWxlZiBzeW1ib2wgPSBmaXJzdCB0cmFuc2Zpbml0ZSBjYXJkaW5hbCwgVSsyMTM1IE5FVworICAgICdhbHBoYSc6ICAgIDB4MDNiMSwgIyBncmVlayBzbWFsbCBsZXR0ZXIgYWxwaGEsIFUrMDNCMSBJU09ncmszCisgICAgJ2FtcCc6ICAgICAgMHgwMDI2LCAjIGFtcGVyc2FuZCwgVSswMDI2IElTT251bQorICAgICdhbmQnOiAgICAgIDB4MjIyNywgIyBsb2dpY2FsIGFuZCA9IHdlZGdlLCBVKzIyMjcgSVNPdGVjaAorICAgICdhbmcnOiAgICAgIDB4MjIyMCwgIyBhbmdsZSwgVSsyMjIwIElTT2Ftc28KKyAgICAnYXJpbmcnOiAgICAweDAwZTUsICMgbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCByaW5nIGFib3ZlID0gbGF0aW4gc21hbGwgbGV0dGVyIGEgcmluZywgVSswMEU1IElTT2xhdDEKKyAgICAnYXN5bXAnOiAgICAweDIyNDgsICMgYWxtb3N0IGVxdWFsIHRvID0gYXN5bXB0b3RpYyB0bywgVSsyMjQ4IElTT2Ftc3IKKyAgICAnYXRpbGRlJzogICAweDAwZTMsICMgbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCB0aWxkZSwgVSswMEUzIElTT2xhdDEKKyAgICAnYXVtbCc6ICAgICAweDAwZTQsICMgbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBkaWFlcmVzaXMsIFUrMDBFNCBJU09sYXQxCisgICAgJ2JkcXVvJzogICAgMHgyMDFlLCAjIGRvdWJsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFFIE5FVworICAgICdiZXRhJzogICAgIDB4MDNiMiwgIyBncmVlayBzbWFsbCBsZXR0ZXIgYmV0YSwgVSswM0IyIElTT2dyazMKKyAgICAnYnJ2YmFyJzogICAweDAwYTYsICMgYnJva2VuIGJhciA9IGJyb2tlbiB2ZXJ0aWNhbCBiYXIsIFUrMDBBNiBJU09udW0KKyAgICAnYnVsbCc6ICAgICAweDIwMjIsICMgYnVsbGV0ID0gYmxhY2sgc21hbGwgY2lyY2xlLCBVKzIwMjIgSVNPcHViCisgICAgJ2NhcCc6ICAgICAgMHgyMjI5LCAjIGludGVyc2VjdGlvbiA9IGNhcCwgVSsyMjI5IElTT3RlY2gKKyAgICAnY2NlZGlsJzogICAweDAwZTcsICMgbGF0aW4gc21hbGwgbGV0dGVyIGMgd2l0aCBjZWRpbGxhLCBVKzAwRTcgSVNPbGF0MQorICAgICdjZWRpbCc6ICAgIDB4MDBiOCwgIyBjZWRpbGxhID0gc3BhY2luZyBjZWRpbGxhLCBVKzAwQjggSVNPZGlhCisgICAgJ2NlbnQnOiAgICAgMHgwMGEyLCAjIGNlbnQgc2lnbiwgVSswMEEyIElTT251bQorICAgICdjaGknOiAgICAgIDB4MDNjNywgIyBncmVlayBzbWFsbCBsZXR0ZXIgY2hpLCBVKzAzQzcgSVNPZ3JrMworICAgICdjaXJjJzogICAgIDB4MDJjNiwgIyBtb2RpZmllciBsZXR0ZXIgY2lyY3VtZmxleCBhY2NlbnQsIFUrMDJDNiBJU09wdWIKKyAgICAnY2x1YnMnOiAgICAweDI2NjMsICMgYmxhY2sgY2x1YiBzdWl0ID0gc2hhbXJvY2ssIFUrMjY2MyBJU09wdWIKKyAgICAnY29uZyc6ICAgICAweDIyNDUsICMgYXBwcm94aW1hdGVseSBlcXVhbCB0bywgVSsyMjQ1IElTT3RlY2gKKyAgICAnY29weSc6ICAgICAweDAwYTksICMgY29weXJpZ2h0IHNpZ24sIFUrMDBBOSBJU09udW0KKyAgICAnY3JhcnInOiAgICAweDIxYjUsICMgZG93bndhcmRzIGFycm93IHdpdGggY29ybmVyIGxlZnR3YXJkcyA9IGNhcnJpYWdlIHJldHVybiwgVSsyMUI1IE5FVworICAgICdjdXAnOiAgICAgIDB4MjIyYSwgIyB1bmlvbiA9IGN1cCwgVSsyMjJBIElTT3RlY2gKKyAgICAnY3VycmVuJzogICAweDAwYTQsICMgY3VycmVuY3kgc2lnbiwgVSswMEE0IElTT251bQorICAgICdkQXJyJzogICAgIDB4MjFkMywgIyBkb3dud2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDMgSVNPYW1zYQorICAgICdkYWdnZXInOiAgIDB4MjAyMCwgIyBkYWdnZXIsIFUrMjAyMCBJU09wdWIKKyAgICAnZGFycic6ICAgICAweDIxOTMsICMgZG93bndhcmRzIGFycm93LCBVKzIxOTMgSVNPbnVtCisgICAgJ2RlZyc6ICAgICAgMHgwMGIwLCAjIGRlZ3JlZSBzaWduLCBVKzAwQjAgSVNPbnVtCisgICAgJ2RlbHRhJzogICAgMHgwM2I0LCAjIGdyZWVrIHNtYWxsIGxldHRlciBkZWx0YSwgVSswM0I0IElTT2dyazMKKyAgICAnZGlhbXMnOiAgICAweDI2NjYsICMgYmxhY2sgZGlhbW9uZCBzdWl0LCBVKzI2NjYgSVNPcHViCisgICAgJ2RpdmlkZSc6ICAgMHgwMGY3LCAjIGRpdmlzaW9uIHNpZ24sIFUrMDBGNyBJU09udW0KKyAgICAnZWFjdXRlJzogICAweDAwZTksICMgbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBhY3V0ZSwgVSswMEU5IElTT2xhdDEKKyAgICAnZWNpcmMnOiAgICAweDAwZWEsICMgbGF0aW4gc21hbGwgbGV0dGVyIGUgd2l0aCBjaXJjdW1mbGV4LCBVKzAwRUEgSVNPbGF0MQorICAgICdlZ3JhdmUnOiAgIDB4MDBlOCwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGdyYXZlLCBVKzAwRTggSVNPbGF0MQorICAgICdlbXB0eSc6ICAgIDB4MjIwNSwgIyBlbXB0eSBzZXQgPSBudWxsIHNldCA9IGRpYW1ldGVyLCBVKzIyMDUgSVNPYW1zbworICAgICdlbXNwJzogICAgIDB4MjAwMywgIyBlbSBzcGFjZSwgVSsyMDAzIElTT3B1YgorICAgICdlbnNwJzogICAgIDB4MjAwMiwgIyBlbiBzcGFjZSwgVSsyMDAyIElTT3B1YgorICAgICdlcHNpbG9uJzogIDB4MDNiNSwgIyBncmVlayBzbWFsbCBsZXR0ZXIgZXBzaWxvbiwgVSswM0I1IElTT2dyazMKKyAgICAnZXF1aXYnOiAgICAweDIyNjEsICMgaWRlbnRpY2FsIHRvLCBVKzIyNjEgSVNPdGVjaAorICAgICdldGEnOiAgICAgIDB4MDNiNywgIyBncmVlayBzbWFsbCBsZXR0ZXIgZXRhLCBVKzAzQjcgSVNPZ3JrMworICAgICdldGgnOiAgICAgIDB4MDBmMCwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgZXRoLCBVKzAwRjAgSVNPbGF0MQorICAgICdldW1sJzogICAgIDB4MDBlYiwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGRpYWVyZXNpcywgVSswMEVCIElTT2xhdDEKKyAgICAnZXVybyc6ICAgICAweDIwYWMsICMgZXVybyBzaWduLCBVKzIwQUMgTkVXCisgICAgJ2V4aXN0JzogICAgMHgyMjAzLCAjIHRoZXJlIGV4aXN0cywgVSsyMjAzIElTT3RlY2gKKyAgICAnZm5vZic6ICAgICAweDAxOTIsICMgbGF0aW4gc21hbGwgZiB3aXRoIGhvb2sgPSBmdW5jdGlvbiA9IGZsb3JpbiwgVSswMTkyIElTT3RlY2gKKyAgICAnZm9yYWxsJzogICAweDIyMDAsICMgZm9yIGFsbCwgVSsyMjAwIElTT3RlY2gKKyAgICAnZnJhYzEyJzogICAweDAwYmQsICMgdnVsZ2FyIGZyYWN0aW9uIG9uZSBoYWxmID0gZnJhY3Rpb24gb25lIGhhbGYsIFUrMDBCRCBJU09udW0KKyAgICAnZnJhYzE0JzogICAweDAwYmMsICMgdnVsZ2FyIGZyYWN0aW9uIG9uZSBxdWFydGVyID0gZnJhY3Rpb24gb25lIHF1YXJ0ZXIsIFUrMDBCQyBJU09udW0KKyAgICAnZnJhYzM0JzogICAweDAwYmUsICMgdnVsZ2FyIGZyYWN0aW9uIHRocmVlIHF1YXJ0ZXJzID0gZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMsIFUrMDBCRSBJU09udW0KKyAgICAnZnJhc2wnOiAgICAweDIwNDQsICMgZnJhY3Rpb24gc2xhc2gsIFUrMjA0NCBORVcKKyAgICAnZ2FtbWEnOiAgICAweDAzYjMsICMgZ3JlZWsgc21hbGwgbGV0dGVyIGdhbW1hLCBVKzAzQjMgSVNPZ3JrMworICAgICdnZSc6ICAgICAgIDB4MjI2NSwgIyBncmVhdGVyLXRoYW4gb3IgZXF1YWwgdG8sIFUrMjI2NSBJU090ZWNoCisgICAgJ2d0JzogICAgICAgMHgwMDNlLCAjIGdyZWF0ZXItdGhhbiBzaWduLCBVKzAwM0UgSVNPbnVtCisgICAgJ2hBcnInOiAgICAgMHgyMWQ0LCAjIGxlZnQgcmlnaHQgZG91YmxlIGFycm93LCBVKzIxRDQgSVNPYW1zYQorICAgICdoYXJyJzogICAgIDB4MjE5NCwgIyBsZWZ0IHJpZ2h0IGFycm93LCBVKzIxOTQgSVNPYW1zYQorICAgICdoZWFydHMnOiAgIDB4MjY2NSwgIyBibGFjayBoZWFydCBzdWl0ID0gdmFsZW50aW5lLCBVKzI2NjUgSVNPcHViCisgICAgJ2hlbGxpcCc6ICAgMHgyMDI2LCAjIGhvcml6b250YWwgZWxsaXBzaXMgPSB0aHJlZSBkb3QgbGVhZGVyLCBVKzIwMjYgSVNPcHViCisgICAgJ2lhY3V0ZSc6ICAgMHgwMGVkLCAjIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggYWN1dGUsIFUrMDBFRCBJU09sYXQxCisgICAgJ2ljaXJjJzogICAgMHgwMGVlLCAjIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggY2lyY3VtZmxleCwgVSswMEVFIElTT2xhdDEKKyAgICAnaWV4Y2wnOiAgICAweDAwYTEsICMgaW52ZXJ0ZWQgZXhjbGFtYXRpb24gbWFyaywgVSswMEExIElTT251bQorICAgICdpZ3JhdmUnOiAgIDB4MDBlYywgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgaSB3aXRoIGdyYXZlLCBVKzAwRUMgSVNPbGF0MQorICAgICdpbWFnZSc6ICAgIDB4MjExMSwgIyBibGFja2xldHRlciBjYXBpdGFsIEkgPSBpbWFnaW5hcnkgcGFydCwgVSsyMTExIElTT2Ftc28KKyAgICAnaW5maW4nOiAgICAweDIyMWUsICMgaW5maW5pdHksIFUrMjIxRSBJU090ZWNoCisgICAgJ2ludCc6ICAgICAgMHgyMjJiLCAjIGludGVncmFsLCBVKzIyMkIgSVNPdGVjaAorICAgICdpb3RhJzogICAgIDB4MDNiOSwgIyBncmVlayBzbWFsbCBsZXR0ZXIgaW90YSwgVSswM0I5IElTT2dyazMKKyAgICAnaXF1ZXN0JzogICAweDAwYmYsICMgaW52ZXJ0ZWQgcXVlc3Rpb24gbWFyayA9IHR1cm5lZCBxdWVzdGlvbiBtYXJrLCBVKzAwQkYgSVNPbnVtCisgICAgJ2lzaW4nOiAgICAgMHgyMjA4LCAjIGVsZW1lbnQgb2YsIFUrMjIwOCBJU090ZWNoCisgICAgJ2l1bWwnOiAgICAgMHgwMGVmLCAjIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZGlhZXJlc2lzLCBVKzAwRUYgSVNPbGF0MQorICAgICdrYXBwYSc6ICAgIDB4MDNiYSwgIyBncmVlayBzbWFsbCBsZXR0ZXIga2FwcGEsIFUrMDNCQSBJU09ncmszCisgICAgJ2xBcnInOiAgICAgMHgyMWQwLCAjIGxlZnR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMCBJU090ZWNoCisgICAgJ2xhbWJkYSc6ICAgMHgwM2JiLCAjIGdyZWVrIHNtYWxsIGxldHRlciBsYW1iZGEsIFUrMDNCQiBJU09ncmszCisgICAgJ2xhbmcnOiAgICAgMHgyMzI5LCAjIGxlZnQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGJyYSwgVSsyMzI5IElTT3RlY2gKKyAgICAnbGFxdW8nOiAgICAweDAwYWIsICMgbGVmdC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsgPSBsZWZ0IHBvaW50aW5nIGd1aWxsZW1ldCwgVSswMEFCIElTT251bQorICAgICdsYXJyJzogICAgIDB4MjE5MCwgIyBsZWZ0d2FyZHMgYXJyb3csIFUrMjE5MCBJU09udW0KKyAgICAnbGNlaWwnOiAgICAweDIzMDgsICMgbGVmdCBjZWlsaW5nID0gYXBsIHVwc3RpbGUsIFUrMjMwOCBJU09hbXNjCisgICAgJ2xkcXVvJzogICAgMHgyMDFjLCAjIGxlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMUMgSVNPbnVtCisgICAgJ2xlJzogICAgICAgMHgyMjY0LCAjIGxlc3MtdGhhbiBvciBlcXVhbCB0bywgVSsyMjY0IElTT3RlY2gKKyAgICAnbGZsb29yJzogICAweDIzMGEsICMgbGVmdCBmbG9vciA9IGFwbCBkb3duc3RpbGUsIFUrMjMwQSBJU09hbXNjCisgICAgJ2xvd2FzdCc6ICAgMHgyMjE3LCAjIGFzdGVyaXNrIG9wZXJhdG9yLCBVKzIyMTcgSVNPdGVjaAorICAgICdsb3onOiAgICAgIDB4MjVjYSwgIyBsb3plbmdlLCBVKzI1Q0EgSVNPcHViCisgICAgJ2xybSc6ICAgICAgMHgyMDBlLCAjIGxlZnQtdG8tcmlnaHQgbWFyaywgVSsyMDBFIE5FVyBSRkMgMjA3MAorICAgICdsc2FxdW8nOiAgIDB4MjAzOSwgIyBzaW5nbGUgbGVmdC1wb2ludGluZyBhbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDM5IElTTyBwcm9wb3NlZAorICAgICdsc3F1byc6ICAgIDB4MjAxOCwgIyBsZWZ0IHNpbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDE4IElTT251bQorICAgICdsdCc6ICAgICAgIDB4MDAzYywgIyBsZXNzLXRoYW4gc2lnbiwgVSswMDNDIElTT251bQorICAgICdtYWNyJzogICAgIDB4MDBhZiwgIyBtYWNyb24gPSBzcGFjaW5nIG1hY3JvbiA9IG92ZXJsaW5lID0gQVBMIG92ZXJiYXIsIFUrMDBBRiBJU09kaWEKKyAgICAnbWRhc2gnOiAgICAweDIwMTQsICMgZW0gZGFzaCwgVSsyMDE0IElTT3B1YgorICAgICdtaWNybyc6ICAgIDB4MDBiNSwgIyBtaWNybyBzaWduLCBVKzAwQjUgSVNPbnVtCisgICAgJ21pZGRvdCc6ICAgMHgwMGI3LCAjIG1pZGRsZSBkb3QgPSBHZW9yZ2lhbiBjb21tYSA9IEdyZWVrIG1pZGRsZSBkb3QsIFUrMDBCNyBJU09udW0KKyAgICAnbWludXMnOiAgICAweDIyMTIsICMgbWludXMgc2lnbiwgVSsyMjEyIElTT3RlY2gKKyAgICAnbXUnOiAgICAgICAweDAzYmMsICMgZ3JlZWsgc21hbGwgbGV0dGVyIG11LCBVKzAzQkMgSVNPZ3JrMworICAgICduYWJsYSc6ICAgIDB4MjIwNywgIyBuYWJsYSA9IGJhY2t3YXJkIGRpZmZlcmVuY2UsIFUrMjIwNyBJU090ZWNoCisgICAgJ25ic3AnOiAgICAgMHgwMGEwLCAjIG5vLWJyZWFrIHNwYWNlID0gbm9uLWJyZWFraW5nIHNwYWNlLCBVKzAwQTAgSVNPbnVtCisgICAgJ25kYXNoJzogICAgMHgyMDEzLCAjIGVuIGRhc2gsIFUrMjAxMyBJU09wdWIKKyAgICAnbmUnOiAgICAgICAweDIyNjAsICMgbm90IGVxdWFsIHRvLCBVKzIyNjAgSVNPdGVjaAorICAgICduaSc6ICAgICAgIDB4MjIwYiwgIyBjb250YWlucyBhcyBtZW1iZXIsIFUrMjIwQiBJU090ZWNoCisgICAgJ25vdCc6ICAgICAgMHgwMGFjLCAjIG5vdCBzaWduLCBVKzAwQUMgSVNPbnVtCisgICAgJ25vdGluJzogICAgMHgyMjA5LCAjIG5vdCBhbiBlbGVtZW50IG9mLCBVKzIyMDkgSVNPdGVjaAorICAgICduc3ViJzogICAgIDB4MjI4NCwgIyBub3QgYSBzdWJzZXQgb2YsIFUrMjI4NCBJU09hbXNuCisgICAgJ250aWxkZSc6ICAgMHgwMGYxLCAjIGxhdGluIHNtYWxsIGxldHRlciBuIHdpdGggdGlsZGUsIFUrMDBGMSBJU09sYXQxCisgICAgJ251JzogICAgICAgMHgwM2JkLCAjIGdyZWVrIHNtYWxsIGxldHRlciBudSwgVSswM0JEIElTT2dyazMKKyAgICAnb2FjdXRlJzogICAweDAwZjMsICMgbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBhY3V0ZSwgVSswMEYzIElTT2xhdDEKKyAgICAnb2NpcmMnOiAgICAweDAwZjQsICMgbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBjaXJjdW1mbGV4LCBVKzAwRjQgSVNPbGF0MQorICAgICdvZWxpZyc6ICAgIDB4MDE1MywgIyBsYXRpbiBzbWFsbCBsaWdhdHVyZSBvZSwgVSswMTUzIElTT2xhdDIKKyAgICAnb2dyYXZlJzogICAweDAwZjIsICMgbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCBncmF2ZSwgVSswMEYyIElTT2xhdDEKKyAgICAnb2xpbmUnOiAgICAweDIwM2UsICMgb3ZlcmxpbmUgPSBzcGFjaW5nIG92ZXJzY29yZSwgVSsyMDNFIE5FVworICAgICdvbWVnYSc6ICAgIDB4MDNjOSwgIyBncmVlayBzbWFsbCBsZXR0ZXIgb21lZ2EsIFUrMDNDOSBJU09ncmszCisgICAgJ29taWNyb24nOiAgMHgwM2JmLCAjIGdyZWVrIHNtYWxsIGxldHRlciBvbWljcm9uLCBVKzAzQkYgTkVXCisgICAgJ29wbHVzJzogICAgMHgyMjk1LCAjIGNpcmNsZWQgcGx1cyA9IGRpcmVjdCBzdW0sIFUrMjI5NSBJU09hbXNiCisgICAgJ29yJzogICAgICAgMHgyMjI4LCAjIGxvZ2ljYWwgb3IgPSB2ZWUsIFUrMjIyOCBJU090ZWNoCisgICAgJ29yZGYnOiAgICAgMHgwMGFhLCAjIGZlbWluaW5lIG9yZGluYWwgaW5kaWNhdG9yLCBVKzAwQUEgSVNPbnVtCisgICAgJ29yZG0nOiAgICAgMHgwMGJhLCAjIG1hc2N1bGluZSBvcmRpbmFsIGluZGljYXRvciwgVSswMEJBIElTT251bQorICAgICdvc2xhc2gnOiAgIDB4MDBmOCwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHN0cm9rZSwgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgbyBzbGFzaCwgVSswMEY4IElTT2xhdDEKKyAgICAnb3RpbGRlJzogICAweDAwZjUsICMgbGF0aW4gc21hbGwgbGV0dGVyIG8gd2l0aCB0aWxkZSwgVSswMEY1IElTT2xhdDEKKyAgICAnb3RpbWVzJzogICAweDIyOTcsICMgY2lyY2xlZCB0aW1lcyA9IHZlY3RvciBwcm9kdWN0LCBVKzIyOTcgSVNPYW1zYgorICAgICdvdW1sJzogICAgIDB4MDBmNiwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGRpYWVyZXNpcywgVSswMEY2IElTT2xhdDEKKyAgICAncGFyYSc6ICAgICAweDAwYjYsICMgcGlsY3JvdyBzaWduID0gcGFyYWdyYXBoIHNpZ24sIFUrMDBCNiBJU09udW0KKyAgICAncGFydCc6ICAgICAweDIyMDIsICMgcGFydGlhbCBkaWZmZXJlbnRpYWwsIFUrMjIwMiBJU090ZWNoCisgICAgJ3Blcm1pbCc6ICAgMHgyMDMwLCAjIHBlciBtaWxsZSBzaWduLCBVKzIwMzAgSVNPdGVjaAorICAgICdwZXJwJzogICAgIDB4MjJhNSwgIyB1cCB0YWNrID0gb3J0aG9nb25hbCB0byA9IHBlcnBlbmRpY3VsYXIsIFUrMjJBNSBJU090ZWNoCisgICAgJ3BoaSc6ICAgICAgMHgwM2M2LCAjIGdyZWVrIHNtYWxsIGxldHRlciBwaGksIFUrMDNDNiBJU09ncmszCisgICAgJ3BpJzogICAgICAgMHgwM2MwLCAjIGdyZWVrIHNtYWxsIGxldHRlciBwaSwgVSswM0MwIElTT2dyazMKKyAgICAncGl2JzogICAgICAweDAzZDYsICMgZ3JlZWsgcGkgc3ltYm9sLCBVKzAzRDYgSVNPZ3JrMworICAgICdwbHVzbW4nOiAgIDB4MDBiMSwgIyBwbHVzLW1pbnVzIHNpZ24gPSBwbHVzLW9yLW1pbnVzIHNpZ24sIFUrMDBCMSBJU09udW0KKyAgICAncG91bmQnOiAgICAweDAwYTMsICMgcG91bmQgc2lnbiwgVSswMEEzIElTT251bQorICAgICdwcmltZSc6ICAgIDB4MjAzMiwgIyBwcmltZSA9IG1pbnV0ZXMgPSBmZWV0LCBVKzIwMzIgSVNPdGVjaAorICAgICdwcm9kJzogICAgIDB4MjIwZiwgIyBuLWFyeSBwcm9kdWN0ID0gcHJvZHVjdCBzaWduLCBVKzIyMEYgSVNPYW1zYgorICAgICdwcm9wJzogICAgIDB4MjIxZCwgIyBwcm9wb3J0aW9uYWwgdG8sIFUrMjIxRCBJU090ZWNoCisgICAgJ3BzaSc6ICAgICAgMHgwM2M4LCAjIGdyZWVrIHNtYWxsIGxldHRlciBwc2ksIFUrMDNDOCBJU09ncmszCisgICAgJ3F1b3QnOiAgICAgMHgwMDIyLCAjIHF1b3RhdGlvbiBtYXJrID0gQVBMIHF1b3RlLCBVKzAwMjIgSVNPbnVtCisgICAgJ3JBcnInOiAgICAgMHgyMWQyLCAjIHJpZ2h0d2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDIgSVNPdGVjaAorICAgICdyYWRpYyc6ICAgIDB4MjIxYSwgIyBzcXVhcmUgcm9vdCA9IHJhZGljYWwgc2lnbiwgVSsyMjFBIElTT3RlY2gKKyAgICAncmFuZyc6ICAgICAweDIzMmEsICMgcmlnaHQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldCA9IGtldCwgVSsyMzJBIElTT3RlY2gKKyAgICAncmFxdW8nOiAgICAweDAwYmIsICMgcmlnaHQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrID0gcmlnaHQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQkIgSVNPbnVtCisgICAgJ3JhcnInOiAgICAgMHgyMTkyLCAjIHJpZ2h0d2FyZHMgYXJyb3csIFUrMjE5MiBJU09udW0KKyAgICAncmNlaWwnOiAgICAweDIzMDksICMgcmlnaHQgY2VpbGluZywgVSsyMzA5IElTT2Ftc2MKKyAgICAncmRxdW8nOiAgICAweDIwMWQsICMgcmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMUQgSVNPbnVtCisgICAgJ3JlYWwnOiAgICAgMHgyMTFjLCAjIGJsYWNrbGV0dGVyIGNhcGl0YWwgUiA9IHJlYWwgcGFydCBzeW1ib2wsIFUrMjExQyBJU09hbXNvCisgICAgJ3JlZyc6ICAgICAgMHgwMGFlLCAjIHJlZ2lzdGVyZWQgc2lnbiA9IHJlZ2lzdGVyZWQgdHJhZGUgbWFyayBzaWduLCBVKzAwQUUgSVNPbnVtCisgICAgJ3JmbG9vcic6ICAgMHgyMzBiLCAjIHJpZ2h0IGZsb29yLCBVKzIzMEIgSVNPYW1zYworICAgICdyaG8nOiAgICAgIDB4MDNjMSwgIyBncmVlayBzbWFsbCBsZXR0ZXIgcmhvLCBVKzAzQzEgSVNPZ3JrMworICAgICdybG0nOiAgICAgIDB4MjAwZiwgIyByaWdodC10by1sZWZ0IG1hcmssIFUrMjAwRiBORVcgUkZDIDIwNzAKKyAgICAncnNhcXVvJzogICAweDIwM2EsICMgc2luZ2xlIHJpZ2h0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLCBVKzIwM0EgSVNPIHByb3Bvc2VkCisgICAgJ3JzcXVvJzogICAgMHgyMDE5LCAjIHJpZ2h0IHNpbmdsZSBxdW90YXRpb24gbWFyaywgVSsyMDE5IElTT251bQorICAgICdzYnF1byc6ICAgIDB4MjAxYSwgIyBzaW5nbGUgbG93LTkgcXVvdGF0aW9uIG1hcmssIFUrMjAxQSBORVcKKyAgICAnc2Nhcm9uJzogICAweDAxNjEsICMgbGF0aW4gc21hbGwgbGV0dGVyIHMgd2l0aCBjYXJvbiwgVSswMTYxIElTT2xhdDIKKyAgICAnc2RvdCc6ICAgICAweDIyYzUsICMgZG90IG9wZXJhdG9yLCBVKzIyQzUgSVNPYW1zYgorICAgICdzZWN0JzogICAgIDB4MDBhNywgIyBzZWN0aW9uIHNpZ24sIFUrMDBBNyBJU09udW0KKyAgICAnc2h5JzogICAgICAweDAwYWQsICMgc29mdCBoeXBoZW4gPSBkaXNjcmV0aW9uYXJ5IGh5cGhlbiwgVSswMEFEIElTT251bQorICAgICdzaWdtYSc6ICAgIDB4MDNjMywgIyBncmVlayBzbWFsbCBsZXR0ZXIgc2lnbWEsIFUrMDNDMyBJU09ncmszCisgICAgJ3NpZ21hZic6ICAgMHgwM2MyLCAjIGdyZWVrIHNtYWxsIGxldHRlciBmaW5hbCBzaWdtYSwgVSswM0MyIElTT2dyazMKKyAgICAnc2ltJzogICAgICAweDIyM2MsICMgdGlsZGUgb3BlcmF0b3IgPSB2YXJpZXMgd2l0aCA9IHNpbWlsYXIgdG8sIFUrMjIzQyBJU090ZWNoCisgICAgJ3NwYWRlcyc6ICAgMHgyNjYwLCAjIGJsYWNrIHNwYWRlIHN1aXQsIFUrMjY2MCBJU09wdWIKKyAgICAnc3ViJzogICAgICAweDIyODIsICMgc3Vic2V0IG9mLCBVKzIyODIgSVNPdGVjaAorICAgICdzdWJlJzogICAgIDB4MjI4NiwgIyBzdWJzZXQgb2Ygb3IgZXF1YWwgdG8sIFUrMjI4NiBJU090ZWNoCisgICAgJ3N1bSc6ICAgICAgMHgyMjExLCAjIG4tYXJ5IHN1bWF0aW9uLCBVKzIyMTEgSVNPYW1zYgorICAgICdzdXAnOiAgICAgIDB4MjI4MywgIyBzdXBlcnNldCBvZiwgVSsyMjgzIElTT3RlY2gKKyAgICAnc3VwMSc6ICAgICAweDAwYjksICMgc3VwZXJzY3JpcHQgb25lID0gc3VwZXJzY3JpcHQgZGlnaXQgb25lLCBVKzAwQjkgSVNPbnVtCisgICAgJ3N1cDInOiAgICAgMHgwMGIyLCAjIHN1cGVyc2NyaXB0IHR3byA9IHN1cGVyc2NyaXB0IGRpZ2l0IHR3byA9IHNxdWFyZWQsIFUrMDBCMiBJU09udW0KKyAgICAnc3VwMyc6ICAgICAweDAwYjMsICMgc3VwZXJzY3JpcHQgdGhyZWUgPSBzdXBlcnNjcmlwdCBkaWdpdCB0aHJlZSA9IGN1YmVkLCBVKzAwQjMgSVNPbnVtCisgICAgJ3N1cGUnOiAgICAgMHgyMjg3LCAjIHN1cGVyc2V0IG9mIG9yIGVxdWFsIHRvLCBVKzIyODcgSVNPdGVjaAorICAgICdzemxpZyc6ICAgIDB4MDBkZiwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgc2hhcnAgcyA9IGVzcy16ZWQsIFUrMDBERiBJU09sYXQxCisgICAgJ3RhdSc6ICAgICAgMHgwM2M0LCAjIGdyZWVrIHNtYWxsIGxldHRlciB0YXUsIFUrMDNDNCBJU09ncmszCisgICAgJ3RoZXJlNCc6ICAgMHgyMjM0LCAjIHRoZXJlZm9yZSwgVSsyMjM0IElTT3RlY2gKKyAgICAndGhldGEnOiAgICAweDAzYjgsICMgZ3JlZWsgc21hbGwgbGV0dGVyIHRoZXRhLCBVKzAzQjggSVNPZ3JrMworICAgICd0aGV0YXN5bSc6IDB4MDNkMSwgIyBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEgc3ltYm9sLCBVKzAzRDEgTkVXCisgICAgJ3RoaW5zcCc6ICAgMHgyMDA5LCAjIHRoaW4gc3BhY2UsIFUrMjAwOSBJU09wdWIKKyAgICAndGhvcm4nOiAgICAweDAwZmUsICMgbGF0aW4gc21hbGwgbGV0dGVyIHRob3JuIHdpdGgsIFUrMDBGRSBJU09sYXQxCisgICAgJ3RpbGRlJzogICAgMHgwMmRjLCAjIHNtYWxsIHRpbGRlLCBVKzAyREMgSVNPZGlhCisgICAgJ3RpbWVzJzogICAgMHgwMGQ3LCAjIG11bHRpcGxpY2F0aW9uIHNpZ24sIFUrMDBENyBJU09udW0KKyAgICAndHJhZGUnOiAgICAweDIxMjIsICMgdHJhZGUgbWFyayBzaWduLCBVKzIxMjIgSVNPbnVtCisgICAgJ3VBcnInOiAgICAgMHgyMWQxLCAjIHVwd2FyZHMgZG91YmxlIGFycm93LCBVKzIxRDEgSVNPYW1zYQorICAgICd1YWN1dGUnOiAgIDB4MDBmYSwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGFjdXRlLCBVKzAwRkEgSVNPbGF0MQorICAgICd1YXJyJzogICAgIDB4MjE5MSwgIyB1cHdhcmRzIGFycm93LCBVKzIxOTEgSVNPbnVtCisgICAgJ3VjaXJjJzogICAgMHgwMGZiLCAjIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggY2lyY3VtZmxleCwgVSswMEZCIElTT2xhdDEKKyAgICAndWdyYXZlJzogICAweDAwZjksICMgbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBncmF2ZSwgVSswMEY5IElTT2xhdDEKKyAgICAndW1sJzogICAgICAweDAwYTgsICMgZGlhZXJlc2lzID0gc3BhY2luZyBkaWFlcmVzaXMsIFUrMDBBOCBJU09kaWEKKyAgICAndXBzaWgnOiAgICAweDAzZDIsICMgZ3JlZWsgdXBzaWxvbiB3aXRoIGhvb2sgc3ltYm9sLCBVKzAzRDIgTkVXCisgICAgJ3Vwc2lsb24nOiAgMHgwM2M1LCAjIGdyZWVrIHNtYWxsIGxldHRlciB1cHNpbG9uLCBVKzAzQzUgSVNPZ3JrMworICAgICd1dW1sJzogICAgIDB4MDBmYywgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGRpYWVyZXNpcywgVSswMEZDIElTT2xhdDEKKyAgICAnd2VpZXJwJzogICAweDIxMTgsICMgc2NyaXB0IGNhcGl0YWwgUCA9IHBvd2VyIHNldCA9IFdlaWVyc3RyYXNzIHAsIFUrMjExOCBJU09hbXNvCisgICAgJ3hpJzogICAgICAgMHgwM2JlLCAjIGdyZWVrIHNtYWxsIGxldHRlciB4aSwgVSswM0JFIElTT2dyazMKKyAgICAneWFjdXRlJzogICAweDAwZmQsICMgbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBhY3V0ZSwgVSswMEZEIElTT2xhdDEKKyAgICAneWVuJzogICAgICAweDAwYTUsICMgeWVuIHNpZ24gPSB5dWFuIHNpZ24sIFUrMDBBNSBJU09udW0KKyAgICAneXVtbCc6ICAgICAweDAwZmYsICMgbGF0aW4gc21hbGwgbGV0dGVyIHkgd2l0aCBkaWFlcmVzaXMsIFUrMDBGRiBJU09sYXQxCisgICAgJ3pldGEnOiAgICAgMHgwM2I2LCAjIGdyZWVrIHNtYWxsIGxldHRlciB6ZXRhLCBVKzAzQjYgSVNPZ3JrMworICAgICd6d2onOiAgICAgIDB4MjAwZCwgIyB6ZXJvIHdpZHRoIGpvaW5lciwgVSsyMDBEIE5FVyBSRkMgMjA3MAorICAgICd6d25qJzogICAgIDB4MjAwYywgIyB6ZXJvIHdpZHRoIG5vbi1qb2luZXIsIFUrMjAwQyBORVcgUkZDIDIwNzAKK30KKworIyBtYXBzIHRoZSBVbmljb2RlIGNvZGVwb2ludCB0byB0aGUgSFRNTCBlbnRpdHkgbmFtZQorY29kZXBvaW50Mm5hbWUgPSB7fQorCisjIG1hcHMgdGhlIEhUTUwgZW50aXR5IG5hbWUgdG8gdGhlIGNoYXJhY3RlcgorIyAob3IgYSBjaGFyYWN0ZXIgcmVmZXJlbmNlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgb3V0c2lkZSB0aGUgTGF0aW4tMSByYW5nZSkKK2VudGl0eWRlZnMgPSB7fQorCitmb3IgKG5hbWUsIGNvZGVwb2ludCkgaW4gbmFtZTJjb2RlcG9pbnQuaXRlcml0ZW1zKCk6CisgICAgY29kZXBvaW50Mm5hbWVbY29kZXBvaW50XSA9IG5hbWUKKyAgICBpZiBjb2RlcG9pbnQgPD0gMHhmZjoKKyAgICAgICAgZW50aXR5ZGVmc1tuYW1lXSA9IGNocihjb2RlcG9pbnQpCisgICAgZWxzZToKKyAgICAgICAgZW50aXR5ZGVmc1tuYW1lXSA9ICcmIyVkOycgJSBjb2RlcG9pbnQKKworZGVsIG5hbWUsIGNvZGVwb2ludApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9odG1sZW50aXR5ZGVmcy5weWMgYi9saWIvcHl0aG9uMi43L2h0bWxlbnRpdHlkZWZzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODZiYzBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9odG1sZW50aXR5ZGVmcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9odG1sZW50aXR5ZGVmcy5weW8gYi9saWIvcHl0aG9uMi43L2h0bWxlbnRpdHlkZWZzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODZiYzBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9odG1sZW50aXR5ZGVmcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9odG1sbGliLnB5IGIvbGliL3B5dGhvbjIuNy9odG1sbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NjQ3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2h0bWxsaWIucHkKQEAgLTAsMCArMSw0OTEgQEAKKyIiIkhUTUwgMi4wIHBhcnNlci4KKworU2VlIHRoZSBIVE1MIDIuMCBzcGVjaWZpY2F0aW9uOgoraHR0cDovL3d3dy53My5vcmcvaHlwZXJ0ZXh0L1dXVy9NYXJrVXAvaHRtbC1zcGVjL2h0bWwtc3BlY190b2MuaHRtbAorIiIiCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIGh0bWxsaWIgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCIsCisgICAgICAgICBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworaW1wb3J0IHNnbWxsaWIKKworZnJvbSBmb3JtYXR0ZXIgaW1wb3J0IEFTX0lTCisKK19fYWxsX18gPSBbIkhUTUxQYXJzZXIiLCAiSFRNTFBhcnNlRXJyb3IiXQorCisKK2NsYXNzIEhUTUxQYXJzZUVycm9yKHNnbWxsaWIuU0dNTFBhcnNlRXJyb3IpOgorICAgICIiIkVycm9yIHJhaXNlZCB3aGVuIGFuIEhUTUwgZG9jdW1lbnQgY2FuJ3QgYmUgcGFyc2VkLiIiIgorCisKK2NsYXNzIEhUTUxQYXJzZXIoc2dtbGxpYi5TR01MUGFyc2VyKToKKyAgICAiIiJUaGlzIGlzIHRoZSBiYXNpYyBIVE1MIHBhcnNlciBjbGFzcy4KKworICAgIEl0IHN1cHBvcnRzIGFsbCBlbnRpdHkgbmFtZXMgcmVxdWlyZWQgYnkgdGhlIFhIVE1MIDEuMCBSZWNvbW1lbmRhdGlvbi4KKyAgICBJdCBhbHNvIGRlZmluZXMgaGFuZGxlcnMgZm9yIGFsbCBIVE1MIDIuMCBhbmQgbWFueSBIVE1MIDMuMCBhbmQgMy4yCisgICAgZWxlbWVudHMuCisKKyAgICAiIiIKKworICAgIGZyb20gaHRtbGVudGl0eWRlZnMgaW1wb3J0IGVudGl0eWRlZnMKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb3JtYXR0ZXIsIHZlcmJvc2U9MCk6CisgICAgICAgICIiIkNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIEhUTUxQYXJzZXIgY2xhc3MuCisKKyAgICAgICAgVGhlIGZvcm1hdHRlciBwYXJhbWV0ZXIgaXMgdGhlIGZvcm1hdHRlciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgdGhlIHBhcnNlci4KKworICAgICAgICAiIiIKKyAgICAgICAgc2dtbGxpYi5TR01MUGFyc2VyLl9faW5pdF9fKHNlbGYsIHZlcmJvc2UpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyID0gZm9ybWF0dGVyCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIHJhaXNlIEhUTUxQYXJzZUVycm9yKG1lc3NhZ2UpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNnbWxsaWIuU0dNTFBhcnNlci5yZXNldChzZWxmKQorICAgICAgICBzZWxmLnNhdmVkYXRhID0gTm9uZQorICAgICAgICBzZWxmLmlzaW5kZXggPSAwCisgICAgICAgIHNlbGYudGl0bGUgPSBOb25lCisgICAgICAgIHNlbGYuYmFzZSA9IE5vbmUKKyAgICAgICAgc2VsZi5hbmNob3IgPSBOb25lCisgICAgICAgIHNlbGYuYW5jaG9ybGlzdCA9IFtdCisgICAgICAgIHNlbGYubm9maWxsID0gMAorICAgICAgICBzZWxmLmxpc3Rfc3RhY2sgPSBbXQorCisgICAgIyAtLS0tLS0gTWV0aG9kcyB1c2VkIGludGVybmFsbHk7IHNvbWUgbWF5IGJlIG92ZXJyaWRkZW4KKworICAgICMgLS0tIEZvcm1hdHRlciBpbnRlcmZhY2UsIHRha2luZyBjYXJlIG9mICdzYXZlZGF0YScgbW9kZTsKKyAgICAjIHNob3VsZG4ndCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4KKworICAgIGRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgc2VsZi5zYXZlZGF0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2F2ZWRhdGEgPSBzZWxmLnNhdmVkYXRhICsgZGF0YQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5ub2ZpbGw6CisgICAgICAgICAgICAgICAgc2VsZi5mb3JtYXR0ZXIuYWRkX2xpdGVyYWxfZGF0YShkYXRhKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5hZGRfZmxvd2luZ19kYXRhKGRhdGEpCisKKyAgICAjIC0tLSBIb29rcyB0byBzYXZlIGRhdGE7IHNob3VsZG4ndCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4KKworICAgIGRlZiBzYXZlX2JnbihzZWxmKToKKyAgICAgICAgIiIiQmVnaW5zIHNhdmluZyBjaGFyYWN0ZXIgZGF0YSBpbiBhIGJ1ZmZlciBpbnN0ZWFkIG9mIHNlbmRpbmcgaXQKKyAgICAgICAgdG8gdGhlIGZvcm1hdHRlciBvYmplY3QuCisKKyAgICAgICAgUmV0cmlldmUgdGhlIHN0b3JlZCBkYXRhIHZpYSB0aGUgc2F2ZV9lbmQoKSBtZXRob2QuICBVc2Ugb2YgdGhlCisgICAgICAgIHNhdmVfYmduKCkgLyBzYXZlX2VuZCgpIHBhaXIgbWF5IG5vdCBiZSBuZXN0ZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc2F2ZWRhdGEgPSAnJworCisgICAgZGVmIHNhdmVfZW5kKHNlbGYpOgorICAgICAgICAiIiJFbmRzIGJ1ZmZlcmluZyBjaGFyYWN0ZXIgZGF0YSBhbmQgcmV0dXJucyBhbGwgZGF0YSBzYXZlZCBzaW5jZQorICAgICAgICB0aGUgcHJlY2VkaW5nIGNhbGwgdG8gdGhlIHNhdmVfYmduKCkgbWV0aG9kLgorCisgICAgICAgIElmIHRoZSBub2ZpbGwgZmxhZyBpcyBmYWxzZSwgd2hpdGVzcGFjZSBpcyBjb2xsYXBzZWQgdG8gc2luZ2xlCisgICAgICAgIHNwYWNlcy4gIEEgY2FsbCB0byB0aGlzIG1ldGhvZCB3aXRob3V0IGEgcHJlY2VkaW5nIGNhbGwgdG8gdGhlCisgICAgICAgIHNhdmVfYmduKCkgbWV0aG9kIHdpbGwgcmFpc2UgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLgorCisgICAgICAgICIiIgorICAgICAgICBkYXRhID0gc2VsZi5zYXZlZGF0YQorICAgICAgICBzZWxmLnNhdmVkYXRhID0gTm9uZQorICAgICAgICBpZiBub3Qgc2VsZi5ub2ZpbGw6CisgICAgICAgICAgICBkYXRhID0gJyAnLmpvaW4oZGF0YS5zcGxpdCgpKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgIyAtLS0gSG9va3MgZm9yIGFuY2hvcnM7IHNob3VsZCBwcm9iYWJseSBiZSBvdmVycmlkZGVuCisKKyAgICBkZWYgYW5jaG9yX2JnbihzZWxmLCBocmVmLCBuYW1lLCB0eXBlKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhbiBhbmNob3IgcmVnaW9uLgorCisgICAgICAgIFRoZSBhcmd1bWVudHMgY29ycmVzcG9uZCB0byB0aGUgYXR0cmlidXRlcyBvZiB0aGUgPEE+IHRhZyB3aXRoCisgICAgICAgIHRoZSBzYW1lIG5hbWVzLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbWFpbnRhaW5zIGEgbGlzdCBvZgorICAgICAgICBoeXBlcmxpbmtzIChkZWZpbmVkIGJ5IHRoZSBIUkVGIGF0dHJpYnV0ZSBmb3IgPEE+IHRhZ3MpIHdpdGhpbgorICAgICAgICB0aGUgZG9jdW1lbnQuICBUaGUgbGlzdCBvZiBoeXBlcmxpbmtzIGlzIGF2YWlsYWJsZSBhcyB0aGUgZGF0YQorICAgICAgICBhdHRyaWJ1dGUgYW5jaG9ybGlzdC4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hbmNob3IgPSBocmVmCisgICAgICAgIGlmIHNlbGYuYW5jaG9yOgorICAgICAgICAgICAgc2VsZi5hbmNob3JsaXN0LmFwcGVuZChocmVmKQorCisgICAgZGVmIGFuY2hvcl9lbmQoc2VsZik6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGFuIGFuY2hvciByZWdpb24uCisKKyAgICAgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWRkcyBhIHRleHR1YWwgZm9vdG5vdGUgbWFya2VyIHVzaW5nIGFuCisgICAgICAgIGluZGV4IGludG8gdGhlIGxpc3Qgb2YgaHlwZXJsaW5rcyBjcmVhdGVkIGJ5IHRoZSBhbmNob3JfYmduKCltZXRob2QuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuYW5jaG9yOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YSgiWyVkXSIgJSBsZW4oc2VsZi5hbmNob3JsaXN0KSkKKyAgICAgICAgICAgIHNlbGYuYW5jaG9yID0gTm9uZQorCisgICAgIyAtLS0gSG9vayBmb3IgaW1hZ2VzOyBzaG91bGQgcHJvYmFibHkgYmUgb3ZlcnJpZGRlbgorCisgICAgZGVmIGhhbmRsZV9pbWFnZShzZWxmLCBzcmMsIGFsdCwgKmFyZ3MpOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gaGFuZGxlIGltYWdlcy4KKworICAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcGFzc2VzIHRoZSBhbHQgdmFsdWUgdG8gdGhlCisgICAgICAgIGhhbmRsZV9kYXRhKCkgbWV0aG9kLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKGFsdCkKKworICAgICMgLS0tLS0tLS0tIFRvcCBsZXZlbCBlbGVtZW10cworCisgICAgZGVmIHN0YXJ0X2h0bWwoc2VsZiwgYXR0cnMpOiBwYXNzCisgICAgZGVmIGVuZF9odG1sKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgc3RhcnRfaGVhZChzZWxmLCBhdHRycyk6IHBhc3MKKyAgICBkZWYgZW5kX2hlYWQoc2VsZik6IHBhc3MKKworICAgIGRlZiBzdGFydF9ib2R5KHNlbGYsIGF0dHJzKTogcGFzcworICAgIGRlZiBlbmRfYm9keShzZWxmKTogcGFzcworCisgICAgIyAtLS0tLS0gSGVhZCBlbGVtZW50cworCisgICAgZGVmIHN0YXJ0X3RpdGxlKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5zYXZlX2JnbigpCisKKyAgICBkZWYgZW5kX3RpdGxlKHNlbGYpOgorICAgICAgICBzZWxmLnRpdGxlID0gc2VsZi5zYXZlX2VuZCgpCisKKyAgICBkZWYgZG9fYmFzZShzZWxmLCBhdHRycyk6CisgICAgICAgIGZvciBhLCB2IGluIGF0dHJzOgorICAgICAgICAgICAgaWYgYSA9PSAnaHJlZic6CisgICAgICAgICAgICAgICAgc2VsZi5iYXNlID0gdgorCisgICAgZGVmIGRvX2lzaW5kZXgoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmlzaW5kZXggPSAxCisKKyAgICBkZWYgZG9fbGluayhzZWxmLCBhdHRycyk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBkb19tZXRhKHNlbGYsIGF0dHJzKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGRvX25leHRpZChzZWxmLCBhdHRycyk6ICMgRGVwcmVjYXRlZAorICAgICAgICBwYXNzCisKKyAgICAjIC0tLS0tLSBCb2R5IGVsZW1lbnRzCisKKyAgICAjIC0tLSBIZWFkaW5ncworCisgICAgZGVmIHN0YXJ0X2gxKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wdXNoX2ZvbnQoKCdoMScsIDAsIDEsIDApKQorCisgICAgZGVmIGVuZF9oMShzZWxmKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wb3BfZm9udCgpCisKKyAgICBkZWYgc3RhcnRfaDIoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDEpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnB1c2hfZm9udCgoJ2gyJywgMCwgMSwgMCkpCisKKyAgICBkZWYgZW5kX2gyKHNlbGYpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDEpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnBvcF9mb250KCkKKworICAgIGRlZiBzdGFydF9oMyhzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucHVzaF9mb250KCgnaDMnLCAwLCAxLCAwKSkKKworICAgIGRlZiBlbmRfaDMoc2VsZik6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX2ZvbnQoKQorCisgICAgZGVmIHN0YXJ0X2g0KHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wdXNoX2ZvbnQoKCdoNCcsIDAsIDEsIDApKQorCisgICAgZGVmIGVuZF9oNChzZWxmKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wb3BfZm9udCgpCisKKyAgICBkZWYgc3RhcnRfaDUoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDEpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnB1c2hfZm9udCgoJ2g1JywgMCwgMSwgMCkpCisKKyAgICBkZWYgZW5kX2g1KHNlbGYpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDEpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnBvcF9mb250KCkKKworICAgIGRlZiBzdGFydF9oNihzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucHVzaF9mb250KCgnaDYnLCAwLCAxLCAwKSkKKworICAgIGRlZiBlbmRfaDYoc2VsZik6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX2ZvbnQoKQorCisgICAgIyAtLS0gQmxvY2sgU3RydWN0dXJpbmcgRWxlbWVudHMKKworICAgIGRlZiBkb19wKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorCisgICAgZGVmIHN0YXJ0X3ByZShzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucHVzaF9mb250KChBU19JUywgQVNfSVMsIEFTX0lTLCAxKSkKKyAgICAgICAgc2VsZi5ub2ZpbGwgPSBzZWxmLm5vZmlsbCArIDEKKworICAgIGRlZiBlbmRfcHJlKHNlbGYpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDEpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnBvcF9mb250KCkKKyAgICAgICAgc2VsZi5ub2ZpbGwgPSBtYXgoMCwgc2VsZi5ub2ZpbGwgLSAxKQorCisgICAgZGVmIHN0YXJ0X3htcChzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuc3RhcnRfcHJlKGF0dHJzKQorICAgICAgICBzZWxmLnNldGxpdGVyYWwoJ3htcCcpICMgVGVsbCBTR01MIHBhcnNlcgorCisgICAgZGVmIGVuZF94bXAoc2VsZik6CisgICAgICAgIHNlbGYuZW5kX3ByZSgpCisKKyAgICBkZWYgc3RhcnRfbGlzdGluZyhzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuc3RhcnRfcHJlKGF0dHJzKQorICAgICAgICBzZWxmLnNldGxpdGVyYWwoJ2xpc3RpbmcnKSAjIFRlbGwgU0dNTCBwYXJzZXIKKworICAgIGRlZiBlbmRfbGlzdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5lbmRfcHJlKCkKKworICAgIGRlZiBzdGFydF9hZGRyZXNzKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgwKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wdXNoX2ZvbnQoKEFTX0lTLCAxLCBBU19JUywgQVNfSVMpKQorCisgICAgZGVmIGVuZF9hZGRyZXNzKHNlbGYpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDApCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnBvcF9mb250KCkKKworICAgIGRlZiBzdGFydF9ibG9ja3F1b3RlKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wdXNoX21hcmdpbignYmxvY2txdW90ZScpCisKKyAgICBkZWYgZW5kX2Jsb2NrcXVvdGUoc2VsZik6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX21hcmdpbigpCisKKyAgICAjIC0tLSBMaXN0IEVsZW1lbnRzCisKKyAgICBkZWYgc3RhcnRfdWwoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKG5vdCBzZWxmLmxpc3Rfc3RhY2spCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnB1c2hfbWFyZ2luKCd1bCcpCisgICAgICAgIHNlbGYubGlzdF9zdGFjay5hcHBlbmQoWyd1bCcsICcqJywgMF0pCisKKyAgICBkZWYgZW5kX3VsKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmxpc3Rfc3RhY2s6IGRlbCBzZWxmLmxpc3Rfc3RhY2tbLTFdCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgobm90IHNlbGYubGlzdF9zdGFjaykKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX21hcmdpbigpCisKKyAgICBkZWYgZG9fbGkoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDApCisgICAgICAgIGlmIHNlbGYubGlzdF9zdGFjazoKKyAgICAgICAgICAgIFtkdW1teSwgbGFiZWwsIGNvdW50ZXJdID0gdG9wID0gc2VsZi5saXN0X3N0YWNrWy0xXQorICAgICAgICAgICAgdG9wWzJdID0gY291bnRlciA9IGNvdW50ZXIrMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGFiZWwsIGNvdW50ZXIgPSAnKicsIDAKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuYWRkX2xhYmVsX2RhdGEobGFiZWwsIGNvdW50ZXIpCisKKyAgICBkZWYgc3RhcnRfb2woc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKG5vdCBzZWxmLmxpc3Rfc3RhY2spCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnB1c2hfbWFyZ2luKCdvbCcpCisgICAgICAgIGxhYmVsID0gJzEuJworICAgICAgICBmb3IgYSwgdiBpbiBhdHRyczoKKyAgICAgICAgICAgIGlmIGEgPT0gJ3R5cGUnOgorICAgICAgICAgICAgICAgIGlmIGxlbih2KSA9PSAxOiB2ID0gdiArICcuJworICAgICAgICAgICAgICAgIGxhYmVsID0gdgorICAgICAgICBzZWxmLmxpc3Rfc3RhY2suYXBwZW5kKFsnb2wnLCBsYWJlbCwgMF0pCisKKyAgICBkZWYgZW5kX29sKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmxpc3Rfc3RhY2s6IGRlbCBzZWxmLmxpc3Rfc3RhY2tbLTFdCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgobm90IHNlbGYubGlzdF9zdGFjaykKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX21hcmdpbigpCisKKyAgICBkZWYgc3RhcnRfbWVudShzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuc3RhcnRfdWwoYXR0cnMpCisKKyAgICBkZWYgZW5kX21lbnUoc2VsZik6CisgICAgICAgIHNlbGYuZW5kX3VsKCkKKworICAgIGRlZiBzdGFydF9kaXIoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLnN0YXJ0X3VsKGF0dHJzKQorCisgICAgZGVmIGVuZF9kaXIoc2VsZik6CisgICAgICAgIHNlbGYuZW5kX3VsKCkKKworICAgIGRlZiBzdGFydF9kbChzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgc2VsZi5saXN0X3N0YWNrLmFwcGVuZChbJ2RsJywgJycsIDBdKQorCisgICAgZGVmIGVuZF9kbChzZWxmKToKKyAgICAgICAgc2VsZi5kZHBvcCgxKQorICAgICAgICBpZiBzZWxmLmxpc3Rfc3RhY2s6IGRlbCBzZWxmLmxpc3Rfc3RhY2tbLTFdCisKKyAgICBkZWYgZG9fZHQoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmRkcG9wKCkKKworICAgIGRlZiBkb19kZChzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZGRwb3AoKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wdXNoX21hcmdpbignZGQnKQorICAgICAgICBzZWxmLmxpc3Rfc3RhY2suYXBwZW5kKFsnZGQnLCAnJywgMF0pCisKKyAgICBkZWYgZGRwb3Aoc2VsZiwgYmw9MCk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoYmwpCisgICAgICAgIGlmIHNlbGYubGlzdF9zdGFjazoKKyAgICAgICAgICAgIGlmIHNlbGYubGlzdF9zdGFja1stMV1bMF0gPT0gJ2RkJzoKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5saXN0X3N0YWNrWy0xXQorICAgICAgICAgICAgICAgIHNlbGYuZm9ybWF0dGVyLnBvcF9tYXJnaW4oKQorCisgICAgIyAtLS0gUGhyYXNlIE1hcmt1cAorCisgICAgIyBJZGlvbWF0aWMgRWxlbWVudHMKKworICAgIGRlZiBzdGFydF9jaXRlKHNlbGYsIGF0dHJzKTogc2VsZi5zdGFydF9pKGF0dHJzKQorICAgIGRlZiBlbmRfY2l0ZShzZWxmKTogc2VsZi5lbmRfaSgpCisKKyAgICBkZWYgc3RhcnRfY29kZShzZWxmLCBhdHRycyk6IHNlbGYuc3RhcnRfdHQoYXR0cnMpCisgICAgZGVmIGVuZF9jb2RlKHNlbGYpOiBzZWxmLmVuZF90dCgpCisKKyAgICBkZWYgc3RhcnRfZW0oc2VsZiwgYXR0cnMpOiBzZWxmLnN0YXJ0X2koYXR0cnMpCisgICAgZGVmIGVuZF9lbShzZWxmKTogc2VsZi5lbmRfaSgpCisKKyAgICBkZWYgc3RhcnRfa2JkKHNlbGYsIGF0dHJzKTogc2VsZi5zdGFydF90dChhdHRycykKKyAgICBkZWYgZW5kX2tiZChzZWxmKTogc2VsZi5lbmRfdHQoKQorCisgICAgZGVmIHN0YXJ0X3NhbXAoc2VsZiwgYXR0cnMpOiBzZWxmLnN0YXJ0X3R0KGF0dHJzKQorICAgIGRlZiBlbmRfc2FtcChzZWxmKTogc2VsZi5lbmRfdHQoKQorCisgICAgZGVmIHN0YXJ0X3N0cm9uZyhzZWxmLCBhdHRycyk6IHNlbGYuc3RhcnRfYihhdHRycykKKyAgICBkZWYgZW5kX3N0cm9uZyhzZWxmKTogc2VsZi5lbmRfYigpCisKKyAgICBkZWYgc3RhcnRfdmFyKHNlbGYsIGF0dHJzKTogc2VsZi5zdGFydF9pKGF0dHJzKQorICAgIGRlZiBlbmRfdmFyKHNlbGYpOiBzZWxmLmVuZF9pKCkKKworICAgICMgVHlwb2dyYXBoaWMgRWxlbWVudHMKKworICAgIGRlZiBzdGFydF9pKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucHVzaF9mb250KChBU19JUywgMSwgQVNfSVMsIEFTX0lTKSkKKyAgICBkZWYgZW5kX2koc2VsZik6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnBvcF9mb250KCkKKworICAgIGRlZiBzdGFydF9iKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucHVzaF9mb250KChBU19JUywgQVNfSVMsIDEsIEFTX0lTKSkKKyAgICBkZWYgZW5kX2Ioc2VsZik6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnBvcF9mb250KCkKKworICAgIGRlZiBzdGFydF90dChzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnB1c2hfZm9udCgoQVNfSVMsIEFTX0lTLCBBU19JUywgMSkpCisgICAgZGVmIGVuZF90dChzZWxmKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX2ZvbnQoKQorCisgICAgZGVmIHN0YXJ0X2Eoc2VsZiwgYXR0cnMpOgorICAgICAgICBocmVmID0gJycKKyAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIHR5cGUgPSAnJworICAgICAgICBmb3IgYXR0cm5hbWUsIHZhbHVlIGluIGF0dHJzOgorICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdHJpcCgpCisgICAgICAgICAgICBpZiBhdHRybmFtZSA9PSAnaHJlZic6CisgICAgICAgICAgICAgICAgaHJlZiA9IHZhbHVlCisgICAgICAgICAgICBpZiBhdHRybmFtZSA9PSAnbmFtZSc6CisgICAgICAgICAgICAgICAgbmFtZSA9IHZhbHVlCisgICAgICAgICAgICBpZiBhdHRybmFtZSA9PSAndHlwZSc6CisgICAgICAgICAgICAgICAgdHlwZSA9IHZhbHVlLmxvd2VyKCkKKyAgICAgICAgc2VsZi5hbmNob3JfYmduKGhyZWYsIG5hbWUsIHR5cGUpCisKKyAgICBkZWYgZW5kX2Eoc2VsZik6CisgICAgICAgIHNlbGYuYW5jaG9yX2VuZCgpCisKKyAgICAjIC0tLSBMaW5lIEJyZWFrCisKKyAgICBkZWYgZG9fYnIoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5hZGRfbGluZV9icmVhaygpCisKKyAgICAjIC0tLSBIb3Jpem9udGFsIFJ1bGUKKworICAgIGRlZiBkb19ocihzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmFkZF9ob3JfcnVsZSgpCisKKyAgICAjIC0tLSBJbWFnZQorCisgICAgZGVmIGRvX2ltZyhzZWxmLCBhdHRycyk6CisgICAgICAgIGFsaWduID0gJycKKyAgICAgICAgYWx0ID0gJyhpbWFnZSknCisgICAgICAgIGlzbWFwID0gJycKKyAgICAgICAgc3JjID0gJycKKyAgICAgICAgd2lkdGggPSAwCisgICAgICAgIGhlaWdodCA9IDAKKyAgICAgICAgZm9yIGF0dHJuYW1lLCB2YWx1ZSBpbiBhdHRyczoKKyAgICAgICAgICAgIGlmIGF0dHJuYW1lID09ICdhbGlnbic6CisgICAgICAgICAgICAgICAgYWxpZ24gPSB2YWx1ZQorICAgICAgICAgICAgaWYgYXR0cm5hbWUgPT0gJ2FsdCc6CisgICAgICAgICAgICAgICAgYWx0ID0gdmFsdWUKKyAgICAgICAgICAgIGlmIGF0dHJuYW1lID09ICdpc21hcCc6CisgICAgICAgICAgICAgICAgaXNtYXAgPSB2YWx1ZQorICAgICAgICAgICAgaWYgYXR0cm5hbWUgPT0gJ3NyYyc6CisgICAgICAgICAgICAgICAgc3JjID0gdmFsdWUKKyAgICAgICAgICAgIGlmIGF0dHJuYW1lID09ICd3aWR0aCc6CisgICAgICAgICAgICAgICAgdHJ5OiB3aWR0aCA9IGludCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICAgICAgaWYgYXR0cm5hbWUgPT0gJ2hlaWdodCc6CisgICAgICAgICAgICAgICAgdHJ5OiBoZWlnaHQgPSBpbnQodmFsdWUpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgc2VsZi5oYW5kbGVfaW1hZ2Uoc3JjLCBhbHQsIGlzbWFwLCBhbGlnbiwgd2lkdGgsIGhlaWdodCkKKworICAgICMgLS0tIFJlYWxseSBPbGQgVW5vZmZpY2lhbCBEZXByZWNhdGVkIFN0dWZmCisKKyAgICBkZWYgZG9fcGxhaW50ZXh0KHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5zdGFydF9wcmUoYXR0cnMpCisgICAgICAgIHNlbGYuc2V0bm9tb3JldGFncygpICMgVGVsbCBTR01MIHBhcnNlcgorCisgICAgIyAtLS0gVW5oYW5kbGVkIHRhZ3MKKworICAgIGRlZiB1bmtub3duX3N0YXJ0dGFnKHNlbGYsIHRhZywgYXR0cnMpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdW5rbm93bl9lbmR0YWcoc2VsZiwgdGFnKToKKyAgICAgICAgcGFzcworCisKK2RlZiB0ZXN0KGFyZ3MgPSBOb25lKToKKyAgICBpbXBvcnQgc3lzLCBmb3JtYXR0ZXIKKworICAgIGlmIG5vdCBhcmdzOgorICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCisKKyAgICBzaWxlbnQgPSBhcmdzIGFuZCBhcmdzWzBdID09ICctcycKKyAgICBpZiBzaWxlbnQ6CisgICAgICAgIGRlbCBhcmdzWzBdCisKKyAgICBpZiBhcmdzOgorICAgICAgICBmaWxlID0gYXJnc1swXQorICAgIGVsc2U6CisgICAgICAgIGZpbGUgPSAndGVzdC5odG1sJworCisgICAgaWYgZmlsZSA9PSAnLSc6CisgICAgICAgIGYgPSBzeXMuc3RkaW4KKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlLCAncicpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CisgICAgICAgICAgICBwcmludCBmaWxlLCAiOiIsIG1zZworICAgICAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGRhdGEgPSBmLnJlYWQoKQorCisgICAgaWYgZiBpcyBub3Qgc3lzLnN0ZGluOgorICAgICAgICBmLmNsb3NlKCkKKworICAgIGlmIHNpbGVudDoKKyAgICAgICAgZiA9IGZvcm1hdHRlci5OdWxsRm9ybWF0dGVyKCkKKyAgICBlbHNlOgorICAgICAgICBmID0gZm9ybWF0dGVyLkFic3RyYWN0Rm9ybWF0dGVyKGZvcm1hdHRlci5EdW1iV3JpdGVyKCkpCisKKyAgICBwID0gSFRNTFBhcnNlcihmKQorICAgIHAuZmVlZChkYXRhKQorICAgIHAuY2xvc2UoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2h0bWxsaWIucHljIGIvbGliL3B5dGhvbjIuNy9odG1sbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmIwMzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9odG1sbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2h0bWxsaWIucHlvIGIvbGliL3B5dGhvbjIuNy9odG1sbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmIwMzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9odG1sbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2h0dHBsaWIucHkgYi9saWIvcHl0aG9uMi43L2h0dHBsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5MTlkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaHR0cGxpYi5weQpAQCAtMCwwICsxLDEzNDIgQEAKK3IiIiJIVFRQLzEuMSBjbGllbnQgbGlicmFyeQorCis8aW50cm8gc3R1ZmYgZ29lcyBoZXJlPgorPG90aGVyIHN0dWZmLCB0b28+CisKK0hUVFBDb25uZWN0aW9uIGdvZXMgdGhyb3VnaCBhIG51bWJlciBvZiAic3RhdGVzIiwgd2hpY2ggZGVmaW5lIHdoZW4gYSBjbGllbnQKK21heSBsZWdhbGx5IG1ha2UgYW5vdGhlciByZXF1ZXN0IG9yIGZldGNoIHRoZSByZXNwb25zZSBmb3IgYSBwYXJ0aWN1bGFyCityZXF1ZXN0LiBUaGlzIGRpYWdyYW0gZGV0YWlscyB0aGVzZSBzdGF0ZSB0cmFuc2l0aW9uczoKKworICAgIChudWxsKQorICAgICAgfAorICAgICAgfCBIVFRQQ29ubmVjdGlvbigpCisgICAgICB2CisgICAgSWRsZQorICAgICAgfAorICAgICAgfCBwdXRyZXF1ZXN0KCkKKyAgICAgIHYKKyAgICBSZXF1ZXN0LXN0YXJ0ZWQKKyAgICAgIHwKKyAgICAgIHwgKCBwdXRoZWFkZXIoKSApKiAgZW5kaGVhZGVycygpCisgICAgICB2CisgICAgUmVxdWVzdC1zZW50CisgICAgICB8CisgICAgICB8IHJlc3BvbnNlID0gZ2V0cmVzcG9uc2UoKQorICAgICAgdgorICAgIFVucmVhZC1yZXNwb25zZSAgIFtSZXNwb25zZS1oZWFkZXJzLXJlYWRdCisgICAgICB8XF9fX19fX19fX19fX19fX19fX19fCisgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCByZXNwb25zZS5yZWFkKCkgICAgIHwgcHV0cmVxdWVzdCgpCisgICAgICB2ICAgICAgICAgICAgICAgICAgICAgdgorICAgIElkbGUgICAgICAgICAgICAgICAgICBSZXEtc3RhcnRlZC11bnJlYWQtcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgIF9fX19fXy98CisgICAgICAgICAgICAgICAgICAgLyAgICAgICAgfAorICAgcmVzcG9uc2UucmVhZCgpIHwgICAgICAgIHwgKCBwdXRoZWFkZXIoKSApKiAgZW5kaGVhZGVycygpCisgICAgICAgICAgICAgICAgICAgdiAgICAgICAgdgorICAgICAgIFJlcXVlc3Qtc3RhcnRlZCAgICBSZXEtc2VudC11bnJlYWQtcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXNwb25zZS5yZWFkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2CisgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3Qtc2VudAorCitUaGlzIGRpYWdyYW0gcHJlc2VudHMgdGhlIGZvbGxvd2luZyBydWxlczoKKyAgLS0gYSBzZWNvbmQgcmVxdWVzdCBtYXkgbm90IGJlIHN0YXJ0ZWQgdW50aWwge3Jlc3BvbnNlLWhlYWRlcnMtcmVhZH0KKyAgLS0gYSByZXNwb25zZSBbb2JqZWN0XSBjYW5ub3QgYmUgcmV0cmlldmVkIHVudGlsIHtyZXF1ZXN0LXNlbnR9CisgIC0tIHRoZXJlIGlzIG5vIGRpZmZlcmVudGlhdGlvbiBiZXR3ZWVuIGFuIHVucmVhZCByZXNwb25zZSBib2R5IGFuZCBhCisgICAgIHBhcnRpYWxseSByZWFkIHJlc3BvbnNlIGJvZHkKKworTm90ZTogdGhpcyBlbmZvcmNlbWVudCBpcyBhcHBsaWVkIGJ5IHRoZSBIVFRQQ29ubmVjdGlvbiBjbGFzcy4gVGhlCisgICAgICBIVFRQUmVzcG9uc2UgY2xhc3MgZG9lcyBub3QgZW5mb3JjZSB0aGlzIHN0YXRlIG1hY2hpbmUsIHdoaWNoCisgICAgICBpbXBsaWVzIHNvcGhpc3RpY2F0ZWQgY2xpZW50cyBtYXkgYWNjZWxlcmF0ZSB0aGUgcmVxdWVzdC9yZXNwb25zZQorICAgICAgcGlwZWxpbmUuIENhdXRpb24gc2hvdWxkIGJlIHRha2VuLCB0aG91Z2g6IGFjY2VsZXJhdGluZyB0aGUgc3RhdGVzCisgICAgICBiZXlvbmQgdGhlIGFib3ZlIHBhdHRlcm4gbWF5IGltcGx5IGtub3dsZWRnZSBvZiB0aGUgc2VydmVyJ3MKKyAgICAgIGNvbm5lY3Rpb24tY2xvc2UgYmVoYXZpb3IgZm9yIGNlcnRhaW4gcmVxdWVzdHMuIEZvciBleGFtcGxlLCBpdAorICAgICAgaXMgaW1wb3NzaWJsZSB0byB0ZWxsIHdoZXRoZXIgdGhlIHNlcnZlciB3aWxsIGNsb3NlIHRoZSBjb25uZWN0aW9uCisgICAgICBVTlRJTCB0aGUgcmVzcG9uc2UgaGVhZGVycyBoYXZlIGJlZW4gcmVhZDsgdGhpcyBtZWFucyB0aGF0IGZ1cnRoZXIKKyAgICAgIHJlcXVlc3RzIGNhbm5vdCBiZSBwbGFjZWQgaW50byB0aGUgcGlwZWxpbmUgdW50aWwgaXQgaXMga25vd24gdGhhdAorICAgICAgdGhlIHNlcnZlciB3aWxsIE5PVCBiZSBjbG9zaW5nIHRoZSBjb25uZWN0aW9uLgorCitMb2dpY2FsIFN0YXRlICAgICAgICAgICAgICAgICAgX19zdGF0ZSAgICAgICAgICAgIF9fcmVzcG9uc2UKKy0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAtLS0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLQorSWRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DU19JRExFICAgICAgICAgICBOb25lCitSZXF1ZXN0LXN0YXJ0ZWQgICAgICAgICAgICAgICAgX0NTX1JFUV9TVEFSVEVEICAgIE5vbmUKK1JlcXVlc3Qtc2VudCAgICAgICAgICAgICAgICAgICBfQ1NfUkVRX1NFTlQgICAgICAgTm9uZQorVW5yZWFkLXJlc3BvbnNlICAgICAgICAgICAgICAgIF9DU19JRExFICAgICAgICAgICA8cmVzcG9uc2VfY2xhc3M+CitSZXEtc3RhcnRlZC11bnJlYWQtcmVzcG9uc2UgICAgX0NTX1JFUV9TVEFSVEVEICAgIDxyZXNwb25zZV9jbGFzcz4KK1JlcS1zZW50LXVucmVhZC1yZXNwb25zZSAgICAgICBfQ1NfUkVRX1NFTlQgICAgICAgPHJlc3BvbnNlX2NsYXNzPgorIiIiCisKK2Zyb20gYXJyYXkgaW1wb3J0IGFycmF5CitpbXBvcnQgb3MKK2ltcG9ydCBzb2NrZXQKK2Zyb20gc3lzIGltcG9ydCBweTNrd2FybmluZworZnJvbSB1cmxwYXJzZSBpbXBvcnQgdXJsc3BsaXQKK2ltcG9ydCB3YXJuaW5ncword2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgIGlmIHB5M2t3YXJuaW5nOgorICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgIi4qbWltZXRvb2xzIGhhcyBiZWVuIHJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgaW1wb3J0IG1pbWV0b29scworCit0cnk6CisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworX19hbGxfXyA9IFsiSFRUUCIsICJIVFRQUmVzcG9uc2UiLCAiSFRUUENvbm5lY3Rpb24iLAorICAgICAgICAgICAiSFRUUEV4Y2VwdGlvbiIsICJOb3RDb25uZWN0ZWQiLCAiVW5rbm93blByb3RvY29sIiwKKyAgICAgICAgICAgIlVua25vd25UcmFuc2ZlckVuY29kaW5nIiwgIlVuaW1wbGVtZW50ZWRGaWxlTW9kZSIsCisgICAgICAgICAgICJJbmNvbXBsZXRlUmVhZCIsICJJbnZhbGlkVVJMIiwgIkltcHJvcGVyQ29ubmVjdGlvblN0YXRlIiwKKyAgICAgICAgICAgIkNhbm5vdFNlbmRSZXF1ZXN0IiwgIkNhbm5vdFNlbmRIZWFkZXIiLCAiUmVzcG9uc2VOb3RSZWFkeSIsCisgICAgICAgICAgICJCYWRTdGF0dXNMaW5lIiwgImVycm9yIiwgInJlc3BvbnNlcyJdCisKK0hUVFBfUE9SVCA9IDgwCitIVFRQU19QT1JUID0gNDQzCisKK19VTktOT1dOID0gJ1VOS05PV04nCisKKyMgY29ubmVjdGlvbiBzdGF0ZXMKK19DU19JRExFID0gJ0lkbGUnCitfQ1NfUkVRX1NUQVJURUQgPSAnUmVxdWVzdC1zdGFydGVkJworX0NTX1JFUV9TRU5UID0gJ1JlcXVlc3Qtc2VudCcKKworIyBzdGF0dXMgY29kZXMKKyMgaW5mb3JtYXRpb25hbAorQ09OVElOVUUgPSAxMDAKK1NXSVRDSElOR19QUk9UT0NPTFMgPSAxMDEKK1BST0NFU1NJTkcgPSAxMDIKKworIyBzdWNjZXNzZnVsCitPSyA9IDIwMAorQ1JFQVRFRCA9IDIwMQorQUNDRVBURUQgPSAyMDIKK05PTl9BVVRIT1JJVEFUSVZFX0lORk9STUFUSU9OID0gMjAzCitOT19DT05URU5UID0gMjA0CitSRVNFVF9DT05URU5UID0gMjA1CitQQVJUSUFMX0NPTlRFTlQgPSAyMDYKK01VTFRJX1NUQVRVUyA9IDIwNworSU1fVVNFRCA9IDIyNgorCisjIHJlZGlyZWN0aW9uCitNVUxUSVBMRV9DSE9JQ0VTID0gMzAwCitNT1ZFRF9QRVJNQU5FTlRMWSA9IDMwMQorRk9VTkQgPSAzMDIKK1NFRV9PVEhFUiA9IDMwMworTk9UX01PRElGSUVEID0gMzA0CitVU0VfUFJPWFkgPSAzMDUKK1RFTVBPUkFSWV9SRURJUkVDVCA9IDMwNworCisjIGNsaWVudCBlcnJvcgorQkFEX1JFUVVFU1QgPSA0MDAKK1VOQVVUSE9SSVpFRCA9IDQwMQorUEFZTUVOVF9SRVFVSVJFRCA9IDQwMgorRk9SQklEREVOID0gNDAzCitOT1RfRk9VTkQgPSA0MDQKK01FVEhPRF9OT1RfQUxMT1dFRCA9IDQwNQorTk9UX0FDQ0VQVEFCTEUgPSA0MDYKK1BST1hZX0FVVEhFTlRJQ0FUSU9OX1JFUVVJUkVEID0gNDA3CitSRVFVRVNUX1RJTUVPVVQgPSA0MDgKK0NPTkZMSUNUID0gNDA5CitHT05FID0gNDEwCitMRU5HVEhfUkVRVUlSRUQgPSA0MTEKK1BSRUNPTkRJVElPTl9GQUlMRUQgPSA0MTIKK1JFUVVFU1RfRU5USVRZX1RPT19MQVJHRSA9IDQxMworUkVRVUVTVF9VUklfVE9PX0xPTkcgPSA0MTQKK1VOU1VQUE9SVEVEX01FRElBX1RZUEUgPSA0MTUKK1JFUVVFU1RFRF9SQU5HRV9OT1RfU0FUSVNGSUFCTEUgPSA0MTYKK0VYUEVDVEFUSU9OX0ZBSUxFRCA9IDQxNworVU5QUk9DRVNTQUJMRV9FTlRJVFkgPSA0MjIKK0xPQ0tFRCA9IDQyMworRkFJTEVEX0RFUEVOREVOQ1kgPSA0MjQKK1VQR1JBREVfUkVRVUlSRUQgPSA0MjYKKworIyBzZXJ2ZXIgZXJyb3IKK0lOVEVSTkFMX1NFUlZFUl9FUlJPUiA9IDUwMAorTk9UX0lNUExFTUVOVEVEID0gNTAxCitCQURfR0FURVdBWSA9IDUwMgorU0VSVklDRV9VTkFWQUlMQUJMRSA9IDUwMworR0FURVdBWV9USU1FT1VUID0gNTA0CitIVFRQX1ZFUlNJT05fTk9UX1NVUFBPUlRFRCA9IDUwNQorSU5TVUZGSUNJRU5UX1NUT1JBR0UgPSA1MDcKK05PVF9FWFRFTkRFRCA9IDUxMAorCisjIE1hcHBpbmcgc3RhdHVzIGNvZGVzIHRvIG9mZmljaWFsIFczQyBuYW1lcworcmVzcG9uc2VzID0geworICAgIDEwMDogJ0NvbnRpbnVlJywKKyAgICAxMDE6ICdTd2l0Y2hpbmcgUHJvdG9jb2xzJywKKworICAgIDIwMDogJ09LJywKKyAgICAyMDE6ICdDcmVhdGVkJywKKyAgICAyMDI6ICdBY2NlcHRlZCcsCisgICAgMjAzOiAnTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24nLAorICAgIDIwNDogJ05vIENvbnRlbnQnLAorICAgIDIwNTogJ1Jlc2V0IENvbnRlbnQnLAorICAgIDIwNjogJ1BhcnRpYWwgQ29udGVudCcsCisKKyAgICAzMDA6ICdNdWx0aXBsZSBDaG9pY2VzJywKKyAgICAzMDE6ICdNb3ZlZCBQZXJtYW5lbnRseScsCisgICAgMzAyOiAnRm91bmQnLAorICAgIDMwMzogJ1NlZSBPdGhlcicsCisgICAgMzA0OiAnTm90IE1vZGlmaWVkJywKKyAgICAzMDU6ICdVc2UgUHJveHknLAorICAgIDMwNjogJyhVbnVzZWQpJywKKyAgICAzMDc6ICdUZW1wb3JhcnkgUmVkaXJlY3QnLAorCisgICAgNDAwOiAnQmFkIFJlcXVlc3QnLAorICAgIDQwMTogJ1VuYXV0aG9yaXplZCcsCisgICAgNDAyOiAnUGF5bWVudCBSZXF1aXJlZCcsCisgICAgNDAzOiAnRm9yYmlkZGVuJywKKyAgICA0MDQ6ICdOb3QgRm91bmQnLAorICAgIDQwNTogJ01ldGhvZCBOb3QgQWxsb3dlZCcsCisgICAgNDA2OiAnTm90IEFjY2VwdGFibGUnLAorICAgIDQwNzogJ1Byb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkJywKKyAgICA0MDg6ICdSZXF1ZXN0IFRpbWVvdXQnLAorICAgIDQwOTogJ0NvbmZsaWN0JywKKyAgICA0MTA6ICdHb25lJywKKyAgICA0MTE6ICdMZW5ndGggUmVxdWlyZWQnLAorICAgIDQxMjogJ1ByZWNvbmRpdGlvbiBGYWlsZWQnLAorICAgIDQxMzogJ1JlcXVlc3QgRW50aXR5IFRvbyBMYXJnZScsCisgICAgNDE0OiAnUmVxdWVzdC1VUkkgVG9vIExvbmcnLAorICAgIDQxNTogJ1Vuc3VwcG9ydGVkIE1lZGlhIFR5cGUnLAorICAgIDQxNjogJ1JlcXVlc3RlZCBSYW5nZSBOb3QgU2F0aXNmaWFibGUnLAorICAgIDQxNzogJ0V4cGVjdGF0aW9uIEZhaWxlZCcsCisKKyAgICA1MDA6ICdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLAorICAgIDUwMTogJ05vdCBJbXBsZW1lbnRlZCcsCisgICAgNTAyOiAnQmFkIEdhdGV3YXknLAorICAgIDUwMzogJ1NlcnZpY2UgVW5hdmFpbGFibGUnLAorICAgIDUwNDogJ0dhdGV3YXkgVGltZW91dCcsCisgICAgNTA1OiAnSFRUUCBWZXJzaW9uIE5vdCBTdXBwb3J0ZWQnLAorfQorCisjIG1heGltYWwgYW1vdW50IG9mIGRhdGEgdG8gcmVhZCBhdCBvbmUgdGltZSBpbiBfc2FmZV9yZWFkCitNQVhBTU9VTlQgPSAxMDQ4NTc2CisKKyMgbWF4aW1hbCBsaW5lIGxlbmd0aCB3aGVuIGNhbGxpbmcgcmVhZGxpbmUoKS4KK19NQVhMSU5FID0gNjU1MzYKKworY2xhc3MgSFRUUE1lc3NhZ2UobWltZXRvb2xzLk1lc3NhZ2UpOgorCisgICAgZGVmIGFkZGhlYWRlcihzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgIiIiQWRkIGhlYWRlciBmb3IgZmllbGQga2V5IGhhbmRsaW5nIHJlcGVhdHMuIiIiCisgICAgICAgIHByZXYgPSBzZWxmLmRpY3QuZ2V0KGtleSkKKyAgICAgICAgaWYgcHJldiBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5kaWN0W2tleV0gPSB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29tYmluZWQgPSAiLCAiLmpvaW4oKHByZXYsIHZhbHVlKSkKKyAgICAgICAgICAgIHNlbGYuZGljdFtrZXldID0gY29tYmluZWQKKworICAgIGRlZiBhZGRjb250aW51ZShzZWxmLCBrZXksIG1vcmUpOgorICAgICAgICAiIiJBZGQgbW9yZSBmaWVsZCBkYXRhIGZyb20gYSBjb250aW51YXRpb24gbGluZS4iIiIKKyAgICAgICAgcHJldiA9IHNlbGYuZGljdFtrZXldCisgICAgICAgIHNlbGYuZGljdFtrZXldID0gcHJldiArICJcbiAiICsgbW9yZQorCisgICAgZGVmIHJlYWRoZWFkZXJzKHNlbGYpOgorICAgICAgICAiIiJSZWFkIGhlYWRlciBsaW5lcy4KKworICAgICAgICBSZWFkIGhlYWRlciBsaW5lcyB1cCB0byB0aGUgZW50aXJlbHkgYmxhbmsgbGluZSB0aGF0IHRlcm1pbmF0ZXMgdGhlbS4KKyAgICAgICAgVGhlIChub3JtYWxseSBibGFuaykgbGluZSB0aGF0IGVuZHMgdGhlIGhlYWRlcnMgaXMgc2tpcHBlZCwgYnV0IG5vdAorICAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuZWQgbGlzdC4gIElmIGEgbm9uLWhlYWRlciBsaW5lIGVuZHMgdGhlIGhlYWRlcnMsCisgICAgICAgICh3aGljaCBpcyBhbiBlcnJvciksIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBiYWNrc3BhY2Ugb3ZlciBpdDsgaXQgaXMKKyAgICAgICAgbmV2ZXIgaW5jbHVkZWQgaW4gdGhlIHJldHVybmVkIGxpc3QuCisKKyAgICAgICAgVGhlIHZhcmlhYmxlIHNlbGYuc3RhdHVzIGlzIHNldCB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIGFsbCB3ZW50IHdlbGwsCisgICAgICAgIG90aGVyd2lzZSBpdCBpcyBhbiBlcnJvciBtZXNzYWdlLiAgVGhlIHZhcmlhYmxlIHNlbGYuaGVhZGVycyBpcyBhCisgICAgICAgIGNvbXBsZXRlbHkgdW5pbnRlcnByZXRlZCBsaXN0IG9mIGxpbmVzIGNvbnRhaW5lZCBpbiB0aGUgaGVhZGVyIChzbworICAgICAgICBwcmludGluZyB0aGVtIHdpbGwgcmVwcm9kdWNlIHRoZSBoZWFkZXIgZXhhY3RseSBhcyBpdCBhcHBlYXJzIGluIHRoZQorICAgICAgICBmaWxlKS4KKworICAgICAgICBJZiBtdWx0aXBsZSBoZWFkZXIgZmllbGRzIHdpdGggdGhlIHNhbWUgbmFtZSBvY2N1ciwgdGhleSBhcmUgY29tYmluZWQKKyAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBpbiBSRkMgMjYxNiBzZWMgNC4yOgorCisgICAgICAgIEFwcGVuZGluZyBlYWNoIHN1YnNlcXVlbnQgZmllbGQtdmFsdWUgdG8gdGhlIGZpcnN0LCBlYWNoIHNlcGFyYXRlZAorICAgICAgICBieSBhIGNvbW1hLiBUaGUgb3JkZXIgaW4gd2hpY2ggaGVhZGVyIGZpZWxkcyB3aXRoIHRoZSBzYW1lIGZpZWxkLW5hbWUKKyAgICAgICAgYXJlIHJlY2VpdmVkIGlzIHNpZ25pZmljYW50IHRvIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgY29tYmluZWQKKyAgICAgICAgZmllbGQgdmFsdWUuCisgICAgICAgICIiIgorICAgICAgICAjIFhYWCBUaGUgaW1wbGVtZW50YXRpb24gb3ZlcnJpZGVzIHRoZSByZWFkaGVhZGVycygpIG1ldGhvZCBvZgorICAgICAgICAjIHJmYzgyMi5NZXNzYWdlLiAgVGhlIGJhc2UgY2xhc3MgZGVzaWduIGlzbid0IGFtZW5hYmxlIHRvCisgICAgICAgICMgY3VzdG9taXplZCBiZWhhdmlvciBoZXJlIHNvIHRoZSBtZXRob2QgaGVyZSBpcyBhIGNvcHkgb2YgdGhlCisgICAgICAgICMgYmFzZSBjbGFzcyBjb2RlIHdpdGggYSBmZXcgc21hbGwgY2hhbmdlcy4KKworICAgICAgICBzZWxmLmRpY3QgPSB7fQorICAgICAgICBzZWxmLnVuaXhmcm9tID0gJycKKyAgICAgICAgc2VsZi5oZWFkZXJzID0gaGxpc3QgPSBbXQorICAgICAgICBzZWxmLnN0YXR1cyA9ICcnCisgICAgICAgIGhlYWRlcnNlZW4gPSAiIgorICAgICAgICBmaXJzdGxpbmUgPSAxCisgICAgICAgIHN0YXJ0b2ZsaW5lID0gdW5yZWFkID0gdGVsbCA9IE5vbmUKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLmZwLCAndW5yZWFkJyk6CisgICAgICAgICAgICB1bnJlYWQgPSBzZWxmLmZwLnVucmVhZAorICAgICAgICBlbGlmIHNlbGYuc2Vla2FibGU6CisgICAgICAgICAgICB0ZWxsID0gc2VsZi5mcC50ZWxsCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiB0ZWxsOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRvZmxpbmUgPSB0ZWxsKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRvZmxpbmUgPSB0ZWxsID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlZWthYmxlID0gMAorICAgICAgICAgICAgbGluZSA9IHNlbGYuZnAucmVhZGxpbmUoX01BWExJTkUgKyAxKQorICAgICAgICAgICAgaWYgbGVuKGxpbmUpID4gX01BWExJTkU6CisgICAgICAgICAgICAgICAgcmFpc2UgTGluZVRvb0xvbmcoImhlYWRlciBsaW5lIikKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gJ0VPRiBpbiBoZWFkZXJzJworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAjIFNraXAgdW5peCBGcm9tIG5hbWUgdGltZSBsaW5lcworICAgICAgICAgICAgaWYgZmlyc3RsaW5lIGFuZCBsaW5lLnN0YXJ0c3dpdGgoJ0Zyb20gJyk6CisgICAgICAgICAgICAgICAgc2VsZi51bml4ZnJvbSA9IHNlbGYudW5peGZyb20gKyBsaW5lCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZpcnN0bGluZSA9IDAKKyAgICAgICAgICAgIGlmIGhlYWRlcnNlZW4gYW5kIGxpbmVbMF0gaW4gJyBcdCc6CisgICAgICAgICAgICAgICAgIyBYWFggTm90IHN1cmUgaWYgY29udGludWF0aW9uIGxpbmVzIGFyZSBoYW5kbGVkIHByb3Blcmx5CisgICAgICAgICAgICAgICAgIyBmb3IgaHR0cCBhbmQvb3IgZm9yIHJlcGVhdGluZyBoZWFkZXJzCisgICAgICAgICAgICAgICAgIyBJdCdzIGEgY29udGludWF0aW9uIGxpbmUuCisgICAgICAgICAgICAgICAgaGxpc3QuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi5hZGRjb250aW51ZShoZWFkZXJzZWVuLCBsaW5lLnN0cmlwKCkpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgc2VsZi5pc2NvbW1lbnQobGluZSk6CisgICAgICAgICAgICAgICAgIyBJdCdzIGEgY29tbWVudC4gIElnbm9yZSBpdC4KKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBzZWxmLmlzbGFzdChsaW5lKToKKyAgICAgICAgICAgICAgICAjIE5vdGUhIE5vIHB1c2hiYWNrIGhlcmUhICBUaGUgZGVsaW1pdGVyIGxpbmUgZ2V0cyBlYXRlbi4KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaGVhZGVyc2VlbiA9IHNlbGYuaXNoZWFkZXIobGluZSkKKyAgICAgICAgICAgIGlmIGhlYWRlcnNlZW46CisgICAgICAgICAgICAgICAgIyBJdCdzIGEgbGVnYWwgaGVhZGVyIGxpbmUsIHNhdmUgaXQuCisgICAgICAgICAgICAgICAgaGxpc3QuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi5hZGRoZWFkZXIoaGVhZGVyc2VlbiwgbGluZVtsZW4oaGVhZGVyc2VlbikrMTpdLnN0cmlwKCkpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBJdCdzIG5vdCBhIGhlYWRlciBsaW5lOyB0aHJvdyBpdCBiYWNrIGFuZCBzdG9wIGhlcmUuCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZGljdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSAnTm8gaGVhZGVycycKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9ICdOb24taGVhZGVyIGxpbmUgd2hlcmUgaGVhZGVyIGV4cGVjdGVkJworICAgICAgICAgICAgICAgICMgVHJ5IHRvIHVuZG8gdGhlIHJlYWQuCisgICAgICAgICAgICAgICAgaWYgdW5yZWFkOgorICAgICAgICAgICAgICAgICAgICB1bnJlYWQobGluZSkKKyAgICAgICAgICAgICAgICBlbGlmIHRlbGw6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAuc2VlayhzdGFydG9mbGluZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IHNlbGYuc3RhdHVzICsgJzsgYmFkIHNlZWsnCisgICAgICAgICAgICAgICAgYnJlYWsKKworY2xhc3MgSFRUUFJlc3BvbnNlOgorCisgICAgIyBzdHJpY3Q6IElmIHRydWUsIHJhaXNlIEJhZFN0YXR1c0xpbmUgaWYgdGhlIHN0YXR1cyBsaW5lIGNhbid0IGJlCisgICAgIyBwYXJzZWQgYXMgYSB2YWxpZCBIVFRQLzEuMCBvciAxLjEgc3RhdHVzIGxpbmUuICBCeSBkZWZhdWx0IGl0IGlzCisgICAgIyBmYWxzZSBiZWNhdXNlIGl0IHByZXZlbnRzIGNsaWVudHMgZnJvbSB0YWxraW5nIHRvIEhUVFAvMC45CisgICAgIyBzZXJ2ZXJzLiAgTm90ZSB0aGF0IGEgcmVzcG9uc2Ugd2l0aCBhIHN1ZmZpY2llbnRseSBjb3JydXB0ZWQKKyAgICAjIHN0YXR1cyBsaW5lIHdpbGwgbG9vayBsaWtlIGFuIEhUVFAvMC45IHJlc3BvbnNlLgorCisgICAgIyBTZWUgUkZDIDI2MTYgc2VjIDE5LjYgYW5kIFJGQyAxOTQ1IHNlYyA2IGZvciBkZXRhaWxzLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2ssIGRlYnVnbGV2ZWw9MCwgc3RyaWN0PTAsIG1ldGhvZD1Ob25lLCBidWZmZXJpbmc9RmFsc2UpOgorICAgICAgICBpZiBidWZmZXJpbmc6CisgICAgICAgICAgICAjIFRoZSBjYWxsZXIgd29uJ3QgYmUgdXNpbmcgYW55IHNvY2sucmVjdigpIGNhbGxzLCBzbyBidWZmZXJpbmcKKyAgICAgICAgICAgICMgaXMgZmluZSBhbmQgcmVjb21tZW5kZWQgZm9yIHBlcmZvcm1hbmNlLgorICAgICAgICAgICAgc2VsZi5mcCA9IHNvY2subWFrZWZpbGUoJ3JiJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVGhlIGJ1ZmZlciBzaXplIGlzIHNwZWNpZmllZCBhcyB6ZXJvLCBiZWNhdXNlIHRoZSBoZWFkZXJzIG9mCisgICAgICAgICAgICAjIHRoZSByZXNwb25zZSBhcmUgcmVhZCB3aXRoIHJlYWRsaW5lKCkuICBJZiB0aGUgcmVhZHMgd2VyZQorICAgICAgICAgICAgIyBidWZmZXJlZCB0aGUgcmVhZGxpbmUoKSBjYWxscyBjb3VsZCBjb25zdW1lIHNvbWUgb2YgdGhlCisgICAgICAgICAgICAjIHJlc3BvbnNlLCB3aGljaCBtYWtlIGJlIHJlYWQgdmlhIGEgcmVjdigpIG9uIHRoZSB1bmRlcmx5aW5nCisgICAgICAgICAgICAjIHNvY2tldC4KKyAgICAgICAgICAgIHNlbGYuZnAgPSBzb2NrLm1ha2VmaWxlKCdyYicsIDApCisgICAgICAgIHNlbGYuZGVidWdsZXZlbCA9IGRlYnVnbGV2ZWwKKyAgICAgICAgc2VsZi5zdHJpY3QgPSBzdHJpY3QKKyAgICAgICAgc2VsZi5fbWV0aG9kID0gbWV0aG9kCisKKyAgICAgICAgc2VsZi5tc2cgPSBOb25lCisKKyAgICAgICAgIyBmcm9tIHRoZSBTdGF0dXMtTGluZSBvZiB0aGUgcmVzcG9uc2UKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gX1VOS05PV04gIyBIVFRQLVZlcnNpb24KKyAgICAgICAgc2VsZi5zdGF0dXMgPSBfVU5LTk9XTiAgIyBTdGF0dXMtQ29kZQorICAgICAgICBzZWxmLnJlYXNvbiA9IF9VTktOT1dOICAjIFJlYXNvbi1QaHJhc2UKKworICAgICAgICBzZWxmLmNodW5rZWQgPSBfVU5LTk9XTiAgICAgICAgICMgaXMgImNodW5rZWQiIGJlaW5nIHVzZWQ/CisgICAgICAgIHNlbGYuY2h1bmtfbGVmdCA9IF9VTktOT1dOICAgICAgIyBieXRlcyBsZWZ0IHRvIHJlYWQgaW4gY3VycmVudCBjaHVuaworICAgICAgICBzZWxmLmxlbmd0aCA9IF9VTktOT1dOICAgICAgICAgICMgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgaW4gcmVzcG9uc2UKKyAgICAgICAgc2VsZi53aWxsX2Nsb3NlID0gX1VOS05PV04gICAgICAjIGNvbm4gd2lsbCBjbG9zZSBhdCBlbmQgb2YgcmVzcG9uc2UKKworICAgIGRlZiBfcmVhZF9zdGF0dXMoc2VsZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSB3aXRoIFNpbXBsZS1SZXNwb25zZSBkZWZhdWx0cworICAgICAgICBsaW5lID0gc2VsZi5mcC5yZWFkbGluZShfTUFYTElORSArIDEpCisgICAgICAgIGlmIGxlbihsaW5lKSA+IF9NQVhMSU5FOgorICAgICAgICAgICAgcmFpc2UgTGluZVRvb0xvbmcoImhlYWRlciBsaW5lIikKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgIHByaW50ICJyZXBseToiLCByZXByKGxpbmUpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgIyBQcmVzdW1hYmx5LCB0aGUgc2VydmVyIGNsb3NlZCB0aGUgY29ubmVjdGlvbiBiZWZvcmUKKyAgICAgICAgICAgICMgc2VuZGluZyBhIHZhbGlkIHJlc3BvbnNlLgorICAgICAgICAgICAgcmFpc2UgQmFkU3RhdHVzTGluZShsaW5lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBbdmVyc2lvbiwgc3RhdHVzLCByZWFzb25dID0gbGluZS5zcGxpdChOb25lLCAyKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBbdmVyc2lvbiwgc3RhdHVzXSA9IGxpbmUuc3BsaXQoTm9uZSwgMSkKKyAgICAgICAgICAgICAgICByZWFzb24gPSAiIgorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBlbXB0eSB2ZXJzaW9uIHdpbGwgY2F1c2UgbmV4dCB0ZXN0IHRvIGZhaWwgYW5kIHN0YXR1cworICAgICAgICAgICAgICAgICMgd2lsbCBiZSB0cmVhdGVkIGFzIDAuOSByZXNwb25zZS4KKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gIiIKKyAgICAgICAgaWYgbm90IHZlcnNpb24uc3RhcnRzd2l0aCgnSFRUUC8nKToKKyAgICAgICAgICAgIGlmIHNlbGYuc3RyaWN0OgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJhaXNlIEJhZFN0YXR1c0xpbmUobGluZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBhc3N1bWUgaXQncyBhIFNpbXBsZS1SZXNwb25zZSBmcm9tIGFuIDAuOSBzZXJ2ZXIKKyAgICAgICAgICAgICAgICBzZWxmLmZwID0gTGluZUFuZEZpbGVXcmFwcGVyKGxpbmUsIHNlbGYuZnApCisgICAgICAgICAgICAgICAgcmV0dXJuICJIVFRQLzAuOSIsIDIwMCwgIiIKKworICAgICAgICAjIFRoZSBzdGF0dXMgY29kZSBpcyBhIHRocmVlLWRpZ2l0IG51bWJlcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdGF0dXMgPSBpbnQoc3RhdHVzKQorICAgICAgICAgICAgaWYgc3RhdHVzIDwgMTAwIG9yIHN0YXR1cyA+IDk5OToKKyAgICAgICAgICAgICAgICByYWlzZSBCYWRTdGF0dXNMaW5lKGxpbmUpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgQmFkU3RhdHVzTGluZShsaW5lKQorICAgICAgICByZXR1cm4gdmVyc2lvbiwgc3RhdHVzLCByZWFzb24KKworICAgIGRlZiBiZWdpbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5tc2cgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIHdlJ3ZlIGFscmVhZHkgc3RhcnRlZCByZWFkaW5nIHRoZSByZXNwb25zZQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyByZWFkIHVudGlsIHdlIGdldCBhIG5vbi0xMDAgcmVzcG9uc2UKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHZlcnNpb24sIHN0YXR1cywgcmVhc29uID0gc2VsZi5fcmVhZF9zdGF0dXMoKQorICAgICAgICAgICAgaWYgc3RhdHVzICE9IENPTlRJTlVFOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAjIHNraXAgdGhlIGhlYWRlciBmcm9tIHRoZSAxMDAgcmVzcG9uc2UKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgc2tpcCA9IHNlbGYuZnAucmVhZGxpbmUoX01BWExJTkUgKyAxKQorICAgICAgICAgICAgICAgIGlmIGxlbihza2lwKSA+IF9NQVhMSU5FOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBMaW5lVG9vTG9uZygiaGVhZGVyIGxpbmUiKQorICAgICAgICAgICAgICAgIHNraXAgPSBza2lwLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2tpcDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiaGVhZGVyOiIsIHNraXAKKworICAgICAgICBzZWxmLnN0YXR1cyA9IHN0YXR1cworICAgICAgICBzZWxmLnJlYXNvbiA9IHJlYXNvbi5zdHJpcCgpCisgICAgICAgIGlmIHZlcnNpb24gPT0gJ0hUVFAvMS4wJzoKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9IDEwCisgICAgICAgIGVsaWYgdmVyc2lvbi5zdGFydHN3aXRoKCdIVFRQLzEuJyk6CisgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSAxMSAgICMgdXNlIEhUVFAvMS4xIGNvZGUgZm9yIEhUVFAvMS54IHdoZXJlIHg+PTEKKyAgICAgICAgZWxpZiB2ZXJzaW9uID09ICdIVFRQLzAuOSc6CisgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSA5CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBVbmtub3duUHJvdG9jb2wodmVyc2lvbikKKworICAgICAgICBpZiBzZWxmLnZlcnNpb24gPT0gOToKKyAgICAgICAgICAgIHNlbGYubGVuZ3RoID0gTm9uZQorICAgICAgICAgICAgc2VsZi5jaHVua2VkID0gMAorICAgICAgICAgICAgc2VsZi53aWxsX2Nsb3NlID0gMQorICAgICAgICAgICAgc2VsZi5tc2cgPSBIVFRQTWVzc2FnZShTdHJpbmdJTygpKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5tc2cgPSBIVFRQTWVzc2FnZShzZWxmLmZwLCAwKQorICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgZm9yIGhkciBpbiBzZWxmLm1zZy5oZWFkZXJzOgorICAgICAgICAgICAgICAgIHByaW50ICJoZWFkZXI6IiwgaGRyLAorCisgICAgICAgICMgZG9uJ3QgbGV0IHRoZSBtc2cga2VlcCBhbiBmcAorICAgICAgICBzZWxmLm1zZy5mcCA9IE5vbmUKKworICAgICAgICAjIGFyZSB3ZSB1c2luZyB0aGUgY2h1bmtlZC1zdHlsZSBvZiB0cmFuc2ZlciBlbmNvZGluZz8KKyAgICAgICAgdHJfZW5jID0gc2VsZi5tc2cuZ2V0aGVhZGVyKCd0cmFuc2Zlci1lbmNvZGluZycpCisgICAgICAgIGlmIHRyX2VuYyBhbmQgdHJfZW5jLmxvd2VyKCkgPT0gImNodW5rZWQiOgorICAgICAgICAgICAgc2VsZi5jaHVua2VkID0gMQorICAgICAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jaHVua2VkID0gMAorCisgICAgICAgICMgd2lsbCB0aGUgY29ubmVjdGlvbiBjbG9zZSBhdCB0aGUgZW5kIG9mIHRoZSByZXNwb25zZT8KKyAgICAgICAgc2VsZi53aWxsX2Nsb3NlID0gc2VsZi5fY2hlY2tfY2xvc2UoKQorCisgICAgICAgICMgZG8gd2UgaGF2ZSBhIENvbnRlbnQtTGVuZ3RoPworICAgICAgICAjIE5PVEU6IFJGQyAyNjE2LCBTNC40LCAjMyBzYXlzIHdlIGlnbm9yZSB0aGlzIGlmIHRyX2VuYyBpcyAiY2h1bmtlZCIKKyAgICAgICAgbGVuZ3RoID0gc2VsZi5tc2cuZ2V0aGVhZGVyKCdjb250ZW50LWxlbmd0aCcpCisgICAgICAgIGlmIGxlbmd0aCBhbmQgbm90IHNlbGYuY2h1bmtlZDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmxlbmd0aCA9IGludChsZW5ndGgpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmxlbmd0aCA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5sZW5ndGggPCAwOiAgIyBpZ25vcmUgbm9uc2Vuc2ljYWwgbmVnYXRpdmUgbGVuZ3RocworICAgICAgICAgICAgICAgICAgICBzZWxmLmxlbmd0aCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubGVuZ3RoID0gTm9uZQorCisgICAgICAgICMgZG9lcyB0aGUgYm9keSBoYXZlIGEgZml4ZWQgbGVuZ3RoPyAob2YgemVybykKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19DT05URU5UIG9yIHN0YXR1cyA9PSBOT1RfTU9ESUZJRUQgb3IKKyAgICAgICAgICAgIDEwMCA8PSBzdGF0dXMgPCAyMDAgb3IgICAgICAjIDF4eCBjb2RlcworICAgICAgICAgICAgc2VsZi5fbWV0aG9kID09ICdIRUFEJyk6CisgICAgICAgICAgICBzZWxmLmxlbmd0aCA9IDAKKworICAgICAgICAjIGlmIHRoZSBjb25uZWN0aW9uIHJlbWFpbnMgb3BlbiwgYW5kIHdlIGFyZW4ndCB1c2luZyBjaHVua2VkLCBhbmQKKyAgICAgICAgIyBhIGNvbnRlbnQtbGVuZ3RoIHdhcyBub3QgcHJvdmlkZWQsIHRoZW4gYXNzdW1lIHRoYXQgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgIyBXSUxMIGNsb3NlLgorICAgICAgICBpZiBub3Qgc2VsZi53aWxsX2Nsb3NlIGFuZCBcCisgICAgICAgICAgIG5vdCBzZWxmLmNodW5rZWQgYW5kIFwKKyAgICAgICAgICAgc2VsZi5sZW5ndGggaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYud2lsbF9jbG9zZSA9IDEKKworICAgIGRlZiBfY2hlY2tfY2xvc2Uoc2VsZik6CisgICAgICAgIGNvbm4gPSBzZWxmLm1zZy5nZXRoZWFkZXIoJ2Nvbm5lY3Rpb24nKQorICAgICAgICBpZiBzZWxmLnZlcnNpb24gPT0gMTE6CisgICAgICAgICAgICAjIEFuIEhUVFAvMS4xIHByb3h5IGlzIGFzc3VtZWQgdG8gc3RheSBvcGVuIHVubGVzcworICAgICAgICAgICAgIyBleHBsaWNpdGx5IGNsb3NlZC4KKyAgICAgICAgICAgIGNvbm4gPSBzZWxmLm1zZy5nZXRoZWFkZXIoJ2Nvbm5lY3Rpb24nKQorICAgICAgICAgICAgaWYgY29ubiBhbmQgImNsb3NlIiBpbiBjb25uLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICMgU29tZSBIVFRQLzEuMCBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBzdXBwb3J0IGZvciBwZXJzaXN0ZW50CisgICAgICAgICMgY29ubmVjdGlvbnMsIHVzaW5nIHJ1bGVzIGRpZmZlcmVudCB0aGFuIEhUVFAvMS4xLgorCisgICAgICAgICMgRm9yIG9sZGVyIEhUVFAsIEtlZXAtQWxpdmUgaW5kaWNhdGVzIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4KKyAgICAgICAgaWYgc2VsZi5tc2cuZ2V0aGVhZGVyKCdrZWVwLWFsaXZlJyk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIEF0IGxlYXN0IEFrYW1haSByZXR1cm5zIGEgIkNvbm5lY3Rpb246IEtlZXAtQWxpdmUiIGhlYWRlciwKKyAgICAgICAgIyB3aGljaCB3YXMgc3VwcG9zZWQgdG8gYmUgc2VudCBieSB0aGUgY2xpZW50LgorICAgICAgICBpZiBjb25uIGFuZCAia2VlcC1hbGl2ZSIgaW4gY29ubi5sb3dlcigpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgIyBQcm94eS1Db25uZWN0aW9uIGlzIGEgbmV0c2NhcGUgaGFjay4KKyAgICAgICAgcGNvbm4gPSBzZWxmLm1zZy5nZXRoZWFkZXIoJ3Byb3h5LWNvbm5lY3Rpb24nKQorICAgICAgICBpZiBwY29ubiBhbmQgImtlZXAtYWxpdmUiIGluIHBjb25uLmxvd2VyKCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIG90aGVyd2lzZSwgYXNzdW1lIGl0IHdpbGwgY2xvc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgIHNlbGYuZnAuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5mcCA9IE5vbmUKKworICAgIGRlZiBpc2Nsb3NlZChzZWxmKToKKyAgICAgICAgIyBOT1RFOiBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIHdpbGwgbm90IGV2ZXIgY2FsbCBzZWxmLmNsb3NlKCkuIFRoaXMKKyAgICAgICAgIyAgICAgICBjYXNlIG9jY3VycyB3aGVuIHdpbGxfY2xvc2UgaXMgVFJVRSwgbGVuZ3RoIGlzIE5vbmUsIGFuZCB3ZQorICAgICAgICAjICAgICAgIHJlYWQgdXAgdG8gdGhlIGxhc3QgYnl0ZSwgYnV0IE5PVCBwYXN0IGl0LgorICAgICAgICAjCisgICAgICAgICMgSU1QTElFUzogaWYgd2lsbF9jbG9zZSBpcyBGQUxTRSwgdGhlbiBzZWxmLmNsb3NlKCkgd2lsbCBBTFdBWVMgYmUKKyAgICAgICAgIyAgICAgICAgICBjYWxsZWQsIG1lYW5pbmcgc2VsZi5pc2Nsb3NlZCgpIGlzIG1lYW5pbmdmdWwuCisgICAgICAgIHJldHVybiBzZWxmLmZwIGlzIE5vbmUKKworICAgICMgWFhYIEl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSByZWFkbGluZSBhbmQgX19pdGVyX18gZm9yIHRoaXMsIHRvby4KKworICAgIGRlZiByZWFkKHNlbGYsIGFtdD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5mcCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICcnCisKKyAgICAgICAgaWYgc2VsZi5fbWV0aG9kID09ICdIRUFEJzoKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgcmV0dXJuICcnCisKKyAgICAgICAgaWYgc2VsZi5jaHVua2VkOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfY2h1bmtlZChhbXQpCisKKyAgICAgICAgaWYgYW10IGlzIE5vbmU6CisgICAgICAgICAgICAjIHVuYm91bmRlZCByZWFkCisgICAgICAgICAgICBpZiBzZWxmLmxlbmd0aCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHMgPSBzZWxmLmZwLnJlYWQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHMgPSBzZWxmLl9zYWZlX3JlYWQoc2VsZi5sZW5ndGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IEluY29tcGxldGVSZWFkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBzZWxmLmxlbmd0aCA9IDAKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKSAgICAgICAgIyB3ZSByZWFkIGV2ZXJ5dGhpbmcKKyAgICAgICAgICAgIHJldHVybiBzCisKKyAgICAgICAgaWYgc2VsZi5sZW5ndGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBhbXQgPiBzZWxmLmxlbmd0aDoKKyAgICAgICAgICAgICAgICAjIGNsaXAgdGhlIHJlYWQgdG8gdGhlICJlbmQgb2YgcmVzcG9uc2UiCisgICAgICAgICAgICAgICAgYW10ID0gc2VsZi5sZW5ndGgKKworICAgICAgICAjIHdlIGRvIG5vdCB1c2UgX3NhZmVfcmVhZCgpIGhlcmUgYmVjYXVzZSB0aGlzIG1heSBiZSBhIC53aWxsX2Nsb3NlCisgICAgICAgICMgY29ubmVjdGlvbiwgYW5kIHRoZSB1c2VyIGlzIHJlYWRpbmcgbW9yZSBieXRlcyB0aGFuIHdpbGwgYmUgcHJvdmlkZWQKKyAgICAgICAgIyAoZm9yIGV4YW1wbGUsIHJlYWRpbmcgaW4gMWsgY2h1bmtzKQorICAgICAgICBzID0gc2VsZi5mcC5yZWFkKGFtdCkKKyAgICAgICAgaWYgbm90IHM6CisgICAgICAgICAgICAjIElkZWFsbHksIHdlIHdvdWxkIHJhaXNlIEluY29tcGxldGVSZWFkIGlmIHRoZSBjb250ZW50LWxlbmd0aAorICAgICAgICAgICAgIyB3YXNuJ3Qgc2F0aXNmaWVkLCBidXQgaXQgbWlnaHQgYnJlYWsgY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLmxlbmd0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYubGVuZ3RoIC09IGxlbihzKQorICAgICAgICAgICAgaWYgbm90IHNlbGYubGVuZ3RoOgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgX3JlYWRfY2h1bmtlZChzZWxmLCBhbXQpOgorICAgICAgICBhc3NlcnQgc2VsZi5jaHVua2VkICE9IF9VTktOT1dOCisgICAgICAgIGNodW5rX2xlZnQgPSBzZWxmLmNodW5rX2xlZnQKKyAgICAgICAgdmFsdWUgPSBbXQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgY2h1bmtfbGVmdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKF9NQVhMSU5FICsgMSkKKyAgICAgICAgICAgICAgICBpZiBsZW4obGluZSkgPiBfTUFYTElORToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTGluZVRvb0xvbmcoImNodW5rIHNpemUiKQorICAgICAgICAgICAgICAgIGkgPSBsaW5lLmZpbmQoJzsnKQorICAgICAgICAgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOmldICMgc3RyaXAgY2h1bmstZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtfbGVmdCA9IGludChsaW5lLCAxNikKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyBjbG9zZSB0aGUgY29ubmVjdGlvbiBhcyBwcm90b2NvbCBzeW5jaHJvbmlzYXRpb24gaXMKKyAgICAgICAgICAgICAgICAgICAgIyBwcm9iYWJseSBsb3N0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbmNvbXBsZXRlUmVhZCgnJy5qb2luKHZhbHVlKSkKKyAgICAgICAgICAgICAgICBpZiBjaHVua19sZWZ0ID09IDA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBhbXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoc2VsZi5fc2FmZV9yZWFkKGNodW5rX2xlZnQpKQorICAgICAgICAgICAgZWxpZiBhbXQgPCBjaHVua19sZWZ0OgorICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChzZWxmLl9zYWZlX3JlYWQoYW10KSkKKyAgICAgICAgICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBjaHVua19sZWZ0IC0gYW10CisgICAgICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4odmFsdWUpCisgICAgICAgICAgICBlbGlmIGFtdCA9PSBjaHVua19sZWZ0OgorICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChzZWxmLl9zYWZlX3JlYWQoYW10KSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zYWZlX3JlYWQoMikgICMgdG9zcyB0aGUgQ1JMRiBhdCB0aGUgZW5kIG9mIHRoZSBjaHVuaworICAgICAgICAgICAgICAgIHNlbGYuY2h1bmtfbGVmdCA9IE5vbmUKKyAgICAgICAgICAgICAgICByZXR1cm4gJycuam9pbih2YWx1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdmFsdWUuYXBwZW5kKHNlbGYuX3NhZmVfcmVhZChjaHVua19sZWZ0KSkKKyAgICAgICAgICAgICAgICBhbXQgLT0gY2h1bmtfbGVmdAorCisgICAgICAgICAgICAjIHdlIHJlYWQgdGhlIHdob2xlIGNodW5rLCBnZXQgYW5vdGhlcgorICAgICAgICAgICAgc2VsZi5fc2FmZV9yZWFkKDIpICAgICAgIyB0b3NzIHRoZSBDUkxGIGF0IHRoZSBlbmQgb2YgdGhlIGNodW5rCisgICAgICAgICAgICBjaHVua19sZWZ0ID0gTm9uZQorCisgICAgICAgICMgcmVhZCBhbmQgZGlzY2FyZCB0cmFpbGVyIHVwIHRvIHRoZSBDUkxGIHRlcm1pbmF0b3IKKyAgICAgICAgIyMjIG5vdGU6IHdlIHNob3VsZG4ndCBoYXZlIGFueSB0cmFpbGVycyEKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKF9NQVhMSU5FICsgMSkKKyAgICAgICAgICAgIGlmIGxlbihsaW5lKSA+IF9NQVhMSU5FOgorICAgICAgICAgICAgICAgIHJhaXNlIExpbmVUb29Mb25nKCJ0cmFpbGVyIGxpbmUiKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgIyBhIHZhbmlzaGluZ2x5IHNtYWxsIG51bWJlciBvZiBzaXRlcyBFT0Ygd2l0aG91dAorICAgICAgICAgICAgICAgICMgc2VuZGluZyB0aGUgdHJhaWxlcgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lID09ICdcclxuJzoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICMgd2UgcmVhZCBldmVyeXRoaW5nOyBjbG9zZSB0aGUgImZpbGUiCisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgICAgIHJldHVybiAnJy5qb2luKHZhbHVlKQorCisgICAgZGVmIF9zYWZlX3JlYWQoc2VsZiwgYW10KToKKyAgICAgICAgIiIiUmVhZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZCwgY29tcGVuc2F0aW5nIGZvciBwYXJ0aWFsIHJlYWRzLgorCisgICAgICAgIE5vcm1hbGx5LCB3ZSBoYXZlIGEgYmxvY2tpbmcgc29ja2V0LCBidXQgYSByZWFkKCkgY2FuIGJlIGludGVycnVwdGVkCisgICAgICAgIGJ5IGEgc2lnbmFsIChyZXN1bHRpbmcgaW4gYSBwYXJ0aWFsIHJlYWQpLgorCisgICAgICAgIE5vdGUgdGhhdCB3ZSBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBFT0YgYW5kIGFuIGludGVycnVwdCB3aGVuIHplcm8KKyAgICAgICAgYnl0ZXMgaGF2ZSBiZWVuIHJlYWQuIEluY29tcGxldGVSZWFkKCkgd2lsbCBiZSByYWlzZWQgaW4gdGhpcworICAgICAgICBzaXR1YXRpb24uCisKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCB3aGVuIDxhbXQ+IGJ5dGVzICJzaG91bGQiIGJlIHByZXNlbnQgZm9yCisgICAgICAgIHJlYWRpbmcuIElmIHRoZSBieXRlcyBhcmUgdHJ1bHkgbm90IGF2YWlsYWJsZSAoZHVlIHRvIEVPRiksIHRoZW4gdGhlCisgICAgICAgIEluY29tcGxldGVSZWFkIGV4Y2VwdGlvbiBjYW4gYmUgdXNlZCB0byBkZXRlY3QgdGhlIHByb2JsZW0uCisgICAgICAgICIiIgorICAgICAgICAjIE5PVEUoZ3BzKTogQXMgb2Ygc3ZuIHI3NDQyNiBzb2NrZXQuX2ZpbGVvYmplY3QucmVhZCh4KSB3aWxsIG5ldmVyCisgICAgICAgICMgcmV0dXJuIGxlc3MgdGhhbiB4IGJ5dGVzIHVubGVzcyBFT0YgaXMgZW5jb3VudGVyZWQuICBJdCBub3cgaGFuZGxlcworICAgICAgICAjIHNpZ25hbCBpbnRlcnJ1cHRpb25zIChzb2NrZXQuZXJyb3IgRUlOVFIpIGludGVybmFsbHkuICBUaGlzIGNvZGUKKyAgICAgICAgIyBuZXZlciBjYXVnaHQgdGhhdCBleGNlcHRpb24gYW55d2F5cy4gIEl0IHNlZW1zIGxhcmdlbHkgcG9pbnRsZXNzLgorICAgICAgICAjIHNlbGYuZnAucmVhZChhbXQpIHdpbGwgd29yayBmaW5lLgorICAgICAgICBzID0gW10KKyAgICAgICAgd2hpbGUgYW10ID4gMDoKKyAgICAgICAgICAgIGNodW5rID0gc2VsZi5mcC5yZWFkKG1pbihhbXQsIE1BWEFNT1VOVCkpCisgICAgICAgICAgICBpZiBub3QgY2h1bms6CisgICAgICAgICAgICAgICAgcmFpc2UgSW5jb21wbGV0ZVJlYWQoJycuam9pbihzKSwgYW10KQorICAgICAgICAgICAgcy5hcHBlbmQoY2h1bmspCisgICAgICAgICAgICBhbXQgLT0gbGVuKGNodW5rKQorICAgICAgICByZXR1cm4gJycuam9pbihzKQorCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZnAuZmlsZW5vKCkKKworICAgIGRlZiBnZXRoZWFkZXIoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5tc2cgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFJlc3BvbnNlTm90UmVhZHkoKQorICAgICAgICByZXR1cm4gc2VsZi5tc2cuZ2V0aGVhZGVyKG5hbWUsIGRlZmF1bHQpCisKKyAgICBkZWYgZ2V0aGVhZGVycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgKGhlYWRlciwgdmFsdWUpIHR1cGxlcy4iIiIKKyAgICAgICAgaWYgc2VsZi5tc2cgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFJlc3BvbnNlTm90UmVhZHkoKQorICAgICAgICByZXR1cm4gc2VsZi5tc2cuaXRlbXMoKQorCisKK2NsYXNzIEhUVFBDb25uZWN0aW9uOgorCisgICAgX2h0dHBfdnNuID0gMTEKKyAgICBfaHR0cF92c25fc3RyID0gJ0hUVFAvMS4xJworCisgICAgcmVzcG9uc2VfY2xhc3MgPSBIVFRQUmVzcG9uc2UKKyAgICBkZWZhdWx0X3BvcnQgPSBIVFRQX1BPUlQKKyAgICBhdXRvX29wZW4gPSAxCisgICAgZGVidWdsZXZlbCA9IDAKKyAgICBzdHJpY3QgPSAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydD1Ob25lLCBzdHJpY3Q9Tm9uZSwKKyAgICAgICAgICAgICAgICAgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQsIHNvdXJjZV9hZGRyZXNzPU5vbmUpOgorICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIHNlbGYuc291cmNlX2FkZHJlc3MgPSBzb3VyY2VfYWRkcmVzcworICAgICAgICBzZWxmLnNvY2sgPSBOb25lCisgICAgICAgIHNlbGYuX2J1ZmZlciA9IFtdCisgICAgICAgIHNlbGYuX19yZXNwb25zZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3N0YXRlID0gX0NTX0lETEUKKyAgICAgICAgc2VsZi5fbWV0aG9kID0gTm9uZQorICAgICAgICBzZWxmLl90dW5uZWxfaG9zdCA9IE5vbmUKKyAgICAgICAgc2VsZi5fdHVubmVsX3BvcnQgPSBOb25lCisgICAgICAgIHNlbGYuX3R1bm5lbF9oZWFkZXJzID0ge30KKworICAgICAgICBzZWxmLl9zZXRfaG9zdHBvcnQoaG9zdCwgcG9ydCkKKyAgICAgICAgaWYgc3RyaWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zdHJpY3QgPSBzdHJpY3QKKworICAgIGRlZiBzZXRfdHVubmVsKHNlbGYsIGhvc3QsIHBvcnQ9Tm9uZSwgaGVhZGVycz1Ob25lKToKKyAgICAgICAgIiIiIFNldHMgdXAgdGhlIGhvc3QgYW5kIHRoZSBwb3J0IGZvciB0aGUgSFRUUCBDT05ORUNUIFR1bm5lbGxpbmcuCisKKyAgICAgICAgVGhlIGhlYWRlcnMgYXJndW1lbnQgc2hvdWxkIGJlIGEgbWFwcGluZyBvZiBleHRyYSBIVFRQIGhlYWRlcnMKKyAgICAgICAgdG8gc2VuZCB3aXRoIHRoZSBDT05ORUNUIHJlcXVlc3QuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl90dW5uZWxfaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5fdHVubmVsX3BvcnQgPSBwb3J0CisgICAgICAgIGlmIGhlYWRlcnM6CisgICAgICAgICAgICBzZWxmLl90dW5uZWxfaGVhZGVycyA9IGhlYWRlcnMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3R1bm5lbF9oZWFkZXJzLmNsZWFyKCkKKworICAgIGRlZiBfc2V0X2hvc3Rwb3J0KHNlbGYsIGhvc3QsIHBvcnQpOgorICAgICAgICBpZiBwb3J0IGlzIE5vbmU6CisgICAgICAgICAgICBpID0gaG9zdC5yZmluZCgnOicpCisgICAgICAgICAgICBqID0gaG9zdC5yZmluZCgnXScpICAgICAgICAgIyBpcHY2IGFkZHJlc3NlcyBoYXZlIFsuLi5dCisgICAgICAgICAgICBpZiBpID4gajoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQoaG9zdFtpKzE6XSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgaG9zdFtpKzE6XSA9PSAiIjogICMgaHR0cDovL2Zvby5jb206LyA9PSBodHRwOi8vZm9vLmNvbS8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBzZWxmLmRlZmF1bHRfcG9ydAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZFVSTCgibm9ubnVtZXJpYyBwb3J0OiAnJXMnIiAlIGhvc3RbaSsxOl0pCisgICAgICAgICAgICAgICAgaG9zdCA9IGhvc3RbOmldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBvcnQgPSBzZWxmLmRlZmF1bHRfcG9ydAorICAgICAgICAgICAgaWYgaG9zdCBhbmQgaG9zdFswXSA9PSAnWycgYW5kIGhvc3RbLTFdID09ICddJzoKKyAgICAgICAgICAgICAgICBob3N0ID0gaG9zdFsxOi0xXQorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKworICAgIGRlZiBzZXRfZGVidWdsZXZlbChzZWxmLCBsZXZlbCk6CisgICAgICAgIHNlbGYuZGVidWdsZXZlbCA9IGxldmVsCisKKyAgICBkZWYgX3R1bm5lbChzZWxmKToKKyAgICAgICAgc2VsZi5fc2V0X2hvc3Rwb3J0KHNlbGYuX3R1bm5lbF9ob3N0LCBzZWxmLl90dW5uZWxfcG9ydCkKKyAgICAgICAgc2VsZi5zZW5kKCJDT05ORUNUICVzOiVkIEhUVFAvMS4wXHJcbiIgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpKQorICAgICAgICBmb3IgaGVhZGVyLCB2YWx1ZSBpbiBzZWxmLl90dW5uZWxfaGVhZGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuc2VuZCgiJXM6ICVzXHJcbiIgJSAoaGVhZGVyLCB2YWx1ZSkpCisgICAgICAgIHNlbGYuc2VuZCgiXHJcbiIpCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXNwb25zZV9jbGFzcyhzZWxmLnNvY2ssIHN0cmljdCA9IHNlbGYuc3RyaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gc2VsZi5fbWV0aG9kKQorICAgICAgICAodmVyc2lvbiwgY29kZSwgbWVzc2FnZSkgPSByZXNwb25zZS5fcmVhZF9zdGF0dXMoKQorCisgICAgICAgIGlmIGNvZGUgIT0gMjAwOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IoIlR1bm5lbCBjb25uZWN0aW9uIGZhaWxlZDogJWQgJXMiICUgKGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc3RyaXAoKSkpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBsaW5lID0gcmVzcG9uc2UuZnAucmVhZGxpbmUoX01BWExJTkUgKyAxKQorICAgICAgICAgICAgaWYgbGVuKGxpbmUpID4gX01BWExJTkU6CisgICAgICAgICAgICAgICAgcmFpc2UgTGluZVRvb0xvbmcoImhlYWRlciBsaW5lIikKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICMgZm9yIHNpdGVzIHdoaWNoIEVPRiB3aXRob3V0IHNlbmRpbmcgdHJhaWxlcgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lID09ICdcclxuJzoKKyAgICAgICAgICAgICAgICBicmVhaworCisKKyAgICBkZWYgY29ubmVjdChzZWxmKToKKyAgICAgICAgIiIiQ29ubmVjdCB0byB0aGUgaG9zdCBhbmQgcG9ydCBzcGVjaWZpZWQgaW4gX19pbml0X18uIiIiCisgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoc2VsZi5ob3N0LHNlbGYucG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRpbWVvdXQsIHNlbGYuc291cmNlX2FkZHJlc3MpCisKKyAgICAgICAgaWYgc2VsZi5fdHVubmVsX2hvc3Q6CisgICAgICAgICAgICBzZWxmLl90dW5uZWwoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgY29ubmVjdGlvbiB0byB0aGUgSFRUUCBzZXJ2ZXIuIiIiCisgICAgICAgIGlmIHNlbGYuc29jazoKKyAgICAgICAgICAgIHNlbGYuc29jay5jbG9zZSgpICAgIyBjbG9zZSBpdCBtYW51YWxseS4uLiB0aGVyZSBtYXkgYmUgb3RoZXIgcmVmcworICAgICAgICAgICAgc2VsZi5zb2NrID0gTm9uZQorICAgICAgICBpZiBzZWxmLl9fcmVzcG9uc2U6CisgICAgICAgICAgICBzZWxmLl9fcmVzcG9uc2UuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5fX3Jlc3BvbnNlID0gTm9uZQorICAgICAgICBzZWxmLl9fc3RhdGUgPSBfQ1NfSURMRQorCisgICAgZGVmIHNlbmQoc2VsZiwgZGF0YSk6CisgICAgICAgICIiIlNlbmQgYGRhdGEnIHRvIHRoZSBzZXJ2ZXIuIiIiCisgICAgICAgIGlmIHNlbGYuc29jayBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5hdXRvX29wZW46CisgICAgICAgICAgICAgICAgc2VsZi5jb25uZWN0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgTm90Q29ubmVjdGVkKCkKKworICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgcHJpbnQgInNlbmQ6IiwgcmVwcihkYXRhKQorICAgICAgICBibG9ja3NpemUgPSA4MTkyCisgICAgICAgIGlmIGhhc2F0dHIoZGF0YSwncmVhZCcpIGFuZCBub3QgaXNpbnN0YW5jZShkYXRhLCBhcnJheSk6CisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOiBwcmludCAic2VuZEluZyBhIHJlYWQoKWFibGUiCisgICAgICAgICAgICBkYXRhYmxvY2sgPSBkYXRhLnJlYWQoYmxvY2tzaXplKQorICAgICAgICAgICAgd2hpbGUgZGF0YWJsb2NrOgorICAgICAgICAgICAgICAgIHNlbGYuc29jay5zZW5kYWxsKGRhdGFibG9jaykKKyAgICAgICAgICAgICAgICBkYXRhYmxvY2sgPSBkYXRhLnJlYWQoYmxvY2tzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zb2NrLnNlbmRhbGwoZGF0YSkKKworICAgIGRlZiBfb3V0cHV0KHNlbGYsIHMpOgorICAgICAgICAiIiJBZGQgYSBsaW5lIG9mIG91dHB1dCB0byB0aGUgY3VycmVudCByZXF1ZXN0IGJ1ZmZlci4KKworICAgICAgICBBc3N1bWVzIHRoYXQgdGhlIGxpbmUgZG9lcyAqbm90KiBlbmQgd2l0aCBcXHJcXG4uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9idWZmZXIuYXBwZW5kKHMpCisKKyAgICBkZWYgX3NlbmRfb3V0cHV0KHNlbGYsIG1lc3NhZ2VfYm9keT1Ob25lKToKKyAgICAgICAgIiIiU2VuZCB0aGUgY3VycmVudGx5IGJ1ZmZlcmVkIHJlcXVlc3QgYW5kIGNsZWFyIHRoZSBidWZmZXIuCisKKyAgICAgICAgQXBwZW5kcyBhbiBleHRyYSBcXHJcXG4gdG8gdGhlIGJ1ZmZlci4KKyAgICAgICAgQSBtZXNzYWdlX2JvZHkgbWF5IGJlIHNwZWNpZmllZCwgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIHJlcXVlc3QuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9idWZmZXIuZXh0ZW5kKCgiIiwgIiIpKQorICAgICAgICBtc2cgPSAiXHJcbiIuam9pbihzZWxmLl9idWZmZXIpCisgICAgICAgIGRlbCBzZWxmLl9idWZmZXJbOl0KKyAgICAgICAgIyBJZiBtc2cgYW5kIG1lc3NhZ2VfYm9keSBhcmUgc2VudCBpbiBhIHNpbmdsZSBzZW5kKCkgY2FsbCwKKyAgICAgICAgIyBpdCB3aWxsIGF2b2lkIHBlcmZvcm1hbmNlIHByb2JsZW1zIGNhdXNlZCBieSB0aGUgaW50ZXJhY3Rpb24KKyAgICAgICAgIyBiZXR3ZWVuIGRlbGF5ZWQgYWNrIGFuZCB0aGUgTmFnbGUgYWxnb3JpdGhtLgorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2VfYm9keSwgc3RyKToKKyAgICAgICAgICAgIG1zZyArPSBtZXNzYWdlX2JvZHkKKyAgICAgICAgICAgIG1lc3NhZ2VfYm9keSA9IE5vbmUKKyAgICAgICAgc2VsZi5zZW5kKG1zZykKKyAgICAgICAgaWYgbWVzc2FnZV9ib2R5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgI21lc3NhZ2VfYm9keSB3YXMgbm90IGEgc3RyaW5nIChpLmUuIGl0IGlzIGEgZmlsZSkgYW5kCisgICAgICAgICAgICAjd2UgbXVzdCBydW4gdGhlIHJpc2sgb2YgTmFnbGUKKyAgICAgICAgICAgIHNlbGYuc2VuZChtZXNzYWdlX2JvZHkpCisKKyAgICBkZWYgcHV0cmVxdWVzdChzZWxmLCBtZXRob2QsIHVybCwgc2tpcF9ob3N0PTAsIHNraXBfYWNjZXB0X2VuY29kaW5nPTApOgorICAgICAgICAiIiJTZW5kIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyLgorCisgICAgICAgIGBtZXRob2QnIHNwZWNpZmllcyBhbiBIVFRQIHJlcXVlc3QgbWV0aG9kLCBlLmcuICdHRVQnLgorICAgICAgICBgdXJsJyBzcGVjaWZpZXMgdGhlIG9iamVjdCBiZWluZyByZXF1ZXN0ZWQsIGUuZy4gJy9pbmRleC5odG1sJy4KKyAgICAgICAgYHNraXBfaG9zdCcgaWYgVHJ1ZSBkb2VzIG5vdCBhZGQgYXV0b21hdGljYWxseSBhICdIb3N0OicgaGVhZGVyCisgICAgICAgIGBza2lwX2FjY2VwdF9lbmNvZGluZycgaWYgVHJ1ZSBkb2VzIG5vdCBhZGQgYXV0b21hdGljYWxseSBhbgorICAgICAgICAgICAnQWNjZXB0LUVuY29kaW5nOicgaGVhZGVyCisgICAgICAgICIiIgorCisgICAgICAgICMgaWYgYSBwcmlvciByZXNwb25zZSBoYXMgYmVlbiBjb21wbGV0ZWQsIHRoZW4gZm9yZ2V0IGFib3V0IGl0LgorICAgICAgICBpZiBzZWxmLl9fcmVzcG9uc2UgYW5kIHNlbGYuX19yZXNwb25zZS5pc2Nsb3NlZCgpOgorICAgICAgICAgICAgc2VsZi5fX3Jlc3BvbnNlID0gTm9uZQorCisKKyAgICAgICAgIyBpbiBjZXJ0YWluIGNhc2VzLCB3ZSBjYW5ub3QgaXNzdWUgYW5vdGhlciByZXF1ZXN0IG9uIHRoaXMgY29ubmVjdGlvbi4KKyAgICAgICAgIyB0aGlzIG9jY3VycyB3aGVuOgorICAgICAgICAjICAgMSkgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIHNlbmRpbmcgYSByZXF1ZXN0LiAgIChfQ1NfUkVRX1NUQVJURUQpCisgICAgICAgICMgICAyKSBhIHJlc3BvbnNlIHRvIGEgcHJldmlvdXMgcmVxdWVzdCBoYXMgc2lnbmFsbGVkIHRoYXQgaXQgaXMgZ29pbmcKKyAgICAgICAgIyAgICAgIHRvIGNsb3NlIHRoZSBjb25uZWN0aW9uIHVwb24gY29tcGxldGlvbi4KKyAgICAgICAgIyAgIDMpIHRoZSBoZWFkZXJzIGZvciB0aGUgcHJldmlvdXMgcmVzcG9uc2UgaGF2ZSBub3QgYmVlbiByZWFkLCB0aHVzCisgICAgICAgICMgICAgICB3ZSBjYW5ub3QgZGV0ZXJtaW5lIHdoZXRoZXIgcG9pbnQgKDIpIGlzIHRydWUuICAgKF9DU19SRVFfU0VOVCkKKyAgICAgICAgIworICAgICAgICAjIGlmIHRoZXJlIGlzIG5vIHByaW9yIHJlc3BvbnNlLCB0aGVuIHdlIGNhbiByZXF1ZXN0IGF0IHdpbGwuCisgICAgICAgICMKKyAgICAgICAgIyBpZiBwb2ludCAoMikgaXMgdHJ1ZSwgdGhlbiB3ZSB3aWxsIGhhdmUgcGFzc2VkIHRoZSBzb2NrZXQgdG8gdGhlCisgICAgICAgICMgcmVzcG9uc2UgKGVmZmVjdGl2ZWx5IG1lYW5pbmcsICJ0aGVyZSBpcyBubyBwcmlvciByZXNwb25zZSIpLCBhbmQKKyAgICAgICAgIyB3aWxsIG9wZW4gYSBuZXcgb25lIHdoZW4gYSBuZXcgcmVxdWVzdCBpcyBtYWRlLgorICAgICAgICAjCisgICAgICAgICMgTm90ZTogaWYgYSBwcmlvciByZXNwb25zZSBleGlzdHMsIHRoZW4gd2UgKmNhbiogc3RhcnQgYSBuZXcgcmVxdWVzdC4KKyAgICAgICAgIyAgICAgICBXZSBhcmUgbm90IGFsbG93ZWQgdG8gYmVnaW4gZmV0Y2hpbmcgdGhlIHJlc3BvbnNlIHRvIHRoaXMgbmV3CisgICAgICAgICMgICAgICAgcmVxdWVzdCwgaG93ZXZlciwgdW50aWwgdGhhdCBwcmlvciByZXNwb25zZSBpcyBjb21wbGV0ZS4KKyAgICAgICAgIworICAgICAgICBpZiBzZWxmLl9fc3RhdGUgPT0gX0NTX0lETEU6CisgICAgICAgICAgICBzZWxmLl9fc3RhdGUgPSBfQ1NfUkVRX1NUQVJURUQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIENhbm5vdFNlbmRSZXF1ZXN0KCkKKworICAgICAgICAjIFNhdmUgdGhlIG1ldGhvZCB3ZSB1c2UsIHdlIG5lZWQgaXQgbGF0ZXIgaW4gdGhlIHJlc3BvbnNlIHBoYXNlCisgICAgICAgIHNlbGYuX21ldGhvZCA9IG1ldGhvZAorICAgICAgICBpZiBub3QgdXJsOgorICAgICAgICAgICAgdXJsID0gJy8nCisgICAgICAgIGhkciA9ICclcyAlcyAlcycgJSAobWV0aG9kLCB1cmwsIHNlbGYuX2h0dHBfdnNuX3N0cikKKworICAgICAgICBzZWxmLl9vdXRwdXQoaGRyKQorCisgICAgICAgIGlmIHNlbGYuX2h0dHBfdnNuID09IDExOgorICAgICAgICAgICAgIyBJc3N1ZSBzb21lIHN0YW5kYXJkIGhlYWRlcnMgZm9yIGJldHRlciBIVFRQLzEuMSBjb21wbGlhbmNlCisKKyAgICAgICAgICAgIGlmIG5vdCBza2lwX2hvc3Q6CisgICAgICAgICAgICAgICAgIyB0aGlzIGhlYWRlciBpcyBpc3N1ZWQgKm9ubHkqIGZvciBIVFRQLzEuMQorICAgICAgICAgICAgICAgICMgY29ubmVjdGlvbnMuIG1vcmUgc3BlY2lmaWNhbGx5LCB0aGlzIG1lYW5zIGl0IGlzCisgICAgICAgICAgICAgICAgIyBvbmx5IGlzc3VlZCB3aGVuIHRoZSBjbGllbnQgdXNlcyB0aGUgbmV3CisgICAgICAgICAgICAgICAgIyBIVFRQQ29ubmVjdGlvbigpIGNsYXNzLiBiYWNrd2FyZHMtY29tcGF0IGNsaWVudHMKKyAgICAgICAgICAgICAgICAjIHdpbGwgYmUgdXNpbmcgSFRUUC8xLjAgYW5kIHRob3NlIGNsaWVudHMgbWF5IGJlCisgICAgICAgICAgICAgICAgIyBpc3N1aW5nIHRoaXMgaGVhZGVyIHRoZW1zZWx2ZXMuIHdlIHNob3VsZCBOT1QgaXNzdWUKKyAgICAgICAgICAgICAgICAjIGl0IHR3aWNlOyBzb21lIHdlYiBzZXJ2ZXJzIChzdWNoIGFzIEFwYWNoZSkgYmFyZgorICAgICAgICAgICAgICAgICMgd2hlbiB0aGV5IHNlZSB0d28gSG9zdDogaGVhZGVycworCisgICAgICAgICAgICAgICAgIyBJZiB3ZSBuZWVkIGEgbm9uLXN0YW5kYXJkIHBvcnQsaW5jbHVkZSBpdCBpbiB0aGUKKyAgICAgICAgICAgICAgICAjIGhlYWRlci4gIElmIHRoZSByZXF1ZXN0IGlzIGdvaW5nIHRocm91Z2ggYSBwcm94eSwKKyAgICAgICAgICAgICAgICAjIGJ1dCB0aGUgaG9zdCBvZiB0aGUgYWN0dWFsIFVSTCwgbm90IHRoZSBob3N0IG9mIHRoZQorICAgICAgICAgICAgICAgICMgcHJveHkuCisKKyAgICAgICAgICAgICAgICBuZXRsb2MgPSAnJworICAgICAgICAgICAgICAgIGlmIHVybC5zdGFydHN3aXRoKCdodHRwJyk6CisgICAgICAgICAgICAgICAgICAgIG5pbCwgbmV0bG9jLCBuaWwsIG5pbCwgbmlsID0gdXJsc3BsaXQodXJsKQorCisgICAgICAgICAgICAgICAgaWYgbmV0bG9jOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXRsb2NfZW5jID0gbmV0bG9jLmVuY29kZSgiYXNjaWkiKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV0bG9jX2VuYyA9IG5ldGxvYy5lbmNvZGUoImlkbmEiKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnB1dGhlYWRlcignSG9zdCcsIG5ldGxvY19lbmMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9lbmMgPSBzZWxmLmhvc3QuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBob3N0X2VuYyA9IHNlbGYuaG9zdC5lbmNvZGUoImlkbmEiKQorICAgICAgICAgICAgICAgICAgICAjIFdyYXAgdGhlIElQdjYgSG9zdCBIZWFkZXIgd2l0aCBbXSAoUkZDIDI3MzIpCisgICAgICAgICAgICAgICAgICAgIGlmIGhvc3RfZW5jLmZpbmQoJzonKSA+PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9lbmMgPSAiWyIgKyBob3N0X2VuYyArICJdIgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnBvcnQgPT0gc2VsZi5kZWZhdWx0X3BvcnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB1dGhlYWRlcignSG9zdCcsIGhvc3RfZW5jKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoJ0hvc3QnLCAiJXM6JXMiICUgKGhvc3RfZW5jLCBzZWxmLnBvcnQpKQorCisgICAgICAgICAgICAjIG5vdGU6IHdlIGFyZSBhc3N1bWluZyB0aGF0IGNsaWVudHMgd2lsbCBub3QgYXR0ZW1wdCB0byBzZXQgdGhlc2UKKyAgICAgICAgICAgICMgICAgICAgaGVhZGVycyBzaW5jZSAqdGhpcyogbGlicmFyeSBtdXN0IGRlYWwgd2l0aCB0aGUKKyAgICAgICAgICAgICMgICAgICAgY29uc2VxdWVuY2VzLiB0aGlzIGFsc28gbWVhbnMgdGhhdCB3aGVuIHRoZSBzdXBwb3J0aW5nCisgICAgICAgICAgICAjICAgICAgIGxpYnJhcmllcyBhcmUgdXBkYXRlZCB0byByZWNvZ25pemUgb3RoZXIgZm9ybXMsIHRoZW4gdGhpcworICAgICAgICAgICAgIyAgICAgICBjb2RlIHNob3VsZCBiZSBjaGFuZ2VkIChyZW1vdmVkIG9yIHVwZGF0ZWQpLgorCisgICAgICAgICAgICAjIHdlIG9ubHkgd2FudCBhIENvbnRlbnQtRW5jb2Rpbmcgb2YgImlkZW50aXR5IiBzaW5jZSB3ZSBkb24ndAorICAgICAgICAgICAgIyBzdXBwb3J0IGVuY29kaW5ncyBzdWNoIGFzIHgtZ3ppcCBvciB4LWRlZmxhdGUuCisgICAgICAgICAgICBpZiBub3Qgc2tpcF9hY2NlcHRfZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoJ0FjY2VwdC1FbmNvZGluZycsICdpZGVudGl0eScpCisKKyAgICAgICAgICAgICMgd2UgY2FuIGFjY2VwdCAiY2h1bmtlZCIgVHJhbnNmZXItRW5jb2RpbmdzLCBidXQgbm8gb3RoZXJzCisgICAgICAgICAgICAjIE5PVEU6IG5vIFRFIGhlYWRlciBpbXBsaWVzICpvbmx5KiAiY2h1bmtlZCIKKyAgICAgICAgICAgICNzZWxmLnB1dGhlYWRlcignVEUnLCAnY2h1bmtlZCcpCisKKyAgICAgICAgICAgICMgaWYgVEUgaXMgc3VwcGxpZWQgaW4gdGhlIGhlYWRlciwgdGhlbiBpdCBtdXN0IGFwcGVhciBpbiBhCisgICAgICAgICAgICAjIENvbm5lY3Rpb24gaGVhZGVyLgorICAgICAgICAgICAgI3NlbGYucHV0aGVhZGVyKCdDb25uZWN0aW9uJywgJ1RFJykKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBGb3IgSFRUUC8xLjAsIHRoZSBzZXJ2ZXIgd2lsbCBhc3N1bWUgIm5vdCBjaHVua2VkIgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHB1dGhlYWRlcihzZWxmLCBoZWFkZXIsICp2YWx1ZXMpOgorICAgICAgICAiIiJTZW5kIGEgcmVxdWVzdCBoZWFkZXIgbGluZSB0byB0aGUgc2VydmVyLgorCisgICAgICAgIEZvciBleGFtcGxlOiBoLnB1dGhlYWRlcignQWNjZXB0JywgJ3RleHQvaHRtbCcpCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9fc3RhdGUgIT0gX0NTX1JFUV9TVEFSVEVEOgorICAgICAgICAgICAgcmFpc2UgQ2Fubm90U2VuZEhlYWRlcigpCisKKyAgICAgICAgaGRyID0gJyVzOiAlcycgJSAoaGVhZGVyLCAnXHJcblx0Jy5qb2luKFtzdHIodikgZm9yIHYgaW4gdmFsdWVzXSkpCisgICAgICAgIHNlbGYuX291dHB1dChoZHIpCisKKyAgICBkZWYgZW5kaGVhZGVycyhzZWxmLCBtZXNzYWdlX2JvZHk9Tm9uZSk6CisgICAgICAgICIiIkluZGljYXRlIHRoYXQgdGhlIGxhc3QgaGVhZGVyIGxpbmUgaGFzIGJlZW4gc2VudCB0byB0aGUgc2VydmVyLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHNlbmRzIHRoZSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIuICBUaGUgb3B0aW9uYWwKKyAgICAgICAgbWVzc2FnZV9ib2R5IGFyZ3VtZW50IGNhbiBiZSB1c2VkIHRvIHBhc3MgYSBtZXNzYWdlIGJvZHkKKyAgICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0LiAgVGhlIG1lc3NhZ2UgYm9keSB3aWxsIGJlIHNlbnQgaW4KKyAgICAgICAgdGhlIHNhbWUgcGFja2V0IGFzIHRoZSBtZXNzYWdlIGhlYWRlcnMgaWYgaXQgaXMgc3RyaW5nLCBvdGhlcndpc2UgaXQgaXMKKyAgICAgICAgc2VudCBhcyBhIHNlcGFyYXRlIHBhY2tldC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX19zdGF0ZSA9PSBfQ1NfUkVRX1NUQVJURUQ6CisgICAgICAgICAgICBzZWxmLl9fc3RhdGUgPSBfQ1NfUkVRX1NFTlQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIENhbm5vdFNlbmRIZWFkZXIoKQorICAgICAgICBzZWxmLl9zZW5kX291dHB1dChtZXNzYWdlX2JvZHkpCisKKyAgICBkZWYgcmVxdWVzdChzZWxmLCBtZXRob2QsIHVybCwgYm9keT1Ob25lLCBoZWFkZXJzPXt9KToKKyAgICAgICAgIiIiU2VuZCBhIGNvbXBsZXRlIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4iIiIKKyAgICAgICAgc2VsZi5fc2VuZF9yZXF1ZXN0KG1ldGhvZCwgdXJsLCBib2R5LCBoZWFkZXJzKQorCisgICAgZGVmIF9zZXRfY29udGVudF9sZW5ndGgoc2VsZiwgYm9keSk6CisgICAgICAgICMgU2V0IHRoZSBjb250ZW50LWxlbmd0aCBiYXNlZCBvbiB0aGUgYm9keS4KKyAgICAgICAgdGhlbGVuID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0aGVsZW4gPSBzdHIobGVuKGJvZHkpKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCB0ZToKKyAgICAgICAgICAgICMgSWYgdGhpcyBpcyBhIGZpbGUtbGlrZSBvYmplY3QsIHRyeSB0bworICAgICAgICAgICAgIyBmc3RhdCBpdHMgZmlsZSBkZXNjcmlwdG9yCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGhlbGVuID0gc3RyKG9zLmZzdGF0KGJvZHkuZmlsZW5vKCkpLnN0X3NpemUpCisgICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBPU0Vycm9yKToKKyAgICAgICAgICAgICAgICAjIERvbid0IHNlbmQgYSBsZW5ndGggaWYgdGhpcyBmYWlsZWQKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOiBwcmludCAiQ2Fubm90IHN0YXQhISIKKworICAgICAgICBpZiB0aGVsZW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCB0aGVsZW4pCisKKyAgICBkZWYgX3NlbmRfcmVxdWVzdChzZWxmLCBtZXRob2QsIHVybCwgYm9keSwgaGVhZGVycyk6CisgICAgICAgICMgSG9ub3IgZXhwbGljaXRseSByZXF1ZXN0ZWQgSG9zdDogYW5kIEFjY2VwdC1FbmNvZGluZzogaGVhZGVycy4KKyAgICAgICAgaGVhZGVyX25hbWVzID0gZGljdC5mcm9ta2V5cyhbay5sb3dlcigpIGZvciBrIGluIGhlYWRlcnNdKQorICAgICAgICBza2lwcyA9IHt9CisgICAgICAgIGlmICdob3N0JyBpbiBoZWFkZXJfbmFtZXM6CisgICAgICAgICAgICBza2lwc1snc2tpcF9ob3N0J10gPSAxCisgICAgICAgIGlmICdhY2NlcHQtZW5jb2RpbmcnIGluIGhlYWRlcl9uYW1lczoKKyAgICAgICAgICAgIHNraXBzWydza2lwX2FjY2VwdF9lbmNvZGluZyddID0gMQorCisgICAgICAgIHNlbGYucHV0cmVxdWVzdChtZXRob2QsIHVybCwgKipza2lwcykKKworICAgICAgICBpZiBib2R5IGlzIG5vdCBOb25lIGFuZCAnY29udGVudC1sZW5ndGgnIG5vdCBpbiBoZWFkZXJfbmFtZXM6CisgICAgICAgICAgICBzZWxmLl9zZXRfY29udGVudF9sZW5ndGgoYm9keSkKKyAgICAgICAgZm9yIGhkciwgdmFsdWUgaW4gaGVhZGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKGhkciwgdmFsdWUpCisgICAgICAgIHNlbGYuZW5kaGVhZGVycyhib2R5KQorCisgICAgZGVmIGdldHJlc3BvbnNlKHNlbGYsIGJ1ZmZlcmluZz1GYWxzZSk6CisgICAgICAgICJHZXQgdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4iCisKKyAgICAgICAgIyBpZiBhIHByaW9yIHJlc3BvbnNlIGhhcyBiZWVuIGNvbXBsZXRlZCwgdGhlbiBmb3JnZXQgYWJvdXQgaXQuCisgICAgICAgIGlmIHNlbGYuX19yZXNwb25zZSBhbmQgc2VsZi5fX3Jlc3BvbnNlLmlzY2xvc2VkKCk6CisgICAgICAgICAgICBzZWxmLl9fcmVzcG9uc2UgPSBOb25lCisKKyAgICAgICAgIworICAgICAgICAjIGlmIGEgcHJpb3IgcmVzcG9uc2UgZXhpc3RzLCB0aGVuIGl0IG11c3QgYmUgY29tcGxldGVkIChvdGhlcndpc2UsIHdlCisgICAgICAgICMgY2Fubm90IHJlYWQgdGhpcyByZXNwb25zZSdzIGhlYWRlciB0byBkZXRlcm1pbmUgdGhlIGNvbm5lY3Rpb24tY2xvc2UKKyAgICAgICAgIyBiZWhhdmlvcikKKyAgICAgICAgIworICAgICAgICAjIG5vdGU6IGlmIGEgcHJpb3IgcmVzcG9uc2UgZXhpc3RlZCwgYnV0IHdhcyBjb25uZWN0aW9uLWNsb3NlLCB0aGVuIHRoZQorICAgICAgICAjIHNvY2tldCBhbmQgcmVzcG9uc2Ugd2VyZSBtYWRlIGluZGVwZW5kZW50IG9mIHRoaXMgSFRUUENvbm5lY3Rpb24KKyAgICAgICAgIyBvYmplY3Qgc2luY2UgYSBuZXcgcmVxdWVzdCByZXF1aXJlcyB0aGF0IHdlIG9wZW4gYSB3aG9sZSBuZXcKKyAgICAgICAgIyBjb25uZWN0aW9uCisgICAgICAgICMKKyAgICAgICAgIyB0aGlzIG1lYW5zIHRoZSBwcmlvciByZXNwb25zZSBoYWQgb25lIG9mIHR3byBzdGF0ZXM6CisgICAgICAgICMgICAxKSB3aWxsX2Nsb3NlOiB0aGlzIGNvbm5lY3Rpb24gd2FzIHJlc2V0IGFuZCB0aGUgcHJpb3Igc29ja2V0IGFuZAorICAgICAgICAjICAgICAgICAgICAgICAgICAgcmVzcG9uc2Ugb3BlcmF0ZSBpbmRlcGVuZGVudGx5CisgICAgICAgICMgICAyKSBwZXJzaXN0ZW50OiB0aGUgcmVzcG9uc2Ugd2FzIHJldGFpbmVkIGFuZCB3ZSBhd2FpdCBpdHMKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIGlzY2xvc2VkKCkgc3RhdHVzIHRvIGJlY29tZSB0cnVlLgorICAgICAgICAjCisgICAgICAgIGlmIHNlbGYuX19zdGF0ZSAhPSBfQ1NfUkVRX1NFTlQgb3Igc2VsZi5fX3Jlc3BvbnNlOgorICAgICAgICAgICAgcmFpc2UgUmVzcG9uc2VOb3RSZWFkeSgpCisKKyAgICAgICAgYXJncyA9IChzZWxmLnNvY2ssKQorICAgICAgICBrd2RzID0geyJzdHJpY3QiOnNlbGYuc3RyaWN0LCAibWV0aG9kIjpzZWxmLl9tZXRob2R9CisgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICBhcmdzICs9IChzZWxmLmRlYnVnbGV2ZWwsKQorICAgICAgICBpZiBidWZmZXJpbmc6CisgICAgICAgICAgICAjb25seSBhZGQgdGhpcyBrZXl3b3JkIGlmIG5vbi1kZWZhdWx0LCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCisgICAgICAgICAgICAjb3RoZXIgcmVzcG9uc2VfY2xhc3Nlcy4KKyAgICAgICAgICAgIGt3ZHNbImJ1ZmZlcmluZyJdID0gVHJ1ZTsKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlc3BvbnNlX2NsYXNzKCphcmdzLCAqKmt3ZHMpCisKKyAgICAgICAgcmVzcG9uc2UuYmVnaW4oKQorICAgICAgICBhc3NlcnQgcmVzcG9uc2Uud2lsbF9jbG9zZSAhPSBfVU5LTk9XTgorICAgICAgICBzZWxmLl9fc3RhdGUgPSBfQ1NfSURMRQorCisgICAgICAgIGlmIHJlc3BvbnNlLndpbGxfY2xvc2U6CisgICAgICAgICAgICAjIHRoaXMgZWZmZWN0aXZlbHkgcGFzc2VzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSByZXNwb25zZQorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHJlbWVtYmVyIHRoaXMsIHNvIHdlIGNhbiB0ZWxsIHdoZW4gaXQgaXMgY29tcGxldGUKKyAgICAgICAgICAgIHNlbGYuX19yZXNwb25zZSA9IHJlc3BvbnNlCisKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlCisKKworY2xhc3MgSFRUUDoKKyAgICAiQ29tcGF0aWJpbGl0eSBjbGFzcyB3aXRoIGh0dHBsaWIucHkgZnJvbSAxLjUuIgorCisgICAgX2h0dHBfdnNuID0gMTAKKyAgICBfaHR0cF92c25fc3RyID0gJ0hUVFAvMS4wJworCisgICAgZGVidWdsZXZlbCA9IDAKKworICAgIF9jb25uZWN0aW9uX2NsYXNzID0gSFRUUENvbm5lY3Rpb24KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PScnLCBwb3J0PU5vbmUsIHN0cmljdD1Ob25lKToKKyAgICAgICAgIlByb3ZpZGUgYSBkZWZhdWx0IGhvc3QsIHNpbmNlIHRoZSBzdXBlcmNsYXNzIHJlcXVpcmVzIG9uZS4iCisKKyAgICAgICAgIyBzb21lIGpva2VyIHBhc3NlZCAwIGV4cGxpY2l0bHksIG1lYW5pbmcgZGVmYXVsdCBwb3J0CisgICAgICAgIGlmIHBvcnQgPT0gMDoKKyAgICAgICAgICAgIHBvcnQgPSBOb25lCisKKyAgICAgICAgIyBOb3RlIHRoYXQgd2UgbWF5IHBhc3MgYW4gZW1wdHkgc3RyaW5nIGFzIHRoZSBob3N0OyB0aGlzIHdpbGwgcmFpc2UKKyAgICAgICAgIyBhbiBlcnJvciB3aGVuIHdlIGF0dGVtcHQgdG8gY29ubmVjdC4gUHJlc3VtYWJseSwgdGhlIGNsaWVudCBjb2RlCisgICAgICAgICMgd2lsbCBjYWxsIGNvbm5lY3QgYmVmb3JlIHRoZW4sIHdpdGggYSBwcm9wZXIgaG9zdC4KKyAgICAgICAgc2VsZi5fc2V0dXAoc2VsZi5fY29ubmVjdGlvbl9jbGFzcyhob3N0LCBwb3J0LCBzdHJpY3QpKQorCisgICAgZGVmIF9zZXR1cChzZWxmLCBjb25uKToKKyAgICAgICAgc2VsZi5fY29ubiA9IGNvbm4KKworICAgICAgICAjIHNldCB1cCBkZWxlZ2F0aW9uIHRvIGZsZXNoIG91dCBpbnRlcmZhY2UKKyAgICAgICAgc2VsZi5zZW5kID0gY29ubi5zZW5kCisgICAgICAgIHNlbGYucHV0cmVxdWVzdCA9IGNvbm4ucHV0cmVxdWVzdAorICAgICAgICBzZWxmLnB1dGhlYWRlciA9IGNvbm4ucHV0aGVhZGVyCisgICAgICAgIHNlbGYuZW5kaGVhZGVycyA9IGNvbm4uZW5kaGVhZGVycworICAgICAgICBzZWxmLnNldF9kZWJ1Z2xldmVsID0gY29ubi5zZXRfZGVidWdsZXZlbAorCisgICAgICAgIGNvbm4uX2h0dHBfdnNuID0gc2VsZi5faHR0cF92c24KKyAgICAgICAgY29ubi5faHR0cF92c25fc3RyID0gc2VsZi5faHR0cF92c25fc3RyCisKKyAgICAgICAgc2VsZi5maWxlID0gTm9uZQorCisgICAgZGVmIGNvbm5lY3Qoc2VsZiwgaG9zdD1Ob25lLCBwb3J0PU5vbmUpOgorICAgICAgICAiQWNjZXB0IGFyZ3VtZW50cyB0byBzZXQgdGhlIGhvc3QvcG9ydCwgc2luY2UgdGhlIHN1cGVyY2xhc3MgZG9lc24ndC4iCisKKyAgICAgICAgaWYgaG9zdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2Nvbm4uX3NldF9ob3N0cG9ydChob3N0LCBwb3J0KQorICAgICAgICBzZWxmLl9jb25uLmNvbm5lY3QoKQorCisgICAgZGVmIGdldGZpbGUoc2VsZik6CisgICAgICAgICJQcm92aWRlIGEgZ2V0ZmlsZSwgc2luY2UgdGhlIHN1cGVyY2xhc3MnIGRvZXMgbm90IHVzZSB0aGlzIGNvbmNlcHQuIgorICAgICAgICByZXR1cm4gc2VsZi5maWxlCisKKyAgICBkZWYgZ2V0cmVwbHkoc2VsZiwgYnVmZmVyaW5nPUZhbHNlKToKKyAgICAgICAgIiIiQ29tcGF0IGRlZmluaXRpb24gc2luY2Ugc3VwZXJjbGFzcyBkb2VzIG5vdCBkZWZpbmUgaXQuCisKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIGNvbnNpc3Rpbmcgb2Y6CisgICAgICAgIC0gc2VydmVyIHN0YXR1cyBjb2RlIChlLmcuICcyMDAnIGlmIGFsbCBnb2VzIHdlbGwpCisgICAgICAgIC0gc2VydmVyICJyZWFzb24iIGNvcnJlc3BvbmRpbmcgdG8gc3RhdHVzIGNvZGUKKyAgICAgICAgLSBhbnkgUkZDODIyIGhlYWRlcnMgaW4gdGhlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IGJ1ZmZlcmluZzoKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuX2Nvbm4uZ2V0cmVzcG9uc2UoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjb25seSBhZGQgdGhpcyBrZXl3b3JkIGlmIG5vbi1kZWZhdWx0IGZvciBjb21wYXRpYmlsaXR5CisgICAgICAgICAgICAgICAgI3dpdGggb3RoZXIgY29ubmVjdGlvbiBjbGFzc2VzCisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9jb25uLmdldHJlc3BvbnNlKGJ1ZmZlcmluZykKKyAgICAgICAgZXhjZXB0IEJhZFN0YXR1c0xpbmUsIGU6CisgICAgICAgICAgICAjIyMgaG1tLiBpZiBnZXRyZXNwb25zZSgpIGV2ZXIgY2xvc2VzIHRoZSBzb2NrZXQgb24gYSBiYWQgcmVxdWVzdCwKKyAgICAgICAgICAgICMjIyB0aGVuIHdlIGFyZSBnb2luZyB0byBoYXZlIHByb2JsZW1zIHdpdGggc2VsZi5zb2NrCisKKyAgICAgICAgICAgICMjIyBzaG91bGQgd2Uga2VlcCB0aGlzIGJlaGF2aW9yPyBkbyBwZW9wbGUgdXNlIGl0PworICAgICAgICAgICAgIyBrZWVwIHRoZSBzb2NrZXQgb3BlbiAoYXMgYSBmaWxlKSwgYW5kIHJldHVybiBpdAorICAgICAgICAgICAgc2VsZi5maWxlID0gc2VsZi5fY29ubi5zb2NrLm1ha2VmaWxlKCdyYicsIDApCisKKyAgICAgICAgICAgICMgY2xvc2Ugb3VyIHNvY2tldCAtLSB3ZSB3YW50IHRvIHJlc3RhcnQgYWZ0ZXIgYW55IHByb3RvY29sIGVycm9yCisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgICAgICAgICAgc2VsZi5oZWFkZXJzID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuIC0xLCBlLmxpbmUsIE5vbmUKKworICAgICAgICBzZWxmLmhlYWRlcnMgPSByZXNwb25zZS5tc2cKKyAgICAgICAgc2VsZi5maWxlID0gcmVzcG9uc2UuZnAKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UucmVhc29uLCByZXNwb25zZS5tc2cKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fY29ubi5jbG9zZSgpCisKKyAgICAgICAgIyBub3RlIHRoYXQgc2VsZi5maWxlID09IHJlc3BvbnNlLmZwLCB3aGljaCBnZXRzIGNsb3NlZCBieSB0aGUKKyAgICAgICAgIyBzdXBlcmNsYXNzLiBqdXN0IGNsZWFyIHRoZSBvYmplY3QgcmVmIGhlcmUuCisgICAgICAgICMjIyBobW0uIG1lc3N5LiBpZiBzdGF0dXM9PS0xLCB0aGVuIHNlbGYuZmlsZSBpcyBvd25lZCBieSB1cy4KKyAgICAgICAgIyMjIHdlbGwuLi4gd2UgYXJlbid0IGV4cGxpY2l0bHkgY2xvc2luZywgYnV0IGxvc2luZyB0aGlzIHJlZiB3aWxsCisgICAgICAgICMjIyBkbyBpdAorICAgICAgICBzZWxmLmZpbGUgPSBOb25lCisKK3RyeToKKyAgICBpbXBvcnQgc3NsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBjbGFzcyBIVFRQU0Nvbm5lY3Rpb24oSFRUUENvbm5lY3Rpb24pOgorICAgICAgICAiVGhpcyBjbGFzcyBhbGxvd3MgY29tbXVuaWNhdGlvbiB2aWEgU1NMLiIKKworICAgICAgICBkZWZhdWx0X3BvcnQgPSBIVFRQU19QT1JUCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQ9Tm9uZSwga2V5X2ZpbGU9Tm9uZSwgY2VydF9maWxlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBzdHJpY3Q9Tm9uZSwgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzcz1Ob25lKToKKyAgICAgICAgICAgIEhUVFBDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIHN0cmljdCwgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzKQorICAgICAgICAgICAgc2VsZi5rZXlfZmlsZSA9IGtleV9maWxlCisgICAgICAgICAgICBzZWxmLmNlcnRfZmlsZSA9IGNlcnRfZmlsZQorCisgICAgICAgIGRlZiBjb25uZWN0KHNlbGYpOgorICAgICAgICAgICAgIkNvbm5lY3QgdG8gYSBob3N0IG9uIGEgZ2l2ZW4gKFNTTCkgcG9ydC4iCisKKyAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aW1lb3V0LCBzZWxmLnNvdXJjZV9hZGRyZXNzKQorICAgICAgICAgICAgaWYgc2VsZi5fdHVubmVsX2hvc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc29jaworICAgICAgICAgICAgICAgIHNlbGYuX3R1bm5lbCgpCisgICAgICAgICAgICBzZWxmLnNvY2sgPSBzc2wud3JhcF9zb2NrZXQoc29jaywgc2VsZi5rZXlfZmlsZSwgc2VsZi5jZXJ0X2ZpbGUpCisKKyAgICBfX2FsbF9fLmFwcGVuZCgiSFRUUFNDb25uZWN0aW9uIikKKworICAgIGNsYXNzIEhUVFBTKEhUVFApOgorICAgICAgICAiIiJDb21wYXRpYmlsaXR5IHdpdGggMS41IGh0dHBsaWIgaW50ZXJmYWNlCisKKyAgICAgICAgUHl0aG9uIDEuNS4yIGRpZCBub3QgaGF2ZSBhbiBIVFRQUyBjbGFzcywgYnV0IGl0IGRlZmluZWQgYW4KKyAgICAgICAgaW50ZXJmYWNlIGZvciBzZW5kaW5nIGh0dHAgcmVxdWVzdHMgdGhhdCBpcyBhbHNvIHVzZWZ1bCBmb3IKKyAgICAgICAgaHR0cHMuCisgICAgICAgICIiIgorCisgICAgICAgIF9jb25uZWN0aW9uX2NsYXNzID0gSFRUUFNDb25uZWN0aW9uCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9JycsIHBvcnQ9Tm9uZSwga2V5X2ZpbGU9Tm9uZSwgY2VydF9maWxlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBzdHJpY3Q9Tm9uZSk6CisgICAgICAgICAgICAjIHByb3ZpZGUgYSBkZWZhdWx0IGhvc3QsIHBhc3MgdGhlIFg1MDkgY2VydCBpbmZvCisKKyAgICAgICAgICAgICMgdXJmLiBjb21wZW5zYXRlIGZvciBiYWQgaW5wdXQuCisgICAgICAgICAgICBpZiBwb3J0ID09IDA6CisgICAgICAgICAgICAgICAgcG9ydCA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuX3NldHVwKHNlbGYuX2Nvbm5lY3Rpb25fY2xhc3MoaG9zdCwgcG9ydCwga2V5X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfZmlsZSwgc3RyaWN0KSkKKworICAgICAgICAgICAgIyB3ZSBuZXZlciBhY3R1YWxseSB1c2UgdGhlc2UgZm9yIGFueXRoaW5nLCBidXQgd2Uga2VlcCB0aGVtCisgICAgICAgICAgICAjIGhlcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwb3N0LTEuNS4yIENWUy4KKyAgICAgICAgICAgIHNlbGYua2V5X2ZpbGUgPSBrZXlfZmlsZQorICAgICAgICAgICAgc2VsZi5jZXJ0X2ZpbGUgPSBjZXJ0X2ZpbGUKKworCisgICAgZGVmIEZha2VTb2NrZXQgKHNvY2ssIHNzbG9iaik6CisgICAgICAgIHdhcm5pbmdzLndhcm4oIkZha2VTb2NrZXQgaXMgZGVwcmVjYXRlZCwgYW5kIHdvbid0IGJlIGluIDMueC4gICIgKworICAgICAgICAgICAgICAgICAgICAgICJVc2UgdGhlIHJlc3VsdCBvZiBzc2wud3JhcF9zb2NrZXQoKSBkaXJlY3RseSBpbnN0ZWFkLiIsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHJldHVybiBzc2xvYmoKKworCitjbGFzcyBIVFRQRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgIyBTdWJjbGFzc2VzIHRoYXQgZGVmaW5lIGFuIF9faW5pdF9fIG11c3QgY2FsbCBFeGNlcHRpb24uX19pbml0X18KKyAgICAjIG9yIGRlZmluZSBzZWxmLmFyZ3MuICBPdGhlcndpc2UsIHN0cigpIHdpbGwgZmFpbC4KKyAgICBwYXNzCisKK2NsYXNzIE5vdENvbm5lY3RlZChIVFRQRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2NsYXNzIEludmFsaWRVUkwoSFRUUEV4Y2VwdGlvbik6CisgICAgcGFzcworCitjbGFzcyBVbmtub3duUHJvdG9jb2woSFRUUEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgorICAgICAgICBzZWxmLmFyZ3MgPSB2ZXJzaW9uLAorICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCisKK2NsYXNzIFVua25vd25UcmFuc2ZlckVuY29kaW5nKEhUVFBFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgVW5pbXBsZW1lbnRlZEZpbGVNb2RlKEhUVFBFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgSW5jb21wbGV0ZVJlYWQoSFRUUEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnRpYWwsIGV4cGVjdGVkPU5vbmUpOgorICAgICAgICBzZWxmLmFyZ3MgPSBwYXJ0aWFsLAorICAgICAgICBzZWxmLnBhcnRpYWwgPSBwYXJ0aWFsCisgICAgICAgIHNlbGYuZXhwZWN0ZWQgPSBleHBlY3RlZAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5leHBlY3RlZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGUgPSAnLCAlaSBtb3JlIGV4cGVjdGVkJyAlIHNlbGYuZXhwZWN0ZWQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGUgPSAnJworICAgICAgICByZXR1cm4gJ0luY29tcGxldGVSZWFkKCVpIGJ5dGVzIHJlYWQlcyknICUgKGxlbihzZWxmLnBhcnRpYWwpLCBlKQorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gcmVwcihzZWxmKQorCitjbGFzcyBJbXByb3BlckNvbm5lY3Rpb25TdGF0ZShIVFRQRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2NsYXNzIENhbm5vdFNlbmRSZXF1ZXN0KEltcHJvcGVyQ29ubmVjdGlvblN0YXRlKToKKyAgICBwYXNzCisKK2NsYXNzIENhbm5vdFNlbmRIZWFkZXIoSW1wcm9wZXJDb25uZWN0aW9uU3RhdGUpOgorICAgIHBhc3MKKworY2xhc3MgUmVzcG9uc2VOb3RSZWFkeShJbXByb3BlckNvbm5lY3Rpb25TdGF0ZSk6CisgICAgcGFzcworCitjbGFzcyBCYWRTdGF0dXNMaW5lKEhUVFBFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lKToKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBsaW5lID0gcmVwcihsaW5lKQorICAgICAgICBzZWxmLmFyZ3MgPSBsaW5lLAorICAgICAgICBzZWxmLmxpbmUgPSBsaW5lCisKK2NsYXNzIExpbmVUb29Mb25nKEhUVFBFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lX3R5cGUpOgorICAgICAgICBIVFRQRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsICJnb3QgbW9yZSB0aGFuICVkIGJ5dGVzIHdoZW4gcmVhZGluZyAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChfTUFYTElORSwgbGluZV90eXBlKSkKKworIyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKK2Vycm9yID0gSFRUUEV4Y2VwdGlvbgorCitjbGFzcyBMaW5lQW5kRmlsZVdyYXBwZXI6CisgICAgIiIiQSBsaW1pdGVkIGZpbGUtbGlrZSBvYmplY3QgZm9yIEhUVFAvMC45IHJlc3BvbnNlcy4iIiIKKworICAgICMgVGhlIHN0YXR1cy1saW5lIHBhcnNpbmcgY29kZSBjYWxscyByZWFkbGluZSgpLCB3aGljaCBub3JtYWxseQorICAgICMgZ2V0IHRoZSBIVFRQIHN0YXR1cyBsaW5lLiAgRm9yIGEgMC45IHJlc3BvbnNlLCBob3dldmVyLCB0aGlzIGlzCisgICAgIyBhY3R1YWxseSB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYm9keSEgIENsaWVudHMgbmVlZCB0byBnZXQgYQorICAgICMgcmVhZGFibGUgZmlsZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGF0IGxpbmUuCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGluZSwgZmlsZSk6CisgICAgICAgIHNlbGYuX2xpbmUgPSBsaW5lCisgICAgICAgIHNlbGYuX2ZpbGUgPSBmaWxlCisgICAgICAgIHNlbGYuX2xpbmVfY29uc3VtZWQgPSAwCisgICAgICAgIHNlbGYuX2xpbmVfb2Zmc2V0ID0gMAorICAgICAgICBzZWxmLl9saW5lX2xlZnQgPSBsZW4obGluZSkKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fZmlsZSwgYXR0cikKKworICAgIGRlZiBfZG9uZShzZWxmKToKKyAgICAgICAgIyBjYWxsZWQgd2hlbiB0aGUgbGFzdCBieXRlIGlzIHJlYWQgZnJvbSB0aGUgbGluZS4gIEFmdGVyIHRoZQorICAgICAgICAjIGNhbGwsIGFsbCByZWFkIG1ldGhvZHMgYXJlIGRlbGVnYXRlZCB0byB0aGUgdW5kZXJseWluZyBmaWxlCisgICAgICAgICMgb2JqZWN0LgorICAgICAgICBzZWxmLl9saW5lX2NvbnN1bWVkID0gMQorICAgICAgICBzZWxmLnJlYWQgPSBzZWxmLl9maWxlLnJlYWQKKyAgICAgICAgc2VsZi5yZWFkbGluZSA9IHNlbGYuX2ZpbGUucmVhZGxpbmUKKyAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBzZWxmLl9maWxlLnJlYWRsaW5lcworCisgICAgZGVmIHJlYWQoc2VsZiwgYW10PU5vbmUpOgorICAgICAgICBpZiBzZWxmLl9saW5lX2NvbnN1bWVkOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUucmVhZChhbXQpCisgICAgICAgIGFzc2VydCBzZWxmLl9saW5lX2xlZnQKKyAgICAgICAgaWYgYW10IGlzIE5vbmUgb3IgYW10ID4gc2VsZi5fbGluZV9sZWZ0OgorICAgICAgICAgICAgcyA9IHNlbGYuX2xpbmVbc2VsZi5fbGluZV9vZmZzZXQ6XQorICAgICAgICAgICAgc2VsZi5fZG9uZSgpCisgICAgICAgICAgICBpZiBhbXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcyArIHNlbGYuX2ZpbGUucmVhZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzICsgc2VsZi5fZmlsZS5yZWFkKGFtdCAtIGxlbihzKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydCBhbXQgPD0gc2VsZi5fbGluZV9sZWZ0CisgICAgICAgICAgICBpID0gc2VsZi5fbGluZV9vZmZzZXQKKyAgICAgICAgICAgIGogPSBpICsgYW10CisgICAgICAgICAgICBzID0gc2VsZi5fbGluZVtpOmpdCisgICAgICAgICAgICBzZWxmLl9saW5lX29mZnNldCA9IGoKKyAgICAgICAgICAgIHNlbGYuX2xpbmVfbGVmdCAtPSBhbXQKKyAgICAgICAgICAgIGlmIHNlbGYuX2xpbmVfbGVmdCA9PSAwOgorICAgICAgICAgICAgICAgIHNlbGYuX2RvbmUoKQorICAgICAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fbGluZV9jb25zdW1lZDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2xpbmVfbGVmdAorICAgICAgICBzID0gc2VsZi5fbGluZVtzZWxmLl9saW5lX29mZnNldDpdCisgICAgICAgIHNlbGYuX2RvbmUoKQorICAgICAgICByZXR1cm4gcworCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmLCBzaXplPU5vbmUpOgorICAgICAgICBpZiBzZWxmLl9saW5lX2NvbnN1bWVkOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUucmVhZGxpbmVzKHNpemUpCisgICAgICAgIGFzc2VydCBzZWxmLl9saW5lX2xlZnQKKyAgICAgICAgTCA9IFtzZWxmLl9saW5lW3NlbGYuX2xpbmVfb2Zmc2V0Ol1dCisgICAgICAgIHNlbGYuX2RvbmUoKQorICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTCArIHNlbGYuX2ZpbGUucmVhZGxpbmVzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBMICsgc2VsZi5fZmlsZS5yZWFkbGluZXMoc2l6ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaHR0cGxpYi5weWMgYi9saWIvcHl0aG9uMi43L2h0dHBsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Y2I4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2h0dHBsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaHR0cGxpYi5weW8gYi9saWIvcHl0aG9uMi43L2h0dHBsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmN2U1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2h0dHBsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGUucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0NvbXBsZXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTczMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0NvbXBsZXRlLnB5CkBAIC0wLDAgKzEsMjI3IEBACisiIiJBdXRvQ29tcGxldGUucHkgLSBBbiBJRExFIGV4dGVuc2lvbiBmb3IgYXV0b21hdGljYWxseSBjb21wbGV0aW5nIG5hbWVzLgorCitUaGlzIGV4dGVuc2lvbiBjYW4gY29tcGxldGUgZWl0aGVyIGF0dHJpYnV0ZSBuYW1lcyBvZiBmaWxlIG5hbWVzLiBJdCBjYW4gcG9wCithIHdpbmRvdyB3aXRoIGFsbCBhdmFpbGFibGUgbmFtZXMsIGZvciB0aGUgdXNlciB0byBzZWxlY3QgZnJvbS4KKyIiIgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc3RyaW5nCisKK2Zyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorCisjIFRoaXMgc3RyaW5nIGluY2x1ZGVzIGFsbCBjaGFycyB0aGF0IG1heSBiZSBpbiBhIGZpbGUgbmFtZSAod2l0aG91dCBhIHBhdGgKKyMgc2VwYXJhdG9yKQorRklMRU5BTUVfQ0hBUlMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyBvcy5jdXJkaXIgKyAiLl9+IyQ6LSIKKyMgVGhpcyBzdHJpbmcgaW5jbHVkZXMgYWxsIGNoYXJzIHRoYXQgbWF5IGJlIGluIGFuIGlkZW50aWZpZXIKK0lEX0NIQVJTID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgIl8iCisKKyMgVGhlc2UgY29uc3RhbnRzIHJlcHJlc2VudCB0aGUgdHdvIGRpZmZlcmVudCB0eXBlcyBvZiBjb21wbGV0aW9ucworQ09NUExFVEVfQVRUUklCVVRFUywgQ09NUExFVEVfRklMRVMgPSByYW5nZSgxLCAyKzEpCisKK2Zyb20gaWRsZWxpYiBpbXBvcnQgQXV0b0NvbXBsZXRlV2luZG93Citmcm9tIGlkbGVsaWIuSHlwZXJQYXJzZXIgaW1wb3J0IEh5cGVyUGFyc2VyCisKK2ltcG9ydCBfX21haW5fXworCitTRVBTID0gb3Muc2VwCitpZiBvcy5hbHRzZXA6ICAjIGUuZy4gJy8nIG9uIFdpbmRvd3MuLi4KKyAgICBTRVBTICs9IG9zLmFsdHNlcAorCitjbGFzcyBBdXRvQ29tcGxldGU6CisKKyAgICBtZW51ZGVmcyA9IFsKKyAgICAgICAgKCdlZGl0JywgWworICAgICAgICAgICAgKCJTaG93IENvbXBsZXRpb25zIiwgIjw8Zm9yY2Utb3Blbi1jb21wbGV0aW9ucz4+IiksCisgICAgICAgIF0pCisgICAgXQorCisgICAgcG9wdXB3YWl0ID0gaWRsZUNvbmYuR2V0T3B0aW9uKCJleHRlbnNpb25zIiwgIkF1dG9Db21wbGV0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3B1cHdhaXQiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTApCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbj1Ob25lKToKKyAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgorICAgICAgICBpZiBlZGl0d2luIGlzIE5vbmU6ICAjIHN1YnByb2Nlc3MgYW5kIHRlc3QKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnRleHQgPSBlZGl0d2luLnRleHQKKyAgICAgICAgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cgPSBOb25lCisKKyAgICAgICAgIyBpZCBvZiBkZWxheWVkIGNhbGwsIGFuZCB0aGUgaW5kZXggb2YgdGhlIHRleHQgaW5zZXJ0IHdoZW4gdGhlIGRlbGF5ZWQKKyAgICAgICAgIyBjYWxsIHdhcyBpc3N1ZWQuIElmIF9kZWxheWVkX2NvbXBsZXRpb25faWQgaXMgTm9uZSwgdGhlcmUgaXMgbm8KKyAgICAgICAgIyBkZWxheWVkIGNhbGwuCisgICAgICAgIHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pZCA9IE5vbmUKKyAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2luZGV4ID0gTm9uZQorCisgICAgZGVmIF9tYWtlX2F1dG9jb21wbGV0ZV93aW5kb3coc2VsZik6CisgICAgICAgIHJldHVybiBBdXRvQ29tcGxldGVXaW5kb3cuQXV0b0NvbXBsZXRlV2luZG93KHNlbGYudGV4dCkKKworICAgIGRlZiBfcmVtb3ZlX2F1dG9jb21wbGV0ZV93aW5kb3coc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuYXV0b2NvbXBsZXRld2luZG93OgorICAgICAgICAgICAgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cuaGlkZV93aW5kb3coKQorICAgICAgICAgICAgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cgPSBOb25lCisKKyAgICBkZWYgZm9yY2Vfb3Blbl9jb21wbGV0aW9uc19ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgICIiIkhhcHBlbnMgd2hlbiB0aGUgdXNlciByZWFsbHkgd2FudHMgdG8gb3BlbiBhIGNvbXBsZXRpb24gbGlzdCwgZXZlbgorICAgICAgICBpZiBhIGZ1bmN0aW9uIGNhbGwgaXMgbmVlZGVkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5vcGVuX2NvbXBsZXRpb25zKFRydWUsIEZhbHNlLCBUcnVlKQorCisgICAgZGVmIHRyeV9vcGVuX2NvbXBsZXRpb25zX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgIiIiSGFwcGVucyB3aGVuIGl0IHdvdWxkIGJlIG5pY2UgdG8gb3BlbiBhIGNvbXBsZXRpb24gbGlzdCwgYnV0IG5vdAorICAgICAgICByZWFsbHkgbmVjZXNzYXJ5LCBmb3IgZXhhbXBsZSBhZnRlciBhbiBkb3QsIHNvIGZ1bmN0aW9uCisgICAgICAgIGNhbGxzIHdvbid0IGJlIG1hZGUuCisgICAgICAgICIiIgorICAgICAgICBsYXN0Y2hhciA9IHNlbGYudGV4dC5nZXQoImluc2VydC0xYyIpCisgICAgICAgIGlmIGxhc3RjaGFyID09ICIuIjoKKyAgICAgICAgICAgIHNlbGYuX29wZW5fY29tcGxldGlvbnNfbGF0ZXIoRmFsc2UsIEZhbHNlLCBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NUExFVEVfQVRUUklCVVRFUykKKyAgICAgICAgZWxpZiBsYXN0Y2hhciBpbiBTRVBTOgorICAgICAgICAgICAgc2VsZi5fb3Blbl9jb21wbGV0aW9uc19sYXRlcihGYWxzZSwgRmFsc2UsIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QTEVURV9GSUxFUykKKworICAgIGRlZiBhdXRvY29tcGxldGVfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiJIYXBwZW5zIHdoZW4gdGhlIHVzZXIgd2FudHMgdG8gY29tcGxldGUgaGlzIHdvcmQsIGFuZCBpZiBuZWNlc3NhcnksCisgICAgICAgIG9wZW4gYSBjb21wbGV0aW9uIGxpc3QgYWZ0ZXIgdGhhdCAoaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZQorICAgICAgICBjb21wbGV0aW9uKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgaGFzYXR0cihldmVudCwgIm1jX3N0YXRlIikgYW5kIGV2ZW50Lm1jX3N0YXRlOgorICAgICAgICAgICAgIyBBIG1vZGlmaWVyIHdhcyBwcmVzc2VkIGFsb25nIHdpdGggdGhlIHRhYiwgY29udGludWUgYXMgdXN1YWwuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cgYW5kIHNlbGYuYXV0b2NvbXBsZXRld2luZG93LmlzX2FjdGl2ZSgpOgorICAgICAgICAgICAgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cuY29tcGxldGUoKQorICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wZW5lZCA9IHNlbGYub3Blbl9jb21wbGV0aW9ucyhGYWxzZSwgVHJ1ZSwgVHJ1ZSkKKyAgICAgICAgICAgIGlmIG9wZW5lZDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIF9vcGVuX2NvbXBsZXRpb25zX2xhdGVyKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2luZGV4ID0gc2VsZi50ZXh0LmluZGV4KCJpbnNlcnQiKQorICAgICAgICBpZiBzZWxmLl9kZWxheWVkX2NvbXBsZXRpb25faWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnRleHQuYWZ0ZXJfY2FuY2VsKHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pZCkKKyAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2lkID0gXAorICAgICAgICAgICAgc2VsZi50ZXh0LmFmdGVyKHNlbGYucG9wdXB3YWl0LCBzZWxmLl9kZWxheWVkX29wZW5fY29tcGxldGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ3MpCisKKyAgICBkZWYgX2RlbGF5ZWRfb3Blbl9jb21wbGV0aW9ucyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pZCA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi50ZXh0LmluZGV4KCJpbnNlcnQiKSAhPSBzZWxmLl9kZWxheWVkX2NvbXBsZXRpb25faW5kZXg6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5vcGVuX2NvbXBsZXRpb25zKCphcmdzKQorCisgICAgZGVmIG9wZW5fY29tcGxldGlvbnMoc2VsZiwgZXZhbGZ1bmNzLCBjb21wbGV0ZSwgdXNlcldhbnRzV2luLCBtb2RlPU5vbmUpOgorICAgICAgICAiIiJGaW5kIHRoZSBjb21wbGV0aW9ucyBhbmQgY3JlYXRlIHRoZSBBdXRvQ29tcGxldGVXaW5kb3cuCisgICAgICAgIFJldHVybiBUcnVlIGlmIHN1Y2Nlc3NmdWwgKG5vIHN5bnRheCBlcnJvciBvciBzbyBmb3VuZCkuCisgICAgICAgIGlmIGNvbXBsZXRlIGlzIFRydWUsIHRoZW4gaWYgdGhlcmUncyBub3RoaW5nIHRvIGNvbXBsZXRlIGFuZCBubworICAgICAgICBzdGFydCBvZiBjb21wbGV0aW9uLCB3b24ndCBvcGVuIGNvbXBsZXRpb25zIGFuZCByZXR1cm4gRmFsc2UuCisgICAgICAgIElmIG1vZGUgaXMgZ2l2ZW4sIHdpbGwgb3BlbiBhIGNvbXBsZXRpb24gbGlzdCBvbmx5IGluIHRoaXMgbW9kZS4KKyAgICAgICAgIiIiCisgICAgICAgICMgQ2FuY2VsIGFub3RoZXIgZGVsYXllZCBjYWxsLCBpZiBpdCBleGlzdHMuCisgICAgICAgIGlmIHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGV4dC5hZnRlcl9jYW5jZWwoc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2lkKQorICAgICAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2lkID0gTm9uZQorCisgICAgICAgIGhwID0gSHlwZXJQYXJzZXIoc2VsZi5lZGl0d2luLCAiaW5zZXJ0IikKKyAgICAgICAgY3VybGluZSA9IHNlbGYudGV4dC5nZXQoImluc2VydCBsaW5lc3RhcnQiLCAiaW5zZXJ0IikKKyAgICAgICAgaSA9IGogPSBsZW4oY3VybGluZSkKKyAgICAgICAgaWYgaHAuaXNfaW5fc3RyaW5nKCkgYW5kIChub3QgbW9kZSBvciBtb2RlPT1DT01QTEVURV9GSUxFUyk6CisgICAgICAgICAgICBzZWxmLl9yZW1vdmVfYXV0b2NvbXBsZXRlX3dpbmRvdygpCisgICAgICAgICAgICBtb2RlID0gQ09NUExFVEVfRklMRVMKKyAgICAgICAgICAgIHdoaWxlIGkgYW5kIGN1cmxpbmVbaS0xXSBpbiBGSUxFTkFNRV9DSEFSUzoKKyAgICAgICAgICAgICAgICBpIC09IDEKKyAgICAgICAgICAgIGNvbXBfc3RhcnQgPSBjdXJsaW5lW2k6al0KKyAgICAgICAgICAgIGogPSBpCisgICAgICAgICAgICB3aGlsZSBpIGFuZCBjdXJsaW5lW2ktMV0gaW4gRklMRU5BTUVfQ0hBUlMgKyBTRVBTOgorICAgICAgICAgICAgICAgIGkgLT0gMQorICAgICAgICAgICAgY29tcF93aGF0ID0gY3VybGluZVtpOmpdCisgICAgICAgIGVsaWYgaHAuaXNfaW5fY29kZSgpIGFuZCAobm90IG1vZGUgb3IgbW9kZT09Q09NUExFVEVfQVRUUklCVVRFUyk6CisgICAgICAgICAgICBzZWxmLl9yZW1vdmVfYXV0b2NvbXBsZXRlX3dpbmRvdygpCisgICAgICAgICAgICBtb2RlID0gQ09NUExFVEVfQVRUUklCVVRFUworICAgICAgICAgICAgd2hpbGUgaSBhbmQgY3VybGluZVtpLTFdIGluIElEX0NIQVJTOgorICAgICAgICAgICAgICAgIGkgLT0gMQorICAgICAgICAgICAgY29tcF9zdGFydCA9IGN1cmxpbmVbaTpqXQorICAgICAgICAgICAgaWYgaSBhbmQgY3VybGluZVtpLTFdID09ICcuJzoKKyAgICAgICAgICAgICAgICBocC5zZXRfaW5kZXgoImluc2VydC0lZGMiICUgKGxlbihjdXJsaW5lKS0oaS0xKSkpCisgICAgICAgICAgICAgICAgY29tcF93aGF0ID0gaHAuZ2V0X2V4cHJlc3Npb24oKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjb21wX3doYXQgb3IgXAorICAgICAgICAgICAgICAgICAgIChub3QgZXZhbGZ1bmNzIGFuZCBjb21wX3doYXQuZmluZCgnKCcpICE9IC0xKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbXBfd2hhdCA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBjb21wbGV0ZSBhbmQgbm90IGNvbXBfd2hhdCBhbmQgbm90IGNvbXBfc3RhcnQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgY29tcF9saXN0cyA9IHNlbGYuZmV0Y2hfY29tcGxldGlvbnMoY29tcF93aGF0LCBtb2RlKQorICAgICAgICBpZiBub3QgY29tcF9saXN0c1swXToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdyA9IHNlbGYuX21ha2VfYXV0b2NvbXBsZXRlX3dpbmRvdygpCisgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRld2luZG93LnNob3dfd2luZG93KGNvbXBfbGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQtJWRjIiAlIGxlbihjb21wX3N0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJXYW50c1dpbikKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBmZXRjaF9jb21wbGV0aW9ucyhzZWxmLCB3aGF0LCBtb2RlKToKKyAgICAgICAgIiIiUmV0dXJuIGEgcGFpciBvZiBsaXN0cyBvZiBjb21wbGV0aW9ucyBmb3Igc29tZXRoaW5nLiBUaGUgZmlyc3QgbGlzdAorICAgICAgICBpcyBhIHN1Ymxpc3Qgb2YgdGhlIHNlY29uZC4gQm90aCBhcmUgc29ydGVkLgorCisgICAgICAgIElmIHRoZXJlIGlzIGEgUHl0aG9uIHN1YnByb2Nlc3MsIGdldCB0aGUgY29tcC4gbGlzdCB0aGVyZS4gIE90aGVyd2lzZSwKKyAgICAgICAgZWl0aGVyIGZldGNoX2NvbXBsZXRpb25zKCkgaXMgcnVubmluZyBpbiB0aGUgc3VicHJvY2VzcyBpdHNlbGYgb3IgaXQKKyAgICAgICAgd2FzIGNhbGxlZCBpbiBhbiBJRExFIEVkaXRvcldpbmRvdyBiZWZvcmUgYW55IHNjcmlwdCBoYWQgYmVlbiBydW4uCisKKyAgICAgICAgVGhlIHN1YnByb2Nlc3MgZW52aXJvbm1lbnQgaXMgdGhhdCBvZiB0aGUgbW9zdCByZWNlbnRseSBydW4gc2NyaXB0LiAgSWYKKyAgICAgICAgdHdvIHVucmVsYXRlZCBtb2R1bGVzIGFyZSBiZWluZyBlZGl0ZWQgc29tZSBjYWxsdGlwcyBpbiB0aGUgY3VycmVudAorICAgICAgICBtb2R1bGUgbWF5IGJlIGlub3BlcmF0aXZlIGlmIHRoZSBtb2R1bGUgd2FzIG5vdCB0aGUgbGFzdCB0byBydW4uCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBycGNjbHQgPSBzZWxmLmVkaXR3aW4uZmxpc3QucHlzaGVsbC5pbnRlcnAucnBjY2x0CisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJwY2NsdCA9IE5vbmUKKyAgICAgICAgaWYgcnBjY2x0OgorICAgICAgICAgICAgcmV0dXJuIHJwY2NsdC5yZW1vdGVjYWxsKCJleGVjIiwgImdldF90aGVfY29tcGxldGlvbl9saXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hhdCwgbW9kZSksIHt9KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbW9kZSA9PSBDT01QTEVURV9BVFRSSUJVVEVTOgorICAgICAgICAgICAgICAgIGlmIHdoYXQgPT0gIiI6CisgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSA9IF9fbWFpbl9fLl9fZGljdF9fLmNvcHkoKQorICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2UudXBkYXRlKF9fbWFpbl9fLl9fYnVpbHRpbnNfXy5fX2RpY3RfXykKKyAgICAgICAgICAgICAgICAgICAgYmlnbCA9IGV2YWwoImRpcigpIiwgbmFtZXNwYWNlKQorICAgICAgICAgICAgICAgICAgICBiaWdsLnNvcnQoKQorICAgICAgICAgICAgICAgICAgICBpZiAiX19hbGxfXyIgaW4gYmlnbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsbCA9IHNvcnRlZChldmFsKCJfX2FsbF9fIiwgbmFtZXNwYWNlKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsbCA9IFtzIGZvciBzIGluIGJpZ2wgaWYgc1s6MV0gIT0gJ18nXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9IHNlbGYuZ2V0X2VudGl0eSh3aGF0KQorICAgICAgICAgICAgICAgICAgICAgICAgYmlnbCA9IGRpcihlbnRpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICBiaWdsLnNvcnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgIl9fYWxsX18iIGluIGJpZ2w6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxsID0gc29ydGVkKGVudGl0eS5fX2FsbF9fKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbGwgPSBbcyBmb3IgcyBpbiBiaWdsIGlmIHNbOjFdICE9ICdfJ10KKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdLCBbXQorCisgICAgICAgICAgICBlbGlmIG1vZGUgPT0gQ09NUExFVEVfRklMRVM6CisgICAgICAgICAgICAgICAgaWYgd2hhdCA9PSAiIjoKKyAgICAgICAgICAgICAgICAgICAgd2hhdCA9ICIuIgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKHdoYXQpCisgICAgICAgICAgICAgICAgICAgIGJpZ2wgPSBvcy5saXN0ZGlyKGV4cGFuZGVkcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgYmlnbC5zb3J0KCkKKyAgICAgICAgICAgICAgICAgICAgc21hbGxsID0gW3MgZm9yIHMgaW4gYmlnbCBpZiBzWzoxXSAhPSAnLiddCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSwgW10KKworICAgICAgICAgICAgaWYgbm90IHNtYWxsbDoKKyAgICAgICAgICAgICAgICBzbWFsbGwgPSBiaWdsCisgICAgICAgICAgICByZXR1cm4gc21hbGxsLCBiaWdsCisKKyAgICBkZWYgZ2V0X2VudGl0eShzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiTG9va3VwIG5hbWUgaW4gYSBuYW1lc3BhY2Ugc3Bhbm5pbmcgc3lzLm1vZHVsZXMgYW5kIF9fbWFpbi5kaWN0X18iIiIKKyAgICAgICAgbmFtZXNwYWNlID0gc3lzLm1vZHVsZXMuY29weSgpCisgICAgICAgIG5hbWVzcGFjZS51cGRhdGUoX19tYWluX18uX19kaWN0X18pCisgICAgICAgIHJldHVybiBldmFsKG5hbWUsIG5hbWVzcGFjZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGUucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyZjI2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGUucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyZjI2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0NvbXBsZXRlV2luZG93LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ODE3N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0NvbXBsZXRlV2luZG93LnB5CkBAIC0wLDAgKzEsNDA1IEBACisiIiIKK0FuIGF1dG8tY29tcGxldGlvbiB3aW5kb3cgZm9yIElETEUsIHVzZWQgYnkgdGhlIEF1dG9Db21wbGV0ZSBleHRlbnNpb24KKyIiIgorZnJvbSBUa2ludGVyIGltcG9ydCAqCitmcm9tIGlkbGVsaWIuTXVsdGlDYWxsIGltcG9ydCBNQ19TSElGVAorZnJvbSBpZGxlbGliLkF1dG9Db21wbGV0ZSBpbXBvcnQgQ09NUExFVEVfRklMRVMsIENPTVBMRVRFX0FUVFJJQlVURVMKKworSElERV9WSVJUVUFMX0VWRU5UX05BTUUgPSAiPDxhdXRvY29tcGxldGV3aW5kb3ctaGlkZT4+IgorSElERV9TRVFVRU5DRVMgPSAoIjxGb2N1c091dD4iLCAiPEJ1dHRvblByZXNzPiIpCitLRVlQUkVTU19WSVJUVUFMX0VWRU5UX05BTUUgPSAiPDxhdXRvY29tcGxldGV3aW5kb3cta2V5cHJlc3M+PiIKKyMgV2UgbmVlZCB0byBiaW5kIGV2ZW50IGJleW9uZCA8S2V5PiBzbyB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAorIyBiZWZvcmUgdGhlIGRlZmF1bHQgc3BlY2lmaWMgSURMRSBmdW5jdGlvbgorS0VZUFJFU1NfU0VRVUVOQ0VTID0gKCI8S2V5PiIsICI8S2V5LUJhY2tTcGFjZT4iLCAiPEtleS1SZXR1cm4+IiwgIjxLZXktVGFiPiIsCisgICAgICAgICAgICAgICAgICAgICAgIjxLZXktVXA+IiwgIjxLZXktRG93bj4iLCAiPEtleS1Ib21lPiIsICI8S2V5LUVuZD4iLAorICAgICAgICAgICAgICAgICAgICAgICI8S2V5LVByaW9yPiIsICI8S2V5LU5leHQ+IikKK0tFWVJFTEVBU0VfVklSVFVBTF9FVkVOVF9OQU1FID0gIjw8YXV0b2NvbXBsZXRld2luZG93LWtleXJlbGVhc2U+PiIKK0tFWVJFTEVBU0VfU0VRVUVOQ0UgPSAiPEtleVJlbGVhc2U+IgorTElTVFVQREFURV9TRVFVRU5DRSA9ICI8QjEtQnV0dG9uUmVsZWFzZT4iCitXSU5DT05GSUdfU0VRVUVOQ0UgPSAiPENvbmZpZ3VyZT4iCitET1VCTEVDTElDS19TRVFVRU5DRSA9ICI8QjEtRG91YmxlLUJ1dHRvblJlbGVhc2U+IgorCitjbGFzcyBBdXRvQ29tcGxldGVXaW5kb3c6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2lkZ2V0KToKKyAgICAgICAgIyBUaGUgd2lkZ2V0IChUZXh0KSBvbiB3aGljaCB3ZSBwbGFjZSB0aGUgQXV0b0NvbXBsZXRlV2luZG93CisgICAgICAgIHNlbGYud2lkZ2V0ID0gd2lkZ2V0CisgICAgICAgICMgVGhlIHdpZGdldHMgd2UgY3JlYXRlCisgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRld2luZG93ID0gc2VsZi5saXN0Ym94ID0gc2VsZi5zY3JvbGxiYXIgPSBOb25lCisgICAgICAgICMgVGhlIGRlZmF1bHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBvZiBhIHNlbGVjdGlvbi4gU2F2ZWQgYmVjYXVzZQorICAgICAgICAjIHRoZXkgYXJlIGNoYW5nZWQgdG8gdGhlIHJlZ3VsYXIgY29sb3JzIG9mIGxpc3QgaXRlbXMgd2hlbiB0aGUKKyAgICAgICAgIyBjb21wbGV0aW9uIHN0YXJ0IGlzIG5vdCBhIHByZWZpeCBvZiB0aGUgc2VsZWN0ZWQgY29tcGxldGlvbgorICAgICAgICBzZWxmLm9yaWdzZWxmb3JlZ3JvdW5kID0gc2VsZi5vcmlnc2VsYmFja2dyb3VuZCA9IE5vbmUKKyAgICAgICAgIyBUaGUgbGlzdCBvZiBjb21wbGV0aW9ucworICAgICAgICBzZWxmLmNvbXBsZXRpb25zID0gTm9uZQorICAgICAgICAjIEEgbGlzdCB3aXRoIG1vcmUgY29tcGxldGlvbnMsIG9yIE5vbmUKKyAgICAgICAgc2VsZi5tb3JlY29tcGxldGlvbnMgPSBOb25lCisgICAgICAgICMgVGhlIGNvbXBsZXRpb24gbW9kZS4gRWl0aGVyIEF1dG9Db21wbGV0ZS5DT01QTEVURV9BVFRSSUJVVEVTIG9yCisgICAgICAgICMgQXV0b0NvbXBsZXRlLkNPTVBMRVRFX0ZJTEVTCisgICAgICAgIHNlbGYubW9kZSA9IE5vbmUKKyAgICAgICAgIyBUaGUgY3VycmVudCBjb21wbGV0aW9uIHN0YXJ0LCBvbiB0aGUgdGV4dCBib3ggKGEgc3RyaW5nKQorICAgICAgICBzZWxmLnN0YXJ0ID0gTm9uZQorICAgICAgICAjIFRoZSBpbmRleCBvZiB0aGUgc3RhcnQgb2YgdGhlIGNvbXBsZXRpb24KKyAgICAgICAgc2VsZi5zdGFydGluZGV4ID0gTm9uZQorICAgICAgICAjIFRoZSBsYXN0IHR5cGVkIHN0YXJ0LCB1c2VkIHNvIHRoYXQgd2hlbiB0aGUgc2VsZWN0aW9uIGNoYW5nZXMsCisgICAgICAgICMgdGhlIG5ldyBzdGFydCB3aWxsIGJlIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIHRoZSBsYXN0IHR5cGVkIG9uZS4KKyAgICAgICAgc2VsZi5sYXN0dHlwZWRzdGFydCA9IE5vbmUKKyAgICAgICAgIyBEbyB3ZSBoYXZlIGFuIGluZGljYXRpb24gdGhhdCB0aGUgdXNlciB3YW50cyB0aGUgY29tcGxldGlvbiB3aW5kb3cKKyAgICAgICAgIyAoZm9yIGV4YW1wbGUsIGhlIGNsaWNrZWQgdGhlIGxpc3QpCisgICAgICAgIHNlbGYudXNlcndhbnRzd2luZG93ID0gTm9uZQorICAgICAgICAjIGV2ZW50IGlkcworICAgICAgICBzZWxmLmhpZGVpZCA9IHNlbGYua2V5cHJlc3NpZCA9IHNlbGYubGlzdHVwZGF0ZWlkID0gc2VsZi53aW5jb25maWdpZCBcCisgICAgICAgID0gc2VsZi5rZXlyZWxlYXNlaWQgPSBzZWxmLmRvdWJsZWNsaWNraWQgICAgICAgICAgICAgICAgICAgICAgICAgPSBOb25lCisgICAgICAgICMgRmxhZyBzZXQgaWYgbGFzdCBrZXlwcmVzcyB3YXMgYSB0YWIKKyAgICAgICAgc2VsZi5sYXN0a2V5X3dhc190YWIgPSBGYWxzZQorCisgICAgZGVmIF9jaGFuZ2Vfc3RhcnQoc2VsZiwgbmV3c3RhcnQpOgorICAgICAgICBtaW5fbGVuID0gbWluKGxlbihzZWxmLnN0YXJ0KSwgbGVuKG5ld3N0YXJ0KSkKKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUgaSA8IG1pbl9sZW4gYW5kIHNlbGYuc3RhcnRbaV0gPT0gbmV3c3RhcnRbaV06CisgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgaWYgaSA8IGxlbihzZWxmLnN0YXJ0KToKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0LmRlbGV0ZSgiJXMrJWRjIiAlIChzZWxmLnN0YXJ0aW5kZXgsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyslZGMiICUgKHNlbGYuc3RhcnRpbmRleCwgbGVuKHNlbGYuc3RhcnQpKSkKKyAgICAgICAgaWYgaSA8IGxlbihuZXdzdGFydCk6CisgICAgICAgICAgICBzZWxmLndpZGdldC5pbnNlcnQoIiVzKyVkYyIgJSAoc2VsZi5zdGFydGluZGV4LCBpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzdGFydFtpOl0pCisgICAgICAgIHNlbGYuc3RhcnQgPSBuZXdzdGFydAorCisgICAgZGVmIF9iaW5hcnlfc2VhcmNoKHNlbGYsIHMpOgorICAgICAgICAiIiJGaW5kIHRoZSBmaXJzdCBpbmRleCBpbiBzZWxmLmNvbXBsZXRpb25zIHdoZXJlIGNvbXBsZXRpb25zW2ldIGlzCisgICAgICAgIGdyZWF0ZXIgb3IgZXF1YWwgdG8gcywgb3IgdGhlIGxhc3QgaW5kZXggaWYgdGhlcmUgaXMgbm8gc3VjaAorICAgICAgICBvbmUuIiIiCisgICAgICAgIGkgPSAwOyBqID0gbGVuKHNlbGYuY29tcGxldGlvbnMpCisgICAgICAgIHdoaWxlIGogPiBpOgorICAgICAgICAgICAgbSA9IChpICsgaikgLy8gMgorICAgICAgICAgICAgaWYgc2VsZi5jb21wbGV0aW9uc1ttXSA+PSBzOgorICAgICAgICAgICAgICAgIGogPSBtCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGkgPSBtICsgMQorICAgICAgICByZXR1cm4gbWluKGksIGxlbihzZWxmLmNvbXBsZXRpb25zKS0xKQorCisgICAgZGVmIF9jb21wbGV0ZV9zdHJpbmcoc2VsZiwgcyk6CisgICAgICAgICIiIkFzc3VtaW5nIHRoYXQgcyBpcyB0aGUgcHJlZml4IG9mIGEgc3RyaW5nIGluIHNlbGYuY29tcGxldGlvbnMsCisgICAgICAgIHJldHVybiB0aGUgbG9uZ2VzdCBzdHJpbmcgd2hpY2ggaXMgYSBwcmVmaXggb2YgYWxsIHRoZSBzdHJpbmdzIHdoaWNoCisgICAgICAgIHMgaXMgYSBwcmVmaXggb2YgdGhlbS4gSWYgcyBpcyBub3QgYSBwcmVmaXggb2YgYSBzdHJpbmcsIHJldHVybiBzLiIiIgorICAgICAgICBmaXJzdCA9IHNlbGYuX2JpbmFyeV9zZWFyY2gocykKKyAgICAgICAgaWYgc2VsZi5jb21wbGV0aW9uc1tmaXJzdF1bOmxlbihzKV0gIT0gczoKKyAgICAgICAgICAgICMgVGhlcmUgaXMgbm90IGV2ZW4gb25lIGNvbXBsZXRpb24gd2hpY2ggcyBpcyBhIHByZWZpeCBvZi4KKyAgICAgICAgICAgIHJldHVybiBzCisgICAgICAgICMgRmluZCB0aGUgZW5kIG9mIHRoZSByYW5nZSBvZiBjb21wbGV0aW9ucyB3aGVyZSBzIGlzIGEgcHJlZml4IG9mLgorICAgICAgICBpID0gZmlyc3QgKyAxCisgICAgICAgIGogPSBsZW4oc2VsZi5jb21wbGV0aW9ucykKKyAgICAgICAgd2hpbGUgaiA+IGk6CisgICAgICAgICAgICBtID0gKGkgKyBqKSAvLyAyCisgICAgICAgICAgICBpZiBzZWxmLmNvbXBsZXRpb25zW21dWzpsZW4ocyldICE9IHM6CisgICAgICAgICAgICAgICAgaiA9IG0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaSA9IG0gKyAxCisgICAgICAgIGxhc3QgPSBpLTEKKworICAgICAgICBpZiBmaXJzdCA9PSBsYXN0OiAjIG9ubHkgb25lIHBvc3NpYmxlIGNvbXBsZXRpb24KKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbXBsZXRpb25zW2ZpcnN0XQorCisgICAgICAgICMgV2Ugc2hvdWxkIHJldHVybiB0aGUgbWF4aW11bSBwcmVmaXggb2YgZmlyc3QgYW5kIGxhc3QKKyAgICAgICAgZmlyc3RfY29tcCA9IHNlbGYuY29tcGxldGlvbnNbZmlyc3RdCisgICAgICAgIGxhc3RfY29tcCA9IHNlbGYuY29tcGxldGlvbnNbbGFzdF0KKyAgICAgICAgbWluX2xlbiA9IG1pbihsZW4oZmlyc3RfY29tcCksIGxlbihsYXN0X2NvbXApKQorICAgICAgICBpID0gbGVuKHMpCisgICAgICAgIHdoaWxlIGkgPCBtaW5fbGVuIGFuZCBmaXJzdF9jb21wW2ldID09IGxhc3RfY29tcFtpXToKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICByZXR1cm4gZmlyc3RfY29tcFs6aV0KKworICAgIGRlZiBfc2VsZWN0aW9uX2NoYW5nZWQoc2VsZik6CisgICAgICAgICIiIlNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgc2VsZWN0aW9uIG9mIHRoZSBMaXN0Ym94IGhhcyBjaGFuZ2VkLgorICAgICAgICBVcGRhdGVzIHRoZSBMaXN0Ym94IGRpc3BsYXkgYW5kIGNhbGxzIF9jaGFuZ2Vfc3RhcnQuIiIiCisgICAgICAgIGN1cnNlbCA9IGludChzZWxmLmxpc3Rib3guY3Vyc2VsZWN0aW9uKClbMF0pCisKKyAgICAgICAgc2VsZi5saXN0Ym94LnNlZShjdXJzZWwpCisKKyAgICAgICAgbHRzID0gc2VsZi5sYXN0dHlwZWRzdGFydAorICAgICAgICBzZWxzdGFydCA9IHNlbGYuY29tcGxldGlvbnNbY3Vyc2VsXQorICAgICAgICBpZiBzZWxmLl9iaW5hcnlfc2VhcmNoKGx0cykgPT0gY3Vyc2VsOgorICAgICAgICAgICAgbmV3c3RhcnQgPSBsdHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1pbl9sZW4gPSBtaW4obGVuKGx0cyksIGxlbihzZWxzdGFydCkpCisgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgd2hpbGUgaSA8IG1pbl9sZW4gYW5kIGx0c1tpXSA9PSBzZWxzdGFydFtpXToKKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgIG5ld3N0YXJ0ID0gc2Vsc3RhcnRbOmldCisgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChuZXdzdGFydCkKKworICAgICAgICBpZiBzZWxmLmNvbXBsZXRpb25zW2N1cnNlbF1bOmxlbihzZWxmLnN0YXJ0KV0gPT0gc2VsZi5zdGFydDoKKyAgICAgICAgICAgICMgc3RhcnQgaXMgYSBwcmVmaXggb2YgdGhlIHNlbGVjdGVkIGNvbXBsZXRpb24KKyAgICAgICAgICAgIHNlbGYubGlzdGJveC5jb25maWd1cmUoc2VsZWN0YmFja2dyb3VuZD1zZWxmLm9yaWdzZWxiYWNrZ3JvdW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rmb3JlZ3JvdW5kPXNlbGYub3JpZ3NlbGZvcmVncm91bmQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxpc3Rib3guY29uZmlndXJlKHNlbGVjdGJhY2tncm91bmQ9c2VsZi5saXN0Ym94LmNnZXQoImJnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGZvcmVncm91bmQ9c2VsZi5saXN0Ym94LmNnZXQoImZnIikpCisgICAgICAgICAgICAjIElmIHRoZXJlIGFyZSBtb3JlIGNvbXBsZXRpb25zLCBzaG93IHRoZW0sIGFuZCBjYWxsIG1lIGFnYWluLgorICAgICAgICAgICAgaWYgc2VsZi5tb3JlY29tcGxldGlvbnM6CisgICAgICAgICAgICAgICAgc2VsZi5jb21wbGV0aW9ucyA9IHNlbGYubW9yZWNvbXBsZXRpb25zCisgICAgICAgICAgICAgICAgc2VsZi5tb3JlY29tcGxldGlvbnMgPSBOb25lCisgICAgICAgICAgICAgICAgc2VsZi5saXN0Ym94LmRlbGV0ZSgwLCBFTkQpCisgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5jb21wbGV0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saXN0Ym94Lmluc2VydChFTkQsIGl0ZW0pCisgICAgICAgICAgICAgICAgc2VsZi5saXN0Ym94LnNlbGVjdF9zZXQoc2VsZi5fYmluYXJ5X3NlYXJjaChzZWxmLnN0YXJ0KSkKKyAgICAgICAgICAgICAgICBzZWxmLl9zZWxlY3Rpb25fY2hhbmdlZCgpCisKKyAgICBkZWYgc2hvd193aW5kb3coc2VsZiwgY29tcF9saXN0cywgaW5kZXgsIGNvbXBsZXRlLCBtb2RlLCB1c2VyV2FudHNXaW4pOgorICAgICAgICAiIiJTaG93IHRoZSBhdXRvY29tcGxldGUgbGlzdCwgYmluZCBldmVudHMuCisgICAgICAgIElmIGNvbXBsZXRlIGlzIFRydWUsIGNvbXBsZXRlIHRoZSB0ZXh0LCBhbmQgaWYgdGhlcmUgaXMgZXhhY3RseSBvbmUKKyAgICAgICAgbWF0Y2hpbmcgY29tcGxldGlvbiwgZG9uJ3Qgb3BlbiBhIGxpc3QuIiIiCisgICAgICAgICMgSGFuZGxlIHRoZSBzdGFydCB3ZSBhbHJlYWR5IGhhdmUKKyAgICAgICAgc2VsZi5jb21wbGV0aW9ucywgc2VsZi5tb3JlY29tcGxldGlvbnMgPSBjb21wX2xpc3RzCisgICAgICAgIHNlbGYubW9kZSA9IG1vZGUKKyAgICAgICAgc2VsZi5zdGFydGluZGV4ID0gc2VsZi53aWRnZXQuaW5kZXgoaW5kZXgpCisgICAgICAgIHNlbGYuc3RhcnQgPSBzZWxmLndpZGdldC5nZXQoc2VsZi5zdGFydGluZGV4LCAiaW5zZXJ0IikKKyAgICAgICAgaWYgY29tcGxldGU6CisgICAgICAgICAgICBjb21wbGV0ZWQgPSBzZWxmLl9jb21wbGV0ZV9zdHJpbmcoc2VsZi5zdGFydCkKKyAgICAgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChjb21wbGV0ZWQpCisgICAgICAgICAgICBpID0gc2VsZi5fYmluYXJ5X3NlYXJjaChjb21wbGV0ZWQpCisgICAgICAgICAgICBpZiBzZWxmLmNvbXBsZXRpb25zW2ldID09IGNvbXBsZXRlZCBhbmQgXAorICAgICAgICAgICAgICAgKGkgPT0gbGVuKHNlbGYuY29tcGxldGlvbnMpLTEgb3IKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBsZXRpb25zW2krMV1bOmxlbihjb21wbGV0ZWQpXSAhPSBjb21wbGV0ZWQpOgorICAgICAgICAgICAgICAgICMgVGhlcmUgaXMgZXhhY3RseSBvbmUgbWF0Y2hpbmcgY29tcGxldGlvbgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnVzZXJ3YW50c3dpbmRvdyA9IHVzZXJXYW50c1dpbgorICAgICAgICBzZWxmLmxhc3R0eXBlZHN0YXJ0ID0gc2VsZi5zdGFydAorCisgICAgICAgICMgUHV0IHdpZGdldHMgaW4gcGxhY2UKKyAgICAgICAgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cgPSBhY3cgPSBUb3BsZXZlbChzZWxmLndpZGdldCkKKyAgICAgICAgIyBQdXQgaXQgaW4gYSBwb3NpdGlvbiBzbyB0aGF0IGl0IGlzIG5vdCBzZWVuLgorICAgICAgICBhY3cud21fZ2VvbWV0cnkoIisxMDAwMCsxMDAwMCIpCisgICAgICAgICMgTWFrZSBpdCBmbG9hdAorICAgICAgICBhY3cud21fb3ZlcnJpZGVyZWRpcmVjdCgxKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFRoaXMgY29tbWFuZCBpcyBvbmx5IG5lZWRlZCBhbmQgYXZhaWxhYmxlIG9uIFRrID49IDguNC4wIGZvciBPU1gKKyAgICAgICAgICAgICMgV2l0aG91dCBpdCwgY2FsbCB0aXBzIGludHJ1ZGUgb24gdGhlIHR5cGluZyBwcm9jZXNzIGJ5IGdyYWJiaW5nCisgICAgICAgICAgICAjIHRoZSBmb2N1cy4KKyAgICAgICAgICAgIGFjdy50ay5jYWxsKCI6OnRrOjp1bnN1cHBvcnRlZDo6TWFjV2luZG93U3R5bGUiLCAic3R5bGUiLCBhY3cuX3csCisgICAgICAgICAgICAgICAgICAgICAgICAiaGVscCIsICJub0FjdGl2YXRlcyIpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5zY3JvbGxiYXIgPSBzY3JvbGxiYXIgPSBTY3JvbGxiYXIoYWN3LCBvcmllbnQ9VkVSVElDQUwpCisgICAgICAgIHNlbGYubGlzdGJveCA9IGxpc3Rib3ggPSBMaXN0Ym94KGFjdywgeXNjcm9sbGNvbW1hbmQ9c2Nyb2xsYmFyLnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0c2VsZWN0aW9uPUZhbHNlLCBiZz0id2hpdGUiKQorICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmNvbXBsZXRpb25zOgorICAgICAgICAgICAgbGlzdGJveC5pbnNlcnQoRU5ELCBpdGVtKQorICAgICAgICBzZWxmLm9yaWdzZWxmb3JlZ3JvdW5kID0gbGlzdGJveC5jZ2V0KCJzZWxlY3Rmb3JlZ3JvdW5kIikKKyAgICAgICAgc2VsZi5vcmlnc2VsYmFja2dyb3VuZCA9IGxpc3Rib3guY2dldCgic2VsZWN0YmFja2dyb3VuZCIpCisgICAgICAgIHNjcm9sbGJhci5jb25maWcoY29tbWFuZD1saXN0Ym94Lnl2aWV3KQorICAgICAgICBzY3JvbGxiYXIucGFjayhzaWRlPVJJR0hULCBmaWxsPVkpCisgICAgICAgIGxpc3Rib3gucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCwgZXhwYW5kPVRydWUpCisKKyAgICAgICAgIyBJbml0aWFsaXplIHRoZSBsaXN0Ym94IHNlbGVjdGlvbgorICAgICAgICBzZWxmLmxpc3Rib3guc2VsZWN0X3NldChzZWxmLl9iaW5hcnlfc2VhcmNoKHNlbGYuc3RhcnQpKQorICAgICAgICBzZWxmLl9zZWxlY3Rpb25fY2hhbmdlZCgpCisKKyAgICAgICAgIyBiaW5kIGV2ZW50cworICAgICAgICBzZWxmLmhpZGVpZCA9IHNlbGYud2lkZ2V0LmJpbmQoSElERV9WSVJUVUFMX0VWRU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhpZGVfZXZlbnQpCisgICAgICAgIGZvciBzZXEgaW4gSElERV9TRVFVRU5DRVM6CisgICAgICAgICAgICBzZWxmLndpZGdldC5ldmVudF9hZGQoSElERV9WSVJUVUFMX0VWRU5UX05BTUUsIHNlcSkKKyAgICAgICAgc2VsZi5rZXlwcmVzc2lkID0gc2VsZi53aWRnZXQuYmluZChLRVlQUkVTU19WSVJUVUFMX0VWRU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5rZXlwcmVzc19ldmVudCkKKyAgICAgICAgZm9yIHNlcSBpbiBLRVlQUkVTU19TRVFVRU5DRVM6CisgICAgICAgICAgICBzZWxmLndpZGdldC5ldmVudF9hZGQoS0VZUFJFU1NfVklSVFVBTF9FVkVOVF9OQU1FLCBzZXEpCisgICAgICAgIHNlbGYua2V5cmVsZWFzZWlkID0gc2VsZi53aWRnZXQuYmluZChLRVlSRUxFQVNFX1ZJUlRVQUxfRVZFTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYua2V5cmVsZWFzZV9ldmVudCkKKyAgICAgICAgc2VsZi53aWRnZXQuZXZlbnRfYWRkKEtFWVJFTEVBU0VfVklSVFVBTF9FVkVOVF9OQU1FLEtFWVJFTEVBU0VfU0VRVUVOQ0UpCisgICAgICAgIHNlbGYubGlzdHVwZGF0ZWlkID0gbGlzdGJveC5iaW5kKExJU1RVUERBVEVfU0VRVUVOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGlzdHNlbGVjdF9ldmVudCkKKyAgICAgICAgc2VsZi53aW5jb25maWdpZCA9IGFjdy5iaW5kKFdJTkNPTkZJR19TRVFVRU5DRSwgc2VsZi53aW5jb25maWdfZXZlbnQpCisgICAgICAgIHNlbGYuZG91YmxlY2xpY2tpZCA9IGxpc3Rib3guYmluZChET1VCTEVDTElDS19TRVFVRU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZG91YmxlY2xpY2tfZXZlbnQpCisKKyAgICBkZWYgd2luY29uZmlnX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IHNlbGYuaXNfYWN0aXZlKCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBQb3NpdGlvbiB0aGUgY29tcGxldGlvbiBsaXN0IHdpbmRvdworICAgICAgICB0ZXh0ID0gc2VsZi53aWRnZXQKKyAgICAgICAgdGV4dC5zZWUoc2VsZi5zdGFydGluZGV4KQorICAgICAgICB4LCB5LCBjeCwgY3kgPSB0ZXh0LmJib3goc2VsZi5zdGFydGluZGV4KQorICAgICAgICBhY3cgPSBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdworICAgICAgICBhY3dfd2lkdGgsIGFjd19oZWlnaHQgPSBhY3cud2luZm9fd2lkdGgoKSwgYWN3LndpbmZvX2hlaWdodCgpCisgICAgICAgIHRleHRfd2lkdGgsIHRleHRfaGVpZ2h0ID0gdGV4dC53aW5mb193aWR0aCgpLCB0ZXh0LndpbmZvX2hlaWdodCgpCisgICAgICAgIG5ld194ID0gdGV4dC53aW5mb19yb290eCgpICsgbWluKHgsIG1heCgwLCB0ZXh0X3dpZHRoIC0gYWN3X3dpZHRoKSkKKyAgICAgICAgbmV3X3kgPSB0ZXh0LndpbmZvX3Jvb3R5KCkgKyB5CisgICAgICAgIGlmICh0ZXh0X2hlaWdodCAtICh5ICsgY3kpID49IGFjd19oZWlnaHQgIyBlbm91Z2ggaGVpZ2h0IGJlbG93CisgICAgICAgICAgICBvciB5IDwgYWN3X2hlaWdodCk6ICMgbm90IGVub3VnaCBoZWlnaHQgYWJvdmUKKyAgICAgICAgICAgICMgcGxhY2UgYWN3IGJlbG93IGN1cnJlbnQgbGluZQorICAgICAgICAgICAgbmV3X3kgKz0gY3kKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgcGxhY2UgYWN3IGFib3ZlIGN1cnJlbnQgbGluZQorICAgICAgICAgICAgbmV3X3kgLT0gYWN3X2hlaWdodAorICAgICAgICBhY3cud21fZ2VvbWV0cnkoIislZCslZCIgJSAobmV3X3gsIG5ld195KSkKKworICAgIGRlZiBoaWRlX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IHNlbGYuaXNfYWN0aXZlKCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5oaWRlX3dpbmRvdygpCisKKyAgICBkZWYgbGlzdHNlbGVjdF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGlmIG5vdCBzZWxmLmlzX2FjdGl2ZSgpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudXNlcndhbnRzd2luZG93ID0gVHJ1ZQorICAgICAgICBjdXJzZWwgPSBpbnQoc2VsZi5saXN0Ym94LmN1cnNlbGVjdGlvbigpWzBdKQorICAgICAgICBzZWxmLl9jaGFuZ2Vfc3RhcnQoc2VsZi5jb21wbGV0aW9uc1tjdXJzZWxdKQorCisgICAgZGVmIGRvdWJsZWNsaWNrX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgIyBQdXQgdGhlIHNlbGVjdGVkIGNvbXBsZXRpb24gaW4gdGhlIHRleHQsIGFuZCBjbG9zZSB0aGUgbGlzdAorICAgICAgICBjdXJzZWwgPSBpbnQoc2VsZi5saXN0Ym94LmN1cnNlbGVjdGlvbigpWzBdKQorICAgICAgICBzZWxmLl9jaGFuZ2Vfc3RhcnQoc2VsZi5jb21wbGV0aW9uc1tjdXJzZWxdKQorICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKKworICAgIGRlZiBrZXlwcmVzc19ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGlmIG5vdCBzZWxmLmlzX2FjdGl2ZSgpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGtleXN5bSA9IGV2ZW50LmtleXN5bQorICAgICAgICBpZiBoYXNhdHRyKGV2ZW50LCAibWNfc3RhdGUiKToKKyAgICAgICAgICAgIHN0YXRlID0gZXZlbnQubWNfc3RhdGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0YXRlID0gMAorICAgICAgICBpZiBrZXlzeW0gIT0gIlRhYiI6CisgICAgICAgICAgICBzZWxmLmxhc3RrZXlfd2FzX3RhYiA9IEZhbHNlCisgICAgICAgIGlmIChsZW4oa2V5c3ltKSA9PSAxIG9yIGtleXN5bSBpbiAoInVuZGVyc2NvcmUiLCAiQmFja1NwYWNlIikKKyAgICAgICAgICAgIG9yIChzZWxmLm1vZGUgPT0gQ09NUExFVEVfRklMRVMgYW5kIGtleXN5bSBpbgorICAgICAgICAgICAgICAgICgicGVyaW9kIiwgIm1pbnVzIikpKSBcCisgICAgICAgICAgIGFuZCBub3QgKHN0YXRlICYgfk1DX1NISUZUKToKKyAgICAgICAgICAgICMgTm9ybWFsIGVkaXRpbmcgb2YgdGV4dAorICAgICAgICAgICAgaWYgbGVuKGtleXN5bSkgPT0gMToKKyAgICAgICAgICAgICAgICBzZWxmLl9jaGFuZ2Vfc3RhcnQoc2VsZi5zdGFydCArIGtleXN5bSkKKyAgICAgICAgICAgIGVsaWYga2V5c3ltID09ICJ1bmRlcnNjb3JlIjoKKyAgICAgICAgICAgICAgICBzZWxmLl9jaGFuZ2Vfc3RhcnQoc2VsZi5zdGFydCArICdfJykKKyAgICAgICAgICAgIGVsaWYga2V5c3ltID09ICJwZXJpb2QiOgorICAgICAgICAgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLnN0YXJ0ICsgJy4nKQorICAgICAgICAgICAgZWxpZiBrZXlzeW0gPT0gIm1pbnVzIjoKKyAgICAgICAgICAgICAgICBzZWxmLl9jaGFuZ2Vfc3RhcnQoc2VsZi5zdGFydCArICctJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBrZXlzeW0gPT0gIkJhY2tTcGFjZSIKKyAgICAgICAgICAgICAgICBpZiBsZW4oc2VsZi5zdGFydCkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oaWRlX3dpbmRvdygpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLnN0YXJ0WzotMV0pCisgICAgICAgICAgICBzZWxmLmxhc3R0eXBlZHN0YXJ0ID0gc2VsZi5zdGFydAorICAgICAgICAgICAgc2VsZi5saXN0Ym94LnNlbGVjdF9jbGVhcigwLCBpbnQoc2VsZi5saXN0Ym94LmN1cnNlbGVjdGlvbigpWzBdKSkKKyAgICAgICAgICAgIHNlbGYubGlzdGJveC5zZWxlY3Rfc2V0KHNlbGYuX2JpbmFyeV9zZWFyY2goc2VsZi5zdGFydCkpCisgICAgICAgICAgICBzZWxmLl9zZWxlY3Rpb25fY2hhbmdlZCgpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgICAgIGVsaWYga2V5c3ltID09ICJSZXR1cm4iOgorICAgICAgICAgICAgc2VsZi5oaWRlX3dpbmRvdygpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBlbGlmIChzZWxmLm1vZGUgPT0gQ09NUExFVEVfQVRUUklCVVRFUyBhbmQga2V5c3ltIGluCisgICAgICAgICAgICAgICgicGVyaW9kIiwgInNwYWNlIiwgInBhcmVubGVmdCIsICJwYXJlbnJpZ2h0IiwgImJyYWNrZXRsZWZ0IiwKKyAgICAgICAgICAgICAgICJicmFja2V0cmlnaHQiKSkgb3IgXAorICAgICAgICAgICAgIChzZWxmLm1vZGUgPT0gQ09NUExFVEVfRklMRVMgYW5kIGtleXN5bSBpbgorICAgICAgICAgICAgICAoInNsYXNoIiwgImJhY2tzbGFzaCIsICJxdW90ZWRibCIsICJhcG9zdHJvcGhlIikpIFwKKyAgICAgICAgICAgICBhbmQgbm90IChzdGF0ZSAmIH5NQ19TSElGVCk6CisgICAgICAgICAgICAjIElmIHN0YXJ0IGlzIGEgcHJlZml4IG9mIHRoZSBzZWxlY3Rpb24sIGJ1dCBpcyBub3QgJycgd2hlbgorICAgICAgICAgICAgIyBjb21wbGV0aW5nIGZpbGUgbmFtZXMsIHB1dCB0aGUgd2hvbGUKKyAgICAgICAgICAgICMgc2VsZWN0ZWQgY29tcGxldGlvbi4gQW55d2F5LCBjbG9zZSB0aGUgbGlzdC4KKyAgICAgICAgICAgIGN1cnNlbCA9IGludChzZWxmLmxpc3Rib3guY3Vyc2VsZWN0aW9uKClbMF0pCisgICAgICAgICAgICBpZiBzZWxmLmNvbXBsZXRpb25zW2N1cnNlbF1bOmxlbihzZWxmLnN0YXJ0KV0gPT0gc2VsZi5zdGFydCBcCisgICAgICAgICAgICAgICBhbmQgKHNlbGYubW9kZSA9PSBDT01QTEVURV9BVFRSSUJVVEVTIG9yIHNlbGYuc3RhcnQpOgorICAgICAgICAgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLmNvbXBsZXRpb25zW2N1cnNlbF0pCisgICAgICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGVsaWYga2V5c3ltIGluICgiSG9tZSIsICJFbmQiLCAiUHJpb3IiLCAiTmV4dCIsICJVcCIsICJEb3duIikgYW5kIFwKKyAgICAgICAgICAgICBub3Qgc3RhdGU6CisgICAgICAgICAgICAjIE1vdmUgdGhlIHNlbGVjdGlvbiBpbiB0aGUgbGlzdGJveAorICAgICAgICAgICAgc2VsZi51c2Vyd2FudHN3aW5kb3cgPSBUcnVlCisgICAgICAgICAgICBjdXJzZWwgPSBpbnQoc2VsZi5saXN0Ym94LmN1cnNlbGVjdGlvbigpWzBdKQorICAgICAgICAgICAgaWYga2V5c3ltID09ICJIb21lIjoKKyAgICAgICAgICAgICAgICBuZXdzZWwgPSAwCisgICAgICAgICAgICBlbGlmIGtleXN5bSA9PSAiRW5kIjoKKyAgICAgICAgICAgICAgICBuZXdzZWwgPSBsZW4oc2VsZi5jb21wbGV0aW9ucyktMQorICAgICAgICAgICAgZWxpZiBrZXlzeW0gaW4gKCJQcmlvciIsICJOZXh0Iik6CisgICAgICAgICAgICAgICAganVtcCA9IHNlbGYubGlzdGJveC5uZWFyZXN0KHNlbGYubGlzdGJveC53aW5mb19oZWlnaHQoKSkgLSBcCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGlzdGJveC5uZWFyZXN0KDApCisgICAgICAgICAgICAgICAgaWYga2V5c3ltID09ICJQcmlvciI6CisgICAgICAgICAgICAgICAgICAgIG5ld3NlbCA9IG1heCgwLCBjdXJzZWwtanVtcCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQga2V5c3ltID09ICJOZXh0IgorICAgICAgICAgICAgICAgICAgICBuZXdzZWwgPSBtaW4obGVuKHNlbGYuY29tcGxldGlvbnMpLTEsIGN1cnNlbCtqdW1wKQorICAgICAgICAgICAgZWxpZiBrZXlzeW0gPT0gIlVwIjoKKyAgICAgICAgICAgICAgICBuZXdzZWwgPSBtYXgoMCwgY3Vyc2VsLTEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFzc2VydCBrZXlzeW0gPT0gIkRvd24iCisgICAgICAgICAgICAgICAgbmV3c2VsID0gbWluKGxlbihzZWxmLmNvbXBsZXRpb25zKS0xLCBjdXJzZWwrMSkKKyAgICAgICAgICAgIHNlbGYubGlzdGJveC5zZWxlY3RfY2xlYXIoY3Vyc2VsKQorICAgICAgICAgICAgc2VsZi5saXN0Ym94LnNlbGVjdF9zZXQobmV3c2VsKQorICAgICAgICAgICAgc2VsZi5fc2VsZWN0aW9uX2NoYW5nZWQoKQorICAgICAgICAgICAgc2VsZi5fY2hhbmdlX3N0YXJ0KHNlbGYuY29tcGxldGlvbnNbbmV3c2VsXSkKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICAgICAgZWxpZiAoa2V5c3ltID09ICJUYWIiIGFuZCBub3Qgc3RhdGUpOgorICAgICAgICAgICAgaWYgc2VsZi5sYXN0a2V5X3dhc190YWI6CisgICAgICAgICAgICAgICAgIyB0d28gdGFicyBpbiBhIHJvdzsgaW5zZXJ0IGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBjbG9zZSBhY3cKKyAgICAgICAgICAgICAgICBjdXJzZWwgPSBpbnQoc2VsZi5saXN0Ym94LmN1cnNlbGVjdGlvbigpWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLmNvbXBsZXRpb25zW2N1cnNlbF0pCisgICAgICAgICAgICAgICAgc2VsZi5oaWRlX3dpbmRvdygpCisgICAgICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBmaXJzdCB0YWI7IGxldCBBdXRvQ29tcGxldGUgaGFuZGxlIHRoZSBjb21wbGV0aW9uCisgICAgICAgICAgICAgICAgc2VsZi51c2Vyd2FudHN3aW5kb3cgPSBUcnVlCisgICAgICAgICAgICAgICAgc2VsZi5sYXN0a2V5X3dhc190YWIgPSBUcnVlCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZWxpZiBhbnkocyBpbiBrZXlzeW0gZm9yIHMgaW4gKCJTaGlmdCIsICJDb250cm9sIiwgIkFsdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWV0YSIsICJDb21tYW5kIiwgIk9wdGlvbiIpKToKKyAgICAgICAgICAgICMgQSBtb2RpZmllciBrZXksIHNvIGlnbm9yZQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVW5rbm93biBldmVudCwgY2xvc2UgdGhlIHdpbmRvdyBhbmQgbGV0IGl0IHRocm91Z2guCisgICAgICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIGtleXJlbGVhc2VfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBub3Qgc2VsZi5pc19hY3RpdmUoKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLndpZGdldC5pbmRleCgiaW5zZXJ0IikgIT0gXAorICAgICAgICAgICBzZWxmLndpZGdldC5pbmRleCgiJXMrJWRjIiAlIChzZWxmLnN0YXJ0aW5kZXgsIGxlbihzZWxmLnN0YXJ0KSkpOgorICAgICAgICAgICAgIyBJZiB3ZSBkaWRuJ3QgY2F0Y2ggYW4gZXZlbnQgd2hpY2ggbW92ZWQgdGhlIGluc2VydCwgY2xvc2Ugd2luZG93CisgICAgICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKKworICAgIGRlZiBpc19hY3RpdmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdyBpcyBub3QgTm9uZQorCisgICAgZGVmIGNvbXBsZXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGFuZ2Vfc3RhcnQoc2VsZi5fY29tcGxldGVfc3RyaW5nKHNlbGYuc3RhcnQpKQorICAgICAgICAjIFRoZSBzZWxlY3Rpb24gZG9lc24ndCBjaGFuZ2UuCisKKyAgICBkZWYgaGlkZV93aW5kb3coc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmlzX2FjdGl2ZSgpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyB1bmJpbmQgZXZlbnRzCisgICAgICAgIGZvciBzZXEgaW4gSElERV9TRVFVRU5DRVM6CisgICAgICAgICAgICBzZWxmLndpZGdldC5ldmVudF9kZWxldGUoSElERV9WSVJUVUFMX0VWRU5UX05BTUUsIHNlcSkKKyAgICAgICAgc2VsZi53aWRnZXQudW5iaW5kKEhJREVfVklSVFVBTF9FVkVOVF9OQU1FLCBzZWxmLmhpZGVpZCkKKyAgICAgICAgc2VsZi5oaWRlaWQgPSBOb25lCisgICAgICAgIGZvciBzZXEgaW4gS0VZUFJFU1NfU0VRVUVOQ0VTOgorICAgICAgICAgICAgc2VsZi53aWRnZXQuZXZlbnRfZGVsZXRlKEtFWVBSRVNTX1ZJUlRVQUxfRVZFTlRfTkFNRSwgc2VxKQorICAgICAgICBzZWxmLndpZGdldC51bmJpbmQoS0VZUFJFU1NfVklSVFVBTF9FVkVOVF9OQU1FLCBzZWxmLmtleXByZXNzaWQpCisgICAgICAgIHNlbGYua2V5cHJlc3NpZCA9IE5vbmUKKyAgICAgICAgc2VsZi53aWRnZXQuZXZlbnRfZGVsZXRlKEtFWVJFTEVBU0VfVklSVFVBTF9FVkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZUkVMRUFTRV9TRVFVRU5DRSkKKyAgICAgICAgc2VsZi53aWRnZXQudW5iaW5kKEtFWVJFTEVBU0VfVklSVFVBTF9FVkVOVF9OQU1FLCBzZWxmLmtleXJlbGVhc2VpZCkKKyAgICAgICAgc2VsZi5rZXlyZWxlYXNlaWQgPSBOb25lCisgICAgICAgIHNlbGYubGlzdGJveC51bmJpbmQoTElTVFVQREFURV9TRVFVRU5DRSwgc2VsZi5saXN0dXBkYXRlaWQpCisgICAgICAgIHNlbGYubGlzdHVwZGF0ZWlkID0gTm9uZQorICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdy51bmJpbmQoV0lOQ09ORklHX1NFUVVFTkNFLCBzZWxmLndpbmNvbmZpZ2lkKQorICAgICAgICBzZWxmLndpbmNvbmZpZ2lkID0gTm9uZQorCisgICAgICAgICMgZGVzdHJveSB3aWRnZXRzCisgICAgICAgIHNlbGYuc2Nyb2xsYmFyLmRlc3Ryb3koKQorICAgICAgICBzZWxmLnNjcm9sbGJhciA9IE5vbmUKKyAgICAgICAgc2VsZi5saXN0Ym94LmRlc3Ryb3koKQorICAgICAgICBzZWxmLmxpc3Rib3ggPSBOb25lCisgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRld2luZG93LmRlc3Ryb3koKQorICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdyA9IE5vbmUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxMDlhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExYWM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvRXhwYW5kLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9FeHBhbmQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5M2Q1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvRXhwYW5kLnB5CkBAIC0wLDAgKzEsODMgQEAKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCByZQorCisjIyMkIGV2ZW50IDw8ZXhwYW5kLXdvcmQ+PgorIyMjJCB3aW4gPEFsdC1zbGFzaD4KKyMjIyQgdW5peCA8QWx0LXNsYXNoPgorCitjbGFzcyBBdXRvRXhwYW5kOgorCisgICAgbWVudWRlZnMgPSBbCisgICAgICAgICgnZWRpdCcsIFsKKyAgICAgICAgICAgICgnRV94cGFuZCBXb3JkJywgJzw8ZXhwYW5kLXdvcmQ+PicpLAorICAgICAgICAgXSksCisgICAgXQorCisgICAgd29yZGNoYXJzID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgIl8iCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbik6CisgICAgICAgIHNlbGYudGV4dCA9IGVkaXR3aW4udGV4dAorICAgICAgICBzZWxmLnN0YXRlID0gTm9uZQorCisgICAgZGVmIGV4cGFuZF93b3JkX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgY3VyaW5zZXJ0ID0gc2VsZi50ZXh0LmluZGV4KCJpbnNlcnQiKQorICAgICAgICBjdXJsaW5lID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQgbGluZWVuZCIpCisgICAgICAgIGlmIG5vdCBzZWxmLnN0YXRlOgorICAgICAgICAgICAgd29yZHMgPSBzZWxmLmdldHdvcmRzKCkKKyAgICAgICAgICAgIGluZGV4ID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd29yZHMsIGluZGV4LCBpbnNlcnQsIGxpbmUgPSBzZWxmLnN0YXRlCisgICAgICAgICAgICBpZiBpbnNlcnQgIT0gY3VyaW5zZXJ0IG9yIGxpbmUgIT0gY3VybGluZToKKyAgICAgICAgICAgICAgICB3b3JkcyA9IHNlbGYuZ2V0d29yZHMoKQorICAgICAgICAgICAgICAgIGluZGV4ID0gMAorICAgICAgICBpZiBub3Qgd29yZHM6CisgICAgICAgICAgICBzZWxmLnRleHQuYmVsbCgpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICB3b3JkID0gc2VsZi5nZXRwcmV2d29yZCgpCisgICAgICAgIHNlbGYudGV4dC5kZWxldGUoImluc2VydCAtICVkIGNoYXJzIiAlIGxlbih3b3JkKSwgImluc2VydCIpCisgICAgICAgIG5ld3dvcmQgPSB3b3Jkc1tpbmRleF0KKyAgICAgICAgaW5kZXggPSAoaW5kZXggKyAxKSAlIGxlbih3b3JkcykKKyAgICAgICAgaWYgaW5kZXggPT0gMDoKKyAgICAgICAgICAgIHNlbGYudGV4dC5iZWxsKCkgICAgICAgICAgICAjIFdhcm4gd2UgY3ljbGVkIGFyb3VuZAorICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCJpbnNlcnQiLCBuZXd3b3JkKQorICAgICAgICBjdXJpbnNlcnQgPSBzZWxmLnRleHQuaW5kZXgoImluc2VydCIpCisgICAgICAgIGN1cmxpbmUgPSBzZWxmLnRleHQuZ2V0KCJpbnNlcnQgbGluZXN0YXJ0IiwgImluc2VydCBsaW5lZW5kIikKKyAgICAgICAgc2VsZi5zdGF0ZSA9IHdvcmRzLCBpbmRleCwgY3VyaW5zZXJ0LCBjdXJsaW5lCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgZ2V0d29yZHMoc2VsZik6CisgICAgICAgIHdvcmQgPSBzZWxmLmdldHByZXZ3b3JkKCkKKyAgICAgICAgaWYgbm90IHdvcmQ6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgYmVmb3JlID0gc2VsZi50ZXh0LmdldCgiMS4wIiwgImluc2VydCB3b3Jkc3RhcnQiKQorICAgICAgICB3YmVmb3JlID0gcmUuZmluZGFsbChyIlxiIiArIHdvcmQgKyByIlx3K1xiIiwgYmVmb3JlKQorICAgICAgICBkZWwgYmVmb3JlCisgICAgICAgIGFmdGVyID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0IHdvcmRlbmQiLCAiZW5kIikKKyAgICAgICAgd2FmdGVyID0gcmUuZmluZGFsbChyIlxiIiArIHdvcmQgKyByIlx3K1xiIiwgYWZ0ZXIpCisgICAgICAgIGRlbCBhZnRlcgorICAgICAgICBpZiBub3Qgd2JlZm9yZSBhbmQgbm90IHdhZnRlcjoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICB3b3JkcyA9IFtdCisgICAgICAgIGRpY3QgPSB7fQorICAgICAgICAjIHNlYXJjaCBiYWNrd2FyZHMgdGhyb3VnaCB3b3JkcyBiZWZvcmUKKyAgICAgICAgd2JlZm9yZS5yZXZlcnNlKCkKKyAgICAgICAgZm9yIHcgaW4gd2JlZm9yZToKKyAgICAgICAgICAgIGlmIGRpY3QuZ2V0KHcpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB3b3Jkcy5hcHBlbmQodykKKyAgICAgICAgICAgIGRpY3Rbd10gPSB3CisgICAgICAgICMgc2VhcmNoIG9ud2FyZHMgdGhyb3VnaCB3b3JkcyBhZnRlcgorICAgICAgICBmb3IgdyBpbiB3YWZ0ZXI6CisgICAgICAgICAgICBpZiBkaWN0LmdldCh3KToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgd29yZHMuYXBwZW5kKHcpCisgICAgICAgICAgICBkaWN0W3ddID0gdworICAgICAgICB3b3Jkcy5hcHBlbmQod29yZCkKKyAgICAgICAgcmV0dXJuIHdvcmRzCisKKyAgICBkZWYgZ2V0cHJldndvcmQoc2VsZik6CisgICAgICAgIGxpbmUgPSBzZWxmLnRleHQuZ2V0KCJpbnNlcnQgbGluZXN0YXJ0IiwgImluc2VydCIpCisgICAgICAgIGkgPSBsZW4obGluZSkKKyAgICAgICAgd2hpbGUgaSA+IDAgYW5kIGxpbmVbaS0xXSBpbiBzZWxmLndvcmRjaGFyczoKKyAgICAgICAgICAgIGkgPSBpLTEKKyAgICAgICAgcmV0dXJuIGxpbmVbaTpdCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0V4cGFuZC5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0V4cGFuZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmNDIxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvRXhwYW5kLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0V4cGFuZC5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0V4cGFuZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmNDIxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvRXhwYW5kLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQmluZGluZ3MucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQmluZGluZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyNzIwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9CaW5kaW5ncy5weQpAQCAtMCwwICsxLDEwMyBAQAorIiIiRGVmaW5lIHRoZSBtZW51IGNvbnRlbnRzLCBob3RrZXlzLCBhbmQgZXZlbnQgYmluZGluZ3MuCisKK1RoZXJlIGlzIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUgRWRpdG9yV2luZG93IGNsYXNzIChhbmQKK3N1YmNsYXNzZXMpOiB0aGUgbWVudXMgYXJlIGNyZWF0ZWQgdGhlcmUgYmFzZWQgb24gdGhlIG1lbnVfc3BlY3MgKGNsYXNzKQordmFyaWFibGUsIGFuZCBtZW51cyBub3QgY3JlYXRlZCBhcmUgc2lsZW50bHkgc2tpcHBlZCBpbiB0aGUgY29kZSBoZXJlLiAgVGhpcworbWFrZXMgaXQgcG9zc2libGUsIGZvciBleGFtcGxlLCB0byBkZWZpbmUgYSBEZWJ1ZyBtZW51IHdoaWNoIGlzIG9ubHkgcHJlc2VudCBpbgordGhlIFB5dGhvblNoZWxsIHdpbmRvdywgYW5kIGEgRm9ybWF0IG1lbnUgd2hpY2ggaXMgb25seSBwcmVzZW50IGluIHRoZSBFZGl0b3IKK3dpbmRvd3MuCisKKyIiIgoraW1wb3J0IHN5cworZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKKworbWVudWRlZnMgPSBbCisgIyB1bmRlcnNjb3JlIHByZWZpeGVzIGNoYXJhY3RlciB0byB1bmRlcnNjb3JlCisgKCdmaWxlJywgWworICAgKCdfTmV3IFdpbmRvdycsICc8PG9wZW4tbmV3LXdpbmRvdz4+JyksCisgICAoJ19PcGVuLi4uJywgJzw8b3Blbi13aW5kb3ctZnJvbS1maWxlPj4nKSwKKyAgICgnT3BlbiBfTW9kdWxlLi4uJywgJzw8b3Blbi1tb2R1bGU+PicpLAorICAgKCdDbGFzcyBfQnJvd3NlcicsICc8PG9wZW4tY2xhc3MtYnJvd3Nlcj4+JyksCisgICAoJ19QYXRoIEJyb3dzZXInLCAnPDxvcGVuLXBhdGgtYnJvd3Nlcj4+JyksCisgICBOb25lLAorICAgKCdfU2F2ZScsICc8PHNhdmUtd2luZG93Pj4nKSwKKyAgICgnU2F2ZSBfQXMuLi4nLCAnPDxzYXZlLXdpbmRvdy1hcy1maWxlPj4nKSwKKyAgICgnU2F2ZSBDb3BfeSBBcy4uLicsICc8PHNhdmUtY29weS1vZi13aW5kb3ctYXMtZmlsZT4+JyksCisgICBOb25lLAorICAgKCdQcmluX3QgV2luZG93JywgJzw8cHJpbnQtd2luZG93Pj4nKSwKKyAgIE5vbmUsCisgICAoJ19DbG9zZScsICc8PGNsb3NlLXdpbmRvdz4+JyksCisgICAoJ0VfeGl0JywgJzw8Y2xvc2UtYWxsLXdpbmRvd3M+PicpLAorICBdKSwKKyAoJ2VkaXQnLCBbCisgICAoJ19VbmRvJywgJzw8dW5kbz4+JyksCisgICAoJ19SZWRvJywgJzw8cmVkbz4+JyksCisgICBOb25lLAorICAgKCdDdV90JywgJzw8Y3V0Pj4nKSwKKyAgICgnX0NvcHknLCAnPDxjb3B5Pj4nKSwKKyAgICgnX1Bhc3RlJywgJzw8cGFzdGU+PicpLAorICAgKCdTZWxlY3QgX0FsbCcsICc8PHNlbGVjdC1hbGw+PicpLAorICAgTm9uZSwKKyAgICgnX0ZpbmQuLi4nLCAnPDxmaW5kPj4nKSwKKyAgICgnRmluZCBBX2dhaW4nLCAnPDxmaW5kLWFnYWluPj4nKSwKKyAgICgnRmluZCBfU2VsZWN0aW9uJywgJzw8ZmluZC1zZWxlY3Rpb24+PicpLAorICAgKCdGaW5kIGluIEZpbGVzLi4uJywgJzw8ZmluZC1pbi1maWxlcz4+JyksCisgICAoJ1JfZXBsYWNlLi4uJywgJzw8cmVwbGFjZT4+JyksCisgICAoJ0dvIHRvIF9MaW5lJywgJzw8Z290by1saW5lPj4nKSwKKyAgXSksCisoJ2Zvcm1hdCcsIFsKKyAgICgnX0luZGVudCBSZWdpb24nLCAnPDxpbmRlbnQtcmVnaW9uPj4nKSwKKyAgICgnX0RlZGVudCBSZWdpb24nLCAnPDxkZWRlbnQtcmVnaW9uPj4nKSwKKyAgICgnQ29tbWVudCBfT3V0IFJlZ2lvbicsICc8PGNvbW1lbnQtcmVnaW9uPj4nKSwKKyAgICgnVV9uY29tbWVudCBSZWdpb24nLCAnPDx1bmNvbW1lbnQtcmVnaW9uPj4nKSwKKyAgICgnVGFiaWZ5IFJlZ2lvbicsICc8PHRhYmlmeS1yZWdpb24+PicpLAorICAgKCdVbnRhYmlmeSBSZWdpb24nLCAnPDx1bnRhYmlmeS1yZWdpb24+PicpLAorICAgKCdUb2dnbGUgVGFicycsICc8PHRvZ2dsZS10YWJzPj4nKSwKKyAgICgnTmV3IEluZGVudCBXaWR0aCcsICc8PGNoYW5nZS1pbmRlbnR3aWR0aD4+JyksCisgICBdKSwKKyAoJ3J1bicsIFsKKyAgICgnUHl0aG9uIFNoZWxsJywgJzw8b3Blbi1weXRob24tc2hlbGw+PicpLAorICAgXSksCisgKCdzaGVsbCcsIFsKKyAgICgnX1ZpZXcgTGFzdCBSZXN0YXJ0JywgJzw8dmlldy1yZXN0YXJ0Pj4nKSwKKyAgICgnX1Jlc3RhcnQgU2hlbGwnLCAnPDxyZXN0YXJ0LXNoZWxsPj4nKSwKKyAgIF0pLAorICgnZGVidWcnLCBbCisgICAoJ19HbyB0byBGaWxlL0xpbmUnLCAnPDxnb3RvLWZpbGUtbGluZT4+JyksCisgICAoJyFfRGVidWdnZXInLCAnPDx0b2dnbGUtZGVidWdnZXI+PicpLAorICAgKCdfU3RhY2sgVmlld2VyJywgJzw8b3Blbi1zdGFjay12aWV3ZXI+PicpLAorICAgKCchX0F1dG8tb3BlbiBTdGFjayBWaWV3ZXInLCAnPDx0b2dnbGUtaml0LXN0YWNrLXZpZXdlcj4+JyksCisgICBdKSwKKyAoJ29wdGlvbnMnLCBbCisgICAoJ19Db25maWd1cmUgSURMRS4uLicsICc8PG9wZW4tY29uZmlnLWRpYWxvZz4+JyksCisgICBOb25lLAorICAgXSksCisgKCdoZWxwJywgWworICAgKCdfQWJvdXQgSURMRScsICc8PGFib3V0LWlkbGU+PicpLAorICAgTm9uZSwKKyAgICgnX0lETEUgSGVscCcsICc8PGhlbHA+PicpLAorICAgKCdQeXRob24gX0RvY3MnLCAnPDxweXRob24tZG9jcz4+JyksCisgICBdKSwKK10KKworaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAjIFJ1bm5pbmcgYXMgYSBwcm9wZXIgTWFjT1MgYXBwbGljYXRpb24gYnVuZGxlLiBUaGlzIGJsb2NrIHJlc3RydWN0dXJlcworICAgICMgdGhlIG1lbnVzIGEgbGl0dGxlIHRvIG1ha2UgdGhlbSBjb25mb3JtIGJldHRlciB0byB0aGUgSElHLgorCisgICAgcXVpdEl0ZW0gPSBtZW51ZGVmc1swXVsxXVstMV0KKyAgICBjbG9zZUl0ZW0gPSBtZW51ZGVmc1swXVsxXVstMl0KKworICAgICMgUmVtb3ZlIHRoZSBsYXN0IDMgaXRlbXMgb2YgdGhlIGZpbGUgbWVudTogYSBzZXBhcmF0b3IsIGNsb3NlIHdpbmRvdyBhbmQKKyAgICAjIHF1aXQuIENsb3NlIHdpbmRvdyB3aWxsIGJlIHJlaW5zZXJ0ZWQganVzdCBhYm92ZSB0aGUgc2F2ZSBpdGVtLCB3aGVyZQorICAgICMgaXQgc2hvdWxkIGJlIGFjY29yZGluZyB0byB0aGUgSElHLiBRdWl0IGlzIGluIHRoZSBhcHBsaWNhdGlvbiBtZW51LgorICAgIGRlbCBtZW51ZGVmc1swXVsxXVstMzpdCisgICAgbWVudWRlZnNbMF1bMV0uaW5zZXJ0KDYsIGNsb3NlSXRlbSkKKworICAgICMgUmVtb3ZlIHRoZSAnQWJvdXQnIGVudHJ5IGZyb20gdGhlIGhlbHAgbWVudSwgaXQgaXMgaW4gdGhlIGFwcGxpY2F0aW9uCisgICAgIyBtZW51CisgICAgZGVsIG1lbnVkZWZzWy0xXVsxXVswOjJdCisKK2RlZmF1bHRfa2V5ZGVmcyA9IGlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQorCitkZWwgc3lzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQmluZGluZ3MucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0JpbmRpbmdzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmY1MTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0JpbmRpbmdzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQmluZGluZ3MucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0JpbmRpbmdzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmY1MTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0JpbmRpbmdzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ1JFRElUUy50eHQgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ1JFRElUUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZmNTk5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9DUkVESVRTLnR4dApAQCAtMCwwICsxLDM3IEBACitHdWlkbyB2YW4gUm9zc3VtLCBhcyB3ZWxsIGFzIGJlaW5nIHRoZSBjcmVhdG9yIG9mIHRoZSBQeXRob24gbGFuZ3VhZ2UsIGlzIHRoZQorb3JpZ2luYWwgY3JlYXRvciBvZiBJRExFLiAgT3RoZXIgY29udHJpYnV0b3JzIHByaW9yIHRvIFZlcnNpb24gMC44IGluY2x1ZGUKK01hcmsgSGFtbW9uZCwgSmVyZW15IEh5bHRvbiwgVGltIFBldGVycywgYW5kIE1vc2hlIFphZGthLgorCitJRExFJ3MgcmVjZW50IGRldmVsb3BtZW50IHdhcyBjYXJyaWVkIG91dCBpbiB0aGUgU0YgSURMRWZvcmsgcHJvamVjdC4gVGhlCitvYmplY3RpdmUgd2FzIHRvIGRldmVsb3AgYSB2ZXJzaW9uIG9mIElETEUgd2hpY2ggaGFkIGFuIGV4ZWN1dGlvbiBlbnZpcm9ubWVudAord2hpY2ggY291bGQgYmUgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gZWFjaCBydW4gb2YgdXNlciBjb2RlLgorCitUaGUgSURMRWZvcmsgcHJvamVjdCB3YXMgaW5pdGlhdGVkIGJ5IERhdmlkIFNjaGVyZXIsIHdpdGggc29tZSBoZWxwIGZyb20gUGV0ZXIKK1NjaG5laWRlci1LYW1wIGFuZCBOaWNob2xhcyBSaWxleS4gIERhdmlkIHdyb3RlIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBSUEMKK2NvZGUgYW5kIGRlc2lnbmVkIGEgZmFzdCB0dXJuLWFyb3VuZCBlbnZpcm9ubWVudCBmb3IgVlB5dGhvbi4gIEd1aWRvIGRldmVsb3BlZAordGhlIFJQQyBjb2RlIGFuZCBSZW1vdGUgRGVidWdnZXIgY3VycmVudGx5IGludGVncmF0ZWQgaW4gSURMRS4gIEJydWNlIFNoZXJ3b29kCitjb250cmlidXRlZCBjb25zaWRlcmFibGUgdGltZSB0ZXN0aW5nIGFuZCBzdWdnZXN0aW5nIGltcHJvdmVtZW50cy4KKworQmVzaWRlcyBEYXZpZCBhbmQgR3VpZG8sIHRoZSBtYWluIGRldmVsb3BlcnMgd2hvIHdlcmUgYWN0aXZlIG9uIElETEVmb3JrCithcmUgU3RlcGhlbiBNLiBHYXZhLCB3aG8gaW1wbGVtZW50ZWQgdGhlIGNvbmZpZ3VyYXRpb24gR1VJLCB0aGUgbmV3Citjb25maWd1cmF0aW9uIHN5c3RlbSwgYW5kIHRoZSBBYm91dCBkaWFsb2csIGFuZCBLdXJ0IEIuIEthaXNlciwgd2hvIGNvbXBsZXRlZAordGhlIGludGVncmF0aW9uIG9mIHRoZSBSUEMgYW5kIHJlbW90ZSBkZWJ1Z2dlciwgaW1wbGVtZW50ZWQgdGhlIHRocmVhZGVkCitzdWJwcm9jZXNzLCBhbmQgbWFkZSBhIG51bWJlciBvZiB1c2FiaWxpdHkgZW5oYW5jZW1lbnRzLgorCitPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBSYXltb25kIEhldHRpbmdlciwgVG9ueSBMb3duZHMgKE1hYyBpbnRlZ3JhdGlvbiksCitOZWFsIE5vcndpdHogKGNvZGUgY2hlY2sgYW5kIGNsZWFuLXVwKSwgUm9uYWxkIE91c3NvcmVuIChNYWMgaW50ZWdyYXRpb24pLAorTm9hbSBSYXBoYWVsIChDb2RlIENvbnRleHQsIENhbGwgVGlwcywgbWFueSBvdGhlciBwYXRjaGVzKSwgYW5kIENodWkgVGV5IChSUEMKK2ludGVncmF0aW9uLCBkZWJ1Z2dlciBpbnRlZ3JhdGlvbiBhbmQgcGVyc2lzdGVudCBicmVha3BvaW50cykuCisKK1Njb3R0IERhdmlkIERhbmllbHMsIFRhbCBFaW5hdCwgSGVybmFuIEZvZmZhbmksIENocmlzdG9zIEdlb3JnaW91LAorSmltIEpld2V0dCwgTWFydGluIHYuIEz2d2lzLCBKYXNvbiBPcmVuZG9yZmYsIEd1aWxoZXJtZSBQb2xvLCBKb3NoIFJvYmIsCitOaWdlbCBSb3dlLCBCcnVjZSBTaGVyd29vZCwgSmVmZiBTaHV0ZSwgYW5kIFdlZWJsZSBoYXZlIHN1Ym1pdHRlZCB1c2VmdWwKK3BhdGNoZXMuICBUaGFua3MsIGd1eXMhCisKK0ZvciBhZGRpdGlvbmFsIGRldGFpbHMgcmVmZXIgdG8gTkVXUy50eHQgYW5kIENoYW5nZWxvZy4KKworUGxlYXNlIGNvbnRhY3QgdGhlIElETEUgbWFpbnRhaW5lciAoa2JrQHNob3JlLm5ldCkgdG8gaGF2ZSB5b3Vyc2VsZiBpbmNsdWRlZAoraGVyZSBpZiB5b3UgYXJlIG9uZSBvZiB0aG9zZSB3ZSBtaXNzZWQhCisKKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjYyYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weQpAQCAtMCwwICsxLDE3NSBAQAorIiIiQSBDYWxsVGlwIHdpbmRvdyBjbGFzcyBmb3IgVGtpbnRlci9JRExFLgorCitBZnRlciBUb29sVGlwLnB5LCB3aGljaCB1c2VzIGlkZWFzIGdsZWFuZWQgZnJvbSBQeVNvbAorVXNlZCBieSB0aGUgQ2FsbFRpcHMgSURMRSBleHRlbnNpb24uCisKKyIiIgorZnJvbSBUa2ludGVyIGltcG9ydCAqCisKK0hJREVfVklSVFVBTF9FVkVOVF9OQU1FID0gIjw8Y2FsbHRpcHdpbmRvdy1oaWRlPj4iCitISURFX1NFUVVFTkNFUyA9ICgiPEtleS1Fc2NhcGU+IiwgIjxGb2N1c091dD4iKQorQ0hFQ0tISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSA9ICI8PGNhbGx0aXB3aW5kb3ctY2hlY2toaWRlPj4iCitDSEVDS0hJREVfU0VRVUVOQ0VTID0gKCI8S2V5UmVsZWFzZT4iLCAiPEJ1dHRvblJlbGVhc2U+IikKK0NIRUNLSElERV9USU1FID0gMTAwICMgbWlsaXNlY29uZHMKKworTUFSS19SSUdIVCA9ICJjYWxsdGlwd2luZG93cmVnaW9uX3JpZ2h0IgorCitjbGFzcyBDYWxsVGlwOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdpZGdldCk6CisgICAgICAgIHNlbGYud2lkZ2V0ID0gd2lkZ2V0CisgICAgICAgIHNlbGYudGlwd2luZG93ID0gc2VsZi5sYWJlbCA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJlbmxpbmUgPSBzZWxmLnBhcmVuY29sID0gTm9uZQorICAgICAgICBzZWxmLmxhc3RsaW5lID0gTm9uZQorICAgICAgICBzZWxmLmhpZGVpZCA9IHNlbGYuY2hlY2toaWRlaWQgPSBOb25lCisgICAgICAgIHNlbGYuY2hlY2toaWRlX2FmdGVyX2lkID0gTm9uZQorCisgICAgZGVmIHBvc2l0aW9uX3dpbmRvdyhzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgaWYgbmVlZHMgdG8gcmVwb3NpdGlvbiB0aGUgd2luZG93LCBhbmQgaWYgc28gLSBkbyBpdC4iIiIKKyAgICAgICAgY3VybGluZSA9IGludChzZWxmLndpZGdldC5pbmRleCgiaW5zZXJ0Iikuc3BsaXQoJy4nKVswXSkKKyAgICAgICAgaWYgY3VybGluZSA9PSBzZWxmLmxhc3RsaW5lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYubGFzdGxpbmUgPSBjdXJsaW5lCisgICAgICAgIHNlbGYud2lkZ2V0LnNlZSgiaW5zZXJ0IikKKyAgICAgICAgaWYgY3VybGluZSA9PSBzZWxmLnBhcmVubGluZToKKyAgICAgICAgICAgIGJveCA9IHNlbGYud2lkZ2V0LmJib3goIiVkLiVkIiAlIChzZWxmLnBhcmVubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVuY29sKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJveCA9IHNlbGYud2lkZ2V0LmJib3goIiVkLjAiICUgY3VybGluZSkKKyAgICAgICAgaWYgbm90IGJveDoKKyAgICAgICAgICAgIGJveCA9IGxpc3Qoc2VsZi53aWRnZXQuYmJveCgiaW5zZXJ0IikpCisgICAgICAgICAgICAjIGFsaWduIHRvIGxlZnQgb2Ygd2luZG93CisgICAgICAgICAgICBib3hbMF0gPSAwCisgICAgICAgICAgICBib3hbMl0gPSAwCisgICAgICAgIHggPSBib3hbMF0gKyBzZWxmLndpZGdldC53aW5mb19yb290eCgpICsgMgorICAgICAgICB5ID0gYm94WzFdICsgYm94WzNdICsgc2VsZi53aWRnZXQud2luZm9fcm9vdHkoKQorICAgICAgICBzZWxmLnRpcHdpbmRvdy53bV9nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5KSkKKworICAgIGRlZiBzaG93dGlwKHNlbGYsIHRleHQsIHBhcmVubGVmdCwgcGFyZW5yaWdodCk6CisgICAgICAgICIiIlNob3cgdGhlIGNhbGx0aXAsIGJpbmQgZXZlbnRzIHdoaWNoIHdpbGwgY2xvc2UgaXQgYW5kIHJlcG9zaXRpb24gaXQuCisgICAgICAgICIiIgorICAgICAgICAjIHRydW5jYXRlIG92ZXJseSBsb25nIGNhbGx0aXAKKyAgICAgICAgaWYgbGVuKHRleHQpID49IDc5OgorICAgICAgICAgICAgdGV4dGxpbmVzID0gdGV4dC5zcGxpdGxpbmVzKCkKKyAgICAgICAgICAgIGZvciBpLCBsaW5lIGluIGVudW1lcmF0ZSh0ZXh0bGluZXMpOgorICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lKSA+IDc5OgorICAgICAgICAgICAgICAgICAgICB0ZXh0bGluZXNbaV0gPSBsaW5lWzo3NV0gKyAnIC4uLicKKyAgICAgICAgICAgIHRleHQgPSAnXG4nLmpvaW4odGV4dGxpbmVzKQorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CisgICAgICAgIGlmIHNlbGYudGlwd2luZG93IG9yIG5vdCBzZWxmLnRleHQ6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLndpZGdldC5tYXJrX3NldChNQVJLX1JJR0hULCBwYXJlbnJpZ2h0KQorICAgICAgICBzZWxmLnBhcmVubGluZSwgc2VsZi5wYXJlbmNvbCA9IG1hcCgKKyAgICAgICAgICAgIGludCwgc2VsZi53aWRnZXQuaW5kZXgocGFyZW5sZWZ0KS5zcGxpdCgiLiIpKQorCisgICAgICAgIHNlbGYudGlwd2luZG93ID0gdHcgPSBUb3BsZXZlbChzZWxmLndpZGdldCkKKyAgICAgICAgc2VsZi5wb3NpdGlvbl93aW5kb3coKQorICAgICAgICAjIHJlbW92ZSBib3JkZXIgb24gY2FsbHRpcCB3aW5kb3cKKyAgICAgICAgdHcud21fb3ZlcnJpZGVyZWRpcmVjdCgxKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFRoaXMgY29tbWFuZCBpcyBvbmx5IG5lZWRlZCBhbmQgYXZhaWxhYmxlIG9uIFRrID49IDguNC4wIGZvciBPU1gKKyAgICAgICAgICAgICMgV2l0aG91dCBpdCwgY2FsbCB0aXBzIGludHJ1ZGUgb24gdGhlIHR5cGluZyBwcm9jZXNzIGJ5IGdyYWJiaW5nCisgICAgICAgICAgICAjIHRoZSBmb2N1cy4KKyAgICAgICAgICAgIHR3LnRrLmNhbGwoIjo6dGs6OnVuc3VwcG9ydGVkOjpNYWNXaW5kb3dTdHlsZSIsICJzdHlsZSIsIHR3Ll93LAorICAgICAgICAgICAgICAgICAgICAgICAiaGVscCIsICJub0FjdGl2YXRlcyIpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5sYWJlbCA9IExhYmVsKHR3LCB0ZXh0PXNlbGYudGV4dCwganVzdGlmeT1MRUZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZD0iI2ZmZmZlMCIsIHJlbGllZj1TT0xJRCwgYm9yZGVyd2lkdGg9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgPSBzZWxmLndpZGdldFsnZm9udCddKQorICAgICAgICBzZWxmLmxhYmVsLnBhY2soKQorCisgICAgICAgIHNlbGYuY2hlY2toaWRlaWQgPSBzZWxmLndpZGdldC5iaW5kKENIRUNLSElERV9WSVJUVUFMX0VWRU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2toaWRlX2V2ZW50KQorICAgICAgICBmb3Igc2VxIGluIENIRUNLSElERV9TRVFVRU5DRVM6CisgICAgICAgICAgICBzZWxmLndpZGdldC5ldmVudF9hZGQoQ0hFQ0tISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSwgc2VxKQorICAgICAgICBzZWxmLndpZGdldC5hZnRlcihDSEVDS0hJREVfVElNRSwgc2VsZi5jaGVja2hpZGVfZXZlbnQpCisgICAgICAgIHNlbGYuaGlkZWlkID0gc2VsZi53aWRnZXQuYmluZChISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGlkZV9ldmVudCkKKyAgICAgICAgZm9yIHNlcSBpbiBISURFX1NFUVVFTkNFUzoKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0LmV2ZW50X2FkZChISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSwgc2VxKQorCisgICAgZGVmIGNoZWNraGlkZV9ldmVudChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgbm90IHNlbGYudGlwd2luZG93OgorICAgICAgICAgICAgIyBJZiB0aGUgZXZlbnQgd2FzIHRyaWdnZXJlZCBieSB0aGUgc2FtZSBldmVudCB0aGF0IHVuYmluZGVkCisgICAgICAgICAgICAjIHRoaXMgZnVuY3Rpb24sIHRoZSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBuZXZlcnRoZWxlc3MsCisgICAgICAgICAgICAjIHNvIGRvIG5vdGhpbmcgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGN1cmxpbmUsIGN1cmNvbCA9IG1hcChpbnQsIHNlbGYud2lkZ2V0LmluZGV4KCJpbnNlcnQiKS5zcGxpdCgnLicpKQorICAgICAgICBpZiBjdXJsaW5lIDwgc2VsZi5wYXJlbmxpbmUgb3IgXAorICAgICAgICAgICAoY3VybGluZSA9PSBzZWxmLnBhcmVubGluZSBhbmQgY3VyY29sIDw9IHNlbGYucGFyZW5jb2wpIG9yIFwKKyAgICAgICAgICAgc2VsZi53aWRnZXQuY29tcGFyZSgiaW5zZXJ0IiwgIj4iLCBNQVJLX1JJR0hUKToKKyAgICAgICAgICAgIHNlbGYuaGlkZXRpcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnBvc2l0aW9uX3dpbmRvdygpCisgICAgICAgICAgICBpZiBzZWxmLmNoZWNraGlkZV9hZnRlcl9pZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLndpZGdldC5hZnRlcl9jYW5jZWwoc2VsZi5jaGVja2hpZGVfYWZ0ZXJfaWQpCisgICAgICAgICAgICBzZWxmLmNoZWNraGlkZV9hZnRlcl9pZCA9IFwKKyAgICAgICAgICAgICAgICBzZWxmLndpZGdldC5hZnRlcihDSEVDS0hJREVfVElNRSwgc2VsZi5jaGVja2hpZGVfZXZlbnQpCisKKyAgICBkZWYgaGlkZV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGlmIG5vdCBzZWxmLnRpcHdpbmRvdzoKKyAgICAgICAgICAgICMgU2VlIHRoZSBleHBsYW5hdGlvbiBpbiBjaGVja2hpZGVfZXZlbnQuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5oaWRldGlwKCkKKworICAgIGRlZiBoaWRldGlwKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi50aXB3aW5kb3c6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmb3Igc2VxIGluIENIRUNLSElERV9TRVFVRU5DRVM6CisgICAgICAgICAgICBzZWxmLndpZGdldC5ldmVudF9kZWxldGUoQ0hFQ0tISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSwgc2VxKQorICAgICAgICBzZWxmLndpZGdldC51bmJpbmQoQ0hFQ0tISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSwgc2VsZi5jaGVja2hpZGVpZCkKKyAgICAgICAgc2VsZi5jaGVja2hpZGVpZCA9IE5vbmUKKyAgICAgICAgZm9yIHNlcSBpbiBISURFX1NFUVVFTkNFUzoKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0LmV2ZW50X2RlbGV0ZShISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSwgc2VxKQorICAgICAgICBzZWxmLndpZGdldC51bmJpbmQoSElERV9WSVJUVUFMX0VWRU5UX05BTUUsIHNlbGYuaGlkZWlkKQorICAgICAgICBzZWxmLmhpZGVpZCA9IE5vbmUKKworICAgICAgICBzZWxmLmxhYmVsLmRlc3Ryb3koKQorICAgICAgICBzZWxmLmxhYmVsID0gTm9uZQorICAgICAgICBzZWxmLnRpcHdpbmRvdy5kZXN0cm95KCkKKyAgICAgICAgc2VsZi50aXB3aW5kb3cgPSBOb25lCisKKyAgICAgICAgc2VsZi53aWRnZXQubWFya191bnNldChNQVJLX1JJR0hUKQorICAgICAgICBzZWxmLnBhcmVubGluZSA9IHNlbGYucGFyZW5jb2wgPSBzZWxmLmxhc3RsaW5lID0gTm9uZQorCisgICAgZGVmIGlzX2FjdGl2ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi50aXB3aW5kb3cpCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRlc3QgQ29kZQorIworY2xhc3MgY29udGFpbmVyOiAjIENvbmNlcHR1YWxseSBhbiBlZGl0b3Jfd2luZG93CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICByb290ID0gVGsoKQorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0ID0gVGV4dChyb290KQorICAgICAgICB0ZXh0LnBhY2soc2lkZT1MRUZULCBmaWxsPUJPVEgsIGV4cGFuZD0xKQorICAgICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwgInN0cmluZy5zcGxpdCIpCisgICAgICAgIHJvb3QudXBkYXRlKCkKKyAgICAgICAgc2VsZi5jYWxsdGlwID0gQ2FsbFRpcCh0ZXh0KQorCisgICAgICAgIHRleHQuZXZlbnRfYWRkKCI8PGNhbGx0aXAtc2hvdz4+IiwgIigiKQorICAgICAgICB0ZXh0LmV2ZW50X2FkZCgiPDxjYWxsdGlwLWhpZGU+PiIsICIpIikKKyAgICAgICAgdGV4dC5iaW5kKCI8PGNhbGx0aXAtc2hvdz4+Iiwgc2VsZi5jYWxsdGlwX3Nob3cpCisgICAgICAgIHRleHQuYmluZCgiPDxjYWxsdGlwLWhpZGU+PiIsIHNlbGYuY2FsbHRpcF9oaWRlKQorCisgICAgICAgIHRleHQuZm9jdXNfc2V0KCkKKyAgICAgICAgcm9vdC5tYWlubG9vcCgpCisKKyAgICBkZWYgY2FsbHRpcF9zaG93KHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi5jYWxsdGlwLnNob3d0aXAoIkhlbGxvIHdvcmxkIikKKworICAgIGRlZiBjYWxsdGlwX2hpZGUoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLmNhbGx0aXAuaGlkZXRpcCgpCisKK2RlZiBtYWluKCk6CisgICAgIyBUZXN0IGNvZGUKKyAgICBjPWNvbnRhaW5lcigpCisKK2lmIF9fbmFtZV9fPT0nX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3M2I3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3M2I3NTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NhbGxUaXBzLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NhbGxUaXBzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MzNjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcHMucHkKQEAgLTAsMCArMSwyMjYgQEAKKyIiIkNhbGxUaXBzLnB5IC0gQW4gSURMRSBFeHRlbnNpb24gdG8gSm9nIFlvdXIgTWVtb3J5CisKK0NhbGwgVGlwcyBhcmUgZmxvYXRpbmcgd2luZG93cyB3aGljaCBkaXNwbGF5IGZ1bmN0aW9uLCBjbGFzcywgYW5kIG1ldGhvZAorcGFyYW1ldGVyIGFuZCBkb2NzdHJpbmcgaW5mb3JtYXRpb24gd2hlbiB5b3UgdHlwZSBhbiBvcGVuaW5nIHBhcmVudGhlc2lzLCBhbmQKK3doaWNoIGRpc2FwcGVhciB3aGVuIHlvdSB0eXBlIGEgY2xvc2luZyBwYXJlbnRoZXNpcy4KKworIiIiCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworCitmcm9tIGlkbGVsaWIgaW1wb3J0IENhbGxUaXBXaW5kb3cKK2Zyb20gaWRsZWxpYi5IeXBlclBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKKworaW1wb3J0IF9fbWFpbl9fCisKK2NsYXNzIENhbGxUaXBzOgorCisgICAgbWVudWRlZnMgPSBbCisgICAgICAgICgnZWRpdCcsIFsKKyAgICAgICAgICAgICgiU2hvdyBjYWxsIHRpcCIsICI8PGZvcmNlLW9wZW4tY2FsbHRpcD4+IiksCisgICAgICAgIF0pCisgICAgXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVkaXR3aW49Tm9uZSk6CisgICAgICAgIGlmIGVkaXR3aW4gaXMgTm9uZTogICMgc3VicHJvY2VzcyBhbmQgdGVzdAorICAgICAgICAgICAgc2VsZi5lZGl0d2luID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZWRpdHdpbiA9IGVkaXR3aW4KKyAgICAgICAgc2VsZi50ZXh0ID0gZWRpdHdpbi50ZXh0CisgICAgICAgIHNlbGYuY2FsbHRpcCA9IE5vbmUKKyAgICAgICAgc2VsZi5fbWFrZV9jYWxsdGlwX3dpbmRvdyA9IHNlbGYuX21ha2VfdGtfY2FsbHRpcF93aW5kb3cKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fbWFrZV9jYWxsdGlwX3dpbmRvdyA9IE5vbmUKKworICAgIGRlZiBfbWFrZV90a19jYWxsdGlwX3dpbmRvdyhzZWxmKToKKyAgICAgICAgIyBTZWUgX19pbml0X18gZm9yIHVzYWdlCisgICAgICAgIHJldHVybiBDYWxsVGlwV2luZG93LkNhbGxUaXAoc2VsZi50ZXh0KQorCisgICAgZGVmIF9yZW1vdmVfY2FsbHRpcF93aW5kb3coc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuY2FsbHRpcDoKKyAgICAgICAgICAgIHNlbGYuY2FsbHRpcC5oaWRldGlwKCkKKyAgICAgICAgICAgIHNlbGYuY2FsbHRpcCA9IE5vbmUKKworICAgIGRlZiBmb3JjZV9vcGVuX2NhbGx0aXBfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiJIYXBwZW5zIHdoZW4gdGhlIHVzZXIgcmVhbGx5IHdhbnRzIHRvIG9wZW4gYSBDYWxsVGlwLCBldmVuIGlmIGEKKyAgICAgICAgZnVuY3Rpb24gY2FsbCBpcyBuZWVkZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm9wZW5fY2FsbHRpcChUcnVlKQorCisgICAgZGVmIHRyeV9vcGVuX2NhbGx0aXBfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiJIYXBwZW5zIHdoZW4gaXQgd291bGQgYmUgbmljZSB0byBvcGVuIGEgQ2FsbFRpcCwgYnV0IG5vdCByZWFsbHkKKyAgICAgICAgbmVjZXNzYXJ5LCBmb3IgZXhhbXBsZSBhZnRlciBhbiBvcGVuaW5nIGJyYWNrZXQsIHNvIGZ1bmN0aW9uIGNhbGxzCisgICAgICAgIHdvbid0IGJlIG1hZGUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm9wZW5fY2FsbHRpcChGYWxzZSkKKworICAgIGRlZiByZWZyZXNoX2NhbGx0aXBfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiJJZiB0aGVyZSBpcyBhbHJlYWR5IGEgY2FsbHRpcCB3aW5kb3csIGNoZWNrIGlmIGl0IGlzIHN0aWxsIG5lZWRlZCwKKyAgICAgICAgYW5kIGlmIHNvLCByZWxvYWQgaXQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNhbGx0aXAgYW5kIHNlbGYuY2FsbHRpcC5pc19hY3RpdmUoKToKKyAgICAgICAgICAgIHNlbGYub3Blbl9jYWxsdGlwKEZhbHNlKQorCisgICAgZGVmIG9wZW5fY2FsbHRpcChzZWxmLCBldmFsZnVuY3MpOgorICAgICAgICBzZWxmLl9yZW1vdmVfY2FsbHRpcF93aW5kb3coKQorCisgICAgICAgIGhwID0gSHlwZXJQYXJzZXIoc2VsZi5lZGl0d2luLCAiaW5zZXJ0IikKKyAgICAgICAgc3VyX3BhcmVuID0gaHAuZ2V0X3N1cnJvdW5kaW5nX2JyYWNrZXRzKCcoJykKKyAgICAgICAgaWYgbm90IHN1cl9wYXJlbjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBocC5zZXRfaW5kZXgoc3VyX3BhcmVuWzBdKQorICAgICAgICBleHByZXNzaW9uID0gaHAuZ2V0X2V4cHJlc3Npb24oKQorICAgICAgICBpZiBub3QgZXhwcmVzc2lvbiBvciAobm90IGV2YWxmdW5jcyBhbmQgZXhwcmVzc2lvbi5maW5kKCcoJykgIT0gLTEpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGFyZ190ZXh0ID0gc2VsZi5mZXRjaF90aXAoZXhwcmVzc2lvbikKKyAgICAgICAgaWYgbm90IGFyZ190ZXh0OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuY2FsbHRpcCA9IHNlbGYuX21ha2VfY2FsbHRpcF93aW5kb3coKQorICAgICAgICBzZWxmLmNhbGx0aXAuc2hvd3RpcChhcmdfdGV4dCwgc3VyX3BhcmVuWzBdLCBzdXJfcGFyZW5bMV0pCisKKyAgICBkZWYgZmV0Y2hfdGlwKHNlbGYsIGV4cHJlc3Npb24pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGFyZ3VtZW50IGxpc3QgYW5kIGRvY3N0cmluZyBvZiBhIGZ1bmN0aW9uIG9yIGNsYXNzCisKKyAgICAgICAgSWYgdGhlcmUgaXMgYSBQeXRob24gc3VicHJvY2VzcywgZ2V0IHRoZSBjYWxsdGlwIHRoZXJlLiAgT3RoZXJ3aXNlLAorICAgICAgICBlaXRoZXIgZmV0Y2hfdGlwKCkgaXMgcnVubmluZyBpbiB0aGUgc3VicHJvY2VzcyBpdHNlbGYgb3IgaXQgd2FzIGNhbGxlZAorICAgICAgICBpbiBhbiBJRExFIEVkaXRvcldpbmRvdyBiZWZvcmUgYW55IHNjcmlwdCBoYWQgYmVlbiBydW4uCisKKyAgICAgICAgVGhlIHN1YnByb2Nlc3MgZW52aXJvbm1lbnQgaXMgdGhhdCBvZiB0aGUgbW9zdCByZWNlbnRseSBydW4gc2NyaXB0LiAgSWYKKyAgICAgICAgdHdvIHVucmVsYXRlZCBtb2R1bGVzIGFyZSBiZWluZyBlZGl0ZWQgc29tZSBjYWxsdGlwcyBpbiB0aGUgY3VycmVudAorICAgICAgICBtb2R1bGUgbWF5IGJlIGlub3BlcmF0aXZlIGlmIHRoZSBtb2R1bGUgd2FzIG5vdCB0aGUgbGFzdCB0byBydW4uCisKKyAgICAgICAgVG8gZmluZCBtZXRob2RzLCBmZXRjaF90aXAgbXVzdCBiZSBmZWQgYSBmdWxseSBxdWFsaWZpZWQgbmFtZS4KKworICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnBjY2x0ID0gc2VsZi5lZGl0d2luLmZsaXN0LnB5c2hlbGwuaW50ZXJwLnJwY2NsdAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBycGNjbHQgPSBOb25lCisgICAgICAgIGlmIHJwY2NsdDoKKyAgICAgICAgICAgIHJldHVybiBycGNjbHQucmVtb3RlY2FsbCgiZXhlYyIsICJnZXRfdGhlX2NhbGx0aXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHByZXNzaW9uLCksIHt9KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW50aXR5ID0gc2VsZi5nZXRfZW50aXR5KGV4cHJlc3Npb24pCisgICAgICAgICAgICByZXR1cm4gZ2V0X2FyZ190ZXh0KGVudGl0eSkKKworICAgIGRlZiBnZXRfZW50aXR5KHNlbGYsIGV4cHJlc3Npb24pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIGV4cHJlc3Npb24gZXZhbHVhdGVkCisgICAgICAgIGluIGEgbmFtZXNwYWNlIHNwYW5uaW5nIHN5cy5tb2R1bGVzIGFuZCBfX21haW4uZGljdF9fLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZXhwcmVzc2lvbjoKKyAgICAgICAgICAgIG5hbWVzcGFjZSA9IHN5cy5tb2R1bGVzLmNvcHkoKQorICAgICAgICAgICAgbmFtZXNwYWNlLnVwZGF0ZShfX21haW5fXy5fX2RpY3RfXykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gZXZhbChleHByZXNzaW9uLCBuYW1lc3BhY2UpCisgICAgICAgICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAjIEFuIHVuY2F1Z2h0IGV4Y2VwdGlvbiBjbG9zZXMgaWRsZSwgYW5kIGV2YWwgY2FuIHJhaXNlIGFueQorICAgICAgICAgICAgICAgICMgZXhjZXB0aW9uLCBlc3BlY2lhbGx5IGlmIHVzZXIgY2xhc3NlcyBhcmUgaW52b2x2ZWQuCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworZGVmIF9maW5kX2NvbnN0cnVjdG9yKGNsYXNzX29iKToKKyAgICAjIEdpdmVuIGEgY2xhc3Mgb2JqZWN0LCByZXR1cm4gYSBmdW5jdGlvbiBvYmplY3QgdXNlZCBmb3IgdGhlCisgICAgIyBjb25zdHJ1Y3RvciAoaWUsIF9faW5pdF9fKCkgKSBvciBOb25lIGlmIHdlIGNhbid0IGZpbmQgb25lLgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGNsYXNzX29iLl9faW5pdF9fLmltX2Z1bmMKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIGZvciBiYXNlIGluIGNsYXNzX29iLl9fYmFzZXNfXzoKKyAgICAgICAgICAgIHJjID0gX2ZpbmRfY29uc3RydWN0b3IoYmFzZSkKKyAgICAgICAgICAgIGlmIHJjIGlzIG5vdCBOb25lOiByZXR1cm4gcmMKKyAgICByZXR1cm4gTm9uZQorCitkZWYgZ2V0X2FyZ190ZXh0KG9iKToKKyAgICAiIiJHZXQgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgYXJndW1lbnRzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0LAorICAgICAgIG9ubHkgaWYgaXQgaXMgY2FsbGFibGUuIiIiCisgICAgYXJnX3RleHQgPSAiIgorICAgIGlmIG9iIGlzIG5vdCBOb25lIGFuZCBoYXNhdHRyKG9iLCAnX19jYWxsX18nKToKKyAgICAgICAgYXJnX29mZnNldCA9IDAKKyAgICAgICAgaWYgdHlwZShvYikgaW4gKHR5cGVzLkNsYXNzVHlwZSwgdHlwZXMuVHlwZVR5cGUpOgorICAgICAgICAgICAgIyBMb29rIGZvciB0aGUgaGlnaGVzdCBfX2luaXRfXyBpbiB0aGUgY2xhc3MgY2hhaW4uCisgICAgICAgICAgICBmb2IgPSBfZmluZF9jb25zdHJ1Y3RvcihvYikKKyAgICAgICAgICAgIGlmIGZvYiBpcyBOb25lOgorICAgICAgICAgICAgICAgIGZvYiA9IGxhbWJkYTogTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhcmdfb2Zmc2V0ID0gMQorICAgICAgICBlbGlmIHR5cGUob2IpPT10eXBlcy5NZXRob2RUeXBlOgorICAgICAgICAgICAgIyBiaXQgb2YgYSBoYWNrIGZvciBtZXRob2RzIC0gdHVybiBpdCBpbnRvIGEgZnVuY3Rpb24KKyAgICAgICAgICAgICMgYnV0IHdlIGRyb3AgdGhlICJzZWxmIiBwYXJhbS4KKyAgICAgICAgICAgIGZvYiA9IG9iLmltX2Z1bmMKKyAgICAgICAgICAgIGFyZ19vZmZzZXQgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb2IgPSBvYgorICAgICAgICAjIFRyeSB0byBidWlsZCBvbmUgZm9yIFB5dGhvbiBkZWZpbmVkIGZ1bmN0aW9ucworICAgICAgICBpZiB0eXBlKGZvYikgaW4gW3R5cGVzLkZ1bmN0aW9uVHlwZSwgdHlwZXMuTGFtYmRhVHlwZV06CisgICAgICAgICAgICBhcmdjb3VudCA9IGZvYi5mdW5jX2NvZGUuY29fYXJnY291bnQKKyAgICAgICAgICAgIHJlYWxfYXJncyA9IGZvYi5mdW5jX2NvZGUuY29fdmFybmFtZXNbYXJnX29mZnNldDphcmdjb3VudF0KKyAgICAgICAgICAgIGRlZmF1bHRzID0gZm9iLmZ1bmNfZGVmYXVsdHMgb3IgW10KKyAgICAgICAgICAgIGRlZmF1bHRzID0gbGlzdChtYXAobGFtYmRhIG5hbWU6ICI9JXMiICUgcmVwcihuYW1lKSwgZGVmYXVsdHMpKQorICAgICAgICAgICAgZGVmYXVsdHMgPSBbIiJdICogKGxlbihyZWFsX2FyZ3MpIC0gbGVuKGRlZmF1bHRzKSkgKyBkZWZhdWx0cworICAgICAgICAgICAgaXRlbXMgPSBtYXAobGFtYmRhIGFyZywgZGZsdDogYXJnICsgZGZsdCwgcmVhbF9hcmdzLCBkZWZhdWx0cykKKyAgICAgICAgICAgIGlmIGZvYi5mdW5jX2NvZGUuY29fZmxhZ3MgJiAweDQ6CisgICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKCIuLi4iKQorICAgICAgICAgICAgaWYgZm9iLmZ1bmNfY29kZS5jb19mbGFncyAmIDB4ODoKKyAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoIioqKiIpCisgICAgICAgICAgICBhcmdfdGV4dCA9ICIsICIuam9pbihpdGVtcykKKyAgICAgICAgICAgIGFyZ190ZXh0ID0gIiglcykiICUgcmUuc3ViKCJcLlxkKyIsICI8dHVwbGU+IiwgYXJnX3RleHQpCisgICAgICAgICMgU2VlIGlmIHdlIGNhbiB1c2UgdGhlIGRvY3N0cmluZworICAgICAgICBkb2MgPSBnZXRhdHRyKG9iLCAiX19kb2NfXyIsICIiKQorICAgICAgICBpZiBkb2M6CisgICAgICAgICAgICBkb2MgPSBkb2MubHN0cmlwKCkKKyAgICAgICAgICAgIHBvcyA9IGRvYy5maW5kKCJcbiIpCisgICAgICAgICAgICBpZiBwb3MgPCAwIG9yIHBvcyA+IDcwOgorICAgICAgICAgICAgICAgIHBvcyA9IDcwCisgICAgICAgICAgICBpZiBhcmdfdGV4dDoKKyAgICAgICAgICAgICAgICBhcmdfdGV4dCArPSAiXG4iCisgICAgICAgICAgICBhcmdfdGV4dCArPSBkb2NbOnBvc10KKyAgICByZXR1cm4gYXJnX3RleHQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBUZXN0IGNvZGUKKyMKK2lmIF9fbmFtZV9fPT0nX19tYWluX18nOgorCisgICAgZGVmIHQxKCk6ICIoKSIKKyAgICBkZWYgdDIoYSwgYj1Ob25lKTogIihhLCBiPU5vbmUpIgorICAgIGRlZiB0MyhhLCAqYXJncyk6ICIoYSwgLi4uKSIKKyAgICBkZWYgdDQoKmFyZ3MpOiAiKC4uLikiCisgICAgZGVmIHQ1KGEsICphcmdzKTogIihhLCAuLi4pIgorICAgIGRlZiB0NihhLCBiPU5vbmUsICphcmdzLCAqKmt3KTogIihhLCBiPU5vbmUsIC4uLiwgKioqKSIKKyAgICBkZWYgdDcoKGEsIGIpLCBjLCAoZCwgZSkpOiAiKDx0dXBsZT4sIGMsIDx0dXBsZT4pIgorCisgICAgY2xhc3MgVEMob2JqZWN0KToKKyAgICAgICAgIihhaT1Ob25lLCAuLi4pIgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYWk9Tm9uZSwgKmIpOiAiKGFpPU5vbmUsIC4uLikiCisgICAgICAgIGRlZiB0MShzZWxmKTogIigpIgorICAgICAgICBkZWYgdDIoc2VsZiwgYWksIGI9Tm9uZSk6ICIoYWksIGI9Tm9uZSkiCisgICAgICAgIGRlZiB0MyhzZWxmLCBhaSwgKmFyZ3MpOiAiKGFpLCAuLi4pIgorICAgICAgICBkZWYgdDQoc2VsZiwgKmFyZ3MpOiAiKC4uLikiCisgICAgICAgIGRlZiB0NShzZWxmLCBhaSwgKmFyZ3MpOiAiKGFpLCAuLi4pIgorICAgICAgICBkZWYgdDYoc2VsZiwgYWksIGI9Tm9uZSwgKmFyZ3MsICoqa3cpOiAiKGFpLCBiPU5vbmUsIC4uLiwgKioqKSIKKyAgICAgICAgZGVmIHQ3KHNlbGYsIChhaSwgYiksIGMsIChkLCBlKSk6ICIoPHR1cGxlPiwgYywgPHR1cGxlPikiCisKKyAgICBkZWYgdGVzdCh0ZXN0cyk6CisgICAgICAgIGN0ID0gQ2FsbFRpcHMoKQorICAgICAgICBmYWlsZWQ9W10KKyAgICAgICAgZm9yIHQgaW4gdGVzdHM6CisgICAgICAgICAgICBleHBlY3RlZCA9IHQuX19kb2NfXyArICJcbiIgKyB0Ll9fZG9jX18KKyAgICAgICAgICAgIG5hbWUgPSB0Ll9fbmFtZV9fCisgICAgICAgICAgICAjIGV4ZXJjaXNlIGZldGNoX3RpcCgpLCBub3QganVzdCBnZXRfYXJnX3RleHQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHF1YWxpZmllZF9uYW1lID0gIiVzLiVzIiAlICh0LmltX2NsYXNzLl9fbmFtZV9fLCBuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHF1YWxpZmllZF9uYW1lID0gbmFtZQorICAgICAgICAgICAgYXJnX3RleHQgPSBjdC5mZXRjaF90aXAocXVhbGlmaWVkX25hbWUpCisgICAgICAgICAgICBpZiBhcmdfdGV4dCAhPSBleHBlY3RlZDoKKyAgICAgICAgICAgICAgICBmYWlsZWQuYXBwZW5kKHQpCisgICAgICAgICAgICAgICAgZm10ID0gIiVzIC0gZXhwZWN0ZWQgJXMsIGJ1dCBnb3QgJXMiCisgICAgICAgICAgICAgICAgcHJpbnQgIGZtdCAlICh0Ll9fbmFtZV9fLCBleHBlY3RlZCwgZ2V0X2FyZ190ZXh0KHQpKQorICAgICAgICBwcmludCAiJWQgb2YgJWQgdGVzdHMgZmFpbGVkIiAlIChsZW4oZmFpbGVkKSwgbGVuKHRlc3RzKSkKKworICAgIHRjID0gVEMoKQorICAgIHRlc3RzID0gKHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3LAorICAgICAgICAgICAgIFRDLCB0Yy50MSwgdGMudDIsIHRjLnQzLCB0Yy50NCwgdGMudDUsIHRjLnQ2LCB0Yy50NykKKworICAgIHRlc3QodGVzdHMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcHMucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NhbGxUaXBzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA4MjBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NhbGxUaXBzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcHMucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NhbGxUaXBzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjA4MjBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NhbGxUaXBzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2hhbmdlTG9nIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODU4NzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NoYW5nZUxvZwpAQCAtMCwwICsxLDE1OTEgQEAKK1BsZWFzZSByZWZlciB0byB0aGUgSURMRWZvcmsgYW5kIElETEUgQ1ZTIHJlcG9zaXRvcmllcyBmb3IKK2NoYW5nZSBkZXRhaWxzIHN1YnNlcXVlbnQgdG8gdGhlIDAuOC4xIHJlbGVhc2UuCisKKworSURMRWZvcmsgQ2hhbmdlTG9nCis9PT09PT09PT09PT09PT09PT0KKworMjAwMS0wNy0yMCAxMTozNSAgZWxndWF2YXMKKworCSogUkVBRE1FLnR4dCwgTkVXUy50eHQ6IGJyaW5nIHVwIHRvIGRhdGUgZm9yIDAuOC4xIHJlbGVhc2UKKworMjAwMS0wNy0xOSAxNjo0MCAgZWxndWF2YXMKKworCSogSURMRUZPUksuaHRtbDogcmVwbGFjZWQgYnkgSURMRUZPUkstaW5kZXguaHRtbAorCisyMDAxLTA3LTE5IDE2OjM5ICBlbGd1YXZhcworCisJKiBJRExFRk9SSy1pbmRleC5odG1sOiB1cGRhdGVkIHBsYWNlaG9sZGVyIGlkbGVmb3JrIGhvbWVwYWdlCisKKzIwMDEtMDctMTkgMTQ6NDkgIGVsZ3VhdmFzCisKKwkqIENoYW5nZUxvZywgRWRpdG9yV2luZG93LnB5LCBJTlNUQUxMQVRJT04sIE5FV1MudHh0LCBSRUFETUUudHh0LAorCVRPRE8udHh0LCBpZGxldmVyLnB5OiAKKwltaW5vciB0aWR5LXVwcyByZWFkeSBmb3IgMC44LjEgYWxwaGEgdGFyYmFsbCByZWxlYXNlCisKKzIwMDEtMDctMTcgMTU6MTIgIGtiaworCisJKiBJTlNUQUxMQVRJT04sIHNldHVwLnB5OiBJTlNUQUxMQVRJT046IFJlbW92ZSB0aGUgY29leGlzdC5wYXRjaAorCWluc3RydWN0aW9ucworCQorCSoqKioqKioqKioqKioqKiogc2V0dXAucHk6CisJCisJUmVtb3ZlIHRoZSBpZGxlcyBzY3JpcHQsIGFkZCBzb21lIHdvcmRzIG9uIElETEUgRm9yayB0byB0aGUKKwlsb25nX2Rlc2NyaXB0aW9uLCBhbmQgY2xlYW4gdXAgc29tZSBsaW5lIHNwYWNpbmcuCisKKzIwMDEtMDctMTcgMTU6MDEgIGtiaworCisJKiBjb2V4aXN0LnBhdGNoOiBQdXQgdGhpcyBpbiB0aGUgYXR0aWMsIGF0IGxlYXN0IGZvciBub3cuLi4KKworMjAwMS0wNy0xNyAxNDo1OSAga2JrCisKKwkqIFB5U2hlbGwucHksIGlkbGUsIGlkbGVzOiBJbXBsZW1lbnQgaWRsZSBjb21tYW5kIGludGVyZmFjZSBhcworCXN1Z2dlc3RlZCBieSBHdlIgW2lkbGUtZGV2XSAxNiBKdWx5ICoqKioqKioqKioqKioqKiogUHlTaGVsbDogQWRkZWQKKwlmdW5jdGlvbmFsaXR5OgorCQorCXVzYWdlOiBpZGxlLnB5IFstYyBjb21tYW5kXSBbLWRdIFstaV0gWy1yIHNjcmlwdF0gWy1zXSBbLXQgdGl0bGVdCisJW2FyZ10gLi4uCisJCisJaWRsZSBmaWxlKHMpCSh3aXRob3V0IG9wdGlvbnMpIGVkaXQgdGhlIGZpbGUocykKKwkKKwktYyBjbWQJICAgcnVuIHRoZSBjb21tYW5kIGluIGEgc2hlbGwgLWQJIGVuYWJsZSB0aGUKKwlkZWJ1Z2dlciAtaQkgICAgb3BlbiBhbiBpbnRlcmFjdGl2ZSBzaGVsbCAtaSBmaWxlKHMpIG9wZW4gYQorCXNoZWxsIGFuZCBhbHNvIGFuIGVkaXRvciB3aW5kb3cgZm9yIGVhY2ggZmlsZSAtciBzY3JpcHQgIHJ1biBhIGZpbGUKKwlhcyBhIHNjcmlwdCBpbiBhIHNoZWxsIC1zCSAgcnVuICRJRExFU1RBUlRVUCBvcgorCSRQWVRIT05TVEFSVFVQIGJlZm9yZSBhbnl0aGluZyBlbHNlIC10IHRpdGxlICAgc2V0IHRpdGxlIG9mIHNoZWxsCisJd2luZG93CisJCisJUmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byB0aGUgY29tbWFuZCAoLWMpIG9yIHNjcmlwdCAoLXIpLgorCQorCSoqKioqKioqKioqKioqKioqKiBpZGxlczogUmVtb3ZlZCB0aGUgaWRsZXMgc2NyaXB0LCBub3QgbmVlZGVkCisJCisJKioqKioqKioqKioqKioqKioqIGlkbGU6ICBSZW1vdmVkIHRoZSBJZGxlQ29uZiByZWZlcmVuY2VzLCBub3QKKwlyZXF1aXJlZCBhbnltb3JlCisKKzIwMDEtMDctMTYgMTc6MDggIGtiaworCisJKiBJTlNUQUxMQVRJT04sIGNvZXhpc3QucGF0Y2g6IEFkZGVkIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMuCisJCisJQWRkZWQgYSBwYXRjaCB3aGljaCBtb2RpZmllcyBpZGxlZm9yayBzbyB0aGF0IGl0IGNhbiBjby1leGlzdCB3aXRoCisJIm9mZmljaWFsIiBJRExFIGluIHRoZSBzaXRlLXBhY2thZ2VzIGRpcmVjdG9yeS4gVGhpcyBwYXRjaCBpcyBub3QKKwluZWNlc3NhcnkgaWYgb25seSBpZGxlZm9yayBJRExFIGlzIGluc3RhbGxlZC4gU2VlIElOU1RBTExBVElPTiBmb3IKKwlmdXJ0aGVyIGRldGFpbHMuCisKKzIwMDEtMDctMTYgMTU6NTAgIGtiaworCisJKiBpZGxlczogQWRkIGEgc2NyaXB0ICJpZGxlcyIgd2hpY2ggb3BlbnMgYSBQeXRob24gU2hlbGwgd2luZG93LgorCQorCVRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBpZGxlZm9yayBpZGxlIGlzIHRvIG9wZW4gYW4gZWRpdG9yIHdpbmRvdworCWluc3RlYWQgb2YgYSBzaGVsbC4gQ29tcGxleCBleHByZXNzaW9ucyBtYXkgYmUgcnVuIGluIGEgZnJlc2gKKwllbnZpcm9ubWVudCBieSBzZWxlY3RpbmcgInJ1biIuICBUaGVyZSBhcmUgdGltZXMsIGhvd2V2ZXIsIHdoZW4gYQorCXNoZWxsIGlzIGRlc2lyZWQuICBUaG91Z2ggb25lIGNhbiBiZSBzdGFydGVkIGJ5ICJpZGxlIC10ICdmb28nIiwKKwl0aGlzIHNjcmlwdCBpcyBtb3JlIGNvbnZlbmllbnQuICBJbiBhZGRpdGlvbiwgYSBzaGVsbCBhbmQgYW4gZWRpdG9yCisJd2luZG93IGNhbiBiZSBzdGFydGVkIGluIHBhcmFsbGVsIGJ5ICJpZGxlcyAtZSBmb28ucHkiLgorCisyMDAxLTA3LTE2IDE1OjI1ICBrYmsKKworCSogUHlTaGVsbC5weTogQ2FsbCBvdXQgSURMRSBGb3JrIGluIHN0YXJ0dXAgbWVzc2FnZS4KKworMjAwMS0wNy0xNiAxNDowMCAga2JrCisKKwkqIFB5U2hlbGwucHksIHNldHVwLnB5OiBBZGQgYSBzY3JpcHQgImlkbGVzIiB3aGljaCBvcGVucyBhIFB5dGhvbgorCVNoZWxsIHdpbmRvdy4KKwkKKwlUaGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgaWRsZWZvcmsgaWRsZSBpcyB0byBvcGVuIGFuIGVkaXRvciB3aW5kb3cKKwlpbnN0ZWFkIG9mIGEgc2hlbGwuIENvbXBsZXggZXhwcmVzc2lvbnMgbWF5IGJlIHJ1biBpbiBhIGZyZXNoCisJZW52aXJvbm1lbnQgYnkgc2VsZWN0aW5nICJydW4iLiAgVGhlcmUgYXJlIHRpbWVzLCBob3dldmVyLCB3aGVuIGEKKwlzaGVsbCBpcyBkZXNpcmVkLiAgVGhvdWdoIG9uZSBjYW4gYmUgc3RhcnRlZCBieSAiaWRsZSAtdCAnZm9vJyIsCisJdGhpcyBzY3JpcHQgaXMgbW9yZSBjb252ZW5pZW50LiAgSW4gYWRkaXRpb24sIGEgc2hlbGwgYW5kIGFuIGVkaXRvcgorCXdpbmRvdyBjYW4gYmUgc3RhcnRlZCBpbiBwYXJhbGxlbCBieSAiaWRsZXMgLWUgZm9vLnB5Ii4KKworMjAwMS0wNy0xNSAwMzowNiAga2JrCisKKwkqIHB5Y2xici5weSwgdGFibmFubnkucHk6IHRhYm5hbm55IGFuZCBweWNsYnIgYXJlIG5vdyBmb3VuZCBpbiAvTGliCisKKzIwMDEtMDctMTUgMDI6MjkgIGtiaworCisJKiBCcm93c2VyQ29udHJvbC5weTogUmVtb3ZlLCB3YXMgcmV0YWluZWQgZm9yIDEuNS4yIHN1cHBvcnQKKworMjAwMS0wNy0xNCAxNTo0OCAga2JrCisKKwkqIHNldHVwLnB5OiBJbnN0YWxsaW5nIElkbGUgdG8gc2l0ZS1wYWNrYWdlcyB2aWEgRGlzdHV0aWxzIGRvZXMgbm90CisJY29weSB0aGUgSWRsZSBoZWxwLnR4dCBmaWxlLgorCQorCVJlZiBTRiBQeXRob24gUGF0Y2ggNDIyNDcxCisKKzIwMDEtMDctMTQgMTU6MjYgIGtiaworCisJKiBrZXlkZWZzLnB5OiBweS1jdnMtMjAwMV8wN18xMyAoUmV2IDEuMykgbWVyZ2UKKwkKKwkiTWFrZSBjb3B5LCBjdXQgYW5kIHBhc3RlIGV2ZW50cyBjYXNlIGluc2Vuc2l0aXZlLiAgUmVwb3J0ZWQgYnkKKwlQYXRyaWNrIEsuIE8nQnJpZW4gb24gaWRsZS1kZXYuIChTaG91bGQgb3RoZXIgYmluZGluZ3MgZm9sbG93CisJc3VpdD8pIiAtLUd2UgorCisyMDAxLTA3LTE0IDE1OjIxICBrYmsKKworCSogaWRsZS5weTogcHktY3ZzLTIwMDFfMDdfMTMgKFJldiAxLjQpIG1lcmdlCisJCisJIk1vdmUgdGhlIGFjdGlvbiBvZiBsb2FkaW5nIHRoZSBjb25maWd1cmF0aW9uIHRvIHRoZSBJZGxlQ29uZgorCW1vZHVsZSByYXRoZXIgdGhhbiB0aGUgaWRsZS5weSBzY3JpcHQuCVRoaXMgaGFzIGFkdmFudGFnZXMgYW5kCisJZGlzYWR2YW50YWdlczsgdGhlIGJpZ2dlc3QgYWR2YW50YWdlIGJlaW5nIHRoYXQgd2UgY2FuIG1vcmUgZWFzaWx5CisJaGF2ZSBhbiBhbHRlcm5hdGl2ZSBtYWluIHByb2dyYW0uIiAgLS1HdlIKKworMjAwMS0wNy0xNCAxNToxOCAga2JrCisKKwkqIGV4dGVuZC50eHQ6IHB5LWN2cy0yMDAxXzA3XzEzIChSZXYgMS40KSBtZXJnZQorCQorCSJRdWljayB1cGRhdGUgdG8gdGhlIGV4dGVuc2lvbiBtZWNoYW5pc20gKGV4dGVuZC5weSBpcyBnb25lLCBsb25nCisJbGl2ZSBjb25maWcudHh0KSIgLS1HdlIKKworMjAwMS0wNy0xNCAxNToxNSAga2JrCisKKwkqIFN0YWNrVmlld2VyLnB5OiBweS1jdnMtMjAwMV8wN18xMyAoUmV2IDEuMTYpIG1lcmdlCisJCisJIlJlZmFjdG9yZWQsIHdpdGggc29tZSBmdXR1cmUgcGxhbnMgaW4gbWluZC4gVGhpcyBub3cgdXNlcyB0aGUgbmV3CisJZ290b2ZpbGVsaW5lKCkgbWV0aG9kIGRlZmluZWQgaW4gRmlsZUxpc3QucHkiICAtLUd2UgorCisyMDAxLTA3LTE0IDE1OjEwICBrYmsKKworCSogUHlTaGVsbC5weTogcHktY3ZzLTIwMDFfMDdfMTMgKFJldiAxLjM0KSBtZXJnZQorCQorCSJBbWF6aW5nLiAgQSB2ZXJ5IHN1YnRsZSBjaGFuZ2UgaW4gcG9saWN5IGluIGRlc2NyLWJyYW5jaCBhY3R1YWxseQorCWZvdW5kIGEgYnVnIGhlcmUuICBIZXJlJ3MgdGhlIGRlYWw6IENsYXNzIFB5U2hlbGwgZGVyaXZlcyBmcm9tCisJY2xhc3MgT3V0cHV0V2luZG93LiAgTWV0aG9kIFB5U2hlbGwuY2xvc2UoKSB3YW50cyB0byBpbnZva2UgaXRzCisJcGFyZW50IG1ldGhvZCwgYnV0IGJlY2F1c2UgUHlTaGVsbCBsb25nIGFnbyB3YXMgaW5oZXJpdGVkIGZyb20KKwljbGFzcyBQeVNoZWxsRWRpdG9yV2luZG93LCBpdCBpbnZva2VzCisJUHlTaGVsRWRpdG9yV2luZG93LmNsb3NlKHNlbGYpLiAgTm93LCBjbGFzcyBQeVNoZWxsRWRpdG9yV2luZG93CisJaXRzZWxmIGRlcml2ZXMgZnJvbSBjbGFzcyBPdXRwdXRXaW5kb3csIGFuZCBpbmhlcml0cyB0aGUgY2xvc2UoKQorCW1ldGhvZCBmcm9tIHRoZXJlIHdpdGhvdXQgb3ZlcnJpZGluZyBpdC4gIFVuZGVyIHRoZSBvbGQgcnVsZXMsCisJUHlTaGVsbEVkaXRvcldpbmRvdy5jbG9zZSB3b3VsZCByZXR1cm4gYW4gdW5ib3VuZCBtZXRob2QgcmVzdHJpY3RlZAorCXRvIHRoZSBjbGFzcyB0aGF0IGRlZmluZWQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGNsb3NlKCksIHdoaWNoIHdhcworCU91dHB1dFdpbmRvdy5jbG9zZS4gIFVuZGVyIHRoZSBuZXcgcnVsZXMsIHRoZSB1bmJvdW5kIG1ldGhvZCBpcworCXJlc3RyaWN0ZWQgdG8gdGhlIGNsYXNzIHdob3NlIG1ldGhvZCB3YXMgcmVxdWVzdGVkLCB0aGF0IGlzCisJUHlTaGVsbEVkaXRvcldpbmRvdywgYW5kIHRoaXMgd2FzIGNvcnJlY3RseSB0cmFwcGVkIGFzIGFuIGVycm9yLiIKKwktLUd2UgorCisyMDAxLTA3LTE0IDE0OjU5ICBrYmsKKworCSogUHlQYXJzZS5weTogcHktY3ZzLTIwMDFfMDdfMTMgKFJlbCAxLjkpIG1lcmdlCisJCisJIlRhdWdodCBJRExFJ3MgYXV0b2lkZW50IHBhcnNlciB0aGF0ICJ5aWVsZCIgaXMgYSBrZXl3b3JkIHRoYXQKKwliZWdpbnMgYSBzdG10LglBbG9uZyB3LyB0aGUgcHJlY2VkaW5nIGNoYW5nZSB0byBrZXl3b3JkLnB5LCBtYWtpbmcKKwlhbGwgdGhpcyB3b3JrIHcvIGEgZnV0dXJlLXN0bXQganVzdCBsb29rcyBoYXJkZXIgYW5kIGhhcmRlci4iCisJLS10aW1fb25lCisJCisJKEZyb20gUmVsIDEuODogIkhhY2sgdG8gbWFrZSB0aGlzIHN0aWxsIHdvcmsgd2l0aCBQeXRob24gMS41LjIuIAorCTstKCAiIC0tZmRyYWtlKQorCisyMDAxLTA3LTE0IDE0OjUxICBrYmsKKworCSogSWRsZUNvbmYucHk6IHB5LWN2cy0yMDAxXzA3XzEzIChSZWwgMS43KSBtZXJnZQorCQorCSJNb3ZlIHRoZSBhY3Rpb24gb2YgbG9hZGluZyB0aGUgY29uZmlndXJhdGlvbiB0byB0aGUgSWRsZUNvbmYKKwltb2R1bGUgcmF0aGVyIHRoYW4gdGhlIGlkbGUucHkgc2NyaXB0LglUaGlzIGhhcyBhZHZhbnRhZ2VzIGFuZAorCWRpc2FkdmFudGFnZXM7IHRoZSBiaWdnZXN0IGFkdmFudGFnZSBiZWluZyB0aGF0IHdlIGNhbiBtb3JlIGVhc2lseQorCWhhdmUgYW4gYWx0ZXJuYXRpdmUgbWFpbiBwcm9ncmFtLiIgLS1HdlIKKworMjAwMS0wNy0xNCAxNDo0NSAga2JrCisKKwkqIEZpbGVMaXN0LnB5OiBweS1jdnMtMjAwMF8wN18xMyAoUmV2IDEuOSkgbWVyZ2UKKwkKKwkiRGVsZXRlIGdvb2RuYW1lKCkgbWV0aG9kLCB3aGljaCBpcyB1bnVzZWQuIEFkZCBnb3RvZmlsZWxpbmUoKSwgYQorCWNvbnZlbmllbmNlIG1ldGhvZCB3aGljaCBJIGludGVuZCB0byB1c2UgaW4gYSB2YXJpYW50LiBSZW5hbWUKKwl0ZXN0KCkgdG8gX3Rlc3QoKS4iICAtLUd2UgorCQorCVRoaXMgd2FzIGFuIGludGVyZXN0aW5nIG1lcmdlLiBUaGUgam9pbiBjb21wbGV0ZWx5IG1pc3NlZCByZW1vdmluZworCWdvb2RuYW1lKCksIHdoaWNoIHdhcyBhZGphY2VudCwgYnV0IG91dHNpZGUgb2YsIGEgc21hbGwgY29uZmxpY3QuIAorCUkgb25seSBjYXVnaHQgaXQgYnkgY29tcGFyaW5nIHRoZSAxLjEuMy4yLzEuMS4zLjMgZGlmZi4gIENWUyBhaW4ndAorCWluZmFsbGlibGUuCisKKzIwMDEtMDctMTQgMTM6NTggIGtiaworCisJKiBFZGl0b3JXaW5kb3cucHk6IHB5LWN2cy0yMDAwXzA3XzEzIChSZXYgMS4zOCkgbWVyZ2UgIlJlbW92ZQorCWxlZ2FjeSBzdXBwb3J0IGZvciB0aGUgQnJvd3NlckNvbnRyb2wgbW9kdWxlOyB0aGUgd2ViYnJvd3NlciBtb2R1bGUKKwloYXMgYmVlbiBpbmNsdWRlZCBzaW5jZSBQeXRob24gMi4wLCBhbmQgdGhhdCBpcyB0aGUgcHJlZmVycmVkCisJaW50ZXJmYWNlLiIgLS1mZHJha2UKKworMjAwMS0wNy0xNCAxMzozMiAga2JrCisKKwkqIEVkaXRvcldpbmRvdy5weSwgRmlsZUxpc3QucHksIElkbGVDb25mLnB5LCBQeVBhcnNlLnB5LAorCVB5U2hlbGwucHksIFN0YWNrVmlld2VyLnB5LCBleHRlbmQudHh0LCBpZGxlLnB5LCBrZXlkZWZzLnB5OiBJbXBvcnQKKwl0aGUgMjAwMSBKdWx5IDEzIDIzOjU5IEdNVCB2ZXJzaW9uIG9mIFB5dGhvbiBDVlMgSURMRSBvbiB0aGUKKwlleGlzdGluZyAxLjEuMyB2ZW5kb3IgYnJhbmNoIG5hbWVkIHB5LWN2cy12ZW5kb3ItYnJhbmNoLiBSZWxlYXNlCisJdGFnIGlzIHB5LWN2cy0yMDAxXzA3XzEzLgorCisyMDAxLTA3LTE0IDEyOjAyICBrYmsKKworCSogSWNvbnMvcHl0aG9uLmdpZjogcHktY3ZzLXJlbDJfMSAoUmV2IDEuMikgbWVyZ2UgQ29waWVkIHB5LWN2cyByZXYKKwkxLjIgY2hhbmdlZCBmaWxlIHRvIGlkbGVmb3JrIE1BSU4KKworMjAwMS0wNy0xNCAxMTo1OCAga2JrCisKKwkqIEljb25zL21pbnVzbm9kZS5naWY6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjIpIG1lcmdlIENvcGllZCBweS1jdnMKKwkxLjIgY2hhbmdlZCBmaWxlIHRvIGlkbGVmb3JrIE1BSU4KKworMjAwMS0wNy0xNCAxMToyMyAga2JrCisKKwkqIFNjcm9sbGVkTGlzdC5weTogcHktY3ZzLXJlbDJfMSAocmV2IDEuNSkgbWVyZ2UgLSB3aGl0ZXNwYWNlCisJbm9ybWFsaXphdGlvbgorCisyMDAxLTA3LTE0IDExOjIwICBrYmsKKworCSogU2VwYXJhdG9yLnB5OiBweS1jdnMtcmVsMl8xIChSZXYgMS4zKSBtZXJnZSAtIHdoaXRlc3BhY2UKKwlub3JtYWxpemF0aW9uCisKKzIwMDEtMDctMTQgMTE6MTYgIGtiaworCisJKiBTdGFja1ZpZXdlci5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuMTUpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xNCAxMToxNCAga2JrCisKKwkqIFRvb2xUaXAucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjIpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xNCAxMDoxMyAga2JrCisKKwkqIFB5U2hlbGwucHk6IGN2cy1weS1yZWwyXzEgKFJldiAxLjI5IC0gMS4zMykgbWVyZ2UKKwkKKwlNZXJnZWQgdGhlIGZvbGxvd2luZyBweS1jdnMgcmV2cyB3aXRob3V0IGNvbmZsaWN0OiAxLjI5IFJlZHVjZQorCWNvcHlyaWdodCB0ZXh0IG91dHB1dCBhdCBzdGFydHVwIDEuMzAgRGVsYXkgc2V0dGluZyBzeXMuYXJncyB1bnRpbAorCVRraW50ZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgMS4zMSBXaGl0ZXNwYWNlIG5vcm1hbGl6YXRpb24gMS4zMgorCVR1cm4gc3ludGF4IHdhcm5pbmcgaW50byBlcnJvciB3aGVuIGludGVyYWN0aXZlIDEuMzMgRml4IHdhcm5pbmcKKwlpbml0aWFsaXphdGlvbiBidWcKKwkKKwlOb3RlIHRoYXQgbW9kdWxlIGlzIGV4dGVuc2l2ZWx5IG1vZGlmaWVkIHdydCBweS1jdnMKKworMjAwMS0wNy0xNCAwNjozMyAga2JrCisKKwkqIFB5UGFyc2UucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjYgLSAxLjgpIG1lcmdlIEZpeCBhdXRvaW5kZW50CisJYnVnIGFuZCBkZWZsZWN0IFVuaWNvZGUgZnJvbSB0ZXh0LmdldCgpCisKKzIwMDEtMDctMTQgMDY6MDAgIGtiaworCisJKiBQZXJjb2xhdG9yLnB5OiBweS1jdnMtcmVsMl8xIChSZXYgMS4zKSAibW92ZSAiZnJvbSBUa2ludGVyIGltcG9ydAorCSoiIHRvIG1vZHVsZSBsZXZlbCIgLS1qaHlsdG9uCisKKzIwMDEtMDctMTQgMDU6NTcgIGtiaworCisJKiBQYXRoQnJvd3Nlci5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuNikgbWVyZ2UgLSB3aGl0ZXNwYWNlCisJbm9ybWFsaXphdGlvbgorCisyMDAxLTA3LTE0IDA1OjQ5ICBrYmsKKworCSogUGFyZW5NYXRjaC5weTogY3ZzLXB5LXJlbDJfMSAoUmV2IDEuNSkgbWVyZ2UgLSB3aGl0ZXNwYWNlCisJbm9ybWFsaXphdGlvbgorCisyMDAxLTA3LTE0IDAzOjU3ICBrYmsKKworCSogT2JqZWN0QnJvd3Nlci5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuMykgbWVyZ2UgIk1ha2UgdGhlIHRlc3QKKwlwcm9ncmFtIHdvcmsgb3V0c2lkZSBJRExFLiIgIC0tIEd2UgorCisyMDAxLTA3LTE0IDAzOjUyICBrYmsKKworCSogTXVsdGlTdGF0dXNCYXIucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjIpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xNCAwMzo0NCAga2JrCisKKwkqIE11bHRpU2Nyb2xsZWRMaXN0cy5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuMikgbWVyZ2UgLSB3aGl0ZXNwYWNlCisJbm9ybWFsaXphdGlvbgorCisyMDAxLTA3LTE0IDAzOjQwICBrYmsKKworCSogSWRsZUhpc3RvcnkucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjQpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xNCAwMzozOCAga2JrCisKKwkqIElkbGVDb25mLnB5OiBweS1jdnMtcmVsMl8xIChSZXYgMS42KSBtZXJnZSAtIHdoaXRlc3BhY2UKKwlub3JtYWxpemF0aW9uCisKKzIwMDEtMDctMTMgMTQ6MTggIGtiaworCisJKiBJT0JpbmRpbmcucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjQpIG1lcmdlIC0gbW92ZSAiaW1wb3J0ICoiIHRvCisJbW9kdWxlIGxldmVsCisKKzIwMDEtMDctMTMgMTQ6MTIgIGtiaworCisJKiBGb3JtYXRQYXJhZ3JhcGgucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjkpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xMyAxNDowNyAga2JrCisKKwkqIEZpbGVMaXN0LnB5OiBweS1jdnMtcmVsMl8xIChSZXYgMS44KSBtZXJnZSAtIHdoaXRlc3BhY2UKKwlub3JtYWxpemF0aW9uCisKKzIwMDEtMDctMTMgMTM6MzUgIGtiaworCisJKiBFZGl0b3JXaW5kb3cucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjMzIC0gMS4zNykgbWVyZ2UKKwkKKwlWUCBJRExFIHZlcnNpb24gZGVwZW5kZWQgb24gVlAncyBFeGVjQmluZGluZy5weSBhbmQgc3Bhd24ucHkgdG8gZ2V0CisJdGhlIHBhdGggdG8gdGhlIFdpbmRvd3MgRG9jIGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gcHl0aG9uLmV4ZSkuCisJUmVtb3ZlZCB0aGlzIGNvbmZsaWN0aW5nIGNvZGUgaW4gZmF2b3Igb2YgcHktY3ZzIHVwZGF0ZXMgd2hpY2ggb24KKwlXaW5kb3dzIHVzZSBhIGhhcmQgY29kZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhpcworCW1vZHVsZS4gcHktY3ZzIHVwZGF0ZXMgaW5jbHVkZSBzdXBwb3J0IGZvciB3ZWJicm93c2VyLnB5LiAgTW9kdWxlCisJc3RpbGwgaGFzIEJyb3dzZXJDb250cm9sLnB5IGZvciAxLjUuMiBzdXBwb3J0LgorCQorCUF0IHRoaXMgcG9pbnQsIHRoZSBkaWZmZXJlbmNlcyB3cnQgcHktY3ZzIHJlbGF0ZSB0byBtZW51CisJZnVuY3Rpb25hbGl0eS4KKworMjAwMS0wNy0xMyAxMTozMCAga2JrCisKKwkqIENvbmZpZ1BhcnNlci5weTogcHktY3ZzLXJlbDJfMSBtZXJnZSAtIFJlbW92ZSwgbGl2ZXMgaW4gL0xpYgorCisyMDAxLTA3LTEzIDEwOjEwICBrYmsKKworCSogRGVsZWdhdG9yLnB5OiBweS1jdnMtcmVsMl8xIChSZXYgMS4zKSBtZXJnZSAtIHdoaXRlc3BhY2UKKwlub3JtYWxpemF0aW9uCisKKzIwMDEtMDctMTMgMTA6MDcgIGtiaworCisJKiBEZWJ1Z2dlci5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuMTUpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xMyAxMDowNCAga2JrCisKKwkqIENvbG9yRGVsZWdhdG9yLnB5OiBweS1jdnMtcmVsMl8xIChSZXYgMS4xMSBhbmQgMS4xMikgbWVyZ2UKKwlDb2xvcml6ZSAiYXMiIGFmdGVyICJpbXBvcnQiIC8gdXNlIERFQlVHIGluc3RlYWQgb2YgX19kZWJ1Z19fCisKKzIwMDEtMDctMTMgMDk6NTQgIGtiaworCisJKiBDbGFzc0Jyb3dzZXIucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjEyKSBtZXJnZSAtIHdoaXRlc3BhY2UKKwlub3JtYWxpemF0aW9uCisKKzIwMDEtMDctMTMgMDk6NDEgIGtiaworCisJKiBCcm93c2VyQ29udHJvbC5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuMSkgbWVyZ2UgLSBOZXcgRmlsZSAtCisJRm9yY2UgSEVBRCB0byB0cnVuayB3aXRoIC1mIE5vdGU6IGJyb3dzZXIucHkgd2FzIHJlbmFtZWQKKwlCcm93c2VyQ29udHJvbC5weSAxMCBNYXkgMjAwMC4gSXQgcHJvdmlkZXMgYSBjb2xsZWN0aW9uIG9mIGNsYXNzZXMKKwlhbmQgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIGNvbnRyb2wgZXh0ZXJuYWwgYnJvd3NlcnMgImZvciAxLjUuMgorCXN1cHBvcnQiLiBJdCB3YXMgcmVtb3ZlZCBmcm9tIHB5LWN2cyAxOCBBcHJpbCAyMDAxLgorCisyMDAxLTA3LTEzIDA5OjEwICBrYmsKKworCSogQ2FsbFRpcHMucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjgpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xMyAwODoyNiAga2JrCisKKwkqIENhbGxUaXBXaW5kb3cucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjMpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xMyAwODoxMyAga2JrCisKKwkqIEF1dG9FeHBhbmQucHk6IHB5LWN2cy1yZWwxXzIgKFJldiAxLjQpIG1lcmdlLCAiQWRkIEFsdC1zbGFzaCB0bworCVVuaXgga2V5ZGVmcyAoSSBzb21laG93IG5lZWQgaXQgb24gUkggNi4yKS4gIEdldCByaWQgb2YgYXNzaWdubWVudAorCXRvIHVudXNlZCBzZWxmLnRleHQud29yZGxpc3QuIgktLUd2UgorCisyMDAxLTA3LTEyIDE2OjU0ICBlbGd1YXZhcworCisJKiBSZXBsYWNlRGlhbG9nLnB5OiBweS1jdnMgbWVyZ2UsIHB5dGhvbiAxLjUuMiBjb21wYXRpYmlsaXR5CisKKzIwMDEtMDctMTIgMTY6NDYgIGVsZ3VhdmFzCisKKwkqIFNjcmlwdEJpbmRpbmcucHk6IHB5LWN2cyBtZXJnZSwgYmV0dGVyIGVycm9yIGRpYWxvZworCisyMDAxLTA3LTEyIDE2OjM4ICBlbGd1YXZhcworCisJKiBUT0RPLnR4dDogcHktY3ZzIG1lcmdlLCBhZGRpdGlvbnMKKworMjAwMS0wNy0xMiAxNTozNSAgZWxndWF2YXMKKworCSogV2luZG93TGlzdC5weTogcHktY3ZzIG1lcmdlLCBjb3JyZWN0IGluZGVudGF0aW9uCisKKzIwMDEtMDctMTIgMTU6MjQgIGVsZ3VhdmFzCisKKwkqIGNvbmZpZy50eHQ6IHB5LWN2cyBtZXJnZSwgY29ycmVjdCB0eXBvCisKKzIwMDEtMDctMTIgMTU6MjEgIGVsZ3VhdmFzCisKKwkqIGhlbHAudHh0OiBweS1jdnMgbWVyZ2UsIHVwZGF0ZSBjb2xvdXIgY2hhbmdpbmcgaW5mbworCisyMDAxLTA3LTEyIDE0OjUxICBlbGd1YXZhcworCisJKiBpZGxlLnB5OiBweS1jdnMgbWVyZ2UsIGlkbGVfZGlyIGxvYWRpbmcgY2hhbmdlZAorCisyMDAxLTA3LTEyIDE0OjQ0ICBlbGd1YXZhcworCisJKiBpZGxldmVyLnB5OiBweS1jdnMgbWVyZ2UsIHZlcnNpb24gdXBkYXRlCisKKzIwMDEtMDctMTEgMTI6NTMgIGtiaworCisJKiBCcm93c2VyQ29udHJvbC5weTogSW5pdGlhbCByZXZpc2lvbgorCisyMDAxLTA3LTExIDEyOjUzICBrYmsKKworCSogQXV0b0V4cGFuZC5weSwgQnJvd3NlckNvbnRyb2wucHksIENhbGxUaXBXaW5kb3cucHksIENhbGxUaXBzLnB5LAorCUNsYXNzQnJvd3Nlci5weSwgQ29sb3JEZWxlZ2F0b3IucHksIERlYnVnZ2VyLnB5LCBEZWxlZ2F0b3IucHksCisJRWRpdG9yV2luZG93LnB5LCBGaWxlTGlzdC5weSwgRm9ybWF0UGFyYWdyYXBoLnB5LCBJT0JpbmRpbmcucHksCisJSWRsZUNvbmYucHksIElkbGVIaXN0b3J5LnB5LCBNdWx0aVNjcm9sbGVkTGlzdHMucHksCisJTXVsdGlTdGF0dXNCYXIucHksIE9iamVjdEJyb3dzZXIucHksIE91dHB1dFdpbmRvdy5weSwKKwlQYXJlbk1hdGNoLnB5LCBQYXRoQnJvd3Nlci5weSwgUGVyY29sYXRvci5weSwgUHlQYXJzZS5weSwKKwlQeVNoZWxsLnB5LCBSZW1vdGVJbnRlcnAucHksIFJlcGxhY2VEaWFsb2cucHksIFNjcmlwdEJpbmRpbmcucHksCisJU2Nyb2xsZWRMaXN0LnB5LCBTZXBhcmF0b3IucHksIFN0YWNrVmlld2VyLnB5LCBUT0RPLnR4dCwKKwlUb29sVGlwLnB5LCBXaW5kb3dMaXN0LnB5LCBjb25maWcudHh0LCBoZWxwLnR4dCwgaWRsZSwgaWRsZS5iYXQsCisJaWRsZS5weSwgaWRsZXZlci5weSwgc2V0dXAucHksIEljb25zL21pbnVzbm9kZS5naWYsCisJSWNvbnMvcHl0aG9uLmdpZjogSW1wb3J0IHRoZSByZWxlYXNlIDIuMSB2ZXJzaW9uIG9mIFB5dGhvbiBDVlMgSURMRQorCW9uIHRoZSBleGlzdGluZyAxLjEuMyB2ZW5kb3IgYnJhbmNoIG5hbWVkIHB5LWN2cy12ZW5kb3ItYnJhbmNoLAorCXdpdGggcmVsZWFzZSB0YWcgcHktY3ZzLXJlbDJfMS4KKworMjAwMS0wNy0xMSAxMjozNCAga2JrCisKKwkqIEF1dG9FeHBhbmQucHksIEF1dG9JbmRlbnQucHksIEJpbmRpbmdzLnB5LCBDYWxsVGlwV2luZG93LnB5LAorCUNhbGxUaXBzLnB5LCBDaGFuZ2VMb2csIENsYXNzQnJvd3Nlci5weSwgQ29sb3JEZWxlZ2F0b3IucHksCisJRGVidWdnZXIucHksIERlbGVnYXRvci5weSwgRWRpdG9yV2luZG93LnB5LCBGaWxlTGlzdC5weSwKKwlGb3JtYXRQYXJhZ3JhcGgucHksIEZyYW1lVmlld2VyLnB5LCBHcmVwRGlhbG9nLnB5LCBJT0JpbmRpbmcucHksCisJSWRsZUNvbmYucHksIElkbGVIaXN0b3J5LnB5LCBNdWx0aVNjcm9sbGVkTGlzdHMucHksCisJTXVsdGlTdGF0dXNCYXIucHksIE5FV1MudHh0LCBPYmplY3RCcm93c2VyLnB5LCBPbGRTdGFja1ZpZXdlci5weSwKKwlPdXRwdXRXaW5kb3cucHksIFBhcmVuTWF0Y2gucHksIFBhdGhCcm93c2VyLnB5LCBQZXJjb2xhdG9yLnB5LAorCVB5UGFyc2UucHksIFB5U2hlbGwucHksIFJFQURNRS50eHQsIFJlbW90ZUludGVycC5weSwKKwlSZXBsYWNlRGlhbG9nLnB5LCBTY3JpcHRCaW5kaW5nLnB5LCBTY3JvbGxlZExpc3QucHksCisJU2VhcmNoQmluZGluZy5weSwgU2VhcmNoRGlhbG9nLnB5LCBTZWFyY2hEaWFsb2dCYXNlLnB5LAorCVNlYXJjaEVuZ2luZS5weSwgU2VwYXJhdG9yLnB5LCBTdGFja1ZpZXdlci5weSwgVE9ETy50eHQsCisJVG9vbFRpcC5weSwgVHJlZVdpZGdldC5weSwgVW5kb0RlbGVnYXRvci5weSwgV2lkZ2V0UmVkaXJlY3Rvci5weSwKKwlXaW5kb3dMaXN0LnB5LCBab29tSGVpZ2h0LnB5LCBfX2luaXRfXy5weSwgY29uZmlnLXVuaXgudHh0LAorCWNvbmZpZy13aW4udHh0LCBjb25maWcudHh0LCBldmVudHBhcnNlLnB5LCBleHRlbmQudHh0LCBoZWxwLnR4dCwKKwlpZGxlLmJhdCwgaWRsZS5weSwgaWRsZS5weXcsIGlkbGV2ZXIucHksIGtleWRlZnMucHksIHB5Y2xici5weSwKKwl0YWJuYW5ueS5weSwgdGVzdGNvZGUucHksIEljb25zL2ZvbGRlci5naWYsIEljb25zL21pbnVzbm9kZS5naWYsCisJSWNvbnMvb3BlbmZvbGRlci5naWYsIEljb25zL3BsdXNub2RlLmdpZiwgSWNvbnMvcHl0aG9uLmdpZiwKKwlJY29ucy90ay5naWY6IEltcG9ydCB0aGUgOSBNYXJjaCAyMDAwIHZlcnNpb24gb2YgUHl0aG9uIENWUyBJRExFIGFzCisJMS4xLjMgdmVuZG9yIGJyYW5jaCBuYW1lZCBweS1jdnMtdmVuZG9yLWJyYW5jaC4KKworMjAwMS0wNy0wNCAxMzo0MyAga2JrCisKKwkqIEljb25zLzogZm9sZGVyLmdpZiwgbWludXNub2RlLmdpZiwgb3BlbmZvbGRlci5naWYsIHBsdXNub2RlLmdpZiwKKwlweXRob24uZ2lmLCB0ay5naWY6IE51bGwgY29tbWl0IHdpdGggLWYgb3B0aW9uIHRvIGZvcmNlIGFuIHVwcmV2CisJYW5kIHB1dCBIRUFEcyBmaXJtbHkgb24gdGhlIHRydW5rLgorCisyMDAxLTA3LTA0IDEzOjE1ICBrYmsKKworCSogQXV0b0V4cGFuZC5weSwgQXV0b0luZGVudC5weSwgQmluZGluZ3MucHksIENhbGxUaXBXaW5kb3cucHksCisJQ2FsbFRpcHMucHksIENoYW5nZUxvZywgQ2xhc3NCcm93c2VyLnB5LCBDb2xvckRlbGVnYXRvci5weSwKKwlDb25maWdQYXJzZXIucHksIERlYnVnZ2VyLnB5LCBEZWxlZ2F0b3IucHksIEVkaXRvcldpbmRvdy5weSwKKwlFeGVjQmluZGluZy5weSwgRmlsZUxpc3QucHksIEZvcm1hdFBhcmFncmFwaC5weSwgRnJhbWVWaWV3ZXIucHksCisJR3JlcERpYWxvZy5weSwgSURMRUZPUksuaHRtbCwgSU9CaW5kaW5nLnB5LCBJZGxlQ29uZi5weSwKKwlJZGxlSGlzdG9yeS5weSwgTXVsdGlTY3JvbGxlZExpc3RzLnB5LCBNdWx0aVN0YXR1c0Jhci5weSwgTkVXUy50eHQsCisJT2JqZWN0QnJvd3Nlci5weSwgT2xkU3RhY2tWaWV3ZXIucHksIE91dHB1dFdpbmRvdy5weSwKKwlQYXJlbk1hdGNoLnB5LCBQYXRoQnJvd3Nlci5weSwgUGVyY29sYXRvci5weSwgUHlQYXJzZS5weSwKKwlQeVNoZWxsLnB5LCBSRUFETUUudHh0LCBSZW1vdGUucHksIFJlbW90ZUludGVycC5weSwKKwlSZXBsYWNlRGlhbG9nLnB5LCBTY3JpcHRCaW5kaW5nLnB5LCBTY3JvbGxlZExpc3QucHksCisJU2VhcmNoQmluZGluZy5weSwgU2VhcmNoRGlhbG9nLnB5LCBTZWFyY2hEaWFsb2dCYXNlLnB5LAorCVNlYXJjaEVuZ2luZS5weSwgU2VwYXJhdG9yLnB5LCBTdGFja1ZpZXdlci5weSwgVE9ETy50eHQsCisJVG9vbFRpcC5weSwgVHJlZVdpZGdldC5weSwgVW5kb0RlbGVnYXRvci5weSwgV2lkZ2V0UmVkaXJlY3Rvci5weSwKKwlXaW5kb3dMaXN0LnB5LCBab29tSGVpZ2h0LnB5LCBfX2luaXRfXy5weSwgY29uZmlnLXVuaXgudHh0LAorCWNvbmZpZy13aW4udHh0LCBjb25maWcudHh0LCBldmVudHBhcnNlLnB5LCBleHRlbmQudHh0LCBoZWxwLnR4dCwKKwlpZGxlLCBpZGxlLmJhdCwgaWRsZS5weSwgaWRsZS5weXcsIGlkbGV2ZXIucHksIGtleWRlZnMucHksCisJbG9hZGVyLnB5LCBwcm90b2NvbC5weSwgcHljbGJyLnB5LCBzZXR1cC5weSwgc3Bhd24ucHksIHRhYm5hbm55LnB5LAorCXRlc3Rjb2RlLnB5OiBOdWxsIGNvbW1pdCB3aXRoIC1mIG9wdGlvbiB0byBmb3JjZSBhbiB1cHJldiBhbmQgcHV0CisJSEVBRHMgZmlybWx5IG9uIHRoZSB0cnVuay4KKworMjAwMS0wNi0yNyAxMDoyNCAgZWxndWF2YXMKKworCSogSURMRUZPUksuaHRtbDogdXBkYXRlZCBjb250YWN0IGRldGFpbHMKKworMjAwMS0wNi0yNSAxNzoyMyAgZWxndWF2YXMKKworCSogaWRsZSwgUmVtb3RlSW50ZXJwLnB5LCBzZXR1cC5weTogSW5pdGlhbCByZXZpc2lvbgorCisyMDAxLTA2LTI1IDE3OjIzICBlbGd1YXZhcworCisJKiBpZGxlLCBSZW1vdGVJbnRlcnAucHksIHNldHVwLnB5OiBpbXBvcnQgY3VycmVudCBweXRob24gY3ZzIGlkbGUKKwlhcyBhIHZlbmRvciBicmFuY2gKKworMjAwMS0wNi0yNCAxNToxMCAgZWxndWF2YXMKKworCSogSURMRUZPUksuaHRtbDogdGlueSBjaGFuZ2UgdG8gdGVzdCBuZXcgc3luY21haWwgc2V0dXAKKworMjAwMS0wNi0yNCAxNDo0MSAgZWxndWF2YXMKKworCSogSURMRUZPUksuaHRtbDogY2hhbmdlIHRvIG5ldyBkZXZlbG9wZXIgY29udGFjdCwgYWxzbyBhIHRlc3QKKwljb21taXQgZm9yIG5ldyBzeW5jbWFpbCBzZXR1cAorCisyMDAxLTA2LTIzIDE4OjE1ICBlbGd1YXZhcworCisJKiBJRExFRk9SSy5odG1sOiB0aW55IHRlc3QgdXBkYXRlIGZvciByZXZpdGFsaXNlZCBpZGxlLWZvcmsKKworMjAwMC0wOS0yNCAxNzoyOSAgbnJpbGV5CisKKwkqIHByb3RvY29sLnB5OiBGaXhlcyBmb3IgUHl0aG9uIDEuNiBjb21wYXRpYmlsaXR5IC0gc29ja2V0IGJpbmQgYW5kCisJY29ubmVjdCBnZXQgYSB0dXBsZSBpbnN0ZWFkIHR3byBhcmd1bWVudHMuCisKKzIwMDAtMDktMjQgMTc6MjggIG5yaWxleQorCisJKiBzcGF3bi5weTogQ2hhbmdlIGZvciBQeXRob24gMS42IGNvbXBhdGliaWxpdHkgLSBVTklYJ3MgJ29zJworCW1vZHVsZSBkZWZpbmVzICdzcGF3bnYnIG5vdywgc28gd2UgY2hlY2sgZm9yICdmb3JrJyBmaXJzdC4KKworMjAwMC0wOC0xNSAyMjo1MSAgbm93b25kZXIKKworCSogSURMRUZPUksuaHRtbDogCisJY29ycmVjdGVkIGVtYWlsIGFkZHJlc3MKKworMjAwMC0wOC0xNSAyMjo0NyAgbm93b25kZXIKKworCSogSURMRUZPUksuaHRtbDogCisJYWRkZWQgLmh0bWwgZmlsZSBmb3IgaHR0cDovL2lkbGVmb3JrLnNvdXJjZWZvcmdlLm5ldAorCisyMDAwLTA4LTE1IDExOjEzICBkc2NoZXJlcgorCisJKiBBdXRvRXhwYW5kLnB5LCBBdXRvSW5kZW50LnB5LCBCaW5kaW5ncy5weSwgQ2FsbFRpcFdpbmRvdy5weSwKKwlDYWxsVGlwcy5weSwgX19pbml0X18ucHksIENoYW5nZUxvZywgQ2xhc3NCcm93c2VyLnB5LAorCUNvbG9yRGVsZWdhdG9yLnB5LCBDb25maWdQYXJzZXIucHksIERlYnVnZ2VyLnB5LCBEZWxlZ2F0b3IucHksCisJRmlsZUxpc3QucHksIEZvcm1hdFBhcmFncmFwaC5weSwgRnJhbWVWaWV3ZXIucHksIEdyZXBEaWFsb2cucHksCisJSU9CaW5kaW5nLnB5LCBJZGxlQ29uZi5weSwgSWRsZUhpc3RvcnkucHksIE11bHRpU2Nyb2xsZWRMaXN0cy5weSwKKwlNdWx0aVN0YXR1c0Jhci5weSwgTkVXUy50eHQsIE9iamVjdEJyb3dzZXIucHksIE9sZFN0YWNrVmlld2VyLnB5LAorCU91dHB1dFdpbmRvdy5weSwgUGFyZW5NYXRjaC5weSwgUGF0aEJyb3dzZXIucHksIFBlcmNvbGF0b3IucHksCisJUHlQYXJzZS5weSwgUHlTaGVsbC5weSwgUkVBRE1FLnR4dCwgUmVwbGFjZURpYWxvZy5weSwKKwlTY3JpcHRCaW5kaW5nLnB5LCBTY3JvbGxlZExpc3QucHksIFNlYXJjaEJpbmRpbmcucHksCisJU2VhcmNoRGlhbG9nLnB5LCBTZWFyY2hEaWFsb2dCYXNlLnB5LCBTZWFyY2hFbmdpbmUucHksCisJU2VwYXJhdG9yLnB5LCBTdGFja1ZpZXdlci5weSwgVE9ETy50eHQsIFRvb2xUaXAucHksIFRyZWVXaWRnZXQucHksCisJVW5kb0RlbGVnYXRvci5weSwgV2lkZ2V0UmVkaXJlY3Rvci5weSwgV2luZG93TGlzdC5weSwgaGVscC50eHQsCisJWm9vbUhlaWdodC5weSwgY29uZmlnLXVuaXgudHh0LCBjb25maWctd2luLnR4dCwgY29uZmlnLnR4dCwKKwlldmVudHBhcnNlLnB5LCBleHRlbmQudHh0LCBpZGxlLmJhdCwgaWRsZS5weSwgaWRsZS5weXcsIGlkbGV2ZXIucHksCisJa2V5ZGVmcy5weSwgbG9hZGVyLnB5LCBweWNsYnIucHksIHRhYm5hbm55LnB5LCB0ZXN0Y29kZS5weSwKKwlFZGl0b3JXaW5kb3cucHksIEV4ZWNCaW5kaW5nLnB5LCBSZW1vdGUucHksIHByb3RvY29sLnB5LCBzcGF3bi5weSwKKwlJY29ucy9mb2xkZXIuZ2lmLCBJY29ucy9taW51c25vZGUuZ2lmLCBJY29ucy9vcGVuZm9sZGVyLmdpZiwKKwlJY29ucy9wbHVzbm9kZS5naWYsIEljb25zL3B5dGhvbi5naWYsIEljb25zL3RrLmdpZjogSW5pdGlhbAorCXJldmlzaW9uCisKKzIwMDAtMDgtMTUgMTE6MTMgIGRzY2hlcmVyCisKKwkqIEF1dG9FeHBhbmQucHksIEF1dG9JbmRlbnQucHksIEJpbmRpbmdzLnB5LCBDYWxsVGlwV2luZG93LnB5LAorCUNhbGxUaXBzLnB5LCBfX2luaXRfXy5weSwgQ2hhbmdlTG9nLCBDbGFzc0Jyb3dzZXIucHksCisJQ29sb3JEZWxlZ2F0b3IucHksIENvbmZpZ1BhcnNlci5weSwgRGVidWdnZXIucHksIERlbGVnYXRvci5weSwKKwlGaWxlTGlzdC5weSwgRm9ybWF0UGFyYWdyYXBoLnB5LCBGcmFtZVZpZXdlci5weSwgR3JlcERpYWxvZy5weSwKKwlJT0JpbmRpbmcucHksIElkbGVDb25mLnB5LCBJZGxlSGlzdG9yeS5weSwgTXVsdGlTY3JvbGxlZExpc3RzLnB5LAorCU11bHRpU3RhdHVzQmFyLnB5LCBORVdTLnR4dCwgT2JqZWN0QnJvd3Nlci5weSwgT2xkU3RhY2tWaWV3ZXIucHksCisJT3V0cHV0V2luZG93LnB5LCBQYXJlbk1hdGNoLnB5LCBQYXRoQnJvd3Nlci5weSwgUGVyY29sYXRvci5weSwKKwlQeVBhcnNlLnB5LCBQeVNoZWxsLnB5LCBSRUFETUUudHh0LCBSZXBsYWNlRGlhbG9nLnB5LAorCVNjcmlwdEJpbmRpbmcucHksIFNjcm9sbGVkTGlzdC5weSwgU2VhcmNoQmluZGluZy5weSwKKwlTZWFyY2hEaWFsb2cucHksIFNlYXJjaERpYWxvZ0Jhc2UucHksIFNlYXJjaEVuZ2luZS5weSwKKwlTZXBhcmF0b3IucHksIFN0YWNrVmlld2VyLnB5LCBUT0RPLnR4dCwgVG9vbFRpcC5weSwgVHJlZVdpZGdldC5weSwKKwlVbmRvRGVsZWdhdG9yLnB5LCBXaWRnZXRSZWRpcmVjdG9yLnB5LCBXaW5kb3dMaXN0LnB5LCBoZWxwLnR4dCwKKwlab29tSGVpZ2h0LnB5LCBjb25maWctdW5peC50eHQsIGNvbmZpZy13aW4udHh0LCBjb25maWcudHh0LAorCWV2ZW50cGFyc2UucHksIGV4dGVuZC50eHQsIGlkbGUuYmF0LCBpZGxlLnB5LCBpZGxlLnB5dywgaWRsZXZlci5weSwKKwlrZXlkZWZzLnB5LCBsb2FkZXIucHksIHB5Y2xici5weSwgdGFibmFubnkucHksIHRlc3Rjb2RlLnB5LAorCUVkaXRvcldpbmRvdy5weSwgRXhlY0JpbmRpbmcucHksIFJlbW90ZS5weSwgcHJvdG9jb2wucHksIHNwYXduLnB5LAorCUljb25zL2ZvbGRlci5naWYsIEljb25zL21pbnVzbm9kZS5naWYsIEljb25zL29wZW5mb2xkZXIuZ2lmLAorCUljb25zL3BsdXNub2RlLmdpZiwgSWNvbnMvcHl0aG9uLmdpZiwgSWNvbnMvdGsuZ2lmOiBNb2RpZmllZCBJRExFCisJZnJvbSBWUHl0aG9uIDAuMgorCisKK29yaWdpbmFsIElETEUgQ2hhbmdlTG9nOgorPT09PT09PT09PT09PT09PT09PT09PT09CisKK1R1ZSBGZWIgMTUgMTg6MDg6MTkgMjAwMCAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBORVdTLnR4dDogTm90aWNlIHN0YXR1cyBiYXIgYW5kIHN0YWNrIHZpZXdlci4KKworCSogRWRpdG9yV2luZG93LnB5OiBTdXBwb3J0IGZvciBNb3NoZSdzIHN0YXR1cyBiYXIuCisKKwkqIE11bHRpU3RhdHVzQmFyLnB5OiBTdGF0dXMgYmFyIGNvZGUgLS0gYnkgTW9zaGUgWmFka2EuCisKKwkqIE9sZFN0YWNrVmlld2VyLnB5OgorCUFkZGluZyB0aGUgb2xkIHN0YWNrIHZpZXdlciBpbXBsZW1lbnRhdGlvbiBiYWNrLCBmb3IgdGhlIGRlYnVnZ2VyLgorCisJKiBTdGFja1ZpZXdlci5weTogTmV3IHN0YWNrIHZpZXdlciwgdXNlcyBhIHRyZWUgd2lkZ2V0LgorCShYWFg6IHRoZSBkZWJ1Z2dlciBkb2Vzbid0IHlldCB1c2UgdGhpcy4pCisKKwkqIFdpbmRvd0xpc3QucHk6CisJQ29ycmVjdCBhIHR5cG8gYW5kIHJlbW92ZSBhbiB1bnF1YWxpZmllZCBleGNlcHQgdGhhdCB3YXMgaGlkaW5nIHRoZSBlcnJvci4KKworCSogQ2xhc3NCcm93c2VyLnB5OiBBZGQgYW4gWFhYIGNvbW1lbnQgYWJvdXQgdGhlIENsYXNzQnJvd3NlciBBSVAuCisKKwkqIENoYW5nZUxvZzogVXBkYXRlZCBjaGFuZ2UgbG9nLgorCisJKiBORVdTLnR4dDogTmV3cyB1cGRhdGUuICBQcm9iYWJseSBpbmNvbXBsZXRlOyB3aGF0IGVsc2UgaXMgbmV3PworCisJKiBSRUFETUUudHh0OgorCVVwZGF0ZWQgZm9yIHBlbmRpbmcgSURMRSAwLjUgcmVsZWFzZSAoc3RpbGwgdmVyeSByb3VnaCAtLSBqdXN0IGdldHRpbmcKKwlpdCBvdXQgaW4gYSBtb3JlIGNvbnZlbmllbnQgZm9ybWF0IHRoYW4gQ1ZTKS4KKworCSogVE9ETy50eHQ6IFRpbnkgYWRkaXRpb24uCisKK1RodSBTZXAgIDkgMTQ6MTY6MDIgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBUT0RPLnR4dDogQSBmZXcgbmV3IFRPRE8gZW50cmllcy4KKworVGh1IEF1ZyAyNiAyMzowNjoyMiAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIEJpbmRpbmdzLnB5OiBBZGQgUHl0aG9uIERvY3VtZW50YXRpb24gZW50cnkgdG8gSGVscCBtZW51LgorCisJKiBFZGl0b3JXaW5kb3cucHk6CisJRmluZCB0aGUgaGVscC50eHQgZmlsZSByZWxhdGl2ZSB0byBfX2ZpbGVfXyBvciAiLiIsIG5vdCBpbiBzeXMucGF0aC4KKwkoU3VnZ2VzdGVkIGJ5IE1vc2hlIFphZGthLCBidXQgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkuKQorCisJQWRkIDw8cHl0aG9uLWRvY3M+PiBldmVudCB3aGljaCwgb24gVW5peCwgYnJpbmdzIHVwIE5ldHNjYXBlIHBvaW50aW5nCisJdG8gaHR0cDovL3d3dy5weXRob24uZG9jL2N1cnJlbnQvIChhIGxvY2FsIGNvcHkgd291bGQgYmUgbmljZSBidXQgaXRzCisJbG9jYXRpb24gY2FuJ3QgYmUgcHJlZGljdGVkKS4gIFdpbmRvd3Mgc29sdXRpb24gVEJELgorCitXZWQgQXVnIDExIDE0OjU1OjQzIDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogVHJlZVdpZGdldC5weToKKwlNb3NoZSBub3RpY2VkIGFuIGluY29uc2lzdGVuY3kgaW4gaGlzIGNvbW1lbnQsIHNvIEknbSByZXBocmFzaW5nIGl0IHRvCisJYmUgY2xlYXJlci4KKworCSogVHJlZVdpZGdldC5weToKKwlQYXRjaCBpbnNwaXJlZCBieSBNb3NoZSBaYWRrYSB0byBzZWFyY2ggZm9yIHRoZSBJY29ucyBkaXJlY3RvcnkgaW4gdGhlCisJc2FtZSBkaXJlY3RvcnkgYXMgX19maWxlX18sIHJhdGhlciB0aGFuIHNlYXJjaGluZyBmb3IgaXQgYWxvbmcgc3lzLnBhdGguCisJVGhpcyB3b3JrcyBiZXR0ZXIgd2hlbiBpZGxlIGlzIGEgcGFja2FnZS4KKworVGh1IEp1bCAxNSAxMzoxMTowMiAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFRPRE8udHh0OiBOZXcgd2lzaGVzLgorCitTYXQgSnVsIDEwIDEzOjE3OjM1IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogSWRsZVByZWZzLnB5OgorCU1ha2UgdGhlIGNvbG9yIGZvciBzdGRlcnIgcmVkIChpLmUuIHRoZSBzdGFuZGFyZCB3YXJuaW5nL2Rhbmdlci9zdG9wCisJY29sb3IpIHJhdGhlciB0aGFuIGdyZWVuLiAgU3VnZ2VzdGVkIGJ5IFNhbSBTY2h1bGVuYnVyZy4KKworRnJpIEp1biAyNSAxNzoyNjozNCAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFB5U2hlbGwucHk6IENsb3NlIGRlYnVnZ2VyIHdoZW4gY2xvc2luZy4gIFRoaXMgbWF5IGJyZWFrIGEgY3ljbGUuCisKKwkqIERlYnVnZ2VyLnB5OiBCcmVhayBjeWNsZSBvbiBjbG9zZS4KKworCSogQ2xhc3NCcm93c2VyLnB5OiBEZXN0cm95IHRoZSB0cmVlIHdoZW4gY2xvc2luZy4KKworCSogVHJlZVdpZGdldC5weTogQWRkIGRlc3Ryb3koKSBtZXRob2QgdG8gcmVjdXJzaXZlbHkgZGVzdHJveSBhIHRyZWUuCisKKwkqIFB5U2hlbGwucHk6IEV4dGVuZCBfY2xvc2UoKSB0byBicmVhayBjeWNsZXMuCisJQnJlYWsgc29tZSBvdGhlciBjeWNsZXMgdG9vIChhbmQgZGVzdHJveSB0aGUgcm9vdCB3aGVuIGRvbmUpLgorCisJKiBFZGl0b3JXaW5kb3cucHk6CisJQWRkIF9jbG9zZSgpIG1ldGhvZCB0aGF0IGRvZXMgdGhlIGFjdHVhbCBjbGVhbnVwIChjbG9zZSgpIGFza3MgdGhlCisJdXNlciB3aGF0IHRoZXkgd2FudCBmaXJzdCBpZiB0aGVyZSdzIHVuc2F2ZWQgc3R1ZmYsIGFuZCBtYXkgY2FuY2VsKS4KKwlJdCBjbG9zZXMgbW9yZSB0aGFuIGJlZm9yZS4KKworCUFkZCB1bmxvYWRfZXh0ZW5zaW9ucygpIG1ldGhvZCB0byB1bmxvYWQgYWxsIGV4dGVuc2lvbnM7IGNhbGxlZCBmcm9tCisJX2Nsb3NlKCkuICBJdCBjYWxscyBhbiBleHRlbnNpb24ncyBjbG9zZSgpIG1ldGhvZCBpZiBpdCBoYXMgb25lLgorCisJKiBQZXJjb2xhdG9yLnB5OiBBZGQgY2xvc2UoKSBtZXRob2QgdGhhdCBicmVha3MgY3ljbGVzLgorCisJKiBXaWRnZXRSZWRpcmVjdG9yLnB5OiBBZGQgdW5yZWdpc3RlcigpIG1ldGhvZC4KKwlVbnJlZ2lzdGVyIGV2ZXJ5dGhpbmcgYXQgY2xvc2luZy4KKwlEb24ndCBjYWxsIGNsb3NlKCkgaW4gX19kZWxfXywgcmVseSBvbiBleHBsaWNpdCBjYWxsIHRvIGNsb3NlKCkuCisKKwkqIElPQmluZGluZy5weSwgRm9ybWF0UGFyYWdyYXBoLnB5LCBDYWxsVGlwcy5weToKKwlBZGQgY2xvc2UoKSBtZXRob2QgdGhhdCBicmVha3MgYSBjeWNsZS4KKworRnJpIEp1biAxMSAxNTowMzowMCAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIEF1dG9JbmRlbnQucHksIEVkaXRvcldpbmRvdy5weSwgRm9ybWF0UGFyYWdyYXBoLnB5OgorCVRpbSBQZXRlcnMgc21hcnQucGF0Y2g6CisKKwlFZGl0b3JXaW5kb3cucHk6CisKKwkrIEFkZGVkIGdldF90YWJ3aWR0aCAmIHNldF90YWJ3aWR0aCAidmlydHVhbCB0ZXh0IiBtZXRob2RzLCB0aGF0IGdldC9zZXQgdGhlCisJd2lkZ2V0J3MgdmlldyBvZiB3aGF0IGEgdGFiIG1lYW5zLgorCisJKyBNb3ZlZCBUS19UQUJXSURUSF9ERUZBVUxUIGhlcmUgZnJvbSBBdXRvSW5kZW50LgorCisJKyBSZW5hbWVkIE1hcmsncyBnZXRfc2VsZWN0aW9uX2luZGV4IHRvIGdldF9zZWxlY3Rpb25faW5kaWNlcyAoc29ycnksIE1hcmssCisJYnV0IHRoZSBuYW1lIHdhcyBwbGFpbiB3cm9uZyA8d2luaz4pLgorCisJRm9ybWF0UGFyYWdyYXBoLnB5OiAgcmVuYW1lZCB1c2Ugb2YgZ2V0X3NlbGVjdGlvbl9pbmRleC4KKworCUF1dG9JbmRlbnQucHk6CisKKwkrIE1vdmVkIFRLX1RBQldJRFRIX0RFRkFVTFQgdG8gRWRpdG9yV2luZG93LgorCisJKyBSZXdyb3RlIHNldF9pbmRlbnRhdGlvbl9wYXJhbXMgdG8gdXNlIG5ldyBWVFcgZ2V0L3NldF90YWJ3aWR0aCBtZXRob2RzLgorCisJKyBDaGFuZ2VkIHNtYXJ0X2JhY2tzcGFjZV9ldmVudCB0byBkZWxldGUgd2hpdGVzcGFjZSBiYWNrIHRvIGNsb3Nlc3QKKwlwcmVjZWRpbmcgdmlydHVhbCB0YWIgc3RvcCBvciByZWFsIGNoYXJhY3RlciAobm90ZSB0aGF0IHRoaXMgbWF5IHJlcXVpcmUKKwlpbnNlcnRpbmcgY2hhcmFjdGVycyBpZiBiYWNrc3BhY2luZyBvdmVyIGEgdGFiISkuCisKKwkrIE51a2VkIGFsbW9zdCByZWZlcmVuY2VzIHRvIHRoZSBzZWxlY3Rpb24gdGFnLCBpbiBmYXZvciBvZiB1c2luZworCWdldF9zZWxlY3Rpb25faW5kaWNlcy4gIFRoZSBzb2xlIGV4Y2VwdGlvbiBpcyBpbiBzZXRfcmVnaW9uLCBmb3Igd2hpY2ggbm8KKwkic2V0X3NlbGVjdGlvbiIgYWJzdHJhY3Rpb24gaGFzIHlldCBiZWVuIGFncmVlZCB1cG9uLgorCisJKyBIYWQgdG9vIG11Y2ggZnVuIHVzaW5nIHRoZSBzcGlmZnkgbmV3IGZlYXR1cmVzIG9mIHRoZSBmb3JtYXQtcGFyYWdyYXBoCisJY21kLgorCitUaHUgSnVuIDEwIDE3OjQ4OjAyIDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogRm9ybWF0UGFyYWdyYXBoLnB5OgorCUNvZGUgYnkgTWFyayBIYW1tb25kIHRvIGZvcm1hdCBwYXJhZ3JhcGhzIGVtYmVkZGVkIGluIGNvbW1lbnRzLgorCVJlYWQgdGhlIGNvbW1lbnRzICh3aGljaCBJIHJlZm9ybWF0dGVkIHVzaW5nIHRoZSBuZXcgZmVhdHVyZSA6LSkKKwlmb3Igc29tZSBsaW1pdGF0aW9ucy4KKworCSogRWRpdG9yV2luZG93LnB5OgorCUFkZGVkIGFic3RyYWN0aW9uIGdldF9zZWxlY3Rpb25faW5kZXgoKSAoTWFyayBIYW1tb25kKS4gIEFsc28KKwlyZWZvcm1hdHRlZCBzb21lIGNvbW1lbnQgYmxvY2tzIHRvIHNob3cgb2ZmIGEgY29vbCBmZWF0dXJlIEknbSBhYm91dAorCXRvIGNoZWNrIGluIG5leHQuCisKKwkqIENsYXNzQnJvd3Nlci5weToKKwlBZGFwdCB0byB0aGUgbmV3IHB5Y2xicidzIHN1cHBvcnQgb2YgbGlzdGluZyB0b3AtbGV2ZWwgZnVuY3Rpb25zLiAgSWYKKwl0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IHByZXNlbnQgKGUuZy4gd2hlbiB1c2VkIHdpdGggYSB2aW50YWdlCisJUHl0aG9uIDEuNS4yIGluc3RhbGxhdGlvbikgdG9wLWxldmVsIGZ1bmN0aW9ucyBhcmUgbm90IGxpc3RlZC4KKworCShIbW0uLi4gIEFueSBkaXN0cmlidXRpb24gb2YgSURMRSAwLjUgc2hvdWxkIHByb2JhYmx5IGluY2x1ZGUgYSBjb3B5CisJb2YgdGhlIG5ldyBweWNsYnIucHkhKQorCisJKiBBdXRvSW5kZW50LnB5OgorCUZpeCBvZmYtYnktb25lIGVycm9yIGluIFRpbSdzIHJlY2VudCBjaGFuZ2UgdG8gY29tbWVudF9yZWdpb24oKTogdGhlCisJbGlzdCBvZiBsaW5lcyByZXR1cm5lZCBieSBnZXRfcmVnaW9uKCkgY29udGFpbnMgYW4gZW1wdHkgbGluZSBhdCB0aGUKKwllbmQgcmVwcmVzZW50aW5nIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lLCBhbmQgdGhpcyBzaG91bGRuJ3QgYmUKKwljb21tZW50ZWQgb3V0IQorCisJKiBDYWxsVGlwcy5weToKKwlNYXJrIEhhbW1vbmQgd3JpdGVzOiBIZXJlIGlzIGFub3RoZXIgY2hhbmdlIHRoYXQgYWxsb3dzIGl0IHRvIHdvcmsgZm9yCisJY2xhc3MgY3JlYXRpb24gLSB0cmllcyB0byBsb2NhdGUgYW4gX19pbml0X18gZnVuY3Rpb24uICBBbHNvIHVwZGF0ZWQKKwl0aGUgdGVzdCBjb2RlIHRvIHJlZmxlY3QgeW91ciBuZXcgIioqKiIgY2hhbmdlLgorCisJKiBDYWxsVGlwV2luZG93LnB5OgorCU1hcmsgSGFtbW9uZCB3cml0ZXM6IFRpbSdzIHN1Z2dlc3Rpb24gb2YgY29weWluZyB0aGUgZm9udCBmb3IgdGhlCisJQ2FsbFRpcFdpbmRvdyBmcm9tIHRoZSB0ZXh0IGNvbnRyb2wgbWFrZXMgc2Vuc2UsIGFuZCBhY3R1YWxseSBtYWtlcworCXRoZSBjb250cm9sIGxvb2sgYmV0dGVyIElNTy4KKworV2VkIEp1biAgOSAyMDozNDo1NyAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIENhbGxUaXBzLnB5OgorCUFwcGVuZCAiLi4uIiBpZiB0aGUgYXBwcm9wcmlhdGUgZmxhZyAoZm9yIHZhcmFyZ3MpIGluIGNvX2ZsYWdzIGlzIHNldC4KKwlEaXR0byAiKioqIiBmb3Iga3dhcmdzLgorCitUdWUgSnVuICA4IDEzOjA2OjA3IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogUmVwbGFjZURpYWxvZy5weToKKwlIbW0uLi4gIFRpbSBkaWRuJ3QgdHVybiAicmVwbGFjZSBhbGwiIGludG8gYSBzaW5nbGUgdW5kbyBibG9jay4KKwlJIHRoaW5rIEkgbGlrZSBpdCBiZXR0ZXIgaWYgaXQgb3MsIHNvIGhlcmUuCisKKwkqIFJlcGxhY2VEaWFsb2cucHk6IFRpbSBQZXRlcnM6IG1hZGUgcmVwbGFjZW1lbnQgYXRvbWljIGZvciB1bmRvL3JlZG8uCisKKwkqIEF1dG9JbmRlbnQucHk6IFRpbSBQZXRlcnM6CisKKwkrIFNldCB1c2V0YWJzPTEuICBFZGl0aW5nIHB5Y2xici5weSB3YXMgZHJpdmluZyBtZSBudXRzIDwwLjYgd2luaz4uCisJdXNldGFicz0xIGlzIHRoZSBFbWFjcyBweW1vZGUgZGVmYXVsdCB0b28sIGFuZCB0aGFua3MgdG8gaW5kZW50d2lkdGggIT0KKwl0YWJ3aWR0aCBtYWdpY2FsIHVzZXRhYnMgZGlzYWJsaW5nLCBuZXcgZmlsZXMgYXJlIHN0aWxsIGNyZWF0ZWQgd2l0aCB0YWJzCisJdHVybmVkIG9mZi4gIFRoZSBvbmx5IGltcGxpY2F0aW9uIGlzIHRoYXQgaWYgeW91IG9wZW4gYSBmaWxlIHdob3NlIGZpcnN0CisJaW5kZW50IGlzIGEgc2luZ2xlIHRhYiwgSURMRSB3aWxsIG5vdyBtYWdpY2FsbHkgdXNlIHRhYnMgZm9yIHRoYXQgZmlsZSAoYW5kCisJc2V0IGluZGVudHdpZHRoIHRvIDgpLiAgTm90ZSB0aGF0IHRoZSB3aG9sZSBzY2hlbWUgZG9lc24ndCB3b3JrIHJpZ2h0IGZvcgorCVB5dGhvbldpbiwgdGhvdWdoLCBzaW5jZSBXaW5kb3dzIHVzZXJzIHR5cGljYWxseSBzZXQgdGFid2lkdGggdG8gNDsgTWFyaworCXByb2JhYmx5IGhhcyB0byBoaWRlIHRoZSBJRExFIGFsZ29yaXRobSBmcm9tIHRoZW0gKHdoaWNoIGhlIGFscmVhZHkga25vd3MpLgorCisJKyBDaGFuZ2VkIGNvbW1lbnRfcmVnaW9uX2V2ZW50IHRvIHN0aWNrICIjIyIgaW4gZnJvbnQgb2YgZXZlcnkgbGluZS4gIFRoZQorCSJob2xlcyIgcHJldmlvdXNseSBsZWZ0IG9uIGJsYW5rIGxpbmVzIHdlcmUgdmlzdWFsbHkgY29uZnVzaW5nIChtYWRlIGl0CisJbmVlZGxlc3NseSBoYXJkIHRvIGZpZ3VyZSBvdXQgd2hhdCB0byB1bmNvbW1lbnQgbGF0ZXIpLgorCitNb24gSnVuICA3IDE1OjM4OjQwIDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogVHJlZVdpZGdldC5weSwgT2JqZWN0QnJvd3Nlci5weToKKwlSZW1vdmUgdW5uZWNlc3NhcnkgcmVmZXJlbmNlIHRvIHB5Y2xiciBmcm9tIHRlc3QoKSBjb2RlLgorCisJKiBQeVBhcnNlLnB5OiBUaW0gUGV0ZXJzOgorCisJU21hcnRlciBsb2dpYyBmb3IgZmluZGluZyBhIHBhcnNlIHN5bmNoIHBvaW50LgorCisJRG9lcyBhIGhhbGYgdG8gYSBmaWZ0aCB0aGUgd29yayBpbiBub3JtYWwgY2FzZXM7IGRvbid0IG5vdGljZSB0aGUgc3BlZWR1cCwKKwlidXQgbWFrZXMgIG1vcmUgYnJlYXRoaW5nIHJvb20gZm9yIG90aGVyIGV4dGVuc2lvbnMuCisKKwlTcGVlZHMgdGVycmlibGUgY2FzZXMgYnkgYXQgbGVhc3QgYSBmYWN0b3Igb2YgMTAuICJUZXJyaWJsZSIgPT0gZS5nLiB5b3UgcHV0CisJIiIiIGF0IHRoZSBzdGFydCBvZiBUa2ludGVyLnB5LCB1bmRvIGl0LCB6b29tIHRvIHRoZSBib3R0b20sIGFuZCBzdGFydAorCXR5cGluZyBpbiBjb2RlLiAgVXNlZCB0byB0YWtlIGFib3V0IDggc2Vjb25kcyBmb3IgRU5URVIgdG8gcmVzcG9uZCwgbm93IHNvbWUKKwlsYXJnZSBmcmFjdGlvbiBvZiBhIHNlY29uZC4gIFRoZSBuZXcgY29kZSBnZXRzIGluZGVudGVkIGNvcnJlY3RseSwgZGVzcGl0ZQorCXRoYXQgaXQgYWxsIHJlbWFpbnMgInN0cmluZyBjb2xvcmVkIiB1bnRpbCB0aGUgY29sb3JpemVyIGNhdGNoZXMgdXAgKGFmdGVyCisJd2hpY2gsIEVOVEVSIGFwcGVhcnMgaW5zdGFudGFuZW91cyBhZ2FpbikuCisKK0ZyaSBKdW4gIDQgMTk6MjE6MTkgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBleHRlbmQucHk6IE1pZ2h0IGFzIHdlbGwgZW5hYmxlIENhbGxUaXBzIGJ5IGRlZmF1bHQuCisJSWYgdGhlcmUgYXJlIHRvbyBtYW55IGNvbXBsYWludHMgSSdsbCByZW1vdmUgaXQgYWdhaW4gb3IgZml4IGl0LgorCitUaHUgSnVuICAzIDE0OjMyOjE2IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQXV0b0luZGVudC5weSwgRWRpdG9yV2luZG93LnB5LCBQeVBhcnNlLnB5OgorCU5ldyBvZmZlcmluZ3MgYnkgVGltIFBldGVyczsgaGUgd3JpdGVzOgorCisJSURMRSBpcyBub3cgdGhlIGZpcnN0IFB5dGhvbiBlZGl0b3IgaW4gdGhlIFVuaXZlcnNlIG5vdCBjb25mdXNlZCBieSBteQorCWRvY3Rlc3QucHkgPHdpbms+LgorCisJQXMgdGhyZWF0ZW5lZCwgdGhpcyBkZWZpbmVzIElETEUncyBpc19jaGFyX2luX3N0cmluZyBmdW5jdGlvbiBhcyBhCisJbWV0aG9kIG9mIEVkaXRvcldpbmRvdy4gIFlvdSBqdXN0IG5lZWQgdG8gZGVmaW5lIG9uZSBzaW1pbGFybHkgaW4KKwl3aGF0ZXZlciBpdCBpcyB5b3UgcGFzcyBhcyBlZGl0d2luIHRvIEF1dG9JbmRlbnQ7IGxvb2tpbmcgYXQgdGhlCisJRWRpdG9yV2luZG93LnB5IHBhcnQgb2YgdGhlIHBhdGNoIHNob3VsZCBtYWtlIHRoaXMgY2xlYXIuCisKKwkqIEdyZXBEaWFsb2cucHk6IEVuY2xvc2UgcGF0dGVybiBpbiBxdW90ZXMgaW4gc3RhdHVzIG1lc3NhZ2UuCisKKwkqIENhbGxUaXBzLnB5OgorCU1hcmsgSGFtbW9uZCBmaXhlZCBzb21lIGNvbW1lbnRzIGFuZCBpbXByb3ZlZCB0aGUgd2F5IHRoZSB0aXAgdGV4dCBpcworCWNvbnN0cnVjdGVkLgorCitXZWQgSnVuICAyIDE4OjE4OjU3IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQ2FsbFRpcHMucHk6CisJTXkgZml4IHRvIE1hcmsncyBjb2RlOiByZXN0b3JlIHRoZSB1bml2ZXJzYWwgY2hlY2sgb24gPEtleVJlbGVhc2U+LgorCUFsd2F5cyBjYW5jZWwgb24gPEtleS1Fc2NhcGU+IG9yIDxCdXR0b25QcmVzcz4uCisKKwkqIENhbGxUaXBzLnB5OgorCUEgdmVyc2lvbiB0aGF0IE1hcmsgSGFtbW9uZCBwb3N0ZWQgdG8gdGhlIG5ld3Nncm91cC4gIEhhcyBzb21lIG5ld2VyCisJc3R1ZmYgZm9yIGdldHRpbmcgdGhlIHRpcC4gIEhhZCB0byBmaXggdGhlIEtleS0oIGFuZCBLZXktKSBldmVudHMKKwlmb3IgVW5peC4gIFdpbGwgaGF2ZSB0byByZS1hcHBseSBteSBwYXRjaCBmb3IgY2F0Y2hpbmcgS2V5UmVsZWFzZSBhbmQKKwlCdXR0b25SZWxlYXNlIGV2ZW50cy4KKworCSogQ2FsbFRpcFdpbmRvdy5weSwgQ2FsbFRpcHMucHk6CisJQ2FsbCB0aXBzIGJ5IE1hcmsgSGFtbW9uZCAocGx1cyB0aW55IGZpeCBieSBtZS4pCisKKwkqIElkbGVIaXN0b3J5LnB5OgorCUNoYW5nZXMgYnkgTWFyayBIYW1tb25kOiAoMSkgc3VwcG9ydCBvcHRpb25hbCBvdXRwdXRfc2VwIGFyZ3VtZW50IHRvCisJdGhlIGNvbnN0cnVjdG9yIHNvIGhlIGNhbiBlbGltaW5hdGUgdGhlIHN5cy5wczIgdGhhdCBQeXRob25XaW4gbGVhdmVzCisJaW4gdGhlIHNvdXJjZTsgKDIpIHJlbW92ZSBkdXBsaWNhdGUgaGlzdG9yeSBpdGVtcy4KKworCSogQXV0b0luZGVudC5weToKKwlDaGFuZ2VzIGJ5IE1hcmsgSGFtbW9uZCB0byBhbGxvdyB1c2luZyBJRExFIGV4dGVuc2lvbnMgaW4gUHl0aG9uV2luIGFzCisJd2VsbDogbWFrZSB0aHJlZSBkaWFsb2cgcm91dGluZXMgaW5zdGFuY2UgdmFyaWFibGVzLgorCisJKiBFZGl0b3JXaW5kb3cucHk6CisJQ2hhbmdlIGJ5IE1hcmsgSGFtbW9uZCB0byBhbGxvdyB1c2luZyBJRExFIGV4dGVuc2lvbnMgaW4gUHl0aG9uV2luIGFzCisJd2VsbDogbWFrZSB0aHJlZSBkaWFsb2cgcm91dGluZXMgaW5zdGFuY2UgdmFyaWFibGVzLgorCitUdWUgSnVuICAxIDIwOjA2OjQ0IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQXV0b0luZGVudC5weTogSGFoISAgQSBmaXggb2YgbXkgb3duIHRvIFRpbSdzIGNvZGUhCisJVW5peCBiaW5kaW5ncyBmb3IgPDx0b2dnbGUtdGFicz4+IGFuZCA8PGNoYW5nZS1pbmRlbnR3aWR0aD4+IHdlcmUKKwltaXNzaW5nLCBhbmQgc29tZWhvdyB0aGF0IG1lYW50IHRoZSBldmVudHMgd2VyZSBuZXZlciBnZW5lcmF0ZWQsCisJZXZlbiB0aG91Z2ggdGhleSB3ZXJlIGluIHRoZSBtZW51LiAgVGhlIG5ldyBVbml4IGJpbmRpbmdzIGFyZSBub3cKKwl0aGUgc2FtZSBhcyB0aGUgV2luZG93cyBiaW5kaW5ncyAoTS10IGFuZCBNLXUpLgorCisJKiBBdXRvSW5kZW50LnB5LCBQeVBhcnNlLnB5LCBQeVNoZWxsLnB5OiBUaW0gUGV0ZXJzIGFnYWluOgorCisJVGhlIG5ldyB2ZXJzaW9uIChhdHRhY2hlZCkgaXMgZmFzdCBlbm91Z2ggYWxsIHRoZSB0aW1lIGluIGV2ZXJ5IHJlYWwgbW9kdWxlCisJSSBoYXZlIDx3aGV3IT4uICBZb3UgY2FuIG1ha2UgaXQgc2xvdyBieSwgZS5nLiwgY3JlYXRpbmcgYW4gb3BlbiBsaXN0IHdpdGgKKwk1LDAwMCA5MC1jaGFyYWN0ZXIgaWRlbnRpZmllcnMgKCsgdHJhaWxpbmcgY29tbWEpIGVhY2ggb24gaXRzIG93biBsaW5lLCB0aGVuCisJYWRkaW5nIGFuIGl0ZW0gdG8gdGhlIGVuZCAtLSBidXQgdGhhdCBzdGlsbCBjb25zdW1lcyBsZXNzIHRoYW4gYSBzZWNvbmQgb24KKwlteSBQNS0xNjYuICBSZXNwb25zZSB0aW1lIGluIHJlYWwgY29kZSBhcHBlYXJzIGluc3RhbnRhbmVvdXMuCisKKwlGaXhlZCBzb21lIGJ1Z3MuCisKKwlOZXcgZmVhdHVyZTogIHdoZW4gaGl0dGluZyBFTlRFUiBhbmQgdGhlIGN1cnNvciBpcyBiZXlvbmQgdGhlIGxpbmUncyBsZWFkaW5nCisJaW5kZW50YXRpb24sIHdoaXRlc3BhY2UgaXMgcmVtb3ZlZCBvbiBib3RoIHNpZGVzIG9mIHRoZSBjdXJzb3I7IGJlZm9yZQorCXdoaXRlc3BhY2Ugd2FzIHJlbW92ZWQgb25seSBvbiB0aGUgbGVmdDsgZS5nLiwgYXNzdW1pbmcgdGhlIGN1cnNvciBpcworCWJldHdlZW4gdGhlIGNvbW1hIGFuZCB0aGUgc3BhY2U6CisKKwlkZWYgc29tZXRoaW5nKGFyZzEsIGFyZzIpOgorCSAgICAgICAgICAgICAgICAgICBeIGN1cnNvciB0byB0aGUgbGVmdCBvZiBoZXJlLCBhbmQgaGl0IEVOVEVSCisJICAgICAgICAgICAgICAgYXJnMik6ICAgIyBuZXcgbGluZSB1c2VkIHRvIGVuZCB1cCBoZXJlCisJICAgICAgICAgICAgICBhcmcyKTogICAgIyBidXQgbm93IGxpbmVzIHVwIHRoZSB3YXkgeW91IGV4cGVjdAorCisJTmV3IGhhY2s6ICBBdXRvSW5kZW50IGhhcyBncm93biBhIGNvbnRleHRfdXNlX3BzMSBCb29sZWFuIGNvbmZpZyBvcHRpb24sCisJZGVmYXVsdGluZyB0byAwIChmYWxzZSkgYW5kIHNldCB0byAxIChvbmx5KSBieSBQeVNoZWxsLiAgUmVhc29uOiAgaGFuZGxpbmcKKwl0aGUgZmFuY3kgc3R1ZmYgcmVxdWlyZXMgbG9va2luZyBiYWNrd2FyZCBmb3IgYSBwYXJzaW5nIHN5bmNoIHBvaW50OyBwczEKKwlsaW5lcyBhcmUgdGhlIG9ubHkgc2Vuc2libGUgdGhpbmcgdG8gbG9vayBmb3IgaW4gYSBzaGVsbCB3aW5kb3csIGJ1dCBhcmUgYQorCWJhZCB0aGluZyB0byBsb29rIGZvciBpbiBhIGZpbGUgd2luZG93IChwczEgbGluZXMgc2hvdyB1cCBpbiBteSBtb2R1bGUKKwlkb2NzdHJpbmdzIG9mdGVuKS4gIFB5dGhvbldpbidzIHNoZWxsIHNob3VsZCBzZXQgdGhpcyB0cnVlIHRvby4KKworCVBlcnNpc3RlbnQgcHJvYmxlbTogIHN0cmluZ3MgY29udGFpbmluZyBkZWYvY2xhc3MgY2FuIHN0aWxsIHNjcmV3IHRoaW5ncyB1cAorCWNvbXBsZXRlbHkuICBObyBpbXByb3ZlbWVudC4gIFNpbXBsZXN0IHdvcmthcm91bmQgaXMgb24gdGhlIHVzZXIncyBoZWFkLCBhbmQKKwljb25zaXN0cyBvZiBpbnNlcnRpbmcgZS5nLgorCisJZGVmIF8oKTogcGFzcworCisJKG9yIGFueSBvdGhlciBkZWYvY2xhc3MpIGFmdGVyIHRoZSBlbmQgb2YgdGhlIG11bHRpbGluZSBzdHJpbmcgdGhhdCdzCisJc2NyZXdpbmcgdGhlbSB1cC4gIFRoaXMgaXMgZXNwZWNpYWxseSBpcmtzb21lIGJlY2F1c2UgSURMRSdzIHN5bnRheCBjb2xvcmluZworCWlzICpub3QqIGNvbmZ1c2VkLCBzbyB3aGVuIHRoaXMgaGFwcGVucyB0aGUgY29sb3JzIGRvbid0IG1hdGNoIHRoZQorCWluZGVudGF0aW9uIGJlaGF2aW9yIHRoZXkgc2VlLgorCisJKiBBdXRvSW5kZW50LnB5OiBUaW0gUGV0ZXJzIGFnYWluOgorCisJW1RpbSwgYWZ0ZXIgYWRkaW5nIHNvbWUgYnJhY2tldCBzbWFydHMgdG8gQXV0b0luZGVudC5weV0KKwk+IC4uLgorCT4gV2hhdCBpdCBjYW4ndCBwb3NzaWJseSBkbyB3aXRob3V0IHJlcGFyc2luZyBsYXJnZSBnb2JzIG9mIHRleHQgaXMKKwk+IHN1Z2dlc3QgYSByZWFzb25hYmxlIGluZGVudCBsZXZlbCBhZnRlciB5b3UndmUgKmNsb3NlZCogYSBicmFja2V0CisJPiBsZWZ0IG9wZW4gb24gc29tZSBwcmV2aW91cyBsaW5lLgorCT4gLi4uCisKKwlUaGUgYXR0YWNoZWQgY2FuLCBhbmQgYWN0dWFsbHkgZmFzdCBlbm91Z2ggdG8gdXNlIC0tIG1vc3Qgb2YgdGhlIHRpbWUuICBUaGUKKwljb2RlIGlzIHRyaWNreSBiZXlvbmQgYmVsaWVmIHRvIGFjaGlldmUgdGhhdCwgYnV0IGl0IHdvcmtzIHNvIGZhcjsgZS5nLiwKKworCSAgICAgICAgcmV0dXJuIGxlbihzdHJpbmcuZXhwYW5kdGFicyhzdHJbc2VsZi5zdG10X3N0YXJ0IDoKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gaW5kZW50cyB0byBjYXJldAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaV0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gaW5kZW50cyB0byBjYXJldAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhYndpZHRoKSkgKyAxCisJICAgIF4gaW5kZW50cyB0byBjYXJldAorCisJSXQncyBhYm91dCBhcyBzbWFydCBhcyBweW1vZGUgbm93LCB3cnQgYm90aCBicmFja2V0IGFuZCBiYWNrc2xhc2gKKwljb250aW51YXRpb24gcnVsZXMuICBJdCBkb2VzIHJlcXVpcmUgcmVwYXJzaW5nIGxhcmdlIGdvYnMgb2YgdGV4dCwgYW5kIGlmIGl0CisJaGFwcGVucyB0byBmaW5kIHNvbWV0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSAiZGVmIiBvciAiY2xhc3MiIG9yIHN5cy5wczEKKwlidXJpZWQgaW4gYSBtdWx0aWxpbmUgc3RyaW5nLCBidXQgZGlkbid0IHN1Y2sgdXAgZW5vdWdoIHByZWNlZGluZyB0ZXh0IHRvCisJc2VlIHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLCBpdCdzIGNvbXBsZXRlbHkgaG9zZWQuICBJIGNhbid0IHJlcGFpciB0aGF0IC0tCisJaXQncyBqdXN0IHRvbyBzbG93IHRvIHJlcGFyc2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgYWxsIHRoZSB0aW1lLgorCisJQXV0b0luZGVudCBoYXMgZ3Jvd24gYSBuZXcgbnVtX2NvbnRleHRfbGluZXMgdHVwbGUgYXR0cmlidXRlIHRoYXQgY29udHJvbHMKKwlob3cgZmFyIHRvIGxvb2sgYmFjaywgYW5kLS0gbGlrZSBvdGhlciBwYXJhbXMgLS10aGlzIGNvdWxkL3Nob3VsZCBiZSBtYWRlCisJdXNlci1vdmVycmlkYWJsZSBhdCBzdGFydHVwIGFuZCBwZXItZmlsZSBvbiB0aGUgZmx5LgorCisJKiBQeVBhcnNlLnB5OiBOZXcgZmlsZSBieSBUaW0gUGV0ZXJzOgorCisJT25lIG5ldyBmaWxlIGluIHRoZSBhdHRhY2hlZCwgUHlQYXJzZS5weS4gIFRoZSBMaW5lU3R1ZGllciAod2hhdGV2ZXIgaXQgd2FzCisJY2FsbGVkIDx3aW5rPikgY2xhc3Mgd2FzIHJlbW92ZWQgZnJvbSBBdXRvSW5kZW50OyBQeVBhcnNlIHN1YnN1bWVzIGl0cworCWZ1bmN0aW9uYWxpdHkuCisKKwkqIEF1dG9JbmRlbnQucHk6IFRpbSBQZXRlcnMga2VlcHMgcmV2aXNpbmcgdGhpcyBtb2R1bGUgKG1vcmUgdG8gY29tZSk6CisKKwlSZW1vdmVkICJOZXcgdGFid2lkdGgiIG1lbnUgYmluZGluZy4KKworCUFkZGVkICJhIHRhYiBtZWFucyBob3cgbWFueSBzcGFjZXM/IiBkaWFsb2cgdG8gYmxvY2sgdGFiaWZ5IGFuZCB1bnRhYmlmeS4gIEkKKwl0aGluayBwcm9tcHRpbmcgZm9yIHRoaXMgaXMgZ29vZCBub3c6ICB0aGV5J3JlIHVzdWFsbHkgYXQtbW9zdC1vbmNlLXBlci1maWxlCisJY29tbWFuZHMsIGFuZCBJRExFIGNhbid0IGxldCB0aGVtIGNoYW5nZSB0YWJ3aWR0aCBmcm9tIHRoZSBUayBkZWZhdWx0CisJYW55bW9yZSwgc28gSURMRSBjYW4gbm8gbG9uZ2VyIHByZXN1bWUgdG8gaGF2ZSBhbnkgaWRlYSB3aGF0IGEgdGFiIG1lYW5zLgorCisJSXJvbnk6ICBmb3IgdGhlIHB1cnBvc2Ugb2Yga2VlcGluZyBjb21tZW50cyBhbGlnbmVkIHZpYSB0YWJzLCBUaydzCisJbm9uLWRlZmF1bHQgYXBwcm9hY2ggaXMgbXVjaCBuaWNlciB0aGFuIHRoZSBFbWFjcy9Ob3RlcGFkL0NvZGV3cmlnaHQvdmkvZXRjCisJYXBwcm9hY2guCisKKwkqIEVkaXRvcldpbmRvdy5weToKKwkxLiBDYXRjaCBOYW1lRXJyb3Igb24gaW1wb3J0IChjb3VsZCBiZSByYWlzZWQgYnkgY2FzZSBtaXNtYXRjaCBvbiBXaW5kb3dzKS4KKwkyLiBObyBsb25nZXIgbmVlZCB0byByZXNldCBweWNsYnIgY2FjaGUgYW5kIHNob3cgd2F0Y2ggY3Vyc29yIHdoZW4gY2FsbGluZworCSAgIENsYXNzQnJvd3NlciAtLSB0aGUgQ2xhc3NCcm93c2VyIHRha2VzIGNhcmUgb2YgcHljbGJyIGFuZCB0aGUgVHJlZVdpZGdldAorCSAgIHRha2VzIGNhcmUgb2YgdGhlIHdhdGNoIGN1cnNvci4KKwkzLiBSZXNldCB0aGUgZm9jdXMgdG8gdGhlIGN1cnJlbnQgd2luZG93IGFmdGVyIGVycm9yIG1lc3NhZ2UgYWJvdXQgY2xhc3MKKwkgICBicm93c2VyIG9uIGJ1ZmZlciB3aXRob3V0IGZpbGVuYW1lLgorCisJKiBJY29ucy9taW51c25vZGUuZ2lmLCBJY29ucy9wbHVzbm9kZS5naWY6IE1pc3NlZCBhIGZldy4KKworCSogQ2xhc3NCcm93c2VyLnB5LCBQYXRoQnJvd3Nlci5weTogUmV3cml0dGVuIGJhc2VkIG9uIFRyZWVXaWRnZXQucHkKKworCSogT2JqZWN0QnJvd3Nlci5weTogT2JqZWN0IGJyb3dzZXIsIGJhc2VkIG9uIFRyZWVXaWRnZXQucHkuCisKKwkqIFRyZWVXaWRnZXQucHk6IFRyZWUgd2lkZ2V0IGRvbmUgcmlnaHQuCisKKwkqIFRvb2xUaXAucHk6IEFzIHlldCB1bnVzZWQgY29kZSBmb3IgdG9vbCB0aXBzLgorCisJKiBTY3JpcHRCaW5kaW5nLnB5OgorCUVuc3VyZSBzeXMuYXJndlswXSBpcyB0aGUgc2NyaXB0IG5hbWUgb24gUnVuIFNjcmlwdC4KKworCSogWm9vbUhlaWdodC5weTogTW92ZSB6b29tIGhlaWdodCBmdW5jdGlvbmFsaXR5IHRvIHNlcGFyYXRlIGZ1bmN0aW9uLgorCisJKiBJY29ucy9mb2xkZXIuZ2lmLCBJY29ucy9vcGVuZm9sZGVyLmdpZiwgSWNvbnMvcHl0aG9uLmdpZiwgSWNvbnMvdGsuZ2lmOgorCUEgZmV3IGljb25zIHVzZWQgYnkgLi4vVHJlZVdpZGdldC5weSBhbmQgaXRzIGNhbGxlcnMuCisKKwkqIEF1dG9JbmRlbnQucHk6IE5ldyB2ZXJzaW9uIGJ5IFRpbSBQZXRlcnMgaW1wcm92ZXMgYmxvY2sgb3BlbmluZyB0ZXN0LgorCitGcmkgTWF5IDIxIDA0OjQ2OjE3IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQXR0aWMvSGlzdG9yeS5weSwgUHlTaGVsbC5weTogUmVuYW1lIEhpc3RvcnkgdG8gSWRsZUhpc3RvcnkuCisJQWRkIGlzYXR0eSgpIHRvIHBzZXVkbyBmaWxlcy4KKworCSogU3RhY2tWaWV3ZXIucHk6IE1ha2UgaW5pdGlhbCBzdGFjayB2aWV3ZXIgd2lkZXIKKworCSogVE9ETy50eHQ6IE5ldyB3aXNoZXMKKworCSogQXV0b0luZGVudC5weSwgRWRpdG9yV2luZG93LnB5LCBQeVNoZWxsLnB5OgorCU11Y2ggaW1wcm92ZWQgYXV0b2luZGVudCBhbmQgaGFuZGxpbmcgb2YgdGFicywKKwlieSBUaW0gUGV0ZXJzLgorCitNb24gTWF5ICAzIDE1OjQ5OjUyIDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQXV0b0luZGVudC5weSwgRWRpdG9yV2luZG93LnB5LCBGb3JtYXRQYXJhZ3JhcGgucHksIFVuZG9EZWxlZ2F0b3IucHk6CisJVGltIFBldGVycyB3cml0ZXM6CisKKwlJJ20gc3RpbGwgdW5zdXJlLCBidXQgY291bGRuJ3Qgc3RhbmQgdGhlIHZpcnR1YWwgZXZlbnQgdHJpY2tlcnkgc28gdHJpZWQgYQorCWRpZmZlcmVudCBzaW4gKGFkZGluZyB1bmRvX2Jsb2NrX3N0YXJ0L3N0b3AgbWV0aG9kcyB0byB0aGUgVGV4dCBpbnN0YW5jZSBpbgorCUVkaXRvcldpbmRvdy5weSkuICBMaWtlIGl0IG9yIG5vdCwgaXQncyBlZmZpY2llbnQgYW5kIHdvcmtzIDx3aW5rPi4gIEJldHRlcgorCWlkZWE/CisKKwlHaXZlIHRoZSBhdHRhY2hlZCBhIHdoaXJsLiAgRXZlbiBpZiB5b3UgaGF0ZSB0aGUgaW1wbGVtZW50YXRpb24sIEkgdGhpbmsKKwl5b3UnbGwgbGlrZSB0aGUgcmVzdWx0cy4gIFRoaW5rIEkgY2F1Z2h0IGFsbCB0aGUgImJsb2NrIGVkaXQiIGNtZHMsCisJaW5jbHVkaW5nIEZvcm1hdCBQYXJhZ3JhcGgsIHBsdXMgc3VidGxlciBvbmVzIGludm9sdmluZyBzbWFydCBpbmRlbnRzIGFuZAorCWJhY2tzcGFjaW5nLgorCisJKiBXaWRnZXRSZWRpcmVjdG9yLnB5OiBUaW0gUGV0ZXJzIHdyaXRlczoKKworCVtXXWhpbGUgdHJ5aW5nIHRvIGRvcGUgb3V0IGhvdyByZWRpcmVjdGlvbiB3b3Jrcywgc3R1bWJsZWQgaW50byB0d28KKwlwb3NzaWJsZSBnbGl0Y2hlcy4gIEluIHRoZSBmaXJzdCwgaXQgZG9lc24ndCBhcHBlYXIgdG8gbWFrZSBzZW5zZSB0byB0cnkgdG8KKwlyZW5hbWUgYSBjb21tYW5kIHRoYXQncyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkOyBpbiB0aGUgc2Vjb25kLCB0aGUgbmFtZQorCSJwcmV2aW91cyIgZG9lc24ndCByZWFsbHkgYnJpbmcgdG8gbWluZCAiaWdub3JlIHRoZSBwcmV2aW91cyB2YWx1ZSIgPHdpbms+LgorCitGcmkgQXByIDMwIDE5OjM5OjI1IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogX19pbml0X18ucHk6IFN1cHBvcnQgZm9yIHVzaW5nIGlkbGUgYXMgYSBwYWNrYWdlLgorCisJKiBQYXRoQnJvd3Nlci5weToKKwlBdm9pZCBsaXN0aW5nIGZpbGVzIG1vcmUgdGhhbiBvbmNlIChlLmcuIGZvb21vZHVsZS5zbyBoYXMgdHdvIGhpdHM6CisJb25jZSBmb3IgZm9vICsgbW9kdWxlLnNvLCBvbmNlIGZvciBmb29tb2R1bGUgKyAuc28pLgorCitNb24gQXByIDI2IDIyOjIwOjM4IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQ2hhbmdlTG9nLCBDb2xvckRlbGVnYXRvci5weSwgUHlTaGVsbC5weTogVGltIFBldGVycyBzdHJpa2VzIGFnYWluOgorCisJSG8gaG8gaG8gLS0gdGhhdCdzIHRyaWNraWVyIHRoYW4gaXQgc291bmRlZCEgIFRoZSBjb2xvcml6ZXIgaXMgd29ya2luZyB3aXRoCisJImxpbmUuY29sIiBzdHJpbmdzIGluc3RlYWQgb2YgVGV4dCBtYXJrcywgYW5kIHRoZSBhYnNvbHV0ZSBjb29yZGluYXRlcyBvZgorCXRoZSBwb2ludCBvZiBpbnRlcmVzdCBjYW4gY2hhbmdlIGFjcm9zcyB0aGUgc2VsZi51cGRhdGUgY2FsbCAodm9pY2Ugb2YKKwliYWZmbGVkIGV4cGVyaWVuY2UsIHdoZW4gdHdvIHF1aWNrIGJhY2tzcGFjZXMgbm8gbG9uZ2VyIGZvb2xlZCBpdCwgYnV0IGEKKwliYWNrc3BhY2UgZm9sbG93ZWQgYnkgYSBxdWljayBFTlRFUiBkaWQgPHdpbms+KS4KKworCUFueXdheSwgdGhlIGF0dGFjaGVkIGFwcGVhcnMgdG8gZG8gdGhlIHRyaWNrLiAgQ1BVIHVzYWdlIGdvZXMgd2F5IHVwIHdoZW4KKwl0eXBpbmcgcXVpY2tseSBpbnRvIGEgbG9uZyB0cmlwbGUtcXVvdGVkIHN0cmluZywgYnV0IHRoZSBsYXRlbmN5IGlzIGZpbmUgZm9yCisJbWUgKGEgcmVsYXRpdmVseSBmYXN0IHR5cGlzdCBvbiBhIHJlbGF0aXZlbHkgc2xvdyBtYWNoaW5lKS4gIE1vc3Qgb2YgdGhlCisJY2hhbmdlcyBoZXJlIGFyZSBsZWZ0IG92ZXIgZnJvbSByZWR1Y2luZyB0aGUgIyBvZiB2cmJsIG5hbWVzIHRvIGhlbHAgbWUKKwlyZWFzb24gYWJvdXQgdGhlIGxvZ2ljIGJldHRlcjsgSSBob3BlIHRoZSBjb2RlIGlzIGEgKmxpdHRsZSogZWFzaWVyIHRvCisKK0ZyaSBBcHIgMjMgMTQ6MDE6MjUgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBFZGl0b3JXaW5kb3cucHk6CisJUHJvdmlkZSBmdWxsIGFyZ3VtZW50cyB0byBfX2ltcG9ydF9fIHNvIGl0IHdvcmtzIGluIHBhY2thZ2l6ZWQgSURMRS4KKworVGh1IEFwciAyMiAyMzoyMDoxNyAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKyAgICAgICAgKiBoZWxwLnR4dDoKKyAgICAgICAgQnVuY2ggb2YgdXBkYXRlcyBuZWNlc3NhcnkgZHVlIHRvIHJlY2VudCBjaGFuZ2VzOyBhZGRlZCBkb2NzIGZvciBGaWxlCisgICAgICAgIG1lbnUsIGNvbW1hbmQgbGluZSBhbmQgY29sb3IgcHJlZmVyZW5jZXMuCisKKyAgICAgICAgKiBCaW5kaW5ncy5weTogUmVtb3ZlIG9ic29sZXRlICdzY3JpcHQnIG1lbnUuCisKKwkqIFRPRE8udHh0OiBTZXZlcmFsIHdpc2hlcyBmdWxmaWxsZWQuCisKKwkqIE91dHB1dFdpbmRvdy5weToKKwlNb3ZlZCBjbGFzc2VzIE9uRGVtYW5kT3V0cHV0V2luZG93IGFuZCBQc2V1ZG9GaWxlIGhlcmUsCisJZnJvbSBTY3JpcHRCaW5kaW5nLnB5IHdoZXJlIHRoZXkgYXJlIG5vIGxvbmdlciBuZWVkZWQuCisKKwkqIFNjcmlwdEJpbmRpbmcucHk6CisJTW9zdGx5IHJld3JpdHRlbi4gIEluc3RlYWQgb2YgdGhlIG9sZCBSdW4gbW9kdWxlIGFuZCBEZWJ1ZyBtb2R1bGUsCisJdGhlcmUgYXJlIHR3byBuZXcgY29tbWFuZHM6CisKKwlJbXBvcnQgbW9kdWxlIChGNSkgaW1wb3J0cyBvciByZWxvYWRzIHRoZSBtb2R1bGUgYW5kIGFsc28gYWRkcyBpdHMKKwluYW1lIHRvIHRoZSBfX21haW5fXyBuYW1lc3BhY2UuICBUaGlzIGdldHMgZXhlY3V0ZWQgaW4gdGhlIFB5U2hlbGwKKwl3aW5kb3cgdW5kZXIgY29udHJvbCBvZiBpdHMgZGVidWcgc2V0dGluZ3MuCisKKwlSdW4gc2NyaXB0IChDb250cm9sLUY1KSBpcyBzaW1pbGFyIGJ1dCBleGVjdXRlcyB0aGUgY29udGVudHMgb2YgdGhlCisJZmlsZSBkaXJlY3RseSBpbiB0aGUgX19tYWluX18gbmFtZXNwYWNlLgorCisJKiBQeVNoZWxsLnB5OiBOaXRzOiBkb2N1bWVudCB1c2Ugb2YgJElETEVTVEFSVFVQOyBkaXNwbGF5IGlkbGUgdmVyc2lvbgorCisJKiBpZGxldmVyLnB5OiBOZXcgdmVyc2lvbiB0byBjZWxlYnJhdGUgbmV3IGNvbW1hbmQgbGluZQorCisJKiBPdXRwdXRXaW5kb3cucHk6IEFkZGVkIGZsdXNoKCksIGZvciBjb21wbGV0ZW5lc3MuCisKKwkqIFB5U2hlbGwucHk6CisJQSBsb3Qgb2YgY2hhbmdlcyB0byBtYWtlIHRoZSBjb21tYW5kIGxpbmUgbW9yZSB1c2VmdWwuICBZb3UgY2FuIG5vdyBkbzoKKwkgIGlkbGUucHkgLWUgZmlsZSAuLi4gICAgLS0gdG8gZWRpdCBmaWxlcworCSAgaWRsZS5weSBzY3JpcHQgYXJnIC4uLiAtLSB0byBydW4gYSBzY3JpcHQKKwkgIGlkbGUucHkgLWMgY21kIGFyZyAuLi4gLS0gdG8gcnVuIGEgY29tbWFuZAorCU90aGVyIG9wdGlvbnMsIHNlZSBhbHNvIHRoZSB1c2FnZSBtZXNzYWdlIChhbHNvIG5ldyEpIGZvciBtb3JlIGRldGFpbHM6CisJICAtZCAgICAgICAtLSBlbmFibGUgZGVidWdnZXIKKwkgIC1zICAgICAgIC0tIHJ1biAkSURMRVNUQVJUVVAgb3IgJFBZVEhPTlNUQVJUVVAKKwkgIC10IHRpdGxlIC0tIHNldCBQeXRob24gU2hlbGwgd2luZG93J3MgdGl0bGUKKwlzeXMuYXJndiBpcyBzZXQgYWNjb3JkaW5nbHksIHVubGVzcyAtZSBpcyB1c2VkLgorCXN5cy5wYXRoIGlzIGFic29sdXRpemVkLCBhbmQgYWxsIHJlbGV2YW50IHBhdGhzIGFyZSBpbnNlcnRlZCBpbnRvIGl0LgorCisJT3RoZXIgY2hhbmdlczoKKwktIHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCBjb21tYW5kcyBhcmUgZXhlY3V0ZWQgaXMgbm93IHRoZQorCSAgX19tYWluX18gbW9kdWxlCisJLSBleHBsaWNpdGx5IHNhdmUgc3lzLnN0ZG91dCBldGMuLCBkb24ndCByZXN0b3JlIGZyb20gc3lzLl9fc3Rkb3V0X18KKwktIG5ldyBpbnRlcnByZXRlciBtZXRob2RzIGV4ZWNzb3VyY2UoKSwgZXhlY2ZpbGUoKSwgc3R1ZmZzb3VyY2UoKQorCS0gYSBmZXcgc21hbGwgbml0cworCisJKiBUT0RPLnR4dDoKKwlTb21lIG1vcmUgVE9ETyBpdGVtcy4gIE1hZGUgdXAgbXkgbWluZCBhYm91dCBjb21tYW5kIGxpbmUgYXJncywKKwlSdW4vSW1wb3J0LCBfX21haW5fXy4KKworCSogQ29sb3JEZWxlZ2F0b3IucHk6CisJU3VwZXItZWxlZ2FudCBwYXRjaCBieSBUaW0gUGV0ZXJzIHRoYXQgc3BlZWRzIHVwIGNvbG9yaXphdGlvbgorCWRyYW1hdGljYWxseSAodXAgdG8gMTUgdGltZXMgaGUgY2xhaW1zKS4gIFdvcmtzIGJ5IHJlYWRpbmcgbW9yZSB0aGFuCisJb25lIGxpbmUgYXQgYSB0aW1lLCB1cCB0byAxMDAtbGluZSBjaHVua3MgKHN0YXJ0aW5nIHdpdGggb25lIGxpbmUgYW5kCisJdGhlbiBkb3VibGluZyB1cCB0byB0aGUgbGltaXQpLiAgT24gYSB0eXBpY2FsIG1hY2hpbmUgKGUuZy4gVGltJ3MKKwlQNS0xNjYpIHRoaXMgZG9lc24ndCByZWR1Y2UgaW50ZXJhY3RpdmUgcmVzcG9uc2l2ZW5lc3MgaW4gYSBub3RpY2VhYmxlCisJd2F5LgorCitXZWQgQXByIDIxIDE1OjQ5OjM0IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQ29sb3JEZWxlZ2F0b3IucHk6CisJUGF0Y2ggYnkgVGltIFBldGVycyB0byBzcGVlZCB1cCBjb2xvcml6aW5nIG9mIGJpZyBtdWx0aWxpbmUgc3RyaW5ncy4KKworVHVlIEFwciAyMCAxNzozMjo1MiAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIGV4dGVuZC50eHQ6CisJRm9yIGFuIGV2ZW50ICdmb28tYmFyJywgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG11c3QgYmUgY2FsbGVkCisJZm9vX2Jhcl9ldmVudCgpLiAgVGhlcmVmb3JlLCBmaXggdGhlIHJlZmVyZW5jZXMgdG8gem9vbV9oZWlnaHQoKSBpbgorCXRoZSBleGFtcGxlLgorCisJKiBJZGxlUHJlZnMucHk6IFJlc3RvcmVkIHRoZSBvcmlnaW5hbCBJRExFIGNvbG9yIHNjaGVtZS4KKworCSogUHlTaGVsbC5weSwgSWRsZVByZWZzLnB5LCBDb2xvckRlbGVnYXRvci5weSwgRWRpdG9yV2luZG93LnB5OgorCUNvbG9yIHByZWZlcmVuY2VzIGNvZGUgYnkgTG9yZW4gTHVrZSAobWFzc2FnZWQgYnkgbWUgc29tZXdoYXQpCisKKwkqIFNlYXJjaEVuZ2luZS5weToKKwlQYXRjaCBieSBNYXJrIEZhdmFzOiBpdCBmaXhlcyB0aGUgc2VhcmNoIGVuZ2luZSBiZWhhdmlvdXIgd2hlcmUgYW4KKwl1bnN1Y2Nlc3NmdWwgc2VhcmNoIHdyYXBzIGFyb3VuZCBhbmQgcmUtc2VhcmNoZXMgdGhhdCBwYXJ0IG9mIHRoZSBmaWxlCisJYmV0d2VlbiB0aGUgc3RhcnQgb2YgdGhlIHNlYXJjaCBhbmQgdGhlIGVuZCBvZiB0aGUgZmlsZSAtIG9ubHkgcmVhbGx5CisJYW4gaXNzdWUgZm9yIHZlcnkgbGFyZ2UgZmlsZXMsIGJ1dC4uLiAoYWxzbyByZW1vdmVzIGEgcmVkdW5kYW50CisJbS5zcGFuKCkgY2FsbCkuCisKK01vbiBBcHIgMTkgMTY6MjY6MDIgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBUT0RPLnR4dDogQSBmZXcgd2lzaGVzIGFyZSBub3cgZnVsZmlsbGVkLgorCisJKiBBdXRvSW5kZW50LnB5OiBUaW0gUGV0ZXJzIGltcGxlbWVudHMgc29tZSBvZiBteSB3aXNoZXM6CisKKwlvIE1ha2VzIHRoZSB0YWIga2V5IGludGVsbGlnZW50bHkgaW5zZXJ0IHNwYWNlcyB3aGVuIGFwcHJvcHJpYXRlCisJKHNlZSBIZWxwIGxpc3QgYmFudGVyIHR3aXh0IERhdmlkIEFzY2hlciBhbmQgbWU7IGlkZWEgc3RvbGVuIGZyb20KKwlldmVyeSBvdGhlciBlZGl0b3Igb24gZWFydGggPHdpbms+KS4KKworCW8gbmV3bGluZV9hbmRfaW5kZW50X2V2ZW50IHRyaW1zIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb24gdGhlIG9sZAorCWxpbmUgKHB5bW9kZSBhbmQgQ29kZXdyaWdodCkuCisKKwlvIG5ld2xpbmVfYW5kX2luZGVudF9ldmVudCBubyBsb25nZXIgZm9vbGVkIGJ5IHRyYWlsaW5nIHdoaXRlc3BhY2Ugb3IKKwljb21tZW50IGFmdGVyICI6IiAocHltb2RlLCBQVFVJKS4KKworCW8gbmV3bGluZV9hbmRfaW5kZW50X2V2ZW50IG5vdyByZWR1Y2VzIHRoZSBuZXcgbGluZSdzIGluZGVudGF0aW9uIGFmdGVyCisJcmV0dXJuLCBicmVhaywgY29udGludWUsIHJhaXNlIGFuZCBwYXNzIHN0bXRzIChweW1vZGUpLgorCisJVGhlIGxhc3QgdHdvIGFyZSBlYXN5IHRvIGZvb2wgaW4gdGhlIHByZXNlbmNlIG9mIHN0cmluZ3MgJgorCWNvbnRpbnVhdGlvbnMsIGJ1dCBweW1vZGUgcmVxdWlyZXMgRW1hY3MncyBoaWdoLXBvd2VyZWQgQyBwYXJzaW5nCisJZnVuY3Rpb25zIHRvIGF2b2lkIHRoYXQgaW4gZmluaXRlIHRpbWUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlQeXRob24gcmVsZWFzZSAxLjUuMmMxLCBJRExFIHZlcnNpb24gMC40Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlZCBBcHIgIDcgMTg6NDE6NTkgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBSRUFETUUudHh0LCBORVdTLnR4dDogTmV3IHZlcnNpb24uCisKKwkqIGlkbGV2ZXIucHk6IFZlcnNpb24gYnVtcCBhd2FpdGluZyBpbXBlbmRpbmcgbmV3IHJlbGVhc2UuCisJKE5vdCBtdWNoIGhhcyBjaGFuZ2VkIDotKCApCisKK01vbiBNYXIgMjkgMTQ6NTI6MjggMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBTY3JpcHRCaW5kaW5nLnB5LCBQeVNoZWxsLnB5OgorCUF0IFRpbSBQZXRlcnMnIHJlY29tbWVuZGF0aW9uLCBhZGQgYSBkdW1teSBmbHVzaCgpIG1ldGhvZCB0bworCVBzZXVkb0ZpbGUuCisKK1RodSBNYXIgMTEgMjM6MjE6MjMgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBQYXRoQnJvd3Nlci5weTogRG9uJ3QgY3Jhc2ggd2hlbiBzeXMucGF0aCBjb250YWlucyBhbiBlbXB0eSBzdHJpbmcuCisKKwkqIEF0dGljL091dGxpbmUucHk6IFRoaXMgZmlsZSB3YXMgbmV2ZXIgc3VwcG9zZWQgdG8gYmUgcGFydCBvZiBJRExFLgorCisJKiBQYXRoQnJvd3Nlci5weToKKwktIERvbid0IGNyYXNoIGluIHRoZSBjYXNlIHdoZXJlIGEgc3VwZXJjbGFzcyBpcyBhIHN0cmluZyBpbnN0ZWFkIG9mIGEKKwlweWNsYnIuQ2xhc3Mgb2JqZWN0OyB0aGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgc3VwZXJjbGFzcyBpcworCXVucmVjb2duaXphYmxlICh0byBweWNsYnIpLCBlLmcuIHdoZW4gbW9kdWxlIHJlbmFtaW5nIGlzIHVzZWQuCisKKwktIFNob3cgYSB3YXRjaCBjdXJzb3Igd2hlbiBjYWxsaW5nIHB5Y2xiciAoc2luY2UgaXQgbWF5IHRha2UgYSB3aGlsZQorCXJlY3Vyc2l2ZWx5IHBhcnNpbmcgaW1wb3J0ZWQgbW9kdWxlcyEpLgorCitXZWQgTWFyIDEwIDA1OjE4OjAyIDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogRWRpdG9yV2luZG93LnB5LCBCaW5kaW5ncy5weTogQWRkIFBhdGhCcm93c2VyIHRvIEZpbGUgbW9kdWxlCisKKwkqIFBhdGhCcm93c2VyLnB5OiAiUGF0aCBicm93c2VyIiAtIDQgc2Nyb2xsZWQgbGlzdHMgZGlzcGxheWluZzoKKwkgICAgZGlyZWN0b3JpZXMgb24gc3lzLnBhdGgKKwkgICAgbW9kdWxlcyBpbiBzZWxlY3RlZCBkaXJlY3RvcnkKKwkgICAgY2xhc3NlcyBpbiBzZWxlY3RlZCBtb2R1bGUKKwkgICAgbWV0aG9kcyBvZiBzZWxlY3RlZCBjbGFzcworCisJU2lubGdlIGNsaWNraW5nIGluIGEgZGlyZWN0b3J5LCBtb2R1bGUgb3IgY2xhc3MgaXRlbSB1cGRhdGVzIHRoZSBuZXh0CisJY29sdW1uIHdpdGggaW5mbyBhYm91dCB0aGUgc2VsZWN0ZWQgaXRlbS4gIERvdWJsZSBjbGlja2luZyBpbiBhCisJbW9kdWxlLCBjbGFzcyBvciBtZXRob2QgaXRlbSBvcGVucyB0aGUgZmlsZSAoYW5kIHNlbGVjdHMgdGhlIGNsaWNrZWQKKwlpdGVtIGlmIGl0IGlzIGEgY2xhc3Mgb3IgbWV0aG9kKS4KKworCUkgZ3Vlc3MgZXZlbnR1YWxseSBJIHNob3VsZCBiZSB1c2luZyBhIHRyZWUgd2lkZ2V0IGZvciB0aGlzLCBidXQgdGhlCisJb25lcyBJJ3ZlIHNlZW4gZG9uJ3Qgd29yayB3ZWxsIGVub3VnaCwgc28gZm9yIG5vdyBJIHVzZSB0aGUgb2xkCisJU21hbGx0YWxrIG9yIE5lWFQgc3R5bGUgbXVsdGktY29sdW1uIGhpZXJhcmNoaWNhbCBicm93c2VyLgorCisJKiBNdWx0aVNjcm9sbGVkTGlzdHMucHk6CisJTmV3IHV0aWxpdHk6IG11bHRpcGxlIHNjcm9sbGVkIGxpc3RzIGluIHBhcmFsbGVsCisKKwkqIFNjcm9sbGVkTGlzdC5weTogLSBXaGl0ZSBiYWNrZ3JvdW5kLgorCS0gRGlzcGxheSAiKE5vbmUpIiAob3IgdGV4dCBvZiB5b3VyIGNob29zaW5nKSB3aGVuIGVtcHR5LgorCS0gRG9uJ3Qgc2V0IHRoZSBmb2N1cy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVB5dGhvbiByZWxlYXNlIDEuNS4yYjIsIElETEUgdmVyc2lvbiAwLjMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwkKK1dlZCBGZWIgMTcgMjI6NDc6NDEgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBORVdTLnR4dDogTmV3cyBpbiAwLjMuCisKKwkqIFJFQURNRS50eHQsIGlkbGV2ZXIucHk6IEJ1bXAgdmVyc2lvbiB0byAwLjMuCisKKwkqIEVkaXRvcldpbmRvdy5weToKKwlBZnRlciBhbGwsIHdlIGRvbid0IG5lZWQgdG8gY2FsbCB0aGUgY2FsbGJhY2tzIG91cnNlbHZlcyEKKworCSogV2luZG93TGlzdC5weToKKwlXaGVuIGRlbGV0aW5nLCBjYWxsIHRoZSBjYWxsYmFja3MgKmFmdGVyKiBkZWxldGluZyB0aGUgd2luZG93IGZyb20gb3VyIGxpc3QhCisKKwkqIEVkaXRvcldpbmRvdy5weToKKwlGaXggdXAgdGhlIFdpbmRvd3MgbWVudSB2aWEgdGhlIG5ldyBjYWxsYmFjayBtZWNoYW5pc20gaW5zdGVhZCBvZgorCWRlcGVuZGluZyBvbiBtZW51IHBvc3QgY29tbWFuZHMgKHdoaWNoIGRvbid0IHdvcmsgd2hlbiB0aGUgbWVudSBpcworCXRvcm4gb2ZmKS4KKworCSogV2luZG93TGlzdC5weToKKwlTdXBwb3J0IGNhbGxiYWNrcyB0byBwYXRjaCB1cCBXaW5kb3dzIG1lbnVzIGV2ZXJ5d2hlcmUuCisKKwkqIENoYW5nZUxvZzogT2gsIHdoeSBub3QuICBDaGVja2luZyBpbiB0aGUgRW1hY3MtZ2VuZXJhdGVkIGNoYW5nZSBsb2cuCisKK1R1ZSBGZWIgMTYgMjI6MzQ6MTcgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBTY3JpcHRCaW5kaW5nLnB5OgorCU9ubHkgcG9wIHVwIHRoZSBzdGFjayB2aWV3ZXIgd2hlbiByZXF1ZXN0ZWQgaW4gdGhlIERlYnVnIG1lbnUuCisKK01vbiBGZWIgIDggMjI6Mjc6NDkgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBXaW5kb3dMaXN0LnB5OiBEb24ndCBjcmFzaCBpZiBhIHdpbmRvdyBubyBsb25nZXIgZXhpc3RzLgorCisJKiBUT0RPLnR4dDogUmVzdHJ1Y3R1cmVkIGEgYml0LgorCitNb24gRmViICAxIDIzOjA2OjE3IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogUHlTaGVsbC5weTogQWRkIGN1cnJlbnQgZGlyIG9yIHBhdGhzIG9mIGZpbGUgYXJncyB0byBzeXMucGF0aC4KKworCSogRGVidWdnZXIucHk6IEFkZCBjYW5vbmljKCkgZnVuY3Rpb24gLS0gZm9yIGJyYW5kIG5ldyBiZGIucHkgZmVhdHVyZS4KKworCSogU3RhY2tWaWV3ZXIucHk6IFByb3RlY3QgYWdhaW5zdCBhY2Nlc3NpbmcgYW4gZW1wdHkgc3RhY2suCisKK0ZyaSBKYW4gMjkgMjA6NDQ6NDUgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBab29tSGVpZ2h0LnB5OgorCVVzZSBvbmx5IHRoZSBoZWlnaHQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gem9vbSBpbiBvciBvdXQuCisKK1RodSBKYW4gMjggMjI6MjQ6MzAgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBFZGl0b3JXaW5kb3cucHksIEZpbGVMaXN0LnB5OgorCU1ha2Ugc3VyZSB0aGUgVGNsIHZhcmlhYmxlcyBhcmUgc2hhcmVkIGJldHdlZW4gd2luZG93cy4KKworCSogUHlTaGVsbC5weSwgRWRpdG9yV2luZG93LnB5LCBCaW5kaW5ncy5weToKKwlNb3ZlIG1lbnUva2V5IGJpbmRpbmcgY29kZSBmcm9tIEJpbmRpbmdzLnB5IHRvIEVkaXRvcldpbmRvdy5weSwKKwl3aXRoIGNoYW5nZWQgQVBJcyAtLSBpdCBtYWtlcyBtdWNoIG1vcmUgc2Vuc2UgdGhlcmUuCisJQWxzbyBhZGQgYSBuZXcgZmVhdHVyZTogaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIG1lbnUgbGFiZWwgaXMKKwlhICchJywgaXQgZ2V0cyBhIGNoZWNrYm94LiAgQ2hlY2tib3hlcyBhcmUgYm91bmQgdG8gQm9vbGVhbiBUY2wgdmFyaWFibGVzCisJdGhhdCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgbmV3IGdldHZhci9zZXR2YXIvZ2V0cmF3dmFyIEFQSTsKKwl0aGUgdmFyaWFibGUgaXMgbmFtZWQgYWZ0ZXIgdGhlIGV2ZW50IHRvIHdoaWNoIHRoZSBtZW51IGlzIGJvdW5kLgorCisJKiBEZWJ1Z2dlci5weTogQWRkIFF1aXQgYnV0dG9uIHRvIHRoZSBkZWJ1Z2dlciB3aW5kb3cuCisKKwkqIFNlYXJjaERpYWxvZy5weToKKwlXaGVuIGZpbmRfYWdhaW4oKSBmaW5kcyBleGFjdGx5IHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgaXQncyBhIGZhaWx1cmUuCisKKwkqIGlkbGUucHksIEF0dGljL2lkbGU6IFJlbmFtZSBpZGxlIC0+IGlkbGUucHkKKworTW9uIEphbiAxOCAxNToxODo1NyAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIEVkaXRvcldpbmRvdy5weSwgV2luZG93TGlzdC5weTogT25seSBkZWljb25pZnkgd2hlbiBpY29uaWMuCisKKwkqIFRPRE8udHh0OiBNaXNjCisKK1R1ZSBKYW4gMTIgMjI6MTQ6MzQgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiB0ZXN0Y29kZS5weSwgQXR0aWMvdGVzdC5weToKKwlSZW5hbWVkIHRlc3QucHkgdG8gdGVzdGNvZGUucHkgc28gb25lIGNhbiBpbXBvcnQgUHl0aG9uJ3MKKwl0ZXN0IHBhY2thZ2UgZnJvbSBpbnNpZGUgSURMRS4gIChTdWdnZXN0ZWQgYnkgSmFjayBKYW5zZW4uKQorCisJKiBFZGl0b3JXaW5kb3cucHksIENvbG9yRGVsZWdhdG9yLnB5OgorCUhhY2sgdG8gY2xvc2UgYSB3aW5kb3cgdGhhdCBpcyBjb2xvcml6aW5nLgorCisJKiBTZXBhcmF0b3IucHk6IFZsYWRpbWlyIE1hcmFuZ296b3YncyBwYXRjaDoKKwlUaGUgc2VwYXJhdG9yIGRhbmNlcyB0b28gbXVjaCBhbmQgc2VlbXMgdG8ganVtcCBieSBhcmJpdHJhcnkgYW1vdW50cworCWluIGFyYml0cmFyeSBkaXJlY3Rpb25zIHdoZW4gSSB0cnkgdG8gbW92ZSBpdCBmb3IgcmVzaXppbmcgdGhlIGZyYW1lcy4KKwlUaGlzIHBhdGNoIG1ha2VzIGl0IG1vcmUgcXVpZXQuCisKK01vbiBKYW4gMTEgMTQ6NTI6NDAgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBUT0RPLnR4dDogU29tZSByZXF1ZXN0cyBoYXZlIGJlZW4gZnVsZmlsbGVkLgorCisJKiBFZGl0b3JXaW5kb3cucHk6CisJU2V0IHRoZSBjdXJzb3IgdG8gYSB3YXRjaCB3aGVuIG9wZW5pbmcgdGhlIGNsYXNzIGJyb3dzZXIgKHdoaWNoIG1heQorCXRha2UgcXVpdGUgYSB3aGlsZSwgYnJvd3NpbmcgbXVsdGlwbGUgZmlsZXMpLgorCisJTmV3ZXIsIGJldHRlciBjZW50ZXIoKSAtLSBidXQgYXNzdW1lcyBubyB3cmFwcGluZy4KKworCSogU2VhcmNoQmluZGluZy5weToKKwlHb3QgcmlkIG9mIGRlYnVnIHByaW50IHN0YXRlbWVudCBpbiBnb3RvX2xpbmVfZXZlbnQoKS4KKworCSogU2NyaXB0QmluZGluZy5weToKKwlJIHRoaW5rIEkgbGlrZSBpdCBiZXR0ZXIgaWYgaXQgcHJpbnRzIHRoZSB0cmFjZWJhY2sgZXZlbiB3aGVuIGl0IGRpc3BsYXlzCisJdGhlIHN0YWNrIHZpZXdlci4KKworCSogRGVidWdnZXIucHk6IEJpbmQgRVNDIHRvIGNsb3NlLXdpbmRvdy4KKworCSogQ2xhc3NCcm93c2VyLnB5OiBVc2UgYSBIU2VwYXJhdG9yIGJldHdlZW4gdGhlIGNsYXNzZXMgYW5kIHRoZSBpdGVtcy4KKwlNYWtlIHRoZSBsaXN0IG9mIGNsYXNzZXMgd2lkZXIgYnkgZGVmYXVsdCAoNDAgY2hhcnMpLgorCUJpbmQgRVNDIHRvIGNsb3NlLXdpbmRvdy4KKworCSogU2VwYXJhdG9yLnB5OgorCVNlcGFyYXRvciBjbGFzc2VzIChkcmFnZ2FibGUgZGl2aWRlciBiZXR3ZWVuIHR3byBwYW5lcykuCisKK1NhdCBKYW4gIDkgMjI6MDE6MzMgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBXaW5kb3dMaXN0LnB5OgorCURvbid0IHRyYWNlYmFjayB3aGVuIHdha2V1cCgpIGlzIGNhbGxlZCB3aGVuIHRoZSB3aW5kb3cgaGFzIGJlZW4gZGVzdHJveWVkLgorCVRoaXMgY2FuIGhhcHBlbiB3aGVuIGEgdG9ybi1vZiBXaW5kb3dzIG1lbnUgcmVmZXJlbmNlcyBjbG9zZWQgd2luZG93cy4KKwlBbmQgVGltIFBldGVycyBjbGFpbXMgdGhhdCB0aGUgV2luZG93cyBtZW51IGlzIGhpcyBmYXZvcml0ZSB0byB0ZWFyIG9mZi4uLgorCisJKiBFZGl0b3JXaW5kb3cucHk6IEFsbG93IHRlYXJpbmcgb2ZmIG9mIHRoZSBXaW5kb3dzIG1lbnUuCisKKwkqIFN0YWNrVmlld2VyLnB5OiBDbG9zZSBvbiBFU0MuCisKKwkqIGhlbHAudHh0OiBVcGRhdGVkIGEgYnVuY2ggb2YgdGhpbmdzIChpdCB3YXMgbW9zdGx5IHN0aWxsIDAuMSEpCisKKwkqIGV4dGVuZC5weTogQWRkZWQgU2NyaXB0QmluZGluZyB0byBzdGFuZGFyZCBiaW5kaW5ncy4KKworCSogU2NyaXB0QmluZGluZy5weToKKwlUaGlzIG5vdyBhY3R1YWxseSB3b3Jrcy4gIFNlZSBkb2Mgc3RyaW5nLiAgSXQgY2FuIHJ1biBhIG1vZHVsZSAoaS5lLgorCWltcG9ydCBvciByZWxvYWQpIG9yIGRlYnVnIGl0IChzYW1lIHdpdGggZGVidWdnZXIgY29udHJvbCkuICBPdXRwdXQKKwlnb2VzIHRvIGEgZnJlc2ggb3V0cHV0IHdpbmRvdywgb25seSBjcmVhdGVkIHdoZW4gbmVlZGVkLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUHl0aG9uIHJlbGVhc2UgMS41LjJiMSwgSURMRSB2ZXJzaW9uIDAuMgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQorRnJpIEphbiAgOCAxNzoyNjowMiAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFJFQURNRS50eHQsIE5FV1MudHh0OiBXaGF0J3MgbmV3IGluIHRoaXMgcmVsZWFzZS4KKworCSogQmluZGluZ3MucHksIFB5U2hlbGwucHk6CisJUGF1bCBQcmVzY29kJ3MgcGF0Y2hlcyB0byBhbGxvdyB0aGUgc3RhY2sgdmlld2VyIHRvIHBvcCB1cCB3aGVuIGEKKwl0cmFjZWJhY2sgaXMgcHJpbnRlZC4KKworVGh1IEphbiAgNyAwMDoxMjoxNSAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIEZvcm1hdFBhcmFncmFwaC5weToKKwlDaGFuZ2UgcGFyYWdyYXBoIHdpZHRoIGxpbWl0IHRvIDcwIChsaWtlIEVtYWNzIE0tUSkuCisKKwkqIFJFQURNRS50eHQ6CisJU2VwYXJhdGluZyBUT0RPIGZyb20gUkVBRE1FLiAgU2xpZ2h0IHJlZm9ybXVsYXRpb24gb2YgZmVhdHVyZXMuICBObworCWV4YWN0IHJlbGVhc2UgZGF0ZS4KKworCSogVE9ETy50eHQ6IFNlcGFyYXRpbmcgVE9ETyBmcm9tIFJFQURNRS4KKworTW9uIEphbiAgNCAyMToxOTowOSAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIEZvcm1hdFBhcmFncmFwaC5weToKKwlIbS4gIFRoZXJlIHdhcyBhIGJvdW5kYXJ5IGNvbmRpdGlvbiBlcnJvciBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRvby4KKworCSogU2VhcmNoQmluZGluZy5weTogSG0uICBBZGQgVW5peCBiaW5kaW5nIGZvciByZXBsYWNlLCB0b28uCisKKwkqIGtleWRlZnMucHk6IFJhbiBldmVudHBhcnNlLnB5IGFnYWluLgorCisJKiBGb3JtYXRQYXJhZ3JhcGgucHk6IEFkZGVkIFVuaXggTWV0YS1xIGtleSBiaW5kaW5nOworCWZpeCBmaW5kX3BhcmFncmFwaCB3aGVuIGF0IHN0YXJ0IG9mIGZpbGUuCisKKwkqIEF1dG9FeHBhbmQucHk6IEFkZGVkIE1ldGEtLyBiaW5kaW5nIGZvciBVbml4IGFzIGFsdCBmb3IgQWx0LS8uCisKKwkqIFNlYXJjaEJpbmRpbmcucHk6CisJQWRkIHVuaXggYmluZGluZyBmb3IgZ3JlcCAob3RoZXJ3aXNlIHRoZSBtZW51IGVudHJ5IGRvZXNuJ3Qgd29yayEpCisKKwkqIFpvb21IZWlnaHQucHk6IEFkanVzdGVkIFVuaXggaGVpZ2h0IHRvIHdvcmsgd2l0aCBmdndtOTYuIDo9KAorCisJKiBHcmVwRGlhbG9nLnB5OiBOZWVkIHRvIGltcG9ydCBzeXMhCisKKwkqIGhlbHAudHh0LCBleHRlbmQudHh0LCBSRUFETUUudHh0OiBGb3JtYXR0ZWQgc29tZSBwYXJhZ3JhcGhzCisKKwkqIGV4dGVuZC5weSwgRm9ybWF0UGFyYWdyYXBoLnB5OgorCUFkZCBuZXcgZXh0ZW5zaW9uIHRvIHJlZm9ybWF0IGEgKHRleHQpIHBhcmFncmFwaC4KKworCSogWm9vbUhlaWdodC5weTogVHlwbyBpbiBXaW4gc3BlY2lmaWMgaGVpZ2h0IHNldHRpbmcuCisKK1N1biBKYW4gIDMgMDA6NDc6MzUgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBBdXRvSW5kZW50LnB5OiBBZGRlZCBzb21ldGhpbmcgbGlrZSBUaW0gUGV0ZXJzJyBiYWNrc3BhY2UgcGF0Y2guCisKKwkqIFpvb21IZWlnaHQucHk6IEFkYXB0ZWQgdG8gVW5peCAoaS5lLiwgbW9yZSBoYXJkY29kZWQgY29uc3RhbnRzKS4KKworU2F0IEphbiAgMiAyMToyODo1NCAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIGtleWRlZnMucHksIGlkbGV2ZXIucHksIGlkbGUucHl3LCBpZGxlLmJhdCwgaGVscC50eHQsIGV4dGVuZC50eHQsIGV4dGVuZC5weSwgZXZlbnRwYXJzZS5weSwgWm9vbUhlaWdodC5weSwgV2luZG93TGlzdC5weSwgVW5kb0RlbGVnYXRvci5weSwgU3RhY2tWaWV3ZXIucHksIFNlYXJjaEVuZ2luZS5weSwgU2VhcmNoRGlhbG9nQmFzZS5weSwgU2VhcmNoRGlhbG9nLnB5LCBTY3JvbGxlZExpc3QucHksIFNlYXJjaEJpbmRpbmcucHksIFNjcmlwdEJpbmRpbmcucHksIFJlcGxhY2VEaWFsb2cucHksIEF0dGljL1JFQURNRSwgUkVBRE1FLnR4dCwgUHlTaGVsbC5weSwgQXR0aWMvUG9wdXBNZW51LnB5LCBPdXRwdXRXaW5kb3cucHksIElPQmluZGluZy5weSwgQXR0aWMvSGVscFdpbmRvdy5weSwgSGlzdG9yeS5weSwgR3JlcERpYWxvZy5weSwgRmlsZUxpc3QucHksIEZyYW1lVmlld2VyLnB5LCBFZGl0b3JXaW5kb3cucHksIERlYnVnZ2VyLnB5LCBEZWxlZ2F0b3IucHksIENvbG9yRGVsZWdhdG9yLnB5LCBCaW5kaW5ncy5weSwgQ2xhc3NCcm93c2VyLnB5LCBBdXRvRXhwYW5kLnB5LCBBdXRvSW5kZW50LnB5OgorCUNoZWNraW5nIGluIElETEUgMC4yLgorCisJTXVjaCBoYXMgY2hhbmdlZCAtLSB0b28gbXVjaCwgaW4gZmFjdCwgdG8gd3JpdGUgZG93bi4KKwlUaGUgYmlnIG5ld3MgaXMgdGhhdCB0aGVyZSdzIGEgc3RhbmRhcmQgd2F5IHRvIHdyaXRlIElETEUgZXh0ZW5zaW9uczsKKwlzZWUgZXh0ZW5kLnR4dC4gIFNvbWUgc2FtcGxlIGV4dGVuc2lvbnMgaGF2ZSBiZWVuIHByb3ZpZGVkLCBhbmQKKwlzb21lIGV4aXN0aW5nIGNvZGUgaGFzIGJlZW4gY29udmVydGVkIHRvIGV4dGVuc2lvbnMuICBQcm9iYWJseSB0aGUKKwliaWdnZXN0IG5ldyB1c2VyIGZlYXR1cmUgaXMgYSBuZXcgc2VhcmNoIGRpYWxvZyB3aXRoIG1vcmUgb3B0aW9ucywKKwlzZWFyY2ggYW5kIHJlcGxhY2UsIGFuZCBldmVuIHNlYXJjaCBpbiBmaWxlcyAoZ3JlcCkuCisKKwlUaGlzIGlzIGV4YWN0bHkgYXMgZG93bmxvYWRlZCBmcm9tIG15IGxhcHRvcCBhZnRlciByZXR1cm5pbmcKKwlmcm9tIHRoZSBob2xpZGF5cyAtLSBpdCBoYXNuJ3QgZXZlbiBiZWVuIHRlc3RlZCBvbiBVbml4IHlldC4KKworRnJpIERlYyAxOCAxNTo1Mjo1NCAxOTk4ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIEZpbGVMaXN0LnB5LCBDbGFzc0Jyb3dzZXIucHk6CisJRml4IHRoZSBjbGFzcyBicm93c2VyIHRvIHdvcmsgZXZlbiB3aGVuIHRoZSBmaWxlIGlzIG5vdCBvbiBzeXMucGF0aC4KKworVHVlIERlYyAgOCAyMDozOTozNiAxOTk4ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIEF0dGljL3R1cnRsZS5weTogTW92ZWQgdG8gUHl0aG9uIDEuNS4yL0xpYgorCitGcmkgTm92IDI3IDAzOjE5OjIwIDE5OTggIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogaGVscC50eHQ6IFR5cG8KKworCSogRWRpdG9yV2luZG93LnB5LCBGaWxlTGlzdC5weTogU3VwcG9ydCB1bmRlcmxpbmluZyBvZiBtZW51IGxhYmVscworCisJKiBCaW5kaW5ncy5weToKKwlOZXcgYXBwcm9hY2gsIHNlcGFyYXRlIHRhYmxlcyBmb3IgbWVudXMgKHBsYXRmb3JtLWluZGVwZW5kZW50KSBhbmQga2V5CisJZGVmaW5pdGlvbnMgKHBsYXRmb3JtLXNwZWNpZmljKSwgYW5kIGdlbmVyYXRpbmcgYWNjZWxlcmF0b3Igc3RyaW5ncworCWF1dG9tYXRpY2FsbHkgZnJvbSB0aGUga2V5IGRlZmluaXRpb25zLgorCitNb24gTm92IDE2IDE4OjM3OjQyIDE5OTggIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQXR0aWMvUkVBRE1FOiBDbGFyaWZ5IHBvcnRhYmlsaXR5IGFuZCBtYWluIHByb2dyYW0uCisKKwkqIEF0dGljL1JFQURNRTogQWRkZWQgaW50cm8gZm9yIDAuMSByZWxlYXNlIGFuZCBhcHBlbmQgR3JhaWwgbm90ZXMuCisKK01vbiBPY3QgMjYgMTg6NDk6MDAgMTk5OCAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBBdHRpYy90dXJ0bGUucHk6IHJvb3QgaXMgbm93IGEgZ2xvYmFsIGNhbGxlZCBfcm9vdAorCitTYXQgT2N0IDI0IDE2OjM4OjM4IDE5OTggIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQXR0aWMvdHVydGxlLnB5OiBSYWlzZSB0aGUgcm9vdCB3aW5kb3cgb24gcmVzZXQoKS4KKwlEaWZmZXJlbnQgYWN0aW9uIG9uIFdNX0RFTEVURV9XSU5ET1cgaXMgbW9yZSBsaWtlbHkgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nLAorCWFsbG93aW5nIHVzIHRvIGRlc3Ryb3kgb2xkIHdpbmRvd3MuCisKKwkqIEF0dGljL3R1cnRsZS5weToKKwlTcGxpdCB0aGUgZ290bygpIGZ1bmN0aW9uIGluIHR3bzogX2dvdG8oKSBpcyB0aGUgaW50ZXJuYWwgb25lLAorCXVzaW5nIENhbnZhcyBjb29yZGluYXRlcywgYW5kIGdvdG8oKSB1c2VzIHR1cnRsZSBjb29yZGluYXRlcworCWFuZCBhY2NlcHRzIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3RzLgorCisJKiBBdHRpYy90dXJ0bGUucHk6IENvcGUgd2l0aCBkZXN0cnVjdGlvbiBvZiB0aGUgd2luZG93CisKKwkqIEF0dGljL3R1cnRsZS5weTogVHVydGxlIGdyYXBoaWNzCisKKwkqIERlYnVnZ2VyLnB5OiBVc2Ugb2YgQnJlYWtwb2ludCBjbGFzcyBzaG91bGQgYmUgYmRiLkJyZWFrcG9pbnQuCisKK01vbiBPY3QgMTkgMDM6MzM6NDAgMTk5OCAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBTZWFyY2hCaW5kaW5nLnB5OgorCVNwZWVkIHVwIHRoZSBzZWFyY2ggYSBiaXQgLS0gZG9uJ3QgZHJhZyBhIG1hcmsgYXJvdW5kLi4uCisKKwkqIFB5U2hlbGwucHk6CisJQ2hhbmdlIG91ciBzcGVjaWFsIGVudHJpZXMgZnJvbSA8Y29uc29sZSNOPiB0byA8cHlzaGVsbCNOPi4KKwlQYXRjaCBsaW5lY2FjaGUuY2hlY2tjYWNoZSgpIHRvIGtlZXAgb3VyIHNwZWNpYWwgZW50cmllcyBhbGl2ZS4KKwlBZGQgcG9wdXAgbWVudSB0byBhbGwgZWRpdG9yIHdpbmRvd3MgdG8gc2V0IGEgYnJlYWtwb2ludC4KKworCSogRGVidWdnZXIucHk6CisJVXNlIGFuZCBwYXNzIHRocm91Z2ggdGhlICdmb3JjZScgZmxhZyB0byBzZXRfZGljdCgpIHdoZXJlIGFwcHJvcHJpYXRlLgorCURlZmF1bHQgc291cmNlIGFuZCBnbG9iYWxzIGNoZWNrYm94ZXMgdG8gZmFsc2UuCisJRG9uJ3QgaW50ZXJhY3QgaW4gdXNlcl9yZXR1cm4oKS4KKwlBZGQgcHJpbWl0aXZlIHNldF9icmVha3BvaW50KCkgbWV0aG9kLgorCisJKiBDb2xvckRlbGVnYXRvci5weToKKwlSYWlzZSBwcmlvcml0eSBvZiAnc2VsJyB0YWcgc28gaXRzIGZvcmVncm91bmQgKG9uIFdpbmRvd3MpIHdpbGwgdGFrZQorCXByaW9yaXR5IG92ZXIgdGV4dCBjb2xvcml6YXRpb24gKHdoaWNoIG9uIFdpbmRvd3MgaXMgYWxtb3N0IHRoZQorCXNhbWUgY29sb3IgYXMgdGhlIHNlbGVjdGlvbiBiYWNrZ3JvdW5kKS4KKworCURlZmluZSBhIHRhZyBhbmQgY29sb3IgZm9yIGJyZWFrcG9pbnRzICgiQlJFQUsiKS4KKworCSogQXR0aWMvUG9wdXBNZW51LnB5OiBEaXNhYmxlICJPcGVuIHN0YWNrIHZpZXdlciIgYW5kICJoZWxwIiBjb21tYW5kcy4KKworCSogU3RhY2tWaWV3ZXIucHk6CisJQWRkIG9wdGlvbmFsICdmb3JjZScgYXJndW1lbnQgKGRlZmF1bHQgMCkgdG8gbG9hZF9kaWN0KCkuCisJSWYgc2V0LCByZWRvIHRoZSBkaXNwbGF5IGV2ZW4gaWYgaXQncyB0aGUgc2FtZSBkaWN0LgorCitGcmkgT2N0IDE2IDIxOjEwOjEyIDE5OTggIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogU3RhY2tWaWV3ZXIucHk6IERvIG5vdGhpbmcgd2hlbiBsb2FkaW5nIHRoZSBzYW1lIGRpY3QgYXMgYmVmb3JlLgorCisJKiBQeVNoZWxsLnB5OiBEZXRhaWxzIGZvciBkZWJ1Z2dlciBpbnRlcmZhY2UuCisKKwkqIERlYnVnZ2VyLnB5OgorCVJlc3RydWN0dXJlZCBhbmQgbW9yZSBjb25zaXN0ZW50LiAgU2F2ZSBjaGVja2JveGVzIGFjcm9zcyBpbnN0YW50aWF0aW9ucy4KKworCSogRWRpdG9yV2luZG93LnB5LCBBdHRpYy9SRUFETUUsIEJpbmRpbmdzLnB5OgorCUdldCByaWQgb2YgY29uZmxpY3RpbmcgXlggYmluZGluZy4gIFVzZSBeVy4KKworCSogRGVidWdnZXIucHksIFN0YWNrVmlld2VyLnB5OgorCURlYnVnZ2VyIGNhbiBub3cgc2hvdyBsb2NhbCBhbmQgZ2xvYmFsIHZhcmlhYmxlcy4KKworCSogRGVidWdnZXIucHk6IE9vcHMKKworCSogRGVidWdnZXIucHksIFB5U2hlbGwucHk6IEJldHRlciBkZWJ1Z2dlciBzdXBwb3J0IChzaG93IHN0YWNrIGV0YykuCisKKwkqIEF0dGljL1BvcHVwTWVudS5weTogRm9sbG93IHJlbmFtZXMgaW4gU3RhY2tWaWV3ZXIgbW9kdWxlCisKKwkqIFN0YWNrVmlld2VyLnB5OgorCVJlbmFtZSBjbGFzc2VzIHRvIFN0YWNrVmlld2VyICh0aGUgd2lkZ2V0KSBhbmQgU3RhY2tCcm93c2VyICh0aGUgdG9wbGV2ZWwpLgorCisJKiBTY3JvbGxlZExpc3QucHk6IEFkZCBjbG9zZSgpIG1ldGhvZAorCisJKiBFZGl0b3JXaW5kb3cucHk6IENsYXJpZnkgJ09wZW4gTW9kdWxlJyBkaWFsb2cgdGV4dAorCisJKiBTdGFja1ZpZXdlci5weTogUmVzdHJ1Y3R1cmVkIGludG8gYSBicm93c2VyIGFuZCBhIHdpZGdldC4KKworVGh1IE9jdCAxNSAyMzoyNzowOCAxOTk4ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIENsYXNzQnJvd3Nlci5weSwgU2Nyb2xsZWRMaXN0LnB5OgorCUdlbmVyYWxpemVkIHRoZSBzY3JvbGxlZCBsaXN0IHdoaWNoIGlzIHRoZSBiYXNlIGZvciB0aGUgY2xhc3MgYW5kCisJbWV0aG9kIGJyb3dzZXIgaW50byBhIHNlcGFyYXRlIGNsYXNzIGluIGl0cyBvd24gbW9kdWxlLgorCisJKiBBdHRpYy90ZXN0LnB5OiBDb3NtZXRpYyBjaGFuZ2UKKworCSogRGVidWdnZXIucHk6IERvbid0IHNob3cgZnVuY3Rpb24gbmFtZSBpZiB0aGVyZSBpcyBub25lCisKK1dlZCBPY3QgMTQgMDM6NDM6MDUgMTk5OCAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBEZWJ1Z2dlci5weSwgUHlTaGVsbC5weTogUG9saXNoIHRoZSBEZWJ1Z2dlciBHVUkgYSBiaXQuCisJQ2xvc2luZyBpdCBub3cgYWxzbyBkb2VzIHRoZSByaWdodCB0aGluZy4KKworVHVlIE9jdCAxMyAyMzo1MToxMyAxOTk4ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIERlYnVnZ2VyLnB5LCBQeVNoZWxsLnB5LCBCaW5kaW5ncy5weToKKwlBZCBwcmltaXRpdmUgZGVidWdnZXIgaW50ZXJmYWNlIChzbyBmYXIgaXQgd2lsbCBzdGVwIGFuZCBzaG93IHlvdSB0aGUKKwlzb3VyY2UsIGJ1dCBpdCBkb2Vzbid0IHlldCBzaG93IHRoZSBzdGFjaykuCisKKwkqIEF0dGljL1JFQURNRTogTWlzYworCisJKiBTdGFja1ZpZXdlci5weTogV2hvb3BzIC0tIHJlZmVyZW5jZWQgc2VsZi50b3AgYmVmb3JlIGl0IHdhcyBzZXQuCisKKwkqIGhlbHAudHh0OiBBZGRlZCBoaXN0b3J5IGFuZCBjb21wbGV0aW9uIGNvbW1hbmRzLgorCisJKiBoZWxwLnR4dDogVXBkYXRlZAorCisJKiBGaWxlTGlzdC5weTogQWRkIGNsYXNzIGJyb3dzZXIgZnVuY3Rpb25hbGl0eS4KKworCSogU3RhY2tWaWV3ZXIucHk6CisJQWRkIGEgY2xvc2UoKSBtZXRob2QgYW5kIGJpbmQgdG8gV01fREVMRVRFX1dJTkRPVyBwcm90b2NvbAorCisJKiBQeVNoZWxsLnB5OiBDbGVhciB0aGUgbGluZWNhY2hlIGJlZm9yZSBwcmludGluZyBhIHRyYWNlYmFjaworCisJKiBCaW5kaW5ncy5weTogQWRkZWQgY2xhc3MgYnJvd3NlciBiaW5kaW5nLgorCisJKiBDbGFzc0Jyb3dzZXIucHk6IE11Y2ggaW1wcm92ZWQsIG11Y2ggbGVmdCB0byBkby4KKworCSogUHlTaGVsbC5weTogTWFrZSB0aGUgcmV0dXJuIGtleSBkbyB3aGF0IEkgbWVhbiBtb3JlIG9mdGVuLgorCisJKiBDbGFzc0Jyb3dzZXIucHk6CisJQWRkaW5nIHRoZSBiZWdpbm5pbmdzIG9mIGEgQ2xhc3MgYnJvd3Nlci4gIEluY29tcGxldGUsIHlldC4KKworCSogRWRpdG9yV2luZG93LnB5LCBCaW5kaW5ncy5weToKKwlBZGQgbmV3IGNvbW1hbmQsICJPcGVuIG1vZHVsZSIuICBZb3Ugc2VsZWN0IG9yIHR5cGUgYSBtb2R1bGUgbmFtZSwKKwlhbmQgaXQgb3BlbnMgdGhlIHNvdXJjZS4KKworTW9uIE9jdCAxMiAyMzo1OToyNyAxOTk4ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFB5U2hlbGwucHk6IFN1YnN1bWUgZnVuY3Rpb25hbGl0eSBmcm9tIFBvcHVwIG1lbnUgaW4gRGVidWcgbWVudS4KKwlPdGhlciBzdHVmZiBzbyB0aGUgUHlTaGVsbCB3aW5kb3cgY2FuIGJlIHJlc3VycmVjdGVkIGZyb20gdGhlIFdpbmRvd3MgbWVudS4KKworCSogRmlsZUxpc3QucHk6IEdldCByaWQgb2YgUG9wVXAgbWVudS4KKwlDcmVhdGUgYSBzaW1wbGUgV2luZG93cyBtZW51LiAgKEltcGVyZmVjdCB3aGVuIFVudGl0bGVkIHdpbmRvd3MgZXhpc3QuKQorCUFkZCB3YWtldXAoKSBtZXRob2Q6IGRlaWNvbmlmeSwgcmFpc2UsIGZvY3VzLgorCisJKiBFZGl0b3JXaW5kb3cucHk6IEdlbmVyYWxpemUgbWVudSBjcmVhdGlvbi4KKworCSogQmluZGluZ3MucHk6IEFkZCBEZWJ1ZyBhbmQgSGVscCBtZW51IGl0ZW1zLgorCisJKiBFZGl0b3JXaW5kb3cucHk6IEFkZGVkIGEgbWVudSBiYXIgdG8gZXZlcnkgd2luZG93LgorCisJKiBCaW5kaW5ncy5weTogQWRkIG1lbnUgY29uZmlndXJhdGlvbiB0byB0aGUgZXZlbnQgY29uZmlndXJhdGlvbi4KKworCSogQXR0aWMvUG9wdXBNZW51LnB5OiBQYXNzIGEgcm9vdCB0byB0aGUgaGVscCB3aW5kb3cuCisKKwkqIFNlYXJjaEJpbmRpbmcucHk6CisJQWRkIHBhcmVudCBhcmd1bWVudCB0byAndG8gdG8gbGluZSBudW1iZXInIGRpYWxvZyBib3guCisKK1NhdCBPY3QgMTAgMTk6MTU6MzIgMTk5OCAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBTdGFja1ZpZXdlci5weToKKwlBZGQgYSBsYWJlbCBhdCB0aGUgdG9wIHNob3dpbmcgKHZlcnkgYmFzaWMpIGhlbHAgZm9yIHRoZSBzdGFjayB2aWV3ZXIuCisJQWRkIGEgbGFiZWwgYXQgdGhlIGJvdHRvbSBzaG93aW5nIHRoZSBleGNlcHRpb24gaW5mby4KKworCSogQXR0aWMvdGVzdC5weSwgQXR0aWMvaWRsZTogQWRkIFVuaXggbWFpbiBzY3JpcHQgYW5kIHRlc3QgcHJvZ3JhbS4KKworCSogaWRsZS5weXcsIGhlbHAudHh0LCBXaWRnZXRSZWRpcmVjdG9yLnB5LCBVbmRvRGVsZWdhdG9yLnB5LCBTdGFja1ZpZXdlci5weSwgU2VhcmNoQmluZGluZy5weSwgQXR0aWMvUkVBRE1FLCBQeVNoZWxsLnB5LCBBdHRpYy9Qb3B1cE1lbnUucHksIFBlcmNvbGF0b3IucHksIE91dGxpbmUucHksIElPQmluZGluZy5weSwgSGlzdG9yeS5weSwgQXR0aWMvSGVscFdpbmRvdy5weSwgRnJhbWVWaWV3ZXIucHksIEZpbGVMaXN0LnB5LCBFZGl0b3JXaW5kb3cucHksIERlbGVnYXRvci5weSwgQ29sb3JEZWxlZ2F0b3IucHksIEJpbmRpbmdzLnB5LCBBdXRvSW5kZW50LnB5LCBBdXRvRXhwYW5kLnB5OgorCUluaXRpYWwgY2hlY2tpbmcgb2YgVGstYmFzZWQgUHl0aG9uIElERS4KKwlGZWF0dXJlczogdGV4dCBlZGl0b3Igd2l0aCBzeW50YXggY29sb3JpbmcgYW5kIHVuZG87CisJc3ViY2xhc3NlZCBpbnRvIGludGVyYWN0aXZlIFB5dGhvbiBzaGVsbCB3aGljaCBhZGRzIGhpc3RvcnkuCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9DbGFzc0Jyb3dzZXIucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2xhc3NCcm93c2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NWIzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2xhc3NCcm93c2VyLnB5CkBAIC0wLDAgKzEsMjIxIEBACisiIiJDbGFzcyBicm93c2VyLgorCitYWFggVE8gRE86CisKKy0gcmVwYXJzZSB3aGVuIHNvdXJjZSBjaGFuZ2VkIChtYXliZSBqdXN0IGEgYnV0dG9uIHdvdWxkIGJlIE9LPykKKyAgICAob3IgcmVjaGVjayBvbiB3aW5kb3cgcG9wdXApCistIGFkZCBwb3B1cCBtZW51IHdpdGggbW9yZSBvcHRpb25zIChlLmcuIGRvYyBzdHJpbmdzLCBiYXNlIGNsYXNzZXMsIGltcG9ydHMpCistIHNob3cgZnVuY3Rpb24gYXJndW1lbnQgbGlzdD8gKGhhdmUgdG8gZG8gcGF0dGVybiBtYXRjaGluZyBvbiBzb3VyY2UpCistIHNob3VsZCB0aGUgY2xhc3NlcyBhbmQgbWV0aG9kcyBsaXN0cyBhbHNvIGJlIGluIHRoZSBtb2R1bGUncyBtZW51IGJhcj8KKy0gYWRkIGJhc2UgY2xhc3NlcyB0byBjbGFzcyBicm93c2VyIHRyZWUKKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBweWNsYnIKKworZnJvbSBpZGxlbGliIGltcG9ydCBQeVNoZWxsCitmcm9tIGlkbGVsaWIuV2luZG93TGlzdCBpbXBvcnQgTGlzdGVkVG9wbGV2ZWwKK2Zyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlTm9kZSwgVHJlZUl0ZW0sIFNjcm9sbGVkQ2FudmFzCitmcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKKworY2xhc3MgQ2xhc3NCcm93c2VyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0LCBuYW1lLCBwYXRoKToKKyAgICAgICAgIyBYWFggVGhpcyBBUEkgc2hvdWxkIGNoYW5nZSwgaWYgdGhlIGZpbGUgZG9lc24ndCBlbmQgaW4gIi5weSIKKyAgICAgICAgIyBYWFggdGhlIGNvZGUgaGVyZSBpcyBib2d1cyEKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmZpbGUgPSBvcy5wYXRoLmpvaW4ocGF0aFswXSwgc2VsZi5uYW1lICsgIi5weSIpCisgICAgICAgIHNlbGYuaW5pdChmbGlzdCkKKworICAgIGRlZiBjbG9zZShzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgc2VsZi50b3AuZGVzdHJveSgpCisgICAgICAgIHNlbGYubm9kZS5kZXN0cm95KCkKKworICAgIGRlZiBpbml0KHNlbGYsIGZsaXN0KToKKyAgICAgICAgc2VsZi5mbGlzdCA9IGZsaXN0CisgICAgICAgICMgcmVzZXQgcHljbGJyCisgICAgICAgIHB5Y2xici5fbW9kdWxlcy5jbGVhcigpCisgICAgICAgICMgY3JlYXRlIHRvcAorICAgICAgICBzZWxmLnRvcCA9IHRvcCA9IExpc3RlZFRvcGxldmVsKGZsaXN0LnJvb3QpCisgICAgICAgIHRvcC5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2xvc2UpCisgICAgICAgIHRvcC5iaW5kKCI8RXNjYXBlPiIsIHNlbGYuY2xvc2UpCisgICAgICAgIHNlbGYuc2V0dGl0bGUoKQorICAgICAgICB0b3AuZm9jdXNfc2V0KCkKKyAgICAgICAgIyBjcmVhdGUgc2Nyb2xsZWQgY2FudmFzCisgICAgICAgIHRoZW1lID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnVGhlbWUnLCduYW1lJykKKyAgICAgICAgYmFja2dyb3VuZCA9IGlkbGVDb25mLkdldEhpZ2hsaWdodCh0aGVtZSwgJ25vcm1hbCcpWydiYWNrZ3JvdW5kJ10KKyAgICAgICAgc2MgPSBTY3JvbGxlZENhbnZhcyh0b3AsIGJnPWJhY2tncm91bmQsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLCB0YWtlZm9jdXM9MSkKKyAgICAgICAgc2MuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCisgICAgICAgIGl0ZW0gPSBzZWxmLnJvb3Rub2RlKCkKKyAgICAgICAgc2VsZi5ub2RlID0gbm9kZSA9IFRyZWVOb2RlKHNjLmNhbnZhcywgTm9uZSwgaXRlbSkKKyAgICAgICAgbm9kZS51cGRhdGUoKQorICAgICAgICBub2RlLmV4cGFuZCgpCisKKyAgICBkZWYgc2V0dGl0bGUoc2VsZik6CisgICAgICAgIHNlbGYudG9wLndtX3RpdGxlKCJDbGFzcyBCcm93c2VyIC0gIiArIHNlbGYubmFtZSkKKyAgICAgICAgc2VsZi50b3Aud21faWNvbm5hbWUoIkNsYXNzIEJyb3dzZXIiKQorCisgICAgZGVmIHJvb3Rub2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gTW9kdWxlQnJvd3NlclRyZWVJdGVtKHNlbGYuZmlsZSkKKworY2xhc3MgTW9kdWxlQnJvd3NlclRyZWVJdGVtKFRyZWVJdGVtKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlKToKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorCisgICAgZGVmIEdldFRleHQoc2VsZik6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuZmlsZSkKKworICAgIGRlZiBHZXRJY29uTmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuICJweXRob24iCisKKyAgICBkZWYgR2V0U3ViTGlzdChzZWxmKToKKyAgICAgICAgc3VibGlzdCA9IFtdCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYubGlzdGNsYXNzZXMoKToKKyAgICAgICAgICAgIGl0ZW0gPSBDbGFzc0Jyb3dzZXJUcmVlSXRlbShuYW1lLCBzZWxmLmNsYXNzZXMsIHNlbGYuZmlsZSkKKyAgICAgICAgICAgIHN1Ymxpc3QuYXBwZW5kKGl0ZW0pCisgICAgICAgIHJldHVybiBzdWJsaXN0CisKKyAgICBkZWYgT25Eb3VibGVDbGljayhzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5ub3JtY2FzZShzZWxmLmZpbGVbLTM6XSkgIT0gIi5weSI6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuZmlsZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgUHlTaGVsbC5mbGlzdC5vcGVuKHNlbGYuZmlsZSkKKworICAgIGRlZiBJc0V4cGFuZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKHNlbGYuZmlsZVstMzpdKSA9PSAiLnB5IgorCisgICAgZGVmIGxpc3RjbGFzc2VzKHNlbGYpOgorICAgICAgICBkaXIsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KHNlbGYuZmlsZSkKKyAgICAgICAgbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlKQorICAgICAgICBpZiBvcy5wYXRoLm5vcm1jYXNlKGV4dCkgIT0gIi5weSI6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGljdCA9IHB5Y2xici5yZWFkbW9kdWxlX2V4KG5hbWUsIFtkaXJdICsgc3lzLnBhdGgpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgbXNnOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgc2VsZi5jbGFzc2VzID0ge30KKyAgICAgICAgZm9yIGtleSwgY2wgaW4gZGljdC5pdGVtcygpOgorICAgICAgICAgICAgaWYgY2wubW9kdWxlID09IG5hbWU6CisgICAgICAgICAgICAgICAgcyA9IGtleQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoY2wsICdzdXBlcicpIGFuZCBjbC5zdXBlcjoKKyAgICAgICAgICAgICAgICAgICAgc3VwZXJzID0gW10KKyAgICAgICAgICAgICAgICAgICAgZm9yIHN1cCBpbiBjbC5zdXBlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHR5cGUoc3VwKSBpcyB0eXBlKCcnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFtZSA9IHN1cAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbmFtZSA9IHN1cC5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3VwLm1vZHVsZSAhPSBjbC5tb2R1bGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYW1lID0gIiVzLiVzIiAlIChzdXAubW9kdWxlLCBzbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVycy5hcHBlbmQoc25hbWUpCisgICAgICAgICAgICAgICAgICAgIHMgPSBzICsgIiglcykiICUgIiwgIi5qb2luKHN1cGVycykKKyAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoKGNsLmxpbmVubywgcykpCisgICAgICAgICAgICAgICAgc2VsZi5jbGFzc2VzW3NdID0gY2wKKyAgICAgICAgaXRlbXMuc29ydCgpCisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICBmb3IgaXRlbSwgcyBpbiBpdGVtczoKKyAgICAgICAgICAgIGxpc3QuYXBwZW5kKHMpCisgICAgICAgIHJldHVybiBsaXN0CisKK2NsYXNzIENsYXNzQnJvd3NlclRyZWVJdGVtKFRyZWVJdGVtKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBjbGFzc2VzLCBmaWxlKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmNsYXNzZXMgPSBjbGFzc2VzCisgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbCA9IHNlbGYuY2xhc3Nlc1tzZWxmLm5hbWVdCisgICAgICAgIGV4Y2VwdCAoSW5kZXhFcnJvciwgS2V5RXJyb3IpOgorICAgICAgICAgICAgc2VsZi5jbCA9IE5vbmUKKyAgICAgICAgc2VsZi5pc2Z1bmN0aW9uID0gaXNpbnN0YW5jZShzZWxmLmNsLCBweWNsYnIuRnVuY3Rpb24pCisKKyAgICBkZWYgR2V0VGV4dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pc2Z1bmN0aW9uOgorICAgICAgICAgICAgcmV0dXJuICJkZWYgIiArIHNlbGYubmFtZSArICIoLi4uKSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiY2xhc3MgIiArIHNlbGYubmFtZQorCisgICAgZGVmIEdldEljb25OYW1lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmlzZnVuY3Rpb246CisgICAgICAgICAgICByZXR1cm4gInB5dGhvbiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiZm9sZGVyIgorCisgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gbm90IG5vdCBzZWxmLmNsLm1ldGhvZHMKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBHZXRTdWJMaXN0KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5jbDoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBzdWJsaXN0ID0gW10KKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5saXN0bWV0aG9kcygpOgorICAgICAgICAgICAgaXRlbSA9IE1ldGhvZEJyb3dzZXJUcmVlSXRlbShuYW1lLCBzZWxmLmNsLCBzZWxmLmZpbGUpCisgICAgICAgICAgICBzdWJsaXN0LmFwcGVuZChpdGVtKQorICAgICAgICByZXR1cm4gc3VibGlzdAorCisgICAgZGVmIE9uRG91YmxlQ2xpY2soc2VsZik6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmZpbGUpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVkaXQgPSBQeVNoZWxsLmZsaXN0Lm9wZW4oc2VsZi5maWxlKQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuY2wsICdsaW5lbm8nKToKKyAgICAgICAgICAgIGxpbmVubyA9IHNlbGYuY2wubGluZW5vCisgICAgICAgICAgICBlZGl0LmdvdG9saW5lKGxpbmVubykKKworICAgIGRlZiBsaXN0bWV0aG9kcyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuY2w6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBmb3IgbmFtZSwgbGluZW5vIGluIHNlbGYuY2wubWV0aG9kcy5pdGVtcygpOgorICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChsaW5lbm8sIG5hbWUpKQorICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgbGlzdCA9IFtdCisgICAgICAgIGZvciBpdGVtLCBuYW1lIGluIGl0ZW1zOgorICAgICAgICAgICAgbGlzdC5hcHBlbmQobmFtZSkKKyAgICAgICAgcmV0dXJuIGxpc3QKKworY2xhc3MgTWV0aG9kQnJvd3NlclRyZWVJdGVtKFRyZWVJdGVtKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBjbCwgZmlsZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5jbCA9IGNsCisgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKKworICAgIGRlZiBHZXRUZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gImRlZiAiICsgc2VsZi5uYW1lICsgIiguLi4pIgorCisgICAgZGVmIEdldEljb25OYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gInB5dGhvbiIgIyBYWFgKKworICAgIGRlZiBJc0V4cGFuZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgT25Eb3VibGVDbGljayhzZWxmKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuZmlsZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWRpdCA9IFB5U2hlbGwuZmxpc3Qub3BlbihzZWxmLmZpbGUpCisgICAgICAgIGVkaXQuZ290b2xpbmUoc2VsZi5jbC5tZXRob2RzW3NlbGYubmFtZV0pCisKK2RlZiBtYWluKCk6CisgICAgdHJ5OgorICAgICAgICBmaWxlID0gX19maWxlX18KKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBmaWxlID0gc3lzLmFyZ3ZbMF0KKyAgICAgICAgaWYgc3lzLmFyZ3ZbMTpdOgorICAgICAgICAgICAgZmlsZSA9IHN5cy5hcmd2WzFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlID0gc3lzLmFyZ3ZbMF0KKyAgICBkaXIsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KGZpbGUpCisgICAgbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoZmlsZSlbMF0KKyAgICBDbGFzc0Jyb3dzZXIoUHlTaGVsbC5mbGlzdCwgbmFtZSwgW2Rpcl0pCisgICAgaWYgc3lzLnN0ZGluIGlzIHN5cy5fX3N0ZGluX186CisgICAgICAgIG1haW5sb29wKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9DbGFzc0Jyb3dzZXIucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NsYXNzQnJvd3Nlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmZWU4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9DbGFzc0Jyb3dzZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9DbGFzc0Jyb3dzZXIucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NsYXNzQnJvd3Nlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmZWU4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9DbGFzc0Jyb3dzZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9Db2RlQ29udGV4dC5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Db2RlQ29udGV4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjZmNzM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvZGVDb250ZXh0LnB5CkBAIC0wLDAgKzEsMTc2IEBACisiIiJDb2RlQ29udGV4dCAtIEV4dGVuc2lvbiB0byBkaXNwbGF5IHRoZSBibG9jayBjb250ZXh0IGFib3ZlIHRoZSBlZGl0IHdpbmRvdworCitPbmNlIGNvZGUgaGFzIHNjcm9sbGVkIG9mZiB0aGUgdG9wIG9mIGEgd2luZG93LCBpdCBjYW4gYmUgZGlmZmljdWx0IHRvCitkZXRlcm1pbmUgd2hpY2ggYmxvY2sgeW91IGFyZSBpbi4gIFRoaXMgZXh0ZW5zaW9uIGltcGxlbWVudHMgYSBwYW5lIGF0IHRoZSB0b3AKK29mIGVhY2ggSURMRSBlZGl0IHdpbmRvdyB3aGljaCBwcm92aWRlcyBibG9jayBzdHJ1Y3R1cmUgaGludHMuICBUaGVzZSBoaW50cyBhcmUKK3RoZSBsaW5lcyB3aGljaCBjb250YWluIHRoZSBibG9jayBvcGVuaW5nIGtleXdvcmRzLCBlLmcuICdpZicsIGZvciB0aGUKK2VuY2xvc2luZyBibG9jay4gIFRoZSBudW1iZXIgb2YgaGludCBsaW5lcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBudW1saW5lcwordmFyaWFibGUgaW4gdGhlIENvZGVDb250ZXh0IHNlY3Rpb24gb2YgY29uZmlnLWV4dGVuc2lvbnMuZGVmLiBMaW5lcyB3aGljaCBkbworbm90IG9wZW4gYmxvY2tzIGFyZSBub3Qgc2hvd24gaW4gdGhlIGNvbnRleHQgaGludHMgcGFuZS4KKworIiIiCitpbXBvcnQgVGtpbnRlcgorZnJvbSBUa2NvbnN0YW50cyBpbXBvcnQgVE9QLCBMRUZULCBYLCBXLCBTVU5LRU4KK2ltcG9ydCByZQorZnJvbSBzeXMgaW1wb3J0IG1heGludCBhcyBJTkZJTklUWQorZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCisKK0JMT0NLT1BFTkVSUyA9IHNldChbImNsYXNzIiwgImRlZiIsICJlbGlmIiwgImVsc2UiLCAiZXhjZXB0IiwgImZpbmFsbHkiLCAiZm9yIiwKKyAgICAgICAgICAgICAgICAgICAgImlmIiwgInRyeSIsICJ3aGlsZSIsICJ3aXRoIl0pCitVUERBVEVJTlRFUlZBTCA9IDEwMCAjIG1pbGxpc2VjCitGT05UVVBEQVRFSU5URVJWQUwgPSAxMDAwICMgbWlsbGlzZWMKKworZ2V0c3BhY2VzZmlyc3R3b3JkID1cCisgICAgICAgICAgICAgICAgICAgbGFtYmRhIHMsIGM9cmUuY29tcGlsZShyIl4oXHMqKShcdyopIik6IGMubWF0Y2gocykuZ3JvdXBzKCkKKworY2xhc3MgQ29kZUNvbnRleHQ6CisgICAgbWVudWRlZnMgPSBbKCdvcHRpb25zJywgWygnIUNvZGUgQ29udGVfeHQnLCAnPDx0b2dnbGUtY29kZS1jb250ZXh0Pj4nKV0pXQorICAgIGNvbnRleHRfZGVwdGggPSBpZGxlQ29uZi5HZXRPcHRpb24oImV4dGVuc2lvbnMiLCAiQ29kZUNvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bWxpbmVzIiwgdHlwZT0iaW50IiwgZGVmYXVsdD0zKQorICAgIGJnY29sb3IgPSBpZGxlQ29uZi5HZXRPcHRpb24oImV4dGVuc2lvbnMiLCAiQ29kZUNvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJnY29sb3IiLCB0eXBlPSJzdHIiLCBkZWZhdWx0PSJMaWdodEdyYXkiKQorICAgIGZnY29sb3IgPSBpZGxlQ29uZi5HZXRPcHRpb24oImV4dGVuc2lvbnMiLCAiQ29kZUNvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZnY29sb3IiLCB0eXBlPSJzdHIiLCBkZWZhdWx0PSJCbGFjayIpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVkaXR3aW4pOgorICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCisgICAgICAgIHNlbGYudGV4dCA9IGVkaXR3aW4udGV4dAorICAgICAgICBzZWxmLnRleHRmb250ID0gc2VsZi50ZXh0WyJmb250Il0KKyAgICAgICAgc2VsZi5sYWJlbCA9IE5vbmUKKyAgICAgICAgIyBzZWxmLmluZm8gaXMgYSBsaXN0IG9mIChsaW5lIG51bWJlciwgaW5kZW50IGxldmVsLCBsaW5lIHRleHQsIGJsb2NrCisgICAgICAgICMga2V5d29yZCkgdHVwbGVzIHByb3ZpZGluZyB0aGUgYmxvY2sgc3RydWN0dXJlIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICAjIHNlbGYudG9wdmlzaWJsZSAodGhlIGxpbmVudW1iZXIgb2YgdGhlIGxpbmUgZGlzcGxheWVkIGF0IHRoZSB0b3Agb2YKKyAgICAgICAgIyB0aGUgZWRpdCB3aW5kb3cpLiBzZWxmLmluZm9bMF0gaXMgaW5pdGlhbGl6ZWQgYXMgYSAnZHVtbXknIGxpbmUgd2hpY2gKKyAgICAgICAgIyBzdGFydHMgdGhlIHRvcGxldmVsICdibG9jaycgb2YgdGhlIG1vZHVsZS4KKyAgICAgICAgc2VsZi5pbmZvID0gWygwLCAtMSwgIiIsIEZhbHNlKV0KKyAgICAgICAgc2VsZi50b3B2aXNpYmxlID0gMQorICAgICAgICB2aXNpYmxlID0gaWRsZUNvbmYuR2V0T3B0aW9uKCJleHRlbnNpb25zIiwgIkNvZGVDb250ZXh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlzaWJsZSIsIHR5cGU9ImJvb2wiLCBkZWZhdWx0PUZhbHNlKQorICAgICAgICBpZiB2aXNpYmxlOgorICAgICAgICAgICAgc2VsZi50b2dnbGVfY29kZV9jb250ZXh0X2V2ZW50KCkKKyAgICAgICAgICAgIHNlbGYuZWRpdHdpbi5zZXR2YXIoJzw8dG9nZ2xlLWNvZGUtY29udGV4dD4+JywgVHJ1ZSkKKyAgICAgICAgIyBTdGFydCB0d28gdXBkYXRlIGN5Y2xlcywgb25lIGZvciBjb250ZXh0IGxpbmVzLCBvbmUgZm9yIGZvbnQgY2hhbmdlcy4KKyAgICAgICAgc2VsZi50ZXh0LmFmdGVyKFVQREFURUlOVEVSVkFMLCBzZWxmLnRpbWVyX2V2ZW50KQorICAgICAgICBzZWxmLnRleHQuYWZ0ZXIoRk9OVFVQREFURUlOVEVSVkFMLCBzZWxmLmZvbnRfdGltZXJfZXZlbnQpCisKKyAgICBkZWYgdG9nZ2xlX2NvZGVfY29udGV4dF9ldmVudChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgbm90IHNlbGYubGFiZWw6CisgICAgICAgICAgICAjIENhbGN1bGF0ZSB0aGUgYm9yZGVyIHdpZHRoIGFuZCBob3Jpem9udGFsIHBhZGRpbmcgcmVxdWlyZWQgdG8KKyAgICAgICAgICAgICMgYWxpZ24gdGhlIGNvbnRleHQgd2l0aCB0aGUgdGV4dCBpbiB0aGUgbWFpbiBUZXh0IHdpZGdldC4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgQWxsIHZhbHVlcyBhcmUgcGFzc2VkIHRocm91Z2ggaW50KHN0cig8dmFsdWU+KSksIHNpbmNlIHNvbWUKKyAgICAgICAgICAgICMgdmFsdWVzIG1heSBiZSBwaXhlbCBvYmplY3RzLCB3aGljaCBjYW4ndCBzaW1wbHkgYmUgYWRkZWQgdG8gaW50cy4KKyAgICAgICAgICAgIHdpZGdldHMgPSBzZWxmLmVkaXR3aW4udGV4dCwgc2VsZi5lZGl0d2luLnRleHRfZnJhbWUKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSByZXF1aXJlZCB2ZXJ0aWNhbCBwYWRkaW5nCisgICAgICAgICAgICBwYWR4ID0gMAorICAgICAgICAgICAgZm9yIHdpZGdldCBpbiB3aWRnZXRzOgorICAgICAgICAgICAgICAgIHBhZHggKz0gaW50KHN0ciggd2lkZ2V0LnBhY2tfaW5mbygpWydwYWR4J10gKSkKKyAgICAgICAgICAgICAgICBwYWR4ICs9IGludChzdHIoIHdpZGdldC5jZ2V0KCdwYWR4JykgKSkKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSByZXF1aXJlZCBib3JkZXIgd2lkdGgKKyAgICAgICAgICAgIGJvcmRlciA9IDAKKyAgICAgICAgICAgIGZvciB3aWRnZXQgaW4gd2lkZ2V0czoKKyAgICAgICAgICAgICAgICBib3JkZXIgKz0gaW50KHN0ciggd2lkZ2V0LmNnZXQoJ2JvcmRlcicpICkpCisgICAgICAgICAgICBzZWxmLmxhYmVsID0gVGtpbnRlci5MYWJlbChzZWxmLmVkaXR3aW4udG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iXG4iICogKHNlbGYuY29udGV4dF9kZXB0aCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yPVcsIGp1c3RpZnk9TEVGVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQ9c2VsZi50ZXh0Zm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnPXNlbGYuYmdjb2xvciwgZmc9c2VsZi5mZ2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MSwgI2Rvbid0IHJlcXVlc3QgbW9yZSB0aGFuIHdlIGdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkeD1wYWR4LCBib3JkZXI9Ym9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVNVTktFTikKKyAgICAgICAgICAgICMgUGFjayB0aGUgbGFiZWwgd2lkZ2V0IGJlZm9yZSBhbmQgYWJvdmUgdGhlIHRleHRfZnJhbWUgd2lkZ2V0LAorICAgICAgICAgICAgIyB0aHVzIGVuc3VyaW5nIHRoYXQgaXQgd2lsbCBhcHBlYXIgZGlyZWN0bHkgYWJvdmUgdGV4dF9mcmFtZQorICAgICAgICAgICAgc2VsZi5sYWJlbC5wYWNrKHNpZGU9VE9QLCBmaWxsPVgsIGV4cGFuZD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmU9c2VsZi5lZGl0d2luLnRleHRfZnJhbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxhYmVsLmRlc3Ryb3koKQorICAgICAgICAgICAgc2VsZi5sYWJlbCA9IE5vbmUKKyAgICAgICAgaWRsZUNvbmYuU2V0T3B0aW9uKCJleHRlbnNpb25zIiwgIkNvZGVDb250ZXh0IiwgInZpc2libGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKHNlbGYubGFiZWwgaXMgbm90IE5vbmUpKQorICAgICAgICBpZGxlQ29uZi5TYXZlVXNlckNmZ0ZpbGVzKCkKKworICAgIGRlZiBnZXRfbGluZV9pbmZvKHNlbGYsIGxpbmVudW0pOgorICAgICAgICAiIiJHZXQgdGhlIGxpbmUgaW5kZW50IHZhbHVlLCB0ZXh0LCBhbmQgYW55IGJsb2NrIHN0YXJ0IGtleXdvcmQKKworICAgICAgICBJZiB0aGUgbGluZSBkb2VzIG5vdCBzdGFydCBhIGJsb2NrLCB0aGUga2V5d29yZCB2YWx1ZSBpcyBGYWxzZS4KKyAgICAgICAgVGhlIGluZGVudGF0aW9uIG9mIGVtcHR5IGxpbmVzIChvciBjb21tZW50IGxpbmVzKSBpcyBJTkZJTklUWS4KKworICAgICAgICAiIiIKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dC5nZXQoIiVkLjAiICUgbGluZW51bSwgIiVkLmVuZCIgJSBsaW5lbnVtKQorICAgICAgICBzcGFjZXMsIGZpcnN0d29yZCA9IGdldHNwYWNlc2ZpcnN0d29yZCh0ZXh0KQorICAgICAgICBvcGVuZXIgPSBmaXJzdHdvcmQgaW4gQkxPQ0tPUEVORVJTIGFuZCBmaXJzdHdvcmQKKyAgICAgICAgaWYgbGVuKHRleHQpID09IGxlbihzcGFjZXMpIG9yIHRleHRbbGVuKHNwYWNlcyldID09ICcjJzoKKyAgICAgICAgICAgIGluZGVudCA9IElORklOSVRZCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbmRlbnQgPSBsZW4oc3BhY2VzKQorICAgICAgICByZXR1cm4gaW5kZW50LCB0ZXh0LCBvcGVuZXIKKworICAgIGRlZiBnZXRfY29udGV4dChzZWxmLCBuZXdfdG9wdmlzaWJsZSwgc3RvcGxpbmU9MSwgc3RvcGluZGVudD0wKToKKyAgICAgICAgIiIiR2V0IGNvbnRleHQgbGluZXMsIHN0YXJ0aW5nIGF0IG5ld190b3B2aXNpYmxlIGFuZCB3b3JraW5nIGJhY2t3YXJkcy4KKworICAgICAgICBTdG9wIHdoZW4gc3RvcGxpbmUgb3Igc3RvcGluZGVudCBpcyByZWFjaGVkLiBSZXR1cm4gYSB0dXBsZSBvZiBjb250ZXh0CisgICAgICAgIGRhdGEgYW5kIHRoZSBpbmRlbnQgbGV2ZWwgYXQgdGhlIHRvcCBvZiB0aGUgcmVnaW9uIGluc3BlY3RlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IHN0b3BsaW5lID4gMAorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgICMgVGhlIGluZGVudGF0aW9uIGxldmVsIHdlIGFyZSBjdXJyZW50bHkgaW46CisgICAgICAgIGxhc3RpbmRlbnQgPSBJTkZJTklUWQorICAgICAgICAjIEZvciBhIGxpbmUgdG8gYmUgaW50ZXJlc3RpbmcsIGl0IG11c3QgYmVnaW4gd2l0aCBhIGJsb2NrIG9wZW5pbmcKKyAgICAgICAgIyBrZXl3b3JkLCBhbmQgaGF2ZSBsZXNzIGluZGVudGF0aW9uIHRoYW4gbGFzdGluZGVudC4KKyAgICAgICAgZm9yIGxpbmVudW0gaW4geHJhbmdlKG5ld190b3B2aXNpYmxlLCBzdG9wbGluZS0xLCAtMSk6CisgICAgICAgICAgICBpbmRlbnQsIHRleHQsIG9wZW5lciA9IHNlbGYuZ2V0X2xpbmVfaW5mbyhsaW5lbnVtKQorICAgICAgICAgICAgaWYgaW5kZW50IDwgbGFzdGluZGVudDoKKyAgICAgICAgICAgICAgICBsYXN0aW5kZW50ID0gaW5kZW50CisgICAgICAgICAgICAgICAgaWYgb3BlbmVyIGluICgiZWxzZSIsICJlbGlmIik6CisgICAgICAgICAgICAgICAgICAgICMgV2UgYWxzbyBzaG93IHRoZSBpZiBzdGF0ZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgbGFzdGluZGVudCArPSAxCisgICAgICAgICAgICAgICAgaWYgb3BlbmVyIGFuZCBsaW5lbnVtIDwgbmV3X3RvcHZpc2libGUgYW5kIGluZGVudCA+PSBzdG9waW5kZW50OgorICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoKGxpbmVudW0sIGluZGVudCwgdGV4dCwgb3BlbmVyKSkKKyAgICAgICAgICAgICAgICBpZiBsYXN0aW5kZW50IDw9IHN0b3BpbmRlbnQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGxpbmVzLnJldmVyc2UoKQorICAgICAgICByZXR1cm4gbGluZXMsIGxhc3RpbmRlbnQKKworICAgIGRlZiB1cGRhdGVfY29kZV9jb250ZXh0KHNlbGYpOgorICAgICAgICAiIiJVcGRhdGUgY29udGV4dCBpbmZvcm1hdGlvbiBhbmQgbGluZXMgdmlzaWJsZSBpbiB0aGUgY29udGV4dCBwYW5lLgorCisgICAgICAgICIiIgorICAgICAgICBuZXdfdG9wdmlzaWJsZSA9IGludChzZWxmLnRleHQuaW5kZXgoIkAwLDAiKS5zcGxpdCgnLicpWzBdKQorICAgICAgICBpZiBzZWxmLnRvcHZpc2libGUgPT0gbmV3X3RvcHZpc2libGU6ICAgICAgIyBoYXZlbid0IHNjcm9sbGVkCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi50b3B2aXNpYmxlIDwgbmV3X3RvcHZpc2libGU6ICAgICAgICMgc2Nyb2xsIGRvd24KKyAgICAgICAgICAgIGxpbmVzLCBsYXN0aW5kZW50ID0gc2VsZi5nZXRfY29udGV4dChuZXdfdG9wdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRvcHZpc2libGUpCisgICAgICAgICAgICAjIHJldGFpbiBvbmx5IGNvbnRleHQgaW5mbyBhcHBsaWNhYmxlIHRvIHRoZSByZWdpb24KKyAgICAgICAgICAgICMgYmV0d2VlbiB0b3B2aXNpYmxlIGFuZCBuZXdfdG9wdmlzaWJsZToKKyAgICAgICAgICAgIHdoaWxlIHNlbGYuaW5mb1stMV1bMV0gPj0gbGFzdGluZGVudDoKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5pbmZvWy0xXQorICAgICAgICBlbGlmIHNlbGYudG9wdmlzaWJsZSA+IG5ld190b3B2aXNpYmxlOiAgICAgIyBzY3JvbGwgdXAKKyAgICAgICAgICAgIHN0b3BpbmRlbnQgPSBzZWxmLmluZm9bLTFdWzFdICsgMQorICAgICAgICAgICAgIyByZXRhaW4gb25seSBjb250ZXh0IGluZm8gYXNzb2NpYXRlZAorICAgICAgICAgICAgIyB3aXRoIGxpbmVzIGFib3ZlIG5ld190b3B2aXNpYmxlOgorICAgICAgICAgICAgd2hpbGUgc2VsZi5pbmZvWy0xXVswXSA+PSBuZXdfdG9wdmlzaWJsZToKKyAgICAgICAgICAgICAgICBzdG9waW5kZW50ID0gc2VsZi5pbmZvWy0xXVsxXQorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmluZm9bLTFdCisgICAgICAgICAgICBsaW5lcywgbGFzdGluZGVudCA9IHNlbGYuZ2V0X2NvbnRleHQobmV3X3RvcHZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmZvWy0xXVswXSsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BpbmRlbnQpCisgICAgICAgIHNlbGYuaW5mby5leHRlbmQobGluZXMpCisgICAgICAgIHNlbGYudG9wdmlzaWJsZSA9IG5ld190b3B2aXNpYmxlCisgICAgICAgICMgZW1wdHkgbGluZXMgaW4gY29udGV4dCBwYW5lOgorICAgICAgICBjb250ZXh0X3N0cmluZ3MgPSBbIiJdICogbWF4KDAsIHNlbGYuY29udGV4dF9kZXB0aCAtIGxlbihzZWxmLmluZm8pKQorICAgICAgICAjIGZvbGxvd2VkIGJ5IHRoZSBjb250ZXh0IGhpbnQgbGluZXM6CisgICAgICAgIGNvbnRleHRfc3RyaW5ncyArPSBbeFsyXSBmb3IgeCBpbiBzZWxmLmluZm9bLXNlbGYuY29udGV4dF9kZXB0aDpdXQorICAgICAgICBzZWxmLmxhYmVsWyJ0ZXh0Il0gPSAnXG4nLmpvaW4oY29udGV4dF9zdHJpbmdzKQorCisgICAgZGVmIHRpbWVyX2V2ZW50KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmxhYmVsOgorICAgICAgICAgICAgc2VsZi51cGRhdGVfY29kZV9jb250ZXh0KCkKKyAgICAgICAgc2VsZi50ZXh0LmFmdGVyKFVQREFURUlOVEVSVkFMLCBzZWxmLnRpbWVyX2V2ZW50KQorCisgICAgZGVmIGZvbnRfdGltZXJfZXZlbnQoc2VsZik6CisgICAgICAgIG5ld3RleHRmb250ID0gc2VsZi50ZXh0WyJmb250Il0KKyAgICAgICAgaWYgc2VsZi5sYWJlbCBhbmQgbmV3dGV4dGZvbnQgIT0gc2VsZi50ZXh0Zm9udDoKKyAgICAgICAgICAgIHNlbGYudGV4dGZvbnQgPSBuZXd0ZXh0Zm9udAorICAgICAgICAgICAgc2VsZi5sYWJlbFsiZm9udCJdID0gc2VsZi50ZXh0Zm9udAorICAgICAgICBzZWxmLnRleHQuYWZ0ZXIoRk9OVFVQREFURUlOVEVSVkFMLCBzZWxmLmZvbnRfdGltZXJfZXZlbnQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ29kZUNvbnRleHQucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvZGVDb250ZXh0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjFiOTMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvZGVDb250ZXh0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ29kZUNvbnRleHQucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvZGVDb250ZXh0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWVkMjk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvZGVDb250ZXh0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0ODY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weQpAQCAtMCwwICsxLDI2OCBAQAoraW1wb3J0IHRpbWUKK2ltcG9ydCByZQoraW1wb3J0IGtleXdvcmQKK2ltcG9ydCBfX2J1aWx0aW5fXworZnJvbSBUa2ludGVyIGltcG9ydCAqCitmcm9tIGlkbGVsaWIuRGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorCitERUJVRyA9IEZhbHNlCisKK2RlZiBhbnkobmFtZSwgYWx0ZXJuYXRlcyk6CisgICAgIlJldHVybiBhIG5hbWVkIGdyb3VwIHBhdHRlcm4gbWF0Y2hpbmcgbGlzdCBvZiBhbHRlcm5hdGVzLiIKKyAgICByZXR1cm4gIig/UDwlcz4iICUgbmFtZSArICJ8Ii5qb2luKGFsdGVybmF0ZXMpICsgIikiCisKK2RlZiBtYWtlX3BhdCgpOgorICAgIGt3ID0gciJcYiIgKyBhbnkoIktFWVdPUkQiLCBrZXl3b3JkLmt3bGlzdCkgKyByIlxiIgorICAgIGJ1aWx0aW5saXN0ID0gW3N0cihuYW1lKSBmb3IgbmFtZSBpbiBkaXIoX19idWlsdGluX18pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpXQorICAgICMgc2VsZi5maWxlID0gZmlsZSgiZmlsZSIpIDoKKyAgICAjIDFzdCAnZmlsZScgY29sb3JpemVkIG5vcm1hbCwgMm5kIGFzIGJ1aWx0aW4sIDNyZCBhcyBzdHJpbmcKKyAgICBidWlsdGluID0gciIoW14uJ1wiXFwjXVxifF4pIiArIGFueSgiQlVJTFRJTiIsIGJ1aWx0aW5saXN0KSArIHIiXGIiCisgICAgY29tbWVudCA9IGFueSgiQ09NTUVOVCIsIFtyIiNbXlxuXSoiXSkKKyAgICBzdHJpbmdwcmVmaXggPSByIihcYnJ8dXx1cnxSfFV8VVJ8VXJ8dVJ8YnxCfGJyfEJyfGJSfEJSKT8iCisgICAgc3FzdHJpbmcgPSBzdHJpbmdwcmVmaXggKyByIidbXidcXFxuXSooXFwuW14nXFxcbl0qKSonPyIKKyAgICBkcXN0cmluZyA9IHN0cmluZ3ByZWZpeCArIHInIlteIlxcXG5dKihcXC5bXiJcXFxuXSopKiI/JworICAgIHNxM3N0cmluZyA9IHN0cmluZ3ByZWZpeCArIHIiJycnW14nXFxdKigoXFwufCcoPyEnJykpW14nXFxdKikqKCcnJyk/IgorICAgIGRxM3N0cmluZyA9IHN0cmluZ3ByZWZpeCArIHInIiIiW14iXFxdKigoXFwufCIoPyEiIikpW14iXFxdKikqKCIiIik/JworICAgIHN0cmluZyA9IGFueSgiU1RSSU5HIiwgW3NxM3N0cmluZywgZHEzc3RyaW5nLCBzcXN0cmluZywgZHFzdHJpbmddKQorICAgIHJldHVybiBrdyArICJ8IiArIGJ1aWx0aW4gKyAifCIgKyBjb21tZW50ICsgInwiICsgc3RyaW5nICtcCisgICAgICAgICAgICJ8IiArIGFueSgiU1lOQyIsIFtyIlxuIl0pCisKK3Byb2cgPSByZS5jb21waWxlKG1ha2VfcGF0KCksIHJlLlMpCitpZHByb2cgPSByZS5jb21waWxlKHIiXHMrKFx3KykiLCByZS5TKQorYXNwcm9nID0gcmUuY29tcGlsZShyIi4qP1xiKGFzKVxiIikKKworY2xhc3MgQ29sb3JEZWxlZ2F0b3IoRGVsZWdhdG9yKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgRGVsZWdhdG9yLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYucHJvZyA9IHByb2cKKyAgICAgICAgc2VsZi5pZHByb2cgPSBpZHByb2cKKyAgICAgICAgc2VsZi5hc3Byb2cgPSBhc3Byb2cKKyAgICAgICAgc2VsZi5Mb2FkVGFnRGVmcygpCisKKyAgICBkZWYgc2V0ZGVsZWdhdGUoc2VsZiwgZGVsZWdhdGUpOgorICAgICAgICBpZiBzZWxmLmRlbGVnYXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi51bmJpbmQoIjw8dG9nZ2xlLWF1dG8tY29sb3Jpbmc+PiIpCisgICAgICAgIERlbGVnYXRvci5zZXRkZWxlZ2F0ZShzZWxmLCBkZWxlZ2F0ZSkKKyAgICAgICAgaWYgZGVsZWdhdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNvbmZpZ19jb2xvcnMoKQorICAgICAgICAgICAgc2VsZi5iaW5kKCI8PHRvZ2dsZS1hdXRvLWNvbG9yaW5nPj4iLCBzZWxmLnRvZ2dsZV9jb2xvcml6ZV9ldmVudCkKKyAgICAgICAgICAgIHNlbGYubm90aWZ5X3JhbmdlKCIxLjAiLCAiZW5kIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgTm8gZGVsZWdhdGUgLSBzdG9wIGFueSBjb2xvcml6aW5nCisgICAgICAgICAgICBzZWxmLnN0b3BfY29sb3JpemluZyA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuYWxsb3dfY29sb3JpemluZyA9IEZhbHNlCisKKyAgICBkZWYgY29uZmlnX2NvbG9ycyhzZWxmKToKKyAgICAgICAgZm9yIHRhZywgY25mIGluIHNlbGYudGFnZGVmcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgY25mOgorICAgICAgICAgICAgICAgIHNlbGYudGFnX2NvbmZpZ3VyZSh0YWcsICoqY25mKQorICAgICAgICBzZWxmLnRhZ19yYWlzZSgnc2VsJykKKworICAgIGRlZiBMb2FkVGFnRGVmcyhzZWxmKToKKyAgICAgICAgdGhlbWUgPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdUaGVtZScsJ25hbWUnKQorICAgICAgICBzZWxmLnRhZ2RlZnMgPSB7CisgICAgICAgICAgICAiQ09NTUVOVCI6IGlkbGVDb25mLkdldEhpZ2hsaWdodCh0aGVtZSwgImNvbW1lbnQiKSwKKyAgICAgICAgICAgICJLRVlXT1JEIjogaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAia2V5d29yZCIpLAorICAgICAgICAgICAgIkJVSUxUSU4iOiBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICJidWlsdGluIiksCisgICAgICAgICAgICAiU1RSSU5HIjogaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAic3RyaW5nIiksCisgICAgICAgICAgICAiREVGSU5JVElPTiI6IGlkbGVDb25mLkdldEhpZ2hsaWdodCh0aGVtZSwgImRlZmluaXRpb24iKSwKKyAgICAgICAgICAgICJTWU5DIjogeydiYWNrZ3JvdW5kJzpOb25lLCdmb3JlZ3JvdW5kJzpOb25lfSwKKyAgICAgICAgICAgICJUT0RPIjogeydiYWNrZ3JvdW5kJzpOb25lLCdmb3JlZ3JvdW5kJzpOb25lfSwKKyAgICAgICAgICAgICJCUkVBSyI6IGlkbGVDb25mLkdldEhpZ2hsaWdodCh0aGVtZSwgImJyZWFrIiksCisgICAgICAgICAgICAiRVJST1IiOiBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICJlcnJvciIpLAorICAgICAgICAgICAgIyBUaGUgZm9sbG93aW5nIGlzIHVzZWQgYnkgUmVwbGFjZURpYWxvZzoKKyAgICAgICAgICAgICJoaXQiOiBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICJoaXQiKSwKKyAgICAgICAgICAgIH0KKworICAgICAgICBpZiBERUJVRzogcHJpbnQgJ3RhZ2RlZnMnLHNlbGYudGFnZGVmcworCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgY2hhcnMsIHRhZ3M9Tm9uZSk6CisgICAgICAgIGluZGV4ID0gc2VsZi5pbmRleChpbmRleCkKKyAgICAgICAgc2VsZi5kZWxlZ2F0ZS5pbnNlcnQoaW5kZXgsIGNoYXJzLCB0YWdzKQorICAgICAgICBzZWxmLm5vdGlmeV9yYW5nZShpbmRleCwgaW5kZXggKyAiKyVkYyIgJSBsZW4oY2hhcnMpKQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBpbmRleDEsIGluZGV4Mj1Ob25lKToKKyAgICAgICAgaW5kZXgxID0gc2VsZi5pbmRleChpbmRleDEpCisgICAgICAgIHNlbGYuZGVsZWdhdGUuZGVsZXRlKGluZGV4MSwgaW5kZXgyKQorICAgICAgICBzZWxmLm5vdGlmeV9yYW5nZShpbmRleDEpCisKKyAgICBhZnRlcl9pZCA9IE5vbmUKKyAgICBhbGxvd19jb2xvcml6aW5nID0gVHJ1ZQorICAgIGNvbG9yaXppbmcgPSBGYWxzZQorCisgICAgZGVmIG5vdGlmeV9yYW5nZShzZWxmLCBpbmRleDEsIGluZGV4Mj1Ob25lKToKKyAgICAgICAgc2VsZi50YWdfYWRkKCJUT0RPIiwgaW5kZXgxLCBpbmRleDIpCisgICAgICAgIGlmIHNlbGYuYWZ0ZXJfaWQ6CisgICAgICAgICAgICBpZiBERUJVRzogcHJpbnQgImNvbG9yaXppbmcgYWxyZWFkeSBzY2hlZHVsZWQiCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5jb2xvcml6aW5nOgorICAgICAgICAgICAgc2VsZi5zdG9wX2NvbG9yaXppbmcgPSBUcnVlCisgICAgICAgICAgICBpZiBERUJVRzogcHJpbnQgInN0b3AgY29sb3JpemluZyIKKyAgICAgICAgaWYgc2VsZi5hbGxvd19jb2xvcml6aW5nOgorICAgICAgICAgICAgaWYgREVCVUc6IHByaW50ICJzY2hlZHVsZSBjb2xvcml6aW5nIgorICAgICAgICAgICAgc2VsZi5hZnRlcl9pZCA9IHNlbGYuYWZ0ZXIoMSwgc2VsZi5yZWNvbG9yaXplKQorCisgICAgY2xvc2Vfd2hlbl9kb25lID0gTm9uZSAjIFdpbmRvdyB0byBiZSBjbG9zZWQgd2hlbiBkb25lIGNvbG9yaXppbmcKKworICAgIGRlZiBjbG9zZShzZWxmLCBjbG9zZV93aGVuX2RvbmU9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuYWZ0ZXJfaWQ6CisgICAgICAgICAgICBhZnRlcl9pZCA9IHNlbGYuYWZ0ZXJfaWQKKyAgICAgICAgICAgIHNlbGYuYWZ0ZXJfaWQgPSBOb25lCisgICAgICAgICAgICBpZiBERUJVRzogcHJpbnQgImNhbmNlbCBzY2hlZHVsZWQgcmVjb2xvcml6ZXIiCisgICAgICAgICAgICBzZWxmLmFmdGVyX2NhbmNlbChhZnRlcl9pZCkKKyAgICAgICAgc2VsZi5hbGxvd19jb2xvcml6aW5nID0gRmFsc2UKKyAgICAgICAgc2VsZi5zdG9wX2NvbG9yaXppbmcgPSBUcnVlCisgICAgICAgIGlmIGNsb3NlX3doZW5fZG9uZToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvbG9yaXppbmc6CisgICAgICAgICAgICAgICAgY2xvc2Vfd2hlbl9kb25lLmRlc3Ryb3koKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlX3doZW5fZG9uZSA9IGNsb3NlX3doZW5fZG9uZQorCisgICAgZGVmIHRvZ2dsZV9jb2xvcml6ZV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGlmIHNlbGYuYWZ0ZXJfaWQ6CisgICAgICAgICAgICBhZnRlcl9pZCA9IHNlbGYuYWZ0ZXJfaWQKKyAgICAgICAgICAgIHNlbGYuYWZ0ZXJfaWQgPSBOb25lCisgICAgICAgICAgICBpZiBERUJVRzogcHJpbnQgImNhbmNlbCBzY2hlZHVsZWQgcmVjb2xvcml6ZXIiCisgICAgICAgICAgICBzZWxmLmFmdGVyX2NhbmNlbChhZnRlcl9pZCkKKyAgICAgICAgaWYgc2VsZi5hbGxvd19jb2xvcml6aW5nIGFuZCBzZWxmLmNvbG9yaXppbmc6CisgICAgICAgICAgICBpZiBERUJVRzogcHJpbnQgInN0b3AgY29sb3JpemluZyIKKyAgICAgICAgICAgIHNlbGYuc3RvcF9jb2xvcml6aW5nID0gVHJ1ZQorICAgICAgICBzZWxmLmFsbG93X2NvbG9yaXppbmcgPSBub3Qgc2VsZi5hbGxvd19jb2xvcml6aW5nCisgICAgICAgIGlmIHNlbGYuYWxsb3dfY29sb3JpemluZyBhbmQgbm90IHNlbGYuY29sb3JpemluZzoKKyAgICAgICAgICAgIHNlbGYuYWZ0ZXJfaWQgPSBzZWxmLmFmdGVyKDEsIHNlbGYucmVjb2xvcml6ZSkKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBwcmludCAiYXV0byBjb2xvcml6aW5nIHR1cm5lZCIsXAorICAgICAgICAgICAgICAgICAgc2VsZi5hbGxvd19jb2xvcml6aW5nIGFuZCAib24iIG9yICJvZmYiCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgcmVjb2xvcml6ZShzZWxmKToKKyAgICAgICAgc2VsZi5hZnRlcl9pZCA9IE5vbmUKKyAgICAgICAgaWYgbm90IHNlbGYuZGVsZWdhdGU6CisgICAgICAgICAgICBpZiBERUJVRzogcHJpbnQgIm5vIGRlbGVnYXRlIgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBzZWxmLmFsbG93X2NvbG9yaXppbmc6CisgICAgICAgICAgICBpZiBERUJVRzogcHJpbnQgImF1dG8gY29sb3JpemluZyBpcyBvZmYiCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5jb2xvcml6aW5nOgorICAgICAgICAgICAgaWYgREVCVUc6IHByaW50ICJhbHJlYWR5IGNvbG9yaXppbmciCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zdG9wX2NvbG9yaXppbmcgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5jb2xvcml6aW5nID0gVHJ1ZQorICAgICAgICAgICAgaWYgREVCVUc6IHByaW50ICJjb2xvcml6aW5nLi4uIgorICAgICAgICAgICAgdDAgPSB0aW1lLmNsb2NrKCkKKyAgICAgICAgICAgIHNlbGYucmVjb2xvcml6ZV9tYWluKCkKKyAgICAgICAgICAgIHQxID0gdGltZS5jbG9jaygpCisgICAgICAgICAgICBpZiBERUJVRzogcHJpbnQgIiUuM2Ygc2Vjb25kcyIgJSAodDEtdDApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNvbG9yaXppbmcgPSBGYWxzZQorICAgICAgICBpZiBzZWxmLmFsbG93X2NvbG9yaXppbmcgYW5kIHNlbGYudGFnX25leHRyYW5nZSgiVE9ETyIsICIxLjAiKToKKyAgICAgICAgICAgIGlmIERFQlVHOiBwcmludCAicmVzY2hlZHVsZSBjb2xvcml6aW5nIgorICAgICAgICAgICAgc2VsZi5hZnRlcl9pZCA9IHNlbGYuYWZ0ZXIoMSwgc2VsZi5yZWNvbG9yaXplKQorICAgICAgICBpZiBzZWxmLmNsb3NlX3doZW5fZG9uZToKKyAgICAgICAgICAgIHRvcCA9IHNlbGYuY2xvc2Vfd2hlbl9kb25lCisgICAgICAgICAgICBzZWxmLmNsb3NlX3doZW5fZG9uZSA9IE5vbmUKKyAgICAgICAgICAgIHRvcC5kZXN0cm95KCkKKworICAgIGRlZiByZWNvbG9yaXplX21haW4oc2VsZik6CisgICAgICAgIG5leHQgPSAiMS4wIgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaXRlbSA9IHNlbGYudGFnX25leHRyYW5nZSgiVE9ETyIsIG5leHQpCisgICAgICAgICAgICBpZiBub3QgaXRlbToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaGVhZCwgdGFpbCA9IGl0ZW0KKyAgICAgICAgICAgIHNlbGYudGFnX3JlbW92ZSgiU1lOQyIsIGhlYWQsIHRhaWwpCisgICAgICAgICAgICBpdGVtID0gc2VsZi50YWdfcHJldnJhbmdlKCJTWU5DIiwgaGVhZCkKKyAgICAgICAgICAgIGlmIGl0ZW06CisgICAgICAgICAgICAgICAgaGVhZCA9IGl0ZW1bMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaGVhZCA9ICIxLjAiCisKKyAgICAgICAgICAgIGNoYXJzID0gIiIKKyAgICAgICAgICAgIG5leHQgPSBoZWFkCisgICAgICAgICAgICBsaW5lc190b19nZXQgPSAxCisgICAgICAgICAgICBvayA9IEZhbHNlCisgICAgICAgICAgICB3aGlsZSBub3Qgb2s6CisgICAgICAgICAgICAgICAgbWFyayA9IG5leHQKKyAgICAgICAgICAgICAgICBuZXh0ID0gc2VsZi5pbmRleChtYXJrICsgIislZCBsaW5lcyBsaW5lc3RhcnQiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNfdG9fZ2V0KQorICAgICAgICAgICAgICAgIGxpbmVzX3RvX2dldCA9IG1pbihsaW5lc190b19nZXQgKiAyLCAxMDApCisgICAgICAgICAgICAgICAgb2sgPSAiU1lOQyIgaW4gc2VsZi50YWdfbmFtZXMobmV4dCArICItMWMiKQorICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLmdldChtYXJrLCBuZXh0KQorICAgICAgICAgICAgICAgICMjcHJpbnQgaGVhZCwgImdldCIsIG1hcmssIG5leHQsICItPiIsIHJlcHIobGluZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZm9yIHRhZyBpbiBzZWxmLnRhZ2RlZnMua2V5cygpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRhZ19yZW1vdmUodGFnLCBtYXJrLCBuZXh0KQorICAgICAgICAgICAgICAgIGNoYXJzID0gY2hhcnMgKyBsaW5lCisgICAgICAgICAgICAgICAgbSA9IHNlbGYucHJvZy5zZWFyY2goY2hhcnMpCisgICAgICAgICAgICAgICAgd2hpbGUgbToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gbS5ncm91cGRpY3QoKS5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwgYiA9IG0uc3BhbihrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50YWdfYWRkKGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCArICIrJWRjIiAlIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgKyAiKyVkYyIgJSBiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlIGluICgiZGVmIiwgImNsYXNzIik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0xID0gc2VsZi5pZHByb2cubWF0Y2goY2hhcnMsIGIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG0xOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSwgYiA9IG0xLnNwYW4oMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFnX2FkZCgiREVGSU5JVElPTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCArICIrJWRjIiAlIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCArICIrJWRjIiAlIGIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiB2YWx1ZSA9PSAiaW1wb3J0IjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb2xvciBhbGwgdGhlICJhcyIgd29yZHMgb24gc2FtZSBsaW5lLCBleGNlcHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBpbiBhIGNvbW1lbnQ7IGNoZWFwIGFwcHJveGltYXRpb24gdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdHJ1dGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJyMnIGluIGNoYXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9zID0gY2hhcnMuaW5kZXgoJyMnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9zID0gbGVuKGNoYXJzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTEgPSBzZWxmLmFzcHJvZy5tYXRjaChjaGFycywgYiwgZW5kcG9zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG0xOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLCBiID0gbTEuc3BhbigxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50YWdfYWRkKCJLRVlXT1JEIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICsgIislZGMiICUgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICsgIislZGMiICUgYikKKyAgICAgICAgICAgICAgICAgICAgbSA9IHNlbGYucHJvZy5zZWFyY2goY2hhcnMsIG0uZW5kKCkpCisgICAgICAgICAgICAgICAgaWYgIlNZTkMiIGluIHNlbGYudGFnX25hbWVzKG5leHQgKyAiLTFjIik6CisgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBuZXh0CisgICAgICAgICAgICAgICAgICAgIGNoYXJzID0gIiIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvayA9IEZhbHNlCisgICAgICAgICAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgICAgICAgICAjIFdlJ3JlIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSwgYW5kIHRoZSBjYWxsIHRvCisgICAgICAgICAgICAgICAgICAgICMgdXBkYXRlIG1heSB0ZWxsIHVzIHRvIHN0b3AuICBJdCBtYXkgYWxzbyBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgIm5leHQiIChzaW5jZSB0aGlzIGlzIGEKKyAgICAgICAgICAgICAgICAgICAgIyBsaW5lLmNvbCBzdHJpbmcsIG5vdCBhIHRydWUgbWFyaykuICBTbyBsZWF2ZSBhCisgICAgICAgICAgICAgICAgICAgICMgY3J1bWIgdGVsbGluZyB0aGUgbmV4dCBpbnZvY2F0aW9uIHRvIHJlc3VtZSBoZXJlCisgICAgICAgICAgICAgICAgICAgICMgaW4gY2FzZSB1cGRhdGUgdGVsbHMgdXMgdG8gbGVhdmUuCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGFnX2FkZCgiVE9ETyIsIG5leHQpCisgICAgICAgICAgICAgICAgc2VsZi51cGRhdGUoKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RvcF9jb2xvcml6aW5nOgorICAgICAgICAgICAgICAgICAgICBpZiBERUJVRzogcHJpbnQgImNvbG9yaXppbmcgc3RvcHBlZCIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgcmVtb3ZlY29sb3JzKHNlbGYpOgorICAgICAgICBmb3IgdGFnIGluIHNlbGYudGFnZGVmcy5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLnRhZ19yZW1vdmUodGFnLCAiMS4wIiwgImVuZCIpCisKK2RlZiBtYWluKCk6CisgICAgZnJvbSBpZGxlbGliLlBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKKyAgICByb290ID0gVGsoKQorICAgIHJvb3Qud21fcHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCByb290LnF1aXQpCisgICAgdGV4dCA9IFRleHQoYmFja2dyb3VuZD0id2hpdGUiKQorICAgIHRleHQucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCisgICAgdGV4dC5mb2N1c19zZXQoKQorICAgIHAgPSBQZXJjb2xhdG9yKHRleHQpCisgICAgZCA9IENvbG9yRGVsZWdhdG9yKCkKKyAgICBwLmluc2VydGZpbHRlcihkKQorICAgIHJvb3QubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxZDRjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxZDRjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0RlYnVnZ2VyLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0RlYnVnZ2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZWVhMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRGVidWdnZXIucHkKQEAgLTAsMCArMSw0ODEgQEAKK2ltcG9ydCBvcworaW1wb3J0IGJkYgoraW1wb3J0IHR5cGVzCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKK2Zyb20gaWRsZWxpYi5XaW5kb3dMaXN0IGltcG9ydCBMaXN0ZWRUb3BsZXZlbAorZnJvbSBpZGxlbGliLlNjcm9sbGVkTGlzdCBpbXBvcnQgU2Nyb2xsZWRMaXN0Citmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKKworCitjbGFzcyBJZGIoYmRiLkJkYik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZ3VpKToKKyAgICAgICAgc2VsZi5ndWkgPSBndWkKKyAgICAgICAgYmRiLkJkYi5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIHVzZXJfbGluZShzZWxmLCBmcmFtZSk6CisgICAgICAgIGlmIHNlbGYuaW5fcnBjX2NvZGUoZnJhbWUpOgorICAgICAgICAgICAgc2VsZi5zZXRfc3RlcCgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbWVzc2FnZSA9IHNlbGYuX19mcmFtZTJtZXNzYWdlKGZyYW1lKQorICAgICAgICBzZWxmLmd1aS5pbnRlcmFjdGlvbihtZXNzYWdlLCBmcmFtZSkKKworICAgIGRlZiB1c2VyX2V4Y2VwdGlvbihzZWxmLCBmcmFtZSwgaW5mbyk6CisgICAgICAgIGlmIHNlbGYuaW5fcnBjX2NvZGUoZnJhbWUpOgorICAgICAgICAgICAgc2VsZi5zZXRfc3RlcCgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbWVzc2FnZSA9IHNlbGYuX19mcmFtZTJtZXNzYWdlKGZyYW1lKQorICAgICAgICBzZWxmLmd1aS5pbnRlcmFjdGlvbihtZXNzYWdlLCBmcmFtZSwgaW5mbykKKworICAgIGRlZiBpbl9ycGNfY29kZShzZWxmLCBmcmFtZSk6CisgICAgICAgIGlmIGZyYW1lLmZfY29kZS5jb19maWxlbmFtZS5jb3VudCgncnBjLnB5Jyk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJldl9mcmFtZSA9IGZyYW1lLmZfYmFjaworICAgICAgICAgICAgaWYgcHJldl9mcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUuY291bnQoJ0RlYnVnZ2VyLnB5Jyk6CisgICAgICAgICAgICAgICAgIyAodGhhdCB0ZXN0IHdpbGwgY2F0Y2ggYm90aCBEZWJ1Z2dlci5weSBhbmQgUmVtb3RlRGVidWdnZXIucHkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICByZXR1cm4gc2VsZi5pbl9ycGNfY29kZShwcmV2X2ZyYW1lKQorCisgICAgZGVmIF9fZnJhbWUybWVzc2FnZShzZWxmLCBmcmFtZSk6CisgICAgICAgIGNvZGUgPSBmcmFtZS5mX2NvZGUKKyAgICAgICAgZmlsZW5hbWUgPSBjb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgIGxpbmVubyA9IGZyYW1lLmZfbGluZW5vCisgICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKKyAgICAgICAgbWVzc2FnZSA9ICIlczolcyIgJSAoYmFzZW5hbWUsIGxpbmVubykKKyAgICAgICAgaWYgY29kZS5jb19uYW1lICE9ICI/IjoKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiJXM6ICVzKCkiICUgKG1lc3NhZ2UsIGNvZGUuY29fbmFtZSkKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UKKworCitjbGFzcyBEZWJ1Z2dlcjoKKworICAgIHZzdGFjayA9IHZzb3VyY2UgPSB2bG9jYWxzID0gdmdsb2JhbHMgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHlzaGVsbCwgaWRiPU5vbmUpOgorICAgICAgICBpZiBpZGIgaXMgTm9uZToKKyAgICAgICAgICAgIGlkYiA9IElkYihzZWxmKQorICAgICAgICBzZWxmLnB5c2hlbGwgPSBweXNoZWxsCisgICAgICAgIHNlbGYuaWRiID0gaWRiCisgICAgICAgIHNlbGYuZnJhbWUgPSBOb25lCisgICAgICAgIHNlbGYubWFrZV9ndWkoKQorICAgICAgICBzZWxmLmludGVyYWN0aW5nID0gMAorCisgICAgZGVmIHJ1bihzZWxmLCAqYXJncyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuaW50ZXJhY3RpbmcgPSAxCisgICAgICAgICAgICByZXR1cm4gc2VsZi5pZGIucnVuKCphcmdzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5pbnRlcmFjdGluZyA9IDAKKworICAgIGRlZiBjbG9zZShzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5pbnRlcmFjdGluZzoKKyAgICAgICAgICAgIHNlbGYudG9wLmJlbGwoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuc3RhY2t2aWV3ZXI6CisgICAgICAgICAgICBzZWxmLnN0YWNrdmlld2VyLmNsb3NlKCk7IHNlbGYuc3RhY2t2aWV3ZXIgPSBOb25lCisgICAgICAgICMgQ2xlYW4gdXAgcHlzaGVsbCBpZiB1c2VyIGNsaWNrZWQgZGVidWdnZXIgY29udHJvbCBjbG9zZSB3aWRnZXQuCisgICAgICAgICMgKENhdXNlcyBhIGhhcm1sZXNzIGV4dHJhIGN5Y2xlIHRocm91Z2ggY2xvc2VfZGVidWdnZXIoKSBpZiB1c2VyCisgICAgICAgICMgdG9nZ2xlZCBkZWJ1Z2dlciBmcm9tIHB5c2hlbGwgRGVidWcgbWVudSkKKyAgICAgICAgc2VsZi5weXNoZWxsLmNsb3NlX2RlYnVnZ2VyKCkKKyAgICAgICAgIyBOb3cgY2xvc2UgdGhlIGRlYnVnZ2VyIGNvbnRyb2wgd2luZG93Li4uLgorICAgICAgICBzZWxmLnRvcC5kZXN0cm95KCkKKworICAgIGRlZiBtYWtlX2d1aShzZWxmKToKKyAgICAgICAgcHlzaGVsbCA9IHNlbGYucHlzaGVsbAorICAgICAgICBzZWxmLmZsaXN0ID0gcHlzaGVsbC5mbGlzdAorICAgICAgICBzZWxmLnJvb3QgPSByb290ID0gcHlzaGVsbC5yb290CisgICAgICAgIHNlbGYudG9wID0gdG9wID0gTGlzdGVkVG9wbGV2ZWwocm9vdCkKKyAgICAgICAgc2VsZi50b3Aud21fdGl0bGUoIkRlYnVnIENvbnRyb2wiKQorICAgICAgICBzZWxmLnRvcC53bV9pY29ubmFtZSgiRGVidWciKQorICAgICAgICB0b3Aud21fcHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLmNsb3NlKQorICAgICAgICBzZWxmLnRvcC5iaW5kKCI8RXNjYXBlPiIsIHNlbGYuY2xvc2UpCisgICAgICAgICMKKyAgICAgICAgc2VsZi5iZnJhbWUgPSBiZnJhbWUgPSBGcmFtZSh0b3ApCisgICAgICAgIHNlbGYuYmZyYW1lLnBhY2soYW5jaG9yPSJ3IikKKyAgICAgICAgc2VsZi5idXR0b25zID0gYmwgPSBbXQorICAgICAgICAjCisgICAgICAgIHNlbGYuYmNvbnQgPSBiID0gQnV0dG9uKGJmcmFtZSwgdGV4dD0iR28iLCBjb21tYW5kPXNlbGYuY29udCkKKyAgICAgICAgYmwuYXBwZW5kKGIpCisgICAgICAgIHNlbGYuYnN0ZXAgPSBiID0gQnV0dG9uKGJmcmFtZSwgdGV4dD0iU3RlcCIsIGNvbW1hbmQ9c2VsZi5zdGVwKQorICAgICAgICBibC5hcHBlbmQoYikKKyAgICAgICAgc2VsZi5ibmV4dCA9IGIgPSBCdXR0b24oYmZyYW1lLCB0ZXh0PSJPdmVyIiwgY29tbWFuZD1zZWxmLm5leHQpCisgICAgICAgIGJsLmFwcGVuZChiKQorICAgICAgICBzZWxmLmJyZXQgPSBiID0gQnV0dG9uKGJmcmFtZSwgdGV4dD0iT3V0IiwgY29tbWFuZD1zZWxmLnJldCkKKyAgICAgICAgYmwuYXBwZW5kKGIpCisgICAgICAgIHNlbGYuYnJldCA9IGIgPSBCdXR0b24oYmZyYW1lLCB0ZXh0PSJRdWl0IiwgY29tbWFuZD1zZWxmLnF1aXQpCisgICAgICAgIGJsLmFwcGVuZChiKQorICAgICAgICAjCisgICAgICAgIGZvciBiIGluIGJsOgorICAgICAgICAgICAgYi5jb25maWd1cmUoc3RhdGU9ImRpc2FibGVkIikKKyAgICAgICAgICAgIGIucGFjayhzaWRlPSJsZWZ0IikKKyAgICAgICAgIworICAgICAgICBzZWxmLmNmcmFtZSA9IGNmcmFtZSA9IEZyYW1lKGJmcmFtZSkKKyAgICAgICAgc2VsZi5jZnJhbWUucGFjayhzaWRlPSJsZWZ0IikKKyAgICAgICAgIworICAgICAgICBpZiBub3Qgc2VsZi52c3RhY2s6CisgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy52c3RhY2sgPSBCb29sZWFuVmFyKHRvcCkKKyAgICAgICAgICAgIHNlbGYudnN0YWNrLnNldCgxKQorICAgICAgICBzZWxmLmJzdGFjayA9IENoZWNrYnV0dG9uKGNmcmFtZSwKKyAgICAgICAgICAgIHRleHQ9IlN0YWNrIiwgY29tbWFuZD1zZWxmLnNob3dfc3RhY2ssIHZhcmlhYmxlPXNlbGYudnN0YWNrKQorICAgICAgICBzZWxmLmJzdGFjay5ncmlkKHJvdz0wLCBjb2x1bW49MCkKKyAgICAgICAgaWYgbm90IHNlbGYudnNvdXJjZToKKyAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLnZzb3VyY2UgPSBCb29sZWFuVmFyKHRvcCkKKyAgICAgICAgc2VsZi5ic291cmNlID0gQ2hlY2tidXR0b24oY2ZyYW1lLAorICAgICAgICAgICAgdGV4dD0iU291cmNlIiwgY29tbWFuZD1zZWxmLnNob3dfc291cmNlLCB2YXJpYWJsZT1zZWxmLnZzb3VyY2UpCisgICAgICAgIHNlbGYuYnNvdXJjZS5ncmlkKHJvdz0wLCBjb2x1bW49MSkKKyAgICAgICAgaWYgbm90IHNlbGYudmxvY2FsczoKKyAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLnZsb2NhbHMgPSBCb29sZWFuVmFyKHRvcCkKKyAgICAgICAgICAgIHNlbGYudmxvY2Fscy5zZXQoMSkKKyAgICAgICAgc2VsZi5ibG9jYWxzID0gQ2hlY2tidXR0b24oY2ZyYW1lLAorICAgICAgICAgICAgdGV4dD0iTG9jYWxzIiwgY29tbWFuZD1zZWxmLnNob3dfbG9jYWxzLCB2YXJpYWJsZT1zZWxmLnZsb2NhbHMpCisgICAgICAgIHNlbGYuYmxvY2Fscy5ncmlkKHJvdz0xLCBjb2x1bW49MCkKKyAgICAgICAgaWYgbm90IHNlbGYudmdsb2JhbHM6CisgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy52Z2xvYmFscyA9IEJvb2xlYW5WYXIodG9wKQorICAgICAgICBzZWxmLmJnbG9iYWxzID0gQ2hlY2tidXR0b24oY2ZyYW1lLAorICAgICAgICAgICAgdGV4dD0iR2xvYmFscyIsIGNvbW1hbmQ9c2VsZi5zaG93X2dsb2JhbHMsIHZhcmlhYmxlPXNlbGYudmdsb2JhbHMpCisgICAgICAgIHNlbGYuYmdsb2JhbHMuZ3JpZChyb3c9MSwgY29sdW1uPTEpCisgICAgICAgICMKKyAgICAgICAgc2VsZi5zdGF0dXMgPSBMYWJlbCh0b3AsIGFuY2hvcj0idyIpCisgICAgICAgIHNlbGYuc3RhdHVzLnBhY2soYW5jaG9yPSJ3IikKKyAgICAgICAgc2VsZi5lcnJvciA9IExhYmVsKHRvcCwgYW5jaG9yPSJ3IikKKyAgICAgICAgc2VsZi5lcnJvci5wYWNrKGFuY2hvcj0idyIsIGZpbGw9IngiKQorICAgICAgICBzZWxmLmVycm9yYmcgPSBzZWxmLmVycm9yLmNnZXQoImJhY2tncm91bmQiKQorICAgICAgICAjCisgICAgICAgIHNlbGYuZnN0YWNrID0gRnJhbWUodG9wLCBoZWlnaHQ9MSkKKyAgICAgICAgc2VsZi5mc3RhY2sucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCisgICAgICAgIHNlbGYuZmxvY2FscyA9IEZyYW1lKHRvcCkKKyAgICAgICAgc2VsZi5mbG9jYWxzLnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQorICAgICAgICBzZWxmLmZnbG9iYWxzID0gRnJhbWUodG9wLCBoZWlnaHQ9MSkKKyAgICAgICAgc2VsZi5mZ2xvYmFscy5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKKyAgICAgICAgIworICAgICAgICBpZiBzZWxmLnZzdGFjay5nZXQoKToKKyAgICAgICAgICAgIHNlbGYuc2hvd19zdGFjaygpCisgICAgICAgIGlmIHNlbGYudmxvY2Fscy5nZXQoKToKKyAgICAgICAgICAgIHNlbGYuc2hvd19sb2NhbHMoKQorICAgICAgICBpZiBzZWxmLnZnbG9iYWxzLmdldCgpOgorICAgICAgICAgICAgc2VsZi5zaG93X2dsb2JhbHMoKQorCisgICAgZGVmIGludGVyYWN0aW9uKHNlbGYsIG1lc3NhZ2UsIGZyYW1lLCBpbmZvPU5vbmUpOgorICAgICAgICBzZWxmLmZyYW1lID0gZnJhbWUKKyAgICAgICAgc2VsZi5zdGF0dXMuY29uZmlndXJlKHRleHQ9bWVzc2FnZSkKKyAgICAgICAgIworICAgICAgICBpZiBpbmZvOgorICAgICAgICAgICAgdHlwZSwgdmFsdWUsIHRiID0gaW5mbworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG0xID0gdHlwZS5fX25hbWVfXworICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIG0xID0gIiVzIiAlIHN0cih0eXBlKQorICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBtMSA9ICIlczogJXMiICUgKG0xLCBzdHIodmFsdWUpKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgYmcgPSAieWVsbG93IgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbTEgPSAiIgorICAgICAgICAgICAgdGIgPSBOb25lCisgICAgICAgICAgICBiZyA9IHNlbGYuZXJyb3JiZworICAgICAgICBzZWxmLmVycm9yLmNvbmZpZ3VyZSh0ZXh0PW0xLCBiYWNrZ3JvdW5kPWJnKQorICAgICAgICAjCisgICAgICAgIHN2ID0gc2VsZi5zdGFja3ZpZXdlcgorICAgICAgICBpZiBzdjoKKyAgICAgICAgICAgIHN0YWNrLCBpID0gc2VsZi5pZGIuZ2V0X3N0YWNrKHNlbGYuZnJhbWUsIHRiKQorICAgICAgICAgICAgc3YubG9hZF9zdGFjayhzdGFjaywgaSkKKyAgICAgICAgIworICAgICAgICBzZWxmLnNob3dfdmFyaWFibGVzKDEpCisgICAgICAgICMKKyAgICAgICAgaWYgc2VsZi52c291cmNlLmdldCgpOgorICAgICAgICAgICAgc2VsZi5zeW5jX3NvdXJjZV9saW5lKCkKKyAgICAgICAgIworICAgICAgICBmb3IgYiBpbiBzZWxmLmJ1dHRvbnM6CisgICAgICAgICAgICBiLmNvbmZpZ3VyZShzdGF0ZT0ibm9ybWFsIikKKyAgICAgICAgIworICAgICAgICBzZWxmLnRvcC53YWtldXAoKQorICAgICAgICBzZWxmLnJvb3QubWFpbmxvb3AoKQorICAgICAgICAjCisgICAgICAgIGZvciBiIGluIHNlbGYuYnV0dG9uczoKKyAgICAgICAgICAgIGIuY29uZmlndXJlKHN0YXRlPSJkaXNhYmxlZCIpCisgICAgICAgIHNlbGYuc3RhdHVzLmNvbmZpZ3VyZSh0ZXh0PSIiKQorICAgICAgICBzZWxmLmVycm9yLmNvbmZpZ3VyZSh0ZXh0PSIiLCBiYWNrZ3JvdW5kPXNlbGYuZXJyb3JiZykKKyAgICAgICAgc2VsZi5mcmFtZSA9IE5vbmUKKworICAgIGRlZiBzeW5jX3NvdXJjZV9saW5lKHNlbGYpOgorICAgICAgICBmcmFtZSA9IHNlbGYuZnJhbWUKKyAgICAgICAgaWYgbm90IGZyYW1lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZpbGVuYW1lLCBsaW5lbm8gPSBzZWxmLl9fZnJhbWUyZmlsZWxpbmUoZnJhbWUpCisgICAgICAgIGlmIGZpbGVuYW1lWzoxXSArIGZpbGVuYW1lWy0xOl0gIT0gIjw+IiBhbmQgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICAgICAgc2VsZi5mbGlzdC5nb3RvZmlsZWxpbmUoZmlsZW5hbWUsIGxpbmVubykKKworICAgIGRlZiBfX2ZyYW1lMmZpbGVsaW5lKHNlbGYsIGZyYW1lKToKKyAgICAgICAgY29kZSA9IGZyYW1lLmZfY29kZQorICAgICAgICBmaWxlbmFtZSA9IGNvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgbGluZW5vID0gZnJhbWUuZl9saW5lbm8KKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lLCBsaW5lbm8KKworICAgIGRlZiBjb250KHNlbGYpOgorICAgICAgICBzZWxmLmlkYi5zZXRfY29udGludWUoKQorICAgICAgICBzZWxmLnJvb3QucXVpdCgpCisKKyAgICBkZWYgc3RlcChzZWxmKToKKyAgICAgICAgc2VsZi5pZGIuc2V0X3N0ZXAoKQorICAgICAgICBzZWxmLnJvb3QucXVpdCgpCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgc2VsZi5pZGIuc2V0X25leHQoc2VsZi5mcmFtZSkKKyAgICAgICAgc2VsZi5yb290LnF1aXQoKQorCisgICAgZGVmIHJldChzZWxmKToKKyAgICAgICAgc2VsZi5pZGIuc2V0X3JldHVybihzZWxmLmZyYW1lKQorICAgICAgICBzZWxmLnJvb3QucXVpdCgpCisKKyAgICBkZWYgcXVpdChzZWxmKToKKyAgICAgICAgc2VsZi5pZGIuc2V0X3F1aXQoKQorICAgICAgICBzZWxmLnJvb3QucXVpdCgpCisKKyAgICBzdGFja3ZpZXdlciA9IE5vbmUKKworICAgIGRlZiBzaG93X3N0YWNrKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5zdGFja3ZpZXdlciBhbmQgc2VsZi52c3RhY2suZ2V0KCk6CisgICAgICAgICAgICBzZWxmLnN0YWNrdmlld2VyID0gc3YgPSBTdGFja1ZpZXdlcihzZWxmLmZzdGFjaywgc2VsZi5mbGlzdCwgc2VsZikKKyAgICAgICAgICAgIGlmIHNlbGYuZnJhbWU6CisgICAgICAgICAgICAgICAgc3RhY2ssIGkgPSBzZWxmLmlkYi5nZXRfc3RhY2soc2VsZi5mcmFtZSwgTm9uZSkKKyAgICAgICAgICAgICAgICBzdi5sb2FkX3N0YWNrKHN0YWNrLCBpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3YgPSBzZWxmLnN0YWNrdmlld2VyCisgICAgICAgICAgICBpZiBzdiBhbmQgbm90IHNlbGYudnN0YWNrLmdldCgpOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhY2t2aWV3ZXIgPSBOb25lCisgICAgICAgICAgICAgICAgc3YuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5mc3RhY2tbJ2hlaWdodCddID0gMQorCisgICAgZGVmIHNob3dfc291cmNlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnZzb3VyY2UuZ2V0KCk6CisgICAgICAgICAgICBzZWxmLnN5bmNfc291cmNlX2xpbmUoKQorCisgICAgZGVmIHNob3dfZnJhbWUoc2VsZiwgKGZyYW1lLCBsaW5lbm8pKToKKyAgICAgICAgc2VsZi5mcmFtZSA9IGZyYW1lCisgICAgICAgIHNlbGYuc2hvd192YXJpYWJsZXMoKQorCisgICAgbG9jYWxzdmlld2VyID0gTm9uZQorICAgIGdsb2JhbHN2aWV3ZXIgPSBOb25lCisKKyAgICBkZWYgc2hvd19sb2NhbHMoc2VsZik6CisgICAgICAgIGx2ID0gc2VsZi5sb2NhbHN2aWV3ZXIKKyAgICAgICAgaWYgc2VsZi52bG9jYWxzLmdldCgpOgorICAgICAgICAgICAgaWYgbm90IGx2OgorICAgICAgICAgICAgICAgIHNlbGYubG9jYWxzdmlld2VyID0gTmFtZXNwYWNlVmlld2VyKHNlbGYuZmxvY2FscywgIkxvY2FscyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBsdjoKKyAgICAgICAgICAgICAgICBzZWxmLmxvY2Fsc3ZpZXdlciA9IE5vbmUKKyAgICAgICAgICAgICAgICBsdi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5mbG9jYWxzWydoZWlnaHQnXSA9IDEKKyAgICAgICAgc2VsZi5zaG93X3ZhcmlhYmxlcygpCisKKyAgICBkZWYgc2hvd19nbG9iYWxzKHNlbGYpOgorICAgICAgICBndiA9IHNlbGYuZ2xvYmFsc3ZpZXdlcgorICAgICAgICBpZiBzZWxmLnZnbG9iYWxzLmdldCgpOgorICAgICAgICAgICAgaWYgbm90IGd2OgorICAgICAgICAgICAgICAgIHNlbGYuZ2xvYmFsc3ZpZXdlciA9IE5hbWVzcGFjZVZpZXdlcihzZWxmLmZnbG9iYWxzLCAiR2xvYmFscyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBndjoKKyAgICAgICAgICAgICAgICBzZWxmLmdsb2JhbHN2aWV3ZXIgPSBOb25lCisgICAgICAgICAgICAgICAgZ3YuY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuZmdsb2JhbHNbJ2hlaWdodCddID0gMQorICAgICAgICBzZWxmLnNob3dfdmFyaWFibGVzKCkKKworICAgIGRlZiBzaG93X3ZhcmlhYmxlcyhzZWxmLCBmb3JjZT0wKToKKyAgICAgICAgbHYgPSBzZWxmLmxvY2Fsc3ZpZXdlcgorICAgICAgICBndiA9IHNlbGYuZ2xvYmFsc3ZpZXdlcgorICAgICAgICBmcmFtZSA9IHNlbGYuZnJhbWUKKyAgICAgICAgaWYgbm90IGZyYW1lOgorICAgICAgICAgICAgbGRpY3QgPSBnZGljdCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxkaWN0ID0gZnJhbWUuZl9sb2NhbHMKKyAgICAgICAgICAgIGdkaWN0ID0gZnJhbWUuZl9nbG9iYWxzCisgICAgICAgICAgICBpZiBsdiBhbmQgZ3YgYW5kIGxkaWN0IGlzIGdkaWN0OgorICAgICAgICAgICAgICAgIGxkaWN0ID0gTm9uZQorICAgICAgICBpZiBsdjoKKyAgICAgICAgICAgIGx2LmxvYWRfZGljdChsZGljdCwgZm9yY2UsIHNlbGYucHlzaGVsbC5pbnRlcnAucnBjY2x0KQorICAgICAgICBpZiBndjoKKyAgICAgICAgICAgIGd2LmxvYWRfZGljdChnZGljdCwgZm9yY2UsIHNlbGYucHlzaGVsbC5pbnRlcnAucnBjY2x0KQorCisgICAgZGVmIHNldF9icmVha3BvaW50X2hlcmUoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgICAgIHNlbGYuaWRiLnNldF9icmVhayhmaWxlbmFtZSwgbGluZW5vKQorCisgICAgZGVmIGNsZWFyX2JyZWFrcG9pbnRfaGVyZShzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKKyAgICAgICAgc2VsZi5pZGIuY2xlYXJfYnJlYWsoZmlsZW5hbWUsIGxpbmVubykKKworICAgIGRlZiBjbGVhcl9maWxlX2JyZWFrcyhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYuaWRiLmNsZWFyX2FsbF9maWxlX2JyZWFrcyhmaWxlbmFtZSkKKworICAgIGRlZiBsb2FkX2JyZWFrcG9pbnRzKHNlbGYpOgorICAgICAgICAiTG9hZCBQeVNoZWxsRWRpdG9yV2luZG93IGJyZWFrcG9pbnRzIGludG8gc3VicHJvY2VzcyBkZWJ1Z2dlciIKKyAgICAgICAgcHlzaGVsbF9lZGl0X3dpbmRvd3MgPSBzZWxmLnB5c2hlbGwuZmxpc3QuaW52ZXJzZWRpY3Qua2V5cygpCisgICAgICAgIGZvciBlZGl0d2luIGluIHB5c2hlbGxfZWRpdF93aW5kb3dzOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBlZGl0d2luLmlvLmZpbGVuYW1lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9yIGxpbmVubyBpbiBlZGl0d2luLmJyZWFrcG9pbnRzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNldF9icmVha3BvaW50X2hlcmUoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCitjbGFzcyBTdGFja1ZpZXdlcihTY3JvbGxlZExpc3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgZmxpc3QsIGd1aSk6CisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgICAgICAjIEF0IGxlYXN0IG9uIHdpdGggdGhlIHN0b2NrIEFxdWFUayB2ZXJzaW9uIG9uIE9TWCAxMC40IHlvdSdsbAorICAgICAgICAgICAgIyBnZXQgYW4gc2hha2luZyBHVUkgdGhhdCBldmVudHVhbGx5IGtpbGxzIElETEUgaWYgdGhlIHdpZHRoCisgICAgICAgICAgICAjIGFyZ3VtZW50IGlzIHNwZWNpZmllZC4KKyAgICAgICAgICAgIFNjcm9sbGVkTGlzdC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBTY3JvbGxlZExpc3QuX19pbml0X18oc2VsZiwgbWFzdGVyLCB3aWR0aD04MCkKKyAgICAgICAgc2VsZi5mbGlzdCA9IGZsaXN0CisgICAgICAgIHNlbGYuZ3VpID0gZ3VpCisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorCisgICAgZGVmIGxvYWRfc3RhY2soc2VsZiwgc3RhY2ssIGluZGV4PU5vbmUpOgorICAgICAgICBzZWxmLnN0YWNrID0gc3RhY2sKKyAgICAgICAgc2VsZi5jbGVhcigpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzdGFjaykpOgorICAgICAgICAgICAgZnJhbWUsIGxpbmVubyA9IHN0YWNrW2ldCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbW9kbmFtZSA9IGZyYW1lLmZfZ2xvYmFsc1siX19uYW1lX18iXQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIG1vZG5hbWUgPSAiPyIKKyAgICAgICAgICAgIGNvZGUgPSBmcmFtZS5mX2NvZGUKKyAgICAgICAgICAgIGZpbGVuYW1lID0gY29kZS5jb19maWxlbmFtZQorICAgICAgICAgICAgZnVuY25hbWUgPSBjb2RlLmNvX25hbWUKKyAgICAgICAgICAgIGltcG9ydCBsaW5lY2FjaGUKKyAgICAgICAgICAgIHNvdXJjZWxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgaW1wb3J0IHN0cmluZworICAgICAgICAgICAgc291cmNlbGluZSA9IHN0cmluZy5zdHJpcChzb3VyY2VsaW5lKQorICAgICAgICAgICAgaWYgZnVuY25hbWUgaW4gKCI/IiwgIiIsIE5vbmUpOgorICAgICAgICAgICAgICAgIGl0ZW0gPSAiJXMsIGxpbmUgJWQ6ICVzIiAlIChtb2RuYW1lLCBsaW5lbm8sIHNvdXJjZWxpbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGl0ZW0gPSAiJXMuJXMoKSwgbGluZSAlZDogJXMiICUgKG1vZG5hbWUsIGZ1bmNuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgc291cmNlbGluZSkKKyAgICAgICAgICAgIGlmIGkgPT0gaW5kZXg6CisgICAgICAgICAgICAgICAgaXRlbSA9ICI+ICIgKyBpdGVtCisgICAgICAgICAgICBzZWxmLmFwcGVuZChpdGVtKQorICAgICAgICBpZiBpbmRleCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0KGluZGV4KQorCisgICAgZGVmIHBvcHVwX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgIm92ZXJyaWRlIGJhc2UgbWV0aG9kIgorICAgICAgICBpZiBzZWxmLnN0YWNrOgorICAgICAgICAgICAgcmV0dXJuIFNjcm9sbGVkTGlzdC5wb3B1cF9ldmVudChzZWxmLCBldmVudCkKKworICAgIGRlZiBmaWxsX21lbnUoc2VsZik6CisgICAgICAgICJvdmVycmlkZSBiYXNlIG1ldGhvZCIKKyAgICAgICAgbWVudSA9IHNlbGYubWVudQorICAgICAgICBtZW51LmFkZF9jb21tYW5kKGxhYmVsPSJHbyB0byBzb3VyY2UgbGluZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLmdvdG9fc291cmNlX2xpbmUpCisgICAgICAgIG1lbnUuYWRkX2NvbW1hbmQobGFiZWw9IlNob3cgc3RhY2sgZnJhbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5zaG93X3N0YWNrX2ZyYW1lKQorCisgICAgZGVmIG9uX3NlbGVjdChzZWxmLCBpbmRleCk6CisgICAgICAgICJvdmVycmlkZSBiYXNlIG1ldGhvZCIKKyAgICAgICAgaWYgMCA8PSBpbmRleCA8IGxlbihzZWxmLnN0YWNrKToKKyAgICAgICAgICAgIHNlbGYuZ3VpLnNob3dfZnJhbWUoc2VsZi5zdGFja1tpbmRleF0pCisKKyAgICBkZWYgb25fZG91YmxlKHNlbGYsIGluZGV4KToKKyAgICAgICAgIm92ZXJyaWRlIGJhc2UgbWV0aG9kIgorICAgICAgICBzZWxmLnNob3dfc291cmNlKGluZGV4KQorCisgICAgZGVmIGdvdG9fc291cmNlX2xpbmUoc2VsZik6CisgICAgICAgIGluZGV4ID0gc2VsZi5saXN0Ym94LmluZGV4KCJhY3RpdmUiKQorICAgICAgICBzZWxmLnNob3dfc291cmNlKGluZGV4KQorCisgICAgZGVmIHNob3dfc3RhY2tfZnJhbWUoc2VsZik6CisgICAgICAgIGluZGV4ID0gc2VsZi5saXN0Ym94LmluZGV4KCJhY3RpdmUiKQorICAgICAgICBpZiAwIDw9IGluZGV4IDwgbGVuKHNlbGYuc3RhY2spOgorICAgICAgICAgICAgc2VsZi5ndWkuc2hvd19mcmFtZShzZWxmLnN0YWNrW2luZGV4XSkKKworICAgIGRlZiBzaG93X3NvdXJjZShzZWxmLCBpbmRleCk6CisgICAgICAgIGlmIG5vdCAoMCA8PSBpbmRleCA8IGxlbihzZWxmLnN0YWNrKSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZnJhbWUsIGxpbmVubyA9IHNlbGYuc3RhY2tbaW5kZXhdCisgICAgICAgIGNvZGUgPSBmcmFtZS5mX2NvZGUKKyAgICAgICAgZmlsZW5hbWUgPSBjb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lKToKKyAgICAgICAgICAgIGVkaXQgPSBzZWxmLmZsaXN0Lm9wZW4oZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBlZGl0OgorICAgICAgICAgICAgICAgIGVkaXQuZ290b2xpbmUobGluZW5vKQorCisKK2NsYXNzIE5hbWVzcGFjZVZpZXdlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHRpdGxlLCBkaWN0PU5vbmUpOgorICAgICAgICB3aWR0aCA9IDAKKyAgICAgICAgaGVpZ2h0ID0gNDAKKyAgICAgICAgaWYgZGljdDoKKyAgICAgICAgICAgIGhlaWdodCA9IDIwKmxlbihkaWN0KSAjIFhYWCAyMCA9PSBvYnNlcnZlZCBoZWlnaHQgb2YgRW50cnkgd2lkZ2V0CisgICAgICAgIHNlbGYubWFzdGVyID0gbWFzdGVyCisgICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZQorICAgICAgICBpbXBvcnQgcmVwcgorICAgICAgICBzZWxmLnJlcHIgPSByZXByLlJlcHIoKQorICAgICAgICBzZWxmLnJlcHIubWF4c3RyaW5nID0gNjAKKyAgICAgICAgc2VsZi5yZXByLm1heG90aGVyID0gNjAKKyAgICAgICAgc2VsZi5mcmFtZSA9IGZyYW1lID0gRnJhbWUobWFzdGVyKQorICAgICAgICBzZWxmLmZyYW1lLnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQorICAgICAgICBzZWxmLmxhYmVsID0gTGFiZWwoZnJhbWUsIHRleHQ9dGl0bGUsIGJvcmRlcndpZHRoPTIsIHJlbGllZj0iZ3Jvb3ZlIikKKyAgICAgICAgc2VsZi5sYWJlbC5wYWNrKGZpbGw9IngiKQorICAgICAgICBzZWxmLnZiYXIgPSB2YmFyID0gU2Nyb2xsYmFyKGZyYW1lLCBuYW1lPSJ2YmFyIikKKyAgICAgICAgdmJhci5wYWNrKHNpZGU9InJpZ2h0IiwgZmlsbD0ieSIpCisgICAgICAgIHNlbGYuY2FudmFzID0gY2FudmFzID0gQ2FudmFzKGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9bWluKDMwMCwgbWF4KDQwLCBoZWlnaHQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xscmVnaW9uPSgwLCAwLCB3aWR0aCwgaGVpZ2h0KSkKKyAgICAgICAgY2FudmFzLnBhY2soc2lkZT0ibGVmdCIsIGZpbGw9ImJvdGgiLCBleHBhbmQ9MSkKKyAgICAgICAgdmJhclsiY29tbWFuZCJdID0gY2FudmFzLnl2aWV3CisgICAgICAgIGNhbnZhc1sieXNjcm9sbGNvbW1hbmQiXSA9IHZiYXIuc2V0CisgICAgICAgIHNlbGYuc3ViZnJhbWUgPSBzdWJmcmFtZSA9IEZyYW1lKGNhbnZhcykKKyAgICAgICAgc2VsZi5zZmlkID0gY2FudmFzLmNyZWF0ZV93aW5kb3coMCwgMCwgd2luZG93PXN1YmZyYW1lLCBhbmNob3I9Im53IikKKyAgICAgICAgc2VsZi5sb2FkX2RpY3QoZGljdCkKKworICAgIGRpY3QgPSAtMQorCisgICAgZGVmIGxvYWRfZGljdChzZWxmLCBkaWN0LCBmb3JjZT0wLCBycGNfY2xpZW50PU5vbmUpOgorICAgICAgICBpZiBkaWN0IGlzIHNlbGYuZGljdCBhbmQgbm90IGZvcmNlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHN1YmZyYW1lID0gc2VsZi5zdWJmcmFtZQorICAgICAgICBmcmFtZSA9IHNlbGYuZnJhbWUKKyAgICAgICAgZm9yIGMgaW4gc3ViZnJhbWUuY2hpbGRyZW4udmFsdWVzKCk6CisgICAgICAgICAgICBjLmRlc3Ryb3koKQorICAgICAgICBzZWxmLmRpY3QgPSBOb25lCisgICAgICAgIGlmIG5vdCBkaWN0OgorICAgICAgICAgICAgbCA9IExhYmVsKHN1YmZyYW1lLCB0ZXh0PSJOb25lIikKKyAgICAgICAgICAgIGwuZ3JpZChyb3c9MCwgY29sdW1uPTApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lcyA9IGRpY3Qua2V5cygpCisgICAgICAgICAgICBuYW1lcy5zb3J0KCkKKyAgICAgICAgICAgIHJvdyA9IDAKKyAgICAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgICAgIHZhbHVlID0gZGljdFtuYW1lXQorICAgICAgICAgICAgICAgIHN2YWx1ZSA9IHNlbGYucmVwci5yZXByKHZhbHVlKSAjIHJlcHIodmFsdWUpCisgICAgICAgICAgICAgICAgIyBTdHJpcCBleHRyYSBxdW90ZXMgY2F1c2VkIGJ5IGNhbGxpbmcgcmVwciBvbiB0aGUgKGFscmVhZHkpCisgICAgICAgICAgICAgICAgIyByZXByJ2QgdmFsdWUgc2VudCBhY3Jvc3MgdGhlIFJQQyBpbnRlcmZhY2U6CisgICAgICAgICAgICAgICAgaWYgcnBjX2NsaWVudDoKKyAgICAgICAgICAgICAgICAgICAgc3ZhbHVlID0gc3ZhbHVlWzE6LTFdCisgICAgICAgICAgICAgICAgbCA9IExhYmVsKHN1YmZyYW1lLCB0ZXh0PW5hbWUpCisgICAgICAgICAgICAgICAgbC5ncmlkKHJvdz1yb3csIGNvbHVtbj0wLCBzdGlja3k9Im53IikKKyAgICAgICAgICAgICAgICBsID0gRW50cnkoc3ViZnJhbWUsIHdpZHRoPTAsIGJvcmRlcndpZHRoPTApCisgICAgICAgICAgICAgICAgbC5pbnNlcnQoMCwgc3ZhbHVlKQorICAgICAgICAgICAgICAgIGwuZ3JpZChyb3c9cm93LCBjb2x1bW49MSwgc3RpY2t5PSJudyIpCisgICAgICAgICAgICAgICAgcm93ID0gcm93KzEKKyAgICAgICAgc2VsZi5kaWN0ID0gZGljdAorICAgICAgICAjIFhYWCBDb3VsZCB3ZSB1c2UgYSA8Q29uZmlndXJlPiBjYWxsYmFjayBmb3IgdGhlIGZvbGxvd2luZz8KKyAgICAgICAgc3ViZnJhbWUudXBkYXRlX2lkbGV0YXNrcygpICMgQWxhcyEKKyAgICAgICAgd2lkdGggPSBzdWJmcmFtZS53aW5mb19yZXF3aWR0aCgpCisgICAgICAgIGhlaWdodCA9IHN1YmZyYW1lLndpbmZvX3JlcWhlaWdodCgpCisgICAgICAgIGNhbnZhcyA9IHNlbGYuY2FudmFzCisgICAgICAgIHNlbGYuY2FudmFzWyJzY3JvbGxyZWdpb24iXSA9ICgwLCAwLCB3aWR0aCwgaGVpZ2h0KQorICAgICAgICBpZiBoZWlnaHQgPiAzMDA6CisgICAgICAgICAgICBjYW52YXNbImhlaWdodCJdID0gMzAwCisgICAgICAgICAgICBmcmFtZS5wYWNrKGV4cGFuZD0xKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2FudmFzWyJoZWlnaHQiXSA9IGhlaWdodAorICAgICAgICAgICAgZnJhbWUucGFjayhleHBhbmQ9MCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5mcmFtZS5kZXN0cm95KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWJ1Z2dlci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRGVidWdnZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZTc2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRGVidWdnZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWJ1Z2dlci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRGVidWdnZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZTc2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRGVidWdnZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWxlZ2F0b3IucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRGVsZWdhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMjU1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRGVsZWdhdG9yLnB5CkBAIC0wLDAgKzEsMzMgQEAKK2NsYXNzIERlbGVnYXRvcjoKKworICAgICMgVGhlIGNhY2hlIGlzIG9ubHkgdXNlZCB0byBiZSBhYmxlIHRvIGNoYW5nZSBkZWxlZ2F0ZXMhCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVsZWdhdGU9Tm9uZSk6CisgICAgICAgIHNlbGYuZGVsZWdhdGUgPSBkZWxlZ2F0ZQorICAgICAgICBzZWxmLl9fY2FjaGUgPSB7fQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICBhdHRyID0gZ2V0YXR0cihzZWxmLmRlbGVnYXRlLCBuYW1lKSAjIE1heSByYWlzZSBBdHRyaWJ1dGVFcnJvcgorICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGF0dHIpCisgICAgICAgIHNlbGYuX19jYWNoZVtuYW1lXSA9IGF0dHIKKyAgICAgICAgcmV0dXJuIGF0dHIKKworICAgIGRlZiByZXNldGNhY2hlKHNlbGYpOgorICAgICAgICBmb3Iga2V5IGluIHNlbGYuX19jYWNoZS5rZXlzKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVsYXR0cihzZWxmLCBrZXkpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLl9fY2FjaGUuY2xlYXIoKQorCisgICAgZGVmIGNhY2hlcmVwb3J0KHNlbGYpOgorICAgICAgICBrZXlzID0gc2VsZi5fX2NhY2hlLmtleXMoKQorICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICBwcmludCBrZXlzCisKKyAgICBkZWYgc2V0ZGVsZWdhdGUoc2VsZiwgZGVsZWdhdGUpOgorICAgICAgICBzZWxmLnJlc2V0Y2FjaGUoKQorICAgICAgICBzZWxmLmRlbGVnYXRlID0gZGVsZWdhdGUKKworICAgIGRlZiBnZXRkZWxlZ2F0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGVsZWdhdGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWxlZ2F0b3IucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0RlbGVnYXRvci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5YTRkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWxlZ2F0b3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWxlZ2F0b3IucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0RlbGVnYXRvci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ5YTRkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWxlZ2F0b3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRWRpdG9yV2luZG93LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmM2ZhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRWRpdG9yV2luZG93LnB5CkBAIC0wLDAgKzEsMTY5MyBAQAoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBpbXAKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgoraW1wb3J0IHRrU2ltcGxlRGlhbG9nCitpbXBvcnQgdGtNZXNzYWdlQm94CitpbXBvcnQgd2ViYnJvd3NlcgorCitmcm9tIGlkbGVsaWIuTXVsdGlDYWxsIGltcG9ydCBNdWx0aUNhbGxDcmVhdG9yCitmcm9tIGlkbGVsaWIgaW1wb3J0IGlkbGV2ZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgV2luZG93TGlzdAorZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hEaWFsb2cKK2Zyb20gaWRsZWxpYiBpbXBvcnQgR3JlcERpYWxvZworZnJvbSBpZGxlbGliIGltcG9ydCBSZXBsYWNlRGlhbG9nCitmcm9tIGlkbGVsaWIgaW1wb3J0IFB5UGFyc2UKK2Zyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliIGltcG9ydCBhYm91dERpYWxvZywgdGV4dFZpZXcsIGNvbmZpZ0RpYWxvZworZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0CisKKyMgVGhlIGRlZmF1bHQgdGFiIHNldHRpbmcgZm9yIGEgVGV4dCB3aWRnZXQsIGluIGF2ZXJhZ2Utd2lkdGggY2hhcmFjdGVycy4KK1RLX1RBQldJRFRIX0RFRkFVTFQgPSA4CisKK2RlZiBfc3BoaW54X3ZlcnNpb24oKToKKyAgICAiRm9ybWF0IHN5cy52ZXJzaW9uX2luZm8gdG8gcHJvZHVjZSB0aGUgU3BoaW54IHZlcnNpb24gc3RyaW5nIHVzZWQgdG8gaW5zdGFsbCB0aGUgY2htIGRvY3MiCisgICAgbWFqb3IsIG1pbm9yLCBtaWNybywgbGV2ZWwsIHNlcmlhbCA9IHN5cy52ZXJzaW9uX2luZm8KKyAgICByZWxlYXNlID0gJyVzJXMnICUgKG1ham9yLCBtaW5vcikKKyAgICBpZiBtaWNybzoKKyAgICAgICAgcmVsZWFzZSArPSAnJXMnICUgKG1pY3JvLCkKKyAgICBpZiBsZXZlbCA9PSAnY2FuZGlkYXRlJzoKKyAgICAgICAgcmVsZWFzZSArPSAncmMlcycgJSAoc2VyaWFsLCkKKyAgICBlbGlmIGxldmVsICE9ICdmaW5hbCc6CisgICAgICAgIHJlbGVhc2UgKz0gJyVzJXMnICUgKGxldmVsWzBdLCBzZXJpYWwpCisgICAgcmV0dXJuIHJlbGVhc2UKKworZGVmIF9maW5kX21vZHVsZShmdWxsbmFtZSwgcGF0aD1Ob25lKToKKyAgICAiIiJWZXJzaW9uIG9mIGltcC5maW5kX21vZHVsZSgpIHRoYXQgaGFuZGxlcyBoaWVyYXJjaGljYWwgbW9kdWxlIG5hbWVzIiIiCisKKyAgICBmaWxlID0gTm9uZQorICAgIGZvciB0Z3QgaW4gZnVsbG5hbWUuc3BsaXQoJy4nKToKKyAgICAgICAgaWYgZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZpbGUuY2xvc2UoKSAgICAgICAgICAgICMgY2xvc2UgaW50ZXJtZWRpYXRlIGZpbGVzCisgICAgICAgIChmaWxlLCBmaWxlbmFtZSwgZGVzY3IpID0gaW1wLmZpbmRfbW9kdWxlKHRndCwgcGF0aCkKKyAgICAgICAgaWYgZGVzY3JbMl0gPT0gaW1wLlBZX1NPVVJDRToKKyAgICAgICAgICAgIGJyZWFrICAgICAgICAgICAgICAgICAgICMgZmluZCBidXQgbm90IGxvYWQgdGhlIHNvdXJjZSBmaWxlCisgICAgICAgIG1vZHVsZSA9IGltcC5sb2FkX21vZHVsZSh0Z3QsIGZpbGUsIGZpbGVuYW1lLCBkZXNjcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGF0aCA9IG1vZHVsZS5fX3BhdGhfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgJ05vIHNvdXJjZSBmb3IgbW9kdWxlICcgKyBtb2R1bGUuX19uYW1lX18KKyAgICBpZiBkZXNjclsyXSAhPSBpbXAuUFlfU09VUkNFOgorICAgICAgICAjIElmIGFsbCBvZiB0aGUgYWJvdmUgZmFpbHMgYW5kIGRpZG4ndCByYWlzZSBhbiBleGNlcHRpb24sZmFsbGJhY2sKKyAgICAgICAgIyB0byBhIHN0cmFpZ2h0IGltcG9ydCB3aGljaCBjYW4gZmluZCBfX2luaXRfXy5weSBpbiBhIHBhY2thZ2UuCisgICAgICAgIG0gPSBfX2ltcG9ydF9fKGZ1bGxuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlbmFtZSA9IG0uX19maWxlX18KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmlsZSA9IE5vbmUKKyAgICAgICAgICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBleHQgPT0gJy5weWMnOgorICAgICAgICAgICAgICAgIGV4dCA9ICcucHknCisgICAgICAgICAgICBmaWxlbmFtZSA9IGJhc2UgKyBleHQKKyAgICAgICAgICAgIGRlc2NyID0gZmlsZW5hbWUsIE5vbmUsIGltcC5QWV9TT1VSQ0UKKyAgICByZXR1cm4gZmlsZSwgZmlsZW5hbWUsIGRlc2NyCisKKworY2xhc3MgSGVscERpYWxvZyhvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUgICAgICAjIHBhcmVudCBvZiBoZWxwIHdpbmRvdworICAgICAgICBzZWxmLmRsZyA9IE5vbmUgICAgICAgICAjIHRoZSBoZWxwIHdpbmRvdyBpdGVzZWxmCisKKyAgICBkZWYgZGlzcGxheShzZWxmLCBwYXJlbnQsIG5lYXI9Tm9uZSk6CisgICAgICAgICIiIiBEaXNwbGF5IHRoZSBoZWxwIGRpYWxvZy4KKworICAgICAgICAgICAgcGFyZW50IC0gcGFyZW50IHdpZGdldCBmb3IgdGhlIGhlbHAgd2luZG93CisKKyAgICAgICAgICAgIG5lYXIgLSBhIFRvcGxldmVsIHdpZGdldCAoZS5nLiBFZGl0b3JXaW5kb3cgb3IgUHlTaGVsbCkKKyAgICAgICAgICAgICAgICAgICB0byB1c2UgYXMgYSByZWZlcmVuY2UgZm9yIHBsYWNpbmcgdGhlIGhlbHAgd2luZG93CisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmRsZyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5zaG93X2RpYWxvZyhwYXJlbnQpCisgICAgICAgIGlmIG5lYXI6CisgICAgICAgICAgICBzZWxmLm5lYXJ3aW5kb3cobmVhcikKKworICAgIGRlZiBzaG93X2RpYWxvZyhzZWxmLCBwYXJlbnQpOgorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorICAgICAgICBmbj1vcy5wYXRoLmpvaW4ob3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpLCdoZWxwLnR4dCcpCisgICAgICAgIHNlbGYuZGxnID0gZGxnID0gdGV4dFZpZXcudmlld19maWxlKHBhcmVudCwnSGVscCcsZm4sIG1vZGFsPUZhbHNlKQorICAgICAgICBkbGcuYmluZCgnPERlc3Ryb3k+Jywgc2VsZi5kZXN0cm95LCAnKycpCisKKyAgICBkZWYgbmVhcndpbmRvdyhzZWxmLCBuZWFyKToKKyAgICAgICAgIyBQbGFjZSB0aGUgaGVscCBkaWFsb2cgbmVhciB0aGUgd2luZG93IHNwZWNpZmllZCBieSBwYXJlbnQuCisgICAgICAgICMgTm90ZSAtIHRoaXMgbWF5IG5vdCByZXBvc2l0aW9uIHRoZSB3aW5kb3cgaW4gTWV0YWNpdHkKKyAgICAgICAgIyAgaWYgIi9hcHBzL21ldGFjaXR5L2dlbmVyYWwvZGlzYWJsZV93b3JrYXJvdW5kcyIgaXMgZW5hYmxlZAorICAgICAgICBkbGcgPSBzZWxmLmRsZworICAgICAgICBnZW9tID0gKG5lYXIud2luZm9fcm9vdHgoKSArIDEwLCBuZWFyLndpbmZvX3Jvb3R5KCkgKyAxMCkKKyAgICAgICAgZGxnLndpdGhkcmF3KCkKKyAgICAgICAgZGxnLmdlb21ldHJ5KCI9KyVkKyVkIiAlIGdlb20pCisgICAgICAgIGRsZy5kZWljb25pZnkoKQorICAgICAgICBkbGcubGlmdCgpCisKKyAgICBkZWYgZGVzdHJveShzZWxmLCBldj1Ob25lKToKKyAgICAgICAgc2VsZi5kbGcgPSBOb25lCisgICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQorCitoZWxwRGlhbG9nID0gSGVscERpYWxvZygpICAjIHNpbmdsZXRvbiBpbnN0YW5jZQorCisKK2NsYXNzIEVkaXRvcldpbmRvdyhvYmplY3QpOgorICAgIGZyb20gaWRsZWxpYi5QZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCisgICAgZnJvbSBpZGxlbGliLkNvbG9yRGVsZWdhdG9yIGltcG9ydCBDb2xvckRlbGVnYXRvcgorICAgIGZyb20gaWRsZWxpYi5VbmRvRGVsZWdhdG9yIGltcG9ydCBVbmRvRGVsZWdhdG9yCisgICAgZnJvbSBpZGxlbGliLklPQmluZGluZyBpbXBvcnQgSU9CaW5kaW5nLCBmaWxlc3lzdGVtZW5jb2RpbmcsIGVuY29kaW5nCisgICAgZnJvbSBpZGxlbGliIGltcG9ydCBCaW5kaW5ncworICAgIGZyb20gVGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwKKyAgICBmcm9tIGlkbGVsaWIuTXVsdGlTdGF0dXNCYXIgaW1wb3J0IE11bHRpU3RhdHVzQmFyCisKKyAgICBoZWxwX3VybCA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGlzdD1Ob25lLCBmaWxlbmFtZT1Ob25lLCBrZXk9Tm9uZSwgcm9vdD1Ob25lKToKKyAgICAgICAgaWYgRWRpdG9yV2luZG93LmhlbHBfdXJsIGlzIE5vbmU6CisgICAgICAgICAgICBkb2Nob21lID0gIG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnRG9jJywgJ2luZGV4Lmh0bWwnKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtLmNvdW50KCdsaW51eCcpOgorICAgICAgICAgICAgICAgICMgbG9vayBmb3IgaHRtbCBkb2NzIGluIGEgY291cGxlIG9mIHN0YW5kYXJkIHBsYWNlcworICAgICAgICAgICAgICAgIHB5dmVyID0gJ3B5dGhvbi1kb2NzLScgKyAnJXMuJXMuJXMnICUgc3lzLnZlcnNpb25faW5mb1s6M10KKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKCcvdmFyL3d3dy9odG1sL3B5dGhvbi8nKTogICMgInB5dGhvbjIiIHJwbQorICAgICAgICAgICAgICAgICAgICBkb2Nob21lID0gJy92YXIvd3d3L2h0bWwvcHl0aG9uL2luZGV4Lmh0bWwnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYmFzZXBhdGggPSAnL3Vzci9zaGFyZS9kb2MvJyAgIyBzdGFuZGFyZCBsb2NhdGlvbgorICAgICAgICAgICAgICAgICAgICBkb2Nob21lID0gb3MucGF0aC5qb2luKGJhc2VwYXRoLCBweXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRG9jJywgJ2luZGV4Lmh0bWwnKQorICAgICAgICAgICAgZWxpZiBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nOgorICAgICAgICAgICAgICAgIGNobWZpbGUgPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgJ0RvYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uJXMuY2htJyAlIF9zcGhpbnhfdmVyc2lvbigpKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNobWZpbGUpOgorICAgICAgICAgICAgICAgICAgICBkb2Nob21lID0gY2htZmlsZQorICAgICAgICAgICAgZWxpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICAgICAgICAgICMgZG9jdW1lbnRhdGlvbiBpcyBzdG9yZWQgaW5zaWRlIHRoZSBweXRob24gZnJhbWV3b3JrCisgICAgICAgICAgICAgICAgZG9jaG9tZSA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgJ1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL0RvY3VtZW50YXRpb24vaW5kZXguaHRtbCcpCisgICAgICAgICAgICBkb2Nob21lID0gb3MucGF0aC5ub3JtcGF0aChkb2Nob21lKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZG9jaG9tZSk6CisgICAgICAgICAgICAgICAgRWRpdG9yV2luZG93LmhlbHBfdXJsID0gZG9jaG9tZQorICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgICAgICAgICAgIyBTYWZhcmkgcmVxdWlyZXMgcmVhbCBmaWxlOi1VUkxzCisgICAgICAgICAgICAgICAgICAgIEVkaXRvcldpbmRvdy5oZWxwX3VybCA9ICdmaWxlOi8vJyArIEVkaXRvcldpbmRvdy5oZWxwX3VybAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBFZGl0b3JXaW5kb3cuaGVscF91cmwgPSAiaHR0cDovL2RvY3MucHl0aG9uLm9yZy8lZC4lZCIgJSBzeXMudmVyc2lvbl9pbmZvWzoyXQorICAgICAgICBjdXJyZW50VGhlbWU9aWRsZUNvbmYuQ3VycmVudFRoZW1lKCkKKyAgICAgICAgc2VsZi5mbGlzdCA9IGZsaXN0CisgICAgICAgIHJvb3QgPSByb290IG9yIGZsaXN0LnJvb3QKKyAgICAgICAgc2VsZi5yb290ID0gcm9vdAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMucHMxCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHN5cy5wczEgPSAnPj4+ICcKKyAgICAgICAgc2VsZi5tZW51YmFyID0gTWVudShyb290KQorICAgICAgICBzZWxmLnRvcCA9IHRvcCA9IFdpbmRvd0xpc3QuTGlzdGVkVG9wbGV2ZWwocm9vdCwgbWVudT1zZWxmLm1lbnViYXIpCisgICAgICAgIGlmIGZsaXN0OgorICAgICAgICAgICAgc2VsZi50a2ludGVyX3ZhcnMgPSBmbGlzdC52YXJzCisgICAgICAgICAgICAjc2VsZi50b3AuaW5zdGFuY2VfZGljdCBtYWtlcyBmbGlzdC5pbnZlcnNlZGljdCBhdmFpbGFibGUgdG8KKyAgICAgICAgICAgICNjb25maWdEaWFsb2cucHkgc28gaXQgY2FuIGFjY2VzcyBhbGwgRWRpdG9yV2luZG93IGluc3RhbmNlcworICAgICAgICAgICAgc2VsZi50b3AuaW5zdGFuY2VfZGljdCA9IGZsaXN0LmludmVyc2VkaWN0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRraW50ZXJfdmFycyA9IHt9ICAjIGtleXM6IFRraW50ZXIgZXZlbnQgbmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdmFsdWVzOiBUa2ludGVyIHZhcmlhYmxlIGluc3RhbmNlcworICAgICAgICAgICAgc2VsZi50b3AuaW5zdGFuY2VfZGljdCA9IHt9CisgICAgICAgIHNlbGYucmVjZW50X2ZpbGVzX3BhdGggPSBvcy5wYXRoLmpvaW4oaWRsZUNvbmYuR2V0VXNlckNmZ0RpcigpLAorICAgICAgICAgICAgICAgICdyZWNlbnQtZmlsZXMubHN0JykKKyAgICAgICAgc2VsZi50ZXh0X2ZyYW1lID0gdGV4dF9mcmFtZSA9IEZyYW1lKHRvcCkKKyAgICAgICAgc2VsZi52YmFyID0gdmJhciA9IFNjcm9sbGJhcih0ZXh0X2ZyYW1lLCBuYW1lPSd2YmFyJykKKyAgICAgICAgc2VsZi53aWR0aCA9IGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0VkaXRvcldpbmRvdycsJ3dpZHRoJywgdHlwZT0naW50JykKKyAgICAgICAgdGV4dF9vcHRpb25zID0geworICAgICAgICAgICAgICAgICduYW1lJzogJ3RleHQnLAorICAgICAgICAgICAgICAgICdwYWR4JzogNSwKKyAgICAgICAgICAgICAgICAnd3JhcCc6ICdub25lJywKKyAgICAgICAgICAgICAgICAnd2lkdGgnOiBzZWxmLndpZHRoLAorICAgICAgICAgICAgICAgICdoZWlnaHQnOiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnRWRpdG9yV2luZG93JywgJ2hlaWdodCcsIHR5cGU9J2ludCcpfQorICAgICAgICBpZiBUa1ZlcnNpb24gPj0gOC41OgorICAgICAgICAgICAgIyBTdGFydGluZyB3aXRoIHRrIDguNSB3ZSBoYXZlIHRvIHNldCB0aGUgbmV3IHRhYnN0eWxlIG9wdGlvbgorICAgICAgICAgICAgIyB0byAnd29yZHByb2Nlc3NvcicgdG8gYWNoaWV2ZSB0aGUgc2FtZSBkaXNwbGF5IG9mIHRhYnMgYXMgaW4KKyAgICAgICAgICAgICMgb2xkZXIgdGsgdmVyc2lvbnMuCisgICAgICAgICAgICB0ZXh0X29wdGlvbnNbJ3RhYnN0eWxlJ10gPSAnd29yZHByb2Nlc3NvcicKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dCA9IE11bHRpQ2FsbENyZWF0b3IoVGV4dCkodGV4dF9mcmFtZSwgKip0ZXh0X29wdGlvbnMpCisgICAgICAgIHNlbGYudG9wLmZvY3VzZWRfd2lkZ2V0ID0gc2VsZi50ZXh0CisKKyAgICAgICAgc2VsZi5jcmVhdGVtZW51YmFyKCkKKyAgICAgICAgc2VsZi5hcHBseV9iaW5kaW5ncygpCisKKyAgICAgICAgc2VsZi50b3AucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLmNsb3NlKQorICAgICAgICBzZWxmLnRvcC5iaW5kKCI8PGNsb3NlLXdpbmRvdz4+Iiwgc2VsZi5jbG9zZV9ldmVudCkKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgICAgICMgQ29tbWFuZC1XIG9uIGVkaXRvcndpbmRvd3MgZG9lc24ndCB3b3JrIHdpdGhvdXQgdGhpcy4KKyAgICAgICAgICAgIHRleHQuYmluZCgnPDxjbG9zZS13aW5kb3c+PicsIHNlbGYuY2xvc2VfZXZlbnQpCisgICAgICAgICAgICAjIFNvbWUgT1MgWCBzeXN0ZW1zIGhhdmUgb25seSBvbmUgbW91c2UgYnV0dG9uLAorICAgICAgICAgICAgIyBzbyB1c2UgY29udHJvbC1jbGljayBmb3IgcHVsbGRvd24gbWVudXMgdGhlcmUuCisgICAgICAgICAgICAjICAoTm90ZSwgQXF1YVRrIGRlZmluZXMgPDI+IGFzIHRoZSByaWdodCBidXR0b24gaWYKKyAgICAgICAgICAgICMgICBwcmVzZW50IGFuZCB0aGUgVGsgVGV4dCB3aWRnZXQgYWxyZWFkeSBiaW5kcyA8Mj4uKQorICAgICAgICAgICAgdGV4dC5iaW5kKCI8Q29udHJvbC1CdXR0b24tMT4iLHNlbGYucmlnaHRfbWVudV9ldmVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgRWxzZXdoZXJlLCB1c2UgcmlnaHQtY2xpY2sgZm9yIHB1bGxkb3duIG1lbnVzLgorICAgICAgICAgICAgdGV4dC5iaW5kKCI8Mz4iLHNlbGYucmlnaHRfbWVudV9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGN1dD4+Iiwgc2VsZi5jdXQpCisgICAgICAgIHRleHQuYmluZCgiPDxjb3B5Pj4iLCBzZWxmLmNvcHkpCisgICAgICAgIHRleHQuYmluZCgiPDxwYXN0ZT4+Iiwgc2VsZi5wYXN0ZSkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGNlbnRlci1pbnNlcnQ+PiIsIHNlbGYuY2VudGVyX2luc2VydF9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGhlbHA+PiIsIHNlbGYuaGVscF9kaWFsb2cpCisgICAgICAgIHRleHQuYmluZCgiPDxweXRob24tZG9jcz4+Iiwgc2VsZi5weXRob25fZG9jcykKKyAgICAgICAgdGV4dC5iaW5kKCI8PGFib3V0LWlkbGU+PiIsIHNlbGYuYWJvdXRfZGlhbG9nKQorICAgICAgICB0ZXh0LmJpbmQoIjw8b3Blbi1jb25maWctZGlhbG9nPj4iLCBzZWxmLmNvbmZpZ19kaWFsb2cpCisgICAgICAgIHRleHQuYmluZCgiPDxvcGVuLW1vZHVsZT4+Iiwgc2VsZi5vcGVuX21vZHVsZSkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGRvLW5vdGhpbmc+PiIsIGxhbWJkYSBldmVudDogImJyZWFrIikKKyAgICAgICAgdGV4dC5iaW5kKCI8PHNlbGVjdC1hbGw+PiIsIHNlbGYuc2VsZWN0X2FsbCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PHJlbW92ZS1zZWxlY3Rpb24+PiIsIHNlbGYucmVtb3ZlX3NlbGVjdGlvbikKKyAgICAgICAgdGV4dC5iaW5kKCI8PGZpbmQ+PiIsIHNlbGYuZmluZF9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGZpbmQtYWdhaW4+PiIsIHNlbGYuZmluZF9hZ2Fpbl9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGZpbmQtaW4tZmlsZXM+PiIsIHNlbGYuZmluZF9pbl9maWxlc19ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGZpbmQtc2VsZWN0aW9uPj4iLCBzZWxmLmZpbmRfc2VsZWN0aW9uX2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8cmVwbGFjZT4+Iiwgc2VsZi5yZXBsYWNlX2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8Z290by1saW5lPj4iLCBzZWxmLmdvdG9fbGluZV9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PHNtYXJ0LWJhY2tzcGFjZT4+IixzZWxmLnNtYXJ0X2JhY2tzcGFjZV9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PG5ld2xpbmUtYW5kLWluZGVudD4+IixzZWxmLm5ld2xpbmVfYW5kX2luZGVudF9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PHNtYXJ0LWluZGVudD4+IixzZWxmLnNtYXJ0X2luZGVudF9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGluZGVudC1yZWdpb24+PiIsc2VsZi5pbmRlbnRfcmVnaW9uX2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8ZGVkZW50LXJlZ2lvbj4+IixzZWxmLmRlZGVudF9yZWdpb25fZXZlbnQpCisgICAgICAgIHRleHQuYmluZCgiPDxjb21tZW50LXJlZ2lvbj4+IixzZWxmLmNvbW1lbnRfcmVnaW9uX2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8dW5jb21tZW50LXJlZ2lvbj4+IixzZWxmLnVuY29tbWVudF9yZWdpb25fZXZlbnQpCisgICAgICAgIHRleHQuYmluZCgiPDx0YWJpZnktcmVnaW9uPj4iLHNlbGYudGFiaWZ5X3JlZ2lvbl9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PHVudGFiaWZ5LXJlZ2lvbj4+IixzZWxmLnVudGFiaWZ5X3JlZ2lvbl9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PHRvZ2dsZS10YWJzPj4iLHNlbGYudG9nZ2xlX3RhYnNfZXZlbnQpCisgICAgICAgIHRleHQuYmluZCgiPDxjaGFuZ2UtaW5kZW50d2lkdGg+PiIsc2VsZi5jaGFuZ2VfaW5kZW50d2lkdGhfZXZlbnQpCisgICAgICAgIHRleHQuYmluZCgiPExlZnQ+Iiwgc2VsZi5tb3ZlX2F0X2VkZ2VfaWZfc2VsZWN0aW9uKDApKQorICAgICAgICB0ZXh0LmJpbmQoIjxSaWdodD4iLCBzZWxmLm1vdmVfYXRfZWRnZV9pZl9zZWxlY3Rpb24oMSkpCisgICAgICAgIHRleHQuYmluZCgiPDxkZWwtd29yZC1sZWZ0Pj4iLCBzZWxmLmRlbF93b3JkX2xlZnQpCisgICAgICAgIHRleHQuYmluZCgiPDxkZWwtd29yZC1yaWdodD4+Iiwgc2VsZi5kZWxfd29yZF9yaWdodCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGJlZ2lubmluZy1vZi1saW5lPj4iLCBzZWxmLmhvbWVfY2FsbGJhY2spCisKKyAgICAgICAgaWYgZmxpc3Q6CisgICAgICAgICAgICBmbGlzdC5pbnZlcnNlZGljdFtzZWxmXSA9IGtleQorICAgICAgICAgICAgaWYga2V5OgorICAgICAgICAgICAgICAgIGZsaXN0LmRpY3Rba2V5XSA9IHNlbGYKKyAgICAgICAgICAgIHRleHQuYmluZCgiPDxvcGVuLW5ldy13aW5kb3c+PiIsIHNlbGYubmV3X2NhbGxiYWNrKQorICAgICAgICAgICAgdGV4dC5iaW5kKCI8PGNsb3NlLWFsbC13aW5kb3dzPj4iLCBzZWxmLmZsaXN0LmNsb3NlX2FsbF9jYWxsYmFjaykKKyAgICAgICAgICAgIHRleHQuYmluZCgiPDxvcGVuLWNsYXNzLWJyb3dzZXI+PiIsIHNlbGYub3Blbl9jbGFzc19icm93c2VyKQorICAgICAgICAgICAgdGV4dC5iaW5kKCI8PG9wZW4tcGF0aC1icm93c2VyPj4iLCBzZWxmLm9wZW5fcGF0aF9icm93c2VyKQorCisgICAgICAgIHNlbGYuc2V0X3N0YXR1c19iYXIoKQorICAgICAgICB2YmFyWydjb21tYW5kJ10gPSB0ZXh0Lnl2aWV3CisgICAgICAgIHZiYXIucGFjayhzaWRlPVJJR0hULCBmaWxsPVkpCisgICAgICAgIHRleHRbJ3lzY3JvbGxjb21tYW5kJ10gPSB2YmFyLnNldAorICAgICAgICBmb250V2VpZ2h0ID0gJ25vcm1hbCcKKyAgICAgICAgaWYgaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0VkaXRvcldpbmRvdycsICdmb250LWJvbGQnLCB0eXBlPSdib29sJyk6CisgICAgICAgICAgICBmb250V2VpZ2h0PSdib2xkJworICAgICAgICB0ZXh0LmNvbmZpZyhmb250PShpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnRWRpdG9yV2luZG93JywgJ2ZvbnQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0VkaXRvcldpbmRvdycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9udC1zaXplJywgdHlwZT0naW50JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQpKQorICAgICAgICB0ZXh0X2ZyYW1lLnBhY2soc2lkZT1MRUZULCBmaWxsPUJPVEgsIGV4cGFuZD0xKQorICAgICAgICB0ZXh0LnBhY2soc2lkZT1UT1AsIGZpbGw9Qk9USCwgZXhwYW5kPTEpCisgICAgICAgIHRleHQuZm9jdXNfc2V0KCkKKworICAgICAgICAjIHVzZXRhYnMgdHJ1ZSAgLT4gbGl0ZXJhbCB0YWIgY2hhcmFjdGVycyBhcmUgdXNlZCBieSBpbmRlbnQgYW5kCisgICAgICAgICMgICAgICAgICAgICAgICAgICBkZWRlbnQgY21kcywgcG9zc2libHkgbWl4ZWQgd2l0aCBzcGFjZXMgaWYKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIGluZGVudHdpZHRoIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRhYndpZHRoLAorICAgICAgICAjICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSBUYWJuYW5ueSB0byBuYWchCisgICAgICAgICMgICAgICAgICBmYWxzZSAtPiB0YWIgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIHRvIHNwYWNlcyBieSBpbmRlbnQKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIGFuZCBkZWRlbnQgY21kcywgYW5kIGRpdHRvIFRBQiBrZXlzdHJva2VzCisgICAgICAgICMgQWx0aG91Z2ggdXNlLXNwYWNlcz0wIGNhbiBiZSBjb25maWd1cmVkIG1hbnVhbGx5IGluIGNvbmZpZy1tYWluLmRlZiwKKyAgICAgICAgIyBjb25maWd1cmF0aW9uIG9mIHRhYnMgdi4gc3BhY2VzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgIyBkaWFsb2cuICBJRExFIHByb21vdGVzIHRoZSBwcmVmZXJyZWQgUHl0aG9uIGluZGVudGF0aW9uOiB1c2Ugc3BhY2VzIQorICAgICAgICB1c2VzcGFjZXMgPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnSW5kZW50JywgJ3VzZS1zcGFjZXMnLCB0eXBlPSdib29sJykKKyAgICAgICAgc2VsZi51c2V0YWJzID0gbm90IHVzZXNwYWNlcworCisgICAgICAgICMgdGFid2lkdGggaXMgdGhlIGRpc3BsYXkgd2lkdGggb2YgYSBsaXRlcmFsIHRhYiBjaGFyYWN0ZXIuCisgICAgICAgICMgQ0FVVElPTjogIHRlbGxpbmcgVGsgdG8gdXNlIGFueXRoaW5nIG90aGVyIHRoYW4gaXRzIGRlZmF1bHQKKyAgICAgICAgIyB0YWIgc2V0dGluZyBjYXVzZXMgaXQgdG8gdXNlIGFuIGVudGlyZWx5IGRpZmZlcmVudCB0YWJiaW5nIGFsZ29yaXRobSwKKyAgICAgICAgIyB0cmVhdGluZyB0YWIgc3RvcHMgYXMgZml4ZWQgZGlzdGFuY2VzIGZyb20gdGhlIGxlZnQgbWFyZ2luLgorICAgICAgICAjIE5vYm9keSBleHBlY3RzIHRoaXMsIHNvIGZvciBub3cgdGFid2lkdGggc2hvdWxkIG5ldmVyIGJlIGNoYW5nZWQuCisgICAgICAgIHNlbGYudGFid2lkdGggPSA4ICAgICMgbXVzdCByZW1haW4gOCB1bnRpbCBUayBpcyBmaXhlZC4KKworICAgICAgICAjIGluZGVudHdpZHRoIGlzIHRoZSBudW1iZXIgb2Ygc2NyZWVuIGNoYXJhY3RlcnMgcGVyIGluZGVudCBsZXZlbC4KKyAgICAgICAgIyBUaGUgcmVjb21tZW5kZWQgUHl0aG9uIGluZGVudGF0aW9uIGlzIGZvdXIgc3BhY2VzLgorICAgICAgICBzZWxmLmluZGVudHdpZHRoID0gc2VsZi50YWJ3aWR0aAorICAgICAgICBzZWxmLnNldF9ub3RhYnNfaW5kZW50d2lkdGgoKQorCisgICAgICAgICMgSWYgY29udGV4dF91c2VfcHMxIGlzIHRydWUsIHBhcnNpbmcgc2VhcmNoZXMgYmFjayBmb3IgYSBwczEgbGluZTsKKyAgICAgICAgIyBlbHNlIHNlYXJjaGVzIGZvciBhIHBvcHVsYXIgKGlmLCBkZWYsIC4uLikgUHl0aG9uIHN0bXQuCisgICAgICAgIHNlbGYuY29udGV4dF91c2VfcHMxID0gRmFsc2UKKworICAgICAgICAjIFdoZW4gc2VhcmNoaW5nIGJhY2t3YXJkcyBmb3IgYSByZWxpYWJsZSBwbGFjZSB0byBiZWdpbiBwYXJzaW5nLAorICAgICAgICAjIGZpcnN0IHN0YXJ0IG51bV9jb250ZXh0X2xpbmVzWzBdIGxpbmVzIGJhY2ssIHRoZW4KKyAgICAgICAgIyBudW1fY29udGV4dF9saW5lc1sxXSBsaW5lcyBiYWNrIGlmIHRoYXQgZGlkbid0IHdvcmssIGFuZCBzbyBvbi4KKyAgICAgICAgIyBUaGUgbGFzdCB2YWx1ZSBzaG91bGQgYmUgaHVnZSAobGFyZ2VyIHRoYW4gdGhlICMgb2YgbGluZXMgaW4gYQorICAgICAgICAjIGNvbmNlaXZhYmxlIGZpbGUpLgorICAgICAgICAjIE1ha2luZyB0aGUgaW5pdGlhbCB2YWx1ZXMgbGFyZ2VyIHNsb3dzIHRoaW5ncyBkb3duIG1vcmUgb2Z0ZW4uCisgICAgICAgIHNlbGYubnVtX2NvbnRleHRfbGluZXMgPSA1MCwgNTAwLCA1MDAwMDAwCisKKyAgICAgICAgc2VsZi5wZXIgPSBwZXIgPSBzZWxmLlBlcmNvbGF0b3IodGV4dCkKKworICAgICAgICBzZWxmLnVuZG8gPSB1bmRvID0gc2VsZi5VbmRvRGVsZWdhdG9yKCkKKyAgICAgICAgcGVyLmluc2VydGZpbHRlcih1bmRvKQorICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RhcnQgPSB1bmRvLnVuZG9fYmxvY2tfc3RhcnQKKyAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0b3AgPSB1bmRvLnVuZG9fYmxvY2tfc3RvcAorICAgICAgICB1bmRvLnNldF9zYXZlZF9jaGFuZ2VfaG9vayhzZWxmLnNhdmVkX2NoYW5nZV9ob29rKQorCisgICAgICAgICMgSU9CaW5kaW5nIGltcGxlbWVudHMgZmlsZSBJL08gYW5kIHByaW50aW5nIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgc2VsZi5pbyA9IGlvID0gc2VsZi5JT0JpbmRpbmcoc2VsZikKKyAgICAgICAgaW8uc2V0X2ZpbGVuYW1lX2NoYW5nZV9ob29rKHNlbGYuZmlsZW5hbWVfY2hhbmdlX2hvb2spCisKKyAgICAgICAgIyBDcmVhdGUgdGhlIHJlY2VudCBmaWxlcyBzdWJtZW51CisgICAgICAgIHNlbGYucmVjZW50X2ZpbGVzX21lbnUgPSBNZW51KHNlbGYubWVudWJhcikKKyAgICAgICAgc2VsZi5tZW51ZGljdFsnZmlsZSddLmluc2VydF9jYXNjYWRlKDMsIGxhYmVsPSdSZWNlbnQgRmlsZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51PXNlbGYucmVjZW50X2ZpbGVzX21lbnUpCisgICAgICAgIHNlbGYudXBkYXRlX3JlY2VudF9maWxlc19saXN0KCkKKworICAgICAgICBzZWxmLmNvbG9yID0gTm9uZSAjIGluaXRpYWxpemVkIGJlbG93IGluIHNlbGYuUmVzZXRDb2xvcml6ZXIKKyAgICAgICAgaWYgZmlsZW5hbWU6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSkgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBpby5sb2FkZmlsZShmaWxlbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaW8uc2V0X2ZpbGVuYW1lKGZpbGVuYW1lKQorICAgICAgICBzZWxmLlJlc2V0Q29sb3JpemVyKCkKKyAgICAgICAgc2VsZi5zYXZlZF9jaGFuZ2VfaG9vaygpCisKKyAgICAgICAgc2VsZi5zZXRfaW5kZW50YXRpb25fcGFyYW1zKHNlbGYuaXNweXRob25zb3VyY2UoZmlsZW5hbWUpKQorCisgICAgICAgIHNlbGYubG9hZF9leHRlbnNpb25zKCkKKworICAgICAgICBtZW51ID0gc2VsZi5tZW51ZGljdC5nZXQoJ3dpbmRvd3MnKQorICAgICAgICBpZiBtZW51OgorICAgICAgICAgICAgZW5kID0gbWVudS5pbmRleCgiZW5kIikKKyAgICAgICAgICAgIGlmIGVuZCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGVuZCA9IC0xCisgICAgICAgICAgICBpZiBlbmQgPj0gMDoKKyAgICAgICAgICAgICAgICBtZW51LmFkZF9zZXBhcmF0b3IoKQorICAgICAgICAgICAgICAgIGVuZCA9IGVuZCArIDEKKyAgICAgICAgICAgIHNlbGYud21lbnVfZW5kID0gZW5kCisgICAgICAgICAgICBXaW5kb3dMaXN0LnJlZ2lzdGVyX2NhbGxiYWNrKHNlbGYucG9zdHdpbmRvd3NtZW51KQorCisgICAgICAgICMgU29tZSBhYnN0cmFjdGlvbnMgc28gSURMRSBleHRlbnNpb25zIGFyZSBjcm9zcy1JREUKKyAgICAgICAgc2VsZi5hc2t5ZXNubyA9IHRrTWVzc2FnZUJveC5hc2t5ZXNubworICAgICAgICBzZWxmLmFza2ludGVnZXIgPSB0a1NpbXBsZURpYWxvZy5hc2tpbnRlZ2VyCisgICAgICAgIHNlbGYuc2hvd2Vycm9yID0gdGtNZXNzYWdlQm94LnNob3dlcnJvcgorCisgICAgZGVmIF9maWxlbmFtZV90b191bmljb2RlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiY29udmVydCBmaWxlbmFtZSB0byB1bmljb2RlIGluIG9yZGVyIHRvIGRpc3BsYXkgaXQgaW4gVGsiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgdW5pY29kZSkgb3Igbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmRlY29kZShzZWxmLmZpbGVzeXN0ZW1lbmNvZGluZykKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBYWFgKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZS5kZWNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIGJ5dGUtdG8tYnl0ZSBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZS5kZWNvZGUoJ2lzbzg4NTktMScpCisKKyAgICBkZWYgbmV3X2NhbGxiYWNrKHNlbGYsIGV2ZW50KToKKyAgICAgICAgZGlybmFtZSwgYmFzZW5hbWUgPSBzZWxmLmlvLmRlZmF1bHRmaWxlbmFtZSgpCisgICAgICAgIHNlbGYuZmxpc3QubmV3KGRpcm5hbWUpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgaG9tZV9jYWxsYmFjayhzZWxmLCBldmVudCk6CisgICAgICAgIGlmIChldmVudC5zdGF0ZSAmIDQpICE9IDAgYW5kIGV2ZW50LmtleXN5bSA9PSAiSG9tZSI6CisgICAgICAgICAgICAjIHN0YXRlJjQ9PUNvbnRyb2wuIElmIDxDb250cm9sLUhvbWU+LCB1c2UgdGhlIFRrIGJpbmRpbmcuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi50ZXh0LmluZGV4KCJpb21hcmsiKSBhbmQgXAorICAgICAgICAgICBzZWxmLnRleHQuY29tcGFyZSgiaW9tYXJrIiwgIjw9IiwgImluc2VydCBsaW5lZW5kIikgYW5kIFwKKyAgICAgICAgICAgc2VsZi50ZXh0LmNvbXBhcmUoImluc2VydCBsaW5lc3RhcnQiLCAiPD0iLCAiaW9tYXJrIik6CisgICAgICAgICAgICAjIEluIFNoZWxsIG9uIGlucHV0IGxpbmUsIGdvIHRvIGp1c3QgYWZ0ZXIgcHJvbXB0CisgICAgICAgICAgICBpbnNlcnRwdCA9IGludChzZWxmLnRleHQuaW5kZXgoImlvbWFyayIpLnNwbGl0KCIuIilbMV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsaW5lID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQgbGluZWVuZCIpCisgICAgICAgICAgICBmb3IgaW5zZXJ0cHQgaW4geHJhbmdlKGxlbihsaW5lKSk6CisgICAgICAgICAgICAgICAgaWYgbGluZVtpbnNlcnRwdF0gbm90IGluICgnICcsJ1x0Jyk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGluc2VydHB0PWxlbihsaW5lKQorICAgICAgICBsaW5lYXQgPSBpbnQoc2VsZi50ZXh0LmluZGV4KCJpbnNlcnQiKS5zcGxpdCgnLicpWzFdKQorICAgICAgICBpZiBpbnNlcnRwdCA9PSBsaW5lYXQ6CisgICAgICAgICAgICBpbnNlcnRwdCA9IDAKKyAgICAgICAgZGVzdCA9ICJpbnNlcnQgbGluZXN0YXJ0KyIrc3RyKGluc2VydHB0KSsiYyIKKyAgICAgICAgaWYgKGV2ZW50LnN0YXRlJjEpID09IDA6CisgICAgICAgICAgICAjIHNoaWZ0IHdhcyBub3QgcHJlc3NlZAorICAgICAgICAgICAgc2VsZi50ZXh0LnRhZ19yZW1vdmUoInNlbCIsICIxLjAiLCAiZW5kIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRleHQuaW5kZXgoInNlbC5maXJzdCIpOgorICAgICAgICAgICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgibXlfYW5jaG9yIiwgImluc2VydCIpICAjIHRoZXJlIHdhcyBubyBwcmV2aW91cyBzZWxlY3Rpb24KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi50ZXh0LmNvbXBhcmUoc2VsZi50ZXh0LmluZGV4KCJzZWwuZmlyc3QiKSwgIjwiLCBzZWxmLnRleHQuaW5kZXgoImluc2VydCIpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJteV9hbmNob3IiLCAic2VsLmZpcnN0IikgIyBleHRlbmQgYmFjaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgibXlfYW5jaG9yIiwgInNlbC5sYXN0IikgIyBleHRlbmQgZm9yd2FyZAorICAgICAgICAgICAgZmlyc3QgPSBzZWxmLnRleHQuaW5kZXgoZGVzdCkKKyAgICAgICAgICAgIGxhc3QgPSBzZWxmLnRleHQuaW5kZXgoIm15X2FuY2hvciIpCisgICAgICAgICAgICBpZiBzZWxmLnRleHQuY29tcGFyZShmaXJzdCwiPiIsbGFzdCk6CisgICAgICAgICAgICAgICAgZmlyc3QsbGFzdCA9IGxhc3QsZmlyc3QKKyAgICAgICAgICAgIHNlbGYudGV4dC50YWdfcmVtb3ZlKCJzZWwiLCAiMS4wIiwgImVuZCIpCisgICAgICAgICAgICBzZWxmLnRleHQudGFnX2FkZCgic2VsIiwgZmlyc3QsIGxhc3QpCisgICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgZGVzdCkKKyAgICAgICAgc2VsZi50ZXh0LnNlZSgiaW5zZXJ0IikKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBzZXRfc3RhdHVzX2JhcihzZWxmKToKKyAgICAgICAgc2VsZi5zdGF0dXNfYmFyID0gc2VsZi5NdWx0aVN0YXR1c0JhcihzZWxmLnRvcCkKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgICAgICMgSW5zZXJ0IHNvbWUgcGFkZGluZyB0byBhdm9pZCBvYnNjdXJpbmcgc29tZSBvZiB0aGUgc3RhdHVzYmFyCisgICAgICAgICAgICAjIGJ5IHRoZSByZXNpemUgd2lkZ2V0LgorICAgICAgICAgICAgc2VsZi5zdGF0dXNfYmFyLnNldF9sYWJlbCgnX3BhZGRpbmcxJywgJyAgICAnLCBzaWRlPVJJR0hUKQorICAgICAgICBzZWxmLnN0YXR1c19iYXIuc2V0X2xhYmVsKCdjb2x1bW4nLCAnQ29sOiA/Jywgc2lkZT1SSUdIVCkKKyAgICAgICAgc2VsZi5zdGF0dXNfYmFyLnNldF9sYWJlbCgnbGluZScsICdMbjogPycsIHNpZGU9UklHSFQpCisgICAgICAgIHNlbGYuc3RhdHVzX2Jhci5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpCisgICAgICAgIHNlbGYudGV4dC5iaW5kKCI8PHNldC1saW5lLWFuZC1jb2x1bW4+PiIsIHNlbGYuc2V0X2xpbmVfYW5kX2NvbHVtbikKKyAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2FkZCgiPDxzZXQtbGluZS1hbmQtY29sdW1uPj4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8S2V5UmVsZWFzZT4iLCAiPEJ1dHRvblJlbGVhc2U+IikKKyAgICAgICAgc2VsZi50ZXh0LmFmdGVyX2lkbGUoc2VsZi5zZXRfbGluZV9hbmRfY29sdW1uKQorCisgICAgZGVmIHNldF9saW5lX2FuZF9jb2x1bW4oc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGxpbmUsIGNvbHVtbiA9IHNlbGYudGV4dC5pbmRleChJTlNFUlQpLnNwbGl0KCcuJykKKyAgICAgICAgc2VsZi5zdGF0dXNfYmFyLnNldF9sYWJlbCgnY29sdW1uJywgJ0NvbDogJXMnICUgY29sdW1uKQorICAgICAgICBzZWxmLnN0YXR1c19iYXIuc2V0X2xhYmVsKCdsaW5lJywgJ0xuOiAlcycgJSBsaW5lKQorCisgICAgbWVudV9zcGVjcyA9IFsKKyAgICAgICAgKCJmaWxlIiwgIl9GaWxlIiksCisgICAgICAgICgiZWRpdCIsICJfRWRpdCIpLAorICAgICAgICAoImZvcm1hdCIsICJGX29ybWF0IiksCisgICAgICAgICgicnVuIiwgIl9SdW4iKSwKKyAgICAgICAgKCJvcHRpb25zIiwgIl9PcHRpb25zIiksCisgICAgICAgICgid2luZG93cyIsICJfV2luZG93cyIpLAorICAgICAgICAoImhlbHAiLCAiX0hlbHAiKSwKKyAgICBdCisKKyAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICBkZWwgbWVudV9zcGVjc1stM10KKyAgICAgICAgbWVudV9zcGVjc1stMl0gPSAoIndpbmRvd3MiLCAiX1dpbmRvdyIpCisKKworICAgIGRlZiBjcmVhdGVtZW51YmFyKHNlbGYpOgorICAgICAgICBtYmFyID0gc2VsZi5tZW51YmFyCisgICAgICAgIHNlbGYubWVudWRpY3QgPSBtZW51ZGljdCA9IHt9CisgICAgICAgIGZvciBuYW1lLCBsYWJlbCBpbiBzZWxmLm1lbnVfc3BlY3M6CisgICAgICAgICAgICB1bmRlcmxpbmUsIGxhYmVsID0gcHJlcHN0cihsYWJlbCkKKyAgICAgICAgICAgIG1lbnVkaWN0W25hbWVdID0gbWVudSA9IE1lbnUobWJhciwgbmFtZT1uYW1lKQorICAgICAgICAgICAgbWJhci5hZGRfY2FzY2FkZShsYWJlbD1sYWJlbCwgbWVudT1tZW51LCB1bmRlcmxpbmU9dW5kZXJsaW5lKQorCisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQuaXNDYXJib25BcXVhVGsoc2VsZi5yb290KToKKyAgICAgICAgICAgICMgSW5zZXJ0IHRoZSBhcHBsaWNhdGlvbiBtZW51CisgICAgICAgICAgICBtZW51ZGljdFsnYXBwbGljYXRpb24nXSA9IG1lbnUgPSBNZW51KG1iYXIsIG5hbWU9J2FwcGxlJykKKyAgICAgICAgICAgIG1iYXIuYWRkX2Nhc2NhZGUobGFiZWw9J0lETEUnLCBtZW51PW1lbnUpCisKKyAgICAgICAgc2VsZi5maWxsX21lbnVzKCkKKyAgICAgICAgc2VsZi5iYXNlX2hlbHBtZW51X2xlbmd0aCA9IHNlbGYubWVudWRpY3RbJ2hlbHAnXS5pbmRleChFTkQpCisgICAgICAgIHNlbGYucmVzZXRfaGVscF9tZW51X2VudHJpZXMoKQorCisgICAgZGVmIHBvc3R3aW5kb3dzbWVudShzZWxmKToKKyAgICAgICAgIyBPbmx5IGNhbGxlZCB3aGVuIFdpbmRvd3MgbWVudSBleGlzdHMKKyAgICAgICAgbWVudSA9IHNlbGYubWVudWRpY3RbJ3dpbmRvd3MnXQorICAgICAgICBlbmQgPSBtZW51LmluZGV4KCJlbmQiKQorICAgICAgICBpZiBlbmQgaXMgTm9uZToKKyAgICAgICAgICAgIGVuZCA9IC0xCisgICAgICAgIGlmIGVuZCA+IHNlbGYud21lbnVfZW5kOgorICAgICAgICAgICAgbWVudS5kZWxldGUoc2VsZi53bWVudV9lbmQrMSwgZW5kKQorICAgICAgICBXaW5kb3dMaXN0LmFkZF93aW5kb3dzX3RvX21lbnUobWVudSkKKworICAgIHJtZW51ID0gTm9uZQorCisgICAgZGVmIHJpZ2h0X21lbnVfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLnRleHQubWFya19zZXQoImluc2VydCIsICJAJWQsJWQiICUgKGV2ZW50LngsIGV2ZW50LnkpKQorICAgICAgICBpZiBub3Qgc2VsZi5ybWVudToKKyAgICAgICAgICAgIHNlbGYubWFrZV9ybWVudSgpCisgICAgICAgIHJtZW51ID0gc2VsZi5ybWVudQorICAgICAgICBzZWxmLmV2ZW50ID0gZXZlbnQKKyAgICAgICAgaXN3aW4gPSBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nCisgICAgICAgIGlmIGlzd2luOgorICAgICAgICAgICAgc2VsZi50ZXh0LmNvbmZpZyhjdXJzb3I9ImFycm93IikKKworICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnJtZW51X3NwZWNzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxhYmVsLCBldmVudG5hbWUsIHZlcmlmeV9zdGF0ZSA9IGl0ZW0KKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiAjIHNlZSBpc3N1ZTEyMDc1ODkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiB2ZXJpZnlfc3RhdGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc3RhdGUgPSBnZXRhdHRyKHNlbGYsIHZlcmlmeV9zdGF0ZSkoKQorICAgICAgICAgICAgcm1lbnUuZW50cnljb25maWd1cmUobGFiZWwsIHN0YXRlPXN0YXRlKQorCisgICAgICAgIHJtZW51LnRrX3BvcHVwKGV2ZW50Lnhfcm9vdCwgZXZlbnQueV9yb290KQorICAgICAgICBpZiBpc3dpbjoKKyAgICAgICAgICAgIHNlbGYudGV4dC5jb25maWcoY3Vyc29yPSJpYmVhbSIpCisKKyAgICBybWVudV9zcGVjcyA9IFsKKyAgICAgICAgIyAoIkxhYmVsIiwgIjw8dmlydHVhbC1ldmVudD4+IiwgInN0YXRlZnVuY25hbWUiKSwgLi4uCisgICAgICAgICgiQ2xvc2UiLCAiPDxjbG9zZS13aW5kb3c+PiIsIE5vbmUpLCAjIEV4YW1wbGUKKyAgICBdCisKKyAgICBkZWYgbWFrZV9ybWVudShzZWxmKToKKyAgICAgICAgcm1lbnUgPSBNZW51KHNlbGYudGV4dCwgdGVhcm9mZj0wKQorICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnJtZW51X3NwZWNzOgorICAgICAgICAgICAgbGFiZWwsIGV2ZW50bmFtZSA9IGl0ZW1bMF0sIGl0ZW1bMV0KKyAgICAgICAgICAgIGlmIGxhYmVsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGRlZiBjb21tYW5kKHRleHQ9c2VsZi50ZXh0LCBldmVudG5hbWU9ZXZlbnRuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5ldmVudF9nZW5lcmF0ZShldmVudG5hbWUpCisgICAgICAgICAgICAgICAgcm1lbnUuYWRkX2NvbW1hbmQobGFiZWw9bGFiZWwsIGNvbW1hbmQ9Y29tbWFuZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcm1lbnUuYWRkX3NlcGFyYXRvcigpCisgICAgICAgIHNlbGYucm1lbnUgPSBybWVudQorCisgICAgZGVmIHJtZW51X2NoZWNrX2N1dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucm1lbnVfY2hlY2tfY29weSgpCisKKyAgICBkZWYgcm1lbnVfY2hlY2tfY29weShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW5keCA9IHNlbGYudGV4dC5pbmRleCgnc2VsLmZpcnN0JykKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgcmV0dXJuICdkaXNhYmxlZCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnbm9ybWFsJyBpZiBpbmR4IGVsc2UgJ2Rpc2FibGVkJworCisgICAgZGVmIHJtZW51X2NoZWNrX3Bhc3RlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRleHQudGsuY2FsbCgndGs6OkdldFNlbGVjdGlvbicsIHNlbGYudGV4dCwgJ0NMSVBCT0FSRCcpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAnZGlzYWJsZWQnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ25vcm1hbCcKKworICAgIGRlZiBhYm91dF9kaWFsb2coc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGFib3V0RGlhbG9nLkFib3V0RGlhbG9nKHNlbGYudG9wLCdBYm91dCBJRExFJykKKworICAgIGRlZiBjb25maWdfZGlhbG9nKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBjb25maWdEaWFsb2cuQ29uZmlnRGlhbG9nKHNlbGYudG9wLCdTZXR0aW5ncycpCisKKyAgICBkZWYgaGVscF9kaWFsb2coc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYucm9vdDoKKyAgICAgICAgICAgIHBhcmVudCA9IHNlbGYucm9vdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyZW50ID0gc2VsZi50b3AKKyAgICAgICAgaGVscERpYWxvZy5kaXNwbGF5KHBhcmVudCwgbmVhcj1zZWxmLnRvcCkKKworICAgIGRlZiBweXRob25fZG9jcyhzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnd2luJzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5zdGFydGZpbGUoc2VsZi5oZWxwX3VybCkKKyAgICAgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3IgYXMgd2h5OgorICAgICAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J0RvY3VtZW50IFN0YXJ0IEZhaWx1cmUnLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPXN0cih3aHkpLCBwYXJlbnQ9c2VsZi50ZXh0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2ViYnJvd3Nlci5vcGVuKHNlbGYuaGVscF91cmwpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgY3V0KHNlbGYsZXZlbnQpOgorICAgICAgICBzZWxmLnRleHQuZXZlbnRfZ2VuZXJhdGUoIjw8Q3V0Pj4iKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGNvcHkoc2VsZixldmVudCk6CisgICAgICAgIGlmIG5vdCBzZWxmLnRleHQudGFnX3Jhbmdlcygic2VsIik6CisgICAgICAgICAgICAjIFRoZXJlIGlzIG5vIHNlbGVjdGlvbiwgc28gZG8gbm90aGluZyBhbmQgbWF5YmUgaW50ZXJydXB0LgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudGV4dC5ldmVudF9nZW5lcmF0ZSgiPDxDb3B5Pj4iKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIHBhc3RlKHNlbGYsZXZlbnQpOgorICAgICAgICBzZWxmLnRleHQuZXZlbnRfZ2VuZXJhdGUoIjw8UGFzdGU+PiIpCisgICAgICAgIHNlbGYudGV4dC5zZWUoImluc2VydCIpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgc2VsZWN0X2FsbChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgc2VsZi50ZXh0LnRhZ19hZGQoInNlbCIsICIxLjAiLCAiZW5kLTFjIikKKyAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCAiMS4wIikKKyAgICAgICAgc2VsZi50ZXh0LnNlZSgiaW5zZXJ0IikKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiByZW1vdmVfc2VsZWN0aW9uKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLnRleHQudGFnX3JlbW92ZSgic2VsIiwgIjEuMCIsICJlbmQiKQorICAgICAgICBzZWxmLnRleHQuc2VlKCJpbnNlcnQiKQorCisgICAgZGVmIG1vdmVfYXRfZWRnZV9pZl9zZWxlY3Rpb24oc2VsZiwgZWRnZV9pbmRleCk6CisgICAgICAgICIiIkN1cnNvciBtb3ZlIGJlZ2lucyBhdCBzdGFydCBvciBlbmQgb2Ygc2VsZWN0aW9uCisKKyAgICAgICAgV2hlbiBhIGxlZnQvcmlnaHQgY3Vyc29yIGtleSBpcyBwcmVzc2VkIGNyZWF0ZSBhbmQgcmV0dXJuIHRvIFRraW50ZXIgYQorICAgICAgICBmdW5jdGlvbiB3aGljaCBjYXVzZXMgYSBjdXJzb3IgbW92ZSBmcm9tIHRoZSBhc3NvY2lhdGVkIGVkZ2Ugb2YgdGhlCisgICAgICAgIHNlbGVjdGlvbi4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZl90ZXh0X2luZGV4ID0gc2VsZi50ZXh0LmluZGV4CisgICAgICAgIHNlbGZfdGV4dF9tYXJrX3NldCA9IHNlbGYudGV4dC5tYXJrX3NldAorICAgICAgICBlZGdlc190YWJsZSA9ICgic2VsLmZpcnN0KzFjIiwgInNlbC5sYXN0LTFjIikKKyAgICAgICAgZGVmIG1vdmVfYXRfZWRnZShldmVudCk6CisgICAgICAgICAgICBpZiAoZXZlbnQuc3RhdGUgJiA1KSA9PSAwOiAjIG5vIHNoaWZ0KD09MSkgb3IgY29udHJvbCg9PTQpIHByZXNzZWQKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGZfdGV4dF9pbmRleCgic2VsLmZpcnN0IikKKyAgICAgICAgICAgICAgICAgICAgc2VsZl90ZXh0X21hcmtfc2V0KCJpbnNlcnQiLCBlZGdlc190YWJsZVtlZGdlX2luZGV4XSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIG1vdmVfYXRfZWRnZQorCisgICAgZGVmIGRlbF93b3JkX2xlZnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLnRleHQuZXZlbnRfZ2VuZXJhdGUoJzxNZXRhLURlbGV0ZT4nKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGRlbF93b3JkX3JpZ2h0KHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2dlbmVyYXRlKCc8TWV0YS1kPicpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgZmluZF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIFNlYXJjaERpYWxvZy5maW5kKHNlbGYudGV4dCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBmaW5kX2FnYWluX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgU2VhcmNoRGlhbG9nLmZpbmRfYWdhaW4oc2VsZi50ZXh0KQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGZpbmRfc2VsZWN0aW9uX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgU2VhcmNoRGlhbG9nLmZpbmRfc2VsZWN0aW9uKHNlbGYudGV4dCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBmaW5kX2luX2ZpbGVzX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgR3JlcERpYWxvZy5ncmVwKHNlbGYudGV4dCwgc2VsZi5pbywgc2VsZi5mbGlzdCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiByZXBsYWNlX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgUmVwbGFjZURpYWxvZy5yZXBsYWNlKHNlbGYudGV4dCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBnb3RvX2xpbmVfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIGxpbmVubyA9IHRrU2ltcGxlRGlhbG9nLmFza2ludGVnZXIoIkdvdG8iLAorICAgICAgICAgICAgICAgICJHbyB0byBsaW5lIG51bWJlcjoiLHBhcmVudD10ZXh0KQorICAgICAgICBpZiBsaW5lbm8gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIGlmIGxpbmVubyA8PSAwOgorICAgICAgICAgICAgdGV4dC5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIHRleHQubWFya19zZXQoImluc2VydCIsICIlZC4wIiAlIGxpbmVubykKKyAgICAgICAgdGV4dC5zZWUoImluc2VydCIpCisKKyAgICBkZWYgb3Blbl9tb2R1bGUoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgICMgWFhYIFNob3VsZG4ndCB0aGlzIGJlIGluIElPQmluZGluZyBvciBpbiBGaWxlTGlzdD8KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZSA9IHNlbGYudGV4dC5nZXQoInNlbC5maXJzdCIsICJzZWwubGFzdCIpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgIG5hbWUgPSAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3RyaXAoKQorICAgICAgICBuYW1lID0gdGtTaW1wbGVEaWFsb2cuYXNrc3RyaW5nKCJNb2R1bGUiLAorICAgICAgICAgICAgICAgICAiRW50ZXIgdGhlIG5hbWUgb2YgYSBQeXRob24gbW9kdWxlXG4iCisgICAgICAgICAgICAgICAgICJ0byBzZWFyY2ggb24gc3lzLnBhdGggYW5kIG9wZW46IiwKKyAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCwgaW5pdGlhbHZhbHVlPW5hbWUpCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdHJpcCgpCisgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgWFhYIE91Z2h0IHRvIGluc2VydCBjdXJyZW50IGZpbGUncyBkaXJlY3RvcnkgaW4gZnJvbnQgb2YgcGF0aAorICAgICAgICB0cnk6CisgICAgICAgICAgICAoZiwgZmlsZSwgKHN1ZmZpeCwgbW9kZSwgdHlwZSkpID0gX2ZpbmRfbW9kdWxlKG5hbWUpCisgICAgICAgIGV4Y2VwdCAoTmFtZUVycm9yLCBJbXBvcnRFcnJvciksIG1zZzoKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIkltcG9ydCBlcnJvciIsIHN0cihtc2cpLCBwYXJlbnQ9c2VsZi50ZXh0KQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHR5cGUgIT0gaW1wLlBZX1NPVVJDRToKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIlVuc3VwcG9ydGVkIHR5cGUiLAorICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzb3VyY2UgbW9kdWxlIiAlIG5hbWUsIHBhcmVudD1zZWxmLnRleHQpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgZjoKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLmZsaXN0OgorICAgICAgICAgICAgc2VsZi5mbGlzdC5vcGVuKGZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmlvLmxvYWRmaWxlKGZpbGUpCisKKyAgICBkZWYgb3Blbl9jbGFzc19icm93c2VyKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuaW8uZmlsZW5hbWUKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigKKyAgICAgICAgICAgICAgICAiTm8gZmlsZW5hbWUiLAorICAgICAgICAgICAgICAgICJUaGlzIGJ1ZmZlciBoYXMgbm8gYXNzb2NpYXRlZCBmaWxlbmFtZSIsCisgICAgICAgICAgICAgICAgbWFzdGVyPXNlbGYudGV4dCkKKyAgICAgICAgICAgIHNlbGYudGV4dC5mb2N1c19zZXQoKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCisgICAgICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQodGFpbCkKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBDbGFzc0Jyb3dzZXIKKyAgICAgICAgQ2xhc3NCcm93c2VyLkNsYXNzQnJvd3NlcihzZWxmLmZsaXN0LCBiYXNlLCBbaGVhZF0pCisKKyAgICBkZWYgb3Blbl9wYXRoX2Jyb3dzZXIoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgUGF0aEJyb3dzZXIKKyAgICAgICAgUGF0aEJyb3dzZXIuUGF0aEJyb3dzZXIoc2VsZi5mbGlzdCkKKworICAgIGRlZiBnb3RvbGluZShzZWxmLCBsaW5lbm8pOgorICAgICAgICBpZiBsaW5lbm8gaXMgbm90IE5vbmUgYW5kIGxpbmVubyA+IDA6CisgICAgICAgICAgICBzZWxmLnRleHQubWFya19zZXQoImluc2VydCIsICIlZC4wIiAlIGxpbmVubykKKyAgICAgICAgICAgIHNlbGYudGV4dC50YWdfcmVtb3ZlKCJzZWwiLCAiMS4wIiwgImVuZCIpCisgICAgICAgICAgICBzZWxmLnRleHQudGFnX2FkZCgic2VsIiwgImluc2VydCIsICJpbnNlcnQgKzFsIikKKyAgICAgICAgICAgIHNlbGYuY2VudGVyKCkKKworICAgIGRlZiBpc3B5dGhvbnNvdXJjZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGlmIG5vdCBmaWxlbmFtZSBvciBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpCisgICAgICAgIGlmIG9zLnBhdGgubm9ybWNhc2UoZXh0KSBpbiAoIi5weSIsICIucHl3Iik6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSkKKyAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gbGluZS5zdGFydHN3aXRoKCcjIScpIGFuZCBsaW5lLmZpbmQoJ3B5dGhvbicpID49IDAKKworICAgIGRlZiBjbG9zZV9ob29rKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZsaXN0OgorICAgICAgICAgICAgc2VsZi5mbGlzdC51bnJlZ2lzdGVyX21heWJlX3Rlcm1pbmF0ZShzZWxmKQorICAgICAgICAgICAgc2VsZi5mbGlzdCA9IE5vbmUKKworICAgIGRlZiBzZXRfY2xvc2VfaG9vayhzZWxmLCBjbG9zZV9ob29rKToKKyAgICAgICAgc2VsZi5jbG9zZV9ob29rID0gY2xvc2VfaG9vaworCisgICAgZGVmIGZpbGVuYW1lX2NoYW5nZV9ob29rKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZsaXN0OgorICAgICAgICAgICAgc2VsZi5mbGlzdC5maWxlbmFtZV9jaGFuZ2VkX2VkaXQoc2VsZikKKyAgICAgICAgc2VsZi5zYXZlZF9jaGFuZ2VfaG9vaygpCisgICAgICAgIHNlbGYudG9wLnVwZGF0ZV93aW5kb3dsaXN0X3JlZ2lzdHJ5KHNlbGYpCisgICAgICAgIHNlbGYuUmVzZXRDb2xvcml6ZXIoKQorCisgICAgZGVmIF9hZGRjb2xvcml6ZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY29sb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5pc3B5dGhvbnNvdXJjZShzZWxmLmlvLmZpbGVuYW1lKToKKyAgICAgICAgICAgIHNlbGYuY29sb3IgPSBzZWxmLkNvbG9yRGVsZWdhdG9yKCkKKyAgICAgICAgIyBjYW4gYWRkIG1vcmUgY29sb3JpemVycyBoZXJlLi4uCisgICAgICAgIGlmIHNlbGYuY29sb3I6CisgICAgICAgICAgICBzZWxmLnBlci5yZW1vdmVmaWx0ZXIoc2VsZi51bmRvKQorICAgICAgICAgICAgc2VsZi5wZXIuaW5zZXJ0ZmlsdGVyKHNlbGYuY29sb3IpCisgICAgICAgICAgICBzZWxmLnBlci5pbnNlcnRmaWx0ZXIoc2VsZi51bmRvKQorCisgICAgZGVmIF9ybWNvbG9yaXplcihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuY29sb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jb2xvci5yZW1vdmVjb2xvcnMoKQorICAgICAgICBzZWxmLnBlci5yZW1vdmVmaWx0ZXIoc2VsZi5jb2xvcikKKyAgICAgICAgc2VsZi5jb2xvciA9IE5vbmUKKworICAgIGRlZiBSZXNldENvbG9yaXplcihzZWxmKToKKyAgICAgICAgIlVwZGF0ZSB0aGUgY29sb3VyIHRoZW1lIgorICAgICAgICAjIENhbGxlZCBmcm9tIHNlbGYuZmlsZW5hbWVfY2hhbmdlX2hvb2sgYW5kIGZyb20gY29uZmlnRGlhbG9nLnB5CisgICAgICAgIHNlbGYuX3JtY29sb3JpemVyKCkKKyAgICAgICAgc2VsZi5fYWRkY29sb3JpemVyKCkKKyAgICAgICAgdGhlbWUgPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdUaGVtZScsJ25hbWUnKQorICAgICAgICBub3JtYWxfY29sb3JzID0gaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAnbm9ybWFsJykKKyAgICAgICAgY3Vyc29yX2NvbG9yID0gaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAnY3Vyc29yJywgZmdCZz0nZmcnKQorICAgICAgICBzZWxlY3RfY29sb3JzID0gaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAnaGlsaXRlJykKKyAgICAgICAgc2VsZi50ZXh0LmNvbmZpZygKKyAgICAgICAgICAgIGZvcmVncm91bmQ9bm9ybWFsX2NvbG9yc1snZm9yZWdyb3VuZCddLAorICAgICAgICAgICAgYmFja2dyb3VuZD1ub3JtYWxfY29sb3JzWydiYWNrZ3JvdW5kJ10sCisgICAgICAgICAgICBpbnNlcnRiYWNrZ3JvdW5kPWN1cnNvcl9jb2xvciwKKyAgICAgICAgICAgIHNlbGVjdGZvcmVncm91bmQ9c2VsZWN0X2NvbG9yc1snZm9yZWdyb3VuZCddLAorICAgICAgICAgICAgc2VsZWN0YmFja2dyb3VuZD1zZWxlY3RfY29sb3JzWydiYWNrZ3JvdW5kJ10sCisgICAgICAgICAgICApCisKKyAgICBkZWYgUmVzZXRGb250KHNlbGYpOgorICAgICAgICAiVXBkYXRlIHRoZSB0ZXh0IHdpZGdldHMnIGZvbnQgaWYgaXQgaXMgY2hhbmdlZCIKKyAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKKyAgICAgICAgZm9udFdlaWdodD0nbm9ybWFsJworICAgICAgICBpZiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCdmb250LWJvbGQnLHR5cGU9J2Jvb2wnKToKKyAgICAgICAgICAgIGZvbnRXZWlnaHQ9J2JvbGQnCisgICAgICAgIHNlbGYudGV4dC5jb25maWcoZm9udD0oaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnRWRpdG9yV2luZG93JywnZm9udCcpLAorICAgICAgICAgICAgICAgIGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0VkaXRvcldpbmRvdycsJ2ZvbnQtc2l6ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2ludCcpLAorICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQpKQorCisgICAgZGVmIFJlbW92ZUtleWJpbmRpbmdzKHNlbGYpOgorICAgICAgICAiUmVtb3ZlIHRoZSBrZXliaW5kaW5ncyBiZWZvcmUgdGhleSBhcmUgY2hhbmdlZC4iCisgICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnRGlhbG9nLnB5CisgICAgICAgIHNlbGYuQmluZGluZ3MuZGVmYXVsdF9rZXlkZWZzID0ga2V5ZGVmcyA9IGlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQorICAgICAgICBmb3IgZXZlbnQsIGtleWxpc3QgaW4ga2V5ZGVmcy5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2RlbGV0ZShldmVudCwgKmtleWxpc3QpCisgICAgICAgIGZvciBleHRlbnNpb25OYW1lIGluIHNlbGYuZ2V0X3N0YW5kYXJkX2V4dGVuc2lvbl9uYW1lcygpOgorICAgICAgICAgICAgeGtleWRlZnMgPSBpZGxlQ29uZi5HZXRFeHRlbnNpb25CaW5kaW5ncyhleHRlbnNpb25OYW1lKQorICAgICAgICAgICAgaWYgeGtleWRlZnM6CisgICAgICAgICAgICAgICAgZm9yIGV2ZW50LCBrZXlsaXN0IGluIHhrZXlkZWZzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dC5ldmVudF9kZWxldGUoZXZlbnQsICprZXlsaXN0KQorCisgICAgZGVmIEFwcGx5S2V5YmluZGluZ3Moc2VsZik6CisgICAgICAgICJVcGRhdGUgdGhlIGtleWJpbmRpbmdzIGFmdGVyIHRoZXkgYXJlIGNoYW5nZWQiCisgICAgICAgICMgQ2FsbGVkIGZyb20gY29uZmlnRGlhbG9nLnB5CisgICAgICAgIHNlbGYuQmluZGluZ3MuZGVmYXVsdF9rZXlkZWZzID0ga2V5ZGVmcyA9IGlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQorICAgICAgICBzZWxmLmFwcGx5X2JpbmRpbmdzKCkKKyAgICAgICAgZm9yIGV4dGVuc2lvbk5hbWUgaW4gc2VsZi5nZXRfc3RhbmRhcmRfZXh0ZW5zaW9uX25hbWVzKCk6CisgICAgICAgICAgICB4a2V5ZGVmcyA9IGlkbGVDb25mLkdldEV4dGVuc2lvbkJpbmRpbmdzKGV4dGVuc2lvbk5hbWUpCisgICAgICAgICAgICBpZiB4a2V5ZGVmczoKKyAgICAgICAgICAgICAgICBzZWxmLmFwcGx5X2JpbmRpbmdzKHhrZXlkZWZzKQorICAgICAgICAjdXBkYXRlIG1lbnUgYWNjZWxlcmF0b3JzCisgICAgICAgIG1lbnVFdmVudERpY3QgPSB7fQorICAgICAgICBmb3IgbWVudSBpbiBzZWxmLkJpbmRpbmdzLm1lbnVkZWZzOgorICAgICAgICAgICAgbWVudUV2ZW50RGljdFttZW51WzBdXSA9IHt9CisgICAgICAgICAgICBmb3IgaXRlbSBpbiBtZW51WzFdOgorICAgICAgICAgICAgICAgIGlmIGl0ZW06CisgICAgICAgICAgICAgICAgICAgIG1lbnVFdmVudERpY3RbbWVudVswXV1bcHJlcHN0cihpdGVtWzBdKVsxXV0gPSBpdGVtWzFdCisgICAgICAgIGZvciBtZW51YmFySXRlbSBpbiBzZWxmLm1lbnVkaWN0LmtleXMoKToKKyAgICAgICAgICAgIG1lbnUgPSBzZWxmLm1lbnVkaWN0W21lbnViYXJJdGVtXQorICAgICAgICAgICAgZW5kID0gbWVudS5pbmRleChFTkQpICsgMQorICAgICAgICAgICAgZm9yIGluZGV4IGluIHJhbmdlKDAsIGVuZCk6CisgICAgICAgICAgICAgICAgaWYgbWVudS50eXBlKGluZGV4KSA9PSAnY29tbWFuZCc6CisgICAgICAgICAgICAgICAgICAgIGFjY2VsID0gbWVudS5lbnRyeWNnZXQoaW5kZXgsICdhY2NlbGVyYXRvcicpCisgICAgICAgICAgICAgICAgICAgIGlmIGFjY2VsOgorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbU5hbWUgPSBtZW51LmVudHJ5Y2dldChpbmRleCwgJ2xhYmVsJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gJycKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1lbnViYXJJdGVtIGluIG1lbnVFdmVudERpY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXRlbU5hbWUgaW4gbWVudUV2ZW50RGljdFttZW51YmFySXRlbV06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50ID0gbWVudUV2ZW50RGljdFttZW51YmFySXRlbV1baXRlbU5hbWVdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBldmVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlbCA9IGdldF9hY2NlbGVyYXRvcihrZXlkZWZzLCBldmVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51LmVudHJ5Y29uZmlnKGluZGV4LCBhY2NlbGVyYXRvcj1hY2NlbCkKKworICAgIGRlZiBzZXRfbm90YWJzX2luZGVudHdpZHRoKHNlbGYpOgorICAgICAgICAiVXBkYXRlIHRoZSBpbmRlbnR3aWR0aCBpZiBjaGFuZ2VkIGFuZCBub3QgdXNpbmcgdGFicyBpbiB0aGlzIHdpbmRvdyIKKyAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKKyAgICAgICAgaWYgbm90IHNlbGYudXNldGFiczoKKyAgICAgICAgICAgIHNlbGYuaW5kZW50d2lkdGggPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnSW5kZW50JywnbnVtLXNwYWNlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2ludCcpCisKKyAgICBkZWYgcmVzZXRfaGVscF9tZW51X2VudHJpZXMoc2VsZik6CisgICAgICAgICJVcGRhdGUgdGhlIGFkZGl0aW9uYWwgaGVscCBlbnRyaWVzIG9uIHRoZSBIZWxwIG1lbnUiCisgICAgICAgIGhlbHBfbGlzdCA9IGlkbGVDb25mLkdldEFsbEV4dHJhSGVscFNvdXJjZXNMaXN0KCkKKyAgICAgICAgaGVscG1lbnUgPSBzZWxmLm1lbnVkaWN0WydoZWxwJ10KKyAgICAgICAgIyBmaXJzdCBkZWxldGUgdGhlIGV4dHJhIGhlbHAgZW50cmllcywgaWYgYW55CisgICAgICAgIGhlbHBtZW51X2xlbmd0aCA9IGhlbHBtZW51LmluZGV4KEVORCkKKyAgICAgICAgaWYgaGVscG1lbnVfbGVuZ3RoID4gc2VsZi5iYXNlX2hlbHBtZW51X2xlbmd0aDoKKyAgICAgICAgICAgIGhlbHBtZW51LmRlbGV0ZSgoc2VsZi5iYXNlX2hlbHBtZW51X2xlbmd0aCArIDEpLCBoZWxwbWVudV9sZW5ndGgpCisgICAgICAgICMgdGhlbiByZWJ1aWxkIHRoZW0KKyAgICAgICAgaWYgaGVscF9saXN0OgorICAgICAgICAgICAgaGVscG1lbnUuYWRkX3NlcGFyYXRvcigpCisgICAgICAgICAgICBmb3IgZW50cnkgaW4gaGVscF9saXN0OgorICAgICAgICAgICAgICAgIGNtZCA9IHNlbGYuX19leHRyYV9oZWxwX2NhbGxiYWNrKGVudHJ5WzFdKQorICAgICAgICAgICAgICAgIGhlbHBtZW51LmFkZF9jb21tYW5kKGxhYmVsPWVudHJ5WzBdLCBjb21tYW5kPWNtZCkKKyAgICAgICAgIyBhbmQgdXBkYXRlIHRoZSBtZW51IGRpY3Rpb25hcnkKKyAgICAgICAgc2VsZi5tZW51ZGljdFsnaGVscCddID0gaGVscG1lbnUKKworICAgIGRlZiBfX2V4dHJhX2hlbHBfY2FsbGJhY2soc2VsZiwgaGVscGZpbGUpOgorICAgICAgICAiQ3JlYXRlIGEgY2FsbGJhY2sgd2l0aCB0aGUgaGVscGZpbGUgdmFsdWUgZnJvemVuIGF0IGRlZmluaXRpb24gdGltZSIKKyAgICAgICAgZGVmIGRpc3BsYXlfZXh0cmFfaGVscChoZWxwZmlsZT1oZWxwZmlsZSk6CisgICAgICAgICAgICBpZiBub3QgaGVscGZpbGUuc3RhcnRzd2l0aCgoJ3d3dycsICdodHRwJykpOgorICAgICAgICAgICAgICAgIGhlbHBmaWxlID0gb3MucGF0aC5ub3JtcGF0aChoZWxwZmlsZSkKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy5zdGFydGZpbGUoaGVscGZpbGUpCisgICAgICAgICAgICAgICAgZXhjZXB0IFdpbmRvd3NFcnJvciBhcyB3aHk6CisgICAgICAgICAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J0RvY3VtZW50IFN0YXJ0IEZhaWx1cmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT1zdHIod2h5KSwgcGFyZW50PXNlbGYudGV4dCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd2ViYnJvd3Nlci5vcGVuKGhlbHBmaWxlKQorICAgICAgICByZXR1cm4gZGlzcGxheV9leHRyYV9oZWxwCisKKyAgICBkZWYgdXBkYXRlX3JlY2VudF9maWxlc19saXN0KHNlbGYsIG5ld19maWxlPU5vbmUpOgorICAgICAgICAiTG9hZCBhbmQgdXBkYXRlIHRoZSByZWNlbnQgZmlsZXMgbGlzdCBhbmQgbWVudXMiCisgICAgICAgIHJmX2xpc3QgPSBbXQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnJlY2VudF9maWxlc19wYXRoKToKKyAgICAgICAgICAgIHJmX2xpc3RfZmlsZSA9IG9wZW4oc2VsZi5yZWNlbnRfZmlsZXNfcGF0aCwncicpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmZfbGlzdCA9IHJmX2xpc3RfZmlsZS5yZWFkbGluZXMoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICByZl9saXN0X2ZpbGUuY2xvc2UoKQorICAgICAgICBpZiBuZXdfZmlsZToKKyAgICAgICAgICAgIG5ld19maWxlID0gb3MucGF0aC5hYnNwYXRoKG5ld19maWxlKSArICdcbicKKyAgICAgICAgICAgIGlmIG5ld19maWxlIGluIHJmX2xpc3Q6CisgICAgICAgICAgICAgICAgcmZfbGlzdC5yZW1vdmUobmV3X2ZpbGUpICAjIG1vdmUgdG8gdG9wCisgICAgICAgICAgICByZl9saXN0Lmluc2VydCgwLCBuZXdfZmlsZSkKKyAgICAgICAgIyBjbGVhbiBhbmQgc2F2ZSB0aGUgcmVjZW50IGZpbGVzIGxpc3QKKyAgICAgICAgYmFkX3BhdGhzID0gW10KKyAgICAgICAgZm9yIHBhdGggaW4gcmZfbGlzdDoKKyAgICAgICAgICAgIGlmICdcMCcgaW4gcGF0aCBvciBub3Qgb3MucGF0aC5leGlzdHMocGF0aFswOi0xXSk6CisgICAgICAgICAgICAgICAgYmFkX3BhdGhzLmFwcGVuZChwYXRoKQorICAgICAgICByZl9saXN0ID0gW3BhdGggZm9yIHBhdGggaW4gcmZfbGlzdCBpZiBwYXRoIG5vdCBpbiBiYWRfcGF0aHNdCisgICAgICAgIHVsY2hhcnMgPSAiMTIzNDU2Nzg5MEFCQ0RFRkdISUpLIgorICAgICAgICByZl9saXN0ID0gcmZfbGlzdFswOmxlbih1bGNoYXJzKV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYucmVjZW50X2ZpbGVzX3BhdGgsICd3JykgYXMgcmZfZmlsZToKKyAgICAgICAgICAgICAgICByZl9maWxlLndyaXRlbGluZXMocmZfbGlzdCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgaWYgbm90IGdldGF0dHIoc2VsZi5yb290LCAicmVjZW50ZmlsZWxpc3RfZXJyb3JfZGlzcGxheWVkIiwgRmFsc2UpOgorICAgICAgICAgICAgICAgIHNlbGYucm9vdC5yZWNlbnRmaWxlbGlzdF9lcnJvcl9kaXNwbGF5ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nSURMRSBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1VuYWJsZSB0byB1cGRhdGUgUmVjZW50IEZpbGVzIGxpc3Q6XG4lcycKKyAgICAgICAgICAgICAgICAgICAgICAgICUgc3RyKGVyciksCisgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQpCisgICAgICAgICMgZm9yIGVhY2ggZWRpdCB3aW5kb3cgaW5zdGFuY2UsIGNvbnN0cnVjdCB0aGUgcmVjZW50IGZpbGVzIG1lbnUKKyAgICAgICAgZm9yIGluc3RhbmNlIGluIHNlbGYudG9wLmluc3RhbmNlX2RpY3Qua2V5cygpOgorICAgICAgICAgICAgbWVudSA9IGluc3RhbmNlLnJlY2VudF9maWxlc19tZW51CisgICAgICAgICAgICBtZW51LmRlbGV0ZSgwLCBFTkQpICAjIGNsZWFyLCBhbmQgcmVidWlsZDoKKyAgICAgICAgICAgIGZvciBpLCBmaWxlX25hbWUgaW4gZW51bWVyYXRlKHJmX2xpc3QpOgorICAgICAgICAgICAgICAgIGZpbGVfbmFtZSA9IGZpbGVfbmFtZS5yc3RyaXAoKSAgIyB6YXAgXG4KKyAgICAgICAgICAgICAgICAjIG1ha2UgdW5pY29kZSBzdHJpbmcgdG8gZGlzcGxheSBub24tQVNDSUkgY2hhcnMgY29ycmVjdGx5CisgICAgICAgICAgICAgICAgdWZpbGVfbmFtZSA9IHNlbGYuX2ZpbGVuYW1lX3RvX3VuaWNvZGUoZmlsZV9uYW1lKQorICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gaW5zdGFuY2UuX19yZWNlbnRfZmlsZV9jYWxsYmFjayhmaWxlX25hbWUpCisgICAgICAgICAgICAgICAgbWVudS5hZGRfY29tbWFuZChsYWJlbD11bGNoYXJzW2ldICsgIiAiICsgdWZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9Y2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmU9MCkKKworICAgIGRlZiBfX3JlY2VudF9maWxlX2NhbGxiYWNrKHNlbGYsIGZpbGVfbmFtZSk6CisgICAgICAgIGRlZiBvcGVuX3JlY2VudF9maWxlKGZuX2Nsb3N1cmU9ZmlsZV9uYW1lKToKKyAgICAgICAgICAgIHNlbGYuaW8ub3BlbihlZGl0RmlsZT1mbl9jbG9zdXJlKQorICAgICAgICByZXR1cm4gb3Blbl9yZWNlbnRfZmlsZQorCisgICAgZGVmIHNhdmVkX2NoYW5nZV9ob29rKHNlbGYpOgorICAgICAgICBzaG9ydCA9IHNlbGYuc2hvcnRfdGl0bGUoKQorICAgICAgICBsb25nID0gc2VsZi5sb25nX3RpdGxlKCkKKyAgICAgICAgaWYgc2hvcnQgYW5kIGxvbmc6CisgICAgICAgICAgICB0aXRsZSA9IHNob3J0ICsgIiAtICIgKyBsb25nCisgICAgICAgIGVsaWYgc2hvcnQ6CisgICAgICAgICAgICB0aXRsZSA9IHNob3J0CisgICAgICAgIGVsaWYgbG9uZzoKKyAgICAgICAgICAgIHRpdGxlID0gbG9uZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGl0bGUgPSAiVW50aXRsZWQiCisgICAgICAgIGljb24gPSBzaG9ydCBvciBsb25nIG9yIHRpdGxlCisgICAgICAgIGlmIG5vdCBzZWxmLmdldF9zYXZlZCgpOgorICAgICAgICAgICAgdGl0bGUgPSAiKiVzKiIgJSB0aXRsZQorICAgICAgICAgICAgaWNvbiA9ICIqJXMiICUgaWNvbgorICAgICAgICBzZWxmLnRvcC53bV90aXRsZSh0aXRsZSkKKyAgICAgICAgc2VsZi50b3Aud21faWNvbm5hbWUoaWNvbikKKworICAgIGRlZiBnZXRfc2F2ZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnVuZG8uZ2V0X3NhdmVkKCkKKworICAgIGRlZiBzZXRfc2F2ZWQoc2VsZiwgZmxhZyk6CisgICAgICAgIHNlbGYudW5kby5zZXRfc2F2ZWQoZmxhZykKKworICAgIGRlZiByZXNldF91bmRvKHNlbGYpOgorICAgICAgICBzZWxmLnVuZG8ucmVzZXRfdW5kbygpCisKKyAgICBkZWYgc2hvcnRfdGl0bGUoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5pby5maWxlbmFtZQorICAgICAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKKyAgICAgICAgIyByZXR1cm4gdW5pY29kZSBzdHJpbmcgdG8gZGlzcGxheSBub24tQVNDSUkgY2hhcnMgY29ycmVjdGx5CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlbmFtZV90b191bmljb2RlKGZpbGVuYW1lKQorCisgICAgZGVmIGxvbmdfdGl0bGUoc2VsZik6CisgICAgICAgICMgcmV0dXJuIHVuaWNvZGUgc3RyaW5nIHRvIGRpc3BsYXkgbm9uLUFTQ0lJIGNoYXJzIGNvcnJlY3RseQorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZW5hbWVfdG9fdW5pY29kZShzZWxmLmlvLmZpbGVuYW1lIG9yICIiKQorCisgICAgZGVmIGNlbnRlcl9pbnNlcnRfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLmNlbnRlcigpCisKKyAgICBkZWYgY2VudGVyKHNlbGYsIG1hcms9Imluc2VydCIpOgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHRvcCwgYm90ID0gc2VsZi5nZXR3aW5kb3dsaW5lcygpCisgICAgICAgIGxpbmVubyA9IHNlbGYuZ2V0bGluZW5vKG1hcmspCisgICAgICAgIGhlaWdodCA9IGJvdCAtIHRvcAorICAgICAgICBuZXd0b3AgPSBtYXgoMSwgbGluZW5vIC0gaGVpZ2h0Ly8yKQorICAgICAgICB0ZXh0Lnl2aWV3KGZsb2F0KG5ld3RvcCkpCisKKyAgICBkZWYgZ2V0d2luZG93bGluZXMoc2VsZik6CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgdG9wID0gc2VsZi5nZXRsaW5lbm8oIkAwLDAiKQorICAgICAgICBib3QgPSBzZWxmLmdldGxpbmVubygiQDAsNjU1MzUiKQorICAgICAgICBpZiB0b3AgPT0gYm90IGFuZCB0ZXh0LndpbmZvX2hlaWdodCgpID09IDE6CisgICAgICAgICAgICAjIEdlb21ldHJ5IG1hbmFnZXIgaGFzbid0IHJ1biB5ZXQKKyAgICAgICAgICAgIGhlaWdodCA9IGludCh0ZXh0WydoZWlnaHQnXSkKKyAgICAgICAgICAgIGJvdCA9IHRvcCArIGhlaWdodCAtIDEKKyAgICAgICAgcmV0dXJuIHRvcCwgYm90CisKKyAgICBkZWYgZ2V0bGluZW5vKHNlbGYsIG1hcms9Imluc2VydCIpOgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHJldHVybiBpbnQoZmxvYXQodGV4dC5pbmRleChtYXJrKSkpCisKKyAgICBkZWYgZ2V0X2dlb21ldHJ5KHNlbGYpOgorICAgICAgICAiUmV0dXJuICh3aWR0aCwgaGVpZ2h0LCB4LCB5KSIKKyAgICAgICAgZ2VvbSA9IHNlbGYudG9wLndtX2dlb21ldHJ5KCkKKyAgICAgICAgbSA9IHJlLm1hdGNoKHIiKFxkKyl4KFxkKylcKygtP1xkKylcKygtP1xkKykiLCBnZW9tKQorICAgICAgICB0dXBsZSA9IChtYXAoaW50LCBtLmdyb3VwcygpKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlCisKKyAgICBkZWYgY2xvc2VfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBtYXliZXNhdmUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaW86CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5nZXRfc2F2ZWQoKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnRvcC5zdGF0ZSgpIT0nbm9ybWFsJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b3AuZGVpY29uaWZ5KCkKKyAgICAgICAgICAgICAgICBzZWxmLnRvcC5sb3dlcigpCisgICAgICAgICAgICAgICAgc2VsZi50b3AubGlmdCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5pby5tYXliZXNhdmUoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICByZXBseSA9IHNlbGYubWF5YmVzYXZlKCkKKyAgICAgICAgaWYgc3RyKHJlcGx5KSAhPSAiY2FuY2VsIjoKKyAgICAgICAgICAgIHNlbGYuX2Nsb3NlKCkKKyAgICAgICAgcmV0dXJuIHJlcGx5CisKKyAgICBkZWYgX2Nsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmlvLmZpbGVuYW1lOgorICAgICAgICAgICAgc2VsZi51cGRhdGVfcmVjZW50X2ZpbGVzX2xpc3QobmV3X2ZpbGU9c2VsZi5pby5maWxlbmFtZSkKKyAgICAgICAgV2luZG93TGlzdC51bnJlZ2lzdGVyX2NhbGxiYWNrKHNlbGYucG9zdHdpbmRvd3NtZW51KQorICAgICAgICBzZWxmLnVubG9hZF9leHRlbnNpb25zKCkKKyAgICAgICAgc2VsZi5pby5jbG9zZSgpCisgICAgICAgIHNlbGYuaW8gPSBOb25lCisgICAgICAgIHNlbGYudW5kbyA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5jb2xvcjoKKyAgICAgICAgICAgIHNlbGYuY29sb3IuY2xvc2UoRmFsc2UpCisgICAgICAgICAgICBzZWxmLmNvbG9yID0gTm9uZQorICAgICAgICBzZWxmLnRleHQgPSBOb25lCisgICAgICAgIHNlbGYudGtpbnRlcl92YXJzID0gTm9uZQorICAgICAgICBzZWxmLnBlci5jbG9zZSgpCisgICAgICAgIHNlbGYucGVyID0gTm9uZQorICAgICAgICBzZWxmLnRvcC5kZXN0cm95KCkKKyAgICAgICAgaWYgc2VsZi5jbG9zZV9ob29rOgorICAgICAgICAgICAgIyB1bmxlc3Mgb3ZlcnJpZGU6IHVucmVnaXN0ZXIgZnJvbSBmbGlzdCwgdGVybWluYXRlIGlmIGxhc3Qgd2luZG93CisgICAgICAgICAgICBzZWxmLmNsb3NlX2hvb2soKQorCisgICAgZGVmIGxvYWRfZXh0ZW5zaW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5leHRlbnNpb25zID0ge30KKyAgICAgICAgc2VsZi5sb2FkX3N0YW5kYXJkX2V4dGVuc2lvbnMoKQorCisgICAgZGVmIHVubG9hZF9leHRlbnNpb25zKHNlbGYpOgorICAgICAgICBmb3IgaW5zIGluIHNlbGYuZXh0ZW5zaW9ucy52YWx1ZXMoKToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoaW5zLCAiY2xvc2UiKToKKyAgICAgICAgICAgICAgICBpbnMuY2xvc2UoKQorICAgICAgICBzZWxmLmV4dGVuc2lvbnMgPSB7fQorCisgICAgZGVmIGxvYWRfc3RhbmRhcmRfZXh0ZW5zaW9ucyhzZWxmKToKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5nZXRfc3RhbmRhcmRfZXh0ZW5zaW9uX25hbWVzKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5sb2FkX2V4dGVuc2lvbihuYW1lKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHByaW50ICJGYWlsZWQgdG8gbG9hZCBleHRlbnNpb24iLCByZXByKG5hbWUpCisgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorCisgICAgZGVmIGdldF9zdGFuZGFyZF9leHRlbnNpb25fbmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBpZGxlQ29uZi5HZXRFeHRlbnNpb25zKGVkaXRvcl9vbmx5PVRydWUpCisKKyAgICBkZWYgbG9hZF9leHRlbnNpb24oc2VsZiwgbmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18obmFtZSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgW10pCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHByaW50ICJcbkZhaWxlZCB0byBpbXBvcnQgZXh0ZW5zaW9uOiAiLCBuYW1lCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgY2xzID0gZ2V0YXR0cihtb2QsIG5hbWUpCisgICAgICAgIGtleWRlZnMgPSBpZGxlQ29uZi5HZXRFeHRlbnNpb25CaW5kaW5ncyhuYW1lKQorICAgICAgICBpZiBoYXNhdHRyKGNscywgIm1lbnVkZWZzIik6CisgICAgICAgICAgICBzZWxmLmZpbGxfbWVudXMoY2xzLm1lbnVkZWZzLCBrZXlkZWZzKQorICAgICAgICBpbnMgPSBjbHMoc2VsZikKKyAgICAgICAgc2VsZi5leHRlbnNpb25zW25hbWVdID0gaW5zCisgICAgICAgIGlmIGtleWRlZnM6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2JpbmRpbmdzKGtleWRlZnMpCisgICAgICAgICAgICBmb3IgdmV2ZW50IGluIGtleWRlZnMua2V5cygpOgorICAgICAgICAgICAgICAgIG1ldGhvZG5hbWUgPSB2ZXZlbnQucmVwbGFjZSgiLSIsICJfIikKKyAgICAgICAgICAgICAgICB3aGlsZSBtZXRob2RuYW1lWzoxXSA9PSAnPCc6CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZG5hbWUgPSBtZXRob2RuYW1lWzE6XQorICAgICAgICAgICAgICAgIHdoaWxlIG1ldGhvZG5hbWVbLTE6XSA9PSAnPic6CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZG5hbWUgPSBtZXRob2RuYW1lWzotMV0KKyAgICAgICAgICAgICAgICBtZXRob2RuYW1lID0gbWV0aG9kbmFtZSArICJfZXZlbnQiCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihpbnMsIG1ldGhvZG5hbWUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRleHQuYmluZCh2ZXZlbnQsIGdldGF0dHIoaW5zLCBtZXRob2RuYW1lKSkKKworICAgIGRlZiBhcHBseV9iaW5kaW5ncyhzZWxmLCBrZXlkZWZzPU5vbmUpOgorICAgICAgICBpZiBrZXlkZWZzIGlzIE5vbmU6CisgICAgICAgICAgICBrZXlkZWZzID0gc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICB0ZXh0LmtleWRlZnMgPSBrZXlkZWZzCisgICAgICAgIGZvciBldmVudCwga2V5bGlzdCBpbiBrZXlkZWZzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBrZXlsaXN0OgorICAgICAgICAgICAgICAgIHRleHQuZXZlbnRfYWRkKGV2ZW50LCAqa2V5bGlzdCkKKworICAgIGRlZiBmaWxsX21lbnVzKHNlbGYsIG1lbnVkZWZzPU5vbmUsIGtleWRlZnM9Tm9uZSk6CisgICAgICAgICIiIkFkZCBhcHByb3ByaWF0ZSBlbnRyaWVzIHRvIHRoZSBtZW51cyBhbmQgc3VibWVudXMKKworICAgICAgICBNZW51cyB0aGF0IGFyZSBhYnNlbnQgb3IgTm9uZSBpbiBzZWxmLm1lbnVkaWN0IGFyZSBpZ25vcmVkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbWVudWRlZnMgaXMgTm9uZToKKyAgICAgICAgICAgIG1lbnVkZWZzID0gc2VsZi5CaW5kaW5ncy5tZW51ZGVmcworICAgICAgICBpZiBrZXlkZWZzIGlzIE5vbmU6CisgICAgICAgICAgICBrZXlkZWZzID0gc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMKKyAgICAgICAgbWVudWRpY3QgPSBzZWxmLm1lbnVkaWN0CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgZm9yIG1uYW1lLCBlbnRyeWxpc3QgaW4gbWVudWRlZnM6CisgICAgICAgICAgICBtZW51ID0gbWVudWRpY3QuZ2V0KG1uYW1lKQorICAgICAgICAgICAgaWYgbm90IG1lbnU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZvciBlbnRyeSBpbiBlbnRyeWxpc3Q6CisgICAgICAgICAgICAgICAgaWYgbm90IGVudHJ5OgorICAgICAgICAgICAgICAgICAgICBtZW51LmFkZF9zZXBhcmF0b3IoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxhYmVsLCBldmVudG5hbWUgPSBlbnRyeQorICAgICAgICAgICAgICAgICAgICBjaGVja2J1dHRvbiA9IChsYWJlbFs6MV0gPT0gJyEnKQorICAgICAgICAgICAgICAgICAgICBpZiBjaGVja2J1dHRvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWxbMTpdCisgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZSwgbGFiZWwgPSBwcmVwc3RyKGxhYmVsKQorICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRvciA9IGdldF9hY2NlbGVyYXRvcihrZXlkZWZzLCBldmVudG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGRlZiBjb21tYW5kKHRleHQ9dGV4dCwgZXZlbnRuYW1lPWV2ZW50bmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmV2ZW50X2dlbmVyYXRlKGV2ZW50bmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgY2hlY2tidXR0b246CisgICAgICAgICAgICAgICAgICAgICAgICB2YXIgPSBzZWxmLmdldF92YXJfb2JqKGV2ZW50bmFtZSwgQm9vbGVhblZhcikKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUuYWRkX2NoZWNrYnV0dG9uKGxhYmVsPWxhYmVsLCB1bmRlcmxpbmU9dW5kZXJsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9Y29tbWFuZCwgYWNjZWxlcmF0b3I9YWNjZWxlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU9dmFyKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5hZGRfY29tbWFuZChsYWJlbD1sYWJlbCwgdW5kZXJsaW5lPXVuZGVybGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1jb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRvcj1hY2NlbGVyYXRvcikKKworICAgIGRlZiBnZXR2YXIoc2VsZiwgbmFtZSk6CisgICAgICAgIHZhciA9IHNlbGYuZ2V0X3Zhcl9vYmoobmFtZSkKKyAgICAgICAgaWYgdmFyOgorICAgICAgICAgICAgdmFsdWUgPSB2YXIuZ2V0KCkKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgTmFtZUVycm9yLCBuYW1lCisKKyAgICBkZWYgc2V0dmFyKHNlbGYsIG5hbWUsIHZhbHVlLCB2YXJ0eXBlPU5vbmUpOgorICAgICAgICB2YXIgPSBzZWxmLmdldF92YXJfb2JqKG5hbWUsIHZhcnR5cGUpCisgICAgICAgIGlmIHZhcjoKKyAgICAgICAgICAgIHZhci5zZXQodmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBOYW1lRXJyb3IsIG5hbWUKKworICAgIGRlZiBnZXRfdmFyX29iaihzZWxmLCBuYW1lLCB2YXJ0eXBlPU5vbmUpOgorICAgICAgICB2YXIgPSBzZWxmLnRraW50ZXJfdmFycy5nZXQobmFtZSkKKyAgICAgICAgaWYgbm90IHZhciBhbmQgdmFydHlwZToKKyAgICAgICAgICAgICMgY3JlYXRlIGEgVGtpbnRlciB2YXJpYWJsZSBvYmplY3Qgd2l0aCBzZWxmLnRleHQgYXMgbWFzdGVyOgorICAgICAgICAgICAgc2VsZi50a2ludGVyX3ZhcnNbbmFtZV0gPSB2YXIgPSB2YXJ0eXBlKHNlbGYudGV4dCkKKyAgICAgICAgcmV0dXJuIHZhcgorCisgICAgIyBUayBpbXBsZW1lbnRhdGlvbnMgb2YgInZpcnR1YWwgdGV4dCBtZXRob2RzIiAtLSBlYWNoIHBsYXRmb3JtCisgICAgIyByZXVzaW5nIElETEUncyBzdXBwb3J0IGNvZGUgbmVlZHMgdG8gZGVmaW5lIHRoZXNlIGZvciBpdHMgR1VJJ3MKKyAgICAjIGZsYXZvciBvZiB3aWRnZXQuCisKKyAgICAjIElzIGNoYXJhY3RlciBhdCB0ZXh0X2luZGV4IGluIGEgUHl0aG9uIHN0cmluZz8gIFJldHVybiAwIGZvcgorICAgICMgImd1YXJhbnRlZWQgbm8iLCB0cnVlIGZvciBhbnl0aGluZyBlbHNlLiAgVGhpcyBpbmZvIGlzIGV4cGVuc2l2ZQorICAgICMgdG8gY29tcHV0ZSBhYiBpbml0aW8sIGJ1dCBpcyBwcm9iYWJseSBhbHJlYWR5IGtub3duIGJ5IHRoZQorICAgICMgcGxhdGZvcm0ncyBjb2xvcml6ZXIuCisKKyAgICBkZWYgaXNfY2hhcl9pbl9zdHJpbmcoc2VsZiwgdGV4dF9pbmRleCk6CisgICAgICAgIGlmIHNlbGYuY29sb3I6CisgICAgICAgICAgICAjIFJldHVybiB0cnVlIGlmZiBjb2xvcml6ZXIgaGFzbid0IChyZSlnb3R0ZW4gdGhpcyBmYXIKKyAgICAgICAgICAgICMgeWV0LCBvciB0aGUgY2hhcmFjdGVyIGlzIHRhZ2dlZCBhcyBiZWluZyBpbiBhIHN0cmluZworICAgICAgICAgICAgcmV0dXJuIHNlbGYudGV4dC50YWdfcHJldnJhbmdlKCJUT0RPIiwgdGV4dF9pbmRleCkgb3IgXAorICAgICAgICAgICAgICAgICAgICJTVFJJTkciIGluIHNlbGYudGV4dC50YWdfbmFtZXModGV4dF9pbmRleCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVGhlIGNvbG9yaXplciBpcyBtaXNzaW5nOiBhc3N1bWUgdGhlIHdvcnN0CisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgIyBJZiBhIHNlbGVjdGlvbiBpcyBkZWZpbmVkIGluIHRoZSB0ZXh0IHdpZGdldCwgcmV0dXJuIChzdGFydCwKKyAgICAjIGVuZCkgYXMgVGtpbnRlciB0ZXh0IGluZGljZXMsIG90aGVyd2lzZSByZXR1cm4gKE5vbmUsIE5vbmUpCisgICAgZGVmIGdldF9zZWxlY3Rpb25faW5kaWNlcyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlyc3QgPSBzZWxmLnRleHQuaW5kZXgoInNlbC5maXJzdCIpCisgICAgICAgICAgICBsYXN0ID0gc2VsZi50ZXh0LmluZGV4KCJzZWwubGFzdCIpCisgICAgICAgICAgICByZXR1cm4gZmlyc3QsIGxhc3QKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKworICAgICMgUmV0dXJuIHRoZSB0ZXh0IHdpZGdldCdzIGN1cnJlbnQgdmlldyBvZiB3aGF0IGEgdGFiIHN0b3AgbWVhbnMKKyAgICAjIChlcXVpdmFsZW50IHdpZHRoIGluIHNwYWNlcykuCisKKyAgICBkZWYgZ2V0X3RhYndpZHRoKHNlbGYpOgorICAgICAgICBjdXJyZW50ID0gc2VsZi50ZXh0Wyd0YWJzJ10gb3IgVEtfVEFCV0lEVEhfREVGQVVMVAorICAgICAgICByZXR1cm4gaW50KGN1cnJlbnQpCisKKyAgICAjIFNldCB0aGUgdGV4dCB3aWRnZXQncyBjdXJyZW50IHZpZXcgb2Ygd2hhdCBhIHRhYiBzdG9wIG1lYW5zLgorCisgICAgZGVmIHNldF90YWJ3aWR0aChzZWxmLCBuZXd0YWJ3aWR0aCk6CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgaWYgc2VsZi5nZXRfdGFid2lkdGgoKSAhPSBuZXd0YWJ3aWR0aDoKKyAgICAgICAgICAgIHBpeGVscyA9IHRleHQudGsuY2FsbCgiZm9udCIsICJtZWFzdXJlIiwgdGV4dFsiZm9udCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItZGlzcGxheW9mIiwgdGV4dC5tYXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm4iICogbmV3dGFid2lkdGgpCisgICAgICAgICAgICB0ZXh0LmNvbmZpZ3VyZSh0YWJzPXBpeGVscykKKworICAgICMgSWYgaXNweXRob25zb3VyY2UgYW5kIGd1ZXNzIGFyZSB0cnVlLCBndWVzcyBhIGdvb2QgdmFsdWUgZm9yCisgICAgIyBpbmRlbnR3aWR0aCBiYXNlZCBvbiBmaWxlIGNvbnRlbnQgKGlmIHBvc3NpYmxlKSwgYW5kIGlmCisgICAgIyBpbmRlbnR3aWR0aCAhPSB0YWJ3aWR0aCBzZXQgdXNldGFicyBmYWxzZS4KKyAgICAjIEluIGFueSBjYXNlLCBhZGp1c3QgdGhlIFRleHQgd2lkZ2V0J3MgdmlldyBvZiB3aGF0IGEgdGFiCisgICAgIyBjaGFyYWN0ZXIgbWVhbnMuCisKKyAgICBkZWYgc2V0X2luZGVudGF0aW9uX3BhcmFtcyhzZWxmLCBpc3B5dGhvbnNvdXJjZSwgZ3Vlc3M9VHJ1ZSk6CisgICAgICAgIGlmIGd1ZXNzIGFuZCBpc3B5dGhvbnNvdXJjZToKKyAgICAgICAgICAgIGkgPSBzZWxmLmd1ZXNzX2luZGVudCgpCisgICAgICAgICAgICBpZiAyIDw9IGkgPD0gODoKKyAgICAgICAgICAgICAgICBzZWxmLmluZGVudHdpZHRoID0gaQorICAgICAgICAgICAgaWYgc2VsZi5pbmRlbnR3aWR0aCAhPSBzZWxmLnRhYndpZHRoOgorICAgICAgICAgICAgICAgIHNlbGYudXNldGFicyA9IEZhbHNlCisgICAgICAgIHNlbGYuc2V0X3RhYndpZHRoKHNlbGYudGFid2lkdGgpCisKKyAgICBkZWYgc21hcnRfYmFja3NwYWNlX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICBmaXJzdCwgbGFzdCA9IHNlbGYuZ2V0X3NlbGVjdGlvbl9pbmRpY2VzKCkKKyAgICAgICAgaWYgZmlyc3QgYW5kIGxhc3Q6CisgICAgICAgICAgICB0ZXh0LmRlbGV0ZShmaXJzdCwgbGFzdCkKKyAgICAgICAgICAgIHRleHQubWFya19zZXQoImluc2VydCIsIGZpcnN0KQorICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgIyBEZWxldGUgd2hpdGVzcGFjZSBsZWZ0LCB1bnRpbCBoaXR0aW5nIGEgcmVhbCBjaGFyIG9yIGNsb3Nlc3QKKyAgICAgICAgIyBwcmVjZWRpbmcgdmlydHVhbCB0YWIgc3RvcC4KKyAgICAgICAgY2hhcnMgPSB0ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQiKQorICAgICAgICBpZiBjaGFycyA9PSAnJzoKKyAgICAgICAgICAgIGlmIHRleHQuY29tcGFyZSgiaW5zZXJ0IiwgIj4iLCAiMS4wIik6CisgICAgICAgICAgICAgICAgIyBlYXN5OiBkZWxldGUgcHJlY2VkaW5nIG5ld2xpbmUKKyAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZSgiaW5zZXJ0LTFjIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGV4dC5iZWxsKCkgICAgICMgYXQgc3RhcnQgb2YgYnVmZmVyCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICBpZiAgY2hhcnNbLTFdIG5vdCBpbiAiIFx0IjoKKyAgICAgICAgICAgICMgZWFzeTogZGVsZXRlIHByZWNlZGluZyByZWFsIGNoYXIKKyAgICAgICAgICAgIHRleHQuZGVsZXRlKCJpbnNlcnQtMWMiKQorICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgIyBJY2suICBJdCBtYXkgcmVxdWlyZSAqaW5zZXJ0aW5nKiBzcGFjZXMgaWYgd2UgYmFjayB1cCBvdmVyIGEKKyAgICAgICAgIyB0YWIgY2hhcmFjdGVyISAgVGhpcyBpcyB3cml0dGVuIHRvIGJlIGNsZWFyLCBub3QgZmFzdC4KKyAgICAgICAgdGFid2lkdGggPSBzZWxmLnRhYndpZHRoCisgICAgICAgIGhhdmUgPSBsZW4oY2hhcnMuZXhwYW5kdGFicyh0YWJ3aWR0aCkpCisgICAgICAgIGFzc2VydCBoYXZlID4gMAorICAgICAgICB3YW50ID0gKChoYXZlIC0gMSkgLy8gc2VsZi5pbmRlbnR3aWR0aCkgKiBzZWxmLmluZGVudHdpZHRoCisgICAgICAgICMgRGVidWcgcHJvbXB0IGlzIG11bHRpbGluZWQuLi4uCisgICAgICAgIGlmIHNlbGYuY29udGV4dF91c2VfcHMxOgorICAgICAgICAgICAgbGFzdF9saW5lX29mX3Byb21wdCA9IHN5cy5wczEuc3BsaXQoJ1xuJylbLTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYXN0X2xpbmVfb2ZfcHJvbXB0ID0gJycKKyAgICAgICAgbmNoYXJzZGVsZXRlZCA9IDAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGlmIGNoYXJzID09IGxhc3RfbGluZV9vZl9wcm9tcHQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNoYXJzID0gY2hhcnNbOi0xXQorICAgICAgICAgICAgbmNoYXJzZGVsZXRlZCA9IG5jaGFyc2RlbGV0ZWQgKyAxCisgICAgICAgICAgICBoYXZlID0gbGVuKGNoYXJzLmV4cGFuZHRhYnModGFid2lkdGgpKQorICAgICAgICAgICAgaWYgaGF2ZSA8PSB3YW50IG9yIGNoYXJzWy0xXSBub3QgaW4gIiBcdCI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0YXJ0KCkKKyAgICAgICAgdGV4dC5kZWxldGUoImluc2VydC0lZGMiICUgbmNoYXJzZGVsZXRlZCwgImluc2VydCIpCisgICAgICAgIGlmIGhhdmUgPCB3YW50OgorICAgICAgICAgICAgdGV4dC5pbnNlcnQoImluc2VydCIsICcgJyAqICh3YW50IC0gaGF2ZSkpCisgICAgICAgIHRleHQudW5kb19ibG9ja19zdG9wKCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBzbWFydF9pbmRlbnRfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAjIGlmIGludHJhbGluZSBzZWxlY3Rpb246CisgICAgICAgICMgICAgIGRlbGV0ZSBpdAorICAgICAgICAjIGVsaWYgbXVsdGlsaW5lIHNlbGVjdGlvbjoKKyAgICAgICAgIyAgICAgZG8gaW5kZW50LXJlZ2lvbgorICAgICAgICAjIGVsc2U6CisgICAgICAgICMgICAgIGluZGVudCBvbmUgbGV2ZWwKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICBmaXJzdCwgbGFzdCA9IHNlbGYuZ2V0X3NlbGVjdGlvbl9pbmRpY2VzKCkKKyAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0YXJ0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgZmlyc3QgYW5kIGxhc3Q6CisgICAgICAgICAgICAgICAgaWYgaW5kZXgybGluZShmaXJzdCkgIT0gaW5kZXgybGluZShsYXN0KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZW50X3JlZ2lvbl9ldmVudChldmVudCkKKyAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZShmaXJzdCwgbGFzdCkKKyAgICAgICAgICAgICAgICB0ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBmaXJzdCkKKyAgICAgICAgICAgIHByZWZpeCA9IHRleHQuZ2V0KCJpbnNlcnQgbGluZXN0YXJ0IiwgImluc2VydCIpCisgICAgICAgICAgICByYXcsIGVmZmVjdGl2ZSA9IGNsYXNzaWZ5d3MocHJlZml4LCBzZWxmLnRhYndpZHRoKQorICAgICAgICAgICAgaWYgcmF3ID09IGxlbihwcmVmaXgpOgorICAgICAgICAgICAgICAgICMgb25seSB3aGl0ZXNwYWNlIHRvIHRoZSBsZWZ0CisgICAgICAgICAgICAgICAgc2VsZi5yZWluZGVudF90byhlZmZlY3RpdmUgKyBzZWxmLmluZGVudHdpZHRoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHRhYiB0byB0aGUgbmV4dCAnc3RvcCcgd2l0aGluIG9yIHRvIHJpZ2h0IG9mIGxpbmUncyB0ZXh0OgorICAgICAgICAgICAgICAgIGlmIHNlbGYudXNldGFiczoKKyAgICAgICAgICAgICAgICAgICAgcGFkID0gJ1x0JworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZSA9IGxlbihwcmVmaXguZXhwYW5kdGFicyhzZWxmLnRhYndpZHRoKSkKKyAgICAgICAgICAgICAgICAgICAgbiA9IHNlbGYuaW5kZW50d2lkdGgKKyAgICAgICAgICAgICAgICAgICAgcGFkID0gJyAnICogKG4gLSBlZmZlY3RpdmUgJSBuKQorICAgICAgICAgICAgICAgIHRleHQuaW5zZXJ0KCJpbnNlcnQiLCBwYWQpCisgICAgICAgICAgICB0ZXh0LnNlZSgiaW5zZXJ0IikKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RvcCgpCisKKyAgICBkZWYgbmV3bGluZV9hbmRfaW5kZW50X2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICBmaXJzdCwgbGFzdCA9IHNlbGYuZ2V0X3NlbGVjdGlvbl9pbmRpY2VzKCkKKyAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0YXJ0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgZmlyc3QgYW5kIGxhc3Q6CisgICAgICAgICAgICAgICAgdGV4dC5kZWxldGUoZmlyc3QsIGxhc3QpCisgICAgICAgICAgICAgICAgdGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgZmlyc3QpCisgICAgICAgICAgICBsaW5lID0gdGV4dC5nZXQoImluc2VydCBsaW5lc3RhcnQiLCAiaW5zZXJ0IikKKyAgICAgICAgICAgIGksIG4gPSAwLCBsZW4obGluZSkKKyAgICAgICAgICAgIHdoaWxlIGkgPCBuIGFuZCBsaW5lW2ldIGluICIgXHQiOgorICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgIGlmIGkgPT0gbjoKKyAgICAgICAgICAgICAgICAjIHRoZSBjdXJzb3IgaXMgaW4gb3IgYXQgbGVhZGluZyBpbmRlbnRhdGlvbiBpbiBhIGNvbnRpbnVhdGlvbgorICAgICAgICAgICAgICAgICMgbGluZTsganVzdCBpbmplY3QgYW4gZW1wdHkgbGluZSBhdCB0aGUgc3RhcnQKKyAgICAgICAgICAgICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IGxpbmVzdGFydCIsICdcbicpCisgICAgICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgICAgIGluZGVudCA9IGxpbmVbOmldCisgICAgICAgICAgICAjIHN0cmlwIHdoaXRlc3BhY2UgYmVmb3JlIGluc2VydCBwb2ludCB1bmxlc3MgaXQncyBpbiB0aGUgcHJvbXB0CisgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgbGFzdF9saW5lX29mX3Byb21wdCA9IHN5cy5wczEuc3BsaXQoJ1xuJylbLTFdCisgICAgICAgICAgICB3aGlsZSBsaW5lIGFuZCBsaW5lWy0xXSBpbiAiIFx0IiBhbmQgbGluZSAhPSBsYXN0X2xpbmVfb2ZfcHJvbXB0OgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICBpZiBpOgorICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKCJpbnNlcnQgLSAlZCBjaGFycyIgJSBpLCAiaW5zZXJ0IikKKyAgICAgICAgICAgICMgc3RyaXAgd2hpdGVzcGFjZSBhZnRlciBpbnNlcnQgcG9pbnQKKyAgICAgICAgICAgIHdoaWxlIHRleHQuZ2V0KCJpbnNlcnQiKSBpbiAiIFx0IjoKKyAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZSgiaW5zZXJ0IikKKyAgICAgICAgICAgICMgc3RhcnQgbmV3IGxpbmUKKyAgICAgICAgICAgIHRleHQuaW5zZXJ0KCJpbnNlcnQiLCAnXG4nKQorCisgICAgICAgICAgICAjIGFkanVzdCBpbmRlbnRhdGlvbiBmb3IgY29udGludWF0aW9ucyBhbmQgYmxvY2sKKyAgICAgICAgICAgICMgb3Blbi9jbG9zZSBmaXJzdCBuZWVkIHRvIGZpbmQgdGhlIGxhc3Qgc3RtdAorICAgICAgICAgICAgbG5vID0gaW5kZXgybGluZSh0ZXh0LmluZGV4KCdpbnNlcnQnKSkKKyAgICAgICAgICAgIHkgPSBQeVBhcnNlLlBhcnNlcihzZWxmLmluZGVudHdpZHRoLCBzZWxmLnRhYndpZHRoKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuY29udGV4dF91c2VfcHMxOgorICAgICAgICAgICAgICAgIGZvciBjb250ZXh0IGluIHNlbGYubnVtX2NvbnRleHRfbGluZXM6CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0YXQgPSBtYXgobG5vIC0gY29udGV4dCwgMSkKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRhdGluZGV4ID0gcmVwcihzdGFydGF0KSArICIuMCIKKyAgICAgICAgICAgICAgICAgICAgcmF3dGV4dCA9IHRleHQuZ2V0KHN0YXJ0YXRpbmRleCwgImluc2VydCIpCisgICAgICAgICAgICAgICAgICAgIHkuc2V0X3N0cihyYXd0ZXh0KQorICAgICAgICAgICAgICAgICAgICBib2QgPSB5LmZpbmRfZ29vZF9wYXJzZV9zdGFydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dF91c2VfcHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYnVpbGRfY2hhcl9pbl9zdHJpbmdfZnVuYyhzdGFydGF0aW5kZXgpKQorICAgICAgICAgICAgICAgICAgICBpZiBib2QgaXMgbm90IE5vbmUgb3Igc3RhcnRhdCA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB5LnNldF9sbyhib2Qgb3IgMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgciA9IHRleHQudGFnX3ByZXZyYW5nZSgiY29uc29sZSIsICJpbnNlcnQiKQorICAgICAgICAgICAgICAgIGlmIHI6CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0YXRpbmRleCA9IHJbMV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzdGFydGF0aW5kZXggPSAiMS4wIgorICAgICAgICAgICAgICAgIHJhd3RleHQgPSB0ZXh0LmdldChzdGFydGF0aW5kZXgsICJpbnNlcnQiKQorICAgICAgICAgICAgICAgIHkuc2V0X3N0cihyYXd0ZXh0KQorICAgICAgICAgICAgICAgIHkuc2V0X2xvKDApCisKKyAgICAgICAgICAgIGMgPSB5LmdldF9jb250aW51YXRpb25fdHlwZSgpCisgICAgICAgICAgICBpZiBjICE9IFB5UGFyc2UuQ19OT05FOgorICAgICAgICAgICAgICAgICMgVGhlIGN1cnJlbnQgc3RtdCBoYXNuJ3QgZW5kZWQgeWV0LgorICAgICAgICAgICAgICAgIGlmIGMgPT0gUHlQYXJzZS5DX1NUUklOR19GSVJTVF9MSU5FOgorICAgICAgICAgICAgICAgICAgICAjIGFmdGVyIHRoZSBmaXJzdCBsaW5lIG9mIGEgc3RyaW5nOyBkbyBub3QgaW5kZW50IGF0IGFsbAorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxpZiBjID09IFB5UGFyc2UuQ19TVFJJTkdfTkVYVF9MSU5FUzoKKyAgICAgICAgICAgICAgICAgICAgIyBpbnNpZGUgYSBzdHJpbmcgd2hpY2ggc3RhcnRlZCBiZWZvcmUgdGhpcyBsaW5lOworICAgICAgICAgICAgICAgICAgICAjIGp1c3QgbWltaWMgdGhlIGN1cnJlbnQgaW5kZW50CisgICAgICAgICAgICAgICAgICAgIHRleHQuaW5zZXJ0KCJpbnNlcnQiLCBpbmRlbnQpCisgICAgICAgICAgICAgICAgZWxpZiBjID09IFB5UGFyc2UuQ19CUkFDS0VUOgorICAgICAgICAgICAgICAgICAgICAjIGxpbmUgdXAgd2l0aCB0aGUgZmlyc3QgKGlmIGFueSkgZWxlbWVudCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBsYXN0IG9wZW4gYnJhY2tldCBzdHJ1Y3R1cmU7IGVsc2UgaW5kZW50IG9uZQorICAgICAgICAgICAgICAgICAgICAjIGxldmVsIGJleW9uZCB0aGUgaW5kZW50IG9mIHRoZSBsaW5lIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICMgbGFzdCBvcGVuIGJyYWNrZXQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWluZGVudF90byh5LmNvbXB1dGVfYnJhY2tldF9pbmRlbnQoKSkKKyAgICAgICAgICAgICAgICBlbGlmIGMgPT0gUHlQYXJzZS5DX0JBQ0tTTEFTSDoKKyAgICAgICAgICAgICAgICAgICAgIyBpZiBtb3JlIHRoYW4gb25lIGxpbmUgaW4gdGhpcyBzdG10IGFscmVhZHksIGp1c3QKKyAgICAgICAgICAgICAgICAgICAgIyBtaW1pYyB0aGUgY3VycmVudCBpbmRlbnQ7IGVsc2UgaWYgaW5pdGlhbCBsaW5lCisgICAgICAgICAgICAgICAgICAgICMgaGFzIGEgc3RhcnQgb24gYW4gYXNzaWdubWVudCBzdG10LCBpbmRlbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgIyBiZXlvbmQgbGVmdG1vc3QgPTsgZWxzZSB0byBiZXlvbmQgZmlyc3QgY2h1bmsgb2YKKyAgICAgICAgICAgICAgICAgICAgIyBub24td2hpdGVzcGFjZSBvbiBpbml0aWFsIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgeS5nZXRfbnVtX2xpbmVzX2luX3N0bXQoKSA+IDE6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwgaW5kZW50KQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWluZGVudF90byh5LmNvbXB1dGVfYmFja3NsYXNoX2luZGVudCgpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCAwLCAiYm9ndXMgY29udGludWF0aW9uIHR5cGUgJXIiICUgKGMsKQorICAgICAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICAgICAgICAgICMgVGhpcyBsaW5lIHN0YXJ0cyBhIGJyYW5kIG5ldyBzdG10OyBpbmRlbnQgcmVsYXRpdmUgdG8KKyAgICAgICAgICAgICMgaW5kZW50YXRpb24gb2YgaW5pdGlhbCBsaW5lIG9mIGNsb3Nlc3QgcHJlY2VkaW5nCisgICAgICAgICAgICAjIGludGVyZXN0aW5nIHN0bXQuCisgICAgICAgICAgICBpbmRlbnQgPSB5LmdldF9iYXNlX2luZGVudF9zdHJpbmcoKQorICAgICAgICAgICAgdGV4dC5pbnNlcnQoImluc2VydCIsIGluZGVudCkKKyAgICAgICAgICAgIGlmIHkuaXNfYmxvY2tfb3BlbmVyKCk6CisgICAgICAgICAgICAgICAgc2VsZi5zbWFydF9pbmRlbnRfZXZlbnQoZXZlbnQpCisgICAgICAgICAgICBlbGlmIGluZGVudCBhbmQgeS5pc19ibG9ja19jbG9zZXIoKToKKyAgICAgICAgICAgICAgICBzZWxmLnNtYXJ0X2JhY2tzcGFjZV9ldmVudChldmVudCkKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0ZXh0LnNlZSgiaW5zZXJ0IikKKyAgICAgICAgICAgIHRleHQudW5kb19ibG9ja19zdG9wKCkKKworICAgICMgT3VyIGVkaXR3aW4gcHJvdmlkZXMgYSBpc19jaGFyX2luX3N0cmluZyBmdW5jdGlvbiB0aGF0IHdvcmtzCisgICAgIyB3aXRoIGEgVGsgdGV4dCBpbmRleCwgYnV0IFB5UGFyc2Ugb25seSBrbm93cyBhYm91dCBvZmZzZXRzIGludG8KKyAgICAjIGEgc3RyaW5nLiBUaGlzIGJ1aWxkcyBhIGZ1bmN0aW9uIGZvciBQeVBhcnNlIHRoYXQgYWNjZXB0cyBhbgorICAgICMgb2Zmc2V0LgorCisgICAgZGVmIF9idWlsZF9jaGFyX2luX3N0cmluZ19mdW5jKHNlbGYsIHN0YXJ0aW5kZXgpOgorICAgICAgICBkZWYgaW5uZXIob2Zmc2V0LCBfc3RhcnRpbmRleD1zdGFydGluZGV4LAorICAgICAgICAgICAgICAgICAgX2ljaXM9c2VsZi5pc19jaGFyX2luX3N0cmluZyk6CisgICAgICAgICAgICByZXR1cm4gX2ljaXMoX3N0YXJ0aW5kZXggKyAiKyVkYyIgJSBvZmZzZXQpCisgICAgICAgIHJldHVybiBpbm5lcgorCisgICAgZGVmIGluZGVudF9yZWdpb25fZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBoZWFkLCB0YWlsLCBjaGFycywgbGluZXMgPSBzZWxmLmdldF9yZWdpb24oKQorICAgICAgICBmb3IgcG9zIGluIHJhbmdlKGxlbihsaW5lcykpOgorICAgICAgICAgICAgbGluZSA9IGxpbmVzW3Bvc10KKyAgICAgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICAgICAgcmF3LCBlZmZlY3RpdmUgPSBjbGFzc2lmeXdzKGxpbmUsIHNlbGYudGFid2lkdGgpCisgICAgICAgICAgICAgICAgZWZmZWN0aXZlID0gZWZmZWN0aXZlICsgc2VsZi5pbmRlbnR3aWR0aAorICAgICAgICAgICAgICAgIGxpbmVzW3Bvc10gPSBzZWxmLl9tYWtlX2JsYW5rcyhlZmZlY3RpdmUpICsgbGluZVtyYXc6XQorICAgICAgICBzZWxmLnNldF9yZWdpb24oaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGRlZGVudF9yZWdpb25fZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBoZWFkLCB0YWlsLCBjaGFycywgbGluZXMgPSBzZWxmLmdldF9yZWdpb24oKQorICAgICAgICBmb3IgcG9zIGluIHJhbmdlKGxlbihsaW5lcykpOgorICAgICAgICAgICAgbGluZSA9IGxpbmVzW3Bvc10KKyAgICAgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICAgICAgcmF3LCBlZmZlY3RpdmUgPSBjbGFzc2lmeXdzKGxpbmUsIHNlbGYudGFid2lkdGgpCisgICAgICAgICAgICAgICAgZWZmZWN0aXZlID0gbWF4KGVmZmVjdGl2ZSAtIHNlbGYuaW5kZW50d2lkdGgsIDApCisgICAgICAgICAgICAgICAgbGluZXNbcG9zXSA9IHNlbGYuX21ha2VfYmxhbmtzKGVmZmVjdGl2ZSkgKyBsaW5lW3JhdzpdCisgICAgICAgIHNlbGYuc2V0X3JlZ2lvbihoZWFkLCB0YWlsLCBjaGFycywgbGluZXMpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgY29tbWVudF9yZWdpb25fZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBoZWFkLCB0YWlsLCBjaGFycywgbGluZXMgPSBzZWxmLmdldF9yZWdpb24oKQorICAgICAgICBmb3IgcG9zIGluIHJhbmdlKGxlbihsaW5lcykgLSAxKToKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lc1twb3NdCisgICAgICAgICAgICBsaW5lc1twb3NdID0gJyMjJyArIGxpbmUKKyAgICAgICAgc2VsZi5zZXRfcmVnaW9uKGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcykKKworICAgIGRlZiB1bmNvbW1lbnRfcmVnaW9uX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzID0gc2VsZi5nZXRfcmVnaW9uKCkKKyAgICAgICAgZm9yIHBvcyBpbiByYW5nZShsZW4obGluZXMpKToKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lc1twb3NdCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbGluZVs6Ml0gPT0gJyMjJzoKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVsyOl0KKyAgICAgICAgICAgIGVsaWYgbGluZVs6MV0gPT0gJyMnOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzE6XQorICAgICAgICAgICAgbGluZXNbcG9zXSA9IGxpbmUKKyAgICAgICAgc2VsZi5zZXRfcmVnaW9uKGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcykKKworICAgIGRlZiB0YWJpZnlfcmVnaW9uX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzID0gc2VsZi5nZXRfcmVnaW9uKCkKKyAgICAgICAgdGFid2lkdGggPSBzZWxmLl9hc2t0YWJ3aWR0aCgpCisgICAgICAgIGlmIHRhYndpZHRoIGlzIE5vbmU6IHJldHVybgorICAgICAgICBmb3IgcG9zIGluIHJhbmdlKGxlbihsaW5lcykpOgorICAgICAgICAgICAgbGluZSA9IGxpbmVzW3Bvc10KKyAgICAgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICAgICAgcmF3LCBlZmZlY3RpdmUgPSBjbGFzc2lmeXdzKGxpbmUsIHRhYndpZHRoKQorICAgICAgICAgICAgICAgIG50YWJzLCBuc3BhY2VzID0gZGl2bW9kKGVmZmVjdGl2ZSwgdGFid2lkdGgpCisgICAgICAgICAgICAgICAgbGluZXNbcG9zXSA9ICdcdCcgKiBudGFicyArICcgJyAqIG5zcGFjZXMgKyBsaW5lW3JhdzpdCisgICAgICAgIHNlbGYuc2V0X3JlZ2lvbihoZWFkLCB0YWlsLCBjaGFycywgbGluZXMpCisKKyAgICBkZWYgdW50YWJpZnlfcmVnaW9uX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzID0gc2VsZi5nZXRfcmVnaW9uKCkKKyAgICAgICAgdGFid2lkdGggPSBzZWxmLl9hc2t0YWJ3aWR0aCgpCisgICAgICAgIGlmIHRhYndpZHRoIGlzIE5vbmU6IHJldHVybgorICAgICAgICBmb3IgcG9zIGluIHJhbmdlKGxlbihsaW5lcykpOgorICAgICAgICAgICAgbGluZXNbcG9zXSA9IGxpbmVzW3Bvc10uZXhwYW5kdGFicyh0YWJ3aWR0aCkKKyAgICAgICAgc2VsZi5zZXRfcmVnaW9uKGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcykKKworICAgIGRlZiB0b2dnbGVfdGFic19ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGlmIHNlbGYuYXNreWVzbm8oCisgICAgICAgICAgICAgICJUb2dnbGUgdGFicyIsCisgICAgICAgICAgICAgICJUdXJuIHRhYnMgIiArICgib24iLCAib2ZmIilbc2VsZi51c2V0YWJzXSArCisgICAgICAgICAgICAgICI/XG5JbmRlbnQgd2lkdGggIiArCisgICAgICAgICAgICAgICgid2lsbCBiZSIsICJyZW1haW5zIGF0Iilbc2VsZi51c2V0YWJzXSArICIgOC4iICsKKyAgICAgICAgICAgICAgIlxuIE5vdGU6IGEgdGFiIGlzIGFsd2F5cyA4IGNvbHVtbnMiLAorICAgICAgICAgICAgICBwYXJlbnQ9c2VsZi50ZXh0KToKKyAgICAgICAgICAgIHNlbGYudXNldGFicyA9IG5vdCBzZWxmLnVzZXRhYnMKKyAgICAgICAgICAgICMgVHJ5IHRvIHByZXZlbnQgaW5jb25zaXN0ZW50IGluZGVudGF0aW9uLgorICAgICAgICAgICAgIyBVc2VyIG11c3QgY2hhbmdlIGluZGVudCB3aWR0aCBtYW51YWxseSBhZnRlciB1c2luZyB0YWJzLgorICAgICAgICAgICAgc2VsZi5pbmRlbnR3aWR0aCA9IDgKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgICMgWFhYIHRoaXMgaXNuJ3QgYm91bmQgdG8gYW55dGhpbmcgLS0gc2VlIHRhYndpZHRoIGNvbW1lbnRzCisjIyAgICAgZGVmIGNoYW5nZV90YWJ3aWR0aF9ldmVudChzZWxmLCBldmVudCk6CisjIyAgICAgICAgIG5ldyA9IHNlbGYuX2Fza3RhYndpZHRoKCkKKyMjICAgICAgICAgaWYgbmV3ICE9IHNlbGYudGFid2lkdGg6CisjIyAgICAgICAgICAgICBzZWxmLnRhYndpZHRoID0gbmV3CisjIyAgICAgICAgICAgICBzZWxmLnNldF9pbmRlbnRhdGlvbl9wYXJhbXMoMCwgZ3Vlc3M9MCkKKyMjICAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBjaGFuZ2VfaW5kZW50d2lkdGhfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBuZXcgPSBzZWxmLmFza2ludGVnZXIoCisgICAgICAgICAgICAgICAgICAiSW5kZW50IHdpZHRoIiwKKyAgICAgICAgICAgICAgICAgICJOZXcgaW5kZW50IHdpZHRoICgyLTE2KVxuKEFsd2F5cyB1c2UgOCB3aGVuIHVzaW5nIHRhYnMpIiwKKyAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQsCisgICAgICAgICAgICAgICAgICBpbml0aWFsdmFsdWU9c2VsZi5pbmRlbnR3aWR0aCwKKyAgICAgICAgICAgICAgICAgIG1pbnZhbHVlPTIsCisgICAgICAgICAgICAgICAgICBtYXh2YWx1ZT0xNikKKyAgICAgICAgaWYgbmV3IGFuZCBuZXcgIT0gc2VsZi5pbmRlbnR3aWR0aCBhbmQgbm90IHNlbGYudXNldGFiczoKKyAgICAgICAgICAgIHNlbGYuaW5kZW50d2lkdGggPSBuZXcKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBnZXRfcmVnaW9uKHNlbGYpOgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIGZpcnN0LCBsYXN0ID0gc2VsZi5nZXRfc2VsZWN0aW9uX2luZGljZXMoKQorICAgICAgICBpZiBmaXJzdCBhbmQgbGFzdDoKKyAgICAgICAgICAgIGhlYWQgPSB0ZXh0LmluZGV4KGZpcnN0ICsgIiBsaW5lc3RhcnQiKQorICAgICAgICAgICAgdGFpbCA9IHRleHQuaW5kZXgobGFzdCArICItMWMgbGluZWVuZCArMWMiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGVhZCA9IHRleHQuaW5kZXgoImluc2VydCBsaW5lc3RhcnQiKQorICAgICAgICAgICAgdGFpbCA9IHRleHQuaW5kZXgoImluc2VydCBsaW5lZW5kICsxYyIpCisgICAgICAgIGNoYXJzID0gdGV4dC5nZXQoaGVhZCwgdGFpbCkKKyAgICAgICAgbGluZXMgPSBjaGFycy5zcGxpdCgiXG4iKQorICAgICAgICByZXR1cm4gaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzCisKKyAgICBkZWYgc2V0X3JlZ2lvbihzZWxmLCBoZWFkLCB0YWlsLCBjaGFycywgbGluZXMpOgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIG5ld2NoYXJzID0gIlxuIi5qb2luKGxpbmVzKQorICAgICAgICBpZiBuZXdjaGFycyA9PSBjaGFyczoKKyAgICAgICAgICAgIHRleHQuYmVsbCgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdGV4dC50YWdfcmVtb3ZlKCJzZWwiLCAiMS4wIiwgImVuZCIpCisgICAgICAgIHRleHQubWFya19zZXQoImluc2VydCIsIGhlYWQpCisgICAgICAgIHRleHQudW5kb19ibG9ja19zdGFydCgpCisgICAgICAgIHRleHQuZGVsZXRlKGhlYWQsIHRhaWwpCisgICAgICAgIHRleHQuaW5zZXJ0KGhlYWQsIG5ld2NoYXJzKQorICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RvcCgpCisgICAgICAgIHRleHQudGFnX2FkZCgic2VsIiwgaGVhZCwgImluc2VydCIpCisKKyAgICAjIE1ha2Ugc3RyaW5nIHRoYXQgZGlzcGxheXMgYXMgbiBsZWFkaW5nIGJsYW5rcy4KKworICAgIGRlZiBfbWFrZV9ibGFua3Moc2VsZiwgbik6CisgICAgICAgIGlmIHNlbGYudXNldGFiczoKKyAgICAgICAgICAgIG50YWJzLCBuc3BhY2VzID0gZGl2bW9kKG4sIHNlbGYudGFid2lkdGgpCisgICAgICAgICAgICByZXR1cm4gJ1x0JyAqIG50YWJzICsgJyAnICogbnNwYWNlcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICcgJyAqIG4KKworICAgICMgRGVsZXRlIGZyb20gYmVnaW5uaW5nIG9mIGxpbmUgdG8gaW5zZXJ0IHBvaW50LCB0aGVuIHJlaW5zZXJ0CisgICAgIyBjb2x1bW4gbG9naWNhbCAobWVhbmluZyB1c2UgdGFicyBpZiBhcHByb3ByaWF0ZSkgc3BhY2VzLgorCisgICAgZGVmIHJlaW5kZW50X3RvKHNlbGYsIGNvbHVtbik6CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0YXJ0KCkKKyAgICAgICAgaWYgdGV4dC5jb21wYXJlKCJpbnNlcnQgbGluZXN0YXJ0IiwgIiE9IiwgImluc2VydCIpOgorICAgICAgICAgICAgdGV4dC5kZWxldGUoImluc2VydCBsaW5lc3RhcnQiLCAiaW5zZXJ0IikKKyAgICAgICAgaWYgY29sdW1uOgorICAgICAgICAgICAgdGV4dC5pbnNlcnQoImluc2VydCIsIHNlbGYuX21ha2VfYmxhbmtzKGNvbHVtbikpCisgICAgICAgIHRleHQudW5kb19ibG9ja19zdG9wKCkKKworICAgIGRlZiBfYXNrdGFid2lkdGgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmFza2ludGVnZXIoCisgICAgICAgICAgICAiVGFiIHdpZHRoIiwKKyAgICAgICAgICAgICJDb2x1bW5zIHBlciB0YWI/ICgyLTE2KSIsCisgICAgICAgICAgICBwYXJlbnQ9c2VsZi50ZXh0LAorICAgICAgICAgICAgaW5pdGlhbHZhbHVlPXNlbGYuaW5kZW50d2lkdGgsCisgICAgICAgICAgICBtaW52YWx1ZT0yLAorICAgICAgICAgICAgbWF4dmFsdWU9MTYpCisKKyAgICAjIEd1ZXNzIGluZGVudHdpZHRoIGZyb20gdGV4dCBjb250ZW50LgorICAgICMgUmV0dXJuIGd1ZXNzZWQgaW5kZW50d2lkdGguICBUaGlzIHNob3VsZCBub3QgYmUgYmVsaWV2ZWQgdW5sZXNzCisgICAgIyBpdCdzIGluIGEgcmVhc29uYWJsZSByYW5nZSAoZS5nLiwgaXQgd2lsbCBiZSAwIGlmIG5vIGluZGVudGVkCisgICAgIyBibG9ja3MgYXJlIGZvdW5kKS4KKworICAgIGRlZiBndWVzc19pbmRlbnQoc2VsZik6CisgICAgICAgIG9wZW5lciwgaW5kZW50ZWQgPSBJbmRlbnRTZWFyY2hlcihzZWxmLnRleHQsIHNlbGYudGFid2lkdGgpLnJ1bigpCisgICAgICAgIGlmIG9wZW5lciBhbmQgaW5kZW50ZWQ6CisgICAgICAgICAgICByYXcsIGluZGVudHNtYWxsID0gY2xhc3NpZnl3cyhvcGVuZXIsIHNlbGYudGFid2lkdGgpCisgICAgICAgICAgICByYXcsIGluZGVudGxhcmdlID0gY2xhc3NpZnl3cyhpbmRlbnRlZCwgc2VsZi50YWJ3aWR0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGluZGVudHNtYWxsID0gaW5kZW50bGFyZ2UgPSAwCisgICAgICAgIHJldHVybiBpbmRlbnRsYXJnZSAtIGluZGVudHNtYWxsCisKKyMgImxpbmUuY29sIiAtPiBsaW5lLCBhcyBhbiBpbnQKK2RlZiBpbmRleDJsaW5lKGluZGV4KToKKyAgICByZXR1cm4gaW50KGZsb2F0KGluZGV4KSkKKworIyBMb29rIGF0IHRoZSBsZWFkaW5nIHdoaXRlc3BhY2UgaW4gcy4KKyMgUmV0dXJuIHBhaXIgKCMgb2YgbGVhZGluZyB3cyBjaGFyYWN0ZXJzLAorIyAgICAgICAgICAgICAgZWZmZWN0aXZlICMgb2YgbGVhZGluZyBibGFua3MgYWZ0ZXIgZXhwYW5kaW5nCisjICAgICAgICAgICAgICB0YWJzIHRvIHdpZHRoIHRhYndpZHRoKQorCitkZWYgY2xhc3NpZnl3cyhzLCB0YWJ3aWR0aCk6CisgICAgcmF3ID0gZWZmZWN0aXZlID0gMAorICAgIGZvciBjaCBpbiBzOgorICAgICAgICBpZiBjaCA9PSAnICc6CisgICAgICAgICAgICByYXcgPSByYXcgKyAxCisgICAgICAgICAgICBlZmZlY3RpdmUgPSBlZmZlY3RpdmUgKyAxCisgICAgICAgIGVsaWYgY2ggPT0gJ1x0JzoKKyAgICAgICAgICAgIHJhdyA9IHJhdyArIDEKKyAgICAgICAgICAgIGVmZmVjdGl2ZSA9IChlZmZlY3RpdmUgLy8gdGFid2lkdGggKyAxKSAqIHRhYndpZHRoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBicmVhaworICAgIHJldHVybiByYXcsIGVmZmVjdGl2ZQorCitpbXBvcnQgdG9rZW5pemUKK190b2tlbml6ZSA9IHRva2VuaXplCitkZWwgdG9rZW5pemUKKworY2xhc3MgSW5kZW50U2VhcmNoZXIob2JqZWN0KToKKworICAgICMgLnJ1bigpIGNoZXdzIG92ZXIgdGhlIFRleHQgd2lkZ2V0LCBsb29raW5nIGZvciBhIGJsb2NrIG9wZW5lcgorICAgICMgYW5kIHRoZSBzdG10IGZvbGxvd2luZyBpdC4gIFJldHVybnMgYSBwYWlyLAorICAgICMgICAgIChsaW5lIGNvbnRhaW5pbmcgYmxvY2sgb3BlbmVyLCBsaW5lIGNvbnRhaW5pbmcgc3RtdCkKKyAgICAjIEVpdGhlciBvciBib3RoIG1heSBiZSBOb25lLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQsIHRhYndpZHRoKToKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAorICAgICAgICBzZWxmLnRhYndpZHRoID0gdGFid2lkdGgKKyAgICAgICAgc2VsZi5pID0gc2VsZi5maW5pc2hlZCA9IDAKKyAgICAgICAgc2VsZi5ibGtvcGVubGluZSA9IHNlbGYuaW5kZW50ZWRsaW5lID0gTm9uZQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZpbmlzaGVkOgorICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgIGkgPSBzZWxmLmkgPSBzZWxmLmkgKyAxCisgICAgICAgIG1hcmsgPSByZXByKGkpICsgIi4wIgorICAgICAgICBpZiBzZWxmLnRleHQuY29tcGFyZShtYXJrLCAiPj0iLCAiZW5kIik6CisgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGV4dC5nZXQobWFyaywgbWFyayArICIgbGluZWVuZCsxYyIpCisKKyAgICBkZWYgdG9rZW5lYXRlcihzZWxmLCB0eXBlLCB0b2tlbiwgc3RhcnQsIGVuZCwgbGluZSwKKyAgICAgICAgICAgICAgICAgICBJTkRFTlQ9X3Rva2VuaXplLklOREVOVCwKKyAgICAgICAgICAgICAgICAgICBOQU1FPV90b2tlbml6ZS5OQU1FLAorICAgICAgICAgICAgICAgICAgIE9QRU5FUlM9KCdjbGFzcycsICdkZWYnLCAnZm9yJywgJ2lmJywgJ3RyeScsICd3aGlsZScpKToKKyAgICAgICAgaWYgc2VsZi5maW5pc2hlZDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiB0eXBlID09IE5BTUUgYW5kIHRva2VuIGluIE9QRU5FUlM6CisgICAgICAgICAgICBzZWxmLmJsa29wZW5saW5lID0gbGluZQorICAgICAgICBlbGlmIHR5cGUgPT0gSU5ERU5UIGFuZCBzZWxmLmJsa29wZW5saW5lOgorICAgICAgICAgICAgc2VsZi5pbmRlbnRlZGxpbmUgPSBsaW5lCisgICAgICAgICAgICBzZWxmLmZpbmlzaGVkID0gMQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2F2ZV90YWJzaXplID0gX3Rva2VuaXplLnRhYnNpemUKKyAgICAgICAgX3Rva2VuaXplLnRhYnNpemUgPSBzZWxmLnRhYndpZHRoCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfdG9rZW5pemUudG9rZW5pemUoc2VsZi5yZWFkbGluZSwgc2VsZi50b2tlbmVhdGVyKQorICAgICAgICAgICAgZXhjZXB0IChfdG9rZW5pemUuVG9rZW5FcnJvciwgU3ludGF4RXJyb3IpOgorICAgICAgICAgICAgICAgICMgc2luY2Ugd2UgY3V0IG9mZiB0aGUgdG9rZW5pemVyIGVhcmx5LCB3ZSBjYW4gdHJpZ2dlcgorICAgICAgICAgICAgICAgICMgc3B1cmlvdXMgZXJyb3JzCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX3Rva2VuaXplLnRhYnNpemUgPSBzYXZlX3RhYnNpemUKKyAgICAgICAgcmV0dXJuIHNlbGYuYmxrb3BlbmxpbmUsIHNlbGYuaW5kZW50ZWRsaW5lCisKKyMjIyBlbmQgYXV0b2luZGVudCBjb2RlICMjIworCitkZWYgcHJlcHN0cihzKToKKyAgICAjIEhlbHBlciB0byBleHRyYWN0IHRoZSB1bmRlcnNjb3JlIGZyb20gYSBzdHJpbmcsIGUuZy4KKyAgICAjIHByZXBzdHIoIkNvX3B5IikgcmV0dXJucyAoMiwgIkNvcHkiKS4KKyAgICBpID0gcy5maW5kKCdfJykKKyAgICBpZiBpID49IDA6CisgICAgICAgIHMgPSBzWzppXSArIHNbaSsxOl0KKyAgICByZXR1cm4gaSwgcworCisKK2tleW5hbWVzID0geworICdicmFja2V0bGVmdCc6ICdbJywKKyAnYnJhY2tldHJpZ2h0JzogJ10nLAorICdzbGFzaCc6ICcvJywKK30KKworZGVmIGdldF9hY2NlbGVyYXRvcihrZXlkZWZzLCBldmVudG5hbWUpOgorICAgIGtleWxpc3QgPSBrZXlkZWZzLmdldChldmVudG5hbWUpCisgICAgIyBpc3N1ZTEwOTQwOiB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCB0byBwcmV2ZW50IGhhbmcgd2l0aCBPUyBYIENvY29hIFRrIDguNQorICAgICMgaWYgbm90IGtleWxpc3Q6CisgICAgaWYgKG5vdCBrZXlsaXN0KSBvciAobWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKSBhbmQgZXZlbnRuYW1lIGluIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPDxvcGVuLW1vZHVsZT4+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPDxnb3RvLWxpbmU+PiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjw8Y2hhbmdlLWluZGVudHdpZHRoPj4ifSk6CisgICAgICAgIHJldHVybiAiIgorICAgIHMgPSBrZXlsaXN0WzBdCisgICAgcyA9IHJlLnN1YihyIi1bYS16XVxiIiwgbGFtYmRhIG06IG0uZ3JvdXAoKS51cHBlcigpLCBzKQorICAgIHMgPSByZS5zdWIociJcYlx3K1xiIiwgbGFtYmRhIG06IGtleW5hbWVzLmdldChtLmdyb3VwKCksIG0uZ3JvdXAoKSksIHMpCisgICAgcyA9IHJlLnN1YigiS2V5LSIsICIiLCBzKQorICAgIHMgPSByZS5zdWIoIkNhbmNlbCIsIkN0cmwtQnJlYWsiLHMpICAgIyBkc2NoZXJlckBjbXUuZWR1CisgICAgcyA9IHJlLnN1YigiQ29udHJvbC0iLCAiQ3RybC0iLCBzKQorICAgIHMgPSByZS5zdWIoIi0iLCAiKyIsIHMpCisgICAgcyA9IHJlLnN1YigiPjwiLCAiICIsIHMpCisgICAgcyA9IHJlLnN1YigiPCIsICIiLCBzKQorICAgIHMgPSByZS5zdWIoIj4iLCAiIiwgcykKKyAgICByZXR1cm4gcworCisKK2RlZiBmaXh3b3JkYnJlYWtzKHJvb3QpOgorICAgICMgTWFrZSBzdXJlIHRoYXQgVGsncyBkb3VibGUtY2xpY2sgYW5kIG5leHQvcHJldmlvdXMgd29yZAorICAgICMgb3BlcmF0aW9ucyB1c2Ugb3VyIGRlZmluaXRpb24gb2YgYSB3b3JkIChpLmUuIGFuIGlkZW50aWZpZXIpCisgICAgdGsgPSByb290LnRrCisgICAgdGsuY2FsbCgndGNsX3dvcmRCcmVha0FmdGVyJywgJ2EgYicsIDApICMgbWFrZSBzdXJlIHdvcmQudGNsIGlzIGxvYWRlZAorICAgIHRrLmNhbGwoJ3NldCcsICd0Y2xfd29yZGNoYXJzJywgJ1thLXpBLVowLTlfXScpCisgICAgdGsuY2FsbCgnc2V0JywgJ3RjbF9ub253b3JkY2hhcnMnLCAnW15hLXpBLVowLTlfXScpCisKKworZGVmIHRlc3QoKToKKyAgICByb290ID0gVGsoKQorICAgIGZpeHdvcmRicmVha3Mocm9vdCkKKyAgICByb290LndpdGhkcmF3KCkKKyAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgIGZpbGVuYW1lID0gc3lzLmFyZ3ZbMV0KKyAgICBlbHNlOgorICAgICAgICBmaWxlbmFtZSA9IE5vbmUKKyAgICBlZGl0ID0gRWRpdG9yV2luZG93KHJvb3Q9cm9vdCwgZmlsZW5hbWU9ZmlsZW5hbWUpCisgICAgZWRpdC5zZXRfY2xvc2VfaG9vayhyb290LnF1aXQpCisgICAgZWRpdC50ZXh0LmJpbmQoIjw8Y2xvc2UtYWxsLXdpbmRvd3M+PiIsIGVkaXQuY2xvc2VfZXZlbnQpCisgICAgcm9vdC5tYWlubG9vcCgpCisgICAgcm9vdC5kZXN0cm95KCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0VkaXRvcldpbmRvdy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4OTQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0VkaXRvcldpbmRvdy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjMjA3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9GaWxlTGlzdC5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9GaWxlTGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzE4ZmYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ZpbGVMaXN0LnB5CkBAIC0wLDAgKzEsMTI0IEBACitpbXBvcnQgb3MKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgoraW1wb3J0IHRrTWVzc2FnZUJveAorCisKK2NsYXNzIEZpbGVMaXN0OgorCisgICAgIyBOLkIuIHRoaXMgaW1wb3J0IG92ZXJyaWRkZW4gaW4gUHlTaGVsbEZpbGVMaXN0LgorICAgIGZyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3QpOgorICAgICAgICBzZWxmLnJvb3QgPSByb290CisgICAgICAgIHNlbGYuZGljdCA9IHt9CisgICAgICAgIHNlbGYuaW52ZXJzZWRpY3QgPSB7fQorICAgICAgICBzZWxmLnZhcnMgPSB7fSAjIEZvciBFZGl0b3JXaW5kb3cuZ2V0cmF3dmFyIChzaGFyZWQgVGNsIHZhcmlhYmxlcykKKworICAgIGRlZiBvcGVuKHNlbGYsIGZpbGVuYW1lLCBhY3Rpb249Tm9uZSk6CisgICAgICAgIGFzc2VydCBmaWxlbmFtZQorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY2Fub25pemUoZmlsZW5hbWUpCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgorICAgICAgICAgICAgIyBUaGlzIGNhbiBoYXBwZW4gd2hlbiBiYWQgZmlsZW5hbWUgaXMgcGFzc2VkIG9uIGNvbW1hbmQgbGluZToKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoCisgICAgICAgICAgICAgICAgIkZpbGUgRXJyb3IiLAorICAgICAgICAgICAgICAgICIlciBpcyBhIGRpcmVjdG9yeS4iICUgKGZpbGVuYW1lLCksCisgICAgICAgICAgICAgICAgbWFzdGVyPXNlbGYucm9vdCkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGtleSA9IG9zLnBhdGgubm9ybWNhc2UoZmlsZW5hbWUpCisgICAgICAgIGlmIGtleSBpbiBzZWxmLmRpY3Q6CisgICAgICAgICAgICBlZGl0ID0gc2VsZi5kaWN0W2tleV0KKyAgICAgICAgICAgIGVkaXQudG9wLndha2V1cCgpCisgICAgICAgICAgICByZXR1cm4gZWRpdAorICAgICAgICBpZiBhY3Rpb246CisgICAgICAgICAgICAjIERvbid0IGNyZWF0ZSB3aW5kb3csIHBlcmZvcm0gJ2FjdGlvbicsIGUuZy4gb3BlbiBpbiBzYW1lIHdpbmRvdworICAgICAgICAgICAgcmV0dXJuIGFjdGlvbihmaWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLkVkaXRvcldpbmRvdyhzZWxmLCBmaWxlbmFtZSwga2V5KQorCisgICAgZGVmIGdvdG9maWxlbGluZShzZWxmLCBmaWxlbmFtZSwgbGluZW5vPU5vbmUpOgorICAgICAgICBlZGl0ID0gc2VsZi5vcGVuKGZpbGVuYW1lKQorICAgICAgICBpZiBlZGl0IGlzIG5vdCBOb25lIGFuZCBsaW5lbm8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBlZGl0LmdvdG9saW5lKGxpbmVubykKKworICAgIGRlZiBuZXcoc2VsZiwgZmlsZW5hbWU9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLkVkaXRvcldpbmRvdyhzZWxmLCBmaWxlbmFtZSkKKworICAgIGRlZiBjbG9zZV9hbGxfY2FsbGJhY2soc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIGZvciBlZGl0IGluIHNlbGYuaW52ZXJzZWRpY3Qua2V5cygpOgorICAgICAgICAgICAgcmVwbHkgPSBlZGl0LmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHJlcGx5ID09ICJjYW5jZWwiOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgdW5yZWdpc3Rlcl9tYXliZV90ZXJtaW5hdGUoc2VsZiwgZWRpdCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGtleSA9IHNlbGYuaW52ZXJzZWRpY3RbZWRpdF0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcHJpbnQgIkRvbid0IGtub3cgdGhpcyBFZGl0b3JXaW5kb3cgb2JqZWN0LiAgKGNsb3NlKSIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBrZXk6CisgICAgICAgICAgICBkZWwgc2VsZi5kaWN0W2tleV0KKyAgICAgICAgZGVsIHNlbGYuaW52ZXJzZWRpY3RbZWRpdF0KKyAgICAgICAgaWYgbm90IHNlbGYuaW52ZXJzZWRpY3Q6CisgICAgICAgICAgICBzZWxmLnJvb3QucXVpdCgpCisKKyAgICBkZWYgZmlsZW5hbWVfY2hhbmdlZF9lZGl0KHNlbGYsIGVkaXQpOgorICAgICAgICBlZGl0LnNhdmVkX2NoYW5nZV9ob29rKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAga2V5ID0gc2VsZi5pbnZlcnNlZGljdFtlZGl0XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwcmludCAiRG9uJ3Qga25vdyB0aGlzIEVkaXRvcldpbmRvdyBvYmplY3QuICAocmVuYW1lKSIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmaWxlbmFtZSA9IGVkaXQuaW8uZmlsZW5hbWUKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgaWYga2V5OgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmRpY3Rba2V5XQorICAgICAgICAgICAgc2VsZi5pbnZlcnNlZGljdFtlZGl0XSA9IE5vbmUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY2Fub25pemUoZmlsZW5hbWUpCisgICAgICAgIG5ld2tleSA9IG9zLnBhdGgubm9ybWNhc2UoZmlsZW5hbWUpCisgICAgICAgIGlmIG5ld2tleSA9PSBrZXk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbmV3a2V5IGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgIGNvbmZsaWN0ID0gc2VsZi5kaWN0W25ld2tleV0KKyAgICAgICAgICAgIHNlbGYuaW52ZXJzZWRpY3RbY29uZmxpY3RdID0gTm9uZQorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigKKyAgICAgICAgICAgICAgICAiTmFtZSBDb25mbGljdCIsCisgICAgICAgICAgICAgICAgIllvdSBub3cgaGF2ZSBtdWx0aXBsZSBlZGl0IHdpbmRvd3Mgb3BlbiBmb3IgJXIiICUgKGZpbGVuYW1lLCksCisgICAgICAgICAgICAgICAgbWFzdGVyPXNlbGYucm9vdCkKKyAgICAgICAgc2VsZi5kaWN0W25ld2tleV0gPSBlZGl0CisgICAgICAgIHNlbGYuaW52ZXJzZWRpY3RbZWRpdF0gPSBuZXdrZXkKKyAgICAgICAgaWYga2V5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmRpY3Rba2V5XQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBjYW5vbml6ZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKGZpbGVuYW1lKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ocHdkLCBmaWxlbmFtZSkKKyAgICAgICAgcmV0dXJuIG9zLnBhdGgubm9ybXBhdGgoZmlsZW5hbWUpCisKKworZGVmIF90ZXN0KCk6CisgICAgZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgZml4d29yZGJyZWFrcworICAgIGltcG9ydCBzeXMKKyAgICByb290ID0gVGsoKQorICAgIGZpeHdvcmRicmVha3Mocm9vdCkKKyAgICByb290LndpdGhkcmF3KCkKKyAgICBmbGlzdCA9IEZpbGVMaXN0KHJvb3QpCisgICAgaWYgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gc3lzLmFyZ3ZbMTpdOgorICAgICAgICAgICAgZmxpc3Qub3BlbihmaWxlbmFtZSkKKyAgICBlbHNlOgorICAgICAgICBmbGlzdC5uZXcoKQorICAgIGlmIGZsaXN0LmludmVyc2VkaWN0OgorICAgICAgICByb290Lm1haW5sb29wKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvRmlsZUxpc3QucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ZpbGVMaXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmE2ZDExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ZpbGVMaXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvRmlsZUxpc3QucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ZpbGVMaXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDYyNGZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ZpbGVMaXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvRm9ybWF0UGFyYWdyYXBoLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTdkOGE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weQpAQCAtMCwwICsxLDE1MCBAQAorIyBFeHRlbnNpb24gdG8gZm9ybWF0IGEgcGFyYWdyYXBoCisKKyMgRG9lcyBiYXNpYywgc3RhbmRhcmQgdGV4dCBmb3JtYXR0aW5nLCBhbmQgYWxzbyB1bmRlcnN0YW5kcyBQeXRob24KKyMgY29tbWVudCBibG9ja3MuICBUaHVzLCBmb3IgZWRpdGluZyBQeXRob24gc291cmNlIGNvZGUsIHRoaXMKKyMgZXh0ZW5zaW9uIGlzIHJlYWxseSBvbmx5IHN1aXRhYmxlIGZvciByZWZvcm1hdHRpbmcgdGhlc2UgY29tbWVudAorIyBibG9ja3Mgb3IgdHJpcGxlLXF1b3RlZCBzdHJpbmdzLgorCisjIEtub3duIHByb2JsZW1zIHdpdGggY29tbWVudCByZWZvcm1hdHRpbmc6CisjICogSWYgdGhlcmUgaXMgYSBzZWxlY3Rpb24gbWFya2VkLCBhbmQgdGhlIGZpcnN0IGxpbmUgb2YgdGhlCisjICAgc2VsZWN0aW9uIGlzIG5vdCBjb21wbGV0ZSwgdGhlIGJsb2NrIHdpbGwgcHJvYmFibHkgbm90IGJlIGRldGVjdGVkCisjICAgYXMgY29tbWVudHMsIGFuZCB3aWxsIGhhdmUgdGhlIG5vcm1hbCAidGV4dCBmb3JtYXR0aW5nIiBydWxlcworIyAgIGFwcGxpZWQuCisjICogSWYgYSBjb21tZW50IGJsb2NrIGhhcyBsZWFkaW5nIHdoaXRlc3BhY2UgdGhhdCBtaXhlcyB0YWJzIGFuZAorIyAgIHNwYWNlcywgdGhleSB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHNhbWUgYmxvY2suCisjICogRmFuY3kgY29tbWVudHMsIGxpa2UgdGhpcyBidWxsZXRlZCBsaXN0LCBhcmVudCBoYW5kbGVkIDotKQorCitpbXBvcnQgcmUKK2Zyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorCitjbGFzcyBGb3JtYXRQYXJhZ3JhcGg6CisKKyAgICBtZW51ZGVmcyA9IFsKKyAgICAgICAgKCdmb3JtYXQnLCBbICAgIyAvcy9lZGl0L2Zvcm1hdCAgIGRzY2hlcmVyQGNtdS5lZHUKKyAgICAgICAgICAgICgnRm9ybWF0IFBhcmFncmFwaCcsICc8PGZvcm1hdC1wYXJhZ3JhcGg+PicpLAorICAgICAgICAgXSkKKyAgICBdCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbik6CisgICAgICAgIHNlbGYuZWRpdHdpbiA9IGVkaXR3aW4KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5lZGl0d2luID0gTm9uZQorCisgICAgZGVmIGZvcm1hdF9wYXJhZ3JhcGhfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBtYXhmb3JtYXR3aWR0aCA9IGludChpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdGb3JtYXRQYXJhZ3JhcGgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhcmFncmFwaCcsIHR5cGU9J2ludCcpKQorICAgICAgICB0ZXh0ID0gc2VsZi5lZGl0d2luLnRleHQKKyAgICAgICAgZmlyc3QsIGxhc3QgPSBzZWxmLmVkaXR3aW4uZ2V0X3NlbGVjdGlvbl9pbmRpY2VzKCkKKyAgICAgICAgaWYgZmlyc3QgYW5kIGxhc3Q6CisgICAgICAgICAgICBkYXRhID0gdGV4dC5nZXQoZmlyc3QsIGxhc3QpCisgICAgICAgICAgICBjb21tZW50X2hlYWRlciA9ICcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaXJzdCwgbGFzdCwgY29tbWVudF9oZWFkZXIsIGRhdGEgPSBcCisgICAgICAgICAgICAgICAgICAgIGZpbmRfcGFyYWdyYXBoKHRleHQsIHRleHQuaW5kZXgoImluc2VydCIpKQorICAgICAgICBpZiBjb21tZW50X2hlYWRlcjoKKyAgICAgICAgICAgICMgUmVmb3JtYXQgdGhlIGNvbW1lbnQgbGluZXMgLSBjb252ZXJ0IHRvIHRleHQgc2FucyBoZWFkZXIuCisgICAgICAgICAgICBsaW5lcyA9IGRhdGEuc3BsaXQoIlxuIikKKyAgICAgICAgICAgIGxpbmVzID0gbWFwKGxhbWJkYSBzdCwgbD1sZW4oY29tbWVudF9oZWFkZXIpOiBzdFtsOl0sIGxpbmVzKQorICAgICAgICAgICAgZGF0YSA9ICJcbiIuam9pbihsaW5lcykKKyAgICAgICAgICAgICMgUmVmb3JtYXQgdG8gbWF4Zm9ybWF0d2lkdGggY2hhcnMgb3IgYSAyMCBjaGFyIHdpZHRoLCB3aGljaGV2ZXIgaXMgZ3JlYXRlci4KKyAgICAgICAgICAgIGZvcm1hdF93aWR0aCA9IG1heChtYXhmb3JtYXR3aWR0aCAtIGxlbihjb21tZW50X2hlYWRlciksIDIwKQorICAgICAgICAgICAgbmV3ZGF0YSA9IHJlZm9ybWF0X3BhcmFncmFwaChkYXRhLCBmb3JtYXRfd2lkdGgpCisgICAgICAgICAgICAjIHJlLXNwbGl0IGFuZCByZS1pbnNlcnQgdGhlIGNvbW1lbnQgaGVhZGVyLgorICAgICAgICAgICAgbmV3ZGF0YSA9IG5ld2RhdGEuc3BsaXQoIlxuIikKKyAgICAgICAgICAgICMgSWYgdGhlIGJsb2NrIGVuZHMgaW4gYSBcbiwgd2UgZG9udCB3YW50IHRoZSBjb21tZW50CisgICAgICAgICAgICAjIHByZWZpeCBpbnNlcnRlZCBhZnRlciBpdC4gKEltIG5vdCBzdXJlIGl0IG1ha2VzIHNlbnNlIHRvCisgICAgICAgICAgICAjIHJlZm9ybWF0IGEgY29tbWVudCBibG9jayB0aGF0IGlzbnQgbWFkZSBvZiBjb21wbGV0ZQorICAgICAgICAgICAgIyBsaW5lcywgYnV0IHdoYXRldmVyISkgIENhbid0IHRoaW5rIG9mIGEgY2xlYW4gc29sdXRpb24sCisgICAgICAgICAgICAjIHNvIHdlIGhhY2sgYXdheQorICAgICAgICAgICAgYmxvY2tfc3VmZml4ID0gIiIKKyAgICAgICAgICAgIGlmIG5vdCBuZXdkYXRhWy0xXToKKyAgICAgICAgICAgICAgICBibG9ja19zdWZmaXggPSAiXG4iCisgICAgICAgICAgICAgICAgbmV3ZGF0YSA9IG5ld2RhdGFbOi0xXQorICAgICAgICAgICAgYnVpbGRlciA9IGxhbWJkYSBpdGVtLCBwcmVmaXg9Y29tbWVudF9oZWFkZXI6IHByZWZpeCtpdGVtCisgICAgICAgICAgICBuZXdkYXRhID0gJ1xuJy5qb2luKG1hcChidWlsZGVyLCBuZXdkYXRhKSkgKyBibG9ja19zdWZmaXgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgSnVzdCBhIG5vcm1hbCB0ZXh0IGZvcm1hdAorICAgICAgICAgICAgbmV3ZGF0YSA9IHJlZm9ybWF0X3BhcmFncmFwaChkYXRhLCBtYXhmb3JtYXR3aWR0aCkKKyAgICAgICAgdGV4dC50YWdfcmVtb3ZlKCJzZWwiLCAiMS4wIiwgImVuZCIpCisgICAgICAgIGlmIG5ld2RhdGEgIT0gZGF0YToKKyAgICAgICAgICAgIHRleHQubWFya19zZXQoImluc2VydCIsIGZpcnN0KQorICAgICAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0YXJ0KCkKKyAgICAgICAgICAgIHRleHQuZGVsZXRlKGZpcnN0LCBsYXN0KQorICAgICAgICAgICAgdGV4dC5pbnNlcnQoZmlyc3QsIG5ld2RhdGEpCisgICAgICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RvcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBsYXN0KQorICAgICAgICB0ZXh0LnNlZSgiaW5zZXJ0IikKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworZGVmIGZpbmRfcGFyYWdyYXBoKHRleHQsIG1hcmspOgorICAgIGxpbmVubywgY29sID0gbWFwKGludCwgbWFyay5zcGxpdCgiLiIpKQorICAgIGxpbmUgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lbm8sICIlZC4wIGxpbmVlbmQiICUgbGluZW5vKQorICAgIHdoaWxlIHRleHQuY29tcGFyZSgiJWQuMCIgJSBsaW5lbm8sICI8IiwgImVuZCIpIGFuZCBpc19hbGxfd2hpdGUobGluZSk6CisgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKKyAgICAgICAgbGluZSA9IHRleHQuZ2V0KCIlZC4wIiAlIGxpbmVubywgIiVkLjAgbGluZWVuZCIgJSBsaW5lbm8pCisgICAgZmlyc3RfbGluZW5vID0gbGluZW5vCisgICAgY29tbWVudF9oZWFkZXIgPSBnZXRfY29tbWVudF9oZWFkZXIobGluZSkKKyAgICBjb21tZW50X2hlYWRlcl9sZW4gPSBsZW4oY29tbWVudF9oZWFkZXIpCisgICAgd2hpbGUgZ2V0X2NvbW1lbnRfaGVhZGVyKGxpbmUpPT1jb21tZW50X2hlYWRlciBhbmQgXAorICAgICAgICAgICAgICBub3QgaXNfYWxsX3doaXRlKGxpbmVbY29tbWVudF9oZWFkZXJfbGVuOl0pOgorICAgICAgICBsaW5lbm8gPSBsaW5lbm8gKyAxCisgICAgICAgIGxpbmUgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lbm8sICIlZC4wIGxpbmVlbmQiICUgbGluZW5vKQorICAgIGxhc3QgPSAiJWQuMCIgJSBsaW5lbm8KKyAgICAjIFNlYXJjaCBiYWNrIHRvIGJlZ2lubmluZyBvZiBwYXJhZ3JhcGgKKyAgICBsaW5lbm8gPSBmaXJzdF9saW5lbm8gLSAxCisgICAgbGluZSA9IHRleHQuZ2V0KCIlZC4wIiAlIGxpbmVubywgIiVkLjAgbGluZWVuZCIgJSBsaW5lbm8pCisgICAgd2hpbGUgbGluZW5vID4gMCBhbmQgXAorICAgICAgICAgICAgICBnZXRfY29tbWVudF9oZWFkZXIobGluZSk9PWNvbW1lbnRfaGVhZGVyIGFuZCBcCisgICAgICAgICAgICAgIG5vdCBpc19hbGxfd2hpdGUobGluZVtjb21tZW50X2hlYWRlcl9sZW46XSk6CisgICAgICAgIGxpbmVubyA9IGxpbmVubyAtIDEKKyAgICAgICAgbGluZSA9IHRleHQuZ2V0KCIlZC4wIiAlIGxpbmVubywgIiVkLjAgbGluZWVuZCIgJSBsaW5lbm8pCisgICAgZmlyc3QgPSAiJWQuMCIgJSAobGluZW5vKzEpCisgICAgcmV0dXJuIGZpcnN0LCBsYXN0LCBjb21tZW50X2hlYWRlciwgdGV4dC5nZXQoZmlyc3QsIGxhc3QpCisKK2RlZiByZWZvcm1hdF9wYXJhZ3JhcGgoZGF0YSwgbGltaXQpOgorICAgIGxpbmVzID0gZGF0YS5zcGxpdCgiXG4iKQorICAgIGkgPSAwCisgICAgbiA9IGxlbihsaW5lcykKKyAgICB3aGlsZSBpIDwgbiBhbmQgaXNfYWxsX3doaXRlKGxpbmVzW2ldKToKKyAgICAgICAgaSA9IGkrMQorICAgIGlmIGkgPj0gbjoKKyAgICAgICAgcmV0dXJuIGRhdGEKKyAgICBpbmRlbnQxID0gZ2V0X2luZGVudChsaW5lc1tpXSkKKyAgICBpZiBpKzEgPCBuIGFuZCBub3QgaXNfYWxsX3doaXRlKGxpbmVzW2krMV0pOgorICAgICAgICBpbmRlbnQyID0gZ2V0X2luZGVudChsaW5lc1tpKzFdKQorICAgIGVsc2U6CisgICAgICAgIGluZGVudDIgPSBpbmRlbnQxCisgICAgbmV3ID0gbGluZXNbOmldCisgICAgcGFydGlhbCA9IGluZGVudDEKKyAgICB3aGlsZSBpIDwgbiBhbmQgbm90IGlzX2FsbF93aGl0ZShsaW5lc1tpXSk6CisgICAgICAgICMgWFhYIFNob3VsZCB0YWtlIGRvdWJsZSBzcGFjZSBhZnRlciBwZXJpb2QgKGV0Yy4pIGludG8gYWNjb3VudAorICAgICAgICB3b3JkcyA9IHJlLnNwbGl0KCIoXHMrKSIsIGxpbmVzW2ldKQorICAgICAgICBmb3IgaiBpbiByYW5nZSgwLCBsZW4od29yZHMpLCAyKToKKyAgICAgICAgICAgIHdvcmQgPSB3b3Jkc1tqXQorICAgICAgICAgICAgaWYgbm90IHdvcmQ6CisgICAgICAgICAgICAgICAgY29udGludWUgIyBDYW4gaGFwcGVuIHdoZW4gbGluZSBlbmRzIGluIHdoaXRlc3BhY2UKKyAgICAgICAgICAgIGlmIGxlbigocGFydGlhbCArIHdvcmQpLmV4cGFuZHRhYnMoKSkgPiBsaW1pdCBhbmQgXAorICAgICAgICAgICAgICAgcGFydGlhbCAhPSBpbmRlbnQxOgorICAgICAgICAgICAgICAgIG5ldy5hcHBlbmQocGFydGlhbC5yc3RyaXAoKSkKKyAgICAgICAgICAgICAgICBwYXJ0aWFsID0gaW5kZW50MgorICAgICAgICAgICAgcGFydGlhbCA9IHBhcnRpYWwgKyB3b3JkICsgIiAiCisgICAgICAgICAgICBpZiBqKzEgPCBsZW4od29yZHMpIGFuZCB3b3Jkc1tqKzFdICE9ICIgIjoKKyAgICAgICAgICAgICAgICBwYXJ0aWFsID0gcGFydGlhbCArICIgIgorICAgICAgICBpID0gaSsxCisgICAgbmV3LmFwcGVuZChwYXJ0aWFsLnJzdHJpcCgpKQorICAgICMgWFhYIFNob3VsZCByZWZvcm1hdCByZW1haW5pbmcgcGFyYWdyYXBocyBhcyB3ZWxsCisgICAgbmV3LmV4dGVuZChsaW5lc1tpOl0pCisgICAgcmV0dXJuICJcbiIuam9pbihuZXcpCisKK2RlZiBpc19hbGxfd2hpdGUobGluZSk6CisgICAgcmV0dXJuIHJlLm1hdGNoKHIiXlxzKiQiLCBsaW5lKSBpcyBub3QgTm9uZQorCitkZWYgZ2V0X2luZGVudChsaW5lKToKKyAgICByZXR1cm4gcmUubWF0Y2gociJeKFxzKikiLCBsaW5lKS5ncm91cCgpCisKK2RlZiBnZXRfY29tbWVudF9oZWFkZXIobGluZSk6CisgICAgbSA9IHJlLm1hdGNoKHIiXihccyojKikiLCBsaW5lKQorICAgIGlmIG0gaXMgTm9uZTogcmV0dXJuICIiCisgICAgcmV0dXJuIG0uZ3JvdXAoMSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9Gb3JtYXRQYXJhZ3JhcGgucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjM2NlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Gb3JtYXRQYXJhZ3JhcGgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9Gb3JtYXRQYXJhZ3JhcGgucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjM2NlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Gb3JtYXRQYXJhZ3JhcGgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9HcmVwRGlhbG9nLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0dyZXBEaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwZTU0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9HcmVwRGlhbG9nLnB5CkBAIC0wLDAgKzEsMTMzIEBACitpbXBvcnQgb3MKK2ltcG9ydCBmbm1hdGNoCitpbXBvcnQgc3lzCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKK2Zyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lCitmcm9tIGlkbGVsaWIuU2VhcmNoRGlhbG9nQmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQorCitkZWYgZ3JlcCh0ZXh0LCBpbz1Ob25lLCBmbGlzdD1Ob25lKToKKyAgICByb290ID0gdGV4dC5fcm9vdCgpCisgICAgZW5naW5lID0gU2VhcmNoRW5naW5lLmdldChyb290KQorICAgIGlmIG5vdCBoYXNhdHRyKGVuZ2luZSwgIl9ncmVwZGlhbG9nIik6CisgICAgICAgIGVuZ2luZS5fZ3JlcGRpYWxvZyA9IEdyZXBEaWFsb2cocm9vdCwgZW5naW5lLCBmbGlzdCkKKyAgICBkaWFsb2cgPSBlbmdpbmUuX2dyZXBkaWFsb2cKKyAgICBzZWFyY2hwaHJhc2UgPSB0ZXh0LmdldCgic2VsLmZpcnN0IiwgInNlbC5sYXN0IikKKyAgICBkaWFsb2cub3Blbih0ZXh0LCBzZWFyY2hwaHJhc2UsIGlvKQorCitjbGFzcyBHcmVwRGlhbG9nKFNlYXJjaERpYWxvZ0Jhc2UpOgorCisgICAgdGl0bGUgPSAiRmluZCBpbiBGaWxlcyBEaWFsb2ciCisgICAgaWNvbiA9ICJHcmVwIgorICAgIG5lZWR3cmFwYnV0dG9uID0gMAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3QsIGVuZ2luZSwgZmxpc3QpOgorICAgICAgICBTZWFyY2hEaWFsb2dCYXNlLl9faW5pdF9fKHNlbGYsIHJvb3QsIGVuZ2luZSkKKyAgICAgICAgc2VsZi5mbGlzdCA9IGZsaXN0CisgICAgICAgIHNlbGYuZ2xvYnZhciA9IFN0cmluZ1Zhcihyb290KQorICAgICAgICBzZWxmLnJlY3ZhciA9IEJvb2xlYW5WYXIocm9vdCkKKworICAgIGRlZiBvcGVuKHNlbGYsIHRleHQsIHNlYXJjaHBocmFzZSwgaW89Tm9uZSk6CisgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2Uub3BlbihzZWxmLCB0ZXh0LCBzZWFyY2hwaHJhc2UpCisgICAgICAgIGlmIGlvOgorICAgICAgICAgICAgcGF0aCA9IGlvLmZpbGVuYW1lIG9yICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gIiIKKyAgICAgICAgZGlyLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQorICAgICAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdGV4dChiYXNlKQorICAgICAgICBpZiBub3QgdGFpbDoKKyAgICAgICAgICAgIHRhaWwgPSAiLnB5IgorICAgICAgICBzZWxmLmdsb2J2YXIuc2V0KG9zLnBhdGguam9pbihkaXIsICIqIiArIHRhaWwpKQorCisgICAgZGVmIGNyZWF0ZV9lbnRyaWVzKHNlbGYpOgorICAgICAgICBTZWFyY2hEaWFsb2dCYXNlLmNyZWF0ZV9lbnRyaWVzKHNlbGYpCisgICAgICAgIHNlbGYuZ2xvYmVudCA9IHNlbGYubWFrZV9lbnRyeSgiSW4gZmlsZXM6Iiwgc2VsZi5nbG9idmFyKQorCisgICAgZGVmIGNyZWF0ZV9vdGhlcl9idXR0b25zKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5tYWtlX2ZyYW1lKCkKKworICAgICAgICBidG4gPSBDaGVja2J1dHRvbihmLCBhbmNob3I9InciLAorICAgICAgICAgICAgICAgIHZhcmlhYmxlPXNlbGYucmVjdmFyLAorICAgICAgICAgICAgICAgIHRleHQ9IlJlY3Vyc2UgZG93biBzdWJkaXJlY3RvcmllcyIpCisgICAgICAgIGJ0bi5wYWNrKHNpZGU9InRvcCIsIGZpbGw9ImJvdGgiKQorICAgICAgICBidG4uc2VsZWN0KCkKKworICAgIGRlZiBjcmVhdGVfY29tbWFuZF9idXR0b25zKHNlbGYpOgorICAgICAgICBTZWFyY2hEaWFsb2dCYXNlLmNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoc2VsZikKKyAgICAgICAgc2VsZi5tYWtlX2J1dHRvbigiU2VhcmNoIEZpbGVzIiwgc2VsZi5kZWZhdWx0X2NvbW1hbmQsIDEpCisKKyAgICBkZWYgZGVmYXVsdF9jb21tYW5kKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBwcm9nID0gc2VsZi5lbmdpbmUuZ2V0cHJvZygpCisgICAgICAgIGlmIG5vdCBwcm9nOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHBhdGggPSBzZWxmLmdsb2J2YXIuZ2V0KCkKKyAgICAgICAgaWYgbm90IHBhdGg6CisgICAgICAgICAgICBzZWxmLnRvcC5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmcm9tIGlkbGVsaWIuT3V0cHV0V2luZG93IGltcG9ydCBPdXRwdXRXaW5kb3cKKyAgICAgICAgc2F2ZSA9IHN5cy5zdGRvdXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IE91dHB1dFdpbmRvdyhzZWxmLmZsaXN0KQorICAgICAgICAgICAgc2VsZi5ncmVwX2l0KHByb2csIHBhdGgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZQorCisgICAgZGVmIGdyZXBfaXQoc2VsZiwgcHJvZywgcGF0aCk6CisgICAgICAgIGRpciwgYmFzZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKKyAgICAgICAgbGlzdCA9IHNlbGYuZmluZGZpbGVzKGRpciwgYmFzZSwgc2VsZi5yZWN2YXIuZ2V0KCkpCisgICAgICAgIGxpc3Quc29ydCgpCisgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICBwYXQgPSBzZWxmLmVuZ2luZS5nZXRwYXQoKQorICAgICAgICBwcmludCAiU2VhcmNoaW5nICVyIGluICVzIC4uLiIgJSAocGF0LCBwYXRoKQorICAgICAgICBoaXRzID0gMAorICAgICAgICBmb3IgZm4gaW4gbGlzdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gb3BlbihmbikKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcHJpbnQgbXNnCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxpbmVubyA9IDAKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgYmxvY2sgPSBmLnJlYWRsaW5lcygxMDAwMDApCisgICAgICAgICAgICAgICAgaWYgbm90IGJsb2NrOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGJsb2NrOgorICAgICAgICAgICAgICAgICAgICBsaW5lbm8gPSBsaW5lbm8gKyAxCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVbLTE6XSA9PSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgICAgICAgICBpZiBwcm9nLnNlYXJjaChsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiVzOiAlczogJXNcbiIgJSAoZm4sIGxpbmVubywgbGluZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBoaXRzID0gaGl0cyArIDEKKyAgICAgICAgaWYgaGl0czoKKyAgICAgICAgICAgIGlmIGhpdHMgPT0gMToKKyAgICAgICAgICAgICAgICBzID0gIiIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcyA9ICJzIgorICAgICAgICAgICAgcHJpbnQgIkZvdW5kIiwgaGl0cywgImhpdCVzLiIgJSBzCisgICAgICAgICAgICBwcmludCAiKEhpbnQ6IHJpZ2h0LWNsaWNrIHRvIG9wZW4gbG9jYXRpb25zLikiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiTm8gaGl0cy4iCisKKyAgICBkZWYgZmluZGZpbGVzKHNlbGYsIGRpciwgYmFzZSwgcmVjKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpciBvciBvcy5jdXJkaXIpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgbXNnOgorICAgICAgICAgICAgcHJpbnQgbXNnCisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgbGlzdCA9IFtdCisgICAgICAgIHN1YmRpcnMgPSBbXQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKGRpciwgbmFtZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZm4pOgorICAgICAgICAgICAgICAgIHN1YmRpcnMuYXBwZW5kKGZuKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBmbm1hdGNoLmZubWF0Y2gobmFtZSwgYmFzZSk6CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKGZuKQorICAgICAgICBpZiByZWM6CisgICAgICAgICAgICBmb3Igc3ViZGlyIGluIHN1YmRpcnM6CisgICAgICAgICAgICAgICAgbGlzdC5leHRlbmQoc2VsZi5maW5kZmlsZXMoc3ViZGlyLCBiYXNlLCByZWMpKQorICAgICAgICByZXR1cm4gbGlzdAorCisgICAgZGVmIGNsb3NlKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLnRvcDoKKyAgICAgICAgICAgIHNlbGYudG9wLmdyYWJfcmVsZWFzZSgpCisgICAgICAgICAgICBzZWxmLnRvcC53aXRoZHJhdygpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvR3JlcERpYWxvZy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvR3JlcERpYWxvZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5YzFmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9HcmVwRGlhbG9nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvR3JlcERpYWxvZy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvR3JlcERpYWxvZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5YzFmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9HcmVwRGlhbG9nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvSElTVE9SWS50eHQgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSElTVE9SWS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkNzNlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ISVNUT1JZLnR4dApAQCAtMCwwICsxLDI5NiBAQAorSURMRSBIaXN0b3J5Cis9PT09PT09PT09PT0KKworVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSByZWxlYXNlIG1lc3NhZ2VzIGZvciBwcmV2aW91cyBJRExFIHJlbGVhc2VzLgorQXMgeW91IHJlYWQgb24geW91IGdvIGJhY2sgdG8gdGhlIGRhcmsgYWdlcyBvZiBJRExFJ3MgaGlzdG9yeS4KKworCitXaGF0J3MgTmV3IGluIElETEVmb3JrIDAuOC4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjItSnVsLTIwMDEqCisKKy0gTmV3IHRhcmJhbGwgcmVsZWFzZWQgYXMgYSByZXN1bHQgb2YgdGhlICdyZXZpdGFsaXNhdGlvbicgb2YgdGhlIElETEVmb3JrCisgIHByb2plY3QuIAorCistIFRoaXMgcmVsZWFzZSByZXF1aXJlcyBweXRob24gMi4xIG9yIGJldHRlci4gQ29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIKKyAgdmVyc2lvbnMgb2YgcHl0aG9uIChlc3BlY2lhbGx5IGFuY2llbnQgb25lcyBsaWtlIDEuNXgpIGlzIG5vIGxvbmdlciBhCisgIHByaW9yaXR5IGluIElETEVmb3JrIGRldmVsb3BtZW50LgorCistIFRoaXMgcmVsZWFzZSBpcyBiYXNlZCBvbiBhIG1lcmdpbmcgb2YgdGhlIGVhcmxpZXIgSURMRSBmb3JrIHdvcmsgd2l0aCBjdXJyZW50CisgIGN2cyBJRExFIChwb3N0IElETEUgdmVyc2lvbiAwLjgpLCB3aXRoIHNvbWUgbWlub3IgYWRkaXRpb25hbCBjb2RpbmcgYnkgS3VydAorICBCLiBLYWlzZXIgYW5kIFN0ZXBoZW4gTS4gR2F2YS4KKworLSBUaGlzIHJlbGVhc2UgaXMgYmFzaWNhbGx5IGZ1bmN0aW9uYWwgYnV0IGFsc28gY29udGFpbnMgc29tZSBrbm93biBicmVha2FnZXMsCisgIHBhcnRpY3VsYXJseSB3aXRoIHJ1bm5pbmcgdGhpbmdzIGZyb20gdGhlIHNoZWxsIHdpbmRvdy4gQWxzbyB0aGUgZGVidWdnZXIgaXMKKyAgbm90IHdvcmtpbmcsIGJ1dCBJIGJlbGlldmUgdGhpcyB3YXMgdGhlIGNhc2Ugd2l0aCB0aGUgcHJldmlvdXMgSURMRSBmb3JrCisgIHJlbGVhc2UgKDAuNy4xKSBhcyB3ZWxsLgorCistIFRoaXMgcmVsZWFzZSBpcyBiZWluZyBtYWRlIG5vdyB0byBtYXJrIHRoZSBwb2ludCBhdCB3aGljaCBJRExFZm9yayBpcyAKKyAgbGF1bmNoaW5nIGludG8gYSBuZXcgc3RhZ2Ugb2YgZGV2ZWxvcG1lbnQuIAorCistIElETEVmb3JrIENWUyB3aWxsIG5vdyBiZSBicmFuY2hlZCB0byBlbmFibGUgZnVydGhlciBkZXZlbG9wbWVudCBhbmQKKyAgZXhwbG9yYXRpb24gb2YgdGhlIHR3byAiZXhlY3V0aW9uIGluIGEgcmVtb3RlIHByb2Nlc3MiIHBhdGNoZXMgc3VibWl0dGVkIGJ5CisgIERhdmlkIFNjaGVyZXIgKERhdmlkJ3MgaXMgY3VycmVudGx5IGluIElETEVmb3JrKSBhbmQgR3ZSLCB3aGlsZSBzdGFiaWxpc2F0aW9uCisgIGFuZCBkZXZlbG9wbWVudCBvZiBsZXNzIGhlYXZ5d2VpZ2h0IGltcHJvdmVtZW50cyAobGlrZSB1c2VyIGN1c3RvbWlzYXRpb24pCisgIGNhbiBjb250aW51ZSBvbiB0aGUgdHJ1bmsuCisKKworV2hhdCdzIE5ldyBpbiBJRExFZm9yayAwLjcuMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAxNS1BdWctMjAwMCoKKworLSBGaXJzdCBwcm9qZWN0IHRhcmJhbGwgcmVsZWFzZWQuCisKKy0gVGhpcyB3YXMgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgSURMRSBmb3JrLCB3aGljaCBhdCB0aGlzIHN0YWdlIHdhcyBhCisgIGNvbWJpbmF0aW9uIG9mIElETEUgMC41IGFuZCB0aGUgVlB5dGhvbiBpZGxlIGZvcmssIHdpdGggYWRkaXRpb25hbCBjaGFuZ2VzCisgIGNvZGVkIGJ5IERhdmlkIFNjaGVyZXIsIFBldGVyIFNjaG5laWRlci1LYW1wIGFuZCBOaWNob2xhcyBSaWxleS4KKworCisKK0lETEVmb3JrIDAuNy4xIC0gMjkgTWF5IDIwMDAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIERhdmlkIFNjaGVyZXIgIDxkc2NoZXJlckBjbXUuZWR1PgorCistIFRoaXMgaXMgYSBtb2RpZmljYXRpb24gb2YgdGhlIENWUyB2ZXJzaW9uIG9mIElETEUgMC41LCB1cGRhdGVkIGFzIG9mCisgIDIwMDAtMDMtMDkuICBJdCBpcyBhbHBoYSBzb2Z0d2FyZSBhbmQgbWlnaHQgYmUgdW5zdGFibGUuICBJZiBpdCBicmVha3MsIHlvdQorICBnZXQgdG8ga2VlcCBib3RoIHBpZWNlcy4KKworLSBJZiB5b3UgaGF2ZSBwcm9ibGVtcyBvciBzdWdnZXN0aW9ucywgeW91IHNob3VsZCBlaXRoZXIgY29udGFjdCBtZSBvciBwb3N0IHRvCisgIHRoZSBsaXN0IGF0IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lkbGUtZGV2IChtYWtpbmcgaXQgY2xlYXIKKyAgdGhhdCB5b3UgYXJlIHVzaW5nIHRoaXMgbW9kaWZpZWQgdmVyc2lvbiBvZiBJRExFKS4KKworLSBDaGFuZ2VzOgorCisgIC0gVGhlIEV4ZWNCaW5kaW5nIG1vZHVsZSwgYSByZXBsYWNlbWVudCBmb3IgU2NyaXB0QmluZGluZywgZXhlY3V0ZXMgcHJvZ3JhbXMKKyAgICBpbiBhIHNlcGFyYXRlIHByb2Nlc3MsIHBpcGluZyBzdGFuZGFyZCBJL08gdGhyb3VnaCBhbiBSUEMgbWVjaGFuaXNtIHRvIGFuCisgICAgT25EZW1hbmRPdXRwdXRXaW5kb3cgaW4gSURMRS4gIEl0IHN1cHBvcnRzIGV4ZWN1dGluZyB1bm5hbWVkIHByb2dyYW1zCisgICAgKHRocm91Z2ggYSB0ZW1wb3JhcnkgZmlsZSkuICBJdCBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBkZWJ1Z2dpbmcuCisKKyAgLSBXaGVuIHJ1bm5pbmcgcHJvZ3JhbXMgd2l0aCBFeGVjQmluZGluZywgdHJhY2ViYWNrcyB3aWxsIGJlIGNsaXBwZWQgdG8KKyAgICBleGNsdWRlIHN5c3RlbSBtb2R1bGVzLiAgSWYsIGhvd2V2ZXIsIGEgc3lzdGVtIG1vZHVsZSBjYWxscyBiYWNrIGludG8gdGhlCisgICAgdXNlciBwcm9ncmFtLCB0aGF0IHBhcnQgb2YgdGhlIHRyYWNlYmFjayB3aWxsIGJlIHNob3duLgorCisgIC0gVGhlIE9uRGVtYW5kT3V0cHV0V2luZG93IGNsYXNzIGhhcyBiZWVuIGltcHJvdmVkLiAgSW4gcGFydGljdWxhciwgaXQgbm93CisgICAgc3VwcG9ydHMgYSByZWFkbGluZSgpIGZ1bmN0aW9uIHVzZWQgdG8gaW1wbGVtZW50IHVzZXIgaW5wdXQsIGFuZCBhCisgICAgc2Nyb2xsX2NsZWFyKCkgb3BlcmF0aW9uIHdoaWNoIGlzIHVzZWQgdG8gaGlkZSB0aGUgb3V0cHV0IG9mIGEgcHJldmlvdXMgcnVuCisgICAgYnkgc2Nyb2xsaW5nIGl0IG91dCBvZiB0aGUgd2luZG93LgorCisgIC0gU3RhcnR1cCBiZWhhdmlvciBoYXMgYmVlbiBjaGFuZ2VkLiAgQnkgZGVmYXVsdCBJRExFIHN0YXJ0cyB1cCB3aXRoIGp1c3QgYQorICAgIGJsYW5rIGVkaXRvciB3aW5kb3csIHJhdGhlciB0aGFuIGFuIGludGVyYWN0aXZlIHdpbmRvdy4gIE9wZW5pbmcgYSBmaWxlIGluCisgICAgc3VjaCBhIGJsYW5rIHdpbmRvdyByZXBsYWNlcyB0aGUgKG5vbmV4aXN0ZW50KSBjb250ZW50cyBvZiB0aGF0IHdpbmRvdworICAgIGluc3RlYWQgb2YgY3JlYXRpbmcgYW5vdGhlciB3aW5kb3cuICBCZWNhdXNlIG9mIHRoZSBuZWVkIHRvIGhhdmUgYQorICAgIHdlbGwta25vd24gcG9ydCBmb3IgdGhlIEV4ZWNCaW5kaW5nIHByb3RvY29sLCBvbmx5IG9uZSBjb3B5IG9mIElETEUgY2FuIGJlCisgICAgcnVubmluZy4gIEFkZGl0aW9uYWwgaW52b2NhdGlvbnMgdXNlIHRoZSBSUEMgbWVjaGFuaXNtIHRvIHJlcG9ydCB0aGVpcgorICAgIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gdGhlIGNvcHkgYWxyZWFkeSBydW5uaW5nLgorCisgIC0gVGhlIG1lbnVzIGhhdmUgYmVlbiByZW9yZ2FuaXplZC4gIEluIHBhcnRpY3VsYXIsIHRoZSBleGNlc3NpdmVseSBsYXJnZQorICAgICdlZGl0JyBtZW51IGhhcyBiZWVuIHNwbGl0IHVwIGludG8gJ2VkaXQnLCAnZm9ybWF0JywgYW5kICdydW4nLgorCisgIC0gJ1B5dGhvbiBEb2N1bWVudGF0aW9uJyBub3cgd29ya3Mgb24gV2luZG93cywgaWYgdGhlIHdpbjMyYXBpIG1vZHVsZSBpcworICAgIHByZXNlbnQuCisKKyAgLSBBIGZldyBrZXkgYmluZGluZ3MgaGF2ZSBiZWVuIGNoYW5nZWQ6IEYxIG5vdyBsb2FkcyBQeXRob24gRG9jdW1lbnRhdGlvbgorICAgIGluc3RlYWQgb2YgdGhlIElETEUgaGVscDsgc2hpZnQtVEFCIGlzIG5vdyBhIHN5bm9ueW0gZm9yIHVuaW5kZW50LgorCistIE5ldyBtb2R1bGVzOgorICAKKyAgRXhlY0JpbmRpbmcucHkgICAgICAgICBFeGVjdXRlcyBwcm9ncmFtIHRocm91Z2ggbG9hZGVyCisgIGxvYWRlci5weSAgICAgICAgICAgICAgQm9vdHN0cmFwcyB1c2VyIHByb2dyYW0KKyAgcHJvdG9jb2wucHkgICAgICAgICAgICBSUEMgcHJvdG9jb2wKKyAgUmVtb3RlLnB5ICAgICAgICAgICAgICBVc2VyLXByb2Nlc3MgaW50ZXJwcmV0ZXIKKyAgc3Bhd24ucHkgICAgICAgICAgICAgICBPUy1zcGVjaWZpYyBjb2RlIHRvIHN0YXJ0IHByb2dyYW1zCisKKy0gRmlsZXMgbW9kaWZpZWQ6CisKKyAgYXV0b2luZGVudC5weSAgICAgICAgICAoIGJpbmRpbmdzIHR3ZWFrZWQgKQorICBiaW5kaW5ncy5weSAgICAgICAgICAgICggbWVudXMgcmVvcmdhbml6ZWQgKQorICBjb25maWcudHh0ICAgICAgICAgICAgICggZXhlY2JpbmRpbmcgZW5hYmxlZCApCisgIGVkaXRvcndpbmRvdy5weSAgICAgICAgKCBuZXcgbWVudXMsIGZpeGVkICdQeXRob24gRG9jdW1lbnRhdGlvbicgKQorICBmaWxlbGlzdC5weSAgICAgICAgICAgICggaG9vayBmb3IgIm9wZW4gaW4gc2FtZSB3aW5kb3ciICkKKyAgZm9ybWF0cGFyYWdyYXBoLnB5ICAgICAoIGJpbmRpbmdzIHR3ZWFrZWQgKQorICBpZGxlLmJhdCAgICAgICAgICAgICAgICggcmVtb3ZlZCBhYnNvbHV0ZSBwYXRobmFtZSApCisgIGlkbGUucHl3ICAgICAgICAgICAgICAgKCB3ZWlyZCBidWcgZHVlIHRvIGltcG9ydCB3aXRoIHNhbWUgbmFtZT8gKQorICBpb2JpbmRpbmcucHkgICAgICAgICAgICggb3BlbiBpbiBzYW1lIHdpbmRvdywgRU9MIGNvbnZlbnRpb24gKQorICBrZXlkZWZzLnB5ICAgICAgICAgICAgICggYmluZGluZ3MgdHdlYWtlZCApCisgIG91dHB1dHdpbmRvdy5weSAgICAgICAgKCByZWFkbGluZSwgc2Nyb2xsX2NsZWFyLCBldGMgKQorICBweXNoZWxsLnB5ICAgICAgICAgICAgICggY2hhbmdlZCBzdGFydHVwIGJlaGF2aW9yICkKKyAgcmVhZG1lLnR4dCAgICAgICAgICAgICAoIDxSZWN1cnNpb24gb24gZmlsZSB3aXRoIGlkPTEyMzQ1Njc+ICkKKworCisKK0lETEUgMC41IC0gRmVicnVhcnkgMjAwMCAtIFJlbGVhc2UgTm90ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyBhbiBlYXJseSByZWxlYXNlIG9mIElETEUsIG15IG93biBhdHRlbXB0IGF0IGEgVGtpbnRlci1iYXNlZAorSURFIGZvciBQeXRob24uCisKKyhGb3IgYSBtb3JlIGRldGFpbGVkIGNoYW5nZSBsb2csIHNlZSB0aGUgZmlsZSBDaGFuZ2VMb2cuKQorCitGRUFUVVJFUworCitJRExFIGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOgorCistIGNvZGVkIGluIDEwMCUgcHVyZSBQeXRob24sIHVzaW5nIHRoZSBUa2ludGVyIEdVSSB0b29sa2l0IChpLmUuIFRjbC9UaykKKworLSBjcm9zcy1wbGF0Zm9ybTogd29ya3Mgb24gV2luZG93cyBhbmQgVW5peCAob24gdGhlIE1hYywgdGhlcmUgYXJlCitjdXJyZW50bHkgcHJvYmxlbXMgd2l0aCBUY2wvVGspCisKKy0gbXVsdGktd2luZG93IHRleHQgZWRpdG9yIHdpdGggbXVsdGlwbGUgdW5kbywgUHl0aG9uIGNvbG9yaXppbmcKK2FuZCBtYW55IG90aGVyIGZlYXR1cmVzLCBlLmcuIHNtYXJ0IGluZGVudCBhbmQgY2FsbCB0aXBzCisKKy0gUHl0aG9uIHNoZWxsIHdpbmRvdyAoYS5rLmEuIGludGVyYWN0aXZlIGludGVycHJldGVyKQorCistIGRlYnVnZ2VyIChub3QgY29tcGxldGUsIGJ1dCB5b3UgY2FuIHNldCBicmVha3BvaW50cywgdmlldyAgYW5kIHN0ZXApCisKK1VTQUdFCisKK1RoZSBtYWluIHByb2dyYW0gaXMgaW4gdGhlIGZpbGUgImlkbGUucHkiOyBvbiBVbml4LCB5b3Ugc2hvdWxkIGJlIGFibGUKK3RvIHJ1biBpdCBieSB0eXBpbmcgIi4vaWRsZS5weSIgdG8geW91ciBzaGVsbC4gIE9uIFdpbmRvd3MsIHlvdSBjYW4KK3J1biBpdCBieSBkb3VibGUtY2xpY2tpbmcgaXQ7IHlvdSBjYW4gdXNlIGlkbGUucHl3IHRvIGF2b2lkIHBvcHBpbmcgdXAKK2EgRE9TIGNvbnNvbGUuICBJZiB5b3Ugd2FudCB0byBwYXNzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgb24gV2luZG93cywKK3VzZSB0aGUgYmF0Y2ggZmlsZSBpZGxlLmJhdC4KKworQ29tbWFuZCBsaW5lIGFyZ3VtZW50czogZmlsZXMgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUgYXJlIGV4ZWN1dGVkLAorbm90IG9wZW5lZCBmb3IgZWRpdGluZywgdW5sZXNzIHlvdSBnaXZlIHRoZSAtZSBjb21tYW5kIGxpbmUgb3B0aW9uLgorVHJ5ICIuL2lkbGUucHkgLWgiIHRvIHNlZSBvdGhlciBjb21tYW5kIGxpbmUgb3B0aW9ucy4KKworSURMRSByZXF1aXJlcyBQeXRob24gMS41LjIsIHNvIGl0IGlzIGN1cnJlbnRseSBvbmx5IHVzYWJsZSB3aXRoIGEKK1B5dGhvbiAxLjUuMiBkaXN0cmlidXRpb24uICAoQW4gb2xkZXIgdmVyc2lvbiBvZiBJRExFIGlzIGRpc3RyaWJ1dGVkCit3aXRoIFB5dGhvbiAxLjUuMjsgeW91IGNhbiBkcm9wIHRoaXMgdmVyc2lvbiBvbiB0b3Agb2YgaXQuKQorCitDT1BZUklHSFQKKworSURMRSBpcyBjb3ZlcmVkIGJ5IHRoZSBzdGFuZGFyZCBQeXRob24gY29weXJpZ2h0IG5vdGljZQorKGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvQ29weXJpZ2h0Lmh0bWwpLgorCisKK05ldyBpbiBJRExFIDAuNSAoMi8xNS8yMDAwKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvbnMgb2Ygc3R1ZmYsIG11Y2ggb2YgaXQgY29udHJpYnV0ZWQgYnkgVGltIFBldGVycyBhbmQgTWFyayBIYW1tb25kOgorCistIFN0YXR1cyBiYXIsIGRpc3BsYXlpbmcgY3VycmVudCBsaW5lL2NvbHVtbiAoTW9zaGUgWmFka2EpLgorCistIEJldHRlciBzdGFjayB2aWV3ZXIsIHVzaW5nIHRyZWUgd2lkZ2V0LiAgKFhYWCBPbmx5IHVzZWQgYnkgU3RhY2sKK1ZpZXdlciBtZW51LCBub3QgYnkgdGhlIGRlYnVnZ2VyLikKKworLSBGb3JtYXQgcGFyYWdyYXBoIG5vdyByZWNvZ25pemVzIFB5dGhvbiBibG9jayBjb21tZW50cyBhbmQgcmVmb3JtYXRzCit0aGVtIGNvcnJlY3RseSAoTUgpCisKKy0gTmV3IHZlcnNpb24gb2YgcHljbGJyLnB5IHBhcnNlcyB0b3AtbGV2ZWwgZnVuY3Rpb25zIGFuZCB1bmRlcnN0YW5kcworbXVjaCBtb3JlIG9mIFB5dGhvbidzIHN5bnRheDsgdGhpcyBpcyByZWZsZWN0ZWQgaW4gdGhlIGNsYXNzIGFuZCBwYXRoCiticm93c2VycyAoVFApCisKKy0gTXVjaCBiZXR0ZXIgYXV0by1pbmRlbnQ7IGtub3dzIGhvdyB0byBpbmRlbnQgdGhlIGluc2lkZXMgb2YKK211bHRpLWxpbmUgc3RhdGVtZW50cyAoVFApCisKKy0gQ2FsbCB0aXAgd2luZG93IHBvcHMgdXAgd2hlbiB5b3UgdHlwZSB0aGUgbmFtZSBvZiBhIGtub3duIGZ1bmN0aW9uCitmb2xsb3dlZCBieSBhbiBvcGVuIHBhcmVudGhlc2lzLiAgSGl0IEVTQyBvciBjbGljayBlbHNld2hlcmUgaW4gdGhlCit3aW5kb3cgdG8gY2xvc2UgdGhlIHRpcCB3aW5kb3cgKE1IKQorCistIENvbW1lbnQgb3V0IHJlZ2lvbiBub3cgaW5zZXJ0cyAjIyB0byBtYWtlIGl0IHN0YW5kIG91dCBtb3JlIChUUCkKKworLSBOZXcgcGF0aCBhbmQgY2xhc3MgYnJvd3NlcnMgYmFzZWQgb24gYSB0cmVlIHdpZGdldCB0aGF0IGxvb2tzCitmYW1pbGlhciB0byBXaW5kb3dzIHVzZXJzCisKKy0gUmV3b3JrZWQgc2NyaXB0IHJ1bm5pbmcgY29tbWFuZHMgdG8gYmUgbW9yZSBpbnR1aXRpdmU6IEkvTyBub3cKK2Fsd2F5cyBnb2VzIHRvIHRoZSAqUHl0aG9uIFNoZWxsKiB3aW5kb3csIGFuZCByYXdfaW5wdXQoKSB3b3JrcworY29ycmVjdGx5LiAgWW91IHVzZSBGNSB0byBpbXBvcnQvcmVsb2FkIGEgbW9kdWxlOiB0aGlzIGFkZHMgdGhlIG1vZHVsZQorbmFtZSB0byB0aGUgX19tYWluX18gbmFtZXNwYWNlLiAgWW91IHVzZSBDb250cm9sLUY1IHRvIHJ1biBhIHNjcmlwdDoKK3RoaXMgcnVucyB0aGUgc2NyaXB0ICppbiogdGhlIF9fbWFpbl9fIG5hbWVzcGFjZS4gIFRoZSBsYXR0ZXIgYWxzbworc2V0cyBzeXMuYXJndltdIHRvIHRoZSBzY3JpcHQgbmFtZQorCisKK05ldyBpbiBJRExFIDAuNCAoNC83Lzk5KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01vc3QgaW1wb3J0YW50IGNoYW5nZTogYSBuZXcgbWVudSBlbnRyeSAiRmlsZSAtPiBQYXRoIGJyb3dzZXIiLCBzaG93cworYSA0LWNvbHVtbiBoaWVyYXJjaGljYWwgYnJvd3NlciB3aGljaCBsZXRzIHlvdSBicm93c2Ugc3lzLnBhdGgsCitkaXJlY3RvcmllcywgbW9kdWxlcywgYW5kIGNsYXNzZXMuICBZZXMsIGl0J3MgYSBzdXBlcnNldCBvZiB0aGUgQ2xhc3MKK2Jyb3dzZXIgbWVudSBlbnRyeS4gIFRoZXJlJ3MgYWxzbyBhIG5ldyBpbnRlcm5hbCBtb2R1bGUsCitNdWx0aVNjcm9sbGVkTGlzdHMucHksIHdoaWNoIHByb3ZpZGVzIHRoZSBmcmFtZXdvcmsgZm9yIHRoaXMgZGlhbG9nLgorCisKK05ldyBpbiBJRExFIDAuMyAoMi8xNy85OSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTW9zdCBpbXBvcnRhbnQgY2hhbmdlczoKKworLSBFbmFibGVkIHN1cHBvcnQgZm9yIHJ1bm5pbmcgYSBtb2R1bGUsIHdpdGggb3Igd2l0aG91dCB0aGUgZGVidWdnZXIuCitPdXRwdXQgZ29lcyB0byBhIG5ldyB3aW5kb3cuICBQcmVzc2luZyBGNSBpbiBhIG1vZHVsZSBpcyBlZmZlY3RpdmVseSBhCityZWxvYWQgb2YgdGhhdCBtb2R1bGU7IENvbnRyb2wtRjUgbG9hZHMgaXQgdW5kZXIgdGhlIGRlYnVnZ2VyLgorCistIFJlLWVuYWJsZSB0ZWFyaW5nIG9mZiB0aGUgV2luZG93cyBtZW51LCBhbmQgbWFrZSBhIHRvcm4tb2ZmIFdpbmRvd3MKK21lbnUgdXBkYXRlIGl0c2VsZiB3aGVuZXZlciBhIHdpbmRvdyBpcyBvcGVuZWQgb3IgY2xvc2VkLgorCistIE1lbnUgaXRlbXMgY2FuIG5vdyBiZSBoYXZlIGEgY2hlY2tib3ggKHdoZW4gdGhlIG1lbnUgbGFiZWwgc3RhcnRzCit3aXRoICIhIik7IHVzZSB0aGlzIGZvciB0aGUgRGVidWdnZXIgYW5kICJBdXRvLW9wZW4gc3RhY2sgdmlld2VyIgorKHdhczogSklUIHN0YWNrIHZpZXdlcikgbWVudSBpdGVtcy4KKworLSBBZGRlZCBhIFF1aXQgYnV0dG9uIHRvIHRoZSBEZWJ1Z2dlciBBUEkuCisKKy0gVGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIGV4cGxpY2l0bHkgaW5zZXJ0ZWQgaW50byBzeXMucGF0aC4KKworLSBGaXggdGhlIGRlYnVnZ2VyICh3aGVuIHVzaW5nIFB5dGhvbiAxLjUuMmIyKSB0byB1c2UgY2Fub25pY2FsCitmaWxlbmFtZXMgZm9yIGJyZWFrcG9pbnRzLCBzbyB0aGVzZSBhY3R1YWxseSB3b3JrLiAgKFRoZXJlJ3Mgc3RpbGwgYQorbG90IG9mIHdvcmsgdG8gYmUgZG9uZSB0byB0aGUgbWFuYWdlbWVudCBvZiBicmVha3BvaW50cyBpbiB0aGUKK2RlYnVnZ2VyIHRob3VnaC4pCisKKy0gQ2xvc2luZyBhIHdpbmRvdyB0aGF0IGlzIHN0aWxsIGNvbG9yaXppbmcgbm93IGFjdHVhbGx5IHdvcmtzLgorCistIEFsbG93IGRyYWdnaW5nIG9mIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiB0aGUgdHdvIGxpc3QgYm94ZXMgaW4gdGhlCitjbGFzcyBicm93c2VyLgorCistIEJpbmQgRVNDIHRvICJjbG9zZSB3aW5kb3ciIG9mIHRoZSBkZWJ1Z2dlciwgc3RhY2sgdmlld2VyIGFuZCBjbGFzcworYnJvd3Nlci4gIEl0IHJlbW92ZXMgdGhlIHNlbGVjdGlvbiBoaWdobGlnaHRpbmcgaW4gcmVndWxhciB0ZXh0Cit3aW5kb3dzLiAgKFRoZXNlIGFyZSBzdGFuZGFyZCBXaW5kb3dzIGNvbnZlbnRpb25zLikKKworCitOZXcgaW4gSURMRSAwLjIgKDEvOC85OSkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMb3RzIG9mIGNoYW5nZXM7IGhlcmUgYXJlIHRoZSBoaWdobGlnaHRzOgorCitHZW5lcmFsOgorCistIFlvdSBjYW4gbm93IHdyaXRlIGFuZCBjb25maWd1cmUgeW91ciBvd24gSURMRSBleHRlbnNpb24gbW9kdWxlczsgc2VlCitleHRlbmQudHh0LgorCisKK0ZpbGUgbWVudToKKworVGhlIGNvbW1hbmQgdG8gb3BlbiB0aGUgUHl0aG9uIHNoZWxsIHdpbmRvdyBpcyBub3cgaW4gdGhlIEZpbGUgbWVudS4KKworCitFZGl0IG1lbnU6CisKK05ldyBGaW5kIGRpYWxvZyB3aXRoIG1vcmUgb3B0aW9uczsgcmVwbGFjZSBkaWFsb2c7IGZpbmQgaW4gZmlsZXMgZGlhbG9nLgorCitDb21tYW5kcyB0byB0YWJpZnkgb3IgdW50YWJpZnkgYSByZWdpb24uCisKK0NvbW1hbmQgdG8gZm9ybWF0IGEgcGFyYWdyYXBoLgorCisKK0RlYnVnIG1lbnU6CisKK0pJVCAoSnVzdC1Jbi1UaW1lKSBzdGFjayB2aWV3ZXIgdG9nZ2xlIC0tIGlmIHNldCwgdGhlIHN0YWNrIHZpZXdlcgorYXV0b21hdGljYWxsIHBvcHMgdXAgd2hlbiB5b3UgZ2V0IGEgdHJhY2ViYWNrLgorCitXaW5kb3dzIG1lbnU6CisKK1pvb20gaGVpZ2h0IC0tIG1ha2UgdGhlIHdpbmRvdyBmdWxsIGhlaWdodC4KKworCitIZWxwIG1lbnU6CisKK1RoZSBoZWxwIHRleHQgbm93IHNob3cgdXAgaW4gYSByZWd1bGFyIHdpbmRvdyBzbyB5b3UgY2FuIHNlYXJjaCBhbmQKK2V2ZW4gZWRpdCBpdCBpZiB5b3UgbGlrZS4KKworCisKK0lETEUgMC4xIHdhcyBkaXN0cmlidXRlZCB3aXRoIHRoZSBQeXRob24gMS41LjJiMSByZWxlYXNlIG9uIDEyLzIyLzk4LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvSHlwZXJQYXJzZXIucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSHlwZXJQYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmNGIwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9IeXBlclBhcnNlci5weQpAQCAtMCwwICsxLDI0NiBAQAorIiIiCitIeXBlclBhcnNlcgorPT09PT09PT09PT0KK1RoaXMgbW9kdWxlIGRlZmluZXMgdGhlIEh5cGVyUGFyc2VyIGNsYXNzLCB3aGljaCBwcm92aWRlcyBhZHZhbmNlZCBwYXJzaW5nCithYmlsaXRpZXMgZm9yIHRoZSBQYXJlbk1hdGNoIGFuZCBvdGhlciBleHRlbnNpb25zLgorVGhlIEh5cGVyUGFyc2VyIHVzZXMgUHlQYXJzZXIuIFB5UGFyc2VyIGlzIGludGVuZGVkIG1vc3RseSB0byBnaXZlIGluZm9ybWF0aW9uCitvbiB0aGUgcHJvcGVyIGluZGVudGF0aW9uIG9mIGNvZGUuIEh5cGVyUGFyc2VyIGdpdmVzIHNvbWUgaW5mb3JtYXRpb24gb24gdGhlCitzdHJ1Y3R1cmUgb2YgY29kZSwgdXNlZCBieSBleHRlbnNpb25zIHRvIGhlbHAgdGhlIHVzZXIuCisiIiIKKworaW1wb3J0IHN0cmluZworaW1wb3J0IGtleXdvcmQKK2Zyb20gaWRsZWxpYiBpbXBvcnQgUHlQYXJzZQorCitjbGFzcyBIeXBlclBhcnNlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlZGl0d2luLCBpbmRleCk6CisgICAgICAgICIiIkluaXRpYWxpemUgdGhlIEh5cGVyUGFyc2VyIHRvIGFuYWx5emUgdGhlIHN1cnJvdW5kaW5ncyBvZiB0aGUgZ2l2ZW4KKyAgICAgICAgaW5kZXguCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYuZWRpdHdpbiA9IGVkaXR3aW4KKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dCA9IGVkaXR3aW4udGV4dAorCisgICAgICAgIHBhcnNlciA9IFB5UGFyc2UuUGFyc2VyKGVkaXR3aW4uaW5kZW50d2lkdGgsIGVkaXR3aW4udGFid2lkdGgpCisKKyAgICAgICAgZGVmIGluZGV4MmxpbmUoaW5kZXgpOgorICAgICAgICAgICAgcmV0dXJuIGludChmbG9hdChpbmRleCkpCisgICAgICAgIGxubyA9IGluZGV4MmxpbmUodGV4dC5pbmRleChpbmRleCkpCisKKyAgICAgICAgaWYgbm90IGVkaXR3aW4uY29udGV4dF91c2VfcHMxOgorICAgICAgICAgICAgZm9yIGNvbnRleHQgaW4gZWRpdHdpbi5udW1fY29udGV4dF9saW5lczoKKyAgICAgICAgICAgICAgICBzdGFydGF0ID0gbWF4KGxubyAtIGNvbnRleHQsIDEpCisgICAgICAgICAgICAgICAgc3RhcnRhdGluZGV4ID0gcmVwcihzdGFydGF0KSArICIuMCIKKyAgICAgICAgICAgICAgICBzdG9wYXRpbmRleCA9ICIlZC5lbmQiICUgbG5vCisgICAgICAgICAgICAgICAgIyBXZSBhZGQgdGhlIG5ld2xpbmUgYmVjYXVzZSBQeVBhcnNlIHJlcXVpcmVzIGEgbmV3bGluZSBhdCBlbmQuCisgICAgICAgICAgICAgICAgIyBXZSBhZGQgYSBzcGFjZSBzbyB0aGF0IGluZGV4IHdvbid0IGJlIGF0IGVuZCBvZiBsaW5lLCBzbyB0aGF0CisgICAgICAgICAgICAgICAgIyBpdHMgc3RhdHVzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGNoYXIgYmVmb3JlIGl0LCBpZiBzaG91bGQuCisgICAgICAgICAgICAgICAgcGFyc2VyLnNldF9zdHIodGV4dC5nZXQoc3RhcnRhdGluZGV4LCBzdG9wYXRpbmRleCkrJyBcbicpCisgICAgICAgICAgICAgICAgYm9kID0gcGFyc2VyLmZpbmRfZ29vZF9wYXJzZV9zdGFydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdHdpbi5fYnVpbGRfY2hhcl9pbl9zdHJpbmdfZnVuYyhzdGFydGF0aW5kZXgpKQorICAgICAgICAgICAgICAgIGlmIGJvZCBpcyBub3QgTm9uZSBvciBzdGFydGF0ID09IDE6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBwYXJzZXIuc2V0X2xvKGJvZCBvciAwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgciA9IHRleHQudGFnX3ByZXZyYW5nZSgiY29uc29sZSIsIGluZGV4KQorICAgICAgICAgICAgaWYgcjoKKyAgICAgICAgICAgICAgICBzdGFydGF0aW5kZXggPSByWzFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXJ0YXRpbmRleCA9ICIxLjAiCisgICAgICAgICAgICBzdG9wYXRpbmRleCA9ICIlZC5lbmQiICUgbG5vCisgICAgICAgICAgICAjIFdlIGFkZCB0aGUgbmV3bGluZSBiZWNhdXNlIFB5UGFyc2UgcmVxdWlyZXMgYSBuZXdsaW5lIGF0IGVuZC4KKyAgICAgICAgICAgICMgV2UgYWRkIGEgc3BhY2Ugc28gdGhhdCBpbmRleCB3b24ndCBiZSBhdCBlbmQgb2YgbGluZSwgc28gdGhhdAorICAgICAgICAgICAgIyBpdHMgc3RhdHVzIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIGNoYXIgYmVmb3JlIGl0LCBpZiBzaG91bGQuCisgICAgICAgICAgICBwYXJzZXIuc2V0X3N0cih0ZXh0LmdldChzdGFydGF0aW5kZXgsIHN0b3BhdGluZGV4KSsnIFxuJykKKyAgICAgICAgICAgIHBhcnNlci5zZXRfbG8oMCkKKworICAgICAgICAjIFdlIHdhbnQgd2hhdCB0aGUgcGFyc2VyIGhhcywgZXhjZXB0IGZvciB0aGUgbGFzdCBuZXdsaW5lIGFuZCBzcGFjZS4KKyAgICAgICAgc2VsZi5yYXd0ZXh0ID0gcGFyc2VyLnN0cls6LTJdCisgICAgICAgICMgQXMgZmFyIGFzIEkgY2FuIHNlZSwgcGFyc2VyLnN0ciBwcmVzZXJ2ZXMgdGhlIHN0YXRlbWVudCB3ZSBhcmUgaW4sCisgICAgICAgICMgc28gdGhhdCBzdG9wYXRpbmRleCBjYW4gYmUgdXNlZCB0byBzeW5jaHJvbml6ZSB0aGUgc3RyaW5nIHdpdGggdGhlCisgICAgICAgICMgdGV4dCBib3ggaW5kaWNlcy4KKyAgICAgICAgc2VsZi5zdG9wYXRpbmRleCA9IHN0b3BhdGluZGV4CisgICAgICAgIHNlbGYuYnJhY2tldGluZyA9IHBhcnNlci5nZXRfbGFzdF9zdG10X2JyYWNrZXRpbmcoKQorICAgICAgICAjIGZpbmQgd2hpY2ggcGFpcnMgb2YgYnJhY2tldGluZyBhcmUgb3BlbmVycy4gVGhlc2UgYWx3YXlzIGNvcnJlc3BvbmQKKyAgICAgICAgIyB0byBhIGNoYXJhY3RlciBvZiByYXd0ZXh0LgorICAgICAgICBzZWxmLmlzb3BlbmVyID0gW2k+MCBhbmQgc2VsZi5icmFja2V0aW5nW2ldWzFdID4gc2VsZi5icmFja2V0aW5nW2ktMV1bMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5icmFja2V0aW5nKSldCisKKyAgICAgICAgc2VsZi5zZXRfaW5kZXgoaW5kZXgpCisKKyAgICBkZWYgc2V0X2luZGV4KHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiU2V0IHRoZSBpbmRleCB0byB3aGljaCB0aGUgZnVuY3Rpb25zIHJlbGF0ZS4gTm90ZSB0aGF0IGl0IG11c3QgYmUKKyAgICAgICAgaW4gdGhlIHNhbWUgc3RhdGVtZW50LgorICAgICAgICAiIiIKKyAgICAgICAgaW5kZXhpbnJhd3RleHQgPSBcCisgICAgICAgICAgICBsZW4oc2VsZi5yYXd0ZXh0KSAtIGxlbihzZWxmLnRleHQuZ2V0KGluZGV4LCBzZWxmLnN0b3BhdGluZGV4KSkKKyAgICAgICAgaWYgaW5kZXhpbnJhd3RleHQgPCAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGhlIGluZGV4IGdpdmVuIGlzIGJlZm9yZSB0aGUgYW5hbHl6ZWQgc3RhdGVtZW50IikKKyAgICAgICAgc2VsZi5pbmRleGlucmF3dGV4dCA9IGluZGV4aW5yYXd0ZXh0CisgICAgICAgICMgZmluZCB0aGUgcmlnaHRtb3N0IGJyYWNrZXQgdG8gd2hpY2ggaW5kZXggYmVsb25ncworICAgICAgICBzZWxmLmluZGV4YnJhY2tldCA9IDAKKyAgICAgICAgd2hpbGUgc2VsZi5pbmRleGJyYWNrZXQgPCBsZW4oc2VsZi5icmFja2V0aW5nKS0xIGFuZCBcCisgICAgICAgICAgICAgIHNlbGYuYnJhY2tldGluZ1tzZWxmLmluZGV4YnJhY2tldCsxXVswXSA8IHNlbGYuaW5kZXhpbnJhd3RleHQ6CisgICAgICAgICAgICBzZWxmLmluZGV4YnJhY2tldCArPSAxCisgICAgICAgIGlmIHNlbGYuaW5kZXhicmFja2V0IDwgbGVuKHNlbGYuYnJhY2tldGluZyktMSBhbmQgXAorICAgICAgICAgICBzZWxmLmJyYWNrZXRpbmdbc2VsZi5pbmRleGJyYWNrZXQrMV1bMF0gPT0gc2VsZi5pbmRleGlucmF3dGV4dCBhbmQgXAorICAgICAgICAgICBub3Qgc2VsZi5pc29wZW5lcltzZWxmLmluZGV4YnJhY2tldCsxXToKKyAgICAgICAgICAgIHNlbGYuaW5kZXhicmFja2V0ICs9IDEKKworICAgIGRlZiBpc19pbl9zdHJpbmcoc2VsZik6CisgICAgICAgICIiIklzIHRoZSBpbmRleCBnaXZlbiB0byB0aGUgSHlwZXJQYXJzZXIgaXMgaW4gYSBzdHJpbmc/IiIiCisgICAgICAgICMgVGhlIGJyYWNrZXQgdG8gd2hpY2ggd2UgYmVsb25nIHNob3VsZCBiZSBhbiBvcGVuZXIuCisgICAgICAgICMgSWYgaXQncyBhbiBvcGVuZXIsIGl0IGhhcyB0byBoYXZlIGEgY2hhcmFjdGVyLgorICAgICAgICByZXR1cm4gc2VsZi5pc29wZW5lcltzZWxmLmluZGV4YnJhY2tldF0gYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYucmF3dGV4dFtzZWxmLmJyYWNrZXRpbmdbc2VsZi5pbmRleGJyYWNrZXRdWzBdXSBpbiAoJyInLCAiJyIpCisKKyAgICBkZWYgaXNfaW5fY29kZShzZWxmKToKKyAgICAgICAgIiIiSXMgdGhlIGluZGV4IGdpdmVuIHRvIHRoZSBIeXBlclBhcnNlciBpcyBpbiBhIG5vcm1hbCBjb2RlPyIiIgorICAgICAgICByZXR1cm4gbm90IHNlbGYuaXNvcGVuZXJbc2VsZi5pbmRleGJyYWNrZXRdIG9yIFwKKyAgICAgICAgICAgICAgIHNlbGYucmF3dGV4dFtzZWxmLmJyYWNrZXRpbmdbc2VsZi5pbmRleGJyYWNrZXRdWzBdXSBub3QgaW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnIycsICciJywgIiciKQorCisgICAgZGVmIGdldF9zdXJyb3VuZGluZ19icmFja2V0cyhzZWxmLCBvcGVuZXJzPScoW3snLCBtdXN0Y2xvc2U9RmFsc2UpOgorICAgICAgICAiIiJJZiB0aGUgaW5kZXggZ2l2ZW4gdG8gdGhlIEh5cGVyUGFyc2VyIGlzIHN1cnJvdW5kZWQgYnkgYSBicmFja2V0CisgICAgICAgIGRlZmluZWQgaW4gb3BlbmVycyAob3IgYXQgbGVhc3QgaGFzIG9uZSBiZWZvcmUgaXQpLCByZXR1cm4gdGhlCisgICAgICAgIGluZGljZXMgb2YgdGhlIG9wZW5pbmcgYnJhY2tldCBhbmQgdGhlIGNsb3NpbmcgYnJhY2tldCAob3IgdGhlCisgICAgICAgIGVuZCBvZiBsaW5lLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QpLgorICAgICAgICBJZiBpdCBpcyBub3Qgc3Vycm91bmRlZCBieSBicmFja2V0cywgb3IgdGhlIGVuZCBvZiBsaW5lIGNvbWVzIGJlZm9yZQorICAgICAgICB0aGUgY2xvc2luZyBicmFja2V0IGFuZCBtdXN0Y2xvc2UgaXMgVHJ1ZSwgcmV0dXJucyBOb25lLgorICAgICAgICAiIiIKKyAgICAgICAgYnJhY2tldGluZ2xldmVsID0gc2VsZi5icmFja2V0aW5nW3NlbGYuaW5kZXhicmFja2V0XVsxXQorICAgICAgICBiZWZvcmUgPSBzZWxmLmluZGV4YnJhY2tldAorICAgICAgICB3aGlsZSBub3Qgc2VsZi5pc29wZW5lcltiZWZvcmVdIG9yIFwKKyAgICAgICAgICAgICAgc2VsZi5yYXd0ZXh0W3NlbGYuYnJhY2tldGluZ1tiZWZvcmVdWzBdXSBub3QgaW4gb3BlbmVycyBvciBcCisgICAgICAgICAgICAgIHNlbGYuYnJhY2tldGluZ1tiZWZvcmVdWzFdID4gYnJhY2tldGluZ2xldmVsOgorICAgICAgICAgICAgYmVmb3JlIC09IDEKKyAgICAgICAgICAgIGlmIGJlZm9yZSA8IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGJyYWNrZXRpbmdsZXZlbCA9IG1pbihicmFja2V0aW5nbGV2ZWwsIHNlbGYuYnJhY2tldGluZ1tiZWZvcmVdWzFdKQorICAgICAgICBhZnRlciA9IHNlbGYuaW5kZXhicmFja2V0ICsgMQorICAgICAgICB3aGlsZSBhZnRlciA8IGxlbihzZWxmLmJyYWNrZXRpbmcpIGFuZCBcCisgICAgICAgICAgICAgIHNlbGYuYnJhY2tldGluZ1thZnRlcl1bMV0gPj0gYnJhY2tldGluZ2xldmVsOgorICAgICAgICAgICAgYWZ0ZXIgKz0gMQorCisgICAgICAgIGJlZm9yZWluZGV4ID0gc2VsZi50ZXh0LmluZGV4KCIlcy0lZGMiICUKKyAgICAgICAgICAgIChzZWxmLnN0b3BhdGluZGV4LCBsZW4oc2VsZi5yYXd0ZXh0KS1zZWxmLmJyYWNrZXRpbmdbYmVmb3JlXVswXSkpCisgICAgICAgIGlmIGFmdGVyID49IGxlbihzZWxmLmJyYWNrZXRpbmcpIG9yIFwKKyAgICAgICAgICAgc2VsZi5icmFja2V0aW5nW2FmdGVyXVswXSA+IGxlbihzZWxmLnJhd3RleHQpOgorICAgICAgICAgICAgaWYgbXVzdGNsb3NlOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBhZnRlcmluZGV4ID0gc2VsZi5zdG9wYXRpbmRleAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBXZSBhcmUgYWZ0ZXIgYSByZWFsIGNoYXIsIHNvIGl0IGlzIGEgJyknIGFuZCB3ZSBnaXZlIHRoZSBpbmRleAorICAgICAgICAgICAgIyBiZWZvcmUgaXQuCisgICAgICAgICAgICBhZnRlcmluZGV4ID0gc2VsZi50ZXh0LmluZGV4KCIlcy0lZGMiICUKKyAgICAgICAgICAgICAgICAoc2VsZi5zdG9wYXRpbmRleCwKKyAgICAgICAgICAgICAgICAgbGVuKHNlbGYucmF3dGV4dCktKHNlbGYuYnJhY2tldGluZ1thZnRlcl1bMF0tMSkpKQorCisgICAgICAgIHJldHVybiBiZWZvcmVpbmRleCwgYWZ0ZXJpbmRleAorCisgICAgIyBUaGlzIHN0cmluZyBpbmNsdWRlcyBhbGwgY2hhcnMgdGhhdCBtYXkgYmUgaW4gYSB3aGl0ZSBzcGFjZQorICAgIF93aGl0ZXNwYWNlX2NoYXJzID0gIiBcdFxuXFwiCisgICAgIyBUaGlzIHN0cmluZyBpbmNsdWRlcyBhbGwgY2hhcnMgdGhhdCBtYXkgYmUgaW4gYW4gaWRlbnRpZmllcgorICAgIF9pZF9jaGFycyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICJfIgorICAgICMgVGhpcyBzdHJpbmcgaW5jbHVkZXMgYWxsIGNoYXJzIHRoYXQgbWF5IGJlIHRoZSBmaXJzdCBjaGFyIG9mIGFuIGlkZW50aWZpZXIKKyAgICBfaWRfZmlyc3RfY2hhcnMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArICJfIgorCisgICAgIyBHaXZlbiBhIHN0cmluZyBhbmQgcG9zLCByZXR1cm4gdGhlIG51bWJlciBvZiBjaGFycyBpbiB0aGUgaWRlbnRpZmllcgorICAgICMgd2hpY2ggZW5kcyBhdCBwb3MsIG9yIDAgaWYgdGhlcmUgaXMgbm8gc3VjaCBvbmUuIFNhdmVkIHdvcmRzIGFyZSBub3QKKyAgICAjIGlkZW50aWZpZXJzLgorICAgIGRlZiBfZWF0X2lkZW50aWZpZXIoc2VsZiwgc3RyLCBsaW1pdCwgcG9zKToKKyAgICAgICAgaSA9IHBvcworICAgICAgICB3aGlsZSBpID4gbGltaXQgYW5kIHN0cltpLTFdIGluIHNlbGYuX2lkX2NoYXJzOgorICAgICAgICAgICAgaSAtPSAxCisgICAgICAgIGlmIGkgPCBwb3MgYW5kIChzdHJbaV0gbm90IGluIHNlbGYuX2lkX2ZpcnN0X2NoYXJzIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQuaXNrZXl3b3JkKHN0cltpOnBvc10pKToKKyAgICAgICAgICAgIGkgPSBwb3MKKyAgICAgICAgcmV0dXJuIHBvcyAtIGkKKworICAgIGRlZiBnZXRfZXhwcmVzc2lvbihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIFB5dGhvbiBleHByZXNzaW9uIHdoaWNoIGVuZHMgYXQgdGhlIGdpdmVuCisgICAgICAgIGluZGV4LCB3aGljaCBpcyBlbXB0eSBpZiB0aGVyZSBpcyBubyByZWFsIG9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLmlzX2luX2NvZGUoKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImdldF9leHByZXNzaW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBpbmRleCAiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgaW5zaWRlIGEgY29kZS4iKQorCisgICAgICAgIHJhd3RleHQgPSBzZWxmLnJhd3RleHQKKyAgICAgICAgYnJhY2tldGluZyA9IHNlbGYuYnJhY2tldGluZworCisgICAgICAgIGJyY2tfaW5kZXggPSBzZWxmLmluZGV4YnJhY2tldAorICAgICAgICBicmNrX2xpbWl0ID0gYnJhY2tldGluZ1ticmNrX2luZGV4XVswXQorICAgICAgICBwb3MgPSBzZWxmLmluZGV4aW5yYXd0ZXh0CisKKyAgICAgICAgbGFzdF9pZGVudGlmaWVyX3BvcyA9IHBvcworICAgICAgICBwb3N0ZG90X3BoYXNlID0gVHJ1ZQorCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAjIEVhdCB3aGl0ZXNwYWNlcywgY29tbWVudHMsIGFuZCBpZiBwb3N0ZG90X3BoYXNlIGlzIEZhbHNlIC0gb25lIGRvdAorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBpZiBwb3M+YnJja19saW1pdCBhbmQgcmF3dGV4dFtwb3MtMV0gaW4gc2VsZi5fd2hpdGVzcGFjZV9jaGFyczoKKyAgICAgICAgICAgICAgICAgICAgIyBFYXQgYSB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgICAgIHBvcyAtPSAxCisgICAgICAgICAgICAgICAgZWxpZiBub3QgcG9zdGRvdF9waGFzZSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgcG9zID4gYnJja19saW1pdCBhbmQgcmF3dGV4dFtwb3MtMV0gPT0gJy4nOgorICAgICAgICAgICAgICAgICAgICAjIEVhdCBhIGRvdAorICAgICAgICAgICAgICAgICAgICBwb3MgLT0gMQorICAgICAgICAgICAgICAgICAgICBwb3N0ZG90X3BoYXNlID0gVHJ1ZQorICAgICAgICAgICAgICAgICMgVGhlIG5leHQgbGluZSB3aWxsIGZhaWwgaWYgd2UgYXJlICppbnNpZGUqIGEgY29tbWVudCwgYnV0IHdlCisgICAgICAgICAgICAgICAgIyBzaG91bGRuJ3QgYmUuCisgICAgICAgICAgICAgICAgZWxpZiBwb3MgPT0gYnJja19saW1pdCBhbmQgYnJja19pbmRleCA+IDAgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgIHJhd3RleHRbYnJhY2tldGluZ1ticmNrX2luZGV4LTFdWzBdXSA9PSAnIyc6CisgICAgICAgICAgICAgICAgICAgICMgRWF0IGEgY29tbWVudAorICAgICAgICAgICAgICAgICAgICBicmNrX2luZGV4IC09IDIKKyAgICAgICAgICAgICAgICAgICAgYnJja19saW1pdCA9IGJyYWNrZXRpbmdbYnJja19pbmRleF1bMF0KKyAgICAgICAgICAgICAgICAgICAgcG9zID0gYnJhY2tldGluZ1ticmNrX2luZGV4KzFdWzBdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBJZiB3ZSBkaWRuJ3QgZWF0IGFueXRoaW5nLCBxdWl0LgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBpZiBub3QgcG9zdGRvdF9waGFzZToKKyAgICAgICAgICAgICAgICAjIFdlIGRpZG4ndCBmaW5kIGEgZG90LCBzbyB0aGUgZXhwcmVzc2lvbiBlbmQgYXQgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAjIGlkZW50aWZpZXIgcG9zLgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIHJldCA9IHNlbGYuX2VhdF9pZGVudGlmaWVyKHJhd3RleHQsIGJyY2tfbGltaXQsIHBvcykKKyAgICAgICAgICAgIGlmIHJldDoKKyAgICAgICAgICAgICAgICAjIFRoZXJlIGlzIGFuIGlkZW50aWZpZXIgdG8gZWF0CisgICAgICAgICAgICAgICAgcG9zID0gcG9zIC0gcmV0CisgICAgICAgICAgICAgICAgbGFzdF9pZGVudGlmaWVyX3BvcyA9IHBvcworICAgICAgICAgICAgICAgICMgTm93LCBpbiBvcmRlciB0byBjb250aW51ZSB0aGUgc2VhcmNoLCB3ZSBtdXN0IGZpbmQgYSBkb3QuCisgICAgICAgICAgICAgICAgcG9zdGRvdF9waGFzZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgIyAodGhlIGxvb3AgY29udGludWVzIG5vdykKKworICAgICAgICAgICAgZWxpZiBwb3MgPT0gYnJja19saW1pdDoKKyAgICAgICAgICAgICAgICAjIFdlIGFyZSBhdCBhIGJyYWNrZXRpbmcgbGltaXQuIElmIGl0IGlzIGEgY2xvc2luZyBicmFja2V0LAorICAgICAgICAgICAgICAgICMgZWF0IHRoZSBicmFja2V0LCBvdGhlcndpc2UsIHN0b3AgdGhlIHNlYXJjaC4KKyAgICAgICAgICAgICAgICBsZXZlbCA9IGJyYWNrZXRpbmdbYnJja19pbmRleF1bMV0KKyAgICAgICAgICAgICAgICB3aGlsZSBicmNrX2luZGV4ID4gMCBhbmQgYnJhY2tldGluZ1ticmNrX2luZGV4LTFdWzFdID4gbGV2ZWw6CisgICAgICAgICAgICAgICAgICAgIGJyY2tfaW5kZXggLT0gMQorICAgICAgICAgICAgICAgIGlmIGJyYWNrZXRpbmdbYnJja19pbmRleF1bMF0gPT0gYnJja19saW1pdDoKKyAgICAgICAgICAgICAgICAgICAgIyBXZSB3ZXJlIG5vdCBhdCB0aGUgZW5kIG9mIGEgY2xvc2luZyBicmFja2V0CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcG9zID0gYnJhY2tldGluZ1ticmNrX2luZGV4XVswXQorICAgICAgICAgICAgICAgIGJyY2tfaW5kZXggLT0gMQorICAgICAgICAgICAgICAgIGJyY2tfbGltaXQgPSBicmFja2V0aW5nW2JyY2tfaW5kZXhdWzBdCisgICAgICAgICAgICAgICAgbGFzdF9pZGVudGlmaWVyX3BvcyA9IHBvcworICAgICAgICAgICAgICAgIGlmIHJhd3RleHRbcG9zXSBpbiAiKFsiOgorICAgICAgICAgICAgICAgICAgICAjIFtdIGFuZCAoKSBtYXkgYmUgdXNlZCBhZnRlciBhbiBpZGVudGlmaWVyLCBzbyB3ZQorICAgICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlLiBwb3N0ZG90X3BoYXNlIGlzIFRydWUsIHNvIHdlIGRvbid0IGFsbG93IGEgZG90LgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBXZSBjYW4ndCBjb250aW51ZSBhZnRlciBvdGhlciB0eXBlcyBvZiBicmFja2V0cworICAgICAgICAgICAgICAgICAgICBpZiByYXd0ZXh0W3Bvc10gaW4gIidcIiI6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFNjYW4gYSBzdHJpbmcgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBwb3MgPiAwIGFuZCByYXd0ZXh0W3BvcyAtIDFdIGluICJyUmJCdVUiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyAtPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X2lkZW50aWZpZXJfcG9zID0gcG9zCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBXZSd2ZSBmb3VuZCBhbiBvcGVyYXRvciBvciBzb21ldGhpbmcuCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICByZXR1cm4gcmF3dGV4dFtsYXN0X2lkZW50aWZpZXJfcG9zOnNlbGYuaW5kZXhpbnJhd3RleHRdCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvSHlwZXJQYXJzZXIucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0h5cGVyUGFyc2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGRiM2YxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0h5cGVyUGFyc2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvSHlwZXJQYXJzZXIucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0h5cGVyUGFyc2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGRiM2YxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0h5cGVyUGFyc2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvSU9CaW5kaW5nLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lPQmluZGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDc4YzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lPQmluZGluZy5weQpAQCAtMCwwICsxLDU5OSBAQAorIyBjaGFuZ2VzIGJ5IGRzY2hlcmVyQGNtdS5lZHUKKyMgICAtIElPQmluZGluZy5vcGVuKCkgcmVwbGFjZXMgdGhlIGN1cnJlbnQgd2luZG93IHdpdGggdGhlIG9wZW5lZCBmaWxlLAorIyAgICAgaWYgdGhlIGN1cnJlbnQgd2luZG93IGlzIGJvdGggdW5tb2RpZmllZCBhbmQgdW5uYW1lZAorIyAgIC0gSU9CaW5kaW5nLmxvYWRmaWxlKCkgaW50ZXJwcmV0cyBXaW5kb3dzLCBVTklYLCBhbmQgTWFjaW50b3NoCisjICAgICBlbmQtb2YtbGluZSBjb252ZW50aW9ucywgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LAorIyAgICAgd2hpY2ggd2lsbCBvbmx5IHVuZGVyc3RhbmQgdGhlIGxvY2FsIGNvbnZlbnRpb24uCisKK2ltcG9ydCBvcworaW1wb3J0IHR5cGVzCitpbXBvcnQgcGlwZXMKK2ltcG9ydCBzeXMKK2ltcG9ydCBjb2RlY3MKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRrRmlsZURpYWxvZworaW1wb3J0IHRrTWVzc2FnZUJveAoraW1wb3J0IHJlCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKK2Zyb20gU2ltcGxlRGlhbG9nIGltcG9ydCBTaW1wbGVEaWFsb2cKKworZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCisKK3RyeToKKyAgICBmcm9tIGNvZGVjcyBpbXBvcnQgQk9NX1VURjgKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIG9ubHkgYXZhaWxhYmxlIHNpbmNlIFB5dGhvbiAyLjMKKyAgICBCT01fVVRGOCA9ICdceGVmXHhiYlx4YmYnCisKKyMgVHJ5IHNldHRpbmcgdGhlIGxvY2FsZSwgc28gdGhhdCB3ZSBjYW4gZmluZCBvdXQKKyMgd2hhdCBlbmNvZGluZyB0byB1c2UKK3RyeToKKyAgICBpbXBvcnQgbG9jYWxlCisgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQ1RZUEUsICIiKQorZXhjZXB0IChJbXBvcnRFcnJvciwgbG9jYWxlLkVycm9yKToKKyAgICBwYXNzCisKKyMgRW5jb2RpbmcgZm9yIGZpbGUgbmFtZXMKK2ZpbGVzeXN0ZW1lbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorCitlbmNvZGluZyA9ICJhc2NpaSIKK2lmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICMgT24gV2luZG93cywgd2UgY291bGQgdXNlICJtYmNzIi4gSG93ZXZlciwgdG8gZ2l2ZSB0aGUgdXNlcgorICAgICMgYSBwb3J0YWJsZSBlbmNvZGluZyBuYW1lLCB3ZSBuZWVkIHRvIGZpbmQgdGhlIGNvZGUgcGFnZQorICAgIHRyeToKKyAgICAgICAgZW5jb2RpbmcgPSBsb2NhbGUuZ2V0ZGVmYXVsdGxvY2FsZSgpWzFdCisgICAgICAgIGNvZGVjcy5sb29rdXAoZW5jb2RpbmcpCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICBwYXNzCitlbHNlOgorICAgIHRyeToKKyAgICAgICAgIyBEaWZmZXJlbnQgdGhpbmdzIGNhbiBmYWlsIGhlcmU6IHRoZSBsb2NhbGUgbW9kdWxlIG1heSBub3QgYmUKKyAgICAgICAgIyBsb2FkZWQsIGl0IG1heSBub3Qgb2ZmZXIgbmxfbGFuZ2luZm8sIG9yIENPREVTRVQsIG9yIHRoZQorICAgICAgICAjIHJlc3VsdGluZyBjb2Rlc2V0IG1heSBiZSB1bmtub3duIHRvIFB5dGhvbi4gV2UgaWdub3JlIGFsbAorICAgICAgICAjIHRoZXNlIHByb2JsZW1zLCBmYWxsaW5nIGJhY2sgdG8gQVNDSUkKKyAgICAgICAgZW5jb2RpbmcgPSBsb2NhbGUubmxfbGFuZ2luZm8obG9jYWxlLkNPREVTRVQpCisgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmUgb3IgZW5jb2RpbmcgaXMgJyc6CisgICAgICAgICAgICAjIHNpdHVhdGlvbiBvY2N1cnMgb24gTWFjIE9TIFgKKyAgICAgICAgICAgIGVuY29kaW5nID0gJ2FzY2lpJworICAgICAgICBjb2RlY3MubG9va3VwKGVuY29kaW5nKQorICAgIGV4Y2VwdCAoTmFtZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgTG9va3VwRXJyb3IpOgorICAgICAgICAjIFRyeSBnZXRkZWZhdWx0bG9jYWxlIHdlbGw6IGl0IHBhcnNlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMsCisgICAgICAgICMgd2hpY2ggbWF5IGdpdmUgYSBjbHVlLiBVbmZvcnR1bmF0ZWx5LCBnZXRkZWZhdWx0bG9jYWxlIGhhcworICAgICAgICAjIGJ1Z3MgdGhhdCBjYW4gY2F1c2UgVmFsdWVFcnJvci4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW5jb2RpbmcgPSBsb2NhbGUuZ2V0ZGVmYXVsdGxvY2FsZSgpWzFdCisgICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBOb25lIG9yIGVuY29kaW5nIGlzICcnOgorICAgICAgICAgICAgICAgICMgc2l0dWF0aW9uIG9jY3VycyBvbiBNYWMgT1MgWAorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gJ2FzY2lpJworICAgICAgICAgICAgY29kZWNzLmxvb2t1cChlbmNvZGluZykKKyAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBMb29rdXBFcnJvcik6CisgICAgICAgICAgICBwYXNzCisKK2VuY29kaW5nID0gZW5jb2RpbmcubG93ZXIoKQorCitjb2RpbmdfcmUgPSByZS5jb21waWxlKCJjb2RpbmdbOj1dXHMqKFstXHdfLl0rKSIpCisKK2NsYXNzIEVuY29kaW5nTWVzc2FnZShTaW1wbGVEaWFsb2cpOgorICAgICJJbmZvcm0gdXNlciB0aGF0IGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uIGlzIG5lZWRlZC4iCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgZW5jKToKKyAgICAgICAgc2VsZi5zaG91bGRfZWRpdCA9IEZhbHNlCisKKyAgICAgICAgc2VsZi5yb290ID0gdG9wID0gVG9wbGV2ZWwobWFzdGVyKQorICAgICAgICB0b3AuYmluZCgiPFJldHVybj4iLCBzZWxmLnJldHVybl9ldmVudCkKKyAgICAgICAgdG9wLmJpbmQoIjxFc2NhcGU+Iiwgc2VsZi5kb19vaykKKyAgICAgICAgdG9wLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi53bV9kZWxldGVfd2luZG93KQorICAgICAgICB0b3Aud21fdGl0bGUoIkkvTyBXYXJuaW5nIikKKyAgICAgICAgdG9wLndtX2ljb25uYW1lKCJJL08gV2FybmluZyIpCisgICAgICAgIHNlbGYudG9wID0gdG9wCisKKyAgICAgICAgbDEgPSBMYWJlbCh0b3AsCisgICAgICAgICAgICB0ZXh0PSJOb24tQVNDSUkgZm91bmQsIHlldCBubyBlbmNvZGluZyBkZWNsYXJlZC4gQWRkIGEgbGluZSBsaWtlIikKKyAgICAgICAgbDEucGFjayhzaWRlPVRPUCwgYW5jaG9yPVcpCisgICAgICAgIGwyID0gRW50cnkodG9wLCBmb250PSJjb3VyaWVyIikKKyAgICAgICAgbDIuaW5zZXJ0KDAsICIjIC0qLSBjb2Rpbmc6ICVzIC0qLSIgJSBlbmMpCisgICAgICAgICMgRm9yIHNvbWUgcmVhc29uLCB0aGUgdGV4dCBpcyBub3Qgc2VsZWN0YWJsZSBhbnltb3JlIGlmIHRoZQorICAgICAgICAjIHdpZGdldCBpcyBkaXNhYmxlZC4KKyAgICAgICAgIyBsMlsnc3RhdGUnXSA9IERJU0FCTEVECisgICAgICAgIGwyLnBhY2soc2lkZT1UT1AsIGFuY2hvciA9IFcsIGZpbGw9WCkKKyAgICAgICAgbDMgPSBMYWJlbCh0b3AsIHRleHQ9InRvIHlvdXIgZmlsZVxuIgorICAgICAgICAgICAgICAgICAgICJDaG9vc2UgT0sgdG8gc2F2ZSB0aGlzIGZpbGUgYXMgJXNcbiIKKyAgICAgICAgICAgICAgICAgICAiRWRpdCB5b3VyIGdlbmVyYWwgb3B0aW9ucyB0byBzaWxlbmNlIHRoaXMgd2FybmluZyIgJSBlbmMpCisgICAgICAgIGwzLnBhY2soc2lkZT1UT1AsIGFuY2hvciA9IFcpCisKKyAgICAgICAgYnV0dG9ucyA9IEZyYW1lKHRvcCkKKyAgICAgICAgYnV0dG9ucy5wYWNrKHNpZGU9VE9QLCBmaWxsPVgpCisgICAgICAgICMgQm90aCByZXR1cm4gYW5kIGNhbmNlbCBtZWFuIHRoZSBzYW1lIHRoaW5nOiBkbyBub3RoaW5nCisgICAgICAgIHNlbGYuZGVmYXVsdCA9IHNlbGYuY2FuY2VsID0gMAorICAgICAgICBiMSA9IEJ1dHRvbihidXR0b25zLCB0ZXh0PSJPayIsIGRlZmF1bHQ9ImFjdGl2ZSIsCisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5kb19vaykKKyAgICAgICAgYjEucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCwgZXhwYW5kPTEpCisgICAgICAgIGIyID0gQnV0dG9uKGJ1dHRvbnMsIHRleHQ9IkVkaXQgbXkgZmlsZSIsCisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5kb19lZGl0KQorICAgICAgICBiMi5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RILCBleHBhbmQ9MSkKKworICAgICAgICBzZWxmLl9zZXRfdHJhbnNpZW50KG1hc3RlcikKKworICAgIGRlZiBkb19vayhzZWxmKToKKyAgICAgICAgc2VsZi5kb25lKDApCisKKyAgICBkZWYgZG9fZWRpdChzZWxmKToKKyAgICAgICAgc2VsZi5kb25lKDEpCisKK2RlZiBjb2Rpbmdfc3BlYyhzdHIpOgorICAgICIiIlJldHVybiB0aGUgZW5jb2RpbmcgZGVjbGFyYXRpb24gYWNjb3JkaW5nIHRvIFBFUCAyNjMuCisKKyAgICBSYWlzZSBMb29rdXBFcnJvciBpZiB0aGUgZW5jb2RpbmcgaXMgZGVjbGFyZWQgYnV0IHVua25vd24uCisgICAgIiIiCisgICAgIyBPbmx5IGNvbnNpZGVyIHRoZSBmaXJzdCB0d28gbGluZXMKKyAgICBzdHIgPSBzdHIuc3BsaXQoIlxuIilbOjJdCisgICAgc3RyID0gIlxuIi5qb2luKHN0cikKKworICAgIG1hdGNoID0gY29kaW5nX3JlLnNlYXJjaChzdHIpCisgICAgaWYgbm90IG1hdGNoOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIG5hbWUgPSBtYXRjaC5ncm91cCgxKQorICAgICMgQ2hlY2sgd2hldGhlciB0aGUgZW5jb2RpbmcgaXMga25vd24KKyAgICBpbXBvcnQgY29kZWNzCisgICAgdHJ5OgorICAgICAgICBjb2RlY3MubG9va3VwKG5hbWUpCisgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAjIFRoZSBzdGFuZGFyZCBlbmNvZGluZyBlcnJvciBkb2VzIG5vdCBpbmRpY2F0ZSB0aGUgZW5jb2RpbmcKKyAgICAgICAgcmFpc2UgTG9va3VwRXJyb3IsICJVbmtub3duIGVuY29kaW5nICIrbmFtZQorICAgIHJldHVybiBuYW1lCisKKworY2xhc3MgSU9CaW5kaW5nOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVkaXR3aW4pOgorICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCisgICAgICAgIHNlbGYudGV4dCA9IGVkaXR3aW4udGV4dAorICAgICAgICBzZWxmLl9faWRfb3BlbiA9IHNlbGYudGV4dC5iaW5kKCI8PG9wZW4td2luZG93LWZyb20tZmlsZT4+Iiwgc2VsZi5vcGVuKQorICAgICAgICBzZWxmLl9faWRfc2F2ZSA9IHNlbGYudGV4dC5iaW5kKCI8PHNhdmUtd2luZG93Pj4iLCBzZWxmLnNhdmUpCisgICAgICAgIHNlbGYuX19pZF9zYXZlYXMgPSBzZWxmLnRleHQuYmluZCgiPDxzYXZlLXdpbmRvdy1hcy1maWxlPj4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zYXZlX2FzKQorICAgICAgICBzZWxmLl9faWRfc2F2ZWNvcHkgPSBzZWxmLnRleHQuYmluZCgiPDxzYXZlLWNvcHktb2Ytd2luZG93LWFzLWZpbGU+PiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2F2ZV9hX2NvcHkpCisgICAgICAgIHNlbGYuZmlsZWVuY29kaW5nID0gTm9uZQorICAgICAgICBzZWxmLl9faWRfcHJpbnQgPSBzZWxmLnRleHQuYmluZCgiPDxwcmludC13aW5kb3c+PiIsIHNlbGYucHJpbnRfd2luZG93KQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAjIFVuZG8gY29tbWFuZCBiaW5kaW5ncworICAgICAgICBzZWxmLnRleHQudW5iaW5kKCI8PG9wZW4td2luZG93LWZyb20tZmlsZT4+Iiwgc2VsZi5fX2lkX29wZW4pCisgICAgICAgIHNlbGYudGV4dC51bmJpbmQoIjw8c2F2ZS13aW5kb3c+PiIsIHNlbGYuX19pZF9zYXZlKQorICAgICAgICBzZWxmLnRleHQudW5iaW5kKCI8PHNhdmUtd2luZG93LWFzLWZpbGU+PiIsc2VsZi5fX2lkX3NhdmVhcykKKyAgICAgICAgc2VsZi50ZXh0LnVuYmluZCgiPDxzYXZlLWNvcHktb2Ytd2luZG93LWFzLWZpbGU+PiIsIHNlbGYuX19pZF9zYXZlY29weSkKKyAgICAgICAgc2VsZi50ZXh0LnVuYmluZCgiPDxwcmludC13aW5kb3c+PiIsIHNlbGYuX19pZF9wcmludCkKKyAgICAgICAgIyBCcmVhayBjeWNsZXMKKyAgICAgICAgc2VsZi5lZGl0d2luID0gTm9uZQorICAgICAgICBzZWxmLnRleHQgPSBOb25lCisgICAgICAgIHNlbGYuZmlsZW5hbWVfY2hhbmdlX2hvb2sgPSBOb25lCisKKyAgICBkZWYgZ2V0X3NhdmVkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lZGl0d2luLmdldF9zYXZlZCgpCisKKyAgICBkZWYgc2V0X3NhdmVkKHNlbGYsIGZsYWcpOgorICAgICAgICBzZWxmLmVkaXR3aW4uc2V0X3NhdmVkKGZsYWcpCisKKyAgICBkZWYgcmVzZXRfdW5kbyhzZWxmKToKKyAgICAgICAgc2VsZi5lZGl0d2luLnJlc2V0X3VuZG8oKQorCisgICAgZmlsZW5hbWVfY2hhbmdlX2hvb2sgPSBOb25lCisKKyAgICBkZWYgc2V0X2ZpbGVuYW1lX2NoYW5nZV9ob29rKHNlbGYsIGhvb2spOgorICAgICAgICBzZWxmLmZpbGVuYW1lX2NoYW5nZV9ob29rID0gaG9vaworCisgICAgZmlsZW5hbWUgPSBOb25lCisgICAgZGlybmFtZSA9IE5vbmUKKworICAgIGRlZiBzZXRfZmlsZW5hbWUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBpZiBmaWxlbmFtZSBhbmQgb3MucGF0aC5pc2RpcihmaWxlbmFtZSk6CisgICAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gTm9uZQorICAgICAgICAgICAgc2VsZi5kaXJuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICAgICAgc2VsZi5kaXJuYW1lID0gTm9uZQorICAgICAgICAgICAgc2VsZi5zZXRfc2F2ZWQoMSkKKyAgICAgICAgICAgIGlmIHNlbGYuZmlsZW5hbWVfY2hhbmdlX2hvb2s6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZV9jaGFuZ2VfaG9vaygpCisKKyAgICBkZWYgb3BlbihzZWxmLCBldmVudD1Ob25lLCBlZGl0RmlsZT1Ob25lKToKKyAgICAgICAgZmxpc3QgPSBzZWxmLmVkaXR3aW4uZmxpc3QKKyAgICAgICAgIyBTYXZlIGluIGNhc2UgcGFyZW50IHdpbmRvdyBpcyBjbG9zZWQgKGllLCBkdXJpbmcgYXNrb3BlbmZpbGUoKSkuCisgICAgICAgIGlmIGZsaXN0OgorICAgICAgICAgICAgaWYgbm90IGVkaXRGaWxlOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5hc2tvcGVuZmlsZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lPWVkaXRGaWxlCisgICAgICAgICAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgICAgICAgICAjIElmIGVkaXRGaWxlIGlzIHZhbGlkIGFuZCBhbHJlYWR5IG9wZW4sIGZsaXN0Lm9wZW4gd2lsbAorICAgICAgICAgICAgICAgICMgc2hpZnQgZm9jdXMgdG8gaXRzIGV4aXN0aW5nIHdpbmRvdy4KKyAgICAgICAgICAgICAgICAjIElmIHRoZSBjdXJyZW50IHdpbmRvdyBleGlzdHMgYW5kIGlzIGEgZnJlc2ggdW5uYW1lZCwKKyAgICAgICAgICAgICAgICAjIHVubW9kaWZpZWQgZWRpdG9yIHdpbmRvdyAobm90IGFuIGludGVycHJldGVyIHNoZWxsKSwKKyAgICAgICAgICAgICAgICAjIHBhc3Mgc2VsZi5sb2FkZmlsZSB0byBmbGlzdC5vcGVuIHNvIGl0IHdpbGwgbG9hZCB0aGUgZmlsZQorICAgICAgICAgICAgICAgICMgaW4gdGhlIGN1cnJlbnQgd2luZG93IChpZiB0aGUgZmlsZSBpcyBub3QgYWxyZWFkeSBvcGVuKQorICAgICAgICAgICAgICAgICMgaW5zdGVhZCBvZiBhIG5ldyB3aW5kb3cuCisgICAgICAgICAgICAgICAgaWYgKHNlbGYuZWRpdHdpbiBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBnZXRhdHRyKHNlbGYuZWRpdHdpbiwgJ2ludGVycCcsIE5vbmUpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgbm90IHNlbGYuZmlsZW5hbWUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9zYXZlZCgpKToKKyAgICAgICAgICAgICAgICAgICAgZmxpc3Qub3BlbihmaWxlbmFtZSwgc2VsZi5sb2FkZmlsZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmbGlzdC5vcGVuKGZpbGVuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnRleHQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dC5mb2N1c19zZXQoKQorICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgICAgICAjIENvZGUgZm9yIHVzZSBvdXRzaWRlIElETEU6CisgICAgICAgIGlmIHNlbGYuZ2V0X3NhdmVkKCk6CisgICAgICAgICAgICByZXBseSA9IHNlbGYubWF5YmVzYXZlKCkKKyAgICAgICAgICAgIGlmIHJlcGx5ID09ICJjYW5jZWwiOgorICAgICAgICAgICAgICAgIHNlbGYudGV4dC5mb2N1c19zZXQoKQorICAgICAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIGlmIG5vdCBlZGl0RmlsZToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5hc2tvcGVuZmlsZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlbmFtZT1lZGl0RmlsZQorICAgICAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgICAgIHNlbGYubG9hZGZpbGUoZmlsZW5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRleHQuZm9jdXNfc2V0KCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGVvbCA9IHIiKFxyXG4pfFxufFxyIiAgIyBcclxuIChXaW5kb3dzKSwgXG4gKFVOSVgpLCBvciBcciAoTWFjKQorICAgIGVvbF9yZSA9IHJlLmNvbXBpbGUoZW9sKQorICAgIGVvbF9jb252ZW50aW9uID0gb3MubGluZXNlcCAjIERlZmF1bHQKKworICAgIGRlZiBsb2FkZmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgb3BlbiB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZSBzbyB0aGF0IHdlIGNhbiBoYW5kbGUKKyAgICAgICAgICAgICMgICBlbmQtb2YtbGluZSBjb252ZW50aW9uIG91cnNlbHZlcy4KKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCdyYicpCisgICAgICAgICAgICBjaGFycyA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIkkvTyBFcnJvciIsIHN0cihtc2cpLCBtYXN0ZXI9c2VsZi50ZXh0KQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgY2hhcnMgPSBzZWxmLmRlY29kZShjaGFycykKKyAgICAgICAgIyBXZSBub3cgY29udmVydCBhbGwgZW5kLW9mLWxpbmVzIHRvICdcbidzCisgICAgICAgIGZpcnN0ZW9sID0gc2VsZi5lb2xfcmUuc2VhcmNoKGNoYXJzKQorICAgICAgICBpZiBmaXJzdGVvbDoKKyAgICAgICAgICAgIHNlbGYuZW9sX2NvbnZlbnRpb24gPSBmaXJzdGVvbC5ncm91cCgwKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmVvbF9jb252ZW50aW9uLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSBpdCBpcyBhbiBBU0NJSSBzdHJpbmcKKyAgICAgICAgICAgICAgICBzZWxmLmVvbF9jb252ZW50aW9uID0gc2VsZi5lb2xfY29udmVudGlvbi5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgICAgIGNoYXJzID0gc2VsZi5lb2xfcmUuc3ViKHIiXG4iLCBjaGFycykKKworICAgICAgICBzZWxmLnRleHQuZGVsZXRlKCIxLjAiLCAiZW5kIikKKyAgICAgICAgc2VsZi5zZXRfZmlsZW5hbWUoTm9uZSkKKyAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgiMS4wIiwgY2hhcnMpCisgICAgICAgIHNlbGYucmVzZXRfdW5kbygpCisgICAgICAgIHNlbGYuc2V0X2ZpbGVuYW1lKGZpbGVuYW1lKQorICAgICAgICBzZWxmLnRleHQubWFya19zZXQoImluc2VydCIsICIxLjAiKQorICAgICAgICBzZWxmLnRleHQueXZpZXcoImluc2VydCIpCisgICAgICAgIHNlbGYudXBkYXRlcmVjZW50ZmlsZXNsaXN0KGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRlY29kZShzZWxmLCBjaGFycyk6CisgICAgICAgICIiIkNyZWF0ZSBhIFVuaWNvZGUgc3RyaW5nCisKKyAgICAgICAgSWYgdGhhdCBmYWlscywgbGV0IFRjbCB0cnkgaXRzIGJlc3QKKyAgICAgICAgIiIiCisgICAgICAgICMgQ2hlY2sgcHJlc2VuY2Ugb2YgYSBVVEYtOCBzaWduYXR1cmUgZmlyc3QKKyAgICAgICAgaWYgY2hhcnMuc3RhcnRzd2l0aChCT01fVVRGOCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2hhcnMgPSBjaGFyc1szOl0uZGVjb2RlKCJ1dGYtOCIpCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgICAgICMgaGFzIFVURi04IHNpZ25hdHVyZSwgYnV0IGZhaWxzIHRvIGRlY29kZS4uLgorICAgICAgICAgICAgICAgIHJldHVybiBjaGFycworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEluZGljYXRlcyB0aGF0IHRoaXMgZmlsZSBvcmlnaW5hbGx5IGhhZCBhIEJPTQorICAgICAgICAgICAgICAgIHNlbGYuZmlsZWVuY29kaW5nID0gQk9NX1VURjgKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhcnMKKyAgICAgICAgIyBOZXh0IGxvb2sgZm9yIGNvZGluZyBzcGVjaWZpY2F0aW9uCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVuYyA9IGNvZGluZ19zcGVjKGNoYXJzKQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3IsIG5hbWU6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKAorICAgICAgICAgICAgICAgIHRpdGxlPSJFcnJvciBsb2FkaW5nIHRoZSBmaWxlIiwKKyAgICAgICAgICAgICAgICBtZXNzYWdlPSJUaGUgZW5jb2RpbmcgJyVzJyBpcyBub3Qga25vd24gdG8gdGhpcyBQeXRob24gIlwKKyAgICAgICAgICAgICAgICAiaW5zdGFsbGF0aW9uLiBUaGUgZmlsZSBtYXkgbm90IGRpc3BsYXkgY29ycmVjdGx5IiAlIG5hbWUsCisgICAgICAgICAgICAgICAgbWFzdGVyID0gc2VsZi50ZXh0KQorICAgICAgICAgICAgZW5jID0gTm9uZQorICAgICAgICBpZiBlbmM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUoY2hhcnMsIGVuYykKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAjIElmIGl0IGlzIEFTQ0lJLCB3ZSBuZWVkIG5vdCB0byByZWNvcmQgYW55dGhpbmcKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUoY2hhcnMsICdhc2NpaScpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgRmluYWxseSwgdHJ5IHRoZSBsb2NhbGUncyBlbmNvZGluZy4gVGhpcyBpcyBkZXByZWNhdGVkOworICAgICAgICAjIHRoZSB1c2VyIHNob3VsZCBkZWNsYXJlIGEgbm9uLUFTQ0lJIGVuY29kaW5nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNoYXJzID0gdW5pY29kZShjaGFycywgZW5jb2RpbmcpCisgICAgICAgICAgICBzZWxmLmZpbGVlbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBjaGFycworCisgICAgZGVmIG1heWJlc2F2ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5nZXRfc2F2ZWQoKToKKyAgICAgICAgICAgIHJldHVybiAieWVzIgorICAgICAgICBtZXNzYWdlID0gIkRvIHlvdSB3YW50IHRvIHNhdmUgJXMgYmVmb3JlIGNsb3Npbmc/IiAlICgKKyAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgb3IgInRoaXMgdW50aXRsZWQgZG9jdW1lbnQiKQorICAgICAgICBjb25maXJtID0gdGtNZXNzYWdlQm94LmFza3llc25vY2FuY2VsKAorICAgICAgICAgICAgICAgICAgdGl0bGU9IlNhdmUgT24gQ2xvc2UiLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZT1tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgZGVmYXVsdD10a01lc3NhZ2VCb3guWUVTLAorICAgICAgICAgICAgICAgICAgbWFzdGVyPXNlbGYudGV4dCkKKyAgICAgICAgaWYgY29uZmlybToKKyAgICAgICAgICAgIHJlcGx5ID0gInllcyIKKyAgICAgICAgICAgIHNlbGYuc2F2ZShOb25lKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZ2V0X3NhdmVkKCk6CisgICAgICAgICAgICAgICAgcmVwbHkgPSAiY2FuY2VsIgorICAgICAgICBlbGlmIGNvbmZpcm0gaXMgTm9uZToKKyAgICAgICAgICAgIHJlcGx5ID0gImNhbmNlbCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlcGx5ID0gIm5vIgorICAgICAgICBzZWxmLnRleHQuZm9jdXNfc2V0KCkKKyAgICAgICAgcmV0dXJuIHJlcGx5CisKKyAgICBkZWYgc2F2ZShzZWxmLCBldmVudCk6CisgICAgICAgIGlmIG5vdCBzZWxmLmZpbGVuYW1lOgorICAgICAgICAgICAgc2VsZi5zYXZlX2FzKGV2ZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi53cml0ZWZpbGUoc2VsZi5maWxlbmFtZSk6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRfc2F2ZWQoVHJ1ZSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdHdpbi5zdG9yZV9maWxlX2JyZWFrcygpCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiAgIyBtYXkgYmUgYSBQeVNoZWxsCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi50ZXh0LmZvY3VzX3NldCgpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgc2F2ZV9hcyhzZWxmLCBldmVudCk6CisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5hc2tzYXZlZmlsZSgpCisgICAgICAgIGlmIGZpbGVuYW1lOgorICAgICAgICAgICAgaWYgc2VsZi53cml0ZWZpbGUoZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0X2ZpbGVuYW1lKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuc2V0X3NhdmVkKDEpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXR3aW4uc3RvcmVfZmlsZV9icmVha3MoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLnRleHQuZm9jdXNfc2V0KCkKKyAgICAgICAgc2VsZi51cGRhdGVyZWNlbnRmaWxlc2xpc3QoZmlsZW5hbWUpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgc2F2ZV9hX2NvcHkoc2VsZiwgZXZlbnQpOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuYXNrc2F2ZWZpbGUoKQorICAgICAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgICAgIHNlbGYud3JpdGVmaWxlKGZpbGVuYW1lKQorICAgICAgICBzZWxmLnRleHQuZm9jdXNfc2V0KCkKKyAgICAgICAgc2VsZi51cGRhdGVyZWNlbnRmaWxlc2xpc3QoZmlsZW5hbWUpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgd3JpdGVmaWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5maXhsYXN0bGluZSgpCisgICAgICAgIGNoYXJzID0gc2VsZi5lbmNvZGUoc2VsZi50ZXh0LmdldCgiMS4wIiwgImVuZC0xYyIpKQorICAgICAgICBpZiBzZWxmLmVvbF9jb252ZW50aW9uICE9ICJcbiI6CisgICAgICAgICAgICBjaGFycyA9IGNoYXJzLnJlcGxhY2UoIlxuIiwgc2VsZi5lb2xfY29udmVudGlvbikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3YiIpCisgICAgICAgICAgICBmLndyaXRlKGNoYXJzKQorICAgICAgICAgICAgZi5mbHVzaCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJJL08gRXJyb3IiLCBzdHIobXNnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyPXNlbGYudGV4dCkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGVuY29kZShzZWxmLCBjaGFycyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoY2hhcnMsIHR5cGVzLlN0cmluZ1R5cGUpOgorICAgICAgICAgICAgIyBUaGlzIGlzIGVpdGhlciBwbGFpbiBBU0NJSSwgb3IgVGsgd2FzIHJldHVybmluZyBtaXhlZC1lbmNvZGluZworICAgICAgICAgICAgIyB0ZXh0IHRvIHVzLiBEb24ndCB0cnkgdG8gZ3Vlc3MgZnVydGhlci4KKyAgICAgICAgICAgIHJldHVybiBjaGFycworICAgICAgICAjIFNlZSB3aGV0aGVyIHRoZXJlIGlzIGFueXRoaW5nIG5vbi1BU0NJSSBpbiBpdC4KKyAgICAgICAgIyBJZiBub3QsIG5vIG5lZWQgdG8gZmlndXJlIG91dCB0aGUgZW5jb2RpbmcuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBjaGFycy5lbmNvZGUoJ2FzY2lpJykKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBJZiB0aGVyZSBpcyBhbiBlbmNvZGluZyBkZWNsYXJlZCwgdHJ5IHRoaXMgZmlyc3QuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVuYyA9IGNvZGluZ19zcGVjKGNoYXJzKQorICAgICAgICAgICAgZmFpbGVkID0gTm9uZQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIGZhaWxlZCA9IG1zZworICAgICAgICAgICAgZW5jID0gTm9uZQorICAgICAgICBpZiBlbmM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJzLmVuY29kZShlbmMpCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgICAgIGZhaWxlZCA9ICJJbnZhbGlkIGVuY29kaW5nICclcyciICUgZW5jCisgICAgICAgIGlmIGZhaWxlZDoKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoCisgICAgICAgICAgICAgICAgIkkvTyBFcnJvciIsCisgICAgICAgICAgICAgICAgIiVzLiBTYXZpbmcgYXMgVVRGLTgiICUgZmFpbGVkLAorICAgICAgICAgICAgICAgIG1hc3RlciA9IHNlbGYudGV4dCkKKyAgICAgICAgIyBJZiB0aGVyZSB3YXMgYSBVVEYtOCBzaWduYXR1cmUsIHVzZSB0aGF0LiBUaGlzIHNob3VsZCBub3QgZmFpbAorICAgICAgICBpZiBzZWxmLmZpbGVlbmNvZGluZyA9PSBCT01fVVRGOCBvciBmYWlsZWQ6CisgICAgICAgICAgICByZXR1cm4gQk9NX1VURjggKyBjaGFycy5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgIyBUcnkgdGhlIG9yaWdpbmFsIGZpbGUgZW5jb2RpbmcgbmV4dCwgaWYgYW55CisgICAgICAgIGlmIHNlbGYuZmlsZWVuY29kaW5nOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBjaGFycy5lbmNvZGUoc2VsZi5maWxlZW5jb2RpbmcpCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJJL08gRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHNhdmUgdGhpcyBhcyAnJXMnIGFueW1vcmUuIFNhdmluZyBhcyBVVEYtOCIgXAorICAgICAgICAgICAgICAgICAgICAlIHNlbGYuZmlsZWVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICBtYXN0ZXIgPSBzZWxmLnRleHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJPTV9VVEY4ICsgY2hhcnMuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgICMgTm90aGluZyB3YXMgZGVjbGFyZWQsIGFuZCB3ZSBoYWQgbm90IGRldGVybWluZWQgYW4gZW5jb2RpbmcKKyAgICAgICAgIyBvbiBsb2FkaW5nLiBSZWNvbW1lbmQgYW4gZW5jb2RpbmcgbGluZS4KKyAgICAgICAgY29uZmlnX2VuY29kaW5nID0gaWRsZUNvbmYuR2V0T3B0aW9uKCJtYWluIiwiRWRpdG9yV2luZG93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGluZyIpCisgICAgICAgIGlmIGNvbmZpZ19lbmNvZGluZyA9PSAndXRmLTgnOgorICAgICAgICAgICAgIyBVc2VyIGhhcyByZXF1ZXN0ZWQgdGhhdCB3ZSBzYXZlIGZpbGVzIGFzIFVURi04CisgICAgICAgICAgICByZXR1cm4gQk9NX1VURjggKyBjaGFycy5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgYXNrX3VzZXIgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNoYXJzID0gY2hhcnMuZW5jb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgZW5jID0gZW5jb2RpbmcKKyAgICAgICAgICAgIGlmIGNvbmZpZ19lbmNvZGluZyA9PSAnbG9jYWxlJzoKKyAgICAgICAgICAgICAgICBhc2tfdXNlciA9IEZhbHNlCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICBjaGFycyA9IEJPTV9VVEY4ICsgY2hhcnMuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgICAgICBlbmMgPSAidXRmLTgiCisgICAgICAgIGlmIG5vdCBhc2tfdXNlcjoKKyAgICAgICAgICAgIHJldHVybiBjaGFycworICAgICAgICBkaWFsb2cgPSBFbmNvZGluZ01lc3NhZ2Uoc2VsZi5lZGl0d2luLnRvcCwgZW5jKQorICAgICAgICBkaWFsb2cuZ28oKQorICAgICAgICBpZiBkaWFsb2cubnVtID09IDE6CisgICAgICAgICAgICAjIFVzZXIgYXNrZWQgdXMgdG8gZWRpdCB0aGUgZmlsZQorICAgICAgICAgICAgZW5jbGluZSA9ICIjIC0qLSBjb2Rpbmc6ICVzIC0qLVxuIiAlIGVuYworICAgICAgICAgICAgZmlyc3RsaW5lID0gc2VsZi50ZXh0LmdldCgiMS4wIiwgIjIuMCIpCisgICAgICAgICAgICBpZiBmaXJzdGxpbmUuc3RhcnRzd2l0aCgiIyEiKToKKyAgICAgICAgICAgICAgICAjIEluc2VydCBlbmNvZGluZyBhZnRlciAjISBsaW5lCisgICAgICAgICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgiMi4wIiwgZW5jbGluZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgiMS4wIiwgZW5jbGluZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmVuY29kZShzZWxmLnRleHQuZ2V0KCIxLjAiLCAiZW5kLTFjIikpCisgICAgICAgIHJldHVybiBjaGFycworCisgICAgZGVmIGZpeGxhc3RsaW5lKHNlbGYpOgorICAgICAgICBjID0gc2VsZi50ZXh0LmdldCgiZW5kLTJjIikKKyAgICAgICAgaWYgYyAhPSAnXG4nOgorICAgICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgiZW5kLTFjIiwgIlxuIikKKworICAgIGRlZiBwcmludF93aW5kb3coc2VsZiwgZXZlbnQpOgorICAgICAgICBjb25maXJtID0gdGtNZXNzYWdlQm94LmFza29rY2FuY2VsKAorICAgICAgICAgICAgICAgICAgdGl0bGU9IlByaW50IiwKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9IlByaW50IHRvIERlZmF1bHQgUHJpbnRlciIsCisgICAgICAgICAgICAgICAgICBkZWZhdWx0PXRrTWVzc2FnZUJveC5PSywKKyAgICAgICAgICAgICAgICAgIG1hc3Rlcj1zZWxmLnRleHQpCisgICAgICAgIGlmIG5vdCBjb25maXJtOgorICAgICAgICAgICAgc2VsZi50ZXh0LmZvY3VzX3NldCgpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICB0ZW1wZmlsZW5hbWUgPSBOb25lCisgICAgICAgIHNhdmVkID0gc2VsZi5nZXRfc2F2ZWQoKQorICAgICAgICBpZiBzYXZlZDoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5maWxlbmFtZQorICAgICAgICAjIHNoZWxsIHVuZG8gaXMgcmVzZXQgYWZ0ZXIgZXZlcnkgcHJvbXB0LCBsb29rcyBzYXZlZCwgcHJvYmFibHkgaXNuJ3QKKyAgICAgICAgaWYgbm90IHNhdmVkIG9yIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAodGZkLCB0ZW1wZmlsZW5hbWUpID0gdGVtcGZpbGUubWtzdGVtcChwcmVmaXg9J0lETEVfdG1wXycpCisgICAgICAgICAgICBmaWxlbmFtZSA9IHRlbXBmaWxlbmFtZQorICAgICAgICAgICAgb3MuY2xvc2UodGZkKQorICAgICAgICAgICAgaWYgbm90IHNlbGYud3JpdGVmaWxlKHRlbXBmaWxlbmFtZSk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHRlbXBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICBwbGF0Zm9ybSA9IG9zLm5hbWUKKyAgICAgICAgcHJpbnRQbGF0Zm9ybSA9IFRydWUKKyAgICAgICAgaWYgcGxhdGZvcm0gPT0gJ3Bvc2l4JzogI3Bvc2l4IHBsYXRmb3JtCisgICAgICAgICAgICBjb21tYW5kID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnR2VuZXJhbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcmludC1jb21tYW5kLXBvc2l4JykKKyAgICAgICAgICAgIGNvbW1hbmQgPSBjb21tYW5kICsgIiAyPiYxIgorICAgICAgICBlbGlmIHBsYXRmb3JtID09ICdudCc6ICN3aW4zMiBwbGF0Zm9ybQorICAgICAgICAgICAgY29tbWFuZCA9IGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0dlbmVyYWwnLCdwcmludC1jb21tYW5kLXdpbicpCisgICAgICAgIGVsc2U6ICNubyBwcmludGluZyBmb3IgdGhpcyBwbGF0Zm9ybQorICAgICAgICAgICAgcHJpbnRQbGF0Zm9ybSA9IEZhbHNlCisgICAgICAgIGlmIHByaW50UGxhdGZvcm06ICAjd2UgY2FuIHRyeSB0byBwcmludCBmb3IgdGhpcyBwbGF0Zm9ybQorICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQgJSBwaXBlcy5xdW90ZShmaWxlbmFtZSkKKyAgICAgICAgICAgIHBpcGUgPSBvcy5wb3Blbihjb21tYW5kLCAiciIpCisgICAgICAgICAgICAjIHRoaW5ncyBjYW4gZ2V0IHVnbHkgb24gTlQgaWYgdGhlcmUgaXMgbm8gcHJpbnRlciBhdmFpbGFibGUuCisgICAgICAgICAgICBvdXRwdXQgPSBwaXBlLnJlYWQoKS5zdHJpcCgpCisgICAgICAgICAgICBzdGF0dXMgPSBwaXBlLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHN0YXR1czoKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSAiUHJpbnRpbmcgZmFpbGVkIChleGl0IHN0YXR1cyAweCV4KVxuIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgKyBvdXRwdXQKKyAgICAgICAgICAgIGlmIG91dHB1dDoKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSAiUHJpbnRpbmcgY29tbWFuZDogJXNcbiIgJSByZXByKGNvbW1hbmQpICsgb3V0cHV0CisgICAgICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiUHJpbnQgc3RhdHVzIiwgb3V0cHV0LCBtYXN0ZXI9c2VsZi50ZXh0KQorICAgICAgICBlbHNlOiAgI25vIHByaW50aW5nIGZvciB0aGlzIHBsYXRmb3JtCisgICAgICAgICAgICBtZXNzYWdlID0gIlByaW50aW5nIGlzIG5vdCBlbmFibGVkIGZvciB0aGlzIHBsYXRmb3JtOiAlcyIgJSBwbGF0Zm9ybQorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dpbmZvKCJQcmludCBzdGF0dXMiLCBtZXNzYWdlLCBtYXN0ZXI9c2VsZi50ZXh0KQorICAgICAgICBpZiB0ZW1wZmlsZW5hbWU6CisgICAgICAgICAgICBvcy51bmxpbmsodGVtcGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgb3BlbmRpYWxvZyA9IE5vbmUKKyAgICBzYXZlZGlhbG9nID0gTm9uZQorCisgICAgZmlsZXR5cGVzID0gWworICAgICAgICAoIlB5dGhvbiBmaWxlcyIsICIqLnB5ICoucHl3IiwgIlRFWFQiKSwKKyAgICAgICAgKCJUZXh0IGZpbGVzIiwgIioudHh0IiwgIlRFWFQiKSwKKyAgICAgICAgKCJBbGwgZmlsZXMiLCAiKiIpLAorICAgICAgICBdCisKKyAgICBkZWYgYXNrb3BlbmZpbGUoc2VsZik6CisgICAgICAgIGRpciwgYmFzZSA9IHNlbGYuZGVmYXVsdGZpbGVuYW1lKCJvcGVuIikKKyAgICAgICAgaWYgbm90IHNlbGYub3BlbmRpYWxvZzoKKyAgICAgICAgICAgIHNlbGYub3BlbmRpYWxvZyA9IHRrRmlsZURpYWxvZy5PcGVuKG1hc3Rlcj1zZWxmLnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxldHlwZXM9c2VsZi5maWxldHlwZXMpCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5vcGVuZGlhbG9nLnNob3coaW5pdGlhbGRpcj1kaXIsIGluaXRpYWxmaWxlPWJhc2UpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIHVuaWNvZGUpOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5lbmNvZGUoZmlsZXN5c3RlbWVuY29kaW5nKQorICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBkZWZhdWx0ZmlsZW5hbWUoc2VsZiwgbW9kZT0ib3BlbiIpOgorICAgICAgICBpZiBzZWxmLmZpbGVuYW1lOgorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguc3BsaXQoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZWxpZiBzZWxmLmRpcm5hbWU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXJuYW1lLCAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHB3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcHdkID0gIiIKKyAgICAgICAgICAgIHJldHVybiBwd2QsICIiCisKKyAgICBkZWYgYXNrc2F2ZWZpbGUoc2VsZik6CisgICAgICAgIGRpciwgYmFzZSA9IHNlbGYuZGVmYXVsdGZpbGVuYW1lKCJzYXZlIikKKyAgICAgICAgaWYgbm90IHNlbGYuc2F2ZWRpYWxvZzoKKyAgICAgICAgICAgIHNlbGYuc2F2ZWRpYWxvZyA9IHRrRmlsZURpYWxvZy5TYXZlQXMobWFzdGVyPXNlbGYudGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZXR5cGVzPXNlbGYuZmlsZXR5cGVzKQorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuc2F2ZWRpYWxvZy5zaG93KGluaXRpYWxkaXI9ZGlyLCBpbml0aWFsZmlsZT1iYXNlKQorICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCB1bmljb2RlKToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuZW5jb2RlKGZpbGVzeXN0ZW1lbmNvZGluZykKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisKKyAgICBkZWYgdXBkYXRlcmVjZW50ZmlsZXNsaXN0KHNlbGYsZmlsZW5hbWUpOgorICAgICAgICAiVXBkYXRlIHJlY2VudCBmaWxlIGxpc3Qgb24gYWxsIGVkaXRvciB3aW5kb3dzIgorICAgICAgICBzZWxmLmVkaXR3aW4udXBkYXRlX3JlY2VudF9maWxlc19saXN0KGZpbGVuYW1lKQorCitkZWYgdGVzdCgpOgorICAgIHJvb3QgPSBUaygpCisgICAgY2xhc3MgTXlFZGl0V2luOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCk6CisgICAgICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CisgICAgICAgICAgICBzZWxmLmZsaXN0ID0gTm9uZQorICAgICAgICAgICAgc2VsZi50ZXh0LmJpbmQoIjxDb250cm9sLW8+Iiwgc2VsZi5vcGVuKQorICAgICAgICAgICAgc2VsZi50ZXh0LmJpbmQoIjxDb250cm9sLXM+Iiwgc2VsZi5zYXZlKQorICAgICAgICAgICAgc2VsZi50ZXh0LmJpbmQoIjxBbHQtcz4iLCBzZWxmLnNhdmVfYXMpCisgICAgICAgICAgICBzZWxmLnRleHQuYmluZCgiPEFsdC16PiIsIHNlbGYuc2F2ZV9hX2NvcHkpCisgICAgICAgIGRlZiBnZXRfc2F2ZWQoc2VsZik6IHJldHVybiAwCisgICAgICAgIGRlZiBzZXRfc2F2ZWQoc2VsZiwgZmxhZyk6IHBhc3MKKyAgICAgICAgZGVmIHJlc2V0X3VuZG8oc2VsZik6IHBhc3MKKyAgICAgICAgZGVmIG9wZW4oc2VsZiwgZXZlbnQpOgorICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2dlbmVyYXRlKCI8PG9wZW4td2luZG93LWZyb20tZmlsZT4+IikKKyAgICAgICAgZGVmIHNhdmUoc2VsZiwgZXZlbnQpOgorICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2dlbmVyYXRlKCI8PHNhdmUtd2luZG93Pj4iKQorICAgICAgICBkZWYgc2F2ZV9hcyhzZWxmLCBldmVudCk6CisgICAgICAgICAgICBzZWxmLnRleHQuZXZlbnRfZ2VuZXJhdGUoIjw8c2F2ZS13aW5kb3ctYXMtZmlsZT4+IikKKyAgICAgICAgZGVmIHNhdmVfYV9jb3B5KHNlbGYsIGV2ZW50KToKKyAgICAgICAgICAgIHNlbGYudGV4dC5ldmVudF9nZW5lcmF0ZSgiPDxzYXZlLWNvcHktb2Ytd2luZG93LWFzLWZpbGU+PiIpCisgICAgdGV4dCA9IFRleHQocm9vdCkKKyAgICB0ZXh0LnBhY2soKQorICAgIHRleHQuZm9jdXNfc2V0KCkKKyAgICBlZGl0d2luID0gTXlFZGl0V2luKHRleHQpCisgICAgaW8gPSBJT0JpbmRpbmcoZWRpdHdpbikKKyAgICByb290Lm1haW5sb29wKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9JT0JpbmRpbmcucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lPQmluZGluZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjYjg2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JT0JpbmRpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9JT0JpbmRpbmcucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lPQmluZGluZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjYjg2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JT0JpbmRpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9mb2xkZXIuZ2lmIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL2ZvbGRlci5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmZThkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9mb2xkZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9pZGxlLmljbnMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWNvbnMvaWRsZS5pY25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWUzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWNvbnMvaWRsZS5pY25zCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9taW51c25vZGUuZ2lmIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL21pbnVzbm9kZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyZTQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9taW51c25vZGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9vcGVuZm9sZGVyLmdpZiBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9vcGVuZm9sZGVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGFlYTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL29wZW5mb2xkZXIuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9wbHVzbm9kZS5naWYgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWNvbnMvcGx1c25vZGUuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYWNlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWNvbnMvcGx1c25vZGUuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9weXRob24uZ2lmIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL3B5dGhvbi5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyNzFlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9weXRob24uZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy90ay5naWYgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWNvbnMvdGsuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDNmNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWNvbnMvdGsuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9JZGxlSGlzdG9yeS5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JZGxlSGlzdG9yeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODNhMTQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lkbGVIaXN0b3J5LnB5CkBAIC0wLDAgKzEsODggQEAKK2Zyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorCitjbGFzcyBIaXN0b3J5OgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQsIG91dHB1dF9zZXAgPSAiXG4iKToKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAorICAgICAgICBzZWxmLmhpc3RvcnkgPSBbXQorICAgICAgICBzZWxmLmhpc3RvcnlfcHJlZml4ID0gTm9uZQorICAgICAgICBzZWxmLmhpc3RvcnlfcG9pbnRlciA9IE5vbmUKKyAgICAgICAgc2VsZi5vdXRwdXRfc2VwID0gb3V0cHV0X3NlcAorICAgICAgICBzZWxmLmN5Y2xpYyA9IGlkbGVDb25mLkdldE9wdGlvbigibWFpbiIsICJIaXN0b3J5IiwgImN5Y2xpYyIsIDEsICJib29sIikKKyAgICAgICAgdGV4dC5iaW5kKCI8PGhpc3RvcnktcHJldmlvdXM+PiIsIHNlbGYuaGlzdG9yeV9wcmV2KQorICAgICAgICB0ZXh0LmJpbmQoIjw8aGlzdG9yeS1uZXh0Pj4iLCBzZWxmLmhpc3RvcnlfbmV4dCkKKworICAgIGRlZiBoaXN0b3J5X25leHQoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLmhpc3RvcnlfZG8oMCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBoaXN0b3J5X3ByZXYoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLmhpc3RvcnlfZG8oMSkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBfZ2V0X3NvdXJjZShzZWxmLCBzdGFydCwgZW5kKToKKyAgICAgICAgIyBHZXQgc291cmNlIGNvZGUgZnJvbSBzdGFydCBpbmRleCB0byBlbmQgaW5kZXguICBMaW5lcyBpbiB0aGUKKyAgICAgICAgIyB0ZXh0IGNvbnRyb2wgbWF5IGJlIHNlcGFyYXRlZCBieSBzeXMucHMyIC4KKyAgICAgICAgbGluZXMgPSBzZWxmLnRleHQuZ2V0KHN0YXJ0LCBlbmQpLnNwbGl0KHNlbGYub3V0cHV0X3NlcCkKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihsaW5lcykKKworICAgIGRlZiBfcHV0X3NvdXJjZShzZWxmLCB3aGVyZSwgc291cmNlKToKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5vdXRwdXRfc2VwLmpvaW4oc291cmNlLnNwbGl0KCJcbiIpKQorICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KHdoZXJlLCBvdXRwdXQpCisKKyAgICBkZWYgaGlzdG9yeV9kbyhzZWxmLCByZXZlcnNlKToKKyAgICAgICAgbmhpc3QgPSBsZW4oc2VsZi5oaXN0b3J5KQorICAgICAgICBwb2ludGVyID0gc2VsZi5oaXN0b3J5X3BvaW50ZXIKKyAgICAgICAgcHJlZml4ID0gc2VsZi5oaXN0b3J5X3ByZWZpeAorICAgICAgICBpZiBwb2ludGVyIGlzIG5vdCBOb25lIGFuZCBwcmVmaXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLnRleHQuY29tcGFyZSgiaW5zZXJ0IiwgIiE9IiwgImVuZC0xYyIpIG9yIFwKKyAgICAgICAgICAgICAgIHNlbGYuX2dldF9zb3VyY2UoImlvbWFyayIsICJlbmQtMWMiKSAhPSBzZWxmLmhpc3RvcnlbcG9pbnRlcl06CisgICAgICAgICAgICAgICAgcG9pbnRlciA9IHByZWZpeCA9IE5vbmUKKyAgICAgICAgaWYgcG9pbnRlciBpcyBOb25lIG9yIHByZWZpeCBpcyBOb25lOgorICAgICAgICAgICAgcHJlZml4ID0gc2VsZi5fZ2V0X3NvdXJjZSgiaW9tYXJrIiwgImVuZC0xYyIpCisgICAgICAgICAgICBpZiByZXZlcnNlOgorICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBuaGlzdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmN5Y2xpYzoKKyAgICAgICAgICAgICAgICAgICAgcG9pbnRlciA9IC0xCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0LmJlbGwoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbnByZWZpeCA9IGxlbihwcmVmaXgpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBpZiByZXZlcnNlOgorICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBwb2ludGVyIC0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwb2ludGVyID0gcG9pbnRlciArIDEKKyAgICAgICAgICAgIGlmIHBvaW50ZXIgPCAwIG9yIHBvaW50ZXIgPj0gbmhpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi50ZXh0LmJlbGwoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmN5Y2xpYyBhbmQgcG9pbnRlciA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2dldF9zb3VyY2UoImlvbWFyayIsICJlbmQtMWMiKSAhPSBwcmVmaXg6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRleHQuZGVsZXRlKCJpb21hcmsiLCAiZW5kLTFjIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3B1dF9zb3VyY2UoImlvbWFyayIsIHByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgcG9pbnRlciA9IHByZWZpeCA9IE5vbmUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaXRlbSA9IHNlbGYuaGlzdG9yeVtwb2ludGVyXQorICAgICAgICAgICAgaWYgaXRlbVs6bnByZWZpeF0gPT0gcHJlZml4IGFuZCBsZW4oaXRlbSkgPiBucHJlZml4OgorICAgICAgICAgICAgICAgIHNlbGYudGV4dC5kZWxldGUoImlvbWFyayIsICJlbmQtMWMiKQorICAgICAgICAgICAgICAgIHNlbGYuX3B1dF9zb3VyY2UoImlvbWFyayIsIGl0ZW0pCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCAiZW5kLTFjIikKKyAgICAgICAgc2VsZi50ZXh0LnNlZSgiaW5zZXJ0IikKKyAgICAgICAgc2VsZi50ZXh0LnRhZ19yZW1vdmUoInNlbCIsICIxLjAiLCAiZW5kIikKKyAgICAgICAgc2VsZi5oaXN0b3J5X3BvaW50ZXIgPSBwb2ludGVyCisgICAgICAgIHNlbGYuaGlzdG9yeV9wcmVmaXggPSBwcmVmaXgKKworICAgIGRlZiBoaXN0b3J5X3N0b3JlKHNlbGYsIHNvdXJjZSk6CisgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5zdHJpcCgpCisgICAgICAgIGlmIGxlbihzb3VyY2UpID4gMjoKKyAgICAgICAgICAgICMgYXZvaWQgZHVwbGljYXRlcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuaGlzdG9yeS5yZW1vdmUoc291cmNlKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2VsZi5oaXN0b3J5LmFwcGVuZChzb3VyY2UpCisgICAgICAgIHNlbGYuaGlzdG9yeV9wb2ludGVyID0gTm9uZQorICAgICAgICBzZWxmLmhpc3RvcnlfcHJlZml4ID0gTm9uZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lkbGVIaXN0b3J5LnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JZGxlSGlzdG9yeS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllZDFiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JZGxlSGlzdG9yeS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lkbGVIaXN0b3J5LnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JZGxlSGlzdG9yeS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllZDFiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JZGxlSGlzdG9yeS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpQ2FsbC5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9NdWx0aUNhbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMmE2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9NdWx0aUNhbGwucHkKQEAgLTAsMCArMSw0MjMgQEAKKyIiIgorTXVsdGlDYWxsIC0gYSBjbGFzcyB3aGljaCBpbmhlcml0cyBpdHMgbWV0aG9kcyBmcm9tIGEgVGtpbnRlciB3aWRnZXQgKFRleHQsIGZvcgorZXhhbXBsZSksIGJ1dCBlbmFibGVzIG11bHRpcGxlIGNhbGxzIG9mIGZ1bmN0aW9ucyBwZXIgdmlydHVhbCBldmVudCAtIGFsbAorbWF0Y2hpbmcgZXZlbnRzIHdpbGwgYmUgY2FsbGVkLCBub3Qgb25seSB0aGUgbW9zdCBzcGVjaWZpYyBvbmUuIFRoaXMgaXMgZG9uZQorYnkgd3JhcHBpbmcgdGhlIGV2ZW50IGZ1bmN0aW9ucyAtIGV2ZW50X2FkZCwgZXZlbnRfZGVsZXRlIGFuZCBldmVudF9pbmZvLgorTXVsdGlDYWxsIHJlY29nbml6ZXMgb25seSBhIHN1YnNldCBvZiBsZWdhbCBldmVudCBzZXF1ZW5jZXMuIFNlcXVlbmNlcyB3aGljaAorYXJlIG5vdCByZWNvZ25pemVkIGFyZSB0cmVhdGVkIGJ5IHRoZSBvcmlnaW5hbCBUayBoYW5kbGluZyBtZWNoYW5pc20uIEEKK21vcmUtc3BlY2lmaWMgZXZlbnQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGEgbGVzcy1zcGVjaWZpYyBldmVudC4KKworVGhlIHJlY29nbml6ZWQgc2VxdWVuY2VzIGFyZSBjb21wbGV0ZSBvbmUtZXZlbnQgc2VxdWVuY2VzIChubyBlbWFjcy1zdHlsZQorQ3RybC1YIEN0cmwtQywgbm8gc2hvcnRjdXRzIGxpa2UgPDM+KSwgZm9yIGFsbCB0eXBlcyBvZiBldmVudHMuCitLZXkvQnV0dG9uIFByZXNzL1JlbGVhc2UgZXZlbnRzIGNhbiBoYXZlIG1vZGlmaWVycy4KK1RoZSByZWNvZ25pemVkIG1vZGlmaWVycyBhcmUgU2hpZnQsIENvbnRyb2wsIE9wdGlvbiBhbmQgQ29tbWFuZCBmb3IgTWFjLCBhbmQKK0NvbnRyb2wsIEFsdCwgU2hpZnQsIE1ldGEvTSBmb3Igb3RoZXIgcGxhdGZvcm1zLgorCitGb3IgYWxsIGV2ZW50cyB3aGljaCB3ZXJlIGhhbmRsZWQgYnkgTXVsdGlDYWxsLCBhIG5ldyBtZW1iZXIgaXMgYWRkZWQgdG8gdGhlCitldmVudCBpbnN0YW5jZSBwYXNzZWQgdG8gdGhlIGJpbmRlZCBmdW5jdGlvbnMgLSBtY190eXBlLiBUaGlzIGlzIG9uZSBvZiB0aGUKK2V2ZW50IHR5cGUgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgKHN1Y2ggYXMgTUNfS0VZUFJFU1MpLgorRm9yIEtleS9CdXR0b24gZXZlbnRzICh3aGljaCBhcmUgaGFuZGxlZCBieSBNdWx0aUNhbGwgYW5kIG1heSByZWNlaXZlCittb2RpZmllcnMpLCBhbm90aGVyIG1lbWJlciBpcyBhZGRlZCAtIG1jX3N0YXRlLiBUaGlzIG1lbWJlciBnaXZlcyB0aGUgc3RhdGUKK29mIHRoZSByZWNvZ25pemVkIG1vZGlmaWVycywgYXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgbW9kaWZpZXIgY29uc3RhbnRzCithbHNvIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUgKGZvciBleGFtcGxlLCBNQ19TSElGVCkuCitVc2luZyB0aGVzZSBtZW1iZXJzIGlzIGFic29sdXRlbHkgcG9ydGFibGUuCisKK1RoZSBvcmRlciBieSB3aGljaCBldmVudHMgYXJlIGNhbGxlZCBpcyBkZWZpbmVkIGJ5IHRoZXNlIHJ1bGVzOgorMS4gQSBtb3JlLXNwZWNpZmljIGV2ZW50IHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhIGxlc3Mtc3BlY2lmaWMgZXZlbnQuCisyLiBBIHJlY2VudGx5LWJpbmRlZCBldmVudCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYSBwcmV2aW91c2x5LWJpbmRlZCBldmVudCwKKyAgIHVubGVzcyB0aGlzIGNvbmZsaWN0cyB3aXRoIHRoZSBmaXJzdCBydWxlLgorRWFjaCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgZm9yIGVhY2ggZXZlbnQuCisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IHN0cmluZworaW1wb3J0IHJlCitpbXBvcnQgVGtpbnRlcgorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0CisKKyMgdGhlIGV2ZW50IHR5cGUgY29uc3RhbnRzLCB3aGljaCBkZWZpbmUgdGhlIG1lYW5pbmcgb2YgbWNfdHlwZQorTUNfS0VZUFJFU1M9MDsgTUNfS0VZUkVMRUFTRT0xOyBNQ19CVVRUT05QUkVTUz0yOyBNQ19CVVRUT05SRUxFQVNFPTM7CitNQ19BQ1RJVkFURT00OyBNQ19DSVJDVUxBVEU9NTsgTUNfQ09MT1JNQVA9NjsgTUNfQ09ORklHVVJFPTc7CitNQ19ERUFDVElWQVRFPTg7IE1DX0RFU1RST1k9OTsgTUNfRU5URVI9MTA7IE1DX0VYUE9TRT0xMTsgTUNfRk9DVVNJTj0xMjsKK01DX0ZPQ1VTT1VUPTEzOyBNQ19HUkFWSVRZPTE0OyBNQ19MRUFWRT0xNTsgTUNfTUFQPTE2OyBNQ19NT1RJT049MTc7CitNQ19NT1VTRVdIRUVMPTE4OyBNQ19QUk9QRVJUWT0xOTsgTUNfUkVQQVJFTlQ9MjA7IE1DX1VOTUFQPTIxOyBNQ19WSVNJQklMSVRZPTIyOworIyB0aGUgbW9kaWZpZXIgc3RhdGUgY29uc3RhbnRzLCB3aGljaCBkZWZpbmUgdGhlIG1lYW5pbmcgb2YgbWNfc3RhdGUKK01DX1NISUZUID0gMTw8MDsgTUNfQ09OVFJPTCA9IDE8PDI7IE1DX0FMVCA9IDE8PDM7IE1DX01FVEEgPSAxPDw1CitNQ19PUFRJT04gPSAxPDw2OyBNQ19DT01NQU5EID0gMTw8NworCisjIGRlZmluZSB0aGUgbGlzdCBvZiBtb2RpZmllcnMsIHRvIGJlIHVzZWQgaW4gY29tcGxleCBldmVudCB0eXBlcy4KK2lmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgX21vZGlmaWVycyA9ICgoIlNoaWZ0IiwpLCAoIkNvbnRyb2wiLCksICgiT3B0aW9uIiwpLCAoIkNvbW1hbmQiLCkpCisgICAgX21vZGlmaWVyX21hc2tzID0gKE1DX1NISUZULCBNQ19DT05UUk9MLCBNQ19PUFRJT04sIE1DX0NPTU1BTkQpCitlbHNlOgorICAgIF9tb2RpZmllcnMgPSAoKCJDb250cm9sIiwpLCAoIkFsdCIsKSwgKCJTaGlmdCIsKSwgKCJNZXRhIiwgIk0iKSkKKyAgICBfbW9kaWZpZXJfbWFza3MgPSAoTUNfQ09OVFJPTCwgTUNfQUxULCBNQ19TSElGVCwgTUNfTUVUQSkKKworIyBhIGRpY3Rpb25hcnkgdG8gbWFwIGEgbW9kaWZpZXIgbmFtZSBpbnRvIGl0cyBudW1iZXIKK19tb2RpZmllcl9uYW1lcyA9IGRpY3QoWyhuYW1lLCBudW1iZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG51bWJlciBpbiByYW5nZShsZW4oX21vZGlmaWVycykpCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gX21vZGlmaWVyc1tudW1iZXJdXSkKKworIyBBIGJpbmRlciBpcyBhIGNsYXNzIHdoaWNoIGJpbmRzIGZ1bmN0aW9ucyB0byBvbmUgdHlwZSBvZiBldmVudC4gSXQgaGFzIHR3bworIyBtZXRob2RzOiBiaW5kIGFuZCB1bmJpbmQsIHdoaWNoIGdldCBhIGZ1bmN0aW9uIGFuZCBhIHBhcnNlZCBzZXF1ZW5jZSwgYXMKKyMgcmV0dXJuZWQgYnkgX3BhcnNlX3NlcXVlbmNlKCkuIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgYmluZGVyczoKKyMgX1NpbXBsZUJpbmRlciBoYW5kbGVzIGV2ZW50IHR5cGVzIHdpdGggbm8gbW9kaWZpZXJzIGFuZCBubyBkZXRhaWwuCisjIE5vIFB5dGhvbiBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aGVuIG5vIGV2ZW50cyBhcmUgYmluZGVkLgorIyBfQ29tcGxleEJpbmRlciBoYW5kbGVzIGV2ZW50IHR5cGVzIHdpdGggbW9kaWZpZXJzIGFuZCBhIGRldGFpbC4KKyMgQSBQeXRob24gZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2ggdGltZSBhbiBldmVudCBpcyBnZW5lcmF0ZWQuCisKK2NsYXNzIF9TaW1wbGVCaW5kZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGUsIHdpZGdldCwgd2lkZ2V0aW5zdCk6CisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICAgICAgc2VsZi5zZXF1ZW5jZSA9ICc8JytfdHlwZXNbdHlwZV1bMF0rJz4nCisgICAgICAgIHNlbGYud2lkZ2V0ID0gd2lkZ2V0CisgICAgICAgIHNlbGYud2lkZ2V0aW5zdCA9IHdpZGdldGluc3QKKyAgICAgICAgc2VsZi5iaW5kZWRmdW5jcyA9IFtdCisgICAgICAgIHNlbGYuaGFuZGxlcmlkID0gTm9uZQorCisgICAgZGVmIGJpbmQoc2VsZiwgdHJpcGxldCwgZnVuYyk6CisgICAgICAgIGlmIG5vdCBzZWxmLmhhbmRsZXJpZDoKKyAgICAgICAgICAgIGRlZiBoYW5kbGVyKGV2ZW50LCBsID0gc2VsZi5iaW5kZWRmdW5jcywgbWNfdHlwZSA9IHNlbGYudHlwZSk6CisgICAgICAgICAgICAgICAgZXZlbnQubWNfdHlwZSA9IG1jX3R5cGUKKyAgICAgICAgICAgICAgICB3YXNjYWxsZWQgPSB7fQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihsKS0xLCAtMSwgLTEpOgorICAgICAgICAgICAgICAgICAgICBmdW5jID0gbFtpXQorICAgICAgICAgICAgICAgICAgICBpZiBmdW5jIG5vdCBpbiB3YXNjYWxsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICB3YXNjYWxsZWRbZnVuY10gPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICByID0gZnVuYyhldmVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlcmlkID0gc2VsZi53aWRnZXQuYmluZChzZWxmLndpZGdldGluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXF1ZW5jZSwgaGFuZGxlcikKKyAgICAgICAgc2VsZi5iaW5kZWRmdW5jcy5hcHBlbmQoZnVuYykKKworICAgIGRlZiB1bmJpbmQoc2VsZiwgdHJpcGxldCwgZnVuYyk6CisgICAgICAgIHNlbGYuYmluZGVkZnVuY3MucmVtb3ZlKGZ1bmMpCisgICAgICAgIGlmIG5vdCBzZWxmLmJpbmRlZGZ1bmNzOgorICAgICAgICAgICAgc2VsZi53aWRnZXQudW5iaW5kKHNlbGYud2lkZ2V0aW5zdCwgc2VsZi5zZXF1ZW5jZSwgc2VsZi5oYW5kbGVyaWQpCisgICAgICAgICAgICBzZWxmLmhhbmRsZXJpZCA9IE5vbmUKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhbmRsZXJpZDoKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0LnVuYmluZChzZWxmLndpZGdldGluc3QsIHNlbGYuc2VxdWVuY2UsIHNlbGYuaGFuZGxlcmlkKQorCisjIEFuIGludCBpbiByYW5nZSgxIDw8IGxlbihfbW9kaWZpZXJzKSkgcmVwcmVzZW50cyBhIGNvbWJpbmF0aW9uIG9mIG1vZGlmaWVycworIyAoaWYgdGhlIGxlYXN0IHNpZ25pZmljZW50IGJpdCBpcyBvbiwgX21vZGlmaWVyc1swXSBpcyBvbiwgYW5kIHNvIG9uKS4KKyMgX3N0YXRlX3N1YnNldHMgZ2l2ZXMgZm9yIGVhY2ggY29tYmluYXRpb24gb2YgbW9kaWZpZXJzLCBvciAqc3RhdGUqLAorIyBhIGxpc3Qgb2YgdGhlIHN0YXRlcyB3aGljaCBhcmUgYSBzdWJzZXQgb2YgaXQuIFRoaXMgbGlzdCBpcyBvcmRlcmVkIGJ5IHRoZQorIyBudW1iZXIgb2YgbW9kaWZpZXJzIGlzIHRoZSBzdGF0ZSAtIHRoZSBtb3N0IHNwZWNpZmljIHN0YXRlIGNvbWVzIGZpcnN0LgorX3N0YXRlcyA9IHJhbmdlKDEgPDwgbGVuKF9tb2RpZmllcnMpKQorX3N0YXRlX25hbWVzID0gWycnLmpvaW4obVswXSsnLScKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpLCBtIGluIGVudW1lcmF0ZShfbW9kaWZpZXJzKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKDEgPDwgaSkgJiBzKQorICAgICAgICAgICAgICAgIGZvciBzIGluIF9zdGF0ZXNdCisKK2RlZiBleHBhbmRfc3Vic3RhdGVzKHN0YXRlcyk6CisgICAgJycnRm9yIGVhY2ggaXRlbSBvZiBzdGF0ZXMgcmV0dXJuIGEgbGlzdCBjb250YWluaW5nIGFsbCBjb21iaW5hdGlvbnMgb2YKKyAgICB0aGF0IGl0ZW0gd2l0aCBpbmRpdmlkdWFsIGJpdHMgcmVzZXQsIHNvcnRlZCBieSB0aGUgbnVtYmVyIG9mIHNldCBiaXRzLgorICAgICcnJworICAgIGRlZiBuYml0cyhuKToKKyAgICAgICAgIm51bWJlciBvZiBiaXRzIHNldCBpbiBuIGJhc2UgMiIKKyAgICAgICAgbmIgPSAwCisgICAgICAgIHdoaWxlIG46CisgICAgICAgICAgICBuLCByZW0gPSBkaXZtb2QobiwgMikKKyAgICAgICAgICAgIG5iICs9IHJlbQorICAgICAgICByZXR1cm4gbmIKKyAgICBzdGF0ZWxpc3QgPSBbXQorICAgIGZvciBzdGF0ZSBpbiBzdGF0ZXM6CisgICAgICAgIHN1YnN0YXRlcyA9IGxpc3Qoc2V0KHN0YXRlICYgeCBmb3IgeCBpbiBzdGF0ZXMpKQorICAgICAgICBzdWJzdGF0ZXMuc29ydChrZXk9bmJpdHMsIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgc3RhdGVsaXN0LmFwcGVuZChzdWJzdGF0ZXMpCisgICAgcmV0dXJuIHN0YXRlbGlzdAorCitfc3RhdGVfc3Vic2V0cyA9IGV4cGFuZF9zdWJzdGF0ZXMoX3N0YXRlcykKKworIyBfc3RhdGVfY29kZXMgZ2l2ZXMgZm9yIGVhY2ggc3RhdGUsIHRoZSBwb3J0YWJsZSBjb2RlIHRvIGJlIHBhc3NlZCBhcyBtY19zdGF0ZQorX3N0YXRlX2NvZGVzID0gW10KK2ZvciBzIGluIF9zdGF0ZXM6CisgICAgciA9IDAKKyAgICBmb3IgaSBpbiByYW5nZShsZW4oX21vZGlmaWVycykpOgorICAgICAgICBpZiAoMSA8PCBpKSAmIHM6CisgICAgICAgICAgICByIHw9IF9tb2RpZmllcl9tYXNrc1tpXQorICAgIF9zdGF0ZV9jb2Rlcy5hcHBlbmQocikKKworY2xhc3MgX0NvbXBsZXhCaW5kZXI6CisgICAgIyBUaGlzIGNsYXNzIGJpbmRzIG1hbnkgZnVuY3Rpb25zLCBhbmQgb25seSB1bmJpbmRzIHRoZW0gd2hlbiBpdCBpcyBkZWxldGVkLgorICAgICMgc2VsZi5oYW5kbGVyaWRzIGlzIHRoZSBsaXN0IG9mIHNlcXMgYW5kIGlkcyBvZiBiaW5kZWQgaGFuZGxlciBmdW5jdGlvbnMuCisgICAgIyBUaGUgYmluZGVkIGZ1bmN0aW9ucyBzaXQgaW4gYSBkaWN0aW9uYXJ5IG9mIGxpc3RzIG9mIGxpc3RzLCB3aGljaCBtYXBzCisgICAgIyBhIGRldGFpbCAob3IgTm9uZSkgYW5kIGEgc3RhdGUgaW50byBhIGxpc3Qgb2YgZnVuY3Rpb25zLgorICAgICMgV2hlbiBhIG5ldyBkZXRhaWwgaXMgZGlzY292ZXJlZCwgaGFuZGxlcnMgZm9yIGFsbCB0aGUgcG9zc2libGUgc3RhdGVzCisgICAgIyBhcmUgYmluZGVkLgorCisgICAgZGVmIF9fY3JlYXRlX2hhbmRsZXIoc2VsZiwgbGlzdHMsIG1jX3R5cGUsIG1jX3N0YXRlKToKKyAgICAgICAgZGVmIGhhbmRsZXIoZXZlbnQsIGxpc3RzID0gbGlzdHMsCisgICAgICAgICAgICAgICAgICAgIG1jX3R5cGUgPSBtY190eXBlLCBtY19zdGF0ZSA9IG1jX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICBpc2hhbmRsZXJydW5uaW5nID0gc2VsZi5pc2hhbmRsZXJydW5uaW5nLAorICAgICAgICAgICAgICAgICAgICBkb2FmdGVyaGFuZGxlciA9IHNlbGYuZG9hZnRlcmhhbmRsZXIpOgorICAgICAgICAgICAgaXNoYW5kbGVycnVubmluZ1s6XSA9IFtUcnVlXQorICAgICAgICAgICAgZXZlbnQubWNfdHlwZSA9IG1jX3R5cGUKKyAgICAgICAgICAgIGV2ZW50Lm1jX3N0YXRlID0gbWNfc3RhdGUKKyAgICAgICAgICAgIHdhc2NhbGxlZCA9IHt9CisgICAgICAgICAgICByID0gTm9uZQorICAgICAgICAgICAgZm9yIGwgaW4gbGlzdHM6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGwpLTEsIC0xLCAtMSk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBsW2ldCisgICAgICAgICAgICAgICAgICAgIGlmIGZ1bmMgbm90IGluIHdhc2NhbGxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhc2NhbGxlZFtmdW5jXSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBsW2ldKGV2ZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIHI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpc2hhbmRsZXJydW5uaW5nWzpdID0gW10KKyAgICAgICAgICAgICMgQ2FsbCBhbGwgZnVuY3Rpb25zIGluIGRvYWZ0ZXJoYW5kbGVyIGFuZCByZW1vdmUgdGhlbSBmcm9tIGxpc3QKKyAgICAgICAgICAgIGZvciBmIGluIGRvYWZ0ZXJoYW5kbGVyOgorICAgICAgICAgICAgICAgIGYoKQorICAgICAgICAgICAgZG9hZnRlcmhhbmRsZXJbOl0gPSBbXQorICAgICAgICAgICAgaWYgcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gcgorICAgICAgICByZXR1cm4gaGFuZGxlcgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGUsIHdpZGdldCwgd2lkZ2V0aW5zdCk6CisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IF90eXBlc1t0eXBlXVswXQorICAgICAgICBzZWxmLndpZGdldCA9IHdpZGdldAorICAgICAgICBzZWxmLndpZGdldGluc3QgPSB3aWRnZXRpbnN0CisgICAgICAgIHNlbGYuYmluZGVkZnVuY3MgPSB7Tm9uZTogW1tdIGZvciBzIGluIF9zdGF0ZXNdfQorICAgICAgICBzZWxmLmhhbmRsZXJpZHMgPSBbXQorICAgICAgICAjIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBsaXN0cyBvZiBmdW5jdGlvbnMgd2hpbGUgYSBoYW5kbGVyIGlzCisgICAgICAgICMgcnVubmluZyAtIGl0IHdpbGwgbWVzcyB1cCB0aGUgbG9vcCBhbmQgYW55d2F5LCB3ZSB1c3VhbGx5IHdhbnQgdGhlCisgICAgICAgICMgY2hhbmdlIHRvIGhhcHBlbiBmcm9tIHRoZSBuZXh0IGV2ZW50LiBTbyB3ZSBoYXZlIGEgbGlzdCBvZiBmdW5jdGlvbnMKKyAgICAgICAgIyBmb3IgdGhlIGhhbmRsZXIgdG8gcnVuIGFmdGVyIGl0IGZpbmlzaGVzIGNhbGxpbmcgdGhlIGJpbmRlZCBmdW5jdGlvbnMuCisgICAgICAgICMgSXQgY2FsbHMgdGhlbSBvbmx5IG9uY2UuCisgICAgICAgICMgaXNoYW5kbGVycnVubmluZyBpcyBhIGxpc3QuIEFuIGVtcHR5IG9uZSBtZWFucyBubywgb3RoZXJ3aXNlIC0geWVzLgorICAgICAgICAjIHRoaXMgaXMgZG9uZSBzbyB0aGF0IGl0IHdvdWxkIGJlIG11dGFibGUuCisgICAgICAgIHNlbGYuaXNoYW5kbGVycnVubmluZyA9IFtdCisgICAgICAgIHNlbGYuZG9hZnRlcmhhbmRsZXIgPSBbXQorICAgICAgICBmb3IgcyBpbiBfc3RhdGVzOgorICAgICAgICAgICAgbGlzdHMgPSBbc2VsZi5iaW5kZWRmdW5jc1tOb25lXVtpXSBmb3IgaSBpbiBfc3RhdGVfc3Vic2V0c1tzXV0KKyAgICAgICAgICAgIGhhbmRsZXIgPSBzZWxmLl9fY3JlYXRlX2hhbmRsZXIobGlzdHMsIHR5cGUsIF9zdGF0ZV9jb2Rlc1tzXSkKKyAgICAgICAgICAgIHNlcSA9ICc8Jytfc3RhdGVfbmFtZXNbc10rc2VsZi50eXBlbmFtZSsnPicKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlcmlkcy5hcHBlbmQoKHNlcSwgc2VsZi53aWRnZXQuYmluZChzZWxmLndpZGdldGluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxLCBoYW5kbGVyKSkpCisKKyAgICBkZWYgYmluZChzZWxmLCB0cmlwbGV0LCBmdW5jKToKKyAgICAgICAgaWYgdHJpcGxldFsyXSBub3QgaW4gc2VsZi5iaW5kZWRmdW5jczoKKyAgICAgICAgICAgIHNlbGYuYmluZGVkZnVuY3NbdHJpcGxldFsyXV0gPSBbW10gZm9yIHMgaW4gX3N0YXRlc10KKyAgICAgICAgICAgIGZvciBzIGluIF9zdGF0ZXM6CisgICAgICAgICAgICAgICAgbGlzdHMgPSBbIHNlbGYuYmluZGVkZnVuY3NbZGV0YWlsXVtpXQorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGV0YWlsIGluICh0cmlwbGV0WzJdLCBOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBfc3RhdGVfc3Vic2V0c1tzXSAgICAgICBdCisgICAgICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuX19jcmVhdGVfaGFuZGxlcihsaXN0cywgc2VsZi50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0YXRlX2NvZGVzW3NdKQorICAgICAgICAgICAgICAgIHNlcSA9ICI8JXMlcy0lcz4iJSAoX3N0YXRlX25hbWVzW3NdLCBzZWxmLnR5cGVuYW1lLCB0cmlwbGV0WzJdKQorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlcmlkcy5hcHBlbmQoKHNlcSwgc2VsZi53aWRnZXQuYmluZChzZWxmLndpZGdldGluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcSwgaGFuZGxlcikpKQorICAgICAgICBkb2l0ID0gbGFtYmRhOiBzZWxmLmJpbmRlZGZ1bmNzW3RyaXBsZXRbMl1dW3RyaXBsZXRbMF1dLmFwcGVuZChmdW5jKQorICAgICAgICBpZiBub3Qgc2VsZi5pc2hhbmRsZXJydW5uaW5nOgorICAgICAgICAgICAgZG9pdCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRvYWZ0ZXJoYW5kbGVyLmFwcGVuZChkb2l0KQorCisgICAgZGVmIHVuYmluZChzZWxmLCB0cmlwbGV0LCBmdW5jKToKKyAgICAgICAgZG9pdCA9IGxhbWJkYTogc2VsZi5iaW5kZWRmdW5jc1t0cmlwbGV0WzJdXVt0cmlwbGV0WzBdXS5yZW1vdmUoZnVuYykKKyAgICAgICAgaWYgbm90IHNlbGYuaXNoYW5kbGVycnVubmluZzoKKyAgICAgICAgICAgIGRvaXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kb2FmdGVyaGFuZGxlci5hcHBlbmQoZG9pdCkKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBmb3Igc2VxLCBpZCBpbiBzZWxmLmhhbmRsZXJpZHM6CisgICAgICAgICAgICBzZWxmLndpZGdldC51bmJpbmQoc2VsZi53aWRnZXRpbnN0LCBzZXEsIGlkKQorCisjIGRlZmluZSB0aGUgbGlzdCBvZiBldmVudCB0eXBlcyB0byBiZSBoYW5kbGVkIGJ5IE11bHRpRXZlbnQuIHRoZSBvcmRlciBpcworIyBjb21wYXRpYmxlIHdpdGggdGhlIGRlZmluaXRpb24gb2YgZXZlbnQgdHlwZSBjb25zdGFudHMuCitfdHlwZXMgPSAoCisgICAgKCJLZXlQcmVzcyIsICJLZXkiKSwgKCJLZXlSZWxlYXNlIiwpLCAoIkJ1dHRvblByZXNzIiwgIkJ1dHRvbiIpLAorICAgICgiQnV0dG9uUmVsZWFzZSIsKSwgKCJBY3RpdmF0ZSIsKSwgKCJDaXJjdWxhdGUiLCksICgiQ29sb3JtYXAiLCksCisgICAgKCJDb25maWd1cmUiLCksICgiRGVhY3RpdmF0ZSIsKSwgKCJEZXN0cm95IiwpLCAoIkVudGVyIiwpLCAoIkV4cG9zZSIsKSwKKyAgICAoIkZvY3VzSW4iLCksICgiRm9jdXNPdXQiLCksICgiR3Jhdml0eSIsKSwgKCJMZWF2ZSIsKSwgKCJNYXAiLCksCisgICAgKCJNb3Rpb24iLCksICgiTW91c2VXaGVlbCIsKSwgKCJQcm9wZXJ0eSIsKSwgKCJSZXBhcmVudCIsKSwgKCJVbm1hcCIsKSwKKyAgICAoIlZpc2liaWxpdHkiLCksCispCisKKyMgd2hpY2ggYmluZGVyIHNob3VsZCBiZSB1c2VkIGZvciBldmVyeSBldmVudCB0eXBlPworX2JpbmRlcl9jbGFzc2VzID0gKF9Db21wbGV4QmluZGVyLCkgKiA0ICsgKF9TaW1wbGVCaW5kZXIsKSAqIChsZW4oX3R5cGVzKS00KQorCisjIEEgZGljdGlvbmFyeSB0byBtYXAgYSB0eXBlIG5hbWUgaW50byBpdHMgbnVtYmVyCitfdHlwZV9uYW1lcyA9IGRpY3QoWyhuYW1lLCBudW1iZXIpCisgICAgICAgICAgICAgICAgICAgICBmb3IgbnVtYmVyIGluIHJhbmdlKGxlbihfdHlwZXMpKQorICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gX3R5cGVzW251bWJlcl1dKQorCitfa2V5c3ltX3JlID0gcmUuY29tcGlsZShyIl5cdyskIikKK19idXR0b25fcmUgPSByZS5jb21waWxlKHIiXlsxLTVdJCIpCitkZWYgX3BhcnNlX3NlcXVlbmNlKHNlcXVlbmNlKToKKyAgICAiIiJHZXQgYSBzdHJpbmcgd2hpY2ggc2hvdWxkIGRlc2NyaWJlIGFuIGV2ZW50IHNlcXVlbmNlLiBJZiBpdCBpcworICAgIHN1Y2Nlc3NmdWxseSBwYXJzZWQgYXMgb25lLCByZXR1cm4gYSB0dXBsZSBjb250YWluaW5nIHRoZSBzdGF0ZSAoYXMgYW4gaW50KSwKKyAgICB0aGUgZXZlbnQgdHlwZSAoYXMgYW4gaW5kZXggb2YgX3R5cGVzKSwgYW5kIHRoZSBkZXRhaWwgLSBOb25lIGlmIG5vbmUsIG9yIGEKKyAgICBzdHJpbmcgaWYgdGhlcmUgaXMgb25lLiBJZiB0aGUgcGFyc2luZyBpcyB1bnN1Y2Nlc3NmdWwsIHJldHVybiBOb25lLgorICAgICIiIgorICAgIGlmIG5vdCBzZXF1ZW5jZSBvciBzZXF1ZW5jZVswXSAhPSAnPCcgb3Igc2VxdWVuY2VbLTFdICE9ICc+JzoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICB3b3JkcyA9IHN0cmluZy5zcGxpdChzZXF1ZW5jZVsxOi0xXSwgJy0nKQorCisgICAgbW9kaWZpZXJzID0gMAorICAgIHdoaWxlIHdvcmRzIGFuZCB3b3Jkc1swXSBpbiBfbW9kaWZpZXJfbmFtZXM6CisgICAgICAgIG1vZGlmaWVycyB8PSAxIDw8IF9tb2RpZmllcl9uYW1lc1t3b3Jkc1swXV0KKyAgICAgICAgZGVsIHdvcmRzWzBdCisKKyAgICBpZiB3b3JkcyBhbmQgd29yZHNbMF0gaW4gX3R5cGVfbmFtZXM6CisgICAgICAgIHR5cGUgPSBfdHlwZV9uYW1lc1t3b3Jkc1swXV0KKyAgICAgICAgZGVsIHdvcmRzWzBdCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGlmIF9iaW5kZXJfY2xhc3Nlc1t0eXBlXSBpcyBfU2ltcGxlQmluZGVyOgorICAgICAgICBpZiBtb2RpZmllcnMgb3Igd29yZHM6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGV0YWlsID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgICMgX0NvbXBsZXhCaW5kZXIKKyAgICAgICAgaWYgdHlwZSBpbiBbX3R5cGVfbmFtZXNbc10gZm9yIHMgaW4gKCJLZXlQcmVzcyIsICJLZXlSZWxlYXNlIildOgorICAgICAgICAgICAgdHlwZV9yZSA9IF9rZXlzeW1fcmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR5cGVfcmUgPSBfYnV0dG9uX3JlCisKKyAgICAgICAgaWYgbm90IHdvcmRzOgorICAgICAgICAgICAgZGV0YWlsID0gTm9uZQorICAgICAgICBlbGlmIGxlbih3b3JkcykgPT0gMSBhbmQgdHlwZV9yZS5tYXRjaCh3b3Jkc1swXSk6CisgICAgICAgICAgICBkZXRhaWwgPSB3b3Jkc1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIHJldHVybiBtb2RpZmllcnMsIHR5cGUsIGRldGFpbAorCitkZWYgX3RyaXBsZXRfdG9fc2VxdWVuY2UodHJpcGxldCk6CisgICAgaWYgdHJpcGxldFsyXToKKyAgICAgICAgcmV0dXJuICc8Jytfc3RhdGVfbmFtZXNbdHJpcGxldFswXV0rX3R5cGVzW3RyaXBsZXRbMV1dWzBdKyctJysgXAorICAgICAgICAgICAgICAgdHJpcGxldFsyXSsnPicKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gJzwnK19zdGF0ZV9uYW1lc1t0cmlwbGV0WzBdXStfdHlwZXNbdHJpcGxldFsxXV1bMF0rJz4nCisKK19tdWx0aWNhbGxfZGljdCA9IHt9CitkZWYgTXVsdGlDYWxsQ3JlYXRvcih3aWRnZXQpOgorICAgICIiIlJldHVybiBhIE11bHRpQ2FsbCBjbGFzcyB3aGljaCBpbmhlcml0cyBpdHMgbWV0aG9kcyBmcm9tIHRoZQorICAgIGdpdmVuIHdpZGdldCBjbGFzcyAoZm9yIGV4YW1wbGUsIFRraW50ZXIuVGV4dCkuIFRoaXMgaXMgdXNlZAorICAgIGluc3RlYWQgb2YgYSB0ZW1wbGF0aW5nIG1lY2hhbmlzbS4KKyAgICAiIiIKKyAgICBpZiB3aWRnZXQgaW4gX211bHRpY2FsbF9kaWN0OgorICAgICAgICByZXR1cm4gX211bHRpY2FsbF9kaWN0W3dpZGdldF0KKworICAgIGNsYXNzIE11bHRpQ2FsbCAod2lkZ2V0KToKKyAgICAgICAgYXNzZXJ0IGlzc3ViY2xhc3Mod2lkZ2V0LCBUa2ludGVyLk1pc2MpCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICB3aWRnZXQuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgIyBhIGRpY3Rpb25hcnkgd2hpY2ggbWFwcyBhIHZpcnR1YWwgZXZlbnQgdG8gYSB0dXBsZSB3aXRoOgorICAgICAgICAgICAgIyAgMC4gdGhlIGZ1bmN0aW9uIGJpbmRlZAorICAgICAgICAgICAgIyAgMS4gYSBsaXN0IG9mIHRyaXBsZXRzIC0gdGhlIHNlcXVlbmNlcyBpdCBpcyBiaW5kZWQgdG8KKyAgICAgICAgICAgIHNlbGYuX19ldmVudGluZm8gPSB7fQorICAgICAgICAgICAgc2VsZi5fX2JpbmRlcnMgPSBbX2JpbmRlcl9jbGFzc2VzW2ldKGksIHdpZGdldCwgc2VsZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihfdHlwZXMpKV0KKworICAgICAgICBkZWYgYmluZChzZWxmLCBzZXF1ZW5jZT1Ob25lLCBmdW5jPU5vbmUsIGFkZD1Ob25lKToKKyAgICAgICAgICAgICNwcmludCAiYmluZCglcywgJXMsICVzKSBjYWxsZWQuIiAlIChzZXF1ZW5jZSwgZnVuYywgYWRkKQorICAgICAgICAgICAgaWYgdHlwZShzZXF1ZW5jZSkgaXMgc3RyIGFuZCBsZW4oc2VxdWVuY2UpID4gMiBhbmQgXAorICAgICAgICAgICAgICAgc2VxdWVuY2VbOjJdID09ICI8PCIgYW5kIHNlcXVlbmNlWy0yOl0gPT0gIj4+IjoKKyAgICAgICAgICAgICAgICBpZiBzZXF1ZW5jZSBpbiBzZWxmLl9fZXZlbnRpbmZvOgorICAgICAgICAgICAgICAgICAgICBlaSA9IHNlbGYuX19ldmVudGluZm9bc2VxdWVuY2VdCisgICAgICAgICAgICAgICAgICAgIGlmIGVpWzBdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRyaXBsZXQgaW4gZWlbMV06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2JpbmRlcnNbdHJpcGxldFsxXV0udW5iaW5kKHRyaXBsZXQsIGVpWzBdKQorICAgICAgICAgICAgICAgICAgICBlaVswXSA9IGZ1bmMKKyAgICAgICAgICAgICAgICAgICAgaWYgZWlbMF0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdHJpcGxldCBpbiBlaVsxXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fYmluZGVyc1t0cmlwbGV0WzFdXS5iaW5kKHRyaXBsZXQsIGZ1bmMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2V2ZW50aW5mb1tzZXF1ZW5jZV0gPSBbZnVuYywgW11dCisgICAgICAgICAgICByZXR1cm4gd2lkZ2V0LmJpbmQoc2VsZiwgc2VxdWVuY2UsIGZ1bmMsIGFkZCkKKworICAgICAgICBkZWYgdW5iaW5kKHNlbGYsIHNlcXVlbmNlLCBmdW5jaWQ9Tm9uZSk6CisgICAgICAgICAgICBpZiB0eXBlKHNlcXVlbmNlKSBpcyBzdHIgYW5kIGxlbihzZXF1ZW5jZSkgPiAyIGFuZCBcCisgICAgICAgICAgICAgICBzZXF1ZW5jZVs6Ml0gPT0gIjw8IiBhbmQgc2VxdWVuY2VbLTI6XSA9PSAiPj4iIGFuZCBcCisgICAgICAgICAgICAgICBzZXF1ZW5jZSBpbiBzZWxmLl9fZXZlbnRpbmZvOgorICAgICAgICAgICAgICAgIGZ1bmMsIHRyaXBsZXRzID0gc2VsZi5fX2V2ZW50aW5mb1tzZXF1ZW5jZV0KKyAgICAgICAgICAgICAgICBpZiBmdW5jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBmb3IgdHJpcGxldCBpbiB0cmlwbGV0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19iaW5kZXJzW3RyaXBsZXRbMV1dLnVuYmluZCh0cmlwbGV0LCBmdW5jKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZXZlbnRpbmZvW3NlcXVlbmNlXVswXSA9IE5vbmUKKyAgICAgICAgICAgIHJldHVybiB3aWRnZXQudW5iaW5kKHNlbGYsIHNlcXVlbmNlLCBmdW5jaWQpCisKKyAgICAgICAgZGVmIGV2ZW50X2FkZChzZWxmLCB2aXJ0dWFsLCAqc2VxdWVuY2VzKToKKyAgICAgICAgICAgICNwcmludCAiZXZlbnRfYWRkKCVzLCVzKSB3YXMgY2FsbGVkIiUocmVwcih2aXJ0dWFsKSxyZXByKHNlcXVlbmNlcykpCisgICAgICAgICAgICBpZiB2aXJ0dWFsIG5vdCBpbiBzZWxmLl9fZXZlbnRpbmZvOgorICAgICAgICAgICAgICAgIHNlbGYuX19ldmVudGluZm9bdmlydHVhbF0gPSBbTm9uZSwgW11dCisKKyAgICAgICAgICAgIGZ1bmMsIHRyaXBsZXRzID0gc2VsZi5fX2V2ZW50aW5mb1t2aXJ0dWFsXQorICAgICAgICAgICAgZm9yIHNlcSBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgdHJpcGxldCA9IF9wYXJzZV9zZXF1ZW5jZShzZXEpCisgICAgICAgICAgICAgICAgaWYgdHJpcGxldCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAjcHJpbnQgPj4gc3lzLnN0ZGVyciwgIlNlcS4gJXMgd2FzIGFkZGVkIGJ5IFRraW50ZXIuIiVzZXEKKyAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LmV2ZW50X2FkZChzZWxmLCB2aXJ0dWFsLCBzZXEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZnVuYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19iaW5kZXJzW3RyaXBsZXRbMV1dLmJpbmQodHJpcGxldCwgZnVuYykKKyAgICAgICAgICAgICAgICAgICAgdHJpcGxldHMuYXBwZW5kKHRyaXBsZXQpCisKKyAgICAgICAgZGVmIGV2ZW50X2RlbGV0ZShzZWxmLCB2aXJ0dWFsLCAqc2VxdWVuY2VzKToKKyAgICAgICAgICAgIGlmIHZpcnR1YWwgbm90IGluIHNlbGYuX19ldmVudGluZm86CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBmdW5jLCB0cmlwbGV0cyA9IHNlbGYuX19ldmVudGluZm9bdmlydHVhbF0KKyAgICAgICAgICAgIGZvciBzZXEgaW4gc2VxdWVuY2VzOgorICAgICAgICAgICAgICAgIHRyaXBsZXQgPSBfcGFyc2Vfc2VxdWVuY2Uoc2VxKQorICAgICAgICAgICAgICAgIGlmIHRyaXBsZXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50ID4+IHN5cy5zdGRlcnIsICJTZXEuICVzIHdhcyBkZWxldGVkIGJ5IFRraW50ZXIuIiVzZXEKKyAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LmV2ZW50X2RlbGV0ZShzZWxmLCB2aXJ0dWFsLCBzZXEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZnVuYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19iaW5kZXJzW3RyaXBsZXRbMV1dLnVuYmluZCh0cmlwbGV0LCBmdW5jKQorICAgICAgICAgICAgICAgICAgICB0cmlwbGV0cy5yZW1vdmUodHJpcGxldCkKKworICAgICAgICBkZWYgZXZlbnRfaW5mbyhzZWxmLCB2aXJ0dWFsPU5vbmUpOgorICAgICAgICAgICAgaWYgdmlydHVhbCBpcyBOb25lIG9yIHZpcnR1YWwgbm90IGluIHNlbGYuX19ldmVudGluZm86CisgICAgICAgICAgICAgICAgcmV0dXJuIHdpZGdldC5ldmVudF9pbmZvKHNlbGYsIHZpcnR1YWwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiB0dXBsZShtYXAoX3RyaXBsZXRfdG9fc2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZXZlbnRpbmZvW3ZpcnR1YWxdWzFdKSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldC5ldmVudF9pbmZvKHNlbGYsIHZpcnR1YWwpCisKKyAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICBmb3IgdmlydHVhbCBpbiBzZWxmLl9fZXZlbnRpbmZvOgorICAgICAgICAgICAgICAgIGZ1bmMsIHRyaXBsZXRzID0gc2VsZi5fX2V2ZW50aW5mb1t2aXJ0dWFsXQorICAgICAgICAgICAgICAgIGlmIGZ1bmM6CisgICAgICAgICAgICAgICAgICAgIGZvciB0cmlwbGV0IGluIHRyaXBsZXRzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2JpbmRlcnNbdHJpcGxldFsxXV0udW5iaW5kKHRyaXBsZXQsIGZ1bmMpCisKKworICAgIF9tdWx0aWNhbGxfZGljdFt3aWRnZXRdID0gTXVsdGlDYWxsCisgICAgcmV0dXJuIE11bHRpQ2FsbAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICMgVGVzdAorICAgIHJvb3QgPSBUa2ludGVyLlRrKCkKKyAgICB0ZXh0ID0gTXVsdGlDYWxsQ3JlYXRvcihUa2ludGVyLlRleHQpKHJvb3QpCisgICAgdGV4dC5wYWNrKCkKKyAgICBkZWYgYmluZHNlcShzZXEsIG49WzBdKToKKyAgICAgICAgZGVmIGhhbmRsZXIoZXZlbnQpOgorICAgICAgICAgICAgcHJpbnQgc2VxCisgICAgICAgIHRleHQuYmluZCgiPDxoYW5kbGVyJWQ+PiIlblswXSwgaGFuZGxlcikKKyAgICAgICAgdGV4dC5ldmVudF9hZGQoIjw8aGFuZGxlciVkPj4iJW5bMF0sIHNlcSkKKyAgICAgICAgblswXSArPSAxCisgICAgYmluZHNlcSgiPEtleT4iKQorICAgIGJpbmRzZXEoIjxDb250cm9sLUtleT4iKQorICAgIGJpbmRzZXEoIjxBbHQtS2V5LWE+IikKKyAgICBiaW5kc2VxKCI8Q29udHJvbC1LZXktYT4iKQorICAgIGJpbmRzZXEoIjxBbHQtQ29udHJvbC1LZXktYT4iKQorICAgIGJpbmRzZXEoIjxLZXktYj4iKQorICAgIGJpbmRzZXEoIjxDb250cm9sLUJ1dHRvbi0xPiIpCisgICAgYmluZHNlcSgiPEFsdC1CdXR0b24tMT4iKQorICAgIGJpbmRzZXEoIjxGb2N1c091dD4iKQorICAgIGJpbmRzZXEoIjxFbnRlcj4iKQorICAgIGJpbmRzZXEoIjxMZWF2ZT4iKQorICAgIHJvb3QubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpQ2FsbC5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlDYWxsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjYxMTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpQ2FsbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpQ2FsbC5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlDYWxsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTQzZmNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpQ2FsbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpU3RhdHVzQmFyLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpU3RhdHVzQmFyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZTJkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHkKQEAgLTAsMCArMSwzMiBAQAorZnJvbSBUa2ludGVyIGltcG9ydCAqCisKK2NsYXNzIE11bHRpU3RhdHVzQmFyKEZyYW1lKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgIGlmIG1hc3RlciBpcyBOb25lOgorICAgICAgICAgICAgbWFzdGVyID0gVGsoKQorICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICoqa3cpCisgICAgICAgIHNlbGYubGFiZWxzID0ge30KKworICAgIGRlZiBzZXRfbGFiZWwoc2VsZiwgbmFtZSwgdGV4dD0nJywgc2lkZT1MRUZUKToKKyAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5sYWJlbHM6CisgICAgICAgICAgICBsYWJlbCA9IExhYmVsKHNlbGYsIGJkPTEsIHJlbGllZj1TVU5LRU4sIGFuY2hvcj1XKQorICAgICAgICAgICAgbGFiZWwucGFjayhzaWRlPXNpZGUpCisgICAgICAgICAgICBzZWxmLmxhYmVsc1tuYW1lXSA9IGxhYmVsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYWJlbCA9IHNlbGYubGFiZWxzW25hbWVdCisgICAgICAgIGxhYmVsLmNvbmZpZyh0ZXh0PXRleHQpCisKK2RlZiBfdGVzdCgpOgorICAgIGIgPSBGcmFtZSgpCisgICAgYyA9IFRleHQoYikKKyAgICBjLnBhY2soc2lkZT1UT1ApCisgICAgYSA9IE11bHRpU3RhdHVzQmFyKGIpCisgICAgYS5zZXRfbGFiZWwoIm9uZSIsICJoZWxsbyIpCisgICAgYS5zZXRfbGFiZWwoInR3byIsICJ3b3JsZCIpCisgICAgYS5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpCisgICAgYi5wYWNrKCkKKyAgICBiLm1haW5sb29wKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpU3RhdHVzQmFyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDIzMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpU3RhdHVzQmFyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpU3RhdHVzQmFyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDIzMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpU3RhdHVzQmFyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvTkVXUy50eHQgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvTkVXUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhYjA4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ORVdTLnR4dApAQCAtMCwwICsxLDc4MCBAQAorV2hhdCdzIE5ldyBpbiBJRExFIDIuNy41PworPT09PT09PT09PT09PT09PT09PT09PT09PQorCistIElzc3VlICMxNzM5MDogRGlzcGxheSBQeXRob24gdmVyc2lvbiBvbiBJZGxlIHRpdGxlIGJhci4KKyAgSW5pdGlhbCBwYXRjaCBieSBFZG1vbmQgQnVybmV0dC4KKworCitXaGF0J3MgTmV3IGluIElETEUgMi43LjQ/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKy0gSXNzdWUgIzE1MzE4OiBQcmV2ZW50IHdyaXRpbmcgdG8gc3lzLnN0ZGluLgorCistIElzc3VlICMxMzUzMiwgIzE1MzE5OiBDaGVjayB0aGF0IGFyZ3VtZW50cyB0byBzeXMuc3Rkb3V0LndyaXRlIGFyZSBzdHJpbmdzLgorCistIElzc3VlICMgMTI1MTA6IEF0dGVtcHQgdG8gZ2V0IGNlcnRhaW4gdG9vbCB0aXBzIG5vIGxvbmdlciBjcmFzaGVzIElETEUuCisKKy0gSXNzdWUxMDM2NTogRmlsZSBvcGVuIGRpYWxvZyBub3cgd29ya3MgaW5zdGVhZCBvZiBjcmFzaGluZyBldmVuIHdoZW4KKyAgcGFyZW50IHdpbmRvdyBpcyBjbG9zZWQgd2hpbGUgZGlhbG9nIGlzIG9wZW4uCisKKy0gSXNzdWUgMTQ4NzY6IHVzZSB1c2VyLXNlbGVjdGVkIGZvbnQgZm9yIGhpZ2hsaWdodCBjb25maWd1cmF0aW9uLgorCistIElzc3VlICMxNDAxODogVXBkYXRlIGNoZWNrcyBmb3IgdW5zdGFibGUgc3lzdGVtIFRjbC9UayB2ZXJzaW9ucyBvbiBPUyBYCisgIHRvIGluY2x1ZGUgdmVyc2lvbnMgc2hpcHBlZCB3aXRoIE9TIFggMTAuNyBhbmQgMTAuOCBpbiBhZGRpdGlvbiB0byAxMC42LgorCistIElzc3VlICMxNTg1MzogUHJldmVudCBJRExFIGNyYXNoIG9uIE9TIFggd2hlbiBvcGVuaW5nIFByZWZlcmVuY2VzIG1lbnUKKyAgd2l0aCBjZXJ0YWluIHZlcnNpb25zIG9mIFRrIDguNS4gIEluaXRpYWwgcGF0Y2ggYnkgS2V2aW4gV2FsemVyLgorCisKK1doYXQncyBOZXcgaW4gSURMRSAyLjcuMz8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworLSBJc3N1ZSAjMTQ0MDk6IElETEUgbm93IHByb3Blcmx5IGV4ZWN1dGVzIGNvbW1hbmRzIGluIHRoZSBTaGVsbCB3aW5kb3cKKyAgd2hlbiBpdCBjYW5ub3QgcmVhZCB0aGUgbm9ybWFsIGNvbmZpZyBmaWxlcyBvbiBzdGFydHVwIGFuZAorICBoYXMgdG8gdXNlIHRoZSBidWlsdC1pbiBkZWZhdWx0IGtleSBiaW5kaW5ncy4KKyAgVGhlcmUgd2FzIHByZXZpb3VzbHkgYSBidWcgaW4gb25lIG9mIHRoZSBkZWZhdWx0cy4KKworLSBJc3N1ZSAjMzU3MzogSURMRSBoYW5ncyB3aGVuIHBhc3NpbmcgaW52YWxpZCBjb21tYW5kIGxpbmUgYXJncworICAoZGlyZWN0b3J5KGllcykgaW5zdGVhZCBvZiBmaWxlKHMpKS4KKworCitXaGF0J3MgTmV3IGluIElETEUgMi43LjI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDI5LU1heS0yMDExKgorCistIElzc3VlICM2Mzc4OiBGdXJ0aGVyIGFkanVzdCBpZGxlLmJhdCB0byBzdGFydCBhc3NvY2lhdGVkIFB5dGhvbgorCistIElzc3VlICMxMTg5NjogU2F2ZSBvbiBDbG9zZSBmYWlsZWQgZGVzcGl0ZSBzZWxlY3RpbmcgIlllcyIgaW4gZGlhbG9nLgorCistIDxIb21lPiB0b2dnbGUgZmFpbGluZyBvbiBUayA4LjUsIGNhdXNpbmcgSURMRSBleGl0cyBhbmQgc3RyYW5nZSBzZWxlY3Rpb24KKyAgYmVoYXZpb3IuIElzc3VlIDQ2NzYuICBJbXByb3ZlIHNlbGVjdGlvbiBleHRlbnNpb24gYmVoYXZpb3VyLgorCistIDxIb21lPiB0b2dnbGUgbm9uLWZ1bmN0aW9uYWwgd2hlbiBOdW1Mb2NrIHNldCBvbiBXaW5kb3dzLiAgSXNzdWUgMzg1MS4KKworCitXaGF0J3MgTmV3IGluIElETEUgMi43PworPT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMDctMDMtMjAxMCoKKworLSBpZGxlLnB5IG1vZGlmaWVkIGFuZCBzaW1wbGlmaWVkIHRvIGJldHRlciBzdXBwb3J0IGRldmVsb3BpbmcgZXhwZXJpbWVudGFsCisgIHZlcnNpb25zIG9mIElETEUgd2hpY2ggYXJlIG5vdCBpbnN0YWxsZWQgaW4gdGhlIHN0YW5kYXJkIGxvY2F0aW9uLgorCistIE91dHB1dFdpbmRvdy9QeVNoZWxsIHJpZ2h0IGNsaWNrIG1lbnUgIkdvIHRvIGZpbGUvbGluZSIgd2Fzbid0IHdvcmtpbmcgd2l0aAorICBmaWxlIHBhdGhzIGNvbnRhaW5pbmcgc3BhY2VzLiAgQnVnIDU1NTkuCisKKy0gV2luZG93czogVmVyc2lvbiBzdHJpbmcgZm9yIHRoZSAuY2htIGhlbHAgZmlsZSBjaGFuZ2VkLCBmaWxlIG5vdCBiZWluZworICBhY2Nlc3NlZCAgUGF0Y2ggNTc4MyBHdWlsaGVybWUgUG9sbworCistIEFsbG93IG11bHRpcGxlIElETEUgR1VJL3N1YnByb2Nlc3MgcGFpcnMgdG8gZXhpc3Qgc2ltdWx0YW5lb3VzbHkuIFRoYW5rcyB0bworICBEYXZpZCBTY2hlcmVyIGZvciBzdWdnZXN0aW5nIHRoZSB1c2Ugb2YgYW4gZXBoZW1lcmFsIHBvcnQgZm9yIHRoZSBHVUkuCisgIFBhdGNoIDE1MjkxNDIgV2VlYmxlLgorCistIFJlbW92ZSBwb3J0IHNwZWMgZnJvbSBydW4ucHkgYW5kIGZpeCBidWcgd2hlcmUgc3VicHJvY2VzcyBmYWlscyB0bworICBleHRyYWN0IHBvcnQgZnJvbSBjb21tYW5kIGxpbmUgd2hlbiB3YXJuaW5ncyBhcmUgcHJlc2VudC4KKworLSBUayA4LjUgVGV4dCB3aWRnZXQgcmVxdWlyZXMgJ3dvcmRwcm9jZXNzb3InIHRhYnN0eWxlIGF0dHIgdG8gaGFuZGxlCisgIG1peGVkIHNwYWNlL3RhYiBwcm9wZXJseS4gSXNzdWUgNTEyOSwgcGF0Y2ggYnkgR3VpbGhlcm1lIFBvbG8uCisKKy0gSXNzdWUgIzM1NDk6IE9uIE1hY09TIHRoZSBwcmVmZXJlbmNlcyBtZW51IHdhcyBub3QgcHJlc2VudAorCisKK1doYXQncyBOZXcgaW4gSURMRSAyLjY/Cis9PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwMS1PY3QtMjAwOCoKKworLSBJc3N1ZSAjMjY2NTogT24gV2luZG93cywgYW4gSURMRSBpbnN0YWxsYXRpb24gdXBncmFkZWQgZnJvbSBhbiBvbGQgdmVyc2lvbgorICB3b3VsZCBub3Qgc3RhcnQgaWYgYSBjdXN0b20gdGhlbWUgd2FzIGRlZmluZWQuCisKKy0gSG9tZSAvIENvbnRyb2wtQSB0b2dnbGVzIGJldHdlZW4gbGVmdCBtYXJnaW4gYW5kIGVuZCBvZiBsZWFkaW5nIHdoaXRlCisgIHNwYWNlLiAgUGF0Y2ggMTE5NjkwMyBKZWZmIFNodXRlLgorCistIEltcHJvdmVkIEF1dG9Db21wbGV0ZVdpbmRvdyBsb2dpYy4gIFBhdGNoIDIwNjIgVGFsIEVpbmF0LgorCistIEF1dG9jb21wbGV0aW9uIG9mIGZpbGVuYW1lcyBub3cgc3VwcG9ydCBhbHRlcm5hdGUgc2VwYXJhdG9ycywgZS5nLiB0aGUKKyAgJy8nIGNoYXIgb24gV2luZG93cy4gIFBhdGNoIDIwNjEgVGFsIEVpbmF0LgorCitXaGF0J3MgTmV3IGluIElETEUgMi42YTE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDI5LUZlYi0yMDA4KgorCistIENvbmZpZ3VyZWQgc2VsZWN0aW9uIGhpZ2hsaWdodGluZyBjb2xvcnMgd2VyZSBpZ25vcmVkOyB1cGRhdGluZyBoaWdobGlnaHRpbmcKKyAgaW4gdGhlIGNvbmZpZyBkaWFsb2cgd291bGQgY2F1c2Ugbm9uLVB5dGhvbiBmaWxlcyB0byBiZSBjb2xvcmVkIGFzIGlmIHRoZXkKKyAgd2VyZSBQeXRob24gc291cmNlOyBpbXByb3ZlIHVzZSBvZiBDb2xvckRlbGFnYXRvci4gIFBhdGNoIDEzMzQuIFRhbCBFaW5hdC4KKworLSBTY3JpcHRCaW5kaW5nIGV2ZW50IGhhbmRsZXJzIHdlcmVuJ3QgcmV0dXJuaW5nICdicmVhaycuIFBhdGNoIDIwNTAsIFRhbCBFaW5hdC4KKworLSBUaGVyZSB3YXMgYW4gZXJyb3Igb24gZXhpdCBpZiBubyBzeXMuZXhpdGZ1bmMgd2FzIGRlZmluZWQuIElzc3VlIDE2NDcuCisKKy0gQ291bGQgbm90IG9wZW4gZmlsZXMgaW4gLmlkbGVyYyBkaXJlY3RvcnkgaWYgbGF0dGVyIHdhcyBoaWRkZW4gb24gV2luZG93cy4KKyAgSXNzdWUgMTc0MywgSXNzdWUgMTg2Mi4KKworLSBDb25maWd1cmUgRGlhbG9nOiBpbXByb3ZlZCBsYXlvdXQgZm9yIGtleWJpbmRpbmcuICBQYXRjaCAxNDU3IFRhbCBFaW5hdC4KKworLSB0YWJwYWdlLnB5IHVwZGF0ZWQ6IHRhYmJlZFBhZ2VzLnB5IG5vdyBzdXBwb3J0cyBtdWx0aXBsZSBkeW5hbWljIHJvd3MKKyAgb2YgdGFicy4gIFBhdGNoIDE2MTI3NDYgVGFsIEVpbmF0LgorCistIEFkZCBjb25maXJtYXRpb24gZGlhbG9nIGJlZm9yZSBwcmludGluZy4gIFBhdGNoIDE3MTcxNzAgVGFsIEVpbmF0LgorCistIFNob3cgcGFzdGUgcG9zaXRpb24gaWYgPiA4MCBjb2wuICBQYXRjaCAxNjU5MzI2IFRhbCBFaW5hdC4KKworLSBVcGRhdGUgY3Vyc29yIGNvbG9yIHdpdGhvdXQgcmVzdGFydGluZy4gIFBhdGNoIDE3MjU1NzYgVGFsIEVpbmF0LgorCistIEFsbG93IGtleWJvYXJkIGludGVycnVwdCBvbmx5IHdoZW4gdXNlciBjb2RlIGlzIGV4ZWN1dGluZyBpbiBzdWJwcm9jZXNzLgorICBQYXRjaCAxMjI1IFRhbCBFaW5hdCAocmV3b3JrZWQgZnJvbSBJRExFLVNwb29uKS4KKworLSBjb25maWdEaWFsb2cgY2xlYW51cC4gUGF0Y2ggMTczMDIxNyBUYWwgRWluYXQuCisKKy0gdGV4dFZpZXcgY2xlYW51cC4gUGF0Y2ggMTcxODA0MyBUYWwgRWluYXQuCisKKy0gQ2xlYW4gdXAgRWRpdG9yV2luZG93IGNsb3NlLgorCistIFBhdGNoIDE2OTMyNTg6IEZpeCBmb3IgZHVwbGljYXRlICJwcmVmZXJlbmNlcyIgbWVudS1PUyBYLiBCYWNrcG9ydCBvZiByNTYyMDQuCisKKy0gT1NYOiBBdm9pZCBjcmFzaCBmb3IgdGhvc2UgdmVyc2lvbnMgb2YgVGNsL1RrIHdoaWNoIGRvbid0IGhhdmUgYSBjb25zb2xlCisKKy0gQnVnIGluIGlkbGVsaWIuTXVsdGlDYWxsOiBPcHRpb25zIGRpYWxvZyB3YXMgY3Jhc2hpbmcgSURMRSBpZiB0aGVyZSB3YXMgYW4KKyAgb3B0aW9uIGluIGNvbmZpZy1leHRlbnNpb25zIHcvbyBhIHZhbHVlLiBQYXRjaCAjMTY3MjQ4MSwgVGFsIEVpbmF0CisKKy0gQ29ycmVjdGVkIHNvbWUgYnVncyBpbiBBdXRvQ29tcGxldGUuICBBbHNvLCBQYWdlIFVwL0Rvd24gaW4gQUNXIGltcGxlbWVudGVkOworICBtb3VzZSBhbmQgY3Vyc29yIHNlbGVjdGlvbiBpbiBBQ1dpbmRvdyBpbXBsZW1lbnRlZDsgZG91YmxlIFRhYiBpbnNlcnRzCisgIGN1cnJlbnQgc2VsZWN0aW9uIGFuZCBjbG9zZXMgQUNXIChzaW1pbGFyIHRvIGRvdWJsZS1jbGljayBhbmQgUmV0dXJuKTsgc2Nyb2xsCisgIHdoZWVsIG5vdyB3b3JrcyBpbiBBQ1cuICBBZGRlZCBBdXRvQ29tcGxldGUgaW5zdHJ1Y3Rpb25zIHRvIElETEUgSGVscC4KKworLSBBdXRvQ29tcGxldGVXaW5kb3cgbW92ZWQgYmVsb3cgaW5wdXQgbGluZSwgd2lsbCBtb3ZlIGFib3ZlIGlmIHRoZXJlCisgIGlzbid0IGVub3VnaCBzcGFjZS4gIFBhdGNoIDE2MjEyNjUgVGFsIEVpbmF0CisKKy0gQ2FsbHRpcHMgbm93ICdoYW5kbGUnIHR1cGxlcyBpbiB0aGUgYXJndW1lbnQgbGlzdCAoZGlzcGxheSAnPHR1cGxlPicgOikKKyAgU3VnZ2VzdGVkIHNvbHV0aW9uIGJ5IENocmlzdG9zIEdlb3JnaW91LCBCdWcgNzkxOTY4LgorCistIEFkZCAncmF3JyBzdXBwb3J0IHRvIGNvbmZpZ0hhbmRsZXIuIFBhdGNoIDE2NTAxNzQgVGFsIEVpbmF0LgorCistIEF2b2lkIGhhbmcgd2hlbiBlbmNvdW50ZXJpbmcgYSBkdXBsaWNhdGUgaW4gYSBjb21wbGV0aW9uIGxpc3QuIEJ1ZyAxNTcxMTEyLgorCistIFBhdGNoICMxMzYyOTc1OiBSZXdvcmsgQ29kZUNvbnRleHQgaW5kZW50YXRpb24gYWxnb3JpdGhtIHRvCisgIGF2b2lkIGhhcmQtY29kaW5nIHBpeGVsIHdpZHRocy4KKworLSBCdWcgIzgxMzM0MjogU3RhcnQgdGhlIElETEUgc3VicHJvY2VzcyB3aXRoIC1RbmV3IGlmIHRoZSBwYXJlbnQKKyAgaXMgc3RhcnRlZCB3aXRoIHRoYXQgb3B0aW9uLgorCistIEhvbm9yIHRoZSAiQ2FuY2VsIiBhY3Rpb24gaW4gdGhlIHNhdmUgZGlhbG9nIChEZWJpYW4gYnVnICMyOTkwOTIpCisKKy0gU29tZSBzeW50YXggZXJyb3JzIHdlcmUgYmVpbmcgY2F1Z2h0IGJ5IHRva2VuaXplIGR1cmluZyB0aGUgdGFibmFubnkKKyAgY2hlY2ssIHJlc3VsdGluZyBpbiBvYnNjdXJlIGVycm9yIG1lc3NhZ2VzLiAgRG8gdGhlIHN5bnRheCBjaGVjaworICBmaXJzdC4gIEJ1ZyAxNTYyNzE2LCAxNTYyNzE5CisKKy0gSURMRSdzIHZlcnNpb24gbnVtYmVyIHRha2VzIGEgYmlnIGp1bXAgdG8gbWF0Y2ggdGhlIHZlcnNpb24gbnVtYmVyIG9mCisgIHRoZSBQeXRob24gcmVsZWFzZSBvZiB3aGljaCBpdCdzIGEgcGFydC4KKworCitXaGF0J3MgTmV3IGluIElETEUgMS4yPworPT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMTktU0VQLTIwMDYqCisKKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMmMxPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAxNy1BVUctMjAwNioKKworLSBGaWxlIG1lbnUgaG90a2V5czogdGhlcmUgd2VyZSB0aHJlZSAncCcgYXNzaWdubWVudHMuICBSZWFzc2lnbiB0aGUKKyAgJ1NhdmUgQ29weSBBcycgYW5kICdQcmludCcgaG90a2V5cyB0byAneScgYW5kICd0Jy4gIENoYW5nZSB0aGUKKyAgU2hlbGwgaG90a2V5IGZyb20gJ3MnIHRvICdsJy4KKworLSBJRExFIGhvbm9ycyBuZXcgcXVpdCgpIGFuZCBleGl0KCkgY29tbWFuZHMgZnJvbSBzaXRlLnB5IFF1aXR0ZXIoKSBvYmplY3QuCisgIFBhdGNoIDE1NDA4OTIsIEppbSBKZXdldHQKKworLSBUaGUgJ3dpdGgnIHN0YXRlbWVudCBpcyBub3cgYSBDb2RlIENvbnRleHQgYmxvY2sgb3BlbmVyLgorICBQYXRjaCAxNTQwODUxLCBKaW0gSmV3ZXR0CisKKy0gUmV0cmlldmFsIG9mIHByZXZpb3VzIHNoZWxsIGNvbW1hbmQgd2FzIG5vdCBhbHdheXMgcHJlc2VydmluZyBpbmRlbnRhdGlvbgorICAoc2luY2UgMS4yYTEpIFBhdGNoIDE1Mjg0NjggVGFsIEVpbmF0LgorCistIENoYW5naW5nIHRva2VuaXplICgzOTA0NikgdG8gZGV0ZWN0IGRlZGVudCBicm9rZSB0YWJuYW5ueSBjaGVjayAoc2luY2UgMS4yYTEpCisKKy0gVG9nZ2xlVGFiIGRpYWxvZyB3YXMgc2V0dGluZyBpbmRlbnQgdG8gOCBldmVuIGlmIGNhbmNlbGxlZCAoc2luY2UgMS4yYTEpLgorCistIFdoZW4gdXNlZCB3L28gc3VicHJvY2VzcywgYWxsIGV4Y2VwdGlvbnMgd2VyZSBwcmVjZWRlZCBieSBhbiBlcnJvcgorICBtZXNzYWdlIGNsYWltaW5nIHRoZXkgd2VyZSBJRExFIGludGVybmFsIGVycm9ycyAoc2luY2UgMS4yYTEpLgorCitXaGF0J3MgTmV3IGluIElETEUgMS4yYjM/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDAzLUFVRy0yMDA2KgorCistIEJ1ZyAjMTUyNTgxNzogRG9uJ3QgdHJ1bmNhdGUgc2hvcnQgbGluZXMgaW4gSURMRSdzIHRvb2wgdGlwcy4KKworLSBCdWcgIzE1MTc5OTA6IElETEUga2V5YmluZGluZ3Mgb24gTWFjT1MgWCBub3cgd29yayBjb3JyZWN0bHkKKworLSBCdWcgIzE1MTc5OTY6IElETEUgbm93IGxvbmdlciBzaG93cyB0aGUgZGVmYXVsdCBUayBtZW51IHdoZW4gYQorICBwYXRoIGJyb3dzZXIsIGNsYXNzIGJyb3dzZXIgb3IgZGVidWdnZXIgaXMgdGhlIGZyb250bW9zdCB3aW5kb3cgb24gTWFjT1MgWAorCistIEVkaXRvcldpbmRvdy50ZXN0KCkgd2FzIGZhaWxpbmcuICBCdWcgMTQxNzU5OAorCistIEVkaXRvcldpbmRvdyBmYWlsZWQgd2hlbiB1c2VkIHN0YW5kLWFsb25lIGlmIHN5cy5wczEgbm90IHNldC4KKyAgQnVnIDEwMTAzNzAgRGF2ZSBGbG9yZWsKKworLSBUb29sdGlwcyBmYWlsZWQgb24gbmV3LXN5bGUgY2xhc3MgX19pbml0X18gYXJncy4gIEJ1ZyAxMDI3NTY2IExvcmVuIEd1dGhyaWUKKworLSBBdm9pZCBvY2Nhc2lvbmFsIGZhaWx1cmUgdG8gZGV0ZWN0IGNsb3NpbmcgcGFyZW4gcHJvcGVybHkuCisgIFBhdGNoIDE0MDcyODAgVGFsIEVpbmF0CisKKy0gUmViaW5kaW5nIFRhYiBrZXkgd2FzIGluc2VydGluZyAndGFiJyBpbnN0ZWFkIG9mICdUYWInLiAgQnVnIDExNzkxNjguCisKKy0gQ29sb3JpemVyIG5vdyBoYW5kbGVzICM8YnVpbHRpbj4gY29ycmVjdGx5LCBhbHNvIHVuaWNvZGUgc3RyaW5ncyBhbmQKKyAgJ2FzJyBrZXl3b3JkIGluIGNvbW1lbnQgZGlyZWN0bHkgZm9sbG93aW5nIGltcG9ydCBjb21tYW5kLiBDbG9zZXMgMTMyNTA3MS4KKyAgUGF0Y2ggMTQ3OTIxOSBUYWwgRWluYXQKKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMmIyPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAxMS1KVUwtMjAwNioKKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMmIxPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyMC1KVU4tMjAwNioKKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMmEyPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyNy1BUFItMjAwNioKKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMmExPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwNS1BUFItMjAwNioKKworLSBQYXRjaCAjMTE2MjgyNTogU3VwcG9ydCBub24tQVNDSUkgY2hhcmFjdGVycyBpbiBJRExFIHdpbmRvdyB0aXRsZXMuCisKKy0gU291cmNlIGZpbGUgZi5mbHVzaCgpIGFmdGVyIHdyaXRpbmc7IHRyeWluZyB0byBhdm9pZCBsb3NzYWdlIGlmIHVzZXIKKyAga2lsbHMgR1VJLgorCistIE9wdGlvbnMgLyBLZXlzIC8gQWR2YW5jZWQgZGlhbG9nIG1hZGUgZnVuY3Rpb25hbC4gIEFsc28sIGFsbG93IGJpbmRpbmcKKyAgb2YgJ21vdmVtZW50JyBrZXlzLgorCistICdzeW50YXgnIHBhdGNoIGFkZHMgaW1wcm92ZWQgY2FsbHRpcHMgYW5kIGEgbmV3IGNsYXNzIGF0dHJpYnV0ZSBsaXN0Ym94LgorICBNdWx0aUNhbGwgbW9kdWxlIGFsbG93cyBiaW5kaW5nIG11bHRpcGxlIGFjdGlvbnMgdG8gYW4gZXZlbnQuCisgIFBhdGNoIDkwNjcwMiBOb2FtIFJhcGhhZWwKKworLSBCZXR0ZXIgaW5kZW50YXRpb24gYWZ0ZXIgZmlyc3QgbGluZSBvZiBzdHJpbmcgY29udGludWF0aW9uLgorICBJRExFZm9yayBQYXRjaCA2ODE5OTIsIE5vYW0gUmFwaGFlbAorCistIEZpeGVkIENvZGVDb250ZXh0IGFsaWdubWVudCBwcm9ibGVtLCBmb2xsb3dpbmcgc3VnZ2VzdGlvbiBmcm9tIFRhbCBFaW5hdC4KKworLSBJbmNyZWFzZWQgcGVyZm9ybWFuY2UgaW4gQ29kZUNvbnRleHQgZXh0ZW5zaW9uICBQYXRjaCA5MzYxNjkgTm9hbSBSYXBoYWVsCisKKy0gTWFjIGxpbmUgZW5kaW5ncyB3ZXJlIGluY29ycmVjdCB3aGVuIHBhc3RpbmcgY29kZSBmcm9tIHNvbWUgYnJvd3NlcnMKKyAgd2hlbiB1c2luZyBYMTEgYW5kIHRoZSBGaW5rIGRpc3RyaWJ1dGlvbi4gIFB5dGhvbiBCdWcgMTI2MzY1Ni4KKworLSA8RW50ZXI+IHdoZW4gY3Vyc29yIGlzIG9uIGEgcHJldmlvdXMgY29tbWFuZCByZXRyaWV2ZXMgdGhhdCBjb21tYW5kLiAgSW5zdGVhZAorICBvZiByZXBsYWNpbmcgdGhlIGlucHV0IGxpbmUsIHRoZSBwcmV2aW91cyBjb21tYW5kIGlzIG5vdyBhcHBlbmRlZCB0byB0aGUKKyAgaW5wdXQgbGluZS4gSW5kZW50YXRpb24gaXMgcHJlc2VydmVkLCBhbmQgdW5kbyBpcyBlbmFibGVkLgorICBQYXRjaCAxMTk2OTE3ICBKZWZmIFNodXRlCisKKy0gQ2xhcmlmeSAidGFiL3NwYWNlIiBFcnJvciBEaWFsb2cgYW5kICJUYWIgV2lkdGgiIERpYWxvZyBhc3NvY2lhdGVkIHdpdGgKKyAgdGhlIFVudGFiaWZ5IGNvbW1hbmQuCisKKy0gQ29ycmVjdGVkICJ0YWIvc3BhY2UiIEVycm9yIERpYWxvZyB0byBzaG93IGNvcnJlY3QgbWVudSBmb3IgVW50YWJpZnkuCisgIFBhdGNoIDExOTY5ODAgSmVmZiBTaHV0ZQorCistIE5ldyBmaWxlcyBhcmUgY29sb3JpemVkIGJ5IGRlZmF1bHQsIGFuZCBjb2xvcml6aW5nIGlzIHJlbW92ZWQgd2hlbgorICBzYXZpbmcgYXMgbm9uLVB5dGhvbiBmaWxlcy4gUGF0Y2ggMTE5Njg5NSBKZWZmIFNodXRlCisgIENsb3NlcyBQeXRob24gQnVncyA3NzUwMTIgYW5kIDgwMDQzMiwgcGFydGlhbCBmaXggSURMRWZvcmsgNzYzNTI0CisKKy0gSW1wcm92ZSBzdWJwcm9jZXNzIGxpbmsgZXJyb3Igbm90aWZpY2F0aW9uLgorCistIHJ1bi5weTogdXNlIFF1ZXVlJ3MgYmxvY2tpbmcgZmVhdHVyZSBpbnN0ZWFkIG9mIHNsZWVwaW5nIGluIHRoZSBtYWluCisgIGxvb3AuICBQYXRjaCAjIDExOTAxNjMgTWljaGllbCBkZSBIb29uCisKKy0gQWRkIGNvbmZpZy1tYWluIG9wdGlvbiB0byBtYWtlIHRoZSAnaGlzdG9yeScgZmVhdHVyZSBub24tY3ljbGljLgorICBEZWZhdWx0IHJlbWFpbnMgY3ljbGljLiAgUHl0aG9uIFBhdGNoIDkxNDU0NiBOb2FtIFJhcGhhZWwuCisKKy0gUmVtb3ZlZCBhYmlsaXR5IHRvIGNvbmZpZ3VyZSB0YWJzIGluZGVudCBmcm9tIE9wdGlvbnMgZGlhbG9nLiAgVGhpcyAnZmVhdHVyZScKKyAgaGFzIG5ldmVyIHdvcmtlZCBhbmQgbm8gb25lIGhhcyBjb21wbGFpbmVkLiAgSXQgaXMgc3RpbGwgcG9zc2libGUgdG8gc2V0IGEKKyAgZGVmYXVsdCB0YWJzICh2LiBzcGFjZXMpIGluZGVudCAnbWFudWFsbHknIHZpYSBjb25maWctbWFpbi5kZWYgKG9yIHRvIHR1cm4gb24KKyAgdGFicyBmb3IgdGhlIGN1cnJlbnQgRWRpdG9yV2luZG93IHZpYSB0aGUgRm9ybWF0IG1lbnUpIGJ1dCBJRExFIHdpbGwKKyAgZW5jb3VyYWdlIGluZGVudGF0aW9uIHZpYSBzcGFjZXMuCisKKy0gRW5hYmxlIHNldHRpbmcgdGhlIGluZGVudGF0aW9uIHdpZHRoIHVzaW5nIHRoZSBPcHRpb25zIGRpYWxvZy4KKyAgQnVnICMgNzgzODc3CisKKy0gQWRkIGtleWJpbmRpbmdzIGZvciBkZWwtd29yZC1sZWZ0IGFuZCBkZWwtd29yZC1yaWdodC4KKworLSBEaXNjb3VyYWdlIHVzaW5nIGFuIGluZGVudCB3aWR0aCBvdGhlciB0aGFuIDggd2hlbiB1c2luZyB0YWJzIHRvIGluZGVudAorICBQeXRob24gY29kZS4KKworLSBSZXN0b3JlIHVzZSBvZiBFZGl0b3JXaW5kb3cuc2V0X2luZGVudGF0aW9uX3BhcmFtcygpLCB3YXMgZGVhZCBjb2RlIHNpbmNlCisgIEF1dG9pbmRlbnQgd2FzIG1lcmdlZCBpbnRvIEVkaXRvcldpbmRvdy4gIFRoaXMgYWxsb3dzIElETEUgdG8gY29uZm9ybSB0byB0aGUKKyAgaW5kZW50YXRpb24gd2lkdGggb2YgYSBsb2FkZWQgZmlsZS4gIChCdXQgaXQgc3RpbGwgd2lsbCBub3Qgc3dpdGNoIHRvIHRhYnMKKyAgZXZlbiBpZiB0aGUgZmlsZSB1c2VzIHRhYnMuKSAgQW55IGNoYW5nZSBpbiBpbmRlbnQgd2lkdGggaXMgbG9jYWwgdG8gdGhhdAorICB3aW5kb3cuCisKKy0gQWRkIFRhYm5hbm55IGNoZWNrIGJlZm9yZSBSdW4vRjUsIG5vdCBqdXN0IHdoZW4gQ2hlY2tpbmcgbW9kdWxlLgorCistIElmIGFuIGV4dGVuc2lvbiBjYW4ndCBiZSBsb2FkZWQsIHByaW50IHdhcm5pbmcgYW5kIHNraXAgaXQgaW5zdGVhZCBvZgorICBlcnJvcmluZyBvdXQuCisKKy0gSW1wcm92ZSBlcnJvciBoYW5kbGluZyB3aGVuIC5pZGxlcmMgY2FuJ3QgYmUgY3JlYXRlZCAod2FybiBhbmQgZXhpdCkuCisKKy0gVGhlIEdVSSB3YXMgaGFuZ2luZyBpZiB0aGUgc2hlbGwgd2luZG93IHdhcyBjbG9zZWQgd2hpbGUgYSByYXdfaW5wdXQoKQorICB3YXMgcGVuZGluZy4gIFJlc3RvcmVkIHRoZSBxdWl0KCkgb2YgdGhlIHJlYWRsaW5lKCkgbWFpbmxvb3AoKS4KKyAgaHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvaWRsZS1kZXYvMjAwNC1EZWNlbWJlci8wMDIzMDcuaHRtbAorCistIFRoZSByZW1vdGUgcHJvY2VkdXJlIGNhbGwgbW9kdWxlIHJwYy5weSBjYW4gbm93IGFjY2VzcyBkYXRhIGF0dHJpYnV0ZXMgb2YKKyAgcmVtb3RlIHJlZ2lzdGVyZWQgb2JqZWN0cy4gIENoYW5nZXMgdG8gdGhlc2UgYXR0cmlidXRlcyBhcmUgbG9jYWwsIGhvd2V2ZXIuCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjE/Cis9PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAzMC1OT1YtMjAwNCoKKworLSBPbiBPcGVuQlNELCB0ZXJtaW5hdGluZyBJRExFIHdpdGggY3RybC1jIGZyb20gdGhlIGNvbW1hbmQgbGluZSBjYXVzZWQgYQorICBzdHVjayBzdWJwcm9jZXNzIE1haW5UaHJlYWQgYmVjYXVzZSBvbmx5IHRoZSBTb2NrZXRUaHJlYWQgd2FzIGV4aXRpbmcuCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjFiMy9yYzE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAxOC1OT1YtMjAwNCoKKworLSBTYXZpbmcgYSBLZXlzZXQgdy9vIG1ha2luZyBjaGFuZ2VzIChieSB1c2luZyB0aGUgIlNhdmUgYXMgTmV3IEN1c3RvbSBLZXkgU2V0IgorICBidXR0b24pIGNhdXNlZCBJRExFIHRvIGZhaWwgb24gcmVzdGFydCAobm8gbmV3IGtleXNldCB3YXMgY3JlYXRlZCBpbgorICBjb25maWcta2V5cy5jZmcpLiAgQWxzbyB0cnVlIGZvciBUaGVtZS9oaWdobGlnaHRzLiAgUHl0aG9uIEJ1ZyAxMDY0NTM1LgorCistIEEgY2hhbmdlIHRvIHRoZSBsaW5lY2FjaGUucHkgQVBJIGNhdXNlZCBJRExFIHRvIGV4aXQgd2hlbiBhbiBleGNlcHRpb24gd2FzCisgIHJhaXNlZCB3aGlsZSBydW5uaW5nIHdpdGhvdXQgdGhlIHN1YnByb2Nlc3MgKC1uIHN3aXRjaCkuICBQeXRob24gQnVnIDEwNjM4NDAuCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjFiMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMDMtTk9WLTIwMDQqCisKKy0gV2hlbiBwYXJhZ3JhcGggcmVmb3JtYXQgd2lkdGggd2FzIG1hZGUgY29uZmlndXJhYmxlLCBhIGJ1ZyB3YXMKKyAgaW50cm9kdWNlZCB0aGF0IGNhdXNlZCByZWZvcm1hdHRpbmcgb2YgY29tbWVudCBibG9ja3MgdG8gaWdub3JlIGhvdworICBmYXIgdGhlIGJsb2NrIHdhcyBpbmRlbnRlZCwgZWZmZWN0aXZlbHkgYWRkaW5nIHRoZSBpbmRlbnRhdGlvbiB3aWR0aAorICB0byB0aGUgcmVmb3JtYXQgd2lkdGguICBUaGlzIGhhcyBiZWVuIHJlcGFpcmVkLCBhbmQgdGhlIHJlZm9ybWF0CisgIHdpZHRoIGlzIGFnYWluIGEgYm91bmQgb24gdGhlIHRvdGFsIHdpZHRoIG9mIHJlZm9ybWF0dGVkIGxpbmVzLgorCitXaGF0J3MgTmV3IGluIElETEUgMS4xYjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDE1LU9DVC0yMDA0KgorCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjFhMz8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMDItU0VQLTIwMDQqCisKKy0gSW1wcm92ZSBrZXlib2FyZCBmb2N1cyBiaW5kaW5nLCBlc3BlY2lhbGx5IGluIFdpbmRvd3MgbWVudS4gIEltcHJvdmUKKyAgd2luZG93IHJhaXNpbmcsIGVzcGVjaWFsbHkgaW4gdGhlIFdpbmRvd3MgbWVudSBhbmQgaW4gdGhlIGRlYnVnZ2VyLgorICBJRExFZm9yayA3NjM1MjQuCisKKy0gSWYgdXNlciBwYXNzZXMgYSBub24tZXhpc3RlbnQgZmlsZW5hbWUgb24gdGhlIGNvbW1hbmRsaW5lLCBqdXN0CisgIG9wZW4gYSBuZXcgZmlsZSwgZG9uJ3QgcmFpc2UgYSBkaWFsb2cuICBJRExFZm9yayA4NTQ5MjguCisKKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMWEyPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwNS1BVUctMjAwNCoKKworLSBFZGl0b3JXaW5kb3cucHkgd2FzIG5vdCBmaW5kaW5nIHRoZSAuY2htIGhlbHAgZmlsZSBvbiBXaW5kb3dzLiAgVHlwbworICBhdCBSZXYgMS41NC4gIFB5dGhvbiBCdWcgOTkwOTU0CisKKy0gY2hlY2tpbmcgc3lzLnBsYXRmb3JtIGZvciBzdWJzdHJpbmcgJ3dpbicgd2FzIGJyZWFraW5nIElETEUgZG9jcyBvbiBNYWMKKyAgKGRhcndpbikuICBBbHNvLCBNYWMgU2FmYXJpIGJyb3dzZXIgcmVxdWlyZXMgZnVsbCBmaWxlOi8vIFVSSXMuICBTRiA5MDA1ODAuCisKKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMWExPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwOC1KVUwtMjAwNCoKKworLSBSZWRpcmVjdCB0aGUgd2FybmluZyBzdHJlYW0gdG8gdGhlIHNoZWxsIGR1cmluZyB0aGUgU2NyaXB0QmluZGluZyBjaGVjayBvZgorICB1c2VyIGNvZGUgYW5kIGZvcm1hdCB0aGUgd2FybmluZyBzaW1pbGFybHkgdG8gYW4gZXhjZXB0aW9uIGZvciBib3RoIHRoYXQKKyAgY2hlY2sgYW5kIGZvciBydW50aW1lIHdhcm5pbmdzIHJhaXNlZCBpbiB0aGUgc3VicHJvY2Vzcy4KKworLSBDb2RlQ29udGV4dCBoaW50IHBhbmUgdmlzaWJpbGl0eSBzdGF0ZSBpcyBub3cgcGVyc2lzdGVudCBhY3Jvc3Mgc2Vzc2lvbnMuCisgIFRoZSBwYW5lIG5vIGxvbmdlciBhcHBlYXJzIGluIHRoZSBzaGVsbCB3aW5kb3cuICBBZGRlZCBjYXBhYmlsaXR5IHRvIGxpbWl0CisgIGV4dGVuc2lvbnMgdG8gc2hlbGwgd2luZG93IG9yIGVkaXRvciB3aW5kb3dzLiAgTm9hbSBSYXBoYWVsIGFkZGl0aW9uCisgIHRvIFBhdGNoIDkzNjE2OS4KKworLSBQYXJhZ3JhcGggcmVmb3JtYXQgd2lkdGggaXMgbm93IGEgY29uZmlndXJhYmxlIHBhcmFtZXRlciBpbiB0aGUKKyAgT3B0aW9ucyBHVUkuCisKKy0gTmV3IEV4dGVuc2lvbjogQ29kZUNvbnRleHQuICBQcm92aWRlcyBibG9jayBzdHJ1Y3R1cmluZyBoaW50cyBmb3IgY29kZQorICB3aGljaCBoYXMgc2Nyb2xsZWQgYWJvdmUgYW4gZWRpdCB3aW5kb3cuIFBhdGNoIDkzNjE2OSBOb2FtIFJhcGhhZWwuCisKKy0gSWYgbnVsbHMgc29tZWhvdyBnb3QgaW50byB0aGUgc3RyaW5ncyBpbiByZWNlbnQtZmlsZXMubHN0CisgIEVkaXRvcldpbmRvdy51cGRhdGVfcmVjZW50X2ZpbGVzX2xpc3QoKSB3YXMgZmFpbGluZy4gIFB5dGhvbiBCdWcgOTMxMzM2LgorCistIElmIHRoZSBub3JtYWwgYmFja2dyb3VuZCBpcyBjaGFuZ2VkIHZpYSBDb25maWd1cmUvSGlnaGxpZ2h0aW5nLCBpdCB3aWxsCisgIHVwZGF0ZSBpbW1lZGlhdGVseSwgdGhhbmtzIHRvIHRoZSBwcmV2aW91c2x5IG1lbnRpb25lZCBwYXRjaCBieSBOaWdlbCBSb3dlLgorCistIEFkZCBhIGhpZ2hsaWdodCB0aGVtZSBmb3IgYnVpbHRpbiBrZXl3b3Jkcy4gIFB5dGhvbiBQYXRjaCA4MDU4MzAgTmlnZWwgUm93ZQorICBUaGlzIGFsc28gZml4ZWQgSURMRWZvcmsgYnVnIFsgNjkzNDE4IF0gTm9ybWFsIHRleHQgYmFja2dyb3VuZCBjb2xvciBub3QKKyAgcmVmcmVzaGVkIGFuZCBQeXRob24gYnVnIFs4OTc4NzIgXSBVbmtub3duIGNvbG9yIG5hbWUgb24gSFAtVVgKKworLSBycGMucHk6U29ja2V0SU8gLSBMYXJnZSBtb2R1bGVzIHdlcmUgZ2VuZXJhdGluZyBsYXJnZSBwaWNrbGVzIHdoZW4gZG93bmxvYWRlZAorICB0byB0aGUgZXhlY3V0aW9uIHNlcnZlci4gIFRoZSByZXR1cm4gb2YgdGhlIE9LIHJlc3BvbnNlIGZyb20gdGhlIHN1YnByb2Nlc3MKKyAgaW5pdGlhbGl6YXRpb24gd2FzIGludGVyZmVyaW5nIGFuZCBjYXVzaW5nIHRoZSBzZW5kaW5nIHNvY2tldCB0byBiZSBub3QKKyAgcmVhZHkuICBBZGQgYW4gSU8gcmVhZHkgdGVzdCB0byBmaXggdGhpcy4gIE1vdmVkIHRoZSBwb2xsaW5nIElPIHJlYWR5IHRlc3QKKyAgaW50byBwb2xscGFja2V0KCkuCisKKy0gRml4IHR5cG8gaW4gcnBjLnB5LCBzL2IgInBpY2tsZS5QaWNrbGluZ0Vycm9yIiBub3QgInBpY2tsZS5VbnBpY2tsaW5nRXJyb3IiLgorCistIEFkZGVkIGEgVGsgZXJyb3IgZGlhbG9nIHRvIHJ1bi5weSBpbmZvcm0gdGhlIHVzZXIgaWYgdGhlIHN1YnByb2Nlc3MgY2FuJ3QKKyAgY29ubmVjdCB0byB0aGUgdXNlciBHVUkgcHJvY2Vzcy4gIEFkZGVkIGEgdGltZW91dCB0byB0aGUgR1VJJ3MgbGlzdGVuaW5nCisgIHNvY2tldC4gIEFkZGVkIFRrIGVycm9yIGRpYWxvZ3MgdG8gUHlTaGVsbC5weSB0byBhbm5vdW5jZSBhIGZhaWx1cmUgdG8gYmluZAorICB0aGUgcG9ydCBvciBjb25uZWN0IHRvIHRoZSBzdWJwcm9jZXNzLiAgQ2xlYW4gdXAgZXJyb3IgaGFuZGxpbmcgZHVyaW5nCisgIGNvbm5lY3Rpb24gaW5pdGlhdGlvbiBwaGFzZS4gIFRoaXMgaXMgYW4gdXBkYXRlIG9mIFB5dGhvbiBQYXRjaCA3NzgzMjMuCisKKy0gUHJpbnQgY29ycmVjdCBleGNlcHRpb24gZXZlbiBpZiBzb3VyY2UgZmlsZSBjaGFuZ2VkIHNpbmNlIHNoZWxsIHdhcworICByZXN0YXJ0ZWQuICBJRExFZm9yayBQYXRjaCA4NjkwMTIgTm9hbSBSYXBoYWVsCisKKy0gS2V5YmluZGluZ3Mgd2l0aCB0aGUgU2hpZnQgbW9kaWZpZXIgbm93IHdvcmsgY29ycmVjdGx5LiAgU28gZG8gYmluZGluZ3Mgd2hpY2gKKyAgdXNlIHRoZSBTcGFjZSBrZXkuICBMaW1pdCB1bm1vZGlmaWVkIHVzZXIga2V5YmluZGluZ3MgdG8gdGhlIGZ1bmN0aW9uIGtleXMuCisgIFB5dGhvbiBCdWcgNzc1MzUzLCBJRExFZm9yayBCdWdzIDc1NTY0NywgNzYxNTU3CisKKy0gQWZ0ZXIgYW4gZXhjZXB0aW9uLCBydW4ucHkgd2FzIG5vdCBzZXR0aW5nIHRoZSBleGNlcHRpb24gdmVjdG9yLiBOb2FtCisgIFJhcGhhZWwgc3VnZ2VzdGVkIGNvcnJlY3RpbmcgdGhpcyBzbyBwZGIncyBwb3N0bW9ydGVtIHBtKCkgd291bGQgd29yay4KKyAgSURMRWZvcmsgUGF0Y2ggODQ0Njc1CisKKy0gSURMRSBub3cgZG9lcyBub3QgZmFpbCB0byBzYXZlIHRoZSBmaWxlIGFueW1vcmUgaWYgdGhlIFRrIGJ1ZmZlciBpcyBub3QgYQorICBVbmljb2RlIHN0cmluZywgeWV0IGVvbF9jb252ZW50aW9uIGlzLiAgUHl0aG9uIEJ1Z3MgNzc0NjgwLCA3ODgzNzgKKworLSBJRExFIGRpZG4ndCBzdGFydCBjb3JyZWN0bHkgd2hlbiBQeXRob24gd2FzIGluc3RhbGxlZCBpbiAiUHJvZ3JhbSBGaWxlcyIgb24KKyAgVzJLIGFuZCBYUC4gIFB5dGhvbiBCdWdzIDc4MDQ1MSwgNzg0MTgzCisKKy0gY29uZmlnLW1haW4uZGVmIGRvY3VtZW50YXRpb24gaW5jb3JyZWN0bHkgcmVmZXJyZWQgdG8gaWRsZS0gaW5zdGVhZCBvZgorICBjb25maWctICBmaWxlbmFtZXMuICBTRiA3ODI3NTkgIEFsc28gYWRkZWQgbm90ZSBhYm91dCAuaWRsZXJjIGxvY2F0aW9uLgorCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjA/Cis9PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyOS1KdWwtMjAwMyoKKworLSBBZGRlZCBhIGJhbm5lciB0byB0aGUgc2hlbGwgZGlzY3Vzc2luZyB3YXJuaW5ncyBwb3NzaWJseSByYWlzZWQgYnkgcGVyc29uYWwKKyAgZmlyZXdhbGwgc29mdHdhcmUuICBBZGRlZCBzYW1lIGNvbW1lbnQgdG8gUkVBRE1FLnR4dC4KKworCitXaGF0J3MgTmV3IGluIElETEUgMS4wIHJlbGVhc2UgY2FuZGlkYXRlIDI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDI0LUp1bC0yMDAzKgorCistIENhbGx0aXAgZXJyb3Igd2hlbiBkb2NzdHJpbmcgd2FzIE5vbmUgIFB5dGhvbiBCdWcgNzc1NTQxCisKKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMCByZWxlYXNlIGNhbmRpZGF0ZSAxPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAxOC1KdWwtMjAwMyoKKworLSBVcGRhdGVkIGV4dGVuZC50eHQsIGhlbHAudHh0LCBhbmQgY29uZmlnLWV4dGVuc2lvbnMuZGVmIHRvIGNvcnJlY3RseQorICByZWZsZWN0IHRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgY29uZmlndXJhdGlvbiBzeXN0ZW0uICBQeXRob24gQnVnIDc2ODQ2OQorCistIEZpeGVkOiBDYWxsIFRpcCBUcmltbWluZyBNYXkgTG9vcCBGb3JldmVyLiBQeXRob24gUGF0Y2ggNzY5MTQyIChEYW5pZWxzKQorCistIFJlcGxhY2VkIGFwcGx5KGYsIGFyZ3MsIGt3ZHMpIHdpdGggZigqYXJncywgKiprd2FyZ3MpIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UKKyAgUHl0aG9uIFBhdGNoIDc2ODE4NworCistIEJyZWFrIG9yIGNvbnRpbnVlIHN0YXRlbWVudHMgb3V0c2lkZSBhIGxvb3Agd2VyZSBjYXVzaW5nIElETEUgY3Jhc2gKKyAgUHl0aG9uIEJ1ZyA3Njc3OTQKKworLSBDb252ZXJ0IFVuaWNvZGUgc3RyaW5ncyBmcm9tIHJlYWRsaW5lIHRvIElPQmluZGluZy5lbmNvZGluZy4gIEFsc28gc2V0CisgIHN5cy5zdGR7aW58b3V0fGVycn0uZW5jb2RpbmcsIGZvciBib3RoIHRoZSBsb2NhbCBhbmQgdGhlIHN1YnByb2Nlc3MgY2FzZS4KKyAgU0YgSURMRWZvcmsgcGF0Y2ggNjgyMzQ3LgorCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjBiMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjktSnVuLTIwMDMqCisKKy0gRXh0ZW5kIEFib3V0RGlhbG9nLlZpZXdGaWxlKCkgdG8gc3VwcG9ydCBmaWxlIGVuY29kaW5ncy4gIE1ha2UgdGhlIENSRURJVFMKKyAgZmlsZSBMYXRpbi0xLgorCistIFVwZGF0ZWQgdGhlIEFib3V0IGRpYWxvZyB0byByZWZsZWN0IHJlLWludGVncmF0aW9uIGludG8gUHl0aG9uLiAgUHJvdmlkZQorICBidXR0b25zIHRvIGRpc3BsYXkgUHl0aG9uJ3MgTkVXUywgTGljZW5zZSwgYW5kIENyZWRpdHMsIHBsdXMgYWRkaXRpb25hbAorICBidXR0b25zIGZvciBJRExFJ3MgUkVBRE1FIGFuZCBORVdTLgorCistIFRleHRWaWV3ZXIoKSBub3cgaGFzIGEgdGhpcmQgcGFyYW1ldGVyIHdoaWNoIGFsbG93cyBpbnNlcnRpbmcgdGV4dCBpbnRvIHRoZQorICB2aWV3ZXIgaW5zdGVhZCBvZiByZWFkaW5nIGZyb20gYSBmaWxlLgorCistIChDcmVhdGVkIHRoZSAuLi4vTGliL2lkbGVsaWIgZGlyZWN0b3J5IGluIHRoZSBQeXRob24gQ1ZTLCB3aGljaCBpcyBhIGNsb25lIG9mCisgIElETEVmb3JrIG1vZGlmaWVkIHRvIGluc3RhbGwgaW4gdGhlIFB5dGhvbiBlbnZpcm9ubWVudC4gIFRoZSBjb2RlIGluIHRoZQorICBpbnRlcnJ1cHQgbW9kdWxlIGhhcyBiZWVuIG1vdmVkIHRvIHRocmVhZC5pbnRlcnJ1cHRfbWFpbigpLiApCisKKy0gUHJpbnRpbmcgdGhlIFNoZWxsIHdpbmRvdyB3YXMgZmFpbGluZyBpZiBpdCB3YXMgbm90IHNhdmVkIGZpcnN0IFNGIDc0ODk3NQorCistIFdoZW4gdXNpbmcgdGhlIFNlYXJjaCBpbiBGaWxlcyBkaWFsb2csIGlmIHRoZSB1c2VyIGhhZCBhIHNlbGVjdGlvbgorICBoaWdobGlnaHRlZCBpbiBoaXMgRWRpdG9yIHdpbmRvdywgaW5zZXJ0IGl0IGludG8gdGhlIGRpYWxvZyBzZWFyY2ggZmllbGQuCisKKy0gVGhlIFB5dGhvbiBTaGVsbCBlbnRyeSB3YXMgZGlzYXBwZWFyaW5nIGZyb20gdGhlIFdpbmRvd3MgbWVudS4KKworLSBVcGRhdGUgdGhlIFdpbmRvd3MgZmlsZSBsaXN0IHdoZW4gYSBmaWxlIG5hbWUgY2hhbmdlIG9jY3VycworCistIENoYW5nZSB0byBGaWxlIC8gT3BlbiBNb2R1bGU6IGFsd2F5cyBwb3AgdXAgdGhlIGRpYWxvZywgdXNpbmcgdGhlIGN1cnJlbnQKKyAgc2VsZWN0aW9uIGFzIHRoZSBkZWZhdWx0IHZhbHVlLiAgVGhpcyBpcyBlYXNpZXIgdG8gdXNlIGhhYml0dWFsbHkuCisKKy0gQXZvaWRlZCBhIHByb2JsZW0gd2l0aCBzdGFydGluZyB0aGUgc3VicHJvY2VzcyB3aGVuICdsb2NhbGhvc3QnIGRvZXNuJ3QKKyAgcmVzb2x2ZSB0byB0aGUgdXNlcidzIGxvb3BiYWNrIGludGVyZmFjZS4gIFNGIDc0Nzc3MgorCistIEZpeGVkIGFuIGlzc3VlIHdpdGggaGlnaGxpZ2h0ZWQgZXJyb3JzIG5ldmVyIGRlLWNvbG9yaXppbmcuICBTRiA3NDc2NzcuICBBbHNvCisgIGltcHJvdmVkIG5vdGlmaWNhdGlvbiBvZiBUYWJuYW5ueSBUb2tlbiBFcnJvci4KKworLSBGaWxlIC8gTmV3IHdpbGwgYnkgZGVmYXVsdCBzYXZlIGluIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIEVkaXQgd2luZG93IGZyb20KKyAgd2hpY2ggaXQgd2FzIGluaXRpYXRlZC4gIFNGIDc0ODk3MyBHdWlkbyB2YW4gUm9zc3VtIHBhdGNoLgorCisKK1doYXQncyBOZXcgaW4gSURMRWZvcmsgMC45YjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwMi1KdW4tMjAwMyoKKworLSBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBvZiB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IChhbmQgc2hlbGwKKyAgZm9sbG93aW5nIGNvbXBsZXRpb24gb2YgZXhlY3V0aW9uKSBpcyBub3cgdGhhdCBvZiB0aGUgbW9kdWxlIGJlaW5nIHJ1bi4KKworLSBBZGRlZCB0aGUgZGVsZXRlLWV4aXRmdW5jIG9wdGlvbiB0byBjb25maWctbWFpbi5kZWYuICAoVGhpcyBvcHRpb24gaXMgbm90CisgIGluY2x1ZGVkIGluIHRoZSBPcHRpb25zIGRpYWxvZy4pICBTZXR0aW5nIHRoaXMgdG8gVHJ1ZSAodGhlIGRlZmF1bHQpIHdpbGwKKyAgY2F1c2UgSURMRSB0byBub3QgcnVuIHN5cy5leGl0ZnVuYy9hdGV4aXQgd2hlbiB0aGUgc3VicHJvY2VzcyBleGl0cy4KKworLSBJRExFIG5vdyBwcmVzZXJ2ZXMgdGhlIGxpbmUgZW5kaW5nIGNvZGVzIHdoZW4gZWRpdGluZyBhIGZpbGUgcHJvZHVjZWQgb24KKyAgYSBkaWZmZXJlbnQgcGxhdGZvcm0uIFNGIDY2MTc1OSwgIFNGIDUzODU4NAorCistIFJlZHVjZWQgZGVmYXVsdCBlZGl0b3IgZm9udCBzaXplIHRvIDEwIHBvaW50IGFuZCBpbmNyZWFzZWQgd2luZG93IGhlaWdodAorICB0byBwcm92aWRlIGEgYmV0dGVyIGluaXRpYWwgaW1wcmVzc2lvbiBvbiBXaW5kb3dzLgorCistIE9wdGlvbnMgLyBGb250cy9UYWJzIC8gU2V0IEJhc2UgRWRpdG9yIEZvbnQ6IExpc3QgYm94IHdhcyBub3QgaGlnaGxpZ2h0aW5nCisgIHRoZSBkZWZhdWx0IGZvbnQgd2hlbiBmaXJzdCBpbnN0YWxsZWQgb24gV2luZG93cy4gIFNGIDY2MTY3NgorCistIEFkZGVkIEF1dG9zYXZlIGZlYXR1cmU6IHdoZW4gdXNlciBydW5zIGNvZGUgZnJvbSBlZGl0IHdpbmRvdywgaWYgdGhlIGZpbGUKKyAgaGFzIGJlZW4gbW9kaWZpZWQgSURMRSB3aWxsIHNpbGVudGx5IHNhdmUgaXQgaWYgQXV0b3NhdmUgaXMgZW5hYmxlZC4gIFRoZQorICBvcHRpb24gaXMgc2V0IGluIHRoZSBPcHRpb25zIGRpYWxvZywgYW5kIHRoZSBkZWZhdWx0IGlzIHRvIHByb21wdCB0aGUKKyAgdXNlciB0byBzYXZlIHRoZSBmaWxlLiAgIFNGIDY2MTMxOCBCcnVjZSBTaGVyd29vZCBwYXRjaC4KKworLSBJbXByb3ZlZCB0aGUgUkVTVEFSVCBhbm5vdGF0aW9uIGluIHRoZSBzaGVsbCB3aW5kb3cgd2hlbiB0aGUgdXNlciByZXN0YXJ0cworICB0aGUgc2hlbGwgd2hpbGUgaXQgaXMgZ2VuZXJhdGluZyBvdXRwdXQuICBBbHNvIGltcHJvdmVkIGFubm90YXRpb24gd2hlbiB1c2VyCisgIHJlcGVhdGVkbHkgaGFtbWVycyB0aGUgQ3RybC1GNiByZXN0YXJ0LgorCistIEFsbG93IElETEUgdG8gcnVuIHdoZW4gbm90IGluc3RhbGxlZCBhbmQgY3dkIGlzIG5vdCB0aGUgSURMRSBkaXJlY3RvcnkKKyAgU0YgUGF0Y2ggNjg2MjU0ICJSdW4gSURMRWZvcmsgZnJvbSBhbnkgZGlyZWN0b3J5IHdpdGhvdXQgc2V0LXVwIiAtIFJhcGhhZWwKKworLSBXaGVuIGEgbW9kdWxlIGlzIHJ1biBmcm9tIGFuIEVkaXRvcldpbmRvdzogaWYgaXRzIGRpcmVjdG9yeSBpcyBub3QgaW4KKyAgc3lzLnBhdGgsIHByZXBlbmQgaXQuICBUaGlzIGFsbG93cyB0aGUgbW9kdWxlIHRvIGltcG9ydCBvdGhlciBtb2R1bGVzIGluCisgIHRoZSBzYW1lIGRpcmVjdG9yeS4gIERvIHRoZSBzYW1lIGZvciBhIHNjcmlwdCBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCistIENvcnJlY3RseSByZXN0YXJ0IHRoZSBzdWJwcm9jZXNzIGlmIGl0IGlzIHJ1bm5pbmcgdXNlciBjb2RlIGFuZCB0aGUgdXNlcgorICBhdHRlbXB0cyB0byBydW4gc29tZSBvdGhlciBtb2R1bGUgb3IgcmVzdGFydHMgdGhlIHNoZWxsLiAgRG8gdGhlIHNhbWUgaWYKKyAgdGhlIGxpbmsgaXMgYnJva2VuIGFuZCBpdCBpcyBwb3NzaWJsZSB0byByZXN0YXJ0IHRoZSBzdWJwcm9jZXNzIGFuZCByZS0KKyAgY29ubmVjdCB0byB0aGUgR1VJLiAgIFNGIFJGRSA2NjEzMjEuCisKKy0gSW1wcm92ZWQgZXhjZXB0aW9uIHJlcG9ydGluZyB3aGVuIHJ1bm5pbmcgY29tbWFuZHMgb3Igc2NyaXB0cyBmcm9tIHRoZQorICBjb21tYW5kIGxpbmUuCisKKy0gQWRkZWQgYSAtbiBjb21tYW5kIGxpbmUgc3dpdGNoIHRvIHN0YXJ0IElETEUgd2l0aG91dCB0aGUgc3VicHJvY2Vzcy4KKyAgUmVtb3ZlZCB0aGUgU2hlbGwgbWVudSB3aGVuIHJ1bm5pbmcgaW4gdGhhdCBtb2RlLiAgVXBkYXRlZCBoZWxwIG1lc3NhZ2VzLgorCistIEFkZGVkIGEgY29tbWVudCB0byB0aGUgc2hlbGwgc3RhcnR1cCBoZWFkZXIgdG8gaW5kaWNhdGUgd2hlbiBJRExFIGlzIG5vdAorICB1c2luZyB0aGUgc3VicHJvY2Vzcy4KKworLSBSZXN0b3JlIHRoZSBhYmlsaXR5IHRvIHJ1biB3aXRob3V0IHRoZSBzdWJwcm9jZXNzLiAgVGhpcyBjYW4gYmUgaW1wb3J0YW50IGZvcgorICBzb21lIHBsYXRmb3JtcyBvciBjb25maWd1cmF0aW9ucy4gIChSdW5uaW5nIHdpdGhvdXQgdGhlIHN1YnByb2Nlc3MgYWxsb3dzIHRoZQorICBkZWJ1Z2dlciB0byB0cmFjZSB0aHJvdWdoIHBhcnRzIG9mIElETEUgaXRzZWxmLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZQorICBkZXNpcmFibGUsIGRlcGVuZGluZyBvbiB5b3VyIHBvaW50IG9mIHZpZXcuICBJbiBhZGRpdGlvbiwgdGhlIHRyYWRpdGlvbmFsCisgIHJlbG9hZC9pbXBvcnQgdHJpY2tzIG11c3QgYmUgdXNlIGlmIHVzZXIgc291cmNlIGNvZGUgaXMgY2hhbmdlZC4pICBUaGlzIGlzCisgIGhlbHBmdWwgZm9yIGRldmVsb3BpbmcgSURMRSB1c2luZyBJRExFLCBiZWNhdXNlIG9uZSBpbnN0YW5jZSBjYW4gYmUgdXNlZCB0bworICBlZGl0IHRoZSBjb2RlIGFuZCBhIHNlcGFyYXRlIGluc3RhbmNlIHJ1biB0byB0ZXN0IGNoYW5nZXMuICAoTXVsdGlwbGUKKyAgY29uY3VycmVudCBJRExFIGluc3RhbmNlcyB3aXRoIHN1YnByb2Nlc3NlcyBpcyBhIGZ1dHVyZSBmZWF0dXJlKQorCistIEltcHJvdmUgdGhlIGVycm9yIG1lc3NhZ2UgYSB1c2VyIGdldHMgd2hlbiBzYXZpbmcgYSBmaWxlIHdpdGggbm9uLUFTQ0lJCisgIGNoYXJhY3RlcnMgYW5kIG5vIHNvdXJjZSBlbmNvZGluZyBpcyBzcGVjaWZpZWQuICBEb25lIGJ5IGFkZGluZyBhIGRpYWxvZworICAnRW5jb2RpbmdNZXNzYWdlJywgd2hpY2ggY29udGFpbnMgdGhlIGxpbmUgdG8gYWRkIGluIGEgZml4ZWQtZm9udCBlbnRyeQorICB3aWRnZXQsIGFuZCB3aGljaCBoYXMgYSBidXR0b24gdG8gYWRkIHRoYXQgbGluZSB0byB0aGUgZmlsZSBhdXRvbWF0aWNhbGx5LgorICBBbHNvLCBhZGQgYSBjb25maWd1cmF0aW9uIG9wdGlvbiAnRWRpdG9yV2luZG93L2VuY29kaW5nJywgd2hpY2ggaGFzIHRocmVlCisgIHBvc3NpYmxlIHZhbHVlczogbm9uZSwgdXRmLTgsIGFuZCBsb2NhbGUuIE5vbmUgaXMgdGhlIGRlZmF1bHQ6IElETEUgd2lsbCBzaG93CisgIHRoaXMgZGlhbG9nIHdoZW4gbm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIGVuY291bnRlcmVkLiB1dGYtOCBtZWFucyB0aGF0IGZpbGVzCisgIHdpdGggbm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIHNhdmVkIGFzIHV0Zi04LXdpdGgtYm9tLiBsb2NhbGUgbWVhbnMgdGhhdAorICBmaWxlcyBhcmUgc2F2ZWQgaW4gdGhlIGxvY2FsZSdzIGVuY29kaW5nOyB0aGUgZGlhbG9nIGlzIG9ubHkgZGlzcGxheWVkIGlmIHRoZQorICBzb3VyY2UgY29udGFpbnMgY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBsb2NhbGUncyBjaGFyc2V0LiAgU0YgNzEwNzMzIC0gTG9ld2lzCisKKy0gSW1wcm92ZWQgSS9PIHJlc3BvbnNlIGJ5IHR3ZWFraW5nIHRoZSB3YWl0IHBhcmFtZXRlciBpbiB2YXJpb3VzCisgIGNhbGxzIHRvIHNpZ25hbC5zaWduYWwoKS4KKworLSBJbXBsZW1lbnRlZCBhIHRocmVhZGVkIHN1YnByb2Nlc3Mgd2hpY2ggYWxsb3dzIGludGVycnVwdGluZyBhIHBhc3MKKyAgbG9vcCBpbiB1c2VyIGNvZGUgdXNpbmcgdGhlICdpbnRlcnJ1cHQnIGV4dGVuc2lvbi4gIFVzZXIgY29kZSBydW5zCisgIGluIE1haW5UaHJlYWQsIHdoaWxlIHRoZSBSUENTZXJ2ZXIgaXMgaGFuZGxlZCBieSBTb2NrVGhyZWFkLiAgVGhpcyBpcworICBuZWNlc3NhcnkgYmVjYXVzZSBXaW5kb3dzIGRvZXNuJ3Qgc3VwcG9ydCBzaWduYWxzLgorCistIEltcGxlbWVudGVkIHRoZSAnaW50ZXJydXB0JyBleHRlbnNpb24gbW9kdWxlLCB3aGljaCBhbGxvd3MgYSBzdWJ0aHJlYWQKKyAgdG8gcmFpc2UgYSBLZXlib2FyZEludGVycnVwdCBpbiB0aGUgbWFpbiB0aHJlYWQuCisKKy0gQXR0ZW1wdGluZyB0byBzYXZlIHRoZSBzaGVsbCByYWlzZWQgYW4gZXJyb3IgcmVsYXRlZCB0byBzYXZpbmcKKyAgYnJlYWtwb2ludHMsIHdoaWNoIGFyZSBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIHNoZWxsCisKKy0gUHJvdmlkZSBhIGNvcnJlY3QgbWVzc2FnZSB3aGVuICdleGl0JyBvciAncXVpdCcgYXJlIGVudGVyZWQgYXQgdGhlCisgIElETEUgY29tbWFuZCBwcm9tcHQgIFNGIDY5NTg2MQorCistIEVsaW1pbmF0ZSBleHRyYSBibGFuayBsaW5lIGluIHNoZWxsIG91dHB1dCBjYXVzZWQgYnkgbm90IGZsdXNoaW5nCisgIHN0ZG91dCB3aGVuIHVzZXIgY29kZSBlbmRzIHdpdGggYW4gdW50ZXJtaW5hdGVkIHByaW50LiBTRiA2OTU4NjEKKworLSBNb3ZlZCByZXNwb25zaWJpbGl0eSBmb3IgZXhjZXB0aW9uIGZvcm1hdHRpbmcgKGkuZS4gcHJ1bmluZyBJRExFIGludGVybmFsCisgIGNhbGxzKSBvdXQgb2YgcnBjLnB5IGludG8gdGhlIGNsaWVudCBhbmQgc2VydmVyLgorCistIEV4aXQgSURMRSBjbGVhbmx5IGV2ZW4gd2hlbiBkb2luZyBzdWJwcm9jZXNzIEkvTworCistIEhhbmRsZSBzdWJwcm9jZXNzIGludGVycnVwdCB3aXRoIGFuIFJQQyBtZXNzYWdlLgorCistIFJlc3RhcnQgdGhlIHN1YnByb2Nlc3MgaWYgaXQgdGVybWluYXRlcyBpdHNlbGYuIChWUHl0aG9uIHByb2dyYW1zIGRvIHRoYXQpCisKKy0gU3VwcG9ydCBzdWJjbGFzc2luZyBvZiBleGNlcHRpb25zLCBpbmNsdWRpbmcgaW4gdGhlIHNoZWxsLCBieSBtb3ZpbmcgdGhlCisgIGV4Y2VwdGlvbiBmb3JtYXR0aW5nIHRvIHRoZSBzdWJwcm9jZXNzLgorCisKKworV2hhdCdzIE5ldyBpbiBJRExFZm9yayAwLjkgQWxwaGEgMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDI3LUphbi0yMDAzKgorCistIFVwZGF0ZWQgSU5TVEFMTC50eHQgdG8gY2xhaWZ5IHVzZSBvZiB0aGUgcHl0aG9uMiBycG0uCisKKy0gSW1wcm92ZWQgZm9ybWF0dGluZyBpbiBJRExFIEhlbHAuCisKKy0gUnVuIG1lbnU6IFJlcGxhY2UgIlJ1biBTY3JpcHQiIHdpdGggIlJ1biBNb2R1bGUiLgorCistIENvZGUgZW5jb3VudGVyaW5nIGFuIHVuaGFuZGxlZCBleGNlcHRpb24gdW5kZXIgdGhlIGRlYnVnZ2VyIG5vdyBzaG93cworICB0aGUgY29ycmVjdCB0cmFjZWJhY2ssIHdpdGggSURMRSBpbnRlcm5hbCBsZXZlbHMgcHJ1bmVkIG91dC4KKworLSBJZiBhbiBleGNlcHRpb24gb2NjdXJzIGVudGlyZWx5IGluIElETEUsIGRvbid0IHBydW5lIHRoZSBJRExFIGludGVybmFsCisgIG1vZHVsZXMgZnJvbSB0aGUgdHJhY2ViYWNrIGRpc3BsYXllZC4KKworLSBDbGFzcyBCcm93c2VyIGFuZCBQYXRoIEJyb3dzZXIgbm93IHVzZSBBbHQtS2V5LTIgZm9yIHZlcnRpY2FsIHpvb20uCisKKy0gSURMRSBpY29ucyB3aWxsIG5vdyBpbnN0YWxsIGNvcnJlY3RseSBldmVuIHdoZW4gc2V0dXAucHkgaXMgcnVuIGZyb20gdGhlCisgIGJ1aWxkIGRpcmVjdG9yeQorCistIENsYXNzIEJyb3dzZXIgbm93IGNvbXBhdGlibGUgd2l0aCBQeXRob24yLjMgdmVyc2lvbiBvZiBweWNsYnIucHkKKworLSBMZWZ0IGN1cnNvciBtb3ZlIGluIHByZXNlbmNlIG9mIHNlbGVjdGVkIHRleHQgbm93IG1vdmVzIGZyb20gbGVmdCBlbmQKKyAgb2YgdGhlIHNlbGVjdGlvbi4KKworLSBBZGQgTWV0YSBrZXliaW5kaW5ncyB0byAiSURMRSBDbGFzc2ljIFdpbmRvd3MiIHRvIGhhbmRsZSByZXZlcnNlZAorICBBbHQvTWV0YSBvbiBzb21lIExpbnV4IGRpc3Ryb3MuCisKKy0gQ2hhbmdlIGRlZmF1bHQ6IElETEUgbm93IHN0YXJ0cyB3aXRoIFB5dGhvbiBTaGVsbC4KKworLSBSZW1vdmVkIHRoZSBGaWxlIFBhdGggZnJvbSB0aGUgQWRkaXRpb25hbCBIZWxwIFNvdXJjZXMgc2Nyb2xsZWQgbGlzdC4KKworLSBBZGQgY2FwYWJpbGl0eSB0byBhY2Nlc3MgQWRkaXRpb25hbCBIZWxwIFNvdXJjZXMgb24gdGhlIHdlYiBpZiB0aGUKKyAgSGVscCBGaWxlIFBhdGggYmVnaW5zIHdpdGggLy9odHRwIG9yIHd3dy4gIChPdGhlcndpc2UgbG9jYWwgcGF0aCBpcworICB2YWxpZGF0ZWQsIGFzIGJlZm9yZS4pCisKKy0gQWRkaXRpb25hbCBIZWxwIFNvdXJjZXMgd2VyZSBub3QgYmVpbmcgcG9zdGVkIG9uIHRoZSBIZWxwIG1lbnUgaW4gdGhlCisgIG9yZGVyIGVudGVyZWQuICBJbXBsZW1lbnQgc29ydGluZyB0aGUgbGlzdCBieSBbSGVscEZpbGVzXSAnb3B0aW9uJworICBudW1iZXIuCisKKy0gQWRkIEJyb3dzZSBidXR0b24gdG8gTmV3IEhlbHAgU291cmNlIGRpYWxvZy4gIEFycmFuZ2UgdG8gc3RhcnQgaW4KKyAgUHl0aG9uL0RvYyBpZiBwbGF0Zm9ybSBpcyBXaW5kb3dzLCBvdGhlcndpc2Ugc3RhcnQgaW4gY3VycmVudCBkaXJlY3RvcnkuCisKKy0gUHV0IHRoZSBBZGRpdGlvbmFsIEhlbHAgU291cmNlcyBkaXJlY3RseSBvbiB0aGUgSGVscCBtZW51IGluc3RlYWQgb2YgaW4KKyAgYW4gRXh0cmEgSGVscCBjYXNjYWRlIG1lbnUuICBSZWFycmFuZ2UgdGhlIEhlbHAgbWVudSBzbyB0aGUgQWRkaXRpb25hbAorICBIZWxwIFNvdXJjZXMgY29tZSBsYXN0LiAgVXBkYXRlIGhlbHAudHh0IGFwcHJvcHJpYXRlbHkuCisKKy0gRml4IFRrIHJvb3QgcG9wLXVwcyBpbiBjb25maWdTZWN0aW9uTmFtZURpYWxvZy5weSAgYW5kIGNvbmZpZ0RpYWxvZy5weQorCistIFVuaWZvcm0gY2FwaXRhbGl6YXRpb24gaW4gR2VuZXJhbCB0YWIgb2YgQ29uZmlnRGlhbG9nLCB1cGRhdGUgdGhlIGRvYyBzdHJpbmcuCisKKy0gRml4IGJ1ZyBpbiBDb25maWdEaWFsb2cgd2hlcmUgU2F2ZUFsbENoYW5nZWRDb25maWcoKSB3YXMgdW5leHBlY3RlZGx5CisgIGRlbGV0aW5nIEFkZGl0aW9uYWwgSGVscCBTb3VyY2VzIGZyb20gdGhlIHVzZXIncyBjb25maWcgZmlsZS4KKworLSBNYWtlIGNvbmZpZ0hlbHBTb3VyY2VFZGl0IE9LIGJ1dHRvbiB0aGUgZGVmYXVsdCBhbmQgYmluZCA8UmV0dXJuPgorCistIEZpeCBUayByb290IHBvcC11cHMgaW4gY29uZmlnSGVscFNvdXJjZUVkaXQ6IGVycm9yIGRpYWxvZ3Mgbm90IGF0dGFjaGVkCisgIHRvIHBhcmVudHMuCisKKy0gVXNlIG9zLnN0YXJ0ZmlsZSgpIHRvIG9wZW4gYm90aCBBZGRpdGlvbmFsIEhlbHAgYW5kIFB5dGhvbiBIZWxwIG9uIHRoZQorICBXaW5kb3dzIHBsYXRmb3JtLiAgVGhlIGFwcGxpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSB0eXBlIHdpbGwgYWN0IGFzCisgIHRoZSB2aWV3ZXIuICBXaW5kb3dzIGhlbHAgZmlsZXMgKC5jaG0pIGFyZSBub3cgc3VwcG9ydGVkIHZpYSB0aGUKKyAgU2V0dGluZ3MvR2VuZXJhbC9BZGRpdGlvbmFsIEhlbHAgZmFjaWxpdHkuCisKKy0gSWYgUHl0aG9uIEhlbHAgZmlsZXMgYXJlIGluc3RhbGxlZCBsb2NhbGx5IG9uIExpbnV4LCB1c2UgdGhlbSBpbnN0ZWFkIG9mCisgIGFjY2Vzc2luZyBweXRob24ub3JnLgorCistIE1ha2UgdGhlIG1ldGhvZHMgZm9yIGZpbmRpbmcgdGhlIFB5dGhvbiBoZWxwIGRvY3MgbW9yZSByb2J1c3QsIGFuZCBtYWtlCisgIHRoZW0gd29yayBpbiB0aGUgaW5zdGFsbGVkIGNvbmZpZ3VyYXRpb24sIGFsc28uCisKKy0gT24gdGhlIFNhdmUgQmVmb3JlIFJ1biBkaWFsb2csIG1ha2UgdGhlIE9LIGJ1dHRvbiB0aGUgZGVmYXVsdC4gIE9uZQorICBsZXNzIG1vdXNlIGFjdGlvbiEKKworLSBBZGQgYSBtZXRob2Q6IEVkaXRvcldpbmRvdy5nZXRfZ2VvbWV0cnkoKSBmb3IgZnV0dXJlIHVzZSBpbiBpbXBsZW1lbnRpbmcKKyAgd2luZG93IGxvY2F0aW9uIHBlcnNpc3RlbmNlLgorCistIFJlbW92ZWQgdGhlICJIZWxwL0FkdmljZSIgbWVudSBlbnRyeS4gIFRoYW5rcywgRGF2aWQhICBXZSdsbCByZW1lbWJlciEKKworLSBDaGFuZ2UgdGhlICJDbGFzc2ljIFdpbmRvd3MiIHRoZW1lJ3MgcGFzdGUga2V5IHRvIGJlIDxjdHJsLXY+LgorCistIFJlYXJyYW5nZSB0aGUgU2hlbGwgbWVudSB0byBwdXQgU3RhY2sgVmlld2VyIGVudHJpZXMgYWRqYWNlbnQuCisKKy0gQWRkIHRoZSBhYmlsaXR5IHRvIHJlc3RhcnQgdGhlIHN1YnByb2Nlc3MgaW50ZXJwcmV0ZXIgZnJvbSB0aGUgc2hlbGwgd2luZG93OworICBhZGQgYW4gYXNzb2NpYXRlZCBtZW51IGVudHJ5ICJTaGVsbC9SZXN0YXJ0IiB3aXRoIGJpbmRpbmcgQ29udHJvbC1GNi4gIFVwZGF0ZQorICBJRExFIGhlbHAuCisKKy0gVXBvbiBhIHJlc3RhcnQsIGFubm90YXRlIHRoZSBzaGVsbCB3aW5kb3cgd2l0aCBhICJyZXN0YXJ0IGJvdW5kYXJ5Ii4gIEFkZCBhCisgIHNoZWxsIHdpbmRvdyBtZW51ICJTaGVsbC9WaWV3IFJlc3RhcnQiIHdpdGggYmluZGluZyBGNiB0byBqdW1wIHRvIHRoZSBtb3N0CisgIHJlY2VudCByZXN0YXJ0IGJvdW5kYXJ5LgorCistIEFkZCBTaGVsbCBtZW51IHRvIFB5dGhvbiBTaGVsbDsgY2hhbmdlICJTZXR0aW5ncyIgdG8gIk9wdGlvbnMiLgorCistIFJlbW92ZSBpbmNvcnJlY3QgY29tbWVudCBpbiBzZXR1cC5weTogSURMRWZvcmsgaXMgbm93IGluc3RhbGxlZCBhcyBhIHBhY2thZ2UuCisKKy0gQWRkIElOU1RBTEwudHh0LCBISVNUT1JZLnR4dCwgTkVXUy50eHQgdG8gaW5zdGFsbGVkIGNvbmZpZ3VyYXRpb24uCisKKy0gSW4gaW5zdGFsbGVyIHRleHQsIGZpeCByZWZlcmVuY2UgdG8gVmlzdWFsIFB5dGhvbiwgc2hvdWxkIGJlIFZQeXRob24uCisgIFByb3Blcmx5IGNyZWRpdCBEYXZpZCBTY2hlcmVyLgorCistIE1vZGlmaWVkIGlkbGUsIGlkbGUucHksIGlkbGUucHl3IHRvIGltcHJvdmUgZXhjZXB0aW9uIGhhbmRsaW5nLgorCisKK1doYXQncyBOZXcgaW4gSURMRWZvcmsgMC45IEFscGhhIDE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAzMS1EZWMtMjAwMioKKworLSBGaXJzdCByZWxlYXNlIG9mIG1ham9yIG5ldyBmdW5jdGlvbmFsaXR5LiAgRm9yIGZ1cnRoZXIgZGV0YWlscyByZWZlciB0bworICBJZGxlLWRldiBhbmQvb3IgdGhlIFNvdXJjZWZvcmdlIENWUy4KKworLSBBZGFwdGVkIHRvIHRoZSBNYWMgcGxhdGZvcm0uCisKKy0gT3ZlcmhhdWxlZCB0aGUgSURMRSBzdGFydHVwIG9wdGlvbnMgYW5kIHJldmlzZWQgdGhlIGlkbGUgLWggaGVscCBtZXNzYWdlLAorICB3aGljaCBwcm92aWRlcyBkZXRhaWxzIG9mIGNvbW1hbmQgbGluZSB1c2FnZS4KKworLSBNdWx0aXBsZSBidWcgZml4ZXMgYW5kIHVzYWJpbGl0eSBlbmhhbmNlbWVudHMuCisKKy0gSW50cm9kdWNlZCB0aGUgbmV3IFJQQyBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaW5jbHVkZXMgYSBkZWJ1Z2dlci4gIFRoZSBvdXRwdXQKKyAgb2YgdXNlciBjb2RlIGlzIHRvIHRoZSBzaGVsbCwgYW5kIHRoZSBzaGVsbCBtYXkgYmUgdXNlZCB0byBpbnNwZWN0IHRoZQorICBlbnZpcm9ubWVudCBhZnRlciB0aGUgcnVuIGhhcyBmaW5pc2hlZC4gIChJbiB2ZXJzaW9uIDAuOC4xIHRoZSBzaGVsbAorICBlbnZpcm9ubWVudCB3YXMgc2VwYXJhdGUgZnJvbSB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIHVzZXIgY29kZS4pCisKKy0gSW50cm9kdWNlZCB0aGUgY29uZmlndXJhdGlvbiBHVUkgYW5kIGEgbmV3IEFib3V0IGRpYWxvZy4KKworLSBSZW1vdmVkIERhdmlkIFNjaGVyZXIncyBSZW1vdGUgUHJvY2VkdXJlIENhbGwgY29kZSBhbmQgcmVwbGFjZWQgd2l0aCBHdWlkbworICB2YW4gUm9zc3VtJ3MuICBHdlIgY29kZSBoYXMgc3VwcG9ydCBmb3IgdGhlIElETEUgZGVidWdnZXIgYW5kIHVzZXMgdGhlIHNoZWxsCisgIHRvIGluc3BlY3QgdGhlIGVudmlyb25tZW50IG9mIGNvZGUgUnVuIGZyb20gYW4gRWRpdCB3aW5kb3cuICBGaWxlcyByZW1vdmVkOgorICBFeGVjQmluZGluZy5weSwgbG9hZGVyLnB5LCBwcm90b2NvbC5weSwgUmVtb3RlLnB5LCBzcGF3bi5weQorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUmVmZXIgdG8gSElTVE9SWS50eHQgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZWFybGllciByZWxlYXNlcy4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL09iamVjdEJyb3dzZXIucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU2OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL09iamVjdEJyb3dzZXIucHkKQEAgLTAsMCArMSwxNTEgQEAKKyMgWFhYIFRPIERPOgorIyAtIHBvcHVwIG1lbnUKKyMgLSBzdXBwb3J0IHBhcnRpYWwgb3IgdG90YWwgcmVkaXNwbGF5CisjIC0gbW9yZSBkb2Mgc3RyaW5ncworIyAtIHRvb2x0aXBzCisKKyMgb2JqZWN0IGJyb3dzZXIKKworIyBYWFggVE8gRE86CisjIC0gZm9yIGNsYXNzZXMvbW9kdWxlcywgYWRkICJvcGVuIHNvdXJjZSIgdG8gb2JqZWN0IGJyb3dzZXIKKworZnJvbSBpZGxlbGliLlRyZWVXaWRnZXQgaW1wb3J0IFRyZWVJdGVtLCBUcmVlTm9kZSwgU2Nyb2xsZWRDYW52YXMKKworZnJvbSByZXByIGltcG9ydCBSZXByCisKK215cmVwciA9IFJlcHIoKQorbXlyZXByLm1heHN0cmluZyA9IDEwMAorbXlyZXByLm1heG90aGVyID0gMTAwCisKK2NsYXNzIE9iamVjdFRyZWVJdGVtKFRyZWVJdGVtKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWx0ZXh0LCBvYmplY3QsIHNldGZ1bmN0aW9uPU5vbmUpOgorICAgICAgICBzZWxmLmxhYmVsdGV4dCA9IGxhYmVsdGV4dAorICAgICAgICBzZWxmLm9iamVjdCA9IG9iamVjdAorICAgICAgICBzZWxmLnNldGZ1bmN0aW9uID0gc2V0ZnVuY3Rpb24KKyAgICBkZWYgR2V0TGFiZWxUZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sYWJlbHRleHQKKyAgICBkZWYgR2V0VGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIG15cmVwci5yZXByKHNlbGYub2JqZWN0KQorICAgIGRlZiBHZXRJY29uTmFtZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuSXNFeHBhbmRhYmxlKCk6CisgICAgICAgICAgICByZXR1cm4gInB5dGhvbiIKKyAgICBkZWYgSXNFZGl0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2V0ZnVuY3Rpb24gaXMgbm90IE5vbmUKKyAgICBkZWYgU2V0VGV4dChzZWxmLCB0ZXh0KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBldmFsKHRleHQpCisgICAgICAgICAgICBzZWxmLnNldGZ1bmN0aW9uKHZhbHVlKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm9iamVjdCA9IHZhbHVlCisgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIG5vdCBub3QgZGlyKHNlbGYub2JqZWN0KQorICAgIGRlZiBHZXRTdWJMaXN0KHNlbGYpOgorICAgICAgICBrZXlzID0gZGlyKHNlbGYub2JqZWN0KQorICAgICAgICBzdWJsaXN0ID0gW10KKyAgICAgICAgZm9yIGtleSBpbiBrZXlzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihzZWxmLm9iamVjdCwga2V5KQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpdGVtID0gbWFrZV9vYmplY3R0cmVlaXRlbSgKKyAgICAgICAgICAgICAgICBzdHIoa2V5KSArICIgPSIsCisgICAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgICAgbGFtYmRhIHZhbHVlLCBrZXk9a2V5LCBvYmplY3Q9c2VsZi5vYmplY3Q6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIob2JqZWN0LCBrZXksIHZhbHVlKSkKKyAgICAgICAgICAgIHN1Ymxpc3QuYXBwZW5kKGl0ZW0pCisgICAgICAgIHJldHVybiBzdWJsaXN0CisKK2NsYXNzIEluc3RhbmNlVHJlZUl0ZW0oT2JqZWN0VHJlZUl0ZW0pOgorICAgIGRlZiBJc0V4cGFuZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgZGVmIEdldFN1Ykxpc3Qoc2VsZik6CisgICAgICAgIHN1Ymxpc3QgPSBPYmplY3RUcmVlSXRlbS5HZXRTdWJMaXN0KHNlbGYpCisgICAgICAgIHN1Ymxpc3QuaW5zZXJ0KDAsCisgICAgICAgICAgICBtYWtlX29iamVjdHRyZWVpdGVtKCJfX2NsYXNzX18gPSIsIHNlbGYub2JqZWN0Ll9fY2xhc3NfXykpCisgICAgICAgIHJldHVybiBzdWJsaXN0CisKK2NsYXNzIENsYXNzVHJlZUl0ZW0oT2JqZWN0VHJlZUl0ZW0pOgorICAgIGRlZiBJc0V4cGFuZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgZGVmIEdldFN1Ykxpc3Qoc2VsZik6CisgICAgICAgIHN1Ymxpc3QgPSBPYmplY3RUcmVlSXRlbS5HZXRTdWJMaXN0KHNlbGYpCisgICAgICAgIGlmIGxlbihzZWxmLm9iamVjdC5fX2Jhc2VzX18pID09IDE6CisgICAgICAgICAgICBpdGVtID0gbWFrZV9vYmplY3R0cmVlaXRlbSgiX19iYXNlc19fWzBdID0iLAorICAgICAgICAgICAgICAgIHNlbGYub2JqZWN0Ll9fYmFzZXNfX1swXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGl0ZW0gPSBtYWtlX29iamVjdHRyZWVpdGVtKCJfX2Jhc2VzX18gPSIsIHNlbGYub2JqZWN0Ll9fYmFzZXNfXykKKyAgICAgICAgc3VibGlzdC5pbnNlcnQoMCwgaXRlbSkKKyAgICAgICAgcmV0dXJuIHN1Ymxpc3QKKworY2xhc3MgQXRvbWljT2JqZWN0VHJlZUl0ZW0oT2JqZWN0VHJlZUl0ZW0pOgorICAgIGRlZiBJc0V4cGFuZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiAwCisKK2NsYXNzIFNlcXVlbmNlVHJlZUl0ZW0oT2JqZWN0VHJlZUl0ZW0pOgorICAgIGRlZiBJc0V4cGFuZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5vYmplY3QpID4gMAorICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXR1cm4gcmFuZ2UobGVuKHNlbGYub2JqZWN0KSkKKyAgICBkZWYgR2V0U3ViTGlzdChzZWxmKToKKyAgICAgICAgc3VibGlzdCA9IFtdCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLm9iamVjdFtrZXldCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGRlZiBzZXRmdW5jdGlvbih2YWx1ZSwga2V5PWtleSwgb2JqZWN0PXNlbGYub2JqZWN0KToKKyAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlCisgICAgICAgICAgICBpdGVtID0gbWFrZV9vYmplY3R0cmVlaXRlbSgiJXI6IiAlIChrZXksKSwgdmFsdWUsIHNldGZ1bmN0aW9uKQorICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgcmV0dXJuIHN1Ymxpc3QKKworY2xhc3MgRGljdFRyZWVJdGVtKFNlcXVlbmNlVHJlZUl0ZW0pOgorICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICBrZXlzID0gc2VsZi5vYmplY3Qua2V5cygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGtleXMuc29ydCgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIGtleXMKKworZnJvbSB0eXBlcyBpbXBvcnQgKgorCitkaXNwYXRjaCA9IHsKKyAgICBJbnRUeXBlOiBBdG9taWNPYmplY3RUcmVlSXRlbSwKKyAgICBMb25nVHlwZTogQXRvbWljT2JqZWN0VHJlZUl0ZW0sCisgICAgRmxvYXRUeXBlOiBBdG9taWNPYmplY3RUcmVlSXRlbSwKKyAgICBTdHJpbmdUeXBlOiBBdG9taWNPYmplY3RUcmVlSXRlbSwKKyAgICBUdXBsZVR5cGU6IFNlcXVlbmNlVHJlZUl0ZW0sCisgICAgTGlzdFR5cGU6IFNlcXVlbmNlVHJlZUl0ZW0sCisgICAgRGljdFR5cGU6IERpY3RUcmVlSXRlbSwKKyAgICBJbnN0YW5jZVR5cGU6IEluc3RhbmNlVHJlZUl0ZW0sCisgICAgQ2xhc3NUeXBlOiBDbGFzc1RyZWVJdGVtLAorfQorCitkZWYgbWFrZV9vYmplY3R0cmVlaXRlbShsYWJlbHRleHQsIG9iamVjdCwgc2V0ZnVuY3Rpb249Tm9uZSk6CisgICAgdCA9IHR5cGUob2JqZWN0KQorICAgIGlmIHQgaW4gZGlzcGF0Y2g6CisgICAgICAgIGMgPSBkaXNwYXRjaFt0XQorICAgIGVsc2U6CisgICAgICAgIGMgPSBPYmplY3RUcmVlSXRlbQorICAgIHJldHVybiBjKGxhYmVsdGV4dCwgb2JqZWN0LCBzZXRmdW5jdGlvbikKKworIyBUZXN0IHNjcmlwdAorCitkZWYgX3Rlc3QoKToKKyAgICBpbXBvcnQgc3lzCisgICAgZnJvbSBUa2ludGVyIGltcG9ydCBUaworICAgIHJvb3QgPSBUaygpCisgICAgcm9vdC5jb25maWd1cmUoYmQ9MCwgYmc9InllbGxvdyIpCisgICAgcm9vdC5mb2N1c19zZXQoKQorICAgIHNjID0gU2Nyb2xsZWRDYW52YXMocm9vdCwgYmc9IndoaXRlIiwgaGlnaGxpZ2h0dGhpY2tuZXNzPTAsIHRha2Vmb2N1cz0xKQorICAgIHNjLmZyYW1lLnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQorICAgIGl0ZW0gPSBtYWtlX29iamVjdHRyZWVpdGVtKCJzeXMiLCBzeXMpCisgICAgbm9kZSA9IFRyZWVOb2RlKHNjLmNhbnZhcywgTm9uZSwgaXRlbSkKKyAgICBub2RlLnVwZGF0ZSgpCisgICAgcm9vdC5tYWlubG9vcCgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL09iamVjdEJyb3dzZXIucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL09iamVjdEJyb3dzZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZjI4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL09iamVjdEJyb3dzZXIucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL09iamVjdEJyb3dzZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZjI4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL091dHB1dFdpbmRvdy5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9PdXRwdXRXaW5kb3cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4ZDg0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9PdXRwdXRXaW5kb3cucHkKQEAgLTAsMCArMSwxNDkgQEAKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgorZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93CitpbXBvcnQgcmUKK2ltcG9ydCB0a01lc3NhZ2VCb3gKK2Zyb20gaWRsZWxpYiBpbXBvcnQgSU9CaW5kaW5nCisKK2NsYXNzIE91dHB1dFdpbmRvdyhFZGl0b3JXaW5kb3cpOgorCisgICAgIiIiQW4gZWRpdG9yIHdpbmRvdyB0aGF0IGNhbiBzZXJ2ZSBhcyBhbiBvdXRwdXQgZmlsZS4KKworICAgIEFsc28gdGhlIGZ1dHVyZSBiYXNlIGNsYXNzIGZvciB0aGUgUHl0aG9uIHNoZWxsIHdpbmRvdy4KKyAgICBUaGlzIGNsYXNzIGhhcyBubyBpbnB1dCBmYWNpbGl0aWVzLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgRWRpdG9yV2luZG93Ll9faW5pdF9fKHNlbGYsICphcmdzKQorICAgICAgICBzZWxmLnRleHQuYmluZCgiPDxnb3RvLWZpbGUtbGluZT4+Iiwgc2VsZi5nb3RvX2ZpbGVfbGluZSkKKworICAgICMgQ3VzdG9taXplIEVkaXRvcldpbmRvdworCisgICAgZGVmIGlzcHl0aG9uc291cmNlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIyBObyBjb2xvcml6YXRpb24gbmVlZGVkCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgc2hvcnRfdGl0bGUoc2VsZik6CisgICAgICAgIHJldHVybiAiT3V0cHV0IgorCisgICAgZGVmIG1heWJlc2F2ZShzZWxmKToKKyAgICAgICAgIyBPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZCAtLSBkb24ndCBhc2sgYW55IHF1ZXN0aW9ucworICAgICAgICBpZiBzZWxmLmdldF9zYXZlZCgpOgorICAgICAgICAgICAgcmV0dXJuICJ5ZXMiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIm5vIgorCisgICAgIyBBY3QgYXMgb3V0cHV0IGZpbGUKKworICAgIGRlZiB3cml0ZShzZWxmLCBzLCB0YWdzPSgpLCBtYXJrPSJpbnNlcnQiKToKKyAgICAgICAgIyBUayBhc3N1bWVzIHRoYXQgYnl0ZSBzdHJpbmdzIGFyZSBMYXRpbi0xOworICAgICAgICAjIHdlIGFzc3VtZSB0aGF0IHRoZXkgYXJlIGluIHRoZSBsb2NhbGUncyBlbmNvZGluZworICAgICAgICBpZiBpc2luc3RhbmNlKHMsIHN0cik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcyA9IHVuaWNvZGUocywgSU9CaW5kaW5nLmVuY29kaW5nKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIHNvbWUgb3RoZXIgZW5jb2Rpbmc7IGxldCBUY2wgZGVhbCB3aXRoIGl0CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KG1hcmssIHMsIHRhZ3MpCisgICAgICAgIHNlbGYudGV4dC5zZWUobWFyaykKKyAgICAgICAgc2VsZi50ZXh0LnVwZGF0ZSgpCisKKyAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBsaW5lcyk6CisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgc2VsZi53cml0ZShsaW5lKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICAjIE91ciBvd24gcmlnaHQtYnV0dG9uIG1lbnUKKworICAgIHJtZW51X3NwZWNzID0gWworICAgICAgICAoIkN1dCIsICI8PGN1dD4+IiwgInJtZW51X2NoZWNrX2N1dCIpLAorICAgICAgICAoIkNvcHkiLCAiPDxjb3B5Pj4iLCAicm1lbnVfY2hlY2tfY29weSIpLAorICAgICAgICAoIlBhc3RlIiwgIjw8cGFzdGU+PiIsICJybWVudV9jaGVja19wYXN0ZSIpLAorICAgICAgICAoTm9uZSwgTm9uZSwgTm9uZSksCisgICAgICAgICgiR28gdG8gZmlsZS9saW5lIiwgIjw8Z290by1maWxlLWxpbmU+PiIsIE5vbmUpLAorICAgIF0KKworICAgIGZpbGVfbGluZV9wYXRzID0gWworICAgICAgICAjIG9yZGVyIG9mIHBhdHRlcm5zIG1hdHRlcnMKKyAgICAgICAgcidmaWxlICIoW14iXSopIiwgbGluZSAoXGQrKScsCisgICAgICAgIHInKFteXHNdKylcKChcZCspXCknLAorICAgICAgICByJ14oXHMqXFMuKj8pOlxzKihcZCspOicsICAjIFdpbiBmaWxlbmFtZSwgbWF5YmUgc3RhcnRpbmcgd2l0aCBzcGFjZXMKKyAgICAgICAgcicoW15cc10rKTpccyooXGQrKTonLCAgICAgIyBmaWxlbmFtZSBvciBwYXRoLCBsdHJpbQorICAgICAgICByJ15ccyooXFMuKj8pOlxzKihcZCspOicsICAjIFdpbiBhYnMgcGF0aCB3aXRoIGVtYmVkZGVkIHNwYWNlcywgbHRyaW0KKyAgICBdCisKKyAgICBmaWxlX2xpbmVfcHJvZ3MgPSBOb25lCisKKyAgICBkZWYgZ290b19maWxlX2xpbmUoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuZmlsZV9saW5lX3Byb2dzIGlzIE5vbmU6CisgICAgICAgICAgICBsID0gW10KKyAgICAgICAgICAgIGZvciBwYXQgaW4gc2VsZi5maWxlX2xpbmVfcGF0czoKKyAgICAgICAgICAgICAgICBsLmFwcGVuZChyZS5jb21waWxlKHBhdCwgcmUuSUdOT1JFQ0FTRSkpCisgICAgICAgICAgICBzZWxmLmZpbGVfbGluZV9wcm9ncyA9IGwKKyAgICAgICAgIyB4LCB5ID0gc2VsZi5ldmVudC54LCBzZWxmLmV2ZW50LnkKKyAgICAgICAgIyBzZWxmLnRleHQubWFya19zZXQoImluc2VydCIsICJAJWQsJWQiICUgKHgsIHkpKQorICAgICAgICBsaW5lID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQgbGluZWVuZCIpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX2ZpbGVfbGluZV9oZWxwZXIobGluZSkKKyAgICAgICAgaWYgbm90IHJlc3VsdDoKKyAgICAgICAgICAgICMgVHJ5IHRoZSBwcmV2aW91cyBsaW5lLiAgVGhpcyBpcyBoYW5keSBlLmcuIGluIHRyYWNlYmFja3MsCisgICAgICAgICAgICAjIHdoZXJlIHlvdSB0ZW5kIHRvIHJpZ2h0LWNsaWNrIG9uIHRoZSBkaXNwbGF5ZWQgc291cmNlIGxpbmUKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLnRleHQuZ2V0KCJpbnNlcnQgLTFsaW5lIGxpbmVzdGFydCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IC0xbGluZSBsaW5lZW5kIikKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2ZpbGVfbGluZV9oZWxwZXIobGluZSkKKyAgICAgICAgICAgIGlmIG5vdCByZXN1bHQ6CisgICAgICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIk5vIHNwZWNpYWwgbGluZSIsCisgICAgICAgICAgICAgICAgICAgICJUaGUgbGluZSB5b3UgcG9pbnQgYXQgZG9lc24ndCBsb29rIGxpa2UgIgorICAgICAgICAgICAgICAgICAgICAiYSB2YWxpZCBmaWxlIG5hbWUgZm9sbG93ZWQgYnkgYSBsaW5lIG51bWJlci4iLAorICAgICAgICAgICAgICAgICAgICBtYXN0ZXI9c2VsZi50ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBmaWxlbmFtZSwgbGluZW5vID0gcmVzdWx0CisgICAgICAgIGVkaXQgPSBzZWxmLmZsaXN0Lm9wZW4oZmlsZW5hbWUpCisgICAgICAgIGVkaXQuZ290b2xpbmUobGluZW5vKQorCisgICAgZGVmIF9maWxlX2xpbmVfaGVscGVyKHNlbGYsIGxpbmUpOgorICAgICAgICBmb3IgcHJvZyBpbiBzZWxmLmZpbGVfbGluZV9wcm9nczoKKyAgICAgICAgICAgIG1hdGNoID0gcHJvZy5zZWFyY2gobGluZSkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lbm8gPSBtYXRjaC5ncm91cCgxLCAyKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJyIikKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUsIGludChsaW5lbm8pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisjIFRoZXNlIGNsYXNzZXMgYXJlIGN1cnJlbnRseSBub3QgdXNlZCBidXQgbWlnaHQgY29tZSBpbiBoYW5keQorCitjbGFzcyBPbkRlbWFuZE91dHB1dFdpbmRvdzoKKworICAgIHRhZ2RlZnMgPSB7CisgICAgICAgICMgWFhYIFNob3VsZCB1c2UgSWRsZVByZWZzLkNvbG9yUHJlZnMKKyAgICAgICAgInN0ZG91dCI6ICB7ImZvcmVncm91bmQiOiAiYmx1ZSJ9LAorICAgICAgICAic3RkZXJyIjogIHsiZm9yZWdyb3VuZCI6ICIjMDA3NzAwIn0sCisgICAgfQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0KToKKyAgICAgICAgc2VsZi5mbGlzdCA9IGZsaXN0CisgICAgICAgIHNlbGYub3dpbiA9IE5vbmUKKworICAgIGRlZiB3cml0ZShzZWxmLCBzLCB0YWdzLCBtYXJrKToKKyAgICAgICAgaWYgbm90IHNlbGYub3dpbjoKKyAgICAgICAgICAgIHNlbGYuc2V0dXAoKQorICAgICAgICBzZWxmLm93aW4ud3JpdGUocywgdGFncywgbWFyaykKKworICAgIGRlZiBzZXR1cChzZWxmKToKKyAgICAgICAgc2VsZi5vd2luID0gb3dpbiA9IE91dHB1dFdpbmRvdyhzZWxmLmZsaXN0KQorICAgICAgICB0ZXh0ID0gb3dpbi50ZXh0CisgICAgICAgIGZvciB0YWcsIGNuZiBpbiBzZWxmLnRhZ2RlZnMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGNuZjoKKyAgICAgICAgICAgICAgICB0ZXh0LnRhZ19jb25maWd1cmUodGFnLCAqKmNuZikKKyAgICAgICAgdGV4dC50YWdfcmFpc2UoJ3NlbCcpCisgICAgICAgIHNlbGYud3JpdGUgPSBzZWxmLm93aW4ud3JpdGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9PdXRwdXRXaW5kb3cucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL091dHB1dFdpbmRvdy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5YjNkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9PdXRwdXRXaW5kb3cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9PdXRwdXRXaW5kb3cucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL091dHB1dFdpbmRvdy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5YjNkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9PdXRwdXRXaW5kb3cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9QYXJlbk1hdGNoLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhcmVuTWF0Y2gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5MWIzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QYXJlbk1hdGNoLnB5CkBAIC0wLDAgKzEsMTcyIEBACisiIiJQYXJlbk1hdGNoIC0tIEFuIElETEUgZXh0ZW5zaW9uIGZvciBwYXJlbnRoZXNpcyBtYXRjaGluZy4KKworV2hlbiB5b3UgaGl0IGEgcmlnaHQgcGFyZW4sIHRoZSBjdXJzb3Igc2hvdWxkIG1vdmUgYnJpZWZseSB0byB0aGUgbGVmdAorcGFyZW4uICBQYXJlbiBoZXJlIGlzIHVzZWQgZ2VuZXJpY2FsbHk7IHRoZSBtYXRjaGluZyBhcHBsaWVzIHRvCitwYXJlbnRoZXNlcywgc3F1YXJlIGJyYWNrZXRzLCBhbmQgY3VybHkgYnJhY2VzLgorIiIiCisKK2Zyb20gaWRsZWxpYi5IeXBlclBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKK2Zyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorCitfb3BlbmVycyA9IHsnKSc6JygnLCddJzonWycsJ30nOid7J30KK0NIRUNLX0RFTEFZID0gMTAwICMgbWlsaXNlY29uZHMKKworY2xhc3MgUGFyZW5NYXRjaDoKKyAgICAiIiJIaWdobGlnaHQgbWF0Y2hpbmcgcGFyZW50aGVzZXMKKworICAgIFRoZXJlIGFyZSB0aHJlZSBzdXBwb3J0ZWQgc3R5bGUgb2YgcGFyZW4gbWF0Y2hpbmcsIGJhc2VkIGxvb3NlbHkKKyAgICBvbiB0aGUgRW1hY3Mgb3B0aW9ucy4gIFRoZSBzdHlsZSBpcyBzZWxlY3QgYmFzZWQgb24gdGhlCisgICAgSElMSVRFX1NUWUxFIGF0dHJpYnV0ZTsgaXQgY2FuIGJlIGNoYW5nZWQgdXNlZCB0aGUgc2V0X3N0eWxlCisgICAgbWV0aG9kLgorCisgICAgVGhlIHN1cHBvcnRlZCBzdHlsZXMgYXJlOgorCisgICAgZGVmYXVsdCAtLSBXaGVuIGEgcmlnaHQgcGFyZW4gaXMgdHlwZWQsIGhpZ2hsaWdodCB0aGUgbWF0Y2hpbmcKKyAgICAgICAgbGVmdCBwYXJlbiBmb3IgMS8yIHNlYy4KKworICAgIGV4cHJlc3Npb24gLS0gV2hlbiBhIHJpZ2h0IHBhcmVuIGlzIHR5cGVkLCBoaWdobGlnaHQgdGhlIGVudGlyZQorICAgICAgICBleHByZXNzaW9uIGZyb20gdGhlIGxlZnQgcGFyZW4gdG8gdGhlIHJpZ2h0IHBhcmVuLgorCisgICAgVE9ETzoKKyAgICAgICAgLSBleHRlbmQgSURMRSB3aXRoIGNvbmZpZ3VyYXRpb24gZGlhbG9nIHRvIGNoYW5nZSBvcHRpb25zCisgICAgICAgIC0gaW1wbGVtZW50IHJlc3Qgb2YgRW1hY3MgaGlnaGxpZ2h0IHN0eWxlcyAoc2VlIGJlbG93KQorICAgICAgICAtIHByaW50IG1pc21hdGNoIHdhcm5pbmcgaW4gSURMRSBzdGF0dXMgd2luZG93CisKKyAgICBOb3RlOiBJbiBFbWFjcywgdGhlcmUgYXJlIHNldmVyYWwgc3R5bGVzIG9mIGhpZ2hsaWdodCB3aGVyZSB0aGUKKyAgICBtYXRjaGluZyBwYXJlbiBpcyBoaWdobGlnaHRlZCB3aGVuZXZlciB0aGUgY3Vyc29yIGlzIGltbWVkaWF0ZWx5CisgICAgdG8gdGhlIHJpZ2h0IG9mIGEgcmlnaHQgcGFyZW4uICBJIGRvbid0IGtub3cgaG93IHRvIGRvIHRoYXQgaW4gVGssCisgICAgc28gSSBoYXZlbid0IGJvdGhlcmVkLgorICAgICIiIgorICAgIG1lbnVkZWZzID0gWworICAgICAgICAoJ2VkaXQnLCBbCisgICAgICAgICAgICAoIlNob3cgc3Vycm91bmRpbmcgcGFyZW5zIiwgIjw8Zmxhc2gtcGFyZW4+PiIpLAorICAgICAgICBdKQorICAgIF0KKyAgICBTVFlMRSA9IGlkbGVDb25mLkdldE9wdGlvbignZXh0ZW5zaW9ucycsJ1BhcmVuTWF0Y2gnLCdzdHlsZScsCisgICAgICAgICAgICBkZWZhdWx0PSdleHByZXNzaW9uJykKKyAgICBGTEFTSF9ERUxBWSA9IGlkbGVDb25mLkdldE9wdGlvbignZXh0ZW5zaW9ucycsJ1BhcmVuTWF0Y2gnLCdmbGFzaC1kZWxheScsCisgICAgICAgICAgICB0eXBlPSdpbnQnLGRlZmF1bHQ9NTAwKQorICAgIEhJTElURV9DT05GSUcgPSBpZGxlQ29uZi5HZXRIaWdobGlnaHQoaWRsZUNvbmYuQ3VycmVudFRoZW1lKCksJ2hpbGl0ZScpCisgICAgQkVMTCA9IGlkbGVDb25mLkdldE9wdGlvbignZXh0ZW5zaW9ucycsJ1BhcmVuTWF0Y2gnLCdiZWxsJywKKyAgICAgICAgICAgIHR5cGU9J2Jvb2wnLGRlZmF1bHQ9MSkKKworICAgIFJFU1RPUkVfVklSVFVBTF9FVkVOVF9OQU1FID0gIjw8cGFyZW5tYXRjaC1jaGVjay1yZXN0b3JlPj4iCisgICAgIyBXZSB3YW50IHRoZSByZXN0b3JlIGV2ZW50IGJlIGNhbGxlZCBiZWZvcmUgdGhlIHVzdWFsIHJldHVybiBhbmQKKyAgICAjIGJhY2tzcGFjZSBldmVudHMuCisgICAgUkVTVE9SRV9TRVFVRU5DRVMgPSAoIjxLZXlQcmVzcz4iLCAiPEJ1dHRvblByZXNzPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIjxLZXktUmV0dXJuPiIsICI8S2V5LUJhY2tTcGFjZT4iKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVkaXR3aW4pOgorICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCisgICAgICAgIHNlbGYudGV4dCA9IGVkaXR3aW4udGV4dAorICAgICAgICAjIEJpbmQgdGhlIGNoZWNrLXJlc3RvcmUgZXZlbnQgdG8gdGhlIGZ1bmN0aW9uIHJlc3RvcmVfZXZlbnQsCisgICAgICAgICMgc28gdGhhdCB3ZSBjYW4gdGhlbiB1c2UgYWN0aXZhdGVfcmVzdG9yZSAod2hpY2ggY2FsbHMgZXZlbnRfYWRkKQorICAgICAgICAjIGFuZCBkZWFjdGl2YXRlX3Jlc3RvcmUgKHdoaWNoIGNhbGxzIGV2ZW50X2RlbGV0ZSkuCisgICAgICAgIGVkaXR3aW4udGV4dC5iaW5kKHNlbGYuUkVTVE9SRV9WSVJUVUFMX0VWRU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdG9yZV9ldmVudCkKKyAgICAgICAgc2VsZi5jb3VudGVyID0gMAorICAgICAgICBzZWxmLmlzX3Jlc3RvcmVfYWN0aXZlID0gMAorICAgICAgICBzZWxmLnNldF9zdHlsZShzZWxmLlNUWUxFKQorCisgICAgZGVmIGFjdGl2YXRlX3Jlc3RvcmUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmlzX3Jlc3RvcmVfYWN0aXZlOgorICAgICAgICAgICAgZm9yIHNlcSBpbiBzZWxmLlJFU1RPUkVfU0VRVUVOQ0VTOgorICAgICAgICAgICAgICAgIHNlbGYudGV4dC5ldmVudF9hZGQoc2VsZi5SRVNUT1JFX1ZJUlRVQUxfRVZFTlRfTkFNRSwgc2VxKQorICAgICAgICAgICAgc2VsZi5pc19yZXN0b3JlX2FjdGl2ZSA9IFRydWUKKworICAgIGRlZiBkZWFjdGl2YXRlX3Jlc3RvcmUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaXNfcmVzdG9yZV9hY3RpdmU6CisgICAgICAgICAgICBmb3Igc2VxIGluIHNlbGYuUkVTVE9SRV9TRVFVRU5DRVM6CisgICAgICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2RlbGV0ZShzZWxmLlJFU1RPUkVfVklSVFVBTF9FVkVOVF9OQU1FLCBzZXEpCisgICAgICAgICAgICBzZWxmLmlzX3Jlc3RvcmVfYWN0aXZlID0gRmFsc2UKKworICAgIGRlZiBzZXRfc3R5bGUoc2VsZiwgc3R5bGUpOgorICAgICAgICBzZWxmLlNUWUxFID0gc3R5bGUKKyAgICAgICAgaWYgc3R5bGUgPT0gImRlZmF1bHQiOgorICAgICAgICAgICAgc2VsZi5jcmVhdGVfdGFnID0gc2VsZi5jcmVhdGVfdGFnX2RlZmF1bHQKKyAgICAgICAgICAgIHNlbGYuc2V0X3RpbWVvdXQgPSBzZWxmLnNldF90aW1lb3V0X2xhc3QKKyAgICAgICAgZWxpZiBzdHlsZSA9PSAiZXhwcmVzc2lvbiI6CisgICAgICAgICAgICBzZWxmLmNyZWF0ZV90YWcgPSBzZWxmLmNyZWF0ZV90YWdfZXhwcmVzc2lvbgorICAgICAgICAgICAgc2VsZi5zZXRfdGltZW91dCA9IHNlbGYuc2V0X3RpbWVvdXRfbm9uZQorCisgICAgZGVmIGZsYXNoX3BhcmVuX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaW5kaWNlcyA9IEh5cGVyUGFyc2VyKHNlbGYuZWRpdHdpbiwgImluc2VydCIpLmdldF9zdXJyb3VuZGluZ19icmFja2V0cygpCisgICAgICAgIGlmIGluZGljZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYud2Fybl9taXNtYXRjaGVkKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFjdGl2YXRlX3Jlc3RvcmUoKQorICAgICAgICBzZWxmLmNyZWF0ZV90YWcoaW5kaWNlcykKKyAgICAgICAgc2VsZi5zZXRfdGltZW91dF9sYXN0KCkKKworICAgIGRlZiBwYXJlbl9jbG9zZWRfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAjIElmIGl0IHdhcyBhIHNob3J0Y3V0IGFuZCBub3QgcmVhbGx5IGEgY2xvc2luZyBwYXJlbiwgcXVpdC4KKyAgICAgICAgY2xvc2VyID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0LTFjIikKKyAgICAgICAgaWYgY2xvc2VyIG5vdCBpbiBfb3BlbmVyczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBocCA9IEh5cGVyUGFyc2VyKHNlbGYuZWRpdHdpbiwgImluc2VydC0xYyIpCisgICAgICAgIGlmIG5vdCBocC5pc19pbl9jb2RlKCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW5kaWNlcyA9IGhwLmdldF9zdXJyb3VuZGluZ19icmFja2V0cyhfb3BlbmVyc1tjbG9zZXJdLCBUcnVlKQorICAgICAgICBpZiBpbmRpY2VzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLndhcm5fbWlzbWF0Y2hlZCgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hY3RpdmF0ZV9yZXN0b3JlKCkKKyAgICAgICAgc2VsZi5jcmVhdGVfdGFnKGluZGljZXMpCisgICAgICAgIHNlbGYuc2V0X3RpbWVvdXQoKQorCisgICAgZGVmIHJlc3RvcmVfZXZlbnQoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHNlbGYudGV4dC50YWdfZGVsZXRlKCJwYXJlbiIpCisgICAgICAgIHNlbGYuZGVhY3RpdmF0ZV9yZXN0b3JlKCkKKyAgICAgICAgc2VsZi5jb3VudGVyICs9IDEgICAjIGRpc2FibGUgdGhlIGxhc3QgdGltZXIsIGlmIHRoZXJlIGlzIG9uZS4KKworICAgIGRlZiBoYW5kbGVfcmVzdG9yZV90aW1lcihzZWxmLCB0aW1lcl9jb3VudCk6CisgICAgICAgIGlmIHRpbWVyX2NvdW50ID09IHNlbGYuY291bnRlcjoKKyAgICAgICAgICAgIHNlbGYucmVzdG9yZV9ldmVudCgpCisKKyAgICBkZWYgd2Fybl9taXNtYXRjaGVkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLkJFTEw6CisgICAgICAgICAgICBzZWxmLnRleHQuYmVsbCgpCisKKyAgICAjIGFueSBvbmUgb2YgdGhlIGNyZWF0ZV90YWdfWFhYIG1ldGhvZHMgY2FuIGJlIHVzZWQgZGVwZW5kaW5nIG9uCisgICAgIyB0aGUgc3R5bGUKKworICAgIGRlZiBjcmVhdGVfdGFnX2RlZmF1bHQoc2VsZiwgaW5kaWNlcyk6CisgICAgICAgICIiIkhpZ2hsaWdodCB0aGUgc2luZ2xlIHBhcmVuIHRoYXQgbWF0Y2hlcyIiIgorICAgICAgICBzZWxmLnRleHQudGFnX2FkZCgicGFyZW4iLCBpbmRpY2VzWzBdKQorICAgICAgICBzZWxmLnRleHQudGFnX2NvbmZpZygicGFyZW4iLCBzZWxmLkhJTElURV9DT05GSUcpCisKKyAgICBkZWYgY3JlYXRlX3RhZ19leHByZXNzaW9uKHNlbGYsIGluZGljZXMpOgorICAgICAgICAiIiJIaWdobGlnaHQgdGhlIGVudGlyZSBleHByZXNzaW9uIiIiCisgICAgICAgIGlmIHNlbGYudGV4dC5nZXQoaW5kaWNlc1sxXSkgaW4gKCcpJywgJ10nLCAnfScpOgorICAgICAgICAgICAgcmlnaHRpbmRleCA9IGluZGljZXNbMV0rIisxYyIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJpZ2h0aW5kZXggPSBpbmRpY2VzWzFdCisgICAgICAgIHNlbGYudGV4dC50YWdfYWRkKCJwYXJlbiIsIGluZGljZXNbMF0sIHJpZ2h0aW5kZXgpCisgICAgICAgIHNlbGYudGV4dC50YWdfY29uZmlnKCJwYXJlbiIsIHNlbGYuSElMSVRFX0NPTkZJRykKKworICAgICMgYW55IG9uZSBvZiB0aGUgc2V0X3RpbWVvdXRfWFhYIG1ldGhvZHMgY2FuIGJlIHVzZWQgZGVwZW5kaW5nIG9uCisgICAgIyB0aGUgc3R5bGUKKworICAgIGRlZiBzZXRfdGltZW91dF9ub25lKHNlbGYpOgorICAgICAgICAiIiJIaWdobGlnaHQgd2lsbCByZW1haW4gdW50aWwgdXNlciBpbnB1dCB0dXJucyBpdCBvZmYKKyAgICAgICAgb3IgdGhlIGluc2VydCBoYXMgbW92ZWQiIiIKKyAgICAgICAgIyBBZnRlciBDSEVDS19ERUxBWSwgY2FsbCBhIGZ1bmN0aW9uIHdoaWNoIGRpc2FibGVzIHRoZSAicGFyZW4iIHRhZworICAgICAgICAjIGlmIHRoZSBldmVudCBpcyBmb3IgdGhlIG1vc3QgcmVjZW50IHRpbWVyIGFuZCB0aGUgaW5zZXJ0IGhhcyBjaGFuZ2VkLAorICAgICAgICAjIG9yIHNjaGVkdWxlcyBhbm90aGVyIGNhbGwgZm9yIGl0c2VsZi4KKyAgICAgICAgc2VsZi5jb3VudGVyICs9IDEKKyAgICAgICAgZGVmIGNhbGxtZShjYWxsbWUsIHNlbGY9c2VsZiwgYz1zZWxmLmNvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgaW5kZXg9c2VsZi50ZXh0LmluZGV4KCJpbnNlcnQiKSk6CisgICAgICAgICAgICBpZiBpbmRleCAhPSBzZWxmLnRleHQuaW5kZXgoImluc2VydCIpOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX3Jlc3RvcmVfdGltZXIoYykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lZGl0d2luLnRleHRfZnJhbWUuYWZ0ZXIoQ0hFQ0tfREVMQVksIGNhbGxtZSwgY2FsbG1lKQorICAgICAgICBzZWxmLmVkaXR3aW4udGV4dF9mcmFtZS5hZnRlcihDSEVDS19ERUxBWSwgY2FsbG1lLCBjYWxsbWUpCisKKyAgICBkZWYgc2V0X3RpbWVvdXRfbGFzdChzZWxmKToKKyAgICAgICAgIiIiVGhlIGxhc3QgaGlnaGxpZ2h0IGNyZWF0ZWQgd2lsbCBiZSByZW1vdmVkIGFmdGVyIC41IHNlYyIiIgorICAgICAgICAjIGFzc29jaWF0ZSBhIGNvdW50ZXIgd2l0aCBhbiBldmVudDsgb25seSBkaXNhYmxlIHRoZSAicGFyZW4iCisgICAgICAgICMgdGFnIGlmIHRoZSBldmVudCBpcyBmb3IgdGhlIG1vc3QgcmVjZW50IHRpbWVyLgorICAgICAgICBzZWxmLmNvdW50ZXIgKz0gMQorICAgICAgICBzZWxmLmVkaXR3aW4udGV4dF9mcmFtZS5hZnRlcihzZWxmLkZMQVNIX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgc2VsZj1zZWxmLCBjPXNlbGYuY291bnRlcjogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZXN0b3JlX3RpbWVyKGMpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhcmVuTWF0Y2gucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhcmVuTWF0Y2gucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDFjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGFyZW5NYXRjaC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhcmVuTWF0Y2gucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhcmVuTWF0Y2gucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDFjMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGFyZW5NYXRjaC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhdGhCcm93c2VyLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhdGhCcm93c2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OGE0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGF0aEJyb3dzZXIucHkKQEAgLTAsMCArMSw5NSBAQAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgaW1wCisKK2Zyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlSXRlbQorZnJvbSBpZGxlbGliLkNsYXNzQnJvd3NlciBpbXBvcnQgQ2xhc3NCcm93c2VyLCBNb2R1bGVCcm93c2VyVHJlZUl0ZW0KKworY2xhc3MgUGF0aEJyb3dzZXIoQ2xhc3NCcm93c2VyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGlzdCk6CisgICAgICAgIHNlbGYuaW5pdChmbGlzdCkKKworICAgIGRlZiBzZXR0aXRsZShzZWxmKToKKyAgICAgICAgc2VsZi50b3Aud21fdGl0bGUoIlBhdGggQnJvd3NlciIpCisgICAgICAgIHNlbGYudG9wLndtX2ljb25uYW1lKCJQYXRoIEJyb3dzZXIiKQorCisgICAgZGVmIHJvb3Rub2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gUGF0aEJyb3dzZXJUcmVlSXRlbSgpCisKK2NsYXNzIFBhdGhCcm93c2VyVHJlZUl0ZW0oVHJlZUl0ZW0pOgorCisgICAgZGVmIEdldFRleHQoc2VsZik6CisgICAgICAgIHJldHVybiAic3lzLnBhdGgiCisKKyAgICBkZWYgR2V0U3ViTGlzdChzZWxmKToKKyAgICAgICAgc3VibGlzdCA9IFtdCisgICAgICAgIGZvciBkaXIgaW4gc3lzLnBhdGg6CisgICAgICAgICAgICBpdGVtID0gRGlyQnJvd3NlclRyZWVJdGVtKGRpcikKKyAgICAgICAgICAgIHN1Ymxpc3QuYXBwZW5kKGl0ZW0pCisgICAgICAgIHJldHVybiBzdWJsaXN0CisKK2NsYXNzIERpckJyb3dzZXJUcmVlSXRlbShUcmVlSXRlbSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGlyLCBwYWNrYWdlcz1bXSk6CisgICAgICAgIHNlbGYuZGlyID0gZGlyCisgICAgICAgIHNlbGYucGFja2FnZXMgPSBwYWNrYWdlcworCisgICAgZGVmIEdldFRleHQoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGlyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYWNrYWdlc1stMV0gKyAiOiBwYWNrYWdlIgorCisgICAgZGVmIEdldFN1Ykxpc3Qoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihzZWxmLmRpciBvciBvcy5jdXJkaXIpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBwYWNrYWdlcyA9IFtdCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLmRpciwgbmFtZSkKKyAgICAgICAgICAgIGlmIHNlbGYuaXNwYWNrYWdlZGlyKGZpbGUpOgorICAgICAgICAgICAgICAgIG5uID0gb3MucGF0aC5ub3JtY2FzZShuYW1lKQorICAgICAgICAgICAgICAgIHBhY2thZ2VzLmFwcGVuZCgobm4sIG5hbWUsIGZpbGUpKQorICAgICAgICBwYWNrYWdlcy5zb3J0KCkKKyAgICAgICAgc3VibGlzdCA9IFtdCisgICAgICAgIGZvciBubiwgbmFtZSwgZmlsZSBpbiBwYWNrYWdlczoKKyAgICAgICAgICAgIGl0ZW0gPSBEaXJCcm93c2VyVHJlZUl0ZW0oZmlsZSwgc2VsZi5wYWNrYWdlcyArIFtuYW1lXSkKKyAgICAgICAgICAgIHN1Ymxpc3QuYXBwZW5kKGl0ZW0pCisgICAgICAgIGZvciBubiwgbmFtZSBpbiBzZWxmLmxpc3Rtb2R1bGVzKG5hbWVzKToKKyAgICAgICAgICAgIGl0ZW0gPSBNb2R1bGVCcm93c2VyVHJlZUl0ZW0ob3MucGF0aC5qb2luKHNlbGYuZGlyLCBuYW1lKSkKKyAgICAgICAgICAgIHN1Ymxpc3QuYXBwZW5kKGl0ZW0pCisgICAgICAgIHJldHVybiBzdWJsaXN0CisKKyAgICBkZWYgaXNwYWNrYWdlZGlyKHNlbGYsIGZpbGUpOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihmaWxlKToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGluaXQgPSBvcy5wYXRoLmpvaW4oZmlsZSwgIl9faW5pdF9fLnB5IikKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhpc3RzKGluaXQpCisKKyAgICBkZWYgbGlzdG1vZHVsZXMoc2VsZiwgYWxsbmFtZXMpOgorICAgICAgICBtb2R1bGVzID0ge30KKyAgICAgICAgc3VmZml4ZXMgPSBpbXAuZ2V0X3N1ZmZpeGVzKCkKKyAgICAgICAgc29ydGVkID0gW10KKyAgICAgICAgZm9yIHN1ZmYsIG1vZGUsIGZsYWcgaW4gc3VmZml4ZXM6CisgICAgICAgICAgICBpID0gLWxlbihzdWZmKQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gYWxsbmFtZXNbOl06CisgICAgICAgICAgICAgICAgbm9ybWVkX25hbWUgPSBvcy5wYXRoLm5vcm1jYXNlKG5hbWUpCisgICAgICAgICAgICAgICAgaWYgbm9ybWVkX25hbWVbaTpdID09IHN1ZmY6CisgICAgICAgICAgICAgICAgICAgIG1vZF9uYW1lID0gbmFtZVs6aV0KKyAgICAgICAgICAgICAgICAgICAgaWYgbW9kX25hbWUgbm90IGluIG1vZHVsZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzW21vZF9uYW1lXSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZC5hcHBlbmQoKG5vcm1lZF9uYW1lLCBuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG5hbWVzLnJlbW92ZShuYW1lKQorICAgICAgICBzb3J0ZWQuc29ydCgpCisgICAgICAgIHJldHVybiBzb3J0ZWQKKworZGVmIG1haW4oKToKKyAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IFB5U2hlbGwKKyAgICBQYXRoQnJvd3NlcihQeVNoZWxsLmZsaXN0KQorICAgIGlmIHN5cy5zdGRpbiBpcyBzeXMuX19zdGRpbl9fOgorICAgICAgICBtYWlubG9vcCgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGF0aEJyb3dzZXIucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhdGhCcm93c2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2M5MmE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhdGhCcm93c2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGF0aEJyb3dzZXIucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhdGhCcm93c2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2M5MmE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhdGhCcm93c2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGVyY29sYXRvci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QZXJjb2xhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNDY4OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGVyY29sYXRvci5weQpAQCAtMCwwICsxLDg1IEBACitmcm9tIGlkbGVsaWIuV2lkZ2V0UmVkaXJlY3RvciBpbXBvcnQgV2lkZ2V0UmVkaXJlY3RvcgorZnJvbSBpZGxlbGliLkRlbGVnYXRvciBpbXBvcnQgRGVsZWdhdG9yCisKK2NsYXNzIFBlcmNvbGF0b3I6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCk6CisgICAgICAgICMgWFhYIHdvdWxkIGJlIG5pY2UgdG8gaW5oZXJpdCBmcm9tIERlbGVnYXRvcgorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CisgICAgICAgIHNlbGYucmVkaXIgPSBXaWRnZXRSZWRpcmVjdG9yKHRleHQpCisgICAgICAgIHNlbGYudG9wID0gc2VsZi5ib3R0b20gPSBEZWxlZ2F0b3IodGV4dCkKKyAgICAgICAgc2VsZi5ib3R0b20uaW5zZXJ0ID0gc2VsZi5yZWRpci5yZWdpc3RlcigiaW5zZXJ0Iiwgc2VsZi5pbnNlcnQpCisgICAgICAgIHNlbGYuYm90dG9tLmRlbGV0ZSA9IHNlbGYucmVkaXIucmVnaXN0ZXIoImRlbGV0ZSIsIHNlbGYuZGVsZXRlKQorICAgICAgICBzZWxmLmZpbHRlcnMgPSBbXQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICB3aGlsZSBzZWxmLnRvcCBpcyBub3Qgc2VsZi5ib3R0b206CisgICAgICAgICAgICBzZWxmLnJlbW92ZWZpbHRlcihzZWxmLnRvcCkKKyAgICAgICAgc2VsZi50b3AgPSBOb25lCisgICAgICAgIHNlbGYuYm90dG9tLnNldGRlbGVnYXRlKE5vbmUpOyBzZWxmLmJvdHRvbSA9IE5vbmUKKyAgICAgICAgc2VsZi5yZWRpci5jbG9zZSgpOyBzZWxmLnJlZGlyID0gTm9uZQorICAgICAgICBzZWxmLnRleHQgPSBOb25lCisKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGluZGV4LCBjaGFycywgdGFncz1Ob25lKToKKyAgICAgICAgIyBDb3VsZCBnbyBhd2F5IGlmIGluaGVyaXRpbmcgZnJvbSBEZWxlZ2F0b3IKKyAgICAgICAgc2VsZi50b3AuaW5zZXJ0KGluZGV4LCBjaGFycywgdGFncykKKworICAgIGRlZiBkZWxldGUoc2VsZiwgaW5kZXgxLCBpbmRleDI9Tm9uZSk6CisgICAgICAgICMgQ291bGQgZ28gYXdheSBpZiBpbmhlcml0aW5nIGZyb20gRGVsZWdhdG9yCisgICAgICAgIHNlbGYudG9wLmRlbGV0ZShpbmRleDEsIGluZGV4MikKKworICAgIGRlZiBpbnNlcnRmaWx0ZXIoc2VsZiwgZmlsdGVyKToKKyAgICAgICAgIyBQZXJoYXBzIHJlbmFtZSB0byBwdXNoZmlsdGVyKCk/CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGZpbHRlciwgRGVsZWdhdG9yKQorICAgICAgICBhc3NlcnQgZmlsdGVyLmRlbGVnYXRlIGlzIE5vbmUKKyAgICAgICAgZmlsdGVyLnNldGRlbGVnYXRlKHNlbGYudG9wKQorICAgICAgICBzZWxmLnRvcCA9IGZpbHRlcgorCisgICAgZGVmIHJlbW92ZWZpbHRlcihzZWxmLCBmaWx0ZXIpOgorICAgICAgICAjIFhYWCBQZXJoYXBzIHNob3VsZCBvbmx5IHN1cHBvcnQgcG9wZmlsdGVyKCk/CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGZpbHRlciwgRGVsZWdhdG9yKQorICAgICAgICBhc3NlcnQgZmlsdGVyLmRlbGVnYXRlIGlzIG5vdCBOb25lCisgICAgICAgIGYgPSBzZWxmLnRvcAorICAgICAgICBpZiBmIGlzIGZpbHRlcjoKKyAgICAgICAgICAgIHNlbGYudG9wID0gZmlsdGVyLmRlbGVnYXRlCisgICAgICAgICAgICBmaWx0ZXIuc2V0ZGVsZWdhdGUoTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdoaWxlIGYuZGVsZWdhdGUgaXMgbm90IGZpbHRlcjoKKyAgICAgICAgICAgICAgICBhc3NlcnQgZiBpcyBub3Qgc2VsZi5ib3R0b20KKyAgICAgICAgICAgICAgICBmLnJlc2V0Y2FjaGUoKQorICAgICAgICAgICAgICAgIGYgPSBmLmRlbGVnYXRlCisgICAgICAgICAgICBmLnNldGRlbGVnYXRlKGZpbHRlci5kZWxlZ2F0ZSkKKyAgICAgICAgICAgIGZpbHRlci5zZXRkZWxlZ2F0ZShOb25lKQorCisKK2RlZiBtYWluKCk6CisgICAgY2xhc3MgVHJhY2VyKERlbGVnYXRvcik6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgICAgIERlbGVnYXRvci5fX2luaXRfXyhzZWxmLCBOb25lKQorICAgICAgICBkZWYgaW5zZXJ0KHNlbGYsICphcmdzKToKKyAgICAgICAgICAgIHByaW50IHNlbGYubmFtZSwgIjogaW5zZXJ0IiwgYXJncworICAgICAgICAgICAgc2VsZi5kZWxlZ2F0ZS5pbnNlcnQoKmFyZ3MpCisgICAgICAgIGRlZiBkZWxldGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBkZWxldGUiLCBhcmdzCisgICAgICAgICAgICBzZWxmLmRlbGVnYXRlLmRlbGV0ZSgqYXJncykKKyAgICByb290ID0gVGsoKQorICAgIHJvb3Qud21fcHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCByb290LnF1aXQpCisgICAgdGV4dCA9IFRleHQoKQorICAgIHRleHQucGFjaygpCisgICAgdGV4dC5mb2N1c19zZXQoKQorICAgIHAgPSBQZXJjb2xhdG9yKHRleHQpCisgICAgdDEgPSBUcmFjZXIoInQxIikKKyAgICB0MiA9IFRyYWNlcigidDIiKQorICAgIHAuaW5zZXJ0ZmlsdGVyKHQxKQorICAgIHAuaW5zZXJ0ZmlsdGVyKHQyKQorICAgIHJvb3QubWFpbmxvb3AoKQorICAgIHAucmVtb3ZlZmlsdGVyKHQyKQorICAgIHJvb3QubWFpbmxvb3AoKQorICAgIHAuaW5zZXJ0ZmlsdGVyKHQyKQorICAgIHAucmVtb3ZlZmlsdGVyKHQxKQorICAgIHJvb3QubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGZyb20gVGtpbnRlciBpbXBvcnQgKgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BlcmNvbGF0b3IucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BlcmNvbGF0b3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiOWEzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGVyY29sYXRvci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BlcmNvbGF0b3IucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BlcmNvbGF0b3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmI2YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGVyY29sYXRvci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1B5UGFyc2UucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlQYXJzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTlkYjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1B5UGFyc2UucHkKQEAgLTAsMCArMSw1OTQgQEAKK2ltcG9ydCByZQoraW1wb3J0IHN5cworCisjIFJlYXNvbiBsYXN0IHN0bXQgaXMgY29udGludWVkIChvciBDX05PTkUgaWYgaXQncyBub3QpLgorKENfTk9ORSwgQ19CQUNLU0xBU0gsIENfU1RSSU5HX0ZJUlNUX0xJTkUsCisgQ19TVFJJTkdfTkVYVF9MSU5FUywgQ19CUkFDS0VUKSA9IHJhbmdlKDUpCisKK2lmIDA6ICAgIyBmb3IgdGhyb3dhd2F5IGRlYnVnZ2luZyBvdXRwdXQKKyAgICBkZWYgZHVtcCgqc3R1ZmYpOgorICAgICAgICBzeXMuX19zdGRvdXRfXy53cml0ZSgiICIuam9pbihtYXAoc3RyLCBzdHVmZikpICsgIlxuIikKKworIyBGaW5kIHdoYXQgbG9va3MgbGlrZSB0aGUgc3RhcnQgb2YgYSBwb3B1bGFyIHN0bXQuCisKK19zeW5jaHJlID0gcmUuY29tcGlsZShyIiIiCisgICAgXgorICAgIFsgXHRdKgorICAgICg/OiB3aGlsZQorICAgIHwgICBlbHNlCisgICAgfCAgIGRlZgorICAgIHwgICByZXR1cm4KKyAgICB8ICAgYXNzZXJ0CisgICAgfCAgIGJyZWFrCisgICAgfCAgIGNsYXNzCisgICAgfCAgIGNvbnRpbnVlCisgICAgfCAgIGVsaWYKKyAgICB8ICAgdHJ5CisgICAgfCAgIGV4Y2VwdAorICAgIHwgICByYWlzZQorICAgIHwgICBpbXBvcnQKKyAgICB8ICAgeWllbGQKKyAgICApCisgICAgXGIKKyIiIiwgcmUuVkVSQk9TRSB8IHJlLk1VTFRJTElORSkuc2VhcmNoCisKKyMgTWF0Y2ggYmxhbmsgbGluZSBvciBub24taW5kZW50aW5nIGNvbW1lbnQgbGluZS4KKworX2p1bmtyZSA9IHJlLmNvbXBpbGUociIiIgorICAgIFsgXHRdKgorICAgICg/OiBcIyBcUyAuKiApPworICAgIFxuCisiIiIsIHJlLlZFUkJPU0UpLm1hdGNoCisKKyMgTWF0Y2ggYW55IGZsYXZvciBvZiBzdHJpbmc7IHRoZSB0ZXJtaW5hdGluZyBxdW90ZSBpcyBvcHRpb25hbAorIyBzbyB0aGF0IHdlJ3JlIHJvYnVzdCBpbiB0aGUgZmFjZSBvZiBpbmNvbXBsZXRlIHByb2dyYW0gdGV4dC4KKworX21hdGNoX3N0cmluZ3JlID0gcmUuY29tcGlsZShyIiIiCisgICAgXCIiIiBbXiJcXF0qICg/OgorICAgICAgICAgICAgICAgICAgICAgKD86IFxcLiB8ICIoPyEiIikgKQorICAgICAgICAgICAgICAgICAgICAgW14iXFxdKgorICAgICAgICAgICAgICAgICApKgorICAgICg/OiBcIiIiICk/CisKK3wgICAiIFteIlxcXG5dKiAoPzogXFwuIFteIlxcXG5dKiApKiAiPworCit8ICAgJycnIFteJ1xcXSogKD86CisgICAgICAgICAgICAgICAgICAgKD86IFxcLiB8ICcoPyEnJykgKQorICAgICAgICAgICAgICAgICAgIFteJ1xcXSoKKyAgICAgICAgICAgICAgICApKgorICAgICg/OiAnJycgKT8KKworfCAgICcgW14nXFxcbl0qICg/OiBcXC4gW14nXFxcbl0qICkqICc/CisiIiIsIHJlLlZFUkJPU0UgfCByZS5ET1RBTEwpLm1hdGNoCisKKyMgTWF0Y2ggYSBsaW5lIHRoYXQgc3RhcnRzIHdpdGggc29tZXRoaW5nIGludGVyZXN0aW5nOworIyB1c2VkIHRvIGZpbmQgdGhlIGZpcnN0IGl0ZW0gb2YgYSBicmFja2V0IHN0cnVjdHVyZS4KKworX2l0ZW1yZSA9IHJlLmNvbXBpbGUociIiIgorICAgIFsgXHRdKgorICAgIFteXHMjXFxdICAgICMgaWYgd2UgbWF0Y2gsIG0uZW5kKCktMSBpcyB0aGUgaW50ZXJlc3RpbmcgY2hhcgorIiIiLCByZS5WRVJCT1NFKS5tYXRjaAorCisjIE1hdGNoIHN0YXJ0IG9mIHN0bXRzIHRoYXQgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgZGVkZW50LgorCitfY2xvc2VyZSA9IHJlLmNvbXBpbGUociIiIgorICAgIFxzKgorICAgICg/OiByZXR1cm4KKyAgICB8ICAgYnJlYWsKKyAgICB8ICAgY29udGludWUKKyAgICB8ICAgcmFpc2UKKyAgICB8ICAgcGFzcworICAgICkKKyAgICBcYgorIiIiLCByZS5WRVJCT1NFKS5tYXRjaAorCisjIENoZXcgdXAgbm9uLXNwZWNpYWwgY2hhcnMgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4gIElmIG1hdGNoIGlzCisjIHN1Y2Nlc3NmdWwsIG0uZW5kKCkgbGVzcyAxIGlzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBib3JpbmcgY2hhcgorIyBtYXRjaGVkLiAgSWYgbWF0Y2ggaXMgdW5zdWNjZXNzZnVsLCB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoIGFuCisjIGludGVyZXN0aW5nIGNoYXIuCisKK19jaGV3X29yZGluYXJ5cmUgPSByZS5jb21waWxlKHIiIiIKKyAgICBbXltcXSgpe30jJyJcXF0rCisiIiIsIHJlLlZFUkJPU0UpLm1hdGNoCisKKyMgQnVpbGQgdHJhbnNsYXRpb24gdGFibGUgdG8gbWFwIHVuaW50ZXJlc3RpbmcgY2hhcnMgdG8gIngiLCBvcGVuCisjIGJyYWNrZXRzIHRvICIoIiwgYW5kIGNsb3NlIGJyYWNrZXRzIHRvICIpIi4KKworX3RyYW4gPSBbJ3gnXSAqIDI1NgorZm9yIGNoIGluICIoe1siOgorICAgIF90cmFuW29yZChjaCldID0gJygnCitmb3IgY2ggaW4gIil9XSI6CisgICAgX3RyYW5bb3JkKGNoKV0gPSAnKScKK2ZvciBjaCBpbiAiXCInXFxcbiMiOgorICAgIF90cmFuW29yZChjaCldID0gY2gKK190cmFuID0gJycuam9pbihfdHJhbikKK2RlbCBjaAorCit0cnk6CisgICAgVW5pY29kZVR5cGUgPSB0eXBlKHVuaWNvZGUoIiIpKQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBVbmljb2RlVHlwZSA9IE5vbmUKKworY2xhc3MgUGFyc2VyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGVudHdpZHRoLCB0YWJ3aWR0aCk6CisgICAgICAgIHNlbGYuaW5kZW50d2lkdGggPSBpbmRlbnR3aWR0aAorICAgICAgICBzZWxmLnRhYndpZHRoID0gdGFid2lkdGgKKworICAgIGRlZiBzZXRfc3RyKHNlbGYsIHN0cik6CisgICAgICAgIGFzc2VydCBsZW4oc3RyKSA9PSAwIG9yIHN0clstMV0gPT0gJ1xuJworICAgICAgICBpZiB0eXBlKHN0cikgaXMgVW5pY29kZVR5cGU6CisgICAgICAgICAgICAjIFRoZSBwYXJzZSBmdW5jdGlvbnMgaGF2ZSBubyBpZGVhIHdoYXQgdG8gZG8gd2l0aCBVbmljb2RlLCBzbworICAgICAgICAgICAgIyByZXBsYWNlIGFsbCBVbmljb2RlIGNoYXJhY3RlcnMgd2l0aCAieCIuICBUaGlzIGlzICJzYWZlIgorICAgICAgICAgICAgIyBzbyBsb25nIGFzIHRoZSBvbmx5IGNoYXJhY3RlcnMgZ2VybWFuZSB0byBwYXJzaW5nIHRoZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICMgb2YgUHl0aG9uIGFyZSA3LWJpdCBBU0NJSS4gIEl0J3MgKm5lY2Vzc2FyeSogYmVjYXVzZSBVbmljb2RlCisgICAgICAgICAgICAjIHN0cmluZ3MgZG9uJ3QgaGF2ZSBhIC50cmFuc2xhdGUoKSBtZXRob2QgdGhhdCBzdXBwb3J0cworICAgICAgICAgICAgIyBkZWxldGVjaGFycy4KKyAgICAgICAgICAgIHVuaXBob29leSA9IHN0cgorICAgICAgICAgICAgc3RyID0gW10KKyAgICAgICAgICAgIHB1c2ggPSBzdHIuYXBwZW5kCisgICAgICAgICAgICBmb3IgcmF3IGluIG1hcChvcmQsIHVuaXBob29leSk6CisgICAgICAgICAgICAgICAgcHVzaChyYXcgPCAxMjcgYW5kIGNocihyYXcpIG9yICJ4IikKKyAgICAgICAgICAgIHN0ciA9ICIiLmpvaW4oc3RyKQorICAgICAgICBzZWxmLnN0ciA9IHN0cgorICAgICAgICBzZWxmLnN0dWR5X2xldmVsID0gMAorCisgICAgIyBSZXR1cm4gaW5kZXggb2YgYSBnb29kIHBsYWNlIHRvIGJlZ2luIHBhcnNpbmcsIGFzIGNsb3NlIHRvIHRoZQorICAgICMgZW5kIG9mIHRoZSBzdHJpbmcgYXMgcG9zc2libGUuICBUaGlzIHdpbGwgYmUgdGhlIHN0YXJ0IG9mIHNvbWUKKyAgICAjIHBvcHVsYXIgc3RtdCBsaWtlICJpZiIgb3IgImRlZiIuICBSZXR1cm4gTm9uZSBpZiBub25lIGZvdW5kOgorICAgICMgdGhlIGNhbGxlciBzaG91bGQgcGFzcyBtb3JlIHByaW9yIGNvbnRleHQgdGhlbiwgaWYgcG9zc2libGUsIG9yCisgICAgIyBpZiBub3QgKHRoZSBlbnRpcmUgcHJvZ3JhbSB0ZXh0IHVwIHVudGlsIHRoZSBwb2ludCBvZiBpbnRlcmVzdAorICAgICMgaGFzIGFscmVhZHkgYmVlbiB0cmllZCkgcGFzcyAwIHRvIHNldF9sby4KKyAgICAjCisgICAgIyBUaGlzIHdpbGwgYmUgcmVsaWFibGUgaWZmIGdpdmVuIGEgcmVsaWFibGUgaXNfY2hhcl9pbl9zdHJpbmcKKyAgICAjIGZ1bmN0aW9uLCBtZWFuaW5nIHRoYXQgd2hlbiBpdCBzYXlzICJubyIsIGl0J3MgYWJzb2x1dGVseQorICAgICMgZ3VhcmFudGVlZCB0aGF0IHRoZSBjaGFyIGlzIG5vdCBpbiBhIHN0cmluZy4KKworICAgIGRlZiBmaW5kX2dvb2RfcGFyc2Vfc3RhcnQoc2VsZiwgaXNfY2hhcl9pbl9zdHJpbmc9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zeW5jaHJlPV9zeW5jaHJlKToKKyAgICAgICAgc3RyLCBwb3MgPSBzZWxmLnN0ciwgTm9uZQorCisgICAgICAgIGlmIG5vdCBpc19jaGFyX2luX3N0cmluZzoKKyAgICAgICAgICAgICMgbm8gY2x1ZSAtLSBtYWtlIHRoZSBjYWxsZXIgcGFzcyBldmVyeXRoaW5nCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgUGVlayBiYWNrIGZyb20gdGhlIGVuZCBmb3IgYSBnb29kIHBsYWNlIHRvIHN0YXJ0LAorICAgICAgICAjIGJ1dCBkb24ndCB0cnkgdG9vIG9mdGVuOyBwb3Mgd2lsbCBiZSBsZWZ0IE5vbmUsIG9yCisgICAgICAgICMgYnVtcGVkIHRvIGEgbGVnaXRpbWF0ZSBzeW5jaCBwb2ludC4KKyAgICAgICAgbGltaXQgPSBsZW4oc3RyKQorICAgICAgICBmb3IgdHJpZXMgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICBpID0gc3RyLnJmaW5kKCI6XG4iLCAwLCBsaW1pdCkKKyAgICAgICAgICAgIGlmIGkgPCAwOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpID0gc3RyLnJmaW5kKCdcbicsIDAsIGkpICsgMSAgIyBzdGFydCBvZiBjb2xvbiBsaW5lCisgICAgICAgICAgICBtID0gX3N5bmNocmUoc3RyLCBpLCBsaW1pdCkKKyAgICAgICAgICAgIGlmIG0gYW5kIG5vdCBpc19jaGFyX2luX3N0cmluZyhtLnN0YXJ0KCkpOgorICAgICAgICAgICAgICAgIHBvcyA9IG0uc3RhcnQoKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBsaW1pdCA9IGkKKyAgICAgICAgaWYgcG9zIGlzIE5vbmU6CisgICAgICAgICAgICAjIE5vdGhpbmcgbG9va3MgbGlrZSBhIGJsb2NrLW9wZW5lciwgb3Igc3R1ZmYgZG9lcworICAgICAgICAgICAgIyBidXQgaXNfY2hhcl9pbl9zdHJpbmcga2VlcHMgcmV0dXJuaW5nIHRydWU7IG1vc3QgbGlrZWx5CisgICAgICAgICAgICAjIHdlJ3JlIGluIG9yIG5lYXIgYSBnaWFudCBzdHJpbmcsIHRoZSBjb2xvcml6ZXIgaGFzbid0CisgICAgICAgICAgICAjIGNhdWdodCB1cCBlbm91Z2ggdG8gYmUgaGVscGZ1bCwgb3IgdGhlcmUgc2ltcGx5ICphcmVuJ3QqCisgICAgICAgICAgICAjIGFueSBpbnRlcmVzdGluZyBzdG10cy4gIEluIGFueSBvZiB0aGVzZSBjYXNlcyB3ZSdyZQorICAgICAgICAgICAgIyBnb2luZyB0byBoYXZlIHRvIHBhcnNlIHRoZSB3aG9sZSB0aGluZyB0byBiZSBzdXJlLCBzbworICAgICAgICAgICAgIyBnaXZlIGl0IG9uZSBsYXN0IHRyeSBmcm9tIHRoZSBzdGFydCwgYnV0IHN0b3Agd2FzdGluZworICAgICAgICAgICAgIyB0aW1lIGhlcmUgcmVnYXJkbGVzcyBvZiB0aGUgb3V0Y29tZS4KKyAgICAgICAgICAgIG0gPSBfc3luY2hyZShzdHIpCisgICAgICAgICAgICBpZiBtIGFuZCBub3QgaXNfY2hhcl9pbl9zdHJpbmcobS5zdGFydCgpKToKKyAgICAgICAgICAgICAgICBwb3MgPSBtLnN0YXJ0KCkKKyAgICAgICAgICAgIHJldHVybiBwb3MKKworICAgICAgICAjIFBlZWtpbmcgYmFjayB3b3JrZWQ7IGxvb2sgZm9yd2FyZCB1bnRpbCBfc3luY2hyZSBubyBsb25nZXIKKyAgICAgICAgIyBtYXRjaGVzLgorICAgICAgICBpID0gcG9zICsgMQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbSA9IF9zeW5jaHJlKHN0ciwgaSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgcywgaSA9IG0uc3BhbigpCisgICAgICAgICAgICAgICAgaWYgbm90IGlzX2NoYXJfaW5fc3RyaW5nKHMpOgorICAgICAgICAgICAgICAgICAgICBwb3MgPSBzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBwb3MKKworICAgICMgVGhyb3cgYXdheSB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZy4gIEludGVuZGVkIHRvIGJlIGNhbGxlZCB3aXRoCisgICAgIyBmaW5kX2dvb2RfcGFyc2Vfc3RhcnQncyByZXN1bHQuCisKKyAgICBkZWYgc2V0X2xvKHNlbGYsIGxvKToKKyAgICAgICAgYXNzZXJ0IGxvID09IDAgb3Igc2VsZi5zdHJbbG8tMV0gPT0gJ1xuJworICAgICAgICBpZiBsbyA+IDA6CisgICAgICAgICAgICBzZWxmLnN0ciA9IHNlbGYuc3RyW2xvOl0KKworICAgICMgQXMgcXVpY2tseSBhcyBodW1hbmx5IHBvc3NpYmxlIDx3aW5rPiwgZmluZCB0aGUgbGluZSBudW1iZXJzICgwLQorICAgICMgYmFzZWQpIG9mIHRoZSBub24tY29udGludWF0aW9uIGxpbmVzLgorICAgICMgQ3JlYXRlcyBzZWxmLntnb29kbGluZXMsIGNvbnRpbnVhdGlvbn0uCisKKyAgICBkZWYgX3N0dWR5MShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdHVkeV9sZXZlbCA+PSAxOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuc3R1ZHlfbGV2ZWwgPSAxCisKKyAgICAgICAgIyBNYXAgYWxsIHVuaW50ZXJlc3RpbmcgY2hhcmFjdGVycyB0byAieCIsIGFsbCBvcGVuIGJyYWNrZXRzCisgICAgICAgICMgdG8gIigiLCBhbGwgY2xvc2UgYnJhY2tldHMgdG8gIikiLCB0aGVuIGNvbGxhcHNlIHJ1bnMgb2YKKyAgICAgICAgIyB1bmludGVyZXN0aW5nIGNoYXJhY3RlcnMuICBUaGlzIGNhbiBjdXQgdGhlIG51bWJlciBvZiBjaGFycworICAgICAgICAjIGJ5IGEgZmFjdG9yIG9mIDEwLTQwLCBhbmQgc28gZ3JlYXRseSBzcGVlZCB0aGUgZm9sbG93aW5nIGxvb3AuCisgICAgICAgIHN0ciA9IHNlbGYuc3RyCisgICAgICAgIHN0ciA9IHN0ci50cmFuc2xhdGUoX3RyYW4pCisgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKCd4eHh4eHh4eCcsICd4JykKKyAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoJ3h4eHgnLCAneCcpCisgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKCd4eCcsICd4JykKKyAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoJ3h4JywgJ3gnKQorICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgnXG54JywgJ1xuJykKKyAgICAgICAgIyBub3RlIHRoYXQgcmVwbGFjaW5nIHhcbiB3aXRoIFxuIHdvdWxkIGJlIGluY29ycmVjdCwgYmVjYXVzZQorICAgICAgICAjIHggbWF5IGJlIHByZWNlZGVkIGJ5IGEgYmFja3NsYXNoCisKKyAgICAgICAgIyBNYXJjaCBvdmVyIHRoZSBzcXVhc2hlZCB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtLCBhY2N1bXVsYXRpbmcKKyAgICAgICAgIyB0aGUgbGluZSBudW1iZXJzIG9mIG5vbi1jb250aW51ZWQgc3RtdHMsIGFuZCBkZXRlcm1pbmluZworICAgICAgICAjIHdoZXRoZXIgJiB3aHkgdGhlIGxhc3Qgc3RtdCBpcyBhIGNvbnRpbnVhdGlvbi4KKyAgICAgICAgY29udGludWF0aW9uID0gQ19OT05FCisgICAgICAgIGxldmVsID0gbG5vID0gMCAgICAgIyBsZXZlbCBpcyBuZXN0aW5nIGxldmVsOyBsbm8gaXMgbGluZSBudW1iZXIKKyAgICAgICAgc2VsZi5nb29kbGluZXMgPSBnb29kbGluZXMgPSBbMF0KKyAgICAgICAgcHVzaF9nb29kID0gZ29vZGxpbmVzLmFwcGVuZAorICAgICAgICBpLCBuID0gMCwgbGVuKHN0cikKKyAgICAgICAgd2hpbGUgaSA8IG46CisgICAgICAgICAgICBjaCA9IHN0cltpXQorICAgICAgICAgICAgaSA9IGkrMQorCisgICAgICAgICAgICAjIGNhc2VzIGFyZSBjaGVja2VkIGluIGRlY3JlYXNpbmcgb3JkZXIgb2YgZnJlcXVlbmN5CisgICAgICAgICAgICBpZiBjaCA9PSAneCc6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgY2ggPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBsbm8gPSBsbm8gKyAxCisgICAgICAgICAgICAgICAgaWYgbGV2ZWwgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcHVzaF9nb29kKGxubykKKyAgICAgICAgICAgICAgICAgICAgIyBlbHNlIHdlJ3JlIGluIGFuIHVuY2xvc2VkIGJyYWNrZXQgc3RydWN0dXJlCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgY2ggPT0gJygnOgorICAgICAgICAgICAgICAgIGxldmVsID0gbGV2ZWwgKyAxCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgY2ggPT0gJyknOgorICAgICAgICAgICAgICAgIGlmIGxldmVsOgorICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsIC0gMQorICAgICAgICAgICAgICAgICAgICAjIGVsc2UgdGhlIHByb2dyYW0gaXMgaW52YWxpZCwgYnV0IHdlIGNhbid0IGNvbXBsYWluCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgY2ggPT0gJyInIG9yIGNoID09ICInIjoKKyAgICAgICAgICAgICAgICAjIGNvbnN1bWUgdGhlIHN0cmluZworICAgICAgICAgICAgICAgIHF1b3RlID0gY2gKKyAgICAgICAgICAgICAgICBpZiBzdHJbaS0xOmkrMl0gPT0gcXVvdGUgKiAzOgorICAgICAgICAgICAgICAgICAgICBxdW90ZSA9IHF1b3RlICogMworICAgICAgICAgICAgICAgIGZpcnN0bG5vID0gbG5vCisgICAgICAgICAgICAgICAgdyA9IGxlbihxdW90ZSkgLSAxCisgICAgICAgICAgICAgICAgaSA9IGkrdworICAgICAgICAgICAgICAgIHdoaWxlIGkgPCBuOgorICAgICAgICAgICAgICAgICAgICBjaCA9IHN0cltpXQorICAgICAgICAgICAgICAgICAgICBpID0gaSsxCisKKyAgICAgICAgICAgICAgICAgICAgaWYgY2ggPT0gJ3gnOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICBpZiBzdHJbaS0xOmkrd10gPT0gcXVvdGU6CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSt3CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgICAgIGlmIGNoID09ICdcbic6CisgICAgICAgICAgICAgICAgICAgICAgICBsbm8gPSBsbm8gKyAxCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB3ID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bnRlcm1pbmF0ZWQgc2luZ2xlLXF1b3RlZCBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZXZlbCA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX2dvb2QobG5vKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgICAgIGlmIGNoID09ICdcXCc6CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaSA8IG4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN0cltpXSA9PSAnXG4nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxubyA9IGxubyArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgIyBlbHNlIGNvbW1lbnQgY2hhciBvciBwYXJlbiBpbnNpZGUgc3RyaW5nCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGRpZG4ndCBicmVhayBvdXQgb2YgdGhlIGxvb3AsIHNvIHdlJ3JlIHN0aWxsCisgICAgICAgICAgICAgICAgICAgICMgaW5zaWRlIGEgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIChsbm8gLSAxKSA9PSBmaXJzdGxubzoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYmVmb3JlIHRoZSBwcmV2aW91cyBcbiBpbiBzdHIsIHdlIHdlcmUgaW4gdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAjIGxpbmUgb2YgdGhlIHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uID0gQ19TVFJJTkdfRklSU1RfTElORQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uID0gQ19TVFJJTkdfTkVYVF9MSU5FUworICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICMgd2l0aCBvdXRlciBsb29wCisKKyAgICAgICAgICAgIGlmIGNoID09ICcjJzoKKyAgICAgICAgICAgICAgICAjIGNvbnN1bWUgdGhlIGNvbW1lbnQKKyAgICAgICAgICAgICAgICBpID0gc3RyLmZpbmQoJ1xuJywgaSkKKyAgICAgICAgICAgICAgICBhc3NlcnQgaSA+PSAwCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgYXNzZXJ0IGNoID09ICdcXCcKKyAgICAgICAgICAgIGFzc2VydCBpIDwgbgorICAgICAgICAgICAgaWYgc3RyW2ldID09ICdcbic6CisgICAgICAgICAgICAgICAgbG5vID0gbG5vICsgMQorICAgICAgICAgICAgICAgIGlmIGkrMSA9PSBuOgorICAgICAgICAgICAgICAgICAgICBjb250aW51YXRpb24gPSBDX0JBQ0tTTEFTSAorICAgICAgICAgICAgaSA9IGkrMQorCisgICAgICAgICMgVGhlIGxhc3Qgc3RtdCBtYXkgYmUgY29udGludWVkIGZvciBhbGwgMyByZWFzb25zLgorICAgICAgICAjIFN0cmluZyBjb250aW51YXRpb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGJyYWNrZXQKKyAgICAgICAgIyBjb250aW51YXRpb24sIHdoaWNoIGJlYXRzIGJhY2tzbGFzaCBjb250aW51YXRpb24uCisgICAgICAgIGlmIChjb250aW51YXRpb24gIT0gQ19TVFJJTkdfRklSU1RfTElORQorICAgICAgICAgICAgYW5kIGNvbnRpbnVhdGlvbiAhPSBDX1NUUklOR19ORVhUX0xJTkVTIGFuZCBsZXZlbCA+IDApOgorICAgICAgICAgICAgY29udGludWF0aW9uID0gQ19CUkFDS0VUCisgICAgICAgIHNlbGYuY29udGludWF0aW9uID0gY29udGludWF0aW9uCisKKyAgICAgICAgIyBQdXNoIHRoZSBmaW5hbCBsaW5lIG51bWJlciBhcyBhIHNlbnRpbmVsIHZhbHVlLCByZWdhcmRsZXNzIG9mCisgICAgICAgICMgd2hldGhlciBpdCdzIGNvbnRpbnVlZC4KKyAgICAgICAgYXNzZXJ0IChjb250aW51YXRpb24gPT0gQ19OT05FKSA9PSAoZ29vZGxpbmVzWy0xXSA9PSBsbm8pCisgICAgICAgIGlmIGdvb2RsaW5lc1stMV0gIT0gbG5vOgorICAgICAgICAgICAgcHVzaF9nb29kKGxubykKKworICAgIGRlZiBnZXRfY29udGludWF0aW9uX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuX3N0dWR5MSgpCisgICAgICAgIHJldHVybiBzZWxmLmNvbnRpbnVhdGlvbgorCisgICAgIyBzdHVkeTEgd2FzIHN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lIHRoZSBjb250aW51YXRpb24gc3RhdHVzLAorICAgICMgYnV0IGRvaW5nIG1vcmUgcmVxdWlyZXMgbG9va2luZyBhdCBldmVyeSBjaGFyYWN0ZXIuICBzdHVkeTIKKyAgICAjIGRvZXMgdGhpcyBmb3IgdGhlIGxhc3QgaW50ZXJlc3Rpbmcgc3RhdGVtZW50IGluIHRoZSBibG9jay4KKyAgICAjIENyZWF0ZXM6CisgICAgIyAgICAgc2VsZi5zdG10X3N0YXJ0LCBzdG10X2VuZAorICAgICMgICAgICAgICBzbGljZSBpbmRpY2VzIG9mIGxhc3QgaW50ZXJlc3Rpbmcgc3RtdAorICAgICMgICAgIHNlbGYuc3RtdF9icmFja2V0aW5nCisgICAgIyAgICAgICAgIHRoZSBicmFja2V0aW5nIHN0cnVjdHVyZSBvZiB0aGUgbGFzdCBpbnRlcmVzdGluZyBzdG10OworICAgICMgICAgICAgICBmb3IgZXhhbXBsZSwgZm9yIHRoZSBzdGF0ZW1lbnQgInNheShib28pIG9yIGRpZSIsIHN0bXRfYnJhY2tldGluZworICAgICMgICAgICAgICB3aWxsIGJlIFsoMCwgMCksICgzLCAxKSwgKDgsIDApXS4gU3RyaW5ncyBhbmQgY29tbWVudHMgYXJlCisgICAgIyAgICAgICAgIHRyZWF0ZWQgYXMgYnJhY2tldHMsIGZvciB0aGUgbWF0dGVyLgorICAgICMgICAgIHNlbGYubGFzdGNoCisgICAgIyAgICAgICAgIGxhc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGJlZm9yZSBvcHRpb25hbCB0cmFpbGluZworICAgICMgICAgICAgICBjb21tZW50CisgICAgIyAgICAgc2VsZi5sYXN0b3BlbmJyYWNrZXRwb3MKKyAgICAjICAgICAgICAgaWYgY29udGludWF0aW9uIGlzIENfQlJBQ0tFVCwgaW5kZXggb2YgbGFzdCBvcGVuIGJyYWNrZXQKKworICAgIGRlZiBfc3R1ZHkyKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnN0dWR5X2xldmVsID49IDI6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fc3R1ZHkxKCkKKyAgICAgICAgc2VsZi5zdHVkeV9sZXZlbCA9IDIKKworICAgICAgICAjIFNldCBwIGFuZCBxIHRvIHNsaWNlIGluZGljZXMgb2YgbGFzdCBpbnRlcmVzdGluZyBzdG10LgorICAgICAgICBzdHIsIGdvb2RsaW5lcyA9IHNlbGYuc3RyLCBzZWxmLmdvb2RsaW5lcworICAgICAgICBpID0gbGVuKGdvb2RsaW5lcykgLSAxCisgICAgICAgIHAgPSBsZW4oc3RyKSAgICAjIGluZGV4IG9mIG5ld2VzdCBsaW5lCisgICAgICAgIHdoaWxlIGk6CisgICAgICAgICAgICBhc3NlcnQgcAorICAgICAgICAgICAgIyBwIGlzIHRoZSBpbmRleCBvZiB0aGUgc3RtdCBhdCBsaW5lIG51bWJlciBnb29kbGluZXNbaV0uCisgICAgICAgICAgICAjIE1vdmUgcCBiYWNrIHRvIHRoZSBzdG10IGF0IGxpbmUgbnVtYmVyIGdvb2RsaW5lc1tpLTFdLgorICAgICAgICAgICAgcSA9IHAKKyAgICAgICAgICAgIGZvciBub3RoaW5nIGluIHJhbmdlKGdvb2RsaW5lc1tpLTFdLCBnb29kbGluZXNbaV0pOgorICAgICAgICAgICAgICAgICMgdHJpY2t5OiBzZXRzIHAgdG8gMCBpZiBubyBwcmVjZWRpbmcgbmV3bGluZQorICAgICAgICAgICAgICAgIHAgPSBzdHIucmZpbmQoJ1xuJywgMCwgcC0xKSArIDEKKyAgICAgICAgICAgICMgVGhlIHN0bXQgc3RyW3A6cV0gaXNuJ3QgYSBjb250aW51YXRpb24sIGJ1dCBtYXkgYmUgYmxhbmsKKyAgICAgICAgICAgICMgb3IgYSBub24taW5kZW50aW5nIGNvbW1lbnQgbGluZS4KKyAgICAgICAgICAgIGlmICBfanVua3JlKHN0ciwgcCk6CisgICAgICAgICAgICAgICAgaSA9IGktMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBpID09IDA6CisgICAgICAgICAgICAjIG5vdGhpbmcgYnV0IGp1bmshCisgICAgICAgICAgICBhc3NlcnQgcCA9PSAwCisgICAgICAgICAgICBxID0gcAorICAgICAgICBzZWxmLnN0bXRfc3RhcnQsIHNlbGYuc3RtdF9lbmQgPSBwLCBxCisKKyAgICAgICAgIyBBbmFseXplIHRoaXMgc3RtdCwgdG8gZmluZCB0aGUgbGFzdCBvcGVuIGJyYWNrZXQgKGlmIGFueSkKKyAgICAgICAgIyBhbmQgbGFzdCBpbnRlcmVzdGluZyBjaGFyYWN0ZXIgKGlmIGFueSkuCisgICAgICAgIGxhc3RjaCA9ICIiCisgICAgICAgIHN0YWNrID0gW10gICMgc3RhY2sgb2Ygb3BlbiBicmFja2V0IGluZGljZXMKKyAgICAgICAgcHVzaF9zdGFjayA9IHN0YWNrLmFwcGVuZAorICAgICAgICBicmFja2V0aW5nID0gWyhwLCAwKV0KKyAgICAgICAgd2hpbGUgcCA8IHE6CisgICAgICAgICAgICAjIHN1Y2sgdXAgYWxsIGV4Y2VwdCAoKVtde30nIiNcXAorICAgICAgICAgICAgbSA9IF9jaGV3X29yZGluYXJ5cmUoc3RyLCBwLCBxKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAjIHdlIHNraXBwZWQgYXQgbGVhc3Qgb25lIGJvcmluZyBjaGFyCisgICAgICAgICAgICAgICAgbmV3cCA9IG0uZW5kKCkKKyAgICAgICAgICAgICAgICAjIGJhY2sgdXAgb3ZlciB0b3RhbGx5IGJvcmluZyB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgaSA9IG5ld3AgLSAxICAgICMgaW5kZXggb2YgbGFzdCBib3JpbmcgY2hhcgorICAgICAgICAgICAgICAgIHdoaWxlIGkgPj0gcCBhbmQgc3RyW2ldIGluICIgXHRcbiI6CisgICAgICAgICAgICAgICAgICAgIGkgPSBpLTEKKyAgICAgICAgICAgICAgICBpZiBpID49IHA6CisgICAgICAgICAgICAgICAgICAgIGxhc3RjaCA9IHN0cltpXQorICAgICAgICAgICAgICAgIHAgPSBuZXdwCisgICAgICAgICAgICAgICAgaWYgcCA+PSBxOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBjaCA9IHN0cltwXQorCisgICAgICAgICAgICBpZiBjaCBpbiAiKFt7IjoKKyAgICAgICAgICAgICAgICBwdXNoX3N0YWNrKHApCisgICAgICAgICAgICAgICAgYnJhY2tldGluZy5hcHBlbmQoKHAsIGxlbihzdGFjaykpKQorICAgICAgICAgICAgICAgIGxhc3RjaCA9IGNoCisgICAgICAgICAgICAgICAgcCA9IHArMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGNoIGluICIpXX0iOgorICAgICAgICAgICAgICAgIGlmIHN0YWNrOgorICAgICAgICAgICAgICAgICAgICBkZWwgc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgbGFzdGNoID0gY2gKKyAgICAgICAgICAgICAgICBwID0gcCsxCisgICAgICAgICAgICAgICAgYnJhY2tldGluZy5hcHBlbmQoKHAsIGxlbihzdGFjaykpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGNoID09ICciJyBvciBjaCA9PSAiJyI6CisgICAgICAgICAgICAgICAgIyBjb25zdW1lIHN0cmluZworICAgICAgICAgICAgICAgICMgTm90ZSB0aGF0IHN0dWR5MSBkaWQgdGhpcyB3aXRoIGEgUHl0aG9uIGxvb3AsIGJ1dAorICAgICAgICAgICAgICAgICMgd2UgdXNlIGEgcmVnZXhwIGhlcmU7IHRoZSByZWFzb24gaXMgc3BlZWQgaW4gYm90aAorICAgICAgICAgICAgICAgICMgY2FzZXM7IHRoZSBzdHJpbmcgbWF5IGJlIGh1Z2UsIGJ1dCBzdHVkeTEgcHJlLXNxdWFzaGVkCisgICAgICAgICAgICAgICAgIyBzdHJpbmdzIHRvIGEgY291cGxlIG9mIGNoYXJhY3RlcnMgcGVyIGxpbmUuICBzdHVkeTEKKyAgICAgICAgICAgICAgICAjIGFsc28gbmVlZGVkIHRvIGtlZXAgdHJhY2sgb2YgbmV3bGluZXMsIGFuZCB3ZSBkb24ndAorICAgICAgICAgICAgICAgICMgaGF2ZSB0by4KKyAgICAgICAgICAgICAgICBicmFja2V0aW5nLmFwcGVuZCgocCwgbGVuKHN0YWNrKSsxKSkKKyAgICAgICAgICAgICAgICBsYXN0Y2ggPSBjaAorICAgICAgICAgICAgICAgIHAgPSBfbWF0Y2hfc3RyaW5ncmUoc3RyLCBwLCBxKS5lbmQoKQorICAgICAgICAgICAgICAgIGJyYWNrZXRpbmcuYXBwZW5kKChwLCBsZW4oc3RhY2spKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBjaCA9PSAnIyc6CisgICAgICAgICAgICAgICAgIyBjb25zdW1lIGNvbW1lbnQgYW5kIHRyYWlsaW5nIG5ld2xpbmUKKyAgICAgICAgICAgICAgICBicmFja2V0aW5nLmFwcGVuZCgocCwgbGVuKHN0YWNrKSsxKSkKKyAgICAgICAgICAgICAgICBwID0gc3RyLmZpbmQoJ1xuJywgcCwgcSkgKyAxCisgICAgICAgICAgICAgICAgYXNzZXJ0IHAgPiAwCisgICAgICAgICAgICAgICAgYnJhY2tldGluZy5hcHBlbmQoKHAsIGxlbihzdGFjaykpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGFzc2VydCBjaCA9PSAnXFwnCisgICAgICAgICAgICBwID0gcCsxICAgICAjIGJleW9uZCBiYWNrc2xhc2gKKyAgICAgICAgICAgIGFzc2VydCBwIDwgcQorICAgICAgICAgICAgaWYgc3RyW3BdICE9ICdcbic6CisgICAgICAgICAgICAgICAgIyB0aGUgcHJvZ3JhbSBpcyBpbnZhbGlkLCBidXQgY2FuJ3QgY29tcGxhaW4KKyAgICAgICAgICAgICAgICBsYXN0Y2ggPSBjaCArIHN0cltwXQorICAgICAgICAgICAgcCA9IHArMSAgICAgIyBiZXlvbmQgZXNjYXBlZCBjaGFyCisKKyAgICAgICAgIyBlbmQgd2hpbGUgcCA8IHE6CisKKyAgICAgICAgc2VsZi5sYXN0Y2ggPSBsYXN0Y2gKKyAgICAgICAgaWYgc3RhY2s6CisgICAgICAgICAgICBzZWxmLmxhc3RvcGVuYnJhY2tldHBvcyA9IHN0YWNrWy0xXQorICAgICAgICBzZWxmLnN0bXRfYnJhY2tldGluZyA9IHR1cGxlKGJyYWNrZXRpbmcpCisKKyAgICAjIEFzc3VtaW5nIGNvbnRpbnVhdGlvbiBpcyBDX0JSQUNLRVQsIHJldHVybiB0aGUgbnVtYmVyCisgICAgIyBvZiBzcGFjZXMgdGhlIG5leHQgbGluZSBzaG91bGQgYmUgaW5kZW50ZWQuCisKKyAgICBkZWYgY29tcHV0ZV9icmFja2V0X2luZGVudChzZWxmKToKKyAgICAgICAgc2VsZi5fc3R1ZHkyKCkKKyAgICAgICAgYXNzZXJ0IHNlbGYuY29udGludWF0aW9uID09IENfQlJBQ0tFVAorICAgICAgICBqID0gc2VsZi5sYXN0b3BlbmJyYWNrZXRwb3MKKyAgICAgICAgc3RyID0gc2VsZi5zdHIKKyAgICAgICAgbiA9IGxlbihzdHIpCisgICAgICAgIG9yaWdpID0gaSA9IHN0ci5yZmluZCgnXG4nLCAwLCBqKSArIDEKKyAgICAgICAgaiA9IGorMSAgICAgIyBvbmUgYmV5b25kIG9wZW4gYnJhY2tldAorICAgICAgICAjIGZpbmQgZmlyc3QgbGlzdCBpdGVtOyBzZXQgaSB0byBzdGFydCBvZiBpdHMgbGluZQorICAgICAgICB3aGlsZSBqIDwgbjoKKyAgICAgICAgICAgIG0gPSBfaXRlbXJlKHN0ciwgaikKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgaiA9IG0uZW5kKCkgLSAxICAgICAjIGluZGV4IG9mIGZpcnN0IGludGVyZXN0aW5nIGNoYXIKKyAgICAgICAgICAgICAgICBleHRyYSA9IDAKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHRoaXMgbGluZSBpcyBqdW5rOyBhZHZhbmNlIHRvIG5leHQgbGluZQorICAgICAgICAgICAgICAgIGkgPSBqID0gc3RyLmZpbmQoJ1xuJywgaikgKyAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG5vdGhpbmcgaW50ZXJlc3RpbmcgZm9sbG93cyB0aGUgYnJhY2tldDsKKyAgICAgICAgICAgICMgcmVwcm9kdWNlIHRoZSBicmFja2V0IGxpbmUncyBpbmRlbnRhdGlvbiArIGEgbGV2ZWwKKyAgICAgICAgICAgIGogPSBpID0gb3JpZ2kKKyAgICAgICAgICAgIHdoaWxlIHN0cltqXSBpbiAiIFx0IjoKKyAgICAgICAgICAgICAgICBqID0gaisxCisgICAgICAgICAgICBleHRyYSA9IHNlbGYuaW5kZW50d2lkdGgKKyAgICAgICAgcmV0dXJuIGxlbihzdHJbaTpqXS5leHBhbmR0YWJzKHNlbGYudGFid2lkdGgpKSArIGV4dHJhCisKKyAgICAjIFJldHVybiBudW1iZXIgb2YgcGh5c2ljYWwgbGluZXMgaW4gbGFzdCBzdG10ICh3aGV0aGVyIG9yIG5vdAorICAgICMgaXQncyBhbiBpbnRlcmVzdGluZyBzdG10ISAgdGhpcyBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgd2hlbgorICAgICMgY29udGludWF0aW9uIGlzIENfQkFDS1NMQVNIKS4KKworICAgIGRlZiBnZXRfbnVtX2xpbmVzX2luX3N0bXQoc2VsZik6CisgICAgICAgIHNlbGYuX3N0dWR5MSgpCisgICAgICAgIGdvb2RsaW5lcyA9IHNlbGYuZ29vZGxpbmVzCisgICAgICAgIHJldHVybiBnb29kbGluZXNbLTFdIC0gZ29vZGxpbmVzWy0yXQorCisgICAgIyBBc3N1bWluZyBjb250aW51YXRpb24gaXMgQ19CQUNLU0xBU0gsIHJldHVybiB0aGUgbnVtYmVyIG9mIHNwYWNlcworICAgICMgdGhlIG5leHQgbGluZSBzaG91bGQgYmUgaW5kZW50ZWQuICBBbHNvIGFzc3VtaW5nIHRoZSBuZXcgbGluZSBpcworICAgICMgdGhlIGZpcnN0IG9uZSBmb2xsb3dpbmcgdGhlIGluaXRpYWwgbGluZSBvZiB0aGUgc3RtdC4KKworICAgIGRlZiBjb21wdXRlX2JhY2tzbGFzaF9pbmRlbnQoc2VsZik6CisgICAgICAgIHNlbGYuX3N0dWR5MigpCisgICAgICAgIGFzc2VydCBzZWxmLmNvbnRpbnVhdGlvbiA9PSBDX0JBQ0tTTEFTSAorICAgICAgICBzdHIgPSBzZWxmLnN0cgorICAgICAgICBpID0gc2VsZi5zdG10X3N0YXJ0CisgICAgICAgIHdoaWxlIHN0cltpXSBpbiAiIFx0IjoKKyAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgc3RhcnRwb3MgPSBpCisKKyAgICAgICAgIyBTZWUgd2hldGhlciB0aGUgaW5pdGlhbCBsaW5lIHN0YXJ0cyBhbiBhc3NpZ25tZW50IHN0bXQ7IGkuZS4sCisgICAgICAgICMgbG9vayBmb3IgYW4gPSBvcGVyYXRvcgorICAgICAgICBlbmRwb3MgPSBzdHIuZmluZCgnXG4nLCBzdGFydHBvcykgKyAxCisgICAgICAgIGZvdW5kID0gbGV2ZWwgPSAwCisgICAgICAgIHdoaWxlIGkgPCBlbmRwb3M6CisgICAgICAgICAgICBjaCA9IHN0cltpXQorICAgICAgICAgICAgaWYgY2ggaW4gIihbeyI6CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbCArIDEKKyAgICAgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICBlbGlmIGNoIGluICIpXX0iOgorICAgICAgICAgICAgICAgIGlmIGxldmVsOgorICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsIC0gMQorICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgIGVsaWYgY2ggPT0gJyInIG9yIGNoID09ICInIjoKKyAgICAgICAgICAgICAgICBpID0gX21hdGNoX3N0cmluZ3JlKHN0ciwgaSwgZW5kcG9zKS5lbmQoKQorICAgICAgICAgICAgZWxpZiBjaCA9PSAnIyc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgbGV2ZWwgPT0gMCBhbmQgY2ggPT0gJz0nIGFuZCBcCisgICAgICAgICAgICAgICAgICAgKGkgPT0gMCBvciBzdHJbaS0xXSBub3QgaW4gIj08PiEiKSBhbmQgXAorICAgICAgICAgICAgICAgICAgIHN0cltpKzFdICE9ICc9JzoKKyAgICAgICAgICAgICAgICBmb3VuZCA9IDEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpID0gaSsxCisKKyAgICAgICAgaWYgZm91bmQ6CisgICAgICAgICAgICAjIGZvdW5kIGEgbGVnaXQgPSwgYnV0IGl0IG1heSBiZSB0aGUgbGFzdCBpbnRlcmVzdGluZworICAgICAgICAgICAgIyB0aGluZyBvbiB0aGUgbGluZQorICAgICAgICAgICAgaSA9IGkrMSAgICAgIyBtb3ZlIGJleW9uZCB0aGUgPQorICAgICAgICAgICAgZm91bmQgPSByZS5tYXRjaChyIlxzKlxcIiwgc3RyW2k6ZW5kcG9zXSkgaXMgTm9uZQorCisgICAgICAgIGlmIG5vdCBmb3VuZDoKKyAgICAgICAgICAgICMgb2ggd2VsbCAuLi4gc2V0dGxlIGZvciBtb3ZpbmcgYmV5b25kIHRoZSBmaXJzdCBjaHVuaworICAgICAgICAgICAgIyBvZiBub24td2hpdGVzcGFjZSBjaGFycworICAgICAgICAgICAgaSA9IHN0YXJ0cG9zCisgICAgICAgICAgICB3aGlsZSBzdHJbaV0gbm90IGluICIgXHRcbiI6CisgICAgICAgICAgICAgICAgaSA9IGkrMQorCisgICAgICAgIHJldHVybiBsZW4oc3RyW3NlbGYuc3RtdF9zdGFydDppXS5leHBhbmR0YWJzKFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhYndpZHRoKSkgKyAxCisKKyAgICAjIFJldHVybiB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlIG9uIHRoZSBpbml0aWFsIGxpbmUgb2YgdGhlIGxhc3QKKyAgICAjIGludGVyZXN0aW5nIHN0bXQuCisKKyAgICBkZWYgZ2V0X2Jhc2VfaW5kZW50X3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fc3R1ZHkyKCkKKyAgICAgICAgaSwgbiA9IHNlbGYuc3RtdF9zdGFydCwgc2VsZi5zdG10X2VuZAorICAgICAgICBqID0gaQorICAgICAgICBzdHIgPSBzZWxmLnN0cgorICAgICAgICB3aGlsZSBqIDwgbiBhbmQgc3RyW2pdIGluICIgXHQiOgorICAgICAgICAgICAgaiA9IGogKyAxCisgICAgICAgIHJldHVybiBzdHJbaTpqXQorCisgICAgIyBEaWQgdGhlIGxhc3QgaW50ZXJlc3Rpbmcgc3RtdCBvcGVuIGEgYmxvY2s/CisKKyAgICBkZWYgaXNfYmxvY2tfb3BlbmVyKHNlbGYpOgorICAgICAgICBzZWxmLl9zdHVkeTIoKQorICAgICAgICByZXR1cm4gc2VsZi5sYXN0Y2ggPT0gJzonCisKKyAgICAjIERpZCB0aGUgbGFzdCBpbnRlcmVzdGluZyBzdG10IGNsb3NlIGEgYmxvY2s/CisKKyAgICBkZWYgaXNfYmxvY2tfY2xvc2VyKHNlbGYpOgorICAgICAgICBzZWxmLl9zdHVkeTIoKQorICAgICAgICByZXR1cm4gX2Nsb3NlcmUoc2VsZi5zdHIsIHNlbGYuc3RtdF9zdGFydCkgaXMgbm90IE5vbmUKKworICAgICMgaW5kZXggb2YgbGFzdCBvcGVuIGJyYWNrZXQgKHtbLCBvciBOb25lIGlmIG5vbmUKKyAgICBsYXN0b3BlbmJyYWNrZXRwb3MgPSBOb25lCisKKyAgICBkZWYgZ2V0X2xhc3Rfb3Blbl9icmFja2V0X3BvcyhzZWxmKToKKyAgICAgICAgc2VsZi5fc3R1ZHkyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYubGFzdG9wZW5icmFja2V0cG9zCisKKyAgICAjIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGJyYWNrZXRpbmcgb2YgdGhlIGxhc3QgaW50ZXJlc3Rpbmcgc3RhdGVtZW50LAorICAgICMgaW4gdGhlIGZvcm1hdCBkZWZpbmVkIGluIF9zdHVkeTIsIG9yIE5vbmUgaWYgdGhlIHRleHQgZGlkbid0IGNvbnRhaW4KKyAgICAjIGFueXRoaW5nCisgICAgc3RtdF9icmFja2V0aW5nID0gTm9uZQorCisgICAgZGVmIGdldF9sYXN0X3N0bXRfYnJhY2tldGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fc3R1ZHkyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RtdF9icmFja2V0aW5nCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlQYXJzZS5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlQYXJzZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc2NzE5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QeVBhcnNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlQYXJzZS5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlQYXJzZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwMTU3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QeVBhcnNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlTaGVsbC5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QeVNoZWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYWY4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlTaGVsbC5weQpAQCAtMCwwICsxLDE1NjggQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHN5cworaW1wb3J0IHN0cmluZworaW1wb3J0IGdldG9wdAoraW1wb3J0IHJlCitpbXBvcnQgc29ja2V0CitpbXBvcnQgdGltZQoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHR5cGVzCitpbXBvcnQgaW8KKworaW1wb3J0IGxpbmVjYWNoZQorZnJvbSBjb2RlIGltcG9ydCBJbnRlcmFjdGl2ZUludGVycHJldGVyCitmcm9tIHBsYXRmb3JtIGltcG9ydCBweXRob25fdmVyc2lvbgorCit0cnk6CisgICAgZnJvbSBUa2ludGVyIGltcG9ydCAqCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcHJpbnQ+PnN5cy5fX3N0ZGVycl9fLCAiKiogSURMRSBjYW4ndCBpbXBvcnQgVGtpbnRlci4gICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIllvdXIgUHl0aG9uIG1heSBub3QgYmUgY29uZmlndXJlZCBmb3IgVGsuICoqIgorICAgIHN5cy5leGl0KDEpCitpbXBvcnQgdGtNZXNzYWdlQm94CisKK2Zyb20gaWRsZWxpYi5FZGl0b3JXaW5kb3cgaW1wb3J0IEVkaXRvcldpbmRvdywgZml4d29yZGJyZWFrcworZnJvbSBpZGxlbGliLkZpbGVMaXN0IGltcG9ydCBGaWxlTGlzdAorZnJvbSBpZGxlbGliLkNvbG9yRGVsZWdhdG9yIGltcG9ydCBDb2xvckRlbGVnYXRvcgorZnJvbSBpZGxlbGliLlVuZG9EZWxlZ2F0b3IgaW1wb3J0IFVuZG9EZWxlZ2F0b3IKK2Zyb20gaWRsZWxpYi5PdXRwdXRXaW5kb3cgaW1wb3J0IE91dHB1dFdpbmRvdworZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIgaW1wb3J0IGlkbGV2ZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgcnBjCitmcm9tIGlkbGVsaWIgaW1wb3J0IERlYnVnZ2VyCitmcm9tIGlkbGVsaWIgaW1wb3J0IFJlbW90ZURlYnVnZ2VyCitmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKKworSURFTlRDSEFSUyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICJfIgorSE9TVCA9ICcxMjcuMC4wLjEnICMgcHl0aG9uIGV4ZWN1dGlvbiBzZXJ2ZXIgb24gbG9jYWxob3N0IGxvb3BiYWNrCitQT1JUID0gMCAgIyBzb21lZGF5IHBhc3MgaW4gaG9zdCwgcG9ydCBmb3IgcmVtb3RlIGRlYnVnIGNhcGFiaWxpdHkKKwordHJ5OgorICAgIGZyb20gc2lnbmFsIGltcG9ydCBTSUdURVJNCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgU0lHVEVSTSA9IDE1CisKKyMgT3ZlcnJpZGUgd2FybmluZ3MgbW9kdWxlIHRvIHdyaXRlIHRvIHdhcm5pbmdfc3RyZWFtLiAgSW5pdGlhbGl6ZSB0byBzZW5kIElETEUKKyMgaW50ZXJuYWwgd2FybmluZ3MgdG8gdGhlIGNvbnNvbGUuICBTY3JpcHRCaW5kaW5nLmNoZWNrX3N5bnRheCgpIHdpbGwKKyMgdGVtcG9yYXJpbHkgcmVkaXJlY3QgdGhlIHN0cmVhbSB0byB0aGUgc2hlbGwgd2luZG93IHRvIGRpc3BsYXkgd2FybmluZ3Mgd2hlbgorIyBjaGVja2luZyB1c2VyJ3MgY29kZS4KK2dsb2JhbCB3YXJuaW5nX3N0cmVhbQord2FybmluZ19zdHJlYW0gPSBzeXMuX19zdGRlcnJfXwordHJ5OgorICAgIGltcG9ydCB3YXJuaW5ncworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgZGVmIGlkbGVfc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZT1Ob25lLCBsaW5lPU5vbmUpOgorICAgICAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgICAgICBmaWxlID0gd2FybmluZ19zdHJlYW0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZS53cml0ZSh3YXJuaW5ncy5mb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIGxpbmU9bGluZSkpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcGFzcyAgIyMgZmlsZSAocHJvYmFibHkgX19zdGRlcnJfXykgaXMgaW52YWxpZCwgd2FybmluZyBkcm9wcGVkLgorICAgIHdhcm5pbmdzLnNob3d3YXJuaW5nID0gaWRsZV9zaG93d2FybmluZworICAgIGRlZiBpZGxlX2Zvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGxpbmU9Tm9uZSk6CisgICAgICAgICIiIkZvcm1hdCB3YXJuaW5ncyB0aGUgSURMRSB3YXkiIiIKKyAgICAgICAgcyA9ICJcbldhcm5pbmcgKGZyb20gd2FybmluZ3MgbW9kdWxlKTpcbiIKKyAgICAgICAgcyArPSAnICBGaWxlIFwiJXNcIiwgbGluZSAlc1xuJyAlIChmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBpZiBsaW5lIGlzIE5vbmU6CisgICAgICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgcyArPSAiICAgICVzXG4iICUgbGluZQorICAgICAgICBzICs9ICIlczogJXNcbj4+PiAiICUgKGNhdGVnb3J5Ll9fbmFtZV9fLCBtZXNzYWdlKQorICAgICAgICByZXR1cm4gcworICAgIHdhcm5pbmdzLmZvcm1hdHdhcm5pbmcgPSBpZGxlX2Zvcm1hdHdhcm5pbmcKKworZGVmIGV4dGVuZGVkX2xpbmVjYWNoZV9jaGVja2NhY2hlKGZpbGVuYW1lPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ19jaGVja2NhY2hlPWxpbmVjYWNoZS5jaGVja2NhY2hlKToKKyAgICAiIiJFeHRlbmQgbGluZWNhY2hlLmNoZWNrY2FjaGUgdG8gcHJlc2VydmUgdGhlIDxweXNoZWxsIy4uLj4gZW50cmllcworCisgICAgUmF0aGVyIHRoYW4gcmVwZWF0aW5nIHRoZSBsaW5lY2FjaGUgY29kZSwgcGF0Y2ggaXQgdG8gc2F2ZSB0aGUKKyAgICA8cHlzaGVsbCMuLi4+IGVudHJpZXMsIGNhbGwgdGhlIG9yaWdpbmFsIGxpbmVjYWNoZS5jaGVja2NhY2hlKCkKKyAgICAoc2tpcHBpbmcgdGhlbSksIGFuZCB0aGVuIHJlc3RvcmUgdGhlIHNhdmVkIGVudHJpZXMuCisKKyAgICBvcmlnX2NoZWNrY2FjaGUgaXMgYm91bmQgYXQgZGVmaW5pdGlvbiB0aW1lIHRvIHRoZSBvcmlnaW5hbAorICAgIG1ldGhvZCwgYWxsb3dpbmcgaXQgdG8gYmUgcGF0Y2hlZC4KKyAgICAiIiIKKyAgICBjYWNoZSA9IGxpbmVjYWNoZS5jYWNoZQorICAgIHNhdmUgPSB7fQorICAgIGZvciBrZXkgaW4gbGlzdChjYWNoZSk6CisgICAgICAgIGlmIGtleVs6MV0gKyBrZXlbLTE6XSA9PSAnPD4nOgorICAgICAgICAgICAgc2F2ZVtrZXldID0gY2FjaGUucG9wKGtleSkKKyAgICBvcmlnX2NoZWNrY2FjaGUoZmlsZW5hbWUpCisgICAgY2FjaGUudXBkYXRlKHNhdmUpCisKKyMgUGF0Y2ggbGluZWNhY2hlLmNoZWNrY2FjaGUoKToKK2xpbmVjYWNoZS5jaGVja2NhY2hlID0gZXh0ZW5kZWRfbGluZWNhY2hlX2NoZWNrY2FjaGUKKworCitjbGFzcyBQeVNoZWxsRWRpdG9yV2luZG93KEVkaXRvcldpbmRvdyk6CisgICAgIlJlZ3VsYXIgdGV4dCBlZGl0IHdpbmRvdyBpbiBJRExFLCBzdXBwb3J0cyBicmVha3BvaW50cyIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuYnJlYWtwb2ludHMgPSBbXQorICAgICAgICBFZGl0b3JXaW5kb3cuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHNlbGYudGV4dC5iaW5kKCI8PHNldC1icmVha3BvaW50LWhlcmU+PiIsIHNlbGYuc2V0X2JyZWFrcG9pbnRfaGVyZSkKKyAgICAgICAgc2VsZi50ZXh0LmJpbmQoIjw8Y2xlYXItYnJlYWtwb2ludC1oZXJlPj4iLCBzZWxmLmNsZWFyX2JyZWFrcG9pbnRfaGVyZSkKKyAgICAgICAgc2VsZi50ZXh0LmJpbmQoIjw8b3Blbi1weXRob24tc2hlbGw+PiIsIHNlbGYuZmxpc3Qub3Blbl9zaGVsbCkKKworICAgICAgICBzZWxmLmJyZWFrcG9pbnRQYXRoID0gb3MucGF0aC5qb2luKGlkbGVDb25mLkdldFVzZXJDZmdEaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnJlYWtwb2ludHMubHN0JykKKyAgICAgICAgIyB3aGVuZXZlciBhIGZpbGUgaXMgY2hhbmdlZCwgcmVzdG9yZSBicmVha3BvaW50cworICAgICAgICBkZWYgZmlsZW5hbWVfY2hhbmdlZF9ob29rKG9sZF9ob29rPXNlbGYuaW8uZmlsZW5hbWVfY2hhbmdlX2hvb2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZj1zZWxmKToKKyAgICAgICAgICAgIHNlbGYucmVzdG9yZV9maWxlX2JyZWFrcygpCisgICAgICAgICAgICBvbGRfaG9vaygpCisgICAgICAgIHNlbGYuaW8uc2V0X2ZpbGVuYW1lX2NoYW5nZV9ob29rKGZpbGVuYW1lX2NoYW5nZWRfaG9vaykKKyAgICAgICAgaWYgc2VsZi5pby5maWxlbmFtZToKKyAgICAgICAgICAgIHNlbGYucmVzdG9yZV9maWxlX2JyZWFrcygpCisKKyAgICBybWVudV9zcGVjcyA9IFsKKyAgICAgICAgKCJDdXQiLCAiPDxjdXQ+PiIsICJybWVudV9jaGVja19jdXQiKSwKKyAgICAgICAgKCJDb3B5IiwgIjw8Y29weT4+IiwgInJtZW51X2NoZWNrX2NvcHkiKSwKKyAgICAgICAgKCJQYXN0ZSIsICI8PHBhc3RlPj4iLCAicm1lbnVfY2hlY2tfcGFzdGUiKSwKKyAgICAgICAgKCJTZXQgQnJlYWtwb2ludCIsICI8PHNldC1icmVha3BvaW50LWhlcmU+PiIsIE5vbmUpLAorICAgICAgICAoIkNsZWFyIEJyZWFrcG9pbnQiLCAiPDxjbGVhci1icmVha3BvaW50LWhlcmU+PiIsIE5vbmUpCisgICAgXQorCisgICAgZGVmIHNldF9icmVha3BvaW50KHNlbGYsIGxpbmVubyk6CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmlvLmZpbGVuYW1lCisgICAgICAgIHRleHQudGFnX2FkZCgiQlJFQUsiLCAiJWQuMCIgJSBsaW5lbm8sICIlZC4wIiAlIChsaW5lbm8rMSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGkgPSBzZWxmLmJyZWFrcG9pbnRzLmluZGV4KGxpbmVubykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6ICAjIG9ubHkgYWRkIGlmIG1pc3NpbmcsIGkuZS4gZG8gb25jZQorICAgICAgICAgICAgc2VsZi5icmVha3BvaW50cy5hcHBlbmQobGluZW5vKQorICAgICAgICB0cnk6ICAgICMgdXBkYXRlIHRoZSBzdWJwcm9jZXNzIGRlYnVnZ2VyCisgICAgICAgICAgICBkZWJ1ZyA9IHNlbGYuZmxpc3QucHlzaGVsbC5pbnRlcnAuZGVidWdnZXIKKyAgICAgICAgICAgIGRlYnVnLnNldF9icmVha3BvaW50X2hlcmUoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgZXhjZXB0OiAjIGJ1dCBkZWJ1Z2dlciBtYXkgbm90IGJlIGFjdGl2ZSByaWdodCBub3cuLi4uCisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgc2V0X2JyZWFrcG9pbnRfaGVyZShzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuaW8uZmlsZW5hbWUKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgdGV4dC5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBsaW5lbm8gPSBpbnQoZmxvYXQodGV4dC5pbmRleCgiaW5zZXJ0IikpKQorICAgICAgICBzZWxmLnNldF9icmVha3BvaW50KGxpbmVubykKKworICAgIGRlZiBjbGVhcl9icmVha3BvaW50X2hlcmUoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmlvLmZpbGVuYW1lCisgICAgICAgIGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgICAgIHRleHQuYmVsbCgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbGluZW5vID0gaW50KGZsb2F0KHRleHQuaW5kZXgoImluc2VydCIpKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5icmVha3BvaW50cy5yZW1vdmUobGluZW5vKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRleHQudGFnX3JlbW92ZSgiQlJFQUsiLCAiaW5zZXJ0IGxpbmVzdGFydCIsXAorICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydCBsaW5lZW5kICsxY2hhciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlYnVnID0gc2VsZi5mbGlzdC5weXNoZWxsLmludGVycC5kZWJ1Z2dlcgorICAgICAgICAgICAgZGVidWcuY2xlYXJfYnJlYWtwb2ludF9oZXJlKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBjbGVhcl9maWxlX2JyZWFrcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5icmVha3BvaW50czoKKyAgICAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5pby5maWxlbmFtZQorICAgICAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgICAgIHRleHQuYmVsbCgpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLmJyZWFrcG9pbnRzID0gW10KKyAgICAgICAgICAgIHRleHQudGFnX3JlbW92ZSgiQlJFQUsiLCAiMS4wIiwgRU5EKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlYnVnID0gc2VsZi5mbGlzdC5weXNoZWxsLmludGVycC5kZWJ1Z2dlcgorICAgICAgICAgICAgICAgIGRlYnVnLmNsZWFyX2ZpbGVfYnJlYWtzKGZpbGVuYW1lKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBzdG9yZV9maWxlX2JyZWFrcyhzZWxmKToKKyAgICAgICAgIlNhdmUgYnJlYWtwb2ludHMgd2hlbiBmaWxlIGlzIHNhdmVkIgorICAgICAgICAjIFhYWCAxMyBEZWMgMjAwMiBLQksgQ3VycmVudGx5IHRoZSBmaWxlIG11c3QgYmUgc2F2ZWQgYmVmb3JlIGl0IGNhbgorICAgICAgICAjICAgICBiZSBydW4uICBUaGUgYnJlYWtzIGFyZSBzYXZlZCBhdCB0aGF0IHRpbWUuICBJZiB3ZSBpbnRyb2R1Y2UKKyAgICAgICAgIyAgICAgYSB0ZW1wb3JhcnkgZmlsZSBzYXZlIGZlYXR1cmUgdGhlIHNhdmUgYnJlYWtzIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgIyAgICAgbmVlZHMgdG8gYmUgcmUtdmVyaWZpZWQsIHNpbmNlIHRoZSBicmVha3MgYXQgdGhlIHRpbWUgdGhlCisgICAgICAgICMgICAgIHRlbXAgZmlsZSBpcyBjcmVhdGVkIG1heSBkaWZmZXIgZnJvbSB0aGUgYnJlYWtzIGF0IHRoZSBsYXN0CisgICAgICAgICMgICAgIHBlcm1hbmVudCBzYXZlIG9mIHRoZSBmaWxlLiAgQ3VycmVudGx5LCBhIGJyZWFrIGludHJvZHVjZWQKKyAgICAgICAgIyAgICAgYWZ0ZXIgYSBzYXZlIHdpbGwgYmUgZWZmZWN0aXZlLCBidXQgbm90IHBlcnNpc3RlbnQuCisgICAgICAgICMgICAgIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGtlZXAgdGhlIHNhdmVkIGJyZWFrcyBzeW5jaGVkIHdpdGggdGhlCisgICAgICAgICMgICAgIHNhdmVkIGZpbGUuCisgICAgICAgICMKKyAgICAgICAgIyAgICAgQnJlYWtwb2ludHMgYXJlIHNldCBhcyB0YWdnZWQgcmFuZ2VzIGluIHRoZSB0ZXh0LiAgQ2VydGFpbgorICAgICAgICAjICAgICBraW5kcyBvZiBlZGl0cyBjYXVzZSB0aGVzZSByYW5nZXMgdG8gYmUgZGVsZXRlZDogSW5zZXJ0aW5nCisgICAgICAgICMgICAgIG9yIGRlbGV0aW5nIGEgbGluZSBqdXN0IGJlZm9yZSBhIGJyZWFrcG9pbnQsIGFuZCBjZXJ0YWluCisgICAgICAgICMgICAgIGRlbGV0aW9ucyBwcmlvciB0byBhIGJyZWFrcG9pbnQuICBUaGVzZSBpc3N1ZXMgbmVlZCB0byBiZQorICAgICAgICAjICAgICBpbnZlc3RpZ2F0ZWQgYW5kIHVuZGVyc3Rvb2QuICBJdCdzIG5vdCBjbGVhciBpZiB0aGV5IGFyZQorICAgICAgICAjICAgICBUayBpc3N1ZXMgb3IgSURMRSBpc3N1ZXMsIG9yIHdoZXRoZXIgdGhleSBjYW4gYWN0dWFsbHkKKyAgICAgICAgIyAgICAgYmUgZml4ZWQuICBTaW5jZSBhIG1vZGlmaWVkIGZpbGUgaGFzIHRvIGJlIHNhdmVkIGJlZm9yZSBpdCBpcworICAgICAgICAjICAgICBydW4sIGFuZCBzaW5jZSBzZWxmLmJyZWFrcG9pbnRzIChmcm9tIHdoaWNoIHRoZSBzdWJwcm9jZXNzCisgICAgICAgICMgICAgIGRlYnVnZ2VyIGlzIGxvYWRlZCkgaXMgdXBkYXRlZCBkdXJpbmcgdGhlIHNhdmUsIHRoZSB2aXNpYmxlCisgICAgICAgICMgICAgIGJyZWFrcyBzdGF5IHN5bmNoZWQgd2l0aCB0aGUgc3VicHJvY2VzcyBldmVuIGlmIG9uZSBvZiB0aGVzZQorICAgICAgICAjICAgICB1bmV4cGVjdGVkIGJyZWFrcG9pbnQgZGVsZXRpb25zIG9jY3Vycy4KKyAgICAgICAgYnJlYWtzID0gc2VsZi5icmVha3BvaW50cworICAgICAgICBmaWxlbmFtZSA9IHNlbGYuaW8uZmlsZW5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuYnJlYWtwb2ludFBhdGgsInIiKSBhcyBvbGRfZmlsZToKKyAgICAgICAgICAgICAgICBsaW5lcyA9IG9sZF9maWxlLnJlYWRsaW5lcygpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgbGluZXMgPSBbXQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5icmVha3BvaW50UGF0aCwidyIpIGFzIG5ld19maWxlOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKGZpbGVuYW1lICsgJz0nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19maWxlLndyaXRlKGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVfYnJlYWtwb2ludHMoKQorICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlbGYuYnJlYWtwb2ludHMKKyAgICAgICAgICAgICAgICBpZiBicmVha3M6CisgICAgICAgICAgICAgICAgICAgIG5ld19maWxlLndyaXRlKGZpbGVuYW1lICsgJz0nICsgc3RyKGJyZWFrcykgKyAnXG4nKQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlcnI6CisgICAgICAgICAgICBpZiBub3QgZ2V0YXR0cihzZWxmLnJvb3QsICJicmVha3BvaW50X2Vycm9yX2Rpc3BsYXllZCIsIEZhbHNlKToKKyAgICAgICAgICAgICAgICBzZWxmLnJvb3QuYnJlYWtwb2ludF9lcnJvcl9kaXNwbGF5ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nSURMRSBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1VuYWJsZSB0byB1cGRhdGUgYnJlYWtwb2ludCBsaXN0OlxuJXMnCisgICAgICAgICAgICAgICAgICAgICAgICAlIHN0cihlcnIpLAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZi50ZXh0KQorCisgICAgZGVmIHJlc3RvcmVfZmlsZV9icmVha3Moc2VsZik6CisgICAgICAgIHNlbGYudGV4dC51cGRhdGUoKSAgICMgdGhpcyBlbmFibGVzIHNldHRpbmcgIkJSRUFLIiB0YWdzIHRvIGJlIHZpc2libGUKKyAgICAgICAgaWYgc2VsZi5pbyBpcyBOb25lOgorICAgICAgICAgICAgIyBjYW4gaGFwcGVuIGlmIElETEUgY2xvc2VzIGR1ZSB0byB0aGUgLnVwZGF0ZSgpIGNhbGwKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuaW8uZmlsZW5hbWUKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzZWxmLmJyZWFrcG9pbnRQYXRoKToKKyAgICAgICAgICAgIGxpbmVzID0gb3BlbihzZWxmLmJyZWFrcG9pbnRQYXRoLCJyIikucmVhZGxpbmVzKCkKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aChmaWxlbmFtZSArICc9Jyk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRfbGluZW51bWJlcnMgPSBldmFsKGxpbmVbbGVuKGZpbGVuYW1lKSsxOl0pCisgICAgICAgICAgICAgICAgICAgIGZvciBicmVha3BvaW50X2xpbmVudW1iZXIgaW4gYnJlYWtwb2ludF9saW5lbnVtYmVyczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0X2JyZWFrcG9pbnQoYnJlYWtwb2ludF9saW5lbnVtYmVyKQorCisgICAgZGVmIHVwZGF0ZV9icmVha3BvaW50cyhzZWxmKToKKyAgICAgICAgIlJldHJpZXZlcyBhbGwgdGhlIGJyZWFrcG9pbnRzIGluIHRoZSBjdXJyZW50IHdpbmRvdyIKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICByYW5nZXMgPSB0ZXh0LnRhZ19yYW5nZXMoIkJSRUFLIikKKyAgICAgICAgbGluZW51bWJlcl9saXN0ID0gc2VsZi5yYW5nZXNfdG9fbGluZW51bWJlcnMocmFuZ2VzKQorICAgICAgICBzZWxmLmJyZWFrcG9pbnRzID0gbGluZW51bWJlcl9saXN0CisKKyAgICBkZWYgcmFuZ2VzX3RvX2xpbmVudW1iZXJzKHNlbGYsIHJhbmdlcyk6CisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgZm9yIGluZGV4IGluIHJhbmdlKDAsIGxlbihyYW5nZXMpLCAyKToKKyAgICAgICAgICAgIGxpbmVubyA9IGludChmbG9hdChyYW5nZXNbaW5kZXhdLnN0cmluZykpCisgICAgICAgICAgICBlbmQgPSBpbnQoZmxvYXQocmFuZ2VzW2luZGV4KzFdLnN0cmluZykpCisgICAgICAgICAgICB3aGlsZSBsaW5lbm8gPCBlbmQ6CisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmVubykKKyAgICAgICAgICAgICAgICBsaW5lbm8gKz0gMQorICAgICAgICByZXR1cm4gbGluZXMKKworIyBYWFggMTMgRGVjIDIwMDIgS0JLIE5vdCB1c2VkIGN1cnJlbnRseQorIyAgICBkZWYgc2F2ZWRfY2hhbmdlX2hvb2soc2VsZik6CisjICAgICAgICAiRXh0ZW5kIGJhc2UgbWV0aG9kIC0gY2xlYXIgYnJlYWtzIGlmIG1vZHVsZSBpcyBtb2RpZmllZCIKKyMgICAgICAgIGlmIG5vdCBzZWxmLmdldF9zYXZlZCgpOgorIyAgICAgICAgICAgIHNlbGYuY2xlYXJfZmlsZV9icmVha3MoKQorIyAgICAgICAgRWRpdG9yV2luZG93LnNhdmVkX2NoYW5nZV9ob29rKHNlbGYpCisKKyAgICBkZWYgX2Nsb3NlKHNlbGYpOgorICAgICAgICAiRXh0ZW5kIGJhc2UgbWV0aG9kIC0gY2xlYXIgYnJlYWtzIHdoZW4gbW9kdWxlIGlzIGNsb3NlZCIKKyAgICAgICAgc2VsZi5jbGVhcl9maWxlX2JyZWFrcygpCisgICAgICAgIEVkaXRvcldpbmRvdy5fY2xvc2Uoc2VsZikKKworCitjbGFzcyBQeVNoZWxsRmlsZUxpc3QoRmlsZUxpc3QpOgorICAgICJFeHRlbmQgYmFzZSBjbGFzczogSURMRSBzdXBwb3J0cyBhIHNoZWxsIGFuZCBicmVha3BvaW50cyIKKworICAgICMgb3ZlcnJpZGUgRmlsZUxpc3QncyBjbGFzcyB2YXJpYWJsZSwgaW5zdGFuY2VzIHJldHVybiBQeVNoZWxsRWRpdG9yV2luZG93CisgICAgIyBpbnN0ZWFkIG9mIEVkaXRvcldpbmRvdyB3aGVuIG5ldyBlZGl0IHdpbmRvd3MgYXJlIGNyZWF0ZWQuCisgICAgRWRpdG9yV2luZG93ID0gUHlTaGVsbEVkaXRvcldpbmRvdworCisgICAgcHlzaGVsbCA9IE5vbmUKKworICAgIGRlZiBvcGVuX3NoZWxsKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLnB5c2hlbGw6CisgICAgICAgICAgICBzZWxmLnB5c2hlbGwudG9wLndha2V1cCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnB5c2hlbGwgPSBQeVNoZWxsKHNlbGYpCisgICAgICAgICAgICBpZiBzZWxmLnB5c2hlbGw6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucHlzaGVsbC5iZWdpbigpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5weXNoZWxsCisKKworY2xhc3MgTW9kaWZpZWRDb2xvckRlbGVnYXRvcihDb2xvckRlbGVnYXRvcik6CisgICAgIkV4dGVuZCBiYXNlIGNsYXNzOiBjb2xvcml6ZXIgZm9yIHRoZSBzaGVsbCB3aW5kb3cgaXRzZWxmIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBDb2xvckRlbGVnYXRvci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLkxvYWRUYWdEZWZzKCkKKworICAgIGRlZiByZWNvbG9yaXplX21haW4oc2VsZik6CisgICAgICAgIHNlbGYudGFnX3JlbW92ZSgiVE9ETyIsICIxLjAiLCAiaW9tYXJrIikKKyAgICAgICAgc2VsZi50YWdfYWRkKCJTWU5DIiwgIjEuMCIsICJpb21hcmsiKQorICAgICAgICBDb2xvckRlbGVnYXRvci5yZWNvbG9yaXplX21haW4oc2VsZikKKworICAgIGRlZiBMb2FkVGFnRGVmcyhzZWxmKToKKyAgICAgICAgQ29sb3JEZWxlZ2F0b3IuTG9hZFRhZ0RlZnMoc2VsZikKKyAgICAgICAgdGhlbWUgPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdUaGVtZScsJ25hbWUnKQorICAgICAgICBzZWxmLnRhZ2RlZnMudXBkYXRlKHsKKyAgICAgICAgICAgICJzdGRpbiI6IHsnYmFja2dyb3VuZCc6Tm9uZSwnZm9yZWdyb3VuZCc6Tm9uZX0sCisgICAgICAgICAgICAic3Rkb3V0IjogaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAic3Rkb3V0IiksCisgICAgICAgICAgICAic3RkZXJyIjogaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAic3RkZXJyIiksCisgICAgICAgICAgICAiY29uc29sZSI6IGlkbGVDb25mLkdldEhpZ2hsaWdodCh0aGVtZSwgImNvbnNvbGUiKSwKKyAgICAgICAgfSkKKworICAgIGRlZiByZW1vdmVjb2xvcnMoc2VsZik6CisgICAgICAgICMgRG9uJ3QgcmVtb3ZlIHNoZWxsIGNvbG9yIHRhZ3MgYmVmb3JlICJpb21hcmsiCisgICAgICAgIGZvciB0YWcgaW4gc2VsZi50YWdkZWZzOgorICAgICAgICAgICAgc2VsZi50YWdfcmVtb3ZlKHRhZywgImlvbWFyayIsICJlbmQiKQorCitjbGFzcyBNb2RpZmllZFVuZG9EZWxlZ2F0b3IoVW5kb0RlbGVnYXRvcik6CisgICAgIkV4dGVuZCBiYXNlIGNsYXNzOiBmb3JiaWQgaW5zZXJ0L2RlbGV0ZSBiZWZvcmUgdGhlIEkvTyBtYXJrIgorCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgY2hhcnMsIHRhZ3M9Tm9uZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuZGVsZWdhdGUuY29tcGFyZShpbmRleCwgIjwiLCAiaW9tYXJrIik6CisgICAgICAgICAgICAgICAgc2VsZi5kZWxlZ2F0ZS5iZWxsKCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBVbmRvRGVsZWdhdG9yLmluc2VydChzZWxmLCBpbmRleCwgY2hhcnMsIHRhZ3MpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIGluZGV4MSwgaW5kZXgyPU5vbmUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLmRlbGVnYXRlLmNvbXBhcmUoaW5kZXgxLCAiPCIsICJpb21hcmsiKToKKyAgICAgICAgICAgICAgICBzZWxmLmRlbGVnYXRlLmJlbGwoKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIFVuZG9EZWxlZ2F0b3IuZGVsZXRlKHNlbGYsIGluZGV4MSwgaW5kZXgyKQorCisKK2NsYXNzIE15UlBDQ2xpZW50KHJwYy5SUENDbGllbnQpOgorCisgICAgZGVmIGhhbmRsZV9FT0Yoc2VsZik6CisgICAgICAgICJPdmVycmlkZSB0aGUgYmFzZSBjbGFzcyAtIGp1c3QgcmUtcmFpc2UgRU9GRXJyb3IiCisgICAgICAgIHJhaXNlIEVPRkVycm9yCisKKworY2xhc3MgTW9kaWZpZWRJbnRlcnByZXRlcihJbnRlcmFjdGl2ZUludGVycHJldGVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0a2NvbnNvbGUpOgorICAgICAgICBzZWxmLnRrY29uc29sZSA9IHRrY29uc29sZQorICAgICAgICBsb2NhbHMgPSBzeXMubW9kdWxlc1snX19tYWluX18nXS5fX2RpY3RfXworICAgICAgICBJbnRlcmFjdGl2ZUludGVycHJldGVyLl9faW5pdF9fKHNlbGYsIGxvY2Fscz1sb2NhbHMpCisgICAgICAgIHNlbGYuc2F2ZV93YXJuaW5nc19maWx0ZXJzID0gTm9uZQorICAgICAgICBzZWxmLnJlc3RhcnRpbmcgPSBGYWxzZQorICAgICAgICBzZWxmLnN1YnByb2Nlc3NfYXJnbGlzdCA9IE5vbmUKKyAgICAgICAgc2VsZi5wb3J0ID0gUE9SVAorICAgICAgICBzZWxmLm9yaWdpbmFsX2NvbXBpbGVyX2ZsYWdzID0gc2VsZi5jb21waWxlLmNvbXBpbGVyLmZsYWdzCisKKyAgICBycGNjbHQgPSBOb25lCisgICAgcnBjcGlkID0gTm9uZQorCisgICAgZGVmIHNwYXduX3N1YnByb2Nlc3Moc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3VicHJvY2Vzc19hcmdsaXN0IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnN1YnByb2Nlc3NfYXJnbGlzdCA9IHNlbGYuYnVpbGRfc3VicHJvY2Vzc19hcmdsaXN0KCkKKyAgICAgICAgYXJncyA9IHNlbGYuc3VicHJvY2Vzc19hcmdsaXN0CisgICAgICAgIHNlbGYucnBjcGlkID0gb3Muc3Bhd252KG9zLlBfTk9XQUlULCBzeXMuZXhlY3V0YWJsZSwgYXJncykKKworICAgIGRlZiBidWlsZF9zdWJwcm9jZXNzX2FyZ2xpc3Qoc2VsZik6CisgICAgICAgIGFzc2VydCAoc2VsZi5wb3J0IT0wKSwgKAorICAgICAgICAgICAgIlNvY2tldCBzaG91bGQgaGF2ZSBiZWVuIGFzc2lnbmVkIGEgcG9ydCBudW1iZXIuIikKKyAgICAgICAgdyA9IFsnLVcnICsgcyBmb3IgcyBpbiBzeXMud2Fybm9wdGlvbnNdCisgICAgICAgIGlmIDEvMiA+IDA6ICMgYWNjb3VudCBmb3IgbmV3IGRpdmlzaW9uCisgICAgICAgICAgICB3LmFwcGVuZCgnLVFuZXcnKQorICAgICAgICAjIE1heWJlIElETEUgaXMgaW5zdGFsbGVkIGFuZCBpcyBiZWluZyBhY2Nlc3NlZCB2aWEgc3lzLnBhdGgsCisgICAgICAgICMgb3IgbWF5YmUgaXQncyBub3QgaW5zdGFsbGVkIGFuZCB0aGUgaWRsZS5weSBzY3JpcHQgaXMgYmVpbmcKKyAgICAgICAgIyBydW4gZnJvbSB0aGUgSURMRSBzb3VyY2UgZGlyZWN0b3J5LgorICAgICAgICBkZWxfZXhpdGYgPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnR2VuZXJhbCcsICdkZWxldGUtZXhpdGZ1bmMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1GYWxzZSwgdHlwZT0nYm9vbCcpCisgICAgICAgIGlmIF9fbmFtZV9fID09ICdpZGxlbGliLlB5U2hlbGwnOgorICAgICAgICAgICAgY29tbWFuZCA9ICJfX2ltcG9ydF9fKCdpZGxlbGliLnJ1bicpLnJ1bi5tYWluKCVyKSIgJSAoZGVsX2V4aXRmLCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbW1hbmQgPSAiX19pbXBvcnRfXygncnVuJykubWFpbiglcikiICUgKGRlbF9leGl0ZiwpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbicgYW5kICcgJyBpbiBzeXMuZXhlY3V0YWJsZToKKyAgICAgICAgICAgICMgaGFuZGxlIGVtYmVkZGVkIHNwYWNlIGluIHBhdGggYnkgcXVvdGluZyB0aGUgYXJndW1lbnQKKyAgICAgICAgICAgIGRlY29yYXRlZF9leGVjID0gJyIlcyInICUgc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlY29yYXRlZF9leGVjID0gc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgcmV0dXJuIFtkZWNvcmF0ZWRfZXhlY10gKyB3ICsgWyItYyIsIGNvbW1hbmQsIHN0cihzZWxmLnBvcnQpXQorCisgICAgZGVmIHN0YXJ0X3N1YnByb2Nlc3Moc2VsZik6CisgICAgICAgIGFkZHIgPSAoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICAjIEdVSSBtYWtlcyBzZXZlcmFsIGF0dGVtcHRzIHRvIGFjcXVpcmUgc29ja2V0LCBsaXN0ZW5zIGZvciBjb25uZWN0aW9uCisgICAgICAgIGZvciBpIGluIHJhbmdlKDMpOgorICAgICAgICAgICAgdGltZS5zbGVlcChpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYucnBjY2x0ID0gTXlSUENDbGllbnQoYWRkcikKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGlzcGxheV9wb3J0X2JpbmRpbmdfZXJyb3IoKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgIyBpZiBQT1JUIHdhcyAwLCBzeXN0ZW0gd2lsbCBhc3NpZ24gYW4gJ2VwaGVtZXJhbCcgcG9ydC4gRmluZCBpdCBvdXQ6CisgICAgICAgIHNlbGYucG9ydCA9IHNlbGYucnBjY2x0Lmxpc3RlbmluZ19zb2NrLmdldHNvY2tuYW1lKClbMV0KKyAgICAgICAgIyBpZiBQT1JUIHdhcyBub3QgMCwgcHJvYmFibHkgd29ya2luZyB3aXRoIGEgcmVtb3RlIGV4ZWN1dGlvbiBzZXJ2ZXIKKyAgICAgICAgaWYgUE9SVCAhPSAwOgorICAgICAgICAgICAgIyBUbyBhbGxvdyByZWNvbm5lY3Rpb24gd2l0aGluIHRoZSAyTVNMIHdhaXQgKGNmLiBTdGV2ZW5zIFRDUAorICAgICAgICAgICAgIyBWMSwgMTguNiksICBzZXQgU09fUkVVU0VBRERSLiAgTm90ZSB0aGF0IHRoaXMgY2FuIGJlIHByb2JsZW1hdGljCisgICAgICAgICAgICAjIG9uIFdpbmRvd3Mgc2luY2UgdGhlIGltcGxlbWVudGF0aW9uIGFsbG93cyB0d28gYWN0aXZlIHNvY2tldHMgb24KKyAgICAgICAgICAgICMgdGhlIHNhbWUgYWRkcmVzcyEKKyAgICAgICAgICAgIHNlbGYucnBjY2x0Lmxpc3RlbmluZ19zb2NrLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgc2VsZi5zcGF3bl9zdWJwcm9jZXNzKCkKKyAgICAgICAgI3RpbWUuc2xlZXAoMjApICMgdGVzdCB0byBzaW11bGF0ZSBHVUkgbm90IGFjY2VwdGluZyBjb25uZWN0aW9uCisgICAgICAgICMgQWNjZXB0IHRoZSBjb25uZWN0aW9uIGZyb20gdGhlIFB5dGhvbiBleGVjdXRpb24gc2VydmVyCisgICAgICAgIHNlbGYucnBjY2x0Lmxpc3RlbmluZ19zb2NrLnNldHRpbWVvdXQoMTApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucnBjY2x0LmFjY2VwdCgpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dCwgZXJyOgorICAgICAgICAgICAgc2VsZi5kaXNwbGF5X25vX3N1YnByb2Nlc3NfZXJyb3IoKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgc2VsZi5ycGNjbHQucmVnaXN0ZXIoImNvbnNvbGUiLCBzZWxmLnRrY29uc29sZSkKKyAgICAgICAgc2VsZi5ycGNjbHQucmVnaXN0ZXIoInN0ZGluIiwgc2VsZi50a2NvbnNvbGUuc3RkaW4pCisgICAgICAgIHNlbGYucnBjY2x0LnJlZ2lzdGVyKCJzdGRvdXQiLCBzZWxmLnRrY29uc29sZS5zdGRvdXQpCisgICAgICAgIHNlbGYucnBjY2x0LnJlZ2lzdGVyKCJzdGRlcnIiLCBzZWxmLnRrY29uc29sZS5zdGRlcnIpCisgICAgICAgIHNlbGYucnBjY2x0LnJlZ2lzdGVyKCJmbGlzdCIsIHNlbGYudGtjb25zb2xlLmZsaXN0KQorICAgICAgICBzZWxmLnJwY2NsdC5yZWdpc3RlcigibGluZWNhY2hlIiwgbGluZWNhY2hlKQorICAgICAgICBzZWxmLnJwY2NsdC5yZWdpc3RlcigiaW50ZXJwIiwgc2VsZikKKyAgICAgICAgc2VsZi50cmFuc2Zlcl9wYXRoKHdpdGhfY3dkPVRydWUpCisgICAgICAgIHNlbGYucG9sbF9zdWJwcm9jZXNzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYucnBjY2x0CisKKyAgICBkZWYgcmVzdGFydF9zdWJwcm9jZXNzKHNlbGYsIHdpdGhfY3dkPUZhbHNlKToKKyAgICAgICAgaWYgc2VsZi5yZXN0YXJ0aW5nOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucnBjY2x0CisgICAgICAgIHNlbGYucmVzdGFydGluZyA9IFRydWUKKyAgICAgICAgIyBjbG9zZSBvbmx5IHRoZSBzdWJwcm9jZXNzIGRlYnVnZ2VyCisgICAgICAgIGRlYnVnID0gc2VsZi5nZXRkZWJ1Z2dlcigpCisgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgT25seSBjbG9zZSBzdWJwcm9jZXNzIGRlYnVnZ2VyLCBkb24ndCB1bnJlZ2lzdGVyIGd1aV9hZGFwIQorICAgICAgICAgICAgICAgIFJlbW90ZURlYnVnZ2VyLmNsb3NlX3N1YnByb2Nlc3NfZGVidWdnZXIoc2VsZi5ycGNjbHQpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAjIEtpbGwgc3VicHJvY2Vzcywgc3Bhd24gYSBuZXcgb25lLCBhY2NlcHQgY29ubmVjdGlvbi4KKyAgICAgICAgc2VsZi5ycGNjbHQuY2xvc2UoKQorICAgICAgICBzZWxmLnVuaXhfdGVybWluYXRlKCkKKyAgICAgICAgY29uc29sZSA9IHNlbGYudGtjb25zb2xlCisgICAgICAgIHdhc19leGVjdXRpbmcgPSBjb25zb2xlLmV4ZWN1dGluZworICAgICAgICBjb25zb2xlLmV4ZWN1dGluZyA9IEZhbHNlCisgICAgICAgIHNlbGYuc3Bhd25fc3VicHJvY2VzcygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucnBjY2x0LmFjY2VwdCgpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dCwgZXJyOgorICAgICAgICAgICAgc2VsZi5kaXNwbGF5X25vX3N1YnByb2Nlc3NfZXJyb3IoKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgc2VsZi50cmFuc2Zlcl9wYXRoKHdpdGhfY3dkPXdpdGhfY3dkKQorICAgICAgICBjb25zb2xlLnN0b3BfcmVhZGxpbmUoKQorICAgICAgICAjIGFubm90YXRlIHJlc3RhcnQgaW4gc2hlbGwgd2luZG93IGFuZCBtYXJrIGl0CisgICAgICAgIGNvbnNvbGUudGV4dC5kZWxldGUoImlvbWFyayIsICJlbmQtMWMiKQorICAgICAgICBpZiB3YXNfZXhlY3V0aW5nOgorICAgICAgICAgICAgY29uc29sZS53cml0ZSgnXG4nKQorICAgICAgICAgICAgY29uc29sZS5zaG93cHJvbXB0KCkKKyAgICAgICAgaGFsZmJhciA9ICgoaW50KGNvbnNvbGUud2lkdGgpIC0gMTYpIC8vIDIpICogJz0nCisgICAgICAgIGNvbnNvbGUud3JpdGUoaGFsZmJhciArICcgUkVTVEFSVCAnICsgaGFsZmJhcikKKyAgICAgICAgY29uc29sZS50ZXh0Lm1hcmtfc2V0KCJyZXN0YXJ0IiwgImVuZC0xYyIpCisgICAgICAgIGNvbnNvbGUudGV4dC5tYXJrX2dyYXZpdHkoInJlc3RhcnQiLCAibGVmdCIpCisgICAgICAgIGNvbnNvbGUuc2hvd3Byb21wdCgpCisgICAgICAgICMgcmVzdGFydCBzdWJwcm9jZXNzIGRlYnVnZ2VyCisgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgIyBSZXN0YXJ0ZWQgZGVidWdnZXIgY29ubmVjdHMgdG8gY3VycmVudCBpbnN0YW5jZSBvZiBkZWJ1ZyBHVUkKKyAgICAgICAgICAgIGd1aSA9IFJlbW90ZURlYnVnZ2VyLnJlc3RhcnRfc3VicHJvY2Vzc19kZWJ1Z2dlcihzZWxmLnJwY2NsdCkKKyAgICAgICAgICAgICMgcmVsb2FkIHJlbW90ZSBkZWJ1Z2dlciBicmVha3BvaW50cyBmb3IgYWxsIFB5U2hlbGxFZGl0V2luZG93cworICAgICAgICAgICAgZGVidWcubG9hZF9icmVha3BvaW50cygpCisgICAgICAgIHNlbGYuY29tcGlsZS5jb21waWxlci5mbGFncyA9IHNlbGYub3JpZ2luYWxfY29tcGlsZXJfZmxhZ3MKKyAgICAgICAgc2VsZi5yZXN0YXJ0aW5nID0gRmFsc2UKKyAgICAgICAgcmV0dXJuIHNlbGYucnBjY2x0CisKKyAgICBkZWYgX19yZXF1ZXN0X2ludGVycnVwdChzZWxmKToKKyAgICAgICAgc2VsZi5ycGNjbHQucmVtb3RlY2FsbCgiZXhlYyIsICJpbnRlcnJ1cHRfdGhlX3NlcnZlciIsICgpLCB7fSkKKworICAgIGRlZiBpbnRlcnJ1cHRfc3VicHJvY2VzcyhzZWxmKToKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5fX3JlcXVlc3RfaW50ZXJydXB0KS5zdGFydCgpCisKKyAgICBkZWYga2lsbF9zdWJwcm9jZXNzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnJwY2NsdC5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjogICMgbm8gc29ja2V0CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYudW5peF90ZXJtaW5hdGUoKQorICAgICAgICBzZWxmLnRrY29uc29sZS5leGVjdXRpbmcgPSBGYWxzZQorICAgICAgICBzZWxmLnJwY2NsdCA9IE5vbmUKKworICAgIGRlZiB1bml4X3Rlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgIlVOSVg6IG1ha2Ugc3VyZSBzdWJwcm9jZXNzIGlzIHRlcm1pbmF0ZWQgYW5kIGNvbGxlY3Qgc3RhdHVzIgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAna2lsbCcpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLmtpbGwoc2VsZi5ycGNwaWQsIFNJR1RFUk0pCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAjIHByb2Nlc3MgYWxyZWFkeSB0ZXJtaW5hdGVkOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLndhaXRwaWQoc2VsZi5ycGNwaWQsIDApCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIHRyYW5zZmVyX3BhdGgoc2VsZiwgd2l0aF9jd2Q9RmFsc2UpOgorICAgICAgICBpZiB3aXRoX2N3ZDogICAgICAgICMgSXNzdWUgMTM1MDYKKyAgICAgICAgICAgIHBhdGggPSBbJyddICAgICAjIGluY2x1ZGUgQ3VycmVudCBXb3JraW5nIERpcmVjdG9yeQorICAgICAgICAgICAgcGF0aC5leHRlbmQoc3lzLnBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gc3lzLnBhdGgKKworICAgICAgICBzZWxmLnJ1bmNvbW1hbmQoIiIiaWYgMToKKyAgICAgICAgaW1wb3J0IHN5cyBhcyBfc3lzCisgICAgICAgIF9zeXMucGF0aCA9ICVyCisgICAgICAgIGRlbCBfc3lzCisgICAgICAgIFxuIiIiICUgKHBhdGgsKSkKKworICAgIGFjdGl2ZV9zZXEgPSBOb25lCisKKyAgICBkZWYgcG9sbF9zdWJwcm9jZXNzKHNlbGYpOgorICAgICAgICBjbHQgPSBzZWxmLnJwY2NsdAorICAgICAgICBpZiBjbHQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXNwb25zZSA9IGNsdC5wb2xscmVzcG9uc2Uoc2VsZi5hY3RpdmVfc2VxLCB3YWl0PTAuMDUpCisgICAgICAgIGV4Y2VwdCAoRU9GRXJyb3IsIElPRXJyb3IsIEtleWJvYXJkSW50ZXJydXB0KToKKyAgICAgICAgICAgICMgbG9zdCBjb25uZWN0aW9uIG9yIHN1YnByb2Nlc3MgdGVybWluYXRlZCBpdHNlbGYsIHJlc3RhcnQKKyAgICAgICAgICAgICMgW3RoZSBLQkkgaXMgZnJvbSBycGMuU29ja2V0SU8uaGFuZGxlX0VPRigpXQorICAgICAgICAgICAgaWYgc2VsZi50a2NvbnNvbGUuY2xvc2luZzoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJlc3BvbnNlID0gTm9uZQorICAgICAgICAgICAgc2VsZi5yZXN0YXJ0X3N1YnByb2Nlc3MoKQorICAgICAgICBpZiByZXNwb25zZToKKyAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLnJlc2V0b3V0cHV0KCkKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlX3NlcSA9IE5vbmUKKyAgICAgICAgICAgIGhvdywgd2hhdCA9IHJlc3BvbnNlCisgICAgICAgICAgICBjb25zb2xlID0gc2VsZi50a2NvbnNvbGUuY29uc29sZQorICAgICAgICAgICAgaWYgaG93ID09ICJPSyI6CisgICAgICAgICAgICAgICAgaWYgd2hhdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5jb25zb2xlLCByZXByKHdoYXQpCisgICAgICAgICAgICBlbGlmIGhvdyA9PSAiRVhDRVBUSU9OIjoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnRrY29uc29sZS5nZXR2YXIoIjw8dG9nZ2xlLWppdC1zdGFjay12aWV3ZXI+PiIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW90ZV9zdGFja192aWV3ZXIoKQorICAgICAgICAgICAgZWxpZiBob3cgPT0gIkVSUk9SIjoKKyAgICAgICAgICAgICAgICBlcnJtc2cgPSAiUHlTaGVsbC5Nb2RpZmllZEludGVycHJldGVyOiBTdWJwcm9jZXNzIEVSUk9SOlxuIgorICAgICAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3RkZXJyX18sIGVycm1zZywgd2hhdAorICAgICAgICAgICAgICAgIHByaW50ID4+Y29uc29sZSwgZXJybXNnLCB3aGF0CisgICAgICAgICAgICAjIHdlIHJlY2VpdmVkIGEgcmVzcG9uc2UgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgc2VxIG51bWJlcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5lbmRleGVjdXRpbmcoKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiAgIyBzaGVsbCBtYXkgaGF2ZSBjbG9zZWQKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICMgUmVzY2hlZHVsZSBteXNlbGYKKyAgICAgICAgaWYgbm90IHNlbGYudGtjb25zb2xlLmNsb3Npbmc6CisgICAgICAgICAgICBzZWxmLnRrY29uc29sZS50ZXh0LmFmdGVyKHNlbGYudGtjb25zb2xlLnBvbGxpbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb2xsX3N1YnByb2Nlc3MpCisKKyAgICBkZWJ1Z2dlciA9IE5vbmUKKworICAgIGRlZiBzZXRkZWJ1Z2dlcihzZWxmLCBkZWJ1Z2dlcik6CisgICAgICAgIHNlbGYuZGVidWdnZXIgPSBkZWJ1Z2dlcgorCisgICAgZGVmIGdldGRlYnVnZ2VyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kZWJ1Z2dlcgorCisgICAgZGVmIG9wZW5fcmVtb3RlX3N0YWNrX3ZpZXdlcihzZWxmKToKKyAgICAgICAgIiIiSW5pdGlhdGUgdGhlIHJlbW90ZSBzdGFjayB2aWV3ZXIgZnJvbSBhIHNlcGFyYXRlIHRocmVhZC4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSB0aGUgc3VicHJvY2VzcywgYW5kIGJ5IHJldHVybmluZyBmcm9tIHRoaXMKKyAgICAgICAgbWV0aG9kIHdlIGFsbG93IHRoZSBzdWJwcm9jZXNzIHRvIHVuYmxvY2suICBBZnRlciBhIGJpdCB0aGUgc2hlbGwKKyAgICAgICAgcmVxdWVzdHMgdGhlIHN1YnByb2Nlc3MgdG8gb3BlbiB0aGUgcmVtb3RlIHN0YWNrIHZpZXdlciB3aGljaCByZXR1cm5zIGEKKyAgICAgICAgc3RhdGljIG9iamVjdCBsb29raW5nIGF0IHRoZSBsYXN0IGV4Y2VwdGlvbi4gIEl0IGlzIHF1ZXJpZWQgdGhyb3VnaAorICAgICAgICB0aGUgUlBDIG1lY2hhbmlzbS4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi50a2NvbnNvbGUudGV4dC5hZnRlcigzMDAsIHNlbGYucmVtb3RlX3N0YWNrX3ZpZXdlcikKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgcmVtb3RlX3N0YWNrX3ZpZXdlcihzZWxmKToKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBSZW1vdGVPYmplY3RCcm93c2VyCisgICAgICAgIG9pZCA9IHNlbGYucnBjY2x0LnJlbW90ZXF1ZXVlKCJleGVjIiwgInN0YWNrdmlld2VyIiwgKCJmbGlzdCIsKSwge30pCisgICAgICAgIGlmIG9pZCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50a2NvbnNvbGUucm9vdC5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpdGVtID0gUmVtb3RlT2JqZWN0QnJvd3Nlci5TdHViT2JqZWN0VHJlZUl0ZW0oc2VsZi5ycGNjbHQsIG9pZCkKKyAgICAgICAgZnJvbSBpZGxlbGliLlRyZWVXaWRnZXQgaW1wb3J0IFNjcm9sbGVkQ2FudmFzLCBUcmVlTm9kZQorICAgICAgICB0b3AgPSBUb3BsZXZlbChzZWxmLnRrY29uc29sZS5yb290KQorICAgICAgICB0aGVtZSA9IGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ1RoZW1lJywnbmFtZScpCisgICAgICAgIGJhY2tncm91bmQgPSBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICdub3JtYWwnKVsnYmFja2dyb3VuZCddCisgICAgICAgIHNjID0gU2Nyb2xsZWRDYW52YXModG9wLCBiZz1iYWNrZ3JvdW5kLCBoaWdobGlnaHR0aGlja25lc3M9MCkKKyAgICAgICAgc2MuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCisgICAgICAgIG5vZGUgPSBUcmVlTm9kZShzYy5jYW52YXMsIE5vbmUsIGl0ZW0pCisgICAgICAgIG5vZGUuZXhwYW5kKCkKKyAgICAgICAgIyBYWFggU2hvdWxkIEdDIHRoZSByZW1vdGUgdHJlZSB3aGVuIGNsb3NpbmcgdGhlIHdpbmRvdworCisgICAgZ2lkID0gMAorCisgICAgZGVmIGV4ZWNzb3VyY2Uoc2VsZiwgc291cmNlKToKKyAgICAgICAgIkxpa2UgcnVuc291cmNlKCkgYnV0IGFzc3VtZXMgY29tcGxldGUgZXhlYyBzb3VyY2UiCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5zdHVmZnNvdXJjZShzb3VyY2UpCisgICAgICAgIHNlbGYuZXhlY2ZpbGUoZmlsZW5hbWUsIHNvdXJjZSkKKworICAgIGRlZiBleGVjZmlsZShzZWxmLCBmaWxlbmFtZSwgc291cmNlPU5vbmUpOgorICAgICAgICAiRXhlY3V0ZSBhbiBleGlzdGluZyBmaWxlIgorICAgICAgICBpZiBzb3VyY2UgaXMgTm9uZToKKyAgICAgICAgICAgIHNvdXJjZSA9IG9wZW4oZmlsZW5hbWUsICJyIikucmVhZCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsICJleGVjIikKKyAgICAgICAgZXhjZXB0IChPdmVyZmxvd0Vycm9yLCBTeW50YXhFcnJvcik6CisgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5yZXNldG91dHB1dCgpCisgICAgICAgICAgICB0a2VyciA9IHNlbGYudGtjb25zb2xlLnN0ZGVycgorICAgICAgICAgICAgcHJpbnQ+PnRrZXJyLCAnKioqIEVycm9yIGluIHNjcmlwdCBvciBjb21tYW5kIVxuJworICAgICAgICAgICAgcHJpbnQ+PnRrZXJyLCAnVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOicKKyAgICAgICAgICAgIEludGVyYWN0aXZlSW50ZXJwcmV0ZXIuc2hvd3N5bnRheGVycm9yKHNlbGYsIGZpbGVuYW1lKQorICAgICAgICAgICAgc2VsZi50a2NvbnNvbGUuc2hvd3Byb21wdCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJ1bmNvZGUoY29kZSkKKworICAgIGRlZiBydW5zb3VyY2Uoc2VsZiwgc291cmNlKToKKyAgICAgICAgIkV4dGVuZCBiYXNlIGNsYXNzIG1ldGhvZDogU3R1ZmYgdGhlIHNvdXJjZSBpbiB0aGUgbGluZSBjYWNoZSBmaXJzdCIKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLnN0dWZmc291cmNlKHNvdXJjZSkKKyAgICAgICAgc2VsZi5tb3JlID0gMAorICAgICAgICBzZWxmLnNhdmVfd2FybmluZ3NfZmlsdGVycyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KKyAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoYWN0aW9uPSJlcnJvciIsIGNhdGVnb3J5PVN5bnRheFdhcm5pbmcpCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc291cmNlLCB0eXBlcy5Vbmljb2RlVHlwZSk6CisgICAgICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IElPQmluZGluZworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZS5lbmNvZGUoSU9CaW5kaW5nLmVuY29kaW5nKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5yZXNldG91dHB1dCgpCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiVW5zdXBwb3J0ZWQgY2hhcmFjdGVycyBpbiBpbnB1dFxuIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBJbnRlcmFjdGl2ZUludGVycHJldGVyLnJ1bnNvdXJjZSgpIGNhbGxzIGl0cyBydW5jb2RlKCkgbWV0aG9kLAorICAgICAgICAgICAgIyB3aGljaCBpcyBvdmVycmlkZGVuIChzZWUgYmVsb3cpCisgICAgICAgICAgICByZXR1cm4gSW50ZXJhY3RpdmVJbnRlcnByZXRlci5ydW5zb3VyY2Uoc2VsZiwgc291cmNlLCBmaWxlbmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHNlbGYuc2F2ZV93YXJuaW5nc19maWx0ZXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBzZWxmLnNhdmVfd2FybmluZ3NfZmlsdGVycworICAgICAgICAgICAgICAgIHNlbGYuc2F2ZV93YXJuaW5nc19maWx0ZXJzID0gTm9uZQorCisgICAgZGVmIHN0dWZmc291cmNlKHNlbGYsIHNvdXJjZSk6CisgICAgICAgICJTdHVmZiBzb3VyY2UgaW4gdGhlIGZpbGVuYW1lIGNhY2hlIgorICAgICAgICBmaWxlbmFtZSA9ICI8cHlzaGVsbCMlZD4iICUgc2VsZi5naWQKKyAgICAgICAgc2VsZi5naWQgPSBzZWxmLmdpZCArIDEKKyAgICAgICAgbGluZXMgPSBzb3VyY2Uuc3BsaXQoIlxuIikKKyAgICAgICAgbGluZWNhY2hlLmNhY2hlW2ZpbGVuYW1lXSA9IGxlbihzb3VyY2UpKzEsIDAsIGxpbmVzLCBmaWxlbmFtZQorICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBwcmVwZW5kX3N5c3BhdGgoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiUHJlcGVuZCBzeXMucGF0aCB3aXRoIGZpbGUncyBkaXJlY3RvcnkgaWYgbm90IGFscmVhZHkgaW5jbHVkZWQiCisgICAgICAgIHNlbGYucnVuY29tbWFuZCgiIiJpZiAxOgorICAgICAgICAgICAgX2ZpbGVuYW1lID0gJXIKKyAgICAgICAgICAgIGltcG9ydCBzeXMgYXMgX3N5cworICAgICAgICAgICAgZnJvbSBvcy5wYXRoIGltcG9ydCBkaXJuYW1lIGFzIF9kaXJuYW1lCisgICAgICAgICAgICBfZGlyID0gX2Rpcm5hbWUoX2ZpbGVuYW1lKQorICAgICAgICAgICAgaWYgbm90IF9kaXIgaW4gX3N5cy5wYXRoOgorICAgICAgICAgICAgICAgIF9zeXMucGF0aC5pbnNlcnQoMCwgX2RpcikKKyAgICAgICAgICAgIGRlbCBfZmlsZW5hbWUsIF9zeXMsIF9kaXJuYW1lLCBfZGlyCisgICAgICAgICAgICBcbiIiIiAlIChmaWxlbmFtZSwpKQorCisgICAgZGVmIHNob3dzeW50YXhlcnJvcihzZWxmLCBmaWxlbmFtZT1Ob25lKToKKyAgICAgICAgIiIiRXh0ZW5kIGJhc2UgY2xhc3MgbWV0aG9kOiBBZGQgQ29sb3JpemluZworCisgICAgICAgIENvbG9yIHRoZSBvZmZlbmRpbmcgcG9zaXRpb24gaW5zdGVhZCBvZiBwcmludGluZyBpdCBhbmQgcG9pbnRpbmcgYXQgaXQKKyAgICAgICAgd2l0aCBhIGNhcmV0LgorCisgICAgICAgICIiIgorICAgICAgICB0ZXh0ID0gc2VsZi50a2NvbnNvbGUudGV4dAorICAgICAgICBzdHVmZiA9IHNlbGYudW5wYWNrZXJyb3IoKQorICAgICAgICBpZiBzdHVmZjoKKyAgICAgICAgICAgIG1zZywgbGluZW5vLCBvZmZzZXQsIGxpbmUgPSBzdHVmZgorICAgICAgICAgICAgaWYgbGluZW5vID09IDE6CisgICAgICAgICAgICAgICAgcG9zID0gImlvbWFyayArICVkIGNoYXJzIiAlIChvZmZzZXQtMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcG9zID0gImlvbWFyayBsaW5lc3RhcnQgKyAlZCBsaW5lcyArICVkIGNoYXJzIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAobGluZW5vLTEsIG9mZnNldC0xKQorICAgICAgICAgICAgdGV4dC50YWdfYWRkKCJFUlJPUiIsIHBvcykKKyAgICAgICAgICAgIHRleHQuc2VlKHBvcykKKyAgICAgICAgICAgIGNoYXIgPSB0ZXh0LmdldChwb3MpCisgICAgICAgICAgICBpZiBjaGFyIGFuZCBjaGFyIGluIElERU5UQ0hBUlM6CisgICAgICAgICAgICAgICAgdGV4dC50YWdfYWRkKCJFUlJPUiIsIHBvcyArICIgd29yZHN0YXJ0IiwgcG9zKQorICAgICAgICAgICAgc2VsZi50a2NvbnNvbGUucmVzZXRvdXRwdXQoKQorICAgICAgICAgICAgc2VsZi53cml0ZSgiU3ludGF4RXJyb3I6ICVzXG4iICUgc3RyKG1zZykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5yZXNldG91dHB1dCgpCisgICAgICAgICAgICBJbnRlcmFjdGl2ZUludGVycHJldGVyLnNob3dzeW50YXhlcnJvcihzZWxmLCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi50a2NvbnNvbGUuc2hvd3Byb21wdCgpCisKKyAgICBkZWYgdW5wYWNrZXJyb3Ioc2VsZik6CisgICAgICAgIHR5cGUsIHZhbHVlLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIG9rID0gdHlwZSBpcyBTeW50YXhFcnJvcgorICAgICAgICBpZiBvazoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtc2csIChkdW1teV9maWxlbmFtZSwgbGluZW5vLCBvZmZzZXQsIGxpbmUpID0gdmFsdWUKKyAgICAgICAgICAgICAgICBpZiBub3Qgb2Zmc2V0OgorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgb2sgPSAwCisgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgcmV0dXJuIG1zZywgbGluZW5vLCBvZmZzZXQsIGxpbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgc2hvd3RyYWNlYmFjayhzZWxmKToKKyAgICAgICAgIkV4dGVuZCBiYXNlIGNsYXNzIG1ldGhvZCB0byByZXNldCBvdXRwdXQgcHJvcGVybHkiCisgICAgICAgIHNlbGYudGtjb25zb2xlLnJlc2V0b3V0cHV0KCkKKyAgICAgICAgc2VsZi5jaGVja2xpbmVjYWNoZSgpCisgICAgICAgIEludGVyYWN0aXZlSW50ZXJwcmV0ZXIuc2hvd3RyYWNlYmFjayhzZWxmKQorICAgICAgICBpZiBzZWxmLnRrY29uc29sZS5nZXR2YXIoIjw8dG9nZ2xlLWppdC1zdGFjay12aWV3ZXI+PiIpOgorICAgICAgICAgICAgc2VsZi50a2NvbnNvbGUub3Blbl9zdGFja192aWV3ZXIoKQorCisgICAgZGVmIGNoZWNrbGluZWNhY2hlKHNlbGYpOgorICAgICAgICBjID0gbGluZWNhY2hlLmNhY2hlCisgICAgICAgIGZvciBrZXkgaW4gYy5rZXlzKCk6CisgICAgICAgICAgICBpZiBrZXlbOjFdICsga2V5Wy0xOl0gIT0gIjw+IjoKKyAgICAgICAgICAgICAgICBkZWwgY1trZXldCisKKyAgICBkZWYgcnVuY29tbWFuZChzZWxmLCBjb2RlKToKKyAgICAgICAgIlJ1biB0aGUgY29kZSB3aXRob3V0IGludm9raW5nIHRoZSBkZWJ1Z2dlciIKKyAgICAgICAgIyBUaGUgY29kZSBiZXR0ZXIgbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiEKKyAgICAgICAgaWYgc2VsZi50a2NvbnNvbGUuZXhlY3V0aW5nOgorICAgICAgICAgICAgc2VsZi5kaXNwbGF5X2V4ZWN1dGluZ19kaWFsb2coKQorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgaWYgc2VsZi5ycGNjbHQ6CisgICAgICAgICAgICBzZWxmLnJwY2NsdC5yZW1vdGVxdWV1ZSgiZXhlYyIsICJydW5jb2RlIiwgKGNvZGUsKSwge30pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleGVjIGNvZGUgaW4gc2VsZi5sb2NhbHMKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBydW5jb2RlKHNlbGYsIGNvZGUpOgorICAgICAgICAiT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2QiCisgICAgICAgIGlmIHNlbGYudGtjb25zb2xlLmV4ZWN1dGluZzoKKyAgICAgICAgICAgIHNlbGYuaW50ZXJwLnJlc3RhcnRfc3VicHJvY2VzcygpCisgICAgICAgIHNlbGYuY2hlY2tsaW5lY2FjaGUoKQorICAgICAgICBpZiBzZWxmLnNhdmVfd2FybmluZ3NfZmlsdGVycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBzZWxmLnNhdmVfd2FybmluZ3NfZmlsdGVycworICAgICAgICAgICAgc2VsZi5zYXZlX3dhcm5pbmdzX2ZpbHRlcnMgPSBOb25lCisgICAgICAgIGRlYnVnZ2VyID0gc2VsZi5kZWJ1Z2dlcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5iZWdpbmV4ZWN1dGluZygpCisgICAgICAgICAgICBpZiBub3QgZGVidWdnZXIgYW5kIHNlbGYucnBjY2x0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX3NlcSA9IHNlbGYucnBjY2x0LmFzeW5jcXVldWUoImV4ZWMiLCAicnVuY29kZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2RlLCksIHt9KQorICAgICAgICAgICAgZWxpZiBkZWJ1Z2dlcjoKKyAgICAgICAgICAgICAgICBkZWJ1Z2dlci5ydW4oY29kZSwgc2VsZi5sb2NhbHMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4ZWMgY29kZSBpbiBzZWxmLmxvY2FscworICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRrY29uc29sZS5jbG9zaW5nOgorICAgICAgICAgICAgICAgIGlmIHRrTWVzc2FnZUJveC5hc2t5ZXNubygKKyAgICAgICAgICAgICAgICAgICAgIkV4aXQ/IiwKKyAgICAgICAgICAgICAgICAgICAgIkRvIHlvdSB3YW50IHRvIGV4aXQgYWx0b2dldGhlcj8iLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ5ZXMiLAorICAgICAgICAgICAgICAgICAgICBtYXN0ZXI9c2VsZi50a2NvbnNvbGUudGV4dCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93dHJhY2ViYWNrKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaWYgdXNlX3N1YnByb2Nlc3M6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnRrY29uc29sZS5zdGRlcnIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSURMRSBpbnRlcm5hbCBlcnJvciBpbiBydW5jb2RlKCkiCisgICAgICAgICAgICAgICAgc2VsZi5zaG93dHJhY2ViYWNrKCkKKyAgICAgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5lbmRleGVjdXRpbmcoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnRrY29uc29sZS5jYW5jZWxlZDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50a2NvbnNvbGUuY2FuY2VsZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYudGtjb25zb2xlLnN0ZGVyciwgIktleWJvYXJkSW50ZXJydXB0IgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd3RyYWNlYmFjaygpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgdXNlX3N1YnByb2Nlc3M6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5lbmRleGVjdXRpbmcoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjogICMgc2hlbGwgbWF5IGhhdmUgY2xvc2VkCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB3cml0ZShzZWxmLCBzKToKKyAgICAgICAgIk92ZXJyaWRlIGJhc2UgY2xhc3MgbWV0aG9kIgorICAgICAgICBzZWxmLnRrY29uc29sZS5zdGRlcnIud3JpdGUocykKKworICAgIGRlZiBkaXNwbGF5X3BvcnRfYmluZGluZ19lcnJvcihzZWxmKToKKyAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigKKyAgICAgICAgICAgICJQb3J0IEJpbmRpbmcgRXJyb3IiLAorICAgICAgICAgICAgIklETEUgY2FuJ3QgYmluZCB0byBhIFRDUC9JUCBwb3J0LCB3aGljaCBpcyBuZWNlc3NhcnkgdG8gIgorICAgICAgICAgICAgImNvbW11bmljYXRlIHdpdGggaXRzIFB5dGhvbiBleGVjdXRpb24gc2VydmVyLiAgVGhpcyBtaWdodCBiZSAiCisgICAgICAgICAgICAiYmVjYXVzZSBubyBuZXR3b3JraW5nIGlzIGluc3RhbGxlZCBvbiB0aGlzIGNvbXB1dGVyLiAgIgorICAgICAgICAgICAgIlJ1biBJRExFIHdpdGggdGhlIC1uIGNvbW1hbmQgbGluZSBzd2l0Y2ggdG8gc3RhcnQgd2l0aG91dCBhICIKKyAgICAgICAgICAgICJzdWJwcm9jZXNzIGFuZCByZWZlciB0byBIZWxwL0lETEUgSGVscCAnUnVubmluZyB3aXRob3V0IGEgIgorICAgICAgICAgICAgInN1YnByb2Nlc3MnIGZvciBmdXJ0aGVyIGRldGFpbHMuIiwKKyAgICAgICAgICAgIG1hc3Rlcj1zZWxmLnRrY29uc29sZS50ZXh0KQorCisgICAgZGVmIGRpc3BsYXlfbm9fc3VicHJvY2Vzc19lcnJvcihzZWxmKToKKyAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigKKyAgICAgICAgICAgICJTdWJwcm9jZXNzIFN0YXJ0dXAgRXJyb3IiLAorICAgICAgICAgICAgIklETEUncyBzdWJwcm9jZXNzIGRpZG4ndCBtYWtlIGNvbm5lY3Rpb24uICBFaXRoZXIgSURMRSBjYW4ndCAiCisgICAgICAgICAgICAic3RhcnQgYSBzdWJwcm9jZXNzIG9yIHBlcnNvbmFsIGZpcmV3YWxsIHNvZnR3YXJlIGlzIGJsb2NraW5nICIKKyAgICAgICAgICAgICJ0aGUgY29ubmVjdGlvbi4iLAorICAgICAgICAgICAgbWFzdGVyPXNlbGYudGtjb25zb2xlLnRleHQpCisKKyAgICBkZWYgZGlzcGxheV9leGVjdXRpbmdfZGlhbG9nKHNlbGYpOgorICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKAorICAgICAgICAgICAgIkFscmVhZHkgZXhlY3V0aW5nIiwKKyAgICAgICAgICAgICJUaGUgUHl0aG9uIFNoZWxsIHdpbmRvdyBpcyBhbHJlYWR5IGV4ZWN1dGluZyBhIGNvbW1hbmQ7ICIKKyAgICAgICAgICAgICJwbGVhc2Ugd2FpdCB1bnRpbCBpdCBpcyBmaW5pc2hlZC4iLAorICAgICAgICAgICAgbWFzdGVyPXNlbGYudGtjb25zb2xlLnRleHQpCisKKworY2xhc3MgUHlTaGVsbChPdXRwdXRXaW5kb3cpOgorCisgICAgc2hlbGxfdGl0bGUgPSAiUHl0aG9uICIgKyBweXRob25fdmVyc2lvbigpICsgIiBTaGVsbCIKKworICAgICMgT3ZlcnJpZGUgY2xhc3NlcworICAgIENvbG9yRGVsZWdhdG9yID0gTW9kaWZpZWRDb2xvckRlbGVnYXRvcgorICAgIFVuZG9EZWxlZ2F0b3IgPSBNb2RpZmllZFVuZG9EZWxlZ2F0b3IKKworICAgICMgT3ZlcnJpZGUgbWVudXMKKyAgICBtZW51X3NwZWNzID0gWworICAgICAgICAoImZpbGUiLCAiX0ZpbGUiKSwKKyAgICAgICAgKCJlZGl0IiwgIl9FZGl0IiksCisgICAgICAgICgiZGVidWciLCAiX0RlYnVnIiksCisgICAgICAgICgib3B0aW9ucyIsICJfT3B0aW9ucyIpLAorICAgICAgICAoIndpbmRvd3MiLCAiX1dpbmRvd3MiKSwKKyAgICAgICAgKCJoZWxwIiwgIl9IZWxwIiksCisgICAgXQorCisgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgZGVsIG1lbnVfc3BlY3NbLTNdCisgICAgICAgIG1lbnVfc3BlY3NbLTJdID0gKCJ3aW5kb3dzIiwgIl9XaW5kb3ciKQorCisKKyAgICAjIE5ldyBjbGFzc2VzCisgICAgZnJvbSBpZGxlbGliLklkbGVIaXN0b3J5IGltcG9ydCBIaXN0b3J5CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmxpc3Q9Tm9uZSk6CisgICAgICAgIGlmIHVzZV9zdWJwcm9jZXNzOgorICAgICAgICAgICAgbXMgPSBzZWxmLm1lbnVfc3BlY3MKKyAgICAgICAgICAgIGlmIG1zWzJdWzBdICE9ICJzaGVsbCI6CisgICAgICAgICAgICAgICAgbXMuaW5zZXJ0KDIsICgic2hlbGwiLCAiU2hlX2xsIikpCisgICAgICAgIHNlbGYuaW50ZXJwID0gTW9kaWZpZWRJbnRlcnByZXRlcihzZWxmKQorICAgICAgICBpZiBmbGlzdCBpcyBOb25lOgorICAgICAgICAgICAgcm9vdCA9IFRrKCkKKyAgICAgICAgICAgIGZpeHdvcmRicmVha3Mocm9vdCkKKyAgICAgICAgICAgIHJvb3Qud2l0aGRyYXcoKQorICAgICAgICAgICAgZmxpc3QgPSBQeVNoZWxsRmlsZUxpc3Qocm9vdCkKKyAgICAgICAgIworICAgICAgICBPdXRwdXRXaW5kb3cuX19pbml0X18oc2VsZiwgZmxpc3QsIE5vbmUsIE5vbmUpCisgICAgICAgICMKKyMjICAgICAgICBzZWxmLmNvbmZpZyh1c2V0YWJzPTEsIGluZGVudHdpZHRoPTgsIGNvbnRleHRfdXNlX3BzMT0xKQorICAgICAgICBzZWxmLnVzZXRhYnMgPSBUcnVlCisgICAgICAgICMgaW5kZW50d2lkdGggbXVzdCBiZSA4IHdoZW4gdXNpbmcgdGFicy4gIFNlZSBub3RlIGluIEVkaXRvcldpbmRvdzoKKyAgICAgICAgc2VsZi5pbmRlbnR3aWR0aCA9IDgKKyAgICAgICAgc2VsZi5jb250ZXh0X3VzZV9wczEgPSBUcnVlCisgICAgICAgICMKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICB0ZXh0LmNvbmZpZ3VyZSh3cmFwPSJjaGFyIikKKyAgICAgICAgdGV4dC5iaW5kKCI8PG5ld2xpbmUtYW5kLWluZGVudD4+Iiwgc2VsZi5lbnRlcl9jYWxsYmFjaykKKyAgICAgICAgdGV4dC5iaW5kKCI8PHBsYWluLW5ld2xpbmUtYW5kLWluZGVudD4+Iiwgc2VsZi5saW5lZmVlZF9jYWxsYmFjaykKKyAgICAgICAgdGV4dC5iaW5kKCI8PGludGVycnVwdC1leGVjdXRpb24+PiIsIHNlbGYuY2FuY2VsX2NhbGxiYWNrKQorICAgICAgICB0ZXh0LmJpbmQoIjw8ZW5kLW9mLWZpbGU+PiIsIHNlbGYuZW9mX2NhbGxiYWNrKQorICAgICAgICB0ZXh0LmJpbmQoIjw8b3Blbi1zdGFjay12aWV3ZXI+PiIsIHNlbGYub3Blbl9zdGFja192aWV3ZXIpCisgICAgICAgIHRleHQuYmluZCgiPDx0b2dnbGUtZGVidWdnZXI+PiIsIHNlbGYudG9nZ2xlX2RlYnVnZ2VyKQorICAgICAgICB0ZXh0LmJpbmQoIjw8dG9nZ2xlLWppdC1zdGFjay12aWV3ZXI+PiIsIHNlbGYudG9nZ2xlX2ppdF9zdGFja192aWV3ZXIpCisgICAgICAgIGlmIHVzZV9zdWJwcm9jZXNzOgorICAgICAgICAgICAgdGV4dC5iaW5kKCI8PHZpZXctcmVzdGFydD4+Iiwgc2VsZi52aWV3X3Jlc3RhcnRfbWFyaykKKyAgICAgICAgICAgIHRleHQuYmluZCgiPDxyZXN0YXJ0LXNoZWxsPj4iLCBzZWxmLnJlc3RhcnRfc2hlbGwpCisgICAgICAgICMKKyAgICAgICAgc2VsZi5zYXZlX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5zYXZlX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgc2VsZi5zYXZlX3N0ZGluID0gc3lzLnN0ZGluCisgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgSU9CaW5kaW5nCisgICAgICAgIHNlbGYuc3RkaW4gPSBQc2V1ZG9JbnB1dEZpbGUoc2VsZiwgInN0ZGluIiwgSU9CaW5kaW5nLmVuY29kaW5nKQorICAgICAgICBzZWxmLnN0ZG91dCA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgInN0ZG91dCIsIElPQmluZGluZy5lbmNvZGluZykKKyAgICAgICAgc2VsZi5zdGRlcnIgPSBQc2V1ZG9PdXRwdXRGaWxlKHNlbGYsICJzdGRlcnIiLCBJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuY29uc29sZSA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgImNvbnNvbGUiLCBJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgIGlmIG5vdCB1c2Vfc3VicHJvY2VzczoKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLnN0ZG91dAorICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHNlbGYuc3RkZXJyCisgICAgICAgICAgICBzeXMuc3RkaW4gPSBzZWxmLnN0ZGluCisgICAgICAgICMKKyAgICAgICAgc2VsZi5oaXN0b3J5ID0gc2VsZi5IaXN0b3J5KHNlbGYudGV4dCkKKyAgICAgICAgIworICAgICAgICBzZWxmLnBvbGxpbnRlcnZhbCA9IDUwICAjIG1pbGxpc2VjCisKKyAgICBkZWYgZ2V0X3N0YW5kYXJkX2V4dGVuc2lvbl9uYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkbGVDb25mLkdldEV4dGVuc2lvbnMoc2hlbGxfb25seT1UcnVlKQorCisgICAgcmVhZGluZyA9IEZhbHNlCisgICAgZXhlY3V0aW5nID0gRmFsc2UKKyAgICBjYW5jZWxlZCA9IEZhbHNlCisgICAgZW5kb2ZmaWxlID0gRmFsc2UKKyAgICBjbG9zaW5nID0gRmFsc2UKKyAgICBfc3RvcF9yZWFkbGluZV9mbGFnID0gRmFsc2UKKworICAgIGRlZiBzZXRfd2FybmluZ19zdHJlYW0oc2VsZiwgc3RyZWFtKToKKyAgICAgICAgZ2xvYmFsIHdhcm5pbmdfc3RyZWFtCisgICAgICAgIHdhcm5pbmdfc3RyZWFtID0gc3RyZWFtCisKKyAgICBkZWYgZ2V0X3dhcm5pbmdfc3RyZWFtKHNlbGYpOgorICAgICAgICByZXR1cm4gd2FybmluZ19zdHJlYW0KKworICAgIGRlZiB0b2dnbGVfZGVidWdnZXIoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuZXhlY3V0aW5nOgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiRG9uJ3QgZGVidWcgbm93IiwKKyAgICAgICAgICAgICAgICAiWW91IGNhbiBvbmx5IHRvZ2dsZSB0aGUgZGVidWdnZXIgd2hlbiBpZGxlIiwKKyAgICAgICAgICAgICAgICBtYXN0ZXI9c2VsZi50ZXh0KQorICAgICAgICAgICAgc2VsZi5zZXRfZGVidWdnZXJfaW5kaWNhdG9yKCkKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYiA9IHNlbGYuaW50ZXJwLmdldGRlYnVnZ2VyKCkKKyAgICAgICAgICAgIGlmIGRiOgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfZGVidWdnZXIoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLm9wZW5fZGVidWdnZXIoKQorCisgICAgZGVmIHNldF9kZWJ1Z2dlcl9pbmRpY2F0b3Ioc2VsZik6CisgICAgICAgIGRiID0gc2VsZi5pbnRlcnAuZ2V0ZGVidWdnZXIoKQorICAgICAgICBzZWxmLnNldHZhcigiPDx0b2dnbGUtZGVidWdnZXI+PiIsIG5vdCBub3QgZGIpCisKKyAgICBkZWYgdG9nZ2xlX2ppdF9zdGFja192aWV3ZXIoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHBhc3MgIyBBbGwgd2UgbmVlZCBpcyB0aGUgdmFyaWFibGUKKworICAgIGRlZiBjbG9zZV9kZWJ1Z2dlcihzZWxmKToKKyAgICAgICAgZGIgPSBzZWxmLmludGVycC5nZXRkZWJ1Z2dlcigpCisgICAgICAgIGlmIGRiOgorICAgICAgICAgICAgc2VsZi5pbnRlcnAuc2V0ZGVidWdnZXIoTm9uZSkKKyAgICAgICAgICAgIGRiLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHNlbGYuaW50ZXJwLnJwY2NsdDoKKyAgICAgICAgICAgICAgICBSZW1vdGVEZWJ1Z2dlci5jbG9zZV9yZW1vdGVfZGVidWdnZXIoc2VsZi5pbnRlcnAucnBjY2x0KQorICAgICAgICAgICAgc2VsZi5yZXNldG91dHB1dCgpCisgICAgICAgICAgICBzZWxmLmNvbnNvbGUud3JpdGUoIltERUJVRyBPRkZdXG4iKQorICAgICAgICAgICAgc3lzLnBzMSA9ICI+Pj4gIgorICAgICAgICAgICAgc2VsZi5zaG93cHJvbXB0KCkKKyAgICAgICAgc2VsZi5zZXRfZGVidWdnZXJfaW5kaWNhdG9yKCkKKworICAgIGRlZiBvcGVuX2RlYnVnZ2VyKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmludGVycC5ycGNjbHQ6CisgICAgICAgICAgICBkYmdfZ3VpID0gUmVtb3RlRGVidWdnZXIuc3RhcnRfcmVtb3RlX2RlYnVnZ2VyKHNlbGYuaW50ZXJwLnJwY2NsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRiZ19ndWkgPSBEZWJ1Z2dlci5EZWJ1Z2dlcihzZWxmKQorICAgICAgICBzZWxmLmludGVycC5zZXRkZWJ1Z2dlcihkYmdfZ3VpKQorICAgICAgICBkYmdfZ3VpLmxvYWRfYnJlYWtwb2ludHMoKQorICAgICAgICBzeXMucHMxID0gIltERUJVRyBPTl1cbj4+PiAiCisgICAgICAgIHNlbGYuc2hvd3Byb21wdCgpCisgICAgICAgIHNlbGYuc2V0X2RlYnVnZ2VyX2luZGljYXRvcigpCisKKyAgICBkZWYgYmVnaW5leGVjdXRpbmcoc2VsZik6CisgICAgICAgICJIZWxwZXIgZm9yIE1vZGlmaWVkSW50ZXJwcmV0ZXIiCisgICAgICAgIHNlbGYucmVzZXRvdXRwdXQoKQorICAgICAgICBzZWxmLmV4ZWN1dGluZyA9IDEKKworICAgIGRlZiBlbmRleGVjdXRpbmcoc2VsZik6CisgICAgICAgICJIZWxwZXIgZm9yIE1vZGlmaWVkSW50ZXJwcmV0ZXIiCisgICAgICAgIHNlbGYuZXhlY3V0aW5nID0gMAorICAgICAgICBzZWxmLmNhbmNlbGVkID0gMAorICAgICAgICBzZWxmLnNob3dwcm9tcHQoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiRXh0ZW5kIEVkaXRvcldpbmRvdy5jbG9zZSgpIgorICAgICAgICBpZiBzZWxmLmV4ZWN1dGluZzoKKyAgICAgICAgICAgIHJlc3BvbnNlID0gdGtNZXNzYWdlQm94LmFza29rY2FuY2VsKAorICAgICAgICAgICAgICAgICJLaWxsPyIsCisgICAgICAgICAgICAgICAgIlRoZSBwcm9ncmFtIGlzIHN0aWxsIHJ1bm5pbmchXG4gRG8geW91IHdhbnQgdG8ga2lsbCBpdD8iLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9rIiwKKyAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZi50ZXh0KQorICAgICAgICAgICAgaWYgcmVzcG9uc2UgaXMgRmFsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICJjYW5jZWwiCisgICAgICAgIHNlbGYuc3RvcF9yZWFkbGluZSgpCisgICAgICAgIHNlbGYuY2FuY2VsZWQgPSBUcnVlCisgICAgICAgIHNlbGYuY2xvc2luZyA9IFRydWUKKyAgICAgICAgIyBXYWl0IGZvciBwb2xsX3N1YnByb2Nlc3MoKSByZXNjaGVkdWxpbmcgdG8gc3RvcAorICAgICAgICBzZWxmLnRleHQuYWZ0ZXIoMiAqIHNlbGYucG9sbGludGVydmFsLCBzZWxmLmNsb3NlMikKKworICAgIGRlZiBjbG9zZTIoc2VsZik6CisgICAgICAgIHJldHVybiBFZGl0b3JXaW5kb3cuY2xvc2Uoc2VsZikKKworICAgIGRlZiBfY2xvc2Uoc2VsZik6CisgICAgICAgICJFeHRlbmQgRWRpdG9yV2luZG93Ll9jbG9zZSgpLCBzaHV0IGRvd24gZGVidWdnZXIgYW5kIGV4ZWN1dGlvbiBzZXJ2ZXIiCisgICAgICAgIHNlbGYuY2xvc2VfZGVidWdnZXIoKQorICAgICAgICBpZiB1c2Vfc3VicHJvY2VzczoKKyAgICAgICAgICAgIHNlbGYuaW50ZXJwLmtpbGxfc3VicHJvY2VzcygpCisgICAgICAgICMgUmVzdG9yZSBzdGQgc3RyZWFtcworICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5zYXZlX3N0ZG91dAorICAgICAgICBzeXMuc3RkZXJyID0gc2VsZi5zYXZlX3N0ZGVycgorICAgICAgICBzeXMuc3RkaW4gPSBzZWxmLnNhdmVfc3RkaW4KKyAgICAgICAgIyBCcmVhayBjeWNsZXMKKyAgICAgICAgc2VsZi5pbnRlcnAgPSBOb25lCisgICAgICAgIHNlbGYuY29uc29sZSA9IE5vbmUKKyAgICAgICAgc2VsZi5mbGlzdC5weXNoZWxsID0gTm9uZQorICAgICAgICBzZWxmLmhpc3RvcnkgPSBOb25lCisgICAgICAgIEVkaXRvcldpbmRvdy5fY2xvc2Uoc2VsZikKKworICAgIGRlZiBpc3B5dGhvbnNvdXJjZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICJPdmVycmlkZSBFZGl0b3JXaW5kb3cgbWV0aG9kOiBuZXZlciByZW1vdmUgdGhlIGNvbG9yaXplciIKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzaG9ydF90aXRsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2hlbGxfdGl0bGUKKworICAgIENPUFlSSUdIVCA9IFwKKyAgICAgICAgICAnVHlwZSAiY29weXJpZ2h0IiwgImNyZWRpdHMiIG9yICJsaWNlbnNlKCkiIGZvciBtb3JlIGluZm9ybWF0aW9uLicKKworICAgIGRlZiBiZWdpbihzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldG91dHB1dCgpCisgICAgICAgIGlmIHVzZV9zdWJwcm9jZXNzOgorICAgICAgICAgICAgbm9zdWIgPSAnJworICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5pbnRlcnAuc3RhcnRfc3VicHJvY2VzcygpCisgICAgICAgICAgICBpZiBub3QgY2xpZW50OgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbm9zdWIgPSAiPT09PSBObyBTdWJwcm9jZXNzID09PT0iCisgICAgICAgIHNlbGYud3JpdGUoIlB5dGhvbiAlcyBvbiAlc1xuJXNcbiVzIiAlCisgICAgICAgICAgICAgICAgICAgKHN5cy52ZXJzaW9uLCBzeXMucGxhdGZvcm0sIHNlbGYuQ09QWVJJR0hULCBub3N1YikpCisgICAgICAgIHNlbGYuc2hvd3Byb21wdCgpCisgICAgICAgIGltcG9ydCBUa2ludGVyCisgICAgICAgIFRraW50ZXIuX2RlZmF1bHRfcm9vdCA9IE5vbmUgIyAwM0phbjA0IEtCSyBXaGF0J3MgdGhpcz8KKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzdG9wX3JlYWRsaW5lKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5yZWFkaW5nOiAgIyBubyBuZXN0ZWQgbWFpbmxvb3AgdG8gZXhpdC4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9zdG9wX3JlYWRsaW5lX2ZsYWcgPSBUcnVlCisgICAgICAgIHNlbGYudG9wLnF1aXQoKQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICBzYXZlID0gc2VsZi5yZWFkaW5nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucmVhZGluZyA9IDEKKyAgICAgICAgICAgIHNlbGYudG9wLm1haW5sb29wKCkgICMgbmVzdGVkIG1haW5sb29wKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVhZGluZyA9IHNhdmUKKyAgICAgICAgaWYgc2VsZi5fc3RvcF9yZWFkbGluZV9mbGFnOgorICAgICAgICAgICAgc2VsZi5fc3RvcF9yZWFkbGluZV9mbGFnID0gRmFsc2UKKyAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICBsaW5lID0gc2VsZi50ZXh0LmdldCgiaW9tYXJrIiwgImVuZC0xYyIpCisgICAgICAgIGlmIGxlbihsaW5lKSA9PSAwOiAgIyBtYXkgYmUgRU9GIGlmIHdlIHF1aXQgb3VyIG1haW5sb29wIHdpdGggQ3RybC1DCisgICAgICAgICAgICBsaW5lID0gIlxuIgorICAgICAgICBpZiBpc2luc3RhbmNlKGxpbmUsIHVuaWNvZGUpOgorICAgICAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBJT0JpbmRpbmcKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5lbmNvZGUoSU9CaW5kaW5nLmVuY29kaW5nKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYucmVzZXRvdXRwdXQoKQorICAgICAgICBpZiBzZWxmLmNhbmNlbGVkOgorICAgICAgICAgICAgc2VsZi5jYW5jZWxlZCA9IDAKKyAgICAgICAgICAgIGlmIG5vdCB1c2Vfc3VicHJvY2VzczoKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAorICAgICAgICBpZiBzZWxmLmVuZG9mZmlsZToKKyAgICAgICAgICAgIHNlbGYuZW5kb2ZmaWxlID0gMAorICAgICAgICAgICAgbGluZSA9ICIiCisgICAgICAgIHJldHVybiBsaW5lCisKKyAgICBkZWYgaXNhdHR5KHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGNhbmNlbF9jYWxsYmFjayhzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi50ZXh0LmNvbXBhcmUoInNlbC5maXJzdCIsICIhPSIsICJzZWwubGFzdCIpOgorICAgICAgICAgICAgICAgIHJldHVybiAjIEFjdGl2ZSBzZWxlY3Rpb24gLS0gYWx3YXlzIHVzZSBkZWZhdWx0IGJpbmRpbmcKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBpZiBub3QgKHNlbGYuZXhlY3V0aW5nIG9yIHNlbGYucmVhZGluZyk6CisgICAgICAgICAgICBzZWxmLnJlc2V0b3V0cHV0KCkKKyAgICAgICAgICAgIHNlbGYuaW50ZXJwLndyaXRlKCJLZXlib2FyZEludGVycnVwdFxuIikKKyAgICAgICAgICAgIHNlbGYuc2hvd3Byb21wdCgpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICBzZWxmLmVuZG9mZmlsZSA9IDAKKyAgICAgICAgc2VsZi5jYW5jZWxlZCA9IDEKKyAgICAgICAgaWYgKHNlbGYuZXhlY3V0aW5nIGFuZCBzZWxmLmludGVycC5ycGNjbHQpOgorICAgICAgICAgICAgaWYgc2VsZi5pbnRlcnAuZ2V0ZGVidWdnZXIoKToKKyAgICAgICAgICAgICAgICBzZWxmLmludGVycC5yZXN0YXJ0X3N1YnByb2Nlc3MoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmludGVycC5pbnRlcnJ1cHRfc3VicHJvY2VzcygpCisgICAgICAgIGlmIHNlbGYucmVhZGluZzoKKyAgICAgICAgICAgIHNlbGYudG9wLnF1aXQoKSAgIyBleGl0IHRoZSBuZXN0ZWQgbWFpbmxvb3AoKSBpbiByZWFkbGluZSgpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgZW9mX2NhbGxiYWNrKHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgc2VsZi5leGVjdXRpbmcgYW5kIG5vdCBzZWxmLnJlYWRpbmc6CisgICAgICAgICAgICByZXR1cm4gIyBMZXQgdGhlIGRlZmF1bHQgYmluZGluZyAoZGVsZXRlIG5leHQgY2hhcikgdGFrZSBvdmVyCisgICAgICAgIGlmIG5vdCAoc2VsZi50ZXh0LmNvbXBhcmUoImlvbWFyayIsICI9PSIsICJpbnNlcnQiKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnRleHQuY29tcGFyZSgiaW5zZXJ0IiwgIj09IiwgImVuZC0xYyIpKToKKyAgICAgICAgICAgIHJldHVybiAjIExldCB0aGUgZGVmYXVsdCBiaW5kaW5nIChkZWxldGUgbmV4dCBjaGFyKSB0YWtlIG92ZXIKKyAgICAgICAgaWYgbm90IHNlbGYuZXhlY3V0aW5nOgorICAgICAgICAgICAgc2VsZi5yZXNldG91dHB1dCgpCisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2FuY2VsZWQgPSAwCisgICAgICAgICAgICBzZWxmLmVuZG9mZmlsZSA9IDEKKyAgICAgICAgICAgIHNlbGYudG9wLnF1aXQoKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGxpbmVmZWVkX2NhbGxiYWNrKHNlbGYsIGV2ZW50KToKKyAgICAgICAgIyBJbnNlcnQgYSBsaW5lZmVlZCB3aXRob3V0IGVudGVyaW5nIGFueXRoaW5nIChzdGlsbCBhdXRvaW5kZW50ZWQpCisgICAgICAgIGlmIHNlbGYucmVhZGluZzoKKyAgICAgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoImluc2VydCIsICJcbiIpCisgICAgICAgICAgICBzZWxmLnRleHQuc2VlKCJpbnNlcnQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5uZXdsaW5lX2FuZF9pbmRlbnRfZXZlbnQoZXZlbnQpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgZW50ZXJfY2FsbGJhY2soc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBzZWxmLmV4ZWN1dGluZyBhbmQgbm90IHNlbGYucmVhZGluZzoKKyAgICAgICAgICAgIHJldHVybiAjIExldCB0aGUgZGVmYXVsdCBiaW5kaW5nIChpbnNlcnQgJ1xuJykgdGFrZSBvdmVyCisgICAgICAgICMgSWYgc29tZSB0ZXh0IGlzIHNlbGVjdGVkLCByZWNhbGwgdGhlIHNlbGVjdGlvbgorICAgICAgICAjIChidXQgb25seSBpZiB0aGlzIGJlZm9yZSB0aGUgSS9PIG1hcmspCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbCA9IHNlbGYudGV4dC5nZXQoInNlbC5maXJzdCIsICJzZWwubGFzdCIpCisgICAgICAgICAgICBpZiBzZWw6CisgICAgICAgICAgICAgICAgaWYgc2VsZi50ZXh0LmNvbXBhcmUoInNlbC5sYXN0IiwgIjw9IiwgImlvbWFyayIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY2FsbChzZWwsIGV2ZW50KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgSWYgd2UncmUgc3RyaWN0bHkgYmVmb3JlIHRoZSBsaW5lIGNvbnRhaW5pbmcgaW9tYXJrLCByZWNhbGwKKyAgICAgICAgIyB0aGUgY3VycmVudCBsaW5lLCBsZXNzIGEgbGVhZGluZyBwcm9tcHQsIGxlc3MgbGVhZGluZyBvcgorICAgICAgICAjIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgaWYgc2VsZi50ZXh0LmNvbXBhcmUoImluc2VydCIsICI8IiwgImlvbWFyayBsaW5lc3RhcnQiKToKKyAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlcmUncyBhIHJlbGV2YW50IHN0ZGluIHJhbmdlIC0tIGlmIHNvLCB1c2UgaXQKKyAgICAgICAgICAgIHByZXYgPSBzZWxmLnRleHQudGFnX3ByZXZyYW5nZSgic3RkaW4iLCAiaW5zZXJ0IikKKyAgICAgICAgICAgIGlmIHByZXYgYW5kIHNlbGYudGV4dC5jb21wYXJlKCJpbnNlcnQiLCAiPCIsIHByZXZbMV0pOgorICAgICAgICAgICAgICAgIHNlbGYucmVjYWxsKHNlbGYudGV4dC5nZXQocHJldlswXSwgcHJldlsxXSksIGV2ZW50KQorICAgICAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgICAgICBuZXh0ID0gc2VsZi50ZXh0LnRhZ19uZXh0cmFuZ2UoInN0ZGluIiwgImluc2VydCIpCisgICAgICAgICAgICBpZiBuZXh0IGFuZCBzZWxmLnRleHQuY29tcGFyZSgiaW5zZXJ0IGxpbmVlbmQiLCAiPj0iLCBuZXh0WzBdKToKKyAgICAgICAgICAgICAgICBzZWxmLnJlY2FsbChzZWxmLnRleHQuZ2V0KG5leHRbMF0sIG5leHRbMV0pLCBldmVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICAgICAgIyBObyBzdGRpbiBtYXJrIC0tIGp1c3QgZ2V0IHRoZSBjdXJyZW50IGxpbmUsIGxlc3MgYW55IHByb21wdAorICAgICAgICAgICAgaW5kaWNlcyA9IHNlbGYudGV4dC50YWdfbmV4dHJhbmdlKCJjb25zb2xlIiwgImluc2VydCBsaW5lc3RhcnQiKQorICAgICAgICAgICAgaWYgaW5kaWNlcyBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi50ZXh0LmNvbXBhcmUoaW5kaWNlc1swXSwgIjw9IiwgImluc2VydCBsaW5lc3RhcnQiKToKKyAgICAgICAgICAgICAgICBzZWxmLnJlY2FsbChzZWxmLnRleHQuZ2V0KGluZGljZXNbMV0sICJpbnNlcnQgbGluZWVuZCIpLCBldmVudCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5yZWNhbGwoc2VsZi50ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQgbGluZWVuZCIpLCBldmVudCkKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgICMgSWYgd2UncmUgYmV0d2VlbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGFuZCB0aGUgaW9tYXJrLCBpLmUuCisgICAgICAgICMgaW4gdGhlIHByb21wdCBhcmVhLCBtb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIHByb21wdAorICAgICAgICBpZiBzZWxmLnRleHQuY29tcGFyZSgiaW5zZXJ0IiwgIjwiLCAiaW9tYXJrIik6CisgICAgICAgICAgICBzZWxmLnRleHQubWFya19zZXQoImluc2VydCIsICJpb21hcmsiKQorICAgICAgICAjIElmIHdlJ3JlIGluIHRoZSBjdXJyZW50IGlucHV0IGFuZCB0aGVyZSdzIG9ubHkgd2hpdGVzcGFjZQorICAgICAgICAjIGJleW9uZCB0aGUgY3Vyc29yLCBlcmFzZSB0aGF0IHdoaXRlc3BhY2UgZmlyc3QKKyAgICAgICAgcyA9IHNlbGYudGV4dC5nZXQoImluc2VydCIsICJlbmQtMWMiKQorICAgICAgICBpZiBzIGFuZCBub3Qgcy5zdHJpcCgpOgorICAgICAgICAgICAgc2VsZi50ZXh0LmRlbGV0ZSgiaW5zZXJ0IiwgImVuZC0xYyIpCisgICAgICAgICMgSWYgd2UncmUgaW4gdGhlIGN1cnJlbnQgaW5wdXQgYmVmb3JlIGl0cyBsYXN0IGxpbmUsCisgICAgICAgICMgaW5zZXJ0IGEgbmV3bGluZSByaWdodCBhdCB0aGUgaW5zZXJ0IHBvaW50CisgICAgICAgIGlmIHNlbGYudGV4dC5jb21wYXJlKCJpbnNlcnQiLCAiPCIsICJlbmQtMWMgbGluZXN0YXJ0Iik6CisgICAgICAgICAgICBzZWxmLm5ld2xpbmVfYW5kX2luZGVudF9ldmVudChldmVudCkKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgICMgV2UncmUgaW4gdGhlIGxhc3QgbGluZTsgYXBwZW5kIGEgbmV3bGluZSBhbmQgc3VibWl0IGl0CisgICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgImVuZC0xYyIpCisgICAgICAgIGlmIHNlbGYucmVhZGluZzoKKyAgICAgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoImluc2VydCIsICJcbiIpCisgICAgICAgICAgICBzZWxmLnRleHQuc2VlKCJpbnNlcnQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5uZXdsaW5lX2FuZF9pbmRlbnRfZXZlbnQoZXZlbnQpCisgICAgICAgIHNlbGYudGV4dC50YWdfYWRkKCJzdGRpbiIsICJpb21hcmsiLCAiZW5kLTFjIikKKyAgICAgICAgc2VsZi50ZXh0LnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICBpZiBzZWxmLnJlYWRpbmc6CisgICAgICAgICAgICBzZWxmLnRvcC5xdWl0KCkgIyBCcmVhayBvdXQgb2YgcmVjdXJzaXZlIG1haW5sb29wKCkgaW4gcmF3X2lucHV0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucnVuaXQoKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIHJlY2FsbChzZWxmLCBzLCBldmVudCk6CisgICAgICAgICMgcmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGVtcHR5IG9yIHdoaXRlc3BhY2UgbGluZXMKKyAgICAgICAgcyA9IHJlLnN1YihyJ15ccypcbicsICcnICwgcykKKyAgICAgICAgcyA9IHJlLnN1YihyJ1xuXHMqJCcsICcnLCBzKQorICAgICAgICBsaW5lcyA9IHMuc3BsaXQoJ1xuJykKKyAgICAgICAgc2VsZi50ZXh0LnVuZG9fYmxvY2tfc3RhcnQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRleHQudGFnX3JlbW92ZSgic2VsIiwgIjEuMCIsICJlbmQiKQorICAgICAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCAiZW5kLTFjIikKKyAgICAgICAgICAgIHByZWZpeCA9IHNlbGYudGV4dC5nZXQoImluc2VydCBsaW5lc3RhcnQiLCAiaW5zZXJ0IikKKyAgICAgICAgICAgIGlmIHByZWZpeC5yc3RyaXAoKS5lbmRzd2l0aCgnOicpOgorICAgICAgICAgICAgICAgIHNlbGYubmV3bGluZV9hbmRfaW5kZW50X2V2ZW50KGV2ZW50KQorICAgICAgICAgICAgICAgIHByZWZpeCA9IHNlbGYudGV4dC5nZXQoImluc2VydCBsaW5lc3RhcnQiLCAiaW5zZXJ0IikKKyAgICAgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoImluc2VydCIsIGxpbmVzWzBdLnN0cmlwKCkpCisgICAgICAgICAgICBpZiBsZW4obGluZXMpID4gMToKKyAgICAgICAgICAgICAgICBvcmlnX2Jhc2VfaW5kZW50ID0gcmUuc2VhcmNoKHInXihbIFx0XSopJywgbGluZXNbMF0pLmdyb3VwKDApCisgICAgICAgICAgICAgICAgbmV3X2Jhc2VfaW5kZW50ICA9IHJlLnNlYXJjaChyJ14oWyBcdF0qKScsIHByZWZpeCkuZ3JvdXAoMCkKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lc1sxOl06CisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aChvcmlnX2Jhc2VfaW5kZW50KToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgcmVwbGFjZSBvcmlnIGJhc2UgaW5kZW50YXRpb24gd2l0aCBuZXcgaW5kZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBuZXdfYmFzZV9pbmRlbnQgKyBsaW5lW2xlbihvcmlnX2Jhc2VfaW5kZW50KTpdCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoJ2luc2VydCcsICdcbicrbGluZS5yc3RyaXAoKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYudGV4dC5zZWUoImluc2VydCIpCisgICAgICAgICAgICBzZWxmLnRleHQudW5kb19ibG9ja19zdG9wKCkKKworICAgIGRlZiBydW5pdChzZWxmKToKKyAgICAgICAgbGluZSA9IHNlbGYudGV4dC5nZXQoImlvbWFyayIsICJlbmQtMWMiKQorICAgICAgICAjIFN0cmlwIG9mZiBsYXN0IG5ld2xpbmUgYW5kIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UuCisgICAgICAgICMgKFRvIGFsbG93IHlvdSB0byBoaXQgcmV0dXJuIHR3aWNlIHRvIGVuZCBhIHN0YXRlbWVudC4pCisgICAgICAgIGkgPSBsZW4obGluZSkKKyAgICAgICAgd2hpbGUgaSA+IDAgYW5kIGxpbmVbaS0xXSBpbiAiIFx0IjoKKyAgICAgICAgICAgIGkgPSBpLTEKKyAgICAgICAgaWYgaSA+IDAgYW5kIGxpbmVbaS0xXSA9PSAiXG4iOgorICAgICAgICAgICAgaSA9IGktMQorICAgICAgICB3aGlsZSBpID4gMCBhbmQgbGluZVtpLTFdIGluICIgXHQiOgorICAgICAgICAgICAgaSA9IGktMQorICAgICAgICBsaW5lID0gbGluZVs6aV0KKyAgICAgICAgbW9yZSA9IHNlbGYuaW50ZXJwLnJ1bnNvdXJjZShsaW5lKQorCisgICAgZGVmIG9wZW5fc3RhY2tfdmlld2VyKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLmludGVycC5ycGNjbHQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnRlcnAucmVtb3RlX3N0YWNrX3ZpZXdlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5sYXN0X3RyYWNlYmFjaworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJObyBzdGFjayB0cmFjZSIsCisgICAgICAgICAgICAgICAgIlRoZXJlIGlzIG5vIHN0YWNrIHRyYWNlIHlldC5cbiIKKyAgICAgICAgICAgICAgICAiKHN5cy5sYXN0X3RyYWNlYmFjayBpcyBub3QgZGVmaW5lZCkiLAorICAgICAgICAgICAgICAgIG1hc3Rlcj1zZWxmLnRleHQpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZnJvbSBpZGxlbGliLlN0YWNrVmlld2VyIGltcG9ydCBTdGFja0Jyb3dzZXIKKyAgICAgICAgc3YgPSBTdGFja0Jyb3dzZXIoc2VsZi5yb290LCBzZWxmLmZsaXN0KQorCisgICAgZGVmIHZpZXdfcmVzdGFydF9tYXJrKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLnRleHQuc2VlKCJpb21hcmsiKQorICAgICAgICBzZWxmLnRleHQuc2VlKCJyZXN0YXJ0IikKKworICAgIGRlZiByZXN0YXJ0X3NoZWxsKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICAiQ2FsbGJhY2sgZm9yIFJ1bi9SZXN0YXJ0IFNoZWxsIENudGwtRjYiCisgICAgICAgIHNlbGYuaW50ZXJwLnJlc3RhcnRfc3VicHJvY2Vzcyh3aXRoX2N3ZD1UcnVlKQorCisgICAgZGVmIHNob3dwcm9tcHQoc2VsZik6CisgICAgICAgIHNlbGYucmVzZXRvdXRwdXQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gc3RyKHN5cy5wczEpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHMgPSAiIgorICAgICAgICBzZWxmLmNvbnNvbGUud3JpdGUocykKKyAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCAiZW5kLTFjIikKKyAgICAgICAgc2VsZi5zZXRfbGluZV9hbmRfY29sdW1uKCkKKyAgICAgICAgc2VsZi5pby5yZXNldF91bmRvKCkKKworICAgIGRlZiByZXNldG91dHB1dChzZWxmKToKKyAgICAgICAgc291cmNlID0gc2VsZi50ZXh0LmdldCgiaW9tYXJrIiwgImVuZC0xYyIpCisgICAgICAgIGlmIHNlbGYuaGlzdG9yeToKKyAgICAgICAgICAgIHNlbGYuaGlzdG9yeS5oaXN0b3J5X3N0b3JlKHNvdXJjZSkKKyAgICAgICAgaWYgc2VsZi50ZXh0LmdldCgiZW5kLTJjIikgIT0gIlxuIjoKKyAgICAgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoImVuZC0xYyIsICJcbiIpCisgICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgiaW9tYXJrIiwgImVuZC0xYyIpCisgICAgICAgIHNlbGYuc2V0X2xpbmVfYW5kX2NvbHVtbigpCisgICAgICAgIHN5cy5zdGRvdXQuc29mdHNwYWNlID0gMAorCisgICAgZGVmIHdyaXRlKHNlbGYsIHMsIHRhZ3M9KCkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRleHQubWFya19ncmF2aXR5KCJpb21hcmsiLCAicmlnaHQiKQorICAgICAgICAgICAgT3V0cHV0V2luZG93LndyaXRlKHNlbGYsIHMsIHRhZ3MsICJpb21hcmsiKQorICAgICAgICAgICAgc2VsZi50ZXh0Lm1hcmtfZ3Jhdml0eSgiaW9tYXJrIiwgImxlZnQiKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIHNlbGYuY2FuY2VsZWQ6CisgICAgICAgICAgICBzZWxmLmNhbmNlbGVkID0gMAorICAgICAgICAgICAgaWYgbm90IHVzZV9zdWJwcm9jZXNzOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisKKyAgICBkZWYgcm1lbnVfY2hlY2tfY3V0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLnRleHQuY29tcGFyZSgnc2VsLmZpcnN0JywgJzwnLCAnaW9tYXJrJyk6CisgICAgICAgICAgICAgICAgcmV0dXJuICdkaXNhYmxlZCcKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOiAjIG5vIHNlbGVjdGlvbiwgc28gdGhlIGluZGV4ICdzZWwuZmlyc3QnIGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgICAgIHJldHVybiAnZGlzYWJsZWQnCisgICAgICAgIHJldHVybiBzdXBlcihQeVNoZWxsLCBzZWxmKS5ybWVudV9jaGVja19jdXQoKQorCisgICAgZGVmIHJtZW51X2NoZWNrX3Bhc3RlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnRleHQuY29tcGFyZSgnaW5zZXJ0JywgJzwnLCAnaW9tYXJrJyk6CisgICAgICAgICAgICByZXR1cm4gJ2Rpc2FibGVkJworICAgICAgICByZXR1cm4gc3VwZXIoUHlTaGVsbCwgc2VsZikucm1lbnVfY2hlY2tfcGFzdGUoKQorCitjbGFzcyBQc2V1ZG9GaWxlKGlvLlRleHRJT0Jhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNoZWxsLCB0YWdzLCBlbmNvZGluZz1Ob25lKToKKyAgICAgICAgc2VsZi5zaGVsbCA9IHNoZWxsCisgICAgICAgIHNlbGYudGFncyA9IHRhZ3MKKyAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSAwCisgICAgICAgIHNlbGYuX2VuY29kaW5nID0gZW5jb2RpbmcKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBlbmNvZGluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2VuY29kaW5nCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuICc8JXM+JyAlIHNlbGYudGFncworCisgICAgZGVmIGlzYXR0eShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitjbGFzcyBQc2V1ZG9PdXRwdXRGaWxlKFBzZXVkb0ZpbGUpOgorCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIndyaXRlIHRvIGNsb3NlZCBmaWxlIikKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocywgKGJhc2VzdHJpbmcsIGJ5dGVhcnJheSkpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIHN0cmluZywgbm90ICcgKyB0eXBlKHMpLl9fbmFtZV9fKQorICAgICAgICByZXR1cm4gc2VsZi5zaGVsbC53cml0ZShzLCBzZWxmLnRhZ3MpCisKKworY2xhc3MgUHNldWRvSW5wdXRGaWxlKFBzZXVkb0ZpbGUpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNoZWxsLCB0YWdzLCBlbmNvZGluZz1Ob25lKToKKyAgICAgICAgUHNldWRvRmlsZS5fX2luaXRfXyhzZWxmLCBzaGVsbCwgdGFncywgZW5jb2RpbmcpCisgICAgICAgIHNlbGYuX2xpbmVfYnVmZmVyID0gJycKKworICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemU9LTEpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInJlYWQgZnJvbSBjbG9zZWQgZmlsZSIpCisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHNpemUgPSAtMQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHNpemUsIGludCk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ211c3QgYmUgaW50LCBub3QgJyArIHR5cGUoc2l6ZSkuX19uYW1lX18pCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX2xpbmVfYnVmZmVyCisgICAgICAgIHNlbGYuX2xpbmVfYnVmZmVyID0gJycKKyAgICAgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLnNoZWxsLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2hpbGUgbGVuKHJlc3VsdCkgPCBzaXplOgorICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLnNoZWxsLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gbGluZQorICAgICAgICAgICAgc2VsZi5fbGluZV9idWZmZXIgPSByZXN1bHRbc2l6ZTpdCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHRbOnNpemVdCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPS0xKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZWFkIGZyb20gY2xvc2VkIGZpbGUiKQorICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBzaXplID0gLTEKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzaXplLCBpbnQpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdtdXN0IGJlIGludCwgbm90ICcgKyB0eXBlKHNpemUpLl9fbmFtZV9fKQorICAgICAgICBsaW5lID0gc2VsZi5fbGluZV9idWZmZXIgb3Igc2VsZi5zaGVsbC5yZWFkbGluZSgpCisgICAgICAgIGlmIHNpemUgPCAwOgorICAgICAgICAgICAgc2l6ZSA9IGxlbihsaW5lKQorICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9IGxpbmVbc2l6ZTpdCisgICAgICAgIHJldHVybiBsaW5lWzpzaXplXQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLnNoZWxsLmNsb3NlKCkKKworCit1c2FnZV9tc2cgPSAiIiJcCisKK1VTQUdFOiBpZGxlICBbLWRlaW5zXSBbLXQgdGl0bGVdIFtmaWxlXSoKKyAgICAgICBpZGxlICBbLWRuc10gWy10IHRpdGxlXSAoLWMgY21kIHwgLXIgZmlsZSkgW2FyZ10qCisgICAgICAgaWRsZSAgWy1kbnNdIFstdCB0aXRsZV0gLSBbYXJnXSoKKworICAtaCAgICAgICAgIHByaW50IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgIC1uICAgICAgICAgcnVuIElETEUgd2l0aG91dCBhIHN1YnByb2Nlc3MgKHNlZSBIZWxwL0lETEUgSGVscCBmb3IgZGV0YWlscykKKworVGhlIGZvbGxvd2luZyBvcHRpb25zIHdpbGwgb3ZlcnJpZGUgdGhlIElETEUgJ3NldHRpbmdzJyBjb25maWd1cmF0aW9uOgorCisgIC1lICAgICAgICAgb3BlbiBhbiBlZGl0IHdpbmRvdworICAtaSAgICAgICAgIG9wZW4gYSBzaGVsbCB3aW5kb3cKKworVGhlIGZvbGxvd2luZyBvcHRpb25zIGltcGx5IC1pIGFuZCB3aWxsIG9wZW4gYSBzaGVsbDoKKworICAtYyBjbWQgICAgIHJ1biB0aGUgY29tbWFuZCBpbiBhIHNoZWxsLCBvcgorICAtciBmaWxlICAgIHJ1biBzY3JpcHQgZnJvbSBmaWxlCisKKyAgLWQgICAgICAgICBlbmFibGUgdGhlIGRlYnVnZ2VyCisgIC1zICAgICAgICAgcnVuICRJRExFU1RBUlRVUCBvciAkUFlUSE9OU1RBUlRVUCBiZWZvcmUgYW55dGhpbmcgZWxzZQorICAtdCB0aXRsZSAgIHNldCB0aXRsZSBvZiBzaGVsbCB3aW5kb3cKKworQSBkZWZhdWx0IGVkaXQgd2luZG93IHdpbGwgYmUgYnlwYXNzZWQgd2hlbiAtYywgLXIsIG9yIC0gYXJlIHVzZWQuCisKK1thcmddKiBhcmUgcGFzc2VkIHRvIHRoZSBjb21tYW5kICgtYykgb3Igc2NyaXB0ICgtcikgaW4gc3lzLmFyZ3ZbMTpdLgorCitFeGFtcGxlczoKKworaWRsZQorICAgICAgICBPcGVuIGFuIGVkaXQgd2luZG93IG9yIHNoZWxsIGRlcGVuZGluZyBvbiBJRExFJ3MgY29uZmlndXJhdGlvbi4KKworaWRsZSBmb28ucHkgZm9vYmFyLnB5CisgICAgICAgIEVkaXQgdGhlIGZpbGVzLCBhbHNvIG9wZW4gYSBzaGVsbCBpZiBjb25maWd1cmVkIHRvIHN0YXJ0IHdpdGggc2hlbGwuCisKK2lkbGUgLWVzdCAiQmF6IiBmb28ucHkKKyAgICAgICAgUnVuICRJRExFU1RBUlRVUCBvciAkUFlUSE9OU1RBUlRVUCwgZWRpdCBmb28ucHksIGFuZCBvcGVuIGEgc2hlbGwKKyAgICAgICAgd2luZG93IHdpdGggdGhlIHRpdGxlICJCYXoiLgorCitpZGxlIC1jICJpbXBvcnQgc3lzOyBwcmludCBzeXMuYXJndiIgImZvbyIKKyAgICAgICAgT3BlbiBhIHNoZWxsIHdpbmRvdyBhbmQgcnVuIHRoZSBjb21tYW5kLCBwYXNzaW5nICItYyIgaW4gc3lzLmFyZ3ZbMF0KKyAgICAgICAgYW5kICJmb28iIGluIHN5cy5hcmd2WzFdLgorCitpZGxlIC1kIC1zIC1yIGZvby5weSAiSGVsbG8gV29ybGQiCisgICAgICAgIE9wZW4gYSBzaGVsbCB3aW5kb3csIHJ1biBhIHN0YXJ0dXAgc2NyaXB0LCBlbmFibGUgdGhlIGRlYnVnZ2VyLCBhbmQKKyAgICAgICAgcnVuIGZvby5weSwgcGFzc2luZyAiZm9vLnB5IiBpbiBzeXMuYXJndlswXSBhbmQgIkhlbGxvIFdvcmxkIiBpbgorICAgICAgICBzeXMuYXJndlsxXS4KKworZWNobyAiaW1wb3J0IHN5czsgcHJpbnQgc3lzLmFyZ3YiIHwgaWRsZSAtICJmb29iYXIiCisgICAgICAgIE9wZW4gYSBzaGVsbCB3aW5kb3csIHJ1biB0aGUgc2NyaXB0IHBpcGVkIGluLCBwYXNzaW5nICcnIGluIHN5cy5hcmd2WzBdCisgICAgICAgIGFuZCAiZm9vYmFyIiBpbiBzeXMuYXJndlsxXS4KKyIiIgorCitkZWYgbWFpbigpOgorICAgIGdsb2JhbCBmbGlzdCwgcm9vdCwgdXNlX3N1YnByb2Nlc3MKKworICAgIHVzZV9zdWJwcm9jZXNzID0gVHJ1ZQorICAgIGVuYWJsZV9zaGVsbCA9IEZhbHNlCisgICAgZW5hYmxlX2VkaXQgPSBGYWxzZQorICAgIGRlYnVnID0gRmFsc2UKKyAgICBjbWQgPSBOb25lCisgICAgc2NyaXB0ID0gTm9uZQorICAgIHN0YXJ0dXAgPSBGYWxzZQorICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiYzpkZWlobnI6c3Q6IikKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkVycm9yOiAlc1xuIiAlIHN0cihtc2cpKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHVzYWdlX21zZykKKyAgICAgICAgc3lzLmV4aXQoMikKKyAgICBmb3IgbywgYSBpbiBvcHRzOgorICAgICAgICBpZiBvID09ICctYyc6CisgICAgICAgICAgICBjbWQgPSBhCisgICAgICAgICAgICBlbmFibGVfc2hlbGwgPSBUcnVlCisgICAgICAgIGlmIG8gPT0gJy1kJzoKKyAgICAgICAgICAgIGRlYnVnID0gVHJ1ZQorICAgICAgICAgICAgZW5hYmxlX3NoZWxsID0gVHJ1ZQorICAgICAgICBpZiBvID09ICctZSc6CisgICAgICAgICAgICBlbmFibGVfZWRpdCA9IFRydWUKKyAgICAgICAgaWYgbyA9PSAnLWgnOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSh1c2FnZV9tc2cpCisgICAgICAgICAgICBzeXMuZXhpdCgpCisgICAgICAgIGlmIG8gPT0gJy1pJzoKKyAgICAgICAgICAgIGVuYWJsZV9zaGVsbCA9IFRydWUKKyAgICAgICAgaWYgbyA9PSAnLW4nOgorICAgICAgICAgICAgdXNlX3N1YnByb2Nlc3MgPSBGYWxzZQorICAgICAgICBpZiBvID09ICctcic6CisgICAgICAgICAgICBzY3JpcHQgPSBhCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzY3JpcHQpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIk5vIHNjcmlwdCBmaWxlOiAiLCBzY3JpcHQKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgpCisgICAgICAgICAgICBlbmFibGVfc2hlbGwgPSBUcnVlCisgICAgICAgIGlmIG8gPT0gJy1zJzoKKyAgICAgICAgICAgIHN0YXJ0dXAgPSBUcnVlCisgICAgICAgICAgICBlbmFibGVfc2hlbGwgPSBUcnVlCisgICAgICAgIGlmIG8gPT0gJy10JzoKKyAgICAgICAgICAgIFB5U2hlbGwuc2hlbGxfdGl0bGUgPSBhCisgICAgICAgICAgICBlbmFibGVfc2hlbGwgPSBUcnVlCisgICAgaWYgYXJncyBhbmQgYXJnc1swXSA9PSAnLSc6CisgICAgICAgIGNtZCA9IHN5cy5zdGRpbi5yZWFkKCkKKyAgICAgICAgZW5hYmxlX3NoZWxsID0gVHJ1ZQorICAgICMgcHJvY2VzcyBzeXMuYXJndiBhbmQgc3lzLnBhdGg6CisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHN5cy5wYXRoKSk6CisgICAgICAgIHN5cy5wYXRoW2ldID0gb3MucGF0aC5hYnNwYXRoKHN5cy5wYXRoW2ldKQorICAgIGlmIGFyZ3MgYW5kIGFyZ3NbMF0gPT0gJy0nOgorICAgICAgICBzeXMuYXJndiA9IFsnJ10gKyBhcmdzWzE6XQorICAgIGVsaWYgY21kOgorICAgICAgICBzeXMuYXJndiA9IFsnLWMnXSArIGFyZ3MKKyAgICBlbGlmIHNjcmlwdDoKKyAgICAgICAgc3lzLmFyZ3YgPSBbc2NyaXB0XSArIGFyZ3MKKyAgICBlbGlmIGFyZ3M6CisgICAgICAgIGVuYWJsZV9lZGl0ID0gVHJ1ZQorICAgICAgICBwYXRoeCA9IFtdCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBhcmdzOgorICAgICAgICAgICAgcGF0aHguYXBwZW5kKG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSkpCisgICAgICAgIGZvciBkaXIgaW4gcGF0aHg6CisgICAgICAgICAgICBkaXIgPSBvcy5wYXRoLmFic3BhdGgoZGlyKQorICAgICAgICAgICAgaWYgZGlyIG5vdCBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgZGlyKQorICAgIGVsc2U6CisgICAgICAgIGRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIGlmIG5vdCBkaXIgaW4gc3lzLnBhdGg6CisgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgZGlyKQorICAgICMgY2hlY2sgdGhlIElETEUgc2V0dGluZ3MgY29uZmlndXJhdGlvbiAoYnV0IGNvbW1hbmQgbGluZSBvdmVycmlkZXMpCisgICAgZWRpdF9zdGFydCA9IGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdHZW5lcmFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlZGl0b3Itb24tc3RhcnR1cCcsIHR5cGU9J2Jvb2wnKQorICAgIGVuYWJsZV9lZGl0ID0gZW5hYmxlX2VkaXQgb3IgZWRpdF9zdGFydAorICAgIGVuYWJsZV9zaGVsbCA9IGVuYWJsZV9zaGVsbCBvciBub3QgZW5hYmxlX2VkaXQKKyAgICAjIHN0YXJ0IGVkaXRvciBhbmQvb3Igc2hlbGwgd2luZG93czoKKyAgICByb290ID0gVGsoY2xhc3NOYW1lPSJJZGxlIikKKworICAgIGZpeHdvcmRicmVha3Mocm9vdCkKKyAgICByb290LndpdGhkcmF3KCkKKyAgICBmbGlzdCA9IFB5U2hlbGxGaWxlTGlzdChyb290KQorICAgIG1hY29zeFN1cHBvcnQuc2V0dXBBcHAocm9vdCwgZmxpc3QpCisKKyAgICBpZiBlbmFibGVfZWRpdDoKKyAgICAgICAgaWYgbm90IChjbWQgb3Igc2NyaXB0KToKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBhcmdzWzpdOgorICAgICAgICAgICAgICAgIGlmIGZsaXN0Lm9wZW4oZmlsZW5hbWUpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICMgZmlsZW5hbWUgaXMgYSBkaXJlY3RvcnkgYWN0dWFsbHksIGRpc2NvbnNpZGVyIGl0CisgICAgICAgICAgICAgICAgICAgIGFyZ3MucmVtb3ZlKGZpbGVuYW1lKQorICAgICAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICAgICAgZmxpc3QubmV3KCkKKyAgICBpZiBlbmFibGVfc2hlbGw6CisgICAgICAgIHNoZWxsID0gZmxpc3Qub3Blbl9zaGVsbCgpCisgICAgICAgIGlmIG5vdCBzaGVsbDoKKyAgICAgICAgICAgIHJldHVybiAjIGNvdWxkbid0IG9wZW4gc2hlbGwKKworICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpIGFuZCBmbGlzdC5kaWN0OgorICAgICAgICAgICAgIyBPbiBPU1g6IHdoZW4gdGhlIHVzZXIgaGFzIGRvdWJsZS1jbGlja2VkIG9uIGEgZmlsZSB0aGF0IGNhdXNlcworICAgICAgICAgICAgIyBJRExFIHRvIGJlIGxhdW5jaGVkIHRoZSBzaGVsbCB3aW5kb3cgd2lsbCBvcGVuIGp1c3QgaW4gZnJvbnQgb2YKKyAgICAgICAgICAgICMgdGhlIGZpbGUgc2hlIHdhbnRzIHRvIHNlZS4gTG93ZXIgdGhlIGludGVycHJldGVyIHdpbmRvdyB3aGVuCisgICAgICAgICAgICAjIHRoZXJlIGFyZSBvcGVuIGZpbGVzLgorICAgICAgICAgICAgc2hlbGwudG9wLmxvd2VyKCkKKworICAgIHNoZWxsID0gZmxpc3QucHlzaGVsbAorICAgICMgaGFuZGxlIHJlbWFpbmluZyBvcHRpb25zOgorICAgIGlmIGRlYnVnOgorICAgICAgICBzaGVsbC5vcGVuX2RlYnVnZ2VyKCkKKyAgICBpZiBzdGFydHVwOgorICAgICAgICBmaWxlbmFtZSA9IG9zLmVudmlyb24uZ2V0KCJJRExFU1RBUlRVUCIpIG9yIFwKKyAgICAgICAgICAgICAgICAgICBvcy5lbnZpcm9uLmdldCgiUFlUSE9OU1RBUlRVUCIpCisgICAgICAgIGlmIGZpbGVuYW1lIGFuZCBvcy5wYXRoLmlzZmlsZShmaWxlbmFtZSk6CisgICAgICAgICAgICBzaGVsbC5pbnRlcnAuZXhlY2ZpbGUoZmlsZW5hbWUpCisgICAgaWYgc2hlbGwgYW5kIGNtZCBvciBzY3JpcHQ6CisgICAgICAgIHNoZWxsLmludGVycC5ydW5jb21tYW5kKCIiImlmIDE6CisgICAgICAgICAgICBpbXBvcnQgc3lzIGFzIF9zeXMKKyAgICAgICAgICAgIF9zeXMuYXJndiA9ICVyCisgICAgICAgICAgICBkZWwgX3N5cworICAgICAgICAgICAgXG4iIiIgJSAoc3lzLmFyZ3YsKSkKKyAgICAgICAgaWYgY21kOgorICAgICAgICAgICAgc2hlbGwuaW50ZXJwLmV4ZWNzb3VyY2UoY21kKQorICAgICAgICBlbGlmIHNjcmlwdDoKKyAgICAgICAgICAgIHNoZWxsLmludGVycC5wcmVwZW5kX3N5c3BhdGgoc2NyaXB0KQorICAgICAgICAgICAgc2hlbGwuaW50ZXJwLmV4ZWNmaWxlKHNjcmlwdCkKKworICAgICMgQ2hlY2sgZm9yIHByb2JsZW1hdGljIE9TIFggVGsgdmVyc2lvbnMgYW5kIHByaW50IGEgd2FybmluZyBtZXNzYWdlCisgICAgIyBpbiB0aGUgSURMRSBzaGVsbCB3aW5kb3c7IHRoaXMgaXMgbGVzcyBpbnRydXNpdmUgdGhhbiBhbHdheXMgb3BlbmluZworICAgICMgYSBzZXBhcmF0ZSB3aW5kb3cuCisgICAgdGt2ZXJzaW9ud2FybmluZyA9IG1hY29zeFN1cHBvcnQudGtWZXJzaW9uV2FybmluZyhyb290KQorICAgIGlmIHRrdmVyc2lvbndhcm5pbmc6CisgICAgICAgIHNoZWxsLmludGVycC5ydW5jb21tYW5kKCcnLmpvaW4oKCJwcmludCgnIiwgdGt2ZXJzaW9ud2FybmluZywgIicpIikpKQorCisgICAgd2hpbGUgZmxpc3QuaW52ZXJzZWRpY3Q6ICAjIGtlZXAgSURMRSBydW5uaW5nIHdoaWxlIGZpbGVzIGFyZSBvcGVuLgorICAgICAgICByb290Lm1haW5sb29wKCkKKyAgICByb290LmRlc3Ryb3koKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5tb2R1bGVzWydQeVNoZWxsJ10gPSBzeXMubW9kdWxlc1snX19tYWluX18nXQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1B5U2hlbGwucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1B5U2hlbGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YjVkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlTaGVsbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1B5U2hlbGwucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1B5U2hlbGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzE1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlTaGVsbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JFQURNRS50eHQgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDFmN2ViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JFQURNRS50eHQKQEAgLTAsMCArMSw2MyBAQAorSURMRSBpcyBQeXRob24ncyBUa2ludGVyLWJhc2VkIEludGVncmF0ZWQgRGV2ZUxvcG1lbnQgRW52aXJvbm1lbnQuCisKK0lETEUgZW1waGFzaXplcyBhIGxpZ2h0d2VpZ2h0LCBjbGVhbiBkZXNpZ24gd2l0aCBhIHNpbXBsZSB1c2VyIGludGVyZmFjZS4KK0FsdGhvdWdoIGl0IGlzIHN1aXRhYmxlIGZvciBiZWdpbm5lcnMsIGV2ZW4gYWR2YW5jZWQgdXNlcnMgd2lsbCBmaW5kIHRoYXQKK0lETEUgaGFzIGV2ZXJ5dGhpbmcgdGhleSByZWFsbHkgbmVlZCB0byBkZXZlbG9wIHB1cmUgUHl0aG9uIGNvZGUuCisKK0lETEUgZmVhdHVyZXMgYSBtdWx0aS13aW5kb3cgdGV4dCBlZGl0b3Igd2l0aCBtdWx0aXBsZSB1bmRvLCBQeXRob24gY29sb3JpemluZywKK2FuZCBtYW55IG90aGVyIGNhcGFiaWxpdGllcywgZS5nLiBzbWFydCBpbmRlbnQsIGNhbGwgdGlwcywgYW5kIGF1dG9jb21wbGV0aW9uLgorCitUaGUgZWRpdG9yIGhhcyBjb21wcmVoZW5zaXZlIHNlYXJjaCBmdW5jdGlvbnMsIGluY2x1ZGluZyBzZWFyY2hpbmcgdGhyb3VnaAorbXVsdGlwbGUgZmlsZXMuICBDbGFzcyBicm93c2VycyBhbmQgcGF0aCBicm93c2VycyBwcm92aWRlIGZhc3QgYWNjZXNzIHRvCitjb2RlIG9iamVjdHMgZnJvbSBhIHRvcCBsZXZlbCB2aWV3cG9pbnQgd2l0aG91dCBkZWFsaW5nIHdpdGggY29kZSBmb2xkaW5nLgorCitUaGVyZSBpcyBhIFB5dGhvbiBTaGVsbCB3aW5kb3cgd2hpY2ggZmVhdHVyZXMgY29sb3JpemluZyBhbmQgY29tbWFuZCByZWNhbGwuCisKK0lETEUgZXhlY3V0ZXMgUHl0aG9uIGNvZGUgaW4gYSBzZXBhcmF0ZSBwcm9jZXNzLCB3aGljaCBpcyByZXN0YXJ0ZWQgZm9yIGVhY2gKK1J1biAoRjUpIGluaXRpYXRlZCBmcm9tIGFuIGVkaXRvciB3aW5kb3cuICBUaGUgZW52aXJvbm1lbnQgY2FuIGFsc28gYmUgCityZXN0YXJ0ZWQgZnJvbSB0aGUgU2hlbGwgd2luZG93IHdpdGhvdXQgcmVzdGFydGluZyBJRExFLgorCitUaGlzIGVuaGFuY2VtZW50IGhhcyBvZnRlbiBiZWVuIHJlcXVlc3RlZCwgYW5kIGlzIG5vdyBmaW5hbGx5IGF2YWlsYWJsZS4gIFRoZQorbWFnaWMgInJlbG9hZC9pbXBvcnQgKiIgaW5jYW50YXRpb25zIGFyZSBubyBsb25nZXIgcmVxdWlyZWQgd2hlbiBlZGl0aW5nIGFuZAordGVzdGluZyBhIG1vZHVsZSB0d28gb3IgdGhyZWUgc3RlcHMgZG93biB0aGUgaW1wb3J0IGNoYWluLgorCisoUGVyc29uYWwgZmlyZXdhbGwgc29mdHdhcmUgbWF5IHdhcm4gYWJvdXQgdGhlIGNvbm5lY3Rpb24gSURMRSBtYWtlcyB0byBpdHMKK3N1YnByb2Nlc3MgdXNpbmcgdGhpcyBjb21wdXRlcidzIGludGVybmFsIGxvb3BiYWNrIGludGVyZmFjZS4gIFRoaXMgY29ubmVjdGlvbgoraXMgbm90IHZpc2libGUgb24gYW55IGV4dGVybmFsIGludGVyZmFjZSBhbmQgbm8gZGF0YSBpcyBzZW50IHRvIG9yIHJlY2VpdmVkCitmcm9tIHRoZSBJbnRlcm5ldC4pCisKK0l0IGlzIHBvc3NpYmxlIHRvIGludGVycnVwdCB0aWdodGx5IGxvb3BpbmcgdXNlciBjb2RlLCBldmVuIG9uIFdpbmRvd3MuCisKK0FwcGxpY2F0aW9ucyB3aGljaCBjYW5ub3Qgc3VwcG9ydCBzdWJwcm9jZXNzZXMgYW5kL29yIHNvY2tldHMgY2FuIHN0aWxsIHJ1bgorSURMRSBpbiBhIHNpbmdsZSBwcm9jZXNzLgorCitJRExFIGhhcyBhbiBpbnRlZ3JhdGVkIGRlYnVnZ2VyIHdpdGggc3RlcHBpbmcsIHBlcnNpc3RlbnQgYnJlYWtwb2ludHMsIGFuZCBjYWxsCitzdGFjayB2aXNpYmlsaXR5LgorCitUaGVyZSBpcyBhIEdVSSBjb25maWd1cmF0aW9uIG1hbmFnZXIgd2hpY2ggbWFrZXMgaXQgZWFzeSB0byBzZWxlY3QgZm9udHMsCitjb2xvcnMsIGtleWJpbmRpbmdzLCBhbmQgc3RhcnR1cCBvcHRpb25zLiAgVGhpcyBmYWNpbGl0eSBpbmNsdWRlcyBhIGZlYXR1cmUKK3doaWNoIGFsbG93cyB0aGUgdXNlciB0byBzcGVjaWZ5IGFkZGl0aW9uYWwgaGVscCBzb3VyY2VzLCBlaXRoZXIgbG9jYWxseSBvciBvbgordGhlIHdlYi4KKworSURMRSBpcyBjb2RlZCBpbiAxMDAlIHB1cmUgUHl0aG9uLCB1c2luZyB0aGUgVGtpbnRlciBHVUkgdG9vbGtpdCAoVGsvVGNsKQorYW5kIGlzIGNyb3NzLXBsYXRmb3JtLCB3b3JraW5nIG9uIFVuaXgsIE1hYywgYW5kIFdpbmRvd3MuCisKK0lETEUgYWNjZXB0cyBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiAgVHJ5IGlkbGUgLWggdG8gc2VlIHRoZSBvcHRpb25zLgorCisKK0lmIHlvdSBmaW5kIGJ1Z3Mgb3IgaGF2ZSBzdWdnZXN0aW9ucywgbGV0IHVzIGtub3cgYWJvdXQgdGhlbSBieSB1c2luZyB0aGUKK1B5dGhvbiBCdWcgVHJhY2tlcjoKKworaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9weXRob24KKworUGF0Y2hlcyBhcmUgYWx3YXlzIGFwcHJlY2lhdGVkIGF0IHRoZSBQeXRob24gUGF0Y2ggVHJhY2tlciwgYW5kIGNoYW5nZQorcmVxdWVzdHMgc2hvdWxkIGJlIHBvc3RlZCB0byB0aGUgUkZFIFRyYWNrZXIuCisKK0ZvciBmdXJ0aGVyIGRldGFpbHMgYW5kIGxpbmtzLCByZWFkIHRoZSBIZWxwIGZpbGVzIGFuZCBjaGVjayB0aGUgSURMRSBob21lCitwYWdlIGF0CisKK2h0dHA6Ly93d3cucHl0aG9uLm9yZy9pZGxlLworCitUaGVyZSBpcyBhIG1haWwgbGlzdCBmb3IgSURMRTogaWRsZS1kZXZAcHl0aG9uLm9yZy4gIFlvdSBjYW4gam9pbiBhdAorCitodHRwOi8vbWFpbC5weXRob24ub3JnL21haWxtYW4vbGlzdGluZm8vaWRsZS1kZXYKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9SZW1vdGVEZWJ1Z2dlci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9SZW1vdGVEZWJ1Z2dlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDcyODVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5CkBAIC0wLDAgKzEsMzgwIEBACisiIiJTdXBwb3J0IGZvciByZW1vdGUgUHl0aG9uIGRlYnVnZ2luZy4KKworU29tZSBBU0NJSSBhcnQgdG8gZGVzY3JpYmUgdGhlIHN0cnVjdHVyZToKKworICAgICAgIElOIFBZVEhPTiBTVUJQUk9DRVNTICAgICAgICAgICMgICAgICAgICAgICAgSU4gSURMRSBQUk9DRVNTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgIG9pZD0nZ3VpX2FkYXB0ZXInCisgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tKyAgICAgICAgIyAgICAgICArLS0tLS0tLS0tLS0tKyAgICAgICAgICArLS0tLS0rCisgICAgICAgICAgICAgICAgIHwgR1VJUHJveHkgfC0tcmVtb3RlI2NhbGwtLT58IEdVSUFkYXB0ZXIgfC0tY2FsbHMtLT58IEdVSSB8CisrLS0tLS0rLS1jYWxscy0tPistLS0tLS0tLS0tKyAgICAgICAgIyAgICAgICArLS0tLS0tLS0tLS0tKyAgICAgICAgICArLS0tLS0rCit8IElkYiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKystLS0tLSs8LWNhbGxzLS0rLS0tLS0tLS0tLS0tKyAgICAgICAgICMgICAgICArLS0tLS0tLS0tLSs8LS1jYWxscy0vCisgICAgICAgICAgICAgICAgfCBJZGJBZGFwdGVyIHw8LS1yZW1vdGUjY2FsbC0tfCBJZGJQcm94eSB8CisgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLSsgICAgICAgICAjICAgICAgKy0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICAgb2lkPSdpZGJfYWRhcHRlcicgICAgICAjCisKK1RoZSBwdXJwb3NlIG9mIHRoZSBQcm94eSBhbmQgQWRhcHRlciBjbGFzc2VzIGlzIHRvIHRyYW5zbGF0ZSBjZXJ0YWluCithcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMgdGhhdCBjYW5ub3QgYmUgdHJhbnNwb3J0ZWQgdGhyb3VnaCB0aGUgUlBDCitiYXJyaWVyLCBpbiBwYXJ0aWN1bGFyIGZyYW1lIGFuZCB0cmFjZWJhY2sgb2JqZWN0cy4KKworIiIiCisKK2ltcG9ydCB0eXBlcworZnJvbSBpZGxlbGliIGltcG9ydCBycGMKK2Zyb20gaWRsZWxpYiBpbXBvcnQgRGVidWdnZXIKKworZGVidWdnaW5nID0gMAorCitpZGJfYWRhcF9vaWQgPSAiaWRiX2FkYXB0ZXIiCitndWlfYWRhcF9vaWQgPSAiZ3VpX2FkYXB0ZXIiCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgSW4gdGhlIFBZVEhPTiBzdWJwcm9jZXNzOgorCitmcmFtZXRhYmxlID0ge30KK2RpY3R0YWJsZSA9IHt9Citjb2RldGFibGUgPSB7fQordHJhY2ViYWNrdGFibGUgPSB7fQorCitkZWYgd3JhcF9mcmFtZShmcmFtZSk6CisgICAgZmlkID0gaWQoZnJhbWUpCisgICAgZnJhbWV0YWJsZVtmaWRdID0gZnJhbWUKKyAgICByZXR1cm4gZmlkCisKK2RlZiB3cmFwX2luZm8oaW5mbyk6CisgICAgInJlcGxhY2UgaW5mb1syXSwgYSB0cmFjZWJhY2sgaW5zdGFuY2UsIGJ5IGl0cyBJRCIKKyAgICBpZiBpbmZvIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBOb25lCisgICAgZWxzZToKKyAgICAgICAgdHJhY2ViYWNrID0gaW5mb1syXQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh0cmFjZWJhY2ssIHR5cGVzLlRyYWNlYmFja1R5cGUpCisgICAgICAgIHRyYWNlYmFja19pZCA9IGlkKHRyYWNlYmFjaykKKyAgICAgICAgdHJhY2ViYWNrdGFibGVbdHJhY2ViYWNrX2lkXSA9IHRyYWNlYmFjaworICAgICAgICBtb2RpZmllZF9pbmZvID0gKGluZm9bMF0sIGluZm9bMV0sIHRyYWNlYmFja19pZCkKKyAgICAgICAgcmV0dXJuIG1vZGlmaWVkX2luZm8KKworY2xhc3MgR1VJUHJveHk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubiwgZ3VpX2FkYXBfb2lkKToKKyAgICAgICAgc2VsZi5jb25uID0gY29ubgorICAgICAgICBzZWxmLm9pZCA9IGd1aV9hZGFwX29pZAorCisgICAgZGVmIGludGVyYWN0aW9uKHNlbGYsIG1lc3NhZ2UsIGZyYW1lLCBpbmZvPU5vbmUpOgorICAgICAgICAjIGNhbGxzIHJwYy5Tb2NrZXRJTy5yZW1vdGVjYWxsKCkgdmlhIHJ1bi5NeUhhbmRsZXIgaW5zdGFuY2UKKyAgICAgICAgIyBwYXNzIGZyYW1lIGFuZCB0cmFjZWJhY2sgb2JqZWN0IElEcyBpbnN0ZWFkIG9mIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMKKyAgICAgICAgc2VsZi5jb25uLnJlbW90ZWNhbGwoc2VsZi5vaWQsICJpbnRlcmFjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXNzYWdlLCB3cmFwX2ZyYW1lKGZyYW1lKSwgd3JhcF9pbmZvKGluZm8pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30pCisKK2NsYXNzIElkYkFkYXB0ZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaWRiKToKKyAgICAgICAgc2VsZi5pZGIgPSBpZGIKKworICAgICMtLS0tLS0tLS0tY2FsbGVkIGJ5IGFuIElkYlByb3h5LS0tLS0tLS0tLQorCisgICAgZGVmIHNldF9zdGVwKHNlbGYpOgorICAgICAgICBzZWxmLmlkYi5zZXRfc3RlcCgpCisKKyAgICBkZWYgc2V0X3F1aXQoc2VsZik6CisgICAgICAgIHNlbGYuaWRiLnNldF9xdWl0KCkKKworICAgIGRlZiBzZXRfY29udGludWUoc2VsZik6CisgICAgICAgIHNlbGYuaWRiLnNldF9jb250aW51ZSgpCisKKyAgICBkZWYgc2V0X25leHQoc2VsZiwgZmlkKToKKyAgICAgICAgZnJhbWUgPSBmcmFtZXRhYmxlW2ZpZF0KKyAgICAgICAgc2VsZi5pZGIuc2V0X25leHQoZnJhbWUpCisKKyAgICBkZWYgc2V0X3JldHVybihzZWxmLCBmaWQpOgorICAgICAgICBmcmFtZSA9IGZyYW1ldGFibGVbZmlkXQorICAgICAgICBzZWxmLmlkYi5zZXRfcmV0dXJuKGZyYW1lKQorCisgICAgZGVmIGdldF9zdGFjayhzZWxmLCBmaWQsIHRiaWQpOgorICAgICAgICAjI3ByaW50ID4+c3lzLl9fc3RkZXJyX18sICJnZXRfc3RhY2soJXIsICVyKSIgJSAoZmlkLCB0YmlkKQorICAgICAgICBmcmFtZSA9IGZyYW1ldGFibGVbZmlkXQorICAgICAgICBpZiB0YmlkIGlzIE5vbmU6CisgICAgICAgICAgICB0YiA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRiID0gdHJhY2ViYWNrdGFibGVbdGJpZF0KKyAgICAgICAgc3RhY2ssIGkgPSBzZWxmLmlkYi5nZXRfc3RhY2soZnJhbWUsIHRiKQorICAgICAgICAjI3ByaW50ID4+c3lzLl9fc3RkZXJyX18sICJnZXRfc3RhY2soKSAtPiIsIHN0YWNrCisgICAgICAgIHN0YWNrID0gWyh3cmFwX2ZyYW1lKGZyYW1lKSwgaykgZm9yIGZyYW1lLCBrIGluIHN0YWNrXQorICAgICAgICAjI3ByaW50ID4+c3lzLl9fc3RkZXJyX18sICJnZXRfc3RhY2soKSAtPiIsIHN0YWNrCisgICAgICAgIHJldHVybiBzdGFjaywgaQorCisgICAgZGVmIHJ1bihzZWxmLCBjbWQpOgorICAgICAgICBpbXBvcnQgX19tYWluX18KKyAgICAgICAgc2VsZi5pZGIucnVuKGNtZCwgX19tYWluX18uX19kaWN0X18pCisKKyAgICBkZWYgc2V0X2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgorICAgICAgICBtc2cgPSBzZWxmLmlkYi5zZXRfYnJlYWsoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgcmV0dXJuIG1zZworCisgICAgZGVmIGNsZWFyX2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgorICAgICAgICBtc2cgPSBzZWxmLmlkYi5jbGVhcl9icmVhayhmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICByZXR1cm4gbXNnCisKKyAgICBkZWYgY2xlYXJfYWxsX2ZpbGVfYnJlYWtzKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgbXNnID0gc2VsZi5pZGIuY2xlYXJfYWxsX2ZpbGVfYnJlYWtzKGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gbXNnCisKKyAgICAjLS0tLS0tLS0tLWNhbGxlZCBieSBhIEZyYW1lUHJveHktLS0tLS0tLS0tCisKKyAgICBkZWYgZnJhbWVfYXR0cihzZWxmLCBmaWQsIG5hbWUpOgorICAgICAgICBmcmFtZSA9IGZyYW1ldGFibGVbZmlkXQorICAgICAgICByZXR1cm4gZ2V0YXR0cihmcmFtZSwgbmFtZSkKKworICAgIGRlZiBmcmFtZV9nbG9iYWxzKHNlbGYsIGZpZCk6CisgICAgICAgIGZyYW1lID0gZnJhbWV0YWJsZVtmaWRdCisgICAgICAgIGRpY3QgPSBmcmFtZS5mX2dsb2JhbHMKKyAgICAgICAgZGlkID0gaWQoZGljdCkKKyAgICAgICAgZGljdHRhYmxlW2RpZF0gPSBkaWN0CisgICAgICAgIHJldHVybiBkaWQKKworICAgIGRlZiBmcmFtZV9sb2NhbHMoc2VsZiwgZmlkKToKKyAgICAgICAgZnJhbWUgPSBmcmFtZXRhYmxlW2ZpZF0KKyAgICAgICAgZGljdCA9IGZyYW1lLmZfbG9jYWxzCisgICAgICAgIGRpZCA9IGlkKGRpY3QpCisgICAgICAgIGRpY3R0YWJsZVtkaWRdID0gZGljdAorICAgICAgICByZXR1cm4gZGlkCisKKyAgICBkZWYgZnJhbWVfY29kZShzZWxmLCBmaWQpOgorICAgICAgICBmcmFtZSA9IGZyYW1ldGFibGVbZmlkXQorICAgICAgICBjb2RlID0gZnJhbWUuZl9jb2RlCisgICAgICAgIGNpZCA9IGlkKGNvZGUpCisgICAgICAgIGNvZGV0YWJsZVtjaWRdID0gY29kZQorICAgICAgICByZXR1cm4gY2lkCisKKyAgICAjLS0tLS0tLS0tLWNhbGxlZCBieSBhIENvZGVQcm94eS0tLS0tLS0tLS0KKworICAgIGRlZiBjb2RlX25hbWUoc2VsZiwgY2lkKToKKyAgICAgICAgY29kZSA9IGNvZGV0YWJsZVtjaWRdCisgICAgICAgIHJldHVybiBjb2RlLmNvX25hbWUKKworICAgIGRlZiBjb2RlX2ZpbGVuYW1lKHNlbGYsIGNpZCk6CisgICAgICAgIGNvZGUgPSBjb2RldGFibGVbY2lkXQorICAgICAgICByZXR1cm4gY29kZS5jb19maWxlbmFtZQorCisgICAgIy0tLS0tLS0tLS1jYWxsZWQgYnkgYSBEaWN0UHJveHktLS0tLS0tLS0tCisKKyAgICBkZWYgZGljdF9rZXlzKHNlbGYsIGRpZCk6CisgICAgICAgIGRpY3QgPSBkaWN0dGFibGVbZGlkXQorICAgICAgICByZXR1cm4gZGljdC5rZXlzKCkKKworICAgIGRlZiBkaWN0X2l0ZW0oc2VsZiwgZGlkLCBrZXkpOgorICAgICAgICBkaWN0ID0gZGljdHRhYmxlW2RpZF0KKyAgICAgICAgdmFsdWUgPSBkaWN0W2tleV0KKyAgICAgICAgdmFsdWUgPSByZXByKHZhbHVlKQorICAgICAgICByZXR1cm4gdmFsdWUKKworIy0tLS0tLS0tLS1lbmQgY2xhc3MgSWRiQWRhcHRlci0tLS0tLS0tLS0KKworCitkZWYgc3RhcnRfZGVidWdnZXIocnBjaGFuZGxlciwgZ3VpX2FkYXBfb2lkKToKKyAgICAiIiJTdGFydCB0aGUgZGVidWdnZXIgYW5kIGl0cyBSUEMgbGluayBpbiB0aGUgUHl0aG9uIHN1YnByb2Nlc3MKKworICAgIFN0YXJ0IHRoZSBzdWJwcm9jZXNzIHNpZGUgb2YgdGhlIHNwbGl0IGRlYnVnZ2VyIGFuZCBzZXQgdXAgdGhhdCBzaWRlIG9mIHRoZQorICAgIFJQQyBsaW5rIGJ5IGluc3RhbnRpYXRpbmcgdGhlIEdVSVByb3h5LCBJZGIgZGVidWdnZXIsIGFuZCBJZGJBZGFwdGVyCisgICAgb2JqZWN0cyBhbmQgbGlua2luZyB0aGVtIHRvZ2V0aGVyLiAgUmVnaXN0ZXIgdGhlIElkYkFkYXB0ZXIgd2l0aCB0aGUKKyAgICBSUENTZXJ2ZXIgdG8gaGFuZGxlIFJQQyByZXF1ZXN0cyBmcm9tIHRoZSBzcGxpdCBkZWJ1Z2dlciBHVUkgdmlhIHRoZQorICAgIElkYlByb3h5LgorCisgICAgIiIiCisgICAgZ3VpX3Byb3h5ID0gR1VJUHJveHkocnBjaGFuZGxlciwgZ3VpX2FkYXBfb2lkKQorICAgIGlkYiA9IERlYnVnZ2VyLklkYihndWlfcHJveHkpCisgICAgaWRiX2FkYXAgPSBJZGJBZGFwdGVyKGlkYikKKyAgICBycGNoYW5kbGVyLnJlZ2lzdGVyKGlkYl9hZGFwX29pZCwgaWRiX2FkYXApCisgICAgcmV0dXJuIGlkYl9hZGFwX29pZAorCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgSW4gdGhlIElETEUgcHJvY2VzczoKKworCitjbGFzcyBGcmFtZVByb3h5OgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4sIGZpZCk6CisgICAgICAgIHNlbGYuX2Nvbm4gPSBjb25uCisgICAgICAgIHNlbGYuX2ZpZCA9IGZpZAorICAgICAgICBzZWxmLl9vaWQgPSAiaWRiX2FkYXB0ZXIiCisgICAgICAgIHNlbGYuX2RpY3RjYWNoZSA9IHt9CisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWVbOjFdID09ICJfIjoKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBuYW1lCisgICAgICAgIGlmIG5hbWUgPT0gImZfY29kZSI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2ZfY29kZSgpCisgICAgICAgIGlmIG5hbWUgPT0gImZfZ2xvYmFscyI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2ZfZ2xvYmFscygpCisgICAgICAgIGlmIG5hbWUgPT0gImZfbG9jYWxzIjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfZl9sb2NhbHMoKQorICAgICAgICByZXR1cm4gc2VsZi5fY29ubi5yZW1vdGVjYWxsKHNlbGYuX29pZCwgImZyYW1lX2F0dHIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLl9maWQsIG5hbWUpLCB7fSkKKworICAgIGRlZiBfZ2V0X2ZfY29kZShzZWxmKToKKyAgICAgICAgY2lkID0gc2VsZi5fY29ubi5yZW1vdGVjYWxsKHNlbGYuX29pZCwgImZyYW1lX2NvZGUiLCAoc2VsZi5fZmlkLCksIHt9KQorICAgICAgICByZXR1cm4gQ29kZVByb3h5KHNlbGYuX2Nvbm4sIHNlbGYuX29pZCwgY2lkKQorCisgICAgZGVmIF9nZXRfZl9nbG9iYWxzKHNlbGYpOgorICAgICAgICBkaWQgPSBzZWxmLl9jb25uLnJlbW90ZWNhbGwoc2VsZi5fb2lkLCAiZnJhbWVfZ2xvYmFscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fZmlkLCksIHt9KQorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2RpY3RfcHJveHkoZGlkKQorCisgICAgZGVmIF9nZXRfZl9sb2NhbHMoc2VsZik6CisgICAgICAgIGRpZCA9IHNlbGYuX2Nvbm4ucmVtb3RlY2FsbChzZWxmLl9vaWQsICJmcmFtZV9sb2NhbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX2ZpZCwpLCB7fSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9kaWN0X3Byb3h5KGRpZCkKKworICAgIGRlZiBfZ2V0X2RpY3RfcHJveHkoc2VsZiwgZGlkKToKKyAgICAgICAgaWYgZGlkIGluIHNlbGYuX2RpY3RjYWNoZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kaWN0Y2FjaGVbZGlkXQorICAgICAgICBkcCA9IERpY3RQcm94eShzZWxmLl9jb25uLCBzZWxmLl9vaWQsIGRpZCkKKyAgICAgICAgc2VsZi5fZGljdGNhY2hlW2RpZF0gPSBkcAorICAgICAgICByZXR1cm4gZHAKKworCitjbGFzcyBDb2RlUHJveHk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubiwgb2lkLCBjaWQpOgorICAgICAgICBzZWxmLl9jb25uID0gY29ubgorICAgICAgICBzZWxmLl9vaWQgPSBvaWQKKyAgICAgICAgc2VsZi5fY2lkID0gY2lkCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgPT0gImNvX25hbWUiOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Nvbm4ucmVtb3RlY2FsbChzZWxmLl9vaWQsICJjb2RlX25hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fY2lkLCksIHt9KQorICAgICAgICBpZiBuYW1lID09ICJjb19maWxlbmFtZSI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29ubi5yZW1vdGVjYWxsKHNlbGYuX29pZCwgImNvZGVfZmlsZW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fY2lkLCksIHt9KQorCisKK2NsYXNzIERpY3RQcm94eToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uLCBvaWQsIGRpZCk6CisgICAgICAgIHNlbGYuX2Nvbm4gPSBjb25uCisgICAgICAgIHNlbGYuX29pZCA9IG9pZAorICAgICAgICBzZWxmLl9kaWQgPSBkaWQKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29ubi5yZW1vdGVjYWxsKHNlbGYuX29pZCwgImRpY3Rfa2V5cyIsIChzZWxmLl9kaWQsKSwge30pCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Nvbm4ucmVtb3RlY2FsbChzZWxmLl9vaWQsICJkaWN0X2l0ZW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLl9kaWQsIGtleSksIHt9KQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAjI3ByaW50ID4+c3lzLl9fc3RkZXJyX18sICJmYWlsZWQgRGljdFByb3h5Ll9fZ2V0YXR0cl9fOiIsIG5hbWUKKyAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKKworCitjbGFzcyBHVUlBZGFwdGVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4sIGd1aSk6CisgICAgICAgIHNlbGYuY29ubiA9IGNvbm4KKyAgICAgICAgc2VsZi5ndWkgPSBndWkKKworICAgIGRlZiBpbnRlcmFjdGlvbihzZWxmLCBtZXNzYWdlLCBmaWQsIG1vZGlmaWVkX2luZm8pOgorICAgICAgICAjI3ByaW50ICJpbnRlcmFjdGlvbjogKCVzLCAlcywgJXMpIiAlIChtZXNzYWdlLCBmaWQsIG1vZGlmaWVkX2luZm8pCisgICAgICAgIGZyYW1lID0gRnJhbWVQcm94eShzZWxmLmNvbm4sIGZpZCkKKyAgICAgICAgc2VsZi5ndWkuaW50ZXJhY3Rpb24obWVzc2FnZSwgZnJhbWUsIG1vZGlmaWVkX2luZm8pCisKKworY2xhc3MgSWRiUHJveHk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubiwgc2hlbGwsIG9pZCk6CisgICAgICAgIHNlbGYub2lkID0gb2lkCisgICAgICAgIHNlbGYuY29ubiA9IGNvbm4KKyAgICAgICAgc2VsZi5zaGVsbCA9IHNoZWxsCisKKyAgICBkZWYgY2FsbChzZWxmLCBtZXRob2RuYW1lLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAjI3ByaW50ICIqKklkYlByb3h5LmNhbGwgJXMgJXMgJXMiICUgKG1ldGhvZG5hbWUsIGFyZ3MsIGt3YXJncykKKyAgICAgICAgdmFsdWUgPSBzZWxmLmNvbm4ucmVtb3RlY2FsbChzZWxmLm9pZCwgbWV0aG9kbmFtZSwgYXJncywga3dhcmdzKQorICAgICAgICAjI3ByaW50ICIqKklkYlByb3h5LmNhbGwgJXMgcmV0dXJucyAlciIgJSAobWV0aG9kbmFtZSwgdmFsdWUpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIHJ1bihzZWxmLCBjbWQsIGxvY2Fscyk6CisgICAgICAgICMgSWdub3JlcyBsb2NhbHMgb24gcHVycG9zZSEKKyAgICAgICAgc2VxID0gc2VsZi5jb25uLmFzeW5jcXVldWUoc2VsZi5vaWQsICJydW4iLCAoY21kLCksIHt9KQorICAgICAgICBzZWxmLnNoZWxsLmludGVycC5hY3RpdmVfc2VxID0gc2VxCisKKyAgICBkZWYgZ2V0X3N0YWNrKHNlbGYsIGZyYW1lLCB0YmlkKToKKyAgICAgICAgIyBwYXNzaW5nIGZyYW1lIGFuZCB0cmFjZWJhY2sgSURzLCBub3QgdGhlIG9iamVjdHMgdGhlbXNlbHZlcworICAgICAgICBzdGFjaywgaSA9IHNlbGYuY2FsbCgiZ2V0X3N0YWNrIiwgZnJhbWUuX2ZpZCwgdGJpZCkKKyAgICAgICAgc3RhY2sgPSBbKEZyYW1lUHJveHkoc2VsZi5jb25uLCBmaWQpLCBrKSBmb3IgZmlkLCBrIGluIHN0YWNrXQorICAgICAgICByZXR1cm4gc3RhY2ssIGkKKworICAgIGRlZiBzZXRfY29udGludWUoc2VsZik6CisgICAgICAgIHNlbGYuY2FsbCgic2V0X2NvbnRpbnVlIikKKworICAgIGRlZiBzZXRfc3RlcChzZWxmKToKKyAgICAgICAgc2VsZi5jYWxsKCJzZXRfc3RlcCIpCisKKyAgICBkZWYgc2V0X25leHQoc2VsZiwgZnJhbWUpOgorICAgICAgICBzZWxmLmNhbGwoInNldF9uZXh0IiwgZnJhbWUuX2ZpZCkKKworICAgIGRlZiBzZXRfcmV0dXJuKHNlbGYsIGZyYW1lKToKKyAgICAgICAgc2VsZi5jYWxsKCJzZXRfcmV0dXJuIiwgZnJhbWUuX2ZpZCkKKworICAgIGRlZiBzZXRfcXVpdChzZWxmKToKKyAgICAgICAgc2VsZi5jYWxsKCJzZXRfcXVpdCIpCisKKyAgICBkZWYgc2V0X2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgorICAgICAgICBtc2cgPSBzZWxmLmNhbGwoInNldF9icmVhayIsIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHJldHVybiBtc2cKKworICAgIGRlZiBjbGVhcl9icmVhayhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKKyAgICAgICAgbXNnID0gc2VsZi5jYWxsKCJjbGVhcl9icmVhayIsIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHJldHVybiBtc2cKKworICAgIGRlZiBjbGVhcl9hbGxfZmlsZV9icmVha3Moc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBtc2cgPSBzZWxmLmNhbGwoImNsZWFyX2FsbF9maWxlX2JyZWFrcyIsIGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gbXNnCisKK2RlZiBzdGFydF9yZW1vdGVfZGVidWdnZXIocnBjY2x0LCBweXNoZWxsKToKKyAgICAiIiJTdGFydCB0aGUgc3VicHJvY2VzcyBkZWJ1Z2dlciwgaW5pdGlhbGl6ZSB0aGUgZGVidWdnZXIgR1VJIGFuZCBSUEMgbGluaworCisgICAgUmVxdWVzdCB0aGUgUlBDU2VydmVyIHN0YXJ0IHRoZSBQeXRob24gc3VicHJvY2VzcyBkZWJ1Z2dlciBhbmQgbGluay4gIFNldAorICAgIHVwIHRoZSBJZGxlIHNpZGUgb2YgdGhlIHNwbGl0IGRlYnVnZ2VyIGJ5IGluc3RhbnRpYXRpbmcgdGhlIElkYlByb3h5LAorICAgIGRlYnVnZ2VyIEdVSSwgYW5kIGRlYnVnZ2VyIEdVSUFkYXB0ZXIgb2JqZWN0cyBhbmQgbGlua2luZyB0aGVtIHRvZ2V0aGVyLgorCisgICAgUmVnaXN0ZXIgdGhlIEdVSUFkYXB0ZXIgd2l0aCB0aGUgUlBDQ2xpZW50IHRvIGhhbmRsZSBkZWJ1Z2dlciBHVUkKKyAgICBpbnRlcmFjdGlvbiByZXF1ZXN0cyBjb21pbmcgZnJvbSB0aGUgc3VicHJvY2VzcyBkZWJ1Z2dlciB2aWEgdGhlIEdVSVByb3h5LgorCisgICAgVGhlIElkYkFkYXB0ZXIgd2lsbCBwYXNzIGV4ZWN1dGlvbiBhbmQgZW52aXJvbm1lbnQgcmVxdWVzdHMgY29taW5nIGZyb20gdGhlCisgICAgSWRsZSBkZWJ1Z2dlciBHVUkgdG8gdGhlIHN1YnByb2Nlc3MgZGVidWdnZXIgdmlhIHRoZSBJZGJQcm94eS4KKworICAgICIiIgorICAgIGdsb2JhbCBpZGJfYWRhcF9vaWQKKworICAgIGlkYl9hZGFwX29pZCA9IHJwY2NsdC5yZW1vdGVjYWxsKCJleGVjIiwgInN0YXJ0X3RoZV9kZWJ1Z2dlciIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VpX2FkYXBfb2lkLCksIHt9KQorICAgIGlkYl9wcm94eSA9IElkYlByb3h5KHJwY2NsdCwgcHlzaGVsbCwgaWRiX2FkYXBfb2lkKQorICAgIGd1aSA9IERlYnVnZ2VyLkRlYnVnZ2VyKHB5c2hlbGwsIGlkYl9wcm94eSkKKyAgICBndWlfYWRhcCA9IEdVSUFkYXB0ZXIocnBjY2x0LCBndWkpCisgICAgcnBjY2x0LnJlZ2lzdGVyKGd1aV9hZGFwX29pZCwgZ3VpX2FkYXApCisgICAgcmV0dXJuIGd1aQorCitkZWYgY2xvc2VfcmVtb3RlX2RlYnVnZ2VyKHJwY2NsdCk6CisgICAgIiIiU2h1dCBkb3duIHN1YnByb2Nlc3MgZGVidWdnZXIgYW5kIElkbGUgc2lkZSBvZiBkZWJ1Z2dlciBSUEMgbGluaworCisgICAgUmVxdWVzdCB0aGF0IHRoZSBSUENTZXJ2ZXIgc2h1dCBkb3duIHRoZSBzdWJwcm9jZXNzIGRlYnVnZ2VyIGFuZCBsaW5rLgorICAgIFVucmVnaXN0ZXIgdGhlIEdVSUFkYXB0ZXIsIHdoaWNoIHdpbGwgY2F1c2UgYSBHQyBvbiB0aGUgSWRsZSBwcm9jZXNzCisgICAgZGVidWdnZXIgYW5kIFJQQyBsaW5rIG9iamVjdHMuICAoVGhlIHNlY29uZCByZWZlcmVuY2UgdG8gdGhlIGRlYnVnZ2VyIEdVSQorICAgIGlzIGRlbGV0ZWQgaW4gUHlTaGVsbC5jbG9zZV9yZW1vdGVfZGVidWdnZXIoKS4pCisKKyAgICAiIiIKKyAgICBjbG9zZV9zdWJwcm9jZXNzX2RlYnVnZ2VyKHJwY2NsdCkKKyAgICBycGNjbHQudW5yZWdpc3RlcihndWlfYWRhcF9vaWQpCisKK2RlZiBjbG9zZV9zdWJwcm9jZXNzX2RlYnVnZ2VyKHJwY2NsdCk6CisgICAgcnBjY2x0LnJlbW90ZWNhbGwoImV4ZWMiLCAic3RvcF90aGVfZGVidWdnZXIiLCAoaWRiX2FkYXBfb2lkLCksIHt9KQorCitkZWYgcmVzdGFydF9zdWJwcm9jZXNzX2RlYnVnZ2VyKHJwY2NsdCk6CisgICAgaWRiX2FkYXBfb2lkX3JldCA9IHJwY2NsdC5yZW1vdGVjYWxsKCJleGVjIiwgInN0YXJ0X3RoZV9kZWJ1Z2dlciIsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3VpX2FkYXBfb2lkLCksIHt9KQorICAgIGFzc2VydCBpZGJfYWRhcF9vaWRfcmV0ID09IGlkYl9hZGFwX29pZCwgJ0lkYiByZXN0YXJ0ZWQgd2l0aCBkaWZmZXJlbnQgb2lkJwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9SZW1vdGVEZWJ1Z2dlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I5MmE5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9SZW1vdGVEZWJ1Z2dlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9SZW1vdGVEZWJ1Z2dlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzMjJmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9SZW1vdGVEZWJ1Z2dlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZU9iamVjdEJyb3dzZXIucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVtb3RlT2JqZWN0QnJvd3Nlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2UyYzY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZU9iamVjdEJyb3dzZXIucHkKQEAgLTAsMCArMSwzNiBAQAorZnJvbSBpZGxlbGliIGltcG9ydCBycGMKKworZGVmIHJlbW90ZV9vYmplY3RfdHJlZV9pdGVtKGl0ZW0pOgorICAgIHdyYXBwZXIgPSBXcmFwcGVkT2JqZWN0VHJlZUl0ZW0oaXRlbSkKKyAgICBvaWQgPSBpZCh3cmFwcGVyKQorICAgIHJwYy5vYmplY3R0YWJsZVtvaWRdID0gd3JhcHBlcgorICAgIHJldHVybiBvaWQKKworY2xhc3MgV3JhcHBlZE9iamVjdFRyZWVJdGVtOgorICAgICMgTGl2ZXMgaW4gUFlUSE9OIHN1YnByb2Nlc3MKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdGVtKToKKyAgICAgICAgc2VsZi5fX2l0ZW0gPSBpdGVtCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIHZhbHVlID0gZ2V0YXR0cihzZWxmLl9faXRlbSwgbmFtZSkKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgX0dldFN1Ykxpc3Qoc2VsZik6CisgICAgICAgIGxpc3QgPSBzZWxmLl9faXRlbS5fR2V0U3ViTGlzdCgpCisgICAgICAgIHJldHVybiBtYXAocmVtb3RlX29iamVjdF90cmVlX2l0ZW0sIGxpc3QpCisKK2NsYXNzIFN0dWJPYmplY3RUcmVlSXRlbToKKyAgICAjIExpdmVzIGluIElETEUgcHJvY2VzcworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2tpbywgb2lkKToKKyAgICAgICAgc2VsZi5zb2NraW8gPSBzb2NraW8KKyAgICAgICAgc2VsZi5vaWQgPSBvaWQKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgdmFsdWUgPSBycGMuTWV0aG9kUHJveHkoc2VsZi5zb2NraW8sIHNlbGYub2lkLCBuYW1lKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBfR2V0U3ViTGlzdChzZWxmKToKKyAgICAgICAgbGlzdCA9IHNlbGYuc29ja2lvLnJlbW90ZWNhbGwoc2VsZi5vaWQsICJfR2V0U3ViTGlzdCIsICgpLCB7fSkKKyAgICAgICAgcmV0dXJuIFtTdHViT2JqZWN0VHJlZUl0ZW0oc2VsZi5zb2NraW8sIG9pZCkgZm9yIG9pZCBpbiBsaXN0XQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZU9iamVjdEJyb3dzZXIucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZU9iamVjdEJyb3dzZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Mzk1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVtb3RlT2JqZWN0QnJvd3Nlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZU9iamVjdEJyb3dzZXIucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZU9iamVjdEJyb3dzZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Mzk1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVtb3RlT2JqZWN0QnJvd3Nlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGMyNzBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHkKQEAgLTAsMCArMSwxODkgQEAKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgorCitmcm9tIGlkbGVsaWIgaW1wb3J0IFNlYXJjaEVuZ2luZQorZnJvbSBpZGxlbGliLlNlYXJjaERpYWxvZ0Jhc2UgaW1wb3J0IFNlYXJjaERpYWxvZ0Jhc2UKK2ltcG9ydCByZQorCisKK2RlZiByZXBsYWNlKHRleHQpOgorICAgIHJvb3QgPSB0ZXh0Ll9yb290KCkKKyAgICBlbmdpbmUgPSBTZWFyY2hFbmdpbmUuZ2V0KHJvb3QpCisgICAgaWYgbm90IGhhc2F0dHIoZW5naW5lLCAiX3JlcGxhY2VkaWFsb2ciKToKKyAgICAgICAgZW5naW5lLl9yZXBsYWNlZGlhbG9nID0gUmVwbGFjZURpYWxvZyhyb290LCBlbmdpbmUpCisgICAgZGlhbG9nID0gZW5naW5lLl9yZXBsYWNlZGlhbG9nCisgICAgZGlhbG9nLm9wZW4odGV4dCkKKworCitjbGFzcyBSZXBsYWNlRGlhbG9nKFNlYXJjaERpYWxvZ0Jhc2UpOgorCisgICAgdGl0bGUgPSAiUmVwbGFjZSBEaWFsb2ciCisgICAgaWNvbiA9ICJSZXBsYWNlIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3QsIGVuZ2luZSk6CisgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2UuX19pbml0X18oc2VsZiwgcm9vdCwgZW5naW5lKQorICAgICAgICBzZWxmLnJlcGx2YXIgPSBTdHJpbmdWYXIocm9vdCkKKworICAgIGRlZiBvcGVuKHNlbGYsIHRleHQpOgorICAgICAgICBTZWFyY2hEaWFsb2dCYXNlLm9wZW4oc2VsZiwgdGV4dCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlyc3QgPSB0ZXh0LmluZGV4KCJzZWwuZmlyc3QiKQorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICBmaXJzdCA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGFzdCA9IHRleHQuaW5kZXgoInNlbC5sYXN0IikKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgbGFzdCA9IE5vbmUKKyAgICAgICAgZmlyc3QgPSBmaXJzdCBvciB0ZXh0LmluZGV4KCJpbnNlcnQiKQorICAgICAgICBsYXN0ID0gbGFzdCBvciBmaXJzdAorICAgICAgICBzZWxmLnNob3dfaGl0KGZpcnN0LCBsYXN0KQorICAgICAgICBzZWxmLm9rID0gMQorCisgICAgZGVmIGNyZWF0ZV9lbnRyaWVzKHNlbGYpOgorICAgICAgICBTZWFyY2hEaWFsb2dCYXNlLmNyZWF0ZV9lbnRyaWVzKHNlbGYpCisgICAgICAgIHNlbGYucmVwbGVudCA9IHNlbGYubWFrZV9lbnRyeSgiUmVwbGFjZSB3aXRoOiIsIHNlbGYucmVwbHZhcikKKworICAgIGRlZiBjcmVhdGVfY29tbWFuZF9idXR0b25zKHNlbGYpOgorICAgICAgICBTZWFyY2hEaWFsb2dCYXNlLmNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoc2VsZikKKyAgICAgICAgc2VsZi5tYWtlX2J1dHRvbigiRmluZCIsIHNlbGYuZmluZF9pdCkKKyAgICAgICAgc2VsZi5tYWtlX2J1dHRvbigiUmVwbGFjZSIsIHNlbGYucmVwbGFjZV9pdCkKKyAgICAgICAgc2VsZi5tYWtlX2J1dHRvbigiUmVwbGFjZStGaW5kIiwgc2VsZi5kZWZhdWx0X2NvbW1hbmQsIDEpCisgICAgICAgIHNlbGYubWFrZV9idXR0b24oIlJlcGxhY2UgQWxsIiwgc2VsZi5yZXBsYWNlX2FsbCkKKworICAgIGRlZiBmaW5kX2l0KHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLmRvX2ZpbmQoMCkKKworICAgIGRlZiByZXBsYWNlX2l0KHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLmRvX2ZpbmQoc2VsZi5vayk6CisgICAgICAgICAgICBzZWxmLmRvX3JlcGxhY2UoKQorCisgICAgZGVmIGRlZmF1bHRfY29tbWFuZChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5kb19maW5kKHNlbGYub2spOgorICAgICAgICAgICAgaWYgc2VsZi5kb19yZXBsYWNlKCk6ICAgIyBPbmx5IGZpbmQgbmV4dCBtYXRjaCBpZiByZXBsYWNlIHN1Y2NlZWRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQSBiYWQgcmUgY2FuIGNhdXNlIGEgaXQgdG8gZmFpbC4KKyAgICAgICAgICAgICAgICBzZWxmLmRvX2ZpbmQoMCkKKworICAgIGRlZiBfcmVwbGFjZV9leHBhbmQoc2VsZiwgbSwgcmVwbCk6CisgICAgICAgICIiIiBIZWxwZXIgZnVuY3Rpb24gZm9yIGV4cGFuZGluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAgICAgICAgaW4gdGhlIHJlcGxhY2UgZmllbGQsIGlmIG5lZWRlZC4gIiIiCisgICAgICAgIGlmIHNlbGYuZW5naW5lLmlzcmUoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuZXcgPSBtLmV4cGFuZChyZXBsKQorICAgICAgICAgICAgZXhjZXB0IHJlLmVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZW5naW5lLnJlcG9ydF9lcnJvcihyZXBsLCAnSW52YWxpZCBSZXBsYWNlIEV4cHJlc3Npb24nKQorICAgICAgICAgICAgICAgIG5ldyA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ldyA9IHJlcGwKKyAgICAgICAgcmV0dXJuIG5ldworCisgICAgZGVmIHJlcGxhY2VfYWxsKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBwcm9nID0gc2VsZi5lbmdpbmUuZ2V0cHJvZygpCisgICAgICAgIGlmIG5vdCBwcm9nOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJlcGwgPSBzZWxmLnJlcGx2YXIuZ2V0KCkKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICByZXMgPSBzZWxmLmVuZ2luZS5zZWFyY2hfdGV4dCh0ZXh0LCBwcm9nKQorICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgdGV4dC5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoInNlbCIsICIxLjAiLCAiZW5kIikKKyAgICAgICAgdGV4dC50YWdfcmVtb3ZlKCJoaXQiLCAiMS4wIiwgImVuZCIpCisgICAgICAgIGxpbmUgPSByZXNbMF0KKyAgICAgICAgY29sID0gcmVzWzFdLnN0YXJ0KCkKKyAgICAgICAgaWYgc2VsZi5lbmdpbmUuaXN3cmFwKCk6CisgICAgICAgICAgICBsaW5lID0gMQorICAgICAgICAgICAgY29sID0gMAorICAgICAgICBvayA9IDEKKyAgICAgICAgZmlyc3QgPSBsYXN0ID0gTm9uZQorICAgICAgICAjIFhYWCBvdWdodCB0byByZXBsYWNlIGNpcmN1bGFyIGluc3RlYWQgb2YgdG9wLXRvLWJvdHRvbSB3aGVuIHdyYXBwaW5nCisgICAgICAgIHRleHQudW5kb19ibG9ja19zdGFydCgpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICByZXMgPSBzZWxmLmVuZ2luZS5zZWFyY2hfZm9yd2FyZCh0ZXh0LCBwcm9nLCBsaW5lLCBjb2wsIDAsIG9rKQorICAgICAgICAgICAgaWYgbm90IHJlczoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgbGluZSwgbSA9IHJlcworICAgICAgICAgICAgY2hhcnMgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lLCAiJWQuMCIgJSAobGluZSsxKSkKKyAgICAgICAgICAgIG9yaWcgPSBtLmdyb3VwKCkKKyAgICAgICAgICAgIG5ldyA9IHNlbGYuX3JlcGxhY2VfZXhwYW5kKG0sIHJlcGwpCisgICAgICAgICAgICBpZiBuZXcgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaSwgaiA9IG0uc3BhbigpCisgICAgICAgICAgICBmaXJzdCA9ICIlZC4lZCIgJSAobGluZSwgaSkKKyAgICAgICAgICAgIGxhc3QgPSAiJWQuJWQiICUgKGxpbmUsIGopCisgICAgICAgICAgICBpZiBuZXcgPT0gb3JpZzoKKyAgICAgICAgICAgICAgICB0ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBsYXN0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBmaXJzdCkKKyAgICAgICAgICAgICAgICBpZiBmaXJzdCAhPSBsYXN0OgorICAgICAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZShmaXJzdCwgbGFzdCkKKyAgICAgICAgICAgICAgICBpZiBuZXc6CisgICAgICAgICAgICAgICAgICAgIHRleHQuaW5zZXJ0KGZpcnN0LCBuZXcpCisgICAgICAgICAgICBjb2wgPSBpICsgbGVuKG5ldykKKyAgICAgICAgICAgIG9rID0gMAorICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RvcCgpCisgICAgICAgIGlmIGZpcnN0IGFuZCBsYXN0OgorICAgICAgICAgICAgc2VsZi5zaG93X2hpdChmaXJzdCwgbGFzdCkKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgZG9fZmluZChzZWxmLCBvaz0wKToKKyAgICAgICAgaWYgbm90IHNlbGYuZW5naW5lLmdldHByb2coKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHJlcyA9IHNlbGYuZW5naW5lLnNlYXJjaF90ZXh0KHRleHQsIE5vbmUsIG9rKQorICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgdGV4dC5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBsaW5lLCBtID0gcmVzCisgICAgICAgIGksIGogPSBtLnNwYW4oKQorICAgICAgICBmaXJzdCA9ICIlZC4lZCIgJSAobGluZSwgaSkKKyAgICAgICAgbGFzdCA9ICIlZC4lZCIgJSAobGluZSwgaikKKyAgICAgICAgc2VsZi5zaG93X2hpdChmaXJzdCwgbGFzdCkKKyAgICAgICAgc2VsZi5vayA9IDEKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBkb19yZXBsYWNlKHNlbGYpOgorICAgICAgICBwcm9nID0gc2VsZi5lbmdpbmUuZ2V0cHJvZygpCisgICAgICAgIGlmIG5vdCBwcm9nOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlyc3QgPSBwb3MgPSB0ZXh0LmluZGV4KCJzZWwuZmlyc3QiKQorICAgICAgICAgICAgbGFzdCA9IHRleHQuaW5kZXgoInNlbC5sYXN0IikKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgcG9zID0gTm9uZQorICAgICAgICBpZiBub3QgcG9zOgorICAgICAgICAgICAgZmlyc3QgPSBsYXN0ID0gcG9zID0gdGV4dC5pbmRleCgiaW5zZXJ0IikKKyAgICAgICAgbGluZSwgY29sID0gU2VhcmNoRW5naW5lLmdldF9saW5lX2NvbChwb3MpCisgICAgICAgIGNoYXJzID0gdGV4dC5nZXQoIiVkLjAiICUgbGluZSwgIiVkLjAiICUgKGxpbmUrMSkpCisgICAgICAgIG0gPSBwcm9nLm1hdGNoKGNoYXJzLCBjb2wpCisgICAgICAgIGlmIG5vdCBwcm9nOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIG5ldyA9IHNlbGYuX3JlcGxhY2VfZXhwYW5kKG0sIHNlbGYucmVwbHZhci5nZXQoKSkKKyAgICAgICAgaWYgbmV3IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgdGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgZmlyc3QpCisgICAgICAgIHRleHQudW5kb19ibG9ja19zdGFydCgpCisgICAgICAgIGlmIG0uZ3JvdXAoKToKKyAgICAgICAgICAgIHRleHQuZGVsZXRlKGZpcnN0LCBsYXN0KQorICAgICAgICBpZiBuZXc6CisgICAgICAgICAgICB0ZXh0Lmluc2VydChmaXJzdCwgbmV3KQorICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RvcCgpCisgICAgICAgIHNlbGYuc2hvd19oaXQoZmlyc3QsIHRleHQuaW5kZXgoImluc2VydCIpKQorICAgICAgICBzZWxmLm9rID0gMAorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNob3dfaGl0KHNlbGYsIGZpcnN0LCBsYXN0KToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICB0ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBmaXJzdCkKKyAgICAgICAgdGV4dC50YWdfcmVtb3ZlKCJzZWwiLCAiMS4wIiwgImVuZCIpCisgICAgICAgIHRleHQudGFnX2FkZCgic2VsIiwgZmlyc3QsIGxhc3QpCisgICAgICAgIHRleHQudGFnX3JlbW92ZSgiaGl0IiwgIjEuMCIsICJlbmQiKQorICAgICAgICBpZiBmaXJzdCA9PSBsYXN0OgorICAgICAgICAgICAgdGV4dC50YWdfYWRkKCJoaXQiLCBmaXJzdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRleHQudGFnX2FkZCgiaGl0IiwgZmlyc3QsIGxhc3QpCisgICAgICAgIHRleHQuc2VlKCJpbnNlcnQiKQorICAgICAgICB0ZXh0LnVwZGF0ZV9pZGxldGFza3MoKQorCisgICAgZGVmIGNsb3NlKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBTZWFyY2hEaWFsb2dCYXNlLmNsb3NlKHNlbGYsIGV2ZW50KQorICAgICAgICBzZWxmLnRleHQudGFnX3JlbW92ZSgiaGl0IiwgIjEuMCIsICJlbmQiKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNzU2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlcGxhY2VEaWFsb2cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNzU2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JzdHJpcEV4dGVuc2lvbi5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Sc3RyaXBFeHRlbnNpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllMzVkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Sc3RyaXBFeHRlbnNpb24ucHkKQEAgLTAsMCArMSwyOSBAQAorJ1Byb3ZpZGVzICJTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlIiB1bmRlciB0aGUgIkZvcm1hdCIgbWVudS4nCisKK19fYXV0aG9yX18gPSAiUm9nZXIgRC4gU2Vyd3kgPHJvZ2VyLnNlcnd5IGF0IGdtYWlsLmNvbT4iCisKK2NsYXNzIFJzdHJpcEV4dGVuc2lvbjoKKworICAgIG1lbnVkZWZzID0gWworICAgICAgICAoJ2Zvcm1hdCcsIFtOb25lLAorICAgICAgICAgICAgICAgKCdTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlJywgJzw8ZG8tcnN0cmlwPj4nKSwKKyAgICAgICBdKSxdCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbik6CisgICAgICAgIHNlbGYuZWRpdHdpbiA9IGVkaXR3aW4KKyAgICAgICAgc2VsZi5lZGl0d2luLnRleHQuYmluZCgiPDxkby1yc3RyaXA+PiIsIHNlbGYuZG9fcnN0cmlwKQorCisgICAgZGVmIGRvX3JzdHJpcChzZWxmLCBldmVudD1Ob25lKToKKworICAgICAgICB0ZXh0ID0gc2VsZi5lZGl0d2luLnRleHQKKyAgICAgICAgdW5kbyA9IHNlbGYuZWRpdHdpbi51bmRvCisKKyAgICAgICAgdW5kby51bmRvX2Jsb2NrX3N0YXJ0KCkKKworICAgICAgICBlbmRfbGluZSA9IGludChmbG9hdCh0ZXh0LmluZGV4KCdlbmQnKSkpICsgMQorICAgICAgICBmb3IgY3VyIGluIHJhbmdlKDEsIGVuZF9saW5lKToKKyAgICAgICAgICAgIHR4dCA9IHRleHQuZ2V0KCclaS4wJyAlIGN1ciwgJyVpLjAgbGluZWVuZCcgJSBjdXIpCisgICAgICAgICAgICBjdXQgPSBsZW4odHh0LnJzdHJpcCgpKQorICAgICAgICAgICAgdGV4dC5kZWxldGUoJyVpLiVpJyAlIChjdXIsIGN1dCksICclaS4wIGxpbmVlbmQnICUgY3VyKQorCisgICAgICAgIHVuZG8udW5kb19ibG9ja19zdG9wKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9Sc3RyaXBFeHRlbnNpb24ucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JzdHJpcEV4dGVuc2lvbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2YmY4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Sc3RyaXBFeHRlbnNpb24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9Sc3RyaXBFeHRlbnNpb24ucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JzdHJpcEV4dGVuc2lvbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2YmY4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Sc3RyaXBFeHRlbnNpb24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhYzQ3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5CkBAIC0wLDAgKzEsMjIzIEBACisiIiJFeHRlbnNpb24gdG8gZXhlY3V0ZSBjb2RlIG91dHNpZGUgdGhlIFB5dGhvbiBzaGVsbCB3aW5kb3cuCisKK1RoaXMgYWRkcyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorCistIENoZWNrIG1vZHVsZSBkb2VzIGEgZnVsbCBzeW50YXggY2hlY2sgb2YgdGhlIGN1cnJlbnQgbW9kdWxlLgorICBJdCBhbHNvIHJ1bnMgdGhlIHRhYm5hbm55IHRvIGNhdGNoIGFueSBpbmNvbnNpc3RlbnQgdGFicy4KKworLSBSdW4gbW9kdWxlIGV4ZWN1dGVzIHRoZSBtb2R1bGUncyBjb2RlIGluIHRoZSBfX21haW5fXyBuYW1lc3BhY2UuICBUaGUgd2luZG93CisgIG11c3QgaGF2ZSBiZWVuIHNhdmVkIHByZXZpb3VzbHkuIFRoZSBtb2R1bGUgaXMgYWRkZWQgdG8gc3lzLm1vZHVsZXMsIGFuZCBpcworICBhbHNvIGFkZGVkIHRvIHRoZSBfX21haW5fXyBuYW1lc3BhY2UuCisKK1hYWCBHdlIgUmVkZXNpZ24gdGhpcyBpbnRlcmZhY2UgKHlldCBhZ2FpbikgYXMgZm9sbG93czoKKworLSBQcmVzZW50IGEgZGlhbG9nIGJveCBmb3IgYGBSdW4gTW9kdWxlJycKKworLSBBbGxvdyBzcGVjaWZ5IGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW4gdGhlIGRpYWxvZyBib3gKKworIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgdGFibmFubnkKK2ltcG9ydCB0b2tlbml6ZQoraW1wb3J0IHRrTWVzc2FnZUJveAorZnJvbSBpZGxlbGliIGltcG9ydCBQeVNoZWxsCisKK2Zyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0CisKK0lERU5UQ0hBUlMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAiXyIKKworaW5kZW50X21lc3NhZ2UgPSAiIiJFcnJvcjogSW5jb25zaXN0ZW50IGluZGVudGF0aW9uIGRldGVjdGVkIQorCisxKSBZb3VyIGluZGVudGF0aW9uIGlzIG91dHJpZ2h0IGluY29ycmVjdCAoZWFzeSB0byBmaXgpLCBPUgorCisyKSBZb3VyIGluZGVudGF0aW9uIG1peGVzIHRhYnMgYW5kIHNwYWNlcy4KKworVG8gZml4IGNhc2UgMiwgY2hhbmdlIGFsbCB0YWJzIHRvIHNwYWNlcyBieSB1c2luZyBFZGl0LT5TZWxlY3QgQWxsIGZvbGxvd2VkIFwKK2J5IEZvcm1hdC0+VW50YWJpZnkgUmVnaW9uIGFuZCBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyB1c2VkIGJ5IGVhY2ggdGFiLgorIiIiCisKK2NsYXNzIFNjcmlwdEJpbmRpbmc6CisKKyAgICBtZW51ZGVmcyA9IFsKKyAgICAgICAgKCdydW4nLCBbTm9uZSwKKyAgICAgICAgICAgICAgICAgKCdDaGVjayBNb2R1bGUnLCAnPDxjaGVjay1tb2R1bGU+PicpLAorICAgICAgICAgICAgICAgICAoJ1J1biBNb2R1bGUnLCAnPDxydW4tbW9kdWxlPj4nKSwgXSksIF0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlZGl0d2luKToKKyAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgorICAgICAgICAjIFByb3ZpZGUgaW5zdGFuY2UgdmFyaWFibGVzIHJlZmVyZW5jZWQgYnkgRGVidWdnZXIKKyAgICAgICAgIyBYWFggVGhpcyBzaG91bGQgYmUgZG9uZSBkaWZmZXJlbnRseQorICAgICAgICBzZWxmLmZsaXN0ID0gc2VsZi5lZGl0d2luLmZsaXN0CisgICAgICAgIHNlbGYucm9vdCA9IHNlbGYuZWRpdHdpbi5yb290CisKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgICAgIHNlbGYuZWRpdHdpbi50ZXh0X2ZyYW1lLmJpbmQoJzw8cnVuLW1vZHVsZS1ldmVudC0yPj4nLCBzZWxmLl9ydW5fbW9kdWxlX2V2ZW50KQorCisgICAgZGVmIGNoZWNrX21vZHVsZV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRmaWxlbmFtZSgpCisgICAgICAgIGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgICAgIHJldHVybiAnYnJlYWsnCisgICAgICAgIGlmIG5vdCBzZWxmLmNoZWNrc3ludGF4KGZpbGVuYW1lKToKKyAgICAgICAgICAgIHJldHVybiAnYnJlYWsnCisgICAgICAgIGlmIG5vdCBzZWxmLnRhYm5hbm55KGZpbGVuYW1lKToKKyAgICAgICAgICAgIHJldHVybiAnYnJlYWsnCisKKyAgICBkZWYgdGFibmFubnkoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3InKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YWJuYW5ueS5wcm9jZXNzX3Rva2Vucyh0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoZi5yZWFkbGluZSkpCisgICAgICAgIGV4Y2VwdCB0b2tlbml6ZS5Ub2tlbkVycm9yLCBtc2c6CisgICAgICAgICAgICBtc2d0eHQsIChsaW5lbm8sIHN0YXJ0KSA9IG1zZworICAgICAgICAgICAgc2VsZi5lZGl0d2luLmdvdG9saW5lKGxpbmVubykKKyAgICAgICAgICAgIHNlbGYuZXJyb3Jib3goIlRhYm5hbm55IFRva2VuaXppbmcgRXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9rZW4gRXJyb3I6ICVzIiAlIG1zZ3R4dCkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBleGNlcHQgdGFibmFubnkuTmFubnlOYWcsIG5hZzoKKyAgICAgICAgICAgICMgVGhlIGVycm9yIG1lc3NhZ2VzIGZyb20gdGFibmFubnkgYXJlIHRvbyBjb25mdXNpbmcuLi4KKyAgICAgICAgICAgIHNlbGYuZWRpdHdpbi5nb3RvbGluZShuYWcuZ2V0X2xpbmVubygpKQorICAgICAgICAgICAgc2VsZi5lcnJvcmJveCgiVGFiL3NwYWNlIGVycm9yIiwgaW5kZW50X21lc3NhZ2UpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBjaGVja3N5bnRheChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYuc2hlbGwgPSBzaGVsbCA9IHNlbGYuZmxpc3Qub3Blbl9zaGVsbCgpCisgICAgICAgIHNhdmVkX3N0cmVhbSA9IHNoZWxsLmdldF93YXJuaW5nX3N0cmVhbSgpCisgICAgICAgIHNoZWxsLnNldF93YXJuaW5nX3N0cmVhbShzaGVsbC5zdGRlcnIpCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAncicpCisgICAgICAgIHNvdXJjZSA9IGYucmVhZCgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBpZiAnXHInIGluIHNvdXJjZToKKyAgICAgICAgICAgIHNvdXJjZSA9IHJlLnN1YihyIlxyXG4iLCAiXG4iLCBzb3VyY2UpCisgICAgICAgICAgICBzb3VyY2UgPSByZS5zdWIociJcciIsICJcbiIsIHNvdXJjZSkKKyAgICAgICAgaWYgc291cmNlIGFuZCBzb3VyY2VbLTFdICE9ICdcbic6CisgICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2UgKyAnXG4nCisgICAgICAgIHRleHQgPSBzZWxmLmVkaXR3aW4udGV4dAorICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoIkVSUk9SIiwgIjEuMCIsICJlbmQiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBJZiBzdWNjZXNzZnVsLCByZXR1cm4gdGhlIGNvbXBpbGVkIGNvZGUKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcGlsZShzb3VyY2UsIGZpbGVuYW1lLCAiZXhlYyIpCisgICAgICAgICAgICBleGNlcHQgKFN5bnRheEVycm9yLCBPdmVyZmxvd0Vycm9yLCBWYWx1ZUVycm9yKSwgZXJyOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbXNnLCAoZXJyb3JmaWxlbmFtZSwgbGluZW5vLCBvZmZzZXQsIGxpbmUpID0gZXJyCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBlcnJvcmZpbGVuYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgZXJyLmFyZ3MgPSBtc2csIChmaWxlbmFtZSwgbGluZW5vLCBvZmZzZXQsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbG9yaXplX3N5bnRheF9lcnJvcihtc2csIGxpbmVubywgb2Zmc2V0KQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gIioqKiAiICsgc3RyKGVycikKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yYm94KCJTeW50YXggZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZXJlJ3MgYW4gZXJyb3IgaW4geW91ciBwcm9ncmFtOlxuIiArIG1zZykKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNoZWxsLnNldF93YXJuaW5nX3N0cmVhbShzYXZlZF9zdHJlYW0pCisKKyAgICBkZWYgY29sb3JpemVfc3ludGF4X2Vycm9yKHNlbGYsIG1zZywgbGluZW5vLCBvZmZzZXQpOgorICAgICAgICB0ZXh0ID0gc2VsZi5lZGl0d2luLnRleHQKKyAgICAgICAgcG9zID0gIjAuMCArICVkIGxpbmVzICsgJWQgY2hhcnMiICUgKGxpbmVuby0xLCBvZmZzZXQtMSkKKyAgICAgICAgdGV4dC50YWdfYWRkKCJFUlJPUiIsIHBvcykKKyAgICAgICAgY2hhciA9IHRleHQuZ2V0KHBvcykKKyAgICAgICAgaWYgY2hhciBhbmQgY2hhciBpbiBJREVOVENIQVJTOgorICAgICAgICAgICAgdGV4dC50YWdfYWRkKCJFUlJPUiIsIHBvcyArICIgd29yZHN0YXJ0IiwgcG9zKQorICAgICAgICBpZiAnXG4nID09IHRleHQuZ2V0KHBvcyk6ICAgIyBlcnJvciBhdCBsaW5lIGVuZAorICAgICAgICAgICAgdGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgcG9zKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgcG9zICsgIisxYyIpCisgICAgICAgIHRleHQuc2VlKHBvcykKKworICAgIGRlZiBydW5fbW9kdWxlX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgIiIiUnVuIHRoZSBtb2R1bGUgYWZ0ZXIgc2V0dGluZyB1cCB0aGUgZW52aXJvbm1lbnQuCisKKyAgICAgICAgRmlyc3QgY2hlY2sgdGhlIHN5bnRheC4gIElmIE9LLCBtYWtlIHN1cmUgdGhlIHNoZWxsIGlzIGFjdGl2ZSBhbmQKKyAgICAgICAgdGhlbiB0cmFuc2ZlciB0aGUgYXJndW1lbnRzLCBzZXQgdGhlIHJ1biBlbnZpcm9ubWVudCdzIHdvcmtpbmcKKyAgICAgICAgZGlyZWN0b3J5IHRvIHRoZSBkaXJlY3Rvcnkgb2YgdGhlIG1vZHVsZSBiZWluZyBleGVjdXRlZCBhbmQgYWxzbworICAgICAgICBhZGQgdGhhdCBkaXJlY3RvcnkgdG8gaXRzIHN5cy5wYXRoIGlmIG5vdCBhbHJlYWR5IGluY2x1ZGVkLgorCisgICAgICAgICIiIgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuZ2V0ZmlsZW5hbWUoKQorICAgICAgICBpZiBub3QgZmlsZW5hbWU6CisgICAgICAgICAgICByZXR1cm4gJ2JyZWFrJworICAgICAgICBjb2RlID0gc2VsZi5jaGVja3N5bnRheChmaWxlbmFtZSkKKyAgICAgICAgaWYgbm90IGNvZGU6CisgICAgICAgICAgICByZXR1cm4gJ2JyZWFrJworICAgICAgICBpZiBub3Qgc2VsZi50YWJuYW5ueShmaWxlbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gJ2JyZWFrJworICAgICAgICBpbnRlcnAgPSBzZWxmLnNoZWxsLmludGVycAorICAgICAgICBpZiBQeVNoZWxsLnVzZV9zdWJwcm9jZXNzOgorICAgICAgICAgICAgaW50ZXJwLnJlc3RhcnRfc3VicHJvY2Vzcyh3aXRoX2N3ZD1GYWxzZSkKKyAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSkKKyAgICAgICAgIyBYWFggVG9vIG9mdGVuIHRoaXMgZGlzY2FyZHMgYXJndW1lbnRzIHRoZSB1c2VyIGp1c3Qgc2V0Li4uCisgICAgICAgIGludGVycC5ydW5jb21tYW5kKCIiImlmIDE6CisgICAgICAgICAgICBfZmlsZW5hbWUgPSAlcgorICAgICAgICAgICAgaW1wb3J0IHN5cyBhcyBfc3lzCisgICAgICAgICAgICBmcm9tIG9zLnBhdGggaW1wb3J0IGJhc2VuYW1lIGFzIF9iYXNlbmFtZQorICAgICAgICAgICAgaWYgKG5vdCBfc3lzLmFyZ3Ygb3IKKyAgICAgICAgICAgICAgICBfYmFzZW5hbWUoX3N5cy5hcmd2WzBdKSAhPSBfYmFzZW5hbWUoX2ZpbGVuYW1lKSk6CisgICAgICAgICAgICAgICAgX3N5cy5hcmd2ID0gW19maWxlbmFtZV0KKyAgICAgICAgICAgIGltcG9ydCBvcyBhcyBfb3MKKyAgICAgICAgICAgIF9vcy5jaGRpciglcikKKyAgICAgICAgICAgIGRlbCBfZmlsZW5hbWUsIF9zeXMsIF9iYXNlbmFtZSwgX29zCisgICAgICAgICAgICBcbiIiIiAlIChmaWxlbmFtZSwgZGlybmFtZSkpCisgICAgICAgIGludGVycC5wcmVwZW5kX3N5c3BhdGgoZmlsZW5hbWUpCisgICAgICAgICMgWFhYIEtCSyAwM0p1bDA0IFdoZW4gcnVuIHcvbyBzdWJwcm9jZXNzLCBydW50aW1lIHdhcm5pbmdzIHN0aWxsCisgICAgICAgICMgICAgICAgICBnbyB0byBfX3N0ZGVycl9fLiAgV2l0aCBzdWJwcm9jZXNzLCB0aGV5IGdvIHRvIHRoZSBzaGVsbC4KKyAgICAgICAgIyAgICAgICAgIE5lZWQgdG8gY2hhbmdlIHN0cmVhbXMgaW4gUHlTaGVsbC5Nb2RpZmllZEludGVycHJldGVyLgorICAgICAgICBpbnRlcnAucnVuY29kZShjb2RlKQorICAgICAgICByZXR1cm4gJ2JyZWFrJworCisgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgIyBUay1Db2NvYSBpbiBNYWNPU1ggaXMgYnJva2VuIHVudGlsIGF0IGxlYXN0CisgICAgICAgICMgVGsgOC41LjksIGFuZCB3aXRob3V0IHRoaXMgcmF0aGVyCisgICAgICAgICMgY3J1ZGUgd29ya2Fyb3VuZCBJRExFIHdvdWxkIGhhbmcgd2hlbiBhIHVzZXIKKyAgICAgICAgIyB0cmllcyB0byBydW4gYSBtb2R1bGUgdXNpbmcgdGhlIGtleWJvYXJkIHNob3J0Y3V0CisgICAgICAgICMgKHRoZSBtZW51IGl0ZW0gd29ya3MgZmluZSkuCisgICAgICAgIF9ydW5fbW9kdWxlX2V2ZW50ID0gcnVuX21vZHVsZV9ldmVudAorCisgICAgICAgIGRlZiBydW5fbW9kdWxlX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgICAgIHNlbGYuZWRpdHdpbi50ZXh0X2ZyYW1lLmFmdGVyKDIwMCwKKyAgICAgICAgICAgICAgICBsYW1iZGE6IHNlbGYuZWRpdHdpbi50ZXh0X2ZyYW1lLmV2ZW50X2dlbmVyYXRlKCc8PHJ1bi1tb2R1bGUtZXZlbnQtMj4+JykpCisgICAgICAgICAgICByZXR1cm4gJ2JyZWFrJworCisgICAgZGVmIGdldGZpbGVuYW1lKHNlbGYpOgorICAgICAgICAiIiJHZXQgc291cmNlIGZpbGVuYW1lLiAgSWYgbm90IHNhdmVkLCBvZmZlciB0byBzYXZlIChvciBjcmVhdGUpIGZpbGUKKworICAgICAgICBUaGUgZGVidWdnZXIgcmVxdWlyZXMgYSBzb3VyY2UgZmlsZS4gIE1ha2Ugc3VyZSB0aGVyZSBpcyBvbmUsIGFuZCB0aGF0CisgICAgICAgIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHNvdXJjZSBidWZmZXIgaGFzIGJlZW4gc2F2ZWQuICBJZiB0aGUgdXNlcgorICAgICAgICBkZWNsaW5lcyB0byBzYXZlIG9yIGNhbmNlbHMgdGhlIFNhdmUgQXMgZGlhbG9nLCByZXR1cm4gTm9uZS4KKworICAgICAgICBJZiB0aGUgdXNlciBoYXMgY29uZmlndXJlZCBJRExFIGZvciBBdXRvc2F2ZSwgdGhlIGZpbGUgd2lsbCBiZQorICAgICAgICBzaWxlbnRseSBzYXZlZCBpZiBpdCBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgZGlydHkuCisKKyAgICAgICAgIiIiCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5lZGl0d2luLmlvLmZpbGVuYW1lCisgICAgICAgIGlmIG5vdCBzZWxmLmVkaXR3aW4uZ2V0X3NhdmVkKCk6CisgICAgICAgICAgICBhdXRvc2F2ZSA9IGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdHZW5lcmFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhdXRvc2F2ZScsIHR5cGU9J2Jvb2wnKQorICAgICAgICAgICAgaWYgYXV0b3NhdmUgYW5kIGZpbGVuYW1lOgorICAgICAgICAgICAgICAgIHNlbGYuZWRpdHdpbi5pby5zYXZlKE5vbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbmZpcm0gPSBzZWxmLmFza19zYXZlX2RpYWxvZygpCisgICAgICAgICAgICAgICAgc2VsZi5lZGl0d2luLnRleHQuZm9jdXNfc2V0KCkKKyAgICAgICAgICAgICAgICBpZiBjb25maXJtOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVkaXR3aW4uaW8uc2F2ZShOb25lKQorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYuZWRpdHdpbi5pby5maWxlbmFtZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gTm9uZQorICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBhc2tfc2F2ZV9kaWFsb2coc2VsZik6CisgICAgICAgIG1zZyA9ICJTb3VyY2UgTXVzdCBCZSBTYXZlZFxuIiArIDUqJyAnICsgIk9LIHRvIFNhdmU/IgorICAgICAgICBjb25maXJtID0gdGtNZXNzYWdlQm94LmFza29rY2FuY2VsKHRpdGxlPSJTYXZlIEJlZm9yZSBSdW4gb3IgQ2hlY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9bXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9dGtNZXNzYWdlQm94Lk9LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3Rlcj1zZWxmLmVkaXR3aW4udGV4dCkKKyAgICAgICAgcmV0dXJuIGNvbmZpcm0KKworICAgIGRlZiBlcnJvcmJveChzZWxmLCB0aXRsZSwgbWVzc2FnZSk6CisgICAgICAgICMgWFhYIFRoaXMgc2hvdWxkIHJlYWxseSBiZSBhIGZ1bmN0aW9uIG9mIEVkaXRvcldpbmRvdy4uLgorICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlLCBtZXNzYWdlLCBtYXN0ZXI9c2VsZi5lZGl0d2luLnRleHQpCisgICAgICAgIHNlbGYuZWRpdHdpbi50ZXh0LmZvY3VzX3NldCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2NyaXB0QmluZGluZy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2NyaXB0QmluZGluZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyZTQzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2NyaXB0QmluZGluZy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2NyaXB0QmluZGluZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyZTQzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Njcm9sbGVkTGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjExOTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Njcm9sbGVkTGlzdC5weQpAQCAtMCwwICsxLDEzOSBAQAorZnJvbSBUa2ludGVyIGltcG9ydCAqCisKK2NsYXNzIFNjcm9sbGVkTGlzdDoKKworICAgIGRlZmF1bHQgPSAiKE5vbmUpIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgKipvcHRpb25zKToKKyAgICAgICAgIyBDcmVhdGUgdG9wIGZyYW1lLCB3aXRoIHNjcm9sbGJhciBhbmQgbGlzdGJveAorICAgICAgICBzZWxmLm1hc3RlciA9IG1hc3RlcgorICAgICAgICBzZWxmLmZyYW1lID0gZnJhbWUgPSBGcmFtZShtYXN0ZXIpCisgICAgICAgIHNlbGYuZnJhbWUucGFjayhmaWxsPSJib3RoIiwgZXhwYW5kPTEpCisgICAgICAgIHNlbGYudmJhciA9IHZiYXIgPSBTY3JvbGxiYXIoZnJhbWUsIG5hbWU9InZiYXIiKQorICAgICAgICBzZWxmLnZiYXIucGFjayhzaWRlPSJyaWdodCIsIGZpbGw9InkiKQorICAgICAgICBzZWxmLmxpc3Rib3ggPSBsaXN0Ym94ID0gTGlzdGJveChmcmFtZSwgZXhwb3J0c2VsZWN0aW9uPTAsCisgICAgICAgICAgICBiYWNrZ3JvdW5kPSJ3aGl0ZSIpCisgICAgICAgIGlmIG9wdGlvbnM6CisgICAgICAgICAgICBsaXN0Ym94LmNvbmZpZ3VyZShvcHRpb25zKQorICAgICAgICBsaXN0Ym94LnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQorICAgICAgICAjIFRpZSBsaXN0Ym94IGFuZCBzY3JvbGxiYXIgdG9nZXRoZXIKKyAgICAgICAgdmJhclsiY29tbWFuZCJdID0gbGlzdGJveC55dmlldworICAgICAgICBsaXN0Ym94WyJ5c2Nyb2xsY29tbWFuZCJdID0gdmJhci5zZXQKKyAgICAgICAgIyBCaW5kIGV2ZW50cyB0byB0aGUgbGlzdCBib3gKKyAgICAgICAgbGlzdGJveC5iaW5kKCI8QnV0dG9uUmVsZWFzZS0xPiIsIHNlbGYuY2xpY2tfZXZlbnQpCisgICAgICAgIGxpc3Rib3guYmluZCgiPERvdWJsZS1CdXR0b25SZWxlYXNlLTE+Iiwgc2VsZi5kb3VibGVfY2xpY2tfZXZlbnQpCisgICAgICAgIGxpc3Rib3guYmluZCgiPEJ1dHRvblByZXNzLTM+Iiwgc2VsZi5wb3B1cF9ldmVudCkKKyAgICAgICAgbGlzdGJveC5iaW5kKCI8S2V5LVVwPiIsIHNlbGYudXBfZXZlbnQpCisgICAgICAgIGxpc3Rib3guYmluZCgiPEtleS1Eb3duPiIsIHNlbGYuZG93bl9ldmVudCkKKyAgICAgICAgIyBNYXJrIGFzIGVtcHR5CisgICAgICAgIHNlbGYuY2xlYXIoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmZyYW1lLmRlc3Ryb3koKQorCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLmxpc3Rib3guZGVsZXRlKDAsICJlbmQiKQorICAgICAgICBzZWxmLmVtcHR5ID0gMQorICAgICAgICBzZWxmLmxpc3Rib3guaW5zZXJ0KCJlbmQiLCBzZWxmLmRlZmF1bHQpCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIGl0ZW0pOgorICAgICAgICBpZiBzZWxmLmVtcHR5OgorICAgICAgICAgICAgc2VsZi5saXN0Ym94LmRlbGV0ZSgwLCAiZW5kIikKKyAgICAgICAgICAgIHNlbGYuZW1wdHkgPSAwCisgICAgICAgIHNlbGYubGlzdGJveC5pbnNlcnQoImVuZCIsIHN0cihpdGVtKSkKKworICAgIGRlZiBnZXQoc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gc2VsZi5saXN0Ym94LmdldChpbmRleCkKKworICAgIGRlZiBjbGlja19ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYubGlzdGJveC5hY3RpdmF0ZSgiQCVkLCVkIiAlIChldmVudC54LCBldmVudC55KSkKKyAgICAgICAgaW5kZXggPSBzZWxmLmxpc3Rib3guaW5kZXgoImFjdGl2ZSIpCisgICAgICAgIHNlbGYuc2VsZWN0KGluZGV4KQorICAgICAgICBzZWxmLm9uX3NlbGVjdChpbmRleCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBkb3VibGVfY2xpY2tfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBpbmRleCA9IHNlbGYubGlzdGJveC5pbmRleCgiYWN0aXZlIikKKyAgICAgICAgc2VsZi5zZWxlY3QoaW5kZXgpCisgICAgICAgIHNlbGYub25fZG91YmxlKGluZGV4KQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgbWVudSA9IE5vbmUKKworICAgIGRlZiBwb3B1cF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGlmIG5vdCBzZWxmLm1lbnU6CisgICAgICAgICAgICBzZWxmLm1ha2VfbWVudSgpCisgICAgICAgIG1lbnUgPSBzZWxmLm1lbnUKKyAgICAgICAgc2VsZi5saXN0Ym94LmFjdGl2YXRlKCJAJWQsJWQiICUgKGV2ZW50LngsIGV2ZW50LnkpKQorICAgICAgICBpbmRleCA9IHNlbGYubGlzdGJveC5pbmRleCgiYWN0aXZlIikKKyAgICAgICAgc2VsZi5zZWxlY3QoaW5kZXgpCisgICAgICAgIG1lbnUudGtfcG9wdXAoZXZlbnQueF9yb290LCBldmVudC55X3Jvb3QpCisKKyAgICBkZWYgbWFrZV9tZW51KHNlbGYpOgorICAgICAgICBtZW51ID0gTWVudShzZWxmLmxpc3Rib3gsIHRlYXJvZmY9MCkKKyAgICAgICAgc2VsZi5tZW51ID0gbWVudQorICAgICAgICBzZWxmLmZpbGxfbWVudSgpCisKKyAgICBkZWYgdXBfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBpbmRleCA9IHNlbGYubGlzdGJveC5pbmRleCgiYWN0aXZlIikKKyAgICAgICAgaWYgc2VsZi5saXN0Ym94LnNlbGVjdGlvbl9pbmNsdWRlcyhpbmRleCk6CisgICAgICAgICAgICBpbmRleCA9IGluZGV4IC0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5kZXggPSBzZWxmLmxpc3Rib3guc2l6ZSgpIC0gMQorICAgICAgICBpZiBpbmRleCA8IDA6CisgICAgICAgICAgICBzZWxmLmxpc3Rib3guYmVsbCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNlbGVjdChpbmRleCkKKyAgICAgICAgICAgIHNlbGYub25fc2VsZWN0KGluZGV4KQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGRvd25fZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBpbmRleCA9IHNlbGYubGlzdGJveC5pbmRleCgiYWN0aXZlIikKKyAgICAgICAgaWYgc2VsZi5saXN0Ym94LnNlbGVjdGlvbl9pbmNsdWRlcyhpbmRleCk6CisgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5kZXggPSAwCisgICAgICAgIGlmIGluZGV4ID49IHNlbGYubGlzdGJveC5zaXplKCk6CisgICAgICAgICAgICBzZWxmLmxpc3Rib3guYmVsbCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNlbGVjdChpbmRleCkKKyAgICAgICAgICAgIHNlbGYub25fc2VsZWN0KGluZGV4KQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIHNlbGVjdChzZWxmLCBpbmRleCk6CisgICAgICAgIHNlbGYubGlzdGJveC5mb2N1c19zZXQoKQorICAgICAgICBzZWxmLmxpc3Rib3guYWN0aXZhdGUoaW5kZXgpCisgICAgICAgIHNlbGYubGlzdGJveC5zZWxlY3Rpb25fY2xlYXIoMCwgImVuZCIpCisgICAgICAgIHNlbGYubGlzdGJveC5zZWxlY3Rpb25fc2V0KGluZGV4KQorICAgICAgICBzZWxmLmxpc3Rib3guc2VlKGluZGV4KQorCisgICAgIyBNZXRob2RzIHRvIG92ZXJyaWRlIGZvciBzcGVjaWZpYyBhY3Rpb25zCisKKyAgICBkZWYgZmlsbF9tZW51KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgb25fc2VsZWN0KHNlbGYsIGluZGV4KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIG9uX2RvdWJsZShzZWxmLCBpbmRleCk6CisgICAgICAgIHBhc3MKKworCitkZWYgdGVzdCgpOgorICAgIHJvb3QgPSBUaygpCisgICAgcm9vdC5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHJvb3QuZGVzdHJveSkKKyAgICBjbGFzcyBNeVNjcm9sbGVkTGlzdChTY3JvbGxlZExpc3QpOgorICAgICAgICBkZWYgZmlsbF9tZW51KHNlbGYpOiBzZWxmLm1lbnUuYWRkX2NvbW1hbmQobGFiZWw9InBhc3MiKQorICAgICAgICBkZWYgb25fc2VsZWN0KHNlbGYsIGluZGV4KTogcHJpbnQgInNlbGVjdCIsIHNlbGYuZ2V0KGluZGV4KQorICAgICAgICBkZWYgb25fZG91YmxlKHNlbGYsIGluZGV4KTogcHJpbnQgImRvdWJsZSIsIHNlbGYuZ2V0KGluZGV4KQorICAgIHMgPSBNeVNjcm9sbGVkTGlzdChyb290KQorICAgIGZvciBpIGluIHJhbmdlKDMwKToKKyAgICAgICAgcy5hcHBlbmQoIml0ZW0gJTAyZCIgJSBpKQorICAgIHJldHVybiByb290CisKK2RlZiBtYWluKCk6CisgICAgcm9vdCA9IHRlc3QoKQorICAgIHJvb3QubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Njcm9sbGVkTGlzdC5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWNiMTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Njcm9sbGVkTGlzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Njcm9sbGVkTGlzdC5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWNiMTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Njcm9sbGVkTGlzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaERpYWxvZy5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3MGI4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHkKQEAgLTAsMCArMSw2OCBAQAorZnJvbSBUa2ludGVyIGltcG9ydCAqCisKK2Zyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lCitmcm9tIGlkbGVsaWIuU2VhcmNoRGlhbG9nQmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQorCitkZWYgX3NldHVwKHRleHQpOgorICAgIHJvb3QgPSB0ZXh0Ll9yb290KCkKKyAgICBlbmdpbmUgPSBTZWFyY2hFbmdpbmUuZ2V0KHJvb3QpCisgICAgaWYgbm90IGhhc2F0dHIoZW5naW5lLCAiX3NlYXJjaGRpYWxvZyIpOgorICAgICAgICBlbmdpbmUuX3NlYXJjaGRpYWxvZyA9IFNlYXJjaERpYWxvZyhyb290LCBlbmdpbmUpCisgICAgcmV0dXJuIGVuZ2luZS5fc2VhcmNoZGlhbG9nCisKK2RlZiBmaW5kKHRleHQpOgorICAgIHBhdCA9IHRleHQuZ2V0KCJzZWwuZmlyc3QiLCAic2VsLmxhc3QiKQorICAgIHJldHVybiBfc2V0dXAodGV4dCkub3Blbih0ZXh0LHBhdCkKKworZGVmIGZpbmRfYWdhaW4odGV4dCk6CisgICAgcmV0dXJuIF9zZXR1cCh0ZXh0KS5maW5kX2FnYWluKHRleHQpCisKK2RlZiBmaW5kX3NlbGVjdGlvbih0ZXh0KToKKyAgICByZXR1cm4gX3NldHVwKHRleHQpLmZpbmRfc2VsZWN0aW9uKHRleHQpCisKK2NsYXNzIFNlYXJjaERpYWxvZyhTZWFyY2hEaWFsb2dCYXNlKToKKworICAgIGRlZiBjcmVhdGVfd2lkZ2V0cyhzZWxmKToKKyAgICAgICAgZiA9IFNlYXJjaERpYWxvZ0Jhc2UuY3JlYXRlX3dpZGdldHMoc2VsZikKKyAgICAgICAgc2VsZi5tYWtlX2J1dHRvbigiRmluZCIsIHNlbGYuZGVmYXVsdF9jb21tYW5kLCAxKQorCisgICAgZGVmIGRlZmF1bHRfY29tbWFuZChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgbm90IHNlbGYuZW5naW5lLmdldHByb2coKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmZpbmRfYWdhaW4oc2VsZi50ZXh0KToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGZpbmRfYWdhaW4oc2VsZiwgdGV4dCk6CisgICAgICAgIGlmIG5vdCBzZWxmLmVuZ2luZS5nZXRwYXQoKToKKyAgICAgICAgICAgIHNlbGYub3Blbih0ZXh0KQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIG5vdCBzZWxmLmVuZ2luZS5nZXRwcm9nKCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmVzID0gc2VsZi5lbmdpbmUuc2VhcmNoX3RleHQodGV4dCkKKyAgICAgICAgaWYgcmVzOgorICAgICAgICAgICAgbGluZSwgbSA9IHJlcworICAgICAgICAgICAgaSwgaiA9IG0uc3BhbigpCisgICAgICAgICAgICBmaXJzdCA9ICIlZC4lZCIgJSAobGluZSwgaSkKKyAgICAgICAgICAgIGxhc3QgPSAiJWQuJWQiICUgKGxpbmUsIGopCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZmlyc3QgPSB0ZXh0LmluZGV4KCJzZWwuZmlyc3QiKQorICAgICAgICAgICAgICAgIHNlbGxhc3QgPSB0ZXh0LmluZGV4KCJzZWwubGFzdCIpCisgICAgICAgICAgICAgICAgaWYgc2VsZmlyc3QgPT0gZmlyc3QgYW5kIHNlbGxhc3QgPT0gbGFzdDoKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5iZWxsKCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdGV4dC50YWdfcmVtb3ZlKCJzZWwiLCAiMS4wIiwgImVuZCIpCisgICAgICAgICAgICB0ZXh0LnRhZ19hZGQoInNlbCIsIGZpcnN0LCBsYXN0KQorICAgICAgICAgICAgdGV4dC5tYXJrX3NldCgiaW5zZXJ0Iiwgc2VsZi5lbmdpbmUuaXNiYWNrKCkgYW5kIGZpcnN0IG9yIGxhc3QpCisgICAgICAgICAgICB0ZXh0LnNlZSgiaW5zZXJ0IikKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ZXh0LmJlbGwoKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZmluZF9zZWxlY3Rpb24oc2VsZiwgdGV4dCk6CisgICAgICAgIHBhdCA9IHRleHQuZ2V0KCJzZWwuZmlyc3QiLCAic2VsLmxhc3QiKQorICAgICAgICBpZiBwYXQ6CisgICAgICAgICAgICBzZWxmLmVuZ2luZS5zZXRjb29rZWRwYXQocGF0KQorICAgICAgICByZXR1cm4gc2VsZi5maW5kX2FnYWluKHRleHQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NDlkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NDlkYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRGlhbG9nQmFzZS5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2dCYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2M2U3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRGlhbG9nQmFzZS5weQpAQCAtMCwwICsxLDE0MCBAQAorZnJvbSBUa2ludGVyIGltcG9ydCAqCisKK2NsYXNzIFNlYXJjaERpYWxvZ0Jhc2U6CisKKyAgICB0aXRsZSA9ICJTZWFyY2ggRGlhbG9nIgorICAgIGljb24gPSAiU2VhcmNoIgorICAgIG5lZWR3cmFwYnV0dG9uID0gMQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3QsIGVuZ2luZSk6CisgICAgICAgIHNlbGYucm9vdCA9IHJvb3QKKyAgICAgICAgc2VsZi5lbmdpbmUgPSBlbmdpbmUKKyAgICAgICAgc2VsZi50b3AgPSBOb25lCisKKyAgICBkZWYgb3BlbihzZWxmLCB0ZXh0LCBzZWFyY2hwaHJhc2U9Tm9uZSk6CisgICAgICAgIHNlbGYudGV4dCA9IHRleHQKKyAgICAgICAgaWYgbm90IHNlbGYudG9wOgorICAgICAgICAgICAgc2VsZi5jcmVhdGVfd2lkZ2V0cygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRvcC5kZWljb25pZnkoKQorICAgICAgICAgICAgc2VsZi50b3AudGtyYWlzZSgpCisgICAgICAgIGlmIHNlYXJjaHBocmFzZToKKyAgICAgICAgICAgIHNlbGYuZW50LmRlbGV0ZSgwLCJlbmQiKQorICAgICAgICAgICAgc2VsZi5lbnQuaW5zZXJ0KCJlbmQiLHNlYXJjaHBocmFzZSkKKyAgICAgICAgc2VsZi5lbnQuZm9jdXNfc2V0KCkKKyAgICAgICAgc2VsZi5lbnQuc2VsZWN0aW9uX3JhbmdlKDAsICJlbmQiKQorICAgICAgICBzZWxmLmVudC5pY3Vyc29yKDApCisgICAgICAgIHNlbGYudG9wLmdyYWJfc2V0KCkKKworICAgIGRlZiBjbG9zZShzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi50b3A6CisgICAgICAgICAgICBzZWxmLnRvcC5ncmFiX3JlbGVhc2UoKQorICAgICAgICAgICAgc2VsZi50b3Aud2l0aGRyYXcoKQorCisgICAgZGVmIGNyZWF0ZV93aWRnZXRzKHNlbGYpOgorICAgICAgICB0b3AgPSBUb3BsZXZlbChzZWxmLnJvb3QpCisgICAgICAgIHRvcC5iaW5kKCI8UmV0dXJuPiIsIHNlbGYuZGVmYXVsdF9jb21tYW5kKQorICAgICAgICB0b3AuYmluZCgiPEVzY2FwZT4iLCBzZWxmLmNsb3NlKQorICAgICAgICB0b3AucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLmNsb3NlKQorICAgICAgICB0b3Aud21fdGl0bGUoc2VsZi50aXRsZSkKKyAgICAgICAgdG9wLndtX2ljb25uYW1lKHNlbGYuaWNvbikKKyAgICAgICAgc2VsZi50b3AgPSB0b3AKKworICAgICAgICBzZWxmLnJvdyA9IDAKKyAgICAgICAgc2VsZi50b3AuZ3JpZF9jb2x1bW5jb25maWd1cmUoMCwgcGFkPTIsIHdlaWdodD0wKQorICAgICAgICBzZWxmLnRvcC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgxLCBwYWQ9MiwgbWluc2l6ZT0xMDAsIHdlaWdodD0xMDApCisKKyAgICAgICAgc2VsZi5jcmVhdGVfZW50cmllcygpCisgICAgICAgIHNlbGYuY3JlYXRlX29wdGlvbl9idXR0b25zKCkKKyAgICAgICAgc2VsZi5jcmVhdGVfb3RoZXJfYnV0dG9ucygpCisgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoKQorCisgICAgZGVmIG1ha2VfZW50cnkoc2VsZiwgbGFiZWwsIHZhcik6CisgICAgICAgIGwgPSBMYWJlbChzZWxmLnRvcCwgdGV4dD1sYWJlbCkKKyAgICAgICAgbC5ncmlkKHJvdz1zZWxmLnJvdywgY29sdW1uPTAsIHN0aWNreT0ibnciKQorICAgICAgICBlID0gRW50cnkoc2VsZi50b3AsIHRleHR2YXJpYWJsZT12YXIsIGV4cG9ydHNlbGVjdGlvbj0wKQorICAgICAgICBlLmdyaWQocm93PXNlbGYucm93LCBjb2x1bW49MSwgc3RpY2t5PSJud2UiKQorICAgICAgICBzZWxmLnJvdyA9IHNlbGYucm93ICsgMQorICAgICAgICByZXR1cm4gZQorCisgICAgZGVmIG1ha2VfZnJhbWUoc2VsZixsYWJlbHRleHQ9Tm9uZSk6CisgICAgICAgIGlmIGxhYmVsdGV4dDoKKyAgICAgICAgICAgIGwgPSBMYWJlbChzZWxmLnRvcCwgdGV4dD1sYWJlbHRleHQpCisgICAgICAgICAgICBsLmdyaWQocm93PXNlbGYucm93LCBjb2x1bW49MCwgc3RpY2t5PSJudyIpCisgICAgICAgIGYgPSBGcmFtZShzZWxmLnRvcCkKKyAgICAgICAgZi5ncmlkKHJvdz1zZWxmLnJvdywgY29sdW1uPTEsIGNvbHVtbnNwYW49MSwgc3RpY2t5PSJud2UiKQorICAgICAgICBzZWxmLnJvdyA9IHNlbGYucm93ICsgMQorICAgICAgICByZXR1cm4gZgorCisgICAgZGVmIG1ha2VfYnV0dG9uKHNlbGYsIGxhYmVsLCBjb21tYW5kLCBpc2RlZj0wKToKKyAgICAgICAgYiA9IEJ1dHRvbihzZWxmLmJ1dHRvbmZyYW1lLAorICAgICAgICAgICAgICAgICAgIHRleHQ9bGFiZWwsIGNvbW1hbmQ9Y29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICBkZWZhdWx0PWlzZGVmIGFuZCAiYWN0aXZlIiBvciAibm9ybWFsIikKKyAgICAgICAgY29scyxyb3dzPXNlbGYuYnV0dG9uZnJhbWUuZ3JpZF9zaXplKCkKKyAgICAgICAgYi5ncmlkKHBhZHk9MSxyb3c9cm93cyxjb2x1bW49MCxzdGlja3k9ImV3IikKKyAgICAgICAgc2VsZi5idXR0b25mcmFtZS5ncmlkKHJvd3NwYW49cm93cysxKQorICAgICAgICByZXR1cm4gYgorCisgICAgZGVmIGNyZWF0ZV9lbnRyaWVzKHNlbGYpOgorICAgICAgICBzZWxmLmVudCA9IHNlbGYubWFrZV9lbnRyeSgiRmluZDoiLCBzZWxmLmVuZ2luZS5wYXR2YXIpCisKKyAgICBkZWYgY3JlYXRlX29wdGlvbl9idXR0b25zKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5tYWtlX2ZyYW1lKCJPcHRpb25zIikKKworICAgICAgICBidG4gPSBDaGVja2J1dHRvbihmLCBhbmNob3I9InciLAorICAgICAgICAgICAgICAgIHZhcmlhYmxlPXNlbGYuZW5naW5lLnJldmFyLAorICAgICAgICAgICAgICAgIHRleHQ9IlJlZ3VsYXIgZXhwcmVzc2lvbiIpCisgICAgICAgIGJ0bi5wYWNrKHNpZGU9ImxlZnQiLCBmaWxsPSJib3RoIikKKyAgICAgICAgaWYgc2VsZi5lbmdpbmUuaXNyZSgpOgorICAgICAgICAgICAgYnRuLnNlbGVjdCgpCisKKyAgICAgICAgYnRuID0gQ2hlY2tidXR0b24oZiwgYW5jaG9yPSJ3IiwKKyAgICAgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLmVuZ2luZS5jYXNldmFyLAorICAgICAgICAgICAgICAgIHRleHQ9Ik1hdGNoIGNhc2UiKQorICAgICAgICBidG4ucGFjayhzaWRlPSJsZWZ0IiwgZmlsbD0iYm90aCIpCisgICAgICAgIGlmIHNlbGYuZW5naW5lLmlzY2FzZSgpOgorICAgICAgICAgICAgYnRuLnNlbGVjdCgpCisKKyAgICAgICAgYnRuID0gQ2hlY2tidXR0b24oZiwgYW5jaG9yPSJ3IiwKKyAgICAgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLmVuZ2luZS53b3JkdmFyLAorICAgICAgICAgICAgICAgIHRleHQ9Ildob2xlIHdvcmQiKQorICAgICAgICBidG4ucGFjayhzaWRlPSJsZWZ0IiwgZmlsbD0iYm90aCIpCisgICAgICAgIGlmIHNlbGYuZW5naW5lLmlzd29yZCgpOgorICAgICAgICAgICAgYnRuLnNlbGVjdCgpCisKKyAgICAgICAgaWYgc2VsZi5uZWVkd3JhcGJ1dHRvbjoKKyAgICAgICAgICAgIGJ0biA9IENoZWNrYnV0dG9uKGYsIGFuY2hvcj0idyIsCisgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlPXNlbGYuZW5naW5lLndyYXB2YXIsCisgICAgICAgICAgICAgICAgICAgIHRleHQ9IldyYXAgYXJvdW5kIikKKyAgICAgICAgICAgIGJ0bi5wYWNrKHNpZGU9ImxlZnQiLCBmaWxsPSJib3RoIikKKyAgICAgICAgICAgIGlmIHNlbGYuZW5naW5lLmlzd3JhcCgpOgorICAgICAgICAgICAgICAgIGJ0bi5zZWxlY3QoKQorCisgICAgZGVmIGNyZWF0ZV9vdGhlcl9idXR0b25zKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5tYWtlX2ZyYW1lKCJEaXJlY3Rpb24iKQorCisgICAgICAgICNsYmwgPSBMYWJlbChmLCB0ZXh0PSJEaXJlY3Rpb246ICIpCisgICAgICAgICNsYmwucGFjayhzaWRlPSJsZWZ0IikKKworICAgICAgICBidG4gPSBSYWRpb2J1dHRvbihmLCBhbmNob3I9InciLAorICAgICAgICAgICAgICAgIHZhcmlhYmxlPXNlbGYuZW5naW5lLmJhY2t2YXIsIHZhbHVlPTEsCisgICAgICAgICAgICAgICAgdGV4dD0iVXAiKQorICAgICAgICBidG4ucGFjayhzaWRlPSJsZWZ0IiwgZmlsbD0iYm90aCIpCisgICAgICAgIGlmIHNlbGYuZW5naW5lLmlzYmFjaygpOgorICAgICAgICAgICAgYnRuLnNlbGVjdCgpCisKKyAgICAgICAgYnRuID0gUmFkaW9idXR0b24oZiwgYW5jaG9yPSJ3IiwKKyAgICAgICAgICAgICAgICB2YXJpYWJsZT1zZWxmLmVuZ2luZS5iYWNrdmFyLCB2YWx1ZT0wLAorICAgICAgICAgICAgICAgIHRleHQ9IkRvd24iKQorICAgICAgICBidG4ucGFjayhzaWRlPSJsZWZ0IiwgZmlsbD0iYm90aCIpCisgICAgICAgIGlmIG5vdCBzZWxmLmVuZ2luZS5pc2JhY2soKToKKyAgICAgICAgICAgIGJ0bi5zZWxlY3QoKQorCisgICAgZGVmIGNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoc2VsZik6CisgICAgICAgICMKKyAgICAgICAgIyBwbGFjZSBidXR0b24gZnJhbWUgb24gdGhlIHJpZ2h0CisgICAgICAgIGYgPSBzZWxmLmJ1dHRvbmZyYW1lID0gRnJhbWUoc2VsZi50b3ApCisgICAgICAgIGYuZ3JpZChyb3c9MCxjb2x1bW49MixwYWR4PTIscGFkeT0yLGlwYWR4PTIsaXBhZHk9MikKKworICAgICAgICBiID0gc2VsZi5tYWtlX2J1dHRvbigiY2xvc2UiLCBzZWxmLmNsb3NlKQorICAgICAgICBiLmxvd2VyKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2dCYXNlLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2dCYXNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzM2MTRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2dCYXNlLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2dCYXNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzM2MTRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRW5naW5lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDBhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRW5naW5lLnB5CkBAIC0wLDAgKzEsMjIwIEBACitpbXBvcnQgcmUKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgoraW1wb3J0IHRrTWVzc2FnZUJveAorCitkZWYgZ2V0KHJvb3QpOgorICAgIGlmIG5vdCBoYXNhdHRyKHJvb3QsICJfc2VhcmNoZW5naW5lIik6CisgICAgICAgIHJvb3QuX3NlYXJjaGVuZ2luZSA9IFNlYXJjaEVuZ2luZShyb290KQorICAgICAgICAjIFhYWCBUaGlzIHdpbGwgbmV2ZXIgZ2FyYmFnZS1jb2xsZWN0IC0tIHdobyBjYXJlcworICAgIHJldHVybiByb290Ll9zZWFyY2hlbmdpbmUKKworY2xhc3MgU2VhcmNoRW5naW5lOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3QpOgorICAgICAgICBzZWxmLnJvb3QgPSByb290CisgICAgICAgICMgU3RhdGUgc2hhcmVkIGJ5IHNlYXJjaCwgcmVwbGFjZSwgYW5kIGdyZXA7CisgICAgICAgICMgdGhlIHNlYXJjaCBkaWFsb2dzIGJpbmQgdGhlc2UgdG8gVUkgZWxlbWVudHMuCisgICAgICAgIHNlbGYucGF0dmFyID0gU3RyaW5nVmFyKHJvb3QpICAgICAgICAgICAjIHNlYXJjaCBwYXR0ZXJuCisgICAgICAgIHNlbGYucmV2YXIgPSBCb29sZWFuVmFyKHJvb3QpICAgICAgICAgICAjIHJlZ3VsYXIgZXhwcmVzc2lvbj8KKyAgICAgICAgc2VsZi5jYXNldmFyID0gQm9vbGVhblZhcihyb290KSAgICAgICAgICMgbWF0Y2ggY2FzZT8KKyAgICAgICAgc2VsZi53b3JkdmFyID0gQm9vbGVhblZhcihyb290KSAgICAgICAgICMgbWF0Y2ggd2hvbGUgd29yZD8KKyAgICAgICAgc2VsZi53cmFwdmFyID0gQm9vbGVhblZhcihyb290KSAgICAgICAgICMgd3JhcCBhcm91bmQgYnVmZmVyPworICAgICAgICBzZWxmLndyYXB2YXIuc2V0KDEpICAgICAgICAgICAgICAgICAgICAgIyAob24gYnkgZGVmYXVsdCkKKyAgICAgICAgc2VsZi5iYWNrdmFyID0gQm9vbGVhblZhcihyb290KSAgICAgICAgICMgc2VhcmNoIGJhY2t3YXJkcz8KKworICAgICMgQWNjZXNzIG1ldGhvZHMKKworICAgIGRlZiBnZXRwYXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBhdHZhci5nZXQoKQorCisgICAgZGVmIHNldHBhdChzZWxmLCBwYXQpOgorICAgICAgICBzZWxmLnBhdHZhci5zZXQocGF0KQorCisgICAgZGVmIGlzcmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJldmFyLmdldCgpCisKKyAgICBkZWYgaXNjYXNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jYXNldmFyLmdldCgpCisKKyAgICBkZWYgaXN3b3JkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi53b3JkdmFyLmdldCgpCisKKyAgICBkZWYgaXN3cmFwKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi53cmFwdmFyLmdldCgpCisKKyAgICBkZWYgaXNiYWNrKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5iYWNrdmFyLmdldCgpCisKKyAgICAjIEhpZ2hlciBsZXZlbCBhY2Nlc3MgbWV0aG9kcworCisgICAgZGVmIGdldGNvb2tlZHBhdChzZWxmKToKKyAgICAgICAgcGF0ID0gc2VsZi5nZXRwYXQoKQorICAgICAgICBpZiBub3Qgc2VsZi5pc3JlKCk6CisgICAgICAgICAgICBwYXQgPSByZS5lc2NhcGUocGF0KQorICAgICAgICBpZiBzZWxmLmlzd29yZCgpOgorICAgICAgICAgICAgcGF0ID0gciJcYiVzXGIiICUgcGF0CisgICAgICAgIHJldHVybiBwYXQKKworICAgIGRlZiBnZXRwcm9nKHNlbGYpOgorICAgICAgICBwYXQgPSBzZWxmLmdldHBhdCgpCisgICAgICAgIGlmIG5vdCBwYXQ6CisgICAgICAgICAgICBzZWxmLnJlcG9ydF9lcnJvcihwYXQsICJFbXB0eSByZWd1bGFyIGV4cHJlc3Npb24iKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcGF0ID0gc2VsZi5nZXRjb29rZWRwYXQoKQorICAgICAgICBmbGFncyA9IDAKKyAgICAgICAgaWYgbm90IHNlbGYuaXNjYXNlKCk6CisgICAgICAgICAgICBmbGFncyA9IGZsYWdzIHwgcmUuSUdOT1JFQ0FTRQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm9nID0gcmUuY29tcGlsZShwYXQsIGZsYWdzKQorICAgICAgICBleGNlcHQgcmUuZXJyb3IsIHdoYXQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbXNnLCBjb2wgPSB3aGF0CisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgbXNnID0gc3RyKHdoYXQpCisgICAgICAgICAgICAgICAgY29sID0gLTEKKyAgICAgICAgICAgIHNlbGYucmVwb3J0X2Vycm9yKHBhdCwgbXNnLCBjb2wpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gcHJvZworCisgICAgZGVmIHJlcG9ydF9lcnJvcihzZWxmLCBwYXQsIG1zZywgY29sPS0xKToKKyAgICAgICAgIyBEZXJpdmVkIGNsYXNzIGNvdWxkIG92ZXJyaWQgdGhpcyB3aXRoIHNvbWV0aGluZyBmYW5jaWVyCisgICAgICAgIG1zZyA9ICJFcnJvcjogIiArIHN0cihtc2cpCisgICAgICAgIGlmIHBhdDoKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICJcbnBcUGF0dGVybjogIiArIHN0cihwYXQpCisgICAgICAgIGlmIGNvbCA+PSAwOgorICAgICAgICAgICAgbXNnID0gbXNnICsgIlxuT2Zmc2V0OiAiICsgc3RyKGNvbCkKKyAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiUmVndWxhciBleHByZXNzaW9uIGVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2csIG1hc3Rlcj1zZWxmLnJvb3QpCisKKyAgICBkZWYgc2V0Y29va2VkcGF0KHNlbGYsIHBhdCk6CisgICAgICAgIGlmIHNlbGYuaXNyZSgpOgorICAgICAgICAgICAgcGF0ID0gcmUuZXNjYXBlKHBhdCkKKyAgICAgICAgc2VsZi5zZXRwYXQocGF0KQorCisgICAgZGVmIHNlYXJjaF90ZXh0KHNlbGYsIHRleHQsIHByb2c9Tm9uZSwgb2s9MCk6CisgICAgICAgICIiIlNlYXJjaCBhIHRleHQgd2lkZ2V0IGZvciB0aGUgcGF0dGVybi4KKworICAgICAgICBJZiBwcm9nIGlzIGdpdmVuLCBpdCBzaG91bGQgYmUgdGhlIHByZWNvbXBpbGVkIHBhdHRlcm4uCisgICAgICAgIFJldHVybiBhIHR1cGxlIChsaW5lbm8sIG1hdGNob2JqKTsgTm9uZSBpZiBub3QgZm91bmQuCisKKyAgICAgICAgVGhpcyBvYmV5cyB0aGUgd3JhcCBhbmQgZGlyZWN0aW9uIChiYWNrKSBzZXR0aW5ncy4KKworICAgICAgICBUaGUgc2VhcmNoIHN0YXJ0cyBhdCB0aGUgc2VsZWN0aW9uIChpZiB0aGVyZSBpcyBvbmUpIG9yCisgICAgICAgIGF0IHRoZSBpbnNlcnQgbWFyayAob3RoZXJ3aXNlKS4gIElmIHRoZSBzZWFyY2ggaXMgZm9yd2FyZCwKKyAgICAgICAgaXQgc3RhcnRzIGF0IHRoZSByaWdodCBvZiB0aGUgc2VsZWN0aW9uOyBmb3IgYSBiYWNrd2FyZAorICAgICAgICBzZWFyY2gsIGl0IHN0YXJ0cyBhdCB0aGUgbGVmdCBlbmQuICBBbiBlbXB0eSBtYXRjaCBleGFjdGx5CisgICAgICAgIGF0IGVpdGhlciBlbmQgb2YgdGhlIHNlbGVjdGlvbiAob3IgYXQgdGhlIGluc2VydCBtYXJrIGlmCisgICAgICAgIHRoZXJlIGlzIG5vIHNlbGVjdGlvbikgaXMgaWdub3JlZCAgdW5sZXNzIHRoZSBvayBmbGFnIGlzIHRydWUKKyAgICAgICAgLS0gdGhpcyBpcyBkb25lIHRvIGd1YXJhbnRlZSBwcm9ncmVzcy4KKworICAgICAgICBJZiB0aGUgc2VhcmNoIGlzIGFsbG93ZWQgdG8gd3JhcCBhcm91bmQsIGl0IHdpbGwgcmV0dXJuIHRoZQorICAgICAgICBvcmlnaW5hbCBzZWxlY3Rpb24gaWYgKGFuZCBvbmx5IGlmKSBpdCBpcyB0aGUgb25seSBtYXRjaC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHByb2c6CisgICAgICAgICAgICBwcm9nID0gc2VsZi5nZXRwcm9nKCkKKyAgICAgICAgICAgIGlmIG5vdCBwcm9nOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lICMgQ29tcGlsYXRpb24gZmFpbGVkIC0tIHN0b3AKKyAgICAgICAgd3JhcCA9IHNlbGYud3JhcHZhci5nZXQoKQorICAgICAgICBmaXJzdCwgbGFzdCA9IGdldF9zZWxlY3Rpb24odGV4dCkKKyAgICAgICAgaWYgc2VsZi5pc2JhY2soKToKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGFzdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGFydCA9IGZpcnN0CisgICAgICAgICAgICBsaW5lLCBjb2wgPSBnZXRfbGluZV9jb2woc3RhcnQpCisgICAgICAgICAgICByZXMgPSBzZWxmLnNlYXJjaF9iYWNrd2FyZCh0ZXh0LCBwcm9nLCBsaW5lLCBjb2wsIHdyYXAsIG9rKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgc3RhcnQgPSBmaXJzdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGFydCA9IGxhc3QKKyAgICAgICAgICAgIGxpbmUsIGNvbCA9IGdldF9saW5lX2NvbChzdGFydCkKKyAgICAgICAgICAgIHJlcyA9IHNlbGYuc2VhcmNoX2ZvcndhcmQodGV4dCwgcHJvZywgbGluZSwgY29sLCB3cmFwLCBvaykKKyAgICAgICAgcmV0dXJuIHJlcworCisgICAgZGVmIHNlYXJjaF9mb3J3YXJkKHNlbGYsIHRleHQsIHByb2csIGxpbmUsIGNvbCwgd3JhcCwgb2s9MCk6CisgICAgICAgIHdyYXBwZWQgPSAwCisgICAgICAgIHN0YXJ0bGluZSA9IGxpbmUKKyAgICAgICAgY2hhcnMgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lLCAiJWQuMCIgJSAobGluZSsxKSkKKyAgICAgICAgd2hpbGUgY2hhcnM6CisgICAgICAgICAgICBtID0gcHJvZy5zZWFyY2goY2hhcnNbOi0xXSwgY29sKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBpZiBvayBvciBtLmVuZCgpID4gY29sOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZSwgbQorICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAxCisgICAgICAgICAgICBpZiB3cmFwcGVkIGFuZCBsaW5lID4gc3RhcnRsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBjb2wgPSAwCisgICAgICAgICAgICBvayA9IDEKKyAgICAgICAgICAgIGNoYXJzID0gdGV4dC5nZXQoIiVkLjAiICUgbGluZSwgIiVkLjAiICUgKGxpbmUrMSkpCisgICAgICAgICAgICBpZiBub3QgY2hhcnMgYW5kIHdyYXA6CisgICAgICAgICAgICAgICAgd3JhcHBlZCA9IDEKKyAgICAgICAgICAgICAgICB3cmFwID0gMAorICAgICAgICAgICAgICAgIGxpbmUgPSAxCisgICAgICAgICAgICAgICAgY2hhcnMgPSB0ZXh0LmdldCgiMS4wIiwgIjIuMCIpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgc2VhcmNoX2JhY2t3YXJkKHNlbGYsIHRleHQsIHByb2csIGxpbmUsIGNvbCwgd3JhcCwgb2s9MCk6CisgICAgICAgIHdyYXBwZWQgPSAwCisgICAgICAgIHN0YXJ0bGluZSA9IGxpbmUKKyAgICAgICAgY2hhcnMgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lLCAiJWQuMCIgJSAobGluZSsxKSkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIG0gPSBzZWFyY2hfcmV2ZXJzZShwcm9nLCBjaGFyc1s6LTFdLCBjb2wpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIGlmIG9rIG9yIG0uc3RhcnQoKSA8IGNvbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUsIG0KKyAgICAgICAgICAgIGxpbmUgPSBsaW5lIC0gMQorICAgICAgICAgICAgaWYgd3JhcHBlZCBhbmQgbGluZSA8IHN0YXJ0bGluZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgb2sgPSAxCisgICAgICAgICAgICBpZiBsaW5lIDw9IDA6CisgICAgICAgICAgICAgICAgaWYgbm90IHdyYXA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgd3JhcHBlZCA9IDEKKyAgICAgICAgICAgICAgICB3cmFwID0gMAorICAgICAgICAgICAgICAgIHBvcyA9IHRleHQuaW5kZXgoImVuZC0xYyIpCisgICAgICAgICAgICAgICAgbGluZSwgY29sID0gbWFwKGludCwgcG9zLnNwbGl0KCIuIikpCisgICAgICAgICAgICBjaGFycyA9IHRleHQuZ2V0KCIlZC4wIiAlIGxpbmUsICIlZC4wIiAlIChsaW5lKzEpKQorICAgICAgICAgICAgY29sID0gbGVuKGNoYXJzKSAtIDEKKyAgICAgICAgcmV0dXJuIE5vbmUKKworIyBIZWxwZXIgdG8gc2VhcmNoIGJhY2t3YXJkcyBpbiBhIHN0cmluZy4KKyMgKE9wdGltaXplZCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHBhdHRlcm4gaXNuJ3QgZm91bmQuKQorCitkZWYgc2VhcmNoX3JldmVyc2UocHJvZywgY2hhcnMsIGNvbCk6CisgICAgbSA9IHByb2cuc2VhcmNoKGNoYXJzKQorICAgIGlmIG5vdCBtOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGZvdW5kID0gTm9uZQorICAgIGksIGogPSBtLnNwYW4oKQorICAgIHdoaWxlIGkgPCBjb2wgYW5kIGogPD0gY29sOgorICAgICAgICBmb3VuZCA9IG0KKyAgICAgICAgaWYgaSA9PSBqOgorICAgICAgICAgICAgaiA9IGorMQorICAgICAgICBtID0gcHJvZy5zZWFyY2goY2hhcnMsIGopCisgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaSwgaiA9IG0uc3BhbigpCisgICAgcmV0dXJuIGZvdW5kCisKKyMgSGVscGVyIHRvIGdldCBzZWxlY3Rpb24gZW5kIHBvaW50cywgZGVmYXVsdGluZyB0byBpbnNlcnQgbWFyay4KKyMgUmV0dXJuIGEgdHVwbGUgb2YgaW5kaWNlcyAoImxpbmUuY29sIiBzdHJpbmdzKS4KKworZGVmIGdldF9zZWxlY3Rpb24odGV4dCk6CisgICAgdHJ5OgorICAgICAgICBmaXJzdCA9IHRleHQuaW5kZXgoInNlbC5maXJzdCIpCisgICAgICAgIGxhc3QgPSB0ZXh0LmluZGV4KCJzZWwubGFzdCIpCisgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICBmaXJzdCA9IGxhc3QgPSBOb25lCisgICAgaWYgbm90IGZpcnN0OgorICAgICAgICBmaXJzdCA9IHRleHQuaW5kZXgoImluc2VydCIpCisgICAgaWYgbm90IGxhc3Q6CisgICAgICAgIGxhc3QgPSBmaXJzdAorICAgIHJldHVybiBmaXJzdCwgbGFzdAorCisjIEhlbHBlciB0byBwYXJzZSBhIHRleHQgaW5kZXggaW50byBhIChsaW5lLCBjb2wpIHR1cGxlLgorCitkZWYgZ2V0X2xpbmVfY29sKGluZGV4KToKKyAgICBsaW5lLCBjb2wgPSBtYXAoaW50LCBpbmRleC5zcGxpdCgiLiIpKSAjIEZhaWxzIG9uIGludmFsaWQgaW5kZXgKKyAgICByZXR1cm4gbGluZSwgY29sCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRW5naW5lLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzE5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRW5naW5lLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRW5naW5lLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzE5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRW5naW5lLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvU3RhY2tWaWV3ZXIucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU3RhY2tWaWV3ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyNzczZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TdGFja1ZpZXdlci5weQpAQCAtMCwwICsxLDEzNyBAQAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgbGluZWNhY2hlCisKK2Zyb20gaWRsZWxpYi5UcmVlV2lkZ2V0IGltcG9ydCBUcmVlTm9kZSwgVHJlZUl0ZW0sIFNjcm9sbGVkQ2FudmFzCitmcm9tIGlkbGVsaWIuT2JqZWN0QnJvd3NlciBpbXBvcnQgT2JqZWN0VHJlZUl0ZW0sIG1ha2Vfb2JqZWN0dHJlZWl0ZW0KKworZGVmIFN0YWNrQnJvd3Nlcihyb290LCBmbGlzdD1Ob25lLCB0Yj1Ob25lLCB0b3A9Tm9uZSk6CisgICAgaWYgdG9wIGlzIE5vbmU6CisgICAgICAgIGZyb20gVGtpbnRlciBpbXBvcnQgVG9wbGV2ZWwKKyAgICAgICAgdG9wID0gVG9wbGV2ZWwocm9vdCkKKyAgICBzYyA9IFNjcm9sbGVkQ2FudmFzKHRvcCwgYmc9IndoaXRlIiwgaGlnaGxpZ2h0dGhpY2tuZXNzPTApCisgICAgc2MuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCisgICAgaXRlbSA9IFN0YWNrVHJlZUl0ZW0oZmxpc3QsIHRiKQorICAgIG5vZGUgPSBUcmVlTm9kZShzYy5jYW52YXMsIE5vbmUsIGl0ZW0pCisgICAgbm9kZS5leHBhbmQoKQorCitjbGFzcyBTdGFja1RyZWVJdGVtKFRyZWVJdGVtKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGlzdD1Ob25lLCB0Yj1Ob25lKToKKyAgICAgICAgc2VsZi5mbGlzdCA9IGZsaXN0CisgICAgICAgIHNlbGYuc3RhY2sgPSBzZWxmLmdldF9zdGFjayh0YikKKyAgICAgICAgc2VsZi50ZXh0ID0gc2VsZi5nZXRfZXhjZXB0aW9uKCkKKworICAgIGRlZiBnZXRfc3RhY2soc2VsZiwgdGIpOgorICAgICAgICBpZiB0YiBpcyBOb25lOgorICAgICAgICAgICAgdGIgPSBzeXMubGFzdF90cmFjZWJhY2sKKyAgICAgICAgc3RhY2sgPSBbXQorICAgICAgICBpZiB0YiBhbmQgdGIudGJfZnJhbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHRiID0gdGIudGJfbmV4dAorICAgICAgICB3aGlsZSB0YiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN0YWNrLmFwcGVuZCgodGIudGJfZnJhbWUsIHRiLnRiX2xpbmVubykpCisgICAgICAgICAgICB0YiA9IHRiLnRiX25leHQKKyAgICAgICAgcmV0dXJuIHN0YWNrCisKKyAgICBkZWYgZ2V0X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgdHlwZSA9IHN5cy5sYXN0X3R5cGUKKyAgICAgICAgdmFsdWUgPSBzeXMubGFzdF92YWx1ZQorICAgICAgICBpZiBoYXNhdHRyKHR5cGUsICJfX25hbWVfXyIpOgorICAgICAgICAgICAgdHlwZSA9IHR5cGUuX19uYW1lX18KKyAgICAgICAgcyA9IHN0cih0eXBlKQorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHMgPSBzICsgIjogIiArIHN0cih2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBHZXRUZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXh0CisKKyAgICBkZWYgR2V0U3ViTGlzdChzZWxmKToKKyAgICAgICAgc3VibGlzdCA9IFtdCisgICAgICAgIGZvciBpbmZvIGluIHNlbGYuc3RhY2s6CisgICAgICAgICAgICBpdGVtID0gRnJhbWVUcmVlSXRlbShpbmZvLCBzZWxmLmZsaXN0KQorICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgcmV0dXJuIHN1Ymxpc3QKKworY2xhc3MgRnJhbWVUcmVlSXRlbShUcmVlSXRlbSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5mbywgZmxpc3QpOgorICAgICAgICBzZWxmLmluZm8gPSBpbmZvCisgICAgICAgIHNlbGYuZmxpc3QgPSBmbGlzdAorCisgICAgZGVmIEdldFRleHQoc2VsZik6CisgICAgICAgIGZyYW1lLCBsaW5lbm8gPSBzZWxmLmluZm8KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kbmFtZSA9IGZyYW1lLmZfZ2xvYmFsc1siX19uYW1lX18iXQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBtb2RuYW1lID0gIj8iCisgICAgICAgIGNvZGUgPSBmcmFtZS5mX2NvZGUKKyAgICAgICAgZmlsZW5hbWUgPSBjb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgIGZ1bmNuYW1lID0gY29kZS5jb19uYW1lCisgICAgICAgIHNvdXJjZWxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBzb3VyY2VsaW5lID0gc291cmNlbGluZS5zdHJpcCgpCisgICAgICAgIGlmIGZ1bmNuYW1lIGluICgiPyIsICIiLCBOb25lKToKKyAgICAgICAgICAgIGl0ZW0gPSAiJXMsIGxpbmUgJWQ6ICVzIiAlIChtb2RuYW1lLCBsaW5lbm8sIHNvdXJjZWxpbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpdGVtID0gIiVzLiVzKC4uLiksIGxpbmUgJWQ6ICVzIiAlIChtb2RuYW1lLCBmdW5jbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgc291cmNlbGluZSkKKyAgICAgICAgcmV0dXJuIGl0ZW0KKworICAgIGRlZiBHZXRTdWJMaXN0KHNlbGYpOgorICAgICAgICBmcmFtZSwgbGluZW5vID0gc2VsZi5pbmZvCisgICAgICAgIHN1Ymxpc3QgPSBbXQorICAgICAgICBpZiBmcmFtZS5mX2dsb2JhbHMgaXMgbm90IGZyYW1lLmZfbG9jYWxzOgorICAgICAgICAgICAgaXRlbSA9IFZhcmlhYmxlc1RyZWVJdGVtKCI8bG9jYWxzPiIsIGZyYW1lLmZfbG9jYWxzLCBzZWxmLmZsaXN0KQorICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgaXRlbSA9IFZhcmlhYmxlc1RyZWVJdGVtKCI8Z2xvYmFscz4iLCBmcmFtZS5mX2dsb2JhbHMsIHNlbGYuZmxpc3QpCisgICAgICAgIHN1Ymxpc3QuYXBwZW5kKGl0ZW0pCisgICAgICAgIHJldHVybiBzdWJsaXN0CisKKyAgICBkZWYgT25Eb3VibGVDbGljayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5mbGlzdDoKKyAgICAgICAgICAgIGZyYW1lLCBsaW5lbm8gPSBzZWxmLmluZm8KKyAgICAgICAgICAgIGZpbGVuYW1lID0gZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmaWxlbmFtZSk6CisgICAgICAgICAgICAgICAgc2VsZi5mbGlzdC5nb3RvZmlsZWxpbmUoZmlsZW5hbWUsIGxpbmVubykKKworY2xhc3MgVmFyaWFibGVzVHJlZUl0ZW0oT2JqZWN0VHJlZUl0ZW0pOgorCisgICAgZGVmIEdldFRleHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxhYmVsdGV4dAorCisgICAgZGVmIEdldExhYmVsVGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBJc0V4cGFuZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5vYmplY3QpID4gMAorCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm9iamVjdC5rZXlzKCkKKworICAgIGRlZiBHZXRTdWJMaXN0KHNlbGYpOgorICAgICAgICBzdWJsaXN0ID0gW10KKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLmtleXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYub2JqZWN0W2tleV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZGVmIHNldGZ1bmN0aW9uKHZhbHVlLCBrZXk9a2V5LCBvYmplY3Q9c2VsZi5vYmplY3QpOgorICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0gdmFsdWUKKyAgICAgICAgICAgIGl0ZW0gPSBtYWtlX29iamVjdHRyZWVpdGVtKGtleSArICIgPSIsIHZhbHVlLCBzZXRmdW5jdGlvbikKKyAgICAgICAgICAgIHN1Ymxpc3QuYXBwZW5kKGl0ZW0pCisgICAgICAgIHJldHVybiBzdWJsaXN0CisKKworZGVmIF90ZXN0KCk6CisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgdGVzdGNvZGUKKyAgICAgICAgcmVsb2FkKHRlc3Rjb2RlKQorICAgIGV4Y2VwdDoKKyAgICAgICAgc3lzLmxhc3RfdHlwZSwgc3lzLmxhc3RfdmFsdWUsIHN5cy5sYXN0X3RyYWNlYmFjayA9IHN5cy5leGNfaW5mbygpCisgICAgZnJvbSBUa2ludGVyIGltcG9ydCBUaworICAgIHJvb3QgPSBUaygpCisgICAgU3RhY2tCcm93c2VyKE5vbmUsIHRvcD1yb290KQorICAgIHJvb3QubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TdGFja1ZpZXdlci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU3RhY2tWaWV3ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMGY5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU3RhY2tWaWV3ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TdGFja1ZpZXdlci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU3RhY2tWaWV3ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMGY5OGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU3RhY2tWaWV3ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9UT0RPLnR4dCBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9UT0RPLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmYxYWMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1RPRE8udHh0CkBAIC0wLDAgKzEsMjEwIEBACitPcmlnaW5hbCBJRExFIHRvZG8sIG11Y2ggb2YgaXQgbm93IG91dGRhdGVkOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1RPIERPOgorCistIGltcHJvdmUgZGVidWdnZXI6CisgICAgLSBtYW5hZ2UgYnJlYWtwb2ludHMgZ2xvYmFsbHksIGFsbG93IGJwIGRlbGV0aW9uLCB0YnJlYWssIGNicmVhayBldGMuCisgICAgLSByZWFsIG9iamVjdCBicm93c2VyCisgICAgLSBoZWxwIG9uIGhvdyB0byB1c2UgaXQgKGEgc2ltcGxlIGhlbHAgYnV0dG9uIHdpbGwgZG8gd29uZGVycykKKyAgICAtIHBlcmZvcm1hbmNlPyAgKHVwZGF0ZXMgb2YgbGFyZ2Ugc2V0cyBvZiBsb2NhbHMgYXJlIHNsb3cpCisgICAgLSBiZXR0ZXIgaW50ZWdyYXRpb24gb2YgImRlYnVnIG1vZHVsZSIKKyAgICAtIGRlYnVnZ2VyIHNob3VsZCBiZSBnbG9iYWwgcmVzb3VyY2UgKGF0dGFjaGVkIHRvIGZsaXN0LCBub3QgdG8gc2hlbGwpCisgICAgLSBmaXggdGhlIHN0dXBpZCBidWcgd2hlcmUgeW91IG5lZWQgdG8gc3RlcCB0d2ljZQorICAgIC0gZGlzcGxheSBjbGFzcyBuYW1lIGluIHN0YWNrIHZpZXdlciBlbnRyaWVzIGZvciBtZXRob2RzCisgICAgLSBzdXBwcmVzcyB0cmFjaW5nIHRocm91Z2ggSURMRSBpbnRlcm5hbHMgKGUuZy4gcHJpbnQpIERPTkUKKyAgICAtIGFkZCBhIGJ1dHRvbiB0byBzdXBwcmVzcyB0aHJvdWdoIGEgc3BlY2lmaWMgbW9kdWxlIG9yIGNsYXNzIG9yIG1ldGhvZAorICAgIC0gbW9yZSBvYmplY3QgaW5zcGVjdGlvbiB0byBzdGFjayB2aWV3ZXIsIGUuZy4gdG8gdmlldyBhbGwgYXJyYXkgaXRlbXMKKy0gaW5zZXJ0IHRoZSBpbml0aWFsIGN1cnJlbnQgZGlyZWN0b3J5IGludG8gc3lzLnBhdGggRE9ORQorLSBkZWZhdWx0IGRpcmVjdG9yeSBhdHRyaWJ1dGUgZm9yIGVhY2ggd2luZG93IGluc3RlYWQgb2Ygb25seSBmb3Igd2luZG93cworICB0aGF0IGhhdmUgYW4gYXNzb2NpYXRlZCBmaWxlbmFtZQorLSBjb21tYW5kIGV4cGFuc2lvbiBmcm9tIGtleXdvcmRzLCBtb2R1bGUgY29udGVudHMsIG90aGVyIGJ1ZmZlcnMsIGV0Yy4KKy0gIlJlY2VudCBkb2N1bWVudHMiIG1lbnUgaXRlbSBET05FCistIEZpbHRlciByZWdpb24gY29tbWFuZAorLSBPcHRpb25hbCBob3Jpem9udGFsIHNjcm9sbCBiYXIKKy0gbW9yZSBFbWFjc2lzbXM6CisgICAgLSBeSyBzaG91bGQgY3V0IHRvIGJ1ZmZlcgorICAgIC0gTS1bLCBNLV0gdG8gbW92ZSBieSBwYXJhZ3JhcGhzCisgICAgLSBpbmNyZW1lbnRhbCBzZWFyY2g/CistIHNlYXJjaCBzaG91bGQgaW5kaWNhdGUgd3JhcC1hcm91bmQgaW4gc29tZSB3YXkKKy0gcmVzdHJ1Y3R1cmUgc3RhdGUgc2Vuc2l0aXZlIGNvZGUgdG8gYXZvaWQgdGVzdGluZyBmbGFncyBhbGwgdGhlIHRpbWUKKy0gcGVyc2lzdGVudCB1c2VyIHN0YXRlIChlLmcuIHdpbmRvdyBhbmQgY3Vyc29yIHBvc2l0aW9ucywgYmluZGluZ3MpCistIG1ha2UgYmFja3VwcyB3aGVuIHNhdmluZworLSBjaGVjayBmaWxlIG10aW1lcyBhdCB2YXJpb3VzIHBvaW50cworLSBQbHVnZ2FibGUgaW50ZXJmYWNlIHdpdGggUkNTL0NWUy9QZXJmb3JjZS9DbGVhcmNhc2UKKy0gYmV0dGVyIGhlbHA/CistIGRvbid0IG9wZW4gc2Vjb25kIGNsYXNzIGJyb3dzZXIgb24gc2FtZSBtb2R1bGUgKG5vciBzZWNvbmQgcGF0aCBicm93c2VyKQorLSB1bmlmeSBjbGFzcyBhbmQgcGF0aCBicm93c2VycworLSBOZWVkIHRvIGRlZmluZSBhIHN0YW5kYXJkIHdheSB3aGVyZWJ5IG9uZSBjYW4gZGV0ZXJtaW5lIG9uZSBpcyBydW5uaW5nCisgIGluc2lkZSBJRExFIChuZWVkZWQgZm9yIFRrIG1haW5sb29wLCBhbHNvIGhhbmR5IGZvciAkUFlUSE9OU1RBUlRVUCkKKy0gQWRkIG1vcmUgdXRpbGl0eSBtZXRob2RzIGZvciB1c2UgYnkgZXh0ZW5zaW9ucyAoYSBsYSBnZXRfc2VsZWN0aW9uKQorLSBXYXkgdG8gcnVuIGNvbW1hbmQgaW4gdG90YWxseSBzZXBhcmF0ZSBpbnRlcnByZXRlciAoZm9yaytvcy5zeXN0ZW0/KSBET05FCistIFdheSB0byBmaW5kIGRlZmluaXRpb24gb2YgZnVsbHktcXVhbGlmaWVkIG5hbWU6CisgIEluIG90aGVyIHdvcmRzLCBzZWxlY3QgIlVzZXJEaWN0LlVzZXJEaWN0IiwgaGl0IHNvbWUgbWFnaWMga2V5IGFuZAorICBpdCBsb2FkcyB1cCBVc2VyRGljdC5weSBhbmQgZmluZHMgdGhlIGZpcnN0IGRlZiBvciBjbGFzcyBmb3IgVXNlckRpY3QuCistIG5lZWQgYSB3YXkgdG8gZm9yY2UgY29sb3JpemF0aW9uIG9uL29mZgorLSBuZWVkIGEgd2F5IHRvIGZvcmNlIGF1dG8taW5kZW50IG9uL29mZgorCitEZXRhaWxzOgorCistIF5PIChvbiBVbml4IC0tIG9wZW4tbGluZSkgc2hvdWxkIGhvbm9yIGF1dG9pbmRlbnQKKy0gYWZ0ZXIgcGFzdGUsIHNob3cgZW5kIG9mIHBhc3RlZCB0ZXh0CistIG9uIFdpbmRvd3MsIHNob3VsZCB0dXJuIHNob3J0IGZpbGVuYW1lIHRvIGxvbmcgZmlsZW5hbWUgKG5vdCBvbmx5IGluIGFyZ3YhKQorICAoc2hvdWxkbid0IHRoaXMgYmUgZG9uZSAtLSBvciB1bmRvbmUgLS0gYnkgbnRwYXRoLm5vcm1wYXRoPykKKy0gbmV3IGF1dG9pbmRlbnQgYWZ0ZXIgY29sb24gZXZlbiBpbmRlbnRzIHdoZW4gdGhlIGNvbG9uIGlzIGluIGEgY29tbWVudCEKKy0gc29tZXRpbWVzIGZvcndhcmQgc2xhc2hlcyBpbiBwYXRobmFtZSByZW1haW4KKy0gc29tZXRpbWVzIHN0YXIgaW4gd2luZG93IG5hbWUgcmVtYWlucyBpbiBXaW5kb3dzIG1lbnUKKy0gV2l0aCB1bml4IGJpbmRpbmdzLCBFU0MgYnkgaXRzZWxmIGlzIGlnbm9yZWQKKy0gU29tZXRpbWVzIGZvciBubyBhcHBhcmVudCByZWFzb24gYSBzZWxlY3Rpb24gZnJvbSB0aGUgY3Vyc29yIHRvIHRoZQorICBlbmQgb2YgdGhlIGNvbW1hbmQgYnVmZmVyIGFwcGVhcnMsIHdoaWNoIGlzIGhhcmQgdG8gZ2V0IHJpZCBvZgorICBiZWNhdXNlIGl0IHN0YXlzIHdoZW4geW91IGFyZSB0eXBpbmchCistIFRoZSBMaW5lL0NvbCBpbiB0aGUgc3RhdHVzIGJhciBjYW4gYmUgd3JvbmcgaW5pdGlhbGx5IGluIFB5U2hlbGwgRE9ORQorCitTdHJ1Y3R1cmFsIHByb2JsZW1zOgorCistIHRvbyBtdWNoIGtub3dsZWRnZSBpbiBGaWxlTGlzdCBhYm91dCBFZGl0b3JXaW5kb3cgKGZvciBleGFtcGxlKQorLSBzaG91bGQgYWRkIHNvbWUgcHJpbWl0aXZlcyBmb3IgYWNjZXNzaW5nIHRoZSBzZWxlY3Rpb24gZXRjLgorICB0byByZXBlYXQgY3VtYmVyc29tZSBjb2RlIG92ZXIgYW5kIG92ZXIKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitKZWZmIEJhdWVyIHN1Z2dlc3RzOgorCistIE9wZW4gTW9kdWxlIGRvZXNuJ3QgYXBwZWFyIHRvIGhhbmRsZSBoaWVyYXJjaGljYWwgcGFja2FnZXMuCistIENsYXNzIGJyb3dzZXIgc2hvdWxkIGFsc28gYWxsb3cgaGllcmFyY2hpY2FsIHBhY2thZ2VzLgorLSBPcGVuIGFuZCBPcGVuIE1vZHVsZSBjb3VsZCBiZW5lZml0IGZyb20gYSBoaXN0b3J5LCBET05FCisgIGVpdGhlciBjb21tYW5kIGxpbmUgc3R5bGUsIG9yIE1pY3Jvc29mdCByZWNlbnQtZmlsZQorICBzdHlsZS4KKy0gQWRkIGEgU21hbGx0YWxrLXN0eWxlIGluc3BlY3RvciAgKGkuZS4gVGtpbnNwZWN0KQorCitUaGUgbGFzdCBzdWdnZXN0aW9uIGlzIGFscmVhZHkgYSByZWFsaXR5LCBidXQgbm90IHlldAoraW50ZWdyYXRlZCBpbnRvIElETEUuICBJIHVzZSBhIG1vZHVsZSBjYWxsZWQgaW5zcGVjdG9yLnB5LAordGhhdCB1c2VkIHRvIGJlIGF2YWlsYWJsZSBmcm9tIHB5dGhvbi5vcmcoPykgIEl0IG5vIGxvbmdlcgorYXBwZWFycyB0byBiZSBpbiB0aGUgY29udHJpYnV0ZWQgc2VjdGlvbiwgYW5kIHRoZSBzb3VyY2UKK2hhcyBubyBhdXRob3IgYXR0cmlidXRpb24uCisKK0luIGFueSBjYXNlLCB0aGUgY29kZSBpcyB1c2VmdWwgZm9yIHZpc3VhbGx5IG5hdmlnYXRpbmcKK2FuIG9iamVjdCdzIGF0dHJpYnV0ZXMsIGluY2x1ZGluZyBpdHMgY29udGFpbmVyIGhpZXJhcmNoeS4KKworICAgID4+PiBmcm9tIGluc3BlY3RvciBpbXBvcnQgVGtpbnNwZWN0CisgICAgPj4+IFRraW5zcGVjdChOb25lLCBteU9iamVjdCkKKworVGtpbnNwZWN0IGNvdWxkIHByb2JhYmx5IGJlIGV4dGVuZGVkIGFuZCByZWZpbmVkIHRvCitpbnRlZ3JhdGUgYmV0dGVyIGludG8gSURMRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb21wYXJpc29uIHRvIFBUVUkKKy0tLS0tLS0tLS0tLS0tLS0tLQorCisrIFBUVUkncyBoZWxwIGlzIGJldHRlciAoSFRNTCEpCisKKysgUFRVSSBjYW4gYXR0YWNoIGEgc2hlbGwgdG8gYW55IG1vZHVsZQorCisrIFBUVUkgaGFzIHNvbWUgbW9yZSBJL08gY29tbWFuZHM6CisgIG9wZW4gbXVsdGlwbGUKKyAgYXBwZW5kCisgIGV4YW1pbmUgKHdoYXQncyB0aGF0PykKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitOb3RlcyBhZnRlciB0cnlpbmcgdG8gcnVuIEdyYWlsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gR3JhaWwgZG9lcyBzdHVmZiB0byBzeXMucGF0aCBiYXNlZCBvbiBzeXMuYXJndlswXTsgeW91IG11c3Qgc2V0CitzeXMuYXJndlswXSB0byBzb21ldGhpbmcgZGVjZW50IGZpcnN0IChpdCBpcyBub3JtYWxseSBzZXQgdG8gdGhlIHBhdGggb2YKK3RoZSBpZGxlIHNjcmlwdCkuCisKKy0gR3JhaWwgbXVzdCBiZSBleGVjJ2VkIGluIF9fbWFpbl9fIGJlY2F1c2UgdGhhdCdzIGltcG9ydGVkIGJ5IHNvbWUKK290aGVyIHBhcnRzIG9mIEdyYWlsLgorCistIEdyYWlsIHVzZXMgYSBtb2R1bGUgY2FsbGVkIEhpc3RvcnkgYW5kIHNvIGRvZXMgaWRsZSA6LSgKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSb2JpbiBGcmllZHJpY2gncyBpdGVtczoKKworVGhpbmdzIEknZCBsaWtlIHRvIHNlZToKKyAgICAtIEknZCBsaWtlIHN1cHBvcnQgZm9yIHNoaWZ0LWNsaWNrIGV4dGVuZGluZyB0aGUgc2VsZWN0aW9uLiBUaGVyZSdzIGEKKyAgICAgIGJ1ZyBub3cgdGhhdCBpdCBkb2Vzbid0IHdvcmsgdGhlIGZpcnN0IHRpbWUgeW91IHRyeSBpdC4KKyAgICAtIFByaW50aW5nIGlzIG5lZWRlZC4gSG93IGhhcmQgY2FuIHRoYXQgYmUgb24gV2luZG93cz8gRklSU1QgQ1VUIERPTkUKKyAgICAtIFRoZSBweXRob24tbW9kZSB0cmljayBvZiBhdXRvaW5kZW50aW5nIGEgbGluZSB3aXRoIDx0YWI+IGlzIG5lYXQgYW5kCisgICAgICB2ZXJ5IGhhbmR5LgorICAgIC0gKHNvbWVkYXkpIGEgc3BlbGxjaGVja2VyIGZvciBkb2NzdHJpbmdzIGFuZCBjb21tZW50cy4KKyAgICAtIGEgcGFnZWRvd24vdXAgY29tbWFuZCBrZXkgd2hpY2ggbW92ZXMgdG8gbmV4dCBjbGFzcy9kZWYgc3RhdGVtZW50ICh0b3AKKyAgICAgIGxldmVsKQorICAgIC0gc3BsaXQgd2luZG93IGNhcGFiaWxpdHkKKyAgICAtIERuRCB0ZXh0IHJlbG9jYXRpb24vY29weWluZworCitUaGluZ3MgSSBkb24ndCB3YW50IHRvIHNlZS4KKyAgICAtIGxpbmUgbnVtYmVycy4uLiAgd2lsbCBwcm9iYWJseSBzbG93IHRoaW5ncyBkb3duIHdheSB0b28gbXVjaC4KKyAgICAtIFBsZWFzZSB1c2UgYW5vdGhlciBpY29uIGZvciB0aGUgdHJlZSBicm93c2VyIGxlYWYuIFRoZSBzbWFsbCBzbmFrZQorICAgICAgaXNuJ3QgY3V0dGluZyBpdC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIEN1c3RvbWl6YWJsZSB2aWV3cyAobXVsdGktd2luZG93IG9yIG11bHRpLXBhbmUpLiAgKE1hcmt1cyBHcml0c2NoKQorCistIEJlaW5nIGFibGUgdG8gZG91YmxlIGNsaWNrIChtYXliZSBkb3VibGUgcmlnaHQgY2xpY2spIG9uIGEgY2FsbGFibGUKK29iamVjdCBpbiB0aGUgZWRpdG9yIHdoaWNoIHNob3dzIHRoZSBzb3VyY2Ugb2YgdGhlIG9iamVjdCwgaWYKK3Bvc3NpYmxlLiAgKEdlcnJpdCBIb2xsKQorCistIEhvb2tzIGludG8gdGhlIGd1dHMsIGxpa2UgaW4gRW1hY3MuICAoTWlrZSBSb21iZXJnKQorCistIFNoYXJpbmcgdGhlIGVkaXRvciB3aXRoIGEgcmVtb3RlIHR1dG9yLiAgKE1hcnRpam4gRmFhc3NlbikKKworLSBNdWx0aXBsZSB2aWV3cyBvbiB0aGUgc2FtZSBmaWxlLiAgKFRvbnkgSiBJYmJzKQorCistIFN0b3JlIGJyZWFrcG9pbnRzIGluIGEgZ2xvYmFsIChwZXItcHJvamVjdCkgZGF0YWJhc2UgKEd2Uik7IERpcmsKK0hlaXNlIGFkZHM6IHNhdmUgc29tZSBzcGFjZS10cmltbWVkIGNvbnRleHQgYW5kIHNlYXJjaCBhcm91bmQgd2hlbgorcmVvcGVuaW5nIGEgZmlsZSB0aGF0IG1pZ2h0IGhhdmUgYmVlbiBlZGl0ZWQgYnkgc29tZW9uZSBlbHNlLgorCistIENhcHR1cmUgbWVudSBldmVudHMgaW4gZXh0ZW5zaW9ucyB3aXRob3V0IGNoYW5naW5nIHRoZSBJRExFIHNvdXJjZS4KKyhNYXR0aGlhcyBCYXJtZWllcikKKworLSBVc2Ugb3ZlcmxhcHBpbmcgcGFuZWxzIChhICJub3RlYm9vayIgaW4gTUZDIHRlcm1zIEkgdGhpbmspIGZvciBpbmZvCit0aGF0IGRvZXNuJ3QgbmVlZCB0byBiZSBhY2Nlc3NpYmxlIHNpbXVsdGFuZW91c2x5IChlLmcuIEhUTUwgc291cmNlCithbmQgb3V0cHV0KS4gIFVzZSBtdWx0aS1wYW5lIHdpbmRvd3MgZm9yIGluZm8gdGhhdCBkb2VzIG5lZWQgdG8gYmUKK3Nob3duIHRvZ2V0aGVyIChlLmcuIGNsYXNzIGJyb3dzZXIgYW5kIHNvdXJjZSkuICAoQWxiZXJ0IEJyYW5kbCkKKworLSBBIHByb2plY3Qgc2hvdWxkIGludmlzaWJseSB0cmFjayBhbGwgc3ltYm9scywgZm9yIGluc3RhbnQgc2VhcmNoLAorcmVwbGFjZSBhbmQgY3Jvc3MtcmVmLiAgUHJvamVjdHMgc2hvdWxkIGJlIGFsbG93ZWQgdG8gc3BhbiBtdWx0aXBsZQorZGlyZWN0b3JpZXMsIGhvc3RzLCBldGMuICBQcm9qZWN0IG1hbmFnZW1lbnQgZmlsZXMgYXJlIHBsYWNlZCBpbiBhCitkaXJlY3RvcnkgeW91IHNwZWNpZnkuICBBIGdsb2JhbCBtYXBwaW5nIGJldHdlZW4gcHJvamVjdCBuYW1lcyBhbmQKK3Byb2plY3QgZGlyZWN0b3JpZXMgc2hvdWxkIGV4aXN0IFtub3Qgc28gc3VyZSAtLUd2Ul0uICAoVGltIFBldGVycykKKworLSBNZXJnZSBhdHRyLXRpcHMgYW5kIGF1dG8tZXhwYW5kLiAgKE1hcmsgSGFtbW9uZCwgVGltIFBldGVycykKKworLSBQeXRob24gU2hlbGwgc2hvdWxkIGJlaGF2ZSBtb3JlIGxpa2UgYSAic2hlbGwgd2luZG93IiBhcyB1c2VycyBrbm93CitpdCAtLSBpLmUuIHlvdSBjYW4gb25seSBlZGl0IHRoZSBjdXJyZW50IGNvbW1hbmQsIGFuZCB0aGUgY3Vyc29yIGNhbid0Citlc2NhcGUgZnJvbSB0aGUgY29tbWFuZCBhcmVhLiAgKEFsYmVydCBCcmFuZGwpCisKKy0gU2V0IFgxMSBjbGFzcyB0byAiaWRsZS9JZGxlIiwgc2V0IGljb24gYW5kIHRpdGxlIHRvIHNvbWV0aGluZworYmVnaW5uaW5nIHdpdGggImlkbGUiIC0tIGZvciB3aW5kb3cgbWFuYW5nZXJzLiAgKFJhbmRhbGwgSG9wcGVyKQorCistIENvbmZpZyBmaWxlcyBlZGl0YWJsZSB0aHJvdWdoIGEgcHJlZmVyZW5jZXMgZGlhbG9nLiAgKG1lKSBET05FCisKKy0gQ29uZmlnIGZpbGVzIHN0aWxsIGVkaXRhYmxlIG91dHNpZGUgdGhlIHByZWZlcmVuY2VzIGRpYWxvZy4KKyhSYW5kYWxsIEhvcHBlcikgRE9ORQorCistIFdoZW4geW91J3JlIGVkaXRpbmcgYSBjb21tYW5kIGluIFB5U2hlbGwsIGFuZCB0aGVyZSBhcmUgb25seSBibGFuaworbGluZXMgYmVsb3cgdGhlIGN1cnNvciwgaGl0dGluZyBSZXR1cm4gc2hvdWxkIGlnbm9yZSBvciBkZWxldGUgdGhvc2UKK2JsYW5rIGxpbmVzIHJhdGhlciB0aGFuIGRlY2lkaW5nIHlvdSdyZSBub3Qgb24gdGhlIGxhc3QgbGluZS4gIChtZSkKKworLSBSdW4gY29tbWFuZCAoRjUgYy5zLikgc2hvdWxkIGJlIG1vcmUgbGlrZSBQeXRob253aW4ncyBSdW4gLS0gYQorZGlhbG9nIHdpdGggb3B0aW9ucyB0byBnaXZlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsIHJ1biB0aGUgZGVidWdnZXIsCitldGMuICAobWUpCisKKy0gU2hvdWxkbid0IGJlIGFibGUgdG8gZGVsZXRlIHBhcnQgb2YgdGhlIHByb21wdCAob3IgYW55IHRleHQgYmVmb3JlCitpdCkgaW4gdGhlIFB5U2hlbGwuICAoTWFydGlqbiBGYWFzc2VuKSAgIERPTkUKKworLSBFbWFjcyBzdHlsZSBhdXRvLWZpbGwgKGFsc28gc21hcnQgYWJvdXQgY29tbWVudHMgYW5kIHN0cmluZ3MpLgorKEplcmVteSBIeWx0b24pCisKKy0gT3V0cHV0IG9mIFJ1biBTY3JpcHQgc2hvdWxkIGdvIHRvIGEgc2VwYXJhdGUgb3V0cHV0IHdpbmRvdywgbm90IHRvCit0aGUgc2hlbGwgd2luZG93LiAgT3V0cHV0IG9mIHNlcGFyYXRlIHJ1bnMgc2hvdWxkIGFsbCBnbyB0byB0aGUgc2FtZQord2luZG93IGJ1dCBjbGVhcmx5IGRlbGltaXRlZC4gIChEYXZpZCBTY2hlcmVyKSBSRUpFQ1QgRklSU1QsIExBVFRFUiBET05FCisKKy0gR1VJIGZvcm0gZGVzaWduZXIgdG8ga2ljayBWQidzIGJ1dHQuICAoUm9iZXJ0IEdlaWdlcikgVEhBVCdTIE5PVCBJRExFCisKKy0gUHJpbnRpbmchICBQb3NzaWJseSB2aWEgZ2VuZXJhdGlvbiBvZiBQREYgZmlsZXMgd2hpY2ggdGhlIHVzZXIgbXVzdAordGhlbiBzZW5kIHRvIHRoZSBwcmludGVyIHNlcGFyYXRlbHkuICAoRGludSBHaGVybWFuKSAgRklSU1QgQ1VUCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvVG9vbFRpcC5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Ub29sVGlwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlN2EzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvVG9vbFRpcC5weQpAQCAtMCwwICsxLDg5IEBACisjIGdlbmVyYWwgcHVycG9zZSAndG9vbHRpcCcgcm91dGluZXMgLSBjdXJyZW50bHkgdW51c2VkIGluIGlkbGVmb3JrCisjIChhbHRob3VnaCB0aGUgJ2NhbGx0aXBzJyBleHRlbnNpb24gaXMgcGFydGx5IGJhc2VkIG9uIHRoaXMgY29kZSkKKyMgbWF5IGJlIHVzZWZ1bCBmb3Igc29tZSBwdXJwb3NlcyBpbiAob3IgYWxtb3N0IGluIDspIHRoZSBjdXJyZW50IHByb2plY3Qgc2NvcGUKKyMgSWRlYXMgZ2xlYW5lZCBmcm9tIFB5U29sCisKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgorCitjbGFzcyBUb29sVGlwQmFzZToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidXR0b24pOgorICAgICAgICBzZWxmLmJ1dHRvbiA9IGJ1dHRvbgorICAgICAgICBzZWxmLnRpcHdpbmRvdyA9IE5vbmUKKyAgICAgICAgc2VsZi5pZCA9IE5vbmUKKyAgICAgICAgc2VsZi54ID0gc2VsZi55ID0gMAorICAgICAgICBzZWxmLl9pZDEgPSBzZWxmLmJ1dHRvbi5iaW5kKCI8RW50ZXI+Iiwgc2VsZi5lbnRlcikKKyAgICAgICAgc2VsZi5faWQyID0gc2VsZi5idXR0b24uYmluZCgiPExlYXZlPiIsIHNlbGYubGVhdmUpCisgICAgICAgIHNlbGYuX2lkMyA9IHNlbGYuYnV0dG9uLmJpbmQoIjxCdXR0b25QcmVzcz4iLCBzZWxmLmxlYXZlKQorCisgICAgZGVmIGVudGVyKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLnNjaGVkdWxlKCkKKworICAgIGRlZiBsZWF2ZShzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgc2VsZi51bnNjaGVkdWxlKCkKKyAgICAgICAgc2VsZi5oaWRldGlwKCkKKworICAgIGRlZiBzY2hlZHVsZShzZWxmKToKKyAgICAgICAgc2VsZi51bnNjaGVkdWxlKCkKKyAgICAgICAgc2VsZi5pZCA9IHNlbGYuYnV0dG9uLmFmdGVyKDE1MDAsIHNlbGYuc2hvd3RpcCkKKworICAgIGRlZiB1bnNjaGVkdWxlKHNlbGYpOgorICAgICAgICBpZCA9IHNlbGYuaWQKKyAgICAgICAgc2VsZi5pZCA9IE5vbmUKKyAgICAgICAgaWYgaWQ6CisgICAgICAgICAgICBzZWxmLmJ1dHRvbi5hZnRlcl9jYW5jZWwoaWQpCisKKyAgICBkZWYgc2hvd3RpcChzZWxmKToKKyAgICAgICAgaWYgc2VsZi50aXB3aW5kb3c6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBUaGUgdGlwIHdpbmRvdyBtdXN0IGJlIGNvbXBsZXRlbHkgb3V0c2lkZSB0aGUgYnV0dG9uOworICAgICAgICAjIG90aGVyd2lzZSB3aGVuIHRoZSBtb3VzZSBlbnRlcnMgdGhlIHRpcCB3aW5kb3cgd2UgZ2V0CisgICAgICAgICMgYSBsZWF2ZSBldmVudCBhbmQgaXQgZGlzYXBwZWFycywgYW5kIHRoZW4gd2UgZ2V0IGFuIGVudGVyCisgICAgICAgICMgZXZlbnQgYW5kIGl0IHJlYXBwZWFycywgYW5kIHNvIG9uIGZvcmV2ZXIgOi0oCisgICAgICAgIHggPSBzZWxmLmJ1dHRvbi53aW5mb19yb290eCgpICsgMjAKKyAgICAgICAgeSA9IHNlbGYuYnV0dG9uLndpbmZvX3Jvb3R5KCkgKyBzZWxmLmJ1dHRvbi53aW5mb19oZWlnaHQoKSArIDEKKyAgICAgICAgc2VsZi50aXB3aW5kb3cgPSB0dyA9IFRvcGxldmVsKHNlbGYuYnV0dG9uKQorICAgICAgICB0dy53bV9vdmVycmlkZXJlZGlyZWN0KDEpCisgICAgICAgIHR3LndtX2dlb21ldHJ5KCIrJWQrJWQiICUgKHgsIHkpKQorICAgICAgICBzZWxmLnNob3djb250ZW50cygpCisKKyAgICBkZWYgc2hvd2NvbnRlbnRzKHNlbGYsIHRleHQ9IllvdXIgdGV4dCBoZXJlIik6CisgICAgICAgICMgT3ZlcnJpZGUgdGhpcyBpbiBkZXJpdmVkIGNsYXNzCisgICAgICAgIGxhYmVsID0gTGFiZWwoc2VsZi50aXB3aW5kb3csIHRleHQ9dGV4dCwganVzdGlmeT1MRUZULAorICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9IiNmZmZmZTAiLCByZWxpZWY9U09MSUQsIGJvcmRlcndpZHRoPTEpCisgICAgICAgIGxhYmVsLnBhY2soKQorCisgICAgZGVmIGhpZGV0aXAoc2VsZik6CisgICAgICAgIHR3ID0gc2VsZi50aXB3aW5kb3cKKyAgICAgICAgc2VsZi50aXB3aW5kb3cgPSBOb25lCisgICAgICAgIGlmIHR3OgorICAgICAgICAgICAgdHcuZGVzdHJveSgpCisKK2NsYXNzIFRvb2xUaXAoVG9vbFRpcEJhc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidXR0b24sIHRleHQpOgorICAgICAgICBUb29sVGlwQmFzZS5fX2luaXRfXyhzZWxmLCBidXR0b24pCisgICAgICAgIHNlbGYudGV4dCA9IHRleHQKKyAgICBkZWYgc2hvd2NvbnRlbnRzKHNlbGYpOgorICAgICAgICBUb29sVGlwQmFzZS5zaG93Y29udGVudHMoc2VsZiwgc2VsZi50ZXh0KQorCitjbGFzcyBMaXN0Ym94VG9vbFRpcChUb29sVGlwQmFzZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1dHRvbiwgaXRlbXMpOgorICAgICAgICBUb29sVGlwQmFzZS5fX2luaXRfXyhzZWxmLCBidXR0b24pCisgICAgICAgIHNlbGYuaXRlbXMgPSBpdGVtcworICAgIGRlZiBzaG93Y29udGVudHMoc2VsZik6CisgICAgICAgIGxpc3Rib3ggPSBMaXN0Ym94KHNlbGYudGlwd2luZG93LCBiYWNrZ3JvdW5kPSIjZmZmZmUwIikKKyAgICAgICAgbGlzdGJveC5wYWNrKCkKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5pdGVtczoKKyAgICAgICAgICAgIGxpc3Rib3guaW5zZXJ0KEVORCwgaXRlbSkKKworZGVmIG1haW4oKToKKyAgICAjIFRlc3QgY29kZQorICAgIHJvb3QgPSBUaygpCisgICAgYiA9IEJ1dHRvbihyb290LCB0ZXh0PSJIZWxsbyIsIGNvbW1hbmQ9cm9vdC5kZXN0cm95KQorICAgIGIucGFjaygpCisgICAgcm9vdC51cGRhdGUoKQorICAgIHRpcCA9IExpc3Rib3hUb29sVGlwKGIsIFsiSGVsbG8iLCAid29ybGQiXSkKKyAgICByb290Lm1haW5sb29wKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9Ub29sVGlwLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Ub29sVGlwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGUxYjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Rvb2xUaXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9Ub29sVGlwLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Ub29sVGlwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGUxYjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Rvb2xUaXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1RyZWVXaWRnZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZlY2EwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5CkBAIC0wLDAgKzEsNDc3IEBACisjIFhYWCBUTyBETzoKKyMgLSBwb3B1cCBtZW51CisjIC0gc3VwcG9ydCBwYXJ0aWFsIG9yIHRvdGFsIHJlZGlzcGxheQorIyAtIGtleSBiaW5kaW5ncyAoaW5zdGVhZCBvZiBxdWljay1uLWRpcnR5IGJpbmRpbmdzIG9uIENhbnZhcyk6CisjICAgLSB1cC9kb3duIGFycm93IGtleXMgdG8gbW92ZSBmb2N1cyBhcm91bmQKKyMgICAtIGRpdHRvIGZvciBwYWdlIHVwL2Rvd24sIGhvbWUvZW5kCisjICAgLSBsZWZ0L3JpZ2h0IGFycm93cyB0byBleHBhbmQvY29sbGFwc2UgJiBtb3ZlIG91dC9pbgorIyAtIG1vcmUgZG9jIHN0cmluZ3MKKyMgLSBhZGQgaWNvbnMgZm9yICJmaWxlIiwgIm1vZHVsZSIsICJjbGFzcyIsICJtZXRob2QiOyBiZXR0ZXIgInB5dGhvbiIgaWNvbgorIyAtIGNhbGxiYWNrIGZvciBzZWxlY3Rpb24/Pz8KKyMgLSBtdWx0aXBsZS1pdGVtIHNlbGVjdGlvbgorIyAtIHRvb2x0aXBzCisjIC0gcmVkbyBnZW9tZXRyeSB3aXRob3V0IG1hZ2ljIG51bWJlcnMKKyMgLSBrZWVwIHRyYWNrIG9mIG9iamVjdCBpZHMgdG8gYWxsb3cgbW9yZSBjYXJlZnVsIGNsZWFuaW5nCisjIC0gb3B0aW1pemUgdHJlZSByZWRyYXcgYWZ0ZXIgZXhwYW5kIG9mIHN1Ym5vZGUKKworaW1wb3J0IG9zCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKK2ltcG9ydCBpbXAKKworZnJvbSBpZGxlbGliIGltcG9ydCBab29tSGVpZ2h0Citmcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKKworSUNPTkRJUiA9ICJJY29ucyIKKworIyBMb29rIGZvciBJY29ucyBzdWJkaXJlY3RvcnkgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgbW9kdWxlCit0cnk6CisgICAgX2ljb25kaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgSUNPTkRJUikKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgX2ljb25kaXIgPSBJQ09ORElSCitpZiBvcy5wYXRoLmlzZGlyKF9pY29uZGlyKToKKyAgICBJQ09ORElSID0gX2ljb25kaXIKK2VsaWYgbm90IG9zLnBhdGguaXNkaXIoSUNPTkRJUik6CisgICAgcmFpc2UgUnVudGltZUVycm9yLCAiY2FuJ3QgZmluZCBpY29uIGRpcmVjdG9yeSAoJXIpIiAlIChJQ09ORElSLCkKKworZGVmIGxpc3RpY29ucyhpY29uZGlyPUlDT05ESVIpOgorICAgICIiIlV0aWxpdHkgdG8gZGlzcGxheSB0aGUgYXZhaWxhYmxlIGljb25zLiIiIgorICAgIHJvb3QgPSBUaygpCisgICAgaW1wb3J0IGdsb2IKKyAgICBsaXN0ID0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihpY29uZGlyLCAiKi5naWYiKSkKKyAgICBsaXN0LnNvcnQoKQorICAgIGltYWdlcyA9IFtdCisgICAgcm93ID0gY29sdW1uID0gMAorICAgIGZvciBmaWxlIGluIGxpc3Q6CisgICAgICAgIG5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoZmlsZSkpWzBdCisgICAgICAgIGltYWdlID0gUGhvdG9JbWFnZShmaWxlPWZpbGUsIG1hc3Rlcj1yb290KQorICAgICAgICBpbWFnZXMuYXBwZW5kKGltYWdlKQorICAgICAgICBsYWJlbCA9IExhYmVsKHJvb3QsIGltYWdlPWltYWdlLCBiZD0xLCByZWxpZWY9InJhaXNlZCIpCisgICAgICAgIGxhYmVsLmdyaWQocm93PXJvdywgY29sdW1uPWNvbHVtbikKKyAgICAgICAgbGFiZWwgPSBMYWJlbChyb290LCB0ZXh0PW5hbWUpCisgICAgICAgIGxhYmVsLmdyaWQocm93PXJvdysxLCBjb2x1bW49Y29sdW1uKQorICAgICAgICBjb2x1bW4gPSBjb2x1bW4gKyAxCisgICAgICAgIGlmIGNvbHVtbiA+PSAxMDoKKyAgICAgICAgICAgIHJvdyA9IHJvdysyCisgICAgICAgICAgICBjb2x1bW4gPSAwCisgICAgcm9vdC5pbWFnZXMgPSBpbWFnZXMKKworCitjbGFzcyBUcmVlTm9kZToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYW52YXMsIHBhcmVudCwgaXRlbSk6CisgICAgICAgIHNlbGYuY2FudmFzID0gY2FudmFzCisgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CisgICAgICAgIHNlbGYuaXRlbSA9IGl0ZW0KKyAgICAgICAgc2VsZi5zdGF0ZSA9ICdjb2xsYXBzZWQnCisgICAgICAgIHNlbGYuc2VsZWN0ZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmNoaWxkcmVuID0gW10KKyAgICAgICAgc2VsZi54ID0gc2VsZi55ID0gTm9uZQorICAgICAgICBzZWxmLmljb25pbWFnZXMgPSB7fSAjIGNhY2hlIG9mIFBob3RvSW1hZ2UgaW5zdGFuY2VzIGZvciBpY29ucworCisgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgIGZvciBjIGluIHNlbGYuY2hpbGRyZW5bOl06CisgICAgICAgICAgICBzZWxmLmNoaWxkcmVuLnJlbW92ZShjKQorICAgICAgICAgICAgYy5kZXN0cm95KCkKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCisKKyAgICBkZWYgZ2V0aWNvbmltYWdlKHNlbGYsIG5hbWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5pY29uaW1hZ2VzW25hbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZmlsZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQorICAgICAgICBleHQgPSBleHQgb3IgIi5naWYiCisgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKElDT05ESVIsIGZpbGUgKyBleHQpCisgICAgICAgIGltYWdlID0gUGhvdG9JbWFnZShtYXN0ZXI9c2VsZi5jYW52YXMsIGZpbGU9ZnVsbG5hbWUpCisgICAgICAgIHNlbGYuaWNvbmltYWdlc1tuYW1lXSA9IGltYWdlCisgICAgICAgIHJldHVybiBpbWFnZQorCisgICAgZGVmIHNlbGVjdChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5zZWxlY3RlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmRlc2VsZWN0YWxsKCkKKyAgICAgICAgc2VsZi5zZWxlY3RlZCA9IFRydWUKKyAgICAgICAgc2VsZi5jYW52YXMuZGVsZXRlKHNlbGYuaW1hZ2VfaWQpCisgICAgICAgIHNlbGYuZHJhd2ljb24oKQorICAgICAgICBzZWxmLmRyYXd0ZXh0KCkKKworICAgIGRlZiBkZXNlbGVjdChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgbm90IHNlbGYuc2VsZWN0ZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5zZWxlY3RlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuY2FudmFzLmRlbGV0ZShzZWxmLmltYWdlX2lkKQorICAgICAgICBzZWxmLmRyYXdpY29uKCkKKyAgICAgICAgc2VsZi5kcmF3dGV4dCgpCisKKyAgICBkZWYgZGVzZWxlY3RhbGwoc2VsZik6CisgICAgICAgIGlmIHNlbGYucGFyZW50OgorICAgICAgICAgICAgc2VsZi5wYXJlbnQuZGVzZWxlY3RhbGwoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kZXNlbGVjdHRyZWUoKQorCisgICAgZGVmIGRlc2VsZWN0dHJlZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zZWxlY3RlZDoKKyAgICAgICAgICAgIHNlbGYuZGVzZWxlY3QoKQorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIGNoaWxkLmRlc2VsZWN0dHJlZSgpCisKKyAgICBkZWYgZmxpcChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSAnZXhwYW5kZWQnOgorICAgICAgICAgICAgc2VsZi5jb2xsYXBzZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmV4cGFuZCgpCisgICAgICAgIHNlbGYuaXRlbS5PbkRvdWJsZUNsaWNrKCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBleHBhbmQoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLml0ZW0uX0lzRXhwYW5kYWJsZSgpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuc3RhdGUgIT0gJ2V4cGFuZGVkJzoKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnZXhwYW5kZWQnCisgICAgICAgICAgICBzZWxmLnVwZGF0ZSgpCisgICAgICAgICAgICBzZWxmLnZpZXcoKQorCisgICAgZGVmIGNvbGxhcHNlKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLnN0YXRlICE9ICdjb2xsYXBzZWQnOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdjb2xsYXBzZWQnCisgICAgICAgICAgICBzZWxmLnVwZGF0ZSgpCisKKyAgICBkZWYgdmlldyhzZWxmKToKKyAgICAgICAgdG9wID0gc2VsZi55IC0gMgorICAgICAgICBib3R0b20gPSBzZWxmLmxhc3R2aXNpYmxlY2hpbGQoKS55ICsgMTcKKyAgICAgICAgaGVpZ2h0ID0gYm90dG9tIC0gdG9wCisgICAgICAgIHZpc2libGVfdG9wID0gc2VsZi5jYW52YXMuY2FudmFzeSgwKQorICAgICAgICB2aXNpYmxlX2hlaWdodCA9IHNlbGYuY2FudmFzLndpbmZvX2hlaWdodCgpCisgICAgICAgIHZpc2libGVfYm90dG9tID0gc2VsZi5jYW52YXMuY2FudmFzeSh2aXNpYmxlX2hlaWdodCkKKyAgICAgICAgaWYgdmlzaWJsZV90b3AgPD0gdG9wIGFuZCBib3R0b20gPD0gdmlzaWJsZV9ib3R0b206CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgeDAsIHkwLCB4MSwgeTEgPSBzZWxmLmNhbnZhcy5fZ2V0aW50cyhzZWxmLmNhbnZhc1snc2Nyb2xscmVnaW9uJ10pCisgICAgICAgIGlmIHRvcCA+PSB2aXNpYmxlX3RvcCBhbmQgaGVpZ2h0IDw9IHZpc2libGVfaGVpZ2h0OgorICAgICAgICAgICAgZnJhY3Rpb24gPSB0b3AgKyBoZWlnaHQgLSB2aXNpYmxlX2hlaWdodAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnJhY3Rpb24gPSB0b3AKKyAgICAgICAgZnJhY3Rpb24gPSBmbG9hdChmcmFjdGlvbikgLyB5MQorICAgICAgICBzZWxmLmNhbnZhcy55dmlld19tb3ZldG8oZnJhY3Rpb24pCisKKyAgICBkZWYgbGFzdHZpc2libGVjaGlsZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGlsZHJlbiBhbmQgc2VsZi5zdGF0ZSA9PSAnZXhwYW5kZWQnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hpbGRyZW5bLTFdLmxhc3R2aXNpYmxlY2hpbGQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiB1cGRhdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYucGFyZW50OgorICAgICAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9sZGN1cnNvciA9IHNlbGYuY2FudmFzWydjdXJzb3InXQorICAgICAgICAgICAgc2VsZi5jYW52YXNbJ2N1cnNvciddID0gIndhdGNoIgorICAgICAgICAgICAgc2VsZi5jYW52YXMudXBkYXRlKCkKKyAgICAgICAgICAgIHNlbGYuY2FudmFzLmRlbGV0ZShBTEwpICAgICAjIFhYWCBjb3VsZCBiZSBtb3JlIHN1YnRsZQorICAgICAgICAgICAgc2VsZi5kcmF3KDcsIDIpCisgICAgICAgICAgICB4MCwgeTAsIHgxLCB5MSA9IHNlbGYuY2FudmFzLmJib3goQUxMKQorICAgICAgICAgICAgc2VsZi5jYW52YXMuY29uZmlndXJlKHNjcm9sbHJlZ2lvbj0oMCwgMCwgeDEsIHkxKSkKKyAgICAgICAgICAgIHNlbGYuY2FudmFzWydjdXJzb3InXSA9IG9sZGN1cnNvcgorCisgICAgZGVmIGRyYXcoc2VsZiwgeCwgeSk6CisgICAgICAgICMgWFhYIFRoaXMgaGFyZC1jb2RlcyB0b28gbWFueSBnZW9tZXRyeSBjb25zdGFudHMhCisgICAgICAgIHNlbGYueCwgc2VsZi55ID0geCwgeQorICAgICAgICBzZWxmLmRyYXdpY29uKCkKKyAgICAgICAgc2VsZi5kcmF3dGV4dCgpCisgICAgICAgIGlmIHNlbGYuc3RhdGUgIT0gJ2V4cGFuZGVkJzoKKyAgICAgICAgICAgIHJldHVybiB5KzE3CisgICAgICAgICMgZHJhdyBjaGlsZHJlbgorICAgICAgICBpZiBub3Qgc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIHN1Ymxpc3QgPSBzZWxmLml0ZW0uX0dldFN1Ykxpc3QoKQorICAgICAgICAgICAgaWYgbm90IHN1Ymxpc3Q6CisgICAgICAgICAgICAgICAgIyBfSXNFeHBhbmRhYmxlKCkgd2FzIG1pc3Rha2VuOyB0aGF0J3MgYWxsb3dlZAorICAgICAgICAgICAgICAgIHJldHVybiB5KzE3CisgICAgICAgICAgICBmb3IgaXRlbSBpbiBzdWJsaXN0OgorICAgICAgICAgICAgICAgIGNoaWxkID0gc2VsZi5fX2NsYXNzX18oc2VsZi5jYW52YXMsIHNlbGYsIGl0ZW0pCisgICAgICAgICAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQoY2hpbGQpCisgICAgICAgIGN4ID0geCsyMAorICAgICAgICBjeSA9IHkrMTcKKyAgICAgICAgY3lsYXN0ID0gMAorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIGN5bGFzdCA9IGN5CisgICAgICAgICAgICBzZWxmLmNhbnZhcy5jcmVhdGVfbGluZSh4KzksIGN5KzcsIGN4LCBjeSs3LCBmaWxsPSJncmF5NTAiKQorICAgICAgICAgICAgY3kgPSBjaGlsZC5kcmF3KGN4LCBjeSkKKyAgICAgICAgICAgIGlmIGNoaWxkLml0ZW0uX0lzRXhwYW5kYWJsZSgpOgorICAgICAgICAgICAgICAgIGlmIGNoaWxkLnN0YXRlID09ICdleHBhbmRlZCc6CisgICAgICAgICAgICAgICAgICAgIGljb25uYW1lID0gIm1pbnVzbm9kZSIKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBjaGlsZC5jb2xsYXBzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGljb25uYW1lID0gInBsdXNub2RlIgorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGNoaWxkLmV4cGFuZAorICAgICAgICAgICAgICAgIGltYWdlID0gc2VsZi5nZXRpY29uaW1hZ2UoaWNvbm5hbWUpCisgICAgICAgICAgICAgICAgaWQgPSBzZWxmLmNhbnZhcy5jcmVhdGVfaW1hZ2UoeCs5LCBjeWxhc3QrNywgaW1hZ2U9aW1hZ2UpCisgICAgICAgICAgICAgICAgIyBYWFggVGhpcyBsZWFrcyBiaW5kaW5ncyB1bnRpbCBjYW52YXMgaXMgZGVsZXRlZDoKKyAgICAgICAgICAgICAgICBzZWxmLmNhbnZhcy50YWdfYmluZChpZCwgIjwxPiIsIGNhbGxiYWNrKQorICAgICAgICAgICAgICAgIHNlbGYuY2FudmFzLnRhZ19iaW5kKGlkLCAiPERvdWJsZS0xPiIsIGxhbWJkYSB4OiBOb25lKQorICAgICAgICBpZCA9IHNlbGYuY2FudmFzLmNyZWF0ZV9saW5lKHgrOSwgeSsxMCwgeCs5LCBjeWxhc3QrNywKKyAgICAgICAgICAgICMjc3RpcHBsZT0iZ3JheTUwIiwgICAgICMgWFhYIFNlZW1zIGJyb2tlbiBpbiBUayA4LjAueAorICAgICAgICAgICAgZmlsbD0iZ3JheTUwIikKKyAgICAgICAgc2VsZi5jYW52YXMudGFnX2xvd2VyKGlkKSAjIFhYWCAubG93ZXIoaWQpIGJlZm9yZSBQeXRob24gMS41LjIKKyAgICAgICAgcmV0dXJuIGN5CisKKyAgICBkZWYgZHJhd2ljb24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuc2VsZWN0ZWQ6CisgICAgICAgICAgICBpbWFnZW5hbWUgPSAoc2VsZi5pdGVtLkdldFNlbGVjdGVkSWNvbk5hbWUoKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaXRlbS5HZXRJY29uTmFtZSgpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZW5mb2xkZXIiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW1hZ2VuYW1lID0gc2VsZi5pdGVtLkdldEljb25OYW1lKCkgb3IgImZvbGRlciIKKyAgICAgICAgaW1hZ2UgPSBzZWxmLmdldGljb25pbWFnZShpbWFnZW5hbWUpCisgICAgICAgIGlkID0gc2VsZi5jYW52YXMuY3JlYXRlX2ltYWdlKHNlbGYueCwgc2VsZi55LCBhbmNob3I9Im53IiwgaW1hZ2U9aW1hZ2UpCisgICAgICAgIHNlbGYuaW1hZ2VfaWQgPSBpZAorICAgICAgICBzZWxmLmNhbnZhcy50YWdfYmluZChpZCwgIjwxPiIsIHNlbGYuc2VsZWN0KQorICAgICAgICBzZWxmLmNhbnZhcy50YWdfYmluZChpZCwgIjxEb3VibGUtMT4iLCBzZWxmLmZsaXApCisKKyAgICBkZWYgZHJhd3RleHQoc2VsZik6CisgICAgICAgIHRleHR4ID0gc2VsZi54KzIwLTEKKyAgICAgICAgdGV4dHkgPSBzZWxmLnktMQorICAgICAgICBsYWJlbHRleHQgPSBzZWxmLml0ZW0uR2V0TGFiZWxUZXh0KCkKKyAgICAgICAgaWYgbGFiZWx0ZXh0OgorICAgICAgICAgICAgaWQgPSBzZWxmLmNhbnZhcy5jcmVhdGVfdGV4dCh0ZXh0eCwgdGV4dHksIGFuY2hvcj0ibnciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PWxhYmVsdGV4dCkKKyAgICAgICAgICAgIHNlbGYuY2FudmFzLnRhZ19iaW5kKGlkLCAiPDE+Iiwgc2VsZi5zZWxlY3QpCisgICAgICAgICAgICBzZWxmLmNhbnZhcy50YWdfYmluZChpZCwgIjxEb3VibGUtMT4iLCBzZWxmLmZsaXApCisgICAgICAgICAgICB4MCwgeTAsIHgxLCB5MSA9IHNlbGYuY2FudmFzLmJib3goaWQpCisgICAgICAgICAgICB0ZXh0eCA9IG1heCh4MSwgMjAwKSArIDEwCisgICAgICAgIHRleHQgPSBzZWxmLml0ZW0uR2V0VGV4dCgpIG9yICI8bm8gdGV4dD4iCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZW50cnkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lZGl0X2ZpbmlzaCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxhYmVsID0gc2VsZi5sYWJlbAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAjIHBhZGRpbmcgY2FyZWZ1bGx5IHNlbGVjdGVkIChvbiBXaW5kb3dzKSB0byBtYXRjaCBFbnRyeSB3aWRnZXQ6CisgICAgICAgICAgICBzZWxmLmxhYmVsID0gTGFiZWwoc2VsZi5jYW52YXMsIHRleHQ9dGV4dCwgYmQ9MCwgcGFkeD0yLCBwYWR5PTIpCisgICAgICAgIHRoZW1lID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnVGhlbWUnLCduYW1lJykKKyAgICAgICAgaWYgc2VsZi5zZWxlY3RlZDoKKyAgICAgICAgICAgIHNlbGYubGFiZWwuY29uZmlndXJlKGlkbGVDb25mLkdldEhpZ2hsaWdodCh0aGVtZSwgJ2hpbGl0ZScpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sYWJlbC5jb25maWd1cmUoaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAnbm9ybWFsJykpCisgICAgICAgIGlkID0gc2VsZi5jYW52YXMuY3JlYXRlX3dpbmRvdyh0ZXh0eCwgdGV4dHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3I9Im53Iiwgd2luZG93PXNlbGYubGFiZWwpCisgICAgICAgIHNlbGYubGFiZWwuYmluZCgiPDE+Iiwgc2VsZi5zZWxlY3Rfb3JfZWRpdCkKKyAgICAgICAgc2VsZi5sYWJlbC5iaW5kKCI8RG91YmxlLTE+Iiwgc2VsZi5mbGlwKQorICAgICAgICBzZWxmLnRleHRfaWQgPSBpZAorCisgICAgZGVmIHNlbGVjdF9vcl9lZGl0KHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLnNlbGVjdGVkIGFuZCBzZWxmLml0ZW0uSXNFZGl0YWJsZSgpOgorICAgICAgICAgICAgc2VsZi5lZGl0KGV2ZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZWxlY3QoZXZlbnQpCisKKyAgICBkZWYgZWRpdChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgc2VsZi5lbnRyeSA9IEVudHJ5KHNlbGYubGFiZWwsIGJkPTAsIGhpZ2hsaWdodHRoaWNrbmVzcz0xLCB3aWR0aD0wKQorICAgICAgICBzZWxmLmVudHJ5Lmluc2VydCgwLCBzZWxmLmxhYmVsWyd0ZXh0J10pCisgICAgICAgIHNlbGYuZW50cnkuc2VsZWN0aW9uX3JhbmdlKDAsIEVORCkKKyAgICAgICAgc2VsZi5lbnRyeS5wYWNrKGlwYWR4PTUpCisgICAgICAgIHNlbGYuZW50cnkuZm9jdXNfc2V0KCkKKyAgICAgICAgc2VsZi5lbnRyeS5iaW5kKCI8UmV0dXJuPiIsIHNlbGYuZWRpdF9maW5pc2gpCisgICAgICAgIHNlbGYuZW50cnkuYmluZCgiPEVzY2FwZT4iLCBzZWxmLmVkaXRfY2FuY2VsKQorCisgICAgZGVmIGVkaXRfZmluaXNoKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBlbnRyeSA9IHNlbGYuZW50cnkKKyAgICAgICAgICAgIGRlbCBzZWxmLmVudHJ5CisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0ZXh0ID0gZW50cnkuZ2V0KCkKKyAgICAgICAgZW50cnkuZGVzdHJveSgpCisgICAgICAgIGlmIHRleHQgYW5kIHRleHQgIT0gc2VsZi5pdGVtLkdldFRleHQoKToKKyAgICAgICAgICAgIHNlbGYuaXRlbS5TZXRUZXh0KHRleHQpCisgICAgICAgIHRleHQgPSBzZWxmLml0ZW0uR2V0VGV4dCgpCisgICAgICAgIHNlbGYubGFiZWxbJ3RleHQnXSA9IHRleHQKKyAgICAgICAgc2VsZi5kcmF3dGV4dCgpCisgICAgICAgIHNlbGYuY2FudmFzLmZvY3VzX3NldCgpCisKKyAgICBkZWYgZWRpdF9jYW5jZWwoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVudHJ5ID0gc2VsZi5lbnRyeQorICAgICAgICAgICAgZGVsIHNlbGYuZW50cnkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVudHJ5LmRlc3Ryb3koKQorICAgICAgICBzZWxmLmRyYXd0ZXh0KCkKKyAgICAgICAgc2VsZi5jYW52YXMuZm9jdXNfc2V0KCkKKworCitjbGFzcyBUcmVlSXRlbToKKworICAgICIiIkFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyB0cmVlIGl0ZW1zLgorCisgICAgTWV0aG9kcyBzaG91bGQgdHlwaWNhbGx5IGJlIG92ZXJyaWRkZW4sIG90aGVyd2lzZSBhIGRlZmF1bHQgYWN0aW9uCisgICAgaXMgdXNlZC4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4gIERvIHdoYXRldmVyIHlvdSBuZWVkIHRvIGRvLiIiIgorCisgICAgZGVmIEdldFRleHQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0ZXh0IHN0cmluZyB0byBkaXNwbGF5LiIiIgorCisgICAgZGVmIEdldExhYmVsVGV4dChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGxhYmVsIHRleHQgc3RyaW5nIHRvIGRpc3BsYXkgaW4gZnJvbnQgb2YgdGV4dCAoaWYgYW55KS4iIiIKKworICAgIGV4cGFuZGFibGUgPSBOb25lCisKKyAgICBkZWYgX0lzRXhwYW5kYWJsZShzZWxmKToKKyAgICAgICAgIiIiRG8gbm90IG92ZXJyaWRlISAgQ2FsbGVkIGJ5IFRyZWVOb2RlLiIiIgorICAgICAgICBpZiBzZWxmLmV4cGFuZGFibGUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZXhwYW5kYWJsZSA9IHNlbGYuSXNFeHBhbmRhYmxlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwYW5kYWJsZQorCisgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIHN1Yml0ZW1zLiIiIgorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIF9HZXRTdWJMaXN0KHNlbGYpOgorICAgICAgICAiIiJEbyBub3Qgb3ZlcnJpZGUhICBDYWxsZWQgYnkgVHJlZU5vZGUuIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLklzRXhwYW5kYWJsZSgpOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIHN1Ymxpc3QgPSBzZWxmLkdldFN1Ykxpc3QoKQorICAgICAgICBpZiBub3Qgc3VibGlzdDoKKyAgICAgICAgICAgIHNlbGYuZXhwYW5kYWJsZSA9IDAKKyAgICAgICAgcmV0dXJuIHN1Ymxpc3QKKworICAgIGRlZiBJc0VkaXRhYmxlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gd2hldGhlciB0aGUgaXRlbSdzIHRleHQgbWF5IGJlIGVkaXRlZC4iIiIKKworICAgIGRlZiBTZXRUZXh0KHNlbGYsIHRleHQpOgorICAgICAgICAiIiJDaGFuZ2UgdGhlIGl0ZW0ncyB0ZXh0IChpZiBpdCBpcyBlZGl0YWJsZSkuIiIiCisKKyAgICBkZWYgR2V0SWNvbk5hbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBuYW1lIG9mIGljb24gdG8gYmUgZGlzcGxheWVkIG5vcm1hbGx5LiIiIgorCisgICAgZGVmIEdldFNlbGVjdGVkSWNvbk5hbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBuYW1lIG9mIGljb24gdG8gYmUgZGlzcGxheWVkIHdoZW4gc2VsZWN0ZWQuIiIiCisKKyAgICBkZWYgR2V0U3ViTGlzdChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgaXRlbXMgZm9ybWluZyBzdWJsaXN0LiIiIgorCisgICAgZGVmIE9uRG91YmxlQ2xpY2soc2VsZik6CisgICAgICAgICIiIkNhbGxlZCBvbiBhIGRvdWJsZS1jbGljayBvbiB0aGUgaXRlbS4iIiIKKworCisjIEV4YW1wbGUgYXBwbGljYXRpb24KKworY2xhc3MgRmlsZVRyZWVJdGVtKFRyZWVJdGVtKToKKworICAgICIiIkV4YW1wbGUgVHJlZUl0ZW0gc3ViY2xhc3MgLS0gYnJvd3NlIHRoZSBmaWxlIHN5c3RlbS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorCisgICAgZGVmIEdldFRleHQoc2VsZik6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKHNlbGYucGF0aCkgb3Igc2VsZi5wYXRoCisKKyAgICBkZWYgSXNFZGl0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguYmFzZW5hbWUoc2VsZi5wYXRoKSAhPSAiIgorCisgICAgZGVmIFNldFRleHQoc2VsZiwgdGV4dCk6CisgICAgICAgIG5ld3BhdGggPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5wYXRoKQorICAgICAgICBuZXdwYXRoID0gb3MucGF0aC5qb2luKG5ld3BhdGgsIHRleHQpCisgICAgICAgIGlmIG9zLnBhdGguZGlybmFtZShuZXdwYXRoKSAhPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5wYXRoKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW5hbWUoc2VsZi5wYXRoLCBuZXdwYXRoKQorICAgICAgICAgICAgc2VsZi5wYXRoID0gbmV3cGF0aAorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgR2V0SWNvbk5hbWUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLklzRXhwYW5kYWJsZSgpOgorICAgICAgICAgICAgcmV0dXJuICJweXRob24iICMgWFhYIHdpc2ggdGhlcmUgd2FzIGEgImZpbGUiIGljb24KKworICAgIGRlZiBJc0V4cGFuZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmlzZGlyKHNlbGYucGF0aCkKKworICAgIGRlZiBHZXRTdWJMaXN0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoc2VsZi5wYXRoKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgbmFtZXMuc29ydChrZXkgPSBvcy5wYXRoLm5vcm1jYXNlKQorICAgICAgICBzdWJsaXN0ID0gW10KKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBpdGVtID0gRmlsZVRyZWVJdGVtKG9zLnBhdGguam9pbihzZWxmLnBhdGgsIG5hbWUpKQorICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgcmV0dXJuIHN1Ymxpc3QKKworCisjIEEgY2FudmFzIHdpZGdldCB3aXRoIHNjcm9sbCBiYXJzIGFuZCBzb21lIHVzZWZ1bCBiaW5kaW5ncworCitjbGFzcyBTY3JvbGxlZENhbnZhczoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCAqKm9wdHMpOgorICAgICAgICBpZiAneXNjcm9sbGluY3JlbWVudCcgbm90IGluIG9wdHM6CisgICAgICAgICAgICBvcHRzWyd5c2Nyb2xsaW5jcmVtZW50J10gPSAxNworICAgICAgICBzZWxmLm1hc3RlciA9IG1hc3RlcgorICAgICAgICBzZWxmLmZyYW1lID0gRnJhbWUobWFzdGVyKQorICAgICAgICBzZWxmLmZyYW1lLnJvd2NvbmZpZ3VyZSgwLCB3ZWlnaHQ9MSkKKyAgICAgICAgc2VsZi5mcmFtZS5jb2x1bW5jb25maWd1cmUoMCwgd2VpZ2h0PTEpCisgICAgICAgIHNlbGYuY2FudmFzID0gQ2FudmFzKHNlbGYuZnJhbWUsICoqb3B0cykKKyAgICAgICAgc2VsZi5jYW52YXMuZ3JpZChyb3c9MCwgY29sdW1uPTAsIHN0aWNreT0ibnNldyIpCisgICAgICAgIHNlbGYudmJhciA9IFNjcm9sbGJhcihzZWxmLmZyYW1lLCBuYW1lPSJ2YmFyIikKKyAgICAgICAgc2VsZi52YmFyLmdyaWQocm93PTAsIGNvbHVtbj0xLCBzdGlja3k9Im5zZSIpCisgICAgICAgIHNlbGYuaGJhciA9IFNjcm9sbGJhcihzZWxmLmZyYW1lLCBuYW1lPSJoYmFyIiwgb3JpZW50PSJob3Jpem9udGFsIikKKyAgICAgICAgc2VsZi5oYmFyLmdyaWQocm93PTEsIGNvbHVtbj0wLCBzdGlja3k9ImV3cyIpCisgICAgICAgIHNlbGYuY2FudmFzWyd5c2Nyb2xsY29tbWFuZCddID0gc2VsZi52YmFyLnNldAorICAgICAgICBzZWxmLnZiYXJbJ2NvbW1hbmQnXSA9IHNlbGYuY2FudmFzLnl2aWV3CisgICAgICAgIHNlbGYuY2FudmFzWyd4c2Nyb2xsY29tbWFuZCddID0gc2VsZi5oYmFyLnNldAorICAgICAgICBzZWxmLmhiYXJbJ2NvbW1hbmQnXSA9IHNlbGYuY2FudmFzLnh2aWV3CisgICAgICAgIHNlbGYuY2FudmFzLmJpbmQoIjxLZXktUHJpb3I+Iiwgc2VsZi5wYWdlX3VwKQorICAgICAgICBzZWxmLmNhbnZhcy5iaW5kKCI8S2V5LU5leHQ+Iiwgc2VsZi5wYWdlX2Rvd24pCisgICAgICAgIHNlbGYuY2FudmFzLmJpbmQoIjxLZXktVXA+Iiwgc2VsZi51bml0X3VwKQorICAgICAgICBzZWxmLmNhbnZhcy5iaW5kKCI8S2V5LURvd24+Iiwgc2VsZi51bml0X2Rvd24pCisgICAgICAgICNpZiBpc2luc3RhbmNlKG1hc3RlciwgVG9wbGV2ZWwpIG9yIGlzaW5zdGFuY2UobWFzdGVyLCBUayk6CisgICAgICAgIHNlbGYuY2FudmFzLmJpbmQoIjxBbHQtS2V5LTI+Iiwgc2VsZi56b29tX2hlaWdodCkKKyAgICAgICAgc2VsZi5jYW52YXMuZm9jdXNfc2V0KCkKKyAgICBkZWYgcGFnZV91cChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuY2FudmFzLnl2aWV3X3Njcm9sbCgtMSwgInBhZ2UiKQorICAgICAgICByZXR1cm4gImJyZWFrIgorICAgIGRlZiBwYWdlX2Rvd24oc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLmNhbnZhcy55dmlld19zY3JvbGwoMSwgInBhZ2UiKQorICAgICAgICByZXR1cm4gImJyZWFrIgorICAgIGRlZiB1bml0X3VwKHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi5jYW52YXMueXZpZXdfc2Nyb2xsKC0xLCAidW5pdCIpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgZGVmIHVuaXRfZG93bihzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuY2FudmFzLnl2aWV3X3Njcm9sbCgxLCAidW5pdCIpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgZGVmIHpvb21faGVpZ2h0KHNlbGYsIGV2ZW50KToKKyAgICAgICAgWm9vbUhlaWdodC56b29tX2hlaWdodChzZWxmLm1hc3RlcikKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworCisjIFRlc3RpbmcgZnVuY3Rpb25zCisKK2RlZiB0ZXN0KCk6CisgICAgZnJvbSBpZGxlbGliIGltcG9ydCBQeVNoZWxsCisgICAgcm9vdCA9IFRvcGxldmVsKFB5U2hlbGwucm9vdCkKKyAgICByb290LmNvbmZpZ3VyZShiZD0wLCBiZz0ieWVsbG93IikKKyAgICByb290LmZvY3VzX3NldCgpCisgICAgc2MgPSBTY3JvbGxlZENhbnZhcyhyb290LCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCisgICAgc2MuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCisgICAgaXRlbSA9IEZpbGVUcmVlSXRlbSgiQzovd2luZG93cy9kZXNrdG9wIikKKyAgICBub2RlID0gVHJlZU5vZGUoc2MuY2FudmFzLCBOb25lLCBpdGVtKQorICAgIG5vZGUuZXhwYW5kKCkKKworZGVmIHRlc3QyKCk6CisgICAgIyB0ZXN0IHcvbyBzY3JvbGxpbmcgY2FudmFzCisgICAgcm9vdCA9IFRrKCkKKyAgICByb290LmNvbmZpZ3VyZShiZD0wKQorICAgIGNhbnZhcyA9IENhbnZhcyhyb290LCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCkKKyAgICBjYW52YXMucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCisgICAgaXRlbSA9IEZpbGVUcmVlSXRlbShvcy5jdXJkaXIpCisgICAgbm9kZSA9IFRyZWVOb2RlKGNhbnZhcywgTm9uZSwgaXRlbSkKKyAgICBub2RlLnVwZGF0ZSgpCisgICAgY2FudmFzLmZvY3VzX3NldCgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvVHJlZVdpZGdldC5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvVHJlZVdpZGdldC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwNjM4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvVHJlZVdpZGdldC5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvVHJlZVdpZGdldC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwNjM4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvVW5kb0RlbGVnYXRvci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZDNhZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvVW5kb0RlbGVnYXRvci5weQpAQCAtMCwwICsxLDM1MiBAQAoraW1wb3J0IHN0cmluZworZnJvbSBUa2ludGVyIGltcG9ydCAqCisKK2Zyb20gaWRsZWxpYi5EZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgorCisjJCBldmVudCA8PHJlZG8+PgorIyQgd2luIDxDb250cm9sLXk+CisjJCB1bml4IDxBbHQtej4KKworIyQgZXZlbnQgPDx1bmRvPj4KKyMkIHdpbiA8Q29udHJvbC16PgorIyQgdW5peCA8Q29udHJvbC16PgorCisjJCBldmVudCA8PGR1bXAtdW5kby1zdGF0ZT4+CisjJCB3aW4gPENvbnRyb2wtYmFja3NsYXNoPgorIyQgdW5peCA8Q29udHJvbC1iYWNrc2xhc2g+CisKKworY2xhc3MgVW5kb0RlbGVnYXRvcihEZWxlZ2F0b3IpOgorCisgICAgbWF4X3VuZG8gPSAxMDAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIERlbGVnYXRvci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnJlc2V0X3VuZG8oKQorCisgICAgZGVmIHNldGRlbGVnYXRlKHNlbGYsIGRlbGVnYXRlKToKKyAgICAgICAgaWYgc2VsZi5kZWxlZ2F0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudW5iaW5kKCI8PHVuZG8+PiIpCisgICAgICAgICAgICBzZWxmLnVuYmluZCgiPDxyZWRvPj4iKQorICAgICAgICAgICAgc2VsZi51bmJpbmQoIjw8ZHVtcC11bmRvLXN0YXRlPj4iKQorICAgICAgICBEZWxlZ2F0b3Iuc2V0ZGVsZWdhdGUoc2VsZiwgZGVsZWdhdGUpCisgICAgICAgIGlmIGRlbGVnYXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5iaW5kKCI8PHVuZG8+PiIsIHNlbGYudW5kb19ldmVudCkKKyAgICAgICAgICAgIHNlbGYuYmluZCgiPDxyZWRvPj4iLCBzZWxmLnJlZG9fZXZlbnQpCisgICAgICAgICAgICBzZWxmLmJpbmQoIjw8ZHVtcC11bmRvLXN0YXRlPj4iLCBzZWxmLmR1bXBfZXZlbnQpCisKKyAgICBkZWYgZHVtcF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGZyb20gcHByaW50IGltcG9ydCBwcHJpbnQKKyAgICAgICAgcHByaW50KHNlbGYudW5kb2xpc3RbOnNlbGYucG9pbnRlcl0pCisgICAgICAgIHByaW50ICJwb2ludGVyOiIsIHNlbGYucG9pbnRlciwKKyAgICAgICAgcHJpbnQgInNhdmVkOiIsIHNlbGYuc2F2ZWQsCisgICAgICAgIHByaW50ICJjYW5fbWVyZ2U6Iiwgc2VsZi5jYW5fbWVyZ2UsCisgICAgICAgIHByaW50ICJnZXRfc2F2ZWQoKToiLCBzZWxmLmdldF9zYXZlZCgpCisgICAgICAgIHBwcmludChzZWxmLnVuZG9saXN0W3NlbGYucG9pbnRlcjpdKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIHJlc2V0X3VuZG8oc2VsZik6CisgICAgICAgIHNlbGYud2FzX3NhdmVkID0gLTEKKyAgICAgICAgc2VsZi5wb2ludGVyID0gMAorICAgICAgICBzZWxmLnVuZG9saXN0ID0gW10KKyAgICAgICAgc2VsZi51bmRvYmxvY2sgPSAwICAjIG9yIGEgQ29tbWFuZFNlcXVlbmNlIGluc3RhbmNlCisgICAgICAgIHNlbGYuc2V0X3NhdmVkKDEpCisKKyAgICBkZWYgc2V0X3NhdmVkKHNlbGYsIGZsYWcpOgorICAgICAgICBpZiBmbGFnOgorICAgICAgICAgICAgc2VsZi5zYXZlZCA9IHNlbGYucG9pbnRlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zYXZlZCA9IC0xCisgICAgICAgIHNlbGYuY2FuX21lcmdlID0gRmFsc2UKKyAgICAgICAgc2VsZi5jaGVja19zYXZlZCgpCisKKyAgICBkZWYgZ2V0X3NhdmVkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zYXZlZCA9PSBzZWxmLnBvaW50ZXIKKworICAgIHNhdmVkX2NoYW5nZV9ob29rID0gTm9uZQorCisgICAgZGVmIHNldF9zYXZlZF9jaGFuZ2VfaG9vayhzZWxmLCBob29rKToKKyAgICAgICAgc2VsZi5zYXZlZF9jaGFuZ2VfaG9vayA9IGhvb2sKKworICAgIHdhc19zYXZlZCA9IC0xCisKKyAgICBkZWYgY2hlY2tfc2F2ZWQoc2VsZik6CisgICAgICAgIGlzX3NhdmVkID0gc2VsZi5nZXRfc2F2ZWQoKQorICAgICAgICBpZiBpc19zYXZlZCAhPSBzZWxmLndhc19zYXZlZDoKKyAgICAgICAgICAgIHNlbGYud2FzX3NhdmVkID0gaXNfc2F2ZWQKKyAgICAgICAgICAgIGlmIHNlbGYuc2F2ZWRfY2hhbmdlX2hvb2s6CisgICAgICAgICAgICAgICAgc2VsZi5zYXZlZF9jaGFuZ2VfaG9vaygpCisKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGluZGV4LCBjaGFycywgdGFncz1Ob25lKToKKyAgICAgICAgc2VsZi5hZGRjbWQoSW5zZXJ0Q29tbWFuZChpbmRleCwgY2hhcnMsIHRhZ3MpKQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBpbmRleDEsIGluZGV4Mj1Ob25lKToKKyAgICAgICAgc2VsZi5hZGRjbWQoRGVsZXRlQ29tbWFuZChpbmRleDEsIGluZGV4MikpCisKKyAgICAjIENsaWVudHMgc2hvdWxkIGNhbGwgdW5kb19ibG9ja19zdGFydCgpIGFuZCB1bmRvX2Jsb2NrX3N0b3AoKQorICAgICMgYXJvdW5kIGEgc2VxdWVuY2Ugb2YgZWRpdGluZyBjbWRzIHRvIGJlIHRyZWF0ZWQgYXMgYSB1bml0IGJ5CisgICAgIyB1bmRvICYgcmVkby4gIE5lc3RlZCBtYXRjaGluZyBjYWxscyBhcmUgT0ssIGFuZCB0aGUgaW5uZXIgY2FsbHMKKyAgICAjIHRoZW4gYWN0IGxpa2Ugbm9wcy4gIE9LIHRvbyBpZiBubyBlZGl0aW5nIGNtZHMsIG9yIG9ubHkgb25lCisgICAgIyBlZGl0aW5nIGNtZCwgaXMgaXNzdWVkIGluIGJldHdlZW46ICBpZiBubyBjbWRzLCB0aGUgd2hvbGUKKyAgICAjIHNlcXVlbmNlIGhhcyBubyBlZmZlY3Q7IGFuZCBpZiBvbmx5IG9uZSBjbWQsIHRoYXQgY21kIGlzIGVudGVyZWQKKyAgICAjIGRpcmVjdGx5IGludG8gdGhlIHVuZG8gbGlzdCwgYXMgaWYgdW5kb19ibG9ja194eHggaGFkbid0IGJlZW4KKyAgICAjIGNhbGxlZC4gIFRoZSBpbnRlbnQgb2YgYWxsIHRoYXQgaXMgdG8gbWFrZSB0aGlzIHNjaGVtZSBlYXN5CisgICAgIyB0byB1c2U6ICBhbGwgdGhlIGNsaWVudCBoYXMgdG8gd29ycnkgYWJvdXQgaXMgbWFraW5nIHN1cmUgZWFjaAorICAgICMgX3N0YXJ0KCkgY2FsbCBpcyBtYXRjaGVkIGJ5IGEgX3N0b3AoKSBjYWxsLgorCisgICAgZGVmIHVuZG9fYmxvY2tfc3RhcnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYudW5kb2Jsb2NrID09IDA6CisgICAgICAgICAgICBzZWxmLnVuZG9ibG9jayA9IENvbW1hbmRTZXF1ZW5jZSgpCisgICAgICAgIHNlbGYudW5kb2Jsb2NrLmJ1bXBfZGVwdGgoKQorCisgICAgZGVmIHVuZG9fYmxvY2tfc3RvcChzZWxmKToKKyAgICAgICAgaWYgc2VsZi51bmRvYmxvY2suYnVtcF9kZXB0aCgtMSkgPT0gMDoKKyAgICAgICAgICAgIGNtZCA9IHNlbGYudW5kb2Jsb2NrCisgICAgICAgICAgICBzZWxmLnVuZG9ibG9jayA9IDAKKyAgICAgICAgICAgIGlmIGxlbihjbWQpID4gMDoKKyAgICAgICAgICAgICAgICBpZiBsZW4oY21kKSA9PSAxOgorICAgICAgICAgICAgICAgICAgICAjIG5vIG5lZWQgdG8gd3JhcCBhIHNpbmdsZSBjbWQKKyAgICAgICAgICAgICAgICAgICAgY21kID0gY21kLmdldGNtZCgwKQorICAgICAgICAgICAgICAgICMgdGhpcyBibGsgb2YgY21kcywgb3Igc2luZ2xlIGNtZCwgaGFzIGFscmVhZHkKKyAgICAgICAgICAgICAgICAjIGJlZW4gZG9uZSwgc28gZG9uJ3QgZXhlY3V0ZSBpdCBhZ2FpbgorICAgICAgICAgICAgICAgIHNlbGYuYWRkY21kKGNtZCwgMCkKKworICAgIGRlZiBhZGRjbWQoc2VsZiwgY21kLCBleGVjdXRlPVRydWUpOgorICAgICAgICBpZiBleGVjdXRlOgorICAgICAgICAgICAgY21kLmRvKHNlbGYuZGVsZWdhdGUpCisgICAgICAgIGlmIHNlbGYudW5kb2Jsb2NrICE9IDA6CisgICAgICAgICAgICBzZWxmLnVuZG9ibG9jay5hcHBlbmQoY21kKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuY2FuX21lcmdlIGFuZCBzZWxmLnBvaW50ZXIgPiAwOgorICAgICAgICAgICAgbGFzdGNtZCA9IHNlbGYudW5kb2xpc3Rbc2VsZi5wb2ludGVyLTFdCisgICAgICAgICAgICBpZiBsYXN0Y21kLm1lcmdlKGNtZCk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudW5kb2xpc3Rbc2VsZi5wb2ludGVyOl0gPSBbY21kXQorICAgICAgICBpZiBzZWxmLnNhdmVkID4gc2VsZi5wb2ludGVyOgorICAgICAgICAgICAgc2VsZi5zYXZlZCA9IC0xCisgICAgICAgIHNlbGYucG9pbnRlciA9IHNlbGYucG9pbnRlciArIDEKKyAgICAgICAgaWYgbGVuKHNlbGYudW5kb2xpc3QpID4gc2VsZi5tYXhfdW5kbzoKKyAgICAgICAgICAgICMjcHJpbnQgInRydW5jYXRpbmcgdW5kbyBsaXN0IgorICAgICAgICAgICAgZGVsIHNlbGYudW5kb2xpc3RbMF0KKyAgICAgICAgICAgIHNlbGYucG9pbnRlciA9IHNlbGYucG9pbnRlciAtIDEKKyAgICAgICAgICAgIGlmIHNlbGYuc2F2ZWQgPj0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLnNhdmVkID0gc2VsZi5zYXZlZCAtIDEKKyAgICAgICAgc2VsZi5jYW5fbWVyZ2UgPSBUcnVlCisgICAgICAgIHNlbGYuY2hlY2tfc2F2ZWQoKQorCisgICAgZGVmIHVuZG9fZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBzZWxmLnBvaW50ZXIgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuYmVsbCgpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICBjbWQgPSBzZWxmLnVuZG9saXN0W3NlbGYucG9pbnRlciAtIDFdCisgICAgICAgIGNtZC51bmRvKHNlbGYuZGVsZWdhdGUpCisgICAgICAgIHNlbGYucG9pbnRlciA9IHNlbGYucG9pbnRlciAtIDEKKyAgICAgICAgc2VsZi5jYW5fbWVyZ2UgPSBGYWxzZQorICAgICAgICBzZWxmLmNoZWNrX3NhdmVkKCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiByZWRvX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgc2VsZi5wb2ludGVyID49IGxlbihzZWxmLnVuZG9saXN0KToKKyAgICAgICAgICAgIHNlbGYuYmVsbCgpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICBjbWQgPSBzZWxmLnVuZG9saXN0W3NlbGYucG9pbnRlcl0KKyAgICAgICAgY21kLnJlZG8oc2VsZi5kZWxlZ2F0ZSkKKyAgICAgICAgc2VsZi5wb2ludGVyID0gc2VsZi5wb2ludGVyICsgMQorICAgICAgICBzZWxmLmNhbl9tZXJnZSA9IEZhbHNlCisgICAgICAgIHNlbGYuY2hlY2tfc2F2ZWQoKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisKK2NsYXNzIENvbW1hbmQ6CisKKyAgICAjIEJhc2UgY2xhc3MgZm9yIFVuZG9hYmxlIGNvbW1hbmRzCisKKyAgICB0YWdzID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGV4MSwgaW5kZXgyLCBjaGFycywgdGFncz1Ob25lKToKKyAgICAgICAgc2VsZi5tYXJrc19iZWZvcmUgPSB7fQorICAgICAgICBzZWxmLm1hcmtzX2FmdGVyID0ge30KKyAgICAgICAgc2VsZi5pbmRleDEgPSBpbmRleDEKKyAgICAgICAgc2VsZi5pbmRleDIgPSBpbmRleDIKKyAgICAgICAgc2VsZi5jaGFycyA9IGNoYXJzCisgICAgICAgIGlmIHRhZ3M6CisgICAgICAgICAgICBzZWxmLnRhZ3MgPSB0YWdzCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHMgPSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworICAgICAgICB0ID0gKHNlbGYuaW5kZXgxLCBzZWxmLmluZGV4Miwgc2VsZi5jaGFycywgc2VsZi50YWdzKQorICAgICAgICBpZiBzZWxmLnRhZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIHQgPSB0WzotMV0KKyAgICAgICAgcmV0dXJuIHMgKyByZXByKHQpCisKKyAgICBkZWYgZG8oc2VsZiwgdGV4dCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiByZWRvKHNlbGYsIHRleHQpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdW5kbyhzZWxmLCB0ZXh0KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIG1lcmdlKHNlbGYsIGNtZCk6CisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgc2F2ZV9tYXJrcyhzZWxmLCB0ZXh0KToKKyAgICAgICAgbWFya3MgPSB7fQorICAgICAgICBmb3IgbmFtZSBpbiB0ZXh0Lm1hcmtfbmFtZXMoKToKKyAgICAgICAgICAgIGlmIG5hbWUgIT0gImluc2VydCIgYW5kIG5hbWUgIT0gImN1cnJlbnQiOgorICAgICAgICAgICAgICAgIG1hcmtzW25hbWVdID0gdGV4dC5pbmRleChuYW1lKQorICAgICAgICByZXR1cm4gbWFya3MKKworICAgIGRlZiBzZXRfbWFya3Moc2VsZiwgdGV4dCwgbWFya3MpOgorICAgICAgICBmb3IgbmFtZSwgaW5kZXggaW4gbWFya3MuaXRlbXMoKToKKyAgICAgICAgICAgIHRleHQubWFya19zZXQobmFtZSwgaW5kZXgpCisKKworY2xhc3MgSW5zZXJ0Q29tbWFuZChDb21tYW5kKToKKworICAgICMgVW5kb2FibGUgaW5zZXJ0IGNvbW1hbmQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmRleDEsIGNoYXJzLCB0YWdzPU5vbmUpOgorICAgICAgICBDb21tYW5kLl9faW5pdF9fKHNlbGYsIGluZGV4MSwgTm9uZSwgY2hhcnMsIHRhZ3MpCisKKyAgICBkZWYgZG8oc2VsZiwgdGV4dCk6CisgICAgICAgIHNlbGYubWFya3NfYmVmb3JlID0gc2VsZi5zYXZlX21hcmtzKHRleHQpCisgICAgICAgIHNlbGYuaW5kZXgxID0gdGV4dC5pbmRleChzZWxmLmluZGV4MSkKKyAgICAgICAgaWYgdGV4dC5jb21wYXJlKHNlbGYuaW5kZXgxLCAiPiIsICJlbmQtMWMiKToKKyAgICAgICAgICAgICMgSW5zZXJ0IGJlZm9yZSB0aGUgZmluYWwgbmV3bGluZQorICAgICAgICAgICAgc2VsZi5pbmRleDEgPSB0ZXh0LmluZGV4KCJlbmQtMWMiKQorICAgICAgICB0ZXh0Lmluc2VydChzZWxmLmluZGV4MSwgc2VsZi5jaGFycywgc2VsZi50YWdzKQorICAgICAgICBzZWxmLmluZGV4MiA9IHRleHQuaW5kZXgoIiVzKyVkYyIgJSAoc2VsZi5pbmRleDEsIGxlbihzZWxmLmNoYXJzKSkpCisgICAgICAgIHNlbGYubWFya3NfYWZ0ZXIgPSBzZWxmLnNhdmVfbWFya3ModGV4dCkKKyAgICAgICAgIyNzeXMuX19zdGRlcnJfXy53cml0ZSgiZG86ICVzXG4iICUgc2VsZikKKworICAgIGRlZiByZWRvKHNlbGYsIHRleHQpOgorICAgICAgICB0ZXh0Lm1hcmtfc2V0KCdpbnNlcnQnLCBzZWxmLmluZGV4MSkKKyAgICAgICAgdGV4dC5pbnNlcnQoc2VsZi5pbmRleDEsIHNlbGYuY2hhcnMsIHNlbGYudGFncykKKyAgICAgICAgc2VsZi5zZXRfbWFya3ModGV4dCwgc2VsZi5tYXJrc19hZnRlcikKKyAgICAgICAgdGV4dC5zZWUoJ2luc2VydCcpCisgICAgICAgICMjc3lzLl9fc3RkZXJyX18ud3JpdGUoInJlZG86ICVzXG4iICUgc2VsZikKKworICAgIGRlZiB1bmRvKHNlbGYsIHRleHQpOgorICAgICAgICB0ZXh0Lm1hcmtfc2V0KCdpbnNlcnQnLCBzZWxmLmluZGV4MSkKKyAgICAgICAgdGV4dC5kZWxldGUoc2VsZi5pbmRleDEsIHNlbGYuaW5kZXgyKQorICAgICAgICBzZWxmLnNldF9tYXJrcyh0ZXh0LCBzZWxmLm1hcmtzX2JlZm9yZSkKKyAgICAgICAgdGV4dC5zZWUoJ2luc2VydCcpCisgICAgICAgICMjc3lzLl9fc3RkZXJyX18ud3JpdGUoInVuZG86ICVzXG4iICUgc2VsZikKKworICAgIGRlZiBtZXJnZShzZWxmLCBjbWQpOgorICAgICAgICBpZiBzZWxmLl9fY2xhc3NfXyBpcyBub3QgY21kLl9fY2xhc3NfXzoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLmluZGV4MiAhPSBjbWQuaW5kZXgxOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIHNlbGYudGFncyAhPSBjbWQudGFnczoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBsZW4oY21kLmNoYXJzKSAhPSAxOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIHNlbGYuY2hhcnMgYW5kIFwKKyAgICAgICAgICAgc2VsZi5jbGFzc2lmeShzZWxmLmNoYXJzWy0xXSkgIT0gc2VsZi5jbGFzc2lmeShjbWQuY2hhcnMpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHNlbGYuaW5kZXgyID0gY21kLmluZGV4MgorICAgICAgICBzZWxmLmNoYXJzID0gc2VsZi5jaGFycyArIGNtZC5jaGFycworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgYWxwaGFudW1lcmljID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgIl8iCisKKyAgICBkZWYgY2xhc3NpZnkoc2VsZiwgYyk6CisgICAgICAgIGlmIGMgaW4gc2VsZi5hbHBoYW51bWVyaWM6CisgICAgICAgICAgICByZXR1cm4gImFscGhhbnVtZXJpYyIKKyAgICAgICAgaWYgYyA9PSAiXG4iOgorICAgICAgICAgICAgcmV0dXJuICJuZXdsaW5lIgorICAgICAgICByZXR1cm4gInB1bmN0dWF0aW9uIgorCisKK2NsYXNzIERlbGV0ZUNvbW1hbmQoQ29tbWFuZCk6CisKKyAgICAjIFVuZG9hYmxlIGRlbGV0ZSBjb21tYW5kCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZXgxLCBpbmRleDI9Tm9uZSk6CisgICAgICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgaW5kZXgxLCBpbmRleDIsIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgZG8oc2VsZiwgdGV4dCk6CisgICAgICAgIHNlbGYubWFya3NfYmVmb3JlID0gc2VsZi5zYXZlX21hcmtzKHRleHQpCisgICAgICAgIHNlbGYuaW5kZXgxID0gdGV4dC5pbmRleChzZWxmLmluZGV4MSkKKyAgICAgICAgaWYgc2VsZi5pbmRleDI6CisgICAgICAgICAgICBzZWxmLmluZGV4MiA9IHRleHQuaW5kZXgoc2VsZi5pbmRleDIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmluZGV4MiA9IHRleHQuaW5kZXgoc2VsZi5pbmRleDEgKyAiICsxYyIpCisgICAgICAgIGlmIHRleHQuY29tcGFyZShzZWxmLmluZGV4MiwgIj4iLCAiZW5kLTFjIik6CisgICAgICAgICAgICAjIERvbid0IGRlbGV0ZSB0aGUgZmluYWwgbmV3bGluZQorICAgICAgICAgICAgc2VsZi5pbmRleDIgPSB0ZXh0LmluZGV4KCJlbmQtMWMiKQorICAgICAgICBzZWxmLmNoYXJzID0gdGV4dC5nZXQoc2VsZi5pbmRleDEsIHNlbGYuaW5kZXgyKQorICAgICAgICB0ZXh0LmRlbGV0ZShzZWxmLmluZGV4MSwgc2VsZi5pbmRleDIpCisgICAgICAgIHNlbGYubWFya3NfYWZ0ZXIgPSBzZWxmLnNhdmVfbWFya3ModGV4dCkKKyAgICAgICAgIyNzeXMuX19zdGRlcnJfXy53cml0ZSgiZG86ICVzXG4iICUgc2VsZikKKworICAgIGRlZiByZWRvKHNlbGYsIHRleHQpOgorICAgICAgICB0ZXh0Lm1hcmtfc2V0KCdpbnNlcnQnLCBzZWxmLmluZGV4MSkKKyAgICAgICAgdGV4dC5kZWxldGUoc2VsZi5pbmRleDEsIHNlbGYuaW5kZXgyKQorICAgICAgICBzZWxmLnNldF9tYXJrcyh0ZXh0LCBzZWxmLm1hcmtzX2FmdGVyKQorICAgICAgICB0ZXh0LnNlZSgnaW5zZXJ0JykKKyAgICAgICAgIyNzeXMuX19zdGRlcnJfXy53cml0ZSgicmVkbzogJXNcbiIgJSBzZWxmKQorCisgICAgZGVmIHVuZG8oc2VsZiwgdGV4dCk6CisgICAgICAgIHRleHQubWFya19zZXQoJ2luc2VydCcsIHNlbGYuaW5kZXgxKQorICAgICAgICB0ZXh0Lmluc2VydChzZWxmLmluZGV4MSwgc2VsZi5jaGFycykKKyAgICAgICAgc2VsZi5zZXRfbWFya3ModGV4dCwgc2VsZi5tYXJrc19iZWZvcmUpCisgICAgICAgIHRleHQuc2VlKCdpbnNlcnQnKQorICAgICAgICAjI3N5cy5fX3N0ZGVycl9fLndyaXRlKCJ1bmRvOiAlc1xuIiAlIHNlbGYpCisKK2NsYXNzIENvbW1hbmRTZXF1ZW5jZShDb21tYW5kKToKKworICAgICMgV3JhcHBlciBmb3IgYSBzZXF1ZW5jZSBvZiB1bmRvYWJsZSBjbWRzIHRvIGJlIHVuZG9uZS9yZWRvbmUKKyAgICAjIGFzIGEgdW5pdAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNtZHMgPSBbXQorICAgICAgICBzZWxmLmRlcHRoID0gMAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBzID0gc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgc3RycyA9IFtdCisgICAgICAgIGZvciBjbWQgaW4gc2VsZi5jbWRzOgorICAgICAgICAgICAgc3Rycy5hcHBlbmQoIiAgICAlciIgJSAoY21kLCkpCisgICAgICAgIHJldHVybiBzICsgIihcbiIgKyAiLFxuIi5qb2luKHN0cnMpICsgIlxuKSIKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuY21kcykKKworICAgIGRlZiBhcHBlbmQoc2VsZiwgY21kKToKKyAgICAgICAgc2VsZi5jbWRzLmFwcGVuZChjbWQpCisKKyAgICBkZWYgZ2V0Y21kKHNlbGYsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5jbWRzW2ldCisKKyAgICBkZWYgcmVkbyhzZWxmLCB0ZXh0KToKKyAgICAgICAgZm9yIGNtZCBpbiBzZWxmLmNtZHM6CisgICAgICAgICAgICBjbWQucmVkbyh0ZXh0KQorCisgICAgZGVmIHVuZG8oc2VsZiwgdGV4dCk6CisgICAgICAgIGNtZHMgPSBzZWxmLmNtZHNbOl0KKyAgICAgICAgY21kcy5yZXZlcnNlKCkKKyAgICAgICAgZm9yIGNtZCBpbiBjbWRzOgorICAgICAgICAgICAgY21kLnVuZG8odGV4dCkKKworICAgIGRlZiBidW1wX2RlcHRoKHNlbGYsIGluY3I9MSk6CisgICAgICAgIHNlbGYuZGVwdGggPSBzZWxmLmRlcHRoICsgaW5jcgorICAgICAgICByZXR1cm4gc2VsZi5kZXB0aAorCitkZWYgbWFpbigpOgorICAgIGZyb20gaWRsZWxpYi5QZXJjb2xhdG9yIGltcG9ydCBQZXJjb2xhdG9yCisgICAgcm9vdCA9IFRrKCkKKyAgICByb290LndtX3Byb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgcm9vdC5xdWl0KQorICAgIHRleHQgPSBUZXh0KCkKKyAgICB0ZXh0LnBhY2soKQorICAgIHRleHQuZm9jdXNfc2V0KCkKKyAgICBwID0gUGVyY29sYXRvcih0ZXh0KQorICAgIGQgPSBVbmRvRGVsZWdhdG9yKCkKKyAgICBwLmluc2VydGZpbHRlcihkKQorICAgIHJvb3QubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1VuZG9EZWxlZ2F0b3IucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1VuZG9EZWxlZ2F0b3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOWU4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvVW5kb0RlbGVnYXRvci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1VuZG9EZWxlZ2F0b3IucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1VuZG9EZWxlZ2F0b3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOWU4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvVW5kb0RlbGVnYXRvci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvV2lkZ2V0UmVkaXJlY3Rvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzM0MWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHkKQEAgLTAsMCArMSwxMjYgQEAKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgorCitjbGFzcyBXaWRnZXRSZWRpcmVjdG9yOgorCisgICAgIiIiU3VwcG9ydCBmb3IgcmVkaXJlY3RpbmcgYXJiaXRyYXJ5IHdpZGdldCBzdWJjb21tYW5kcy4KKworICAgIFNvbWUgVGsgb3BlcmF0aW9ucyBkb24ndCBub3JtYWxseSBwYXNzIHRocm91Z2ggVGtpbnRlci4gIEZvciBleGFtcGxlLCBpZiBhCisgICAgY2hhcmFjdGVyIGlzIGluc2VydGVkIGludG8gYSBUZXh0IHdpZGdldCBieSBwcmVzc2luZyBhIGtleSwgYSBkZWZhdWx0IFRrCisgICAgYmluZGluZyB0byB0aGUgd2lkZ2V0J3MgJ2luc2VydCcgb3BlcmF0aW9uIGlzIGFjdGl2YXRlZCwgYW5kIHRoZSBUayBsaWJyYXJ5CisgICAgcHJvY2Vzc2VzIHRoZSBpbnNlcnQgd2l0aG91dCBjYWxsaW5nIGJhY2sgaW50byBUa2ludGVyLgorCisgICAgQWx0aG91Z2ggYSBiaW5kaW5nIHRvIDxLZXk+IGNvdWxkIGJlIG1hZGUgdmlhIFRraW50ZXIsIHdoYXQgd2UgcmVhbGx5IHdhbnQKKyAgICB0byBkbyBpcyB0byBob29rIHRoZSBUayAnaW5zZXJ0JyBvcGVyYXRpb24gaXRzZWxmLgorCisgICAgV2hlbiBhIHdpZGdldCBpcyBpbnN0YW50aWF0ZWQsIGEgVGNsIGNvbW1hbmQgaXMgY3JlYXRlZCB3aG9zZSBuYW1lIGlzIHRoZQorICAgIHNhbWUgYXMgdGhlIHBhdGhuYW1lIHdpZGdldC5fdy4gIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGludm9rZSB0aGUgdmFyaW91cworICAgIHdpZGdldCBvcGVyYXRpb25zLCBlLmcuIGluc2VydCAoZm9yIGEgVGV4dCB3aWRnZXQpLiBXZSBhcmUgZ29pbmcgdG8gaG9vaworICAgIHRoaXMgY29tbWFuZCBhbmQgcHJvdmlkZSBhIGZhY2lsaXR5ICgncmVnaXN0ZXInKSB0byBpbnRlcmNlcHQgdGhlIHdpZGdldAorICAgIG9wZXJhdGlvbi4KKworICAgIEluIElETEUsIHRoZSBmdW5jdGlvbiBiZWluZyByZWdpc3RlcmVkIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgdG9wIG9mIGEKKyAgICBQZXJjb2xhdG9yIGNoYWluLiAgQXQgdGhlIGJvdHRvbSBvZiB0aGUgY2hhaW4gaXMgYSBjYWxsIHRvIHRoZSBvcmlnaW5hbAorICAgIFRrIHdpZGdldCBvcGVyYXRpb24uCisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2lkZ2V0KToKKyAgICAgICAgc2VsZi5fb3BlcmF0aW9ucyA9IHt9CisgICAgICAgIHNlbGYud2lkZ2V0ID0gd2lkZ2V0ICAgICAgICAgICAgIyB3aWRnZXQgaW5zdGFuY2UKKyAgICAgICAgc2VsZi50ayA9IHRrID0gd2lkZ2V0LnRrICAgICAgICAjIHdpZGdldCdzIHJvb3QKKyAgICAgICAgdyA9IHdpZGdldC5fdyAgICAgICAgICAgICAgICAgICAjIHdpZGdldCdzIChmdWxsKSBUayBwYXRobmFtZQorICAgICAgICBzZWxmLm9yaWcgPSB3ICsgIl9vcmlnIgorICAgICAgICAjIFJlbmFtZSB0aGUgVGNsIGNvbW1hbmQgd2l0aGluIFRjbDoKKyAgICAgICAgdGsuY2FsbCgicmVuYW1lIiwgdywgc2VsZi5vcmlnKQorICAgICAgICAjIENyZWF0ZSBhIG5ldyBUY2wgY29tbWFuZCB3aG9zZSBuYW1lIGlzIHRoZSB3aWRnZXQncyBwYXRobmFtZSwgYW5kCisgICAgICAgICMgd2hvc2UgYWN0aW9uIGlzIHRvIGRpc3BhdGNoIG9uIHRoZSBvcGVyYXRpb24gcGFzc2VkIHRvIHRoZSB3aWRnZXQ6CisgICAgICAgIHRrLmNyZWF0ZWNvbW1hbmQodywgc2VsZi5kaXNwYXRjaCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJXaWRnZXRSZWRpcmVjdG9yKCVzPCVzPikiICUgKHNlbGYud2lkZ2V0Ll9fY2xhc3NfXy5fX25hbWVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2lkZ2V0Ll93KQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBmb3Igb3BlcmF0aW9uIGluIGxpc3Qoc2VsZi5fb3BlcmF0aW9ucyk6CisgICAgICAgICAgICBzZWxmLnVucmVnaXN0ZXIob3BlcmF0aW9uKQorICAgICAgICB3aWRnZXQgPSBzZWxmLndpZGdldDsgZGVsIHNlbGYud2lkZ2V0CisgICAgICAgIG9yaWcgPSBzZWxmLm9yaWc7IGRlbCBzZWxmLm9yaWcKKyAgICAgICAgdGsgPSB3aWRnZXQudGsKKyAgICAgICAgdyA9IHdpZGdldC5fdworICAgICAgICB0ay5kZWxldGVjb21tYW5kKHcpCisgICAgICAgICMgcmVzdG9yZSB0aGUgb3JpZ2luYWwgd2lkZ2V0IFRjbCBjb21tYW5kOgorICAgICAgICB0ay5jYWxsKCJyZW5hbWUiLCBvcmlnLCB3KQorCisgICAgZGVmIHJlZ2lzdGVyKHNlbGYsIG9wZXJhdGlvbiwgZnVuY3Rpb24pOgorICAgICAgICBzZWxmLl9vcGVyYXRpb25zW29wZXJhdGlvbl0gPSBmdW5jdGlvbgorICAgICAgICBzZXRhdHRyKHNlbGYud2lkZ2V0LCBvcGVyYXRpb24sIGZ1bmN0aW9uKQorICAgICAgICByZXR1cm4gT3JpZ2luYWxDb21tYW5kKHNlbGYsIG9wZXJhdGlvbikKKworICAgIGRlZiB1bnJlZ2lzdGVyKHNlbGYsIG9wZXJhdGlvbik6CisgICAgICAgIGlmIG9wZXJhdGlvbiBpbiBzZWxmLl9vcGVyYXRpb25zOgorICAgICAgICAgICAgZnVuY3Rpb24gPSBzZWxmLl9vcGVyYXRpb25zW29wZXJhdGlvbl0KKyAgICAgICAgICAgIGRlbCBzZWxmLl9vcGVyYXRpb25zW29wZXJhdGlvbl0KKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi53aWRnZXQsIG9wZXJhdGlvbik6CisgICAgICAgICAgICAgICAgZGVsYXR0cihzZWxmLndpZGdldCwgb3BlcmF0aW9uKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGRpc3BhdGNoKHNlbGYsIG9wZXJhdGlvbiwgKmFyZ3MpOgorICAgICAgICAnJydDYWxsYmFjayBmcm9tIFRjbCB3aGljaCBydW5zIHdoZW4gdGhlIHdpZGdldCBpcyByZWZlcmVuY2VkLgorCisgICAgICAgIElmIGFuIG9wZXJhdGlvbiBoYXMgYmVlbiByZWdpc3RlcmVkIGluIHNlbGYuX29wZXJhdGlvbnMsIGFwcGx5IHRoZQorICAgICAgICBhc3NvY2lhdGVkIGZ1bmN0aW9uIHRvIHRoZSBhcmdzIHBhc3NlZCBpbnRvIFRjbC4gT3RoZXJ3aXNlLCBwYXNzIHRoZQorICAgICAgICBvcGVyYXRpb24gdGhyb3VnaCB0byBUayB2aWEgdGhlIG9yaWdpbmFsIFRjbCBmdW5jdGlvbi4KKworICAgICAgICBOb3RlIHRoYXQgaWYgYSByZWdpc3RlcmVkIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIG9wZXJhdGlvbiBpcyBub3QKKyAgICAgICAgcGFzc2VkIHRocm91Z2ggdG8gVGsuICBBcHBseSB0aGUgZnVuY3Rpb24gcmV0dXJuZWQgYnkgc2VsZi5yZWdpc3RlcigpCisgICAgICAgIHRvICphcmdzIHRvIGFjY29tcGxpc2ggdGhhdC4gIEZvciBhbiBleGFtcGxlLCBzZWUgQ29sb3JEZWxlZ2F0b3IucHkuCisKKyAgICAgICAgJycnCisgICAgICAgIG0gPSBzZWxmLl9vcGVyYXRpb25zLmdldChvcGVyYXRpb24pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgcmV0dXJuIG0oKmFyZ3MpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoKHNlbGYub3JpZywgb3BlcmF0aW9uKSArIGFyZ3MpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAiIgorCisKK2NsYXNzIE9yaWdpbmFsQ29tbWFuZDoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWRpciwgb3BlcmF0aW9uKToKKyAgICAgICAgc2VsZi5yZWRpciA9IHJlZGlyCisgICAgICAgIHNlbGYub3BlcmF0aW9uID0gb3BlcmF0aW9uCisgICAgICAgIHNlbGYudGsgPSByZWRpci50aworICAgICAgICBzZWxmLm9yaWcgPSByZWRpci5vcmlnCisgICAgICAgIHNlbGYudGtfY2FsbCA9IHNlbGYudGsuY2FsbAorICAgICAgICBzZWxmLm9yaWdfYW5kX29wZXJhdGlvbiA9IChzZWxmLm9yaWcsIHNlbGYub3BlcmF0aW9uKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIk9yaWdpbmFsQ29tbWFuZCglciwgJXIpIiAlIChzZWxmLnJlZGlyLCBzZWxmLm9wZXJhdGlvbikKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLnRrX2NhbGwoc2VsZi5vcmlnX2FuZF9vcGVyYXRpb24gKyBhcmdzKQorCisKK2RlZiBtYWluKCk6CisgICAgcm9vdCA9IFRrKCkKKyAgICByb290LndtX3Byb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgcm9vdC5xdWl0KQorICAgIHRleHQgPSBUZXh0KCkKKyAgICB0ZXh0LnBhY2soKQorICAgIHRleHQuZm9jdXNfc2V0KCkKKyAgICByZWRpciA9IFdpZGdldFJlZGlyZWN0b3IodGV4dCkKKyAgICBnbG9iYWwgcHJldmlvdXNfdGNsX2ZjbgorICAgIGRlZiBteV9pbnNlcnQoKmFyZ3MpOgorICAgICAgICBwcmludCAiaW5zZXJ0IiwgYXJncworICAgICAgICBwcmV2aW91c190Y2xfZmNuKCphcmdzKQorICAgIHByZXZpb3VzX3RjbF9mY24gPSByZWRpci5yZWdpc3RlcigiaW5zZXJ0IiwgbXlfaW5zZXJ0KQorICAgIHJvb3QubWFpbmxvb3AoKQorICAgIHJlZGlyLnVucmVnaXN0ZXIoImluc2VydCIpICAjIHJ1bnMgYWZ0ZXIgZmlyc3QgJ2Nsb3NlIHdpbmRvdycKKyAgICByZWRpci5jbG9zZSgpCisgICAgcm9vdC5tYWlubG9vcCgpCisgICAgcm9vdC5kZXN0cm95KCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaWRnZXRSZWRpcmVjdG9yLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaWRnZXRSZWRpcmVjdG9yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjllNjllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaWRnZXRSZWRpcmVjdG9yLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaWRnZXRSZWRpcmVjdG9yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjllNjllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaW5kb3dMaXN0LnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpbmRvd0xpc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU4NTAyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaW5kb3dMaXN0LnB5CkBAIC0wLDAgKzEsOTAgQEAKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgorCitjbGFzcyBXaW5kb3dMaXN0OgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmRpY3QgPSB7fQorICAgICAgICBzZWxmLmNhbGxiYWNrcyA9IFtdCisKKyAgICBkZWYgYWRkKHNlbGYsIHdpbmRvdyk6CisgICAgICAgIHdpbmRvdy5hZnRlcl9pZGxlKHNlbGYuY2FsbF9jYWxsYmFja3MpCisgICAgICAgIHNlbGYuZGljdFtzdHIod2luZG93KV0gPSB3aW5kb3cKKworICAgIGRlZiBkZWxldGUoc2VsZiwgd2luZG93KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHNlbGYuZGljdFtzdHIod2luZG93KV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgIyBTb21ldGltZXMsIGRlc3Ryb3koKSBpcyBjYWxsZWQgdHdpY2UKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5jYWxsX2NhbGxiYWNrcygpCisKKyAgICBkZWYgYWRkX3dpbmRvd3NfdG9fbWVudShzZWxmLCAgbWVudSk6CisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICBmb3Iga2V5IGluIHNlbGYuZGljdC5rZXlzKCk6CisgICAgICAgICAgICB3aW5kb3cgPSBzZWxmLmRpY3Rba2V5XQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRpdGxlID0gd2luZG93LmdldF90aXRsZSgpCisgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxpc3QuYXBwZW5kKCh0aXRsZSwgd2luZG93KSkKKyAgICAgICAgbGlzdC5zb3J0KCkKKyAgICAgICAgZm9yIHRpdGxlLCB3aW5kb3cgaW4gbGlzdDoKKyAgICAgICAgICAgIG1lbnUuYWRkX2NvbW1hbmQobGFiZWw9dGl0bGUsIGNvbW1hbmQ9d2luZG93Lndha2V1cCkKKworICAgIGRlZiByZWdpc3Rlcl9jYWxsYmFjayhzZWxmLCBjYWxsYmFjayk6CisgICAgICAgIHNlbGYuY2FsbGJhY2tzLmFwcGVuZChjYWxsYmFjaykKKworICAgIGRlZiB1bnJlZ2lzdGVyX2NhbGxiYWNrKHNlbGYsIGNhbGxiYWNrKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jYWxsYmFja3MucmVtb3ZlKGNhbGxiYWNrKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBjYWxsX2NhbGxiYWNrcyhzZWxmKToKKyAgICAgICAgZm9yIGNhbGxiYWNrIGluIHNlbGYuY2FsbGJhY2tzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNhbGxiYWNrKCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwcmludCAid2FybmluZzogY2FsbGJhY2sgZmFpbGVkIGluIFdpbmRvd0xpc3QiLCBcCisgICAgICAgICAgICAgICAgICAgICAgc3lzLmV4Y190eXBlLCAiOiIsIHN5cy5leGNfdmFsdWUKKworcmVnaXN0cnkgPSBXaW5kb3dMaXN0KCkKKworYWRkX3dpbmRvd3NfdG9fbWVudSA9IHJlZ2lzdHJ5LmFkZF93aW5kb3dzX3RvX21lbnUKK3JlZ2lzdGVyX2NhbGxiYWNrID0gcmVnaXN0cnkucmVnaXN0ZXJfY2FsbGJhY2sKK3VucmVnaXN0ZXJfY2FsbGJhY2sgPSByZWdpc3RyeS51bnJlZ2lzdGVyX2NhbGxiYWNrCisKKworY2xhc3MgTGlzdGVkVG9wbGV2ZWwoVG9wbGV2ZWwpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgKiprdyk6CisgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIG1hc3Rlciwga3cpCisgICAgICAgIHJlZ2lzdHJ5LmFkZChzZWxmKQorICAgICAgICBzZWxmLmZvY3VzZWRfd2lkZ2V0ID0gc2VsZgorCisgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgIHJlZ2lzdHJ5LmRlbGV0ZShzZWxmKQorICAgICAgICBUb3BsZXZlbC5kZXN0cm95KHNlbGYpCisgICAgICAgICMgSWYgdGhpcyBpcyBJZGxlJ3MgbGFzdCB3aW5kb3cgdGhlbiBxdWl0IHRoZSBtYWlubG9vcAorICAgICAgICAjIChOZWVkZWQgZm9yIGNsZWFuIGV4aXQgb24gV2luZG93cyA5OCkKKyAgICAgICAgaWYgbm90IHJlZ2lzdHJ5LmRpY3Q6CisgICAgICAgICAgICBzZWxmLnF1aXQoKQorCisgICAgZGVmIHVwZGF0ZV93aW5kb3dsaXN0X3JlZ2lzdHJ5KHNlbGYsIHdpbmRvdyk6CisgICAgICAgIHJlZ2lzdHJ5LmNhbGxfY2FsbGJhY2tzKCkKKworICAgIGRlZiBnZXRfdGl0bGUoc2VsZik6CisgICAgICAgICMgU3ViY2xhc3MgY2FuIG92ZXJyaWRlCisgICAgICAgIHJldHVybiBzZWxmLndtX3RpdGxlKCkKKworICAgIGRlZiB3YWtldXAoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYud21fc3RhdGUoKSA9PSAiaWNvbmljIjoKKyAgICAgICAgICAgICAgICBzZWxmLndtX3dpdGhkcmF3KCkKKyAgICAgICAgICAgICAgICBzZWxmLndtX2RlaWNvbmlmeSgpCisgICAgICAgICAgICBzZWxmLnRrcmFpc2UoKQorICAgICAgICAgICAgc2VsZi5mb2N1c2VkX3dpZGdldC5mb2N1c19zZXQoKQorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICAjIFRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSB3aW5kb3cgbWVudSB3YXMgdG9ybiBvZmYuCisgICAgICAgICAgICAjIFNpbXBseSBpZ25vcmUgaXQuCisgICAgICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvV2luZG93TGlzdC5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvV2luZG93TGlzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5YmNiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaW5kb3dMaXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvV2luZG93TGlzdC5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvV2luZG93TGlzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5YmNiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaW5kb3dMaXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvWm9vbUhlaWdodC5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ab29tSGVpZ2h0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDE3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvWm9vbUhlaWdodC5weQpAQCAtMCwwICsxLDUxIEBACisjIFNhbXBsZSBleHRlbnNpb246IHpvb20gYSB3aW5kb3cgdG8gbWF4aW11bSBoZWlnaHQKKworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorCitjbGFzcyBab29tSGVpZ2h0OgorCisgICAgbWVudWRlZnMgPSBbCisgICAgICAgICgnd2luZG93cycsIFsKKyAgICAgICAgICAgICgnX1pvb20gSGVpZ2h0JywgJzw8em9vbS1oZWlnaHQ+PicpLAorICAgICAgICAgXSkKKyAgICBdCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbik6CisgICAgICAgIHNlbGYuZWRpdHdpbiA9IGVkaXR3aW4KKworICAgIGRlZiB6b29tX2hlaWdodF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIHRvcCA9IHNlbGYuZWRpdHdpbi50b3AKKyAgICAgICAgem9vbV9oZWlnaHQodG9wKQorCitkZWYgem9vbV9oZWlnaHQodG9wKToKKyAgICBnZW9tID0gdG9wLndtX2dlb21ldHJ5KCkKKyAgICBtID0gcmUubWF0Y2gociIoXGQrKXgoXGQrKVwrKC0/XGQrKVwrKC0/XGQrKSIsIGdlb20pCisgICAgaWYgbm90IG06CisgICAgICAgIHRvcC5iZWxsKCkKKyAgICAgICAgcmV0dXJuCisgICAgd2lkdGgsIGhlaWdodCwgeCwgeSA9IG1hcChpbnQsIG0uZ3JvdXBzKCkpCisgICAgbmV3aGVpZ2h0ID0gdG9wLndpbmZvX3NjcmVlbmhlaWdodCgpCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgIG5ld3kgPSAwCisgICAgICAgIG5ld2hlaWdodCA9IG5ld2hlaWdodCAtIDcyCisKKyAgICBlbGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgICMgVGhlICc4OCcgYmVsb3cgaXMgYSBtYWdpYyBudW1iZXIgdGhhdCBhdm9pZHMgcGxhY2luZyB0aGUgYm90dG9tCisgICAgICAgICMgb2YgdGhlIHdpbmRvdyBiZWxvdyB0aGUgcGFuZWwgb24gbXkgbWFjaGluZS4gSSBkb24ndCBrbm93IGhvdworICAgICAgICAjIHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2YWx1ZSBmb3IgdGhpcyB3aXRoIHRraW50ZXIuCisgICAgICAgIG5ld3kgPSAyMgorICAgICAgICBuZXdoZWlnaHQgPSBuZXdoZWlnaHQgLSBuZXd5IC0gODgKKworICAgIGVsc2U6CisgICAgICAgICNuZXd5ID0gMjQKKyAgICAgICAgbmV3eSA9IDAKKyAgICAgICAgI25ld2hlaWdodCA9IG5ld2hlaWdodCAtIDk2CisgICAgICAgIG5ld2hlaWdodCA9IG5ld2hlaWdodCAtIDg4CisgICAgaWYgaGVpZ2h0ID49IG5ld2hlaWdodDoKKyAgICAgICAgbmV3Z2VvbSA9ICIiCisgICAgZWxzZToKKyAgICAgICAgbmV3Z2VvbSA9ICIlZHglZCslZCslZCIgJSAod2lkdGgsIG5ld2hlaWdodCwgeCwgbmV3eSkKKyAgICB0b3Aud21fZ2VvbWV0cnkobmV3Z2VvbSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9ab29tSGVpZ2h0LnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ab29tSGVpZ2h0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzRhMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1pvb21IZWlnaHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9ab29tSGVpZ2h0LnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ab29tSGVpZ2h0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzRhMTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1pvb21IZWlnaHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTgzZGRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKKyMgRHVtbXkgZmlsZSB0byBtYWtlIHRoaXMgYSBwYWNrYWdlLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhOWI5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhOWI5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2Fib3V0RGlhbG9nLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2Fib3V0RGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MzQ1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvYWJvdXREaWFsb2cucHkKQEAgLTAsMCArMSwxNDUgQEAKKyIiIkFib3V0IERpYWxvZyBmb3IgSURMRQorCisiIiIKKworZnJvbSBUa2ludGVyIGltcG9ydCAqCitpbXBvcnQgb3MKKworZnJvbSBpZGxlbGliIGltcG9ydCB0ZXh0VmlldworZnJvbSBpZGxlbGliIGltcG9ydCBpZGxldmVyCisKK2NsYXNzIEFib3V0RGlhbG9nKFRvcGxldmVsKToKKyAgICAiIiJNb2RhbCBhYm91dCBkaWFsb2cgZm9yIGlkbGUKKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLHBhcmVudCx0aXRsZSk6CisgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKKyAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKKyAgICAgICAgc2VsZi5nZW9tZXRyeSgiKyVkKyVkIiAlIChwYXJlbnQud2luZm9fcm9vdHgoKSszMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSszMCkpCisgICAgICAgIHNlbGYuYmcgPSAiIzcwNzA3MCIKKyAgICAgICAgc2VsZi5mZyA9ICIjZmZmZmZmIgorICAgICAgICBzZWxmLkNyZWF0ZVdpZGdldHMoKQorICAgICAgICBzZWxmLnJlc2l6YWJsZShoZWlnaHQ9RkFMU0UsIHdpZHRoPUZBTFNFKQorICAgICAgICBzZWxmLnRpdGxlKHRpdGxlKQorICAgICAgICBzZWxmLnRyYW5zaWVudChwYXJlbnQpCisgICAgICAgIHNlbGYuZ3JhYl9zZXQoKQorICAgICAgICBzZWxmLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5PaykKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi5idXR0b25Pay5mb2N1c19zZXQoKQorICAgICAgICBzZWxmLmJpbmQoJzxSZXR1cm4+JyxzZWxmLk9rKSAjZGlzbWlzcyBkaWFsb2cKKyAgICAgICAgc2VsZi5iaW5kKCc8RXNjYXBlPicsc2VsZi5PaykgI2Rpc21pc3MgZGlhbG9nCisgICAgICAgIHNlbGYud2FpdF93aW5kb3coKQorCisgICAgZGVmIENyZWF0ZVdpZGdldHMoc2VsZik6CisgICAgICAgIGZyYW1lTWFpbiA9IEZyYW1lKHNlbGYsIGJvcmRlcndpZHRoPTIsIHJlbGllZj1TVU5LRU4pCisgICAgICAgIGZyYW1lQnV0dG9ucyA9IEZyYW1lKHNlbGYpCisgICAgICAgIGZyYW1lQnV0dG9ucy5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpCisgICAgICAgIGZyYW1lTWFpbi5wYWNrKHNpZGU9VE9QLCBleHBhbmQ9VFJVRSwgZmlsbD1CT1RIKQorICAgICAgICBzZWxmLmJ1dHRvbk9rID0gQnV0dG9uKGZyYW1lQnV0dG9ucywgdGV4dD0nQ2xvc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5PaykKKyAgICAgICAgc2VsZi5idXR0b25Pay5wYWNrKHBhZHg9NSwgcGFkeT01KQorICAgICAgICAjc2VsZi5waWN0dXJlID0gSW1hZ2UoJ3Bob3RvJywgZGF0YT1zZWxmLnBpY3R1cmVEYXRhKQorICAgICAgICBmcmFtZUJnID0gRnJhbWUoZnJhbWVNYWluLCBiZz1zZWxmLmJnKQorICAgICAgICBmcmFtZUJnLnBhY2soZXhwYW5kPVRSVUUsIGZpbGw9Qk9USCkKKyAgICAgICAgbGFiZWxUaXRsZSA9IExhYmVsKGZyYW1lQmcsIHRleHQ9J0lETEUnLCBmZz1zZWxmLmZnLCBiZz1zZWxmLmJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udD0oJ2NvdXJpZXInLCAyNCwgJ2JvbGQnKSkKKyAgICAgICAgbGFiZWxUaXRsZS5ncmlkKHJvdz0wLCBjb2x1bW49MCwgc3RpY2t5PVcsIHBhZHg9MTAsIHBhZHk9MTApCisgICAgICAgICNsYWJlbFBpY3R1cmUgPSBMYWJlbChmcmFtZUJnLCB0ZXh0PSdbcGljdHVyZV0nKQorICAgICAgICAjaW1hZ2U9c2VsZi5waWN0dXJlLCBiZz1zZWxmLmJnKQorICAgICAgICAjbGFiZWxQaWN0dXJlLmdyaWQocm93PTEsIGNvbHVtbj0xLCBzdGlja3k9Vywgcm93c3Bhbj0yLAorICAgICAgICAjICAgICAgICAgICAgICAgICAgcGFkeD0wLCBwYWR5PTMpCisgICAgICAgIGJ5bGluZSA9ICJQeXRob24ncyBJbnRlZ3JhdGVkIERldmVMb3BtZW50IEVudmlyb25tZW50IiArIDUqJ1xuJworICAgICAgICBsYWJlbERlc2MgPSBMYWJlbChmcmFtZUJnLCB0ZXh0PWJ5bGluZSwganVzdGlmeT1MRUZULAorICAgICAgICAgICAgICAgICAgICAgICAgICBmZz1zZWxmLmZnLCBiZz1zZWxmLmJnKQorICAgICAgICBsYWJlbERlc2MuZ3JpZChyb3c9MiwgY29sdW1uPTAsIHN0aWNreT1XLCBjb2x1bW5zcGFuPTMsIHBhZHg9MTAsIHBhZHk9NSkKKyAgICAgICAgbGFiZWxFbWFpbCA9IExhYmVsKGZyYW1lQmcsIHRleHQ9J2VtYWlsOiAgaWRsZS1kZXZAcHl0aG9uLm9yZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5PUxFRlQsIGZnPXNlbGYuZmcsIGJnPXNlbGYuYmcpCisgICAgICAgIGxhYmVsRW1haWwuZ3JpZChyb3c9NiwgY29sdW1uPTAsIGNvbHVtbnNwYW49MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0aWNreT1XLCBwYWR4PTEwLCBwYWR5PTApCisgICAgICAgIGxhYmVsV1dXID0gTGFiZWwoZnJhbWVCZywgdGV4dD0nd3d3OiAgaHR0cDovL3d3dy5weXRob24ub3JnL2lkbGUvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5PUxFRlQsIGZnPXNlbGYuZmcsIGJnPXNlbGYuYmcpCisgICAgICAgIGxhYmVsV1dXLmdyaWQocm93PTcsIGNvbHVtbj0wLCBjb2x1bW5zcGFuPTIsIHN0aWNreT1XLCBwYWR4PTEwLCBwYWR5PTApCisgICAgICAgIEZyYW1lKGZyYW1lQmcsIGJvcmRlcndpZHRoPTEsIHJlbGllZj1TVU5LRU4sCisgICAgICAgICAgICAgIGhlaWdodD0yLCBiZz1zZWxmLmJnKS5ncmlkKHJvdz04LCBjb2x1bW49MCwgc3RpY2t5PUVXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zcGFuPTMsIHBhZHg9NSwgcGFkeT01KQorICAgICAgICBsYWJlbFB5dGhvblZlciA9IExhYmVsKGZyYW1lQmcsIHRleHQ9J1B5dGhvbiB2ZXJzaW9uOiAgJyArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbi5zcGxpdCgpWzBdLCBmZz1zZWxmLmZnLCBiZz1zZWxmLmJnKQorICAgICAgICBsYWJlbFB5dGhvblZlci5ncmlkKHJvdz05LCBjb2x1bW49MCwgc3RpY2t5PVcsIHBhZHg9MTAsIHBhZHk9MCkKKyAgICAgICAgdGtWZXIgPSBzZWxmLnRrLmNhbGwoJ2luZm8nLCAncGF0Y2hsZXZlbCcpCisgICAgICAgIGxhYmVsVGtWZXIgPSBMYWJlbChmcmFtZUJnLCB0ZXh0PSdUayB2ZXJzaW9uOiAgJysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRrVmVyLCBmZz1zZWxmLmZnLCBiZz1zZWxmLmJnKQorICAgICAgICBsYWJlbFRrVmVyLmdyaWQocm93PTksIGNvbHVtbj0xLCBzdGlja3k9VywgcGFkeD0yLCBwYWR5PTApCisgICAgICAgIHB5X2J1dHRvbl9mID0gRnJhbWUoZnJhbWVCZywgYmc9c2VsZi5iZykKKyAgICAgICAgcHlfYnV0dG9uX2YuZ3JpZChyb3c9MTAsIGNvbHVtbj0wLCBjb2x1bW5zcGFuPTIsIHN0aWNreT1OU0VXKQorICAgICAgICBidXR0b25MaWNlbnNlID0gQnV0dG9uKHB5X2J1dHRvbl9mLCB0ZXh0PSdMaWNlbnNlJywgd2lkdGg9OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kPXNlbGYuYmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLlNob3dMaWNlbnNlKQorICAgICAgICBidXR0b25MaWNlbnNlLnBhY2soc2lkZT1MRUZULCBwYWR4PTEwLCBwYWR5PTEwKQorICAgICAgICBidXR0b25Db3B5cmlnaHQgPSBCdXR0b24ocHlfYnV0dG9uX2YsIHRleHQ9J0NvcHlyaWdodCcsIHdpZHRoPTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kPXNlbGYuYmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuU2hvd0NvcHlyaWdodCkKKyAgICAgICAgYnV0dG9uQ29weXJpZ2h0LnBhY2soc2lkZT1MRUZULCBwYWR4PTEwLCBwYWR5PTEwKQorICAgICAgICBidXR0b25DcmVkaXRzID0gQnV0dG9uKHB5X2J1dHRvbl9mLCB0ZXh0PSdDcmVkaXRzJywgd2lkdGg9OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kPXNlbGYuYmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLlNob3dQeXRob25DcmVkaXRzKQorICAgICAgICBidXR0b25DcmVkaXRzLnBhY2soc2lkZT1MRUZULCBwYWR4PTEwLCBwYWR5PTEwKQorICAgICAgICBGcmFtZShmcmFtZUJnLCBib3JkZXJ3aWR0aD0xLCByZWxpZWY9U1VOS0VOLAorICAgICAgICAgICAgICBoZWlnaHQ9MiwgYmc9c2VsZi5iZykuZ3JpZChyb3c9MTEsIGNvbHVtbj0wLCBzdGlja3k9RVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNwYW49MywgcGFkeD01LCBwYWR5PTUpCisgICAgICAgIGlkbGVfdiA9IExhYmVsKGZyYW1lQmcsIHRleHQ9J0lETEUgdmVyc2lvbjogICAnICsgaWRsZXZlci5JRExFX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgIGZnPXNlbGYuZmcsIGJnPXNlbGYuYmcpCisgICAgICAgIGlkbGVfdi5ncmlkKHJvdz0xMiwgY29sdW1uPTAsIHN0aWNreT1XLCBwYWR4PTEwLCBwYWR5PTApCisgICAgICAgIGlkbGVfYnV0dG9uX2YgPSBGcmFtZShmcmFtZUJnLCBiZz1zZWxmLmJnKQorICAgICAgICBpZGxlX2J1dHRvbl9mLmdyaWQocm93PTEzLCBjb2x1bW49MCwgY29sdW1uc3Bhbj0zLCBzdGlja3k9TlNFVykKKyAgICAgICAgaWRsZV9hYm91dF9iID0gQnV0dG9uKGlkbGVfYnV0dG9uX2YsIHRleHQ9J1JFQURNRScsIHdpZHRoPTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQ9c2VsZi5iZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLlNob3dJRExFQWJvdXQpCisgICAgICAgIGlkbGVfYWJvdXRfYi5wYWNrKHNpZGU9TEVGVCwgcGFkeD0xMCwgcGFkeT0xMCkKKyAgICAgICAgaWRsZV9uZXdzX2IgPSBCdXR0b24oaWRsZV9idXR0b25fZiwgdGV4dD0nTkVXUycsIHdpZHRoPTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQ9c2VsZi5iZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLlNob3dJRExFTkVXUykKKyAgICAgICAgaWRsZV9uZXdzX2IucGFjayhzaWRlPUxFRlQsIHBhZHg9MTAsIHBhZHk9MTApCisgICAgICAgIGlkbGVfY3JlZGl0c19iID0gQnV0dG9uKGlkbGVfYnV0dG9uX2YsIHRleHQ9J0NyZWRpdHMnLCB3aWR0aD04LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kPXNlbGYuYmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5TaG93SURMRUNyZWRpdHMpCisgICAgICAgIGlkbGVfY3JlZGl0c19iLnBhY2soc2lkZT1MRUZULCBwYWR4PTEwLCBwYWR5PTEwKQorCisgICAgZGVmIFNob3dMaWNlbnNlKHNlbGYpOgorICAgICAgICBzZWxmLmRpc3BsYXlfcHJpbnRlcl90ZXh0KCdBYm91dCAtIExpY2Vuc2UnLCBsaWNlbnNlKQorCisgICAgZGVmIFNob3dDb3B5cmlnaHQoc2VsZik6CisgICAgICAgIHNlbGYuZGlzcGxheV9wcmludGVyX3RleHQoJ0Fib3V0IC0gQ29weXJpZ2h0JywgY29weXJpZ2h0KQorCisgICAgZGVmIFNob3dQeXRob25DcmVkaXRzKHNlbGYpOgorICAgICAgICBzZWxmLmRpc3BsYXlfcHJpbnRlcl90ZXh0KCdBYm91dCAtIFB5dGhvbiBDcmVkaXRzJywgY3JlZGl0cykKKworICAgIGRlZiBTaG93SURMRUNyZWRpdHMoc2VsZik6CisgICAgICAgIHNlbGYuZGlzcGxheV9maWxlX3RleHQoJ0Fib3V0IC0gQ3JlZGl0cycsICdDUkVESVRTLnR4dCcsICdpc28tODg1OS0xJykKKworICAgIGRlZiBTaG93SURMRUFib3V0KHNlbGYpOgorICAgICAgICBzZWxmLmRpc3BsYXlfZmlsZV90ZXh0KCdBYm91dCAtIFJlYWRtZScsICdSRUFETUUudHh0JykKKworICAgIGRlZiBTaG93SURMRU5FV1Moc2VsZik6CisgICAgICAgIHNlbGYuZGlzcGxheV9maWxlX3RleHQoJ0Fib3V0IC0gTkVXUycsICdORVdTLnR4dCcpCisKKyAgICBkZWYgZGlzcGxheV9wcmludGVyX3RleHQoc2VsZiwgdGl0bGUsIHByaW50ZXIpOgorICAgICAgICBwcmludGVyLl9QcmludGVyX19zZXR1cCgpCisgICAgICAgIHRleHQgPSAnXG4nLmpvaW4ocHJpbnRlci5fUHJpbnRlcl9fbGluZXMpCisgICAgICAgIHRleHRWaWV3LnZpZXdfdGV4dChzZWxmLCB0aXRsZSwgdGV4dCkKKworICAgIGRlZiBkaXNwbGF5X2ZpbGVfdGV4dChzZWxmLCB0aXRsZSwgZmlsZW5hbWUsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICBmbiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksIGZpbGVuYW1lKQorICAgICAgICB0ZXh0Vmlldy52aWV3X2ZpbGUoc2VsZiwgdGl0bGUsIGZuLCBlbmNvZGluZykKKworICAgIGRlZiBPayhzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgc2VsZi5kZXN0cm95KCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAjIHRlc3QgdGhlIGRpYWxvZworICAgIHJvb3QgPSBUaygpCisgICAgZGVmIHJ1bigpOgorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGFib3V0RGlhbG9nCisgICAgICAgIGFib3V0RGlhbG9nLkFib3V0RGlhbG9nKHJvb3QsICdBYm91dCcpCisgICAgQnV0dG9uKHJvb3QsIHRleHQ9J0RpYWxvZycsIGNvbW1hbmQ9cnVuKS5wYWNrKCkKKyAgICByb290Lm1haW5sb29wKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9hYm91dERpYWxvZy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvYWJvdXREaWFsb2cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzA1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvYWJvdXREaWFsb2cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9hYm91dERpYWxvZy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvYWJvdXREaWFsb2cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzA1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvYWJvdXREaWFsb2cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWctZXh0ZW5zaW9ucy5kZWYgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnLWV4dGVuc2lvbnMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZTY5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnLWV4dGVuc2lvbnMuZGVmCkBAIC0wLDAgKzEsOTYgQEAKKyMgY29uZmlnLWV4dGVuc2lvbnMuZGVmCisjCisjIElETEUgcmVhZHMgc2V2ZXJhbCBjb25maWcgZmlsZXMgdG8gZGV0ZXJtaW5lIHVzZXIgcHJlZmVyZW5jZXMuICBUaGlzCisjIGZpbGUgaXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlIGZvciBJRExFIGV4dGVuc2lvbnMgc2V0dGluZ3MuCisjCisjIEVhY2ggZXh0ZW5zaW9uIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgc2VjdGlvbiwgbmFtZWQgYWZ0ZXIgdGhlIGV4dGVuc2lvbgorIyBtb2R1bGUuIFRoaXMgc2VjdGlvbiBtdXN0IGNvbnRhaW4gYW4gJ2VuYWJsZScgaXRlbSAoPTEgdG8gZW5hYmxlIHRoZQorIyBleHRlbnNpb24sID0wIHRvIGRpc2FibGUgaXQpLCBpdCBtYXkgY29udGFpbiAnZW5hYmxlX2VkaXRvcicgb3IgJ2VuYWJsZV9zaGVsbCcKKyMgaXRlbXMsIHRvIGFwcGx5IGl0IG9ubHkgdG8gZWRpdG9yL3NoZWxsIHdpbmRvd3MsIGFuZCBtYXkgYWxzbyBjb250YWluIGFueQorIyBvdGhlciBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gaXRlbXMgZm9yIHRoZSBleHRlbnNpb24uCisjCisjIEVhY2ggZXh0ZW5zaW9uIG11c3QgZGVmaW5lIGF0IGxlYXN0IG9uZSBzZWN0aW9uIG5hbWVkIEV4dGVuc2lvbk5hbWVfYmluZGluZ3MKKyMgb3IgRXh0ZW5zaW9uTmFtZV9jZmdCaW5kaW5ncy4gSWYgcHJlc2VudCwgRXh0ZW5zaW9uTmFtZV9iaW5kaW5ncyBkZWZpbmVzCisjIHZpcnR1YWwgZXZlbnQgYmluZGluZ3MgZm9yIHRoZSBleHRlbnNpb24gdGhhdCBhcmUgbm90IHVzZXIgcmUtY29uZmlndXJhYmxlLgorIyBJZiBwcmVzZW50LCBFeHRlbnNpb25OYW1lX2NmZ0JpbmRpbmdzIGRlZmluZXMgdmlydHVhbCBldmVudCBiaW5kaW5ncyBmb3IgdGhlCisjIGV4dGVuc2lvbiB0aGF0IG1heSBiZSBzZW5zaWJseSByZS1jb25maWd1cmVkLgorIworIyBJZiB0aGVyZSBhcmUgbm8ga2V5YmluZGluZ3MgZm9yIGEgbWVudXMnIHZpcnR1YWwgZXZlbnRzLCBpbmNsdWRlIGxpbmVzIGxpa2UKKyMgPDx0b2dnbGUtY29kZS1jb250ZXh0Pj49ICAgKFNlZSBbQ29kZUNvbnRleHRdLCBiZWxvdy4pCisjCisjIEN1cnJlbnRseSBpdCBpcyBuZWNlc3NhcnkgdG8gbWFudWFsbHkgbW9kaWZ5IHRoaXMgZmlsZSB0byBjaGFuZ2UgZXh0ZW5zaW9uCisjIGtleSBiaW5kaW5ncyBhbmQgZGVmYXVsdCB2YWx1ZXMuIFRvIGN1c3RvbWl6ZSwgY3JlYXRlCisjIH4vLmlkbGVyYy9jb25maWctZXh0ZW5zaW9ucy5jZmcgYW5kIGFwcGVuZCB0aGUgYXBwcm9wcmlhdGUgY3VzdG9taXplZAorIyBzZWN0aW9uKHMpLiAgVGhvc2Ugc2VjdGlvbnMgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdHMgaW4gdGhpcyBmaWxlLgorIworIyBOb3RlOiBJZiBhIGtleWJpbmRpbmcgaXMgYWxyZWFkeSBpbiB1c2Ugd2hlbiB0aGUgZXh0ZW5zaW9uIGlzCisjIGxvYWRlZCwgdGhlIGV4dGVuc2lvbidzIHZpcnR1YWwgZXZlbnQncyBrZXliaW5kaW5nIHdpbGwgYmUgc2V0IHRvICcnLgorIworIyBTZWUgY29uZmlnLWtleXMuZGVmIGZvciBub3RlcyBvbiBzcGVjaWZ5aW5nIGtleXMgYW5kIGV4dGVuZC50eHQgZm9yCisjIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIElETEUgZXh0ZW5zaW9ucy4KKworW0Zvcm1hdFBhcmFncmFwaF0KK2VuYWJsZT0xCitbRm9ybWF0UGFyYWdyYXBoX2NmZ0JpbmRpbmdzXQorZm9ybWF0LXBhcmFncmFwaD08QWx0LUtleS1xPgorCitbQXV0b0V4cGFuZF0KK2VuYWJsZT0xCitbQXV0b0V4cGFuZF9jZmdCaW5kaW5nc10KK2V4cGFuZC13b3JkPTxBbHQtS2V5LXNsYXNoPgorCitbWm9vbUhlaWdodF0KK2VuYWJsZT0xCitbWm9vbUhlaWdodF9jZmdCaW5kaW5nc10KK3pvb20taGVpZ2h0PTxBbHQtS2V5LTI+CisKK1tTY3JpcHRCaW5kaW5nXQorZW5hYmxlPTEKK2VuYWJsZV9zaGVsbD0wCitlbmFibGVfZWRpdG9yPTEKK1tTY3JpcHRCaW5kaW5nX2NmZ0JpbmRpbmdzXQorcnVuLW1vZHVsZT08S2V5LUY1PgorY2hlY2stbW9kdWxlPTxBbHQtS2V5LXg+CisKK1tDYWxsVGlwc10KK2VuYWJsZT0xCitbQ2FsbFRpcHNfY2ZnQmluZGluZ3NdCitmb3JjZS1vcGVuLWNhbGx0aXA9PENvbnRyb2wtS2V5LWJhY2tzbGFzaD4KK1tDYWxsVGlwc19iaW5kaW5nc10KK3RyeS1vcGVuLWNhbGx0aXA9PEtleVJlbGVhc2UtcGFyZW5sZWZ0PgorcmVmcmVzaC1jYWxsdGlwPTxLZXlSZWxlYXNlLXBhcmVucmlnaHQ+IDxLZXlSZWxlYXNlLTA+CisKK1tQYXJlbk1hdGNoXQorZW5hYmxlPTEKK3N0eWxlPSBleHByZXNzaW9uCitmbGFzaC1kZWxheT0gNTAwCitiZWxsPSAxCitbUGFyZW5NYXRjaF9jZmdCaW5kaW5nc10KK2ZsYXNoLXBhcmVuPTxDb250cm9sLUtleS0wPgorW1BhcmVuTWF0Y2hfYmluZGluZ3NdCitwYXJlbi1jbG9zZWQ9PEtleVJlbGVhc2UtcGFyZW5yaWdodD4gPEtleVJlbGVhc2UtYnJhY2tldHJpZ2h0PiA8S2V5UmVsZWFzZS1icmFjZXJpZ2h0PgorCitbQXV0b0NvbXBsZXRlXQorZW5hYmxlPTEKK3BvcHVwd2FpdD0yMDAwCitbQXV0b0NvbXBsZXRlX2NmZ0JpbmRpbmdzXQorZm9yY2Utb3Blbi1jb21wbGV0aW9ucz08Q29udHJvbC1LZXktc3BhY2U+CitbQXV0b0NvbXBsZXRlX2JpbmRpbmdzXQorYXV0b2NvbXBsZXRlPTxLZXktVGFiPgordHJ5LW9wZW4tY29tcGxldGlvbnM9PEtleVJlbGVhc2UtcGVyaW9kPiA8S2V5UmVsZWFzZS1zbGFzaD4gPEtleVJlbGVhc2UtYmFja3NsYXNoPgorCitbQ29kZUNvbnRleHRdCitlbmFibGU9MQorZW5hYmxlX3NoZWxsPTAKK251bWxpbmVzPTMKK3Zpc2libGU9MAorYmdjb2xvcj1MaWdodEdyYXkKK2ZnY29sb3I9QmxhY2sKK1tDb2RlQ29udGV4dF9iaW5kaW5nc10KK3RvZ2dsZS1jb2RlLWNvbnRleHQ9CisKK1tSc3RyaXBFeHRlbnNpb25dCitlbmFibGU9MQorZW5hYmxlX3NoZWxsPTAKK2VuYWJsZV9lZGl0b3I9MQorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnLWhpZ2hsaWdodC5kZWYgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnLWhpZ2hsaWdodC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QyMGY3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWctaGlnaGxpZ2h0LmRlZgpAQCAtMCwwICsxLDY0IEBACisjIElETEUgcmVhZHMgc2V2ZXJhbCBjb25maWcgZmlsZXMgdG8gZGV0ZXJtaW5lIHVzZXIgcHJlZmVyZW5jZXMuICBUaGlzCisjIGZpbGUgaXMgdGhlIGRlZmF1bHQgY29uZmlnIGZpbGUgZm9yIGlkbGUgaGlnaGxpZ2h0IHRoZW1lIHNldHRpbmdzLgorCitbSURMRSBDbGFzc2ljXQorbm9ybWFsLWZvcmVncm91bmQ9ICMwMDAwMDAKK25vcm1hbC1iYWNrZ3JvdW5kPSAjZmZmZmZmCitrZXl3b3JkLWZvcmVncm91bmQ9ICNmZjc3MDAKK2tleXdvcmQtYmFja2dyb3VuZD0gI2ZmZmZmZgorYnVpbHRpbi1mb3JlZ3JvdW5kPSAjOTAwMDkwCitidWlsdGluLWJhY2tncm91bmQ9ICNmZmZmZmYKK2NvbW1lbnQtZm9yZWdyb3VuZD0gI2RkMDAwMAorY29tbWVudC1iYWNrZ3JvdW5kPSAjZmZmZmZmCitzdHJpbmctZm9yZWdyb3VuZD0gIzAwYWEwMAorc3RyaW5nLWJhY2tncm91bmQ9ICNmZmZmZmYKK2RlZmluaXRpb24tZm9yZWdyb3VuZD0gIzAwMDBmZgorZGVmaW5pdGlvbi1iYWNrZ3JvdW5kPSAjZmZmZmZmCitoaWxpdGUtZm9yZWdyb3VuZD0gIzAwMDAwMAoraGlsaXRlLWJhY2tncm91bmQ9IGdyYXkKK2JyZWFrLWZvcmVncm91bmQ9IGJsYWNrCiticmVhay1iYWNrZ3JvdW5kPSAjZmZmZjU1CitoaXQtZm9yZWdyb3VuZD0gI2ZmZmZmZgoraGl0LWJhY2tncm91bmQ9ICMwMDAwMDAKK2Vycm9yLWZvcmVncm91bmQ9ICMwMDAwMDAKK2Vycm9yLWJhY2tncm91bmQ9ICNmZjc3NzcKKyNjdXJzb3IgKG9ubHkgZm9yZWdyb3VuZCBjYW4gYmUgc2V0LCByZXN0YXJ0IElETEUpCitjdXJzb3ItZm9yZWdyb3VuZD0gYmxhY2sKKyNzaGVsbCB3aW5kb3cKK3N0ZG91dC1mb3JlZ3JvdW5kPSBibHVlCitzdGRvdXQtYmFja2dyb3VuZD0gI2ZmZmZmZgorc3RkZXJyLWZvcmVncm91bmQ9IHJlZAorc3RkZXJyLWJhY2tncm91bmQ9ICNmZmZmZmYKK2NvbnNvbGUtZm9yZWdyb3VuZD0gIzc3MDAwMAorY29uc29sZS1iYWNrZ3JvdW5kPSAjZmZmZmZmCisKK1tJRExFIE5ld10KK25vcm1hbC1mb3JlZ3JvdW5kPSAjMDAwMDAwCitub3JtYWwtYmFja2dyb3VuZD0gI2ZmZmZmZgora2V5d29yZC1mb3JlZ3JvdW5kPSAjZmY3NzAwCitrZXl3b3JkLWJhY2tncm91bmQ9ICNmZmZmZmYKK2J1aWx0aW4tZm9yZWdyb3VuZD0gIzkwMDA5MAorYnVpbHRpbi1iYWNrZ3JvdW5kPSAjZmZmZmZmCitjb21tZW50LWZvcmVncm91bmQ9ICNkZDAwMDAKK2NvbW1lbnQtYmFja2dyb3VuZD0gI2ZmZmZmZgorc3RyaW5nLWZvcmVncm91bmQ9ICMwMGFhMDAKK3N0cmluZy1iYWNrZ3JvdW5kPSAjZmZmZmZmCitkZWZpbml0aW9uLWZvcmVncm91bmQ9ICMwMDAwZmYKK2RlZmluaXRpb24tYmFja2dyb3VuZD0gI2ZmZmZmZgoraGlsaXRlLWZvcmVncm91bmQ9ICMwMDAwMDAKK2hpbGl0ZS1iYWNrZ3JvdW5kPSBncmF5CiticmVhay1mb3JlZ3JvdW5kPSBibGFjaworYnJlYWstYmFja2dyb3VuZD0gI2ZmZmY1NQoraGl0LWZvcmVncm91bmQ9ICNmZmZmZmYKK2hpdC1iYWNrZ3JvdW5kPSAjMDAwMDAwCitlcnJvci1mb3JlZ3JvdW5kPSAjMDAwMDAwCitlcnJvci1iYWNrZ3JvdW5kPSAjZmY3Nzc3CisjY3Vyc29yIChvbmx5IGZvcmVncm91bmQgY2FuIGJlIHNldCwgcmVzdGFydCBJRExFKQorY3Vyc29yLWZvcmVncm91bmQ9IGJsYWNrCisjc2hlbGwgd2luZG93CitzdGRvdXQtZm9yZWdyb3VuZD0gYmx1ZQorc3Rkb3V0LWJhY2tncm91bmQ9ICNmZmZmZmYKK3N0ZGVyci1mb3JlZ3JvdW5kPSByZWQKK3N0ZGVyci1iYWNrZ3JvdW5kPSAjZmZmZmZmCitjb25zb2xlLWZvcmVncm91bmQ9ICM3NzAwMDAKK2NvbnNvbGUtYmFja2dyb3VuZD0gI2ZmZmZmZgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZiBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWcta2V5cy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjMzViYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWcta2V5cy5kZWYKQEAgLTAsMCArMSwyMTQgQEAKKyMgSURMRSByZWFkcyBzZXZlcmFsIGNvbmZpZyBmaWxlcyB0byBkZXRlcm1pbmUgdXNlciBwcmVmZXJlbmNlcy4gIFRoaXMKKyMgZmlsZSBpcyB0aGUgZGVmYXVsdCBjb25maWcgZmlsZSBmb3IgaWRsZSBrZXkgYmluZGluZyBzZXR0aW5ncy4KKyMgV2hlcmUgbXVsdGlwbGUga2V5cyBhcmUgc3BlY2lmaWVkIGZvciBhbiBhY3Rpb246IGlmIHRoZXkgYXJlIHNlcGFyYXRlZAorIyBieSBhIHNwYWNlIChlZy4gYWN0aW9uPTxrZXkxPiA8a2V5Mj4pIHRoZW4gdGhlIGtleXMgYXJlIGFsdGVybmF0aXZlcywgaWYKKyMgdGhlcmUgaXMgbm8gc3BhY2UgKGVnLiBhY3Rpb249PGtleTE+PGtleTI+KSB0aGVuIHRoZSBrZXlzIGNvbXByaXNlIGEKKyMgc2luZ2xlICdlbWFjcyBzdHlsZScgbXVsdGkta2V5c3Rva2UgYmluZGluZy4gVGhlIHRrIGV2ZW50IHNwZWNpZmllciAnS2V5JworIyBpcyB1c2VkIGluIGFsbCBjYXNlcywgZm9yIGNvbnNpc3RlbmN5IGluIGF1dG8ga2V5IGNvbmZsaWN0IGNoZWNraW5nIGluIHRoZQorIyBjb25maWd1cmF0aW9uIGd1aS4KKworW0lETEUgQ2xhc3NpYyBXaW5kb3dzXQorY29weT08Q29udHJvbC1LZXktYz4gPENvbnRyb2wtS2V5LUM+CitjdXQ9PENvbnRyb2wtS2V5LXg+IDxDb250cm9sLUtleS1YPgorcGFzdGU9PENvbnRyb2wtS2V5LXY+IDxDb250cm9sLUtleS1WPgorYmVnaW5uaW5nLW9mLWxpbmU9IDxLZXktSG9tZT4KK2NlbnRlci1pbnNlcnQ9PENvbnRyb2wtS2V5LWw+IDxDb250cm9sLUtleS1MPgorY2xvc2UtYWxsLXdpbmRvd3M9PENvbnRyb2wtS2V5LXE+CitjbG9zZS13aW5kb3c9PEFsdC1LZXktRjQ+IDxNZXRhLUtleS1GND4KK2RvLW5vdGhpbmc9PENvbnRyb2wtS2V5LUYxMj4KK2VuZC1vZi1maWxlPTxDb250cm9sLUtleS1kPiA8Q29udHJvbC1LZXktRD4KK3B5dGhvbi1kb2NzPTxLZXktRjE+CitweXRob24tY29udGV4dC1oZWxwPTxTaGlmdC1LZXktRjE+CitoaXN0b3J5LW5leHQ9PEFsdC1LZXktbj4gPE1ldGEtS2V5LW4+CitoaXN0b3J5LXByZXZpb3VzPTxBbHQtS2V5LXA+IDxNZXRhLUtleS1wPgoraW50ZXJydXB0LWV4ZWN1dGlvbj08Q29udHJvbC1LZXktYz4gPENvbnRyb2wtS2V5LUM+Cit2aWV3LXJlc3RhcnQ9PEtleS1GNj4KK3Jlc3RhcnQtc2hlbGw9PENvbnRyb2wtS2V5LUY2Pgorb3Blbi1jbGFzcy1icm93c2VyPTxBbHQtS2V5LWM+IDxNZXRhLUtleS1jPiA8QWx0LUtleS1DPgorb3Blbi1tb2R1bGU9PEFsdC1LZXktbT4gPE1ldGEtS2V5LW0+IDxBbHQtS2V5LU0+CitvcGVuLW5ldy13aW5kb3c9PENvbnRyb2wtS2V5LW4+IDxDb250cm9sLUtleS1OPgorb3Blbi13aW5kb3ctZnJvbS1maWxlPTxDb250cm9sLUtleS1vPiA8Q29udHJvbC1LZXktTz4KK3BsYWluLW5ld2xpbmUtYW5kLWluZGVudD08Q29udHJvbC1LZXktaj4gPENvbnRyb2wtS2V5LUo+CitwcmludC13aW5kb3c9PENvbnRyb2wtS2V5LXA+IDxDb250cm9sLUtleS1QPgorcmVkbz08Q29udHJvbC1TaGlmdC1LZXktWj4KK3JlbW92ZS1zZWxlY3Rpb249PEtleS1Fc2NhcGU+CitzYXZlLWNvcHktb2Ytd2luZG93LWFzLWZpbGU9PEFsdC1TaGlmdC1LZXktUz4KK3NhdmUtd2luZG93LWFzLWZpbGU9PENvbnRyb2wtU2hpZnQtS2V5LVM+CitzYXZlLXdpbmRvdz08Q29udHJvbC1LZXktcz4KK3NlbGVjdC1hbGw9PENvbnRyb2wtS2V5LWE+Cit0b2dnbGUtYXV0by1jb2xvcmluZz08Q29udHJvbC1LZXktc2xhc2g+Cit1bmRvPTxDb250cm9sLUtleS16PiA8Q29udHJvbC1LZXktWj4KK2ZpbmQ9PENvbnRyb2wtS2V5LWY+IDxDb250cm9sLUtleS1GPgorZmluZC1hZ2Fpbj08Q29udHJvbC1LZXktZz4gPEtleS1GMz4KK2ZpbmQtaW4tZmlsZXM9PEFsdC1LZXktRjM+IDxNZXRhLUtleS1GMz4KK2ZpbmQtc2VsZWN0aW9uPTxDb250cm9sLUtleS1GMz4KK3JlcGxhY2U9PENvbnRyb2wtS2V5LWg+IDxDb250cm9sLUtleS1IPgorZ290by1saW5lPTxBbHQtS2V5LWc+IDxNZXRhLUtleS1nPgorc21hcnQtYmFja3NwYWNlPTxLZXktQmFja1NwYWNlPgorbmV3bGluZS1hbmQtaW5kZW50PTxLZXktUmV0dXJuPiA8S2V5LUtQX0VudGVyPgorc21hcnQtaW5kZW50PTxLZXktVGFiPgoraW5kZW50LXJlZ2lvbj08Q29udHJvbC1LZXktYnJhY2tldHJpZ2h0PgorZGVkZW50LXJlZ2lvbj08Q29udHJvbC1LZXktYnJhY2tldGxlZnQ+Citjb21tZW50LXJlZ2lvbj08QWx0LUtleS0zPiA8TWV0YS1LZXktMz4KK3VuY29tbWVudC1yZWdpb249PEFsdC1LZXktND4gPE1ldGEtS2V5LTQ+Cit0YWJpZnktcmVnaW9uPTxBbHQtS2V5LTU+IDxNZXRhLUtleS01PgordW50YWJpZnktcmVnaW9uPTxBbHQtS2V5LTY+IDxNZXRhLUtleS02PgordG9nZ2xlLXRhYnM9PEFsdC1LZXktdD4gPE1ldGEtS2V5LXQ+IDxBbHQtS2V5LVQ+CitjaGFuZ2UtaW5kZW50d2lkdGg9PEFsdC1LZXktdT4gPE1ldGEtS2V5LXU+IDxBbHQtS2V5LVU+CitkZWwtd29yZC1sZWZ0PTxDb250cm9sLUtleS1CYWNrU3BhY2U+CitkZWwtd29yZC1yaWdodD08Q29udHJvbC1LZXktRGVsZXRlPgorCitbSURMRSBDbGFzc2ljIFVuaXhdCitjb3B5PTxBbHQtS2V5LXc+IDxNZXRhLUtleS13PgorY3V0PTxDb250cm9sLUtleS13PgorcGFzdGU9PENvbnRyb2wtS2V5LXk+CitiZWdpbm5pbmctb2YtbGluZT08Q29udHJvbC1LZXktYT4gPEtleS1Ib21lPgorY2VudGVyLWluc2VydD08Q29udHJvbC1LZXktbD4KK2Nsb3NlLWFsbC13aW5kb3dzPTxDb250cm9sLUtleS14PjxDb250cm9sLUtleS1jPgorY2xvc2Utd2luZG93PTxDb250cm9sLUtleS14PjxDb250cm9sLUtleS0wPgorZG8tbm90aGluZz08Q29udHJvbC1LZXkteD4KK2VuZC1vZi1maWxlPTxDb250cm9sLUtleS1kPgoraGlzdG9yeS1uZXh0PTxBbHQtS2V5LW4+IDxNZXRhLUtleS1uPgoraGlzdG9yeS1wcmV2aW91cz08QWx0LUtleS1wPiA8TWV0YS1LZXktcD4KK2ludGVycnVwdC1leGVjdXRpb249PENvbnRyb2wtS2V5LWM+Cit2aWV3LXJlc3RhcnQ9PEtleS1GNj4KK3Jlc3RhcnQtc2hlbGw9PENvbnRyb2wtS2V5LUY2Pgorb3Blbi1jbGFzcy1icm93c2VyPTxDb250cm9sLUtleS14PjxDb250cm9sLUtleS1iPgorb3Blbi1tb2R1bGU9PENvbnRyb2wtS2V5LXg+PENvbnRyb2wtS2V5LW0+CitvcGVuLW5ldy13aW5kb3c9PENvbnRyb2wtS2V5LXg+PENvbnRyb2wtS2V5LW4+CitvcGVuLXdpbmRvdy1mcm9tLWZpbGU9PENvbnRyb2wtS2V5LXg+PENvbnRyb2wtS2V5LWY+CitwbGFpbi1uZXdsaW5lLWFuZC1pbmRlbnQ9PENvbnRyb2wtS2V5LWo+CitwcmludC13aW5kb3c9PENvbnRyb2wteD48Q29udHJvbC1LZXktcD4KK3B5dGhvbi1kb2NzPTxDb250cm9sLUtleS1oPgorcHl0aG9uLWNvbnRleHQtaGVscD08Q29udHJvbC1TaGlmdC1LZXktSD4KK3JlZG89PEFsdC1LZXktej4gPE1ldGEtS2V5LXo+CityZW1vdmUtc2VsZWN0aW9uPTxLZXktRXNjYXBlPgorc2F2ZS1jb3B5LW9mLXdpbmRvdy1hcy1maWxlPTxDb250cm9sLUtleS14PjxDb250cm9sLUtleS15Pgorc2F2ZS13aW5kb3ctYXMtZmlsZT08Q29udHJvbC1LZXkteD48Q29udHJvbC1LZXktdz4KK3NhdmUtd2luZG93PTxDb250cm9sLUtleS14PjxDb250cm9sLUtleS1zPgorc2VsZWN0LWFsbD08QWx0LUtleS1hPiA8TWV0YS1LZXktYT4KK3RvZ2dsZS1hdXRvLWNvbG9yaW5nPTxDb250cm9sLUtleS1zbGFzaD4KK3VuZG89PENvbnRyb2wtS2V5LXo+CitmaW5kPTxDb250cm9sLUtleS11PjxDb250cm9sLUtleS11PjxDb250cm9sLUtleS1zPgorZmluZC1hZ2Fpbj08Q29udHJvbC1LZXktdT48Q29udHJvbC1LZXktcz4KK2ZpbmQtaW4tZmlsZXM9PEFsdC1LZXktcz4gPE1ldGEtS2V5LXM+CitmaW5kLXNlbGVjdGlvbj08Q29udHJvbC1LZXktcz4KK3JlcGxhY2U9PENvbnRyb2wtS2V5LXI+Citnb3RvLWxpbmU9PEFsdC1LZXktZz4gPE1ldGEtS2V5LWc+CitzbWFydC1iYWNrc3BhY2U9PEtleS1CYWNrU3BhY2U+CituZXdsaW5lLWFuZC1pbmRlbnQ9PEtleS1SZXR1cm4+IDxLZXktS1BfRW50ZXI+CitzbWFydC1pbmRlbnQ9PEtleS1UYWI+CitpbmRlbnQtcmVnaW9uPTxDb250cm9sLUtleS1icmFja2V0cmlnaHQ+CitkZWRlbnQtcmVnaW9uPTxDb250cm9sLUtleS1icmFja2V0bGVmdD4KK2NvbW1lbnQtcmVnaW9uPTxBbHQtS2V5LTM+Cit1bmNvbW1lbnQtcmVnaW9uPTxBbHQtS2V5LTQ+Cit0YWJpZnktcmVnaW9uPTxBbHQtS2V5LTU+Cit1bnRhYmlmeS1yZWdpb249PEFsdC1LZXktNj4KK3RvZ2dsZS10YWJzPTxBbHQtS2V5LXQ+CitjaGFuZ2UtaW5kZW50d2lkdGg9PEFsdC1LZXktdT4KK2RlbC13b3JkLWxlZnQ9PEFsdC1LZXktQmFja1NwYWNlPgorZGVsLXdvcmQtcmlnaHQ9PEFsdC1LZXktZD4KKworW0lETEUgQ2xhc3NpYyBNYWNdCitjb3B5PTxDb21tYW5kLUtleS1jPgorY3V0PTxDb21tYW5kLUtleS14PgorcGFzdGU9PENvbW1hbmQtS2V5LXY+CitiZWdpbm5pbmctb2YtbGluZT0gPEtleS1Ib21lPgorY2VudGVyLWluc2VydD08Q29udHJvbC1LZXktbD4KK2Nsb3NlLWFsbC13aW5kb3dzPTxDb21tYW5kLUtleS1xPgorY2xvc2Utd2luZG93PTxDb21tYW5kLUtleS13PgorZG8tbm90aGluZz08Q29udHJvbC1LZXktRjEyPgorZW5kLW9mLWZpbGU9PENvbnRyb2wtS2V5LWQ+CitweXRob24tZG9jcz08S2V5LUYxPgorcHl0aG9uLWNvbnRleHQtaGVscD08U2hpZnQtS2V5LUYxPgoraGlzdG9yeS1uZXh0PTxDb250cm9sLUtleS1uPgoraGlzdG9yeS1wcmV2aW91cz08Q29udHJvbC1LZXktcD4KK2ludGVycnVwdC1leGVjdXRpb249PENvbnRyb2wtS2V5LWM+Cit2aWV3LXJlc3RhcnQ9PEtleS1GNj4KK3Jlc3RhcnQtc2hlbGw9PENvbnRyb2wtS2V5LUY2Pgorb3Blbi1jbGFzcy1icm93c2VyPTxDb21tYW5kLUtleS1iPgorb3Blbi1tb2R1bGU9PENvbW1hbmQtS2V5LW0+CitvcGVuLW5ldy13aW5kb3c9PENvbW1hbmQtS2V5LW4+CitvcGVuLXdpbmRvdy1mcm9tLWZpbGU9PENvbW1hbmQtS2V5LW8+CitwbGFpbi1uZXdsaW5lLWFuZC1pbmRlbnQ9PENvbnRyb2wtS2V5LWo+CitwcmludC13aW5kb3c9PENvbW1hbmQtS2V5LXA+CityZWRvPTxTaGlmdC1Db21tYW5kLUtleS1aPgorcmVtb3ZlLXNlbGVjdGlvbj08S2V5LUVzY2FwZT4KK3NhdmUtd2luZG93LWFzLWZpbGU9PFNoaWZ0LUNvbW1hbmQtS2V5LVM+CitzYXZlLXdpbmRvdz08Q29tbWFuZC1LZXktcz4KK3NhdmUtY29weS1vZi13aW5kb3ctYXMtZmlsZT08T3B0aW9uLUNvbW1hbmQtS2V5LXM+CitzZWxlY3QtYWxsPTxDb21tYW5kLUtleS1hPgordG9nZ2xlLWF1dG8tY29sb3Jpbmc9PENvbnRyb2wtS2V5LXNsYXNoPgordW5kbz08Q29tbWFuZC1LZXktej4KK2ZpbmQ9PENvbW1hbmQtS2V5LWY+CitmaW5kLWFnYWluPTxDb21tYW5kLUtleS1nPiA8S2V5LUYzPgorZmluZC1pbi1maWxlcz08Q29tbWFuZC1LZXktRjM+CitmaW5kLXNlbGVjdGlvbj08U2hpZnQtQ29tbWFuZC1LZXktRjM+CityZXBsYWNlPTxDb21tYW5kLUtleS1yPgorZ290by1saW5lPTxDb21tYW5kLUtleS1qPgorc21hcnQtYmFja3NwYWNlPTxLZXktQmFja1NwYWNlPgorbmV3bGluZS1hbmQtaW5kZW50PTxLZXktUmV0dXJuPiA8S2V5LUtQX0VudGVyPgorc21hcnQtaW5kZW50PTxLZXktVGFiPgoraW5kZW50LXJlZ2lvbj08Q29tbWFuZC1LZXktYnJhY2tldHJpZ2h0PgorZGVkZW50LXJlZ2lvbj08Q29tbWFuZC1LZXktYnJhY2tldGxlZnQ+Citjb21tZW50LXJlZ2lvbj08Q29udHJvbC1LZXktMz4KK3VuY29tbWVudC1yZWdpb249PENvbnRyb2wtS2V5LTQ+Cit0YWJpZnktcmVnaW9uPTxDb250cm9sLUtleS01PgordW50YWJpZnktcmVnaW9uPTxDb250cm9sLUtleS02PgordG9nZ2xlLXRhYnM9PENvbnRyb2wtS2V5LXQ+CitjaGFuZ2UtaW5kZW50d2lkdGg9PENvbnRyb2wtS2V5LXU+CitkZWwtd29yZC1sZWZ0PTxDb250cm9sLUtleS1CYWNrU3BhY2U+CitkZWwtd29yZC1yaWdodD08Q29udHJvbC1LZXktRGVsZXRlPgorCitbSURMRSBDbGFzc2ljIE9TWF0KK3RvZ2dsZS10YWJzID0gPENvbnRyb2wtS2V5LXQ+CitpbnRlcnJ1cHQtZXhlY3V0aW9uID0gPENvbnRyb2wtS2V5LWM+Cit1bnRhYmlmeS1yZWdpb24gPSA8Q29udHJvbC1LZXktNj4KK3JlbW92ZS1zZWxlY3Rpb24gPSA8S2V5LUVzY2FwZT4KK3ByaW50LXdpbmRvdyA9IDxDb21tYW5kLUtleS1wPgorcmVwbGFjZSA9IDxDb21tYW5kLUtleS1yPgorZ290by1saW5lID0gPENvbW1hbmQtS2V5LWo+CitwbGFpbi1uZXdsaW5lLWFuZC1pbmRlbnQgPSA8Q29udHJvbC1LZXktaj4KK2hpc3RvcnktcHJldmlvdXMgPSA8Q29udHJvbC1LZXktcD4KK2JlZ2lubmluZy1vZi1saW5lID0gPENvbnRyb2wtS2V5LUxlZnQ+CitlbmQtb2YtbGluZSA9IDxDb250cm9sLUtleS1SaWdodD4KK2NvbW1lbnQtcmVnaW9uID0gPENvbnRyb2wtS2V5LTM+CityZWRvID0gPFNoaWZ0LUNvbW1hbmQtS2V5LVo+CitjbG9zZS13aW5kb3cgPSA8Q29tbWFuZC1LZXktdz4KK3Jlc3RhcnQtc2hlbGwgPSA8Q29udHJvbC1LZXktRjY+CitzYXZlLXdpbmRvdy1hcy1maWxlID0gPFNoaWZ0LUNvbW1hbmQtS2V5LVM+CitjbG9zZS1hbGwtd2luZG93cyA9IDxDb21tYW5kLUtleS1xPgordmlldy1yZXN0YXJ0ID0gPEtleS1GNj4KK3RhYmlmeS1yZWdpb24gPSA8Q29udHJvbC1LZXktNT4KK2ZpbmQtYWdhaW4gPSA8Q29tbWFuZC1LZXktZz4gPEtleS1GMz4KK2ZpbmQgPSA8Q29tbWFuZC1LZXktZj4KK3RvZ2dsZS1hdXRvLWNvbG9yaW5nID0gPENvbnRyb2wtS2V5LXNsYXNoPgorc2VsZWN0LWFsbCA9IDxDb21tYW5kLUtleS1hPgorc21hcnQtYmFja3NwYWNlID0gPEtleS1CYWNrU3BhY2U+CitjaGFuZ2UtaW5kZW50d2lkdGggPSA8Q29udHJvbC1LZXktdT4KK2RvLW5vdGhpbmcgPSA8Q29udHJvbC1LZXktRjEyPgorc21hcnQtaW5kZW50ID0gPEtleS1UYWI+CitjZW50ZXItaW5zZXJ0ID0gPENvbnRyb2wtS2V5LWw+CitoaXN0b3J5LW5leHQgPSA8Q29udHJvbC1LZXktbj4KK2RlbC13b3JkLXJpZ2h0ID0gPE9wdGlvbi1LZXktRGVsZXRlPgordW5kbyA9IDxDb21tYW5kLUtleS16Pgorc2F2ZS13aW5kb3cgPSA8Q29tbWFuZC1LZXktcz4KK3VuY29tbWVudC1yZWdpb24gPSA8Q29udHJvbC1LZXktND4KK2N1dCA9IDxDb21tYW5kLUtleS14PgorZmluZC1pbi1maWxlcyA9IDxDb21tYW5kLUtleS1GMz4KK2RlZGVudC1yZWdpb24gPSA8Q29tbWFuZC1LZXktYnJhY2tldGxlZnQ+Citjb3B5ID0gPENvbW1hbmQtS2V5LWM+CitwYXN0ZSA9IDxDb21tYW5kLUtleS12PgoraW5kZW50LXJlZ2lvbiA9IDxDb21tYW5kLUtleS1icmFja2V0cmlnaHQ+CitkZWwtd29yZC1sZWZ0ID0gPE9wdGlvbi1LZXktQmFja1NwYWNlPiA8T3B0aW9uLUNvbW1hbmQtS2V5LUJhY2tTcGFjZT4KK25ld2xpbmUtYW5kLWluZGVudCA9IDxLZXktUmV0dXJuPiA8S2V5LUtQX0VudGVyPgorZW5kLW9mLWZpbGUgPSA8Q29udHJvbC1LZXktZD4KK29wZW4tY2xhc3MtYnJvd3NlciA9IDxDb21tYW5kLUtleS1iPgorb3Blbi1uZXctd2luZG93ID0gPENvbW1hbmQtS2V5LW4+CitvcGVuLW1vZHVsZSA9IDxDb21tYW5kLUtleS1tPgorZmluZC1zZWxlY3Rpb24gPSA8U2hpZnQtQ29tbWFuZC1LZXktRjM+CitweXRob24tY29udGV4dC1oZWxwID0gPFNoaWZ0LUtleS1GMT4KK3NhdmUtY29weS1vZi13aW5kb3ctYXMtZmlsZSA9IDxPcHRpb24tQ29tbWFuZC1LZXktcz4KK29wZW4td2luZG93LWZyb20tZmlsZSA9IDxDb21tYW5kLUtleS1vPgorcHl0aG9uLWRvY3MgPSA8S2V5LUYxPgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnLW1haW4uZGVmIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZy1tYWluLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGRkMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZy1tYWluLmRlZgpAQCAtMCwwICsxLDc5IEBACisjIElETEUgcmVhZHMgc2V2ZXJhbCBjb25maWcgZmlsZXMgdG8gZGV0ZXJtaW5lIHVzZXIgcHJlZmVyZW5jZXMuICBUaGlzCisjIGZpbGUgaXMgdGhlIGRlZmF1bHQgY29uZmlnIGZpbGUgZm9yIGdlbmVyYWwgaWRsZSBzZXR0aW5ncy4KKyMKKyMgV2hlbiBJRExFIHN0YXJ0cywgaXQgd2lsbCBsb29rIGluCisjIHRoZSBmb2xsb3dpbmcgdHdvIHNldHMgb2YgZmlsZXMsIGluIG9yZGVyOgorIworIyAgICAgZGVmYXVsdCBjb25maWd1cmF0aW9uCisjICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgIGNvbmZpZy1tYWluLmRlZiAgICAgICAgIHRoZSBkZWZhdWx0IGdlbmVyYWwgY29uZmlnIGZpbGUKKyMgICAgIGNvbmZpZy1leHRlbnNpb25zLmRlZiAgIHRoZSBkZWZhdWx0IGV4dGVuc2lvbiBjb25maWcgZmlsZQorIyAgICAgY29uZmlnLWhpZ2hsaWdodC5kZWYgICAgdGhlIGRlZmF1bHQgaGlnaGxpZ2h0aW5nIGNvbmZpZyBmaWxlCisjICAgICBjb25maWcta2V5cy5kZWYgICAgICAgICB0aGUgZGVmYXVsdCBrZXliaW5kaW5nIGNvbmZpZyBmaWxlCisjCisjICAgICB1c2VyIGNvbmZpZ3VyYXRpb24KKyMgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgIH4vLmlkbGVyYy9jb25maWctbWFpbi5jZmcgICAgICAgICAgICB0aGUgdXNlciBnZW5lcmFsIGNvbmZpZyBmaWxlCisjICAgICB+Ly5pZGxlcmMvY29uZmlnLWV4dGVuc2lvbnMuY2ZnICAgICAgdGhlIHVzZXIgZXh0ZW5zaW9uIGNvbmZpZyBmaWxlCisjICAgICB+Ly5pZGxlcmMvY29uZmlnLWhpZ2hsaWdodC5jZmcgICAgICAgdGhlIHVzZXIgaGlnaGxpZ2h0aW5nIGNvbmZpZyBmaWxlCisjICAgICB+Ly5pZGxlcmMvY29uZmlnLWtleXMuY2ZnICAgICAgICAgICAgdGhlIHVzZXIga2V5YmluZGluZyBjb25maWcgZmlsZQorIworIyBPbiBXaW5kb3dzMjAwMCBhbmQgV2luZG93cyBYUCB0aGUgLmlkbGVyYyBkaXJlY3RvcnkgaXMgYXQKKyMgICAgIERvY3VtZW50cyBhbmQgU2V0dGluZ3NcPHVzZXJuYW1lPlwuaWRsZXJjCisjCisjIE9uIFdpbmRvd3M5OCBpdCBpcyBhdCBjOlwuaWRsZXJjCisjCisjIEFueSBvcHRpb25zIHRoZSB1c2VyIHNhdmVzIHRocm91Z2ggdGhlIGNvbmZpZyBkaWFsb2cgd2lsbCBiZSBzYXZlZCB0bworIyB0aGUgcmVsZXZhbnQgdXNlciBjb25maWcgZmlsZS4gUmV2ZXJ0aW5nIGFueSBnZW5lcmFsIHNldHRpbmcgdG8gdGhlCisjIGRlZmF1bHQgY2F1c2VzIHRoYXQgZW50cnkgdG8gYmUgd2lwZWQgZnJvbSB0aGUgdXNlciBmaWxlIGFuZCByZS1yZWFkCisjIGZyb20gdGhlIGRlZmF1bHQgZmlsZS4gVXNlciBoaWdobGlnaHRpbmcgdGhlbWVzIG9yIGtleWJpbmRpbmcgc2V0cyBhcmUKKyMgcmV0YWluZWQgdW5sZXNzIHNwZWNpZmljYWxseSBkZWxldGVkIHdpdGhpbiB0aGUgY29uZmlnIGRpYWxvZy4gQ2hvb3NpbmcKKyMgb25lIG9mIHRoZSBkZWZhdWx0IHRoZW1lcyBvciBrZXlzZXRzIGp1c3QgYXBwbGllcyB0aGUgcmVsZXZhbnQgc2V0dGluZ3MKKyMgZnJvbSB0aGUgZGVmYXVsdCBmaWxlLgorIworIyBBZGRpdGlvbmFsIGhlbHAgc291cmNlcyBhcmUgbGlzdGVkIGluIHRoZSBbSGVscEZpbGVzXSBzZWN0aW9uIGFuZCBtdXN0IGJlCisjIHZpZXdhYmxlIGJ5IGEgd2ViIGJyb3dzZXIgKG9yIHRoZSBXaW5kb3dzIEhlbHAgdmlld2VyIGluIHRoZSBjYXNlIG9mIC5jaG0KKyMgZmlsZXMpLiBUaGVzZSBzb3VyY2VzIHdpbGwgYmUgbGlzdGVkIG9uIHRoZSBIZWxwIG1lbnUuICBUaGUgcGF0dGVybiBpcworIyA8c2VxdWVuY2VfbnVtYmVyID0gbWVudSBpdGVtOy9wYXRoL3RvL2hlbHAvc291cmNlPgorIyBZb3UgY2FuJ3QgdXNlIGEgc2VtaS1jb2xvbiBpbiBhIG1lbnUgaXRlbSBvciBwYXRoLiAgVGhlIHBhdGggd2lsbCBiZSBwbGF0Zm9ybQorIyBzcGVjaWZpYyBiZWNhdXNlIG9mIHBhdGggc2VwYXJhdG9ycywgZHJpdmUgc3BlY3MgZXRjLgorIworIyBJdCBpcyBiZXN0IHRvIHVzZSB0aGUgQ29uZmlndXJhdGlvbiBHVUkgdG8gc2V0IHVwIGFkZGl0aW9uYWwgaGVscCBzb3VyY2VzIQorIyBFeGFtcGxlOgorIzEgPSBNeSBFeHRyYSBIZWxwIFNvdXJjZTsvdXNyL3NoYXJlL2RvYy9mb28vaW5kZXguaHRtbAorIzIgPSBBbm90aGVyIEhlbHAgU291cmNlOy9wYXRoL3RvL2Fub3RoZXIucGRmCisKK1tHZW5lcmFsXQorZWRpdG9yLW9uLXN0YXJ0dXA9IDAKK2F1dG9zYXZlPSAwCitwcmludC1jb21tYW5kLXBvc2l4PWxwciAlcworcHJpbnQtY29tbWFuZC13aW49c3RhcnQgL21pbiBub3RlcGFkIC9wICVzCitkZWxldGUtZXhpdGZ1bmM9IDEKKworW0VkaXRvcldpbmRvd10KK3dpZHRoPSA4MAoraGVpZ2h0PSA0MAorZm9udD0gY291cmllcgorZm9udC1zaXplPSAxMAorZm9udC1ib2xkPSAwCitlbmNvZGluZz0gbm9uZQorCitbRm9ybWF0UGFyYWdyYXBoXQorcGFyYWdyYXBoPTcwCisKK1tJbmRlbnRdCit1c2Utc3BhY2VzPSAxCitudW0tc3BhY2VzPSA0CisKK1tUaGVtZV0KK2RlZmF1bHQ9IDEKK25hbWU9IElETEUgQ2xhc3NpYworCitbS2V5c10KK2RlZmF1bHQ9IDEKK25hbWU9IElETEUgQ2xhc3NpYyBXaW5kb3dzCisKK1tIaXN0b3J5XQorY3ljbGljPTEKKworW0hlbHBGaWxlc10KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdEaWFsb2cucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnRGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MDdmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnRGlhbG9nLnB5CkBAIC0wLDAgKzEsMTE1OCBAQAorIiIiSURMRSBDb25maWd1cmF0aW9uIERpYWxvZzogc3VwcG9ydCB1c2VyIGN1c3RvbWl6YXRpb24gb2YgSURMRSBieSBHVUkKKworQ3VzdG9taXplIGZvbnQgZmFjZXMsIHNpemVzLCBhbmQgY29sb3JpemF0aW9uIGF0dHJpYnV0ZXMuICBTZXQgaW5kZW50YXRpb24KK2RlZmF1bHRzLiAgQ3VzdG9taXplIGtleWJpbmRpbmdzLiAgQ29sb3JpemF0aW9uIGFuZCBrZXliaW5kaW5ncyBjYW4gYmUKK3NhdmVkIGFzIHVzZXIgZGVmaW5lZCBzZXRzLiAgU2VsZWN0IHN0YXJ0dXAgb3B0aW9ucyBpbmNsdWRpbmcgc2hlbGwvZWRpdG9yCithbmQgZGVmYXVsdCB3aW5kb3cgc2l6ZS4gIERlZmluZSBhZGRpdGlvbmFsIGhlbHAgc291cmNlcy4KKworTm90ZSB0aGF0IHRhYiB3aWR0aCBpbiBJRExFIGlzIGN1cnJlbnRseSBmaXhlZCBhdCBlaWdodCBkdWUgdG8gVGsgaXNzdWVzLgorUmVmZXIgdG8gY29tbWVudHMgaW4gRWRpdG9yV2luZG93IGF1dG9pbmRlbnQgY29kZSBmb3IgZGV0YWlscy4KKworIiIiCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKK2ltcG9ydCB0a01lc3NhZ2VCb3gsIHRrQ29sb3JDaG9vc2VyLCB0a0ZvbnQKK2ltcG9ydCBzdHJpbmcKKworZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIuZHluT3B0aW9uTWVudVdpZGdldCBpbXBvcnQgRHluT3B0aW9uTWVudQorZnJvbSBpZGxlbGliLnRhYmJlZHBhZ2VzIGltcG9ydCBUYWJiZWRQYWdlU2V0Citmcm9tIGlkbGVsaWIua2V5YmluZGluZ0RpYWxvZyBpbXBvcnQgR2V0S2V5c0RpYWxvZworZnJvbSBpZGxlbGliLmNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nIGltcG9ydCBHZXRDZmdTZWN0aW9uTmFtZURpYWxvZworZnJvbSBpZGxlbGliLmNvbmZpZ0hlbHBTb3VyY2VFZGl0IGltcG9ydCBHZXRIZWxwU291cmNlRGlhbG9nCitmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKKworY2xhc3MgQ29uZmlnRGlhbG9nKFRvcGxldmVsKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLHBhcmVudCx0aXRsZSk6CisgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKKyAgICAgICAgc2VsZi53bV93aXRoZHJhdygpCisKKyAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKKyAgICAgICAgc2VsZi50aXRsZSgnSURMRSBQcmVmZXJlbmNlcycpCisgICAgICAgIHNlbGYuZ2VvbWV0cnkoIislZCslZCIgJSAocGFyZW50LndpbmZvX3Jvb3R4KCkrMjAsCisgICAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R5KCkrMzApKQorICAgICAgICAjVGhlbWUgRWxlbWVudHMuIEVhY2ggdGhlbWUgZWxlbWVudCBrZXkgaXMgaXRzIGRpc3BsYXkgbmFtZS4KKyAgICAgICAgI1RoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgdHVwbGUgaXMgdGhlIHNhbXBsZSBhcmVhIHRhZyBuYW1lLgorICAgICAgICAjVGhlIHNlY29uZCB2YWx1ZSBpcyB0aGUgZGlzcGxheSBuYW1lIGxpc3Qgc29ydCBpbmRleC4KKyAgICAgICAgc2VsZi50aGVtZUVsZW1lbnRzPXsnTm9ybWFsIFRleHQnOignbm9ybWFsJywnMDAnKSwKKyAgICAgICAgICAgICdQeXRob24gS2V5d29yZHMnOigna2V5d29yZCcsJzAxJyksCisgICAgICAgICAgICAnUHl0aG9uIERlZmluaXRpb25zJzooJ2RlZmluaXRpb24nLCcwMicpLAorICAgICAgICAgICAgJ1B5dGhvbiBCdWlsdGlucyc6KCdidWlsdGluJywgJzAzJyksCisgICAgICAgICAgICAnUHl0aG9uIENvbW1lbnRzJzooJ2NvbW1lbnQnLCcwNCcpLAorICAgICAgICAgICAgJ1B5dGhvbiBTdHJpbmdzJzooJ3N0cmluZycsJzA1JyksCisgICAgICAgICAgICAnU2VsZWN0ZWQgVGV4dCc6KCdoaWxpdGUnLCcwNicpLAorICAgICAgICAgICAgJ0ZvdW5kIFRleHQnOignaGl0JywnMDcnKSwKKyAgICAgICAgICAgICdDdXJzb3InOignY3Vyc29yJywnMDgnKSwKKyAgICAgICAgICAgICdFcnJvciBUZXh0JzooJ2Vycm9yJywnMDknKSwKKyAgICAgICAgICAgICdTaGVsbCBOb3JtYWwgVGV4dCc6KCdjb25zb2xlJywnMTAnKSwKKyAgICAgICAgICAgICdTaGVsbCBTdGRvdXQgVGV4dCc6KCdzdGRvdXQnLCcxMScpLAorICAgICAgICAgICAgJ1NoZWxsIFN0ZGVyciBUZXh0JzooJ3N0ZGVycicsJzEyJyksCisgICAgICAgICAgICB9CisgICAgICAgIHNlbGYuUmVzZXRDaGFuZ2VkSXRlbXMoKSAjbG9hZCBpbml0aWFsIHZhbHVlcyBpbiBjaGFuZ2VkIGl0ZW1zIGRpY3QKKyAgICAgICAgc2VsZi5DcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgc2VsZi5yZXNpemFibGUoaGVpZ2h0PUZBTFNFLHdpZHRoPUZBTFNFKQorICAgICAgICBzZWxmLnRyYW5zaWVudChwYXJlbnQpCisgICAgICAgIHNlbGYuZ3JhYl9zZXQoKQorICAgICAgICBzZWxmLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5DYW5jZWwpCisgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CisgICAgICAgIHNlbGYudGFiUGFnZXMuZm9jdXNfc2V0KCkKKyAgICAgICAgI2tleSBiaW5kaW5ncyBmb3IgdGhpcyBkaWFsb2cKKyAgICAgICAgI3NlbGYuYmluZCgnPEVzY2FwZT4nLHNlbGYuQ2FuY2VsKSAjZGlzbWlzcyBkaWFsb2csIG5vIHNhdmUKKyAgICAgICAgI3NlbGYuYmluZCgnPEFsdC1hPicsc2VsZi5BcHBseSkgI2FwcGx5IGNoYW5nZXMsIHNhdmUKKyAgICAgICAgI3NlbGYuYmluZCgnPEYxPicsc2VsZi5IZWxwKSAjY29udGV4dCBoZWxwCisgICAgICAgIHNlbGYuTG9hZENvbmZpZ3MoKQorICAgICAgICBzZWxmLkF0dGFjaFZhckNhbGxiYWNrcygpICNhdm9pZCBjYWxsYmFja3MgZHVyaW5nIExvYWRDb25maWdzCisKKyAgICAgICAgc2VsZi53bV9kZWljb25pZnkoKQorICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKKworICAgIGRlZiBDcmVhdGVXaWRnZXRzKHNlbGYpOgorICAgICAgICBzZWxmLnRhYlBhZ2VzID0gVGFiYmVkUGFnZVNldChzZWxmLAorICAgICAgICAgICAgICAgIHBhZ2VfbmFtZXM9WydGb250cy9UYWJzJywnSGlnaGxpZ2h0aW5nJywnS2V5cycsJ0dlbmVyYWwnXSkKKyAgICAgICAgZnJhbWVBY3Rpb25CdXR0b25zID0gRnJhbWUoc2VsZixwYWR5PTIpCisgICAgICAgICNhY3Rpb24gYnV0dG9ucworICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICAgICAgIyBDaGFuZ2luZyB0aGUgZGVmYXVsdCBwYWRkaW5nIG9uIE9TWCByZXN1bHRzIGluIHVucmVhZGFibGUKKyAgICAgICAgICAgICMgdGV4dCBpbiB0aGUgYnV0dG9ucworICAgICAgICAgICAgcGFkZGluZ0FyZ3M9e30KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhZGRpbmdBcmdzPXsncGFkeCc6NiwgJ3BhZHknOjN9CisKKyAgICAgICAgc2VsZi5idXR0b25IZWxwID0gQnV0dG9uKGZyYW1lQWN0aW9uQnV0dG9ucyx0ZXh0PSdIZWxwJywKKyAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuSGVscCx0YWtlZm9jdXM9RkFMU0UsCisgICAgICAgICAgICAgICAgKipwYWRkaW5nQXJncykKKyAgICAgICAgc2VsZi5idXR0b25PayA9IEJ1dHRvbihmcmFtZUFjdGlvbkJ1dHRvbnMsdGV4dD0nT2snLAorICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5Payx0YWtlZm9jdXM9RkFMU0UsCisgICAgICAgICAgICAgICAgKipwYWRkaW5nQXJncykKKyAgICAgICAgc2VsZi5idXR0b25BcHBseSA9IEJ1dHRvbihmcmFtZUFjdGlvbkJ1dHRvbnMsdGV4dD0nQXBwbHknLAorICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5BcHBseSx0YWtlZm9jdXM9RkFMU0UsCisgICAgICAgICAgICAgICAgKipwYWRkaW5nQXJncykKKyAgICAgICAgc2VsZi5idXR0b25DYW5jZWwgPSBCdXR0b24oZnJhbWVBY3Rpb25CdXR0b25zLHRleHQ9J0NhbmNlbCcsCisgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLkNhbmNlbCx0YWtlZm9jdXM9RkFMU0UsCisgICAgICAgICAgICAgICAgKipwYWRkaW5nQXJncykKKyAgICAgICAgc2VsZi5DcmVhdGVQYWdlRm9udFRhYigpCisgICAgICAgIHNlbGYuQ3JlYXRlUGFnZUhpZ2hsaWdodCgpCisgICAgICAgIHNlbGYuQ3JlYXRlUGFnZUtleXMoKQorICAgICAgICBzZWxmLkNyZWF0ZVBhZ2VHZW5lcmFsKCkKKyAgICAgICAgc2VsZi5idXR0b25IZWxwLnBhY2soc2lkZT1SSUdIVCxwYWR4PTUpCisgICAgICAgIHNlbGYuYnV0dG9uT2sucGFjayhzaWRlPUxFRlQscGFkeD01KQorICAgICAgICBzZWxmLmJ1dHRvbkFwcGx5LnBhY2soc2lkZT1MRUZULHBhZHg9NSkKKyAgICAgICAgc2VsZi5idXR0b25DYW5jZWwucGFjayhzaWRlPUxFRlQscGFkeD01KQorICAgICAgICBmcmFtZUFjdGlvbkJ1dHRvbnMucGFjayhzaWRlPUJPVFRPTSkKKyAgICAgICAgRnJhbWUoc2VsZiwgaGVpZ2h0PTIsIGJvcmRlcndpZHRoPTApLnBhY2soc2lkZT1CT1RUT00pCisgICAgICAgIHNlbGYudGFiUGFnZXMucGFjayhzaWRlPVRPUCxleHBhbmQ9VFJVRSxmaWxsPUJPVEgpCisKKyAgICBkZWYgQ3JlYXRlUGFnZUZvbnRUYWIoc2VsZik6CisgICAgICAgICN0a1ZhcnMKKyAgICAgICAgc2VsZi5mb250U2l6ZT1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5mb250Qm9sZD1Cb29sZWFuVmFyKHNlbGYpCisgICAgICAgIHNlbGYuZm9udE5hbWU9U3RyaW5nVmFyKHNlbGYpCisgICAgICAgIHNlbGYuc3BhY2VOdW09SW50VmFyKHNlbGYpCisgICAgICAgIHNlbGYuZWRpdEZvbnQ9dGtGb250LkZvbnQoc2VsZiwoJ2NvdXJpZXInLDEwLCdub3JtYWwnKSkKKyAgICAgICAgIyN3aWRnZXQgY3JlYXRpb24KKyAgICAgICAgI2JvZHkgZnJhbWUKKyAgICAgICAgZnJhbWU9c2VsZi50YWJQYWdlcy5wYWdlc1snRm9udHMvVGFicyddLmZyYW1lCisgICAgICAgICNib2R5IHNlY3Rpb24gZnJhbWVzCisgICAgICAgIGZyYW1lRm9udD1MYWJlbEZyYW1lKGZyYW1lLGJvcmRlcndpZHRoPTIscmVsaWVmPUdST09WRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nIEJhc2UgRWRpdG9yIEZvbnQgJykKKyAgICAgICAgZnJhbWVJbmRlbnQ9TGFiZWxGcmFtZShmcmFtZSxib3JkZXJ3aWR0aD0yLHJlbGllZj1HUk9PVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nIEluZGVudGF0aW9uIFdpZHRoICcpCisgICAgICAgICNmcmFtZUZvbnQKKyAgICAgICAgZnJhbWVGb250TmFtZT1GcmFtZShmcmFtZUZvbnQpCisgICAgICAgIGZyYW1lRm9udFBhcmFtPUZyYW1lKGZyYW1lRm9udCkKKyAgICAgICAgbGFiZWxGb250TmFtZVRpdGxlPUxhYmVsKGZyYW1lRm9udE5hbWUsanVzdGlmeT1MRUZULAorICAgICAgICAgICAgICAgIHRleHQ9J0ZvbnQgRmFjZSA6JykKKyAgICAgICAgc2VsZi5saXN0Rm9udE5hbWU9TGlzdGJveChmcmFtZUZvbnROYW1lLGhlaWdodD01LHRha2Vmb2N1cz1GQUxTRSwKKyAgICAgICAgICAgICAgICBleHBvcnRzZWxlY3Rpb249RkFMU0UpCisgICAgICAgIHNlbGYubGlzdEZvbnROYW1lLmJpbmQoJzxCdXR0b25SZWxlYXNlLTE+JyxzZWxmLk9uTGlzdEZvbnRCdXR0b25SZWxlYXNlKQorICAgICAgICBzY3JvbGxGb250PVNjcm9sbGJhcihmcmFtZUZvbnROYW1lKQorICAgICAgICBzY3JvbGxGb250LmNvbmZpZyhjb21tYW5kPXNlbGYubGlzdEZvbnROYW1lLnl2aWV3KQorICAgICAgICBzZWxmLmxpc3RGb250TmFtZS5jb25maWcoeXNjcm9sbGNvbW1hbmQ9c2Nyb2xsRm9udC5zZXQpCisgICAgICAgIGxhYmVsRm9udFNpemVUaXRsZT1MYWJlbChmcmFtZUZvbnRQYXJhbSx0ZXh0PSdTaXplIDonKQorICAgICAgICBzZWxmLm9wdE1lbnVGb250U2l6ZT1EeW5PcHRpb25NZW51KGZyYW1lRm9udFBhcmFtLHNlbGYuZm9udFNpemUsTm9uZSwKKyAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5TZXRGb250U2FtcGxlKQorICAgICAgICBjaGVja0ZvbnRCb2xkPUNoZWNrYnV0dG9uKGZyYW1lRm9udFBhcmFtLHZhcmlhYmxlPXNlbGYuZm9udEJvbGQsCisgICAgICAgICAgICBvbnZhbHVlPTEsb2ZmdmFsdWU9MCx0ZXh0PSdCb2xkJyxjb21tYW5kPXNlbGYuU2V0Rm9udFNhbXBsZSkKKyAgICAgICAgZnJhbWVGb250U2FtcGxlPUZyYW1lKGZyYW1lRm9udCxyZWxpZWY9U09MSUQsYm9yZGVyd2lkdGg9MSkKKyAgICAgICAgc2VsZi5sYWJlbEZvbnRTYW1wbGU9TGFiZWwoZnJhbWVGb250U2FtcGxlLAorICAgICAgICAgICAgICAgIHRleHQ9J0FhQmJDY0RkRWVcbkZmR2dIaElpSmpLXG4xMjM0NTY3ODkwXG4jOis9KCl7fVtdJywKKyAgICAgICAgICAgICAgICBqdXN0aWZ5PUxFRlQsZm9udD1zZWxmLmVkaXRGb250KQorICAgICAgICAjZnJhbWVJbmRlbnQKKyAgICAgICAgZnJhbWVJbmRlbnRTaXplPUZyYW1lKGZyYW1lSW5kZW50KQorICAgICAgICBsYWJlbFNwYWNlTnVtVGl0bGU9TGFiZWwoZnJhbWVJbmRlbnRTaXplLCBqdXN0aWZ5PUxFRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSdQeXRob24gU3RhbmRhcmQ6IDQgU3BhY2VzIScpCisgICAgICAgIHNlbGYuc2NhbGVTcGFjZU51bT1TY2FsZShmcmFtZUluZGVudFNpemUsIHZhcmlhYmxlPXNlbGYuc3BhY2VOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmllbnQ9J2hvcml6b250YWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlja2ludGVydmFsPTIsIGZyb21fPTIsIHRvPTE2KQorICAgICAgICAjd2lkZ2V0IHBhY2tpbmcKKyAgICAgICAgI2JvZHkKKyAgICAgICAgZnJhbWVGb250LnBhY2soc2lkZT1MRUZULHBhZHg9NSxwYWR5PTUsZXhwYW5kPVRSVUUsZmlsbD1CT1RIKQorICAgICAgICBmcmFtZUluZGVudC5wYWNrKHNpZGU9TEVGVCxwYWR4PTUscGFkeT01LGZpbGw9WSkKKyAgICAgICAgI2ZyYW1lRm9udAorICAgICAgICBmcmFtZUZvbnROYW1lLnBhY2soc2lkZT1UT1AscGFkeD01LHBhZHk9NSxmaWxsPVgpCisgICAgICAgIGZyYW1lRm9udFBhcmFtLnBhY2soc2lkZT1UT1AscGFkeD01LHBhZHk9NSxmaWxsPVgpCisgICAgICAgIGxhYmVsRm9udE5hbWVUaXRsZS5wYWNrKHNpZGU9VE9QLGFuY2hvcj1XKQorICAgICAgICBzZWxmLmxpc3RGb250TmFtZS5wYWNrKHNpZGU9TEVGVCxleHBhbmQ9VFJVRSxmaWxsPVgpCisgICAgICAgIHNjcm9sbEZvbnQucGFjayhzaWRlPUxFRlQsZmlsbD1ZKQorICAgICAgICBsYWJlbEZvbnRTaXplVGl0bGUucGFjayhzaWRlPUxFRlQsYW5jaG9yPVcpCisgICAgICAgIHNlbGYub3B0TWVudUZvbnRTaXplLnBhY2soc2lkZT1MRUZULGFuY2hvcj1XKQorICAgICAgICBjaGVja0ZvbnRCb2xkLnBhY2soc2lkZT1MRUZULGFuY2hvcj1XLHBhZHg9MjApCisgICAgICAgIGZyYW1lRm9udFNhbXBsZS5wYWNrKHNpZGU9VE9QLHBhZHg9NSxwYWR5PTUsZXhwYW5kPVRSVUUsZmlsbD1CT1RIKQorICAgICAgICBzZWxmLmxhYmVsRm9udFNhbXBsZS5wYWNrKGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKKyAgICAgICAgI2ZyYW1lSW5kZW50CisgICAgICAgIGZyYW1lSW5kZW50U2l6ZS5wYWNrKHNpZGU9VE9QLGZpbGw9WCkKKyAgICAgICAgbGFiZWxTcGFjZU51bVRpdGxlLnBhY2soc2lkZT1UT1AsYW5jaG9yPVcscGFkeD01KQorICAgICAgICBzZWxmLnNjYWxlU3BhY2VOdW0ucGFjayhzaWRlPVRPUCxwYWR4PTUsZmlsbD1YKQorICAgICAgICByZXR1cm4gZnJhbWUKKworICAgIGRlZiBDcmVhdGVQYWdlSGlnaGxpZ2h0KHNlbGYpOgorICAgICAgICBzZWxmLmJ1aWx0aW5UaGVtZT1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5jdXN0b21UaGVtZT1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5mZ0hpbGl0ZT1Cb29sZWFuVmFyKHNlbGYpCisgICAgICAgIHNlbGYuY29sb3VyPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmZvbnROYW1lPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLnRoZW1lSXNCdWlsdGluPUJvb2xlYW5WYXIoc2VsZikKKyAgICAgICAgc2VsZi5oaWdobGlnaHRUYXJnZXQ9U3RyaW5nVmFyKHNlbGYpCisgICAgICAgICMjd2lkZ2V0IGNyZWF0aW9uCisgICAgICAgICNib2R5IGZyYW1lCisgICAgICAgIGZyYW1lPXNlbGYudGFiUGFnZXMucGFnZXNbJ0hpZ2hsaWdodGluZyddLmZyYW1lCisgICAgICAgICNib2R5IHNlY3Rpb24gZnJhbWVzCisgICAgICAgIGZyYW1lQ3VzdG9tPUxhYmVsRnJhbWUoZnJhbWUsYm9yZGVyd2lkdGg9MixyZWxpZWY9R1JPT1ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9JyBDdXN0b20gSGlnaGxpZ2h0aW5nICcpCisgICAgICAgIGZyYW1lVGhlbWU9TGFiZWxGcmFtZShmcmFtZSxib3JkZXJ3aWR0aD0yLHJlbGllZj1HUk9PVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PScgSGlnaGxpZ2h0aW5nIFRoZW1lICcpCisgICAgICAgICNmcmFtZUN1c3RvbQorICAgICAgICBzZWxmLnRleHRIaWdobGlnaHRTYW1wbGU9VGV4dChmcmFtZUN1c3RvbSxyZWxpZWY9U09MSUQsYm9yZGVyd2lkdGg9MSwKKyAgICAgICAgICAgIGZvbnQ9KCdjb3VyaWVyJywxMiwnJyksY3Vyc29yPSdoYW5kMicsd2lkdGg9MjEsaGVpZ2h0PTExLAorICAgICAgICAgICAgdGFrZWZvY3VzPUZBTFNFLGhpZ2hsaWdodHRoaWNrbmVzcz0wLHdyYXA9Tk9ORSkKKyAgICAgICAgdGV4dD1zZWxmLnRleHRIaWdobGlnaHRTYW1wbGUKKyAgICAgICAgdGV4dC5iaW5kKCc8RG91YmxlLUJ1dHRvbi0xPicsbGFtYmRhIGU6ICdicmVhaycpCisgICAgICAgIHRleHQuYmluZCgnPEIxLU1vdGlvbj4nLGxhbWJkYSBlOiAnYnJlYWsnKQorICAgICAgICB0ZXh0QW5kVGFncz0oKCcjeW91IGNhbiBjbGljayBoZXJlJywnY29tbWVudCcpLCgnXG4nLCdub3JtYWwnKSwKKyAgICAgICAgICAgICgnI3RvIGNob29zZSBpdGVtcycsJ2NvbW1lbnQnKSwoJ1xuJywnbm9ybWFsJyksKCdkZWYnLCdrZXl3b3JkJyksCisgICAgICAgICAgICAoJyAnLCdub3JtYWwnKSwoJ2Z1bmMnLCdkZWZpbml0aW9uJyksKCcocGFyYW0pOicsJ25vcm1hbCcpLAorICAgICAgICAgICAgKCdcbiAgJywnbm9ybWFsJyksKCciIiJzdHJpbmciIiInLCdzdHJpbmcnKSwoJ1xuICB2YXIwID0gJywnbm9ybWFsJyksCisgICAgICAgICAgICAoIidzdHJpbmcnIiwnc3RyaW5nJyksKCdcbiAgdmFyMSA9ICcsJ25vcm1hbCcpLCgiJ3NlbGVjdGVkJyIsJ2hpbGl0ZScpLAorICAgICAgICAgICAgKCdcbiAgdmFyMiA9ICcsJ25vcm1hbCcpLCgiJ2ZvdW5kJyIsJ2hpdCcpLAorICAgICAgICAgICAgKCdcbiAgdmFyMyA9ICcsJ25vcm1hbCcpLCgnbGlzdCcsICdidWlsdGluJyksICgnKCcsJ25vcm1hbCcpLAorICAgICAgICAgICAgKCdOb25lJywgJ2J1aWx0aW4nKSwoJylcblxuJywnbm9ybWFsJyksCisgICAgICAgICAgICAoJyBlcnJvciAnLCdlcnJvcicpLCgnICcsJ25vcm1hbCcpLCgnY3Vyc29yIHwnLCdjdXJzb3InKSwKKyAgICAgICAgICAgICgnXG4gJywnbm9ybWFsJyksKCdzaGVsbCcsJ2NvbnNvbGUnKSwoJyAnLCdub3JtYWwnKSwoJ3N0ZG91dCcsJ3N0ZG91dCcpLAorICAgICAgICAgICAgKCcgJywnbm9ybWFsJyksKCdzdGRlcnInLCdzdGRlcnInKSwoJ1xuJywnbm9ybWFsJykpCisgICAgICAgIGZvciB0eFRhIGluIHRleHRBbmRUYWdzOgorICAgICAgICAgICAgdGV4dC5pbnNlcnQoRU5ELHR4VGFbMF0sdHhUYVsxXSkKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gc2VsZi50aGVtZUVsZW1lbnRzLmtleXMoKToKKyAgICAgICAgICAgIHRleHQudGFnX2JpbmQoc2VsZi50aGVtZUVsZW1lbnRzW2VsZW1lbnRdWzBdLCc8QnV0dG9uUHJlc3MtMT4nLAorICAgICAgICAgICAgICAgIGxhbWJkYSBldmVudCxlbGVtPWVsZW1lbnQ6IGV2ZW50LndpZGdldC53aW5mb190b3BsZXZlbCgpCisgICAgICAgICAgICAgICAgLmhpZ2hsaWdodFRhcmdldC5zZXQoZWxlbSkpCisgICAgICAgIHRleHQuY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICBzZWxmLmZyYW1lQ29sb3VyU2V0PUZyYW1lKGZyYW1lQ3VzdG9tLHJlbGllZj1TT0xJRCxib3JkZXJ3aWR0aD0xKQorICAgICAgICBmcmFtZUZnQmc9RnJhbWUoZnJhbWVDdXN0b20pCisgICAgICAgIGJ1dHRvblNldENvbG91cj1CdXR0b24oc2VsZi5mcmFtZUNvbG91clNldCx0ZXh0PSdDaG9vc2UgQ29sb3VyIGZvciA6JywKKyAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5HZXRDb2xvdXIsaGlnaGxpZ2h0dGhpY2tuZXNzPTApCisgICAgICAgIHNlbGYub3B0TWVudUhpZ2hsaWdodFRhcmdldD1EeW5PcHRpb25NZW51KHNlbGYuZnJhbWVDb2xvdXJTZXQsCisgICAgICAgICAgICBzZWxmLmhpZ2hsaWdodFRhcmdldCxOb25lLGhpZ2hsaWdodHRoaWNrbmVzcz0wKSMsY29tbWFuZD1zZWxmLlNldEhpZ2hsaWdodFRhcmdldEJpbmRpbmcKKyAgICAgICAgc2VsZi5yYWRpb0ZnPVJhZGlvYnV0dG9uKGZyYW1lRmdCZyx2YXJpYWJsZT1zZWxmLmZnSGlsaXRlLAorICAgICAgICAgICAgdmFsdWU9MSx0ZXh0PSdGb3JlZ3JvdW5kJyxjb21tYW5kPXNlbGYuU2V0Q29sb3VyU2FtcGxlQmluZGluZykKKyAgICAgICAgc2VsZi5yYWRpb0JnPVJhZGlvYnV0dG9uKGZyYW1lRmdCZyx2YXJpYWJsZT1zZWxmLmZnSGlsaXRlLAorICAgICAgICAgICAgdmFsdWU9MCx0ZXh0PSdCYWNrZ3JvdW5kJyxjb21tYW5kPXNlbGYuU2V0Q29sb3VyU2FtcGxlQmluZGluZykKKyAgICAgICAgc2VsZi5mZ0hpbGl0ZS5zZXQoMSkKKyAgICAgICAgYnV0dG9uU2F2ZUN1c3RvbVRoZW1lPUJ1dHRvbihmcmFtZUN1c3RvbSwKKyAgICAgICAgICAgIHRleHQ9J1NhdmUgYXMgTmV3IEN1c3RvbSBUaGVtZScsY29tbWFuZD1zZWxmLlNhdmVBc05ld1RoZW1lKQorICAgICAgICAjZnJhbWVUaGVtZQorICAgICAgICBsYWJlbFR5cGVUaXRsZT1MYWJlbChmcmFtZVRoZW1lLHRleHQ9J1NlbGVjdCA6ICcpCisgICAgICAgIHNlbGYucmFkaW9UaGVtZUJ1aWx0aW49UmFkaW9idXR0b24oZnJhbWVUaGVtZSx2YXJpYWJsZT1zZWxmLnRoZW1lSXNCdWlsdGluLAorICAgICAgICAgICAgdmFsdWU9MSxjb21tYW5kPXNlbGYuU2V0VGhlbWVUeXBlLHRleHQ9J2EgQnVpbHQtaW4gVGhlbWUnKQorICAgICAgICBzZWxmLnJhZGlvVGhlbWVDdXN0b209UmFkaW9idXR0b24oZnJhbWVUaGVtZSx2YXJpYWJsZT1zZWxmLnRoZW1lSXNCdWlsdGluLAorICAgICAgICAgICAgdmFsdWU9MCxjb21tYW5kPXNlbGYuU2V0VGhlbWVUeXBlLHRleHQ9J2EgQ3VzdG9tIFRoZW1lJykKKyAgICAgICAgc2VsZi5vcHRNZW51VGhlbWVCdWlsdGluPUR5bk9wdGlvbk1lbnUoZnJhbWVUaGVtZSwKKyAgICAgICAgICAgIHNlbGYuYnVpbHRpblRoZW1lLE5vbmUsY29tbWFuZD1Ob25lKQorICAgICAgICBzZWxmLm9wdE1lbnVUaGVtZUN1c3RvbT1EeW5PcHRpb25NZW51KGZyYW1lVGhlbWUsCisgICAgICAgICAgICBzZWxmLmN1c3RvbVRoZW1lLE5vbmUsY29tbWFuZD1Ob25lKQorICAgICAgICBzZWxmLmJ1dHRvbkRlbGV0ZUN1c3RvbVRoZW1lPUJ1dHRvbihmcmFtZVRoZW1lLHRleHQ9J0RlbGV0ZSBDdXN0b20gVGhlbWUnLAorICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5EZWxldGVDdXN0b21UaGVtZSkKKyAgICAgICAgIyN3aWRnZXQgcGFja2luZworICAgICAgICAjYm9keQorICAgICAgICBmcmFtZUN1c3RvbS5wYWNrKHNpZGU9TEVGVCxwYWR4PTUscGFkeT01LGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKKyAgICAgICAgZnJhbWVUaGVtZS5wYWNrKHNpZGU9TEVGVCxwYWR4PTUscGFkeT01LGZpbGw9WSkKKyAgICAgICAgI2ZyYW1lQ3VzdG9tCisgICAgICAgIHNlbGYuZnJhbWVDb2xvdXJTZXQucGFjayhzaWRlPVRPUCxwYWR4PTUscGFkeT01LGV4cGFuZD1UUlVFLGZpbGw9WCkKKyAgICAgICAgZnJhbWVGZ0JnLnBhY2soc2lkZT1UT1AscGFkeD01LHBhZHk9MCkKKyAgICAgICAgc2VsZi50ZXh0SGlnaGxpZ2h0U2FtcGxlLnBhY2soc2lkZT1UT1AscGFkeD01LHBhZHk9NSxleHBhbmQ9VFJVRSwKKyAgICAgICAgICAgIGZpbGw9Qk9USCkKKyAgICAgICAgYnV0dG9uU2V0Q29sb3VyLnBhY2soc2lkZT1UT1AsZXhwYW5kPVRSVUUsZmlsbD1YLHBhZHg9OCxwYWR5PTQpCisgICAgICAgIHNlbGYub3B0TWVudUhpZ2hsaWdodFRhcmdldC5wYWNrKHNpZGU9VE9QLGV4cGFuZD1UUlVFLGZpbGw9WCxwYWR4PTgscGFkeT0zKQorICAgICAgICBzZWxmLnJhZGlvRmcucGFjayhzaWRlPUxFRlQsYW5jaG9yPUUpCisgICAgICAgIHNlbGYucmFkaW9CZy5wYWNrKHNpZGU9UklHSFQsYW5jaG9yPVcpCisgICAgICAgIGJ1dHRvblNhdmVDdXN0b21UaGVtZS5wYWNrKHNpZGU9Qk9UVE9NLGZpbGw9WCxwYWR4PTUscGFkeT01KQorICAgICAgICAjZnJhbWVUaGVtZQorICAgICAgICBsYWJlbFR5cGVUaXRsZS5wYWNrKHNpZGU9VE9QLGFuY2hvcj1XLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIHNlbGYucmFkaW9UaGVtZUJ1aWx0aW4ucGFjayhzaWRlPVRPUCxhbmNob3I9VyxwYWR4PTUpCisgICAgICAgIHNlbGYucmFkaW9UaGVtZUN1c3RvbS5wYWNrKHNpZGU9VE9QLGFuY2hvcj1XLHBhZHg9NSxwYWR5PTIpCisgICAgICAgIHNlbGYub3B0TWVudVRoZW1lQnVpbHRpbi5wYWNrKHNpZGU9VE9QLGZpbGw9WCxwYWR4PTUscGFkeT01KQorICAgICAgICBzZWxmLm9wdE1lbnVUaGVtZUN1c3RvbS5wYWNrKHNpZGU9VE9QLGZpbGw9WCxhbmNob3I9VyxwYWR4PTUscGFkeT01KQorICAgICAgICBzZWxmLmJ1dHRvbkRlbGV0ZUN1c3RvbVRoZW1lLnBhY2soc2lkZT1UT1AsZmlsbD1YLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIHJldHVybiBmcmFtZQorCisgICAgZGVmIENyZWF0ZVBhZ2VLZXlzKHNlbGYpOgorICAgICAgICAjdGtWYXJzCisgICAgICAgIHNlbGYuYmluZGluZ1RhcmdldD1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5idWlsdGluS2V5cz1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5jdXN0b21LZXlzPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluPUJvb2xlYW5WYXIoc2VsZikKKyAgICAgICAgc2VsZi5rZXlCaW5kaW5nPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICAjI3dpZGdldCBjcmVhdGlvbgorICAgICAgICAjYm9keSBmcmFtZQorICAgICAgICBmcmFtZT1zZWxmLnRhYlBhZ2VzLnBhZ2VzWydLZXlzJ10uZnJhbWUKKyAgICAgICAgI2JvZHkgc2VjdGlvbiBmcmFtZXMKKyAgICAgICAgZnJhbWVDdXN0b209TGFiZWxGcmFtZShmcmFtZSxib3JkZXJ3aWR0aD0yLHJlbGllZj1HUk9PVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nIEN1c3RvbSBLZXkgQmluZGluZ3MgJykKKyAgICAgICAgZnJhbWVLZXlTZXRzPUxhYmVsRnJhbWUoZnJhbWUsYm9yZGVyd2lkdGg9MixyZWxpZWY9R1JPT1ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nIEtleSBTZXQgJykKKyAgICAgICAgI2ZyYW1lQ3VzdG9tCisgICAgICAgIGZyYW1lVGFyZ2V0PUZyYW1lKGZyYW1lQ3VzdG9tKQorICAgICAgICBsYWJlbFRhcmdldFRpdGxlPUxhYmVsKGZyYW1lVGFyZ2V0LHRleHQ9J0FjdGlvbiAtIEtleShzKScpCisgICAgICAgIHNjcm9sbFRhcmdldFk9U2Nyb2xsYmFyKGZyYW1lVGFyZ2V0KQorICAgICAgICBzY3JvbGxUYXJnZXRYPVNjcm9sbGJhcihmcmFtZVRhcmdldCxvcmllbnQ9SE9SSVpPTlRBTCkKKyAgICAgICAgc2VsZi5saXN0QmluZGluZ3M9TGlzdGJveChmcmFtZVRhcmdldCx0YWtlZm9jdXM9RkFMU0UsCisgICAgICAgICAgICAgICAgZXhwb3J0c2VsZWN0aW9uPUZBTFNFKQorICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5iaW5kKCc8QnV0dG9uUmVsZWFzZS0xPicsc2VsZi5LZXlCaW5kaW5nU2VsZWN0ZWQpCisgICAgICAgIHNjcm9sbFRhcmdldFkuY29uZmlnKGNvbW1hbmQ9c2VsZi5saXN0QmluZGluZ3MueXZpZXcpCisgICAgICAgIHNjcm9sbFRhcmdldFguY29uZmlnKGNvbW1hbmQ9c2VsZi5saXN0QmluZGluZ3MueHZpZXcpCisgICAgICAgIHNlbGYubGlzdEJpbmRpbmdzLmNvbmZpZyh5c2Nyb2xsY29tbWFuZD1zY3JvbGxUYXJnZXRZLnNldCkKKyAgICAgICAgc2VsZi5saXN0QmluZGluZ3MuY29uZmlnKHhzY3JvbGxjb21tYW5kPXNjcm9sbFRhcmdldFguc2V0KQorICAgICAgICBzZWxmLmJ1dHRvbk5ld0tleXM9QnV0dG9uKGZyYW1lQ3VzdG9tLHRleHQ9J0dldCBOZXcgS2V5cyBmb3IgU2VsZWN0aW9uJywKKyAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5HZXROZXdLZXlzLHN0YXRlPURJU0FCTEVEKQorICAgICAgICAjZnJhbWVLZXlTZXRzCisgICAgICAgIGZyYW1lcyA9IFtGcmFtZShmcmFtZUtleVNldHMsIHBhZHg9MiwgcGFkeT0yLCBib3JkZXJ3aWR0aD0wKQorICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMildCisgICAgICAgIHNlbGYucmFkaW9LZXlzQnVpbHRpbj1SYWRpb2J1dHRvbihmcmFtZXNbMF0sdmFyaWFibGU9c2VsZi5rZXlzQXJlQnVpbHRpbiwKKyAgICAgICAgICAgIHZhbHVlPTEsY29tbWFuZD1zZWxmLlNldEtleXNUeXBlLHRleHQ9J1VzZSBhIEJ1aWx0LWluIEtleSBTZXQnKQorICAgICAgICBzZWxmLnJhZGlvS2V5c0N1c3RvbT1SYWRpb2J1dHRvbihmcmFtZXNbMF0sdmFyaWFibGU9c2VsZi5rZXlzQXJlQnVpbHRpbiwKKyAgICAgICAgICAgIHZhbHVlPTAsY29tbWFuZD1zZWxmLlNldEtleXNUeXBlLHRleHQ9J1VzZSBhIEN1c3RvbSBLZXkgU2V0JykKKyAgICAgICAgc2VsZi5vcHRNZW51S2V5c0J1aWx0aW49RHluT3B0aW9uTWVudShmcmFtZXNbMF0sCisgICAgICAgICAgICBzZWxmLmJ1aWx0aW5LZXlzLE5vbmUsY29tbWFuZD1Ob25lKQorICAgICAgICBzZWxmLm9wdE1lbnVLZXlzQ3VzdG9tPUR5bk9wdGlvbk1lbnUoZnJhbWVzWzBdLAorICAgICAgICAgICAgc2VsZi5jdXN0b21LZXlzLE5vbmUsY29tbWFuZD1Ob25lKQorICAgICAgICBzZWxmLmJ1dHRvbkRlbGV0ZUN1c3RvbUtleXM9QnV0dG9uKGZyYW1lc1sxXSx0ZXh0PSdEZWxldGUgQ3VzdG9tIEtleSBTZXQnLAorICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5EZWxldGVDdXN0b21LZXlzKQorICAgICAgICBidXR0b25TYXZlQ3VzdG9tS2V5cz1CdXR0b24oZnJhbWVzWzFdLAorICAgICAgICAgICAgICAgIHRleHQ9J1NhdmUgYXMgTmV3IEN1c3RvbSBLZXkgU2V0Jyxjb21tYW5kPXNlbGYuU2F2ZUFzTmV3S2V5U2V0KQorICAgICAgICAjI3dpZGdldCBwYWNraW5nCisgICAgICAgICNib2R5CisgICAgICAgIGZyYW1lQ3VzdG9tLnBhY2soc2lkZT1CT1RUT00scGFkeD01LHBhZHk9NSxleHBhbmQ9VFJVRSxmaWxsPUJPVEgpCisgICAgICAgIGZyYW1lS2V5U2V0cy5wYWNrKHNpZGU9Qk9UVE9NLHBhZHg9NSxwYWR5PTUsZmlsbD1CT1RIKQorICAgICAgICAjZnJhbWVDdXN0b20KKyAgICAgICAgc2VsZi5idXR0b25OZXdLZXlzLnBhY2soc2lkZT1CT1RUT00sZmlsbD1YLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIGZyYW1lVGFyZ2V0LnBhY2soc2lkZT1MRUZULHBhZHg9NSxwYWR5PTUsZXhwYW5kPVRSVUUsZmlsbD1CT1RIKQorICAgICAgICAjZnJhbWUgdGFyZ2V0CisgICAgICAgIGZyYW1lVGFyZ2V0LmNvbHVtbmNvbmZpZ3VyZSgwLHdlaWdodD0xKQorICAgICAgICBmcmFtZVRhcmdldC5yb3djb25maWd1cmUoMSx3ZWlnaHQ9MSkKKyAgICAgICAgbGFiZWxUYXJnZXRUaXRsZS5ncmlkKHJvdz0wLGNvbHVtbj0wLGNvbHVtbnNwYW49MixzdGlja3k9VykKKyAgICAgICAgc2VsZi5saXN0QmluZGluZ3MuZ3JpZChyb3c9MSxjb2x1bW49MCxzdGlja3k9TlNFVykKKyAgICAgICAgc2Nyb2xsVGFyZ2V0WS5ncmlkKHJvdz0xLGNvbHVtbj0xLHN0aWNreT1OUykKKyAgICAgICAgc2Nyb2xsVGFyZ2V0WC5ncmlkKHJvdz0yLGNvbHVtbj0wLHN0aWNreT1FVykKKyAgICAgICAgI2ZyYW1lS2V5U2V0cworICAgICAgICBzZWxmLnJhZGlvS2V5c0J1aWx0aW4uZ3JpZChyb3c9MCwgY29sdW1uPTAsIHN0aWNreT1XK05TKQorICAgICAgICBzZWxmLnJhZGlvS2V5c0N1c3RvbS5ncmlkKHJvdz0xLCBjb2x1bW49MCwgc3RpY2t5PVcrTlMpCisgICAgICAgIHNlbGYub3B0TWVudUtleXNCdWlsdGluLmdyaWQocm93PTAsIGNvbHVtbj0xLCBzdGlja3k9TlNFVykKKyAgICAgICAgc2VsZi5vcHRNZW51S2V5c0N1c3RvbS5ncmlkKHJvdz0xLCBjb2x1bW49MSwgc3RpY2t5PU5TRVcpCisgICAgICAgIHNlbGYuYnV0dG9uRGVsZXRlQ3VzdG9tS2V5cy5wYWNrKHNpZGU9TEVGVCxmaWxsPVgsZXhwYW5kPVRydWUscGFkeD0yKQorICAgICAgICBidXR0b25TYXZlQ3VzdG9tS2V5cy5wYWNrKHNpZGU9TEVGVCxmaWxsPVgsZXhwYW5kPVRydWUscGFkeD0yKQorICAgICAgICBmcmFtZXNbMF0ucGFjayhzaWRlPVRPUCwgZmlsbD1CT1RILCBleHBhbmQ9VHJ1ZSkKKyAgICAgICAgZnJhbWVzWzFdLnBhY2soc2lkZT1UT1AsIGZpbGw9WCwgZXhwYW5kPVRydWUsIHBhZHk9MikKKyAgICAgICAgcmV0dXJuIGZyYW1lCisKKyAgICBkZWYgQ3JlYXRlUGFnZUdlbmVyYWwoc2VsZik6CisgICAgICAgICN0a1ZhcnMKKyAgICAgICAgc2VsZi53aW5XaWR0aD1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi53aW5IZWlnaHQ9U3RyaW5nVmFyKHNlbGYpCisgICAgICAgIHNlbGYucGFyYVdpZHRoPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLnN0YXJ0dXBFZGl0PUludFZhcihzZWxmKQorICAgICAgICBzZWxmLmF1dG9TYXZlPUludFZhcihzZWxmKQorICAgICAgICBzZWxmLmVuY29kaW5nPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLnVzZXJIZWxwQnJvd3Nlcj1Cb29sZWFuVmFyKHNlbGYpCisgICAgICAgIHNlbGYuaGVscEJyb3dzZXI9U3RyaW5nVmFyKHNlbGYpCisgICAgICAgICN3aWRnZXQgY3JlYXRpb24KKyAgICAgICAgI2JvZHkKKyAgICAgICAgZnJhbWU9c2VsZi50YWJQYWdlcy5wYWdlc1snR2VuZXJhbCddLmZyYW1lCisgICAgICAgICNib2R5IHNlY3Rpb24gZnJhbWVzCisgICAgICAgIGZyYW1lUnVuPUxhYmVsRnJhbWUoZnJhbWUsYm9yZGVyd2lkdGg9MixyZWxpZWY9R1JPT1ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9JyBTdGFydHVwIFByZWZlcmVuY2VzICcpCisgICAgICAgIGZyYW1lU2F2ZT1MYWJlbEZyYW1lKGZyYW1lLGJvcmRlcndpZHRoPTIscmVsaWVmPUdST09WRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nIEF1dG9zYXZlIFByZWZlcmVuY2VzICcpCisgICAgICAgIGZyYW1lV2luU2l6ZT1GcmFtZShmcmFtZSxib3JkZXJ3aWR0aD0yLHJlbGllZj1HUk9PVkUpCisgICAgICAgIGZyYW1lUGFyYVNpemU9RnJhbWUoZnJhbWUsYm9yZGVyd2lkdGg9MixyZWxpZWY9R1JPT1ZFKQorICAgICAgICBmcmFtZUVuY29kaW5nPUZyYW1lKGZyYW1lLGJvcmRlcndpZHRoPTIscmVsaWVmPUdST09WRSkKKyAgICAgICAgZnJhbWVIZWxwPUxhYmVsRnJhbWUoZnJhbWUsYm9yZGVyd2lkdGg9MixyZWxpZWY9R1JPT1ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PScgQWRkaXRpb25hbCBIZWxwIFNvdXJjZXMgJykKKyAgICAgICAgI2ZyYW1lUnVuCisgICAgICAgIGxhYmVsUnVuQ2hvaWNlVGl0bGU9TGFiZWwoZnJhbWVSdW4sdGV4dD0nQXQgU3RhcnR1cCcpCisgICAgICAgIHJhZGlvU3RhcnR1cEVkaXQ9UmFkaW9idXR0b24oZnJhbWVSdW4sdmFyaWFibGU9c2VsZi5zdGFydHVwRWRpdCwKKyAgICAgICAgICAgIHZhbHVlPTEsY29tbWFuZD1zZWxmLlNldEtleXNUeXBlLHRleHQ9Ik9wZW4gRWRpdCBXaW5kb3ciKQorICAgICAgICByYWRpb1N0YXJ0dXBTaGVsbD1SYWRpb2J1dHRvbihmcmFtZVJ1bix2YXJpYWJsZT1zZWxmLnN0YXJ0dXBFZGl0LAorICAgICAgICAgICAgdmFsdWU9MCxjb21tYW5kPXNlbGYuU2V0S2V5c1R5cGUsdGV4dD0nT3BlbiBTaGVsbCBXaW5kb3cnKQorICAgICAgICAjZnJhbWVTYXZlCisgICAgICAgIGxhYmVsUnVuU2F2ZVRpdGxlPUxhYmVsKGZyYW1lU2F2ZSx0ZXh0PSdBdCBTdGFydCBvZiBSdW4gKEY1KSAgJykKKyAgICAgICAgcmFkaW9TYXZlQXNrPVJhZGlvYnV0dG9uKGZyYW1lU2F2ZSx2YXJpYWJsZT1zZWxmLmF1dG9TYXZlLAorICAgICAgICAgICAgdmFsdWU9MCxjb21tYW5kPXNlbGYuU2V0S2V5c1R5cGUsdGV4dD0iUHJvbXB0IHRvIFNhdmUiKQorICAgICAgICByYWRpb1NhdmVBdXRvPVJhZGlvYnV0dG9uKGZyYW1lU2F2ZSx2YXJpYWJsZT1zZWxmLmF1dG9TYXZlLAorICAgICAgICAgICAgdmFsdWU9MSxjb21tYW5kPXNlbGYuU2V0S2V5c1R5cGUsdGV4dD0nTm8gUHJvbXB0JykKKyAgICAgICAgI2ZyYW1lV2luU2l6ZQorICAgICAgICBsYWJlbFdpblNpemVUaXRsZT1MYWJlbChmcmFtZVdpblNpemUsdGV4dD0nSW5pdGlhbCBXaW5kb3cgU2l6ZScrCisgICAgICAgICAgICAgICAgJyAgKGluIGNoYXJhY3RlcnMpJykKKyAgICAgICAgbGFiZWxXaW5XaWR0aFRpdGxlPUxhYmVsKGZyYW1lV2luU2l6ZSx0ZXh0PSdXaWR0aCcpCisgICAgICAgIGVudHJ5V2luV2lkdGg9RW50cnkoZnJhbWVXaW5TaXplLHRleHR2YXJpYWJsZT1zZWxmLndpbldpZHRoLAorICAgICAgICAgICAgICAgIHdpZHRoPTMpCisgICAgICAgIGxhYmVsV2luSGVpZ2h0VGl0bGU9TGFiZWwoZnJhbWVXaW5TaXplLHRleHQ9J0hlaWdodCcpCisgICAgICAgIGVudHJ5V2luSGVpZ2h0PUVudHJ5KGZyYW1lV2luU2l6ZSx0ZXh0dmFyaWFibGU9c2VsZi53aW5IZWlnaHQsCisgICAgICAgICAgICAgICAgd2lkdGg9MykKKyAgICAgICAgI3BhcmFncmFwaEZvcm1hdFdpZHRoCisgICAgICAgIGxhYmVsUGFyYVdpZHRoVGl0bGU9TGFiZWwoZnJhbWVQYXJhU2l6ZSx0ZXh0PSdQYXJhZ3JhcGggcmVmb3JtYXQnKworICAgICAgICAgICAgICAgICcgd2lkdGggKGluIGNoYXJhY3RlcnMpJykKKyAgICAgICAgZW50cnlQYXJhV2lkdGg9RW50cnkoZnJhbWVQYXJhU2l6ZSx0ZXh0dmFyaWFibGU9c2VsZi5wYXJhV2lkdGgsCisgICAgICAgICAgICAgICAgd2lkdGg9MykKKyAgICAgICAgI2ZyYW1lRW5jb2RpbmcKKyAgICAgICAgbGFiZWxFbmNvZGluZ1RpdGxlPUxhYmVsKGZyYW1lRW5jb2RpbmcsdGV4dD0iRGVmYXVsdCBTb3VyY2UgRW5jb2RpbmciKQorICAgICAgICByYWRpb0VuY0xvY2FsZT1SYWRpb2J1dHRvbihmcmFtZUVuY29kaW5nLHZhcmlhYmxlPXNlbGYuZW5jb2RpbmcsCisgICAgICAgICAgICB2YWx1ZT0ibG9jYWxlIix0ZXh0PSJMb2NhbGUtZGVmaW5lZCIpCisgICAgICAgIHJhZGlvRW5jVVRGOD1SYWRpb2J1dHRvbihmcmFtZUVuY29kaW5nLHZhcmlhYmxlPXNlbGYuZW5jb2RpbmcsCisgICAgICAgICAgICB2YWx1ZT0idXRmLTgiLHRleHQ9IlVURi04IikKKyAgICAgICAgcmFkaW9FbmNOb25lPVJhZGlvYnV0dG9uKGZyYW1lRW5jb2RpbmcsdmFyaWFibGU9c2VsZi5lbmNvZGluZywKKyAgICAgICAgICAgIHZhbHVlPSJub25lIix0ZXh0PSJOb25lIikKKyAgICAgICAgI2ZyYW1lSGVscAorICAgICAgICBmcmFtZUhlbHBMaXN0PUZyYW1lKGZyYW1lSGVscCkKKyAgICAgICAgZnJhbWVIZWxwTGlzdEJ1dHRvbnM9RnJhbWUoZnJhbWVIZWxwTGlzdCkKKyAgICAgICAgc2Nyb2xsSGVscExpc3Q9U2Nyb2xsYmFyKGZyYW1lSGVscExpc3QpCisgICAgICAgIHNlbGYubGlzdEhlbHA9TGlzdGJveChmcmFtZUhlbHBMaXN0LGhlaWdodD01LHRha2Vmb2N1cz1GQUxTRSwKKyAgICAgICAgICAgICAgICBleHBvcnRzZWxlY3Rpb249RkFMU0UpCisgICAgICAgIHNjcm9sbEhlbHBMaXN0LmNvbmZpZyhjb21tYW5kPXNlbGYubGlzdEhlbHAueXZpZXcpCisgICAgICAgIHNlbGYubGlzdEhlbHAuY29uZmlnKHlzY3JvbGxjb21tYW5kPXNjcm9sbEhlbHBMaXN0LnNldCkKKyAgICAgICAgc2VsZi5saXN0SGVscC5iaW5kKCc8QnV0dG9uUmVsZWFzZS0xPicsc2VsZi5IZWxwU291cmNlU2VsZWN0ZWQpCisgICAgICAgIHNlbGYuYnV0dG9uSGVscExpc3RFZGl0PUJ1dHRvbihmcmFtZUhlbHBMaXN0QnV0dG9ucyx0ZXh0PSdFZGl0JywKKyAgICAgICAgICAgICAgICBzdGF0ZT1ESVNBQkxFRCx3aWR0aD04LGNvbW1hbmQ9c2VsZi5IZWxwTGlzdEl0ZW1FZGl0KQorICAgICAgICBzZWxmLmJ1dHRvbkhlbHBMaXN0QWRkPUJ1dHRvbihmcmFtZUhlbHBMaXN0QnV0dG9ucyx0ZXh0PSdBZGQnLAorICAgICAgICAgICAgICAgIHdpZHRoPTgsY29tbWFuZD1zZWxmLkhlbHBMaXN0SXRlbUFkZCkKKyAgICAgICAgc2VsZi5idXR0b25IZWxwTGlzdFJlbW92ZT1CdXR0b24oZnJhbWVIZWxwTGlzdEJ1dHRvbnMsdGV4dD0nUmVtb3ZlJywKKyAgICAgICAgICAgICAgICBzdGF0ZT1ESVNBQkxFRCx3aWR0aD04LGNvbW1hbmQ9c2VsZi5IZWxwTGlzdEl0ZW1SZW1vdmUpCisgICAgICAgICN3aWRnZXQgcGFja2luZworICAgICAgICAjYm9keQorICAgICAgICBmcmFtZVJ1bi5wYWNrKHNpZGU9VE9QLHBhZHg9NSxwYWR5PTUsZmlsbD1YKQorICAgICAgICBmcmFtZVNhdmUucGFjayhzaWRlPVRPUCxwYWR4PTUscGFkeT01LGZpbGw9WCkKKyAgICAgICAgZnJhbWVXaW5TaXplLnBhY2soc2lkZT1UT1AscGFkeD01LHBhZHk9NSxmaWxsPVgpCisgICAgICAgIGZyYW1lUGFyYVNpemUucGFjayhzaWRlPVRPUCxwYWR4PTUscGFkeT01LGZpbGw9WCkKKyAgICAgICAgZnJhbWVFbmNvZGluZy5wYWNrKHNpZGU9VE9QLHBhZHg9NSxwYWR5PTUsZmlsbD1YKQorICAgICAgICBmcmFtZUhlbHAucGFjayhzaWRlPVRPUCxwYWR4PTUscGFkeT01LGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKKyAgICAgICAgI2ZyYW1lUnVuCisgICAgICAgIGxhYmVsUnVuQ2hvaWNlVGl0bGUucGFjayhzaWRlPUxFRlQsYW5jaG9yPVcscGFkeD01LHBhZHk9NSkKKyAgICAgICAgcmFkaW9TdGFydHVwU2hlbGwucGFjayhzaWRlPVJJR0hULGFuY2hvcj1XLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIHJhZGlvU3RhcnR1cEVkaXQucGFjayhzaWRlPVJJR0hULGFuY2hvcj1XLHBhZHg9NSxwYWR5PTUpCisgICAgICAgICNmcmFtZVNhdmUKKyAgICAgICAgbGFiZWxSdW5TYXZlVGl0bGUucGFjayhzaWRlPUxFRlQsYW5jaG9yPVcscGFkeD01LHBhZHk9NSkKKyAgICAgICAgcmFkaW9TYXZlQXV0by5wYWNrKHNpZGU9UklHSFQsYW5jaG9yPVcscGFkeD01LHBhZHk9NSkKKyAgICAgICAgcmFkaW9TYXZlQXNrLnBhY2soc2lkZT1SSUdIVCxhbmNob3I9VyxwYWR4PTUscGFkeT01KQorICAgICAgICAjZnJhbWVXaW5TaXplCisgICAgICAgIGxhYmVsV2luU2l6ZVRpdGxlLnBhY2soc2lkZT1MRUZULGFuY2hvcj1XLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIGVudHJ5V2luSGVpZ2h0LnBhY2soc2lkZT1SSUdIVCxhbmNob3I9RSxwYWR4PTEwLHBhZHk9NSkKKyAgICAgICAgbGFiZWxXaW5IZWlnaHRUaXRsZS5wYWNrKHNpZGU9UklHSFQsYW5jaG9yPUUscGFkeT01KQorICAgICAgICBlbnRyeVdpbldpZHRoLnBhY2soc2lkZT1SSUdIVCxhbmNob3I9RSxwYWR4PTEwLHBhZHk9NSkKKyAgICAgICAgbGFiZWxXaW5XaWR0aFRpdGxlLnBhY2soc2lkZT1SSUdIVCxhbmNob3I9RSxwYWR5PTUpCisgICAgICAgICNwYXJhZ3JhcGhGb3JtYXRXaWR0aAorICAgICAgICBsYWJlbFBhcmFXaWR0aFRpdGxlLnBhY2soc2lkZT1MRUZULGFuY2hvcj1XLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIGVudHJ5UGFyYVdpZHRoLnBhY2soc2lkZT1SSUdIVCxhbmNob3I9RSxwYWR4PTEwLHBhZHk9NSkKKyAgICAgICAgI2ZyYW1lRW5jb2RpbmcKKyAgICAgICAgbGFiZWxFbmNvZGluZ1RpdGxlLnBhY2soc2lkZT1MRUZULGFuY2hvcj1XLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIHJhZGlvRW5jTm9uZS5wYWNrKHNpZGU9UklHSFQsYW5jaG9yPUUscGFkeT01KQorICAgICAgICByYWRpb0VuY1VURjgucGFjayhzaWRlPVJJR0hULGFuY2hvcj1FLHBhZHk9NSkKKyAgICAgICAgcmFkaW9FbmNMb2NhbGUucGFjayhzaWRlPVJJR0hULGFuY2hvcj1FLHBhZHk9NSkKKyAgICAgICAgI2ZyYW1lSGVscAorICAgICAgICBmcmFtZUhlbHBMaXN0QnV0dG9ucy5wYWNrKHNpZGU9UklHSFQscGFkeD01LHBhZHk9NSxmaWxsPVkpCisgICAgICAgIGZyYW1lSGVscExpc3QucGFjayhzaWRlPVRPUCxwYWR4PTUscGFkeT01LGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKKyAgICAgICAgc2Nyb2xsSGVscExpc3QucGFjayhzaWRlPVJJR0hULGFuY2hvcj1XLGZpbGw9WSkKKyAgICAgICAgc2VsZi5saXN0SGVscC5wYWNrKHNpZGU9TEVGVCxhbmNob3I9RSxleHBhbmQ9VFJVRSxmaWxsPUJPVEgpCisgICAgICAgIHNlbGYuYnV0dG9uSGVscExpc3RFZGl0LnBhY2soc2lkZT1UT1AsYW5jaG9yPVcscGFkeT01KQorICAgICAgICBzZWxmLmJ1dHRvbkhlbHBMaXN0QWRkLnBhY2soc2lkZT1UT1AsYW5jaG9yPVcpCisgICAgICAgIHNlbGYuYnV0dG9uSGVscExpc3RSZW1vdmUucGFjayhzaWRlPVRPUCxhbmNob3I9VyxwYWR5PTUpCisgICAgICAgIHJldHVybiBmcmFtZQorCisgICAgZGVmIEF0dGFjaFZhckNhbGxiYWNrcyhzZWxmKToKKyAgICAgICAgc2VsZi5mb250U2l6ZS50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX2ZvbnRTaXplKQorICAgICAgICBzZWxmLmZvbnROYW1lLnRyYWNlX3ZhcmlhYmxlKCd3JyxzZWxmLlZhckNoYW5nZWRfZm9udE5hbWUpCisgICAgICAgIHNlbGYuZm9udEJvbGQudHJhY2VfdmFyaWFibGUoJ3cnLHNlbGYuVmFyQ2hhbmdlZF9mb250Qm9sZCkKKyAgICAgICAgc2VsZi5zcGFjZU51bS50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX3NwYWNlTnVtKQorICAgICAgICBzZWxmLmNvbG91ci50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX2NvbG91cikKKyAgICAgICAgc2VsZi5idWlsdGluVGhlbWUudHJhY2VfdmFyaWFibGUoJ3cnLHNlbGYuVmFyQ2hhbmdlZF9idWlsdGluVGhlbWUpCisgICAgICAgIHNlbGYuY3VzdG9tVGhlbWUudHJhY2VfdmFyaWFibGUoJ3cnLHNlbGYuVmFyQ2hhbmdlZF9jdXN0b21UaGVtZSkKKyAgICAgICAgc2VsZi50aGVtZUlzQnVpbHRpbi50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX3RoZW1lSXNCdWlsdGluKQorICAgICAgICBzZWxmLmhpZ2hsaWdodFRhcmdldC50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX2hpZ2hsaWdodFRhcmdldCkKKyAgICAgICAgc2VsZi5rZXlCaW5kaW5nLnRyYWNlX3ZhcmlhYmxlKCd3JyxzZWxmLlZhckNoYW5nZWRfa2V5QmluZGluZykKKyAgICAgICAgc2VsZi5idWlsdGluS2V5cy50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX2J1aWx0aW5LZXlzKQorICAgICAgICBzZWxmLmN1c3RvbUtleXMudHJhY2VfdmFyaWFibGUoJ3cnLHNlbGYuVmFyQ2hhbmdlZF9jdXN0b21LZXlzKQorICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluLnRyYWNlX3ZhcmlhYmxlKCd3JyxzZWxmLlZhckNoYW5nZWRfa2V5c0FyZUJ1aWx0aW4pCisgICAgICAgIHNlbGYud2luV2lkdGgudHJhY2VfdmFyaWFibGUoJ3cnLHNlbGYuVmFyQ2hhbmdlZF93aW5XaWR0aCkKKyAgICAgICAgc2VsZi53aW5IZWlnaHQudHJhY2VfdmFyaWFibGUoJ3cnLHNlbGYuVmFyQ2hhbmdlZF93aW5IZWlnaHQpCisgICAgICAgIHNlbGYucGFyYVdpZHRoLnRyYWNlX3ZhcmlhYmxlKCd3JyxzZWxmLlZhckNoYW5nZWRfcGFyYVdpZHRoKQorICAgICAgICBzZWxmLnN0YXJ0dXBFZGl0LnRyYWNlX3ZhcmlhYmxlKCd3JyxzZWxmLlZhckNoYW5nZWRfc3RhcnR1cEVkaXQpCisgICAgICAgIHNlbGYuYXV0b1NhdmUudHJhY2VfdmFyaWFibGUoJ3cnLHNlbGYuVmFyQ2hhbmdlZF9hdXRvU2F2ZSkKKyAgICAgICAgc2VsZi5lbmNvZGluZy50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX2VuY29kaW5nKQorCisgICAgZGVmIFZhckNoYW5nZWRfZm9udFNpemUoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi5mb250U2l6ZS5nZXQoKQorICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywnRWRpdG9yV2luZG93JywnZm9udC1zaXplJyx2YWx1ZSkKKworICAgIGRlZiBWYXJDaGFuZ2VkX2ZvbnROYW1lKHNlbGYsKnBhcmFtcyk6CisgICAgICAgIHZhbHVlPXNlbGYuZm9udE5hbWUuZ2V0KCkKKyAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsJ0VkaXRvcldpbmRvdycsJ2ZvbnQnLHZhbHVlKQorCisgICAgZGVmIFZhckNoYW5nZWRfZm9udEJvbGQoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi5mb250Qm9sZC5nZXQoKQorICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywnRWRpdG9yV2luZG93JywnZm9udC1ib2xkJyx2YWx1ZSkKKworICAgIGRlZiBWYXJDaGFuZ2VkX3NwYWNlTnVtKHNlbGYsKnBhcmFtcyk6CisgICAgICAgIHZhbHVlPXNlbGYuc3BhY2VOdW0uZ2V0KCkKKyAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsJ0luZGVudCcsJ251bS1zcGFjZXMnLHZhbHVlKQorCisgICAgZGVmIFZhckNoYW5nZWRfY29sb3VyKHNlbGYsKnBhcmFtcyk6CisgICAgICAgIHNlbGYuT25OZXdDb2xvdXJTZXQoKQorCisgICAgZGVmIFZhckNoYW5nZWRfYnVpbHRpblRoZW1lKHNlbGYsKnBhcmFtcyk6CisgICAgICAgIHZhbHVlPXNlbGYuYnVpbHRpblRoZW1lLmdldCgpCisgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCdUaGVtZScsJ25hbWUnLHZhbHVlKQorICAgICAgICBzZWxmLlBhaW50VGhlbWVTYW1wbGUoKQorCisgICAgZGVmIFZhckNoYW5nZWRfY3VzdG9tVGhlbWUoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi5jdXN0b21UaGVtZS5nZXQoKQorICAgICAgICBpZiB2YWx1ZSAhPSAnLSBubyBjdXN0b20gdGhlbWVzIC0nOgorICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsJ1RoZW1lJywnbmFtZScsdmFsdWUpCisgICAgICAgICAgICBzZWxmLlBhaW50VGhlbWVTYW1wbGUoKQorCisgICAgZGVmIFZhckNoYW5nZWRfdGhlbWVJc0J1aWx0aW4oc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi50aGVtZUlzQnVpbHRpbi5nZXQoKQorICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywnVGhlbWUnLCdkZWZhdWx0Jyx2YWx1ZSkKKyAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICBzZWxmLlZhckNoYW5nZWRfYnVpbHRpblRoZW1lKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuVmFyQ2hhbmdlZF9jdXN0b21UaGVtZSgpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF9oaWdobGlnaHRUYXJnZXQoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgc2VsZi5TZXRIaWdobGlnaHRUYXJnZXQoKQorCisgICAgZGVmIFZhckNoYW5nZWRfa2V5QmluZGluZyhzZWxmLCpwYXJhbXMpOgorICAgICAgICB2YWx1ZT1zZWxmLmtleUJpbmRpbmcuZ2V0KCkKKyAgICAgICAga2V5U2V0PXNlbGYuY3VzdG9tS2V5cy5nZXQoKQorICAgICAgICBldmVudD1zZWxmLmxpc3RCaW5kaW5ncy5nZXQoQU5DSE9SKS5zcGxpdCgpWzBdCisgICAgICAgIGlmIGlkbGVDb25mLklzQ29yZUJpbmRpbmcoZXZlbnQpOgorICAgICAgICAgICAgI3RoaXMgaXMgYSBjb3JlIGtleWJpbmRpbmcKKyAgICAgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ2tleXMnLGtleVNldCxldmVudCx2YWx1ZSkKKyAgICAgICAgZWxzZTogI3RoaXMgaXMgYW4gZXh0ZW5zaW9uIGtleSBiaW5kaW5nCisgICAgICAgICAgICBleHROYW1lPWlkbGVDb25mLkdldEV4dG5OYW1lRm9yRXZlbnQoZXZlbnQpCisgICAgICAgICAgICBleHRLZXliaW5kU2VjdGlvbj1leHROYW1lKydfY2ZnQmluZGluZ3MnCisgICAgICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdleHRlbnNpb25zJyxleHRLZXliaW5kU2VjdGlvbixldmVudCx2YWx1ZSkKKworICAgIGRlZiBWYXJDaGFuZ2VkX2J1aWx0aW5LZXlzKHNlbGYsKnBhcmFtcyk6CisgICAgICAgIHZhbHVlPXNlbGYuYnVpbHRpbktleXMuZ2V0KCkKKyAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsJ0tleXMnLCduYW1lJyx2YWx1ZSkKKyAgICAgICAgc2VsZi5Mb2FkS2V5c0xpc3QodmFsdWUpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF9jdXN0b21LZXlzKHNlbGYsKnBhcmFtcyk6CisgICAgICAgIHZhbHVlPXNlbGYuY3VzdG9tS2V5cy5nZXQoKQorICAgICAgICBpZiB2YWx1ZSAhPSAnLSBubyBjdXN0b20ga2V5cyAtJzoKKyAgICAgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCdLZXlzJywnbmFtZScsdmFsdWUpCisgICAgICAgICAgICBzZWxmLkxvYWRLZXlzTGlzdCh2YWx1ZSkKKworICAgIGRlZiBWYXJDaGFuZ2VkX2tleXNBcmVCdWlsdGluKHNlbGYsKnBhcmFtcyk6CisgICAgICAgIHZhbHVlPXNlbGYua2V5c0FyZUJ1aWx0aW4uZ2V0KCkKKyAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsJ0tleXMnLCdkZWZhdWx0Jyx2YWx1ZSkKKyAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICBzZWxmLlZhckNoYW5nZWRfYnVpbHRpbktleXMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5WYXJDaGFuZ2VkX2N1c3RvbUtleXMoKQorCisgICAgZGVmIFZhckNoYW5nZWRfd2luV2lkdGgoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi53aW5XaWR0aC5nZXQoKQorICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywnRWRpdG9yV2luZG93Jywnd2lkdGgnLHZhbHVlKQorCisgICAgZGVmIFZhckNoYW5nZWRfd2luSGVpZ2h0KHNlbGYsKnBhcmFtcyk6CisgICAgICAgIHZhbHVlPXNlbGYud2luSGVpZ2h0LmdldCgpCisgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCdoZWlnaHQnLHZhbHVlKQorCisgICAgZGVmIFZhckNoYW5nZWRfcGFyYVdpZHRoKHNlbGYsKnBhcmFtcyk6CisgICAgICAgIHZhbHVlPXNlbGYucGFyYVdpZHRoLmdldCgpCisgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCdGb3JtYXRQYXJhZ3JhcGgnLCdwYXJhZ3JhcGgnLHZhbHVlKQorCisgICAgZGVmIFZhckNoYW5nZWRfc3RhcnR1cEVkaXQoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi5zdGFydHVwRWRpdC5nZXQoKQorICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywnR2VuZXJhbCcsJ2VkaXRvci1vbi1zdGFydHVwJyx2YWx1ZSkKKworICAgIGRlZiBWYXJDaGFuZ2VkX2F1dG9TYXZlKHNlbGYsKnBhcmFtcyk6CisgICAgICAgIHZhbHVlPXNlbGYuYXV0b1NhdmUuZ2V0KCkKKyAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsJ0dlbmVyYWwnLCdhdXRvc2F2ZScsdmFsdWUpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF9lbmNvZGluZyhzZWxmLCpwYXJhbXMpOgorICAgICAgICB2YWx1ZT1zZWxmLmVuY29kaW5nLmdldCgpCisgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCdlbmNvZGluZycsdmFsdWUpCisKKyAgICBkZWYgUmVzZXRDaGFuZ2VkSXRlbXMoc2VsZik6CisgICAgICAgICNXaGVuIGFueSBjb25maWcgaXRlbSBpcyBjaGFuZ2VkIGluIHRoaXMgZGlhbG9nLCBhbiBlbnRyeQorICAgICAgICAjc2hvdWxkIGJlIG1hZGUgaW4gdGhlIHJlbGV2YW50IHNlY3Rpb24gKGNvbmZpZyB0eXBlKSBvZiB0aGlzCisgICAgICAgICNkaWN0aW9uYXJ5LiBUaGUga2V5IHNob3VsZCBiZSB0aGUgY29uZmlnIGZpbGUgc2VjdGlvbiBuYW1lIGFuZCB0aGUKKyAgICAgICAgI3ZhbHVlIGEgZGljdGlvbmFyeSwgd2hvc2Uga2V5OnZhbHVlIHBhaXJzIGFyZSBpdGVtPXZhbHVlIHBhaXJzIGZvcgorICAgICAgICAjdGhhdCBjb25maWcgZmlsZSBzZWN0aW9uLgorICAgICAgICBzZWxmLmNoYW5nZWRJdGVtcz17J21haW4nOnt9LCdoaWdobGlnaHQnOnt9LCdrZXlzJzp7fSwnZXh0ZW5zaW9ucyc6e319CisKKyAgICBkZWYgQWRkQ2hhbmdlZEl0ZW0oc2VsZix0eXBlLHNlY3Rpb24saXRlbSx2YWx1ZSk6CisgICAgICAgIHZhbHVlPXN0cih2YWx1ZSkgI21ha2Ugc3VyZSB3ZSB1c2UgYSBzdHJpbmcKKyAgICAgICAgaWYgc2VjdGlvbiBub3QgaW4gc2VsZi5jaGFuZ2VkSXRlbXNbdHlwZV06CisgICAgICAgICAgICBzZWxmLmNoYW5nZWRJdGVtc1t0eXBlXVtzZWN0aW9uXT17fQorICAgICAgICBzZWxmLmNoYW5nZWRJdGVtc1t0eXBlXVtzZWN0aW9uXVtpdGVtXT12YWx1ZQorCisgICAgZGVmIEdldERlZmF1bHRJdGVtcyhzZWxmKToKKyAgICAgICAgZEl0ZW1zPXsnbWFpbic6e30sJ2hpZ2hsaWdodCc6e30sJ2tleXMnOnt9LCdleHRlbnNpb25zJzp7fX0KKyAgICAgICAgZm9yIGNvbmZpZ1R5cGUgaW4gZEl0ZW1zLmtleXMoKToKKyAgICAgICAgICAgIHNlY3Rpb25zPWlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCdkZWZhdWx0Jyxjb25maWdUeXBlKQorICAgICAgICAgICAgZm9yIHNlY3Rpb24gaW4gc2VjdGlvbnM6CisgICAgICAgICAgICAgICAgZEl0ZW1zW2NvbmZpZ1R5cGVdW3NlY3Rpb25dPXt9CisgICAgICAgICAgICAgICAgb3B0aW9ucz1pZGxlQ29uZi5kZWZhdWx0Q2ZnW2NvbmZpZ1R5cGVdLkdldE9wdGlvbkxpc3Qoc2VjdGlvbikKKyAgICAgICAgICAgICAgICBmb3Igb3B0aW9uIGluIG9wdGlvbnM6CisgICAgICAgICAgICAgICAgICAgIGRJdGVtc1tjb25maWdUeXBlXVtzZWN0aW9uXVtvcHRpb25dPSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGxlQ29uZi5kZWZhdWx0Q2ZnW2NvbmZpZ1R5cGVdLkdldChzZWN0aW9uLG9wdGlvbikpCisgICAgICAgIHJldHVybiBkSXRlbXMKKworICAgIGRlZiBTZXRUaGVtZVR5cGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYudGhlbWVJc0J1aWx0aW4uZ2V0KCk6CisgICAgICAgICAgICBzZWxmLm9wdE1lbnVUaGVtZUJ1aWx0aW4uY29uZmlnKHN0YXRlPU5PUk1BTCkKKyAgICAgICAgICAgIHNlbGYub3B0TWVudVRoZW1lQ3VzdG9tLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uRGVsZXRlQ3VzdG9tVGhlbWUuY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5vcHRNZW51VGhlbWVCdWlsdGluLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgICAgIHNlbGYucmFkaW9UaGVtZUN1c3RvbS5jb25maWcoc3RhdGU9Tk9STUFMKQorICAgICAgICAgICAgc2VsZi5vcHRNZW51VGhlbWVDdXN0b20uY29uZmlnKHN0YXRlPU5PUk1BTCkKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uRGVsZXRlQ3VzdG9tVGhlbWUuY29uZmlnKHN0YXRlPU5PUk1BTCkKKworICAgIGRlZiBTZXRLZXlzVHlwZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5rZXlzQXJlQnVpbHRpbi5nZXQoKToKKyAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNCdWlsdGluLmNvbmZpZyhzdGF0ZT1OT1JNQUwpCisgICAgICAgICAgICBzZWxmLm9wdE1lbnVLZXlzQ3VzdG9tLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uRGVsZXRlQ3VzdG9tS2V5cy5jb25maWcoc3RhdGU9RElTQUJMRUQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm9wdE1lbnVLZXlzQnVpbHRpbi5jb25maWcoc3RhdGU9RElTQUJMRUQpCisgICAgICAgICAgICBzZWxmLnJhZGlvS2V5c0N1c3RvbS5jb25maWcoc3RhdGU9Tk9STUFMKQorICAgICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0N1c3RvbS5jb25maWcoc3RhdGU9Tk9STUFMKQorICAgICAgICAgICAgc2VsZi5idXR0b25EZWxldGVDdXN0b21LZXlzLmNvbmZpZyhzdGF0ZT1OT1JNQUwpCisKKyAgICBkZWYgR2V0TmV3S2V5cyhzZWxmKToKKyAgICAgICAgbGlzdEluZGV4PXNlbGYubGlzdEJpbmRpbmdzLmluZGV4KEFOQ0hPUikKKyAgICAgICAgYmluZGluZz1zZWxmLmxpc3RCaW5kaW5ncy5nZXQobGlzdEluZGV4KQorICAgICAgICBiaW5kTmFtZT1iaW5kaW5nLnNwbGl0KClbMF0gI2ZpcnN0IHBhcnQsIHVwIHRvIGZpcnN0IHNwYWNlCisgICAgICAgIGlmIHNlbGYua2V5c0FyZUJ1aWx0aW4uZ2V0KCk6CisgICAgICAgICAgICBjdXJyZW50S2V5U2V0TmFtZT1zZWxmLmJ1aWx0aW5LZXlzLmdldCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjdXJyZW50S2V5U2V0TmFtZT1zZWxmLmN1c3RvbUtleXMuZ2V0KCkKKyAgICAgICAgY3VycmVudEJpbmRpbmdzPWlkbGVDb25mLkdldEN1cnJlbnRLZXlTZXQoKQorICAgICAgICBpZiBjdXJyZW50S2V5U2V0TmFtZSBpbiBzZWxmLmNoYW5nZWRJdGVtc1sna2V5cyddLmtleXMoKTogI3Vuc2F2ZWQgY2hhbmdlcworICAgICAgICAgICAga2V5U2V0Q2hhbmdlcz1zZWxmLmNoYW5nZWRJdGVtc1sna2V5cyddW2N1cnJlbnRLZXlTZXROYW1lXQorICAgICAgICAgICAgZm9yIGV2ZW50IGluIGtleVNldENoYW5nZXMua2V5cygpOgorICAgICAgICAgICAgICAgIGN1cnJlbnRCaW5kaW5nc1tldmVudF09a2V5U2V0Q2hhbmdlc1tldmVudF0uc3BsaXQoKQorICAgICAgICBjdXJyZW50S2V5U2VxdWVuY2VzPWN1cnJlbnRCaW5kaW5ncy52YWx1ZXMoKQorICAgICAgICBuZXdLZXlzPUdldEtleXNEaWFsb2coc2VsZiwnR2V0IE5ldyBLZXlzJyxiaW5kTmFtZSwKKyAgICAgICAgICAgICAgICBjdXJyZW50S2V5U2VxdWVuY2VzKS5yZXN1bHQKKyAgICAgICAgaWYgbmV3S2V5czogI25ldyBrZXlzIHdlcmUgc3BlY2lmaWVkCisgICAgICAgICAgICBpZiBzZWxmLmtleXNBcmVCdWlsdGluLmdldCgpOiAjY3VycmVudCBrZXkgc2V0IGlzIGEgYnVpbHQtaW4KKyAgICAgICAgICAgICAgICBtZXNzYWdlPSgnWW91ciBjaGFuZ2VzIHdpbGwgYmUgc2F2ZWQgYXMgYSBuZXcgQ3VzdG9tIEtleSBTZXQuICcrCisgICAgICAgICAgICAgICAgICAgICAgICAnRW50ZXIgYSBuYW1lIGZvciB5b3VyIG5ldyBDdXN0b20gS2V5IFNldCBiZWxvdy4nKQorICAgICAgICAgICAgICAgIG5ld0tleVNldD1zZWxmLkdldE5ld0tleXNOYW1lKG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgaWYgbm90IG5ld0tleVNldDogI3VzZXIgY2FuY2VsbGVkIGN1c3RvbSBrZXkgc2V0IGNyZWF0aW9uCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGlzdEJpbmRpbmdzLnNlbGVjdF9zZXQobGlzdEluZGV4KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5zZWxlY3RfYW5jaG9yKGxpc3RJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZWxzZTogI2NyZWF0ZSBuZXcgY3VzdG9tIGtleSBzZXQgYmFzZWQgb24gcHJldmlvdXNseSBhY3RpdmUga2V5IHNldAorICAgICAgICAgICAgICAgICAgICBzZWxmLkNyZWF0ZU5ld0tleVNldChuZXdLZXlTZXQpCisgICAgICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5kZWxldGUobGlzdEluZGV4KQorICAgICAgICAgICAgc2VsZi5saXN0QmluZGluZ3MuaW5zZXJ0KGxpc3RJbmRleCxiaW5kTmFtZSsnIC0gJytuZXdLZXlzKQorICAgICAgICAgICAgc2VsZi5saXN0QmluZGluZ3Muc2VsZWN0X3NldChsaXN0SW5kZXgpCisgICAgICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5zZWxlY3RfYW5jaG9yKGxpc3RJbmRleCkKKyAgICAgICAgICAgIHNlbGYua2V5QmluZGluZy5zZXQobmV3S2V5cykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubGlzdEJpbmRpbmdzLnNlbGVjdF9zZXQobGlzdEluZGV4KQorICAgICAgICAgICAgc2VsZi5saXN0QmluZGluZ3Muc2VsZWN0X2FuY2hvcihsaXN0SW5kZXgpCisKKyAgICBkZWYgR2V0TmV3S2V5c05hbWUoc2VsZixtZXNzYWdlKToKKyAgICAgICAgdXNlZE5hbWVzPShpZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgndXNlcicsJ2tleXMnKSsKKyAgICAgICAgICAgICAgICBpZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgnZGVmYXVsdCcsJ2tleXMnKSkKKyAgICAgICAgbmV3S2V5U2V0PUdldENmZ1NlY3Rpb25OYW1lRGlhbG9nKHNlbGYsJ05ldyBDdXN0b20gS2V5IFNldCcsCisgICAgICAgICAgICAgICAgbWVzc2FnZSx1c2VkTmFtZXMpLnJlc3VsdAorICAgICAgICByZXR1cm4gbmV3S2V5U2V0CisKKyAgICBkZWYgU2F2ZUFzTmV3S2V5U2V0KHNlbGYpOgorICAgICAgICBuZXdLZXlzTmFtZT1zZWxmLkdldE5ld0tleXNOYW1lKCdOZXcgS2V5IFNldCBOYW1lOicpCisgICAgICAgIGlmIG5ld0tleXNOYW1lOgorICAgICAgICAgICAgc2VsZi5DcmVhdGVOZXdLZXlTZXQobmV3S2V5c05hbWUpCisKKyAgICBkZWYgS2V5QmluZGluZ1NlbGVjdGVkKHNlbGYsZXZlbnQpOgorICAgICAgICBzZWxmLmJ1dHRvbk5ld0tleXMuY29uZmlnKHN0YXRlPU5PUk1BTCkKKworICAgIGRlZiBDcmVhdGVOZXdLZXlTZXQoc2VsZixuZXdLZXlTZXROYW1lKToKKyAgICAgICAgI2NyZWF0ZXMgbmV3IGN1c3RvbSBrZXkgc2V0IGJhc2VkIG9uIHRoZSBwcmV2aW91c2x5IGFjdGl2ZSBrZXkgc2V0LAorICAgICAgICAjYW5kIG1ha2VzIHRoZSBuZXcga2V5IHNldCBhY3RpdmUKKyAgICAgICAgaWYgc2VsZi5rZXlzQXJlQnVpbHRpbi5nZXQoKToKKyAgICAgICAgICAgIHByZXZLZXlTZXROYW1lPXNlbGYuYnVpbHRpbktleXMuZ2V0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByZXZLZXlTZXROYW1lPXNlbGYuY3VzdG9tS2V5cy5nZXQoKQorICAgICAgICBwcmV2S2V5cz1pZGxlQ29uZi5HZXRDb3JlS2V5cyhwcmV2S2V5U2V0TmFtZSkKKyAgICAgICAgbmV3S2V5cz17fQorICAgICAgICBmb3IgZXZlbnQgaW4gcHJldktleXMua2V5cygpOiAjYWRkIGtleSBzZXQgdG8gY2hhbmdlZCBpdGVtcworICAgICAgICAgICAgZXZlbnROYW1lPWV2ZW50WzI6LTJdICN0cmltIG9mZiB0aGUgYW5nbGUgYnJhY2tldHMKKyAgICAgICAgICAgIGJpbmRpbmc9c3RyaW5nLmpvaW4ocHJldktleXNbZXZlbnRdKQorICAgICAgICAgICAgbmV3S2V5c1tldmVudE5hbWVdPWJpbmRpbmcKKyAgICAgICAgI2hhbmRsZSBhbnkgdW5zYXZlZCBjaGFuZ2VzIHRvIHByZXYga2V5IHNldAorICAgICAgICBpZiBwcmV2S2V5U2V0TmFtZSBpbiBzZWxmLmNoYW5nZWRJdGVtc1sna2V5cyddLmtleXMoKToKKyAgICAgICAgICAgIGtleVNldENoYW5nZXM9c2VsZi5jaGFuZ2VkSXRlbXNbJ2tleXMnXVtwcmV2S2V5U2V0TmFtZV0KKyAgICAgICAgICAgIGZvciBldmVudCBpbiBrZXlTZXRDaGFuZ2VzLmtleXMoKToKKyAgICAgICAgICAgICAgICBuZXdLZXlzW2V2ZW50XT1rZXlTZXRDaGFuZ2VzW2V2ZW50XQorICAgICAgICAjc2F2ZSB0aGUgbmV3IHRoZW1lCisgICAgICAgIHNlbGYuU2F2ZU5ld0tleVNldChuZXdLZXlTZXROYW1lLG5ld0tleXMpCisgICAgICAgICNjaGFuZ2UgZ3VpIG92ZXIgdG8gdGhlIG5ldyBrZXkgc2V0CisgICAgICAgIGN1c3RvbUtleUxpc3Q9aWRsZUNvbmYuR2V0U2VjdGlvbkxpc3QoJ3VzZXInLCdrZXlzJykKKyAgICAgICAgY3VzdG9tS2V5TGlzdC5zb3J0KCkKKyAgICAgICAgc2VsZi5vcHRNZW51S2V5c0N1c3RvbS5TZXRNZW51KGN1c3RvbUtleUxpc3QsbmV3S2V5U2V0TmFtZSkKKyAgICAgICAgc2VsZi5rZXlzQXJlQnVpbHRpbi5zZXQoMCkKKyAgICAgICAgc2VsZi5TZXRLZXlzVHlwZSgpCisKKyAgICBkZWYgTG9hZEtleXNMaXN0KHNlbGYsa2V5U2V0TmFtZSk6CisgICAgICAgIHJlc2VsZWN0PTAKKyAgICAgICAgbmV3S2V5U2V0PTAKKyAgICAgICAgaWYgc2VsZi5saXN0QmluZGluZ3MuY3Vyc2VsZWN0aW9uKCk6CisgICAgICAgICAgICByZXNlbGVjdD0xCisgICAgICAgICAgICBsaXN0SW5kZXg9c2VsZi5saXN0QmluZGluZ3MuaW5kZXgoQU5DSE9SKQorICAgICAgICBrZXlTZXQ9aWRsZUNvbmYuR2V0S2V5U2V0KGtleVNldE5hbWUpCisgICAgICAgIGJpbmROYW1lcz1rZXlTZXQua2V5cygpCisgICAgICAgIGJpbmROYW1lcy5zb3J0KCkKKyAgICAgICAgc2VsZi5saXN0QmluZGluZ3MuZGVsZXRlKDAsRU5EKQorICAgICAgICBmb3IgYmluZE5hbWUgaW4gYmluZE5hbWVzOgorICAgICAgICAgICAga2V5PXN0cmluZy5qb2luKGtleVNldFtiaW5kTmFtZV0pICNtYWtlIGtleShzKSBpbnRvIGEgc3RyaW5nCisgICAgICAgICAgICBiaW5kTmFtZT1iaW5kTmFtZVsyOi0yXSAjdHJpbSBvZmYgdGhlIGFuZ2xlIGJyYWNrZXRzCisgICAgICAgICAgICBpZiBrZXlTZXROYW1lIGluIHNlbGYuY2hhbmdlZEl0ZW1zWydrZXlzJ10ua2V5cygpOgorICAgICAgICAgICAgICAgICNoYW5kbGUgYW55IHVuc2F2ZWQgY2hhbmdlcyB0byB0aGlzIGtleSBzZXQKKyAgICAgICAgICAgICAgICBpZiBiaW5kTmFtZSBpbiBzZWxmLmNoYW5nZWRJdGVtc1sna2V5cyddW2tleVNldE5hbWVdLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAga2V5PXNlbGYuY2hhbmdlZEl0ZW1zWydrZXlzJ11ba2V5U2V0TmFtZV1bYmluZE5hbWVdCisgICAgICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5pbnNlcnQoRU5ELCBiaW5kTmFtZSsnIC0gJytrZXkpCisgICAgICAgIGlmIHJlc2VsZWN0OgorICAgICAgICAgICAgc2VsZi5saXN0QmluZGluZ3Muc2VlKGxpc3RJbmRleCkKKyAgICAgICAgICAgIHNlbGYubGlzdEJpbmRpbmdzLnNlbGVjdF9zZXQobGlzdEluZGV4KQorICAgICAgICAgICAgc2VsZi5saXN0QmluZGluZ3Muc2VsZWN0X2FuY2hvcihsaXN0SW5kZXgpCisKKyAgICBkZWYgRGVsZXRlQ3VzdG9tS2V5cyhzZWxmKToKKyAgICAgICAga2V5U2V0TmFtZT1zZWxmLmN1c3RvbUtleXMuZ2V0KCkKKyAgICAgICAgaWYgbm90IHRrTWVzc2FnZUJveC5hc2t5ZXNubygnRGVsZXRlIEtleSBTZXQnLCdBcmUgeW91IHN1cmUgeW91IHdpc2ggJysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gZGVsZXRlIHRoZSBrZXkgc2V0ICVyID8nICUgKGtleVNldE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjcmVtb3ZlIGtleSBzZXQgZnJvbSBjb25maWcKKyAgICAgICAgaWRsZUNvbmYudXNlckNmZ1sna2V5cyddLnJlbW92ZV9zZWN0aW9uKGtleVNldE5hbWUpCisgICAgICAgIGlmIGtleVNldE5hbWUgaW4gc2VsZi5jaGFuZ2VkSXRlbXNbJ2tleXMnXToKKyAgICAgICAgICAgIGRlbChzZWxmLmNoYW5nZWRJdGVtc1sna2V5cyddW2tleVNldE5hbWVdKQorICAgICAgICAjd3JpdGUgY2hhbmdlcworICAgICAgICBpZGxlQ29uZi51c2VyQ2ZnWydrZXlzJ10uU2F2ZSgpCisgICAgICAgICNyZWxvYWQgdXNlciBrZXkgc2V0IGxpc3QKKyAgICAgICAgaXRlbUxpc3Q9aWRsZUNvbmYuR2V0U2VjdGlvbkxpc3QoJ3VzZXInLCdrZXlzJykKKyAgICAgICAgaXRlbUxpc3Quc29ydCgpCisgICAgICAgIGlmIG5vdCBpdGVtTGlzdDoKKyAgICAgICAgICAgIHNlbGYucmFkaW9LZXlzQ3VzdG9tLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNDdXN0b20uU2V0TWVudShpdGVtTGlzdCwnLSBubyBjdXN0b20ga2V5cyAtJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNDdXN0b20uU2V0TWVudShpdGVtTGlzdCxpdGVtTGlzdFswXSkKKyAgICAgICAgI3JldmVydCB0byBkZWZhdWx0IGtleSBzZXQKKyAgICAgICAgc2VsZi5rZXlzQXJlQnVpbHRpbi5zZXQoaWRsZUNvbmYuZGVmYXVsdENmZ1snbWFpbiddLkdldCgnS2V5cycsJ2RlZmF1bHQnKSkKKyAgICAgICAgc2VsZi5idWlsdGluS2V5cy5zZXQoaWRsZUNvbmYuZGVmYXVsdENmZ1snbWFpbiddLkdldCgnS2V5cycsJ25hbWUnKSkKKyAgICAgICAgI3VzZXIgY2FuJ3QgYmFjayBvdXQgb2YgdGhlc2UgY2hhbmdlcywgdGhleSBtdXN0IGJlIGFwcGxpZWQgbm93CisgICAgICAgIHNlbGYuQXBwbHkoKQorICAgICAgICBzZWxmLlNldEtleXNUeXBlKCkKKworICAgIGRlZiBEZWxldGVDdXN0b21UaGVtZShzZWxmKToKKyAgICAgICAgdGhlbWVOYW1lPXNlbGYuY3VzdG9tVGhlbWUuZ2V0KCkKKyAgICAgICAgaWYgbm90IHRrTWVzc2FnZUJveC5hc2t5ZXNubygnRGVsZXRlIFRoZW1lJywnQXJlIHlvdSBzdXJlIHlvdSB3aXNoICcrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIGRlbGV0ZSB0aGUgdGhlbWUgJXIgPycgJSAodGhlbWVOYW1lLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICNyZW1vdmUgdGhlbWUgZnJvbSBjb25maWcKKyAgICAgICAgaWRsZUNvbmYudXNlckNmZ1snaGlnaGxpZ2h0J10ucmVtb3ZlX3NlY3Rpb24odGhlbWVOYW1lKQorICAgICAgICBpZiB0aGVtZU5hbWUgaW4gc2VsZi5jaGFuZ2VkSXRlbXNbJ2hpZ2hsaWdodCddOgorICAgICAgICAgICAgZGVsKHNlbGYuY2hhbmdlZEl0ZW1zWydoaWdobGlnaHQnXVt0aGVtZU5hbWVdKQorICAgICAgICAjd3JpdGUgY2hhbmdlcworICAgICAgICBpZGxlQ29uZi51c2VyQ2ZnWydoaWdobGlnaHQnXS5TYXZlKCkKKyAgICAgICAgI3JlbG9hZCB1c2VyIHRoZW1lIGxpc3QKKyAgICAgICAgaXRlbUxpc3Q9aWRsZUNvbmYuR2V0U2VjdGlvbkxpc3QoJ3VzZXInLCdoaWdobGlnaHQnKQorICAgICAgICBpdGVtTGlzdC5zb3J0KCkKKyAgICAgICAgaWYgbm90IGl0ZW1MaXN0OgorICAgICAgICAgICAgc2VsZi5yYWRpb1RoZW1lQ3VzdG9tLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgICAgIHNlbGYub3B0TWVudVRoZW1lQ3VzdG9tLlNldE1lbnUoaXRlbUxpc3QsJy0gbm8gY3VzdG9tIHRoZW1lcyAtJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYub3B0TWVudVRoZW1lQ3VzdG9tLlNldE1lbnUoaXRlbUxpc3QsaXRlbUxpc3RbMF0pCisgICAgICAgICNyZXZlcnQgdG8gZGVmYXVsdCB0aGVtZQorICAgICAgICBzZWxmLnRoZW1lSXNCdWlsdGluLnNldChpZGxlQ29uZi5kZWZhdWx0Q2ZnWydtYWluJ10uR2V0KCdUaGVtZScsJ2RlZmF1bHQnKSkKKyAgICAgICAgc2VsZi5idWlsdGluVGhlbWUuc2V0KGlkbGVDb25mLmRlZmF1bHRDZmdbJ21haW4nXS5HZXQoJ1RoZW1lJywnbmFtZScpKQorICAgICAgICAjdXNlciBjYW4ndCBiYWNrIG91dCBvZiB0aGVzZSBjaGFuZ2VzLCB0aGV5IG11c3QgYmUgYXBwbGllZCBub3cKKyAgICAgICAgc2VsZi5BcHBseSgpCisgICAgICAgIHNlbGYuU2V0VGhlbWVUeXBlKCkKKworICAgIGRlZiBHZXRDb2xvdXIoc2VsZik6CisgICAgICAgIHRhcmdldD1zZWxmLmhpZ2hsaWdodFRhcmdldC5nZXQoKQorICAgICAgICBwcmV2Q29sb3VyPXNlbGYuZnJhbWVDb2xvdXJTZXQuY2dldCgnYmcnKQorICAgICAgICByZ2JUdXBsZXQsIGNvbG91clN0cmluZyA9IHRrQ29sb3JDaG9vc2VyLmFza2NvbG9yKHBhcmVudD1zZWxmLAorICAgICAgICAgICAgdGl0bGU9J1BpY2sgbmV3IGNvbG91ciBmb3IgOiAnK3RhcmdldCxpbml0aWFsY29sb3I9cHJldkNvbG91cikKKyAgICAgICAgaWYgY29sb3VyU3RyaW5nIGFuZCAoY29sb3VyU3RyaW5nIT1wcmV2Q29sb3VyKToKKyAgICAgICAgICAgICN1c2VyIGRpZG4ndCBjYW5jZWwsIGFuZCB0aGV5IGNob3NlIGEgbmV3IGNvbG91cgorICAgICAgICAgICAgaWYgc2VsZi50aGVtZUlzQnVpbHRpbi5nZXQoKTogI2N1cnJlbnQgdGhlbWUgaXMgYSBidWlsdC1pbgorICAgICAgICAgICAgICAgIG1lc3NhZ2U9KCdZb3VyIGNoYW5nZXMgd2lsbCBiZSBzYXZlZCBhcyBhIG5ldyBDdXN0b20gVGhlbWUuICcrCisgICAgICAgICAgICAgICAgICAgICAgICAnRW50ZXIgYSBuYW1lIGZvciB5b3VyIG5ldyBDdXN0b20gVGhlbWUgYmVsb3cuJykKKyAgICAgICAgICAgICAgICBuZXdUaGVtZT1zZWxmLkdldE5ld1RoZW1lTmFtZShtZXNzYWdlKQorICAgICAgICAgICAgICAgIGlmIG5vdCBuZXdUaGVtZTogI3VzZXIgY2FuY2VsbGVkIGN1c3RvbSB0aGVtZSBjcmVhdGlvbgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBlbHNlOiAjY3JlYXRlIG5ldyBjdXN0b20gdGhlbWUgYmFzZWQgb24gcHJldmlvdXNseSBhY3RpdmUgdGhlbWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5DcmVhdGVOZXdUaGVtZShuZXdUaGVtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb2xvdXIuc2V0KGNvbG91clN0cmluZykKKyAgICAgICAgICAgIGVsc2U6ICNjdXJyZW50IHRoZW1lIGlzIHVzZXIgZGVmaW5lZAorICAgICAgICAgICAgICAgIHNlbGYuY29sb3VyLnNldChjb2xvdXJTdHJpbmcpCisKKyAgICBkZWYgT25OZXdDb2xvdXJTZXQoc2VsZik6CisgICAgICAgIG5ld0NvbG91cj1zZWxmLmNvbG91ci5nZXQoKQorICAgICAgICBzZWxmLmZyYW1lQ29sb3VyU2V0LmNvbmZpZyhiZz1uZXdDb2xvdXIpI3NldCBzYW1wbGUKKyAgICAgICAgaWYgc2VsZi5mZ0hpbGl0ZS5nZXQoKTogcGxhbmU9J2ZvcmVncm91bmQnCisgICAgICAgIGVsc2U6IHBsYW5lPSdiYWNrZ3JvdW5kJworICAgICAgICBzYW1wbGVFbGVtZW50PXNlbGYudGhlbWVFbGVtZW50c1tzZWxmLmhpZ2hsaWdodFRhcmdldC5nZXQoKV1bMF0KKyAgICAgICAgc2VsZi50ZXh0SGlnaGxpZ2h0U2FtcGxlLnRhZ19jb25maWcoc2FtcGxlRWxlbWVudCwgKip7cGxhbmU6bmV3Q29sb3VyfSkKKyAgICAgICAgdGhlbWU9c2VsZi5jdXN0b21UaGVtZS5nZXQoKQorICAgICAgICB0aGVtZUVsZW1lbnQ9c2FtcGxlRWxlbWVudCsnLScrcGxhbmUKKyAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnaGlnaGxpZ2h0Jyx0aGVtZSx0aGVtZUVsZW1lbnQsbmV3Q29sb3VyKQorCisgICAgZGVmIEdldE5ld1RoZW1lTmFtZShzZWxmLG1lc3NhZ2UpOgorICAgICAgICB1c2VkTmFtZXM9KGlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCd1c2VyJywnaGlnaGxpZ2h0JykrCisgICAgICAgICAgICAgICAgaWRsZUNvbmYuR2V0U2VjdGlvbkxpc3QoJ2RlZmF1bHQnLCdoaWdobGlnaHQnKSkKKyAgICAgICAgbmV3VGhlbWU9R2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2coc2VsZiwnTmV3IEN1c3RvbSBUaGVtZScsCisgICAgICAgICAgICAgICAgbWVzc2FnZSx1c2VkTmFtZXMpLnJlc3VsdAorICAgICAgICByZXR1cm4gbmV3VGhlbWUKKworICAgIGRlZiBTYXZlQXNOZXdUaGVtZShzZWxmKToKKyAgICAgICAgbmV3VGhlbWVOYW1lPXNlbGYuR2V0TmV3VGhlbWVOYW1lKCdOZXcgVGhlbWUgTmFtZTonKQorICAgICAgICBpZiBuZXdUaGVtZU5hbWU6CisgICAgICAgICAgICBzZWxmLkNyZWF0ZU5ld1RoZW1lKG5ld1RoZW1lTmFtZSkKKworICAgIGRlZiBDcmVhdGVOZXdUaGVtZShzZWxmLG5ld1RoZW1lTmFtZSk6CisgICAgICAgICNjcmVhdGVzIG5ldyBjdXN0b20gdGhlbWUgYmFzZWQgb24gdGhlIHByZXZpb3VzbHkgYWN0aXZlIHRoZW1lLAorICAgICAgICAjYW5kIG1ha2VzIHRoZSBuZXcgdGhlbWUgYWN0aXZlCisgICAgICAgIGlmIHNlbGYudGhlbWVJc0J1aWx0aW4uZ2V0KCk6CisgICAgICAgICAgICB0aGVtZVR5cGU9J2RlZmF1bHQnCisgICAgICAgICAgICB0aGVtZU5hbWU9c2VsZi5idWlsdGluVGhlbWUuZ2V0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRoZW1lVHlwZT0ndXNlcicKKyAgICAgICAgICAgIHRoZW1lTmFtZT1zZWxmLmN1c3RvbVRoZW1lLmdldCgpCisgICAgICAgIG5ld1RoZW1lPWlkbGVDb25mLkdldFRoZW1lRGljdCh0aGVtZVR5cGUsdGhlbWVOYW1lKQorICAgICAgICAjYXBwbHkgYW55IG9mIHRoZSBvbGQgdGhlbWUncyB1bnNhdmVkIGNoYW5nZXMgdG8gdGhlIG5ldyB0aGVtZQorICAgICAgICBpZiB0aGVtZU5hbWUgaW4gc2VsZi5jaGFuZ2VkSXRlbXNbJ2hpZ2hsaWdodCddLmtleXMoKToKKyAgICAgICAgICAgIHRoZW1lQ2hhbmdlcz1zZWxmLmNoYW5nZWRJdGVtc1snaGlnaGxpZ2h0J11bdGhlbWVOYW1lXQorICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gdGhlbWVDaGFuZ2VzLmtleXMoKToKKyAgICAgICAgICAgICAgICBuZXdUaGVtZVtlbGVtZW50XT10aGVtZUNoYW5nZXNbZWxlbWVudF0KKyAgICAgICAgI3NhdmUgdGhlIG5ldyB0aGVtZQorICAgICAgICBzZWxmLlNhdmVOZXdUaGVtZShuZXdUaGVtZU5hbWUsbmV3VGhlbWUpCisgICAgICAgICNjaGFuZ2UgZ3VpIG92ZXIgdG8gdGhlIG5ldyB0aGVtZQorICAgICAgICBjdXN0b21UaGVtZUxpc3Q9aWRsZUNvbmYuR2V0U2VjdGlvbkxpc3QoJ3VzZXInLCdoaWdobGlnaHQnKQorICAgICAgICBjdXN0b21UaGVtZUxpc3Quc29ydCgpCisgICAgICAgIHNlbGYub3B0TWVudVRoZW1lQ3VzdG9tLlNldE1lbnUoY3VzdG9tVGhlbWVMaXN0LG5ld1RoZW1lTmFtZSkKKyAgICAgICAgc2VsZi50aGVtZUlzQnVpbHRpbi5zZXQoMCkKKyAgICAgICAgc2VsZi5TZXRUaGVtZVR5cGUoKQorCisgICAgZGVmIE9uTGlzdEZvbnRCdXR0b25SZWxlYXNlKHNlbGYsZXZlbnQpOgorICAgICAgICBmb250ID0gc2VsZi5saXN0Rm9udE5hbWUuZ2V0KEFOQ0hPUikKKyAgICAgICAgc2VsZi5mb250TmFtZS5zZXQoZm9udC5sb3dlcigpKQorICAgICAgICBzZWxmLlNldEZvbnRTYW1wbGUoKQorCisgICAgZGVmIFNldEZvbnRTYW1wbGUoc2VsZixldmVudD1Ob25lKToKKyAgICAgICAgZm9udE5hbWU9c2VsZi5mb250TmFtZS5nZXQoKQorICAgICAgICBpZiBzZWxmLmZvbnRCb2xkLmdldCgpOgorICAgICAgICAgICAgZm9udFdlaWdodD10a0ZvbnQuQk9MRAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9udFdlaWdodD10a0ZvbnQuTk9STUFMCisgICAgICAgIG5ld0ZvbnQgPSAoZm9udE5hbWUsIHNlbGYuZm9udFNpemUuZ2V0KCksIGZvbnRXZWlnaHQpCisgICAgICAgIHNlbGYubGFiZWxGb250U2FtcGxlLmNvbmZpZyhmb250PW5ld0ZvbnQpCisgICAgICAgIHNlbGYudGV4dEhpZ2hsaWdodFNhbXBsZS5jb25maWd1cmUoZm9udD1uZXdGb250KQorCisgICAgZGVmIFNldEhpZ2hsaWdodFRhcmdldChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5oaWdobGlnaHRUYXJnZXQuZ2V0KCk9PSdDdXJzb3InOiAjYmcgbm90IHBvc3NpYmxlCisgICAgICAgICAgICBzZWxmLnJhZGlvRmcuY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICAgICAgc2VsZi5yYWRpb0JnLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgICAgIHNlbGYuZmdIaWxpdGUuc2V0KDEpCisgICAgICAgIGVsc2U6ICNib3RoIGZnIGFuZCBiZyBjYW4gYmUgc2V0CisgICAgICAgICAgICBzZWxmLnJhZGlvRmcuY29uZmlnKHN0YXRlPU5PUk1BTCkKKyAgICAgICAgICAgIHNlbGYucmFkaW9CZy5jb25maWcoc3RhdGU9Tk9STUFMKQorICAgICAgICAgICAgc2VsZi5mZ0hpbGl0ZS5zZXQoMSkKKyAgICAgICAgc2VsZi5TZXRDb2xvdXJTYW1wbGUoKQorCisgICAgZGVmIFNldENvbG91clNhbXBsZUJpbmRpbmcoc2VsZiwqYXJncyk6CisgICAgICAgIHNlbGYuU2V0Q29sb3VyU2FtcGxlKCkKKworICAgIGRlZiBTZXRDb2xvdXJTYW1wbGUoc2VsZik6CisgICAgICAgICNzZXQgdGhlIGNvbG91ciBzbWFwbGUgYXJlYQorICAgICAgICB0YWc9c2VsZi50aGVtZUVsZW1lbnRzW3NlbGYuaGlnaGxpZ2h0VGFyZ2V0LmdldCgpXVswXQorICAgICAgICBpZiBzZWxmLmZnSGlsaXRlLmdldCgpOiBwbGFuZT0nZm9yZWdyb3VuZCcKKyAgICAgICAgZWxzZTogcGxhbmU9J2JhY2tncm91bmQnCisgICAgICAgIGNvbG91cj1zZWxmLnRleHRIaWdobGlnaHRTYW1wbGUudGFnX2NnZXQodGFnLHBsYW5lKQorICAgICAgICBzZWxmLmZyYW1lQ29sb3VyU2V0LmNvbmZpZyhiZz1jb2xvdXIpCisKKyAgICBkZWYgUGFpbnRUaGVtZVNhbXBsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi50aGVtZUlzQnVpbHRpbi5nZXQoKTogI2EgZGVmYXVsdCB0aGVtZQorICAgICAgICAgICAgdGhlbWU9c2VsZi5idWlsdGluVGhlbWUuZ2V0KCkKKyAgICAgICAgZWxzZTogI2EgdXNlciB0aGVtZQorICAgICAgICAgICAgdGhlbWU9c2VsZi5jdXN0b21UaGVtZS5nZXQoKQorICAgICAgICBmb3IgZWxlbWVudFRpdGxlIGluIHNlbGYudGhlbWVFbGVtZW50cy5rZXlzKCk6CisgICAgICAgICAgICBlbGVtZW50PXNlbGYudGhlbWVFbGVtZW50c1tlbGVtZW50VGl0bGVdWzBdCisgICAgICAgICAgICBjb2xvdXJzPWlkbGVDb25mLkdldEhpZ2hsaWdodCh0aGVtZSxlbGVtZW50KQorICAgICAgICAgICAgaWYgZWxlbWVudD09J2N1cnNvcic6ICNjdXJzb3Igc2FtcGxlIG5lZWRzIHNwZWNpYWwgcGFpbnRpbmcKKyAgICAgICAgICAgICAgICBjb2xvdXJzWydiYWNrZ3JvdW5kJ109aWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgJ25vcm1hbCcsIGZnQmc9J2JnJykKKyAgICAgICAgICAgICNoYW5kbGUgYW55IHVuc2F2ZWQgY2hhbmdlcyB0byB0aGlzIHRoZW1lCisgICAgICAgICAgICBpZiB0aGVtZSBpbiBzZWxmLmNoYW5nZWRJdGVtc1snaGlnaGxpZ2h0J10ua2V5cygpOgorICAgICAgICAgICAgICAgIHRoZW1lRGljdD1zZWxmLmNoYW5nZWRJdGVtc1snaGlnaGxpZ2h0J11bdGhlbWVdCisgICAgICAgICAgICAgICAgaWYgZWxlbWVudCsnLWZvcmVncm91bmQnIGluIHRoZW1lRGljdDoKKyAgICAgICAgICAgICAgICAgICAgY29sb3Vyc1snZm9yZWdyb3VuZCddPXRoZW1lRGljdFtlbGVtZW50KyctZm9yZWdyb3VuZCddCisgICAgICAgICAgICAgICAgaWYgZWxlbWVudCsnLWJhY2tncm91bmQnIGluIHRoZW1lRGljdDoKKyAgICAgICAgICAgICAgICAgICAgY29sb3Vyc1snYmFja2dyb3VuZCddPXRoZW1lRGljdFtlbGVtZW50KyctYmFja2dyb3VuZCddCisgICAgICAgICAgICBzZWxmLnRleHRIaWdobGlnaHRTYW1wbGUudGFnX2NvbmZpZyhlbGVtZW50LCAqKmNvbG91cnMpCisgICAgICAgIHNlbGYuU2V0Q29sb3VyU2FtcGxlKCkKKworICAgIGRlZiBIZWxwU291cmNlU2VsZWN0ZWQoc2VsZixldmVudCk6CisgICAgICAgIHNlbGYuU2V0SGVscExpc3RCdXR0b25TdGF0ZXMoKQorCisgICAgZGVmIFNldEhlbHBMaXN0QnV0dG9uU3RhdGVzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmxpc3RIZWxwLnNpemUoKTwxOiAjbm8gZW50cmllcyBpbiBsaXN0CisgICAgICAgICAgICBzZWxmLmJ1dHRvbkhlbHBMaXN0RWRpdC5jb25maWcoc3RhdGU9RElTQUJMRUQpCisgICAgICAgICAgICBzZWxmLmJ1dHRvbkhlbHBMaXN0UmVtb3ZlLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgZWxzZTogI3RoZXJlIGFyZSBzb21lIGVudHJpZXMKKyAgICAgICAgICAgIGlmIHNlbGYubGlzdEhlbHAuY3Vyc2VsZWN0aW9uKCk6ICN0aGVyZSBjdXJyZW50bHkgaXMgYSBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICBzZWxmLmJ1dHRvbkhlbHBMaXN0RWRpdC5jb25maWcoc3RhdGU9Tk9STUFMKQorICAgICAgICAgICAgICAgIHNlbGYuYnV0dG9uSGVscExpc3RSZW1vdmUuY29uZmlnKHN0YXRlPU5PUk1BTCkKKyAgICAgICAgICAgIGVsc2U6ICAjdGhlcmUgY3VycmVudGx5IGlzIG5vdCBhIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgIHNlbGYuYnV0dG9uSGVscExpc3RFZGl0LmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgICAgICAgICBzZWxmLmJ1dHRvbkhlbHBMaXN0UmVtb3ZlLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKworICAgIGRlZiBIZWxwTGlzdEl0ZW1BZGQoc2VsZik6CisgICAgICAgIGhlbHBTb3VyY2U9R2V0SGVscFNvdXJjZURpYWxvZyhzZWxmLCdOZXcgSGVscCBTb3VyY2UnKS5yZXN1bHQKKyAgICAgICAgaWYgaGVscFNvdXJjZToKKyAgICAgICAgICAgIHNlbGYudXNlckhlbHBMaXN0LmFwcGVuZCggKGhlbHBTb3VyY2VbMF0saGVscFNvdXJjZVsxXSkgKQorICAgICAgICAgICAgc2VsZi5saXN0SGVscC5pbnNlcnQoRU5ELGhlbHBTb3VyY2VbMF0pCisgICAgICAgICAgICBzZWxmLlVwZGF0ZVVzZXJIZWxwQ2hhbmdlZEl0ZW1zKCkKKyAgICAgICAgc2VsZi5TZXRIZWxwTGlzdEJ1dHRvblN0YXRlcygpCisKKyAgICBkZWYgSGVscExpc3RJdGVtRWRpdChzZWxmKToKKyAgICAgICAgaXRlbUluZGV4PXNlbGYubGlzdEhlbHAuaW5kZXgoQU5DSE9SKQorICAgICAgICBoZWxwU291cmNlPXNlbGYudXNlckhlbHBMaXN0W2l0ZW1JbmRleF0KKyAgICAgICAgbmV3SGVscFNvdXJjZT1HZXRIZWxwU291cmNlRGlhbG9nKHNlbGYsJ0VkaXQgSGVscCBTb3VyY2UnLAorICAgICAgICAgICAgICAgIG1lbnVJdGVtPWhlbHBTb3VyY2VbMF0sZmlsZVBhdGg9aGVscFNvdXJjZVsxXSkucmVzdWx0CisgICAgICAgIGlmIChub3QgbmV3SGVscFNvdXJjZSkgb3IgKG5ld0hlbHBTb3VyY2U9PWhlbHBTb3VyY2UpOgorICAgICAgICAgICAgcmV0dXJuICNubyBjaGFuZ2VzCisgICAgICAgIHNlbGYudXNlckhlbHBMaXN0W2l0ZW1JbmRleF09bmV3SGVscFNvdXJjZQorICAgICAgICBzZWxmLmxpc3RIZWxwLmRlbGV0ZShpdGVtSW5kZXgpCisgICAgICAgIHNlbGYubGlzdEhlbHAuaW5zZXJ0KGl0ZW1JbmRleCxuZXdIZWxwU291cmNlWzBdKQorICAgICAgICBzZWxmLlVwZGF0ZVVzZXJIZWxwQ2hhbmdlZEl0ZW1zKCkKKyAgICAgICAgc2VsZi5TZXRIZWxwTGlzdEJ1dHRvblN0YXRlcygpCisKKyAgICBkZWYgSGVscExpc3RJdGVtUmVtb3ZlKHNlbGYpOgorICAgICAgICBpdGVtSW5kZXg9c2VsZi5saXN0SGVscC5pbmRleChBTkNIT1IpCisgICAgICAgIGRlbChzZWxmLnVzZXJIZWxwTGlzdFtpdGVtSW5kZXhdKQorICAgICAgICBzZWxmLmxpc3RIZWxwLmRlbGV0ZShpdGVtSW5kZXgpCisgICAgICAgIHNlbGYuVXBkYXRlVXNlckhlbHBDaGFuZ2VkSXRlbXMoKQorICAgICAgICBzZWxmLlNldEhlbHBMaXN0QnV0dG9uU3RhdGVzKCkKKworICAgIGRlZiBVcGRhdGVVc2VySGVscENoYW5nZWRJdGVtcyhzZWxmKToKKyAgICAgICAgIkNsZWFyIGFuZCByZWJ1aWxkIHRoZSBIZWxwRmlsZXMgc2VjdGlvbiBpbiBzZWxmLmNoYW5nZWRJdGVtcyIKKyAgICAgICAgc2VsZi5jaGFuZ2VkSXRlbXNbJ21haW4nXVsnSGVscEZpbGVzJ10gPSB7fQorICAgICAgICBmb3IgbnVtIGluIHJhbmdlKDEsbGVuKHNlbGYudXNlckhlbHBMaXN0KSsxKToKKyAgICAgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCdIZWxwRmlsZXMnLHN0cihudW0pLAorICAgICAgICAgICAgICAgICAgICBzdHJpbmcuam9pbihzZWxmLnVzZXJIZWxwTGlzdFtudW0tMV1bOjJdLCc7JykpCisKKyAgICBkZWYgTG9hZEZvbnRDZmcoc2VsZik6CisgICAgICAgICMjYmFzZSBlZGl0b3IgZm9udCBzZWxlY3Rpb24gbGlzdAorICAgICAgICBmb250cz1saXN0KHRrRm9udC5mYW1pbGllcyhzZWxmKSkKKyAgICAgICAgZm9udHMuc29ydCgpCisgICAgICAgIGZvciBmb250IGluIGZvbnRzOgorICAgICAgICAgICAgc2VsZi5saXN0Rm9udE5hbWUuaW5zZXJ0KEVORCxmb250KQorICAgICAgICBjb25maWd1cmVkRm9udD1pZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCdmb250JywKKyAgICAgICAgICAgICAgICBkZWZhdWx0PSdjb3VyaWVyJykKKyAgICAgICAgbGNfY29uZmlndXJlZEZvbnQgPSBjb25maWd1cmVkRm9udC5sb3dlcigpCisgICAgICAgIHNlbGYuZm9udE5hbWUuc2V0KGxjX2NvbmZpZ3VyZWRGb250KQorICAgICAgICBsY19mb250cyA9IFtzLmxvd2VyKCkgZm9yIHMgaW4gZm9udHNdCisgICAgICAgIGlmIGxjX2NvbmZpZ3VyZWRGb250IGluIGxjX2ZvbnRzOgorICAgICAgICAgICAgY3VycmVudEZvbnRJbmRleCA9IGxjX2ZvbnRzLmluZGV4KGxjX2NvbmZpZ3VyZWRGb250KQorICAgICAgICAgICAgc2VsZi5saXN0Rm9udE5hbWUuc2VlKGN1cnJlbnRGb250SW5kZXgpCisgICAgICAgICAgICBzZWxmLmxpc3RGb250TmFtZS5zZWxlY3Rfc2V0KGN1cnJlbnRGb250SW5kZXgpCisgICAgICAgICAgICBzZWxmLmxpc3RGb250TmFtZS5zZWxlY3RfYW5jaG9yKGN1cnJlbnRGb250SW5kZXgpCisgICAgICAgICMjZm9udCBzaXplIGRyb3Bkb3duCisgICAgICAgIGZvbnRTaXplPWlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0VkaXRvcldpbmRvdycsJ2ZvbnQtc2l6ZScsCisgICAgICAgICAgICAgICAgdHlwZT0naW50JywgZGVmYXVsdD0nMTAnKQorICAgICAgICBzZWxmLm9wdE1lbnVGb250U2l6ZS5TZXRNZW51KCgnNycsJzgnLCc5JywnMTAnLCcxMScsJzEyJywnMTMnLCcxNCcsCisgICAgICAgICAgICAgICAgJzE2JywnMTgnLCcyMCcsJzIyJyksZm9udFNpemUgKQorICAgICAgICAjI2ZvbnRXZWlnaHQKKyAgICAgICAgc2VsZi5mb250Qm9sZC5zZXQoaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnRWRpdG9yV2luZG93JywKKyAgICAgICAgICAgICAgICAnZm9udC1ib2xkJyxkZWZhdWx0PTAsdHlwZT0nYm9vbCcpKQorICAgICAgICAjI2ZvbnQgc2FtcGxlCisgICAgICAgIHNlbGYuU2V0Rm9udFNhbXBsZSgpCisKKyAgICBkZWYgTG9hZFRhYkNmZyhzZWxmKToKKyAgICAgICAgIyNpbmRlbnQgc2l6ZXMKKyAgICAgICAgc3BhY2VOdW09aWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnSW5kZW50JywnbnVtLXNwYWNlcycsCisgICAgICAgICAgICAgICAgZGVmYXVsdD00LHR5cGU9J2ludCcpCisgICAgICAgIHNlbGYuc3BhY2VOdW0uc2V0KHNwYWNlTnVtKQorCisgICAgZGVmIExvYWRUaGVtZUNmZyhzZWxmKToKKyAgICAgICAgIyNjdXJyZW50IHRoZW1lIHR5cGUgcmFkaW9idXR0b24KKyAgICAgICAgc2VsZi50aGVtZUlzQnVpbHRpbi5zZXQoaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnVGhlbWUnLCdkZWZhdWx0JywKKyAgICAgICAgICAgIHR5cGU9J2Jvb2wnLGRlZmF1bHQ9MSkpCisgICAgICAgICMjY3VycmVudGx5IHNldCB0aGVtZQorICAgICAgICBjdXJyZW50T3B0aW9uPWlkbGVDb25mLkN1cnJlbnRUaGVtZSgpCisgICAgICAgICMjbG9hZCBhdmFpbGFibGUgdGhlbWUgb3B0aW9uIG1lbnVzCisgICAgICAgIGlmIHNlbGYudGhlbWVJc0J1aWx0aW4uZ2V0KCk6ICNkZWZhdWx0IHRoZW1lIHNlbGVjdGVkCisgICAgICAgICAgICBpdGVtTGlzdD1pZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgnZGVmYXVsdCcsJ2hpZ2hsaWdodCcpCisgICAgICAgICAgICBpdGVtTGlzdC5zb3J0KCkKKyAgICAgICAgICAgIHNlbGYub3B0TWVudVRoZW1lQnVpbHRpbi5TZXRNZW51KGl0ZW1MaXN0LGN1cnJlbnRPcHRpb24pCisgICAgICAgICAgICBpdGVtTGlzdD1pZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgndXNlcicsJ2hpZ2hsaWdodCcpCisgICAgICAgICAgICBpdGVtTGlzdC5zb3J0KCkKKyAgICAgICAgICAgIGlmIG5vdCBpdGVtTGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLnJhZGlvVGhlbWVDdXN0b20uY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICAgICAgICAgIHNlbGYuY3VzdG9tVGhlbWUuc2V0KCctIG5vIGN1c3RvbSB0aGVtZXMgLScpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYub3B0TWVudVRoZW1lQ3VzdG9tLlNldE1lbnUoaXRlbUxpc3QsaXRlbUxpc3RbMF0pCisgICAgICAgIGVsc2U6ICN1c2VyIHRoZW1lIHNlbGVjdGVkCisgICAgICAgICAgICBpdGVtTGlzdD1pZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgndXNlcicsJ2hpZ2hsaWdodCcpCisgICAgICAgICAgICBpdGVtTGlzdC5zb3J0KCkKKyAgICAgICAgICAgIHNlbGYub3B0TWVudVRoZW1lQ3VzdG9tLlNldE1lbnUoaXRlbUxpc3QsY3VycmVudE9wdGlvbikKKyAgICAgICAgICAgIGl0ZW1MaXN0PWlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCdkZWZhdWx0JywnaGlnaGxpZ2h0JykKKyAgICAgICAgICAgIGl0ZW1MaXN0LnNvcnQoKQorICAgICAgICAgICAgc2VsZi5vcHRNZW51VGhlbWVCdWlsdGluLlNldE1lbnUoaXRlbUxpc3QsaXRlbUxpc3RbMF0pCisgICAgICAgIHNlbGYuU2V0VGhlbWVUeXBlKCkKKyAgICAgICAgIyNsb2FkIHRoZW1lIGVsZW1lbnQgb3B0aW9uIG1lbnUKKyAgICAgICAgdGhlbWVOYW1lcz1zZWxmLnRoZW1lRWxlbWVudHMua2V5cygpCisgICAgICAgIHRoZW1lTmFtZXMuc29ydChrZXk9bGFtYmRhIHg6IHNlbGYudGhlbWVFbGVtZW50c1t4XVsxXSkKKyAgICAgICAgc2VsZi5vcHRNZW51SGlnaGxpZ2h0VGFyZ2V0LlNldE1lbnUodGhlbWVOYW1lcyx0aGVtZU5hbWVzWzBdKQorICAgICAgICBzZWxmLlBhaW50VGhlbWVTYW1wbGUoKQorICAgICAgICBzZWxmLlNldEhpZ2hsaWdodFRhcmdldCgpCisKKyAgICBkZWYgTG9hZEtleUNmZyhzZWxmKToKKyAgICAgICAgIyNjdXJyZW50IGtleXMgdHlwZSByYWRpb2J1dHRvbgorICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluLnNldChpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdLZXlzJywnZGVmYXVsdCcsCisgICAgICAgICAgICB0eXBlPSdib29sJyxkZWZhdWx0PTEpKQorICAgICAgICAjI2N1cnJlbnRseSBzZXQga2V5cworICAgICAgICBjdXJyZW50T3B0aW9uPWlkbGVDb25mLkN1cnJlbnRLZXlzKCkKKyAgICAgICAgIyNsb2FkIGF2YWlsYWJsZSBrZXlzZXQgb3B0aW9uIG1lbnVzCisgICAgICAgIGlmIHNlbGYua2V5c0FyZUJ1aWx0aW4uZ2V0KCk6ICNkZWZhdWx0IHRoZW1lIHNlbGVjdGVkCisgICAgICAgICAgICBpdGVtTGlzdD1pZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgnZGVmYXVsdCcsJ2tleXMnKQorICAgICAgICAgICAgaXRlbUxpc3Quc29ydCgpCisgICAgICAgICAgICBzZWxmLm9wdE1lbnVLZXlzQnVpbHRpbi5TZXRNZW51KGl0ZW1MaXN0LGN1cnJlbnRPcHRpb24pCisgICAgICAgICAgICBpdGVtTGlzdD1pZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgndXNlcicsJ2tleXMnKQorICAgICAgICAgICAgaXRlbUxpc3Quc29ydCgpCisgICAgICAgICAgICBpZiBub3QgaXRlbUxpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5yYWRpb0tleXNDdXN0b20uY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICAgICAgICAgIHNlbGYuY3VzdG9tS2V5cy5zZXQoJy0gbm8gY3VzdG9tIGtleXMgLScpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNDdXN0b20uU2V0TWVudShpdGVtTGlzdCxpdGVtTGlzdFswXSkKKyAgICAgICAgZWxzZTogI3VzZXIga2V5IHNldCBzZWxlY3RlZAorICAgICAgICAgICAgaXRlbUxpc3Q9aWRsZUNvbmYuR2V0U2VjdGlvbkxpc3QoJ3VzZXInLCdrZXlzJykKKyAgICAgICAgICAgIGl0ZW1MaXN0LnNvcnQoKQorICAgICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0N1c3RvbS5TZXRNZW51KGl0ZW1MaXN0LGN1cnJlbnRPcHRpb24pCisgICAgICAgICAgICBpdGVtTGlzdD1pZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgnZGVmYXVsdCcsJ2tleXMnKQorICAgICAgICAgICAgaXRlbUxpc3Quc29ydCgpCisgICAgICAgICAgICBzZWxmLm9wdE1lbnVLZXlzQnVpbHRpbi5TZXRNZW51KGl0ZW1MaXN0LGl0ZW1MaXN0WzBdKQorICAgICAgICBzZWxmLlNldEtleXNUeXBlKCkKKyAgICAgICAgIyNsb2FkIGtleXNldCBlbGVtZW50IGxpc3QKKyAgICAgICAga2V5U2V0TmFtZT1pZGxlQ29uZi5DdXJyZW50S2V5cygpCisgICAgICAgIHNlbGYuTG9hZEtleXNMaXN0KGtleVNldE5hbWUpCisKKyAgICBkZWYgTG9hZEdlbmVyYWxDZmcoc2VsZik6CisgICAgICAgICNzdGFydHVwIHN0YXRlCisgICAgICAgIHNlbGYuc3RhcnR1cEVkaXQuc2V0KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0dlbmVyYWwnLAorICAgICAgICAgICAgICAgICdlZGl0b3Itb24tc3RhcnR1cCcsZGVmYXVsdD0xLHR5cGU9J2Jvb2wnKSkKKyAgICAgICAgI2F1dG9zYXZlIHN0YXRlCisgICAgICAgIHNlbGYuYXV0b1NhdmUuc2V0KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdHZW5lcmFsJywgJ2F1dG9zYXZlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9MCwgdHlwZT0nYm9vbCcpKQorICAgICAgICAjaW5pdGlhbCB3aW5kb3cgc2l6ZQorICAgICAgICBzZWxmLndpbldpZHRoLnNldChpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCd3aWR0aCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdpbnQnKSkKKyAgICAgICAgc2VsZi53aW5IZWlnaHQuc2V0KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0VkaXRvcldpbmRvdycsJ2hlaWdodCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0naW50JykpCisgICAgICAgICNpbml0aWFsIHBhcmFncmFwaCByZWZvcm1hdCBzaXplCisgICAgICAgIHNlbGYucGFyYVdpZHRoLnNldChpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdGb3JtYXRQYXJhZ3JhcGgnLCdwYXJhZ3JhcGgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2ludCcpKQorICAgICAgICAjIGRlZmF1bHQgc291cmNlIGVuY29kaW5nCisgICAgICAgIHNlbGYuZW5jb2Rpbmcuc2V0KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdFZGl0b3JXaW5kb3cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJywgZGVmYXVsdD0nbm9uZScpKQorICAgICAgICAjIGFkZGl0aW9uYWwgaGVscCBzb3VyY2VzCisgICAgICAgIHNlbGYudXNlckhlbHBMaXN0ID0gaWRsZUNvbmYuR2V0QWxsRXh0cmFIZWxwU291cmNlc0xpc3QoKQorICAgICAgICBmb3IgaGVscEl0ZW0gaW4gc2VsZi51c2VySGVscExpc3Q6CisgICAgICAgICAgICBzZWxmLmxpc3RIZWxwLmluc2VydChFTkQsaGVscEl0ZW1bMF0pCisgICAgICAgIHNlbGYuU2V0SGVscExpc3RCdXR0b25TdGF0ZXMoKQorCisgICAgZGVmIExvYWRDb25maWdzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgbG9hZCBjb25maWd1cmF0aW9uIGZyb20gZGVmYXVsdCBhbmQgdXNlciBjb25maWcgZmlsZXMgYW5kIHBvcHVsYXRlCisgICAgICAgIHRoZSB3aWRnZXRzIG9uIHRoZSBjb25maWcgZGlhbG9nIHBhZ2VzLgorICAgICAgICAiIiIKKyAgICAgICAgIyMjIGZvbnRzIC8gdGFicyBwYWdlCisgICAgICAgIHNlbGYuTG9hZEZvbnRDZmcoKQorICAgICAgICBzZWxmLkxvYWRUYWJDZmcoKQorICAgICAgICAjIyMgaGlnaGxpZ2h0aW5nIHBhZ2UKKyAgICAgICAgc2VsZi5Mb2FkVGhlbWVDZmcoKQorICAgICAgICAjIyMga2V5cyBwYWdlCisgICAgICAgIHNlbGYuTG9hZEtleUNmZygpCisgICAgICAgICMjIyBnZW5lcmFsIHBhZ2UKKyAgICAgICAgc2VsZi5Mb2FkR2VuZXJhbENmZygpCisKKyAgICBkZWYgU2F2ZU5ld0tleVNldChzZWxmLGtleVNldE5hbWUsa2V5U2V0KToKKyAgICAgICAgIiIiCisgICAgICAgIHNhdmUgYSBuZXdseSBjcmVhdGVkIGNvcmUga2V5IHNldC4KKyAgICAgICAga2V5U2V0TmFtZSAtIHN0cmluZywgdGhlIG5hbWUgb2YgdGhlIG5ldyBrZXkgc2V0CisgICAgICAgIGtleVNldCAtIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgbmV3IGtleSBzZXQKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpZGxlQ29uZi51c2VyQ2ZnWydrZXlzJ10uaGFzX3NlY3Rpb24oa2V5U2V0TmFtZSk6CisgICAgICAgICAgICBpZGxlQ29uZi51c2VyQ2ZnWydrZXlzJ10uYWRkX3NlY3Rpb24oa2V5U2V0TmFtZSkKKyAgICAgICAgZm9yIGV2ZW50IGluIGtleVNldC5rZXlzKCk6CisgICAgICAgICAgICB2YWx1ZT1rZXlTZXRbZXZlbnRdCisgICAgICAgICAgICBpZGxlQ29uZi51c2VyQ2ZnWydrZXlzJ10uU2V0T3B0aW9uKGtleVNldE5hbWUsZXZlbnQsdmFsdWUpCisKKyAgICBkZWYgU2F2ZU5ld1RoZW1lKHNlbGYsdGhlbWVOYW1lLHRoZW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIHNhdmUgYSBuZXdseSBjcmVhdGVkIHRoZW1lLgorICAgICAgICB0aGVtZU5hbWUgLSBzdHJpbmcsIHRoZSBuYW1lIG9mIHRoZSBuZXcgdGhlbWUKKyAgICAgICAgdGhlbWUgLSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG5ldyB0aGVtZQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlkbGVDb25mLnVzZXJDZmdbJ2hpZ2hsaWdodCddLmhhc19zZWN0aW9uKHRoZW1lTmFtZSk6CisgICAgICAgICAgICBpZGxlQ29uZi51c2VyQ2ZnWydoaWdobGlnaHQnXS5hZGRfc2VjdGlvbih0aGVtZU5hbWUpCisgICAgICAgIGZvciBlbGVtZW50IGluIHRoZW1lLmtleXMoKToKKyAgICAgICAgICAgIHZhbHVlPXRoZW1lW2VsZW1lbnRdCisgICAgICAgICAgICBpZGxlQ29uZi51c2VyQ2ZnWydoaWdobGlnaHQnXS5TZXRPcHRpb24odGhlbWVOYW1lLGVsZW1lbnQsdmFsdWUpCisKKyAgICBkZWYgU2V0VXNlclZhbHVlKHNlbGYsY29uZmlnVHlwZSxzZWN0aW9uLGl0ZW0sdmFsdWUpOgorICAgICAgICBpZiBpZGxlQ29uZi5kZWZhdWx0Q2ZnW2NvbmZpZ1R5cGVdLmhhc19vcHRpb24oc2VjdGlvbixpdGVtKToKKyAgICAgICAgICAgIGlmIGlkbGVDb25mLmRlZmF1bHRDZmdbY29uZmlnVHlwZV0uR2V0KHNlY3Rpb24saXRlbSk9PXZhbHVlOgorICAgICAgICAgICAgICAgICN0aGUgc2V0dGluZyBlcXVhbHMgYSBkZWZhdWx0IHNldHRpbmcsIHJlbW92ZSBpdCBmcm9tIHVzZXIgY2ZnCisgICAgICAgICAgICAgICAgcmV0dXJuIGlkbGVDb25mLnVzZXJDZmdbY29uZmlnVHlwZV0uUmVtb3ZlT3B0aW9uKHNlY3Rpb24saXRlbSkKKyAgICAgICAgI2lmIHdlIGdvdCBoZXJlIHNldCB0aGUgb3B0aW9uCisgICAgICAgIHJldHVybiBpZGxlQ29uZi51c2VyQ2ZnW2NvbmZpZ1R5cGVdLlNldE9wdGlvbihzZWN0aW9uLGl0ZW0sdmFsdWUpCisKKyAgICBkZWYgU2F2ZUFsbENoYW5nZWRDb25maWdzKHNlbGYpOgorICAgICAgICAiU2F2ZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgdG8gdGhlIHVzZXIgY29uZmlnIGZpbGUuIgorICAgICAgICBpZGxlQ29uZi51c2VyQ2ZnWydtYWluJ10uU2F2ZSgpCisgICAgICAgIGZvciBjb25maWdUeXBlIGluIHNlbGYuY2hhbmdlZEl0ZW1zLmtleXMoKToKKyAgICAgICAgICAgIGNmZ1R5cGVIYXNDaGFuZ2VzID0gRmFsc2UKKyAgICAgICAgICAgIGZvciBzZWN0aW9uIGluIHNlbGYuY2hhbmdlZEl0ZW1zW2NvbmZpZ1R5cGVdLmtleXMoKToKKyAgICAgICAgICAgICAgICBpZiBzZWN0aW9uID09ICdIZWxwRmlsZXMnOgorICAgICAgICAgICAgICAgICAgICAjdGhpcyBzZWN0aW9uIGdldHMgY29tcGxldGVseSByZXBsYWNlZAorICAgICAgICAgICAgICAgICAgICBpZGxlQ29uZi51c2VyQ2ZnWydtYWluJ10ucmVtb3ZlX3NlY3Rpb24oJ0hlbHBGaWxlcycpCisgICAgICAgICAgICAgICAgICAgIGNmZ1R5cGVIYXNDaGFuZ2VzID0gVHJ1ZQorICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHNlbGYuY2hhbmdlZEl0ZW1zW2NvbmZpZ1R5cGVdW3NlY3Rpb25dLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmNoYW5nZWRJdGVtc1tjb25maWdUeXBlXVtzZWN0aW9uXVtpdGVtXQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLlNldFVzZXJWYWx1ZShjb25maWdUeXBlLHNlY3Rpb24saXRlbSx2YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBjZmdUeXBlSGFzQ2hhbmdlcyA9IFRydWUKKyAgICAgICAgICAgIGlmIGNmZ1R5cGVIYXNDaGFuZ2VzOgorICAgICAgICAgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbY29uZmlnVHlwZV0uU2F2ZSgpCisgICAgICAgIGZvciBjb25maWdUeXBlIGluIFsna2V5cycsICdoaWdobGlnaHQnXToKKyAgICAgICAgICAgICMgc2F2ZSB0aGVzZSBldmVuIGlmIHVuY2hhbmdlZCEKKyAgICAgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbY29uZmlnVHlwZV0uU2F2ZSgpCisgICAgICAgIHNlbGYuUmVzZXRDaGFuZ2VkSXRlbXMoKSAjY2xlYXIgdGhlIGNoYW5nZWQgaXRlbXMgZGljdAorCisgICAgZGVmIERlYWN0aXZhdGVDdXJyZW50Q29uZmlnKHNlbGYpOgorICAgICAgICAjQmVmb3JlIGEgY29uZmlnIGlzIHNhdmVkLCBzb21lIGNsZWFudXAgb2YgY3VycmVudAorICAgICAgICAjY29uZmlnIG11c3QgYmUgZG9uZSAtIHJlbW92ZSB0aGUgcHJldmlvdXMga2V5YmluZGluZ3MKKyAgICAgICAgd2luSW5zdGFuY2VzPXNlbGYucGFyZW50Lmluc3RhbmNlX2RpY3Qua2V5cygpCisgICAgICAgIGZvciBpbnN0YW5jZSBpbiB3aW5JbnN0YW5jZXM6CisgICAgICAgICAgICBpbnN0YW5jZS5SZW1vdmVLZXliaW5kaW5ncygpCisKKyAgICBkZWYgQWN0aXZhdGVDb25maWdDaGFuZ2VzKHNlbGYpOgorICAgICAgICAiRHluYW1pY2FsbHkgYXBwbHkgY29uZmlndXJhdGlvbiBjaGFuZ2VzIgorICAgICAgICB3aW5JbnN0YW5jZXM9c2VsZi5wYXJlbnQuaW5zdGFuY2VfZGljdC5rZXlzKCkKKyAgICAgICAgZm9yIGluc3RhbmNlIGluIHdpbkluc3RhbmNlczoKKyAgICAgICAgICAgIGluc3RhbmNlLlJlc2V0Q29sb3JpemVyKCkKKyAgICAgICAgICAgIGluc3RhbmNlLlJlc2V0Rm9udCgpCisgICAgICAgICAgICBpbnN0YW5jZS5zZXRfbm90YWJzX2luZGVudHdpZHRoKCkKKyAgICAgICAgICAgIGluc3RhbmNlLkFwcGx5S2V5YmluZGluZ3MoKQorICAgICAgICAgICAgaW5zdGFuY2UucmVzZXRfaGVscF9tZW51X2VudHJpZXMoKQorCisgICAgZGVmIENhbmNlbChzZWxmKToKKyAgICAgICAgc2VsZi5kZXN0cm95KCkKKworICAgIGRlZiBPayhzZWxmKToKKyAgICAgICAgc2VsZi5BcHBseSgpCisgICAgICAgIHNlbGYuZGVzdHJveSgpCisKKyAgICBkZWYgQXBwbHkoc2VsZik6CisgICAgICAgIHNlbGYuRGVhY3RpdmF0ZUN1cnJlbnRDb25maWcoKQorICAgICAgICBzZWxmLlNhdmVBbGxDaGFuZ2VkQ29uZmlncygpCisgICAgICAgIHNlbGYuQWN0aXZhdGVDb25maWdDaGFuZ2VzKCkKKworICAgIGRlZiBIZWxwKHNlbGYpOgorICAgICAgICBwYXNzCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgI3Rlc3QgdGhlIGRpYWxvZworICAgIHJvb3Q9VGsoKQorICAgIEJ1dHRvbihyb290LHRleHQ9J0RpYWxvZycsCisgICAgICAgICAgICBjb21tYW5kPWxhbWJkYTpDb25maWdEaWFsb2cocm9vdCwnU2V0dGluZ3MnKSkucGFjaygpCisgICAgcm9vdC5pbnN0YW5jZV9kaWN0PXt9CisgICAgcm9vdC5tYWlubG9vcCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnRGlhbG9nLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdEaWFsb2cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNTM0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnRGlhbG9nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnRGlhbG9nLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdEaWFsb2cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNTM0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnRGlhbG9nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnSGFuZGxlci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjhkMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnSGFuZGxlci5weQpAQCAtMCwwICsxLDcxOSBAQAorIiIiUHJvdmlkZXMgYWNjZXNzIHRvIHN0b3JlZCBJRExFIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisKK1JlZmVyIHRvIHRoZSBjb21tZW50cyBhdCB0aGUgYmVnaW5uaW5nIG9mIGNvbmZpZy1tYWluLmRlZiBmb3IgYSBkZXNjcmlwdGlvbiBvZgordGhlIGF2YWlsYWJsZSBjb25maWd1cmF0aW9uIGZpbGVzIGFuZCB0aGUgZGVzaWduIGltcGxlbWVudGVkIHRvIHVwZGF0ZSB1c2VyCitjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAgSW4gcGFydGljdWxhciwgdXNlciBjb25maWd1cmF0aW9uIGNob2ljZXMgd2hpY2gKK2R1cGxpY2F0ZSB0aGUgZGVmYXVsdHMgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIHVzZXIncyBjb25maWd1cmF0aW9uIGZpbGVzLAorYW5kIGlmIGEgZmlsZSBiZWNvbWVzIGVtcHR5LCBpdCB3aWxsIGJlIGRlbGV0ZWQuCisKK1RoZSBjb250ZW50cyBvZiB0aGUgdXNlciBmaWxlcyBtYXkgYmUgYWx0ZXJlZCB1c2luZyB0aGUgT3B0aW9ucy9Db25maWd1cmUgSURMRQorbWVudSB0byBhY2Nlc3MgdGhlIGNvbmZpZ3VyYXRpb24gR1VJIChjb25maWdEaWFsb2cucHkpLCBvciBtYW51YWxseS4KKworVGhyb3VnaG91dCB0aGlzIG1vZHVsZSB0aGVyZSBpcyBhbiBlbXBoYXNpcyBvbiByZXR1cm5pbmcgdXNlYWJsZSBkZWZhdWx0cword2hlbiBhIHByb2JsZW0gb2NjdXJzIGluIHJldHVybmluZyBhIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIHZhbHVlIGJhY2sgdG8KK2lkbGUuIFRoaXMgaXMgdG8gYWxsb3cgSURMRSB0byBjb250aW51ZSB0byBmdW5jdGlvbiBpbiBzcGl0ZSBvZiBlcnJvcnMgaW4KK3RoZSByZXRyaWV2YWwgb2YgY29uZmlnIGluZm9ybWF0aW9uLiBXaGVuIGEgZGVmYXVsdCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mCithIHJlcXVlc3RlZCBjb25maWcgdmFsdWUsIGEgbWVzc2FnZSBpcyBwcmludGVkIHRvIHN0ZGVyciB0byBhaWQgaW4KK2NvbmZpZ3VyYXRpb24gcHJvYmxlbSBub3RpZmljYXRpb24gYW5kIHJlc29sdXRpb24uCisKKyIiIgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc3RyaW5nCitmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKK2Zyb20gQ29uZmlnUGFyc2VyIGltcG9ydCBDb25maWdQYXJzZXIsIE5vT3B0aW9uRXJyb3IsIE5vU2VjdGlvbkVycm9yCisKK2NsYXNzIEludmFsaWRDb25maWdUeXBlKEV4Y2VwdGlvbik6IHBhc3MKK2NsYXNzIEludmFsaWRDb25maWdTZXQoRXhjZXB0aW9uKTogcGFzcworY2xhc3MgSW52YWxpZEZnQmcoRXhjZXB0aW9uKTogcGFzcworY2xhc3MgSW52YWxpZFRoZW1lKEV4Y2VwdGlvbik6IHBhc3MKKworY2xhc3MgSWRsZUNvbmZQYXJzZXIoQ29uZmlnUGFyc2VyKToKKyAgICAiIiIKKyAgICBBIENvbmZpZ1BhcnNlciBzcGVjaWFsaXNlZCBmb3IgaWRsZSBjb25maWd1cmF0aW9uIGZpbGUgaGFuZGxpbmcKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2ZnRmlsZSwgY2ZnRGVmYXVsdHM9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBjZmdGaWxlIC0gc3RyaW5nLCBmdWxseSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiBmaWxlIG5hbWUKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZmlsZT1jZmdGaWxlCisgICAgICAgIENvbmZpZ1BhcnNlci5fX2luaXRfXyhzZWxmLGRlZmF1bHRzPWNmZ0RlZmF1bHRzKQorCisgICAgZGVmIEdldChzZWxmLCBzZWN0aW9uLCBvcHRpb24sIHR5cGU9Tm9uZSwgZGVmYXVsdD1Ob25lLCByYXc9RmFsc2UpOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IGFuIG9wdGlvbiB2YWx1ZSBmb3IgZ2l2ZW4gc2VjdGlvbi9vcHRpb24gb3IgcmV0dXJuIGRlZmF1bHQuCisgICAgICAgIElmIHR5cGUgaXMgc3BlY2lmaWVkLCByZXR1cm4gYXMgdHlwZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLmhhc19vcHRpb24oc2VjdGlvbiwgb3B0aW9uKToKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgICAgIGlmIHR5cGU9PSdib29sJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdldGJvb2xlYW4oc2VjdGlvbiwgb3B0aW9uKQorICAgICAgICBlbGlmIHR5cGU9PSdpbnQnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0aW50KHNlY3Rpb24sIG9wdGlvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdldChzZWN0aW9uLCBvcHRpb24sIHJhdz1yYXcpCisKKyAgICBkZWYgR2V0T3B0aW9uTGlzdChzZWxmLHNlY3Rpb24pOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IGFuIG9wdGlvbiBsaXN0IGZvciBnaXZlbiBzZWN0aW9uCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmhhc19zZWN0aW9uKHNlY3Rpb24pOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYub3B0aW9ucyhzZWN0aW9uKQorICAgICAgICBlbHNlOiAgI3JldHVybiBhIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgZGVmIExvYWQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBMb2FkIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgZnJvbSBkaXNrCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJlYWQoc2VsZi5maWxlKQorCitjbGFzcyBJZGxlVXNlckNvbmZQYXJzZXIoSWRsZUNvbmZQYXJzZXIpOgorICAgICIiIgorICAgIElkbGVDb25maWdQYXJzZXIgc3BlY2lhbGlzZWQgZm9yIHVzZXIgY29uZmlndXJhdGlvbiBoYW5kbGluZy4KKyAgICAiIiIKKworICAgIGRlZiBBZGRTZWN0aW9uKHNlbGYsc2VjdGlvbik6CisgICAgICAgICIiIgorICAgICAgICBpZiBzZWN0aW9uIGRvZXNuJ3QgZXhpc3QsIGFkZCBpdAorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuaGFzX3NlY3Rpb24oc2VjdGlvbik6CisgICAgICAgICAgICBzZWxmLmFkZF9zZWN0aW9uKHNlY3Rpb24pCisKKyAgICBkZWYgUmVtb3ZlRW1wdHlTZWN0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIHJlbW92ZSBhbnkgc2VjdGlvbnMgdGhhdCBoYXZlIG5vIG9wdGlvbnMKKyAgICAgICAgIiIiCisgICAgICAgIGZvciBzZWN0aW9uIGluIHNlbGYuc2VjdGlvbnMoKToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLkdldE9wdGlvbkxpc3Qoc2VjdGlvbik6CisgICAgICAgICAgICAgICAgc2VsZi5yZW1vdmVfc2VjdGlvbihzZWN0aW9uKQorCisgICAgZGVmIElzRW1wdHkoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZW1vdmUgZW1wdHkgc2VjdGlvbnMgYW5kIHRoZW4gcmV0dXJuIDEgaWYgcGFyc2VyIGhhcyBubyBzZWN0aW9ucworICAgICAgICBsZWZ0LCBlbHNlIHJldHVybiAwLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5SZW1vdmVFbXB0eVNlY3Rpb25zKCkKKyAgICAgICAgaWYgc2VsZi5zZWN0aW9ucygpOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgUmVtb3ZlT3B0aW9uKHNlbGYsc2VjdGlvbixvcHRpb24pOgorICAgICAgICAiIiIKKyAgICAgICAgSWYgc2VjdGlvbi9vcHRpb24gZXhpc3RzLCByZW1vdmUgaXQuCisgICAgICAgIFJldHVybnMgMSBpZiBvcHRpb24gd2FzIHJlbW92ZWQsIDAgb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5oYXNfc2VjdGlvbihzZWN0aW9uKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJlbW92ZV9vcHRpb24oc2VjdGlvbixvcHRpb24pCisKKyAgICBkZWYgU2V0T3B0aW9uKHNlbGYsc2VjdGlvbixvcHRpb24sdmFsdWUpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0cyBvcHRpb24gdG8gdmFsdWUsIGFkZGluZyBzZWN0aW9uIGlmIHJlcXVpcmVkLgorICAgICAgICBSZXR1cm5zIDEgaWYgb3B0aW9uIHdhcyBhZGRlZCBvciBjaGFuZ2VkLCBvdGhlcndpc2UgMC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuaGFzX29wdGlvbihzZWN0aW9uLG9wdGlvbik6CisgICAgICAgICAgICBpZiBzZWxmLmdldChzZWN0aW9uLG9wdGlvbik9PXZhbHVlOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0KHNlY3Rpb24sb3B0aW9uLHZhbHVlKQorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5oYXNfc2VjdGlvbihzZWN0aW9uKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9zZWN0aW9uKHNlY3Rpb24pCisgICAgICAgICAgICBzZWxmLnNldChzZWN0aW9uLG9wdGlvbix2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgUmVtb3ZlRmlsZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlbW92ZXMgdGhlIHVzZXIgY29uZmlnIGZpbGUgZnJvbSBkaXNrIGlmIGl0IGV4aXN0cy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZmlsZSk6CisgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5maWxlKQorCisgICAgZGVmIFNhdmUoc2VsZik6CisgICAgICAgICIiIlVwZGF0ZSB1c2VyIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworICAgICAgICBSZW1vdmUgZW1wdHkgc2VjdGlvbnMuIElmIHJlc3VsdGluZyBjb25maWcgaXNuJ3QgZW1wdHksIHdyaXRlIHRoZSBmaWxlCisgICAgICAgIHRvIGRpc2suIElmIGNvbmZpZyBpcyBlbXB0eSwgcmVtb3ZlIHRoZSBmaWxlIGZyb20gZGlzayBpZiBpdCBleGlzdHMuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLklzRW1wdHkoKToKKyAgICAgICAgICAgIGZuYW1lID0gc2VsZi5maWxlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2ZnRmlsZSA9IG9wZW4oZm5hbWUsICd3JykKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhmbmFtZSkKKyAgICAgICAgICAgICAgICBjZmdGaWxlID0gb3BlbihmbmFtZSwgJ3cnKQorICAgICAgICAgICAgc2VsZi53cml0ZShjZmdGaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5SZW1vdmVGaWxlKCkKKworY2xhc3MgSWRsZUNvbmY6CisgICAgIiIiCisgICAgaG9sZHMgY29uZmlnIHBhcnNlcnMgZm9yIGFsbCBpZGxlIGNvbmZpZyBmaWxlczoKKyAgICBkZWZhdWx0IGNvbmZpZyBmaWxlcworICAgICAgICAoaWRsZSBpbnN0YWxsIGRpcikvY29uZmlnLW1haW4uZGVmCisgICAgICAgIChpZGxlIGluc3RhbGwgZGlyKS9jb25maWctZXh0ZW5zaW9ucy5kZWYKKyAgICAgICAgKGlkbGUgaW5zdGFsbCBkaXIpL2NvbmZpZy1oaWdobGlnaHQuZGVmCisgICAgICAgIChpZGxlIGluc3RhbGwgZGlyKS9jb25maWcta2V5cy5kZWYKKyAgICB1c2VyIGNvbmZpZyAgZmlsZXMKKyAgICAgICAgKHVzZXIgaG9tZSBkaXIpLy5pZGxlcmMvY29uZmlnLW1haW4uY2ZnCisgICAgICAgICh1c2VyIGhvbWUgZGlyKS8uaWRsZXJjL2NvbmZpZy1leHRlbnNpb25zLmNmZworICAgICAgICAodXNlciBob21lIGRpcikvLmlkbGVyYy9jb25maWctaGlnaGxpZ2h0LmNmZworICAgICAgICAodXNlciBob21lIGRpcikvLmlkbGVyYy9jb25maWcta2V5cy5jZmcKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZGVmYXVsdENmZz17fQorICAgICAgICBzZWxmLnVzZXJDZmc9e30KKyAgICAgICAgc2VsZi5jZmc9e30KKyAgICAgICAgc2VsZi5DcmVhdGVDb25maWdIYW5kbGVycygpCisgICAgICAgIHNlbGYuTG9hZENmZ0ZpbGVzKCkKKyAgICAgICAgI3NlbGYuTG9hZENmZygpCisKKyAgICBkZWYgQ3JlYXRlQ29uZmlnSGFuZGxlcnMoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBzZXQgdXAgYSBkaWN0aW9uYXJ5IG9mIGNvbmZpZyBwYXJzZXJzIGZvciBkZWZhdWx0IGFuZCB1c2VyCisgICAgICAgIGNvbmZpZ3VyYXRpb25zIHJlc3BlY3RpdmVseQorICAgICAgICAiIiIKKyAgICAgICAgI2J1aWxkIGlkbGUgaW5zdGFsbCBwYXRoCisgICAgICAgIGlmIF9fbmFtZV9fICE9ICdfX21haW5fXyc6ICMgd2Ugd2VyZSBpbXBvcnRlZAorICAgICAgICAgICAgaWRsZURpcj1vcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisgICAgICAgIGVsc2U6ICMgd2Ugd2VyZSBleGVjJ2VkIChmb3IgdGVzdGluZyBvbmx5KQorICAgICAgICAgICAgaWRsZURpcj1vcy5wYXRoLmFic3BhdGgoc3lzLnBhdGhbMF0pCisgICAgICAgIHVzZXJEaXI9c2VsZi5HZXRVc2VyQ2ZnRGlyKCkKKyAgICAgICAgY29uZmlnVHlwZXM9KCdtYWluJywnZXh0ZW5zaW9ucycsJ2hpZ2hsaWdodCcsJ2tleXMnKQorICAgICAgICBkZWZDZmdGaWxlcz17fQorICAgICAgICB1c3JDZmdGaWxlcz17fQorICAgICAgICBmb3IgY2ZnVHlwZSBpbiBjb25maWdUeXBlczogI2J1aWxkIGNvbmZpZyBmaWxlIG5hbWVzCisgICAgICAgICAgICBkZWZDZmdGaWxlc1tjZmdUeXBlXT1vcy5wYXRoLmpvaW4oaWRsZURpciwnY29uZmlnLScrY2ZnVHlwZSsnLmRlZicpCisgICAgICAgICAgICB1c3JDZmdGaWxlc1tjZmdUeXBlXT1vcy5wYXRoLmpvaW4odXNlckRpciwnY29uZmlnLScrY2ZnVHlwZSsnLmNmZycpCisgICAgICAgIGZvciBjZmdUeXBlIGluIGNvbmZpZ1R5cGVzOiAjY3JlYXRlIGNvbmZpZyBwYXJzZXJzCisgICAgICAgICAgICBzZWxmLmRlZmF1bHRDZmdbY2ZnVHlwZV09SWRsZUNvbmZQYXJzZXIoZGVmQ2ZnRmlsZXNbY2ZnVHlwZV0pCisgICAgICAgICAgICBzZWxmLnVzZXJDZmdbY2ZnVHlwZV09SWRsZVVzZXJDb25mUGFyc2VyKHVzckNmZ0ZpbGVzW2NmZ1R5cGVdKQorCisgICAgZGVmIEdldFVzZXJDZmdEaXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGVzIChpZiByZXF1aXJlZCkgYW5kIHJldHVybnMgYSBmaWxlc3lzdGVtIGRpcmVjdG9yeSBmb3Igc3RvcmluZworICAgICAgICB1c2VyIGNvbmZpZyBmaWxlcy4KKworICAgICAgICAiIiIKKyAgICAgICAgY2ZnRGlyID0gJy5pZGxlcmMnCisgICAgICAgIHVzZXJEaXIgPSBvcy5wYXRoLmV4cGFuZHVzZXIoJ34nKQorICAgICAgICBpZiB1c2VyRGlyICE9ICd+JzogIyBleHBhbmR1c2VyKCkgZm91bmQgdXNlciBob21lIGRpcgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHVzZXJEaXIpOgorICAgICAgICAgICAgICAgIHdhcm4gPSAoJ1xuIFdhcm5pbmc6IG9zLnBhdGguZXhwYW5kdXNlcigifiIpIHBvaW50cyB0b1xuICcrCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGlyKycsXG4gYnV0IHRoZSBwYXRoIGRvZXMgbm90IGV4aXN0LlxuJykKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUod2FybikKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHVzZXJEaXIgPSAnficKKyAgICAgICAgaWYgdXNlckRpciA9PSAifiI6ICMgc3RpbGwgbm8gcGF0aCB0byBob21lIQorICAgICAgICAgICAgIyB0cmFkaXRpb25hbGx5IElETEUgaGFzIGRlZmF1bHRlZCB0byBvcy5nZXRjd2QoKSwgaXMgdGhpcyBhZGVxdWF0ZT8KKyAgICAgICAgICAgIHVzZXJEaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICB1c2VyRGlyID0gb3MucGF0aC5qb2luKHVzZXJEaXIsIGNmZ0RpcikKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHVzZXJEaXIpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLm1rZGlyKHVzZXJEaXIpCisgICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgICAgIHdhcm4gPSAoJ1xuIFdhcm5pbmc6IHVuYWJsZSB0byBjcmVhdGUgdXNlciBjb25maWcgZGlyZWN0b3J5XG4nKworICAgICAgICAgICAgICAgICAgICAgICAgdXNlckRpcisnXG4gQ2hlY2sgcGF0aCBhbmQgcGVybWlzc2lvbnMuXG4gRXhpdGluZyFcblxuJykKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHdhcm4pCisgICAgICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdAorICAgICAgICByZXR1cm4gdXNlckRpcgorCisgICAgZGVmIEdldE9wdGlvbihzZWxmLCBjb25maWdUeXBlLCBzZWN0aW9uLCBvcHRpb24sIGRlZmF1bHQ9Tm9uZSwgdHlwZT1Ob25lLAorICAgICAgICAgICAgICAgICAgd2Fybl9vbl9kZWZhdWx0PVRydWUsIHJhdz1GYWxzZSk6CisgICAgICAgICIiIgorICAgICAgICBHZXQgYW4gb3B0aW9uIHZhbHVlIGZvciBnaXZlbiBjb25maWcgdHlwZSBhbmQgZ2l2ZW4gZ2VuZXJhbAorICAgICAgICBjb25maWd1cmF0aW9uIHNlY3Rpb24vb3B0aW9uIG9yIHJldHVybiBhIGRlZmF1bHQuIElmIHR5cGUgaXMgc3BlY2lmaWVkLAorICAgICAgICByZXR1cm4gYXMgdHlwZS4gRmlyc3RseSB0aGUgdXNlciBjb25maWd1cmF0aW9uIGlzIGNoZWNrZWQsIHdpdGggYQorICAgICAgICBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCBhbmQgYSBmaW5hbCAnY2F0Y2ggYWxsJworICAgICAgICBmYWxsYmFjayB0byBhIHVzZWFibGUgcGFzc2VkLWluIGRlZmF1bHQgaWYgdGhlIG9wdGlvbiBpc24ndCBwcmVzZW50IGluCisgICAgICAgIGVpdGhlciB0aGUgdXNlciBvciB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLgorICAgICAgICBjb25maWdUeXBlIG11c3QgYmUgb25lIG9mICgnbWFpbicsJ2V4dGVuc2lvbnMnLCdoaWdobGlnaHQnLCdrZXlzJykKKyAgICAgICAgSWYgYSBkZWZhdWx0IGlzIHJldHVybmVkLCBhbmQgd2Fybl9vbl9kZWZhdWx0IGlzIFRydWUsIGEgd2FybmluZyBpcworICAgICAgICBwcmludGVkIHRvIHN0ZGVyci4KKworICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi51c2VyQ2ZnW2NvbmZpZ1R5cGVdLmhhc19vcHRpb24oc2VjdGlvbixvcHRpb24pOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnVzZXJDZmdbY29uZmlnVHlwZV0uR2V0KHNlY3Rpb24sIG9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXR5cGUsIHJhdz1yYXcpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgd2FybmluZyA9ICgnXG4gV2FybmluZzogY29uZmlnSGFuZGxlci5weSAtIElkbGVDb25mLkdldE9wdGlvbiAtXG4nCisgICAgICAgICAgICAgICAgICAgICAgICcgaW52YWxpZCAlciB2YWx1ZSBmb3IgY29uZmlndXJhdGlvbiBvcHRpb24gJXJcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJyBmcm9tIHNlY3Rpb24gJXI6ICVyXG4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUsIG9wdGlvbiwgc2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXNlckNmZ1tjb25maWdUeXBlXS5HZXQoc2VjdGlvbiwgb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc9cmF3KSkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSh3YXJuaW5nKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLmRlZmF1bHRDZmdbY29uZmlnVHlwZV0uaGFzX29wdGlvbihzZWN0aW9uLG9wdGlvbik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVmYXVsdENmZ1tjb25maWdUeXBlXS5HZXQoc2VjdGlvbiwgb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9dHlwZSwgcmF3PXJhdykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICNyZXR1cm5pbmcgZGVmYXVsdCwgcHJpbnQgd2FybmluZworICAgICAgICBpZiB3YXJuX29uX2RlZmF1bHQ6CisgICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLnB5IC0gSWRsZUNvbmYuR2V0T3B0aW9uIC1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgJyBwcm9ibGVtIHJldHJpZXZpbmcgY29uZmlndXJhdGlvbiBvcHRpb24gJXJcbicKKyAgICAgICAgICAgICAgICAgICAgICAgJyBmcm9tIHNlY3Rpb24gJXIuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICcgcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWU6ICVyXG4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbiwgc2VjdGlvbiwgZGVmYXVsdCkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSh3YXJuaW5nKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gZGVmYXVsdAorCisgICAgZGVmIFNldE9wdGlvbihzZWxmLCBjb25maWdUeXBlLCBzZWN0aW9uLCBvcHRpb24sIHZhbHVlKToKKyAgICAgICAgIiIiSW4gdXNlcidzIGNvbmZpZyBmaWxlLCBzZXQgc2VjdGlvbidzIG9wdGlvbiB0byB2YWx1ZS4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi51c2VyQ2ZnW2NvbmZpZ1R5cGVdLlNldE9wdGlvbihzZWN0aW9uLCBvcHRpb24sIHZhbHVlKQorCisgICAgZGVmIEdldFNlY3Rpb25MaXN0KHNlbGYsIGNvbmZpZ1NldCwgY29uZmlnVHlwZSk6CisgICAgICAgICIiIgorICAgICAgICBHZXQgYSBsaXN0IG9mIHNlY3Rpb25zIGZyb20gZWl0aGVyIHRoZSB1c2VyIG9yIGRlZmF1bHQgY29uZmlnIGZvcgorICAgICAgICB0aGUgZ2l2ZW4gY29uZmlnIHR5cGUuCisgICAgICAgIGNvbmZpZ1NldCBtdXN0IGJlIGVpdGhlciAndXNlcicgb3IgJ2RlZmF1bHQnCisgICAgICAgIGNvbmZpZ1R5cGUgbXVzdCBiZSBvbmUgb2YgKCdtYWluJywnZXh0ZW5zaW9ucycsJ2hpZ2hsaWdodCcsJ2tleXMnKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IChjb25maWdUeXBlIGluICgnbWFpbicsJ2V4dGVuc2lvbnMnLCdoaWdobGlnaHQnLCdrZXlzJykpOgorICAgICAgICAgICAgcmFpc2UgSW52YWxpZENvbmZpZ1R5cGUsICdJbnZhbGlkIGNvbmZpZ1R5cGUgc3BlY2lmaWVkJworICAgICAgICBpZiBjb25maWdTZXQgPT0gJ3VzZXInOgorICAgICAgICAgICAgY2ZnUGFyc2VyPXNlbGYudXNlckNmZ1tjb25maWdUeXBlXQorICAgICAgICBlbGlmIGNvbmZpZ1NldCA9PSAnZGVmYXVsdCc6CisgICAgICAgICAgICBjZmdQYXJzZXI9c2VsZi5kZWZhdWx0Q2ZnW2NvbmZpZ1R5cGVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBJbnZhbGlkQ29uZmlnU2V0LCAnSW52YWxpZCBjb25maWdTZXQgc3BlY2lmaWVkJworICAgICAgICByZXR1cm4gY2ZnUGFyc2VyLnNlY3Rpb25zKCkKKworICAgIGRlZiBHZXRIaWdobGlnaHQoc2VsZiwgdGhlbWUsIGVsZW1lbnQsIGZnQmc9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gaW5kaXZpZHVhbCBoaWdobGlnaHRpbmcgdGhlbWUgZWxlbWVudHMuCisgICAgICAgIGZnQmcgLSBzdHJpbmcgKCdmZydvcidiZycpIG9yIE5vbmUsIGlmIE5vbmUgcmV0dXJuIGEgZGljdGlvbmFyeQorICAgICAgICBjb250YWluaW5nIGZnIGFuZCBiZyBjb2xvdXJzIChhcHByb3ByaWF0ZSBmb3IgcGFzc2luZyB0byBUa2ludGVyIGluLAorICAgICAgICBlLmcuLCBhIHRhZ19jb25maWcgY2FsbCksIG90aGVyd2lzZSBmZyBvciBiZyBjb2xvdXIgb25seSBhcyBzcGVjaWZpZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmRlZmF1bHRDZmdbJ2hpZ2hsaWdodCddLmhhc19zZWN0aW9uKHRoZW1lKToKKyAgICAgICAgICAgIHRoZW1lRGljdD1zZWxmLkdldFRoZW1lRGljdCgnZGVmYXVsdCcsdGhlbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0aGVtZURpY3Q9c2VsZi5HZXRUaGVtZURpY3QoJ3VzZXInLHRoZW1lKQorICAgICAgICBmb3JlPXRoZW1lRGljdFtlbGVtZW50KyctZm9yZWdyb3VuZCddCisgICAgICAgIGlmIGVsZW1lbnQ9PSdjdXJzb3InOiAjdGhlcmUgaXMgbm8gY29uZmlnIHZhbHVlIGZvciBjdXJzb3IgYmcKKyAgICAgICAgICAgIGJhY2s9dGhlbWVEaWN0Wydub3JtYWwtYmFja2dyb3VuZCddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYWNrPXRoZW1lRGljdFtlbGVtZW50KyctYmFja2dyb3VuZCddCisgICAgICAgIGhpZ2hsaWdodD17ImZvcmVncm91bmQiOiBmb3JlLCJiYWNrZ3JvdW5kIjogYmFja30KKyAgICAgICAgaWYgbm90IGZnQmc6ICNyZXR1cm4gZGljdCBvZiBib3RoIGNvbG91cnMKKyAgICAgICAgICAgIHJldHVybiBoaWdobGlnaHQKKyAgICAgICAgZWxzZTogI3JldHVybiBzcGVjaWZpZWQgY29sb3VyIG9ubHkKKyAgICAgICAgICAgIGlmIGZnQmcgPT0gJ2ZnJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gaGlnaGxpZ2h0WyJmb3JlZ3JvdW5kIl0KKyAgICAgICAgICAgIGlmIGZnQmcgPT0gJ2JnJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gaGlnaGxpZ2h0WyJiYWNrZ3JvdW5kIl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgSW52YWxpZEZnQmcsICdJbnZhbGlkIGZnQmcgc3BlY2lmaWVkJworCisgICAgZGVmIEdldFRoZW1lRGljdChzZWxmLHR5cGUsdGhlbWVOYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIHR5cGUgLSBzdHJpbmcsICdkZWZhdWx0JyBvciAndXNlcicgdGhlbWUgdHlwZQorICAgICAgICB0aGVtZU5hbWUgLSBzdHJpbmcsIHRoZW1lIG5hbWUKKyAgICAgICAgUmV0dXJucyBhIGRpY3Rpb25hcnkgd2hpY2ggaG9sZHMge29wdGlvbjp2YWx1ZX0gZm9yIGVhY2ggZWxlbWVudAorICAgICAgICBpbiB0aGUgc3BlY2lmaWVkIHRoZW1lLiBWYWx1ZXMgYXJlIGxvYWRlZCBvdmVyIGEgc2V0IG9mIHVsdGltYXRlIGxhc3QKKyAgICAgICAgZmFsbGJhY2sgZGVmYXVsdHMgdG8gZ3VhcmFudGVlIHRoYXQgYWxsIHRoZW1lIGVsZW1lbnRzIGFyZSBwcmVzZW50IGluCisgICAgICAgIGEgbmV3bHkgY3JlYXRlZCB0aGVtZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHR5cGUgPT0gJ3VzZXInOgorICAgICAgICAgICAgY2ZnUGFyc2VyPXNlbGYudXNlckNmZ1snaGlnaGxpZ2h0J10KKyAgICAgICAgZWxpZiB0eXBlID09ICdkZWZhdWx0JzoKKyAgICAgICAgICAgIGNmZ1BhcnNlcj1zZWxmLmRlZmF1bHRDZmdbJ2hpZ2hsaWdodCddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBJbnZhbGlkVGhlbWUsICdJbnZhbGlkIHRoZW1lIHR5cGUgc3BlY2lmaWVkJworICAgICAgICAjZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCB2YWx1ZXMgYXJlIHByb3ZkZWQgZm9yIGVhY2ggdGhlbWUgZWxlbWVudAorICAgICAgICAjKGFwYXJ0IGZyb20gY3Vyc29yKSBldmVuIHRob3VnaCBhbGwgdGhlc2UgdmFsdWVzIGFyZSBub3QgeWV0IHVzZWQKKyAgICAgICAgI2J5IGlkbGUsIHRvIGFsbG93IGZvciB0aGVpciB1c2UgaW4gdGhlIGZ1dHVyZS4gRGVmYXVsdCB2YWx1ZXMgYXJlCisgICAgICAgICNnZW5lcmFsbHkgYmxhY2sgYW5kIHdoaXRlLgorICAgICAgICB0aGVtZT17ICdub3JtYWwtZm9yZWdyb3VuZCc6JyMwMDAwMDAnLAorICAgICAgICAgICAgICAgICdub3JtYWwtYmFja2dyb3VuZCc6JyNmZmZmZmYnLAorICAgICAgICAgICAgICAgICdrZXl3b3JkLWZvcmVncm91bmQnOicjMDAwMDAwJywKKyAgICAgICAgICAgICAgICAna2V5d29yZC1iYWNrZ3JvdW5kJzonI2ZmZmZmZicsCisgICAgICAgICAgICAgICAgJ2J1aWx0aW4tZm9yZWdyb3VuZCc6JyMwMDAwMDAnLAorICAgICAgICAgICAgICAgICdidWlsdGluLWJhY2tncm91bmQnOicjZmZmZmZmJywKKyAgICAgICAgICAgICAgICAnY29tbWVudC1mb3JlZ3JvdW5kJzonIzAwMDAwMCcsCisgICAgICAgICAgICAgICAgJ2NvbW1lbnQtYmFja2dyb3VuZCc6JyNmZmZmZmYnLAorICAgICAgICAgICAgICAgICdzdHJpbmctZm9yZWdyb3VuZCc6JyMwMDAwMDAnLAorICAgICAgICAgICAgICAgICdzdHJpbmctYmFja2dyb3VuZCc6JyNmZmZmZmYnLAorICAgICAgICAgICAgICAgICdkZWZpbml0aW9uLWZvcmVncm91bmQnOicjMDAwMDAwJywKKyAgICAgICAgICAgICAgICAnZGVmaW5pdGlvbi1iYWNrZ3JvdW5kJzonI2ZmZmZmZicsCisgICAgICAgICAgICAgICAgJ2hpbGl0ZS1mb3JlZ3JvdW5kJzonIzAwMDAwMCcsCisgICAgICAgICAgICAgICAgJ2hpbGl0ZS1iYWNrZ3JvdW5kJzonZ3JheScsCisgICAgICAgICAgICAgICAgJ2JyZWFrLWZvcmVncm91bmQnOicjZmZmZmZmJywKKyAgICAgICAgICAgICAgICAnYnJlYWstYmFja2dyb3VuZCc6JyMwMDAwMDAnLAorICAgICAgICAgICAgICAgICdoaXQtZm9yZWdyb3VuZCc6JyNmZmZmZmYnLAorICAgICAgICAgICAgICAgICdoaXQtYmFja2dyb3VuZCc6JyMwMDAwMDAnLAorICAgICAgICAgICAgICAgICdlcnJvci1mb3JlZ3JvdW5kJzonI2ZmZmZmZicsCisgICAgICAgICAgICAgICAgJ2Vycm9yLWJhY2tncm91bmQnOicjMDAwMDAwJywKKyAgICAgICAgICAgICAgICAjY3Vyc29yIChvbmx5IGZvcmVncm91bmQgY2FuIGJlIHNldCkKKyAgICAgICAgICAgICAgICAnY3Vyc29yLWZvcmVncm91bmQnOicjMDAwMDAwJywKKyAgICAgICAgICAgICAgICAjc2hlbGwgd2luZG93CisgICAgICAgICAgICAgICAgJ3N0ZG91dC1mb3JlZ3JvdW5kJzonIzAwMDAwMCcsCisgICAgICAgICAgICAgICAgJ3N0ZG91dC1iYWNrZ3JvdW5kJzonI2ZmZmZmZicsCisgICAgICAgICAgICAgICAgJ3N0ZGVyci1mb3JlZ3JvdW5kJzonIzAwMDAwMCcsCisgICAgICAgICAgICAgICAgJ3N0ZGVyci1iYWNrZ3JvdW5kJzonI2ZmZmZmZicsCisgICAgICAgICAgICAgICAgJ2NvbnNvbGUtZm9yZWdyb3VuZCc6JyMwMDAwMDAnLAorICAgICAgICAgICAgICAgICdjb25zb2xlLWJhY2tncm91bmQnOicjZmZmZmZmJyB9CisgICAgICAgIGZvciBlbGVtZW50IGluIHRoZW1lLmtleXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBjZmdQYXJzZXIuaGFzX29wdGlvbih0aGVtZU5hbWUsZWxlbWVudCk6CisgICAgICAgICAgICAgICAgI3dlIGFyZSBnb2luZyB0byByZXR1cm4gYSBkZWZhdWx0LCBwcmludCB3YXJuaW5nCisgICAgICAgICAgICAgICAgd2FybmluZz0oJ1xuIFdhcm5pbmc6IGNvbmZpZ0hhbmRsZXIucHkgLSBJZGxlQ29uZi5HZXRUaGVtZURpY3QnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnIC1cbiBwcm9ibGVtIHJldHJpZXZpbmcgdGhlbWUgZWxlbWVudCAlcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbiBmcm9tIHRoZW1lICVyLlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJyByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZTogJXJcbicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVsZW1lbnQsIHRoZW1lTmFtZSwgdGhlbWVbZWxlbWVudF0pKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSh3YXJuaW5nKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBjb2xvdXI9Y2ZnUGFyc2VyLkdldCh0aGVtZU5hbWUsZWxlbWVudCxkZWZhdWx0PXRoZW1lW2VsZW1lbnRdKQorICAgICAgICAgICAgdGhlbWVbZWxlbWVudF09Y29sb3VyCisgICAgICAgIHJldHVybiB0aGVtZQorCisgICAgZGVmIEN1cnJlbnRUaGVtZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgdGhlbWUKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLkdldE9wdGlvbignbWFpbicsJ1RoZW1lJywnbmFtZScsZGVmYXVsdD0nJykKKworICAgIGRlZiBDdXJyZW50S2V5cyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUga2V5IHNldAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuR2V0T3B0aW9uKCdtYWluJywnS2V5cycsJ25hbWUnLGRlZmF1bHQ9JycpCisKKyAgICBkZWYgR2V0RXh0ZW5zaW9ucyhzZWxmLCBhY3RpdmVfb25seT1UcnVlLCBlZGl0b3Jfb25seT1GYWxzZSwgc2hlbGxfb25seT1GYWxzZSk6CisgICAgICAgICIiIgorICAgICAgICBHZXRzIGEgbGlzdCBvZiBhbGwgaWRsZSBleHRlbnNpb25zIGRlY2xhcmVkIGluIHRoZSBjb25maWcgZmlsZXMuCisgICAgICAgIGFjdGl2ZV9vbmx5IC0gYm9vbGVhbiwgaWYgdHJ1ZSBvbmx5IHJldHVybiBhY3RpdmUgKGVuYWJsZWQpIGV4dGVuc2lvbnMKKyAgICAgICAgIiIiCisgICAgICAgIGV4dG5zPXNlbGYuUmVtb3ZlS2V5QmluZE5hbWVzKAorICAgICAgICAgICAgICAgIHNlbGYuR2V0U2VjdGlvbkxpc3QoJ2RlZmF1bHQnLCdleHRlbnNpb25zJykpCisgICAgICAgIHVzZXJFeHRucz1zZWxmLlJlbW92ZUtleUJpbmROYW1lcygKKyAgICAgICAgICAgICAgICBzZWxmLkdldFNlY3Rpb25MaXN0KCd1c2VyJywnZXh0ZW5zaW9ucycpKQorICAgICAgICBmb3IgZXh0biBpbiB1c2VyRXh0bnM6CisgICAgICAgICAgICBpZiBleHRuIG5vdCBpbiBleHRuczogI3VzZXIgaGFzIGFkZGVkIG93biBleHRlbnNpb24KKyAgICAgICAgICAgICAgICBleHRucy5hcHBlbmQoZXh0bikKKyAgICAgICAgaWYgYWN0aXZlX29ubHk6CisgICAgICAgICAgICBhY3RpdmVFeHRucz1bXQorICAgICAgICAgICAgZm9yIGV4dG4gaW4gZXh0bnM6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5HZXRPcHRpb24oJ2V4dGVuc2lvbnMnLCBleHRuLCAnZW5hYmxlJywgZGVmYXVsdD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2Jvb2wnKToKKyAgICAgICAgICAgICAgICAgICAgI3RoZSBleHRlbnNpb24gaXMgZW5hYmxlZAorICAgICAgICAgICAgICAgICAgICBpZiBlZGl0b3Jfb25seSBvciBzaGVsbF9vbmx5OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZWRpdG9yX29ubHk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gImVuYWJsZV9lZGl0b3IiCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJlbmFibGVfc2hlbGwiCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLkdldE9wdGlvbignZXh0ZW5zaW9ucycsIGV4dG4sb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD1UcnVlLCB0eXBlPSdib29sJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5fb25fZGVmYXVsdD1GYWxzZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRXh0bnMuYXBwZW5kKGV4dG4pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVFeHRucy5hcHBlbmQoZXh0bikKKyAgICAgICAgICAgIHJldHVybiBhY3RpdmVFeHRucworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGV4dG5zCisKKyAgICBkZWYgUmVtb3ZlS2V5QmluZE5hbWVzKHNlbGYsZXh0bk5hbWVMaXN0KToKKyAgICAgICAgI2dldCByaWQgb2Yga2V5YmluZGluZyBzZWN0aW9uIG5hbWVzCisgICAgICAgIG5hbWVzPWV4dG5OYW1lTGlzdAorICAgICAgICBrYk5hbWVJbmRpY2llcz1bXQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoKCdfYmluZGluZ3MnLCAnX2NmZ0JpbmRpbmdzJykpOgorICAgICAgICAgICAgICAgIGtiTmFtZUluZGljaWVzLmFwcGVuZChuYW1lcy5pbmRleChuYW1lKSkKKyAgICAgICAga2JOYW1lSW5kaWNpZXMuc29ydCgpCisgICAgICAgIGtiTmFtZUluZGljaWVzLnJldmVyc2UoKQorICAgICAgICBmb3IgaW5kZXggaW4ga2JOYW1lSW5kaWNpZXM6ICNkZWxldGUgZWFjaCBrZXliaW5kaW5nIHNlY3Rpb24gbmFtZQorICAgICAgICAgICAgZGVsKG5hbWVzW2luZGV4XSkKKyAgICAgICAgcmV0dXJuIG5hbWVzCisKKyAgICBkZWYgR2V0RXh0bk5hbWVGb3JFdmVudChzZWxmLHZpcnR1YWxFdmVudCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdGhhdCB2aXJ0dWFsRXZlbnQgaXMgYm91bmQgaW4sIG9yCisgICAgICAgIE5vbmUgaWYgbm90IGJvdW5kIGluIGFueSBleHRlbnNpb24uCisgICAgICAgIHZpcnR1YWxFdmVudCAtIHN0cmluZywgbmFtZSBvZiB0aGUgdmlydHVhbCBldmVudCB0byB0ZXN0IGZvciwgd2l0aG91dAorICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW5jbG9zaW5nICc8PCA+PicKKyAgICAgICAgIiIiCisgICAgICAgIGV4dE5hbWU9Tm9uZQorICAgICAgICB2RXZlbnQ9Jzw8Jyt2aXJ0dWFsRXZlbnQrJz4+JworICAgICAgICBmb3IgZXh0biBpbiBzZWxmLkdldEV4dGVuc2lvbnMoYWN0aXZlX29ubHk9MCk6CisgICAgICAgICAgICBmb3IgZXZlbnQgaW4gc2VsZi5HZXRFeHRlbnNpb25LZXlzKGV4dG4pLmtleXMoKToKKyAgICAgICAgICAgICAgICBpZiBldmVudCA9PSB2RXZlbnQ6CisgICAgICAgICAgICAgICAgICAgIGV4dE5hbWU9ZXh0bgorICAgICAgICByZXR1cm4gZXh0TmFtZQorCisgICAgZGVmIEdldEV4dGVuc2lvbktleXMoc2VsZixleHRlbnNpb25OYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybnMgYSBkaWN0aW9uYXJ5IG9mIHRoZSBjb25maWd1cmFibGUga2V5YmluZGluZ3MgZm9yIGEgcGFydGljdWxhcgorICAgICAgICBleHRlbnNpb24sYXMgdGhleSBleGlzdCBpbiB0aGUgZGljdGlvbmFyeSByZXR1cm5lZCBieSBHZXRDdXJyZW50S2V5U2V0OworICAgICAgICB0aGF0IGlzLCB3aGVyZSBwcmV2aW91c2x5IHVzZWQgYmluZGluZ3MgYXJlIGRpc2FibGVkLgorICAgICAgICAiIiIKKyAgICAgICAga2V5c05hbWU9ZXh0ZW5zaW9uTmFtZSsnX2NmZ0JpbmRpbmdzJworICAgICAgICBhY3RpdmVLZXlzPXNlbGYuR2V0Q3VycmVudEtleVNldCgpCisgICAgICAgIGV4dEtleXM9e30KKyAgICAgICAgaWYgc2VsZi5kZWZhdWx0Q2ZnWydleHRlbnNpb25zJ10uaGFzX3NlY3Rpb24oa2V5c05hbWUpOgorICAgICAgICAgICAgZXZlbnROYW1lcz1zZWxmLmRlZmF1bHRDZmdbJ2V4dGVuc2lvbnMnXS5HZXRPcHRpb25MaXN0KGtleXNOYW1lKQorICAgICAgICAgICAgZm9yIGV2ZW50TmFtZSBpbiBldmVudE5hbWVzOgorICAgICAgICAgICAgICAgIGV2ZW50PSc8PCcrZXZlbnROYW1lKyc+PicKKyAgICAgICAgICAgICAgICBiaW5kaW5nPWFjdGl2ZUtleXNbZXZlbnRdCisgICAgICAgICAgICAgICAgZXh0S2V5c1tldmVudF09YmluZGluZworICAgICAgICByZXR1cm4gZXh0S2V5cworCisgICAgZGVmIF9fR2V0UmF3RXh0ZW5zaW9uS2V5cyhzZWxmLGV4dGVuc2lvbk5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJucyBhIGRpY3Rpb25hcnkgb2YgdGhlIGNvbmZpZ3VyYWJsZSBrZXliaW5kaW5ncyBmb3IgYSBwYXJ0aWN1bGFyCisgICAgICAgIGV4dGVuc2lvbiwgYXMgZGVmaW5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlcywgb3IgYW4gZW1wdHkgZGljdGlvbmFyeQorICAgICAgICBpZiBubyBiaW5kaW5ncyBhcmUgZm91bmQKKyAgICAgICAgIiIiCisgICAgICAgIGtleXNOYW1lPWV4dGVuc2lvbk5hbWUrJ19jZmdCaW5kaW5ncycKKyAgICAgICAgZXh0S2V5cz17fQorICAgICAgICBpZiBzZWxmLmRlZmF1bHRDZmdbJ2V4dGVuc2lvbnMnXS5oYXNfc2VjdGlvbihrZXlzTmFtZSk6CisgICAgICAgICAgICBldmVudE5hbWVzPXNlbGYuZGVmYXVsdENmZ1snZXh0ZW5zaW9ucyddLkdldE9wdGlvbkxpc3Qoa2V5c05hbWUpCisgICAgICAgICAgICBmb3IgZXZlbnROYW1lIGluIGV2ZW50TmFtZXM6CisgICAgICAgICAgICAgICAgYmluZGluZz1zZWxmLkdldE9wdGlvbignZXh0ZW5zaW9ucycsa2V5c05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWUsZGVmYXVsdD0nJykuc3BsaXQoKQorICAgICAgICAgICAgICAgIGV2ZW50PSc8PCcrZXZlbnROYW1lKyc+PicKKyAgICAgICAgICAgICAgICBleHRLZXlzW2V2ZW50XT1iaW5kaW5nCisgICAgICAgIHJldHVybiBleHRLZXlzCisKKyAgICBkZWYgR2V0RXh0ZW5zaW9uQmluZGluZ3Moc2VsZixleHRlbnNpb25OYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgYSBkaWN0aW9uYXJ5IG9mIGFsbCB0aGUgZXZlbnQgYmluZGluZ3MgZm9yIGEgcGFydGljdWxhcgorICAgICAgICBleHRlbnNpb24uIFRoZSBjb25maWd1cmFibGUga2V5YmluZGluZ3MgYXJlIHJldHVybmVkIGFzIHRoZXkgZXhpc3QgaW4KKyAgICAgICAgdGhlIGRpY3Rpb25hcnkgcmV0dXJuZWQgYnkgR2V0Q3VycmVudEtleVNldDsgdGhhdCBpcywgd2hlcmUgcmUtdXNlZAorICAgICAgICBrZXliaW5kaW5ncyBhcmUgZGlzYWJsZWQuCisgICAgICAgICIiIgorICAgICAgICBiaW5kc05hbWU9ZXh0ZW5zaW9uTmFtZSsnX2JpbmRpbmdzJworICAgICAgICBleHRCaW5kcz1zZWxmLkdldEV4dGVuc2lvbktleXMoZXh0ZW5zaW9uTmFtZSkKKyAgICAgICAgI2FkZCB0aGUgbm9uLWNvbmZpZ3VyYWJsZSBiaW5kaW5ncworICAgICAgICBpZiBzZWxmLmRlZmF1bHRDZmdbJ2V4dGVuc2lvbnMnXS5oYXNfc2VjdGlvbihiaW5kc05hbWUpOgorICAgICAgICAgICAgZXZlbnROYW1lcz1zZWxmLmRlZmF1bHRDZmdbJ2V4dGVuc2lvbnMnXS5HZXRPcHRpb25MaXN0KGJpbmRzTmFtZSkKKyAgICAgICAgICAgIGZvciBldmVudE5hbWUgaW4gZXZlbnROYW1lczoKKyAgICAgICAgICAgICAgICBiaW5kaW5nPXNlbGYuR2V0T3B0aW9uKCdleHRlbnNpb25zJyxiaW5kc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWUsZGVmYXVsdD0nJykuc3BsaXQoKQorICAgICAgICAgICAgICAgIGV2ZW50PSc8PCcrZXZlbnROYW1lKyc+PicKKyAgICAgICAgICAgICAgICBleHRCaW5kc1tldmVudF09YmluZGluZworCisgICAgICAgIHJldHVybiBleHRCaW5kcworCisgICAgZGVmIEdldEtleUJpbmRpbmcoc2VsZiwga2V5U2V0TmFtZSwgZXZlbnRTdHIpOgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJucyB0aGUga2V5YmluZGluZyBmb3IgYSBzcGVjaWZpYyBldmVudC4KKyAgICAgICAga2V5U2V0TmFtZSAtIHN0cmluZywgbmFtZSBvZiBrZXkgYmluZGluZyBzZXQKKyAgICAgICAgZXZlbnRTdHIgLSBzdHJpbmcsIHRoZSB2aXJ0dWFsIGV2ZW50IHdlIHdhbnQgdGhlIGJpbmRpbmcgZm9yLAorICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLCBlZy4gJzw8ZXZlbnQ+PicKKyAgICAgICAgIiIiCisgICAgICAgIGV2ZW50TmFtZT1ldmVudFN0clsyOi0yXSAjdHJpbSBvZmYgdGhlIGFuZ2xlIGJyYWNrZXRzCisgICAgICAgIGJpbmRpbmc9c2VsZi5HZXRPcHRpb24oJ2tleXMnLGtleVNldE5hbWUsZXZlbnROYW1lLGRlZmF1bHQ9JycpLnNwbGl0KCkKKyAgICAgICAgcmV0dXJuIGJpbmRpbmcKKworICAgIGRlZiBHZXRDdXJyZW50S2V5U2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLkdldEtleVNldChzZWxmLkN1cnJlbnRLZXlzKCkpCisKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgICAgICMgV2UncmUgdXNpbmcgQXF1YVRrLCByZXBsYWNlIGFsbCBrZXliaW5naW5ncyB0aGF0IHVzZSB0aGUKKyAgICAgICAgICAgICMgQWx0IGtleSBieSBvbmVzIHRoYXQgdXNlIHRoZSBPcHRpb24ga2V5IGJlY2F1c2UgdGhlIGZvcm1lcgorICAgICAgICAgICAgIyBkb24ndCB3b3JrIHJlbGlhYmx5LgorICAgICAgICAgICAgZm9yIGssIHYgaW4gcmVzdWx0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgdjIgPSBbIHgucmVwbGFjZSgnPEFsdC0nLCAnPE9wdGlvbi0nKSBmb3IgeCBpbiB2IF0KKyAgICAgICAgICAgICAgICBpZiB2ICE9IHYyOgorICAgICAgICAgICAgICAgICAgICByZXN1bHRba10gPSB2MgorCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBHZXRLZXlTZXQoc2VsZixrZXlTZXROYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgYSBkaWN0aW9uYXJ5IG9mOiBhbGwgcmVxdWVzdGVkIGNvcmUga2V5YmluZGluZ3MsIHBsdXMgdGhlCisgICAgICAgIGtleWJpbmRpbmdzIGZvciBhbGwgY3VycmVudGx5IGFjdGl2ZSBleHRlbnNpb25zLiBJZiBhIGJpbmRpbmcgZGVmaW5lZAorICAgICAgICBpbiBhbiBleHRlbnNpb24gaXMgYWxyZWFkeSBpbiB1c2UsIHRoYXQgYmluZGluZyBpcyBkaXNhYmxlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGtleVNldD1zZWxmLkdldENvcmVLZXlzKGtleVNldE5hbWUpCisgICAgICAgIGFjdGl2ZUV4dG5zPXNlbGYuR2V0RXh0ZW5zaW9ucyhhY3RpdmVfb25seT0xKQorICAgICAgICBmb3IgZXh0biBpbiBhY3RpdmVFeHRuczoKKyAgICAgICAgICAgIGV4dEtleXM9c2VsZi5fX0dldFJhd0V4dGVuc2lvbktleXMoZXh0bikKKyAgICAgICAgICAgIGlmIGV4dEtleXM6ICN0aGUgZXh0ZW5zaW9uIGRlZmluZXMga2V5YmluZGluZ3MKKyAgICAgICAgICAgICAgICBmb3IgZXZlbnQgaW4gZXh0S2V5cy5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4dEtleXNbZXZlbnRdIGluIGtleVNldC52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICN0aGUgYmluZGluZyBpcyBhbHJlYWR5IGluIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgZXh0S2V5c1tldmVudF09JycgI2Rpc2FibGUgdGhpcyBiaW5kaW5nCisgICAgICAgICAgICAgICAgICAgIGtleVNldFtldmVudF09ZXh0S2V5c1tldmVudF0gI2FkZCBiaW5kaW5nCisgICAgICAgIHJldHVybiBrZXlTZXQKKworICAgIGRlZiBJc0NvcmVCaW5kaW5nKHNlbGYsdmlydHVhbEV2ZW50KToKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybnMgdHJ1ZSBpZiB0aGUgdmlydHVhbCBldmVudCBpcyBib3VuZCBpbiB0aGUgY29yZSBpZGxlIGtleWJpbmRpbmdzLgorICAgICAgICB2aXJ0dWFsRXZlbnQgLSBzdHJpbmcsIG5hbWUgb2YgdGhlIHZpcnR1YWwgZXZlbnQgdG8gdGVzdCBmb3IsIHdpdGhvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVuY2xvc2luZyAnPDwgPj4nCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gKCc8PCcrdmlydHVhbEV2ZW50Kyc+PicpIGluIHNlbGYuR2V0Q29yZUtleXMoKS5rZXlzKCkKKworICAgIGRlZiBHZXRDb3JlS2V5cyhzZWxmLCBrZXlTZXROYW1lPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJucyB0aGUgcmVxdWVzdGVkIHNldCBvZiBjb3JlIGtleWJpbmRpbmdzLCB3aXRoIGZhbGxiYWNrcyBpZgorICAgICAgICByZXF1aXJlZC4KKyAgICAgICAgS2V5YmluZGluZ3MgbG9hZGVkIGZyb20gdGhlIGNvbmZpZyBmaWxlKHMpIGFyZSBsb2FkZWQgX292ZXJfIHRoZXNlCisgICAgICAgIGRlZmF1bHRzLCBzbyBpZiB0aGVyZSBpcyBhIHByb2JsZW0gZ2V0dGluZyBhbnkgY29yZSBiaW5kaW5nIHRoZXJlIHdpbGwKKyAgICAgICAgYmUgYW4gJ3VsdGltYXRlIGxhc3QgcmVzb3J0IGZhbGxiYWNrJyB0byB0aGUgQ1VBLWlzaCBiaW5kaW5ncworICAgICAgICBkZWZpbmVkIGhlcmUuCisgICAgICAgICIiIgorICAgICAgICBrZXlCaW5kaW5ncz17CisgICAgICAgICAgICAnPDxjb3B5Pj4nOiBbJzxDb250cm9sLWM+JywgJzxDb250cm9sLUM+J10sCisgICAgICAgICAgICAnPDxjdXQ+Pic6IFsnPENvbnRyb2wteD4nLCAnPENvbnRyb2wtWD4nXSwKKyAgICAgICAgICAgICc8PHBhc3RlPj4nOiBbJzxDb250cm9sLXY+JywgJzxDb250cm9sLVY+J10sCisgICAgICAgICAgICAnPDxiZWdpbm5pbmctb2YtbGluZT4+JzogWyc8Q29udHJvbC1hPicsICc8SG9tZT4nXSwKKyAgICAgICAgICAgICc8PGNlbnRlci1pbnNlcnQ+Pic6IFsnPENvbnRyb2wtbD4nXSwKKyAgICAgICAgICAgICc8PGNsb3NlLWFsbC13aW5kb3dzPj4nOiBbJzxDb250cm9sLXE+J10sCisgICAgICAgICAgICAnPDxjbG9zZS13aW5kb3c+Pic6IFsnPEFsdC1GND4nXSwKKyAgICAgICAgICAgICc8PGRvLW5vdGhpbmc+Pic6IFsnPENvbnRyb2wteD4nXSwKKyAgICAgICAgICAgICc8PGVuZC1vZi1maWxlPj4nOiBbJzxDb250cm9sLWQ+J10sCisgICAgICAgICAgICAnPDxweXRob24tZG9jcz4+JzogWyc8RjE+J10sCisgICAgICAgICAgICAnPDxweXRob24tY29udGV4dC1oZWxwPj4nOiBbJzxTaGlmdC1GMT4nXSwKKyAgICAgICAgICAgICc8PGhpc3RvcnktbmV4dD4+JzogWyc8QWx0LW4+J10sCisgICAgICAgICAgICAnPDxoaXN0b3J5LXByZXZpb3VzPj4nOiBbJzxBbHQtcD4nXSwKKyAgICAgICAgICAgICc8PGludGVycnVwdC1leGVjdXRpb24+Pic6IFsnPENvbnRyb2wtYz4nXSwKKyAgICAgICAgICAgICc8PHZpZXctcmVzdGFydD4+JzogWyc8RjY+J10sCisgICAgICAgICAgICAnPDxyZXN0YXJ0LXNoZWxsPj4nOiBbJzxDb250cm9sLUY2PiddLAorICAgICAgICAgICAgJzw8b3Blbi1jbGFzcy1icm93c2VyPj4nOiBbJzxBbHQtYz4nXSwKKyAgICAgICAgICAgICc8PG9wZW4tbW9kdWxlPj4nOiBbJzxBbHQtbT4nXSwKKyAgICAgICAgICAgICc8PG9wZW4tbmV3LXdpbmRvdz4+JzogWyc8Q29udHJvbC1uPiddLAorICAgICAgICAgICAgJzw8b3Blbi13aW5kb3ctZnJvbS1maWxlPj4nOiBbJzxDb250cm9sLW8+J10sCisgICAgICAgICAgICAnPDxwbGFpbi1uZXdsaW5lLWFuZC1pbmRlbnQ+Pic6IFsnPENvbnRyb2wtaj4nXSwKKyAgICAgICAgICAgICc8PHByaW50LXdpbmRvdz4+JzogWyc8Q29udHJvbC1wPiddLAorICAgICAgICAgICAgJzw8cmVkbz4+JzogWyc8Q29udHJvbC15PiddLAorICAgICAgICAgICAgJzw8cmVtb3ZlLXNlbGVjdGlvbj4+JzogWyc8RXNjYXBlPiddLAorICAgICAgICAgICAgJzw8c2F2ZS1jb3B5LW9mLXdpbmRvdy1hcy1maWxlPj4nOiBbJzxBbHQtU2hpZnQtUz4nXSwKKyAgICAgICAgICAgICc8PHNhdmUtd2luZG93LWFzLWZpbGU+Pic6IFsnPEFsdC1zPiddLAorICAgICAgICAgICAgJzw8c2F2ZS13aW5kb3c+Pic6IFsnPENvbnRyb2wtcz4nXSwKKyAgICAgICAgICAgICc8PHNlbGVjdC1hbGw+Pic6IFsnPEFsdC1hPiddLAorICAgICAgICAgICAgJzw8dG9nZ2xlLWF1dG8tY29sb3Jpbmc+Pic6IFsnPENvbnRyb2wtc2xhc2g+J10sCisgICAgICAgICAgICAnPDx1bmRvPj4nOiBbJzxDb250cm9sLXo+J10sCisgICAgICAgICAgICAnPDxmaW5kLWFnYWluPj4nOiBbJzxDb250cm9sLWc+JywgJzxGMz4nXSwKKyAgICAgICAgICAgICc8PGZpbmQtaW4tZmlsZXM+Pic6IFsnPEFsdC1GMz4nXSwKKyAgICAgICAgICAgICc8PGZpbmQtc2VsZWN0aW9uPj4nOiBbJzxDb250cm9sLUYzPiddLAorICAgICAgICAgICAgJzw8ZmluZD4+JzogWyc8Q29udHJvbC1mPiddLAorICAgICAgICAgICAgJzw8cmVwbGFjZT4+JzogWyc8Q29udHJvbC1oPiddLAorICAgICAgICAgICAgJzw8Z290by1saW5lPj4nOiBbJzxBbHQtZz4nXSwKKyAgICAgICAgICAgICc8PHNtYXJ0LWJhY2tzcGFjZT4+JzogWyc8S2V5LUJhY2tTcGFjZT4nXSwKKyAgICAgICAgICAgICc8PG5ld2xpbmUtYW5kLWluZGVudD4+JzogWyc8S2V5LVJldHVybj4nLCAnPEtleS1LUF9FbnRlcj4nXSwKKyAgICAgICAgICAgICc8PHNtYXJ0LWluZGVudD4+JzogWyc8S2V5LVRhYj4nXSwKKyAgICAgICAgICAgICc8PGluZGVudC1yZWdpb24+Pic6IFsnPENvbnRyb2wtS2V5LWJyYWNrZXRyaWdodD4nXSwKKyAgICAgICAgICAgICc8PGRlZGVudC1yZWdpb24+Pic6IFsnPENvbnRyb2wtS2V5LWJyYWNrZXRsZWZ0PiddLAorICAgICAgICAgICAgJzw8Y29tbWVudC1yZWdpb24+Pic6IFsnPEFsdC1LZXktMz4nXSwKKyAgICAgICAgICAgICc8PHVuY29tbWVudC1yZWdpb24+Pic6IFsnPEFsdC1LZXktND4nXSwKKyAgICAgICAgICAgICc8PHRhYmlmeS1yZWdpb24+Pic6IFsnPEFsdC1LZXktNT4nXSwKKyAgICAgICAgICAgICc8PHVudGFiaWZ5LXJlZ2lvbj4+JzogWyc8QWx0LUtleS02PiddLAorICAgICAgICAgICAgJzw8dG9nZ2xlLXRhYnM+Pic6IFsnPEFsdC1LZXktdD4nXSwKKyAgICAgICAgICAgICc8PGNoYW5nZS1pbmRlbnR3aWR0aD4+JzogWyc8QWx0LUtleS11PiddLAorICAgICAgICAgICAgJzw8ZGVsLXdvcmQtbGVmdD4+JzogWyc8Q29udHJvbC1LZXktQmFja1NwYWNlPiddLAorICAgICAgICAgICAgJzw8ZGVsLXdvcmQtcmlnaHQ+Pic6IFsnPENvbnRyb2wtS2V5LURlbGV0ZT4nXQorICAgICAgICAgICAgfQorICAgICAgICBpZiBrZXlTZXROYW1lOgorICAgICAgICAgICAgZm9yIGV2ZW50IGluIGtleUJpbmRpbmdzLmtleXMoKToKKyAgICAgICAgICAgICAgICBiaW5kaW5nPXNlbGYuR2V0S2V5QmluZGluZyhrZXlTZXROYW1lLGV2ZW50KQorICAgICAgICAgICAgICAgIGlmIGJpbmRpbmc6CisgICAgICAgICAgICAgICAgICAgIGtleUJpbmRpbmdzW2V2ZW50XT1iaW5kaW5nCisgICAgICAgICAgICAgICAgZWxzZTogI3dlIGFyZSBnb2luZyB0byByZXR1cm4gYSBkZWZhdWx0LCBwcmludCB3YXJuaW5nCisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmc9KCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLnB5IC0gSWRsZUNvbmYuR2V0Q29yZUtleXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAtXG4gcHJvYmxlbSByZXRyaWV2aW5nIGtleSBiaW5kaW5nIGZvciBldmVudCAlcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4gZnJvbSBrZXkgc2V0ICVyLlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgcmV0dXJuaW5nIGRlZmF1bHQgdmFsdWU6ICVyXG4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnQsIGtleVNldE5hbWUsIGtleUJpbmRpbmdzW2V2ZW50XSkpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUod2FybmluZykKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBrZXlCaW5kaW5ncworCisgICAgZGVmIEdldEV4dHJhSGVscFNvdXJjZUxpc3Qoc2VsZixjb25maWdTZXQpOgorICAgICAgICAiIiJGZXRjaCBsaXN0IG9mIGV4dHJhIGhlbHAgc291cmNlcyBmcm9tIGEgZ2l2ZW4gY29uZmlnU2V0LgorCisgICAgICAgIFZhbGlkIGNvbmZpZ1NldHMgYXJlICd1c2VyJyBvciAnZGVmYXVsdCcuICBSZXR1cm4gYSBsaXN0IG9mIHR1cGxlcyBvZgorICAgICAgICB0aGUgZm9ybSAobWVudV9pdGVtICwgcGF0aF90b19oZWxwX2ZpbGUgLCBvcHRpb24pLCBvciByZXR1cm4gdGhlIGVtcHR5CisgICAgICAgIGxpc3QuICAnb3B0aW9uJyBpcyB0aGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBoZWxwIHJlc291cmNlLiAgJ29wdGlvbicKKyAgICAgICAgdmFsdWVzIGRldGVybWluZSB0aGUgcG9zaXRpb24gb2YgdGhlIG1lbnUgaXRlbXMgb24gdGhlIEhlbHAgbWVudSwKKyAgICAgICAgdGhlcmVmb3JlIHRoZSByZXR1cm5lZCBsaXN0IG11c3QgYmUgc29ydGVkIGJ5ICdvcHRpb24nLgorCisgICAgICAgICIiIgorICAgICAgICBoZWxwU291cmNlcz1bXQorICAgICAgICBpZiBjb25maWdTZXQ9PSd1c2VyJzoKKyAgICAgICAgICAgIGNmZ1BhcnNlcj1zZWxmLnVzZXJDZmdbJ21haW4nXQorICAgICAgICBlbGlmIGNvbmZpZ1NldD09J2RlZmF1bHQnOgorICAgICAgICAgICAgY2ZnUGFyc2VyPXNlbGYuZGVmYXVsdENmZ1snbWFpbiddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBJbnZhbGlkQ29uZmlnU2V0LCAnSW52YWxpZCBjb25maWdTZXQgc3BlY2lmaWVkJworICAgICAgICBvcHRpb25zPWNmZ1BhcnNlci5HZXRPcHRpb25MaXN0KCdIZWxwRmlsZXMnKQorICAgICAgICBmb3Igb3B0aW9uIGluIG9wdGlvbnM6CisgICAgICAgICAgICB2YWx1ZT1jZmdQYXJzZXIuR2V0KCdIZWxwRmlsZXMnLG9wdGlvbixkZWZhdWx0PSc7JykKKyAgICAgICAgICAgIGlmIHZhbHVlLmZpbmQoJzsnKT09LTE6ICNtYWxmb3JtZWQgY29uZmlnIGVudHJ5IHdpdGggbm8gJzsnCisgICAgICAgICAgICAgICAgbWVudUl0ZW09JycgI21ha2UgdGhlc2UgZW1wdHkKKyAgICAgICAgICAgICAgICBoZWxwUGF0aD0nJyAjc28gdmFsdWUgd29uJ3QgYmUgYWRkZWQgdG8gbGlzdAorICAgICAgICAgICAgZWxzZTogI2NvbmZpZyBlbnRyeSBjb250YWlucyAnOycgYXMgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICB2YWx1ZT1zdHJpbmcuc3BsaXQodmFsdWUsJzsnKQorICAgICAgICAgICAgICAgIG1lbnVJdGVtPXZhbHVlWzBdLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBoZWxwUGF0aD12YWx1ZVsxXS5zdHJpcCgpCisgICAgICAgICAgICBpZiBtZW51SXRlbSBhbmQgaGVscFBhdGg6ICNuZWl0aGVyIGFyZSBlbXB0eSBzdHJpbmdzCisgICAgICAgICAgICAgICAgaGVscFNvdXJjZXMuYXBwZW5kKCAobWVudUl0ZW0saGVscFBhdGgsb3B0aW9uKSApCisgICAgICAgIGhlbHBTb3VyY2VzLnNvcnQoa2V5PWxhbWJkYSB4OiBpbnQoeFsyXSkpCisgICAgICAgIHJldHVybiBoZWxwU291cmNlcworCisgICAgZGVmIEdldEFsbEV4dHJhSGVscFNvdXJjZXNMaXN0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyBhIGxpc3Qgb2YgdHVwbGVzIGNvbnRhaW5pbmcgdGhlIGRldGFpbHMgb2YgYWxsIGFkZGl0aW9uYWwgaGVscAorICAgICAgICBzb3VyY2VzIGNvbmZpZ3VyZWQsIG9yIGFuIGVtcHR5IGxpc3QgaWYgdGhlcmUgYXJlIG5vbmUuIFR1cGxlcyBhcmUgb2YKKyAgICAgICAgdGhlIGZvcm1hdCByZXR1cm5lZCBieSBHZXRFeHRyYUhlbHBTb3VyY2VMaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgYWxsSGVscFNvdXJjZXM9KCBzZWxmLkdldEV4dHJhSGVscFNvdXJjZUxpc3QoJ2RlZmF1bHQnKSsKKyAgICAgICAgICAgICAgICBzZWxmLkdldEV4dHJhSGVscFNvdXJjZUxpc3QoJ3VzZXInKSApCisgICAgICAgIHJldHVybiBhbGxIZWxwU291cmNlcworCisgICAgZGVmIExvYWRDZmdGaWxlcyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIGxvYWQgYWxsIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisgICAgICAgICIiIgorICAgICAgICBmb3Iga2V5IGluIHNlbGYuZGVmYXVsdENmZy5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLmRlZmF1bHRDZmdba2V5XS5Mb2FkKCkKKyAgICAgICAgICAgIHNlbGYudXNlckNmZ1trZXldLkxvYWQoKSAjc2FtZSBrZXlzCisKKyAgICBkZWYgU2F2ZVVzZXJDZmdGaWxlcyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIHdyaXRlIGFsbCBsb2FkZWQgdXNlciBjb25maWd1cmF0aW9uIGZpbGVzIGJhY2sgdG8gZGlzaworICAgICAgICAiIiIKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLnVzZXJDZmcua2V5cygpOgorICAgICAgICAgICAgc2VsZi51c2VyQ2ZnW2tleV0uU2F2ZSgpCisKK2lkbGVDb25mPUlkbGVDb25mKCkKKworIyMjIG1vZHVsZSB0ZXN0CitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGRlZiBkdW1wQ2ZnKGNmZyk6CisgICAgICAgIHByaW50ICdcbicsY2ZnLCdcbicKKyAgICAgICAgZm9yIGtleSBpbiBjZmcua2V5cygpOgorICAgICAgICAgICAgc2VjdGlvbnM9Y2ZnW2tleV0uc2VjdGlvbnMoKQorICAgICAgICAgICAgcHJpbnQga2V5CisgICAgICAgICAgICBwcmludCBzZWN0aW9ucworICAgICAgICAgICAgZm9yIHNlY3Rpb24gaW4gc2VjdGlvbnM6CisgICAgICAgICAgICAgICAgb3B0aW9ucz1jZmdba2V5XS5vcHRpb25zKHNlY3Rpb24pCisgICAgICAgICAgICAgICAgcHJpbnQgc2VjdGlvbgorICAgICAgICAgICAgICAgIHByaW50IG9wdGlvbnMKKyAgICAgICAgICAgICAgICBmb3Igb3B0aW9uIGluIG9wdGlvbnM6CisgICAgICAgICAgICAgICAgICAgIHByaW50IG9wdGlvbiwgJz0nLCBjZmdba2V5XS5HZXQoc2VjdGlvbixvcHRpb24pCisgICAgZHVtcENmZyhpZGxlQ29uZi5kZWZhdWx0Q2ZnKQorICAgIGR1bXBDZmcoaWRsZUNvbmYudXNlckNmZykKKyAgICBwcmludCBpZGxlQ29uZi51c2VyQ2ZnWydtYWluJ10uR2V0KCdUaGVtZScsJ25hbWUnKQorICAgICNwcmludCBpZGxlQ29uZi51c2VyQ2ZnWydoaWdobGlnaHQnXS5HZXREZWZIaWdobGlnaHQoJ0ZvbycsJ25vcm1hbCcpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnSGFuZGxlci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnSGFuZGxlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1NWVkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnSGFuZGxlci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnSGFuZGxlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1NWVkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnSGVscFNvdXJjZUVkaXQucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnSGVscFNvdXJjZUVkaXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYxMTYyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQpAQCAtMCwwICsxLDE2OSBAQAorIkRpYWxvZyB0byBzcGVjaWZ5IG9yIGVkaXQgdGhlIHBhcmFtZXRlcnMgZm9yIGEgdXNlciBjb25maWd1cmVkIGhlbHAgc291cmNlLiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgoraW1wb3J0IHRrTWVzc2FnZUJveAoraW1wb3J0IHRrRmlsZURpYWxvZworCitjbGFzcyBHZXRIZWxwU291cmNlRGlhbG9nKFRvcGxldmVsKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSwgbWVudUl0ZW09JycsIGZpbGVQYXRoPScnKToKKyAgICAgICAgIiIiR2V0IG1lbnUgZW50cnkgYW5kIHVybC8gbG9jYWwgZmlsZSBsb2NhdGlvbiBmb3IgQWRkaXRpb25hbCBIZWxwCisKKyAgICAgICAgVXNlciBzZWxlY3RzIGEgbmFtZSBmb3IgdGhlIEhlbHAgcmVzb3VyY2UgYW5kIHByb3ZpZGVzIGEgd2ViIHVybAorICAgICAgICBvciBhIGxvY2FsIGZpbGUgYXMgaXRzIHNvdXJjZS4gIFRoZSB1c2VyIGNhbiBlbnRlciBhIHVybCBvciBicm93c2UKKyAgICAgICAgZm9yIHRoZSBmaWxlLgorCisgICAgICAgICIiIgorICAgICAgICBUb3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCisgICAgICAgIHNlbGYuY29uZmlndXJlKGJvcmRlcndpZHRoPTUpCisgICAgICAgIHNlbGYucmVzaXphYmxlKGhlaWdodD1GQUxTRSwgd2lkdGg9RkFMU0UpCisgICAgICAgIHNlbGYudGl0bGUodGl0bGUpCisgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKKyAgICAgICAgc2VsZi5ncmFiX3NldCgpCisgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLkNhbmNlbCkKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi5yZXN1bHQgPSBOb25lCisgICAgICAgIHNlbGYuQ3JlYXRlV2lkZ2V0cygpCisgICAgICAgIHNlbGYubWVudS5zZXQobWVudUl0ZW0pCisgICAgICAgIHNlbGYucGF0aC5zZXQoZmlsZVBhdGgpCisgICAgICAgIHNlbGYud2l0aGRyYXcoKSAjaGlkZSB3aGlsZSBzZXR0aW5nIGdlb21ldHJ5CisgICAgICAgICNuZWVkcyB0byBiZSBkb25lIGhlcmUgc28gdGhhdCB0aGUgd2luZm9fcmVxd2lkdGggaXMgdmFsaWQKKyAgICAgICAgc2VsZi51cGRhdGVfaWRsZXRhc2tzKCkKKyAgICAgICAgI2NlbnRyZSBkaWFsb2cgb3ZlciBwYXJlbnQ6CisgICAgICAgIHNlbGYuZ2VvbWV0cnkoIislZCslZCIgJQorICAgICAgICAgICAgICAgICAgICAgICgocGFyZW50LndpbmZvX3Jvb3R4KCkgKyAoKHBhcmVudC53aW5mb193aWR0aCgpLzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKHNlbGYud2luZm9fcmVxd2lkdGgoKS8yKSksCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArICgocGFyZW50LndpbmZvX2hlaWdodCgpLzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtKHNlbGYud2luZm9fcmVxaGVpZ2h0KCkvMikpKSkpCisgICAgICAgIHNlbGYuZGVpY29uaWZ5KCkgI2dlb21ldHJ5IHNldCwgdW5oaWRlCisgICAgICAgIHNlbGYuYmluZCgnPFJldHVybj4nLCBzZWxmLk9rKQorICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKKworICAgIGRlZiBDcmVhdGVXaWRnZXRzKHNlbGYpOgorICAgICAgICBzZWxmLm1lbnUgPSBTdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5wYXRoID0gU3RyaW5nVmFyKHNlbGYpCisgICAgICAgIHNlbGYuZm9udFNpemUgPSBTdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5mcmFtZU1haW4gPSBGcmFtZShzZWxmLCBib3JkZXJ3aWR0aD0yLCByZWxpZWY9R1JPT1ZFKQorICAgICAgICBzZWxmLmZyYW1lTWFpbi5wYWNrKHNpZGU9VE9QLCBleHBhbmQ9VFJVRSwgZmlsbD1CT1RIKQorICAgICAgICBsYWJlbE1lbnUgPSBMYWJlbChzZWxmLmZyYW1lTWFpbiwgYW5jaG9yPVcsIGp1c3RpZnk9TEVGVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nTWVudSBJdGVtOicpCisgICAgICAgIHNlbGYuZW50cnlNZW51ID0gRW50cnkoc2VsZi5mcmFtZU1haW4sIHRleHR2YXJpYWJsZT1zZWxmLm1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9MzApCisgICAgICAgIHNlbGYuZW50cnlNZW51LmZvY3VzX3NldCgpCisgICAgICAgIGxhYmVsUGF0aCA9IExhYmVsKHNlbGYuZnJhbWVNYWluLCBhbmNob3I9VywganVzdGlmeT1MRUZULAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSdIZWxwIEZpbGUgUGF0aDogRW50ZXIgVVJMIG9yIGJyb3dzZSBmb3IgZmlsZScpCisgICAgICAgIHNlbGYuZW50cnlQYXRoID0gRW50cnkoc2VsZi5mcmFtZU1haW4sIHRleHR2YXJpYWJsZT1zZWxmLnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9NDApCisgICAgICAgIHNlbGYuZW50cnlNZW51LmZvY3VzX3NldCgpCisgICAgICAgIGxhYmVsTWVudS5wYWNrKGFuY2hvcj1XLCBwYWR4PTUsIHBhZHk9MykKKyAgICAgICAgc2VsZi5lbnRyeU1lbnUucGFjayhhbmNob3I9VywgcGFkeD01LCBwYWR5PTMpCisgICAgICAgIGxhYmVsUGF0aC5wYWNrKGFuY2hvcj1XLCBwYWR4PTUsIHBhZHk9MykKKyAgICAgICAgc2VsZi5lbnRyeVBhdGgucGFjayhhbmNob3I9VywgcGFkeD01LCBwYWR5PTMpCisgICAgICAgIGJyb3dzZUJ1dHRvbiA9IEJ1dHRvbihzZWxmLmZyYW1lTWFpbiwgdGV4dD0nQnJvd3NlJywgd2lkdGg9OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5icm93c2VGaWxlKQorICAgICAgICBicm93c2VCdXR0b24ucGFjayhwYWR5PTMpCisgICAgICAgIGZyYW1lQnV0dG9ucyA9IEZyYW1lKHNlbGYpCisgICAgICAgIGZyYW1lQnV0dG9ucy5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpCisgICAgICAgIHNlbGYuYnV0dG9uT2sgPSBCdXR0b24oZnJhbWVCdXR0b25zLCB0ZXh0PSdPSycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9OCwgZGVmYXVsdD1BQ1RJVkUsICBjb21tYW5kPXNlbGYuT2spCisgICAgICAgIHNlbGYuYnV0dG9uT2suZ3JpZChyb3c9MCwgY29sdW1uPTAsIHBhZHg9NSxwYWR5PTUpCisgICAgICAgIHNlbGYuYnV0dG9uQ2FuY2VsID0gQnV0dG9uKGZyYW1lQnV0dG9ucywgdGV4dD0nQ2FuY2VsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9OCwgY29tbWFuZD1zZWxmLkNhbmNlbCkKKyAgICAgICAgc2VsZi5idXR0b25DYW5jZWwuZ3JpZChyb3c9MCwgY29sdW1uPTEsIHBhZHg9NSwgcGFkeT01KQorCisgICAgZGVmIGJyb3dzZUZpbGUoc2VsZik6CisgICAgICAgIGZpbGV0eXBlcyA9IFsKKyAgICAgICAgICAgICgiSFRNTCBGaWxlcyIsICIqLmh0bSAqLmh0bWwiLCAiVEVYVCIpLAorICAgICAgICAgICAgKCJQREYgRmlsZXMiLCAiKi5wZGYiLCAiVEVYVCIpLAorICAgICAgICAgICAgKCJXaW5kb3dzIEhlbHAgRmlsZXMiLCAiKi5jaG0iKSwKKyAgICAgICAgICAgICgiVGV4dCBGaWxlcyIsICIqLnR4dCIsICJURVhUIiksCisgICAgICAgICAgICAoIkFsbCBGaWxlcyIsICIqIildCisgICAgICAgIHBhdGggPSBzZWxmLnBhdGguZ2V0KCkKKyAgICAgICAgaWYgcGF0aDoKKyAgICAgICAgICAgIGRpciwgYmFzZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhc2UgPSBOb25lCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nOgorICAgICAgICAgICAgICAgIGRpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc3lzLmV4ZWN1dGFibGUpLCAnRG9jJykKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXIpOgorICAgICAgICAgICAgICAgICAgICBkaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcGVuZGlhbG9nID0gdGtGaWxlRGlhbG9nLk9wZW4ocGFyZW50PXNlbGYsIGZpbGV0eXBlcz1maWxldHlwZXMpCisgICAgICAgIGZpbGUgPSBvcGVuZGlhbG9nLnNob3coaW5pdGlhbGRpcj1kaXIsIGluaXRpYWxmaWxlPWJhc2UpCisgICAgICAgIGlmIGZpbGU6CisgICAgICAgICAgICBzZWxmLnBhdGguc2V0KGZpbGUpCisKKyAgICBkZWYgTWVudU9rKHNlbGYpOgorICAgICAgICAiU2ltcGxlIHZhbGlkaXR5IGNoZWNrIGZvciBhIHNlbnNpYmxlIG1lbnUgaXRlbSBuYW1lIgorICAgICAgICBtZW51T2sgPSBUcnVlCisgICAgICAgIG1lbnUgPSBzZWxmLm1lbnUuZ2V0KCkKKyAgICAgICAgbWVudS5zdHJpcCgpCisgICAgICAgIGlmIG5vdCBtZW51OgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nTWVudSBJdGVtIEVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gbWVudSBpdGVtIHNwZWNpZmllZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgc2VsZi5lbnRyeU1lbnUuZm9jdXNfc2V0KCkKKyAgICAgICAgICAgIG1lbnVPayA9IEZhbHNlCisgICAgICAgIGVsaWYgbGVuKG1lbnUpID4gMzA6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdNZW51IEl0ZW0gRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdNZW51IGl0ZW0gdG9vIGxvbmc6JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbkxpbWl0IDMwIGNoYXJhY3RlcnMuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYpCisgICAgICAgICAgICBzZWxmLmVudHJ5TWVudS5mb2N1c19zZXQoKQorICAgICAgICAgICAgbWVudU9rID0gRmFsc2UKKyAgICAgICAgcmV0dXJuIG1lbnVPaworCisgICAgZGVmIFBhdGhPayhzZWxmKToKKyAgICAgICAgIlNpbXBsZSB2YWxpZGl0eSBjaGVjayBmb3IgbWVudSBmaWxlIHBhdGgiCisgICAgICAgIHBhdGhPayA9IFRydWUKKyAgICAgICAgcGF0aCA9IHNlbGYucGF0aC5nZXQoKQorICAgICAgICBwYXRoLnN0cmlwKCkKKyAgICAgICAgaWYgbm90IHBhdGg6ICNubyBwYXRoIHNwZWNpZmllZAorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nRmlsZSBQYXRoIEVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gaGVscCBmaWxlIHBhdGggc3BlY2lmaWVkLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgc2VsZi5lbnRyeVBhdGguZm9jdXNfc2V0KCkKKyAgICAgICAgICAgIHBhdGhPayA9IEZhbHNlCisgICAgICAgIGVsaWYgcGF0aC5zdGFydHN3aXRoKCgnd3d3LicsICdodHRwJykpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgcGF0aFs6NV0gPT0gJ2ZpbGU6JzoKKyAgICAgICAgICAgICAgICBwYXRoID0gcGF0aFs1Ol0KKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdGaWxlIFBhdGggRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nSGVscCBmaWxlIHBhdGggZG9lcyBub3QgZXhpc3QuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgICAgIHNlbGYuZW50cnlQYXRoLmZvY3VzX3NldCgpCisgICAgICAgICAgICAgICAgcGF0aE9rID0gRmFsc2UKKyAgICAgICAgcmV0dXJuIHBhdGhPaworCisgICAgZGVmIE9rKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLk1lbnVPaygpIGFuZCBzZWxmLlBhdGhPaygpOgorICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSAoc2VsZi5tZW51LmdldCgpLnN0cmlwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGguZ2V0KCkuc3RyaXAoKSkKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5yZXN1bHRbMV0KKyAgICAgICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoKCd3d3cnLCAnZmlsZTonLCAnaHR0cDonKSk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIE1hYyBTYWZhcmkgaW5zaXN0cyBvbiB1c2luZyB0aGUgVVJJIGZvcm0gZm9yIGxvY2FsIGZpbGVzCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gbGlzdChzZWxmLnJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRbMV0gPSAiZmlsZTovLyIgKyBwYXRoCisgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKQorCisgICAgZGVmIENhbmNlbChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgc2VsZi5yZXN1bHQgPSBOb25lCisgICAgICAgIHNlbGYuZGVzdHJveSgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgI3Rlc3QgdGhlIGRpYWxvZworICAgIHJvb3QgPSBUaygpCisgICAgZGVmIHJ1bigpOgorICAgICAgICBrZXlTZXEgPSAnJworICAgICAgICBkbGcgPSBHZXRIZWxwU291cmNlRGlhbG9nKHJvb3QsICdHZXQgSGVscCBTb3VyY2UnKQorICAgICAgICBwcmludCBkbGcucmVzdWx0CisgICAgQnV0dG9uKHJvb3QsdGV4dD0nRGlhbG9nJywgY29tbWFuZD1ydW4pLnBhY2soKQorICAgIHJvb3QubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiYzU0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiYzU0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMWIwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkKQEAgLTAsMCArMSw5NyBAQAorIiIiCitEaWFsb2cgdGhhdCBhbGxvd3MgdXNlciB0byBzcGVjaWZ5IGEgbmV3IGNvbmZpZyBmaWxlIHNlY3Rpb24gbmFtZS4KK1VzZWQgdG8gZ2V0IG5ldyBoaWdobGlnaHQgdGhlbWUgYW5kIGtleWJpbmRpbmcgc2V0IG5hbWVzLgorIiIiCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKK2ltcG9ydCB0a01lc3NhZ2VCb3gKKworY2xhc3MgR2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2coVG9wbGV2ZWwpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLHBhcmVudCx0aXRsZSxtZXNzYWdlLHVzZWROYW1lcyk6CisgICAgICAgICIiIgorICAgICAgICBtZXNzYWdlIC0gc3RyaW5nLCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UgdG8gZGlzcGxheQorICAgICAgICB1c2VkTmFtZXMgLSBsaXN0LCBsaXN0IG9mIG5hbWVzIGFscmVhZHkgaW4gdXNlIGZvciB2YWxpZGl0eSBjaGVjaworICAgICAgICAiIiIKKyAgICAgICAgVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQorICAgICAgICBzZWxmLmNvbmZpZ3VyZShib3JkZXJ3aWR0aD01KQorICAgICAgICBzZWxmLnJlc2l6YWJsZShoZWlnaHQ9RkFMU0Usd2lkdGg9RkFMU0UpCisgICAgICAgIHNlbGYudGl0bGUodGl0bGUpCisgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKKyAgICAgICAgc2VsZi5ncmFiX3NldCgpCisgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLkNhbmNlbCkKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi5tZXNzYWdlPW1lc3NhZ2UKKyAgICAgICAgc2VsZi51c2VkTmFtZXM9dXNlZE5hbWVzCisgICAgICAgIHNlbGYucmVzdWx0PScnCisgICAgICAgIHNlbGYuQ3JlYXRlV2lkZ2V0cygpCisgICAgICAgIHNlbGYud2l0aGRyYXcoKSAjaGlkZSB3aGlsZSBzZXR0aW5nIGdlb21ldHJ5CisgICAgICAgIHNlbGYudXBkYXRlX2lkbGV0YXNrcygpCisgICAgICAgICNuZWVkcyB0byBiZSBkb25lIGhlcmUgc28gdGhhdCB0aGUgd2luZm9fcmVxd2lkdGggaXMgdmFsaWQKKyAgICAgICAgc2VsZi5tZXNzYWdlSW5mby5jb25maWcod2lkdGg9c2VsZi5mcmFtZU1haW4ud2luZm9fcmVxd2lkdGgoKSkKKyAgICAgICAgc2VsZi5nZW9tZXRyeSgiKyVkKyVkIiAlCisgICAgICAgICAgICAoKHBhcmVudC53aW5mb19yb290eCgpKygocGFyZW50LndpbmZvX3dpZHRoKCkvMikKKyAgICAgICAgICAgICAgICAtKHNlbGYud2luZm9fcmVxd2lkdGgoKS8yKSksCisgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpKygocGFyZW50LndpbmZvX2hlaWdodCgpLzIpCisgICAgICAgICAgICAgICAgLShzZWxmLndpbmZvX3JlcWhlaWdodCgpLzIpKSApKSApICNjZW50cmUgZGlhbG9nIG92ZXIgcGFyZW50CisgICAgICAgIHNlbGYuZGVpY29uaWZ5KCkgI2dlb21ldHJ5IHNldCwgdW5oaWRlCisgICAgICAgIHNlbGYud2FpdF93aW5kb3coKQorCisgICAgZGVmIENyZWF0ZVdpZGdldHMoc2VsZik6CisgICAgICAgIHNlbGYubmFtZT1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5mb250U2l6ZT1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5mcmFtZU1haW4gPSBGcmFtZShzZWxmLGJvcmRlcndpZHRoPTIscmVsaWVmPVNVTktFTikKKyAgICAgICAgc2VsZi5mcmFtZU1haW4ucGFjayhzaWRlPVRPUCxleHBhbmQ9VFJVRSxmaWxsPUJPVEgpCisgICAgICAgIHNlbGYubWVzc2FnZUluZm89TWVzc2FnZShzZWxmLmZyYW1lTWFpbixhbmNob3I9VyxqdXN0aWZ5PUxFRlQscGFkeD01LHBhZHk9NSwKKyAgICAgICAgICAgICAgICB0ZXh0PXNlbGYubWVzc2FnZSkjLGFzcGVjdD0yMDApCisgICAgICAgIGVudHJ5TmFtZT1FbnRyeShzZWxmLmZyYW1lTWFpbix0ZXh0dmFyaWFibGU9c2VsZi5uYW1lLHdpZHRoPTMwKQorICAgICAgICBlbnRyeU5hbWUuZm9jdXNfc2V0KCkKKyAgICAgICAgc2VsZi5tZXNzYWdlSW5mby5wYWNrKHBhZHg9NSxwYWR5PTUpIyxleHBhbmQ9VFJVRSxmaWxsPUJPVEgpCisgICAgICAgIGVudHJ5TmFtZS5wYWNrKHBhZHg9NSxwYWR5PTUpCisgICAgICAgIGZyYW1lQnV0dG9ucz1GcmFtZShzZWxmKQorICAgICAgICBmcmFtZUJ1dHRvbnMucGFjayhzaWRlPUJPVFRPTSxmaWxsPVgpCisgICAgICAgIHNlbGYuYnV0dG9uT2sgPSBCdXR0b24oZnJhbWVCdXR0b25zLHRleHQ9J09rJywKKyAgICAgICAgICAgICAgICB3aWR0aD04LGNvbW1hbmQ9c2VsZi5PaykKKyAgICAgICAgc2VsZi5idXR0b25Pay5ncmlkKHJvdz0wLGNvbHVtbj0wLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIHNlbGYuYnV0dG9uQ2FuY2VsID0gQnV0dG9uKGZyYW1lQnV0dG9ucyx0ZXh0PSdDYW5jZWwnLAorICAgICAgICAgICAgICAgIHdpZHRoPTgsY29tbWFuZD1zZWxmLkNhbmNlbCkKKyAgICAgICAgc2VsZi5idXR0b25DYW5jZWwuZ3JpZChyb3c9MCxjb2x1bW49MSxwYWR4PTUscGFkeT01KQorCisgICAgZGVmIE5hbWVPayhzZWxmKToKKyAgICAgICAgI3NpbXBsZSB2YWxpZGl0eSBjaGVjayBmb3IgYSBzZW5zaWJsZQorICAgICAgICAjQ29uZmlnUGFyc2VyIGZpbGUgc2VjdGlvbiBuYW1lCisgICAgICAgIG5hbWVPaz0xCisgICAgICAgIG5hbWU9c2VsZi5uYW1lLmdldCgpCisgICAgICAgIG5hbWUuc3RyaXAoKQorICAgICAgICBpZiBub3QgbmFtZTogI25vIG5hbWUgc3BlY2lmaWVkCisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdOYW1lIEVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gbmFtZSBzcGVjaWZpZWQuJywgcGFyZW50PXNlbGYpCisgICAgICAgICAgICBuYW1lT2s9MAorICAgICAgICBlbGlmIGxlbihuYW1lKT4zMDogI25hbWUgdG9vIGxvbmcKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J05hbWUgRXJyb3InLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdOYW1lIHRvbyBsb25nLiBJdCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuICcrCisgICAgICAgICAgICAgICAgICAgICczMCBjaGFyYWN0ZXJzLicsIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgbmFtZU9rPTAKKyAgICAgICAgZWxpZiBuYW1lIGluIHNlbGYudXNlZE5hbWVzOgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nTmFtZSBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J1RoaXMgbmFtZSBpcyBhbHJlYWR5IGluIHVzZS4nLCBwYXJlbnQ9c2VsZikKKyAgICAgICAgICAgIG5hbWVPaz0wCisgICAgICAgIHJldHVybiBuYW1lT2sKKworICAgIGRlZiBPayhzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5OYW1lT2soKToKKyAgICAgICAgICAgIHNlbGYucmVzdWx0PXNlbGYubmFtZS5nZXQoKS5zdHJpcCgpCisgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKQorCisgICAgZGVmIENhbmNlbChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgc2VsZi5yZXN1bHQ9JycKKyAgICAgICAgc2VsZi5kZXN0cm95KCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAjdGVzdCB0aGUgZGlhbG9nCisgICAgcm9vdD1UaygpCisgICAgZGVmIHJ1bigpOgorICAgICAgICBrZXlTZXE9JycKKyAgICAgICAgZGxnPUdldENmZ1NlY3Rpb25OYW1lRGlhbG9nKHJvb3QsJ0dldCBOYW1lJywKKyAgICAgICAgICAgICAgICAnVGhlIGluZm9ybWF0aW9uIGhlcmUgc2hvdWxkIG5lZWQgdG8gYmUgd29yZCB3cmFwcGVkLiBUZXN0LicpCisgICAgICAgIHByaW50IGRsZy5yZXN1bHQKKyAgICBCdXR0b24ocm9vdCx0ZXh0PSdEaWFsb2cnLGNvbW1hbmQ9cnVuKS5wYWNrKCkKKyAgICByb290Lm1haW5sb29wKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMzdkMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMzdkMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9keW5PcHRpb25NZW51V2lkZ2V0LnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2R5bk9wdGlvbk1lbnVXaWRnZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgxZjdiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9keW5PcHRpb25NZW51V2lkZ2V0LnB5CkBAIC0wLDAgKzEsMzUgQEAKKyIiIgorT3B0aW9uTWVudSB3aWRnZXQgbW9kaWZpZWQgdG8gYWxsb3cgZHluYW1pYyBtZW51IHJlY29uZmlndXJhdGlvbgorYW5kIHNldHRpbmcgb2YgaGlnaGxpZ2h0dGhpY2tuZXNzCisiIiIKK2Zyb20gVGtpbnRlciBpbXBvcnQgT3B0aW9uTWVudQorZnJvbSBUa2ludGVyIGltcG9ydCBfc2V0aXQKK2ltcG9ydCBjb3B5CisKK2NsYXNzIER5bk9wdGlvbk1lbnUoT3B0aW9uTWVudSk6CisgICAgIiIiCisgICAgdW5saWtlIE9wdGlvbk1lbnUsIG91ciBrd2FyZ3MgY2FuIGluY2x1ZGUgaGlnaGxpZ2h0dGhpY2tuZXNzCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFyaWFibGUsIHZhbHVlLCAqdmFsdWVzLCAqKmt3YXJncyk6CisgICAgICAgICNnZXQgYSBjb3B5IG9mIGt3YXJncyBiZWZvcmUgT3B0aW9uTWVudS5fX2luaXRfXyBtdW5nZXMgdGhlbQorICAgICAgICBrd2FyZ3NDb3B5PWNvcHkuY29weShrd2FyZ3MpCisgICAgICAgIGlmICdoaWdobGlnaHR0aGlja25lc3MnIGluIGt3YXJncy5rZXlzKCk6CisgICAgICAgICAgICBkZWwoa3dhcmdzWydoaWdobGlnaHR0aGlja25lc3MnXSkKKyAgICAgICAgT3B0aW9uTWVudS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHZhcmlhYmxlLCB2YWx1ZSwgKnZhbHVlcywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuY29uZmlnKGhpZ2hsaWdodHRoaWNrbmVzcz1rd2FyZ3NDb3B5LmdldCgnaGlnaGxpZ2h0dGhpY2tuZXNzJykpCisgICAgICAgICNzZWxmLm1lbnU9c2VsZlsnbWVudSddCisgICAgICAgIHNlbGYudmFyaWFibGU9dmFyaWFibGUKKyAgICAgICAgc2VsZi5jb21tYW5kPWt3YXJncy5nZXQoJ2NvbW1hbmQnKQorCisgICAgZGVmIFNldE1lbnUoc2VsZix2YWx1ZUxpc3QsdmFsdWU9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBjbGVhciBhbmQgcmVsb2FkIHRoZSBtZW51IHdpdGggYSBuZXcgc2V0IG9mIG9wdGlvbnMuCisgICAgICAgIHZhbHVlTGlzdCAtIGxpc3Qgb2YgbmV3IG9wdGlvbnMKKyAgICAgICAgdmFsdWUgLSBpbml0aWFsIHZhbHVlIHRvIHNldCB0aGUgb3B0aW9ubWVudSdzIG1lbnVidXR0b24gdG8KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGZbJ21lbnUnXS5kZWxldGUoMCwnZW5kJykKKyAgICAgICAgZm9yIGl0ZW0gaW4gdmFsdWVMaXN0OgorICAgICAgICAgICAgc2VsZlsnbWVudSddLmFkZF9jb21tYW5kKGxhYmVsPWl0ZW0sCisgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9X3NldGl0KHNlbGYudmFyaWFibGUsaXRlbSxzZWxmLmNvbW1hbmQpKQorICAgICAgICBpZiB2YWx1ZToKKyAgICAgICAgICAgIHNlbGYudmFyaWFibGUuc2V0KHZhbHVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2R5bk9wdGlvbk1lbnVXaWRnZXQucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2R5bk9wdGlvbk1lbnVXaWRnZXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTJjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvZHluT3B0aW9uTWVudVdpZGdldC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2R5bk9wdGlvbk1lbnVXaWRnZXQucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2R5bk9wdGlvbk1lbnVXaWRnZXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTJjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvZHluT3B0aW9uTWVudVdpZGdldC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2V4dGVuZC50eHQgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvZXh0ZW5kLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWNiMmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2V4dGVuZC50eHQKQEAgLTAsMCArMSw4MyBAQAorV3JpdGluZyBhbiBJRExFIGV4dGVuc2lvbgorPT09PT09PT09PT09PT09PT09PT09PT09PQorCitBbiBJRExFIGV4dGVuc2lvbiBjYW4gZGVmaW5lIG5ldyBrZXkgYmluZGluZ3MgYW5kIG1lbnUgZW50cmllcyBmb3IgSURMRQorZWRpdCB3aW5kb3dzLiAgVGhlcmUgaXMgYSBzaW1wbGUgbWVjaGFuaXNtIHRvIGxvYWQgZXh0ZW5zaW9ucyB3aGVuIElETEUKK3N0YXJ0cyB1cCBhbmQgdG8gYXR0YWNoIHRoZW0gdG8gZWFjaCBlZGl0IHdpbmRvdy4gKEl0IGlzIGFsc28gcG9zc2libGUKK3RvIG1ha2Ugb3RoZXIgY2hhbmdlcyB0byBJRExFLCBidXQgdGhpcyBtdXN0IGJlIGRvbmUgYnkgZWRpdGluZyB0aGUgSURMRQorc291cmNlIGNvZGUuKQorCitUaGUgbGlzdCBvZiBleHRlbnNpb25zIGxvYWRlZCBhdCBzdGFydHVwIHRpbWUgaXMgY29uZmlndXJlZCBieSBlZGl0aW5nCit0aGUgZmlsZSBjb25maWctZXh0ZW5zaW9ucy5kZWYuICBTZWUgYmVsb3cgZm9yIGRldGFpbHMuCisKK0FuIElETEUgZXh0ZW5zaW9uIGlzIGRlZmluZWQgYnkgYSBjbGFzcy4gIE1ldGhvZHMgb2YgdGhlIGNsYXNzIGRlZmluZQorYWN0aW9ucyB0aGF0IGFyZSBpbnZva2VkIGJ5IGV2ZW50IGJpbmRpbmdzIG9yIG1lbnUgZW50cmllcy4gQ2xhc3MgKG9yCitpbnN0YW5jZSkgdmFyaWFibGVzIGRlZmluZSB0aGUgYmluZGluZ3MgYW5kIG1lbnUgYWRkaXRpb25zOyB0aGVzZSBhcmUKK2F1dG9tYXRpY2FsbHkgYXBwbGllZCBieSBJRExFIHdoZW4gdGhlIGV4dGVuc2lvbiBpcyBsaW5rZWQgdG8gYW4gZWRpdAord2luZG93LgorCitBbiBJRExFIGV4dGVuc2lvbiBjbGFzcyBpcyBpbnN0YW50aWF0ZWQgd2l0aCBhIHNpbmdsZSBhcmd1bWVudCwKK2BlZGl0d2luJywgYW4gRWRpdG9yV2luZG93IGluc3RhbmNlLiBUaGUgZXh0ZW5zaW9uIGNhbm5vdCBhc3N1bWUgbXVjaAorYWJvdXQgdGhpcyBhcmd1bWVudCwgYnV0IGl0IGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgZm9sbG93aW5nIGluc3RhbmNlCit2YXJpYWJsZXM6CisKKyAgICB0ZXh0CWEgVGV4dCBpbnN0YW5jZSAoYSB3aWRnZXQpCisgICAgaW8JCWFuIElPQmluZGluZyBpbnN0YW5jZSAobW9yZSBhYm91dCB0aGlzIGxhdGVyKQorICAgIGZsaXN0CXRoZSBGaWxlTGlzdCBpbnN0YW5jZSAoc2hhcmVkIGJ5IGFsbCBlZGl0IHdpbmRvd3MpCisKKyhUaGVyZSBhcmUgYSBmZXcgbW9yZSwgYnV0IHRoZXkgYXJlIHJhcmVseSB1c2VmdWwuKQorCitUaGUgZXh0ZW5zaW9uIGNsYXNzIG11c3Qgbm90IGRpcmVjdGx5IGJpbmQgV2luZG93IE1hbmFnZXIgKGUuZy4gWCkgZXZlbnRzLgorUmF0aGVyLCBpdCBtdXN0IGRlZmluZSBvbmUgb3IgbW9yZSB2aXJ0dWFsIGV2ZW50cywgZS5nLiA8PHpvb20taGVpZ2h0Pj4sIGFuZAorY29ycmVzcG9uZGluZyBtZXRob2RzLCBlLmcuIHpvb21faGVpZ2h0X2V2ZW50KCkuICBUaGUgdmlydHVhbCBldmVudHMgd2lsbCBiZQorYm91bmQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kcywgYW5kIFdpbmRvdyBNYW5hZ2VyIGV2ZW50cyBjYW4gdGhlbiBiZSBib3VuZAordG8gdGhlIHZpcnR1YWwgZXZlbnRzLiAoVGhpcyBpbmRpcmVjdGlvbiBpcyBkb25lIHNvIHRoYXQgdGhlIGtleSBiaW5kaW5ncyBjYW4KK2Vhc2lseSBiZSBjaGFuZ2VkLCBhbmQgc28gdGhhdCBvdGhlciBzb3VyY2VzIG9mIHZpcnR1YWwgZXZlbnRzIGNhbiBleGlzdCwgc3VjaAorYXMgbWVudSBlbnRyaWVzLikKKworQW4gZXh0ZW5zaW9uIGNhbiBkZWZpbmUgbWVudSBlbnRyaWVzLiAgVGhpcyBpcyBkb25lIHdpdGggYSBjbGFzcyBvciBpbnN0YW5jZQordmFyaWFibGUgbmFtZWQgbWVudWRlZnM7IGl0IHNob3VsZCBiZSBhIGxpc3Qgb2YgcGFpcnMsIHdoZXJlIGVhY2ggcGFpciBpcyBhCittZW51IG5hbWUgKGxvd2VyY2FzZSkgYW5kIGEgbGlzdCBvZiBtZW51IGVudHJpZXMuIEVhY2ggbWVudSBlbnRyeSBpcyBlaXRoZXIKK05vbmUgKHRvIGluc2VydCBhIHNlcGFyYXRvciBlbnRyeSkgb3IgYSBwYWlyIG9mIHN0cmluZ3MgKG1lbnVfbGFiZWwsCit2aXJ0dWFsX2V2ZW50KS4gIEhlcmUsIG1lbnVfbGFiZWwgaXMgdGhlIGxhYmVsIG9mIHRoZSBtZW51IGVudHJ5LCBhbmQKK3ZpcnR1YWxfZXZlbnQgaXMgdGhlIHZpcnR1YWwgZXZlbnQgdG8gYmUgZ2VuZXJhdGVkIHdoZW4gdGhlIGVudHJ5IGlzIHNlbGVjdGVkLgorQW4gdW5kZXJzY29yZSBpbiB0aGUgbWVudSBsYWJlbCBpcyByZW1vdmVkOyB0aGUgY2hhcmFjdGVyIGZvbGxvd2luZyB0aGUKK3VuZGVyc2NvcmUgaXMgZGlzcGxheWVkIHVuZGVybGluZWQsIHRvIGluZGljYXRlIHRoZSBzaG9ydGN1dCBjaGFyYWN0ZXIgKGZvcgorV2luZG93cykuCisKK0F0IHRoZSBtb21lbnQsIGV4dGVuc2lvbnMgY2Fubm90IGRlZmluZSB3aG9sZSBuZXcgbWVudXM7IHRoZXkgbXVzdCBkZWZpbmUKK2VudHJpZXMgaW4gZXhpc3RpbmcgbWVudXMuICBTb21lIG1lbnVzIGFyZSBub3QgcHJlc2VudCBvbiBzb21lIHdpbmRvd3M7IHN1Y2gKK2VudHJ5IGRlZmluaXRpb25zIGFyZSB0aGVuIGlnbm9yZWQsIGJ1dCBrZXkgYmluZGluZ3MgYXJlIHN0aWxsIGFwcGxpZWQuICAoVGhpcworc2hvdWxkIHByb2JhYmx5IGJlIHJlZmluZWQgaW4gdGhlIGZ1dHVyZS4pCisKK0V4dGVuc2lvbnMgYXJlIG5vdCByZXF1aXJlZCB0byBkZWZpbmUgbWVudSBlbnRyaWVzIGZvciBhbGwgdGhlIGV2ZW50cyB0aGV5CitpbXBsZW1lbnQuICAoVGhleSBhcmUgYWxzbyBub3QgcmVxdWlyZWQgdG8gY3JlYXRlIGtleWJpbmRpbmdzLCBidXQgaW4gdGhhdAorY2FzZSB0aGVyZSBtdXN0IGJlIGVtcHR5IGJpbmRpbmdzIGluIGNvZmlnLWV4dGVuc2lvbnMuZGVmKQorCitIZXJlIGlzIGEgY29tcGxldGUgZXhhbXBsZToKKworY2xhc3MgWm9vbUhlaWdodDoKKworICAgIG1lbnVkZWZzID0gWworICAgICAgICAoJ2VkaXQnLCBbCisgICAgICAgICAgICBOb25lLCAjIFNlcGFyYXRvcgorICAgICAgICAgICAgKCdfWm9vbSBIZWlnaHQnLCAnPDx6b29tLWhlaWdodD4+JyksCisgICAgICAgICBdKQorICAgIF0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlZGl0d2luKToKKyAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgorCisgICAgZGVmIHpvb21faGVpZ2h0X2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgIi4uLkRvIHdoYXQgeW91IHdhbnQgaGVyZS4uLiIKKworVGhlIGZpbmFsIHBpZWNlIG9mIHRoZSBwdXp6bGUgaXMgdGhlIGZpbGUgImNvbmZpZy1leHRlbnNpb25zLmRlZiIsIHdoaWNoIGlzCit1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgbG9hZGluZyBvZiBleHRlbnNpb25zIGFuZCB0byBlc3RhYmxpc2gga2V5IChvciwgbW9yZQorZ2VuZXJhbGx5LCBldmVudCkgYmluZGluZ3MgdG8gdGhlIHZpcnR1YWwgZXZlbnRzIGRlZmluZWQgaW4gdGhlIGV4dGVuc2lvbnMuCisKK1NlZSB0aGUgY29tbWVudHMgYXQgdGhlIHRvcCBvZiBjb25maWctZXh0ZW5zaW9ucy5kZWYgZm9yIGluZm9ybWF0aW9uLiAgSXQncworY3VycmVudGx5IG5lY2Vzc2FyeSB0byBtYW51YWxseSBtb2RpZnkgdGhhdCBmaWxlIHRvIGNoYW5nZSBJRExFJ3MgZXh0ZW5zaW9uCitsb2FkaW5nIG9yIGV4dGVuc2lvbiBrZXkgYmluZGluZ3MuCisKK0ZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIGJpbmRpbmcgcmVmZXIgdG8gdGhlIFRraW50ZXIgUmVzb3VyY2VzIHdlYiBwYWdlIGF0CitweXRob24ub3JnIGFuZCB0byB0aGUgVGsgQ29tbWFuZCAiYmluZCIgbWFuIHBhZ2UuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvaGVscC50eHQgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvaGVscC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0MmUwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9oZWxwLnR4dApAQCAtMCwwICsxLDMwMiBAQAorW1NlZSB0aGUgZW5kIG9mIHRoaXMgZmlsZSBmb3IgKiogVElQUyAqKiBvbiB1c2luZyBJRExFICEhXQorCitDbGljayBvbiB0aGUgZG90dGVkIGxpbmUgYXQgdGhlIHRvcCBvZiBhIG1lbnUgdG8gInRlYXIgaXQgb2ZmIjogYQorc2VwYXJhdGUgd2luZG93IGNvbnRhaW5pbmcgdGhlIG1lbnUgaXMgY3JlYXRlZC4KKworRmlsZSBNZW51OgorCisJTmV3IFdpbmRvdyAgICAgICAtLSBDcmVhdGUgYSBuZXcgZWRpdGluZyB3aW5kb3cKKwlPcGVuLi4uICAgICAgICAgIC0tIE9wZW4gYW4gZXhpc3RpbmcgZmlsZQorCVJlY2VudCBGaWxlcy4uLiAgLS0gT3BlbiBhIGxpc3Qgb2YgcmVjZW50IGZpbGVzCisJT3BlbiBNb2R1bGUuLi4gICAtLSBPcGVuIGFuIGV4aXN0aW5nIG1vZHVsZSAoc2VhcmNoZXMgc3lzLnBhdGgpCisJQ2xhc3MgQnJvd3NlciAgICAtLSBTaG93IGNsYXNzZXMgYW5kIG1ldGhvZHMgaW4gY3VycmVudCBmaWxlCisJUGF0aCBCcm93c2VyICAgICAtLSBTaG93IHN5cy5wYXRoIGRpcmVjdG9yaWVzLCBtb2R1bGVzLCBjbGFzc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG1ldGhvZHMKKwktLS0KKwlTYXZlICAgICAgICAgICAgIC0tIFNhdmUgY3VycmVudCB3aW5kb3cgdG8gdGhlIGFzc29jaWF0ZWQgZmlsZSAodW5zYXZlZAorCQkgICAgICAgICAgICB3aW5kb3dzIGhhdmUgYSAqIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHdpbmRvdyB0aXRsZSkKKworCVNhdmUgQXMuLi4gICAgICAgLS0gU2F2ZSBjdXJyZW50IHdpbmRvdyB0byBuZXcgZmlsZSwgd2hpY2ggYmVjb21lcworCQkgICAgICAgICAgICB0aGUgYXNzb2NpYXRlZCBmaWxlCisJU2F2ZSBDb3B5IEFzLi4uICAtLSBTYXZlIGN1cnJlbnQgd2luZG93IHRvIGRpZmZlcmVudCBmaWxlCisJCSAgICAgICAgICAgIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGFzc29jaWF0ZWQgZmlsZQorCS0tLQorCVByaW50IFdpbmRvdyAgICAgLS0gUHJpbnQgdGhlIGN1cnJlbnQgd2luZG93CisJLS0tCisJQ2xvc2UgICAgICAgICAgICAtLSBDbG9zZSBjdXJyZW50IHdpbmRvdyAoYXNrcyB0byBzYXZlIGlmIHVuc2F2ZWQpCisJRXhpdCAgICAgICAgICAgICAtLSBDbG9zZSBhbGwgd2luZG93cywgcXVpdCAoYXNrcyB0byBzYXZlIGlmIHVuc2F2ZWQpCisKK0VkaXQgTWVudToKKworCVVuZG8gICAgICAgICAgICAgLS0gVW5kbyBsYXN0IGNoYW5nZSB0byBjdXJyZW50IHdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBIG1heGltdW0gb2YgMTAwMCBjaGFuZ2VzIG1heSBiZSB1bmRvbmUpCisJUmVkbyAgICAgICAgICAgICAtLSBSZWRvIGxhc3QgdW5kb25lIGNoYW5nZSB0byBjdXJyZW50IHdpbmRvdworCS0tLQorCUN1dCAgICAgICAgICAgICAgLS0gQ29weSBhIHNlbGVjdGlvbiBpbnRvIHN5c3RlbS13aWRlIGNsaXBib2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGRlbGV0ZSB0aGUgc2VsZWN0aW9uCisJQ29weSAgICAgICAgICAgICAtLSBDb3B5IHNlbGVjdGlvbiBpbnRvIHN5c3RlbS13aWRlIGNsaXBib2FyZAorCVBhc3RlICAgICAgICAgICAgLS0gSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdworCVNlbGVjdCBBbGwgICAgICAgLS0gU2VsZWN0IHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGVkaXQgYnVmZmVyCisJLS0tCisJRmluZC4uLiAgICAgICAgICAtLSBPcGVuIGEgc2VhcmNoIGRpYWxvZyBib3ggd2l0aCBtYW55IG9wdGlvbnMKKwlGaW5kIEFnYWluICAgICAgIC0tIFJlcGVhdCBsYXN0IHNlYXJjaAorCUZpbmQgU2VsZWN0aW9uICAgLS0gU2VhcmNoIGZvciB0aGUgc3RyaW5nIGluIHRoZSBzZWxlY3Rpb24KKwlGaW5kIGluIEZpbGVzLi4uIC0tIE9wZW4gYSBzZWFyY2ggZGlhbG9nIGJveCBmb3Igc2VhcmNoaW5nIGZpbGVzCisJUmVwbGFjZS4uLiAgICAgICAtLSBPcGVuIGEgc2VhcmNoLWFuZC1yZXBsYWNlIGRpYWxvZyBib3gKKwlHbyB0byBMaW5lICAgICAgIC0tIEFzayBmb3IgYSBsaW5lIG51bWJlciBhbmQgc2hvdyB0aGF0IGxpbmUKKwlTaG93IENhbGx0aXAgICAgIC0tIE9wZW4gYSBzbWFsbCB3aW5kb3cgd2l0aCBmdW5jdGlvbiBwYXJhbSBoaW50cworCVNob3cgQ29tcGxldGlvbnMgLS0gT3BlbiBhIHNjcm9sbCB3aW5kb3cgYWxsb3dpbmcgc2VsZWN0aW9uIGtleXdvcmRzCisJCQkgICAgYW5kIGF0dHJpYnV0ZXMuIChzZWUgJypUSVBTKicsIGJlbG93KQorCVNob3cgUGFyZW5zCSAtLSBIaWdobGlnaHQgdGhlIHN1cnJvdW5kaW5nIHBhcmVudGhlc2lzCisJRXhwYW5kIFdvcmQgICAgICAtLSBFeHBhbmQgdGhlIHdvcmQgeW91IGhhdmUgdHlwZWQgdG8gbWF0Y2ggYW5vdGhlcgorCQkgICAgICAgICAgICB3b3JkIGluIHRoZSBzYW1lIGJ1ZmZlcjsgcmVwZWF0IHRvIGdldCBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGV4cGFuc2lvbgorCitGb3JtYXQgTWVudSAob25seSBpbiBFZGl0IHdpbmRvdyk6CisKKwlJbmRlbnQgUmVnaW9uICAgICAgIC0tIFNoaWZ0IHNlbGVjdGVkIGxpbmVzIHJpZ2h0IDQgc3BhY2VzCisJRGVkZW50IFJlZ2lvbiAgICAgICAtLSBTaGlmdCBzZWxlY3RlZCBsaW5lcyBsZWZ0IDQgc3BhY2VzCisJQ29tbWVudCBPdXQgUmVnaW9uICAtLSBJbnNlcnQgIyMgaW4gZnJvbnQgb2Ygc2VsZWN0ZWQgbGluZXMKKwlVbmNvbW1lbnQgUmVnaW9uICAgIC0tIFJlbW92ZSBsZWFkaW5nICMgb3IgIyMgZnJvbSBzZWxlY3RlZCBsaW5lcworCVRhYmlmeSBSZWdpb24gICAgICAgLS0gVHVybnMgKmxlYWRpbmcqIHN0cmV0Y2hlcyBvZiBzcGFjZXMgaW50byB0YWJzCisJCShOb3RlOiBXZSByZWNvbW1lbmQgdXNpbmcgNCBzcGFjZSBibG9ja3MgdG8gaW5kZW50IFB5dGhvbiBjb2RlLikKKwlVbnRhYmlmeSBSZWdpb24gICAgIC0tIFR1cm4gKmFsbCogdGFicyBpbnRvIHRoZSByaWdodCBudW1iZXIgb2Ygc3BhY2VzCisJTmV3IEluZGVudCBXaWR0aC4uLiAtLSBPcGVuIGRpYWxvZyB0byBjaGFuZ2UgaW5kZW50IHdpZHRoCisJRm9ybWF0IFBhcmFncmFwaCAgICAtLSBSZWZvcm1hdCB0aGUgY3VycmVudCBibGFuay1saW5lLXNlcGFyYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFncmFwaAorCitSdW4gTWVudSAob25seSBpbiBFZGl0IHdpbmRvdyk6CisKKwlQeXRob24gU2hlbGwgLS0gT3BlbiBvciB3YWtlIHVwIHRoZSBQeXRob24gc2hlbGwgd2luZG93CisJLS0tCisJQ2hlY2sgTW9kdWxlIC0tIFJ1biBhIHN5bnRheCBjaGVjayBvbiB0aGUgbW9kdWxlCisJUnVuIE1vZHVsZSAgIC0tIEV4ZWN1dGUgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgX19tYWluX18gbmFtZXNwYWNlCisKK1NoZWxsIE1lbnUgKG9ubHkgaW4gU2hlbGwgd2luZG93KToKKworCVZpZXcgTGFzdCBSZXN0YXJ0IC0tIFNjcm9sbCB0aGUgc2hlbGwgd2luZG93IHRvIHRoZSBsYXN0IHJlc3RhcnQKKwlSZXN0YXJ0IFNoZWxsICAgICAtLSBSZXN0YXJ0IHRoZSBpbnRlcnByZXRlciB3aXRoIGEgZnJlc2ggZW52aXJvbm1lbnQKKworRGVidWcgTWVudSAob25seSBpbiBTaGVsbCB3aW5kb3cpOgorCisJR28gdG8gRmlsZS9MaW5lICAgLS0gbG9vayBhcm91bmQgdGhlIGluc2VydCBwb2ludCBmb3IgYSBmaWxlbmFtZQorCQkgICAgICAgICAgICAgYW5kIGxpbmUgbnVtYmVyLCBvcGVuIHRoZSBmaWxlLCBhbmQgc2hvdyB0aGUgbGluZQorCURlYnVnZ2VyICh0b2dnbGUpIC0tIFJ1biBjb21tYW5kcyBpbiB0aGUgc2hlbGwgdW5kZXIgdGhlIGRlYnVnZ2VyCisJU3RhY2sgVmlld2VyICAgICAgLS0gU2hvdyB0aGUgc3RhY2sgdHJhY2ViYWNrIG9mIHRoZSBsYXN0IGV4Y2VwdGlvbgorCUF1dG8tb3BlbiBTdGFjayBWaWV3ZXIgKHRvZ2dsZSkgLS0gT3BlbiBzdGFjayB2aWV3ZXIgb24gdHJhY2ViYWNrCisKK09wdGlvbnMgTWVudToKKworCUNvbmZpZ3VyZSBJRExFIC0tIE9wZW4gYSBjb25maWd1cmF0aW9uIGRpYWxvZy4gIEZvbnRzLCBpbmRlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5YmluZGluZ3MsIGFuZCBjb2xvciB0aGVtZXMgbWF5IGJlIGFsdGVyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0dXAgUHJlZmVyZW5jZXMgbWF5IGJlIHNldCwgYW5kIEFkZGl0aW9uYWwgSGVscAorICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VzIGNhbiBiZSBzcGVjaWZpZWQuCisJCQkgIAorCQkJICBPbiBPUyBYIHRoaXMgbWVudSBpcyBub3QgcHJlc2VudCwgdXNlCisJCQkgIG1lbnUgJ0lETEUgLT4gUHJlZmVyZW5jZXMuLi4nIGluc3RlYWQuCisJLS0tCisJQ29kZSBDb250ZXh0IC0tCSAgT3BlbiBhIHBhbmUgYXQgdGhlIHRvcCBvZiB0aGUgZWRpdCB3aW5kb3cgd2hpY2gKKwkJCSAgc2hvd3MgdGhlIGJsb2NrIGNvbnRleHQgb2YgdGhlIHNlY3Rpb24gb2YgY29kZQorCQkJICB3aGljaCBpcyBzY3JvbGxpbmcgb2ZmIHRoZSB0b3Agb3IgdGhlIHdpbmRvdy4KKwkJCSAgKE5vdCBwcmVzZW50IGluIFNoZWxsIHdpbmRvdy4pCisKK1dpbmRvd3MgTWVudToKKworCVpvb20gSGVpZ2h0IC0tIHRvZ2dsZXMgdGhlIHdpbmRvdyBiZXR3ZWVuIGNvbmZpZ3VyZWQgc2l6ZQorCWFuZCBtYXhpbXVtIGhlaWdodC4KKwktLS0KKwlUaGUgcmVzdCBvZiB0aGlzIG1lbnUgbGlzdHMgdGhlIG5hbWVzIG9mIGFsbCBvcGVuIHdpbmRvd3M7CisJc2VsZWN0IG9uZSB0byBicmluZyBpdCB0byB0aGUgZm9yZWdyb3VuZCAoZGVpY29uaWZ5aW5nIGl0IGlmCisJbmVjZXNzYXJ5KS4KKworSGVscCBNZW51OgorCisJQWJvdXQgSURMRSAgLS0gVmVyc2lvbiwgY29weXJpZ2h0LCBsaWNlbnNlLCBjcmVkaXRzCisJSURMRSBSZWFkbWUgLS0gQmFja2dyb3VuZCBkaXNjdXNzaW9uIGFuZCBjaGFuZ2UgZGV0YWlscworCS0tLQorCUlETEUgSGVscCAgIC0tIERpc3BsYXkgdGhpcyBmaWxlCisJUHl0aG9uIERvY3MgLS0gQWNjZXNzIGxvY2FsIFB5dGhvbiBkb2N1bWVudGF0aW9uLCBpZgorCQkgICAgICAgaW5zdGFsbGVkLiAgT3RoZXJ3aXNlLCBhY2Nlc3Mgd3d3LnB5dGhvbi5vcmcuCisJLS0tCisJKEFkZGl0aW9uYWwgSGVscCBTb3VyY2VzIG1heSBiZSBhZGRlZCBoZXJlKQorCitFZGl0IGNvbnRleHQgbWVudSAoUmlnaHQtY2xpY2sgLyBDb250cm9sLWNsaWNrIG9uIE9TIFggaW4gRWRpdCB3aW5kb3cpOgorCisgICAgCUN1dCAgICAgICAgICAgICAgLS0gQ29weSBhIHNlbGVjdGlvbiBpbnRvIHN5c3RlbS13aWRlIGNsaXBib2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGRlbGV0ZSB0aGUgc2VsZWN0aW9uCisJQ29weSAgICAgICAgICAgICAtLSBDb3B5IHNlbGVjdGlvbiBpbnRvIHN5c3RlbS13aWRlIGNsaXBib2FyZAorCVBhc3RlICAgICAgICAgICAgLS0gSW5zZXJ0IHN5c3RlbS13aWRlIGNsaXBib2FyZCBpbnRvIHdpbmRvdworCVNldCBCcmVha3BvaW50ICAgLS0gU2V0cyBhIGJyZWFrcG9pbnQgKHdoZW4gZGVidWdnZXIgb3BlbikKKwlDbGVhciBCcmVha3BvaW50IC0tIENsZWFycyB0aGUgYnJlYWtwb2ludCBvbiB0aGF0IGxpbmUKKworU2hlbGwgY29udGV4dCBtZW51IChSaWdodC1jbGljayAvIENvbnRyb2wtY2xpY2sgb24gT1MgWCBpbiBTaGVsbCB3aW5kb3cpOgorCisJQ3V0ICAgICAgICAgICAgICAtLSBDb3B5IGEgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZGVsZXRlIHRoZSBzZWxlY3Rpb24KKwlDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCisJUGFzdGUgICAgICAgICAgICAtLSBJbnNlcnQgc3lzdGVtLXdpZGUgY2xpcGJvYXJkIGludG8gd2luZG93CisgICAgICAgIC0tLQorCUdvIHRvIGZpbGUvbGluZSAgLS0gU2FtZSBhcyBpbiBEZWJ1ZyBtZW51CisKKworKiogVElQUyAqKgorPT09PT09PT09PQorCitBZGRpdGlvbmFsIEhlbHAgU291cmNlczoKKworCVdpbmRvd3MgdXNlcnMgY2FuIEdvb2dsZSBvbiB6b3Blc2hlbGYuY2htIHRvIGFjY2VzcyBab3BlIGhlbHAgZmlsZXMgaW4KKwl0aGUgV2luZG93cyBoZWxwIGZvcm1hdC4gIFRoZSBBZGRpdGlvbmFsIEhlbHAgU291cmNlcyBmZWF0dXJlIG9mIHRoZQorCWNvbmZpZ3VyYXRpb24gR1VJIHN1cHBvcnRzIC5jaG0sIGFsb25nIHdpdGggYW55IG90aGVyIGZpbGV0eXBlcworCXN1cHBvcnRlZCBieSB5b3VyIGJyb3dzZXIuICBTdXBwbHkgYSBNZW51IEl0ZW0gdGl0bGUsIGFuZCBlbnRlciB0aGUKKwlsb2NhdGlvbiBpbiB0aGUgSGVscCBGaWxlIFBhdGggc2xvdCBvZiB0aGUgTmV3IEhlbHAgU291cmNlIGRpYWxvZy4gIFVzZQorCWh0dHA6Ly8gYW5kL29yIHd3dy4gdG8gaWRlbnRpZnkgZXh0ZXJuYWwgVVJMcywgb3IgZG93bmxvYWQgdGhlIGZpbGUgYW5kCisJYnJvd3NlIGZvciBpdHMgcGF0aCBvbiB5b3VyIG1hY2hpbmUgdXNpbmcgdGhlIEJyb3dzZSBidXR0b24uCisKKwlBbGwgdXNlcnMgY2FuIGFjY2VzcyB0aGUgZXh0ZW5zaXZlIHNvdXJjZXMgb2YgaGVscCwgaW5jbHVkaW5nCisJdHV0b3JpYWxzLCBhdmFpbGFibGUgYXQgd3d3LnB5dGhvbi5vcmcvZG9jLiAgU2VsZWN0ZWQgVVJMcyBjYW4gYmUgYWRkZWQKKwlvciByZW1vdmVkIGZyb20gdGhlIEhlbHAgbWVudSBhdCBhbnkgdGltZSB1c2luZyBDb25maWd1cmUgSURMRS4KKworQmFzaWMgZWRpdGluZyBhbmQgbmF2aWdhdGlvbjoKKworCUJhY2tzcGFjZSBkZWxldGVzIGNoYXIgdG8gdGhlIGxlZnQ7IERFTCBkZWxldGVzIGNoYXIgdG8gdGhlIHJpZ2h0LgorCUNvbnRyb2wtYmFja3NwYWNlIGRlbGV0ZXMgd29yZCBsZWZ0LCBDb250cm9sLURFTCBkZWxldGVzIHdvcmQgcmlnaHQuCisJQXJyb3cga2V5cyBhbmQgUGFnZSBVcC9Eb3duIG1vdmUgYXJvdW5kLgorCUNvbnRyb2wtbGVmdC9yaWdodCBBcnJvdyBtb3ZlcyBieSB3b3JkcyBpbiBhIHN0cmFuZ2UgYnV0IHVzZWZ1bCB3YXkuCisJSG9tZS9FbmQgZ28gdG8gYmVnaW4vZW5kIG9mIGxpbmUuCisJQ29udHJvbC1Ib21lL0VuZCBnbyB0byBiZWdpbi9lbmQgb2YgZmlsZS4KKwlTb21lIHVzZWZ1bCBFbWFjcyBiaW5kaW5ncyBhcmUgaW5oZXJpdGVkIGZyb20gVGNsL1RrOgorCQlDb250cm9sLWEgICAgIGJlZ2lubmluZyBvZiBsaW5lCisJCUNvbnRyb2wtZSAgICAgZW5kIG9mIGxpbmUKKwkJQ29udHJvbC1rICAgICBraWxsIGxpbmUgKGJ1dCBkb2Vzbid0IHB1dCBpdCBpbiBjbGlwYm9hcmQpCisJCUNvbnRyb2wtbCAgICAgY2VudGVyIHdpbmRvdyBhcm91bmQgdGhlIGluc2VydGlvbiBwb2ludAorCVN0YW5kYXJkIFdpbmRvd3MgYmluZGluZ3MgbWF5IHdvcmsgb24gdGhhdCBwbGF0Zm9ybS4KKwlLZXliaW5kaW5ncyBhcmUgc2VsZWN0ZWQgaW4gdGhlIFNldHRpbmdzIERpYWxvZywgbG9vayB0aGVyZS4KKworQXV0b21hdGljIGluZGVudGF0aW9uOgorCisJQWZ0ZXIgYSBibG9jay1vcGVuaW5nIHN0YXRlbWVudCwgdGhlIG5leHQgbGluZSBpcyBpbmRlbnRlZCBieSA0IHNwYWNlcworCShpbiB0aGUgUHl0aG9uIFNoZWxsIHdpbmRvdyBieSBvbmUgdGFiKS4gIEFmdGVyIGNlcnRhaW4ga2V5d29yZHMKKwkoYnJlYWssIHJldHVybiBldGMuKSB0aGUgbmV4dCBsaW5lIGlzIGRlZGVudGVkLiAgSW4gbGVhZGluZworCWluZGVudGF0aW9uLCBCYWNrc3BhY2UgZGVsZXRlcyB1cCB0byA0IHNwYWNlcyBpZiB0aGV5IGFyZSB0aGVyZS4gIFRhYgorCWluc2VydHMgc3BhY2VzIChpbiB0aGUgUHl0aG9uIFNoZWxsIHdpbmRvdyBvbmUgdGFiKSwgbnVtYmVyIGRlcGVuZHMgb24KKwlJbmRlbnQgV2lkdGguICAoTi5CLiBDdXJyZW50bHkgdGFicyBhcmUgcmVzdHJpY3RlZCB0byBmb3VyIHNwYWNlcyBkdWUKKwl0byBUY2wvVGsgaXNzdWVzLikKKworICAgICAgICBTZWUgYWxzbyB0aGUgaW5kZW50L2RlZGVudCByZWdpb24gY29tbWFuZHMgaW4gdGhlIGVkaXQgbWVudS4KKworQ29tcGxldGlvbnM6CisKKwlDb21wbGV0aW9ucyBhcmUgc3VwcGxpZWQgZm9yIGZ1bmN0aW9ucywgY2xhc3NlcywgYW5kIGF0dHJpYnV0ZXMgb2YKKwljbGFzc2VzLCBib3RoIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQuICBDb21wbGV0aW9ucyBhcmUgYWxzbyBwcm92aWRlZAorCWZvciBmaWxlbmFtZXMuCisKKwlUaGUgQXV0b0NvbXBsZXRlV2luZG93IChBQ1cpIHdpbGwgb3BlbiBhZnRlciBhIHByZWRlZmluZWQgZGVsYXkKKwkoZGVmYXVsdCBpcyB0d28gc2Vjb25kcykgYWZ0ZXIgYSAnLicgb3IgKGluIGEgc3RyaW5nKSBhbiBvcy5zZXAgaXMKKwl0eXBlZC4gIElmIGFmdGVyIG9uZSBvZiB0aG9zZSBjaGFyYWN0ZXJzIChwbHVzIHplcm8gb3IgbW9yZSBvdGhlcgorCWNoYXJhY3RlcnMpIHlvdSB0eXBlIGEgVGFiIHRoZSBBQ1cgd2lsbCBvcGVuIGltbWVkaWF0ZWx5IGlmIGEgcG9zc2libGUKKwljb250aW51YXRpb24gaXMgZm91bmQuCisKKwlJZiB0aGVyZSBpcyBvbmx5IG9uZSBwb3NzaWJsZSBjb21wbGV0aW9uIGZvciB0aGUgY2hhcmFjdGVycyBlbnRlcmVkLCBhCisJVGFiIHdpbGwgc3VwcGx5IHRoYXQgY29tcGxldGlvbiB3aXRob3V0IG9wZW5pbmcgdGhlIEFDVy4KKworCSdTaG93IENvbXBsZXRpb25zJyB3aWxsIGZvcmNlIG9wZW4gYSBjb21wbGV0aW9ucyB3aW5kb3cuICBJbiBhbiBlbXB0eQorCXN0cmluZywgdGhpcyB3aWxsIGNvbnRhaW4gdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIE9uIGEKKwlibGFuayBsaW5lLCBpdCB3aWxsIGNvbnRhaW4gdGhlIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIGFuZAorCWNsYXNzZXMgaW4gdGhlIGN1cnJlbnQgbmFtZSBzcGFjZXMsIHBsdXMgYW55IG1vZHVsZXMgaW1wb3J0ZWQuICBJZiBzb21lCisJY2hhcmFjdGVycyBoYXZlIGJlZW4gZW50ZXJlZCwgdGhlIEFDVyB3aWxsIGF0dGVtcHQgdG8gYmUgbW9yZSBzcGVjaWZpYy4KKworCUlmIHN0cmluZyBvZiBjaGFyYWN0ZXJzIGlzIHR5cGVkLCB0aGUgQUNXIHNlbGVjdGlvbiB3aWxsIGp1bXAgdG8gdGhlCisJZW50cnkgbW9zdCBjbG9zZWx5IG1hdGNoaW5nIHRob3NlIGNoYXJhY3RlcnMuIEVudGVyaW5nIGEgVGFiIHdpbGwgY2F1c2UKKwl0aGUgbG9uZ2VzdCBub24tYW1iaWd1b3VzIG1hdGNoIHRvIGJlIGVudGVyZWQgaW4gdGhlIEVkaXQgd2luZG93IG9yCisJU2hlbGwuICBUd28gVGFicyBpbiBhIHJvdyB3aWxsIHN1cHBseSB0aGUgY3VycmVudCBBQ1cgc2VsZWN0aW9uLCBhcworCXdpbGwgUmV0dXJuIG9yIGEgZG91YmxlIGNsaWNrLiAgQ3Vyc29yIGtleXMsIFBhZ2UgVXAvRG93biwgbW91c2UKKwlzZWxlY3Rpb24sIGFuZCB0aGUgc2Nyb2xsd2hlZWwgYWxsIG9wZXJhdGUgb24gdGhlIEFDVy4KKworCSdIaWRkZW4nIGF0dHJpYnV0ZXMgY2FuIGJlIGFjY2Vzc2VkIGJ5IHR5cGluZyB0aGUgYmVnaW5uaW5nIG9mIGhpZGRlbgorCW5hbWUgYWZ0ZXIgYSAnLicuICBlLmcuICdfJy4gIFRoaXMgYWxsb3dzIGFjY2VzcyB0byBtb2R1bGVzIHdpdGgKKwknX19hbGxfXycgc2V0LCBvciB0byBjbGFzcy1wcml2YXRlIGF0dHJpYnV0ZXMuCisKKwlDb21wbGV0aW9ucyBhbmQgdGhlICdFeHBhbmQgV29yZCcgZmFjaWxpdHkgY2FuIHNhdmUgYSBsb3Qgb2YgdHlwaW5nIQorCisJQ29tcGxldGlvbnMgYXJlIGN1cnJlbnRseSBsaW1pdGVkIHRvIHRob3NlIGluIHRoZSBuYW1lc3BhY2VzLiAgTmFtZXMgaW4KKwlhbiBFZGl0IHdpbmRvdyB3aGljaCBhcmUgbm90IHZpYSBfX21haW5fXyBvciBzeXMubW9kdWxlcyB3aWxsIG5vdCBiZQorCWZvdW5kLiAgUnVuIHRoZSBtb2R1bGUgb25jZSB3aXRoIHlvdXIgaW1wb3J0cyB0byBjb3JyZWN0IHRoaXMKKwlzaXR1YXRpb24uICBOb3RlIHRoYXQgSURMRSBpdHNlbGYgcGxhY2VzIHF1aXRlIGEgZmV3IG1vZHVsZXMgaW4KKwlzeXMubW9kdWxlcywgc28gbXVjaCBjYW4gYmUgZm91bmQgYnkgZGVmYXVsdCwgZS5nLiB0aGUgcmUgbW9kdWxlLgorCisJSWYgeW91IGRvbid0IGxpa2UgdGhlIEFDVyBwb3BwaW5nIHVwIHVuYmlkZGVuLCBzaW1wbHkgbWFrZSB0aGUgZGVsYXkKKwlsb25nZXIgb3IgZGlzYWJsZSB0aGUgZXh0ZW5zaW9uLiAgT1RPSCwgeW91IGNvdWxkIG1ha2UgdGhlIGRlbGF5IHplcm8uCisKKwlZb3UgY291bGQgYWxzbyBzd2l0Y2ggb2ZmIHRoZSBDYWxsVGlwcyBleHRlbnNpb24uICAoV2Ugd2lsbCBiZSBhZGRpbmcKKwlhIGRlbGF5IHRvIHRoZSBjYWxsIHRpcCB3aW5kb3cuKQorCitQeXRob24gU2hlbGwgd2luZG93OgorCisJQ29udHJvbC1jIGludGVycnVwdHMgZXhlY3V0aW5nIGNvbW1hbmQuCisJQ29udHJvbC1kIHNlbmRzIGVuZC1vZi1maWxlOyBjbG9zZXMgd2luZG93IGlmIHR5cGVkIGF0ID4+PiBwcm9tcHQuCisKKyAgICBDb21tYW5kIGhpc3Rvcnk6CisKKwlBbHQtcCByZXRyaWV2ZXMgcHJldmlvdXMgY29tbWFuZCBtYXRjaGluZyB3aGF0IHlvdSBoYXZlIHR5cGVkLgorCUFsdC1uIHJldHJpZXZlcyBuZXh0LgorCSAgICAgIChUaGVzZSBhcmUgQ29udHJvbC1wLCBDb250cm9sLW4gb24gT1MgWCkKKwlSZXR1cm4gd2hpbGUgY3Vyc29yIGlzIG9uIGEgcHJldmlvdXMgY29tbWFuZCByZXRyaWV2ZXMgdGhhdCBjb21tYW5kLgorCUV4cGFuZCB3b3JkIGlzIGFsc28gdXNlZnVsIHRvIHJlZHVjZSB0eXBpbmcuCisKKyAgICBTeW50YXggY29sb3JzOgorCisJVGhlIGNvbG9yaW5nIGlzIGFwcGxpZWQgaW4gYSBiYWNrZ3JvdW5kICJ0aHJlYWQiLCBzbyB5b3UgbWF5CisJb2NjYXNpb25hbGx5IHNlZSB1bmNvbG9yaXplZCB0ZXh0LiAgVG8gY2hhbmdlIHRoZSBjb2xvcgorCXNjaGVtZSwgdXNlIHRoZSBDb25maWd1cmUgSURMRSAvIEhpZ2hsaWdodGluZyBkaWFsb2cuCisKKyAgICBQeXRob24gZGVmYXVsdCBzeW50YXggY29sb3JzOgorCisJS2V5d29yZHMJb3JhbmdlCisJQnVpbHRpbnMJcm95YWwgcHVycGxlCisJU3RyaW5ncwkJZ3JlZW4KKwlDb21tZW50cwlyZWQKKwlEZWZpbml0aW9ucwlibHVlCisKKyAgICBTaGVsbCBkZWZhdWx0IGNvbG9yczoKKworCUNvbnNvbGUgb3V0cHV0CWJyb3duCisJc3Rkb3V0CQlibHVlCisJc3RkZXJyCQlyZWQKKwlzdGRpbgkJYmxhY2sKKworT3RoZXIgcHJlZmVyZW5jZXM6CisKKwlUaGUgZm9udCBwcmVmZXJlbmNlcywga2V5YmluZGluZywgYW5kIHN0YXJ0dXAgcHJlZmVyZW5jZXMgY2FuCisJYmUgY2hhbmdlZCB1c2luZyB0aGUgU2V0dGluZ3MgZGlhbG9nLgorCitDb21tYW5kIGxpbmUgdXNhZ2U6CisKKwlFbnRlciBpZGxlIC1oIGF0IHRoZSBjb21tYW5kIHByb21wdCB0byBnZXQgYSB1c2FnZSBtZXNzYWdlLgorCitSdW5uaW5nIHdpdGhvdXQgYSBzdWJwcm9jZXNzOgorCisJSWYgSURMRSBpcyBzdGFydGVkIHdpdGggdGhlIC1uIGNvbW1hbmQgbGluZSBzd2l0Y2ggaXQgd2lsbCBydW4gaW4gYQorCXNpbmdsZSBwcm9jZXNzIGFuZCB3aWxsIG5vdCBjcmVhdGUgdGhlIHN1YnByb2Nlc3Mgd2hpY2ggcnVucyB0aGUgUlBDCisJUHl0aG9uIGV4ZWN1dGlvbiBzZXJ2ZXIuICBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgUHl0aG9uIGNhbm5vdCBjcmVhdGUKKwl0aGUgc3VicHJvY2VzcyBvciB0aGUgUlBDIHNvY2tldCBpbnRlcmZhY2Ugb24geW91ciBwbGF0Zm9ybS4gIEhvd2V2ZXIsCisJaW4gdGhpcyBtb2RlIHVzZXIgY29kZSBpcyBub3QgaXNvbGF0ZWQgZnJvbSBJRExFIGl0c2VsZi4gIEFsc28sIHRoZQorCWVudmlyb25tZW50IGlzIG5vdCByZXN0YXJ0ZWQgd2hlbiBSdW4vUnVuIE1vZHVsZSAoRjUpIGlzIHNlbGVjdGVkLiAgSWYKKwl5b3VyIGNvZGUgaGFzIGJlZW4gbW9kaWZpZWQsIHlvdSBtdXN0IHJlbG9hZCgpIHRoZSBhZmZlY3RlZCBtb2R1bGVzIGFuZAorCXJlLWltcG9ydCBhbnkgc3BlY2lmaWMgaXRlbXMgKGUuZy4gZnJvbSBmb28gaW1wb3J0IGJheikgaWYgdGhlIGNoYW5nZXMKKwlhcmUgdG8gdGFrZSBlZmZlY3QuICBGb3IgdGhlc2UgcmVhc29ucywgaXQgaXMgcHJlZmVyYWJsZSB0byBydW4gSURMRQorCXdpdGggdGhlIGRlZmF1bHQgc3VicHJvY2VzcyBpZiBhdCBhbGwgcG9zc2libGUuCisKK0V4dGVuc2lvbnM6CisKKwlJRExFIGNvbnRhaW5zIGFuIGV4dGVuc2lvbiBmYWNpbGl0eS4gIFNlZSB0aGUgYmVnaW5uaW5nIG9mCisJY29uZmlnLWV4dGVuc2lvbnMuZGVmIGluIHRoZSBpZGxlbGliIGRpcmVjdG9yeSBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKwlUaGUgZGVmYXVsdCBleHRlbnNpb25zIGFyZSBjdXJyZW50bHk6CisKKwkJRm9ybWF0UGFyYWdyYXBoCisJCUF1dG9FeHBhbmQKKwkJWm9vbUhlaWdodAorCQlTY3JpcHRCaW5kaW5nCisJCUNhbGxUaXBzCisJCVBhcmVuTWF0Y2gKKwkJQXV0b0NvbXBsZXRlCisJCUNvZGVDb250ZXh0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvaWRsZS5iYXQgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvaWRsZS5iYXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTc3Yjk2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxlLmJhdApAQCAtMCwwICsxLDQgQEAKK0BlY2hvIG9mZgorcmVtIFN0YXJ0IElETEUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIFB5dGhvbiBpbnRlcnByZXRlcgorc2V0IENVUlJESVI9JX5kcDAKK3N0YXJ0ICJJRExFIiAiJUNVUlJESVIlLi5cLi5ccHl0aG9udy5leGUiICIlQ1VSUkRJUiVpZGxlLnB5dyIgJTEgJTIgJTMgJTQgJTUgJTYgJTcgJTggJTkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxlLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI0OTU1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxlLnB5CkBAIC0wLDAgKzEsMTEgQEAKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgc3lzCisKKyMgSWYgd2UgYXJlIHdvcmtpbmcgb24gYSBkZXZlbG9wbWVudCB2ZXJzaW9uIG9mIElETEUsIHdlIG5lZWQgdG8gcHJlcGVuZCB0aGUKKyMgcGFyZW50IG9mIHRoaXMgaWRsZWxpYiBkaXIgdG8gc3lzLnBhdGguICBPdGhlcndpc2UsIGltcG9ydGluZyBpZGxlbGliIGdldHMKKyMgdGhlIHZlcnNpb24gaW5zdGFsbGVkIHdpdGggdGhlIFB5dGhvbiB1c2VkIHRvIGNhbGwgdGhpcyBtb2R1bGU6CitpZGxlbGliX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkpCitzeXMucGF0aC5pbnNlcnQoMCwgaWRsZWxpYl9kaXIpCisKK2ltcG9ydCBpZGxlbGliLlB5U2hlbGwKK2lkbGVsaWIuUHlTaGVsbC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxlLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGVlZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxlLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGVlZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxlLnB5dyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxlLnB5dwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzdkZDVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUucHl3CkBAIC0wLDAgKzEsMjEgQEAKK3RyeToKKyAgICBpbXBvcnQgaWRsZWxpYi5QeVNoZWxsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBJRExFIGlzIG5vdCBpbnN0YWxsZWQsIGJ1dCBtYXliZSBQeVNoZWxsIGlzIG9uIHN5cy5wYXRoOgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IFB5U2hlbGwKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHJhaXNlCisgICAgZWxzZToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlkbGVkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKFB5U2hlbGwuX19maWxlX18pKQorICAgICAgICBpZiBpZGxlZGlyICE9IG9zLmdldGN3ZCgpOgorICAgICAgICAgICAgIyBXZSdyZSBub3QgaW4gdGhlIElETEUgZGlyZWN0b3J5LCBoZWxwIHRoZSBzdWJwcm9jZXNzIGZpbmQgcnVuLnB5CisgICAgICAgICAgICBweXBhdGggPSBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsICcnKQorICAgICAgICAgICAgaWYgcHlwYXRoOgorICAgICAgICAgICAgICAgIG9zLmVudmlyb25bJ1BZVEhPTlBBVEgnXSA9IHB5cGF0aCArICc6JyArIGlkbGVkaXIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gaWRsZWRpcgorICAgICAgICBQeVNoZWxsLm1haW4oKQorZWxzZToKKyAgICBpZGxlbGliLlB5U2hlbGwubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvaWRsZXZlci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxldmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MWFmYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvaWRsZXZlci5weQpAQCAtMCwwICsxIEBACitJRExFX1ZFUlNJT04gPSAiMi43LjUiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvaWRsZXZlci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvaWRsZXZlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0YzRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxldmVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvaWRsZXZlci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvaWRsZXZlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0YzRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxldmVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMzlmODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weQpAQCAtMCwwICsxLDI2OCBAQAorIiIiCitEaWFsb2cgZm9yIGJ1aWxkaW5nIFRraW50ZXIgYWNjZWxlcmF0b3Iga2V5IGJpbmRpbmdzCisiIiIKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgoraW1wb3J0IHRrTWVzc2FnZUJveAoraW1wb3J0IHN0cmluZworCitjbGFzcyBHZXRLZXlzRGlhbG9nKFRvcGxldmVsKToKKyAgICBkZWYgX19pbml0X18oc2VsZixwYXJlbnQsdGl0bGUsYWN0aW9uLGN1cnJlbnRLZXlTZXF1ZW5jZXMpOgorICAgICAgICAiIiIKKyAgICAgICAgYWN0aW9uIC0gc3RyaW5nLCB0aGUgbmFtZSBvZiB0aGUgdmlydHVhbCBldmVudCB0aGVzZSBrZXlzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgbWFwcGVkIHRvCisgICAgICAgIGN1cnJlbnRLZXlzIC0gbGlzdCwgYSBsaXN0IG9mIGFsbCBrZXkgc2VxdWVuY2UgbGlzdHMgY3VycmVudGx5IG1hcHBlZAorICAgICAgICAgICAgICAgICB0byB2aXJ0dWFsIGV2ZW50cywgZm9yIG92ZXJsYXAgY2hlY2tpbmcKKyAgICAgICAgIiIiCisgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKKyAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKKyAgICAgICAgc2VsZi5yZXNpemFibGUoaGVpZ2h0PUZBTFNFLHdpZHRoPUZBTFNFKQorICAgICAgICBzZWxmLnRpdGxlKHRpdGxlKQorICAgICAgICBzZWxmLnRyYW5zaWVudChwYXJlbnQpCisgICAgICAgIHNlbGYuZ3JhYl9zZXQoKQorICAgICAgICBzZWxmLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5DYW5jZWwpCisgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CisgICAgICAgIHNlbGYuYWN0aW9uPWFjdGlvbgorICAgICAgICBzZWxmLmN1cnJlbnRLZXlTZXF1ZW5jZXM9Y3VycmVudEtleVNlcXVlbmNlcworICAgICAgICBzZWxmLnJlc3VsdD0nJworICAgICAgICBzZWxmLmtleVN0cmluZz1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5rZXlTdHJpbmcuc2V0KCcnKQorICAgICAgICBzZWxmLlNldE1vZGlmaWVyc0ZvclBsYXRmb3JtKCkgIyBzZXQgc2VsZi5tb2RpZmllcnMsIHNlbGYubW9kaWZpZXJfbGFiZWwKKyAgICAgICAgc2VsZi5tb2RpZmllcl92YXJzID0gW10KKyAgICAgICAgZm9yIG1vZGlmaWVyIGluIHNlbGYubW9kaWZpZXJzOgorICAgICAgICAgICAgdmFyaWFibGUgPSBTdHJpbmdWYXIoc2VsZikKKyAgICAgICAgICAgIHZhcmlhYmxlLnNldCgnJykKKyAgICAgICAgICAgIHNlbGYubW9kaWZpZXJfdmFycy5hcHBlbmQodmFyaWFibGUpCisgICAgICAgIHNlbGYuYWR2YW5jZWQgPSBGYWxzZQorICAgICAgICBzZWxmLkNyZWF0ZVdpZGdldHMoKQorICAgICAgICBzZWxmLkxvYWRGaW5hbEtleUxpc3QoKQorICAgICAgICBzZWxmLndpdGhkcmF3KCkgI2hpZGUgd2hpbGUgc2V0dGluZyBnZW9tZXRyeQorICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICBzZWxmLmdlb21ldHJ5KCIrJWQrJWQiICUKKyAgICAgICAgICAgICgocGFyZW50LndpbmZvX3Jvb3R4KCkrKChwYXJlbnQud2luZm9fd2lkdGgoKS8yKQorICAgICAgICAgICAgICAgIC0oc2VsZi53aW5mb19yZXF3aWR0aCgpLzIpKSwKKyAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R5KCkrKChwYXJlbnQud2luZm9faGVpZ2h0KCkvMikKKyAgICAgICAgICAgICAgICAtKHNlbGYud2luZm9fcmVxaGVpZ2h0KCkvMikpICkpICkgI2NlbnRyZSBkaWFsb2cgb3ZlciBwYXJlbnQKKyAgICAgICAgc2VsZi5kZWljb25pZnkoKSAjZ2VvbWV0cnkgc2V0LCB1bmhpZGUKKyAgICAgICAgc2VsZi53YWl0X3dpbmRvdygpCisKKyAgICBkZWYgQ3JlYXRlV2lkZ2V0cyhzZWxmKToKKyAgICAgICAgZnJhbWVNYWluID0gRnJhbWUoc2VsZixib3JkZXJ3aWR0aD0yLHJlbGllZj1TVU5LRU4pCisgICAgICAgIGZyYW1lTWFpbi5wYWNrKHNpZGU9VE9QLGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKKyAgICAgICAgZnJhbWVCdXR0b25zPUZyYW1lKHNlbGYpCisgICAgICAgIGZyYW1lQnV0dG9ucy5wYWNrKHNpZGU9Qk9UVE9NLGZpbGw9WCkKKyAgICAgICAgc2VsZi5idXR0b25PSyA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsdGV4dD0nT0snLAorICAgICAgICAgICAgICAgIHdpZHRoPTgsY29tbWFuZD1zZWxmLk9LKQorICAgICAgICBzZWxmLmJ1dHRvbk9LLmdyaWQocm93PTAsY29sdW1uPTAscGFkeD01LHBhZHk9NSkKKyAgICAgICAgc2VsZi5idXR0b25DYW5jZWwgPSBCdXR0b24oZnJhbWVCdXR0b25zLHRleHQ9J0NhbmNlbCcsCisgICAgICAgICAgICAgICAgd2lkdGg9OCxjb21tYW5kPXNlbGYuQ2FuY2VsKQorICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbC5ncmlkKHJvdz0wLGNvbHVtbj0xLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIHNlbGYuZnJhbWVLZXlTZXFCYXNpYyA9IEZyYW1lKGZyYW1lTWFpbikKKyAgICAgICAgc2VsZi5mcmFtZUtleVNlcUFkdmFuY2VkID0gRnJhbWUoZnJhbWVNYWluKQorICAgICAgICBzZWxmLmZyYW1lQ29udHJvbHNCYXNpYyA9IEZyYW1lKGZyYW1lTWFpbikKKyAgICAgICAgc2VsZi5mcmFtZUhlbHBBZHZhbmNlZCA9IEZyYW1lKGZyYW1lTWFpbikKKyAgICAgICAgc2VsZi5mcmFtZUtleVNlcUFkdmFuY2VkLmdyaWQocm93PTAsY29sdW1uPTAsc3RpY2t5PU5TRVcscGFkeD01LHBhZHk9NSkKKyAgICAgICAgc2VsZi5mcmFtZUtleVNlcUJhc2ljLmdyaWQocm93PTAsY29sdW1uPTAsc3RpY2t5PU5TRVcscGFkeD01LHBhZHk9NSkKKyAgICAgICAgc2VsZi5mcmFtZUtleVNlcUJhc2ljLmxpZnQoKQorICAgICAgICBzZWxmLmZyYW1lSGVscEFkdmFuY2VkLmdyaWQocm93PTEsY29sdW1uPTAsc3RpY2t5PU5TRVcscGFkeD01KQorICAgICAgICBzZWxmLmZyYW1lQ29udHJvbHNCYXNpYy5ncmlkKHJvdz0xLGNvbHVtbj0wLHN0aWNreT1OU0VXLHBhZHg9NSkKKyAgICAgICAgc2VsZi5mcmFtZUNvbnRyb2xzQmFzaWMubGlmdCgpCisgICAgICAgIHNlbGYuYnV0dG9uTGV2ZWwgPSBCdXR0b24oZnJhbWVNYWluLGNvbW1hbmQ9c2VsZi5Ub2dnbGVMZXZlbCwKKyAgICAgICAgICAgICAgICB0ZXh0PSdBZHZhbmNlZCBLZXkgQmluZGluZyBFbnRyeSA+PicpCisgICAgICAgIHNlbGYuYnV0dG9uTGV2ZWwuZ3JpZChyb3c9Mixjb2x1bW49MCxzdGljaz1FVyxwYWR4PTUscGFkeT01KQorICAgICAgICBsYWJlbFRpdGxlQmFzaWMgPSBMYWJlbChzZWxmLmZyYW1lS2V5U2VxQmFzaWMsCisgICAgICAgICAgICAgICAgdGV4dD0iTmV3IGtleXMgZm9yICAnIitzZWxmLmFjdGlvbisiJyA6IikKKyAgICAgICAgbGFiZWxUaXRsZUJhc2ljLnBhY2soYW5jaG9yPVcpCisgICAgICAgIGxhYmVsS2V5c0Jhc2ljID0gTGFiZWwoc2VsZi5mcmFtZUtleVNlcUJhc2ljLGp1c3RpZnk9TEVGVCwKKyAgICAgICAgICAgICAgICB0ZXh0dmFyaWFibGU9c2VsZi5rZXlTdHJpbmcscmVsaWVmPUdST09WRSxib3JkZXJ3aWR0aD0yKQorICAgICAgICBsYWJlbEtleXNCYXNpYy5wYWNrKGlwYWR4PTUsaXBhZHk9NSxmaWxsPVgpCisgICAgICAgIHNlbGYubW9kaWZpZXJfY2hlY2tidXR0b25zID0ge30KKyAgICAgICAgY29sdW1uID0gMAorICAgICAgICBmb3IgbW9kaWZpZXIsIHZhcmlhYmxlIGluIHppcChzZWxmLm1vZGlmaWVycywgc2VsZi5tb2RpZmllcl92YXJzKToKKyAgICAgICAgICAgIGxhYmVsID0gc2VsZi5tb2RpZmllcl9sYWJlbC5nZXQobW9kaWZpZXIsIG1vZGlmaWVyKQorICAgICAgICAgICAgY2hlY2s9Q2hlY2tidXR0b24oc2VsZi5mcmFtZUNvbnRyb2xzQmFzaWMsCisgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLkJ1aWxkS2V5U3RyaW5nLAorICAgICAgICAgICAgICAgIHRleHQ9bGFiZWwsdmFyaWFibGU9dmFyaWFibGUsb252YWx1ZT1tb2RpZmllcixvZmZ2YWx1ZT0nJykKKyAgICAgICAgICAgIGNoZWNrLmdyaWQocm93PTAsY29sdW1uPWNvbHVtbixwYWR4PTIsc3RpY2t5PVcpCisgICAgICAgICAgICBzZWxmLm1vZGlmaWVyX2NoZWNrYnV0dG9uc1ttb2RpZmllcl0gPSBjaGVjaworICAgICAgICAgICAgY29sdW1uICs9IDEKKyAgICAgICAgbGFiZWxGbkFkdmljZT1MYWJlbChzZWxmLmZyYW1lQ29udHJvbHNCYXNpYyxqdXN0aWZ5PUxFRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD1cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlbGVjdCB0aGUgZGVzaXJlZCBtb2RpZmllciBrZXlzXG4iKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYm92ZSwgYW5kIHRoZSBmaW5hbCBrZXkgZnJvbSB0aGVcbiIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3Qgb24gdGhlIHJpZ2h0LlxuXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlIHVwcGVyIGNhc2UgU3ltYm9scyB3aGVuIHVzaW5nXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIFNoaWZ0IG1vZGlmaWVyLiAgKExldHRlcnMgd2lsbCBiZVxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnZlcnRlZCBhdXRvbWF0aWNhbGx5LikiKQorICAgICAgICBsYWJlbEZuQWR2aWNlLmdyaWQocm93PTEsY29sdW1uPTAsY29sdW1uc3Bhbj00LHBhZHg9MixzdGlja3k9VykKKyAgICAgICAgc2VsZi5saXN0S2V5c0ZpbmFsPUxpc3Rib3goc2VsZi5mcmFtZUNvbnRyb2xzQmFzaWMsd2lkdGg9MTUsaGVpZ2h0PTEwLAorICAgICAgICAgICAgICAgIHNlbGVjdG1vZGU9U0lOR0xFKQorICAgICAgICBzZWxmLmxpc3RLZXlzRmluYWwuYmluZCgnPEJ1dHRvblJlbGVhc2UtMT4nLHNlbGYuRmluYWxLZXlTZWxlY3RlZCkKKyAgICAgICAgc2VsZi5saXN0S2V5c0ZpbmFsLmdyaWQocm93PTAsY29sdW1uPTQscm93c3Bhbj00LHN0aWNreT1OUykKKyAgICAgICAgc2Nyb2xsS2V5c0ZpbmFsPVNjcm9sbGJhcihzZWxmLmZyYW1lQ29udHJvbHNCYXNpYyxvcmllbnQ9VkVSVElDQUwsCisgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLmxpc3RLZXlzRmluYWwueXZpZXcpCisgICAgICAgIHNlbGYubGlzdEtleXNGaW5hbC5jb25maWcoeXNjcm9sbGNvbW1hbmQ9c2Nyb2xsS2V5c0ZpbmFsLnNldCkKKyAgICAgICAgc2Nyb2xsS2V5c0ZpbmFsLmdyaWQocm93PTAsY29sdW1uPTUscm93c3Bhbj00LHN0aWNreT1OUykKKyAgICAgICAgc2VsZi5idXR0b25DbGVhcj1CdXR0b24oc2VsZi5mcmFtZUNvbnRyb2xzQmFzaWMsCisgICAgICAgICAgICAgICAgdGV4dD0nQ2xlYXIgS2V5cycsY29tbWFuZD1zZWxmLkNsZWFyS2V5U2VxKQorICAgICAgICBzZWxmLmJ1dHRvbkNsZWFyLmdyaWQocm93PTIsY29sdW1uPTAsY29sdW1uc3Bhbj00KQorICAgICAgICBsYWJlbFRpdGxlQWR2YW5jZWQgPSBMYWJlbChzZWxmLmZyYW1lS2V5U2VxQWR2YW5jZWQsanVzdGlmeT1MRUZULAorICAgICAgICAgICAgICAgIHRleHQ9IkVudGVyIG5ldyBiaW5kaW5nKHMpIGZvciAgJyIrc2VsZi5hY3Rpb24rIicgOlxuIisKKyAgICAgICAgICAgICAgICAiKFRoZXNlIGJpbmRpbmdzIHdpbGwgbm90IGJlIGNoZWNrZWQgZm9yIHZhbGlkaXR5ISkiKQorICAgICAgICBsYWJlbFRpdGxlQWR2YW5jZWQucGFjayhhbmNob3I9VykKKyAgICAgICAgc2VsZi5lbnRyeUtleXNBZHZhbmNlZD1FbnRyeShzZWxmLmZyYW1lS2V5U2VxQWR2YW5jZWQsCisgICAgICAgICAgICAgICAgdGV4dHZhcmlhYmxlPXNlbGYua2V5U3RyaW5nKQorICAgICAgICBzZWxmLmVudHJ5S2V5c0FkdmFuY2VkLnBhY2soZmlsbD1YKQorICAgICAgICBsYWJlbEhlbHBBZHZhbmNlZD1MYWJlbChzZWxmLmZyYW1lSGVscEFkdmFuY2VkLGp1c3RpZnk9TEVGVCwKKyAgICAgICAgICAgIHRleHQ9IktleSBiaW5kaW5ncyBhcmUgc3BlY2lmaWVkIHVzaW5nIFRraW50ZXIga2V5c3ltcyBhc1xuIisKKyAgICAgICAgICAgICAgICAgImluIHRoZXNlIHNhbXBsZXM6IDxDb250cm9sLWY+LCA8U2hpZnQtRjI+LCA8RjEyPixcbiIKKyAgICAgICAgICAgICAgICAgIjxDb250cm9sLXNwYWNlPiwgPE1ldGEtbGVzcz4sIDxDb250cm9sLUFsdC1TaGlmdC1YPi5cbiIKKyAgICAgICAgICAgICAgICAgIlVwcGVyIGNhc2UgaXMgdXNlZCB3aGVuIHRoZSBTaGlmdCBtb2RpZmllciBpcyBwcmVzZW50IVxuXG4iICsKKyAgICAgICAgICAgICAgICAgIidFbWFjcyBzdHlsZScgbXVsdGkta2V5c3Ryb2tlIGJpbmRpbmdzIGFyZSBzcGVjaWZpZWQgYXNcbiIgKworICAgICAgICAgICAgICAgICAiZm9sbG93czogPENvbnRyb2wteD48Q29udHJvbC15Piwgd2hlcmUgdGhlIGZpcnN0IGtleVxuIiArCisgICAgICAgICAgICAgICAgICJpcyB0aGUgJ2RvLW5vdGhpbmcnIGtleWJpbmRpbmcuXG5cbiIgKworICAgICAgICAgICAgICAgICAiTXVsdGlwbGUgc2VwYXJhdGUgYmluZGluZ3MgZm9yIG9uZSBhY3Rpb24gc2hvdWxkIGJlXG4iKworICAgICAgICAgICAgICAgICAic2VwYXJhdGVkIGJ5IGEgc3BhY2UsIGVnLiwgPEFsdC12PiA8TWV0YS12Pi4iICkKKyAgICAgICAgbGFiZWxIZWxwQWR2YW5jZWQuZ3JpZChyb3c9MCxjb2x1bW49MCxzdGlja3k9TlNFVykKKworICAgIGRlZiBTZXRNb2RpZmllcnNGb3JQbGF0Zm9ybShzZWxmKToKKyAgICAgICAgIiIiRGV0ZXJtaW5lIGxpc3Qgb2YgbmFtZXMgb2Yga2V5IG1vZGlmaWVycyBmb3IgdGhpcyBwbGF0Zm9ybS4KKworICAgICAgICBUaGUgbmFtZXMgYXJlIHVzZWQgdG8gYnVpbGQgVGsgYmluZGluZ3MgLS0gaXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlCisgICAgICAgIGtleWJvYXJkIGhhcyB0aGVzZSBrZXlzLCBpdCBtYXR0ZXJzIGlmIFRrIHVuZGVyc3RhbmRzIHRoZW0uIFRoZQorICAgICAgICBvcmRlciBpcyBhbHNvIGltcG9ydGFudDoga2V5IGJpbmRpbmcgZXF1YWxpdHkgZGVwZW5kcyBvbiBpdCwgc28KKyAgICAgICAgY29uZmlnLWtleXMuZGVmIG11c3QgdXNlIHRoZSBzYW1lIG9yZGVyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0CisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgICAgICBzZWxmLm1vZGlmaWVycyA9IFsnU2hpZnQnLCAnQ29udHJvbCcsICdPcHRpb24nLCAnQ29tbWFuZCddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1vZGlmaWVycyA9IFsnQ29udHJvbCcsICdBbHQnLCAnU2hpZnQnXQorICAgICAgICBzZWxmLm1vZGlmaWVyX2xhYmVsID0geydDb250cm9sJzogJ0N0cmwnfSAjIHNob3J0IG5hbWUKKworICAgIGRlZiBUb2dnbGVMZXZlbChzZWxmKToKKyAgICAgICAgaWYgIHNlbGYuYnV0dG9uTGV2ZWwuY2dldCgndGV4dCcpWzo4XT09J0FkdmFuY2VkJzoKKyAgICAgICAgICAgIHNlbGYuQ2xlYXJLZXlTZXEoKQorICAgICAgICAgICAgc2VsZi5idXR0b25MZXZlbC5jb25maWcodGV4dD0nPDwgQmFzaWMgS2V5IEJpbmRpbmcgRW50cnknKQorICAgICAgICAgICAgc2VsZi5mcmFtZUtleVNlcUFkdmFuY2VkLmxpZnQoKQorICAgICAgICAgICAgc2VsZi5mcmFtZUhlbHBBZHZhbmNlZC5saWZ0KCkKKyAgICAgICAgICAgIHNlbGYuZW50cnlLZXlzQWR2YW5jZWQuZm9jdXNfc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYWR2YW5jZWQgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLkNsZWFyS2V5U2VxKCkKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uTGV2ZWwuY29uZmlnKHRleHQ9J0FkdmFuY2VkIEtleSBCaW5kaW5nIEVudHJ5ID4+JykKKyAgICAgICAgICAgIHNlbGYuZnJhbWVLZXlTZXFCYXNpYy5saWZ0KCkKKyAgICAgICAgICAgIHNlbGYuZnJhbWVDb250cm9sc0Jhc2ljLmxpZnQoKQorICAgICAgICAgICAgc2VsZi5hZHZhbmNlZCA9IEZhbHNlCisKKyAgICBkZWYgRmluYWxLZXlTZWxlY3RlZChzZWxmLGV2ZW50KToKKyAgICAgICAgc2VsZi5CdWlsZEtleVN0cmluZygpCisKKyAgICBkZWYgQnVpbGRLZXlTdHJpbmcoc2VsZik6CisgICAgICAgIGtleUxpc3QgPSBtb2RpZmllcnMgPSBzZWxmLkdldE1vZGlmaWVycygpCisgICAgICAgIGZpbmFsS2V5ID0gc2VsZi5saXN0S2V5c0ZpbmFsLmdldChBTkNIT1IpCisgICAgICAgIGlmIGZpbmFsS2V5OgorICAgICAgICAgICAgZmluYWxLZXkgPSBzZWxmLlRyYW5zbGF0ZUtleShmaW5hbEtleSwgbW9kaWZpZXJzKQorICAgICAgICAgICAga2V5TGlzdC5hcHBlbmQoZmluYWxLZXkpCisgICAgICAgIHNlbGYua2V5U3RyaW5nLnNldCgnPCcgKyBzdHJpbmcuam9pbihrZXlMaXN0LCctJykgKyAnPicpCisKKyAgICBkZWYgR2V0TW9kaWZpZXJzKHNlbGYpOgorICAgICAgICBtb2RMaXN0ID0gW3ZhcmlhYmxlLmdldCgpIGZvciB2YXJpYWJsZSBpbiBzZWxmLm1vZGlmaWVyX3ZhcnNdCisgICAgICAgIHJldHVybiBbbW9kIGZvciBtb2QgaW4gbW9kTGlzdCBpZiBtb2RdCisKKyAgICBkZWYgQ2xlYXJLZXlTZXEoc2VsZik6CisgICAgICAgIHNlbGYubGlzdEtleXNGaW5hbC5zZWxlY3RfY2xlYXIoMCxFTkQpCisgICAgICAgIHNlbGYubGlzdEtleXNGaW5hbC55dmlldyhNT1ZFVE8sICcwLjAnKQorICAgICAgICBmb3IgdmFyaWFibGUgaW4gc2VsZi5tb2RpZmllcl92YXJzOgorICAgICAgICAgICAgdmFyaWFibGUuc2V0KCcnKQorICAgICAgICBzZWxmLmtleVN0cmluZy5zZXQoJycpCisKKyAgICBkZWYgTG9hZEZpbmFsS2V5TGlzdChzZWxmKToKKyAgICAgICAgI3RoZXNlIHR1cGxlcyBhcmUgYWxzbyBhdmFpbGFibGUgZm9yIHVzZSBpbiB2YWxpZGl0eSBjaGVja3MKKyAgICAgICAgc2VsZi5mdW5jdGlvbktleXM9KCdGMScsJ0YyJywnRjInLCdGNCcsJ0Y1JywnRjYnLCdGNycsJ0Y4JywnRjknLAorICAgICAgICAgICAgICAgICdGMTAnLCdGMTEnLCdGMTInKQorICAgICAgICBzZWxmLmFscGhhbnVtS2V5cz10dXBsZShzdHJpbmcuYXNjaWlfbG93ZXJjYXNlK3N0cmluZy5kaWdpdHMpCisgICAgICAgIHNlbGYucHVuY3R1YXRpb25LZXlzPXR1cGxlKCd+IUAjJV4mKigpXy0rPXt9W118OzosLjw+Lz8nKQorICAgICAgICBzZWxmLndoaXRlc3BhY2VLZXlzPSgnVGFiJywnU3BhY2UnLCdSZXR1cm4nKQorICAgICAgICBzZWxmLmVkaXRLZXlzPSgnQmFja1NwYWNlJywnRGVsZXRlJywnSW5zZXJ0JykKKyAgICAgICAgc2VsZi5tb3ZlS2V5cz0oJ0hvbWUnLCdFbmQnLCdQYWdlIFVwJywnUGFnZSBEb3duJywnTGVmdCBBcnJvdycsCisgICAgICAgICAgICAgICAgJ1JpZ2h0IEFycm93JywnVXAgQXJyb3cnLCdEb3duIEFycm93JykKKyAgICAgICAgI21ha2UgYSB0dXBsZSBvZiBtb3N0IG9mIHRoZSB1c2VmdWwgY29tbW9uICdmaW5hbCcga2V5cworICAgICAgICBrZXlzPShzZWxmLmFscGhhbnVtS2V5cytzZWxmLnB1bmN0dWF0aW9uS2V5cytzZWxmLmZ1bmN0aW9uS2V5cysKKyAgICAgICAgICAgICAgICBzZWxmLndoaXRlc3BhY2VLZXlzK3NlbGYuZWRpdEtleXMrc2VsZi5tb3ZlS2V5cykKKyAgICAgICAgc2VsZi5saXN0S2V5c0ZpbmFsLmluc2VydChFTkQsICprZXlzKQorCisgICAgZGVmIFRyYW5zbGF0ZUtleShzZWxmLCBrZXksIG1vZGlmaWVycyk6CisgICAgICAgICJUcmFuc2xhdGUgZnJvbSBrZXljYXAgc3ltYm9sIHRvIHRoZSBUa2ludGVyIGtleXN5bSIKKyAgICAgICAgdHJhbnNsYXRlRGljdCA9IHsnU3BhY2UnOidzcGFjZScsCisgICAgICAgICAgICAgICAgJ34nOidhc2NpaXRpbGRlJywnISc6J2V4Y2xhbScsJ0AnOidhdCcsJyMnOidudW1iZXJzaWduJywKKyAgICAgICAgICAgICAgICAnJSc6J3BlcmNlbnQnLCdeJzonYXNjaWljaXJjdW0nLCcmJzonYW1wZXJzYW5kJywnKic6J2FzdGVyaXNrJywKKyAgICAgICAgICAgICAgICAnKCc6J3BhcmVubGVmdCcsJyknOidwYXJlbnJpZ2h0JywnXyc6J3VuZGVyc2NvcmUnLCctJzonbWludXMnLAorICAgICAgICAgICAgICAgICcrJzoncGx1cycsJz0nOidlcXVhbCcsJ3snOidicmFjZWxlZnQnLCd9JzonYnJhY2VyaWdodCcsCisgICAgICAgICAgICAgICAgJ1snOidicmFja2V0bGVmdCcsJ10nOidicmFja2V0cmlnaHQnLCd8JzonYmFyJywnOyc6J3NlbWljb2xvbicsCisgICAgICAgICAgICAgICAgJzonOidjb2xvbicsJywnOidjb21tYScsJy4nOidwZXJpb2QnLCc8JzonbGVzcycsJz4nOidncmVhdGVyJywKKyAgICAgICAgICAgICAgICAnLyc6J3NsYXNoJywnPyc6J3F1ZXN0aW9uJywnUGFnZSBVcCc6J1ByaW9yJywnUGFnZSBEb3duJzonTmV4dCcsCisgICAgICAgICAgICAgICAgJ0xlZnQgQXJyb3cnOidMZWZ0JywnUmlnaHQgQXJyb3cnOidSaWdodCcsJ1VwIEFycm93JzonVXAnLAorICAgICAgICAgICAgICAgICdEb3duIEFycm93JzogJ0Rvd24nLCAnVGFiJzonVGFiJ30KKyAgICAgICAgaWYga2V5IGluIHRyYW5zbGF0ZURpY3Qua2V5cygpOgorICAgICAgICAgICAga2V5ID0gdHJhbnNsYXRlRGljdFtrZXldCisgICAgICAgIGlmICdTaGlmdCcgaW4gbW9kaWZpZXJzIGFuZCBrZXkgaW4gc3RyaW5nLmFzY2lpX2xvd2VyY2FzZToKKyAgICAgICAgICAgIGtleSA9IGtleS51cHBlcigpCisgICAgICAgIGtleSA9ICdLZXktJyArIGtleQorICAgICAgICByZXR1cm4ga2V5CisKKyAgICBkZWYgT0soc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuYWR2YW5jZWQgb3Igc2VsZi5LZXlzT0soKTogICMgZG9lc24ndCBjaGVjayBhZHZhbmNlZCBzdHJpbmcgeWV0CisgICAgICAgICAgICBzZWxmLnJlc3VsdD1zZWxmLmtleVN0cmluZy5nZXQoKQorICAgICAgICAgICAgc2VsZi5kZXN0cm95KCkKKworICAgIGRlZiBDYW5jZWwoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHNlbGYucmVzdWx0PScnCisgICAgICAgIHNlbGYuZGVzdHJveSgpCisKKyAgICBkZWYgS2V5c09LKHNlbGYpOgorICAgICAgICAnJydWYWxpZGl0eSBjaGVjayBvbiB1c2VyJ3MgJ2Jhc2ljJyBrZXliaW5kaW5nIHNlbGVjdGlvbi4KKworICAgICAgICBEb2Vzbid0IGNoZWNrIHRoZSBzdHJpbmcgcHJvZHVjZWQgYnkgdGhlIGFkdmFuY2VkIGRpYWxvZyBiZWNhdXNlCisgICAgICAgICdtb2RpZmllcnMnIGlzbid0IHNldC4KKworICAgICAgICAnJycKKyAgICAgICAga2V5cyA9IHNlbGYua2V5U3RyaW5nLmdldCgpCisgICAgICAgIGtleXMuc3RyaXAoKQorICAgICAgICBmaW5hbEtleSA9IHNlbGYubGlzdEtleXNGaW5hbC5nZXQoQU5DSE9SKQorICAgICAgICBtb2RpZmllcnMgPSBzZWxmLkdldE1vZGlmaWVycygpCisgICAgICAgICMgY3JlYXRlIGEga2V5IHNlcXVlbmNlIGxpc3QgZm9yIG92ZXJsYXAgY2hlY2s6CisgICAgICAgIGtleVNlcXVlbmNlID0ga2V5cy5zcGxpdCgpCisgICAgICAgIGtleXNPSyA9IEZhbHNlCisgICAgICAgIHRpdGxlID0gJ0tleSBTZXF1ZW5jZSBFcnJvcicKKyAgICAgICAgaWYgbm90IGtleXM6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPXRpdGxlLCBwYXJlbnQ9c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8ga2V5cyBzcGVjaWZpZWQuJykKKyAgICAgICAgZWxpZiBub3Qga2V5cy5lbmRzd2l0aCgnPicpOgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT10aXRsZSwgcGFyZW50PXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J01pc3NpbmcgdGhlIGZpbmFsIEtleScpCisgICAgICAgIGVsaWYgKG5vdCBtb2RpZmllcnMKKyAgICAgICAgICAgICAgYW5kIGZpbmFsS2V5IG5vdCBpbiBzZWxmLmZ1bmN0aW9uS2V5cyArIHNlbGYubW92ZUtleXMpOgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT10aXRsZSwgcGFyZW50PXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05vIG1vZGlmaWVyIGtleShzKSBzcGVjaWZpZWQuJykKKyAgICAgICAgZWxpZiAobW9kaWZpZXJzID09IFsnU2hpZnQnXSkgXAorICAgICAgICAgICAgICAgICBhbmQgKGZpbmFsS2V5IG5vdCBpbgorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZnVuY3Rpb25LZXlzICsgc2VsZi5tb3ZlS2V5cyArICgnVGFiJywgJ1NwYWNlJykpOgorICAgICAgICAgICAgbXNnID0gJ1RoZSBzaGlmdCBtb2RpZmllciBieSBpdHNlbGYgbWF5IG5vdCBiZSB1c2VkIHdpdGgnXAorICAgICAgICAgICAgICAgICAgJyB0aGlzIGtleSBzeW1ib2wuJworICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT10aXRsZSwgcGFyZW50PXNlbGYsIG1lc3NhZ2U9bXNnKQorICAgICAgICBlbGlmIGtleVNlcXVlbmNlIGluIHNlbGYuY3VycmVudEtleVNlcXVlbmNlczoKKyAgICAgICAgICAgIG1zZyA9ICdUaGlzIGtleSBjb21iaW5hdGlvbiBpcyBhbHJlYWR5IGluIHVzZS4nCisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPXRpdGxlLCBwYXJlbnQ9c2VsZiwgbWVzc2FnZT1tc2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBrZXlzT0sgPSBUcnVlCisgICAgICAgIHJldHVybiBrZXlzT0sKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAjdGVzdCB0aGUgZGlhbG9nCisgICAgcm9vdD1UaygpCisgICAgZGVmIHJ1bigpOgorICAgICAgICBrZXlTZXE9JycKKyAgICAgICAgZGxnPUdldEtleXNEaWFsb2cocm9vdCwnR2V0IEtleXMnLCdmaW5kLWFnYWluJyxbXSkKKyAgICAgICAgcHJpbnQgZGxnLnJlc3VsdAorICAgIEJ1dHRvbihyb290LHRleHQ9J0RpYWxvZycsY29tbWFuZD1ydW4pLnBhY2soKQorICAgIHJvb3QubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjBlODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjBlODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL21hY29zeFN1cHBvcnQucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjY2NTJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL21hY29zeFN1cHBvcnQucHkKQEAgLTAsMCArMSwxNzUgQEAKKyIiIgorQSBudW1iZXIgb2YgZnVuY3Rpb24gdGhhdCBlbmhhbmNlIElETEUgb24gTWFjT1NYIHdoZW4gaXQgdXNlZCBhcyBhIG5vcm1hbAorR1VJIGFwcGxpY2F0aW9uIChhcyBvcHBvc2VkIHRvIGFuIFgxMSBhcHBsaWNhdGlvbikuCisiIiIKK2ltcG9ydCBzeXMKK2ltcG9ydCBUa2ludGVyCitmcm9tIG9zIGltcG9ydCBwYXRoCisKKworX2FwcGJ1bmRsZSA9IE5vbmUKKworZGVmIHJ1bm5pbmdBc09TWEFwcCgpOgorICAgICIiIgorICAgIFJldHVybnMgVHJ1ZSBpZiBQeXRob24gaXMgcnVubmluZyBmcm9tIHdpdGhpbiBhbiBhcHAgb24gT1NYLgorICAgIElmIHNvLCBhc3N1bWUgdGhhdCBQeXRob24gd2FzIGJ1aWx0IHdpdGggQXF1YSBUY2wvVGsgcmF0aGVyIHRoYW4KKyAgICBYMTEgVGNsL1RrLgorICAgICIiIgorICAgIGdsb2JhbCBfYXBwYnVuZGxlCisgICAgaWYgX2FwcGJ1bmRsZSBpcyBOb25lOgorICAgICAgICBfYXBwYnVuZGxlID0gKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgJy5hcHAnIGluIHN5cy5leGVjdXRhYmxlKQorICAgIHJldHVybiBfYXBwYnVuZGxlCisKK19jYXJib25hcXVhdGsgPSBOb25lCisKK2RlZiBpc0NhcmJvbkFxdWFUayhyb290KToKKyAgICAiIiIKKyAgICBSZXR1cm5zIFRydWUgaWYgSURMRSBpcyB1c2luZyBhIENhcmJvbiBBcXVhIFRrIChpbnN0ZWFkIG9mIHRoZQorICAgIG5ld2VyIENvY29hIEFxdWEgVGspLgorICAgICIiIgorICAgIGdsb2JhbCBfY2FyYm9uYXF1YXRrCisgICAgaWYgX2NhcmJvbmFxdWF0ayBpcyBOb25lOgorICAgICAgICBfY2FyYm9uYXF1YXRrID0gKHJ1bm5pbmdBc09TWEFwcCgpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICdhcXVhJyBpbiByb290LnRrLmNhbGwoJ3RrJywgJ3dpbmRvd2luZ3N5c3RlbScpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICdBcHBLaXQnIG5vdCBpbiByb290LnRrLmNhbGwoJ3dpbmZvJywgJ3NlcnZlcicsICcuJykpCisgICAgcmV0dXJuIF9jYXJib25hcXVhdGsKKworZGVmIHRrVmVyc2lvbldhcm5pbmcocm9vdCk6CisgICAgIiIiCisgICAgUmV0dXJucyBhIHN0cmluZyB3YXJuaW5nIG1lc3NhZ2UgaWYgdGhlIFRrIHZlcnNpb24gaW4gdXNlIGFwcGVhcnMgdG8KKyAgICBiZSBvbmUga25vd24gdG8gY2F1c2UgcHJvYmxlbXMgd2l0aCBJRExFLgorICAgIDEuIEFwcGxlIENvY29hLWJhc2VkIFRrIDguNS43IHNoaXBwZWQgd2l0aCBNYWMgT1MgWCAxMC42IGlzIHVudXNhYmxlLgorICAgIDIuIEFwcGxlIENvY29hLWJhc2VkIFRrIDguNS45IGluIE9TIFggMTAuNyBhbmQgMTAuOCBpcyBiZXR0ZXIgYnV0CisgICAgICAgIGNhbiBzdGlsbCBjcmFzaCB1bmV4cGVjdGVkbHkuCisgICAgIiIiCisKKyAgICBpZiAocnVubmluZ0FzT1NYQXBwKCkgYW5kCisgICAgICAgICAgICAoJ0FwcEtpdCcgaW4gcm9vdC50ay5jYWxsKCd3aW5mbycsICdzZXJ2ZXInLCAnLicpKSApOgorICAgICAgICBwYXRjaGxldmVsID0gcm9vdC50ay5jYWxsKCdpbmZvJywgJ3BhdGNobGV2ZWwnKQorICAgICAgICBpZiBwYXRjaGxldmVsIG5vdCBpbiAoJzguNS43JywgJzguNS45Jyk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIChyIldBUk5JTkc6IFRoZSB2ZXJzaW9uIG9mIFRjbC9UayAoezB9KSBpbiB1c2UgbWF5IgorICAgICAgICAgICAgICAgIHIiIGJlIHVuc3RhYmxlLlxuIgorICAgICAgICAgICAgICAgIHIiVmlzaXQgaHR0cDovL3d3dy5weXRob24ub3JnL2Rvd25sb2FkL21hYy90Y2x0ay8iCisgICAgICAgICAgICAgICAgciIgZm9yIGN1cnJlbnQgaW5mb3JtYXRpb24uIi5mb3JtYXQocGF0Y2hsZXZlbCkpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBhZGRPcGVuRXZlbnRTdXBwb3J0KHJvb3QsIGZsaXN0KToKKyAgICAiIiIKKyAgICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gd2lsbCByZXNwb25kIHRvIG9wZW4gQXBwbGVFdmVudHMsIHdoaWNoCisgICAgbWFrZXMgaXMgZmVhc2libGUgdG8gdXNlIElETEUgYXMgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gZm9yIHB5dGhvbiBmaWxlcy4KKyAgICAiIiIKKyAgICBkZWYgZG9PcGVuRmlsZSgqYXJncyk6CisgICAgICAgIGZvciBmbiBpbiBhcmdzOgorICAgICAgICAgICAgZmxpc3Qub3BlbihmbikKKworICAgICMgVGhlIGNvbW1hbmQgYmVsb3cgaXMgYSBob29rIGluIGFxdWF0ayB0aGF0IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgYXBwCisgICAgIyByZWNlaXZlcyBhIGZpbGUgb3BlbiBldmVudC4gVGhlIGNhbGxiYWNrIGNhbiBoYXZlIG11bHRpcGxlIGFyZ3VtZW50cywKKyAgICAjIG9uZSBmb3IgZXZlcnkgZmlsZSB0aGF0IHNob3VsZCBiZSBvcGVuZWQuCisgICAgcm9vdC5jcmVhdGVjb21tYW5kKCI6OnRrOjptYWM6Ok9wZW5Eb2N1bWVudCIsIGRvT3BlbkZpbGUpCisKK2RlZiBoaWRlVGtDb25zb2xlKHJvb3QpOgorICAgIHRyeToKKyAgICAgICAgcm9vdC50ay5jYWxsKCdjb25zb2xlJywgJ2hpZGUnKQorICAgIGV4Y2VwdCBUa2ludGVyLlRjbEVycm9yOgorICAgICAgICAjIFNvbWUgdmVyc2lvbnMgb2YgdGhlIFRrIGZyYW1ld29yayBkb24ndCBoYXZlIGEgY29uc29sZSBvYmplY3QKKyAgICAgICAgcGFzcworCitkZWYgb3ZlcnJpZGVSb290TWVudShyb290LCBmbGlzdCk6CisgICAgIiIiCisgICAgUmVwbGFjZSB0aGUgVGsgcm9vdCBtZW51IGJ5IHNvbWV0aGluZyB0aGF0J3MgbW9yZSBhcHByb3ByaWF0ZSBmb3IKKyAgICBJRExFLgorICAgICIiIgorICAgICMgVGhlIG1lbnUgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgVGsgcm9vdCAoIi4iKSBpcyBhbHNvIHVzZWQgYnkgQXF1YVRrIGZvcgorICAgICMgYWxsIHdpbmRvd3MgdGhhdCBkb24ndCBzcGVjaWZ5IGEgbWVudSBvZiB0aGVpciBvd24uIFRoZSBkZWZhdWx0IG1lbnViYXIKKyAgICAjIGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1lbnVzLCBub25lIG9mIHdoaWNoIGFyZSBhcHByb3ByaWF0ZSBmb3IgSURMRS4gVGhlCisgICAgIyBNb3N0IGFubm95aW5nIG9mIHRob3NlIGlzIGFuICdBYm91dCBUY2svVGsuLi4nIG1lbnUgaW4gdGhlIGFwcGxpY2F0aW9uCisgICAgIyBtZW51LgorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gcmVwbGFjZXMgdGhlIGRlZmF1bHQgbWVudWJhciBieSBhIG1vc3RseSBlbXB0eSBvbmUsIGl0CisgICAgIyBzaG91bGQgb25seSBjb250YWluIHRoZSBjb3JyZWN0IGFwcGxpY2F0aW9uIG1lbnUgYW5kIHRoZSB3aW5kb3cgbWVudS4KKyAgICAjCisgICAgIyBEdWUgdG8gYSAobWlzLSlmZWF0dXJlIG9mIFRrQXF1YSB0aGUgdXNlciB3aWxsIGFsc28gc2VlIGFuIGVtcHR5IEhlbHAKKyAgICAjIG1lbnUuCisgICAgZnJvbSBUa2ludGVyIGltcG9ydCBNZW51LCBUZXh0LCBUZXh0CisgICAgZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgcHJlcHN0ciwgZ2V0X2FjY2VsZXJhdG9yCisgICAgZnJvbSBpZGxlbGliIGltcG9ydCBCaW5kaW5ncworICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgV2luZG93TGlzdAorICAgIGZyb20gaWRsZWxpYi5NdWx0aUNhbGwgaW1wb3J0IE11bHRpQ2FsbENyZWF0b3IKKworICAgIG1lbnViYXIgPSBNZW51KHJvb3QpCisgICAgcm9vdC5jb25maWd1cmUobWVudT1tZW51YmFyKQorICAgIG1lbnVkaWN0ID0ge30KKworICAgIG1lbnVkaWN0Wyd3aW5kb3dzJ10gPSBtZW51ID0gTWVudShtZW51YmFyLCBuYW1lPSd3aW5kb3dzJykKKyAgICBtZW51YmFyLmFkZF9jYXNjYWRlKGxhYmVsPSdXaW5kb3cnLCBtZW51PW1lbnUsIHVuZGVybGluZT0wKQorCisgICAgZGVmIHBvc3R3aW5kb3dzbWVudShtZW51PW1lbnUpOgorICAgICAgICBlbmQgPSBtZW51LmluZGV4KCdlbmQnKQorICAgICAgICBpZiBlbmQgaXMgTm9uZToKKyAgICAgICAgICAgIGVuZCA9IC0xCisKKyAgICAgICAgaWYgZW5kID4gMDoKKyAgICAgICAgICAgIG1lbnUuZGVsZXRlKDAsIGVuZCkKKyAgICAgICAgV2luZG93TGlzdC5hZGRfd2luZG93c190b19tZW51KG1lbnUpCisgICAgV2luZG93TGlzdC5yZWdpc3Rlcl9jYWxsYmFjayhwb3N0d2luZG93c21lbnUpCisKKyAgICBkZWYgYWJvdXRfZGlhbG9nKGV2ZW50PU5vbmUpOgorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGFib3V0RGlhbG9nCisgICAgICAgIGFib3V0RGlhbG9nLkFib3V0RGlhbG9nKHJvb3QsICdBYm91dCBJRExFJykKKworICAgIGRlZiBjb25maWdfZGlhbG9nKGV2ZW50PU5vbmUpOgorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IGNvbmZpZ0RpYWxvZworICAgICAgICByb290Lmluc3RhbmNlX2RpY3QgPSBmbGlzdC5pbnZlcnNlZGljdAorICAgICAgICBjb25maWdEaWFsb2cuQ29uZmlnRGlhbG9nKHJvb3QsICdTZXR0aW5ncycpCisKKyAgICBkZWYgaGVscF9kaWFsb2coZXZlbnQ9Tm9uZSk6CisgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgdGV4dFZpZXcKKyAgICAgICAgZm4gPSBwYXRoLmpvaW4ocGF0aC5hYnNwYXRoKHBhdGguZGlybmFtZShfX2ZpbGVfXykpLCAnaGVscC50eHQnKQorICAgICAgICB0ZXh0Vmlldy52aWV3X2ZpbGUocm9vdCwgJ0hlbHAnLCBmbikKKworICAgIHJvb3QuYmluZCgnPDxhYm91dC1pZGxlPj4nLCBhYm91dF9kaWFsb2cpCisgICAgcm9vdC5iaW5kKCc8PG9wZW4tY29uZmlnLWRpYWxvZz4+JywgY29uZmlnX2RpYWxvZykKKyAgICByb290LmNyZWF0ZWNvbW1hbmQoJzo6dGs6Om1hYzo6U2hvd1ByZWZlcmVuY2VzJywgY29uZmlnX2RpYWxvZykKKyAgICBpZiBmbGlzdDoKKyAgICAgICAgcm9vdC5iaW5kKCc8PGNsb3NlLWFsbC13aW5kb3dzPj4nLCBmbGlzdC5jbG9zZV9hbGxfY2FsbGJhY2spCisKKyAgICAgICAgIyBUaGUgYmluZGluZyBhYm92ZSBkb2Vzbid0IHJlbGlhYmx5IHdvcmsgb24gYWxsIHZlcnNpb25zIG9mIFRrCisgICAgICAgICMgb24gTWFjT1NYLiBBZGRpbmcgY29tbWFuZCBkZWZpbml0aW9uIGJlbG93IGRvZXMgc2VlbSB0byBkbyB0aGUKKyAgICAgICAgIyByaWdodCB0aGluZyBmb3Igbm93LgorICAgICAgICByb290LmNyZWF0ZWNvbW1hbmQoJ2V4aXQnLCBmbGlzdC5jbG9zZV9hbGxfY2FsbGJhY2spCisKKyAgICBpZiBpc0NhcmJvbkFxdWFUayhyb290KToKKyAgICAgICAgIyBmb3IgQ2FyYm9uIEFxdWFUaywgcmVwbGFjZSB0aGUgZGVmYXVsdCBUayBhcHBsZSBtZW51CisgICAgICAgIG1lbnVkaWN0WydhcHBsaWNhdGlvbiddID0gbWVudSA9IE1lbnUobWVudWJhciwgbmFtZT0nYXBwbGUnKQorICAgICAgICBtZW51YmFyLmFkZF9jYXNjYWRlKGxhYmVsPSdJRExFJywgbWVudT1tZW51KQorICAgICAgICBCaW5kaW5ncy5tZW51ZGVmcy5pbnNlcnQoMCwKKyAgICAgICAgICAgICgnYXBwbGljYXRpb24nLCBbCisgICAgICAgICAgICAgICAgKCdBYm91dCBJRExFJywgJzw8YWJvdXQtaWRsZT4+JyksCisgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgXSkpCisgICAgICAgIHRrdmVyc2lvbiA9IHJvb3QudGsuZXZhbCgnaW5mbyBwYXRjaGxldmVsJykKKyAgICAgICAgaWYgdHVwbGUobWFwKGludCwgdGt2ZXJzaW9uLnNwbGl0KCcuJykpKSA8ICg4LCA0LCAxNCk6CisgICAgICAgICAgICAjIGZvciBlYXJsaWVyIEFxdWFUayB2ZXJzaW9ucywgc3VwcGx5IGEgUHJlZmVyZW5jZXMgbWVudSBpdGVtCisgICAgICAgICAgICBCaW5kaW5ncy5tZW51ZGVmc1swXVsxXS5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgICgnX1ByZWZlcmVuY2VzLi4uLicsICc8PG9wZW4tY29uZmlnLWRpYWxvZz4+JyksCisgICAgICAgICAgICAgICAgKQorICAgIGVsc2U6CisgICAgICAgICMgYXNzdW1lIENvY29hIEFxdWFUaworICAgICAgICAjIHJlcGxhY2UgZGVmYXVsdCBBYm91dCBkaWFsb2cgd2l0aCBBYm91dCBJRExFIG9uZQorICAgICAgICByb290LmNyZWF0ZWNvbW1hbmQoJ3RrQWJvdXREaWFsb2cnLCBhYm91dF9kaWFsb2cpCisgICAgICAgICMgcmVwbGFjZSBkZWZhdWx0ICJIZWxwIiBpdGVtIGluIEhlbHAgbWVudQorICAgICAgICByb290LmNyZWF0ZWNvbW1hbmQoJzo6dGs6Om1hYzo6U2hvd0hlbHAnLCBoZWxwX2RpYWxvZykKKyAgICAgICAgIyByZW1vdmUgcmVkdW5kYW50ICJJRExFIEhlbHAiIGZyb20gbWVudQorICAgICAgICBkZWwgQmluZGluZ3MubWVudWRlZnNbLTFdWzFdWzBdCisKK2RlZiBzZXR1cEFwcChyb290LCBmbGlzdCk6CisgICAgIiIiCisgICAgUGVyZm9ybSBzZXR1cCBmb3IgdGhlIE9TWCBhcHBsaWNhdGlvbiBidW5kbGUuCisgICAgIiIiCisgICAgaWYgbm90IHJ1bm5pbmdBc09TWEFwcCgpOiByZXR1cm4KKworICAgIGhpZGVUa0NvbnNvbGUocm9vdCkKKyAgICBvdmVycmlkZVJvb3RNZW51KHJvb3QsIGZsaXN0KQorICAgIGFkZE9wZW5FdmVudFN1cHBvcnQocm9vdCwgZmxpc3QpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0NzIzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0NzIzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnBjLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3JwYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjYxMWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3JwYy5weQpAQCAtMCwwICsxLDYwMCBAQAorIiIiUlBDIEltcGxlbWVudGlvbiwgb3JpZ2luYWxseSB3cml0dGVuIGZvciB0aGUgUHl0aG9uIElkbGUgSURFCisKK0ZvciBzZWN1cml0eSByZWFzb25zLCBHdlIgcmVxdWVzdGVkIHRoYXQgSWRsZSdzIFB5dGhvbiBleGVjdXRpb24gc2VydmVyIHByb2Nlc3MKK2Nvbm5lY3QgdG8gdGhlIElkbGUgcHJvY2Vzcywgd2hpY2ggbGlzdGVucyBmb3IgdGhlIGNvbm5lY3Rpb24uICBTaW5jZSBJZGxlIGhhcworb25seSBvbmUgY2xpZW50IHBlciBzZXJ2ZXIsIHRoaXMgd2FzIG5vdCBhIGxpbWl0YXRpb24uCisKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICstLS0tLS0tLS0tLS0tKworICAgfCBTb2NrZXRTZXJ2ZXIuQmFzZVJlcXVlc3RIYW5kbGVyIHwgfCBTb2NrZXRJTyAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyArLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgIHwgcmVnaXN0ZXIoKSAgfAorICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCB1bnJlZ2lzdGVyKCl8CisgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIF4gIF4KKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHwgIHwKKyAgICAgICAgICAgICAgICAgICB8ICsgLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwKKyAgICAgICAgICAgICAgICAgICB8IHwgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tKworICAgfCBSUENIYW5kbGVyICAgICAgICAgICAgICB8ICAgICAgICB8IFJQQ0NsaWVudCAgICAgICB8CisgICB8IFthdHRyaWJ1dGUgb2YgUlBDU2VydmVyXXwgICAgICAgIHwgICAgICAgICAgICAgICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tKworCitUaGUgUlBDU2VydmVyIGhhbmRsZXIgY2xhc3MgaXMgZXhwZWN0ZWQgdG8gcHJvdmlkZSByZWdpc3Rlci91bnJlZ2lzdGVyIG1ldGhvZHMuCitSUENIYW5kbGVyIGluaGVyaXRzIHRoZSBtaXgtaW4gY2xhc3MgU29ja2V0SU8sIHdoaWNoIHByb3ZpZGVzIHRoZXNlIG1ldGhvZHMuCisKK1NlZSB0aGUgSWRsZSBydW4ubWFpbigpIGRvY3N0cmluZyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBvbiBob3cgdGhpcyB3YXMKK2FjY29tcGxpc2hlZCBpbiBJZGxlLgorCisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc2VsZWN0CitpbXBvcnQgU29ja2V0U2VydmVyCitpbXBvcnQgc3RydWN0CitpbXBvcnQgY1BpY2tsZSBhcyBwaWNrbGUKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCBRdWV1ZQoraW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IGNvcHlfcmVnCitpbXBvcnQgdHlwZXMKK2ltcG9ydCBtYXJzaGFsCisKKworZGVmIHVucGlja2xlX2NvZGUobXMpOgorICAgIGNvID0gbWFyc2hhbC5sb2FkcyhtcykKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShjbywgdHlwZXMuQ29kZVR5cGUpCisgICAgcmV0dXJuIGNvCisKK2RlZiBwaWNrbGVfY29kZShjbyk6CisgICAgYXNzZXJ0IGlzaW5zdGFuY2UoY28sIHR5cGVzLkNvZGVUeXBlKQorICAgIG1zID0gbWFyc2hhbC5kdW1wcyhjbykKKyAgICByZXR1cm4gdW5waWNrbGVfY29kZSwgKG1zLCkKKworIyBYWFggS0JLIDI0QXVnMDIgZnVuY3Rpb24gcGlja2xpbmcgY2FwYWJpbGl0eSBub3QgdXNlZCBpbiBJZGxlCisjICBkZWYgdW5waWNrbGVfZnVuY3Rpb24obXMpOgorIyAgICAgIHJldHVybiBtcworCisjICBkZWYgcGlja2xlX2Z1bmN0aW9uKGZuKToKKyMgICAgICBhc3NlcnQgaXNpbnN0YW5jZShmbiwgdHlwZS5GdW5jdGlvblR5cGUpCisjICAgICAgcmV0dXJuIHJlcHIoZm4pCisKK2NvcHlfcmVnLnBpY2tsZSh0eXBlcy5Db2RlVHlwZSwgcGlja2xlX2NvZGUsIHVucGlja2xlX2NvZGUpCisjIGNvcHlfcmVnLnBpY2tsZSh0eXBlcy5GdW5jdGlvblR5cGUsIHBpY2tsZV9mdW5jdGlvbiwgdW5waWNrbGVfZnVuY3Rpb24pCisKK0JVRlNJWkUgPSA4KjEwMjQKK0xPQ0FMSE9TVCA9ICcxMjcuMC4wLjEnCisKK2NsYXNzIFJQQ1NlcnZlcihTb2NrZXRTZXJ2ZXIuVENQU2VydmVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyLCBoYW5kbGVyY2xhc3M9Tm9uZSk6CisgICAgICAgIGlmIGhhbmRsZXJjbGFzcyBpcyBOb25lOgorICAgICAgICAgICAgaGFuZGxlcmNsYXNzID0gUlBDSGFuZGxlcgorICAgICAgICBTb2NrZXRTZXJ2ZXIuVENQU2VydmVyLl9faW5pdF9fKHNlbGYsIGFkZHIsIGhhbmRsZXJjbGFzcykKKworICAgIGRlZiBzZXJ2ZXJfYmluZChzZWxmKToKKyAgICAgICAgIk92ZXJyaWRlIFRDUFNlcnZlciBtZXRob2QsIG5vIGJpbmQoKSBwaGFzZSBmb3IgY29ubmVjdGluZyBlbnRpdHkiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBzZXJ2ZXJfYWN0aXZhdGUoc2VsZik6CisgICAgICAgICIiIk92ZXJyaWRlIFRDUFNlcnZlciBtZXRob2QsIGNvbm5lY3QoKSBpbnN0ZWFkIG9mIGxpc3RlbigpCisKKyAgICAgICAgRHVlIHRvIHRoZSByZXZlcnNlZCBjb25uZWN0aW9uLCBzZWxmLnNlcnZlcl9hZGRyZXNzIGlzIGFjdHVhbGx5IHRoZQorICAgICAgICBhZGRyZXNzIG9mIHRoZSBJZGxlIENsaWVudCB0byB3aGljaCB3ZSBhcmUgY29ubmVjdGluZy4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zb2NrZXQuY29ubmVjdChzZWxmLnNlcnZlcl9hZGRyZXNzKQorCisgICAgZGVmIGdldF9yZXF1ZXN0KHNlbGYpOgorICAgICAgICAiT3ZlcnJpZGUgVENQU2VydmVyIG1ldGhvZCwgcmV0dXJuIGFscmVhZHkgY29ubmVjdGVkIHNvY2tldCIKKyAgICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LCBzZWxmLnNlcnZlcl9hZGRyZXNzCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgIiIiT3ZlcnJpZGUgVENQU2VydmVyIG1ldGhvZAorCisgICAgICAgIEVycm9yIG1lc3NhZ2UgZ29lcyB0byBfX3N0ZGVycl9fLiAgTm8gZXJyb3IgbWVzc2FnZSBpZiBleGl0aW5nCisgICAgICAgIG5vcm1hbGx5IG9yIHNvY2tldCByYWlzZWQgRU9GLiAgT3RoZXIgZXhjZXB0aW9ucyBub3QgaGFuZGxlZCBpbgorICAgICAgICBzZXJ2ZXIgY29kZSB3aWxsIGNhdXNlIG9zLl9leGl0LgorCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGVyZiA9IHN5cy5fX3N0ZGVycl9fCisgICAgICAgICAgICBwcmludD4+ZXJmLCAnXG4nICsgJy0nKjQwCisgICAgICAgICAgICBwcmludD4+ZXJmLCAnVW5oYW5kbGVkIHNlcnZlciBleGNlcHRpb24hJworICAgICAgICAgICAgcHJpbnQ+PmVyZiwgJ1RocmVhZDogJXMnICUgdGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkKKyAgICAgICAgICAgIHByaW50Pj5lcmYsICdDbGllbnQgQWRkcmVzczogJywgY2xpZW50X2FkZHJlc3MKKyAgICAgICAgICAgIHByaW50Pj5lcmYsICdSZXF1ZXN0OiAnLCByZXByKHJlcXVlc3QpCisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKGZpbGU9ZXJmKQorICAgICAgICAgICAgcHJpbnQ+PmVyZiwgJ1xuKioqIFVucmVjb3ZlcmFibGUsIHNlcnZlciBleGl0aW5nIScKKyAgICAgICAgICAgIHByaW50Pj5lcmYsICctJyo0MAorICAgICAgICAgICAgb3MuX2V4aXQoMCkKKworIy0tLS0tLS0tLS0tLS0tLS0tIGVuZCBjbGFzcyBSUENTZXJ2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworb2JqZWN0dGFibGUgPSB7fQorcmVxdWVzdF9xdWV1ZSA9IFF1ZXVlLlF1ZXVlKDApCityZXNwb25zZV9xdWV1ZSA9IFF1ZXVlLlF1ZXVlKDApCisKKworY2xhc3MgU29ja2V0SU8ob2JqZWN0KToKKworICAgIG5leHRzZXEgPSAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc29jaywgb2JqdGFibGU9Tm9uZSwgZGVidWdnaW5nPU5vbmUpOgorICAgICAgICBzZWxmLnNvY2t0aHJlYWQgPSB0aHJlYWRpbmcuY3VycmVudFRocmVhZCgpCisgICAgICAgIGlmIGRlYnVnZ2luZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVidWdnaW5nID0gZGVidWdnaW5nCisgICAgICAgIHNlbGYuc29jayA9IHNvY2sKKyAgICAgICAgaWYgb2JqdGFibGUgaXMgTm9uZToKKyAgICAgICAgICAgIG9ianRhYmxlID0gb2JqZWN0dGFibGUKKyAgICAgICAgc2VsZi5vYmp0YWJsZSA9IG9ianRhYmxlCisgICAgICAgIHNlbGYucmVzcG9uc2VzID0ge30KKyAgICAgICAgc2VsZi5jdmFycyA9IHt9CisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNvY2sgPSBzZWxmLnNvY2sKKyAgICAgICAgc2VsZi5zb2NrID0gTm9uZQorICAgICAgICBpZiBzb2NrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc29jay5jbG9zZSgpCisKKyAgICBkZWYgZXhpdGhvb2soc2VsZik6CisgICAgICAgICJvdmVycmlkZSBmb3Igc3BlY2lmaWMgZXhpdCBhY3Rpb24iCisgICAgICAgIG9zLl9leGl0KDApCisKKyAgICBkZWYgZGVidWcoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBub3Qgc2VsZi5kZWJ1Z2dpbmc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcyA9IHNlbGYubG9jYXRpb24gKyAiICIgKyBzdHIodGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpCisgICAgICAgIGZvciBhIGluIGFyZ3M6CisgICAgICAgICAgICBzID0gcyArICIgIiArIHN0cihhKQorICAgICAgICBwcmludD4+c3lzLl9fc3RkZXJyX18sIHMKKworICAgIGRlZiByZWdpc3RlcihzZWxmLCBvaWQsIG9iamVjdCk6CisgICAgICAgIHNlbGYub2JqdGFibGVbb2lkXSA9IG9iamVjdAorCisgICAgZGVmIHVucmVnaXN0ZXIoc2VsZiwgb2lkKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHNlbGYub2JqdGFibGVbb2lkXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgbG9jYWxjYWxsKHNlbGYsIHNlcSwgcmVxdWVzdCk6CisgICAgICAgIHNlbGYuZGVidWcoImxvY2FsY2FsbDoiLCByZXF1ZXN0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBob3csIChvaWQsIG1ldGhvZG5hbWUsIGFyZ3MsIGt3YXJncykgPSByZXF1ZXN0CisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gKCJFUlJPUiIsICJCYWQgcmVxdWVzdCBmb3JtYXQiKQorICAgICAgICBpZiBvaWQgbm90IGluIHNlbGYub2JqdGFibGU6CisgICAgICAgICAgICByZXR1cm4gKCJFUlJPUiIsICJVbmtub3duIG9iamVjdCBpZDogJXIiICUgKG9pZCwpKQorICAgICAgICBvYmogPSBzZWxmLm9ianRhYmxlW29pZF0KKyAgICAgICAgaWYgbWV0aG9kbmFtZSA9PSAiX19tZXRob2RzX18iOgorICAgICAgICAgICAgbWV0aG9kcyA9IHt9CisgICAgICAgICAgICBfZ2V0bWV0aG9kcyhvYmosIG1ldGhvZHMpCisgICAgICAgICAgICByZXR1cm4gKCJPSyIsIG1ldGhvZHMpCisgICAgICAgIGlmIG1ldGhvZG5hbWUgPT0gIl9fYXR0cmlidXRlc19fIjoKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSB7fQorICAgICAgICAgICAgX2dldGF0dHJpYnV0ZXMob2JqLCBhdHRyaWJ1dGVzKQorICAgICAgICAgICAgcmV0dXJuICgiT0siLCBhdHRyaWJ1dGVzKQorICAgICAgICBpZiBub3QgaGFzYXR0cihvYmosIG1ldGhvZG5hbWUpOgorICAgICAgICAgICAgcmV0dXJuICgiRVJST1IiLCAiVW5zdXBwb3J0ZWQgbWV0aG9kIG5hbWU6ICVyIiAlIChtZXRob2RuYW1lLCkpCisgICAgICAgIG1ldGhvZCA9IGdldGF0dHIob2JqLCBtZXRob2RuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBob3cgPT0gJ0NBTEwnOgorICAgICAgICAgICAgICAgIHJldCA9IG1ldGhvZCgqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXQsIFJlbW90ZU9iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHJlbW90ZXJlZihyZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuICgiT0siLCByZXQpCisgICAgICAgICAgICBlbGlmIGhvdyA9PSAnUVVFVUUnOgorICAgICAgICAgICAgICAgIHJlcXVlc3RfcXVldWUucHV0KChzZXEsIChtZXRob2QsIGFyZ3MsIGt3YXJncykpKQorICAgICAgICAgICAgICAgIHJldHVybigiUVVFVUVEIiwgTm9uZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiRVJST1IiLCAiVW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlOiAlcyIgJSBob3cpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIG1zZyA9ICIqKiogSW50ZXJuYWwgRXJyb3I6IHJwYy5weTpTb2NrZXRJTy5sb2NhbGNhbGwoKVxuXG4iXAorICAgICAgICAgICAgICAgICAgIiBPYmplY3Q6ICVzIFxuIE1ldGhvZDogJXMgXG4gQXJnczogJXNcbiIKKyAgICAgICAgICAgIHByaW50Pj5zeXMuX19zdGRlcnJfXywgbXNnICUgKG9pZCwgbWV0aG9kLCBhcmdzKQorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhmaWxlPXN5cy5fX3N0ZGVycl9fKQorICAgICAgICAgICAgcmV0dXJuICgiRVhDRVBUSU9OIiwgTm9uZSkKKworICAgIGRlZiByZW1vdGVjYWxsKHNlbGYsIG9pZCwgbWV0aG9kbmFtZSwgYXJncywga3dhcmdzKToKKyAgICAgICAgc2VsZi5kZWJ1ZygicmVtb3RlY2FsbDphc3luY2NhbGw6ICIsIG9pZCwgbWV0aG9kbmFtZSkKKyAgICAgICAgc2VxID0gc2VsZi5hc3luY2NhbGwob2lkLCBtZXRob2RuYW1lLCBhcmdzLCBrd2FyZ3MpCisgICAgICAgIHJldHVybiBzZWxmLmFzeW5jcmV0dXJuKHNlcSkKKworICAgIGRlZiByZW1vdGVxdWV1ZShzZWxmLCBvaWQsIG1ldGhvZG5hbWUsIGFyZ3MsIGt3YXJncyk6CisgICAgICAgIHNlbGYuZGVidWcoInJlbW90ZXF1ZXVlOmFzeW5jcXVldWU6ICIsIG9pZCwgbWV0aG9kbmFtZSkKKyAgICAgICAgc2VxID0gc2VsZi5hc3luY3F1ZXVlKG9pZCwgbWV0aG9kbmFtZSwgYXJncywga3dhcmdzKQorICAgICAgICByZXR1cm4gc2VsZi5hc3luY3JldHVybihzZXEpCisKKyAgICBkZWYgYXN5bmNjYWxsKHNlbGYsIG9pZCwgbWV0aG9kbmFtZSwgYXJncywga3dhcmdzKToKKyAgICAgICAgcmVxdWVzdCA9ICgiQ0FMTCIsIChvaWQsIG1ldGhvZG5hbWUsIGFyZ3MsIGt3YXJncykpCisgICAgICAgIHNlcSA9IHNlbGYubmV3c2VxKCkKKyAgICAgICAgaWYgdGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQoKSAhPSBzZWxmLnNvY2t0aHJlYWQ6CisgICAgICAgICAgICBjdmFyID0gdGhyZWFkaW5nLkNvbmRpdGlvbigpCisgICAgICAgICAgICBzZWxmLmN2YXJzW3NlcV0gPSBjdmFyCisgICAgICAgIHNlbGYuZGVidWcoKCJhc3luY2NhbGw6JWQ6IiAlIHNlcSksIG9pZCwgbWV0aG9kbmFtZSwgYXJncywga3dhcmdzKQorICAgICAgICBzZWxmLnB1dG1lc3NhZ2UoKHNlcSwgcmVxdWVzdCkpCisgICAgICAgIHJldHVybiBzZXEKKworICAgIGRlZiBhc3luY3F1ZXVlKHNlbGYsIG9pZCwgbWV0aG9kbmFtZSwgYXJncywga3dhcmdzKToKKyAgICAgICAgcmVxdWVzdCA9ICgiUVVFVUUiLCAob2lkLCBtZXRob2RuYW1lLCBhcmdzLCBrd2FyZ3MpKQorICAgICAgICBzZXEgPSBzZWxmLm5ld3NlcSgpCisgICAgICAgIGlmIHRocmVhZGluZy5jdXJyZW50VGhyZWFkKCkgIT0gc2VsZi5zb2NrdGhyZWFkOgorICAgICAgICAgICAgY3ZhciA9IHRocmVhZGluZy5Db25kaXRpb24oKQorICAgICAgICAgICAgc2VsZi5jdmFyc1tzZXFdID0gY3ZhcgorICAgICAgICBzZWxmLmRlYnVnKCgiYXN5bmNxdWV1ZTolZDoiICUgc2VxKSwgb2lkLCBtZXRob2RuYW1lLCBhcmdzLCBrd2FyZ3MpCisgICAgICAgIHNlbGYucHV0bWVzc2FnZSgoc2VxLCByZXF1ZXN0KSkKKyAgICAgICAgcmV0dXJuIHNlcQorCisgICAgZGVmIGFzeW5jcmV0dXJuKHNlbGYsIHNlcSk6CisgICAgICAgIHNlbGYuZGVidWcoImFzeW5jcmV0dXJuOiVkOmNhbGwgZ2V0cmVzcG9uc2UoKTogIiAlIHNlcSkKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmdldHJlc3BvbnNlKHNlcSwgd2FpdD0wLjA1KQorICAgICAgICBzZWxmLmRlYnVnKCgiYXN5bmNyZXR1cm46JWQ6cmVzcG9uc2U6ICIgJSBzZXEpLCByZXNwb25zZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZGVjb2RlcmVzcG9uc2UocmVzcG9uc2UpCisKKyAgICBkZWYgZGVjb2RlcmVzcG9uc2Uoc2VsZiwgcmVzcG9uc2UpOgorICAgICAgICBob3csIHdoYXQgPSByZXNwb25zZQorICAgICAgICBpZiBob3cgPT0gIk9LIjoKKyAgICAgICAgICAgIHJldHVybiB3aGF0CisgICAgICAgIGlmIGhvdyA9PSAiUVVFVUVEIjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIGhvdyA9PSAiRVhDRVBUSU9OIjoKKyAgICAgICAgICAgIHNlbGYuZGVidWcoImRlY29kZXJlc3BvbnNlOiBFWENFUFRJT04iKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgaG93ID09ICJFT0YiOgorICAgICAgICAgICAgc2VsZi5kZWJ1ZygiZGVjb2RlcmVzcG9uc2U6IEVPRiIpCisgICAgICAgICAgICBzZWxmLmRlY29kZV9pbnRlcnJ1cHRob29rKCkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIGhvdyA9PSAiRVJST1IiOgorICAgICAgICAgICAgc2VsZi5kZWJ1ZygiZGVjb2RlcmVzcG9uc2U6IEludGVybmFsIEVSUk9SOiIsIHdoYXQpCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIHdoYXQKKyAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IsIChob3csIHdoYXQpCisKKyAgICBkZWYgZGVjb2RlX2ludGVycnVwdGhvb2soc2VsZik6CisgICAgICAgICIiCisgICAgICAgIHJhaXNlIEVPRkVycm9yCisKKyAgICBkZWYgbWFpbmxvb3Aoc2VsZik6CisgICAgICAgICIiIkxpc3RlbiBvbiBzb2NrZXQgdW50aWwgSS9PIG5vdCByZWFkeSBvciBFT0YKKworICAgICAgICBwb2xscmVzcG9uc2UoKSB3aWxsIGxvb3AgbG9va2luZyBmb3Igc2VxIG51bWJlciBOb25lLCB3aGljaAorICAgICAgICBuZXZlciBjb21lcywgYW5kIGV4aXQgb24gRU9GRXJyb3IuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZ2V0cmVzcG9uc2UobXlzZXE9Tm9uZSwgd2FpdD0wLjA1KQorICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICBzZWxmLmRlYnVnKCJtYWlubG9vcDpyZXR1cm4iKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgZ2V0cmVzcG9uc2Uoc2VsZiwgbXlzZXEsIHdhaXQpOgorICAgICAgICByZXNwb25zZSA9IHNlbGYuX2dldHJlc3BvbnNlKG15c2VxLCB3YWl0KQorICAgICAgICBpZiByZXNwb25zZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGhvdywgd2hhdCA9IHJlc3BvbnNlCisgICAgICAgICAgICBpZiBob3cgPT0gIk9LIjoKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IGhvdywgc2VsZi5fcHJveGlmeSh3aGF0KQorICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworICAgIGRlZiBfcHJveGlmeShzZWxmLCBvYmopOgorICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgUmVtb3RlUHJveHkpOgorICAgICAgICAgICAgcmV0dXJuIFJQQ1Byb3h5KHNlbGYsIG9iai5vaWQpCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCB0eXBlcy5MaXN0VHlwZSk6CisgICAgICAgICAgICByZXR1cm4gbWFwKHNlbGYuX3Byb3hpZnksIG9iaikKKyAgICAgICAgIyBYWFggQ2hlY2sgZm9yIG90aGVyIHR5cGVzIC0tIG5vdCBjdXJyZW50bHkgbmVlZGVkCisgICAgICAgIHJldHVybiBvYmoKKworICAgIGRlZiBfZ2V0cmVzcG9uc2Uoc2VsZiwgbXlzZXEsIHdhaXQpOgorICAgICAgICBzZWxmLmRlYnVnKCJfZ2V0cmVzcG9uc2U6bXlzZXE6IiwgbXlzZXEpCisgICAgICAgIGlmIHRocmVhZGluZy5jdXJyZW50VGhyZWFkKCkgaXMgc2VsZi5zb2NrdGhyZWFkOgorICAgICAgICAgICAgIyB0aGlzIHRocmVhZCBkb2VzIGFsbCByZWFkaW5nIG9mIHJlcXVlc3RzIG9yIHJlc3BvbnNlcworICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYucG9sbHJlc3BvbnNlKG15c2VxLCB3YWl0KQorICAgICAgICAgICAgICAgIGlmIHJlc3BvbnNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgd2FpdCBmb3Igbm90aWZpY2F0aW9uIGZyb20gc29ja2V0IGhhbmRsaW5nIHRocmVhZAorICAgICAgICAgICAgY3ZhciA9IHNlbGYuY3ZhcnNbbXlzZXFdCisgICAgICAgICAgICBjdmFyLmFjcXVpcmUoKQorICAgICAgICAgICAgd2hpbGUgbXlzZXEgbm90IGluIHNlbGYucmVzcG9uc2VzOgorICAgICAgICAgICAgICAgIGN2YXIud2FpdCgpCisgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYucmVzcG9uc2VzW215c2VxXQorICAgICAgICAgICAgc2VsZi5kZWJ1ZygiX2dldHJlc3BvbnNlOiVzOiB0aHJlYWQgd29rZSB1cDogcmVzcG9uc2U6ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgIChteXNlcSwgcmVzcG9uc2UpKQorICAgICAgICAgICAgZGVsIHNlbGYucmVzcG9uc2VzW215c2VxXQorICAgICAgICAgICAgZGVsIHNlbGYuY3ZhcnNbbXlzZXFdCisgICAgICAgICAgICBjdmFyLnJlbGVhc2UoKQorICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCisKKyAgICBkZWYgbmV3c2VxKHNlbGYpOgorICAgICAgICBzZWxmLm5leHRzZXEgPSBzZXEgPSBzZWxmLm5leHRzZXEgKyAyCisgICAgICAgIHJldHVybiBzZXEKKworICAgIGRlZiBwdXRtZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLmRlYnVnKCJwdXRtZXNzYWdlOiVkOiIgJSBtZXNzYWdlWzBdKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gcGlja2xlLmR1bXBzKG1lc3NhZ2UpCisgICAgICAgIGV4Y2VwdCBwaWNrbGUuUGlja2xpbmdFcnJvcjoKKyAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3RkZXJyX18sICJDYW5ub3QgcGlja2xlOiIsIHJlcHIobWVzc2FnZSkKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHMgPSBzdHJ1Y3QucGFjaygiPGkiLCBsZW4ocykpICsgcworICAgICAgICB3aGlsZSBsZW4ocykgPiAwOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHIsIHcsIHggPSBzZWxlY3Quc2VsZWN0KFtdLCBbc2VsZi5zb2NrXSwgW10pCisgICAgICAgICAgICAgICAgbiA9IHNlbGYuc29jay5zZW5kKHNbOkJVRlNJWkVdKQorICAgICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAic29ja2V0IG5vIGxvbmdlciBleGlzdHMiCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHMgPSBzW246XQorCisgICAgYnVmZmVyID0gIiIKKyAgICBidWZuZWVkID0gNAorICAgIGJ1ZnN0YXRlID0gMCAjIG1lYW5pbmc6IDAgPT4gcmVhZGluZyBjb3VudDsgMSA9PiByZWFkaW5nIGRhdGEKKworICAgIGRlZiBwb2xscGFja2V0KHNlbGYsIHdhaXQpOgorICAgICAgICBzZWxmLl9zdGFnZTAoKQorICAgICAgICBpZiBsZW4oc2VsZi5idWZmZXIpIDwgc2VsZi5idWZuZWVkOgorICAgICAgICAgICAgciwgdywgeCA9IHNlbGVjdC5zZWxlY3QoW3NlbGYuc29jay5maWxlbm8oKV0sIFtdLCBbXSwgd2FpdCkKKyAgICAgICAgICAgIGlmIGxlbihyKSA9PSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYuc29jay5yZWN2KEJVRlNJWkUpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgICAgICAgICBpZiBsZW4ocykgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICAgICAgc2VsZi5idWZmZXIgKz0gcworICAgICAgICAgICAgc2VsZi5fc3RhZ2UwKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3N0YWdlMSgpCisKKyAgICBkZWYgX3N0YWdlMChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5idWZzdGF0ZSA9PSAwIGFuZCBsZW4oc2VsZi5idWZmZXIpID49IDQ6CisgICAgICAgICAgICBzID0gc2VsZi5idWZmZXJbOjRdCisgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IHNlbGYuYnVmZmVyWzQ6XQorICAgICAgICAgICAgc2VsZi5idWZuZWVkID0gc3RydWN0LnVucGFjaygiPGkiLCBzKVswXQorICAgICAgICAgICAgc2VsZi5idWZzdGF0ZSA9IDEKKworICAgIGRlZiBfc3RhZ2UxKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmJ1ZnN0YXRlID09IDEgYW5kIGxlbihzZWxmLmJ1ZmZlcikgPj0gc2VsZi5idWZuZWVkOgorICAgICAgICAgICAgcGFja2V0ID0gc2VsZi5idWZmZXJbOnNlbGYuYnVmbmVlZF0KKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXJbc2VsZi5idWZuZWVkOl0KKyAgICAgICAgICAgIHNlbGYuYnVmbmVlZCA9IDQKKyAgICAgICAgICAgIHNlbGYuYnVmc3RhdGUgPSAwCisgICAgICAgICAgICByZXR1cm4gcGFja2V0CisKKyAgICBkZWYgcG9sbG1lc3NhZ2Uoc2VsZiwgd2FpdCk6CisgICAgICAgIHBhY2tldCA9IHNlbGYucG9sbHBhY2tldCh3YWl0KQorICAgICAgICBpZiBwYWNrZXQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBwaWNrbGUubG9hZHMocGFja2V0KQorICAgICAgICBleGNlcHQgcGlja2xlLlVucGlja2xpbmdFcnJvcjoKKyAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3RkZXJyX18sICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3RkZXJyX18sICJjYW5ub3QgdW5waWNrbGUgcGFja2V0OiIsIHJlcHIocGFja2V0KQorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X3N0YWNrKGZpbGU9c3lzLl9fc3RkZXJyX18pCisgICAgICAgICAgICBwcmludCA+PnN5cy5fX3N0ZGVycl9fLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisgICAgICAgICAgICByYWlzZQorICAgICAgICByZXR1cm4gbWVzc2FnZQorCisgICAgZGVmIHBvbGxyZXNwb25zZShzZWxmLCBteXNlcSwgd2FpdCk6CisgICAgICAgICIiIkhhbmRsZSBtZXNzYWdlcyByZWNlaXZlZCBvbiB0aGUgc29ja2V0LgorCisgICAgICAgIFNvbWUgbWVzc2FnZXMgcmVjZWl2ZWQgbWF5IGJlIGFzeW5jaHJvbm91cyAnY2FsbCcgb3IgJ3F1ZXVlJyByZXF1ZXN0cywKKyAgICAgICAgYW5kIHNvbWUgbWF5IGJlIHJlc3BvbnNlcyBmb3Igb3RoZXIgdGhyZWFkcy4KKworICAgICAgICAnY2FsbCcgcmVxdWVzdHMgYXJlIHBhc3NlZCB0byBzZWxmLmxvY2FsY2FsbCgpIHdpdGggdGhlIGV4cGVjdGF0aW9uIG9mCisgICAgICAgIGltbWVkaWF0ZSBleGVjdXRpb24sIGR1cmluZyB3aGljaCB0aW1lIHRoZSBzb2NrZXQgaXMgbm90IHNlcnZpY2VkLgorCisgICAgICAgICdxdWV1ZScgcmVxdWVzdHMgYXJlIHVzZWQgZm9yIHRhc2tzICh3aGljaCBtYXkgYmxvY2sgb3IgaGFuZykgdG8gYmUKKyAgICAgICAgcHJvY2Vzc2VkIGluIGEgZGlmZmVyZW50IHRocmVhZC4gIFRoZXNlIHJlcXVlc3RzIGFyZSBmZWQgaW50bworICAgICAgICByZXF1ZXN0X3F1ZXVlIGJ5IHNlbGYubG9jYWxjYWxsKCkuICBSZXNwb25zZXMgdG8gcXVldWVkIHJlcXVlc3RzIGFyZQorICAgICAgICB0YWtlbiBmcm9tIHJlc3BvbnNlX3F1ZXVlIGFuZCBzZW50IGFjcm9zcyB0aGUgbGluayB3aXRoIHRoZSBhc3NvY2lhdGVkCisgICAgICAgIHNlcXVlbmNlIG51bWJlcnMuICBNZXNzYWdlcyBpbiB0aGUgcXVldWVzIGFyZSAoc2VxdWVuY2VfbnVtYmVyLAorICAgICAgICByZXF1ZXN0L3Jlc3BvbnNlKSB0dXBsZXMgYW5kIGNvZGUgdXNpbmcgdGhpcyBtb2R1bGUgcmVtb3ZpbmcgbWVzc2FnZXMKKyAgICAgICAgZnJvbSB0aGUgcmVxdWVzdF9xdWV1ZSBpcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIHRoZSBjb3JyZWN0CisgICAgICAgIHNlcXVlbmNlIG51bWJlciBpbiB0aGUgcmVzcG9uc2VfcXVldWUuCisKKyAgICAgICAgcG9sbHJlc3BvbnNlKCkgd2lsbCBsb29wIHVudGlsIGEgcmVzcG9uc2UgbWVzc2FnZSB3aXRoIHRoZSBteXNlcQorICAgICAgICBzZXF1ZW5jZSBudW1iZXIgaXMgcmVjZWl2ZWQsIGFuZCB3aWxsIHNhdmUgb3RoZXIgcmVzcG9uc2VzIGluCisgICAgICAgIHNlbGYucmVzcG9uc2VzIGFuZCBub3RpZnkgdGhlIG93bmluZyB0aHJlYWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAjIHNlbmQgcXVldWVkIHJlc3BvbnNlIGlmIHRoZXJlIGlzIG9uZSBhdmFpbGFibGUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBxbXNnID0gcmVzcG9uc2VfcXVldWUuZ2V0KDApCisgICAgICAgICAgICBleGNlcHQgUXVldWUuRW1wdHk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZXEsIHJlc3BvbnNlID0gcW1zZworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAoc2VxLCAoJ09LJywgcmVzcG9uc2UpKQorICAgICAgICAgICAgICAgIHNlbGYucHV0bWVzc2FnZShtZXNzYWdlKQorICAgICAgICAgICAgIyBwb2xsIGZvciBtZXNzYWdlIG9uIGxpbmsKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gc2VsZi5wb2xsbWVzc2FnZSh3YWl0KQorICAgICAgICAgICAgICAgIGlmIG1lc3NhZ2UgaXMgTm9uZTogICMgc29ja2V0IG5vdCByZWFkeQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX0VPRigpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgc2VxLCByZXNxID0gbWVzc2FnZQorICAgICAgICAgICAgaG93ID0gcmVzcVswXQorICAgICAgICAgICAgc2VsZi5kZWJ1ZygicG9sbHJlc3BvbnNlOiVkOm15c2VxOiVzIiAlIChzZXEsIG15c2VxKSkKKyAgICAgICAgICAgICMgcHJvY2VzcyBvciBxdWV1ZSBhIHJlcXVlc3QKKyAgICAgICAgICAgIGlmIGhvdyBpbiAoIkNBTEwiLCAiUVVFVUUiKToKKyAgICAgICAgICAgICAgICBzZWxmLmRlYnVnKCJwb2xscmVzcG9uc2U6JWQ6bG9jYWxjYWxsOmNhbGw6IiAlIHNlcSkKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYubG9jYWxjYWxsKHNlcSwgcmVzcSkKKyAgICAgICAgICAgICAgICBzZWxmLmRlYnVnKCJwb2xscmVzcG9uc2U6JWQ6bG9jYWxjYWxsOnJlc3BvbnNlOiVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VxLCByZXNwb25zZSkpCisgICAgICAgICAgICAgICAgaWYgaG93ID09ICJDQUxMIjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wdXRtZXNzYWdlKChzZXEsIHJlc3BvbnNlKSkKKyAgICAgICAgICAgICAgICBlbGlmIGhvdyA9PSAiUVVFVUUiOgorICAgICAgICAgICAgICAgICAgICAjIGRvbid0IGFja25vd2xlZGdlIHRoZSAncXVldWUnIHJlcXVlc3QhCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyByZXR1cm4gaWYgY29tcGxldGVkIG1lc3NhZ2UgdHJhbnNhY3Rpb24KKyAgICAgICAgICAgIGVsaWYgc2VxID09IG15c2VxOgorICAgICAgICAgICAgICAgIHJldHVybiByZXNxCisgICAgICAgICAgICAjIG11c3QgYmUgYSByZXNwb25zZSBmb3IgYSBkaWZmZXJlbnQgdGhyZWFkOgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjdiA9IHNlbGYuY3ZhcnMuZ2V0KHNlcSwgTm9uZSkKKyAgICAgICAgICAgICAgICAjIHJlc3BvbnNlIGludm9sdmluZyB1bmtub3duIHNlcXVlbmNlIG51bWJlciBpcyBkaXNjYXJkZWQsCisgICAgICAgICAgICAgICAgIyBwcm9iYWJseSBpbnRlbmRlZCBmb3IgcHJpb3IgaW5jYXJuYXRpb24gb2Ygc2VydmVyCisgICAgICAgICAgICAgICAgaWYgY3YgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGN2LmFjcXVpcmUoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3BvbnNlc1tzZXFdID0gcmVzcQorICAgICAgICAgICAgICAgICAgICBjdi5ub3RpZnkoKQorICAgICAgICAgICAgICAgICAgICBjdi5yZWxlYXNlKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgZGVmIGhhbmRsZV9FT0Yoc2VsZik6CisgICAgICAgICJhY3Rpb24gdGFrZW4gdXBvbiBsaW5rIGJlaW5nIGNsb3NlZCBieSBwZWVyIgorICAgICAgICBzZWxmLkVPRmhvb2soKQorICAgICAgICBzZWxmLmRlYnVnKCJoYW5kbGVfRU9GIikKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLmN2YXJzOgorICAgICAgICAgICAgY3YgPSBzZWxmLmN2YXJzW2tleV0KKyAgICAgICAgICAgIGN2LmFjcXVpcmUoKQorICAgICAgICAgICAgc2VsZi5yZXNwb25zZXNba2V5XSA9ICgnRU9GJywgTm9uZSkKKyAgICAgICAgICAgIGN2Lm5vdGlmeSgpCisgICAgICAgICAgICBjdi5yZWxlYXNlKCkKKyAgICAgICAgIyBjYWxsIG91ciAocG9zc2libHkgb3ZlcnJpZGRlbikgZXhpdCBmdW5jdGlvbgorICAgICAgICBzZWxmLmV4aXRob29rKCkKKworICAgIGRlZiBFT0Zob29rKHNlbGYpOgorICAgICAgICAiQ2xhc3NlcyB1c2luZyBycGMgY2xpZW50L3NlcnZlciBjYW4gb3ZlcnJpZGUgdG8gYXVnbWVudCBFT0YgYWN0aW9uIgorICAgICAgICBwYXNzCisKKyMtLS0tLS0tLS0tLS0tLS0tLSBlbmQgY2xhc3MgU29ja2V0SU8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUmVtb3RlT2JqZWN0KG9iamVjdCk6CisgICAgIyBUb2tlbiBtaXgtaW4gY2xhc3MKKyAgICBwYXNzCisKK2RlZiByZW1vdGVyZWYob2JqKToKKyAgICBvaWQgPSBpZChvYmopCisgICAgb2JqZWN0dGFibGVbb2lkXSA9IG9iagorICAgIHJldHVybiBSZW1vdGVQcm94eShvaWQpCisKK2NsYXNzIFJlbW90ZVByb3h5KG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb2lkKToKKyAgICAgICAgc2VsZi5vaWQgPSBvaWQKKworY2xhc3MgUlBDSGFuZGxlcihTb2NrZXRTZXJ2ZXIuQmFzZVJlcXVlc3RIYW5kbGVyLCBTb2NrZXRJTyk6CisKKyAgICBkZWJ1Z2dpbmcgPSBGYWxzZQorICAgIGxvY2F0aW9uID0gIiNTIiAgIyBTZXJ2ZXIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NrLCBhZGRyLCBzdnIpOgorICAgICAgICBzdnIuY3VycmVudF9oYW5kbGVyID0gc2VsZiAjIyBjZ3QgeHh4CisgICAgICAgIFNvY2tldElPLl9faW5pdF9fKHNlbGYsIHNvY2spCisgICAgICAgIFNvY2tldFNlcnZlci5CYXNlUmVxdWVzdEhhbmRsZXIuX19pbml0X18oc2VsZiwgc29jaywgYWRkciwgc3ZyKQorCisgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgImhhbmRsZSgpIG1ldGhvZCByZXF1aXJlZCBieSBTb2NrZXRTZXJ2ZXIiCisgICAgICAgIHNlbGYubWFpbmxvb3AoKQorCisgICAgZGVmIGdldF9yZW1vdGVfcHJveHkoc2VsZiwgb2lkKToKKyAgICAgICAgcmV0dXJuIFJQQ1Byb3h5KHNlbGYsIG9pZCkKKworY2xhc3MgUlBDQ2xpZW50KFNvY2tldElPKToKKworICAgIGRlYnVnZ2luZyA9IEZhbHNlCisgICAgbG9jYXRpb24gPSAiI0MiICAjIENsaWVudAorCisgICAgbmV4dHNlcSA9IDEgIyBSZXF1ZXN0cyBjb21pbmcgZnJvbSB0aGUgY2xpZW50IGFyZSBvZGQgbnVtYmVyZWQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzLCBmYW1pbHk9c29ja2V0LkFGX0lORVQsIHR5cGU9c29ja2V0LlNPQ0tfU1RSRUFNKToKKyAgICAgICAgc2VsZi5saXN0ZW5pbmdfc29jayA9IHNvY2tldC5zb2NrZXQoZmFtaWx5LCB0eXBlKQorICAgICAgICBzZWxmLmxpc3RlbmluZ19zb2NrLmJpbmQoYWRkcmVzcykKKyAgICAgICAgc2VsZi5saXN0ZW5pbmdfc29jay5saXN0ZW4oMSkKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIHdvcmtpbmdfc29jaywgYWRkcmVzcyA9IHNlbGYubGlzdGVuaW5nX3NvY2suYWNjZXB0KCkKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2dpbmc6CisgICAgICAgICAgICBwcmludD4+c3lzLl9fc3RkZXJyX18sICIqKioqKiogQ29ubmVjdGlvbiByZXF1ZXN0IGZyb20gIiwgYWRkcmVzcworICAgICAgICBpZiBhZGRyZXNzWzBdID09IExPQ0FMSE9TVDoKKyAgICAgICAgICAgIFNvY2tldElPLl9faW5pdF9fKHNlbGYsIHdvcmtpbmdfc29jaykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50Pj5zeXMuX19zdGRlcnJfXywgIioqIEludmFsaWQgaG9zdDogIiwgYWRkcmVzcworICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmVycm9yCisKKyAgICBkZWYgZ2V0X3JlbW90ZV9wcm94eShzZWxmLCBvaWQpOgorICAgICAgICByZXR1cm4gUlBDUHJveHkoc2VsZiwgb2lkKQorCitjbGFzcyBSUENQcm94eShvYmplY3QpOgorCisgICAgX19tZXRob2RzID0gTm9uZQorICAgIF9fYXR0cmlidXRlcyA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NraW8sIG9pZCk6CisgICAgICAgIHNlbGYuc29ja2lvID0gc29ja2lvCisgICAgICAgIHNlbGYub2lkID0gb2lkCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIHNlbGYuX19tZXRob2RzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9fZ2V0bWV0aG9kcygpCisgICAgICAgIGlmIHNlbGYuX19tZXRob2RzLmdldChuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBNZXRob2RQcm94eShzZWxmLnNvY2tpbywgc2VsZi5vaWQsIG5hbWUpCisgICAgICAgIGlmIHNlbGYuX19hdHRyaWJ1dGVzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9fZ2V0YXR0cmlidXRlcygpCisgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fX2F0dHJpYnV0ZXM6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuc29ja2lvLnJlbW90ZWNhbGwoc2VsZi5vaWQsICdfX2dldGF0dHJpYnV0ZV9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwpLCB7fSkKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKKworICAgIGRlZiBfX2dldGF0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIHNlbGYuX19hdHRyaWJ1dGVzID0gc2VsZi5zb2NraW8ucmVtb3RlY2FsbChzZWxmLm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2F0dHJpYnV0ZXNfXyIsICgpLCB7fSkKKworICAgIGRlZiBfX2dldG1ldGhvZHMoc2VsZik6CisgICAgICAgIHNlbGYuX19tZXRob2RzID0gc2VsZi5zb2NraW8ucmVtb3RlY2FsbChzZWxmLm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX21ldGhvZHNfXyIsICgpLCB7fSkKKworZGVmIF9nZXRtZXRob2RzKG9iaiwgbWV0aG9kcyk6CisgICAgIyBIZWxwZXIgdG8gZ2V0IGEgbGlzdCBvZiBtZXRob2RzIGZyb20gYW4gb2JqZWN0CisgICAgIyBBZGRzIG5hbWVzIHRvIGRpY3Rpb25hcnkgYXJndW1lbnQgJ21ldGhvZHMnCisgICAgZm9yIG5hbWUgaW4gZGlyKG9iaik6CisgICAgICAgIGF0dHIgPSBnZXRhdHRyKG9iaiwgbmFtZSkKKyAgICAgICAgaWYgaGFzYXR0cihhdHRyLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgIG1ldGhvZHNbbmFtZV0gPSAxCisgICAgaWYgdHlwZShvYmopID09IHR5cGVzLkluc3RhbmNlVHlwZToKKyAgICAgICAgX2dldG1ldGhvZHMob2JqLl9fY2xhc3NfXywgbWV0aG9kcykKKyAgICBpZiB0eXBlKG9iaikgPT0gdHlwZXMuQ2xhc3NUeXBlOgorICAgICAgICBmb3Igc3VwZXIgaW4gb2JqLl9fYmFzZXNfXzoKKyAgICAgICAgICAgIF9nZXRtZXRob2RzKHN1cGVyLCBtZXRob2RzKQorCitkZWYgX2dldGF0dHJpYnV0ZXMob2JqLCBhdHRyaWJ1dGVzKToKKyAgICBmb3IgbmFtZSBpbiBkaXIob2JqKToKKyAgICAgICAgYXR0ciA9IGdldGF0dHIob2JqLCBuYW1lKQorICAgICAgICBpZiBub3QgaGFzYXR0cihhdHRyLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgIGF0dHJpYnV0ZXNbbmFtZV0gPSAxCisKK2NsYXNzIE1ldGhvZFByb3h5KG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc29ja2lvLCBvaWQsIG5hbWUpOgorICAgICAgICBzZWxmLnNvY2tpbyA9IHNvY2tpbworICAgICAgICBzZWxmLm9pZCA9IG9pZAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgdmFsdWUgPSBzZWxmLnNvY2tpby5yZW1vdGVjYWxsKHNlbGYub2lkLCBzZWxmLm5hbWUsIGFyZ3MsIGt3YXJncykKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKworIyBYWFggS0JLIDA5U2VwMDMgIFdlIG5lZWQgYSBwcm9wZXIgdW5pdCB0ZXN0IGZvciB0aGlzIG1vZHVsZS4gIFByZXZpb3VzbHkKKyMgICAgICAgICAgICAgICAgICBleGlzdGluZyB0ZXN0IGNvZGUgd2FzIHJlbW92ZWQgYXQgUmV2IDEuMjcgKHIzNDA5OCkuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnBjLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ycGMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjcwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnBjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnBjLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ycGMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNzc5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnBjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnVuLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3J1bi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2MwMDlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3J1bi5weQpAQCAtMCwwICsxLDM1NCBAQAoraW1wb3J0IHN5cworaW1wb3J0IGlvCitpbXBvcnQgbGluZWNhY2hlCitpbXBvcnQgdGltZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHRocmVhZAoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IFF1ZXVlCisKK2Zyb20gaWRsZWxpYiBpbXBvcnQgQ2FsbFRpcHMKK2Zyb20gaWRsZWxpYiBpbXBvcnQgQXV0b0NvbXBsZXRlCisKK2Zyb20gaWRsZWxpYiBpbXBvcnQgUmVtb3RlRGVidWdnZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgUmVtb3RlT2JqZWN0QnJvd3NlcgorZnJvbSBpZGxlbGliIGltcG9ydCBTdGFja1ZpZXdlcgorZnJvbSBpZGxlbGliIGltcG9ydCBycGMKK2Zyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbAorZnJvbSBpZGxlbGliIGltcG9ydCBJT0JpbmRpbmcKKworaW1wb3J0IF9fbWFpbl9fCisKK0xPQ0FMSE9TVCA9ICcxMjcuMC4wLjEnCisKK3RyeToKKyAgICBpbXBvcnQgd2FybmluZ3MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGRlZiBpZGxlX2Zvcm1hdHdhcm5pbmdfc3VicHJvYyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZT1Ob25lKToKKyAgICAgICAgIiIiRm9ybWF0IHdhcm5pbmdzIHRoZSBJRExFIHdheSIiIgorICAgICAgICBzID0gIlxuV2FybmluZyAoZnJvbSB3YXJuaW5ncyBtb2R1bGUpOlxuIgorICAgICAgICBzICs9ICcgIEZpbGUgXCIlc1wiLCBsaW5lICVzXG4nICUgKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIGlmIGxpbmUgaXMgTm9uZToKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICBzICs9ICIgICAgJXNcbiIgJSBsaW5lCisgICAgICAgIHMgKz0gIiVzOiAlc1xuIiAlIChjYXRlZ29yeS5fX25hbWVfXywgbWVzc2FnZSkKKyAgICAgICAgcmV0dXJuIHMKKyAgICB3YXJuaW5ncy5mb3JtYXR3YXJuaW5nID0gaWRsZV9mb3JtYXR3YXJuaW5nX3N1YnByb2MKKworIyBUaHJlYWQgc2hhcmVkIGdsb2JhbHM6IEVzdGFibGlzaCBhIHF1ZXVlIGJldHdlZW4gYSBzdWJ0aHJlYWQgKHdoaWNoIGhhbmRsZXMKKyMgdGhlIHNvY2tldCkgYW5kIHRoZSBtYWluIHRocmVhZCAod2hpY2ggcnVucyB1c2VyIGNvZGUpLCBwbHVzIGdsb2JhbAorIyBjb21wbGV0aW9uLCBleGl0IGFuZCBpbnRlcnJ1cHRhYmxlICh0aGUgbWFpbiB0aHJlYWQpIGZsYWdzOgorCitleGl0X25vdyA9IEZhbHNlCitxdWl0dGluZyA9IEZhbHNlCitpbnRlcnJ1cHRhYmxlID0gRmFsc2UKKworZGVmIG1haW4oZGVsX2V4aXRmdW5jPUZhbHNlKToKKyAgICAiIiJTdGFydCB0aGUgUHl0aG9uIGV4ZWN1dGlvbiBzZXJ2ZXIgaW4gYSBzdWJwcm9jZXNzCisKKyAgICBJbiB0aGUgUHl0aG9uIHN1YnByb2Nlc3MsIFJQQ1NlcnZlciBpcyBpbnN0YW50aWF0ZWQgd2l0aCBoYW5kbGVyY2xhc3MKKyAgICBNeUhhbmRsZXIsIHdoaWNoIGluaGVyaXRzIHJlZ2lzdGVyL3VucmVnaXN0ZXIgbWV0aG9kcyBmcm9tIFJQQ0hhbmRsZXIgdmlhCisgICAgdGhlIG1peC1pbiBjbGFzcyBTb2NrZXRJTy4KKworICAgIFdoZW4gdGhlIFJQQ1NlcnZlciAnc2VydmVyJyBpcyBpbnN0YW50aWF0ZWQsIHRoZSBUQ1BTZXJ2ZXIgaW5pdGlhbGl6YXRpb24KKyAgICBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHJ1bi5NeUhhbmRsZXIgYW5kIGNhbGxzIGl0cyBoYW5kbGUoKSBtZXRob2QuCisgICAgaGFuZGxlKCkgaW5zdGFudGlhdGVzIGEgcnVuLkV4ZWN1dGl2ZSBvYmplY3QsIHBhc3NpbmcgaXQgYSByZWZlcmVuY2UgdG8gdGhlCisgICAgTXlIYW5kbGVyIG9iamVjdC4gIFRoYXQgcmVmZXJlbmNlIGlzIHNhdmVkIGFzIGF0dHJpYnV0ZSBycGNoYW5kbGVyIG9mIHRoZQorICAgIEV4ZWN1dGl2ZSBpbnN0YW5jZS4gIFRoZSBFeGVjdXRpdmUgbWV0aG9kcyBoYXZlIGFjY2VzcyB0byB0aGUgcmVmZXJlbmNlIGFuZAorICAgIGNhbiBwYXNzIGl0IG9uIHRvIGVudGl0aWVzIHRoYXQgdGhleSBjb21tYW5kCisgICAgKGUuZy4gUmVtb3RlRGVidWdnZXIuRGVidWdnZXIuc3RhcnRfZGVidWdnZXIoKSkuICBUaGUgbGF0dGVyLCBpbiB0dXJuLCBjYW4KKyAgICBjYWxsIE15SGFuZGxlcihTb2NrZXRJTykgcmVnaXN0ZXIvdW5yZWdpc3RlciBtZXRob2RzIHZpYSB0aGUgcmVmZXJlbmNlIHRvCisgICAgcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgdGhlbXNlbHZlcy4KKworICAgICIiIgorICAgIGdsb2JhbCBleGl0X25vdworICAgIGdsb2JhbCBxdWl0dGluZworICAgIGdsb2JhbCBub19leGl0ZnVuYworICAgIG5vX2V4aXRmdW5jID0gZGVsX2V4aXRmdW5jCisgICAgI3RpbWUuc2xlZXAoMTUpICMgdGVzdCBzdWJwcm9jZXNzIG5vdCByZXNwb25kaW5nCisgICAgdHJ5OgorICAgICAgICBhc3NlcnQobGVuKHN5cy5hcmd2KSA+IDEpCisgICAgICAgIHBvcnQgPSBpbnQoc3lzLmFyZ3ZbLTFdKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcHJpbnQ+PnN5cy5zdGRlcnIsICJJRExFIFN1YnByb2Nlc3M6IG5vIElQIHBvcnQgcGFzc2VkIGluIHN5cy5hcmd2LiIKKyAgICAgICAgcmV0dXJuCisgICAgc3lzLmFyZ3ZbOl0gPSBbIiJdCisgICAgc29ja3RocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PW1hbmFnZV9zb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0nU29ja1RocmVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oKExPQ0FMSE9TVCwgcG9ydCksKSkKKyAgICBzb2NrdGhyZWFkLnNldERhZW1vbihUcnVlKQorICAgIHNvY2t0aHJlYWQuc3RhcnQoKQorICAgIHdoaWxlIDE6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGV4aXRfbm93OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgpCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgICAgICAjIGV4aXRpbmcgYnV0IGdvdCBhbiBleHRyYSBLQkk/IFRyeSBhZ2FpbiEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZXEsIHJlcXVlc3QgPSBycGMucmVxdWVzdF9xdWV1ZS5nZXQoYmxvY2s9VHJ1ZSwgdGltZW91dD0wLjA1KQorICAgICAgICAgICAgZXhjZXB0IFF1ZXVlLkVtcHR5OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBtZXRob2QsIGFyZ3MsIGt3YXJncyA9IHJlcXVlc3QKKyAgICAgICAgICAgIHJldCA9IG1ldGhvZCgqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICBycGMucmVzcG9uc2VfcXVldWUucHV0KChzZXEsIHJldCkpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIGlmIHF1aXR0aW5nOgorICAgICAgICAgICAgICAgIGV4aXRfbm93ID0gVHJ1ZQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQ6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICB0eXBlLCB2YWx1ZSwgdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHByaW50X2V4Y2VwdGlvbigpCisgICAgICAgICAgICAgICAgcnBjLnJlc3BvbnNlX3F1ZXVlLnB1dCgoc2VxLCBOb25lKSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIExpbmsgZGlkbid0IHdvcmssIHByaW50IHNhbWUgZXhjZXB0aW9uIHRvIF9fc3RkZXJyX18KKyAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjZXB0aW9uKHR5cGUsIHZhbHVlLCB0YiwgZmlsZT1zeXMuX19zdGRlcnJfXykKKyAgICAgICAgICAgICAgICBleGl0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29udGludWUKKworZGVmIG1hbmFnZV9zb2NrZXQoYWRkcmVzcyk6CisgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgIHRpbWUuc2xlZXAoaSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VydmVyID0gTXlSUENTZXJ2ZXIoYWRkcmVzcywgTXlIYW5kbGVyKQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgorICAgICAgICAgICAgcHJpbnQ+PnN5cy5fX3N0ZGVycl9fLCJJRExFIFN1YnByb2Nlc3M6IHNvY2tldCBlcnJvcjogIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVyci5hcmdzWzFdICsgIiwgcmV0cnlpbmcuLi4uIgorICAgIGVsc2U6CisgICAgICAgIHByaW50Pj5zeXMuX19zdGRlcnJfXywgIklETEUgU3VicHJvY2VzczogQ29ubmVjdGlvbiB0byAiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJRExFIEdVSSBmYWlsZWQsIGV4aXRpbmcuIgorICAgICAgICBzaG93X3NvY2tldF9lcnJvcihlcnIsIGFkZHJlc3MpCisgICAgICAgIGdsb2JhbCBleGl0X25vdworICAgICAgICBleGl0X25vdyA9IFRydWUKKyAgICAgICAgcmV0dXJuCisgICAgc2VydmVyLmhhbmRsZV9yZXF1ZXN0KCkgIyBBIHNpbmdsZSByZXF1ZXN0IG9ubHkKKworZGVmIHNob3dfc29ja2V0X2Vycm9yKGVyciwgYWRkcmVzcyk6CisgICAgaW1wb3J0IFRraW50ZXIKKyAgICBpbXBvcnQgdGtNZXNzYWdlQm94CisgICAgcm9vdCA9IFRraW50ZXIuVGsoKQorICAgIHJvb3Qud2l0aGRyYXcoKQorICAgIGlmIGVyci5hcmdzWzBdID09IDYxOiAjIGNvbm5lY3Rpb24gcmVmdXNlZAorICAgICAgICBtc2cgPSAiSURMRSdzIHN1YnByb2Nlc3MgY2FuJ3QgY29ubmVjdCB0byAlczolZC4gIFRoaXMgbWF5IGJlIGR1ZSAiXAorICAgICAgICAgICAgICAidG8geW91ciBwZXJzb25hbCBmaXJld2FsbCBjb25maWd1cmF0aW9uLiAgSXQgaXMgc2FmZSB0byAiXAorICAgICAgICAgICAgICAiYWxsb3cgdGhpcyBpbnRlcm5hbCBjb25uZWN0aW9uIGJlY2F1c2Ugbm8gZGF0YSBpcyB2aXNpYmxlIG9uICJcCisgICAgICAgICAgICAgICJleHRlcm5hbCBwb3J0cy4iICUgYWRkcmVzcworICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJJRExFIFN1YnByb2Nlc3MgRXJyb3IiLCBtc2csIHBhcmVudD1yb290KQorICAgIGVsc2U6CisgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIklETEUgU3VicHJvY2VzcyBFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvY2tldCBFcnJvcjogJXMiICUgZXJyLmFyZ3NbMV0pCisgICAgcm9vdC5kZXN0cm95KCkKKworZGVmIHByaW50X2V4Y2VwdGlvbigpOgorICAgIGltcG9ydCBsaW5lY2FjaGUKKyAgICBsaW5lY2FjaGUuY2hlY2tjYWNoZSgpCisgICAgZmx1c2hfc3Rkb3V0KCkKKyAgICBlZmlsZSA9IHN5cy5zdGRlcnIKKyAgICB0eXAsIHZhbCwgdGIgPSBleGNpbmZvID0gc3lzLmV4Y19pbmZvKCkKKyAgICBzeXMubGFzdF90eXBlLCBzeXMubGFzdF92YWx1ZSwgc3lzLmxhc3RfdHJhY2ViYWNrID0gZXhjaW5mbworICAgIHRiZSA9IHRyYWNlYmFjay5leHRyYWN0X3RiKHRiKQorICAgIHByaW50Pj5lZmlsZSwgJ1xuVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOicKKyAgICBleGNsdWRlID0gKCJydW4ucHkiLCAicnBjLnB5IiwgInRocmVhZGluZy5weSIsICJRdWV1ZS5weSIsCisgICAgICAgICAgICAgICAiUmVtb3RlRGVidWdnZXIucHkiLCAiYmRiLnB5IikKKyAgICBjbGVhbnVwX3RyYWNlYmFjayh0YmUsIGV4Y2x1ZGUpCisgICAgdHJhY2ViYWNrLnByaW50X2xpc3QodGJlLCBmaWxlPWVmaWxlKQorICAgIGxpbmVzID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seSh0eXAsIHZhbCkKKyAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgcHJpbnQ+PmVmaWxlLCBsaW5lLAorCitkZWYgY2xlYW51cF90cmFjZWJhY2sodGIsIGV4Y2x1ZGUpOgorICAgICJSZW1vdmUgZXhjbHVkZWQgdHJhY2VzIGZyb20gYmVnaW5uaW5nL2VuZCBvZiB0YjsgZ2V0IGNhY2hlZCBsaW5lcyIKKyAgICBvcmlnX3RiID0gdGJbOl0KKyAgICB3aGlsZSB0YjoKKyAgICAgICAgZm9yIHJwY2ZpbGUgaW4gZXhjbHVkZToKKyAgICAgICAgICAgIGlmIHRiWzBdWzBdLmNvdW50KHJwY2ZpbGUpOgorICAgICAgICAgICAgICAgIGJyZWFrICAgICMgZm91bmQgYW4gZXhjbHVkZSwgYnJlYWsgZm9yOiBhbmQgZGVsZXRlIHRiWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBicmVhayAgICAgICAgIyBubyBleGNsdWRlcywgaGF2ZSBsZWZ0IFJQQyBjb2RlLCBicmVhayB3aGlsZToKKyAgICAgICAgZGVsIHRiWzBdCisgICAgd2hpbGUgdGI6CisgICAgICAgIGZvciBycGNmaWxlIGluIGV4Y2x1ZGU6CisgICAgICAgICAgICBpZiB0YlstMV1bMF0uY291bnQocnBjZmlsZSk6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGRlbCB0YlstMV0KKyAgICBpZiBsZW4odGIpID09IDA6CisgICAgICAgICMgZXhjZXB0aW9uIHdhcyBpbiBJRExFIGludGVybmFscywgZG9uJ3QgcHJ1bmUhCisgICAgICAgIHRiWzpdID0gb3JpZ190Yls6XQorICAgICAgICBwcmludD4+c3lzLnN0ZGVyciwgIioqIElETEUgSW50ZXJuYWwgRXhjZXB0aW9uOiAiCisgICAgcnBjaGFuZGxlciA9IHJwYy5vYmplY3R0YWJsZVsnZXhlYyddLnJwY2hhbmRsZXIKKyAgICBmb3IgaSBpbiByYW5nZShsZW4odGIpKToKKyAgICAgICAgZm4sIGxuLCBubSwgbGluZSA9IHRiW2ldCisgICAgICAgIGlmIG5tID09ICc/JzoKKyAgICAgICAgICAgIG5tID0gIi10b3BsZXZlbC0iCisgICAgICAgIGlmIG5vdCBsaW5lIGFuZCBmbi5zdGFydHN3aXRoKCI8cHlzaGVsbCMiKToKKyAgICAgICAgICAgIGxpbmUgPSBycGNoYW5kbGVyLnJlbW90ZWNhbGwoJ2xpbmVjYWNoZScsICdnZXRsaW5lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm4sIGxuKSwge30pCisgICAgICAgIHRiW2ldID0gZm4sIGxuLCBubSwgbGluZQorCitkZWYgZmx1c2hfc3Rkb3V0KCk6CisgICAgdHJ5OgorICAgICAgICBpZiBzeXMuc3Rkb3V0LnNvZnRzcGFjZToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQuc29mdHNwYWNlID0gMAorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQorICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIEVPRkVycm9yKToKKyAgICAgICAgcGFzcworCitkZWYgZXhpdCgpOgorICAgICIiIkV4aXQgc3VicHJvY2VzcywgcG9zc2libHkgYWZ0ZXIgZmlyc3QgZGVsZXRpbmcgc3lzLmV4aXRmdW5jCisKKyAgICBJZiBjb25maWctbWFpbi5jZmcvLmRlZiAnR2VuZXJhbCcgJ2RlbGV0ZS1leGl0ZnVuYycgaXMgVHJ1ZSwgdGhlbiBhbnkKKyAgICBzeXMuZXhpdGZ1bmMgd2lsbCBiZSByZW1vdmVkIGJlZm9yZSBleGl0aW5nLiAgKFZQeXRob24gc3VwcG9ydCkKKworICAgICIiIgorICAgIGlmIG5vX2V4aXRmdW5jOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc3lzLmV4aXRmdW5jCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICBzeXMuZXhpdCgwKQorCitjbGFzcyBNeVJQQ1NlcnZlcihycGMuUlBDU2VydmVyKToKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgorICAgICAgICAiIiJPdmVycmlkZSBSUENTZXJ2ZXIgbWV0aG9kIGZvciBJRExFCisKKyAgICAgICAgSW50ZXJydXB0IHRoZSBNYWluVGhyZWFkIGFuZCBleGl0IHNlcnZlciBpZiBsaW5rIGlzIGRyb3BwZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGdsb2JhbCBxdWl0dGluZworICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgIGdsb2JhbCBleGl0X25vdworICAgICAgICAgICAgZXhpdF9ub3cgPSBUcnVlCisgICAgICAgICAgICB0aHJlYWQuaW50ZXJydXB0X21haW4oKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBlcmYgPSBzeXMuX19zdGRlcnJfXworICAgICAgICAgICAgcHJpbnQ+PmVyZiwgJ1xuJyArICctJyo0MAorICAgICAgICAgICAgcHJpbnQ+PmVyZiwgJ1VuaGFuZGxlZCBzZXJ2ZXIgZXhjZXB0aW9uIScKKyAgICAgICAgICAgIHByaW50Pj5lcmYsICdUaHJlYWQ6ICVzJyAlIHRocmVhZGluZy5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpCisgICAgICAgICAgICBwcmludD4+ZXJmLCAnQ2xpZW50IEFkZHJlc3M6ICcsIGNsaWVudF9hZGRyZXNzCisgICAgICAgICAgICBwcmludD4+ZXJmLCAnUmVxdWVzdDogJywgcmVwcihyZXF1ZXN0KQorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhmaWxlPWVyZikKKyAgICAgICAgICAgIHByaW50Pj5lcmYsICdcbioqKiBVbnJlY292ZXJhYmxlLCBzZXJ2ZXIgZXhpdGluZyEnCisgICAgICAgICAgICBwcmludD4+ZXJmLCAnLScqNDAKKyAgICAgICAgICAgIHF1aXR0aW5nID0gVHJ1ZQorICAgICAgICAgICAgdGhyZWFkLmludGVycnVwdF9tYWluKCkKKworY2xhc3MgTXlIYW5kbGVyKHJwYy5SUENIYW5kbGVyKToKKworICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgICIiIk92ZXJyaWRlIGJhc2UgbWV0aG9kIiIiCisgICAgICAgIGV4ZWN1dGl2ZSA9IEV4ZWN1dGl2ZShzZWxmKQorICAgICAgICBzZWxmLnJlZ2lzdGVyKCJleGVjIiwgZXhlY3V0aXZlKQorICAgICAgICBzZWxmLmNvbnNvbGUgPSBzZWxmLmdldF9yZW1vdGVfcHJveHkoImNvbnNvbGUiKQorICAgICAgICBzeXMuc3RkaW4gPSBQeVNoZWxsLlBzZXVkb0lucHV0RmlsZShzZWxmLmNvbnNvbGUsICJzdGRpbiIsCisgICAgICAgICAgICAgICAgSU9CaW5kaW5nLmVuY29kaW5nKQorICAgICAgICBzeXMuc3Rkb3V0ID0gUHlTaGVsbC5Qc2V1ZG9PdXRwdXRGaWxlKHNlbGYuY29uc29sZSwgInN0ZG91dCIsCisgICAgICAgICAgICAgICAgSU9CaW5kaW5nLmVuY29kaW5nKQorICAgICAgICBzeXMuc3RkZXJyID0gUHlTaGVsbC5Qc2V1ZG9PdXRwdXRGaWxlKHNlbGYuY29uc29sZSwgInN0ZGVyciIsCisgICAgICAgICAgICAgICAgSU9CaW5kaW5nLmVuY29kaW5nKQorCisgICAgICAgICMgS2VlcCBhIHJlZmVyZW5jZSB0byBzdGRpbiBzbyB0aGF0IGl0IHdvbid0IHRyeSB0byBleGl0IElETEUgaWYKKyAgICAgICAgIyBzeXMuc3RkaW4gZ2V0cyBjaGFuZ2VkIGZyb20gd2l0aGluIElETEUncyBzaGVsbC4gU2VlIGlzc3VlMTc4MzguCisgICAgICAgIHNlbGYuX2tlZXBfc3RkaW4gPSBzeXMuc3RkaW4KKworICAgICAgICBzZWxmLmludGVycCA9IHNlbGYuZ2V0X3JlbW90ZV9wcm94eSgiaW50ZXJwIikKKyAgICAgICAgcnBjLlJQQ0hhbmRsZXIuZ2V0cmVzcG9uc2Uoc2VsZiwgbXlzZXE9Tm9uZSwgd2FpdD0wLjA1KQorCisgICAgZGVmIGV4aXRob29rKHNlbGYpOgorICAgICAgICAib3ZlcnJpZGUgU29ja2V0SU8gbWV0aG9kIC0gd2FpdCBmb3IgTWFpblRocmVhZCB0byBzaHV0IHVzIGRvd24iCisgICAgICAgIHRpbWUuc2xlZXAoMTApCisKKyAgICBkZWYgRU9GaG9vayhzZWxmKToKKyAgICAgICAgIk92ZXJyaWRlIFNvY2tldElPIG1ldGhvZCAtIHRlcm1pbmF0ZSB3YWl0IG9uIGNhbGxiYWNrIGFuZCBleGl0IHRocmVhZCIKKyAgICAgICAgZ2xvYmFsIHF1aXR0aW5nCisgICAgICAgIHF1aXR0aW5nID0gVHJ1ZQorICAgICAgICB0aHJlYWQuaW50ZXJydXB0X21haW4oKQorCisgICAgZGVmIGRlY29kZV9pbnRlcnJ1cHRob29rKHNlbGYpOgorICAgICAgICAiaW50ZXJydXB0IGF3YWtlbmVkIHRocmVhZCIKKyAgICAgICAgZ2xvYmFsIHF1aXR0aW5nCisgICAgICAgIHF1aXR0aW5nID0gVHJ1ZQorICAgICAgICB0aHJlYWQuaW50ZXJydXB0X21haW4oKQorCisKK2NsYXNzIEV4ZWN1dGl2ZShvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJwY2hhbmRsZXIpOgorICAgICAgICBzZWxmLnJwY2hhbmRsZXIgPSBycGNoYW5kbGVyCisgICAgICAgIHNlbGYubG9jYWxzID0gX19tYWluX18uX19kaWN0X18KKyAgICAgICAgc2VsZi5jYWxsdGlwID0gQ2FsbFRpcHMuQ2FsbFRpcHMoKQorICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZSA9IEF1dG9Db21wbGV0ZS5BdXRvQ29tcGxldGUoKQorCisgICAgZGVmIHJ1bmNvZGUoc2VsZiwgY29kZSk6CisgICAgICAgIGdsb2JhbCBpbnRlcnJ1cHRhYmxlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudXNyX2V4Y19pbmZvID0gTm9uZQorICAgICAgICAgICAgaW50ZXJydXB0YWJsZSA9IFRydWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBleGVjIGNvZGUgaW4gc2VsZi5sb2NhbHMKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaW50ZXJydXB0YWJsZSA9IEZhbHNlCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgIyBTY3JpcHRzIHRoYXQgcmFpc2UgU3lzdGVtRXhpdCBzaG91bGQganVzdAorICAgICAgICAgICAgIyByZXR1cm4gdG8gdGhlIGludGVyYWN0aXZlIHByb21wdAorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLnVzcl9leGNfaW5mbyA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBpZiBxdWl0dGluZzoKKyAgICAgICAgICAgICAgICBleGl0KCkKKyAgICAgICAgICAgIHByaW50X2V4Y2VwdGlvbigpCisgICAgICAgICAgICBqaXQgPSBzZWxmLnJwY2hhbmRsZXIuY29uc29sZS5nZXR2YXIoIjw8dG9nZ2xlLWppdC1zdGFjay12aWV3ZXI+PiIpCisgICAgICAgICAgICBpZiBqaXQ6CisgICAgICAgICAgICAgICAgc2VsZi5ycGNoYW5kbGVyLmludGVycC5vcGVuX3JlbW90ZV9zdGFja192aWV3ZXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmx1c2hfc3Rkb3V0KCkKKworICAgIGRlZiBpbnRlcnJ1cHRfdGhlX3NlcnZlcihzZWxmKToKKyAgICAgICAgaWYgaW50ZXJydXB0YWJsZToKKyAgICAgICAgICAgIHRocmVhZC5pbnRlcnJ1cHRfbWFpbigpCisKKyAgICBkZWYgc3RhcnRfdGhlX2RlYnVnZ2VyKHNlbGYsIGd1aV9hZGFwX29pZCk6CisgICAgICAgIHJldHVybiBSZW1vdGVEZWJ1Z2dlci5zdGFydF9kZWJ1Z2dlcihzZWxmLnJwY2hhbmRsZXIsIGd1aV9hZGFwX29pZCkKKworICAgIGRlZiBzdG9wX3RoZV9kZWJ1Z2dlcihzZWxmLCBpZGJfYWRhcF9vaWQpOgorICAgICAgICAiVW5yZWdpc3RlciB0aGUgSWRiIEFkYXB0ZXIuICBMaW5rIG9iamVjdHMgYW5kIElkYiB0aGVuIHN1YmplY3QgdG8gR0MiCisgICAgICAgIHNlbGYucnBjaGFuZGxlci51bnJlZ2lzdGVyKGlkYl9hZGFwX29pZCkKKworICAgIGRlZiBnZXRfdGhlX2NhbGx0aXAoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLmNhbGx0aXAuZmV0Y2hfdGlwKG5hbWUpCisKKyAgICBkZWYgZ2V0X3RoZV9jb21wbGV0aW9uX2xpc3Qoc2VsZiwgd2hhdCwgbW9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmF1dG9jb21wbGV0ZS5mZXRjaF9jb21wbGV0aW9ucyh3aGF0LCBtb2RlKQorCisgICAgZGVmIHN0YWNrdmlld2VyKHNlbGYsIGZsaXN0X29pZD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi51c3JfZXhjX2luZm86CisgICAgICAgICAgICB0eXAsIHZhbCwgdGIgPSBzZWxmLnVzcl9leGNfaW5mbworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZmxpc3QgPSBOb25lCisgICAgICAgIGlmIGZsaXN0X29pZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZsaXN0ID0gc2VsZi5ycGNoYW5kbGVyLmdldF9yZW1vdGVfcHJveHkoZmxpc3Rfb2lkKQorICAgICAgICB3aGlsZSB0YiBhbmQgdGIudGJfZnJhbWUuZl9nbG9iYWxzWyJfX25hbWVfXyJdIGluIFsicnBjIiwgInJ1biJdOgorICAgICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CisgICAgICAgIHN5cy5sYXN0X3R5cGUgPSB0eXAKKyAgICAgICAgc3lzLmxhc3RfdmFsdWUgPSB2YWwKKyAgICAgICAgaXRlbSA9IFN0YWNrVmlld2VyLlN0YWNrVHJlZUl0ZW0oZmxpc3QsIHRiKQorICAgICAgICByZXR1cm4gUmVtb3RlT2JqZWN0QnJvd3Nlci5yZW1vdGVfb2JqZWN0X3RyZWVfaXRlbShpdGVtKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL3J1bi5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnVuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjNhMzU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3J1bi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL3J1bi5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnVuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTQ4YmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3J1bi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RhYmJlZHBhZ2VzLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RhYmJlZHBhZ2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNzExM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGFiYmVkcGFnZXMucHkKQEAgLTAsMCArMSw0OTAgQEAKKyIiIkFuIGltcGxlbWVudGF0aW9uIG9mIHRhYmJlZCBwYWdlcyB1c2luZyBvbmx5IHN0YW5kYXJkIFRraW50ZXIuCisKK09yaWdpbmFsbHkgZGV2ZWxvcGVkIGZvciB1c2UgaW4gSURMRS4gQmFzZWQgb24gdGFicGFnZS5weS4KKworQ2xhc3NlcyBleHBvcnRlZDoKK1RhYmJlZFBhZ2VTZXQgLS0gQSBUa2ludGVyIGltcGxlbWVudGF0aW9uIG9mIGEgdGFiYmVkLXBhZ2Ugd2lkZ2V0LgorVGFiU2V0IC0tIEEgd2lkZ2V0IGNvbnRhaW5pbmcgdGFicyAoYnV0dG9ucykgaW4gb25lIG9yIG1vcmUgcm93cy4KKworIiIiCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKKworY2xhc3MgSW52YWxpZE5hbWVFcnJvcihFeGNlcHRpb24pOiBwYXNzCitjbGFzcyBBbHJlYWR5RXhpc3RzRXJyb3IoRXhjZXB0aW9uKTogcGFzcworCisKK2NsYXNzIFRhYlNldChGcmFtZSk6CisgICAgIiIiQSB3aWRnZXQgY29udGFpbmluZyB0YWJzIChidXR0b25zKSBpbiBvbmUgb3IgbW9yZSByb3dzLgorCisgICAgT25seSBvbmUgdGFiIG1heSBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFnZV9zZXQsIHNlbGVjdF9jb21tYW5kLAorICAgICAgICAgICAgICAgICB0YWJzPU5vbmUsIG5fcm93cz0xLCBtYXhfdGFic19wZXJfcm93PTUsCisgICAgICAgICAgICAgICAgIGV4cGFuZF90YWJzPUZhbHNlLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IgYXJndW1lbnRzOgorCisgICAgICAgIHNlbGVjdF9jb21tYW5kIC0tIEEgY2FsbGFibGUgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiBhIHRhYiBpcworICAgICAgICBzZWxlY3RlZC4gSXQgaXMgY2FsbGVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIHNlbGVjdGVkIHRhYiBhcyBhbgorICAgICAgICBhcmd1bWVudC4KKworICAgICAgICB0YWJzIC0tIEEgbGlzdCBvZiBzdHJpbmdzLCB0aGUgbmFtZXMgb2YgdGhlIHRhYnMuIFNob3VsZCBiZSBzcGVjaWZpZWQgaW4KKyAgICAgICAgdGhlIGRlc2lyZWQgdGFiIG9yZGVyLiBUaGUgZmlyc3QgdGFiIHdpbGwgYmUgdGhlIGRlZmF1bHQgYW5kIGZpcnN0CisgICAgICAgIGFjdGl2ZSB0YWIuIElmIHRhYnMgaXMgTm9uZSBvciBlbXB0eSwgdGhlIFRhYlNldCB3aWxsIGJlIGluaXRpYWxpemVkCisgICAgICAgIGVtcHR5LgorCisgICAgICAgIG5fcm93cyAtLSBOdW1iZXIgb2Ygcm93cyBvZiB0YWJzIHRvIGJlIHNob3duLiBJZiBuX3Jvd3MgPD0gMCBvciBpcworICAgICAgICBOb25lLCB0aGVuIHRoZSBudW1iZXIgb2Ygcm93cyB3aWxsIGJlIGRlY2lkZWQgYnkgVGFiU2V0LiBTZWUKKyAgICAgICAgX2FycmFuZ2VfdGFicygpIGZvciBkZXRhaWxzLgorCisgICAgICAgIG1heF90YWJzX3Blcl9yb3cgLS0gVXNlZCBmb3IgZGVjaWRpbmcgaG93IG1hbnkgcm93cyBvZiB0YWJzIGFyZSBuZWVkZWQsCisgICAgICAgIHdoZW4gdGhlIG51bWJlciBvZiByb3dzIGlzIG5vdCBjb25zdGFudC4gU2VlIF9hcnJhbmdlX3RhYnMoKSBmb3IKKyAgICAgICAgZGV0YWlscy4KKworICAgICAgICAiIiIKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgcGFnZV9zZXQsICoqa3cpCisgICAgICAgIHNlbGYuc2VsZWN0X2NvbW1hbmQgPSBzZWxlY3RfY29tbWFuZAorICAgICAgICBzZWxmLm5fcm93cyA9IG5fcm93cworICAgICAgICBzZWxmLm1heF90YWJzX3Blcl9yb3cgPSBtYXhfdGFic19wZXJfcm93CisgICAgICAgIHNlbGYuZXhwYW5kX3RhYnMgPSBleHBhbmRfdGFicworICAgICAgICBzZWxmLnBhZ2Vfc2V0ID0gcGFnZV9zZXQKKworICAgICAgICBzZWxmLl90YWJzID0ge30KKyAgICAgICAgc2VsZi5fdGFiMnJvdyA9IHt9CisgICAgICAgIGlmIHRhYnM6CisgICAgICAgICAgICBzZWxmLl90YWJfbmFtZXMgPSBsaXN0KHRhYnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl90YWJfbmFtZXMgPSBbXQorICAgICAgICBzZWxmLl9zZWxlY3RlZF90YWIgPSBOb25lCisgICAgICAgIHNlbGYuX3RhYl9yb3dzID0gW10KKworICAgICAgICBzZWxmLnBhZGRpbmdfZnJhbWUgPSBGcmFtZShzZWxmLCBoZWlnaHQ9MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGg9MCwgcmVsaWVmPUZMQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9c2VsZi5jZ2V0KCdiYWNrZ3JvdW5kJykpCisgICAgICAgIHNlbGYucGFkZGluZ19mcmFtZS5wYWNrKHNpZGU9VE9QLCBmaWxsPVgsIGV4cGFuZD1GYWxzZSkKKworICAgICAgICBzZWxmLl9hcnJhbmdlX3RhYnMoKQorCisgICAgZGVmIGFkZF90YWIoc2VsZiwgdGFiX25hbWUpOgorICAgICAgICAiIiJBZGQgYSBuZXcgdGFiIHdpdGggdGhlIG5hbWUgZ2l2ZW4gaW4gdGFiX25hbWUuIiIiCisgICAgICAgIGlmIG5vdCB0YWJfbmFtZToKKyAgICAgICAgICAgIHJhaXNlIEludmFsaWROYW1lRXJyb3IoIkludmFsaWQgVGFiIG5hbWU6ICclcyciICUgdGFiX25hbWUpCisgICAgICAgIGlmIHRhYl9uYW1lIGluIHNlbGYuX3RhYl9uYW1lczoKKyAgICAgICAgICAgIHJhaXNlIEFscmVhZHlFeGlzdHNFcnJvcigiVGFiIG5hbWVkICclcycgYWxyZWFkeSBleGlzdHMiICV0YWJfbmFtZSkKKworICAgICAgICBzZWxmLl90YWJfbmFtZXMuYXBwZW5kKHRhYl9uYW1lKQorICAgICAgICBzZWxmLl9hcnJhbmdlX3RhYnMoKQorCisgICAgZGVmIHJlbW92ZV90YWIoc2VsZiwgdGFiX25hbWUpOgorICAgICAgICAiIiJSZW1vdmUgdGhlIHRhYiBuYW1lZCA8dGFiX25hbWU+IiIiCisgICAgICAgIGlmIG5vdCB0YWJfbmFtZSBpbiBzZWxmLl90YWJfbmFtZXM6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiTm8gc3VjaCBUYWI6ICclcyIgJSBwYWdlX25hbWUpCisKKyAgICAgICAgc2VsZi5fdGFiX25hbWVzLnJlbW92ZSh0YWJfbmFtZSkKKyAgICAgICAgc2VsZi5fYXJyYW5nZV90YWJzKCkKKworICAgIGRlZiBzZXRfc2VsZWN0ZWRfdGFiKHNlbGYsIHRhYl9uYW1lKToKKyAgICAgICAgIiIiU2hvdyB0aGUgdGFiIG5hbWVkIDx0YWJfbmFtZT4gYXMgdGhlIHNlbGVjdGVkIG9uZSIiIgorICAgICAgICBpZiB0YWJfbmFtZSA9PSBzZWxmLl9zZWxlY3RlZF90YWI6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgdGFiX25hbWUgaXMgbm90IE5vbmUgYW5kIHRhYl9uYW1lIG5vdCBpbiBzZWxmLl90YWJzOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoIk5vIHN1Y2ggVGFiOiAnJXMiICUgcGFnZV9uYW1lKQorCisgICAgICAgICMgZGVzZWxlY3QgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgdGFiCisgICAgICAgIGlmIHNlbGYuX3NlbGVjdGVkX3RhYiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3RhYnNbc2VsZi5fc2VsZWN0ZWRfdGFiXS5zZXRfbm9ybWFsKCkKKyAgICAgICAgc2VsZi5fc2VsZWN0ZWRfdGFiID0gTm9uZQorCisgICAgICAgIGlmIHRhYl9uYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBhY3RpdmF0ZSB0aGUgdGFiIG5hbWVkIHRhYl9uYW1lCisgICAgICAgICAgICBzZWxmLl9zZWxlY3RlZF90YWIgPSB0YWJfbmFtZQorICAgICAgICAgICAgdGFiID0gc2VsZi5fdGFic1t0YWJfbmFtZV0KKyAgICAgICAgICAgIHRhYi5zZXRfc2VsZWN0ZWQoKQorICAgICAgICAgICAgIyBtb3ZlIHRoZSB0YWIgcm93IHdpdGggdGhlIHNlbGVjdGVkIHRhYiB0byB0aGUgYm90dG9tCisgICAgICAgICAgICB0YWJfcm93ID0gc2VsZi5fdGFiMnJvd1t0YWJdCisgICAgICAgICAgICB0YWJfcm93LnBhY2tfZm9yZ2V0KCkKKyAgICAgICAgICAgIHRhYl9yb3cucGFjayhzaWRlPVRPUCwgZmlsbD1YLCBleHBhbmQ9MCkKKworICAgIGRlZiBfYWRkX3RhYl9yb3coc2VsZiwgdGFiX25hbWVzLCBleHBhbmRfdGFicyk6CisgICAgICAgIGlmIG5vdCB0YWJfbmFtZXM6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0YWJfcm93ID0gRnJhbWUoc2VsZikKKyAgICAgICAgdGFiX3Jvdy5wYWNrKHNpZGU9VE9QLCBmaWxsPVgsIGV4cGFuZD0wKQorICAgICAgICBzZWxmLl90YWJfcm93cy5hcHBlbmQodGFiX3JvdykKKworICAgICAgICBmb3IgdGFiX25hbWUgaW4gdGFiX25hbWVzOgorICAgICAgICAgICAgdGFiID0gVGFiU2V0LlRhYkJ1dHRvbih0YWJfbmFtZSwgc2VsZi5zZWxlY3RfY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiX3Jvdywgc2VsZikKKyAgICAgICAgICAgIGlmIGV4cGFuZF90YWJzOgorICAgICAgICAgICAgICAgIHRhYi5wYWNrKHNpZGU9TEVGVCwgZmlsbD1YLCBleHBhbmQ9VHJ1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGFiLnBhY2soc2lkZT1MRUZUKQorICAgICAgICAgICAgc2VsZi5fdGFic1t0YWJfbmFtZV0gPSB0YWIKKyAgICAgICAgICAgIHNlbGYuX3RhYjJyb3dbdGFiXSA9IHRhYl9yb3cKKworICAgICAgICAjIHRhYiBpcyB0aGUgbGFzdCBvbmUgY3JlYXRlZCBpbiB0aGUgYWJvdmUgbG9vcAorICAgICAgICB0YWIuaXNfbGFzdF9pbl9yb3cgPSBUcnVlCisKKyAgICBkZWYgX3Jlc2V0X3RhYl9yb3dzKHNlbGYpOgorICAgICAgICB3aGlsZSBzZWxmLl90YWJfcm93czoKKyAgICAgICAgICAgIHRhYl9yb3cgPSBzZWxmLl90YWJfcm93cy5wb3AoKQorICAgICAgICAgICAgdGFiX3Jvdy5kZXN0cm95KCkKKyAgICAgICAgc2VsZi5fdGFiMnJvdyA9IHt9CisKKyAgICBkZWYgX2FycmFuZ2VfdGFicyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEFycmFuZ2UgdGhlIHRhYnMgaW4gcm93cywgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZC4KKworICAgICAgICBJZiBuX3Jvd3MgPj0gMSwgdGhpcyB3aWxsIGJlIHRoZSBudW1iZXIgb2Ygcm93cyB1c2VkLiBPdGhlcndpc2UgdGhlCisgICAgICAgIG51bWJlciBvZiByb3dzIHdpbGwgYmUgY2FsY3VsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiB0YWJzIGFuZAorICAgICAgICBtYXhfdGFic19wZXJfcm93LiBJbiB0aGlzIGNhc2UsIHRoZSBudW1iZXIgb2Ygcm93cyBtYXkgY2hhbmdlIHdoZW4KKyAgICAgICAgYWRkaW5nL3JlbW92aW5nIHRhYnMuCisKKyAgICAgICAgIiIiCisgICAgICAgICMgcmVtb3ZlIGFsbCB0YWJzIGFuZCByb3dzCisgICAgICAgIGZvciB0YWJfbmFtZSBpbiBzZWxmLl90YWJzLmtleXMoKToKKyAgICAgICAgICAgIHNlbGYuX3RhYnMucG9wKHRhYl9uYW1lKS5kZXN0cm95KCkKKyAgICAgICAgc2VsZi5fcmVzZXRfdGFiX3Jvd3MoKQorCisgICAgICAgIGlmIG5vdCBzZWxmLl90YWJfbmFtZXM6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLm5fcm93cyBpcyBub3QgTm9uZSBhbmQgc2VsZi5uX3Jvd3MgPiAwOgorICAgICAgICAgICAgbl9yb3dzID0gc2VsZi5uX3Jvd3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgY2FsY3VsYXRlIHRoZSByZXF1aXJlZCBudW1iZXIgb2Ygcm93cworICAgICAgICAgICAgbl9yb3dzID0gKGxlbihzZWxmLl90YWJfbmFtZXMpIC0gMSkgLy8gc2VsZi5tYXhfdGFic19wZXJfcm93ICsgMQorCisgICAgICAgICMgbm90IGV4cGFuZGluZyB0aGUgdGFicyB3aXRoIG1vcmUgdGhhbiBvbmUgcm93IGlzIHZlcnkgdWdseQorICAgICAgICBleHBhbmRfdGFicyA9IHNlbGYuZXhwYW5kX3RhYnMgb3Igbl9yb3dzID4gMQorICAgICAgICBpID0gMCAjIGluZGV4IGluIHNlbGYuX3RhYl9uYW1lcworICAgICAgICBmb3Igcm93X2luZGV4IGluIHhyYW5nZShuX3Jvd3MpOgorICAgICAgICAgICAgIyBjYWxjdWxhdGUgcmVxdWlyZWQgbnVtYmVyIG9mIHRhYnMgaW4gdGhpcyByb3cKKyAgICAgICAgICAgIG5fdGFicyA9IChsZW4oc2VsZi5fdGFiX25hbWVzKSAtIGkgLSAxKSAvLyAobl9yb3dzIC0gcm93X2luZGV4KSArIDEKKyAgICAgICAgICAgIHRhYl9uYW1lcyA9IHNlbGYuX3RhYl9uYW1lc1tpOmkgKyBuX3RhYnNdCisgICAgICAgICAgICBpICs9IG5fdGFicworICAgICAgICAgICAgc2VsZi5fYWRkX3RhYl9yb3codGFiX25hbWVzLCBleHBhbmRfdGFicykKKworICAgICAgICAjIHJlLXNlbGVjdCBzZWxlY3RlZCB0YWIgc28gaXQgaXMgcHJvcGVybHkgZGlzcGxheWVkCisgICAgICAgIHNlbGVjdGVkID0gc2VsZi5fc2VsZWN0ZWRfdGFiCisgICAgICAgIHNlbGYuc2V0X3NlbGVjdGVkX3RhYihOb25lKQorICAgICAgICBpZiBzZWxlY3RlZCBpbiBzZWxmLl90YWJfbmFtZXM6CisgICAgICAgICAgICBzZWxmLnNldF9zZWxlY3RlZF90YWIoc2VsZWN0ZWQpCisKKyAgICBjbGFzcyBUYWJCdXR0b24oRnJhbWUpOgorICAgICAgICAiIiJBIHNpbXBsZSB0YWItbGlrZSB3aWRnZXQuIiIiCisKKyAgICAgICAgYncgPSAyICMgYm9yZGVyd2lkdGgKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgc2VsZWN0X2NvbW1hbmQsIHRhYl9yb3csIHRhYl9zZXQpOgorICAgICAgICAgICAgIiIiQ29uc3RydWN0b3IgYXJndW1lbnRzOgorCisgICAgICAgICAgICBuYW1lIC0tIFRoZSB0YWIncyBuYW1lLCB3aGljaCB3aWxsIGFwcGVhciBpbiBpdHMgYnV0dG9uLgorCisgICAgICAgICAgICBzZWxlY3RfY29tbWFuZCAtLSBUaGUgY29tbWFuZCB0byBiZSBjYWxsZWQgdXBvbiBzZWxlY3Rpb24gb2YgdGhlCisgICAgICAgICAgICB0YWIuIEl0IGlzIGNhbGxlZCB3aXRoIHRoZSB0YWIncyBuYW1lIGFzIGFuIGFyZ3VtZW50LgorCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIHRhYl9yb3csIGJvcmRlcndpZHRoPXNlbGYuYncsIHJlbGllZj1SQUlTRUQpCisKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0X2NvbW1hbmQgPSBzZWxlY3RfY29tbWFuZAorICAgICAgICAgICAgc2VsZi50YWJfc2V0ID0gdGFiX3NldAorICAgICAgICAgICAgc2VsZi5pc19sYXN0X2luX3JvdyA9IEZhbHNlCisKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uID0gUmFkaW9idXR0b24oCisgICAgICAgICAgICAgICAgc2VsZiwgdGV4dD1uYW1lLCBjb21tYW5kPXNlbGYuX3NlbGVjdF9ldmVudCwKKyAgICAgICAgICAgICAgICBwYWR4PTUsIHBhZHk9MSwgdGFrZWZvY3VzPUZBTFNFLCBpbmRpY2F0b3Jvbj1GQUxTRSwKKyAgICAgICAgICAgICAgICBoaWdobGlnaHR0aGlja25lc3M9MCwgc2VsZWN0Y29sb3I9JycsIGJvcmRlcndpZHRoPTApCisgICAgICAgICAgICBzZWxmLmJ1dHRvbi5wYWNrKHNpZGU9TEVGVCwgZmlsbD1YLCBleHBhbmQ9VHJ1ZSkKKworICAgICAgICAgICAgc2VsZi5faW5pdF9tYXNrcygpCisgICAgICAgICAgICBzZWxmLnNldF9ub3JtYWwoKQorCisgICAgICAgIGRlZiBfc2VsZWN0X2V2ZW50KHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICIiIkV2ZW50IGhhbmRsZXIgZm9yIHRhYiBzZWxlY3Rpb24uCisKKyAgICAgICAgICAgIFdpdGggVGFiYmVkUGFnZVNldCwgdGhpcyBjYWxscyBUYWJiZWRQYWdlU2V0LmNoYW5nZV9wYWdlLCBzbyB0aGF0CisgICAgICAgICAgICBzZWxlY3RpbmcgYSB0YWIgY2hhbmdlcyB0aGUgcGFnZS4KKworICAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgZG9lcyAtbm90LSBjYWxsIHNldF9zZWxlY3RlZCAtLSBpdCB3aWxsIGJlIGNhbGxlZCBieQorICAgICAgICAgICAgVGFiU2V0LnNldF9zZWxlY3RlZF90YWIsIHdoaWNoIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB3aGF0ZXZlciB0aGUKKyAgICAgICAgICAgIHRhYnMgYXJlIHJlbGF0ZWQgdG8gY2hhbmdlcy4KKworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBzZWxmLnNlbGVjdF9jb21tYW5kKHNlbGYubmFtZSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGRlZiBzZXRfc2VsZWN0ZWQoc2VsZik6CisgICAgICAgICAgICAiIiJBc3N1bWUgc2VsZWN0ZWQgbG9vayIiIgorICAgICAgICAgICAgc2VsZi5fcGxhY2VfbWFza3Moc2VsZWN0ZWQ9VHJ1ZSkKKworICAgICAgICBkZWYgc2V0X25vcm1hbChzZWxmKToKKyAgICAgICAgICAgICIiIkFzc3VtZSBub3JtYWwgbG9vayIiIgorICAgICAgICAgICAgc2VsZi5fcGxhY2VfbWFza3Moc2VsZWN0ZWQ9RmFsc2UpCisKKyAgICAgICAgZGVmIF9pbml0X21hc2tzKHNlbGYpOgorICAgICAgICAgICAgcGFnZV9zZXQgPSBzZWxmLnRhYl9zZXQucGFnZV9zZXQKKyAgICAgICAgICAgIGJhY2tncm91bmQgPSBwYWdlX3NldC5wYWdlc19mcmFtZS5jZ2V0KCdiYWNrZ3JvdW5kJykKKyAgICAgICAgICAgICMgbWFzayByZXBsYWNlcyB0aGUgbWlkZGxlIG9mIHRoZSBib3JkZXIgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvcgorICAgICAgICAgICAgc2VsZi5tYXNrID0gRnJhbWUocGFnZV9zZXQsIGJvcmRlcndpZHRoPTAsIHJlbGllZj1GTEFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZD1iYWNrZ3JvdW5kKQorICAgICAgICAgICAgIyBtc2tsIHJlcGxhY2VzIHRoZSBib3R0b20tbGVmdCBjb3JuZXIgb2YgdGhlIGJvcmRlciB3aXRoIGEgbm9ybWFsCisgICAgICAgICAgICAjIGxlZnQgYm9yZGVyCisgICAgICAgICAgICBzZWxmLm1za2wgPSBGcmFtZShwYWdlX3NldCwgYm9yZGVyd2lkdGg9MCwgcmVsaWVmPUZMQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kPWJhY2tncm91bmQpCisgICAgICAgICAgICBzZWxmLm1za2wubWwgPSBGcmFtZShzZWxmLm1za2wsIGJvcmRlcndpZHRoPXNlbGYuYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZWY9UkFJU0VEKQorICAgICAgICAgICAgc2VsZi5tc2tsLm1sLnBsYWNlKHg9MCwgeT0tc2VsZi5idywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0yKnNlbGYuYncsIGhlaWdodD1zZWxmLmJ3KjQpCisgICAgICAgICAgICAjIG1za3IgcmVwbGFjZXMgdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIgb2YgdGhlIGJvcmRlciB3aXRoIGEgbm9ybWFsCisgICAgICAgICAgICAjIHJpZ2h0IGJvcmRlcgorICAgICAgICAgICAgc2VsZi5tc2tyID0gRnJhbWUocGFnZV9zZXQsIGJvcmRlcndpZHRoPTAsIHJlbGllZj1GTEFULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZD1iYWNrZ3JvdW5kKQorICAgICAgICAgICAgc2VsZi5tc2tyLm1yID0gRnJhbWUoc2VsZi5tc2tyLCBib3JkZXJ3aWR0aD1zZWxmLmJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWVmPVJBSVNFRCkKKworICAgICAgICBkZWYgX3BsYWNlX21hc2tzKHNlbGYsIHNlbGVjdGVkPUZhbHNlKToKKyAgICAgICAgICAgIGhlaWdodCA9IHNlbGYuYncKKyAgICAgICAgICAgIGlmIHNlbGVjdGVkOgorICAgICAgICAgICAgICAgIGhlaWdodCArPSBzZWxmLmJ3CisKKyAgICAgICAgICAgIHNlbGYubWFzay5wbGFjZShpbl89c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWx4PTAuMCwgeD0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbHk9MS4wLCB5PTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsd2lkdGg9MS4wLCB3aWR0aD0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGhlaWdodD0wLjAsIGhlaWdodD1oZWlnaHQpCisKKyAgICAgICAgICAgIHNlbGYubXNrbC5wbGFjZShpbl89c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWx4PTAuMCwgeD0tc2VsZi5idywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWx5PTEuMCwgeT0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbHdpZHRoPTAuMCwgd2lkdGg9c2VsZi5idywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxoZWlnaHQ9MC4wLCBoZWlnaHQ9aGVpZ2h0KQorCisgICAgICAgICAgICBwYWdlX3NldCA9IHNlbGYudGFiX3NldC5wYWdlX3NldAorICAgICAgICAgICAgaWYgc2VsZWN0ZWQgYW5kICgobm90IHNlbGYuaXNfbGFzdF9pbl9yb3cpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLndpbmZvX3Jvb3R4KCkgKyBzZWxmLndpbmZvX3dpZHRoKCkgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9zZXQud2luZm9fcm9vdHgoKSArIHBhZ2Vfc2V0LndpbmZvX3dpZHRoKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgIyBmb3IgYSBzZWxlY3RlZCB0YWIsIGlmIGl0cyByaWdodG1vc3QgZWRnZSBpc24ndCBvbiB0aGUKKyAgICAgICAgICAgICAgICAjIHJpZ2h0bW9zdCBlZGdlIG9mIHRoZSBwYWdlIHNldCwgdGhlIHJpZ2h0IG1hc2sgc2hvdWxkIGJlIG9uZQorICAgICAgICAgICAgICAgICMgYm9yZGVyd2lkdGggc2hvcnRlciAodmVydGljYWxseSkKKyAgICAgICAgICAgICAgICBoZWlnaHQgLT0gc2VsZi5idworCisgICAgICAgICAgICBzZWxmLm1za3IucGxhY2UoaW5fPXNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVseD0xLjAsIHg9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWx5PTEuMCwgeT0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbHdpZHRoPTAuMCwgd2lkdGg9c2VsZi5idywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxoZWlnaHQ9MC4wLCBoZWlnaHQ9aGVpZ2h0KQorCisgICAgICAgICAgICBzZWxmLm1za3IubXIucGxhY2UoeD0tc2VsZi5idywgeT0tc2VsZi5idywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0yKnNlbGYuYncsIGhlaWdodD1oZWlnaHQgKyBzZWxmLmJ3KjIpCisKKyAgICAgICAgICAgICMgZmluYWxseSwgbG93ZXIgdGhlIHRhYiBzZXQgc28gdGhhdCBhbGwgb2YgdGhlIGZyYW1lcyB3ZSBqdXN0CisgICAgICAgICAgICAjIHBsYWNlZCBoaWRlIGl0CisgICAgICAgICAgICBzZWxmLnRhYl9zZXQubG93ZXIoKQorCitjbGFzcyBUYWJiZWRQYWdlU2V0KEZyYW1lKToKKyAgICAiIiJBIFRraW50ZXIgdGFiYmVkLXBhbmUgd2lkZ2V0LgorCisgICAgQ29uc3RhaW5zIHNldCBvZiAncGFnZXMnIChvciAncGFuZXMnKSB3aXRoIHRhYnMgYWJvdmUgZm9yIHNlbGVjdGluZyB3aGljaAorICAgIHBhZ2UgaXMgZGlzcGxheWVkLiBPbmx5IG9uZSBwYWdlIHdpbGwgYmUgZGlzcGxheWVkIGF0IGEgdGltZS4KKworICAgIFBhZ2VzIG1heSBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAncGFnZXMnIGF0dHJpYnV0ZSwgd2hpY2ggaXMgYSBkaWN0aW9uYXJ5CisgICAgb2YgcGFnZXMsIHVzaW5nIHRoZSBuYW1lIGdpdmVuIGFzIHRoZSBrZXkuIEEgcGFnZSBpcyBhbiBpbnN0YW5jZSBvZiBhCisgICAgc3ViY2xhc3Mgb2YgVGsncyBGcmFtZSB3aWRnZXQuCisKKyAgICBUaGUgcGFnZSB3aWRnZXRzIHdpbGwgYmUgY3JlYXRlZCAoYW5kIGRlc3Ryb3llZCB3aGVuIHJlcXVpcmVkKSBieSB0aGUKKyAgICBUYWJiZWRQYWdlU2V0LiBEbyBub3QgY2FsbCB0aGUgcGFnZSdzIHBhY2svcGxhY2UvZ3JpZC9kZXN0cm95IG1ldGhvZHMuCisKKyAgICBQYWdlcyBtYXkgYmUgYWRkZWQgb3IgcmVtb3ZlZCBhdCBhbnkgdGltZSB1c2luZyB0aGUgYWRkX3BhZ2UoKSBhbmQKKyAgICByZW1vdmVfcGFnZSgpIG1ldGhvZHMuCisKKyAgICAiIiIKKyAgICBjbGFzcyBQYWdlKG9iamVjdCk6CisgICAgICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIFRhYmJlZFBhZ2VTZXQncyBwYWdlcy4KKworICAgICAgICBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhlIF9zaG93KCkgYW5kIF9oaWRlKCkgbWV0aG9kcy4KKworICAgICAgICAiIiIKKyAgICAgICAgdXNlc19ncmlkID0gRmFsc2UKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFnZV9zZXQpOgorICAgICAgICAgICAgc2VsZi5mcmFtZSA9IEZyYW1lKHBhZ2Vfc2V0LCBib3JkZXJ3aWR0aD0yLCByZWxpZWY9UkFJU0VEKQorCisgICAgICAgIGRlZiBfc2hvdyhzZWxmKToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgICAgICBkZWYgX2hpZGUoc2VsZik6CisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBjbGFzcyBQYWdlUmVtb3ZlKFBhZ2UpOgorICAgICAgICAiIiJQYWdlIGNsYXNzIHVzaW5nIHRoZSBncmlkIHBsYWNlbWVudCBtYW5hZ2VyJ3MgInJlbW92ZSIgbWVjaGFuaXNtLiIiIgorICAgICAgICB1c2VzX2dyaWQgPSBUcnVlCisKKyAgICAgICAgZGVmIF9zaG93KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5mcmFtZS5ncmlkKHJvdz0wLCBjb2x1bW49MCwgc3RpY2t5PU5TRVcpCisKKyAgICAgICAgZGVmIF9oaWRlKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5mcmFtZS5ncmlkX3JlbW92ZSgpCisKKyAgICBjbGFzcyBQYWdlTGlmdChQYWdlKToKKyAgICAgICAgIiIiUGFnZSBjbGFzcyB1c2luZyB0aGUgZ3JpZCBwbGFjZW1lbnQgbWFuYWdlcidzICJsaWZ0IiBtZWNoYW5pc20uIiIiCisgICAgICAgIHVzZXNfZ3JpZCA9IFRydWUKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFnZV9zZXQpOgorICAgICAgICAgICAgc3VwZXIoVGFiYmVkUGFnZVNldC5QYWdlTGlmdCwgc2VsZikuX19pbml0X18ocGFnZV9zZXQpCisgICAgICAgICAgICBzZWxmLmZyYW1lLmdyaWQocm93PTAsIGNvbHVtbj0wLCBzdGlja3k9TlNFVykKKyAgICAgICAgICAgIHNlbGYuZnJhbWUubG93ZXIoKQorCisgICAgICAgIGRlZiBfc2hvdyhzZWxmKToKKyAgICAgICAgICAgIHNlbGYuZnJhbWUubGlmdCgpCisKKyAgICAgICAgZGVmIF9oaWRlKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5mcmFtZS5sb3dlcigpCisKKyAgICBjbGFzcyBQYWdlUGFja0ZvcmdldChQYWdlKToKKyAgICAgICAgIiIiUGFnZSBjbGFzcyB1c2luZyB0aGUgcGFjayBwbGFjZW1lbnQgbWFuYWdlcidzICJmb3JnZXQiIG1lY2hhbmlzbS4iIiIKKyAgICAgICAgZGVmIF9zaG93KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5mcmFtZS5wYWNrKGZpbGw9Qk9USCwgZXhwYW5kPVRydWUpCisKKyAgICAgICAgZGVmIF9oaWRlKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5mcmFtZS5wYWNrX2ZvcmdldCgpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCBwYWdlX25hbWVzPU5vbmUsIHBhZ2VfY2xhc3M9UGFnZUxpZnQsCisgICAgICAgICAgICAgICAgIG5fcm93cz0xLCBtYXhfdGFic19wZXJfcm93PTUsIGV4cGFuZF90YWJzPUZhbHNlLAorICAgICAgICAgICAgICAgICAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IgYXJndW1lbnRzOgorCisgICAgICAgIHBhZ2VfbmFtZXMgLS0gQSBsaXN0IG9mIHN0cmluZ3MsIGVhY2ggd2lsbCBiZSB0aGUgZGljdGlvbmFyeSBrZXkgdG8gYQorICAgICAgICBwYWdlJ3Mgd2lkZ2V0LCBhbmQgdGhlIG5hbWUgZGlzcGxheWVkIG9uIHRoZSBwYWdlJ3MgdGFiLiBTaG91bGQgYmUKKyAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBkZXNpcmVkIHBhZ2Ugb3JkZXIuIFRoZSBmaXJzdCBwYWdlIHdpbGwgYmUgdGhlIGRlZmF1bHQKKyAgICAgICAgYW5kIGZpcnN0IGFjdGl2ZSBwYWdlLiBJZiBwYWdlX25hbWVzIGlzIE5vbmUgb3IgZW1wdHksIHRoZQorICAgICAgICBUYWJiZWRQYWdlU2V0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgZW1wdHkuCisKKyAgICAgICAgbl9yb3dzLCBtYXhfdGFic19wZXJfcm93IC0tIFBhcmFtZXRlcnMgZm9yIHRoZSBUYWJTZXQgd2hpY2ggd2lsbAorICAgICAgICBtYW5hZ2UgdGhlIHRhYnMuIFNlZSBUYWJTZXQncyBkb2NzIGZvciBkZXRhaWxzLgorCisgICAgICAgIHBhZ2VfY2xhc3MgLS0gUGFnZXMgY2FuIGJlIHNob3duL2hpZGRlbiB1c2luZyB0aHJlZSBtZWNoYW5pc21zOgorCisgICAgICAgICogUGFnZUxpZnQgLSBBbGwgcGFnZXMgd2lsbCBiZSByZW5kZXJlZCBvbmUgb24gdG9wIG9mIHRoZSBvdGhlci4gV2hlbgorICAgICAgICAgIGEgcGFnZSBpcyBzZWxlY3RlZCwgaXQgd2lsbCBiZSBicm91Z2h0IHRvIHRoZSB0b3AsIHRodXMgaGlkaW5nIGFsbAorICAgICAgICAgIG90aGVyIHBhZ2VzLiBVc2luZyB0aGlzIG1ldGhvZCwgdGhlIFRhYmJlZFBhZ2VTZXQgd2lsbCBub3QgYmUgcmVzaXplZAorICAgICAgICAgIHdoZW4gcGFnZXMgYXJlIHN3aXRjaGVkLiAoSXQgbWF5IHN0aWxsIGJlIHJlc2l6ZWQgd2hlbiBwYWdlcyBhcmUKKyAgICAgICAgICBhZGRlZC9yZW1vdmVkLikKKworICAgICAgICAqIFBhZ2VSZW1vdmUgLSBXaGVuIGEgcGFnZSBpcyBzZWxlY3RlZCwgdGhlIGN1cnJlbnRseSBzaG93aW5nIHBhZ2UgaXMKKyAgICAgICAgICBoaWRkZW4sIGFuZCB0aGUgbmV3IHBhZ2Ugc2hvd24gaW4gaXRzIHBsYWNlLiBVc2luZyB0aGlzIG1ldGhvZCwgdGhlCisgICAgICAgICAgVGFiYmVkUGFnZVNldCBtYXkgcmVzaXplIHdoZW4gcGFnZXMgYXJlIGNoYW5nZWQuCisKKyAgICAgICAgKiBQYWdlUGFja0ZvcmdldCAtIFRoaXMgbWVjaGFuaXNtIHVzZXMgdGhlIHBhY2sgcGxhY2VtZW50IG1hbmFnZXIuCisgICAgICAgICAgV2hlbiBhIHBhZ2UgaXMgc2hvd24gaXQgaXMgcGFja2VkLCBhbmQgd2hlbiBpdCBpcyBoaWRkZW4gaXQgaXMKKyAgICAgICAgICB1bnBhY2tlZCAoaS5lLiBwYWNrX2ZvcmdldCkuIFRoaXMgbWVjaGFuaXNtIG1heSBhbHNvIGNhdXNlIHRoZQorICAgICAgICAgIFRhYmJlZFBhZ2VTZXQgdG8gcmVzaXplIHdoZW4gdGhlIHBhZ2UgaXMgY2hhbmdlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgcGFyZW50LCAqKmt3KQorCisgICAgICAgIHNlbGYucGFnZV9jbGFzcyA9IHBhZ2VfY2xhc3MKKyAgICAgICAgc2VsZi5wYWdlcyA9IHt9CisgICAgICAgIHNlbGYuX3BhZ2VzX29yZGVyID0gW10KKyAgICAgICAgc2VsZi5fY3VycmVudF9wYWdlID0gTm9uZQorICAgICAgICBzZWxmLl9kZWZhdWx0X3BhZ2UgPSBOb25lCisKKyAgICAgICAgc2VsZi5jb2x1bW5jb25maWd1cmUoMCwgd2VpZ2h0PTEpCisgICAgICAgIHNlbGYucm93Y29uZmlndXJlKDEsIHdlaWdodD0xKQorCisgICAgICAgIHNlbGYucGFnZXNfZnJhbWUgPSBGcmFtZShzZWxmKQorICAgICAgICBzZWxmLnBhZ2VzX2ZyYW1lLmdyaWQocm93PTEsIGNvbHVtbj0wLCBzdGlja3k9TlNFVykKKyAgICAgICAgaWYgc2VsZi5wYWdlX2NsYXNzLnVzZXNfZ3JpZDoKKyAgICAgICAgICAgIHNlbGYucGFnZXNfZnJhbWUuY29sdW1uY29uZmlndXJlKDAsIHdlaWdodD0xKQorICAgICAgICAgICAgc2VsZi5wYWdlc19mcmFtZS5yb3djb25maWd1cmUoMCwgd2VpZ2h0PTEpCisKKyAgICAgICAgIyB0aGUgb3JkZXIgb2YgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBpcyBpbXBvcnRhbnQKKyAgICAgICAgc2VsZi5fdGFiX3NldCA9IFRhYlNldChzZWxmLCBzZWxmLmNoYW5nZV9wYWdlLCBuX3Jvd3M9bl9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF90YWJzX3Blcl9yb3c9bWF4X3RhYnNfcGVyX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRfdGFicz1leHBhbmRfdGFicykKKyAgICAgICAgaWYgcGFnZV9uYW1lczoKKyAgICAgICAgICAgIGZvciBuYW1lIGluIHBhZ2VfbmFtZXM6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfcGFnZShuYW1lKQorICAgICAgICBzZWxmLl90YWJfc2V0LmdyaWQocm93PTAsIGNvbHVtbj0wLCBzdGlja3k9TlNFVykKKworICAgICAgICBzZWxmLmNoYW5nZV9wYWdlKHNlbGYuX2RlZmF1bHRfcGFnZSkKKworICAgIGRlZiBhZGRfcGFnZShzZWxmLCBwYWdlX25hbWUpOgorICAgICAgICAiIiJBZGQgYSBuZXcgcGFnZSB3aXRoIHRoZSBuYW1lIGdpdmVuIGluIHBhZ2VfbmFtZS4iIiIKKyAgICAgICAgaWYgbm90IHBhZ2VfbmFtZToKKyAgICAgICAgICAgIHJhaXNlIEludmFsaWROYW1lRXJyb3IoIkludmFsaWQgVGFiUGFnZSBuYW1lOiAnJXMnIiAlIHBhZ2VfbmFtZSkKKyAgICAgICAgaWYgcGFnZV9uYW1lIGluIHNlbGYucGFnZXM6CisgICAgICAgICAgICByYWlzZSBBbHJlYWR5RXhpc3RzRXJyb3IoCisgICAgICAgICAgICAgICAgIlRhYlBhZ2UgbmFtZWQgJyVzJyBhbHJlYWR5IGV4aXN0cyIgJSBwYWdlX25hbWUpCisKKyAgICAgICAgc2VsZi5wYWdlc1twYWdlX25hbWVdID0gc2VsZi5wYWdlX2NsYXNzKHNlbGYucGFnZXNfZnJhbWUpCisgICAgICAgIHNlbGYuX3BhZ2VzX29yZGVyLmFwcGVuZChwYWdlX25hbWUpCisgICAgICAgIHNlbGYuX3RhYl9zZXQuYWRkX3RhYihwYWdlX25hbWUpCisKKyAgICAgICAgaWYgbGVuKHNlbGYucGFnZXMpID09IDE6ICMgYWRkaW5nIGZpcnN0IHBhZ2UKKyAgICAgICAgICAgIHNlbGYuX2RlZmF1bHRfcGFnZSA9IHBhZ2VfbmFtZQorICAgICAgICAgICAgc2VsZi5jaGFuZ2VfcGFnZShwYWdlX25hbWUpCisKKyAgICBkZWYgcmVtb3ZlX3BhZ2Uoc2VsZiwgcGFnZV9uYW1lKToKKyAgICAgICAgIiIiRGVzdHJveSB0aGUgcGFnZSB3aG9zZSBuYW1lIGlzIGdpdmVuIGluIHBhZ2VfbmFtZS4iIiIKKyAgICAgICAgaWYgbm90IHBhZ2VfbmFtZSBpbiBzZWxmLnBhZ2VzOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoIk5vIHN1Y2ggVGFiUGFnZTogJyVzIiAlIHBhZ2VfbmFtZSkKKworICAgICAgICBzZWxmLl9wYWdlc19vcmRlci5yZW1vdmUocGFnZV9uYW1lKQorCisgICAgICAgICMgaGFuZGxlIHJlbW92aW5nIGxhc3QgcmVtYWluaW5nLCBkZWZhdWx0LCBvciBjdXJyZW50bHkgc2hvd24gcGFnZQorICAgICAgICBpZiBsZW4oc2VsZi5fcGFnZXNfb3JkZXIpID4gMDoKKyAgICAgICAgICAgIGlmIHBhZ2VfbmFtZSA9PSBzZWxmLl9kZWZhdWx0X3BhZ2U6CisgICAgICAgICAgICAgICAgIyBzZXQgYSBuZXcgZGVmYXVsdCBwYWdlCisgICAgICAgICAgICAgICAgc2VsZi5fZGVmYXVsdF9wYWdlID0gc2VsZi5fcGFnZXNfb3JkZXJbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2RlZmF1bHRfcGFnZSA9IE5vbmUKKworICAgICAgICBpZiBwYWdlX25hbWUgPT0gc2VsZi5fY3VycmVudF9wYWdlOgorICAgICAgICAgICAgc2VsZi5jaGFuZ2VfcGFnZShzZWxmLl9kZWZhdWx0X3BhZ2UpCisKKyAgICAgICAgc2VsZi5fdGFiX3NldC5yZW1vdmVfdGFiKHBhZ2VfbmFtZSkKKyAgICAgICAgcGFnZSA9IHNlbGYucGFnZXMucG9wKHBhZ2VfbmFtZSkKKyAgICAgICAgcGFnZS5mcmFtZS5kZXN0cm95KCkKKworICAgIGRlZiBjaGFuZ2VfcGFnZShzZWxmLCBwYWdlX25hbWUpOgorICAgICAgICAiIiJTaG93IHRoZSBwYWdlIHdob3NlIG5hbWUgaXMgZ2l2ZW4gaW4gcGFnZV9uYW1lLiIiIgorICAgICAgICBpZiBzZWxmLl9jdXJyZW50X3BhZ2UgPT0gcGFnZV9uYW1lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHBhZ2VfbmFtZSBpcyBub3QgTm9uZSBhbmQgcGFnZV9uYW1lIG5vdCBpbiBzZWxmLnBhZ2VzOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoIk5vIHN1Y2ggVGFiUGFnZTogJyVzJyIgJSBwYWdlX25hbWUpCisKKyAgICAgICAgaWYgc2VsZi5fY3VycmVudF9wYWdlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5wYWdlc1tzZWxmLl9jdXJyZW50X3BhZ2VdLl9oaWRlKCkKKyAgICAgICAgc2VsZi5fY3VycmVudF9wYWdlID0gTm9uZQorCisgICAgICAgIGlmIHBhZ2VfbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2N1cnJlbnRfcGFnZSA9IHBhZ2VfbmFtZQorICAgICAgICAgICAgc2VsZi5wYWdlc1twYWdlX25hbWVdLl9zaG93KCkKKworICAgICAgICBzZWxmLl90YWJfc2V0LnNldF9zZWxlY3RlZF90YWIocGFnZV9uYW1lKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICMgdGVzdCBkaWFsb2cKKyAgICByb290PVRrKCkKKyAgICB0YWJQYWdlPVRhYmJlZFBhZ2VTZXQocm9vdCwgcGFnZV9uYW1lcz1bJ0Zvb2JhcicsJ0JheiddLCBuX3Jvd3M9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kX3RhYnM9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICB0YWJQYWdlLnBhY2soc2lkZT1UT1AsIGV4cGFuZD1UUlVFLCBmaWxsPUJPVEgpCisgICAgTGFiZWwodGFiUGFnZS5wYWdlc1snRm9vYmFyJ10uZnJhbWUsIHRleHQ9J0ZvbycsIHBhZHk9MjApLnBhY2soKQorICAgIExhYmVsKHRhYlBhZ2UucGFnZXNbJ0Zvb2JhciddLmZyYW1lLCB0ZXh0PSdCYXInLCBwYWR5PTIwKS5wYWNrKCkKKyAgICBMYWJlbCh0YWJQYWdlLnBhZ2VzWydCYXonXS5mcmFtZSwgdGV4dD0nQmF6JykucGFjaygpCisgICAgZW50cnlQZ05hbWU9RW50cnkocm9vdCkKKyAgICBidXR0b25BZGQ9QnV0dG9uKHJvb3QsIHRleHQ9J0FkZCBQYWdlJywKKyAgICAgICAgICAgIGNvbW1hbmQ9bGFtYmRhOnRhYlBhZ2UuYWRkX3BhZ2UoZW50cnlQZ05hbWUuZ2V0KCkpKQorICAgIGJ1dHRvblJlbW92ZT1CdXR0b24ocm9vdCwgdGV4dD0nUmVtb3ZlIFBhZ2UnLAorICAgICAgICAgICAgY29tbWFuZD1sYW1iZGE6dGFiUGFnZS5yZW1vdmVfcGFnZShlbnRyeVBnTmFtZS5nZXQoKSkpCisgICAgbGFiZWxQZ05hbWU9TGFiZWwocm9vdCwgdGV4dD0nbmFtZSBvZiBwYWdlIHRvIGFkZC9yZW1vdmU6JykKKyAgICBidXR0b25BZGQucGFjayhwYWR4PTUsIHBhZHk9NSkKKyAgICBidXR0b25SZW1vdmUucGFjayhwYWR4PTUsIHBhZHk9NSkKKyAgICBsYWJlbFBnTmFtZS5wYWNrKHBhZHg9NSkKKyAgICBlbnRyeVBnTmFtZS5wYWNrKHBhZHg9NSkKKyAgICByb290Lm1haW5sb29wKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi90YWJiZWRwYWdlcy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGFiYmVkcGFnZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OGQ4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGFiYmVkcGFnZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi90YWJiZWRwYWdlcy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGFiYmVkcGFnZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OGQ4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGFiYmVkcGFnZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXN0Y29kZS5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXN0Y29kZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWVhYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3Rlc3Rjb2RlLnB5CkBAIC0wLDAgKzEsMzEgQEAKK2ltcG9ydCBzdHJpbmcKKworZGVmIGYoKToKKyAgICBhID0gMAorICAgIGIgPSAxCisgICAgYyA9IDIKKyAgICBkID0gMworICAgIGUgPSA0CisgICAgZygpCisKK2RlZiBnKCk6CisgICAgaCgpCisKK2RlZiBoKCk6CisgICAgaSgpCisKK2RlZiBpKCk6CisgICAgaigpCisKK2RlZiBqKCk6CisgICAgaygpCisKK2RlZiBrKCk6CisgICAgbCgpCisKK2wgPSBsYW1iZGE6IHRlc3QoKQorCitkZWYgdGVzdCgpOgorICAgIHN0cmluZy5jYXB3b3JkcygxKQorCitmKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXN0Y29kZS5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGVzdGNvZGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZmIyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGVzdGNvZGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXN0Y29kZS5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGVzdGNvZGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZmIyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGVzdGNvZGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXh0Vmlldy5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXh0Vmlldy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTM3YzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RleHRWaWV3LnB5CkBAIC0wLDAgKzEsOTkgQEAKKyIiIlNpbXBsZSB0ZXh0IGJyb3dzZXIgZm9yIElETEUKKworIiIiCisKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgoraW1wb3J0IHRrTWVzc2FnZUJveAorCitjbGFzcyBUZXh0Vmlld2VyKFRvcGxldmVsKToKKyAgICAiIiJBIHNpbXBsZSB0ZXh0IHZpZXdlciBkaWFsb2cgZm9yIElETEUKKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCB0ZXh0LCBtb2RhbD1UcnVlKToKKyAgICAgICAgIiIiU2hvdyB0aGUgZ2l2ZW4gdGV4dCBpbiBhIHNjcm9sbGFibGUgd2luZG93IHdpdGggYSAnY2xvc2UnIGJ1dHRvbgorCisgICAgICAgICIiIgorICAgICAgICBUb3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCisgICAgICAgIHNlbGYuY29uZmlndXJlKGJvcmRlcndpZHRoPTUpCisgICAgICAgIHNlbGYuZ2VvbWV0cnkoIj0lZHglZCslZCslZCIgJSAoNjI1LCA1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R4KCkgKyAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSArIDEwKSkKKyAgICAgICAgI2VsZ3VhdmFzIC0gY29uZmlnIHBsYWNlaG9sZGVycyB0aWwgY29uZmlnIHN0dWZmIGNvbXBsZXRlZAorICAgICAgICBzZWxmLmJnID0gJyNmZmZmZmYnCisgICAgICAgIHNlbGYuZmcgPSAnIzAwMDAwMCcKKworICAgICAgICBzZWxmLkNyZWF0ZVdpZGdldHMoKQorICAgICAgICBzZWxmLnRpdGxlKHRpdGxlKQorICAgICAgICBzZWxmLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5PaykKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi50ZXh0Vmlldy5mb2N1c19zZXQoKQorICAgICAgICAja2V5IGJpbmRpbmdzIGZvciB0aGlzIGRpYWxvZworICAgICAgICBzZWxmLmJpbmQoJzxSZXR1cm4+JyxzZWxmLk9rKSAjZGlzbWlzcyBkaWFsb2cKKyAgICAgICAgc2VsZi5iaW5kKCc8RXNjYXBlPicsc2VsZi5PaykgI2Rpc21pc3MgZGlhbG9nCisgICAgICAgIHNlbGYudGV4dFZpZXcuaW5zZXJ0KDAuMCwgdGV4dCkKKyAgICAgICAgc2VsZi50ZXh0Vmlldy5jb25maWcoc3RhdGU9RElTQUJMRUQpCisKKyAgICAgICAgaWYgbW9kYWw6CisgICAgICAgICAgICBzZWxmLnRyYW5zaWVudChwYXJlbnQpCisgICAgICAgICAgICBzZWxmLmdyYWJfc2V0KCkKKyAgICAgICAgICAgIHNlbGYud2FpdF93aW5kb3coKQorCisgICAgZGVmIENyZWF0ZVdpZGdldHMoc2VsZik6CisgICAgICAgIGZyYW1lVGV4dCA9IEZyYW1lKHNlbGYsIHJlbGllZj1TVU5LRU4sIGhlaWdodD03MDApCisgICAgICAgIGZyYW1lQnV0dG9ucyA9IEZyYW1lKHNlbGYpCisgICAgICAgIHNlbGYuYnV0dG9uT2sgPSBCdXR0b24oZnJhbWVCdXR0b25zLCB0ZXh0PSdDbG9zZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLk9rLCB0YWtlZm9jdXM9RkFMU0UpCisgICAgICAgIHNlbGYuc2Nyb2xsYmFyVmlldyA9IFNjcm9sbGJhcihmcmFtZVRleHQsIG9yaWVudD1WRVJUSUNBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2Vmb2N1cz1GQUxTRSwgaGlnaGxpZ2h0dGhpY2tuZXNzPTApCisgICAgICAgIHNlbGYudGV4dFZpZXcgPSBUZXh0KGZyYW1lVGV4dCwgd3JhcD1XT1JELCBoaWdobGlnaHR0aGlja25lc3M9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmc9c2VsZi5mZywgYmc9c2VsZi5iZykKKyAgICAgICAgc2VsZi5zY3JvbGxiYXJWaWV3LmNvbmZpZyhjb21tYW5kPXNlbGYudGV4dFZpZXcueXZpZXcpCisgICAgICAgIHNlbGYudGV4dFZpZXcuY29uZmlnKHlzY3JvbGxjb21tYW5kPXNlbGYuc2Nyb2xsYmFyVmlldy5zZXQpCisgICAgICAgIHNlbGYuYnV0dG9uT2sucGFjaygpCisgICAgICAgIHNlbGYuc2Nyb2xsYmFyVmlldy5wYWNrKHNpZGU9UklHSFQsZmlsbD1ZKQorICAgICAgICBzZWxmLnRleHRWaWV3LnBhY2soc2lkZT1MRUZULGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKKyAgICAgICAgZnJhbWVCdXR0b25zLnBhY2soc2lkZT1CT1RUT00sZmlsbD1YKQorICAgICAgICBmcmFtZVRleHQucGFjayhzaWRlPVRPUCxleHBhbmQ9VFJVRSxmaWxsPUJPVEgpCisKKyAgICBkZWYgT2soc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHNlbGYuZGVzdHJveSgpCisKKworZGVmIHZpZXdfdGV4dChwYXJlbnQsIHRpdGxlLCB0ZXh0LCBtb2RhbD1UcnVlKToKKyAgICByZXR1cm4gVGV4dFZpZXdlcihwYXJlbnQsIHRpdGxlLCB0ZXh0LCBtb2RhbCkKKworZGVmIHZpZXdfZmlsZShwYXJlbnQsIHRpdGxlLCBmaWxlbmFtZSwgZW5jb2Rpbmc9Tm9uZSwgbW9kYWw9VHJ1ZSk6CisgICAgdHJ5OgorICAgICAgICBpZiBlbmNvZGluZzoKKyAgICAgICAgICAgIGltcG9ydCBjb2RlY3MKKyAgICAgICAgICAgIHRleHRGaWxlID0gY29kZWNzLm9wZW4oZmlsZW5hbWUsICdyJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRleHRGaWxlID0gb3BlbihmaWxlbmFtZSwgJ3InKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBpbXBvcnQgdGtNZXNzYWdlQm94CisgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J0ZpbGUgTG9hZCBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVW5hYmxlIHRvIGxvYWQgZmlsZSAlciAuJyAlIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudD1wYXJlbnQpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHZpZXdfdGV4dChwYXJlbnQsIHRpdGxlLCB0ZXh0RmlsZS5yZWFkKCksIG1vZGFsKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgI3Rlc3QgdGhlIGRpYWxvZworICAgIHJvb3Q9VGsoKQorICAgIHJvb3QudGl0bGUoJ3RleHRWaWV3IHRlc3QnKQorICAgIGZpbGVuYW1lID0gJy4vdGV4dFZpZXcucHknCisgICAgdGV4dCA9IGZpbGUoZmlsZW5hbWUsICdyJykucmVhZCgpCisgICAgYnRuMSA9IEJ1dHRvbihyb290LCB0ZXh0PSd2aWV3X3RleHQnLAorICAgICAgICAgICAgICAgICAgY29tbWFuZD1sYW1iZGE6dmlld190ZXh0KHJvb3QsICd2aWV3X3RleHQnLCB0ZXh0KSkKKyAgICBidG4xLnBhY2soc2lkZT1MRUZUKQorICAgIGJ0bjIgPSBCdXR0b24ocm9vdCwgdGV4dD0ndmlld19maWxlJywKKyAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9bGFtYmRhOnZpZXdfZmlsZShyb290LCAndmlld19maWxlJywgZmlsZW5hbWUpKQorICAgIGJ0bjIucGFjayhzaWRlPUxFRlQpCisgICAgYnRuMyA9IEJ1dHRvbihyb290LCB0ZXh0PSdub25tb2RhbCB2aWV3X3RleHQnLAorICAgICAgICAgICAgICAgICAgY29tbWFuZD1sYW1iZGE6dmlld190ZXh0KHJvb3QsICdub25tb2RhbCB2aWV3X3RleHQnLCB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGFsPUZhbHNlKSkKKyAgICBidG4zLnBhY2soc2lkZT1MRUZUKQorICAgIGNsb3NlID0gQnV0dG9uKHJvb3QsIHRleHQ9J0Nsb3NlJywgY29tbWFuZD1yb290LmRlc3Ryb3kpCisgICAgY2xvc2UucGFjayhzaWRlPVJJR0hUKQorICAgIHJvb3QubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RleHRWaWV3LnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXh0Vmlldy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1MDYwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXh0Vmlldy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RleHRWaWV3LnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXh0Vmlldy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1MDYwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXh0Vmlldy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9paG9va3MucHkgYi9saWIvcHl0aG9uMi43L2lob29rcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzYxZGFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9paG9va3MucHkKQEAgLTAsMCArMSw1NTQgQEAKKyIiIkltcG9ydCBob29rIHN1cHBvcnQuCisKK0NvbnNpc3RlbnQgdXNlIG9mIHRoaXMgbW9kdWxlIHdpbGwgbWFrZSBpdCBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlCitkaWZmZXJlbnQgbWVjaGFuaXNtcyBpbnZvbHZlZCBpbiBsb2FkaW5nIG1vZHVsZXMgaW5kZXBlbmRlbnRseS4KKworV2hpbGUgdGhlIGJ1aWx0LWluIG1vZHVsZSBpbXAgZXhwb3J0cyBpbnRlcmZhY2VzIHRvIHRoZSBidWlsdC1pbgorbW9kdWxlIHNlYXJjaGluZyBhbmQgbG9hZGluZyBhbGdvcml0aG0sIGFuZCBpdCBpcyBwb3NzaWJsZSB0byByZXBsYWNlCit0aGUgYnVpbHQtaW4gZnVuY3Rpb24gX19pbXBvcnRfXyBpbiBvcmRlciB0byBjaGFuZ2UgdGhlIHNlbWFudGljcyBvZgordGhlIGltcG9ydCBzdGF0ZW1lbnQsIHVudGlsIG5vdyBpdCBoYXMgYmVlbiBkaWZmaWN1bHQgdG8gY29tYmluZSB0aGUKK2VmZmVjdCBvZiBkaWZmZXJlbnQgX19pbXBvcnRfXyBoYWNrcywgbGlrZSBsb2FkaW5nIG1vZHVsZXMgZnJvbSBVUkxzCitieSByaW1wb3J0LnB5LCBvciByZXN0cmljdGVkIGV4ZWN1dGlvbiBieSByZXhlYy5weS4KKworVGhpcyBtb2R1bGUgZGVmaW5lcyB0aHJlZSBuZXcgY29uY2VwdHM6CisKKzEpIEEgImZpbGUgc3lzdGVtIGhvb2tzIiBjbGFzcyBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gYSBmaWxlc3lzdGVtLgorCitPbmUgaG9va3MgY2xhc3MgaXMgZGVmaW5lZCAoSG9va3MpLCB3aGljaCB1c2VzIHRoZSBpbnRlcmZhY2UgcHJvdmlkZWQKK2J5IHN0YW5kYXJkIG1vZHVsZXMgb3MgYW5kIG9zLnBhdGguICBJdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgYmFzZQorY2xhc3MgZm9yIG90aGVyIGhvb2tzIGNsYXNzZXMuCisKKzIpIEEgIm1vZHVsZSBsb2FkZXIiIGNsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byBzZWFyY2ggZm9yIGEKK21vZHVsZSBpbiBhIHNlYXJjaCBwYXRoIGFuZCB0byBsb2FkIGl0LiAgSXQgZGVmaW5lcyBhIG1ldGhvZCB3aGljaAorc2VhcmNoZXMgZm9yIGEgbW9kdWxlIGluIGEgc2luZ2xlIGRpcmVjdG9yeTsgYnkgb3ZlcnJpZGluZyB0aGlzIG1ldGhvZAorb25lIGNhbiByZWRlZmluZSB0aGUgZGV0YWlscyBvZiB0aGUgc2VhcmNoLiAgSWYgdGhlIGRpcmVjdG9yeSBpcyBOb25lLAorYnVpbHQtaW4gYW5kIGZyb3plbiBtb2R1bGVzIGFyZSBzZWFyY2hlZCBpbnN0ZWFkLgorCitUd28gbW9kdWxlIGxvYWRlciBjbGFzcyBhcmUgZGVmaW5lZCwgYm90aCBpbXBsZW1lbnRpbmcgdGhlIHNlYXJjaAorc3RyYXRlZ3kgdXNlZCBieSB0aGUgYnVpbHQtaW4gX19pbXBvcnRfXyBmdW5jdGlvbjogTW9kdWxlTG9hZGVyIHVzZXMKK3RoZSBpbXAgbW9kdWxlJ3MgZmluZF9tb2R1bGUgaW50ZXJmYWNlLCB3aGlsZSBIb29rYWJsZU1vZHVsZUxvYWRlcgordXNlcyBhIGZpbGUgc3lzdGVtIGhvb2tzIGNsYXNzIHRvIGludGVyYWN0IHdpdGggdGhlIGZpbGUgc3lzdGVtLiAgQm90aAordXNlIHRoZSBpbXAgbW9kdWxlJ3MgbG9hZF8qIGludGVyZmFjZXMgdG8gYWN0dWFsbHkgbG9hZCB0aGUgbW9kdWxlLgorCiszKSBBICJtb2R1bGUgaW1wb3J0ZXIiIGNsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byBpbXBvcnQgYQorbW9kdWxlLCBhcyB3ZWxsIGFzIGludGVyZmFjZXMgdG8gcmVsb2FkIGFuZCB1bmxvYWQgYSBtb2R1bGUuICBJdCBhbHNvCitwcm92aWRlcyBpbnRlcmZhY2VzIHRvIGluc3RhbGwgYW5kIHVuaW5zdGFsbCBpdHNlbGYgaW5zdGVhZCBvZiB0aGUKK2RlZmF1bHQgX19pbXBvcnRfXyBhbmQgcmVsb2FkIChhbmQgdW5sb2FkKSBmdW5jdGlvbnMuCisKK09uZSBtb2R1bGUgaW1wb3J0ZXIgY2xhc3MgaXMgZGVmaW5lZCAoTW9kdWxlSW1wb3J0ZXIpLCB3aGljaCB1c2VzIGEKK21vZHVsZSBsb2FkZXIgaW5zdGFuY2UgcGFzc2VkIGluIChieSBkZWZhdWx0IEhvb2thYmxlTW9kdWxlTG9hZGVyIGlzCitpbnN0YW50aWF0ZWQpLgorCitUaGUgY2xhc3NlcyBkZWZpbmVkIGhlcmUgc2hvdWxkIGJlIHVzZWQgYXMgYmFzZSBjbGFzc2VzIGZvciBleHRlbmRlZAorZnVuY3Rpb25hbGl0eSBhbG9uZyB0aG9zZSBsaW5lcy4KKworSWYgYSBtb2R1bGUgaW1wb3J0ZXIgY2xhc3Mgc3VwcG9ydHMgZG90dGVkIG5hbWVzLCBpdHMgaW1wb3J0X21vZHVsZSgpCittdXN0IHJldHVybiBhIGRpZmZlcmVudCB2YWx1ZSBkZXBlbmRpbmcgb24gd2hldGhlciBpdCBpcyBjYWxsZWQgb24KK2JlaGFsZiBvZiBhICJmcm9tIC4uLiBpbXBvcnQgLi4uIiBzdGF0ZW1lbnQgb3Igbm90LiAgKFRoaXMgaXMgY2F1c2VkCitieSB0aGUgd2F5IHRoZSBfX2ltcG9ydF9fIGhvb2sgaXMgdXNlZCBieSB0aGUgUHl0aG9uIGludGVycHJldGVyLikgIEl0Cit3b3VsZCBhbHNvIGRvIHdpc2UgdG8gaW5zdGFsbCBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHJlbG9hZCgpLgorCisiIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrLCB3YXJuCit3YXJucHkzaygidGhlIGlob29rcyBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKK2ltcG9ydCBfX2J1aWx0aW5fXworaW1wb3J0IGltcAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK19fYWxsX18gPSBbIkJhc2ljTW9kdWxlTG9hZGVyIiwiSG9va3MiLCJNb2R1bGVMb2FkZXIiLCJGYW5jeU1vZHVsZUxvYWRlciIsCisgICAgICAgICAgICJCYXNpY01vZHVsZUltcG9ydGVyIiwiTW9kdWxlSW1wb3J0ZXIiLCJpbnN0YWxsIiwidW5pbnN0YWxsIl0KKworVkVSQk9TRSA9IDAKKworCitmcm9tIGltcCBpbXBvcnQgQ19FWFRFTlNJT04sIFBZX1NPVVJDRSwgUFlfQ09NUElMRUQKK2Zyb20gaW1wIGltcG9ydCBDX0JVSUxUSU4sIFBZX0ZST1pFTiwgUEtHX0RJUkVDVE9SWQorQlVJTFRJTl9NT0RVTEUgPSBDX0JVSUxUSU4KK0ZST1pFTl9NT0RVTEUgPSBQWV9GUk9aRU4KKworCitjbGFzcyBfVmVyYm9zZToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJib3NlID0gVkVSQk9TRSk6CisgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKworICAgIGRlZiBnZXRfdmVyYm9zZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmVyYm9zZQorCisgICAgZGVmIHNldF92ZXJib3NlKHNlbGYsIHZlcmJvc2UpOgorICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCisKKyAgICAjIFhYWCBUaGUgZm9sbG93aW5nIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UKKworICAgIGRlZiBub3RlKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgc2VsZi5tZXNzYWdlKCphcmdzKQorCisgICAgZGVmIG1lc3NhZ2Uoc2VsZiwgZm9ybWF0LCAqYXJncyk6CisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBwcmludCBmb3JtYXQlYXJncworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgZm9ybWF0CisKKworY2xhc3MgQmFzaWNNb2R1bGVMb2FkZXIoX1ZlcmJvc2UpOgorCisgICAgIiIiQmFzaWMgbW9kdWxlIGxvYWRlci4KKworICAgIFRoaXMgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBidWlsdC1pbiBpbXBvcnQuICBJdAorICAgIGRvZXNuJ3QgZGVhbCB3aXRoIGNoZWNraW5nIHN5cy5tb2R1bGVzIC0tIGFsbCBpdCBwcm92aWRlcyBpcworICAgIGZpbmRfbW9kdWxlKCkgYW5kIGEgbG9hZF9tb2R1bGUoKSwgYXMgd2VsbCBhcyBmaW5kX21vZHVsZV9pbl9kaXIoKQorICAgIHdoaWNoIHNlYXJjaGVzIGp1c3Qgb25lIGRpcmVjdG9yeSwgYW5kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEKKyAgICBkZXJpdmVkIGNsYXNzIHRvIGNoYW5nZSB0aGUgbW9kdWxlIHNlYXJjaCBhbGdvcml0aG0gd2hlbiB0aGUgYmFzaWMKKyAgICBkZXBlbmRlbmN5IG9uIHN5cy5wYXRoIGlzIHVuY2hhbmdlZC4KKworICAgIFRoZSBpbnRlcmZhY2UgaXMgYSBsaXR0bGUgbW9yZSBjb252ZW5pZW50IHRoYW4gaW1wJ3M6CisgICAgZmluZF9tb2R1bGUobmFtZSwgW3BhdGhdKSByZXR1cm5zIE5vbmUgb3IgJ3N0dWZmJywgYW5kCisgICAgbG9hZF9tb2R1bGUobmFtZSwgc3R1ZmYpIGxvYWRzIHRoZSBtb2R1bGUuCisKKyAgICAiIiIKKworICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBuYW1lLCBwYXRoID0gTm9uZSk6CisgICAgICAgIGlmIHBhdGggaXMgTm9uZToKKyAgICAgICAgICAgIHBhdGggPSBbTm9uZV0gKyBzZWxmLmRlZmF1bHRfcGF0aCgpCisgICAgICAgIGZvciBkaXIgaW4gcGF0aDoKKyAgICAgICAgICAgIHN0dWZmID0gc2VsZi5maW5kX21vZHVsZV9pbl9kaXIobmFtZSwgZGlyKQorICAgICAgICAgICAgaWYgc3R1ZmY6IHJldHVybiBzdHVmZgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGRlZmF1bHRfcGF0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5wYXRoCisKKyAgICBkZWYgZmluZF9tb2R1bGVfaW5fZGlyKHNlbGYsIG5hbWUsIGRpcik6CisgICAgICAgIGlmIGRpciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmluZF9idWlsdGluX21vZHVsZShuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBpbXAuZmluZF9tb2R1bGUobmFtZSwgW2Rpcl0pCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBmaW5kX2J1aWx0aW5fbW9kdWxlKHNlbGYsIG5hbWUpOgorICAgICAgICAjIFhYWCBmcm96ZW4gcGFja2FnZXM/CisgICAgICAgIGlmIGltcC5pc19idWlsdGluKG5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsICcnLCAoJycsICcnLCBCVUlMVElOX01PRFVMRSkKKyAgICAgICAgaWYgaW1wLmlzX2Zyb3plbihuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBOb25lLCAnJywgKCcnLCAnJywgRlJPWkVOX01PRFVMRSkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBuYW1lLCBzdHVmZik6CisgICAgICAgIGZpbGUsIGZpbGVuYW1lLCBpbmZvID0gc3R1ZmYKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGltcC5sb2FkX21vZHVsZShuYW1lLCBmaWxlLCBmaWxlbmFtZSwgaW5mbykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGZpbGU6IGZpbGUuY2xvc2UoKQorCisKK2NsYXNzIEhvb2tzKF9WZXJib3NlKToKKworICAgICIiIkhvb2tzIGludG8gdGhlIGZpbGVzeXN0ZW0gYW5kIGludGVycHJldGVyLgorCisgICAgQnkgZGVyaXZpbmcgYSBzdWJjbGFzcyB5b3UgY2FuIHJlZGVmaW5lIHlvdXIgZmlsZXN5c3RlbSBpbnRlcmZhY2UsCisgICAgZS5nLiB0byBtZXJnZSBpdCB3aXRoIHRoZSBVUkwgc3BhY2UuCisKKyAgICBUaGlzIGJhc2UgY2xhc3MgYmVoYXZlcyBqdXN0IGxpa2UgdGhlIG5hdGl2ZSBmaWxlc3lzdGVtLgorCisgICAgIiIiCisKKyAgICAjIGltcCBpbnRlcmZhY2UKKyAgICBkZWYgZ2V0X3N1ZmZpeGVzKHNlbGYpOiByZXR1cm4gaW1wLmdldF9zdWZmaXhlcygpCisgICAgZGVmIG5ld19tb2R1bGUoc2VsZiwgbmFtZSk6IHJldHVybiBpbXAubmV3X21vZHVsZShuYW1lKQorICAgIGRlZiBpc19idWlsdGluKHNlbGYsIG5hbWUpOiByZXR1cm4gaW1wLmlzX2J1aWx0aW4obmFtZSkKKyAgICBkZWYgaW5pdF9idWlsdGluKHNlbGYsIG5hbWUpOiByZXR1cm4gaW1wLmluaXRfYnVpbHRpbihuYW1lKQorICAgIGRlZiBpc19mcm96ZW4oc2VsZiwgbmFtZSk6IHJldHVybiBpbXAuaXNfZnJvemVuKG5hbWUpCisgICAgZGVmIGluaXRfZnJvemVuKHNlbGYsIG5hbWUpOiByZXR1cm4gaW1wLmluaXRfZnJvemVuKG5hbWUpCisgICAgZGVmIGdldF9mcm96ZW5fb2JqZWN0KHNlbGYsIG5hbWUpOiByZXR1cm4gaW1wLmdldF9mcm96ZW5fb2JqZWN0KG5hbWUpCisgICAgZGVmIGxvYWRfc291cmNlKHNlbGYsIG5hbWUsIGZpbGVuYW1lLCBmaWxlPU5vbmUpOgorICAgICAgICByZXR1cm4gaW1wLmxvYWRfc291cmNlKG5hbWUsIGZpbGVuYW1lLCBmaWxlKQorICAgIGRlZiBsb2FkX2NvbXBpbGVkKHNlbGYsIG5hbWUsIGZpbGVuYW1lLCBmaWxlPU5vbmUpOgorICAgICAgICByZXR1cm4gaW1wLmxvYWRfY29tcGlsZWQobmFtZSwgZmlsZW5hbWUsIGZpbGUpCisgICAgZGVmIGxvYWRfZHluYW1pYyhzZWxmLCBuYW1lLCBmaWxlbmFtZSwgZmlsZT1Ob25lKToKKyAgICAgICAgcmV0dXJuIGltcC5sb2FkX2R5bmFtaWMobmFtZSwgZmlsZW5hbWUsIGZpbGUpCisgICAgZGVmIGxvYWRfcGFja2FnZShzZWxmLCBuYW1lLCBmaWxlbmFtZSwgZmlsZT1Ob25lKToKKyAgICAgICAgcmV0dXJuIGltcC5sb2FkX21vZHVsZShuYW1lLCBmaWxlLCBmaWxlbmFtZSwgKCIiLCAiIiwgUEtHX0RJUkVDVE9SWSkpCisKKyAgICBkZWYgYWRkX21vZHVsZShzZWxmLCBuYW1lKToKKyAgICAgICAgZCA9IHNlbGYubW9kdWxlc19kaWN0KCkKKyAgICAgICAgaWYgbmFtZSBpbiBkOiByZXR1cm4gZFtuYW1lXQorICAgICAgICBkW25hbWVdID0gbSA9IHNlbGYubmV3X21vZHVsZShuYW1lKQorICAgICAgICByZXR1cm4gbQorCisgICAgIyBzeXMgaW50ZXJmYWNlCisgICAgZGVmIG1vZHVsZXNfZGljdChzZWxmKTogcmV0dXJuIHN5cy5tb2R1bGVzCisgICAgZGVmIGRlZmF1bHRfcGF0aChzZWxmKTogcmV0dXJuIHN5cy5wYXRoCisKKyAgICBkZWYgcGF0aF9zcGxpdChzZWxmLCB4KTogcmV0dXJuIG9zLnBhdGguc3BsaXQoeCkKKyAgICBkZWYgcGF0aF9qb2luKHNlbGYsIHgsIHkpOiByZXR1cm4gb3MucGF0aC5qb2luKHgsIHkpCisgICAgZGVmIHBhdGhfaXNhYnMoc2VsZiwgeCk6IHJldHVybiBvcy5wYXRoLmlzYWJzKHgpCisgICAgIyBldGMuCisKKyAgICBkZWYgcGF0aF9leGlzdHMoc2VsZiwgeCk6IHJldHVybiBvcy5wYXRoLmV4aXN0cyh4KQorICAgIGRlZiBwYXRoX2lzZGlyKHNlbGYsIHgpOiByZXR1cm4gb3MucGF0aC5pc2Rpcih4KQorICAgIGRlZiBwYXRoX2lzZmlsZShzZWxmLCB4KTogcmV0dXJuIG9zLnBhdGguaXNmaWxlKHgpCisgICAgZGVmIHBhdGhfaXNsaW5rKHNlbGYsIHgpOiByZXR1cm4gb3MucGF0aC5pc2xpbmsoeCkKKyAgICAjIGV0Yy4KKworICAgIGRlZiBvcGVuZmlsZShzZWxmLCAqeCk6IHJldHVybiBvcGVuKCp4KQorICAgIG9wZW5maWxlX2Vycm9yID0gSU9FcnJvcgorICAgIGRlZiBsaXN0ZGlyKHNlbGYsIHgpOiByZXR1cm4gb3MubGlzdGRpcih4KQorICAgIGxpc3RkaXJfZXJyb3IgPSBvcy5lcnJvcgorICAgICMgZXRjLgorCisKK2NsYXNzIE1vZHVsZUxvYWRlcihCYXNpY01vZHVsZUxvYWRlcik6CisKKyAgICAiIiJEZWZhdWx0IG1vZHVsZSBsb2FkZXI7IHVzZXMgZmlsZSBzeXN0ZW0gaG9va3MuCisKKyAgICBCeSBkZWZpbmluZyBzdWl0YWJsZSBob29rcywgeW91IG1pZ2h0IGJlIGFibGUgdG8gbG9hZCBtb2R1bGVzIGZyb20KKyAgICBvdGhlciBzb3VyY2VzIHRoYW4gdGhlIGZpbGUgc3lzdGVtLCBlLmcuIGZyb20gY29tcHJlc3NlZCBvcgorICAgIGVuY3J5cHRlZCBmaWxlcywgdGFyIGZpbGVzIG9yIChpZiB5b3UncmUgYnJhdmUhKSBVUkxzLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9va3MgPSBOb25lLCB2ZXJib3NlID0gVkVSQk9TRSk6CisgICAgICAgIEJhc2ljTW9kdWxlTG9hZGVyLl9faW5pdF9fKHNlbGYsIHZlcmJvc2UpCisgICAgICAgIHNlbGYuaG9va3MgPSBob29rcyBvciBIb29rcyh2ZXJib3NlKQorCisgICAgZGVmIGRlZmF1bHRfcGF0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaG9va3MuZGVmYXVsdF9wYXRoKCkKKworICAgIGRlZiBtb2R1bGVzX2RpY3Qoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmhvb2tzLm1vZHVsZXNfZGljdCgpCisKKyAgICBkZWYgZ2V0X2hvb2tzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ob29rcworCisgICAgZGVmIHNldF9ob29rcyhzZWxmLCBob29rcyk6CisgICAgICAgIHNlbGYuaG9va3MgPSBob29rcworCisgICAgZGVmIGZpbmRfYnVpbHRpbl9tb2R1bGUoc2VsZiwgbmFtZSk6CisgICAgICAgICMgWFhYIGZyb3plbiBwYWNrYWdlcz8KKyAgICAgICAgaWYgc2VsZi5ob29rcy5pc19idWlsdGluKG5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsICcnLCAoJycsICcnLCBCVUlMVElOX01PRFVMRSkKKyAgICAgICAgaWYgc2VsZi5ob29rcy5pc19mcm96ZW4obmFtZSk6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgJycsICgnJywgJycsIEZST1pFTl9NT0RVTEUpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZmluZF9tb2R1bGVfaW5fZGlyKHNlbGYsIG5hbWUsIGRpciwgYWxsb3dfcGFja2FnZXM9MSk6CisgICAgICAgIGlmIGRpciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmluZF9idWlsdGluX21vZHVsZShuYW1lKQorICAgICAgICBpZiBhbGxvd19wYWNrYWdlczoKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5ob29rcy5wYXRoX2pvaW4oZGlyLCBuYW1lKQorICAgICAgICAgICAgaWYgc2VsZi5ob29rcy5wYXRoX2lzZGlyKGZ1bGxuYW1lKToKKyAgICAgICAgICAgICAgICBzdHVmZiA9IHNlbGYuZmluZF9tb2R1bGVfaW5fZGlyKCJfX2luaXRfXyIsIGZ1bGxuYW1lLCAwKQorICAgICAgICAgICAgICAgIGlmIHN0dWZmOgorICAgICAgICAgICAgICAgICAgICBmaWxlID0gc3R1ZmZbMF0KKyAgICAgICAgICAgICAgICAgICAgaWYgZmlsZTogZmlsZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCBmdWxsbmFtZSwgKCcnLCAnJywgUEtHX0RJUkVDVE9SWSkKKyAgICAgICAgZm9yIGluZm8gaW4gc2VsZi5ob29rcy5nZXRfc3VmZml4ZXMoKToKKyAgICAgICAgICAgIHN1ZmYsIG1vZGUsIHR5cGUgPSBpbmZvCisgICAgICAgICAgICBmdWxsbmFtZSA9IHNlbGYuaG9va3MucGF0aF9qb2luKGRpciwgbmFtZStzdWZmKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZwID0gc2VsZi5ob29rcy5vcGVuZmlsZShmdWxsbmFtZSwgbW9kZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZnAsIGZ1bGxuYW1lLCBpbmZvCisgICAgICAgICAgICBleGNlcHQgc2VsZi5ob29rcy5vcGVuZmlsZV9lcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgbmFtZSwgc3R1ZmYpOgorICAgICAgICBmaWxlLCBmaWxlbmFtZSwgaW5mbyA9IHN0dWZmCisgICAgICAgIChzdWZmLCBtb2RlLCB0eXBlKSA9IGluZm8KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgdHlwZSA9PSBCVUlMVElOX01PRFVMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5ob29rcy5pbml0X2J1aWx0aW4obmFtZSkKKyAgICAgICAgICAgIGlmIHR5cGUgPT0gRlJPWkVOX01PRFVMRToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5ob29rcy5pbml0X2Zyb3plbihuYW1lKQorICAgICAgICAgICAgaWYgdHlwZSA9PSBDX0VYVEVOU0lPTjoKKyAgICAgICAgICAgICAgICBtID0gc2VsZi5ob29rcy5sb2FkX2R5bmFtaWMobmFtZSwgZmlsZW5hbWUsIGZpbGUpCisgICAgICAgICAgICBlbGlmIHR5cGUgPT0gUFlfU09VUkNFOgorICAgICAgICAgICAgICAgIG0gPSBzZWxmLmhvb2tzLmxvYWRfc291cmNlKG5hbWUsIGZpbGVuYW1lLCBmaWxlKQorICAgICAgICAgICAgZWxpZiB0eXBlID09IFBZX0NPTVBJTEVEOgorICAgICAgICAgICAgICAgIG0gPSBzZWxmLmhvb2tzLmxvYWRfY29tcGlsZWQobmFtZSwgZmlsZW5hbWUsIGZpbGUpCisgICAgICAgICAgICBlbGlmIHR5cGUgPT0gUEtHX0RJUkVDVE9SWToKKyAgICAgICAgICAgICAgICBtID0gc2VsZi5ob29rcy5sb2FkX3BhY2thZ2UobmFtZSwgZmlsZW5hbWUsIGZpbGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiVW5yZWNvZ25pemVkIG1vZHVsZSB0eXBlICglcikgZm9yICVzIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAodHlwZSwgbmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGZpbGU6IGZpbGUuY2xvc2UoKQorICAgICAgICBtLl9fZmlsZV9fID0gZmlsZW5hbWUKKyAgICAgICAgcmV0dXJuIG0KKworCitjbGFzcyBGYW5jeU1vZHVsZUxvYWRlcihNb2R1bGVMb2FkZXIpOgorCisgICAgIiIiRmFuY3kgbW9kdWxlIGxvYWRlciAtLSBwYXJzZXMgYW5kIGV4ZWNzIHRoZSBjb2RlIGl0c2VsZi4iIiIKKworICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBuYW1lLCBzdHVmZik6CisgICAgICAgIGZpbGUsIGZpbGVuYW1lLCAoc3VmZiwgbW9kZSwgdHlwZSkgPSBzdHVmZgorICAgICAgICByZWFsZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBwYXRoID0gTm9uZQorCisgICAgICAgIGlmIHR5cGUgPT0gUEtHX0RJUkVDVE9SWToKKyAgICAgICAgICAgIGluaXRzdHVmZiA9IHNlbGYuZmluZF9tb2R1bGVfaW5fZGlyKCJfX2luaXRfXyIsIGZpbGVuYW1lLCAwKQorICAgICAgICAgICAgaWYgbm90IGluaXRzdHVmZjoKKyAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgIk5vIF9faW5pdF9fIG1vZHVsZSBpbiBwYWNrYWdlICVzIiAlIG5hbWUKKyAgICAgICAgICAgIGluaXRmaWxlLCBpbml0ZmlsZW5hbWUsIGluaXRpbmZvID0gaW5pdHN0dWZmCisgICAgICAgICAgICBpbml0c3VmZiwgaW5pdG1vZGUsIGluaXR0eXBlID0gaW5pdGluZm8KKyAgICAgICAgICAgIGlmIGluaXR0eXBlIG5vdCBpbiAoUFlfQ09NUElMRUQsIFBZX1NPVVJDRSk6CisgICAgICAgICAgICAgICAgaWYgaW5pdGZpbGU6IGluaXRmaWxlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAiQmFkIHR5cGUgKCVyKSBmb3IgX19pbml0X18gbW9kdWxlIGluIHBhY2thZ2UgJXMiICUgKAorICAgICAgICAgICAgICAgICAgICBpbml0dHlwZSwgbmFtZSkKKyAgICAgICAgICAgIHBhdGggPSBbZmlsZW5hbWVdCisgICAgICAgICAgICBmaWxlID0gaW5pdGZpbGUKKyAgICAgICAgICAgIHJlYWxmaWxlbmFtZSA9IGluaXRmaWxlbmFtZQorICAgICAgICAgICAgdHlwZSA9IGluaXR0eXBlCisKKyAgICAgICAgaWYgdHlwZSA9PSBGUk9aRU5fTU9EVUxFOgorICAgICAgICAgICAgY29kZSA9IHNlbGYuaG9va3MuZ2V0X2Zyb3plbl9vYmplY3QobmFtZSkKKyAgICAgICAgZWxpZiB0eXBlID09IFBZX0NPTVBJTEVEOgorICAgICAgICAgICAgaW1wb3J0IG1hcnNoYWwKKyAgICAgICAgICAgIGZpbGUuc2Vlayg4KQorICAgICAgICAgICAgY29kZSA9IG1hcnNoYWwubG9hZChmaWxlKQorICAgICAgICBlbGlmIHR5cGUgPT0gUFlfU09VUkNFOgorICAgICAgICAgICAgZGF0YSA9IGZpbGUucmVhZCgpCisgICAgICAgICAgICBjb2RlID0gY29tcGlsZShkYXRhLCByZWFsZmlsZW5hbWUsICdleGVjJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBNb2R1bGVMb2FkZXIubG9hZF9tb2R1bGUoc2VsZiwgbmFtZSwgc3R1ZmYpCisKKyAgICAgICAgbSA9IHNlbGYuaG9va3MuYWRkX21vZHVsZShuYW1lKQorICAgICAgICBpZiBwYXRoOgorICAgICAgICAgICAgbS5fX3BhdGhfXyA9IHBhdGgKKyAgICAgICAgbS5fX2ZpbGVfXyA9IGZpbGVuYW1lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgY29kZSBpbiBtLl9fZGljdF9fCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGQgPSBzZWxmLmhvb2tzLm1vZHVsZXNfZGljdCgpCisgICAgICAgICAgICBpZiBuYW1lIGluIGQ6CisgICAgICAgICAgICAgICAgZGVsIGRbbmFtZV0KKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHJldHVybiBtCisKKworY2xhc3MgQmFzaWNNb2R1bGVJbXBvcnRlcihfVmVyYm9zZSk6CisKKyAgICAiIiJCYXNpYyBtb2R1bGUgaW1wb3J0ZXI7IHVzZXMgbW9kdWxlIGxvYWRlci4KKworICAgIFRoaXMgcHJvdmlkZXMgYmFzaWMgaW1wb3J0IGZhY2lsaXRpZXMgYnV0IG5vIHBhY2thZ2UgaW1wb3J0cy4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvYWRlciA9IE5vbmUsIHZlcmJvc2UgPSBWRVJCT1NFKToKKyAgICAgICAgX1ZlcmJvc2UuX19pbml0X18oc2VsZiwgdmVyYm9zZSkKKyAgICAgICAgc2VsZi5sb2FkZXIgPSBsb2FkZXIgb3IgTW9kdWxlTG9hZGVyKE5vbmUsIHZlcmJvc2UpCisgICAgICAgIHNlbGYubW9kdWxlcyA9IHNlbGYubG9hZGVyLm1vZHVsZXNfZGljdCgpCisKKyAgICBkZWYgZ2V0X2xvYWRlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyCisKKyAgICBkZWYgc2V0X2xvYWRlcihzZWxmLCBsb2FkZXIpOgorICAgICAgICBzZWxmLmxvYWRlciA9IGxvYWRlcgorCisgICAgZGVmIGdldF9ob29rcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmdldF9ob29rcygpCisKKyAgICBkZWYgc2V0X2hvb2tzKHNlbGYsIGhvb2tzKToKKyAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLnNldF9ob29rcyhob29rcykKKworICAgIGRlZiBpbXBvcnRfbW9kdWxlKHNlbGYsIG5hbWUsIGdsb2JhbHM9e30sIGxvY2Fscz17fSwgZnJvbWxpc3Q9W10pOgorICAgICAgICBuYW1lID0gc3RyKG5hbWUpCisgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5tb2R1bGVzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubW9kdWxlc1tuYW1lXSAjIEZhc3QgcGF0aAorICAgICAgICBzdHVmZiA9IHNlbGYubG9hZGVyLmZpbmRfbW9kdWxlKG5hbWUpCisgICAgICAgIGlmIG5vdCBzdHVmZjoKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiTm8gbW9kdWxlIG5hbWVkICVzIiAlIG5hbWUKKyAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmxvYWRfbW9kdWxlKG5hbWUsIHN0dWZmKQorCisgICAgZGVmIHJlbG9hZChzZWxmLCBtb2R1bGUsIHBhdGggPSBOb25lKToKKyAgICAgICAgbmFtZSA9IHN0cihtb2R1bGUuX19uYW1lX18pCisgICAgICAgIHN0dWZmID0gc2VsZi5sb2FkZXIuZmluZF9tb2R1bGUobmFtZSwgcGF0aCkKKyAgICAgICAgaWYgbm90IHN0dWZmOgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJNb2R1bGUgJXMgbm90IGZvdW5kIGZvciByZWxvYWQiICUgbmFtZQorICAgICAgICByZXR1cm4gc2VsZi5sb2FkZXIubG9hZF9tb2R1bGUobmFtZSwgc3R1ZmYpCisKKyAgICBkZWYgdW5sb2FkKHNlbGYsIG1vZHVsZSk6CisgICAgICAgIGRlbCBzZWxmLm1vZHVsZXNbc3RyKG1vZHVsZS5fX25hbWVfXyldCisgICAgICAgICMgWFhYIFNob3VsZCB0aGlzIHRyeSB0byBjbGVhciB0aGUgbW9kdWxlJ3MgbmFtZXNwYWNlPworCisgICAgZGVmIGluc3RhbGwoc2VsZik6CisgICAgICAgIHNlbGYuc2F2ZV9pbXBvcnRfbW9kdWxlID0gX19idWlsdGluX18uX19pbXBvcnRfXworICAgICAgICBzZWxmLnNhdmVfcmVsb2FkID0gX19idWlsdGluX18ucmVsb2FkCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKF9fYnVpbHRpbl9fLCAndW5sb2FkJyk6CisgICAgICAgICAgICBfX2J1aWx0aW5fXy51bmxvYWQgPSBOb25lCisgICAgICAgIHNlbGYuc2F2ZV91bmxvYWQgPSBfX2J1aWx0aW5fXy51bmxvYWQKKyAgICAgICAgX19idWlsdGluX18uX19pbXBvcnRfXyA9IHNlbGYuaW1wb3J0X21vZHVsZQorICAgICAgICBfX2J1aWx0aW5fXy5yZWxvYWQgPSBzZWxmLnJlbG9hZAorICAgICAgICBfX2J1aWx0aW5fXy51bmxvYWQgPSBzZWxmLnVubG9hZAorCisgICAgZGVmIHVuaW5zdGFsbChzZWxmKToKKyAgICAgICAgX19idWlsdGluX18uX19pbXBvcnRfXyA9IHNlbGYuc2F2ZV9pbXBvcnRfbW9kdWxlCisgICAgICAgIF9fYnVpbHRpbl9fLnJlbG9hZCA9IHNlbGYuc2F2ZV9yZWxvYWQKKyAgICAgICAgX19idWlsdGluX18udW5sb2FkID0gc2VsZi5zYXZlX3VubG9hZAorICAgICAgICBpZiBub3QgX19idWlsdGluX18udW5sb2FkOgorICAgICAgICAgICAgZGVsIF9fYnVpbHRpbl9fLnVubG9hZAorCisKK2NsYXNzIE1vZHVsZUltcG9ydGVyKEJhc2ljTW9kdWxlSW1wb3J0ZXIpOgorCisgICAgIiIiQSBtb2R1bGUgaW1wb3J0ZXIgdGhhdCBzdXBwb3J0cyBwYWNrYWdlcy4iIiIKKworICAgIGRlZiBpbXBvcnRfbW9kdWxlKHNlbGYsIG5hbWUsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUsIGZyb21saXN0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9LTEpOgorICAgICAgICBwYXJlbnQgPSBzZWxmLmRldGVybWluZV9wYXJlbnQoZ2xvYmFscywgbGV2ZWwpCisgICAgICAgIHEsIHRhaWwgPSBzZWxmLmZpbmRfaGVhZF9wYWNrYWdlKHBhcmVudCwgc3RyKG5hbWUpKQorICAgICAgICBtID0gc2VsZi5sb2FkX3RhaWwocSwgdGFpbCkKKyAgICAgICAgaWYgbm90IGZyb21saXN0OgorICAgICAgICAgICAgcmV0dXJuIHEKKyAgICAgICAgaWYgaGFzYXR0cihtLCAiX19wYXRoX18iKToKKyAgICAgICAgICAgIHNlbGYuZW5zdXJlX2Zyb21saXN0KG0sIGZyb21saXN0KQorICAgICAgICByZXR1cm4gbQorCisgICAgZGVmIGRldGVybWluZV9wYXJlbnQoc2VsZiwgZ2xvYmFscywgbGV2ZWw9LTEpOgorICAgICAgICBpZiBub3QgZ2xvYmFscyBvciBub3QgbGV2ZWw6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBwa2duYW1lID0gZ2xvYmFscy5nZXQoJ19fcGFja2FnZV9fJykKKyAgICAgICAgaWYgcGtnbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5vdCBwa2duYW1lIGFuZCBsZXZlbCA+IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ0F0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgaW4gbm9uLXBhY2thZ2UnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIF9fcGFja2FnZV9fIG5vdCBzZXQsIGZpZ3VyZSBpdCBvdXQgYW5kIHNldCBpdAorICAgICAgICAgICAgbW9kbmFtZSA9IGdsb2JhbHMuZ2V0KCdfX25hbWVfXycpCisgICAgICAgICAgICBpZiBtb2RuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGlmICJfX3BhdGhfXyIgaW4gZ2xvYmFsczoKKyAgICAgICAgICAgICAgICAjIF9fcGF0aF9fIGlzIHNldCBzbyBtb2RuYW1lIGlzIGFscmVhZHkgdGhlIHBhY2thZ2UgbmFtZQorICAgICAgICAgICAgICAgIHBrZ25hbWUgPSBtb2RuYW1lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgbm9ybWFsIG1vZHVsZSwgd29yayBvdXQgcGFja2FnZSBuYW1lIGlmIGFueQorICAgICAgICAgICAgICAgIGlmICcuJyBub3QgaW4gbW9kbmFtZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbGV2ZWwgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgKCdBdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGluICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9uLXBhY2thZ2UnKQorICAgICAgICAgICAgICAgICAgICBnbG9iYWxzWydfX3BhY2thZ2VfXyddID0gTm9uZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIHBrZ25hbWUgPSBtb2RuYW1lLnJwYXJ0aXRpb24oJy4nKVswXQorICAgICAgICAgICAgZ2xvYmFsc1snX19wYWNrYWdlX18nXSA9IHBrZ25hbWUKKyAgICAgICAgaWYgbGV2ZWwgPiAwOgorICAgICAgICAgICAgZG90ID0gbGVuKHBrZ25hbWUpCisgICAgICAgICAgICBmb3IgeCBpbiByYW5nZShsZXZlbCwgMSwgLTEpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZG90ID0gcGtnbmFtZS5yaW5kZXgoJy4nLCAwLCBkb3QpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2F0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgYmV5b25kICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG9wLWxldmVsIHBhY2thZ2UnKQorICAgICAgICAgICAgcGtnbmFtZSA9IHBrZ25hbWVbOmRvdF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW3BrZ25hbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGlmIGxldmVsIDwgMToKKyAgICAgICAgICAgICAgICB3YXJuKCJQYXJlbnQgbW9kdWxlICclcycgbm90IGZvdW5kIHdoaWxlIGhhbmRsaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICJhYnNvbHV0ZSBpbXBvcnQiICUgcGtnbmFtZSwgUnVudGltZVdhcm5pbmcsIDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IsICgiUGFyZW50IG1vZHVsZSAnJXMnIG5vdCBsb2FkZWQsIGNhbm5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGVyZm9ybSByZWxhdGl2ZSBpbXBvcnQiICUgcGtnbmFtZSkKKworICAgIGRlZiBmaW5kX2hlYWRfcGFja2FnZShzZWxmLCBwYXJlbnQsIG5hbWUpOgorICAgICAgICBpZiAnLicgaW4gbmFtZToKKyAgICAgICAgICAgIGkgPSBuYW1lLmZpbmQoJy4nKQorICAgICAgICAgICAgaGVhZCA9IG5hbWVbOmldCisgICAgICAgICAgICB0YWlsID0gbmFtZVtpKzE6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGVhZCA9IG5hbWUKKyAgICAgICAgICAgIHRhaWwgPSAiIgorICAgICAgICBpZiBwYXJlbnQ6CisgICAgICAgICAgICBxbmFtZSA9ICIlcy4lcyIgJSAocGFyZW50Ll9fbmFtZV9fLCBoZWFkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcW5hbWUgPSBoZWFkCisgICAgICAgIHEgPSBzZWxmLmltcG9ydF9pdChoZWFkLCBxbmFtZSwgcGFyZW50KQorICAgICAgICBpZiBxOiByZXR1cm4gcSwgdGFpbAorICAgICAgICBpZiBwYXJlbnQ6CisgICAgICAgICAgICBxbmFtZSA9IGhlYWQKKyAgICAgICAgICAgIHBhcmVudCA9IE5vbmUKKyAgICAgICAgICAgIHEgPSBzZWxmLmltcG9ydF9pdChoZWFkLCBxbmFtZSwgcGFyZW50KQorICAgICAgICAgICAgaWYgcTogcmV0dXJuIHEsIHRhaWwKKyAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJObyBtb2R1bGUgbmFtZWQgJyVzJyIgJSBxbmFtZQorCisgICAgZGVmIGxvYWRfdGFpbChzZWxmLCBxLCB0YWlsKToKKyAgICAgICAgbSA9IHEKKyAgICAgICAgd2hpbGUgdGFpbDoKKyAgICAgICAgICAgIGkgPSB0YWlsLmZpbmQoJy4nKQorICAgICAgICAgICAgaWYgaSA8IDA6IGkgPSBsZW4odGFpbCkKKyAgICAgICAgICAgIGhlYWQsIHRhaWwgPSB0YWlsWzppXSwgdGFpbFtpKzE6XQorICAgICAgICAgICAgbW5hbWUgPSAiJXMuJXMiICUgKG0uX19uYW1lX18sIGhlYWQpCisgICAgICAgICAgICBtID0gc2VsZi5pbXBvcnRfaXQoaGVhZCwgbW5hbWUsIG0pCisgICAgICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgIk5vIG1vZHVsZSBuYW1lZCAnJXMnIiAlIG1uYW1lCisgICAgICAgIHJldHVybiBtCisKKyAgICBkZWYgZW5zdXJlX2Zyb21saXN0KHNlbGYsIG0sIGZyb21saXN0LCByZWN1cnNpdmU9MCk6CisgICAgICAgIGZvciBzdWIgaW4gZnJvbWxpc3Q6CisgICAgICAgICAgICBpZiBzdWIgPT0gIioiOgorICAgICAgICAgICAgICAgIGlmIG5vdCByZWN1cnNpdmU6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbCA9IG0uX19hbGxfXworICAgICAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVuc3VyZV9mcm9tbGlzdChtLCBhbGwsIDEpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHN1YiAhPSAiKiIgYW5kIG5vdCBoYXNhdHRyKG0sIHN1Yik6CisgICAgICAgICAgICAgICAgc3VibmFtZSA9ICIlcy4lcyIgJSAobS5fX25hbWVfXywgc3ViKQorICAgICAgICAgICAgICAgIHN1Ym1vZCA9IHNlbGYuaW1wb3J0X2l0KHN1Yiwgc3VibmFtZSwgbSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc3VibW9kOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgIk5vIG1vZHVsZSBuYW1lZCAnJXMnIiAlIHN1Ym5hbWUKKworICAgIGRlZiBpbXBvcnRfaXQoc2VsZiwgcGFydG5hbWUsIGZxbmFtZSwgcGFyZW50LCBmb3JjZV9sb2FkPTApOgorICAgICAgICBpZiBub3QgcGFydG5hbWU6CisgICAgICAgICAgICAjIGNvbXBsZXRlbHkgZW1wdHkgbW9kdWxlIG5hbWUgc2hvdWxkIG9ubHkgaGFwcGVuIGluCisgICAgICAgICAgICAjICdmcm9tIC4gaW1wb3J0JyBvciBfX2ltcG9ydF9fKCIiKQorICAgICAgICAgICAgcmV0dXJuIHBhcmVudAorICAgICAgICBpZiBub3QgZm9yY2VfbG9hZDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5tb2R1bGVzW2ZxbmFtZV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhdGggPSBwYXJlbnQgYW5kIHBhcmVudC5fX3BhdGhfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBwYXJ0bmFtZSA9IHN0cihwYXJ0bmFtZSkKKyAgICAgICAgc3R1ZmYgPSBzZWxmLmxvYWRlci5maW5kX21vZHVsZShwYXJ0bmFtZSwgcGF0aCkKKyAgICAgICAgaWYgbm90IHN0dWZmOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZnFuYW1lID0gc3RyKGZxbmFtZSkKKyAgICAgICAgbSA9IHNlbGYubG9hZGVyLmxvYWRfbW9kdWxlKGZxbmFtZSwgc3R1ZmYpCisgICAgICAgIGlmIHBhcmVudDoKKyAgICAgICAgICAgIHNldGF0dHIocGFyZW50LCBwYXJ0bmFtZSwgbSkKKyAgICAgICAgcmV0dXJuIG0KKworICAgIGRlZiByZWxvYWQoc2VsZiwgbW9kdWxlKToKKyAgICAgICAgbmFtZSA9IHN0cihtb2R1bGUuX19uYW1lX18pCisgICAgICAgIGlmICcuJyBub3QgaW4gbmFtZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmltcG9ydF9pdChuYW1lLCBuYW1lLCBOb25lLCBmb3JjZV9sb2FkPTEpCisgICAgICAgIGkgPSBuYW1lLnJmaW5kKCcuJykKKyAgICAgICAgcG5hbWUgPSBuYW1lWzppXQorICAgICAgICBwYXJlbnQgPSBzZWxmLm1vZHVsZXNbcG5hbWVdCisgICAgICAgIHJldHVybiBzZWxmLmltcG9ydF9pdChuYW1lW2krMTpdLCBuYW1lLCBwYXJlbnQsIGZvcmNlX2xvYWQ9MSkKKworCitkZWZhdWx0X2ltcG9ydGVyID0gTm9uZQorY3VycmVudF9pbXBvcnRlciA9IE5vbmUKKworZGVmIGluc3RhbGwoaW1wb3J0ZXIgPSBOb25lKToKKyAgICBnbG9iYWwgY3VycmVudF9pbXBvcnRlcgorICAgIGN1cnJlbnRfaW1wb3J0ZXIgPSBpbXBvcnRlciBvciBkZWZhdWx0X2ltcG9ydGVyIG9yIE1vZHVsZUltcG9ydGVyKCkKKyAgICBjdXJyZW50X2ltcG9ydGVyLmluc3RhbGwoKQorCitkZWYgdW5pbnN0YWxsKCk6CisgICAgZ2xvYmFsIGN1cnJlbnRfaW1wb3J0ZXIKKyAgICBjdXJyZW50X2ltcG9ydGVyLnVuaW5zdGFsbCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lob29rcy5weWMgYi9saWIvcHl0aG9uMi43L2lob29rcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0NzE1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWhvb2tzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lob29rcy5weW8gYi9saWIvcHl0aG9uMi43L2lob29rcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ0NzE1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWhvb2tzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ltYXBsaWIucHkgYi9saWIvcHl0aG9uMi43L2ltYXBsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3NjkyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW1hcGxpYi5weQpAQCAtMCwwICsxLDE1MTggQEAKKyIiIklNQVA0IGNsaWVudC4KKworQmFzZWQgb24gUkZDIDIwNjAuCisKK1B1YmxpYyBjbGFzczogICAgICAgICAgIElNQVA0CitQdWJsaWMgdmFyaWFibGU6ICAgICAgICBEZWJ1ZworUHVibGljIGZ1bmN0aW9uczogICAgICAgSW50ZXJuYWxkYXRlMnR1cGxlCisgICAgICAgICAgICAgICAgICAgICAgICBJbnQyQVAKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlRmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUySW50ZXJuYWxkYXRlCisiIiIKKworIyBBdXRob3I6IFBpZXJzIExhdWRlciA8cGllcnNAY3Muc3Uub3ouYXU+IERlY2VtYmVyIDE5OTcuCisjCisjIEF1dGhlbnRpY2F0aW9uIGNvZGUgY29udHJpYnV0ZWQgYnkgRG9ubiBDYXZlIDxkb25uQHUud2FzaGluZ3Rvbi5lZHU+IEp1bmUgMTk5OC4KKyMgU3RyaW5nIG1ldGhvZCBjb252ZXJzaW9uIGJ5IEVTUiwgRmVicnVhcnkgMjAwMS4KKyMgR0VUL1NFVEFDTCBjb250cmlidXRlZCBieSBBbnRob255IEJheHRlciA8YW50aG9ueUBpbnRlcmxpbmsuY29tLmF1PiBBcHJpbCAyMDAxLgorIyBJTUFQNF9TU0wgY29udHJpYnV0ZWQgYnkgVGlubyBMYW5nZSA8VGluby5MYW5nZUBpc2cuZGU+IE1hcmNoIDIwMDIuCisjIEdFVC9TRVRRVU9UQSBjb250cmlidXRlZCBieSBBbmRyZWFzIFplaWRsZXIgPGF6QGtyZWF0aXZrb21iaW5hdC5kZT4gSnVuZSAyMDAyLgorIyBQUk9YWUFVVEggY29udHJpYnV0ZWQgYnkgUmljayBIb2xiZXJ0IDxob2xiZXJ0LjEzQG9zdS5lZHU+IE5vdmVtYmVyIDIwMDIuCisjIEdFVC9TRVRBTk5PVEFUSU9OIGNvbnRyaWJ1dGVkIGJ5IFRvbWFzIExpbmRyb29zIDxza2l0dGFAYWJvLmZpPiBKdW5lIDIwMDUuCisKK19fdmVyc2lvbl9fID0gIjIuNTgiCisKK2ltcG9ydCBiaW5hc2NpaSwgZXJybm8sIHJhbmRvbSwgcmUsIHNvY2tldCwgc3VicHJvY2Vzcywgc3lzLCB0aW1lCisKK19fYWxsX18gPSBbIklNQVA0IiwgIklNQVA0X3N0cmVhbSIsICJJbnRlcm5hbGRhdGUydHVwbGUiLAorICAgICAgICAgICAiSW50MkFQIiwgIlBhcnNlRmxhZ3MiLCAiVGltZTJJbnRlcm5hbGRhdGUiXQorCisjICAgICAgIEdsb2JhbHMKKworQ1JMRiA9ICdcclxuJworRGVidWcgPSAwCitJTUFQNF9QT1JUID0gMTQzCitJTUFQNF9TU0xfUE9SVCA9IDk5MworQWxsb3dlZFZlcnNpb25zID0gKCdJTUFQNFJFVjEnLCAnSU1BUDQnKSAgICAgICAgIyBNb3N0IHJlY2VudCBmaXJzdAorCisjICAgICAgIENvbW1hbmRzCisKK0NvbW1hbmRzID0geworICAgICAgICAjIG5hbWUgICAgICAgICAgICB2YWxpZCBzdGF0ZXMKKyAgICAgICAgJ0FQUEVORCc6ICAgICAgICgnQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICAnQVVUSEVOVElDQVRFJzogKCdOT05BVVRIJywpLAorICAgICAgICAnQ0FQQUJJTElUWSc6ICAgKCdOT05BVVRIJywgJ0FVVEgnLCAnU0VMRUNURUQnLCAnTE9HT1VUJyksCisgICAgICAgICdDSEVDSyc6ICAgICAgICAoJ1NFTEVDVEVEJywpLAorICAgICAgICAnQ0xPU0UnOiAgICAgICAgKCdTRUxFQ1RFRCcsKSwKKyAgICAgICAgJ0NPUFknOiAgICAgICAgICgnU0VMRUNURUQnLCksCisgICAgICAgICdDUkVBVEUnOiAgICAgICAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ0RFTEVURSc6ICAgICAgICgnQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICAnREVMRVRFQUNMJzogICAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdFWEFNSU5FJzogICAgICAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ0VYUFVOR0UnOiAgICAgICgnU0VMRUNURUQnLCksCisgICAgICAgICdGRVRDSCc6ICAgICAgICAoJ1NFTEVDVEVEJywpLAorICAgICAgICAnR0VUQUNMJzogICAgICAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdHRVRBTk5PVEFUSU9OJzooJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ0dFVFFVT1RBJzogICAgICgnQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICAnR0VUUVVPVEFST09UJzogKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdNWVJJR0hUUyc6ICAgICAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ0xJU1QnOiAgICAgICAgICgnQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICAnTE9HSU4nOiAgICAgICAgKCdOT05BVVRIJywpLAorICAgICAgICAnTE9HT1VUJzogICAgICAgKCdOT05BVVRIJywgJ0FVVEgnLCAnU0VMRUNURUQnLCAnTE9HT1VUJyksCisgICAgICAgICdMU1VCJzogICAgICAgICAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ05BTUVTUEFDRSc6ICAgICgnQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICAnTk9PUCc6ICAgICAgICAgKCdOT05BVVRIJywgJ0FVVEgnLCAnU0VMRUNURUQnLCAnTE9HT1VUJyksCisgICAgICAgICdQQVJUSUFMJzogICAgICAoJ1NFTEVDVEVEJywpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5COiBvYnNvbGV0ZQorICAgICAgICAnUFJPWFlBVVRIJzogICAgKCdBVVRIJywpLAorICAgICAgICAnUkVOQU1FJzogICAgICAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdTRUFSQ0gnOiAgICAgICAoJ1NFTEVDVEVEJywpLAorICAgICAgICAnU0VMRUNUJzogICAgICAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdTRVRBQ0wnOiAgICAgICAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ1NFVEFOTk9UQVRJT04nOignQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICAnU0VUUVVPVEEnOiAgICAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdTT1JUJzogICAgICAgICAoJ1NFTEVDVEVEJywpLAorICAgICAgICAnU1RBVFVTJzogICAgICAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdTVE9SRSc6ICAgICAgICAoJ1NFTEVDVEVEJywpLAorICAgICAgICAnU1VCU0NSSUJFJzogICAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdUSFJFQUQnOiAgICAgICAoJ1NFTEVDVEVEJywpLAorICAgICAgICAnVUlEJzogICAgICAgICAgKCdTRUxFQ1RFRCcsKSwKKyAgICAgICAgJ1VOU1VCU0NSSUJFJzogICgnQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICB9CisKKyMgICAgICAgUGF0dGVybnMgdG8gbWF0Y2ggc2VydmVyIHJlc3BvbnNlcworCitDb250aW51YXRpb24gPSByZS5jb21waWxlKHInXCsoICg/UDxkYXRhPi4qKSk/JykKK0ZsYWdzID0gcmUuY29tcGlsZShyJy4qRkxBR1MgXCgoP1A8ZmxhZ3M+W15cKV0qKVwpJykKK0ludGVybmFsRGF0ZSA9IHJlLmNvbXBpbGUocicuKklOVEVSTkFMREFURSAiJworICAgICAgICByJyg/UDxkYXk+WyAwMTIzXVswLTldKS0oP1A8bW9uPltBLVpdW2Etel1bYS16XSktKD9QPHllYXI+WzAtOV1bMC05XVswLTldWzAtOV0pJworICAgICAgICByJyAoP1A8aG91cj5bMC05XVswLTldKTooP1A8bWluPlswLTldWzAtOV0pOig/UDxzZWM+WzAtOV1bMC05XSknCisgICAgICAgIHInICg/UDx6b25lbj5bLStdKSg/UDx6b25laD5bMC05XVswLTldKSg/UDx6b25lbT5bMC05XVswLTldKScKKyAgICAgICAgciciJykKK0xpdGVyYWwgPSByZS5jb21waWxlKHInLip7KD9QPHNpemU+XGQrKX0kJykKK01hcENSTEYgPSByZS5jb21waWxlKHInXHJcbnxccnxcbicpCitSZXNwb25zZV9jb2RlID0gcmUuY29tcGlsZShyJ1xbKD9QPHR5cGU+W0EtWi1dKykoICg/UDxkYXRhPlteXF1dKikpP1xdJykKK1VudGFnZ2VkX3Jlc3BvbnNlID0gcmUuY29tcGlsZShyJ1wqICg/UDx0eXBlPltBLVotXSspKCAoP1A8ZGF0YT4uKikpPycpCitVbnRhZ2dlZF9zdGF0dXMgPSByZS5jb21waWxlKHInXCogKD9QPGRhdGE+XGQrKSAoP1A8dHlwZT5bQS1aLV0rKSggKD9QPGRhdGEyPi4qKSk/JykKKworCisKK2NsYXNzIElNQVA0OgorCisgICAgIiIiSU1BUDQgY2xpZW50IGNsYXNzLgorCisgICAgSW5zdGFudGlhdGUgd2l0aDogSU1BUDQoW2hvc3RbLCBwb3J0XV0pCisKKyAgICAgICAgICAgIGhvc3QgLSBob3N0J3MgbmFtZSAoZGVmYXVsdDogbG9jYWxob3N0KTsKKyAgICAgICAgICAgIHBvcnQgLSBwb3J0IG51bWJlciAoZGVmYXVsdDogc3RhbmRhcmQgSU1BUDQgcG9ydCkuCisKKyAgICBBbGwgSU1BUDRyZXYxIGNvbW1hbmRzIGFyZSBzdXBwb3J0ZWQgYnkgbWV0aG9kcyBvZiB0aGUgc2FtZQorICAgIG5hbWUgKGluIGxvd2VyLWNhc2UpLgorCisgICAgQWxsIGFyZ3VtZW50cyB0byBjb21tYW5kcyBhcmUgY29udmVydGVkIHRvIHN0cmluZ3MsIGV4Y2VwdCBmb3IKKyAgICBBVVRIRU5USUNBVEUsIGFuZCB0aGUgbGFzdCBhcmd1bWVudCB0byBBUFBFTkQgd2hpY2ggaXMgcGFzc2VkIGFzCisgICAgYW4gSU1BUDQgbGl0ZXJhbC4gIElmIG5lY2Vzc2FyeSAodGhlIHN0cmluZyBjb250YWlucyBhbnkKKyAgICBub24tcHJpbnRpbmcgY2hhcmFjdGVycyBvciB3aGl0ZS1zcGFjZSBhbmQgaXNuJ3QgZW5jbG9zZWQgd2l0aAorICAgIGVpdGhlciBwYXJlbnRoZXNlcyBvciBkb3VibGUgcXVvdGVzKSBlYWNoIHN0cmluZyBpcyBxdW90ZWQuCisgICAgSG93ZXZlciwgdGhlICdwYXNzd29yZCcgYXJndW1lbnQgdG8gdGhlIExPR0lOIGNvbW1hbmQgaXMgYWx3YXlzCisgICAgcXVvdGVkLiAgSWYgeW91IHdhbnQgdG8gYXZvaWQgaGF2aW5nIGFuIGFyZ3VtZW50IHN0cmluZyBxdW90ZWQKKyAgICAoZWc6IHRoZSAnZmxhZ3MnIGFyZ3VtZW50IHRvIFNUT1JFKSB0aGVuIGVuY2xvc2UgdGhlIHN0cmluZyBpbgorICAgIHBhcmVudGhlc2VzIChlZzogIihcRGVsZXRlZCkiKS4KKworICAgIEVhY2ggY29tbWFuZCByZXR1cm5zIGEgdHVwbGU6ICh0eXBlLCBbZGF0YSwgLi4uXSkgd2hlcmUgJ3R5cGUnCisgICAgaXMgdXN1YWxseSAnT0snIG9yICdOTycsIGFuZCAnZGF0YScgaXMgZWl0aGVyIHRoZSB0ZXh0IGZyb20gdGhlCisgICAgdGFnZ2VkIHJlc3BvbnNlLCBvciB1bnRhZ2dlZCByZXN1bHRzIGZyb20gY29tbWFuZC4gRWFjaCAnZGF0YScKKyAgICBpcyBlaXRoZXIgYSBzdHJpbmcsIG9yIGEgdHVwbGUuIElmIGEgdHVwbGUsIHRoZW4gdGhlIGZpcnN0IHBhcnQKKyAgICBpcyB0aGUgaGVhZGVyIG9mIHRoZSByZXNwb25zZSwgYW5kIHRoZSBzZWNvbmQgcGFydCBjb250YWlucworICAgIHRoZSBkYXRhIChpZTogJ2xpdGVyYWwnIHZhbHVlKS4KKworICAgIEVycm9ycyByYWlzZSB0aGUgZXhjZXB0aW9uIGNsYXNzIDxpbnN0YW5jZT4uZXJyb3IoIjxyZWFzb24+IikuCisgICAgSU1BUDQgc2VydmVyIGVycm9ycyByYWlzZSA8aW5zdGFuY2U+LmFib3J0KCI8cmVhc29uPiIpLAorICAgIHdoaWNoIGlzIGEgc3ViLWNsYXNzIG9mICdlcnJvcicuIE1haWxib3ggc3RhdHVzIGNoYW5nZXMKKyAgICBmcm9tIFJFQUQtV1JJVEUgdG8gUkVBRC1PTkxZIHJhaXNlIHRoZSBleGNlcHRpb24gY2xhc3MKKyAgICA8aW5zdGFuY2U+LnJlYWRvbmx5KCI8cmVhc29uPiIpLCB3aGljaCBpcyBhIHN1Yi1jbGFzcyBvZiAnYWJvcnQnLgorCisgICAgImVycm9yIiBleGNlcHRpb25zIGltcGx5IGEgcHJvZ3JhbSBlcnJvci4KKyAgICAiYWJvcnQiIGV4Y2VwdGlvbnMgaW1wbHkgdGhlIGNvbm5lY3Rpb24gc2hvdWxkIGJlIHJlc2V0LCBhbmQKKyAgICAgICAgICAgIHRoZSBjb21tYW5kIHJlLXRyaWVkLgorICAgICJyZWFkb25seSIgZXhjZXB0aW9ucyBpbXBseSB0aGUgY29tbWFuZCBzaG91bGQgYmUgcmUtdHJpZWQuCisKKyAgICBOb3RlOiB0byB1c2UgdGhpcyBtb2R1bGUsIHlvdSBtdXN0IHJlYWQgdGhlIFJGQ3MgcGVydGFpbmluZyB0byB0aGUKKyAgICBJTUFQNCBwcm90b2NvbCwgYXMgdGhlIHNlbWFudGljcyBvZiB0aGUgYXJndW1lbnRzIHRvIGVhY2ggSU1BUDQKKyAgICBjb21tYW5kIGFyZSBsZWZ0IHRvIHRoZSBpbnZva2VyLCBub3QgdG8gbWVudGlvbiB0aGUgcmVzdWx0cy4gQWxzbywKKyAgICBtb3N0IElNQVAgc2VydmVycyBpbXBsZW1lbnQgYSBzdWItc2V0IG9mIHRoZSBjb21tYW5kcyBhdmFpbGFibGUgaGVyZS4KKyAgICAiIiIKKworICAgIGNsYXNzIGVycm9yKEV4Y2VwdGlvbik6IHBhc3MgICAgIyBMb2dpY2FsIGVycm9ycyAtIGRlYnVnIHJlcXVpcmVkCisgICAgY2xhc3MgYWJvcnQoZXJyb3IpOiBwYXNzICAgICAgICAjIFNlcnZpY2UgZXJyb3JzIC0gY2xvc2UgYW5kIHJldHJ5CisgICAgY2xhc3MgcmVhZG9ubHkoYWJvcnQpOiBwYXNzICAgICAjIE1haWxib3ggc3RhdHVzIGNoYW5nZWQgdG8gUkVBRC1PTkxZCisKKyAgICBtdXN0cXVvdGUgPSByZS5jb21waWxlKHIiW15cdyEjJCUmJyorLC46Ozw9Pj9eYHx+LV0iKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QgPSAnJywgcG9ydCA9IElNQVA0X1BPUlQpOgorICAgICAgICBzZWxmLmRlYnVnID0gRGVidWcKKyAgICAgICAgc2VsZi5zdGF0ZSA9ICdMT0dPVVQnCisgICAgICAgIHNlbGYubGl0ZXJhbCA9IE5vbmUgICAgICAgICAgICAgIyBBIGxpdGVyYWwgYXJndW1lbnQgdG8gYSBjb21tYW5kCisgICAgICAgIHNlbGYudGFnZ2VkX2NvbW1hbmRzID0ge30gICAgICAgIyBUYWdnZWQgY29tbWFuZHMgYXdhaXRpbmcgcmVzcG9uc2UKKyAgICAgICAgc2VsZi51bnRhZ2dlZF9yZXNwb25zZXMgPSB7fSAgICAjIHt0eXA6IFtkYXRhLCAuLi5dLCAuLi59CisgICAgICAgIHNlbGYuY29udGludWF0aW9uX3Jlc3BvbnNlID0gJycgIyBMYXN0IGNvbnRpbnVhdGlvbiByZXNwb25zZQorICAgICAgICBzZWxmLmlzX3JlYWRvbmx5ID0gRmFsc2UgICAgICAgICMgUkVBRC1PTkxZIGRlc2lyZWQgc3RhdGUKKyAgICAgICAgc2VsZi50YWdudW0gPSAwCisKKyAgICAgICAgIyBPcGVuIHNvY2tldCB0byBzZXJ2ZXIuCisKKyAgICAgICAgc2VsZi5vcGVuKGhvc3QsIHBvcnQpCisKKyAgICAgICAgIyBDcmVhdGUgdW5pcXVlIHRhZyBmb3IgdGhpcyBzZXNzaW9uLAorICAgICAgICAjIGFuZCBjb21waWxlIHRhZ2dlZCByZXNwb25zZSBtYXRjaGVyLgorCisgICAgICAgIHNlbGYudGFncHJlID0gSW50MkFQKHJhbmRvbS5yYW5kaW50KDQwOTYsIDY1NTM1KSkKKyAgICAgICAgc2VsZi50YWdyZSA9IHJlLmNvbXBpbGUocicoP1A8dGFnPicKKyAgICAgICAgICAgICAgICAgICAgICAgICsgc2VsZi50YWdwcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcidcZCspICg/UDx0eXBlPltBLVpdKykgKD9QPGRhdGE+LiopJykKKworICAgICAgICAjIEdldCBzZXJ2ZXIgd2VsY29tZSBtZXNzYWdlLAorICAgICAgICAjIHJlcXVlc3QgYW5kIHN0b3JlIENBUEFCSUxJVFkgcmVzcG9uc2UuCisKKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgc2VsZi5fY21kX2xvZ19sZW4gPSAxMAorICAgICAgICAgICAgc2VsZi5fY21kX2xvZ19pZHggPSAwCisgICAgICAgICAgICBzZWxmLl9jbWRfbG9nID0ge30gICAgICAgICAgICMgTGFzdCBgX2NtZF9sb2dfbGVuJyBpbnRlcmFjdGlvbnMKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMToKKyAgICAgICAgICAgICAgICBzZWxmLl9tZXNnKCdpbWFwbGliIHZlcnNpb24gJXMnICUgX192ZXJzaW9uX18pCisgICAgICAgICAgICAgICAgc2VsZi5fbWVzZygnbmV3IElNQVA0IGNvbm5lY3Rpb24sIHRhZz0lcycgJSBzZWxmLnRhZ3ByZSkKKworICAgICAgICBzZWxmLndlbGNvbWUgPSBzZWxmLl9nZXRfcmVzcG9uc2UoKQorICAgICAgICBpZiAnUFJFQVVUSCcgaW4gc2VsZi51bnRhZ2dlZF9yZXNwb25zZXM6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ0FVVEgnCisgICAgICAgIGVsaWYgJ09LJyBpbiBzZWxmLnVudGFnZ2VkX3Jlc3BvbnNlczoKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnTk9OQVVUSCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZXJyb3Ioc2VsZi53ZWxjb21lKQorCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5jYXBhYmlsaXR5KCkKKyAgICAgICAgaWYgZGF0ID09IFtOb25lXToKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZXJyb3IoJ25vIENBUEFCSUxJVFkgcmVzcG9uc2UgZnJvbSBzZXJ2ZXInKQorICAgICAgICBzZWxmLmNhcGFiaWxpdGllcyA9IHR1cGxlKGRhdFstMV0udXBwZXIoKS5zcGxpdCgpKQorCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMzoKKyAgICAgICAgICAgICAgICBzZWxmLl9tZXNnKCdDQVBBQklMSVRJRVM6ICVyJyAlIChzZWxmLmNhcGFiaWxpdGllcywpKQorCisgICAgICAgIGZvciB2ZXJzaW9uIGluIEFsbG93ZWRWZXJzaW9uczoKKyAgICAgICAgICAgIGlmIG5vdCB2ZXJzaW9uIGluIHNlbGYuY2FwYWJpbGl0aWVzOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLlBST1RPQ09MX1ZFUlNJT04gPSB2ZXJzaW9uCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICByYWlzZSBzZWxmLmVycm9yKCdzZXJ2ZXIgbm90IElNQVA0IGNvbXBsaWFudCcpCisKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgIyAgICAgICBBbGxvdyBVUFBFUkNBU0UgdmFyaWFudHMgb2YgSU1BUDQgY29tbWFuZCBtZXRob2RzLgorICAgICAgICBpZiBhdHRyIGluIENvbW1hbmRzOgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgYXR0ci5sb3dlcigpKQorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiVW5rbm93biBJTUFQNCBjb21tYW5kOiAnJXMnIiAlIGF0dHIpCisKKworCisgICAgIyAgICAgICBPdmVycmlkYWJsZSBtZXRob2RzCisKKworICAgIGRlZiBvcGVuKHNlbGYsIGhvc3QgPSAnJywgcG9ydCA9IElNQVA0X1BPUlQpOgorICAgICAgICAiIiJTZXR1cCBjb25uZWN0aW9uIHRvIHJlbW90ZSBzZXJ2ZXIgb24gImhvc3Q6cG9ydCIKKyAgICAgICAgICAgIChkZWZhdWx0OiBsb2NhbGhvc3Q6c3RhbmRhcmQgSU1BUDQgcG9ydCkuCisgICAgICAgIFRoaXMgY29ubmVjdGlvbiB3aWxsIGJlIHVzZWQgYnkgdGhlIHJvdXRpbmVzOgorICAgICAgICAgICAgcmVhZCwgcmVhZGxpbmUsIHNlbmQsIHNodXRkb3duLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoaG9zdCwgcG9ydCkpCisgICAgICAgIHNlbGYuZmlsZSA9IHNlbGYuc29jay5tYWtlZmlsZSgncmInKQorCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplKToKKyAgICAgICAgIiIiUmVhZCAnc2l6ZScgYnl0ZXMgZnJvbSByZW1vdGUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmZpbGUucmVhZChzaXplKQorCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgICIiIlJlYWQgbGluZSBmcm9tIHJlbW90ZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZmlsZS5yZWFkbGluZSgpCisKKworICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiJTZW5kIGRhdGEgdG8gcmVtb3RlLiIiIgorICAgICAgICBzZWxmLnNvY2suc2VuZGFsbChkYXRhKQorCisKKyAgICBkZWYgc2h1dGRvd24oc2VsZik6CisgICAgICAgICIiIkNsb3NlIEkvTyBlc3RhYmxpc2hlZCBpbiAib3BlbiIuIiIiCisgICAgICAgIHNlbGYuZmlsZS5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc29jay5zaHV0ZG93bihzb2NrZXQuU0hVVF9SRFdSKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6CisgICAgICAgICAgICAjIFRoZSBzZXJ2ZXIgbWlnaHQgYWxyZWFkeSBoYXZlIGNsb3NlZCB0aGUgY29ubmVjdGlvbgorICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FTk9UQ09OTjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKworCisgICAgZGVmIHNvY2tldChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHNvY2tldCBpbnN0YW5jZSB1c2VkIHRvIGNvbm5lY3QgdG8gSU1BUDQgc2VydmVyLgorCisgICAgICAgIHNvY2tldCA9IDxpbnN0YW5jZT4uc29ja2V0KCkKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNvY2sKKworCisKKyAgICAjICAgICAgIFV0aWxpdHkgbWV0aG9kcworCisKKyAgICBkZWYgcmVjZW50KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbW9zdCByZWNlbnQgJ1JFQ0VOVCcgcmVzcG9uc2VzIGlmIGFueSBleGlzdCwKKyAgICAgICAgZWxzZSBwcm9tcHQgc2VydmVyIGZvciBhbiB1cGRhdGUgdXNpbmcgdGhlICdOT09QJyBjb21tYW5kLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LnJlY2VudCgpCisKKyAgICAgICAgJ2RhdGEnIGlzIE5vbmUgaWYgbm8gbmV3IG1lc3NhZ2VzLAorICAgICAgICBlbHNlIGxpc3Qgb2YgUkVDRU5UIHJlc3BvbnNlcywgbW9zdCByZWNlbnQgbGFzdC4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSAnUkVDRU5UJworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKCdPSycsIFtOb25lXSwgbmFtZSkKKyAgICAgICAgaWYgZGF0Wy0xXToKKyAgICAgICAgICAgIHJldHVybiB0eXAsIGRhdAorICAgICAgICB0eXAsIGRhdCA9IHNlbGYubm9vcCgpICAjIFByb2Qgc2VydmVyIGZvciByZXNwb25zZQorICAgICAgICByZXR1cm4gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UodHlwLCBkYXQsIG5hbWUpCisKKworICAgIGRlZiByZXNwb25zZShzZWxmLCBjb2RlKToKKyAgICAgICAgIiIiUmV0dXJuIGRhdGEgZm9yIHJlc3BvbnNlICdjb2RlJyBpZiByZWNlaXZlZCwgb3IgTm9uZS4KKworICAgICAgICBPbGQgdmFsdWUgZm9yIHJlc3BvbnNlICdjb2RlJyBpcyBjbGVhcmVkLgorCisgICAgICAgIChjb2RlLCBbZGF0YV0pID0gPGluc3RhbmNlPi5yZXNwb25zZShjb2RlKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKGNvZGUsIFtOb25lXSwgY29kZS51cHBlcigpKQorCisKKworICAgICMgICAgICAgSU1BUDQgY29tbWFuZHMKKworCisgICAgZGVmIGFwcGVuZChzZWxmLCBtYWlsYm94LCBmbGFncywgZGF0ZV90aW1lLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQXBwZW5kIG1lc3NhZ2UgdG8gbmFtZWQgbWFpbGJveC4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5hcHBlbmQobWFpbGJveCwgZmxhZ3MsIGRhdGVfdGltZSwgbWVzc2FnZSkKKworICAgICAgICAgICAgICAgIEFsbCBhcmdzIGV4Y2VwdCBgbWVzc2FnZScgY2FuIGJlIE5vbmUuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gJ0FQUEVORCcKKyAgICAgICAgaWYgbm90IG1haWxib3g6CisgICAgICAgICAgICBtYWlsYm94ID0gJ0lOQk9YJworICAgICAgICBpZiBmbGFnczoKKyAgICAgICAgICAgIGlmIChmbGFnc1swXSxmbGFnc1stMV0pICE9ICgnKCcsJyknKToKKyAgICAgICAgICAgICAgICBmbGFncyA9ICcoJXMpJyAlIGZsYWdzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbGFncyA9IE5vbmUKKyAgICAgICAgaWYgZGF0ZV90aW1lOgorICAgICAgICAgICAgZGF0ZV90aW1lID0gVGltZTJJbnRlcm5hbGRhdGUoZGF0ZV90aW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0ZV90aW1lID0gTm9uZQorICAgICAgICBzZWxmLmxpdGVyYWwgPSBNYXBDUkxGLnN1YihDUkxGLCBtZXNzYWdlKQorICAgICAgICByZXR1cm4gc2VsZi5fc2ltcGxlX2NvbW1hbmQobmFtZSwgbWFpbGJveCwgZmxhZ3MsIGRhdGVfdGltZSkKKworCisgICAgZGVmIGF1dGhlbnRpY2F0ZShzZWxmLCBtZWNoYW5pc20sIGF1dGhvYmplY3QpOgorICAgICAgICAiIiJBdXRoZW50aWNhdGUgY29tbWFuZCAtIHJlcXVpcmVzIHJlc3BvbnNlIHByb2Nlc3NpbmcuCisKKyAgICAgICAgJ21lY2hhbmlzbScgc3BlY2lmaWVzIHdoaWNoIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBpcyB0bworICAgICAgICBiZSB1c2VkIC0gaXQgbXVzdCBhcHBlYXIgaW4gPGluc3RhbmNlPi5jYXBhYmlsaXRpZXMgaW4gdGhlCisgICAgICAgIGZvcm0gQVVUSD08bWVjaGFuaXNtPi4KKworICAgICAgICAnYXV0aG9iamVjdCcgbXVzdCBiZSBhIGNhbGxhYmxlIG9iamVjdDoKKworICAgICAgICAgICAgICAgIGRhdGEgPSBhdXRob2JqZWN0KHJlc3BvbnNlKQorCisgICAgICAgIEl0IHdpbGwgYmUgY2FsbGVkIHRvIHByb2Nlc3Mgc2VydmVyIGNvbnRpbnVhdGlvbiByZXNwb25zZXMuCisgICAgICAgIEl0IHNob3VsZCByZXR1cm4gZGF0YSB0aGF0IHdpbGwgYmUgZW5jb2RlZCBhbmQgc2VudCB0byBzZXJ2ZXIuCisgICAgICAgIEl0IHNob3VsZCByZXR1cm4gTm9uZSBpZiB0aGUgY2xpZW50IGFib3J0IHJlc3BvbnNlICcqJyBzaG91bGQKKyAgICAgICAgYmUgc2VudCBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgbWVjaCA9IG1lY2hhbmlzbS51cHBlcigpCisgICAgICAgICMgWFhYOiBzaG91bGRuJ3QgdGhpcyBjb2RlIGJlIHJlbW92ZWQsIG5vdCBjb21tZW50ZWQgb3V0PworICAgICAgICAjY2FwID0gJ0FVVEg9JXMnICUgbWVjaAorICAgICAgICAjaWYgbm90IGNhcCBpbiBzZWxmLmNhcGFiaWxpdGllczogICAgICAgIyBMZXQgdGhlIHNlcnZlciBkZWNpZGUhCisgICAgICAgICMgICAgcmFpc2Ugc2VsZi5lcnJvcigiU2VydmVyIGRvZXNuJ3QgYWxsb3cgJXMgYXV0aGVudGljYXRpb24uIiAlIG1lY2gpCisgICAgICAgIHNlbGYubGl0ZXJhbCA9IF9BdXRoZW50aWNhdG9yKGF1dGhvYmplY3QpLnByb2Nlc3MKKyAgICAgICAgdHlwLCBkYXQgPSBzZWxmLl9zaW1wbGVfY29tbWFuZCgnQVVUSEVOVElDQVRFJywgbWVjaCkKKyAgICAgICAgaWYgdHlwICE9ICdPSyc6CisgICAgICAgICAgICByYWlzZSBzZWxmLmVycm9yKGRhdFstMV0pCisgICAgICAgIHNlbGYuc3RhdGUgPSAnQVVUSCcKKyAgICAgICAgcmV0dXJuIHR5cCwgZGF0CisKKworICAgIGRlZiBjYXBhYmlsaXR5KHNlbGYpOgorICAgICAgICAiIiIodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5jYXBhYmlsaXR5KCkKKyAgICAgICAgRmV0Y2ggY2FwYWJpbGl0aWVzIGxpc3QgZnJvbSBzZXJ2ZXIuIiIiCisKKyAgICAgICAgbmFtZSA9ICdDQVBBQklMSVRZJworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKG5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgbmFtZSkKKworCisgICAgZGVmIGNoZWNrKHNlbGYpOgorICAgICAgICAiIiJDaGVja3BvaW50IG1haWxib3ggb24gc2VydmVyLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LmNoZWNrKCkKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9zaW1wbGVfY29tbWFuZCgnQ0hFQ0snKQorCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkNsb3NlIGN1cnJlbnRseSBzZWxlY3RlZCBtYWlsYm94LgorCisgICAgICAgIERlbGV0ZWQgbWVzc2FnZXMgYXJlIHJlbW92ZWQgZnJvbSB3cml0YWJsZSBtYWlsYm94LgorICAgICAgICBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBjb21tYW5kIGJlZm9yZSAnTE9HT1VUJy4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5jbG9zZSgpCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKCdDTE9TRScpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ0FVVEgnCisgICAgICAgIHJldHVybiB0eXAsIGRhdAorCisKKyAgICBkZWYgY29weShzZWxmLCBtZXNzYWdlX3NldCwgbmV3X21haWxib3gpOgorICAgICAgICAiIiJDb3B5ICdtZXNzYWdlX3NldCcgbWVzc2FnZXMgb250byBlbmQgb2YgJ25ld19tYWlsYm94Jy4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5jb3B5KG1lc3NhZ2Vfc2V0LCBuZXdfbWFpbGJveCkKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9zaW1wbGVfY29tbWFuZCgnQ09QWScsIG1lc3NhZ2Vfc2V0LCBuZXdfbWFpbGJveCkKKworCisgICAgZGVmIGNyZWF0ZShzZWxmLCBtYWlsYm94KToKKyAgICAgICAgIiIiQ3JlYXRlIG5ldyBtYWlsYm94LgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LmNyZWF0ZShtYWlsYm94KQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NpbXBsZV9jb21tYW5kKCdDUkVBVEUnLCBtYWlsYm94KQorCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIG1haWxib3gpOgorICAgICAgICAiIiJEZWxldGUgb2xkIG1haWxib3guCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4uZGVsZXRlKG1haWxib3gpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ0RFTEVURScsIG1haWxib3gpCisKKyAgICBkZWYgZGVsZXRlYWNsKHNlbGYsIG1haWxib3gsIHdobyk6CisgICAgICAgICIiIkRlbGV0ZSB0aGUgQUNMcyAocmVtb3ZlIGFueSByaWdodHMpIHNldCBmb3Igd2hvIG9uIG1haWxib3guCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4uZGVsZXRlYWNsKG1haWxib3gsIHdobykKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9zaW1wbGVfY29tbWFuZCgnREVMRVRFQUNMJywgbWFpbGJveCwgd2hvKQorCisgICAgZGVmIGV4cHVuZ2Uoc2VsZik6CisgICAgICAgICIiIlBlcm1hbmVudGx5IHJlbW92ZSBkZWxldGVkIGl0ZW1zIGZyb20gc2VsZWN0ZWQgbWFpbGJveC4KKworICAgICAgICBHZW5lcmF0ZXMgJ0VYUFVOR0UnIHJlc3BvbnNlIGZvciBlYWNoIGRlbGV0ZWQgbWVzc2FnZS4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5leHB1bmdlKCkKKworICAgICAgICAnZGF0YScgaXMgbGlzdCBvZiAnRVhQVU5HRSdkIG1lc3NhZ2UgbnVtYmVycyBpbiBvcmRlciByZWNlaXZlZC4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSAnRVhQVU5HRScKKyAgICAgICAgdHlwLCBkYXQgPSBzZWxmLl9zaW1wbGVfY29tbWFuZChuYW1lKQorICAgICAgICByZXR1cm4gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UodHlwLCBkYXQsIG5hbWUpCisKKworICAgIGRlZiBmZXRjaChzZWxmLCBtZXNzYWdlX3NldCwgbWVzc2FnZV9wYXJ0cyk6CisgICAgICAgICIiIkZldGNoIChwYXJ0cyBvZikgbWVzc2FnZXMuCisKKyAgICAgICAgKHR5cCwgW2RhdGEsIC4uLl0pID0gPGluc3RhbmNlPi5mZXRjaChtZXNzYWdlX3NldCwgbWVzc2FnZV9wYXJ0cykKKworICAgICAgICAnbWVzc2FnZV9wYXJ0cycgc2hvdWxkIGJlIGEgc3RyaW5nIG9mIHNlbGVjdGVkIHBhcnRzCisgICAgICAgIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLCBlZzogIihVSUQgQk9EWVtURVhUXSkiLgorCisgICAgICAgICdkYXRhJyBhcmUgdHVwbGVzIG9mIG1lc3NhZ2UgcGFydCBlbnZlbG9wZSBhbmQgZGF0YS4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSAnRkVUQ0gnCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQobmFtZSwgbWVzc2FnZV9zZXQsIG1lc3NhZ2VfcGFydHMpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgbmFtZSkKKworCisgICAgZGVmIGdldGFjbChzZWxmLCBtYWlsYm94KToKKyAgICAgICAgIiIiR2V0IHRoZSBBQ0xzIGZvciBhIG1haWxib3guCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4uZ2V0YWNsKG1haWxib3gpCisgICAgICAgICIiIgorICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKCdHRVRBQ0wnLCBtYWlsYm94KQorICAgICAgICByZXR1cm4gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UodHlwLCBkYXQsICdBQ0wnKQorCisKKyAgICBkZWYgZ2V0YW5ub3RhdGlvbihzZWxmLCBtYWlsYm94LCBlbnRyeSwgYXR0cmlidXRlKToKKyAgICAgICAgIiIiKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4uZ2V0YW5ub3RhdGlvbihtYWlsYm94LCBlbnRyeSwgYXR0cmlidXRlKQorICAgICAgICBSZXRyaWV2ZSBBTk5PVEFUSU9Ocy4iIiIKKworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKCdHRVRBTk5PVEFUSU9OJywgbWFpbGJveCwgZW50cnksIGF0dHJpYnV0ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCAnQU5OT1RBVElPTicpCisKKworICAgIGRlZiBnZXRxdW90YShzZWxmLCByb290KToKKyAgICAgICAgIiIiR2V0IHRoZSBxdW90YSByb290J3MgcmVzb3VyY2UgdXNhZ2UgYW5kIGxpbWl0cy4KKworICAgICAgICBQYXJ0IG9mIHRoZSBJTUFQNCBRVU9UQSBleHRlbnNpb24gZGVmaW5lZCBpbiByZmMyMDg3LgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LmdldHF1b3RhKHJvb3QpCisgICAgICAgICIiIgorICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKCdHRVRRVU9UQScsIHJvb3QpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgJ1FVT1RBJykKKworCisgICAgZGVmIGdldHF1b3Rhcm9vdChzZWxmLCBtYWlsYm94KToKKyAgICAgICAgIiIiR2V0IHRoZSBsaXN0IG9mIHF1b3RhIHJvb3RzIGZvciB0aGUgbmFtZWQgbWFpbGJveC4KKworICAgICAgICAodHlwLCBbW1FVT1RBUk9PVCByZXNwb25zZXMuLi5dLCBbUVVPVEEgcmVzcG9uc2VzXV0pID0gPGluc3RhbmNlPi5nZXRxdW90YXJvb3QobWFpbGJveCkKKyAgICAgICAgIiIiCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ0dFVFFVT1RBUk9PVCcsIG1haWxib3gpCisgICAgICAgIHR5cCwgcXVvdGEgPSBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgJ1FVT1RBJykKKyAgICAgICAgdHlwLCBxdW90YXJvb3QgPSBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgJ1FVT1RBUk9PVCcpCisgICAgICAgIHJldHVybiB0eXAsIFtxdW90YXJvb3QsIHF1b3RhXQorCisKKyAgICBkZWYgbGlzdChzZWxmLCBkaXJlY3Rvcnk9JyIiJywgcGF0dGVybj0nKicpOgorICAgICAgICAiIiJMaXN0IG1haWxib3ggbmFtZXMgaW4gZGlyZWN0b3J5IG1hdGNoaW5nIHBhdHRlcm4uCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4ubGlzdChkaXJlY3Rvcnk9JyIiJywgcGF0dGVybj0nKicpCisKKyAgICAgICAgJ2RhdGEnIGlzIGxpc3Qgb2YgTElTVCByZXNwb25zZXMuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gJ0xJU1QnCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQobmFtZSwgZGlyZWN0b3J5LCBwYXR0ZXJuKQorICAgICAgICByZXR1cm4gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UodHlwLCBkYXQsIG5hbWUpCisKKworICAgIGRlZiBsb2dpbihzZWxmLCB1c2VyLCBwYXNzd29yZCk6CisgICAgICAgICIiIklkZW50aWZ5IGNsaWVudCB1c2luZyBwbGFpbnRleHQgcGFzc3dvcmQuCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4ubG9naW4odXNlciwgcGFzc3dvcmQpCisKKyAgICAgICAgTkI6ICdwYXNzd29yZCcgd2lsbCBiZSBxdW90ZWQuCisgICAgICAgICIiIgorICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKCdMT0dJTicsIHVzZXIsIHNlbGYuX3F1b3RlKHBhc3N3b3JkKSkKKyAgICAgICAgaWYgdHlwICE9ICdPSyc6CisgICAgICAgICAgICByYWlzZSBzZWxmLmVycm9yKGRhdFstMV0pCisgICAgICAgIHNlbGYuc3RhdGUgPSAnQVVUSCcKKyAgICAgICAgcmV0dXJuIHR5cCwgZGF0CisKKworICAgIGRlZiBsb2dpbl9jcmFtX21kNShzZWxmLCB1c2VyLCBwYXNzd29yZCk6CisgICAgICAgICIiIiBGb3JjZSB1c2Ugb2YgQ1JBTS1NRDUgYXV0aGVudGljYXRpb24uCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4ubG9naW5fY3JhbV9tZDUodXNlciwgcGFzc3dvcmQpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnVzZXIsIHNlbGYucGFzc3dvcmQgPSB1c2VyLCBwYXNzd29yZAorICAgICAgICByZXR1cm4gc2VsZi5hdXRoZW50aWNhdGUoJ0NSQU0tTUQ1Jywgc2VsZi5fQ1JBTV9NRDVfQVVUSCkKKworCisgICAgZGVmIF9DUkFNX01ENV9BVVRIKHNlbGYsIGNoYWxsZW5nZSk6CisgICAgICAgICIiIiBBdXRob2JqZWN0IHRvIHVzZSB3aXRoIENSQU0tTUQ1IGF1dGhlbnRpY2F0aW9uLiAiIiIKKyAgICAgICAgaW1wb3J0IGhtYWMKKyAgICAgICAgcmV0dXJuIHNlbGYudXNlciArICIgIiArIGhtYWMuSE1BQyhzZWxmLnBhc3N3b3JkLCBjaGFsbGVuZ2UpLmhleGRpZ2VzdCgpCisKKworICAgIGRlZiBsb2dvdXQoc2VsZik6CisgICAgICAgICIiIlNodXRkb3duIGNvbm5lY3Rpb24gdG8gc2VydmVyLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LmxvZ291dCgpCisKKyAgICAgICAgUmV0dXJucyBzZXJ2ZXIgJ0JZRScgcmVzcG9uc2UuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnN0YXRlID0gJ0xPR09VVCcKKyAgICAgICAgdHJ5OiB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKCdMT0dPVVQnKQorICAgICAgICBleGNlcHQ6IHR5cCwgZGF0ID0gJ05PJywgWyclczogJXMnICUgc3lzLmV4Y19pbmZvKClbOjJdXQorICAgICAgICBzZWxmLnNodXRkb3duKCkKKyAgICAgICAgaWYgJ0JZRScgaW4gc2VsZi51bnRhZ2dlZF9yZXNwb25zZXM6CisgICAgICAgICAgICByZXR1cm4gJ0JZRScsIHNlbGYudW50YWdnZWRfcmVzcG9uc2VzWydCWUUnXQorICAgICAgICByZXR1cm4gdHlwLCBkYXQKKworCisgICAgZGVmIGxzdWIoc2VsZiwgZGlyZWN0b3J5PSciIicsIHBhdHRlcm49JyonKToKKyAgICAgICAgIiIiTGlzdCAnc3Vic2NyaWJlZCcgbWFpbGJveCBuYW1lcyBpbiBkaXJlY3RvcnkgbWF0Y2hpbmcgcGF0dGVybi4KKworICAgICAgICAodHlwLCBbZGF0YSwgLi4uXSkgPSA8aW5zdGFuY2U+LmxzdWIoZGlyZWN0b3J5PSciIicsIHBhdHRlcm49JyonKQorCisgICAgICAgICdkYXRhJyBhcmUgdHVwbGVzIG9mIG1lc3NhZ2UgcGFydCBlbnZlbG9wZSBhbmQgZGF0YS4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSAnTFNVQicKKyAgICAgICAgdHlwLCBkYXQgPSBzZWxmLl9zaW1wbGVfY29tbWFuZChuYW1lLCBkaXJlY3RvcnksIHBhdHRlcm4pCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgbmFtZSkKKworICAgIGRlZiBteXJpZ2h0cyhzZWxmLCBtYWlsYm94KToKKyAgICAgICAgIiIiU2hvdyBteSBBQ0xzIGZvciBhIG1haWxib3ggKGkuZS4gdGhlIHJpZ2h0cyB0aGF0IEkgaGF2ZSBvbiBtYWlsYm94KS4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5teXJpZ2h0cyhtYWlsYm94KQorICAgICAgICAiIiIKKyAgICAgICAgdHlwLGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKCdNWVJJR0hUUycsIG1haWxib3gpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgJ01ZUklHSFRTJykKKworICAgIGRlZiBuYW1lc3BhY2Uoc2VsZik6CisgICAgICAgICIiIiBSZXR1cm5zIElNQVAgbmFtZXNwYWNlcyBhbGEgcmZjMjM0MgorCisgICAgICAgICh0eXAsIFtkYXRhLCAuLi5dKSA9IDxpbnN0YW5jZT4ubmFtZXNwYWNlKCkKKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSAnTkFNRVNQQUNFJworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKG5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgbmFtZSkKKworCisgICAgZGVmIG5vb3Aoc2VsZik6CisgICAgICAgICIiIlNlbmQgTk9PUCBjb21tYW5kLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+Lm5vb3AoKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAzOgorICAgICAgICAgICAgICAgIHNlbGYuX2R1bXBfdXIoc2VsZi51bnRhZ2dlZF9yZXNwb25zZXMpCisgICAgICAgIHJldHVybiBzZWxmLl9zaW1wbGVfY29tbWFuZCgnTk9PUCcpCisKKworICAgIGRlZiBwYXJ0aWFsKHNlbGYsIG1lc3NhZ2VfbnVtLCBtZXNzYWdlX3BhcnQsIHN0YXJ0LCBsZW5ndGgpOgorICAgICAgICAiIiJGZXRjaCB0cnVuY2F0ZWQgcGFydCBvZiBhIG1lc3NhZ2UuCisKKyAgICAgICAgKHR5cCwgW2RhdGEsIC4uLl0pID0gPGluc3RhbmNlPi5wYXJ0aWFsKG1lc3NhZ2VfbnVtLCBtZXNzYWdlX3BhcnQsIHN0YXJ0LCBsZW5ndGgpCisKKyAgICAgICAgJ2RhdGEnIGlzIHR1cGxlIG9mIG1lc3NhZ2UgcGFydCBlbnZlbG9wZSBhbmQgZGF0YS4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSAnUEFSVElBTCcKKyAgICAgICAgdHlwLCBkYXQgPSBzZWxmLl9zaW1wbGVfY29tbWFuZChuYW1lLCBtZXNzYWdlX251bSwgbWVzc2FnZV9wYXJ0LCBzdGFydCwgbGVuZ3RoKQorICAgICAgICByZXR1cm4gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UodHlwLCBkYXQsICdGRVRDSCcpCisKKworICAgIGRlZiBwcm94eWF1dGgoc2VsZiwgdXNlcik6CisgICAgICAgICIiIkFzc3VtZSBhdXRoZW50aWNhdGlvbiBhcyAidXNlciIuCisKKyAgICAgICAgQWxsb3dzIGFuIGF1dGhvcmlzZWQgYWRtaW5pc3RyYXRvciB0byBwcm94eSBpbnRvIGFueSB1c2VyJ3MKKyAgICAgICAgbWFpbGJveC4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5wcm94eWF1dGgodXNlcikKKyAgICAgICAgIiIiCisKKyAgICAgICAgbmFtZSA9ICdQUk9YWUFVVEgnCisgICAgICAgIHJldHVybiBzZWxmLl9zaW1wbGVfY29tbWFuZCgnUFJPWFlBVVRIJywgdXNlcikKKworCisgICAgZGVmIHJlbmFtZShzZWxmLCBvbGRtYWlsYm94LCBuZXdtYWlsYm94KToKKyAgICAgICAgIiIiUmVuYW1lIG9sZCBtYWlsYm94IG5hbWUgdG8gbmV3LgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LnJlbmFtZShvbGRtYWlsYm94LCBuZXdtYWlsYm94KQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NpbXBsZV9jb21tYW5kKCdSRU5BTUUnLCBvbGRtYWlsYm94LCBuZXdtYWlsYm94KQorCisKKyAgICBkZWYgc2VhcmNoKHNlbGYsIGNoYXJzZXQsICpjcml0ZXJpYSk6CisgICAgICAgICIiIlNlYXJjaCBtYWlsYm94IGZvciBtYXRjaGluZyBtZXNzYWdlcy4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5zZWFyY2goY2hhcnNldCwgY3JpdGVyaW9uLCAuLi4pCisKKyAgICAgICAgJ2RhdGEnIGlzIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIG1hdGNoaW5nIG1lc3NhZ2UgbnVtYmVycy4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSAnU0VBUkNIJworICAgICAgICBpZiBjaGFyc2V0OgorICAgICAgICAgICAgdHlwLCBkYXQgPSBzZWxmLl9zaW1wbGVfY29tbWFuZChuYW1lLCAnQ0hBUlNFVCcsIGNoYXJzZXQsICpjcml0ZXJpYSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQobmFtZSwgKmNyaXRlcmlhKQorICAgICAgICByZXR1cm4gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UodHlwLCBkYXQsIG5hbWUpCisKKworICAgIGRlZiBzZWxlY3Qoc2VsZiwgbWFpbGJveD0nSU5CT1gnLCByZWFkb25seT1GYWxzZSk6CisgICAgICAgICIiIlNlbGVjdCBhIG1haWxib3guCisKKyAgICAgICAgRmx1c2ggYWxsIHVudGFnZ2VkIHJlc3BvbnNlcy4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5zZWxlY3QobWFpbGJveD0nSU5CT1gnLCByZWFkb25seT1GYWxzZSkKKworICAgICAgICAnZGF0YScgaXMgY291bnQgb2YgbWVzc2FnZXMgaW4gbWFpbGJveCAoJ0VYSVNUUycgcmVzcG9uc2UpLgorCisgICAgICAgIE1hbmRhdGVkIHJlc3BvbnNlcyBhcmUgKCdGTEFHUycsICdFWElTVFMnLCAnUkVDRU5UJywgJ1VJRFZBTElESVRZJyksIHNvCisgICAgICAgIG90aGVyIHJlc3BvbnNlcyBzaG91bGQgYmUgb2J0YWluZWQgdmlhIDxpbnN0YW5jZT4ucmVzcG9uc2UoJ0ZMQUdTJykgZXRjLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi51bnRhZ2dlZF9yZXNwb25zZXMgPSB7fSAgICAjIEZsdXNoIG9sZCByZXNwb25zZXMuCisgICAgICAgIHNlbGYuaXNfcmVhZG9ubHkgPSByZWFkb25seQorICAgICAgICBpZiByZWFkb25seToKKyAgICAgICAgICAgIG5hbWUgPSAnRVhBTUlORScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSAnU0VMRUNUJworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKG5hbWUsIG1haWxib3gpCisgICAgICAgIGlmIHR5cCAhPSAnT0snOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdBVVRIJyAgICAgIyBNaWdodCBoYXZlIGJlZW4gJ1NFTEVDVEVEJworICAgICAgICAgICAgcmV0dXJuIHR5cCwgZGF0CisgICAgICAgIHNlbGYuc3RhdGUgPSAnU0VMRUNURUQnCisgICAgICAgIGlmICdSRUFELU9OTFknIGluIHNlbGYudW50YWdnZWRfcmVzcG9uc2VzIFwKKyAgICAgICAgICAgICAgICBhbmQgbm90IHJlYWRvbmx5OgorICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHVtcF91cihzZWxmLnVudGFnZ2VkX3Jlc3BvbnNlcykKKyAgICAgICAgICAgIHJhaXNlIHNlbGYucmVhZG9ubHkoJyVzIGlzIG5vdCB3cml0YWJsZScgJSBtYWlsYm94KQorICAgICAgICByZXR1cm4gdHlwLCBzZWxmLnVudGFnZ2VkX3Jlc3BvbnNlcy5nZXQoJ0VYSVNUUycsIFtOb25lXSkKKworCisgICAgZGVmIHNldGFjbChzZWxmLCBtYWlsYm94LCB3aG8sIHdoYXQpOgorICAgICAgICAiIiJTZXQgYSBtYWlsYm94IGFjbC4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5zZXRhY2wobWFpbGJveCwgd2hvLCB3aGF0KQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NpbXBsZV9jb21tYW5kKCdTRVRBQ0wnLCBtYWlsYm94LCB3aG8sIHdoYXQpCisKKworICAgIGRlZiBzZXRhbm5vdGF0aW9uKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4uc2V0YW5ub3RhdGlvbihtYWlsYm94WywgZW50cnksIGF0dHJpYnV0ZV0rKQorICAgICAgICBTZXQgQU5OT1RBVElPTnMuIiIiCisKKyAgICAgICAgdHlwLCBkYXQgPSBzZWxmLl9zaW1wbGVfY29tbWFuZCgnU0VUQU5OT1RBVElPTicsICphcmdzKQorICAgICAgICByZXR1cm4gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UodHlwLCBkYXQsICdBTk5PVEFUSU9OJykKKworCisgICAgZGVmIHNldHF1b3RhKHNlbGYsIHJvb3QsIGxpbWl0cyk6CisgICAgICAgICIiIlNldCB0aGUgcXVvdGEgcm9vdCdzIHJlc291cmNlIGxpbWl0cy4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5zZXRxdW90YShyb290LCBsaW1pdHMpCisgICAgICAgICIiIgorICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKCdTRVRRVU9UQScsIHJvb3QsIGxpbWl0cykKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCAnUVVPVEEnKQorCisKKyAgICBkZWYgc29ydChzZWxmLCBzb3J0X2NyaXRlcmlhLCBjaGFyc2V0LCAqc2VhcmNoX2NyaXRlcmlhKToKKyAgICAgICAgIiIiSU1BUDRyZXYxIGV4dGVuc2lvbiBTT1JUIGNvbW1hbmQuCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4uc29ydChzb3J0X2NyaXRlcmlhLCBjaGFyc2V0LCBzZWFyY2hfY3JpdGVyaWEsIC4uLikKKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSAnU09SVCcKKyAgICAgICAgI2lmIG5vdCBuYW1lIGluIHNlbGYuY2FwYWJpbGl0aWVzOiAgICAgICMgTGV0IHRoZSBzZXJ2ZXIgZGVjaWRlIQorICAgICAgICAjICAgICAgIHJhaXNlIHNlbGYuZXJyb3IoJ3VuaW1wbGVtZW50ZWQgZXh0ZW5zaW9uIGNvbW1hbmQ6ICVzJyAlIG5hbWUpCisgICAgICAgIGlmIChzb3J0X2NyaXRlcmlhWzBdLHNvcnRfY3JpdGVyaWFbLTFdKSAhPSAoJygnLCcpJyk6CisgICAgICAgICAgICBzb3J0X2NyaXRlcmlhID0gJyglcyknICUgc29ydF9jcml0ZXJpYQorICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKG5hbWUsIHNvcnRfY3JpdGVyaWEsIGNoYXJzZXQsICpzZWFyY2hfY3JpdGVyaWEpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgbmFtZSkKKworCisgICAgZGVmIHN0YXR1cyhzZWxmLCBtYWlsYm94LCBuYW1lcyk6CisgICAgICAgICIiIlJlcXVlc3QgbmFtZWQgc3RhdHVzIGNvbmRpdGlvbnMgZm9yIG1haWxib3guCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4uc3RhdHVzKG1haWxib3gsIG5hbWVzKQorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9ICdTVEFUVVMnCisgICAgICAgICNpZiBzZWxmLlBST1RPQ09MX1ZFUlNJT04gPT0gJ0lNQVA0JzogICAjIExldCB0aGUgc2VydmVyIGRlY2lkZSEKKyAgICAgICAgIyAgICByYWlzZSBzZWxmLmVycm9yKCclcyB1bmltcGxlbWVudGVkIGluIElNQVA0IChvYnRhaW4gSU1BUDRyZXYxIHNlcnZlciwgb3IgcmUtY29kZSknICUgbmFtZSkKKyAgICAgICAgdHlwLCBkYXQgPSBzZWxmLl9zaW1wbGVfY29tbWFuZChuYW1lLCBtYWlsYm94LCBuYW1lcykKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCBuYW1lKQorCisKKyAgICBkZWYgc3RvcmUoc2VsZiwgbWVzc2FnZV9zZXQsIGNvbW1hbmQsIGZsYWdzKToKKyAgICAgICAgIiIiQWx0ZXJzIGZsYWcgZGlzcG9zaXRpb25zIGZvciBtZXNzYWdlcyBpbiBtYWlsYm94LgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LnN0b3JlKG1lc3NhZ2Vfc2V0LCBjb21tYW5kLCBmbGFncykKKyAgICAgICAgIiIiCisgICAgICAgIGlmIChmbGFnc1swXSxmbGFnc1stMV0pICE9ICgnKCcsJyknKToKKyAgICAgICAgICAgIGZsYWdzID0gJyglcyknICUgZmxhZ3MgICMgQXZvaWQgcXVvdGluZyB0aGUgZmxhZ3MKKyAgICAgICAgdHlwLCBkYXQgPSBzZWxmLl9zaW1wbGVfY29tbWFuZCgnU1RPUkUnLCBtZXNzYWdlX3NldCwgY29tbWFuZCwgZmxhZ3MpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgJ0ZFVENIJykKKworCisgICAgZGVmIHN1YnNjcmliZShzZWxmLCBtYWlsYm94KToKKyAgICAgICAgIiIiU3Vic2NyaWJlIHRvIG5ldyBtYWlsYm94LgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LnN1YnNjcmliZShtYWlsYm94KQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NpbXBsZV9jb21tYW5kKCdTVUJTQ1JJQkUnLCBtYWlsYm94KQorCisKKyAgICBkZWYgdGhyZWFkKHNlbGYsIHRocmVhZGluZ19hbGdvcml0aG0sIGNoYXJzZXQsICpzZWFyY2hfY3JpdGVyaWEpOgorICAgICAgICAiIiJJTUFQcmV2MSBleHRlbnNpb24gVEhSRUFEIGNvbW1hbmQuCisKKyAgICAgICAgKHR5cGUsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LnRocmVhZCh0aHJlYWRpbmdfYWxnb3JpdGhtLCBjaGFyc2V0LCBzZWFyY2hfY3JpdGVyaWEsIC4uLikKKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSAnVEhSRUFEJworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKG5hbWUsIHRocmVhZGluZ19hbGdvcml0aG0sIGNoYXJzZXQsICpzZWFyY2hfY3JpdGVyaWEpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgbmFtZSkKKworCisgICAgZGVmIHVpZChzZWxmLCBjb21tYW5kLCAqYXJncyk6CisgICAgICAgICIiIkV4ZWN1dGUgImNvbW1hbmQgYXJnIC4uLiIgd2l0aCBtZXNzYWdlcyBpZGVudGlmaWVkIGJ5IFVJRCwKKyAgICAgICAgICAgICAgICByYXRoZXIgdGhhbiBtZXNzYWdlIG51bWJlci4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi51aWQoY29tbWFuZCwgYXJnMSwgYXJnMiwgLi4uKQorCisgICAgICAgIFJldHVybnMgcmVzcG9uc2UgYXBwcm9wcmlhdGUgdG8gJ2NvbW1hbmQnLgorICAgICAgICAiIiIKKyAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQudXBwZXIoKQorICAgICAgICBpZiBub3QgY29tbWFuZCBpbiBDb21tYW5kczoKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZXJyb3IoIlVua25vd24gSU1BUDQgVUlEIGNvbW1hbmQ6ICVzIiAlIGNvbW1hbmQpCisgICAgICAgIGlmIHNlbGYuc3RhdGUgbm90IGluIENvbW1hbmRzW2NvbW1hbmRdOgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5lcnJvcigiY29tbWFuZCAlcyBpbGxlZ2FsIGluIHN0YXRlICVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmx5IGFsbG93ZWQgaW4gc3RhdGVzICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21tYW5kLCBzZWxmLnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywgJy5qb2luKENvbW1hbmRzW2NvbW1hbmRdKSkpCisgICAgICAgIG5hbWUgPSAnVUlEJworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKG5hbWUsIGNvbW1hbmQsICphcmdzKQorICAgICAgICBpZiBjb21tYW5kIGluICgnU0VBUkNIJywgJ1NPUlQnLCAnVEhSRUFEJyk6CisgICAgICAgICAgICBuYW1lID0gY29tbWFuZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9ICdGRVRDSCcKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCBuYW1lKQorCisKKyAgICBkZWYgdW5zdWJzY3JpYmUoc2VsZiwgbWFpbGJveCk6CisgICAgICAgICIiIlVuc3Vic2NyaWJlIGZyb20gb2xkIG1haWxib3guCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4udW5zdWJzY3JpYmUobWFpbGJveCkKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9zaW1wbGVfY29tbWFuZCgnVU5TVUJTQ1JJQkUnLCBtYWlsYm94KQorCisKKyAgICBkZWYgeGF0b20oc2VsZiwgbmFtZSwgKmFyZ3MpOgorICAgICAgICAiIiJBbGxvdyBzaW1wbGUgZXh0ZW5zaW9uIGNvbW1hbmRzCisgICAgICAgICAgICAgICAgbm90aWZpZWQgYnkgc2VydmVyIGluIENBUEFCSUxJVFkgcmVzcG9uc2UuCisKKyAgICAgICAgQXNzdW1lcyBjb21tYW5kIGlzIGxlZ2FsIGluIGN1cnJlbnQgc3RhdGUuCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4ueGF0b20obmFtZSwgYXJnLCAuLi4pCisKKyAgICAgICAgUmV0dXJucyByZXNwb25zZSBhcHByb3ByaWF0ZSB0byBleHRlbnNpb24gY29tbWFuZCBgbmFtZScuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gbmFtZS51cHBlcigpCisgICAgICAgICNpZiBub3QgbmFtZSBpbiBzZWxmLmNhcGFiaWxpdGllczogICAgICAjIExldCB0aGUgc2VydmVyIGRlY2lkZSEKKyAgICAgICAgIyAgICByYWlzZSBzZWxmLmVycm9yKCd1bmtub3duIGV4dGVuc2lvbiBjb21tYW5kOiAlcycgJSBuYW1lKQorICAgICAgICBpZiBub3QgbmFtZSBpbiBDb21tYW5kczoKKyAgICAgICAgICAgIENvbW1hbmRzW25hbWVdID0gKHNlbGYuc3RhdGUsKQorICAgICAgICByZXR1cm4gc2VsZi5fc2ltcGxlX2NvbW1hbmQobmFtZSwgKmFyZ3MpCisKKworCisgICAgIyAgICAgICBQcml2YXRlIG1ldGhvZHMKKworCisgICAgZGVmIF9hcHBlbmRfdW50YWdnZWQoc2VsZiwgdHlwLCBkYXQpOgorCisgICAgICAgIGlmIGRhdCBpcyBOb25lOiBkYXQgPSAnJworICAgICAgICB1ciA9IHNlbGYudW50YWdnZWRfcmVzcG9uc2VzCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gNToKKyAgICAgICAgICAgICAgICBzZWxmLl9tZXNnKCd1bnRhZ2dlZF9yZXNwb25zZXNbJXNdICVzICs9IFsiJXMiXScgJQorICAgICAgICAgICAgICAgICAgICAgICAgKHR5cCwgbGVuKHVyLmdldCh0eXAsJycpKSwgZGF0KSkKKyAgICAgICAgaWYgdHlwIGluIHVyOgorICAgICAgICAgICAgdXJbdHlwXS5hcHBlbmQoZGF0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXJbdHlwXSA9IFtkYXRdCisKKworICAgIGRlZiBfY2hlY2tfYnllKHNlbGYpOgorICAgICAgICBieWUgPSBzZWxmLnVudGFnZ2VkX3Jlc3BvbnNlcy5nZXQoJ0JZRScpCisgICAgICAgIGlmIGJ5ZToKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuYWJvcnQoYnllWy0xXSkKKworCisgICAgZGVmIF9jb21tYW5kKHNlbGYsIG5hbWUsICphcmdzKToKKworICAgICAgICBpZiBzZWxmLnN0YXRlIG5vdCBpbiBDb21tYW5kc1tuYW1lXToKKyAgICAgICAgICAgIHNlbGYubGl0ZXJhbCA9IE5vbmUKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZXJyb3IoImNvbW1hbmQgJXMgaWxsZWdhbCBpbiBzdGF0ZSAlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25seSBhbGxvd2VkIGluIHN0YXRlcyAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgc2VsZi5zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcsICcuam9pbihDb21tYW5kc1tuYW1lXSkpKQorCisgICAgICAgIGZvciB0eXAgaW4gKCdPSycsICdOTycsICdCQUQnKToKKyAgICAgICAgICAgIGlmIHR5cCBpbiBzZWxmLnVudGFnZ2VkX3Jlc3BvbnNlczoKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi51bnRhZ2dlZF9yZXNwb25zZXNbdHlwXQorCisgICAgICAgIGlmICdSRUFELU9OTFknIGluIHNlbGYudW50YWdnZWRfcmVzcG9uc2VzIFwKKyAgICAgICAgYW5kIG5vdCBzZWxmLmlzX3JlYWRvbmx5OgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5yZWFkb25seSgnbWFpbGJveCBzdGF0dXMgY2hhbmdlZCB0byBSRUFELU9OTFknKQorCisgICAgICAgIHRhZyA9IHNlbGYuX25ld190YWcoKQorICAgICAgICBkYXRhID0gJyVzICVzJyAlICh0YWcsIG5hbWUpCisgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgIGlmIGFyZyBpcyBOb25lOiBjb250aW51ZQorICAgICAgICAgICAgZGF0YSA9ICclcyAlcycgJSAoZGF0YSwgc2VsZi5fY2hlY2txdW90ZShhcmcpKQorCisgICAgICAgIGxpdGVyYWwgPSBzZWxmLmxpdGVyYWwKKyAgICAgICAgaWYgbGl0ZXJhbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYubGl0ZXJhbCA9IE5vbmUKKyAgICAgICAgICAgIGlmIHR5cGUobGl0ZXJhbCkgaXMgdHlwZShzZWxmLl9jb21tYW5kKToKKyAgICAgICAgICAgICAgICBsaXRlcmF0b3IgPSBsaXRlcmFsCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpdGVyYXRvciA9IE5vbmUKKyAgICAgICAgICAgICAgICBkYXRhID0gJyVzIHslc30nICUgKGRhdGEsIGxlbihsaXRlcmFsKSkKKworICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDQ6CisgICAgICAgICAgICAgICAgc2VsZi5fbWVzZygnPiAlcycgJSBkYXRhKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2coJz4gJXMnICUgZGF0YSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNlbmQoJyVzJXMnICUgKGRhdGEsIENSTEYpKQorICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgT1NFcnJvciksIHZhbDoKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuYWJvcnQoJ3NvY2tldCBlcnJvcjogJXMnICUgdmFsKQorCisgICAgICAgIGlmIGxpdGVyYWwgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiB0YWcKKworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgIyBXYWl0IGZvciBjb250aW51YXRpb24gcmVzcG9uc2UKKworICAgICAgICAgICAgd2hpbGUgc2VsZi5fZ2V0X3Jlc3BvbnNlKCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi50YWdnZWRfY29tbWFuZHNbdGFnXTogICAjIEJBRC9OTz8KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZworCisgICAgICAgICAgICAjIFNlbmQgbGl0ZXJhbAorCisgICAgICAgICAgICBpZiBsaXRlcmF0b3I6CisgICAgICAgICAgICAgICAgbGl0ZXJhbCA9IGxpdGVyYXRvcihzZWxmLmNvbnRpbnVhdGlvbl9yZXNwb25zZSkKKworICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gNDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWVzZygnd3JpdGUgbGl0ZXJhbCBzaXplICVzJyAlIGxlbihsaXRlcmFsKSkKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc2VuZChsaXRlcmFsKQorICAgICAgICAgICAgICAgIHNlbGYuc2VuZChDUkxGKQorICAgICAgICAgICAgZXhjZXB0IChzb2NrZXQuZXJyb3IsIE9TRXJyb3IpLCB2YWw6CisgICAgICAgICAgICAgICAgcmFpc2Ugc2VsZi5hYm9ydCgnc29ja2V0IGVycm9yOiAlcycgJSB2YWwpCisKKyAgICAgICAgICAgIGlmIG5vdCBsaXRlcmF0b3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICByZXR1cm4gdGFnCisKKworICAgIGRlZiBfY29tbWFuZF9jb21wbGV0ZShzZWxmLCBuYW1lLCB0YWcpOgorICAgICAgICAjIEJZRSBpcyBleHBlY3RlZCBhZnRlciBMT0dPVVQKKyAgICAgICAgaWYgbmFtZSAhPSAnTE9HT1VUJzoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2J5ZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHR5cCwgZGF0YSA9IHNlbGYuX2dldF90YWdnZWRfcmVzcG9uc2UodGFnKQorICAgICAgICBleGNlcHQgc2VsZi5hYm9ydCwgdmFsOgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5hYm9ydCgnY29tbWFuZDogJXMgPT4gJXMnICUgKG5hbWUsIHZhbCkpCisgICAgICAgIGV4Y2VwdCBzZWxmLmVycm9yLCB2YWw6CisgICAgICAgICAgICByYWlzZSBzZWxmLmVycm9yKCdjb21tYW5kOiAlcyA9PiAlcycgJSAobmFtZSwgdmFsKSkKKyAgICAgICAgaWYgbmFtZSAhPSAnTE9HT1VUJzoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2J5ZSgpCisgICAgICAgIGlmIHR5cCA9PSAnQkFEJzoKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZXJyb3IoJyVzIGNvbW1hbmQgZXJyb3I6ICVzICVzJyAlIChuYW1lLCB0eXAsIGRhdGEpKQorICAgICAgICByZXR1cm4gdHlwLCBkYXRhCisKKworICAgIGRlZiBfZ2V0X3Jlc3BvbnNlKHNlbGYpOgorCisgICAgICAgICMgUmVhZCByZXNwb25zZSBhbmQgc3RvcmUuCisgICAgICAgICMKKyAgICAgICAgIyBSZXR1cm5zIE5vbmUgZm9yIGNvbnRpbnVhdGlvbiByZXNwb25zZXMsCisgICAgICAgICMgb3RoZXJ3aXNlIGZpcnN0IHJlc3BvbnNlIGxpbmUgcmVjZWl2ZWQuCisKKyAgICAgICAgcmVzcCA9IHNlbGYuX2dldF9saW5lKCkKKworICAgICAgICAjIENvbW1hbmQgY29tcGxldGlvbiByZXNwb25zZT8KKworICAgICAgICBpZiBzZWxmLl9tYXRjaChzZWxmLnRhZ3JlLCByZXNwKToKKyAgICAgICAgICAgIHRhZyA9IHNlbGYubW8uZ3JvdXAoJ3RhZycpCisgICAgICAgICAgICBpZiBub3QgdGFnIGluIHNlbGYudGFnZ2VkX2NvbW1hbmRzOgorICAgICAgICAgICAgICAgIHJhaXNlIHNlbGYuYWJvcnQoJ3VuZXhwZWN0ZWQgdGFnZ2VkIHJlc3BvbnNlOiAlcycgJSByZXNwKQorCisgICAgICAgICAgICB0eXAgPSBzZWxmLm1vLmdyb3VwKCd0eXBlJykKKyAgICAgICAgICAgIGRhdCA9IHNlbGYubW8uZ3JvdXAoJ2RhdGEnKQorICAgICAgICAgICAgc2VsZi50YWdnZWRfY29tbWFuZHNbdGFnXSA9ICh0eXAsIFtkYXRdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0MiA9IE5vbmUKKworICAgICAgICAgICAgIyAnKicgKHVudGFnZ2VkKSByZXNwb25zZXM/CisKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9tYXRjaChVbnRhZ2dlZF9yZXNwb25zZSwgcmVzcCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fbWF0Y2goVW50YWdnZWRfc3RhdHVzLCByZXNwKToKKyAgICAgICAgICAgICAgICAgICAgZGF0MiA9IHNlbGYubW8uZ3JvdXAoJ2RhdGEyJykKKworICAgICAgICAgICAgaWYgc2VsZi5tbyBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgT25seSBvdGhlciBwb3NzaWJpbGl0eSBpcyAnKycgKGNvbnRpbnVhdGlvbikgcmVzcG9uc2UuLi4KKworICAgICAgICAgICAgICAgIGlmIHNlbGYuX21hdGNoKENvbnRpbnVhdGlvbiwgcmVzcCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGludWF0aW9uX3Jlc3BvbnNlID0gc2VsZi5tby5ncm91cCgnZGF0YScpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lICAgICAjIE5COiBpbmRpY2F0ZXMgY29udGludWF0aW9uCisKKyAgICAgICAgICAgICAgICByYWlzZSBzZWxmLmFib3J0KCJ1bmV4cGVjdGVkIHJlc3BvbnNlOiAnJXMnIiAlIHJlc3ApCisKKyAgICAgICAgICAgIHR5cCA9IHNlbGYubW8uZ3JvdXAoJ3R5cGUnKQorICAgICAgICAgICAgZGF0ID0gc2VsZi5tby5ncm91cCgnZGF0YScpCisgICAgICAgICAgICBpZiBkYXQgaXMgTm9uZTogZGF0ID0gJycgICAgICAgICMgTnVsbCB1bnRhZ2dlZCByZXNwb25zZQorICAgICAgICAgICAgaWYgZGF0MjogZGF0ID0gZGF0ICsgJyAnICsgZGF0MgorCisgICAgICAgICAgICAjIElzIHRoZXJlIGEgbGl0ZXJhbCB0byBjb21lPworCisgICAgICAgICAgICB3aGlsZSBzZWxmLl9tYXRjaChMaXRlcmFsLCBkYXQpOgorCisgICAgICAgICAgICAgICAgIyBSZWFkIGxpdGVyYWwgZGlyZWN0IGZyb20gY29ubmVjdGlvbi4KKworICAgICAgICAgICAgICAgIHNpemUgPSBpbnQoc2VsZi5tby5ncm91cCgnc2l6ZScpKQorICAgICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbWVzZygncmVhZCBsaXRlcmFsIHNpemUgJXMnICUgc2l6ZSkKKyAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5yZWFkKHNpemUpCisKKyAgICAgICAgICAgICAgICAjIFN0b3JlIHJlc3BvbnNlIHdpdGggbGl0ZXJhbCBhcyB0dXBsZQorCisgICAgICAgICAgICAgICAgc2VsZi5fYXBwZW5kX3VudGFnZ2VkKHR5cCwgKGRhdCwgZGF0YSkpCisKKyAgICAgICAgICAgICAgICAjIFJlYWQgdHJhaWxlciAtIHBvc3NpYmx5IGNvbnRhaW5pbmcgYW5vdGhlciBsaXRlcmFsCisKKyAgICAgICAgICAgICAgICBkYXQgPSBzZWxmLl9nZXRfbGluZSgpCisKKyAgICAgICAgICAgIHNlbGYuX2FwcGVuZF91bnRhZ2dlZCh0eXAsIGRhdCkKKworICAgICAgICAjIEJyYWNrZXRlZCByZXNwb25zZSBpbmZvcm1hdGlvbj8KKworICAgICAgICBpZiB0eXAgaW4gKCdPSycsICdOTycsICdCQUQnKSBhbmQgc2VsZi5fbWF0Y2goUmVzcG9uc2VfY29kZSwgZGF0KToKKyAgICAgICAgICAgIHNlbGYuX2FwcGVuZF91bnRhZ2dlZChzZWxmLm1vLmdyb3VwKCd0eXBlJyksIHNlbGYubW8uZ3JvdXAoJ2RhdGEnKSkKKworICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDEgYW5kIHR5cCBpbiAoJ05PJywgJ0JBRCcsICdCWUUnKToKKyAgICAgICAgICAgICAgICBzZWxmLl9tZXNnKCclcyByZXNwb25zZTogJXMnICUgKHR5cCwgZGF0KSkKKworICAgICAgICByZXR1cm4gcmVzcAorCisKKyAgICBkZWYgX2dldF90YWdnZWRfcmVzcG9uc2Uoc2VsZiwgdGFnKToKKworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi50YWdnZWRfY29tbWFuZHNbdGFnXQorICAgICAgICAgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnRhZ2dlZF9jb21tYW5kc1t0YWddCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgICAgICAgICAjIFNvbWUgaGF2ZSByZXBvcnRlZCAidW5leHBlY3RlZCByZXNwb25zZSIgZXhjZXB0aW9ucy4KKyAgICAgICAgICAgICMgTm90ZSB0aGF0IGlnbm9yaW5nIHRoZW0gaGVyZSBjYXVzZXMgbG9vcHMuCisgICAgICAgICAgICAjIEluc3RlYWQsIHNlbmQgbWUgZGV0YWlscyBvZiB0aGUgdW5leHBlY3RlZCByZXNwb25zZSBhbmQKKyAgICAgICAgICAgICMgSSdsbCB1cGRhdGUgdGhlIGNvZGUgaW4gYF9nZXRfcmVzcG9uc2UoKScuCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9nZXRfcmVzcG9uc2UoKQorICAgICAgICAgICAgZXhjZXB0IHNlbGYuYWJvcnQsIHZhbDoKKyAgICAgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfbG9nKCkKKyAgICAgICAgICAgICAgICByYWlzZQorCisKKyAgICBkZWYgX2dldF9saW5lKHNlbGYpOgorCisgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICByYWlzZSBzZWxmLmFib3J0KCdzb2NrZXQgZXJyb3I6IEVPRicpCisKKyAgICAgICAgIyBQcm90b2NvbCBtYW5kYXRlcyBhbGwgbGluZXMgdGVybWluYXRlZCBieSBDUkxGCisgICAgICAgIGlmIG5vdCBsaW5lLmVuZHN3aXRoKCdcclxuJyk6CisgICAgICAgICAgICByYWlzZSBzZWxmLmFib3J0KCdzb2NrZXQgZXJyb3I6IHVudGVybWluYXRlZCBsaW5lJykKKworICAgICAgICBsaW5lID0gbGluZVs6LTJdCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gNDoKKyAgICAgICAgICAgICAgICBzZWxmLl9tZXNnKCc8ICVzJyAlIGxpbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZygnPCAlcycgJSBsaW5lKQorICAgICAgICByZXR1cm4gbGluZQorCisKKyAgICBkZWYgX21hdGNoKHNlbGYsIGNyZSwgcyk6CisKKyAgICAgICAgIyBSdW4gY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIG1ldGhvZCBvbiAncycuCisgICAgICAgICMgU2F2ZSByZXN1bHQsIHJldHVybiBzdWNjZXNzLgorCisgICAgICAgIHNlbGYubW8gPSBjcmUubWF0Y2gocykKKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgaWYgc2VsZi5tbyBpcyBub3QgTm9uZSBhbmQgc2VsZi5kZWJ1ZyA+PSA1OgorICAgICAgICAgICAgICAgIHNlbGYuX21lc2coIlx0bWF0Y2hlZCByJyVzJyA9PiAlciIgJSAoY3JlLnBhdHRlcm4sIHNlbGYubW8uZ3JvdXBzKCkpKQorICAgICAgICByZXR1cm4gc2VsZi5tbyBpcyBub3QgTm9uZQorCisKKyAgICBkZWYgX25ld190YWcoc2VsZik6CisKKyAgICAgICAgdGFnID0gJyVzJXMnICUgKHNlbGYudGFncHJlLCBzZWxmLnRhZ251bSkKKyAgICAgICAgc2VsZi50YWdudW0gPSBzZWxmLnRhZ251bSArIDEKKyAgICAgICAgc2VsZi50YWdnZWRfY29tbWFuZHNbdGFnXSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHRhZworCisKKyAgICBkZWYgX2NoZWNrcXVvdGUoc2VsZiwgYXJnKToKKworICAgICAgICAjIE11c3QgcXVvdGUgY29tbWFuZCBhcmdzIGlmIG5vbi1hbHBoYW51bWVyaWMgY2hhcnMgcHJlc2VudCwKKyAgICAgICAgIyBhbmQgbm90IGFscmVhZHkgcXVvdGVkLgorCisgICAgICAgIGlmIHR5cGUoYXJnKSBpcyBub3QgdHlwZSgnJyk6CisgICAgICAgICAgICByZXR1cm4gYXJnCisgICAgICAgIGlmIGxlbihhcmcpID49IDIgYW5kIChhcmdbMF0sYXJnWy0xXSkgaW4gKCgnKCcsJyknKSwoJyInLCciJykpOgorICAgICAgICAgICAgcmV0dXJuIGFyZworICAgICAgICBpZiBhcmcgYW5kIHNlbGYubXVzdHF1b3RlLnNlYXJjaChhcmcpIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gYXJnCisgICAgICAgIHJldHVybiBzZWxmLl9xdW90ZShhcmcpCisKKworICAgIGRlZiBfcXVvdGUoc2VsZiwgYXJnKToKKworICAgICAgICBhcmcgPSBhcmcucmVwbGFjZSgnXFwnLCAnXFxcXCcpCisgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKCciJywgJ1xcIicpCisKKyAgICAgICAgcmV0dXJuICciJXMiJyAlIGFyZworCisKKyAgICBkZWYgX3NpbXBsZV9jb21tYW5kKHNlbGYsIG5hbWUsICphcmdzKToKKworICAgICAgICByZXR1cm4gc2VsZi5fY29tbWFuZF9jb21wbGV0ZShuYW1lLCBzZWxmLl9jb21tYW5kKG5hbWUsICphcmdzKSkKKworCisgICAgZGVmIF91bnRhZ2dlZF9yZXNwb25zZShzZWxmLCB0eXAsIGRhdCwgbmFtZSk6CisKKyAgICAgICAgaWYgdHlwID09ICdOTyc6CisgICAgICAgICAgICByZXR1cm4gdHlwLCBkYXQKKyAgICAgICAgaWYgbm90IG5hbWUgaW4gc2VsZi51bnRhZ2dlZF9yZXNwb25zZXM6CisgICAgICAgICAgICByZXR1cm4gdHlwLCBbTm9uZV0KKyAgICAgICAgZGF0YSA9IHNlbGYudW50YWdnZWRfcmVzcG9uc2VzLnBvcChuYW1lKQorICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDU6CisgICAgICAgICAgICAgICAgc2VsZi5fbWVzZygndW50YWdnZWRfcmVzcG9uc2VzWyVzXSA9PiAlcycgJSAobmFtZSwgZGF0YSkpCisgICAgICAgIHJldHVybiB0eXAsIGRhdGEKKworCisgICAgaWYgX19kZWJ1Z19fOgorCisgICAgICAgIGRlZiBfbWVzZyhzZWxmLCBzLCBzZWNzPU5vbmUpOgorICAgICAgICAgICAgaWYgc2VjcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlY3MgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgdG0gPSB0aW1lLnN0cmZ0aW1lKCclTTolUycsIHRpbWUubG9jYWx0aW1lKHNlY3MpKQorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnICAlcy4lMDJkICVzXG4nICUgKHRtLCAoc2VjcyoxMDApJTEwMCwgcykpCisgICAgICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKKworICAgICAgICBkZWYgX2R1bXBfdXIoc2VsZiwgZGljdCk6CisgICAgICAgICAgICAjIER1bXAgdW50YWdnZWQgcmVzcG9uc2VzIChpbiBgZGljdCcpLgorICAgICAgICAgICAgbCA9IGRpY3QuaXRlbXMoKQorICAgICAgICAgICAgaWYgbm90IGw6IHJldHVybgorICAgICAgICAgICAgdCA9ICdcblx0XHQnCisgICAgICAgICAgICBsID0gbWFwKGxhbWJkYSB4OiclczogIiVzIicgJSAoeFswXSwgeFsxXVswXSBhbmQgJyIgIicuam9pbih4WzFdKSBvciAnJyksIGwpCisgICAgICAgICAgICBzZWxmLl9tZXNnKCd1bnRhZ2dlZCByZXNwb25zZXMgZHVtcDolcyVzJyAlICh0LCB0LmpvaW4obCkpKQorCisgICAgICAgIGRlZiBfbG9nKHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgIyBLZWVwIGxvZyBvZiBsYXN0IGBfY21kX2xvZ19sZW4nIGludGVyYWN0aW9ucyBmb3IgZGVidWdnaW5nLgorICAgICAgICAgICAgc2VsZi5fY21kX2xvZ1tzZWxmLl9jbWRfbG9nX2lkeF0gPSAobGluZSwgdGltZS50aW1lKCkpCisgICAgICAgICAgICBzZWxmLl9jbWRfbG9nX2lkeCArPSAxCisgICAgICAgICAgICBpZiBzZWxmLl9jbWRfbG9nX2lkeCA+PSBzZWxmLl9jbWRfbG9nX2xlbjoKKyAgICAgICAgICAgICAgICBzZWxmLl9jbWRfbG9nX2lkeCA9IDAKKworICAgICAgICBkZWYgcHJpbnRfbG9nKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fbWVzZygnbGFzdCAlZCBJTUFQNCBpbnRlcmFjdGlvbnM6JyAlIGxlbihzZWxmLl9jbWRfbG9nKSkKKyAgICAgICAgICAgIGksIG4gPSBzZWxmLl9jbWRfbG9nX2lkeCwgc2VsZi5fY21kX2xvZ19sZW4KKyAgICAgICAgICAgIHdoaWxlIG46CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9tZXNnKCpzZWxmLl9jbWRfbG9nW2ldKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgICAgIGlmIGkgPj0gc2VsZi5fY21kX2xvZ19sZW46CisgICAgICAgICAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICAgICAgbiAtPSAxCisKKworCit0cnk6CisgICAgaW1wb3J0IHNzbAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3MgSU1BUDRfU1NMKElNQVA0KToKKworICAgICAgICAiIiJJTUFQNCBjbGllbnQgY2xhc3Mgb3ZlciBTU0wgY29ubmVjdGlvbgorCisgICAgICAgIEluc3RhbnRpYXRlIHdpdGg6IElNQVA0X1NTTChbaG9zdFssIHBvcnRbLCBrZXlmaWxlWywgY2VydGZpbGVdXV1dKQorCisgICAgICAgICAgICAgICAgaG9zdCAtIGhvc3QncyBuYW1lIChkZWZhdWx0OiBsb2NhbGhvc3QpOworICAgICAgICAgICAgICAgIHBvcnQgLSBwb3J0IG51bWJlciAoZGVmYXVsdDogc3RhbmRhcmQgSU1BUDQgU1NMIHBvcnQpLgorICAgICAgICAgICAgICAgIGtleWZpbGUgLSBQRU0gZm9ybWF0dGVkIGZpbGUgdGhhdCBjb250YWlucyB5b3VyIHByaXZhdGUga2V5IChkZWZhdWx0OiBOb25lKTsKKyAgICAgICAgICAgICAgICBjZXJ0ZmlsZSAtIFBFTSBmb3JtYXR0ZWQgY2VydGlmaWNhdGUgY2hhaW4gZmlsZSAoZGVmYXVsdDogTm9uZSk7CisKKyAgICAgICAgZm9yIG1vcmUgZG9jdW1lbnRhdGlvbiBzZWUgdGhlIGRvY3N0cmluZyBvZiB0aGUgcGFyZW50IGNsYXNzIElNQVA0LgorICAgICAgICAiIiIKKworCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0ID0gJycsIHBvcnQgPSBJTUFQNF9TU0xfUE9SVCwga2V5ZmlsZSA9IE5vbmUsIGNlcnRmaWxlID0gTm9uZSk6CisgICAgICAgICAgICBzZWxmLmtleWZpbGUgPSBrZXlmaWxlCisgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKKyAgICAgICAgICAgIElNQVA0Ll9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQpCisKKworICAgICAgICBkZWYgb3BlbihzZWxmLCBob3N0ID0gJycsIHBvcnQgPSBJTUFQNF9TU0xfUE9SVCk6CisgICAgICAgICAgICAiIiJTZXR1cCBjb25uZWN0aW9uIHRvIHJlbW90ZSBzZXJ2ZXIgb24gImhvc3Q6cG9ydCIuCisgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IGxvY2FsaG9zdDpzdGFuZGFyZCBJTUFQNCBTU0wgcG9ydCkuCisgICAgICAgICAgICBUaGlzIGNvbm5lY3Rpb24gd2lsbCBiZSB1c2VkIGJ5IHRoZSByb3V0aW5lczoKKyAgICAgICAgICAgICAgICByZWFkLCByZWFkbGluZSwgc2VuZCwgc2h1dGRvd24uCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoaG9zdCwgcG9ydCkpCisgICAgICAgICAgICBzZWxmLnNzbG9iaiA9IHNzbC53cmFwX3NvY2tldChzZWxmLnNvY2ssIHNlbGYua2V5ZmlsZSwgc2VsZi5jZXJ0ZmlsZSkKKyAgICAgICAgICAgIHNlbGYuZmlsZSA9IHNlbGYuc3Nsb2JqLm1ha2VmaWxlKCdyYicpCisKKworICAgICAgICBkZWYgcmVhZChzZWxmLCBzaXplKToKKyAgICAgICAgICAgICIiIlJlYWQgJ3NpemUnIGJ5dGVzIGZyb20gcmVtb3RlLiIiIgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZS5yZWFkKHNpemUpCisKKworICAgICAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgICAgICAiIiJSZWFkIGxpbmUgZnJvbSByZW1vdGUuIiIiCisgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlLnJlYWRsaW5lKCkKKworCisgICAgICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgorICAgICAgICAgICAgIiIiU2VuZCBkYXRhIHRvIHJlbW90ZS4iIiIKKyAgICAgICAgICAgIGJ5dGVzID0gbGVuKGRhdGEpCisgICAgICAgICAgICB3aGlsZSBieXRlcyA+IDA6CisgICAgICAgICAgICAgICAgc2VudCA9IHNlbGYuc3Nsb2JqLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgaWYgc2VudCA9PSBieXRlczoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAgIyBhdm9pZCBjb3B5CisgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFbc2VudDpdCisgICAgICAgICAgICAgICAgYnl0ZXMgPSBieXRlcyAtIHNlbnQKKworCisgICAgICAgIGRlZiBzaHV0ZG93bihzZWxmKToKKyAgICAgICAgICAgICIiIkNsb3NlIEkvTyBlc3RhYmxpc2hlZCBpbiAib3BlbiIuIiIiCisgICAgICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKworCisgICAgICAgIGRlZiBzb2NrZXQoc2VsZik6CisgICAgICAgICAgICAiIiJSZXR1cm4gc29ja2V0IGluc3RhbmNlIHVzZWQgdG8gY29ubmVjdCB0byBJTUFQNCBzZXJ2ZXIuCisKKyAgICAgICAgICAgIHNvY2tldCA9IDxpbnN0YW5jZT4uc29ja2V0KCkKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc29jaworCisKKyAgICAgICAgZGVmIHNzbChzZWxmKToKKyAgICAgICAgICAgICIiIlJldHVybiBTU0xPYmplY3QgaW5zdGFuY2UgdXNlZCB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBJTUFQNCBzZXJ2ZXIuCisKKyAgICAgICAgICAgIHNzbCA9IHNzbC53cmFwX3NvY2tldCg8aW5zdGFuY2U+LnNvY2tldCkKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3Nsb2JqCisKKyAgICBfX2FsbF9fLmFwcGVuZCgiSU1BUDRfU1NMIikKKworCitjbGFzcyBJTUFQNF9zdHJlYW0oSU1BUDQpOgorCisgICAgIiIiSU1BUDQgY2xpZW50IGNsYXNzIG92ZXIgYSBzdHJlYW0KKworICAgIEluc3RhbnRpYXRlIHdpdGg6IElNQVA0X3N0cmVhbShjb21tYW5kKQorCisgICAgICAgICAgICB3aGVyZSAiY29tbWFuZCIgaXMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHN1YnByb2Nlc3MuUG9wZW4oKQorCisgICAgZm9yIG1vcmUgZG9jdW1lbnRhdGlvbiBzZWUgdGhlIGRvY3N0cmluZyBvZiB0aGUgcGFyZW50IGNsYXNzIElNQVA0LgorICAgICIiIgorCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29tbWFuZCk6CisgICAgICAgIHNlbGYuY29tbWFuZCA9IGNvbW1hbmQKKyAgICAgICAgSU1BUDQuX19pbml0X18oc2VsZikKKworCisgICAgZGVmIG9wZW4oc2VsZiwgaG9zdCA9IE5vbmUsIHBvcnQgPSBOb25lKToKKyAgICAgICAgIiIiU2V0dXAgYSBzdHJlYW0gY29ubmVjdGlvbi4KKyAgICAgICAgVGhpcyBjb25uZWN0aW9uIHdpbGwgYmUgdXNlZCBieSB0aGUgcm91dGluZXM6CisgICAgICAgICAgICByZWFkLCByZWFkbGluZSwgc2VuZCwgc2h1dGRvd24uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmhvc3QgPSBOb25lICAgICAgICAjIEZvciBjb21wYXRpYmlsaXR5IHdpdGggcGFyZW50IGNsYXNzCisgICAgICAgIHNlbGYucG9ydCA9IE5vbmUKKyAgICAgICAgc2VsZi5zb2NrID0gTm9uZQorICAgICAgICBzZWxmLmZpbGUgPSBOb25lCisgICAgICAgIHNlbGYucHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oc2VsZi5jb21tYW5kLAorICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgc2hlbGw9VHJ1ZSwgY2xvc2VfZmRzPVRydWUpCisgICAgICAgIHNlbGYud3JpdGVmaWxlID0gc2VsZi5wcm9jZXNzLnN0ZGluCisgICAgICAgIHNlbGYucmVhZGZpbGUgPSBzZWxmLnByb2Nlc3Muc3Rkb3V0CisKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgorICAgICAgICAiIiJSZWFkICdzaXplJyBieXRlcyBmcm9tIHJlbW90ZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZGZpbGUucmVhZChzaXplKQorCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgICIiIlJlYWQgbGluZSBmcm9tIHJlbW90ZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZGZpbGUucmVhZGxpbmUoKQorCisKKyAgICBkZWYgc2VuZChzZWxmLCBkYXRhKToKKyAgICAgICAgIiIiU2VuZCBkYXRhIHRvIHJlbW90ZS4iIiIKKyAgICAgICAgc2VsZi53cml0ZWZpbGUud3JpdGUoZGF0YSkKKyAgICAgICAgc2VsZi53cml0ZWZpbGUuZmx1c2goKQorCisKKyAgICBkZWYgc2h1dGRvd24oc2VsZik6CisgICAgICAgICIiIkNsb3NlIEkvTyBlc3RhYmxpc2hlZCBpbiAib3BlbiIuIiIiCisgICAgICAgIHNlbGYucmVhZGZpbGUuY2xvc2UoKQorICAgICAgICBzZWxmLndyaXRlZmlsZS5jbG9zZSgpCisgICAgICAgIHNlbGYucHJvY2Vzcy53YWl0KCkKKworCisKK2NsYXNzIF9BdXRoZW50aWNhdG9yOgorCisgICAgIiIiUHJpdmF0ZSBjbGFzcyB0byBwcm92aWRlIGVuL2RlY29kaW5nCisgICAgICAgICAgICBmb3IgYmFzZTY0LWJhc2VkIGF1dGhlbnRpY2F0aW9uIGNvbnZlcnNhdGlvbi4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZWNoaW5zdCk6CisgICAgICAgIHNlbGYubWVjaCA9IG1lY2hpbnN0ICAgICMgQ2FsbGFibGUgb2JqZWN0IHRvIHByb3ZpZGUvcHJvY2VzcyBkYXRhCisKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBkYXRhKToKKyAgICAgICAgcmV0ID0gc2VsZi5tZWNoKHNlbGYuZGVjb2RlKGRhdGEpKQorICAgICAgICBpZiByZXQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnKicgICAgICAjIEFib3J0IGNvbnZlcnNhdGlvbgorICAgICAgICByZXR1cm4gc2VsZi5lbmNvZGUocmV0KQorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnApOgorICAgICAgICAjCisgICAgICAgICMgIEludm9rZSBiaW5hc2NpaS5iMmFfYmFzZTY0IGl0ZXJhdGl2ZWx5IHdpdGgKKyAgICAgICAgIyAgc2hvcnQgZXZlbiBsZW5ndGggYnVmZmVycywgc3RyaXAgdGhlIHRyYWlsaW5nCisgICAgICAgICMgIGxpbmUgZmVlZCBmcm9tIHRoZSByZXN1bHQgYW5kIGFwcGVuZC4gICJFdmVuIgorICAgICAgICAjICBtZWFucyBhIG51bWJlciB0aGF0IGZhY3RvcnMgdG8gYm90aCA2IGFuZCA4LAorICAgICAgICAjICBzbyB3aGVuIGl0IGdldHMgdG8gdGhlIGVuZCBvZiB0aGUgOC1iaXQgaW5wdXQKKyAgICAgICAgIyAgdGhlcmUncyBubyBwYXJ0aWFsIDYtYml0IG91dHB1dC4KKyAgICAgICAgIworICAgICAgICBvdXAgPSAnJworICAgICAgICB3aGlsZSBpbnA6CisgICAgICAgICAgICBpZiBsZW4oaW5wKSA+IDQ4OgorICAgICAgICAgICAgICAgIHQgPSBpbnBbOjQ4XQorICAgICAgICAgICAgICAgIGlucCA9IGlucFs0ODpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHQgPSBpbnAKKyAgICAgICAgICAgICAgICBpbnAgPSAnJworICAgICAgICAgICAgZSA9IGJpbmFzY2lpLmIyYV9iYXNlNjQodCkKKyAgICAgICAgICAgIGlmIGU6CisgICAgICAgICAgICAgICAgb3VwID0gb3VwICsgZVs6LTFdCisgICAgICAgIHJldHVybiBvdXAKKworICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wKToKKyAgICAgICAgaWYgbm90IGlucDoKKyAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICByZXR1cm4gYmluYXNjaWkuYTJiX2Jhc2U2NChpbnApCisKKworCitNb24ybnVtID0geydKYW4nOiAxLCAnRmViJzogMiwgJ01hcic6IDMsICdBcHInOiA0LCAnTWF5JzogNSwgJ0p1bic6IDYsCisgICAgICAgICdKdWwnOiA3LCAnQXVnJzogOCwgJ1NlcCc6IDksICdPY3QnOiAxMCwgJ05vdic6IDExLCAnRGVjJzogMTJ9CisKK2RlZiBJbnRlcm5hbGRhdGUydHVwbGUocmVzcCk6CisgICAgIiIiUGFyc2UgYW4gSU1BUDQgSU5URVJOQUxEQVRFIHN0cmluZy4KKworICAgIFJldHVybiBjb3JyZXNwb25kaW5nIGxvY2FsIHRpbWUuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEKKyAgICB0aW1lLnN0cnVjdF90aW1lIGluc3RhbmNlIG9yIE5vbmUgaWYgdGhlIHN0cmluZyBoYXMgd3JvbmcgZm9ybWF0LgorICAgICIiIgorCisgICAgbW8gPSBJbnRlcm5hbERhdGUubWF0Y2gocmVzcCkKKyAgICBpZiBub3QgbW86CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBtb24gPSBNb24ybnVtW21vLmdyb3VwKCdtb24nKV0KKyAgICB6b25lbiA9IG1vLmdyb3VwKCd6b25lbicpCisKKyAgICBkYXkgPSBpbnQobW8uZ3JvdXAoJ2RheScpKQorICAgIHllYXIgPSBpbnQobW8uZ3JvdXAoJ3llYXInKSkKKyAgICBob3VyID0gaW50KG1vLmdyb3VwKCdob3VyJykpCisgICAgbWluID0gaW50KG1vLmdyb3VwKCdtaW4nKSkKKyAgICBzZWMgPSBpbnQobW8uZ3JvdXAoJ3NlYycpKQorICAgIHpvbmVoID0gaW50KG1vLmdyb3VwKCd6b25laCcpKQorICAgIHpvbmVtID0gaW50KG1vLmdyb3VwKCd6b25lbScpKQorCisgICAgIyBJTlRFUk5BTERBVEUgdGltZXpvbmUgbXVzdCBiZSBzdWJ0cmFjdGVkIHRvIGdldCBVVAorCisgICAgem9uZSA9ICh6b25laCo2MCArIHpvbmVtKSo2MAorICAgIGlmIHpvbmVuID09ICctJzoKKyAgICAgICAgem9uZSA9IC16b25lCisKKyAgICB0dCA9ICh5ZWFyLCBtb24sIGRheSwgaG91ciwgbWluLCBzZWMsIC0xLCAtMSwgLTEpCisKKyAgICB1dGMgPSB0aW1lLm1rdGltZSh0dCkKKworICAgICMgRm9sbG93aW5nIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSB0aW1lIG1vZHVsZSBoYXMgbm8gJ21rZ210aW1lJy4KKyAgICAjICdta3RpbWUnIGFzc3VtZXMgYXJnIGluIGxvY2FsIHRpbWV6b25lLCBzbyBhZGRzIHRpbWV6b25lL2FsdHpvbmUuCisKKyAgICBsdCA9IHRpbWUubG9jYWx0aW1lKHV0YykKKyAgICBpZiB0aW1lLmRheWxpZ2h0IGFuZCBsdFstMV06CisgICAgICAgIHpvbmUgPSB6b25lICsgdGltZS5hbHR6b25lCisgICAgZWxzZToKKyAgICAgICAgem9uZSA9IHpvbmUgKyB0aW1lLnRpbWV6b25lCisKKyAgICByZXR1cm4gdGltZS5sb2NhbHRpbWUodXRjIC0gem9uZSkKKworCisKK2RlZiBJbnQyQVAobnVtKToKKworICAgICIiIkNvbnZlcnQgaW50ZWdlciB0byBBLVAgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiIiIgorCisgICAgdmFsID0gJyc7IEFQID0gJ0FCQ0RFRkdISUpLTE1OT1AnCisgICAgbnVtID0gaW50KGFicyhudW0pKQorICAgIHdoaWxlIG51bToKKyAgICAgICAgbnVtLCBtb2QgPSBkaXZtb2QobnVtLCAxNikKKyAgICAgICAgdmFsID0gQVBbbW9kXSArIHZhbAorICAgIHJldHVybiB2YWwKKworCisKK2RlZiBQYXJzZUZsYWdzKHJlc3ApOgorCisgICAgIiIiQ29udmVydCBJTUFQNCBmbGFncyByZXNwb25zZSB0byBweXRob24gdHVwbGUuIiIiCisKKyAgICBtbyA9IEZsYWdzLm1hdGNoKHJlc3ApCisgICAgaWYgbm90IG1vOgorICAgICAgICByZXR1cm4gKCkKKworICAgIHJldHVybiB0dXBsZShtby5ncm91cCgnZmxhZ3MnKS5zcGxpdCgpKQorCisKK2RlZiBUaW1lMkludGVybmFsZGF0ZShkYXRlX3RpbWUpOgorCisgICAgIiIiQ29udmVydCBkYXRlX3RpbWUgdG8gSU1BUDQgSU5URVJOQUxEQVRFIHJlcHJlc2VudGF0aW9uLgorCisgICAgUmV0dXJuIHN0cmluZyBpbiBmb3JtOiAnIkRELU1tbS1ZWVlZIEhIOk1NOlNTICtISE1NIicuICBUaGUKKyAgICBkYXRlX3RpbWUgYXJndW1lbnQgY2FuIGJlIGEgbnVtYmVyIChpbnQgb3IgZmxvYXQpIHJlcHJlc2VudGluZworICAgIHNlY29uZHMgc2luY2UgZXBvY2ggKGFzIHJldHVybmVkIGJ5IHRpbWUudGltZSgpKSwgYSA5LXR1cGxlCisgICAgcmVwcmVzZW50aW5nIGxvY2FsIHRpbWUgKGFzIHJldHVybmVkIGJ5IHRpbWUubG9jYWx0aW1lKCkpLCBvciBhCisgICAgZG91YmxlLXF1b3RlZCBzdHJpbmcuICBJbiB0aGUgbGFzdCBjYXNlLCBpdCBpcyBhc3N1bWVkIHRvIGFscmVhZHkKKyAgICBiZSBpbiB0aGUgY29ycmVjdCBmb3JtYXQuCisgICAgIiIiCisKKyAgICBpZiBpc2luc3RhbmNlKGRhdGVfdGltZSwgKGludCwgZmxvYXQpKToKKyAgICAgICAgdHQgPSB0aW1lLmxvY2FsdGltZShkYXRlX3RpbWUpCisgICAgZWxpZiBpc2luc3RhbmNlKGRhdGVfdGltZSwgKHR1cGxlLCB0aW1lLnN0cnVjdF90aW1lKSk6CisgICAgICAgIHR0ID0gZGF0ZV90aW1lCisgICAgZWxpZiBpc2luc3RhbmNlKGRhdGVfdGltZSwgc3RyKSBhbmQgKGRhdGVfdGltZVswXSxkYXRlX3RpbWVbLTFdKSA9PSAoJyInLCciJyk6CisgICAgICAgIHJldHVybiBkYXRlX3RpbWUgICAgICAgICMgQXNzdW1lIGluIGNvcnJlY3QgZm9ybWF0CisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZGF0ZV90aW1lIG5vdCBvZiBhIGtub3duIHR5cGUiKQorCisgICAgZHQgPSB0aW1lLnN0cmZ0aW1lKCIlZC0lYi0lWSAlSDolTTolUyIsIHR0KQorICAgIGlmIGR0WzBdID09ICcwJzoKKyAgICAgICAgZHQgPSAnICcgKyBkdFsxOl0KKyAgICBpZiB0aW1lLmRheWxpZ2h0IGFuZCB0dFstMV06CisgICAgICAgIHpvbmUgPSAtdGltZS5hbHR6b25lCisgICAgZWxzZToKKyAgICAgICAgem9uZSA9IC10aW1lLnRpbWV6b25lCisgICAgcmV0dXJuICciJyArIGR0ICsgIiAlKzAzZCUwMmQiICUgZGl2bW9kKHpvbmUvLzYwLCA2MCkgKyAnIicKKworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisKKyAgICAjIFRvIHRlc3Q6IGludm9rZSBlaXRoZXIgYXMgJ3B5dGhvbiBpbWFwbGliLnB5IFtJTUFQNF9zZXJ2ZXJfaG9zdG5hbWVdJworICAgICMgb3IgJ3B5dGhvbiBpbWFwbGliLnB5IC1zICJyc2ggSU1BUDRfc2VydmVyX2hvc3RuYW1lIGV4ZWMgL2V0Yy9yaW1hcGQiJworICAgICMgdG8gdGVzdCB0aGUgSU1BUDRfc3RyZWFtIGNsYXNzCisKKyAgICBpbXBvcnQgZ2V0b3B0LCBnZXRwYXNzCisKKyAgICB0cnk6CisgICAgICAgIG9wdGxpc3QsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ2Q6czonKQorICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIHZhbDoKKyAgICAgICAgb3B0bGlzdCwgYXJncyA9ICgpLCAoKQorCisgICAgc3RyZWFtX2NvbW1hbmQgPSBOb25lCisgICAgZm9yIG9wdCx2YWwgaW4gb3B0bGlzdDoKKyAgICAgICAgaWYgb3B0ID09ICctZCc6CisgICAgICAgICAgICBEZWJ1ZyA9IGludCh2YWwpCisgICAgICAgIGVsaWYgb3B0ID09ICctcyc6CisgICAgICAgICAgICBzdHJlYW1fY29tbWFuZCA9IHZhbAorICAgICAgICAgICAgaWYgbm90IGFyZ3M6IGFyZ3MgPSAoc3RyZWFtX2NvbW1hbmQsKQorCisgICAgaWYgbm90IGFyZ3M6IGFyZ3MgPSAoJycsKQorCisgICAgaG9zdCA9IGFyZ3NbMF0KKworICAgIFVTRVIgPSBnZXRwYXNzLmdldHVzZXIoKQorICAgIFBBU1NXRCA9IGdldHBhc3MuZ2V0cGFzcygiSU1BUCBwYXNzd29yZCBmb3IgJXMgb24gJXM6ICIgJSAoVVNFUiwgaG9zdCBvciAibG9jYWxob3N0IikpCisKKyAgICB0ZXN0X21lc2cgPSAnRnJvbTogJSh1c2VyKXNAbG9jYWxob3N0JShsZilzU3ViamVjdDogSU1BUDQgdGVzdCUobGYpcyUobGYpc2RhdGEuLi4lKGxmKXMnICUgeyd1c2VyJzpVU0VSLCAnbGYnOidcbid9CisgICAgdGVzdF9zZXExID0gKAorICAgICgnbG9naW4nLCAoVVNFUiwgUEFTU1dEKSksCisgICAgKCdjcmVhdGUnLCAoJy90bXAveHh4IDEnLCkpLAorICAgICgncmVuYW1lJywgKCcvdG1wL3h4eCAxJywgJy90bXAveXl5JykpLAorICAgICgnQ1JFQVRFJywgKCcvdG1wL3l5eiAyJywpKSwKKyAgICAoJ2FwcGVuZCcsICgnL3RtcC95eXogMicsIE5vbmUsIE5vbmUsIHRlc3RfbWVzZykpLAorICAgICgnbGlzdCcsICgnL3RtcCcsICd5eSonKSksCisgICAgKCdzZWxlY3QnLCAoJy90bXAveXl6IDInLCkpLAorICAgICgnc2VhcmNoJywgKE5vbmUsICdTVUJKRUNUJywgJ3Rlc3QnKSksCisgICAgKCdmZXRjaCcsICgnMScsICcoRkxBR1MgSU5URVJOQUxEQVRFIFJGQzgyMiknKSksCisgICAgKCdzdG9yZScsICgnMScsICdGTEFHUycsICcoXERlbGV0ZWQpJykpLAorICAgICgnbmFtZXNwYWNlJywgKCkpLAorICAgICgnZXhwdW5nZScsICgpKSwKKyAgICAoJ3JlY2VudCcsICgpKSwKKyAgICAoJ2Nsb3NlJywgKCkpLAorICAgICkKKworICAgIHRlc3Rfc2VxMiA9ICgKKyAgICAoJ3NlbGVjdCcsICgpKSwKKyAgICAoJ3Jlc3BvbnNlJywoJ1VJRFZBTElESVRZJywpKSwKKyAgICAoJ3VpZCcsICgnU0VBUkNIJywgJ0FMTCcpKSwKKyAgICAoJ3Jlc3BvbnNlJywgKCdFWElTVFMnLCkpLAorICAgICgnYXBwZW5kJywgKE5vbmUsIE5vbmUsIE5vbmUsIHRlc3RfbWVzZykpLAorICAgICgncmVjZW50JywgKCkpLAorICAgICgnbG9nb3V0JywgKCkpLAorICAgICkKKworICAgIGRlZiBydW4oY21kLCBhcmdzKToKKyAgICAgICAgTS5fbWVzZygnJXMgJXMnICUgKGNtZCwgYXJncykpCisgICAgICAgIHR5cCwgZGF0ID0gZ2V0YXR0cihNLCBjbWQpKCphcmdzKQorICAgICAgICBNLl9tZXNnKCclcyA9PiAlcyAlcycgJSAoY21kLCB0eXAsIGRhdCkpCisgICAgICAgIGlmIHR5cCA9PSAnTk8nOiByYWlzZSBkYXRbMF0KKyAgICAgICAgcmV0dXJuIGRhdAorCisgICAgdHJ5OgorICAgICAgICBpZiBzdHJlYW1fY29tbWFuZDoKKyAgICAgICAgICAgIE0gPSBJTUFQNF9zdHJlYW0oc3RyZWFtX2NvbW1hbmQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBNID0gSU1BUDQoaG9zdCkKKyAgICAgICAgaWYgTS5zdGF0ZSA9PSAnQVVUSCc6CisgICAgICAgICAgICB0ZXN0X3NlcTEgPSB0ZXN0X3NlcTFbMTpdICAgIyBMb2dpbiBub3QgbmVlZGVkCisgICAgICAgIE0uX21lc2coJ1BST1RPQ09MX1ZFUlNJT04gPSAlcycgJSBNLlBST1RPQ09MX1ZFUlNJT04pCisgICAgICAgIE0uX21lc2coJ0NBUEFCSUxJVElFUyA9ICVyJyAlIChNLmNhcGFiaWxpdGllcywpKQorCisgICAgICAgIGZvciBjbWQsYXJncyBpbiB0ZXN0X3NlcTE6CisgICAgICAgICAgICBydW4oY21kLCBhcmdzKQorCisgICAgICAgIGZvciBtbCBpbiBydW4oJ2xpc3QnLCAoJy90bXAvJywgJ3l5JScpKToKKyAgICAgICAgICAgIG1vID0gcmUubWF0Y2gocicuKiIoW14iXSspIiQnLCBtbCkKKyAgICAgICAgICAgIGlmIG1vOiBwYXRoID0gbW8uZ3JvdXAoMSkKKyAgICAgICAgICAgIGVsc2U6IHBhdGggPSBtbC5zcGxpdCgpWy0xXQorICAgICAgICAgICAgcnVuKCdkZWxldGUnLCAocGF0aCwpKQorCisgICAgICAgIGZvciBjbWQsYXJncyBpbiB0ZXN0X3NlcTI6CisgICAgICAgICAgICBkYXQgPSBydW4oY21kLCBhcmdzKQorCisgICAgICAgICAgICBpZiAoY21kLGFyZ3MpICE9ICgndWlkJywgKCdTRUFSQ0gnLCAnQUxMJykpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHVpZCA9IGRhdFstMV0uc3BsaXQoKQorICAgICAgICAgICAgaWYgbm90IHVpZDogY29udGludWUKKyAgICAgICAgICAgIHJ1bigndWlkJywgKCdGRVRDSCcsICclcycgJSB1aWRbLTFdLAorICAgICAgICAgICAgICAgICAgICAnKEZMQUdTIElOVEVSTkFMREFURSBSRkM4MjIuU0laRSBSRkM4MjIuSEVBREVSIFJGQzgyMi5URVhUKScpKQorCisgICAgICAgIHByaW50ICdcbkFsbCB0ZXN0cyBPSy4nCisKKyAgICBleGNlcHQ6CisgICAgICAgIHByaW50ICdcblRlc3RzIGZhaWxlZC4nCisKKyAgICAgICAgaWYgbm90IERlYnVnOgorICAgICAgICAgICAgcHJpbnQgJycnCitJZiB5b3Ugd291bGQgbGlrZSB0byBzZWUgZGVidWdnaW5nIG91dHB1dCwKK3RyeTogJXMgLWQ1CisnJycgJSBzeXMuYXJndlswXQorCisgICAgICAgIHJhaXNlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ltYXBsaWIucHljIGIvbGliL3B5dGhvbjIuNy9pbWFwbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzhmY2RiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pbWFwbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ltYXBsaWIucHlvIGIvbGliL3B5dGhvbjIuNy9pbWFwbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjdiZmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pbWFwbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ltZ2hkci5weSBiL2xpYi9weXRob24yLjcvaW1naGRyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ODMwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ltZ2hkci5weQpAQCAtMCwwICsxLDE2MSBAQAorIiIiUmVjb2duaXplIGltYWdlIGZpbGUgZm9ybWF0cyBiYXNlZCBvbiB0aGVpciBmaXJzdCBmZXcgYnl0ZXMuIiIiCisKK19fYWxsX18gPSBbIndoYXQiXQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyMgUmVjb2duaXplIGltYWdlIGhlYWRlcnMgIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisKK2RlZiB3aGF0KGZpbGUsIGg9Tm9uZSk6CisgICAgaWYgaCBpcyBOb25lOgorICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgZiA9IG9wZW4oZmlsZSwgJ3JiJykKKyAgICAgICAgICAgIGggPSBmLnJlYWQoMzIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2NhdGlvbiA9IGZpbGUudGVsbCgpCisgICAgICAgICAgICBoID0gZmlsZS5yZWFkKDMyKQorICAgICAgICAgICAgZmlsZS5zZWVrKGxvY2F0aW9uKQorICAgICAgICAgICAgZiA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgICBmID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgZm9yIHRmIGluIHRlc3RzOgorICAgICAgICAgICAgcmVzID0gdGYoaCwgZikKKyAgICAgICAgICAgIGlmIHJlczoKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzCisgICAgZmluYWxseToKKyAgICAgICAgaWYgZjogZi5jbG9zZSgpCisgICAgcmV0dXJuIE5vbmUKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworIyBTdWJyb3V0aW5lcyBwZXIgaW1hZ2UgZmlsZSB0eXBlICMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisKK3Rlc3RzID0gW10KKworZGVmIHRlc3RfanBlZyhoLCBmKToKKyAgICAiIiJKUEVHIGRhdGEgaW4gSkZJRiBmb3JtYXQiIiIKKyAgICBpZiBoWzY6MTBdID09ICdKRklGJzoKKyAgICAgICAgcmV0dXJuICdqcGVnJworCit0ZXN0cy5hcHBlbmQodGVzdF9qcGVnKQorCitkZWYgdGVzdF9leGlmKGgsIGYpOgorICAgICIiIkpQRUcgZGF0YSBpbiBFeGlmIGZvcm1hdCIiIgorICAgIGlmIGhbNjoxMF0gPT0gJ0V4aWYnOgorICAgICAgICByZXR1cm4gJ2pwZWcnCisKK3Rlc3RzLmFwcGVuZCh0ZXN0X2V4aWYpCisKK2RlZiB0ZXN0X3BuZyhoLCBmKToKKyAgICBpZiBoWzo4XSA9PSAiXDIxMVBOR1xyXG5cMDMyXG4iOgorICAgICAgICByZXR1cm4gJ3BuZycKKwordGVzdHMuYXBwZW5kKHRlc3RfcG5nKQorCitkZWYgdGVzdF9naWYoaCwgZik6CisgICAgIiIiR0lGICgnODcgYW5kICc4OSB2YXJpYW50cykiIiIKKyAgICBpZiBoWzo2XSBpbiAoJ0dJRjg3YScsICdHSUY4OWEnKToKKyAgICAgICAgcmV0dXJuICdnaWYnCisKK3Rlc3RzLmFwcGVuZCh0ZXN0X2dpZikKKworZGVmIHRlc3RfdGlmZihoLCBmKToKKyAgICAiIiJUSUZGIChjYW4gYmUgaW4gTW90b3JvbGEgb3IgSW50ZWwgYnl0ZSBvcmRlcikiIiIKKyAgICBpZiBoWzoyXSBpbiAoJ01NJywgJ0lJJyk6CisgICAgICAgIHJldHVybiAndGlmZicKKwordGVzdHMuYXBwZW5kKHRlc3RfdGlmZikKKworZGVmIHRlc3RfcmdiKGgsIGYpOgorICAgICIiIlNHSSBpbWFnZSBsaWJyYXJ5IiIiCisgICAgaWYgaFs6Ml0gPT0gJ1wwMDFcMzMyJzoKKyAgICAgICAgcmV0dXJuICdyZ2InCisKK3Rlc3RzLmFwcGVuZCh0ZXN0X3JnYikKKworZGVmIHRlc3RfcGJtKGgsIGYpOgorICAgICIiIlBCTSAocG9ydGFibGUgYml0bWFwKSIiIgorICAgIGlmIGxlbihoKSA+PSAzIGFuZCBcCisgICAgICAgIGhbMF0gPT0gJ1AnIGFuZCBoWzFdIGluICcxNCcgYW5kIGhbMl0gaW4gJyBcdFxuXHInOgorICAgICAgICByZXR1cm4gJ3BibScKKwordGVzdHMuYXBwZW5kKHRlc3RfcGJtKQorCitkZWYgdGVzdF9wZ20oaCwgZik6CisgICAgIiIiUEdNIChwb3J0YWJsZSBncmF5bWFwKSIiIgorICAgIGlmIGxlbihoKSA+PSAzIGFuZCBcCisgICAgICAgIGhbMF0gPT0gJ1AnIGFuZCBoWzFdIGluICcyNScgYW5kIGhbMl0gaW4gJyBcdFxuXHInOgorICAgICAgICByZXR1cm4gJ3BnbScKKwordGVzdHMuYXBwZW5kKHRlc3RfcGdtKQorCitkZWYgdGVzdF9wcG0oaCwgZik6CisgICAgIiIiUFBNIChwb3J0YWJsZSBwaXhtYXApIiIiCisgICAgaWYgbGVuKGgpID49IDMgYW5kIFwKKyAgICAgICAgaFswXSA9PSAnUCcgYW5kIGhbMV0gaW4gJzM2JyBhbmQgaFsyXSBpbiAnIFx0XG5ccic6CisgICAgICAgIHJldHVybiAncHBtJworCit0ZXN0cy5hcHBlbmQodGVzdF9wcG0pCisKK2RlZiB0ZXN0X3Jhc3QoaCwgZik6CisgICAgIiIiU3VuIHJhc3RlciBmaWxlIiIiCisgICAgaWYgaFs6NF0gPT0gJ1x4NTlceEE2XHg2QVx4OTUnOgorICAgICAgICByZXR1cm4gJ3Jhc3QnCisKK3Rlc3RzLmFwcGVuZCh0ZXN0X3Jhc3QpCisKK2RlZiB0ZXN0X3hibShoLCBmKToKKyAgICAiIiJYIGJpdG1hcCAoWDEwIG9yIFgxMSkiIiIKKyAgICBzID0gJyNkZWZpbmUgJworICAgIGlmIGhbOmxlbihzKV0gPT0gczoKKyAgICAgICAgcmV0dXJuICd4Ym0nCisKK3Rlc3RzLmFwcGVuZCh0ZXN0X3hibSkKKworZGVmIHRlc3RfYm1wKGgsIGYpOgorICAgIGlmIGhbOjJdID09ICdCTSc6CisgICAgICAgIHJldHVybiAnYm1wJworCit0ZXN0cy5hcHBlbmQodGVzdF9ibXApCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyMgU21hbGwgdGVzdCBwcm9ncmFtICMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLSMKKworZGVmIHRlc3QoKToKKyAgICBpbXBvcnQgc3lzCisgICAgcmVjdXJzaXZlID0gMAorICAgIGlmIHN5cy5hcmd2WzE6XSBhbmQgc3lzLmFyZ3ZbMV0gPT0gJy1yJzoKKyAgICAgICAgZGVsIHN5cy5hcmd2WzE6Ml0KKyAgICAgICAgcmVjdXJzaXZlID0gMQorICAgIHRyeToKKyAgICAgICAgaWYgc3lzLmFyZ3ZbMTpdOgorICAgICAgICAgICAgdGVzdGFsbChzeXMuYXJndlsxOl0sIHJlY3Vyc2l2ZSwgMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRlc3RhbGwoWycuJ10sIHJlY3Vyc2l2ZSwgMSkKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1xuW0ludGVycnVwdGVkXVxuJykKKyAgICAgICAgc3lzLmV4aXQoMSkKKworZGVmIHRlc3RhbGwobGlzdCwgcmVjdXJzaXZlLCB0b3BsZXZlbCk6CisgICAgaW1wb3J0IHN5cworICAgIGltcG9ydCBvcworICAgIGZvciBmaWxlbmFtZSBpbiBsaXN0OgorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKKyAgICAgICAgICAgIHByaW50IGZpbGVuYW1lICsgJy86JywKKyAgICAgICAgICAgIGlmIHJlY3Vyc2l2ZSBvciB0b3BsZXZlbDoKKyAgICAgICAgICAgICAgICBwcmludCAncmVjdXJzaW5nIGRvd246JworICAgICAgICAgICAgICAgIGltcG9ydCBnbG9iCisgICAgICAgICAgICAgICAgbmFtZXMgPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGZpbGVuYW1lLCAnKicpKQorICAgICAgICAgICAgICAgIHRlc3RhbGwobmFtZXMsIHJlY3Vyc2l2ZSwgMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJyoqKiBkaXJlY3RvcnkgKHVzZSAtcikgKioqJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgZmlsZW5hbWUgKyAnOicsCisgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwcmludCB3aGF0KGZpbGVuYW1lKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQgJyoqKiBub3QgZm91bmQgKioqJwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pbWdoZHIucHljIGIvbGliL3B5dGhvbjIuNy9pbWdoZHIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMzA0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ltZ2hkci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pbWdoZHIucHlvIGIvbGliL3B5dGhvbjIuNy9pbWdoZHIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMzA0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ltZ2hkci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pbXBvcnRsaWIvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2ltcG9ydGxpYi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDMxYTFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pbXBvcnRsaWIvX19pbml0X18ucHkKQEAgLTAsMCArMSwzOCBAQAorIiIiQmFja3BvcnQgb2YgaW1wb3J0bGliLmltcG9ydF9tb2R1bGUgZnJvbSAzLnguIiIiCisjIFdoaWxlIG5vdCBjcml0aWNhbCAoYW5kIGluIG5vIHdheSBndWFyYW50ZWVkISksIGl0IHdvdWxkIGJlIG5pY2UgdG8ga2VlcCB0aGlzCisjIGNvZGUgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMuCitpbXBvcnQgc3lzCisKK2RlZiBfcmVzb2x2ZV9uYW1lKG5hbWUsIHBhY2thZ2UsIGxldmVsKToKKyAgICAiIiJSZXR1cm4gdGhlIGFic29sdXRlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBiZSBpbXBvcnRlZC4iIiIKKyAgICBpZiBub3QgaGFzYXR0cihwYWNrYWdlLCAncmluZGV4Jyk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIidwYWNrYWdlJyBub3Qgc2V0IHRvIGEgc3RyaW5nIikKKyAgICBkb3QgPSBsZW4ocGFja2FnZSkKKyAgICBmb3IgeCBpbiB4cmFuZ2UobGV2ZWwsIDEsIC0xKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZG90ID0gcGFja2FnZS5yaW5kZXgoJy4nLCAwLCBkb3QpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBiZXlvbmQgdG9wLWxldmVsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIikKKyAgICByZXR1cm4gIiVzLiVzIiAlIChwYWNrYWdlWzpkb3RdLCBuYW1lKQorCisKK2RlZiBpbXBvcnRfbW9kdWxlKG5hbWUsIHBhY2thZ2U9Tm9uZSk6CisgICAgIiIiSW1wb3J0IGEgbW9kdWxlLgorCisgICAgVGhlICdwYWNrYWdlJyBhcmd1bWVudCBpcyByZXF1aXJlZCB3aGVuIHBlcmZvcm1pbmcgYSByZWxhdGl2ZSBpbXBvcnQuIEl0CisgICAgc3BlY2lmaWVzIHRoZSBwYWNrYWdlIHRvIHVzZSBhcyB0aGUgYW5jaG9yIHBvaW50IGZyb20gd2hpY2ggdG8gcmVzb2x2ZSB0aGUKKyAgICByZWxhdGl2ZSBpbXBvcnQgdG8gYW4gYWJzb2x1dGUgaW1wb3J0LgorCisgICAgIiIiCisgICAgaWYgbmFtZS5zdGFydHN3aXRoKCcuJyk6CisgICAgICAgIGlmIG5vdCBwYWNrYWdlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJyZWxhdGl2ZSBpbXBvcnRzIHJlcXVpcmUgdGhlICdwYWNrYWdlJyBhcmd1bWVudCIpCisgICAgICAgIGxldmVsID0gMAorICAgICAgICBmb3IgY2hhcmFjdGVyIGluIG5hbWU6CisgICAgICAgICAgICBpZiBjaGFyYWN0ZXIgIT0gJy4nOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBsZXZlbCArPSAxCisgICAgICAgIG5hbWUgPSBfcmVzb2x2ZV9uYW1lKG5hbWVbbGV2ZWw6XSwgcGFja2FnZSwgbGV2ZWwpCisgICAgX19pbXBvcnRfXyhuYW1lKQorICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pbXBvcnRsaWIvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9pbXBvcnRsaWIvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNjJkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ltcG9ydGxpYi9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pbXBvcnRsaWIvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9pbXBvcnRsaWIvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNjJkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ltcG9ydGxpYi9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pbXB1dGlsLnB5IGIvbGliL3B5dGhvbjIuNy9pbXB1dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZmE2ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ltcHV0aWwucHkKQEAgLTAsMCArMSw3MjUgQEAKKyIiIgorSW1wb3J0IHV0aWxpdGllcworCitFeHBvcnRlZCBjbGFzc2VzOgorICAgIEltcG9ydE1hbmFnZXIgICBNYW5hZ2UgdGhlIGltcG9ydCBwcm9jZXNzCisKKyAgICBJbXBvcnRlciAgICAgICAgQmFzZSBjbGFzcyBmb3IgcmVwbGFjaW5nIHN0YW5kYXJkIGltcG9ydCBmdW5jdGlvbnMKKyAgICBCdWlsdGluSW1wb3J0ZXIgRW11bGF0ZSB0aGUgaW1wb3J0IG1lY2hhbmlzbSBmb3IgYnVpbHRpbiBhbmQgZnJvemVuIG1vZHVsZXMKKworICAgIER5bkxvYWRTdWZmaXhJbXBvcnRlcgorIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSBpbXB1dGlsIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworIyBub3RlOiBhdm9pZCBpbXBvcnRpbmcgbm9uLWJ1aWx0aW4gbW9kdWxlcworaW1wb3J0IGltcCAgICAgICAgICAgICAgICAgICAgICAjIyMgbm90IGF2YWlsYWJsZSBpbiBKeXRob24/CitpbXBvcnQgc3lzCitpbXBvcnQgX19idWlsdGluX18KKworIyBmb3IgdGhlIERpcmVjdG9yeUltcG9ydGVyCitpbXBvcnQgc3RydWN0CitpbXBvcnQgbWFyc2hhbAorCitfX2FsbF9fID0gWyJJbXBvcnRNYW5hZ2VyIiwiSW1wb3J0ZXIiLCJCdWlsdGluSW1wb3J0ZXIiXQorCitfU3RyaW5nVHlwZSA9IHR5cGUoJycpCitfTW9kdWxlVHlwZSA9IHR5cGUoc3lzKSAgICAgICAgICMjIyBkb2Vzbid0IHdvcmsgaW4gSnl0aG9uLi4uCisKK2NsYXNzIEltcG9ydE1hbmFnZXI6CisgICAgIk1hbmFnZSB0aGUgaW1wb3J0IHByb2Nlc3MuIgorCisgICAgZGVmIGluc3RhbGwoc2VsZiwgbmFtZXNwYWNlPXZhcnMoX19idWlsdGluX18pKToKKyAgICAgICAgIkluc3RhbGwgdGhpcyBJbXBvcnRNYW5hZ2VyIGludG8gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuIgorCisgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZXNwYWNlLCBfTW9kdWxlVHlwZSk6CisgICAgICAgICAgICBuYW1lc3BhY2UgPSB2YXJzKG5hbWVzcGFjZSkKKworICAgICAgICAjIE5vdGU6IHdlIGhhdmUgbm8gbm90aW9uIG9mICJjaGFpbmluZyIKKworICAgICAgICAjIFJlY29yZCB0aGUgcHJldmlvdXMgaW1wb3J0IGhvb2ssIHRoZW4gaW5zdGFsbCBvdXIgb3duLgorICAgICAgICBzZWxmLnByZXZpb3VzX2ltcG9ydGVyID0gbmFtZXNwYWNlWydfX2ltcG9ydF9fJ10KKyAgICAgICAgc2VsZi5uYW1lc3BhY2UgPSBuYW1lc3BhY2UKKyAgICAgICAgbmFtZXNwYWNlWydfX2ltcG9ydF9fJ10gPSBzZWxmLl9pbXBvcnRfaG9vaworCisgICAgICAgICMjIyBmaXggdGhpcworICAgICAgICAjbmFtZXNwYWNlWydyZWxvYWQnXSA9IHNlbGYuX3JlbG9hZF9ob29rCisKKyAgICBkZWYgdW5pbnN0YWxsKHNlbGYpOgorICAgICAgICAiUmVzdG9yZSB0aGUgcHJldmlvdXMgaW1wb3J0IG1lY2hhbmlzbS4iCisgICAgICAgIHNlbGYubmFtZXNwYWNlWydfX2ltcG9ydF9fJ10gPSBzZWxmLnByZXZpb3VzX2ltcG9ydGVyCisKKyAgICBkZWYgYWRkX3N1ZmZpeChzZWxmLCBzdWZmaXgsIGltcG9ydEZ1bmMpOgorICAgICAgICBhc3NlcnQgaGFzYXR0cihpbXBvcnRGdW5jLCAnX19jYWxsX18nKQorICAgICAgICBzZWxmLmZzX2ltcC5hZGRfc3VmZml4KHN1ZmZpeCwgaW1wb3J0RnVuYykKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBQUklWQVRFIE1FVEhPRFMKKyAgICAjCisKKyAgICBjbHNGaWxlc3lzdGVtSW1wb3J0ZXIgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnNfaW1wPU5vbmUpOgorICAgICAgICAjIHdlJ3JlIGRlZmluaXRlbHkgZ29pbmcgdG8gYmUgaW1wb3J0aW5nIHNvbWV0aGluZyBpbiB0aGUgZnV0dXJlLAorICAgICAgICAjIHNvIGxldCdzIGp1c3QgbG9hZCB0aGUgT1MtcmVsYXRlZCBmYWNpbGl0aWVzLgorICAgICAgICBpZiBub3QgX29zX3N0YXQ6CisgICAgICAgICAgICBfb3NfYm9vdHN0cmFwKCkKKworICAgICAgICAjIFRoaXMgaXMgdGhlIEltcG9ydGVyIHRoYXQgd2UgdXNlIGZvciBncmFiYmluZyBzdHVmZiBmcm9tIHRoZQorICAgICAgICAjIGZpbGVzeXN0ZW0uIEl0IGRlZmluZXMgb25lIG1vcmUgbWV0aG9kIChpbXBvcnRfZnJvbV9kaXIpIGZvciBvdXIgdXNlLgorICAgICAgICBpZiBmc19pbXAgaXMgTm9uZToKKyAgICAgICAgICAgIGNscyA9IHNlbGYuY2xzRmlsZXN5c3RlbUltcG9ydGVyIG9yIF9GaWxlc3lzdGVtSW1wb3J0ZXIKKyAgICAgICAgICAgIGZzX2ltcCA9IGNscygpCisgICAgICAgIHNlbGYuZnNfaW1wID0gZnNfaW1wCisKKyAgICAgICAgIyBJbml0aWFsaXplIHRoZSBzZXQgb2Ygc3VmZml4ZXMgdGhhdCB3ZSByZWNvZ25pemUgYW5kIGltcG9ydC4KKyAgICAgICAgIyBUaGUgZGVmYXVsdCB3aWxsIGltcG9ydCBkeW5hbWljLWxvYWQgbW9kdWxlcyBmaXJzdCwgZm9sbG93ZWQgYnkKKyAgICAgICAgIyAucHkgZmlsZXMgKG9yIGEgLnB5IGZpbGUncyBjYWNoZWQgYnl0ZWNvZGUpCisgICAgICAgIGZvciBkZXNjIGluIGltcC5nZXRfc3VmZml4ZXMoKToKKyAgICAgICAgICAgIGlmIGRlc2NbMl0gPT0gaW1wLkNfRVhURU5TSU9OOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX3N1ZmZpeChkZXNjWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5Mb2FkU3VmZml4SW1wb3J0ZXIoZGVzYykuaW1wb3J0X2ZpbGUpCisgICAgICAgIHNlbGYuYWRkX3N1ZmZpeCgnLnB5JywgcHlfc3VmZml4X2ltcG9ydGVyKQorCisgICAgZGVmIF9pbXBvcnRfaG9vayhzZWxmLCBmcW5hbWUsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUsIGZyb21saXN0PU5vbmUpOgorICAgICAgICAiIiJQeXRob24gY2FsbHMgdGhpcyBob29rIHRvIGxvY2F0ZSBhbmQgaW1wb3J0IGEgbW9kdWxlLiIiIgorCisgICAgICAgIHBhcnRzID0gZnFuYW1lLnNwbGl0KCcuJykKKworICAgICAgICAjIGRldGVybWluZSB0aGUgY29udGV4dCBvZiB0aGlzIGltcG9ydAorICAgICAgICBwYXJlbnQgPSBzZWxmLl9kZXRlcm1pbmVfaW1wb3J0X2NvbnRleHQoZ2xvYmFscykKKworICAgICAgICAjIGlmIHRoZXJlIGlzIGEgcGFyZW50LCB0aGVuIGl0cyBpbXBvcnRlciBzaG91bGQgbWFuYWdlIHRoaXMgaW1wb3J0CisgICAgICAgIGlmIHBhcmVudDoKKyAgICAgICAgICAgIG1vZHVsZSA9IHBhcmVudC5fX2ltcG9ydGVyX18uX2RvX2ltcG9ydChwYXJlbnQsIHBhcnRzLCBmcm9tbGlzdCkKKyAgICAgICAgICAgIGlmIG1vZHVsZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlCisKKyAgICAgICAgIyBoYXMgdGhlIHRvcCBtb2R1bGUgYWxyZWFkeSBiZWVuIGltcG9ydGVkPworICAgICAgICB0cnk6CisgICAgICAgICAgICB0b3BfbW9kdWxlID0gc3lzLm1vZHVsZXNbcGFydHNbMF1dCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKworICAgICAgICAgICAgIyBsb29rIGZvciB0aGUgdG9wbW9zdCBtb2R1bGUKKyAgICAgICAgICAgIHRvcF9tb2R1bGUgPSBzZWxmLl9pbXBvcnRfdG9wX21vZHVsZShwYXJ0c1swXSkKKyAgICAgICAgICAgIGlmIG5vdCB0b3BfbW9kdWxlOgorICAgICAgICAgICAgICAgICMgdGhlIHRvcG1vc3QgbW9kdWxlIHdhc24ndCBmb3VuZCBhdCBhbGwuCisgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICdObyBtb2R1bGUgbmFtZWQgJyArIGZxbmFtZQorCisgICAgICAgICMgZmFzdC1wYXRoIHNpbXBsZSBpbXBvcnRzCisgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMToKKyAgICAgICAgICAgIGlmIG5vdCBmcm9tbGlzdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9wX21vZHVsZQorCisgICAgICAgICAgICBpZiBub3QgdG9wX21vZHVsZS5fX2RpY3RfXy5nZXQoJ19faXNwa2dfXycpOgorICAgICAgICAgICAgICAgICMgX19pc3BrZ19fIGlzbid0IGRlZmluZWQgKHRoZSBtb2R1bGUgd2FzIG5vdCBpbXBvcnRlZCBieSB1cyksCisgICAgICAgICAgICAgICAgIyBvciBpdCBpcyB6ZXJvLgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlcmUgaXMgbm8gd2F5IHRoYXQgd2UgY291bGQgaW1wb3J0CisgICAgICAgICAgICAgICAgIyBzdWItbW9kdWxlcyB0aGF0IG9jY3VyIGluIHRoZSBmcm9tbGlzdCAoYnV0IHdlIGNhbid0IHJhaXNlIGFuCisgICAgICAgICAgICAgICAgIyBlcnJvciBiZWNhdXNlIGl0IG1heSBqdXN0IGJlIG5hbWVzKSBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93CisgICAgICAgICAgICAgICAgIyB0byBkZWFsIHdpdGggcGFja2FnZXMgdGhhdCB3ZXJlIGltcG9ydGVkIGJ5IG90aGVyIHN5c3RlbXMuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgSW4gdGhlIGxhdHRlciBjYXNlIChfX2lzcGtnX18gPT0gMCksIHRoZXJlIGNhbid0IGJlIGFueSBzdWItCisgICAgICAgICAgICAgICAgIyBtb2R1bGVzIHByZXNlbnQsIHNvIHdlIGNhbiBqdXN0IHJldHVybi4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBJbiBib3RoIGNhc2VzLCBzaW5jZSBsZW4ocGFydHMpID09IDEsIHRoZSB0b3BfbW9kdWxlIGlzIGFsc28KKyAgICAgICAgICAgICAgICAjIHRoZSAiYm90dG9tIiB3aGljaCBpcyB0aGUgZGVmaW5lZCByZXR1cm4gd2hlbiBhIGZyb21saXN0CisgICAgICAgICAgICAgICAgIyBleGlzdHMuCisgICAgICAgICAgICAgICAgcmV0dXJuIHRvcF9tb2R1bGUKKworICAgICAgICBpbXBvcnRlciA9IHRvcF9tb2R1bGUuX19kaWN0X18uZ2V0KCdfX2ltcG9ydGVyX18nKQorICAgICAgICBpZiBpbXBvcnRlcjoKKyAgICAgICAgICAgIHJldHVybiBpbXBvcnRlci5fZmluaXNoX2ltcG9ydCh0b3BfbW9kdWxlLCBwYXJ0c1sxOl0sIGZyb21saXN0KQorCisgICAgICAgICMgR3Jyciwgc29tZSBwZW9wbGUgImltcG9ydCBvcy5wYXRoIiBvciBkbyAiZnJvbSBvcy5wYXRoIGltcG9ydCAuLi4iCisgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMiBhbmQgaGFzYXR0cih0b3BfbW9kdWxlLCBwYXJ0c1sxXSk6CisgICAgICAgICAgICBpZiBmcm9tbGlzdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cih0b3BfbW9kdWxlLCBwYXJ0c1sxXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvcF9tb2R1bGUKKworICAgICAgICAjIElmIHRoZSBpbXBvcnRlciBkb2VzIG5vdCBleGlzdCwgdGhlbiB3ZSBoYXZlIHRvIGJhaWwuIEEgbWlzc2luZworICAgICAgICAjIGltcG9ydGVyIG1lYW5zIHRoYXQgc29tZXRoaW5nIGVsc2UgaW1wb3J0ZWQgdGhlIG1vZHVsZSwgYW5kIHdlIGhhdmUKKyAgICAgICAgIyBubyBrbm93bGVkZ2Ugb2YgaG93IHRvIGdldCBzdWItbW9kdWxlcyBvdXQgb2YgdGhlIHRoaW5nLgorICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgJ05vIG1vZHVsZSBuYW1lZCAnICsgZnFuYW1lCisKKyAgICBkZWYgX2RldGVybWluZV9pbXBvcnRfY29udGV4dChzZWxmLCBnbG9iYWxzKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgY29udGV4dCBpbiB3aGljaCBhIG1vZHVsZSBzaG91bGQgYmUgaW1wb3J0ZWQuCisKKyAgICAgICAgVGhlIGNvbnRleHQgY291bGQgYmUgYSBsb2FkZWQgKHBhY2thZ2UpIG1vZHVsZSBhbmQgdGhlIGltcG9ydGVkIG1vZHVsZQorICAgICAgICB3aWxsIGJlIGxvb2tlZCBmb3Igd2l0aGluIHRoYXQgcGFja2FnZS4gVGhlIGNvbnRleHQgY291bGQgYWxzbyBiZSBOb25lLAorICAgICAgICBtZWFuaW5nIHRoZXJlIGlzIG5vIGNvbnRleHQgLS0gdGhlIG1vZHVsZSBzaG91bGQgYmUgbG9va2VkIGZvciBhcyBhCisgICAgICAgICJ0b3AtbGV2ZWwiIG1vZHVsZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbm90IGdsb2JhbHMgb3Igbm90IGdsb2JhbHMuZ2V0KCdfX2ltcG9ydGVyX18nKToKKyAgICAgICAgICAgICMgZ2xvYmFscyBkb2VzIG5vdCByZWZlciB0byBvbmUgb2Ygb3VyIG1vZHVsZXMgb3IgcGFja2FnZXMuIFRoYXQKKyAgICAgICAgICAgICMgaW1wbGllcyB0aGVyZSBpcyBubyByZWxhdGl2ZSBpbXBvcnQgY29udGV4dCAoYXMgZmFyIGFzIHdlIGFyZQorICAgICAgICAgICAgIyBjb25jZXJuZWQpLCBhbmQgaXQgc2hvdWxkIGp1c3QgcGljayBpdCBvZmYgdGhlIHN0YW5kYXJkIHBhdGguCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgVGhlIGdsb2JhbHMgcmVmZXIgdG8gYSBtb2R1bGUgb3IgcGFja2FnZSBvZiBvdXJzLiBJdCB3aWxsIGRlZmluZQorICAgICAgICAjIHRoZSBjb250ZXh0IG9mIHRoZSBuZXcgaW1wb3J0LiBHZXQgdGhlIG1vZHVsZS9wYWNrYWdlIGZxbmFtZS4KKyAgICAgICAgcGFyZW50X2ZxbmFtZSA9IGdsb2JhbHNbJ19fbmFtZV9fJ10KKworICAgICAgICAjIGlmIGEgcGFja2FnZSBpcyBwZXJmb3JtaW5nIHRoZSBpbXBvcnQsIHRoZW4gcmV0dXJuIGl0c2VsZiAoaW1wb3J0cworICAgICAgICAjIHJlZmVyIHRvIHBrZyBjb250ZW50cykKKyAgICAgICAgaWYgZ2xvYmFsc1snX19pc3BrZ19fJ106CisgICAgICAgICAgICBwYXJlbnQgPSBzeXMubW9kdWxlc1twYXJlbnRfZnFuYW1lXQorICAgICAgICAgICAgYXNzZXJ0IGdsb2JhbHMgaXMgcGFyZW50Ll9fZGljdF9fCisgICAgICAgICAgICByZXR1cm4gcGFyZW50CisKKyAgICAgICAgaSA9IHBhcmVudF9mcW5hbWUucmZpbmQoJy4nKQorCisgICAgICAgICMgYSBtb2R1bGUgb3V0c2lkZSBvZiBhIHBhY2thZ2UgaGFzIG5vIHBhcnRpY3VsYXIgaW1wb3J0IGNvbnRleHQKKyAgICAgICAgaWYgaSA9PSAtMToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBpZiBhIG1vZHVsZSBpbiBhIHBhY2thZ2UgaXMgcGVyZm9ybWluZyB0aGUgaW1wb3J0LCB0aGVuIHJldHVybiB0aGUKKyAgICAgICAgIyBwYWNrYWdlIChpbXBvcnRzIHJlZmVyIHRvIHNpYmxpbmdzKQorICAgICAgICBwYXJlbnRfZnFuYW1lID0gcGFyZW50X2ZxbmFtZVs6aV0KKyAgICAgICAgcGFyZW50ID0gc3lzLm1vZHVsZXNbcGFyZW50X2ZxbmFtZV0KKyAgICAgICAgYXNzZXJ0IHBhcmVudC5fX25hbWVfXyA9PSBwYXJlbnRfZnFuYW1lCisgICAgICAgIHJldHVybiBwYXJlbnQKKworICAgIGRlZiBfaW1wb3J0X3RvcF9tb2R1bGUoc2VsZiwgbmFtZSk6CisgICAgICAgICMgc2NhbiBzeXMucGF0aCBsb29raW5nIGZvciBhIGxvY2F0aW9uIGluIHRoZSBmaWxlc3lzdGVtIHRoYXQgY29udGFpbnMKKyAgICAgICAgIyB0aGUgbW9kdWxlLCBvciBhbiBJbXBvcnRlciBvYmplY3QgdGhhdCBjYW4gaW1wb3J0IHRoZSBtb2R1bGUuCisgICAgICAgIGZvciBpdGVtIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBfU3RyaW5nVHlwZSk6CisgICAgICAgICAgICAgICAgbW9kdWxlID0gc2VsZi5mc19pbXAuaW1wb3J0X2Zyb21fZGlyKGl0ZW0sIG5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1vZHVsZSA9IGl0ZW0uaW1wb3J0X3RvcChuYW1lKQorICAgICAgICAgICAgaWYgbW9kdWxlOgorICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGUKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfcmVsb2FkX2hvb2soc2VsZiwgbW9kdWxlKToKKyAgICAgICAgIlB5dGhvbiBjYWxscyB0aGlzIGhvb2sgdG8gcmVsb2FkIGEgbW9kdWxlLiIKKworICAgICAgICAjIHJlbG9hZGluZyBvZiBhIG1vZHVsZSBtYXkgb3IgbWF5IG5vdCBiZSBwb3NzaWJsZSAoZGVwZW5kaW5nIG9uIHRoZQorICAgICAgICAjIGltcG9ydGVyKSwgYnV0IGF0IGxlYXN0IHdlIGNhbiB2YWxpZGF0ZSB0aGF0IGl0J3Mgb3VycyB0byByZWxvYWQKKyAgICAgICAgaW1wb3J0ZXIgPSBtb2R1bGUuX19kaWN0X18uZ2V0KCdfX2ltcG9ydGVyX18nKQorICAgICAgICBpZiBub3QgaW1wb3J0ZXI6CisgICAgICAgICAgICAjIyMgb29wcy4gbm93IHdoYXQuLi4KKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIG9rYXkuIGl0IGlzIHVzaW5nIHRoZSBpbXB1dGlsIHN5c3RlbSwgYW5kIHdlIG11c3QgZGVsZWdhdGUgaXQsIGJ1dAorICAgICAgICAjIHdlIGRvbid0IGtub3cgd2hhdCB0byBkbyAoeWV0KQorICAgICAgICAjIyMgd2Ugc2hvdWxkIGJsYXN0IHRoZSBtb2R1bGUgZGljdCBhbmQgZG8gYW5vdGhlciBnZXRfY29kZSgpLiBuZWVkIHRvCisgICAgICAgICMjIyBmbGVzaCB0aGlzIG91dCBhbmQgYWRkIHByb3BlciBkb2Njby4uLgorICAgICAgICByYWlzZSBTeXN0ZW1FcnJvciwgInJlbG9hZCBub3QgeWV0IGltcGxlbWVudGVkIgorCisKK2NsYXNzIEltcG9ydGVyOgorICAgICJCYXNlIGNsYXNzIGZvciByZXBsYWNpbmcgc3RhbmRhcmQgaW1wb3J0IGZ1bmN0aW9ucy4iCisKKyAgICBkZWYgaW1wb3J0X3RvcChzZWxmLCBuYW1lKToKKyAgICAgICAgIkltcG9ydCBhIHRvcC1sZXZlbCBtb2R1bGUuIgorICAgICAgICByZXR1cm4gc2VsZi5faW1wb3J0X29uZShOb25lLCBuYW1lLCBuYW1lKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFBSSVZBVEUgTUVUSE9EUworICAgICMKKyAgICBkZWYgX2ZpbmlzaF9pbXBvcnQoc2VsZiwgdG9wLCBwYXJ0cywgZnJvbWxpc3QpOgorICAgICAgICAjIGlmICJhLmIuYyIgd2FzIHByb3ZpZGVkLCB0aGVuIGxvYWQgdGhlICIuYi5jIiBwb3J0aW9uIGRvd24gZnJvbQorICAgICAgICAjIGJlbG93IHRoZSB0b3AtbGV2ZWwgbW9kdWxlLgorICAgICAgICBib3R0b20gPSBzZWxmLl9sb2FkX3RhaWwodG9wLCBwYXJ0cykKKworICAgICAgICAjIGlmIHRoZSBmb3JtIGlzICJpbXBvcnQgYS5iLmMiLCB0aGVuIHJldHVybiAiYSIKKyAgICAgICAgaWYgbm90IGZyb21saXN0OgorICAgICAgICAgICAgIyBubyBmcm9tbGlzdDogcmV0dXJuIHRoZSB0b3Agb2YgdGhlIGltcG9ydCB0cmVlCisgICAgICAgICAgICByZXR1cm4gdG9wCisKKyAgICAgICAgIyB0aGUgdG9wIG1vZHVsZSB3YXMgaW1wb3J0ZWQgYnkgc2VsZi4KKyAgICAgICAgIworICAgICAgICAjIHRoaXMgbWVhbnMgdGhhdCB0aGUgYm90dG9tIG1vZHVsZSB3YXMgYWxzbyBpbXBvcnRlZCBieSBzZWxmIChqdXN0CisgICAgICAgICMgbm93LCBvciBpbiB0aGUgcGFzdCBhbmQgd2UgZmV0Y2hlZCBpdCBmcm9tIHN5cy5tb2R1bGVzKS4KKyAgICAgICAgIworICAgICAgICAjIHNpbmNlIHdlIGltcG9ydGVkL2hhbmRsZWQgdGhlIGJvdHRvbSBtb2R1bGUsIHRoaXMgbWVhbnMgdGhhdCB3ZSBjYW4KKyAgICAgICAgIyBhbHNvIGhhbmRsZSBpdHMgZnJvbWxpc3QgKGFuZCByZWxpYWJseSB1c2UgX19pc3BrZ19fKS4KKworICAgICAgICAjIGlmIHRoZSBib3R0b20gbm9kZSBpcyBhIHBhY2thZ2UsIHRoZW4gKHBvdGVudGlhbGx5KSBpbXBvcnQgc29tZQorICAgICAgICAjIG1vZHVsZXMuCisgICAgICAgICMKKyAgICAgICAgIyBub3RlOiBpZiBpdCBpcyBub3QgYSBwYWNrYWdlLCB0aGVuICJmcm9tbGlzdCIgcmVmZXJzIHRvIG5hbWVzIGluCisgICAgICAgICMgICAgICAgdGhlIGJvdHRvbSBtb2R1bGUgcmF0aGVyIHRoYW4gbW9kdWxlcy4KKyAgICAgICAgIyBub3RlOiBmb3IgYSBtaXggb2YgbmFtZXMgYW5kIG1vZHVsZXMgaW4gdGhlIGZyb21saXN0LCB3ZSB3aWxsCisgICAgICAgICMgICAgICAgaW1wb3J0IGFsbCBtb2R1bGVzIGFuZCBpbnNlcnQgdGhvc2UgaW50byB0aGUgbmFtZXNwYWNlIG9mCisgICAgICAgICMgICAgICAgdGhlIHBhY2thZ2UgbW9kdWxlLiBQeXRob24gd2lsbCBwaWNrIHVwIGFsbCBmcm9tbGlzdCBuYW1lcworICAgICAgICAjICAgICAgIGZyb20gdGhlIGJvdHRvbSAocGFja2FnZSkgbW9kdWxlOyBzb21lIHdpbGwgYmUgbW9kdWxlcyB0aGF0CisgICAgICAgICMgICAgICAgd2UgaW1wb3J0ZWQgYW5kIHN0b3JlZCBpbiB0aGUgbmFtZXNwYWNlLCBvdGhlcnMgYXJlIGV4cGVjdGVkCisgICAgICAgICMgICAgICAgdG8gYmUgcHJlc2VudCBhbHJlYWR5LgorICAgICAgICBpZiBib3R0b20uX19pc3BrZ19fOgorICAgICAgICAgICAgc2VsZi5faW1wb3J0X2Zyb21saXN0KGJvdHRvbSwgZnJvbWxpc3QpCisKKyAgICAgICAgIyBpZiB0aGUgZm9ybSBpcyAiZnJvbSBhLmIgaW1wb3J0IGMsIGQiIHRoZW4gcmV0dXJuICJiIgorICAgICAgICByZXR1cm4gYm90dG9tCisKKyAgICBkZWYgX2ltcG9ydF9vbmUoc2VsZiwgcGFyZW50LCBtb2RuYW1lLCBmcW5hbWUpOgorICAgICAgICAiSW1wb3J0IGEgc2luZ2xlIG1vZHVsZS4iCisKKyAgICAgICAgIyBoYXMgdGhlIG1vZHVsZSBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQ/CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tmcW5hbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIGxvYWQgdGhlIG1vZHVsZSdzIGNvZGUsIG9yIGZldGNoIHRoZSBtb2R1bGUgaXRzZWxmCisgICAgICAgIHJlc3VsdCA9IHNlbGYuZ2V0X2NvZGUocGFyZW50LCBtb2RuYW1lLCBmcW5hbWUpCisgICAgICAgIGlmIHJlc3VsdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBtb2R1bGUgPSBzZWxmLl9wcm9jZXNzX3Jlc3VsdChyZXN1bHQsIGZxbmFtZSkKKworICAgICAgICAjIGluc2VydCB0aGUgbW9kdWxlIGludG8gaXRzIHBhcmVudAorICAgICAgICBpZiBwYXJlbnQ6CisgICAgICAgICAgICBzZXRhdHRyKHBhcmVudCwgbW9kbmFtZSwgbW9kdWxlKQorICAgICAgICByZXR1cm4gbW9kdWxlCisKKyAgICBkZWYgX3Byb2Nlc3NfcmVzdWx0KHNlbGYsIHJlc3VsdCwgZnFuYW1lKToKKyAgICAgICAgaXNwa2csIGNvZGUsIHZhbHVlcyA9IHJlc3VsdAorICAgICAgICAjIGRpZCBnZXRfY29kZSgpIHJldHVybiBhbiBhY3R1YWwgbW9kdWxlPyAocmF0aGVyIHRoYW4gYSBjb2RlIG9iamVjdCkKKyAgICAgICAgaXNfbW9kdWxlID0gaXNpbnN0YW5jZShjb2RlLCBfTW9kdWxlVHlwZSkKKworICAgICAgICAjIHVzZSB0aGUgcmV0dXJuZWQgbW9kdWxlLCBvciBjcmVhdGUgYSBuZXcgb25lIHRvIGV4ZWMgY29kZSBpbnRvCisgICAgICAgIGlmIGlzX21vZHVsZToKKyAgICAgICAgICAgIG1vZHVsZSA9IGNvZGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZHVsZSA9IGltcC5uZXdfbW9kdWxlKGZxbmFtZSkKKworICAgICAgICAjIyMgcmVjb3JkIHBhY2thZ2VzIGEgYml0IGRpZmZlcmVudGx5Pz8KKyAgICAgICAgbW9kdWxlLl9faW1wb3J0ZXJfXyA9IHNlbGYKKyAgICAgICAgbW9kdWxlLl9faXNwa2dfXyA9IGlzcGtnCisKKyAgICAgICAgIyBpbnNlcnQgYWRkaXRpb25hbCB2YWx1ZXMgaW50byB0aGUgbW9kdWxlIChiZWZvcmUgZXhlY3V0aW5nIHRoZSBjb2RlKQorICAgICAgICBtb2R1bGUuX19kaWN0X18udXBkYXRlKHZhbHVlcykKKworICAgICAgICAjIHRoZSBtb2R1bGUgaXMgYWxtb3N0IHJlYWR5Li4uIG1ha2UgaXQgdmlzaWJsZQorICAgICAgICBzeXMubW9kdWxlc1tmcW5hbWVdID0gbW9kdWxlCisKKyAgICAgICAgIyBleGVjdXRlIHRoZSBjb2RlIHdpdGhpbiB0aGUgbW9kdWxlJ3MgbmFtZXNwYWNlCisgICAgICAgIGlmIG5vdCBpc19tb2R1bGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXhlYyBjb2RlIGluIG1vZHVsZS5fX2RpY3RfXworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGlmIGZxbmFtZSBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW2ZxbmFtZV0KKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgICMgZmV0Y2ggZnJvbSBzeXMubW9kdWxlcyBpbnN0ZWFkIG9mIHJldHVybmluZyBtb2R1bGUgZGlyZWN0bHkuCisgICAgICAgICMgYWxzbyBtYWtlIG1vZHVsZSdzIF9fbmFtZV9fIGFncmVlIHdpdGggZnFuYW1lLCBpbiBjYXNlCisgICAgICAgICMgdGhlICJleGVjIGNvZGUgaW4gbW9kdWxlLl9fZGljdF9fIiBwbGF5ZWQgZ2FtZXMgb24gdXMuCisgICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW2ZxbmFtZV0KKyAgICAgICAgbW9kdWxlLl9fbmFtZV9fID0gZnFuYW1lCisgICAgICAgIHJldHVybiBtb2R1bGUKKworICAgIGRlZiBfbG9hZF90YWlsKHNlbGYsIG0sIHBhcnRzKToKKyAgICAgICAgIiIiSW1wb3J0IHRoZSByZXN0IG9mIHRoZSBtb2R1bGVzLCBkb3duIGZyb20gdGhlIHRvcC1sZXZlbCBtb2R1bGUuCisKKyAgICAgICAgUmV0dXJucyB0aGUgbGFzdCBtb2R1bGUgaW4gdGhlIGRvdHRlZCBsaXN0IG9mIG1vZHVsZXMuCisgICAgICAgICIiIgorICAgICAgICBmb3IgcGFydCBpbiBwYXJ0czoKKyAgICAgICAgICAgIGZxbmFtZSA9ICIlcy4lcyIgJSAobS5fX25hbWVfXywgcGFydCkKKyAgICAgICAgICAgIG0gPSBzZWxmLl9pbXBvcnRfb25lKG0sIHBhcnQsIGZxbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiTm8gbW9kdWxlIG5hbWVkICIgKyBmcW5hbWUKKyAgICAgICAgcmV0dXJuIG0KKworICAgIGRlZiBfaW1wb3J0X2Zyb21saXN0KHNlbGYsIHBhY2thZ2UsIGZyb21saXN0KToKKyAgICAgICAgJ0ltcG9ydCBhbnkgc3ViLW1vZHVsZXMgaW4gdGhlICJmcm9tIiBsaXN0LicKKworICAgICAgICAjIGlmICcqJyBpcyBwcmVzZW50IGluIHRoZSBmcm9tbGlzdCwgdGhlbiBsb29rIGZvciB0aGUgJ19fYWxsX18nCisgICAgICAgICMgdmFyaWFibGUgdG8gZmluZCBhZGRpdGlvbmFsIGl0ZW1zIChtb2R1bGVzKSB0byBpbXBvcnQuCisgICAgICAgIGlmICcqJyBpbiBmcm9tbGlzdDoKKyAgICAgICAgICAgIGZyb21saXN0ID0gbGlzdChmcm9tbGlzdCkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgIGxpc3QocGFja2FnZS5fX2RpY3RfXy5nZXQoJ19fYWxsX18nLCBbXSkpCisKKyAgICAgICAgZm9yIHN1YiBpbiBmcm9tbGlzdDoKKyAgICAgICAgICAgICMgaWYgdGhlIG5hbWUgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGVuIGRvbid0IHRyeSB0byBpbXBvcnQgaXQgKGl0CisgICAgICAgICAgICAjIG1pZ2h0IG5vdCBiZSBhIG1vZHVsZSEpLgorICAgICAgICAgICAgaWYgc3ViICE9ICcqJyBhbmQgbm90IGhhc2F0dHIocGFja2FnZSwgc3ViKToKKyAgICAgICAgICAgICAgICBzdWJuYW1lID0gIiVzLiVzIiAlIChwYWNrYWdlLl9fbmFtZV9fLCBzdWIpCisgICAgICAgICAgICAgICAgc3VibW9kID0gc2VsZi5faW1wb3J0X29uZShwYWNrYWdlLCBzdWIsIHN1Ym5hbWUpCisgICAgICAgICAgICAgICAgaWYgbm90IHN1Ym1vZDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJjYW5ub3QgaW1wb3J0IG5hbWUgIiArIHN1Ym5hbWUKKworICAgIGRlZiBfZG9faW1wb3J0KHNlbGYsIHBhcmVudCwgcGFydHMsIGZyb21saXN0KToKKyAgICAgICAgIiIiQXR0ZW1wdCB0byBpbXBvcnQgdGhlIG1vZHVsZSByZWxhdGl2ZSB0byBwYXJlbnQuCisKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgdXNlZCB3aGVuIHRoZSBpbXBvcnQgY29udGV4dCBzcGVjaWZpZXMgdGhhdCA8c2VsZj4KKyAgICAgICAgaW1wb3J0ZWQgdGhlIHBhcmVudCBtb2R1bGUuCisgICAgICAgICIiIgorICAgICAgICB0b3BfbmFtZSA9IHBhcnRzWzBdCisgICAgICAgIHRvcF9mcW5hbWUgPSBwYXJlbnQuX19uYW1lX18gKyAnLicgKyB0b3BfbmFtZQorICAgICAgICB0b3BfbW9kdWxlID0gc2VsZi5faW1wb3J0X29uZShwYXJlbnQsIHRvcF9uYW1lLCB0b3BfZnFuYW1lKQorICAgICAgICBpZiBub3QgdG9wX21vZHVsZToKKyAgICAgICAgICAgICMgdGhpcyBpbXBvcnRlciBhbmQgcGFyZW50IGNvdWxkIG5vdCBmaW5kIHRoZSBtb2R1bGUgKHJlbGF0aXZlbHkpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHJldHVybiBzZWxmLl9maW5pc2hfaW1wb3J0KHRvcF9tb2R1bGUsIHBhcnRzWzE6XSwgZnJvbWxpc3QpCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgTUVUSE9EUyBUTyBPVkVSUklERQorICAgICMKKyAgICBkZWYgZ2V0X2NvZGUoc2VsZiwgcGFyZW50LCBtb2RuYW1lLCBmcW5hbWUpOgorICAgICAgICAiIiJGaW5kIGFuZCByZXRyaWV2ZSB0aGUgY29kZSBmb3IgdGhlIGdpdmVuIG1vZHVsZS4KKworICAgICAgICBwYXJlbnQgc3BlY2lmaWVzIGEgcGFyZW50IG1vZHVsZSB0byBkZWZpbmUgYSBjb250ZXh0IGZvciBpbXBvcnRpbmcuIEl0CisgICAgICAgIG1heSBiZSBOb25lLCBpbmRpY2F0aW5nIG5vIHBhcnRpY3VsYXIgY29udGV4dCBmb3IgdGhlIHNlYXJjaC4KKworICAgICAgICBtb2RuYW1lIHNwZWNpZmllcyBhIHNpbmdsZSBtb2R1bGUgKG5vdCBkb3R0ZWQpIHdpdGhpbiB0aGUgcGFyZW50LgorCisgICAgICAgIGZxbmFtZSBzcGVjaWZpZXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBtb2R1bGUgbmFtZS4gVGhpcyBpcyBhCisgICAgICAgIChwb3RlbnRpYWxseSkgZG90dGVkIG5hbWUgZnJvbSB0aGUgInJvb3QiIG9mIHRoZSBtb2R1bGUgbmFtZXNwYWNlCisgICAgICAgIGRvd24gdG8gdGhlIG1vZG5hbWUuCisgICAgICAgIElmIHRoZXJlIGlzIG5vIHBhcmVudCwgdGhlbiBtb2RuYW1lPT1mcW5hbWUuCisKKyAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBOb25lLCBvciBhIDMtdHVwbGUuCisKKyAgICAgICAgKiBJZiB0aGUgbW9kdWxlIHdhcyBub3QgZm91bmQsIHRoZW4gTm9uZSBzaG91bGQgYmUgcmV0dXJuZWQuCisKKyAgICAgICAgKiBUaGUgZmlyc3QgaXRlbSBvZiB0aGUgMi0gb3IgMy10dXBsZSBzaG91bGQgYmUgdGhlIGludGVnZXIgMCBvciAxLAorICAgICAgICAgICAgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBtb2R1bGUgdGhhdCB3YXMgZm91bmQgaXMgYSBwYWNrYWdlIG9yIG5vdC4KKworICAgICAgICAqIFRoZSBzZWNvbmQgaXRlbSBpcyB0aGUgY29kZSBvYmplY3QgZm9yIHRoZSBtb2R1bGUgKGl0IHdpbGwgYmUKKyAgICAgICAgICAgIGV4ZWN1dGVkIHdpdGhpbiB0aGUgbmV3IG1vZHVsZSdzIG5hbWVzcGFjZSkuIFRoaXMgaXRlbSBjYW4gYWxzbworICAgICAgICAgICAgYmUgYSBmdWxseS1sb2FkZWQgbW9kdWxlIG9iamVjdCAoZS5nLiBsb2FkZWQgZnJvbSBhIHNoYXJlZCBsaWIpLgorCisgICAgICAgICogVGhlIHRoaXJkIGl0ZW0gaXMgYSBkaWN0aW9uYXJ5IG9mIG5hbWUvdmFsdWUgcGFpcnMgdGhhdCB3aWxsIGJlCisgICAgICAgICAgICBpbnNlcnRlZCBpbnRvIG5ldyBtb2R1bGUgYmVmb3JlIHRoZSBjb2RlIG9iamVjdCBpcyBleGVjdXRlZC4gVGhpcworICAgICAgICAgICAgaXMgcHJvdmlkZWQgaW4gY2FzZSB0aGUgbW9kdWxlJ3MgY29kZSBleHBlY3RzIGNlcnRhaW4gdmFsdWVzIChzdWNoCisgICAgICAgICAgICBhcyB3aGVyZSB0aGUgbW9kdWxlIHdhcyBmb3VuZCkuIFdoZW4gdGhlIHNlY29uZCBpdGVtIGlzIGEgbW9kdWxlCisgICAgICAgICAgICBvYmplY3QsIHRoZW4gdGhlc2UgbmFtZXMvdmFsdWVzIHdpbGwgYmUgaW5zZXJ0ZWQgKmFmdGVyKiB0aGUgbW9kdWxlCisgICAgICAgICAgICBoYXMgYmVlbiBsb2FkZWQvaW5pdGlhbGl6ZWQuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJnZXRfY29kZSBub3QgaW1wbGVtZW50ZWQiCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTb21lIGhhbmR5IHN0dWZmIGZvciB0aGUgSW1wb3J0ZXJzCisjCisKKyMgYnl0ZS1jb21waWxlZCBmaWxlIHN1ZmZpeCBjaGFyYWN0ZXIKK19zdWZmaXhfY2hhciA9IF9fZGVidWdfXyBhbmQgJ2MnIG9yICdvJworCisjIGJ5dGUtY29tcGlsZWQgZmlsZSBzdWZmaXgKK19zdWZmaXggPSAnLnB5JyArIF9zdWZmaXhfY2hhcgorCitkZWYgX2NvbXBpbGUocGF0aG5hbWUsIHRpbWVzdGFtcCk6CisgICAgIiIiQ29tcGlsZSAoYW5kIGNhY2hlKSBhIFB5dGhvbiBzb3VyY2UgZmlsZS4KKworICAgIFRoZSBmaWxlIHNwZWNpZmllZCBieSA8cGF0aG5hbWU+IGlzIGNvbXBpbGVkIHRvIGEgY29kZSBvYmplY3QgYW5kCisgICAgcmV0dXJuZWQuCisKKyAgICBQcmVzdW1pbmcgdGhlIGFwcHJvcHJpYXRlIHByaXZpbGVnZXMgZXhpc3QsIHRoZSBieXRlY29kZXMgd2lsbCBiZQorICAgIHNhdmVkIGJhY2sgdG8gdGhlIGZpbGVzeXN0ZW0gZm9yIGZ1dHVyZSBpbXBvcnRzLiBUaGUgc291cmNlIGZpbGUncworICAgIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgbXVzdCBiZSBwcm92aWRlZCBhcyBhIExvbmcgdmFsdWUuCisgICAgIiIiCisgICAgY29kZXN0cmluZyA9IG9wZW4ocGF0aG5hbWUsICdyVScpLnJlYWQoKQorICAgIGlmIGNvZGVzdHJpbmcgYW5kIGNvZGVzdHJpbmdbLTFdICE9ICdcbic6CisgICAgICAgIGNvZGVzdHJpbmcgPSBjb2Rlc3RyaW5nICsgJ1xuJworICAgIGNvZGUgPSBfX2J1aWx0aW5fXy5jb21waWxlKGNvZGVzdHJpbmcsIHBhdGhuYW1lLCAnZXhlYycpCisKKyAgICAjIHRyeSB0byBjYWNoZSB0aGUgY29tcGlsZWQgY29kZQorICAgIHRyeToKKyAgICAgICAgZiA9IG9wZW4ocGF0aG5hbWUgKyBfc3VmZml4X2NoYXIsICd3YicpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBmLndyaXRlKCdcMFwwXDBcMCcpCisgICAgICAgIGYud3JpdGUoc3RydWN0LnBhY2soJzxJJywgdGltZXN0YW1wKSkKKyAgICAgICAgbWFyc2hhbC5kdW1wKGNvZGUsIGYpCisgICAgICAgIGYuZmx1c2goKQorICAgICAgICBmLnNlZWsoMCwgMCkKKyAgICAgICAgZi53cml0ZShpbXAuZ2V0X21hZ2ljKCkpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgcmV0dXJuIGNvZGUKKworX29zX3N0YXQgPSBfb3NfcGF0aF9qb2luID0gTm9uZQorZGVmIF9vc19ib290c3RyYXAoKToKKyAgICAiU2V0IHVwICdvcycgbW9kdWxlIHJlcGxhY2VtZW50IGZ1bmN0aW9ucyBmb3IgdXNlIGR1cmluZyBpbXBvcnQgYm9vdHN0cmFwLiIKKworICAgIG5hbWVzID0gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzCisKKyAgICBqb2luID0gTm9uZQorICAgIGlmICdwb3NpeCcgaW4gbmFtZXM6CisgICAgICAgIHNlcCA9ICcvJworICAgICAgICBmcm9tIHBvc2l4IGltcG9ydCBzdGF0CisgICAgZWxpZiAnbnQnIGluIG5hbWVzOgorICAgICAgICBzZXAgPSAnXFwnCisgICAgICAgIGZyb20gbnQgaW1wb3J0IHN0YXQKKyAgICBlbGlmICdkb3MnIGluIG5hbWVzOgorICAgICAgICBzZXAgPSAnXFwnCisgICAgICAgIGZyb20gZG9zIGltcG9ydCBzdGF0CisgICAgZWxpZiAnb3MyJyBpbiBuYW1lczoKKyAgICAgICAgc2VwID0gJ1xcJworICAgICAgICBmcm9tIG9zMiBpbXBvcnQgc3RhdAorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAnbm8gb3Mgc3BlY2lmaWMgbW9kdWxlIGZvdW5kJworCisgICAgaWYgam9pbiBpcyBOb25lOgorICAgICAgICBkZWYgam9pbihhLCBiLCBzZXA9c2VwKToKKyAgICAgICAgICAgIGlmIGEgPT0gJyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIGIKKyAgICAgICAgICAgIGxhc3RjaGFyID0gYVstMTpdCisgICAgICAgICAgICBpZiBsYXN0Y2hhciA9PSAnLycgb3IgbGFzdGNoYXIgPT0gc2VwOgorICAgICAgICAgICAgICAgIHJldHVybiBhICsgYgorICAgICAgICAgICAgcmV0dXJuIGEgKyBzZXAgKyBiCisKKyAgICBnbG9iYWwgX29zX3N0YXQKKyAgICBfb3Nfc3RhdCA9IHN0YXQKKworICAgIGdsb2JhbCBfb3NfcGF0aF9qb2luCisgICAgX29zX3BhdGhfam9pbiA9IGpvaW4KKworZGVmIF9vc19wYXRoX2lzZGlyKHBhdGhuYW1lKToKKyAgICAiTG9jYWwgcmVwbGFjZW1lbnQgZm9yIG9zLnBhdGguaXNkaXIoKS4iCisgICAgdHJ5OgorICAgICAgICBzID0gX29zX3N0YXQocGF0aG5hbWUpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIChzLnN0X21vZGUgJiAwMTcwMDAwKSA9PSAwMDQwMDAwCisKK2RlZiBfdGltZXN0YW1wKHBhdGhuYW1lKToKKyAgICAiUmV0dXJuIHRoZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lIGFzIGEgTG9uZy4iCisgICAgdHJ5OgorICAgICAgICBzID0gX29zX3N0YXQocGF0aG5hbWUpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIGxvbmcocy5zdF9tdGltZSkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEVtdWxhdGUgdGhlIGltcG9ydCBtZWNoYW5pc20gZm9yIGJ1aWx0aW4gYW5kIGZyb3plbiBtb2R1bGVzCisjCitjbGFzcyBCdWlsdGluSW1wb3J0ZXIoSW1wb3J0ZXIpOgorICAgIGRlZiBnZXRfY29kZShzZWxmLCBwYXJlbnQsIG1vZG5hbWUsIGZxbmFtZSk6CisgICAgICAgIGlmIHBhcmVudDoKKyAgICAgICAgICAgICMgdGhlc2UgbW9kdWxlcyBkZWZpbml0ZWx5IGRvIG5vdCBvY2N1ciB3aXRoaW4gYSBwYWNrYWdlIGNvbnRleHQKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBsb29rIGZvciB0aGUgbW9kdWxlCisgICAgICAgIGlmIGltcC5pc19idWlsdGluKG1vZG5hbWUpOgorICAgICAgICAgICAgdHlwZSA9IGltcC5DX0JVSUxUSU4KKyAgICAgICAgZWxpZiBpbXAuaXNfZnJvemVuKG1vZG5hbWUpOgorICAgICAgICAgICAgdHlwZSA9IGltcC5QWV9GUk9aRU4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgbm90IGZvdW5kCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgZ290IGl0LiBub3cgbG9hZCBhbmQgcmV0dXJuIGl0LgorICAgICAgICBtb2R1bGUgPSBpbXAubG9hZF9tb2R1bGUobW9kbmFtZSwgTm9uZSwgbW9kbmFtZSwgKCcnLCAnJywgdHlwZSkpCisgICAgICAgIHJldHVybiAwLCBtb2R1bGUsIHsgfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgSW50ZXJuYWwgaW1wb3J0ZXIgdXNlZCBmb3IgaW1wb3J0aW5nIGZyb20gdGhlIGZpbGVzeXN0ZW0KKyMKK2NsYXNzIF9GaWxlc3lzdGVtSW1wb3J0ZXIoSW1wb3J0ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zdWZmaXhlcyA9IFsgXQorCisgICAgZGVmIGFkZF9zdWZmaXgoc2VsZiwgc3VmZml4LCBpbXBvcnRGdW5jKToKKyAgICAgICAgYXNzZXJ0IGhhc2F0dHIoaW1wb3J0RnVuYywgJ19fY2FsbF9fJykKKyAgICAgICAgc2VsZi5zdWZmaXhlcy5hcHBlbmQoKHN1ZmZpeCwgaW1wb3J0RnVuYykpCisKKyAgICBkZWYgaW1wb3J0X2Zyb21fZGlyKHNlbGYsIGRpciwgZnFuYW1lKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5faW1wb3J0X3BhdGhuYW1lKF9vc19wYXRoX2pvaW4oZGlyLCBmcW5hbWUpLCBmcW5hbWUpCisgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jZXNzX3Jlc3VsdChyZXN1bHQsIGZxbmFtZSkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBnZXRfY29kZShzZWxmLCBwYXJlbnQsIG1vZG5hbWUsIGZxbmFtZSk6CisgICAgICAgICMgVGhpcyBpbXBvcnRlciBpcyBuZXZlciB1c2VkIHdpdGggYW4gZW1wdHkgcGFyZW50LiBJdHMgZXhpc3RlbmNlIGlzCisgICAgICAgICMgcHJpdmF0ZSB0byB0aGUgSW1wb3J0TWFuYWdlci4gVGhlIEltcG9ydE1hbmFnZXIgdXNlcyB0aGUKKyAgICAgICAgIyBpbXBvcnRfZnJvbV9kaXIoKSBtZXRob2QgdG8gaW1wb3J0IHRvcC1sZXZlbCBtb2R1bGVzL3BhY2thZ2VzLgorICAgICAgICAjIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZCB3aGVuIHdlIGxvb2sgZm9yIGEgbW9kdWxlIHdpdGhpbiBhIHBhY2thZ2UuCisgICAgICAgIGFzc2VydCBwYXJlbnQKKworICAgICAgICBmb3Igc3VibW9kdWxlX3BhdGggaW4gcGFyZW50Ll9fcGF0aF9fOgorICAgICAgICAgICAgY29kZSA9IHNlbGYuX2ltcG9ydF9wYXRobmFtZShfb3NfcGF0aF9qb2luKHN1Ym1vZHVsZV9wYXRoLCBtb2RuYW1lKSwgZnFuYW1lKQorICAgICAgICAgICAgaWYgY29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gY29kZQorICAgICAgICByZXR1cm4gc2VsZi5faW1wb3J0X3BhdGhuYW1lKF9vc19wYXRoX2pvaW4ocGFyZW50Ll9fcGtnZGlyX18sIG1vZG5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZxbmFtZSkKKworICAgIGRlZiBfaW1wb3J0X3BhdGhuYW1lKHNlbGYsIHBhdGhuYW1lLCBmcW5hbWUpOgorICAgICAgICBpZiBfb3NfcGF0aF9pc2RpcihwYXRobmFtZSk6CisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9pbXBvcnRfcGF0aG5hbWUoX29zX3BhdGhfam9pbihwYXRobmFtZSwgJ19faW5pdF9fJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnFuYW1lKQorICAgICAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgICAgIHZhbHVlcyA9IHJlc3VsdFsyXQorICAgICAgICAgICAgICAgIHZhbHVlc1snX19wa2dkaXJfXyddID0gcGF0aG5hbWUKKyAgICAgICAgICAgICAgICB2YWx1ZXNbJ19fcGF0aF9fJ10gPSBbIHBhdGhuYW1lIF0KKyAgICAgICAgICAgICAgICByZXR1cm4gMSwgcmVzdWx0WzFdLCB2YWx1ZXMKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgZm9yIHN1ZmZpeCwgaW1wb3J0RnVuYyBpbiBzZWxmLnN1ZmZpeGVzOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBwYXRobmFtZSArIHN1ZmZpeAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpbmZvID0gX29zX3N0YXQoZmlsZW5hbWUpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBpbXBvcnRGdW5jKGZpbGVuYW1lLCBmaW5mbywgZnFuYW1lKQorICAgICAgICByZXR1cm4gTm9uZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNVRkZJWC1CQVNFRCBJTVBPUlRFUlMKKyMKKworZGVmIHB5X3N1ZmZpeF9pbXBvcnRlcihmaWxlbmFtZSwgZmluZm8sIGZxbmFtZSk6CisgICAgZmlsZSA9IGZpbGVuYW1lWzotM10gKyBfc3VmZml4CisgICAgdF9weSA9IGxvbmcoZmluZm9bOF0pCisgICAgdF9weWMgPSBfdGltZXN0YW1wKGZpbGUpCisKKyAgICBjb2RlID0gTm9uZQorICAgIGlmIHRfcHljIGlzIG5vdCBOb25lIGFuZCB0X3B5YyA+PSB0X3B5OgorICAgICAgICBmID0gb3BlbihmaWxlLCAncmInKQorICAgICAgICBpZiBmLnJlYWQoNCkgPT0gaW1wLmdldF9tYWdpYygpOgorICAgICAgICAgICAgdCA9IHN0cnVjdC51bnBhY2soJzxJJywgZi5yZWFkKDQpKVswXQorICAgICAgICAgICAgaWYgdCA9PSB0X3B5OgorICAgICAgICAgICAgICAgIGNvZGUgPSBtYXJzaGFsLmxvYWQoZikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgaWYgY29kZSBpcyBOb25lOgorICAgICAgICBmaWxlID0gZmlsZW5hbWUKKyAgICAgICAgY29kZSA9IF9jb21waWxlKGZpbGUsIHRfcHkpCisKKyAgICByZXR1cm4gMCwgY29kZSwgeyAnX19maWxlX18nIDogZmlsZSB9CisKK2NsYXNzIER5bkxvYWRTdWZmaXhJbXBvcnRlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVzYyk6CisgICAgICAgIHNlbGYuZGVzYyA9IGRlc2MKKworICAgIGRlZiBpbXBvcnRfZmlsZShzZWxmLCBmaWxlbmFtZSwgZmluZm8sIGZxbmFtZSk6CisgICAgICAgIGZwID0gb3BlbihmaWxlbmFtZSwgc2VsZi5kZXNjWzFdKQorICAgICAgICBtb2R1bGUgPSBpbXAubG9hZF9tb2R1bGUoZnFuYW1lLCBmcCwgZmlsZW5hbWUsIHNlbGYuZGVzYykKKyAgICAgICAgbW9kdWxlLl9fZmlsZV9fID0gZmlsZW5hbWUKKyAgICAgICAgcmV0dXJuIDAsIG1vZHVsZSwgeyB9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgX3ByaW50X2ltcG9ydGVycygpOgorICAgIGl0ZW1zID0gc3lzLm1vZHVsZXMuaXRlbXMoKQorICAgIGl0ZW1zLnNvcnQoKQorICAgIGZvciBuYW1lLCBtb2R1bGUgaW4gaXRlbXM6CisgICAgICAgIGlmIG1vZHVsZToKKyAgICAgICAgICAgIHByaW50IG5hbWUsIG1vZHVsZS5fX2RpY3RfXy5nZXQoJ19faW1wb3J0ZXJfXycsICctLSBubyBpbXBvcnRlcicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCBuYW1lLCAnLS0gbm9uLWV4aXN0ZW50IG1vZHVsZScKKworZGVmIF90ZXN0X3JldmFtcCgpOgorICAgIEltcG9ydE1hbmFnZXIoKS5pbnN0YWxsKCkKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgQnVpbHRpbkltcG9ydGVyKCkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIworIyBUT0RPCisjCisjIGZyb20gRmlubiBCb2NrOgorIyAgIHR5cGUoc3lzKSBpcyBub3QgYSBtb2R1bGUgaW4gSnl0aG9uLiB3aGF0IHRvIHVzZSBpbnN0ZWFkPworIyAgIGltcC5DX0VYVEVOU0lPTiBpcyBub3QgaW4gSnl0aG9uLiBzYW1lIGZvciBnZXRfc3VmZml4ZXMgYW5kIG5ld19tb2R1bGUKKyMKKyMgICBnaXZlbiBmb28ucHkgb2Y6CisjICAgICAgaW1wb3J0IHN5cworIyAgICAgIHN5cy5tb2R1bGVzWydmb28nXSA9IHN5cworIworIyAgIC0tLS0gc3RhbmRhcmQgaW1wb3J0IG1lY2hhbmlzbQorIyAgID4+PiBpbXBvcnQgZm9vCisjICAgPj4+IGZvbworIyAgIDxtb2R1bGUgJ3N5cycgKGJ1aWx0LWluKT4KKyMKKyMgICAtLS0tIHJldmFtcGVkIGltcG9ydCBtZWNoYW5pc20KKyMgICA+Pj4gaW1wb3J0IGltcHV0aWwKKyMgICA+Pj4gaW1wdXRpbC5fdGVzdF9yZXZhbXAoKQorIyAgID4+PiBpbXBvcnQgZm9vCisjICAgPj4+IGZvbworIyAgIDxtb2R1bGUgJ2ZvbycgZnJvbSAnZm9vLnB5Jz4KKyMKKyMKKyMgZnJvbSBNQUw6CisjICAgc2hvdWxkIEJ1aWx0aW5JbXBvcnRlciBleGlzdCBpbiBzeXMucGF0aCBvciBoYXJkLXdpcmVkIGluIEltcG9ydE1hbmFnZXI/CisjICAgbmVlZCBfX3BhdGhfXyBwcm9jZXNzaW5nCisjICAgcGVyZm9ybWFuY2UKKyMgICBtb3ZlIGNoYWluaW5nIHRvIGEgc3ViY2xhc3MgW2dqczogaXQncyBiZWVuIG51a2VkXQorIyAgIGRlaW5zdGFsbCBzaG91bGQgYmUgcG9zc2libGUKKyMgICBxdWVyeSBtZWNoYW5pc20gbmVlZGVkOiBpcyBhIHNwZWNpZmljIEltcG9ydGVyIGluc3RhbGxlZD8KKyMgICBweS9weWMvcHlvIHBpcGluZyBob29rcyB0byBmaWx0ZXIvcHJvY2VzcyB0aGVzZSBmaWxlcworIyAgIHdpc2ggbGlzdDoKKyMgICAgIGRpc3R1dGlscyBpbXBvcnRlciBob29rZWQgdG8gbGlzdCBvZiBzdGFuZGFyZCBJbnRlcm5ldCByZXBvc2l0b3JpZXMKKyMgICAgIG1vZHVsZS0+ZmlsZSBsb2NhdGlvbiBtYXBwZXIgdG8gc3BlZWQgRlMtYmFzZWQgaW1wb3J0cworIyAgICAgcmVsYXRpdmUgaW1wb3J0cworIyAgICAga2VlcCBjaGFpbmluZyBzbyB0aGF0IGl0IGNhbiBwbGF5IG5pY2Ugd2l0aCBvdGhlciBpbXBvcnQgaG9va3MKKyMKKyMgZnJvbSBHb3Jkb246CisjICAgcHVzaCBNQUwncyBtYXBwZXIgaW50byBzeXMucGF0aFswXSBhcyBhIGNhY2hlIChoYXJkLWNvZGVkIGZvciBhcHBzKQorIworIyBmcm9tIEd1aWRvOgorIyAgIG5lZWQgdG8gY2hhbmdlIHN5cy4qIHJlZmVyZW5jZXMgZm9yIHJleGVjIGVudmlyb25zCisjICAgbmVlZCBob29rIGZvciBNQUwncyB3YWxrLW1lLXVwIGltcG9ydCBzdHJhdGVneSwgb3IgVGltJ3MgYWJzb2x1dGUgc3RyYXRlZ3kKKyMgICB3YXRjaCBvdXQgZm9yIHN5cy5tb2R1bGVzWy4uLl0gaXMgTm9uZQorIyAgIGZsYWcgdG8gZm9yY2UgYWJzb2x1dGUgaW1wb3J0cz8gKHNwZWVkcyBfZGV0ZXJtaW5lX2ltcG9ydF9jb250ZXh0IGFuZAorIyAgICAgICBjaGVja2luZyBmb3IgYSByZWxhdGl2ZSBtb2R1bGUpCisjICAgaW5zZXJ0IG5hbWVzIG9mIGFyY2hpdmVzIGludG8gc3lzLnBhdGggIChzZWUgcXVvdGUgYmVsb3cpCisjICAgbm90ZTogcmVsb2FkIGRvZXMgTk9UIGJsYXN0IG1vZHVsZSBkaWN0CisjICAgc2hpZnQgaW1wb3J0IG1lY2hhbmlzbXMgYW5kIHBvbGljaWVzIGFyb3VuZDsgcHJvdmlkZSBmb3IgaG9va3MsIG92ZXJyaWRlcworIyAgICAgICAoc2VlIHF1b3RlIGJlbG93KQorIyAgIGFkZCBnZXRfc291cmNlIHN0dWZmCisjICAgZ2V0X3RvcGNvZGUgYW5kIGdldF9zdWJjb2RlCisjICAgQ1JMRiBoYW5kbGluZyBpbiBfY29tcGlsZQorIyAgIHJhY2UgY29uZGl0aW9uIGluIF9jb21waWxlCisjICAgcmVmYWN0b3Jpbmcgb2Ygb3MucHkgdG8gZGVhbCB3aXRoIF9vc19ib290c3RyYXAgcHJvYmxlbQorIyAgIGFueSBzcGVjaWFsIGhhbmRsaW5nIHRvIGRvIGZvciBpbXBvcnRpbmcgYSBtb2R1bGUgd2l0aCBhIFN5bnRheEVycm9yPworIyAgICAgICAoZS5nLiBjbGVhbiB1cCB0aGUgdHJhY2ViYWNrKQorIyAgIGltcGxlbWVudCAiZG9tYWluIiBmb3IgcGF0aC10eXBlIGZ1bmN0aW9uYWxpdHkgdXNpbmcgcGtnIG5hbWVzcGFjZQorIyAgICAgICAocmF0aGVyIHRoYW4gRlMtbmFtZXMgbGlrZSBfX3BhdGhfXykKKyMgICBkb24ndCB1c2UgdGhlIHdvcmQgInByaXZhdGUiLi4uIG1heWJlICJpbnRlcm5hbCIKKyMKKyMKKyMgR3VpZG8ncyBjb21tZW50cyBvbiBzeXMucGF0aCBjYWNoaW5nOgorIworIyBXZSBjb3VsZCBjYWNoZSB0aGlzIGluIGEgZGljdGlvbmFyeTogdGhlIEltcG9ydE1hbmFnZXIgY2FuIGhhdmUgYQorIyBjYWNoZSBkaWN0IG1hcHBpbmcgcGF0aG5hbWVzIHRvIGltcG9ydGVyIG9iamVjdHMsIGFuZCBhIHNlcGFyYXRlCisjIG1ldGhvZCBmb3IgY29taW5nIHVwIHdpdGggYW4gaW1wb3J0ZXIgZ2l2ZW4gYSBwYXRobmFtZSB0aGF0J3Mgbm90IHlldAorIyBpbiB0aGUgY2FjaGUuICBUaGUgbWV0aG9kIHNob3VsZCBkbyBhIHN0YXQgYW5kL29yIGxvb2sgYXQgdGhlCisjIGV4dGVuc2lvbiB0byBkZWNpZGUgd2hpY2ggaW1wb3J0ZXIgY2xhc3MgdG8gdXNlOyB5b3UgY2FuIHJlZ2lzdGVyIG5ldworIyBpbXBvcnRlciBjbGFzc2VzIGJ5IHJlZ2lzdGVyaW5nIGEgc3VmZml4IG9yIGEgQm9vbGVhbiBmdW5jdGlvbiwgcGx1cyBhCisjIGNsYXNzLiAgSWYgeW91IHJlZ2lzdGVyIGEgbmV3IGltcG9ydGVyIGNsYXNzLCB0aGUgY2FjaGUgaXMgemFwcGVkLgorIyBUaGUgY2FjaGUgaXMgaW5kZXBlbmRlbnQgZnJvbSBzeXMucGF0aCAoYnV0IG1haW50YWluZWQgcGVyCisjIEltcG9ydE1hbmFnZXIgaW5zdGFuY2UpIHNvIHRoYXQgcmVhcnJhbmdlbWVudHMgb2Ygc3lzLnBhdGggZG8gdGhlCisjIHJpZ2h0IHRoaW5nLiAgSWYgYSBwYXRoIGlzIGRyb3BwZWQgZnJvbSBzeXMucGF0aCB0aGUgY29ycmVzcG9uZGluZworIyBjYWNoZSBlbnRyeSBpcyBzaW1wbHkgbm8gbG9uZ2VyIHVzZWQuCisjCisjIE15L0d1aWRvJ3MgY29tbWVudHMgb24gZmFjdG9yaW5nIEltcG9ydE1hbmFnZXIgYW5kIEltcG9ydGVyOgorIworIyA+IEhvd2V2ZXIsIHdlIHN0aWxsIGhhdmUgYSB0ZW5zaW9uIG9jY3VycmluZyBoZXJlOgorIyA+CisjID4gMSkgaW1wbGVtZW50aW5nIHBvbGljeSBpbiBJbXBvcnRNYW5hZ2VyIGFzc2lzdHMgaW4gc2luZ2xlLXBvaW50IHBvbGljeQorIyA+ICAgIGNoYW5nZXMgZm9yIGFwcC9yZXhlYyBzaXR1YXRpb25zCisjID4gMikgaW1wbGVtZW50aW5nIHBvbGljeSBpbiBJbXBvcnRlciBhc3Npc3RzIGluIHBhY2thZ2UtcHJpdmF0ZSBwb2xpY3kKKyMgPiAgICBjaGFuZ2VzIGZvciBub3JtYWwsIG9wZXJhdGluZyBjb25kaXRpb25zCisjID4KKyMgPiBJJ2xsIHNlZSBpZiBJIGNhbiBzb3J0IG91dCBhIHdheSB0byBkbyB0aGlzLiBNYXliZSB0aGUgSW1wb3J0ZXIgY2xhc3Mgd2lsbAorIyA+IGltcGxlbWVudCB0aGUgbWV0aG9kcyAod2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gdG8gY2hhbmdlIHBvbGljeSkgYnkKKyMgPiBkZWxlZ2F0aW5nIHRvIEltcG9ydE1hbmFnZXIuCisjCisjIE1heWJlIGFsc28gdGhpbmsgYWJvdXQgd2hhdCBraW5kIG9mIHBvbGljaWVzIGFuIEltcG9ydGVyIHdvdWxkIGJlCisjIGxpa2VseSB0byB3YW50IHRvIGNoYW5nZS4gIEkgaGF2ZSBhIGZlZWxpbmcgdGhhdCBhIGxvdCBvZiB0aGUgY29kZQorIyB0aGVyZSBpcyBhY3R1YWxseSBub3Qgc28gbXVjaCBwb2xpY3kgYnV0IGEgKm5lY2Vzc2l0eSogdG8gZ2V0IHRoaW5ncworIyB3b3JraW5nIGdpdmVuIHRoZSBjYWxsaW5nIGNvbnZlbnRpb25zIGZvciB0aGUgX19pbXBvcnRfXyBob29rOiB3aGV0aGVyCisjIHRvIHJldHVybiB0aGUgaGVhZCBvciB0YWlsIG9mIGEgZG90dGVkIG5hbWUsIG9yIHdoZW4gdG8gZG8gdGhlICJmaW5pc2gKKyMgZnJvbWxpc3QiIHN0dWZmLgorIwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pbXB1dGlsLnB5YyBiL2xpYi9weXRob24yLjcvaW1wdXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwNTkyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW1wdXRpbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pbXB1dGlsLnB5byBiL2xpYi9weXRob24yLjcvaW1wdXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyYWFlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW1wdXRpbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pbnNwZWN0LnB5IGIvbGliL3B5dGhvbjIuNy9pbnNwZWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllOTI4YjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2luc3BlY3QucHkKQEAgLTAsMCArMSwxMDU4IEBACisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCisiIiJHZXQgdXNlZnVsIGluZm9ybWF0aW9uIGZyb20gbGl2ZSBQeXRob24gb2JqZWN0cy4KKworVGhpcyBtb2R1bGUgZW5jYXBzdWxhdGVzIHRoZSBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhlIGludGVybmFsIHNwZWNpYWwKK2F0dHJpYnV0ZXMgKGZ1bmNfKiwgY29fKiwgaW1fKiwgdGJfKiwgZXRjLikgaW4gYSBmcmllbmRsaWVyIGZhc2hpb24uCitJdCBhbHNvIHByb3ZpZGVzIHNvbWUgaGVscCBmb3IgZXhhbWluaW5nIHNvdXJjZSBjb2RlIGFuZCBjbGFzcyBsYXlvdXQuCisKK0hlcmUgYXJlIHNvbWUgb2YgdGhlIHVzZWZ1bCBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGU6CisKKyAgICBpc21vZHVsZSgpLCBpc2NsYXNzKCksIGlzbWV0aG9kKCksIGlzZnVuY3Rpb24oKSwgaXNnZW5lcmF0b3JmdW5jdGlvbigpLAorICAgICAgICBpc2dlbmVyYXRvcigpLCBpc3RyYWNlYmFjaygpLCBpc2ZyYW1lKCksIGlzY29kZSgpLCBpc2J1aWx0aW4oKSwKKyAgICAgICAgaXNyb3V0aW5lKCkgLSBjaGVjayBvYmplY3QgdHlwZXMKKyAgICBnZXRtZW1iZXJzKCkgLSBnZXQgbWVtYmVycyBvZiBhbiBvYmplY3QgdGhhdCBzYXRpc2Z5IGEgZ2l2ZW4gY29uZGl0aW9uCisKKyAgICBnZXRmaWxlKCksIGdldHNvdXJjZWZpbGUoKSwgZ2V0c291cmNlKCkgLSBmaW5kIGFuIG9iamVjdCdzIHNvdXJjZSBjb2RlCisgICAgZ2V0ZG9jKCksIGdldGNvbW1lbnRzKCkgLSBnZXQgZG9jdW1lbnRhdGlvbiBvbiBhbiBvYmplY3QKKyAgICBnZXRtb2R1bGUoKSAtIGRldGVybWluZSB0aGUgbW9kdWxlIHRoYXQgYW4gb2JqZWN0IGNhbWUgZnJvbQorICAgIGdldGNsYXNzdHJlZSgpIC0gYXJyYW5nZSBjbGFzc2VzIHNvIGFzIHRvIHJlcHJlc2VudCB0aGVpciBoaWVyYXJjaHkKKworICAgIGdldGFyZ3NwZWMoKSwgZ2V0YXJndmFsdWVzKCksIGdldGNhbGxhcmdzKCkgLSBnZXQgaW5mbyBhYm91dCBmdW5jdGlvbiBhcmd1bWVudHMKKyAgICBmb3JtYXRhcmdzcGVjKCksIGZvcm1hdGFyZ3ZhbHVlcygpIC0gZm9ybWF0IGFuIGFyZ3VtZW50IHNwZWMKKyAgICBnZXRvdXRlcmZyYW1lcygpLCBnZXRpbm5lcmZyYW1lcygpIC0gZ2V0IGluZm8gYWJvdXQgZnJhbWVzCisgICAgY3VycmVudGZyYW1lKCkgLSBnZXQgdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUKKyAgICBzdGFjaygpLCB0cmFjZSgpIC0gZ2V0IGluZm8gYWJvdXQgZnJhbWVzIG9uIHRoZSBzdGFjayBvciBpbiBhIHRyYWNlYmFjaworIiIiCisKKyMgVGhpcyBtb2R1bGUgaXMgaW4gdGhlIHB1YmxpYyBkb21haW4uICBObyB3YXJyYW50aWVzLgorCitfX2F1dGhvcl9fID0gJ0thLVBpbmcgWWVlIDxwaW5nQGxmdy5vcmc+JworX19kYXRlX18gPSAnMSBKYW4gMjAwMScKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdHlwZXMKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCByZQoraW1wb3J0IGRpcworaW1wb3J0IGltcAoraW1wb3J0IHRva2VuaXplCitpbXBvcnQgbGluZWNhY2hlCitmcm9tIG9wZXJhdG9yIGltcG9ydCBhdHRyZ2V0dGVyCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCisKKyMgVGhlc2UgY29uc3RhbnRzIGFyZSBmcm9tIEluY2x1ZGUvY29kZS5oLgorQ09fT1BUSU1JWkVELCBDT19ORVdMT0NBTFMsIENPX1ZBUkFSR1MsIENPX1ZBUktFWVdPUkRTID0gMHgxLCAweDIsIDB4NCwgMHg4CitDT19ORVNURUQsIENPX0dFTkVSQVRPUiwgQ09fTk9GUkVFID0gMHgxMCwgMHgyMCwgMHg0MAorIyBTZWUgSW5jbHVkZS9vYmplY3QuaAorVFBGTEFHU19JU19BQlNUUkFDVCA9IDEgPDwgMjAKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlLWNoZWNraW5nCitkZWYgaXNtb2R1bGUob2JqZWN0KToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgbW9kdWxlLgorCisgICAgTW9kdWxlIG9iamVjdHMgcHJvdmlkZSB0aGVzZSBhdHRyaWJ1dGVzOgorICAgICAgICBfX2RvY19fICAgICAgICAgZG9jdW1lbnRhdGlvbiBzdHJpbmcKKyAgICAgICAgX19maWxlX18gICAgICAgIGZpbGVuYW1lIChtaXNzaW5nIGZvciBidWlsdC1pbiBtb2R1bGVzKSIiIgorICAgIHJldHVybiBpc2luc3RhbmNlKG9iamVjdCwgdHlwZXMuTW9kdWxlVHlwZSkKKworZGVmIGlzY2xhc3Mob2JqZWN0KToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgY2xhc3MuCisKKyAgICBDbGFzcyBvYmplY3RzIHByb3ZpZGUgdGhlc2UgYXR0cmlidXRlczoKKyAgICAgICAgX19kb2NfXyAgICAgICAgIGRvY3VtZW50YXRpb24gc3RyaW5nCisgICAgICAgIF9fbW9kdWxlX18gICAgICBuYW1lIG9mIG1vZHVsZSBpbiB3aGljaCB0aGlzIGNsYXNzIHdhcyBkZWZpbmVkIiIiCisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqZWN0LCAodHlwZSwgdHlwZXMuQ2xhc3NUeXBlKSkKKworZGVmIGlzbWV0aG9kKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBtZXRob2QuCisKKyAgICBJbnN0YW5jZSBtZXRob2Qgb2JqZWN0cyBwcm92aWRlIHRoZXNlIGF0dHJpYnV0ZXM6CisgICAgICAgIF9fZG9jX18gICAgICAgICBkb2N1bWVudGF0aW9uIHN0cmluZworICAgICAgICBfX25hbWVfXyAgICAgICAgbmFtZSB3aXRoIHdoaWNoIHRoaXMgbWV0aG9kIHdhcyBkZWZpbmVkCisgICAgICAgIGltX2NsYXNzICAgICAgICBjbGFzcyBvYmplY3QgaW4gd2hpY2ggdGhpcyBtZXRob2QgYmVsb25ncworICAgICAgICBpbV9mdW5jICAgICAgICAgZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5pbmcgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kCisgICAgICAgIGltX3NlbGYgICAgICAgICBpbnN0YW5jZSB0byB3aGljaCB0aGlzIG1ldGhvZCBpcyBib3VuZCwgb3IgTm9uZSIiIgorICAgIHJldHVybiBpc2luc3RhbmNlKG9iamVjdCwgdHlwZXMuTWV0aG9kVHlwZSkKKworZGVmIGlzbWV0aG9kZGVzY3JpcHRvcihvYmplY3QpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBtZXRob2QgZGVzY3JpcHRvci4KKworICAgIEJ1dCBub3QgaWYgaXNtZXRob2QoKSBvciBpc2NsYXNzKCkgb3IgaXNmdW5jdGlvbigpIGFyZSB0cnVlLgorCisgICAgVGhpcyBpcyBuZXcgaW4gUHl0aG9uIDIuMiwgYW5kLCBmb3IgZXhhbXBsZSwgaXMgdHJ1ZSBvZiBpbnQuX19hZGRfXy4KKyAgICBBbiBvYmplY3QgcGFzc2luZyB0aGlzIHRlc3QgaGFzIGEgX19nZXRfXyBhdHRyaWJ1dGUgYnV0IG5vdCBhIF9fc2V0X18KKyAgICBhdHRyaWJ1dGUsIGJ1dCBiZXlvbmQgdGhhdCB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgdmFyaWVzLiAgX19uYW1lX18gaXMKKyAgICB1c3VhbGx5IHNlbnNpYmxlLCBhbmQgX19kb2NfXyBvZnRlbiBpcy4KKworICAgIE1ldGhvZHMgaW1wbGVtZW50ZWQgdmlhIGRlc2NyaXB0b3JzIHRoYXQgYWxzbyBwYXNzIG9uZSBvZiB0aGUgb3RoZXIKKyAgICB0ZXN0cyByZXR1cm4gZmFsc2UgZnJvbSB0aGUgaXNtZXRob2RkZXNjcmlwdG9yKCkgdGVzdCwgc2ltcGx5IGJlY2F1c2UKKyAgICB0aGUgb3RoZXIgdGVzdHMgcHJvbWlzZSBtb3JlIC0tIHlvdSBjYW4sIGUuZy4sIGNvdW50IG9uIGhhdmluZyB0aGUKKyAgICBpbV9mdW5jIGF0dHJpYnV0ZSAoZXRjKSB3aGVuIGFuIG9iamVjdCBwYXNzZXMgaXNtZXRob2QoKS4iIiIKKyAgICByZXR1cm4gKGhhc2F0dHIob2JqZWN0LCAiX19nZXRfXyIpCisgICAgICAgICAgICBhbmQgbm90IGhhc2F0dHIob2JqZWN0LCAiX19zZXRfXyIpICMgZWxzZSBpdCdzIGEgZGF0YSBkZXNjcmlwdG9yCisgICAgICAgICAgICBhbmQgbm90IGlzbWV0aG9kKG9iamVjdCkgICAgICAgICAgICMgbXV0dWFsIGV4Y2x1c2lvbgorICAgICAgICAgICAgYW5kIG5vdCBpc2Z1bmN0aW9uKG9iamVjdCkKKyAgICAgICAgICAgIGFuZCBub3QgaXNjbGFzcyhvYmplY3QpKQorCitkZWYgaXNkYXRhZGVzY3JpcHRvcihvYmplY3QpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBkYXRhIGRlc2NyaXB0b3IuCisKKyAgICBEYXRhIGRlc2NyaXB0b3JzIGhhdmUgYm90aCBhIF9fZ2V0X18gYW5kIGEgX19zZXRfXyBhdHRyaWJ1dGUuICBFeGFtcGxlcyBhcmUKKyAgICBwcm9wZXJ0aWVzIChkZWZpbmVkIGluIFB5dGhvbikgYW5kIGdldHNldHMgYW5kIG1lbWJlcnMgKGRlZmluZWQgaW4gQykuCisgICAgVHlwaWNhbGx5LCBkYXRhIGRlc2NyaXB0b3JzIHdpbGwgYWxzbyBoYXZlIF9fbmFtZV9fIGFuZCBfX2RvY19fIGF0dHJpYnV0ZXMKKyAgICAocHJvcGVydGllcywgZ2V0c2V0cywgYW5kIG1lbWJlcnMgaGF2ZSBib3RoIG9mIHRoZXNlIGF0dHJpYnV0ZXMpLCBidXQgdGhpcworICAgIGlzIG5vdCBndWFyYW50ZWVkLiIiIgorICAgIHJldHVybiAoaGFzYXR0cihvYmplY3QsICJfX3NldF9fIikgYW5kIGhhc2F0dHIob2JqZWN0LCAiX19nZXRfXyIpKQorCitpZiBoYXNhdHRyKHR5cGVzLCAnTWVtYmVyRGVzY3JpcHRvclR5cGUnKToKKyAgICAjIENQeXRob24gYW5kIGVxdWl2YWxlbnQKKyAgICBkZWYgaXNtZW1iZXJkZXNjcmlwdG9yKG9iamVjdCk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBtZW1iZXIgZGVzY3JpcHRvci4KKworICAgICAgICBNZW1iZXIgZGVzY3JpcHRvcnMgYXJlIHNwZWNpYWxpemVkIGRlc2NyaXB0b3JzIGRlZmluZWQgaW4gZXh0ZW5zaW9uCisgICAgICAgIG1vZHVsZXMuIiIiCisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKG9iamVjdCwgdHlwZXMuTWVtYmVyRGVzY3JpcHRvclR5cGUpCitlbHNlOgorICAgICMgT3RoZXIgaW1wbGVtZW50YXRpb25zCisgICAgZGVmIGlzbWVtYmVyZGVzY3JpcHRvcihvYmplY3QpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgbWVtYmVyIGRlc2NyaXB0b3IuCisKKyAgICAgICAgTWVtYmVyIGRlc2NyaXB0b3JzIGFyZSBzcGVjaWFsaXplZCBkZXNjcmlwdG9ycyBkZWZpbmVkIGluIGV4dGVuc2lvbgorICAgICAgICBtb2R1bGVzLiIiIgorICAgICAgICByZXR1cm4gRmFsc2UKKworaWYgaGFzYXR0cih0eXBlcywgJ0dldFNldERlc2NyaXB0b3JUeXBlJyk6CisgICAgIyBDUHl0aG9uIGFuZCBlcXVpdmFsZW50CisgICAgZGVmIGlzZ2V0c2V0ZGVzY3JpcHRvcihvYmplY3QpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZ2V0c2V0IGRlc2NyaXB0b3IuCisKKyAgICAgICAgZ2V0c2V0IGRlc2NyaXB0b3JzIGFyZSBzcGVjaWFsaXplZCBkZXNjcmlwdG9ycyBkZWZpbmVkIGluIGV4dGVuc2lvbgorICAgICAgICBtb2R1bGVzLiIiIgorICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvYmplY3QsIHR5cGVzLkdldFNldERlc2NyaXB0b3JUeXBlKQorZWxzZToKKyAgICAjIE90aGVyIGltcGxlbWVudGF0aW9ucworICAgIGRlZiBpc2dldHNldGRlc2NyaXB0b3Iob2JqZWN0KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGdldHNldCBkZXNjcmlwdG9yLgorCisgICAgICAgIGdldHNldCBkZXNjcmlwdG9ycyBhcmUgc3BlY2lhbGl6ZWQgZGVzY3JpcHRvcnMgZGVmaW5lZCBpbiBleHRlbnNpb24KKyAgICAgICAgbW9kdWxlcy4iIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBpc2Z1bmN0aW9uKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIHVzZXItZGVmaW5lZCBmdW5jdGlvbi4KKworICAgIEZ1bmN0aW9uIG9iamVjdHMgcHJvdmlkZSB0aGVzZSBhdHRyaWJ1dGVzOgorICAgICAgICBfX2RvY19fICAgICAgICAgZG9jdW1lbnRhdGlvbiBzdHJpbmcKKyAgICAgICAgX19uYW1lX18gICAgICAgIG5hbWUgd2l0aCB3aGljaCB0aGlzIGZ1bmN0aW9uIHdhcyBkZWZpbmVkCisgICAgICAgIGZ1bmNfY29kZSAgICAgICBjb2RlIG9iamVjdCBjb250YWluaW5nIGNvbXBpbGVkIGZ1bmN0aW9uIGJ5dGVjb2RlCisgICAgICAgIGZ1bmNfZGVmYXVsdHMgICB0dXBsZSBvZiBhbnkgZGVmYXVsdCB2YWx1ZXMgZm9yIGFyZ3VtZW50cworICAgICAgICBmdW5jX2RvYyAgICAgICAgKHNhbWUgYXMgX19kb2NfXykKKyAgICAgICAgZnVuY19nbG9iYWxzICAgIGdsb2JhbCBuYW1lc3BhY2UgaW4gd2hpY2ggdGhpcyBmdW5jdGlvbiB3YXMgZGVmaW5lZAorICAgICAgICBmdW5jX25hbWUgICAgICAgKHNhbWUgYXMgX19uYW1lX18pIiIiCisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlcy5GdW5jdGlvblR5cGUpCisKK2RlZiBpc2dlbmVyYXRvcmZ1bmN0aW9uKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIHVzZXItZGVmaW5lZCBnZW5lcmF0b3IgZnVuY3Rpb24uCisKKyAgICBHZW5lcmF0b3IgZnVuY3Rpb24gb2JqZWN0cyBwcm92aWRlcyBzYW1lIGF0dHJpYnV0ZXMgYXMgZnVuY3Rpb25zLgorCisgICAgU2VlIGhlbHAoaXNmdW5jdGlvbikgZm9yIGF0dHJpYnV0ZXMgbGlzdGluZy4iIiIKKyAgICByZXR1cm4gYm9vbCgoaXNmdW5jdGlvbihvYmplY3QpIG9yIGlzbWV0aG9kKG9iamVjdCkpIGFuZAorICAgICAgICAgICAgICAgIG9iamVjdC5mdW5jX2NvZGUuY29fZmxhZ3MgJiBDT19HRU5FUkFUT1IpCisKK2RlZiBpc2dlbmVyYXRvcihvYmplY3QpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBnZW5lcmF0b3IuCisKKyAgICBHZW5lcmF0b3Igb2JqZWN0cyBwcm92aWRlIHRoZXNlIGF0dHJpYnV0ZXM6CisgICAgICAgIF9faXRlcl9fICAgICAgICBkZWZpbmVkIHRvIHN1cHBvcnQgaW50ZXJhdGlvbiBvdmVyIGNvbnRhaW5lcgorICAgICAgICBjbG9zZSAgICAgICAgICAgcmFpc2VzIGEgbmV3IEdlbmVyYXRvckV4aXQgZXhjZXB0aW9uIGluc2lkZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvciB0byB0ZXJtaW5hdGUgdGhlIGl0ZXJhdGlvbgorICAgICAgICBnaV9jb2RlICAgICAgICAgY29kZSBvYmplY3QKKyAgICAgICAgZ2lfZnJhbWUgICAgICAgIGZyYW1lIG9iamVjdCBvciBwb3NzaWJseSBOb25lIG9uY2UgdGhlIGdlbmVyYXRvciBoYXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlZW4gZXhoYXVzdGVkCisgICAgICAgIGdpX3J1bm5pbmcgICAgICBzZXQgdG8gMSB3aGVuIGdlbmVyYXRvciBpcyBleGVjdXRpbmcsIDAgb3RoZXJ3aXNlCisgICAgICAgIG5leHQgICAgICAgICAgICByZXR1cm4gdGhlIG5leHQgaXRlbSBmcm9tIHRoZSBjb250YWluZXIKKyAgICAgICAgc2VuZCAgICAgICAgICAgIHJlc3VtZXMgdGhlIGdlbmVyYXRvciBhbmQgInNlbmRzIiBhIHZhbHVlIHRoYXQgYmVjb21lcworICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBvZiB0aGUgY3VycmVudCB5aWVsZC1leHByZXNzaW9uCisgICAgICAgIHRocm93ICAgICAgICAgICB1c2VkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiBpbnNpZGUgdGhlIGdlbmVyYXRvciIiIgorICAgIHJldHVybiBpc2luc3RhbmNlKG9iamVjdCwgdHlwZXMuR2VuZXJhdG9yVHlwZSkKKworZGVmIGlzdHJhY2ViYWNrKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIHRyYWNlYmFjay4KKworICAgIFRyYWNlYmFjayBvYmplY3RzIHByb3ZpZGUgdGhlc2UgYXR0cmlidXRlczoKKyAgICAgICAgdGJfZnJhbWUgICAgICAgIGZyYW1lIG9iamVjdCBhdCB0aGlzIGxldmVsCisgICAgICAgIHRiX2xhc3RpICAgICAgICBpbmRleCBvZiBsYXN0IGF0dGVtcHRlZCBpbnN0cnVjdGlvbiBpbiBieXRlY29kZQorICAgICAgICB0Yl9saW5lbm8gICAgICAgY3VycmVudCBsaW5lIG51bWJlciBpbiBQeXRob24gc291cmNlIGNvZGUKKyAgICAgICAgdGJfbmV4dCAgICAgICAgIG5leHQgaW5uZXIgdHJhY2ViYWNrIG9iamVjdCAoY2FsbGVkIGJ5IHRoaXMgbGV2ZWwpIiIiCisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlcy5UcmFjZWJhY2tUeXBlKQorCitkZWYgaXNmcmFtZShvYmplY3QpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBmcmFtZSBvYmplY3QuCisKKyAgICBGcmFtZSBvYmplY3RzIHByb3ZpZGUgdGhlc2UgYXR0cmlidXRlczoKKyAgICAgICAgZl9iYWNrICAgICAgICAgIG5leHQgb3V0ZXIgZnJhbWUgb2JqZWN0ICh0aGlzIGZyYW1lJ3MgY2FsbGVyKQorICAgICAgICBmX2J1aWx0aW5zICAgICAgYnVpbHQtaW4gbmFtZXNwYWNlIHNlZW4gYnkgdGhpcyBmcmFtZQorICAgICAgICBmX2NvZGUgICAgICAgICAgY29kZSBvYmplY3QgYmVpbmcgZXhlY3V0ZWQgaW4gdGhpcyBmcmFtZQorICAgICAgICBmX2V4Y190cmFjZWJhY2sgdHJhY2ViYWNrIGlmIHJhaXNlZCBpbiB0aGlzIGZyYW1lLCBvciBOb25lCisgICAgICAgIGZfZXhjX3R5cGUgICAgICBleGNlcHRpb24gdHlwZSBpZiByYWlzZWQgaW4gdGhpcyBmcmFtZSwgb3IgTm9uZQorICAgICAgICBmX2V4Y192YWx1ZSAgICAgZXhjZXB0aW9uIHZhbHVlIGlmIHJhaXNlZCBpbiB0aGlzIGZyYW1lLCBvciBOb25lCisgICAgICAgIGZfZ2xvYmFscyAgICAgICBnbG9iYWwgbmFtZXNwYWNlIHNlZW4gYnkgdGhpcyBmcmFtZQorICAgICAgICBmX2xhc3RpICAgICAgICAgaW5kZXggb2YgbGFzdCBhdHRlbXB0ZWQgaW5zdHJ1Y3Rpb24gaW4gYnl0ZWNvZGUKKyAgICAgICAgZl9saW5lbm8gICAgICAgIGN1cnJlbnQgbGluZSBudW1iZXIgaW4gUHl0aG9uIHNvdXJjZSBjb2RlCisgICAgICAgIGZfbG9jYWxzICAgICAgICBsb2NhbCBuYW1lc3BhY2Ugc2VlbiBieSB0aGlzIGZyYW1lCisgICAgICAgIGZfcmVzdHJpY3RlZCAgICAwIG9yIDEgaWYgZnJhbWUgaXMgaW4gcmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZQorICAgICAgICBmX3RyYWNlICAgICAgICAgdHJhY2luZyBmdW5jdGlvbiBmb3IgdGhpcyBmcmFtZSwgb3IgTm9uZSIiIgorICAgIHJldHVybiBpc2luc3RhbmNlKG9iamVjdCwgdHlwZXMuRnJhbWVUeXBlKQorCitkZWYgaXNjb2RlKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGNvZGUgb2JqZWN0LgorCisgICAgQ29kZSBvYmplY3RzIHByb3ZpZGUgdGhlc2UgYXR0cmlidXRlczoKKyAgICAgICAgY29fYXJnY291bnQgICAgIG51bWJlciBvZiBhcmd1bWVudHMgKG5vdCBpbmNsdWRpbmcgKiBvciAqKiBhcmdzKQorICAgICAgICBjb19jb2RlICAgICAgICAgc3RyaW5nIG9mIHJhdyBjb21waWxlZCBieXRlY29kZQorICAgICAgICBjb19jb25zdHMgICAgICAgdHVwbGUgb2YgY29uc3RhbnRzIHVzZWQgaW4gdGhlIGJ5dGVjb2RlCisgICAgICAgIGNvX2ZpbGVuYW1lICAgICBuYW1lIG9mIGZpbGUgaW4gd2hpY2ggdGhpcyBjb2RlIG9iamVjdCB3YXMgY3JlYXRlZAorICAgICAgICBjb19maXJzdGxpbmVubyAgbnVtYmVyIG9mIGZpcnN0IGxpbmUgaW4gUHl0aG9uIHNvdXJjZSBjb2RlCisgICAgICAgIGNvX2ZsYWdzICAgICAgICBiaXRtYXA6IDE9b3B0aW1pemVkIHwgMj1uZXdsb2NhbHMgfCA0PSphcmcgfCA4PSoqYXJnCisgICAgICAgIGNvX2xub3RhYiAgICAgICBlbmNvZGVkIG1hcHBpbmcgb2YgbGluZSBudW1iZXJzIHRvIGJ5dGVjb2RlIGluZGljZXMKKyAgICAgICAgY29fbmFtZSAgICAgICAgIG5hbWUgd2l0aCB3aGljaCB0aGlzIGNvZGUgb2JqZWN0IHdhcyBkZWZpbmVkCisgICAgICAgIGNvX25hbWVzICAgICAgICB0dXBsZSBvZiBuYW1lcyBvZiBsb2NhbCB2YXJpYWJsZXMKKyAgICAgICAgY29fbmxvY2FscyAgICAgIG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMKKyAgICAgICAgY29fc3RhY2tzaXplICAgIHZpcnR1YWwgbWFjaGluZSBzdGFjayBzcGFjZSByZXF1aXJlZAorICAgICAgICBjb192YXJuYW1lcyAgICAgdHVwbGUgb2YgbmFtZXMgb2YgYXJndW1lbnRzIGFuZCBsb2NhbCB2YXJpYWJsZXMiIiIKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvYmplY3QsIHR5cGVzLkNvZGVUeXBlKQorCitkZWYgaXNidWlsdGluKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGJ1aWx0LWluIGZ1bmN0aW9uIG9yIG1ldGhvZC4KKworICAgIEJ1aWx0LWluIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcyBwcm92aWRlIHRoZXNlIGF0dHJpYnV0ZXM6CisgICAgICAgIF9fZG9jX18gICAgICAgICBkb2N1bWVudGF0aW9uIHN0cmluZworICAgICAgICBfX25hbWVfXyAgICAgICAgb3JpZ2luYWwgbmFtZSBvZiB0aGlzIGZ1bmN0aW9uIG9yIG1ldGhvZAorICAgICAgICBfX3NlbGZfXyAgICAgICAgaW5zdGFuY2UgdG8gd2hpY2ggYSBtZXRob2QgaXMgYm91bmQsIG9yIE5vbmUiIiIKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvYmplY3QsIHR5cGVzLkJ1aWx0aW5GdW5jdGlvblR5cGUpCisKK2RlZiBpc3JvdXRpbmUob2JqZWN0KToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGFueSBraW5kIG9mIGZ1bmN0aW9uIG9yIG1ldGhvZC4iIiIKKyAgICByZXR1cm4gKGlzYnVpbHRpbihvYmplY3QpCisgICAgICAgICAgICBvciBpc2Z1bmN0aW9uKG9iamVjdCkKKyAgICAgICAgICAgIG9yIGlzbWV0aG9kKG9iamVjdCkKKyAgICAgICAgICAgIG9yIGlzbWV0aG9kZGVzY3JpcHRvcihvYmplY3QpKQorCitkZWYgaXNhYnN0cmFjdChvYmplY3QpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyAoQUJDKS4iIiIKKyAgICByZXR1cm4gYm9vbChpc2luc3RhbmNlKG9iamVjdCwgdHlwZSkgYW5kIG9iamVjdC5fX2ZsYWdzX18gJiBUUEZMQUdTX0lTX0FCU1RSQUNUKQorCitkZWYgZ2V0bWVtYmVycyhvYmplY3QsIHByZWRpY2F0ZT1Ob25lKToKKyAgICAiIiJSZXR1cm4gYWxsIG1lbWJlcnMgb2YgYW4gb2JqZWN0IGFzIChuYW1lLCB2YWx1ZSkgcGFpcnMgc29ydGVkIGJ5IG5hbWUuCisgICAgT3B0aW9uYWxseSwgb25seSByZXR1cm4gbWVtYmVycyB0aGF0IHNhdGlzZnkgYSBnaXZlbiBwcmVkaWNhdGUuIiIiCisgICAgcmVzdWx0cyA9IFtdCisgICAgZm9yIGtleSBpbiBkaXIob2JqZWN0KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKG9iamVjdCwga2V5KQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBub3QgcHJlZGljYXRlIG9yIHByZWRpY2F0ZSh2YWx1ZSk6CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgoa2V5LCB2YWx1ZSkpCisgICAgcmVzdWx0cy5zb3J0KCkKKyAgICByZXR1cm4gcmVzdWx0cworCitBdHRyaWJ1dGUgPSBuYW1lZHR1cGxlKCdBdHRyaWJ1dGUnLCAnbmFtZSBraW5kIGRlZmluaW5nX2NsYXNzIG9iamVjdCcpCisKK2RlZiBjbGFzc2lmeV9jbGFzc19hdHRycyhjbHMpOgorICAgICIiIlJldHVybiBsaXN0IG9mIGF0dHJpYnV0ZS1kZXNjcmlwdG9yIHR1cGxlcy4KKworICAgIEZvciBlYWNoIG5hbWUgaW4gZGlyKGNscyksIHRoZSByZXR1cm4gbGlzdCBjb250YWlucyBhIDQtdHVwbGUKKyAgICB3aXRoIHRoZXNlIGVsZW1lbnRzOgorCisgICAgICAgIDAuIFRoZSBuYW1lIChhIHN0cmluZykuCisKKyAgICAgICAgMS4gVGhlIGtpbmQgb2YgYXR0cmlidXRlIHRoaXMgaXMsIG9uZSBvZiB0aGVzZSBzdHJpbmdzOgorICAgICAgICAgICAgICAgJ2NsYXNzIG1ldGhvZCcgICAgY3JlYXRlZCB2aWEgY2xhc3NtZXRob2QoKQorICAgICAgICAgICAgICAgJ3N0YXRpYyBtZXRob2QnICAgY3JlYXRlZCB2aWEgc3RhdGljbWV0aG9kKCkKKyAgICAgICAgICAgICAgICdwcm9wZXJ0eScgICAgICAgIGNyZWF0ZWQgdmlhIHByb3BlcnR5KCkKKyAgICAgICAgICAgICAgICdtZXRob2QnICAgICAgICAgIGFueSBvdGhlciBmbGF2b3Igb2YgbWV0aG9kCisgICAgICAgICAgICAgICAnZGF0YScgICAgICAgICAgICBub3QgYSBtZXRob2QKKworICAgICAgICAyLiBUaGUgY2xhc3Mgd2hpY2ggZGVmaW5lZCB0aGlzIGF0dHJpYnV0ZSAoYSBjbGFzcykuCisKKyAgICAgICAgMy4gVGhlIG9iamVjdCBhcyBvYnRhaW5lZCBkaXJlY3RseSBmcm9tIHRoZSBkZWZpbmluZyBjbGFzcydzCisgICAgICAgICAgIF9fZGljdF9fLCBub3QgdmlhIGdldGF0dHIuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvcgorICAgICAgICAgICBkYXRhIGF0dHJpYnV0ZXM6ICBDLmRhdGEgaXMganVzdCBhIGRhdGEgb2JqZWN0LCBidXQKKyAgICAgICAgICAgQy5fX2RpY3RfX1snZGF0YSddIG1heSBiZSBhIGRhdGEgZGVzY3JpcHRvciB3aXRoIGFkZGl0aW9uYWwKKyAgICAgICAgICAgaW5mbywgbGlrZSBhIF9fZG9jX18gc3RyaW5nLgorICAgICIiIgorCisgICAgbXJvID0gZ2V0bXJvKGNscykKKyAgICBuYW1lcyA9IGRpcihjbHMpCisgICAgcmVzdWx0ID0gW10KKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgIyBHZXQgdGhlIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUsIGFuZCB3aGVyZSBpdCB3YXMgZGVmaW5lZC4KKyAgICAgICAgIyBHZXR0aW5nIGFuIG9iaiBmcm9tIHRoZSBfX2RpY3RfXyBzb21ldGltZXMgcmV2ZWFscyBtb3JlIHRoYW4KKyAgICAgICAgIyB1c2luZyBnZXRhdHRyLiAgU3RhdGljIGFuZCBjbGFzcyBtZXRob2RzIGFyZSBkcmFtYXRpYyBleGFtcGxlcy4KKyAgICAgICAgIyBGdXJ0aGVybW9yZSwgc29tZSBvYmplY3RzIG1heSByYWlzZSBhbiBFeGNlcHRpb24gd2hlbiBmZXRjaGVkIHdpdGgKKyAgICAgICAgIyBnZXRhdHRyKCkuIFRoaXMgaXMgdGhlIGNhc2Ugd2l0aCBzb21lIGRlc2NyaXB0b3JzIChidWcgIzE3ODUpLgorICAgICAgICAjIFRodXMsIHdlIG9ubHkgdXNlIGdldGF0dHIoKSBhcyBhIGxhc3QgcmVzb3J0LgorICAgICAgICBob21lY2xzID0gTm9uZQorICAgICAgICBmb3IgYmFzZSBpbiAoY2xzLCkgKyBtcm86CisgICAgICAgICAgICBpZiBuYW1lIGluIGJhc2UuX19kaWN0X186CisgICAgICAgICAgICAgICAgb2JqID0gYmFzZS5fX2RpY3RfX1tuYW1lXQorICAgICAgICAgICAgICAgIGhvbWVjbHMgPSBiYXNlCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9iaiA9IGdldGF0dHIoY2xzLCBuYW1lKQorICAgICAgICAgICAgaG9tZWNscyA9IGdldGF0dHIob2JqLCAiX19vYmpjbGFzc19fIiwgaG9tZWNscykKKworICAgICAgICAjIENsYXNzaWZ5IHRoZSBvYmplY3QuCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBzdGF0aWNtZXRob2QpOgorICAgICAgICAgICAga2luZCA9ICJzdGF0aWMgbWV0aG9kIgorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBjbGFzc21ldGhvZCk6CisgICAgICAgICAgICBraW5kID0gImNsYXNzIG1ldGhvZCIKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG9iaiwgcHJvcGVydHkpOgorICAgICAgICAgICAga2luZCA9ICJwcm9wZXJ0eSIKKyAgICAgICAgZWxpZiBpc21ldGhvZGRlc2NyaXB0b3Iob2JqKToKKyAgICAgICAgICAgIGtpbmQgPSAibWV0aG9kIgorICAgICAgICBlbGlmIGlzZGF0YWRlc2NyaXB0b3Iob2JqKToKKyAgICAgICAgICAgIGtpbmQgPSAiZGF0YSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9ial92aWFfZ2V0YXR0ciA9IGdldGF0dHIoY2xzLCBuYW1lKQorICAgICAgICAgICAgaWYgKGlzbWV0aG9kKG9ial92aWFfZ2V0YXR0cikgb3IKKyAgICAgICAgICAgICAgICBpc21ldGhvZGRlc2NyaXB0b3Iob2JqX3ZpYV9nZXRhdHRyKSk6CisgICAgICAgICAgICAgICAga2luZCA9ICJtZXRob2QiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGtpbmQgPSAiZGF0YSIKKyAgICAgICAgICAgIG9iaiA9IG9ial92aWFfZ2V0YXR0cgorCisgICAgICAgIHJlc3VsdC5hcHBlbmQoQXR0cmlidXRlKG5hbWUsIGtpbmQsIGhvbWVjbHMsIG9iaikpCisKKyAgICByZXR1cm4gcmVzdWx0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY2xhc3MgaGVscGVycworZGVmIF9zZWFyY2hiYXNlcyhjbHMsIGFjY3VtKToKKyAgICAjIFNpbXVsYXRlIHRoZSAiY2xhc3NpYyBjbGFzcyIgc2VhcmNoIG9yZGVyLgorICAgIGlmIGNscyBpbiBhY2N1bToKKyAgICAgICAgcmV0dXJuCisgICAgYWNjdW0uYXBwZW5kKGNscykKKyAgICBmb3IgYmFzZSBpbiBjbHMuX19iYXNlc19fOgorICAgICAgICBfc2VhcmNoYmFzZXMoYmFzZSwgYWNjdW0pCisKK2RlZiBnZXRtcm8oY2xzKToKKyAgICAiUmV0dXJuIHR1cGxlIG9mIGJhc2UgY2xhc3NlcyAoaW5jbHVkaW5nIGNscykgaW4gbWV0aG9kIHJlc29sdXRpb24gb3JkZXIuIgorICAgIGlmIGhhc2F0dHIoY2xzLCAiX19tcm9fXyIpOgorICAgICAgICByZXR1cm4gY2xzLl9fbXJvX18KKyAgICBlbHNlOgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBfc2VhcmNoYmFzZXMoY2xzLCByZXN1bHQpCisgICAgICAgIHJldHVybiB0dXBsZShyZXN1bHQpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc291cmNlIGNvZGUgZXh0cmFjdGlvbgorZGVmIGluZGVudHNpemUobGluZSk6CisgICAgIiIiUmV0dXJuIHRoZSBpbmRlbnQgc2l6ZSwgaW4gc3BhY2VzLCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIG9mIHRleHQuIiIiCisgICAgZXhwbGluZSA9IHN0cmluZy5leHBhbmR0YWJzKGxpbmUpCisgICAgcmV0dXJuIGxlbihleHBsaW5lKSAtIGxlbihzdHJpbmcubHN0cmlwKGV4cGxpbmUpKQorCitkZWYgZ2V0ZG9jKG9iamVjdCk6CisgICAgIiIiR2V0IHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBmb3IgYW4gb2JqZWN0LgorCisgICAgQWxsIHRhYnMgYXJlIGV4cGFuZGVkIHRvIHNwYWNlcy4gIFRvIGNsZWFuIHVwIGRvY3N0cmluZ3MgdGhhdCBhcmUKKyAgICBpbmRlbnRlZCB0byBsaW5lIHVwIHdpdGggYmxvY2tzIG9mIGNvZGUsIGFueSB3aGl0ZXNwYWNlIHRoYW4gY2FuIGJlCisgICAgdW5pZm9ybWx5IHJlbW92ZWQgZnJvbSB0aGUgc2Vjb25kIGxpbmUgb253YXJkcyBpcyByZW1vdmVkLiIiIgorICAgIHRyeToKKyAgICAgICAgZG9jID0gb2JqZWN0Ll9fZG9jX18KKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgaWYgbm90IGlzaW5zdGFuY2UoZG9jLCB0eXBlcy5TdHJpbmdUeXBlcyk6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIGNsZWFuZG9jKGRvYykKKworZGVmIGNsZWFuZG9jKGRvYyk6CisgICAgIiIiQ2xlYW4gdXAgaW5kZW50YXRpb24gZnJvbSBkb2NzdHJpbmdzLgorCisgICAgQW55IHdoaXRlc3BhY2UgdGhhdCBjYW4gYmUgdW5pZm9ybWx5IHJlbW92ZWQgZnJvbSB0aGUgc2Vjb25kIGxpbmUKKyAgICBvbndhcmRzIGlzIHJlbW92ZWQuIiIiCisgICAgdHJ5OgorICAgICAgICBsaW5lcyA9IHN0cmluZy5zcGxpdChzdHJpbmcuZXhwYW5kdGFicyhkb2MpLCAnXG4nKQorICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgZWxzZToKKyAgICAgICAgIyBGaW5kIG1pbmltdW0gaW5kZW50YXRpb24gb2YgYW55IG5vbi1ibGFuayBsaW5lcyBhZnRlciBmaXJzdCBsaW5lLgorICAgICAgICBtYXJnaW4gPSBzeXMubWF4aW50CisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzWzE6XToKKyAgICAgICAgICAgIGNvbnRlbnQgPSBsZW4oc3RyaW5nLmxzdHJpcChsaW5lKSkKKyAgICAgICAgICAgIGlmIGNvbnRlbnQ6CisgICAgICAgICAgICAgICAgaW5kZW50ID0gbGVuKGxpbmUpIC0gY29udGVudAorICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1pbihtYXJnaW4sIGluZGVudCkKKyAgICAgICAgIyBSZW1vdmUgaW5kZW50YXRpb24uCisgICAgICAgIGlmIGxpbmVzOgorICAgICAgICAgICAgbGluZXNbMF0gPSBsaW5lc1swXS5sc3RyaXAoKQorICAgICAgICBpZiBtYXJnaW4gPCBzeXMubWF4aW50OgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKGxpbmVzKSk6IGxpbmVzW2ldID0gbGluZXNbaV1bbWFyZ2luOl0KKyAgICAgICAgIyBSZW1vdmUgYW55IHRyYWlsaW5nIG9yIGxlYWRpbmcgYmxhbmsgbGluZXMuCisgICAgICAgIHdoaWxlIGxpbmVzIGFuZCBub3QgbGluZXNbLTFdOgorICAgICAgICAgICAgbGluZXMucG9wKCkKKyAgICAgICAgd2hpbGUgbGluZXMgYW5kIG5vdCBsaW5lc1swXToKKyAgICAgICAgICAgIGxpbmVzLnBvcCgwKQorICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW4obGluZXMsICdcbicpCisKK2RlZiBnZXRmaWxlKG9iamVjdCk6CisgICAgIiIiV29yayBvdXQgd2hpY2ggc291cmNlIG9yIGNvbXBpbGVkIGZpbGUgYW4gb2JqZWN0IHdhcyBkZWZpbmVkIGluLiIiIgorICAgIGlmIGlzbW9kdWxlKG9iamVjdCk6CisgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCAnX19maWxlX18nKToKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QuX19maWxlX18KKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd7IXJ9IGlzIGEgYnVpbHQtaW4gbW9kdWxlJy5mb3JtYXQob2JqZWN0KSkKKyAgICBpZiBpc2NsYXNzKG9iamVjdCk6CisgICAgICAgIG9iamVjdCA9IHN5cy5tb2R1bGVzLmdldChvYmplY3QuX19tb2R1bGVfXykKKyAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX2ZpbGVfXycpOgorICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2ZpbGVfXworICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3shcn0gaXMgYSBidWlsdC1pbiBjbGFzcycuZm9ybWF0KG9iamVjdCkpCisgICAgaWYgaXNtZXRob2Qob2JqZWN0KToKKyAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmltX2Z1bmMKKyAgICBpZiBpc2Z1bmN0aW9uKG9iamVjdCk6CisgICAgICAgIG9iamVjdCA9IG9iamVjdC5mdW5jX2NvZGUKKyAgICBpZiBpc3RyYWNlYmFjayhvYmplY3QpOgorICAgICAgICBvYmplY3QgPSBvYmplY3QudGJfZnJhbWUKKyAgICBpZiBpc2ZyYW1lKG9iamVjdCk6CisgICAgICAgIG9iamVjdCA9IG9iamVjdC5mX2NvZGUKKyAgICBpZiBpc2NvZGUob2JqZWN0KToKKyAgICAgICAgcmV0dXJuIG9iamVjdC5jb19maWxlbmFtZQorICAgIHJhaXNlIFR5cGVFcnJvcigneyFyfSBpcyBub3QgYSBtb2R1bGUsIGNsYXNzLCBtZXRob2QsICcKKyAgICAgICAgICAgICAgICAgICAgJ2Z1bmN0aW9uLCB0cmFjZWJhY2ssIGZyYW1lLCBvciBjb2RlIG9iamVjdCcuZm9ybWF0KG9iamVjdCkpCisKK01vZHVsZUluZm8gPSBuYW1lZHR1cGxlKCdNb2R1bGVJbmZvJywgJ25hbWUgc3VmZml4IG1vZGUgbW9kdWxlX3R5cGUnKQorCitkZWYgZ2V0bW9kdWxlaW5mbyhwYXRoKToKKyAgICAiIiJHZXQgdGhlIG1vZHVsZSBuYW1lLCBzdWZmaXgsIG1vZGUsIGFuZCBtb2R1bGUgdHlwZSBmb3IgYSBnaXZlbiBmaWxlLiIiIgorICAgIGZpbGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQorICAgIHN1ZmZpeGVzID0gbWFwKGxhbWJkYSBpbmZvOgorICAgICAgICAgICAgICAgICAgICgtbGVuKGluZm9bMF0pLCBpbmZvWzBdLCBpbmZvWzFdLCBpbmZvWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgaW1wLmdldF9zdWZmaXhlcygpKQorICAgIHN1ZmZpeGVzLnNvcnQoKSAjIHRyeSBsb25nZXN0IHN1ZmZpeGVzIGZpcnN0LCBpbiBjYXNlIHRoZXkgb3ZlcmxhcAorICAgIGZvciBuZWdsZW4sIHN1ZmZpeCwgbW9kZSwgbXR5cGUgaW4gc3VmZml4ZXM6CisgICAgICAgIGlmIGZpbGVuYW1lW25lZ2xlbjpdID09IHN1ZmZpeDoKKyAgICAgICAgICAgIHJldHVybiBNb2R1bGVJbmZvKGZpbGVuYW1lWzpuZWdsZW5dLCBzdWZmaXgsIG1vZGUsIG10eXBlKQorCitkZWYgZ2V0bW9kdWxlbmFtZShwYXRoKToKKyAgICAiIiJSZXR1cm4gdGhlIG1vZHVsZSBuYW1lIGZvciBhIGdpdmVuIGZpbGUsIG9yIE5vbmUuIiIiCisgICAgaW5mbyA9IGdldG1vZHVsZWluZm8ocGF0aCkKKyAgICBpZiBpbmZvOiByZXR1cm4gaW5mb1swXQorCitkZWYgZ2V0c291cmNlZmlsZShvYmplY3QpOgorICAgICIiIlJldHVybiB0aGUgZmlsZW5hbWUgdGhhdCBjYW4gYmUgdXNlZCB0byBsb2NhdGUgYW4gb2JqZWN0J3Mgc291cmNlLgorICAgIFJldHVybiBOb25lIGlmIG5vIHdheSBjYW4gYmUgaWRlbnRpZmllZCB0byBnZXQgdGhlIHNvdXJjZS4KKyAgICAiIiIKKyAgICBmaWxlbmFtZSA9IGdldGZpbGUob2JqZWN0KQorICAgIGlmIHN0cmluZy5sb3dlcihmaWxlbmFtZVstNDpdKSBpbiAoJy5weWMnLCAnLnB5bycpOgorICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotNF0gKyAnLnB5JworICAgIGZvciBzdWZmaXgsIG1vZGUsIGtpbmQgaW4gaW1wLmdldF9zdWZmaXhlcygpOgorICAgICAgICBpZiAnYicgaW4gbW9kZSBhbmQgc3RyaW5nLmxvd2VyKGZpbGVuYW1lWy1sZW4oc3VmZml4KTpdKSA9PSBzdWZmaXg6CisgICAgICAgICAgICAjIExvb2tzIGxpa2UgYSBiaW5hcnkgZmlsZS4gIFdlIHdhbnQgdG8gb25seSByZXR1cm4gYSB0ZXh0IGZpbGUuCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisgICAgIyBvbmx5IHJldHVybiBhIG5vbi1leGlzdGVudCBmaWxlbmFtZSBpZiB0aGUgbW9kdWxlIGhhcyBhIFBFUCAzMDIgbG9hZGVyCisgICAgaWYgaGFzYXR0cihnZXRtb2R1bGUob2JqZWN0LCBmaWxlbmFtZSksICdfX2xvYWRlcl9fJyk6CisgICAgICAgIHJldHVybiBmaWxlbmFtZQorICAgICMgb3IgaXQgaXMgaW4gdGhlIGxpbmVjYWNoZQorICAgIGlmIGZpbGVuYW1lIGluIGxpbmVjYWNoZS5jYWNoZToKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisKK2RlZiBnZXRhYnNmaWxlKG9iamVjdCwgX2ZpbGVuYW1lPU5vbmUpOgorICAgICIiIlJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBzb3VyY2Ugb3IgY29tcGlsZWQgZmlsZSBmb3IgYW4gb2JqZWN0LgorCisgICAgVGhlIGlkZWEgaXMgZm9yIGVhY2ggb2JqZWN0IHRvIGhhdmUgYSB1bmlxdWUgb3JpZ2luLCBzbyB0aGlzIHJvdXRpbmUKKyAgICBub3JtYWxpemVzIHRoZSByZXN1bHQgYXMgbXVjaCBhcyBwb3NzaWJsZS4iIiIKKyAgICBpZiBfZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgX2ZpbGVuYW1lID0gZ2V0c291cmNlZmlsZShvYmplY3QpIG9yIGdldGZpbGUob2JqZWN0KQorICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChfZmlsZW5hbWUpKQorCittb2R1bGVzYnlmaWxlID0ge30KK19maWxlc2J5bW9kbmFtZSA9IHt9CisKK2RlZiBnZXRtb2R1bGUob2JqZWN0LCBfZmlsZW5hbWU9Tm9uZSk6CisgICAgIiIiUmV0dXJuIHRoZSBtb2R1bGUgYW4gb2JqZWN0IHdhcyBkZWZpbmVkIGluLCBvciBOb25lIGlmIG5vdCBmb3VuZC4iIiIKKyAgICBpZiBpc21vZHVsZShvYmplY3QpOgorICAgICAgICByZXR1cm4gb2JqZWN0CisgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX21vZHVsZV9fJyk6CisgICAgICAgIHJldHVybiBzeXMubW9kdWxlcy5nZXQob2JqZWN0Ll9fbW9kdWxlX18pCisgICAgIyBUcnkgdGhlIGZpbGVuYW1lIHRvIG1vZHVsZW5hbWUgY2FjaGUKKyAgICBpZiBfZmlsZW5hbWUgaXMgbm90IE5vbmUgYW5kIF9maWxlbmFtZSBpbiBtb2R1bGVzYnlmaWxlOgorICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXMuZ2V0KG1vZHVsZXNieWZpbGVbX2ZpbGVuYW1lXSkKKyAgICAjIFRyeSB0aGUgY2FjaGUgYWdhaW4gd2l0aCB0aGUgYWJzb2x1dGUgZmlsZSBuYW1lCisgICAgdHJ5OgorICAgICAgICBmaWxlID0gZ2V0YWJzZmlsZShvYmplY3QsIF9maWxlbmFtZSkKKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGlmIGZpbGUgaW4gbW9kdWxlc2J5ZmlsZToKKyAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzLmdldChtb2R1bGVzYnlmaWxlW2ZpbGVdKQorICAgICMgVXBkYXRlIHRoZSBmaWxlbmFtZSB0byBtb2R1bGUgbmFtZSBjYWNoZSBhbmQgY2hlY2sgeWV0IGFnYWluCisgICAgIyBDb3B5IHN5cy5tb2R1bGVzIGluIG9yZGVyIHRvIGNvcGUgd2l0aCBjaGFuZ2VzIHdoaWxlIGl0ZXJhdGluZworICAgIGZvciBtb2RuYW1lLCBtb2R1bGUgaW4gc3lzLm1vZHVsZXMuaXRlbXMoKToKKyAgICAgICAgaWYgaXNtb2R1bGUobW9kdWxlKSBhbmQgaGFzYXR0cihtb2R1bGUsICdfX2ZpbGVfXycpOgorICAgICAgICAgICAgZiA9IG1vZHVsZS5fX2ZpbGVfXworICAgICAgICAgICAgaWYgZiA9PSBfZmlsZXNieW1vZG5hbWUuZ2V0KG1vZG5hbWUsIE5vbmUpOgorICAgICAgICAgICAgICAgICMgSGF2ZSBhbHJlYWR5IG1hcHBlZCB0aGlzIG1vZHVsZSwgc28gc2tpcCBpdAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBfZmlsZXNieW1vZG5hbWVbbW9kbmFtZV0gPSBmCisgICAgICAgICAgICBmID0gZ2V0YWJzZmlsZShtb2R1bGUpCisgICAgICAgICAgICAjIEFsd2F5cyBtYXAgdG8gdGhlIG5hbWUgdGhlIG1vZHVsZSBrbm93cyBpdHNlbGYgYnkKKyAgICAgICAgICAgIG1vZHVsZXNieWZpbGVbZl0gPSBtb2R1bGVzYnlmaWxlWworICAgICAgICAgICAgICAgIG9zLnBhdGgucmVhbHBhdGgoZildID0gbW9kdWxlLl9fbmFtZV9fCisgICAgaWYgZmlsZSBpbiBtb2R1bGVzYnlmaWxlOgorICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXMuZ2V0KG1vZHVsZXNieWZpbGVbZmlsZV0pCisgICAgIyBDaGVjayB0aGUgbWFpbiBtb2R1bGUKKyAgICBtYWluID0gc3lzLm1vZHVsZXNbJ19fbWFpbl9fJ10KKyAgICBpZiBub3QgaGFzYXR0cihvYmplY3QsICdfX25hbWVfXycpOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGlmIGhhc2F0dHIobWFpbiwgb2JqZWN0Ll9fbmFtZV9fKToKKyAgICAgICAgbWFpbm9iamVjdCA9IGdldGF0dHIobWFpbiwgb2JqZWN0Ll9fbmFtZV9fKQorICAgICAgICBpZiBtYWlub2JqZWN0IGlzIG9iamVjdDoKKyAgICAgICAgICAgIHJldHVybiBtYWluCisgICAgIyBDaGVjayBidWlsdGlucworICAgIGJ1aWx0aW4gPSBzeXMubW9kdWxlc1snX19idWlsdGluX18nXQorICAgIGlmIGhhc2F0dHIoYnVpbHRpbiwgb2JqZWN0Ll9fbmFtZV9fKToKKyAgICAgICAgYnVpbHRpbm9iamVjdCA9IGdldGF0dHIoYnVpbHRpbiwgb2JqZWN0Ll9fbmFtZV9fKQorICAgICAgICBpZiBidWlsdGlub2JqZWN0IGlzIG9iamVjdDoKKyAgICAgICAgICAgIHJldHVybiBidWlsdGluCisKK2RlZiBmaW5kc291cmNlKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRoZSBlbnRpcmUgc291cmNlIGZpbGUgYW5kIHN0YXJ0aW5nIGxpbmUgbnVtYmVyIGZvciBhbiBvYmplY3QuCisKKyAgICBUaGUgYXJndW1lbnQgbWF5IGJlIGEgbW9kdWxlLCBjbGFzcywgbWV0aG9kLCBmdW5jdGlvbiwgdHJhY2ViYWNrLCBmcmFtZSwKKyAgICBvciBjb2RlIG9iamVjdC4gIFRoZSBzb3VyY2UgY29kZSBpcyByZXR1cm5lZCBhcyBhIGxpc3Qgb2YgYWxsIHRoZSBsaW5lcworICAgIGluIHRoZSBmaWxlIGFuZCB0aGUgbGluZSBudW1iZXIgaW5kZXhlcyBhIGxpbmUgaW4gdGhhdCBsaXN0LiAgQW4gSU9FcnJvcgorICAgIGlzIHJhaXNlZCBpZiB0aGUgc291cmNlIGNvZGUgY2Fubm90IGJlIHJldHJpZXZlZC4iIiIKKworICAgIGZpbGUgPSBnZXRmaWxlKG9iamVjdCkKKyAgICBzb3VyY2VmaWxlID0gZ2V0c291cmNlZmlsZShvYmplY3QpCisgICAgaWYgbm90IHNvdXJjZWZpbGUgYW5kIGZpbGVbOjFdICsgZmlsZVstMTpdICE9ICc8Pic6CisgICAgICAgIHJhaXNlIElPRXJyb3IoJ3NvdXJjZSBjb2RlIG5vdCBhdmFpbGFibGUnKQorICAgIGZpbGUgPSBzb3VyY2VmaWxlIGlmIHNvdXJjZWZpbGUgZWxzZSBmaWxlCisKKyAgICBtb2R1bGUgPSBnZXRtb2R1bGUob2JqZWN0LCBmaWxlKQorICAgIGlmIG1vZHVsZToKKyAgICAgICAgbGluZXMgPSBsaW5lY2FjaGUuZ2V0bGluZXMoZmlsZSwgbW9kdWxlLl9fZGljdF9fKQorICAgIGVsc2U6CisgICAgICAgIGxpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzKGZpbGUpCisgICAgaWYgbm90IGxpbmVzOgorICAgICAgICByYWlzZSBJT0Vycm9yKCdjb3VsZCBub3QgZ2V0IHNvdXJjZSBjb2RlJykKKworICAgIGlmIGlzbW9kdWxlKG9iamVjdCk6CisgICAgICAgIHJldHVybiBsaW5lcywgMAorCisgICAgaWYgaXNjbGFzcyhvYmplY3QpOgorICAgICAgICBuYW1lID0gb2JqZWN0Ll9fbmFtZV9fCisgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUocideKFxzKiljbGFzc1xzKicgKyBuYW1lICsgcidcYicpCisgICAgICAgICMgbWFrZSBzb21lIGVmZm9ydCB0byBmaW5kIHRoZSBiZXN0IG1hdGNoaW5nIGNsYXNzIGRlZmluaXRpb246CisgICAgICAgICMgdXNlIHRoZSBvbmUgd2l0aCB0aGUgbGVhc3QgaW5kZW50YXRpb24sIHdoaWNoIGlzIHRoZSBvbmUKKyAgICAgICAgIyB0aGF0J3MgbW9zdCBwcm9iYWJseSBub3QgaW5zaWRlIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAgICAgICAgY2FuZGlkYXRlcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihsaW5lcykpOgorICAgICAgICAgICAgbWF0Y2ggPSBwYXQubWF0Y2gobGluZXNbaV0pCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICAjIGlmIGl0J3MgYXQgdG9wbGV2ZWwsIGl0J3MgYWxyZWFkeSB0aGUgYmVzdCBvbmUKKyAgICAgICAgICAgICAgICBpZiBsaW5lc1tpXVswXSA9PSAnYyc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lcywgaQorICAgICAgICAgICAgICAgICMgZWxzZSBhZGQgd2hpdGVzcGFjZSB0byBjYW5kaWRhdGUgbGlzdAorICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYXBwZW5kKChtYXRjaC5ncm91cCgxKSwgaSkpCisgICAgICAgIGlmIGNhbmRpZGF0ZXM6CisgICAgICAgICAgICAjIHRoaXMgd2lsbCBzb3J0IGJ5IHdoaXRlc3BhY2UsIGFuZCBieSBsaW5lIG51bWJlciwKKyAgICAgICAgICAgICMgbGVzcyB3aGl0ZXNwYWNlIGZpcnN0CisgICAgICAgICAgICBjYW5kaWRhdGVzLnNvcnQoKQorICAgICAgICAgICAgcmV0dXJuIGxpbmVzLCBjYW5kaWRhdGVzWzBdWzFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdjb3VsZCBub3QgZmluZCBjbGFzcyBkZWZpbml0aW9uJykKKworICAgIGlmIGlzbWV0aG9kKG9iamVjdCk6CisgICAgICAgIG9iamVjdCA9IG9iamVjdC5pbV9mdW5jCisgICAgaWYgaXNmdW5jdGlvbihvYmplY3QpOgorICAgICAgICBvYmplY3QgPSBvYmplY3QuZnVuY19jb2RlCisgICAgaWYgaXN0cmFjZWJhY2sob2JqZWN0KToKKyAgICAgICAgb2JqZWN0ID0gb2JqZWN0LnRiX2ZyYW1lCisgICAgaWYgaXNmcmFtZShvYmplY3QpOgorICAgICAgICBvYmplY3QgPSBvYmplY3QuZl9jb2RlCisgICAgaWYgaXNjb2RlKG9iamVjdCk6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9iamVjdCwgJ2NvX2ZpcnN0bGluZW5vJyk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdjb3VsZCBub3QgZmluZCBmdW5jdGlvbiBkZWZpbml0aW9uJykKKyAgICAgICAgbG51bSA9IG9iamVjdC5jb19maXJzdGxpbmVubyAtIDEKKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZShyJ14oXHMqZGVmXHMpfCguKig/PCFcdylsYW1iZGEoOnxccykpfF4oXHMqQCknKQorICAgICAgICB3aGlsZSBsbnVtID4gMDoKKyAgICAgICAgICAgIGlmIHBhdC5tYXRjaChsaW5lc1tsbnVtXSk6IGJyZWFrCisgICAgICAgICAgICBsbnVtID0gbG51bSAtIDEKKyAgICAgICAgcmV0dXJuIGxpbmVzLCBsbnVtCisgICAgcmFpc2UgSU9FcnJvcignY291bGQgbm90IGZpbmQgY29kZSBvYmplY3QnKQorCitkZWYgZ2V0Y29tbWVudHMob2JqZWN0KToKKyAgICAiIiJHZXQgbGluZXMgb2YgY29tbWVudHMgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIGFuIG9iamVjdCdzIHNvdXJjZSBjb2RlLgorCisgICAgUmV0dXJucyBOb25lIHdoZW4gc291cmNlIGNhbid0IGJlIGZvdW5kLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgbGluZXMsIGxudW0gPSBmaW5kc291cmNlKG9iamVjdCkKKyAgICBleGNlcHQgKElPRXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBpZiBpc21vZHVsZShvYmplY3QpOgorICAgICAgICAjIExvb2sgZm9yIGEgY29tbWVudCBibG9jayBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLgorICAgICAgICBzdGFydCA9IDAKKyAgICAgICAgaWYgbGluZXMgYW5kIGxpbmVzWzBdWzoyXSA9PSAnIyEnOiBzdGFydCA9IDEKKyAgICAgICAgd2hpbGUgc3RhcnQgPCBsZW4obGluZXMpIGFuZCBzdHJpbmcuc3RyaXAobGluZXNbc3RhcnRdKSBpbiAoJycsICcjJyk6CisgICAgICAgICAgICBzdGFydCA9IHN0YXJ0ICsgMQorICAgICAgICBpZiBzdGFydCA8IGxlbihsaW5lcykgYW5kIGxpbmVzW3N0YXJ0XVs6MV0gPT0gJyMnOgorICAgICAgICAgICAgY29tbWVudHMgPSBbXQorICAgICAgICAgICAgZW5kID0gc3RhcnQKKyAgICAgICAgICAgIHdoaWxlIGVuZCA8IGxlbihsaW5lcykgYW5kIGxpbmVzW2VuZF1bOjFdID09ICcjJzoKKyAgICAgICAgICAgICAgICBjb21tZW50cy5hcHBlbmQoc3RyaW5nLmV4cGFuZHRhYnMobGluZXNbZW5kXSkpCisgICAgICAgICAgICAgICAgZW5kID0gZW5kICsgMQorICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5qb2luKGNvbW1lbnRzLCAnJykKKworICAgICMgTG9vayBmb3IgYSBwcmVjZWRpbmcgYmxvY2sgb2YgY29tbWVudHMgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24uCisgICAgZWxpZiBsbnVtID4gMDoKKyAgICAgICAgaW5kZW50ID0gaW5kZW50c2l6ZShsaW5lc1tsbnVtXSkKKyAgICAgICAgZW5kID0gbG51bSAtIDEKKyAgICAgICAgaWYgZW5kID49IDAgYW5kIHN0cmluZy5sc3RyaXAobGluZXNbZW5kXSlbOjFdID09ICcjJyBhbmQgXAorICAgICAgICAgICAgaW5kZW50c2l6ZShsaW5lc1tlbmRdKSA9PSBpbmRlbnQ6CisgICAgICAgICAgICBjb21tZW50cyA9IFtzdHJpbmcubHN0cmlwKHN0cmluZy5leHBhbmR0YWJzKGxpbmVzW2VuZF0pKV0KKyAgICAgICAgICAgIGlmIGVuZCA+IDA6CisgICAgICAgICAgICAgICAgZW5kID0gZW5kIC0gMQorICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdHJpbmcubHN0cmlwKHN0cmluZy5leHBhbmR0YWJzKGxpbmVzW2VuZF0pKQorICAgICAgICAgICAgICAgIHdoaWxlIGNvbW1lbnRbOjFdID09ICcjJyBhbmQgaW5kZW50c2l6ZShsaW5lc1tlbmRdKSA9PSBpbmRlbnQ6CisgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzWzowXSA9IFtjb21tZW50XQorICAgICAgICAgICAgICAgICAgICBlbmQgPSBlbmQgLSAxCisgICAgICAgICAgICAgICAgICAgIGlmIGVuZCA8IDA6IGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBzdHJpbmcubHN0cmlwKHN0cmluZy5leHBhbmR0YWJzKGxpbmVzW2VuZF0pKQorICAgICAgICAgICAgd2hpbGUgY29tbWVudHMgYW5kIHN0cmluZy5zdHJpcChjb21tZW50c1swXSkgPT0gJyMnOgorICAgICAgICAgICAgICAgIGNvbW1lbnRzWzoxXSA9IFtdCisgICAgICAgICAgICB3aGlsZSBjb21tZW50cyBhbmQgc3RyaW5nLnN0cmlwKGNvbW1lbnRzWy0xXSkgPT0gJyMnOgorICAgICAgICAgICAgICAgIGNvbW1lbnRzWy0xOl0gPSBbXQorICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5qb2luKGNvbW1lbnRzLCAnJykKKworY2xhc3MgRW5kT2ZCbG9jayhFeGNlcHRpb24pOiBwYXNzCisKK2NsYXNzIEJsb2NrRmluZGVyOgorICAgICIiIlByb3ZpZGUgYSB0b2tlbmVhdGVyKCkgbWV0aG9kIHRvIGRldGVjdCB0aGUgZW5kIG9mIGEgY29kZSBibG9jay4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuaW5kZW50ID0gMAorICAgICAgICBzZWxmLmlzbGFtYmRhID0gRmFsc2UKKyAgICAgICAgc2VsZi5zdGFydGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5wYXNzbGluZSA9IEZhbHNlCisgICAgICAgIHNlbGYubGFzdCA9IDEKKworICAgIGRlZiB0b2tlbmVhdGVyKHNlbGYsIHR5cGUsIHRva2VuLCBzcm93X3Njb2wsIGVyb3dfZWNvbCwgbGluZSk6CisgICAgICAgIHNyb3csIHNjb2wgPSBzcm93X3Njb2wKKyAgICAgICAgZXJvdywgZWNvbCA9IGVyb3dfZWNvbAorICAgICAgICBpZiBub3Qgc2VsZi5zdGFydGVkOgorICAgICAgICAgICAgIyBsb29rIGZvciB0aGUgZmlyc3QgImRlZiIsICJjbGFzcyIgb3IgImxhbWJkYSIKKyAgICAgICAgICAgIGlmIHRva2VuIGluICgiZGVmIiwgImNsYXNzIiwgImxhbWJkYSIpOgorICAgICAgICAgICAgICAgIGlmIHRva2VuID09ICJsYW1iZGEiOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmlzbGFtYmRhID0gVHJ1ZQorICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRlZCA9IFRydWUKKyAgICAgICAgICAgIHNlbGYucGFzc2xpbmUgPSBUcnVlICAgICMgc2tpcCB0byB0aGUgZW5kIG9mIHRoZSBsaW5lCisgICAgICAgIGVsaWYgdHlwZSA9PSB0b2tlbml6ZS5ORVdMSU5FOgorICAgICAgICAgICAgc2VsZi5wYXNzbGluZSA9IEZhbHNlICAgIyBzdG9wIHNraXBwaW5nIHdoZW4gYSBORVdMSU5FIGlzIHNlZW4KKyAgICAgICAgICAgIHNlbGYubGFzdCA9IHNyb3cKKyAgICAgICAgICAgIGlmIHNlbGYuaXNsYW1iZGE6ICAgICAgICMgbGFtYmRhcyBhbHdheXMgZW5kIGF0IHRoZSBmaXJzdCBORVdMSU5FCisgICAgICAgICAgICAgICAgcmFpc2UgRW5kT2ZCbG9jaworICAgICAgICBlbGlmIHNlbGYucGFzc2xpbmU6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsaWYgdHlwZSA9PSB0b2tlbml6ZS5JTkRFTlQ6CisgICAgICAgICAgICBzZWxmLmluZGVudCA9IHNlbGYuaW5kZW50ICsgMQorICAgICAgICAgICAgc2VsZi5wYXNzbGluZSA9IFRydWUKKyAgICAgICAgZWxpZiB0eXBlID09IHRva2VuaXplLkRFREVOVDoKKyAgICAgICAgICAgIHNlbGYuaW5kZW50ID0gc2VsZi5pbmRlbnQgLSAxCisgICAgICAgICAgICAjIHRoZSBlbmQgb2YgbWF0Y2hpbmcgaW5kZW50L2RlZGVudCBwYWlycyBlbmQgYSBibG9jaworICAgICAgICAgICAgIyAobm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBmb3IgImRlZiIvImNsYXNzIiBibG9ja3MsCisgICAgICAgICAgICAjICBub3QgZS5nLiBmb3IgImlmOiBlbHNlOiIgb3IgInRyeTogZmluYWxseToiIGJsb2NrcykKKyAgICAgICAgICAgIGlmIHNlbGYuaW5kZW50IDw9IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgRW5kT2ZCbG9jaworICAgICAgICBlbGlmIHNlbGYuaW5kZW50ID09IDAgYW5kIHR5cGUgbm90IGluICh0b2tlbml6ZS5DT01NRU5ULCB0b2tlbml6ZS5OTCk6CisgICAgICAgICAgICAjIGFueSBvdGhlciB0b2tlbiBvbiB0aGUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbCBlbmQgdGhlIHByZXZpb3VzCisgICAgICAgICAgICAjIGJsb2NrIGFzIHdlbGwsIGV4Y2VwdCB0aGUgcHNldWRvLXRva2VucyBDT01NRU5UIGFuZCBOTC4KKyAgICAgICAgICAgIHJhaXNlIEVuZE9mQmxvY2sKKworZGVmIGdldGJsb2NrKGxpbmVzKToKKyAgICAiIiJFeHRyYWN0IHRoZSBibG9jayBvZiBjb2RlIGF0IHRoZSB0b3Agb2YgdGhlIGdpdmVuIGxpc3Qgb2YgbGluZXMuIiIiCisgICAgYmxvY2tmaW5kZXIgPSBCbG9ja0ZpbmRlcigpCisgICAgdHJ5OgorICAgICAgICB0b2tlbml6ZS50b2tlbml6ZShpdGVyKGxpbmVzKS5uZXh0LCBibG9ja2ZpbmRlci50b2tlbmVhdGVyKQorICAgIGV4Y2VwdCAoRW5kT2ZCbG9jaywgSW5kZW50YXRpb25FcnJvcik6CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gbGluZXNbOmJsb2NrZmluZGVyLmxhc3RdCisKK2RlZiBnZXRzb3VyY2VsaW5lcyhvYmplY3QpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc291cmNlIGxpbmVzIGFuZCBzdGFydGluZyBsaW5lIG51bWJlciBmb3IgYW4gb2JqZWN0LgorCisgICAgVGhlIGFyZ3VtZW50IG1heSBiZSBhIG1vZHVsZSwgY2xhc3MsIG1ldGhvZCwgZnVuY3Rpb24sIHRyYWNlYmFjaywgZnJhbWUsCisgICAgb3IgY29kZSBvYmplY3QuICBUaGUgc291cmNlIGNvZGUgaXMgcmV0dXJuZWQgYXMgYSBsaXN0IG9mIHRoZSBsaW5lcworICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9iamVjdCBhbmQgdGhlIGxpbmUgbnVtYmVyIGluZGljYXRlcyB3aGVyZSBpbiB0aGUKKyAgICBvcmlnaW5hbCBzb3VyY2UgZmlsZSB0aGUgZmlyc3QgbGluZSBvZiBjb2RlIHdhcyBmb3VuZC4gIEFuIElPRXJyb3IgaXMKKyAgICByYWlzZWQgaWYgdGhlIHNvdXJjZSBjb2RlIGNhbm5vdCBiZSByZXRyaWV2ZWQuIiIiCisgICAgbGluZXMsIGxudW0gPSBmaW5kc291cmNlKG9iamVjdCkKKworICAgIGlmIGlzbW9kdWxlKG9iamVjdCk6IHJldHVybiBsaW5lcywgMAorICAgIGVsc2U6IHJldHVybiBnZXRibG9jayhsaW5lc1tsbnVtOl0pLCBsbnVtICsgMQorCitkZWYgZ2V0c291cmNlKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRoZSB0ZXh0IG9mIHRoZSBzb3VyY2UgY29kZSBmb3IgYW4gb2JqZWN0LgorCisgICAgVGhlIGFyZ3VtZW50IG1heSBiZSBhIG1vZHVsZSwgY2xhc3MsIG1ldGhvZCwgZnVuY3Rpb24sIHRyYWNlYmFjaywgZnJhbWUsCisgICAgb3IgY29kZSBvYmplY3QuICBUaGUgc291cmNlIGNvZGUgaXMgcmV0dXJuZWQgYXMgYSBzaW5nbGUgc3RyaW5nLiAgQW4KKyAgICBJT0Vycm9yIGlzIHJhaXNlZCBpZiB0aGUgc291cmNlIGNvZGUgY2Fubm90IGJlIHJldHJpZXZlZC4iIiIKKyAgICBsaW5lcywgbG51bSA9IGdldHNvdXJjZWxpbmVzKG9iamVjdCkKKyAgICByZXR1cm4gc3RyaW5nLmpvaW4obGluZXMsICcnKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjbGFzcyB0cmVlIGV4dHJhY3Rpb24KK2RlZiB3YWxrdHJlZShjbGFzc2VzLCBjaGlsZHJlbiwgcGFyZW50KToKKyAgICAiIiJSZWN1cnNpdmUgaGVscGVyIGZ1bmN0aW9uIGZvciBnZXRjbGFzc3RyZWUoKS4iIiIKKyAgICByZXN1bHRzID0gW10KKyAgICBjbGFzc2VzLnNvcnQoa2V5PWF0dHJnZXR0ZXIoJ19fbW9kdWxlX18nLCAnX19uYW1lX18nKSkKKyAgICBmb3IgYyBpbiBjbGFzc2VzOgorICAgICAgICByZXN1bHRzLmFwcGVuZCgoYywgYy5fX2Jhc2VzX18pKQorICAgICAgICBpZiBjIGluIGNoaWxkcmVuOgorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQod2Fsa3RyZWUoY2hpbGRyZW5bY10sIGNoaWxkcmVuLCBjKSkKKyAgICByZXR1cm4gcmVzdWx0cworCitkZWYgZ2V0Y2xhc3N0cmVlKGNsYXNzZXMsIHVuaXF1ZT0wKToKKyAgICAiIiJBcnJhbmdlIHRoZSBnaXZlbiBsaXN0IG9mIGNsYXNzZXMgaW50byBhIGhpZXJhcmNoeSBvZiBuZXN0ZWQgbGlzdHMuCisKKyAgICBXaGVyZSBhIG5lc3RlZCBsaXN0IGFwcGVhcnMsIGl0IGNvbnRhaW5zIGNsYXNzZXMgZGVyaXZlZCBmcm9tIHRoZSBjbGFzcworICAgIHdob3NlIGVudHJ5IGltbWVkaWF0ZWx5IHByZWNlZGVzIHRoZSBsaXN0LiAgRWFjaCBlbnRyeSBpcyBhIDItdHVwbGUKKyAgICBjb250YWluaW5nIGEgY2xhc3MgYW5kIGEgdHVwbGUgb2YgaXRzIGJhc2UgY2xhc3Nlcy4gIElmIHRoZSAndW5pcXVlJworICAgIGFyZ3VtZW50IGlzIHRydWUsIGV4YWN0bHkgb25lIGVudHJ5IGFwcGVhcnMgaW4gdGhlIHJldHVybmVkIHN0cnVjdHVyZQorICAgIGZvciBlYWNoIGNsYXNzIGluIHRoZSBnaXZlbiBsaXN0LiAgT3RoZXJ3aXNlLCBjbGFzc2VzIHVzaW5nIG11bHRpcGxlCisgICAgaW5oZXJpdGFuY2UgYW5kIHRoZWlyIGRlc2NlbmRhbnRzIHdpbGwgYXBwZWFyIG11bHRpcGxlIHRpbWVzLiIiIgorICAgIGNoaWxkcmVuID0ge30KKyAgICByb290cyA9IFtdCisgICAgZm9yIGMgaW4gY2xhc3NlczoKKyAgICAgICAgaWYgYy5fX2Jhc2VzX186CisgICAgICAgICAgICBmb3IgcGFyZW50IGluIGMuX19iYXNlc19fOgorICAgICAgICAgICAgICAgIGlmIG5vdCBwYXJlbnQgaW4gY2hpbGRyZW46CisgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuW3BhcmVudF0gPSBbXQorICAgICAgICAgICAgICAgIGNoaWxkcmVuW3BhcmVudF0uYXBwZW5kKGMpCisgICAgICAgICAgICAgICAgaWYgdW5pcXVlIGFuZCBwYXJlbnQgaW4gY2xhc3NlczogYnJlYWsKKyAgICAgICAgZWxpZiBjIG5vdCBpbiByb290czoKKyAgICAgICAgICAgIHJvb3RzLmFwcGVuZChjKQorICAgIGZvciBwYXJlbnQgaW4gY2hpbGRyZW46CisgICAgICAgIGlmIHBhcmVudCBub3QgaW4gY2xhc3NlczoKKyAgICAgICAgICAgIHJvb3RzLmFwcGVuZChwYXJlbnQpCisgICAgcmV0dXJuIHdhbGt0cmVlKHJvb3RzLCBjaGlsZHJlbiwgTm9uZSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXJndW1lbnQgbGlzdCBleHRyYWN0aW9uCitBcmd1bWVudHMgPSBuYW1lZHR1cGxlKCdBcmd1bWVudHMnLCAnYXJncyB2YXJhcmdzIGtleXdvcmRzJykKKworZGVmIGdldGFyZ3MoY28pOgorICAgICIiIkdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXJndW1lbnRzIGFjY2VwdGVkIGJ5IGEgY29kZSBvYmplY3QuCisKKyAgICBUaHJlZSB0aGluZ3MgYXJlIHJldHVybmVkOiAoYXJncywgdmFyYXJncywgdmFya3cpLCB3aGVyZSAnYXJncycgaXMKKyAgICBhIGxpc3Qgb2YgYXJndW1lbnQgbmFtZXMgKHBvc3NpYmx5IGNvbnRhaW5pbmcgbmVzdGVkIGxpc3RzKSwgYW5kCisgICAgJ3ZhcmFyZ3MnIGFuZCAndmFya3cnIGFyZSB0aGUgbmFtZXMgb2YgdGhlICogYW5kICoqIGFyZ3VtZW50cyBvciBOb25lLiIiIgorCisgICAgaWYgbm90IGlzY29kZShjbyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigneyFyfSBpcyBub3QgYSBjb2RlIG9iamVjdCcuZm9ybWF0KGNvKSkKKworICAgIG5hcmdzID0gY28uY29fYXJnY291bnQKKyAgICBuYW1lcyA9IGNvLmNvX3Zhcm5hbWVzCisgICAgYXJncyA9IGxpc3QobmFtZXNbOm5hcmdzXSkKKyAgICBzdGVwID0gMAorCisgICAgIyBUaGUgZm9sbG93aW5nIGFjcm9iYXRpY3MgYXJlIGZvciBhbm9ueW1vdXMgKHR1cGxlKSBhcmd1bWVudHMuCisgICAgZm9yIGkgaW4gcmFuZ2UobmFyZ3MpOgorICAgICAgICBpZiBhcmdzW2ldWzoxXSBpbiAoJycsICcuJyk6CisgICAgICAgICAgICBzdGFjaywgcmVtYWluLCBjb3VudCA9IFtdLCBbXSwgW10KKyAgICAgICAgICAgIHdoaWxlIHN0ZXAgPCBsZW4oY28uY29fY29kZSk6CisgICAgICAgICAgICAgICAgb3AgPSBvcmQoY28uY29fY29kZVtzdGVwXSkKKyAgICAgICAgICAgICAgICBzdGVwID0gc3RlcCArIDEKKyAgICAgICAgICAgICAgICBpZiBvcCA+PSBkaXMuSEFWRV9BUkdVTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgb3BuYW1lID0gZGlzLm9wbmFtZVtvcF0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBvcmQoY28uY29fY29kZVtzdGVwXSkgKyBvcmQoY28uY29fY29kZVtzdGVwKzFdKSoyNTYKKyAgICAgICAgICAgICAgICAgICAgc3RlcCA9IHN0ZXAgKyAyCisgICAgICAgICAgICAgICAgICAgIGlmIG9wbmFtZSBpbiAoJ1VOUEFDS19UVVBMRScsICdVTlBBQ0tfU0VRVUVOQ0UnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbi5hcHBlbmQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudC5hcHBlbmQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgb3BuYW1lID09ICdTVE9SRV9GQVNUJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLmFwcGVuZChuYW1lc1t2YWx1ZV0pCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciBzdWJsaXN0cyBvZiBsZW5ndGggMTogZGVmIGZvbygoYmFyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZG9lc24ndCBnZW5lcmF0ZSB0aGUgVU5QQUNLX1RVUExFIGJ5dGVjb2RlLCBzbyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgIyBgcmVtYWluYCBpcyBlbXB0eSBoZXJlLCB3ZSBoYXZlIHN1Y2ggYSBzdWJsaXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlbWFpbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1swXSA9IFtzdGFja1swXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5bLTFdID0gcmVtYWluWy0xXSAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSByZW1haW5bLTFdID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbi5wb3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gY291bnQucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tbLXNpemU6XSA9IFtzdGFja1stc2l6ZTpdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVtYWluOiBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5bLTFdID0gcmVtYWluWy0xXSAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVtYWluOiBicmVhaworICAgICAgICAgICAgYXJnc1tpXSA9IHN0YWNrWzBdCisKKyAgICB2YXJhcmdzID0gTm9uZQorICAgIGlmIGNvLmNvX2ZsYWdzICYgQ09fVkFSQVJHUzoKKyAgICAgICAgdmFyYXJncyA9IGNvLmNvX3Zhcm5hbWVzW25hcmdzXQorICAgICAgICBuYXJncyA9IG5hcmdzICsgMQorICAgIHZhcmt3ID0gTm9uZQorICAgIGlmIGNvLmNvX2ZsYWdzICYgQ09fVkFSS0VZV09SRFM6CisgICAgICAgIHZhcmt3ID0gY28uY29fdmFybmFtZXNbbmFyZ3NdCisgICAgcmV0dXJuIEFyZ3VtZW50cyhhcmdzLCB2YXJhcmdzLCB2YXJrdykKKworQXJnU3BlYyA9IG5hbWVkdHVwbGUoJ0FyZ1NwZWMnLCAnYXJncyB2YXJhcmdzIGtleXdvcmRzIGRlZmF1bHRzJykKKworZGVmIGdldGFyZ3NwZWMoZnVuYyk6CisgICAgIiIiR2V0IHRoZSBuYW1lcyBhbmQgZGVmYXVsdCB2YWx1ZXMgb2YgYSBmdW5jdGlvbidzIGFyZ3VtZW50cy4KKworICAgIEEgdHVwbGUgb2YgZm91ciB0aGluZ3MgaXMgcmV0dXJuZWQ6IChhcmdzLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMpLgorICAgICdhcmdzJyBpcyBhIGxpc3Qgb2YgdGhlIGFyZ3VtZW50IG5hbWVzIChpdCBtYXkgY29udGFpbiBuZXN0ZWQgbGlzdHMpLgorICAgICd2YXJhcmdzJyBhbmQgJ3Zhcmt3JyBhcmUgdGhlIG5hbWVzIG9mIHRoZSAqIGFuZCAqKiBhcmd1bWVudHMgb3IgTm9uZS4KKyAgICAnZGVmYXVsdHMnIGlzIGFuIG4tdHVwbGUgb2YgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHRoZSBsYXN0IG4gYXJndW1lbnRzLgorICAgICIiIgorCisgICAgaWYgaXNtZXRob2QoZnVuYyk6CisgICAgICAgIGZ1bmMgPSBmdW5jLmltX2Z1bmMKKyAgICBpZiBub3QgaXNmdW5jdGlvbihmdW5jKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd7IXJ9IGlzIG5vdCBhIFB5dGhvbiBmdW5jdGlvbicuZm9ybWF0KGZ1bmMpKQorICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3ID0gZ2V0YXJncyhmdW5jLmZ1bmNfY29kZSkKKyAgICByZXR1cm4gQXJnU3BlYyhhcmdzLCB2YXJhcmdzLCB2YXJrdywgZnVuYy5mdW5jX2RlZmF1bHRzKQorCitBcmdJbmZvID0gbmFtZWR0dXBsZSgnQXJnSW5mbycsICdhcmdzIHZhcmFyZ3Mga2V5d29yZHMgbG9jYWxzJykKKworZGVmIGdldGFyZ3ZhbHVlcyhmcmFtZSk6CisgICAgIiIiR2V0IGluZm9ybWF0aW9uIGFib3V0IGFyZ3VtZW50cyBwYXNzZWQgaW50byBhIHBhcnRpY3VsYXIgZnJhbWUuCisKKyAgICBBIHR1cGxlIG9mIGZvdXIgdGhpbmdzIGlzIHJldHVybmVkOiAoYXJncywgdmFyYXJncywgdmFya3csIGxvY2FscykuCisgICAgJ2FyZ3MnIGlzIGEgbGlzdCBvZiB0aGUgYXJndW1lbnQgbmFtZXMgKGl0IG1heSBjb250YWluIG5lc3RlZCBsaXN0cykuCisgICAgJ3ZhcmFyZ3MnIGFuZCAndmFya3cnIGFyZSB0aGUgbmFtZXMgb2YgdGhlICogYW5kICoqIGFyZ3VtZW50cyBvciBOb25lLgorICAgICdsb2NhbHMnIGlzIHRoZSBsb2NhbHMgZGljdGlvbmFyeSBvZiB0aGUgZ2l2ZW4gZnJhbWUuIiIiCisgICAgYXJncywgdmFyYXJncywgdmFya3cgPSBnZXRhcmdzKGZyYW1lLmZfY29kZSkKKyAgICByZXR1cm4gQXJnSW5mbyhhcmdzLCB2YXJhcmdzLCB2YXJrdywgZnJhbWUuZl9sb2NhbHMpCisKK2RlZiBqb2luc2VxKHNlcSk6CisgICAgaWYgbGVuKHNlcSkgPT0gMToKKyAgICAgICAgcmV0dXJuICcoJyArIHNlcVswXSArICcsKScKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gJygnICsgc3RyaW5nLmpvaW4oc2VxLCAnLCAnKSArICcpJworCitkZWYgc3Ryc2VxKG9iamVjdCwgY29udmVydCwgam9pbj1qb2luc2VxKToKKyAgICAiIiJSZWN1cnNpdmVseSB3YWxrIGEgc2VxdWVuY2UsIHN0cmluZ2lmeWluZyBlYWNoIGVsZW1lbnQuIiIiCisgICAgaWYgdHlwZShvYmplY3QpIGluIChsaXN0LCB0dXBsZSk6CisgICAgICAgIHJldHVybiBqb2luKG1hcChsYW1iZGEgbywgYz1jb252ZXJ0LCBqPWpvaW46IHN0cnNlcShvLCBjLCBqKSwgb2JqZWN0KSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gY29udmVydChvYmplY3QpCisKK2RlZiBmb3JtYXRhcmdzcGVjKGFyZ3MsIHZhcmFyZ3M9Tm9uZSwgdmFya3c9Tm9uZSwgZGVmYXVsdHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIGZvcm1hdGFyZz1zdHIsCisgICAgICAgICAgICAgICAgICBmb3JtYXR2YXJhcmdzPWxhbWJkYSBuYW1lOiAnKicgKyBuYW1lLAorICAgICAgICAgICAgICAgICAgZm9ybWF0dmFya3c9bGFtYmRhIG5hbWU6ICcqKicgKyBuYW1lLAorICAgICAgICAgICAgICAgICAgZm9ybWF0dmFsdWU9bGFtYmRhIHZhbHVlOiAnPScgKyByZXByKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgIGpvaW49am9pbnNlcSk6CisgICAgIiIiRm9ybWF0IGFuIGFyZ3VtZW50IHNwZWMgZnJvbSB0aGUgNCB2YWx1ZXMgcmV0dXJuZWQgYnkgZ2V0YXJnc3BlYy4KKworICAgIFRoZSBmaXJzdCBmb3VyIGFyZ3VtZW50cyBhcmUgKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cykuICBUaGUKKyAgICBvdGhlciBmb3VyIGFyZ3VtZW50cyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgb3B0aW9uYWwgZm9ybWF0dGluZyBmdW5jdGlvbnMKKyAgICB0aGF0IGFyZSBjYWxsZWQgdG8gdHVybiBuYW1lcyBhbmQgdmFsdWVzIGludG8gc3RyaW5ncy4gIFRoZSBuaW50aAorICAgIGFyZ3VtZW50IGlzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGZvcm1hdCB0aGUgc2VxdWVuY2Ugb2YgYXJndW1lbnRzLiIiIgorICAgIHNwZWNzID0gW10KKyAgICBpZiBkZWZhdWx0czoKKyAgICAgICAgZmlyc3RkZWZhdWx0ID0gbGVuKGFyZ3MpIC0gbGVuKGRlZmF1bHRzKQorICAgIGZvciBpLCBhcmcgaW4gZW51bWVyYXRlKGFyZ3MpOgorICAgICAgICBzcGVjID0gc3Ryc2VxKGFyZywgZm9ybWF0YXJnLCBqb2luKQorICAgICAgICBpZiBkZWZhdWx0cyBhbmQgaSA+PSBmaXJzdGRlZmF1bHQ6CisgICAgICAgICAgICBzcGVjID0gc3BlYyArIGZvcm1hdHZhbHVlKGRlZmF1bHRzW2kgLSBmaXJzdGRlZmF1bHRdKQorICAgICAgICBzcGVjcy5hcHBlbmQoc3BlYykKKyAgICBpZiB2YXJhcmdzIGlzIG5vdCBOb25lOgorICAgICAgICBzcGVjcy5hcHBlbmQoZm9ybWF0dmFyYXJncyh2YXJhcmdzKSkKKyAgICBpZiB2YXJrdyBpcyBub3QgTm9uZToKKyAgICAgICAgc3BlY3MuYXBwZW5kKGZvcm1hdHZhcmt3KHZhcmt3KSkKKyAgICByZXR1cm4gJygnICsgc3RyaW5nLmpvaW4oc3BlY3MsICcsICcpICsgJyknCisKK2RlZiBmb3JtYXRhcmd2YWx1ZXMoYXJncywgdmFyYXJncywgdmFya3csIGxvY2FscywKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0YXJnPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmFyYXJncz1sYW1iZGEgbmFtZTogJyonICsgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmFya3c9bGFtYmRhIG5hbWU6ICcqKicgKyBuYW1lLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXR2YWx1ZT1sYW1iZGEgdmFsdWU6ICc9JyArIHJlcHIodmFsdWUpLAorICAgICAgICAgICAgICAgICAgICBqb2luPWpvaW5zZXEpOgorICAgICIiIkZvcm1hdCBhbiBhcmd1bWVudCBzcGVjIGZyb20gdGhlIDQgdmFsdWVzIHJldHVybmVkIGJ5IGdldGFyZ3ZhbHVlcy4KKworICAgIFRoZSBmaXJzdCBmb3VyIGFyZ3VtZW50cyBhcmUgKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBsb2NhbHMpLiAgVGhlCisgICAgbmV4dCBmb3VyIGFyZ3VtZW50cyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgb3B0aW9uYWwgZm9ybWF0dGluZyBmdW5jdGlvbnMKKyAgICB0aGF0IGFyZSBjYWxsZWQgdG8gdHVybiBuYW1lcyBhbmQgdmFsdWVzIGludG8gc3RyaW5ncy4gIFRoZSBuaW50aAorICAgIGFyZ3VtZW50IGlzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRvIGZvcm1hdCB0aGUgc2VxdWVuY2Ugb2YgYXJndW1lbnRzLiIiIgorICAgIGRlZiBjb252ZXJ0KG5hbWUsIGxvY2Fscz1sb2NhbHMsCisgICAgICAgICAgICAgICAgZm9ybWF0YXJnPWZvcm1hdGFyZywgZm9ybWF0dmFsdWU9Zm9ybWF0dmFsdWUpOgorICAgICAgICByZXR1cm4gZm9ybWF0YXJnKG5hbWUpICsgZm9ybWF0dmFsdWUobG9jYWxzW25hbWVdKQorICAgIHNwZWNzID0gW10KKyAgICBmb3IgaSBpbiByYW5nZShsZW4oYXJncykpOgorICAgICAgICBzcGVjcy5hcHBlbmQoc3Ryc2VxKGFyZ3NbaV0sIGNvbnZlcnQsIGpvaW4pKQorICAgIGlmIHZhcmFyZ3M6CisgICAgICAgIHNwZWNzLmFwcGVuZChmb3JtYXR2YXJhcmdzKHZhcmFyZ3MpICsgZm9ybWF0dmFsdWUobG9jYWxzW3ZhcmFyZ3NdKSkKKyAgICBpZiB2YXJrdzoKKyAgICAgICAgc3BlY3MuYXBwZW5kKGZvcm1hdHZhcmt3KHZhcmt3KSArIGZvcm1hdHZhbHVlKGxvY2Fsc1t2YXJrd10pKQorICAgIHJldHVybiAnKCcgKyBzdHJpbmcuam9pbihzcGVjcywgJywgJykgKyAnKScKKworZGVmIGdldGNhbGxhcmdzKGZ1bmMsICpwb3NpdGlvbmFsLCAqKm5hbWVkKToKKyAgICAiIiJHZXQgdGhlIG1hcHBpbmcgb2YgYXJndW1lbnRzIHRvIHZhbHVlcy4KKworICAgIEEgZGljdCBpcyByZXR1cm5lZCwgd2l0aCBrZXlzIHRoZSBmdW5jdGlvbiBhcmd1bWVudCBuYW1lcyAoaW5jbHVkaW5nIHRoZQorICAgIG5hbWVzIG9mIHRoZSAqIGFuZCAqKiBhcmd1bWVudHMsIGlmIGFueSksIGFuZCB2YWx1ZXMgdGhlIHJlc3BlY3RpdmUgYm91bmQKKyAgICB2YWx1ZXMgZnJvbSAncG9zaXRpb25hbCcgYW5kICduYW1lZCcuIiIiCisgICAgYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzID0gZ2V0YXJnc3BlYyhmdW5jKQorICAgIGZfbmFtZSA9IGZ1bmMuX19uYW1lX18KKyAgICBhcmcydmFsdWUgPSB7fQorCisgICAgIyBUaGUgZm9sbG93aW5nIGNsb3N1cmVzIGFyZSBiYXNpY2FsbHkgYmVjYXVzZSBvZiB0dXBsZSBwYXJhbWV0ZXIgdW5wYWNraW5nLgorICAgIGFzc2lnbmVkX3R1cGxlX3BhcmFtcyA9IFtdCisgICAgZGVmIGFzc2lnbihhcmcsIHZhbHVlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIHN0cik6CisgICAgICAgICAgICBhcmcydmFsdWVbYXJnXSA9IHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NpZ25lZF90dXBsZV9wYXJhbXMuYXBwZW5kKGFyZykKKyAgICAgICAgICAgIHZhbHVlID0gaXRlcih2YWx1ZSkKKyAgICAgICAgICAgIGZvciBpLCBzdWJhcmcgaW4gZW51bWVyYXRlKGFyZyk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzdWJ2YWx1ZSA9IG5leHQodmFsdWUpCisgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ25lZWQgbW9yZSB0aGFuICVkICVzIHRvIHVucGFjaycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLCAndmFsdWVzJyBpZiBpID4gMSBlbHNlICd2YWx1ZScpKQorICAgICAgICAgICAgICAgIGFzc2lnbihzdWJhcmcsc3VidmFsdWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbmV4dCh2YWx1ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndG9vIG1hbnkgdmFsdWVzIHRvIHVucGFjaycpCisgICAgZGVmIGlzX2Fzc2lnbmVkKGFyZyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLHN0cik6CisgICAgICAgICAgICByZXR1cm4gYXJnIGluIGFyZzJ2YWx1ZQorICAgICAgICByZXR1cm4gYXJnIGluIGFzc2lnbmVkX3R1cGxlX3BhcmFtcworICAgIGlmIGlzbWV0aG9kKGZ1bmMpIGFuZCBmdW5jLmltX3NlbGYgaXMgbm90IE5vbmU6CisgICAgICAgICMgaW1wbGljaXQgJ3NlbGYnIChvciAnY2xzJyBmb3IgY2xhc3NtZXRob2RzKSBhcmd1bWVudAorICAgICAgICBwb3NpdGlvbmFsID0gKGZ1bmMuaW1fc2VsZiwpICsgcG9zaXRpb25hbAorICAgIG51bV9wb3MgPSBsZW4ocG9zaXRpb25hbCkKKyAgICBudW1fdG90YWwgPSBudW1fcG9zICsgbGVuKG5hbWVkKQorICAgIG51bV9hcmdzID0gbGVuKGFyZ3MpCisgICAgbnVtX2RlZmF1bHRzID0gbGVuKGRlZmF1bHRzKSBpZiBkZWZhdWx0cyBlbHNlIDAKKyAgICBmb3IgYXJnLCB2YWx1ZSBpbiB6aXAoYXJncywgcG9zaXRpb25hbCk6CisgICAgICAgIGFzc2lnbihhcmcsIHZhbHVlKQorICAgIGlmIHZhcmFyZ3M6CisgICAgICAgIGlmIG51bV9wb3MgPiBudW1fYXJnczoKKyAgICAgICAgICAgIGFzc2lnbih2YXJhcmdzLCBwb3NpdGlvbmFsWy0obnVtX3Bvcy1udW1fYXJncyk6XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2lnbih2YXJhcmdzLCAoKSkKKyAgICBlbGlmIDAgPCBudW1fYXJncyA8IG51bV9wb3M6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXMoKSB0YWtlcyAlcyAlZCAlcyAoJWQgZ2l2ZW4pJyAlICgKKyAgICAgICAgICAgIGZfbmFtZSwgJ2F0IG1vc3QnIGlmIGRlZmF1bHRzIGVsc2UgJ2V4YWN0bHknLCBudW1fYXJncywKKyAgICAgICAgICAgICdhcmd1bWVudHMnIGlmIG51bV9hcmdzID4gMSBlbHNlICdhcmd1bWVudCcsIG51bV90b3RhbCkpCisgICAgZWxpZiBudW1fYXJncyA9PSAwIGFuZCBudW1fdG90YWw6CisgICAgICAgIGlmIHZhcmt3OgorICAgICAgICAgICAgaWYgbnVtX3BvczoKKyAgICAgICAgICAgICAgICAjIFhYWDogV2Ugc2hvdWxkIHVzZSBudW1fcG9zLCBidXQgUHl0aG9uIGFsc28gdXNlcyBudW1fdG90YWw6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclcygpIHRha2VzIGV4YWN0bHkgMCBhcmd1bWVudHMgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKCVkIGdpdmVuKScgJSAoZl9uYW1lLCBudW1fdG90YWwpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclcygpIHRha2VzIG5vIGFyZ3VtZW50cyAoJWQgZ2l2ZW4pJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZfbmFtZSwgbnVtX3RvdGFsKSkKKyAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCBzdHIpIGFuZCBhcmcgaW4gbmFtZWQ6CisgICAgICAgICAgICBpZiBpc19hc3NpZ25lZChhcmcpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiJXMoKSBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50ICclcyciICUgKGZfbmFtZSwgYXJnKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNzaWduKGFyZywgbmFtZWQucG9wKGFyZykpCisgICAgaWYgZGVmYXVsdHM6ICAgICMgZmlsbCBpbiBhbnkgbWlzc2luZyB2YWx1ZXMgd2l0aCB0aGUgZGVmYXVsdHMKKyAgICAgICAgZm9yIGFyZywgdmFsdWUgaW4gemlwKGFyZ3NbLW51bV9kZWZhdWx0czpdLCBkZWZhdWx0cyk6CisgICAgICAgICAgICBpZiBub3QgaXNfYXNzaWduZWQoYXJnKToKKyAgICAgICAgICAgICAgICBhc3NpZ24oYXJnLCB2YWx1ZSkKKyAgICBpZiB2YXJrdzoKKyAgICAgICAgYXNzaWduKHZhcmt3LCBuYW1lZCkKKyAgICBlbGlmIG5hbWVkOgorICAgICAgICB1bmV4cGVjdGVkID0gbmV4dChpdGVyKG5hbWVkKSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh1bmV4cGVjdGVkLCB1bmljb2RlKToKKyAgICAgICAgICAgIHVuZXhwZWN0ZWQgPSB1bmV4cGVjdGVkLmVuY29kZShzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCksICdyZXBsYWNlJykKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcygpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgKGZfbmFtZSwgdW5leHBlY3RlZCkpCisgICAgdW5hc3NpZ25lZCA9IG51bV9hcmdzIC0gbGVuKFthcmcgZm9yIGFyZyBpbiBhcmdzIGlmIGlzX2Fzc2lnbmVkKGFyZyldKQorICAgIGlmIHVuYXNzaWduZWQ6CisgICAgICAgIG51bV9yZXF1aXJlZCA9IG51bV9hcmdzIC0gbnVtX2RlZmF1bHRzCisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignJXMoKSB0YWtlcyAlcyAlZCAlcyAoJWQgZ2l2ZW4pJyAlICgKKyAgICAgICAgICAgIGZfbmFtZSwgJ2F0IGxlYXN0JyBpZiBkZWZhdWx0cyBlbHNlICdleGFjdGx5JywgbnVtX3JlcXVpcmVkLAorICAgICAgICAgICAgJ2FyZ3VtZW50cycgaWYgbnVtX3JlcXVpcmVkID4gMSBlbHNlICdhcmd1bWVudCcsIG51bV90b3RhbCkpCisgICAgcmV0dXJuIGFyZzJ2YWx1ZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0YWNrIGZyYW1lIGV4dHJhY3Rpb24KKworVHJhY2ViYWNrID0gbmFtZWR0dXBsZSgnVHJhY2ViYWNrJywgJ2ZpbGVuYW1lIGxpbmVubyBmdW5jdGlvbiBjb2RlX2NvbnRleHQgaW5kZXgnKQorCitkZWYgZ2V0ZnJhbWVpbmZvKGZyYW1lLCBjb250ZXh0PTEpOgorICAgICIiIkdldCBpbmZvcm1hdGlvbiBhYm91dCBhIGZyYW1lIG9yIHRyYWNlYmFjayBvYmplY3QuCisKKyAgICBBIHR1cGxlIG9mIGZpdmUgdGhpbmdzIGlzIHJldHVybmVkOiB0aGUgZmlsZW5hbWUsIHRoZSBsaW5lIG51bWJlciBvZgorICAgIHRoZSBjdXJyZW50IGxpbmUsIHRoZSBmdW5jdGlvbiBuYW1lLCBhIGxpc3Qgb2YgbGluZXMgb2YgY29udGV4dCBmcm9tCisgICAgdGhlIHNvdXJjZSBjb2RlLCBhbmQgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGxpbmUgd2l0aGluIHRoYXQgbGlzdC4KKyAgICBUaGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGxpbmVzIG9mIGNvbnRleHQKKyAgICB0byByZXR1cm4sIHdoaWNoIGFyZSBjZW50ZXJlZCBhcm91bmQgdGhlIGN1cnJlbnQgbGluZS4iIiIKKyAgICBpZiBpc3RyYWNlYmFjayhmcmFtZSk6CisgICAgICAgIGxpbmVubyA9IGZyYW1lLnRiX2xpbmVubworICAgICAgICBmcmFtZSA9IGZyYW1lLnRiX2ZyYW1lCisgICAgZWxzZToKKyAgICAgICAgbGluZW5vID0gZnJhbWUuZl9saW5lbm8KKyAgICBpZiBub3QgaXNmcmFtZShmcmFtZSk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigneyFyfSBpcyBub3QgYSBmcmFtZSBvciB0cmFjZWJhY2sgb2JqZWN0Jy5mb3JtYXQoZnJhbWUpKQorCisgICAgZmlsZW5hbWUgPSBnZXRzb3VyY2VmaWxlKGZyYW1lKSBvciBnZXRmaWxlKGZyYW1lKQorICAgIGlmIGNvbnRleHQgPiAwOgorICAgICAgICBzdGFydCA9IGxpbmVubyAtIDEgLSBjb250ZXh0Ly8yCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmVzLCBsbnVtID0gZmluZHNvdXJjZShmcmFtZSkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBsaW5lcyA9IGluZGV4ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhcnQgPSBtYXgoc3RhcnQsIDEpCisgICAgICAgICAgICBzdGFydCA9IG1heCgwLCBtaW4oc3RhcnQsIGxlbihsaW5lcykgLSBjb250ZXh0KSkKKyAgICAgICAgICAgIGxpbmVzID0gbGluZXNbc3RhcnQ6c3RhcnQrY29udGV4dF0KKyAgICAgICAgICAgIGluZGV4ID0gbGluZW5vIC0gMSAtIHN0YXJ0CisgICAgZWxzZToKKyAgICAgICAgbGluZXMgPSBpbmRleCA9IE5vbmUKKworICAgIHJldHVybiBUcmFjZWJhY2soZmlsZW5hbWUsIGxpbmVubywgZnJhbWUuZl9jb2RlLmNvX25hbWUsIGxpbmVzLCBpbmRleCkKKworZGVmIGdldGxpbmVubyhmcmFtZSk6CisgICAgIiIiR2V0IHRoZSBsaW5lIG51bWJlciBmcm9tIGEgZnJhbWUgb2JqZWN0LCBhbGxvd2luZyBmb3Igb3B0aW1pemF0aW9uLiIiIgorICAgICMgRnJhbWVUeXBlLmZfbGluZW5vIGlzIG5vdyBhIGRlc2NyaXB0b3IgdGhhdCBncm92ZWxzIGNvX2xub3RhYgorICAgIHJldHVybiBmcmFtZS5mX2xpbmVubworCitkZWYgZ2V0b3V0ZXJmcmFtZXMoZnJhbWUsIGNvbnRleHQ9MSk6CisgICAgIiIiR2V0IGEgbGlzdCBvZiByZWNvcmRzIGZvciBhIGZyYW1lIGFuZCBhbGwgaGlnaGVyIChjYWxsaW5nKSBmcmFtZXMuCisKKyAgICBFYWNoIHJlY29yZCBjb250YWlucyBhIGZyYW1lIG9iamVjdCwgZmlsZW5hbWUsIGxpbmUgbnVtYmVyLCBmdW5jdGlvbgorICAgIG5hbWUsIGEgbGlzdCBvZiBsaW5lcyBvZiBjb250ZXh0LCBhbmQgaW5kZXggd2l0aGluIHRoZSBjb250ZXh0LiIiIgorICAgIGZyYW1lbGlzdCA9IFtdCisgICAgd2hpbGUgZnJhbWU6CisgICAgICAgIGZyYW1lbGlzdC5hcHBlbmQoKGZyYW1lLCkgKyBnZXRmcmFtZWluZm8oZnJhbWUsIGNvbnRleHQpKQorICAgICAgICBmcmFtZSA9IGZyYW1lLmZfYmFjaworICAgIHJldHVybiBmcmFtZWxpc3QKKworZGVmIGdldGlubmVyZnJhbWVzKHRiLCBjb250ZXh0PTEpOgorICAgICIiIkdldCBhIGxpc3Qgb2YgcmVjb3JkcyBmb3IgYSB0cmFjZWJhY2sncyBmcmFtZSBhbmQgYWxsIGxvd2VyIGZyYW1lcy4KKworICAgIEVhY2ggcmVjb3JkIGNvbnRhaW5zIGEgZnJhbWUgb2JqZWN0LCBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGZ1bmN0aW9uCisgICAgbmFtZSwgYSBsaXN0IG9mIGxpbmVzIG9mIGNvbnRleHQsIGFuZCBpbmRleCB3aXRoaW4gdGhlIGNvbnRleHQuIiIiCisgICAgZnJhbWVsaXN0ID0gW10KKyAgICB3aGlsZSB0YjoKKyAgICAgICAgZnJhbWVsaXN0LmFwcGVuZCgodGIudGJfZnJhbWUsKSArIGdldGZyYW1laW5mbyh0YiwgY29udGV4dCkpCisgICAgICAgIHRiID0gdGIudGJfbmV4dAorICAgIHJldHVybiBmcmFtZWxpc3QKKworaWYgaGFzYXR0cihzeXMsICdfZ2V0ZnJhbWUnKToKKyAgICBjdXJyZW50ZnJhbWUgPSBzeXMuX2dldGZyYW1lCitlbHNlOgorICAgIGN1cnJlbnRmcmFtZSA9IGxhbWJkYSBfPU5vbmU6IE5vbmUKKworZGVmIHN0YWNrKGNvbnRleHQ9MSk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiByZWNvcmRzIGZvciB0aGUgc3RhY2sgYWJvdmUgdGhlIGNhbGxlcidzIGZyYW1lLiIiIgorICAgIHJldHVybiBnZXRvdXRlcmZyYW1lcyhzeXMuX2dldGZyYW1lKDEpLCBjb250ZXh0KQorCitkZWYgdHJhY2UoY29udGV4dD0xKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHJlY29yZHMgZm9yIHRoZSBzdGFjayBiZWxvdyB0aGUgY3VycmVudCBleGNlcHRpb24uIiIiCisgICAgcmV0dXJuIGdldGlubmVyZnJhbWVzKHN5cy5leGNfaW5mbygpWzJdLCBjb250ZXh0KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pbnNwZWN0LnB5YyBiL2xpYi9weXRob24yLjcvaW5zcGVjdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjOWM5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW5zcGVjdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pbnNwZWN0LnB5byBiL2xpYi9weXRob24yLjcvaW5zcGVjdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjOWM5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW5zcGVjdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pby5weSBiL2xpYi9weXRob24yLjcvaW8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4MzI3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW8ucHkKQEAgLTAsMCArMSw4OSBAQAorIiIiVGhlIGlvIG1vZHVsZSBwcm92aWRlcyB0aGUgUHl0aG9uIGludGVyZmFjZXMgdG8gc3RyZWFtIGhhbmRsaW5nLiBUaGUKK2J1aWx0aW4gb3BlbiBmdW5jdGlvbiBpcyBkZWZpbmVkIGluIHRoaXMgbW9kdWxlLgorCitBdCB0aGUgdG9wIG9mIHRoZSBJL08gaGllcmFyY2h5IGlzIHRoZSBhYnN0cmFjdCBiYXNlIGNsYXNzIElPQmFzZS4gSXQKK2RlZmluZXMgdGhlIGJhc2ljIGludGVyZmFjZSB0byBhIHN0cmVhbS4gTm90ZSwgaG93ZXZlciwgdGhhdCB0aGVyZSBpcyBubworc2VwYXJhdGlvbiBiZXR3ZWVuIHJlYWRpbmcgYW5kIHdyaXRpbmcgdG8gc3RyZWFtczsgaW1wbGVtZW50YXRpb25zIGFyZQorYWxsb3dlZCB0byByYWlzZSBhbiBJT0Vycm9yIGlmIHRoZXkgZG8gbm90IHN1cHBvcnQgYSBnaXZlbiBvcGVyYXRpb24uCisKK0V4dGVuZGluZyBJT0Jhc2UgaXMgUmF3SU9CYXNlIHdoaWNoIGRlYWxzIHNpbXBseSB3aXRoIHRoZSByZWFkaW5nIGFuZAord3JpdGluZyBvZiByYXcgYnl0ZXMgdG8gYSBzdHJlYW0uIEZpbGVJTyBzdWJjbGFzc2VzIFJhd0lPQmFzZSB0byBwcm92aWRlCithbiBpbnRlcmZhY2UgdG8gT1MgZmlsZXMuCisKK0J1ZmZlcmVkSU9CYXNlIGRlYWxzIHdpdGggYnVmZmVyaW5nIG9uIGEgcmF3IGJ5dGUgc3RyZWFtIChSYXdJT0Jhc2UpLiBJdHMKK3N1YmNsYXNzZXMsIEJ1ZmZlcmVkV3JpdGVyLCBCdWZmZXJlZFJlYWRlciwgYW5kIEJ1ZmZlcmVkUldQYWlyIGJ1ZmZlcgorc3RyZWFtcyB0aGF0IGFyZSByZWFkYWJsZSwgd3JpdGFibGUsIGFuZCBib3RoIHJlc3BlY3RpdmVseS4KK0J1ZmZlcmVkUmFuZG9tIHByb3ZpZGVzIGEgYnVmZmVyZWQgaW50ZXJmYWNlIHRvIHJhbmRvbSBhY2Nlc3MKK3N0cmVhbXMuIEJ5dGVzSU8gaXMgYSBzaW1wbGUgc3RyZWFtIG9mIGluLW1lbW9yeSBieXRlcy4KKworQW5vdGhlciBJT0Jhc2Ugc3ViY2xhc3MsIFRleHRJT0Jhc2UsIGRlYWxzIHdpdGggdGhlIGVuY29kaW5nIGFuZCBkZWNvZGluZworb2Ygc3RyZWFtcyBpbnRvIHRleHQuIFRleHRJT1dyYXBwZXIsIHdoaWNoIGV4dGVuZHMgaXQsIGlzIGEgYnVmZmVyZWQgdGV4dAoraW50ZXJmYWNlIHRvIGEgYnVmZmVyZWQgcmF3IHN0cmVhbSAoYEJ1ZmZlcmVkSU9CYXNlYCkuIEZpbmFsbHksIFN0cmluZ0lPCitpcyBhIGluLW1lbW9yeSBzdHJlYW0gZm9yIHRleHQuCisKK0FyZ3VtZW50IG5hbWVzIGFyZSBub3QgcGFydCBvZiB0aGUgc3BlY2lmaWNhdGlvbiwgYW5kIG9ubHkgdGhlIGFyZ3VtZW50cworb2Ygb3BlbigpIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGtleXdvcmQgYXJndW1lbnRzLgorCitkYXRhOgorCitERUZBVUxUX0JVRkZFUl9TSVpFCisKKyAgIEFuIGludCBjb250YWluaW5nIHRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplIHVzZWQgYnkgdGhlIG1vZHVsZSdzIGJ1ZmZlcmVkCisgICBJL08gY2xhc3Nlcy4gb3BlbigpIHVzZXMgdGhlIGZpbGUncyBibGtzaXplIChhcyBvYnRhaW5lZCBieSBvcy5zdGF0KSBpZgorICAgcG9zc2libGUuCisiIiIKKyMgTmV3IEkvTyBsaWJyYXJ5IGNvbmZvcm1pbmcgdG8gUEVQIDMxMTYuCisKK19fYXV0aG9yX18gPSAoIkd1aWRvIHZhbiBSb3NzdW0gPGd1aWRvQHB5dGhvbi5vcmc+LCAiCisgICAgICAgICAgICAgICJNaWtlIFZlcmRvbmUgPG1pa2UudmVyZG9uZUBnbWFpbC5jb20+LCAiCisgICAgICAgICAgICAgICJNYXJrIFJ1c3NlbGwgPG1hcmsucnVzc2VsbEB6ZW4uY28udWs+LCAiCisgICAgICAgICAgICAgICJBbnRvaW5lIFBpdHJvdSA8c29saXBzaXNAcGl0cm91Lm5ldD4sICIKKyAgICAgICAgICAgICAgIkFtYXVyeSBGb3JnZW90IGQnQXJjIDxhbWF1cnlmYUBnbWFpbC5jb20+LCAiCisgICAgICAgICAgICAgICJCZW5qYW1pbiBQZXRlcnNvbiA8YmVuamFtaW5AcHl0aG9uLm9yZz4iKQorCitfX2FsbF9fID0gWyJCbG9ja2luZ0lPRXJyb3IiLCAib3BlbiIsICJJT0Jhc2UiLCAiUmF3SU9CYXNlIiwgIkZpbGVJTyIsCisgICAgICAgICAgICJCeXRlc0lPIiwgIlN0cmluZ0lPIiwgIkJ1ZmZlcmVkSU9CYXNlIiwKKyAgICAgICAgICAgIkJ1ZmZlcmVkUmVhZGVyIiwgIkJ1ZmZlcmVkV3JpdGVyIiwgIkJ1ZmZlcmVkUldQYWlyIiwKKyAgICAgICAgICAgIkJ1ZmZlcmVkUmFuZG9tIiwgIlRleHRJT0Jhc2UiLCAiVGV4dElPV3JhcHBlciIsCisgICAgICAgICAgICJVbnN1cHBvcnRlZE9wZXJhdGlvbiIsICJTRUVLX1NFVCIsICJTRUVLX0NVUiIsICJTRUVLX0VORCJdCisKKworaW1wb3J0IF9pbworaW1wb3J0IGFiYworCitmcm9tIF9pbyBpbXBvcnQgKERFRkFVTFRfQlVGRkVSX1NJWkUsIEJsb2NraW5nSU9FcnJvciwgVW5zdXBwb3J0ZWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgIG9wZW4sIEZpbGVJTywgQnl0ZXNJTywgU3RyaW5nSU8sIEJ1ZmZlcmVkUmVhZGVyLAorICAgICAgICAgICAgICAgICBCdWZmZXJlZFdyaXRlciwgQnVmZmVyZWRSV1BhaXIsIEJ1ZmZlcmVkUmFuZG9tLAorICAgICAgICAgICAgICAgICBJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyLCBUZXh0SU9XcmFwcGVyKQorCitPcGVuV3JhcHBlciA9IF9pby5vcGVuICMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBfcHlpbworCisjIGZvciBzZWVrKCkKK1NFRUtfU0VUID0gMAorU0VFS19DVVIgPSAxCitTRUVLX0VORCA9IDIKKworIyBEZWNsYXJpbmcgQUJDcyBpbiBDIGlzIHRyaWNreSBzbyB3ZSBkbyBpdCBoZXJlLgorIyBNZXRob2QgZGVzY3JpcHRpb25zIGFuZCBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlIEMKKyMgdmVyc2lvbiBob3dldmVyLgorY2xhc3MgSU9CYXNlKF9pby5fSU9CYXNlKToKKyAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKKworY2xhc3MgUmF3SU9CYXNlKF9pby5fUmF3SU9CYXNlLCBJT0Jhc2UpOgorICAgIHBhc3MKKworY2xhc3MgQnVmZmVyZWRJT0Jhc2UoX2lvLl9CdWZmZXJlZElPQmFzZSwgSU9CYXNlKToKKyAgICBwYXNzCisKK2NsYXNzIFRleHRJT0Jhc2UoX2lvLl9UZXh0SU9CYXNlLCBJT0Jhc2UpOgorICAgIHBhc3MKKworUmF3SU9CYXNlLnJlZ2lzdGVyKEZpbGVJTykKKworZm9yIGtsYXNzIGluIChCeXRlc0lPLCBCdWZmZXJlZFJlYWRlciwgQnVmZmVyZWRXcml0ZXIsIEJ1ZmZlcmVkUmFuZG9tLAorICAgICAgICAgICAgICBCdWZmZXJlZFJXUGFpcik6CisgICAgQnVmZmVyZWRJT0Jhc2UucmVnaXN0ZXIoa2xhc3MpCisKK2ZvciBrbGFzcyBpbiAoU3RyaW5nSU8sIFRleHRJT1dyYXBwZXIpOgorICAgIFRleHRJT0Jhc2UucmVnaXN0ZXIoa2xhc3MpCitkZWwga2xhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaW8ucHljIGIvbGliL3B5dGhvbjIuNy9pby5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjOTBiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW8ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaW8ucHlvIGIvbGliL3B5dGhvbjIuNy9pby5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjOTBiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW8ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvanNvbi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmU4NWRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMzUxIEBACityIiIiSlNPTiAoSmF2YVNjcmlwdCBPYmplY3QgTm90YXRpb24pIDxodHRwOi8vanNvbi5vcmc+IGlzIGEgc3Vic2V0IG9mCitKYXZhU2NyaXB0IHN5bnRheCAoRUNNQS0yNjIgM3JkIGVkaXRpb24pIHVzZWQgYXMgYSBsaWdodHdlaWdodCBkYXRhCitpbnRlcmNoYW5nZSBmb3JtYXQuCisKKzptb2Q6YGpzb25gIGV4cG9zZXMgYW4gQVBJIGZhbWlsaWFyIHRvIHVzZXJzIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5Cis6bW9kOmBtYXJzaGFsYCBhbmQgOm1vZDpgcGlja2xlYCBtb2R1bGVzLiBJdCBpcyB0aGUgZXh0ZXJuYWxseSBtYWludGFpbmVkCit2ZXJzaW9uIG9mIHRoZSA6bW9kOmBqc29uYCBsaWJyYXJ5IGNvbnRhaW5lZCBpbiBQeXRob24gMi42LCBidXQgbWFpbnRhaW5zCitjb21wYXRpYmlsaXR5IHdpdGggUHl0aG9uIDIuNCBhbmQgUHl0aG9uIDIuNSBhbmQgKGN1cnJlbnRseSkgaGFzCitzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBhZHZhbnRhZ2VzLCBldmVuIHdpdGhvdXQgdXNpbmcgdGhlIG9wdGlvbmFsIEMKK2V4dGVuc2lvbiBmb3Igc3BlZWR1cHMuCisKK0VuY29kaW5nIGJhc2ljIFB5dGhvbiBvYmplY3QgaGllcmFyY2hpZXM6OgorCisgICAgPj4+IGltcG9ydCBqc29uCisgICAgPj4+IGpzb24uZHVtcHMoWydmb28nLCB7J2Jhcic6ICgnYmF6JywgTm9uZSwgMS4wLCAyKX1dKQorICAgICdbImZvbyIsIHsiYmFyIjogWyJiYXoiLCBudWxsLCAxLjAsIDJdfV0nCisgICAgPj4+IHByaW50IGpzb24uZHVtcHMoIlwiZm9vXGJhciIpCisgICAgIlwiZm9vXGJhciIKKyAgICA+Pj4gcHJpbnQganNvbi5kdW1wcyh1J1x1MTIzNCcpCisgICAgIlx1MTIzNCIKKyAgICA+Pj4gcHJpbnQganNvbi5kdW1wcygnXFwnKQorICAgICJcXCIKKyAgICA+Pj4gcHJpbnQganNvbi5kdW1wcyh7ImMiOiAwLCAiYiI6IDAsICJhIjogMH0sIHNvcnRfa2V5cz1UcnVlKQorICAgIHsiYSI6IDAsICJiIjogMCwgImMiOiAwfQorICAgID4+PiBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgID4+PiBpbyA9IFN0cmluZ0lPKCkKKyAgICA+Pj4ganNvbi5kdW1wKFsnc3RyZWFtaW5nIEFQSSddLCBpbykKKyAgICA+Pj4gaW8uZ2V0dmFsdWUoKQorICAgICdbInN0cmVhbWluZyBBUEkiXScKKworQ29tcGFjdCBlbmNvZGluZzo6CisKKyAgICA+Pj4gaW1wb3J0IGpzb24KKyAgICA+Pj4ganNvbi5kdW1wcyhbMSwyLDMseyc0JzogNSwgJzYnOiA3fV0sIHNvcnRfa2V5cz1UcnVlLCBzZXBhcmF0b3JzPSgnLCcsJzonKSkKKyAgICAnWzEsMiwzLHsiNCI6NSwiNiI6N31dJworCitQcmV0dHkgcHJpbnRpbmc6OgorCisgICAgPj4+IGltcG9ydCBqc29uCisgICAgPj4+IHByaW50IGpzb24uZHVtcHMoeyc0JzogNSwgJzYnOiA3fSwgc29ydF9rZXlzPVRydWUsCisgICAgLi4uICAgICAgICAgICAgICAgICAgaW5kZW50PTQsIHNlcGFyYXRvcnM9KCcsJywgJzogJykpCisgICAgeworICAgICAgICAiNCI6IDUsCisgICAgICAgICI2IjogNworICAgIH0KKworRGVjb2RpbmcgSlNPTjo6CisKKyAgICA+Pj4gaW1wb3J0IGpzb24KKyAgICA+Pj4gb2JqID0gW3UnZm9vJywge3UnYmFyJzogW3UnYmF6JywgTm9uZSwgMS4wLCAyXX1dCisgICAgPj4+IGpzb24ubG9hZHMoJ1siZm9vIiwgeyJiYXIiOlsiYmF6IiwgbnVsbCwgMS4wLCAyXX1dJykgPT0gb2JqCisgICAgVHJ1ZQorICAgID4+PiBqc29uLmxvYWRzKCciXFwiZm9vXFxiYXIiJykgPT0gdSciZm9vXHgwOGFyJworICAgIFRydWUKKyAgICA+Pj4gZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICA+Pj4gaW8gPSBTdHJpbmdJTygnWyJzdHJlYW1pbmcgQVBJIl0nKQorICAgID4+PiBqc29uLmxvYWQoaW8pWzBdID09ICdzdHJlYW1pbmcgQVBJJworICAgIFRydWUKKworU3BlY2lhbGl6aW5nIEpTT04gb2JqZWN0IGRlY29kaW5nOjoKKworICAgID4+PiBpbXBvcnQganNvbgorICAgID4+PiBkZWYgYXNfY29tcGxleChkY3QpOgorICAgIC4uLiAgICAgaWYgJ19fY29tcGxleF9fJyBpbiBkY3Q6CisgICAgLi4uICAgICAgICAgcmV0dXJuIGNvbXBsZXgoZGN0WydyZWFsJ10sIGRjdFsnaW1hZyddKQorICAgIC4uLiAgICAgcmV0dXJuIGRjdAorICAgIC4uLgorICAgID4+PiBqc29uLmxvYWRzKCd7Il9fY29tcGxleF9fIjogdHJ1ZSwgInJlYWwiOiAxLCAiaW1hZyI6IDJ9JywKKyAgICAuLi4gICAgIG9iamVjdF9ob29rPWFzX2NvbXBsZXgpCisgICAgKDErMmopCisgICAgPj4+IGZyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbAorICAgID4+PiBqc29uLmxvYWRzKCcxLjEnLCBwYXJzZV9mbG9hdD1EZWNpbWFsKSA9PSBEZWNpbWFsKCcxLjEnKQorICAgIFRydWUKKworU3BlY2lhbGl6aW5nIEpTT04gb2JqZWN0IGVuY29kaW5nOjoKKworICAgID4+PiBpbXBvcnQganNvbgorICAgID4+PiBkZWYgZW5jb2RlX2NvbXBsZXgob2JqKToKKyAgICAuLi4gICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBjb21wbGV4KToKKyAgICAuLi4gICAgICAgICByZXR1cm4gW29iai5yZWFsLCBvYmouaW1hZ10KKyAgICAuLi4gICAgIHJhaXNlIFR5cGVFcnJvcihyZXByKG8pICsgIiBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUiKQorICAgIC4uLgorICAgID4+PiBqc29uLmR1bXBzKDIgKyAxaiwgZGVmYXVsdD1lbmNvZGVfY29tcGxleCkKKyAgICAnWzIuMCwgMS4wXScKKyAgICA+Pj4ganNvbi5KU09ORW5jb2RlcihkZWZhdWx0PWVuY29kZV9jb21wbGV4KS5lbmNvZGUoMiArIDFqKQorICAgICdbMi4wLCAxLjBdJworICAgID4+PiAnJy5qb2luKGpzb24uSlNPTkVuY29kZXIoZGVmYXVsdD1lbmNvZGVfY29tcGxleCkuaXRlcmVuY29kZSgyICsgMWopKQorICAgICdbMi4wLCAxLjBdJworCisKK1VzaW5nIGpzb24udG9vbCBmcm9tIHRoZSBzaGVsbCB0byB2YWxpZGF0ZSBhbmQgcHJldHR5LXByaW50OjoKKworICAgICQgZWNobyAneyJqc29uIjoib2JqIn0nIHwgcHl0aG9uIC1tIGpzb24udG9vbAorICAgIHsKKyAgICAgICAgImpzb24iOiAib2JqIgorICAgIH0KKyAgICAkIGVjaG8gJ3sgMS4yOjMuNH0nIHwgcHl0aG9uIC1tIGpzb24udG9vbAorICAgIEV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXM6IGxpbmUgMSBjb2x1bW4gMyAoY2hhciAyKQorIiIiCitfX3ZlcnNpb25fXyA9ICcyLjAuOScKK19fYWxsX18gPSBbCisgICAgJ2R1bXAnLCAnZHVtcHMnLCAnbG9hZCcsICdsb2FkcycsCisgICAgJ0pTT05EZWNvZGVyJywgJ0pTT05FbmNvZGVyJywKK10KKworX19hdXRob3JfXyA9ICdCb2IgSXBwb2xpdG8gPGJvYkByZWRpdmkuY29tPicKKworZnJvbSAuZGVjb2RlciBpbXBvcnQgSlNPTkRlY29kZXIKK2Zyb20gLmVuY29kZXIgaW1wb3J0IEpTT05FbmNvZGVyCisKK19kZWZhdWx0X2VuY29kZXIgPSBKU09ORW5jb2RlcigKKyAgICBza2lwa2V5cz1GYWxzZSwKKyAgICBlbnN1cmVfYXNjaWk9VHJ1ZSwKKyAgICBjaGVja19jaXJjdWxhcj1UcnVlLAorICAgIGFsbG93X25hbj1UcnVlLAorICAgIGluZGVudD1Ob25lLAorICAgIHNlcGFyYXRvcnM9Tm9uZSwKKyAgICBlbmNvZGluZz0ndXRmLTgnLAorICAgIGRlZmF1bHQ9Tm9uZSwKKykKKworZGVmIGR1bXAob2JqLCBmcCwgc2tpcGtleXM9RmFsc2UsIGVuc3VyZV9hc2NpaT1UcnVlLCBjaGVja19jaXJjdWxhcj1UcnVlLAorICAgICAgICBhbGxvd19uYW49VHJ1ZSwgY2xzPU5vbmUsIGluZGVudD1Ob25lLCBzZXBhcmF0b3JzPU5vbmUsCisgICAgICAgIGVuY29kaW5nPSd1dGYtOCcsIGRlZmF1bHQ9Tm9uZSwgc29ydF9rZXlzPUZhbHNlLCAqKmt3KToKKyAgICAiIiJTZXJpYWxpemUgYGBvYmpgYCBhcyBhIEpTT04gZm9ybWF0dGVkIHN0cmVhbSB0byBgYGZwYGAgKGEKKyAgICBgYC53cml0ZSgpYGAtc3VwcG9ydGluZyBmaWxlLWxpa2Ugb2JqZWN0KS4KKworICAgIElmIGBgc2tpcGtleXNgYCBpcyB0cnVlIHRoZW4gYGBkaWN0YGAga2V5cyB0aGF0IGFyZSBub3QgYmFzaWMgdHlwZXMKKyAgICAoYGBzdHJgYCwgYGB1bmljb2RlYGAsIGBgaW50YGAsIGBgbG9uZ2BgLCBgYGZsb2F0YGAsIGBgYm9vbGBgLCBgYE5vbmVgYCkKKyAgICB3aWxsIGJlIHNraXBwZWQgaW5zdGVhZCBvZiByYWlzaW5nIGEgYGBUeXBlRXJyb3JgYC4KKworICAgIElmIGBgZW5zdXJlX2FzY2lpYGAgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCBhbGwgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gdGhlCisgICAgb3V0cHV0IGFyZSBlc2NhcGVkIHdpdGggYGBcdVhYWFhgYCBzZXF1ZW5jZXMsIGFuZCB0aGUgcmVzdWx0IGlzIGEgYGBzdHJgYAorICAgIGluc3RhbmNlIGNvbnNpc3Rpbmcgb2YgQVNDSUkgY2hhcmFjdGVycyBvbmx5LiAgSWYgYGBlbnN1cmVfYXNjaWlgYCBpcworICAgIGBgRmFsc2VgYCwgc29tZSBjaHVua3Mgd3JpdHRlbiB0byBgYGZwYGAgbWF5IGJlIGBgdW5pY29kZWBgIGluc3RhbmNlcy4KKyAgICBUaGlzIHVzdWFsbHkgaGFwcGVucyBiZWNhdXNlIHRoZSBpbnB1dCBjb250YWlucyB1bmljb2RlIHN0cmluZ3Mgb3IgdGhlCisgICAgYGBlbmNvZGluZ2BgIHBhcmFtZXRlciBpcyB1c2VkLiBVbmxlc3MgYGBmcC53cml0ZSgpYGAgZXhwbGljaXRseQorICAgIHVuZGVyc3RhbmRzIGBgdW5pY29kZWBgIChhcyBpbiBgYGNvZGVjcy5nZXR3cml0ZXJgYCkgdGhpcyBpcyBsaWtlbHkgdG8KKyAgICBjYXVzZSBhbiBlcnJvci4KKworICAgIElmIGBgY2hlY2tfY2lyY3VsYXJgYCBpcyBmYWxzZSwgdGhlbiB0aGUgY2lyY3VsYXIgcmVmZXJlbmNlIGNoZWNrCisgICAgZm9yIGNvbnRhaW5lciB0eXBlcyB3aWxsIGJlIHNraXBwZWQgYW5kIGEgY2lyY3VsYXIgcmVmZXJlbmNlIHdpbGwKKyAgICByZXN1bHQgaW4gYW4gYGBPdmVyZmxvd0Vycm9yYGAgKG9yIHdvcnNlKS4KKworICAgIElmIGBgYWxsb3dfbmFuYGAgaXMgZmFsc2UsIHRoZW4gaXQgd2lsbCBiZSBhIGBgVmFsdWVFcnJvcmBgIHRvCisgICAgc2VyaWFsaXplIG91dCBvZiByYW5nZSBgYGZsb2F0YGAgdmFsdWVzIChgYG5hbmBgLCBgYGluZmBgLCBgYC1pbmZgYCkKKyAgICBpbiBzdHJpY3QgY29tcGxpYW5jZSBvZiB0aGUgSlNPTiBzcGVjaWZpY2F0aW9uLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZQorICAgIEphdmFTY3JpcHQgZXF1aXZhbGVudHMgKGBgTmFOYGAsIGBgSW5maW5pdHlgYCwgYGAtSW5maW5pdHlgYCkuCisKKyAgICBJZiBgYGluZGVudGBgIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIHRoZW4gSlNPTiBhcnJheSBlbGVtZW50cyBhbmQKKyAgICBvYmplY3QgbWVtYmVycyB3aWxsIGJlIHByZXR0eS1wcmludGVkIHdpdGggdGhhdCBpbmRlbnQgbGV2ZWwuIEFuIGluZGVudAorICAgIGxldmVsIG9mIDAgd2lsbCBvbmx5IGluc2VydCBuZXdsaW5lcy4gYGBOb25lYGAgaXMgdGhlIG1vc3QgY29tcGFjdAorICAgIHJlcHJlc2VudGF0aW9uLiAgU2luY2UgdGhlIGRlZmF1bHQgaXRlbSBzZXBhcmF0b3IgaXMgYGAnLCAnYGAsICB0aGUKKyAgICBvdXRwdXQgbWlnaHQgaW5jbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHdoZW4gYGBpbmRlbnRgYCBpcyBzcGVjaWZpZWQuCisgICAgWW91IGNhbiB1c2UgYGBzZXBhcmF0b3JzPSgnLCcsICc6ICcpYGAgdG8gYXZvaWQgdGhpcy4KKworICAgIElmIGBgc2VwYXJhdG9yc2BgIGlzIGFuIGBgKGl0ZW1fc2VwYXJhdG9yLCBkaWN0X3NlcGFyYXRvcilgYCB0dXBsZQorICAgIHRoZW4gaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgYGAoJywgJywgJzogJylgYCBzZXBhcmF0b3JzLgorICAgIGBgKCcsJywgJzonKWBgIGlzIHRoZSBtb3N0IGNvbXBhY3QgSlNPTiByZXByZXNlbnRhdGlvbi4KKworICAgIGBgZW5jb2RpbmdgYCBpcyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGZvciBzdHIgaW5zdGFuY2VzLCBkZWZhdWx0IGlzIFVURi04LgorCisgICAgYGBkZWZhdWx0KG9iailgYCBpcyBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIHJldHVybiBhIHNlcmlhbGl6YWJsZSB2ZXJzaW9uCisgICAgb2Ygb2JqIG9yIHJhaXNlIFR5cGVFcnJvci4gVGhlIGRlZmF1bHQgc2ltcGx5IHJhaXNlcyBUeXBlRXJyb3IuCisKKyAgICBJZiAqc29ydF9rZXlzKiBpcyBgYFRydWVgYCAoZGVmYXVsdDogYGBGYWxzZWBgKSwgdGhlbiB0aGUgb3V0cHV0IG9mCisgICAgZGljdGlvbmFyaWVzIHdpbGwgYmUgc29ydGVkIGJ5IGtleS4KKworICAgIFRvIHVzZSBhIGN1c3RvbSBgYEpTT05FbmNvZGVyYGAgc3ViY2xhc3MgKGUuZy4gb25lIHRoYXQgb3ZlcnJpZGVzIHRoZQorICAgIGBgLmRlZmF1bHQoKWBgIG1ldGhvZCB0byBzZXJpYWxpemUgYWRkaXRpb25hbCB0eXBlcyksIHNwZWNpZnkgaXQgd2l0aAorICAgIHRoZSBgYGNsc2BgIGt3YXJnOyBvdGhlcndpc2UgYGBKU09ORW5jb2RlcmBgIGlzIHVzZWQuCisKKyAgICAiIiIKKyAgICAjIGNhY2hlZCBlbmNvZGVyCisgICAgaWYgKG5vdCBza2lwa2V5cyBhbmQgZW5zdXJlX2FzY2lpIGFuZAorICAgICAgICBjaGVja19jaXJjdWxhciBhbmQgYWxsb3dfbmFuIGFuZAorICAgICAgICBjbHMgaXMgTm9uZSBhbmQgaW5kZW50IGlzIE5vbmUgYW5kIHNlcGFyYXRvcnMgaXMgTm9uZSBhbmQKKyAgICAgICAgZW5jb2RpbmcgPT0gJ3V0Zi04JyBhbmQgZGVmYXVsdCBpcyBOb25lIGFuZCBub3Qgc29ydF9rZXlzIGFuZCBub3Qga3cpOgorICAgICAgICBpdGVyYWJsZSA9IF9kZWZhdWx0X2VuY29kZXIuaXRlcmVuY29kZShvYmopCisgICAgZWxzZToKKyAgICAgICAgaWYgY2xzIGlzIE5vbmU6CisgICAgICAgICAgICBjbHMgPSBKU09ORW5jb2RlcgorICAgICAgICBpdGVyYWJsZSA9IGNscyhza2lwa2V5cz1za2lwa2V5cywgZW5zdXJlX2FzY2lpPWVuc3VyZV9hc2NpaSwKKyAgICAgICAgICAgIGNoZWNrX2NpcmN1bGFyPWNoZWNrX2NpcmN1bGFyLCBhbGxvd19uYW49YWxsb3dfbmFuLCBpbmRlbnQ9aW5kZW50LAorICAgICAgICAgICAgc2VwYXJhdG9ycz1zZXBhcmF0b3JzLCBlbmNvZGluZz1lbmNvZGluZywKKyAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdCwgc29ydF9rZXlzPXNvcnRfa2V5cywgKiprdykuaXRlcmVuY29kZShvYmopCisgICAgIyBjb3VsZCBhY2NlbGVyYXRlIHdpdGggd3JpdGVsaW5lcyBpbiBzb21lIHZlcnNpb25zIG9mIFB5dGhvbiwgYXQKKyAgICAjIGEgZGVidWdnYWJpbGl0eSBjb3N0CisgICAgZm9yIGNodW5rIGluIGl0ZXJhYmxlOgorICAgICAgICBmcC53cml0ZShjaHVuaykKKworCitkZWYgZHVtcHMob2JqLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIGNoZWNrX2NpcmN1bGFyPVRydWUsCisgICAgICAgIGFsbG93X25hbj1UcnVlLCBjbHM9Tm9uZSwgaW5kZW50PU5vbmUsIHNlcGFyYXRvcnM9Tm9uZSwKKyAgICAgICAgZW5jb2Rpbmc9J3V0Zi04JywgZGVmYXVsdD1Ob25lLCBzb3J0X2tleXM9RmFsc2UsICoqa3cpOgorICAgICIiIlNlcmlhbGl6ZSBgYG9iamBgIHRvIGEgSlNPTiBmb3JtYXR0ZWQgYGBzdHJgYC4KKworICAgIElmIGBgc2tpcGtleXNgYCBpcyBmYWxzZSB0aGVuIGBgZGljdGBgIGtleXMgdGhhdCBhcmUgbm90IGJhc2ljIHR5cGVzCisgICAgKGBgc3RyYGAsIGBgdW5pY29kZWBgLCBgYGludGBgLCBgYGxvbmdgYCwgYGBmbG9hdGBgLCBgYGJvb2xgYCwgYGBOb25lYGApCisgICAgd2lsbCBiZSBza2lwcGVkIGluc3RlYWQgb2YgcmFpc2luZyBhIGBgVHlwZUVycm9yYGAuCisKKyAgICBJZiBgYGVuc3VyZV9hc2NpaWBgIGlzIGZhbHNlLCBhbGwgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIG5vdCBlc2NhcGVkLCBhbmQKKyAgICB0aGUgcmV0dXJuIHZhbHVlIG1heSBiZSBhIGBgdW5pY29kZWBgIGluc3RhbmNlLiBTZWUgYGBkdW1wYGAgZm9yIGRldGFpbHMuCisKKyAgICBJZiBgYGNoZWNrX2NpcmN1bGFyYGAgaXMgZmFsc2UsIHRoZW4gdGhlIGNpcmN1bGFyIHJlZmVyZW5jZSBjaGVjaworICAgIGZvciBjb250YWluZXIgdHlwZXMgd2lsbCBiZSBza2lwcGVkIGFuZCBhIGNpcmN1bGFyIHJlZmVyZW5jZSB3aWxsCisgICAgcmVzdWx0IGluIGFuIGBgT3ZlcmZsb3dFcnJvcmBgIChvciB3b3JzZSkuCisKKyAgICBJZiBgYGFsbG93X25hbmBgIGlzIGZhbHNlLCB0aGVuIGl0IHdpbGwgYmUgYSBgYFZhbHVlRXJyb3JgYCB0bworICAgIHNlcmlhbGl6ZSBvdXQgb2YgcmFuZ2UgYGBmbG9hdGBgIHZhbHVlcyAoYGBuYW5gYCwgYGBpbmZgYCwgYGAtaW5mYGApIGluCisgICAgc3RyaWN0IGNvbXBsaWFuY2Ugb2YgdGhlIEpTT04gc3BlY2lmaWNhdGlvbiwgaW5zdGVhZCBvZiB1c2luZyB0aGUKKyAgICBKYXZhU2NyaXB0IGVxdWl2YWxlbnRzIChgYE5hTmBgLCBgYEluZmluaXR5YGAsIGBgLUluZmluaXR5YGApLgorCisgICAgSWYgYGBpbmRlbnRgYCBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCB0aGVuIEpTT04gYXJyYXkgZWxlbWVudHMgYW5kCisgICAgb2JqZWN0IG1lbWJlcnMgd2lsbCBiZSBwcmV0dHktcHJpbnRlZCB3aXRoIHRoYXQgaW5kZW50IGxldmVsLiBBbiBpbmRlbnQKKyAgICBsZXZlbCBvZiAwIHdpbGwgb25seSBpbnNlcnQgbmV3bGluZXMuIGBgTm9uZWBgIGlzIHRoZSBtb3N0IGNvbXBhY3QKKyAgICByZXByZXNlbnRhdGlvbi4gIFNpbmNlIHRoZSBkZWZhdWx0IGl0ZW0gc2VwYXJhdG9yIGlzIGBgJywgJ2BgLCAgdGhlCisgICAgb3V0cHV0IG1pZ2h0IGluY2x1ZGUgdHJhaWxpbmcgd2hpdGVzcGFjZSB3aGVuIGBgaW5kZW50YGAgaXMgc3BlY2lmaWVkLgorICAgIFlvdSBjYW4gdXNlIGBgc2VwYXJhdG9ycz0oJywnLCAnOiAnKWBgIHRvIGF2b2lkIHRoaXMuCisKKyAgICBJZiBgYHNlcGFyYXRvcnNgYCBpcyBhbiBgYChpdGVtX3NlcGFyYXRvciwgZGljdF9zZXBhcmF0b3IpYGAgdHVwbGUKKyAgICB0aGVuIGl0IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGBgKCcsICcsICc6ICcpYGAgc2VwYXJhdG9ycy4KKyAgICBgYCgnLCcsICc6JylgYCBpcyB0aGUgbW9zdCBjb21wYWN0IEpTT04gcmVwcmVzZW50YXRpb24uCisKKyAgICBgYGVuY29kaW5nYGAgaXMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBmb3Igc3RyIGluc3RhbmNlcywgZGVmYXVsdCBpcyBVVEYtOC4KKworICAgIGBgZGVmYXVsdChvYmopYGAgaXMgYSBmdW5jdGlvbiB0aGF0IHNob3VsZCByZXR1cm4gYSBzZXJpYWxpemFibGUgdmVyc2lvbgorICAgIG9mIG9iaiBvciByYWlzZSBUeXBlRXJyb3IuIFRoZSBkZWZhdWx0IHNpbXBseSByYWlzZXMgVHlwZUVycm9yLgorCisgICAgSWYgKnNvcnRfa2V5cyogaXMgYGBUcnVlYGAgKGRlZmF1bHQ6IGBgRmFsc2VgYCksIHRoZW4gdGhlIG91dHB1dCBvZgorICAgIGRpY3Rpb25hcmllcyB3aWxsIGJlIHNvcnRlZCBieSBrZXkuCisKKyAgICBUbyB1c2UgYSBjdXN0b20gYGBKU09ORW5jb2RlcmBgIHN1YmNsYXNzIChlLmcuIG9uZSB0aGF0IG92ZXJyaWRlcyB0aGUKKyAgICBgYC5kZWZhdWx0KClgYCBtZXRob2QgdG8gc2VyaWFsaXplIGFkZGl0aW9uYWwgdHlwZXMpLCBzcGVjaWZ5IGl0IHdpdGgKKyAgICB0aGUgYGBjbHNgYCBrd2FyZzsgb3RoZXJ3aXNlIGBgSlNPTkVuY29kZXJgYCBpcyB1c2VkLgorCisgICAgIiIiCisgICAgIyBjYWNoZWQgZW5jb2RlcgorICAgIGlmIChub3Qgc2tpcGtleXMgYW5kIGVuc3VyZV9hc2NpaSBhbmQKKyAgICAgICAgY2hlY2tfY2lyY3VsYXIgYW5kIGFsbG93X25hbiBhbmQKKyAgICAgICAgY2xzIGlzIE5vbmUgYW5kIGluZGVudCBpcyBOb25lIGFuZCBzZXBhcmF0b3JzIGlzIE5vbmUgYW5kCisgICAgICAgIGVuY29kaW5nID09ICd1dGYtOCcgYW5kIGRlZmF1bHQgaXMgTm9uZSBhbmQgbm90IHNvcnRfa2V5cyBhbmQgbm90IGt3KToKKyAgICAgICAgcmV0dXJuIF9kZWZhdWx0X2VuY29kZXIuZW5jb2RlKG9iaikKKyAgICBpZiBjbHMgaXMgTm9uZToKKyAgICAgICAgY2xzID0gSlNPTkVuY29kZXIKKyAgICByZXR1cm4gY2xzKAorICAgICAgICBza2lwa2V5cz1za2lwa2V5cywgZW5zdXJlX2FzY2lpPWVuc3VyZV9hc2NpaSwKKyAgICAgICAgY2hlY2tfY2lyY3VsYXI9Y2hlY2tfY2lyY3VsYXIsIGFsbG93X25hbj1hbGxvd19uYW4sIGluZGVudD1pbmRlbnQsCisgICAgICAgIHNlcGFyYXRvcnM9c2VwYXJhdG9ycywgZW5jb2Rpbmc9ZW5jb2RpbmcsIGRlZmF1bHQ9ZGVmYXVsdCwKKyAgICAgICAgc29ydF9rZXlzPXNvcnRfa2V5cywgKiprdykuZW5jb2RlKG9iaikKKworCitfZGVmYXVsdF9kZWNvZGVyID0gSlNPTkRlY29kZXIoZW5jb2Rpbmc9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfcGFpcnNfaG9vaz1Ob25lKQorCisKK2RlZiBsb2FkKGZwLCBlbmNvZGluZz1Ob25lLCBjbHM9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwKKyAgICAgICAgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIG9iamVjdF9wYWlyc19ob29rPU5vbmUsICoqa3cpOgorICAgICIiIkRlc2VyaWFsaXplIGBgZnBgYCAoYSBgYC5yZWFkKClgYC1zdXBwb3J0aW5nIGZpbGUtbGlrZSBvYmplY3QgY29udGFpbmluZworICAgIGEgSlNPTiBkb2N1bWVudCkgdG8gYSBQeXRob24gb2JqZWN0LgorCisgICAgSWYgdGhlIGNvbnRlbnRzIG9mIGBgZnBgYCBpcyBlbmNvZGVkIHdpdGggYW4gQVNDSUkgYmFzZWQgZW5jb2Rpbmcgb3RoZXIKKyAgICB0aGFuIHV0Zi04IChlLmcuIGxhdGluLTEpLCB0aGVuIGFuIGFwcHJvcHJpYXRlIGBgZW5jb2RpbmdgYCBuYW1lIG11c3QKKyAgICBiZSBzcGVjaWZpZWQuIEVuY29kaW5ncyB0aGF0IGFyZSBub3QgQVNDSUkgYmFzZWQgKHN1Y2ggYXMgVUNTLTIpIGFyZQorICAgIG5vdCBhbGxvd2VkLCBhbmQgc2hvdWxkIGJlIHdyYXBwZWQgd2l0aAorICAgIGBgY29kZWNzLmdldHJlYWRlcihmcCkoZW5jb2RpbmcpYGAsIG9yIHNpbXBseSBkZWNvZGVkIHRvIGEgYGB1bmljb2RlYGAKKyAgICBvYmplY3QgYW5kIHBhc3NlZCB0byBgYGxvYWRzKClgYAorCisgICAgYGBvYmplY3RfaG9va2BgIGlzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKKyAgICByZXN1bHQgb2YgYW55IG9iamVjdCBsaXRlcmFsIGRlY29kZSAoYSBgYGRpY3RgYCkuIFRoZSByZXR1cm4gdmFsdWUgb2YKKyAgICBgYG9iamVjdF9ob29rYGAgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGBgZGljdGBgLiBUaGlzIGZlYXR1cmUKKyAgICBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgY3VzdG9tIGRlY29kZXJzIChlLmcuIEpTT04tUlBDIGNsYXNzIGhpbnRpbmcpLgorCisgICAgYGBvYmplY3RfcGFpcnNfaG9va2BgIGlzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKKyAgICByZXN1bHQgb2YgYW55IG9iamVjdCBsaXRlcmFsIGRlY29kZWQgd2l0aCBhbiBvcmRlcmVkIGxpc3Qgb2YgcGFpcnMuICBUaGUKKyAgICByZXR1cm4gdmFsdWUgb2YgYGBvYmplY3RfcGFpcnNfaG9va2BgIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBgYGRpY3RgYC4KKyAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGN1c3RvbSBkZWNvZGVycyB0aGF0IHJlbHkgb24gdGhlCisgICAgb3JkZXIgdGhhdCB0aGUga2V5IGFuZCB2YWx1ZSBwYWlycyBhcmUgZGVjb2RlZCAoZm9yIGV4YW1wbGUsCisgICAgY29sbGVjdGlvbnMuT3JkZXJlZERpY3Qgd2lsbCByZW1lbWJlciB0aGUgb3JkZXIgb2YgaW5zZXJ0aW9uKS4gSWYKKyAgICBgYG9iamVjdF9ob29rYGAgaXMgYWxzbyBkZWZpbmVkLCB0aGUgYGBvYmplY3RfcGFpcnNfaG9va2BgIHRha2VzIHByaW9yaXR5LgorCisgICAgVG8gdXNlIGEgY3VzdG9tIGBgSlNPTkRlY29kZXJgYCBzdWJjbGFzcywgc3BlY2lmeSBpdCB3aXRoIHRoZSBgYGNsc2BgCisgICAga3dhcmc7IG90aGVyd2lzZSBgYEpTT05EZWNvZGVyYGAgaXMgdXNlZC4KKworICAgICIiIgorICAgIHJldHVybiBsb2FkcyhmcC5yZWFkKCksCisgICAgICAgIGVuY29kaW5nPWVuY29kaW5nLCBjbHM9Y2xzLCBvYmplY3RfaG9vaz1vYmplY3RfaG9vaywKKyAgICAgICAgcGFyc2VfZmxvYXQ9cGFyc2VfZmxvYXQsIHBhcnNlX2ludD1wYXJzZV9pbnQsCisgICAgICAgIHBhcnNlX2NvbnN0YW50PXBhcnNlX2NvbnN0YW50LCBvYmplY3RfcGFpcnNfaG9vaz1vYmplY3RfcGFpcnNfaG9vaywKKyAgICAgICAgKiprdykKKworCitkZWYgbG9hZHMocywgZW5jb2Rpbmc9Tm9uZSwgY2xzPU5vbmUsIG9iamVjdF9ob29rPU5vbmUsIHBhcnNlX2Zsb2F0PU5vbmUsCisgICAgICAgIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBvYmplY3RfcGFpcnNfaG9vaz1Ob25lLCAqKmt3KToKKyAgICAiIiJEZXNlcmlhbGl6ZSBgYHNgYCAoYSBgYHN0cmBgIG9yIGBgdW5pY29kZWBgIGluc3RhbmNlIGNvbnRhaW5pbmcgYSBKU09OCisgICAgZG9jdW1lbnQpIHRvIGEgUHl0aG9uIG9iamVjdC4KKworICAgIElmIGBgc2BgIGlzIGEgYGBzdHJgYCBpbnN0YW5jZSBhbmQgaXMgZW5jb2RlZCB3aXRoIGFuIEFTQ0lJIGJhc2VkIGVuY29kaW5nCisgICAgb3RoZXIgdGhhbiB1dGYtOCAoZS5nLiBsYXRpbi0xKSB0aGVuIGFuIGFwcHJvcHJpYXRlIGBgZW5jb2RpbmdgYCBuYW1lCisgICAgbXVzdCBiZSBzcGVjaWZpZWQuIEVuY29kaW5ncyB0aGF0IGFyZSBub3QgQVNDSUkgYmFzZWQgKHN1Y2ggYXMgVUNTLTIpCisgICAgYXJlIG5vdCBhbGxvd2VkIGFuZCBzaG91bGQgYmUgZGVjb2RlZCB0byBgYHVuaWNvZGVgYCBmaXJzdC4KKworICAgIGBgb2JqZWN0X2hvb2tgYCBpcyBhbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlCisgICAgcmVzdWx0IG9mIGFueSBvYmplY3QgbGl0ZXJhbCBkZWNvZGUgKGEgYGBkaWN0YGApLiBUaGUgcmV0dXJuIHZhbHVlIG9mCisgICAgYGBvYmplY3RfaG9va2BgIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBgYGRpY3RgYC4gVGhpcyBmZWF0dXJlCisgICAgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGN1c3RvbSBkZWNvZGVycyAoZS5nLiBKU09OLVJQQyBjbGFzcyBoaW50aW5nKS4KKworICAgIGBgb2JqZWN0X3BhaXJzX2hvb2tgYCBpcyBhbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlCisgICAgcmVzdWx0IG9mIGFueSBvYmplY3QgbGl0ZXJhbCBkZWNvZGVkIHdpdGggYW4gb3JkZXJlZCBsaXN0IG9mIHBhaXJzLiAgVGhlCisgICAgcmV0dXJuIHZhbHVlIG9mIGBgb2JqZWN0X3BhaXJzX2hvb2tgYCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYGBkaWN0YGAuCisgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBjdXN0b20gZGVjb2RlcnMgdGhhdCByZWx5IG9uIHRoZQorICAgIG9yZGVyIHRoYXQgdGhlIGtleSBhbmQgdmFsdWUgcGFpcnMgYXJlIGRlY29kZWQgKGZvciBleGFtcGxlLAorICAgIGNvbGxlY3Rpb25zLk9yZGVyZWREaWN0IHdpbGwgcmVtZW1iZXIgdGhlIG9yZGVyIG9mIGluc2VydGlvbikuIElmCisgICAgYGBvYmplY3RfaG9va2BgIGlzIGFsc28gZGVmaW5lZCwgdGhlIGBgb2JqZWN0X3BhaXJzX2hvb2tgYCB0YWtlcyBwcmlvcml0eS4KKworICAgIGBgcGFyc2VfZmxvYXRgYCwgaWYgc3BlY2lmaWVkLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBzdHJpbmcKKyAgICBvZiBldmVyeSBKU09OIGZsb2F0IHRvIGJlIGRlY29kZWQuIEJ5IGRlZmF1bHQgdGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAgZmxvYXQobnVtX3N0cikuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdXNlIGFub3RoZXIgZGF0YXR5cGUgb3IgcGFyc2VyCisgICAgZm9yIEpTT04gZmxvYXRzIChlLmcuIGRlY2ltYWwuRGVjaW1hbCkuCisKKyAgICBgYHBhcnNlX2ludGBgLCBpZiBzcGVjaWZpZWQsIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHN0cmluZworICAgIG9mIGV2ZXJ5IEpTT04gaW50IHRvIGJlIGRlY29kZWQuIEJ5IGRlZmF1bHQgdGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAgaW50KG51bV9zdHIpLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHVzZSBhbm90aGVyIGRhdGF0eXBlIG9yIHBhcnNlcgorICAgIGZvciBKU09OIGludGVnZXJzIChlLmcuIGZsb2F0KS4KKworICAgIGBgcGFyc2VfY29uc3RhbnRgYCwgaWYgc3BlY2lmaWVkLCB3aWxsIGJlIGNhbGxlZCB3aXRoIG9uZSBvZiB0aGUKKyAgICBmb2xsb3dpbmcgc3RyaW5nczogLUluZmluaXR5LCBJbmZpbml0eSwgTmFOLCBudWxsLCB0cnVlLCBmYWxzZS4KKyAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBpbnZhbGlkIEpTT04gbnVtYmVycworICAgIGFyZSBlbmNvdW50ZXJlZC4KKworICAgIFRvIHVzZSBhIGN1c3RvbSBgYEpTT05EZWNvZGVyYGAgc3ViY2xhc3MsIHNwZWNpZnkgaXQgd2l0aCB0aGUgYGBjbHNgYAorICAgIGt3YXJnOyBvdGhlcndpc2UgYGBKU09ORGVjb2RlcmBgIGlzIHVzZWQuCisKKyAgICAiIiIKKyAgICBpZiAoY2xzIGlzIE5vbmUgYW5kIGVuY29kaW5nIGlzIE5vbmUgYW5kIG9iamVjdF9ob29rIGlzIE5vbmUgYW5kCisgICAgICAgICAgICBwYXJzZV9pbnQgaXMgTm9uZSBhbmQgcGFyc2VfZmxvYXQgaXMgTm9uZSBhbmQKKyAgICAgICAgICAgIHBhcnNlX2NvbnN0YW50IGlzIE5vbmUgYW5kIG9iamVjdF9wYWlyc19ob29rIGlzIE5vbmUgYW5kIG5vdCBrdyk6CisgICAgICAgIHJldHVybiBfZGVmYXVsdF9kZWNvZGVyLmRlY29kZShzKQorICAgIGlmIGNscyBpcyBOb25lOgorICAgICAgICBjbHMgPSBKU09ORGVjb2RlcgorICAgIGlmIG9iamVjdF9ob29rIGlzIG5vdCBOb25lOgorICAgICAgICBrd1snb2JqZWN0X2hvb2snXSA9IG9iamVjdF9ob29rCisgICAgaWYgb2JqZWN0X3BhaXJzX2hvb2sgaXMgbm90IE5vbmU6CisgICAgICAgIGt3WydvYmplY3RfcGFpcnNfaG9vayddID0gb2JqZWN0X3BhaXJzX2hvb2sKKyAgICBpZiBwYXJzZV9mbG9hdCBpcyBub3QgTm9uZToKKyAgICAgICAga3dbJ3BhcnNlX2Zsb2F0J10gPSBwYXJzZV9mbG9hdAorICAgIGlmIHBhcnNlX2ludCBpcyBub3QgTm9uZToKKyAgICAgICAga3dbJ3BhcnNlX2ludCddID0gcGFyc2VfaW50CisgICAgaWYgcGFyc2VfY29uc3RhbnQgaXMgbm90IE5vbmU6CisgICAgICAgIGt3WydwYXJzZV9jb25zdGFudCddID0gcGFyc2VfY29uc3RhbnQKKyAgICByZXR1cm4gY2xzKGVuY29kaW5nPWVuY29kaW5nLCAqKmt3KS5kZWNvZGUocykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzA3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzA3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi9kZWNvZGVyLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL2RlY29kZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjYzYyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi9kZWNvZGVyLnB5CkBAIC0wLDAgKzEsMzg0IEBACisiIiJJbXBsZW1lbnRhdGlvbiBvZiBKU09ORGVjb2RlcgorIiIiCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdHJ1Y3QKKworZnJvbSBqc29uIGltcG9ydCBzY2FubmVyCit0cnk6CisgICAgZnJvbSBfanNvbiBpbXBvcnQgc2NhbnN0cmluZyBhcyBjX3NjYW5zdHJpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBjX3NjYW5zdHJpbmcgPSBOb25lCisKK19fYWxsX18gPSBbJ0pTT05EZWNvZGVyJ10KKworRkxBR1MgPSByZS5WRVJCT1NFIHwgcmUuTVVMVElMSU5FIHwgcmUuRE9UQUxMCisKK2RlZiBfZmxvYXRjb25zdGFudHMoKToKKyAgICBfQllURVMgPSAnN0ZGODAwMDAwMDAwMDAwMDdGRjAwMDAwMDAwMDAwMDAnLmRlY29kZSgnaGV4JykKKyAgICBpZiBzeXMuYnl0ZW9yZGVyICE9ICdiaWcnOgorICAgICAgICBfQllURVMgPSBfQllURVNbOjhdWzo6LTFdICsgX0JZVEVTWzg6XVs6Oi0xXQorICAgIG5hbiwgaW5mID0gc3RydWN0LnVucGFjaygnZGQnLCBfQllURVMpCisgICAgcmV0dXJuIG5hbiwgaW5mLCAtaW5mCisKK05hTiwgUG9zSW5mLCBOZWdJbmYgPSBfZmxvYXRjb25zdGFudHMoKQorCisKK2RlZiBsaW5lY29sKGRvYywgcG9zKToKKyAgICBsaW5lbm8gPSBkb2MuY291bnQoJ1xuJywgMCwgcG9zKSArIDEKKyAgICBpZiBsaW5lbm8gPT0gMToKKyAgICAgICAgY29sbm8gPSBwb3MgKyAxCisgICAgZWxzZToKKyAgICAgICAgY29sbm8gPSBwb3MgLSBkb2MucmluZGV4KCdcbicsIDAsIHBvcykKKyAgICByZXR1cm4gbGluZW5vLCBjb2xubworCisKK2RlZiBlcnJtc2cobXNnLCBkb2MsIHBvcywgZW5kPU5vbmUpOgorICAgICMgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gX2pzb24KKyAgICBsaW5lbm8sIGNvbG5vID0gbGluZWNvbChkb2MsIHBvcykKKyAgICBpZiBlbmQgaXMgTm9uZToKKyAgICAgICAgZm10ID0gJ3swfTogbGluZSB7MX0gY29sdW1uIHsyfSAoY2hhciB7M30pJworICAgICAgICByZXR1cm4gZm10LmZvcm1hdChtc2csIGxpbmVubywgY29sbm8sIHBvcykKKyAgICAgICAgI2ZtdCA9ICclczogbGluZSAlZCBjb2x1bW4gJWQgKGNoYXIgJWQpJworICAgICAgICAjcmV0dXJuIGZtdCAlIChtc2csIGxpbmVubywgY29sbm8sIHBvcykKKyAgICBlbmRsaW5lbm8sIGVuZGNvbG5vID0gbGluZWNvbChkb2MsIGVuZCkKKyAgICBmbXQgPSAnezB9OiBsaW5lIHsxfSBjb2x1bW4gezJ9IC0gbGluZSB7M30gY29sdW1uIHs0fSAoY2hhciB7NX0gLSB7Nn0pJworICAgIHJldHVybiBmbXQuZm9ybWF0KG1zZywgbGluZW5vLCBjb2xubywgZW5kbGluZW5vLCBlbmRjb2xubywgcG9zLCBlbmQpCisgICAgI2ZtdCA9ICclczogbGluZSAlZCBjb2x1bW4gJWQgLSBsaW5lICVkIGNvbHVtbiAlZCAoY2hhciAlZCAtICVkKScKKyAgICAjcmV0dXJuIGZtdCAlIChtc2csIGxpbmVubywgY29sbm8sIGVuZGxpbmVubywgZW5kY29sbm8sIHBvcywgZW5kKQorCisKK19DT05TVEFOVFMgPSB7CisgICAgJy1JbmZpbml0eSc6IE5lZ0luZiwKKyAgICAnSW5maW5pdHknOiBQb3NJbmYsCisgICAgJ05hTic6IE5hTiwKK30KKworU1RSSU5HQ0hVTksgPSByZS5jb21waWxlKHInKC4qPykoWyJcXFx4MDAtXHgxZl0pJywgRkxBR1MpCitCQUNLU0xBU0ggPSB7CisgICAgJyInOiB1JyInLCAnXFwnOiB1J1xcJywgJy8nOiB1Jy8nLAorICAgICdiJzogdSdcYicsICdmJzogdSdcZicsICduJzogdSdcbicsICdyJzogdSdccicsICd0JzogdSdcdCcsCit9CisKK0RFRkFVTFRfRU5DT0RJTkcgPSAidXRmLTgiCisKK2RlZiBweV9zY2Fuc3RyaW5nKHMsIGVuZCwgZW5jb2Rpbmc9Tm9uZSwgc3RyaWN0PVRydWUsCisgICAgICAgIF9iPUJBQ0tTTEFTSCwgX209U1RSSU5HQ0hVTksubWF0Y2gpOgorICAgICIiIlNjYW4gdGhlIHN0cmluZyBzIGZvciBhIEpTT04gc3RyaW5nLiBFbmQgaXMgdGhlIGluZGV4IG9mIHRoZQorICAgIGNoYXJhY3RlciBpbiBzIGFmdGVyIHRoZSBxdW90ZSB0aGF0IHN0YXJ0ZWQgdGhlIEpTT04gc3RyaW5nLgorICAgIFVuZXNjYXBlcyBhbGwgdmFsaWQgSlNPTiBzdHJpbmcgZXNjYXBlIHNlcXVlbmNlcyBhbmQgcmFpc2VzIFZhbHVlRXJyb3IKKyAgICBvbiBhdHRlbXB0IHRvIGRlY29kZSBhbiBpbnZhbGlkIHN0cmluZy4gSWYgc3RyaWN0IGlzIEZhbHNlIHRoZW4gbGl0ZXJhbAorICAgIGNvbnRyb2wgY2hhcmFjdGVycyBhcmUgYWxsb3dlZCBpbiB0aGUgc3RyaW5nLgorCisgICAgUmV0dXJucyBhIHR1cGxlIG9mIHRoZSBkZWNvZGVkIHN0cmluZyBhbmQgdGhlIGluZGV4IG9mIHRoZSBjaGFyYWN0ZXIgaW4gcworICAgIGFmdGVyIHRoZSBlbmQgcXVvdGUuIiIiCisgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgZW5jb2RpbmcgPSBERUZBVUxUX0VOQ09ESU5HCisgICAgY2h1bmtzID0gW10KKyAgICBfYXBwZW5kID0gY2h1bmtzLmFwcGVuZAorICAgIGJlZ2luID0gZW5kIC0gMQorICAgIHdoaWxlIDE6CisgICAgICAgIGNodW5rID0gX20ocywgZW5kKQorICAgICAgICBpZiBjaHVuayBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICBlcnJtc2coIlVudGVybWluYXRlZCBzdHJpbmcgc3RhcnRpbmcgYXQiLCBzLCBiZWdpbikpCisgICAgICAgIGVuZCA9IGNodW5rLmVuZCgpCisgICAgICAgIGNvbnRlbnQsIHRlcm1pbmF0b3IgPSBjaHVuay5ncm91cHMoKQorICAgICAgICAjIENvbnRlbnQgaXMgY29udGFpbnMgemVybyBvciBtb3JlIHVuZXNjYXBlZCBzdHJpbmcgY2hhcmFjdGVycworICAgICAgICBpZiBjb250ZW50OgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY29udGVudCwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgY29udGVudCA9IHVuaWNvZGUoY29udGVudCwgZW5jb2RpbmcpCisgICAgICAgICAgICBfYXBwZW5kKGNvbnRlbnQpCisgICAgICAgICMgVGVybWluYXRvciBpcyB0aGUgZW5kIG9mIHN0cmluZywgYSBsaXRlcmFsIGNvbnRyb2wgY2hhcmFjdGVyLAorICAgICAgICAjIG9yIGEgYmFja3NsYXNoIGRlbm90aW5nIHRoYXQgYW4gZXNjYXBlIHNlcXVlbmNlIGZvbGxvd3MKKyAgICAgICAgaWYgdGVybWluYXRvciA9PSAnIic6CisgICAgICAgICAgICBicmVhaworICAgICAgICBlbGlmIHRlcm1pbmF0b3IgIT0gJ1xcJzoKKyAgICAgICAgICAgIGlmIHN0cmljdDoKKyAgICAgICAgICAgICAgICAjbXNnID0gIkludmFsaWQgY29udHJvbCBjaGFyYWN0ZXIgJXIgYXQiICUgKHRlcm1pbmF0b3IsKQorICAgICAgICAgICAgICAgIG1zZyA9ICJJbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVyIHswIXJ9IGF0Ii5mb3JtYXQodGVybWluYXRvcikKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZyhtc2csIHMsIGVuZCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIF9hcHBlbmQodGVybWluYXRvcikKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBlc2MgPSBzW2VuZF0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgIGVycm1zZygiVW50ZXJtaW5hdGVkIHN0cmluZyBzdGFydGluZyBhdCIsIHMsIGJlZ2luKSkKKyAgICAgICAgIyBJZiBub3QgYSB1bmljb2RlIGVzY2FwZSBzZXF1ZW5jZSwgbXVzdCBiZSBpbiB0aGUgbG9va3VwIHRhYmxlCisgICAgICAgIGlmIGVzYyAhPSAndSc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2hhciA9IF9iW2VzY10KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBtc2cgPSAiSW52YWxpZCBcXGVzY2FwZTogIiArIHJlcHIoZXNjKQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJybXNnKG1zZywgcywgZW5kKSkKKyAgICAgICAgICAgIGVuZCArPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlCisgICAgICAgICAgICBlc2MgPSBzW2VuZCArIDE6ZW5kICsgNV0KKyAgICAgICAgICAgIG5leHRfZW5kID0gZW5kICsgNQorICAgICAgICAgICAgaWYgbGVuKGVzYykgIT0gNDoKKyAgICAgICAgICAgICAgICBtc2cgPSAiSW52YWxpZCBcXHVYWFhYIGVzY2FwZSIKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZyhtc2csIHMsIGVuZCkpCisgICAgICAgICAgICB1bmkgPSBpbnQoZXNjLCAxNikKKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIHN1cnJvZ2F0ZSBwYWlyIG9uIFVDUy00IHN5c3RlbXMKKyAgICAgICAgICAgIGlmIDB4ZDgwMCA8PSB1bmkgPD0gMHhkYmZmIGFuZCBzeXMubWF4dW5pY29kZSA+IDY1NTM1OgorICAgICAgICAgICAgICAgIG1zZyA9ICJJbnZhbGlkIFxcdVhYWFhcXHVYWFhYIHN1cnJvZ2F0ZSBwYWlyIgorICAgICAgICAgICAgICAgIGlmIG5vdCBzW2VuZCArIDU6ZW5kICsgN10gPT0gJ1xcdSc6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJybXNnKG1zZywgcywgZW5kKSkKKyAgICAgICAgICAgICAgICBlc2MyID0gc1tlbmQgKyA3OmVuZCArIDExXQorICAgICAgICAgICAgICAgIGlmIGxlbihlc2MyKSAhPSA0OgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZyhtc2csIHMsIGVuZCkpCisgICAgICAgICAgICAgICAgdW5pMiA9IGludChlc2MyLCAxNikKKyAgICAgICAgICAgICAgICB1bmkgPSAweDEwMDAwICsgKCgodW5pIC0gMHhkODAwKSA8PCAxMCkgfCAodW5pMiAtIDB4ZGMwMCkpCisgICAgICAgICAgICAgICAgbmV4dF9lbmQgKz0gNgorICAgICAgICAgICAgY2hhciA9IHVuaWNocih1bmkpCisgICAgICAgICAgICBlbmQgPSBuZXh0X2VuZAorICAgICAgICAjIEFwcGVuZCB0aGUgdW5lc2NhcGVkIGNoYXJhY3RlcgorICAgICAgICBfYXBwZW5kKGNoYXIpCisgICAgcmV0dXJuIHUnJy5qb2luKGNodW5rcyksIGVuZAorCisKKyMgVXNlIHNwZWVkdXAgaWYgYXZhaWxhYmxlCitzY2Fuc3RyaW5nID0gY19zY2Fuc3RyaW5nIG9yIHB5X3NjYW5zdHJpbmcKKworV0hJVEVTUEFDRSA9IHJlLmNvbXBpbGUocidbIFx0XG5ccl0qJywgRkxBR1MpCitXSElURVNQQUNFX1NUUiA9ICcgXHRcblxyJworCitkZWYgSlNPTk9iamVjdChzX2FuZF9lbmQsIGVuY29kaW5nLCBzdHJpY3QsIHNjYW5fb25jZSwgb2JqZWN0X2hvb2ssCisgICAgICAgICAgICAgICBvYmplY3RfcGFpcnNfaG9vaywgX3c9V0hJVEVTUEFDRS5tYXRjaCwgX3dzPVdISVRFU1BBQ0VfU1RSKToKKyAgICBzLCBlbmQgPSBzX2FuZF9lbmQKKyAgICBwYWlycyA9IFtdCisgICAgcGFpcnNfYXBwZW5kID0gcGFpcnMuYXBwZW5kCisgICAgIyBVc2UgYSBzbGljZSB0byBwcmV2ZW50IEluZGV4RXJyb3IgZnJvbSBiZWluZyByYWlzZWQsIHRoZSBmb2xsb3dpbmcKKyAgICAjIGNoZWNrIHdpbGwgcmFpc2UgYSBtb3JlIHNwZWNpZmljIFZhbHVlRXJyb3IgaWYgdGhlIHN0cmluZyBpcyBlbXB0eQorICAgIG5leHRjaGFyID0gc1tlbmQ6ZW5kICsgMV0KKyAgICAjIE5vcm1hbGx5IHdlIGV4cGVjdCBuZXh0Y2hhciA9PSAnIicKKyAgICBpZiBuZXh0Y2hhciAhPSAnIic6CisgICAgICAgIGlmIG5leHRjaGFyIGluIF93czoKKyAgICAgICAgICAgIGVuZCA9IF93KHMsIGVuZCkuZW5kKCkKKyAgICAgICAgICAgIG5leHRjaGFyID0gc1tlbmQ6ZW5kICsgMV0KKyAgICAgICAgIyBUcml2aWFsIGVtcHR5IG9iamVjdAorICAgICAgICBpZiBuZXh0Y2hhciA9PSAnfSc6CisgICAgICAgICAgICBpZiBvYmplY3RfcGFpcnNfaG9vayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBvYmplY3RfcGFpcnNfaG9vayhwYWlycykKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LCBlbmQgKyAxCisgICAgICAgICAgICBwYWlycyA9IHt9CisgICAgICAgICAgICBpZiBvYmplY3RfaG9vayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBwYWlycyA9IG9iamVjdF9ob29rKHBhaXJzKQorICAgICAgICAgICAgcmV0dXJuIHBhaXJzLCBlbmQgKyAxCisgICAgICAgIGVsaWYgbmV4dGNoYXIgIT0gJyInOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2coCisgICAgICAgICAgICAgICAgIkV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMiLCBzLCBlbmQpKQorICAgIGVuZCArPSAxCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAga2V5LCBlbmQgPSBzY2Fuc3RyaW5nKHMsIGVuZCwgZW5jb2RpbmcsIHN0cmljdCkKKworICAgICAgICAjIFRvIHNraXAgc29tZSBmdW5jdGlvbiBjYWxsIG92ZXJoZWFkIHdlIG9wdGltaXplIHRoZSBmYXN0IHBhdGhzIHdoZXJlCisgICAgICAgICMgdGhlIEpTT04ga2V5IHNlcGFyYXRvciBpcyAiOiAiIG9yIGp1c3QgIjoiLgorICAgICAgICBpZiBzW2VuZDplbmQgKyAxXSAhPSAnOic6CisgICAgICAgICAgICBlbmQgPSBfdyhzLCBlbmQpLmVuZCgpCisgICAgICAgICAgICBpZiBzW2VuZDplbmQgKyAxXSAhPSAnOic6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2coIkV4cGVjdGluZyAnOicgZGVsaW1pdGVyIiwgcywgZW5kKSkKKyAgICAgICAgZW5kICs9IDEKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzW2VuZF0gaW4gX3dzOgorICAgICAgICAgICAgICAgIGVuZCArPSAxCisgICAgICAgICAgICAgICAgaWYgc1tlbmRdIGluIF93czoKKyAgICAgICAgICAgICAgICAgICAgZW5kID0gX3cocywgZW5kICsgMSkuZW5kKCkKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUsIGVuZCA9IHNjYW5fb25jZShzLCBlbmQpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2coIkV4cGVjdGluZyBvYmplY3QiLCBzLCBlbmQpKQorICAgICAgICBwYWlyc19hcHBlbmQoKGtleSwgdmFsdWUpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHRjaGFyID0gc1tlbmRdCisgICAgICAgICAgICBpZiBuZXh0Y2hhciBpbiBfd3M6CisgICAgICAgICAgICAgICAgZW5kID0gX3cocywgZW5kICsgMSkuZW5kKCkKKyAgICAgICAgICAgICAgICBuZXh0Y2hhciA9IHNbZW5kXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIG5leHRjaGFyID0gJycKKyAgICAgICAgZW5kICs9IDEKKworICAgICAgICBpZiBuZXh0Y2hhciA9PSAnfSc6CisgICAgICAgICAgICBicmVhaworICAgICAgICBlbGlmIG5leHRjaGFyICE9ICcsJzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJybXNnKCJFeHBlY3RpbmcgJywnIGRlbGltaXRlciIsIHMsIGVuZCAtIDEpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHRjaGFyID0gc1tlbmRdCisgICAgICAgICAgICBpZiBuZXh0Y2hhciBpbiBfd3M6CisgICAgICAgICAgICAgICAgZW5kICs9IDEKKyAgICAgICAgICAgICAgICBuZXh0Y2hhciA9IHNbZW5kXQorICAgICAgICAgICAgICAgIGlmIG5leHRjaGFyIGluIF93czoKKyAgICAgICAgICAgICAgICAgICAgZW5kID0gX3cocywgZW5kICsgMSkuZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgbmV4dGNoYXIgPSBzW2VuZF0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBuZXh0Y2hhciA9ICcnCisKKyAgICAgICAgZW5kICs9IDEKKyAgICAgICAgaWYgbmV4dGNoYXIgIT0gJyInOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2coCisgICAgICAgICAgICAgICAgIkV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMiLCBzLCBlbmQgLSAxKSkKKyAgICBpZiBvYmplY3RfcGFpcnNfaG9vayBpcyBub3QgTm9uZToKKyAgICAgICAgcmVzdWx0ID0gb2JqZWN0X3BhaXJzX2hvb2socGFpcnMpCisgICAgICAgIHJldHVybiByZXN1bHQsIGVuZAorICAgIHBhaXJzID0gZGljdChwYWlycykKKyAgICBpZiBvYmplY3RfaG9vayBpcyBub3QgTm9uZToKKyAgICAgICAgcGFpcnMgPSBvYmplY3RfaG9vayhwYWlycykKKyAgICByZXR1cm4gcGFpcnMsIGVuZAorCitkZWYgSlNPTkFycmF5KHNfYW5kX2VuZCwgc2Nhbl9vbmNlLCBfdz1XSElURVNQQUNFLm1hdGNoLCBfd3M9V0hJVEVTUEFDRV9TVFIpOgorICAgIHMsIGVuZCA9IHNfYW5kX2VuZAorICAgIHZhbHVlcyA9IFtdCisgICAgbmV4dGNoYXIgPSBzW2VuZDplbmQgKyAxXQorICAgIGlmIG5leHRjaGFyIGluIF93czoKKyAgICAgICAgZW5kID0gX3cocywgZW5kICsgMSkuZW5kKCkKKyAgICAgICAgbmV4dGNoYXIgPSBzW2VuZDplbmQgKyAxXQorICAgICMgTG9vay1haGVhZCBmb3IgdHJpdmlhbCBlbXB0eSBhcnJheQorICAgIGlmIG5leHRjaGFyID09ICddJzoKKyAgICAgICAgcmV0dXJuIHZhbHVlcywgZW5kICsgMQorICAgIF9hcHBlbmQgPSB2YWx1ZXMuYXBwZW5kCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUsIGVuZCA9IHNjYW5fb25jZShzLCBlbmQpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2coIkV4cGVjdGluZyBvYmplY3QiLCBzLCBlbmQpKQorICAgICAgICBfYXBwZW5kKHZhbHVlKQorICAgICAgICBuZXh0Y2hhciA9IHNbZW5kOmVuZCArIDFdCisgICAgICAgIGlmIG5leHRjaGFyIGluIF93czoKKyAgICAgICAgICAgIGVuZCA9IF93KHMsIGVuZCArIDEpLmVuZCgpCisgICAgICAgICAgICBuZXh0Y2hhciA9IHNbZW5kOmVuZCArIDFdCisgICAgICAgIGVuZCArPSAxCisgICAgICAgIGlmIG5leHRjaGFyID09ICddJzoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsaWYgbmV4dGNoYXIgIT0gJywnOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2coIkV4cGVjdGluZyAnLCcgZGVsaW1pdGVyIiwgcywgZW5kKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc1tlbmRdIGluIF93czoKKyAgICAgICAgICAgICAgICBlbmQgKz0gMQorICAgICAgICAgICAgICAgIGlmIHNbZW5kXSBpbiBfd3M6CisgICAgICAgICAgICAgICAgICAgIGVuZCA9IF93KHMsIGVuZCArIDEpLmVuZCgpCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgcmV0dXJuIHZhbHVlcywgZW5kCisKK2NsYXNzIEpTT05EZWNvZGVyKG9iamVjdCk6CisgICAgIiIiU2ltcGxlIEpTT04gPGh0dHA6Ly9qc29uLm9yZz4gZGVjb2RlcgorCisgICAgUGVyZm9ybXMgdGhlIGZvbGxvd2luZyB0cmFuc2xhdGlvbnMgaW4gZGVjb2RpbmcgYnkgZGVmYXVsdDoKKworICAgICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IEpTT04gICAgICAgICAgfCBQeXRob24gICAgICAgICAgICB8CisgICAgKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09KworICAgIHwgb2JqZWN0ICAgICAgICB8IGRpY3QgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCBhcnJheSAgICAgICAgIHwgbGlzdCAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IHN0cmluZyAgICAgICAgfCB1bmljb2RlICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgbnVtYmVyIChpbnQpICB8IGludCwgbG9uZyAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCBudW1iZXIgKHJlYWwpIHwgZmxvYXQgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IHRydWUgICAgICAgICAgfCBUcnVlICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgZmFsc2UgICAgICAgICB8IEZhbHNlICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCBudWxsICAgICAgICAgIHwgTm9uZSAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsKKworICAgIEl0IGFsc28gdW5kZXJzdGFuZHMgYGBOYU5gYCwgYGBJbmZpbml0eWBgLCBhbmQgYGAtSW5maW5pdHlgYCBhcworICAgIHRoZWlyIGNvcnJlc3BvbmRpbmcgYGBmbG9hdGBgIHZhbHVlcywgd2hpY2ggaXMgb3V0c2lkZSB0aGUgSlNPTiBzcGVjLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZW5jb2Rpbmc9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwKKyAgICAgICAgICAgIHBhcnNlX2ludD1Ob25lLCBwYXJzZV9jb25zdGFudD1Ob25lLCBzdHJpY3Q9VHJ1ZSwKKyAgICAgICAgICAgIG9iamVjdF9wYWlyc19ob29rPU5vbmUpOgorICAgICAgICAiIiJgYGVuY29kaW5nYGAgZGV0ZXJtaW5lcyB0aGUgZW5jb2RpbmcgdXNlZCB0byBpbnRlcnByZXQgYW55IGBgc3RyYGAKKyAgICAgICAgb2JqZWN0cyBkZWNvZGVkIGJ5IHRoaXMgaW5zdGFuY2UgKHV0Zi04IGJ5IGRlZmF1bHQpLiAgSXQgaGFzIG5vCisgICAgICAgIGVmZmVjdCB3aGVuIGRlY29kaW5nIGBgdW5pY29kZWBgIG9iamVjdHMuCisKKyAgICAgICAgTm90ZSB0aGF0IGN1cnJlbnRseSBvbmx5IGVuY29kaW5ncyB0aGF0IGFyZSBhIHN1cGVyc2V0IG9mIEFTQ0lJIHdvcmssCisgICAgICAgIHN0cmluZ3Mgb2Ygb3RoZXIgZW5jb2RpbmdzIHNob3VsZCBiZSBwYXNzZWQgaW4gYXMgYGB1bmljb2RlYGAuCisKKyAgICAgICAgYGBvYmplY3RfaG9va2BgLCBpZiBzcGVjaWZpZWQsIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHJlc3VsdAorICAgICAgICBvZiBldmVyeSBKU09OIG9iamVjdCBkZWNvZGVkIGFuZCBpdHMgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdXNlZCBpbgorICAgICAgICBwbGFjZSBvZiB0aGUgZ2l2ZW4gYGBkaWN0YGAuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgY3VzdG9tCisgICAgICAgIGRlc2VyaWFsaXphdGlvbnMgKGUuZy4gdG8gc3VwcG9ydCBKU09OLVJQQyBjbGFzcyBoaW50aW5nKS4KKworICAgICAgICBgYG9iamVjdF9wYWlyc19ob29rYGAsIGlmIHNwZWNpZmllZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSByZXN1bHQgb2YKKyAgICAgICAgZXZlcnkgSlNPTiBvYmplY3QgZGVjb2RlZCB3aXRoIGFuIG9yZGVyZWQgbGlzdCBvZiBwYWlycy4gIFRoZSByZXR1cm4KKyAgICAgICAgdmFsdWUgb2YgYGBvYmplY3RfcGFpcnNfaG9va2BgIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBgYGRpY3RgYC4KKyAgICAgICAgVGhpcyBmZWF0dXJlIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBjdXN0b20gZGVjb2RlcnMgdGhhdCByZWx5IG9uIHRoZQorICAgICAgICBvcmRlciB0aGF0IHRoZSBrZXkgYW5kIHZhbHVlIHBhaXJzIGFyZSBkZWNvZGVkIChmb3IgZXhhbXBsZSwKKyAgICAgICAgY29sbGVjdGlvbnMuT3JkZXJlZERpY3Qgd2lsbCByZW1lbWJlciB0aGUgb3JkZXIgb2YgaW5zZXJ0aW9uKS4gSWYKKyAgICAgICAgYGBvYmplY3RfaG9va2BgIGlzIGFsc28gZGVmaW5lZCwgdGhlIGBgb2JqZWN0X3BhaXJzX2hvb2tgYCB0YWtlcworICAgICAgICBwcmlvcml0eS4KKworICAgICAgICBgYHBhcnNlX2Zsb2F0YGAsIGlmIHNwZWNpZmllZCwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgc3RyaW5nCisgICAgICAgIG9mIGV2ZXJ5IEpTT04gZmxvYXQgdG8gYmUgZGVjb2RlZC4gQnkgZGVmYXVsdCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgICAgZmxvYXQobnVtX3N0cikuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdXNlIGFub3RoZXIgZGF0YXR5cGUgb3IgcGFyc2VyCisgICAgICAgIGZvciBKU09OIGZsb2F0cyAoZS5nLiBkZWNpbWFsLkRlY2ltYWwpLgorCisgICAgICAgIGBgcGFyc2VfaW50YGAsIGlmIHNwZWNpZmllZCwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgc3RyaW5nCisgICAgICAgIG9mIGV2ZXJ5IEpTT04gaW50IHRvIGJlIGRlY29kZWQuIEJ5IGRlZmF1bHQgdGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAgICAgIGludChudW1fc3RyKS4gVGhpcyBjYW4gYmUgdXNlZCB0byB1c2UgYW5vdGhlciBkYXRhdHlwZSBvciBwYXJzZXIKKyAgICAgICAgZm9yIEpTT04gaW50ZWdlcnMgKGUuZy4gZmxvYXQpLgorCisgICAgICAgIGBgcGFyc2VfY29uc3RhbnRgYCwgaWYgc3BlY2lmaWVkLCB3aWxsIGJlIGNhbGxlZCB3aXRoIG9uZSBvZiB0aGUKKyAgICAgICAgZm9sbG93aW5nIHN0cmluZ3M6IC1JbmZpbml0eSwgSW5maW5pdHksIE5hTi4KKyAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCB0byByYWlzZSBhbiBleGNlcHRpb24gaWYgaW52YWxpZCBKU09OIG51bWJlcnMKKyAgICAgICAgYXJlIGVuY291bnRlcmVkLgorCisgICAgICAgIElmIGBgc3RyaWN0YGAgaXMgZmFsc2UgKHRydWUgaXMgdGhlIGRlZmF1bHQpLCB0aGVuIGNvbnRyb2wKKyAgICAgICAgY2hhcmFjdGVycyB3aWxsIGJlIGFsbG93ZWQgaW5zaWRlIHN0cmluZ3MuICBDb250cm9sIGNoYXJhY3RlcnMgaW4KKyAgICAgICAgdGhpcyBjb250ZXh0IGFyZSB0aG9zZSB3aXRoIGNoYXJhY3RlciBjb2RlcyBpbiB0aGUgMC0zMSByYW5nZSwKKyAgICAgICAgaW5jbHVkaW5nIGBgJ1xcdCdgYCAodGFiKSwgYGAnXFxuJ2BgLCBgYCdcXHInYGAgYW5kIGBgJ1xcMCdgYC4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgIHNlbGYub2JqZWN0X2hvb2sgPSBvYmplY3RfaG9vaworICAgICAgICBzZWxmLm9iamVjdF9wYWlyc19ob29rID0gb2JqZWN0X3BhaXJzX2hvb2sKKyAgICAgICAgc2VsZi5wYXJzZV9mbG9hdCA9IHBhcnNlX2Zsb2F0IG9yIGZsb2F0CisgICAgICAgIHNlbGYucGFyc2VfaW50ID0gcGFyc2VfaW50IG9yIGludAorICAgICAgICBzZWxmLnBhcnNlX2NvbnN0YW50ID0gcGFyc2VfY29uc3RhbnQgb3IgX0NPTlNUQU5UUy5fX2dldGl0ZW1fXworICAgICAgICBzZWxmLnN0cmljdCA9IHN0cmljdAorICAgICAgICBzZWxmLnBhcnNlX29iamVjdCA9IEpTT05PYmplY3QKKyAgICAgICAgc2VsZi5wYXJzZV9hcnJheSA9IEpTT05BcnJheQorICAgICAgICBzZWxmLnBhcnNlX3N0cmluZyA9IHNjYW5zdHJpbmcKKyAgICAgICAgc2VsZi5zY2FuX29uY2UgPSBzY2FubmVyLm1ha2Vfc2Nhbm5lcihzZWxmKQorCisgICAgZGVmIGRlY29kZShzZWxmLCBzLCBfdz1XSElURVNQQUNFLm1hdGNoKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBQeXRob24gcmVwcmVzZW50YXRpb24gb2YgYGBzYGAgKGEgYGBzdHJgYCBvciBgYHVuaWNvZGVgYAorICAgICAgICBpbnN0YW5jZSBjb250YWluaW5nIGEgSlNPTiBkb2N1bWVudCkKKworICAgICAgICAiIiIKKyAgICAgICAgb2JqLCBlbmQgPSBzZWxmLnJhd19kZWNvZGUocywgaWR4PV93KHMsIDApLmVuZCgpKQorICAgICAgICBlbmQgPSBfdyhzLCBlbmQpLmVuZCgpCisgICAgICAgIGlmIGVuZCAhPSBsZW4ocyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZygiRXh0cmEgZGF0YSIsIHMsIGVuZCwgbGVuKHMpKSkKKyAgICAgICAgcmV0dXJuIG9iagorCisgICAgZGVmIHJhd19kZWNvZGUoc2VsZiwgcywgaWR4PTApOgorICAgICAgICAiIiJEZWNvZGUgYSBKU09OIGRvY3VtZW50IGZyb20gYGBzYGAgKGEgYGBzdHJgYCBvciBgYHVuaWNvZGVgYAorICAgICAgICBiZWdpbm5pbmcgd2l0aCBhIEpTT04gZG9jdW1lbnQpIGFuZCByZXR1cm4gYSAyLXR1cGxlIG9mIHRoZSBQeXRob24KKyAgICAgICAgcmVwcmVzZW50YXRpb24gYW5kIHRoZSBpbmRleCBpbiBgYHNgYCB3aGVyZSB0aGUgZG9jdW1lbnQgZW5kZWQuCisKKyAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCB0byBkZWNvZGUgYSBKU09OIGRvY3VtZW50IGZyb20gYSBzdHJpbmcgdGhhdCBtYXkKKyAgICAgICAgaGF2ZSBleHRyYW5lb3VzIGRhdGEgYXQgdGhlIGVuZC4KKworICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2JqLCBlbmQgPSBzZWxmLnNjYW5fb25jZShzLCBpZHgpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm8gSlNPTiBvYmplY3QgY291bGQgYmUgZGVjb2RlZCIpCisgICAgICAgIHJldHVybiBvYmosIGVuZApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL2RlY29kZXIucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL2RlY29kZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTZhYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vZGVjb2Rlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL2RlY29kZXIucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL2RlY29kZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTZhYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vZGVjb2Rlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL2VuY29kZXIucHkgYi9saWIvcHl0aG9uMi43L2pzb24vZW5jb2Rlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWVlZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL2VuY29kZXIucHkKQEAgLTAsMCArMSw0NDggQEAKKyIiIkltcGxlbWVudGF0aW9uIG9mIEpTT05FbmNvZGVyCisiIiIKK2ltcG9ydCByZQorCit0cnk6CisgICAgZnJvbSBfanNvbiBpbXBvcnQgZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkgYXMgY19lbmNvZGVfYmFzZXN0cmluZ19hc2NpaQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGNfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkgPSBOb25lCit0cnk6CisgICAgZnJvbSBfanNvbiBpbXBvcnQgbWFrZV9lbmNvZGVyIGFzIGNfbWFrZV9lbmNvZGVyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgY19tYWtlX2VuY29kZXIgPSBOb25lCisKK0VTQ0FQRSA9IHJlLmNvbXBpbGUocidbXHgwMC1ceDFmXFwiXGJcZlxuXHJcdF0nKQorRVNDQVBFX0FTQ0lJID0gcmUuY29tcGlsZShyJyhbXFwiXXxbXlwgLX5dKScpCitIQVNfVVRGOCA9IHJlLmNvbXBpbGUocidbXHg4MC1ceGZmXScpCitFU0NBUEVfRENUID0geworICAgICdcXCc6ICdcXFxcJywKKyAgICAnIic6ICdcXCInLAorICAgICdcYic6ICdcXGInLAorICAgICdcZic6ICdcXGYnLAorICAgICdcbic6ICdcXG4nLAorICAgICdccic6ICdcXHInLAorICAgICdcdCc6ICdcXHQnLAorfQorZm9yIGkgaW4gcmFuZ2UoMHgyMCk6CisgICAgRVNDQVBFX0RDVC5zZXRkZWZhdWx0KGNocihpKSwgJ1xcdXswOjA0eH0nLmZvcm1hdChpKSkKKyAgICAjRVNDQVBFX0RDVC5zZXRkZWZhdWx0KGNocihpKSwgJ1xcdSUwNHgnICUgKGksKSkKKworSU5GSU5JVFkgPSBmbG9hdCgnaW5mJykKK0ZMT0FUX1JFUFIgPSByZXByCisKK2RlZiBlbmNvZGVfYmFzZXN0cmluZyhzKToKKyAgICAiIiJSZXR1cm4gYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgUHl0aG9uIHN0cmluZworCisgICAgIiIiCisgICAgZGVmIHJlcGxhY2UobWF0Y2gpOgorICAgICAgICByZXR1cm4gRVNDQVBFX0RDVFttYXRjaC5ncm91cCgwKV0KKyAgICByZXR1cm4gJyInICsgRVNDQVBFLnN1YihyZXBsYWNlLCBzKSArICciJworCisKK2RlZiBweV9lbmNvZGVfYmFzZXN0cmluZ19hc2NpaShzKToKKyAgICAiIiJSZXR1cm4gYW4gQVNDSUktb25seSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgUHl0aG9uIHN0cmluZworCisgICAgIiIiCisgICAgaWYgaXNpbnN0YW5jZShzLCBzdHIpIGFuZCBIQVNfVVRGOC5zZWFyY2gocykgaXMgbm90IE5vbmU6CisgICAgICAgIHMgPSBzLmRlY29kZSgndXRmLTgnKQorICAgIGRlZiByZXBsYWNlKG1hdGNoKToKKyAgICAgICAgcyA9IG1hdGNoLmdyb3VwKDApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBFU0NBUEVfRENUW3NdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIG4gPSBvcmQocykKKyAgICAgICAgICAgIGlmIG4gPCAweDEwMDAwOgorICAgICAgICAgICAgICAgIHJldHVybiAnXFx1ezA6MDR4fScuZm9ybWF0KG4pCisgICAgICAgICAgICAgICAgI3JldHVybiAnXFx1JTA0eCcgJSAobiwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgc3Vycm9nYXRlIHBhaXIKKyAgICAgICAgICAgICAgICBuIC09IDB4MTAwMDAKKyAgICAgICAgICAgICAgICBzMSA9IDB4ZDgwMCB8ICgobiA+PiAxMCkgJiAweDNmZikKKyAgICAgICAgICAgICAgICBzMiA9IDB4ZGMwMCB8IChuICYgMHgzZmYpCisgICAgICAgICAgICAgICAgcmV0dXJuICdcXHV7MDowNHh9XFx1ezE6MDR4fScuZm9ybWF0KHMxLCBzMikKKyAgICAgICAgICAgICAgICAjcmV0dXJuICdcXHUlMDR4XFx1JTA0eCcgJSAoczEsIHMyKQorICAgIHJldHVybiAnIicgKyBzdHIoRVNDQVBFX0FTQ0lJLnN1YihyZXBsYWNlLCBzKSkgKyAnIicKKworCitlbmNvZGVfYmFzZXN0cmluZ19hc2NpaSA9ICgKKyAgICBjX2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpIG9yIHB5X2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpKQorCitjbGFzcyBKU09ORW5jb2RlcihvYmplY3QpOgorICAgICIiIkV4dGVuc2libGUgSlNPTiA8aHR0cDovL2pzb24ub3JnPiBlbmNvZGVyIGZvciBQeXRob24gZGF0YSBzdHJ1Y3R1cmVzLgorCisgICAgU3VwcG9ydHMgdGhlIGZvbGxvd2luZyBvYmplY3RzIGFuZCB0eXBlcyBieSBkZWZhdWx0OgorCisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworICAgIHwgUHl0aG9uICAgICAgICAgICAgfCBKU09OICAgICAgICAgIHwKKyAgICArPT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT0rCisgICAgfCBkaWN0ICAgICAgICAgICAgICB8IG9iamVjdCAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IGxpc3QsIHR1cGxlICAgICAgIHwgYXJyYXkgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworICAgIHwgc3RyLCB1bmljb2RlICAgICAgfCBzdHJpbmcgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rCisgICAgfCBpbnQsIGxvbmcsIGZsb2F0ICB8IG51bWJlciAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IFRydWUgICAgICAgICAgICAgIHwgdHJ1ZSAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworICAgIHwgRmFsc2UgICAgICAgICAgICAgfCBmYWxzZSAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rCisgICAgfCBOb25lICAgICAgICAgICAgICB8IG51bGwgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKworICAgIFRvIGV4dGVuZCB0aGlzIHRvIHJlY29nbml6ZSBvdGhlciBvYmplY3RzLCBzdWJjbGFzcyBhbmQgaW1wbGVtZW50IGEKKyAgICBgYC5kZWZhdWx0KClgYCBtZXRob2Qgd2l0aCBhbm90aGVyIG1ldGhvZCB0aGF0IHJldHVybnMgYSBzZXJpYWxpemFibGUKKyAgICBvYmplY3QgZm9yIGBgb2BgIGlmIHBvc3NpYmxlLCBvdGhlcndpc2UgaXQgc2hvdWxkIGNhbGwgdGhlIHN1cGVyY2xhc3MKKyAgICBpbXBsZW1lbnRhdGlvbiAodG8gcmFpc2UgYGBUeXBlRXJyb3JgYCkuCisKKyAgICAiIiIKKyAgICBpdGVtX3NlcGFyYXRvciA9ICcsICcKKyAgICBrZXlfc2VwYXJhdG9yID0gJzogJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsCisgICAgICAgICAgICBjaGVja19jaXJjdWxhcj1UcnVlLCBhbGxvd19uYW49VHJ1ZSwgc29ydF9rZXlzPUZhbHNlLAorICAgICAgICAgICAgaW5kZW50PU5vbmUsIHNlcGFyYXRvcnM9Tm9uZSwgZW5jb2Rpbmc9J3V0Zi04JywgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IgZm9yIEpTT05FbmNvZGVyLCB3aXRoIHNlbnNpYmxlIGRlZmF1bHRzLgorCisgICAgICAgIElmIHNraXBrZXlzIGlzIGZhbHNlLCB0aGVuIGl0IGlzIGEgVHlwZUVycm9yIHRvIGF0dGVtcHQKKyAgICAgICAgZW5jb2Rpbmcgb2Yga2V5cyB0aGF0IGFyZSBub3Qgc3RyLCBpbnQsIGxvbmcsIGZsb2F0IG9yIE5vbmUuICBJZgorICAgICAgICBza2lwa2V5cyBpcyBUcnVlLCBzdWNoIGl0ZW1zIGFyZSBzaW1wbHkgc2tpcHBlZC4KKworICAgICAgICBJZiAqZW5zdXJlX2FzY2lpKiBpcyB0cnVlICh0aGUgZGVmYXVsdCksIGFsbCBub24tQVNDSUkKKyAgICAgICAgY2hhcmFjdGVycyBpbiB0aGUgb3V0cHV0IGFyZSBlc2NhcGVkIHdpdGggXHVYWFhYIHNlcXVlbmNlcywKKyAgICAgICAgYW5kIHRoZSByZXN1bHRzIGFyZSBzdHIgaW5zdGFuY2VzIGNvbnNpc3Rpbmcgb2YgQVNDSUkKKyAgICAgICAgY2hhcmFjdGVycyBvbmx5LiAgSWYgZW5zdXJlX2FzY2lpIGlzIEZhbHNlLCBhIHJlc3VsdCBtYXkgYmUgYQorICAgICAgICB1bmljb2RlIGluc3RhbmNlLiAgVGhpcyB1c3VhbGx5IGhhcHBlbnMgaWYgdGhlIGlucHV0IGNvbnRhaW5zCisgICAgICAgIHVuaWNvZGUgc3RyaW5ncyBvciB0aGUgKmVuY29kaW5nKiBwYXJhbWV0ZXIgaXMgdXNlZC4KKworICAgICAgICBJZiBjaGVja19jaXJjdWxhciBpcyB0cnVlLCB0aGVuIGxpc3RzLCBkaWN0cywgYW5kIGN1c3RvbSBlbmNvZGVkCisgICAgICAgIG9iamVjdHMgd2lsbCBiZSBjaGVja2VkIGZvciBjaXJjdWxhciByZWZlcmVuY2VzIGR1cmluZyBlbmNvZGluZyB0bworICAgICAgICBwcmV2ZW50IGFuIGluZmluaXRlIHJlY3Vyc2lvbiAod2hpY2ggd291bGQgY2F1c2UgYW4gT3ZlcmZsb3dFcnJvcikuCisgICAgICAgIE90aGVyd2lzZSwgbm8gc3VjaCBjaGVjayB0YWtlcyBwbGFjZS4KKworICAgICAgICBJZiBhbGxvd19uYW4gaXMgdHJ1ZSwgdGhlbiBOYU4sIEluZmluaXR5LCBhbmQgLUluZmluaXR5IHdpbGwgYmUKKyAgICAgICAgZW5jb2RlZCBhcyBzdWNoLiAgVGhpcyBiZWhhdmlvciBpcyBub3QgSlNPTiBzcGVjaWZpY2F0aW9uIGNvbXBsaWFudCwKKyAgICAgICAgYnV0IGlzIGNvbnNpc3RlbnQgd2l0aCBtb3N0IEphdmFTY3JpcHQgYmFzZWQgZW5jb2RlcnMgYW5kIGRlY29kZXJzLgorICAgICAgICBPdGhlcndpc2UsIGl0IHdpbGwgYmUgYSBWYWx1ZUVycm9yIHRvIGVuY29kZSBzdWNoIGZsb2F0cy4KKworICAgICAgICBJZiBzb3J0X2tleXMgaXMgdHJ1ZSwgdGhlbiB0aGUgb3V0cHV0IG9mIGRpY3Rpb25hcmllcyB3aWxsIGJlCisgICAgICAgIHNvcnRlZCBieSBrZXk7IHRoaXMgaXMgdXNlZnVsIGZvciByZWdyZXNzaW9uIHRlc3RzIHRvIGVuc3VyZQorICAgICAgICB0aGF0IEpTT04gc2VyaWFsaXphdGlvbnMgY2FuIGJlIGNvbXBhcmVkIG9uIGEgZGF5LXRvLWRheSBiYXNpcy4KKworICAgICAgICBJZiBpbmRlbnQgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgdGhlbiBKU09OIGFycmF5CisgICAgICAgIGVsZW1lbnRzIGFuZCBvYmplY3QgbWVtYmVycyB3aWxsIGJlIHByZXR0eS1wcmludGVkIHdpdGggdGhhdAorICAgICAgICBpbmRlbnQgbGV2ZWwuICBBbiBpbmRlbnQgbGV2ZWwgb2YgMCB3aWxsIG9ubHkgaW5zZXJ0IG5ld2xpbmVzLgorICAgICAgICBOb25lIGlzIHRoZSBtb3N0IGNvbXBhY3QgcmVwcmVzZW50YXRpb24uICBTaW5jZSB0aGUgZGVmYXVsdAorICAgICAgICBpdGVtIHNlcGFyYXRvciBpcyAnLCAnLCAgdGhlIG91dHB1dCBtaWdodCBpbmNsdWRlIHRyYWlsaW5nCisgICAgICAgIHdoaXRlc3BhY2Ugd2hlbiBpbmRlbnQgaXMgc3BlY2lmaWVkLiAgWW91IGNhbiB1c2UKKyAgICAgICAgc2VwYXJhdG9ycz0oJywnLCAnOiAnKSB0byBhdm9pZCB0aGlzLgorCisgICAgICAgIElmIHNwZWNpZmllZCwgc2VwYXJhdG9ycyBzaG91bGQgYmUgYSAoaXRlbV9zZXBhcmF0b3IsIGtleV9zZXBhcmF0b3IpCisgICAgICAgIHR1cGxlLiAgVGhlIGRlZmF1bHQgaXMgKCcsICcsICc6ICcpLiAgVG8gZ2V0IHRoZSBtb3N0IGNvbXBhY3QgSlNPTgorICAgICAgICByZXByZXNlbnRhdGlvbiB5b3Ugc2hvdWxkIHNwZWNpZnkgKCcsJywgJzonKSB0byBlbGltaW5hdGUgd2hpdGVzcGFjZS4KKworICAgICAgICBJZiBzcGVjaWZpZWQsIGRlZmF1bHQgaXMgYSBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIGZvciBvYmplY3RzCisgICAgICAgIHRoYXQgY2FuJ3Qgb3RoZXJ3aXNlIGJlIHNlcmlhbGl6ZWQuICBJdCBzaG91bGQgcmV0dXJuIGEgSlNPTiBlbmNvZGFibGUKKyAgICAgICAgdmVyc2lvbiBvZiB0aGUgb2JqZWN0IG9yIHJhaXNlIGEgYGBUeXBlRXJyb3JgYC4KKworICAgICAgICBJZiBlbmNvZGluZyBpcyBub3QgTm9uZSwgdGhlbiBhbGwgaW5wdXQgc3RyaW5ncyB3aWxsIGJlCisgICAgICAgIHRyYW5zZm9ybWVkIGludG8gdW5pY29kZSB1c2luZyB0aGF0IGVuY29kaW5nIHByaW9yIHRvIEpTT04tZW5jb2RpbmcuCisgICAgICAgIFRoZSBkZWZhdWx0IGlzIFVURi04LgorCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYuc2tpcGtleXMgPSBza2lwa2V5cworICAgICAgICBzZWxmLmVuc3VyZV9hc2NpaSA9IGVuc3VyZV9hc2NpaQorICAgICAgICBzZWxmLmNoZWNrX2NpcmN1bGFyID0gY2hlY2tfY2lyY3VsYXIKKyAgICAgICAgc2VsZi5hbGxvd19uYW4gPSBhbGxvd19uYW4KKyAgICAgICAgc2VsZi5zb3J0X2tleXMgPSBzb3J0X2tleXMKKyAgICAgICAgc2VsZi5pbmRlbnQgPSBpbmRlbnQKKyAgICAgICAgaWYgc2VwYXJhdG9ycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaXRlbV9zZXBhcmF0b3IsIHNlbGYua2V5X3NlcGFyYXRvciA9IHNlcGFyYXRvcnMKKyAgICAgICAgaWYgZGVmYXVsdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVmYXVsdCA9IGRlZmF1bHQKKyAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisKKyAgICBkZWYgZGVmYXVsdChzZWxmLCBvKToKKyAgICAgICAgIiIiSW1wbGVtZW50IHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3Mgc3VjaCB0aGF0IGl0IHJldHVybnMKKyAgICAgICAgYSBzZXJpYWxpemFibGUgb2JqZWN0IGZvciBgYG9gYCwgb3IgY2FsbHMgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24KKyAgICAgICAgKHRvIHJhaXNlIGEgYGBUeXBlRXJyb3JgYCkuCisKKyAgICAgICAgRm9yIGV4YW1wbGUsIHRvIHN1cHBvcnQgYXJiaXRyYXJ5IGl0ZXJhdG9ycywgeW91IGNvdWxkCisgICAgICAgIGltcGxlbWVudCBkZWZhdWx0IGxpa2UgdGhpczo6CisKKyAgICAgICAgICAgIGRlZiBkZWZhdWx0KHNlbGYsIG8pOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaXRlcmFibGUgPSBpdGVyKG8pCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaXN0KGl0ZXJhYmxlKQorICAgICAgICAgICAgICAgICMgTGV0IHRoZSBiYXNlIGNsYXNzIGRlZmF1bHQgbWV0aG9kIHJhaXNlIHRoZSBUeXBlRXJyb3IKKyAgICAgICAgICAgICAgICByZXR1cm4gSlNPTkVuY29kZXIuZGVmYXVsdChzZWxmLCBvKQorCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBUeXBlRXJyb3IocmVwcihvKSArICIgaXMgbm90IEpTT04gc2VyaWFsaXphYmxlIikKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgbyk6CisgICAgICAgICIiIlJldHVybiBhIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgUHl0aG9uIGRhdGEgc3RydWN0dXJlLgorCisgICAgICAgID4+PiBKU09ORW5jb2RlcigpLmVuY29kZSh7ImZvbyI6IFsiYmFyIiwgImJheiJdfSkKKyAgICAgICAgJ3siZm9vIjogWyJiYXIiLCAiYmF6Il19JworCisgICAgICAgICIiIgorICAgICAgICAjIFRoaXMgaXMgZm9yIGV4dHJlbWVseSBzaW1wbGUgY2FzZXMgYW5kIGJlbmNobWFya3MuCisgICAgICAgIGlmIGlzaW5zdGFuY2UobywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG8sIHN0cik6CisgICAgICAgICAgICAgICAgX2VuY29kaW5nID0gc2VsZi5lbmNvZGluZworICAgICAgICAgICAgICAgIGlmIChfZW5jb2RpbmcgaXMgbm90IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgKF9lbmNvZGluZyA9PSAndXRmLTgnKSk6CisgICAgICAgICAgICAgICAgICAgIG8gPSBvLmRlY29kZShfZW5jb2RpbmcpCisgICAgICAgICAgICBpZiBzZWxmLmVuc3VyZV9hc2NpaToKKyAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkobykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZV9iYXNlc3RyaW5nKG8pCisgICAgICAgICMgVGhpcyBkb2Vzbid0IHBhc3MgdGhlIGl0ZXJhdG9yIGRpcmVjdGx5IHRvICcnLmpvaW4oKSBiZWNhdXNlIHRoZQorICAgICAgICAjIGV4Y2VwdGlvbnMgYXJlbid0IGFzIGRldGFpbGVkLiAgVGhlIGxpc3QgY2FsbCBzaG91bGQgYmUgcm91Z2hseQorICAgICAgICAjIGVxdWl2YWxlbnQgdG8gdGhlIFB5U2VxdWVuY2VfRmFzdCB0aGF0ICcnLmpvaW4oKSB3b3VsZCBkby4KKyAgICAgICAgY2h1bmtzID0gc2VsZi5pdGVyZW5jb2RlKG8sIF9vbmVfc2hvdD1UcnVlKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjaHVua3MsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgY2h1bmtzID0gbGlzdChjaHVua3MpCisgICAgICAgIHJldHVybiAnJy5qb2luKGNodW5rcykKKworICAgIGRlZiBpdGVyZW5jb2RlKHNlbGYsIG8sIF9vbmVfc2hvdD1GYWxzZSk6CisgICAgICAgICIiIkVuY29kZSB0aGUgZ2l2ZW4gb2JqZWN0IGFuZCB5aWVsZCBlYWNoIHN0cmluZworICAgICAgICByZXByZXNlbnRhdGlvbiBhcyBhdmFpbGFibGUuCisKKyAgICAgICAgRm9yIGV4YW1wbGU6OgorCisgICAgICAgICAgICBmb3IgY2h1bmsgaW4gSlNPTkVuY29kZXIoKS5pdGVyZW5jb2RlKGJpZ29iamVjdCk6CisgICAgICAgICAgICAgICAgbXlzb2NrZXQud3JpdGUoY2h1bmspCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2hlY2tfY2lyY3VsYXI6CisgICAgICAgICAgICBtYXJrZXJzID0ge30KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hcmtlcnMgPSBOb25lCisgICAgICAgIGlmIHNlbGYuZW5zdXJlX2FzY2lpOgorICAgICAgICAgICAgX2VuY29kZXIgPSBlbmNvZGVfYmFzZXN0cmluZ19hc2NpaQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgX2VuY29kZXIgPSBlbmNvZGVfYmFzZXN0cmluZworICAgICAgICBpZiBzZWxmLmVuY29kaW5nICE9ICd1dGYtOCc6CisgICAgICAgICAgICBkZWYgX2VuY29kZXIobywgX29yaWdfZW5jb2Rlcj1fZW5jb2RlciwgX2VuY29kaW5nPXNlbGYuZW5jb2RpbmcpOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobywgc3RyKToKKyAgICAgICAgICAgICAgICAgICAgbyA9IG8uZGVjb2RlKF9lbmNvZGluZykKKyAgICAgICAgICAgICAgICByZXR1cm4gX29yaWdfZW5jb2RlcihvKQorCisgICAgICAgIGRlZiBmbG9hdHN0cihvLCBhbGxvd19uYW49c2VsZi5hbGxvd19uYW4sCisgICAgICAgICAgICAgICAgX3JlcHI9RkxPQVRfUkVQUiwgX2luZj1JTkZJTklUWSwgX25lZ2luZj0tSU5GSU5JVFkpOgorICAgICAgICAgICAgIyBDaGVjayBmb3Igc3BlY2lhbHMuICBOb3RlIHRoYXQgdGhpcyB0eXBlIG9mIHRlc3QgaXMgcHJvY2Vzc29yCisgICAgICAgICAgICAjIGFuZC9vciBwbGF0Zm9ybS1zcGVjaWZpYywgc28gZG8gdGVzdHMgd2hpY2ggZG9uJ3QgZGVwZW5kIG9uIHRoZQorICAgICAgICAgICAgIyBpbnRlcm5hbHMuCisKKyAgICAgICAgICAgIGlmIG8gIT0gbzoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gJ05hTicKKyAgICAgICAgICAgIGVsaWYgbyA9PSBfaW5mOgorICAgICAgICAgICAgICAgIHRleHQgPSAnSW5maW5pdHknCisgICAgICAgICAgICBlbGlmIG8gPT0gX25lZ2luZjoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gJy1JbmZpbml0eScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9yZXByKG8pCisKKyAgICAgICAgICAgIGlmIG5vdCBhbGxvd19uYW46CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIk91dCBvZiByYW5nZSBmbG9hdCB2YWx1ZXMgYXJlIG5vdCBKU09OIGNvbXBsaWFudDogIiArCisgICAgICAgICAgICAgICAgICAgIHJlcHIobykpCisKKyAgICAgICAgICAgIHJldHVybiB0ZXh0CisKKworICAgICAgICBpZiAoX29uZV9zaG90IGFuZCBjX21ha2VfZW5jb2RlciBpcyBub3QgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBzZWxmLmluZGVudCBpcyBOb25lIGFuZCBub3Qgc2VsZi5zb3J0X2tleXMpOgorICAgICAgICAgICAgX2l0ZXJlbmNvZGUgPSBjX21ha2VfZW5jb2RlcigKKyAgICAgICAgICAgICAgICBtYXJrZXJzLCBzZWxmLmRlZmF1bHQsIF9lbmNvZGVyLCBzZWxmLmluZGVudCwKKyAgICAgICAgICAgICAgICBzZWxmLmtleV9zZXBhcmF0b3IsIHNlbGYuaXRlbV9zZXBhcmF0b3IsIHNlbGYuc29ydF9rZXlzLAorICAgICAgICAgICAgICAgIHNlbGYuc2tpcGtleXMsIHNlbGYuYWxsb3dfbmFuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgX2l0ZXJlbmNvZGUgPSBfbWFrZV9pdGVyZW5jb2RlKAorICAgICAgICAgICAgICAgIG1hcmtlcnMsIHNlbGYuZGVmYXVsdCwgX2VuY29kZXIsIHNlbGYuaW5kZW50LCBmbG9hdHN0ciwKKyAgICAgICAgICAgICAgICBzZWxmLmtleV9zZXBhcmF0b3IsIHNlbGYuaXRlbV9zZXBhcmF0b3IsIHNlbGYuc29ydF9rZXlzLAorICAgICAgICAgICAgICAgIHNlbGYuc2tpcGtleXMsIF9vbmVfc2hvdCkKKyAgICAgICAgcmV0dXJuIF9pdGVyZW5jb2RlKG8sIDApCisKK2RlZiBfbWFrZV9pdGVyZW5jb2RlKG1hcmtlcnMsIF9kZWZhdWx0LCBfZW5jb2RlciwgX2luZGVudCwgX2Zsb2F0c3RyLAorICAgICAgICBfa2V5X3NlcGFyYXRvciwgX2l0ZW1fc2VwYXJhdG9yLCBfc29ydF9rZXlzLCBfc2tpcGtleXMsIF9vbmVfc2hvdCwKKyAgICAgICAgIyMgSEFDSzogaGFuZC1vcHRpbWl6ZWQgYnl0ZWNvZGU7IHR1cm4gZ2xvYmFscyBpbnRvIGxvY2FscworICAgICAgICBWYWx1ZUVycm9yPVZhbHVlRXJyb3IsCisgICAgICAgIGJhc2VzdHJpbmc9YmFzZXN0cmluZywKKyAgICAgICAgZGljdD1kaWN0LAorICAgICAgICBmbG9hdD1mbG9hdCwKKyAgICAgICAgaWQ9aWQsCisgICAgICAgIGludD1pbnQsCisgICAgICAgIGlzaW5zdGFuY2U9aXNpbnN0YW5jZSwKKyAgICAgICAgbGlzdD1saXN0LAorICAgICAgICBsb25nPWxvbmcsCisgICAgICAgIHN0cj1zdHIsCisgICAgICAgIHR1cGxlPXR1cGxlLAorICAgICk6CisKKyAgICBkZWYgX2l0ZXJlbmNvZGVfbGlzdChsc3QsIF9jdXJyZW50X2luZGVudF9sZXZlbCk6CisgICAgICAgIGlmIG5vdCBsc3Q6CisgICAgICAgICAgICB5aWVsZCAnW10nCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbWFya2VycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG1hcmtlcmlkID0gaWQobHN0KQorICAgICAgICAgICAgaWYgbWFya2VyaWQgaW4gbWFya2VyczoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQiKQorICAgICAgICAgICAgbWFya2Vyc1ttYXJrZXJpZF0gPSBsc3QKKyAgICAgICAgYnVmID0gJ1snCisgICAgICAgIGlmIF9pbmRlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfY3VycmVudF9pbmRlbnRfbGV2ZWwgKz0gMQorICAgICAgICAgICAgbmV3bGluZV9pbmRlbnQgPSAnXG4nICsgKCcgJyAqIChfaW5kZW50ICogX2N1cnJlbnRfaW5kZW50X2xldmVsKSkKKyAgICAgICAgICAgIHNlcGFyYXRvciA9IF9pdGVtX3NlcGFyYXRvciArIG5ld2xpbmVfaW5kZW50CisgICAgICAgICAgICBidWYgKz0gbmV3bGluZV9pbmRlbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld2xpbmVfaW5kZW50ID0gTm9uZQorICAgICAgICAgICAgc2VwYXJhdG9yID0gX2l0ZW1fc2VwYXJhdG9yCisgICAgICAgIGZpcnN0ID0gVHJ1ZQorICAgICAgICBmb3IgdmFsdWUgaW4gbHN0OgorICAgICAgICAgICAgaWYgZmlyc3Q6CisgICAgICAgICAgICAgICAgZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBidWYgPSBzZXBhcmF0b3IKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgIHlpZWxkIGJ1ZiArIF9lbmNvZGVyKHZhbHVlKQorICAgICAgICAgICAgZWxpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHlpZWxkIGJ1ZiArICdudWxsJworICAgICAgICAgICAgZWxpZiB2YWx1ZSBpcyBUcnVlOgorICAgICAgICAgICAgICAgIHlpZWxkIGJ1ZiArICd0cnVlJworICAgICAgICAgICAgZWxpZiB2YWx1ZSBpcyBGYWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCBidWYgKyAnZmFsc2UnCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgICAgICB5aWVsZCBidWYgKyBzdHIodmFsdWUpCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KToKKyAgICAgICAgICAgICAgICB5aWVsZCBidWYgKyBfZmxvYXRzdHIodmFsdWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIGJ1ZgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgICAgICAgICBjaHVua3MgPSBfaXRlcmVuY29kZV9saXN0KHZhbHVlLCBfY3VycmVudF9pbmRlbnRfbGV2ZWwpCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtzID0gX2l0ZXJlbmNvZGVfZGljdCh2YWx1ZSwgX2N1cnJlbnRfaW5kZW50X2xldmVsKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNodW5rcyA9IF9pdGVyZW5jb2RlKHZhbHVlLCBfY3VycmVudF9pbmRlbnRfbGV2ZWwpCisgICAgICAgICAgICAgICAgZm9yIGNodW5rIGluIGNodW5rczoKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgY2h1bmsKKyAgICAgICAgaWYgbmV3bGluZV9pbmRlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfY3VycmVudF9pbmRlbnRfbGV2ZWwgLT0gMQorICAgICAgICAgICAgeWllbGQgJ1xuJyArICgnICcgKiAoX2luZGVudCAqIF9jdXJyZW50X2luZGVudF9sZXZlbCkpCisgICAgICAgIHlpZWxkICddJworICAgICAgICBpZiBtYXJrZXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGVsIG1hcmtlcnNbbWFya2VyaWRdCisKKyAgICBkZWYgX2l0ZXJlbmNvZGVfZGljdChkY3QsIF9jdXJyZW50X2luZGVudF9sZXZlbCk6CisgICAgICAgIGlmIG5vdCBkY3Q6CisgICAgICAgICAgICB5aWVsZCAne30nCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbWFya2VycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG1hcmtlcmlkID0gaWQoZGN0KQorICAgICAgICAgICAgaWYgbWFya2VyaWQgaW4gbWFya2VyczoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQiKQorICAgICAgICAgICAgbWFya2Vyc1ttYXJrZXJpZF0gPSBkY3QKKyAgICAgICAgeWllbGQgJ3snCisgICAgICAgIGlmIF9pbmRlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfY3VycmVudF9pbmRlbnRfbGV2ZWwgKz0gMQorICAgICAgICAgICAgbmV3bGluZV9pbmRlbnQgPSAnXG4nICsgKCcgJyAqIChfaW5kZW50ICogX2N1cnJlbnRfaW5kZW50X2xldmVsKSkKKyAgICAgICAgICAgIGl0ZW1fc2VwYXJhdG9yID0gX2l0ZW1fc2VwYXJhdG9yICsgbmV3bGluZV9pbmRlbnQKKyAgICAgICAgICAgIHlpZWxkIG5ld2xpbmVfaW5kZW50CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXdsaW5lX2luZGVudCA9IE5vbmUKKyAgICAgICAgICAgIGl0ZW1fc2VwYXJhdG9yID0gX2l0ZW1fc2VwYXJhdG9yCisgICAgICAgIGZpcnN0ID0gVHJ1ZQorICAgICAgICBpZiBfc29ydF9rZXlzOgorICAgICAgICAgICAgaXRlbXMgPSBzb3J0ZWQoZGN0Lml0ZW1zKCksIGtleT1sYW1iZGEga3Y6IGt2WzBdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaXRlbXMgPSBkY3QuaXRlcml0ZW1zKCkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gaXRlbXM6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBKYXZhU2NyaXB0IGlzIHdlYWtseSB0eXBlZCBmb3IgdGhlc2UsIHNvIGl0IG1ha2VzIHNlbnNlIHRvCisgICAgICAgICAgICAjIGFsc28gYWxsb3cgdGhlbS4gIE1hbnkgZW5jb2RlcnMgc2VlbSB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGlzLgorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGtleSwgZmxvYXQpOgorICAgICAgICAgICAgICAgIGtleSA9IF9mbG9hdHN0cihrZXkpCisgICAgICAgICAgICBlbGlmIGtleSBpcyBUcnVlOgorICAgICAgICAgICAgICAgIGtleSA9ICd0cnVlJworICAgICAgICAgICAgZWxpZiBrZXkgaXMgRmFsc2U6CisgICAgICAgICAgICAgICAga2V5ID0gJ2ZhbHNlJworICAgICAgICAgICAgZWxpZiBrZXkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBrZXkgPSAnbnVsbCcKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShrZXksIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgICAgICBrZXkgPSBzdHIoa2V5KQorICAgICAgICAgICAgZWxpZiBfc2tpcGtleXM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJrZXkgIiArIHJlcHIoa2V5KSArICIgaXMgbm90IGEgc3RyaW5nIikKKyAgICAgICAgICAgIGlmIGZpcnN0OgorICAgICAgICAgICAgICAgIGZpcnN0ID0gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgaXRlbV9zZXBhcmF0b3IKKyAgICAgICAgICAgIHlpZWxkIF9lbmNvZGVyKGtleSkKKyAgICAgICAgICAgIHlpZWxkIF9rZXlfc2VwYXJhdG9yCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICB5aWVsZCBfZW5jb2Rlcih2YWx1ZSkKKyAgICAgICAgICAgIGVsaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB5aWVsZCAnbnVsbCcKKyAgICAgICAgICAgIGVsaWYgdmFsdWUgaXMgVHJ1ZToKKyAgICAgICAgICAgICAgICB5aWVsZCAndHJ1ZScKKyAgICAgICAgICAgIGVsaWYgdmFsdWUgaXMgRmFsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgJ2ZhbHNlJworICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICAgICAgeWllbGQgc3RyKHZhbHVlKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBmbG9hdCk6CisgICAgICAgICAgICAgICAgeWllbGQgX2Zsb2F0c3RyKHZhbHVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtzID0gX2l0ZXJlbmNvZGVfbGlzdCh2YWx1ZSwgX2N1cnJlbnRfaW5kZW50X2xldmVsKQorICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CisgICAgICAgICAgICAgICAgICAgIGNodW5rcyA9IF9pdGVyZW5jb2RlX2RpY3QodmFsdWUsIF9jdXJyZW50X2luZGVudF9sZXZlbCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjaHVua3MgPSBfaXRlcmVuY29kZSh2YWx1ZSwgX2N1cnJlbnRfaW5kZW50X2xldmVsKQorICAgICAgICAgICAgICAgIGZvciBjaHVuayBpbiBjaHVua3M6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGNodW5rCisgICAgICAgIGlmIG5ld2xpbmVfaW5kZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgX2N1cnJlbnRfaW5kZW50X2xldmVsIC09IDEKKyAgICAgICAgICAgIHlpZWxkICdcbicgKyAoJyAnICogKF9pbmRlbnQgKiBfY3VycmVudF9pbmRlbnRfbGV2ZWwpKQorICAgICAgICB5aWVsZCAnfScKKyAgICAgICAgaWYgbWFya2VycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRlbCBtYXJrZXJzW21hcmtlcmlkXQorCisgICAgZGVmIF9pdGVyZW5jb2RlKG8sIF9jdXJyZW50X2luZGVudF9sZXZlbCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UobywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICB5aWVsZCBfZW5jb2RlcihvKQorICAgICAgICBlbGlmIG8gaXMgTm9uZToKKyAgICAgICAgICAgIHlpZWxkICdudWxsJworICAgICAgICBlbGlmIG8gaXMgVHJ1ZToKKyAgICAgICAgICAgIHlpZWxkICd0cnVlJworICAgICAgICBlbGlmIG8gaXMgRmFsc2U6CisgICAgICAgICAgICB5aWVsZCAnZmFsc2UnCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvLCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICB5aWVsZCBzdHIobykKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG8sIGZsb2F0KToKKyAgICAgICAgICAgIHlpZWxkIF9mbG9hdHN0cihvKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobywgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICBmb3IgY2h1bmsgaW4gX2l0ZXJlbmNvZGVfbGlzdChvLCBfY3VycmVudF9pbmRlbnRfbGV2ZWwpOgorICAgICAgICAgICAgICAgIHlpZWxkIGNodW5rCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvLCBkaWN0KToKKyAgICAgICAgICAgIGZvciBjaHVuayBpbiBfaXRlcmVuY29kZV9kaWN0KG8sIF9jdXJyZW50X2luZGVudF9sZXZlbCk6CisgICAgICAgICAgICAgICAgeWllbGQgY2h1bmsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG1hcmtlcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbWFya2VyaWQgPSBpZChvKQorICAgICAgICAgICAgICAgIGlmIG1hcmtlcmlkIGluIG1hcmtlcnM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCIpCisgICAgICAgICAgICAgICAgbWFya2Vyc1ttYXJrZXJpZF0gPSBvCisgICAgICAgICAgICBvID0gX2RlZmF1bHQobykKKyAgICAgICAgICAgIGZvciBjaHVuayBpbiBfaXRlcmVuY29kZShvLCBfY3VycmVudF9pbmRlbnRfbGV2ZWwpOgorICAgICAgICAgICAgICAgIHlpZWxkIGNodW5rCisgICAgICAgICAgICBpZiBtYXJrZXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGRlbCBtYXJrZXJzW21hcmtlcmlkXQorCisgICAgcmV0dXJuIF9pdGVyZW5jb2RlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vZW5jb2Rlci5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vZW5jb2Rlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiNzdkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi9lbmNvZGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vZW5jb2Rlci5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vZW5jb2Rlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiNzdkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi9lbmNvZGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vc2Nhbm5lci5weSBiL2xpYi9weXRob24yLjcvanNvbi9zY2FubmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTY4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vc2Nhbm5lci5weQpAQCAtMCwwICsxLDY3IEBACisiIiJKU09OIHRva2VuIHNjYW5uZXIKKyIiIgoraW1wb3J0IHJlCit0cnk6CisgICAgZnJvbSBfanNvbiBpbXBvcnQgbWFrZV9zY2FubmVyIGFzIGNfbWFrZV9zY2FubmVyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgY19tYWtlX3NjYW5uZXIgPSBOb25lCisKK19fYWxsX18gPSBbJ21ha2Vfc2Nhbm5lciddCisKK05VTUJFUl9SRSA9IHJlLmNvbXBpbGUoCisgICAgcicoLT8oPzowfFsxLTldXGQqKSkoXC5cZCspPyhbZUVdWy0rXT9cZCspPycsCisgICAgKHJlLlZFUkJPU0UgfCByZS5NVUxUSUxJTkUgfCByZS5ET1RBTEwpKQorCitkZWYgcHlfbWFrZV9zY2FubmVyKGNvbnRleHQpOgorICAgIHBhcnNlX29iamVjdCA9IGNvbnRleHQucGFyc2Vfb2JqZWN0CisgICAgcGFyc2VfYXJyYXkgPSBjb250ZXh0LnBhcnNlX2FycmF5CisgICAgcGFyc2Vfc3RyaW5nID0gY29udGV4dC5wYXJzZV9zdHJpbmcKKyAgICBtYXRjaF9udW1iZXIgPSBOVU1CRVJfUkUubWF0Y2gKKyAgICBlbmNvZGluZyA9IGNvbnRleHQuZW5jb2RpbmcKKyAgICBzdHJpY3QgPSBjb250ZXh0LnN0cmljdAorICAgIHBhcnNlX2Zsb2F0ID0gY29udGV4dC5wYXJzZV9mbG9hdAorICAgIHBhcnNlX2ludCA9IGNvbnRleHQucGFyc2VfaW50CisgICAgcGFyc2VfY29uc3RhbnQgPSBjb250ZXh0LnBhcnNlX2NvbnN0YW50CisgICAgb2JqZWN0X2hvb2sgPSBjb250ZXh0Lm9iamVjdF9ob29rCisgICAgb2JqZWN0X3BhaXJzX2hvb2sgPSBjb250ZXh0Lm9iamVjdF9wYWlyc19ob29rCisKKyAgICBkZWYgX3NjYW5fb25jZShzdHJpbmcsIGlkeCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHRjaGFyID0gc3RyaW5nW2lkeF0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKKyAgICAgICAgaWYgbmV4dGNoYXIgPT0gJyInOgorICAgICAgICAgICAgcmV0dXJuIHBhcnNlX3N0cmluZyhzdHJpbmcsIGlkeCArIDEsIGVuY29kaW5nLCBzdHJpY3QpCisgICAgICAgIGVsaWYgbmV4dGNoYXIgPT0gJ3snOgorICAgICAgICAgICAgcmV0dXJuIHBhcnNlX29iamVjdCgoc3RyaW5nLCBpZHggKyAxKSwgZW5jb2RpbmcsIHN0cmljdCwKKyAgICAgICAgICAgICAgICBfc2Nhbl9vbmNlLCBvYmplY3RfaG9vaywgb2JqZWN0X3BhaXJzX2hvb2spCisgICAgICAgIGVsaWYgbmV4dGNoYXIgPT0gJ1snOgorICAgICAgICAgICAgcmV0dXJuIHBhcnNlX2FycmF5KChzdHJpbmcsIGlkeCArIDEpLCBfc2Nhbl9vbmNlKQorICAgICAgICBlbGlmIG5leHRjaGFyID09ICduJyBhbmQgc3RyaW5nW2lkeDppZHggKyA0XSA9PSAnbnVsbCc6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgaWR4ICsgNAorICAgICAgICBlbGlmIG5leHRjaGFyID09ICd0JyBhbmQgc3RyaW5nW2lkeDppZHggKyA0XSA9PSAndHJ1ZSc6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZSwgaWR4ICsgNAorICAgICAgICBlbGlmIG5leHRjaGFyID09ICdmJyBhbmQgc3RyaW5nW2lkeDppZHggKyA1XSA9PSAnZmFsc2UnOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlLCBpZHggKyA1CisKKyAgICAgICAgbSA9IG1hdGNoX251bWJlcihzdHJpbmcsIGlkeCkKKyAgICAgICAgaWYgbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGludGVnZXIsIGZyYWMsIGV4cCA9IG0uZ3JvdXBzKCkKKyAgICAgICAgICAgIGlmIGZyYWMgb3IgZXhwOgorICAgICAgICAgICAgICAgIHJlcyA9IHBhcnNlX2Zsb2F0KGludGVnZXIgKyAoZnJhYyBvciAnJykgKyAoZXhwIG9yICcnKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzID0gcGFyc2VfaW50KGludGVnZXIpCisgICAgICAgICAgICByZXR1cm4gcmVzLCBtLmVuZCgpCisgICAgICAgIGVsaWYgbmV4dGNoYXIgPT0gJ04nIGFuZCBzdHJpbmdbaWR4OmlkeCArIDNdID09ICdOYU4nOgorICAgICAgICAgICAgcmV0dXJuIHBhcnNlX2NvbnN0YW50KCdOYU4nKSwgaWR4ICsgMworICAgICAgICBlbGlmIG5leHRjaGFyID09ICdJJyBhbmQgc3RyaW5nW2lkeDppZHggKyA4XSA9PSAnSW5maW5pdHknOgorICAgICAgICAgICAgcmV0dXJuIHBhcnNlX2NvbnN0YW50KCdJbmZpbml0eScpLCBpZHggKyA4CisgICAgICAgIGVsaWYgbmV4dGNoYXIgPT0gJy0nIGFuZCBzdHJpbmdbaWR4OmlkeCArIDldID09ICctSW5maW5pdHknOgorICAgICAgICAgICAgcmV0dXJuIHBhcnNlX2NvbnN0YW50KCctSW5maW5pdHknKSwgaWR4ICsgOQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCisgICAgcmV0dXJuIF9zY2FuX29uY2UKKworbWFrZV9zY2FubmVyID0gY19tYWtlX3NjYW5uZXIgb3IgcHlfbWFrZV9zY2FubmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vc2Nhbm5lci5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vc2Nhbm5lci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjNWM2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi9zY2FubmVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vc2Nhbm5lci5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vc2Nhbm5lci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZjNWM2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi9zY2FubmVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjYjJiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDczIEBACitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBqc29uCitpbXBvcnQgZG9jdGVzdAoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgaW1wb3J0IGpzb24gd2l0aCBhbmQgd2l0aG91dCBhY2NlbGVyYXRpb25zCitjanNvbiA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfZnJlc2hfbW9kdWxlKCdqc29uJywgZnJlc2g9WydfanNvbiddKQorcHlqc29uID0gdGVzdF9zdXBwb3J0LmltcG9ydF9mcmVzaF9tb2R1bGUoJ2pzb24nLCBibG9ja2VkPVsnX2pzb24nXSkKKworIyBjcmVhdGUgdHdvIGJhc2UgY2xhc3NlcyB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgb3RoZXIgdGVzdHMKK2NsYXNzIFB5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAganNvbiA9IHB5anNvbgorICAgIGxvYWRzID0gc3RhdGljbWV0aG9kKHB5anNvbi5sb2FkcykKKyAgICBkdW1wcyA9IHN0YXRpY21ldGhvZChweWpzb24uZHVtcHMpCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKGNqc29uLCAncmVxdWlyZXMgX2pzb24nKQorY2xhc3MgQ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGlmIGNqc29uIGlzIG5vdCBOb25lOgorICAgICAgICBqc29uID0gY2pzb24KKyAgICAgICAgbG9hZHMgPSBzdGF0aWNtZXRob2QoY2pzb24ubG9hZHMpCisgICAgICAgIGR1bXBzID0gc3RhdGljbWV0aG9kKGNqc29uLmR1bXBzKQorCisjIHRlc3QgUHlUZXN0IGFuZCBDVGVzdCBjaGVja2luZyBpZiB0aGUgZnVuY3Rpb25zIGNvbWUgZnJvbSB0aGUgcmlnaHQgbW9kdWxlCitjbGFzcyBUZXN0UHlUZXN0KFB5VGVzdCk6CisgICAgZGVmIHRlc3RfcHlqc29uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuanNvbi5zY2FubmVyLm1ha2Vfc2Nhbm5lci5fX21vZHVsZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICdqc29uLnNjYW5uZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuanNvbi5kZWNvZGVyLnNjYW5zdHJpbmcuX19tb2R1bGVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnanNvbi5kZWNvZGVyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmpzb24uZW5jb2Rlci5lbmNvZGVfYmFzZXN0cmluZ19hc2NpaS5fX21vZHVsZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICdqc29uLmVuY29kZXInKQorCitjbGFzcyBUZXN0Q1Rlc3QoQ1Rlc3QpOgorICAgIGRlZiB0ZXN0X2Nqc29uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuanNvbi5zY2FubmVyLm1ha2Vfc2Nhbm5lci5fX21vZHVsZV9fLCAnX2pzb24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuanNvbi5kZWNvZGVyLnNjYW5zdHJpbmcuX19tb2R1bGVfXywgJ19qc29uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmpzb24uZW5jb2Rlci5jX21ha2VfZW5jb2Rlci5fX21vZHVsZV9fLCAnX2pzb24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuanNvbi5lbmNvZGVyLmVuY29kZV9iYXNlc3RyaW5nX2FzY2lpLl9fbW9kdWxlX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgJ19qc29uJykKKworCitoZXJlID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gYWRkaXRpb25hbF90ZXN0cygpCisgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgZm9yIGZuIGluIG9zLmxpc3RkaXIoaGVyZSk6CisgICAgICAgIGlmIGZuLnN0YXJ0c3dpdGgoInRlc3QiKSBhbmQgZm4uZW5kc3dpdGgoIi5weSIpOgorICAgICAgICAgICAgbW9kbmFtZSA9ICJqc29uLnRlc3RzLiIgKyBmbls6LTNdCisgICAgICAgICAgICBfX2ltcG9ydF9fKG1vZG5hbWUpCisgICAgICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2RuYW1lXQorICAgICAgICAgICAgc3VpdGUuYWRkVGVzdHMobG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUobW9kdWxlKSkKKyAgICByZXR1cm4gc3VpdGUKKworZGVmIGFkZGl0aW9uYWxfdGVzdHMoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgZm9yIG1vZCBpbiAoanNvbiwganNvbi5lbmNvZGVyLCBqc29uLmRlY29kZXIpOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KGRvY3Rlc3QuRG9jVGVzdFN1aXRlKG1vZCkpCisgICAgc3VpdGUuYWRkVGVzdChUZXN0UHlUZXN0KCd0ZXN0X3B5anNvbicpKQorICAgIHN1aXRlLmFkZFRlc3QoVGVzdENUZXN0KCd0ZXN0X2Nqc29uJykpCisgICAgcmV0dXJuIHN1aXRlCisKK2RlZiBtYWluKCk6CisgICAgc3VpdGUgPSB0ZXN0X3N1aXRlKCkKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkpKSkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNWRiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNWRiYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2NoZWNrX2NpcmN1bGFyLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfY2hlY2tfY2lyY3VsYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkM2QyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2NoZWNrX2NpcmN1bGFyLnB5CkBAIC0wLDAgKzEsMzQgQEAKK2Zyb20ganNvbi50ZXN0cyBpbXBvcnQgUHlUZXN0LCBDVGVzdAorCisKK2RlZiBkZWZhdWx0X2l0ZXJhYmxlKG9iaik6CisgICAgcmV0dXJuIGxpc3Qob2JqKQorCitjbGFzcyBUZXN0Q2hlY2tDaXJjdWxhcihvYmplY3QpOgorICAgIGRlZiB0ZXN0X2NpcmN1bGFyX2RpY3Qoc2VsZik6CisgICAgICAgIGRjdCA9IHt9CisgICAgICAgIGRjdFsnYSddID0gZGN0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZHVtcHMsIGRjdCkKKworICAgIGRlZiB0ZXN0X2NpcmN1bGFyX2xpc3Qoc2VsZik6CisgICAgICAgIGxzdCA9IFtdCisgICAgICAgIGxzdC5hcHBlbmQobHN0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmR1bXBzLCBsc3QpCisKKyAgICBkZWYgdGVzdF9jaXJjdWxhcl9jb21wb3NpdGUoc2VsZik6CisgICAgICAgIGRjdDIgPSB7fQorICAgICAgICBkY3QyWydhJ10gPSBbXQorICAgICAgICBkY3QyWydhJ10uYXBwZW5kKGRjdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZHVtcHMsIGRjdDIpCisKKyAgICBkZWYgdGVzdF9jaXJjdWxhcl9kZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmR1bXBzKFtzZXQoKV0sIGRlZmF1bHQ9ZGVmYXVsdF9pdGVyYWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmR1bXBzLCBbc2V0KCldKQorCisgICAgZGVmIHRlc3RfY2lyY3VsYXJfb2ZmX2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYuZHVtcHMoW3NldCgpXSwgZGVmYXVsdD1kZWZhdWx0X2l0ZXJhYmxlLCBjaGVja19jaXJjdWxhcj1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmR1bXBzLCBbc2V0KCldLCBjaGVja19jaXJjdWxhcj1GYWxzZSkKKworCitjbGFzcyBUZXN0UHlDaGVja0NpcmN1bGFyKFRlc3RDaGVja0NpcmN1bGFyLCBQeVRlc3QpOiBwYXNzCitjbGFzcyBUZXN0Q0NoZWNrQ2lyY3VsYXIoVGVzdENoZWNrQ2lyY3VsYXIsIENUZXN0KTogcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfY2hlY2tfY2lyY3VsYXIucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfY2hlY2tfY2lyY3VsYXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OGFiMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9jaGVja19jaXJjdWxhci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfY2hlY2tfY2lyY3VsYXIucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfY2hlY2tfY2lyY3VsYXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3OGFiMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9jaGVja19jaXJjdWxhci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZGVjb2RlLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZGVjb2RlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZDFhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHkKQEAgLTAsMCArMSw2NCBAQAoraW1wb3J0IGRlY2ltYWwKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAorZnJvbSBqc29uLnRlc3RzIGltcG9ydCBQeVRlc3QsIENUZXN0CisKKworY2xhc3MgVGVzdERlY29kZShvYmplY3QpOgorICAgIGRlZiB0ZXN0X2RlY2ltYWwoc2VsZik6CisgICAgICAgIHJ2YWwgPSBzZWxmLmxvYWRzKCcxLjEnLCBwYXJzZV9mbG9hdD1kZWNpbWFsLkRlY2ltYWwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJ2YWwsIGRlY2ltYWwuRGVjaW1hbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnZhbCwgZGVjaW1hbC5EZWNpbWFsKCcxLjEnKSkKKworICAgIGRlZiB0ZXN0X2Zsb2F0KHNlbGYpOgorICAgICAgICBydmFsID0gc2VsZi5sb2FkcygnMScsIHBhcnNlX2ludD1mbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocnZhbCwgZmxvYXQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ2YWwsIDEuMCkKKworICAgIGRlZiB0ZXN0X2RlY29kZXJfb3B0aW1pemF0aW9ucyhzZWxmKToKKyAgICAgICAgIyBTZXZlcmFsIG9wdGltaXphdGlvbnMgd2VyZSBtYWRlIHRoYXQgc2tpcCBvdmVyIGNhbGxzIHRvCisgICAgICAgICMgdGhlIHdoaXRlc3BhY2UgcmVnZXgsIHNvIHRoaXMgdGVzdCBpcyBkZXNpZ25lZCB0byB0cnkgYW5kCisgICAgICAgICMgZXhlcmNpc2UgdGhlIHVuY29tbW9uIGNhc2VzLiBUaGUgYXJyYXkgY2FzZXMgYXJlIGFscmVhZHkgY292ZXJlZC4KKyAgICAgICAgcnZhbCA9IHNlbGYubG9hZHMoJ3sgICAia2V5IiAgICA6ICAgICJ2YWx1ZSIgICAgLCAgImsiOiJ2IiAgICB9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydmFsLCB7ImtleSI6InZhbHVlIiwgImsiOiJ2In0pCisKKyAgICBkZWYgdGVzdF9lbXB0eV9vYmplY3RzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMoJ3t9JyksIHt9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMoJ1tdJyksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMoJyIiJyksIHUiIikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYubG9hZHMoJyIiJyksIHVuaWNvZGUpCisKKyAgICBkZWYgdGVzdF9vYmplY3RfcGFpcnNfaG9vayhzZWxmKToKKyAgICAgICAgcyA9ICd7InhrZCI6MSwgImtjdyI6MiwgImFydCI6MywgImh4bSI6NCwgInFydCI6NSwgInBhZCI6NiwgImhveSI6N30nCisgICAgICAgIHAgPSBbKCJ4a2QiLCAxKSwgKCJrY3ciLCAyKSwgKCJhcnQiLCAzKSwgKCJoeG0iLCA0KSwKKyAgICAgICAgICAgICAoInFydCIsIDUpLCAoInBhZCIsIDYpLCAoImhveSIsIDcpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMocyksIGV2YWwocykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcyhzLCBvYmplY3RfcGFpcnNfaG9vaz1sYW1iZGEgeDogeCksIHApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5qc29uLmxvYWQoU3RyaW5nSU8ocyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3BhaXJzX2hvb2s9bGFtYmRhIHg6IHgpLCBwKQorICAgICAgICBvZCA9IHNlbGYubG9hZHMocywgb2JqZWN0X3BhaXJzX2hvb2s9T3JkZXJlZERpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2QsIE9yZGVyZWREaWN0KHApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUob2QpLCBPcmRlcmVkRGljdCkKKyAgICAgICAgIyB0aGUgb2JqZWN0X3BhaXJzX2hvb2sgdGFrZXMgcHJpb3JpdHkgb3ZlciB0aGUgb2JqZWN0X2hvb2sKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHMsIG9iamVjdF9wYWlyc19ob29rPU9yZGVyZWREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2hvb2s9bGFtYmRhIHg6IE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyZWREaWN0KHApKQorICAgICAgICAjIGNoZWNrIHRoYXQgZW1wdHkgb2JqZWN0cyBsaXRlcmFscyB3b3JrIChzZWUgIzE3MzY4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMoJ3t9Jywgb2JqZWN0X3BhaXJzX2hvb2s9T3JkZXJlZERpY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyZWREaWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcygneyJlbXB0eSI6IHt9fScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfcGFpcnNfaG9vaz1PcmRlcmVkRGljdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJlZERpY3QoWygnZW1wdHknLCBPcmRlcmVkRGljdCgpKV0pKQorCisgICAgZGVmIHRlc3RfZXh0cmFfZGF0YShzZWxmKToKKyAgICAgICAgcyA9ICdbMSwgMiwgM101JworICAgICAgICBtc2cgPSAnRXh0cmEgZGF0YScKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVmFsdWVFcnJvciwgbXNnLCBzZWxmLmxvYWRzLCBzKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9lc2NhcGUoc2VsZik6CisgICAgICAgIHMgPSAnWyJhYmNcXHkiXScKKyAgICAgICAgbXNnID0gJ2VzY2FwZScKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVmFsdWVFcnJvciwgbXNnLCBzZWxmLmxvYWRzLCBzKQorCitjbGFzcyBUZXN0UHlEZWNvZGUoVGVzdERlY29kZSwgUHlUZXN0KTogcGFzcworY2xhc3MgVGVzdENEZWNvZGUoVGVzdERlY29kZSwgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZGVjb2RlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGEzMGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZGVjb2RlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZGVjb2RlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGEzMGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZGVjb2RlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWZhdWx0LnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZGVmYXVsdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmEwN2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZGVmYXVsdC5weQpAQCAtMCwwICsxLDEyIEBACitmcm9tIGpzb24udGVzdHMgaW1wb3J0IFB5VGVzdCwgQ1Rlc3QKKworCitjbGFzcyBUZXN0RGVmYXVsdChvYmplY3QpOgorICAgIGRlZiB0ZXN0X2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLmR1bXBzKHR5cGUsIGRlZmF1bHQ9cmVwciksCisgICAgICAgICAgICBzZWxmLmR1bXBzKHJlcHIodHlwZSkpKQorCisKK2NsYXNzIFRlc3RQeURlZmF1bHQoVGVzdERlZmF1bHQsIFB5VGVzdCk6IHBhc3MKK2NsYXNzIFRlc3RDRGVmYXVsdChUZXN0RGVmYXVsdCwgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWZhdWx0LnB5YyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2RlZmF1bHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMWVkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWZhdWx0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWZhdWx0LnB5byBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2RlZmF1bHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMWVkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWZhdWx0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kdW1wLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZHVtcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDkyNTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZHVtcC5weQpAQCAtMCwwICsxLDMyIEBACitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20ganNvbi50ZXN0cyBpbXBvcnQgUHlUZXN0LCBDVGVzdAorCisKK2NsYXNzIFRlc3REdW1wKG9iamVjdCk6CisgICAgZGVmIHRlc3RfZHVtcChzZWxmKToKKyAgICAgICAgc2lvID0gU3RyaW5nSU8oKQorICAgICAgICBzZWxmLmpzb24uZHVtcCh7fSwgc2lvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpby5nZXR2YWx1ZSgpLCAne30nKQorCisgICAgZGVmIHRlc3RfZHVtcHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kdW1wcyh7fSksICd7fScpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfdHJ1ZWZhbHNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZHVtcHMoCisgICAgICAgICAgICAgICAgIHtUcnVlOiBGYWxzZSwgRmFsc2U6IFRydWV9LCBzb3J0X2tleXM9VHJ1ZSksCisgICAgICAgICAgICAgICAgICd7ImZhbHNlIjogdHJ1ZSwgInRydWUiOiBmYWxzZX0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZHVtcHMoCisgICAgICAgICAgICAgICAgezI6IDMuMCwgNC4wOiA1TCwgRmFsc2U6IDEsIDZMOiBUcnVlfSwgc29ydF9rZXlzPVRydWUpLAorICAgICAgICAgICAgICAgICd7ImZhbHNlIjogMSwgIjIiOiAzLjAsICI0LjAiOiA1LCAiNiI6IHRydWV9JykKKworICAgICMgSXNzdWUgMTYyMjg6IENyYXNoIG9uIGVuY29kaW5nIHJlc2l6ZWQgbGlzdAorICAgIGRlZiB0ZXN0X2VuY29kZV9tdXRhdGVkKHNlbGYpOgorICAgICAgICBhID0gW29iamVjdCgpXSAqIDEwCisgICAgICAgIGRlZiBjcmFzaGVyKG9iaik6CisgICAgICAgICAgICBkZWwgYVstMV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmR1bXBzKGEsIGRlZmF1bHQ9Y3Jhc2hlciksCisgICAgICAgICAgICAgICAgICdbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF0nKQorCisKK2NsYXNzIFRlc3RQeUR1bXAoVGVzdER1bXAsIFB5VGVzdCk6IHBhc3MKK2NsYXNzIFRlc3RDRHVtcChUZXN0RHVtcCwgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kdW1wLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2R1bXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3M2ZlODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kdW1wLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kdW1wLnB5byBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2R1bXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3M2ZlODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kdW1wLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9lbmNvZGVfYmFzZXN0cmluZ19hc2NpaS5weSBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOWQ1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9lbmNvZGVfYmFzZXN0cmluZ19hc2NpaS5weQpAQCAtMCwwICsxLDQxIEBACitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAorZnJvbSBqc29uLnRlc3RzIGltcG9ydCBQeVRlc3QsIENUZXN0CisKKworQ0FTRVMgPSBbCisgICAgKHUnL1xcIlx1Y2FmZVx1YmFiZVx1YWI5OFx1ZmNkZVx1YmNkYVx1ZWY0YVx4MDhceDBjXG5cclx0YDF+IUAjJCVeJiooKV8rLT1bXXt9fDs6XCcsLi88Pj8nLCAnIi9cXFxcXFwiXFx1Y2FmZVxcdWJhYmVcXHVhYjk4XFx1ZmNkZVxcdWJjZGFcXHVlZjRhXFxiXFxmXFxuXFxyXFx0YDF+IUAjJCVeJiooKV8rLT1bXXt9fDs6XCcsLi88Pj8iJyksCisgICAgKHUnXHUwMTIzXHU0NTY3XHU4OWFiXHVjZGVmXHVhYmNkXHVlZjRhJywgJyJcXHUwMTIzXFx1NDU2N1xcdTg5YWJcXHVjZGVmXFx1YWJjZFxcdWVmNGEiJyksCisgICAgKHUnY29udHJvbHMnLCAnImNvbnRyb2xzIicpLAorICAgICh1J1x4MDhceDBjXG5cclx0JywgJyJcXGJcXGZcXG5cXHJcXHQiJyksCisgICAgKHUneyJvYmplY3Qgd2l0aCAxIG1lbWJlciI6WyJhcnJheSB3aXRoIDEgZWxlbWVudCJdfScsICcie1xcIm9iamVjdCB3aXRoIDEgbWVtYmVyXFwiOltcXCJhcnJheSB3aXRoIDEgZWxlbWVudFxcIl19IicpLAorICAgICh1JyBzIHAgYSBjIGUgZCAnLCAnIiBzIHAgYSBjIGUgZCAiJyksCisgICAgKHUnXFUwMDAxZDEyMCcsICciXFx1ZDgzNFxcdWRkMjAiJyksCisgICAgKHUnXHUwM2IxXHUwM2E5JywgJyJcXHUwM2IxXFx1MDNhOSInKSwKKyAgICAoJ1x4Y2VceGIxXHhjZVx4YTknLCAnIlxcdTAzYjFcXHUwM2E5IicpLAorICAgICh1J1x1MDNiMVx1MDNhOScsICciXFx1MDNiMVxcdTAzYTkiJyksCisgICAgKCdceGNlXHhiMVx4Y2VceGE5JywgJyJcXHUwM2IxXFx1MDNhOSInKSwKKyAgICAodSdcdTAzYjFcdTAzYTknLCAnIlxcdTAzYjFcXHUwM2E5IicpLAorICAgICh1J1x1MDNiMVx1MDNhOScsICciXFx1MDNiMVxcdTAzYTkiJyksCisgICAgKHUiYDF+IUAjJCVeJiooKV8rLT17JzpbLF19fDsuPC8+PyIsICciYDF+IUAjJCVeJiooKV8rLT17XCc6WyxdfXw7LjwvPj8iJyksCisgICAgKHUnXHgwOFx4MGNcblxyXHQnLCAnIlxcYlxcZlxcblxcclxcdCInKSwKKyAgICAodSdcdTAxMjNcdTQ1NjdcdTg5YWJcdWNkZWZcdWFiY2RcdWVmNGEnLCAnIlxcdTAxMjNcXHU0NTY3XFx1ODlhYlxcdWNkZWZcXHVhYmNkXFx1ZWY0YSInKSwKK10KKworY2xhc3MgVGVzdEVuY29kZUJhc2VzdHJpbmdBc2NpaShvYmplY3QpOgorICAgIGRlZiB0ZXN0X2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpKHNlbGYpOgorICAgICAgICBmbmFtZSA9IHNlbGYuanNvbi5lbmNvZGVyLmVuY29kZV9iYXNlc3RyaW5nX2FzY2lpLl9fbmFtZV9fCisgICAgICAgIGZvciBpbnB1dF9zdHJpbmcsIGV4cGVjdCBpbiBDQVNFUzoKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuanNvbi5lbmNvZGVyLmVuY29kZV9iYXNlc3RyaW5nX2FzY2lpKGlucHV0X3N0cmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3QsCisgICAgICAgICAgICAgICAgJ3swIXJ9ICE9IHsxIXJ9IGZvciB7Mn0oezMhcn0pJy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgZXhwZWN0LCBmbmFtZSwgaW5wdXRfc3RyaW5nKSkKKworICAgIGRlZiB0ZXN0X29yZGVyZWRfZGljdChzZWxmKToKKyAgICAgICAgIyBTZWUgaXNzdWUgNjEwNQorICAgICAgICBpdGVtcyA9IFsoJ29uZScsIDEpLCAoJ3R3bycsIDIpLCAoJ3RocmVlJywgMyksICgnZm91cicsIDQpLCAoJ2ZpdmUnLCA1KV0KKyAgICAgICAgcyA9IHNlbGYuZHVtcHMoT3JkZXJlZERpY3QoaXRlbXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICd7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzLCAiZm91ciI6IDQsICJmaXZlIjogNX0nKQorCisKK2NsYXNzIFRlc3RQeUVuY29kZUJhc2VzdHJpbmdBc2NpaShUZXN0RW5jb2RlQmFzZXN0cmluZ0FzY2lpLCBQeVRlc3QpOiBwYXNzCitjbGFzcyBUZXN0Q0VuY29kZUJhc2VzdHJpbmdBc2NpaShUZXN0RW5jb2RlQmFzZXN0cmluZ0FzY2lpLCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI1NDJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpLnB5byBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI1NDJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2ZhaWwucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mYWlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMWIzNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mYWlsLnB5CkBAIC0wLDAgKzEsMTA1IEBACitmcm9tIGpzb24udGVzdHMgaW1wb3J0IFB5VGVzdCwgQ1Rlc3QKKworIyAyMDA3LTEwLTA1CitKU09ORE9DUyA9IFsKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMS5qc29uCisgICAgJyJBIEpTT04gcGF5bG9hZCBzaG91bGQgYmUgYW4gb2JqZWN0IG9yIGFycmF5LCBub3QgYSBzdHJpbmcuIicsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDIuanNvbgorICAgICdbIlVuY2xvc2VkIGFycmF5IicsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDMuanNvbgorICAgICd7dW5xdW90ZWRfa2V5OiAia2V5cyBtdXN0IGJlIHF1b3RlZCJ9JywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsNC5qc29uCisgICAgJ1siZXh0cmEgY29tbWEiLF0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWw1Lmpzb24KKyAgICAnWyJkb3VibGUgZXh0cmEgY29tbWEiLCxdJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsNi5qc29uCisgICAgJ1sgICAsICI8LS0gbWlzc2luZyB2YWx1ZSJdJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsNy5qc29uCisgICAgJ1siQ29tbWEgYWZ0ZXIgdGhlIGNsb3NlIl0sJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsOC5qc29uCisgICAgJ1siRXh0cmEgY2xvc2UiXV0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWw5Lmpzb24KKyAgICAneyJFeHRyYSBjb21tYSI6IHRydWUsfScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDEwLmpzb24KKyAgICAneyJFeHRyYSB2YWx1ZSBhZnRlciBjbG9zZSI6IHRydWV9ICJtaXNwbGFjZWQgcXVvdGVkIHZhbHVlIicsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDExLmpzb24KKyAgICAneyJJbGxlZ2FsIGV4cHJlc3Npb24iOiAxICsgMn0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwxMi5qc29uCisgICAgJ3siSWxsZWdhbCBpbnZvY2F0aW9uIjogYWxlcnQoKX0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwxMy5qc29uCisgICAgJ3siTnVtYmVycyBjYW5ub3QgaGF2ZSBsZWFkaW5nIHplcm9lcyI6IDAxM30nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwxNC5qc29uCisgICAgJ3siTnVtYmVycyBjYW5ub3QgYmUgaGV4IjogMHgxNH0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwxNS5qc29uCisgICAgJ1siSWxsZWdhbCBiYWNrc2xhc2ggZXNjYXBlOiBcXHgxNSJdJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMTYuanNvbgorICAgICdbXFxuYWtlZF0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwxNy5qc29uCisgICAgJ1siSWxsZWdhbCBiYWNrc2xhc2ggZXNjYXBlOiBcXDAxNyJdJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMTguanNvbgorICAgICdbW1tbW1tbW1tbW1tbW1tbW1tbWyJUb28gZGVlcCJdXV1dXV1dXV1dXV1dXV1dXV1dXScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDE5Lmpzb24KKyAgICAneyJNaXNzaW5nIGNvbG9uIiBudWxsfScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDIwLmpzb24KKyAgICAneyJEb3VibGUgY29sb24iOjogbnVsbH0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwyMS5qc29uCisgICAgJ3siQ29tbWEgaW5zdGVhZCBvZiBjb2xvbiIsIG51bGx9JywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMjIuanNvbgorICAgICdbIkNvbG9uIGluc3RlYWQgb2YgY29tbWEiOiBmYWxzZV0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwyMy5qc29uCisgICAgJ1siQmFkIHZhbHVlIiwgdHJ1dGhdJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMjQuanNvbgorICAgICJbJ3NpbmdsZSBxdW90ZSddIiwKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMjUuanNvbgorICAgICdbIlx0dGFiXHRjaGFyYWN0ZXJcdGluXHRzdHJpbmdcdCJdJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMjYuanNvbgorICAgICdbInRhYlxcICAgY2hhcmFjdGVyXFwgICBpblxcICBzdHJpbmdcXCAgIl0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwyNy5qc29uCisgICAgJ1sibGluZVxuYnJlYWsiXScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDI4Lmpzb24KKyAgICAnWyJsaW5lXFxcbmJyZWFrIl0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwyOS5qc29uCisgICAgJ1swZV0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwzMC5qc29uCisgICAgJ1swZStdJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMzEuanNvbgorICAgICdbMGUrLTFdJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMzIuanNvbgorICAgICd7IkNvbW1hIGluc3RlYWQgaWYgY2xvc2luZyBicmFjZSI6IHRydWUsJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMzMuanNvbgorICAgICdbIm1pc21hdGNoIn0nLAorICAgICMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3NpbXBsZWpzb24vaXNzdWVzL2RldGFpbD9pZD0zCisgICAgdSdbIkFcdTAwMUZaIGNvbnRyb2wgY2hhcmFjdGVycyBpbiBzdHJpbmciXScsCitdCisKK1NLSVBTID0geworICAgIDE6ICJ3aHkgbm90IGhhdmUgYSBzdHJpbmcgcGF5bG9hZD8iLAorICAgIDE4OiAic3BlYyBkb2Vzbid0IHNwZWNpZnkgYW55IG5lc3RpbmcgbGltaXRhdGlvbnMiLAorfQorCitjbGFzcyBUZXN0RmFpbChvYmplY3QpOgorICAgIGRlZiB0ZXN0X2ZhaWx1cmVzKHNlbGYpOgorICAgICAgICBmb3IgaWR4LCBkb2MgaW4gZW51bWVyYXRlKEpTT05ET0NTKToKKyAgICAgICAgICAgIGlkeCA9IGlkeCArIDEKKyAgICAgICAgICAgIGlmIGlkeCBpbiBTS0lQUzoKKyAgICAgICAgICAgICAgICBzZWxmLmxvYWRzKGRvYykKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYubG9hZHMoZG9jKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkIGZhaWx1cmUgZm9yIGZhaWx7MH0uanNvbjogezEhcn0iLmZvcm1hdChpZHgsIGRvYykpCisKKyAgICBkZWYgdGVzdF9ub25fc3RyaW5nX2tleXNfZGljdChzZWxmKToKKyAgICAgICAgZGF0YSA9IHsnYScgOiAxLCAoMSwgMikgOiAyfQorCisgICAgICAgICNUaGlzIGlzIGZvciBjIGVuY29kZXIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmR1bXBzLCBkYXRhKQorCisgICAgICAgICNUaGlzIGlzIGZvciBweXRob24gZW5jb2RlcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZHVtcHMsIGRhdGEsIGluZGVudD1UcnVlKQorCisKK2NsYXNzIFRlc3RQeUZhaWwoVGVzdEZhaWwsIFB5VGVzdCk6IHBhc3MKK2NsYXNzIFRlc3RDRmFpbChUZXN0RmFpbCwgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mYWlsLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2ZhaWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzI3MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mYWlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mYWlsLnB5byBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2ZhaWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzI3MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mYWlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mbG9hdC5weSBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2Zsb2F0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OWY5YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mbG9hdC5weQpAQCAtMCwwICsxLDM3IEBACitpbXBvcnQgbWF0aAorZnJvbSBqc29uLnRlc3RzIGltcG9ydCBQeVRlc3QsIENUZXN0CisKKworY2xhc3MgVGVzdEZsb2F0KG9iamVjdCk6CisgICAgZGVmIHRlc3RfZmxvYXRzKHNlbGYpOgorICAgICAgICBmb3IgbnVtIGluIFsxNjE3MTYxNzcxLjc2NTAwMDEsIG1hdGgucGksIG1hdGgucGkqKjEwMCwKKyAgICAgICAgICAgICAgICAgICAgbWF0aC5waSoqLTEwMCwgMy4xXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoc2VsZi5kdW1wcyhudW0pKSwgbnVtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHNlbGYuZHVtcHMobnVtKSksIG51bSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2Fkcyh1bmljb2RlKHNlbGYuZHVtcHMobnVtKSkpLCBudW0pCisKKyAgICBkZWYgdGVzdF9pbnRzKHNlbGYpOgorICAgICAgICBmb3IgbnVtIGluIFsxLCAxTCwgMTw8MzIsIDE8PDY0XToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kdW1wcyhudW0pLCBzdHIobnVtKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KHNlbGYuZHVtcHMobnVtKSksIG51bSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcyhzZWxmLmR1bXBzKG51bSkpLCBudW0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHModW5pY29kZShzZWxmLmR1bXBzKG51bSkpKSwgbnVtKQorCisgICAgZGVmIHRlc3Rfb3V0X29mX3JhbmdlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMoJ1syMzQ1Njc4OTAxMkU2NjZdJyksIFtmbG9hdCgnaW5mJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMoJ1stMjM0NTY3ODkwMTJFNjY2XScpLCBbZmxvYXQoJy1pbmYnKV0pCisKKyAgICBkZWYgdGVzdF9hbGxvd19uYW4oc2VsZik6CisgICAgICAgIGZvciB2YWwgaW4gKGZsb2F0KCdpbmYnKSwgZmxvYXQoJy1pbmYnKSwgZmxvYXQoJ25hbicpKToKKyAgICAgICAgICAgIG91dCA9IHNlbGYuZHVtcHMoW3ZhbF0pCisgICAgICAgICAgICBpZiB2YWwgPT0gdmFsOiAgIyBpbmYKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMob3V0KSwgW3ZhbF0pCisgICAgICAgICAgICBlbHNlOiAgIyBuYW4KKyAgICAgICAgICAgICAgICByZXMgPSBzZWxmLmxvYWRzKG91dCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmVzWzBdLCByZXNbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmR1bXBzLCBbdmFsXSwgYWxsb3dfbmFuPUZhbHNlKQorCisKK2NsYXNzIFRlc3RQeUZsb2F0KFRlc3RGbG9hdCwgUHlUZXN0KTogcGFzcworY2xhc3MgVGVzdENGbG9hdChUZXN0RmxvYXQsIENUZXN0KTogcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZmxvYXQucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZmxvYXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzdjNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mbG9hdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZmxvYXQucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZmxvYXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzdjNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mbG9hdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfaW5kZW50LnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfaW5kZW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMTg3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9pbmRlbnQucHkKQEAgLTAsMCArMSw2MCBAQAoraW1wb3J0IHRleHR3cmFwCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSBqc29uLnRlc3RzIGltcG9ydCBQeVRlc3QsIENUZXN0CisKKworY2xhc3MgVGVzdEluZGVudChvYmplY3QpOgorICAgIGRlZiB0ZXN0X2luZGVudChzZWxmKToKKyAgICAgICAgaCA9IFtbJ2Jsb3JwaWUnXSwgWyd3aG9vcHMnXSwgW10sICdkLXNodGFlb3UnLCAnZC1udGhpb3VoJywgJ2ktdmhiamtobnRoJywKKyAgICAgICAgICAgICB7J25pZnR5JzogODd9LCB7J2ZpZWxkJzogJ3llcycsICdtb3JlZmllbGQnOiBGYWxzZX0gXQorCisgICAgICAgIGV4cGVjdCA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgIFsKKyAgICAgICAgICBbCisgICAgICAgICAgICAiYmxvcnBpZSIKKyAgICAgICAgICBdLAorICAgICAgICAgIFsKKyAgICAgICAgICAgICJ3aG9vcHMiCisgICAgICAgICAgXSwKKyAgICAgICAgICBbXSwKKyAgICAgICAgICAiZC1zaHRhZW91IiwKKyAgICAgICAgICAiZC1udGhpb3VoIiwKKyAgICAgICAgICAiaS12aGJqa2hudGgiLAorICAgICAgICAgIHsKKyAgICAgICAgICAgICJuaWZ0eSI6IDg3CisgICAgICAgICAgfSwKKyAgICAgICAgICB7CisgICAgICAgICAgICAiZmllbGQiOiAieWVzIiwKKyAgICAgICAgICAgICJtb3JlZmllbGQiOiBmYWxzZQorICAgICAgICAgIH0KKyAgICAgICAgXSIiIikKKworCisgICAgICAgIGQxID0gc2VsZi5kdW1wcyhoKQorICAgICAgICBkMiA9IHNlbGYuZHVtcHMoaCwgaW5kZW50PTIsIHNvcnRfa2V5cz1UcnVlLCBzZXBhcmF0b3JzPSgnLCcsICc6ICcpKQorCisgICAgICAgIGgxID0gc2VsZi5sb2FkcyhkMSkKKyAgICAgICAgaDIgPSBzZWxmLmxvYWRzKGQyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaDEsIGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaDIsIGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIsIGV4cGVjdCkKKworICAgIGRlZiB0ZXN0X2luZGVudDAoc2VsZik6CisgICAgICAgIGggPSB7MzogMX0KKyAgICAgICAgZGVmIGNoZWNrKGluZGVudCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgZDEgPSBzZWxmLmR1bXBzKGgsIGluZGVudD1pbmRlbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCBleHBlY3RlZCkKKworICAgICAgICAgICAgc2lvID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgc2VsZi5qc29uLmR1bXAoaCwgc2lvLCBpbmRlbnQ9aW5kZW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaW8uZ2V0dmFsdWUoKSwgZXhwZWN0ZWQpCisKKyAgICAgICAgIyBpbmRlbnQ9MCBzaG91bGQgZW1pdCBuZXdsaW5lcworICAgICAgICBjaGVjaygwLCAne1xuIjMiOiAxXG59JykKKyAgICAgICAgIyBpbmRlbnQ9Tm9uZSBpcyBtb3JlIGNvbXBhY3QKKyAgICAgICAgY2hlY2soTm9uZSwgJ3siMyI6IDF9JykKKworCitjbGFzcyBUZXN0UHlJbmRlbnQoVGVzdEluZGVudCwgUHlUZXN0KTogcGFzcworY2xhc3MgVGVzdENJbmRlbnQoVGVzdEluZGVudCwgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9pbmRlbnQucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfaW5kZW50LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTMzYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfaW5kZW50LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9pbmRlbnQucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfaW5kZW50LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTMzYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfaW5kZW50LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMS5weSBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MxLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODI1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMS5weQpAQCAtMCwwICsxLDc1IEBACitmcm9tIGpzb24udGVzdHMgaW1wb3J0IFB5VGVzdCwgQ1Rlc3QKKworCisjIGZyb20gaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L3Bhc3MxLmpzb24KK0pTT04gPSByJycnCitbCisgICAgIkpTT04gVGVzdCBQYXR0ZXJuIHBhc3MxIiwKKyAgICB7Im9iamVjdCB3aXRoIDEgbWVtYmVyIjpbImFycmF5IHdpdGggMSBlbGVtZW50Il19LAorICAgIHt9LAorICAgIFtdLAorICAgIC00MiwKKyAgICB0cnVlLAorICAgIGZhbHNlLAorICAgIG51bGwsCisgICAgeworICAgICAgICAiaW50ZWdlciI6IDEyMzQ1Njc4OTAsCisgICAgICAgICJyZWFsIjogLTk4NzYuNTQzMjEwLAorICAgICAgICAiZSI6IDAuMTIzNDU2Nzg5ZS0xMiwKKyAgICAgICAgIkUiOiAxLjIzNDU2Nzg5MEUrMzQsCisgICAgICAgICIiOiAgMjM0NTY3ODkwMTJFNjYsCisgICAgICAgICJ6ZXJvIjogMCwKKyAgICAgICAgIm9uZSI6IDEsCisgICAgICAgICJzcGFjZSI6ICIgIiwKKyAgICAgICAgInF1b3RlIjogIlwiIiwKKyAgICAgICAgImJhY2tzbGFzaCI6ICJcXCIsCisgICAgICAgICJjb250cm9scyI6ICJcYlxmXG5cclx0IiwKKyAgICAgICAgInNsYXNoIjogIi8gJiBcLyIsCisgICAgICAgICJhbHBoYSI6ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3l6IiwKKyAgICAgICAgIkFMUEhBIjogIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWVoiLAorICAgICAgICAiZGlnaXQiOiAiMDEyMzQ1Njc4OSIsCisgICAgICAgICIwMTIzNDU2Nzg5IjogImRpZ2l0IiwKKyAgICAgICAgInNwZWNpYWwiOiAiYDF+IUAjJCVeJiooKV8rLT17JzpbLF19fDsuPC8+PyIsCisgICAgICAgICJoZXgiOiAiXHUwMTIzXHU0NTY3XHU4OUFCXHVDREVGXHVhYmNkXHVlZjRBIiwKKyAgICAgICAgInRydWUiOiB0cnVlLAorICAgICAgICAiZmFsc2UiOiBmYWxzZSwKKyAgICAgICAgIm51bGwiOiBudWxsLAorICAgICAgICAiYXJyYXkiOlsgIF0sCisgICAgICAgICJvYmplY3QiOnsgIH0sCisgICAgICAgICJhZGRyZXNzIjogIjUwIFN0LiBKYW1lcyBTdHJlZXQiLAorICAgICAgICAidXJsIjogImh0dHA6Ly93d3cuSlNPTi5vcmcvIiwKKyAgICAgICAgImNvbW1lbnQiOiAiLy8gLyogPCEtLSAtLSIsCisgICAgICAgICIjIC0tIC0tPiAqLyI6ICIgIiwKKyAgICAgICAgIiBzIHAgYSBjIGUgZCAiIDpbMSwyICwgMworCissCisKKzQgLCA1ICAgICAgICAsICAgICAgICAgIDYgICAgICAgICAgICw3ICAgICAgICBdLCJjb21wYWN0IjpbMSwyLDMsNCw1LDYsN10sCisgICAgICAgICJqc29udGV4dCI6ICJ7XCJvYmplY3Qgd2l0aCAxIG1lbWJlclwiOltcImFycmF5IHdpdGggMSBlbGVtZW50XCJdfSIsCisgICAgICAgICJxdW90ZXMiOiAiJiMzNDsgXHUwMDIyICUyMiAweDIyIDAzNCAmI3gyMjsiLAorICAgICAgICAiXC9cXFwiXHVDQUZFXHVCQUJFXHVBQjk4XHVGQ0RFXHViY2RhXHVlZjRBXGJcZlxuXHJcdGAxfiFAIyQlXiYqKClfKy09W117fXw7OicsLi88Pj8iCis6ICJBIGtleSBjYW4gYmUgYW55IHN0cmluZyIKKyAgICB9LAorICAgIDAuNSAsOTguNgorLAorOTkuNDQKKywKKworMTA2NiwKKzFlMSwKKzAuMWUxLAorMWUtMSwKKzFlMDAsMmUrMDAsMmUtMDAKKywicm9zZWJ1ZCJdCisnJycKKworY2xhc3MgVGVzdFBhc3MxKG9iamVjdCk6CisgICAgZGVmIHRlc3RfcGFyc2Uoc2VsZik6CisgICAgICAgICMgdGVzdCBpbi9vdXQgZXF1aXZhbGVuY2UgYW5kIHBhcnNpbmcKKyAgICAgICAgcmVzID0gc2VsZi5sb2FkcyhKU09OKQorICAgICAgICBvdXQgPSBzZWxmLmR1bXBzKHJlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHNlbGYubG9hZHMob3V0KSkKKworCitjbGFzcyBUZXN0UHlQYXNzMShUZXN0UGFzczEsIFB5VGVzdCk6IHBhc3MKK2NsYXNzIFRlc3RDUGFzczEoVGVzdFBhc3MxLCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MxLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MxLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTE3Mjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MxLnB5byBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MxLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTE3Mjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MyLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiYjZkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MyLnB5CkBAIC0wLDAgKzEsMTggQEAKK2Zyb20ganNvbi50ZXN0cyBpbXBvcnQgUHlUZXN0LCBDVGVzdAorCisKKyMgZnJvbSBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvcGFzczIuanNvbgorSlNPTiA9IHInJycKK1tbW1tbW1tbW1tbW1tbW1tbW1siTm90IHRvbyBkZWVwIl1dXV1dXV1dXV1dXV1dXV1dXV0KKycnJworCitjbGFzcyBUZXN0UGFzczIob2JqZWN0KToKKyAgICBkZWYgdGVzdF9wYXJzZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IGluL291dCBlcXVpdmFsZW5jZSBhbmQgcGFyc2luZworICAgICAgICByZXMgPSBzZWxmLmxvYWRzKEpTT04pCisgICAgICAgIG91dCA9IHNlbGYuZHVtcHMocmVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgc2VsZi5sb2FkcyhvdXQpKQorCisKK2NsYXNzIFRlc3RQeVBhc3MyKFRlc3RQYXNzMiwgUHlUZXN0KTogcGFzcworY2xhc3MgVGVzdENQYXNzMihUZXN0UGFzczIsIENUZXN0KTogcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczIucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MDRiYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczIucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MDRiYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczMucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjFmOWEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczMucHkKQEAgLTAsMCArMSwyNCBAQAorZnJvbSBqc29uLnRlc3RzIGltcG9ydCBQeVRlc3QsIENUZXN0CisKKworIyBmcm9tIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9wYXNzMy5qc29uCitKU09OID0gcicnJworeworICAgICJKU09OIFRlc3QgUGF0dGVybiBwYXNzMyI6IHsKKyAgICAgICAgIlRoZSBvdXRlcm1vc3QgdmFsdWUiOiAibXVzdCBiZSBhbiBvYmplY3Qgb3IgYXJyYXkuIiwKKyAgICAgICAgIkluIHRoaXMgdGVzdCI6ICJJdCBpcyBhbiBvYmplY3QuIgorICAgIH0KK30KKycnJworCisKK2NsYXNzIFRlc3RQYXNzMyhvYmplY3QpOgorICAgIGRlZiB0ZXN0X3BhcnNlKHNlbGYpOgorICAgICAgICAjIHRlc3QgaW4vb3V0IGVxdWl2YWxlbmNlIGFuZCBwYXJzaW5nCisgICAgICAgIHJlcyA9IHNlbGYubG9hZHMoSlNPTikKKyAgICAgICAgb3V0ID0gc2VsZi5kdW1wcyhyZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBzZWxmLmxvYWRzKG91dCkpCisKKworY2xhc3MgVGVzdFB5UGFzczMoVGVzdFBhc3MzLCBQeVRlc3QpOiBwYXNzCitjbGFzcyBUZXN0Q1Bhc3MzKFRlc3RQYXNzMywgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMy5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhYWY2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMy5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhYWY2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9yZWN1cnNpb24ucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9yZWN1cnNpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyMjFlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3JlY3Vyc2lvbi5weQpAQCAtMCwwICsxLDEwOCBAQAorZnJvbSBqc29uLnRlc3RzIGltcG9ydCBQeVRlc3QsIENUZXN0CisKKworY2xhc3MgSlNPTlRlc3RPYmplY3Q6CisgICAgcGFzcworCisKK2NsYXNzIFRlc3RSZWN1cnNpb24ob2JqZWN0KToKKyAgICBkZWYgdGVzdF9saXN0cmVjdXJzaW9uKHNlbGYpOgorICAgICAgICB4ID0gW10KKyAgICAgICAgeC5hcHBlbmQoeCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kdW1wcyh4KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGlkbid0IHJhaXNlIFZhbHVlRXJyb3Igb24gbGlzdCByZWN1cnNpb24iKQorICAgICAgICB4ID0gW10KKyAgICAgICAgeSA9IFt4XQorICAgICAgICB4LmFwcGVuZCh5KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmR1bXBzKHgpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJkaWRuJ3QgcmFpc2UgVmFsdWVFcnJvciBvbiBhbHRlcm5hdGluZyBsaXN0IHJlY3Vyc2lvbiIpCisgICAgICAgIHkgPSBbXQorICAgICAgICB4ID0gW3ksIHldCisgICAgICAgICMgZW5zdXJlIHRoYXQgdGhlIG1hcmtlciBpcyBjbGVhcmVkCisgICAgICAgIHNlbGYuZHVtcHMoeCkKKworICAgIGRlZiB0ZXN0X2RpY3RyZWN1cnNpb24oc2VsZik6CisgICAgICAgIHggPSB7fQorICAgICAgICB4WyJ0ZXN0Il0gPSB4CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZHVtcHMoeCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImRpZG4ndCByYWlzZSBWYWx1ZUVycm9yIG9uIGRpY3QgcmVjdXJzaW9uIikKKyAgICAgICAgeCA9IHt9CisgICAgICAgIHkgPSB7ImEiOiB4LCAiYiI6IHh9CisgICAgICAgICMgZW5zdXJlIHRoYXQgdGhlIG1hcmtlciBpcyBjbGVhcmVkCisgICAgICAgIHNlbGYuZHVtcHMoeCkKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRyZWN1cnNpb24oc2VsZik6CisgICAgICAgIGNsYXNzIFJlY3Vyc2l2ZUpTT05FbmNvZGVyKHNlbGYuanNvbi5KU09ORW5jb2Rlcik6CisgICAgICAgICAgICByZWN1cnNlID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBkZWZhdWx0KHNlbGYsIG8pOgorICAgICAgICAgICAgICAgIGlmIG8gaXMgSlNPTlRlc3RPYmplY3Q6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucmVjdXJzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbSlNPTlRlc3RPYmplY3RdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0pTT05UZXN0T2JqZWN0JworICAgICAgICAgICAgICAgIHJldHVybiBweWpzb24uSlNPTkVuY29kZXIuZGVmYXVsdChvKQorCisgICAgICAgIGVuYyA9IFJlY3Vyc2l2ZUpTT05FbmNvZGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmMuZW5jb2RlKEpTT05UZXN0T2JqZWN0KSwgJyJKU09OVGVzdE9iamVjdCInKQorICAgICAgICBlbmMucmVjdXJzZSA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW5jLmVuY29kZShKU09OVGVzdE9iamVjdCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImRpZG4ndCByYWlzZSBWYWx1ZUVycm9yIG9uIGRlZmF1bHQgcmVjdXJzaW9uIikKKworCisgICAgZGVmIHRlc3RfaGlnaGx5X25lc3RlZF9vYmplY3RzX2RlY29kaW5nKHNlbGYpOgorICAgICAgICAjIHRlc3QgdGhhdCBsb2FkaW5nIGhpZ2hseS1uZXN0ZWQgb2JqZWN0cyBkb2Vzbid0IHNlZ2ZhdWx0IHdoZW4gQworICAgICAgICAjIGFjY2VsZXJhdGlvbnMgYXJlIHVzZWQuIFNlZSAjMTIwMTcKKyAgICAgICAgIyBzdHIKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5sb2FkcygneyJhIjonICogMTAwMDAwICsgJzEnICsgJ30nICogMTAwMDAwKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLmxvYWRzKCd7ImEiOicgKiAxMDAwMDAgKyAnWzFdJyArICd9JyAqIDEwMDAwMCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5sb2FkcygnWycgKiAxMDAwMDAgKyAnMScgKyAnXScgKiAxMDAwMDApCisgICAgICAgICMgdW5pY29kZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLmxvYWRzKHUneyJhIjonICogMTAwMDAwICsgdScxJyArIHUnfScgKiAxMDAwMDApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYubG9hZHModSd7ImEiOicgKiAxMDAwMDAgKyB1J1sxXScgKyB1J30nICogMTAwMDAwKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLmxvYWRzKHUnWycgKiAxMDAwMDAgKyB1JzEnICsgdSddJyAqIDEwMDAwMCkKKworICAgIGRlZiB0ZXN0X2hpZ2hseV9uZXN0ZWRfb2JqZWN0c19lbmNvZGluZyhzZWxmKToKKyAgICAgICAgIyBTZWUgIzEyMDUxCisgICAgICAgIGwsIGQgPSBbXSwge30KKyAgICAgICAgZm9yIHggaW4geHJhbmdlKDEwMDAwMCk6CisgICAgICAgICAgICBsLCBkID0gW2xdLCB7J2snOmR9CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYuZHVtcHMobCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5kdW1wcyhkKQorCisgICAgZGVmIHRlc3RfZW5kbGVzc19yZWN1cnNpb24oc2VsZik6CisgICAgICAgICMgU2VlICMxMjA1MQorICAgICAgICBjbGFzcyBFbmRsZXNzSlNPTkVuY29kZXIoc2VsZi5qc29uLkpTT05FbmNvZGVyKToKKyAgICAgICAgICAgIGRlZiBkZWZhdWx0KHNlbGYsIG8pOgorICAgICAgICAgICAgICAgICIiIklmIGNoZWNrX2NpcmN1bGFyIGlzIEZhbHNlLCB0aGlzIHdpbGwga2VlcCBhZGRpbmcgYW5vdGhlciBsaXN0LiIiIgorICAgICAgICAgICAgICAgIHJldHVybiBbb10KKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBFbmRsZXNzSlNPTkVuY29kZXIoY2hlY2tfY2lyY3VsYXI9RmFsc2UpLmVuY29kZSg1aikKKworCitjbGFzcyBUZXN0UHlSZWN1cnNpb24oVGVzdFJlY3Vyc2lvbiwgUHlUZXN0KTogcGFzcworY2xhc3MgVGVzdENSZWN1cnNpb24oVGVzdFJlY3Vyc2lvbiwgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9yZWN1cnNpb24ucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcmVjdXJzaW9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWZhZjQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcmVjdXJzaW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9yZWN1cnNpb24ucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcmVjdXJzaW9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWZhZjQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcmVjdXJzaW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zY2Fuc3RyaW5nLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc2NhbnN0cmluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmVmOGNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc2NhbnN0cmluZy5weQpAQCAtMCwwICsxLDEwOSBAQAoraW1wb3J0IHN5cworZnJvbSBqc29uLnRlc3RzIGltcG9ydCBQeVRlc3QsIENUZXN0CisKKworY2xhc3MgVGVzdFNjYW5zdHJpbmcob2JqZWN0KToKKyAgICBkZWYgdGVzdF9zY2Fuc3RyaW5nKHNlbGYpOgorICAgICAgICBzY2Fuc3RyaW5nID0gc2VsZi5qc29uLmRlY29kZXIuc2NhbnN0cmluZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygnInpcXHVkODM0XFx1ZGQyMHgiJywgMSwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSd6XFUwMDAxZDEyMHgnLCAxNikpCisKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgPT0gNjU1MzU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIHNjYW5zdHJpbmcodScielxVMDAwMWQxMjB4IicsIDEsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgICAgICh1J3pcVTAwMDFkMTIweCcsIDYpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICBzY2Fuc3RyaW5nKHUnInpcVTAwMDFkMTIweCInLCAxLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAodSd6XFUwMDAxZDEyMHgnLCA1KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygnIlxcdTAwN2IiJywgMSwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSd7JywgOCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNjYW5zdHJpbmcoJyJBIEpTT04gcGF5bG9hZCBzaG91bGQgYmUgYW4gb2JqZWN0IG9yIGFycmF5LCBub3QgYSBzdHJpbmcuIicsIDEsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgKHUnQSBKU09OIHBheWxvYWQgc2hvdWxkIGJlIGFuIG9iamVjdCBvciBhcnJheSwgbm90IGEgc3RyaW5nLicsIDYwKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygnWyJVbmNsb3NlZCBhcnJheSInLCAyLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J1VuY2xvc2VkIGFycmF5JywgMTcpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCdbImV4dHJhIGNvbW1hIixdJywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdleHRyYSBjb21tYScsIDE0KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygnWyJkb3VibGUgZXh0cmEgY29tbWEiLCxdJywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdkb3VibGUgZXh0cmEgY29tbWEnLCAyMSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNjYW5zdHJpbmcoJ1siQ29tbWEgYWZ0ZXIgdGhlIGNsb3NlIl0sJywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdDb21tYSBhZnRlciB0aGUgY2xvc2UnLCAyNCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNjYW5zdHJpbmcoJ1siRXh0cmEgY2xvc2UiXV0nLCAyLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J0V4dHJhIGNsb3NlJywgMTQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCd7IkV4dHJhIGNvbW1hIjogdHJ1ZSx9JywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdFeHRyYSBjb21tYScsIDE0KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygneyJFeHRyYSB2YWx1ZSBhZnRlciBjbG9zZSI6IHRydWV9ICJtaXNwbGFjZWQgcXVvdGVkIHZhbHVlIicsIDIsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgKHUnRXh0cmEgdmFsdWUgYWZ0ZXIgY2xvc2UnLCAyNikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNjYW5zdHJpbmcoJ3siSWxsZWdhbCBleHByZXNzaW9uIjogMSArIDJ9JywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdJbGxlZ2FsIGV4cHJlc3Npb24nLCAyMSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNjYW5zdHJpbmcoJ3siSWxsZWdhbCBpbnZvY2F0aW9uIjogYWxlcnQoKX0nLCAyLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J0lsbGVnYWwgaW52b2NhdGlvbicsIDIxKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygneyJOdW1iZXJzIGNhbm5vdCBoYXZlIGxlYWRpbmcgemVyb2VzIjogMDEzfScsIDIsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgKHUnTnVtYmVycyBjYW5ub3QgaGF2ZSBsZWFkaW5nIHplcm9lcycsIDM3KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygneyJOdW1iZXJzIGNhbm5vdCBiZSBoZXgiOiAweDE0fScsIDIsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgKHUnTnVtYmVycyBjYW5ub3QgYmUgaGV4JywgMjQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCdbW1tbW1tbW1tbW1tbW1tbW1tbWyJUb28gZGVlcCJdXV1dXV1dXV1dXV1dXV1dXV1dXScsIDIxLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J1RvbyBkZWVwJywgMzApKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCd7Ik1pc3NpbmcgY29sb24iIG51bGx9JywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdNaXNzaW5nIGNvbG9uJywgMTYpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCd7IkRvdWJsZSBjb2xvbiI6OiBudWxsfScsIDIsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgKHUnRG91YmxlIGNvbG9uJywgMTUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCd7IkNvbW1hIGluc3RlYWQgb2YgY29sb24iLCBudWxsfScsIDIsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgKHUnQ29tbWEgaW5zdGVhZCBvZiBjb2xvbicsIDI1KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygnWyJDb2xvbiBpbnN0ZWFkIG9mIGNvbW1hIjogZmFsc2VdJywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdDb2xvbiBpbnN0ZWFkIG9mIGNvbW1hJywgMjUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCdbIkJhZCB2YWx1ZSIsIHRydXRoXScsIDIsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgKHUnQmFkIHZhbHVlJywgMTIpKQorCisgICAgZGVmIHRlc3RfaXNzdWUzNjIzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmpzb24uZGVjb2Rlci5zY2Fuc3RyaW5nLCBiInh4eCIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ4eHgiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuanNvbi5lbmNvZGVyLmVuY29kZV9iYXNlc3RyaW5nX2FzY2lpLCBiInh4XHhmZiIpCisKKyAgICBkZWYgdGVzdF9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yKToKKyAgICAgICAgICAgIHNlbGYuanNvbi5kZWNvZGVyLnNjYW5zdHJpbmcoYiJ4eHgiLCBzeXMubWF4c2l6ZSsxKQorCisKK2NsYXNzIFRlc3RQeVNjYW5zdHJpbmcoVGVzdFNjYW5zdHJpbmcsIFB5VGVzdCk6IHBhc3MKK2NsYXNzIFRlc3RDU2NhbnN0cmluZyhUZXN0U2NhbnN0cmluZywgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zY2Fuc3RyaW5nLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NjYW5zdHJpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOWM1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zY2Fuc3RyaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zY2Fuc3RyaW5nLnB5byBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NjYW5zdHJpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOWM1YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zY2Fuc3RyaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zZXBhcmF0b3JzLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc2VwYXJhdG9ycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDI0NmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc2VwYXJhdG9ycy5weQpAQCAtMCwwICsxLDQ0IEBACitpbXBvcnQgdGV4dHdyYXAKK2Zyb20ganNvbi50ZXN0cyBpbXBvcnQgUHlUZXN0LCBDVGVzdAorCisKK2NsYXNzIFRlc3RTZXBhcmF0b3JzKG9iamVjdCk6CisgICAgZGVmIHRlc3Rfc2VwYXJhdG9ycyhzZWxmKToKKyAgICAgICAgaCA9IFtbJ2Jsb3JwaWUnXSwgWyd3aG9vcHMnXSwgW10sICdkLXNodGFlb3UnLCAnZC1udGhpb3VoJywgJ2ktdmhiamtobnRoJywKKyAgICAgICAgICAgICB7J25pZnR5JzogODd9LCB7J2ZpZWxkJzogJ3llcycsICdtb3JlZmllbGQnOiBGYWxzZX0gXQorCisgICAgICAgIGV4cGVjdCA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgIFsKKyAgICAgICAgICBbCisgICAgICAgICAgICAiYmxvcnBpZSIKKyAgICAgICAgICBdICwKKyAgICAgICAgICBbCisgICAgICAgICAgICAid2hvb3BzIgorICAgICAgICAgIF0gLAorICAgICAgICAgIFtdICwKKyAgICAgICAgICAiZC1zaHRhZW91IiAsCisgICAgICAgICAgImQtbnRoaW91aCIgLAorICAgICAgICAgICJpLXZoYmpraG50aCIgLAorICAgICAgICAgIHsKKyAgICAgICAgICAgICJuaWZ0eSIgOiA4NworICAgICAgICAgIH0gLAorICAgICAgICAgIHsKKyAgICAgICAgICAgICJmaWVsZCIgOiAieWVzIiAsCisgICAgICAgICAgICAibW9yZWZpZWxkIiA6IGZhbHNlCisgICAgICAgICAgfQorICAgICAgICBdIiIiKQorCisKKyAgICAgICAgZDEgPSBzZWxmLmR1bXBzKGgpCisgICAgICAgIGQyID0gc2VsZi5kdW1wcyhoLCBpbmRlbnQ9Miwgc29ydF9rZXlzPVRydWUsIHNlcGFyYXRvcnM9KCcgLCcsICcgOiAnKSkKKworICAgICAgICBoMSA9IHNlbGYubG9hZHMoZDEpCisgICAgICAgIGgyID0gc2VsZi5sb2FkcyhkMikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgxLCBoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgyLCBoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLCBleHBlY3QpCisKKworY2xhc3MgVGVzdFB5U2VwYXJhdG9ycyhUZXN0U2VwYXJhdG9ycywgUHlUZXN0KTogcGFzcworY2xhc3MgVGVzdENTZXBhcmF0b3JzKFRlc3RTZXBhcmF0b3JzLCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NlcGFyYXRvcnMucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc2VwYXJhdG9ycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlY2ZmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NlcGFyYXRvcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NlcGFyYXRvcnMucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc2VwYXJhdG9ycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlY2ZmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NlcGFyYXRvcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NwZWVkdXBzLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc3BlZWR1cHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4NmE0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NwZWVkdXBzLnB5CkBAIC0wLDAgKzEsMjMgQEAKK2Zyb20ganNvbi50ZXN0cyBpbXBvcnQgQ1Rlc3QKKworCitjbGFzcyBUZXN0U3BlZWR1cHMoQ1Rlc3QpOgorICAgIGRlZiB0ZXN0X3NjYW5zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5qc29uLmRlY29kZXIuc2NhbnN0cmluZy5fX21vZHVsZV9fLCAiX2pzb24iKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYuanNvbi5kZWNvZGVyLnNjYW5zdHJpbmcsIHNlbGYuanNvbi5kZWNvZGVyLmNfc2NhbnN0cmluZykKKworICAgIGRlZiB0ZXN0X2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuanNvbi5lbmNvZGVyLmVuY29kZV9iYXNlc3RyaW5nX2FzY2lpLl9fbW9kdWxlX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9qc29uIikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLmpzb24uZW5jb2Rlci5lbmNvZGVfYmFzZXN0cmluZ19hc2NpaSwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmpzb24uZW5jb2Rlci5jX2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpKQorCitjbGFzcyBUZXN0RGVjb2RlKENUZXN0KToKKyAgICBkZWYgdGVzdF9tYWtlX3NjYW5uZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZWxmLmpzb24uc2Nhbm5lci5jX21ha2Vfc2Nhbm5lciwgMSkKKworICAgIGRlZiB0ZXN0X21ha2VfZW5jb2RlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmpzb24uZW5jb2Rlci5jX21ha2VfZW5jb2RlciwKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAiXHhDRFx4N0RceDNEXHg0RVx4MTJceDRDXHhGOVx4NzlceEQ3XHg1Mlx4QkFceDgyXHhGMlx4MjdceDRBXHg3RFx4QTBceENBXHg3NSIsCisgICAgICAgICAgICBOb25lKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc3BlZWR1cHMucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc3BlZWR1cHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDQ3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zcGVlZHVwcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc3BlZWR1cHMucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc3BlZWR1cHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDQ3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zcGVlZHVwcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdG9vbC5weSBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Rvb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkZmI4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Rvb2wucHkKQEAgLTAsMCArMSw2OSBAQAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN1YnByb2Nlc3MKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaworCitjbGFzcyBUZXN0VG9vbCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGF0YSA9ICIiIgorCisgICAgICAgIFtbImJsb3JwaWUiXSxbICJ3aG9vcHMiIF0gLCBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFx0ImQtc2h0YWVvdSIsXHIiZC1udGhpb3VoIiwKKyAgICAgICAgImktdmhiamtobnRoIiwgeyJuaWZ0eSI6ODd9LCB7Im1vcmVmaWVsZCIgOlx0ZmFsc2UsImZpZWxkIgorICAgICAgICAgICAgOiJ5ZXMifSAgXQorICAgICAgICAgICAiIiIKKworICAgIGV4cGVjdCA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgWworICAgICAgICBbCisgICAgICAgICAgICAiYmxvcnBpZSIKKyAgICAgICAgXSwKKyAgICAgICAgWworICAgICAgICAgICAgIndob29wcyIKKyAgICAgICAgXSwKKyAgICAgICAgW10sCisgICAgICAgICJkLXNodGFlb3UiLAorICAgICAgICAiZC1udGhpb3VoIiwKKyAgICAgICAgImktdmhiamtobnRoIiwKKyAgICAgICAgeworICAgICAgICAgICAgIm5pZnR5IjogODcKKyAgICAgICAgfSwKKyAgICAgICAgeworICAgICAgICAgICAgImZpZWxkIjogInllcyIsCisgICAgICAgICAgICAibW9yZWZpZWxkIjogZmFsc2UKKyAgICAgICAgfQorICAgIF0KKyAgICAiIiIpCisKKyAgICBkZWYgdGVzdF9zdGRpbl9zdGRvdXQoc2VsZik6CisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKAorICAgICAgICAgICAgICAgIChzeXMuZXhlY3V0YWJsZSwgJy1tJywgJ2pzb24udG9vbCcpLAorICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgb3V0LCBlcnIgPSBwcm9jLmNvbW11bmljYXRlKHNlbGYuZGF0YS5lbmNvZGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQuc3BsaXRsaW5lcygpLCBzZWxmLmV4cGVjdC5lbmNvZGUoKS5zcGxpdGxpbmVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBOb25lKQorCisgICAgZGVmIF9jcmVhdGVfaW5maWxlKHNlbGYpOgorICAgICAgICBpbmZpbGUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHdpdGggb3BlbihpbmZpbGUsICJ3IikgYXMgZnA6CisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAob3MucmVtb3ZlLCBpbmZpbGUpCisgICAgICAgICAgICBmcC53cml0ZShzZWxmLmRhdGEpCisgICAgICAgIHJldHVybiBpbmZpbGUKKworICAgIGRlZiB0ZXN0X2luZmlsZV9zdGRvdXQoc2VsZik6CisgICAgICAgIGluZmlsZSA9IHNlbGYuX2NyZWF0ZV9pbmZpbGUoKQorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCctbScsICdqc29uLnRvb2wnLCBpbmZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnNwbGl0bGluZXMoKSwgc2VsZi5leHBlY3QuZW5jb2RlKCkuc3BsaXRsaW5lcygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgYicnKQorCisgICAgZGVmIHRlc3RfaW5maWxlX291dGZpbGUoc2VsZik6CisgICAgICAgIGluZmlsZSA9IHNlbGYuX2NyZWF0ZV9pbmZpbGUoKQorICAgICAgICBvdXRmaWxlID0gdGVzdF9zdXBwb3J0LlRFU1RGTiArICcub3V0JworICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCctbScsICdqc29uLnRvb2wnLCBpbmZpbGUsIG91dGZpbGUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5yZW1vdmUsIG91dGZpbGUpCisgICAgICAgIHdpdGggb3BlbihvdXRmaWxlLCAiciIpIGFzIGZwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5yZWFkKCksIHNlbGYuZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgYicnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgYicnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdG9vbC5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF90b29sLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTAyZmEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdG9vbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdG9vbC5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF90b29sLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTAyZmEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdG9vbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdW5pY29kZS5weSBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3VuaWNvZGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwZjE1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3VuaWNvZGUucHkKQEAgLTAsMCArMSw4OSBAQAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKK2Zyb20ganNvbi50ZXN0cyBpbXBvcnQgUHlUZXN0LCBDVGVzdAorCisKK2NsYXNzIFRlc3RVbmljb2RlKG9iamVjdCk6CisgICAgZGVmIHRlc3RfZW5jb2RpbmcxKHNlbGYpOgorICAgICAgICBlbmNvZGVyID0gc2VsZi5qc29uLkpTT05FbmNvZGVyKGVuY29kaW5nPSd1dGYtOCcpCisgICAgICAgIHUgPSB1J1xOe0dSRUVLIFNNQUxMIExFVFRFUiBBTFBIQX1cTntHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQX0nCisgICAgICAgIHMgPSB1LmVuY29kZSgndXRmLTgnKQorICAgICAgICBqdSA9IGVuY29kZXIuZW5jb2RlKHUpCisgICAgICAgIGpzID0gZW5jb2Rlci5lbmNvZGUocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqdSwganMpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZzIoc2VsZik6CisgICAgICAgIHUgPSB1J1xOe0dSRUVLIFNNQUxMIExFVFRFUiBBTFBIQX1cTntHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQX0nCisgICAgICAgIHMgPSB1LmVuY29kZSgndXRmLTgnKQorICAgICAgICBqdSA9IHNlbGYuZHVtcHModSwgZW5jb2Rpbmc9J3V0Zi04JykKKyAgICAgICAganMgPSBzZWxmLmR1bXBzKHMsIGVuY29kaW5nPSd1dGYtOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoanUsIGpzKQorCisgICAgZGVmIHRlc3RfZW5jb2RpbmczKHNlbGYpOgorICAgICAgICB1ID0gdSdcTntHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEF9XE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0F9JworICAgICAgICBqID0gc2VsZi5kdW1wcyh1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGosICciXFx1MDNiMVxcdTAzYTkiJykKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nNChzZWxmKToKKyAgICAgICAgdSA9IHUnXE57R1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBfVxOe0dSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBfScKKyAgICAgICAgaiA9IHNlbGYuZHVtcHMoW3VdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGosICdbIlxcdTAzYjFcXHUwM2E5Il0nKQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmc1KHNlbGYpOgorICAgICAgICB1ID0gdSdcTntHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEF9XE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0F9JworICAgICAgICBqID0gc2VsZi5kdW1wcyh1LCBlbnN1cmVfYXNjaWk9RmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaiwgdSciezB9IicuZm9ybWF0KHUpKQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmc2KHNlbGYpOgorICAgICAgICB1ID0gdSdcTntHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEF9XE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0F9JworICAgICAgICBqID0gc2VsZi5kdW1wcyhbdV0sIGVuc3VyZV9hc2NpaT1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqLCB1J1siezB9Il0nLmZvcm1hdCh1KSkKKworICAgIGRlZiB0ZXN0X2JpZ191bmljb2RlX2VuY29kZShzZWxmKToKKyAgICAgICAgdSA9IHUnXFUwMDAxZDEyMCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmR1bXBzKHUpLCAnIlxcdWQ4MzRcXHVkZDIwIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kdW1wcyh1LCBlbnN1cmVfYXNjaWk9RmFsc2UpLCB1JyJcVTAwMDFkMTIwIicpCisKKyAgICBkZWYgdGVzdF9iaWdfdW5pY29kZV9kZWNvZGUoc2VsZik6CisgICAgICAgIHUgPSB1J3pcVTAwMDFkMTIweCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKCciJyArIHUgKyAnIicpLCB1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMoJyJ6XFx1ZDgzNFxcdWRkMjB4IicpLCB1KQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9kZWNvZGUoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIDB4ZDdmZik6CisgICAgICAgICAgICB1ID0gdW5pY2hyKGkpCisgICAgICAgICAgICBzID0gJyJcXHV7MDowNHh9IicuZm9ybWF0KGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMocyksIHUpCisKKyAgICBkZWYgdGVzdF9vYmplY3RfcGFpcnNfaG9va193aXRoX3VuaWNvZGUoc2VsZik6CisgICAgICAgIHMgPSB1J3sieGtkIjoxLCAia2N3IjoyLCAiYXJ0IjozLCAiaHhtIjo0LCAicXJ0Ijo1LCAicGFkIjo2LCAiaG95Ijo3fScKKyAgICAgICAgcCA9IFsodSJ4a2QiLCAxKSwgKHUia2N3IiwgMiksICh1ImFydCIsIDMpLCAodSJoeG0iLCA0KSwKKyAgICAgICAgICAgICAodSJxcnQiLCA1KSwgKHUicGFkIiwgNiksICh1ImhveSIsIDcpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMocyksIGV2YWwocykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcyhzLCBvYmplY3RfcGFpcnNfaG9vayA9IGxhbWJkYSB4OiB4KSwgcCkKKyAgICAgICAgb2QgPSBzZWxmLmxvYWRzKHMsIG9iamVjdF9wYWlyc19ob29rID0gT3JkZXJlZERpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2QsIE9yZGVyZWREaWN0KHApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUob2QpLCBPcmRlcmVkRGljdCkKKyAgICAgICAgIyB0aGUgb2JqZWN0X3BhaXJzX2hvb2sgdGFrZXMgcHJpb3JpdHkgb3ZlciB0aGUgb2JqZWN0X2hvb2sKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfcGFpcnNfaG9vayA9IE9yZGVyZWREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2hvb2sgPSBsYW1iZGEgeDogTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJlZERpY3QocCkpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHModSd7ImEiOiAiXHhlOSJ9Jy5lbmNvZGUoJ3V0Zi04JykpLAorICAgICAgICAgICAgeydhJzogdSdceGU5J30pCisKKyAgICBkZWYgdGVzdF91bmljb2RlX3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHNlbGYubG9hZHModSciIicpKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHNlbGYubG9hZHModSciYSInKSksIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzZWxmLmxvYWRzKHUnWyJhIl0nKVswXSksIHVuaWNvZGUpCisgICAgICAgICMgSXNzdWUgMTAwMzguCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzZWxmLmxvYWRzKCciZm9vIicpKSwgdW5pY29kZSkKKworICAgIGRlZiB0ZXN0X2JhZF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBzZWxmLmxvYWRzLCAnImEiJywgdSJyYXRceGU5IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmxvYWRzLCAnImEiJywgMSkKKworCitjbGFzcyBUZXN0UHlVbmljb2RlKFRlc3RVbmljb2RlLCBQeVRlc3QpOiBwYXNzCitjbGFzcyBUZXN0Q1VuaWNvZGUoVGVzdFVuaWNvZGUsIENUZXN0KTogcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdW5pY29kZS5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF91bmljb2RlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDAyNWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdW5pY29kZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdW5pY29kZS5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF91bmljb2RlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDAyNWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdW5pY29kZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rvb2wucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdG9vbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzVkNzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rvb2wucHkKQEAgLTAsMCArMSw0MCBAQAorciIiIkNvbW1hbmQtbGluZSB0b29sIHRvIHZhbGlkYXRlIGFuZCBwcmV0dHktcHJpbnQgSlNPTgorCitVc2FnZTo6CisKKyAgICAkIGVjaG8gJ3sianNvbiI6Im9iaiJ9JyB8IHB5dGhvbiAtbSBqc29uLnRvb2wKKyAgICB7CisgICAgICAgICJqc29uIjogIm9iaiIKKyAgICB9CisgICAgJCBlY2hvICd7IDEuMjozLjR9JyB8IHB5dGhvbiAtbSBqc29uLnRvb2wKKyAgICBFeHBlY3RpbmcgcHJvcGVydHkgbmFtZSBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzOiBsaW5lIDEgY29sdW1uIDMgKGNoYXIgMikKKworIiIiCitpbXBvcnQgc3lzCitpbXBvcnQganNvbgorCitkZWYgbWFpbigpOgorICAgIGlmIGxlbihzeXMuYXJndikgPT0gMToKKyAgICAgICAgaW5maWxlID0gc3lzLnN0ZGluCisgICAgICAgIG91dGZpbGUgPSBzeXMuc3Rkb3V0CisgICAgZWxpZiBsZW4oc3lzLmFyZ3YpID09IDI6CisgICAgICAgIGluZmlsZSA9IG9wZW4oc3lzLmFyZ3ZbMV0sICdyYicpCisgICAgICAgIG91dGZpbGUgPSBzeXMuc3Rkb3V0CisgICAgZWxpZiBsZW4oc3lzLmFyZ3YpID09IDM6CisgICAgICAgIGluZmlsZSA9IG9wZW4oc3lzLmFyZ3ZbMV0sICdyYicpCisgICAgICAgIG91dGZpbGUgPSBvcGVuKHN5cy5hcmd2WzJdLCAnd2InKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQoc3lzLmFyZ3ZbMF0gKyAiIFtpbmZpbGUgW291dGZpbGVdXSIpCisgICAgd2l0aCBpbmZpbGU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9iaiA9IGpzb24ubG9hZChpbmZpbGUpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdChlKQorICAgIHdpdGggb3V0ZmlsZToKKyAgICAgICAganNvbi5kdW1wKG9iaiwgb3V0ZmlsZSwgc29ydF9rZXlzPVRydWUsCisgICAgICAgICAgICAgICAgICBpbmRlbnQ9NCwgc2VwYXJhdG9ycz0oJywnLCAnOiAnKSkKKyAgICAgICAgb3V0ZmlsZS53cml0ZSgnXG4nKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdG9vbC5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdG9vbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxNDIxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90b29sLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdG9vbC5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdG9vbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAxNDIxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90b29sLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2tleXdvcmQucHkgYi9saWIvcHl0aG9uMi43L2tleXdvcmQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjk3OTRiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcva2V5d29yZC5weQpAQCAtMCwwICsxLDkzIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIktleXdvcmRzIChmcm9tICJncmFtaW5pdC5jIikKKworVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkOyBwbGVhc2UgZG9uJ3QgbXVjayBpdCB1cCEKKworVG8gdXBkYXRlIHRoZSBzeW1ib2xzIGluIHRoaXMgZmlsZSwgJ2NkJyB0byB0aGUgdG9wIGRpcmVjdG9yeSBvZgordGhlIHB5dGhvbiBzb3VyY2UgdHJlZSBhZnRlciBidWlsZGluZyB0aGUgaW50ZXJwcmV0ZXIgYW5kIHJ1bjoKKworICAgIC4vcHl0aG9uIExpYi9rZXl3b3JkLnB5CisiIiIKKworX19hbGxfXyA9IFsiaXNrZXl3b3JkIiwgImt3bGlzdCJdCisKK2t3bGlzdCA9IFsKKyMtLXN0YXJ0IGtleXdvcmRzLS0KKyAgICAgICAgJ2FuZCcsCisgICAgICAgICdhcycsCisgICAgICAgICdhc3NlcnQnLAorICAgICAgICAnYnJlYWsnLAorICAgICAgICAnY2xhc3MnLAorICAgICAgICAnY29udGludWUnLAorICAgICAgICAnZGVmJywKKyAgICAgICAgJ2RlbCcsCisgICAgICAgICdlbGlmJywKKyAgICAgICAgJ2Vsc2UnLAorICAgICAgICAnZXhjZXB0JywKKyAgICAgICAgJ2V4ZWMnLAorICAgICAgICAnZmluYWxseScsCisgICAgICAgICdmb3InLAorICAgICAgICAnZnJvbScsCisgICAgICAgICdnbG9iYWwnLAorICAgICAgICAnaWYnLAorICAgICAgICAnaW1wb3J0JywKKyAgICAgICAgJ2luJywKKyAgICAgICAgJ2lzJywKKyAgICAgICAgJ2xhbWJkYScsCisgICAgICAgICdub3QnLAorICAgICAgICAnb3InLAorICAgICAgICAncGFzcycsCisgICAgICAgICdwcmludCcsCisgICAgICAgICdyYWlzZScsCisgICAgICAgICdyZXR1cm4nLAorICAgICAgICAndHJ5JywKKyAgICAgICAgJ3doaWxlJywKKyAgICAgICAgJ3dpdGgnLAorICAgICAgICAneWllbGQnLAorIy0tZW5kIGtleXdvcmRzLS0KKyAgICAgICAgXQorCitpc2tleXdvcmQgPSBmcm96ZW5zZXQoa3dsaXN0KS5fX2NvbnRhaW5zX18KKworZGVmIG1haW4oKToKKyAgICBpbXBvcnQgc3lzLCByZQorCisgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorICAgIGlwdGZpbGUgPSBhcmdzIGFuZCBhcmdzWzBdIG9yICJQeXRob24vZ3JhbWluaXQuYyIKKyAgICBpZiBsZW4oYXJncykgPiAxOiBvcHRmaWxlID0gYXJnc1sxXQorICAgIGVsc2U6IG9wdGZpbGUgPSAiTGliL2tleXdvcmQucHkiCisKKyAgICAjIHNjYW4gdGhlIHNvdXJjZSBmaWxlIGZvciBrZXl3b3JkcworICAgIGZwID0gb3BlbihpcHRmaWxlKQorICAgIHN0cnByb2cgPSByZS5jb21waWxlKCciKFteIl0rKSInKQorICAgIGxpbmVzID0gW10KKyAgICBmb3IgbGluZSBpbiBmcDoKKyAgICAgICAgaWYgJ3sxLCAiJyBpbiBsaW5lOgorICAgICAgICAgICAgbWF0Y2ggPSBzdHJwcm9nLnNlYXJjaChsaW5lKQorICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCIgICAgICAgICciICsgbWF0Y2guZ3JvdXAoMSkgKyAiJyxcbiIpCisgICAgZnAuY2xvc2UoKQorICAgIGxpbmVzLnNvcnQoKQorCisgICAgIyBsb2FkIHRoZSBvdXRwdXQgc2tlbGV0b24gZnJvbSB0aGUgdGFyZ2V0CisgICAgZnAgPSBvcGVuKG9wdGZpbGUpCisgICAgZm9ybWF0ID0gZnAucmVhZGxpbmVzKCkKKyAgICBmcC5jbG9zZSgpCisKKyAgICAjIGluc2VydCB0aGUgbGluZXMgb2Yga2V5d29yZHMKKyAgICB0cnk6CisgICAgICAgIHN0YXJ0ID0gZm9ybWF0LmluZGV4KCIjLS1zdGFydCBrZXl3b3Jkcy0tXG4iKSArIDEKKyAgICAgICAgZW5kID0gZm9ybWF0LmluZGV4KCIjLS1lbmQga2V5d29yZHMtLVxuIikKKyAgICAgICAgZm9ybWF0W3N0YXJ0OmVuZF0gPSBsaW5lcworICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ0YXJnZXQgZG9lcyBub3QgY29udGFpbiBmb3JtYXQgbWFya2Vyc1xuIikKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgICMgd3JpdGUgdGhlIG91dHB1dCBmaWxlCisgICAgZnAgPSBvcGVuKG9wdGZpbGUsICd3JykKKyAgICBmcC53cml0ZSgnJy5qb2luKGZvcm1hdCkpCisgICAgZnAuY2xvc2UoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9rZXl3b3JkLnB5YyBiL2xpYi9weXRob24yLjcva2V5d29yZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1ZDY1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcva2V5d29yZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9rZXl3b3JkLnB5byBiL2xpYi9weXRob24yLjcva2V5d29yZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1ZDY1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcva2V5d29yZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9Db2xvclBpY2tlci5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvQ29sb3JQaWNrZXIuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTJkNjM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvQ29sb3JQaWNrZXIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9NYWNPUy5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvTWFjT1Muc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWQyNTVlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvTWFjT1Muc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9OYXYuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL05hdi5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yODliNmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9OYXYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9PU0FUZXJtaW5vbG9neS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvT1NBVGVybWlub2xvZ3kuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzY0NmNiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvT1NBVGVybWlub2xvZ3kuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9QeXRob24tMi43LjUtcHkyLjcuZWdnLWluZm8gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL1B5dGhvbi0yLjcuNS1weTIuNy5lZ2ctaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWJlM2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9QeXRob24tMi43LjUtcHkyLjcuZWdnLWluZm8KQEAgLTAsMCArMSwzMSBAQAorTWV0YWRhdGEtVmVyc2lvbjogMS4xCitOYW1lOiBQeXRob24KK1ZlcnNpb246IDIuNy41CitTdW1tYXJ5OiBBIGhpZ2gtbGV2ZWwgb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nIGxhbmd1YWdlCitIb21lLXBhZ2U6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjcKK0F1dGhvcjogR3VpZG8gdmFuIFJvc3N1bSBhbmQgdGhlIFB5dGhvbiBjb21tdW5pdHkKK0F1dGhvci1lbWFpbDogcHl0aG9uLWRldkBweXRob24ub3JnCitMaWNlbnNlOiBQU0YgbGljZW5zZQorRGVzY3JpcHRpb246IFB5dGhvbiBpcyBhbiBpbnRlcnByZXRlZCwgaW50ZXJhY3RpdmUsIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZworICAgICAgICBsYW5ndWFnZS4gSXQgaXMgb2Z0ZW4gY29tcGFyZWQgdG8gVGNsLCBQZXJsLCBTY2hlbWUgb3IgSmF2YS4KKyAgICAgICAgCisgICAgICAgIFB5dGhvbiBjb21iaW5lcyByZW1hcmthYmxlIHBvd2VyIHdpdGggdmVyeSBjbGVhciBzeW50YXguIEl0IGhhcworICAgICAgICBtb2R1bGVzLCBjbGFzc2VzLCBleGNlcHRpb25zLCB2ZXJ5IGhpZ2ggbGV2ZWwgZHluYW1pYyBkYXRhIHR5cGVzLCBhbmQKKyAgICAgICAgZHluYW1pYyB0eXBpbmcuIFRoZXJlIGFyZSBpbnRlcmZhY2VzIHRvIG1hbnkgc3lzdGVtIGNhbGxzIGFuZAorICAgICAgICBsaWJyYXJpZXMsIGFzIHdlbGwgYXMgdG8gdmFyaW91cyB3aW5kb3dpbmcgc3lzdGVtcyAoWDExLCBNb3RpZiwgVGssCisgICAgICAgIE1hYywgTUZDKS4gTmV3IGJ1aWx0LWluIG1vZHVsZXMgYXJlIGVhc2lseSB3cml0dGVuIGluIEMgb3IgQysrLiBQeXRob24KKyAgICAgICAgaXMgYWxzbyB1c2FibGUgYXMgYW4gZXh0ZW5zaW9uIGxhbmd1YWdlIGZvciBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIGEKKyAgICAgICAgcHJvZ3JhbW1hYmxlIGludGVyZmFjZS4KKyAgICAgICAgCisgICAgICAgIFRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gaXMgcG9ydGFibGU6IGl0IHJ1bnMgb24gbWFueSBicmFuZHMgb2YgVU5JWCwKKyAgICAgICAgb24gV2luZG93cywgRE9TLCBPUy8yLCBNYWMsIEFtaWdhLi4uIElmIHlvdXIgZmF2b3JpdGUgc3lzdGVtIGlzbid0CisgICAgICAgIGxpc3RlZCBoZXJlLCBpdCBtYXkgc3RpbGwgYmUgc3VwcG9ydGVkLCBpZiB0aGVyZSdzIGEgQyBjb21waWxlciBmb3IKKyAgICAgICAgaXQuIEFzayBhcm91bmQgb24gY29tcC5sYW5nLnB5dGhvbiAtLSBvciBqdXN0IHRyeSBjb21waWxpbmcgUHl0aG9uCisgICAgICAgIHlvdXJzZWxmLgorUGxhdGZvcm06IE1hbnkKK0NsYXNzaWZpZXI6IERldmVsb3BtZW50IFN0YXR1cyA6OiA2IC0gTWF0dXJlCitDbGFzc2lmaWVyOiBMaWNlbnNlIDo6IE9TSSBBcHByb3ZlZCA6OiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiBMaWNlbnNlCitDbGFzc2lmaWVyOiBOYXR1cmFsIExhbmd1YWdlIDo6IEVuZ2xpc2gKK0NsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IEMKK0NsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbgorQ2xhc3NpZmllcjogVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0FFLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fQUUuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDg4Y2Y1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0FFLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0FILnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fQUguc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzMxMDhiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0FILnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0FwcC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0FwcC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZmZkMDRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fQXBwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0NGLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fQ0Yuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2NlNmZhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0NGLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0NHLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fQ0cuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGY5NmZkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0NHLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0NhcmJvbkV2dC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0NhcmJvbkV2dC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMTViMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fQ2FyYm9uRXZ0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0NtLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fQ20uc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjJkZjAyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0NtLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0N0bC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0N0bC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43Y2QxY2U5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fQ3RsLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0RsZy5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0RsZy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMWMzMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fRGxnLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0RyYWcuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19EcmFnLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhiMjY1NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19EcmFnLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0V2dC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0V2dC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMWNhNDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fRXZ0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0ZpbGUuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19GaWxlLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMwY2M1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19GaWxlLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0ZtLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fRm0uc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWE2YWFjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0ZtLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0ZvbGRlci5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0ZvbGRlci5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMTY2MGZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fRm9sZGVyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0hlbHAuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19IZWxwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmYmNlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19IZWxwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0lCQ2FyYm9uLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fSUJDYXJib24uc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTU1YzU4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0lCQ2FyYm9uLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0ljbi5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0ljbi5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOTRjMGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fSWNuLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0xhdW5jaC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0xhdW5jaC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNTI3N2RiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fTGF1bmNoLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX0xpc3Quc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19MaXN0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzYTU5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19MaXN0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX01lbnUuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19NZW51LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM2MzM3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19NZW51LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX01sdGUuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19NbHRlLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmZjMDZiM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19NbHRlLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX09TQS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX09TQS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNTA2Mjg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fT1NBLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1FkLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fUWQuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjU5OGMzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1FkLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1Fkb2Zmcy5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1Fkb2Zmcy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTVhZGUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fUWRvZmZzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1F0LnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fUXQuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDAwOTJmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1F0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1Jlcy5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1Jlcy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NTM0MWIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fUmVzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1NjcmFwLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fU2NyYXAuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzA4ZDZhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1NjcmFwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1NuZC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1NuZC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45ZGQ4ZmZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fU25kLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1RFLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fVEUuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTEzODhjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1RFLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1dpbi5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX1dpbi5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNzQzOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fV2luLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2Jpc2VjdC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2Jpc2VjdC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMTM2NzkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fYmlzZWN0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvZGVjc19jbi5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvZGVjc19jbi5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YjlmMDhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2NuLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvZGVjc19oay5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvZGVjc19oay5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMjVjMzIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2hrLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvZGVjc19pc28yMDIyLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2lzbzIwMjIuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODNkMjQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvZGVjc19pc28yMDIyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvZGVjc19qcC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvZGVjc19qcC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNDE3MTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2pwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvZGVjc19rci5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvZGVjc19rci5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YWRlZGE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2tyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvZGVjc190dy5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvZGVjc190dy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMGJiZmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX3R3LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvbGxlY3Rpb25zLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29sbGVjdGlvbnMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDY3ODkxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2NvbGxlY3Rpb25zLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2Nzdi5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2Nzdi5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41YzQwNDNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY3N2LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2N0eXBlcy5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2N0eXBlcy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMzg0MTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY3R5cGVzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2N0eXBlc190ZXN0LnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY3R5cGVzX3Rlc3Quc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjhiNmJkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2N0eXBlc190ZXN0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2VsZW1lbnR0cmVlLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fZWxlbWVudHRyZWUuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODc0NWQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2VsZW1lbnR0cmVlLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2Z1bmN0b29scy5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2Z1bmN0b29scy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MmFkMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fZnVuY3Rvb2xzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2hlYXBxLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9faGVhcHEuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzkzNzM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2hlYXBxLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2hvdHNob3Quc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19ob3RzaG90LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ1ZTBhN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19ob3RzaG90LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2lvLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9faW8uc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2VlYTI1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2lvLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2pzb24uc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19qc29uLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNjNzIzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19qc29uLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2xvY2FsZS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2xvY2FsZS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZTk1MmNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbG9jYWxlLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2xzcHJvZi5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2xzcHJvZi5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYjExNGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbHNwcm9mLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX21kNS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX21kNS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZTYyMDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbWQ1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX211bHRpYnl0ZWNvZGVjLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbXVsdGlieXRlY29kZWMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWUzMjI0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX211bHRpYnl0ZWNvZGVjLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX211bHRpcHJvY2Vzc2luZy5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX211bHRpcHJvY2Vzc2luZy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NDRjMzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbXVsdGlwcm9jZXNzaW5nLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3JhbmRvbS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3JhbmRvbS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYWE4ODNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fcmFuZG9tLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3NjcHJveHkuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19zY3Byb3h5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjZTJmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19zY3Byb3h5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3NoYS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3NoYS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYmZiZmFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc2hhLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3NvY2tldC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3NvY2tldC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNWM2OWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc29ja2V0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3NxbGl0ZTMuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19zcWxpdGUzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhkNzNmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19zcWxpdGUzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3N0cnVjdC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3N0cnVjdC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YWQwMWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc3RydWN0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3Rlc3RjYXBpLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fdGVzdGNhcGkuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzBjNjM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3Rlc3RjYXBpLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX3RraW50ZXIuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL190a2ludGVyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyMjQwNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL190a2ludGVyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvYXJyYXkuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2FycmF5LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMzMTE5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2FycmF5LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvYXVkaW9vcC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvYXVkaW9vcC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MzQ1NDI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9hdWRpb29wLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvYXV0b0dJTC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvYXV0b0dJTC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40NGQ5NjJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9hdXRvR0lMLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvYmluYXNjaWkuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2JpbmFzY2lpLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0MTdlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2JpbmFzY2lpLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvYnNkZGIxODUuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2JzZGRiMTg1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ1ZGYyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2JzZGRiMTg1LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvY1BpY2tsZS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvY1BpY2tsZS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NzZlMDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9jUGlja2xlLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvY1N0cmluZ0lPLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9jU3RyaW5nSU8uc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTc0MDZhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvY1N0cmluZ0lPLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvY21hdGguc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2NtYXRoLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5Y2ExMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2NtYXRoLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvY3J5cHQuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2NyeXB0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRkZDQwMjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2NyeXB0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZGF0ZXRpbWUuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2RhdGV0aW1lLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMwMDM5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2RhdGV0aW1lLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZGJtLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9kYm0uc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2VkNDZiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZGJtLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZmNudGwuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2ZjbnRsLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhNDYwODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2ZjbnRsLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZnV0dXJlX2J1aWx0aW5zLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9mdXR1cmVfYnVpbHRpbnMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmE2NzZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZnV0dXJlX2J1aWx0aW5zLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZ2VzdGFsdC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZ2VzdGFsdC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42Nzg1OThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9nZXN0YWx0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZ3JwLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9ncnAuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjA1ZTdjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZ3JwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvaWNnbHVlLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9pY2dsdWUuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWE3Yzg0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvaWNnbHVlLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvaXRlcnRvb2xzLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9pdGVydG9vbHMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmVjNDE3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvaXRlcnRvb2xzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvbWF0aC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvbWF0aC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YjM1MWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9tYXRoLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvbW1hcC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvbW1hcC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zYTMyYzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9tbWFwLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvbmlzLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9uaXMuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzIwZTIyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvbmlzLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvb3BlcmF0b3Iuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL29wZXJhdG9yLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhhZmYyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL29wZXJhdG9yLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvcGFyc2VyLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9wYXJzZXIuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTYxYWEwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvcGFyc2VyLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvcHdkLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9wd2Quc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmEzNmRhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvcHdkLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvcHlleHBhdC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvcHlleHBhdC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wM2VmMWYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9weWV4cGF0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvcmVzb3VyY2Uuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3Jlc291cmNlLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk4NWIxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3Jlc291cmNlLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvc2VsZWN0LnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9zZWxlY3Quc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjIxMjVmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvc2VsZWN0LnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvc3Ryb3Auc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3N0cm9wLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ2YjEyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3N0cm9wLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvc3lzbG9nLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9zeXNsb2cuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDU1NTA1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvc3lzbG9nLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvdGVybWlvcy5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvdGVybWlvcy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNTAzOGJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC90ZXJtaW9zLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvdGltZS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvdGltZS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44Njc4M2E3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC90aW1lLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvdW5pY29kZWRhdGEuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3VuaWNvZGVkYXRhLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRhZTBjODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3VuaWNvZGVkYXRhLnNvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL0NhbnZhcy5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL0NhbnZhcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDQ2NGFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvQ2FudmFzLnB5CkBAIC0wLDAgKzEsMTk0IEBACisjIFRoaXMgbW9kdWxlIGV4cG9ydHMgY2xhc3NlcyBmb3IgdGhlIHZhcmlvdXMgY2FudmFzIGl0ZW0gdHlwZXMKKworIyBOT1RFOiBUaGlzIG1vZHVsZSB3YXMgYW4gZXhwZXJpbWVudCBhbmQgaXMgbm93IG9ic29sZXRlLgorIyBJdCdzIGJlc3QgdG8gdXNlIHRoZSBUa2ludGVyLkNhbnZhcyBjbGFzcyBkaXJlY3RseS4KKworZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJ0aGUgQ2FudmFzIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworZnJvbSBUa2ludGVyIGltcG9ydCBDYW52YXMsIF9jbmZtZXJnZSwgX2ZsYXR0ZW4KKworCitjbGFzcyBDYW52YXNJdGVtOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYW52YXMsIGl0ZW1UeXBlLCAqYXJncywgKiprdyk6CisgICAgICAgIHNlbGYuY2FudmFzID0gY2FudmFzCisgICAgICAgIHNlbGYuaWQgPSBjYW52YXMuX2NyZWF0ZShpdGVtVHlwZSwgYXJncywga3cpCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKGNhbnZhcywgJ2l0ZW1zJyk6CisgICAgICAgICAgICBjYW52YXMuaXRlbXMgPSB7fQorICAgICAgICBjYW52YXMuaXRlbXNbc2VsZi5pZF0gPSBzZWxmCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZi5pZCkKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPCVzLCBpZD0lZD4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLmlkKQorICAgIGRlZiBkZWxldGUoc2VsZik6CisgICAgICAgIGRlbCBzZWxmLmNhbnZhcy5pdGVtc1tzZWxmLmlkXQorICAgICAgICBzZWxmLmNhbnZhcy5kZWxldGUoc2VsZi5pZCkKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgdiA9IHNlbGYuY2FudmFzLnRrLnNwbGl0KHNlbGYuY2FudmFzLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgc2VsZi5jYW52YXMuX3csICdpdGVtY29uZmlndXJlJywKKyAgICAgICAgICAgICAgICBzZWxmLmlkLCAnLScgKyBrZXkpKQorICAgICAgICByZXR1cm4gdls0XQorICAgIGNnZXQgPSBfX2dldGl0ZW1fXworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgc2VsZi5jYW52YXMuaXRlbWNvbmZpZyhzZWxmLmlkLCB7a2V5OiB2YWx1ZX0pCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdfa2V5cycpOgorICAgICAgICAgICAgc2VsZi5fa2V5cyA9IG1hcChsYW1iZGEgeCwgdGs9c2VsZi5jYW52YXMudGs6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRrLnNwbGl0bGlzdCh4KVswXVsxOl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FudmFzLnRrLnNwbGl0bGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhbnZhcy5fZG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXRlbWNvbmZpZ3VyZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5pZCwpKSkpCisgICAgICAgIHJldHVybiBzZWxmLl9rZXlzCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLmtleXMoKQorICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLmtleXMoKQorICAgIGRlZiBhZGR0YWcoc2VsZiwgdGFnLCBvcHRpb249J3dpdGh0YWcnKToKKyAgICAgICAgc2VsZi5jYW52YXMuYWRkdGFnKHRhZywgb3B0aW9uLCBzZWxmLmlkKQorICAgIGRlZiBiYm94KHNlbGYpOgorICAgICAgICB4MSwgeTEsIHgyLCB5MiA9IHNlbGYuY2FudmFzLmJib3goc2VsZi5pZCkKKyAgICAgICAgcmV0dXJuICh4MSwgeTEpLCAoeDIsIHkyKQorICAgIGRlZiBiaW5kKHNlbGYsIHNlcXVlbmNlPU5vbmUsIGNvbW1hbmQ9Tm9uZSwgYWRkPU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5jYW52YXMudGFnX2JpbmQoc2VsZi5pZCwgc2VxdWVuY2UsIGNvbW1hbmQsIGFkZCkKKyAgICBkZWYgdW5iaW5kKHNlbGYsIHNlcXVlbmNlLCBmdW5jaWQ9Tm9uZSk6CisgICAgICAgIHNlbGYuY2FudmFzLnRhZ191bmJpbmQoc2VsZi5pZCwgc2VxdWVuY2UsIGZ1bmNpZCkKKyAgICBkZWYgY29uZmlnKHNlbGYsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHJldHVybiBzZWxmLmNhbnZhcy5pdGVtY29uZmlnKHNlbGYuaWQsIF9jbmZtZXJnZSgoY25mLCBrdykpKQorICAgIGRlZiBjb29yZHMoc2VsZiwgcHRzID0gKCkpOgorICAgICAgICBmbGF0ID0gKCkKKyAgICAgICAgZm9yIHgsIHkgaW4gcHRzOiBmbGF0ID0gZmxhdCArICh4LCB5KQorICAgICAgICByZXR1cm4gc2VsZi5jYW52YXMuY29vcmRzKHNlbGYuaWQsICpmbGF0KQorICAgIGRlZiBkY2hhcnMoc2VsZiwgZmlyc3QsIGxhc3Q9Tm9uZSk6CisgICAgICAgIHNlbGYuY2FudmFzLmRjaGFycyhzZWxmLmlkLCBmaXJzdCwgbGFzdCkKKyAgICBkZWYgZHRhZyhzZWxmLCB0dGQpOgorICAgICAgICBzZWxmLmNhbnZhcy5kdGFnKHNlbGYuaWQsIHR0ZCkKKyAgICBkZWYgZm9jdXMoc2VsZik6CisgICAgICAgIHNlbGYuY2FudmFzLmZvY3VzKHNlbGYuaWQpCisgICAgZGVmIGdldHRhZ3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNhbnZhcy5nZXR0YWdzKHNlbGYuaWQpCisgICAgZGVmIGljdXJzb3Ioc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLmNhbnZhcy5pY3Vyc29yKHNlbGYuaWQsIGluZGV4KQorICAgIGRlZiBpbmRleChzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLmNhbnZhcy5pbmRleChzZWxmLmlkLCBpbmRleCkKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGJlZm9yZXRoaXMsIHN0cmluZyk6CisgICAgICAgIHNlbGYuY2FudmFzLmluc2VydChzZWxmLmlkLCBiZWZvcmV0aGlzLCBzdHJpbmcpCisgICAgZGVmIGxvd2VyKHNlbGYsIGJlbG93dGhpcz1Ob25lKToKKyAgICAgICAgc2VsZi5jYW52YXMudGFnX2xvd2VyKHNlbGYuaWQsIGJlbG93dGhpcykKKyAgICBkZWYgbW92ZShzZWxmLCB4YW1vdW50LCB5YW1vdW50KToKKyAgICAgICAgc2VsZi5jYW52YXMubW92ZShzZWxmLmlkLCB4YW1vdW50LCB5YW1vdW50KQorICAgIGRlZiB0a3JhaXNlKHNlbGYsIGFib3ZldGhpcz1Ob25lKToKKyAgICAgICAgc2VsZi5jYW52YXMudGFnX3JhaXNlKHNlbGYuaWQsIGFib3ZldGhpcykKKyAgICByYWlzZV8gPSB0a3JhaXNlICMgQlcgY29tcGF0CisgICAgZGVmIHNjYWxlKHNlbGYsIHhvcmlnaW4sIHlvcmlnaW4sIHhzY2FsZSwgeXNjYWxlKToKKyAgICAgICAgc2VsZi5jYW52YXMuc2NhbGUoc2VsZi5pZCwgeG9yaWdpbiwgeW9yaWdpbiwgeHNjYWxlLCB5c2NhbGUpCisgICAgZGVmIHR5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNhbnZhcy50eXBlKHNlbGYuaWQpCisKK2NsYXNzIEFyYyhDYW52YXNJdGVtKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FudmFzLCAqYXJncywgKiprdyk6CisgICAgICAgIENhbnZhc0l0ZW0uX19pbml0X18oc2VsZiwgY2FudmFzLCAnYXJjJywgKmFyZ3MsICoqa3cpCisKK2NsYXNzIEJpdG1hcChDYW52YXNJdGVtKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FudmFzLCAqYXJncywgKiprdyk6CisgICAgICAgIENhbnZhc0l0ZW0uX19pbml0X18oc2VsZiwgY2FudmFzLCAnYml0bWFwJywgKmFyZ3MsICoqa3cpCisKK2NsYXNzIEltYWdlSXRlbShDYW52YXNJdGVtKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FudmFzLCAqYXJncywgKiprdyk6CisgICAgICAgIENhbnZhc0l0ZW0uX19pbml0X18oc2VsZiwgY2FudmFzLCAnaW1hZ2UnLCAqYXJncywgKiprdykKKworY2xhc3MgTGluZShDYW52YXNJdGVtKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FudmFzLCAqYXJncywgKiprdyk6CisgICAgICAgIENhbnZhc0l0ZW0uX19pbml0X18oc2VsZiwgY2FudmFzLCAnbGluZScsICphcmdzLCAqKmt3KQorCitjbGFzcyBPdmFsKENhbnZhc0l0ZW0pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYW52YXMsICphcmdzLCAqKmt3KToKKyAgICAgICAgQ2FudmFzSXRlbS5fX2luaXRfXyhzZWxmLCBjYW52YXMsICdvdmFsJywgKmFyZ3MsICoqa3cpCisKK2NsYXNzIFBvbHlnb24oQ2FudmFzSXRlbSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhbnZhcywgKmFyZ3MsICoqa3cpOgorICAgICAgICBDYW52YXNJdGVtLl9faW5pdF9fKHNlbGYsIGNhbnZhcywgJ3BvbHlnb24nLCAqYXJncywgKiprdykKKworY2xhc3MgUmVjdGFuZ2xlKENhbnZhc0l0ZW0pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYW52YXMsICphcmdzLCAqKmt3KToKKyAgICAgICAgQ2FudmFzSXRlbS5fX2luaXRfXyhzZWxmLCBjYW52YXMsICdyZWN0YW5nbGUnLCAqYXJncywgKiprdykKKworIyBYWFggIlRleHQiIGlzIHRha2VuIGJ5IHRoZSBUZXh0IHdpZGdldC4uLgorY2xhc3MgQ2FudmFzVGV4dChDYW52YXNJdGVtKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FudmFzLCAqYXJncywgKiprdyk6CisgICAgICAgIENhbnZhc0l0ZW0uX19pbml0X18oc2VsZiwgY2FudmFzLCAndGV4dCcsICphcmdzLCAqKmt3KQorCitjbGFzcyBXaW5kb3coQ2FudmFzSXRlbSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhbnZhcywgKmFyZ3MsICoqa3cpOgorICAgICAgICBDYW52YXNJdGVtLl9faW5pdF9fKHNlbGYsIGNhbnZhcywgJ3dpbmRvdycsICphcmdzLCAqKmt3KQorCitjbGFzcyBHcm91cDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FudmFzLCB0YWc9Tm9uZSk6CisgICAgICAgIGlmIG5vdCB0YWc6CisgICAgICAgICAgICB0YWcgPSAnR3JvdXAlZCcgJSBpZChzZWxmKQorICAgICAgICBzZWxmLnRhZyA9IHNlbGYuaWQgPSB0YWcKKyAgICAgICAgc2VsZi5jYW52YXMgPSBjYW52YXMKKyAgICAgICAgc2VsZi5jYW52YXMuZHRhZyhzZWxmLnRhZykKKyAgICBkZWYgc3RyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50YWcKKyAgICBfX3N0cl9fID0gc3RyCisgICAgZGVmIF9kbyhzZWxmLCBjbWQsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2FudmFzLl9kbyhjbWQsIChzZWxmLnRhZywpICsgX2ZsYXR0ZW4oYXJncykpCisgICAgZGVmIGFkZHRhZ19hYm92ZShzZWxmLCB0YWdPcklkKToKKyAgICAgICAgc2VsZi5fZG8oJ2FkZHRhZycsICdhYm92ZScsIHRhZ09ySWQpCisgICAgZGVmIGFkZHRhZ19hbGwoc2VsZik6CisgICAgICAgIHNlbGYuX2RvKCdhZGR0YWcnLCAnYWxsJykKKyAgICBkZWYgYWRkdGFnX2JlbG93KHNlbGYsIHRhZ09ySWQpOgorICAgICAgICBzZWxmLl9kbygnYWRkdGFnJywgJ2JlbG93JywgdGFnT3JJZCkKKyAgICBkZWYgYWRkdGFnX2Nsb3Nlc3Qoc2VsZiwgeCwgeSwgaGFsbz1Ob25lLCBzdGFydD1Ob25lKToKKyAgICAgICAgc2VsZi5fZG8oJ2FkZHRhZycsICdjbG9zZXN0JywgeCwgeSwgaGFsbywgc3RhcnQpCisgICAgZGVmIGFkZHRhZ19lbmNsb3NlZChzZWxmLCB4MSwgeTEsIHgyLCB5Mik6CisgICAgICAgIHNlbGYuX2RvKCdhZGR0YWcnLCAnZW5jbG9zZWQnLCB4MSwgeTEsIHgyLCB5MikKKyAgICBkZWYgYWRkdGFnX292ZXJsYXBwaW5nKHNlbGYsIHgxLCB5MSwgeDIsIHkyKToKKyAgICAgICAgc2VsZi5fZG8oJ2FkZHRhZycsICdvdmVybGFwcGluZycsIHgxLCB5MSwgeDIsIHkyKQorICAgIGRlZiBhZGR0YWdfd2l0aHRhZyhzZWxmLCB0YWdPcklkKToKKyAgICAgICAgc2VsZi5fZG8oJ2FkZHRhZycsICd3aXRodGFnJywgdGFnT3JJZCkKKyAgICBkZWYgYmJveChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2FudmFzLl9nZXRpbnRzKHNlbGYuX2RvKCdiYm94JykpCisgICAgZGVmIGJpbmQoc2VsZiwgc2VxdWVuY2U9Tm9uZSwgY29tbWFuZD1Ob25lLCBhZGQ9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLmNhbnZhcy50YWdfYmluZChzZWxmLmlkLCBzZXF1ZW5jZSwgY29tbWFuZCwgYWRkKQorICAgIGRlZiB1bmJpbmQoc2VsZiwgc2VxdWVuY2UsIGZ1bmNpZD1Ob25lKToKKyAgICAgICAgc2VsZi5jYW52YXMudGFnX3VuYmluZChzZWxmLmlkLCBzZXF1ZW5jZSwgZnVuY2lkKQorICAgIGRlZiBjb29yZHMoc2VsZiwgKnB0cyk6CisgICAgICAgIHJldHVybiBzZWxmLl9kbygnY29vcmRzJywgcHRzKQorICAgIGRlZiBkY2hhcnMoc2VsZiwgZmlyc3QsIGxhc3Q9Tm9uZSk6CisgICAgICAgIHNlbGYuX2RvKCdkY2hhcnMnLCBmaXJzdCwgbGFzdCkKKyAgICBkZWYgZGVsZXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9kbygnZGVsZXRlJykKKyAgICBkZWYgZHRhZyhzZWxmLCB0YWdUb0RlbGV0ZT1Ob25lKToKKyAgICAgICAgc2VsZi5fZG8oJ2R0YWcnLCB0YWdUb0RlbGV0ZSkKKyAgICBkZWYgZm9jdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RvKCdmb2N1cycpCisgICAgZGVmIGdldHRhZ3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNhbnZhcy50ay5zcGxpdGxpc3Qoc2VsZi5fZG8oJ2dldHRhZ3MnLCBzZWxmLnRhZykpCisgICAgZGVmIGljdXJzb3Ioc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gc2VsZi5fZG8oJ2ljdXJzb3InLCBpbmRleCkKKyAgICBkZWYgaW5kZXgoc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gc2VsZi5jYW52YXMudGsuZ2V0aW50KHNlbGYuX2RvKCdpbmRleCcsIGluZGV4KSkKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGJlZm9yZVRoaXMsIHN0cmluZyk6CisgICAgICAgIHNlbGYuX2RvKCdpbnNlcnQnLCBiZWZvcmVUaGlzLCBzdHJpbmcpCisgICAgZGVmIGNvbmZpZyhzZWxmLCBjbmY9e30sICoqa3cpOgorICAgICAgICByZXR1cm4gc2VsZi5jYW52YXMuaXRlbWNvbmZpZ3VyZShzZWxmLnRhZywgX2NuZm1lcmdlKChjbmYsa3cpKSkKKyAgICBkZWYgbG93ZXIoc2VsZiwgYmVsb3dUaGlzPU5vbmUpOgorICAgICAgICBzZWxmLl9kbygnbG93ZXInLCBiZWxvd1RoaXMpCisgICAgZGVmIG1vdmUoc2VsZiwgeEFtb3VudCwgeUFtb3VudCk6CisgICAgICAgIHNlbGYuX2RvKCdtb3ZlJywgeEFtb3VudCwgeUFtb3VudCkKKyAgICBkZWYgdGtyYWlzZShzZWxmLCBhYm92ZVRoaXM9Tm9uZSk6CisgICAgICAgIHNlbGYuX2RvKCdyYWlzZScsIGFib3ZlVGhpcykKKyAgICBsaWZ0ID0gdGtyYWlzZQorICAgIGRlZiBzY2FsZShzZWxmLCB4T3JpZ2luLCB5T3JpZ2luLCB4U2NhbGUsIHlTY2FsZSk6CisgICAgICAgIHNlbGYuX2RvKCdzY2FsZScsIHhPcmlnaW4sIHlPcmlnaW4sIHhTY2FsZSwgeVNjYWxlKQorICAgIGRlZiBzZWxlY3RfYWRqdXN0KHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi5jYW52YXMuX2RvKCdzZWxlY3QnLCAoJ2FkanVzdCcsIHNlbGYudGFnLCBpbmRleCkpCisgICAgZGVmIHNlbGVjdF9mcm9tKHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi5jYW52YXMuX2RvKCdzZWxlY3QnLCAoJ2Zyb20nLCBzZWxmLnRhZywgaW5kZXgpKQorICAgIGRlZiBzZWxlY3RfdG8oc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLmNhbnZhcy5fZG8oJ3NlbGVjdCcsICgndG8nLCBzZWxmLnRhZywgaW5kZXgpKQorICAgIGRlZiB0eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZG8oJ3R5cGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvQ2FudmFzLnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL0NhbnZhcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwOWM0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL0NhbnZhcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvQ2FudmFzLnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL0NhbnZhcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwOWM0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL0NhbnZhcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvRGlhbG9nLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvRGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMDg5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9EaWFsb2cucHkKQEAgLTAsMCArMSw0OSBAQAorIyBkaWFsb2cucHkgLS0gVGtpbnRlciBpbnRlcmZhY2UgdG8gdGhlIHRrX2RpYWxvZyBzY3JpcHQuCisKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgorZnJvbSBUa2ludGVyIGltcG9ydCBfY25mbWVyZ2UKKworaWYgVGtWZXJzaW9uIDw9IDMuNjoKKyAgICBESUFMT0dfSUNPTiA9ICd3YXJuaW5nJworZWxzZToKKyAgICBESUFMT0dfSUNPTiA9ICdxdWVzdGhlYWQnCisKKworY2xhc3MgRGlhbG9nKFdpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICBjbmYgPSBfY25mbWVyZ2UoKGNuZiwga3cpKQorICAgICAgICBzZWxmLndpZGdldE5hbWUgPSAnX19kaWFsb2dfXycKKyAgICAgICAgV2lkZ2V0Ll9zZXR1cChzZWxmLCBtYXN0ZXIsIGNuZikKKyAgICAgICAgc2VsZi5udW0gPSBzZWxmLnRrLmdldGludCgKKyAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgICAgICAgJ3RrX2RpYWxvZycsIHNlbGYuX3csCisgICAgICAgICAgICAgICAgICAgICAgY25mWyd0aXRsZSddLCBjbmZbJ3RleHQnXSwKKyAgICAgICAgICAgICAgICAgICAgICBjbmZbJ2JpdG1hcCddLCBjbmZbJ2RlZmF1bHQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAqY25mWydzdHJpbmdzJ10pKQorICAgICAgICB0cnk6IFdpZGdldC5kZXN0cm95KHNlbGYpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjogcGFzcworICAgIGRlZiBkZXN0cm95KHNlbGYpOiBwYXNzCisKK2RlZiBfdGVzdCgpOgorICAgIGQgPSBEaWFsb2coTm9uZSwgeyd0aXRsZSc6ICdGaWxlIE1vZGlmaWVkJywKKyAgICAgICAgICAgICAgICAgICAgICAndGV4dCc6CisgICAgICAgICAgICAgICAgICAgICAgJ0ZpbGUgIlB5dGhvbi5oIiBoYXMgYmVlbiBtb2RpZmllZCcKKyAgICAgICAgICAgICAgICAgICAgICAnIHNpbmNlIHRoZSBsYXN0IHRpbWUgaXQgd2FzIHNhdmVkLicKKyAgICAgICAgICAgICAgICAgICAgICAnIERvIHlvdSB3YW50IHRvIHNhdmUgaXQgYmVmb3JlJworICAgICAgICAgICAgICAgICAgICAgICcgZXhpdGluZyB0aGUgYXBwbGljYXRpb24uJywKKyAgICAgICAgICAgICAgICAgICAgICAnYml0bWFwJzogRElBTE9HX0lDT04sCisgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQnOiAwLAorICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmdzJzogKCdTYXZlIEZpbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEaXNjYXJkIENoYW5nZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdSZXR1cm4gdG8gRWRpdG9yJyl9KQorICAgIHByaW50IGQubnVtCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ID0gQnV0dG9uKE5vbmUsIHsndGV4dCc6ICdUZXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAnY29tbWFuZCc6IF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIFBhY2s6IHt9fSkKKyAgICBxID0gQnV0dG9uKE5vbmUsIHsndGV4dCc6ICdRdWl0JywKKyAgICAgICAgICAgICAgICAgICAgICAnY29tbWFuZCc6IHQucXVpdCwKKyAgICAgICAgICAgICAgICAgICAgICBQYWNrOiB7fX0pCisgICAgdC5tYWlubG9vcCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9EaWFsb2cucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvRGlhbG9nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGI2NjMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvRGlhbG9nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9EaWFsb2cucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvRGlhbG9nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGI2NjMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvRGlhbG9nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9GaWxlRGlhbG9nLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvRmlsZURpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmNlMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvRmlsZURpYWxvZy5weQpAQCAtMCwwICsxLDI3NCBAQAorIiIiRmlsZSBzZWxlY3Rpb24gZGlhbG9nIGNsYXNzZXMuCisKK0NsYXNzZXM6CisKKy0gRmlsZURpYWxvZworLSBMb2FkRmlsZURpYWxvZworLSBTYXZlRmlsZURpYWxvZworCisiIiIKKworZnJvbSBUa2ludGVyIGltcG9ydCAqCitmcm9tIERpYWxvZyBpbXBvcnQgRGlhbG9nCisKK2ltcG9ydCBvcworaW1wb3J0IGZubWF0Y2gKKworCitkaWFsb2dzdGF0ZXMgPSB7fQorCisKK2NsYXNzIEZpbGVEaWFsb2c6CisKKyAgICAiIiJTdGFuZGFyZCBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgLS0gbm8gY2hlY2tzIG9uIHNlbGVjdGVkIGZpbGUuCisKKyAgICBVc2FnZToKKworICAgICAgICBkID0gRmlsZURpYWxvZyhtYXN0ZXIpCisgICAgICAgIGZuYW1lID0gZC5nbyhkaXJfb3JfZmlsZSwgcGF0dGVybiwgZGVmYXVsdCwga2V5KQorICAgICAgICBpZiBmbmFtZSBpcyBOb25lOiAuLi5jYW5jZWxlZC4uLgorICAgICAgICBlbHNlOiAuLi5vcGVuIGZpbGUuLi4KKworICAgIEFsbCBhcmd1bWVudHMgdG8gZ28oKSBhcmUgb3B0aW9uYWwuCisKKyAgICBUaGUgJ2tleScgYXJndW1lbnQgc3BlY2lmaWVzIGEga2V5IGluIHRoZSBnbG9iYWwgZGljdGlvbmFyeQorICAgICdkaWFsb2dzdGF0ZXMnLCB3aGljaCBrZWVwcyB0cmFjayBvZiB0aGUgdmFsdWVzIGZvciB0aGUgZGlyZWN0b3J5CisgICAgYW5kIHBhdHRlcm4gYXJndW1lbnRzLCBvdmVycmlkaW5nIHRoZSB2YWx1ZXMgcGFzc2VkIGluIChpdCBkb2VzCisgICAgbm90IGtlZXAgdHJhY2sgb2YgdGhlIGRlZmF1bHQgYXJndW1lbnQhKS4gIElmIG5vIGtleSBpcyBzcGVjaWZpZWQsCisgICAgdGhlIGRpYWxvZyBrZWVwcyBubyBtZW1vcnkgb2YgcHJldmlvdXMgc3RhdGUuICBOb3RlIHRoYXQgbWVtb3J5IGlzCisgICAga2VwdCBldmVuIHdoZW4gdGhlIGRpYWxvZyBpcyBjYW5jZWxlZC4gIChBbGwgdGhpcyBlbXVsYXRlcyB0aGUKKyAgICBiZWhhdmlvciBvZiB0aGUgTWFjaW50b3NoIGZpbGUgc2VsZWN0aW9uIGRpYWxvZ3MuKQorCisgICAgIiIiCisKKyAgICB0aXRsZSA9ICJGaWxlIFNlbGVjdGlvbiBEaWFsb2ciCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCB0aXRsZT1Ob25lKToKKyAgICAgICAgaWYgdGl0bGUgaXMgTm9uZTogdGl0bGUgPSBzZWxmLnRpdGxlCisgICAgICAgIHNlbGYubWFzdGVyID0gbWFzdGVyCisgICAgICAgIHNlbGYuZGlyZWN0b3J5ID0gTm9uZQorCisgICAgICAgIHNlbGYudG9wID0gVG9wbGV2ZWwobWFzdGVyKQorICAgICAgICBzZWxmLnRvcC50aXRsZSh0aXRsZSkKKyAgICAgICAgc2VsZi50b3AuaWNvbm5hbWUodGl0bGUpCisKKyAgICAgICAgc2VsZi5ib3RmcmFtZSA9IEZyYW1lKHNlbGYudG9wKQorICAgICAgICBzZWxmLmJvdGZyYW1lLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKKworICAgICAgICBzZWxmLnNlbGVjdGlvbiA9IEVudHJ5KHNlbGYudG9wKQorICAgICAgICBzZWxmLnNlbGVjdGlvbi5wYWNrKHNpZGU9Qk9UVE9NLCBmaWxsPVgpCisgICAgICAgIHNlbGYuc2VsZWN0aW9uLmJpbmQoJzxSZXR1cm4+Jywgc2VsZi5va19ldmVudCkKKworICAgICAgICBzZWxmLmZpbHRlciA9IEVudHJ5KHNlbGYudG9wKQorICAgICAgICBzZWxmLmZpbHRlci5wYWNrKHNpZGU9VE9QLCBmaWxsPVgpCisgICAgICAgIHNlbGYuZmlsdGVyLmJpbmQoJzxSZXR1cm4+Jywgc2VsZi5maWx0ZXJfY29tbWFuZCkKKworICAgICAgICBzZWxmLm1pZGZyYW1lID0gRnJhbWUoc2VsZi50b3ApCisgICAgICAgIHNlbGYubWlkZnJhbWUucGFjayhleHBhbmQ9WUVTLCBmaWxsPUJPVEgpCisKKyAgICAgICAgc2VsZi5maWxlc2JhciA9IFNjcm9sbGJhcihzZWxmLm1pZGZyYW1lKQorICAgICAgICBzZWxmLmZpbGVzYmFyLnBhY2soc2lkZT1SSUdIVCwgZmlsbD1ZKQorICAgICAgICBzZWxmLmZpbGVzID0gTGlzdGJveChzZWxmLm1pZGZyYW1lLCBleHBvcnRzZWxlY3Rpb249MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXNjcm9sbGNvbW1hbmQ9KHNlbGYuZmlsZXNiYXIsICdzZXQnKSkKKyAgICAgICAgc2VsZi5maWxlcy5wYWNrKHNpZGU9UklHSFQsIGV4cGFuZD1ZRVMsIGZpbGw9Qk9USCkKKyAgICAgICAgYnRhZ3MgPSBzZWxmLmZpbGVzLmJpbmR0YWdzKCkKKyAgICAgICAgc2VsZi5maWxlcy5iaW5kdGFncyhidGFnc1sxOl0gKyBidGFnc1s6MV0pCisgICAgICAgIHNlbGYuZmlsZXMuYmluZCgnPEJ1dHRvblJlbGVhc2UtMT4nLCBzZWxmLmZpbGVzX3NlbGVjdF9ldmVudCkKKyAgICAgICAgc2VsZi5maWxlcy5iaW5kKCc8RG91YmxlLUJ1dHRvblJlbGVhc2UtMT4nLCBzZWxmLmZpbGVzX2RvdWJsZV9ldmVudCkKKyAgICAgICAgc2VsZi5maWxlc2Jhci5jb25maWcoY29tbWFuZD0oc2VsZi5maWxlcywgJ3l2aWV3JykpCisKKyAgICAgICAgc2VsZi5kaXJzYmFyID0gU2Nyb2xsYmFyKHNlbGYubWlkZnJhbWUpCisgICAgICAgIHNlbGYuZGlyc2Jhci5wYWNrKHNpZGU9TEVGVCwgZmlsbD1ZKQorICAgICAgICBzZWxmLmRpcnMgPSBMaXN0Ym94KHNlbGYubWlkZnJhbWUsIGV4cG9ydHNlbGVjdGlvbj0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzY3JvbGxjb21tYW5kPShzZWxmLmRpcnNiYXIsICdzZXQnKSkKKyAgICAgICAgc2VsZi5kaXJzLnBhY2soc2lkZT1MRUZULCBleHBhbmQ9WUVTLCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYuZGlyc2Jhci5jb25maWcoY29tbWFuZD0oc2VsZi5kaXJzLCAneXZpZXcnKSkKKyAgICAgICAgYnRhZ3MgPSBzZWxmLmRpcnMuYmluZHRhZ3MoKQorICAgICAgICBzZWxmLmRpcnMuYmluZHRhZ3MoYnRhZ3NbMTpdICsgYnRhZ3NbOjFdKQorICAgICAgICBzZWxmLmRpcnMuYmluZCgnPEJ1dHRvblJlbGVhc2UtMT4nLCBzZWxmLmRpcnNfc2VsZWN0X2V2ZW50KQorICAgICAgICBzZWxmLmRpcnMuYmluZCgnPERvdWJsZS1CdXR0b25SZWxlYXNlLTE+Jywgc2VsZi5kaXJzX2RvdWJsZV9ldmVudCkKKworICAgICAgICBzZWxmLm9rX2J1dHRvbiA9IEJ1dHRvbihzZWxmLmJvdGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iT0siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLm9rX2NvbW1hbmQpCisgICAgICAgIHNlbGYub2tfYnV0dG9uLnBhY2soc2lkZT1MRUZUKQorICAgICAgICBzZWxmLmZpbHRlcl9idXR0b24gPSBCdXR0b24oc2VsZi5ib3RmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9IkZpbHRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuZmlsdGVyX2NvbW1hbmQpCisgICAgICAgIHNlbGYuZmlsdGVyX2J1dHRvbi5wYWNrKHNpZGU9TEVGVCwgZXhwYW5kPVlFUykKKyAgICAgICAgc2VsZi5jYW5jZWxfYnV0dG9uID0gQnV0dG9uKHNlbGYuYm90ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSJDYW5jZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLmNhbmNlbF9jb21tYW5kKQorICAgICAgICBzZWxmLmNhbmNlbF9idXR0b24ucGFjayhzaWRlPVJJR0hUKQorCisgICAgICAgIHNlbGYudG9wLnByb3RvY29sKCdXTV9ERUxFVEVfV0lORE9XJywgc2VsZi5jYW5jZWxfY29tbWFuZCkKKyAgICAgICAgIyBYWFggQXJlIHRoZSBmb2xsb3dpbmcgb2theSBmb3IgYSBnZW5lcmFsIGF1ZGllbmNlPworICAgICAgICBzZWxmLnRvcC5iaW5kKCc8QWx0LXc+Jywgc2VsZi5jYW5jZWxfY29tbWFuZCkKKyAgICAgICAgc2VsZi50b3AuYmluZCgnPEFsdC1XPicsIHNlbGYuY2FuY2VsX2NvbW1hbmQpCisKKyAgICBkZWYgZ28oc2VsZiwgZGlyX29yX2ZpbGU9b3MuY3VyZGlyLCBwYXR0ZXJuPSIqIiwgZGVmYXVsdD0iIiwga2V5PU5vbmUpOgorICAgICAgICBpZiBrZXkgYW5kIGtleSBpbiBkaWFsb2dzdGF0ZXM6CisgICAgICAgICAgICBzZWxmLmRpcmVjdG9yeSwgcGF0dGVybiA9IGRpYWxvZ3N0YXRlc1trZXldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkaXJfb3JfZmlsZSA9IG9zLnBhdGguZXhwYW5kdXNlcihkaXJfb3JfZmlsZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlyX29yX2ZpbGUpOgorICAgICAgICAgICAgICAgIHNlbGYuZGlyZWN0b3J5ID0gZGlyX29yX2ZpbGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5kaXJlY3RvcnksIGRlZmF1bHQgPSBvcy5wYXRoLnNwbGl0KGRpcl9vcl9maWxlKQorICAgICAgICBzZWxmLnNldF9maWx0ZXIoc2VsZi5kaXJlY3RvcnksIHBhdHRlcm4pCisgICAgICAgIHNlbGYuc2V0X3NlbGVjdGlvbihkZWZhdWx0KQorICAgICAgICBzZWxmLmZpbHRlcl9jb21tYW5kKCkKKyAgICAgICAgc2VsZi5zZWxlY3Rpb24uZm9jdXNfc2V0KCkKKyAgICAgICAgc2VsZi50b3Aud2FpdF92aXNpYmlsaXR5KCkgIyB3aW5kb3cgbmVlZHMgdG8gYmUgdmlzaWJsZSBmb3IgdGhlIGdyYWIKKyAgICAgICAgc2VsZi50b3AuZ3JhYl9zZXQoKQorICAgICAgICBzZWxmLmhvdyA9IE5vbmUKKyAgICAgICAgc2VsZi5tYXN0ZXIubWFpbmxvb3AoKSAgICAgICAgICAjIEV4aXRlZCBieSBzZWxmLnF1aXQoaG93KQorICAgICAgICBpZiBrZXk6CisgICAgICAgICAgICBkaXJlY3RvcnksIHBhdHRlcm4gPSBzZWxmLmdldF9maWx0ZXIoKQorICAgICAgICAgICAgaWYgc2VsZi5ob3c6CisgICAgICAgICAgICAgICAgZGlyZWN0b3J5ID0gb3MucGF0aC5kaXJuYW1lKHNlbGYuaG93KQorICAgICAgICAgICAgZGlhbG9nc3RhdGVzW2tleV0gPSBkaXJlY3RvcnksIHBhdHRlcm4KKyAgICAgICAgc2VsZi50b3AuZGVzdHJveSgpCisgICAgICAgIHJldHVybiBzZWxmLmhvdworCisgICAgZGVmIHF1aXQoc2VsZiwgaG93PU5vbmUpOgorICAgICAgICBzZWxmLmhvdyA9IGhvdworICAgICAgICBzZWxmLm1hc3Rlci5xdWl0KCkgICAgICAgICAgICAgICMgRXhpdCBtYWlubG9vcCgpCisKKyAgICBkZWYgZGlyc19kb3VibGVfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLmZpbHRlcl9jb21tYW5kKCkKKworICAgIGRlZiBkaXJzX3NlbGVjdF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGRpciwgcGF0ID0gc2VsZi5nZXRfZmlsdGVyKCkKKyAgICAgICAgc3ViZGlyID0gc2VsZi5kaXJzLmdldCgnYWN0aXZlJykKKyAgICAgICAgZGlyID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5kaXJlY3RvcnksIHN1YmRpcikpCisgICAgICAgIHNlbGYuc2V0X2ZpbHRlcihkaXIsIHBhdCkKKworICAgIGRlZiBmaWxlc19kb3VibGVfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLm9rX2NvbW1hbmQoKQorCisgICAgZGVmIGZpbGVzX3NlbGVjdF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGZpbGUgPSBzZWxmLmZpbGVzLmdldCgnYWN0aXZlJykKKyAgICAgICAgc2VsZi5zZXRfc2VsZWN0aW9uKGZpbGUpCisKKyAgICBkZWYgb2tfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLm9rX2NvbW1hbmQoKQorCisgICAgZGVmIG9rX2NvbW1hbmQoc2VsZik6CisgICAgICAgIHNlbGYucXVpdChzZWxmLmdldF9zZWxlY3Rpb24oKSkKKworICAgIGRlZiBmaWx0ZXJfY29tbWFuZChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgZGlyLCBwYXQgPSBzZWxmLmdldF9maWx0ZXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlyKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBzZWxmLm1hc3Rlci5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmRpcmVjdG9yeSA9IGRpcgorICAgICAgICBzZWxmLnNldF9maWx0ZXIoZGlyLCBwYXQpCisgICAgICAgIG5hbWVzLnNvcnQoKQorICAgICAgICBzdWJkaXJzID0gW29zLnBhcmRpcl0KKyAgICAgICAgbWF0Y2hpbmdmaWxlcyA9IFtdCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyLCBuYW1lKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSk6CisgICAgICAgICAgICAgICAgc3ViZGlycy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIGVsaWYgZm5tYXRjaC5mbm1hdGNoKG5hbWUsIHBhdCk6CisgICAgICAgICAgICAgICAgbWF0Y2hpbmdmaWxlcy5hcHBlbmQobmFtZSkKKyAgICAgICAgc2VsZi5kaXJzLmRlbGV0ZSgwLCBFTkQpCisgICAgICAgIGZvciBuYW1lIGluIHN1YmRpcnM6CisgICAgICAgICAgICBzZWxmLmRpcnMuaW5zZXJ0KEVORCwgbmFtZSkKKyAgICAgICAgc2VsZi5maWxlcy5kZWxldGUoMCwgRU5EKQorICAgICAgICBmb3IgbmFtZSBpbiBtYXRjaGluZ2ZpbGVzOgorICAgICAgICAgICAgc2VsZi5maWxlcy5pbnNlcnQoRU5ELCBuYW1lKQorICAgICAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChzZWxmLmdldF9zZWxlY3Rpb24oKSkKKyAgICAgICAgaWYgdGFpbCA9PSBvcy5jdXJkaXI6IHRhaWwgPSAnJworICAgICAgICBzZWxmLnNldF9zZWxlY3Rpb24odGFpbCkKKworICAgIGRlZiBnZXRfZmlsdGVyKHNlbGYpOgorICAgICAgICBmaWx0ZXIgPSBzZWxmLmZpbHRlci5nZXQoKQorICAgICAgICBmaWx0ZXIgPSBvcy5wYXRoLmV4cGFuZHVzZXIoZmlsdGVyKQorICAgICAgICBpZiBmaWx0ZXJbLTE6XSA9PSBvcy5zZXAgb3Igb3MucGF0aC5pc2RpcihmaWx0ZXIpOgorICAgICAgICAgICAgZmlsdGVyID0gb3MucGF0aC5qb2luKGZpbHRlciwgIioiKQorICAgICAgICByZXR1cm4gb3MucGF0aC5zcGxpdChmaWx0ZXIpCisKKyAgICBkZWYgZ2V0X3NlbGVjdGlvbihzZWxmKToKKyAgICAgICAgZmlsZSA9IHNlbGYuc2VsZWN0aW9uLmdldCgpCisgICAgICAgIGZpbGUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoZmlsZSkKKyAgICAgICAgcmV0dXJuIGZpbGUKKworICAgIGRlZiBjYW5jZWxfY29tbWFuZChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgc2VsZi5xdWl0KCkKKworICAgIGRlZiBzZXRfZmlsdGVyKHNlbGYsIGRpciwgcGF0KToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMoZGlyKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHB3ZCA9IE5vbmUKKyAgICAgICAgICAgIGlmIHB3ZDoKKyAgICAgICAgICAgICAgICBkaXIgPSBvcy5wYXRoLmpvaW4ocHdkLCBkaXIpCisgICAgICAgICAgICAgICAgZGlyID0gb3MucGF0aC5ub3JtcGF0aChkaXIpCisgICAgICAgIHNlbGYuZmlsdGVyLmRlbGV0ZSgwLCBFTkQpCisgICAgICAgIHNlbGYuZmlsdGVyLmluc2VydChFTkQsIG9zLnBhdGguam9pbihkaXIgb3Igb3MuY3VyZGlyLCBwYXQgb3IgIioiKSkKKworICAgIGRlZiBzZXRfc2VsZWN0aW9uKHNlbGYsIGZpbGUpOgorICAgICAgICBzZWxmLnNlbGVjdGlvbi5kZWxldGUoMCwgRU5EKQorICAgICAgICBzZWxmLnNlbGVjdGlvbi5pbnNlcnQoRU5ELCBvcy5wYXRoLmpvaW4oc2VsZi5kaXJlY3RvcnksIGZpbGUpKQorCisKK2NsYXNzIExvYWRGaWxlRGlhbG9nKEZpbGVEaWFsb2cpOgorCisgICAgIiIiRmlsZSBzZWxlY3Rpb24gZGlhbG9nIHdoaWNoIGNoZWNrcyB0aGF0IHRoZSBmaWxlIGV4aXN0cy4iIiIKKworICAgIHRpdGxlID0gIkxvYWQgRmlsZSBTZWxlY3Rpb24gRGlhbG9nIgorCisgICAgZGVmIG9rX2NvbW1hbmQoc2VsZik6CisgICAgICAgIGZpbGUgPSBzZWxmLmdldF9zZWxlY3Rpb24oKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZSk6CisgICAgICAgICAgICBzZWxmLm1hc3Rlci5iZWxsKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucXVpdChmaWxlKQorCisKK2NsYXNzIFNhdmVGaWxlRGlhbG9nKEZpbGVEaWFsb2cpOgorCisgICAgIiIiRmlsZSBzZWxlY3Rpb24gZGlhbG9nIHdoaWNoIGNoZWNrcyB0aGF0IHRoZSBmaWxlIG1heSBiZSBjcmVhdGVkLiIiIgorCisgICAgdGl0bGUgPSAiU2F2ZSBGaWxlIFNlbGVjdGlvbiBEaWFsb2ciCisKKyAgICBkZWYgb2tfY29tbWFuZChzZWxmKToKKyAgICAgICAgZmlsZSA9IHNlbGYuZ2V0X3NlbGVjdGlvbigpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGUpOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmaWxlKToKKyAgICAgICAgICAgICAgICBzZWxmLm1hc3Rlci5iZWxsKCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGQgPSBEaWFsb2coc2VsZi50b3AsCisgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJPdmVyd3JpdGUgRXhpc3RpbmcgRmlsZSBRdWVzdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9Ik92ZXJ3cml0ZSBleGlzdGluZyBmaWxlICVyPyIgJSAoZmlsZSwpLAorICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXA9J3F1ZXN0aGVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncz0oIlllcyIsICJDYW5jZWwiKSkKKyAgICAgICAgICAgIGlmIGQubnVtICE9IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChmaWxlKQorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoaGVhZCk6CisgICAgICAgICAgICAgICAgc2VsZi5tYXN0ZXIuYmVsbCgpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYucXVpdChmaWxlKQorCisKK2RlZiB0ZXN0KCk6CisgICAgIiIiU2ltcGxlIHRlc3QgcHJvZ3JhbS4iIiIKKyAgICByb290ID0gVGsoKQorICAgIHJvb3Qud2l0aGRyYXcoKQorICAgIGZkID0gTG9hZEZpbGVEaWFsb2cocm9vdCkKKyAgICBsb2FkZmlsZSA9IGZkLmdvKGtleT0idGVzdCIpCisgICAgZmQgPSBTYXZlRmlsZURpYWxvZyhyb290KQorICAgIHNhdmVmaWxlID0gZmQuZ28oa2V5PSJ0ZXN0IikKKyAgICBwcmludCBsb2FkZmlsZSwgc2F2ZWZpbGUKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvRmlsZURpYWxvZy5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay9GaWxlRGlhbG9nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDhiZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvRmlsZURpYWxvZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvRmlsZURpYWxvZy5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay9GaWxlRGlhbG9nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDhiZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvRmlsZURpYWxvZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvRml4VGsucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay9GaXhUay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTk2MGM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvRml4VGsucHkKQEAgLTAsMCArMSw3OCBAQAoraW1wb3J0IHN5cywgb3MKKworIyBEZWxheSBpbXBvcnQgX3RraW50ZXIgdW50aWwgd2UgaGF2ZSBzZXQgVENMX0xJQlJBUlksCisjIHNvIHRoYXQgVGNsX0ZpbmRFeGVjdXRhYmxlIGhhcyBhIGNoYW5jZSB0byBsb2NhdGUgaXRzCisjIGVuY29kaW5nIGRpcmVjdG9yeS4KKworIyBVbmZvcnR1bmF0ZWx5LCB3ZSBjYW5ub3Qga25vdyB0aGUgVENMX0xJQlJBUlkgZGlyZWN0b3J5CisjIGlmIHdlIGRvbid0IGtub3cgdGhlIHRjbCB2ZXJzaW9uLCB3aGljaCB3ZSBjYW5ub3QgZmluZCBvdXQKKyMgd2l0aG91dCBpbXBvcnQgVGNsLiBGb3J0dW5hdGVseSwgVGNsIHdpbGwgaXRzZWxmIGxvb2sgaW4KKyMgPFRDTF9MSUJSQVJZPlwuLlx0Y2w8VENMX1ZFUlNJT04+LCBzbyBhbnl0aGluZyBjbG9zZSB0bworIyB0aGUgcmVhbCBUY2wgbGlicmFyeSB3aWxsIGRvLgorCisjIEV4cGFuZCBzeW1ib2xpYyBsaW5rcyBvbiBWaXN0YQordHJ5OgorICAgIGltcG9ydCBjdHlwZXMKKyAgICBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkdldEZpbmFsUGF0aE5hbWVCeUhhbmRsZVcKK2V4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICBkZWYgY29udmVydF9wYXRoKHMpOgorICAgICAgICByZXR1cm4gcworZWxzZToKKyAgICBkZWYgY29udmVydF9wYXRoKHMpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShzLCBzdHIpICAgIyBzeXMucHJlZml4IGNvbnRhaW5zIG9ubHkgYnl0ZXMKKyAgICAgICAgdWRpciA9IHMuZGVjb2RlKCJtYmNzIikKKyAgICAgICAgaGRpciA9IGN0eXBlcy53aW5kbGwua2VybmVsMzIuXAorICAgICAgICAgICAgQ3JlYXRlRmlsZVcodWRpciwgMHg4MCwgIyBGSUxFX1JFQURfQVRUUklCVVRFUworICAgICAgICAgICAgICAgICAgICAgICAgMSwgICAgICAgICAgIyBGSUxFX1NIQVJFX1JFQUQKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIDMsICAgICMgT1BFTl9FWElTVElORworICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMCwgIyBGSUxFX0ZMQUdfQkFDS1VQX1NFTUFOVElDUworICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSkKKyAgICAgICAgaWYgaGRpciA9PSAtMToKKyAgICAgICAgICAgICMgQ2Fubm90IG9wZW4gZGlyZWN0b3J5LCBnaXZlIHVwCisgICAgICAgICAgICByZXR1cm4gcworICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKHUiIiwgMzI3NjgpCisgICAgICAgIHJlcyA9IGN0eXBlcy53aW5kbGwua2VybmVsMzIuXAorICAgICAgICAgICAgR2V0RmluYWxQYXRoTmFtZUJ5SGFuZGxlVyhoZGlyLCBidWYsIGxlbihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSAjIFZPTFVNRV9OQU1FX0RPUworICAgICAgICBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkNsb3NlSGFuZGxlKGhkaXIpCisgICAgICAgIGlmIHJlcyA9PSAwOgorICAgICAgICAgICAgIyBDb252ZXJzaW9uIGZhaWxlZCAoZS5nLiBuZXR3b3JrIGxvY2F0aW9uKQorICAgICAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgcyA9IGJ1Zls6cmVzXS5lbmNvZGUoIm1iY3MiKQorICAgICAgICAjIElnbm9yZSBsZWFkaW5nIFxcP1wKKyAgICAgICAgaWYgcy5zdGFydHN3aXRoKCJcXFxcP1xcIik6CisgICAgICAgICAgICBzID0gc1s0Ol0KKyAgICAgICAgaWYgcy5zdGFydHN3aXRoKCJVTkMiKToKKyAgICAgICAgICAgIHMgPSAiXFwiICsgc1szOl0KKyAgICAgICAgcmV0dXJuIHMKKworcHJlZml4ID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsInRjbCIpCitpZiBub3Qgb3MucGF0aC5leGlzdHMocHJlZml4KToKKyAgICAjIGRldmRpci8uLi90Y2x0ay9saWIKKyAgICBwcmVmaXggPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgb3MucGF0aC5wYXJkaXIsICJ0Y2x0ayIsICJsaWIiKQorICAgIHByZWZpeCA9IG9zLnBhdGguYWJzcGF0aChwcmVmaXgpCisjIGlmIHRoaXMgZG9lcyBub3QgZXhpc3QsIG5vIGZ1cnRoZXIgc2VhcmNoIGlzIG5lZWRlZAoraWYgb3MucGF0aC5leGlzdHMocHJlZml4KToKKyAgICBwcmVmaXggPSBjb252ZXJ0X3BhdGgocHJlZml4KQorICAgIGlmICJUQ0xfTElCUkFSWSIgbm90IGluIG9zLmVudmlyb246CisgICAgICAgIGZvciBuYW1lIGluIG9zLmxpc3RkaXIocHJlZml4KToKKyAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgidGNsIik6CisgICAgICAgICAgICAgICAgdGNsZGlyID0gb3MucGF0aC5qb2luKHByZWZpeCxuYW1lKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIodGNsZGlyKToKKyAgICAgICAgICAgICAgICAgICAgb3MuZW52aXJvblsiVENMX0xJQlJBUlkiXSA9IHRjbGRpcgorICAgICMgQ29tcHV0ZSBUS19MSUJSQVJZLCBrbm93aW5nIHRoYXQgaXQgaGFzIHRoZSBzYW1lIHZlcnNpb24KKyAgICAjIGFzIFRjbAorICAgIGltcG9ydCBfdGtpbnRlcgorICAgIHZlciA9IHN0cihfdGtpbnRlci5UQ0xfVkVSU0lPTikKKyAgICBpZiAiVEtfTElCUkFSWSIgbm90IGluIG9zLmVudmlyb246CisgICAgICAgIHYgPSBvcy5wYXRoLmpvaW4ocHJlZml4LCAndGsnK3ZlcikKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHYsICJ0Y2xJbmRleCIpKToKKyAgICAgICAgICAgIG9zLmVudmlyb25bJ1RLX0xJQlJBUlknXSA9IHYKKyAgICAjIFdlIGRvbid0IGtub3cgdGhlIFRpeCB2ZXJzaW9uLCBzbyB3ZSBtdXN0IHNlYXJjaCB0aGUgZW50aXJlCisgICAgIyBkaXJlY3RvcnkKKyAgICBpZiAiVElYX0xJQlJBUlkiIG5vdCBpbiBvcy5lbnZpcm9uOgorICAgICAgICBmb3IgbmFtZSBpbiBvcy5saXN0ZGlyKHByZWZpeCk6CisgICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoInRpeCIpOgorICAgICAgICAgICAgICAgIHRpeGRpciA9IG9zLnBhdGguam9pbihwcmVmaXgsbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHRpeGRpcik6CisgICAgICAgICAgICAgICAgICAgIG9zLmVudmlyb25bIlRJWF9MSUJSQVJZIl0gPSB0aXhkaXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL0ZpeFRrLnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL0ZpeFRrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGRjMzhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvRml4VGsucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL0ZpeFRrLnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL0ZpeFRrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzIxZGYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvRml4VGsucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL1Njcm9sbGVkVGV4dC5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL1Njcm9sbGVkVGV4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWVmNzljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvU2Nyb2xsZWRUZXh0LnB5CkBAIC0wLDAgKzEsNTUgQEAKKyIiIkEgU2Nyb2xsZWRUZXh0IHdpZGdldCBmZWVscyBsaWtlIGEgdGV4dCB3aWRnZXQgYnV0IGFsc28gaGFzIGEKK3ZlcnRpY2FsIHNjcm9sbCBiYXIgb24gaXRzIHJpZ2h0LiAgKExhdGVyLCBvcHRpb25zIG1heSBiZSBhZGRlZCB0bworYWRkIGEgaG9yaXpvbnRhbCBiYXIgYXMgd2VsbCwgdG8gbWFrZSB0aGUgYmFycyBkaXNhcHBlYXIKK2F1dG9tYXRpY2FsbHkgd2hlbiBub3QgbmVlZGVkLCB0byBtb3ZlIHRoZW0gdG8gdGhlIG90aGVyIHNpZGUgb2YgdGhlCit3aW5kb3csIGV0Yy4pCisKK0NvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSBUZXh0IHdpZGdldC4KK0EgRnJhbWUgd2lkZ2V0IGlzIGluc2VydGVkIGJldHdlZW4gdGhlIG1hc3RlciBhbmQgdGhlIHRleHQsIHRvIGhvbGQKK3RoZSBTY3JvbGxiYXIgd2lkZ2V0LgorTW9zdCBtZXRob2RzIGNhbGxzIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgVGV4dCB3aWRnZXQ7IFBhY2ssIEdyaWQgYW5kCitQbGFjZSBtZXRob2RzIGFyZSByZWRpcmVjdGVkIHRvIHRoZSBGcmFtZSB3aWRnZXQgaG93ZXZlci4KKyIiIgorCitfX2FsbF9fID0gWydTY3JvbGxlZFRleHQnXQorCitmcm9tIFRraW50ZXIgaW1wb3J0IEZyYW1lLCBUZXh0LCBTY3JvbGxiYXIsIFBhY2ssIEdyaWQsIFBsYWNlCitmcm9tIFRrY29uc3RhbnRzIGltcG9ydCBSSUdIVCwgTEVGVCwgWSwgQk9USAorCitjbGFzcyBTY3JvbGxlZFRleHQoVGV4dCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgc2VsZi5mcmFtZSA9IEZyYW1lKG1hc3RlcikKKyAgICAgICAgc2VsZi52YmFyID0gU2Nyb2xsYmFyKHNlbGYuZnJhbWUpCisgICAgICAgIHNlbGYudmJhci5wYWNrKHNpZGU9UklHSFQsIGZpbGw9WSkKKworICAgICAgICBrdy51cGRhdGUoeyd5c2Nyb2xsY29tbWFuZCc6IHNlbGYudmJhci5zZXR9KQorICAgICAgICBUZXh0Ll9faW5pdF9fKHNlbGYsIHNlbGYuZnJhbWUsICoqa3cpCisgICAgICAgIHNlbGYucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCwgZXhwYW5kPVRydWUpCisgICAgICAgIHNlbGYudmJhclsnY29tbWFuZCddID0gc2VsZi55dmlldworCisgICAgICAgICMgQ29weSBnZW9tZXRyeSBtZXRob2RzIG9mIHNlbGYuZnJhbWUgd2l0aG91dCBvdmVycmlkaW5nIFRleHQKKyAgICAgICAgIyBtZXRob2RzIC0tIGhhY2shCisgICAgICAgIHRleHRfbWV0aHMgPSB2YXJzKFRleHQpLmtleXMoKQorICAgICAgICBtZXRob2RzID0gdmFycyhQYWNrKS5rZXlzKCkgKyB2YXJzKEdyaWQpLmtleXMoKSArIHZhcnMoUGxhY2UpLmtleXMoKQorICAgICAgICBtZXRob2RzID0gc2V0KG1ldGhvZHMpLmRpZmZlcmVuY2UodGV4dF9tZXRocykKKworICAgICAgICBmb3IgbSBpbiBtZXRob2RzOgorICAgICAgICAgICAgaWYgbVswXSAhPSAnXycgYW5kIG0gIT0gJ2NvbmZpZycgYW5kIG0gIT0gJ2NvbmZpZ3VyZSc6CisgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBtLCBnZXRhdHRyKHNlbGYuZnJhbWUsIG0pKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZi5mcmFtZSkKKworCitkZWYgZXhhbXBsZSgpOgorICAgIGltcG9ydCBfX21haW5fXworICAgIGZyb20gVGtjb25zdGFudHMgaW1wb3J0IEVORAorCisgICAgc3RleHQgPSBTY3JvbGxlZFRleHQoYmc9J3doaXRlJywgaGVpZ2h0PTEwKQorICAgIHN0ZXh0Lmluc2VydChFTkQsIF9fbWFpbl9fLl9fZG9jX18pCisgICAgc3RleHQucGFjayhmaWxsPUJPVEgsIHNpZGU9TEVGVCwgZXhwYW5kPVRydWUpCisgICAgc3RleHQuZm9jdXNfc2V0KCkKKyAgICBzdGV4dC5tYWlubG9vcCgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgZXhhbXBsZSgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9TY3JvbGxlZFRleHQucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvU2Nyb2xsZWRUZXh0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWI3YzEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvU2Nyb2xsZWRUZXh0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9TY3JvbGxlZFRleHQucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvU2Nyb2xsZWRUZXh0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWI3YzEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvU2Nyb2xsZWRUZXh0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9TaW1wbGVEaWFsb2cucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay9TaW1wbGVEaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwODMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL1NpbXBsZURpYWxvZy5weQpAQCAtMCwwICsxLDExMiBAQAorIiIiQSBzaW1wbGUgYnV0IGZsZXhpYmxlIG1vZGFsIGRpYWxvZyBib3guIiIiCisKKworZnJvbSBUa2ludGVyIGltcG9ydCAqCisKKworY2xhc3MgU2ltcGxlRGlhbG9nOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwKKyAgICAgICAgICAgICAgICAgdGV4dD0nJywgYnV0dG9ucz1bXSwgZGVmYXVsdD1Ob25lLCBjYW5jZWw9Tm9uZSwKKyAgICAgICAgICAgICAgICAgdGl0bGU9Tm9uZSwgY2xhc3NfPU5vbmUpOgorICAgICAgICBpZiBjbGFzc186CisgICAgICAgICAgICBzZWxmLnJvb3QgPSBUb3BsZXZlbChtYXN0ZXIsIGNsYXNzXz1jbGFzc18pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJvb3QgPSBUb3BsZXZlbChtYXN0ZXIpCisgICAgICAgIGlmIHRpdGxlOgorICAgICAgICAgICAgc2VsZi5yb290LnRpdGxlKHRpdGxlKQorICAgICAgICAgICAgc2VsZi5yb290Lmljb25uYW1lKHRpdGxlKQorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBNZXNzYWdlKHNlbGYucm9vdCwgdGV4dD10ZXh0LCBhc3BlY3Q9NDAwKQorICAgICAgICBzZWxmLm1lc3NhZ2UucGFjayhleHBhbmQ9MSwgZmlsbD1CT1RIKQorICAgICAgICBzZWxmLmZyYW1lID0gRnJhbWUoc2VsZi5yb290KQorICAgICAgICBzZWxmLmZyYW1lLnBhY2soKQorICAgICAgICBzZWxmLm51bSA9IGRlZmF1bHQKKyAgICAgICAgc2VsZi5jYW5jZWwgPSBjYW5jZWwKKyAgICAgICAgc2VsZi5kZWZhdWx0ID0gZGVmYXVsdAorICAgICAgICBzZWxmLnJvb3QuYmluZCgnPFJldHVybj4nLCBzZWxmLnJldHVybl9ldmVudCkKKyAgICAgICAgZm9yIG51bSBpbiByYW5nZShsZW4oYnV0dG9ucykpOgorICAgICAgICAgICAgcyA9IGJ1dHRvbnNbbnVtXQorICAgICAgICAgICAgYiA9IEJ1dHRvbihzZWxmLmZyYW1lLCB0ZXh0PXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9KGxhbWJkYSBzZWxmPXNlbGYsIG51bT1udW06IHNlbGYuZG9uZShudW0pKSkKKyAgICAgICAgICAgIGlmIG51bSA9PSBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGIuY29uZmlnKHJlbGllZj1SSURHRSwgYm9yZGVyd2lkdGg9OCkKKyAgICAgICAgICAgIGIucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCwgZXhwYW5kPTEpCisgICAgICAgIHNlbGYucm9vdC5wcm90b2NvbCgnV01fREVMRVRFX1dJTkRPVycsIHNlbGYud21fZGVsZXRlX3dpbmRvdykKKyAgICAgICAgc2VsZi5fc2V0X3RyYW5zaWVudChtYXN0ZXIpCisKKyAgICBkZWYgX3NldF90cmFuc2llbnQoc2VsZiwgbWFzdGVyLCByZWx4PTAuNSwgcmVseT0wLjMpOgorICAgICAgICB3aWRnZXQgPSBzZWxmLnJvb3QKKyAgICAgICAgd2lkZ2V0LndpdGhkcmF3KCkgIyBSZW1haW4gaW52aXNpYmxlIHdoaWxlIHdlIGZpZ3VyZSBvdXQgdGhlIGdlb21ldHJ5CisgICAgICAgIHdpZGdldC50cmFuc2llbnQobWFzdGVyKQorICAgICAgICB3aWRnZXQudXBkYXRlX2lkbGV0YXNrcygpICMgQWN0dWFsaXplIGdlb21ldHJ5IGluZm9ybWF0aW9uCisgICAgICAgIGlmIG1hc3Rlci53aW5mb19pc21hcHBlZCgpOgorICAgICAgICAgICAgbV93aWR0aCA9IG1hc3Rlci53aW5mb193aWR0aCgpCisgICAgICAgICAgICBtX2hlaWdodCA9IG1hc3Rlci53aW5mb19oZWlnaHQoKQorICAgICAgICAgICAgbV94ID0gbWFzdGVyLndpbmZvX3Jvb3R4KCkKKyAgICAgICAgICAgIG1feSA9IG1hc3Rlci53aW5mb19yb290eSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtX3dpZHRoID0gbWFzdGVyLndpbmZvX3NjcmVlbndpZHRoKCkKKyAgICAgICAgICAgIG1faGVpZ2h0ID0gbWFzdGVyLndpbmZvX3NjcmVlbmhlaWdodCgpCisgICAgICAgICAgICBtX3ggPSBtX3kgPSAwCisgICAgICAgIHdfd2lkdGggPSB3aWRnZXQud2luZm9fcmVxd2lkdGgoKQorICAgICAgICB3X2hlaWdodCA9IHdpZGdldC53aW5mb19yZXFoZWlnaHQoKQorICAgICAgICB4ID0gbV94ICsgKG1fd2lkdGggLSB3X3dpZHRoKSAqIHJlbHgKKyAgICAgICAgeSA9IG1feSArIChtX2hlaWdodCAtIHdfaGVpZ2h0KSAqIHJlbHkKKyAgICAgICAgaWYgeCt3X3dpZHRoID4gbWFzdGVyLndpbmZvX3NjcmVlbndpZHRoKCk6CisgICAgICAgICAgICB4ID0gbWFzdGVyLndpbmZvX3NjcmVlbndpZHRoKCkgLSB3X3dpZHRoCisgICAgICAgIGVsaWYgeCA8IDA6CisgICAgICAgICAgICB4ID0gMAorICAgICAgICBpZiB5K3dfaGVpZ2h0ID4gbWFzdGVyLndpbmZvX3NjcmVlbmhlaWdodCgpOgorICAgICAgICAgICAgeSA9IG1hc3Rlci53aW5mb19zY3JlZW5oZWlnaHQoKSAtIHdfaGVpZ2h0CisgICAgICAgIGVsaWYgeSA8IDA6CisgICAgICAgICAgICB5ID0gMAorICAgICAgICB3aWRnZXQuZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSkpCisgICAgICAgIHdpZGdldC5kZWljb25pZnkoKSAjIEJlY29tZSB2aXNpYmxlIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uCisKKyAgICBkZWYgZ28oc2VsZik6CisgICAgICAgIHNlbGYucm9vdC53YWl0X3Zpc2liaWxpdHkoKQorICAgICAgICBzZWxmLnJvb3QuZ3JhYl9zZXQoKQorICAgICAgICBzZWxmLnJvb3QubWFpbmxvb3AoKQorICAgICAgICBzZWxmLnJvb3QuZGVzdHJveSgpCisgICAgICAgIHJldHVybiBzZWxmLm51bQorCisgICAgZGVmIHJldHVybl9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGlmIHNlbGYuZGVmYXVsdCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5yb290LmJlbGwoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kb25lKHNlbGYuZGVmYXVsdCkKKworICAgIGRlZiB3bV9kZWxldGVfd2luZG93KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNhbmNlbCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5yb290LmJlbGwoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kb25lKHNlbGYuY2FuY2VsKQorCisgICAgZGVmIGRvbmUoc2VsZiwgbnVtKToKKyAgICAgICAgc2VsZi5udW0gPSBudW0KKyAgICAgICAgc2VsZi5yb290LnF1aXQoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisKKyAgICBkZWYgdGVzdCgpOgorICAgICAgICByb290ID0gVGsoKQorICAgICAgICBkZWYgZG9pdChyb290PXJvb3QpOgorICAgICAgICAgICAgZCA9IFNpbXBsZURpYWxvZyhyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9IlRoaXMgaXMgYSB0ZXN0IGRpYWxvZy4gICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXb3VsZCB0aGlzIGhhdmUgYmVlbiBhbiBhY3R1YWwgZGlhbG9nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGJ1dHRvbnMgYmVsb3cgd291bGQgaGF2ZSBiZWVuIGdsb3dpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIHNvZnQgcGluayBsaWdodC5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEbyB5b3UgYmVsaWV2ZSB0aGlzPyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucz1bIlllcyIsICJObyIsICJDYW5jZWwiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsPTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9IlRlc3QgRGlhbG9nIikKKyAgICAgICAgICAgIHByaW50IGQuZ28oKQorICAgICAgICB0ID0gQnV0dG9uKHJvb3QsIHRleHQ9J1Rlc3QnLCBjb21tYW5kPWRvaXQpCisgICAgICAgIHQucGFjaygpCisgICAgICAgIHEgPSBCdXR0b24ocm9vdCwgdGV4dD0nUXVpdCcsIGNvbW1hbmQ9dC5xdWl0KQorICAgICAgICBxLnBhY2soKQorICAgICAgICB0Lm1haW5sb29wKCkKKworICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvU2ltcGxlRGlhbG9nLnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL1NpbXBsZURpYWxvZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkNzMwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL1NpbXBsZURpYWxvZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvU2ltcGxlRGlhbG9nLnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL1NpbXBsZURpYWxvZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVkNzMwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL1NpbXBsZURpYWxvZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvVGl4LnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGl4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDc1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9UaXgucHkKQEAgLTAsMCArMSwxOTY3IEBACisjIC0qLW1vZGU6IHB5dGhvbjsgZmlsbC1jb2x1bW46IDc1OyB0YWItd2lkdGg6IDg7IGNvZGluZzogaXNvLWxhdGluLTEtdW5peCAtKi0KKyMKKyMgJElkJAorIworIyBUaXgucHkgLS0gVGl4IHdpZGdldCB3cmFwcGVycy4KKyMKKyMgICAgICAgRm9yIFRpeCwgc2VlIGh0dHA6Ly90aXguc291cmNlZm9yZ2UubmV0CisjCisjICAgICAgIC0gU3VkaGlyIFNoZW5veSAoc3NoZW5veUBnb2wuY29tKSwgRGVjLiAxOTk1LgorIyAgICAgICAgIGJhc2VkIG9uIGFuIGlkZWEgb2YgSmVhbi1NYXJjIEx1Z3JpbiAobHVncmluQG1zLmNvbSkKKyMKKyMgTk9URTogSW4gb3JkZXIgdG8gbWluaW1pemUgY2hhbmdlcyB0byBUa2ludGVyLnB5LCBzb21lIG9mIHRoZSBjb2RlIGhlcmUKKyMgICAgICAgKFRpeFdpZGdldC5fX2luaXRfXykgaGFzIGJlZW4gdGFrZW4gZnJvbSBUa2ludGVyIChXaWRnZXQuX19pbml0X18pCisjICAgICAgIGFuZCB3aWxsIGJyZWFrIGlmIHRoZXJlIGFyZSBtYWpvciBjaGFuZ2VzIGluIFRraW50ZXIuCisjCisjIFRoZSBUaXggd2lkZ2V0cyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBjbGFzcyBoaWVyYXJjaHkgaW4gcHl0aG9uIHdpdGggcHJvcGVyCisjIGluaGVyaXRhbmNlIG9mIGJhc2UgY2xhc3Nlcy4KKyMKKyMgQXMgYSByZXN1bHQgYWZ0ZXIgY3JlYXRpbmcgYSAndyA9IFN0ZEJ1dHRvbkJveCcsIEkgY2FuIHdyaXRlCisjICAgICAgICAgICAgICB3Lm9rWyd0ZXh0J10gPSAnV2hvIENhcmVzJworIyAgICBvciAgICAgICAgICAgICAgdy5va1snYmcnXSA9IHdbJ2JnJ10KKyMgb3IgZXZlbiAgICAgICB3Lm9rLmludm9rZSgpCisjIGV0Yy4KKyMKKyMgQ29tcGFyZSB0aGUgZGVtbyB0aXh3aWRnZXRzLnB5IHRvIHRoZSBvcmlnaW5hbCBUY2wgcHJvZ3JhbSBhbmQgeW91IHdpbGwKKyMgYXBwcmVjaWF0ZSB0aGUgYWR2YW50YWdlcy4KKyMKKworZnJvbSBUa2ludGVyIGltcG9ydCAqCitmcm9tIFRraW50ZXIgaW1wb3J0IF9mbGF0dGVuLCBfY25mbWVyZ2UsIF9kZWZhdWx0X3Jvb3QKKworIyBXQVJOSU5HIC0gVGtWZXJzaW9uIGlzIGEgbGltaXRlZCBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVyCitpZiBUa1ZlcnNpb24gPCAzLjk5OToKKyAgICByYWlzZSBJbXBvcnRFcnJvciwgIlRoaXMgdmVyc2lvbiBvZiBUaXgucHkgcmVxdWlyZXMgVGsgNC4wIG9yIGhpZ2hlciIKKworaW1wb3J0IF90a2ludGVyICMgSWYgdGhpcyBmYWlscyB5b3VyIFB5dGhvbiBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yIFRrCisKKyMgU29tZSBtb3JlIGNvbnN0YW50cyAoZm9yIGNvbnNpc3RlbmN5IHdpdGggVGtpbnRlcikKK1dJTkRPVyA9ICd3aW5kb3cnCitURVhUID0gJ3RleHQnCitTVEFUVVMgPSAnc3RhdHVzJworSU1NRURJQVRFID0gJ2ltbWVkaWF0ZScKK0lNQUdFID0gJ2ltYWdlJworSU1BR0VURVhUID0gJ2ltYWdldGV4dCcKK0JBTExPT04gPSAnYmFsbG9vbicKK0FVVE8gPSAnYXV0bycKK0FDUk9TU1RPUCA9ICdhY3Jvc3N0b3AnCisKKyMgQSBmZXcgdXNlZnVsIGNvbnN0YW50cyBmb3IgdGhlIEdyaWQgd2lkZ2V0CitBU0NJSSA9ICdhc2NpaScKK0NFTEwgPSAnY2VsbCcKK0NPTFVNTiA9ICdjb2x1bW4nCitERUNSRUFTSU5HID0gJ2RlY3JlYXNpbmcnCitJTkNSRUFTSU5HID0gJ2luY3JlYXNpbmcnCitJTlRFR0VSID0gJ2ludGVnZXInCitNQUlOID0gJ21haW4nCitNQVggPSAnbWF4JworUkVBTCA9ICdyZWFsJworUk9XID0gJ3JvdycKK1NfUkVHSU9OID0gJ3MtcmVnaW9uJworWF9SRUdJT04gPSAneC1yZWdpb24nCitZX1JFR0lPTiA9ICd5LXJlZ2lvbicKKworIyBTb21lIGNvbnN0YW50cyB1c2VkIGJ5IFRraW50ZXIgZG9vbmVldmVudCgpCitUQ0xfRE9OVF9XQUlUICAgICA9IDEgPDwgMQorVENMX1dJTkRPV19FVkVOVFMgPSAxIDw8IDIKK1RDTF9GSUxFX0VWRU5UUyAgID0gMSA8PCAzCitUQ0xfVElNRVJfRVZFTlRTICA9IDEgPDwgNAorVENMX0lETEVfRVZFTlRTICAgPSAxIDw8IDUKK1RDTF9BTExfRVZFTlRTICAgID0gMAorCisjIEJFV0FSRSAtIHRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgY29weWluZyBzb21lIGNvZGUgZnJvbSB0aGUgV2lkZ2V0IGNsYXNzCisjICAgICAgICAgIGluIFRraW50ZXIgKHRvIG92ZXJyaWRlIFdpZGdldCBpbml0aWFsaXphdGlvbikgYW5kIGlzIHRoZXJlZm9yZQorIyAgICAgICAgICBsaWFibGUgdG8gYnJlYWsuCitpbXBvcnQgVGtpbnRlciwgb3MKKworIyBDb3VsZCBwcm9iYWJseSBhZGQgdGhpcyB0byBUa2ludGVyLk1pc2MKK2NsYXNzIHRpeENvbW1hbmQ6CisgICAgIiIiVGhlIHRpeCBjb21tYW5kcyBwcm92aWRlIGFjY2VzcyB0byBtaXNjZWxsYW5lb3VzICBlbGVtZW50cworICAgIG9mICBUaXgncyAgaW50ZXJuYWwgc3RhdGUgYW5kIHRoZSBUaXggYXBwbGljYXRpb24gY29udGV4dC4KKyAgICBNb3N0IG9mIHRoZSBpbmZvcm1hdGlvbiBtYW5pcHVsYXRlZCBieSB0aGVzZSAgY29tbWFuZHMgcGVydGFpbnMKKyAgICB0byAgdGhlICBhcHBsaWNhdGlvbiAgYXMgYSB3aG9sZSwgb3IgdG8gYSBzY3JlZW4gb3IKKyAgICBkaXNwbGF5LCByYXRoZXIgdGhhbiB0byBhIHBhcnRpY3VsYXIgd2luZG93LgorCisgICAgVGhpcyBpcyBhIG1peGluIGNsYXNzLCBhc3N1bWVkIHRvIGJlIG1peGVkIHRvIFRraW50ZXIuVGsKKyAgICB0aGF0IHN1cHBvcnRzIHRoZSBzZWxmLnRrLmNhbGwgbWV0aG9kLgorICAgICIiIgorCisgICAgZGVmIHRpeF9hZGRiaXRtYXBkaXIoc2VsZiwgZGlyZWN0b3J5KToKKyAgICAgICAgIiIiVGl4IG1haW50YWlucyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdW5kZXIgd2hpY2gKKyAgICAgICAgdGhlICB0aXhfZ2V0aW1hZ2UgIGFuZCB0aXhfZ2V0Yml0bWFwIGNvbW1hbmRzIHdpbGwKKyAgICAgICAgc2VhcmNoIGZvciBpbWFnZSBmaWxlcy4gVGhlIHN0YW5kYXJkIGJpdG1hcCAgZGlyZWN0b3J5CisgICAgICAgIGlzICRUSVhfTElCUkFSWS9iaXRtYXBzLiBUaGUgYWRkYml0bWFwZGlyIGNvbW1hbmQKKyAgICAgICAgYWRkcyBkaXJlY3RvcnkgaW50byB0aGlzIGxpc3QuIEJ5ICB1c2luZyAgdGhpcworICAgICAgICBjb21tYW5kLCB0aGUgIGltYWdlICBmaWxlcyAgb2YgYW4gYXBwbGljYXRpb25zIGNhbgorICAgICAgICBhbHNvIGJlIGxvY2F0ZWQgdXNpbmcgdGhlIHRpeF9nZXRpbWFnZSBvciB0aXhfZ2V0Yml0bWFwCisgICAgICAgIGNvbW1hbmQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd0aXgnLCAnYWRkYml0bWFwZGlyJywgZGlyZWN0b3J5KQorCisgICAgZGVmIHRpeF9jZ2V0KHNlbGYsIG9wdGlvbik6CisgICAgICAgICIiIlJldHVybnMgIHRoZSAgY3VycmVudCAgdmFsdWUgIG9mIHRoZSBjb25maWd1cmF0aW9uCisgICAgICAgIG9wdGlvbiBnaXZlbiBieSBvcHRpb24uIE9wdGlvbiBtYXkgYmUgIGFueSAgb2YgIHRoZQorICAgICAgICBvcHRpb25zIGRlc2NyaWJlZCBpbiB0aGUgQ09ORklHVVJBVElPTiBPUFRJT05TIHNlY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd0aXgnLCAnY2dldCcsIG9wdGlvbikKKworICAgIGRlZiB0aXhfY29uZmlndXJlKHNlbGYsIGNuZj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiUXVlcnkgb3IgbW9kaWZ5IHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb2YgdGhlIFRpeCBhcHBsaWNhdGlvbgorICAgICAgICBjb250ZXh0LiBJZiBubyBvcHRpb24gaXMgc3BlY2lmaWVkLCByZXR1cm5zIGEgZGljdGlvbmFyeSBhbGwgb2YgdGhlCisgICAgICAgIGF2YWlsYWJsZSBvcHRpb25zLiAgSWYgb3B0aW9uIGlzIHNwZWNpZmllZCB3aXRoIG5vIHZhbHVlLCB0aGVuIHRoZQorICAgICAgICBjb21tYW5kIHJldHVybnMgYSBsaXN0IGRlc2NyaWJpbmcgdGhlIG9uZSBuYW1lZCBvcHRpb24gKHRoaXMgbGlzdAorICAgICAgICB3aWxsIGJlIGlkZW50aWNhbCB0byB0aGUgY29ycmVzcG9uZGluZyBzdWJsaXN0IG9mIHRoZSB2YWx1ZQorICAgICAgICByZXR1cm5lZCBpZiBubyBvcHRpb24gaXMgc3BlY2lmaWVkKS4gIElmIG9uZSBvciBtb3JlIG9wdGlvbi12YWx1ZQorICAgICAgICBwYWlycyBhcmUgc3BlY2lmaWVkLCB0aGVuIHRoZSBjb21tYW5kIG1vZGlmaWVzIHRoZSBnaXZlbiBvcHRpb24ocykKKyAgICAgICAgdG8gaGF2ZSB0aGUgZ2l2ZW4gdmFsdWUocyk7IGluIHRoaXMgY2FzZSB0aGUgY29tbWFuZCByZXR1cm5zIGFuCisgICAgICAgIGVtcHR5IHN0cmluZy4gT3B0aW9uIG1heSBiZSBhbnkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgICMgQ29waWVkIGZyb20gVGtpbnRlci5weQorICAgICAgICBpZiBrdzoKKyAgICAgICAgICAgIGNuZiA9IF9jbmZtZXJnZSgoY25mLCBrdykpCisgICAgICAgIGVsaWYgY25mOgorICAgICAgICAgICAgY25mID0gX2NuZm1lcmdlKGNuZikKKyAgICAgICAgaWYgY25mIGlzIE5vbmU6CisgICAgICAgICAgICBjbmYgPSB7fQorICAgICAgICAgICAgZm9yIHggaW4gc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoJ3RpeCcsICdjb25maWd1cmUnKSk6CisgICAgICAgICAgICAgICAgY25mW3hbMF1bMTpdXSA9ICh4WzBdWzE6XSwpICsgeFsxOl0KKyAgICAgICAgICAgIHJldHVybiBjbmYKKyAgICAgICAgaWYgaXNpbnN0YW5jZShjbmYsIFN0cmluZ1R5cGUpOgorICAgICAgICAgICAgeCA9IHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKCd0aXgnLCAnY29uZmlndXJlJywgJy0nK2NuZikpCisgICAgICAgICAgICByZXR1cm4gKHhbMF1bMTpdLCkgKyB4WzE6XQorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCgndGl4JywgJ2NvbmZpZ3VyZScpICsgc2VsZi5fb3B0aW9ucyhjbmYpKQorCisgICAgZGVmIHRpeF9maWxlZGlhbG9nKHNlbGYsIGRsZ2NsYXNzPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgdGhhdCBtYXkgYmUgc2hhcmVkIGFtb25nCisgICAgICAgIGRpZmZlcmVudCBjYWxscyBmcm9tIHRoaXMgYXBwbGljYXRpb24uICBUaGlzIGNvbW1hbmQgd2lsbCBjcmVhdGUgYQorICAgICAgICBmaWxlIHNlbGVjdGlvbiBkaWFsb2cgd2lkZ2V0IHdoZW4gaXQgaXMgY2FsbGVkIHRoZSBmaXJzdCB0aW1lLiBUaGlzCisgICAgICAgIGRpYWxvZyB3aWxsIGJlIHJldHVybmVkIGJ5IGFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvIHRpeF9maWxlZGlhbG9nLgorICAgICAgICBBbiBvcHRpb25hbCBkbGdjbGFzcyBwYXJhbWV0ZXIgY2FuIGJlIHBhc3NlZCB0byBzcGVjaWZpZWQgd2hhdCB0eXBlCisgICAgICAgIG9mIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyB3aWRnZXQgaXMgZGVzaXJlZC4gUG9zc2libGUgb3B0aW9ucyBhcmUKKyAgICAgICAgdGl4IEZpbGVTZWxlY3REaWFsb2cgb3IgdGl4RXhGaWxlU2VsZWN0RGlhbG9nLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZGxnY2xhc3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd0aXgnLCAnZmlsZWRpYWxvZycsIGRsZ2NsYXNzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgndGl4JywgJ2ZpbGVkaWFsb2cnKQorCisgICAgZGVmIHRpeF9nZXRiaXRtYXAoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkxvY2F0ZXMgYSBiaXRtYXAgZmlsZSBvZiB0aGUgbmFtZSBuYW1lLnhwbSBvciBuYW1lIGluIG9uZSBvZiB0aGUKKyAgICAgICAgYml0bWFwIGRpcmVjdG9yaWVzIChzZWUgdGhlIHRpeF9hZGRiaXRtYXBkaXIgY29tbWFuZCBhYm92ZSkuICBCeQorICAgICAgICB1c2luZyB0aXhfZ2V0Yml0bWFwLCB5b3UgY2FuIGF2b2lkIGhhcmQgY29kaW5nIHRoZSBwYXRobmFtZXMgb2YgdGhlCisgICAgICAgIGJpdG1hcCBmaWxlcyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBXaGVuIHN1Y2Nlc3NmdWwsIGl0IHJldHVybnMgdGhlCisgICAgICAgIGNvbXBsZXRlIHBhdGhuYW1lIG9mIHRoZSBiaXRtYXAgZmlsZSwgcHJlZml4ZWQgd2l0aCB0aGUgY2hhcmFjdGVyCisgICAgICAgICdAJy4gIFRoZSByZXR1cm5lZCB2YWx1ZSBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIC1iaXRtYXAKKyAgICAgICAgb3B0aW9uIG9mIHRoZSBUSyBhbmQgVGl4IHdpZGdldHMuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd0aXgnLCAnZ2V0Yml0bWFwJywgbmFtZSkKKworICAgIGRlZiB0aXhfZ2V0aW1hZ2Uoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkxvY2F0ZXMgYW4gaW1hZ2UgZmlsZSBvZiB0aGUgbmFtZSBuYW1lLnhwbSwgbmFtZS54Ym0gb3IgbmFtZS5wcG0KKyAgICAgICAgaW4gb25lIG9mIHRoZSBiaXRtYXAgZGlyZWN0b3JpZXMgKHNlZSB0aGUgYWRkYml0bWFwZGlyIGNvbW1hbmQKKyAgICAgICAgYWJvdmUpLiBJZiBtb3JlIHRoYW4gb25lIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIChidXQgZGlmZmVyZW50CisgICAgICAgIGV4dGVuc2lvbnMpIGV4aXN0LCB0aGVuIHRoZSBpbWFnZSB0eXBlIGlzIGNob3NlbiBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgIGRlcHRoIG9mIHRoZSBYIGRpc3BsYXk6IHhibSBpbWFnZXMgYXJlIGNob3NlbiBvbiBtb25vY2hyb21lCisgICAgICAgIGRpc3BsYXlzIGFuZCBjb2xvciBpbWFnZXMgYXJlIGNob3NlbiBvbiBjb2xvciBkaXNwbGF5cy4gQnkgdXNpbmcKKyAgICAgICAgdGl4XyBnZXRpbWFnZSwgeW91IGNhbiBhdm9pZCBoYXJkIGNvZGluZyB0aGUgcGF0aG5hbWVzIG9mIHRoZQorICAgICAgICBpbWFnZSBmaWxlcyBpbiB5b3VyIGFwcGxpY2F0aW9uLiBXaGVuIHN1Y2Nlc3NmdWwsIHRoaXMgY29tbWFuZAorICAgICAgICByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBuZXdseSBjcmVhdGVkIGltYWdlLCB3aGljaCBjYW4gYmUgdXNlZCB0bworICAgICAgICBjb25maWd1cmUgdGhlIC1pbWFnZSBvcHRpb24gb2YgdGhlIFRrIGFuZCBUaXggd2lkZ2V0cy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3RpeCcsICdnZXRpbWFnZScsIG5hbWUpCisKKyAgICBkZWYgdGl4X29wdGlvbl9nZXQoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkdldHMgIHRoZSBvcHRpb25zICBtYWludGFpbmVkICBieSAgdGhlICBUaXgKKyAgICAgICAgc2NoZW1lIG1lY2hhbmlzbS4gQXZhaWxhYmxlIG9wdGlvbnMgaW5jbHVkZToKKworICAgICAgICAgICAgYWN0aXZlX2JnICAgICAgIGFjdGl2ZV9mZyAgICAgIGJnCisgICAgICAgICAgICBib2xkX2ZvbnQgICAgICAgZGFyazFfYmcgICAgICAgZGFyazFfZmcKKyAgICAgICAgICAgIGRhcmsyX2JnICAgICAgICBkYXJrMl9mZyAgICAgICBkaXNhYmxlZF9mZworICAgICAgICAgICAgZmcgICAgICAgICAgICAgIGZpeGVkX2ZvbnQgICAgIGZvbnQKKyAgICAgICAgICAgIGluYWN0aXZlX2JnICAgICBpbmFjdGl2ZV9mZyAgICBpbnB1dDFfYmcKKyAgICAgICAgICAgIGlucHV0Ml9iZyAgICAgICBpdGFsaWNfZm9udCAgICBsaWdodDFfYmcKKyAgICAgICAgICAgIGxpZ2h0MV9mZyAgICAgICBsaWdodDJfYmcgICAgICBsaWdodDJfZmcKKyAgICAgICAgICAgIG1lbnVfZm9udCAgICAgICBvdXRwdXQxX2JnICAgICBvdXRwdXQyX2JnCisgICAgICAgICAgICBzZWxlY3RfYmcgICAgICAgc2VsZWN0X2ZnICAgICAgc2VsZWN0b3IKKyAgICAgICAgICAgICIiIgorICAgICAgICAjIGNvdWxkIHVzZSBzZWxmLnRrLmdsb2JhbGdldHZhcigndGl4T3B0aW9uJywgbmFtZSkKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgndGl4JywgJ29wdGlvbicsICdnZXQnLCBuYW1lKQorCisgICAgZGVmIHRpeF9yZXNldG9wdGlvbnMoc2VsZiwgbmV3U2NoZW1lLCBuZXdGb250U2V0LCBuZXdTY21QcmlvPU5vbmUpOgorICAgICAgICAiIiJSZXNldHMgdGhlIHNjaGVtZSBhbmQgZm9udHNldCBvZiB0aGUgVGl4IGFwcGxpY2F0aW9uIHRvCisgICAgICAgIG5ld1NjaGVtZSBhbmQgbmV3Rm9udFNldCwgcmVzcGVjdGl2ZWx5LiAgVGhpcyBhZmZlY3RzIG9ubHkgdGhvc2UKKyAgICAgICAgd2lkZ2V0cyBjcmVhdGVkIGFmdGVyIHRoaXMgY2FsbC4gVGhlcmVmb3JlLCBpdCBpcyBiZXN0IHRvIGNhbGwgdGhlCisgICAgICAgIHJlc2V0b3B0aW9ucyBjb21tYW5kIGJlZm9yZSB0aGUgY3JlYXRpb24gb2YgYW55IHdpZGdldHMgaW4gYSBUaXgKKyAgICAgICAgYXBwbGljYXRpb24uCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBuZXdTY21QcmlvIGNhbiBiZSBnaXZlbiB0byByZXNldCB0aGUKKyAgICAgICAgcHJpb3JpdHkgbGV2ZWwgb2YgdGhlIFRrIG9wdGlvbnMgc2V0IGJ5IHRoZSBUaXggc2NoZW1lcy4KKworICAgICAgICBCZWNhdXNlIG9mIHRoZSB3YXkgVGsgaGFuZGxlcyB0aGUgWCBvcHRpb24gZGF0YWJhc2UsIGFmdGVyIFRpeCBoYXMKKyAgICAgICAgYmVlbiBoYXMgaW1wb3J0ZWQgYW5kIGluaXRlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlc2V0IHRoZSBjb2xvcgorICAgICAgICBzY2hlbWVzIGFuZCBmb250IHNldHMgdXNpbmcgdGhlIHRpeCBjb25maWcgY29tbWFuZC4gIEluc3RlYWQsIHRoZQorICAgICAgICB0aXhfcmVzZXRvcHRpb25zIGNvbW1hbmQgbXVzdCBiZSB1c2VkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbmV3U2NtUHJpbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3RpeCcsICdyZXNldG9wdGlvbnMnLCBuZXdTY2hlbWUsIG5ld0ZvbnRTZXQsIG5ld1NjbVByaW8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd0aXgnLCAncmVzZXRvcHRpb25zJywgbmV3U2NoZW1lLCBuZXdGb250U2V0KQorCitjbGFzcyBUayhUa2ludGVyLlRrLCB0aXhDb21tYW5kKToKKyAgICAiIiJUb3BsZXZlbCB3aWRnZXQgb2YgVGl4IHdoaWNoIHJlcHJlc2VudHMgbW9zdGx5IHRoZSBtYWluIHdpbmRvdworICAgIG9mIGFuIGFwcGxpY2F0aW9uLiBJdCBoYXMgYW4gYXNzb2NpYXRlZCBUY2wgaW50ZXJwcmV0ZXIuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNjcmVlbk5hbWU9Tm9uZSwgYmFzZU5hbWU9Tm9uZSwgY2xhc3NOYW1lPSdUaXgnKToKKyAgICAgICAgVGtpbnRlci5Uay5fX2luaXRfXyhzZWxmLCBzY3JlZW5OYW1lLCBiYXNlTmFtZSwgY2xhc3NOYW1lKQorICAgICAgICB0aXhsaWIgPSBvcy5lbnZpcm9uLmdldCgnVElYX0xJQlJBUlknKQorICAgICAgICBzZWxmLnRrLmV2YWwoJ2dsb2JhbCBhdXRvX3BhdGg7IGxhcHBlbmQgYXV0b19wYXRoIFtmaWxlIGRpciBbaW5mbyBuYW1lb2ZdXScpCisgICAgICAgIGlmIHRpeGxpYiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGsuZXZhbCgnZ2xvYmFsIGF1dG9fcGF0aDsgbGFwcGVuZCBhdXRvX3BhdGggeyVzfScgJSB0aXhsaWIpCisgICAgICAgICAgICBzZWxmLnRrLmV2YWwoJ2dsb2JhbCB0Y2xfcGtnUGF0aDsgbGFwcGVuZCB0Y2xfcGtnUGF0aCB7JXN9JyAlIHRpeGxpYikKKyAgICAgICAgIyBMb2FkIFRpeCAtIHRoaXMgc2hvdWxkIHdvcmsgZHluYW1pY2FsbHkgb3Igc3RhdGljYWxseQorICAgICAgICAjIElmIGl0J3Mgc3RhdGljLCB0Y2wvdGl4OC4xL3BrZ0luZGV4LnRjbCBzaG91bGQgaGF2ZQorICAgICAgICAjICAgICAgICAgICAgICAgJ2xvYWQge30gVGl4JworICAgICAgICAjIElmIGl0J3MgZHluYW1pYyB1bmRlciBVbml4LCB0Y2wvdGl4OC4xL3BrZ0luZGV4LnRjbCBzaG91bGQgaGF2ZQorICAgICAgICAjICAgICAgICAgICAgICAgJ2xvYWQgbGlidGl4OC4xLjguMy5zbyBUaXgnCisgICAgICAgIHNlbGYudGsuZXZhbCgncGFja2FnZSByZXF1aXJlIFRpeCcpCisKKyAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgIyBGb3Igc2FmZXR5LCByZW1vdmUgYW4gZGVsZXRlX3dpbmRvdyBiaW5kaW5nIGJlZm9yZSBkZXN0cm95CisgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCAiIikKKyAgICAgICAgVGtpbnRlci5Uay5kZXN0cm95KHNlbGYpCisKKyMgVGhlIFRpeCAndGl4Rm9ybScgZ2VvbWV0cnkgbWFuYWdlcgorY2xhc3MgRm9ybToKKyAgICAiIiJUaGUgVGl4IEZvcm0gZ2VvbWV0cnkgbWFuYWdlcgorCisgICAgV2lkZ2V0cyBjYW4gYmUgYXJyYW5nZWQgYnkgc3BlY2lmeWluZyBhdHRhY2htZW50cyB0byBvdGhlciB3aWRnZXRzLgorICAgIFNlZSBUaXggZG9jdW1lbnRhdGlvbiBmb3IgY29tcGxldGUgZGV0YWlscyIiIgorCisgICAgZGVmIGNvbmZpZyhzZWxmLCBjbmY9e30sICoqa3cpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RpeEZvcm0nLCBzZWxmLl93LCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGZvcm0gPSBjb25maWcKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgRm9ybS5mb3JtKHNlbGYsIHtrZXk6IHZhbHVlfSkKKworICAgIGRlZiBjaGVjayhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgndGl4Rm9ybScsICdjaGVjaycsIHNlbGYuX3cpCisKKyAgICBkZWYgZm9yZ2V0KHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RpeEZvcm0nLCAnZm9yZ2V0Jywgc2VsZi5fdykKKworICAgIGRlZiBncmlkKHNlbGYsIHhzaXplPTAsIHlzaXplPTApOgorICAgICAgICBpZiAobm90IHhzaXplKSBhbmQgKG5vdCB5c2l6ZSk6CisgICAgICAgICAgICB4ID0gc2VsZi50ay5jYWxsKCd0aXhGb3JtJywgJ2dyaWQnLCBzZWxmLl93KQorICAgICAgICAgICAgeSA9IHNlbGYudGsuc3BsaXRsaXN0KHgpCisgICAgICAgICAgICB6ID0gKCkKKyAgICAgICAgICAgIGZvciB4IGluIHk6CisgICAgICAgICAgICAgICAgeiA9IHogKyAoc2VsZi50ay5nZXRpbnQoeCksKQorICAgICAgICAgICAgcmV0dXJuIHoKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgndGl4Rm9ybScsICdncmlkJywgc2VsZi5fdywgeHNpemUsIHlzaXplKQorCisgICAgZGVmIGluZm8oc2VsZiwgb3B0aW9uPU5vbmUpOgorICAgICAgICBpZiBub3Qgb3B0aW9uOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgndGl4Rm9ybScsICdpbmZvJywgc2VsZi5fdykKKyAgICAgICAgaWYgb3B0aW9uWzBdICE9ICctJzoKKyAgICAgICAgICAgIG9wdGlvbiA9ICctJyArIG9wdGlvbgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd0aXhGb3JtJywgJ2luZm8nLCBzZWxmLl93LCBvcHRpb24pCisKKyAgICBkZWYgc2xhdmVzKHNlbGYpOgorICAgICAgICByZXR1cm4gbWFwKHNlbGYuX25hbWV0b3dpZGdldCwKKyAgICAgICAgICAgICAgICAgICBzZWxmLnRrLnNwbGl0bGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICAgICAgICAgICAndGl4Rm9ybScsICdzbGF2ZXMnLCBzZWxmLl93KSkpCisKKworCitUa2ludGVyLldpZGdldC5fX2Jhc2VzX18gPSBUa2ludGVyLldpZGdldC5fX2Jhc2VzX18gKyAoRm9ybSwpCisKK2NsYXNzIFRpeFdpZGdldChUa2ludGVyLldpZGdldCk6CisgICAgIiIiQSBUaXhXaWRnZXQgY2xhc3MgaXMgdXNlZCB0byBwYWNrYWdlIGFsbCAob3IgbW9zdCkgVGl4IHdpZGdldHMuCisKKyAgICBXaWRnZXQgaW5pdGlhbGl6YXRpb24gaXMgZXh0ZW5kZWQgaW4gdHdvIHdheXM6CisgICAgICAgMSkgSXQgaXMgcG9zc2libGUgdG8gZ2l2ZSBhIGxpc3Qgb2Ygb3B0aW9ucyB3aGljaCBtdXN0IGJlIHBhcnQgb2YKKyAgICAgICB0aGUgY3JlYXRpb24gY29tbWFuZCAoc28gY2FsbGVkIFRpeCAnc3RhdGljJyBvcHRpb25zKS4gVGhlc2UgY2Fubm90IGJlCisgICAgICAgZ2l2ZW4gYXMgYSAnY29uZmlnJyBjb21tYW5kIGxhdGVyLgorICAgICAgIDIpIEl0IGlzIHBvc3NpYmxlIHRvIGdpdmUgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgVEsgd2lkZ2V0LiBUaGVzZSBhcmUKKyAgICAgICBjaGlsZCB3aWRnZXRzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBhIFRpeCBtZWdhLXdpZGdldC4gVGhlIFRrIGNhbGwKKyAgICAgICB0byBjcmVhdGUgdGhlc2Ugd2lkZ2V0cyBpcyB0aGVyZWZvcmUgYnlwYXNzZWQgaW4gVGl4V2lkZ2V0Ll9faW5pdF9fCisKKyAgICBCb3RoIG9wdGlvbnMgYXJlIGZvciB1c2UgYnkgc3ViY2xhc3NlcyBvbmx5LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgbWFzdGVyPU5vbmUsIHdpZGdldE5hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfb3B0aW9ucz1Ob25lLCBjbmY9e30sIGt3PXt9KToKKyAgICAgICAgIyBNZXJnZSBrZXl3b3JkcyBhbmQgZGljdGlvbmFyeSBhcmd1bWVudHMKKyAgICAgICAgaWYga3c6CisgICAgICAgICAgICBjbmYgPSBfY25mbWVyZ2UoKGNuZiwga3cpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY25mID0gX2NuZm1lcmdlKGNuZikKKworICAgICAgICAjIE1vdmUgc3RhdGljIG9wdGlvbnMgaW50byBleHRyYS4gc3RhdGljX29wdGlvbnMgbXVzdCBiZQorICAgICAgICAjIGEgbGlzdCBvZiBrZXl3b3JkcyAob3IgTm9uZSkuCisgICAgICAgIGV4dHJhPSgpCisKKyAgICAgICAgIyAnb3B0aW9ucycgaXMgYWx3YXlzIGEgc3RhdGljIG9wdGlvbgorICAgICAgICBpZiBzdGF0aWNfb3B0aW9uczoKKyAgICAgICAgICAgIHN0YXRpY19vcHRpb25zLmFwcGVuZCgnb3B0aW9ucycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGF0aWNfb3B0aW9ucyA9IFsnb3B0aW9ucyddCisKKyAgICAgICAgZm9yIGssdiBpbiBjbmYuaXRlbXMoKVs6XToKKyAgICAgICAgICAgIGlmIGsgaW4gc3RhdGljX29wdGlvbnM6CisgICAgICAgICAgICAgICAgZXh0cmEgPSBleHRyYSArICgnLScgKyBrLCB2KQorICAgICAgICAgICAgICAgIGRlbCBjbmZba10KKworICAgICAgICBzZWxmLndpZGdldE5hbWUgPSB3aWRnZXROYW1lCisgICAgICAgIFdpZGdldC5fc2V0dXAoc2VsZiwgbWFzdGVyLCBjbmYpCisKKyAgICAgICAgIyBJZiB3aWRnZXROYW1lIGlzIE5vbmUsIHRoaXMgaXMgYSBkdW1teSBjcmVhdGlvbiBjYWxsIHdoZXJlIHRoZQorICAgICAgICAjIGNvcnJlc3BvbmRpbmcgVGsgd2lkZ2V0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBieSBUaXgKKyAgICAgICAgaWYgd2lkZ2V0TmFtZToKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCh3aWRnZXROYW1lLCBzZWxmLl93LCAqZXh0cmEpCisKKyAgICAgICAgIyBOb24tc3RhdGljIG9wdGlvbnMgLSB0byBiZSBkb25lIHZpYSBhICdjb25maWcnIGNvbW1hbmQKKyAgICAgICAgaWYgY25mOgorICAgICAgICAgICAgV2lkZ2V0LmNvbmZpZyhzZWxmLCBjbmYpCisKKyAgICAgICAgIyBEaWN0aW9uYXJ5IHRvIGhvbGQgc3Vid2lkZ2V0IG5hbWVzIGZvciBlYXNpZXIgYWNjZXNzLiBXZSBjYW4ndAorICAgICAgICAjIHVzZSB0aGUgY2hpbGRyZW4gbGlzdCBiZWNhdXNlIHRoZSBwdWJsaWMgVGl4IG5hbWVzIG1heSBub3QgYmUgdGhlCisgICAgICAgICMgc2FtZSBhcyB0aGUgcGF0aG5hbWUgY29tcG9uZW50CisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3QgPSB7fQorCisgICAgIyBXZSBzZXQgdXAgYW4gYXR0cmlidXRlIGFjY2VzcyBmdW5jdGlvbiBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvCisgICAgIyBkbyB3Lm9rWyd0ZXh0J10gPSAnSGVsbG8nIHJhdGhlciB0aGFuIHcuc3Vid2lkZ2V0KCdvaycpWyd0ZXh0J10gPSAnSGVsbG8nCisgICAgIyB3aGVuIHcgaXMgYSBTdGRCdXR0b25Cb3guCisgICAgIyBXZSBjYW4gZXZlbiBkbyB3Lm9rLmludm9rZSgpIGJlY2F1c2Ugdy5vayBpcyBzdWJjbGFzc2VkIGZyb20gdGhlCisgICAgIyBCdXR0b24gY2xhc3MgaWYgeW91IGdvIHRocm91Z2ggdGhlIHByb3BlciBjb25zdHJ1Y3RvcnMKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5zdWJ3aWRnZXRfbGlzdDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnN1YndpZGdldF9saXN0W25hbWVdCisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBuYW1lCisKKyAgICBkZWYgc2V0X3NpbGVudChzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIlNldCBhIHZhcmlhYmxlIHdpdGhvdXQgY2FsbGluZyBpdHMgYWN0aW9uIHJvdXRpbmUiIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0aXhTZXRTaWxlbnQnLCBzZWxmLl93LCB2YWx1ZSkKKworICAgIGRlZiBzdWJ3aWRnZXQoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgbmFtZWQgc3Vid2lkZ2V0ICh3aGljaCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGJ5CisgICAgICAgIHRoZSBzdWItY2xhc3MpLiIiIgorICAgICAgICBuID0gc2VsZi5fc3Vid2lkZ2V0X25hbWUobmFtZSkKKyAgICAgICAgaWYgbm90IG46CisgICAgICAgICAgICByYWlzZSBUY2xFcnJvciwgIlN1YndpZGdldCAiICsgbmFtZSArICIgbm90IGNoaWxkIG9mICIgKyBzZWxmLl9uYW1lCisgICAgICAgICMgUmVtb3ZlIGhlYWRlciBvZiBuYW1lIGFuZCBsZWFkaW5nIGRvdAorICAgICAgICBuID0gbltsZW4oc2VsZi5fdykrMTpdCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1ldG93aWRnZXQobikKKworICAgIGRlZiBzdWJ3aWRnZXRzX2FsbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFsbCBzdWJ3aWRnZXRzLiIiIgorICAgICAgICBuYW1lcyA9IHNlbGYuX3N1YndpZGdldF9uYW1lcygpCisgICAgICAgIGlmIG5vdCBuYW1lczoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICByZXRsaXN0ID0gW10KKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBuYW1lID0gbmFtZVtsZW4oc2VsZi5fdykrMTpdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0bGlzdC5hcHBlbmQoc2VsZi5fbmFtZXRvd2lkZ2V0KG5hbWUpKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICMgc29tZSBvZiB0aGUgd2lkZ2V0cyBhcmUgdW5rbm93biBlLmcuIGJvcmRlciBpbiBMYWJlbEZyYW1lCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gcmV0bGlzdAorCisgICAgZGVmIF9zdWJ3aWRnZXRfbmFtZShzZWxmLG5hbWUpOgorICAgICAgICAiIiJHZXQgYSBzdWJ3aWRnZXQgbmFtZSAocmV0dXJucyBhIFN0cmluZywgbm90IGEgV2lkZ2V0ICEpIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3N1YndpZGdldCcsIG5hbWUpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX3N1YndpZGdldF9uYW1lcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lIG9mIGFsbCBzdWJ3aWRnZXRzLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB4ID0gc2VsZi50ay5jYWxsKHNlbGYuX3csICdzdWJ3aWRnZXRzJywgJy1hbGwnKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXQoeCkKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBjb25maWdfYWxsKHNlbGYsIG9wdGlvbiwgdmFsdWUpOgorICAgICAgICAiIiJTZXQgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhbGwgc3Vid2lkZ2V0cyAoYW5kIHNlbGYpLiIiIgorICAgICAgICBpZiBvcHRpb24gPT0gJyc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvcHRpb24sIFN0cmluZ1R5cGUpOgorICAgICAgICAgICAgb3B0aW9uID0gcmVwcihvcHRpb24pCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBTdHJpbmdUeXBlKToKKyAgICAgICAgICAgIHZhbHVlID0gcmVwcih2YWx1ZSkKKyAgICAgICAgbmFtZXMgPSBzZWxmLl9zdWJ3aWRnZXRfbmFtZXMoKQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChuYW1lLCAnY29uZmlndXJlJywgJy0nICsgb3B0aW9uLCB2YWx1ZSkKKyAgICAjIFRoZXNlIGFyZSBtaXNzaW5nIGZyb20gVGtpbnRlcgorICAgIGRlZiBpbWFnZV9jcmVhdGUoc2VsZiwgaW1ndHlwZSwgY25mPXt9LCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgIGlmIG5vdCBtYXN0ZXI6CisgICAgICAgICAgICBtYXN0ZXIgPSBUa2ludGVyLl9kZWZhdWx0X3Jvb3QKKyAgICAgICAgICAgIGlmIG5vdCBtYXN0ZXI6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAnVG9vIGVhcmx5IHRvIGNyZWF0ZSBpbWFnZScKKyAgICAgICAgaWYga3cgYW5kIGNuZjogY25mID0gX2NuZm1lcmdlKChjbmYsIGt3KSkKKyAgICAgICAgZWxpZiBrdzogY25mID0ga3cKKyAgICAgICAgb3B0aW9ucyA9ICgpCisgICAgICAgIGZvciBrLCB2IGluIGNuZi5pdGVtcygpOgorICAgICAgICAgICAgaWYgaGFzYXR0cih2LCAnX19jYWxsX18nKToKKyAgICAgICAgICAgICAgICB2ID0gc2VsZi5fcmVnaXN0ZXIodikKKyAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zICsgKCctJytrLCB2KQorICAgICAgICByZXR1cm4gbWFzdGVyLnRrLmNhbGwoKCdpbWFnZScsICdjcmVhdGUnLCBpbWd0eXBlLCkgKyBvcHRpb25zKQorICAgIGRlZiBpbWFnZV9kZWxldGUoc2VsZiwgaW1nbmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnaW1hZ2UnLCAnZGVsZXRlJywgaW1nbmFtZSkKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgIyBNYXkgaGFwcGVuIGlmIHRoZSByb290IHdhcyBkZXN0cm95ZWQKKyAgICAgICAgICAgIHBhc3MKKworIyBTdWJ3aWRnZXRzIGFyZSBjaGlsZCB3aWRnZXRzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBtZWdhLXdpZGdldHMuCisjIEluIHB5dGhvbiwgd2UgaGF2ZSB0byBjcmVhdGUgdGhlc2Ugc3Vid2lkZ2V0cyBtYW51YWxseSB0byBtaXJyb3IgdGhlaXIKKyMgZXhpc3RlbmNlIGluIFRrL1RpeC4KK2NsYXNzIFRpeFN1YldpZGdldChUaXhXaWRnZXQpOgorICAgICIiIlN1YndpZGdldCBjbGFzcy4KKworICAgIFRoaXMgaXMgdXNlZCB0byBtaXJyb3IgY2hpbGQgd2lkZ2V0cyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQKKyAgICBieSBUaXgvVGsgYXMgcGFydCBvZiBhIG1lZ2Etd2lkZ2V0IGluIFB5dGhvbiAod2hpY2ggaXMgbm90IGluZm9ybWVkCisgICAgb2YgdGhpcykiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsCisgICAgICAgICAgICAgICBkZXN0cm95X3BoeXNpY2FsbHk9MSwgY2hlY2tfaW50ZXJtZWRpYXRlPTEpOgorICAgICAgICBpZiBjaGVja19pbnRlcm1lZGlhdGU6CisgICAgICAgICAgICBwYXRoID0gbWFzdGVyLl9zdWJ3aWRnZXRfbmFtZShuYW1lKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoW2xlbihtYXN0ZXIuX3cpKzE6XQorICAgICAgICAgICAgICAgIHBsaXN0ID0gcGF0aC5zcGxpdCgnLicpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGxpc3QgPSBbXQorCisgICAgICAgIGlmIG5vdCBjaGVja19pbnRlcm1lZGlhdGU6CisgICAgICAgICAgICAjIGltbWVkaWF0ZSBkZXNjZW5kYW50CisgICAgICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBOb25lLCBOb25lLCB7J25hbWUnIDogbmFtZX0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBpbnRlcm1lZGlhdGUgd2lkZ2V0cyBleGlzdAorICAgICAgICAgICAgcGFyZW50ID0gbWFzdGVyCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4ocGxpc3QpIC0gMSk6CisgICAgICAgICAgICAgICAgbiA9ICcuJy5qb2luKHBsaXN0WzppKzFdKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdyA9IG1hc3Rlci5fbmFtZXRvd2lkZ2V0KG4pCisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHcKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgQ3JlYXRlIHRoZSBpbnRlcm1lZGlhdGUgd2lkZ2V0CisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IFRpeFN1YldpZGdldChwYXJlbnQsIHBsaXN0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveV9waHlzaWNhbGx5PTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19pbnRlcm1lZGlhdGU9MCkKKyAgICAgICAgICAgICMgVGhlIFRrIHdpZGdldCBuYW1lIGlzIGluIHBsaXN0LCBub3QgaW4gbmFtZQorICAgICAgICAgICAgaWYgcGxpc3Q6CisgICAgICAgICAgICAgICAgbmFtZSA9IHBsaXN0Wy0xXQorICAgICAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBhcmVudCwgTm9uZSwgTm9uZSwgeyduYW1lJyA6IG5hbWV9KQorICAgICAgICBzZWxmLmRlc3Ryb3lfcGh5c2ljYWxseSA9IGRlc3Ryb3lfcGh5c2ljYWxseQorCisgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgICMgRm9yIHNvbWUgd2lkZ2V0cyBlLmcuLCBhIE5vdGVCb29rLCB3aGVuIHdlIGNhbGwgZGVzdHJ1Y3RvcnMsCisgICAgICAgICMgd2UgbXVzdCBiZSBjYXJlZnVsIG5vdCB0byBkZXN0cm95IHRoZSBmcmFtZSB3aWRnZXQgc2luY2UgdGhpcworICAgICAgICAjIGFsc28gZGVzdHJveXMgdGhlIHBhcmVudCBOb3RlQm9vayB0aHVzIGxlYWRpbmcgdG8gYW4gZXhjZXB0aW9uCisgICAgICAgICMgaW4gVGtpbnRlciB3aGVuIGl0IGZpbmFsbHkgY2FsbHMgVGNsIHRvIGRlc3Ryb3kgdGhlIE5vdGVCb29rCisgICAgICAgIGZvciBjIGluIHNlbGYuY2hpbGRyZW4udmFsdWVzKCk6IGMuZGVzdHJveSgpCisgICAgICAgIGlmIHNlbGYuX25hbWUgaW4gc2VsZi5tYXN0ZXIuY2hpbGRyZW46CisgICAgICAgICAgICBkZWwgc2VsZi5tYXN0ZXIuY2hpbGRyZW5bc2VsZi5fbmFtZV0KKyAgICAgICAgaWYgc2VsZi5fbmFtZSBpbiBzZWxmLm1hc3Rlci5zdWJ3aWRnZXRfbGlzdDoKKyAgICAgICAgICAgIGRlbCBzZWxmLm1hc3Rlci5zdWJ3aWRnZXRfbGlzdFtzZWxmLl9uYW1lXQorICAgICAgICBpZiBzZWxmLmRlc3Ryb3lfcGh5c2ljYWxseToKKyAgICAgICAgICAgICMgVGhpcyBpcyBieXBhc3NlZCBvbmx5IGZvciBhIGZldyB3aWRnZXRzCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ2Rlc3Ryb3knLCBzZWxmLl93KQorCisKKyMgVXNlZnVsIGZ1bmMuIHRvIHNwbGl0IFRjbCBsaXN0cyBhbmQgcmV0dXJuIGFzIGEgZGljdC4gRnJvbSBUa2ludGVyLnB5CitkZWYgX2xzdDJkaWN0KGxzdCk6CisgICAgZGljdCA9IHt9CisgICAgZm9yIHggaW4gbHN0OgorICAgICAgICBkaWN0W3hbMF1bMTpdXSA9ICh4WzBdWzE6XSwpICsgeFsxOl0KKyAgICByZXR1cm4gZGljdAorCisjIFVzZWZ1bCBjbGFzcyB0byBjcmVhdGUgYSBkaXNwbGF5IHN0eWxlIC0gbGF0ZXIgc2hhcmVkIGJ5IG1hbnkgaXRlbXMuCisjIENvbnRyaWJ1dGVkIGJ5IFN0ZWZmZW4gS3JlbXNlcgorY2xhc3MgRGlzcGxheVN0eWxlOgorICAgICIiIkRpc3BsYXlTdHlsZSAtIGhhbmRsZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgc2hhcmVkIGJ5CisgICAgKG11bHRpcGxlKSBEaXNwbGF5IEl0ZW1zIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaXRlbXR5cGUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIG1hc3RlciA9IF9kZWZhdWx0X3Jvb3QgICAgICAgICAgICAgICMgZ2xvYmFsIGZyb20gVGtpbnRlcgorICAgICAgICBpZiBub3QgbWFzdGVyIGFuZCAncmVmd2luZG93JyBpbiBjbmY6IG1hc3Rlcj1jbmZbJ3JlZndpbmRvdyddCisgICAgICAgIGVsaWYgbm90IG1hc3RlciBhbmQgJ3JlZndpbmRvdycgaW4ga3c6ICBtYXN0ZXI9IGt3WydyZWZ3aW5kb3cnXQorICAgICAgICBlbGlmIG5vdCBtYXN0ZXI6IHJhaXNlIFJ1bnRpbWVFcnJvciwgIlRvbyBlYXJseSB0byBjcmVhdGUgZGlzcGxheSBzdHlsZTogbm8gcm9vdCB3aW5kb3ciCisgICAgICAgIHNlbGYudGsgPSBtYXN0ZXIudGsKKyAgICAgICAgc2VsZi5zdHlsZW5hbWUgPSBzZWxmLnRrLmNhbGwoJ3RpeERpc3BsYXlTdHlsZScsIGl0ZW10eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZWxmLl9vcHRpb25zKGNuZixrdykgKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN0eWxlbmFtZQorCisgICAgZGVmIF9vcHRpb25zKHNlbGYsIGNuZiwga3cpOgorICAgICAgICBpZiBrdyBhbmQgY25mOgorICAgICAgICAgICAgY25mID0gX2NuZm1lcmdlKChjbmYsIGt3KSkKKyAgICAgICAgZWxpZiBrdzoKKyAgICAgICAgICAgIGNuZiA9IGt3CisgICAgICAgIG9wdHMgPSAoKQorICAgICAgICBmb3IgaywgdiBpbiBjbmYuaXRlbXMoKToKKyAgICAgICAgICAgIG9wdHMgPSBvcHRzICsgKCctJytrLCB2KQorICAgICAgICByZXR1cm4gb3B0cworCisgICAgZGVmIGRlbGV0ZShzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuc3R5bGVuYW1lLCAnZGVsZXRlJykKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLGtleSx2YWx1ZSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLnN0eWxlbmFtZSwgJ2NvbmZpZ3VyZScsICctJXMnJWtleSwgdmFsdWUpCisKKyAgICBkZWYgY29uZmlnKHNlbGYsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHJldHVybiBfbHN0MmRpY3QoCisgICAgICAgICAgICBzZWxmLnRrLnNwbGl0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICAgICAgc2VsZi5zdHlsZW5hbWUsICdjb25maWd1cmUnLCAqc2VsZi5fb3B0aW9ucyhjbmYsa3cpKSkpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZixrZXkpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuc3R5bGVuYW1lLCAnY2dldCcsICctJXMnJWtleSkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBUaGUgVGl4IFdpZGdldCBjbGFzc2VzIC0gaW4gYWxwaGFiZXRpY2FsIG9yZGVyICMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIEJhbGxvb24oVGl4V2lkZ2V0KToKKyAgICAiIiJCYWxsb29uIGhlbHAgd2lkZ2V0LgorCisgICAgU3Vid2lkZ2V0ICAgICAgIENsYXNzCisgICAgLS0tLS0tLS0tICAgICAgIC0tLS0tCisgICAgbGFiZWwgICAgICAgICAgIExhYmVsCisgICAgbWVzc2FnZSAgICAgICAgIE1lc3NhZ2UiIiIKKworICAgICMgRklYTUU6IEl0IHNob3VsZCBpbmhlcml0IC1zdXBlcmNsYXNzIHRpeFNoZWxsCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAjIHN0YXRpYyBzZWVtIHRvIGJlIC1pbnN0YWxsY29sb3JtYXAgLWluaXR3YWl0IC1zdGF0dXNiYXIgLWN1cnNvcgorICAgICAgICBzdGF0aWMgPSBbJ29wdGlvbnMnLCAnaW5zdGFsbGNvbG9ybWFwJywgJ2luaXR3YWl0JywgJ3N0YXR1c2JhcicsCisgICAgICAgICAgICAgICAgICAnY3Vyc29yJ10KKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeEJhbGxvb24nLCBzdGF0aWMsIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2xhYmVsJ10gPSBfZHVtbXlMYWJlbChzZWxmLCAnbGFiZWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveV9waHlzaWNhbGx5PTApCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ21lc3NhZ2UnXSA9IF9kdW1teUxhYmVsKHNlbGYsICdtZXNzYWdlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveV9waHlzaWNhbGx5PTApCisKKyAgICBkZWYgYmluZF93aWRnZXQoc2VsZiwgd2lkZ2V0LCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJCaW5kIGJhbGxvb24gd2lkZ2V0IHRvIGFub3RoZXIuCisgICAgICAgIE9uZSBiYWxsb29uIHdpZGdldCBtYXkgYmUgYm91bmQgdG8gc2V2ZXJhbCB3aWRnZXRzIGF0IHRoZSBzYW1lIHRpbWUiIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdiaW5kJywgd2lkZ2V0Ll93LCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiB1bmJpbmRfd2lkZ2V0KHNlbGYsIHdpZGdldCk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAndW5iaW5kJywgd2lkZ2V0Ll93KQorCitjbGFzcyBCdXR0b25Cb3goVGl4V2lkZ2V0KToKKyAgICAiIiJCdXR0b25Cb3ggLSBBIGNvbnRhaW5lciBmb3IgcHVzaGJ1dHRvbnMuCisgICAgU3Vid2lkZ2V0cyBhcmUgdGhlIGJ1dHRvbnMgYWRkZWQgd2l0aCB0aGUgYWRkIG1ldGhvZC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhCdXR0b25Cb3gnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWydvcmllbnRhdGlvbicsICdvcHRpb25zJ10sIGNuZiwga3cpCisKKyAgICBkZWYgYWRkKHNlbGYsIG5hbWUsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkFkZCBhIGJ1dHRvbiB3aXRoIGdpdmVuIG5hbWUgdG8gYm94LiIiIgorCisgICAgICAgIGJ0biA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAnYWRkJywgbmFtZSwgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbbmFtZV0gPSBfZHVtbXlCdXR0b24oc2VsZiwgbmFtZSkKKyAgICAgICAgcmV0dXJuIGJ0bgorCisgICAgZGVmIGludm9rZShzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLnN1YndpZGdldF9saXN0OgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnZva2UnLCBuYW1lKQorCitjbGFzcyBDb21ib0JveChUaXhXaWRnZXQpOgorICAgICIiIkNvbWJvQm94IC0gYW4gRW50cnkgZmllbGQgd2l0aCBhIGRyb3Bkb3duIG1lbnUuIFRoZSB1c2VyIGNhbiBzZWxlY3QgYQorICAgIGNob2ljZSBieSBlaXRoZXIgdHlwaW5nIGluIHRoZSBlbnRyeSBzdWJ3aWRnZXQgb3Igc2VsZWN0aW5nIGZyb20gdGhlCisgICAgbGlzdGJveCBzdWJ3aWRnZXQuCisKKyAgICBTdWJ3aWRnZXQgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0KKyAgICBlbnRyeSAgICAgICBFbnRyeQorICAgIGFycm93ICAgICAgIEJ1dHRvbgorICAgIHNsaXN0Ym94ICAgIFNjcm9sbGVkTGlzdEJveAorICAgIHRpY2sgICAgICAgIEJ1dHRvbgorICAgIGNyb3NzICAgICAgIEJ1dHRvbiA6IHByZXNlbnQgaWYgY3JlYXRlZCB3aXRoIHRoZSBmYW5jeSBvcHRpb24iIiIKKworICAgICMgRklYTUU6IEl0IHNob3VsZCBpbmhlcml0IC1zdXBlcmNsYXNzIHRpeExhYmVsV2lkZ2V0CisgICAgZGVmIF9faW5pdF9fIChzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeENvbWJvQm94JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZWRpdGFibGUnLCAnZHJvcGRvd24nLCAnZmFuY3knLCAnb3B0aW9ucyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbGFiZWwnXSA9IF9kdW1teUxhYmVsKHNlbGYsICdsYWJlbCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2VudHJ5J10gPSBfZHVtbXlFbnRyeShzZWxmLCAnZW50cnknKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydhcnJvdyddID0gX2R1bW15QnV0dG9uKHNlbGYsICdhcnJvdycpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3NsaXN0Ym94J10gPSBfZHVtbXlTY3JvbGxlZExpc3RCb3goc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2xpc3Rib3gnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wyd0aWNrJ10gPSBfZHVtbXlCdXR0b24oc2VsZiwgJ3RpY2snKQorICAgICAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnY3Jvc3MnXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnY3Jvc3MnKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgIyB1bmF2YWlsYWJsZSB3aGVuIC1mYW5jeSBub3Qgc3BlY2lmaWVkCisgICAgICAgICAgICBwYXNzCisKKyAgICAjIGFsaWduCisKKyAgICBkZWYgYWRkX2hpc3Rvcnkoc2VsZiwgc3RyKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdhZGRoaXN0b3J5Jywgc3RyKQorCisgICAgZGVmIGFwcGVuZF9oaXN0b3J5KHNlbGYsIHN0cik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYXBwZW5kaGlzdG9yeScsIHN0cikKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIHN0cik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5zZXJ0JywgaW5kZXgsIHN0cikKKworICAgIGRlZiBwaWNrKHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdwaWNrJywgaW5kZXgpCisKK2NsYXNzIENvbnRyb2woVGl4V2lkZ2V0KToKKyAgICAiIiJDb250cm9sIC0gQW4gZW50cnkgZmllbGQgd2l0aCB2YWx1ZSBjaGFuZ2UgYXJyb3dzLiAgVGhlIHVzZXIgY2FuCisgICAgYWRqdXN0IHRoZSB2YWx1ZSBieSBwcmVzc2luZyB0aGUgdHdvIGFycm93IGJ1dHRvbnMgb3IgYnkgZW50ZXJpbmcKKyAgICB0aGUgdmFsdWUgZGlyZWN0bHkgaW50byB0aGUgZW50cnkuIFRoZSBuZXcgdmFsdWUgd2lsbCBiZSBjaGVja2VkCisgICAgYWdhaW5zdCB0aGUgdXNlci1kZWZpbmVkIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMuCisKKyAgICBTdWJ3aWRnZXQgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0KKyAgICBpbmNyICAgICAgIEJ1dHRvbgorICAgIGRlY3IgICAgICAgQnV0dG9uCisgICAgZW50cnkgICAgICAgRW50cnkKKyAgICBsYWJlbCAgICAgICBMYWJlbCIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4TGFiZWxXaWRnZXQKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4Q29udHJvbCcsIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydpbmNyJ10gPSBfZHVtbXlCdXR0b24oc2VsZiwgJ2luY3InKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydkZWNyJ10gPSBfZHVtbXlCdXR0b24oc2VsZiwgJ2RlY3InKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydsYWJlbCddID0gX2R1bW15TGFiZWwoc2VsZiwgJ2xhYmVsJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZW50cnknXSA9IF9kdW1teUVudHJ5KHNlbGYsICdlbnRyeScpCisKKyAgICBkZWYgZGVjcmVtZW50KHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlY3InKQorCisgICAgZGVmIGluY3JlbWVudChzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmNyJykKKworICAgIGRlZiBpbnZva2Uoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW52b2tlJykKKworICAgIGRlZiB1cGRhdGUoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAndXBkYXRlJykKKworY2xhc3MgRGlyTGlzdChUaXhXaWRnZXQpOgorICAgICIiIkRpckxpc3QgLSBkaXNwbGF5cyBhIGxpc3QgdmlldyBvZiBhIGRpcmVjdG9yeSwgaXRzIHByZXZpb3VzCisgICAgZGlyZWN0b3JpZXMgYW5kIGl0cyBzdWItZGlyZWN0b3JpZXMuIFRoZSB1c2VyIGNhbiBjaG9vc2Ugb25lIG9mCisgICAgdGhlIGRpcmVjdG9yaWVzIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBvciBjaGFuZ2UgdG8gYW5vdGhlciBkaXJlY3RvcnkuCisKKyAgICBTdWJ3aWRnZXQgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0KKyAgICBobGlzdCAgICAgICBITGlzdAorICAgIGhzYiAgICAgICAgICAgICAgU2Nyb2xsYmFyCisgICAgdnNiICAgICAgICAgICAgICBTY3JvbGxiYXIiIiIKKworICAgICMgRklYTUU6IEl0IHNob3VsZCBpbmhlcml0IC1zdXBlcmNsYXNzIHRpeFNjcm9sbGVkSExpc3QKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4RGlyTGlzdCcsIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydobGlzdCddID0gX2R1bW15SExpc3Qoc2VsZiwgJ2hsaXN0JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsndnNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ3ZzYicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICdoc2InKQorCisgICAgZGVmIGNoZGlyKHNlbGYsIGRpcik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnY2hkaXInLCBkaXIpCisKK2NsYXNzIERpclRyZWUoVGl4V2lkZ2V0KToKKyAgICAiIiJEaXJUcmVlIC0gRGlyZWN0b3J5IExpc3RpbmcgaW4gYSBoaWVyYXJjaGljYWwgdmlldy4KKyAgICBEaXNwbGF5cyBhIHRyZWUgdmlldyBvZiBhIGRpcmVjdG9yeSwgaXRzIHByZXZpb3VzIGRpcmVjdG9yaWVzIGFuZCBpdHMKKyAgICBzdWItZGlyZWN0b3JpZXMuIFRoZSB1c2VyIGNhbiBjaG9vc2Ugb25lIG9mIHRoZSBkaXJlY3RvcmllcyBkaXNwbGF5ZWQKKyAgICBpbiB0aGUgbGlzdCBvciBjaGFuZ2UgdG8gYW5vdGhlciBkaXJlY3RvcnkuCisKKyAgICBTdWJ3aWRnZXQgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0KKyAgICBobGlzdCAgICAgICAgICAgSExpc3QKKyAgICBoc2IgICAgICAgICAgICAgU2Nyb2xsYmFyCisgICAgdnNiICAgICAgICAgICAgIFNjcm9sbGJhciIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4U2Nyb2xsZWRITGlzdAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhEaXJUcmVlJywgWydvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hsaXN0J10gPSBfZHVtbXlITGlzdChzZWxmLCAnaGxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wyd2c2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAndnNiJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaHNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ2hzYicpCisKKyAgICBkZWYgY2hkaXIoc2VsZiwgZGlyKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdjaGRpcicsIGRpcikKKworY2xhc3MgRGlyU2VsZWN0Qm94KFRpeFdpZGdldCk6CisgICAgIiIiRGlyU2VsZWN0Qm94IC0gTW90aWYgc3R5bGUgZmlsZSBzZWxlY3QgYm94LgorICAgIEl0IGlzIGdlbmVyYWxseSB1c2VkIGZvcgorICAgIHRoZSB1c2VyIHRvIGNob29zZSBhIGZpbGUuIEZpbGVTZWxlY3RCb3ggc3RvcmVzIHRoZSBmaWxlcyBtb3N0bHkKKyAgICByZWNlbnRseSBzZWxlY3RlZCBpbnRvIGEgQ29tYm9Cb3ggd2lkZ2V0IHNvIHRoYXQgdGhleSBjYW4gYmUgcXVpY2tseQorICAgIHNlbGVjdGVkIGFnYWluLgorCisgICAgU3Vid2lkZ2V0ICAgICAgIENsYXNzCisgICAgLS0tLS0tLS0tICAgICAgIC0tLS0tCisgICAgc2VsZWN0aW9uICAgICAgIENvbWJvQm94CisgICAgZmlsdGVyICAgICAgICAgIENvbWJvQm94CisgICAgZGlybGlzdCAgICAgICAgIFNjcm9sbGVkTGlzdEJveAorICAgIGZpbGVsaXN0ICAgICAgICBTY3JvbGxlZExpc3RCb3giIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhEaXJTZWxlY3RCb3gnLCBbJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZGlybGlzdCddID0gX2R1bW15RGlyTGlzdChzZWxmLCAnZGlybGlzdCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2RpcmNieCddID0gX2R1bW15RmlsZUNvbWJvQm94KHNlbGYsICdkaXJjYngnKQorCitjbGFzcyBFeEZpbGVTZWxlY3RCb3goVGl4V2lkZ2V0KToKKyAgICAiIiJFeEZpbGVTZWxlY3RCb3ggLSBNUyBXaW5kb3dzIHN0eWxlIGZpbGUgc2VsZWN0IGJveC4KKyAgICBJdCBwcm92aWRlcyBhbiBjb252ZW5pZW50IG1ldGhvZCBmb3IgdGhlIHVzZXIgdG8gc2VsZWN0IGZpbGVzLgorCisgICAgU3Vid2lkZ2V0ICAgICAgIENsYXNzCisgICAgLS0tLS0tLS0tICAgICAgIC0tLS0tCisgICAgY2FuY2VsICAgICAgIEJ1dHRvbgorICAgIG9rICAgICAgICAgICAgICBCdXR0b24KKyAgICBoaWRkZW4gICAgICAgQ2hlY2tidXR0b24KKyAgICB0eXBlcyAgICAgICBDb21ib0JveAorICAgIGRpciAgICAgICAgICAgICAgQ29tYm9Cb3gKKyAgICBmaWxlICAgICAgIENvbWJvQm94CisgICAgZGlybGlzdCAgICAgICBTY3JvbGxlZExpc3RCb3gKKyAgICBmaWxlbGlzdCAgICAgICBTY3JvbGxlZExpc3RCb3giIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhFeEZpbGVTZWxlY3RCb3gnLCBbJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnY2FuY2VsJ10gPSBfZHVtbXlCdXR0b24oc2VsZiwgJ2NhbmNlbCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ29rJ10gPSBfZHVtbXlCdXR0b24oc2VsZiwgJ29rJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaGlkZGVuJ10gPSBfZHVtbXlDaGVja2J1dHRvbihzZWxmLCAnaGlkZGVuJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsndHlwZXMnXSA9IF9kdW1teUNvbWJvQm94KHNlbGYsICd0eXBlcycpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2RpciddID0gX2R1bW15Q29tYm9Cb3goc2VsZiwgJ2RpcicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2Rpcmxpc3QnXSA9IF9kdW1teURpckxpc3Qoc2VsZiwgJ2Rpcmxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydmaWxlJ10gPSBfZHVtbXlDb21ib0JveChzZWxmLCAnZmlsZScpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2ZpbGVsaXN0J10gPSBfZHVtbXlTY3JvbGxlZExpc3RCb3goc2VsZiwgJ2ZpbGVsaXN0JykKKworICAgIGRlZiBmaWx0ZXIoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZmlsdGVyJykKKworICAgIGRlZiBpbnZva2Uoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW52b2tlJykKKworCisjIFNob3VsZCBpbmhlcml0IGZyb20gYSBEaWFsb2cgY2xhc3MKK2NsYXNzIERpclNlbGVjdERpYWxvZyhUaXhXaWRnZXQpOgorICAgICIiIlRoZSBEaXJTZWxlY3REaWFsb2cgd2lkZ2V0IHByZXNlbnRzIHRoZSBkaXJlY3RvcmllcyBpbiB0aGUgZmlsZQorICAgIHN5c3RlbSBpbiBhIGRpYWxvZyB3aW5kb3cuIFRoZSB1c2VyIGNhbiB1c2UgdGhpcyBkaWFsb2cgd2luZG93IHRvCisgICAgbmF2aWdhdGUgdGhyb3VnaCB0aGUgZmlsZSBzeXN0ZW0gdG8gc2VsZWN0IHRoZSBkZXNpcmVkIGRpcmVjdG9yeS4KKworICAgIFN1YndpZGdldHMgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0tICAgICAgIC0tLS0tCisgICAgZGlyYm94ICAgICAgIERpclNlbGVjdERpYWxvZyIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4RGlhbG9nU2hlbGwKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4RGlyU2VsZWN0RGlhbG9nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydkaXJib3gnXSA9IF9kdW1teURpclNlbGVjdEJveChzZWxmLCAnZGlyYm94JykKKyAgICAgICAgIyBjYW5jZWwgYW5kIG9rIGJ1dHRvbnMgYXJlIG1pc3NpbmcKKworICAgIGRlZiBwb3B1cChzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdwb3B1cCcpCisKKyAgICBkZWYgcG9wZG93bihzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdwb3Bkb3duJykKKworCisjIFNob3VsZCBpbmhlcml0IGZyb20gYSBEaWFsb2cgY2xhc3MKK2NsYXNzIEV4RmlsZVNlbGVjdERpYWxvZyhUaXhXaWRnZXQpOgorICAgICIiIkV4RmlsZVNlbGVjdERpYWxvZyAtIE1TIFdpbmRvd3Mgc3R5bGUgZmlsZSBzZWxlY3QgZGlhbG9nLgorICAgIEl0IHByb3ZpZGVzIGFuIGNvbnZlbmllbnQgbWV0aG9kIGZvciB0aGUgdXNlciB0byBzZWxlY3QgZmlsZXMuCisKKyAgICBTdWJ3aWRnZXRzICAgICAgIENsYXNzCisgICAgLS0tLS0tLS0tLSAgICAgICAtLS0tLQorICAgIGZzYm94ICAgICAgIEV4RmlsZVNlbGVjdEJveCIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4RGlhbG9nU2hlbGwKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4RXhGaWxlU2VsZWN0RGlhbG9nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydmc2JveCddID0gX2R1bW15RXhGaWxlU2VsZWN0Qm94KHNlbGYsICdmc2JveCcpCisKKyAgICBkZWYgcG9wdXAoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAncG9wdXAnKQorCisgICAgZGVmIHBvcGRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAncG9wZG93bicpCisKK2NsYXNzIEZpbGVTZWxlY3RCb3goVGl4V2lkZ2V0KToKKyAgICAiIiJFeEZpbGVTZWxlY3RCb3ggLSBNb3RpZiBzdHlsZSBmaWxlIHNlbGVjdCBib3guCisgICAgSXQgaXMgZ2VuZXJhbGx5IHVzZWQgZm9yCisgICAgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZmlsZS4gRmlsZVNlbGVjdEJveCBzdG9yZXMgdGhlIGZpbGVzIG1vc3RseQorICAgIHJlY2VudGx5IHNlbGVjdGVkIGludG8gYSBDb21ib0JveCB3aWRnZXQgc28gdGhhdCB0aGV5IGNhbiBiZSBxdWlja2x5CisgICAgc2VsZWN0ZWQgYWdhaW4uCisKKyAgICBTdWJ3aWRnZXQgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0KKyAgICBzZWxlY3Rpb24gICAgICAgQ29tYm9Cb3gKKyAgICBmaWx0ZXIgICAgICAgICAgQ29tYm9Cb3gKKyAgICBkaXJsaXN0ICAgICAgICAgU2Nyb2xsZWRMaXN0Qm94CisgICAgZmlsZWxpc3QgICAgICAgIFNjcm9sbGVkTGlzdEJveCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeEZpbGVTZWxlY3RCb3gnLCBbJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZGlybGlzdCddID0gX2R1bW15U2Nyb2xsZWRMaXN0Qm94KHNlbGYsICdkaXJsaXN0JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZmlsZWxpc3QnXSA9IF9kdW1teVNjcm9sbGVkTGlzdEJveChzZWxmLCAnZmlsZWxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydmaWx0ZXInXSA9IF9kdW1teUNvbWJvQm94KHNlbGYsICdmaWx0ZXInKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydzZWxlY3Rpb24nXSA9IF9kdW1teUNvbWJvQm94KHNlbGYsICdzZWxlY3Rpb24nKQorCisgICAgZGVmIGFwcGx5X2ZpbHRlcihzZWxmKTogICAgICAgICAgICAgICMgbmFtZSBvZiBzdWJ3aWRnZXQgaXMgc2FtZSBhcyBjb21tYW5kCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZmlsdGVyJykKKworICAgIGRlZiBpbnZva2Uoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW52b2tlJykKKworIyBTaG91bGQgaW5oZXJpdCBmcm9tIGEgRGlhbG9nIGNsYXNzCitjbGFzcyBGaWxlU2VsZWN0RGlhbG9nKFRpeFdpZGdldCk6CisgICAgIiIiRmlsZVNlbGVjdERpYWxvZyAtIE1vdGlmIHN0eWxlIGZpbGUgc2VsZWN0IGRpYWxvZy4KKworICAgIFN1YndpZGdldHMgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0tICAgICAgIC0tLS0tCisgICAgYnRucyAgICAgICBTdGRCdXR0b25Cb3gKKyAgICBmc2JveCAgICAgICBGaWxlU2VsZWN0Qm94IiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhTdGREaWFsb2dTaGVsbAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhGaWxlU2VsZWN0RGlhbG9nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydidG5zJ10gPSBfZHVtbXlTdGRCdXR0b25Cb3goc2VsZiwgJ2J0bnMnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydmc2JveCddID0gX2R1bW15RmlsZVNlbGVjdEJveChzZWxmLCAnZnNib3gnKQorCisgICAgZGVmIHBvcHVwKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BvcHVwJykKKworICAgIGRlZiBwb3Bkb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BvcGRvd24nKQorCitjbGFzcyBGaWxlRW50cnkoVGl4V2lkZ2V0KToKKyAgICAiIiJGaWxlRW50cnkgLSBFbnRyeSBmaWVsZCB3aXRoIGJ1dHRvbiB0aGF0IGludm9rZXMgYSBGaWxlU2VsZWN0RGlhbG9nLgorICAgIFRoZSB1c2VyIGNhbiB0eXBlIGluIHRoZSBmaWxlbmFtZSBtYW51YWxseS4gQWx0ZXJuYXRpdmVseSwgdGhlIHVzZXIgY2FuCisgICAgcHJlc3MgdGhlIGJ1dHRvbiB3aWRnZXQgdGhhdCBzaXRzIG5leHQgdG8gdGhlIGVudHJ5LCB3aGljaCB3aWxsIGJyaW5nCisgICAgdXAgYSBmaWxlIHNlbGVjdGlvbiBkaWFsb2cuCisKKyAgICBTdWJ3aWRnZXRzICAgICAgIENsYXNzCisgICAgLS0tLS0tLS0tLSAgICAgICAtLS0tLQorICAgIGJ1dHRvbiAgICAgICBCdXR0b24KKyAgICBlbnRyeSAgICAgICBFbnRyeSIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4TGFiZWxXaWRnZXQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4RmlsZUVudHJ5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZGlhbG9ndHlwZScsICdvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2J1dHRvbiddID0gX2R1bW15QnV0dG9uKHNlbGYsICdidXR0b24nKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydlbnRyeSddID0gX2R1bW15RW50cnkoc2VsZiwgJ2VudHJ5JykKKworICAgIGRlZiBpbnZva2Uoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW52b2tlJykKKworICAgIGRlZiBmaWxlX2RpYWxvZyhzZWxmKToKKyAgICAgICAgIyBGSVhNRTogcmV0dXJuIHB5dGhvbiBvYmplY3QKKyAgICAgICAgcGFzcworCitjbGFzcyBITGlzdChUaXhXaWRnZXQsIFhWaWV3LCBZVmlldyk6CisgICAgIiIiSExpc3QgLSBIaWVyYXJjaHkgZGlzcGxheSAgd2lkZ2V0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYW55IGRhdGEKKyAgICB0aGF0IGhhdmUgYSBoaWVyYXJjaGljYWwgc3RydWN0dXJlLCBmb3IgZXhhbXBsZSwgZmlsZSBzeXN0ZW0gZGlyZWN0b3J5CisgICAgdHJlZXMuIFRoZSBsaXN0IGVudHJpZXMgYXJlIGluZGVudGVkIGFuZCBjb25uZWN0ZWQgYnkgYnJhbmNoIGxpbmVzCisgICAgYWNjb3JkaW5nIHRvIHRoZWlyIHBsYWNlcyBpbiB0aGUgaGllcmFyY2h5LgorCisgICAgU3Vid2lkZ2V0cyAtIE5vbmUiIiIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZixtYXN0ZXI9Tm9uZSxjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4SExpc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWydjb2x1bW5zJywgJ29wdGlvbnMnXSwgY25mLCBrdykKKworICAgIGRlZiBhZGQoc2VsZiwgZW50cnksIGNuZj17fSwgKiprdyk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FkZCcsIGVudHJ5LCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBhZGRfY2hpbGQoc2VsZiwgcGFyZW50PU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIGlmIG5vdCBwYXJlbnQ6CisgICAgICAgICAgICBwYXJlbnQgPSAnJworICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdywgJ2FkZGNoaWxkJywgcGFyZW50LCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBhbmNob3Jfc2V0KHNlbGYsIGVudHJ5KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdhbmNob3InLCAnc2V0JywgZW50cnkpCisKKyAgICBkZWYgYW5jaG9yX2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FuY2hvcicsICdjbGVhcicpCisKKyAgICBkZWYgY29sdW1uX3dpZHRoKHNlbGYsIGNvbD0wLCB3aWR0aD1Ob25lLCBjaGFycz1Ob25lKToKKyAgICAgICAgaWYgbm90IGNoYXJzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnY29sdW1uJywgJ3dpZHRoJywgY29sLCB3aWR0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2NvbHVtbicsICd3aWR0aCcsIGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1jaGFyJywgY2hhcnMpCisKKyAgICBkZWYgZGVsZXRlX2FsbChzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWxldGUnLCAnYWxsJykKKworICAgIGRlZiBkZWxldGVfZW50cnkoc2VsZiwgZW50cnkpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlbGV0ZScsICdlbnRyeScsIGVudHJ5KQorCisgICAgZGVmIGRlbGV0ZV9vZmZzcHJpbmdzKHNlbGYsIGVudHJ5KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWxldGUnLCAnb2Zmc3ByaW5ncycsIGVudHJ5KQorCisgICAgZGVmIGRlbGV0ZV9zaWJsaW5ncyhzZWxmLCBlbnRyeSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZGVsZXRlJywgJ3NpYmxpbmdzJywgZW50cnkpCisKKyAgICBkZWYgZHJhZ3NpdGVfc2V0KHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkcmFnc2l0ZScsICdzZXQnLCBpbmRleCkKKworICAgIGRlZiBkcmFnc2l0ZV9jbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkcmFnc2l0ZScsICdjbGVhcicpCisKKyAgICBkZWYgZHJvcHNpdGVfc2V0KHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkcm9wc2l0ZScsICdzZXQnLCBpbmRleCkKKworICAgIGRlZiBkcm9wc2l0ZV9jbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkcm9wc2l0ZScsICdjbGVhcicpCisKKyAgICBkZWYgaGVhZGVyX2NyZWF0ZShzZWxmLCBjb2wsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaGVhZGVyJywgJ2NyZWF0ZScsIGNvbCwgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCisKKyAgICBkZWYgaGVhZGVyX2NvbmZpZ3VyZShzZWxmLCBjb2wsIGNuZj17fSwgKiprdyk6CisgICAgICAgIGlmIGNuZiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIF9sc3QyZGljdCgKKyAgICAgICAgICAgICAgICBzZWxmLnRrLnNwbGl0KAorICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaGVhZGVyJywgJ2NvbmZpZ3VyZScsIGNvbCkpKQorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2hlYWRlcicsICdjb25maWd1cmUnLCBjb2wsCisgICAgICAgICAgICAgICAgICAgICAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBoZWFkZXJfY2dldChzZWxmLCAgY29sLCBvcHQpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdoZWFkZXInLCAnY2dldCcsIGNvbCwgb3B0KQorCisgICAgZGVmIGhlYWRlcl9leGlzdHMoc2VsZiwgIGNvbCk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2hlYWRlcicsICdleGlzdHMnLCBjb2wpCisKKyAgICBkZWYgaGVhZGVyX2RlbGV0ZShzZWxmLCBjb2wpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2hlYWRlcicsICdkZWxldGUnLCBjb2wpCisKKyAgICBkZWYgaGVhZGVyX3NpemUoc2VsZiwgY29sKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaGVhZGVyJywgJ3NpemUnLCBjb2wpCisKKyAgICBkZWYgaGlkZV9lbnRyeShzZWxmLCBlbnRyeSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaGlkZScsICdlbnRyeScsIGVudHJ5KQorCisgICAgZGVmIGluZGljYXRvcl9jcmVhdGUoc2VsZiwgZW50cnksIGNuZj17fSwgKiprdyk6CisgICAgICAgIHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICAgc2VsZi5fdywgJ2luZGljYXRvcicsICdjcmVhdGUnLCBlbnRyeSwgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCisKKyAgICBkZWYgaW5kaWNhdG9yX2NvbmZpZ3VyZShzZWxmLCBlbnRyeSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgaWYgY25mIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gX2xzdDJkaWN0KAorICAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXQoCisgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmRpY2F0b3InLCAnY29uZmlndXJlJywgZW50cnkpKSkKKyAgICAgICAgc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICBzZWxmLl93LCAnaW5kaWNhdG9yJywgJ2NvbmZpZ3VyZScsIGVudHJ5LCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBpbmRpY2F0b3JfY2dldChzZWxmLCAgZW50cnksIG9wdCk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZGljYXRvcicsICdjZ2V0JywgZW50cnksIG9wdCkKKworICAgIGRlZiBpbmRpY2F0b3JfZXhpc3RzKHNlbGYsICBlbnRyeSk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwgKHNlbGYuX3csICdpbmRpY2F0b3InLCAnZXhpc3RzJywgZW50cnkpCisKKyAgICBkZWYgaW5kaWNhdG9yX2RlbGV0ZShzZWxmLCBlbnRyeSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5kaWNhdG9yJywgJ2RlbGV0ZScsIGVudHJ5KQorCisgICAgZGVmIGluZGljYXRvcl9zaXplKHNlbGYsIGVudHJ5KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5kaWNhdG9yJywgJ3NpemUnLCBlbnRyeSkKKworICAgIGRlZiBpbmZvX2FuY2hvcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5mbycsICdhbmNob3InKQorCisgICAgZGVmIGluZm9fYmJveChzZWxmLCBlbnRyeSk6CisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKAorICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5mbycsICdiYm94JywgZW50cnkpKSBvciBOb25lCisKKyAgICBkZWYgaW5mb19jaGlsZHJlbihzZWxmLCBlbnRyeT1Ob25lKToKKyAgICAgICAgYyA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5mbycsICdjaGlsZHJlbicsIGVudHJ5KQorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3QoYykKKworICAgIGRlZiBpbmZvX2RhdGEoc2VsZiwgZW50cnkpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ2RhdGEnLCBlbnRyeSkKKworICAgIGRlZiBpbmZvX2RyYWdzaXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ2RyYWdzaXRlJykKKworICAgIGRlZiBpbmZvX2Ryb3BzaXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ2Ryb3BzaXRlJykKKworICAgIGRlZiBpbmZvX2V4aXN0cyhzZWxmLCBlbnRyeSk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAnZXhpc3RzJywgZW50cnkpCisKKyAgICBkZWYgaW5mb19oaWRkZW4oc2VsZiwgZW50cnkpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ2hpZGRlbicsIGVudHJ5KQorCisgICAgZGVmIGluZm9fbmV4dChzZWxmLCBlbnRyeSk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAnbmV4dCcsIGVudHJ5KQorCisgICAgZGVmIGluZm9fcGFyZW50KHNlbGYsIGVudHJ5KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5mbycsICdwYXJlbnQnLCBlbnRyeSkKKworICAgIGRlZiBpbmZvX3ByZXYoc2VsZiwgZW50cnkpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ3ByZXYnLCBlbnRyeSkKKworICAgIGRlZiBpbmZvX3NlbGVjdGlvbihzZWxmKToKKyAgICAgICAgYyA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5mbycsICdzZWxlY3Rpb24nKQorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3QoYykKKworICAgIGRlZiBpdGVtX2NnZXQoc2VsZiwgZW50cnksIGNvbCwgb3B0KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaXRlbScsICdjZ2V0JywgZW50cnksIGNvbCwgb3B0KQorCisgICAgZGVmIGl0ZW1fY29uZmlndXJlKHNlbGYsIGVudHJ5LCBjb2wsIGNuZj17fSwgKiprdyk6CisgICAgICAgIGlmIGNuZiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIF9sc3QyZGljdCgKKyAgICAgICAgICAgICAgICBzZWxmLnRrLnNwbGl0KAorICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaXRlbScsICdjb25maWd1cmUnLCBlbnRyeSwgY29sKSkpCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaXRlbScsICdjb25maWd1cmUnLCBlbnRyeSwgY29sLAorICAgICAgICAgICAgICAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBpdGVtX2NyZWF0ZShzZWxmLCBlbnRyeSwgY29sLCBjbmY9e30sICoqa3cpOgorICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgIHNlbGYuX3csICdpdGVtJywgJ2NyZWF0ZScsIGVudHJ5LCBjb2wsICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorCisgICAgZGVmIGl0ZW1fZXhpc3RzKHNlbGYsIGVudHJ5LCBjb2wpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpdGVtJywgJ2V4aXN0cycsIGVudHJ5LCBjb2wpCisKKyAgICBkZWYgaXRlbV9kZWxldGUoc2VsZiwgZW50cnksIGNvbCk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaXRlbScsICdkZWxldGUnLCBlbnRyeSwgY29sKQorCisgICAgZGVmIGVudHJ5Y2dldChzZWxmLCBlbnRyeSwgb3B0KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZW50cnljZ2V0JywgZW50cnksIG9wdCkKKworICAgIGRlZiBlbnRyeWNvbmZpZ3VyZShzZWxmLCBlbnRyeSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgaWYgY25mIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gX2xzdDJkaWN0KAorICAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXQoCisgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdlbnRyeWNvbmZpZ3VyZScsIGVudHJ5KSkpCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZW50cnljb25maWd1cmUnLCBlbnRyeSwKKyAgICAgICAgICAgICAgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCisKKyAgICBkZWYgbmVhcmVzdChzZWxmLCB5KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnbmVhcmVzdCcsIHkpCisKKyAgICBkZWYgc2VlKHNlbGYsIGVudHJ5KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWUnLCBlbnRyeSkKKworICAgIGRlZiBzZWxlY3Rpb25fY2xlYXIoc2VsZiwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3Rpb24nLCAnY2xlYXInLCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBzZWxlY3Rpb25faW5jbHVkZXMoc2VsZiwgZW50cnkpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3Rpb24nLCAnaW5jbHVkZXMnLCBlbnRyeSkKKworICAgIGRlZiBzZWxlY3Rpb25fc2V0KHNlbGYsIGZpcnN0LCBsYXN0PU5vbmUpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdGlvbicsICdzZXQnLCBmaXJzdCwgbGFzdCkKKworICAgIGRlZiBzaG93X2VudHJ5KHNlbGYsIGVudHJ5KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2hvdycsICdlbnRyeScsIGVudHJ5KQorCitjbGFzcyBJbnB1dE9ubHkoVGl4V2lkZ2V0KToKKyAgICAiIiJJbnB1dE9ubHkgLSBJbnZpc2libGUgd2lkZ2V0LiBVbml4IG9ubHkuCisKKyAgICBTdWJ3aWRnZXRzIC0gTm9uZSIiIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLG1hc3Rlcj1Ob25lLGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhJbnB1dE9ubHknLCBOb25lLCBjbmYsIGt3KQorCitjbGFzcyBMYWJlbEVudHJ5KFRpeFdpZGdldCk6CisgICAgIiIiTGFiZWxFbnRyeSAtIEVudHJ5IGZpZWxkIHdpdGggbGFiZWwuIFBhY2thZ2VzIGFuIGVudHJ5IHdpZGdldAorICAgIGFuZCBhIGxhYmVsIGludG8gb25lIG1lZ2Egd2lkZ2V0LiBJdCBjYW4gYmV1c2VkIGJlIHVzZWQgdG8gc2ltcGxpZnkKKyAgICB0aGUgY3JlYXRpb24gb2YgYGBlbnRyeS1mb3JtJycgdHlwZSBvZiBpbnRlcmZhY2UuCisKKyAgICBTdWJ3aWRnZXRzICAgICAgIENsYXNzCisgICAgLS0tLS0tLS0tLSAgICAgICAtLS0tLQorICAgIGxhYmVsICAgICAgIExhYmVsCisgICAgZW50cnkgICAgICAgRW50cnkiIiIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZixtYXN0ZXI9Tm9uZSxjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4TGFiZWxFbnRyeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2xhYmVsc2lkZScsJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbGFiZWwnXSA9IF9kdW1teUxhYmVsKHNlbGYsICdsYWJlbCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2VudHJ5J10gPSBfZHVtbXlFbnRyeShzZWxmLCAnZW50cnknKQorCitjbGFzcyBMYWJlbEZyYW1lKFRpeFdpZGdldCk6CisgICAgIiIiTGFiZWxGcmFtZSAtIExhYmVsbGVkIEZyYW1lIGNvbnRhaW5lci4gUGFja2FnZXMgYSBmcmFtZSB3aWRnZXQKKyAgICBhbmQgYSBsYWJlbCBpbnRvIG9uZSBtZWdhIHdpZGdldC4gVG8gY3JlYXRlIHdpZGdldHMgaW5zaWRlIGEKKyAgICBMYWJlbEZyYW1lIHdpZGdldCwgb25lIGNyZWF0ZXMgdGhlIG5ldyB3aWRnZXRzIHJlbGF0aXZlIHRvIHRoZQorICAgIGZyYW1lIHN1YndpZGdldCBhbmQgbWFuYWdlIHRoZW0gaW5zaWRlIHRoZSBmcmFtZSBzdWJ3aWRnZXQuCisKKyAgICBTdWJ3aWRnZXRzICAgICAgIENsYXNzCisgICAgLS0tLS0tLS0tLSAgICAgICAtLS0tLQorICAgIGxhYmVsICAgICAgIExhYmVsCisgICAgZnJhbWUgICAgICAgRnJhbWUiIiIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZixtYXN0ZXI9Tm9uZSxjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4TGFiZWxGcmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2xhYmVsc2lkZScsJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbGFiZWwnXSA9IF9kdW1teUxhYmVsKHNlbGYsICdsYWJlbCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2ZyYW1lJ10gPSBfZHVtbXlGcmFtZShzZWxmLCAnZnJhbWUnKQorCisKK2NsYXNzIExpc3ROb3RlQm9vayhUaXhXaWRnZXQpOgorICAgICIiIkEgTGlzdE5vdGVCb29rIHdpZGdldCBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIFRpeE5vdGVCb29rIHdpZGdldDoKKyAgICBpdCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IG1hbnkgd2luZG93cyBpbiBhIGxpbWl0ZWQgc3BhY2UgdXNpbmcgYQorICAgIG5vdGVib29rIG1ldGFwaG9yLiBUaGUgbm90ZWJvb2sgaXMgZGl2aWRlZCBpbnRvIGEgc3RhY2sgb2YgcGFnZXMKKyAgICAod2luZG93cykuIEF0IG9uZSB0aW1lIG9ubHkgb25lIG9mIHRoZXNlIHBhZ2VzIGNhbiBiZSBzaG93bi4KKyAgICBUaGUgdXNlciBjYW4gbmF2aWdhdGUgdGhyb3VnaCB0aGVzZSBwYWdlcyBieQorICAgIGNob29zaW5nIHRoZSBuYW1lIG9mIHRoZSBkZXNpcmVkIHBhZ2UgaW4gdGhlIGhsaXN0IHN1YndpZGdldC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhMaXN0Tm90ZUJvb2snLCBbJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgIyBJcyB0aGlzIG5lY2Vzc2FyeT8gSXQncyBub3QgYW4gZXhwb3NlZCBzdWJ3aWRnZXQgaW4gVGl4LgorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydwYW5lJ10gPSBfZHVtbXlQYW5lZFdpbmRvdyhzZWxmLCAncGFuZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lfcGh5c2ljYWxseT0wKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydobGlzdCddID0gX2R1bW15SExpc3Qoc2VsZiwgJ2hsaXN0JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnc2hsaXN0J10gPSBfZHVtbXlTY3JvbGxlZEhMaXN0KHNlbGYsICdzaGxpc3QnKQorCisgICAgZGVmIGFkZChzZWxmLCBuYW1lLCBjbmY9e30sICoqa3cpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FkZCcsIG5hbWUsICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0W25hbWVdID0gVGl4U3ViV2lkZ2V0KHNlbGYsIG5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLnN1YndpZGdldF9saXN0W25hbWVdCisKKyAgICBkZWYgcGFnZShzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3Vid2lkZ2V0KG5hbWUpCisKKyAgICBkZWYgcGFnZXMoc2VsZik6CisgICAgICAgICMgQ2FuJ3QgY2FsbCBzdWJ3aWRnZXRzX2FsbCBkaXJlY3RseSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgLm5iZnJhbWUKKyAgICAgICAgbmFtZXMgPSBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFnZXMnKSkKKyAgICAgICAgcmV0ID0gW10KKyAgICAgICAgZm9yIHggaW4gbmFtZXM6CisgICAgICAgICAgICByZXQuYXBwZW5kKHNlbGYuc3Vid2lkZ2V0KHgpKQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgcmFpc2VfcGFnZShzZWxmLCBuYW1lKTogICAgICAgICAgICAgICMgcmFpc2UgaXMgYSBweXRob24ga2V5d29yZAorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3JhaXNlJywgbmFtZSkKKworY2xhc3MgTWV0ZXIoVGl4V2lkZ2V0KToKKyAgICAiIiJUaGUgTWV0ZXIgd2lkZ2V0IGNhbiBiZSB1c2VkIHRvIHNob3cgdGhlIHByb2dyZXNzIG9mIGEgYmFja2dyb3VuZAorICAgIGpvYiB3aGljaCBtYXkgdGFrZSBhIGxvbmcgdGltZSB0byBleGVjdXRlLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4TWV0ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWydvcHRpb25zJ10sIGNuZiwga3cpCisKK2NsYXNzIE5vdGVCb29rKFRpeFdpZGdldCk6CisgICAgIiIiTm90ZUJvb2sgLSBNdWx0aS1wYWdlIGNvbnRhaW5lciB3aWRnZXQgKHRhYmJlZCBub3RlYm9vayBtZXRhcGhvcikuCisKKyAgICBTdWJ3aWRnZXRzICAgICAgIENsYXNzCisgICAgLS0tLS0tLS0tLSAgICAgICAtLS0tLQorICAgIG5iZnJhbWUgICAgICAgTm90ZUJvb2tGcmFtZQorICAgIDxwYWdlcz4gICAgICAgcGFnZSB3aWRnZXRzIGFkZGVkIGR5bmFtaWNhbGx5IHdpdGggdGhlIGFkZCBtZXRob2QiIiIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZixtYXN0ZXI9Tm9uZSxjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZixtYXN0ZXIsJ3RpeE5vdGVCb29rJywgWydvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ25iZnJhbWUnXSA9IFRpeFN1YldpZGdldChzZWxmLCAnbmJmcmFtZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95X3BoeXNpY2FsbHk9MCkKKworICAgIGRlZiBhZGQoc2VsZiwgbmFtZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdhZGQnLCBuYW1lLCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFtuYW1lXSA9IFRpeFN1YldpZGdldChzZWxmLCBuYW1lKQorICAgICAgICByZXR1cm4gc2VsZi5zdWJ3aWRnZXRfbGlzdFtuYW1lXQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWxldGUnLCBuYW1lKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0W25hbWVdLmRlc3Ryb3koKQorICAgICAgICBkZWwgc2VsZi5zdWJ3aWRnZXRfbGlzdFtuYW1lXQorCisgICAgZGVmIHBhZ2Uoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLnN1YndpZGdldChuYW1lKQorCisgICAgZGVmIHBhZ2VzKHNlbGYpOgorICAgICAgICAjIENhbid0IGNhbGwgc3Vid2lkZ2V0c19hbGwgZGlyZWN0bHkgYmVjYXVzZSB3ZSBkb24ndCB3YW50IC5uYmZyYW1lCisgICAgICAgIG5hbWVzID0gc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BhZ2VzJykpCisgICAgICAgIHJldCA9IFtdCisgICAgICAgIGZvciB4IGluIG5hbWVzOgorICAgICAgICAgICAgcmV0LmFwcGVuZChzZWxmLnN1YndpZGdldCh4KSkKKyAgICAgICAgcmV0dXJuIHJldAorCisgICAgZGVmIHJhaXNlX3BhZ2Uoc2VsZiwgbmFtZSk6ICAgICAgICAgICAgICAjIHJhaXNlIGlzIGEgcHl0aG9uIGtleXdvcmQKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdyYWlzZScsIG5hbWUpCisKKyAgICBkZWYgcmFpc2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdyYWlzZWQnKQorCitjbGFzcyBOb3RlQm9va0ZyYW1lKFRpeFdpZGdldCk6CisgICAgIyBGSVhNRTogVGhpcyBpcyBkYW5nZXJvdXMgdG8gZXhwb3NlIHRvIGJlIGNhbGxlZCBvbiBpdHMgb3duLgorICAgIHBhc3MKKworY2xhc3MgT3B0aW9uTWVudShUaXhXaWRnZXQpOgorICAgICIiIk9wdGlvbk1lbnUgLSBjcmVhdGVzIGEgbWVudSBidXR0b24gb2Ygb3B0aW9ucy4KKworICAgIFN1YndpZGdldCAgICAgICBDbGFzcworICAgIC0tLS0tLS0tLSAgICAgICAtLS0tLQorICAgIG1lbnVidXR0b24gICAgICBNZW51YnV0dG9uCisgICAgbWVudSAgICAgICAgICAgIE1lbnUiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhPcHRpb25NZW51JywKKyAgICAgICAgICAgICAgICBbJ2xhYmVsc2lkZScsICdvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ21lbnVidXR0b24nXSA9IF9kdW1teU1lbnVidXR0b24oc2VsZiwgJ21lbnVidXR0b24nKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydtZW51J10gPSBfZHVtbXlNZW51KHNlbGYsICdtZW51JykKKworICAgIGRlZiBhZGRfY29tbWFuZChzZWxmLCBuYW1lLCBjbmY9e30sICoqa3cpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FkZCcsICdjb21tYW5kJywgbmFtZSwgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCisKKyAgICBkZWYgYWRkX3NlcGFyYXRvcihzZWxmLCBuYW1lLCBjbmY9e30sICoqa3cpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FkZCcsICdzZXBhcmF0b3InLCBuYW1lLCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZGVsZXRlJywgbmFtZSkKKworICAgIGRlZiBkaXNhYmxlKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2Rpc2FibGUnLCBuYW1lKQorCisgICAgZGVmIGVuYWJsZShzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdlbmFibGUnLCBuYW1lKQorCitjbGFzcyBQYW5lZFdpbmRvdyhUaXhXaWRnZXQpOgorICAgICIiIlBhbmVkV2luZG93IC0gTXVsdGktcGFuZSBjb250YWluZXIgd2lkZ2V0CisgICAgYWxsb3dzIHRoZSB1c2VyIHRvIGludGVyYWN0aXZlbHkgbWFuaXB1bGF0ZSB0aGUgc2l6ZXMgb2Ygc2V2ZXJhbAorICAgIHBhbmVzLiBUaGUgcGFuZXMgY2FuIGJlIGFycmFuZ2VkIGVpdGhlciB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseS5UaGUKKyAgICB1c2VyIGNoYW5nZXMgdGhlIHNpemVzIG9mIHRoZSBwYW5lcyBieSBkcmFnZ2luZyB0aGUgcmVzaXplIGhhbmRsZQorICAgIGJldHdlZW4gdHdvIHBhbmVzLgorCisgICAgU3Vid2lkZ2V0cyAgICAgICBDbGFzcworICAgIC0tLS0tLS0tLS0gICAgICAgLS0tLS0KKyAgICA8cGFuZXM+ICAgICAgIGcvcCB3aWRnZXRzIGFkZGVkIGR5bmFtaWNhbGx5IHdpdGggdGhlIGFkZCBtZXRob2QuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4UGFuZWRXaW5kb3cnLCBbJ29yaWVudGF0aW9uJywgJ29wdGlvbnMnXSwgY25mLCBrdykKKworICAgICMgYWRkIGRlbGV0ZSBmb3JnZXQgcGFuZWNnZXQgcGFuZWNvbmZpZ3VyZSBwYW5lcyBzZXRzaXplCisgICAgZGVmIGFkZChzZWxmLCBuYW1lLCBjbmY9e30sICoqa3cpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FkZCcsIG5hbWUsICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0W25hbWVdID0gVGl4U3ViV2lkZ2V0KHNlbGYsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfaW50ZXJtZWRpYXRlPTApCisgICAgICAgIHJldHVybiBzZWxmLnN1YndpZGdldF9saXN0W25hbWVdCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlbGV0ZScsIG5hbWUpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbbmFtZV0uZGVzdHJveSgpCisgICAgICAgIGRlbCBzZWxmLnN1YndpZGdldF9saXN0W25hbWVdCisKKyAgICBkZWYgZm9yZ2V0KHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ZvcmdldCcsIG5hbWUpCisKKyAgICBkZWYgcGFuZWNnZXQoc2VsZiwgIGVudHJ5LCBvcHQpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYW5lY2dldCcsIGVudHJ5LCBvcHQpCisKKyAgICBkZWYgcGFuZWNvbmZpZ3VyZShzZWxmLCBlbnRyeSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgaWYgY25mIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gX2xzdDJkaWN0KAorICAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXQoCisgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYW5lY29uZmlndXJlJywgZW50cnkpKSkKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYW5lY29uZmlndXJlJywgZW50cnksICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorCisgICAgZGVmIHBhbmVzKHNlbGYpOgorICAgICAgICBuYW1lcyA9IHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFuZXMnKSkKKyAgICAgICAgcmV0dXJuIFtzZWxmLnN1YndpZGdldCh4KSBmb3IgeCBpbiBuYW1lc10KKworY2xhc3MgUG9wdXBNZW51KFRpeFdpZGdldCk6CisgICAgIiIiUG9wdXBNZW51IHdpZGdldCBjYW4gYmUgdXNlZCBhcyBhIHJlcGxhY2VtZW50IG9mIHRoZSB0a19wb3B1cCBjb21tYW5kLgorICAgIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIFRpeCBQb3B1cE1lbnUgd2lkZ2V0IGlzIGl0IHJlcXVpcmVzIGxlc3MgYXBwbGljYXRpb24KKyAgICBjb2RlIHRvIG1hbmlwdWxhdGUuCisKKworICAgIFN1YndpZGdldHMgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0tICAgICAgIC0tLS0tCisgICAgbWVudWJ1dHRvbiAgICAgICBNZW51YnV0dG9uCisgICAgbWVudSAgICAgICBNZW51IiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhTaGVsbAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhQb3B1cE1lbnUnLCBbJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbWVudWJ1dHRvbiddID0gX2R1bW15TWVudWJ1dHRvbihzZWxmLCAnbWVudWJ1dHRvbicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ21lbnUnXSA9IF9kdW1teU1lbnUoc2VsZiwgJ21lbnUnKQorCisgICAgZGVmIGJpbmRfd2lkZ2V0KHNlbGYsIHdpZGdldCk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYmluZCcsIHdpZGdldC5fdykKKworICAgIGRlZiB1bmJpbmRfd2lkZ2V0KHNlbGYsIHdpZGdldCk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAndW5iaW5kJywgd2lkZ2V0Ll93KQorCisgICAgZGVmIHBvc3Rfd2lkZ2V0KHNlbGYsIHdpZGdldCwgeCwgeSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAncG9zdCcsIHdpZGdldC5fdywgeCwgeSkKKworY2xhc3MgUmVzaXplSGFuZGxlKFRpeFdpZGdldCk6CisgICAgIiIiSW50ZXJuYWwgd2lkZ2V0IHRvIGRyYXcgcmVzaXplIGhhbmRsZXMgb24gU2Nyb2xsZWQgd2lkZ2V0cy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBjbmY9e30sICoqa3cpOgorICAgICAgICAjIFRoZXJlIHNlZW1zIHRvIGJlIGEgVGl4IGJ1ZyByZWplY3RpbmcgdGhlIGNvbmZpZ3VyZSBtZXRob2QKKyAgICAgICAgIyBMZXQncyB0cnkgbWFraW5nIHRoZSBmbGFncyAtc3RhdGljCisgICAgICAgIGZsYWdzID0gWydvcHRpb25zJywgJ2NvbW1hbmQnLCAnY3Vyc29yZmcnLCAnY3Vyc29yYmcnLAorICAgICAgICAgICAgICAgICAnaGFuZGxlc2l6ZScsICdoaW50Y29sb3InLCAnaGludHdpZHRoJywKKyAgICAgICAgICAgICAgICAgJ3gnLCAneSddCisgICAgICAgICMgSW4gZmFjdCwgeCB5IGhlaWdodCB3aWR0aCBhcmUgY29uZmlndXJhYmxlCisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhSZXNpemVIYW5kbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGNuZiwga3cpCisKKyAgICBkZWYgYXR0YWNoX3dpZGdldChzZWxmLCB3aWRnZXQpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2F0dGFjaHdpZGdldCcsIHdpZGdldC5fdykKKworICAgIGRlZiBkZXRhY2hfd2lkZ2V0KHNlbGYsIHdpZGdldCk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZGV0YWNod2lkZ2V0Jywgd2lkZ2V0Ll93KQorCisgICAgZGVmIGhpZGUoc2VsZiwgd2lkZ2V0KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdoaWRlJywgd2lkZ2V0Ll93KQorCisgICAgZGVmIHNob3coc2VsZiwgd2lkZ2V0KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzaG93Jywgd2lkZ2V0Ll93KQorCitjbGFzcyBTY3JvbGxlZEhMaXN0KFRpeFdpZGdldCk6CisgICAgIiIiU2Nyb2xsZWRITGlzdCAtIEhMaXN0IHdpdGggYXV0b21hdGljIHNjcm9sbGJhcnMuIiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhTY3JvbGxlZFdpZGdldAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhTY3JvbGxlZEhMaXN0JywgWydvcHRpb25zJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydobGlzdCddID0gX2R1bW15SExpc3Qoc2VsZiwgJ2hsaXN0JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsndnNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ3ZzYicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICdoc2InKQorCitjbGFzcyBTY3JvbGxlZExpc3RCb3goVGl4V2lkZ2V0KToKKyAgICAiIiJTY3JvbGxlZExpc3RCb3ggLSBMaXN0Ym94IHdpdGggYXV0b21hdGljIHNjcm9sbGJhcnMuIiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhTY3JvbGxlZFdpZGdldAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhTY3JvbGxlZExpc3RCb3gnLCBbJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbGlzdGJveCddID0gX2R1bW15TGlzdGJveChzZWxmLCAnbGlzdGJveCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3ZzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICd2c2InKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydoc2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAnaHNiJykKKworY2xhc3MgU2Nyb2xsZWRUZXh0KFRpeFdpZGdldCk6CisgICAgIiIiU2Nyb2xsZWRUZXh0IC0gVGV4dCB3aXRoIGF1dG9tYXRpYyBzY3JvbGxiYXJzLiIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4U2Nyb2xsZWRXaWRnZXQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4U2Nyb2xsZWRUZXh0JywgWydvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3RleHQnXSA9IF9kdW1teVRleHQoc2VsZiwgJ3RleHQnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wyd2c2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAndnNiJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaHNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ2hzYicpCisKK2NsYXNzIFNjcm9sbGVkVExpc3QoVGl4V2lkZ2V0KToKKyAgICAiIiJTY3JvbGxlZFRMaXN0IC0gVExpc3Qgd2l0aCBhdXRvbWF0aWMgc2Nyb2xsYmFycy4iIiIKKworICAgICMgRklYTUU6IEl0IHNob3VsZCBpbmhlcml0IC1zdXBlcmNsYXNzIHRpeFNjcm9sbGVkV2lkZ2V0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeFNjcm9sbGVkVExpc3QnLCBbJ29wdGlvbnMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3RsaXN0J10gPSBfZHVtbXlUTGlzdChzZWxmLCAndGxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wyd2c2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAndnNiJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaHNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ2hzYicpCisKK2NsYXNzIFNjcm9sbGVkV2luZG93KFRpeFdpZGdldCk6CisgICAgIiIiU2Nyb2xsZWRXaW5kb3cgLSBXaW5kb3cgd2l0aCBhdXRvbWF0aWMgc2Nyb2xsYmFycy4iIiIKKworICAgICMgRklYTUU6IEl0IHNob3VsZCBpbmhlcml0IC1zdXBlcmNsYXNzIHRpeFNjcm9sbGVkV2lkZ2V0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeFNjcm9sbGVkV2luZG93JywgWydvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3dpbmRvdyddID0gX2R1bW15RnJhbWUoc2VsZiwgJ3dpbmRvdycpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3ZzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICd2c2InKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydoc2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAnaHNiJykKKworY2xhc3MgU2VsZWN0KFRpeFdpZGdldCk6CisgICAgIiIiU2VsZWN0IC0gQ29udGFpbmVyIG9mIGJ1dHRvbiBzdWJ3aWRnZXRzLiBJdCBjYW4gYmUgdXNlZCB0byBwcm92aWRlCisgICAgcmFkaW8tYm94IG9yIGNoZWNrLWJveCBzdHlsZSBvZiBzZWxlY3Rpb24gb3B0aW9ucyBmb3IgdGhlIHVzZXIuCisKKyAgICBTdWJ3aWRnZXRzIGFyZSBidXR0b25zIGFkZGVkIGR5bmFtaWNhbGx5IHVzaW5nIHRoZSBhZGQgbWV0aG9kLiIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4TGFiZWxXaWRnZXQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4U2VsZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnYWxsb3d6ZXJvJywgJ3JhZGlvJywgJ29yaWVudGF0aW9uJywgJ2xhYmVsc2lkZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wdGlvbnMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2xhYmVsJ10gPSBfZHVtbXlMYWJlbChzZWxmLCAnbGFiZWwnKQorCisgICAgZGVmIGFkZChzZWxmLCBuYW1lLCBjbmY9e30sICoqa3cpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FkZCcsIG5hbWUsICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0W25hbWVdID0gX2R1bW15QnV0dG9uKHNlbGYsIG5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLnN1YndpZGdldF9saXN0W25hbWVdCisKKyAgICBkZWYgaW52b2tlKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ludm9rZScsIG5hbWUpCisKK2NsYXNzIFNoZWxsKFRpeFdpZGdldCk6CisgICAgIiIiVG9wbGV2ZWwgd2luZG93LgorCisgICAgU3Vid2lkZ2V0cyAtIE5vbmUiIiIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZixtYXN0ZXI9Tm9uZSxjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4U2hlbGwnLCBbJ29wdGlvbnMnLCAndGl0bGUnXSwgY25mLCBrdykKKworY2xhc3MgRGlhbG9nU2hlbGwoVGl4V2lkZ2V0KToKKyAgICAiIiJUb3BsZXZlbCB3aW5kb3csIHdpdGggcG9wdXAgcG9wZG93biBhbmQgY2VudGVyIG1ldGhvZHMuCisgICAgSXQgdGVsbHMgdGhlIHdpbmRvdyBtYW5hZ2VyIHRoYXQgaXQgaXMgYSBkaWFsb2cgd2luZG93IGFuZCBzaG91bGQgYmUKKyAgICB0cmVhdGVkIHNwZWNpYWxseS4gVGhlIGV4YWN0IHRyZWF0bWVudCBkZXBlbmRzIG9uIHRoZSB0cmVhdG1lbnQgb2YKKyAgICB0aGUgd2luZG93IG1hbmFnZXIuCisKKyAgICBTdWJ3aWRnZXRzIC0gTm9uZSIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgZnJvbSAgU2hlbGwKKyAgICBkZWYgX19pbml0X18gKHNlbGYsbWFzdGVyPU5vbmUsY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aXhEaWFsb2dTaGVsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ29wdGlvbnMnLCAndGl0bGUnLCAnbWFwcGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWluaGVpZ2h0JywgJ21pbndpZHRoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFyZW50JywgJ3RyYW5zaWVudCddLCBjbmYsIGt3KQorCisgICAgZGVmIHBvcGRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAncG9wZG93bicpCisKKyAgICBkZWYgcG9wdXAoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAncG9wdXAnKQorCisgICAgZGVmIGNlbnRlcihzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdjZW50ZXInKQorCitjbGFzcyBTdGRCdXR0b25Cb3goVGl4V2lkZ2V0KToKKyAgICAiIiJTdGRCdXR0b25Cb3ggLSBTdGFuZGFyZCBCdXR0b24gQm94IChPSywgQXBwbHksIENhbmNlbCBhbmQgSGVscCkgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhTdGRCdXR0b25Cb3gnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWydvcmllbnRhdGlvbicsICdvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ29rJ10gPSBfZHVtbXlCdXR0b24oc2VsZiwgJ29rJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnYXBwbHknXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnYXBwbHknKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydjYW5jZWwnXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnY2FuY2VsJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaGVscCddID0gX2R1bW15QnV0dG9uKHNlbGYsICdoZWxwJykKKworICAgIGRlZiBpbnZva2Uoc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5zdWJ3aWRnZXRfbGlzdDoKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW52b2tlJywgbmFtZSkKKworY2xhc3MgVExpc3QoVGl4V2lkZ2V0LCBYVmlldywgWVZpZXcpOgorICAgICIiIlRMaXN0IC0gSGllcmFyY2h5IGRpc3BsYXkgd2lkZ2V0IHdoaWNoIGNhbiBiZQorICAgIHVzZWQgdG8gZGlzcGxheSBkYXRhIGluIGEgdGFidWxhciBmb3JtYXQuIFRoZSBsaXN0IGVudHJpZXMgb2YgYSBUTGlzdAorICAgIHdpZGdldCBhcmUgc2ltaWxhciB0byB0aGUgZW50cmllcyBpbiB0aGUgVGsgbGlzdGJveCB3aWRnZXQuIFRoZSBtYWluCisgICAgZGlmZmVyZW5jZXMgYXJlICgxKSB0aGUgVExpc3Qgd2lkZ2V0IGNhbiBkaXNwbGF5IHRoZSBsaXN0IGVudHJpZXMgaW4gYQorICAgIHR3byBkaW1lbnNpb25hbCBmb3JtYXQgYW5kICgyKSB5b3UgY2FuIHVzZSBncmFwaGljYWwgaW1hZ2VzIGFzIHdlbGwgYXMKKyAgICBtdWx0aXBsZSBjb2xvcnMgYW5kIGZvbnRzIGZvciB0aGUgbGlzdCBlbnRyaWVzLgorCisgICAgU3Vid2lkZ2V0cyAtIE5vbmUiIiIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZixtYXN0ZXI9Tm9uZSxjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4VExpc3QnLCBbJ29wdGlvbnMnXSwgY25mLCBrdykKKworICAgIGRlZiBhY3RpdmVfc2V0KHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdhY3RpdmUnLCAnc2V0JywgaW5kZXgpCisKKyAgICBkZWYgYWN0aXZlX2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FjdGl2ZScsICdjbGVhcicpCisKKyAgICBkZWYgYW5jaG9yX3NldChzZWxmLCBpbmRleCk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYW5jaG9yJywgJ3NldCcsIGluZGV4KQorCisgICAgZGVmIGFuY2hvcl9jbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdhbmNob3InLCAnY2xlYXInKQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBmcm9tXywgdG89Tm9uZSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZGVsZXRlJywgZnJvbV8sIHRvKQorCisgICAgZGVmIGRyYWdzaXRlX3NldChzZWxmLCBpbmRleCk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZHJhZ3NpdGUnLCAnc2V0JywgaW5kZXgpCisKKyAgICBkZWYgZHJhZ3NpdGVfY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZHJhZ3NpdGUnLCAnY2xlYXInKQorCisgICAgZGVmIGRyb3BzaXRlX3NldChzZWxmLCBpbmRleCk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZHJvcHNpdGUnLCAnc2V0JywgaW5kZXgpCisKKyAgICBkZWYgZHJvcHNpdGVfY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZHJvcHNpdGUnLCAnY2xlYXInKQorCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnNlcnQnLCBpbmRleCwgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCisKKyAgICBkZWYgaW5mb19hY3RpdmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAnYWN0aXZlJykKKworICAgIGRlZiBpbmZvX2FuY2hvcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5mbycsICdhbmNob3InKQorCisgICAgZGVmIGluZm9fZG93bihzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAnZG93bicsIGluZGV4KQorCisgICAgZGVmIGluZm9fbGVmdChzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAnbGVmdCcsIGluZGV4KQorCisgICAgZGVmIGluZm9fcmlnaHQoc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ3JpZ2h0JywgaW5kZXgpCisKKyAgICBkZWYgaW5mb19zZWxlY3Rpb24oc2VsZik6CisgICAgICAgIGMgPSBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAnc2VsZWN0aW9uJykKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KGMpCisKKyAgICBkZWYgaW5mb19zaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ3NpemUnKQorCisgICAgZGVmIGluZm9fdXAoc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ3VwJywgaW5kZXgpCisKKyAgICBkZWYgbmVhcmVzdChzZWxmLCB4LCB5KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnbmVhcmVzdCcsIHgsIHkpCisKKyAgICBkZWYgc2VlKHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWUnLCBpbmRleCkKKworICAgIGRlZiBzZWxlY3Rpb25fY2xlYXIoc2VsZiwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3Rpb24nLCAnY2xlYXInLCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBzZWxlY3Rpb25faW5jbHVkZXMoc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3Rpb24nLCAnaW5jbHVkZXMnLCBpbmRleCkKKworICAgIGRlZiBzZWxlY3Rpb25fc2V0KHNlbGYsIGZpcnN0LCBsYXN0PU5vbmUpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdGlvbicsICdzZXQnLCBmaXJzdCwgbGFzdCkKKworY2xhc3MgVHJlZShUaXhXaWRnZXQpOgorICAgICIiIlRyZWUgLSBUaGUgdGl4VHJlZSB3aWRnZXQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwKKyAgICBkYXRhIGluIGEgdHJlZSBmb3JtLiBUaGUgdXNlciBjYW4gYWRqdXN0CisgICAgdGhlIHZpZXcgb2YgdGhlIHRyZWUgYnkgb3BlbmluZyBvciBjbG9zaW5nIHBhcnRzIG9mIHRoZSB0cmVlLiIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4U2Nyb2xsZWRXaWRnZXQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhUcmVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydobGlzdCddID0gX2R1bW15SExpc3Qoc2VsZiwgJ2hsaXN0JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsndnNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ3ZzYicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICdoc2InKQorCisgICAgZGVmIGF1dG9zZXRtb2RlKHNlbGYpOgorICAgICAgICAnJydUaGlzIGNvbW1hbmQgY2FsbHMgdGhlIHNldG1vZGUgbWV0aG9kIGZvciBhbGwgdGhlIGVudHJpZXMgaW4gdGhpcworICAgICBUcmVlIHdpZGdldDogaWYgYW4gZW50cnkgaGFzIG5vIGNoaWxkIGVudHJpZXMsIGl0cyBtb2RlIGlzIHNldCB0bworICAgICBub25lLiBPdGhlcndpc2UsIGlmIHRoZSBlbnRyeSBoYXMgYW55IGhpZGRlbiBjaGlsZCBlbnRyaWVzLCBpdHMgbW9kZSBpcworICAgICBzZXQgdG8gb3Blbjsgb3RoZXJ3aXNlIGl0cyBtb2RlIGlzIHNldCB0byBjbG9zZS4nJycKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdhdXRvc2V0bW9kZScpCisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgZW50cnlwYXRoKToKKyAgICAgICAgJycnQ2xvc2UgdGhlIGVudHJ5IGdpdmVuIGJ5IGVudHJ5UGF0aCBpZiBpdHMgbW9kZSBpcyBjbG9zZS4nJycKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdjbG9zZScsIGVudHJ5cGF0aCkKKworICAgIGRlZiBnZXRtb2RlKHNlbGYsIGVudHJ5cGF0aCk6CisgICAgICAgICcnJ1JldHVybnMgdGhlIGN1cnJlbnQgbW9kZSBvZiB0aGUgZW50cnkgZ2l2ZW4gYnkgZW50cnlQYXRoLicnJworICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdnZXRtb2RlJywgZW50cnlwYXRoKQorCisgICAgZGVmIG9wZW4oc2VsZiwgZW50cnlwYXRoKToKKyAgICAgICAgJycnT3BlbiB0aGUgZW50cnkgZ2l2ZW4gYnkgZW50cnlQYXRoIGlmIGl0cyBtb2RlIGlzIG9wZW4uJycnCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnb3BlbicsIGVudHJ5cGF0aCkKKworICAgIGRlZiBzZXRtb2RlKHNlbGYsIGVudHJ5cGF0aCwgbW9kZT0nbm9uZScpOgorICAgICAgICAnJydUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBlbnRyeSBnaXZlbiBieQorICAgICBlbnRyeVBhdGggaGFzIGNoaWxkcmVuIGVudHJpZXMgYW5kIHdoZXRoZXIgdGhlIGNoaWxkcmVuIGFyZSB2aXNpYmxlLiBtb2RlCisgICAgIG11c3QgYmUgb25lIG9mIG9wZW4sIGNsb3NlIG9yIG5vbmUuIElmIG1vZGUgaXMgc2V0IHRvIG9wZW4sIGEgKCspCisgICAgIGluZGljYXRvciBpcyBkcmF3biBuZXh0IHRvIHRoZSBlbnRyeS4gSWYgbW9kZSBpcyBzZXQgdG8gY2xvc2UsIGEgKC0pCisgICAgIGluZGljYXRvciBpcyBkcmF3biBuZXh0IHRvIHRoZSBlbnRyeS4gSWYgbW9kZSBpcyBzZXQgdG8gbm9uZSwgbm8KKyAgICAgaW5kaWNhdG9ycyB3aWxsIGJlIGRyYXduIGZvciB0aGlzIGVudHJ5LiBUaGUgZGVmYXVsdCBtb2RlIGlzIG5vbmUuIFRoZQorICAgICBvcGVuIG1vZGUgaW5kaWNhdGVzIHRoZSBlbnRyeSBoYXMgaGlkZGVuIGNoaWxkcmVuIGFuZCB0aGlzIGVudHJ5IGNhbiBiZQorICAgICBvcGVuZWQgYnkgdGhlIHVzZXIuIFRoZSBjbG9zZSBtb2RlIGluZGljYXRlcyB0aGF0IGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhlCisgICAgIGVudHJ5IGFyZSBub3cgdmlzaWJsZSBhbmQgdGhlIGVudHJ5IGNhbiBiZSBjbG9zZWQgYnkgdGhlIHVzZXIuJycnCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2V0bW9kZScsIGVudHJ5cGF0aCwgbW9kZSkKKworCisjIENvdWxkIHRyeSBzdWJjbGFzc2luZyBUcmVlIGZvciBDaGVja0xpc3QgLSB3b3VsZCBuZWVkIGFub3RoZXIgYXJnIHRvIGluaXQKK2NsYXNzIENoZWNrTGlzdChUaXhXaWRnZXQpOgorICAgICIiIlRoZSBDaGVja0xpc3Qgd2lkZ2V0CisgICAgZGlzcGxheXMgYSBsaXN0IG9mIGl0ZW1zIHRvIGJlIHNlbGVjdGVkIGJ5IHRoZSB1c2VyLiBDaGVja0xpc3QgYWN0cworICAgIHNpbWlsYXJseSB0byB0aGUgVGsgY2hlY2tidXR0b24gb3IgcmFkaW9idXR0b24gd2lkZ2V0cywgZXhjZXB0IGl0IGlzCisgICAgY2FwYWJsZSBvZiBoYW5kbGluZyBtYW55IG1vcmUgaXRlbXMgdGhhbiBjaGVja2J1dHRvbnMgb3IgcmFkaW9idXR0b25zLgorICAgICIiIgorICAgICMgRklYTUU6IEl0IHNob3VsZCBpbmhlcml0IC1zdXBlcmNsYXNzIHRpeFRyZWUKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhDaGVja0xpc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWydvcHRpb25zJywgJ3JhZGlvJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hsaXN0J10gPSBfZHVtbXlITGlzdChzZWxmLCAnaGxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wyd2c2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAndnNiJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaHNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ2hzYicpCisKKyAgICBkZWYgYXV0b3NldG1vZGUoc2VsZik6CisgICAgICAgICcnJ1RoaXMgY29tbWFuZCBjYWxscyB0aGUgc2V0bW9kZSBtZXRob2QgZm9yIGFsbCB0aGUgZW50cmllcyBpbiB0aGlzCisgICAgIFRyZWUgd2lkZ2V0OiBpZiBhbiBlbnRyeSBoYXMgbm8gY2hpbGQgZW50cmllcywgaXRzIG1vZGUgaXMgc2V0IHRvCisgICAgIG5vbmUuIE90aGVyd2lzZSwgaWYgdGhlIGVudHJ5IGhhcyBhbnkgaGlkZGVuIGNoaWxkIGVudHJpZXMsIGl0cyBtb2RlIGlzCisgICAgIHNldCB0byBvcGVuOyBvdGhlcndpc2UgaXRzIG1vZGUgaXMgc2V0IHRvIGNsb3NlLicnJworICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2F1dG9zZXRtb2RlJykKKworICAgIGRlZiBjbG9zZShzZWxmLCBlbnRyeXBhdGgpOgorICAgICAgICAnJydDbG9zZSB0aGUgZW50cnkgZ2l2ZW4gYnkgZW50cnlQYXRoIGlmIGl0cyBtb2RlIGlzIGNsb3NlLicnJworICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2Nsb3NlJywgZW50cnlwYXRoKQorCisgICAgZGVmIGdldG1vZGUoc2VsZiwgZW50cnlwYXRoKToKKyAgICAgICAgJycnUmV0dXJucyB0aGUgY3VycmVudCBtb2RlIG9mIHRoZSBlbnRyeSBnaXZlbiBieSBlbnRyeVBhdGguJycnCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2dldG1vZGUnLCBlbnRyeXBhdGgpCisKKyAgICBkZWYgb3BlbihzZWxmLCBlbnRyeXBhdGgpOgorICAgICAgICAnJydPcGVuIHRoZSBlbnRyeSBnaXZlbiBieSBlbnRyeVBhdGggaWYgaXRzIG1vZGUgaXMgb3Blbi4nJycKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdvcGVuJywgZW50cnlwYXRoKQorCisgICAgZGVmIGdldHNlbGVjdGlvbihzZWxmLCBtb2RlPSdvbicpOgorICAgICAgICAnJydSZXR1cm5zIGEgbGlzdCBvZiBpdGVtcyB3aG9zZSBzdGF0dXMgbWF0Y2hlcyBzdGF0dXMuIElmIHN0YXR1cyBpcworICAgICBub3Qgc3BlY2lmaWVkLCB0aGUgbGlzdCBvZiBpdGVtcyBpbiB0aGUgIm9uIiBzdGF0dXMgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgTW9kZSBjYW4gYmUgb24sIG9mZiwgZGVmYXVsdCcnJworICAgICAgICBjID0gc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2dldHNlbGVjdGlvbicsIG1vZGUpKQorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3QoYykKKworICAgIGRlZiBnZXRzdGF0dXMoc2VsZiwgZW50cnlwYXRoKToKKyAgICAgICAgJycnUmV0dXJucyB0aGUgY3VycmVudCBzdGF0dXMgb2YgZW50cnlQYXRoLicnJworICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdnZXRzdGF0dXMnLCBlbnRyeXBhdGgpCisKKyAgICBkZWYgc2V0c3RhdHVzKHNlbGYsIGVudHJ5cGF0aCwgbW9kZT0nb24nKToKKyAgICAgICAgJycnU2V0cyB0aGUgc3RhdHVzIG9mIGVudHJ5UGF0aCB0byBiZSBzdGF0dXMuIEEgYml0bWFwIHdpbGwgYmUKKyAgICAgZGlzcGxheWVkIG5leHQgdG8gdGhlIGVudHJ5IGl0cyBzdGF0dXMgaXMgb24sIG9mZiBvciBkZWZhdWx0LicnJworICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NldHN0YXR1cycsIGVudHJ5cGF0aCwgbW9kZSkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBUaGUgc3ViY2xhc3NpbmcgYmVsb3cgaXMgdXNlZCB0byBpbnN0YW50aWF0ZSB0aGUgc3Vid2lkZ2V0cyBpbiBlYWNoICMjIworIyMjIG1lZ2Egd2lkZ2V0LiBUaGlzIGFsbG93cyB1cyB0byBhY2Nlc3MgdGhlaXIgbWV0aG9kcyBkaXJlY3RseS4gICAgICAgIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgX2R1bW15QnV0dG9uKEJ1dHRvbiwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKworY2xhc3MgX2R1bW15Q2hlY2tidXR0b24oQ2hlY2tidXR0b24sIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHkpCisKK2NsYXNzIF9kdW1teUVudHJ5KEVudHJ5LCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorCitjbGFzcyBfZHVtbXlGcmFtZShGcmFtZSwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKworY2xhc3MgX2R1bW15TGFiZWwoTGFiZWwsIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHkpCisKK2NsYXNzIF9kdW1teUxpc3Rib3goTGlzdGJveCwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKworY2xhc3MgX2R1bW15TWVudShNZW51LCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorCitjbGFzcyBfZHVtbXlNZW51YnV0dG9uKE1lbnVidXR0b24sIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHkpCisKK2NsYXNzIF9kdW1teVNjcm9sbGJhcihTY3JvbGxiYXIsIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHkpCisKK2NsYXNzIF9kdW1teVRleHQoVGV4dCwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKworY2xhc3MgX2R1bW15U2Nyb2xsZWRMaXN0Qm94KFNjcm9sbGVkTGlzdEJveCwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbGlzdGJveCddID0gX2R1bW15TGlzdGJveChzZWxmLCAnbGlzdGJveCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3ZzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICd2c2InKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydoc2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAnaHNiJykKKworY2xhc3MgX2R1bW15SExpc3QoSExpc3QsIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHkpCisKK2NsYXNzIF9kdW1teVNjcm9sbGVkSExpc3QoU2Nyb2xsZWRITGlzdCwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaGxpc3QnXSA9IF9kdW1teUhMaXN0KHNlbGYsICdobGlzdCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3ZzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICd2c2InKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydoc2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAnaHNiJykKKworY2xhc3MgX2R1bW15VExpc3QoVExpc3QsIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHkpCisKK2NsYXNzIF9kdW1teUNvbWJvQm94KENvbWJvQm94LCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgWydmYW5jeScsZGVzdHJveV9waHlzaWNhbGx5XSkKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbGFiZWwnXSA9IF9kdW1teUxhYmVsKHNlbGYsICdsYWJlbCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2VudHJ5J10gPSBfZHVtbXlFbnRyeShzZWxmLCAnZW50cnknKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydhcnJvdyddID0gX2R1bW15QnV0dG9uKHNlbGYsICdhcnJvdycpCisKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnc2xpc3Rib3gnXSA9IF9kdW1teVNjcm9sbGVkTGlzdEJveChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzbGlzdGJveCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3RpY2snXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAndGljaycpCisgICAgICAgICAgICAjY3Jvc3MgQnV0dG9uIDogcHJlc2VudCBpZiBjcmVhdGVkIHdpdGggdGhlIGZhbmN5IG9wdGlvbgorICAgICAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnY3Jvc3MnXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnY3Jvc3MnKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgIyB1bmF2YWlsYWJsZSB3aGVuIC1mYW5jeSBub3Qgc3BlY2lmaWVkCisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIF9kdW1teURpckxpc3QoRGlyTGlzdCwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaGxpc3QnXSA9IF9kdW1teUhMaXN0KHNlbGYsICdobGlzdCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3ZzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICd2c2InKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydoc2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAnaHNiJykKKworY2xhc3MgX2R1bW15RGlyU2VsZWN0Qm94KERpclNlbGVjdEJveCwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZGlybGlzdCddID0gX2R1bW15RGlyTGlzdChzZWxmLCAnZGlybGlzdCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2RpcmNieCddID0gX2R1bW15RmlsZUNvbWJvQm94KHNlbGYsICdkaXJjYngnKQorCitjbGFzcyBfZHVtbXlFeEZpbGVTZWxlY3RCb3goRXhGaWxlU2VsZWN0Qm94LCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydjYW5jZWwnXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnY2FuY2VsJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnb2snXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnb2snKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydoaWRkZW4nXSA9IF9kdW1teUNoZWNrYnV0dG9uKHNlbGYsICdoaWRkZW4nKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wyd0eXBlcyddID0gX2R1bW15Q29tYm9Cb3goc2VsZiwgJ3R5cGVzJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZGlyJ10gPSBfZHVtbXlDb21ib0JveChzZWxmLCAnZGlyJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZGlybGlzdCddID0gX2R1bW15U2Nyb2xsZWRMaXN0Qm94KHNlbGYsICdkaXJsaXN0JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZmlsZSddID0gX2R1bW15Q29tYm9Cb3goc2VsZiwgJ2ZpbGUnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydmaWxlbGlzdCddID0gX2R1bW15U2Nyb2xsZWRMaXN0Qm94KHNlbGYsICdmaWxlbGlzdCcpCisKK2NsYXNzIF9kdW1teUZpbGVTZWxlY3RCb3goRmlsZVNlbGVjdEJveCwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZGlybGlzdCddID0gX2R1bW15U2Nyb2xsZWRMaXN0Qm94KHNlbGYsICdkaXJsaXN0JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZmlsZWxpc3QnXSA9IF9kdW1teVNjcm9sbGVkTGlzdEJveChzZWxmLCAnZmlsZWxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydmaWx0ZXInXSA9IF9kdW1teUNvbWJvQm94KHNlbGYsICdmaWx0ZXInKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydzZWxlY3Rpb24nXSA9IF9kdW1teUNvbWJvQm94KHNlbGYsICdzZWxlY3Rpb24nKQorCitjbGFzcyBfZHVtbXlGaWxlQ29tYm9Cb3goQ29tYm9Cb3gsIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHkpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2RpcmNieCddID0gX2R1bW15Q29tYm9Cb3goc2VsZiwgJ2RpcmNieCcpCisKK2NsYXNzIF9kdW1teVN0ZEJ1dHRvbkJveChTdGRCdXR0b25Cb3gsIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHkpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ29rJ10gPSBfZHVtbXlCdXR0b24oc2VsZiwgJ29rJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnYXBwbHknXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnYXBwbHknKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydjYW5jZWwnXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnY2FuY2VsJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaGVscCddID0gX2R1bW15QnV0dG9uKHNlbGYsICdoZWxwJykKKworY2xhc3MgX2R1bW15Tm90ZUJvb2tGcmFtZShOb3RlQm9va0ZyYW1lLCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0wKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorCitjbGFzcyBfZHVtbXlQYW5lZFdpbmRvdyhQYW5lZFdpbmRvdywgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgVXRpbGl0eSBSb3V0aW5lcyAjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjbWlrZSBTaG91bGQgdGl4RGVzdHJveSBiZSBleHBvc2VkIGFzIGEgd3JhcHBlcj8gLSBidXQgbm90IGZvciB3aWRnZXRzLgorCitkZWYgT3B0aW9uTmFtZSh3aWRnZXQpOgorICAgICcnJ1JldHVybnMgdGhlIHF1YWxpZmllZCBwYXRoIG5hbWUgZm9yIHRoZSB3aWRnZXQuIE5vcm1hbGx5IHVzZWQgdG8gc2V0CisgICAgZGVmYXVsdCBvcHRpb25zIGZvciBzdWJ3aWRnZXRzLiBTZWUgdGl4d2lkZ2V0cy5weScnJworICAgIHJldHVybiB3aWRnZXQudGsuY2FsbCgndGl4T3B0aW9uTmFtZScsIHdpZGdldC5fdykKKworIyBDYWxsZWQgd2l0aCBhIGRpY3Rpb25hcnkgYXJndW1lbnQgb2YgdGhlIGZvcm0KKyMgeycqLmMnOidDIHNvdXJjZSBmaWxlcycsICcqLnR4dCc6J1RleHQgRmlsZXMnLCAnKic6J0FsbCBmaWxlcyd9CisjIHJldHVybnMgYSBzdHJpbmcgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBmc2JveCBmaWxlIHR5cGVzCisjIGluIGFuIEV4RmlsZVNlbGVjdEJveC4gaS5lLiwKKyMgJ3t7Kn0geyogLSBBbGwgZmlsZXN9fSB7eyouY30geyouYyAtIEMgc291cmNlIGZpbGVzfX0ge3sqLnR4dH0geyoudHh0IC0gVGV4dCBGaWxlc319JworZGVmIEZpbGVUeXBlTGlzdChkaWN0KToKKyAgICBzID0gJycKKyAgICBmb3IgdHlwZSBpbiBkaWN0LmtleXMoKToKKyAgICAgICAgcyA9IHMgKyAne3snICsgdHlwZSArICd9IHsnICsgdHlwZSArICcgLSAnICsgZGljdFt0eXBlXSArICd9fSAnCisgICAgcmV0dXJuIHMKKworIyBTdGlsbCB0byBiZSBkb25lOgorIyB0aXhJY29uVmlldworY2xhc3MgQ09ialZpZXcoVGl4V2lkZ2V0KToKKyAgICAiIiJUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQ2FudmFzIE9iamVjdCBWaWV3IHdpZGdldC4gVGhpcyBpcyBhIGJhc2UKKyAgICBjbGFzcyBvZiBJY29uVmlldy4gSXQgaW1wbGVtZW50cyBhdXRvbWF0aWMgcGxhY2VtZW50L2FkanVzdG1lbnQgb2YgdGhlCisgICAgc2Nyb2xsYmFycyBhY2NvcmRpbmcgdG8gdGhlIGNhbnZhcyBvYmplY3RzIGluc2lkZSB0aGUgY2FudmFzIHN1YndpZGdldC4KKyAgICBUaGUgc2Nyb2xsYmFycyBhcmUgYWRqdXN0ZWQgc28gdGhhdCB0aGUgY2FudmFzIGlzIGp1c3QgbGFyZ2UgZW5vdWdoCisgICAgdG8gc2VlIGFsbCB0aGUgb2JqZWN0cy4KKyAgICAiIiIKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhTY3JvbGxlZFdpZGdldAorICAgIHBhc3MKKworCitjbGFzcyBHcmlkKFRpeFdpZGdldCwgWFZpZXcsIFlWaWV3KToKKyAgICAnJydUaGUgVGl4IEdyaWQgY29tbWFuZCBjcmVhdGVzIGEgbmV3IHdpbmRvdyAgYW5kIG1ha2VzIGl0IGludG8gYQorICAgIHRpeEdyaWQgd2lkZ2V0LiBBZGRpdGlvbmFsIG9wdGlvbnMsIG1heSBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQKKyAgICBsaW5lIG9yIGluIHRoZSBvcHRpb24gZGF0YWJhc2UgdG8gY29uZmlndXJlIGFzcGVjdHMgc3VjaCBhcyBpdHMgY3Vyc29yCisgICAgYW5kIHJlbGllZi4KKworICAgIEEgR3JpZCB3aWRnZXQgZGlzcGxheXMgaXRzIGNvbnRlbnRzIGluIGEgdHdvIGRpbWVuc2lvbmFsIGdyaWQgb2YgY2VsbHMuCisgICAgRWFjaCBjZWxsIG1heSBjb250YWluIG9uZSBUaXggZGlzcGxheSBpdGVtLCB3aGljaCBtYXkgYmUgaW4gdGV4dCwKKyAgICBncmFwaGljcyBvciBvdGhlciBmb3JtYXRzLiBTZWUgdGhlIERpc3BsYXlTdHlsZSBjbGFzcyBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICAgIGFib3V0IFRpeCBkaXNwbGF5IGl0ZW1zLiBJbmRpdmlkdWFsIGNlbGxzLCBvciBncm91cHMgb2YgY2VsbHMsIGNhbiBiZQorICAgIGZvcm1hdHRlZCB3aXRoIGEgd2lkZSByYW5nZSBvZiBhdHRyaWJ1dGVzLCBzdWNoIGFzIGl0cyBjb2xvciwgcmVsaWVmIGFuZAorICAgIGJvcmRlci4KKworICAgIFN1YndpZGdldHMgLSBOb25lJycnCisgICAgIyB2YWxpZCBzcGVjaWZpYyByZXNvdXJjZXMgYXMgb2YgVGsgOC40CisgICAgIyBlZGl0ZG9uZWNtZCwgZWRpdG5vdGlmeWNtZCwgZmxvYXRpbmdjb2xzLCBmbG9hdGluZ3Jvd3MsIGZvcm1hdGNtZCwKKyAgICAjIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLCBsZWZ0bWFyZ2luLCBpdGVtdHlwZSwgc2VsZWN0bW9kZSwKKyAgICAjIHNlbGVjdHVuaXQsIHRvcG1hcmdpbiwKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHN0YXRpYz0gW10KKyAgICAgICAgc2VsZi5jbmY9IGNuZgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4R3JpZCcsIHN0YXRpYywgY25mLCBrdykKKworICAgICMgdmFsaWQgb3B0aW9ucyBhcyBvZiBUayA4LjQKKyAgICAjIGFuY2hvciwgYmR0eXBlLCBjZ2V0LCBjb25maWd1cmUsIGRlbGV0ZSwgZHJhZ3NpdGUsIGRyb3BzaXRlLCBlbnRyeWNnZXQsCisgICAgIyBlZGl0LCBlbnRyeWNvbmZpZ3VyZSwgZm9ybWF0LCBnZW9tZXRyeWluZm8sIGluZm8sIGluZGV4LCBtb3ZlLCBuZWFyZXN0LAorICAgICMgc2VsZWN0aW9uLCBzZXQsIHNpemUsIHVuc2V0LCB4dmlldywgeXZpZXcKKyAgICBkZWYgYW5jaG9yX2NsZWFyKHNlbGYpOgorICAgICAgICAiIiJSZW1vdmVzIHRoZSBzZWxlY3Rpb24gYW5jaG9yLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ2FuY2hvcicsICdjbGVhcicpCisKKyAgICBkZWYgYW5jaG9yX2dldChzZWxmKToKKyAgICAgICAgIkdldCB0aGUgKHgseSkgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudCBhbmNob3IgY2VsbCIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKHNlbGYsICdhbmNob3InLCAnZ2V0JykpCisKKyAgICBkZWYgYW5jaG9yX3NldChzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiU2V0IHRoZSBzZWxlY3Rpb24gYW5jaG9yIHRvIHRoZSBjZWxsIGF0ICh4LCB5KS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdhbmNob3InLCAnc2V0JywgeCwgeSkKKworICAgIGRlZiBkZWxldGVfcm93KHNlbGYsIGZyb21fLCB0bz1Ob25lKToKKyAgICAgICAgIiIiRGVsZXRlIHJvd3MgYmV0d2VlbiBmcm9tXyBhbmQgdG8gaW5jbHVzaXZlLgorICAgICAgICBJZiB0byBpcyBub3QgcHJvdmlkZWQsICBkZWxldGUgb25seSByb3cgYXQgZnJvbV8iIiIKKyAgICAgICAgaWYgdG8gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAnZGVsZXRlJywgJ3JvdycsIGZyb21fKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdkZWxldGUnLCAncm93JywgZnJvbV8sIHRvKQorCisgICAgZGVmIGRlbGV0ZV9jb2x1bW4oc2VsZiwgZnJvbV8sIHRvPU5vbmUpOgorICAgICAgICAiIiJEZWxldGUgY29sdW1ucyBiZXR3ZWVuIGZyb21fIGFuZCB0byBpbmNsdXNpdmUuCisgICAgICAgIElmIHRvIGlzIG5vdCBwcm92aWRlZCwgIGRlbGV0ZSBvbmx5IGNvbHVtbiBhdCBmcm9tXyIiIgorICAgICAgICBpZiB0byBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdkZWxldGUnLCAnY29sdW1uJywgZnJvbV8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ2RlbGV0ZScsICdjb2x1bW4nLCBmcm9tXywgdG8pCisKKyAgICBkZWYgZWRpdF9hcHBseShzZWxmKToKKyAgICAgICAgIiIiSWYgYW55IGNlbGwgaXMgYmVpbmcgZWRpdGVkLCBkZS1oaWdobGlnaHQgdGhlIGNlbGwgIGFuZCAgYXBwbGllcworICAgICAgICB0aGUgY2hhbmdlcy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdlZGl0JywgJ2FwcGx5JykKKworICAgIGRlZiBlZGl0X3NldChzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiSGlnaGxpZ2h0cyAgdGhlICBjZWxsICBhdCAgKHgsIHkpIGZvciBlZGl0aW5nLCBpZiB0aGUgLWVkaXRub3RpZnkKKyAgICAgICAgY29tbWFuZCByZXR1cm5zIFRydWUgZm9yIHRoaXMgY2VsbC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdlZGl0JywgJ3NldCcsIHgsIHkpCisKKyAgICBkZWYgZW50cnljZ2V0KHNlbGYsIHgsIHksIG9wdGlvbik6CisgICAgICAgICJHZXQgdGhlIG9wdGlvbiB2YWx1ZSBmb3IgY2VsbCBhdCAoeCx5KSIKKyAgICAgICAgaWYgb3B0aW9uIGFuZCBvcHRpb25bMF0gIT0gJy0nOgorICAgICAgICAgICAgb3B0aW9uID0gJy0nICsgb3B0aW9uCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZiwgJ2VudHJ5Y2dldCcsIHgsIHksIG9wdGlvbikKKworICAgIGRlZiBlbnRyeWNvbmZpZ3VyZShzZWxmLCB4LCB5LCBjbmY9Tm9uZSwgKiprdyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb25maWd1cmUoKCdlbnRyeWNvbmZpZ3VyZScsIHgsIHkpLCBjbmYsIGt3KQorCisgICAgIyBkZWYgZm9ybWF0CisgICAgIyBkZWYgaW5kZXgKKworICAgIGRlZiBpbmZvX2V4aXN0cyhzZWxmLCB4LCB5KToKKyAgICAgICAgIlJldHVybiBUcnVlIGlmIGRpc3BsYXkgaXRlbSBleGlzdHMgYXQgKHgseSkiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRib29sZWFuKHNlbGYudGsuY2FsbChzZWxmLCAnaW5mbycsICdleGlzdHMnLCB4LCB5KSkKKworICAgIGRlZiBpbmZvX2Jib3goc2VsZiwgeCwgeSk6CisgICAgICAgICMgVGhpcyBzZWVtcyB0byBhbHdheXMgcmV0dXJuICcnLCBhdCBsZWFzdCBmb3IgJ3RleHQnIGRpc3BsYXlpdGVtcworICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYsICdpbmZvJywgJ2Jib3gnLCB4LCB5KQorCisgICAgZGVmIG1vdmVfY29sdW1uKHNlbGYsIGZyb21fLCB0bywgb2Zmc2V0KToKKyAgICAgICAgIiIiTW92ZXMgdGhlIHJhbmdlIG9mIGNvbHVtbnMgZnJvbSBwb3NpdGlvbiBGUk9NIHRocm91Z2ggVE8gYnkKKyAgICAgICAgdGhlIGRpc3RhbmNlIGluZGljYXRlZCBieSBPRkZTRVQuIEZvciBleGFtcGxlLCBtb3ZlX2NvbHVtbigyLCA0LCAxKQorICAgICAgICBtb3ZlcyB0aGUgY29sdW1ucyAyLDMsNCB0byBjb2x1bW5zIDMsNCw1LiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ21vdmUnLCAnY29sdW1uJywgZnJvbV8sIHRvLCBvZmZzZXQpCisKKyAgICBkZWYgbW92ZV9yb3coc2VsZiwgZnJvbV8sIHRvLCBvZmZzZXQpOgorICAgICAgICAiIiJNb3ZlcyB0aGUgcmFuZ2Ugb2Ygcm93cyBmcm9tIHBvc2l0aW9uIEZST00gdGhyb3VnaCBUTyBieQorICAgICAgICB0aGUgZGlzdGFuY2UgaW5kaWNhdGVkIGJ5IE9GRlNFVC4KKyAgICAgICAgRm9yIGV4YW1wbGUsIG1vdmVfcm93KDIsIDQsIDEpIG1vdmVzIHRoZSByb3dzIDIsMyw0IHRvIHJvd3MgMyw0LDUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAnbW92ZScsICdyb3cnLCBmcm9tXywgdG8sIG9mZnNldCkKKworICAgIGRlZiBuZWFyZXN0KHNlbGYsIHgsIHkpOgorICAgICAgICAiUmV0dXJuIGNvb3JkaW5hdGUgb2YgY2VsbCBuZWFyZXN0IHBpeGVsIGNvb3JkaW5hdGUgKHgseSkiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKHNlbGYudGsuY2FsbChzZWxmLCAnbmVhcmVzdCcsIHgsIHkpKQorCisgICAgIyBkZWYgc2VsZWN0aW9uIGFkanVzdAorICAgICMgZGVmIHNlbGVjdGlvbiBjbGVhcgorICAgICMgZGVmIHNlbGVjdGlvbiBpbmNsdWRlcworICAgICMgZGVmIHNlbGVjdGlvbiBzZXQKKyAgICAjIGRlZiBzZWxlY3Rpb24gdG9nZ2xlCisKKyAgICBkZWYgc2V0KHNlbGYsIHgsIHksIGl0ZW10eXBlPU5vbmUsICoqa3cpOgorICAgICAgICBhcmdzPSBzZWxmLl9vcHRpb25zKHNlbGYuY25mLCBrdykKKyAgICAgICAgaWYgaXRlbXR5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhcmdzPSAoJy1pdGVtdHlwZScsIGl0ZW10eXBlKSArIGFyZ3MKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdzZXQnLCB4LCB5LCAqYXJncykKKworICAgIGRlZiBzaXplX2NvbHVtbihzZWxmLCBpbmRleCwgKiprdyk6CisgICAgICAgICIiIlF1ZXJpZXMgb3Igc2V0cyB0aGUgc2l6ZSBvZiB0aGUgY29sdW1uIGdpdmVuIGJ5CisgICAgICAgIElOREVYLiAgSU5ERVggbWF5IGJlIGFueSBub24tbmVnYXRpdmUKKyAgICAgICAgaW50ZWdlciB0aGF0IGdpdmVzIHRoZSBwb3NpdGlvbiBvZiBhIGdpdmVuIGNvbHVtbi4KKyAgICAgICAgSU5ERVggY2FuIGFsc28gYmUgdGhlIHN0cmluZyAiZGVmYXVsdCI7IGluIHRoaXMgY2FzZSwgdGhpcyBjb21tYW5kCisgICAgICAgIHF1ZXJpZXMgb3Igc2V0cyB0aGUgZGVmYXVsdCBzaXplIG9mIGFsbCBjb2x1bW5zLgorICAgICAgICBXaGVuIG5vIG9wdGlvbi12YWx1ZSBwYWlyIGlzIGdpdmVuLCB0aGlzIGNvbW1hbmQgcmV0dXJucyBhIHR1cGxlCisgICAgICAgIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc2l6ZSBzZXR0aW5nIG9mIHRoZSBnaXZlbiBjb2x1bW4uICBXaGVuCisgICAgICAgIG9wdGlvbi12YWx1ZSBwYWlycyBhcmUgZ2l2ZW4sIHRoZSBjb3JyZXNwb25kaW5nIG9wdGlvbnMgb2YgdGhlCisgICAgICAgIHNpemUgc2V0dGluZyBvZiB0aGUgZ2l2ZW4gY29sdW1uIGFyZSBjaGFuZ2VkLiBPcHRpb25zIG1heSBiZSBvbmUKKyAgICAgICAgb2YgdGhlIGZvbGx3aW5nOgorICAgICAgICAgICAgICBwYWQwIHBpeGVscworICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwYWRkaW5ncyB0byB0aGUgbGVmdCBvZiBhIGNvbHVtbi4KKyAgICAgICAgICAgICAgcGFkMSBwaXhlbHMKKyAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcGFkZGluZ3MgdG8gdGhlIHJpZ2h0IG9mIGEgY29sdW1uLgorICAgICAgICAgICAgICBzaXplIHZhbAorICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSB3aWR0aCBvZiBhIGNvbHVtbi4gIFZhbCBtYXkgYmU6CisgICAgICAgICAgICAgICAgICAgICAiYXV0byIgLS0gdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4gaXMgc2V0IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgd2lkdGggb2YgdGhlIHdpZGVzdCBjZWxsIGluIHRoZSBjb2x1bW47CisgICAgICAgICAgICAgICAgICAgICBhIHZhbGlkIFRrIHNjcmVlbiBkaXN0YW5jZSB1bml0OworICAgICAgICAgICAgICAgICAgICAgb3IgYSByZWFsIG51bWJlciBmb2xsb3dpbmcgYnkgdGhlIHdvcmQgY2hhcnMKKyAgICAgICAgICAgICAgICAgICAgIChlLmcuIDMuNGNoYXJzKSB0aGF0IHNldHMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4gdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICBnaXZlbiBudW1iZXIgb2YgY2hhcmFjdGVycy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdzaXplJywgJ2NvbHVtbicsIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc2VsZi5fb3B0aW9ucyh7fSwga3cpKSkKKworICAgIGRlZiBzaXplX3JvdyhzZWxmLCBpbmRleCwgKiprdyk6CisgICAgICAgICIiIlF1ZXJpZXMgb3Igc2V0cyB0aGUgc2l6ZSBvZiB0aGUgcm93IGdpdmVuIGJ5CisgICAgICAgIElOREVYLiBJTkRFWCBtYXkgYmUgYW55IG5vbi1uZWdhdGl2ZQorICAgICAgICBpbnRlZ2VyIHRoYXQgZ2l2ZXMgdGhlIHBvc2l0aW9uIG9mIGEgZ2l2ZW4gcm93IC4KKyAgICAgICAgSU5ERVggY2FuIGFsc28gYmUgdGhlIHN0cmluZyAiZGVmYXVsdCI7IGluIHRoaXMgY2FzZSwgdGhpcyBjb21tYW5kCisgICAgICAgIHF1ZXJpZXMgb3Igc2V0cyB0aGUgZGVmYXVsdCBzaXplIG9mIGFsbCByb3dzLgorICAgICAgICBXaGVuIG5vIG9wdGlvbi12YWx1ZSBwYWlyIGlzIGdpdmVuLCB0aGlzIGNvbW1hbmQgcmV0dXJucyBhIGxpc3QgY29uLQorICAgICAgICB0YWluaW5nIHRoZSBjdXJyZW50IHNpemUgc2V0dGluZyBvZiB0aGUgZ2l2ZW4gcm93IC4gV2hlbiBvcHRpb24tdmFsdWUKKyAgICAgICAgcGFpcnMgYXJlIGdpdmVuLCB0aGUgY29ycmVzcG9uZGluZyBvcHRpb25zIG9mIHRoZSBzaXplIHNldHRpbmcgb2YgdGhlCisgICAgICAgIGdpdmVuIHJvdyBhcmUgY2hhbmdlZC4gT3B0aW9ucyBtYXkgYmUgb25lIG9mIHRoZSBmb2xsd2luZzoKKyAgICAgICAgICAgICAgcGFkMCBwaXhlbHMKKyAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcGFkZGluZ3MgdG8gdGhlIHRvcCBvZiBhIHJvdy4KKyAgICAgICAgICAgICAgcGFkMSBwaXhlbHMKKyAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcGFkZGluZ3MgdG8gdGhlIGJvdHRvbSBvZiBhIHJvdy4KKyAgICAgICAgICAgICAgc2l6ZSB2YWwKKyAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgaGVpZ2h0IG9mIGEgcm93LiAgVmFsIG1heSBiZToKKyAgICAgICAgICAgICAgICAgICAgICJhdXRvIiAtLSB0aGUgaGVpZ2h0IG9mIHRoZSByb3cgaXMgc2V0IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IG9mIHRoZSBoaWdoZXN0IGNlbGwgaW4gdGhlIHJvdzsKKyAgICAgICAgICAgICAgICAgICAgIGEgdmFsaWQgVGsgc2NyZWVuIGRpc3RhbmNlIHVuaXQ7CisgICAgICAgICAgICAgICAgICAgICBvciBhIHJlYWwgbnVtYmVyIGZvbGxvd2luZyBieSB0aGUgd29yZCBjaGFycworICAgICAgICAgICAgICAgICAgICAgKGUuZy4gMy40Y2hhcnMpIHRoYXQgc2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSByb3cgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICBnaXZlbiBudW1iZXIgb2YgY2hhcmFjdGVycy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICAgICAgICBzZWxmLCAnc2l6ZScsICdyb3cnLCBpbmRleCwgKnNlbGYuX29wdGlvbnMoe30sIGt3KSkpCisKKyAgICBkZWYgdW5zZXQoc2VsZiwgeCwgeSk6CisgICAgICAgICIiIkNsZWFycyB0aGUgY2VsbCBhdCAoeCwgeSkgYnkgcmVtb3ZpbmcgaXRzIGRpc3BsYXkgaXRlbS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICd1bnNldCcsIHgsIHkpCisKKworY2xhc3MgU2Nyb2xsZWRHcmlkKEdyaWQpOgorICAgICcnJ1Njcm9sbGVkIEdyaWQgd2lkZ2V0cycnJworCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4U2Nyb2xsZWRXaWRnZXQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHN0YXRpYz0gW10KKyAgICAgICAgc2VsZi5jbmY9IGNuZgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4U2Nyb2xsZWRHcmlkJywgc3RhdGljLCBjbmYsIGt3KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvVGl4LnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL1RpeC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1ZThlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL1RpeC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvVGl4LnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL1RpeC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1ZThlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL1RpeC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvVGtjb25zdGFudHMucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2NvbnN0YW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2VlZTMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGtjb25zdGFudHMucHkKQEAgLTAsMCArMSwxMTAgQEAKKyMgU3ltYm9saWMgY29uc3RhbnRzIGZvciBUaworCisjIEJvb2xlYW5zCitOTz1GQUxTRT1PRkY9MAorWUVTPVRSVUU9T049MQorCisjIC1hbmNob3IgYW5kIC1zdGlja3kKK049J24nCitTPSdzJworVz0ndycKK0U9J2UnCitOVz0nbncnCitTVz0nc3cnCitORT0nbmUnCitTRT0nc2UnCitOUz0nbnMnCitFVz0nZXcnCitOU0VXPSduc2V3JworQ0VOVEVSPSdjZW50ZXInCisKKyMgLWZpbGwKK05PTkU9J25vbmUnCitYPSd4JworWT0neScKK0JPVEg9J2JvdGgnCisKKyMgLXNpZGUKK0xFRlQ9J2xlZnQnCitUT1A9J3RvcCcKK1JJR0hUPSdyaWdodCcKK0JPVFRPTT0nYm90dG9tJworCisjIC1yZWxpZWYKK1JBSVNFRD0ncmFpc2VkJworU1VOS0VOPSdzdW5rZW4nCitGTEFUPSdmbGF0JworUklER0U9J3JpZGdlJworR1JPT1ZFPSdncm9vdmUnCitTT0xJRCA9ICdzb2xpZCcKKworIyAtb3JpZW50CitIT1JJWk9OVEFMPSdob3Jpem9udGFsJworVkVSVElDQUw9J3ZlcnRpY2FsJworCisjIC10YWJzCitOVU1FUklDPSdudW1lcmljJworCisjIC13cmFwCitDSEFSPSdjaGFyJworV09SRD0nd29yZCcKKworIyAtYWxpZ24KK0JBU0VMSU5FPSdiYXNlbGluZScKKworIyAtYm9yZGVybW9kZQorSU5TSURFPSdpbnNpZGUnCitPVVRTSURFPSdvdXRzaWRlJworCisjIFNwZWNpYWwgdGFncywgbWFya3MgYW5kIGluc2VydCBwb3NpdGlvbnMKK1NFTD0nc2VsJworU0VMX0ZJUlNUPSdzZWwuZmlyc3QnCitTRUxfTEFTVD0nc2VsLmxhc3QnCitFTkQ9J2VuZCcKK0lOU0VSVD0naW5zZXJ0JworQ1VSUkVOVD0nY3VycmVudCcKK0FOQ0hPUj0nYW5jaG9yJworQUxMPSdhbGwnICMgZS5nLiBDYW52YXMuZGVsZXRlKEFMTCkKKworIyBUZXh0IHdpZGdldCBhbmQgYnV0dG9uIHN0YXRlcworTk9STUFMPSdub3JtYWwnCitESVNBQkxFRD0nZGlzYWJsZWQnCitBQ1RJVkU9J2FjdGl2ZScKKyMgQ2FudmFzIHN0YXRlCitISURERU49J2hpZGRlbicKKworIyBNZW51IGl0ZW0gdHlwZXMKK0NBU0NBREU9J2Nhc2NhZGUnCitDSEVDS0JVVFRPTj0nY2hlY2tidXR0b24nCitDT01NQU5EPSdjb21tYW5kJworUkFESU9CVVRUT049J3JhZGlvYnV0dG9uJworU0VQQVJBVE9SPSdzZXBhcmF0b3InCisKKyMgU2VsZWN0aW9uIG1vZGVzIGZvciBsaXN0IGJveGVzCitTSU5HTEU9J3NpbmdsZScKK0JST1dTRT0nYnJvd3NlJworTVVMVElQTEU9J211bHRpcGxlJworRVhURU5ERUQ9J2V4dGVuZGVkJworCisjIEFjdGl2ZXN0eWxlIGZvciBsaXN0IGJveGVzCisjIE5PTkU9J25vbmUnIGlzIGFsc28gdmFsaWQKK0RPVEJPWD0nZG90Ym94JworVU5ERVJMSU5FPSd1bmRlcmxpbmUnCisKKyMgVmFyaW91cyBjYW52YXMgc3R5bGVzCitQSUVTTElDRT0ncGllc2xpY2UnCitDSE9SRD0nY2hvcmQnCitBUkM9J2FyYycKK0ZJUlNUPSdmaXJzdCcKK0xBU1Q9J2xhc3QnCitCVVRUPSdidXR0JworUFJPSkVDVElORz0ncHJvamVjdGluZycKK1JPVU5EPSdyb3VuZCcKK0JFVkVMPSdiZXZlbCcKK01JVEVSPSdtaXRlcicKKworIyBBcmd1bWVudHMgdG8geHZpZXcveXZpZXcKK01PVkVUTz0nbW92ZXRvJworU0NST0xMPSdzY3JvbGwnCitVTklUUz0ndW5pdHMnCitQQUdFUz0ncGFnZXMnCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2NvbnN0YW50cy5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2NvbnN0YW50cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2NjY1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL1RrY29uc3RhbnRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2NvbnN0YW50cy5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2NvbnN0YW50cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2NjY1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL1RrY29uc3RhbnRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2RuZC5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL1RrZG5kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMzdkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2RuZC5weQpAQCAtMCwwICsxLDMyMSBAQAorIiIiRHJhZy1hbmQtZHJvcCBzdXBwb3J0IGZvciBUa2ludGVyLgorCitUaGlzIGlzIHZlcnkgcHJlbGltaW5hcnkuICBJIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgZG5kICp3aXRoaW4qIG9uZQorYXBwbGljYXRpb24sIGJldHdlZW4gZGlmZmVyZW50IHdpbmRvd3MgKG9yIHdpdGhpbiB0aGUgc2FtZSB3aW5kb3cpLgorCitJIGFuIHRyeWluZyB0byBtYWtlIHRoaXMgYXMgZ2VuZXJpYyBhcyBwb3NzaWJsZSAtLSBub3QgZGVwZW5kZW50IG9uCit0aGUgdXNlIG9mIGEgcGFydGljdWxhciB3aWRnZXQgb3IgaWNvbiB0eXBlLCBldGMuICBJIGFsc28gaG9wZSB0aGF0Cit0aGlzIHdpbGwgd29yayB3aXRoIFBtdy4KKworVG8gZW5hYmxlIGFuIG9iamVjdCB0byBiZSBkcmFnZ2VkLCB5b3UgbXVzdCBjcmVhdGUgYW4gZXZlbnQgYmluZGluZworZm9yIGl0IHRoYXQgc3RhcnRzIHRoZSBkcmFnLWFuZC1kcm9wIHByb2Nlc3MuIFR5cGljYWxseSwgeW91IHNob3VsZAorYmluZCA8QnV0dG9uUHJlc3M+IHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB5b3Ugd3JpdGUuIFRoZSBmdW5jdGlvbgorc2hvdWxkIGNhbGwgVGtkbmQuZG5kX3N0YXJ0KHNvdXJjZSwgZXZlbnQpLCB3aGVyZSAnc291cmNlJyBpcyB0aGUKK29iamVjdCB0byBiZSBkcmFnZ2VkLCBhbmQgJ2V2ZW50JyBpcyB0aGUgZXZlbnQgdGhhdCBpbnZva2VkIHRoZSBjYWxsCisodGhlIGFyZ3VtZW50IHRvIHlvdXIgY2FsbGJhY2sgZnVuY3Rpb24pLiAgRXZlbiB0aG91Z2ggdGhpcyBpcyBhIGNsYXNzCitpbnN0YW50aWF0aW9uLCB0aGUgcmV0dXJuZWQgaW5zdGFuY2Ugc2hvdWxkIG5vdCBiZSBzdG9yZWQgLS0gaXQgd2lsbAorYmUga2VwdCBhbGl2ZSBhdXRvbWF0aWNhbGx5IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGRyYWctYW5kLWRyb3AuCisKK1doZW4gYSBkcmFnLWFuZC1kcm9wIGlzIGFscmVhZHkgaW4gcHJvY2VzcyBmb3IgdGhlIFRrIGludGVycHJldGVyLCB0aGUKK2NhbGwgaXMgKmlnbm9yZWQqOyB0aGlzIG5vcm1hbGx5IGF2ZXJ0cyBzdGFydGluZyBtdWx0aXBsZSBzaW11bHRhbmVvdXMKK2RuZCBwcm9jZXNzZXMsIGUuZy4gYmVjYXVzZSBkaWZmZXJlbnQgYnV0dG9uIGNhbGxiYWNrcyBhbGwKK2RuZF9zdGFydCgpLgorCitUaGUgb2JqZWN0IGlzICpub3QqIG5lY2Vzc2FyaWx5IGEgd2lkZ2V0IC0tIGl0IGNhbiBiZSBhbnkKK2FwcGxpY2F0aW9uLXNwZWNpZmljIG9iamVjdCB0aGF0IGlzIG1lYW5pbmdmdWwgdG8gcG90ZW50aWFsCitkcmFnLWFuZC1kcm9wIHRhcmdldHMuCisKK1BvdGVudGlhbCBkcmFnLWFuZC1kcm9wIHRhcmdldHMgYXJlIGRpc2NvdmVyZWQgYXMgZm9sbG93cy4gIFdoZW5ldmVyCit0aGUgbW91c2UgbW92ZXMsIGFuZCBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiBhIGRyYWctYW5kLWRyb3AgbW92ZSwgdGhlCitUayB3aWRnZXQgZGlyZWN0bHkgdW5kZXIgdGhlIG1vdXNlIGlzIGluc3BlY3RlZC4gIFRoaXMgaXMgdGhlIHRhcmdldAord2lkZ2V0IChub3QgdG8gYmUgY29uZnVzZWQgd2l0aCB0aGUgdGFyZ2V0IG9iamVjdCwgeWV0IHRvIGJlCitkZXRlcm1pbmVkKS4gIElmIHRoZXJlIGlzIG5vIHRhcmdldCB3aWRnZXQsIHRoZXJlIGlzIG5vIGRuZCB0YXJnZXQKK29iamVjdC4gIElmIHRoZXJlIGlzIGEgdGFyZ2V0IHdpZGdldCwgYW5kIGl0IGhhcyBhbiBhdHRyaWJ1dGUKK2RuZF9hY2NlcHQsIHRoaXMgc2hvdWxkIGJlIGEgZnVuY3Rpb24gKG9yIGFueSBjYWxsYWJsZSBvYmplY3QpLiAgVGhlCitmdW5jdGlvbiBpcyBjYWxsZWQgYXMgZG5kX2FjY2VwdChzb3VyY2UsIGV2ZW50KSwgd2hlcmUgJ3NvdXJjZScgaXMgdGhlCitvYmplY3QgYmVpbmcgZHJhZ2dlZCAodGhlIG9iamVjdCBwYXNzZWQgdG8gZG5kX3N0YXJ0KCkgYWJvdmUpLCBhbmQKKydldmVudCcgaXMgdGhlIG1vc3QgcmVjZW50IGV2ZW50IG9iamVjdCAoZ2VuZXJhbGx5IGEgPE1vdGlvbj4gZXZlbnQ7CitpdCBjYW4gYWxzbyBiZSA8QnV0dG9uUHJlc3M+IG9yIDxCdXR0b25SZWxlYXNlPikuICBJZiB0aGUgZG5kX2FjY2VwdCgpCitmdW5jdGlvbiByZXR1cm5zIHNvbWV0aGluZyBvdGhlciB0aGFuIE5vbmUsIHRoaXMgaXMgdGhlIG5ldyBkbmQgdGFyZ2V0CitvYmplY3QuICBJZiBkbmRfYWNjZXB0KCkgcmV0dXJucyBOb25lLCBvciBpZiB0aGUgdGFyZ2V0IHdpZGdldCBoYXMgbm8KK2RuZF9hY2NlcHQgYXR0cmlidXRlLCB0aGUgdGFyZ2V0IHdpZGdldCdzIHBhcmVudCBpcyBjb25zaWRlcmVkIGFzIHRoZQordGFyZ2V0IHdpZGdldCwgYW5kIHRoZSBzZWFyY2ggZm9yIGEgdGFyZ2V0IG9iamVjdCBpcyByZXBlYXRlZCBmcm9tCit0aGVyZS4gIElmIG5lY2Vzc2FyeSwgdGhlIHNlYXJjaCBpcyByZXBlYXRlZCBhbGwgdGhlIHdheSB1cCB0byB0aGUKK3Jvb3Qgd2lkZ2V0LiAgSWYgbm9uZSBvZiB0aGUgdGFyZ2V0IHdpZGdldHMgY2FuIHByb2R1Y2UgYSB0YXJnZXQKK29iamVjdCwgdGhlcmUgaXMgbm8gdGFyZ2V0IG9iamVjdCAodGhlIHRhcmdldCBvYmplY3QgaXMgTm9uZSkuCisKK1RoZSB0YXJnZXQgb2JqZWN0IHRodXMgcHJvZHVjZWQsIGlmIGFueSwgaXMgY2FsbGVkIHRoZSBuZXcgdGFyZ2V0CitvYmplY3QuICBJdCBpcyBjb21wYXJlZCB3aXRoIHRoZSBvbGQgdGFyZ2V0IG9iamVjdCAob3IgTm9uZSwgaWYgdGhlcmUKK3dhcyBubyBvbGQgdGFyZ2V0IHdpZGdldCkuICBUaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyAoJ3NvdXJjZScgaXMgdGhlCitzb3VyY2Ugb2JqZWN0LCBhbmQgJ2V2ZW50JyBpcyB0aGUgbW9zdCByZWNlbnQgZXZlbnQgb2JqZWN0KToKKworLSBCb3RoIHRoZSBvbGQgYW5kIG5ldyB0YXJnZXQgb2JqZWN0cyBhcmUgTm9uZS4gIE5vdGhpbmcgaGFwcGVucy4KKworLSBUaGUgb2xkIGFuZCBuZXcgdGFyZ2V0IG9iamVjdHMgYXJlIHRoZSBzYW1lIG9iamVjdC4gIEl0cyBtZXRob2QKK2RuZF9tb3Rpb24oc291cmNlLCBldmVudCkgaXMgY2FsbGVkLgorCistIFRoZSBvbGQgdGFyZ2V0IG9iamVjdCB3YXMgTm9uZSwgYW5kIHRoZSBuZXcgdGFyZ2V0IG9iamVjdCBpcyBub3QKK05vbmUuICBUaGUgbmV3IHRhcmdldCBvYmplY3QncyBtZXRob2QgZG5kX2VudGVyKHNvdXJjZSwgZXZlbnQpIGlzCitjYWxsZWQuCisKKy0gVGhlIG5ldyB0YXJnZXQgb2JqZWN0IGlzIE5vbmUsIGFuZCB0aGUgb2xkIHRhcmdldCBvYmplY3QgaXMgbm90CitOb25lLiAgVGhlIG9sZCB0YXJnZXQgb2JqZWN0J3MgbWV0aG9kIGRuZF9sZWF2ZShzb3VyY2UsIGV2ZW50KSBpcworY2FsbGVkLgorCistIFRoZSBvbGQgYW5kIG5ldyB0YXJnZXQgb2JqZWN0cyBkaWZmZXIgYW5kIG5laXRoZXIgaXMgTm9uZS4gIFRoZSBvbGQKK3RhcmdldCBvYmplY3QncyBtZXRob2QgZG5kX2xlYXZlKHNvdXJjZSwgZXZlbnQpLCBhbmQgdGhlbiB0aGUgbmV3Cit0YXJnZXQgb2JqZWN0J3MgbWV0aG9kIGRuZF9lbnRlcihzb3VyY2UsIGV2ZW50KSBpcyBjYWxsZWQuCisKK09uY2UgdGhpcyBpcyBkb25lLCB0aGUgbmV3IHRhcmdldCBvYmplY3QgcmVwbGFjZXMgdGhlIG9sZCBvbmUsIGFuZCB0aGUKK1RrIG1haW5sb29wIHByb2NlZWRzLiAgVGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgbWV0aG9kcyBtZW50aW9uZWQgYWJvdmUKK2lzIGlnbm9yZWQ7IGlmIHRoZXkgcmFpc2UgYW4gZXhjZXB0aW9uLCB0aGUgbm9ybWFsIGV4Y2VwdGlvbiBoYW5kbGluZworbWVjaGFuaXNtcyB0YWtlIG92ZXIuCisKK1RoZSBkcmFnLWFuZC1kcm9wIHByb2Nlc3NlcyBjYW4gZW5kIGluIHR3byB3YXlzOiBhIGZpbmFsIHRhcmdldCBvYmplY3QKK2lzIHNlbGVjdGVkLCBvciBubyBmaW5hbCB0YXJnZXQgb2JqZWN0IGlzIHNlbGVjdGVkLiAgV2hlbiBhIGZpbmFsCit0YXJnZXQgb2JqZWN0IGlzIHNlbGVjdGVkLCBpdCB3aWxsIGFsd2F5cyBoYXZlIGJlZW4gbm90aWZpZWQgb2YgdGhlCitwb3RlbnRpYWwgZHJvcCBieSBhIGNhbGwgdG8gaXRzIGRuZF9lbnRlcigpIG1ldGhvZCwgYXMgZGVzY3JpYmVkCithYm92ZSwgYW5kIHBvc3NpYmx5IG9uZSBvciBtb3JlIGNhbGxzIHRvIGl0cyBkbmRfbW90aW9uKCkgbWV0aG9kOyBpdHMKK2RuZF9sZWF2ZSgpIG1ldGhvZCBoYXMgbm90IGJlZW4gY2FsbGVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KK2RuZF9lbnRlcigpLiAgVGhlIHRhcmdldCBpcyBub3RpZmllZCBvZiB0aGUgZHJvcCBieSBhIGNhbGwgdG8gaXRzCittZXRob2QgZG5kX2NvbW1pdChzb3VyY2UsIGV2ZW50KS4KKworSWYgbm8gZmluYWwgdGFyZ2V0IG9iamVjdCBpcyBzZWxlY3RlZCwgYW5kIHRoZXJlIHdhcyBhbiBvbGQgdGFyZ2V0CitvYmplY3QsIGl0cyBkbmRfbGVhdmUoc291cmNlLCBldmVudCkgbWV0aG9kIGlzIGNhbGxlZCB0byBjb21wbGV0ZSB0aGUKK2RuZCBzZXF1ZW5jZS4KKworRmluYWxseSwgdGhlIHNvdXJjZSBvYmplY3QgaXMgbm90aWZpZWQgdGhhdCB0aGUgZHJhZy1hbmQtZHJvcCBwcm9jZXNzCitpcyBvdmVyLCBieSBhIGNhbGwgdG8gc291cmNlLmRuZF9lbmQodGFyZ2V0LCBldmVudCksIHNwZWNpZnlpbmcgZWl0aGVyCit0aGUgc2VsZWN0ZWQgdGFyZ2V0IG9iamVjdCwgb3IgTm9uZSBpZiBubyB0YXJnZXQgb2JqZWN0IHdhcyBzZWxlY3RlZC4KK1RoZSBzb3VyY2Ugb2JqZWN0IGNhbiB1c2UgdGhpcyB0byBpbXBsZW1lbnQgdGhlIGNvbW1pdCBhY3Rpb247IHRoaXMgaXMKK3NvbWV0aW1lcyBzaW1wbGVyIHRoYW4gdG8gZG8gaXQgaW4gdGhlIHRhcmdldCdzIGRuZF9jb21taXQoKS4gIFRoZQordGFyZ2V0J3MgZG5kX2NvbW1pdCgpIG1ldGhvZCBjb3VsZCB0aGVuIHNpbXBseSBiZSBhbGlhc2VkIHRvCitkbmRfbGVhdmUoKS4KKworQXQgYW55IHRpbWUgZHVyaW5nIGEgZG5kIHNlcXVlbmNlLCB0aGUgYXBwbGljYXRpb24gY2FuIGNhbmNlbCB0aGUKK3NlcXVlbmNlIGJ5IGNhbGxpbmcgdGhlIGNhbmNlbCgpIG1ldGhvZCBvbiB0aGUgb2JqZWN0IHJldHVybmVkIGJ5CitkbmRfc3RhcnQoKS4gIFRoaXMgd2lsbCBjYWxsIGRuZF9sZWF2ZSgpIGlmIGEgdGFyZ2V0IGlzIGN1cnJlbnRseQorYWN0aXZlOyBpdCB3aWxsIG5ldmVyIGNhbGwgZG5kX2NvbW1pdCgpLgorCisiIiIKKworCitpbXBvcnQgVGtpbnRlcgorCisKKyMgVGhlIGZhY3RvcnkgZnVuY3Rpb24KKworZGVmIGRuZF9zdGFydChzb3VyY2UsIGV2ZW50KToKKyAgICBoID0gRG5kSGFuZGxlcihzb3VyY2UsIGV2ZW50KQorICAgIGlmIGgucm9vdDoKKyAgICAgICAgcmV0dXJuIGgKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQorCisKKyMgVGhlIGNsYXNzIHRoYXQgZG9lcyB0aGUgd29yaworCitjbGFzcyBEbmRIYW5kbGVyOgorCisgICAgcm9vdCA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UsIGV2ZW50KToKKyAgICAgICAgaWYgZXZlbnQubnVtID4gNToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByb290ID0gZXZlbnQud2lkZ2V0Ll9yb290KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcm9vdC5fX2RuZAorICAgICAgICAgICAgcmV0dXJuICMgRG9uJ3Qgc3RhcnQgcmVjdXJzaXZlIGRuZAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByb290Ll9fZG5kID0gc2VsZgorICAgICAgICAgICAgc2VsZi5yb290ID0gcm9vdAorICAgICAgICBzZWxmLnNvdXJjZSA9IHNvdXJjZQorICAgICAgICBzZWxmLnRhcmdldCA9IE5vbmUKKyAgICAgICAgc2VsZi5pbml0aWFsX2J1dHRvbiA9IGJ1dHRvbiA9IGV2ZW50Lm51bQorICAgICAgICBzZWxmLmluaXRpYWxfd2lkZ2V0ID0gd2lkZ2V0ID0gZXZlbnQud2lkZ2V0CisgICAgICAgIHNlbGYucmVsZWFzZV9wYXR0ZXJuID0gIjxCJWQtQnV0dG9uUmVsZWFzZS0lZD4iICUgKGJ1dHRvbiwgYnV0dG9uKQorICAgICAgICBzZWxmLnNhdmVfY3Vyc29yID0gd2lkZ2V0WydjdXJzb3InXSBvciAiIgorICAgICAgICB3aWRnZXQuYmluZChzZWxmLnJlbGVhc2VfcGF0dGVybiwgc2VsZi5vbl9yZWxlYXNlKQorICAgICAgICB3aWRnZXQuYmluZCgiPE1vdGlvbj4iLCBzZWxmLm9uX21vdGlvbikKKyAgICAgICAgd2lkZ2V0WydjdXJzb3InXSA9ICJoYW5kMiIKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICByb290ID0gc2VsZi5yb290CisgICAgICAgIHNlbGYucm9vdCA9IE5vbmUKKyAgICAgICAgaWYgcm9vdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZWwgcm9vdC5fX2RuZAorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBvbl9tb3Rpb24oc2VsZiwgZXZlbnQpOgorICAgICAgICB4LCB5ID0gZXZlbnQueF9yb290LCBldmVudC55X3Jvb3QKKyAgICAgICAgdGFyZ2V0X3dpZGdldCA9IHNlbGYuaW5pdGlhbF93aWRnZXQud2luZm9fY29udGFpbmluZyh4LCB5KQorICAgICAgICBzb3VyY2UgPSBzZWxmLnNvdXJjZQorICAgICAgICBuZXdfdGFyZ2V0ID0gTm9uZQorICAgICAgICB3aGlsZSB0YXJnZXRfd2lkZ2V0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGF0dHIgPSB0YXJnZXRfd2lkZ2V0LmRuZF9hY2NlcHQKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld190YXJnZXQgPSBhdHRyKHNvdXJjZSwgZXZlbnQpCisgICAgICAgICAgICAgICAgaWYgbmV3X3RhcmdldDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRhcmdldF93aWRnZXQgPSB0YXJnZXRfd2lkZ2V0Lm1hc3RlcgorICAgICAgICBvbGRfdGFyZ2V0ID0gc2VsZi50YXJnZXQKKyAgICAgICAgaWYgb2xkX3RhcmdldCBpcyBuZXdfdGFyZ2V0OgorICAgICAgICAgICAgaWYgb2xkX3RhcmdldDoKKyAgICAgICAgICAgICAgICBvbGRfdGFyZ2V0LmRuZF9tb3Rpb24oc291cmNlLCBldmVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG9sZF90YXJnZXQ6CisgICAgICAgICAgICAgICAgc2VsZi50YXJnZXQgPSBOb25lCisgICAgICAgICAgICAgICAgb2xkX3RhcmdldC5kbmRfbGVhdmUoc291cmNlLCBldmVudCkKKyAgICAgICAgICAgIGlmIG5ld190YXJnZXQ6CisgICAgICAgICAgICAgICAgbmV3X3RhcmdldC5kbmRfZW50ZXIoc291cmNlLCBldmVudCkKKyAgICAgICAgICAgICAgICBzZWxmLnRhcmdldCA9IG5ld190YXJnZXQKKworICAgIGRlZiBvbl9yZWxlYXNlKHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi5maW5pc2goZXZlbnQsIDEpCisKKyAgICBkZWYgY2FuY2VsKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLmZpbmlzaChldmVudCwgMCkKKworICAgIGRlZiBmaW5pc2goc2VsZiwgZXZlbnQsIGNvbW1pdD0wKToKKyAgICAgICAgdGFyZ2V0ID0gc2VsZi50YXJnZXQKKyAgICAgICAgc291cmNlID0gc2VsZi5zb3VyY2UKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5pbml0aWFsX3dpZGdldAorICAgICAgICByb290ID0gc2VsZi5yb290CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCByb290Ll9fZG5kCisgICAgICAgICAgICBzZWxmLmluaXRpYWxfd2lkZ2V0LnVuYmluZChzZWxmLnJlbGVhc2VfcGF0dGVybikKKyAgICAgICAgICAgIHNlbGYuaW5pdGlhbF93aWRnZXQudW5iaW5kKCI8TW90aW9uPiIpCisgICAgICAgICAgICB3aWRnZXRbJ2N1cnNvciddID0gc2VsZi5zYXZlX2N1cnNvcgorICAgICAgICAgICAgc2VsZi50YXJnZXQgPSBzZWxmLnNvdXJjZSA9IHNlbGYuaW5pdGlhbF93aWRnZXQgPSBzZWxmLnJvb3QgPSBOb25lCisgICAgICAgICAgICBpZiB0YXJnZXQ6CisgICAgICAgICAgICAgICAgaWYgY29tbWl0OgorICAgICAgICAgICAgICAgICAgICB0YXJnZXQuZG5kX2NvbW1pdChzb3VyY2UsIGV2ZW50KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5kbmRfbGVhdmUoc291cmNlLCBldmVudCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvdXJjZS5kbmRfZW5kKHRhcmdldCwgZXZlbnQpCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIHJlc3QgaXMgaGVyZSBmb3IgdGVzdGluZyBhbmQgZGVtb25zdHJhdGlvbiBwdXJwb3NlcyBvbmx5IQorCitjbGFzcyBJY29uOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuY2FudmFzID0gc2VsZi5sYWJlbCA9IHNlbGYuaWQgPSBOb25lCisKKyAgICBkZWYgYXR0YWNoKHNlbGYsIGNhbnZhcywgeD0xMCwgeT0xMCk6CisgICAgICAgIGlmIGNhbnZhcyBpcyBzZWxmLmNhbnZhczoKKyAgICAgICAgICAgIHNlbGYuY2FudmFzLmNvb3JkcyhzZWxmLmlkLCB4LCB5KQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuY2FudmFzOgorICAgICAgICAgICAgc2VsZi5kZXRhY2goKQorICAgICAgICBpZiBub3QgY2FudmFzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGxhYmVsID0gVGtpbnRlci5MYWJlbChjYW52YXMsIHRleHQ9c2VsZi5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyd2lkdGg9MiwgcmVsaWVmPSJyYWlzZWQiKQorICAgICAgICBpZCA9IGNhbnZhcy5jcmVhdGVfd2luZG93KHgsIHksIHdpbmRvdz1sYWJlbCwgYW5jaG9yPSJudyIpCisgICAgICAgIHNlbGYuY2FudmFzID0gY2FudmFzCisgICAgICAgIHNlbGYubGFiZWwgPSBsYWJlbAorICAgICAgICBzZWxmLmlkID0gaWQKKyAgICAgICAgbGFiZWwuYmluZCgiPEJ1dHRvblByZXNzPiIsIHNlbGYucHJlc3MpCisKKyAgICBkZWYgZGV0YWNoKHNlbGYpOgorICAgICAgICBjYW52YXMgPSBzZWxmLmNhbnZhcworICAgICAgICBpZiBub3QgY2FudmFzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlkID0gc2VsZi5pZAorICAgICAgICBsYWJlbCA9IHNlbGYubGFiZWwKKyAgICAgICAgc2VsZi5jYW52YXMgPSBzZWxmLmxhYmVsID0gc2VsZi5pZCA9IE5vbmUKKyAgICAgICAgY2FudmFzLmRlbGV0ZShpZCkKKyAgICAgICAgbGFiZWwuZGVzdHJveSgpCisKKyAgICBkZWYgcHJlc3Moc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBkbmRfc3RhcnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAgICAgIyB3aGVyZSB0aGUgcG9pbnRlciBpcyByZWxhdGl2ZSB0byB0aGUgbGFiZWwgd2lkZ2V0OgorICAgICAgICAgICAgc2VsZi54X29mZiA9IGV2ZW50LngKKyAgICAgICAgICAgIHNlbGYueV9vZmYgPSBldmVudC55CisgICAgICAgICAgICAjIHdoZXJlIHRoZSB3aWRnZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGNhbnZhczoKKyAgICAgICAgICAgIHNlbGYueF9vcmlnLCBzZWxmLnlfb3JpZyA9IHNlbGYuY2FudmFzLmNvb3JkcyhzZWxmLmlkKQorCisgICAgZGVmIG1vdmUoc2VsZiwgZXZlbnQpOgorICAgICAgICB4LCB5ID0gc2VsZi53aGVyZShzZWxmLmNhbnZhcywgZXZlbnQpCisgICAgICAgIHNlbGYuY2FudmFzLmNvb3JkcyhzZWxmLmlkLCB4LCB5KQorCisgICAgZGVmIHB1dGJhY2soc2VsZik6CisgICAgICAgIHNlbGYuY2FudmFzLmNvb3JkcyhzZWxmLmlkLCBzZWxmLnhfb3JpZywgc2VsZi55X29yaWcpCisKKyAgICBkZWYgd2hlcmUoc2VsZiwgY2FudmFzLCBldmVudCk6CisgICAgICAgICMgd2hlcmUgdGhlIGNvcm5lciBvZiB0aGUgY2FudmFzIGlzIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW46CisgICAgICAgIHhfb3JnID0gY2FudmFzLndpbmZvX3Jvb3R4KCkKKyAgICAgICAgeV9vcmcgPSBjYW52YXMud2luZm9fcm9vdHkoKQorICAgICAgICAjIHdoZXJlIHRoZSBwb2ludGVyIGlzIHJlbGF0aXZlIHRvIHRoZSBjYW52YXMgd2lkZ2V0OgorICAgICAgICB4ID0gZXZlbnQueF9yb290IC0geF9vcmcKKyAgICAgICAgeSA9IGV2ZW50Lnlfcm9vdCAtIHlfb3JnCisgICAgICAgICMgY29tcGVuc2F0ZSBmb3IgaW5pdGlhbCBwb2ludGVyIG9mZnNldAorICAgICAgICByZXR1cm4geCAtIHNlbGYueF9vZmYsIHkgLSBzZWxmLnlfb2ZmCisKKyAgICBkZWYgZG5kX2VuZChzZWxmLCB0YXJnZXQsIGV2ZW50KToKKyAgICAgICAgcGFzcworCitjbGFzcyBUZXN0ZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCk6CisgICAgICAgIHNlbGYudG9wID0gVGtpbnRlci5Ub3BsZXZlbChyb290KQorICAgICAgICBzZWxmLmNhbnZhcyA9IFRraW50ZXIuQ2FudmFzKHNlbGYudG9wLCB3aWR0aD0xMDAsIGhlaWdodD0xMDApCisgICAgICAgIHNlbGYuY2FudmFzLnBhY2soZmlsbD0iYm90aCIsIGV4cGFuZD0xKQorICAgICAgICBzZWxmLmNhbnZhcy5kbmRfYWNjZXB0ID0gc2VsZi5kbmRfYWNjZXB0CisKKyAgICBkZWYgZG5kX2FjY2VwdChzZWxmLCBzb3VyY2UsIGV2ZW50KToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBkbmRfZW50ZXIoc2VsZiwgc291cmNlLCBldmVudCk6CisgICAgICAgIHNlbGYuY2FudmFzLmZvY3VzX3NldCgpICMgU2hvdyBoaWdobGlnaHQgYm9yZGVyCisgICAgICAgIHgsIHkgPSBzb3VyY2Uud2hlcmUoc2VsZi5jYW52YXMsIGV2ZW50KQorICAgICAgICB4MSwgeTEsIHgyLCB5MiA9IHNvdXJjZS5jYW52YXMuYmJveChzb3VyY2UuaWQpCisgICAgICAgIGR4LCBkeSA9IHgyLXgxLCB5Mi15MQorICAgICAgICBzZWxmLmRuZGlkID0gc2VsZi5jYW52YXMuY3JlYXRlX3JlY3RhbmdsZSh4LCB5LCB4K2R4LCB5K2R5KQorICAgICAgICBzZWxmLmRuZF9tb3Rpb24oc291cmNlLCBldmVudCkKKworICAgIGRlZiBkbmRfbW90aW9uKHNlbGYsIHNvdXJjZSwgZXZlbnQpOgorICAgICAgICB4LCB5ID0gc291cmNlLndoZXJlKHNlbGYuY2FudmFzLCBldmVudCkKKyAgICAgICAgeDEsIHkxLCB4MiwgeTIgPSBzZWxmLmNhbnZhcy5iYm94KHNlbGYuZG5kaWQpCisgICAgICAgIHNlbGYuY2FudmFzLm1vdmUoc2VsZi5kbmRpZCwgeC14MSwgeS15MSkKKworICAgIGRlZiBkbmRfbGVhdmUoc2VsZiwgc291cmNlLCBldmVudCk6CisgICAgICAgIHNlbGYudG9wLmZvY3VzX3NldCgpICMgSGlkZSBoaWdobGlnaHQgYm9yZGVyCisgICAgICAgIHNlbGYuY2FudmFzLmRlbGV0ZShzZWxmLmRuZGlkKQorICAgICAgICBzZWxmLmRuZGlkID0gTm9uZQorCisgICAgZGVmIGRuZF9jb21taXQoc2VsZiwgc291cmNlLCBldmVudCk6CisgICAgICAgIHNlbGYuZG5kX2xlYXZlKHNvdXJjZSwgZXZlbnQpCisgICAgICAgIHgsIHkgPSBzb3VyY2Uud2hlcmUoc2VsZi5jYW52YXMsIGV2ZW50KQorICAgICAgICBzb3VyY2UuYXR0YWNoKHNlbGYuY2FudmFzLCB4LCB5KQorCitkZWYgdGVzdCgpOgorICAgIHJvb3QgPSBUa2ludGVyLlRrKCkKKyAgICByb290Lmdlb21ldHJ5KCIrMSsxIikKKyAgICBUa2ludGVyLkJ1dHRvbihjb21tYW5kPXJvb3QucXVpdCwgdGV4dD0iUXVpdCIpLnBhY2soKQorICAgIHQxID0gVGVzdGVyKHJvb3QpCisgICAgdDEudG9wLmdlb21ldHJ5KCIrMSs2MCIpCisgICAgdDIgPSBUZXN0ZXIocm9vdCkKKyAgICB0Mi50b3AuZ2VvbWV0cnkoIisxMjArNjAiKQorICAgIHQzID0gVGVzdGVyKHJvb3QpCisgICAgdDMudG9wLmdlb21ldHJ5KCIrMjQwKzYwIikKKyAgICBpMSA9IEljb24oIklDT04xIikKKyAgICBpMiA9IEljb24oIklDT04yIikKKyAgICBpMyA9IEljb24oIklDT04zIikKKyAgICBpMS5hdHRhY2godDEuY2FudmFzKQorICAgIGkyLmF0dGFjaCh0Mi5jYW52YXMpCisgICAgaTMuYXR0YWNoKHQzLmNhbnZhcykKKyAgICByb290Lm1haW5sb29wKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL1RrZG5kLnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL1RrZG5kLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTlkNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGtkbmQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL1RrZG5kLnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL1RrZG5kLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTlkNTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGtkbmQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL1RraW50ZXIucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2ludGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYjMyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2ludGVyLnB5CkBAIC0wLDAgKzEsMzc5NSBAQAorIiIiV3JhcHBlciBmdW5jdGlvbnMgZm9yIFRjbC9Uay4KKworVGtpbnRlciBwcm92aWRlcyBjbGFzc2VzIHdoaWNoIGFsbG93IHRoZSBkaXNwbGF5LCBwb3NpdGlvbmluZyBhbmQKK2NvbnRyb2wgb2Ygd2lkZ2V0cy4gVG9wbGV2ZWwgd2lkZ2V0cyBhcmUgVGsgYW5kIFRvcGxldmVsLiBPdGhlcgord2lkZ2V0cyBhcmUgRnJhbWUsIExhYmVsLCBFbnRyeSwgVGV4dCwgQ2FudmFzLCBCdXR0b24sIFJhZGlvYnV0dG9uLAorQ2hlY2tidXR0b24sIFNjYWxlLCBMaXN0Ym94LCBTY3JvbGxiYXIsIE9wdGlvbk1lbnUsIFNwaW5ib3gKK0xhYmVsRnJhbWUgYW5kIFBhbmVkV2luZG93LgorCitQcm9wZXJ0aWVzIG9mIHRoZSB3aWRnZXRzIGFyZSBzcGVjaWZpZWQgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cy4KK0tleXdvcmQgYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY29ycmVzcG9uZGluZyByZXNvdXJjZQordW5kZXIgVGsuCisKK1dpZGdldHMgYXJlIHBvc2l0aW9uZWQgd2l0aCBvbmUgb2YgdGhlIGdlb21ldHJ5IG1hbmFnZXJzIFBsYWNlLCBQYWNrCitvciBHcmlkLiBUaGVzZSBtYW5hZ2VycyBjYW4gYmUgY2FsbGVkIHdpdGggbWV0aG9kcyBwbGFjZSwgcGFjaywgZ3JpZAorYXZhaWxhYmxlIGluIGV2ZXJ5IFdpZGdldC4KKworQWN0aW9ucyBhcmUgYm91bmQgdG8gZXZlbnRzIGJ5IHJlc291cmNlcyAoZS5nLiBrZXl3b3JkIGFyZ3VtZW50Citjb21tYW5kKSBvciB3aXRoIHRoZSBtZXRob2QgYmluZC4KKworRXhhbXBsZSAoSGVsbG8sIFdvcmxkKToKK2ltcG9ydCBUa2ludGVyCitmcm9tIFRrY29uc3RhbnRzIGltcG9ydCAqCit0ayA9IFRraW50ZXIuVGsoKQorZnJhbWUgPSBUa2ludGVyLkZyYW1lKHRrLCByZWxpZWY9UklER0UsIGJvcmRlcndpZHRoPTIpCitmcmFtZS5wYWNrKGZpbGw9Qk9USCxleHBhbmQ9MSkKK2xhYmVsID0gVGtpbnRlci5MYWJlbChmcmFtZSwgdGV4dD0iSGVsbG8sIFdvcmxkIikKK2xhYmVsLnBhY2soZmlsbD1YLCBleHBhbmQ9MSkKK2J1dHRvbiA9IFRraW50ZXIuQnV0dG9uKGZyYW1lLHRleHQ9IkV4aXQiLGNvbW1hbmQ9dGsuZGVzdHJveSkKK2J1dHRvbi5wYWNrKHNpZGU9Qk9UVE9NKQordGsubWFpbmxvb3AoKQorIiIiCisKK19fdmVyc2lvbl9fID0gIiRSZXZpc2lvbjogODEwMDggJCIKKworaW1wb3J0IHN5cworaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgIyBBdHRlbXB0IHRvIGNvbmZpZ3VyZSBUY2wvVGsgd2l0aG91dCByZXF1aXJpbmcgUEFUSAorICAgIGltcG9ydCBGaXhUaworaW1wb3J0IF90a2ludGVyICMgSWYgdGhpcyBmYWlscyB5b3VyIFB5dGhvbiBtYXkgbm90IGJlIGNvbmZpZ3VyZWQgZm9yIFRrCit0a2ludGVyID0gX3RraW50ZXIgIyBiL3cgY29tcGF0IGZvciBleHBvcnQKK1RjbEVycm9yID0gX3RraW50ZXIuVGNsRXJyb3IKK2Zyb20gdHlwZXMgaW1wb3J0ICoKK2Zyb20gVGtjb25zdGFudHMgaW1wb3J0ICoKK2ltcG9ydCByZQorCit3YW50b2JqZWN0cyA9IDEKKworVGtWZXJzaW9uID0gZmxvYXQoX3RraW50ZXIuVEtfVkVSU0lPTikKK1RjbFZlcnNpb24gPSBmbG9hdChfdGtpbnRlci5UQ0xfVkVSU0lPTikKKworUkVBREFCTEUgPSBfdGtpbnRlci5SRUFEQUJMRQorV1JJVEFCTEUgPSBfdGtpbnRlci5XUklUQUJMRQorRVhDRVBUSU9OID0gX3RraW50ZXIuRVhDRVBUSU9OCisKKyMgVGhlc2UgYXJlIG5vdCBhbHdheXMgZGVmaW5lZCwgZS5nLiBub3Qgb24gV2luMzIgd2l0aCBUayA4LjAgOi0oCit0cnk6IF90a2ludGVyLmNyZWF0ZWZpbGVoYW5kbGVyCitleGNlcHQgQXR0cmlidXRlRXJyb3I6IF90a2ludGVyLmNyZWF0ZWZpbGVoYW5kbGVyID0gTm9uZQordHJ5OiBfdGtpbnRlci5kZWxldGVmaWxlaGFuZGxlcgorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiBfdGtpbnRlci5kZWxldGVmaWxlaGFuZGxlciA9IE5vbmUKKworCitfbWFnaWNfcmUgPSByZS5jb21waWxlKHInKFtcXHt9XSknKQorX3NwYWNlX3JlID0gcmUuY29tcGlsZShyJyhbXHNdKScpCisKK2RlZiBfam9pbih2YWx1ZSk6CisgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgcmV0dXJuICcgJy5qb2luKG1hcChfc3RyaW5naWZ5LCB2YWx1ZSkpCisKK2RlZiBfc3RyaW5naWZ5KHZhbHVlKToKKyAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgaWYgbGVuKHZhbHVlKSA9PSAxOgorICAgICAgICAgICAgdmFsdWUgPSBfc3RyaW5naWZ5KHZhbHVlWzBdKQorICAgICAgICAgICAgaWYgdmFsdWVbMF0gPT0gJ3snOgorICAgICAgICAgICAgICAgIHZhbHVlID0gJ3slc30nICUgdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlID0gJ3slc30nICUgX2pvaW4odmFsdWUpCisgICAgZWxzZToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICB2YWx1ZSA9IHVuaWNvZGUodmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWx1ZSA9IHN0cih2YWx1ZSkKKyAgICAgICAgaWYgbm90IHZhbHVlOgorICAgICAgICAgICAgdmFsdWUgPSAne30nCisgICAgICAgIGVsaWYgX21hZ2ljX3JlLnNlYXJjaCh2YWx1ZSk6CisgICAgICAgICAgICAjIGFkZCAnXCcgYmVmb3JlIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgc3BhY2VzCisgICAgICAgICAgICB2YWx1ZSA9IF9tYWdpY19yZS5zdWIocidcXFwxJywgdmFsdWUpCisgICAgICAgICAgICB2YWx1ZSA9IF9zcGFjZV9yZS5zdWIocidcXFwxJywgdmFsdWUpCisgICAgICAgIGVsaWYgdmFsdWVbMF0gPT0gJyInIG9yIF9zcGFjZV9yZS5zZWFyY2godmFsdWUpOgorICAgICAgICAgICAgdmFsdWUgPSAneyVzfScgJSB2YWx1ZQorICAgIHJldHVybiB2YWx1ZQorCitkZWYgX2ZsYXR0ZW4odHVwbGUpOgorICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgIHJlcyA9ICgpCisgICAgZm9yIGl0ZW0gaW4gdHVwbGU6CisgICAgICAgIGlmIHR5cGUoaXRlbSkgaW4gKFR1cGxlVHlwZSwgTGlzdFR5cGUpOgorICAgICAgICAgICAgcmVzID0gcmVzICsgX2ZsYXR0ZW4oaXRlbSkKKyAgICAgICAgZWxpZiBpdGVtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmVzID0gcmVzICsgKGl0ZW0sKQorICAgIHJldHVybiByZXMKKwordHJ5OiBfZmxhdHRlbiA9IF90a2ludGVyLl9mbGF0dGVuCitleGNlcHQgQXR0cmlidXRlRXJyb3I6IHBhc3MKKworZGVmIF9jbmZtZXJnZShjbmZzKToKKyAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICBpZiB0eXBlKGNuZnMpIGlzIERpY3Rpb25hcnlUeXBlOgorICAgICAgICByZXR1cm4gY25mcworICAgIGVsaWYgdHlwZShjbmZzKSBpbiAoTm9uZVR5cGUsIFN0cmluZ1R5cGUpOgorICAgICAgICByZXR1cm4gY25mcworICAgIGVsc2U6CisgICAgICAgIGNuZiA9IHt9CisgICAgICAgIGZvciBjIGluIF9mbGF0dGVuKGNuZnMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNuZi51cGRhdGUoYykKKyAgICAgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvciksIG1zZzoKKyAgICAgICAgICAgICAgICBwcmludCAiX2NuZm1lcmdlOiBmYWxsYmFjayBkdWUgdG86IiwgbXNnCisgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gYy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBjbmZba10gPSB2CisgICAgICAgIHJldHVybiBjbmYKKwordHJ5OiBfY25mbWVyZ2UgPSBfdGtpbnRlci5fY25mbWVyZ2UKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjogcGFzcworCitjbGFzcyBFdmVudDoKKyAgICAiIiJDb250YWluZXIgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIGV2ZW50LgorCisgICAgSW5zdGFuY2VzIG9mIHRoaXMgdHlwZSBhcmUgZ2VuZXJhdGVkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGV2ZW50cyBvY2N1cnM6CisKKyAgICBLZXlQcmVzcywgS2V5UmVsZWFzZSAtIGZvciBrZXlib2FyZCBldmVudHMKKyAgICBCdXR0b25QcmVzcywgQnV0dG9uUmVsZWFzZSwgTW90aW9uLCBFbnRlciwgTGVhdmUsIE1vdXNlV2hlZWwgLSBmb3IgbW91c2UgZXZlbnRzCisgICAgVmlzaWJpbGl0eSwgVW5tYXAsIE1hcCwgRXhwb3NlLCBGb2N1c0luLCBGb2N1c091dCwgQ2lyY3VsYXRlLAorICAgIENvbG9ybWFwLCBHcmF2aXR5LCBSZXBhcmVudCwgUHJvcGVydHksIERlc3Ryb3ksIEFjdGl2YXRlLAorICAgIERlYWN0aXZhdGUgLSBmb3Igd2luZG93IGV2ZW50cy4KKworICAgIElmIGEgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIG9uZSBvZiB0aGVzZSBldmVudHMgaXMgcmVnaXN0ZXJlZAorICAgIHVzaW5nIGJpbmQsIGJpbmRfYWxsLCBiaW5kX2NsYXNzLCBvciB0YWdfYmluZCwgdGhlIGNhbGxiYWNrIGlzCisgICAgY2FsbGVkIHdpdGggYW4gRXZlbnQgYXMgZmlyc3QgYXJndW1lbnQuIEl0IHdpbGwgaGF2ZSB0aGUKKyAgICBmb2xsb3dpbmcgYXR0cmlidXRlcyAoaW4gYnJhY2VzIGFyZSB0aGUgZXZlbnQgdHlwZXMgZm9yIHdoaWNoCisgICAgdGhlIGF0dHJpYnV0ZSBpcyB2YWxpZCk6CisKKyAgICAgICAgc2VyaWFsIC0gc2VyaWFsIG51bWJlciBvZiBldmVudAorICAgIG51bSAtIG1vdXNlIGJ1dHRvbiBwcmVzc2VkIChCdXR0b25QcmVzcywgQnV0dG9uUmVsZWFzZSkKKyAgICBmb2N1cyAtIHdoZXRoZXIgdGhlIHdpbmRvdyBoYXMgdGhlIGZvY3VzIChFbnRlciwgTGVhdmUpCisgICAgaGVpZ2h0IC0gaGVpZ2h0IG9mIHRoZSBleHBvc2VkIHdpbmRvdyAoQ29uZmlndXJlLCBFeHBvc2UpCisgICAgd2lkdGggLSB3aWR0aCBvZiB0aGUgZXhwb3NlZCB3aW5kb3cgKENvbmZpZ3VyZSwgRXhwb3NlKQorICAgIGtleWNvZGUgLSBrZXljb2RlIG9mIHRoZSBwcmVzc2VkIGtleSAoS2V5UHJlc3MsIEtleVJlbGVhc2UpCisgICAgc3RhdGUgLSBzdGF0ZSBvZiB0aGUgZXZlbnQgYXMgYSBudW1iZXIgKEJ1dHRvblByZXNzLCBCdXR0b25SZWxlYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGVyLCBLZXlQcmVzcywgS2V5UmVsZWFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWF2ZSwgTW90aW9uKQorICAgIHN0YXRlIC0gc3RhdGUgYXMgYSBzdHJpbmcgKFZpc2liaWxpdHkpCisgICAgdGltZSAtIHdoZW4gdGhlIGV2ZW50IG9jY3VycmVkCisgICAgeCAtIHgtcG9zaXRpb24gb2YgdGhlIG1vdXNlCisgICAgeSAtIHktcG9zaXRpb24gb2YgdGhlIG1vdXNlCisgICAgeF9yb290IC0geC1wb3NpdGlvbiBvZiB0aGUgbW91c2Ugb24gdGhlIHNjcmVlbgorICAgICAgICAgICAgIChCdXR0b25QcmVzcywgQnV0dG9uUmVsZWFzZSwgS2V5UHJlc3MsIEtleVJlbGVhc2UsIE1vdGlvbikKKyAgICB5X3Jvb3QgLSB5LXBvc2l0aW9uIG9mIHRoZSBtb3VzZSBvbiB0aGUgc2NyZWVuCisgICAgICAgICAgICAgKEJ1dHRvblByZXNzLCBCdXR0b25SZWxlYXNlLCBLZXlQcmVzcywgS2V5UmVsZWFzZSwgTW90aW9uKQorICAgIGNoYXIgLSBwcmVzc2VkIGNoYXJhY3RlciAoS2V5UHJlc3MsIEtleVJlbGVhc2UpCisgICAgc2VuZF9ldmVudCAtIHNlZSBYL1dpbmRvd3MgZG9jdW1lbnRhdGlvbgorICAgIGtleXN5bSAtIGtleXN5bSBvZiB0aGUgZXZlbnQgYXMgYSBzdHJpbmcgKEtleVByZXNzLCBLZXlSZWxlYXNlKQorICAgIGtleXN5bV9udW0gLSBrZXlzeW0gb2YgdGhlIGV2ZW50IGFzIGEgbnVtYmVyIChLZXlQcmVzcywgS2V5UmVsZWFzZSkKKyAgICB0eXBlIC0gdHlwZSBvZiB0aGUgZXZlbnQgYXMgYSBudW1iZXIKKyAgICB3aWRnZXQgLSB3aWRnZXQgaW4gd2hpY2ggdGhlIGV2ZW50IG9jY3VycmVkCisgICAgZGVsdGEgLSBkZWx0YSBvZiB3aGVlbCBtb3ZlbWVudCAoTW91c2VXaGVlbCkKKyAgICAiIiIKKyAgICBwYXNzCisKK19zdXBwb3J0X2RlZmF1bHRfcm9vdCA9IDEKK19kZWZhdWx0X3Jvb3QgPSBOb25lCisKK2RlZiBOb0RlZmF1bHRSb290KCk6CisgICAgIiIiSW5oaWJpdCBzZXR0aW5nIG9mIGRlZmF1bHQgcm9vdCB3aW5kb3cuCisKKyAgICBDYWxsIHRoaXMgZnVuY3Rpb24gdG8gaW5oaWJpdCB0aGF0IHRoZSBmaXJzdCBpbnN0YW5jZSBvZgorICAgIFRrIGlzIHVzZWQgZm9yIHdpbmRvd3Mgd2l0aG91dCBhbiBleHBsaWNpdCBwYXJlbnQgd2luZG93LgorICAgICIiIgorICAgIGdsb2JhbCBfc3VwcG9ydF9kZWZhdWx0X3Jvb3QKKyAgICBfc3VwcG9ydF9kZWZhdWx0X3Jvb3QgPSAwCisgICAgZ2xvYmFsIF9kZWZhdWx0X3Jvb3QKKyAgICBfZGVmYXVsdF9yb290ID0gTm9uZQorICAgIGRlbCBfZGVmYXVsdF9yb290CisKK2RlZiBfdGtlcnJvcihlcnIpOgorICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgIHBhc3MKKworZGVmIF9leGl0KGNvZGU9MCk6CisgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIENhbGxpbmcgaXQgd2lsbCByYWlzZSB0aGUgZXhjZXB0aW9uIFN5c3RlbUV4aXQuIiIiCisgICAgdHJ5OgorICAgICAgICBjb2RlID0gaW50KGNvZGUpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICByYWlzZSBTeXN0ZW1FeGl0LCBjb2RlCisKK192YXJudW0gPSAwCitjbGFzcyBWYXJpYWJsZToKKyAgICAiIiJDbGFzcyB0byBkZWZpbmUgdmFsdWUgaG9sZGVycyBmb3IgZS5nLiBidXR0b25zLgorCisgICAgU3ViY2xhc3NlcyBTdHJpbmdWYXIsIEludFZhciwgRG91YmxlVmFyLCBCb29sZWFuVmFyIGFyZSBzcGVjaWFsaXphdGlvbnMKKyAgICB0aGF0IGNvbnN0cmFpbiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBnZXQoKS4iIiIKKyAgICBfZGVmYXVsdCA9ICIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCB2YWx1ZT1Ob25lLCBuYW1lPU5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSB2YXJpYWJsZQorCisgICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4KKyAgICAgICAgVkFMVUUgaXMgYW4gb3B0aW9uYWwgdmFsdWUgKGRlZmF1bHRzIHRvICIiKQorICAgICAgICBOQU1FIGlzIGFuIG9wdGlvbmFsIFRjbCBuYW1lIChkZWZhdWx0cyB0byBQWV9WQVJudW0pLgorCisgICAgICAgIElmIE5BTUUgbWF0Y2hlcyBhbiBleGlzdGluZyB2YXJpYWJsZSBhbmQgVkFMVUUgaXMgb21pdHRlZAorICAgICAgICB0aGVuIHRoZSBleGlzdGluZyB2YWx1ZSBpcyByZXRhaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIGdsb2JhbCBfdmFybnVtCisgICAgICAgIGlmIG5vdCBtYXN0ZXI6CisgICAgICAgICAgICBtYXN0ZXIgPSBfZGVmYXVsdF9yb290CisgICAgICAgIHNlbGYuX21hc3RlciA9IG1hc3RlcgorICAgICAgICBzZWxmLl90ayA9IG1hc3Rlci50aworICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX25hbWUgPSAnUFlfVkFSJyArIHJlcHIoX3Zhcm51bSkKKyAgICAgICAgICAgIF92YXJudW0gKz0gMQorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2V0KHZhbHVlKQorICAgICAgICBlbGlmIG5vdCBzZWxmLl90ay5jYWxsKCJpbmZvIiwgImV4aXN0cyIsIHNlbGYuX25hbWUpOgorICAgICAgICAgICAgc2VsZi5zZXQoc2VsZi5fZGVmYXVsdCkKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgIiIiVW5zZXQgdGhlIHZhcmlhYmxlIGluIFRjbC4iIiIKKyAgICAgICAgc2VsZi5fdGsuZ2xvYmFsdW5zZXR2YXIoc2VsZi5fbmFtZSkKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBpbiBUY2wuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisgICAgZGVmIHNldChzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIlNldCB0aGUgdmFyaWFibGUgdG8gVkFMVUUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl90ay5nbG9iYWxzZXR2YXIoc2VsZi5fbmFtZSwgdmFsdWUpCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHZhbHVlIG9mIHZhcmlhYmxlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fdGsuZ2xvYmFsZ2V0dmFyKHNlbGYuX25hbWUpCisgICAgZGVmIHRyYWNlX3ZhcmlhYmxlKHNlbGYsIG1vZGUsIGNhbGxiYWNrKToKKyAgICAgICAgIiIiRGVmaW5lIGEgdHJhY2UgY2FsbGJhY2sgZm9yIHRoZSB2YXJpYWJsZS4KKworICAgICAgICBNT0RFIGlzIG9uZSBvZiAiciIsICJ3IiwgInUiIGZvciByZWFkLCB3cml0ZSwgdW5kZWZpbmUuCisgICAgICAgIENBTExCQUNLIG11c3QgYmUgYSBmdW5jdGlvbiB3aGljaCBpcyBjYWxsZWQgd2hlbgorICAgICAgICB0aGUgdmFyaWFibGUgaXMgcmVhZCwgd3JpdHRlbiBvciB1bmRlZmluZWQuCisKKyAgICAgICAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjYWxsYmFjay4KKyAgICAgICAgIiIiCisgICAgICAgIGNibmFtZSA9IHNlbGYuX21hc3Rlci5fcmVnaXN0ZXIoY2FsbGJhY2spCisgICAgICAgIHNlbGYuX3RrLmNhbGwoInRyYWNlIiwgInZhcmlhYmxlIiwgc2VsZi5fbmFtZSwgbW9kZSwgY2JuYW1lKQorICAgICAgICByZXR1cm4gY2JuYW1lCisgICAgdHJhY2UgPSB0cmFjZV92YXJpYWJsZQorICAgIGRlZiB0cmFjZV92ZGVsZXRlKHNlbGYsIG1vZGUsIGNibmFtZSk6CisgICAgICAgICIiIkRlbGV0ZSB0aGUgdHJhY2UgY2FsbGJhY2sgZm9yIGEgdmFyaWFibGUuCisKKyAgICAgICAgTU9ERSBpcyBvbmUgb2YgInIiLCAidyIsICJ1IiBmb3IgcmVhZCwgd3JpdGUsIHVuZGVmaW5lLgorICAgICAgICBDQk5BTUUgaXMgdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrIHJldHVybmVkIGZyb20gdHJhY2VfdmFyaWFibGUgb3IgdHJhY2UuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl90ay5jYWxsKCJ0cmFjZSIsICJ2ZGVsZXRlIiwgc2VsZi5fbmFtZSwgbW9kZSwgY2JuYW1lKQorICAgICAgICBzZWxmLl9tYXN0ZXIuZGVsZXRlY29tbWFuZChjYm5hbWUpCisgICAgZGVmIHRyYWNlX3ZpbmZvKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYWxsIHRyYWNlIGNhbGxiYWNrIGluZm9ybWF0aW9uLiIiIgorICAgICAgICByZXR1cm4gbWFwKHNlbGYuX3RrLnNwbGl0LCBzZWxmLl90ay5zcGxpdGxpc3QoCisgICAgICAgICAgICBzZWxmLl90ay5jYWxsKCJ0cmFjZSIsICJ2aW5mbyIsIHNlbGYuX25hbWUpKSkKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQ29tcGFyaXNvbiBmb3IgZXF1YWxpdHkgKD09KS4KKworICAgICAgICBOb3RlOiBpZiB0aGUgVmFyaWFibGUncyBtYXN0ZXIgbWF0dGVycyB0byBiZWhhdmlvcgorICAgICAgICBhbHNvIGNvbXBhcmUgc2VsZi5fbWFzdGVyID09IG90aGVyLl9tYXN0ZXIKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyA9PSBvdGhlci5fX2NsYXNzX18uX19uYW1lX18gXAorICAgICAgICAgICAgYW5kIHNlbGYuX25hbWUgPT0gb3RoZXIuX25hbWUKKworY2xhc3MgU3RyaW5nVmFyKFZhcmlhYmxlKToKKyAgICAiIiJWYWx1ZSBob2xkZXIgZm9yIHN0cmluZ3MgdmFyaWFibGVzLiIiIgorICAgIF9kZWZhdWx0ID0gIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHZhbHVlPU5vbmUsIG5hbWU9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIHN0cmluZyB2YXJpYWJsZS4KKworICAgICAgICBNQVNURVIgY2FuIGJlIGdpdmVuIGFzIG1hc3RlciB3aWRnZXQuCisgICAgICAgIFZBTFVFIGlzIGFuIG9wdGlvbmFsIHZhbHVlIChkZWZhdWx0cyB0byAiIikKKyAgICAgICAgTkFNRSBpcyBhbiBvcHRpb25hbCBUY2wgbmFtZSAoZGVmYXVsdHMgdG8gUFlfVkFSbnVtKS4KKworICAgICAgICBJZiBOQU1FIG1hdGNoZXMgYW4gZXhpc3RpbmcgdmFyaWFibGUgYW5kIFZBTFVFIGlzIG9taXR0ZWQKKyAgICAgICAgdGhlbiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgcmV0YWluZWQuCisgICAgICAgICIiIgorICAgICAgICBWYXJpYWJsZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHZhbHVlLCBuYW1lKQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHZhbHVlIG9mIHZhcmlhYmxlIGFzIHN0cmluZy4iIiIKKyAgICAgICAgdmFsdWUgPSBzZWxmLl90ay5nbG9iYWxnZXR2YXIoc2VsZi5fbmFtZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0dXJuIHN0cih2YWx1ZSkKKworY2xhc3MgSW50VmFyKFZhcmlhYmxlKToKKyAgICAiIiJWYWx1ZSBob2xkZXIgZm9yIGludGVnZXIgdmFyaWFibGVzLiIiIgorICAgIF9kZWZhdWx0ID0gMAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgdmFsdWU9Tm9uZSwgbmFtZT1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGFuIGludGVnZXIgdmFyaWFibGUuCisKKyAgICAgICAgTUFTVEVSIGNhbiBiZSBnaXZlbiBhcyBtYXN0ZXIgd2lkZ2V0LgorICAgICAgICBWQUxVRSBpcyBhbiBvcHRpb25hbCB2YWx1ZSAoZGVmYXVsdHMgdG8gMCkKKyAgICAgICAgTkFNRSBpcyBhbiBvcHRpb25hbCBUY2wgbmFtZSAoZGVmYXVsdHMgdG8gUFlfVkFSbnVtKS4KKworICAgICAgICBJZiBOQU1FIG1hdGNoZXMgYW4gZXhpc3RpbmcgdmFyaWFibGUgYW5kIFZBTFVFIGlzIG9taXR0ZWQKKyAgICAgICAgdGhlbiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgcmV0YWluZWQuCisgICAgICAgICIiIgorICAgICAgICBWYXJpYWJsZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHZhbHVlLCBuYW1lKQorCisgICAgZGVmIHNldChzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIlNldCB0aGUgdmFyaWFibGUgdG8gdmFsdWUsIGNvbnZlcnRpbmcgYm9vbGVhbnMgdG8gaW50ZWdlcnMuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGJvb2wpOgorICAgICAgICAgICAgdmFsdWUgPSBpbnQodmFsdWUpCisgICAgICAgIHJldHVybiBWYXJpYWJsZS5zZXQoc2VsZiwgdmFsdWUpCisKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBhcyBhbiBpbnRlZ2VyLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KHNlbGYuX3RrLmdsb2JhbGdldHZhcihzZWxmLl9uYW1lKSkKKworY2xhc3MgRG91YmxlVmFyKFZhcmlhYmxlKToKKyAgICAiIiJWYWx1ZSBob2xkZXIgZm9yIGZsb2F0IHZhcmlhYmxlcy4iIiIKKyAgICBfZGVmYXVsdCA9IDAuMAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgdmFsdWU9Tm9uZSwgbmFtZT1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgZmxvYXQgdmFyaWFibGUuCisKKyAgICAgICAgTUFTVEVSIGNhbiBiZSBnaXZlbiBhcyBtYXN0ZXIgd2lkZ2V0LgorICAgICAgICBWQUxVRSBpcyBhbiBvcHRpb25hbCB2YWx1ZSAoZGVmYXVsdHMgdG8gMC4wKQorICAgICAgICBOQU1FIGlzIGFuIG9wdGlvbmFsIFRjbCBuYW1lIChkZWZhdWx0cyB0byBQWV9WQVJudW0pLgorCisgICAgICAgIElmIE5BTUUgbWF0Y2hlcyBhbiBleGlzdGluZyB2YXJpYWJsZSBhbmQgVkFMVUUgaXMgb21pdHRlZAorICAgICAgICB0aGVuIHRoZSBleGlzdGluZyB2YWx1ZSBpcyByZXRhaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIFZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFsdWUsIG5hbWUpCisKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBhcyBhIGZsb2F0LiIiIgorICAgICAgICByZXR1cm4gZ2V0ZG91YmxlKHNlbGYuX3RrLmdsb2JhbGdldHZhcihzZWxmLl9uYW1lKSkKKworY2xhc3MgQm9vbGVhblZhcihWYXJpYWJsZSk6CisgICAgIiIiVmFsdWUgaG9sZGVyIGZvciBib29sZWFuIHZhcmlhYmxlcy4iIiIKKyAgICBfZGVmYXVsdCA9IEZhbHNlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCB2YWx1ZT1Ob25lLCBuYW1lPU5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBib29sZWFuIHZhcmlhYmxlLgorCisgICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4KKyAgICAgICAgVkFMVUUgaXMgYW4gb3B0aW9uYWwgdmFsdWUgKGRlZmF1bHRzIHRvIEZhbHNlKQorICAgICAgICBOQU1FIGlzIGFuIG9wdGlvbmFsIFRjbCBuYW1lIChkZWZhdWx0cyB0byBQWV9WQVJudW0pLgorCisgICAgICAgIElmIE5BTUUgbWF0Y2hlcyBhbiBleGlzdGluZyB2YXJpYWJsZSBhbmQgVkFMVUUgaXMgb21pdHRlZAorICAgICAgICB0aGVuIHRoZSBleGlzdGluZyB2YWx1ZSBpcyByZXRhaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIFZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFsdWUsIG5hbWUpCisKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBhcyBhIGJvb2wuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl90ay5nZXRib29sZWFuKHNlbGYuX3RrLmdsb2JhbGdldHZhcihzZWxmLl9uYW1lKSkKKworZGVmIG1haW5sb29wKG49MCk6CisgICAgIiIiUnVuIHRoZSBtYWluIGxvb3Agb2YgVGNsLiIiIgorICAgIF9kZWZhdWx0X3Jvb3QudGsubWFpbmxvb3AobikKKworZ2V0aW50ID0gaW50CisKK2dldGRvdWJsZSA9IGZsb2F0CisKK2RlZiBnZXRib29sZWFuKHMpOgorICAgICIiIkNvbnZlcnQgdHJ1ZSBhbmQgZmFsc2UgdG8gaW50ZWdlciB2YWx1ZXMgMSBhbmQgMC4iIiIKKyAgICByZXR1cm4gX2RlZmF1bHRfcm9vdC50ay5nZXRib29sZWFuKHMpCisKKyMgTWV0aG9kcyBkZWZpbmVkIG9uIGJvdGggdG9wbGV2ZWwgYW5kIGludGVyaW9yIHdpZGdldHMKK2NsYXNzIE1pc2M6CisgICAgIiIiSW50ZXJuYWwgY2xhc3MuCisKKyAgICBCYXNlIGNsYXNzIHdoaWNoIGRlZmluZXMgbWV0aG9kcyBjb21tb24gZm9yIGludGVyaW9yIHdpZGdldHMuIiIiCisKKyAgICAjIFhYWCBmb250IGNvbW1hbmQ/CisgICAgX3RjbENvbW1hbmRzID0gTm9uZQorICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4KKworICAgICAgICBEZWxldGUgYWxsIFRjbCBjb21tYW5kcyBjcmVhdGVkIGZvcgorICAgICAgICB0aGlzIHdpZGdldCBpbiB0aGUgVGNsIGludGVycHJldGVyLiIiIgorICAgICAgICBpZiBzZWxmLl90Y2xDb21tYW5kcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBuYW1lIGluIHNlbGYuX3RjbENvbW1hbmRzOgorICAgICAgICAgICAgICAgICNwcmludCAnLSBUa2ludGVyOiBkZWxldGVkIGNvbW1hbmQnLCBuYW1lCisgICAgICAgICAgICAgICAgc2VsZi50ay5kZWxldGVjb21tYW5kKG5hbWUpCisgICAgICAgICAgICBzZWxmLl90Y2xDb21tYW5kcyA9IE5vbmUKKyAgICBkZWYgZGVsZXRlY29tbWFuZChzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uCisKKyAgICAgICAgRGVsZXRlIHRoZSBUY2wgY29tbWFuZCBwcm92aWRlZCBpbiBOQU1FLiIiIgorICAgICAgICAjcHJpbnQgJy0gVGtpbnRlcjogZGVsZXRlZCBjb21tYW5kJywgbmFtZQorICAgICAgICBzZWxmLnRrLmRlbGV0ZWNvbW1hbmQobmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMucmVtb3ZlKG5hbWUpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgIGRlZiB0a19zdHJpY3RNb3RpZihzZWxmLCBib29sZWFuPU5vbmUpOgorICAgICAgICAiIiJTZXQgVGNsIGludGVybmFsIHZhcmlhYmxlLCB3aGV0aGVyIHRoZSBsb29rIGFuZCBmZWVsCisgICAgICAgIHNob3VsZCBhZGhlcmUgdG8gTW90aWYuCisKKyAgICAgICAgQSBwYXJhbWV0ZXIgb2YgMSBtZWFucyBhZGhlcmUgdG8gTW90aWYgKGUuZy4gbm8gY29sb3IKKyAgICAgICAgY2hhbmdlIGlmIG1vdXNlIHBhc3NlcyBvdmVyIHNsaWRlcikuCisgICAgICAgIFJldHVybnMgdGhlIHNldCB2YWx1ZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuZ2V0Ym9vbGVhbihzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAnc2V0JywgJ3RrX3N0cmljdE1vdGlmJywgYm9vbGVhbikpCisgICAgZGVmIHRrX2Jpc3F1ZShzZWxmKToKKyAgICAgICAgIiIiQ2hhbmdlIHRoZSBjb2xvciBzY2hlbWUgdG8gbGlnaHQgYnJvd24gYXMgdXNlZCBpbiBUayAzLjYgYW5kIGJlZm9yZS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a19iaXNxdWUnKQorICAgIGRlZiB0a19zZXRQYWxldHRlKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgIiIiU2V0IGEgbmV3IGNvbG9yIHNjaGVtZSBmb3IgYWxsIHdpZGdldCBlbGVtZW50cy4KKworICAgICAgICBBIHNpbmdsZSBjb2xvciBhcyBhcmd1bWVudCB3aWxsIGNhdXNlIHRoYXQgYWxsIGNvbG9ycyBvZiBUaworICAgICAgICB3aWRnZXQgZWxlbWVudHMgYXJlIGRlcml2ZWQgZnJvbSB0aGlzLgorICAgICAgICBBbHRlcm5hdGl2ZWx5IHNldmVyYWwga2V5d29yZCBwYXJhbWV0ZXJzIGFuZCBpdHMgYXNzb2NpYXRlZAorICAgICAgICBjb2xvcnMgY2FuIGJlIGdpdmVuLiBUaGUgZm9sbG93aW5nIGtleXdvcmRzIGFyZSB2YWxpZDoKKyAgICAgICAgYWN0aXZlQmFja2dyb3VuZCwgZm9yZWdyb3VuZCwgc2VsZWN0Q29sb3IsCisgICAgICAgIGFjdGl2ZUZvcmVncm91bmQsIGhpZ2hsaWdodEJhY2tncm91bmQsIHNlbGVjdEJhY2tncm91bmQsCisgICAgICAgIGJhY2tncm91bmQsIGhpZ2hsaWdodENvbG9yLCBzZWxlY3RGb3JlZ3JvdW5kLAorICAgICAgICBkaXNhYmxlZEZvcmVncm91bmQsIGluc2VydEJhY2tncm91bmQsIHRyb3VnaENvbG9yLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKCd0a19zZXRQYWxldHRlJywpCisgICAgICAgICAgICAgICsgX2ZsYXR0ZW4oYXJncykgKyBfZmxhdHRlbihrdy5pdGVtcygpKSkKKyAgICBkZWYgdGtfbWVudUJhcihzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkRvIG5vdCB1c2UuIE5lZWRlZCBpbiBUayAzLjYgYW5kIGVhcmxpZXIuIiIiCisgICAgICAgIHBhc3MgIyBvYnNvbGV0ZSBzaW5jZSBUayA0LjAKKyAgICBkZWYgd2FpdF92YXJpYWJsZShzZWxmLCBuYW1lPSdQWV9WQVInKToKKyAgICAgICAgIiIiV2FpdCB1bnRpbCB0aGUgdmFyaWFibGUgaXMgbW9kaWZpZWQuCisKKyAgICAgICAgQSBwYXJhbWV0ZXIgb2YgdHlwZSBJbnRWYXIsIFN0cmluZ1ZhciwgRG91YmxlVmFyIG9yCisgICAgICAgIEJvb2xlYW5WYXIgbXVzdCBiZSBnaXZlbi4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a3dhaXQnLCAndmFyaWFibGUnLCBuYW1lKQorICAgIHdhaXR2YXIgPSB3YWl0X3ZhcmlhYmxlICMgWFhYIGIvdyBjb21wYXQKKyAgICBkZWYgd2FpdF93aW5kb3coc2VsZiwgd2luZG93PU5vbmUpOgorICAgICAgICAiIiJXYWl0IHVudGlsIGEgV0lER0VUIGlzIGRlc3Ryb3llZC4KKworICAgICAgICBJZiBubyBwYXJhbWV0ZXIgaXMgZ2l2ZW4gc2VsZiBpcyB1c2VkLiIiIgorICAgICAgICBpZiB3aW5kb3cgaXMgTm9uZToKKyAgICAgICAgICAgIHdpbmRvdyA9IHNlbGYKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a3dhaXQnLCAnd2luZG93Jywgd2luZG93Ll93KQorICAgIGRlZiB3YWl0X3Zpc2liaWxpdHkoc2VsZiwgd2luZG93PU5vbmUpOgorICAgICAgICAiIiJXYWl0IHVudGlsIHRoZSB2aXNpYmlsaXR5IG9mIGEgV0lER0VUIGNoYW5nZXMKKyAgICAgICAgKGUuZy4gaXQgYXBwZWFycykuCisKKyAgICAgICAgSWYgbm8gcGFyYW1ldGVyIGlzIGdpdmVuIHNlbGYgaXMgdXNlZC4iIiIKKyAgICAgICAgaWYgd2luZG93IGlzIE5vbmU6CisgICAgICAgICAgICB3aW5kb3cgPSBzZWxmCisgICAgICAgIHNlbGYudGsuY2FsbCgndGt3YWl0JywgJ3Zpc2liaWxpdHknLCB3aW5kb3cuX3cpCisgICAgZGVmIHNldHZhcihzZWxmLCBuYW1lPSdQWV9WQVInLCB2YWx1ZT0nMScpOgorICAgICAgICAiIiJTZXQgVGNsIHZhcmlhYmxlIE5BTUUgdG8gVkFMVUUuIiIiCisgICAgICAgIHNlbGYudGsuc2V0dmFyKG5hbWUsIHZhbHVlKQorICAgIGRlZiBnZXR2YXIoc2VsZiwgbmFtZT0nUFlfVkFSJyk6CisgICAgICAgICIiIlJldHVybiB2YWx1ZSBvZiBUY2wgdmFyaWFibGUgTkFNRS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuZ2V0dmFyKG5hbWUpCisgICAgZ2V0aW50ID0gaW50CisgICAgZ2V0ZG91YmxlID0gZmxvYXQKKyAgICBkZWYgZ2V0Ym9vbGVhbihzZWxmLCBzKToKKyAgICAgICAgIiIiUmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSBmb3IgVGNsIGJvb2xlYW4gdmFsdWVzIHRydWUgYW5kIGZhbHNlIGdpdmVuIGFzIHBhcmFtZXRlci4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuZ2V0Ym9vbGVhbihzKQorICAgIGRlZiBmb2N1c19zZXQoc2VsZik6CisgICAgICAgICIiIkRpcmVjdCBpbnB1dCBmb2N1cyB0byB0aGlzIHdpZGdldC4KKworICAgICAgICBJZiB0aGUgYXBwbGljYXRpb24gY3VycmVudGx5IGRvZXMgbm90IGhhdmUgdGhlIGZvY3VzCisgICAgICAgIHRoaXMgd2lkZ2V0IHdpbGwgZ2V0IHRoZSBmb2N1cyBpZiB0aGUgYXBwbGljYXRpb24gZ2V0cworICAgICAgICB0aGUgZm9jdXMgdGhyb3VnaCB0aGUgd2luZG93IG1hbmFnZXIuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgnZm9jdXMnLCBzZWxmLl93KQorICAgIGZvY3VzID0gZm9jdXNfc2V0ICMgWFhYIGIvdyBjb21wYXQ/CisgICAgZGVmIGZvY3VzX2ZvcmNlKHNlbGYpOgorICAgICAgICAiIiJEaXJlY3QgaW5wdXQgZm9jdXMgdG8gdGhpcyB3aWRnZXQgZXZlbiBpZiB0aGUKKyAgICAgICAgYXBwbGljYXRpb24gZG9lcyBub3QgaGF2ZSB0aGUgZm9jdXMuIFVzZSB3aXRoCisgICAgICAgIGNhdXRpb24hIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgnZm9jdXMnLCAnLWZvcmNlJywgc2VsZi5fdykKKyAgICBkZWYgZm9jdXNfZ2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHdpZGdldCB3aGljaCBoYXMgY3VycmVudGx5IHRoZSBmb2N1cyBpbiB0aGUKKyAgICAgICAgYXBwbGljYXRpb24uCisKKyAgICAgICAgVXNlIGZvY3VzX2Rpc3BsYXlvZiB0byBhbGxvdyB3b3JraW5nIHdpdGggc2V2ZXJhbAorICAgICAgICBkaXNwbGF5cy4gUmV0dXJuIE5vbmUgaWYgYXBwbGljYXRpb24gZG9lcyBub3QgaGF2ZQorICAgICAgICB0aGUgZm9jdXMuIiIiCisgICAgICAgIG5hbWUgPSBzZWxmLnRrLmNhbGwoJ2ZvY3VzJykKKyAgICAgICAgaWYgbmFtZSA9PSAnbm9uZScgb3Igbm90IG5hbWU6IHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1ldG93aWRnZXQobmFtZSkKKyAgICBkZWYgZm9jdXNfZGlzcGxheW9mKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHdpZGdldCB3aGljaCBoYXMgY3VycmVudGx5IHRoZSBmb2N1cyBvbiB0aGUKKyAgICAgICAgZGlzcGxheSB3aGVyZSB0aGlzIHdpZGdldCBpcyBsb2NhdGVkLgorCisgICAgICAgIFJldHVybiBOb25lIGlmIHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIHRoZSBmb2N1cy4iIiIKKyAgICAgICAgbmFtZSA9IHNlbGYudGsuY2FsbCgnZm9jdXMnLCAnLWRpc3BsYXlvZicsIHNlbGYuX3cpCisgICAgICAgIGlmIG5hbWUgPT0gJ25vbmUnIG9yIG5vdCBuYW1lOiByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZXRvd2lkZ2V0KG5hbWUpCisgICAgZGVmIGZvY3VzX2xhc3Rmb3Ioc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgd2lkZ2V0IHdoaWNoIHdvdWxkIGhhdmUgdGhlIGZvY3VzIGlmIHRvcCBsZXZlbAorICAgICAgICBmb3IgdGhpcyB3aWRnZXQgZ2V0cyB0aGUgZm9jdXMgZnJvbSB0aGUgd2luZG93IG1hbmFnZXIuIiIiCisgICAgICAgIG5hbWUgPSBzZWxmLnRrLmNhbGwoJ2ZvY3VzJywgJy1sYXN0Zm9yJywgc2VsZi5fdykKKyAgICAgICAgaWYgbmFtZSA9PSAnbm9uZScgb3Igbm90IG5hbWU6IHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1ldG93aWRnZXQobmFtZSkKKyAgICBkZWYgdGtfZm9jdXNGb2xsb3dzTW91c2Uoc2VsZik6CisgICAgICAgICIiIlRoZSB3aWRnZXQgdW5kZXIgbW91c2Ugd2lsbCBnZXQgYXV0b21hdGljYWxseSBmb2N1cy4gQ2FuIG5vdAorICAgICAgICBiZSBkaXNhYmxlZCBlYXNpbHkuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgndGtfZm9jdXNGb2xsb3dzTW91c2UnKQorICAgIGRlZiB0a19mb2N1c05leHQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbmV4dCB3aWRnZXQgaW4gdGhlIGZvY3VzIG9yZGVyIHdoaWNoIGZvbGxvd3MKKyAgICAgICAgd2lkZ2V0IHdoaWNoIGhhcyBjdXJyZW50bHkgdGhlIGZvY3VzLgorCisgICAgICAgIFRoZSBmb2N1cyBvcmRlciBmaXJzdCBnb2VzIHRvIHRoZSBuZXh0IGNoaWxkLCB0aGVuIHRvCisgICAgICAgIHRoZSBjaGlsZHJlbiBvZiB0aGUgY2hpbGQgcmVjdXJzaXZlbHkgYW5kIHRoZW4gdG8gdGhlCisgICAgICAgIG5leHQgc2libGluZyB3aGljaCBpcyBoaWdoZXIgaW4gdGhlIHN0YWNraW5nIG9yZGVyLiAgQQorICAgICAgICB3aWRnZXQgaXMgb21pdHRlZCBpZiBpdCBoYXMgdGhlIHRha2Vmb2N1cyByZXNvdXJjZSBzZXQKKyAgICAgICAgdG8gMC4iIiIKKyAgICAgICAgbmFtZSA9IHNlbGYudGsuY2FsbCgndGtfZm9jdXNOZXh0Jywgc2VsZi5fdykKKyAgICAgICAgaWYgbm90IG5hbWU6IHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1ldG93aWRnZXQobmFtZSkKKyAgICBkZWYgdGtfZm9jdXNQcmV2KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gcHJldmlvdXMgd2lkZ2V0IGluIHRoZSBmb2N1cyBvcmRlci4gU2VlIHRrX2ZvY3VzTmV4dCBmb3IgZGV0YWlscy4iIiIKKyAgICAgICAgbmFtZSA9IHNlbGYudGsuY2FsbCgndGtfZm9jdXNQcmV2Jywgc2VsZi5fdykKKyAgICAgICAgaWYgbm90IG5hbWU6IHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1ldG93aWRnZXQobmFtZSkKKyAgICBkZWYgYWZ0ZXIoc2VsZiwgbXMsIGZ1bmM9Tm9uZSwgKmFyZ3MpOgorICAgICAgICAiIiJDYWxsIGZ1bmN0aW9uIG9uY2UgYWZ0ZXIgZ2l2ZW4gdGltZS4KKworICAgICAgICBNUyBzcGVjaWZpZXMgdGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBGVU5DIGdpdmVzIHRoZQorICAgICAgICBmdW5jdGlvbiB3aGljaCBzaGFsbCBiZSBjYWxsZWQuIEFkZGl0aW9uYWwgcGFyYW1ldGVycworICAgICAgICBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycyB0byB0aGUgZnVuY3Rpb24gY2FsbC4gIFJldHVybgorICAgICAgICBpZGVudGlmaWVyIHRvIGNhbmNlbCBzY2hlZHVsaW5nIHdpdGggYWZ0ZXJfY2FuY2VsLiIiIgorICAgICAgICBpZiBub3QgZnVuYzoKKyAgICAgICAgICAgICMgSSdkIHJhdGhlciB1c2UgdGltZS5zbGVlcChtcyowLjAwMSkKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnYWZ0ZXInLCBtcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlZiBjYWxsaXQoKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMoKmFyZ3MpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWxldGVjb21tYW5kKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLl9yZWdpc3RlcihjYWxsaXQpCisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCdhZnRlcicsIG1zLCBuYW1lKQorICAgIGRlZiBhZnRlcl9pZGxlKHNlbGYsIGZ1bmMsICphcmdzKToKKyAgICAgICAgIiIiQ2FsbCBGVU5DIG9uY2UgaWYgdGhlIFRjbCBtYWluIGxvb3AgaGFzIG5vIGV2ZW50IHRvCisgICAgICAgIHByb2Nlc3MuCisKKyAgICAgICAgUmV0dXJuIGFuIGlkZW50aWZpZXIgdG8gY2FuY2VsIHRoZSBzY2hlZHVsaW5nIHdpdGgKKyAgICAgICAgYWZ0ZXJfY2FuY2VsLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5hZnRlcignaWRsZScsIGZ1bmMsICphcmdzKQorICAgIGRlZiBhZnRlcl9jYW5jZWwoc2VsZiwgaWQpOgorICAgICAgICAiIiJDYW5jZWwgc2NoZWR1bGluZyBvZiBmdW5jdGlvbiBpZGVudGlmaWVkIHdpdGggSUQuCisKKyAgICAgICAgSWRlbnRpZmllciByZXR1cm5lZCBieSBhZnRlciBvciBhZnRlcl9pZGxlIG11c3QgYmUKKyAgICAgICAgZ2l2ZW4gYXMgZmlyc3QgcGFyYW1ldGVyLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gc2VsZi50ay5jYWxsKCdhZnRlcicsICdpbmZvJywgaWQpCisgICAgICAgICAgICAjIEluIFRrIDguMywgc3BsaXRsaXN0IHJldHVybnM6IChzY3JpcHQsIHR5cGUpCisgICAgICAgICAgICAjIEluIFRrIDguNCwgc3BsaXRsaXN0IG1heSByZXR1cm4gKHNjcmlwdCwgdHlwZSkgb3IgKHNjcmlwdCwpCisgICAgICAgICAgICBzY3JpcHQgPSBzZWxmLnRrLnNwbGl0bGlzdChkYXRhKVswXQorICAgICAgICAgICAgc2VsZi5kZWxldGVjb21tYW5kKHNjcmlwdCkKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLnRrLmNhbGwoJ2FmdGVyJywgJ2NhbmNlbCcsIGlkKQorICAgIGRlZiBiZWxsKHNlbGYsIGRpc3BsYXlvZj0wKToKKyAgICAgICAgIiIiUmluZyBhIGRpc3BsYXkncyBiZWxsLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKCdiZWxsJywpICsgc2VsZi5fZGlzcGxheW9mKGRpc3BsYXlvZikpCisKKyAgICAjIENsaXBib2FyZCBoYW5kbGluZzoKKyAgICBkZWYgY2xpcGJvYXJkX2dldChzZWxmLCAqKmt3KToKKyAgICAgICAgIiIiUmV0cmlldmUgZGF0YSBmcm9tIHRoZSBjbGlwYm9hcmQgb24gd2luZG93J3MgZGlzcGxheS4KKworICAgICAgICBUaGUgd2luZG93IGtleXdvcmQgZGVmYXVsdHMgdG8gdGhlIHJvb3Qgd2luZG93IG9mIHRoZSBUa2ludGVyCisgICAgICAgIGFwcGxpY2F0aW9uLgorCisgICAgICAgIFRoZSB0eXBlIGtleXdvcmQgc3BlY2lmaWVzIHRoZSBmb3JtIGluIHdoaWNoIHRoZSBkYXRhIGlzCisgICAgICAgIHRvIGJlIHJldHVybmVkIGFuZCBzaG91bGQgYmUgYW4gYXRvbSBuYW1lIHN1Y2ggYXMgU1RSSU5HCisgICAgICAgIG9yIEZJTEVfTkFNRS4gIFR5cGUgZGVmYXVsdHMgdG8gU1RSSU5HLCBleGNlcHQgb24gWDExLCB3aGVyZSB0aGUgZGVmYXVsdAorICAgICAgICBpcyB0byB0cnkgVVRGOF9TVFJJTkcgYW5kIGZhbGwgYmFjayB0byBTVFJJTkcuCisKKyAgICAgICAgVGhpcyBjb21tYW5kIGlzIGVxdWl2YWxlbnQgdG86CisKKyAgICAgICAgc2VsZWN0aW9uX2dldChDTElQQk9BUkQpCisgICAgICAgICIiIgorICAgICAgICBpZiAndHlwZScgbm90IGluIGt3IGFuZCBzZWxmLl93aW5kb3dpbmdzeXN0ZW0gPT0gJ3gxMSc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAga3dbJ3R5cGUnXSA9ICdVVEY4X1NUUklORycKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCgnY2xpcGJvYXJkJywgJ2dldCcpICsgc2VsZi5fb3B0aW9ucyhrdykpCisgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICAgICAgZGVsIGt3Wyd0eXBlJ10KKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgoJ2NsaXBib2FyZCcsICdnZXQnKSArIHNlbGYuX29wdGlvbnMoa3cpKQorCisgICAgZGVmIGNsaXBib2FyZF9jbGVhcihzZWxmLCAqKmt3KToKKyAgICAgICAgIiIiQ2xlYXIgdGhlIGRhdGEgaW4gdGhlIFRrIGNsaXBib2FyZC4KKworICAgICAgICBBIHdpZGdldCBzcGVjaWZpZWQgZm9yIHRoZSBvcHRpb25hbCBkaXNwbGF5b2Yga2V5d29yZAorICAgICAgICBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHRhcmdldCBkaXNwbGF5LiIiIgorICAgICAgICBpZiAnZGlzcGxheW9mJyBub3QgaW4ga3c6IGt3WydkaXNwbGF5b2YnXSA9IHNlbGYuX3cKKyAgICAgICAgc2VsZi50ay5jYWxsKCgnY2xpcGJvYXJkJywgJ2NsZWFyJykgKyBzZWxmLl9vcHRpb25zKGt3KSkKKyAgICBkZWYgY2xpcGJvYXJkX2FwcGVuZChzZWxmLCBzdHJpbmcsICoqa3cpOgorICAgICAgICAiIiJBcHBlbmQgU1RSSU5HIHRvIHRoZSBUayBjbGlwYm9hcmQuCisKKyAgICAgICAgQSB3aWRnZXQgc3BlY2lmaWVkIGF0IHRoZSBvcHRpb25hbCBkaXNwbGF5b2Yga2V5d29yZAorICAgICAgICBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHRhcmdldCBkaXNwbGF5LiBUaGUgY2xpcGJvYXJkCisgICAgICAgIGNhbiBiZSByZXRyaWV2ZWQgd2l0aCBzZWxlY3Rpb25fZ2V0LiIiIgorICAgICAgICBpZiAnZGlzcGxheW9mJyBub3QgaW4ga3c6IGt3WydkaXNwbGF5b2YnXSA9IHNlbGYuX3cKKyAgICAgICAgc2VsZi50ay5jYWxsKCgnY2xpcGJvYXJkJywgJ2FwcGVuZCcpICsgc2VsZi5fb3B0aW9ucyhrdykKKyAgICAgICAgICAgICAgKyAoJy0tJywgc3RyaW5nKSkKKyAgICAjIFhYWCBncmFiIGN1cnJlbnQgdy9vIHdpbmRvdyBhcmd1bWVudAorICAgIGRlZiBncmFiX2N1cnJlbnQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB3aWRnZXQgd2hpY2ggaGFzIGN1cnJlbnRseSB0aGUgZ3JhYiBpbiB0aGlzIGFwcGxpY2F0aW9uCisgICAgICAgIG9yIE5vbmUuIiIiCisgICAgICAgIG5hbWUgPSBzZWxmLnRrLmNhbGwoJ2dyYWInLCAnY3VycmVudCcsIHNlbGYuX3cpCisgICAgICAgIGlmIG5vdCBuYW1lOiByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZXRvd2lkZ2V0KG5hbWUpCisgICAgZGVmIGdyYWJfcmVsZWFzZShzZWxmKToKKyAgICAgICAgIiIiUmVsZWFzZSBncmFiIGZvciB0aGlzIHdpZGdldCBpZiBjdXJyZW50bHkgc2V0LiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ2dyYWInLCAncmVsZWFzZScsIHNlbGYuX3cpCisgICAgZGVmIGdyYWJfc2V0KHNlbGYpOgorICAgICAgICAiIiJTZXQgZ3JhYiBmb3IgdGhpcyB3aWRnZXQuCisKKyAgICAgICAgQSBncmFiIGRpcmVjdHMgYWxsIGV2ZW50cyB0byB0aGlzIGFuZCBkZXNjZW5kYW50CisgICAgICAgIHdpZGdldHMgaW4gdGhlIGFwcGxpY2F0aW9uLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ2dyYWInLCAnc2V0Jywgc2VsZi5fdykKKyAgICBkZWYgZ3JhYl9zZXRfZ2xvYmFsKHNlbGYpOgorICAgICAgICAiIiJTZXQgZ2xvYmFsIGdyYWIgZm9yIHRoaXMgd2lkZ2V0LgorCisgICAgICAgIEEgZ2xvYmFsIGdyYWIgZGlyZWN0cyBhbGwgZXZlbnRzIHRvIHRoaXMgYW5kCisgICAgICAgIGRlc2NlbmRhbnQgd2lkZ2V0cyBvbiB0aGUgZGlzcGxheS4gVXNlIHdpdGggY2F1dGlvbiAtCisgICAgICAgIG90aGVyIGFwcGxpY2F0aW9ucyBkbyBub3QgZ2V0IGV2ZW50cyBhbnltb3JlLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ2dyYWInLCAnc2V0JywgJy1nbG9iYWwnLCBzZWxmLl93KQorICAgIGRlZiBncmFiX3N0YXR1cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIE5vbmUsICJsb2NhbCIgb3IgImdsb2JhbCIgaWYgdGhpcyB3aWRnZXQgaGFzCisgICAgICAgIG5vLCBhIGxvY2FsIG9yIGEgZ2xvYmFsIGdyYWIuIiIiCisgICAgICAgIHN0YXR1cyA9IHNlbGYudGsuY2FsbCgnZ3JhYicsICdzdGF0dXMnLCBzZWxmLl93KQorICAgICAgICBpZiBzdGF0dXMgPT0gJ25vbmUnOiBzdGF0dXMgPSBOb25lCisgICAgICAgIHJldHVybiBzdGF0dXMKKyAgICBkZWYgb3B0aW9uX2FkZChzZWxmLCBwYXR0ZXJuLCB2YWx1ZSwgcHJpb3JpdHkgPSBOb25lKToKKyAgICAgICAgIiIiU2V0IGEgVkFMVUUgKHNlY29uZCBwYXJhbWV0ZXIpIGZvciBhbiBvcHRpb24KKyAgICAgICAgUEFUVEVSTiAoZmlyc3QgcGFyYW1ldGVyKS4KKworICAgICAgICBBbiBvcHRpb25hbCB0aGlyZCBwYXJhbWV0ZXIgZ2l2ZXMgdGhlIG51bWVyaWMgcHJpb3JpdHkKKyAgICAgICAgKGRlZmF1bHRzIHRvIDgwKS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCdvcHRpb24nLCAnYWRkJywgcGF0dGVybiwgdmFsdWUsIHByaW9yaXR5KQorICAgIGRlZiBvcHRpb25fY2xlYXIoc2VsZik6CisgICAgICAgICIiIkNsZWFyIHRoZSBvcHRpb24gZGF0YWJhc2UuCisKKyAgICAgICAgSXQgd2lsbCBiZSByZWxvYWRlZCBpZiBvcHRpb25fYWRkIGlzIGNhbGxlZC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCdvcHRpb24nLCAnY2xlYXInKQorICAgIGRlZiBvcHRpb25fZ2V0KHNlbGYsIG5hbWUsIGNsYXNzTmFtZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgdmFsdWUgZm9yIGFuIG9wdGlvbiBOQU1FIGZvciB0aGlzIHdpZGdldAorICAgICAgICB3aXRoIENMQVNTTkFNRS4KKworICAgICAgICBWYWx1ZXMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgb3ZlcnJpZGUgbG93ZXIgdmFsdWVzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCdvcHRpb24nLCAnZ2V0Jywgc2VsZi5fdywgbmFtZSwgY2xhc3NOYW1lKQorICAgIGRlZiBvcHRpb25fcmVhZGZpbGUoc2VsZiwgZmlsZU5hbWUsIHByaW9yaXR5ID0gTm9uZSk6CisgICAgICAgICIiIlJlYWQgZmlsZSBGSUxFTkFNRSBpbnRvIHRoZSBvcHRpb24gZGF0YWJhc2UuCisKKyAgICAgICAgQW4gb3B0aW9uYWwgc2Vjb25kIHBhcmFtZXRlciBnaXZlcyB0aGUgbnVtZXJpYworICAgICAgICBwcmlvcml0eS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCdvcHRpb24nLCAncmVhZGZpbGUnLCBmaWxlTmFtZSwgcHJpb3JpdHkpCisgICAgZGVmIHNlbGVjdGlvbl9jbGVhcihzZWxmLCAqKmt3KToKKyAgICAgICAgIiIiQ2xlYXIgdGhlIGN1cnJlbnQgWCBzZWxlY3Rpb24uIiIiCisgICAgICAgIGlmICdkaXNwbGF5b2YnIG5vdCBpbiBrdzoga3dbJ2Rpc3BsYXlvZiddID0gc2VsZi5fdworICAgICAgICBzZWxmLnRrLmNhbGwoKCdzZWxlY3Rpb24nLCAnY2xlYXInKSArIHNlbGYuX29wdGlvbnMoa3cpKQorICAgIGRlZiBzZWxlY3Rpb25fZ2V0KHNlbGYsICoqa3cpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IFggc2VsZWN0aW9uLgorCisgICAgICAgIEEga2V5d29yZCBwYXJhbWV0ZXIgc2VsZWN0aW9uIHNwZWNpZmllcyB0aGUgbmFtZSBvZgorICAgICAgICB0aGUgc2VsZWN0aW9uIGFuZCBkZWZhdWx0cyB0byBQUklNQVJZLiAgQSBrZXl3b3JkCisgICAgICAgIHBhcmFtZXRlciBkaXNwbGF5b2Ygc3BlY2lmaWVzIGEgd2lkZ2V0IG9uIHRoZSBkaXNwbGF5CisgICAgICAgIHRvIHVzZS4gQSBrZXl3b3JkIHBhcmFtZXRlciB0eXBlIHNwZWNpZmllcyB0aGUgZm9ybSBvZiBkYXRhIHRvIGJlCisgICAgICAgIGZldGNoZWQsIGRlZmF1bHRpbmcgdG8gU1RSSU5HIGV4Y2VwdCBvbiBYMTEsIHdoZXJlIFVURjhfU1RSSU5HIGlzIHRyaWVkCisgICAgICAgIGJlZm9yZSBTVFJJTkcuIiIiCisgICAgICAgIGlmICdkaXNwbGF5b2YnIG5vdCBpbiBrdzoga3dbJ2Rpc3BsYXlvZiddID0gc2VsZi5fdworICAgICAgICBpZiAndHlwZScgbm90IGluIGt3IGFuZCBzZWxmLl93aW5kb3dpbmdzeXN0ZW0gPT0gJ3gxMSc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAga3dbJ3R5cGUnXSA9ICdVVEY4X1NUUklORycKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCgnc2VsZWN0aW9uJywgJ2dldCcpICsgc2VsZi5fb3B0aW9ucyhrdykpCisgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICAgICAgZGVsIGt3Wyd0eXBlJ10KKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgoJ3NlbGVjdGlvbicsICdnZXQnKSArIHNlbGYuX29wdGlvbnMoa3cpKQorICAgIGRlZiBzZWxlY3Rpb25faGFuZGxlKHNlbGYsIGNvbW1hbmQsICoqa3cpOgorICAgICAgICAiIiJTcGVjaWZ5IGEgZnVuY3Rpb24gQ09NTUFORCB0byBjYWxsIGlmIHRoZSBYCisgICAgICAgIHNlbGVjdGlvbiBvd25lZCBieSB0aGlzIHdpZGdldCBpcyBxdWVyaWVkIGJ5IGFub3RoZXIKKyAgICAgICAgYXBwbGljYXRpb24uCisKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBtdXN0IHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlCisgICAgICAgIHNlbGVjdGlvbi4gVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlCisgICAgICAgIGFyZ3VtZW50cyBPRkZTRVQgYW5kIExFTkdUSCB3aGljaCBhbGxvd3MgdGhlIGNodW5raW5nCisgICAgICAgIG9mIHZlcnkgbG9uZyBzZWxlY3Rpb25zLiBUaGUgZm9sbG93aW5nIGtleXdvcmQKKyAgICAgICAgcGFyYW1ldGVycyBjYW4gYmUgcHJvdmlkZWQ6CisgICAgICAgIHNlbGVjdGlvbiAtIG5hbWUgb2YgdGhlIHNlbGVjdGlvbiAoZGVmYXVsdCBQUklNQVJZKSwKKyAgICAgICAgdHlwZSAtIHR5cGUgb2YgdGhlIHNlbGVjdGlvbiAoZS5nLiBTVFJJTkcsIEZJTEVfTkFNRSkuIiIiCisgICAgICAgIG5hbWUgPSBzZWxmLl9yZWdpc3Rlcihjb21tYW5kKQorICAgICAgICBzZWxmLnRrLmNhbGwoKCdzZWxlY3Rpb24nLCAnaGFuZGxlJykgKyBzZWxmLl9vcHRpb25zKGt3KQorICAgICAgICAgICAgICArIChzZWxmLl93LCBuYW1lKSkKKyAgICBkZWYgc2VsZWN0aW9uX293bihzZWxmLCAqKmt3KToKKyAgICAgICAgIiIiQmVjb21lIG93bmVyIG9mIFggc2VsZWN0aW9uLgorCisgICAgICAgIEEga2V5d29yZCBwYXJhbWV0ZXIgc2VsZWN0aW9uIHNwZWNpZmllcyB0aGUgbmFtZSBvZgorICAgICAgICB0aGUgc2VsZWN0aW9uIChkZWZhdWx0IFBSSU1BUlkpLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKCdzZWxlY3Rpb24nLCAnb3duJykgKworICAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zKGt3KSArIChzZWxmLl93LCkpCisgICAgZGVmIHNlbGVjdGlvbl9vd25fZ2V0KHNlbGYsICoqa3cpOgorICAgICAgICAiIiJSZXR1cm4gb3duZXIgb2YgWCBzZWxlY3Rpb24uCisKKyAgICAgICAgVGhlIGZvbGxvd2luZyBrZXl3b3JkIHBhcmFtZXRlciBjYW4KKyAgICAgICAgYmUgcHJvdmlkZWQ6CisgICAgICAgIHNlbGVjdGlvbiAtIG5hbWUgb2YgdGhlIHNlbGVjdGlvbiAoZGVmYXVsdCBQUklNQVJZKSwKKyAgICAgICAgdHlwZSAtIHR5cGUgb2YgdGhlIHNlbGVjdGlvbiAoZS5nLiBTVFJJTkcsIEZJTEVfTkFNRSkuIiIiCisgICAgICAgIGlmICdkaXNwbGF5b2YnIG5vdCBpbiBrdzoga3dbJ2Rpc3BsYXlvZiddID0gc2VsZi5fdworICAgICAgICBuYW1lID0gc2VsZi50ay5jYWxsKCgnc2VsZWN0aW9uJywgJ293bicpICsgc2VsZi5fb3B0aW9ucyhrdykpCisgICAgICAgIGlmIG5vdCBuYW1lOiByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZXRvd2lkZ2V0KG5hbWUpCisgICAgZGVmIHNlbmQoc2VsZiwgaW50ZXJwLCBjbWQsICphcmdzKToKKyAgICAgICAgIiIiU2VuZCBUY2wgY29tbWFuZCBDTUQgdG8gZGlmZmVyZW50IGludGVycHJldGVyIElOVEVSUCB0byBiZSBleGVjdXRlZC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgoJ3NlbmQnLCBpbnRlcnAsIGNtZCkgKyBhcmdzKQorICAgIGRlZiBsb3dlcihzZWxmLCBiZWxvd1RoaXM9Tm9uZSk6CisgICAgICAgICIiIkxvd2VyIHRoaXMgd2lkZ2V0IGluIHRoZSBzdGFja2luZyBvcmRlci4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCdsb3dlcicsIHNlbGYuX3csIGJlbG93VGhpcykKKyAgICBkZWYgdGtyYWlzZShzZWxmLCBhYm92ZVRoaXM9Tm9uZSk6CisgICAgICAgICIiIlJhaXNlIHRoaXMgd2lkZ2V0IGluIHRoZSBzdGFja2luZyBvcmRlci4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCdyYWlzZScsIHNlbGYuX3csIGFib3ZlVGhpcykKKyAgICBsaWZ0ID0gdGtyYWlzZQorICAgIGRlZiBjb2xvcm1vZGVsKHNlbGYsIHZhbHVlPU5vbmUpOgorICAgICAgICAiIiJVc2VsZXNzLiBOb3QgaW1wbGVtZW50ZWQgaW4gVGsuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3RrJywgJ2NvbG9ybW9kZWwnLCBzZWxmLl93LCB2YWx1ZSkKKyAgICBkZWYgd2luZm9fYXRvbShzZWxmLCBuYW1lLCBkaXNwbGF5b2Y9MCk6CisgICAgICAgICIiIlJldHVybiBpbnRlZ2VyIHdoaWNoIHJlcHJlc2VudHMgYXRvbSBOQU1FLiIiIgorICAgICAgICBhcmdzID0gKCd3aW5mbycsICdhdG9tJykgKyBzZWxmLl9kaXNwbGF5b2YoZGlzcGxheW9mKSArIChuYW1lLCkKKyAgICAgICAgcmV0dXJuIGdldGludChzZWxmLnRrLmNhbGwoYXJncykpCisgICAgZGVmIHdpbmZvX2F0b21uYW1lKHNlbGYsIGlkLCBkaXNwbGF5b2Y9MCk6CisgICAgICAgICIiIlJldHVybiBuYW1lIG9mIGF0b20gd2l0aCBpZGVudGlmaWVyIElELiIiIgorICAgICAgICBhcmdzID0gKCd3aW5mbycsICdhdG9tbmFtZScpIFwKKyAgICAgICAgICAgICAgICsgc2VsZi5fZGlzcGxheW9mKGRpc3BsYXlvZikgKyAoaWQsKQorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKGFyZ3MpCisgICAgZGVmIHdpbmZvX2NlbGxzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbnVtYmVyIG9mIGNlbGxzIGluIHRoZSBjb2xvcm1hcCBmb3IgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ2NlbGxzJywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX2NoaWxkcmVuKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCB3aWRnZXRzIHdoaWNoIGFyZSBjaGlsZHJlbiBvZiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdjaGlsZHJlbicsIHNlbGYuX3cpKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFRjbCBzb21ldGltZXMgcmV0dXJucyBleHRyYSB3aW5kb3dzLCBlLmcuIGZvcgorICAgICAgICAgICAgICAgICMgbWVudXM7IHRob3NlIG5lZWQgdG8gYmUgc2tpcHBlZAorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VsZi5fbmFtZXRvd2lkZ2V0KGNoaWxkKSkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiB3aW5mb19jbGFzcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHdpbmRvdyBjbGFzcyBuYW1lIG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3aW5mbycsICdjbGFzcycsIHNlbGYuX3cpCisgICAgZGVmIHdpbmZvX2NvbG9ybWFwZnVsbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgYXQgdGhlIGxhc3QgY29sb3IgcmVxdWVzdCB0aGUgY29sb3JtYXAgd2FzIGZ1bGwuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmdldGJvb2xlYW4oCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ2NvbG9ybWFwZnVsbCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19jb250YWluaW5nKHNlbGYsIHJvb3RYLCByb290WSwgZGlzcGxheW9mPTApOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHdpZGdldCB3aGljaCBpcyBhdCB0aGUgcm9vdCBjb29yZGluYXRlcyBST09UWCwgUk9PVFkuIiIiCisgICAgICAgIGFyZ3MgPSAoJ3dpbmZvJywgJ2NvbnRhaW5pbmcnKSBcCisgICAgICAgICAgICAgICArIHNlbGYuX2Rpc3BsYXlvZihkaXNwbGF5b2YpICsgKHJvb3RYLCByb290WSkKKyAgICAgICAgbmFtZSA9IHNlbGYudGsuY2FsbChhcmdzKQorICAgICAgICBpZiBub3QgbmFtZTogcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWV0b3dpZGdldChuYW1lKQorICAgIGRlZiB3aW5mb19kZXB0aChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoc2VsZi50ay5jYWxsKCd3aW5mbycsICdkZXB0aCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19leGlzdHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoaXMgd2lkZ2V0IGV4aXN0cy4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnZXhpc3RzJywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX2ZwaXhlbHMoc2VsZiwgbnVtYmVyKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGZvciB0aGUgZ2l2ZW4gZGlzdGFuY2UgTlVNQkVSCisgICAgICAgIChlLmcuICIzYyIpIGFzIGZsb2F0LiIiIgorICAgICAgICByZXR1cm4gZ2V0ZG91YmxlKHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICd3aW5mbycsICdmcGl4ZWxzJywgc2VsZi5fdywgbnVtYmVyKSkKKyAgICBkZWYgd2luZm9fZ2VvbWV0cnkoc2VsZik6CisgICAgICAgICIiIlJldHVybiBnZW9tZXRyeSBzdHJpbmcgZm9yIHRoaXMgd2lkZ2V0IGluIHRoZSBmb3JtICJ3aWR0aHhoZWlnaHQrWCtZIi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnZ2VvbWV0cnknLCBzZWxmLl93KQorICAgIGRlZiB3aW5mb19oZWlnaHQoc2VsZik6CisgICAgICAgICIiIlJldHVybiBoZWlnaHQgb2YgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ2hlaWdodCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19pZChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGlkZW50aWZpZXIgSUQgZm9yIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5nZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ2lkJywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX2ludGVycHMoc2VsZiwgZGlzcGxheW9mPTApOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgYWxsIFRjbCBpbnRlcnByZXRlcnMgZm9yIHRoaXMgZGlzcGxheS4iIiIKKyAgICAgICAgYXJncyA9ICgnd2luZm8nLCAnaW50ZXJwcycpICsgc2VsZi5fZGlzcGxheW9mKGRpc3BsYXlvZikKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbChhcmdzKSkKKyAgICBkZWYgd2luZm9faXNtYXBwZWQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoaXMgd2lkZ2V0IGlzIG1hcHBlZC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnaXNtYXBwZWQnLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fbWFuYWdlcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB3aW5kb3cgbWFuYW5nZXIgbmFtZSBmb3IgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ21hbmFnZXInLCBzZWxmLl93KQorICAgIGRlZiB3aW5mb19uYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ25hbWUnLCBzZWxmLl93KQorICAgIGRlZiB3aW5mb19wYXJlbnQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGFyZW50IG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3aW5mbycsICdwYXJlbnQnLCBzZWxmLl93KQorICAgIGRlZiB3aW5mb19wYXRobmFtZShzZWxmLCBpZCwgZGlzcGxheW9mPTApOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHBhdGhuYW1lIG9mIHRoZSB3aWRnZXQgZ2l2ZW4gYnkgSUQuIiIiCisgICAgICAgIGFyZ3MgPSAoJ3dpbmZvJywgJ3BhdGhuYW1lJykgXAorICAgICAgICAgICAgICAgKyBzZWxmLl9kaXNwbGF5b2YoZGlzcGxheW9mKSArIChpZCwpCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoYXJncykKKyAgICBkZWYgd2luZm9fcGl4ZWxzKHNlbGYsIG51bWJlcik6CisgICAgICAgICIiIlJvdW5kZWQgaW50ZWdlciB2YWx1ZSBvZiB3aW5mb19mcGl4ZWxzLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdwaXhlbHMnLCBzZWxmLl93LCBudW1iZXIpKQorICAgIGRlZiB3aW5mb19wb2ludGVyeChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50ZXIgb24gdGhlIHJvb3Qgd2luZG93LiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdwb2ludGVyeCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19wb2ludGVyeHkoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIHR1cGxlIG9mIHggYW5kIHkgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50ZXIgb24gdGhlIHJvb3Qgd2luZG93LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAncG9pbnRlcnh5Jywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3BvaW50ZXJ5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnRlciBvbiB0aGUgcm9vdCB3aW5kb3cuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3BvaW50ZXJ5Jywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3JlcWhlaWdodChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHJlcXVlc3RlZCBoZWlnaHQgb2YgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3JlcWhlaWdodCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19yZXF3aWR0aChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHJlcXVlc3RlZCB3aWR0aCBvZiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAncmVxd2lkdGgnLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fcmdiKHNlbGYsIGNvbG9yKToKKyAgICAgICAgIiIiUmV0dXJuIHR1cGxlIG9mIGRlY2ltYWwgdmFsdWVzIGZvciByZWQsIGdyZWVuLCBibHVlIGZvcgorICAgICAgICBDT0xPUiBpbiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3JnYicsIHNlbGYuX3csIGNvbG9yKSkKKyAgICBkZWYgd2luZm9fcm9vdHgoc2VsZik6CisgICAgICAgICIiIlJldHVybiB4IGNvb3JkaW5hdGUgb2YgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhpcyB3aWRnZXQgb24gdGhlCisgICAgICAgIHJvb3Qgd2luZG93LiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdyb290eCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19yb290eShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHkgY29vcmRpbmF0ZSBvZiB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGlzIHdpZGdldCBvbiB0aGUKKyAgICAgICAgcm9vdCB3aW5kb3cuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3Jvb3R5Jywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3NjcmVlbihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzY3JlZW4gbmFtZSBvZiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnc2NyZWVuJywgc2VsZi5fdykKKyAgICBkZWYgd2luZm9fc2NyZWVuY2VsbHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBjZWxscyBpbiB0aGUgY29sb3JtYXAgb2YgdGhlIHNjcmVlbgorICAgICAgICBvZiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnc2NyZWVuY2VsbHMnLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fc2NyZWVuZGVwdGgoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIG9mIHRoZSByb290IHdpbmRvdyBvZiB0aGUKKyAgICAgICAgc2NyZWVuIG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdzY3JlZW5kZXB0aCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19zY3JlZW5oZWlnaHQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbnVtYmVyIG9mIHBpeGVscyBvZiB0aGUgaGVpZ2h0IG9mIHRoZSBzY3JlZW4gb2YgdGhpcyB3aWRnZXQKKyAgICAgICAgaW4gcGl4ZWwuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3NjcmVlbmhlaWdodCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19zY3JlZW5tbWhlaWdodChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgcGl4ZWxzIG9mIHRoZSBoZWlnaHQgb2YgdGhlIHNjcmVlbiBvZgorICAgICAgICB0aGlzIHdpZGdldCBpbiBtbS4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnc2NyZWVubW1oZWlnaHQnLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fc2NyZWVubW13aWR0aChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgcGl4ZWxzIG9mIHRoZSB3aWR0aCBvZiB0aGUgc2NyZWVuIG9mCisgICAgICAgIHRoaXMgd2lkZ2V0IGluIG1tLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdzY3JlZW5tbXdpZHRoJywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3NjcmVlbnZpc3VhbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIG9uZSBvZiB0aGUgc3RyaW5ncyBkaXJlY3Rjb2xvciwgZ3JheXNjYWxlLCBwc2V1ZG9jb2xvciwKKyAgICAgICAgc3RhdGljY29sb3IsIHN0YXRpY2dyYXksIG9yIHRydWVjb2xvciBmb3IgdGhlIGRlZmF1bHQKKyAgICAgICAgY29sb3Jtb2RlbCBvZiB0aGlzIHNjcmVlbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnc2NyZWVudmlzdWFsJywgc2VsZi5fdykKKyAgICBkZWYgd2luZm9fc2NyZWVud2lkdGgoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbnVtYmVyIG9mIHBpeGVscyBvZiB0aGUgd2lkdGggb2YgdGhlIHNjcmVlbiBvZgorICAgICAgICB0aGlzIHdpZGdldCBpbiBwaXhlbC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnc2NyZWVud2lkdGgnLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fc2VydmVyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gaW5mb3JtYXRpb24gb2YgdGhlIFgtU2VydmVyIG9mIHRoZSBzY3JlZW4gb2YgdGhpcyB3aWRnZXQgaW4KKyAgICAgICAgdGhlIGZvcm0gIlhtYWpvclJtaW5vciB2ZW5kb3IgdmVuZG9yVmVyc2lvbiIuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3NlcnZlcicsIHNlbGYuX3cpCisgICAgZGVmIHdpbmZvX3RvcGxldmVsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHRvcGxldmVsIHdpZGdldCBvZiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWV0b3dpZGdldChzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAnd2luZm8nLCAndG9wbGV2ZWwnLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fdmlld2FibGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSB3aWRnZXQgYW5kIGFsbCBpdHMgaGlnaGVyIGFuY2VzdG9ycyBhcmUgbWFwcGVkLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICd2aWV3YWJsZScsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb192aXN1YWwoc2VsZik6CisgICAgICAgICIiIlJldHVybiBvbmUgb2YgdGhlIHN0cmluZ3MgZGlyZWN0Y29sb3IsIGdyYXlzY2FsZSwgcHNldWRvY29sb3IsCisgICAgICAgIHN0YXRpY2NvbG9yLCBzdGF0aWNncmF5LCBvciB0cnVlY29sb3IgZm9yIHRoZQorICAgICAgICBjb2xvcm1vZGVsIG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3aW5mbycsICd2aXN1YWwnLCBzZWxmLl93KQorICAgIGRlZiB3aW5mb192aXN1YWxpZChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBYIGlkZW50aWZpZXIgZm9yIHRoZSB2aXN1YWwgZm9yIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3aW5mbycsICd2aXN1YWxpZCcsIHNlbGYuX3cpCisgICAgZGVmIHdpbmZvX3Zpc3VhbHNhdmFpbGFibGUoc2VsZiwgaW5jbHVkZWlkcz0wKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgdmlzdWFscyBhdmFpbGFibGUgZm9yIHRoZSBzY3JlZW4KKyAgICAgICAgb2YgdGhpcyB3aWRnZXQuCisKKyAgICAgICAgRWFjaCBpdGVtIGluIHRoZSBsaXN0IGNvbnNpc3RzIG9mIGEgdmlzdWFsIG5hbWUgKHNlZSB3aW5mb192aXN1YWwpLCBhCisgICAgICAgIGRlcHRoIGFuZCBpZiBJTkNMVURFSURTPTEgaXMgZ2l2ZW4gYWxzbyB0aGUgWCBpZGVudGlmaWVyLiIiIgorICAgICAgICBkYXRhID0gc2VsZi50ay5zcGxpdCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAndmlzdWFsc2F2YWlsYWJsZScsIHNlbGYuX3csCisgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlaWRzIGFuZCAnaW5jbHVkZWlkcycgb3IgTm9uZSkpCisgICAgICAgIGlmIHR5cGUoZGF0YSkgaXMgU3RyaW5nVHlwZToKKyAgICAgICAgICAgIGRhdGEgPSBbc2VsZi50ay5zcGxpdChkYXRhKV0KKyAgICAgICAgcmV0dXJuIG1hcChzZWxmLl9fd2luZm9fcGFyc2VpdGVtLCBkYXRhKQorICAgIGRlZiBfX3dpbmZvX3BhcnNlaXRlbShzZWxmLCB0KToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIHJldHVybiB0WzoxXSArIHR1cGxlKG1hcChzZWxmLl9fd2luZm9fZ2V0aW50LCB0WzE6XSkpCisgICAgZGVmIF9fd2luZm9fZ2V0aW50KHNlbGYsIHgpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuIGludCh4LCAwKQorICAgIGRlZiB3aW5mb192cm9vdGhlaWdodChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIHZpcnR1YWwgcm9vdCB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgICAgd2lkZ2V0IGluIHBpeGVscy4gSWYgdGhlcmUgaXMgbm8gdmlydHVhbCByb290IHdpbmRvdyByZXR1cm4gdGhlCisgICAgICAgIGhlaWdodCBvZiB0aGUgc2NyZWVuLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICd2cm9vdGhlaWdodCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb192cm9vdHdpZHRoKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSB2aXJ0dWFsIHJvb3Qgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgICAgIHdpZGdldCBpbiBwaXhlbC4gSWYgdGhlcmUgaXMgbm8gdmlydHVhbCByb290IHdpbmRvdyByZXR1cm4gdGhlCisgICAgICAgIHdpZHRoIG9mIHRoZSBzY3JlZW4uIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3Zyb290d2lkdGgnLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fdnJvb3R4KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHggb2Zmc2V0IG9mIHRoZSB2aXJ0dWFsIHJvb3QgcmVsYXRpdmUgdG8gdGhlIHJvb3QKKyAgICAgICAgd2luZG93IG9mIHRoZSBzY3JlZW4gb2YgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3Zyb290eCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb192cm9vdHkoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgeSBvZmZzZXQgb2YgdGhlIHZpcnR1YWwgcm9vdCByZWxhdGl2ZSB0byB0aGUgcm9vdAorICAgICAgICB3aW5kb3cgb2YgdGhlIHNjcmVlbiBvZiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAndnJvb3R5Jywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3dpZHRoKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHdpZHRoIG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICd3aWR0aCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb194KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhpcyB3aWRnZXQKKyAgICAgICAgaW4gdGhlIHBhcmVudC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAneCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb195KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhpcyB3aWRnZXQKKyAgICAgICAgaW4gdGhlIHBhcmVudC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAneScsIHNlbGYuX3cpKQorICAgIGRlZiB1cGRhdGUoc2VsZik6CisgICAgICAgICIiIkVudGVyIGV2ZW50IGxvb3AgdW50aWwgYWxsIHBlbmRpbmcgZXZlbnRzIGhhdmUgYmVlbiBwcm9jZXNzZWQgYnkgVGNsLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3VwZGF0ZScpCisgICAgZGVmIHVwZGF0ZV9pZGxldGFza3Moc2VsZik6CisgICAgICAgICIiIkVudGVyIGV2ZW50IGxvb3AgdW50aWwgYWxsIGlkbGUgY2FsbGJhY2tzIGhhdmUgYmVlbiBjYWxsZWQuIFRoaXMKKyAgICAgICAgd2lsbCB1cGRhdGUgdGhlIGRpc3BsYXkgb2Ygd2luZG93cyBidXQgbm90IHByb2Nlc3MgZXZlbnRzIGNhdXNlZCBieQorICAgICAgICB0aGUgdXNlci4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCd1cGRhdGUnLCAnaWRsZXRhc2tzJykKKyAgICBkZWYgYmluZHRhZ3Moc2VsZiwgdGFnTGlzdD1Ob25lKToKKyAgICAgICAgIiIiU2V0IG9yIGdldCB0aGUgbGlzdCBvZiBiaW5kdGFncyBmb3IgdGhpcyB3aWRnZXQuCisKKyAgICAgICAgV2l0aCBubyBhcmd1bWVudCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIGJpbmR0YWdzIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICB0aGlzIHdpZGdldC4gV2l0aCBhIGxpc3Qgb2Ygc3RyaW5ncyBhcyBhcmd1bWVudCB0aGUgYmluZHRhZ3MgYXJlCisgICAgICAgIHNldCB0byB0aGlzIGxpc3QuIFRoZSBiaW5kdGFncyBkZXRlcm1pbmUgaW4gd2hpY2ggb3JkZXIgZXZlbnRzIGFyZQorICAgICAgICBwcm9jZXNzZWQgKHNlZSBiaW5kKS4iIiIKKyAgICAgICAgaWYgdGFnTGlzdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnYmluZHRhZ3MnLCBzZWxmLl93KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnYmluZHRhZ3MnLCBzZWxmLl93LCB0YWdMaXN0KQorICAgIGRlZiBfYmluZChzZWxmLCB3aGF0LCBzZXF1ZW5jZSwgZnVuYywgYWRkLCBuZWVkY2xlYW51cD0xKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIGlmIHR5cGUoZnVuYykgaXMgU3RyaW5nVHlwZToKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCh3aGF0ICsgKHNlcXVlbmNlLCBmdW5jKSkKKyAgICAgICAgZWxpZiBmdW5jOgorICAgICAgICAgICAgZnVuY2lkID0gc2VsZi5fcmVnaXN0ZXIoZnVuYywgc2VsZi5fc3Vic3RpdHV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRjbGVhbnVwKQorICAgICAgICAgICAgY21kID0gKCclc2lmIHsiWyVzICVzXSIgPT0gImJyZWFrIn0gYnJlYWtcbicKKyAgICAgICAgICAgICAgICAgICAlCisgICAgICAgICAgICAgICAgICAgKGFkZCBhbmQgJysnIG9yICcnLAorICAgICAgICAgICAgICAgIGZ1bmNpZCwgc2VsZi5fc3Vic3RfZm9ybWF0X3N0cikpCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwod2hhdCArIChzZXF1ZW5jZSwgY21kKSkKKyAgICAgICAgICAgIHJldHVybiBmdW5jaWQKKyAgICAgICAgZWxpZiBzZXF1ZW5jZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwod2hhdCArIChzZXF1ZW5jZSwpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbCh3aGF0KSkKKyAgICBkZWYgYmluZChzZWxmLCBzZXF1ZW5jZT1Ob25lLCBmdW5jPU5vbmUsIGFkZD1Ob25lKToKKyAgICAgICAgIiIiQmluZCB0byB0aGlzIHdpZGdldCBhdCBldmVudCBTRVFVRU5DRSBhIGNhbGwgdG8gZnVuY3Rpb24gRlVOQy4KKworICAgICAgICBTRVFVRU5DRSBpcyBhIHN0cmluZyBvZiBjb25jYXRlbmF0ZWQgZXZlbnQKKyAgICAgICAgcGF0dGVybnMuIEFuIGV2ZW50IHBhdHRlcm4gaXMgb2YgdGhlIGZvcm0KKyAgICAgICAgPE1PRElGSUVSLU1PRElGSUVSLVRZUEUtREVUQUlMPiB3aGVyZSBNT0RJRklFUiBpcyBvbmUKKyAgICAgICAgb2YgQ29udHJvbCwgTW9kMiwgTTIsIFNoaWZ0LCBNb2QzLCBNMywgTG9jaywgTW9kNCwgTTQsCisgICAgICAgIEJ1dHRvbjEsIEIxLCBNb2Q1LCBNNSBCdXR0b24yLCBCMiwgTWV0YSwgTSwgQnV0dG9uMywKKyAgICAgICAgQjMsIEFsdCwgQnV0dG9uNCwgQjQsIERvdWJsZSwgQnV0dG9uNSwgQjUgVHJpcGxlLAorICAgICAgICBNb2QxLCBNMS4gVFlQRSBpcyBvbmUgb2YgQWN0aXZhdGUsIEVudGVyLCBNYXAsCisgICAgICAgIEJ1dHRvblByZXNzLCBCdXR0b24sIEV4cG9zZSwgTW90aW9uLCBCdXR0b25SZWxlYXNlCisgICAgICAgIEZvY3VzSW4sIE1vdXNlV2hlZWwsIENpcmN1bGF0ZSwgRm9jdXNPdXQsIFByb3BlcnR5LAorICAgICAgICBDb2xvcm1hcCwgR3Jhdml0eSBSZXBhcmVudCwgQ29uZmlndXJlLCBLZXlQcmVzcywgS2V5LAorICAgICAgICBVbm1hcCwgRGVhY3RpdmF0ZSwgS2V5UmVsZWFzZSBWaXNpYmlsaXR5LCBEZXN0cm95LAorICAgICAgICBMZWF2ZSBhbmQgREVUQUlMIGlzIHRoZSBidXR0b24gbnVtYmVyIGZvciBCdXR0b25QcmVzcywKKyAgICAgICAgQnV0dG9uUmVsZWFzZSBhbmQgREVUQUlMIGlzIHRoZSBLZXlzeW0gZm9yIEtleVByZXNzIGFuZAorICAgICAgICBLZXlSZWxlYXNlLiBFeGFtcGxlcyBhcmUKKyAgICAgICAgPENvbnRyb2wtQnV0dG9uLTE+IGZvciBwcmVzc2luZyBDb250cm9sIGFuZCBtb3VzZSBidXR0b24gMSBvcgorICAgICAgICA8QWx0LUE+IGZvciBwcmVzc2luZyBBIGFuZCB0aGUgQWx0IGtleSAoS2V5UHJlc3MgY2FuIGJlIG9taXR0ZWQpLgorICAgICAgICBBbiBldmVudCBwYXR0ZXJuIGNhbiBhbHNvIGJlIGEgdmlydHVhbCBldmVudCBvZiB0aGUgZm9ybQorICAgICAgICA8PEFTdHJpbmc+PiB3aGVyZSBBU3RyaW5nIGNhbiBiZSBhcmJpdHJhcnkuIFRoaXMKKyAgICAgICAgZXZlbnQgY2FuIGJlIGdlbmVyYXRlZCBieSBldmVudF9nZW5lcmF0ZS4KKyAgICAgICAgSWYgZXZlbnRzIGFyZSBjb25jYXRlbmF0ZWQgdGhleSBtdXN0IGFwcGVhciBzaG9ydGx5CisgICAgICAgIGFmdGVyIGVhY2ggb3RoZXIuCisKKyAgICAgICAgRlVOQyB3aWxsIGJlIGNhbGxlZCBpZiB0aGUgZXZlbnQgc2VxdWVuY2Ugb2NjdXJzIHdpdGggYW4KKyAgICAgICAgaW5zdGFuY2Ugb2YgRXZlbnQgYXMgYXJndW1lbnQuIElmIHRoZSByZXR1cm4gdmFsdWUgb2YgRlVOQyBpcworICAgICAgICAiYnJlYWsiIG5vIGZ1cnRoZXIgYm91bmQgZnVuY3Rpb24gaXMgaW52b2tlZC4KKworICAgICAgICBBbiBhZGRpdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyIEFERCBzcGVjaWZpZXMgd2hldGhlciBGVU5DIHdpbGwKKyAgICAgICAgYmUgY2FsbGVkIGFkZGl0aW9uYWxseSB0byB0aGUgb3RoZXIgYm91bmQgZnVuY3Rpb24gb3Igd2hldGhlcgorICAgICAgICBpdCB3aWxsIHJlcGxhY2UgdGhlIHByZXZpb3VzIGZ1bmN0aW9uLgorCisgICAgICAgIEJpbmQgd2lsbCByZXR1cm4gYW4gaWRlbnRpZmllciB0byBhbGxvdyBkZWxldGlvbiBvZiB0aGUgYm91bmQgZnVuY3Rpb24gd2l0aAorICAgICAgICB1bmJpbmQgd2l0aG91dCBtZW1vcnkgbGVhay4KKworICAgICAgICBJZiBGVU5DIG9yIFNFUVVFTkNFIGlzIG9taXR0ZWQgdGhlIGJvdW5kIGZ1bmN0aW9uIG9yIGxpc3QKKyAgICAgICAgb2YgYm91bmQgZXZlbnRzIGFyZSByZXR1cm5lZC4iIiIKKworICAgICAgICByZXR1cm4gc2VsZi5fYmluZCgoJ2JpbmQnLCBzZWxmLl93KSwgc2VxdWVuY2UsIGZ1bmMsIGFkZCkKKyAgICBkZWYgdW5iaW5kKHNlbGYsIHNlcXVlbmNlLCBmdW5jaWQ9Tm9uZSk6CisgICAgICAgICIiIlVuYmluZCBmb3IgdGhpcyB3aWRnZXQgZm9yIGV2ZW50IFNFUVVFTkNFICB0aGUKKyAgICAgICAgZnVuY3Rpb24gaWRlbnRpZmllZCB3aXRoIEZVTkNJRC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCdiaW5kJywgc2VsZi5fdywgc2VxdWVuY2UsICcnKQorICAgICAgICBpZiBmdW5jaWQ6CisgICAgICAgICAgICBzZWxmLmRlbGV0ZWNvbW1hbmQoZnVuY2lkKQorICAgIGRlZiBiaW5kX2FsbChzZWxmLCBzZXF1ZW5jZT1Ob25lLCBmdW5jPU5vbmUsIGFkZD1Ob25lKToKKyAgICAgICAgIiIiQmluZCB0byBhbGwgd2lkZ2V0cyBhdCBhbiBldmVudCBTRVFVRU5DRSBhIGNhbGwgdG8gZnVuY3Rpb24gRlVOQy4KKyAgICAgICAgQW4gYWRkaXRpb25hbCBib29sZWFuIHBhcmFtZXRlciBBREQgc3BlY2lmaWVzIHdoZXRoZXIgRlVOQyB3aWxsCisgICAgICAgIGJlIGNhbGxlZCBhZGRpdGlvbmFsbHkgdG8gdGhlIG90aGVyIGJvdW5kIGZ1bmN0aW9uIG9yIHdoZXRoZXIKKyAgICAgICAgaXQgd2lsbCByZXBsYWNlIHRoZSBwcmV2aW91cyBmdW5jdGlvbi4gU2VlIGJpbmQgZm9yIHRoZSByZXR1cm4gdmFsdWUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9iaW5kKCgnYmluZCcsICdhbGwnKSwgc2VxdWVuY2UsIGZ1bmMsIGFkZCwgMCkKKyAgICBkZWYgdW5iaW5kX2FsbChzZWxmLCBzZXF1ZW5jZSk6CisgICAgICAgICIiIlVuYmluZCBmb3IgYWxsIHdpZGdldHMgZm9yIGV2ZW50IFNFUVVFTkNFIGFsbCBmdW5jdGlvbnMuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgnYmluZCcsICdhbGwnICwgc2VxdWVuY2UsICcnKQorICAgIGRlZiBiaW5kX2NsYXNzKHNlbGYsIGNsYXNzTmFtZSwgc2VxdWVuY2U9Tm9uZSwgZnVuYz1Ob25lLCBhZGQ9Tm9uZSk6CisKKyAgICAgICAgIiIiQmluZCB0byB3aWRnZXRzIHdpdGggYmluZHRhZyBDTEFTU05BTUUgYXQgZXZlbnQKKyAgICAgICAgU0VRVUVOQ0UgYSBjYWxsIG9mIGZ1bmN0aW9uIEZVTkMuIEFuIGFkZGl0aW9uYWwKKyAgICAgICAgYm9vbGVhbiBwYXJhbWV0ZXIgQUREIHNwZWNpZmllcyB3aGV0aGVyIEZVTkMgd2lsbCBiZQorICAgICAgICBjYWxsZWQgYWRkaXRpb25hbGx5IHRvIHRoZSBvdGhlciBib3VuZCBmdW5jdGlvbiBvcgorICAgICAgICB3aGV0aGVyIGl0IHdpbGwgcmVwbGFjZSB0aGUgcHJldmlvdXMgZnVuY3Rpb24uIFNlZSBiaW5kIGZvcgorICAgICAgICB0aGUgcmV0dXJuIHZhbHVlLiIiIgorCisgICAgICAgIHJldHVybiBzZWxmLl9iaW5kKCgnYmluZCcsIGNsYXNzTmFtZSksIHNlcXVlbmNlLCBmdW5jLCBhZGQsIDApCisgICAgZGVmIHVuYmluZF9jbGFzcyhzZWxmLCBjbGFzc05hbWUsIHNlcXVlbmNlKToKKyAgICAgICAgIiIiVW5iaW5kIGZvciBhIGFsbCB3aWRnZXRzIHdpdGggYmluZHRhZyBDTEFTU05BTUUgZm9yIGV2ZW50IFNFUVVFTkNFCisgICAgICAgIGFsbCBmdW5jdGlvbnMuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgnYmluZCcsIGNsYXNzTmFtZSAsIHNlcXVlbmNlLCAnJykKKyAgICBkZWYgbWFpbmxvb3Aoc2VsZiwgbj0wKToKKyAgICAgICAgIiIiQ2FsbCB0aGUgbWFpbmxvb3Agb2YgVGsuIiIiCisgICAgICAgIHNlbGYudGsubWFpbmxvb3AobikKKyAgICBkZWYgcXVpdChzZWxmKToKKyAgICAgICAgIiIiUXVpdCB0aGUgVGNsIGludGVycHJldGVyLiBBbGwgd2lkZ2V0cyB3aWxsIGJlIGRlc3Ryb3llZC4iIiIKKyAgICAgICAgc2VsZi50ay5xdWl0KCkKKyAgICBkZWYgX2dldGludHMoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIGlmIHN0cmluZzoKKyAgICAgICAgICAgIHJldHVybiB0dXBsZShtYXAoZ2V0aW50LCBzZWxmLnRrLnNwbGl0bGlzdChzdHJpbmcpKSkKKyAgICBkZWYgX2dldGRvdWJsZXMoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIGlmIHN0cmluZzoKKyAgICAgICAgICAgIHJldHVybiB0dXBsZShtYXAoZ2V0ZG91YmxlLCBzZWxmLnRrLnNwbGl0bGlzdChzdHJpbmcpKSkKKyAgICBkZWYgX2dldGJvb2xlYW4oc2VsZiwgc3RyaW5nKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIGlmIHN0cmluZzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmdldGJvb2xlYW4oc3RyaW5nKQorICAgIGRlZiBfZGlzcGxheW9mKHNlbGYsIGRpc3BsYXlvZik6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICBpZiBkaXNwbGF5b2Y6CisgICAgICAgICAgICByZXR1cm4gKCctZGlzcGxheW9mJywgZGlzcGxheW9mKQorICAgICAgICBpZiBkaXNwbGF5b2YgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAoJy1kaXNwbGF5b2YnLCBzZWxmLl93KQorICAgICAgICByZXR1cm4gKCkKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX3dpbmRvd2luZ3N5c3RlbShzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yb290KCkuX3dpbmRvd2luZ3N5c3RlbV9jYWNoZWQKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgd3MgPSBzZWxmLl9yb290KCkuX3dpbmRvd2luZ3N5c3RlbV9jYWNoZWQgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrJywgJ3dpbmRvd2luZ3N5c3RlbScpCisgICAgICAgICAgICByZXR1cm4gd3MKKyAgICBkZWYgX29wdGlvbnMoc2VsZiwgY25mLCBrdyA9IE5vbmUpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgaWYga3c6CisgICAgICAgICAgICBjbmYgPSBfY25mbWVyZ2UoKGNuZiwga3cpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY25mID0gX2NuZm1lcmdlKGNuZikKKyAgICAgICAgcmVzID0gKCkKKyAgICAgICAgZm9yIGssIHYgaW4gY25mLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlmIGtbLTFdID09ICdfJzogayA9IGtbOi0xXQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIodiwgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICAgICAgICAgIHYgPSBzZWxmLl9yZWdpc3Rlcih2KQorICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2LCAodHVwbGUsIGxpc3QpKToKKyAgICAgICAgICAgICAgICAgICAgbnYgPSBbXQorICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB2OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaXRlbSwgKGJhc2VzdHJpbmcsIGludCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaXRlbSwgaW50KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudi5hcHBlbmQoJyVkJyAlIGl0ZW0pCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9ybWF0IGl0IHRvIHByb3BlciBUY2wgY29kZSBpZiBpdCBjb250YWlucyBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52LmFwcGVuZChfc3RyaW5naWZ5KGl0ZW0pKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgdiA9ICcgJy5qb2luKG52KQorICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArICgnLScraywgdikKKyAgICAgICAgcmV0dXJuIHJlcworICAgIGRlZiBuYW1ldG93aWRnZXQoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgVGtpbnRlciBpbnN0YW5jZSBvZiBhIHdpZGdldCBpZGVudGlmaWVkIGJ5CisgICAgICAgIGl0cyBUY2wgbmFtZSBOQU1FLiIiIgorICAgICAgICBuYW1lID0gc3RyKG5hbWUpLnNwbGl0KCcuJykKKyAgICAgICAgdyA9IHNlbGYKKworICAgICAgICBpZiBub3QgbmFtZVswXToKKyAgICAgICAgICAgIHcgPSB3Ll9yb290KCkKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lWzE6XQorCisgICAgICAgIGZvciBuIGluIG5hbWU6CisgICAgICAgICAgICBpZiBub3QgbjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdyA9IHcuY2hpbGRyZW5bbl0KKworICAgICAgICByZXR1cm4gdworICAgIF9uYW1ldG93aWRnZXQgPSBuYW1ldG93aWRnZXQKKyAgICBkZWYgX3JlZ2lzdGVyKHNlbGYsIGZ1bmMsIHN1YnN0PU5vbmUsIG5lZWRjbGVhbnVwPTEpOgorICAgICAgICAiIiJSZXR1cm4gYSBuZXdseSBjcmVhdGVkIFRjbCBmdW5jdGlvbi4gSWYgdGhpcworICAgICAgICBmdW5jdGlvbiBpcyBjYWxsZWQsIHRoZSBQeXRob24gZnVuY3Rpb24gRlVOQyB3aWxsCisgICAgICAgIGJlIGV4ZWN1dGVkLiBBbiBvcHRpb25hbCBmdW5jdGlvbiBTVUJTVCBjYW4KKyAgICAgICAgYmUgZ2l2ZW4gd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgRlVOQy4iIiIKKyAgICAgICAgZiA9IENhbGxXcmFwcGVyKGZ1bmMsIHN1YnN0LCBzZWxmKS5fX2NhbGxfXworICAgICAgICBuYW1lID0gcmVwcihpZChmKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYyA9IGZ1bmMuaW1fZnVuYworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgZnVuYy5fX25hbWVfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYudGsuY3JlYXRlY29tbWFuZChuYW1lLCBmKQorICAgICAgICBpZiBuZWVkY2xlYW51cDoKKyAgICAgICAgICAgIGlmIHNlbGYuX3RjbENvbW1hbmRzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMgPSBbXQorICAgICAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMuYXBwZW5kKG5hbWUpCisgICAgICAgIHJldHVybiBuYW1lCisgICAgcmVnaXN0ZXIgPSBfcmVnaXN0ZXIKKyAgICBkZWYgX3Jvb3Qoc2VsZik6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICB3ID0gc2VsZgorICAgICAgICB3aGlsZSB3Lm1hc3RlcjogdyA9IHcubWFzdGVyCisgICAgICAgIHJldHVybiB3CisgICAgX3N1YnN0X2Zvcm1hdCA9ICgnJSMnLCAnJWInLCAnJWYnLCAnJWgnLCAnJWsnLAorICAgICAgICAgICAgICclcycsICcldCcsICcldycsICcleCcsICcleScsCisgICAgICAgICAgICAgJyVBJywgJyVFJywgJyVLJywgJyVOJywgJyVXJywgJyVUJywgJyVYJywgJyVZJywgJyVEJykKKyAgICBfc3Vic3RfZm9ybWF0X3N0ciA9ICIgIi5qb2luKF9zdWJzdF9mb3JtYXQpCisgICAgZGVmIF9zdWJzdGl0dXRlKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIGlmIGxlbihhcmdzKSAhPSBsZW4oc2VsZi5fc3Vic3RfZm9ybWF0KTogcmV0dXJuIGFyZ3MKKyAgICAgICAgZ2V0Ym9vbGVhbiA9IHNlbGYudGsuZ2V0Ym9vbGVhbgorCisgICAgICAgIGdldGludCA9IGludAorICAgICAgICBkZWYgZ2V0aW50X2V2ZW50KHMpOgorICAgICAgICAgICAgIiIiVGsgY2hhbmdlZCBiZWhhdmlvciBpbiA4LjQuMiwgcmV0dXJuaW5nICI/PyIgcmF0aGVyIG1vcmUgb2Z0ZW4uIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGludChzKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuIHMKKworICAgICAgICBuc2lnbiwgYiwgZiwgaCwgaywgcywgdCwgdywgeCwgeSwgQSwgRSwgSywgTiwgVywgVCwgWCwgWSwgRCA9IGFyZ3MKKyAgICAgICAgIyBNaXNzaW5nOiAoYSwgYywgZCwgbSwgbywgdiwgQiwgUikKKyAgICAgICAgZSA9IEV2ZW50KCkKKyAgICAgICAgIyBzZXJpYWwgZmllbGQ6IHZhbGlkIHZvciBhbGwgZXZlbnRzCisgICAgICAgICMgbnVtYmVyIG9mIGJ1dHRvbjogQnV0dG9uUHJlc3MgYW5kIEJ1dHRvblJlbGVhc2UgZXZlbnRzIG9ubHkKKyAgICAgICAgIyBoZWlnaHQgZmllbGQ6IENvbmZpZ3VyZSwgQ29uZmlndXJlUmVxdWVzdCwgQ3JlYXRlLAorICAgICAgICAjIFJlc2l6ZVJlcXVlc3QsIGFuZCBFeHBvc2UgZXZlbnRzIG9ubHkKKyAgICAgICAgIyBrZXljb2RlIGZpZWxkOiBLZXlQcmVzcyBhbmQgS2V5UmVsZWFzZSBldmVudHMgb25seQorICAgICAgICAjIHRpbWUgZmllbGQ6ICJ2YWxpZCBmb3IgZXZlbnRzIHRoYXQgY29udGFpbiBhIHRpbWUgZmllbGQiCisgICAgICAgICMgd2lkdGggZmllbGQ6IENvbmZpZ3VyZSwgQ29uZmlndXJlUmVxdWVzdCwgQ3JlYXRlLCBSZXNpemVSZXF1ZXN0LAorICAgICAgICAjIGFuZCBFeHBvc2UgZXZlbnRzIG9ubHkKKyAgICAgICAgIyB4IGZpZWxkOiAidmFsaWQgZm9yIGV2ZW50cyB0aGF0IGNvbnRhaW4gYSB4IGZpZWxkIgorICAgICAgICAjIHkgZmllbGQ6ICJ2YWxpZCBmb3IgZXZlbnRzIHRoYXQgY29udGFpbiBhIHkgZmllbGQiCisgICAgICAgICMga2V5c3ltIGFzIGRlY2ltYWw6IEtleVByZXNzIGFuZCBLZXlSZWxlYXNlIGV2ZW50cyBvbmx5CisgICAgICAgICMgeF9yb290LCB5X3Jvb3QgZmllbGRzOiBCdXR0b25QcmVzcywgQnV0dG9uUmVsZWFzZSwgS2V5UHJlc3MsCisgICAgICAgICMgS2V5UmVsZWFzZSxhbmQgTW90aW9uIGV2ZW50cworICAgICAgICBlLnNlcmlhbCA9IGdldGludChuc2lnbikKKyAgICAgICAgZS5udW0gPSBnZXRpbnRfZXZlbnQoYikKKyAgICAgICAgdHJ5OiBlLmZvY3VzID0gZ2V0Ym9vbGVhbihmKQorICAgICAgICBleGNlcHQgVGNsRXJyb3I6IHBhc3MKKyAgICAgICAgZS5oZWlnaHQgPSBnZXRpbnRfZXZlbnQoaCkKKyAgICAgICAgZS5rZXljb2RlID0gZ2V0aW50X2V2ZW50KGspCisgICAgICAgIGUuc3RhdGUgPSBnZXRpbnRfZXZlbnQocykKKyAgICAgICAgZS50aW1lID0gZ2V0aW50X2V2ZW50KHQpCisgICAgICAgIGUud2lkdGggPSBnZXRpbnRfZXZlbnQodykKKyAgICAgICAgZS54ID0gZ2V0aW50X2V2ZW50KHgpCisgICAgICAgIGUueSA9IGdldGludF9ldmVudCh5KQorICAgICAgICBlLmNoYXIgPSBBCisgICAgICAgIHRyeTogZS5zZW5kX2V2ZW50ID0gZ2V0Ym9vbGVhbihFKQorICAgICAgICBleGNlcHQgVGNsRXJyb3I6IHBhc3MKKyAgICAgICAgZS5rZXlzeW0gPSBLCisgICAgICAgIGUua2V5c3ltX251bSA9IGdldGludF9ldmVudChOKQorICAgICAgICBlLnR5cGUgPSBUCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGUud2lkZ2V0ID0gc2VsZi5fbmFtZXRvd2lkZ2V0KFcpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGUud2lkZ2V0ID0gVworICAgICAgICBlLnhfcm9vdCA9IGdldGludF9ldmVudChYKQorICAgICAgICBlLnlfcm9vdCA9IGdldGludF9ldmVudChZKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBlLmRlbHRhID0gZ2V0aW50KEQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgZS5kZWx0YSA9IDAKKyAgICAgICAgcmV0dXJuIChlLCkKKyAgICBkZWYgX3JlcG9ydF9leGNlcHRpb24oc2VsZik6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGV4YywgdmFsLCB0YiA9IHN5cy5leGNfdHlwZSwgc3lzLmV4Y192YWx1ZSwgc3lzLmV4Y190cmFjZWJhY2sKKyAgICAgICAgcm9vdCA9IHNlbGYuX3Jvb3QoKQorICAgICAgICByb290LnJlcG9ydF9jYWxsYmFja19leGNlcHRpb24oZXhjLCB2YWwsIHRiKQorICAgIGRlZiBfY29uZmlndXJlKHNlbGYsIGNtZCwgY25mLCBrdyk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICBpZiBrdzoKKyAgICAgICAgICAgIGNuZiA9IF9jbmZtZXJnZSgoY25mLCBrdykpCisgICAgICAgIGVsaWYgY25mOgorICAgICAgICAgICAgY25mID0gX2NuZm1lcmdlKGNuZikKKyAgICAgICAgaWYgY25mIGlzIE5vbmU6CisgICAgICAgICAgICBjbmYgPSB7fQorICAgICAgICAgICAgZm9yIHggaW4gc2VsZi50ay5zcGxpdCgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKF9mbGF0dGVuKChzZWxmLl93LCBjbWQpKSkpOgorICAgICAgICAgICAgICAgIGNuZlt4WzBdWzE6XV0gPSAoeFswXVsxOl0sKSArIHhbMTpdCisgICAgICAgICAgICByZXR1cm4gY25mCisgICAgICAgIGlmIHR5cGUoY25mKSBpcyBTdHJpbmdUeXBlOgorICAgICAgICAgICAgeCA9IHNlbGYudGsuc3BsaXQoCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbChfZmxhdHRlbigoc2VsZi5fdywgY21kLCAnLScrY25mKSkpKQorICAgICAgICAgICAgcmV0dXJuICh4WzBdWzE6XSwpICsgeFsxOl0KKyAgICAgICAgc2VsZi50ay5jYWxsKF9mbGF0dGVuKChzZWxmLl93LCBjbWQpKSArIHNlbGYuX29wdGlvbnMoY25mKSkKKyAgICAjIFRoZXNlIHVzZWQgdG8gYmUgZGVmaW5lZCBpbiBXaWRnZXQ6CisgICAgZGVmIGNvbmZpZ3VyZShzZWxmLCBjbmY9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbmZpZ3VyZSByZXNvdXJjZXMgb2YgYSB3aWRnZXQuCisKKyAgICAgICAgVGhlIHZhbHVlcyBmb3IgcmVzb3VyY2VzIGFyZSBzcGVjaWZpZWQgYXMga2V5d29yZAorICAgICAgICBhcmd1bWVudHMuIFRvIGdldCBhbiBvdmVydmlldyBhYm91dAorICAgICAgICB0aGUgYWxsb3dlZCBrZXl3b3JkIGFyZ3VtZW50cyBjYWxsIHRoZSBtZXRob2Qga2V5cy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jb25maWd1cmUoJ2NvbmZpZ3VyZScsIGNuZiwga3cpCisgICAgY29uZmlnID0gY29uZmlndXJlCisgICAgZGVmIGNnZXQoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSByZXNvdXJjZSB2YWx1ZSBmb3IgYSBLRVkgZ2l2ZW4gYXMgc3RyaW5nLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdjZ2V0JywgJy0nICsga2V5KQorICAgIF9fZ2V0aXRlbV9fID0gY2dldAorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgc2VsZi5jb25maWd1cmUoe2tleTogdmFsdWV9KQorICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJUa2ludGVyIG9iamVjdHMgZG9uJ3Qgc3VwcG9ydCAnaW4nIHRlc3RzLiIpCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHJlc291cmNlIG5hbWVzIG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gbWFwKGxhbWJkYSB4OiB4WzBdWzE6XSwKKyAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdjb25maWd1cmUnKSkpCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgd2luZG93IHBhdGggbmFtZSBvZiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3cKKyAgICAjIFBhY2sgbWV0aG9kcyB0aGF0IGFwcGx5IHRvIHRoZSBtYXN0ZXIKKyAgICBfbm9hcmdfID0gWydfbm9hcmdfJ10KKyAgICBkZWYgcGFja19wcm9wYWdhdGUoc2VsZiwgZmxhZz1fbm9hcmdfKToKKyAgICAgICAgIiIiU2V0IG9yIGdldCB0aGUgc3RhdHVzIGZvciBwcm9wYWdhdGlvbiBvZiBnZW9tZXRyeSBpbmZvcm1hdGlvbi4KKworICAgICAgICBBIGJvb2xlYW4gYXJndW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIGdlb21ldHJ5IGluZm9ybWF0aW9uCisgICAgICAgIG9mIHRoZSBzbGF2ZXMgd2lsbCBkZXRlcm1pbmUgdGhlIHNpemUgb2YgdGhpcyB3aWRnZXQuIElmIG5vIGFyZ3VtZW50CisgICAgICAgIGlzIGdpdmVuIHRoZSBjdXJyZW50IHNldHRpbmcgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZsYWcgaXMgTWlzYy5fbm9hcmdfOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldGJvb2xlYW4oc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICAgICdwYWNrJywgJ3Byb3BhZ2F0ZScsIHNlbGYuX3cpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdwYWNrJywgJ3Byb3BhZ2F0ZScsIHNlbGYuX3csIGZsYWcpCisgICAgcHJvcGFnYXRlID0gcGFja19wcm9wYWdhdGUKKyAgICBkZWYgcGFja19zbGF2ZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHNsYXZlcyBvZiB0aGlzIHdpZGdldAorICAgICAgICBpbiBpdHMgcGFja2luZyBvcmRlci4iIiIKKyAgICAgICAgcmV0dXJuIG1hcChzZWxmLl9uYW1ldG93aWRnZXQsCisgICAgICAgICAgICAgICBzZWxmLnRrLnNwbGl0bGlzdCgKKyAgICAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3BhY2snLCAnc2xhdmVzJywgc2VsZi5fdykpKQorICAgIHNsYXZlcyA9IHBhY2tfc2xhdmVzCisgICAgIyBQbGFjZSBtZXRob2QgdGhhdCBhcHBsaWVzIHRvIHRoZSBtYXN0ZXIKKyAgICBkZWYgcGxhY2Vfc2xhdmVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBzbGF2ZXMgb2YgdGhpcyB3aWRnZXQKKyAgICAgICAgaW4gaXRzIHBhY2tpbmcgb3JkZXIuIiIiCisgICAgICAgIHJldHVybiBtYXAoc2VsZi5fbmFtZXRvd2lkZ2V0LAorICAgICAgICAgICAgICAgc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICAgICAgICAgICAncGxhY2UnLCAnc2xhdmVzJywgc2VsZi5fdykpKQorICAgICMgR3JpZCBtZXRob2RzIHRoYXQgYXBwbHkgdG8gdGhlIG1hc3RlcgorICAgIGRlZiBncmlkX2Jib3goc2VsZiwgY29sdW1uPU5vbmUsIHJvdz1Ob25lLCBjb2wyPU5vbmUsIHJvdzI9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIHR1cGxlIG9mIGludGVnZXIgY29vcmRpbmF0ZXMgZm9yIHRoZSBib3VuZGluZworICAgICAgICBib3ggb2YgdGhpcyB3aWRnZXQgY29udHJvbGxlZCBieSB0aGUgZ2VvbWV0cnkgbWFuYWdlciBncmlkLgorCisgICAgICAgIElmIENPTFVNTiwgUk9XIGlzIGdpdmVuIHRoZSBib3VuZGluZyBib3ggYXBwbGllcyBmcm9tCisgICAgICAgIHRoZSBjZWxsIHdpdGggcm93IGFuZCBjb2x1bW4gMCB0byB0aGUgc3BlY2lmaWVkCisgICAgICAgIGNlbGwuIElmIENPTDIgYW5kIFJPVzIgYXJlIGdpdmVuIHRoZSBib3VuZGluZyBib3gKKyAgICAgICAgc3RhcnRzIGF0IHRoYXQgY2VsbC4KKworICAgICAgICBUaGUgcmV0dXJuZWQgaW50ZWdlcnMgc3BlY2lmeSB0aGUgb2Zmc2V0IG9mIHRoZSB1cHBlciBsZWZ0CisgICAgICAgIGNvcm5lciBpbiB0aGUgbWFzdGVyIHdpZGdldCBhbmQgdGhlIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgICAgICIiIgorICAgICAgICBhcmdzID0gKCdncmlkJywgJ2Jib3gnLCBzZWxmLl93KQorICAgICAgICBpZiBjb2x1bW4gaXMgbm90IE5vbmUgYW5kIHJvdyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzICsgKGNvbHVtbiwgcm93KQorICAgICAgICBpZiBjb2wyIGlzIG5vdCBOb25lIGFuZCByb3cyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXJncyA9IGFyZ3MgKyAoY29sMiwgcm93MikKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKCphcmdzKSkgb3IgTm9uZQorCisgICAgYmJveCA9IGdyaWRfYmJveAorICAgIGRlZiBfZ3JpZF9jb25maWd1cmUoc2VsZiwgY29tbWFuZCwgaW5kZXgsIGNuZiwga3cpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgaWYgdHlwZShjbmYpIGlzIFN0cmluZ1R5cGUgYW5kIG5vdCBrdzoKKyAgICAgICAgICAgIGlmIGNuZlstMTpdID09ICdfJzoKKyAgICAgICAgICAgICAgICBjbmYgPSBjbmZbOi0xXQorICAgICAgICAgICAgaWYgY25mWzoxXSAhPSAnLSc6CisgICAgICAgICAgICAgICAgY25mID0gJy0nK2NuZgorICAgICAgICAgICAgb3B0aW9ucyA9IChjbmYsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3B0aW9ucyA9IHNlbGYuX29wdGlvbnMoY25mLCBrdykKKyAgICAgICAgaWYgbm90IG9wdGlvbnM6CisgICAgICAgICAgICByZXMgPSBzZWxmLnRrLmNhbGwoJ2dyaWQnLAorICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLCBzZWxmLl93LCBpbmRleCkKKyAgICAgICAgICAgIHdvcmRzID0gc2VsZi50ay5zcGxpdGxpc3QocmVzKQorICAgICAgICAgICAgZGljdCA9IHt9CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4od29yZHMpLCAyKToKKyAgICAgICAgICAgICAgICBrZXkgPSB3b3Jkc1tpXVsxOl0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHdvcmRzW2krMV0KKyAgICAgICAgICAgICAgICBpZiBub3QgdmFsdWU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gTm9uZQorICAgICAgICAgICAgICAgIGVsaWYgJy4nIGluIHZhbHVlOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldGRvdWJsZSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldGludCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBkaWN0W2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuIGRpY3QKKyAgICAgICAgcmVzID0gc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICAgICAgKCdncmlkJywgY29tbWFuZCwgc2VsZi5fdywgaW5kZXgpCisgICAgICAgICAgICAgICAgICArIG9wdGlvbnMpCisgICAgICAgIGlmIGxlbihvcHRpb25zKSA9PSAxOgorICAgICAgICAgICAgaWYgbm90IHJlczogcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICMgSW4gVGsgNy41LCAtd2lkdGggY2FuIGJlIGEgZmxvYXQKKyAgICAgICAgICAgIGlmICcuJyBpbiByZXM6IHJldHVybiBnZXRkb3VibGUocmVzKQorICAgICAgICAgICAgcmV0dXJuIGdldGludChyZXMpCisgICAgZGVmIGdyaWRfY29sdW1uY29uZmlndXJlKHNlbGYsIGluZGV4LCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25maWd1cmUgY29sdW1uIElOREVYIG9mIGEgZ3JpZC4KKworICAgICAgICBWYWxpZCByZXNvdXJjZXMgYXJlIG1pbnNpemUgKG1pbmltdW0gc2l6ZSBvZiB0aGUgY29sdW1uKSwKKyAgICAgICAgd2VpZ2h0IChob3cgbXVjaCBkb2VzIGFkZGl0aW9uYWwgc3BhY2UgcHJvcGFnYXRlIHRvIHRoaXMgY29sdW1uKQorICAgICAgICBhbmQgcGFkIChob3cgbXVjaCBzcGFjZSB0byBsZXQgYWRkaXRpb25hbGx5KS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dyaWRfY29uZmlndXJlKCdjb2x1bW5jb25maWd1cmUnLCBpbmRleCwgY25mLCBrdykKKyAgICBjb2x1bW5jb25maWd1cmUgPSBncmlkX2NvbHVtbmNvbmZpZ3VyZQorICAgIGRlZiBncmlkX2xvY2F0aW9uKHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJSZXR1cm4gYSB0dXBsZSBvZiBjb2x1bW4gYW5kIHJvdyB3aGljaCBpZGVudGlmeSB0aGUgY2VsbAorICAgICAgICBhdCB3aGljaCB0aGUgcGl4ZWwgYXQgcG9zaXRpb24gWCBhbmQgWSBpbnNpZGUgdGhlIG1hc3RlcgorICAgICAgICB3aWRnZXQgaXMgbG9jYXRlZC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgJ2dyaWQnLCAnbG9jYXRpb24nLCBzZWxmLl93LCB4LCB5KSkgb3IgTm9uZQorICAgIGRlZiBncmlkX3Byb3BhZ2F0ZShzZWxmLCBmbGFnPV9ub2FyZ18pOgorICAgICAgICAiIiJTZXQgb3IgZ2V0IHRoZSBzdGF0dXMgZm9yIHByb3BhZ2F0aW9uIG9mIGdlb21ldHJ5IGluZm9ybWF0aW9uLgorCisgICAgICAgIEEgYm9vbGVhbiBhcmd1bWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZ2VvbWV0cnkgaW5mb3JtYXRpb24KKyAgICAgICAgb2YgdGhlIHNsYXZlcyB3aWxsIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGlzIHdpZGdldC4gSWYgbm8gYXJndW1lbnQKKyAgICAgICAgaXMgZ2l2ZW4sIHRoZSBjdXJyZW50IHNldHRpbmcgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZsYWcgaXMgTWlzYy5fbm9hcmdfOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldGJvb2xlYW4oc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICAgICdncmlkJywgJ3Byb3BhZ2F0ZScsIHNlbGYuX3cpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdncmlkJywgJ3Byb3BhZ2F0ZScsIHNlbGYuX3csIGZsYWcpCisgICAgZGVmIGdyaWRfcm93Y29uZmlndXJlKHNlbGYsIGluZGV4LCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25maWd1cmUgcm93IElOREVYIG9mIGEgZ3JpZC4KKworICAgICAgICBWYWxpZCByZXNvdXJjZXMgYXJlIG1pbnNpemUgKG1pbmltdW0gc2l6ZSBvZiB0aGUgcm93KSwKKyAgICAgICAgd2VpZ2h0IChob3cgbXVjaCBkb2VzIGFkZGl0aW9uYWwgc3BhY2UgcHJvcGFnYXRlIHRvIHRoaXMgcm93KQorICAgICAgICBhbmQgcGFkIChob3cgbXVjaCBzcGFjZSB0byBsZXQgYWRkaXRpb25hbGx5KS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dyaWRfY29uZmlndXJlKCdyb3djb25maWd1cmUnLCBpbmRleCwgY25mLCBrdykKKyAgICByb3djb25maWd1cmUgPSBncmlkX3Jvd2NvbmZpZ3VyZQorICAgIGRlZiBncmlkX3NpemUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIHR1cGxlIG9mIHRoZSBudW1iZXIgb2YgY29sdW1uIGFuZCByb3dzIGluIHRoZSBncmlkLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnZ3JpZCcsICdzaXplJywgc2VsZi5fdykpIG9yIE5vbmUKKyAgICBzaXplID0gZ3JpZF9zaXplCisgICAgZGVmIGdyaWRfc2xhdmVzKHNlbGYsIHJvdz1Ob25lLCBjb2x1bW49Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHNsYXZlcyBvZiB0aGlzIHdpZGdldAorICAgICAgICBpbiBpdHMgcGFja2luZyBvcmRlci4iIiIKKyAgICAgICAgYXJncyA9ICgpCisgICAgICAgIGlmIHJvdyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzICsgKCctcm93Jywgcm93KQorICAgICAgICBpZiBjb2x1bW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhcmdzID0gYXJncyArICgnLWNvbHVtbicsIGNvbHVtbikKKyAgICAgICAgcmV0dXJuIG1hcChzZWxmLl9uYW1ldG93aWRnZXQsCisgICAgICAgICAgICAgICBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgICAgKCdncmlkJywgJ3NsYXZlcycsIHNlbGYuX3cpICsgYXJncykpKQorCisgICAgIyBTdXBwb3J0IGZvciB0aGUgImV2ZW50IiBjb21tYW5kLCBuZXcgaW4gVGsgNC4yLgorICAgICMgQnkgQ2FzZSBSb29sZS4KKworICAgIGRlZiBldmVudF9hZGQoc2VsZiwgdmlydHVhbCwgKnNlcXVlbmNlcyk6CisgICAgICAgICIiIkJpbmQgYSB2aXJ0dWFsIGV2ZW50IFZJUlRVQUwgKG9mIHRoZSBmb3JtIDw8TmFtZT4+KQorICAgICAgICB0byBhbiBldmVudCBTRVFVRU5DRSBzdWNoIHRoYXQgdGhlIHZpcnR1YWwgZXZlbnQgaXMgdHJpZ2dlcmVkCisgICAgICAgIHdoZW5ldmVyIFNFUVVFTkNFIG9jY3Vycy4iIiIKKyAgICAgICAgYXJncyA9ICgnZXZlbnQnLCAnYWRkJywgdmlydHVhbCkgKyBzZXF1ZW5jZXMKKyAgICAgICAgc2VsZi50ay5jYWxsKGFyZ3MpCisKKyAgICBkZWYgZXZlbnRfZGVsZXRlKHNlbGYsIHZpcnR1YWwsICpzZXF1ZW5jZXMpOgorICAgICAgICAiIiJVbmJpbmQgYSB2aXJ0dWFsIGV2ZW50IFZJUlRVQUwgZnJvbSBTRVFVRU5DRS4iIiIKKyAgICAgICAgYXJncyA9ICgnZXZlbnQnLCAnZGVsZXRlJywgdmlydHVhbCkgKyBzZXF1ZW5jZXMKKyAgICAgICAgc2VsZi50ay5jYWxsKGFyZ3MpCisKKyAgICBkZWYgZXZlbnRfZ2VuZXJhdGUoc2VsZiwgc2VxdWVuY2UsICoqa3cpOgorICAgICAgICAiIiJHZW5lcmF0ZSBhbiBldmVudCBTRVFVRU5DRS4gQWRkaXRpb25hbAorICAgICAgICBrZXl3b3JkIGFyZ3VtZW50cyBzcGVjaWZ5IHBhcmFtZXRlciBvZiB0aGUgZXZlbnQKKyAgICAgICAgKGUuZy4geCwgeSwgcm9vdHgsIHJvb3R5KS4iIiIKKyAgICAgICAgYXJncyA9ICgnZXZlbnQnLCAnZ2VuZXJhdGUnLCBzZWxmLl93LCBzZXF1ZW5jZSkKKyAgICAgICAgZm9yIGssIHYgaW4ga3cuaXRlbXMoKToKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzICsgKCctJXMnICUgaywgc3RyKHYpKQorICAgICAgICBzZWxmLnRrLmNhbGwoYXJncykKKworICAgIGRlZiBldmVudF9pbmZvKHNlbGYsIHZpcnR1YWw9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHZpcnR1YWwgZXZlbnRzIG9yIHRoZSBpbmZvcm1hdGlvbgorICAgICAgICBhYm91dCB0aGUgU0VRVUVOQ0UgYm91bmQgdG8gdGhlIHZpcnR1YWwgZXZlbnQgVklSVFVBTC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdldmVudCcsICdpbmZvJywgdmlydHVhbCkpCisKKyAgICAjIEltYWdlIHJlbGF0ZWQgY29tbWFuZHMKKworICAgIGRlZiBpbWFnZV9uYW1lcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgZXhpc3RpbmcgaW1hZ2UgbmFtZXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ2ltYWdlJywgJ25hbWVzJykKKworICAgIGRlZiBpbWFnZV90eXBlcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGltYWdlIHR5cGVzIChlLmcuIHBob3RlIGJpdG1hcCkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ2ltYWdlJywgJ3R5cGVzJykKKworCitjbGFzcyBDYWxsV3JhcHBlcjoKKyAgICAiIiJJbnRlcm5hbCBjbGFzcy4gU3RvcmVzIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBzb21lIHVzZXIKKyAgICBkZWZpbmVkIFRjbCBmdW5jdGlvbiBpcyBjYWxsZWQgZS5nLiBhZnRlciBhbiBldmVudCBvY2N1cnJlZC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnVuYywgc3Vic3QsIHdpZGdldCk6CisgICAgICAgICIiIlN0b3JlIEZVTkMsIFNVQlNUIGFuZCBXSURHRVQgYXMgbWVtYmVycy4iIiIKKyAgICAgICAgc2VsZi5mdW5jID0gZnVuYworICAgICAgICBzZWxmLnN1YnN0ID0gc3Vic3QKKyAgICAgICAgc2VsZi53aWRnZXQgPSB3aWRnZXQKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJBcHBseSBmaXJzdCBmdW5jdGlvbiBTVUJTVCB0byBhcmd1bWVudHMsIHRoYW4gRlVOQy4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5zdWJzdDoKKyAgICAgICAgICAgICAgICBhcmdzID0gc2VsZi5zdWJzdCgqYXJncykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZ1bmMoKmFyZ3MpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCBtc2c6CisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCBtc2cKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi53aWRnZXQuX3JlcG9ydF9leGNlcHRpb24oKQorCisKK2NsYXNzIFhWaWV3OgorICAgICIiIk1peC1pbiBjbGFzcyBmb3IgcXVlcnlpbmcgYW5kIGNoYW5naW5nIHRoZSBob3Jpem9udGFsIHBvc2l0aW9uCisgICAgb2YgYSB3aWRnZXQncyB3aW5kb3cuIiIiCisKKyAgICBkZWYgeHZpZXcoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJRdWVyeSBhbmQgY2hhbmdlIHRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSB2aWV3LiIiIgorICAgICAgICByZXMgPSBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3h2aWV3JywgKmFyZ3MpCisgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldGRvdWJsZXMocmVzKQorCisgICAgZGVmIHh2aWV3X21vdmV0byhzZWxmLCBmcmFjdGlvbik6CisgICAgICAgICIiIkFkanVzdHMgdGhlIHZpZXcgaW4gdGhlIHdpbmRvdyBzbyB0aGF0IEZSQUNUSU9OIG9mIHRoZQorICAgICAgICB0b3RhbCB3aWR0aCBvZiB0aGUgY2FudmFzIGlzIG9mZi1zY3JlZW4gdG8gdGhlIGxlZnQuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAneHZpZXcnLCAnbW92ZXRvJywgZnJhY3Rpb24pCisKKyAgICBkZWYgeHZpZXdfc2Nyb2xsKHNlbGYsIG51bWJlciwgd2hhdCk6CisgICAgICAgICIiIlNoaWZ0IHRoZSB4LXZpZXcgYWNjb3JkaW5nIHRvIE5VTUJFUiB3aGljaCBpcyBtZWFzdXJlZCBpbiAidW5pdHMiCisgICAgICAgIG9yICJwYWdlcyIgKFdIQVQpLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3h2aWV3JywgJ3Njcm9sbCcsIG51bWJlciwgd2hhdCkKKworCitjbGFzcyBZVmlldzoKKyAgICAiIiJNaXgtaW4gY2xhc3MgZm9yIHF1ZXJ5aW5nIGFuZCBjaGFuZ2luZyB0aGUgdmVydGljYWwgcG9zaXRpb24KKyAgICBvZiBhIHdpZGdldCdzIHdpbmRvdy4iIiIKKworICAgIGRlZiB5dmlldyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlF1ZXJ5IGFuZCBjaGFuZ2UgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSB2aWV3LiIiIgorICAgICAgICByZXMgPSBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3l2aWV3JywgKmFyZ3MpCisgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldGRvdWJsZXMocmVzKQorCisgICAgZGVmIHl2aWV3X21vdmV0byhzZWxmLCBmcmFjdGlvbik6CisgICAgICAgICIiIkFkanVzdHMgdGhlIHZpZXcgaW4gdGhlIHdpbmRvdyBzbyB0aGF0IEZSQUNUSU9OIG9mIHRoZQorICAgICAgICB0b3RhbCBoZWlnaHQgb2YgdGhlIGNhbnZhcyBpcyBvZmYtc2NyZWVuIHRvIHRoZSB0b3AuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAneXZpZXcnLCAnbW92ZXRvJywgZnJhY3Rpb24pCisKKyAgICBkZWYgeXZpZXdfc2Nyb2xsKHNlbGYsIG51bWJlciwgd2hhdCk6CisgICAgICAgICIiIlNoaWZ0IHRoZSB5LXZpZXcgYWNjb3JkaW5nIHRvIE5VTUJFUiB3aGljaCBpcyBtZWFzdXJlZCBpbgorICAgICAgICAidW5pdHMiIG9yICJwYWdlcyIgKFdIQVQpLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3l2aWV3JywgJ3Njcm9sbCcsIG51bWJlciwgd2hhdCkKKworCitjbGFzcyBXbToKKyAgICAiIiJQcm92aWRlcyBmdW5jdGlvbnMgZm9yIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlIHdpbmRvdyBtYW5hZ2VyLiIiIgorCisgICAgZGVmIHdtX2FzcGVjdChzZWxmLAorICAgICAgICAgICAgICBtaW5OdW1lcj1Ob25lLCBtaW5EZW5vbT1Ob25lLAorICAgICAgICAgICAgICBtYXhOdW1lcj1Ob25lLCBtYXhEZW5vbT1Ob25lKToKKyAgICAgICAgIiIiSW5zdHJ1Y3QgdGhlIHdpbmRvdyBtYW5hZ2VyIHRvIHNldCB0aGUgYXNwZWN0IHJhdGlvICh3aWR0aC9oZWlnaHQpCisgICAgICAgIG9mIHRoaXMgd2lkZ2V0IHRvIGJlIGJldHdlZW4gTUlOTlVNRVIvTUlOREVOT00gYW5kIE1BWE5VTUVSL01BWERFTk9NLiBSZXR1cm4gYSB0dXBsZQorICAgICAgICBvZiB0aGUgYWN0dWFsIHZhbHVlcyBpZiBubyBhcmd1bWVudCBpcyBnaXZlbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dtJywgJ2FzcGVjdCcsIHNlbGYuX3csCisgICAgICAgICAgICAgICAgICAgICBtaW5OdW1lciwgbWluRGVub20sCisgICAgICAgICAgICAgICAgICAgICBtYXhOdW1lciwgbWF4RGVub20pKQorICAgIGFzcGVjdCA9IHdtX2FzcGVjdAorCisgICAgZGVmIHdtX2F0dHJpYnV0ZXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJUaGlzIHN1YmNvbW1hbmQgcmV0dXJucyBvciBzZXRzIHBsYXRmb3JtIHNwZWNpZmljIGF0dHJpYnV0ZXMKKworICAgICAgICBUaGUgZmlyc3QgZm9ybSByZXR1cm5zIGEgbGlzdCBvZiB0aGUgcGxhdGZvcm0gc3BlY2lmaWMgZmxhZ3MgYW5kCisgICAgICAgIHRoZWlyIHZhbHVlcy4gVGhlIHNlY29uZCBmb3JtIHJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgc3BlY2lmaWMKKyAgICAgICAgb3B0aW9uLiBUaGUgdGhpcmQgZm9ybSBzZXRzIG9uZSBvciBtb3JlIG9mIHRoZSB2YWx1ZXMuIFRoZSB2YWx1ZXMKKyAgICAgICAgYXJlIGFzIGZvbGxvd3M6CisKKyAgICAgICAgT24gV2luZG93cywgLWRpc2FibGVkIGdldHMgb3Igc2V0cyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgaW4gYQorICAgICAgICBkaXNhYmxlZCBzdGF0ZS4gLXRvb2x3aW5kb3cgZ2V0cyBvciBzZXRzIHRoZSBzdHlsZSBvZiB0aGUgd2luZG93CisgICAgICAgIHRvIHRvb2x3aW5kb3cgKGFzIGRlZmluZWQgaW4gdGhlIE1TRE4pLiAtdG9wbW9zdCBnZXRzIG9yIHNldHMKKyAgICAgICAgd2hldGhlciB0aGlzIGlzIGEgdG9wbW9zdCB3aW5kb3cgKGRpc3BsYXlzIGFib3ZlIGFsbCBvdGhlcgorICAgICAgICB3aW5kb3dzKS4KKworICAgICAgICBPbiBNYWNpbnRvc2gsIFhYWFhYCisKKyAgICAgICAgT24gVW5peCwgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBzcGVjaWFsIGF0dHJpYnV0ZSB2YWx1ZXMuCisgICAgICAgICIiIgorICAgICAgICBhcmdzID0gKCd3bScsICdhdHRyaWJ1dGVzJywgc2VsZi5fdykgKyBhcmdzCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoYXJncykKKyAgICBhdHRyaWJ1dGVzPXdtX2F0dHJpYnV0ZXMKKworICAgIGRlZiB3bV9jbGllbnQoc2VsZiwgbmFtZT1Ob25lKToKKyAgICAgICAgIiIiU3RvcmUgTkFNRSBpbiBXTV9DTElFTlRfTUFDSElORSBwcm9wZXJ0eSBvZiB0aGlzIHdpZGdldC4gUmV0dXJuCisgICAgICAgIGN1cnJlbnQgdmFsdWUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2NsaWVudCcsIHNlbGYuX3csIG5hbWUpCisgICAgY2xpZW50ID0gd21fY2xpZW50CisgICAgZGVmIHdtX2NvbG9ybWFwd2luZG93cyhzZWxmLCAqd2xpc3QpOgorICAgICAgICAiIiJTdG9yZSBsaXN0IG9mIHdpbmRvdyBuYW1lcyAoV0xJU1QpIGludG8gV01fQ09MT1JNQVBXSU5ET1dTIHByb3BlcnR5CisgICAgICAgIG9mIHRoaXMgd2lkZ2V0LiBUaGlzIGxpc3QgY29udGFpbnMgd2luZG93cyB3aG9zZSBjb2xvcm1hcHMgZGlmZmVyIGZyb20gdGhlaXIKKyAgICAgICAgcGFyZW50cy4gUmV0dXJuIGN1cnJlbnQgbGlzdCBvZiB3aWRnZXRzIGlmIFdMSVNUIGlzIGVtcHR5LiIiIgorICAgICAgICBpZiBsZW4od2xpc3QpID4gMToKKyAgICAgICAgICAgIHdsaXN0ID0gKHdsaXN0LCkgIyBUayBuZWVkcyBhIGxpc3Qgb2Ygd2luZG93cyBoZXJlCisgICAgICAgIGFyZ3MgPSAoJ3dtJywgJ2NvbG9ybWFwd2luZG93cycsIHNlbGYuX3cpICsgd2xpc3QKKyAgICAgICAgcmV0dXJuIG1hcChzZWxmLl9uYW1ldG93aWRnZXQsIHNlbGYudGsuY2FsbChhcmdzKSkKKyAgICBjb2xvcm1hcHdpbmRvd3MgPSB3bV9jb2xvcm1hcHdpbmRvd3MKKyAgICBkZWYgd21fY29tbWFuZChzZWxmLCB2YWx1ZT1Ob25lKToKKyAgICAgICAgIiIiU3RvcmUgVkFMVUUgaW4gV01fQ09NTUFORCBwcm9wZXJ0eS4gSXQgaXMgdGhlIGNvbW1hbmQKKyAgICAgICAgd2hpY2ggc2hhbGwgYmUgdXNlZCB0byBpbnZva2UgdGhlIGFwcGxpY2F0aW9uLiBSZXR1cm4gY3VycmVudAorICAgICAgICBjb21tYW5kIGlmIFZBTFVFIGlzIE5vbmUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2NvbW1hbmQnLCBzZWxmLl93LCB2YWx1ZSkKKyAgICBjb21tYW5kID0gd21fY29tbWFuZAorICAgIGRlZiB3bV9kZWljb25pZnkoc2VsZik6CisgICAgICAgICIiIkRlaWNvbmlmeSB0aGlzIHdpZGdldC4gSWYgaXQgd2FzIG5ldmVyIG1hcHBlZCBpdCB3aWxsIG5vdCBiZSBtYXBwZWQuCisgICAgICAgIE9uIFdpbmRvd3MgaXQgd2lsbCByYWlzZSB0aGlzIHdpZGdldCBhbmQgZ2l2ZSBpdCB0aGUgZm9jdXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2RlaWNvbmlmeScsIHNlbGYuX3cpCisgICAgZGVpY29uaWZ5ID0gd21fZGVpY29uaWZ5CisgICAgZGVmIHdtX2ZvY3VzbW9kZWwoc2VsZiwgbW9kZWw9Tm9uZSk6CisgICAgICAgICIiIlNldCBmb2N1cyBtb2RlbCB0byBNT0RFTC4gImFjdGl2ZSIgbWVhbnMgdGhhdCB0aGlzIHdpZGdldCB3aWxsIGNsYWltCisgICAgICAgIHRoZSBmb2N1cyBpdHNlbGYsICJwYXNzaXZlIiBtZWFucyB0aGF0IHRoZSB3aW5kb3cgbWFuYWdlciBzaGFsbCBnaXZlCisgICAgICAgIHRoZSBmb2N1cy4gUmV0dXJuIGN1cnJlbnQgZm9jdXMgbW9kZWwgaWYgTU9ERUwgaXMgTm9uZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnZm9jdXNtb2RlbCcsIHNlbGYuX3csIG1vZGVsKQorICAgIGZvY3VzbW9kZWwgPSB3bV9mb2N1c21vZGVsCisgICAgZGVmIHdtX2ZyYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gaWRlbnRpZmllciBmb3IgZGVjb3JhdGl2ZSBmcmFtZSBvZiB0aGlzIHdpZGdldCBpZiBwcmVzZW50LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdmcmFtZScsIHNlbGYuX3cpCisgICAgZnJhbWUgPSB3bV9mcmFtZQorICAgIGRlZiB3bV9nZW9tZXRyeShzZWxmLCBuZXdHZW9tZXRyeT1Ob25lKToKKyAgICAgICAgIiIiU2V0IGdlb21ldHJ5IHRvIE5FV0dFT01FVFJZIG9mIHRoZSBmb3JtID13aWR0aHhoZWlnaHQreCt5LiBSZXR1cm4KKyAgICAgICAgY3VycmVudCB2YWx1ZSBpZiBOb25lIGlzIGdpdmVuLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdnZW9tZXRyeScsIHNlbGYuX3csIG5ld0dlb21ldHJ5KQorICAgIGdlb21ldHJ5ID0gd21fZ2VvbWV0cnkKKyAgICBkZWYgd21fZ3JpZChzZWxmLAorICAgICAgICAgYmFzZVdpZHRoPU5vbmUsIGJhc2VIZWlnaHQ9Tm9uZSwKKyAgICAgICAgIHdpZHRoSW5jPU5vbmUsIGhlaWdodEluYz1Ob25lKToKKyAgICAgICAgIiIiSW5zdHJ1Y3QgdGhlIHdpbmRvdyBtYW5hZ2VyIHRoYXQgdGhpcyB3aWRnZXQgc2hhbGwgb25seSBiZQorICAgICAgICByZXNpemVkIG9uIGdyaWQgYm91bmRhcmllcy4gV0lEVEhJTkMgYW5kIEhFSUdIVElOQyBhcmUgdGhlIHdpZHRoIGFuZAorICAgICAgICBoZWlnaHQgb2YgYSBncmlkIHVuaXQgaW4gcGl4ZWxzLiBCQVNFV0lEVEggYW5kIEJBU0VIRUlHSFQgYXJlIHRoZQorICAgICAgICBudW1iZXIgb2YgZ3JpZCB1bml0cyByZXF1ZXN0ZWQgaW4gVGtfR2VvbWV0cnlSZXF1ZXN0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cyhzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAnd20nLCAnZ3JpZCcsIHNlbGYuX3csCisgICAgICAgICAgICBiYXNlV2lkdGgsIGJhc2VIZWlnaHQsIHdpZHRoSW5jLCBoZWlnaHRJbmMpKQorICAgIGdyaWQgPSB3bV9ncmlkCisgICAgZGVmIHdtX2dyb3VwKHNlbGYsIHBhdGhOYW1lPU5vbmUpOgorICAgICAgICAiIiJTZXQgdGhlIGdyb3VwIGxlYWRlciB3aWRnZXRzIGZvciByZWxhdGVkIHdpZGdldHMgdG8gUEFUSE5BTUUuIFJldHVybgorICAgICAgICB0aGUgZ3JvdXAgbGVhZGVyIG9mIHRoaXMgd2lkZ2V0IGlmIE5vbmUgaXMgZ2l2ZW4uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2dyb3VwJywgc2VsZi5fdywgcGF0aE5hbWUpCisgICAgZ3JvdXAgPSB3bV9ncm91cAorICAgIGRlZiB3bV9pY29uYml0bWFwKHNlbGYsIGJpdG1hcD1Ob25lLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAiIiJTZXQgYml0bWFwIGZvciB0aGUgaWNvbmlmaWVkIHdpZGdldCB0byBCSVRNQVAuIFJldHVybgorICAgICAgICB0aGUgYml0bWFwIGlmIE5vbmUgaXMgZ2l2ZW4uCisKKyAgICAgICAgVW5kZXIgV2luZG93cywgdGhlIERFRkFVTFQgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaWNvbgorICAgICAgICBmb3IgdGhlIHdpZGdldCBhbmQgYW55IGRlc2NlbmRlbnRzIHRoYXQgZG9uJ3QgaGF2ZSBhbiBpY29uIHNldAorICAgICAgICBleHBsaWNpdGx5LiAgREVGQVVMVCBjYW4gYmUgdGhlIHJlbGF0aXZlIHBhdGggdG8gYSAuaWNvIGZpbGUKKyAgICAgICAgKGV4YW1wbGU6IHJvb3QuaWNvbmJpdG1hcChkZWZhdWx0PSdteWljb24uaWNvJykgKS4gIFNlZSBUaworICAgICAgICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLiIiIgorICAgICAgICBpZiBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnaWNvbmJpdG1hcCcsIHNlbGYuX3csICctZGVmYXVsdCcsIGRlZmF1bHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdpY29uYml0bWFwJywgc2VsZi5fdywgYml0bWFwKQorICAgIGljb25iaXRtYXAgPSB3bV9pY29uYml0bWFwCisgICAgZGVmIHdtX2ljb25pZnkoc2VsZik6CisgICAgICAgICIiIkRpc3BsYXkgd2lkZ2V0IGFzIGljb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2ljb25pZnknLCBzZWxmLl93KQorICAgIGljb25pZnkgPSB3bV9pY29uaWZ5CisgICAgZGVmIHdtX2ljb25tYXNrKHNlbGYsIGJpdG1hcD1Ob25lKToKKyAgICAgICAgIiIiU2V0IG1hc2sgZm9yIHRoZSBpY29uIGJpdG1hcCBvZiB0aGlzIHdpZGdldC4gUmV0dXJuIHRoZQorICAgICAgICBtYXNrIGlmIE5vbmUgaXMgZ2l2ZW4uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2ljb25tYXNrJywgc2VsZi5fdywgYml0bWFwKQorICAgIGljb25tYXNrID0gd21faWNvbm1hc2sKKyAgICBkZWYgd21faWNvbm5hbWUoc2VsZiwgbmV3TmFtZT1Ob25lKToKKyAgICAgICAgIiIiU2V0IHRoZSBuYW1lIG9mIHRoZSBpY29uIGZvciB0aGlzIHdpZGdldC4gUmV0dXJuIHRoZSBuYW1lIGlmCisgICAgICAgIE5vbmUgaXMgZ2l2ZW4uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2ljb25uYW1lJywgc2VsZi5fdywgbmV3TmFtZSkKKyAgICBpY29ubmFtZSA9IHdtX2ljb25uYW1lCisgICAgZGVmIHdtX2ljb25wb3NpdGlvbihzZWxmLCB4PU5vbmUsIHk9Tm9uZSk6CisgICAgICAgICIiIlNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGljb24gb2YgdGhpcyB3aWRnZXQgdG8gWCBhbmQgWS4gUmV0dXJuCisgICAgICAgIGEgdHVwbGUgb2YgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIFggYW5kIFggaWYgTm9uZSBpcyBnaXZlbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgJ3dtJywgJ2ljb25wb3NpdGlvbicsIHNlbGYuX3csIHgsIHkpKQorICAgIGljb25wb3NpdGlvbiA9IHdtX2ljb25wb3NpdGlvbgorICAgIGRlZiB3bV9pY29ud2luZG93KHNlbGYsIHBhdGhOYW1lPU5vbmUpOgorICAgICAgICAiIiJTZXQgd2lkZ2V0IFBBVEhOQU1FIHRvIGJlIGRpc3BsYXllZCBpbnN0ZWFkIG9mIGljb24uIFJldHVybiB0aGUgY3VycmVudAorICAgICAgICB2YWx1ZSBpZiBOb25lIGlzIGdpdmVuLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdpY29ud2luZG93Jywgc2VsZi5fdywgcGF0aE5hbWUpCisgICAgaWNvbndpbmRvdyA9IHdtX2ljb253aW5kb3cKKyAgICBkZWYgd21fbWF4c2l6ZShzZWxmLCB3aWR0aD1Ob25lLCBoZWlnaHQ9Tm9uZSk6CisgICAgICAgICIiIlNldCBtYXggV0lEVEggYW5kIEhFSUdIVCBmb3IgdGhpcyB3aWRnZXQuIElmIHRoZSB3aW5kb3cgaXMgZ3JpZGRlZAorICAgICAgICB0aGUgdmFsdWVzIGFyZSBnaXZlbiBpbiBncmlkIHVuaXRzLiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWVzIGlmIE5vbmUKKyAgICAgICAgaXMgZ2l2ZW4uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICd3bScsICdtYXhzaXplJywgc2VsZi5fdywgd2lkdGgsIGhlaWdodCkpCisgICAgbWF4c2l6ZSA9IHdtX21heHNpemUKKyAgICBkZWYgd21fbWluc2l6ZShzZWxmLCB3aWR0aD1Ob25lLCBoZWlnaHQ9Tm9uZSk6CisgICAgICAgICIiIlNldCBtaW4gV0lEVEggYW5kIEhFSUdIVCBmb3IgdGhpcyB3aWRnZXQuIElmIHRoZSB3aW5kb3cgaXMgZ3JpZGRlZAorICAgICAgICB0aGUgdmFsdWVzIGFyZSBnaXZlbiBpbiBncmlkIHVuaXRzLiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWVzIGlmIE5vbmUKKyAgICAgICAgaXMgZ2l2ZW4uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICd3bScsICdtaW5zaXplJywgc2VsZi5fdywgd2lkdGgsIGhlaWdodCkpCisgICAgbWluc2l6ZSA9IHdtX21pbnNpemUKKyAgICBkZWYgd21fb3ZlcnJpZGVyZWRpcmVjdChzZWxmLCBib29sZWFuPU5vbmUpOgorICAgICAgICAiIiJJbnN0cnVjdCB0aGUgd2luZG93IG1hbmFnZXIgdG8gaWdub3JlIHRoaXMgd2lkZ2V0CisgICAgICAgIGlmIEJPT0xFQU4gaXMgZ2l2ZW4gd2l0aCAxLiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgaWYgTm9uZQorICAgICAgICBpcyBnaXZlbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGJvb2xlYW4oc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgJ3dtJywgJ292ZXJyaWRlcmVkaXJlY3QnLCBzZWxmLl93LCBib29sZWFuKSkKKyAgICBvdmVycmlkZXJlZGlyZWN0ID0gd21fb3ZlcnJpZGVyZWRpcmVjdAorICAgIGRlZiB3bV9wb3NpdGlvbmZyb20oc2VsZiwgd2hvPU5vbmUpOgorICAgICAgICAiIiJJbnN0cnVjdCB0aGUgd2luZG93IG1hbmFnZXIgdGhhdCB0aGUgcG9zaXRpb24gb2YgdGhpcyB3aWRnZXQgc2hhbGwKKyAgICAgICAgYmUgZGVmaW5lZCBieSB0aGUgdXNlciBpZiBXSE8gaXMgInVzZXIiLCBhbmQgYnkgaXRzIG93biBwb2xpY3kgaWYgV0hPIGlzCisgICAgICAgICJwcm9ncmFtIi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAncG9zaXRpb25mcm9tJywgc2VsZi5fdywgd2hvKQorICAgIHBvc2l0aW9uZnJvbSA9IHdtX3Bvc2l0aW9uZnJvbQorICAgIGRlZiB3bV9wcm90b2NvbChzZWxmLCBuYW1lPU5vbmUsIGZ1bmM9Tm9uZSk6CisgICAgICAgICIiIkJpbmQgZnVuY3Rpb24gRlVOQyB0byBjb21tYW5kIE5BTUUgZm9yIHRoaXMgd2lkZ2V0LgorICAgICAgICBSZXR1cm4gdGhlIGZ1bmN0aW9uIGJvdW5kIHRvIE5BTUUgaWYgTm9uZSBpcyBnaXZlbi4gTkFNRSBjb3VsZCBiZQorICAgICAgICBlLmcuICJXTV9TQVZFX1lPVVJTRUxGIiBvciAiV01fREVMRVRFX1dJTkRPVyIuIiIiCisgICAgICAgIGlmIGhhc2F0dHIoZnVuYywgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICBjb21tYW5kID0gc2VsZi5fcmVnaXN0ZXIoZnVuYykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbW1hbmQgPSBmdW5jCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAnd20nLCAncHJvdG9jb2wnLCBzZWxmLl93LCBuYW1lLCBjb21tYW5kKQorICAgIHByb3RvY29sID0gd21fcHJvdG9jb2wKKyAgICBkZWYgd21fcmVzaXphYmxlKHNlbGYsIHdpZHRoPU5vbmUsIGhlaWdodD1Ob25lKToKKyAgICAgICAgIiIiSW5zdHJ1Y3QgdGhlIHdpbmRvdyBtYW5hZ2VyIHdoZXRoZXIgdGhpcyB3aWR0aCBjYW4gYmUgcmVzaXplZAorICAgICAgICBpbiBXSURUSCBvciBIRUlHSFQuIEJvdGggdmFsdWVzIGFyZSBib29sZWFuIHZhbHVlcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAncmVzaXphYmxlJywgc2VsZi5fdywgd2lkdGgsIGhlaWdodCkKKyAgICByZXNpemFibGUgPSB3bV9yZXNpemFibGUKKyAgICBkZWYgd21fc2l6ZWZyb20oc2VsZiwgd2hvPU5vbmUpOgorICAgICAgICAiIiJJbnN0cnVjdCB0aGUgd2luZG93IG1hbmFnZXIgdGhhdCB0aGUgc2l6ZSBvZiB0aGlzIHdpZGdldCBzaGFsbAorICAgICAgICBiZSBkZWZpbmVkIGJ5IHRoZSB1c2VyIGlmIFdITyBpcyAidXNlciIsIGFuZCBieSBpdHMgb3duIHBvbGljeSBpZiBXSE8gaXMKKyAgICAgICAgInByb2dyYW0iLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdzaXplZnJvbScsIHNlbGYuX3csIHdobykKKyAgICBzaXplZnJvbSA9IHdtX3NpemVmcm9tCisgICAgZGVmIHdtX3N0YXRlKHNlbGYsIG5ld3N0YXRlPU5vbmUpOgorICAgICAgICAiIiJRdWVyeSBvciBzZXQgdGhlIHN0YXRlIG9mIHRoaXMgd2lkZ2V0IGFzIG9uZSBvZiBub3JtYWwsIGljb24sCisgICAgICAgIGljb25pYyAoc2VlIHdtX2ljb253aW5kb3cpLCB3aXRoZHJhd24sIG9yIHpvb21lZCAoV2luZG93cyBvbmx5KS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnc3RhdGUnLCBzZWxmLl93LCBuZXdzdGF0ZSkKKyAgICBzdGF0ZSA9IHdtX3N0YXRlCisgICAgZGVmIHdtX3RpdGxlKHNlbGYsIHN0cmluZz1Ob25lKToKKyAgICAgICAgIiIiU2V0IHRoZSB0aXRsZSBvZiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAndGl0bGUnLCBzZWxmLl93LCBzdHJpbmcpCisgICAgdGl0bGUgPSB3bV90aXRsZQorICAgIGRlZiB3bV90cmFuc2llbnQoc2VsZiwgbWFzdGVyPU5vbmUpOgorICAgICAgICAiIiJJbnN0cnVjdCB0aGUgd2luZG93IG1hbmFnZXIgdGhhdCB0aGlzIHdpZGdldCBpcyB0cmFuc2llbnQKKyAgICAgICAgd2l0aCByZWdhcmQgdG8gd2lkZ2V0IE1BU1RFUi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAndHJhbnNpZW50Jywgc2VsZi5fdywgbWFzdGVyKQorICAgIHRyYW5zaWVudCA9IHdtX3RyYW5zaWVudAorICAgIGRlZiB3bV93aXRoZHJhdyhzZWxmKToKKyAgICAgICAgIiIiV2l0aGRyYXcgdGhpcyB3aWRnZXQgZnJvbSB0aGUgc2NyZWVuIHN1Y2ggdGhhdCBpdCBpcyB1bm1hcHBlZAorICAgICAgICBhbmQgZm9yZ290dGVuIGJ5IHRoZSB3aW5kb3cgbWFuYWdlci4gUmUtZHJhdyBpdCB3aXRoIHdtX2RlaWNvbmlmeS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnd2l0aGRyYXcnLCBzZWxmLl93KQorICAgIHdpdGhkcmF3ID0gd21fd2l0aGRyYXcKKworCitjbGFzcyBUayhNaXNjLCBXbSk6CisgICAgIiIiVG9wbGV2ZWwgd2lkZ2V0IG9mIFRrIHdoaWNoIHJlcHJlc2VudHMgbW9zdGx5IHRoZSBtYWluIHdpbmRvdworICAgIG9mIGFuIGFwcGxpY2F0aW9uLiBJdCBoYXMgYW4gYXNzb2NpYXRlZCBUY2wgaW50ZXJwcmV0ZXIuIiIiCisgICAgX3cgPSAnLicKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2NyZWVuTmFtZT1Ob25lLCBiYXNlTmFtZT1Ob25lLCBjbGFzc05hbWU9J1RrJywKKyAgICAgICAgICAgICAgICAgdXNlVGs9MSwgc3luYz0wLCB1c2U9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIG5ldyBUb3BsZXZlbCB3aWRnZXQgb24gc2NyZWVuIFNDUkVFTk5BTUUuIEEgbmV3IFRjbCBpbnRlcnByZXRlciB3aWxsCisgICAgICAgIGJlIGNyZWF0ZWQuIEJBU0VOQU1FIHdpbGwgYmUgdXNlZCBmb3IgdGhlIGlkZW50aWZpY2F0aW9uIG9mIHRoZSBwcm9maWxlIGZpbGUgKHNlZQorICAgICAgICByZWFkcHJvZmlsZSkuCisgICAgICAgIEl0IGlzIGNvbnN0cnVjdGVkIGZyb20gc3lzLmFyZ3ZbMF0gd2l0aG91dCBleHRlbnNpb25zIGlmIE5vbmUgaXMgZ2l2ZW4uIENMQVNTTkFNRQorICAgICAgICBpcyB0aGUgbmFtZSBvZiB0aGUgd2lkZ2V0IGNsYXNzLiIiIgorICAgICAgICBzZWxmLm1hc3RlciA9IE5vbmUKKyAgICAgICAgc2VsZi5jaGlsZHJlbiA9IHt9CisgICAgICAgIHNlbGYuX3RrbG9hZGVkID0gMAorICAgICAgICAjIHRvIGF2b2lkIHJlY3Vyc2lvbnMgaW4gdGhlIGdldGF0dHIgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUsIHdlCisgICAgICAgICMgZW5zdXJlIHRoYXQgc2VsZi50ayBpcyBhbHdheXMgX3NvbWV0aGluZ18uCisgICAgICAgIHNlbGYudGsgPSBOb25lCisgICAgICAgIGlmIGJhc2VOYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBpbXBvcnQgc3lzLCBvcworICAgICAgICAgICAgYmFzZU5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQorICAgICAgICAgICAgYmFzZU5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoYmFzZU5hbWUpCisgICAgICAgICAgICBpZiBleHQgbm90IGluICgnLnB5JywgJy5weWMnLCAnLnB5bycpOgorICAgICAgICAgICAgICAgIGJhc2VOYW1lID0gYmFzZU5hbWUgKyBleHQKKyAgICAgICAgaW50ZXJhY3RpdmUgPSAwCisgICAgICAgIHNlbGYudGsgPSBfdGtpbnRlci5jcmVhdGUoc2NyZWVuTmFtZSwgYmFzZU5hbWUsIGNsYXNzTmFtZSwgaW50ZXJhY3RpdmUsIHdhbnRvYmplY3RzLCB1c2VUaywgc3luYywgdXNlKQorICAgICAgICBpZiB1c2VUazoKKyAgICAgICAgICAgIHNlbGYuX2xvYWR0aygpCisgICAgICAgIGlmIG5vdCBzeXMuZmxhZ3MuaWdub3JlX2Vudmlyb25tZW50OgorICAgICAgICAgICAgIyBJc3N1ZSAjMTYyNDg6IEhvbm9yIHRoZSAtRSBmbGFnIHRvIGF2b2lkIGNvZGUgaW5qZWN0aW9uLgorICAgICAgICAgICAgc2VsZi5yZWFkcHJvZmlsZShiYXNlTmFtZSwgY2xhc3NOYW1lKQorICAgIGRlZiBsb2FkdGsoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl90a2xvYWRlZDoKKyAgICAgICAgICAgIHNlbGYudGsubG9hZHRrKCkKKyAgICAgICAgICAgIHNlbGYuX2xvYWR0aygpCisgICAgZGVmIF9sb2FkdGsoc2VsZik6CisgICAgICAgIHNlbGYuX3RrbG9hZGVkID0gMQorICAgICAgICBnbG9iYWwgX2RlZmF1bHRfcm9vdAorICAgICAgICAjIFZlcnNpb24gc2FuaXR5IGNoZWNrcworICAgICAgICB0a192ZXJzaW9uID0gc2VsZi50ay5nZXR2YXIoJ3RrX3ZlcnNpb24nKQorICAgICAgICBpZiB0a192ZXJzaW9uICE9IF90a2ludGVyLlRLX1ZFUlNJT046CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFwKKyAgICAgICAgICAgICJ0ay5oIHZlcnNpb24gKCVzKSBkb2Vzbid0IG1hdGNoIGxpYnRrLmEgdmVyc2lvbiAoJXMpIiBcCisgICAgICAgICAgICAlIChfdGtpbnRlci5US19WRVJTSU9OLCB0a192ZXJzaW9uKQorICAgICAgICAjIFVuZGVyIHVua25vd24gY2lyY3Vtc3RhbmNlcywgdGNsX3ZlcnNpb24gZ2V0cyBjb2VyY2VkIHRvIGZsb2F0CisgICAgICAgIHRjbF92ZXJzaW9uID0gc3RyKHNlbGYudGsuZ2V0dmFyKCd0Y2xfdmVyc2lvbicpKQorICAgICAgICBpZiB0Y2xfdmVyc2lvbiAhPSBfdGtpbnRlci5UQ0xfVkVSU0lPTjoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgInRjbC5oIHZlcnNpb24gKCVzKSBkb2Vzbid0IG1hdGNoIGxpYnRjbC5hIHZlcnNpb24gKCVzKSIgXAorICAgICAgICAgICAgJSAoX3RraW50ZXIuVENMX1ZFUlNJT04sIHRjbF92ZXJzaW9uKQorICAgICAgICBpZiBUa1ZlcnNpb24gPCA0LjA6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFwKKyAgICAgICAgICAgICJUayA0LjAgb3IgaGlnaGVyIGlzIHJlcXVpcmVkOyBmb3VuZCBUayAlcyIgXAorICAgICAgICAgICAgJSBzdHIoVGtWZXJzaW9uKQorICAgICAgICAjIENyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIHRrZXJyb3IgYW5kIGV4aXQgY29tbWFuZHMKKyAgICAgICAgIyBXZSBuZWVkIHRvIGlubGluZSBwYXJ0cyBvZiBfcmVnaXN0ZXIgaGVyZSwgXyByZWdpc3RlcgorICAgICAgICAjIHdvdWxkIHJlZ2lzdGVyIGRpZmZlcmVudGx5LW5hbWVkIGNvbW1hbmRzLgorICAgICAgICBpZiBzZWxmLl90Y2xDb21tYW5kcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMgPSBbXQorICAgICAgICBzZWxmLnRrLmNyZWF0ZWNvbW1hbmQoJ3RrZXJyb3InLCBfdGtlcnJvcikKKyAgICAgICAgc2VsZi50ay5jcmVhdGVjb21tYW5kKCdleGl0JywgX2V4aXQpCisgICAgICAgIHNlbGYuX3RjbENvbW1hbmRzLmFwcGVuZCgndGtlcnJvcicpCisgICAgICAgIHNlbGYuX3RjbENvbW1hbmRzLmFwcGVuZCgnZXhpdCcpCisgICAgICAgIGlmIF9zdXBwb3J0X2RlZmF1bHRfcm9vdCBhbmQgbm90IF9kZWZhdWx0X3Jvb3Q6CisgICAgICAgICAgICBfZGVmYXVsdF9yb290ID0gc2VsZgorICAgICAgICBzZWxmLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5kZXN0cm95KQorICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAiIiJEZXN0cm95IHRoaXMgYW5kIGFsbCBkZXNjZW5kYW50cyB3aWRnZXRzLiBUaGlzIHdpbGwKKyAgICAgICAgZW5kIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGlzIFRjbCBpbnRlcnByZXRlci4iIiIKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5jaGlsZHJlbi52YWx1ZXMoKTogYy5kZXN0cm95KCkKKyAgICAgICAgc2VsZi50ay5jYWxsKCdkZXN0cm95Jywgc2VsZi5fdykKKyAgICAgICAgTWlzYy5kZXN0cm95KHNlbGYpCisgICAgICAgIGdsb2JhbCBfZGVmYXVsdF9yb290CisgICAgICAgIGlmIF9zdXBwb3J0X2RlZmF1bHRfcm9vdCBhbmQgX2RlZmF1bHRfcm9vdCBpcyBzZWxmOgorICAgICAgICAgICAgX2RlZmF1bHRfcm9vdCA9IE5vbmUKKyAgICBkZWYgcmVhZHByb2ZpbGUoc2VsZiwgYmFzZU5hbWUsIGNsYXNzTmFtZSk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiBJdCByZWFkcyBCQVNFTkFNRS50Y2wgYW5kIENMQVNTTkFNRS50Y2wgaW50bworICAgICAgICB0aGUgVGNsIEludGVycHJldGVyIGFuZCBjYWxscyBleGVjZmlsZSBvbiBCQVNFTkFNRS5weSBhbmQgQ0xBU1NOQU1FLnB5IGlmCisgICAgICAgIHN1Y2ggYSBmaWxlIGV4aXN0cyBpbiB0aGUgaG9tZSBkaXJlY3RvcnkuIiIiCisgICAgICAgIGltcG9ydCBvcworICAgICAgICBpZiAnSE9NRScgaW4gb3MuZW52aXJvbjogaG9tZSA9IG9zLmVudmlyb25bJ0hPTUUnXQorICAgICAgICBlbHNlOiBob21lID0gb3MuY3VyZGlyCisgICAgICAgIGNsYXNzX3RjbCA9IG9zLnBhdGguam9pbihob21lLCAnLiVzLnRjbCcgJSBjbGFzc05hbWUpCisgICAgICAgIGNsYXNzX3B5ID0gb3MucGF0aC5qb2luKGhvbWUsICcuJXMucHknICUgY2xhc3NOYW1lKQorICAgICAgICBiYXNlX3RjbCA9IG9zLnBhdGguam9pbihob21lLCAnLiVzLnRjbCcgJSBiYXNlTmFtZSkKKyAgICAgICAgYmFzZV9weSA9IG9zLnBhdGguam9pbihob21lLCAnLiVzLnB5JyAlIGJhc2VOYW1lKQorICAgICAgICBkaXIgPSB7J3NlbGYnOiBzZWxmfQorICAgICAgICBleGVjICdmcm9tIFRraW50ZXIgaW1wb3J0IConIGluIGRpcgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShjbGFzc190Y2wpOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdzb3VyY2UnLCBjbGFzc190Y2wpCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNsYXNzX3B5KToKKyAgICAgICAgICAgIGV4ZWNmaWxlKGNsYXNzX3B5LCBkaXIpCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGJhc2VfdGNsKToKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnc291cmNlJywgYmFzZV90Y2wpCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGJhc2VfcHkpOgorICAgICAgICAgICAgZXhlY2ZpbGUoYmFzZV9weSwgZGlyKQorICAgIGRlZiByZXBvcnRfY2FsbGJhY2tfZXhjZXB0aW9uKHNlbGYsIGV4YywgdmFsLCB0Yik6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiBJdCByZXBvcnRzIGV4Y2VwdGlvbiBvbiBzeXMuc3RkZXJyLiIiIgorICAgICAgICBpbXBvcnQgdHJhY2ViYWNrLCBzeXMKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiRXhjZXB0aW9uIGluIFRraW50ZXIgY2FsbGJhY2tcbiIpCisgICAgICAgIHN5cy5sYXN0X3R5cGUgPSBleGMKKyAgICAgICAgc3lzLmxhc3RfdmFsdWUgPSB2YWwKKyAgICAgICAgc3lzLmxhc3RfdHJhY2ViYWNrID0gdGIKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4Y2VwdGlvbihleGMsIHZhbCwgdGIpCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICAiRGVsZWdhdGUgYXR0cmlidXRlIGFjY2VzcyB0byB0aGUgaW50ZXJwcmV0ZXIgb2JqZWN0IgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnRrLCBhdHRyKQorCisjIElkZWFsbHksIHRoZSBjbGFzc2VzIFBhY2ssIFBsYWNlIGFuZCBHcmlkIGRpc2FwcGVhciwgdGhlCisjIHBhY2svcGxhY2UvZ3JpZCBtZXRob2RzIGFyZSBkZWZpbmVkIG9uIHRoZSBXaWRnZXQgY2xhc3MsIGFuZAorIyBldmVyeWJvZHkgdXNlcyB3LnBhY2tfd2hhdGV2ZXIoLi4uKSBpbnN0ZWFkIG9mIFBhY2sud2hhdGV2ZXIodywKKyMgLi4uKSwgd2l0aCBwYWNrKCksIHBsYWNlKCkgYW5kIGdyaWQoKSBiZWluZyBzaG9ydCBmb3IKKyMgcGFja19jb25maWd1cmUoKSwgcGxhY2VfY29uZmlndXJlKCkgYW5kIGdyaWRfY29sdW1uY29uZmlndXJlKCksIGFuZAorIyBmb3JnZXQoKSBiZWluZyBzaG9ydCBmb3IgcGFja19mb3JnZXQoKS4gIEFzIGEgcHJhY3RpY2FsIG1hdHRlciwgSSdtCisjIGFmcmFpZCB0aGF0IHRoZXJlIGlzIHRvbyBtdWNoIGNvZGUgb3V0IHRoZXJlIHRoYXQgbWF5IGJlIHVzaW5nIHRoZQorIyBQYWNrLCBQbGFjZSBvciBHcmlkIGNsYXNzLCBzbyBJIGxlYXZlIHRoZW0gaW50YWN0IC0tIGJ1dCBvbmx5IGFzCisjIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZlYXR1cmVzLiAgQWxzbyBub3RlIHRoYXQgdGhvc2UgbWV0aG9kcyB0aGF0CisjIHRha2UgYSBtYXN0ZXIgYXMgYXJndW1lbnQgKGUuZy4gcGFja19wcm9wYWdhdGUpIGhhdmUgYmVlbiBtb3ZlZCB0bworIyB0aGUgTWlzYyBjbGFzcyAod2hpY2ggbm93IGluY29ycG9yYXRlcyBhbGwgbWV0aG9kcyBjb21tb24gYmV0d2VlbgorIyB0b3BsZXZlbCBhbmQgaW50ZXJpb3Igd2lkZ2V0cykuICBBZ2FpbiwgZm9yIGNvbXBhdGliaWxpdHksIHRoZXNlIGFyZQorIyBjb3BpZWQgaW50byB0aGUgUGFjaywgUGxhY2Ugb3IgR3JpZCBjbGFzcy4KKworCitkZWYgVGNsKHNjcmVlbk5hbWU9Tm9uZSwgYmFzZU5hbWU9Tm9uZSwgY2xhc3NOYW1lPSdUaycsIHVzZVRrPTApOgorICAgIHJldHVybiBUayhzY3JlZW5OYW1lLCBiYXNlTmFtZSwgY2xhc3NOYW1lLCB1c2VUaykKKworY2xhc3MgUGFjazoKKyAgICAiIiJHZW9tZXRyeSBtYW5hZ2VyIFBhY2suCisKKyAgICBCYXNlIGNsYXNzIHRvIHVzZSB0aGUgbWV0aG9kcyBwYWNrXyogaW4gZXZlcnkgd2lkZ2V0LiIiIgorICAgIGRlZiBwYWNrX2NvbmZpZ3VyZShzZWxmLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJQYWNrIGEgd2lkZ2V0IGluIHRoZSBwYXJlbnQgd2lkZ2V0LiBVc2UgYXMgb3B0aW9uczoKKyAgICAgICAgYWZ0ZXI9d2lkZ2V0IC0gcGFjayBpdCBhZnRlciB5b3UgaGF2ZSBwYWNrZWQgd2lkZ2V0CisgICAgICAgIGFuY2hvcj1OU0VXIChvciBzdWJzZXQpIC0gcG9zaXRpb24gd2lkZ2V0IGFjY29yZGluZyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGRpcmVjdGlvbgorICAgICAgICBiZWZvcmU9d2lkZ2V0IC0gcGFjayBpdCBiZWZvcmUgeW91IHdpbGwgcGFjayB3aWRnZXQKKyAgICAgICAgZXhwYW5kPWJvb2wgLSBleHBhbmQgd2lkZ2V0IGlmIHBhcmVudCBzaXplIGdyb3dzCisgICAgICAgIGZpbGw9Tk9ORSBvciBYIG9yIFkgb3IgQk9USCAtIGZpbGwgd2lkZ2V0IGlmIHdpZGdldCBncm93cworICAgICAgICBpbj1tYXN0ZXIgLSB1c2UgbWFzdGVyIHRvIGNvbnRhaW4gdGhpcyB3aWRnZXQKKyAgICAgICAgaW5fPW1hc3RlciAtIHNlZSAnaW4nIG9wdGlvbiBkZXNjcmlwdGlvbgorICAgICAgICBpcGFkeD1hbW91bnQgLSBhZGQgaW50ZXJuYWwgcGFkZGluZyBpbiB4IGRpcmVjdGlvbgorICAgICAgICBpcGFkeT1hbW91bnQgLSBhZGQgaW50ZXJuYWwgcGFkZGluZyBpbiB5IGRpcmVjdGlvbgorICAgICAgICBwYWR4PWFtb3VudCAtIGFkZCBwYWRkaW5nIGluIHggZGlyZWN0aW9uCisgICAgICAgIHBhZHk9YW1vdW50IC0gYWRkIHBhZGRpbmcgaW4geSBkaXJlY3Rpb24KKyAgICAgICAgc2lkZT1UT1Agb3IgQk9UVE9NIG9yIExFRlQgb3IgUklHSFQgLSAgd2hlcmUgdG8gYWRkIHRoaXMgd2lkZ2V0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICAoJ3BhY2snLCAnY29uZmlndXJlJywgc2VsZi5fdykKKyAgICAgICAgICAgICAgKyBzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorICAgIHBhY2sgPSBjb25maWd1cmUgPSBjb25maWcgPSBwYWNrX2NvbmZpZ3VyZQorICAgIGRlZiBwYWNrX2ZvcmdldChzZWxmKToKKyAgICAgICAgIiIiVW5tYXAgdGhpcyB3aWRnZXQgYW5kIGRvIG5vdCB1c2UgaXQgZm9yIHRoZSBwYWNraW5nIG9yZGVyLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3BhY2snLCAnZm9yZ2V0Jywgc2VsZi5fdykKKyAgICBmb3JnZXQgPSBwYWNrX2ZvcmdldAorICAgIGRlZiBwYWNrX2luZm8oc2VsZik6CisgICAgICAgICIiIlJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFja2luZyBvcHRpb25zCisgICAgICAgIGZvciB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgd29yZHMgPSBzZWxmLnRrLnNwbGl0bGlzdCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgncGFjaycsICdpbmZvJywgc2VsZi5fdykpCisgICAgICAgIGRpY3QgPSB7fQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4od29yZHMpLCAyKToKKyAgICAgICAgICAgIGtleSA9IHdvcmRzW2ldWzE6XQorICAgICAgICAgICAgdmFsdWUgPSB3b3Jkc1tpKzFdCisgICAgICAgICAgICBpZiB2YWx1ZVs6MV0gPT0gJy4nOgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fbmFtZXRvd2lkZ2V0KHZhbHVlKQorICAgICAgICAgICAgZGljdFtrZXldID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIGRpY3QKKyAgICBpbmZvID0gcGFja19pbmZvCisgICAgcHJvcGFnYXRlID0gcGFja19wcm9wYWdhdGUgPSBNaXNjLnBhY2tfcHJvcGFnYXRlCisgICAgc2xhdmVzID0gcGFja19zbGF2ZXMgPSBNaXNjLnBhY2tfc2xhdmVzCisKK2NsYXNzIFBsYWNlOgorICAgICIiIkdlb21ldHJ5IG1hbmFnZXIgUGxhY2UuCisKKyAgICBCYXNlIGNsYXNzIHRvIHVzZSB0aGUgbWV0aG9kcyBwbGFjZV8qIGluIGV2ZXJ5IHdpZGdldC4iIiIKKyAgICBkZWYgcGxhY2VfY29uZmlndXJlKHNlbGYsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIlBsYWNlIGEgd2lkZ2V0IGluIHRoZSBwYXJlbnQgd2lkZ2V0LiBVc2UgYXMgb3B0aW9uczoKKyAgICAgICAgaW49bWFzdGVyIC0gbWFzdGVyIHJlbGF0aXZlIHRvIHdoaWNoIHRoZSB3aWRnZXQgaXMgcGxhY2VkCisgICAgICAgIGluXz1tYXN0ZXIgLSBzZWUgJ2luJyBvcHRpb24gZGVzY3JpcHRpb24KKyAgICAgICAgeD1hbW91bnQgLSBsb2NhdGUgYW5jaG9yIG9mIHRoaXMgd2lkZ2V0IGF0IHBvc2l0aW9uIHggb2YgbWFzdGVyCisgICAgICAgIHk9YW1vdW50IC0gbG9jYXRlIGFuY2hvciBvZiB0aGlzIHdpZGdldCBhdCBwb3NpdGlvbiB5IG9mIG1hc3RlcgorICAgICAgICByZWx4PWFtb3VudCAtIGxvY2F0ZSBhbmNob3Igb2YgdGhpcyB3aWRnZXQgYmV0d2VlbiAwLjAgYW5kIDEuMAorICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHdpZHRoIG9mIG1hc3RlciAoMS4wIGlzIHJpZ2h0IGVkZ2UpCisgICAgICAgIHJlbHk9YW1vdW50IC0gbG9jYXRlIGFuY2hvciBvZiB0aGlzIHdpZGdldCBiZXR3ZWVuIDAuMCBhbmQgMS4wCisgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gaGVpZ2h0IG9mIG1hc3RlciAoMS4wIGlzIGJvdHRvbSBlZGdlKQorICAgICAgICBhbmNob3I9TlNFVyAob3Igc3Vic2V0KSAtIHBvc2l0aW9uIGFuY2hvciBhY2NvcmRpbmcgdG8gZ2l2ZW4gZGlyZWN0aW9uCisgICAgICAgIHdpZHRoPWFtb3VudCAtIHdpZHRoIG9mIHRoaXMgd2lkZ2V0IGluIHBpeGVsCisgICAgICAgIGhlaWdodD1hbW91bnQgLSBoZWlnaHQgb2YgdGhpcyB3aWRnZXQgaW4gcGl4ZWwKKyAgICAgICAgcmVsd2lkdGg9YW1vdW50IC0gd2lkdGggb2YgdGhpcyB3aWRnZXQgYmV0d2VlbiAwLjAgYW5kIDEuMAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB3aWR0aCBvZiBtYXN0ZXIgKDEuMCBpcyB0aGUgc2FtZSB3aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICBhcyB0aGUgbWFzdGVyKQorICAgICAgICByZWxoZWlnaHQ9YW1vdW50IC0gaGVpZ2h0IG9mIHRoaXMgd2lkZ2V0IGJldHdlZW4gMC4wIGFuZCAxLjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIGhlaWdodCBvZiBtYXN0ZXIgKDEuMCBpcyB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IGFzIHRoZSBtYXN0ZXIpCisgICAgICAgIGJvcmRlcm1vZGU9Imluc2lkZSIgb3IgIm91dHNpZGUiIC0gd2hldGhlciB0byB0YWtlIGJvcmRlciB3aWR0aCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc3RlciB3aWRnZXQgaW50byBhY2NvdW50CisgICAgICAgICIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICgncGxhY2UnLCAnY29uZmlndXJlJywgc2VsZi5fdykKKyAgICAgICAgICAgICAgKyBzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorICAgIHBsYWNlID0gY29uZmlndXJlID0gY29uZmlnID0gcGxhY2VfY29uZmlndXJlCisgICAgZGVmIHBsYWNlX2ZvcmdldChzZWxmKToKKyAgICAgICAgIiIiVW5tYXAgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgncGxhY2UnLCAnZm9yZ2V0Jywgc2VsZi5fdykKKyAgICBmb3JnZXQgPSBwbGFjZV9mb3JnZXQKKyAgICBkZWYgcGxhY2VfaW5mbyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGFjaW5nIG9wdGlvbnMKKyAgICAgICAgZm9yIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICB3b3JkcyA9IHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdwbGFjZScsICdpbmZvJywgc2VsZi5fdykpCisgICAgICAgIGRpY3QgPSB7fQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4od29yZHMpLCAyKToKKyAgICAgICAgICAgIGtleSA9IHdvcmRzW2ldWzE6XQorICAgICAgICAgICAgdmFsdWUgPSB3b3Jkc1tpKzFdCisgICAgICAgICAgICBpZiB2YWx1ZVs6MV0gPT0gJy4nOgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fbmFtZXRvd2lkZ2V0KHZhbHVlKQorICAgICAgICAgICAgZGljdFtrZXldID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIGRpY3QKKyAgICBpbmZvID0gcGxhY2VfaW5mbworICAgIHNsYXZlcyA9IHBsYWNlX3NsYXZlcyA9IE1pc2MucGxhY2Vfc2xhdmVzCisKK2NsYXNzIEdyaWQ6CisgICAgIiIiR2VvbWV0cnkgbWFuYWdlciBHcmlkLgorCisgICAgQmFzZSBjbGFzcyB0byB1c2UgdGhlIG1ldGhvZHMgZ3JpZF8qIGluIGV2ZXJ5IHdpZGdldC4iIiIKKyAgICAjIFRoYW5rcyB0byBNYXNhenVtaSBZb3NoaWthd2EgKHlvc2lrYXdhQGlzaS5lZHUpCisgICAgZGVmIGdyaWRfY29uZmlndXJlKHNlbGYsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIlBvc2l0aW9uIGEgd2lkZ2V0IGluIHRoZSBwYXJlbnQgd2lkZ2V0IGluIGEgZ3JpZC4gVXNlIGFzIG9wdGlvbnM6CisgICAgICAgIGNvbHVtbj1udW1iZXIgLSB1c2UgY2VsbCBpZGVudGlmaWVkIHdpdGggZ2l2ZW4gY29sdW1uIChzdGFydGluZyB3aXRoIDApCisgICAgICAgIGNvbHVtbnNwYW49bnVtYmVyIC0gdGhpcyB3aWRnZXQgd2lsbCBzcGFuIHNldmVyYWwgY29sdW1ucworICAgICAgICBpbj1tYXN0ZXIgLSB1c2UgbWFzdGVyIHRvIGNvbnRhaW4gdGhpcyB3aWRnZXQKKyAgICAgICAgaW5fPW1hc3RlciAtIHNlZSAnaW4nIG9wdGlvbiBkZXNjcmlwdGlvbgorICAgICAgICBpcGFkeD1hbW91bnQgLSBhZGQgaW50ZXJuYWwgcGFkZGluZyBpbiB4IGRpcmVjdGlvbgorICAgICAgICBpcGFkeT1hbW91bnQgLSBhZGQgaW50ZXJuYWwgcGFkZGluZyBpbiB5IGRpcmVjdGlvbgorICAgICAgICBwYWR4PWFtb3VudCAtIGFkZCBwYWRkaW5nIGluIHggZGlyZWN0aW9uCisgICAgICAgIHBhZHk9YW1vdW50IC0gYWRkIHBhZGRpbmcgaW4geSBkaXJlY3Rpb24KKyAgICAgICAgcm93PW51bWJlciAtIHVzZSBjZWxsIGlkZW50aWZpZWQgd2l0aCBnaXZlbiByb3cgKHN0YXJ0aW5nIHdpdGggMCkKKyAgICAgICAgcm93c3Bhbj1udW1iZXIgLSB0aGlzIHdpZGdldCB3aWxsIHNwYW4gc2V2ZXJhbCByb3dzCisgICAgICAgIHN0aWNreT1OU0VXIC0gaWYgY2VsbCBpcyBsYXJnZXIgb24gd2hpY2ggc2lkZXMgd2lsbCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0IHN0aWNrIHRvIHRoZSBjZWxsIGJvdW5kYXJ5CisgICAgICAgICIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICgnZ3JpZCcsICdjb25maWd1cmUnLCBzZWxmLl93KQorICAgICAgICAgICAgICArIHNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgZ3JpZCA9IGNvbmZpZ3VyZSA9IGNvbmZpZyA9IGdyaWRfY29uZmlndXJlCisgICAgYmJveCA9IGdyaWRfYmJveCA9IE1pc2MuZ3JpZF9iYm94CisgICAgY29sdW1uY29uZmlndXJlID0gZ3JpZF9jb2x1bW5jb25maWd1cmUgPSBNaXNjLmdyaWRfY29sdW1uY29uZmlndXJlCisgICAgZGVmIGdyaWRfZm9yZ2V0KHNlbGYpOgorICAgICAgICAiIiJVbm1hcCB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCdncmlkJywgJ2ZvcmdldCcsIHNlbGYuX3cpCisgICAgZm9yZ2V0ID0gZ3JpZF9mb3JnZXQKKyAgICBkZWYgZ3JpZF9yZW1vdmUoc2VsZik6CisgICAgICAgICIiIlVubWFwIHRoaXMgd2lkZ2V0IGJ1dCByZW1lbWJlciB0aGUgZ3JpZCBvcHRpb25zLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ2dyaWQnLCAncmVtb3ZlJywgc2VsZi5fdykKKyAgICBkZWYgZ3JpZF9pbmZvKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9wdGlvbnMKKyAgICAgICAgZm9yIHBvc2l0aW9uaW5nIHRoaXMgd2lkZ2V0IGluIGEgZ3JpZC4iIiIKKyAgICAgICAgd29yZHMgPSBzZWxmLnRrLnNwbGl0bGlzdCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnZ3JpZCcsICdpbmZvJywgc2VsZi5fdykpCisgICAgICAgIGRpY3QgPSB7fQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4od29yZHMpLCAyKToKKyAgICAgICAgICAgIGtleSA9IHdvcmRzW2ldWzE6XQorICAgICAgICAgICAgdmFsdWUgPSB3b3Jkc1tpKzFdCisgICAgICAgICAgICBpZiB2YWx1ZVs6MV0gPT0gJy4nOgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fbmFtZXRvd2lkZ2V0KHZhbHVlKQorICAgICAgICAgICAgZGljdFtrZXldID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIGRpY3QKKyAgICBpbmZvID0gZ3JpZF9pbmZvCisgICAgbG9jYXRpb24gPSBncmlkX2xvY2F0aW9uID0gTWlzYy5ncmlkX2xvY2F0aW9uCisgICAgcHJvcGFnYXRlID0gZ3JpZF9wcm9wYWdhdGUgPSBNaXNjLmdyaWRfcHJvcGFnYXRlCisgICAgcm93Y29uZmlndXJlID0gZ3JpZF9yb3djb25maWd1cmUgPSBNaXNjLmdyaWRfcm93Y29uZmlndXJlCisgICAgc2l6ZSA9IGdyaWRfc2l6ZSA9IE1pc2MuZ3JpZF9zaXplCisgICAgc2xhdmVzID0gZ3JpZF9zbGF2ZXMgPSBNaXNjLmdyaWRfc2xhdmVzCisKK2NsYXNzIEJhc2VXaWRnZXQoTWlzYyk6CisgICAgIiIiSW50ZXJuYWwgY2xhc3MuIiIiCisgICAgZGVmIF9zZXR1cChzZWxmLCBtYXN0ZXIsIGNuZik6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiBTZXRzIHVwIGluZm9ybWF0aW9uIGFib3V0IGNoaWxkcmVuLiIiIgorICAgICAgICBpZiBfc3VwcG9ydF9kZWZhdWx0X3Jvb3Q6CisgICAgICAgICAgICBnbG9iYWwgX2RlZmF1bHRfcm9vdAorICAgICAgICAgICAgaWYgbm90IG1hc3RlcjoKKyAgICAgICAgICAgICAgICBpZiBub3QgX2RlZmF1bHRfcm9vdDoKKyAgICAgICAgICAgICAgICAgICAgX2RlZmF1bHRfcm9vdCA9IFRrKCkKKyAgICAgICAgICAgICAgICBtYXN0ZXIgPSBfZGVmYXVsdF9yb290CisgICAgICAgIHNlbGYubWFzdGVyID0gbWFzdGVyCisgICAgICAgIHNlbGYudGsgPSBtYXN0ZXIudGsKKyAgICAgICAgbmFtZSA9IE5vbmUKKyAgICAgICAgaWYgJ25hbWUnIGluIGNuZjoKKyAgICAgICAgICAgIG5hbWUgPSBjbmZbJ25hbWUnXQorICAgICAgICAgICAgZGVsIGNuZlsnbmFtZSddCisgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgbmFtZSA9IHJlcHIoaWQoc2VsZikpCisgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCisgICAgICAgIGlmIG1hc3Rlci5fdz09Jy4nOgorICAgICAgICAgICAgc2VsZi5fdyA9ICcuJyArIG5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3cgPSBtYXN0ZXIuX3cgKyAnLicgKyBuYW1lCisgICAgICAgIHNlbGYuY2hpbGRyZW4gPSB7fQorICAgICAgICBpZiBzZWxmLl9uYW1lIGluIHNlbGYubWFzdGVyLmNoaWxkcmVuOgorICAgICAgICAgICAgc2VsZi5tYXN0ZXIuY2hpbGRyZW5bc2VsZi5fbmFtZV0uZGVzdHJveSgpCisgICAgICAgIHNlbGYubWFzdGVyLmNoaWxkcmVuW3NlbGYuX25hbWVdID0gc2VsZgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHdpZGdldE5hbWUsIGNuZj17fSwga3c9e30sIGV4dHJhPSgpKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgd2lkZ2V0IHdpdGggdGhlIHBhcmVudCB3aWRnZXQgTUFTVEVSLCBhIG5hbWUgV0lER0VUTkFNRQorICAgICAgICBhbmQgYXBwcm9wcmlhdGUgb3B0aW9ucy4iIiIKKyAgICAgICAgaWYga3c6CisgICAgICAgICAgICBjbmYgPSBfY25mbWVyZ2UoKGNuZiwga3cpKQorICAgICAgICBzZWxmLndpZGdldE5hbWUgPSB3aWRnZXROYW1lCisgICAgICAgIEJhc2VXaWRnZXQuX3NldHVwKHNlbGYsIG1hc3RlciwgY25mKQorICAgICAgICBpZiBzZWxmLl90Y2xDb21tYW5kcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMgPSBbXQorICAgICAgICBjbGFzc2VzID0gW10KKyAgICAgICAgZm9yIGsgaW4gY25mLmtleXMoKToKKyAgICAgICAgICAgIGlmIHR5cGUoaykgaXMgQ2xhc3NUeXBlOgorICAgICAgICAgICAgICAgIGNsYXNzZXMuYXBwZW5kKChrLCBjbmZba10pKQorICAgICAgICAgICAgICAgIGRlbCBjbmZba10KKyAgICAgICAgc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgKHdpZGdldE5hbWUsIHNlbGYuX3cpICsgZXh0cmEgKyBzZWxmLl9vcHRpb25zKGNuZikpCisgICAgICAgIGZvciBrLCB2IGluIGNsYXNzZXM6CisgICAgICAgICAgICBrLmNvbmZpZ3VyZShzZWxmLCB2KQorICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAiIiJEZXN0cm95IHRoaXMgYW5kIGFsbCBkZXNjZW5kYW50cyB3aWRnZXRzLiIiIgorICAgICAgICBmb3IgYyBpbiBzZWxmLmNoaWxkcmVuLnZhbHVlcygpOiBjLmRlc3Ryb3koKQorICAgICAgICBzZWxmLnRrLmNhbGwoJ2Rlc3Ryb3knLCBzZWxmLl93KQorICAgICAgICBpZiBzZWxmLl9uYW1lIGluIHNlbGYubWFzdGVyLmNoaWxkcmVuOgorICAgICAgICAgICAgZGVsIHNlbGYubWFzdGVyLmNoaWxkcmVuW3NlbGYuX25hbWVdCisgICAgICAgIE1pc2MuZGVzdHJveShzZWxmKQorICAgIGRlZiBfZG8oc2VsZiwgbmFtZSwgYXJncz0oKSk6CisgICAgICAgICMgWFhYIE9ic29sZXRlIC0tIGJldHRlciB1c2Ugc2VsZi50ay5jYWxsIGRpcmVjdGx5IQorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKChzZWxmLl93LCBuYW1lKSArIGFyZ3MpCisKK2NsYXNzIFdpZGdldChCYXNlV2lkZ2V0LCBQYWNrLCBQbGFjZSwgR3JpZCk6CisgICAgIiIiSW50ZXJuYWwgY2xhc3MuCisKKyAgICBCYXNlIGNsYXNzIGZvciBhIHdpZGdldCB3aGljaCBjYW4gYmUgcG9zaXRpb25lZCB3aXRoIHRoZSBnZW9tZXRyeSBtYW5hZ2VycworICAgIFBhY2ssIFBsYWNlIG9yIEdyaWQuIiIiCisgICAgcGFzcworCitjbGFzcyBUb3BsZXZlbChCYXNlV2lkZ2V0LCBXbSk6CisgICAgIiIiVG9wbGV2ZWwgd2lkZ2V0LCBlLmcuIGZvciBkaWFsb2dzLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgdG9wbGV2ZWwgd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBNQVNURVIuCisKKyAgICAgICAgVmFsaWQgcmVzb3VyY2UgbmFtZXM6IGJhY2tncm91bmQsIGJkLCBiZywgYm9yZGVyd2lkdGgsIGNsYXNzLAorICAgICAgICBjb2xvcm1hcCwgY29udGFpbmVyLCBjdXJzb3IsIGhlaWdodCwgaGlnaGxpZ2h0YmFja2dyb3VuZCwKKyAgICAgICAgaGlnaGxpZ2h0Y29sb3IsIGhpZ2hsaWdodHRoaWNrbmVzcywgbWVudSwgcmVsaWVmLCBzY3JlZW4sIHRha2Vmb2N1cywKKyAgICAgICAgdXNlLCB2aXN1YWwsIHdpZHRoLiIiIgorICAgICAgICBpZiBrdzoKKyAgICAgICAgICAgIGNuZiA9IF9jbmZtZXJnZSgoY25mLCBrdykpCisgICAgICAgIGV4dHJhID0gKCkKKyAgICAgICAgZm9yIHdta2V5IGluIFsnc2NyZWVuJywgJ2NsYXNzXycsICdjbGFzcycsICd2aXN1YWwnLAorICAgICAgICAgICAgICAgICAgJ2NvbG9ybWFwJ106CisgICAgICAgICAgICBpZiB3bWtleSBpbiBjbmY6CisgICAgICAgICAgICAgICAgdmFsID0gY25mW3dta2V5XQorICAgICAgICAgICAgICAgICMgVEJEOiBhIGhhY2sgbmVlZGVkIGJlY2F1c2Ugc29tZSBrZXlzCisgICAgICAgICAgICAgICAgIyBhcmUgbm90IHZhbGlkIGFzIGtleXdvcmQgYXJndW1lbnRzCisgICAgICAgICAgICAgICAgaWYgd21rZXlbLTFdID09ICdfJzogb3B0ID0gJy0nK3dta2V5WzotMV0KKyAgICAgICAgICAgICAgICBlbHNlOiBvcHQgPSAnLScrd21rZXkKKyAgICAgICAgICAgICAgICBleHRyYSA9IGV4dHJhICsgKG9wdCwgdmFsKQorICAgICAgICAgICAgICAgIGRlbCBjbmZbd21rZXldCisgICAgICAgIEJhc2VXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndG9wbGV2ZWwnLCBjbmYsIHt9LCBleHRyYSkKKyAgICAgICAgcm9vdCA9IHNlbGYuX3Jvb3QoKQorICAgICAgICBzZWxmLmljb25uYW1lKHJvb3QuaWNvbm5hbWUoKSkKKyAgICAgICAgc2VsZi50aXRsZShyb290LnRpdGxlKCkpCisgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLmRlc3Ryb3kpCisKK2NsYXNzIEJ1dHRvbihXaWRnZXQpOgorICAgICIiIkJ1dHRvbiB3aWRnZXQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBidXR0b24gd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBNQVNURVIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBhY3RpdmViYWNrZ3JvdW5kLCBhY3RpdmVmb3JlZ3JvdW5kLCBhbmNob3IsCisgICAgICAgICAgICBiYWNrZ3JvdW5kLCBiaXRtYXAsIGJvcmRlcndpZHRoLCBjdXJzb3IsCisgICAgICAgICAgICBkaXNhYmxlZGZvcmVncm91bmQsIGZvbnQsIGZvcmVncm91bmQKKyAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLAorICAgICAgICAgICAgaGlnaGxpZ2h0dGhpY2tuZXNzLCBpbWFnZSwganVzdGlmeSwKKyAgICAgICAgICAgIHBhZHgsIHBhZHksIHJlbGllZiwgcmVwZWF0ZGVsYXksCisgICAgICAgICAgICByZXBlYXRpbnRlcnZhbCwgdGFrZWZvY3VzLCB0ZXh0LAorICAgICAgICAgICAgdGV4dHZhcmlhYmxlLCB1bmRlcmxpbmUsIHdyYXBsZW5ndGgKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBjb21tYW5kLCBjb21wb3VuZCwgZGVmYXVsdCwgaGVpZ2h0LAorICAgICAgICAgICAgb3ZlcnJlbGllZiwgc3RhdGUsIHdpZHRoCisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAnYnV0dG9uJywgY25mLCBrdykKKworICAgIGRlZiB0a0J1dHRvbkVudGVyKHNlbGYsICpkdW1teSk6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGtCdXR0b25FbnRlcicsIHNlbGYuX3cpCisKKyAgICBkZWYgdGtCdXR0b25MZWF2ZShzZWxmLCAqZHVtbXkpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrQnV0dG9uTGVhdmUnLCBzZWxmLl93KQorCisgICAgZGVmIHRrQnV0dG9uRG93bihzZWxmLCAqZHVtbXkpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrQnV0dG9uRG93bicsIHNlbGYuX3cpCisKKyAgICBkZWYgdGtCdXR0b25VcChzZWxmLCAqZHVtbXkpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrQnV0dG9uVXAnLCBzZWxmLl93KQorCisgICAgZGVmIHRrQnV0dG9uSW52b2tlKHNlbGYsICpkdW1teSk6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGtCdXR0b25JbnZva2UnLCBzZWxmLl93KQorCisgICAgZGVmIGZsYXNoKHNlbGYpOgorICAgICAgICAiIiJGbGFzaCB0aGUgYnV0dG9uLgorCisgICAgICAgIFRoaXMgaXMgYWNjb21wbGlzaGVkIGJ5IHJlZGlzcGxheWluZworICAgICAgICB0aGUgYnV0dG9uIHNldmVyYWwgdGltZXMsIGFsdGVybmF0aW5nIGJldHdlZW4gYWN0aXZlIGFuZAorICAgICAgICBub3JtYWwgY29sb3JzLiBBdCB0aGUgZW5kIG9mIHRoZSBmbGFzaCB0aGUgYnV0dG9uIGlzIGxlZnQKKyAgICAgICAgaW4gdGhlIHNhbWUgbm9ybWFsL2FjdGl2ZSBzdGF0ZSBhcyB3aGVuIHRoZSBjb21tYW5kIHdhcworICAgICAgICBpbnZva2VkLiBUaGlzIGNvbW1hbmQgaXMgaWdub3JlZCBpZiB0aGUgYnV0dG9uJ3Mgc3RhdGUgaXMKKyAgICAgICAgZGlzYWJsZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ZsYXNoJykKKworICAgIGRlZiBpbnZva2Uoc2VsZik6CisgICAgICAgICIiIkludm9rZSB0aGUgY29tbWFuZCBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1dHRvbi4KKworICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGUgY29tbWFuZCwKKyAgICAgICAgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgIHRoZSBidXR0b24uIFRoaXMgY29tbWFuZCBpcyBpZ25vcmVkIGlmIHRoZSBidXR0b24ncyBzdGF0ZQorICAgICAgICBpcyBkaXNhYmxlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ludm9rZScpCisKKyMgSW5kaWNlczoKKyMgWFhYIEkgZG9uJ3QgbGlrZSB0aGVzZSAtLSB0YWtlIHRoZW0gYXdheQorZGVmIEF0RW5kKCk6CisgICAgcmV0dXJuICdlbmQnCitkZWYgQXRJbnNlcnQoKmFyZ3MpOgorICAgIHMgPSAnaW5zZXJ0JworICAgIGZvciBhIGluIGFyZ3M6CisgICAgICAgIGlmIGE6IHMgPSBzICsgKCcgJyArIGEpCisgICAgcmV0dXJuIHMKK2RlZiBBdFNlbEZpcnN0KCk6CisgICAgcmV0dXJuICdzZWwuZmlyc3QnCitkZWYgQXRTZWxMYXN0KCk6CisgICAgcmV0dXJuICdzZWwubGFzdCcKK2RlZiBBdCh4LCB5PU5vbmUpOgorICAgIGlmIHkgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuICdAJXInICUgKHgsKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnQCVyLCVyJyAlICh4LCB5KQorCitjbGFzcyBDYW52YXMoV2lkZ2V0LCBYVmlldywgWVZpZXcpOgorICAgICIiIkNhbnZhcyB3aWRnZXQgdG8gZGlzcGxheSBncmFwaGljYWwgZWxlbWVudHMgbGlrZSBsaW5lcyBvciB0ZXh0LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgY2FudmFzIHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLgorCisgICAgICAgIFZhbGlkIHJlc291cmNlIG5hbWVzOiBiYWNrZ3JvdW5kLCBiZCwgYmcsIGJvcmRlcndpZHRoLCBjbG9zZWVub3VnaCwKKyAgICAgICAgY29uZmluZSwgY3Vyc29yLCBoZWlnaHQsIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLAorICAgICAgICBoaWdobGlnaHR0aGlja25lc3MsIGluc2VydGJhY2tncm91bmQsIGluc2VydGJvcmRlcndpZHRoLAorICAgICAgICBpbnNlcnRvZmZ0aW1lLCBpbnNlcnRvbnRpbWUsIGluc2VydHdpZHRoLCBvZmZzZXQsIHJlbGllZiwKKyAgICAgICAgc2Nyb2xscmVnaW9uLCBzZWxlY3RiYWNrZ3JvdW5kLCBzZWxlY3Rib3JkZXJ3aWR0aCwgc2VsZWN0Zm9yZWdyb3VuZCwKKyAgICAgICAgc3RhdGUsIHRha2Vmb2N1cywgd2lkdGgsIHhzY3JvbGxjb21tYW5kLCB4c2Nyb2xsaW5jcmVtZW50LAorICAgICAgICB5c2Nyb2xsY29tbWFuZCwgeXNjcm9sbGluY3JlbWVudC4iIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ2NhbnZhcycsIGNuZiwga3cpCisgICAgZGVmIGFkZHRhZyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdhZGR0YWcnKSArIGFyZ3MpCisgICAgZGVmIGFkZHRhZ19hYm92ZShzZWxmLCBuZXd0YWcsIHRhZ09ySWQpOgorICAgICAgICAiIiJBZGQgdGFnIE5FV1RBRyB0byBhbGwgaXRlbXMgYWJvdmUgVEFHT1JJRC4iIiIKKyAgICAgICAgc2VsZi5hZGR0YWcobmV3dGFnLCAnYWJvdmUnLCB0YWdPcklkKQorICAgIGRlZiBhZGR0YWdfYWxsKHNlbGYsIG5ld3RhZyk6CisgICAgICAgICIiIkFkZCB0YWcgTkVXVEFHIHRvIGFsbCBpdGVtcy4iIiIKKyAgICAgICAgc2VsZi5hZGR0YWcobmV3dGFnLCAnYWxsJykKKyAgICBkZWYgYWRkdGFnX2JlbG93KHNlbGYsIG5ld3RhZywgdGFnT3JJZCk6CisgICAgICAgICIiIkFkZCB0YWcgTkVXVEFHIHRvIGFsbCBpdGVtcyBiZWxvdyBUQUdPUklELiIiIgorICAgICAgICBzZWxmLmFkZHRhZyhuZXd0YWcsICdiZWxvdycsIHRhZ09ySWQpCisgICAgZGVmIGFkZHRhZ19jbG9zZXN0KHNlbGYsIG5ld3RhZywgeCwgeSwgaGFsbz1Ob25lLCBzdGFydD1Ob25lKToKKyAgICAgICAgIiIiQWRkIHRhZyBORVdUQUcgdG8gaXRlbSB3aGljaCBpcyBjbG9zZXN0IHRvIHBpeGVsIGF0IFgsIFkuCisgICAgICAgIElmIHNldmVyYWwgbWF0Y2ggdGFrZSB0aGUgdG9wLW1vc3QuCisgICAgICAgIEFsbCBpdGVtcyBjbG9zZXIgdGhhbiBIQUxPIGFyZSBjb25zaWRlcmVkIG92ZXJsYXBwaW5nIChhbGwgYXJlCisgICAgICAgIGNsb3Nlc3RzKS4gSWYgU1RBUlQgaXMgc3BlY2lmaWVkIHRoZSBuZXh0IGJlbG93IHRoaXMgdGFnIGlzIHRha2VuLiIiIgorICAgICAgICBzZWxmLmFkZHRhZyhuZXd0YWcsICdjbG9zZXN0JywgeCwgeSwgaGFsbywgc3RhcnQpCisgICAgZGVmIGFkZHRhZ19lbmNsb3NlZChzZWxmLCBuZXd0YWcsIHgxLCB5MSwgeDIsIHkyKToKKyAgICAgICAgIiIiQWRkIHRhZyBORVdUQUcgdG8gYWxsIGl0ZW1zIGluIHRoZSByZWN0YW5nbGUgZGVmaW5lZAorICAgICAgICBieSBYMSxZMSxYMixZMi4iIiIKKyAgICAgICAgc2VsZi5hZGR0YWcobmV3dGFnLCAnZW5jbG9zZWQnLCB4MSwgeTEsIHgyLCB5MikKKyAgICBkZWYgYWRkdGFnX292ZXJsYXBwaW5nKHNlbGYsIG5ld3RhZywgeDEsIHkxLCB4MiwgeTIpOgorICAgICAgICAiIiJBZGQgdGFnIE5FV1RBRyB0byBhbGwgaXRlbXMgd2hpY2ggb3ZlcmxhcCB0aGUgcmVjdGFuZ2xlCisgICAgICAgIGRlZmluZWQgYnkgWDEsWTEsWDIsWTIuIiIiCisgICAgICAgIHNlbGYuYWRkdGFnKG5ld3RhZywgJ292ZXJsYXBwaW5nJywgeDEsIHkxLCB4MiwgeTIpCisgICAgZGVmIGFkZHRhZ193aXRodGFnKHNlbGYsIG5ld3RhZywgdGFnT3JJZCk6CisgICAgICAgICIiIkFkZCB0YWcgTkVXVEFHIHRvIGFsbCBpdGVtcyB3aXRoIFRBR09SSUQuIiIiCisgICAgICAgIHNlbGYuYWRkdGFnKG5ld3RhZywgJ3dpdGh0YWcnLCB0YWdPcklkKQorICAgIGRlZiBiYm94KHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiUmV0dXJuIGEgdHVwbGUgb2YgWDEsWTEsWDIsWTIgY29vcmRpbmF0ZXMgZm9yIGEgcmVjdGFuZ2xlCisgICAgICAgIHdoaWNoIGVuY2xvc2VzIGFsbCBpdGVtcyB3aXRoIHRhZ3Mgc3BlY2lmaWVkIGFzIGFyZ3VtZW50cy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdiYm94JykgKyBhcmdzKSkgb3IgTm9uZQorICAgIGRlZiB0YWdfdW5iaW5kKHNlbGYsIHRhZ09ySWQsIHNlcXVlbmNlLCBmdW5jaWQ9Tm9uZSk6CisgICAgICAgICIiIlVuYmluZCBmb3IgYWxsIGl0ZW1zIHdpdGggVEFHT1JJRCBmb3IgZXZlbnQgU0VRVUVOQ0UgIHRoZQorICAgICAgICBmdW5jdGlvbiBpZGVudGlmaWVkIHdpdGggRlVOQ0lELiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2JpbmQnLCB0YWdPcklkLCBzZXF1ZW5jZSwgJycpCisgICAgICAgIGlmIGZ1bmNpZDoKKyAgICAgICAgICAgIHNlbGYuZGVsZXRlY29tbWFuZChmdW5jaWQpCisgICAgZGVmIHRhZ19iaW5kKHNlbGYsIHRhZ09ySWQsIHNlcXVlbmNlPU5vbmUsIGZ1bmM9Tm9uZSwgYWRkPU5vbmUpOgorICAgICAgICAiIiJCaW5kIHRvIGFsbCBpdGVtcyB3aXRoIFRBR09SSUQgYXQgZXZlbnQgU0VRVUVOQ0UgYSBjYWxsIHRvIGZ1bmN0aW9uIEZVTkMuCisKKyAgICAgICAgQW4gYWRkaXRpb25hbCBib29sZWFuIHBhcmFtZXRlciBBREQgc3BlY2lmaWVzIHdoZXRoZXIgRlVOQyB3aWxsIGJlCisgICAgICAgIGNhbGxlZCBhZGRpdGlvbmFsbHkgdG8gdGhlIG90aGVyIGJvdW5kIGZ1bmN0aW9uIG9yIHdoZXRoZXIgaXQgd2lsbAorICAgICAgICByZXBsYWNlIHRoZSBwcmV2aW91cyBmdW5jdGlvbi4gU2VlIGJpbmQgZm9yIHRoZSByZXR1cm4gdmFsdWUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9iaW5kKChzZWxmLl93LCAnYmluZCcsIHRhZ09ySWQpLAorICAgICAgICAgICAgICAgICAgc2VxdWVuY2UsIGZ1bmMsIGFkZCkKKyAgICBkZWYgY2FudmFzeChzZWxmLCBzY3JlZW54LCBncmlkc3BhY2luZz1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjYW52YXMgeCBjb29yZGluYXRlIG9mIHBpeGVsIHBvc2l0aW9uIFNDUkVFTlggcm91bmRlZAorICAgICAgICB0byBuZWFyZXN0IG11bHRpcGxlIG9mIEdSSURTUEFDSU5HIHVuaXRzLiIiIgorICAgICAgICByZXR1cm4gZ2V0ZG91YmxlKHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIHNlbGYuX3csICdjYW52YXN4Jywgc2NyZWVueCwgZ3JpZHNwYWNpbmcpKQorICAgIGRlZiBjYW52YXN5KHNlbGYsIHNjcmVlbnksIGdyaWRzcGFjaW5nPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNhbnZhcyB5IGNvb3JkaW5hdGUgb2YgcGl4ZWwgcG9zaXRpb24gU0NSRUVOWSByb3VuZGVkCisgICAgICAgIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgR1JJRFNQQUNJTkcgdW5pdHMuIiIiCisgICAgICAgIHJldHVybiBnZXRkb3VibGUoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgc2VsZi5fdywgJ2NhbnZhc3knLCBzY3JlZW55LCBncmlkc3BhY2luZykpCisgICAgZGVmIGNvb3JkcyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgY29vcmRpbmF0ZXMgZm9yIHRoZSBpdGVtIGdpdmVuIGluIEFSR1MuIiIiCisgICAgICAgICMgWFhYIFNob3VsZCB1c2UgX2ZsYXR0ZW4gb24gYXJncworICAgICAgICByZXR1cm4gbWFwKGdldGRvdWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2Nvb3JkcycpICsgYXJncykpKQorICAgIGRlZiBfY3JlYXRlKHNlbGYsIGl0ZW1UeXBlLCBhcmdzLCBrdyk6ICMgQXJnczogKHZhbCwgdmFsLCAuLi4sIGNuZj17fSkKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIGFyZ3MgPSBfZmxhdHRlbihhcmdzKQorICAgICAgICBjbmYgPSBhcmdzWy0xXQorICAgICAgICBpZiB0eXBlKGNuZikgaW4gKERpY3Rpb25hcnlUeXBlLCBUdXBsZVR5cGUpOgorICAgICAgICAgICAgYXJncyA9IGFyZ3NbOi0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY25mID0ge30KKyAgICAgICAgcmV0dXJuIGdldGludChzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICBzZWxmLl93LCAnY3JlYXRlJywgaXRlbVR5cGUsCisgICAgICAgICAgICAqKGFyZ3MgKyBzZWxmLl9vcHRpb25zKGNuZiwga3cpKSkpCisgICAgZGVmIGNyZWF0ZV9hcmMoc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICAiIiJDcmVhdGUgYXJjIHNoYXBlZCByZWdpb24gd2l0aCBjb29yZGluYXRlcyB4MSx5MSx4Mix5Mi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NyZWF0ZSgnYXJjJywgYXJncywga3cpCisgICAgZGVmIGNyZWF0ZV9iaXRtYXAoc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICAiIiJDcmVhdGUgYml0bWFwIHdpdGggY29vcmRpbmF0ZXMgeDEseTEuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jcmVhdGUoJ2JpdG1hcCcsIGFyZ3MsIGt3KQorICAgIGRlZiBjcmVhdGVfaW1hZ2Uoc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICAiIiJDcmVhdGUgaW1hZ2UgaXRlbSB3aXRoIGNvb3JkaW5hdGVzIHgxLHkxLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlKCdpbWFnZScsIGFyZ3MsIGt3KQorICAgIGRlZiBjcmVhdGVfbGluZShzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgICIiIkNyZWF0ZSBsaW5lIHdpdGggY29vcmRpbmF0ZXMgeDEseTEsLi4uLHhuLHluLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlKCdsaW5lJywgYXJncywga3cpCisgICAgZGVmIGNyZWF0ZV9vdmFsKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgIiIiQ3JlYXRlIG92YWwgd2l0aCBjb29yZGluYXRlcyB4MSx5MSx4Mix5Mi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NyZWF0ZSgnb3ZhbCcsIGFyZ3MsIGt3KQorICAgIGRlZiBjcmVhdGVfcG9seWdvbihzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgICIiIkNyZWF0ZSBwb2x5Z29uIHdpdGggY29vcmRpbmF0ZXMgeDEseTEsLi4uLHhuLHluLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlKCdwb2x5Z29uJywgYXJncywga3cpCisgICAgZGVmIGNyZWF0ZV9yZWN0YW5nbGUoc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICAiIiJDcmVhdGUgcmVjdGFuZ2xlIHdpdGggY29vcmRpbmF0ZXMgeDEseTEseDIseTIuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jcmVhdGUoJ3JlY3RhbmdsZScsIGFyZ3MsIGt3KQorICAgIGRlZiBjcmVhdGVfdGV4dChzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgICIiIkNyZWF0ZSB0ZXh0IHdpdGggY29vcmRpbmF0ZXMgeDEseTEuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jcmVhdGUoJ3RleHQnLCBhcmdzLCBrdykKKyAgICBkZWYgY3JlYXRlX3dpbmRvdyhzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgICIiIkNyZWF0ZSB3aW5kb3cgd2l0aCBjb29yZGluYXRlcyB4MSx5MSx4Mix5Mi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NyZWF0ZSgnd2luZG93JywgYXJncywga3cpCisgICAgZGVmIGRjaGFycyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkRlbGV0ZSBjaGFyYWN0ZXJzIG9mIHRleHQgaXRlbXMgaWRlbnRpZmllZCBieSB0YWcgb3IgaWQgaW4gQVJHUyAocG9zc2libHkKKyAgICAgICAgc2V2ZXJhbCB0aW1lcykgZnJvbSBGSVJTVCB0byBMQVNUIGNoYXJhY3RlciAoaW5jbHVkaW5nKS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnZGNoYXJzJykgKyBhcmdzKQorICAgIGRlZiBkZWxldGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJEZWxldGUgaXRlbXMgaWRlbnRpZmllZCBieSBhbGwgdGFnIG9yIGlkcyBjb250YWluZWQgaW4gQVJHUy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnZGVsZXRlJykgKyBhcmdzKQorICAgIGRlZiBkdGFnKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiRGVsZXRlIHRhZyBvciBpZCBnaXZlbiBhcyBsYXN0IGFyZ3VtZW50cyBpbiBBUkdTIGZyb20gaXRlbXMKKyAgICAgICAgaWRlbnRpZmllZCBieSBmaXJzdCBhcmd1bWVudCBpbiBBUkdTLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdkdGFnJykgKyBhcmdzKQorICAgIGRlZiBmaW5kKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnZmluZCcpICsgYXJncykpIG9yICgpCisgICAgZGVmIGZpbmRfYWJvdmUoc2VsZiwgdGFnT3JJZCk6CisgICAgICAgICIiIlJldHVybiBpdGVtcyBhYm92ZSBUQUdPUklELiIiIgorICAgICAgICByZXR1cm4gc2VsZi5maW5kKCdhYm92ZScsIHRhZ09ySWQpCisgICAgZGVmIGZpbmRfYWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYWxsIGl0ZW1zLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5maW5kKCdhbGwnKQorICAgIGRlZiBmaW5kX2JlbG93KHNlbGYsIHRhZ09ySWQpOgorICAgICAgICAiIiJSZXR1cm4gYWxsIGl0ZW1zIGJlbG93IFRBR09SSUQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmZpbmQoJ2JlbG93JywgdGFnT3JJZCkKKyAgICBkZWYgZmluZF9jbG9zZXN0KHNlbGYsIHgsIHksIGhhbG89Tm9uZSwgc3RhcnQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBpdGVtIHdoaWNoIGlzIGNsb3Nlc3QgdG8gcGl4ZWwgYXQgWCwgWS4KKyAgICAgICAgSWYgc2V2ZXJhbCBtYXRjaCB0YWtlIHRoZSB0b3AtbW9zdC4KKyAgICAgICAgQWxsIGl0ZW1zIGNsb3NlciB0aGFuIEhBTE8gYXJlIGNvbnNpZGVyZWQgb3ZlcmxhcHBpbmcgKGFsbCBhcmUKKyAgICAgICAgY2xvc2VzdHMpLiBJZiBTVEFSVCBpcyBzcGVjaWZpZWQgdGhlIG5leHQgYmVsb3cgdGhpcyB0YWcgaXMgdGFrZW4uIiIiCisgICAgICAgIHJldHVybiBzZWxmLmZpbmQoJ2Nsb3Nlc3QnLCB4LCB5LCBoYWxvLCBzdGFydCkKKyAgICBkZWYgZmluZF9lbmNsb3NlZChzZWxmLCB4MSwgeTEsIHgyLCB5Mik6CisgICAgICAgICIiIlJldHVybiBhbGwgaXRlbXMgaW4gcmVjdGFuZ2xlIGRlZmluZWQKKyAgICAgICAgYnkgWDEsWTEsWDIsWTIuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmZpbmQoJ2VuY2xvc2VkJywgeDEsIHkxLCB4MiwgeTIpCisgICAgZGVmIGZpbmRfb3ZlcmxhcHBpbmcoc2VsZiwgeDEsIHkxLCB4MiwgeTIpOgorICAgICAgICAiIiJSZXR1cm4gYWxsIGl0ZW1zIHdoaWNoIG92ZXJsYXAgdGhlIHJlY3RhbmdsZQorICAgICAgICBkZWZpbmVkIGJ5IFgxLFkxLFgyLFkyLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5maW5kKCdvdmVybGFwcGluZycsIHgxLCB5MSwgeDIsIHkyKQorICAgIGRlZiBmaW5kX3dpdGh0YWcoc2VsZiwgdGFnT3JJZCk6CisgICAgICAgICIiIlJldHVybiBhbGwgaXRlbXMgd2l0aCBUQUdPUklELiIiIgorICAgICAgICByZXR1cm4gc2VsZi5maW5kKCd3aXRodGFnJywgdGFnT3JJZCkKKyAgICBkZWYgZm9jdXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJTZXQgZm9jdXMgdG8gdGhlIGZpcnN0IGl0ZW0gc3BlY2lmaWVkIGluIEFSR1MuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdmb2N1cycpICsgYXJncykKKyAgICBkZWYgZ2V0dGFncyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlJldHVybiB0YWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlyc3QgaXRlbSBzcGVjaWZpZWQgaW4gQVJHUy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnZ2V0dGFncycpICsgYXJncykpCisgICAgZGVmIGljdXJzb3Ioc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJTZXQgY3Vyc29yIGF0IHBvc2l0aW9uIFBPUyBpbiB0aGUgaXRlbSBpZGVudGlmaWVkIGJ5IFRBR09SSUQuCisgICAgICAgIEluIEFSR1MgVEFHT1JJRCBtdXN0IGJlIGZpcnN0LiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdpY3Vyc29yJykgKyBhcmdzKQorICAgIGRlZiBpbmRleChzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlJldHVybiBwb3NpdGlvbiBvZiBjdXJzb3IgYXMgaW50ZWdlciBpbiBpdGVtIHNwZWNpZmllZCBpbiBBUkdTLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2luZGV4JykgKyBhcmdzKSkKKyAgICBkZWYgaW5zZXJ0KHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiSW5zZXJ0IFRFWFQgaW4gaXRlbSBUQUdPUklEIGF0IHBvc2l0aW9uIFBPUy4gQVJHUyBtdXN0CisgICAgICAgIGJlIFRBR09SSUQgUE9TIFRFWFQuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2luc2VydCcpICsgYXJncykKKyAgICBkZWYgaXRlbWNnZXQoc2VsZiwgdGFnT3JJZCwgb3B0aW9uKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSByZXNvdXJjZSB2YWx1ZSBmb3IgYW4gT1BUSU9OIGZvciBpdGVtIFRBR09SSUQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAoc2VsZi5fdywgJ2l0ZW1jZ2V0JykgKyAodGFnT3JJZCwgJy0nK29wdGlvbikpCisgICAgZGVmIGl0ZW1jb25maWd1cmUoc2VsZiwgdGFnT3JJZCwgY25mPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25maWd1cmUgcmVzb3VyY2VzIG9mIGFuIGl0ZW0gVEFHT1JJRC4KKworICAgICAgICBUaGUgdmFsdWVzIGZvciByZXNvdXJjZXMgYXJlIHNwZWNpZmllZCBhcyBrZXl3b3JkCisgICAgICAgIGFyZ3VtZW50cy4gVG8gZ2V0IGFuIG92ZXJ2aWV3IGFib3V0CisgICAgICAgIHRoZSBhbGxvd2VkIGtleXdvcmQgYXJndW1lbnRzIGNhbGwgdGhlIG1ldGhvZCB3aXRob3V0IGFyZ3VtZW50cy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jb25maWd1cmUoKCdpdGVtY29uZmlndXJlJywgdGFnT3JJZCksIGNuZiwga3cpCisgICAgaXRlbWNvbmZpZyA9IGl0ZW1jb25maWd1cmUKKyAgICAjIGxvd2VyLCB0a3JhaXNlL2xpZnQgaGlkZSBNaXNjLmxvd2VyLCBNaXNjLnRrcmFpc2UvbGlmdCwKKyAgICAjIHNvIHRoZSBwcmVmZXJyZWQgbmFtZSBmb3IgdGhlbSBpcyB0YWdfbG93ZXIsIHRhZ19yYWlzZQorICAgICMgKHNpbWlsYXIgdG8gdGFnX2JpbmQsIGFuZCBzaW1pbGFyIHRvIHRoZSBUZXh0IHdpZGdldCk7CisgICAgIyB1bmZvcnR1bmF0ZWx5IGNhbid0IGRlbGV0ZSB0aGUgb2xkIG9uZXMgeWV0IChtYXliZSBpbiAxLjYpCisgICAgZGVmIHRhZ19sb3dlcihzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkxvd2VyIGFuIGl0ZW0gVEFHT1JJRCBnaXZlbiBpbiBBUkdTCisgICAgICAgIChvcHRpb25hbCBiZWxvdyBhbm90aGVyIGl0ZW0pLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdsb3dlcicpICsgYXJncykKKyAgICBsb3dlciA9IHRhZ19sb3dlcgorICAgIGRlZiBtb3ZlKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiTW92ZSBhbiBpdGVtIFRBR09SSUQgZ2l2ZW4gaW4gQVJHUy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnbW92ZScpICsgYXJncykKKyAgICBkZWYgcG9zdHNjcmlwdChzZWxmLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJQcmludCB0aGUgY29udGVudHMgb2YgdGhlIGNhbnZhcyB0byBhIHBvc3RzY3JpcHQKKyAgICAgICAgZmlsZS4gVmFsaWQgb3B0aW9uczogY29sb3JtYXAsIGNvbG9ybW9kZSwgZmlsZSwgZm9udG1hcCwKKyAgICAgICAgaGVpZ2h0LCBwYWdlYW5jaG9yLCBwYWdlaGVpZ2h0LCBwYWdld2lkdGgsIHBhZ2V4LCBwYWdleSwKKyAgICAgICAgcm90YXRlLCB3aXRkaCwgeCwgeS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ3Bvc3RzY3JpcHQnKSArCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgZGVmIHRhZ19yYWlzZShzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlJhaXNlIGFuIGl0ZW0gVEFHT1JJRCBnaXZlbiBpbiBBUkdTCisgICAgICAgIChvcHRpb25hbCBhYm92ZSBhbm90aGVyIGl0ZW0pLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdyYWlzZScpICsgYXJncykKKyAgICBsaWZ0ID0gdGtyYWlzZSA9IHRhZ19yYWlzZQorICAgIGRlZiBzY2FsZShzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlNjYWxlIGl0ZW0gVEFHT1JJRCB3aXRoIFhPUklHSU4sIFlPUklHSU4sIFhTQ0FMRSwgWVNDQUxFLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdzY2FsZScpICsgYXJncykKKyAgICBkZWYgc2Nhbl9tYXJrKHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJSZW1lbWJlciB0aGUgY3VycmVudCBYLCBZIGNvb3JkaW5hdGVzLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NjYW4nLCAnbWFyaycsIHgsIHkpCisgICAgZGVmIHNjYW5fZHJhZ3RvKHNlbGYsIHgsIHksIGdhaW49MTApOgorICAgICAgICAiIiJBZGp1c3QgdGhlIHZpZXcgb2YgdGhlIGNhbnZhcyB0byBHQUlOIHRpbWVzIHRoZQorICAgICAgICBkaWZmZXJlbmNlIGJldHdlZW4gWCBhbmQgWSBhbmQgdGhlIGNvb3JkaW5hdGVzIGdpdmVuIGluCisgICAgICAgIHNjYW5fbWFyay4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzY2FuJywgJ2RyYWd0bycsIHgsIHksIGdhaW4pCisgICAgZGVmIHNlbGVjdF9hZGp1c3Qoc2VsZiwgdGFnT3JJZCwgaW5kZXgpOgorICAgICAgICAiIiJBZGp1c3QgdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uIG5lYXIgdGhlIGN1cnNvciBvZiBhbiBpdGVtIFRBR09SSUQgdG8gaW5kZXguIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VsZWN0JywgJ2FkanVzdCcsIHRhZ09ySWQsIGluZGV4KQorICAgIGRlZiBzZWxlY3RfY2xlYXIoc2VsZik6CisgICAgICAgICIiIkNsZWFyIHRoZSBzZWxlY3Rpb24gaWYgaXQgaXMgaW4gdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VsZWN0JywgJ2NsZWFyJykKKyAgICBkZWYgc2VsZWN0X2Zyb20oc2VsZiwgdGFnT3JJZCwgaW5kZXgpOgorICAgICAgICAiIiJTZXQgdGhlIGZpeGVkIGVuZCBvZiBhIHNlbGVjdGlvbiBpbiBpdGVtIFRBR09SSUQgdG8gSU5ERVguIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VsZWN0JywgJ2Zyb20nLCB0YWdPcklkLCBpbmRleCkKKyAgICBkZWYgc2VsZWN0X2l0ZW0oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgaXRlbSB3aGljaCBoYXMgdGhlIHNlbGVjdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VsZWN0JywgJ2l0ZW0nKSBvciBOb25lCisgICAgZGVmIHNlbGVjdF90byhzZWxmLCB0YWdPcklkLCBpbmRleCk6CisgICAgICAgICIiIlNldCB0aGUgdmFyaWFibGUgZW5kIG9mIGEgc2VsZWN0aW9uIGluIGl0ZW0gVEFHT1JJRCB0byBJTkRFWC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3QnLCAndG8nLCB0YWdPcklkLCBpbmRleCkKKyAgICBkZWYgdHlwZShzZWxmLCB0YWdPcklkKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBpdGVtIFRBR09SSUQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3R5cGUnLCB0YWdPcklkKSBvciBOb25lCisKK2NsYXNzIENoZWNrYnV0dG9uKFdpZGdldCk6CisgICAgIiIiQ2hlY2tidXR0b24gd2lkZ2V0IHdoaWNoIGlzIGVpdGhlciBpbiBvbi0gb3Igb2ZmLXN0YXRlLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgY2hlY2tidXR0b24gd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBNQVNURVIuCisKKyAgICAgICAgVmFsaWQgcmVzb3VyY2UgbmFtZXM6IGFjdGl2ZWJhY2tncm91bmQsIGFjdGl2ZWZvcmVncm91bmQsIGFuY2hvciwKKyAgICAgICAgYmFja2dyb3VuZCwgYmQsIGJnLCBiaXRtYXAsIGJvcmRlcndpZHRoLCBjb21tYW5kLCBjdXJzb3IsCisgICAgICAgIGRpc2FibGVkZm9yZWdyb3VuZCwgZmcsIGZvbnQsIGZvcmVncm91bmQsIGhlaWdodCwKKyAgICAgICAgaGlnaGxpZ2h0YmFja2dyb3VuZCwgaGlnaGxpZ2h0Y29sb3IsIGhpZ2hsaWdodHRoaWNrbmVzcywgaW1hZ2UsCisgICAgICAgIGluZGljYXRvcm9uLCBqdXN0aWZ5LCBvZmZ2YWx1ZSwgb252YWx1ZSwgcGFkeCwgcGFkeSwgcmVsaWVmLAorICAgICAgICBzZWxlY3Rjb2xvciwgc2VsZWN0aW1hZ2UsIHN0YXRlLCB0YWtlZm9jdXMsIHRleHQsIHRleHR2YXJpYWJsZSwKKyAgICAgICAgdW5kZXJsaW5lLCB2YXJpYWJsZSwgd2lkdGgsIHdyYXBsZW5ndGguIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdjaGVja2J1dHRvbicsIGNuZiwga3cpCisgICAgZGVmIGRlc2VsZWN0KHNlbGYpOgorICAgICAgICAiIiJQdXQgdGhlIGJ1dHRvbiBpbiBvZmYtc3RhdGUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZGVzZWxlY3QnKQorICAgIGRlZiBmbGFzaChzZWxmKToKKyAgICAgICAgIiIiRmxhc2ggdGhlIGJ1dHRvbi4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdmbGFzaCcpCisgICAgZGVmIGludm9rZShzZWxmKToKKyAgICAgICAgIiIiVG9nZ2xlIHRoZSBidXR0b24gYW5kIGludm9rZSBhIGNvbW1hbmQgaWYgZ2l2ZW4gYXMgcmVzb3VyY2UuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ludm9rZScpCisgICAgZGVmIHNlbGVjdChzZWxmKToKKyAgICAgICAgIiIiUHV0IHRoZSBidXR0b24gaW4gb24tc3RhdGUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VsZWN0JykKKyAgICBkZWYgdG9nZ2xlKHNlbGYpOgorICAgICAgICAiIiJUb2dnbGUgdGhlIGJ1dHRvbi4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICd0b2dnbGUnKQorCitjbGFzcyBFbnRyeShXaWRnZXQsIFhWaWV3KToKKyAgICAiIiJFbnRyeSB3aWRnZXQgd2hpY2ggYWxsb3dzIHRvIGRpc3BsYXkgc2ltcGxlIHRleHQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYW4gZW50cnkgd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBNQVNURVIuCisKKyAgICAgICAgVmFsaWQgcmVzb3VyY2UgbmFtZXM6IGJhY2tncm91bmQsIGJkLCBiZywgYm9yZGVyd2lkdGgsIGN1cnNvciwKKyAgICAgICAgZXhwb3J0c2VsZWN0aW9uLCBmZywgZm9udCwgZm9yZWdyb3VuZCwgaGlnaGxpZ2h0YmFja2dyb3VuZCwKKyAgICAgICAgaGlnaGxpZ2h0Y29sb3IsIGhpZ2hsaWdodHRoaWNrbmVzcywgaW5zZXJ0YmFja2dyb3VuZCwKKyAgICAgICAgaW5zZXJ0Ym9yZGVyd2lkdGgsIGluc2VydG9mZnRpbWUsIGluc2VydG9udGltZSwgaW5zZXJ0d2lkdGgsCisgICAgICAgIGludmFsaWRjb21tYW5kLCBpbnZjbWQsIGp1c3RpZnksIHJlbGllZiwgc2VsZWN0YmFja2dyb3VuZCwKKyAgICAgICAgc2VsZWN0Ym9yZGVyd2lkdGgsIHNlbGVjdGZvcmVncm91bmQsIHNob3csIHN0YXRlLCB0YWtlZm9jdXMsCisgICAgICAgIHRleHR2YXJpYWJsZSwgdmFsaWRhdGUsIHZhbGlkYXRlY29tbWFuZCwgdmNtZCwgd2lkdGgsCisgICAgICAgIHhzY3JvbGxjb21tYW5kLiIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAnZW50cnknLCBjbmYsIGt3KQorICAgIGRlZiBkZWxldGUoc2VsZiwgZmlyc3QsIGxhc3Q9Tm9uZSk6CisgICAgICAgICIiIkRlbGV0ZSB0ZXh0IGZyb20gRklSU1QgdG8gTEFTVCAobm90IGluY2x1ZGVkKS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWxldGUnLCBmaXJzdCwgbGFzdCkKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHRleHQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2dldCcpCisgICAgZGVmIGljdXJzb3Ioc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJJbnNlcnQgY3Vyc29yIGF0IElOREVYLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ljdXJzb3InLCBpbmRleCkKKyAgICBkZWYgaW5kZXgoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gcG9zaXRpb24gb2YgY3Vyc29yLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIHNlbGYuX3csICdpbmRleCcsIGluZGV4KSkKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGluZGV4LCBzdHJpbmcpOgorICAgICAgICAiIiJJbnNlcnQgU1RSSU5HIGF0IElOREVYLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luc2VydCcsIGluZGV4LCBzdHJpbmcpCisgICAgZGVmIHNjYW5fbWFyayhzZWxmLCB4KToKKyAgICAgICAgIiIiUmVtZW1iZXIgdGhlIGN1cnJlbnQgWCwgWSBjb29yZGluYXRlcy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzY2FuJywgJ21hcmsnLCB4KQorICAgIGRlZiBzY2FuX2RyYWd0byhzZWxmLCB4KToKKyAgICAgICAgIiIiQWRqdXN0IHRoZSB2aWV3IG9mIHRoZSBjYW52YXMgdG8gMTAgdGltZXMgdGhlCisgICAgICAgIGRpZmZlcmVuY2UgYmV0d2VlbiBYIGFuZCBZIGFuZCB0aGUgY29vcmRpbmF0ZXMgZ2l2ZW4gaW4KKyAgICAgICAgc2Nhbl9tYXJrLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NjYW4nLCAnZHJhZ3RvJywgeCkKKyAgICBkZWYgc2VsZWN0aW9uX2FkanVzdChzZWxmLCBpbmRleCk6CisgICAgICAgICIiIkFkanVzdCB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gbmVhciB0aGUgY3Vyc29yIHRvIElOREVYLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdGlvbicsICdhZGp1c3QnLCBpbmRleCkKKyAgICBzZWxlY3RfYWRqdXN0ID0gc2VsZWN0aW9uX2FkanVzdAorICAgIGRlZiBzZWxlY3Rpb25fY2xlYXIoc2VsZik6CisgICAgICAgICIiIkNsZWFyIHRoZSBzZWxlY3Rpb24gaWYgaXQgaXMgaW4gdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VsZWN0aW9uJywgJ2NsZWFyJykKKyAgICBzZWxlY3RfY2xlYXIgPSBzZWxlY3Rpb25fY2xlYXIKKyAgICBkZWYgc2VsZWN0aW9uX2Zyb20oc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJTZXQgdGhlIGZpeGVkIGVuZCBvZiBhIHNlbGVjdGlvbiB0byBJTkRFWC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3Rpb24nLCAnZnJvbScsIGluZGV4KQorICAgIHNlbGVjdF9mcm9tID0gc2VsZWN0aW9uX2Zyb20KKyAgICBkZWYgc2VsZWN0aW9uX3ByZXNlbnQoc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZXJlIGFyZSBjaGFyYWN0ZXJzIHNlbGVjdGVkIGluIHRoZSBlbnRyeSwgRmFsc2UKKyAgICAgICAgb3RoZXJ3aXNlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5nZXRib29sZWFuKAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3Rpb24nLCAncHJlc2VudCcpKQorICAgIHNlbGVjdF9wcmVzZW50ID0gc2VsZWN0aW9uX3ByZXNlbnQKKyAgICBkZWYgc2VsZWN0aW9uX3JhbmdlKHNlbGYsIHN0YXJ0LCBlbmQpOgorICAgICAgICAiIiJTZXQgdGhlIHNlbGVjdGlvbiBmcm9tIFNUQVJUIHRvIEVORCAobm90IGluY2x1ZGVkKS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3Rpb24nLCAncmFuZ2UnLCBzdGFydCwgZW5kKQorICAgIHNlbGVjdF9yYW5nZSA9IHNlbGVjdGlvbl9yYW5nZQorICAgIGRlZiBzZWxlY3Rpb25fdG8oc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJTZXQgdGhlIHZhcmlhYmxlIGVuZCBvZiBhIHNlbGVjdGlvbiB0byBJTkRFWC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3Rpb24nLCAndG8nLCBpbmRleCkKKyAgICBzZWxlY3RfdG8gPSBzZWxlY3Rpb25fdG8KKworY2xhc3MgRnJhbWUoV2lkZ2V0KToKKyAgICAiIiJGcmFtZSB3aWRnZXQgd2hpY2ggbWF5IGNvbnRhaW4gb3RoZXIgd2lkZ2V0cyBhbmQgY2FuIGhhdmUgYSAzRCBib3JkZXIuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBmcmFtZSB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBWYWxpZCByZXNvdXJjZSBuYW1lczogYmFja2dyb3VuZCwgYmQsIGJnLCBib3JkZXJ3aWR0aCwgY2xhc3MsCisgICAgICAgIGNvbG9ybWFwLCBjb250YWluZXIsIGN1cnNvciwgaGVpZ2h0LCBoaWdobGlnaHRiYWNrZ3JvdW5kLAorICAgICAgICBoaWdobGlnaHRjb2xvciwgaGlnaGxpZ2h0dGhpY2tuZXNzLCByZWxpZWYsIHRha2Vmb2N1cywgdmlzdWFsLCB3aWR0aC4iIiIKKyAgICAgICAgY25mID0gX2NuZm1lcmdlKChjbmYsIGt3KSkKKyAgICAgICAgZXh0cmEgPSAoKQorICAgICAgICBpZiAnY2xhc3NfJyBpbiBjbmY6CisgICAgICAgICAgICBleHRyYSA9ICgnLWNsYXNzJywgY25mWydjbGFzc18nXSkKKyAgICAgICAgICAgIGRlbCBjbmZbJ2NsYXNzXyddCisgICAgICAgIGVsaWYgJ2NsYXNzJyBpbiBjbmY6CisgICAgICAgICAgICBleHRyYSA9ICgnLWNsYXNzJywgY25mWydjbGFzcyddKQorICAgICAgICAgICAgZGVsIGNuZlsnY2xhc3MnXQorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAnZnJhbWUnLCBjbmYsIHt9LCBleHRyYSkKKworY2xhc3MgTGFiZWwoV2lkZ2V0KToKKyAgICAiIiJMYWJlbCB3aWRnZXQgd2hpY2ggY2FuIGRpc3BsYXkgdGV4dCBhbmQgYml0bWFwcy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIGxhYmVsIHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgYWN0aXZlYmFja2dyb3VuZCwgYWN0aXZlZm9yZWdyb3VuZCwgYW5jaG9yLAorICAgICAgICAgICAgYmFja2dyb3VuZCwgYml0bWFwLCBib3JkZXJ3aWR0aCwgY3Vyc29yLAorICAgICAgICAgICAgZGlzYWJsZWRmb3JlZ3JvdW5kLCBmb250LCBmb3JlZ3JvdW5kLAorICAgICAgICAgICAgaGlnaGxpZ2h0YmFja2dyb3VuZCwgaGlnaGxpZ2h0Y29sb3IsCisgICAgICAgICAgICBoaWdobGlnaHR0aGlja25lc3MsIGltYWdlLCBqdXN0aWZ5LAorICAgICAgICAgICAgcGFkeCwgcGFkeSwgcmVsaWVmLCB0YWtlZm9jdXMsIHRleHQsCisgICAgICAgICAgICB0ZXh0dmFyaWFibGUsIHVuZGVybGluZSwgd3JhcGxlbmd0aAorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGhlaWdodCwgc3RhdGUsIHdpZHRoCisKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdsYWJlbCcsIGNuZiwga3cpCisKK2NsYXNzIExpc3Rib3goV2lkZ2V0LCBYVmlldywgWVZpZXcpOgorICAgICIiIkxpc3Rib3ggd2lkZ2V0IHdoaWNoIGNhbiBkaXNwbGF5IGEgbGlzdCBvZiBzdHJpbmdzLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgbGlzdGJveCB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBWYWxpZCByZXNvdXJjZSBuYW1lczogYmFja2dyb3VuZCwgYmQsIGJnLCBib3JkZXJ3aWR0aCwgY3Vyc29yLAorICAgICAgICBleHBvcnRzZWxlY3Rpb24sIGZnLCBmb250LCBmb3JlZ3JvdW5kLCBoZWlnaHQsIGhpZ2hsaWdodGJhY2tncm91bmQsCisgICAgICAgIGhpZ2hsaWdodGNvbG9yLCBoaWdobGlnaHR0aGlja25lc3MsIHJlbGllZiwgc2VsZWN0YmFja2dyb3VuZCwKKyAgICAgICAgc2VsZWN0Ym9yZGVyd2lkdGgsIHNlbGVjdGZvcmVncm91bmQsIHNlbGVjdG1vZGUsIHNldGdyaWQsIHRha2Vmb2N1cywKKyAgICAgICAgd2lkdGgsIHhzY3JvbGxjb21tYW5kLCB5c2Nyb2xsY29tbWFuZCwgbGlzdHZhcmlhYmxlLiIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAnbGlzdGJveCcsIGNuZiwga3cpCisgICAgZGVmIGFjdGl2YXRlKHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiQWN0aXZhdGUgaXRlbSBpZGVudGlmaWVkIGJ5IElOREVYLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FjdGl2YXRlJywgaW5kZXgpCisgICAgZGVmIGJib3goc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJSZXR1cm4gYSB0dXBsZSBvZiBYMSxZMSxYMixZMiBjb29yZGluYXRlcyBmb3IgYSByZWN0YW5nbGUKKyAgICAgICAgd2hpY2ggZW5jbG9zZXMgdGhlIGl0ZW0gaWRlbnRpZmllZCBieSBpbmRleCBpbiBBUkdTLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2Jib3gnKSArIGFyZ3MpKSBvciBOb25lCisgICAgZGVmIGN1cnNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgaW5kaWNlcyBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbS4iIiIKKyAgICAgICAgIyBYWFggT3VnaHQgdG8gYXBwbHkgc2VsZi5fZ2V0aW50cygpLi4uCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICBzZWxmLl93LCAnY3Vyc2VsZWN0aW9uJykpCisgICAgZGVmIGRlbGV0ZShzZWxmLCBmaXJzdCwgbGFzdD1Ob25lKToKKyAgICAgICAgIiIiRGVsZXRlIGl0ZW1zIGZyb20gRklSU1QgdG8gTEFTVCAobm90IGluY2x1ZGVkKS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWxldGUnLCBmaXJzdCwgbGFzdCkKKyAgICBkZWYgZ2V0KHNlbGYsIGZpcnN0LCBsYXN0PU5vbmUpOgorICAgICAgICAiIiJHZXQgbGlzdCBvZiBpdGVtcyBmcm9tIEZJUlNUIHRvIExBU1QgKG5vdCBpbmNsdWRlZCkuIiIiCisgICAgICAgIGlmIGxhc3Q6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICAgIHNlbGYuX3csICdnZXQnLCBmaXJzdCwgbGFzdCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdnZXQnLCBmaXJzdCkKKyAgICBkZWYgaW5kZXgoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gaW5kZXggb2YgaXRlbSBpZGVudGlmaWVkIHdpdGggSU5ERVguIiIiCisgICAgICAgIGkgPSBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZGV4JywgaW5kZXgpCisgICAgICAgIGlmIGkgPT0gJ25vbmUnOiByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gZ2V0aW50KGkpCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgKmVsZW1lbnRzKToKKyAgICAgICAgIiIiSW5zZXJ0IEVMRU1FTlRTIGF0IElOREVYLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdpbnNlcnQnLCBpbmRleCkgKyBlbGVtZW50cykKKyAgICBkZWYgbmVhcmVzdChzZWxmLCB5KToKKyAgICAgICAgIiIiR2V0IGluZGV4IG9mIGl0ZW0gd2hpY2ggaXMgbmVhcmVzdCB0byB5IGNvb3JkaW5hdGUgWS4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludChzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICBzZWxmLl93LCAnbmVhcmVzdCcsIHkpKQorICAgIGRlZiBzY2FuX21hcmsoc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlJlbWVtYmVyIHRoZSBjdXJyZW50IFgsIFkgY29vcmRpbmF0ZXMuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2NhbicsICdtYXJrJywgeCwgeSkKKyAgICBkZWYgc2Nhbl9kcmFndG8oc2VsZiwgeCwgeSk6CisgICAgICAgICIiIkFkanVzdCB0aGUgdmlldyBvZiB0aGUgbGlzdGJveCB0byAxMCB0aW1lcyB0aGUKKyAgICAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIFggYW5kIFkgYW5kIHRoZSBjb29yZGluYXRlcyBnaXZlbiBpbgorICAgICAgICBzY2FuX21hcmsuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2NhbicsICdkcmFndG8nLCB4LCB5KQorICAgIGRlZiBzZWUoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJTY3JvbGwgc3VjaCB0aGF0IElOREVYIGlzIHZpc2libGUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VlJywgaW5kZXgpCisgICAgZGVmIHNlbGVjdGlvbl9hbmNob3Ioc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJTZXQgdGhlIGZpeGVkIGVuZCBvZnQgdGhlIHNlbGVjdGlvbiB0byBJTkRFWC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3Rpb24nLCAnYW5jaG9yJywgaW5kZXgpCisgICAgc2VsZWN0X2FuY2hvciA9IHNlbGVjdGlvbl9hbmNob3IKKyAgICBkZWYgc2VsZWN0aW9uX2NsZWFyKHNlbGYsIGZpcnN0LCBsYXN0PU5vbmUpOgorICAgICAgICAiIiJDbGVhciB0aGUgc2VsZWN0aW9uIGZyb20gRklSU1QgdG8gTEFTVCAobm90IGluY2x1ZGVkKS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csCisgICAgICAgICAgICAgICAgICdzZWxlY3Rpb24nLCAnY2xlYXInLCBmaXJzdCwgbGFzdCkKKyAgICBzZWxlY3RfY2xlYXIgPSBzZWxlY3Rpb25fY2xlYXIKKyAgICBkZWYgc2VsZWN0aW9uX2luY2x1ZGVzKHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiUmV0dXJuIDEgaWYgSU5ERVggaXMgcGFydCBvZiB0aGUgc2VsZWN0aW9uLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5nZXRib29sZWFuKHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIHNlbGYuX3csICdzZWxlY3Rpb24nLCAnaW5jbHVkZXMnLCBpbmRleCkpCisgICAgc2VsZWN0X2luY2x1ZGVzID0gc2VsZWN0aW9uX2luY2x1ZGVzCisgICAgZGVmIHNlbGVjdGlvbl9zZXQoc2VsZiwgZmlyc3QsIGxhc3Q9Tm9uZSk6CisgICAgICAgICIiIlNldCB0aGUgc2VsZWN0aW9uIGZyb20gRklSU1QgdG8gTEFTVCAobm90IGluY2x1ZGVkKSB3aXRob3V0CisgICAgICAgIGNoYW5naW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudHMuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VsZWN0aW9uJywgJ3NldCcsIGZpcnN0LCBsYXN0KQorICAgIHNlbGVjdF9zZXQgPSBzZWxlY3Rpb25fc2V0CisgICAgZGVmIHNpemUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBsaXN0Ym94LiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2l6ZScpKQorICAgIGRlZiBpdGVtY2dldChzZWxmLCBpbmRleCwgb3B0aW9uKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSByZXNvdXJjZSB2YWx1ZSBmb3IgYW4gSVRFTSBhbmQgYW4gT1BUSU9OLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgKHNlbGYuX3csICdpdGVtY2dldCcpICsgKGluZGV4LCAnLScrb3B0aW9uKSkKKyAgICBkZWYgaXRlbWNvbmZpZ3VyZShzZWxmLCBpbmRleCwgY25mPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25maWd1cmUgcmVzb3VyY2VzIG9mIGFuIElURU0uCisKKyAgICAgICAgVGhlIHZhbHVlcyBmb3IgcmVzb3VyY2VzIGFyZSBzcGVjaWZpZWQgYXMga2V5d29yZCBhcmd1bWVudHMuCisgICAgICAgIFRvIGdldCBhbiBvdmVydmlldyBhYm91dCB0aGUgYWxsb3dlZCBrZXl3b3JkIGFyZ3VtZW50cworICAgICAgICBjYWxsIHRoZSBtZXRob2Qgd2l0aG91dCBhcmd1bWVudHMuCisgICAgICAgIFZhbGlkIHJlc291cmNlIG5hbWVzOiBiYWNrZ3JvdW5kLCBiZywgZm9yZWdyb3VuZCwgZmcsCisgICAgICAgIHNlbGVjdGJhY2tncm91bmQsIHNlbGVjdGZvcmVncm91bmQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jb25maWd1cmUoKCdpdGVtY29uZmlndXJlJywgaW5kZXgpLCBjbmYsIGt3KQorICAgIGl0ZW1jb25maWcgPSBpdGVtY29uZmlndXJlCisKK2NsYXNzIE1lbnUoV2lkZ2V0KToKKyAgICAiIiJNZW51IHdpZGdldCB3aGljaCBhbGxvd3MgdG8gZGlzcGxheSBtZW51IGJhcnMsIHB1bGwtZG93biBtZW51cyBhbmQgcG9wLXVwIG1lbnVzLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IG1lbnUgd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBNQVNURVIuCisKKyAgICAgICAgVmFsaWQgcmVzb3VyY2UgbmFtZXM6IGFjdGl2ZWJhY2tncm91bmQsIGFjdGl2ZWJvcmRlcndpZHRoLAorICAgICAgICBhY3RpdmVmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kLCBiZCwgYmcsIGJvcmRlcndpZHRoLCBjdXJzb3IsCisgICAgICAgIGRpc2FibGVkZm9yZWdyb3VuZCwgZmcsIGZvbnQsIGZvcmVncm91bmQsIHBvc3Rjb21tYW5kLCByZWxpZWYsCisgICAgICAgIHNlbGVjdGNvbG9yLCB0YWtlZm9jdXMsIHRlYXJvZmYsIHRlYXJvZmZjb21tYW5kLCB0aXRsZSwgdHlwZS4iIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ21lbnUnLCBjbmYsIGt3KQorICAgIGRlZiB0a19iaW5kRm9yVHJhdmVyc2FsKHNlbGYpOgorICAgICAgICBwYXNzICMgb2Jzb2xldGUgc2luY2UgVGsgNC4wCisgICAgZGVmIHRrX21iUG9zdChzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a19tYlBvc3QnLCBzZWxmLl93KQorICAgIGRlZiB0a19tYlVucG9zdChzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a19tYlVucG9zdCcpCisgICAgZGVmIHRrX3RyYXZlcnNlVG9NZW51KHNlbGYsIGNoYXIpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX3RyYXZlcnNlVG9NZW51Jywgc2VsZi5fdywgY2hhcikKKyAgICBkZWYgdGtfdHJhdmVyc2VXaXRoaW5NZW51KHNlbGYsIGNoYXIpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX3RyYXZlcnNlV2l0aGluTWVudScsIHNlbGYuX3csIGNoYXIpCisgICAgZGVmIHRrX2dldE1lbnVCdXR0b25zKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd0a19nZXRNZW51QnV0dG9ucycsIHNlbGYuX3cpCisgICAgZGVmIHRrX25leHRNZW51KHNlbGYsIGNvdW50KToKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a19uZXh0TWVudScsIGNvdW50KQorICAgIGRlZiB0a19uZXh0TWVudUVudHJ5KHNlbGYsIGNvdW50KToKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a19uZXh0TWVudUVudHJ5JywgY291bnQpCisgICAgZGVmIHRrX2ludm9rZU1lbnUoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGtfaW52b2tlTWVudScsIHNlbGYuX3cpCisgICAgZGVmIHRrX2ZpcnN0TWVudShzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a19maXJzdE1lbnUnLCBzZWxmLl93KQorICAgIGRlZiB0a19tYkJ1dHRvbkRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGtfbWJCdXR0b25Eb3duJywgc2VsZi5fdykKKyAgICBkZWYgdGtfcG9wdXAoc2VsZiwgeCwgeSwgZW50cnk9IiIpOgorICAgICAgICAiIiJQb3N0IHRoZSBtZW51IGF0IHBvc2l0aW9uIFgsWSB3aXRoIGVudHJ5IEVOVFJZLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX3BvcHVwJywgc2VsZi5fdywgeCwgeSwgZW50cnkpCisgICAgZGVmIGFjdGl2YXRlKHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiQWN0aXZhdGUgZW50cnkgYXQgSU5ERVguIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYWN0aXZhdGUnLCBpbmRleCkKKyAgICBkZWYgYWRkKHNlbGYsIGl0ZW1UeXBlLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnYWRkJywgaXRlbVR5cGUpICsKKyAgICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKyAgICBkZWYgYWRkX2Nhc2NhZGUoc2VsZiwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQWRkIGhpZXJhcmNoaWNhbCBtZW51IGl0ZW0uIiIiCisgICAgICAgIHNlbGYuYWRkKCdjYXNjYWRlJywgY25mIG9yIGt3KQorICAgIGRlZiBhZGRfY2hlY2tidXR0b24oc2VsZiwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQWRkIGNoZWNrYnV0dG9uIG1lbnUgaXRlbS4iIiIKKyAgICAgICAgc2VsZi5hZGQoJ2NoZWNrYnV0dG9uJywgY25mIG9yIGt3KQorICAgIGRlZiBhZGRfY29tbWFuZChzZWxmLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJBZGQgY29tbWFuZCBtZW51IGl0ZW0uIiIiCisgICAgICAgIHNlbGYuYWRkKCdjb21tYW5kJywgY25mIG9yIGt3KQorICAgIGRlZiBhZGRfcmFkaW9idXR0b24oc2VsZiwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQWRkZCByYWRpbyBtZW51IGl0ZW0uIiIiCisgICAgICAgIHNlbGYuYWRkKCdyYWRpb2J1dHRvbicsIGNuZiBvciBrdykKKyAgICBkZWYgYWRkX3NlcGFyYXRvcihzZWxmLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJBZGQgc2VwYXJhdG9yLiIiIgorICAgICAgICBzZWxmLmFkZCgnc2VwYXJhdG9yJywgY25mIG9yIGt3KQorICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIGl0ZW1UeXBlLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnaW5zZXJ0JywgaW5kZXgsIGl0ZW1UeXBlKSArCisgICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgZGVmIGluc2VydF9jYXNjYWRlKHNlbGYsIGluZGV4LCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJBZGQgaGllcmFyY2hpY2FsIG1lbnUgaXRlbSBhdCBJTkRFWC4iIiIKKyAgICAgICAgc2VsZi5pbnNlcnQoaW5kZXgsICdjYXNjYWRlJywgY25mIG9yIGt3KQorICAgIGRlZiBpbnNlcnRfY2hlY2tidXR0b24oc2VsZiwgaW5kZXgsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkFkZCBjaGVja2J1dHRvbiBtZW51IGl0ZW0gYXQgSU5ERVguIiIiCisgICAgICAgIHNlbGYuaW5zZXJ0KGluZGV4LCAnY2hlY2tidXR0b24nLCBjbmYgb3Iga3cpCisgICAgZGVmIGluc2VydF9jb21tYW5kKHNlbGYsIGluZGV4LCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJBZGQgY29tbWFuZCBtZW51IGl0ZW0gYXQgSU5ERVguIiIiCisgICAgICAgIHNlbGYuaW5zZXJ0KGluZGV4LCAnY29tbWFuZCcsIGNuZiBvciBrdykKKyAgICBkZWYgaW5zZXJ0X3JhZGlvYnV0dG9uKHNlbGYsIGluZGV4LCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJBZGRkIHJhZGlvIG1lbnUgaXRlbSBhdCBJTkRFWC4iIiIKKyAgICAgICAgc2VsZi5pbnNlcnQoaW5kZXgsICdyYWRpb2J1dHRvbicsIGNuZiBvciBrdykKKyAgICBkZWYgaW5zZXJ0X3NlcGFyYXRvcihzZWxmLCBpbmRleCwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQWRkIHNlcGFyYXRvciBhdCBJTkRFWC4iIiIKKyAgICAgICAgc2VsZi5pbnNlcnQoaW5kZXgsICdzZXBhcmF0b3InLCBjbmYgb3Iga3cpCisgICAgZGVmIGRlbGV0ZShzZWxmLCBpbmRleDEsIGluZGV4Mj1Ob25lKToKKyAgICAgICAgIiIiRGVsZXRlIG1lbnUgaXRlbXMgYmV0d2VlbiBJTkRFWDEgYW5kIElOREVYMiAoaW5jbHVkZWQpLiIiIgorICAgICAgICBpZiBpbmRleDIgaXMgTm9uZToKKyAgICAgICAgICAgIGluZGV4MiA9IGluZGV4MQorCisgICAgICAgIG51bV9pbmRleDEsIG51bV9pbmRleDIgPSBzZWxmLmluZGV4KGluZGV4MSksIHNlbGYuaW5kZXgoaW5kZXgyKQorICAgICAgICBpZiAobnVtX2luZGV4MSBpcyBOb25lKSBvciAobnVtX2luZGV4MiBpcyBOb25lKToKKyAgICAgICAgICAgIG51bV9pbmRleDEsIG51bV9pbmRleDIgPSAwLCAtMQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKG51bV9pbmRleDEsIG51bV9pbmRleDIgKyAxKToKKyAgICAgICAgICAgIGlmICdjb21tYW5kJyBpbiBzZWxmLmVudHJ5Y29uZmlnKGkpOgorICAgICAgICAgICAgICAgIGMgPSBzdHIoc2VsZi5lbnRyeWNnZXQoaSwgJ2NvbW1hbmQnKSkKKyAgICAgICAgICAgICAgICBpZiBjOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZWNvbW1hbmQoYykKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWxldGUnLCBpbmRleDEsIGluZGV4MikKKyAgICBkZWYgZW50cnljZ2V0KHNlbGYsIGluZGV4LCBvcHRpb24pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHJlc291cmNlIHZhbHVlIG9mIGFuIG1lbnUgaXRlbSBmb3IgT1BUSU9OIGF0IElOREVYLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdlbnRyeWNnZXQnLCBpbmRleCwgJy0nICsgb3B0aW9uKQorICAgIGRlZiBlbnRyeWNvbmZpZ3VyZShzZWxmLCBpbmRleCwgY25mPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25maWd1cmUgYSBtZW51IGl0ZW0gYXQgSU5ERVguIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jb25maWd1cmUoKCdlbnRyeWNvbmZpZ3VyZScsIGluZGV4KSwgY25mLCBrdykKKyAgICBlbnRyeWNvbmZpZyA9IGVudHJ5Y29uZmlndXJlCisgICAgZGVmIGluZGV4KHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBpbmRleCBvZiBhIG1lbnUgaXRlbSBpZGVudGlmaWVkIGJ5IElOREVYLiIiIgorICAgICAgICBpID0gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmRleCcsIGluZGV4KQorICAgICAgICBpZiBpID09ICdub25lJzogcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIGdldGludChpKQorICAgIGRlZiBpbnZva2Uoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJJbnZva2UgYSBtZW51IGl0ZW0gaWRlbnRpZmllZCBieSBJTkRFWCBhbmQgZXhlY3V0ZQorICAgICAgICB0aGUgYXNzb2NpYXRlZCBjb21tYW5kLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnZva2UnLCBpbmRleCkKKyAgICBkZWYgcG9zdChzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiRGlzcGxheSBhIG1lbnUgYXQgcG9zaXRpb24gWCxZLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3Bvc3QnLCB4LCB5KQorICAgIGRlZiB0eXBlKHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBtZW51IGl0ZW0gYXQgSU5ERVguIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3R5cGUnLCBpbmRleCkKKyAgICBkZWYgdW5wb3N0KHNlbGYpOgorICAgICAgICAiIiJVbm1hcCBhIG1lbnUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAndW5wb3N0JykKKyAgICBkZWYgeXBvc2l0aW9uKHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB5LXBvc2l0aW9uIG9mIHRoZSB0b3Btb3N0IHBpeGVsIG9mIHRoZSBtZW51IGl0ZW0gYXQgSU5ERVguIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgc2VsZi5fdywgJ3lwb3NpdGlvbicsIGluZGV4KSkKKworY2xhc3MgTWVudWJ1dHRvbihXaWRnZXQpOgorICAgICIiIk1lbnVidXR0b24gd2lkZ2V0LCBvYnNvbGV0ZSBzaW5jZSBUazguMC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdtZW51YnV0dG9uJywgY25mLCBrdykKKworY2xhc3MgTWVzc2FnZShXaWRnZXQpOgorICAgICIiIk1lc3NhZ2Ugd2lkZ2V0IHRvIGRpc3BsYXkgbXVsdGlsaW5lIHRleHQuIE9ic29sZXRlIHNpbmNlIExhYmVsIGRvZXMgaXQgdG9vLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ21lc3NhZ2UnLCBjbmYsIGt3KQorCitjbGFzcyBSYWRpb2J1dHRvbihXaWRnZXQpOgorICAgICIiIlJhZGlvYnV0dG9uIHdpZGdldCB3aGljaCBzaG93cyBvbmx5IG9uZSBvZiBzZXZlcmFsIGJ1dHRvbnMgaW4gb24tc3RhdGUuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSByYWRpb2J1dHRvbiB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBWYWxpZCByZXNvdXJjZSBuYW1lczogYWN0aXZlYmFja2dyb3VuZCwgYWN0aXZlZm9yZWdyb3VuZCwgYW5jaG9yLAorICAgICAgICBiYWNrZ3JvdW5kLCBiZCwgYmcsIGJpdG1hcCwgYm9yZGVyd2lkdGgsIGNvbW1hbmQsIGN1cnNvciwKKyAgICAgICAgZGlzYWJsZWRmb3JlZ3JvdW5kLCBmZywgZm9udCwgZm9yZWdyb3VuZCwgaGVpZ2h0LAorICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kLCBoaWdobGlnaHRjb2xvciwgaGlnaGxpZ2h0dGhpY2tuZXNzLCBpbWFnZSwKKyAgICAgICAgaW5kaWNhdG9yb24sIGp1c3RpZnksIHBhZHgsIHBhZHksIHJlbGllZiwgc2VsZWN0Y29sb3IsIHNlbGVjdGltYWdlLAorICAgICAgICBzdGF0ZSwgdGFrZWZvY3VzLCB0ZXh0LCB0ZXh0dmFyaWFibGUsIHVuZGVybGluZSwgdmFsdWUsIHZhcmlhYmxlLAorICAgICAgICB3aWR0aCwgd3JhcGxlbmd0aC4iIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3JhZGlvYnV0dG9uJywgY25mLCBrdykKKyAgICBkZWYgZGVzZWxlY3Qoc2VsZik6CisgICAgICAgICIiIlB1dCB0aGUgYnV0dG9uIGluIG9mZi1zdGF0ZS4iIiIKKworICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2Rlc2VsZWN0JykKKyAgICBkZWYgZmxhc2goc2VsZik6CisgICAgICAgICIiIkZsYXNoIHRoZSBidXR0b24uIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZmxhc2gnKQorICAgIGRlZiBpbnZva2Uoc2VsZik6CisgICAgICAgICIiIlRvZ2dsZSB0aGUgYnV0dG9uIGFuZCBpbnZva2UgYSBjb21tYW5kIGlmIGdpdmVuIGFzIHJlc291cmNlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnZva2UnKQorICAgIGRlZiBzZWxlY3Qoc2VsZik6CisgICAgICAgICIiIlB1dCB0aGUgYnV0dG9uIGluIG9uLXN0YXRlLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdCcpCisKK2NsYXNzIFNjYWxlKFdpZGdldCk6CisgICAgIiIiU2NhbGUgd2lkZ2V0IHdoaWNoIGNhbiBkaXNwbGF5IGEgbnVtZXJpY2FsIHNjYWxlLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgc2NhbGUgd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBNQVNURVIuCisKKyAgICAgICAgVmFsaWQgcmVzb3VyY2UgbmFtZXM6IGFjdGl2ZWJhY2tncm91bmQsIGJhY2tncm91bmQsIGJpZ2luY3JlbWVudCwgYmQsCisgICAgICAgIGJnLCBib3JkZXJ3aWR0aCwgY29tbWFuZCwgY3Vyc29yLCBkaWdpdHMsIGZnLCBmb250LCBmb3JlZ3JvdW5kLCBmcm9tLAorICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kLCBoaWdobGlnaHRjb2xvciwgaGlnaGxpZ2h0dGhpY2tuZXNzLCBsYWJlbCwKKyAgICAgICAgbGVuZ3RoLCBvcmllbnQsIHJlbGllZiwgcmVwZWF0ZGVsYXksIHJlcGVhdGludGVydmFsLCByZXNvbHV0aW9uLAorICAgICAgICBzaG93dmFsdWUsIHNsaWRlcmxlbmd0aCwgc2xpZGVycmVsaWVmLCBzdGF0ZSwgdGFrZWZvY3VzLAorICAgICAgICB0aWNraW50ZXJ2YWwsIHRvLCB0cm91Z2hjb2xvciwgdmFyaWFibGUsIHdpZHRoLiIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAnc2NhbGUnLCBjbmYsIGt3KQorICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgY3VycmVudCB2YWx1ZSBhcyBpbnRlZ2VyIG9yIGZsb2F0LiIiIgorICAgICAgICB2YWx1ZSA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAnZ2V0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGdldGludCh2YWx1ZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gZ2V0ZG91YmxlKHZhbHVlKQorICAgIGRlZiBzZXQoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiJTZXQgdGhlIHZhbHVlIHRvIFZBTFVFLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NldCcsIHZhbHVlKQorICAgIGRlZiBjb29yZHMoc2VsZiwgdmFsdWU9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIHR1cGxlIChYLFkpIG9mIHRoZSBwb2ludCBhbG9uZyB0aGUgY2VudGVybGluZSBvZiB0aGUKKyAgICAgICAgdHJvdWdoIHRoYXQgY29ycmVzcG9uZHMgdG8gVkFMVUUgb3IgdGhlIGN1cnJlbnQgdmFsdWUgaWYgTm9uZSBpcworICAgICAgICBnaXZlbi4iIiIKKworICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cyhzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2Nvb3JkcycsIHZhbHVlKSkKKyAgICBkZWYgaWRlbnRpZnkoc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlJldHVybiB3aGVyZSB0aGUgcG9pbnQgWCxZIGxpZXMuIFZhbGlkIHJldHVybiB2YWx1ZXMgYXJlICJzbGlkZXIiLAorICAgICAgICAidGhvdWdoMSIgYW5kICJ0aG91Z2gyIi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaWRlbnRpZnknLCB4LCB5KQorCitjbGFzcyBTY3JvbGxiYXIoV2lkZ2V0KToKKyAgICAiIiJTY3JvbGxiYXIgd2lkZ2V0IHdoaWNoIGRpc3BsYXlzIGEgc2xpZGVyIGF0IGEgY2VydGFpbiBwb3NpdGlvbi4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIHNjcm9sbGJhciB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBWYWxpZCByZXNvdXJjZSBuYW1lczogYWN0aXZlYmFja2dyb3VuZCwgYWN0aXZlcmVsaWVmLAorICAgICAgICBiYWNrZ3JvdW5kLCBiZCwgYmcsIGJvcmRlcndpZHRoLCBjb21tYW5kLCBjdXJzb3IsCisgICAgICAgIGVsZW1lbnRib3JkZXJ3aWR0aCwgaGlnaGxpZ2h0YmFja2dyb3VuZCwKKyAgICAgICAgaGlnaGxpZ2h0Y29sb3IsIGhpZ2hsaWdodHRoaWNrbmVzcywganVtcCwgb3JpZW50LAorICAgICAgICByZWxpZWYsIHJlcGVhdGRlbGF5LCByZXBlYXRpbnRlcnZhbCwgdGFrZWZvY3VzLAorICAgICAgICB0cm91Z2hjb2xvciwgd2lkdGguIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdzY3JvbGxiYXInLCBjbmYsIGt3KQorICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBpbmRleCk6CisgICAgICAgICIiIkRpc3BsYXkgdGhlIGVsZW1lbnQgYXQgSU5ERVggd2l0aCBhY3RpdmViYWNrZ3JvdW5kIGFuZCBhY3RpdmVyZWxpZWYuCisgICAgICAgIElOREVYIGNhbiBiZSAiYXJyb3cxIiwic2xpZGVyIiBvciAiYXJyb3cyIi4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdhY3RpdmF0ZScsIGluZGV4KQorICAgIGRlZiBkZWx0YShzZWxmLCBkZWx0YXgsIGRlbHRheSk6CisgICAgICAgICIiIlJldHVybiB0aGUgZnJhY3Rpb25hbCBjaGFuZ2Ugb2YgdGhlIHNjcm9sbGJhciBzZXR0aW5nIGlmIGl0CisgICAgICAgIHdvdWxkIGJlIG1vdmVkIGJ5IERFTFRBWCBvciBERUxUQVkgcGl4ZWxzLiIiIgorICAgICAgICByZXR1cm4gZ2V0ZG91YmxlKAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWx0YScsIGRlbHRheCwgZGVsdGF5KSkKKyAgICBkZWYgZnJhY3Rpb24oc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlJldHVybiB0aGUgZnJhY3Rpb25hbCB2YWx1ZSB3aGljaCBjb3JyZXNwb25kcyB0byBhIHNsaWRlcgorICAgICAgICBwb3NpdGlvbiBvZiBYLFkuIiIiCisgICAgICAgIHJldHVybiBnZXRkb3VibGUoc2VsZi50ay5jYWxsKHNlbGYuX3csICdmcmFjdGlvbicsIHgsIHkpKQorICAgIGRlZiBpZGVudGlmeShzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBlbGVtZW50IHVuZGVyIHBvc2l0aW9uIFgsWSBhcyBvbmUgb2YKKyAgICAgICAgImFycm93MSIsInNsaWRlciIsImFycm93MiIgb3IgIiIuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2lkZW50aWZ5JywgeCwgeSkKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZnJhY3Rpb25hbCB2YWx1ZXMgKHVwcGVyIGFuZCBsb3dlciBlbmQpCisgICAgICAgIG9mIHRoZSBzbGlkZXIgcG9zaXRpb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRkb3VibGVzKHNlbGYudGsuY2FsbChzZWxmLl93LCAnZ2V0JykpCisgICAgZGVmIHNldChzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlNldCB0aGUgZnJhY3Rpb25hbCB2YWx1ZXMgb2YgdGhlIHNsaWRlciBwb3NpdGlvbiAodXBwZXIgYW5kCisgICAgICAgIGxvd2VyIGVuZHMgYXMgdmFsdWUgYmV0d2VlbiAwIGFuZCAxKS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnc2V0JykgKyBhcmdzKQorCisKKworY2xhc3MgVGV4dChXaWRnZXQsIFhWaWV3LCBZVmlldyk6CisgICAgIiIiVGV4dCB3aWRnZXQgd2hpY2ggY2FuIGRpc3BsYXkgdGV4dCBpbiB2YXJpb3VzIGZvcm1zLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgdGV4dCB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGJhY2tncm91bmQsIGJvcmRlcndpZHRoLCBjdXJzb3IsCisgICAgICAgICAgICBleHBvcnRzZWxlY3Rpb24sIGZvbnQsIGZvcmVncm91bmQsCisgICAgICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kLCBoaWdobGlnaHRjb2xvciwKKyAgICAgICAgICAgIGhpZ2hsaWdodHRoaWNrbmVzcywgaW5zZXJ0YmFja2dyb3VuZCwKKyAgICAgICAgICAgIGluc2VydGJvcmRlcndpZHRoLCBpbnNlcnRvZmZ0aW1lLAorICAgICAgICAgICAgaW5zZXJ0b250aW1lLCBpbnNlcnR3aWR0aCwgcGFkeCwgcGFkeSwKKyAgICAgICAgICAgIHJlbGllZiwgc2VsZWN0YmFja2dyb3VuZCwKKyAgICAgICAgICAgIHNlbGVjdGJvcmRlcndpZHRoLCBzZWxlY3Rmb3JlZ3JvdW5kLAorICAgICAgICAgICAgc2V0Z3JpZCwgdGFrZWZvY3VzLAorICAgICAgICAgICAgeHNjcm9sbGNvbW1hbmQsIHlzY3JvbGxjb21tYW5kLAorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGF1dG9zZXBhcmF0b3JzLCBoZWlnaHQsIG1heHVuZG8sCisgICAgICAgICAgICBzcGFjaW5nMSwgc3BhY2luZzIsIHNwYWNpbmczLAorICAgICAgICAgICAgc3RhdGUsIHRhYnMsIHVuZG8sIHdpZHRoLCB3cmFwLAorCisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGV4dCcsIGNuZiwga3cpCisgICAgZGVmIGJib3goc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJSZXR1cm4gYSB0dXBsZSBvZiAoeCx5LHdpZHRoLGhlaWdodCkgd2hpY2ggZ2l2ZXMgdGhlIGJvdW5kaW5nCisgICAgICAgIGJveCBvZiB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZSBjaGFyYWN0ZXIgYXQgdGhlIGluZGV4IGluIEFSR1MuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnYmJveCcpICsgYXJncykpIG9yIE5vbmUKKyAgICBkZWYgdGtfdGV4dFNlbGVjdFRvKHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a190ZXh0U2VsZWN0VG8nLCBzZWxmLl93LCBpbmRleCkKKyAgICBkZWYgdGtfdGV4dEJhY2tzcGFjZShzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a190ZXh0QmFja3NwYWNlJywgc2VsZi5fdykKKyAgICBkZWYgdGtfdGV4dEluZGV4Q2xvc2VyKHNlbGYsIGEsIGIsIGMpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX3RleHRJbmRleENsb3NlcicsIHNlbGYuX3csIGEsIGIsIGMpCisgICAgZGVmIHRrX3RleHRSZXNldEFuY2hvcihzZWxmLCBpbmRleCk6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGtfdGV4dFJlc2V0QW5jaG9yJywgc2VsZi5fdywgaW5kZXgpCisgICAgZGVmIGNvbXBhcmUoc2VsZiwgaW5kZXgxLCBvcCwgaW5kZXgyKToKKyAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgYmV0d2VlbiBpbmRleCBJTkRFWDEgYW5kIGluZGV4IElOREVYMiB0aGUKKyAgICAgICAgcmVsYXRpb24gT1AgaXMgc2F0aXNmaWVkLiBPUCBpcyBvbmUgb2YgPCwgPD0sID09LCA+PSwgPiwgb3IgIT0uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmdldGJvb2xlYW4oc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgc2VsZi5fdywgJ2NvbXBhcmUnLCBpbmRleDEsIG9wLCBpbmRleDIpKQorICAgIGRlZiBkZWJ1ZyhzZWxmLCBib29sZWFuPU5vbmUpOgorICAgICAgICAiIiJUdXJuIG9uIHRoZSBpbnRlcm5hbCBjb25zaXN0ZW5jeSBjaGVja3Mgb2YgdGhlIEItVHJlZSBpbnNpZGUgdGhlIHRleHQKKyAgICAgICAgd2lkZ2V0IGFjY29yZGluZyB0byBCT09MRUFOLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5nZXRib29sZWFuKHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIHNlbGYuX3csICdkZWJ1ZycsIGJvb2xlYW4pKQorICAgIGRlZiBkZWxldGUoc2VsZiwgaW5kZXgxLCBpbmRleDI9Tm9uZSk6CisgICAgICAgICIiIkRlbGV0ZSB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIElOREVYMSBhbmQgSU5ERVgyIChub3QgaW5jbHVkZWQpLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlbGV0ZScsIGluZGV4MSwgaW5kZXgyKQorICAgIGRlZiBkbGluZWluZm8oc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gdHVwbGUgKHgseSx3aWR0aCxoZWlnaHQsYmFzZWxpbmUpIGdpdmluZyB0aGUgYm91bmRpbmcgYm94CisgICAgICAgIGFuZCBiYXNlbGluZSBwb3NpdGlvbiBvZiB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZSBsaW5lIGNvbnRhaW5pbmcKKyAgICAgICAgdGhlIGNoYXJhY3RlciBhdCBJTkRFWC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKHNlbGYuX3csICdkbGluZWluZm8nLCBpbmRleCkpCisgICAgZGVmIGR1bXAoc2VsZiwgaW5kZXgxLCBpbmRleDI9Tm9uZSwgY29tbWFuZD1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUgd2lkZ2V0IGJldHdlZW4gaW5kZXgxIGFuZCBpbmRleDIuCisKKyAgICAgICAgVGhlIHR5cGUgb2YgY29udGVudHMgcmV0dXJuZWQgaW4gZmlsdGVyZWQgYmFzZWQgb24gdGhlIGtleXdvcmQKKyAgICAgICAgcGFyYW1ldGVyczsgaWYgJ2FsbCcsICdpbWFnZScsICdtYXJrJywgJ3RhZycsICd0ZXh0Jywgb3IgJ3dpbmRvdycgYXJlCisgICAgICAgIGdpdmVuIGFuZCB0cnVlLCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW1zIGFyZSByZXR1cm5lZC4gVGhlIHJlc3VsdAorICAgICAgICBpcyBhIGxpc3Qgb2YgdHJpcGxlcyBvZiB0aGUgZm9ybSAoa2V5LCB2YWx1ZSwgaW5kZXgpLiBJZiBub25lIG9mIHRoZQorICAgICAgICBrZXl3b3JkcyBhcmUgdHJ1ZSB0aGVuICdhbGwnIGlzIHVzZWQgYnkgZGVmYXVsdC4KKworICAgICAgICBJZiB0aGUgJ2NvbW1hbmQnIGFyZ3VtZW50IGlzIGdpdmVuLCBpdCBpcyBjYWxsZWQgb25jZSBmb3IgZWFjaCBlbGVtZW50CisgICAgICAgIG9mIHRoZSBsaXN0IG9mIHRyaXBsZXMsIHdpdGggdGhlIHZhbHVlcyBvZiBlYWNoIHRyaXBsZSBzZXJ2aW5nIGFzIHRoZQorICAgICAgICBhcmd1bWVudHMgdG8gdGhlIGZ1bmN0aW9uLiBJbiB0aGlzIGNhc2UgdGhlIGxpc3QgaXMgbm90IHJldHVybmVkLiIiIgorICAgICAgICBhcmdzID0gW10KKyAgICAgICAgZnVuY19uYW1lID0gTm9uZQorICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgIGlmIG5vdCBjb21tYW5kOgorICAgICAgICAgICAgIyBOZXZlciBjYWxsIHRoZSBkdW1wIGNvbW1hbmQgd2l0aG91dCB0aGUgLWNvbW1hbmQgZmxhZywgc2luY2UgdGhlCisgICAgICAgICAgICAjIG91dHB1dCBjb3VsZCBpbnZvbHZlIFRjbCBxdW90aW5nIGFuZCB3b3VsZCBiZSBhIHBhaW4gdG8gcGFyc2UKKyAgICAgICAgICAgICMgcmlnaHQuIEluc3RlYWQganVzdCBzZXQgdGhlIGNvbW1hbmQgdG8gYnVpbGQgYSBsaXN0IG9mIHRyaXBsZXMKKyAgICAgICAgICAgICMgYXMgaWYgd2UgaGFkIGRvbmUgdGhlIHBhcnNpbmcuCisgICAgICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICAgICAgZGVmIGFwcGVuZF90cmlwbGUoa2V5LCB2YWx1ZSwgaW5kZXgsIHJlc3VsdD1yZXN1bHQpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKGtleSwgdmFsdWUsIGluZGV4KSkKKyAgICAgICAgICAgIGNvbW1hbmQgPSBhcHBlbmRfdHJpcGxlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvbW1hbmQsIHN0cik6CisgICAgICAgICAgICAgICAgZnVuY19uYW1lID0gY29tbWFuZCA9IHNlbGYuX3JlZ2lzdGVyKGNvbW1hbmQpCisgICAgICAgICAgICBhcmdzICs9IFsiLWNvbW1hbmQiLCBjb21tYW5kXQorICAgICAgICAgICAgZm9yIGtleSBpbiBrdzoKKyAgICAgICAgICAgICAgICBpZiBrd1trZXldOiBhcmdzLmFwcGVuZCgiLSIgKyBrZXkpCisgICAgICAgICAgICBhcmdzLmFwcGVuZChpbmRleDEpCisgICAgICAgICAgICBpZiBpbmRleDI6CisgICAgICAgICAgICAgICAgYXJncy5hcHBlbmQoaW5kZXgyKQorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJkdW1wIiwgKmFyZ3MpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBmdW5jX25hbWU6CisgICAgICAgICAgICAgICAgc2VsZi5kZWxldGVjb21tYW5kKGZ1bmNfbmFtZSkKKworICAgICMjIG5ldyBpbiB0azguNAorICAgIGRlZiBlZGl0KHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiSW50ZXJuYWwgbWV0aG9kCisKKyAgICAgICAgVGhpcyBtZXRob2QgY29udHJvbHMgdGhlIHVuZG8gbWVjaGFuaXNtIGFuZAorICAgICAgICB0aGUgbW9kaWZpZWQgZmxhZy4gVGhlIGV4YWN0IGJlaGF2aW9yIG9mIHRoZQorICAgICAgICBjb21tYW5kIGRlcGVuZHMgb24gdGhlIG9wdGlvbiBhcmd1bWVudCB0aGF0CisgICAgICAgIGZvbGxvd3MgdGhlIGVkaXQgYXJndW1lbnQuIFRoZSBmb2xsb3dpbmcgZm9ybXMKKyAgICAgICAgb2YgdGhlIGNvbW1hbmQgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6CisKKyAgICAgICAgZWRpdF9tb2RpZmllZCwgZWRpdF9yZWRvLCBlZGl0X3Jlc2V0LCBlZGl0X3NlcGFyYXRvcgorICAgICAgICBhbmQgZWRpdF91bmRvCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2VkaXQnLCAqYXJncykKKworICAgIGRlZiBlZGl0X21vZGlmaWVkKHNlbGYsIGFyZz1Ob25lKToKKyAgICAgICAgIiIiR2V0IG9yIFNldCB0aGUgbW9kaWZpZWQgZmxhZworCisgICAgICAgIElmIGFyZyBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBtb2RpZmllZAorICAgICAgICBmbGFnIG9mIHRoZSB3aWRnZXQuIFRoZSBpbnNlcnQsIGRlbGV0ZSwgZWRpdCB1bmRvIGFuZAorICAgICAgICBlZGl0IHJlZG8gY29tbWFuZHMgb3IgdGhlIHVzZXIgY2FuIHNldCBvciBjbGVhciB0aGUKKyAgICAgICAgbW9kaWZpZWQgZmxhZy4gSWYgYm9vbGVhbiBpcyBzcGVjaWZpZWQsIHNldHMgdGhlCisgICAgICAgIG1vZGlmaWVkIGZsYWcgb2YgdGhlIHdpZGdldCB0byBhcmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5lZGl0KCJtb2RpZmllZCIsIGFyZykKKworICAgIGRlZiBlZGl0X3JlZG8oc2VsZik6CisgICAgICAgICIiIlJlZG8gdGhlIGxhc3QgdW5kb25lIGVkaXQKKworICAgICAgICBXaGVuIHRoZSB1bmRvIG9wdGlvbiBpcyB0cnVlLCByZWFwcGxpZXMgdGhlIGxhc3QKKyAgICAgICAgdW5kb25lIGVkaXRzIHByb3ZpZGVkIG5vIG90aGVyIGVkaXRzIHdlcmUgZG9uZSBzaW5jZQorICAgICAgICB0aGVuLiBHZW5lcmF0ZXMgYW4gZXJyb3Igd2hlbiB0aGUgcmVkbyBzdGFjayBpcyBlbXB0eS4KKyAgICAgICAgRG9lcyBub3RoaW5nIHdoZW4gdGhlIHVuZG8gb3B0aW9uIGlzIGZhbHNlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZWRpdCgicmVkbyIpCisKKyAgICBkZWYgZWRpdF9yZXNldChzZWxmKToKKyAgICAgICAgIiIiQ2xlYXJzIHRoZSB1bmRvIGFuZCByZWRvIHN0YWNrcworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZWRpdCgicmVzZXQiKQorCisgICAgZGVmIGVkaXRfc2VwYXJhdG9yKHNlbGYpOgorICAgICAgICAiIiJJbnNlcnRzIGEgc2VwYXJhdG9yIChib3VuZGFyeSkgb24gdGhlIHVuZG8gc3RhY2suCisKKyAgICAgICAgRG9lcyBub3RoaW5nIHdoZW4gdGhlIHVuZG8gb3B0aW9uIGlzIGZhbHNlCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5lZGl0KCJzZXBhcmF0b3IiKQorCisgICAgZGVmIGVkaXRfdW5kbyhzZWxmKToKKyAgICAgICAgIiIiVW5kb2VzIHRoZSBsYXN0IGVkaXQgYWN0aW9uCisKKyAgICAgICAgSWYgdGhlIHVuZG8gb3B0aW9uIGlzIHRydWUuIEFuIGVkaXQgYWN0aW9uIGlzIGRlZmluZWQKKyAgICAgICAgYXMgYWxsIHRoZSBpbnNlcnQgYW5kIGRlbGV0ZSBjb21tYW5kcyB0aGF0IGFyZSByZWNvcmRlZAorICAgICAgICBvbiB0aGUgdW5kbyBzdGFjayBpbiBiZXR3ZWVuIHR3byBzZXBhcmF0b3JzLiBHZW5lcmF0ZXMKKyAgICAgICAgYW4gZXJyb3Igd2hlbiB0aGUgdW5kbyBzdGFjayBpcyBlbXB0eS4gRG9lcyBub3RoaW5nCisgICAgICAgIHdoZW4gdGhlIHVuZG8gb3B0aW9uIGlzIGZhbHNlCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5lZGl0KCJ1bmRvIikKKworICAgIGRlZiBnZXQoc2VsZiwgaW5kZXgxLCBpbmRleDI9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgdGV4dCBmcm9tIElOREVYMSB0byBJTkRFWDIgKG5vdCBpbmNsdWRlZCkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2dldCcsIGluZGV4MSwgaW5kZXgyKQorICAgICMgKEltYWdlIGNvbW1hbmRzIGFyZSBuZXcgaW4gOC4wKQorICAgIGRlZiBpbWFnZV9jZ2V0KHNlbGYsIGluZGV4LCBvcHRpb24pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHZhbHVlIG9mIE9QVElPTiBvZiBhbiBlbWJlZGRlZCBpbWFnZSBhdCBJTkRFWC4iIiIKKyAgICAgICAgaWYgb3B0aW9uWzoxXSAhPSAiLSI6CisgICAgICAgICAgICBvcHRpb24gPSAiLSIgKyBvcHRpb24KKyAgICAgICAgaWYgb3B0aW9uWy0xOl0gPT0gIl8iOgorICAgICAgICAgICAgb3B0aW9uID0gb3B0aW9uWzotMV0KKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW1hZ2UiLCAiY2dldCIsIGluZGV4LCBvcHRpb24pCisgICAgZGVmIGltYWdlX2NvbmZpZ3VyZShzZWxmLCBpbmRleCwgY25mPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25maWd1cmUgYW4gZW1iZWRkZWQgaW1hZ2UgYXQgSU5ERVguIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jb25maWd1cmUoKCdpbWFnZScsICdjb25maWd1cmUnLCBpbmRleCksIGNuZiwga3cpCisgICAgZGVmIGltYWdlX2NyZWF0ZShzZWxmLCBpbmRleCwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ3JlYXRlIGFuIGVtYmVkZGVkIGltYWdlIGF0IElOREVYLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICAgICBzZWxmLl93LCAiaW1hZ2UiLCAiY3JlYXRlIiwgaW5kZXgsCisgICAgICAgICAgICAgICAgICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorICAgIGRlZiBpbWFnZV9uYW1lcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFsbCBuYW1lcyBvZiBlbWJlZGRlZCBpbWFnZXMgaW4gdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImltYWdlIiwgIm5hbWVzIikKKyAgICBkZWYgaW5kZXgoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBmb3JtIGxpbmUuY2hhciBmb3IgSU5ERVguIiIiCisgICAgICAgIHJldHVybiBzdHIoc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmRleCcsIGluZGV4KSkKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGluZGV4LCBjaGFycywgKmFyZ3MpOgorICAgICAgICAiIiJJbnNlcnQgQ0hBUlMgYmVmb3JlIHRoZSBjaGFyYWN0ZXJzIGF0IElOREVYLiBBbiBhZGRpdGlvbmFsCisgICAgICAgIHRhZyBjYW4gYmUgZ2l2ZW4gaW4gQVJHUy4gQWRkaXRpb25hbCBDSEFSUyBhbmQgdGFncyBjYW4gZm9sbG93IGluIEFSR1MuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2luc2VydCcsIGluZGV4LCBjaGFycykgKyBhcmdzKQorICAgIGRlZiBtYXJrX2dyYXZpdHkoc2VsZiwgbWFya05hbWUsIGRpcmVjdGlvbj1Ob25lKToKKyAgICAgICAgIiIiQ2hhbmdlIHRoZSBncmF2aXR5IG9mIGEgbWFyayBNQVJLTkFNRSB0byBESVJFQ1RJT04gKExFRlQgb3IgUklHSFQpLgorICAgICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgaWYgTm9uZSBpcyBnaXZlbiBmb3IgRElSRUNUSU9OLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgKHNlbGYuX3csICdtYXJrJywgJ2dyYXZpdHknLCBtYXJrTmFtZSwgZGlyZWN0aW9uKSkKKyAgICBkZWYgbWFya19uYW1lcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFsbCBtYXJrIG5hbWVzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgc2VsZi5fdywgJ21hcmsnLCAnbmFtZXMnKSkKKyAgICBkZWYgbWFya19zZXQoc2VsZiwgbWFya05hbWUsIGluZGV4KToKKyAgICAgICAgIiIiU2V0IG1hcmsgTUFSS05BTUUgYmVmb3JlIHRoZSBjaGFyYWN0ZXIgYXQgSU5ERVguIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnbWFyaycsICdzZXQnLCBtYXJrTmFtZSwgaW5kZXgpCisgICAgZGVmIG1hcmtfdW5zZXQoc2VsZiwgKm1hcmtOYW1lcyk6CisgICAgICAgICIiIkRlbGV0ZSBhbGwgbWFya3MgaW4gTUFSS05BTUVTLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdtYXJrJywgJ3Vuc2V0JykgKyBtYXJrTmFtZXMpCisgICAgZGVmIG1hcmtfbmV4dChzZWxmLCBpbmRleCk6CisgICAgICAgICIiIlJldHVybiB0aGUgbmFtZSBvZiB0aGUgbmV4dCBtYXJrIGFmdGVyIElOREVYLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdtYXJrJywgJ25leHQnLCBpbmRleCkgb3IgTm9uZQorICAgIGRlZiBtYXJrX3ByZXZpb3VzKHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcmV2aW91cyBtYXJrIGJlZm9yZSBJTkRFWC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnbWFyaycsICdwcmV2aW91cycsIGluZGV4KSBvciBOb25lCisgICAgZGVmIHNjYW5fbWFyayhzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiUmVtZW1iZXIgdGhlIGN1cnJlbnQgWCwgWSBjb29yZGluYXRlcy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzY2FuJywgJ21hcmsnLCB4LCB5KQorICAgIGRlZiBzY2FuX2RyYWd0byhzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiQWRqdXN0IHRoZSB2aWV3IG9mIHRoZSB0ZXh0IHRvIDEwIHRpbWVzIHRoZQorICAgICAgICBkaWZmZXJlbmNlIGJldHdlZW4gWCBhbmQgWSBhbmQgdGhlIGNvb3JkaW5hdGVzIGdpdmVuIGluCisgICAgICAgIHNjYW5fbWFyay4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzY2FuJywgJ2RyYWd0bycsIHgsIHkpCisgICAgZGVmIHNlYXJjaChzZWxmLCBwYXR0ZXJuLCBpbmRleCwgc3RvcGluZGV4PU5vbmUsCisgICAgICAgICAgIGZvcndhcmRzPU5vbmUsIGJhY2t3YXJkcz1Ob25lLCBleGFjdD1Ob25lLAorICAgICAgICAgICByZWdleHA9Tm9uZSwgbm9jYXNlPU5vbmUsIGNvdW50PU5vbmUsIGVsaWRlPU5vbmUpOgorICAgICAgICAiIiJTZWFyY2ggUEFUVEVSTiBiZWdpbm5pbmcgZnJvbSBJTkRFWCB1bnRpbCBTVE9QSU5ERVguCisgICAgICAgIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIG1hdGNoIG9yIGFuCisgICAgICAgIGVtcHR5IHN0cmluZy4iIiIKKyAgICAgICAgYXJncyA9IFtzZWxmLl93LCAnc2VhcmNoJ10KKyAgICAgICAgaWYgZm9yd2FyZHM6IGFyZ3MuYXBwZW5kKCctZm9yd2FyZHMnKQorICAgICAgICBpZiBiYWNrd2FyZHM6IGFyZ3MuYXBwZW5kKCctYmFja3dhcmRzJykKKyAgICAgICAgaWYgZXhhY3Q6IGFyZ3MuYXBwZW5kKCctZXhhY3QnKQorICAgICAgICBpZiByZWdleHA6IGFyZ3MuYXBwZW5kKCctcmVnZXhwJykKKyAgICAgICAgaWYgbm9jYXNlOiBhcmdzLmFwcGVuZCgnLW5vY2FzZScpCisgICAgICAgIGlmIGVsaWRlOiBhcmdzLmFwcGVuZCgnLWVsaWRlJykKKyAgICAgICAgaWYgY291bnQ6IGFyZ3MuYXBwZW5kKCctY291bnQnKTsgYXJncy5hcHBlbmQoY291bnQpCisgICAgICAgIGlmIHBhdHRlcm4gYW5kIHBhdHRlcm5bMF0gPT0gJy0nOiBhcmdzLmFwcGVuZCgnLS0nKQorICAgICAgICBhcmdzLmFwcGVuZChwYXR0ZXJuKQorICAgICAgICBhcmdzLmFwcGVuZChpbmRleCkKKyAgICAgICAgaWYgc3RvcGluZGV4OiBhcmdzLmFwcGVuZChzdG9waW5kZXgpCisgICAgICAgIHJldHVybiBzdHIoc2VsZi50ay5jYWxsKHR1cGxlKGFyZ3MpKSkKKyAgICBkZWYgc2VlKHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiU2Nyb2xsIHN1Y2ggdGhhdCB0aGUgY2hhcmFjdGVyIGF0IElOREVYIGlzIHZpc2libGUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VlJywgaW5kZXgpCisgICAgZGVmIHRhZ19hZGQoc2VsZiwgdGFnTmFtZSwgaW5kZXgxLCAqYXJncyk6CisgICAgICAgICIiIkFkZCB0YWcgVEFHTkFNRSB0byBhbGwgY2hhcmFjdGVycyBiZXR3ZWVuIElOREVYMSBhbmQgaW5kZXgyIGluIEFSR1MuCisgICAgICAgIEFkZGl0aW9uYWwgcGFpcnMgb2YgaW5kaWNlcyBtYXkgZm9sbG93IGluIEFSR1MuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIChzZWxmLl93LCAndGFnJywgJ2FkZCcsIHRhZ05hbWUsIGluZGV4MSkgKyBhcmdzKQorICAgIGRlZiB0YWdfdW5iaW5kKHNlbGYsIHRhZ05hbWUsIHNlcXVlbmNlLCBmdW5jaWQ9Tm9uZSk6CisgICAgICAgICIiIlVuYmluZCBmb3IgYWxsIGNoYXJhY3RlcnMgd2l0aCBUQUdOQU1FIGZvciBldmVudCBTRVFVRU5DRSAgdGhlCisgICAgICAgIGZ1bmN0aW9uIGlkZW50aWZpZWQgd2l0aCBGVU5DSUQuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAndGFnJywgJ2JpbmQnLCB0YWdOYW1lLCBzZXF1ZW5jZSwgJycpCisgICAgICAgIGlmIGZ1bmNpZDoKKyAgICAgICAgICAgIHNlbGYuZGVsZXRlY29tbWFuZChmdW5jaWQpCisgICAgZGVmIHRhZ19iaW5kKHNlbGYsIHRhZ05hbWUsIHNlcXVlbmNlLCBmdW5jLCBhZGQ9Tm9uZSk6CisgICAgICAgICIiIkJpbmQgdG8gYWxsIGNoYXJhY3RlcnMgd2l0aCBUQUdOQU1FIGF0IGV2ZW50IFNFUVVFTkNFIGEgY2FsbCB0byBmdW5jdGlvbiBGVU5DLgorCisgICAgICAgIEFuIGFkZGl0aW9uYWwgYm9vbGVhbiBwYXJhbWV0ZXIgQUREIHNwZWNpZmllcyB3aGV0aGVyIEZVTkMgd2lsbCBiZQorICAgICAgICBjYWxsZWQgYWRkaXRpb25hbGx5IHRvIHRoZSBvdGhlciBib3VuZCBmdW5jdGlvbiBvciB3aGV0aGVyIGl0IHdpbGwKKyAgICAgICAgcmVwbGFjZSB0aGUgcHJldmlvdXMgZnVuY3Rpb24uIFNlZSBiaW5kIGZvciB0aGUgcmV0dXJuIHZhbHVlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fYmluZCgoc2VsZi5fdywgJ3RhZycsICdiaW5kJywgdGFnTmFtZSksCisgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSwgZnVuYywgYWRkKQorICAgIGRlZiB0YWdfY2dldChzZWxmLCB0YWdOYW1lLCBvcHRpb24pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHZhbHVlIG9mIE9QVElPTiBmb3IgdGFnIFRBR05BTUUuIiIiCisgICAgICAgIGlmIG9wdGlvbls6MV0gIT0gJy0nOgorICAgICAgICAgICAgb3B0aW9uID0gJy0nICsgb3B0aW9uCisgICAgICAgIGlmIG9wdGlvblstMTpdID09ICdfJzoKKyAgICAgICAgICAgIG9wdGlvbiA9IG9wdGlvbls6LTFdCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3RhZycsICdjZ2V0JywgdGFnTmFtZSwgb3B0aW9uKQorICAgIGRlZiB0YWdfY29uZmlndXJlKHNlbGYsIHRhZ05hbWUsIGNuZj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uZmlndXJlIGEgdGFnIFRBR05BTUUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jb25maWd1cmUoKCd0YWcnLCAnY29uZmlndXJlJywgdGFnTmFtZSksIGNuZiwga3cpCisgICAgdGFnX2NvbmZpZyA9IHRhZ19jb25maWd1cmUKKyAgICBkZWYgdGFnX2RlbGV0ZShzZWxmLCAqdGFnTmFtZXMpOgorICAgICAgICAiIiJEZWxldGUgYWxsIHRhZ3MgaW4gVEFHTkFNRVMuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ3RhZycsICdkZWxldGUnKSArIHRhZ05hbWVzKQorICAgIGRlZiB0YWdfbG93ZXIoc2VsZiwgdGFnTmFtZSwgYmVsb3dUaGlzPU5vbmUpOgorICAgICAgICAiIiJDaGFuZ2UgdGhlIHByaW9yaXR5IG9mIHRhZyBUQUdOQU1FIHN1Y2ggdGhhdCBpdCBpcyBsb3dlcgorICAgICAgICB0aGFuIHRoZSBwcmlvcml0eSBvZiBCRUxPV1RISVMuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAndGFnJywgJ2xvd2VyJywgdGFnTmFtZSwgYmVsb3dUaGlzKQorICAgIGRlZiB0YWdfbmFtZXMoc2VsZiwgaW5kZXg9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHRhZyBuYW1lcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICd0YWcnLCAnbmFtZXMnLCBpbmRleCkpCisgICAgZGVmIHRhZ19uZXh0cmFuZ2Uoc2VsZiwgdGFnTmFtZSwgaW5kZXgxLCBpbmRleDI9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc3RhcnQgYW5kIGVuZCBpbmRleCBmb3IgdGhlIGZpcnN0IHNlcXVlbmNlIG9mCisgICAgICAgIGNoYXJhY3RlcnMgYmV0d2VlbiBJTkRFWDEgYW5kIElOREVYMiB3aGljaCBhbGwgaGF2ZSB0YWcgVEFHTkFNRS4KKyAgICAgICAgVGhlIHRleHQgaXMgc2VhcmNoZWQgZm9yd2FyZCBmcm9tIElOREVYMS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIHNlbGYuX3csICd0YWcnLCAnbmV4dHJhbmdlJywgdGFnTmFtZSwgaW5kZXgxLCBpbmRleDIpKQorICAgIGRlZiB0YWdfcHJldnJhbmdlKHNlbGYsIHRhZ05hbWUsIGluZGV4MSwgaW5kZXgyPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHN0YXJ0IGFuZCBlbmQgaW5kZXggZm9yIHRoZSBmaXJzdCBzZXF1ZW5jZSBvZgorICAgICAgICBjaGFyYWN0ZXJzIGJldHdlZW4gSU5ERVgxIGFuZCBJTkRFWDIgd2hpY2ggYWxsIGhhdmUgdGFnIFRBR05BTUUuCisgICAgICAgIFRoZSB0ZXh0IGlzIHNlYXJjaGVkIGJhY2t3YXJkcyBmcm9tIElOREVYMS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIHNlbGYuX3csICd0YWcnLCAncHJldnJhbmdlJywgdGFnTmFtZSwgaW5kZXgxLCBpbmRleDIpKQorICAgIGRlZiB0YWdfcmFpc2Uoc2VsZiwgdGFnTmFtZSwgYWJvdmVUaGlzPU5vbmUpOgorICAgICAgICAiIiJDaGFuZ2UgdGhlIHByaW9yaXR5IG9mIHRhZyBUQUdOQU1FIHN1Y2ggdGhhdCBpdCBpcyBoaWdoZXIKKyAgICAgICAgdGhhbiB0aGUgcHJpb3JpdHkgb2YgQUJPVkVUSElTLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICBzZWxmLl93LCAndGFnJywgJ3JhaXNlJywgdGFnTmFtZSwgYWJvdmVUaGlzKQorICAgIGRlZiB0YWdfcmFuZ2VzKHNlbGYsIHRhZ05hbWUpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHJhbmdlcyBvZiB0ZXh0IHdoaWNoIGhhdmUgdGFnIFRBR05BTUUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICBzZWxmLl93LCAndGFnJywgJ3JhbmdlcycsIHRhZ05hbWUpKQorICAgIGRlZiB0YWdfcmVtb3ZlKHNlbGYsIHRhZ05hbWUsIGluZGV4MSwgaW5kZXgyPU5vbmUpOgorICAgICAgICAiIiJSZW1vdmUgdGFnIFRBR05BTUUgZnJvbSBhbGwgY2hhcmFjdGVycyBiZXR3ZWVuIElOREVYMSBhbmQgSU5ERVgyLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICBzZWxmLl93LCAndGFnJywgJ3JlbW92ZScsIHRhZ05hbWUsIGluZGV4MSwgaW5kZXgyKQorICAgIGRlZiB3aW5kb3dfY2dldChzZWxmLCBpbmRleCwgb3B0aW9uKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB2YWx1ZSBvZiBPUFRJT04gb2YgYW4gZW1iZWRkZWQgd2luZG93IGF0IElOREVYLiIiIgorICAgICAgICBpZiBvcHRpb25bOjFdICE9ICctJzoKKyAgICAgICAgICAgIG9wdGlvbiA9ICctJyArIG9wdGlvbgorICAgICAgICBpZiBvcHRpb25bLTE6XSA9PSAnXyc6CisgICAgICAgICAgICBvcHRpb24gPSBvcHRpb25bOi0xXQorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICd3aW5kb3cnLCAnY2dldCcsIGluZGV4LCBvcHRpb24pCisgICAgZGVmIHdpbmRvd19jb25maWd1cmUoc2VsZiwgaW5kZXgsIGNuZj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uZmlndXJlIGFuIGVtYmVkZGVkIHdpbmRvdyBhdCBJTkRFWC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbmZpZ3VyZSgoJ3dpbmRvdycsICdjb25maWd1cmUnLCBpbmRleCksIGNuZiwga3cpCisgICAgd2luZG93X2NvbmZpZyA9IHdpbmRvd19jb25maWd1cmUKKyAgICBkZWYgd2luZG93X2NyZWF0ZShzZWxmLCBpbmRleCwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ3JlYXRlIGEgd2luZG93IGF0IElOREVYLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgIChzZWxmLl93LCAnd2luZG93JywgJ2NyZWF0ZScsIGluZGV4KQorICAgICAgICAgICAgICArIHNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgZGVmIHdpbmRvd19uYW1lcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFsbCBuYW1lcyBvZiBlbWJlZGRlZCB3aW5kb3dzIGluIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3dpbmRvdycsICduYW1lcycpKQorICAgIGRlZiB5dmlld19waWNrcGxhY2Uoc2VsZiwgKndoYXQpOgorICAgICAgICAiIiJPYnNvbGV0ZSBmdW5jdGlvbiwgdXNlIHNlZS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAneXZpZXcnLCAnLXBpY2twbGFjZScpICsgd2hhdCkKKworCitjbGFzcyBfc2V0aXQ6CisgICAgIiIiSW50ZXJuYWwgY2xhc3MuIEl0IHdyYXBzIHRoZSBjb21tYW5kIGluIHRoZSB3aWRnZXQgT3B0aW9uTWVudS4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFyLCB2YWx1ZSwgY2FsbGJhY2s9Tm9uZSk6CisgICAgICAgIHNlbGYuX192YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYuX192YXIgPSB2YXIKKyAgICAgICAgc2VsZi5fX2NhbGxiYWNrID0gY2FsbGJhY2sKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9fdmFyLnNldChzZWxmLl9fdmFsdWUpCisgICAgICAgIGlmIHNlbGYuX19jYWxsYmFjazoKKyAgICAgICAgICAgIHNlbGYuX19jYWxsYmFjayhzZWxmLl9fdmFsdWUsICphcmdzKQorCitjbGFzcyBPcHRpb25NZW51KE1lbnVidXR0b24pOgorICAgICIiIk9wdGlvbk1lbnUgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCBhIHZhbHVlIGZyb20gYSBtZW51LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHZhcmlhYmxlLCB2YWx1ZSwgKnZhbHVlcywgKiprd2FyZ3MpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYW4gb3B0aW9ubWVudSB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUiwgd2l0aAorICAgICAgICB0aGUgcmVzb3VyY2UgdGV4dHZhcmlhYmxlIHNldCB0byBWQVJJQUJMRSwgdGhlIGluaXRpYWxseSBzZWxlY3RlZAorICAgICAgICB2YWx1ZSBWQUxVRSwgdGhlIG90aGVyIG1lbnUgdmFsdWVzIFZBTFVFUyBhbmQgYW4gYWRkaXRpb25hbAorICAgICAgICBrZXl3b3JkIGFyZ3VtZW50IGNvbW1hbmQuIiIiCisgICAgICAgIGt3ID0geyJib3JkZXJ3aWR0aCI6IDIsICJ0ZXh0dmFyaWFibGUiOiB2YXJpYWJsZSwKKyAgICAgICAgICAgICAgImluZGljYXRvcm9uIjogMSwgInJlbGllZiI6IFJBSVNFRCwgImFuY2hvciI6ICJjIiwKKyAgICAgICAgICAgICAgImhpZ2hsaWdodHRoaWNrbmVzcyI6IDJ9CisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICJtZW51YnV0dG9uIiwga3cpCisgICAgICAgIHNlbGYud2lkZ2V0TmFtZSA9ICd0a19vcHRpb25NZW51JworICAgICAgICBtZW51ID0gc2VsZi5fX21lbnUgPSBNZW51KHNlbGYsIG5hbWU9Im1lbnUiLCB0ZWFyb2ZmPTApCisgICAgICAgIHNlbGYubWVudW5hbWUgPSBtZW51Ll93CisgICAgICAgICMgJ2NvbW1hbmQnIGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBrZXl3b3JkCisgICAgICAgIGNhbGxiYWNrID0ga3dhcmdzLmdldCgnY29tbWFuZCcpCisgICAgICAgIGlmICdjb21tYW5kJyBpbiBrd2FyZ3M6CisgICAgICAgICAgICBkZWwga3dhcmdzWydjb21tYW5kJ10KKyAgICAgICAgaWYga3dhcmdzOgorICAgICAgICAgICAgcmFpc2UgVGNsRXJyb3IsICd1bmtub3duIG9wdGlvbiAtJytrd2FyZ3Mua2V5cygpWzBdCisgICAgICAgIG1lbnUuYWRkX2NvbW1hbmQobGFiZWw9dmFsdWUsCisgICAgICAgICAgICAgICAgIGNvbW1hbmQ9X3NldGl0KHZhcmlhYmxlLCB2YWx1ZSwgY2FsbGJhY2spKQorICAgICAgICBmb3IgdiBpbiB2YWx1ZXM6CisgICAgICAgICAgICBtZW51LmFkZF9jb21tYW5kKGxhYmVsPXYsCisgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPV9zZXRpdCh2YXJpYWJsZSwgdiwgY2FsbGJhY2spKQorICAgICAgICBzZWxmWyJtZW51Il0gPSBtZW51CisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgPT0gJ21lbnUnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19tZW51CisgICAgICAgIHJldHVybiBXaWRnZXQuX19nZXRpdGVtX18oc2VsZiwgbmFtZSkKKworICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAiIiJEZXN0cm95IHRoaXMgd2lkZ2V0IGFuZCB0aGUgYXNzb2NpYXRlZCBtZW51LiIiIgorICAgICAgICBNZW51YnV0dG9uLmRlc3Ryb3koc2VsZikKKyAgICAgICAgc2VsZi5fX21lbnUgPSBOb25lCisKK2NsYXNzIEltYWdlOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGltYWdlcy4iIiIKKyAgICBfbGFzdF9pZCA9IDAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW1ndHlwZSwgbmFtZT1Ob25lLCBjbmY9e30sIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgc2VsZi5uYW1lID0gTm9uZQorICAgICAgICBpZiBub3QgbWFzdGVyOgorICAgICAgICAgICAgbWFzdGVyID0gX2RlZmF1bHRfcm9vdAorICAgICAgICAgICAgaWYgbm90IG1hc3RlcjoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICdUb28gZWFybHkgdG8gY3JlYXRlIGltYWdlJworICAgICAgICBzZWxmLnRrID0gbWFzdGVyLnRrCisgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgSW1hZ2UuX2xhc3RfaWQgKz0gMQorICAgICAgICAgICAgbmFtZSA9ICJweWltYWdlJXIiICUgKEltYWdlLl9sYXN0X2lkLCkgIyB0ayBpdHNlbGYgd291bGQgdXNlIGltYWdlPHg+CisgICAgICAgICAgICAjIFRoZSBmb2xsb3dpbmcgaXMgbmVlZGVkIGZvciBzeXN0ZW1zIHdoZXJlIGlkKHgpCisgICAgICAgICAgICAjIGNhbiByZXR1cm4gYSBuZWdhdGl2ZSBudW1iZXIsIHN1Y2ggYXMgTGludXgvbTY4azoKKyAgICAgICAgICAgIGlmIG5hbWVbMF0gPT0gJy0nOiBuYW1lID0gJ18nICsgbmFtZVsxOl0KKyAgICAgICAgaWYga3cgYW5kIGNuZjogY25mID0gX2NuZm1lcmdlKChjbmYsIGt3KSkKKyAgICAgICAgZWxpZiBrdzogY25mID0ga3cKKyAgICAgICAgb3B0aW9ucyA9ICgpCisgICAgICAgIGZvciBrLCB2IGluIGNuZi5pdGVtcygpOgorICAgICAgICAgICAgaWYgaGFzYXR0cih2LCAnX19jYWxsX18nKToKKyAgICAgICAgICAgICAgICB2ID0gc2VsZi5fcmVnaXN0ZXIodikKKyAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zICsgKCctJytrLCB2KQorICAgICAgICBzZWxmLnRrLmNhbGwoKCdpbWFnZScsICdjcmVhdGUnLCBpbWd0eXBlLCBuYW1lLCkgKyBvcHRpb25zKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgZGVmIF9fc3RyX18oc2VsZik6IHJldHVybiBzZWxmLm5hbWUKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5uYW1lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnaW1hZ2UnLCAnZGVsZXRlJywgc2VsZi5uYW1lKQorICAgICAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgICAgICMgTWF5IGhhcHBlbiBpZiB0aGUgcm9vdCB3YXMgZGVzdHJveWVkCisgICAgICAgICAgICAgICAgcGFzcworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYubmFtZSwgJ2NvbmZpZ3VyZScsICctJytrZXksIHZhbHVlKQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYubmFtZSwgJ2NvbmZpZ3VyZScsICctJytrZXkpCisgICAgZGVmIGNvbmZpZ3VyZShzZWxmLCAqKmt3KToKKyAgICAgICAgIiIiQ29uZmlndXJlIHRoZSBpbWFnZS4iIiIKKyAgICAgICAgcmVzID0gKCkKKyAgICAgICAgZm9yIGssIHYgaW4gX2NuZm1lcmdlKGt3KS5pdGVtcygpOgorICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBrWy0xXSA9PSAnXyc6IGsgPSBrWzotMV0KKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHYsICdfX2NhbGxfXycpOgorICAgICAgICAgICAgICAgICAgICB2ID0gc2VsZi5fcmVnaXN0ZXIodikKKyAgICAgICAgICAgICAgICByZXMgPSByZXMgKyAoJy0nK2ssIHYpCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5uYW1lLCAnY29uZmlnJykgKyByZXMpCisgICAgY29uZmlnID0gY29uZmlndXJlCisgICAgZGVmIGhlaWdodChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdpbWFnZScsICdoZWlnaHQnLCBzZWxmLm5hbWUpKQorICAgIGRlZiB0eXBlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGltZ2FnZSwgZS5nLiAicGhvdG8iIG9yICJiaXRtYXAiLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCdpbWFnZScsICd0eXBlJywgc2VsZi5uYW1lKQorICAgIGRlZiB3aWR0aChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ2ltYWdlJywgJ3dpZHRoJywgc2VsZi5uYW1lKSkKKworY2xhc3MgUGhvdG9JbWFnZShJbWFnZSk6CisgICAgIiIiV2lkZ2V0IHdoaWNoIGNhbiBkaXNwbGF5IGNvbG9yZWQgaW1hZ2VzIGluIEdJRiwgUFBNL1BHTSBmb3JtYXQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgY25mPXt9LCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNyZWF0ZSBhbiBpbWFnZSB3aXRoIE5BTUUuCisKKyAgICAgICAgVmFsaWQgcmVzb3VyY2UgbmFtZXM6IGRhdGEsIGZvcm1hdCwgZmlsZSwgZ2FtbWEsIGhlaWdodCwgcGFsZXR0ZSwKKyAgICAgICAgd2lkdGguIiIiCisgICAgICAgIEltYWdlLl9faW5pdF9fKHNlbGYsICdwaG90bycsIG5hbWUsIGNuZiwgbWFzdGVyLCAqKmt3KQorICAgIGRlZiBibGFuayhzZWxmKToKKyAgICAgICAgIiIiRGlzcGxheSBhIHRyYW5zcGFyZW50IGltYWdlLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5uYW1lLCAnYmxhbmsnKQorICAgIGRlZiBjZ2V0KHNlbGYsIG9wdGlvbik6CisgICAgICAgICIiIlJldHVybiB0aGUgdmFsdWUgb2YgT1BUSU9OLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYubmFtZSwgJ2NnZXQnLCAnLScgKyBvcHRpb24pCisgICAgIyBYWFggY29uZmlnCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5uYW1lLCAnY2dldCcsICctJyArIGtleSkKKyAgICAjIFhYWCBjb3B5IC1mcm9tLCAtdG8sIC4uLj8KKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbmV3IFBob3RvSW1hZ2Ugd2l0aCB0aGUgc2FtZSBpbWFnZSBhcyB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgZGVzdEltYWdlID0gUGhvdG9JbWFnZSgpCisgICAgICAgIHNlbGYudGsuY2FsbChkZXN0SW1hZ2UsICdjb3B5Jywgc2VsZi5uYW1lKQorICAgICAgICByZXR1cm4gZGVzdEltYWdlCisgICAgZGVmIHpvb20oc2VsZix4LHk9JycpOgorICAgICAgICAiIiJSZXR1cm4gYSBuZXcgUGhvdG9JbWFnZSB3aXRoIHRoZSBzYW1lIGltYWdlIGFzIHRoaXMgd2lkZ2V0CisgICAgICAgIGJ1dCB6b29tIGl0IHdpdGggWCBhbmQgWS4iIiIKKyAgICAgICAgZGVzdEltYWdlID0gUGhvdG9JbWFnZSgpCisgICAgICAgIGlmIHk9PScnOiB5PXgKKyAgICAgICAgc2VsZi50ay5jYWxsKGRlc3RJbWFnZSwgJ2NvcHknLCBzZWxmLm5hbWUsICctem9vbScseCx5KQorICAgICAgICByZXR1cm4gZGVzdEltYWdlCisgICAgZGVmIHN1YnNhbXBsZShzZWxmLHgseT0nJyk6CisgICAgICAgICIiIlJldHVybiBhIG5ldyBQaG90b0ltYWdlIGJhc2VkIG9uIHRoZSBzYW1lIGltYWdlIGFzIHRoaXMgd2lkZ2V0CisgICAgICAgIGJ1dCB1c2Ugb25seSBldmVyeSBYdGggb3IgWXRoIHBpeGVsLiIiIgorICAgICAgICBkZXN0SW1hZ2UgPSBQaG90b0ltYWdlKCkKKyAgICAgICAgaWYgeT09Jyc6IHk9eAorICAgICAgICBzZWxmLnRrLmNhbGwoZGVzdEltYWdlLCAnY29weScsIHNlbGYubmFtZSwgJy1zdWJzYW1wbGUnLHgseSkKKyAgICAgICAgcmV0dXJuIGRlc3RJbWFnZQorICAgIGRlZiBnZXQoc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlJldHVybiB0aGUgY29sb3IgKHJlZCwgZ3JlZW4sIGJsdWUpIG9mIHRoZSBwaXhlbCBhdCBYLFkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5uYW1lLCAnZ2V0JywgeCwgeSkKKyAgICBkZWYgcHV0KHNlbGYsIGRhdGEsIHRvPU5vbmUpOgorICAgICAgICAiIiJQdXQgcm93IGZvcm1hdHRlZCBjb2xvcnMgdG8gaW1hZ2Ugc3RhcnRpbmcgZnJvbQorICAgICAgICBwb3NpdGlvbiBUTywgZS5nLiBpbWFnZS5wdXQoIntyZWQgZ3JlZW59IHtibHVlIHllbGxvd30iLCB0bz0oNCw2KSkiIiIKKyAgICAgICAgYXJncyA9IChzZWxmLm5hbWUsICdwdXQnLCBkYXRhKQorICAgICAgICBpZiB0bzoKKyAgICAgICAgICAgIGlmIHRvWzBdID09ICctdG8nOgorICAgICAgICAgICAgICAgIHRvID0gdG9bMTpdCisgICAgICAgICAgICBhcmdzID0gYXJncyArICgnLXRvJywpICsgdHVwbGUodG8pCisgICAgICAgIHNlbGYudGsuY2FsbChhcmdzKQorICAgICMgWFhYIHJlYWQKKyAgICBkZWYgd3JpdGUoc2VsZiwgZmlsZW5hbWUsIGZvcm1hdD1Ob25lLCBmcm9tX2Nvb3Jkcz1Ob25lKToKKyAgICAgICAgIiIiV3JpdGUgaW1hZ2UgdG8gZmlsZSBGSUxFTkFNRSBpbiBGT1JNQVQgc3RhcnRpbmcgZnJvbQorICAgICAgICBwb3NpdGlvbiBGUk9NX0NPT1JEUy4iIiIKKyAgICAgICAgYXJncyA9IChzZWxmLm5hbWUsICd3cml0ZScsIGZpbGVuYW1lKQorICAgICAgICBpZiBmb3JtYXQ6CisgICAgICAgICAgICBhcmdzID0gYXJncyArICgnLWZvcm1hdCcsIGZvcm1hdCkKKyAgICAgICAgaWYgZnJvbV9jb29yZHM6CisgICAgICAgICAgICBhcmdzID0gYXJncyArICgnLWZyb20nLCkgKyB0dXBsZShmcm9tX2Nvb3JkcykKKyAgICAgICAgc2VsZi50ay5jYWxsKGFyZ3MpCisKK2NsYXNzIEJpdG1hcEltYWdlKEltYWdlKToKKyAgICAiIiJXaWRnZXQgd2hpY2ggY2FuIGRpc3BsYXkgYSBiaXRtYXAuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgY25mPXt9LCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNyZWF0ZSBhIGJpdG1hcCB3aXRoIE5BTUUuCisKKyAgICAgICAgVmFsaWQgcmVzb3VyY2UgbmFtZXM6IGJhY2tncm91bmQsIGRhdGEsIGZpbGUsIGZvcmVncm91bmQsIG1hc2tkYXRhLCBtYXNrZmlsZS4iIiIKKyAgICAgICAgSW1hZ2UuX19pbml0X18oc2VsZiwgJ2JpdG1hcCcsIG5hbWUsIGNuZiwgbWFzdGVyLCAqKmt3KQorCitkZWYgaW1hZ2VfbmFtZXMoKTogcmV0dXJuIF9kZWZhdWx0X3Jvb3QudGsuY2FsbCgnaW1hZ2UnLCAnbmFtZXMnKQorZGVmIGltYWdlX3R5cGVzKCk6IHJldHVybiBfZGVmYXVsdF9yb290LnRrLmNhbGwoJ2ltYWdlJywgJ3R5cGVzJykKKworCitjbGFzcyBTcGluYm94KFdpZGdldCwgWFZpZXcpOgorICAgICIiInNwaW5ib3ggd2lkZ2V0LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgc3BpbmJveCB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGFjdGl2ZWJhY2tncm91bmQsIGJhY2tncm91bmQsIGJvcmRlcndpZHRoLAorICAgICAgICAgICAgY3Vyc29yLCBleHBvcnRzZWxlY3Rpb24sIGZvbnQsIGZvcmVncm91bmQsCisgICAgICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kLCBoaWdobGlnaHRjb2xvciwKKyAgICAgICAgICAgIGhpZ2hsaWdodHRoaWNrbmVzcywgaW5zZXJ0YmFja2dyb3VuZCwKKyAgICAgICAgICAgIGluc2VydGJvcmRlcndpZHRoLCBpbnNlcnRvZmZ0aW1lLAorICAgICAgICAgICAgaW5zZXJ0b250aW1lLCBpbnNlcnR3aWR0aCwganVzdGlmeSwgcmVsaWVmLAorICAgICAgICAgICAgcmVwZWF0ZGVsYXksIHJlcGVhdGludGVydmFsLAorICAgICAgICAgICAgc2VsZWN0YmFja2dyb3VuZCwgc2VsZWN0Ym9yZGVyd2lkdGgKKyAgICAgICAgICAgIHNlbGVjdGZvcmVncm91bmQsIHRha2Vmb2N1cywgdGV4dHZhcmlhYmxlCisgICAgICAgICAgICB4c2Nyb2xsY29tbWFuZC4KKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBidXR0b25iYWNrZ3JvdW5kLCBidXR0b25jdXJzb3IsCisgICAgICAgICAgICBidXR0b25kb3ducmVsaWVmLCBidXR0b251cHJlbGllZiwKKyAgICAgICAgICAgIGNvbW1hbmQsIGRpc2FibGVkYmFja2dyb3VuZCwKKyAgICAgICAgICAgIGRpc2FibGVkZm9yZWdyb3VuZCwgZm9ybWF0LCBmcm9tLAorICAgICAgICAgICAgaW52YWxpZGNvbW1hbmQsIGluY3JlbWVudCwKKyAgICAgICAgICAgIHJlYWRvbmx5YmFja2dyb3VuZCwgc3RhdGUsIHRvLAorICAgICAgICAgICAgdmFsaWRhdGUsIHZhbGlkYXRlY29tbWFuZCB2YWx1ZXMsCisgICAgICAgICAgICB3aWR0aCwgd3JhcCwKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdzcGluYm94JywgY25mLCBrdykKKworICAgIGRlZiBiYm94KHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiUmV0dXJuIGEgdHVwbGUgb2YgWDEsWTEsWDIsWTIgY29vcmRpbmF0ZXMgZm9yIGEKKyAgICAgICAgcmVjdGFuZ2xlIHdoaWNoIGVuY2xvc2VzIHRoZSBjaGFyYWN0ZXIgZ2l2ZW4gYnkgaW5kZXguCisKKyAgICAgICAgVGhlIGZpcnN0IHR3byBlbGVtZW50cyBvZiB0aGUgbGlzdCBnaXZlIHRoZSB4IGFuZCB5CisgICAgICAgIGNvb3JkaW5hdGVzIG9mIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgc2NyZWVuCisgICAgICAgIGFyZWEgY292ZXJlZCBieSB0aGUgY2hhcmFjdGVyIChpbiBwaXhlbHMgcmVsYXRpdmUKKyAgICAgICAgdG8gdGhlIHdpZGdldCkgYW5kIHRoZSBsYXN0IHR3byBlbGVtZW50cyBnaXZlIHRoZQorICAgICAgICB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjaGFyYWN0ZXIsIGluIHBpeGVscy4gVGhlCisgICAgICAgIGJvdW5kaW5nIGJveCBtYXkgcmVmZXIgdG8gYSByZWdpb24gb3V0c2lkZSB0aGUKKyAgICAgICAgdmlzaWJsZSBhcmVhIG9mIHRoZSB3aW5kb3cuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdiYm94JywgaW5kZXgpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIGZpcnN0LCBsYXN0PU5vbmUpOgorICAgICAgICAiIiJEZWxldGUgb25lIG9yIG1vcmUgZWxlbWVudHMgb2YgdGhlIHNwaW5ib3guCisKKyAgICAgICAgRmlyc3QgaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gZGVsZXRlLAorICAgICAgICBhbmQgbGFzdCBpcyB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBqdXN0IGFmdGVyCisgICAgICAgIHRoZSBsYXN0IG9uZSB0byBkZWxldGUuIElmIGxhc3QgaXNuJ3Qgc3BlY2lmaWVkIGl0CisgICAgICAgIGRlZmF1bHRzIHRvIGZpcnN0KzEsIGkuZS4gYSBzaW5nbGUgY2hhcmFjdGVyIGlzCisgICAgICAgIGRlbGV0ZWQuICBUaGlzIGNvbW1hbmQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWxldGUnLCBmaXJzdCwgbGFzdCkKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdGhlIHNwaW5ib3gncyBzdHJpbmciIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZ2V0JykKKworICAgIGRlZiBpY3Vyc29yKHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiQWx0ZXIgdGhlIHBvc2l0aW9uIG9mIHRoZSBpbnNlcnRpb24gY3Vyc29yLgorCisgICAgICAgIFRoZSBpbnNlcnRpb24gY3Vyc29yIHdpbGwgYmUgZGlzcGxheWVkIGp1c3QgYmVmb3JlCisgICAgICAgIHRoZSBjaGFyYWN0ZXIgZ2l2ZW4gYnkgaW5kZXguIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpY3Vyc29yJywgaW5kZXgpCisKKyAgICBkZWYgaWRlbnRpZnkoc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHdpZGdldCBhdCBwb3NpdGlvbiB4LCB5CisKKyAgICAgICAgUmV0dXJuIHZhbHVlIGlzIG9uZSBvZjogbm9uZSwgYnV0dG9uZG93biwgYnV0dG9udXAsIGVudHJ5CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpZGVudGlmeScsIHgsIHkpCisKKyAgICBkZWYgaW5kZXgoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBudW1lcmljYWwgaW5kZXggY29ycmVzcG9uZGluZyB0byBpbmRleAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5kZXgnLCBpbmRleCkKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIHMpOgorICAgICAgICAiIiJJbnNlcnQgc3RyaW5nIHMgYXQgaW5kZXgKKworICAgICAgICAgUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnNlcnQnLCBpbmRleCwgcykKKworICAgIGRlZiBpbnZva2Uoc2VsZiwgZWxlbWVudCk6CisgICAgICAgICIiIkNhdXNlcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gYmUgaW52b2tlZAorCisgICAgICAgIFRoZSBlbGVtZW50IGNvdWxkIGJlIGJ1dHRvbmRvd24gb3IgYnV0dG9udXAKKyAgICAgICAgdHJpZ2dlcmluZyB0aGUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ludm9rZScsIGVsZW1lbnQpCisKKyAgICBkZWYgc2NhbihzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ3NjYW4nKSArIGFyZ3MpKSBvciAoKQorCisgICAgZGVmIHNjYW5fbWFyayhzZWxmLCB4KToKKyAgICAgICAgIiIiUmVjb3JkcyB4IGFuZCB0aGUgY3VycmVudCB2aWV3IGluIHRoZSBzcGluYm94IHdpbmRvdzsKKworICAgICAgICB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggbGF0ZXIgc2NhbiBkcmFndG8gY29tbWFuZHMuCisgICAgICAgIFR5cGljYWxseSB0aGlzIGNvbW1hbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgbW91c2UgYnV0dG9uCisgICAgICAgIHByZXNzIGluIHRoZSB3aWRnZXQuIEl0IHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2NhbigibWFyayIsIHgpCisKKyAgICBkZWYgc2Nhbl9kcmFndG8oc2VsZiwgeCk6CisgICAgICAgICIiIkNvbXB1dGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ2l2ZW4geCBhcmd1bWVudAorICAgICAgICBhbmQgdGhlIHggYXJndW1lbnQgdG8gdGhlIGxhc3Qgc2NhbiBtYXJrIGNvbW1hbmQKKworICAgICAgICBJdCB0aGVuIGFkanVzdHMgdGhlIHZpZXcgbGVmdCBvciByaWdodCBieSAxMCB0aW1lcyB0aGUKKyAgICAgICAgZGlmZmVyZW5jZSBpbiB4LWNvb3JkaW5hdGVzLiBUaGlzIGNvbW1hbmQgaXMgdHlwaWNhbGx5CisgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBtb3VzZSBtb3Rpb24gZXZlbnRzIGluIHRoZSB3aWRnZXQsIHRvCisgICAgICAgIHByb2R1Y2UgdGhlIGVmZmVjdCBvZiBkcmFnZ2luZyB0aGUgc3BpbmJveCBhdCBoaWdoIHNwZWVkCisgICAgICAgIHRocm91Z2ggdGhlIHdpbmRvdy4gVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zY2FuKCJkcmFndG8iLCB4KQorCisgICAgZGVmIHNlbGVjdGlvbihzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ3NlbGVjdGlvbicpICsgYXJncykpIG9yICgpCisKKyAgICBkZWYgc2VsZWN0aW9uX2FkanVzdChzZWxmLCBpbmRleCk6CisgICAgICAgICIiIkxvY2F0ZSB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gbmVhcmVzdCB0byB0aGUgY2hhcmFjdGVyCisgICAgICAgIGdpdmVuIGJ5IGluZGV4LAorCisgICAgICAgIFRoZW4gYWRqdXN0IHRoYXQgZW5kIG9mIHRoZSBzZWxlY3Rpb24gdG8gYmUgYXQgaW5kZXgKKyAgICAgICAgKGkuZSBpbmNsdWRpbmcgYnV0IG5vdCBnb2luZyBiZXlvbmQgaW5kZXgpLiBUaGUgb3RoZXIKKyAgICAgICAgZW5kIG9mIHRoZSBzZWxlY3Rpb24gaXMgbWFkZSB0aGUgYW5jaG9yIHBvaW50IGZvciBmdXR1cmUKKyAgICAgICAgc2VsZWN0IHRvIGNvbW1hbmRzLiBJZiB0aGUgc2VsZWN0aW9uIGlzbid0IGN1cnJlbnRseSBpbgorICAgICAgICB0aGUgc3BpbmJveCwgdGhlbiBhIG5ldyBzZWxlY3Rpb24gaXMgY3JlYXRlZCB0byBpbmNsdWRlCisgICAgICAgIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gaW5kZXggYW5kIHRoZSBtb3N0IHJlY2VudCBzZWxlY3Rpb24KKyAgICAgICAgYW5jaG9yIHBvaW50LCBpbmNsdXNpdmUuIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VsZWN0aW9uKCJhZGp1c3QiLCBpbmRleCkKKworICAgIGRlZiBzZWxlY3Rpb25fY2xlYXIoc2VsZik6CisgICAgICAgICIiIkNsZWFyIHRoZSBzZWxlY3Rpb24KKworICAgICAgICBJZiB0aGUgc2VsZWN0aW9uIGlzbid0IGluIHRoaXMgd2lkZ2V0IHRoZW4gdGhlCisgICAgICAgIGNvbW1hbmQgaGFzIG5vIGVmZmVjdC4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zZWxlY3Rpb24oImNsZWFyIikKKworICAgIGRlZiBzZWxlY3Rpb25fZWxlbWVudChzZWxmLCBlbGVtZW50PU5vbmUpOgorICAgICAgICAiIiJTZXRzIG9yIGdldHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50LgorCisgICAgICAgIElmIGEgc3BpbmJ1dHRvbiBlbGVtZW50IGlzIHNwZWNpZmllZCwgaXQgd2lsbCBiZQorICAgICAgICBkaXNwbGF5ZWQgZGVwcmVzc2VkCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zZWxlY3Rpb24oImVsZW1lbnQiLCBlbGVtZW50KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgTGFiZWxGcmFtZShXaWRnZXQpOgorICAgICIiImxhYmVsZnJhbWUgd2lkZ2V0LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgbGFiZWxmcmFtZSB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGJvcmRlcndpZHRoLCBjdXJzb3IsIGZvbnQsIGZvcmVncm91bmQsCisgICAgICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kLCBoaWdobGlnaHRjb2xvciwKKyAgICAgICAgICAgIGhpZ2hsaWdodHRoaWNrbmVzcywgcGFkeCwgcGFkeSwgcmVsaWVmLAorICAgICAgICAgICAgdGFrZWZvY3VzLCB0ZXh0CisKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKworICAgICAgICAgICAgYmFja2dyb3VuZCwgY2xhc3MsIGNvbG9ybWFwLCBjb250YWluZXIsCisgICAgICAgICAgICBoZWlnaHQsIGxhYmVsYW5jaG9yLCBsYWJlbHdpZGdldCwKKyAgICAgICAgICAgIHZpc3VhbCwgd2lkdGgKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdsYWJlbGZyYW1lJywgY25mLCBrdykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIFBhbmVkV2luZG93KFdpZGdldCk6CisgICAgIiIicGFuZWR3aW5kb3cgd2lkZ2V0LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgcGFuZWR3aW5kb3cgd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBNQVNURVIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBiYWNrZ3JvdW5kLCBib3JkZXJ3aWR0aCwgY3Vyc29yLCBoZWlnaHQsCisgICAgICAgICAgICBvcmllbnQsIHJlbGllZiwgd2lkdGgKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBoYW5kbGVwYWQsIGhhbmRsZXNpemUsIG9wYXF1ZXJlc2l6ZSwKKyAgICAgICAgICAgIHNhc2hjdXJzb3IsIHNhc2hwYWQsIHNhc2hyZWxpZWYsCisgICAgICAgICAgICBzYXNod2lkdGgsIHNob3doYW5kbGUsCisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAncGFuZWR3aW5kb3cnLCBjbmYsIGt3KQorCisgICAgZGVmIGFkZChzZWxmLCBjaGlsZCwgKiprdyk6CisgICAgICAgICIiIkFkZCBhIGNoaWxkIHdpZGdldCB0byB0aGUgcGFuZWR3aW5kb3cgaW4gYSBuZXcgcGFuZS4KKworICAgICAgICBUaGUgY2hpbGQgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIGNoaWxkIHdpZGdldAorICAgICAgICBmb2xsb3dlZCBieSBwYWlycyBvZiBhcmd1bWVudHMgdGhhdCBzcGVjaWZ5IGhvdyB0bworICAgICAgICBtYW5hZ2UgdGhlIHdpbmRvd3MuIFRoZSBwb3NzaWJsZSBvcHRpb25zIGFuZCB2YWx1ZXMKKyAgICAgICAgYXJlIHRoZSBvbmVzIGFjY2VwdGVkIGJ5IHRoZSBwYW5lY29uZmlndXJlIG1ldGhvZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2FkZCcsIGNoaWxkKSArIHNlbGYuX29wdGlvbnMoa3cpKQorCisgICAgZGVmIHJlbW92ZShzZWxmLCBjaGlsZCk6CisgICAgICAgICIiIlJlbW92ZSB0aGUgcGFuZSBjb250YWluaW5nIGNoaWxkIGZyb20gdGhlIHBhbmVkd2luZG93CisKKyAgICAgICAgQWxsIGdlb21ldHJ5IG1hbmFnZW1lbnQgb3B0aW9ucyBmb3IgY2hpbGQgd2lsbCBiZSBmb3Jnb3R0ZW4uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ZvcmdldCcsIGNoaWxkKQorICAgIGZvcmdldD1yZW1vdmUKKworICAgIGRlZiBpZGVudGlmeShzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiSWRlbnRpZnkgdGhlIHBhbmVkd2luZG93IGNvbXBvbmVudCBhdCBwb2ludCB4LCB5CisKKyAgICAgICAgSWYgdGhlIHBvaW50IGlzIG92ZXIgYSBzYXNoIG9yIGEgc2FzaCBoYW5kbGUsIHRoZSByZXN1bHQKKyAgICAgICAgaXMgYSB0d28gZWxlbWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIGluZGV4IG9mIHRoZSBzYXNoIG9yCisgICAgICAgIGhhbmRsZSwgYW5kIGEgd29yZCBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgaXMgb3ZlciBhIHNhc2gKKyAgICAgICAgb3IgYSBoYW5kbGUsIHN1Y2ggYXMgezAgc2FzaH0gb3IgezIgaGFuZGxlfS4gSWYgdGhlIHBvaW50CisgICAgICAgIGlzIG92ZXIgYW55IG90aGVyIHBhcnQgb2YgdGhlIHBhbmVkd2luZG93LCB0aGUgcmVzdWx0IGlzCisgICAgICAgIGFuIGVtcHR5IGxpc3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpZGVudGlmeScsIHgsIHkpCisKKyAgICBkZWYgcHJveHkoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdwcm94eScpICsgYXJncykpIG9yICgpCisKKyAgICBkZWYgcHJveHlfY29vcmQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgeCBhbmQgeSBwYWlyIG9mIHRoZSBtb3N0IHJlY2VudCBwcm94eSBsb2NhdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucHJveHkoImNvb3JkIikKKworICAgIGRlZiBwcm94eV9mb3JnZXQoc2VsZik6CisgICAgICAgICIiIlJlbW92ZSB0aGUgcHJveHkgZnJvbSB0aGUgZGlzcGxheS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnByb3h5KCJmb3JnZXQiKQorCisgICAgZGVmIHByb3h5X3BsYWNlKHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJQbGFjZSB0aGUgcHJveHkgYXQgdGhlIGdpdmVuIHggYW5kIHkgY29vcmRpbmF0ZXMuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5wcm94eSgicGxhY2UiLCB4LCB5KQorCisgICAgZGVmIHNhc2goc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdzYXNoJykgKyBhcmdzKSkgb3IgKCkKKworICAgIGRlZiBzYXNoX2Nvb3JkKHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IHggYW5kIHkgcGFpciBmb3IgdGhlIHNhc2ggZ2l2ZW4gYnkgaW5kZXguCisKKyAgICAgICAgSW5kZXggbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMSBsZXNzIHRoYW4gdGhlCisgICAgICAgIG51bWJlciBvZiBwYW5lcyBpbiB0aGUgcGFuZWR3aW5kb3cuIFRoZSBjb29yZGluYXRlcyBnaXZlbiBhcmUKKyAgICAgICAgdGhvc2Ugb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcmVnaW9uIGNvbnRhaW5pbmcgdGhlIHNhc2guCisgICAgICAgIHBhdGhOYW1lIHNhc2ggZHJhZ3RvIGluZGV4IHggeSBUaGlzIGNvbW1hbmQgY29tcHV0ZXMgdGhlCisgICAgICAgIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMgYW5kIHRoZSBjb29yZGluYXRlcworICAgICAgICBnaXZlbiB0byB0aGUgbGFzdCBzYXNoIGNvb3JkIGNvbW1hbmQgZm9yIHRoZSBnaXZlbiBzYXNoLiBJdCB0aGVuCisgICAgICAgIG1vdmVzIHRoYXQgc2FzaCB0aGUgY29tcHV0ZWQgZGlmZmVyZW5jZS4gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUKKyAgICAgICAgZW1wdHkgc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2FzaCgiY29vcmQiLCBpbmRleCkKKworICAgIGRlZiBzYXNoX21hcmsoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZWNvcmRzIHggYW5kIHkgZm9yIHRoZSBzYXNoIGdpdmVuIGJ5IGluZGV4OworCisgICAgICAgIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBsYXRlciBkcmFndG8gY29tbWFuZHMgdG8gbW92ZSB0aGUgc2FzaC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNhc2goIm1hcmsiLCBpbmRleCkKKworICAgIGRlZiBzYXNoX3BsYWNlKHNlbGYsIGluZGV4LCB4LCB5KToKKyAgICAgICAgIiIiUGxhY2UgdGhlIHNhc2ggZ2l2ZW4gYnkgaW5kZXggYXQgdGhlIGdpdmVuIGNvb3JkaW5hdGVzCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zYXNoKCJwbGFjZSIsIGluZGV4LCB4LCB5KQorCisgICAgZGVmIHBhbmVjZ2V0KHNlbGYsIGNoaWxkLCBvcHRpb24pOgorICAgICAgICAiIiJRdWVyeSBhIG1hbmFnZW1lbnQgb3B0aW9uIGZvciB3aW5kb3cuCisKKyAgICAgICAgT3B0aW9uIG1heSBiZSBhbnkgdmFsdWUgYWxsb3dlZCBieSB0aGUgcGFuZWNvbmZpZ3VyZSBzdWJjb21tYW5kCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgKHNlbGYuX3csICdwYW5lY2dldCcpICsgKGNoaWxkLCAnLScrb3B0aW9uKSkKKworICAgIGRlZiBwYW5lY29uZmlndXJlKHNlbGYsIHRhZ09ySWQsIGNuZj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiUXVlcnkgb3IgbW9kaWZ5IHRoZSBtYW5hZ2VtZW50IG9wdGlvbnMgZm9yIHdpbmRvdy4KKworICAgICAgICBJZiBubyBvcHRpb24gaXMgc3BlY2lmaWVkLCByZXR1cm5zIGEgbGlzdCBkZXNjcmliaW5nIGFsbAorICAgICAgICBvZiB0aGUgYXZhaWxhYmxlIG9wdGlvbnMgZm9yIHBhdGhOYW1lLiAgSWYgb3B0aW9uIGlzCisgICAgICAgIHNwZWNpZmllZCB3aXRoIG5vIHZhbHVlLCB0aGVuIHRoZSBjb21tYW5kIHJldHVybnMgYSBsaXN0CisgICAgICAgIGRlc2NyaWJpbmcgdGhlIG9uZSBuYW1lZCBvcHRpb24gKHRoaXMgbGlzdCB3aWxsIGJlIGlkZW50aWNhbAorICAgICAgICB0byB0aGUgY29ycmVzcG9uZGluZyBzdWJsaXN0IG9mIHRoZSB2YWx1ZSByZXR1cm5lZCBpZiBubworICAgICAgICBvcHRpb24gaXMgc3BlY2lmaWVkKS4gSWYgb25lIG9yIG1vcmUgb3B0aW9uLXZhbHVlIHBhaXJzIGFyZQorICAgICAgICBzcGVjaWZpZWQsIHRoZW4gdGhlIGNvbW1hbmQgbW9kaWZpZXMgdGhlIGdpdmVuIHdpZGdldAorICAgICAgICBvcHRpb24ocykgdG8gaGF2ZSB0aGUgZ2l2ZW4gdmFsdWUocyk7IGluIHRoaXMgY2FzZSB0aGUKKyAgICAgICAgY29tbWFuZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4gVGhlIGZvbGxvd2luZyBvcHRpb25zCisgICAgICAgIGFyZSBzdXBwb3J0ZWQ6CisKKyAgICAgICAgYWZ0ZXIgd2luZG93CisgICAgICAgICAgICBJbnNlcnQgdGhlIHdpbmRvdyBhZnRlciB0aGUgd2luZG93IHNwZWNpZmllZC4gd2luZG93CisgICAgICAgICAgICBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYSB3aW5kb3cgYWxyZWFkeSBtYW5hZ2VkIGJ5IHBhdGhOYW1lLgorICAgICAgICBiZWZvcmUgd2luZG93CisgICAgICAgICAgICBJbnNlcnQgdGhlIHdpbmRvdyBiZWZvcmUgdGhlIHdpbmRvdyBzcGVjaWZpZWQuIHdpbmRvdworICAgICAgICAgICAgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgd2luZG93IGFscmVhZHkgbWFuYWdlZCBieSBwYXRoTmFtZS4KKyAgICAgICAgaGVpZ2h0IHNpemUKKyAgICAgICAgICAgIFNwZWNpZnkgYSBoZWlnaHQgZm9yIHRoZSB3aW5kb3cuIFRoZSBoZWlnaHQgd2lsbCBiZSB0aGUKKyAgICAgICAgICAgIG91dGVyIGRpbWVuc2lvbiBvZiB0aGUgd2luZG93IGluY2x1ZGluZyBpdHMgYm9yZGVyLCBpZgorICAgICAgICAgICAgYW55LiBJZiBzaXplIGlzIGFuIGVtcHR5IHN0cmluZywgb3IgaWYgLWhlaWdodCBpcyBub3QKKyAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlbiB0aGUgaGVpZ2h0IHJlcXVlc3RlZCBpbnRlcm5hbGx5IGJ5IHRoZQorICAgICAgICAgICAgd2luZG93IHdpbGwgYmUgdXNlZCBpbml0aWFsbHk7IHRoZSBoZWlnaHQgbWF5IGxhdGVyIGJlCisgICAgICAgICAgICBhZGp1c3RlZCBieSB0aGUgbW92ZW1lbnQgb2Ygc2FzaGVzIGluIHRoZSBwYW5lZHdpbmRvdy4KKyAgICAgICAgICAgIFNpemUgbWF5IGJlIGFueSB2YWx1ZSBhY2NlcHRlZCBieSBUa19HZXRQaXhlbHMuCisgICAgICAgIG1pbnNpemUgbgorICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBjYW5ub3QgYmUgbWFkZQorICAgICAgICAgICAgbGVzcyB0aGFuIG4uIFRoaXMgY29uc3RyYWludCBvbmx5IGFmZmVjdHMgdGhlIHNpemUgb2YKKyAgICAgICAgICAgIHRoZSB3aWRnZXQgaW4gdGhlIHBhbmVkIGRpbWVuc2lvbiAtLSB0aGUgeCBkaW1lbnNpb24KKyAgICAgICAgICAgIGZvciBob3Jpem9udGFsIHBhbmVkd2luZG93cywgdGhlIHkgZGltZW5zaW9uIGZvcgorICAgICAgICAgICAgdmVydGljYWwgcGFuZWR3aW5kb3dzLiBNYXkgYmUgYW55IHZhbHVlIGFjY2VwdGVkIGJ5CisgICAgICAgICAgICBUa19HZXRQaXhlbHMuCisgICAgICAgIHBhZHggbgorICAgICAgICAgICAgU3BlY2lmaWVzIGEgbm9uLW5lZ2F0aXZlIHZhbHVlIGluZGljYXRpbmcgaG93IG11Y2gKKyAgICAgICAgICAgIGV4dHJhIHNwYWNlIHRvIGxlYXZlIG9uIGVhY2ggc2lkZSBvZiB0aGUgd2luZG93IGluCisgICAgICAgICAgICB0aGUgWC1kaXJlY3Rpb24uIFRoZSB2YWx1ZSBtYXkgaGF2ZSBhbnkgb2YgdGhlIGZvcm1zCisgICAgICAgICAgICBhY2NlcHRlZCBieSBUa19HZXRQaXhlbHMuCisgICAgICAgIHBhZHkgbgorICAgICAgICAgICAgU3BlY2lmaWVzIGEgbm9uLW5lZ2F0aXZlIHZhbHVlIGluZGljYXRpbmcgaG93IG11Y2gKKyAgICAgICAgICAgIGV4dHJhIHNwYWNlIHRvIGxlYXZlIG9uIGVhY2ggc2lkZSBvZiB0aGUgd2luZG93IGluCisgICAgICAgICAgICB0aGUgWS1kaXJlY3Rpb24uIFRoZSB2YWx1ZSBtYXkgaGF2ZSBhbnkgb2YgdGhlIGZvcm1zCisgICAgICAgICAgICBhY2NlcHRlZCBieSBUa19HZXRQaXhlbHMuCisgICAgICAgIHN0aWNreSBzdHlsZQorICAgICAgICAgICAgSWYgYSB3aW5kb3cncyBwYW5lIGlzIGxhcmdlciB0aGFuIHRoZSByZXF1ZXN0ZWQKKyAgICAgICAgICAgIGRpbWVuc2lvbnMgb2YgdGhlIHdpbmRvdywgdGhpcyBvcHRpb24gbWF5IGJlIHVzZWQKKyAgICAgICAgICAgIHRvIHBvc2l0aW9uIChvciBzdHJldGNoKSB0aGUgd2luZG93IHdpdGhpbiBpdHMgcGFuZS4KKyAgICAgICAgICAgIFN0eWxlIGlzIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgemVybyBvciBtb3JlIG9mIHRoZQorICAgICAgICAgICAgY2hhcmFjdGVycyBuLCBzLCBlIG9yIHcuIFRoZSBzdHJpbmcgY2FuIG9wdGlvbmFsbHkKKyAgICAgICAgICAgIGNvbnRhaW5zIHNwYWNlcyBvciBjb21tYXMsIGJ1dCB0aGV5IGFyZSBpZ25vcmVkLiBFYWNoCisgICAgICAgICAgICBsZXR0ZXIgcmVmZXJzIHRvIGEgc2lkZSAobm9ydGgsIHNvdXRoLCBlYXN0LCBvciB3ZXN0KQorICAgICAgICAgICAgdGhhdCB0aGUgd2luZG93IHdpbGwgInN0aWNrIiB0by4gSWYgYm90aCBuIGFuZCBzCisgICAgICAgICAgICAob3IgZSBhbmQgdykgYXJlIHNwZWNpZmllZCwgdGhlIHdpbmRvdyB3aWxsIGJlCisgICAgICAgICAgICBzdHJldGNoZWQgdG8gZmlsbCB0aGUgZW50aXJlIGhlaWdodCAob3Igd2lkdGgpIG9mCisgICAgICAgICAgICBpdHMgY2F2aXR5LgorICAgICAgICB3aWR0aCBzaXplCisgICAgICAgICAgICBTcGVjaWZ5IGEgd2lkdGggZm9yIHRoZSB3aW5kb3cuIFRoZSB3aWR0aCB3aWxsIGJlCisgICAgICAgICAgICB0aGUgb3V0ZXIgZGltZW5zaW9uIG9mIHRoZSB3aW5kb3cgaW5jbHVkaW5nIGl0cworICAgICAgICAgICAgYm9yZGVyLCBpZiBhbnkuIElmIHNpemUgaXMgYW4gZW1wdHkgc3RyaW5nLCBvcgorICAgICAgICAgICAgaWYgLXdpZHRoIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIHdpZHRoIHJlcXVlc3RlZAorICAgICAgICAgICAgaW50ZXJuYWxseSBieSB0aGUgd2luZG93IHdpbGwgYmUgdXNlZCBpbml0aWFsbHk7IHRoZQorICAgICAgICAgICAgd2lkdGggbWF5IGxhdGVyIGJlIGFkanVzdGVkIGJ5IHRoZSBtb3ZlbWVudCBvZiBzYXNoZXMKKyAgICAgICAgICAgIGluIHRoZSBwYW5lZHdpbmRvdy4gU2l6ZSBtYXkgYmUgYW55IHZhbHVlIGFjY2VwdGVkIGJ5CisgICAgICAgICAgICBUa19HZXRQaXhlbHMuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNuZiBpcyBOb25lIGFuZCBub3Qga3c6CisgICAgICAgICAgICBjbmYgPSB7fQorICAgICAgICAgICAgZm9yIHggaW4gc2VsZi50ay5zcGxpdCgKKyAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAncGFuZWNvbmZpZ3VyZScsIHRhZ09ySWQpKToKKyAgICAgICAgICAgICAgICBjbmZbeFswXVsxOl1dID0gKHhbMF1bMTpdLCkgKyB4WzE6XQorICAgICAgICAgICAgcmV0dXJuIGNuZgorICAgICAgICBpZiB0eXBlKGNuZikgPT0gU3RyaW5nVHlwZSBhbmQgbm90IGt3OgorICAgICAgICAgICAgeCA9IHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICAgIHNlbGYuX3csICdwYW5lY29uZmlndXJlJywgdGFnT3JJZCwgJy0nK2NuZikpCisgICAgICAgICAgICByZXR1cm4gKHhbMF1bMTpdLCkgKyB4WzE6XQorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdwYW5lY29uZmlndXJlJywgdGFnT3JJZCkgKworICAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorICAgIHBhbmVjb25maWcgPSBwYW5lY29uZmlndXJlCisKKyAgICBkZWYgcGFuZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgYW4gb3JkZXJlZCBsaXN0IG9mIHRoZSBjaGlsZCBwYW5lcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFuZXMnKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEV4dGVuc2lvbnM6CisKK2NsYXNzIFN0dWRidXR0b24oQnV0dG9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdzdHVkYnV0dG9uJywgY25mLCBrdykKKyAgICAgICAgc2VsZi5iaW5kKCc8QW55LUVudGVyPicsICAgICAgIHNlbGYudGtCdXR0b25FbnRlcikKKyAgICAgICAgc2VsZi5iaW5kKCc8QW55LUxlYXZlPicsICAgICAgIHNlbGYudGtCdXR0b25MZWF2ZSkKKyAgICAgICAgc2VsZi5iaW5kKCc8MT4nLCAgICAgICAgICAgICAgIHNlbGYudGtCdXR0b25Eb3duKQorICAgICAgICBzZWxmLmJpbmQoJzxCdXR0b25SZWxlYXNlLTE+Jywgc2VsZi50a0J1dHRvblVwKQorCitjbGFzcyBUcmlidXR0b24oQnV0dG9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0cmlidXR0b24nLCBjbmYsIGt3KQorICAgICAgICBzZWxmLmJpbmQoJzxBbnktRW50ZXI+JywgICAgICAgc2VsZi50a0J1dHRvbkVudGVyKQorICAgICAgICBzZWxmLmJpbmQoJzxBbnktTGVhdmU+JywgICAgICAgc2VsZi50a0J1dHRvbkxlYXZlKQorICAgICAgICBzZWxmLmJpbmQoJzwxPicsICAgICAgICAgICAgICAgc2VsZi50a0J1dHRvbkRvd24pCisgICAgICAgIHNlbGYuYmluZCgnPEJ1dHRvblJlbGVhc2UtMT4nLCBzZWxmLnRrQnV0dG9uVXApCisgICAgICAgIHNlbGZbJ2ZnJ10gICAgICAgICAgICAgICA9IHNlbGZbJ2JnJ10KKyAgICAgICAgc2VsZlsnYWN0aXZlYmFja2dyb3VuZCddID0gc2VsZlsnYmcnXQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRlc3Q6CisKK2RlZiBfdGVzdCgpOgorICAgIHJvb3QgPSBUaygpCisgICAgdGV4dCA9ICJUaGlzIGlzIFRjbC9UayB2ZXJzaW9uICVzIiAlIFRjbFZlcnNpb24KKyAgICBpZiBUY2xWZXJzaW9uID49IDguMToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IHRleHQgKyB1bmljb2RlKCJcblRoaXMgc2hvdWxkIGJlIGEgY2VkaWxsYTogXDM0NyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzby04ODU5LTEiKQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcyAjIG5vIHVuaWNvZGUgc3VwcG9ydAorICAgIGxhYmVsID0gTGFiZWwocm9vdCwgdGV4dD10ZXh0KQorICAgIGxhYmVsLnBhY2soKQorICAgIHRlc3QgPSBCdXR0b24ocm9vdCwgdGV4dD0iQ2xpY2sgbWUhIiwKKyAgICAgICAgICAgICAgY29tbWFuZD1sYW1iZGEgcm9vdD1yb290OiByb290LnRlc3QuY29uZmlndXJlKAorICAgICAgICAgICAgICAgICAgdGV4dD0iWyVzXSIgJSByb290LnRlc3RbJ3RleHQnXSkpCisgICAgdGVzdC5wYWNrKCkKKyAgICByb290LnRlc3QgPSB0ZXN0CisgICAgcXVpdCA9IEJ1dHRvbihyb290LCB0ZXh0PSJRVUlUIiwgY29tbWFuZD1yb290LmRlc3Ryb3kpCisgICAgcXVpdC5wYWNrKCkKKyAgICAjIFRoZSBmb2xsb3dpbmcgdGhyZWUgY29tbWFuZHMgYXJlIG5lZWRlZCBzbyB0aGUgd2luZG93IHBvcHMKKyAgICAjIHVwIG9uIHRvcCBvbiBXaW5kb3dzLi4uCisgICAgcm9vdC5pY29uaWZ5KCkKKyAgICByb290LnVwZGF0ZSgpCisgICAgcm9vdC5kZWljb25pZnkoKQorICAgIHJvb3QubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL1RraW50ZXIucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGtpbnRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmMWQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL1RraW50ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL1RraW50ZXIucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGtpbnRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmMWQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL1RraW50ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvUkVBRE1FIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljZDE2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvUkVBRE1FCkBAIC0wLDAgKzEsMTQgQEAKK1dyaXRpbmcgbmV3IHRlc3RzCis9PT09PT09PT09PT09PT09PQorCitQcmVjYXV0aW9uCistLS0tLS0tLS0tCisKKyAgICBOZXcgdGVzdHMgc2hvdWxkIGFsd2F5cyB1c2Ugb25seSBvbmUgVGsgd2luZG93IGF0IG9uY2UsIGxpa2UgYWxsIHRoZQorICAgIGN1cnJlbnQgdGVzdHMgZG8uIFRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZSB0byBkZXN0cm95IHRoZSBjdXJyZW50IHdpbmRvdworICAgIGJlZm9yZSBjcmVhdGluZyBhbm90aGVyIG9uZSwgYW5kIGNsZWFuIHVwIGFmdGVyIHRoZSB0ZXN0LiBUaGUgbW90aXZhdGlvbgorICAgIGJlaGluZCB0aGlzIGlzIHRoYXQgc29tZSB0ZXN0cyBtYXkgZGVwZW5kIG9uIGhhdmluZyBpdHMgd2luZG93IGZvY3VzZWQKKyAgICB3aGlsZSBpdCBpcyBydW5uaW5nIHRvIHdvcmsgcHJvcGVybHksIGFuZCBpdCBtYXkgYmUgaGFyZCB0byBmb3JjZSBmb2N1cworICAgIG9uIHlvdXIgd2luZG93IGFjcm9zcyBwbGF0Zm9ybXMgKHJpZ2h0IG5vdyBvbmx5IHRlc3RfdHJhdmVyc2FsIGF0CisgICAgdGVzdF90dGsudGVzdF93aWRnZXRzLk5vdGVib29rVGVzdCBkZXBlbmRzIG9uIHRoaXMpLgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3J1bnRrdGVzdHMucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3J1bnRrdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlMTcyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvcnVudGt0ZXN0cy5weQpAQCAtMCwwICsxLDExNCBAQAorIiIiCitVc2UgdGhpcyBtb2R1bGUgdG8gZ2V0IGFuZCBydW4gYWxsIHRrIHRlc3RzLgorCitUa2ludGVyIHRlc3RzIHNob3VsZCBsaXZlIGluIGEgcGFja2FnZSBpbnNpZGUgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGlzIGZpbGUKK2xpdmVzLCBsaWtlIHRlc3RfdGtpbnRlci4KK0V4dGVuc2lvbnMgYWxzbyBzaG91bGQgbGl2ZSBpbiBwYWNrYWdlcyBmb2xsb3dpbmcgdGhlIHNhbWUgcnVsZSBhcyBhYm92ZS4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGltcG9ydGxpYgoraW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0CisKK3RoaXNfZGlyX3BhdGggPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKKworX3RrX3VuYXZhaWxhYmxlID0gTm9uZQorCitkZWYgY2hlY2tfdGtfYXZhaWxhYmlsaXR5KCk6CisgICAgIiIiQ2hlY2sgdGhhdCBUayBpcyBpbnN0YWxsZWQgYW5kIGF2YWlsYWJsZS4iIiIKKyAgICBnbG9iYWwgX3RrX3VuYXZhaWxhYmxlCisKKyAgICBpZiBfdGtfdW5hdmFpbGFibGUgaXMgTm9uZToKKyAgICAgICAgX3RrX3VuYXZhaWxhYmxlID0gRmFsc2UKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgIyBUaGUgQXF1YSBUayBpbXBsZW1lbnRhdGlvbnMgb24gT1MgWCBjYW4gYWJvcnQgdGhlIHByb2Nlc3MgaWYKKyAgICAgICAgICAgICMgYmVpbmcgY2FsbGVkIGluIGFuIGVudmlyb25tZW50IHdoZXJlIGEgd2luZG93IHNlcnZlciBjb25uZWN0aW9uCisgICAgICAgICAgICAjIGNhbm5vdCBiZSBtYWRlLCBmb3IgaW5zdGFuY2Ugd2hlbiBpbnZva2VkIGJ5IGEgYnVpbGRib3Qgb3Igc3NoCisgICAgICAgICAgICAjIHByb2Nlc3Mgbm90IHJ1bm5pbmcgdW5kZXIgdGhlIHNhbWUgdXNlciBpZCBhcyB0aGUgY3VycmVudCBjb25zb2xlCisgICAgICAgICAgICAjIHVzZXIuICBUbyBhdm9pZCB0aGF0LCByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIHdpbmRvdyBtYW5hZ2VyCisgICAgICAgICAgICAjIGNvbm5lY3Rpb24gaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjZGxsLCBjX2ludCwgcG9pbnRlciwgU3RydWN0dXJlCisgICAgICAgICAgICBmcm9tIGN0eXBlcy51dGlsIGltcG9ydCBmaW5kX2xpYnJhcnkKKworICAgICAgICAgICAgYXBwX3NlcnZpY2VzID0gY2RsbC5Mb2FkTGlicmFyeShmaW5kX2xpYnJhcnkoIkFwcGxpY2F0aW9uU2VydmljZXMiKSkKKworICAgICAgICAgICAgaWYgYXBwX3NlcnZpY2VzLkNHTWFpbkRpc3BsYXlJRCgpID09IDA6CisgICAgICAgICAgICAgICAgX3RrX3VuYXZhaWxhYmxlID0gImNhbm5vdCBydW4gd2l0aG91dCBPUyBYIHdpbmRvdyBtYW5hZ2VyIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjbGFzcyBQcm9jZXNzU2VyaWFsTnVtYmVyKFN0cnVjdHVyZSk6CisgICAgICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygiaGlnaExvbmdPZlBTTiIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJsb3dMb25nT2ZQU04iLCBjX2ludCldCisgICAgICAgICAgICAgICAgcHNuID0gUHJvY2Vzc1NlcmlhbE51bWJlcigpCisgICAgICAgICAgICAgICAgcHNuX3AgPSBwb2ludGVyKHBzbikKKyAgICAgICAgICAgICAgICBpZiAoICAoYXBwX3NlcnZpY2VzLkdldEN1cnJlbnRQcm9jZXNzKHBzbl9wKSA8IDApIG9yCisgICAgICAgICAgICAgICAgICAgICAgKGFwcF9zZXJ2aWNlcy5TZXRGcm9udFByb2Nlc3MocHNuX3ApIDwgMCkgKToKKyAgICAgICAgICAgICAgICAgICAgX3RrX3VuYXZhaWxhYmxlID0gImNhbm5vdCBydW4gd2l0aG91dCBPUyBYIGd1aSBwcm9jZXNzIgorICAgICAgICBlbHNlOiAgICMgbm90IE9TIFgKKyAgICAgICAgICAgIGltcG9ydCBUa2ludGVyCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgVGtpbnRlci5CdXR0b24oKQorICAgICAgICAgICAgZXhjZXB0IFRraW50ZXIuVGNsRXJyb3IgYXMgbXNnOgorICAgICAgICAgICAgICAgICMgYXNzdW1pbmcgdGsgaXMgbm90IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIF90a191bmF2YWlsYWJsZSA9ICJ0ayBub3QgYXZhaWxhYmxlOiAlcyIgJSBtc2cKKworICAgIGlmIF90a191bmF2YWlsYWJsZToKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoX3RrX3VuYXZhaWxhYmxlKQorICAgIHJldHVybgorCitkZWYgaXNfcGFja2FnZShwYXRoKToKKyAgICBmb3IgbmFtZSBpbiBvcy5saXN0ZGlyKHBhdGgpOgorICAgICAgICBpZiBuYW1lIGluICgnX19pbml0X18ucHknLCAnX19pbml0X18ucHljJywgJ19faW5pdC5weW8nKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBnZXRfdGVzdHNfbW9kdWxlcyhiYXNlcGF0aD10aGlzX2Rpcl9wYXRoLCBndWk9VHJ1ZSwgcGFja2FnZXM9Tm9uZSk6CisgICAgIiIiVGhpcyB3aWxsIGltcG9ydCBhbmQgeWllbGQgbW9kdWxlcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIHRlc3RfCisgICAgYW5kIGFyZSBpbnNpZGUgcGFja2FnZXMgZm91bmQgaW4gdGhlIHBhdGggc3RhcnRpbmcgYXQgYmFzZXBhdGguCisKKyAgICBJZiBwYWNrYWdlcyBpcyBzcGVjaWZpZWQgaXQgc2hvdWxkIGNvbnRhaW4gcGFja2FnZSBuYW1lcyB0aGF0IHdhbnQKKyAgICB0aGVpciB0ZXN0cyBjb2xsZXRlZC4KKyAgICAiIiIKKyAgICBweV9leHQgPSAnLnB5JworCisgICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhiYXNlcGF0aCk6CisgICAgICAgIGZvciBkaXJuYW1lIGluIGxpc3QoZGlybmFtZXMpOgorICAgICAgICAgICAgaWYgZGlybmFtZVswXSA9PSAnLic6CisgICAgICAgICAgICAgICAgZGlybmFtZXMucmVtb3ZlKGRpcm5hbWUpCisKKyAgICAgICAgaWYgaXNfcGFja2FnZShkaXJwYXRoKSBhbmQgZmlsZW5hbWVzOgorICAgICAgICAgICAgcGtnX25hbWUgPSBkaXJwYXRoW2xlbihiYXNlcGF0aCkgKyBsZW4ob3Muc2VwKTpdLnJlcGxhY2UoJy8nLCAnLicpCisgICAgICAgICAgICBpZiBwYWNrYWdlcyBhbmQgcGtnX25hbWUgbm90IGluIHBhY2thZ2VzOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGZpbGVuYW1lcyA9IGZpbHRlcigKKyAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHg6IHguc3RhcnRzd2l0aCgndGVzdF8nKSBhbmQgeC5lbmRzd2l0aChweV9leHQpLAorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZXMpCisKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuJXMiICUgbmFtZVs6LWxlbihweV9leHQpXSwgcGtnX25hbWUpCisgICAgICAgICAgICAgICAgZXhjZXB0IHRlc3QudGVzdF9zdXBwb3J0LlJlc291cmNlRGVuaWVkOgorICAgICAgICAgICAgICAgICAgICBpZiBndWk6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorCitkZWYgZ2V0X3Rlc3RzKHRleHQ9VHJ1ZSwgZ3VpPVRydWUsIHBhY2thZ2VzPU5vbmUpOgorICAgICIiIllpZWxkIGFsbCB0aGUgdGVzdHMgaW4gdGhlIG1vZHVsZXMgZm91bmQgYnkgZ2V0X3Rlc3RzX21vZHVsZXMuCisKKyAgICBJZiBub2d1aSBpcyBUcnVlLCBvbmx5IHRlc3RzIHRoYXQgZG8gbm90IHJlcXVpcmUgYSBHVUkgd2lsbCBiZQorICAgIHJldHVybmVkLiIiIgorICAgIGF0dHJzID0gW10KKyAgICBpZiB0ZXh0OgorICAgICAgICBhdHRycy5hcHBlbmQoJ3Rlc3RzX25vZ3VpJykKKyAgICBpZiBndWk6CisgICAgICAgIGF0dHJzLmFwcGVuZCgndGVzdHNfZ3VpJykKKyAgICBmb3IgbW9kdWxlIGluIGdldF90ZXN0c19tb2R1bGVzKGd1aT1ndWksIHBhY2thZ2VzPXBhY2thZ2VzKToKKyAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CisgICAgICAgICAgICBmb3IgdGVzdCBpbiBnZXRhdHRyKG1vZHVsZSwgYXR0ciwgKCkpOgorICAgICAgICAgICAgICAgIHlpZWxkIHRlc3QKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC51c2VfcmVzb3VyY2VzID0gWydndWknXQorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqZ2V0X3Rlc3RzKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3J1bnRrdGVzdHMucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC9ydW50a3Rlc3RzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDMwYzZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC9ydW50a3Rlc3RzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3J1bnRrdGVzdHMucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC9ydW50a3Rlc3RzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDMwYzZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC9ydW50a3Rlc3RzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYzdhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYzdhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF9sb2FkdGsucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2xvYWR0ay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmM2NDBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF9sb2FkdGsucHkKQEAgLTAsMCArMSw0NSBAQAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIFRraW50ZXIgaW1wb3J0IFRjbCwgVGNsRXJyb3IKKwordGVzdF9zdXBwb3J0LnJlcXVpcmVzKCdndWknKQorCitjbGFzcyBUa0xvYWRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEB1bml0dGVzdC5za2lwSWYoJ0RJU1BMQVknIG5vdCBpbiBvcy5lbnZpcm9uLCAnTm8gJERJU1BMQVkgc2V0LicpCisgICAgZGVmIHRlc3RMb2FkVGsoc2VsZik6CisgICAgICAgIHRjbCA9IFRjbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yLHRjbC53aW5mb19nZW9tZXRyeSkKKyAgICAgICAgdGNsLmxvYWR0aygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzF4MSswKzAnLCB0Y2wud2luZm9fZ2VvbWV0cnkoKSkKKyAgICAgICAgdGNsLmRlc3Ryb3koKQorCisgICAgZGVmIHRlc3RMb2FkVGtGYWlsdXJlKHNlbGYpOgorICAgICAgICBvbGRfZGlzcGxheSA9IE5vbmUKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoKCd3aW4nLCAnZGFyd2luJywgJ2N5Z3dpbicpKToKKyAgICAgICAgICAgICMgbm8gZmFpbHVyZSBwb3NzaWJsZSBvbiB3aW5kb3dzPworCisgICAgICAgICAgICAjIFhYWCBNYXliZSBvbiB0ayBvbGRlciB0aGFuIDguNC4xMyBpdCB3b3VsZCBiZSBwb3NzaWJsZSwKKyAgICAgICAgICAgICMgc2VlIHRraW50ZXIuaC4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52OgorICAgICAgICAgICAgaWYgJ0RJU1BMQVknIGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgZGVsIGVudlsnRElTUExBWSddCisgICAgICAgICAgICAgICAgIyBvbiBzb21lIHBsYXRmb3JtcywgZGVsZXRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICAgICAgICAgICAgIyBkb2Vzbid0IGFjdHVhbGx5IGNhcnJ5IHRocm91Z2ggdG8gdGhlIHByb2Nlc3MgbGV2ZWwKKyAgICAgICAgICAgICAgICAjIGJlY2F1c2UgdGhleSBkb24ndCBzdXBwb3J0IHVuc2V0ZW52CisgICAgICAgICAgICAgICAgIyBJZiB0aGF0J3MgdGhlIGNhc2UsIGFib3J0LgorICAgICAgICAgICAgICAgIGRpc3BsYXkgPSBvcy5wb3BlbignZWNobyAkRElTUExBWScpLnJlYWQoKS5zdHJpcCgpCisgICAgICAgICAgICAgICAgaWYgZGlzcGxheToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHRjbCA9IFRjbCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvciwgdGNsLndpbmZvX2dlb21ldHJ5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsIHRjbC5sb2FkdGspCisKK3Rlc3RzX2d1aSA9IChUa0xvYWRUZXN0LCApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHNfZ3VpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF9sb2FkdGsucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF9sb2FkdGsucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYjAwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2xvYWR0ay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF9sb2FkdGsucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF9sb2FkdGsucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYjAwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2xvYWR0ay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF90ZXh0LnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF90ZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YzA4YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHkKQEAgLTAsMCArMSwzOSBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgVGtpbnRlcgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMsIHJ1bl91bml0dGVzdAorZnJvbSB0dGsgaW1wb3J0IHNldHVwX21hc3RlcgorCityZXF1aXJlcygnZ3VpJykKKworY2xhc3MgVGV4dFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnJvb3QgPSBzZXR1cF9tYXN0ZXIoKQorICAgICAgICBzZWxmLnRleHQgPSBUa2ludGVyLlRleHQoc2VsZi5yb290KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRleHQuZGVzdHJveSgpCisKKworICAgIGRlZiB0ZXN0X3NlYXJjaChzZWxmKToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorCisgICAgICAgICMgcGF0dGVybiBhbmQgaW5kZXggYXJlIG9ibGlnYXRvcnkgYXJndW1lbnRzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCB0ZXh0LnNlYXJjaCwgTm9uZSwgJzEuMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHRleHQuc2VhcmNoLCAnYScsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHRleHQuc2VhcmNoLCBOb25lLCBOb25lKQorCisgICAgICAgICMgSW52YWxpZCB0ZXh0IGluZGV4LgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCB0ZXh0LnNlYXJjaCwgJycsIDApCisKKyAgICAgICAgIyBDaGVjayBpZiB3ZSBhcmUgZ2V0dGluZyB0aGUgaW5kaWNlcyBhcyBzdHJpbmdzIC0tIHlvdSBhcmUgbGlrZWx5CisgICAgICAgICMgdG8gZ2V0IFRjbF9PYmogdW5kZXIgVGsgOC41IGlmIFRraW50ZXIgZG9lc24ndCBjb252ZXJ0IGl0LgorICAgICAgICB0ZXh0Lmluc2VydCgnMS4wJywgJ2hpLXRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuc2VhcmNoKCctdGVzdCcsICcxLjAnLCAnZW5kJyksICcxLjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuc2VhcmNoKCd0ZXN0JywgJzEuMCcsICdlbmQnKSwgJzEuMycpCisKKwordGVzdHNfZ3VpID0gKFRleHRUZXN0LCApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0c19ndWkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF90ZXh0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDg3ZmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF90ZXh0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF90ZXh0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDg3ZmQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvdGVzdF90ZXh0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmIzMWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmIzMWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay9zdXBwb3J0LnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay9zdXBwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZTc4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3N1cHBvcnQucHkKQEAgLTAsMCArMSwzMyBAQAoraW1wb3J0IFRraW50ZXIKKworZGVmIGdldF90a19yb290KCk6CisgICAgdHJ5OgorICAgICAgICByb290ID0gVGtpbnRlci5fZGVmYXVsdF9yb290CisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAjIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2FibGUgZGVmYXVsdCByb290IGluIFRraW50ZXIsIGFsdGhvdWdoCisgICAgICAgICMgSSBoYXZlbid0IHNlZW4gcGVvcGxlIGRvaW5nIGl0IChidXQgYXBwYXJlbnRseSBzb21lb25lIGRpZCBpdAorICAgICAgICAjIGhlcmUpLgorICAgICAgICByb290ID0gTm9uZQorCisgICAgaWYgcm9vdCBpcyBOb25lOgorICAgICAgICAjIGNyZWF0ZSBhIG5ldyBtYXN0ZXIgb25seSBpZiB0aGVyZSBpc24ndCBvbmUgYWxyZWFkeQorICAgICAgICByb290ID0gVGtpbnRlci5UaygpCisKKyAgICByZXR1cm4gcm9vdAorCitkZWYgcm9vdF9kZWljb25pZnkoKToKKyAgICByb290ID0gZ2V0X3RrX3Jvb3QoKQorICAgIHJvb3QuZGVpY29uaWZ5KCkKKworZGVmIHJvb3Rfd2l0aGRyYXcoKToKKyAgICByb290ID0gZ2V0X3RrX3Jvb3QoKQorICAgIHJvb3Qud2l0aGRyYXcoKQorCisKK2RlZiBzaW11bGF0ZV9tb3VzZV9jbGljayh3aWRnZXQsIHgsIHkpOgorICAgICIiIkdlbmVyYXRlIHByb3BlciBldmVudHMgdG8gY2xpY2sgYXQgdGhlIHgsIHkgcG9zaXRpb24gKHRyaWVzIHRvIGFjdAorICAgIGxpa2UgYW4gWCBzZXJ2ZXIpLiIiIgorICAgIHdpZGdldC5ldmVudF9nZW5lcmF0ZSgnPEVudGVyPicsIHg9MCwgeT0wKQorICAgIHdpZGdldC5ldmVudF9nZW5lcmF0ZSgnPE1vdGlvbj4nLCB4PXgsIHk9eSkKKyAgICB3aWRnZXQuZXZlbnRfZ2VuZXJhdGUoJzxCdXR0b25QcmVzcy0xPicsIHg9eCwgeT15KQorICAgIHdpZGdldC5ldmVudF9nZW5lcmF0ZSgnPEJ1dHRvblJlbGVhc2UtMT4nLCB4PXgsIHk9eSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvc3VwcG9ydC5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3N1cHBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDY4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3N1cHBvcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvc3VwcG9ydC5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3N1cHBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDY4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3N1cHBvcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9leHRlbnNpb25zLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2V4dGVuc2lvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU0NmNiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9leHRlbnNpb25zLnB5CkBAIC0wLDAgKzEsMjc0IEBACitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBUa2ludGVyCitpbXBvcnQgdHRrCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCByZXF1aXJlcywgcnVuX3VuaXR0ZXN0CisKK2ltcG9ydCBzdXBwb3J0CisKK3JlcXVpcmVzKCdndWknKQorCitjbGFzcyBMYWJlbGVkU2NhbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwcG9ydC5yb290X2RlaWNvbmlmeSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN1cHBvcnQucm9vdF93aXRoZHJhdygpCisKKworICAgIGRlZiB0ZXN0X3dpZGdldF9kZXN0cm95KHNlbGYpOgorICAgICAgICAjIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB2YXJpYWJsZQorICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZSgpCisgICAgICAgIHZhciA9IHguX3ZhcmlhYmxlLl9uYW1lCisgICAgICAgIHguZGVzdHJveSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHgudGsuZ2xvYmFsZ2V0dmFyLCB2YXIpCisKKyAgICAgICAgIyBtYW51YWxseSBjcmVhdGVkIHZhcmlhYmxlCisgICAgICAgIG15dmFyID0gVGtpbnRlci5Eb3VibGVWYXIoKQorICAgICAgICBuYW1lID0gbXl2YXIuX25hbWUKKyAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUodmFyaWFibGU9bXl2YXIpCisgICAgICAgIHguZGVzdHJveSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC50ay5nbG9iYWxnZXR2YXIobmFtZSksIG15dmFyLmdldCgpKQorICAgICAgICBkZWwgbXl2YXIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgeC50ay5nbG9iYWxnZXR2YXIsIG5hbWUpCisKKyAgICAgICAgIyBjaGVja2luZyB0aGF0IHRoZSB0cmFjaW5nIGNhbGxiYWNrIGlzIHByb3Blcmx5IHJlbW92ZWQKKyAgICAgICAgbXl2YXIgPSBUa2ludGVyLkludFZhcigpCisgICAgICAgICMgTGFiZWxlZFNjYWxlIHdpbGwgc3RhcnQgdHJhY2luZyBteXZhcgorICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZSh2YXJpYWJsZT1teXZhcikKKyAgICAgICAgeC5kZXN0cm95KCkKKyAgICAgICAgIyBVbmxlc3MgdGhlIHRyYWNpbmcgY2FsbGJhY2sgd2FzIHJlbW92ZWQsIGNyZWF0aW5nIGEgbmV3CisgICAgICAgICMgTGFiZWxlZFNjYWxlIHdpdGggdGhlIHNhbWUgdmFyIHdpbGwgY2F1c2UgYW4gZXJyb3Igbm93LiBUaGlzCisgICAgICAgICMgaGFwcGVucyBiZWNhdXNlIHRoZSB2YXJpYWJsZSB3aWxsIGJlIHNldCB0byAocG9zc2libHkpIGEgbmV3CisgICAgICAgICMgdmFsdWUgd2hpY2ggY2F1c2VzIHRoZSB0cmFjaW5nIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBhbmQgdGhlbgorICAgICAgICAjIGl0IHRyaWVzIGNhbGxpbmcgaW5zdGFuY2UgYXR0cmlidXRlcyBub3QgeWV0IGRlZmluZWQuCisgICAgICAgIHR0ay5MYWJlbGVkU2NhbGUodmFyaWFibGU9bXl2YXIpCisgICAgICAgIGlmIGhhc2F0dHIoc3lzLCAnbGFzdF90eXBlJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHN5cy5sYXN0X3R5cGUgPT0gVGtpbnRlci5UY2xFcnJvcikKKworCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6YXRpb24oc2VsZik6CisgICAgICAgICMgbWFzdGVyIHBhc3NpbmcKKyAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgubWFzdGVyLCBUa2ludGVyLl9kZWZhdWx0X3Jvb3QpCisgICAgICAgIHguZGVzdHJveSgpCisgICAgICAgIG1hc3RlciA9IFRraW50ZXIuRnJhbWUoKQorICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZShtYXN0ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5tYXN0ZXIsIG1hc3RlcikKKyAgICAgICAgeC5kZXN0cm95KCkKKworICAgICAgICAjIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uL3Bhc3NpbmcKKyAgICAgICAgcGFzc2VkX2V4cGVjdGVkID0gKCgyLjUsIDIpLCAoJzAnLCAwKSwgKDAsIDApLCAoMTAsIDEwKSwKKyAgICAgICAgICAgICgtMSwgLTEpLCAoc3lzLm1heGludCArIDEsIHN5cy5tYXhpbnQgKyAxKSkKKyAgICAgICAgZm9yIHBhaXIgaW4gcGFzc2VkX2V4cGVjdGVkOgorICAgICAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoZnJvbV89cGFpclswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC52YWx1ZSwgcGFpclsxXSkKKyAgICAgICAgICAgIHguZGVzdHJveSgpCisgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKGZyb21fPScyLjUnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB4Ll92YXJpYWJsZS5nZXQpCisgICAgICAgIHguZGVzdHJveSgpCisgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKGZyb21fPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHguX3ZhcmlhYmxlLmdldCkKKyAgICAgICAgeC5kZXN0cm95KCkKKyAgICAgICAgIyB2YXJpYWJsZSBzaG91bGQgaGF2ZSBpdHMgZGVmYXVsdCB2YWx1ZSBzZXQgdG8gdGhlIGZyb21fIHZhbHVlCisgICAgICAgIG15dmFyID0gVGtpbnRlci5Eb3VibGVWYXIodmFsdWU9MjApCisgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKHZhcmlhYmxlPW15dmFyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgudmFsdWUsIDApCisgICAgICAgIHguZGVzdHJveSgpCisgICAgICAgICMgY2hlY2sgdGhhdCBpdCBpcyByZWFsbHkgdXNpbmcgYSBEb3VibGVWYXIKKyAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUodmFyaWFibGU9bXl2YXIsIGZyb21fPTAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnZhbHVlLCAwLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fdmFyaWFibGUuX25hbWUsIG15dmFyLl9uYW1lKQorICAgICAgICB4LmRlc3Ryb3koKQorCisgICAgICAgICMgd2lkZ2V0IHBvc2l0aW9ubWVudAorICAgICAgICBkZWYgY2hlY2tfcG9zaXRpb25zKHNjYWxlLCBzY2FsZV9wb3MsIGxhYmVsLCBsYWJlbF9wb3MpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzY2FsZS5wYWNrX2luZm8oKVsnc2lkZSddLCBzY2FsZV9wb3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxhYmVsLnBsYWNlX2luZm8oKVsnYW5jaG9yJ10sIGxhYmVsX3BvcykKKyAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoY29tcG91bmQ9J3RvcCcpCisgICAgICAgIGNoZWNrX3Bvc2l0aW9ucyh4LnNjYWxlLCAnYm90dG9tJywgeC5sYWJlbCwgJ24nKQorICAgICAgICB4LmRlc3Ryb3koKQorICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZShjb21wb3VuZD0nYm90dG9tJykKKyAgICAgICAgY2hlY2tfcG9zaXRpb25zKHguc2NhbGUsICd0b3AnLCB4LmxhYmVsLCAncycpCisgICAgICAgIHguZGVzdHJveSgpCisgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKGNvbXBvdW5kPSd1bmtub3duJykgIyBpbnZlcnQgZGVmYXVsdCBwb3NpdGlvbnMKKyAgICAgICAgY2hlY2tfcG9zaXRpb25zKHguc2NhbGUsICd0b3AnLCB4LmxhYmVsLCAncycpCisgICAgICAgIHguZGVzdHJveSgpCisgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKCkgIyB0YWtlIGRlZmF1bHQgcG9zaXRpb25zCisgICAgICAgIGNoZWNrX3Bvc2l0aW9ucyh4LnNjYWxlLCAnYm90dG9tJywgeC5sYWJlbCwgJ24nKQorICAgICAgICB4LmRlc3Ryb3koKQorCisgICAgICAgICMgZXh0cmEsIGFuZCBpbnZhbGlkLCBrd2FyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgdHRrLkxhYmVsZWRTY2FsZSwgYT0nYicpCisKKworICAgIGRlZiB0ZXN0X2hvcml6b250YWxfcmFuZ2Uoc2VsZik6CisgICAgICAgIGxzY2FsZSA9IHR0ay5MYWJlbGVkU2NhbGUoZnJvbV89MCwgdG89MTApCisgICAgICAgIGxzY2FsZS5wYWNrKCkKKyAgICAgICAgbHNjYWxlLndhaXRfdmlzaWJpbGl0eSgpCisgICAgICAgIGxzY2FsZS51cGRhdGUoKQorCisgICAgICAgIGxpbmZvXzEgPSBsc2NhbGUubGFiZWwucGxhY2VfaW5mbygpCisgICAgICAgIHByZXZfeGNvb3JkID0gbHNjYWxlLnNjYWxlLmNvb3JkcygpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJldl94Y29vcmQsIGludChsaW5mb18xWyd4J10pKQorICAgICAgICAjIGNoYW5nZSByYW5nZSB0bzogZnJvbSAtNSB0byA1LiBUaGlzIHNob3VsZCBjaGFuZ2UgdGhlIHggY29vcmQgb2YKKyAgICAgICAgIyB0aGUgc2NhbGUgd2lkZ2V0LCBzaW5jZSAwIGlzIGF0IHRoZSBtaWRkbGUgb2YgdGhlIG5ldworICAgICAgICAjIHJhbmdlLgorICAgICAgICBsc2NhbGUuc2NhbGUuY29uZmlndXJlKGZyb21fPS01LCB0bz01KQorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgdXBkYXRlIGlzIG5lZWRlZCBzaW5jZSB0aGUgdGVzdCBkb2Vzbid0IHVzZSBtYWlubG9vcCwKKyAgICAgICAgIyBhdCB0aGUgc2FtZSB0aW1lIHRoaXMgc2hvdWxkbid0IGFmZmVjdCB0ZXN0IG91dGNvbWUKKyAgICAgICAgbHNjYWxlLnVwZGF0ZSgpCisgICAgICAgIGN1cnJfeGNvb3JkID0gbHNjYWxlLnNjYWxlLmNvb3JkcygpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcmV2X3hjb29yZCAhPSBjdXJyX3hjb29yZCkKKyAgICAgICAgIyB0aGUgbGFiZWwgd2lkZ2V0IHNob3VsZCBoYXZlIGJlZW4gcmVwb3NpdGlvbmVkIHRvbworICAgICAgICBsaW5mb18yID0gbHNjYWxlLmxhYmVsLnBsYWNlX2luZm8oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzY2FsZS5sYWJlbFsndGV4dCddLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1cnJfeGNvb3JkLCBpbnQobGluZm9fMlsneCddKSkKKyAgICAgICAgIyBjaGFuZ2UgdGhlIHJhbmdlIGJhY2sKKyAgICAgICAgbHNjYWxlLnNjYWxlLmNvbmZpZ3VyZShmcm9tXz0wLCB0bz0xMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByZXZfeGNvb3JkICE9IGN1cnJfeGNvb3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByZXZfeGNvb3JkLCBpbnQobGluZm9fMVsneCddKSkKKworICAgICAgICBsc2NhbGUuZGVzdHJveSgpCisKKworICAgIGRlZiB0ZXN0X3ZhcmlhYmxlX2NoYW5nZShzZWxmKToKKyAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoKQorICAgICAgICB4LnBhY2soKQorICAgICAgICB4LndhaXRfdmlzaWJpbGl0eSgpCisgICAgICAgIHgudXBkYXRlKCkKKworICAgICAgICBjdXJyX3hjb29yZCA9IHguc2NhbGUuY29vcmRzKClbMF0KKyAgICAgICAgbmV3dmFsID0geC52YWx1ZSArIDEKKyAgICAgICAgeC52YWx1ZSA9IG5ld3ZhbAorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgdXBkYXRlIGlzIG5lZWRlZCBzaW5jZSB0aGUgdGVzdCBkb2Vzbid0IHVzZSBtYWlubG9vcCwKKyAgICAgICAgIyBhdCB0aGUgc2FtZSB0aW1lIHRoaXMgc2hvdWxkbid0IGFmZmVjdCB0ZXN0IG91dGNvbWUKKyAgICAgICAgeC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgubGFiZWxbJ3RleHQnXSwgbmV3dmFsKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5zY2FsZS5jb29yZHMoKVswXSA+IGN1cnJfeGNvb3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguc2NhbGUuY29vcmRzKClbMF0sCisgICAgICAgICAgICBpbnQoeC5sYWJlbC5wbGFjZV9pbmZvKClbJ3gnXSkpCisKKyAgICAgICAgIyB2YWx1ZSBvdXRzaWRlIHJhbmdlCisgICAgICAgIHgudmFsdWUgPSB4LnNjYWxlWyd0byddICsgMSAjIG5vIGNoYW5nZXMgc2hvdWxkbid0IGhhcHBlbgorICAgICAgICB4LnVwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5sYWJlbFsndGV4dCddLCBuZXd2YWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zY2FsZS5jb29yZHMoKVswXSwKKyAgICAgICAgICAgIGludCh4LmxhYmVsLnBsYWNlX2luZm8oKVsneCddKSkKKworICAgICAgICB4LmRlc3Ryb3koKQorCisKKyAgICBkZWYgdGVzdF9yZXNpemUoc2VsZik6CisgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKCkKKyAgICAgICAgeC5wYWNrKGV4cGFuZD1UcnVlLCBmaWxsPSdib3RoJykKKyAgICAgICAgeC53YWl0X3Zpc2liaWxpdHkoKQorICAgICAgICB4LnVwZGF0ZSgpCisKKyAgICAgICAgd2lkdGgsIGhlaWdodCA9IHgubWFzdGVyLndpbmZvX3dpZHRoKCksIHgubWFzdGVyLndpbmZvX2hlaWdodCgpCisgICAgICAgIHdpZHRoX25ldywgaGVpZ2h0X25ldyA9IHdpZHRoICogMiwgaGVpZ2h0ICogMgorCisgICAgICAgIHgudmFsdWUgPSAzCisgICAgICAgIHgudXBkYXRlKCkKKyAgICAgICAgeC5tYXN0ZXIud21fZ2VvbWV0cnkoIiVkeCVkIiAlICh3aWR0aF9uZXcsIGhlaWdodF9uZXcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCh4LmxhYmVsLnBsYWNlX2luZm8oKVsneCddKSwKKyAgICAgICAgICAgIHguc2NhbGUuY29vcmRzKClbMF0pCisKKyAgICAgICAgIyBSZXNldCBnZW9tZXRyeQorICAgICAgICB4Lm1hc3Rlci53bV9nZW9tZXRyeSgiJWR4JWQiICUgKHdpZHRoLCBoZWlnaHQpKQorICAgICAgICB4LmRlc3Ryb3koKQorCisKK2NsYXNzIE9wdGlvbk1lbnVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwcG9ydC5yb290X2RlaWNvbmlmeSgpCisgICAgICAgIHNlbGYudGV4dHZhciA9IFRraW50ZXIuU3RyaW5nVmFyKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZGVsIHNlbGYudGV4dHZhcgorICAgICAgICBzdXBwb3J0LnJvb3Rfd2l0aGRyYXcoKQorCisKKyAgICBkZWYgdGVzdF93aWRnZXRfZGVzdHJveShzZWxmKToKKyAgICAgICAgdmFyID0gVGtpbnRlci5TdHJpbmdWYXIoKQorICAgICAgICBvcHRtZW51ID0gdHRrLk9wdGlvbk1lbnUoTm9uZSwgdmFyKQorICAgICAgICBuYW1lID0gdmFyLl9uYW1lCisgICAgICAgIG9wdG1lbnUudXBkYXRlX2lkbGV0YXNrcygpCisgICAgICAgIG9wdG1lbnUuZGVzdHJveSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0bWVudS50ay5nbG9iYWxnZXR2YXIobmFtZSksIHZhci5nZXQoKSkKKyAgICAgICAgZGVsIHZhcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBvcHRtZW51LnRrLmdsb2JhbGdldHZhciwgbmFtZSkKKworCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6YXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsCisgICAgICAgICAgICB0dGsuT3B0aW9uTWVudSwgTm9uZSwgc2VsZi50ZXh0dmFyLCBpbnZhbGlkPSd0aGluZycpCisKKyAgICAgICAgb3B0bWVudSA9IHR0ay5PcHRpb25NZW51KE5vbmUsIHNlbGYudGV4dHZhciwgJ2InLCAnYScsICdiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRtZW51Ll92YXJpYWJsZS5nZXQoKSwgJ2InKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcHRtZW51WydtZW51J10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcHRtZW51Wyd0ZXh0dmFyaWFibGUnXSkKKworICAgICAgICBvcHRtZW51LmRlc3Ryb3koKQorCisKKyAgICBkZWYgdGVzdF9tZW51KHNlbGYpOgorICAgICAgICBpdGVtcyA9ICgnYScsICdiJywgJ2MnKQorICAgICAgICBkZWZhdWx0ID0gJ2EnCisgICAgICAgIG9wdG1lbnUgPSB0dGsuT3B0aW9uTWVudShOb25lLCBzZWxmLnRleHR2YXIsIGRlZmF1bHQsICppdGVtcykKKyAgICAgICAgZm91bmRfZGVmYXVsdCA9IEZhbHNlCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgorICAgICAgICAgICAgdmFsdWUgPSBvcHRtZW51WydtZW51J10uZW50cnljZ2V0KGksICd2YWx1ZScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCBpdGVtc1tpXSkKKyAgICAgICAgICAgIGlmIHZhbHVlID09IGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZm91bmRfZGVmYXVsdCA9IFRydWUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kX2RlZmF1bHQpCisgICAgICAgIG9wdG1lbnUuZGVzdHJveSgpCisKKyAgICAgICAgIyBkZWZhdWx0IHNob3VsZG4ndCBiZSBpbiBtZW51IGlmIGl0IGlzIG5vdCBwYXJ0IG9mIHZhbHVlcworICAgICAgICBkZWZhdWx0ID0gJ2QnCisgICAgICAgIG9wdG1lbnUgPSB0dGsuT3B0aW9uTWVudShOb25lLCBzZWxmLnRleHR2YXIsIGRlZmF1bHQsICppdGVtcykKKyAgICAgICAgY3VyciA9IE5vbmUKKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxhc3QsIGN1cnIgPSBjdXJyLCBvcHRtZW51WydtZW51J10uZW50cnljb25maWd1cmUoaSwgJ3ZhbHVlJykKKyAgICAgICAgICAgIGlmIGxhc3QgPT0gY3VycjoKKyAgICAgICAgICAgICAgICAjIG5vIG1vcmUgbWVudSBlbnRyaWVzCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY3VyciA9PSBkZWZhdWx0KQorICAgICAgICAgICAgaSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgbGVuKGl0ZW1zKSkKKworICAgICAgICAjIGNoZWNrIHRoYXQgdmFyaWFibGUgaXMgdXBkYXRlZCBjb3JyZWN0bHkKKyAgICAgICAgb3B0bWVudS5wYWNrKCkKKyAgICAgICAgb3B0bWVudS53YWl0X3Zpc2liaWxpdHkoKQorICAgICAgICBvcHRtZW51WydtZW51J10uaW52b2tlKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0bWVudS5fdmFyaWFibGUuZ2V0KCksIGl0ZW1zWzBdKQorCisgICAgICAgICMgY2hhbmdpbmcgdG8gYW4gaW52YWxpZCBpbmRleCBzaG91bGRuJ3QgY2hhbmdlIHRoZSB2YXJpYWJsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBvcHRtZW51WydtZW51J10uaW52b2tlLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRtZW51Ll92YXJpYWJsZS5nZXQoKSwgaXRlbXNbMF0pCisKKyAgICAgICAgb3B0bWVudS5kZXN0cm95KCkKKworICAgICAgICAjIHNwZWNpZnlpbmcgYSBjYWxsYmFjaworICAgICAgICBzdWNjZXNzID0gW10KKyAgICAgICAgZGVmIGNiX3Rlc3QoaXRlbSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW0sIGl0ZW1zWzFdKQorICAgICAgICAgICAgc3VjY2Vzcy5hcHBlbmQoVHJ1ZSkKKyAgICAgICAgb3B0bWVudSA9IHR0ay5PcHRpb25NZW51KE5vbmUsIHNlbGYudGV4dHZhciwgJ2EnLCBjb21tYW5kPWNiX3Rlc3QsCisgICAgICAgICAgICAqaXRlbXMpCisgICAgICAgIG9wdG1lbnVbJ21lbnUnXS5pbnZva2UoMSkKKyAgICAgICAgaWYgbm90IHN1Y2Nlc3M6CisgICAgICAgICAgICBzZWxmLmZhaWwoIk1lbnUgY2FsbGJhY2sgbm90IGludm9rZWQiKQorCisgICAgICAgIG9wdG1lbnUuZGVzdHJveSgpCisKKwordGVzdHNfZ3VpID0gKExhYmVsZWRTY2FsZVRlc3QsIE9wdGlvbk1lbnVUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCgqdGVzdHNfZ3VpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2V4dGVuc2lvbnMucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2V4dGVuc2lvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYmE3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZXh0ZW5zaW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2V4dGVuc2lvbnMucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2V4dGVuc2lvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYmE3OGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZXh0ZW5zaW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmMDhhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHkKQEAgLTAsMCArMSw0NTggQEAKKyMgLSotIGVuY29kaW5nOiB1dGYtOCAtKi0KK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHR0aworCitjbGFzcyBNb2NrVGNsT2JqKG9iamVjdCk6CisgICAgdHlwZW5hbWUgPSAndGVzdCcKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiB1bmljb2RlKHNlbGYudmFsKQorCisKK2NsYXNzIE1vY2tTdGF0ZVNwZWMob2JqZWN0KToKKyAgICB0eXBlbmFtZSA9ICdTdGF0ZVNwZWMnCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLnZhbCA9IGFyZ3MKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJyAnLmpvaW4oc2VsZi52YWwpCisKKworY2xhc3MgSW50ZXJuYWxGdW5jdGlvbnNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9vcHRkaWN0KHNlbGYpOgorICAgICAgICBkZWYgY2hlY2tfYWdhaW5zdChmbXRfb3B0cywgcmVzdWx0KToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihmbXRfb3B0cyksIDIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnBvcChmbXRfb3B0c1tpXSksIGZtdF9vcHRzW2kgKyAxXSkKKyAgICAgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlc3VsdCBzdGlsbCBnb3QgZWxlbWVudHM6ICVzIiAlIHJlc3VsdCkKKworICAgICAgICAjIHBhc3NpbmcgYW4gZW1wdHkgZGljdCBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IG9iamVjdCAodHVwbGUgaGVyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0dGsuX2Zvcm1hdF9vcHRkaWN0KHt9KSkKKworICAgICAgICAjIGNoZWNrIGxpc3QgZm9ybWF0dGluZworICAgICAgICBjaGVja19hZ2FpbnN0KAorICAgICAgICAgICAgdHRrLl9mb3JtYXRfb3B0ZGljdCh7J2ZnJzogJ2JsdWUnLCAncGFkZGluZyc6IFsxLCAyLCAzLCA0XX0pLAorICAgICAgICAgICAgeyctZmcnOiAnYmx1ZScsICctcGFkZGluZyc6ICcxIDIgMyA0J30pCisKKyAgICAgICAgIyBjaGVjayB0dXBsZSBmb3JtYXR0aW5nIChzYW1lIGFzIGxpc3QpCisgICAgICAgIGNoZWNrX2FnYWluc3QoCisgICAgICAgICAgICB0dGsuX2Zvcm1hdF9vcHRkaWN0KHsndGVzdCc6ICgxLCAyLCAnJywgMCl9KSwKKyAgICAgICAgICAgIHsnLXRlc3QnOiAnMSAyIHt9IDAnfSkKKworICAgICAgICAjIGNoZWNrIHVudG91Y2hlZCB2YWx1ZXMKKyAgICAgICAgY2hlY2tfYWdhaW5zdCgKKyAgICAgICAgICAgIHR0ay5fZm9ybWF0X29wdGRpY3Qoeyd0ZXN0JzogeydsZWZ0JzogJ2FzIGlzJ319KSwKKyAgICAgICAgICAgIHsnLXRlc3QnOiB7J2xlZnQnOiAnYXMgaXMnfX0pCisKKyAgICAgICAgIyBjaGVjayBzY3JpcHQgZm9ybWF0dGluZworICAgICAgICBjaGVja19hZ2FpbnN0KAorICAgICAgICAgICAgdHRrLl9mb3JtYXRfb3B0ZGljdCgKKyAgICAgICAgICAgICAgICB7J3Rlc3QnOiBbMSwgLTEsICcnLCAnMm0nLCAwXSwgJ3Rlc3QyJzogMywKKyAgICAgICAgICAgICAgICAgJ3Rlc3QzJzogJycsICd0ZXN0NCc6ICdhYmMgZGVmJywKKyAgICAgICAgICAgICAgICAgJ3Rlc3Q1JzogJyJhYmMiJywgJ3Rlc3Q2JzogJ3t9JywKKyAgICAgICAgICAgICAgICAgJ3Rlc3Q3JzogJ30gLXNwYW0geyd9LCBzY3JpcHQ9VHJ1ZSksCisgICAgICAgICAgICB7Jy10ZXN0JzogJ3sxIC0xIHt9IDJtIDB9JywgJy10ZXN0Mic6ICczJywKKyAgICAgICAgICAgICAnLXRlc3QzJzogJ3t9JywgJy10ZXN0NCc6ICd7YWJjIGRlZn0nLAorICAgICAgICAgICAgICctdGVzdDUnOiAneyJhYmMifScsICctdGVzdDYnOiByJ1x7XH0nLAorICAgICAgICAgICAgICctdGVzdDcnOiByJ1x9XCAtc3BhbVwgXHsnfSkKKworICAgICAgICBvcHRzID0ge3UnzrHOss6zJzogVHJ1ZSwgdSfDoSc6IEZhbHNlfQorICAgICAgICBvcmlnX29wdHMgPSBvcHRzLmNvcHkoKQorICAgICAgICAjIGNoZWNrIGlmIGdpdmluZyB1bmljb2RlIGtleXMgaXMgZmluZQorICAgICAgICBjaGVja19hZ2FpbnN0KHR0ay5fZm9ybWF0X29wdGRpY3Qob3B0cyksIHt1Jy3Osc6yzrMnOiBUcnVlLCB1Jy3DoSc6IEZhbHNlfSkKKyAgICAgICAgIyBvcHRzIHNob3VsZCByZW1haW4gdW5jaGFuZ2VkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0cywgb3JpZ19vcHRzKQorCisgICAgICAgICMgcGFzc2luZyB2YWx1ZXMgd2l0aCBzcGFjZXMgaW5zaWRlIGEgdHVwbGUvbGlzdAorICAgICAgICBjaGVja19hZ2FpbnN0KAorICAgICAgICAgICAgdHRrLl9mb3JtYXRfb3B0ZGljdCgKKyAgICAgICAgICAgICAgICB7J29wdGlvbic6ICgnb25lIHR3bycsICd0aHJlZScpfSksCisgICAgICAgICAgICB7Jy1vcHRpb24nOiAne29uZSB0d299IHRocmVlJ30pCisgICAgICAgIGNoZWNrX2FnYWluc3QoCisgICAgICAgICAgICB0dGsuX2Zvcm1hdF9vcHRkaWN0KAorICAgICAgICAgICAgICAgIHsnb3B0aW9uJzogKCdvbmVcdHR3bycsICd0aHJlZScpfSksCisgICAgICAgICAgICB7Jy1vcHRpb24nOiAne29uZVx0dHdvfSB0aHJlZSd9KQorCisgICAgICAgICMgcGFzc2luZyBlbXB0eSBzdHJpbmdzIGluc2lkZSBhIHR1cGxlL2xpc3QKKyAgICAgICAgY2hlY2tfYWdhaW5zdCgKKyAgICAgICAgICAgIHR0ay5fZm9ybWF0X29wdGRpY3QoCisgICAgICAgICAgICAgICAgeydvcHRpb24nOiAoJycsICdvbmUnKX0pLAorICAgICAgICAgICAgeyctb3B0aW9uJzogJ3t9IG9uZSd9KQorCisgICAgICAgICMgcGFzc2luZyB2YWx1ZXMgd2l0aCBicmFjZXMgaW5zaWRlIGEgdHVwbGUvbGlzdAorICAgICAgICBjaGVja19hZ2FpbnN0KAorICAgICAgICAgICAgdHRrLl9mb3JtYXRfb3B0ZGljdCgKKyAgICAgICAgICAgICAgICB7J29wdGlvbic6ICgnb25lfSB7dHdvJywgJ3RocmVlJyl9KSwKKyAgICAgICAgICAgIHsnLW9wdGlvbic6IHInb25lXH1cIFx7dHdvIHRocmVlJ30pCisKKyAgICAgICAgIyBwYXNzaW5nIHF1b3RlZCBzdHJpbmdzIGluc2lkZSBhIHR1cGxlL2xpc3QKKyAgICAgICAgY2hlY2tfYWdhaW5zdCgKKyAgICAgICAgICAgIHR0ay5fZm9ybWF0X29wdGRpY3QoCisgICAgICAgICAgICAgICAgeydvcHRpb24nOiAoJyJvbmUiJywgJ3R3bycpfSksCisgICAgICAgICAgICB7Jy1vcHRpb24nOiAneyJvbmUifSB0d28nfSkKKyAgICAgICAgY2hlY2tfYWdhaW5zdCgKKyAgICAgICAgICAgIHR0ay5fZm9ybWF0X29wdGRpY3QoCisgICAgICAgICAgICAgICAgeydvcHRpb24nOiAoJ3tvbmV9JywgJ3R3bycpfSksCisgICAgICAgICAgICB7Jy1vcHRpb24nOiByJ1x7b25lXH0gdHdvJ30pCisKKyAgICAgICAgIyBpZ25vcmUgYW4gb3B0aW9uCisgICAgICAgIGFtb3VudF9vcHRzID0gbGVuKHR0ay5fZm9ybWF0X29wdGRpY3Qob3B0cywgaWdub3JlPSh1J8OhJykpKSAvLyAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW1vdW50X29wdHMsIGxlbihvcHRzKSAtIDEpCisKKyAgICAgICAgIyBpZ25vcmUgbm9uLWV4aXN0aW5nIG9wdGlvbnMKKyAgICAgICAgYW1vdW50X29wdHMgPSBsZW4odHRrLl9mb3JtYXRfb3B0ZGljdChvcHRzLCBpZ25vcmU9KHUnw6EnLCAnYicpKSkgLy8gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFtb3VudF9vcHRzLCBsZW4ob3B0cykgLSAxKQorCisgICAgICAgICMgaWdub3JlIGV2ZXJ5IG9wdGlvbgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHR0ay5fZm9ybWF0X29wdGRpY3Qob3B0cywgaWdub3JlPW9wdHMua2V5cygpKSkKKworCisgICAgZGVmIHRlc3RfZm9ybWF0X21hcGRpY3Qoc2VsZik6CisgICAgICAgIG9wdHMgPSB7J2EnOiBbKCdiJywgJ2MnLCAndmFsJyksICgnZCcsICdvdGhlcnZhbCcpLCAoJycsICdzaW5nbGUnKV19CisgICAgICAgIHJlc3VsdCA9IHR0ay5fZm9ybWF0X21hcGRpY3Qob3B0cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgbGVuKG9wdHMua2V5cygpKSAqIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoJy1hJywgJ3tiIGN9IHZhbCBkIG90aGVydmFsIHt9IHNpbmdsZScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X21hcGRpY3Qob3B0cywgc2NyaXB0PVRydWUpLAorICAgICAgICAgICAgKCctYScsICd7e2IgY30gdmFsIGQgb3RoZXJ2YWwge30gc2luZ2xlfScpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfbWFwZGljdCh7MjogW119KSwgKCctMicsICcnKSkKKworICAgICAgICBvcHRzID0ge3Unw7zDscOtxIfDs2TDqCc6IFsodSfDoScsIHUndsOjbCcpXX0KKyAgICAgICAgcmVzdWx0ID0gdHRrLl9mb3JtYXRfbWFwZGljdChvcHRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKHUnLcO8w7HDrcSHw7Nkw6gnLCB1J8OhIHbDo2wnKSkKKworICAgICAgICAjIGVtcHR5IHN0YXRlcworICAgICAgICB2YWxpZCA9IHsnb3B0JzogWygnJywgdScnLCAnaGknKV19CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfbWFwZGljdCh2YWxpZCksICgnLW9wdCcsICd7IH0gaGknKSkKKworICAgICAgICAjIHdoZW4gcGFzc2luZyBtdWx0aXBsZSBzdGF0ZXMsIHRoZXkgYWxsIG11c3QgYmUgc3RyaW5ncworICAgICAgICBpbnZhbGlkID0geydvcHQnOiBbKDEsIDIsICd2YWxpZCB2YWwnKV19CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHRrLl9mb3JtYXRfbWFwZGljdCwgaW52YWxpZCkKKyAgICAgICAgaW52YWxpZCA9IHsnb3B0JzogWyhbMV0sICcyJywgJ3ZhbGlkIHZhbCcpXX0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0dGsuX2Zvcm1hdF9tYXBkaWN0LCBpbnZhbGlkKQorICAgICAgICAjIGJ1dCB3aGVuIHBhc3NpbmcgYSBzaW5nbGUgc3RhdGUsIGl0IGNhbiBiZSBhbnl0aGluZworICAgICAgICB2YWxpZCA9IHsnb3B0JzogW1sxLCAndmFsdWUnXV19CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfbWFwZGljdCh2YWxpZCksICgnLW9wdCcsICcxIHZhbHVlJykpCisgICAgICAgICMgc3BlY2lhbCBhdHRlbnRpb24gdG8gc2luZ2xlIHN0YXRlcyB3aGljaCBldmFsdXRlIHRvIEZhbHNlCisgICAgICAgIGZvciBzdGF0ZXZhbCBpbiAoTm9uZSwgMCwgRmFsc2UsICcnLCBzZXQoKSk6ICMganVzdCBzb21lIHNhbXBsZXMKKyAgICAgICAgICAgIHZhbGlkID0geydvcHQnOiBbKHN0YXRldmFsLCAndmFsdWUnKV19CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X21hcGRpY3QodmFsaWQpLAorICAgICAgICAgICAgICAgICgnLW9wdCcsICd7fSB2YWx1ZScpKQorCisgICAgICAgICMgdmFsdWVzIG11c3QgYmUgaXRlcmFibGUKKyAgICAgICAgb3B0cyA9IHsnYSc6IE5vbmV9CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHRrLl9mb3JtYXRfbWFwZGljdCwgb3B0cykKKworICAgICAgICAjIGl0ZW1zIGluIHRoZSB2YWx1ZSBtdXN0IGhhdmUgc2l6ZSA+PSAyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHR0ay5fZm9ybWF0X21hcGRpY3QsCisgICAgICAgICAgICB7J2EnOiBbKCdpbnZhbGlkJywgKV19KQorCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfZWxlbWNyZWF0ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoTm9uZSksIChOb25lLCAoKSkpCisKKyAgICAgICAgIyMgVGVzdGluZyB0eXBlID0gaW1hZ2UKKyAgICAgICAgIyBpbWFnZSB0eXBlIGV4cGVjdHMgYXQgbGVhc3QgYW4gaW1hZ2UgbmFtZSwgc28gdGhpcyBzaG91bGQgcmFpc2UKKyAgICAgICAgIyBJbmRleEVycm9yIHNpbmNlIGl0IHRyaWVzIHRvIGFjY2VzcyB0aGUgaW5kZXggMCBvZiBhbiBlbXB0eSB0dXBsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlLCAnaW1hZ2UnKQorCisgICAgICAgICMgZG9uJ3QgZm9ybWF0IHJldHVybmVkIHZhbHVlcyBhcyBhIHRjbCBzY3JpcHQKKyAgICAgICAgIyBtaW5pbXVtIGFjY2VwdGFibGUgZm9yIGltYWdlIHR5cGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdpbWFnZScsIEZhbHNlLCAndGVzdCcpLAorICAgICAgICAgICAgKCJ0ZXN0ICIsICgpKSkKKyAgICAgICAgIyBzcGVjaWZ5aW5nIGEgc3RhdGUgc3BlYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2ltYWdlJywgRmFsc2UsICd0ZXN0JywKKyAgICAgICAgICAgICgnJywgJ2EnKSksICgidGVzdCB7fSBhIiwgKCkpKQorICAgICAgICAjIHN0YXRlIHNwZWMgd2l0aCBtdWx0aXBsZSBzdGF0ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdpbWFnZScsIEZhbHNlLCAndGVzdCcsCisgICAgICAgICAgICAoJ2EnLCAnYicsICdjJykpLCAoInRlc3Qge2EgYn0gYyIsICgpKSkKKyAgICAgICAgIyBzdGF0ZSBzcGVjIGFuZCBvcHRpb25zCisgICAgICAgIHJlcyA9IHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2ltYWdlJywgRmFsc2UsICd0ZXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EnLCAnYicpLCBhPSd4JywgYj0neScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzBdLCAidGVzdCBhIGIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChyZXNbMV0pLCB7Ii1hIiwgIngiLCAiLWIiLCAieSJ9KQorICAgICAgICAjIGZvcm1hdCByZXR1cm5lZCB2YWx1ZXMgYXMgYSB0Y2wgc2NyaXB0CisgICAgICAgICMgc3RhdGUgc3BlYyB3aXRoIG11bHRpcGxlIHN0YXRlcyBhbmQgYW4gb3B0aW9uIHdpdGggYSBtdWx0aXZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBUcnVlLCAndGVzdCcsCisgICAgICAgICAgICAoJ2EnLCAnYicsICdjJywgJ2QnKSwgeD1bMiwgM10pLCAoInt0ZXN0IHthIGIgY30gZH0iLCAiLXggezIgM30iKSkKKworICAgICAgICAjIyBUZXN0aW5nIHR5cGUgPSB2c2FwaQorICAgICAgICAjIHZzYXBpIHR5cGUgZXhwZWN0cyBhdCBsZWFzdCBhIGNsYXNzIG5hbWUgYW5kIGEgcGFydF9pZCwgc28gdGhpcworICAgICAgICAjIHNob3VsZCByYWlzZSBhbiBWYWx1ZUVycm9yIHNpbmNlIGl0IHRyaWVzIHRvIGdldCB0d28gZWxlbWVudHMgZnJvbQorICAgICAgICAjIGFuIGVtcHR5IHR1cGxlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUsICd2c2FwaScpCisKKyAgICAgICAgIyBkb24ndCBmb3JtYXQgcmV0dXJuZWQgdmFsdWVzIGFzIGEgdGNsIHNjcmlwdAorICAgICAgICAjIG1pbmltdW0gYWNjZXB0YWJsZSBmb3IgdnNhcGkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCd2c2FwaScsIEZhbHNlLCAnYScsICdiJyksCisgICAgICAgICAgICAoImEgYiAiLCAoKSkpCisgICAgICAgICMgbm93IHdpdGggYSBzdGF0ZSBzcGVjIHdpdGggbXVsdGlwbGUgc3RhdGVzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgndnNhcGknLCBGYWxzZSwgJ2EnLCAnYicsCisgICAgICAgICAgICAoJ2EnLCAnYicsICdjJykpLCAoImEgYiB7YSBifSBjIiwgKCkpKQorICAgICAgICAjIHN0YXRlIHNwZWMgYW5kIG9wdGlvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ3ZzYXBpJywgRmFsc2UsICdhJywgJ2InLAorICAgICAgICAgICAgKCdhJywgJ2InKSwgb3B0PSd4JyksICgiYSBiIGEgYiIsICgiLW9wdCIsICJ4IikpKQorICAgICAgICAjIGZvcm1hdCByZXR1cm5lZCB2YWx1ZXMgYXMgYSB0Y2wgc2NyaXB0CisgICAgICAgICMgc3RhdGUgc3BlYyB3aXRoIGEgbXVsdGl2YWx1ZSBhbmQgYW4gb3B0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgndnNhcGknLCBUcnVlLCAnYScsICdiJywKKyAgICAgICAgICAgICgnYScsICdiJywgWzEsIDJdKSwgb3B0PSd4JyksICgie2EgYiB7YSBifSB7MSAyfX0iLCAiLW9wdCB4IikpCisKKyAgICAgICAgIyBUZXN0aW5nIHR5cGUgPSBmcm9tCisgICAgICAgICMgZnJvbSB0eXBlIGV4cGVjdHMgYXQgbGVhc3QgYSB0eXBlIG5hbWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSwgJ2Zyb20nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnZnJvbScsIEZhbHNlLCAnYScpLAorICAgICAgICAgICAgKCdhJywgKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2Zyb20nLCBGYWxzZSwgJ2EnLCAnYicpLAorICAgICAgICAgICAgKCdhJywgKCdiJywgKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnZnJvbScsIFRydWUsICdhJywgJ2InKSwKKyAgICAgICAgICAgICgne2F9JywgJ2InKSkKKworCisgICAgZGVmIHRlc3RfZm9ybWF0X2xheW91dGxpc3Qoc2VsZik6CisgICAgICAgIGRlZiBzYW1wbGUoaW5kZW50PTAsIGluZGVudF9zaXplPTIpOgorICAgICAgICAgICAgcmV0dXJuIHR0ay5fZm9ybWF0X2xheW91dGxpc3QoCisgICAgICAgICAgICBbKCdhJywgeydvdGhlcic6IFsxLCAyLCAzXSwgJ2NoaWxkcmVuJzoKKyAgICAgICAgICAgICAgICBbKCdiJywgeydjaGlsZHJlbic6CisgICAgICAgICAgICAgICAgICAgIFsoJ2MnLCB7J2NoaWxkcmVuJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2QnLCB7J25pY2UnOiAnb3B0J30pXSwgJ3NvbWV0aGluZyc6ICgxLCAyKQorICAgICAgICAgICAgICAgICAgICB9KV0KKyAgICAgICAgICAgICAgICB9KV0KKyAgICAgICAgICAgIH0pXSwgaW5kZW50PWluZGVudCwgaW5kZW50X3NpemU9aW5kZW50X3NpemUpWzBdCisKKyAgICAgICAgZGVmIHNhbXBsZV9leHBlY3RlZChpbmRlbnQ9MCwgaW5kZW50X3NpemU9Mik6CisgICAgICAgICAgICBzcGFjZXMgPSBsYW1iZGEgYW1vdW50PTA6ICcgJyAqIChhbW91bnQgKyBpbmRlbnQpCisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgICIlc2EgLW90aGVyIHsxIDIgM30gLWNoaWxkcmVuIHtcbiIKKyAgICAgICAgICAgICAgICAiJXNiIC1jaGlsZHJlbiB7XG4iCisgICAgICAgICAgICAgICAgIiVzYyAtc29tZXRoaW5nIHsxIDJ9IC1jaGlsZHJlbiB7XG4iCisgICAgICAgICAgICAgICAgIiVzZCAtbmljZSBvcHRcbiIKKyAgICAgICAgICAgICAgICAiJXN9XG4iCisgICAgICAgICAgICAgICAgIiVzfVxuIgorICAgICAgICAgICAgICAgICIlc30iICUgKHNwYWNlcygpLCBzcGFjZXMoaW5kZW50X3NpemUpLAorICAgICAgICAgICAgICAgICAgICBzcGFjZXMoMiAqIGluZGVudF9zaXplKSwgc3BhY2VzKDMgKiBpbmRlbnRfc2l6ZSksCisgICAgICAgICAgICAgICAgICAgIHNwYWNlcygyICogaW5kZW50X3NpemUpLCBzcGFjZXMoaW5kZW50X3NpemUpLCBzcGFjZXMoKSkpCisKKyAgICAgICAgIyBlbXB0eSBsYXlvdXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0KFtdKVswXSwgJycpCisKKyAgICAgICAgIyBzbWFsbGVzdCAoYWZ0ZXIgYW4gZW1wdHkgb25lKSBhY2NlcHRhYmxlIGxheW91dAorICAgICAgICBzbWFsbGVzdCA9IHR0ay5fZm9ybWF0X2xheW91dGxpc3QoWygnYScsIE5vbmUpXSwgaW5kZW50PTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc21hbGxlc3QsCisgICAgICAgICAgICB0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0KFsoJ2EnLCAnJyldLCBpbmRlbnQ9MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc21hbGxlc3RbMF0sICdhJykKKworICAgICAgICAjIHRlc3RpbmcgaW5kZW50YXRpb24gbGV2ZWxzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FtcGxlKCksIHNhbXBsZV9leHBlY3RlZCgpKQorICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FtcGxlKGkpLCBzYW1wbGVfZXhwZWN0ZWQoaSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhbXBsZShpLCBpKSwgc2FtcGxlX2V4cGVjdGVkKGksIGkpKQorCisgICAgICAgICMgaW52YWxpZCBsYXlvdXQgZm9ybWF0LCBkaWZmZXJlbnQga2luZCBvZiBleGNlcHRpb25zIHdpbGwgYmUKKyAgICAgICAgIyByYWlzZWQKKworICAgICAgICAjIHBsYWluIHdyb25nIGZvcm1hdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0LAorICAgICAgICAgICAgWydiYWQnLCAnZm9ybWF0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHRrLl9mb3JtYXRfbGF5b3V0bGlzdCwgTm9uZSkKKyAgICAgICAgIyBfZm9ybWF0X2xheW91dGxpc3QgYWx3YXlzIGV4cGVjdHMgdGhlIHNlY29uZCBpdGVtIChpbiBldmVyeSBpdGVtKQorICAgICAgICAjIHRvIGFjdCBsaWtlIGEgZGljdCAoZXhjZXB0IHdoZW4gdGhlIHZhbHVlIGV2YWx1dGVzIHRvIEZhbHNlKS4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICB0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0LCBbKCdhJywgJ2InKV0pCisgICAgICAgICMgYmFkIGNoaWxkcmVuIGZvcm1hdHRpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9mb3JtYXRfbGF5b3V0bGlzdCwKKyAgICAgICAgICAgIFsoJ25hbWUnLCB7J2NoaWxkcmVuJzogeydhJzogTm9uZX19KV0pCisKKworICAgIGRlZiB0ZXN0X3NjcmlwdF9mcm9tX3NldHRpbmdzKHNlbGYpOgorICAgICAgICAjIGVtcHR5IG9wdGlvbnMKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKHsnbmFtZSc6CisgICAgICAgICAgICB7J2NvbmZpZ3VyZSc6IE5vbmUsICdtYXAnOiBOb25lLCAnZWxlbWVudCBjcmVhdGUnOiBOb25lfX0pKQorCisgICAgICAgICMgZW1wdHkgbGF5b3V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKHsnbmFtZSc6IHsnbGF5b3V0JzogTm9uZX19KSwKKyAgICAgICAgICAgICJ0dGs6OnN0eWxlIGxheW91dCBuYW1lIHtcbm51bGxcbn0iKQorCisgICAgICAgIGNvbmZpZ2RpY3QgPSB7dSfOsc6yzrMnOiBUcnVlLCB1J8OhJzogRmFsc2V9CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MoeyduYW1lJzogeydjb25maWd1cmUnOiBjb25maWdkaWN0fX0pKQorCisgICAgICAgIG1hcGRpY3QgPSB7dSfDvMOxw63Eh8OzZMOoJzogWyh1J8OhJywgdSd2w6NsJyldfQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICB0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKHsnbmFtZSc6IHsnbWFwJzogbWFwZGljdH19KSkKKworICAgICAgICAjIGludmFsaWQgaW1hZ2UgZWxlbWVudAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLAorICAgICAgICAgICAgdHRrLl9zY3JpcHRfZnJvbV9zZXR0aW5ncywgeyduYW1lJzogeydlbGVtZW50IGNyZWF0ZSc6IFsnaW1hZ2UnXX19KQorCisgICAgICAgICMgbWluaW1hbCB2YWxpZCBpbWFnZQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHRrLl9zY3JpcHRfZnJvbV9zZXR0aW5ncyh7J25hbWUnOgorICAgICAgICAgICAgeydlbGVtZW50IGNyZWF0ZSc6IFsnaW1hZ2UnLCAnbmFtZSddfX0pKQorCisgICAgICAgIGltYWdlID0geyd0aGluZyc6IHsnZWxlbWVudCBjcmVhdGUnOgorICAgICAgICAgICAgWydpbWFnZScsICduYW1lJywgKCdzdGF0ZTEnLCAnc3RhdGUyJywgJ3ZhbCcpXX19CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9zY3JpcHRfZnJvbV9zZXR0aW5ncyhpbWFnZSksCisgICAgICAgICAgICAidHRrOjpzdHlsZSBlbGVtZW50IGNyZWF0ZSB0aGluZyBpbWFnZSB7bmFtZSB7c3RhdGUxIHN0YXRlMn0gdmFsfSAiKQorCisgICAgICAgIGltYWdlWyd0aGluZyddWydlbGVtZW50IGNyZWF0ZSddLmFwcGVuZCh7J29wdCc6IDMwfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKKyAgICAgICAgICAgICJ0dGs6OnN0eWxlIGVsZW1lbnQgY3JlYXRlIHRoaW5nIGltYWdlIHtuYW1lIHtzdGF0ZTEgc3RhdGUyfSB2YWx9ICIKKyAgICAgICAgICAgICItb3B0IDMwIikKKworICAgICAgICBpbWFnZVsndGhpbmcnXVsnZWxlbWVudCBjcmVhdGUnXVstMV1bJ29wdCddID0gW01vY2tUY2xPYmooMyksCisgICAgICAgICAgICBNb2NrVGNsT2JqKCcybScpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MoaW1hZ2UpLAorICAgICAgICAgICAgInR0azo6c3R5bGUgZWxlbWVudCBjcmVhdGUgdGhpbmcgaW1hZ2Uge25hbWUge3N0YXRlMSBzdGF0ZTJ9IHZhbH0gIgorICAgICAgICAgICAgIi1vcHQgezMgMm19IikKKworCisgICAgZGVmIHRlc3RfZGljdF9mcm9tX3RjbHR1cGxlKHNlbGYpOgorICAgICAgICBmYWtldHR1cGxlID0gKCctYScsICd7MSAyIDN9JywgJy1zb21ldGhpbmcnLCAnZm9vJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZGljdF9mcm9tX3RjbHR1cGxlKGZha2V0dHVwbGUsIEZhbHNlKSwKKyAgICAgICAgICAgIHsnLWEnOiAnezEgMiAzfScsICctc29tZXRoaW5nJzogJ2Zvbyd9KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoZmFrZXR0dXBsZSksCisgICAgICAgICAgICB7J2EnOiAnezEgMiAzfScsICdzb21ldGhpbmcnOiAnZm9vJ30pCisKKyAgICAgICAgIyBwYXNzaW5nIGEgdHVwbGUgd2l0aCBhIHNpbmdsZSBpdGVtIHNob3VsZCByZXR1cm4gYW4gZW1wdHkgZGljdCwKKyAgICAgICAgIyBzaW5jZSBpdCB0cmllcyB0byBicmVhayB0aGUgdHVwbGUgYnkgcGFpcnMuCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoKCdzaW5nbGUnLCApKSkKKworICAgICAgICBzc3BlYyA9IE1vY2tTdGF0ZVNwZWMoJ2EnLCAnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoKCctYScsIChzc3BlYywgJ3ZhbCcpKSksCisgICAgICAgICAgICB7J2EnOiBbKCdhJywgJ2InLCAndmFsJyldfSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZGljdF9mcm9tX3RjbHR1cGxlKChNb2NrVGNsT2JqKCctcGFkZGluZycpLAorICAgICAgICAgICAgW01vY2tUY2xPYmooJzEnKSwgMiwgTW9ja1RjbE9iaignM20nKV0pKSwKKyAgICAgICAgICAgIHsncGFkZGluZyc6IFsxLCAyLCAnM20nXX0pCisKKworICAgIGRlZiB0ZXN0X2xpc3RfZnJvbV9zdGF0ZXNwZWMoc2VsZik6CisgICAgICAgIGRlZiB0ZXN0X2l0KHNzcGVjLCB2YWx1ZSwgcmVzX3ZhbHVlLCBzdGF0ZXMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9zdGF0ZXNwZWMoCisgICAgICAgICAgICAgICAgKHNzcGVjLCB2YWx1ZSkpLCBbc3RhdGVzICsgKHJlc192YWx1ZSwgKV0pCisKKyAgICAgICAgc3RhdGVzX2V2ZW4gPSB0dXBsZSgnc3RhdGUlZCcgJSBpIGZvciBpIGluIHJhbmdlKDYpKQorICAgICAgICBzdGF0ZXNwZWMgPSBNb2NrU3RhdGVTcGVjKCpzdGF0ZXNfZXZlbikKKyAgICAgICAgdGVzdF9pdChzdGF0ZXNwZWMsICd2YWwnLCAndmFsJywgc3RhdGVzX2V2ZW4pCisgICAgICAgIHRlc3RfaXQoc3RhdGVzcGVjLCBNb2NrVGNsT2JqKCd2YWwnKSwgJ3ZhbCcsIHN0YXRlc19ldmVuKQorCisgICAgICAgIHN0YXRlc19vZGQgPSB0dXBsZSgnc3RhdGUlZCcgJSBpIGZvciBpIGluIHJhbmdlKDUpKQorICAgICAgICBzdGF0ZXNwZWMgPSBNb2NrU3RhdGVTcGVjKCpzdGF0ZXNfb2RkKQorICAgICAgICB0ZXN0X2l0KHN0YXRlc3BlYywgJ3ZhbCcsICd2YWwnLCBzdGF0ZXNfb2RkKQorCisgICAgICAgIHRlc3RfaXQoKCdhJywgJ2InLCAnYycpLCBNb2NrVGNsT2JqKCd2YWwnKSwgJ3ZhbCcsICgnYScsICdiJywgJ2MnKSkKKworCisgICAgZGVmIHRlc3RfbGlzdF9mcm9tX2xheW91dHR1cGxlKHNlbGYpOgorICAgICAgICAjIGVtcHR5IGxheW91dCB0dXBsZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKCgpKSkKKworICAgICAgICAjIHNob3J0ZXN0IGxheW91dCB0dXBsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKCgnbmFtZScsICkpLAorICAgICAgICAgICAgWygnbmFtZScsIHt9KV0pCisKKyAgICAgICAgIyBub3Qgc28gaW50ZXJlc3RpbmcgbHR1cGxlCisgICAgICAgIHNhbXBsZV9sdHVwbGUgPSAoJ25hbWUnLCAnLW9wdGlvbicsICd2YWx1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUoc2FtcGxlX2x0dXBsZSksCisgICAgICAgICAgICBbKCduYW1lJywgeydvcHRpb24nOiAndmFsdWUnfSldKQorCisgICAgICAgICMgZW1wdHkgY2hpbGRyZW4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSgKKyAgICAgICAgICAgICgnc29tZXRoaW5nJywgJy1jaGlsZHJlbicsICgpKSksCisgICAgICAgICAgICBbKCdzb21ldGhpbmcnLCB7J2NoaWxkcmVuJzogW119KV0KKyAgICAgICAgKQorCisgICAgICAgICMgbW9yZSBpbnRlcmVzdGluZyBsdHVwbGUKKyAgICAgICAgbHR1cGxlID0gKAorICAgICAgICAgICAgJ25hbWUnLCAnLW9wdGlvbicsICduaWNlb25lJywgJy1jaGlsZHJlbicsICgKKyAgICAgICAgICAgICAgICAoJ290aGVyb25lJywgJy1jaGlsZHJlbicsICgKKyAgICAgICAgICAgICAgICAgICAgKCdjaGlsZCcsICkpLCAnLW90aGVyb3B0JywgJ290aGVydmFsdWUnCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUobHR1cGxlKSwKKyAgICAgICAgICAgIFsoJ25hbWUnLCB7J29wdGlvbic6ICduaWNlb25lJywgJ2NoaWxkcmVuJzoKKyAgICAgICAgICAgICAgICBbKCdvdGhlcm9uZScsIHsnb3RoZXJvcHQnOiAnb3RoZXJ2YWx1ZScsICdjaGlsZHJlbic6CisgICAgICAgICAgICAgICAgICAgIFsoJ2NoaWxkJywge30pXQorICAgICAgICAgICAgICAgIH0pXQorICAgICAgICAgICAgfSldCisgICAgICAgICkKKworICAgICAgICAjIGJhZCB0dXBsZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUsCisgICAgICAgICAgICAoJ25hbWUnLCAnbm9fbWludXMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUsCisgICAgICAgICAgICAoJ25hbWUnLCAnbm9fbWludXMnLCAndmFsdWUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUsCisgICAgICAgICAgICAoJ3NvbWV0aGluZycsICctY2hpbGRyZW4nKSkgIyBubyBjaGlsZHJlbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSwKKyAgICAgICAgICAgICgnc29tZXRoaW5nJywgJy1jaGlsZHJlbicsICd2YWx1ZScpKSAjIGludmFsaWQgY2hpbGRyZW4KKworCisgICAgZGVmIHRlc3RfdmFsX29yX2RpY3Qoc2VsZik6CisgICAgICAgIGRlZiBmdW5jKG9wdCwgdmFsPU5vbmUpOgorICAgICAgICAgICAgaWYgdmFsIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJ0ZXN0IHZhbCIKKyAgICAgICAgICAgIHJldHVybiAob3B0LCB2YWwpCisKKyAgICAgICAgb3B0aW9ucyA9IHsndGVzdCc6IE5vbmV9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl92YWxfb3JfZGljdChvcHRpb25zLCBmdW5jKSwgInRlc3QgdmFsIikKKworICAgICAgICBvcHRpb25zID0geyd0ZXN0JzogM30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3ZhbF9vcl9kaWN0KG9wdGlvbnMsIGZ1bmMpLCBvcHRpb25zKQorCisKKyAgICBkZWYgdGVzdF9jb252ZXJ0X3N0cmluZ3ZhbChzZWxmKToKKyAgICAgICAgdGVzdHMgPSAoCisgICAgICAgICAgICAoMCwgMCksICgnMDknLCA5KSwgKCdhJywgJ2EnKSwgKHUnw6HDmicsIHUnw6HDmicpLCAoW10sICdbXScpLAorICAgICAgICAgICAgKE5vbmUsICdOb25lJykKKyAgICAgICAgKQorICAgICAgICBmb3Igb3JpZywgZXhwZWN0ZWQgaW4gdGVzdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fY29udmVydF9zdHJpbmd2YWwob3JpZyksIGV4cGVjdGVkKQorCisgICAgICAgIGlmIHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSA9PSAnYXNjaWknOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgICAgIHR0ay5fY29udmVydF9zdHJpbmd2YWwsICfDoScpCisKKworY2xhc3MgVGNsT2Jqc1RvUHlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3VuaWNvZGUoc2VsZik6CisgICAgICAgIGFkaWN0ID0geydvcHQnOiB1J3bDpGzDusOoJ30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsudGNsb2Jqc190b19weShhZGljdCksIHsnb3B0JzogdSd2w6Rsw7rDqCd9KQorCisgICAgICAgIGFkaWN0WydvcHQnXSA9IE1vY2tUY2xPYmooYWRpY3RbJ29wdCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KGFkaWN0KSwgeydvcHQnOiB1J3bDpGzDusOoJ30pCisKKyAgICBkZWYgdGVzdF9tdWx0aXZhbHVlcyhzZWxmKToKKyAgICAgICAgYWRpY3QgPSB7J29wdCc6IFsxLCAyLCAzLCA0XX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsudGNsb2Jqc190b19weShhZGljdCksIHsnb3B0JzogWzEsIDIsIDMsIDRdfSkKKworICAgICAgICBhZGljdFsnb3B0J10gPSBbMSwgJ3htJywgM10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsudGNsb2Jqc190b19weShhZGljdCksIHsnb3B0JzogWzEsICd4bScsIDNdfSkKKworICAgICAgICBhZGljdFsnb3B0J10gPSAoTW9ja1N0YXRlU3BlYygnYScsICdiJyksIHUndsOhbMWpw6gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KGFkaWN0KSwKKyAgICAgICAgICAgIHsnb3B0JzogWygnYScsICdiJywgdSd2w6FsxanDqCcpXX0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsudGNsb2Jqc190b19weSh7J3gnOiBbJ3kgeiddfSksCisgICAgICAgICAgICB7J3gnOiBbJ3kgeiddfSkKKworICAgIGRlZiB0ZXN0X25vc3BsaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLnRjbG9ianNfdG9fcHkoeyd0ZXh0JzogJ3NvbWUgdGV4dCd9KSwKKyAgICAgICAgICAgIHsndGV4dCc6ICdzb21lIHRleHQnfSkKKwordGVzdHNfbm9ndWkgPSAoSW50ZXJuYWxGdW5jdGlvbnNUZXN0LCBUY2xPYmpzVG9QeVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0c19ub2d1aSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwMWNmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwMWNmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9zdHlsZS5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9zdHlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBlMDc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3N0eWxlLnB5CkBAIC0wLDAgKzEsOTEgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IFRraW50ZXIKK2ltcG9ydCB0dGsKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJlcXVpcmVzLCBydW5fdW5pdHRlc3QKKworaW1wb3J0IHN1cHBvcnQKKworcmVxdWlyZXMoJ2d1aScpCisKK2NsYXNzIFN0eWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc3R5bGUgPSB0dGsuU3R5bGUoKQorCisKKyAgICBkZWYgdGVzdF9jb25maWd1cmUoc2VsZik6CisgICAgICAgIHN0eWxlID0gc2VsZi5zdHlsZQorICAgICAgICBzdHlsZS5jb25maWd1cmUoJ1RCdXR0b24nLCBiYWNrZ3JvdW5kPSd5ZWxsb3cnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0eWxlLmNvbmZpZ3VyZSgnVEJ1dHRvbicsICdiYWNrZ3JvdW5kJyksCisgICAgICAgICAgICAneWVsbG93JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJyksIGRpY3QpKQorCisKKyAgICBkZWYgdGVzdF9tYXAoc2VsZik6CisgICAgICAgIHN0eWxlID0gc2VsZi5zdHlsZQorICAgICAgICBzdHlsZS5tYXAoJ1RCdXR0b24nLCBiYWNrZ3JvdW5kPVsoJ2FjdGl2ZScsICdiYWNrZ3JvdW5kJywgJ2JsdWUnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubWFwKCdUQnV0dG9uJywgJ2JhY2tncm91bmQnKSwKKyAgICAgICAgICAgIFsoJ2FjdGl2ZScsICdiYWNrZ3JvdW5kJywgJ2JsdWUnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN0eWxlLm1hcCgnVEJ1dHRvbicpLCBkaWN0KSkKKworCisgICAgZGVmIHRlc3RfbG9va3VwKHNlbGYpOgorICAgICAgICBzdHlsZSA9IHNlbGYuc3R5bGUKKyAgICAgICAgc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJywgYmFja2dyb3VuZD0neWVsbG93JykKKyAgICAgICAgc3R5bGUubWFwKCdUQnV0dG9uJywgYmFja2dyb3VuZD1bKCdhY3RpdmUnLCAnYmFja2dyb3VuZCcsICdibHVlJyldKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubG9va3VwKCdUQnV0dG9uJywgJ2JhY2tncm91bmQnKSwgJ3llbGxvdycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubG9va3VwKCdUQnV0dG9uJywgJ2JhY2tncm91bmQnLAorICAgICAgICAgICAgWydhY3RpdmUnLCAnYmFja2dyb3VuZCddKSwgJ2JsdWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0eWxlLmxvb2t1cCgnVEJ1dHRvbicsICdvcHRpb25ub3RkZWZpbmVkJywKKyAgICAgICAgICAgIGRlZmF1bHQ9J2lrbmV3aXQnKSwgJ2lrbmV3aXQnKQorCisKKyAgICBkZWYgdGVzdF9sYXlvdXQoc2VsZik6CisgICAgICAgIHN0eWxlID0gc2VsZi5zdHlsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzdHlsZS5sYXlvdXQsICdOb3RBTGF5b3V0JykKKyAgICAgICAgdHZfc3R5bGUgPSBzdHlsZS5sYXlvdXQoJ1RyZWV2aWV3JykKKworICAgICAgICAjICJlcmFzZSIgVHJlZXZpZXcgbGF5b3V0CisgICAgICAgIHN0eWxlLmxheW91dCgnVHJlZXZpZXcnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHlsZS5sYXlvdXQoJ1RyZWV2aWV3JyksCisgICAgICAgICAgICBbKCdudWxsJywgeydzdGlja3knOiAnbnN3ZSd9KV0KKyAgICAgICAgKQorCisgICAgICAgICMgcmVzdG9yZSBsYXlvdXQKKyAgICAgICAgc3R5bGUubGF5b3V0KCdUcmVldmlldycsIHR2X3N0eWxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0eWxlLmxheW91dCgnVHJlZXZpZXcnKSwgdHZfc3R5bGUpCisKKyAgICAgICAgIyBzaG91bGQgcmV0dXJuIGEgbGlzdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzdHlsZS5sYXlvdXQoJ1RCdXR0b24nKSwgbGlzdCkpCisKKyAgICAgICAgIyBjb3JyZWN0IGxheW91dCwgYnV0ICJvcHRpb24iIGRvZXNuJ3QgZXhpc3QgYXMgb3B0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHN0eWxlLmxheW91dCwgJ1RyZWV2aWV3JywKKyAgICAgICAgICAgIFsoJ25hbWUnLCB7J29wdGlvbic6ICdpbmV4aXN0ZW50J30pXSkKKworCisgICAgZGVmIHRlc3RfdGhlbWVfdXNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnN0eWxlLnRoZW1lX3VzZSwKKyAgICAgICAgICAgICdub25leGlzdGluZ25hbWUnKQorCisgICAgICAgIGN1cnJfdGhlbWUgPSBzZWxmLnN0eWxlLnRoZW1lX3VzZSgpCisgICAgICAgIG5ld190aGVtZSA9IE5vbmUKKyAgICAgICAgZm9yIHRoZW1lIGluIHNlbGYuc3R5bGUudGhlbWVfbmFtZXMoKToKKyAgICAgICAgICAgIGlmIHRoZW1lICE9IGN1cnJfdGhlbWU6CisgICAgICAgICAgICAgICAgbmV3X3RoZW1lID0gdGhlbWUKKyAgICAgICAgICAgICAgICBzZWxmLnN0eWxlLnRoZW1lX3VzZSh0aGVtZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBqdXN0IG9uZSB0aGVtZSBhdmFpbGFibGUsIGNhbid0IGdvIG9uIHdpdGggdGVzdHMKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY3Vycl90aGVtZSA9PSBuZXdfdGhlbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobmV3X3RoZW1lICE9IHNlbGYuc3R5bGUudGhlbWVfdXNlKCkpCisKKyAgICAgICAgc2VsZi5zdHlsZS50aGVtZV91c2UoY3Vycl90aGVtZSkKKworCit0ZXN0c19ndWkgPSAoU3R5bGVUZXN0LCApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0c19ndWkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfc3R5bGUucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3N0eWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2YwMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3N0eWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfc3R5bGUucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3N0eWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2YwMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3N0eWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMDZhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weQpAQCAtMCwwICsxLDExNTggQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IFRraW50ZXIKK2ltcG9ydCB0dGsKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJlcXVpcmVzLCBydW5fdW5pdHRlc3QKK2ltcG9ydCBzeXMKKworaW1wb3J0IHN1cHBvcnQKK2Zyb20gdGVzdF9mdW5jdGlvbnMgaW1wb3J0IE1vY2tUY2xPYmosIE1vY2tTdGF0ZVNwZWMKKworcmVxdWlyZXMoJ2d1aScpCisKK2NsYXNzIFdpZGdldFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIG1ldGhvZHMgYXZhaWxhYmxlIGluIGV2ZXJ5IHR0ayB3aWRnZXQuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cHBvcnQucm9vdF9kZWljb25pZnkoKQorICAgICAgICBzZWxmLndpZGdldCA9IHR0ay5CdXR0b24od2lkdGg9MCwgdGV4dD0iVGV4dCIpCisgICAgICAgIHNlbGYud2lkZ2V0LnBhY2soKQorICAgICAgICBzZWxmLndpZGdldC53YWl0X3Zpc2liaWxpdHkoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLndpZGdldC5kZXN0cm95KCkKKyAgICAgICAgc3VwcG9ydC5yb290X3dpdGhkcmF3KCkKKworCisgICAgZGVmIHRlc3RfaWRlbnRpZnkoc2VsZik6CisgICAgICAgIHNlbGYud2lkZ2V0LnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0LmlkZW50aWZ5KAorICAgICAgICAgICAgaW50KHNlbGYud2lkZ2V0LndpbmZvX3dpZHRoKCkgLyAyKSwKKyAgICAgICAgICAgIGludChzZWxmLndpZGdldC53aW5mb19oZWlnaHQoKSAvIDIpCisgICAgICAgICAgICApLCAibGFiZWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0LmlkZW50aWZ5KC0xLCAtMSksICIiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYud2lkZ2V0LmlkZW50aWZ5LCBOb25lLCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLndpZGdldC5pZGVudGlmeSwgNSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi53aWRnZXQuaWRlbnRpZnksIDUsICcnKQorCisKKyAgICBkZWYgdGVzdF93aWRnZXRfc3RhdGUoc2VsZik6CisgICAgICAgICMgWFhYIG5vdCBzdXJlIGFib3V0IHRoZSBwb3J0YWJpbGl0eSBvZiBhbGwgdGhlc2UgdGVzdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZSgpLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5pbnN0YXRlKFsnIWRpc2FibGVkJ10pLCBUcnVlKQorCisgICAgICAgICMgY2hhbmdpbmcgZnJvbSAhZGlzYWJsZWQgdG8gZGlzYWJsZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZShbJ2Rpc2FibGVkJ10pLCAoJyFkaXNhYmxlZCcsICkpCisgICAgICAgICMgbm8gc3RhdGUgY2hhbmdlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoWydkaXNhYmxlZCddKSwgKCkpCisgICAgICAgICMgY2hhbmdlIGJhY2sgdG8gIWRpc2FibGUgYnV0IGFsc28gYWN0aXZlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoWychZGlzYWJsZWQnLCAnYWN0aXZlJ10pLAorICAgICAgICAgICAgKCchYWN0aXZlJywgJ2Rpc2FibGVkJykpCisgICAgICAgICMgbm8gc3RhdGUgY2hhbmdlcywgYWdhaW4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZShbJyFkaXNhYmxlZCcsICdhY3RpdmUnXSksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKFsnYWN0aXZlJywgJyFkaXNhYmxlZCddKSwgKCkpCisKKyAgICAgICAgZGVmIHRlc3RfY2IoYXJnMSwgKiprdyk6CisgICAgICAgICAgICByZXR1cm4gYXJnMSwga3cKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5pbnN0YXRlKFsnIWRpc2FibGVkJ10sCisgICAgICAgICAgICB0ZXN0X2NiLCAiaGkiLCAqKnsibXNnIjogInRoZXJlIn0pLAorICAgICAgICAgICAgKCdoaScsIHsnbXNnJzogJ3RoZXJlJ30pKQorCisgICAgICAgICMgYXR0ZW1wdCB0byBzZXQgaW52YWxpZCBzdGF0ZXNwZWMKKyAgICAgICAgY3VycnN0YXRlID0gc2VsZi53aWRnZXQuc3RhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLndpZGdldC5pbnN0YXRlLAorICAgICAgICAgICAgWydiYWRzdGF0ZSddKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLndpZGdldC5pbnN0YXRlLAorICAgICAgICAgICAgWydkaXNhYmxlZCcsICdiYWRzdGF0ZSddKQorICAgICAgICAjIHZlcmlmeSB0aGF0IHdpZGdldCBkaWRuJ3QgY2hhbmdlIGl0cyBzdGF0ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1cnJzdGF0ZSwgc2VsZi53aWRnZXQuc3RhdGUoKSkKKworICAgICAgICAjIGVuc3VyaW5nIHRoYXQgcGFzc2luZyBOb25lIGFzIHN0YXRlIGRvZXNuJ3QgbW9kaWZ5IGN1cnJlbnQgc3RhdGUKKyAgICAgICAgc2VsZi53aWRnZXQuc3RhdGUoWydhY3RpdmUnLCAnIWRpc2FibGVkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoKSwgKCdhY3RpdmUnLCApKQorCisKK2NsYXNzIEJ1dHRvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfaW52b2tlKHNlbGYpOgorICAgICAgICBzdWNjZXNzID0gW10KKyAgICAgICAgYnRuID0gdHRrLkJ1dHRvbihjb21tYW5kPWxhbWJkYTogc3VjY2Vzcy5hcHBlbmQoMSkpCisgICAgICAgIGJ0bi5pbnZva2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3VjY2VzcykKKworCitjbGFzcyBDaGVja2J1dHRvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfaW52b2tlKHNlbGYpOgorICAgICAgICBzdWNjZXNzID0gW10KKyAgICAgICAgZGVmIGNiX3Rlc3QoKToKKyAgICAgICAgICAgIHN1Y2Nlc3MuYXBwZW5kKDEpCisgICAgICAgICAgICByZXR1cm4gImNiIHRlc3QgY2FsbGVkIgorCisgICAgICAgIGNidG4gPSB0dGsuQ2hlY2tidXR0b24oY29tbWFuZD1jYl90ZXN0KQorICAgICAgICAjIHRoZSB2YXJpYWJsZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdHRrLkNoZWNrYnV0dG9uIGlzIGFjdHVhbGx5CisgICAgICAgICMgdW5kZWZpbmVkIHRpbGwgd2UgaW52b2tlIHRoZSBDaGVja2J1dHRvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNidG4uc3RhdGUoKSwgKCdhbHRlcm5hdGUnLCApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBjYnRuLnRrLmdsb2JhbGdldHZhciwKKyAgICAgICAgICAgIGNidG5bJ3ZhcmlhYmxlJ10pCisKKyAgICAgICAgcmVzID0gY2J0bi5pbnZva2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgImNiIHRlc3QgY2FsbGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYnRuWydvbnZhbHVlJ10sCisgICAgICAgICAgICBjYnRuLnRrLmdsb2JhbGdldHZhcihjYnRuWyd2YXJpYWJsZSddKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN1Y2Nlc3MpCisKKyAgICAgICAgY2J0blsnY29tbWFuZCddID0gJycKKyAgICAgICAgcmVzID0gY2J0bi5pbnZva2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGVuKHN1Y2Nlc3MpID4gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYnRuWydvZmZ2YWx1ZSddLAorICAgICAgICAgICAgY2J0bi50ay5nbG9iYWxnZXR2YXIoY2J0blsndmFyaWFibGUnXSkpCisKKworY2xhc3MgQ29tYm9ib3hUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwcG9ydC5yb290X2RlaWNvbmlmeSgpCisgICAgICAgIHNlbGYuY29tYm8gPSB0dGsuQ29tYm9ib3goKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNvbWJvLmRlc3Ryb3koKQorICAgICAgICBzdXBwb3J0LnJvb3Rfd2l0aGRyYXcoKQorCisgICAgZGVmIF9zaG93X2Ryb3BfZG93bl9saXN0Ym94KHNlbGYpOgorICAgICAgICB3aWR0aCA9IHNlbGYuY29tYm8ud2luZm9fd2lkdGgoKQorICAgICAgICBzZWxmLmNvbWJvLmV2ZW50X2dlbmVyYXRlKCc8QnV0dG9uUHJlc3MtMT4nLCB4PXdpZHRoIC0gNSwgeT01KQorICAgICAgICBzZWxmLmNvbWJvLmV2ZW50X2dlbmVyYXRlKCc8QnV0dG9uUmVsZWFzZS0xPicsIHg9d2lkdGggLSA1LCB5PTUpCisgICAgICAgIHNlbGYuY29tYm8udXBkYXRlX2lkbGV0YXNrcygpCisKKworICAgIGRlZiB0ZXN0X3ZpcnR1YWxfZXZlbnQoc2VsZik6CisgICAgICAgIHN1Y2Nlc3MgPSBbXQorCisgICAgICAgIHNlbGYuY29tYm9bJ3ZhbHVlcyddID0gWzFdCisgICAgICAgIHNlbGYuY29tYm8uYmluZCgnPDxDb21ib2JveFNlbGVjdGVkPj4nLAorICAgICAgICAgICAgbGFtYmRhIGV2dDogc3VjY2Vzcy5hcHBlbmQoVHJ1ZSkpCisgICAgICAgIHNlbGYuY29tYm8ucGFjaygpCisgICAgICAgIHNlbGYuY29tYm8ud2FpdF92aXNpYmlsaXR5KCkKKworICAgICAgICBoZWlnaHQgPSBzZWxmLmNvbWJvLndpbmZvX2hlaWdodCgpCisgICAgICAgIHNlbGYuX3Nob3dfZHJvcF9kb3duX2xpc3Rib3goKQorICAgICAgICBzZWxmLmNvbWJvLnVwZGF0ZSgpCisgICAgICAgIHNlbGYuY29tYm8uZXZlbnRfZ2VuZXJhdGUoJzxSZXR1cm4+JykKKyAgICAgICAgc2VsZi5jb21iby51cGRhdGUoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWNjZXNzKQorCisKKyAgICBkZWYgdGVzdF9wb3N0Y29tbWFuZChzZWxmKToKKyAgICAgICAgc3VjY2VzcyA9IFtdCisKKyAgICAgICAgc2VsZi5jb21ib1sncG9zdGNvbW1hbmQnXSA9IGxhbWJkYTogc3VjY2Vzcy5hcHBlbmQoVHJ1ZSkKKyAgICAgICAgc2VsZi5jb21iby5wYWNrKCkKKyAgICAgICAgc2VsZi5jb21iby53YWl0X3Zpc2liaWxpdHkoKQorCisgICAgICAgIHNlbGYuX3Nob3dfZHJvcF9kb3duX2xpc3Rib3goKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3VjY2VzcykKKworICAgICAgICAjIHRlc3RpbmcgcG9zdGNvbW1hbmQgcmVtb3ZhbAorICAgICAgICBzZWxmLmNvbWJvWydwb3N0Y29tbWFuZCddID0gJycKKyAgICAgICAgc2VsZi5fc2hvd19kcm9wX2Rvd25fbGlzdGJveCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN1Y2Nlc3MpLCAxKQorCisKKyAgICBkZWYgdGVzdF92YWx1ZXMoc2VsZik6CisgICAgICAgIGRlZiBjaGVja19nZXRfY3VycmVudChnZXR2YWwsIGN1cnJ2YWwpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbWJvLmdldCgpLCBnZXR2YWwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tYm8uY3VycmVudCgpLCBjdXJydmFsKQorCisgICAgICAgIGNoZWNrX2dldF9jdXJyZW50KCcnLCAtMSkKKworICAgICAgICBzZWxmLmNvbWJvWyd2YWx1ZXMnXSA9IFsnYScsIDEsICdjJ10KKworICAgICAgICBzZWxmLmNvbWJvLnNldCgnYycpCisgICAgICAgIGNoZWNrX2dldF9jdXJyZW50KCdjJywgMikKKworICAgICAgICBzZWxmLmNvbWJvLmN1cnJlbnQoMCkKKyAgICAgICAgY2hlY2tfZ2V0X2N1cnJlbnQoJ2EnLCAwKQorCisgICAgICAgIHNlbGYuY29tYm8uc2V0KCdkJykKKyAgICAgICAgY2hlY2tfZ2V0X2N1cnJlbnQoJ2QnLCAtMSkKKworICAgICAgICAjIHRlc3RpbmcgdmFsdWVzIHdpdGggZW1wdHkgc3RyaW5nCisgICAgICAgIHNlbGYuY29tYm8uc2V0KCcnKQorICAgICAgICBzZWxmLmNvbWJvWyd2YWx1ZXMnXSA9ICgxLCAyLCAnJywgMykKKyAgICAgICAgY2hlY2tfZ2V0X2N1cnJlbnQoJycsIDIpCisKKyAgICAgICAgIyB0ZXN0aW5nIHZhbHVlcyB3aXRoIGVtcHR5IHN0cmluZyBzZXQgdGhyb3VnaCBjb25maWd1cmUKKyAgICAgICAgc2VsZi5jb21iby5jb25maWd1cmUodmFsdWVzPVsxLCAnJywgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21ib1sndmFsdWVzJ10sICgnMScsICcnLCAnMicpKQorCisgICAgICAgICMgdGVzdGluZyB2YWx1ZXMgd2l0aCBzcGFjZXMKKyAgICAgICAgc2VsZi5jb21ib1sndmFsdWVzJ10gPSBbJ2EgYicsICdhXHRiJywgJ2FcbmInXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tYm9bJ3ZhbHVlcyddLCAoJ2EgYicsICdhXHRiJywgJ2FcbmInKSkKKworICAgICAgICAjIHRlc3RpbmcgdmFsdWVzIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzCisgICAgICAgIHNlbGYuY29tYm9bJ3ZhbHVlcyddID0gW3InYVx0YicsICciYSInLCAnfSB7J10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbWJvWyd2YWx1ZXMnXSwgKHInYVx0YicsICciYSInLCAnfSB7JykpCisKKyAgICAgICAgIyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5jb21iby5jdXJyZW50LAorICAgICAgICAgICAgbGVuKHNlbGYuY29tYm9bJ3ZhbHVlcyddKSkKKyAgICAgICAgIyBpdCBleHBlY3RzIGFuIGludGVnZXIgKG9yIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gaW50KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmNvbWJvLmN1cnJlbnQsICcnKQorCisgICAgICAgICMgdGVzdGluZyBjcmVhdGluZyBjb21ib2JveCB3aXRoIGVtcHR5IHN0cmluZyBpbiB2YWx1ZXMKKyAgICAgICAgY29tYm8yID0gdHRrLkNvbWJvYm94KHZhbHVlcz1bMSwgMiwgJyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbWJvMlsndmFsdWVzJ10sICgnMScsICcyJywgJycpKQorICAgICAgICBjb21ibzIuZGVzdHJveSgpCisKKworY2xhc3MgRW50cnlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwcG9ydC5yb290X2RlaWNvbmlmeSgpCisgICAgICAgIHNlbGYuZW50cnkgPSB0dGsuRW50cnkoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmVudHJ5LmRlc3Ryb3koKQorICAgICAgICBzdXBwb3J0LnJvb3Rfd2l0aGRyYXcoKQorCisKKyAgICBkZWYgdGVzdF9iYm94KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLmVudHJ5LmJib3goMCkpLCA0KQorICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmVudHJ5LmJib3goMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShpdGVtLCBpbnQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuZW50cnkuYmJveCwgJ25vaW5kZXgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmJib3gsIE5vbmUpCisKKworICAgIGRlZiB0ZXN0X2lkZW50aWZ5KHNlbGYpOgorICAgICAgICBzZWxmLmVudHJ5LnBhY2soKQorICAgICAgICBzZWxmLmVudHJ5LndhaXRfdmlzaWJpbGl0eSgpCisgICAgICAgIHNlbGYuZW50cnkudXBkYXRlX2lkbGV0YXNrcygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LmlkZW50aWZ5KDUsIDUpLCAidGV4dGFyZWEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkuaWRlbnRpZnkoLTEsIC0xKSwgIiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5lbnRyeS5pZGVudGlmeSwgTm9uZSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5lbnRyeS5pZGVudGlmeSwgNSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5lbnRyeS5pZGVudGlmeSwgNSwgJycpCisKKworICAgIGRlZiB0ZXN0X3ZhbGlkYXRpb25fb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc3VjY2VzcyA9IFtdCisgICAgICAgIHRlc3RfaW52YWxpZCA9IGxhbWJkYTogc3VjY2Vzcy5hcHBlbmQoVHJ1ZSkKKworICAgICAgICBzZWxmLmVudHJ5Wyd2YWxpZGF0ZSddID0gJ25vbmUnCisgICAgICAgIHNlbGYuZW50cnlbJ3ZhbGlkYXRlY29tbWFuZCddID0gbGFtYmRhOiBGYWxzZQorCisgICAgICAgIHNlbGYuZW50cnlbJ2ludmFsaWRjb21tYW5kJ10gPSB0ZXN0X2ludmFsaWQKKyAgICAgICAgc2VsZi5lbnRyeS52YWxpZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWNjZXNzKQorCisgICAgICAgIHNlbGYuZW50cnlbJ2ludmFsaWRjb21tYW5kJ10gPSAnJworICAgICAgICBzZWxmLmVudHJ5LnZhbGlkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3VjY2VzcyksIDEpCisKKyAgICAgICAgc2VsZi5lbnRyeVsnaW52YWxpZGNvbW1hbmQnXSA9IHRlc3RfaW52YWxpZAorICAgICAgICBzZWxmLmVudHJ5Wyd2YWxpZGF0ZWNvbW1hbmQnXSA9IGxhbWJkYTogVHJ1ZQorICAgICAgICBzZWxmLmVudHJ5LnZhbGlkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3VjY2VzcyksIDEpCisKKyAgICAgICAgc2VsZi5lbnRyeVsndmFsaWRhdGVjb21tYW5kJ10gPSAnJworICAgICAgICBzZWxmLmVudHJ5LnZhbGlkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3VjY2VzcyksIDEpCisKKyAgICAgICAgc2VsZi5lbnRyeVsndmFsaWRhdGVjb21tYW5kJ10gPSBUcnVlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuZW50cnkudmFsaWRhdGUpCisKKworICAgIGRlZiB0ZXN0X3ZhbGlkYXRpb24oc2VsZik6CisgICAgICAgIHZhbGlkYXRpb24gPSBbXQorICAgICAgICBkZWYgdmFsaWRhdGUodG9faW5zZXJ0KToKKyAgICAgICAgICAgIGlmIG5vdCAnYScgPD0gdG9faW5zZXJ0Lmxvd2VyKCkgPD0gJ3onOgorICAgICAgICAgICAgICAgIHZhbGlkYXRpb24uYXBwZW5kKEZhbHNlKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgdmFsaWRhdGlvbi5hcHBlbmQoVHJ1ZSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgc2VsZi5lbnRyeVsndmFsaWRhdGUnXSA9ICdrZXknCisgICAgICAgIHNlbGYuZW50cnlbJ3ZhbGlkYXRlY29tbWFuZCddID0gc2VsZi5lbnRyeS5yZWdpc3Rlcih2YWxpZGF0ZSksICclUycKKworICAgICAgICBzZWxmLmVudHJ5Lmluc2VydCgnZW5kJywgMSkKKyAgICAgICAgc2VsZi5lbnRyeS5pbnNlcnQoJ2VuZCcsICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxpZGF0aW9uLCBbRmFsc2UsIFRydWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkuZ2V0KCksICdhJykKKworCisgICAgZGVmIHRlc3RfcmV2YWxpZGF0aW9uKHNlbGYpOgorICAgICAgICBkZWYgdmFsaWRhdGUoY29udGVudCk6CisgICAgICAgICAgICBmb3IgbGV0dGVyIGluIGNvbnRlbnQ6CisgICAgICAgICAgICAgICAgaWYgbm90ICdhJyA8PSBsZXR0ZXIubG93ZXIoKSA8PSAneic6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICBzZWxmLmVudHJ5Wyd2YWxpZGF0ZWNvbW1hbmQnXSA9IHNlbGYuZW50cnkucmVnaXN0ZXIodmFsaWRhdGUpLCAnJVAnCisKKyAgICAgICAgc2VsZi5lbnRyeS5pbnNlcnQoJ2VuZCcsICdhdm9jYWRvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LnZhbGlkYXRlKCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnRyeS5zdGF0ZSgpLCAoKSkKKworICAgICAgICBzZWxmLmVudHJ5LmRlbGV0ZSgwLCAnZW5kJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LmdldCgpLCAnJykKKworICAgICAgICBzZWxmLmVudHJ5Lmluc2VydCgnZW5kJywgJ2ExYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnRyeS52YWxpZGF0ZSgpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LnN0YXRlKCksICgnaW52YWxpZCcsICkpCisKKyAgICAgICAgc2VsZi5lbnRyeS5kZWxldGUoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LnZhbGlkYXRlKCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnRyeS5zdGF0ZSgpLCAoKSkKKworCitjbGFzcyBQYW5lZHdpbmRvd1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKKyAgICAgICAgc2VsZi5wYW5lZCA9IHR0ay5QYW5lZHdpbmRvdygpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYucGFuZWQuZGVzdHJveSgpCisgICAgICAgIHN1cHBvcnQucm9vdF93aXRoZHJhdygpCisKKworICAgIGRlZiB0ZXN0X2FkZChzZWxmKToKKyAgICAgICAgIyBhdHRlbXB0IHRvIGFkZCBhIGNoaWxkIHRoYXQgaXMgbm90IGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBwYW5lZCB3aW5kb3cKKyAgICAgICAgbGFiZWwgPSB0dGsuTGFiZWwoc2VsZi5wYW5lZCkKKyAgICAgICAgY2hpbGQgPSB0dGsuTGFiZWwobGFiZWwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuYWRkLCBjaGlsZCkKKyAgICAgICAgbGFiZWwuZGVzdHJveSgpCisgICAgICAgIGNoaWxkLmRlc3Ryb3koKQorICAgICAgICAjIGFub3RoZXIgYXR0ZW1wdAorICAgICAgICBsYWJlbCA9IHR0ay5MYWJlbCgpCisgICAgICAgIGNoaWxkID0gdHRrLkxhYmVsKGxhYmVsKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmFkZCwgY2hpbGQpCisgICAgICAgIGNoaWxkLmRlc3Ryb3koKQorICAgICAgICBsYWJlbC5kZXN0cm95KCkKKworICAgICAgICBnb29kX2NoaWxkID0gdHRrLkxhYmVsKCkKKyAgICAgICAgc2VsZi5wYW5lZC5hZGQoZ29vZF9jaGlsZCkKKyAgICAgICAgIyByZS1hZGRpbmcgYSBjaGlsZCBpcyBub3QgYWNjZXB0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5hZGQsIGdvb2RfY2hpbGQpCisKKyAgICAgICAgb3RoZXJfY2hpbGQgPSB0dGsuTGFiZWwoc2VsZi5wYW5lZCkKKyAgICAgICAgc2VsZi5wYW5lZC5hZGQob3RoZXJfY2hpbGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lKDApLCBzZWxmLnBhbmVkLnBhbmUoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQucGFuZSwgMikKKyAgICAgICAgZ29vZF9jaGlsZC5kZXN0cm95KCkKKyAgICAgICAgb3RoZXJfY2hpbGQuZGVzdHJveSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQucGFuZSwgMCkKKworCisgICAgZGVmIHRlc3RfZm9yZ2V0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmZvcmdldCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5mb3JnZXQsIDApCisKKyAgICAgICAgc2VsZi5wYW5lZC5hZGQodHRrLkxhYmVsKCkpCisgICAgICAgIHNlbGYucGFuZWQuZm9yZ2V0KDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuZm9yZ2V0LCAwKQorCisKKyAgICBkZWYgdGVzdF9pbnNlcnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuaW5zZXJ0LCBOb25lLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmluc2VydCwgMCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5pbnNlcnQsIDAsIDApCisKKyAgICAgICAgY2hpbGQgPSB0dGsuTGFiZWwoKQorICAgICAgICBjaGlsZDIgPSB0dGsuTGFiZWwoKQorICAgICAgICBjaGlsZDMgPSB0dGsuTGFiZWwoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuaW5zZXJ0LCAwLCBjaGlsZCkKKworICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgnZW5kJywgY2hpbGQyKQorICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgwLCBjaGlsZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhbmVkLnBhbmVzKCksIChzdHIoY2hpbGQpLCBzdHIoY2hpbGQyKSkpCisKKyAgICAgICAgc2VsZi5wYW5lZC5pbnNlcnQoMCwgY2hpbGQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZXMoKSwgKHN0cihjaGlsZDIpLCBzdHIoY2hpbGQpKSkKKworICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgnZW5kJywgY2hpbGQzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZXMoKSwKKyAgICAgICAgICAgIChzdHIoY2hpbGQyKSwgc3RyKGNoaWxkKSwgc3RyKGNoaWxkMykpKQorCisgICAgICAgICMgcmVpbnNlcnRpbmcgYSBjaGlsZCBzaG91bGQgbW92ZSBpdCB0byBpdHMgY3VycmVudCBwb3NpdGlvbgorICAgICAgICBwYW5lcyA9IHNlbGYucGFuZWQucGFuZXMoKQorICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgnZW5kJywgY2hpbGQzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhbmVzLCBzZWxmLnBhbmVkLnBhbmVzKCkpCisKKyAgICAgICAgIyBtb3ZpbmcgY2hpbGQzIHRvIGNoaWxkMiBwb3NpdGlvbiBzaG91bGQgcmVzdWx0IGluIGNoaWxkMiBlbmRpbmcgdXAKKyAgICAgICAgIyBpbiBwcmV2aW91cyBjaGlsZCBwb3NpdGlvbiBhbmQgY2hpbGQgZW5kaW5nIHVwIGluIHByZXZpb3VzIGNoaWxkMworICAgICAgICAjIHBvc2l0aW9uCisgICAgICAgIHNlbGYucGFuZWQuaW5zZXJ0KGNoaWxkMiwgY2hpbGQzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZXMoKSwKKyAgICAgICAgICAgIChzdHIoY2hpbGQzKSwgc3RyKGNoaWxkMiksIHN0cihjaGlsZCkpKQorCisKKyAgICBkZWYgdGVzdF9wYW5lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnBhbmUsIDApCisKKyAgICAgICAgY2hpbGQgPSB0dGsuTGFiZWwoKQorICAgICAgICBzZWxmLnBhbmVkLmFkZChjaGlsZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi5wYW5lZC5wYW5lKDApLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhbmVkLnBhbmUoMCwgd2VpZ2h0PU5vbmUpLCAwKQorICAgICAgICAjIG5ld2VyIGZvcm0gZm9yIHF1ZXJ5aW5nIGEgc2luZ2xlIG9wdGlvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZSgwLCAnd2VpZ2h0JyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lKDApLCBzZWxmLnBhbmVkLnBhbmUoc3RyKGNoaWxkKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5wYW5lLCAwLAorICAgICAgICAgICAgYmFkb3B0aW9uPSdzb21ldmFsdWUnKQorCisKKyAgICBkZWYgdGVzdF9zYXNocG9zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnNhc2hwb3MsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuc2FzaHBvcywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuc2FzaHBvcywgMCkKKworICAgICAgICBjaGlsZCA9IHR0ay5MYWJlbChzZWxmLnBhbmVkLCB0ZXh0PSdhJykKKyAgICAgICAgc2VsZi5wYW5lZC5hZGQoY2hpbGQsIHdlaWdodD0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnNhc2hwb3MsIDApCisgICAgICAgIGNoaWxkMiA9IHR0ay5MYWJlbChzZWxmLnBhbmVkLCB0ZXh0PSdiJykKKyAgICAgICAgc2VsZi5wYW5lZC5hZGQoY2hpbGQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnNhc2hwb3MsIDEpCisKKyAgICAgICAgc2VsZi5wYW5lZC5wYWNrKGV4cGFuZD1UcnVlLCBmaWxsPSdib3RoJykKKyAgICAgICAgc2VsZi5wYW5lZC53YWl0X3Zpc2liaWxpdHkoKQorCisgICAgICAgIGN1cnJfcG9zID0gc2VsZi5wYW5lZC5zYXNocG9zKDApCisgICAgICAgIHNlbGYucGFuZWQuc2FzaHBvcygwLCAxMDAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY3Vycl9wb3MgIT0gc2VsZi5wYW5lZC5zYXNocG9zKDApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnBhbmVkLnNhc2hwb3MoMCksIGludCkpCisKKworY2xhc3MgUmFkaW9idXR0b25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2ludm9rZShzZWxmKToKKyAgICAgICAgc3VjY2VzcyA9IFtdCisgICAgICAgIGRlZiBjYl90ZXN0KCk6CisgICAgICAgICAgICBzdWNjZXNzLmFwcGVuZCgxKQorICAgICAgICAgICAgcmV0dXJuICJjYiB0ZXN0IGNhbGxlZCIKKworICAgICAgICBteXZhciA9IFRraW50ZXIuSW50VmFyKCkKKyAgICAgICAgY2J0biA9IHR0ay5SYWRpb2J1dHRvbihjb21tYW5kPWNiX3Rlc3QsIHZhcmlhYmxlPW15dmFyLCB2YWx1ZT0wKQorICAgICAgICBjYnRuMiA9IHR0ay5SYWRpb2J1dHRvbihjb21tYW5kPWNiX3Rlc3QsIHZhcmlhYmxlPW15dmFyLCB2YWx1ZT0xKQorCisgICAgICAgIHJlcyA9IGNidG4uaW52b2tlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsICJjYiB0ZXN0IGNhbGxlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2J0blsndmFsdWUnXSwgbXl2YXIuZ2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXl2YXIuZ2V0KCksCisgICAgICAgICAgICBjYnRuLnRrLmdsb2JhbGdldHZhcihjYnRuWyd2YXJpYWJsZSddKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN1Y2Nlc3MpCisKKyAgICAgICAgY2J0bjJbJ2NvbW1hbmQnXSA9ICcnCisgICAgICAgIHJlcyA9IGNidG4yLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsZW4oc3VjY2VzcykgPiAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNidG4yWyd2YWx1ZSddLCBteXZhci5nZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChteXZhci5nZXQoKSwKKyAgICAgICAgICAgIGNidG4udGsuZ2xvYmFsZ2V0dmFyKGNidG5bJ3ZhcmlhYmxlJ10pKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNidG5bJ3ZhcmlhYmxlJ10pLCBzdHIoY2J0bjJbJ3ZhcmlhYmxlJ10pKQorCisKKworY2xhc3MgU2NhbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwcG9ydC5yb290X2RlaWNvbmlmeSgpCisgICAgICAgIHNlbGYuc2NhbGUgPSB0dGsuU2NhbGUoKQorICAgICAgICBzZWxmLnNjYWxlLnBhY2soKQorICAgICAgICBzZWxmLnNjYWxlLnVwZGF0ZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuc2NhbGUuZGVzdHJveSgpCisgICAgICAgIHN1cHBvcnQucm9vdF93aXRoZHJhdygpCisKKworICAgIGRlZiB0ZXN0X2N1c3RvbV9ldmVudChzZWxmKToKKyAgICAgICAgZmFpbHVyZSA9IFsxLCAxLCAxXSAjIHdpbGwgbmVlZCB0byBiZSBlbXB0eQorCisgICAgICAgIGZ1bmNpZCA9IHNlbGYuc2NhbGUuYmluZCgnPDxSYW5nZUNoYW5nZWQ+PicsIGxhbWJkYSBldnQ6IGZhaWx1cmUucG9wKCkpCisKKyAgICAgICAgc2VsZi5zY2FsZVsnZnJvbSddID0gMTAKKyAgICAgICAgc2VsZi5zY2FsZVsnZnJvbV8nXSA9IDEwCisgICAgICAgIHNlbGYuc2NhbGVbJ3RvJ10gPSAzCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmYWlsdXJlKQorCisgICAgICAgIGZhaWx1cmUgPSBbMSwgMSwgMV0KKyAgICAgICAgc2VsZi5zY2FsZS5jb25maWd1cmUoZnJvbV89MiwgdG89NSkKKyAgICAgICAgc2VsZi5zY2FsZS5jb25maWd1cmUoZnJvbV89MCwgdG89LTIpCisgICAgICAgIHNlbGYuc2NhbGUuY29uZmlndXJlKHRvPTEwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmFpbHVyZSkKKworCisgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgorICAgICAgICBzY2FsZV93aWR0aCA9IHNlbGYuc2NhbGUud2luZm9fd2lkdGgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KHNjYWxlX3dpZHRoLCAwKSwgc2VsZi5zY2FsZVsndG8nXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KDAsIDApLCBzZWxmLnNjYWxlWydmcm9tJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgc2VsZi5zY2FsZVsndmFsdWUnXSkKKyAgICAgICAgc2VsZi5zY2FsZVsndmFsdWUnXSA9IDMwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgc2VsZi5zY2FsZVsndmFsdWUnXSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnNjYWxlLmdldCwgJycsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuc2NhbGUuZ2V0LCAwLCAnJykKKworCisgICAgZGVmIHRlc3Rfc2V0KHNlbGYpOgorICAgICAgICAjIHNldCByZXN0cmljdHMgdGhlIG1heC9taW4gdmFsdWVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCByYW5nZQorICAgICAgICBtYXggPSBzZWxmLnNjYWxlWyd0byddCisgICAgICAgIG5ld19tYXggPSBtYXggKyAxMAorICAgICAgICBzZWxmLnNjYWxlLnNldChuZXdfbWF4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIG1heCkKKyAgICAgICAgbWluID0gc2VsZi5zY2FsZVsnZnJvbSddCisgICAgICAgIHNlbGYuc2NhbGUuc2V0KG1pbiAtIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWluKQorCisgICAgICAgICMgY2hhbmdpbmcgZGlyZWN0bHkgdGhlIHZhcmlhYmxlIGRvZXNuJ3QgaW1wb3NlIHRoaXMgbGltaXRhdGlvbiB0aG8KKyAgICAgICAgdmFyID0gVGtpbnRlci5Eb3VibGVWYXIoKQorICAgICAgICBzZWxmLnNjYWxlWyd2YXJpYWJsZSddID0gdmFyCisgICAgICAgIHZhci5zZXQobWF4ICsgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCB2YXIuZ2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWF4ICsgNSkKKyAgICAgICAgZGVsIHZhcgorCisgICAgICAgICMgdGhlIHNhbWUgaGFwcGVucyB3aXRoIHRoZSB2YWx1ZSBvcHRpb24KKyAgICAgICAgc2VsZi5zY2FsZVsndmFsdWUnXSA9IG1heCArIDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWF4ICsgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgc2VsZi5zY2FsZVsndmFsdWUnXSkKKworICAgICAgICAjIG5ldmVydGhlbGVzcywgbm90ZSB0aGF0IHRoZSBtYXgvbWluIHZhbHVlcyB3ZSBjYW4gZ2V0IHNwZWNpZnlpbmcKKyAgICAgICAgIyB4LCB5IGNvb3JkcyBhcmUgdGhlIG9uZXMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHJhbmdlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoMCwgMCksIG1pbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldChzZWxmLnNjYWxlLndpbmZvX3dpZHRoKCksIDApLCBtYXgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5zY2FsZS5zZXQsIE5vbmUpCisKKworY2xhc3MgTm90ZWJvb2tUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwcG9ydC5yb290X2RlaWNvbmlmeSgpCisgICAgICAgIHNlbGYubmIgPSB0dGsuTm90ZWJvb2socGFkZGluZz0wKQorICAgICAgICBzZWxmLmNoaWxkMSA9IHR0ay5MYWJlbCgpCisgICAgICAgIHNlbGYuY2hpbGQyID0gdHRrLkxhYmVsKCkKKyAgICAgICAgc2VsZi5uYi5hZGQoc2VsZi5jaGlsZDEsIHRleHQ9J2EnKQorICAgICAgICBzZWxmLm5iLmFkZChzZWxmLmNoaWxkMiwgdGV4dD0nYicpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY2hpbGQxLmRlc3Ryb3koKQorICAgICAgICBzZWxmLmNoaWxkMi5kZXN0cm95KCkKKyAgICAgICAgc2VsZi5uYi5kZXN0cm95KCkKKyAgICAgICAgc3VwcG9ydC5yb290X3dpdGhkcmF3KCkKKworCisgICAgZGVmIHRlc3RfdGFiX2lkZW50aWZpZXJzKHNlbGYpOgorICAgICAgICBzZWxmLm5iLmZvcmdldCgwKQorICAgICAgICBzZWxmLm5iLmhpZGUoc2VsZi5jaGlsZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIudGFiLCBzZWxmLmNoaWxkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KCdlbmQnKSwgMSkKKyAgICAgICAgc2VsZi5uYi5hZGQoc2VsZi5jaGlsZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5pbmRleCgnZW5kJyksIDEpCisgICAgICAgIHNlbGYubmIuc2VsZWN0KHNlbGYuY2hpbGQyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm5iLnRhYignY3VycmVudCcpKQorICAgICAgICBzZWxmLm5iLmFkZChzZWxmLmNoaWxkMSwgdGV4dD0nYScpCisKKyAgICAgICAgc2VsZi5uYi5wYWNrKCkKKyAgICAgICAgc2VsZi5uYi53YWl0X3Zpc2liaWxpdHkoKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICB0Yl9pZHggPSAiQDIwLDUiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0Yl9pZHggPSAiQDUsNSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYih0Yl9pZHgpLCBzZWxmLm5iLnRhYignY3VycmVudCcpKQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKDUsIDEwMCwgNSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5uYi50YWIoJ0AlZCwgNScgJSBpLCB0ZXh0PU5vbmUpID09ICdhJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBUa2ludGVyLlRjbEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJUYWIgd2l0aCB0ZXh0ICdhJyBub3QgZm91bmQiKQorCisKKyAgICBkZWYgdGVzdF9hZGRfYW5kX2hpZGRlbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5oaWRlLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5oaWRlLCAnaGknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmhpZGUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuYWRkLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmFkZCwgdHRrLkxhYmVsKCksCisgICAgICAgICAgICB1bmtub3duPSdvcHRpb24nKQorCisgICAgICAgIHRhYnMgPSBzZWxmLm5iLnRhYnMoKQorICAgICAgICBzZWxmLm5iLmhpZGUoc2VsZi5jaGlsZDEpCisgICAgICAgIHNlbGYubmIuYWRkKHNlbGYuY2hpbGQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCB0YWJzKQorCisgICAgICAgIGNoaWxkID0gdHRrLkxhYmVsKCkKKyAgICAgICAgc2VsZi5uYi5hZGQoY2hpbGQsIHRleHQ9J2MnKQorICAgICAgICB0YWJzID0gc2VsZi5uYi50YWJzKCkKKworICAgICAgICBjdXJyID0gc2VsZi5uYi5pbmRleCgnY3VycmVudCcpCisgICAgICAgICMgdmVyaWZ5IHRoYXQgdGhlIHRhYiBnZXRzIHJlYWRkZWQgYXQgaXRzIHByZXZpb3VzIHBvc2l0aW9uCisgICAgICAgIGNoaWxkMl9pbmRleCA9IHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDIpCisgICAgICAgIHNlbGYubmIuaGlkZShzZWxmLmNoaWxkMikKKyAgICAgICAgc2VsZi5uYi5hZGQoc2VsZi5jaGlsZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWJzKCksIHRhYnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMiksIGNoaWxkMl9pbmRleCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihzZWxmLmNoaWxkMikgPT0gc2VsZi5uYi50YWJzKClbY2hpbGQyX2luZGV4XSkKKyAgICAgICAgIyBidXQgdGhlIHRhYiBuZXh0IHRvIGl0IChub3QgaGlkZGVuKSBpcyB0aGUgb25lIHNlbGVjdGVkIG5vdworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoJ2N1cnJlbnQnKSwgY3VyciArIDEpCisKKworICAgIGRlZiB0ZXN0X2ZvcmdldChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5mb3JnZXQsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmZvcmdldCwgJ2hpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5mb3JnZXQsIE5vbmUpCisKKyAgICAgICAgdGFicyA9IHNlbGYubmIudGFicygpCisgICAgICAgIGNoaWxkMV9pbmRleCA9IHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDEpCisgICAgICAgIHNlbGYubmIuZm9yZ2V0KHNlbGYuY2hpbGQxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHN0cihzZWxmLmNoaWxkMSkgaW4gc2VsZi5uYi50YWJzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRhYnMpIC0gMSwgbGVuKHNlbGYubmIudGFicygpKSkKKworICAgICAgICBzZWxmLm5iLmFkZChzZWxmLmNoaWxkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjaGlsZDFfaW5kZXggPT0gc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMSkpCisKKworICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluZGV4LCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbmRleCwgTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLm5iLmluZGV4KCdlbmQnKSwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQxKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQyKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KCdlbmQnKSwgMikKKworCisgICAgZGVmIHRlc3RfaW5zZXJ0KHNlbGYpOgorICAgICAgICAjIG1vdmluZyB0YWJzCisgICAgICAgIHRhYnMgPSBzZWxmLm5iLnRhYnMoKQorICAgICAgICBzZWxmLm5iLmluc2VydCgxLCB0YWJzWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCAodGFic1sxXSwgdGFic1swXSkpCisgICAgICAgIHNlbGYubmIuaW5zZXJ0KHNlbGYuY2hpbGQxLCBzZWxmLmNoaWxkMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgdGFicykKKyAgICAgICAgc2VsZi5uYi5pbnNlcnQoJ2VuZCcsIHNlbGYuY2hpbGQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCAodGFic1sxXSwgdGFic1swXSkpCisgICAgICAgIHNlbGYubmIuaW5zZXJ0KCdlbmQnLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCB0YWJzKQorICAgICAgICAjIGJhZCBtb3ZlcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgMiwgdGFic1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbnNlcnQsIC0xLCB0YWJzWzBdKQorCisgICAgICAgICMgbmV3IHRhYgorICAgICAgICBjaGlsZDMgPSB0dGsuTGFiZWwoKQorICAgICAgICBzZWxmLm5iLmluc2VydCgxLCBjaGlsZDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWJzKCksICh0YWJzWzBdLCBzdHIoY2hpbGQzKSwgdGFic1sxXSkpCisgICAgICAgIHNlbGYubmIuZm9yZ2V0KGNoaWxkMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgdGFicykKKyAgICAgICAgc2VsZi5uYi5pbnNlcnQoc2VsZi5jaGlsZDEsIGNoaWxkMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgKHN0cihjaGlsZDMpLCApICsgdGFicykKKyAgICAgICAgc2VsZi5uYi5mb3JnZXQoY2hpbGQzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgMiwgY2hpbGQzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgLTEsIGNoaWxkMykKKworICAgICAgICAjIGJhZCBpbnNlcnRzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCAnZW5kJywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbnNlcnQsIE5vbmUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCBOb25lLCBOb25lKQorCisKKyAgICBkZWYgdGVzdF9zZWxlY3Qoc2VsZik6CisgICAgICAgIHNlbGYubmIucGFjaygpCisgICAgICAgIHNlbGYubmIud2FpdF92aXNpYmlsaXR5KCkKKworICAgICAgICBzdWNjZXNzID0gW10KKyAgICAgICAgdGFiX2NoYW5nZWQgPSBbXQorCisgICAgICAgIHNlbGYuY2hpbGQxLmJpbmQoJzxVbm1hcD4nLCBsYW1iZGEgZXZ0OiBzdWNjZXNzLmFwcGVuZChUcnVlKSkKKyAgICAgICAgc2VsZi5uYi5iaW5kKCc8PE5vdGVib29rVGFiQ2hhbmdlZD4+JywKKyAgICAgICAgICAgIGxhbWJkYSBldnQ6IHRhYl9jaGFuZ2VkLmFwcGVuZChUcnVlKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMSkpCisgICAgICAgIHNlbGYubmIuc2VsZWN0KHNlbGYuY2hpbGQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3VjY2VzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnNlbGVjdCgpLCBzdHIoc2VsZi5jaGlsZDIpKQorCisgICAgICAgIHNlbGYubmIudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhYl9jaGFuZ2VkKQorCisKKyAgICBkZWYgdGVzdF90YWIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIudGFiLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi50YWIsICdub3RhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIudGFiLCBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYubmIudGFiKHNlbGYuY2hpbGQxKSwgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWIoc2VsZi5jaGlsZDEsIHRleHQ9Tm9uZSksICdhJykKKyAgICAgICAgIyBuZXdlciBmb3JtIGZvciBxdWVyeWluZyBhIHNpbmdsZSBvcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSwgJ3RleHQnKSwgJ2EnKQorICAgICAgICBzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSwgdGV4dD0nYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSwgdGV4dD1Ob25lKSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWIoc2VsZi5jaGlsZDEsICd0ZXh0JyksICdhYmMnKQorCisKKyAgICBkZWYgdGVzdF90YWJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLm5iLnRhYnMoKSksIDIpCisKKyAgICAgICAgc2VsZi5uYi5mb3JnZXQoc2VsZi5jaGlsZDEpCisgICAgICAgIHNlbGYubmIuZm9yZ2V0KHNlbGYuY2hpbGQyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWJzKCksICgpKQorCisKKyAgICBkZWYgdGVzdF90cmF2ZXJzYWwoc2VsZik6CisgICAgICAgIHNlbGYubmIucGFjaygpCisgICAgICAgIHNlbGYubmIud2FpdF92aXNpYmlsaXR5KCkKKworICAgICAgICBzZWxmLm5iLnNlbGVjdCgwKQorCisgICAgICAgIHN1cHBvcnQuc2ltdWxhdGVfbW91c2VfY2xpY2soc2VsZi5uYiwgNSwgNSkKKyAgICAgICAgc2VsZi5uYi5mb2N1c19mb3JjZSgpCisgICAgICAgIHNlbGYubmIuZXZlbnRfZ2VuZXJhdGUoJzxDb250cm9sLVRhYj4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMikpCisgICAgICAgIHNlbGYubmIuZm9jdXNfZm9yY2UoKQorICAgICAgICBzZWxmLm5iLmV2ZW50X2dlbmVyYXRlKCc8U2hpZnQtQ29udHJvbC1UYWI+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnNlbGVjdCgpLCBzdHIoc2VsZi5jaGlsZDEpKQorICAgICAgICBzZWxmLm5iLmZvY3VzX2ZvcmNlKCkKKyAgICAgICAgc2VsZi5uYi5ldmVudF9nZW5lcmF0ZSgnPFNoaWZ0LUNvbnRyb2wtVGFiPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5zZWxlY3QoKSwgc3RyKHNlbGYuY2hpbGQyKSkKKworICAgICAgICBzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSwgdGV4dD0nYScsIHVuZGVybGluZT0wKQorICAgICAgICBzZWxmLm5iLmVuYWJsZV90cmF2ZXJzYWwoKQorICAgICAgICBzZWxmLm5iLmZvY3VzX2ZvcmNlKCkKKyAgICAgICAgc3VwcG9ydC5zaW11bGF0ZV9tb3VzZV9jbGljayhzZWxmLm5iLCA1LCA1KQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICBzZWxmLm5iLmV2ZW50X2dlbmVyYXRlKCc8T3B0aW9uLWE+JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubmIuZXZlbnRfZ2VuZXJhdGUoJzxBbHQtYT4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMSkpCisKKworY2xhc3MgVHJlZXZpZXdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwcG9ydC5yb290X2RlaWNvbmlmeSgpCisgICAgICAgIHNlbGYudHYgPSB0dGsuVHJlZXZpZXcocGFkZGluZz0wKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnR2LmRlc3Ryb3koKQorICAgICAgICBzdXBwb3J0LnJvb3Rfd2l0aGRyYXcoKQorCisKKyAgICBkZWYgdGVzdF9iYm94KHNlbGYpOgorICAgICAgICBzZWxmLnR2LnBhY2soKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuYmJveCgnJyksICcnKQorICAgICAgICBzZWxmLnR2LndhaXRfdmlzaWJpbGl0eSgpCisgICAgICAgIHNlbGYudHYudXBkYXRlKCkKKworICAgICAgICBpdGVtX2lkID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQorICAgICAgICBjaGlsZHJlbiA9IHNlbGYudHYuZ2V0X2NoaWxkcmVuKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoaWxkcmVuKQorCisgICAgICAgIGJib3ggPSBzZWxmLnR2LmJib3goY2hpbGRyZW5bMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJib3gpLCA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShiYm94LCB0dXBsZSkpCisgICAgICAgIGZvciBpdGVtIGluIGJib3g6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCBpbnQpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiSW52YWxpZCBib3VuZGluZyBib3g6ICVzIiAlIGJib3gpCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAjIGNvbXBhcmUgd2lkdGggaW4gYmJveGVzCisgICAgICAgIHNlbGYudHZbJ2NvbHVtbnMnXSA9IFsndGVzdCddCisgICAgICAgIHNlbGYudHYuY29sdW1uKCd0ZXN0Jywgd2lkdGg9NTApCisgICAgICAgIGJib3hfY29sdW1uMCA9IHNlbGYudHYuYmJveChjaGlsZHJlblswXSwgMCkKKyAgICAgICAgcm9vdF93aWR0aCA9IHNlbGYudHYuY29sdW1uKCcjMCcsIHdpZHRoPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmJveF9jb2x1bW4wWzBdLCBiYm94WzBdICsgcm9vdF93aWR0aCkKKworICAgICAgICAjIHZlcmlmeSB0aGF0IGJib3ggb2YgYSBjbG9zZWQgaXRlbSBpcyB0aGUgZW1wdHkgc3RyaW5nCisgICAgICAgIGNoaWxkMSA9IHNlbGYudHYuaW5zZXJ0KGl0ZW1faWQsICdlbmQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuYmJveChjaGlsZDEpLCAnJykKKworCisgICAgZGVmIHRlc3RfY2hpbGRyZW4oc2VsZik6CisgICAgICAgICMgbm8gY2hpbGRyZW4geWV0LCBzaG91bGQgZ2V0IGFuIGVtcHR5IHR1cGxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKCkpCisKKyAgICAgICAgaXRlbV9pZCA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKClbMF0sIGl0ZW1faWQpCisKKyAgICAgICAgIyBhZGQgaXRlbV9pZCBhbmQgY2hpbGQzIGFzIGNoaWxkcmVuIG9mIGNoaWxkMgorICAgICAgICBjaGlsZDIgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCisgICAgICAgIGNoaWxkMyA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKKyAgICAgICAgc2VsZi50di5zZXRfY2hpbGRyZW4oY2hpbGQyLCBpdGVtX2lkLCBjaGlsZDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oY2hpbGQyKSwgKGl0ZW1faWQsIGNoaWxkMykpCisKKyAgICAgICAgIyBjaGlsZDMgaGFzIGNoaWxkMiBhcyBwYXJlbnQsIHRodXMgdHJ5aW5nIHRvIHNldCBjaGlsZDIgYXMgYSBjaGlsZHJlbgorICAgICAgICAjIG9mIGNoaWxkMyBzaG91bGQgcmVzdWx0IGluIGFuIGVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsCisgICAgICAgICAgICBzZWxmLnR2LnNldF9jaGlsZHJlbiwgY2hpbGQzLCBjaGlsZDIpCisKKyAgICAgICAgIyByZW1vdmUgY2hpbGQyIGNoaWxkcmVuCisgICAgICAgIHNlbGYudHYuc2V0X2NoaWxkcmVuKGNoaWxkMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihjaGlsZDIpLCAoKSkKKworICAgICAgICAjIHJlbW92ZSByb290J3MgY2hpbGRyZW4KKyAgICAgICAgc2VsZi50di5zZXRfY2hpbGRyZW4oJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKCkpCisKKworICAgIGRlZiB0ZXN0X2NvbHVtbihzZWxmKToKKyAgICAgICAgIyByZXR1cm4gYSBkaWN0IHdpdGggYWxsIG9wdGlvbnMvdmFsdWVzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYudHYuY29sdW1uKCcjMCcpLCBkaWN0KSkKKyAgICAgICAgIyByZXR1cm4gYSBzaW5nbGUgdmFsdWUgb2YgdGhlIGdpdmVuIG9wdGlvbgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnR2LmNvbHVtbignIzAnLCB3aWR0aD1Ob25lKSwgaW50KSkKKyAgICAgICAgIyBzZXQgYSBuZXcgdmFsdWUgZm9yIGFuIG9wdGlvbgorICAgICAgICBzZWxmLnR2LmNvbHVtbignIzAnLCB3aWR0aD0xMCkKKyAgICAgICAgIyB0ZXN0aW5nIG5ldyB3YXkgdG8gZ2V0IG9wdGlvbiB2YWx1ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuY29sdW1uKCcjMCcsICd3aWR0aCcpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmNvbHVtbignIzAnLCB3aWR0aD1Ob25lKSwgMTApCisgICAgICAgICMgY2hlY2sgcmVhZC1vbmx5IG9wdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmNvbHVtbiwgJyMwJywgaWQ9J1gnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuY29sdW1uLCAnaW52YWxpZCcpCisgICAgICAgIGludmFsaWRfa3dzID0gWworICAgICAgICAgICAgeyd1bmtub3duX29wdGlvbic6ICdzb21lIHZhbHVlJ30sICB7J3N0cmV0Y2gnOiAnd3JvbmcnfSwKKyAgICAgICAgICAgIHsnYW5jaG9yJzogJ3dyb25nJ30sIHsnd2lkdGgnOiAnd3JvbmcnfSwgeydtaW53aWR0aCc6ICd3cm9uZyd9CisgICAgICAgIF0KKyAgICAgICAgZm9yIGt3IGluIGludmFsaWRfa3dzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5jb2x1bW4sICcjMCcsCisgICAgICAgICAgICAgICAgKiprdykKKworCisgICAgZGVmIHRlc3RfZGVsZXRlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmRlbGV0ZSwgJyMwJykKKworICAgICAgICBpdGVtX2lkID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQorICAgICAgICBpdGVtMiA9IHNlbGYudHYuaW5zZXJ0KGl0ZW1faWQsICdlbmQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksIChpdGVtX2lkLCApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGl0ZW1faWQpLCAoaXRlbTIsICkpCisKKyAgICAgICAgc2VsZi50di5kZWxldGUoaXRlbV9pZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2LmdldF9jaGlsZHJlbigpKQorCisgICAgICAgICMgcmVhdHRhY2ggc2hvdWxkIGZhaWwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgICAgIHNlbGYudHYucmVhdHRhY2gsIGl0ZW1faWQsICcnLCAnZW5kJykKKworICAgICAgICAjIHRlc3QgbXVsdGlwbGUgaXRlbSBkZWxldGUKKyAgICAgICAgaXRlbTEgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCisgICAgICAgIGl0ZW0yID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksIChpdGVtMSwgaXRlbTIpKQorCisgICAgICAgIHNlbGYudHYuZGVsZXRlKGl0ZW0xLCBpdGVtMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2LmdldF9jaGlsZHJlbigpKQorCisKKyAgICBkZWYgdGVzdF9kZXRhY2hfcmVhdHRhY2goc2VsZik6CisgICAgICAgIGl0ZW1faWQgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCisgICAgICAgIGl0ZW0yID0gc2VsZi50di5pbnNlcnQoaXRlbV9pZCwgJ2VuZCcpCisKKyAgICAgICAgIyBjYWxsaW5nIGRldGFjaCB3aXRob3V0IGl0ZW1zIGlzIHZhbGlkLCBhbHRob3VnaCBpdCBkb2VzIG5vdGhpbmcKKyAgICAgICAgcHJldiA9IHNlbGYudHYuZ2V0X2NoaWxkcmVuKCkKKyAgICAgICAgc2VsZi50di5kZXRhY2goKSAjIHRoaXMgc2hvdWxkIGRvIG5vdGhpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcmV2LCBzZWxmLnR2LmdldF9jaGlsZHJlbigpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKGl0ZW1faWQsICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oaXRlbV9pZCksIChpdGVtMiwgKSkKKworICAgICAgICAjIGRldGFjaCBpdGVtIHdpdGggY2hpbGRyZW4KKyAgICAgICAgc2VsZi50di5kZXRhY2goaXRlbV9pZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2LmdldF9jaGlsZHJlbigpKQorCisgICAgICAgICMgcmVhdHRhY2ggaXRlbSB3aXRoIGNoaWxkcmVuCisgICAgICAgIHNlbGYudHYucmVhdHRhY2goaXRlbV9pZCwgJycsICdlbmQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksIChpdGVtX2lkLCApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGl0ZW1faWQpLCAoaXRlbTIsICkpCisKKyAgICAgICAgIyBtb3ZlIGEgY2hpbGRyZW4gdG8gdGhlIHJvb3QKKyAgICAgICAgc2VsZi50di5tb3ZlKGl0ZW0yLCAnJywgJ2VuZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKGl0ZW1faWQsIGl0ZW0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihpdGVtX2lkKSwgKCkpCisKKyAgICAgICAgIyBiYWQgdmFsdWVzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsCisgICAgICAgICAgICBzZWxmLnR2LnJlYXR0YWNoLCAnbm9uZXhpc3RlbnQnLCAnJywgJ2VuZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsCisgICAgICAgICAgICBzZWxmLnR2LmRldGFjaCwgJ25vbmV4aXN0ZW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgICAgIHNlbGYudHYucmVhdHRhY2gsIGl0ZW0yLCAnb3RoZXJwYXJlbnQnLCAnZW5kJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgICAgIHNlbGYudHYucmVhdHRhY2gsIGl0ZW0yLCAnJywgJ2ludmFsaWQnKQorCisgICAgICAgICMgbXVsdGlwbGUgZGV0YWNoCisgICAgICAgIHNlbGYudHYuZGV0YWNoKGl0ZW1faWQsIGl0ZW0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGl0ZW1faWQpLCAoKSkKKworCisgICAgZGVmIHRlc3RfZXhpc3RzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZXhpc3RzKCdzb21ldGhpbmcnKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5leGlzdHMoJycpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZXhpc3RzKHt9KSwgRmFsc2UpCisKKyAgICAgICAgIyB0aGUgZm9sbG93aW5nIHdpbGwgbWFrZSBhIHRrLmNhbGwgZXF1aXZhbGVudCB0bworICAgICAgICAjIHRrLmNhbGwodHJlZXZpZXcsICJleGlzdHMiKSB3aGljaCBzaG91bGQgcmVzdWx0IGluIGFuIGVycm9yCisgICAgICAgICMgaW4gdGhlIHRjbCBpbnRlcnByZXRlciBzaW5jZSB0ayByZXF1aXJlcyBhbiBpdGVtLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmV4aXN0cywgTm9uZSkKKworCisgICAgZGVmIHRlc3RfZm9jdXMoc2VsZik6CisgICAgICAgICMgbm90aGluZyBpcyBmb2N1c2VkIHJpZ2h0IG5vdworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZm9jdXMoKSwgJycpCisKKyAgICAgICAgaXRlbTEgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCisgICAgICAgIHNlbGYudHYuZm9jdXMoaXRlbTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5mb2N1cygpLCBpdGVtMSkKKworICAgICAgICBzZWxmLnR2LmRlbGV0ZShpdGVtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmZvY3VzKCksICcnKQorCisgICAgICAgICMgdHJ5IGZvY3VzaW5nIGluZXhpc3RlbnQgaXRlbQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmZvY3VzLCAnaGknKQorCisKKyAgICBkZWYgdGVzdF9oZWFkaW5nKHNlbGYpOgorICAgICAgICAjIGNoZWNrIGEgZGljdCBpcyByZXR1cm5lZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnR2LmhlYWRpbmcoJyMwJyksIGRpY3QpKQorCisgICAgICAgICMgY2hlY2sgYSB2YWx1ZSBpcyByZXR1cm5lZAorICAgICAgICBzZWxmLnR2LmhlYWRpbmcoJyMwJywgdGV4dD0naGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaGVhZGluZygnIzAnLCAndGV4dCcpLCAnaGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaGVhZGluZygnIzAnLCB0ZXh0PU5vbmUpLCAnaGknKQorCisgICAgICAgICMgaW52YWxpZCBvcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5oZWFkaW5nLCAnIzAnLAorICAgICAgICAgICAgYmFja2dyb3VuZD1Ob25lKQorICAgICAgICAjIGludmFsaWQgdmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5oZWFkaW5nLCAnIzAnLAorICAgICAgICAgICAgYW5jaG9yPTEpCisKKyAgICAjIFhYWCBza2lwcGluZyBmb3Igbm93OyBzaG91bGQgYmUgZml4ZWQgdG8gd29yayB3aXRoIG5ld2VyIHR0aworICAgIEB1bml0dGVzdC5za2lwKCJza2lwcGluZyBwZW5kaW5nIHJlc29sdXRpb24gb2YgSXNzdWUgIzEwNzM0IikKKyAgICBkZWYgdGVzdF9oZWFkaW5nX2NhbGxiYWNrKHNlbGYpOgorICAgICAgICBkZWYgc2ltdWxhdGVfaGVhZGluZ19jbGljayh4LCB5KToKKyAgICAgICAgICAgIHN1cHBvcnQuc2ltdWxhdGVfbW91c2VfY2xpY2soc2VsZi50diwgeCwgeSkKKyAgICAgICAgICAgIHNlbGYudHYudXBkYXRlX2lkbGV0YXNrcygpCisKKyAgICAgICAgc3VjY2VzcyA9IFtdICMgbm8gc3VjY2VzcyBmb3Igbm93CisKKyAgICAgICAgc2VsZi50di5wYWNrKCkKKyAgICAgICAgc2VsZi50di53YWl0X3Zpc2liaWxpdHkoKQorICAgICAgICBzZWxmLnR2LmhlYWRpbmcoJyMwJywgY29tbWFuZD1sYW1iZGE6IHN1Y2Nlc3MuYXBwZW5kKFRydWUpKQorICAgICAgICBzZWxmLnR2LmNvbHVtbignIzAnLCB3aWR0aD0xMDApCisgICAgICAgIHNlbGYudHYudXBkYXRlKCkKKworICAgICAgICAjIGFzc3VtaW5nIHRoYXQgdGhlIGNvb3JkcyAoNSwgNSkgZmFsbCBpbnRvIGhlYWRpbmcgIzAKKyAgICAgICAgc2ltdWxhdGVfaGVhZGluZ19jbGljayg1LCA1KQorICAgICAgICBpZiBub3Qgc3VjY2VzczoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGhlIGNvbW1hbmQgYXNzb2NpYXRlZCB0byB0aGUgdHJlZXZpZXcgaGVhZGluZyB3YXNuJ3QgIgorICAgICAgICAgICAgICAgICJpbnZva2VkLiIpCisKKyAgICAgICAgc3VjY2VzcyA9IFtdCisgICAgICAgIGNvbW1hbmRzID0gc2VsZi50di5tYXN0ZXIuX3RjbENvbW1hbmRzCisgICAgICAgIHNlbGYudHYuaGVhZGluZygnIzAnLCBjb21tYW5kPXN0cihzZWxmLnR2LmhlYWRpbmcoJyMwJywgY29tbWFuZD1Ob25lKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tbWFuZHMsIHNlbGYudHYubWFzdGVyLl90Y2xDb21tYW5kcykKKyAgICAgICAgc2ltdWxhdGVfaGVhZGluZ19jbGljayg1LCA1KQorICAgICAgICBpZiBub3Qgc3VjY2VzczoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGhlIGNvbW1hbmQgYXNzb2NpYXRlZCB0byB0aGUgdHJlZXZpZXcgaGVhZGluZyB3YXNuJ3QgIgorICAgICAgICAgICAgICAgICJpbnZva2VkLiIpCisKKyAgICAgICAgIyBYWFggVGhlIGZvbGxvd2luZyByYWlzZXMgYW4gZXJyb3IgaW4gYSB0Y2wgaW50ZXJwcmV0ZXIsIGJ1dCBub3QgaW4KKyAgICAgICAgIyBQeXRob24KKyAgICAgICAgI3NlbGYudHYuaGVhZGluZygnIzAnLCBjb21tYW5kPSdJIGRvbnQgZXhpc3QnKQorICAgICAgICAjc2ltdWxhdGVfaGVhZGluZ19jbGljayg1LCA1KQorCisKKyAgICBkZWYgdGVzdF9pbmRleChzZWxmKToKKyAgICAgICAgIyBpdGVtICd3aGF0JyBkb2Vzbid0IGV4aXN0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5kZXgsICd3aGF0JykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaW5kZXgoJycpLCAwKQorCisgICAgICAgIGl0ZW0xID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQorICAgICAgICBpdGVtMiA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKKyAgICAgICAgYzEgPSBzZWxmLnR2Lmluc2VydChpdGVtMSwgJ2VuZCcpCisgICAgICAgIGMyID0gc2VsZi50di5pbnNlcnQoaXRlbTEsICdlbmQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaW5kZXgoaXRlbTEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaW5kZXgoYzEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaW5kZXgoYzIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaW5kZXgoaXRlbTIpLCAxKQorCisgICAgICAgIHNlbGYudHYubW92ZShpdGVtMiwgJycsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChpdGVtMiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChpdGVtMSksIDEpCisKKyAgICAgICAgIyBjaGVjayB0aGF0IGluZGV4IHN0aWxsIHdvcmtzIGV2ZW4gYWZ0ZXIgaXRzIHBhcmVudCBhbmQgc2libGluZ3MKKyAgICAgICAgIyBoYXZlIGJlZW4gZGV0YWNoZWQKKyAgICAgICAgc2VsZi50di5kZXRhY2goaXRlbTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChjMiksIDEpCisgICAgICAgIHNlbGYudHYuZGV0YWNoKGMxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaW5kZXgoYzIpLCAwKQorCisgICAgICAgICMgYnV0IGl0IGZhaWxzIGFmdGVyIGl0ZW0gaGFzIGJlZW4gZGVsZXRlZAorICAgICAgICBzZWxmLnR2LmRlbGV0ZShpdGVtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbmRleCwgYzIpCisKKworICAgIGRlZiB0ZXN0X2luc2VydF9pdGVtKHNlbGYpOgorICAgICAgICAjIHBhcmVudCAnbm9uZScgZG9lc24ndCBleGlzdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJ25vbmUnLCAnZW5kJykKKworICAgICAgICAjIG9wZW4gdmFsdWVzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ2VuZCcsCisgICAgICAgICAgICBvcGVuPScnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJycsICdlbmQnLAorICAgICAgICAgICAgb3Blbj0ncGxlYXNlJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2LmRlbGV0ZShzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIG9wZW49VHJ1ZSkpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudHYuZGVsZXRlKHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgb3Blbj1GYWxzZSkpKQorCisgICAgICAgICMgaW52YWxpZCBpbmRleAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJycsICdtaWRkbGUnKQorCisgICAgICAgICMgdHJ5aW5nIHRvIGR1cGxpY2F0ZSBpdGVtIGlkIGlzIGludmFsaWQKKyAgICAgICAgaXRlbWlkID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCAnZmlyc3QtaXRlbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbWlkLCAnZmlyc3QtaXRlbScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ2VuZCcsCisgICAgICAgICAgICAnZmlyc3QtaXRlbScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ2VuZCcsCisgICAgICAgICAgICBNb2NrVGNsT2JqKCdmaXJzdC1pdGVtJykpCisKKyAgICAgICAgIyB1bmljb2RlIHZhbHVlcworICAgICAgICB2YWx1ZSA9IHUnXHhlMWJhJworICAgICAgICBpdGVtID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCB2YWx1ZXM9KHZhbHVlLCApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCAndmFsdWVzJyksICh2YWx1ZSwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLCAodmFsdWUsICkpCisKKyAgICAgICAgc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1saXN0KHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICh2YWx1ZSwgKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnR2Lml0ZW0oaXRlbSksIGRpY3QpKQorCisgICAgICAgICMgZXJhc2UgaXRlbSB2YWx1ZXMKKyAgICAgICAgc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz0nJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpKQorCisgICAgICAgICMgaXRlbSB0YWdzCisgICAgICAgIGl0ZW0gPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIHRhZ3M9WzEsIDIsIHZhbHVlXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSwgKCcxJywgJzInLCB2YWx1ZSkpCisgICAgICAgIHNlbGYudHYuaXRlbShpdGVtLCB0YWdzPVtdKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudHYuaXRlbShpdGVtLCB0YWdzPU5vbmUpKQorICAgICAgICBzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz0oMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sIHRhZ3M9Tm9uZSksICgnMScsICcyJykpCisKKyAgICAgICAgIyB2YWx1ZXMgd2l0aCBzcGFjZXMKKyAgICAgICAgaXRlbSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgdmFsdWVzPSgnYSBiIGMnLAorICAgICAgICAgICAgJyVzICVzJyAlICh2YWx1ZSwgdmFsdWUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLAorICAgICAgICAgICAgKCdhIGIgYycsICclcyAlcycgJSAodmFsdWUsIHZhbHVlKSkpCisKKyAgICAgICAgIyB0ZXh0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKAorICAgICAgICAgICAgc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCB0ZXh0PSJMYWJlbCBoZXJlIiksIHRleHQ9Tm9uZSksCisgICAgICAgICAgICAiTGFiZWwgaGVyZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKAorICAgICAgICAgICAgc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCB0ZXh0PXZhbHVlKSwgdGV4dD1Ob25lKSwKKyAgICAgICAgICAgIHZhbHVlKQorCisKKyAgICBkZWYgdGVzdF9zZXQoc2VsZik6CisgICAgICAgIHNlbGYudHZbJ2NvbHVtbnMnXSA9IFsnQScsICdCJ10KKyAgICAgICAgaXRlbSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgdmFsdWVzPVsnYScsICdiJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSksIHsnQSc6ICdhJywgJ0InOiAnYid9KQorCisgICAgICAgIHNlbGYudHYuc2V0KGl0ZW0sICdCJywgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICgnYScsICdhJykpCisKKyAgICAgICAgc2VsZi50dlsnY29sdW1ucyddID0gWydCJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNldChpdGVtKSwgeydCJzogJ2EnfSkKKworICAgICAgICBzZWxmLnR2LnNldChpdGVtLCAnQicsICdiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNldChpdGVtLCBjb2x1bW49J0InKSwgJ2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICgnYicsICdhJykpCisKKyAgICAgICAgc2VsZi50di5zZXQoaXRlbSwgJ0InLCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSwgJ0InKSwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICgxMjMsICdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSksIHsnQic6IDEyM30pCisKKyAgICAgICAgIyBpbmV4aXN0ZW50IGNvbHVtbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LnNldCwgaXRlbSwgJ0EnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LnNldCwgaXRlbSwgJ0EnLCAnYicpCisKKyAgICAgICAgIyBpbmV4aXN0ZW50IGl0ZW0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5zZXQsICdub3RtZScpCisKKworICAgIGRlZiB0ZXN0X3RhZ19iaW5kKHNlbGYpOgorICAgICAgICBldmVudHMgPSBbXQorICAgICAgICBpdGVtMSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgdGFncz1bJ2NhbGwnXSkKKyAgICAgICAgaXRlbTIgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIHRhZ3M9WydjYWxsJ10pCisgICAgICAgIHNlbGYudHYudGFnX2JpbmQoJ2NhbGwnLCAnPEJ1dHRvblByZXNzLTE+JywKKyAgICAgICAgICAgIGxhbWJkYSBldnQ6IGV2ZW50cy5hcHBlbmQoMSkpCisgICAgICAgIHNlbGYudHYudGFnX2JpbmQoJ2NhbGwnLCAnPEJ1dHRvblJlbGVhc2UtMT4nLAorICAgICAgICAgICAgbGFtYmRhIGV2dDogZXZlbnRzLmFwcGVuZCgyKSkKKworICAgICAgICBzZWxmLnR2LnBhY2soKQorICAgICAgICBzZWxmLnR2LndhaXRfdmlzaWJpbGl0eSgpCisgICAgICAgIHNlbGYudHYudXBkYXRlKCkKKworICAgICAgICBwb3NfeSA9IHNldCgpCisgICAgICAgIGZvdW5kID0gc2V0KCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgMTAwLCAxMCk6CisgICAgICAgICAgICBpZiBsZW4oZm91bmQpID09IDI6ICMgaXRlbTEgYW5kIGl0ZW0yIGFscmVhZHkgZm91bmQKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaXRlbV9pZCA9IHNlbGYudHYuaWRlbnRpZnlfcm93KGkpCisgICAgICAgICAgICBpZiBpdGVtX2lkIGFuZCBpdGVtX2lkIG5vdCBpbiBmb3VuZDoKKyAgICAgICAgICAgICAgICBwb3NfeS5hZGQoaSkKKyAgICAgICAgICAgICAgICBmb3VuZC5hZGQoaXRlbV9pZCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwb3NfeSksIDIpICMgaXRlbTEgYW5kIGl0ZW0yIHkgcG9zCisgICAgICAgIGZvciB5IGluIHBvc195OgorICAgICAgICAgICAgc3VwcG9ydC5zaW11bGF0ZV9tb3VzZV9jbGljayhzZWxmLnR2LCAwLCB5KQorCisgICAgICAgICMgYnkgbm93IHRoZXJlIHNob3VsZCBiZSA0IHRoaW5ncyBpbiB0aGUgZXZlbnRzIGxpc3QsIHNpbmNlIGVhY2gKKyAgICAgICAgIyBpdGVtIGhhZCBhIGJpbmQgZm9yIHR3byBldmVudHMgdGhhdCB3ZXJlIHNpbXVsYXRlZCBhYm92ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihldmVudHMpLCA0KQorICAgICAgICBmb3IgZXZ0IGluIHppcChldmVudHNbOjoyXSwgZXZlbnRzWzE6OjJdKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZ0LCAoMSwgMikpCisKKworICAgIGRlZiB0ZXN0X3RhZ19jb25maWd1cmUoc2VsZik6CisgICAgICAgICMgSnVzdCB0ZXN0aW5nIHBhcmFtZXRlciBwYXNzaW5nIGZvciBub3cKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR2LnRhZ19jb25maWd1cmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYudGFnX2NvbmZpZ3VyZSwKKyAgICAgICAgICAgICd0ZXN0Jywgc2t5PSdibHVlJykKKyAgICAgICAgc2VsZi50di50YWdfY29uZmlndXJlKCd0ZXN0JywgZm9yZWdyb3VuZD0nYmx1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHNlbGYudHYudGFnX2NvbmZpZ3VyZSgndGVzdCcsICdmb3JlZ3JvdW5kJykpLAorICAgICAgICAgICAgJ2JsdWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihzZWxmLnR2LnRhZ19jb25maWd1cmUoJ3Rlc3QnLCBmb3JlZ3JvdW5kPU5vbmUpKSwKKyAgICAgICAgICAgICdibHVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di50YWdfY29uZmlndXJlKCd0ZXN0JyksIGRpY3QpKQorCisKK3Rlc3RzX2d1aSA9ICgKKyAgICAgICAgV2lkZ2V0VGVzdCwgQnV0dG9uVGVzdCwgQ2hlY2tidXR0b25UZXN0LCBSYWRpb2J1dHRvblRlc3QsCisgICAgICAgIENvbWJvYm94VGVzdCwgRW50cnlUZXN0LCBQYW5lZHdpbmRvd1Rlc3QsIFNjYWxlVGVzdCwgTm90ZWJvb2tUZXN0LAorICAgICAgICBUcmVldmlld1Rlc3QKKyAgICAgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCgqdGVzdHNfZ3VpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3dpZGdldHMucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3dpZGdldHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NjNhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3dpZGdldHMucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3dpZGdldHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NjNhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb2xvckNob29zZXIucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0NvbG9yQ2hvb3Nlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjYyODNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb2xvckNob29zZXIucHkKQEAgLTAsMCArMSw3MiBAQAorIyB0ayBjb21tb24gY29sb3VyIGNob29zZXIgZGlhbG9ndWUKKyMKKyMgdGhpcyBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBuYXRpdmUgY29sb3IgZGlhbG9ndWUKKyMgYXZhaWxhYmxlIGluIFRrIDQuMiBhbmQgbmV3ZXIuCisjCisjIHdyaXR0ZW4gYnkgRnJlZHJpayBMdW5kaCwgTWF5IDE5OTcKKyMKKyMgZml4ZWQgaW5pdGlhbGNvbG9yIGhhbmRsaW5nIGluIEF1Z3VzdCAxOTk4CisjCisKKyMKKyMgb3B0aW9ucyAoYWxsIGhhdmUgZGVmYXVsdCB2YWx1ZXMpOgorIworIyAtIGluaXRpYWxjb2xvcjogY29sb3VyIHRvIG1hcmsgYXMgc2VsZWN0ZWQgd2hlbiBkaWFsb2cgaXMgZGlzcGxheWVkCisjICAgKGdpdmVuIGFzIGFuIFJHQiB0cmlwbGV0IG9yIGEgVGsgY29sb3Igc3RyaW5nKQorIworIyAtIHBhcmVudDogd2hpY2ggd2luZG93IHRvIHBsYWNlIHRoZSBkaWFsb2cgb24gdG9wIG9mCisjCisjIC0gdGl0bGU6IGRpYWxvZyB0aXRsZQorIworCitmcm9tIHRrQ29tbW9uRGlhbG9nIGltcG9ydCBEaWFsb2cKKworCisjCisjIGNvbG9yIGNob29zZXIgY2xhc3MKKworY2xhc3MgQ2hvb3NlcihEaWFsb2cpOgorICAgICJBc2sgZm9yIGEgY29sb3IiCisKKyAgICBjb21tYW5kID0gInRrX2Nob29zZUNvbG9yIgorCisgICAgZGVmIF9maXhvcHRpb25zKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIG1ha2Ugc3VyZSBpbml0aWFsY29sb3IgaXMgYSB0ayBjb2xvciBzdHJpbmcKKyAgICAgICAgICAgIGNvbG9yID0gc2VsZi5vcHRpb25zWyJpbml0aWFsY29sb3IiXQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjb2xvciwgdHVwbGUpOgorICAgICAgICAgICAgICAgICMgYXNzdW1lIGFuIFJHQiB0cmlwbGV0CisgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zWyJpbml0aWFsY29sb3IiXSA9ICIjJTAyeCUwMnglMDJ4IiAlIGNvbG9yCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfZml4cmVzdWx0KHNlbGYsIHdpZGdldCwgcmVzdWx0KToKKyAgICAgICAgIyByZXN1bHQgY2FuIGJlIHNvbWV0aGluZ3M6IGFuIGVtcHR5IHR1cGxlLCBhbiBlbXB0eSBzdHJpbmcgb3IKKyAgICAgICAgIyBhIFRjbF9PYmosIHNvIHRoaXMgc29tZXdoYXQgd2VpcmQgY2hlY2sgaGFuZGxlcyB0aGF0CisgICAgICAgIGlmIG5vdCByZXN1bHQgb3Igbm90IHN0cihyZXN1bHQpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUgIyBjYW5jZWxlZAorCisgICAgICAgICMgdG8gc2ltcGxpZnkgYXBwbGljYXRpb24gY29kZSwgdGhlIGNvbG9yIGNob29zZXIgcmV0dXJucworICAgICAgICAjIGFuIFJHQiB0dXBsZSB0b2dldGhlciB3aXRoIHRoZSBUayBjb2xvciBzdHJpbmcKKyAgICAgICAgciwgZywgYiA9IHdpZGdldC53aW5mb19yZ2IocmVzdWx0KQorICAgICAgICByZXR1cm4gKHIvMjU2LCBnLzI1NiwgYi8yNTYpLCBzdHIocmVzdWx0KQorCisKKyMKKyMgY29udmVuaWVuY2Ugc3R1ZmYKKworZGVmIGFza2NvbG9yKGNvbG9yID0gTm9uZSwgKipvcHRpb25zKToKKyAgICAiQXNrIGZvciBhIGNvbG9yIgorCisgICAgaWYgY29sb3I6CisgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zLmNvcHkoKQorICAgICAgICBvcHRpb25zWyJpbml0aWFsY29sb3IiXSA9IGNvbG9yCisKKyAgICByZXR1cm4gQ2hvb3NlcigqKm9wdGlvbnMpLnNob3coKQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdGVzdCBzdHVmZgorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHByaW50ICJjb2xvciIsIGFza2NvbG9yKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3RrQ29sb3JDaG9vc2VyLnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrQ29sb3JDaG9vc2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2Y3Mzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb2xvckNob29zZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3RrQ29sb3JDaG9vc2VyLnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrQ29sb3JDaG9vc2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2Y3Mzc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb2xvckNob29zZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3RrQ29tbW9uRGlhbG9nLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb21tb25EaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkOWJlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrQ29tbW9uRGlhbG9nLnB5CkBAIC0wLDAgKzEsNjAgQEAKKyMgYmFzZSBjbGFzcyBmb3IgdGsgY29tbW9uIGRpYWxvZ3VlcworIworIyB0aGlzIG1vZHVsZSBwcm92aWRlcyBhIGJhc2UgY2xhc3MgZm9yIGFjY2Vzc2luZyB0aGUgY29tbW9uCisjIGRpYWxvZ3VlcyBhdmFpbGFibGUgaW4gVGsgNC4yIGFuZCBuZXdlci4gIHVzZSB0a0ZpbGVEaWFsb2csCisjIHRrQ29sb3JDaG9vc2VyLCBhbmQgdGtNZXNzYWdlQm94IHRvIGFjY2VzcyB0aGUgaW5kaXZpZHVhbAorIyBkaWFsb2dzLgorIworIyB3cml0dGVuIGJ5IEZyZWRyaWsgTHVuZGgsIE1heSAxOTk3CisjCisKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgorCitjbGFzcyBEaWFsb2c6CisKKyAgICBjb21tYW5kICA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKipvcHRpb25zKToKKworICAgICAgICAjIEZJWE1FOiBzaG91bGQgdGhpcyBiZSBwbGFjZWQgb24gdGhlIG1vZHVsZSBsZXZlbCBpbnN0ZWFkPworICAgICAgICBpZiBUa1ZlcnNpb24gPCA0LjI6CisgICAgICAgICAgICByYWlzZSBUY2xFcnJvciwgInRoaXMgbW9kdWxlIHJlcXVpcmVzIFRrIDQuMiBvciBuZXdlciIKKworICAgICAgICBzZWxmLm1hc3RlciAgPSBtYXN0ZXIKKyAgICAgICAgc2VsZi5vcHRpb25zID0gb3B0aW9ucworICAgICAgICBpZiBub3QgbWFzdGVyIGFuZCBvcHRpb25zLmdldCgncGFyZW50Jyk6CisgICAgICAgICAgICBzZWxmLm1hc3RlciA9IG9wdGlvbnNbJ3BhcmVudCddCisKKyAgICBkZWYgX2ZpeG9wdGlvbnMoc2VsZik6CisgICAgICAgIHBhc3MgIyBob29rCisKKyAgICBkZWYgX2ZpeHJlc3VsdChzZWxmLCB3aWRnZXQsIHJlc3VsdCk6CisgICAgICAgIHJldHVybiByZXN1bHQgIyBob29rCisKKyAgICBkZWYgc2hvdyhzZWxmLCAqKm9wdGlvbnMpOgorCisgICAgICAgICMgdXBkYXRlIGluc3RhbmNlIG9wdGlvbnMKKyAgICAgICAgZm9yIGssIHYgaW4gb3B0aW9ucy5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5vcHRpb25zW2tdID0gdgorCisgICAgICAgIHNlbGYuX2ZpeG9wdGlvbnMoKQorCisgICAgICAgICMgd2UgbmVlZCBhIGR1bW15IHdpZGdldCB0byBwcm9wZXJseSBwcm9jZXNzIHRoZSBvcHRpb25zCisgICAgICAgICMgKGF0IGxlYXN0IGFzIGxvbmcgYXMgd2UgdXNlIFRraW50ZXIgMS42MykKKyAgICAgICAgdyA9IEZyYW1lKHNlbGYubWFzdGVyKQorCisgICAgICAgIHRyeToKKworICAgICAgICAgICAgcyA9IHcudGsuY2FsbChzZWxmLmNvbW1hbmQsICp3Ll9vcHRpb25zKHNlbGYub3B0aW9ucykpCisKKyAgICAgICAgICAgIHMgPSBzZWxmLl9maXhyZXN1bHQodywgcykKKworICAgICAgICBmaW5hbGx5OgorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBnZXQgcmlkIG9mIHRoZSB3aWRnZXQKKyAgICAgICAgICAgICAgICB3LmRlc3Ryb3koKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXR1cm4gcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb21tb25EaWFsb2cucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb21tb25EaWFsb2cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZmUxODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0NvbW1vbkRpYWxvZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb21tb25EaWFsb2cucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb21tb25EaWFsb2cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZmUxODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0NvbW1vbkRpYWxvZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGaWxlRGlhbG9nLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGaWxlRGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YzdkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0ZpbGVEaWFsb2cucHkKQEAgLTAsMCArMSwyMTUgQEAKKyMKKyMgSW5zdGFudCBQeXRob24KKyMgJElkOiB0a0ZpbGVEaWFsb2cucHkgMzY1NjAgMjAwNC0wNy0xOCAwNjoxNjowOFogdGltX29uZSAkCisjCisjIHRrIGNvbW1vbiBmaWxlIGRpYWxvZ3VlcworIworIyB0aGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcmZhY2VzIHRvIHRoZSBuYXRpdmUgZmlsZSBkaWFsb2d1ZXMKKyMgYXZhaWxhYmxlIGluIFRrIDQuMiBhbmQgbmV3ZXIsIGFuZCB0aGUgZGlyZWN0b3J5IGRpYWxvZ3VlIGF2YWlsYWJsZQorIyBpbiBUayA4LjMgYW5kIG5ld2VyLgorIworIyB3cml0dGVuIGJ5IEZyZWRyaWsgTHVuZGgsIE1heSAxOTk3LgorIworCisjCisjIG9wdGlvbnMgKGFsbCBoYXZlIGRlZmF1bHQgdmFsdWVzKToKKyMKKyMgLSBkZWZhdWx0ZXh0ZW5zaW9uOiBhZGRlZCB0byBmaWxlbmFtZSBpZiBub3QgZXhwbGljaXRseSBnaXZlbgorIworIyAtIGZpbGV0eXBlczogc2VxdWVuY2Ugb2YgKGxhYmVsLCBwYXR0ZXJuKSB0dXBsZXMuICB0aGUgc2FtZSBwYXR0ZXJuCisjICAgbWF5IG9jY3VyIHdpdGggc2V2ZXJhbCBwYXR0ZXJucy4gIHVzZSAiKiIgYXMgcGF0dGVybiB0byBpbmRpY2F0ZQorIyAgIGFsbCBmaWxlcy4KKyMKKyMgLSBpbml0aWFsZGlyOiBpbml0aWFsIGRpcmVjdG9yeS4gIHByZXNlcnZlZCBieSBkaWFsb2cgaW5zdGFuY2UuCisjCisjIC0gaW5pdGlhbGZpbGU6IGluaXRpYWwgZmlsZSAoaWdub3JlZCBieSB0aGUgb3BlbiBkaWFsb2cpLiAgcHJlc2VydmVkCisjICAgYnkgZGlhbG9nIGluc3RhbmNlLgorIworIyAtIHBhcmVudDogd2hpY2ggd2luZG93IHRvIHBsYWNlIHRoZSBkaWFsb2cgb24gdG9wIG9mCisjCisjIC0gdGl0bGU6IGRpYWxvZyB0aXRsZQorIworIyAtIG11bHRpcGxlOiBpZiB0cnVlIHVzZXIgbWF5IHNlbGVjdCBtb3JlIHRoYW4gb25lIGZpbGUKKyMKKyMgb3B0aW9ucyBmb3IgdGhlIGRpcmVjdG9yeSBjaG9vc2VyOgorIworIyAtIGluaXRpYWxkaXIsIHBhcmVudCwgdGl0bGU6IHNlZSBhYm92ZQorIworIyAtIG11c3RleGlzdDogaWYgdHJ1ZSwgdXNlciBtdXN0IHBpY2sgYW4gZXhpc3RpbmcgZGlyZWN0b3J5CisjCisjCisKKworZnJvbSB0a0NvbW1vbkRpYWxvZyBpbXBvcnQgRGlhbG9nCisKK2NsYXNzIF9EaWFsb2coRGlhbG9nKToKKworICAgIGRlZiBfZml4b3B0aW9ucyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBtYWtlIHN1cmUgImZpbGV0eXBlcyIgaXMgYSB0dXBsZQorICAgICAgICAgICAgc2VsZi5vcHRpb25zWyJmaWxldHlwZXMiXSA9IHR1cGxlKHNlbGYub3B0aW9uc1siZmlsZXR5cGVzIl0pCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfZml4cmVzdWx0KHNlbGYsIHdpZGdldCwgcmVzdWx0KToKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgIyBrZWVwIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWUgdW50aWwgbmV4dCB0aW1lCisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgICMgY29udmVydCBUY2wgcGF0aCBvYmplY3RzIHRvIHN0cmluZ3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuc3RyaW5nCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBpdCBhbHJlYWR5IGlzIGEgc3RyaW5nCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcGF0aCwgZmlsZSA9IG9zLnBhdGguc3BsaXQocmVzdWx0KQorICAgICAgICAgICAgc2VsZi5vcHRpb25zWyJpbml0aWFsZGlyIl0gPSBwYXRoCisgICAgICAgICAgICBzZWxmLm9wdGlvbnNbImluaXRpYWxmaWxlIl0gPSBmaWxlCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSByZXN1bHQgIyBjb21wYXRpYmlsaXR5CisgICAgICAgIHJldHVybiByZXN1bHQKKworCisjCisjIGZpbGUgZGlhbG9ncworCitjbGFzcyBPcGVuKF9EaWFsb2cpOgorICAgICJBc2sgZm9yIGEgZmlsZW5hbWUgdG8gb3BlbiIKKworICAgIGNvbW1hbmQgPSAidGtfZ2V0T3BlbkZpbGUiCisKKyAgICBkZWYgX2ZpeHJlc3VsdChzZWxmLCB3aWRnZXQsIHJlc3VsdCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0LCB0dXBsZSk6CisgICAgICAgICAgICAjIG11bHRpcGxlIHJlc3VsdHM6CisgICAgICAgICAgICByZXN1bHQgPSB0dXBsZShbZ2V0YXR0cihyLCAic3RyaW5nIiwgcikgZm9yIHIgaW4gcmVzdWx0XSkKKyAgICAgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgICAgICBwYXRoLCBmaWxlID0gb3MucGF0aC5zcGxpdChyZXN1bHRbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zWyJpbml0aWFsZGlyIl0gPSBwYXRoCisgICAgICAgICAgICAgICAgIyBkb24ndCBzZXQgaW5pdGlhbGZpbGUgb3IgZmlsZW5hbWUsIGFzIHdlIGhhdmUgbXVsdGlwbGUgb2YgdGhlc2UKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgaWYgbm90IHdpZGdldC50ay53YW50b2JqZWN0cygpIGFuZCAibXVsdGlwbGUiIGluIHNlbGYub3B0aW9uczoKKyAgICAgICAgICAgICMgTmVlZCB0byBzcGxpdCByZXN1bHQgZXhwbGljaXRseQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeHJlc3VsdCh3aWRnZXQsIHdpZGdldC50ay5zcGxpdGxpc3QocmVzdWx0KSkKKyAgICAgICAgcmV0dXJuIF9EaWFsb2cuX2ZpeHJlc3VsdChzZWxmLCB3aWRnZXQsIHJlc3VsdCkKKworY2xhc3MgU2F2ZUFzKF9EaWFsb2cpOgorICAgICJBc2sgZm9yIGEgZmlsZW5hbWUgdG8gc2F2ZSBhcyIKKworICAgIGNvbW1hbmQgPSAidGtfZ2V0U2F2ZUZpbGUiCisKKworIyB0aGUgZGlyZWN0b3J5IGRpYWxvZyBoYXMgaXRzIG93biBfZml4IHJvdXRpbmVzLgorY2xhc3MgRGlyZWN0b3J5KERpYWxvZyk6CisgICAgIkFzayBmb3IgYSBkaXJlY3RvcnkiCisKKyAgICBjb21tYW5kID0gInRrX2Nob29zZURpcmVjdG9yeSIKKworICAgIGRlZiBfZml4cmVzdWx0KHNlbGYsIHdpZGdldCwgcmVzdWx0KToKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgIyBjb252ZXJ0IFRjbCBwYXRoIG9iamVjdHMgdG8gc3RyaW5ncworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdHJpbmcKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIGl0IGFscmVhZHkgaXMgYSBzdHJpbmcKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIGtlZXAgZGlyZWN0b3J5IHVudGlsIG5leHQgdGltZQorICAgICAgICAgICAgc2VsZi5vcHRpb25zWyJpbml0aWFsZGlyIl0gPSByZXN1bHQKKyAgICAgICAgc2VsZi5kaXJlY3RvcnkgPSByZXN1bHQgIyBjb21wYXRpYmlsaXR5CisgICAgICAgIHJldHVybiByZXN1bHQKKworIworIyBjb252ZW5pZW5jZSBzdHVmZgorCitkZWYgYXNrb3BlbmZpbGVuYW1lKCoqb3B0aW9ucyk6CisgICAgIkFzayBmb3IgYSBmaWxlbmFtZSB0byBvcGVuIgorCisgICAgcmV0dXJuIE9wZW4oKipvcHRpb25zKS5zaG93KCkKKworZGVmIGFza3NhdmVhc2ZpbGVuYW1lKCoqb3B0aW9ucyk6CisgICAgIkFzayBmb3IgYSBmaWxlbmFtZSB0byBzYXZlIGFzIgorCisgICAgcmV0dXJuIFNhdmVBcygqKm9wdGlvbnMpLnNob3coKQorCitkZWYgYXNrb3BlbmZpbGVuYW1lcygqKm9wdGlvbnMpOgorICAgICIiIkFzayBmb3IgbXVsdGlwbGUgZmlsZW5hbWVzIHRvIG9wZW4KKworICAgIFJldHVybnMgYSBsaXN0IG9mIGZpbGVuYW1lcyBvciBlbXB0eSBsaXN0IGlmCisgICAgY2FuY2VsIGJ1dHRvbiBzZWxlY3RlZAorICAgICIiIgorICAgIG9wdGlvbnNbIm11bHRpcGxlIl09MQorICAgIHJldHVybiBPcGVuKCoqb3B0aW9ucykuc2hvdygpCisKKyMgRklYTUU6IGFyZSB0aGUgZm9sbG93aW5nICBwZXJoYXBzIGEgYml0IHRvbyBjb252ZW5pZW50PworCitkZWYgYXNrb3BlbmZpbGUobW9kZSA9ICJyIiwgKipvcHRpb25zKToKKyAgICAiQXNrIGZvciBhIGZpbGVuYW1lIHRvIG9wZW4sIGFuZCByZXR1cm5lZCB0aGUgb3BlbmVkIGZpbGUiCisKKyAgICBmaWxlbmFtZSA9IE9wZW4oKipvcHRpb25zKS5zaG93KCkKKyAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgcmV0dXJuIG9wZW4oZmlsZW5hbWUsIG1vZGUpCisgICAgcmV0dXJuIE5vbmUKKworZGVmIGFza29wZW5maWxlcyhtb2RlID0gInIiLCAqKm9wdGlvbnMpOgorICAgICIiIkFzayBmb3IgbXVsdGlwbGUgZmlsZW5hbWVzIGFuZCByZXR1cm4gdGhlIG9wZW4gZmlsZQorICAgIG9iamVjdHMKKworICAgIHJldHVybnMgYSBsaXN0IG9mIG9wZW4gZmlsZSBvYmplY3RzIG9yIGFuIGVtcHR5IGxpc3QgaWYKKyAgICBjYW5jZWwgc2VsZWN0ZWQKKyAgICAiIiIKKworICAgIGZpbGVzID0gYXNrb3BlbmZpbGVuYW1lcygqKm9wdGlvbnMpCisgICAgaWYgZmlsZXM6CisgICAgICAgIG9maWxlcz1bXQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZXM6CisgICAgICAgICAgICBvZmlsZXMuYXBwZW5kKG9wZW4oZmlsZW5hbWUsIG1vZGUpKQorICAgICAgICBmaWxlcz1vZmlsZXMKKyAgICByZXR1cm4gZmlsZXMKKworCitkZWYgYXNrc2F2ZWFzZmlsZShtb2RlID0gInciLCAqKm9wdGlvbnMpOgorICAgICJBc2sgZm9yIGEgZmlsZW5hbWUgdG8gc2F2ZSBhcywgYW5kIHJldHVybmVkIHRoZSBvcGVuZWQgZmlsZSIKKworICAgIGZpbGVuYW1lID0gU2F2ZUFzKCoqb3B0aW9ucykuc2hvdygpCisgICAgaWYgZmlsZW5hbWU6CisgICAgICAgIHJldHVybiBvcGVuKGZpbGVuYW1lLCBtb2RlKQorICAgIHJldHVybiBOb25lCisKK2RlZiBhc2tkaXJlY3RvcnkgKCoqb3B0aW9ucyk6CisgICAgIkFzayBmb3IgYSBkaXJlY3RvcnksIGFuZCByZXR1cm4gdGhlIGZpbGUgbmFtZSIKKyAgICByZXR1cm4gRGlyZWN0b3J5KCoqb3B0aW9ucykuc2hvdygpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdGVzdCBzdHVmZgorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICMgU2luY2UgdGhlIGZpbGUgbmFtZSBtYXkgY29udGFpbiBub24tQVNDSUkgY2hhcmFjdGVycywgd2UgbmVlZAorICAgICMgdG8gZmluZCBhbiBlbmNvZGluZyB0aGF0IGxpa2VseSBzdXBwb3J0cyB0aGUgZmlsZSBuYW1lLCBhbmQKKyAgICAjIGRpc3BsYXlzIGNvcnJlY3RseSBvbiB0aGUgdGVybWluYWwuCisKKyAgICAjIFN0YXJ0IG9mZiB3aXRoIFVURi04CisgICAgZW5jID0gInV0Zi04IgorICAgIGltcG9ydCBzeXMKKworICAgICMgU2VlIHdoZXRoZXIgQ09ERVNFVCBpcyBkZWZpbmVkCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgbG9jYWxlCisgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0FMTCwnJykKKyAgICAgICAgZW5jID0gbG9jYWxlLm5sX2xhbmdpbmZvKGxvY2FsZS5DT0RFU0VUKQorICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgcGFzcworCisgICAgIyBkaWFsb2cgZm9yIG9wZW5lbmluZyBmaWxlcworCisgICAgb3BlbmZpbGVuYW1lPWFza29wZW5maWxlbmFtZShmaWxldHlwZXM9WygiYWxsIGZpbGVzIiwgIioiKV0pCisgICAgdHJ5OgorICAgICAgICBmcD1vcGVuKG9wZW5maWxlbmFtZSwiciIpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICBleGNlcHQ6CisgICAgICAgIHByaW50ICJDb3VsZCBub3Qgb3BlbiBGaWxlOiAiCisgICAgICAgIHByaW50IHN5cy5leGNfaW5mbygpWzFdCisKKyAgICBwcmludCAib3BlbiIsIG9wZW5maWxlbmFtZS5lbmNvZGUoZW5jKQorCisgICAgIyBkaWFsb2cgZm9yIHNhdmluZyBmaWxlcworCisgICAgc2F2ZWFzZmlsZW5hbWU9YXNrc2F2ZWFzZmlsZW5hbWUoKQorICAgIHByaW50ICJzYXZlYXMiLCBzYXZlYXNmaWxlbmFtZS5lbmNvZGUoZW5jKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGaWxlRGlhbG9nLnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrRmlsZURpYWxvZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlNzRiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrRmlsZURpYWxvZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGaWxlRGlhbG9nLnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrRmlsZURpYWxvZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlNzRiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrRmlsZURpYWxvZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGb250LnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGb250LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOWYyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0ZvbnQucHkKQEAgLTAsMCArMSwyMTYgQEAKKyMgVGtpbnRlciBmb250IHdyYXBwZXIKKyMKKyMgd3JpdHRlbiBieSBGcmVkcmlrIEx1bmRoLCBGZWJydWFyeSAxOTk4CisjCisjIEZJWE1FOiBzaG91bGQgYWRkICdkaXNwbGF5b2YnIG9wdGlvbiB3aGVyZSByZWxldmFudCAoYWN0dWFsLCBmYW1pbGllcywKKyMgICAgICAgIG1lYXN1cmUsIGFuZCBtZXRyaWNzKQorIworCitfX3ZlcnNpb25fXyA9ICIwLjkiCisKK2ltcG9ydCBUa2ludGVyCisKKyMgd2VpZ2h0L3NsYW50CitOT1JNQUwgPSAibm9ybWFsIgorUk9NQU4gPSAicm9tYW4iCitCT0xEICAgPSAiYm9sZCIKK0lUQUxJQyA9ICJpdGFsaWMiCisKK2RlZiBuYW1ldG9mb250KG5hbWUpOgorICAgICIiIkdpdmVuIHRoZSBuYW1lIG9mIGEgdGsgbmFtZWQgZm9udCwgcmV0dXJucyBhIEZvbnQgcmVwcmVzZW50YXRpb24uCisgICAgIiIiCisgICAgcmV0dXJuIEZvbnQobmFtZT1uYW1lLCBleGlzdHM9VHJ1ZSkKKworY2xhc3MgRm9udDoKKworICAgICIiIlJlcHJlc2VudHMgYSBuYW1lZCBmb250LgorCisgICAgQ29uc3RydWN0b3Igb3B0aW9ucyBhcmU6CisKKyAgICBmb250IC0tIGZvbnQgc3BlY2lmaWVyIChuYW1lLCBzeXN0ZW0gZm9udCwgb3IgKGZhbWlseSwgc2l6ZSwgc3R5bGUpLXR1cGxlKQorICAgIG5hbWUgLS0gbmFtZSB0byB1c2UgZm9yIHRoaXMgZm9udCBjb25maWd1cmF0aW9uIChkZWZhdWx0cyB0byBhIHVuaXF1ZSBuYW1lKQorICAgIGV4aXN0cyAtLSBkb2VzIGEgbmFtZWQgZm9udCBieSB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdD8KKyAgICAgICBDcmVhdGVzIGEgbmV3IG5hbWVkIGZvbnQgaWYgRmFsc2UsIHBvaW50cyB0byB0aGUgZXhpc3RpbmcgZm9udCBpZiBUcnVlLgorICAgICAgIFJhaXNlcyBfVGtpbnRlci5UY2xFcnJvciBpZiB0aGUgYXNzZXJ0aW9uIGlzIGZhbHNlLgorCisgICAgICAgdGhlIGZvbGxvd2luZyBhcmUgaWdub3JlZCBpZiBmb250IGlzIHNwZWNpZmllZDoKKworICAgIGZhbWlseSAtLSBmb250ICdmYW1pbHknLCBlLmcuIENvdXJpZXIsIFRpbWVzLCBIZWx2ZXRpY2EKKyAgICBzaXplIC0tIGZvbnQgc2l6ZSBpbiBwb2ludHMKKyAgICB3ZWlnaHQgLS0gZm9udCB0aGlja25lc3M6IE5PUk1BTCwgQk9MRAorICAgIHNsYW50IC0tIGZvbnQgc2xhbnQ6IFJPTUFOLCBJVEFMSUMKKyAgICB1bmRlcmxpbmUgLS0gZm9udCB1bmRlcmxpbmluZzogZmFsc2UgKDApLCB0cnVlICgxKQorICAgIG92ZXJzdHJpa2UgLS0gZm9udCBzdHJpa2VvdXQ6IGZhbHNlICgwKSwgdHJ1ZSAoMSkKKworICAgICIiIgorCisgICAgZGVmIF9zZXQoc2VsZiwga3cpOgorICAgICAgICBvcHRpb25zID0gW10KKyAgICAgICAgZm9yIGssIHYgaW4ga3cuaXRlbXMoKToKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCItIitrKQorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoc3RyKHYpKQorICAgICAgICByZXR1cm4gdHVwbGUob3B0aW9ucykKKworICAgIGRlZiBfZ2V0KHNlbGYsIGFyZ3MpOgorICAgICAgICBvcHRpb25zID0gW10KKyAgICAgICAgZm9yIGsgaW4gYXJnczoKKyAgICAgICAgICAgIG9wdGlvbnMuYXBwZW5kKCItIitrKQorICAgICAgICByZXR1cm4gdHVwbGUob3B0aW9ucykKKworICAgIGRlZiBfbWtkaWN0KHNlbGYsIGFyZ3MpOgorICAgICAgICBvcHRpb25zID0ge30KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGFyZ3MpLCAyKToKKyAgICAgICAgICAgIG9wdGlvbnNbYXJnc1tpXVsxOl1dID0gYXJnc1tpKzFdCisgICAgICAgIHJldHVybiBvcHRpb25zCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdD1Ob25lLCBmb250PU5vbmUsIG5hbWU9Tm9uZSwgZXhpc3RzPUZhbHNlLCAqKm9wdGlvbnMpOgorICAgICAgICBpZiBub3Qgcm9vdDoKKyAgICAgICAgICAgIHJvb3QgPSBUa2ludGVyLl9kZWZhdWx0X3Jvb3QKKyAgICAgICAgaWYgZm9udDoKKyAgICAgICAgICAgICMgZ2V0IGFjdHVhbCBzZXR0aW5ncyBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBmb250CisgICAgICAgICAgICBmb250ID0gcm9vdC50ay5zcGxpdGxpc3Qocm9vdC50ay5jYWxsKCJmb250IiwgImFjdHVhbCIsIGZvbnQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9udCA9IHNlbGYuX3NldChvcHRpb25zKQorICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgIG5hbWUgPSAiZm9udCIgKyBzdHIoaWQoc2VsZikpCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgICAgICBpZiBleGlzdHM6CisgICAgICAgICAgICBzZWxmLmRlbGV0ZV9mb250ID0gRmFsc2UKKyAgICAgICAgICAgICMgY29uZmlybSBmb250IGV4aXN0cworICAgICAgICAgICAgaWYgc2VsZi5uYW1lIG5vdCBpbiByb290LnRrLmNhbGwoImZvbnQiLCAibmFtZXMiKToKKyAgICAgICAgICAgICAgICByYWlzZSBUa2ludGVyLl90a2ludGVyLlRjbEVycm9yLCAibmFtZWQgZm9udCAlcyBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IiAlIChzZWxmLm5hbWUsKQorICAgICAgICAgICAgIyBpZiBmb250IGNvbmZpZyBpbmZvIHN1cHBsaWVkLCBhcHBseSBpdAorICAgICAgICAgICAgaWYgZm9udDoKKyAgICAgICAgICAgICAgICByb290LnRrLmNhbGwoImZvbnQiLCAiY29uZmlndXJlIiwgc2VsZi5uYW1lLCAqZm9udCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgY3JlYXRlIG5ldyBmb250IChyYWlzZXMgVGNsRXJyb3IgaWYgdGhlIGZvbnQgZXhpc3RzKQorICAgICAgICAgICAgcm9vdC50ay5jYWxsKCJmb250IiwgImNyZWF0ZSIsIHNlbGYubmFtZSwgKmZvbnQpCisgICAgICAgICAgICBzZWxmLmRlbGV0ZV9mb250ID0gVHJ1ZQorICAgICAgICAjIGJhY2tsaW5rcyEKKyAgICAgICAgc2VsZi5fcm9vdCAgPSByb290CisgICAgICAgIHNlbGYuX3NwbGl0ID0gcm9vdC50ay5zcGxpdGxpc3QKKyAgICAgICAgc2VsZi5fY2FsbCAgPSByb290LnRrLmNhbGwKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZSA9PSBvdGhlci5uYW1lIGFuZCBpc2luc3RhbmNlKG90aGVyLCBGb250KQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBzZWxmLmNnZXQoa2V5KQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBzZWxmLmNvbmZpZ3VyZSgqKntrZXk6IHZhbHVlfSkKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLmRlbGV0ZV9mb250OgorICAgICAgICAgICAgICAgIHNlbGYuX2NhbGwoImZvbnQiLCAiZGVsZXRlIiwgc2VsZi5uYW1lKQorICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgIlJldHVybiBhIGRpc3RpbmN0IGNvcHkgb2YgdGhlIGN1cnJlbnQgZm9udCIKKyAgICAgICAgcmV0dXJuIEZvbnQoc2VsZi5fcm9vdCwgKipzZWxmLmFjdHVhbCgpKQorCisgICAgZGVmIGFjdHVhbChzZWxmLCBvcHRpb249Tm9uZSk6CisgICAgICAgICJSZXR1cm4gYWN0dWFsIGZvbnQgYXR0cmlidXRlcyIKKyAgICAgICAgaWYgb3B0aW9uOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGwoImZvbnQiLCAiYWN0dWFsIiwgc2VsZi5uYW1lLCAiLSIrb3B0aW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21rZGljdCgKKyAgICAgICAgICAgICAgICBzZWxmLl9zcGxpdChzZWxmLl9jYWxsKCJmb250IiwgImFjdHVhbCIsIHNlbGYubmFtZSkpCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGNnZXQoc2VsZiwgb3B0aW9uKToKKyAgICAgICAgIkdldCBmb250IGF0dHJpYnV0ZSIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGwoImZvbnQiLCAiY29uZmlnIiwgc2VsZi5uYW1lLCAiLSIrb3B0aW9uKQorCisgICAgZGVmIGNvbmZpZyhzZWxmLCAqKm9wdGlvbnMpOgorICAgICAgICAiTW9kaWZ5IGZvbnQgYXR0cmlidXRlcyIKKyAgICAgICAgaWYgb3B0aW9uczoKKyAgICAgICAgICAgIHNlbGYuX2NhbGwoImZvbnQiLCAiY29uZmlnIiwgc2VsZi5uYW1lLAorICAgICAgICAgICAgICAgICAgKnNlbGYuX3NldChvcHRpb25zKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9ta2RpY3QoCisgICAgICAgICAgICAgICAgc2VsZi5fc3BsaXQoc2VsZi5fY2FsbCgiZm9udCIsICJjb25maWciLCBzZWxmLm5hbWUpKQorICAgICAgICAgICAgICAgICkKKworICAgIGNvbmZpZ3VyZSA9IGNvbmZpZworCisgICAgZGVmIG1lYXN1cmUoc2VsZiwgdGV4dCk6CisgICAgICAgICJSZXR1cm4gdGV4dCB3aWR0aCIKKyAgICAgICAgcmV0dXJuIGludChzZWxmLl9jYWxsKCJmb250IiwgIm1lYXN1cmUiLCBzZWxmLm5hbWUsIHRleHQpKQorCisgICAgZGVmIG1ldHJpY3Moc2VsZiwgKm9wdGlvbnMpOgorICAgICAgICAiIiJSZXR1cm4gZm9udCBtZXRyaWNzLgorCisgICAgICAgIEZvciBiZXN0IHBlcmZvcm1hbmNlLCBjcmVhdGUgYSBkdW1teSB3aWRnZXQKKyAgICAgICAgdXNpbmcgdGhpcyBmb250IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLiIiIgorCisgICAgICAgIGlmIG9wdGlvbnM6CisgICAgICAgICAgICByZXR1cm4gaW50KAorICAgICAgICAgICAgICAgIHNlbGYuX2NhbGwoImZvbnQiLCAibWV0cmljcyIsIHNlbGYubmFtZSwgc2VsZi5fZ2V0KG9wdGlvbnMpKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlcyA9IHNlbGYuX3NwbGl0KHNlbGYuX2NhbGwoImZvbnQiLCAibWV0cmljcyIsIHNlbGYubmFtZSkpCisgICAgICAgICAgICBvcHRpb25zID0ge30KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihyZXMpLCAyKToKKyAgICAgICAgICAgICAgICBvcHRpb25zW3Jlc1tpXVsxOl1dID0gaW50KHJlc1tpKzFdKQorICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMKKworZGVmIGZhbWlsaWVzKHJvb3Q9Tm9uZSk6CisgICAgIkdldCBmb250IGZhbWlsaWVzIChhcyBhIHR1cGxlKSIKKyAgICBpZiBub3Qgcm9vdDoKKyAgICAgICAgcm9vdCA9IFRraW50ZXIuX2RlZmF1bHRfcm9vdAorICAgIHJldHVybiByb290LnRrLnNwbGl0bGlzdChyb290LnRrLmNhbGwoImZvbnQiLCAiZmFtaWxpZXMiKSkKKworZGVmIG5hbWVzKHJvb3Q9Tm9uZSk6CisgICAgIkdldCBuYW1lcyBvZiBkZWZpbmVkIGZvbnRzIChhcyBhIHR1cGxlKSIKKyAgICBpZiBub3Qgcm9vdDoKKyAgICAgICAgcm9vdCA9IFRraW50ZXIuX2RlZmF1bHRfcm9vdAorICAgIHJldHVybiByb290LnRrLnNwbGl0bGlzdChyb290LnRrLmNhbGwoImZvbnQiLCAibmFtZXMiKSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB0ZXN0IHN0dWZmCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisKKyAgICByb290ID0gVGtpbnRlci5UaygpCisKKyAgICAjIGNyZWF0ZSBhIGZvbnQKKyAgICBmID0gRm9udChmYW1pbHk9InRpbWVzIiwgc2l6ZT0zMCwgd2VpZ2h0PU5PUk1BTCkKKworICAgIHByaW50IGYuYWN0dWFsKCkKKyAgICBwcmludCBmLmFjdHVhbCgiZmFtaWx5IikKKyAgICBwcmludCBmLmFjdHVhbCgid2VpZ2h0IikKKworICAgIHByaW50IGYuY29uZmlnKCkKKyAgICBwcmludCBmLmNnZXQoImZhbWlseSIpCisgICAgcHJpbnQgZi5jZ2V0KCJ3ZWlnaHQiKQorCisgICAgcHJpbnQgbmFtZXMoKQorCisgICAgcHJpbnQgZi5tZWFzdXJlKCJoZWxsbyIpLCBmLm1ldHJpY3MoImxpbmVzcGFjZSIpCisKKyAgICBwcmludCBmLm1ldHJpY3MoKQorCisgICAgZiA9IEZvbnQoZm9udD0oIkNvdXJpZXIiLCAyMCwgImJvbGQiKSkKKyAgICBwcmludCBmLm1lYXN1cmUoImhlbGxvIiksIGYubWV0cmljcygibGluZXNwYWNlIikKKworICAgIHcgPSBUa2ludGVyLkxhYmVsKHJvb3QsIHRleHQ9IkhlbGxvLCB3b3JsZCIsIGZvbnQ9ZikKKyAgICB3LnBhY2soKQorCisgICAgdyA9IFRraW50ZXIuQnV0dG9uKHJvb3QsIHRleHQ9IlF1aXQhIiwgY29tbWFuZD1yb290LmRlc3Ryb3kpCisgICAgdy5wYWNrKCkKKworICAgIGZiID0gRm9udChmb250PXdbImZvbnQiXSkuY29weSgpCisgICAgZmIuY29uZmlnKHdlaWdodD1CT0xEKQorCisgICAgdy5jb25maWcoZm9udD1mYikKKworICAgIFRraW50ZXIubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGb250LnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrRm9udC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczZjVlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrRm9udC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGb250LnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrRm9udC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczZjVlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrRm9udC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtNZXNzYWdlQm94LnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtNZXNzYWdlQm94LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTkyMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a01lc3NhZ2VCb3gucHkKQEAgLTAsMCArMSwxMzQgQEAKKyMgdGsgY29tbW9uIG1lc3NhZ2UgYm94ZXMKKyMKKyMgdGhpcyBtb2R1bGUgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRoZSBuYXRpdmUgbWVzc2FnZSBib3hlcworIyBhdmFpbGFibGUgaW4gVGsgNC4yIGFuZCBuZXdlci4KKyMKKyMgd3JpdHRlbiBieSBGcmVkcmlrIEx1bmRoLCBNYXkgMTk5NworIworCisjCisjIG9wdGlvbnMgKGFsbCBoYXZlIGRlZmF1bHQgdmFsdWVzKToKKyMKKyMgLSBkZWZhdWx0OiB3aGljaCBidXR0b24gdG8gbWFrZSBkZWZhdWx0IChvbmUgb2YgdGhlIHJlcGx5IGNvZGVzKQorIworIyAtIGljb246IHdoaWNoIGljb24gdG8gZGlzcGxheSAoc2VlIGJlbG93KQorIworIyAtIG1lc3NhZ2U6IHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkKKyMKKyMgLSBwYXJlbnQ6IHdoaWNoIHdpbmRvdyB0byBwbGFjZSB0aGUgZGlhbG9nIG9uIHRvcCBvZgorIworIyAtIHRpdGxlOiBkaWFsb2cgdGl0bGUKKyMKKyMgLSB0eXBlOiBkaWFsb2cgdHlwZTsgdGhhdCBpcywgd2hpY2ggYnV0dG9ucyB0byBkaXNwbGF5IChzZWUgYmVsb3cpCisjCisKK2Zyb20gdGtDb21tb25EaWFsb2cgaW1wb3J0IERpYWxvZworCisjCisjIGNvbnN0YW50cworCisjIGljb25zCitFUlJPUiA9ICJlcnJvciIKK0lORk8gPSAiaW5mbyIKK1FVRVNUSU9OID0gInF1ZXN0aW9uIgorV0FSTklORyA9ICJ3YXJuaW5nIgorCisjIHR5cGVzCitBQk9SVFJFVFJZSUdOT1JFID0gImFib3J0cmV0cnlpZ25vcmUiCitPSyA9ICJvayIKK09LQ0FOQ0VMID0gIm9rY2FuY2VsIgorUkVUUllDQU5DRUwgPSAicmV0cnljYW5jZWwiCitZRVNOTyA9ICJ5ZXNubyIKK1lFU05PQ0FOQ0VMID0gInllc25vY2FuY2VsIgorCisjIHJlcGxpZXMKK0FCT1JUID0gImFib3J0IgorUkVUUlkgPSAicmV0cnkiCitJR05PUkUgPSAiaWdub3JlIgorT0sgPSAib2siCitDQU5DRUwgPSAiY2FuY2VsIgorWUVTID0gInllcyIKK05PID0gIm5vIgorCisKKyMKKyMgbWVzc2FnZSBkaWFsb2cgY2xhc3MKKworY2xhc3MgTWVzc2FnZShEaWFsb2cpOgorICAgICJBIG1lc3NhZ2UgYm94IgorCisgICAgY29tbWFuZCAgPSAidGtfbWVzc2FnZUJveCIKKworCisjCisjIGNvbnZlbmllbmNlIHN0dWZmCisKKyMgUmVuYW1lIF9pY29uIGFuZCBfdHlwZSBvcHRpb25zIHRvIGFsbG93IG92ZXJyaWRpbmcgdGhlbSBpbiBvcHRpb25zCitkZWYgX3Nob3codGl0bGU9Tm9uZSwgbWVzc2FnZT1Ob25lLCBfaWNvbj1Ob25lLCBfdHlwZT1Ob25lLCAqKm9wdGlvbnMpOgorICAgIGlmIF9pY29uIGFuZCAiaWNvbiIgbm90IGluIG9wdGlvbnM6ICAgIG9wdGlvbnNbImljb24iXSA9IF9pY29uCisgICAgaWYgX3R5cGUgYW5kICJ0eXBlIiBub3QgaW4gb3B0aW9uczogICAgb3B0aW9uc1sidHlwZSJdID0gX3R5cGUKKyAgICBpZiB0aXRsZTogICBvcHRpb25zWyJ0aXRsZSJdID0gdGl0bGUKKyAgICBpZiBtZXNzYWdlOiBvcHRpb25zWyJtZXNzYWdlIl0gPSBtZXNzYWdlCisgICAgcmVzID0gTWVzc2FnZSgqKm9wdGlvbnMpLnNob3coKQorICAgICMgSW4gc29tZSBUY2wgaW5zdGFsbGF0aW9ucywgeWVzL25vIGlzIGNvbnZlcnRlZCBpbnRvIGEgYm9vbGVhbi4KKyAgICBpZiBpc2luc3RhbmNlKHJlcywgYm9vbCk6CisgICAgICAgIGlmIHJlczoKKyAgICAgICAgICAgIHJldHVybiBZRVMKKyAgICAgICAgcmV0dXJuIE5PCisgICAgIyBJbiBvdGhlcnMgd2UgZ2V0IGEgVGNsX09iai4KKyAgICByZXR1cm4gc3RyKHJlcykKKworZGVmIHNob3dpbmZvKHRpdGxlPU5vbmUsIG1lc3NhZ2U9Tm9uZSwgKipvcHRpb25zKToKKyAgICAiU2hvdyBhbiBpbmZvIG1lc3NhZ2UiCisgICAgcmV0dXJuIF9zaG93KHRpdGxlLCBtZXNzYWdlLCBJTkZPLCBPSywgKipvcHRpb25zKQorCitkZWYgc2hvd3dhcm5pbmcodGl0bGU9Tm9uZSwgbWVzc2FnZT1Ob25lLCAqKm9wdGlvbnMpOgorICAgICJTaG93IGEgd2FybmluZyBtZXNzYWdlIgorICAgIHJldHVybiBfc2hvdyh0aXRsZSwgbWVzc2FnZSwgV0FSTklORywgT0ssICoqb3B0aW9ucykKKworZGVmIHNob3dlcnJvcih0aXRsZT1Ob25lLCBtZXNzYWdlPU5vbmUsICoqb3B0aW9ucyk6CisgICAgIlNob3cgYW4gZXJyb3IgbWVzc2FnZSIKKyAgICByZXR1cm4gX3Nob3codGl0bGUsIG1lc3NhZ2UsIEVSUk9SLCBPSywgKipvcHRpb25zKQorCitkZWYgYXNrcXVlc3Rpb24odGl0bGU9Tm9uZSwgbWVzc2FnZT1Ob25lLCAqKm9wdGlvbnMpOgorICAgICJBc2sgYSBxdWVzdGlvbiIKKyAgICByZXR1cm4gX3Nob3codGl0bGUsIG1lc3NhZ2UsIFFVRVNUSU9OLCBZRVNOTywgKipvcHRpb25zKQorCitkZWYgYXNrb2tjYW5jZWwodGl0bGU9Tm9uZSwgbWVzc2FnZT1Ob25lLCAqKm9wdGlvbnMpOgorICAgICJBc2sgaWYgb3BlcmF0aW9uIHNob3VsZCBwcm9jZWVkOyByZXR1cm4gdHJ1ZSBpZiB0aGUgYW5zd2VyIGlzIG9rIgorICAgIHMgPSBfc2hvdyh0aXRsZSwgbWVzc2FnZSwgUVVFU1RJT04sIE9LQ0FOQ0VMLCAqKm9wdGlvbnMpCisgICAgcmV0dXJuIHMgPT0gT0sKKworZGVmIGFza3llc25vKHRpdGxlPU5vbmUsIG1lc3NhZ2U9Tm9uZSwgKipvcHRpb25zKToKKyAgICAiQXNrIGEgcXVlc3Rpb247IHJldHVybiB0cnVlIGlmIHRoZSBhbnN3ZXIgaXMgeWVzIgorICAgIHMgPSBfc2hvdyh0aXRsZSwgbWVzc2FnZSwgUVVFU1RJT04sIFlFU05PLCAqKm9wdGlvbnMpCisgICAgcmV0dXJuIHMgPT0gWUVTCisKK2RlZiBhc2t5ZXNub2NhbmNlbCh0aXRsZT1Ob25lLCBtZXNzYWdlPU5vbmUsICoqb3B0aW9ucyk6CisgICAgIkFzayBhIHF1ZXN0aW9uOyByZXR1cm4gdHJ1ZSBpZiB0aGUgYW5zd2VyIGlzIHllcywgTm9uZSBpZiBjYW5jZWxsZWQuIgorICAgIHMgPSBfc2hvdyh0aXRsZSwgbWVzc2FnZSwgUVVFU1RJT04sIFlFU05PQ0FOQ0VMLCAqKm9wdGlvbnMpCisgICAgIyBzIG1pZ2h0IGJlIGEgVGNsIGluZGV4IG9iamVjdCwgc28gY29udmVydCBpdCB0byBhIHN0cmluZworICAgIHMgPSBzdHIocykKKyAgICBpZiBzID09IENBTkNFTDoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gcyA9PSBZRVMKKworZGVmIGFza3JldHJ5Y2FuY2VsKHRpdGxlPU5vbmUsIG1lc3NhZ2U9Tm9uZSwgKipvcHRpb25zKToKKyAgICAiQXNrIGlmIG9wZXJhdGlvbiBzaG91bGQgYmUgcmV0cmllZDsgcmV0dXJuIHRydWUgaWYgdGhlIGFuc3dlciBpcyB5ZXMiCisgICAgcyA9IF9zaG93KHRpdGxlLCBtZXNzYWdlLCBXQVJOSU5HLCBSRVRSWUNBTkNFTCwgKipvcHRpb25zKQorICAgIHJldHVybiBzID09IFJFVFJZCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB0ZXN0IHN0dWZmCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisKKyAgICBwcmludCAiaW5mbyIsIHNob3dpbmZvKCJTcGFtIiwgIkVnZyBJbmZvcm1hdGlvbiIpCisgICAgcHJpbnQgIndhcm5pbmciLCBzaG93d2FybmluZygiU3BhbSIsICJFZ2cgV2FybmluZyIpCisgICAgcHJpbnQgImVycm9yIiwgc2hvd2Vycm9yKCJTcGFtIiwgIkVnZyBBbGVydCIpCisgICAgcHJpbnQgInF1ZXN0aW9uIiwgYXNrcXVlc3Rpb24oIlNwYW0iLCAiUXVlc3Rpb24/IikKKyAgICBwcmludCAicHJvY2VlZCIsIGFza29rY2FuY2VsKCJTcGFtIiwgIlByb2NlZWQ/IikKKyAgICBwcmludCAieWVzL25vIiwgYXNreWVzbm8oIlNwYW0iLCAiR290IGl0PyIpCisgICAgcHJpbnQgInllcy9uby9jYW5jZWwiLCBhc2t5ZXNub2NhbmNlbCgiU3BhbSIsICJXYW50IGl0PyIpCisgICAgcHJpbnQgInRyeSBhZ2FpbiIsIGFza3JldHJ5Y2FuY2VsKCJTcGFtIiwgIlRyeSBhZ2Fpbj8iKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtNZXNzYWdlQm94LnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrTWVzc2FnZUJveC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1MDQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrTWVzc2FnZUJveC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtNZXNzYWdlQm94LnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrTWVzc2FnZUJveC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1MDQ3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrTWVzc2FnZUJveC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtTaW1wbGVEaWFsb2cucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a1NpbXBsZURpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjM0NzVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtTaW1wbGVEaWFsb2cucHkKQEAgLTAsMCArMSwzMjMgQEAKKyMKKyMgQW4gSW50cm9kdWN0aW9uIHRvIFRraW50ZXIKKyMgdGtTaW1wbGVEaWFsb2cucHkKKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk3IGJ5IEZyZWRyaWsgTHVuZGgKKyMKKyMgZnJlZHJpa0BweXRob253YXJlLmNvbQorIyBodHRwOi8vd3d3LnB5dGhvbndhcmUuY29tCisjCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZGlhbG9nIGJhc2UgY2xhc3MKKworJycnRGlhbG9nIGJveGVzCisKK1RoaXMgbW9kdWxlIGhhbmRsZXMgZGlhbG9nIGJveGVzLiBJdCBjb250YWlucyB0aGUgZm9sbG93aW5nCitwdWJsaWMgc3ltYm9sczoKKworRGlhbG9nIC0tIGEgYmFzZSBjbGFzcyBmb3IgZGlhbG9ncworCithc2tpbnRlZ2VyIC0tIGdldCBhbiBpbnRlZ2VyIGZyb20gdGhlIHVzZXIKKworYXNrZmxvYXQgLS0gZ2V0IGEgZmxvYXQgZnJvbSB0aGUgdXNlcgorCithc2tzdHJpbmcgLS0gZ2V0IGEgc3RyaW5nIGZyb20gdGhlIHVzZXIKKycnJworCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKKworY2xhc3MgRGlhbG9nKFRvcGxldmVsKToKKworICAgICcnJ0NsYXNzIHRvIG9wZW4gZGlhbG9ncy4KKworICAgIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgYXMgYSBiYXNlIGNsYXNzIGZvciBjdXN0b20gZGlhbG9ncworICAgICcnJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUgPSBOb25lKToKKworICAgICAgICAnJydJbml0aWFsaXplIGEgZGlhbG9nLgorCisgICAgICAgIEFyZ3VtZW50czoKKworICAgICAgICAgICAgcGFyZW50IC0tIGEgcGFyZW50IHdpbmRvdyAodGhlIGFwcGxpY2F0aW9uIHdpbmRvdykKKworICAgICAgICAgICAgdGl0bGUgLS0gdGhlIGRpYWxvZyB0aXRsZQorICAgICAgICAnJycKKyAgICAgICAgVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQorCisgICAgICAgIHNlbGYud2l0aGRyYXcoKSAjIHJlbWFpbiBpbnZpc2libGUgZm9yIG5vdworICAgICAgICAjIElmIHRoZSBtYXN0ZXIgaXMgbm90IHZpZXdhYmxlLCBkb24ndAorICAgICAgICAjIG1ha2UgdGhlIGNoaWxkIHRyYW5zaWVudCwgb3IgZWxzZSBpdAorICAgICAgICAjIHdvdWxkIGJlIG9wZW5lZCB3aXRoZHJhd24KKyAgICAgICAgaWYgcGFyZW50LndpbmZvX3ZpZXdhYmxlKCk6CisgICAgICAgICAgICBzZWxmLnRyYW5zaWVudChwYXJlbnQpCisKKyAgICAgICAgaWYgdGl0bGU6CisgICAgICAgICAgICBzZWxmLnRpdGxlKHRpdGxlKQorCisgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CisKKyAgICAgICAgc2VsZi5yZXN1bHQgPSBOb25lCisKKyAgICAgICAgYm9keSA9IEZyYW1lKHNlbGYpCisgICAgICAgIHNlbGYuaW5pdGlhbF9mb2N1cyA9IHNlbGYuYm9keShib2R5KQorICAgICAgICBib2R5LnBhY2socGFkeD01LCBwYWR5PTUpCisKKyAgICAgICAgc2VsZi5idXR0b25ib3goKQorCisKKyAgICAgICAgaWYgbm90IHNlbGYuaW5pdGlhbF9mb2N1czoKKyAgICAgICAgICAgIHNlbGYuaW5pdGlhbF9mb2N1cyA9IHNlbGYKKworICAgICAgICBzZWxmLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5jYW5jZWwpCisKKyAgICAgICAgaWYgc2VsZi5wYXJlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmdlb21ldHJ5KCIrJWQrJWQiICUgKHBhcmVudC53aW5mb19yb290eCgpKzUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSs1MCkpCisKKyAgICAgICAgc2VsZi5kZWljb25pZnkoKSAjIGJlY29tZSB2aXNpYmlsZSBub3cKKworICAgICAgICBzZWxmLmluaXRpYWxfZm9jdXMuZm9jdXNfc2V0KCkKKworICAgICAgICAjIHdhaXQgZm9yIHdpbmRvdyB0byBhcHBlYXIgb24gc2NyZWVuIGJlZm9yZSBjYWxsaW5nIGdyYWJfc2V0CisgICAgICAgIHNlbGYud2FpdF92aXNpYmlsaXR5KCkKKyAgICAgICAgc2VsZi5ncmFiX3NldCgpCisgICAgICAgIHNlbGYud2FpdF93aW5kb3coc2VsZikKKworICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAnJydEZXN0cm95IHRoZSB3aW5kb3cnJycKKyAgICAgICAgc2VsZi5pbml0aWFsX2ZvY3VzID0gTm9uZQorICAgICAgICBUb3BsZXZlbC5kZXN0cm95KHNlbGYpCisKKyAgICAjCisgICAgIyBjb25zdHJ1Y3Rpb24gaG9va3MKKworICAgIGRlZiBib2R5KHNlbGYsIG1hc3Rlcik6CisgICAgICAgICcnJ2NyZWF0ZSBkaWFsb2cgYm9keS4KKworICAgICAgICByZXR1cm4gd2lkZ2V0IHRoYXQgc2hvdWxkIGhhdmUgaW5pdGlhbCBmb2N1cy4KKyAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4sIGFuZCBpcyBjYWxsZWQKKyAgICAgICAgYnkgdGhlIF9faW5pdF9fIG1ldGhvZC4KKyAgICAgICAgJycnCisgICAgICAgIHBhc3MKKworICAgIGRlZiBidXR0b25ib3goc2VsZik6CisgICAgICAgICcnJ2FkZCBzdGFuZGFyZCBidXR0b24gYm94LgorCisgICAgICAgIG92ZXJyaWRlIGlmIHlvdSBkbyBub3Qgd2FudCB0aGUgc3RhbmRhcmQgYnV0dG9ucworICAgICAgICAnJycKKworICAgICAgICBib3ggPSBGcmFtZShzZWxmKQorCisgICAgICAgIHcgPSBCdXR0b24oYm94LCB0ZXh0PSJPSyIsIHdpZHRoPTEwLCBjb21tYW5kPXNlbGYub2ssIGRlZmF1bHQ9QUNUSVZFKQorICAgICAgICB3LnBhY2soc2lkZT1MRUZULCBwYWR4PTUsIHBhZHk9NSkKKyAgICAgICAgdyA9IEJ1dHRvbihib3gsIHRleHQ9IkNhbmNlbCIsIHdpZHRoPTEwLCBjb21tYW5kPXNlbGYuY2FuY2VsKQorICAgICAgICB3LnBhY2soc2lkZT1MRUZULCBwYWR4PTUsIHBhZHk9NSkKKworICAgICAgICBzZWxmLmJpbmQoIjxSZXR1cm4+Iiwgc2VsZi5vaykKKyAgICAgICAgc2VsZi5iaW5kKCI8RXNjYXBlPiIsIHNlbGYuY2FuY2VsKQorCisgICAgICAgIGJveC5wYWNrKCkKKworICAgICMKKyAgICAjIHN0YW5kYXJkIGJ1dHRvbiBzZW1hbnRpY3MKKworICAgIGRlZiBvayhzZWxmLCBldmVudD1Ob25lKToKKworICAgICAgICBpZiBub3Qgc2VsZi52YWxpZGF0ZSgpOgorICAgICAgICAgICAgc2VsZi5pbml0aWFsX2ZvY3VzLmZvY3VzX3NldCgpICMgcHV0IGZvY3VzIGJhY2sKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYud2l0aGRyYXcoKQorICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXBwbHkoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jYW5jZWwoKQorCisgICAgZGVmIGNhbmNlbChzZWxmLCBldmVudD1Ob25lKToKKworICAgICAgICAjIHB1dCBmb2N1cyBiYWNrIHRvIHRoZSBwYXJlbnQgd2luZG93CisgICAgICAgIGlmIHNlbGYucGFyZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5wYXJlbnQuZm9jdXNfc2V0KCkKKyAgICAgICAgc2VsZi5kZXN0cm95KCkKKworICAgICMKKyAgICAjIGNvbW1hbmQgaG9va3MKKworICAgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICAgICAgJycndmFsaWRhdGUgdGhlIGRhdGEKKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB0byB2YWxpZGF0ZSB0aGUgZGF0YSBiZWZvcmUgdGhlCisgICAgICAgIGRpYWxvZyBpcyBkZXN0cm95ZWQuIEJ5IGRlZmF1bHQsIGl0IGFsd2F5cyB2YWxpZGF0ZXMgT0suCisgICAgICAgICcnJworCisgICAgICAgIHJldHVybiAxICMgb3ZlcnJpZGUKKworICAgIGRlZiBhcHBseShzZWxmKToKKyAgICAgICAgJycncHJvY2VzcyB0aGUgZGF0YQorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHRvIHByb2Nlc3MgdGhlIGRhdGEsICphZnRlcioKKyAgICAgICAgdGhlIGRpYWxvZyBpcyBkZXN0cm95ZWQuIEJ5IGRlZmF1bHQsIGl0IGRvZXMgbm90aGluZy4KKyAgICAgICAgJycnCisKKyAgICAgICAgcGFzcyAjIG92ZXJyaWRlCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb252ZW5pZW5jZSBkaWFsb2d1ZXMKKworY2xhc3MgX1F1ZXJ5RGlhbG9nKERpYWxvZyk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGl0bGUsIHByb21wdCwKKyAgICAgICAgICAgICAgICAgaW5pdGlhbHZhbHVlPU5vbmUsCisgICAgICAgICAgICAgICAgIG1pbnZhbHVlID0gTm9uZSwgbWF4dmFsdWUgPSBOb25lLAorICAgICAgICAgICAgICAgICBwYXJlbnQgPSBOb25lKToKKworICAgICAgICBpZiBub3QgcGFyZW50OgorICAgICAgICAgICAgaW1wb3J0IFRraW50ZXIKKyAgICAgICAgICAgIHBhcmVudCA9IFRraW50ZXIuX2RlZmF1bHRfcm9vdAorCisgICAgICAgIHNlbGYucHJvbXB0ICAgPSBwcm9tcHQKKyAgICAgICAgc2VsZi5taW52YWx1ZSA9IG1pbnZhbHVlCisgICAgICAgIHNlbGYubWF4dmFsdWUgPSBtYXh2YWx1ZQorCisgICAgICAgIHNlbGYuaW5pdGlhbHZhbHVlID0gaW5pdGlhbHZhbHVlCisKKyAgICAgICAgRGlhbG9nLl9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUpCisKKyAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgc2VsZi5lbnRyeSA9IE5vbmUKKyAgICAgICAgRGlhbG9nLmRlc3Ryb3koc2VsZikKKworICAgIGRlZiBib2R5KHNlbGYsIG1hc3Rlcik6CisKKyAgICAgICAgdyA9IExhYmVsKG1hc3RlciwgdGV4dD1zZWxmLnByb21wdCwganVzdGlmeT1MRUZUKQorICAgICAgICB3LmdyaWQocm93PTAsIHBhZHg9NSwgc3RpY2t5PVcpCisKKyAgICAgICAgc2VsZi5lbnRyeSA9IEVudHJ5KG1hc3RlciwgbmFtZT0iZW50cnkiKQorICAgICAgICBzZWxmLmVudHJ5LmdyaWQocm93PTEsIHBhZHg9NSwgc3RpY2t5PVcrRSkKKworICAgICAgICBpZiBzZWxmLmluaXRpYWx2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZW50cnkuaW5zZXJ0KDAsIHNlbGYuaW5pdGlhbHZhbHVlKQorICAgICAgICAgICAgc2VsZi5lbnRyeS5zZWxlY3RfcmFuZ2UoMCwgRU5EKQorCisgICAgICAgIHJldHVybiBzZWxmLmVudHJ5CisKKyAgICBkZWYgdmFsaWRhdGUoc2VsZik6CisKKyAgICAgICAgaW1wb3J0IHRrTWVzc2FnZUJveAorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZ2V0cmVzdWx0KCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd3dhcm5pbmcoCisgICAgICAgICAgICAgICAgIklsbGVnYWwgdmFsdWUiLAorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JtZXNzYWdlICsgIlxuUGxlYXNlIHRyeSBhZ2FpbiIsCisgICAgICAgICAgICAgICAgcGFyZW50ID0gc2VsZgorICAgICAgICAgICAgKQorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgICAgICBpZiBzZWxmLm1pbnZhbHVlIGlzIG5vdCBOb25lIGFuZCByZXN1bHQgPCBzZWxmLm1pbnZhbHVlOgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3d3YXJuaW5nKAorICAgICAgICAgICAgICAgICJUb28gc21hbGwiLAorICAgICAgICAgICAgICAgICJUaGUgYWxsb3dlZCBtaW5pbXVtIHZhbHVlIGlzICVzLiAiCisgICAgICAgICAgICAgICAgIlBsZWFzZSB0cnkgYWdhaW4uIiAlIHNlbGYubWludmFsdWUsCisgICAgICAgICAgICAgICAgcGFyZW50ID0gc2VsZgorICAgICAgICAgICAgKQorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgICAgICBpZiBzZWxmLm1heHZhbHVlIGlzIG5vdCBOb25lIGFuZCByZXN1bHQgPiBzZWxmLm1heHZhbHVlOgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3d3YXJuaW5nKAorICAgICAgICAgICAgICAgICJUb28gbGFyZ2UiLAorICAgICAgICAgICAgICAgICJUaGUgYWxsb3dlZCBtYXhpbXVtIHZhbHVlIGlzICVzLiAiCisgICAgICAgICAgICAgICAgIlBsZWFzZSB0cnkgYWdhaW4uIiAlIHNlbGYubWF4dmFsdWUsCisgICAgICAgICAgICAgICAgcGFyZW50ID0gc2VsZgorICAgICAgICAgICAgKQorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgICAgICBzZWxmLnJlc3VsdCA9IHJlc3VsdAorCisgICAgICAgIHJldHVybiAxCisKKworY2xhc3MgX1F1ZXJ5SW50ZWdlcihfUXVlcnlEaWFsb2cpOgorICAgIGVycm9ybWVzc2FnZSA9ICJOb3QgYW4gaW50ZWdlci4iCisgICAgZGVmIGdldHJlc3VsdChzZWxmKToKKyAgICAgICAgcmV0dXJuIGludChzZWxmLmVudHJ5LmdldCgpKQorCitkZWYgYXNraW50ZWdlcih0aXRsZSwgcHJvbXB0LCAqKmt3KToKKyAgICAnJydnZXQgYW4gaW50ZWdlciBmcm9tIHRoZSB1c2VyCisKKyAgICBBcmd1bWVudHM6CisKKyAgICAgICAgdGl0bGUgLS0gdGhlIGRpYWxvZyB0aXRsZQorICAgICAgICBwcm9tcHQgLS0gdGhlIGxhYmVsIHRleHQKKyAgICAgICAgKiprdyAtLSBzZWUgU2ltcGxlRGlhbG9nIGNsYXNzCisKKyAgICBSZXR1cm4gdmFsdWUgaXMgYW4gaW50ZWdlcgorICAgICcnJworICAgIGQgPSBfUXVlcnlJbnRlZ2VyKHRpdGxlLCBwcm9tcHQsICoqa3cpCisgICAgcmV0dXJuIGQucmVzdWx0CisKK2NsYXNzIF9RdWVyeUZsb2F0KF9RdWVyeURpYWxvZyk6CisgICAgZXJyb3JtZXNzYWdlID0gIk5vdCBhIGZsb2F0aW5nIHBvaW50IHZhbHVlLiIKKyAgICBkZWYgZ2V0cmVzdWx0KHNlbGYpOgorICAgICAgICByZXR1cm4gZmxvYXQoc2VsZi5lbnRyeS5nZXQoKSkKKworZGVmIGFza2Zsb2F0KHRpdGxlLCBwcm9tcHQsICoqa3cpOgorICAgICcnJ2dldCBhIGZsb2F0IGZyb20gdGhlIHVzZXIKKworICAgIEFyZ3VtZW50czoKKworICAgICAgICB0aXRsZSAtLSB0aGUgZGlhbG9nIHRpdGxlCisgICAgICAgIHByb21wdCAtLSB0aGUgbGFiZWwgdGV4dAorICAgICAgICAqKmt3IC0tIHNlZSBTaW1wbGVEaWFsb2cgY2xhc3MKKworICAgIFJldHVybiB2YWx1ZSBpcyBhIGZsb2F0CisgICAgJycnCisgICAgZCA9IF9RdWVyeUZsb2F0KHRpdGxlLCBwcm9tcHQsICoqa3cpCisgICAgcmV0dXJuIGQucmVzdWx0CisKK2NsYXNzIF9RdWVyeVN0cmluZyhfUXVlcnlEaWFsb2cpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgIGlmICJzaG93IiBpbiBrdzoKKyAgICAgICAgICAgIHNlbGYuX19zaG93ID0ga3dbInNob3ciXQorICAgICAgICAgICAgZGVsIGt3WyJzaG93Il0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX19zaG93ID0gTm9uZQorICAgICAgICBfUXVlcnlEaWFsb2cuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCisKKyAgICBkZWYgYm9keShzZWxmLCBtYXN0ZXIpOgorICAgICAgICBlbnRyeSA9IF9RdWVyeURpYWxvZy5ib2R5KHNlbGYsIG1hc3RlcikKKyAgICAgICAgaWYgc2VsZi5fX3Nob3cgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBlbnRyeS5jb25maWd1cmUoc2hvdz1zZWxmLl9fc2hvdykKKyAgICAgICAgcmV0dXJuIGVudHJ5CisKKyAgICBkZWYgZ2V0cmVzdWx0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lbnRyeS5nZXQoKQorCitkZWYgYXNrc3RyaW5nKHRpdGxlLCBwcm9tcHQsICoqa3cpOgorICAgICcnJ2dldCBhIHN0cmluZyBmcm9tIHRoZSB1c2VyCisKKyAgICBBcmd1bWVudHM6CisKKyAgICAgICAgdGl0bGUgLS0gdGhlIGRpYWxvZyB0aXRsZQorICAgICAgICBwcm9tcHQgLS0gdGhlIGxhYmVsIHRleHQKKyAgICAgICAgKiprdyAtLSBzZWUgU2ltcGxlRGlhbG9nIGNsYXNzCisKKyAgICBSZXR1cm4gdmFsdWUgaXMgYSBzdHJpbmcKKyAgICAnJycKKyAgICBkID0gX1F1ZXJ5U3RyaW5nKHRpdGxlLCBwcm9tcHQsICoqa3cpCisgICAgcmV0dXJuIGQucmVzdWx0CisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisKKyAgICByb290ID0gVGsoKQorICAgIHJvb3QudXBkYXRlKCkKKworICAgIHByaW50IGFza2ludGVnZXIoIlNwYW0iLCAiRWdnIGNvdW50IiwgaW5pdGlhbHZhbHVlPTEyKjEyKQorICAgIHByaW50IGFza2Zsb2F0KCJTcGFtIiwgIkVnZyB3ZWlnaHRcbihpbiB0b25zKSIsIG1pbnZhbHVlPTEsIG1heHZhbHVlPTEwMCkKKyAgICBwcmludCBhc2tzdHJpbmcoIlNwYW0iLCAiRWdnIGxhYmVsIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3RrU2ltcGxlRGlhbG9nLnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrU2ltcGxlRGlhbG9nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDNkZmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtTaW1wbGVEaWFsb2cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3RrU2ltcGxlRGlhbG9nLnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrU2ltcGxlRGlhbG9nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDNkZmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtTaW1wbGVEaWFsb2cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3R0ay5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL3R0ay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWY3Mzc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdHRrLnB5CkBAIC0wLDAgKzEsMTYwOSBAQAorIiIiVHRrIHdyYXBwZXIuCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGNsYXNzZXMgdG8gYWxsb3cgdXNpbmcgVGsgdGhlbWVkIHdpZGdldCBzZXQuCisKK1R0ayBpcyBiYXNlZCBvbiBhIHJldmlzZWQgYW5kIGVuaGFuY2VkIHZlcnNpb24gb2YKK1RJUCAjNDggKGh0dHA6Ly90aXAudGNsLnRrLzQ4KSBzcGVjaWZpZWQgc3R5bGUgZW5naW5lLgorCitJdHMgYmFzaWMgaWRlYSBpcyB0byBzZXBhcmF0ZSwgdG8gdGhlIGV4dGVudCBwb3NzaWJsZSwgdGhlIGNvZGUKK2ltcGxlbWVudGluZyBhIHdpZGdldCdzIGJlaGF2aW9yIGZyb20gdGhlIGNvZGUgaW1wbGVtZW50aW5nIGl0cworYXBwZWFyYW5jZS4gV2lkZ2V0IGNsYXNzIGJpbmRpbmdzIGFyZSBwcmltYXJpbHkgcmVzcG9uc2libGUgZm9yCittYWludGFpbmluZyB0aGUgd2lkZ2V0IHN0YXRlIGFuZCBpbnZva2luZyBjYWxsYmFja3MsIGFsbCBhc3BlY3RzCitvZiB0aGUgd2lkZ2V0cyBhcHBlYXJhbmNlIGxpZXMgYXQgVGhlbWVzLgorIiIiCisKK19fdmVyc2lvbl9fID0gIjAuMy4xIgorCitfX2F1dGhvcl9fID0gIkd1aWxoZXJtZSBQb2xvIDxnZ3BvbG9AZ21haWwuY29tPiIKKworX19hbGxfXyA9IFsiQnV0dG9uIiwgIkNoZWNrYnV0dG9uIiwgIkNvbWJvYm94IiwgIkVudHJ5IiwgIkZyYW1lIiwgIkxhYmVsIiwKKyAgICAgICAgICAgIkxhYmVsZnJhbWUiLCAiTGFiZWxGcmFtZSIsICJNZW51YnV0dG9uIiwgIk5vdGVib29rIiwgIlBhbmVkd2luZG93IiwKKyAgICAgICAgICAgIlBhbmVkV2luZG93IiwgIlByb2dyZXNzYmFyIiwgIlJhZGlvYnV0dG9uIiwgIlNjYWxlIiwgIlNjcm9sbGJhciIsCisgICAgICAgICAgICJTZXBhcmF0b3IiLCAiU2l6ZWdyaXAiLCAiU3R5bGUiLCAiVHJlZXZpZXciLAorICAgICAgICAgICAjIEV4dGVuc2lvbnMKKyAgICAgICAgICAgIkxhYmVsZWRTY2FsZSIsICJPcHRpb25NZW51IiwKKyAgICAgICAgICAgIyBmdW5jdGlvbnMKKyAgICAgICAgICAgInRjbG9ianNfdG9fcHkiLCAic2V0dXBfbWFzdGVyIl0KKworaW1wb3J0IFRraW50ZXIKK2Zyb20gVGtpbnRlciBpbXBvcnQgX2ZsYXR0ZW4sIF9qb2luLCBfc3RyaW5naWZ5CisKKyMgVmVyaWZ5IGlmIFRrIGlzIG5ldyBlbm91Z2ggdG8gbm90IG5lZWQgdGhlIFRpbGUgcGFja2FnZQorX1JFUVVJUkVfVElMRSA9IFRydWUgaWYgVGtpbnRlci5Ua1ZlcnNpb24gPCA4LjUgZWxzZSBGYWxzZQorCitkZWYgX2xvYWRfdGlsZShtYXN0ZXIpOgorICAgIGlmIF9SRVFVSVJFX1RJTEU6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICB0aWxlbGliID0gb3MuZW52aXJvbi5nZXQoJ1RJTEVfTElCUkFSWScpCisgICAgICAgIGlmIHRpbGVsaWI6CisgICAgICAgICAgICAjIGFwcGVuZCBjdXN0b20gdGlsZSBwYXRoIHRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRoYXQKKyAgICAgICAgICAgICMgVGNsIHVzZXMgd2hlbiBhdHRlbXB0aW5nIHRvIHJlc29sdmUgcGFja2FnZXMgd2l0aCB0aGUgcGFja2FnZQorICAgICAgICAgICAgIyBjb21tYW5kCisgICAgICAgICAgICBtYXN0ZXIudGsuZXZhbCgKKyAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbCBhdXRvX3BhdGg7ICcKKyAgICAgICAgICAgICAgICAgICAgJ2xhcHBlbmQgYXV0b19wYXRoIHslc30nICUgdGlsZWxpYikKKworICAgICAgICBtYXN0ZXIudGsuZXZhbCgncGFja2FnZSByZXF1aXJlIHRpbGUnKSAjIFRjbEVycm9yIG1heSBiZSByYWlzZWQgaGVyZQorICAgICAgICBtYXN0ZXIuX3RpbGVfbG9hZGVkID0gVHJ1ZQorCitkZWYgX2Zvcm1hdF9vcHR2YWx1ZSh2YWx1ZSwgc2NyaXB0PUZhbHNlKToKKyAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICBpZiBzY3JpcHQ6CisgICAgICAgICMgaWYgY2FsbGVyIHBhc3NlcyBhIFRjbCBzY3JpcHQgdG8gdGsuY2FsbCwgYWxsIHRoZSB2YWx1ZXMgbmVlZCB0bworICAgICAgICAjIGJlIGdyb3VwZWQgaW50byB3b3JkcyAoYXJndW1lbnRzIHRvIGEgY29tbWFuZCBpbiBUY2wgZGlhbGVjdCkKKyAgICAgICAgdmFsdWUgPSBfc3RyaW5naWZ5KHZhbHVlKQorICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgIHZhbHVlID0gX2pvaW4odmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBfZm9ybWF0X29wdGRpY3Qob3B0ZGljdCwgc2NyaXB0PUZhbHNlLCBpZ25vcmU9Tm9uZSk6CisgICAgIiIiRm9ybWF0cyBvcHRkaWN0IHRvIGEgdHVwbGUgdG8gcGFzcyBpdCB0byB0ay5jYWxsLgorCisgICAgRS5nLiAoc2NyaXB0PUZhbHNlKToKKyAgICAgIHsnZm9yZWdyb3VuZCc6ICdibHVlJywgJ3BhZGRpbmcnOiBbMSwgMiwgMywgNF19IHJldHVybnM6CisgICAgICAoJy1mb3JlZ3JvdW5kJywgJ2JsdWUnLCAnLXBhZGRpbmcnLCAnMSAyIDMgNCcpIiIiCisKKyAgICBvcHRzID0gW10KKyAgICBmb3Igb3B0LCB2YWx1ZSBpbiBvcHRkaWN0Lml0ZXJpdGVtcygpOgorICAgICAgICBpZiBub3QgaWdub3JlIG9yIG9wdCBub3QgaW4gaWdub3JlOgorICAgICAgICAgICAgb3B0cy5hcHBlbmQoIi0lcyIgJSBvcHQpCisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBvcHRzLmFwcGVuZChfZm9ybWF0X29wdHZhbHVlKHZhbHVlLCBzY3JpcHQpKQorCisgICAgcmV0dXJuIF9mbGF0dGVuKG9wdHMpCisKK2RlZiBfbWFwZGljdF92YWx1ZXMoaXRlbXMpOgorICAgICMgZWFjaCB2YWx1ZSBpbiBtYXBkaWN0IGlzIGV4cGVjdGVkIHRvIGJlIGEgc2VxdWVuY2UsIHdoZXJlIGVhY2ggaXRlbQorICAgICMgaXMgYW5vdGhlciBzZXF1ZW5jZSBjb250YWluaW5nIGEgc3RhdGUgKG9yIHNldmVyYWwpIGFuZCBhIHZhbHVlCisgICAgIyBFLmcuIChzY3JpcHQ9RmFsc2UpOgorICAgICMgICBbKCdhY3RpdmUnLCAnc2VsZWN0ZWQnLCAnZ3JleScpLCAoJ2ZvY3VzJywgWzEsIDIsIDMsIDRdKV0KKyAgICAjICAgcmV0dXJuczoKKyAgICAjICAgWydhY3RpdmUgc2VsZWN0ZWQnLCAnZ3JleScsICdmb2N1cycsIFsxLCAyLCAzLCA0XV0KKyAgICBvcHRfdmFsID0gW10KKyAgICBmb3IgaXRlbSBpbiBpdGVtczoKKyAgICAgICAgc3RhdGUgPSBpdGVtWzotMV0KKyAgICAgICAgdmFsID0gaXRlbVstMV0KKyAgICAgICAgIyBoYWNrcyBmb3IgYmFrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgICAgIHN0YXRlWzBdICMgcmFpc2UgSW5kZXhFcnJvciBpZiBlbXB0eQorICAgICAgICBpZiBsZW4oc3RhdGUpID09IDE6CisgICAgICAgICAgICAjIGlmIGl0IGlzIGVtcHR5IChzb21ldGhpbmcgdGhhdCBldmFsdWF0ZXMgdG8gRmFsc2UpLCB0aGVuCisgICAgICAgICAgICAjIGZvcm1hdCBpdCB0byBUY2wgY29kZSB0byBkZW5vdGUgdGhlICJub3JtYWwiIHN0YXRlCisgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlWzBdIG9yICcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGdyb3VwIG11bHRpcGxlIHN0YXRlcworICAgICAgICAgICAgc3RhdGUgPSAnICcuam9pbihzdGF0ZSkgIyByYWlzZSBUeXBlRXJyb3IgaWYgbm90IHN0cgorICAgICAgICBvcHRfdmFsLmFwcGVuZChzdGF0ZSkKKyAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3B0X3ZhbC5hcHBlbmQodmFsKQorICAgIHJldHVybiBvcHRfdmFsCisKK2RlZiBfZm9ybWF0X21hcGRpY3QobWFwZGljdCwgc2NyaXB0PUZhbHNlKToKKyAgICAiIiJGb3JtYXRzIG1hcGRpY3QgdG8gcGFzcyBpdCB0byB0ay5jYWxsLgorCisgICAgRS5nLiAoc2NyaXB0PUZhbHNlKToKKyAgICAgIHsnZXhwYW5kJzogWygnYWN0aXZlJywgJ3NlbGVjdGVkJywgJ2dyZXknKSwgKCdmb2N1cycsIFsxLCAyLCAzLCA0XSldfQorCisgICAgICByZXR1cm5zOgorCisgICAgICAoJy1leHBhbmQnLCAne2FjdGl2ZSBzZWxlY3RlZH0gZ3JleSBmb2N1cyB7MSwgMiwgMywgNH0nKSIiIgorCisgICAgb3B0cyA9IFtdCisgICAgZm9yIG9wdCwgdmFsdWUgaW4gbWFwZGljdC5pdGVyaXRlbXMoKToKKyAgICAgICAgb3B0cy5leHRlbmQoKCItJXMiICUgb3B0LAorICAgICAgICAgICAgICAgICAgICAgX2Zvcm1hdF9vcHR2YWx1ZShfbWFwZGljdF92YWx1ZXModmFsdWUpLCBzY3JpcHQpKSkKKworICAgIHJldHVybiBfZmxhdHRlbihvcHRzKQorCitkZWYgX2Zvcm1hdF9lbGVtY3JlYXRlKGV0eXBlLCBzY3JpcHQ9RmFsc2UsICphcmdzLCAqKmt3KToKKyAgICAiIiJGb3JtYXRzIGFyZ3MgYW5kIGt3IGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gZWxlbWVudCBmYWN0b3J5IGV0eXBlLiIiIgorICAgIHNwZWMgPSBOb25lCisgICAgb3B0cyA9ICgpCisgICAgaWYgZXR5cGUgaW4gKCJpbWFnZSIsICJ2c2FwaSIpOgorICAgICAgICBpZiBldHlwZSA9PSAiaW1hZ2UiOiAjIGRlZmluZSBhbiBlbGVtZW50IGJhc2VkIG9uIGFuIGltYWdlCisgICAgICAgICAgICAjIGZpcnN0IGFyZyBzaG91bGQgYmUgdGhlIGRlZmF1bHQgaW1hZ2UgbmFtZQorICAgICAgICAgICAgaW5hbWUgPSBhcmdzWzBdCisgICAgICAgICAgICAjIG5leHQgYXJncywgaWYgYW55LCBhcmUgc3RhdGVzcGVjL3ZhbHVlIHBhaXJzIHdoaWNoIGlzIGFsbW9zdAorICAgICAgICAgICAgIyBhIG1hcGRpY3QsIGJ1dCB3ZSBqdXN0IG5lZWQgdGhlIHZhbHVlCisgICAgICAgICAgICBpbWFnZXNwZWMgPSBfam9pbihfbWFwZGljdF92YWx1ZXMoYXJnc1sxOl0pKQorICAgICAgICAgICAgc3BlYyA9ICIlcyAlcyIgJSAoaW5hbWUsIGltYWdlc3BlYykKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBkZWZpbmUgYW4gZWxlbWVudCB3aG9zZSB2aXN1YWwgYXBwZWFyYW5jZSBpcyBkcmF3biB1c2luZyB0aGUKKyAgICAgICAgICAgICMgTWljcm9zb2Z0IFZpc3VhbCBTdHlsZXMgQVBJIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUKKyAgICAgICAgICAgICMgdGhlbWVkIHN0eWxlcyBvbiBXaW5kb3dzIFhQIGFuZCBWaXN0YS4KKyAgICAgICAgICAgICMgQXZhaWxhYmlsaXR5OiBUayA4LjYsIFdpbmRvd3MgWFAgYW5kIFZpc3RhLgorICAgICAgICAgICAgY2xhc3NfbmFtZSwgcGFydF9pZCA9IGFyZ3NbOjJdCisgICAgICAgICAgICBzdGF0ZW1hcCA9IF9qb2luKF9tYXBkaWN0X3ZhbHVlcyhhcmdzWzI6XSkpCisgICAgICAgICAgICBzcGVjID0gIiVzICVzICVzIiAlIChjbGFzc19uYW1lLCBwYXJ0X2lkLCBzdGF0ZW1hcCkKKworICAgICAgICBvcHRzID0gX2Zvcm1hdF9vcHRkaWN0KGt3LCBzY3JpcHQpCisKKyAgICBlbGlmIGV0eXBlID09ICJmcm9tIjogIyBjbG9uZSBhbiBlbGVtZW50CisgICAgICAgICMgaXQgZXhwZWN0cyBhIHRoZW1lbmFtZSBhbmQgb3B0aW9uYWxseSBhbiBlbGVtZW50IHRvIGNsb25lIGZyb20sCisgICAgICAgICMgb3RoZXJ3aXNlIGl0IHdpbGwgY2xvbmUge30gKGVtcHR5IGVsZW1lbnQpCisgICAgICAgIHNwZWMgPSBhcmdzWzBdICMgdGhlbWUgbmFtZQorICAgICAgICBpZiBsZW4oYXJncykgPiAxOiAjIGVsZW1lbnRmcm9tIHNwZWNpZmllZAorICAgICAgICAgICAgb3B0cyA9IChfZm9ybWF0X29wdHZhbHVlKGFyZ3NbMV0sIHNjcmlwdCksKQorCisgICAgaWYgc2NyaXB0OgorICAgICAgICBzcGVjID0gJ3slc30nICUgc3BlYworICAgICAgICBvcHRzID0gJyAnLmpvaW4ob3B0cykKKworICAgIHJldHVybiBzcGVjLCBvcHRzCisKK2RlZiBfZm9ybWF0X2xheW91dGxpc3QobGF5b3V0LCBpbmRlbnQ9MCwgaW5kZW50X3NpemU9Mik6CisgICAgIiIiRm9ybWF0cyBhIGxheW91dCBsaXN0IHNvIHdlIGNhbiBwYXNzIHRoZSByZXN1bHQgdG8gdHRrOjpzdHlsZQorICAgIGxheW91dCBhbmQgdHRrOjpzdHlsZSBzZXR0aW5ncy4gTm90ZSB0aGF0IHRoZSBsYXlvdXQgZG9lc24ndCBoYXMgdG8KKyAgICBiZSBhIGxpc3QgbmVjZXNzYXJpbHkuCisKKyAgICBFLmcuOgorICAgICAgWygiTWVudWJ1dHRvbi5iYWNrZ3JvdW5kIiwgTm9uZSksCisgICAgICAgKCJNZW51YnV0dG9uLmJ1dHRvbiIsIHsiY2hpbGRyZW4iOgorICAgICAgICAgICBbKCJNZW51YnV0dG9uLmZvY3VzIiwgeyJjaGlsZHJlbiI6CisgICAgICAgICAgICAgICBbKCJNZW51YnV0dG9uLnBhZGRpbmciLCB7ImNoaWxkcmVuIjoKKyAgICAgICAgICAgICAgICBbKCJNZW51YnV0dG9uLmxhYmVsIiwgeyJzaWRlIjogImxlZnQiLCAiZXhwYW5kIjogMX0pXQorICAgICAgICAgICAgICAgfSldCisgICAgICAgICAgIH0pXQorICAgICAgIH0pLAorICAgICAgICgiTWVudWJ1dHRvbi5pbmRpY2F0b3IiLCB7InNpZGUiOiAicmlnaHQifSkKKyAgICAgIF0KKworICAgICAgcmV0dXJuczoKKworICAgICAgTWVudWJ1dHRvbi5iYWNrZ3JvdW5kCisgICAgICBNZW51YnV0dG9uLmJ1dHRvbiAtY2hpbGRyZW4geworICAgICAgICBNZW51YnV0dG9uLmZvY3VzIC1jaGlsZHJlbiB7CisgICAgICAgICAgTWVudWJ1dHRvbi5wYWRkaW5nIC1jaGlsZHJlbiB7CisgICAgICAgICAgICBNZW51YnV0dG9uLmxhYmVsIC1zaWRlIGxlZnQgLWV4cGFuZCAxCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBNZW51YnV0dG9uLmluZGljYXRvciAtc2lkZSByaWdodCIiIgorICAgIHNjcmlwdCA9IFtdCisKKyAgICBmb3IgbGF5b3V0X2VsZW0gaW4gbGF5b3V0OgorICAgICAgICBlbGVtLCBvcHRzID0gbGF5b3V0X2VsZW0KKyAgICAgICAgb3B0cyA9IG9wdHMgb3Ige30KKyAgICAgICAgZm9wdHMgPSAnICcuam9pbihfZm9ybWF0X29wdGRpY3Qob3B0cywgVHJ1ZSwgKCJjaGlsZHJlbiIsKSkpCisgICAgICAgIGhlYWQgPSAiJXMlcyVzIiAlICgnICcgKiBpbmRlbnQsIGVsZW0sICgiICVzIiAlIGZvcHRzKSBpZiBmb3B0cyBlbHNlICcnKQorCisgICAgICAgIGlmICJjaGlsZHJlbiIgaW4gb3B0czoKKyAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoaGVhZCArICIgLWNoaWxkcmVuIHsiKQorICAgICAgICAgICAgaW5kZW50ICs9IGluZGVudF9zaXplCisgICAgICAgICAgICBuZXdzY3JpcHQsIGluZGVudCA9IF9mb3JtYXRfbGF5b3V0bGlzdChvcHRzWydjaGlsZHJlbiddLCBpbmRlbnQsCisgICAgICAgICAgICAgICAgaW5kZW50X3NpemUpCisgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKG5ld3NjcmlwdCkKKyAgICAgICAgICAgIGluZGVudCAtPSBpbmRlbnRfc2l6ZQorICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgnJXN9JyAlICgnICcgKiBpbmRlbnQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2NyaXB0LmFwcGVuZChoZWFkKQorCisgICAgcmV0dXJuICdcbicuam9pbihzY3JpcHQpLCBpbmRlbnQKKworZGVmIF9zY3JpcHRfZnJvbV9zZXR0aW5ncyhzZXR0aW5ncyk6CisgICAgIiIiUmV0dXJucyBhbiBhcHByb3ByaWF0ZSBzY3JpcHQsIGJhc2VkIG9uIHNldHRpbmdzLCBhY2NvcmRpbmcgdG8KKyAgICB0aGVtZV9zZXR0aW5ncyBkZWZpbml0aW9uIHRvIGJlIHVzZWQgYnkgdGhlbWVfc2V0dGluZ3MgYW5kCisgICAgdGhlbWVfY3JlYXRlLiIiIgorICAgIHNjcmlwdCA9IFtdCisgICAgIyBhIHNjcmlwdCB3aWxsIGJlIGdlbmVyYXRlZCBhY2NvcmRpbmcgdG8gc2V0dGluZ3MgcGFzc2VkLCB3aGljaAorICAgICMgd2lsbCB0aGVuIGJlIGV2YWx1YXRlZCBieSBUY2wKKyAgICBmb3IgbmFtZSwgb3B0cyBpbiBzZXR0aW5ncy5pdGVyaXRlbXMoKToKKyAgICAgICAgIyB3aWxsIGZvcm1hdCBzcGVjaWZpYyBrZXlzIGFjY29yZGluZyB0byBUY2wgY29kZQorICAgICAgICBpZiBvcHRzLmdldCgnY29uZmlndXJlJyk6ICMgZm9ybWF0ICdjb25maWd1cmUnCisgICAgICAgICAgICBzID0gJyAnLmpvaW4oX2Zvcm1hdF9vcHRkaWN0KG9wdHNbJ2NvbmZpZ3VyZSddLCBUcnVlKSkKKyAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoInR0azo6c3R5bGUgY29uZmlndXJlICVzICVzOyIgJSAobmFtZSwgcykpCisKKyAgICAgICAgaWYgb3B0cy5nZXQoJ21hcCcpOiAjIGZvcm1hdCAnbWFwJworICAgICAgICAgICAgcyA9ICcgJy5qb2luKF9mb3JtYXRfbWFwZGljdChvcHRzWydtYXAnXSwgVHJ1ZSkpCisgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCJ0dGs6OnN0eWxlIG1hcCAlcyAlczsiICUgKG5hbWUsIHMpKQorCisgICAgICAgIGlmICdsYXlvdXQnIGluIG9wdHM6ICMgZm9ybWF0ICdsYXlvdXQnIHdoaWNoIG1heSBiZSBlbXB0eQorICAgICAgICAgICAgaWYgbm90IG9wdHNbJ2xheW91dCddOgorICAgICAgICAgICAgICAgIHMgPSAnbnVsbCcgIyBjb3VsZCBiZSBhbnkgb3RoZXIgd29yZCwgYnV0IHRoaXMgb25lIG1ha2VzIHNlbnNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHMsIF8gPSBfZm9ybWF0X2xheW91dGxpc3Qob3B0c1snbGF5b3V0J10pCisgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCJ0dGs6OnN0eWxlIGxheW91dCAlcyB7XG4lc1xufSIgJSAobmFtZSwgcykpCisKKyAgICAgICAgaWYgb3B0cy5nZXQoJ2VsZW1lbnQgY3JlYXRlJyk6ICMgZm9ybWF0ICdlbGVtZW50IGNyZWF0ZScKKyAgICAgICAgICAgIGVvcHRzID0gb3B0c1snZWxlbWVudCBjcmVhdGUnXQorICAgICAgICAgICAgZXR5cGUgPSBlb3B0c1swXQorCisgICAgICAgICAgICAjIGZpbmQgd2hlcmUgYXJncyBlbmQsIGFuZCB3aGVyZSBrd2FyZ3Mgc3RhcnQKKyAgICAgICAgICAgIGFyZ2MgPSAxICMgZXR5cGUgd2FzIHRoZSBmaXJzdCBvbmUKKyAgICAgICAgICAgIHdoaWxlIGFyZ2MgPCBsZW4oZW9wdHMpIGFuZCBub3QgaGFzYXR0cihlb3B0c1thcmdjXSwgJ2l0ZXJpdGVtcycpOgorICAgICAgICAgICAgICAgIGFyZ2MgKz0gMQorCisgICAgICAgICAgICBlbGVtYXJncyA9IGVvcHRzWzE6YXJnY10KKyAgICAgICAgICAgIGVsZW1rdyA9IGVvcHRzW2FyZ2NdIGlmIGFyZ2MgPCBsZW4oZW9wdHMpIGFuZCBlb3B0c1thcmdjXSBlbHNlIHt9CisgICAgICAgICAgICBzcGVjLCBvcHRzID0gX2Zvcm1hdF9lbGVtY3JlYXRlKGV0eXBlLCBUcnVlLCAqZWxlbWFyZ3MsICoqZWxlbWt3KQorCisgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCJ0dGs6OnN0eWxlIGVsZW1lbnQgY3JlYXRlICVzICVzICVzICVzIiAlICgKKyAgICAgICAgICAgICAgICBuYW1lLCBldHlwZSwgc3BlYywgb3B0cykpCisKKyAgICByZXR1cm4gJ1xuJy5qb2luKHNjcmlwdCkKKworZGVmIF9kaWN0X2Zyb21fdGNsdHVwbGUodHR1cGxlLCBjdXRfbWludXM9VHJ1ZSk6CisgICAgIiIiQnJlYWsgdHVwbGUgaW4gcGFpcnMsIGZvcm1hdCBpdCBwcm9wZXJseSwgdGhlbiBidWlsZCB0aGUgcmV0dXJuCisgICAgZGljdC4gSWYgY3V0X21pbnVzIGlzIFRydWUsIHRoZSBzdXBwb3NlZCAnLScgcHJlZml4aW5nIG9wdGlvbnMgd2lsbAorICAgIGJlIHJlbW92ZWQuCisKKyAgICB0dHVwbGUgaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBhbiBldmVuIG51bWJlciBvZiBlbGVtZW50cy4iIiIKKyAgICBvcHRfc3RhcnQgPSAxIGlmIGN1dF9taW51cyBlbHNlIDAKKworICAgIHJldGRpY3QgPSB7fQorICAgIGl0ID0gaXRlcih0dHVwbGUpCisgICAgZm9yIG9wdCwgdmFsIGluIHppcChpdCwgaXQpOgorICAgICAgICByZXRkaWN0W3N0cihvcHQpW29wdF9zdGFydDpdXSA9IHZhbAorCisgICAgcmV0dXJuIHRjbG9ianNfdG9fcHkocmV0ZGljdCkKKworZGVmIF9saXN0X2Zyb21fc3RhdGVzcGVjKHN0dXBsZSk6CisgICAgIiIiQ29uc3RydWN0IGEgbGlzdCBmcm9tIHRoZSBnaXZlbiBzdGF0ZXNwZWMgdHVwbGUgYWNjb3JkaW5nIHRvIHRoZQorICAgIGFjY2VwdGVkIHN0YXRlc3BlYyBhY2NlcHRlZCBieSBfZm9ybWF0X21hcGRpY3QuIiIiCisgICAgbnZhbCA9IFtdCisgICAgZm9yIHZhbCBpbiBzdHVwbGU6CisgICAgICAgIHR5cGVuYW1lID0gZ2V0YXR0cih2YWwsICd0eXBlbmFtZScsIE5vbmUpCisgICAgICAgIGlmIHR5cGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBudmFsLmFwcGVuZCh2YWwpCisgICAgICAgIGVsc2U6ICMgdGhpcyBpcyBhIFRjbCBvYmplY3QKKyAgICAgICAgICAgIHZhbCA9IHN0cih2YWwpCisgICAgICAgICAgICBpZiB0eXBlbmFtZSA9PSAnU3RhdGVTcGVjJzoKKyAgICAgICAgICAgICAgICB2YWwgPSB2YWwuc3BsaXQoKQorICAgICAgICAgICAgbnZhbC5hcHBlbmQodmFsKQorCisgICAgaXQgPSBpdGVyKG52YWwpCisgICAgcmV0dXJuIFtfZmxhdHRlbihzcGVjKSBmb3Igc3BlYyBpbiB6aXAoaXQsIGl0KV0KKworZGVmIF9saXN0X2Zyb21fbGF5b3V0dHVwbGUobHR1cGxlKToKKyAgICAiIiJDb25zdHJ1Y3QgYSBsaXN0IGZyb20gdGhlIHR1cGxlIHJldHVybmVkIGJ5IHR0azo6bGF5b3V0LCB0aGlzIGlzCisgICAgc29tZXdoYXQgdGhlIHJldmVyc2Ugb2YgX2Zvcm1hdF9sYXlvdXRsaXN0LiIiIgorICAgIHJlcyA9IFtdCisKKyAgICBpbmR4ID0gMAorICAgIHdoaWxlIGluZHggPCBsZW4obHR1cGxlKToKKyAgICAgICAgbmFtZSA9IGx0dXBsZVtpbmR4XQorICAgICAgICBvcHRzID0ge30KKyAgICAgICAgcmVzLmFwcGVuZCgobmFtZSwgb3B0cykpCisgICAgICAgIGluZHggKz0gMQorCisgICAgICAgIHdoaWxlIGluZHggPCBsZW4obHR1cGxlKTogIyBncmFiIG5hbWUncyBvcHRpb25zCisgICAgICAgICAgICBvcHQsIHZhbCA9IGx0dXBsZVtpbmR4OmluZHggKyAyXQorICAgICAgICAgICAgaWYgbm90IG9wdC5zdGFydHN3aXRoKCctJyk6ICMgZm91bmQgbmV4dCBuYW1lCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgb3B0ID0gb3B0WzE6XSAjIHJlbW92ZSB0aGUgJy0nIGZyb20gdGhlIG9wdGlvbgorICAgICAgICAgICAgaW5keCArPSAyCisKKyAgICAgICAgICAgIGlmIG9wdCA9PSAnY2hpbGRyZW4nOgorICAgICAgICAgICAgICAgIHZhbCA9IF9saXN0X2Zyb21fbGF5b3V0dHVwbGUodmFsKQorCisgICAgICAgICAgICBvcHRzW29wdF0gPSB2YWwKKworICAgIHJldHVybiByZXMKKworZGVmIF92YWxfb3JfZGljdChvcHRpb25zLCBmdW5jLCAqYXJncyk6CisgICAgIiIiRm9ybWF0IG9wdGlvbnMgdGhlbiBjYWxsIGZ1bmMgd2l0aCBhcmdzIGFuZCBvcHRpb25zIGFuZCByZXR1cm4KKyAgICB0aGUgYXBwcm9wcmlhdGUgcmVzdWx0LgorCisgICAgSWYgbm8gb3B0aW9uIGlzIHNwZWNpZmllZCwgYSBkaWN0IGlzIHJldHVybmVkLiBJZiBhIG9wdGlvbiBpcworICAgIHNwZWNpZmllZCB3aXRoIHRoZSBOb25lIHZhbHVlLCB0aGUgdmFsdWUgZm9yIHRoYXQgb3B0aW9uIGlzIHJldHVybmVkLgorICAgIE90aGVyd2lzZSwgdGhlIGZ1bmN0aW9uIGp1c3Qgc2V0cyB0aGUgcGFzc2VkIG9wdGlvbnMgYW5kIHRoZSBjYWxsZXIKKyAgICBzaG91bGRuJ3QgYmUgZXhwZWN0aW5nIGEgcmV0dXJuIHZhbHVlIGFueXdheS4iIiIKKyAgICBvcHRpb25zID0gX2Zvcm1hdF9vcHRkaWN0KG9wdGlvbnMpCisgICAgcmVzID0gZnVuYygqKGFyZ3MgKyBvcHRpb25zKSkKKworICAgIGlmIGxlbihvcHRpb25zKSAlIDI6ICMgb3B0aW9uIHNwZWNpZmllZCB3aXRob3V0IGEgdmFsdWUsIHJldHVybiBpdHMgdmFsdWUKKyAgICAgICAgcmV0dXJuIHJlcworCisgICAgcmV0dXJuIF9kaWN0X2Zyb21fdGNsdHVwbGUocmVzKQorCitkZWYgX2NvbnZlcnRfc3RyaW5ndmFsKHZhbHVlKToKKyAgICAiIiJDb252ZXJ0cyBhIHZhbHVlIHRvLCBob3BlZnVsbHksIGEgbW9yZSBhcHByb3ByaWF0ZSBQeXRob24gb2JqZWN0LiIiIgorICAgIHZhbHVlID0gdW5pY29kZSh2YWx1ZSkKKyAgICB0cnk6CisgICAgICAgIHZhbHVlID0gaW50KHZhbHVlKQorICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgcGFzcworCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiB0Y2xvYmpzX3RvX3B5KGFkaWN0KToKKyAgICAiIiJSZXR1cm5zIGFkaWN0IHdpdGggaXRzIHZhbHVlcyBjb252ZXJ0ZWQgZnJvbSBUY2wgb2JqZWN0cyB0byBQeXRob24KKyAgICBvYmplY3RzLiIiIgorICAgIGZvciBvcHQsIHZhbCBpbiBhZGljdC5pdGVyaXRlbXMoKToKKyAgICAgICAgaWYgdmFsIGFuZCBoYXNhdHRyKHZhbCwgJ19fbGVuX18nKSBhbmQgbm90IGlzaW5zdGFuY2UodmFsLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGlmIGdldGF0dHIodmFsWzBdLCAndHlwZW5hbWUnLCBOb25lKSA9PSAnU3RhdGVTcGVjJzoKKyAgICAgICAgICAgICAgICB2YWwgPSBfbGlzdF9mcm9tX3N0YXRlc3BlYyh2YWwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbCA9IG1hcChfY29udmVydF9zdHJpbmd2YWwsIHZhbCkKKworICAgICAgICBlbGlmIGhhc2F0dHIodmFsLCAndHlwZW5hbWUnKTogIyBzb21lIG90aGVyIChzaW5nbGUpIFRjbCBvYmplY3QKKyAgICAgICAgICAgIHZhbCA9IF9jb252ZXJ0X3N0cmluZ3ZhbCh2YWwpCisKKyAgICAgICAgYWRpY3Rbb3B0XSA9IHZhbAorCisgICAgcmV0dXJuIGFkaWN0CisKK2RlZiBzZXR1cF9tYXN0ZXIobWFzdGVyPU5vbmUpOgorICAgICIiIklmIG1hc3RlciBpcyBub3QgTm9uZSwgaXRzZWxmIGlzIHJldHVybmVkLiBJZiBtYXN0ZXIgaXMgTm9uZSwKKyAgICB0aGUgZGVmYXVsdCBtYXN0ZXIgaXMgcmV0dXJuZWQgaWYgdGhlcmUgaXMgb25lLCBvdGhlcndpc2UgYSBuZXcKKyAgICBtYXN0ZXIgaXMgY3JlYXRlZCBhbmQgcmV0dXJuZWQuCisKKyAgICBJZiBpdCBpcyBub3QgYWxsb3dlZCB0byB1c2UgdGhlIGRlZmF1bHQgcm9vdCBhbmQgbWFzdGVyIGlzIE5vbmUsCisgICAgUnVudGltZUVycm9yIGlzIHJhaXNlZC4iIiIKKyAgICBpZiBtYXN0ZXIgaXMgTm9uZToKKyAgICAgICAgaWYgVGtpbnRlci5fc3VwcG9ydF9kZWZhdWx0X3Jvb3Q6CisgICAgICAgICAgICBtYXN0ZXIgPSBUa2ludGVyLl9kZWZhdWx0X3Jvb3Qgb3IgVGtpbnRlci5UaygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJObyBtYXN0ZXIgc3BlY2lmaWVkIGFuZCBUa2ludGVyIGlzICIKKyAgICAgICAgICAgICAgICAgICAgImNvbmZpZ3VyZWQgdG8gbm90IHN1cHBvcnQgZGVmYXVsdCByb290IikKKyAgICByZXR1cm4gbWFzdGVyCisKKworY2xhc3MgU3R5bGUob2JqZWN0KToKKyAgICAiIiJNYW5pcHVsYXRlIHN0eWxlIGRhdGFiYXNlLiIiIgorCisgICAgX25hbWUgPSAidHRrOjpzdHlsZSIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6CisgICAgICAgIG1hc3RlciA9IHNldHVwX21hc3RlcihtYXN0ZXIpCisKKyAgICAgICAgaWYgbm90IGdldGF0dHIobWFzdGVyLCAnX3RpbGVfbG9hZGVkJywgRmFsc2UpOgorICAgICAgICAgICAgIyBMb2FkIHRpbGUgbm93LCBpZiBuZWVkZWQKKyAgICAgICAgICAgIF9sb2FkX3RpbGUobWFzdGVyKQorCisgICAgICAgIHNlbGYubWFzdGVyID0gbWFzdGVyCisgICAgICAgIHNlbGYudGsgPSBzZWxmLm1hc3Rlci50aworCisKKyAgICBkZWYgY29uZmlndXJlKHNlbGYsIHN0eWxlLCBxdWVyeV9vcHQ9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIlF1ZXJ5IG9yIHNldHMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBvcHRpb24ocykgaW4KKyAgICAgICAgc3R5bGUuCisKKyAgICAgICAgRWFjaCBrZXkgaW4ga3cgaXMgYW4gb3B0aW9uIGFuZCBlYWNoIHZhbHVlIGlzIGVpdGhlciBhIHN0cmluZyBvcgorICAgICAgICBhIHNlcXVlbmNlIGlkZW50aWZ5aW5nIHRoZSB2YWx1ZSBmb3IgdGhhdCBvcHRpb24uIiIiCisgICAgICAgIGlmIHF1ZXJ5X29wdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGt3W3F1ZXJ5X29wdF0gPSBOb25lCisgICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoa3csIHNlbGYudGsuY2FsbCwgc2VsZi5fbmFtZSwgImNvbmZpZ3VyZSIsIHN0eWxlKQorCisKKyAgICBkZWYgbWFwKHNlbGYsIHN0eWxlLCBxdWVyeV9vcHQ9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIlF1ZXJ5IG9yIHNldHMgZHluYW1pYyB2YWx1ZXMgb2YgdGhlIHNwZWNpZmllZCBvcHRpb24ocykgaW4KKyAgICAgICAgc3R5bGUuCisKKyAgICAgICAgRWFjaCBrZXkgaW4ga3cgaXMgYW4gb3B0aW9uIGFuZCBlYWNoIHZhbHVlIHNob3VsZCBiZSBhIGxpc3Qgb3IgYQorICAgICAgICB0dXBsZSAodXN1YWxseSkgY29udGFpbmluZyBzdGF0ZXNwZWNzIGdyb3VwZWQgaW4gdHVwbGVzLCBvciBsaXN0LAorICAgICAgICBvciBzb21ldGhpbmcgZWxzZSBvZiB5b3VyIHByZWZlcmVuY2UuIEEgc3RhdGVzcGVjIGlzIGNvbXBvdW5kIG9mCisgICAgICAgIG9uZSBvciBtb3JlIHN0YXRlcyBhbmQgdGhlbiBhIHZhbHVlLiIiIgorICAgICAgICBpZiBxdWVyeV9vcHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gX2xpc3RfZnJvbV9zdGF0ZXNwZWMoCisgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJtYXAiLCBzdHlsZSwgJy0lcycgJSBxdWVyeV9vcHQpKQorCisgICAgICAgIHJldHVybiBfZGljdF9mcm9tX3RjbHR1cGxlKAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJtYXAiLCBzdHlsZSwgKihfZm9ybWF0X21hcGRpY3Qoa3cpKSkpCisKKworICAgIGRlZiBsb29rdXAoc2VsZiwgc3R5bGUsIG9wdGlvbiwgc3RhdGU9Tm9uZSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgdmFsdWUgc3BlY2lmaWVkIGZvciBvcHRpb24gaW4gc3R5bGUuCisKKyAgICAgICAgSWYgc3RhdGUgaXMgc3BlY2lmaWVkIGl0IGlzIGV4cGVjdGVkIHRvIGJlIGEgc2VxdWVuY2Ugb2Ygb25lCisgICAgICAgIG9yIG1vcmUgc3RhdGVzLiBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudCBpcyBzZXQsIGl0IGlzIHVzZWQgYXMKKyAgICAgICAgYSBmYWxsYmFjayB2YWx1ZSBpbiBjYXNlIG5vIHNwZWNpZmljYXRpb24gZm9yIG9wdGlvbiBpcyBmb3VuZC4iIiIKKyAgICAgICAgc3RhdGUgPSAnICcuam9pbihzdGF0ZSkgaWYgc3RhdGUgZWxzZSAnJworCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImxvb2t1cCIsIHN0eWxlLCAnLSVzJyAlIG9wdGlvbiwKKyAgICAgICAgICAgIHN0YXRlLCBkZWZhdWx0KQorCisKKyAgICBkZWYgbGF5b3V0KHNlbGYsIHN0eWxlLCBsYXlvdXRzcGVjPU5vbmUpOgorICAgICAgICAiIiJEZWZpbmUgdGhlIHdpZGdldCBsYXlvdXQgZm9yIGdpdmVuIHN0eWxlLiBJZiBsYXlvdXRzcGVjIGlzCisgICAgICAgIG9taXR0ZWQsIHJldHVybiB0aGUgbGF5b3V0IHNwZWNpZmljYXRpb24gZm9yIGdpdmVuIHN0eWxlLgorCisgICAgICAgIGxheW91dHNwZWMgaXMgZXhwZWN0ZWQgdG8gYmUgYSBsaXN0IG9yIGFuIG9iamVjdCBkaWZmZXJlbnQgdGhhbgorICAgICAgICBOb25lIHRoYXQgZXZhbHVhdGVzIHRvIEZhbHNlIGlmIHlvdSB3YW50IHRvICJ0dXJuIG9mZiIgdGhhdCBzdHlsZS4KKyAgICAgICAgSWYgaXQgaXMgYSBsaXN0IChvciB0dXBsZSwgb3Igc29tZXRoaW5nIGVsc2UpLCBlYWNoIGl0ZW0gc2hvdWxkIGJlCisgICAgICAgIGEgdHVwbGUgd2hlcmUgdGhlIGZpcnN0IGl0ZW0gaXMgdGhlIGxheW91dCBuYW1lIGFuZCB0aGUgc2Vjb25kIGl0ZW0KKyAgICAgICAgc2hvdWxkIGhhdmUgdGhlIGZvcm1hdCBkZXNjcmliZWQgYmVsb3c6CisKKyAgICAgICAgTEFZT1VUUworCisgICAgICAgICAgICBBIGxheW91dCBjYW4gY29udGFpbiB0aGUgdmFsdWUgTm9uZSwgaWYgdGFrZXMgbm8gb3B0aW9ucywgb3IKKyAgICAgICAgICAgIGEgZGljdCBvZiBvcHRpb25zIHNwZWNpZnlpbmcgaG93IHRvIGFycmFuZ2UgdGhlIGVsZW1lbnQuCisgICAgICAgICAgICBUaGUgbGF5b3V0IG1lY2hhbmlzbSB1c2VzIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBwYWNrCisgICAgICAgICAgICBnZW9tZXRyeSBtYW5hZ2VyOiBnaXZlbiBhbiBpbml0aWFsIGNhdml0eSwgZWFjaCBlbGVtZW50IGlzCisgICAgICAgICAgICBhbGxvY2F0ZWQgYSBwYXJjZWwuIFZhbGlkIG9wdGlvbnMvdmFsdWVzIGFyZToKKworICAgICAgICAgICAgICAgIHNpZGU6IHdoaWNoc2lkZQorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgd2hpY2ggc2lkZSBvZiB0aGUgY2F2aXR5IHRvIHBsYWNlIHRoZQorICAgICAgICAgICAgICAgICAgICBlbGVtZW50OyBvbmUgb2YgdG9wLCByaWdodCwgYm90dG9tIG9yIGxlZnQuIElmCisgICAgICAgICAgICAgICAgICAgIG9taXR0ZWQsIHRoZSBlbGVtZW50IG9jY3VwaWVzIHRoZSBlbnRpcmUgY2F2aXR5LgorCisgICAgICAgICAgICAgICAgc3RpY2t5OiBuc3dlCisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGVyZSB0aGUgZWxlbWVudCBpcyBwbGFjZWQgaW5zaWRlIGl0cworICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgcGFyY2VsLgorCisgICAgICAgICAgICAgICAgY2hpbGRyZW46IFtzdWJsYXlvdXQuLi4gXQorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYSBsaXN0IG9mIGVsZW1lbnRzIHRvIHBsYWNlIGluc2lkZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gRWFjaCBlbGVtZW50IGlzIGEgdHVwbGUgKG9yIG90aGVyIHNlcXVlbmNlKQorICAgICAgICAgICAgICAgICAgICB3aGVyZSB0aGUgZmlyc3QgaXRlbSBpcyB0aGUgbGF5b3V0IG5hbWUsIGFuZCB0aGUgb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgaXMgYSBMQVlPVVQuIiIiCisgICAgICAgIGxzcGVjID0gTm9uZQorICAgICAgICBpZiBsYXlvdXRzcGVjOgorICAgICAgICAgICAgbHNwZWMgPSBfZm9ybWF0X2xheW91dGxpc3QobGF5b3V0c3BlYylbMF0KKyAgICAgICAgZWxpZiBsYXlvdXRzcGVjIGlzIG5vdCBOb25lOiAjIHdpbGwgZGlzYWJsZSB0aGUgbGF5b3V0ICh7fSwgJycsIGV0YykKKyAgICAgICAgICAgIGxzcGVjID0gIm51bGwiICMgY291bGQgYmUgYW55IG90aGVyIHdvcmQsIGJ1dCB0aGlzIG1heSBtYWtlIHNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdoZW4gY2FsbGluZyBsYXlvdXQoc3R5bGUpIGxhdGVyCisKKyAgICAgICAgcmV0dXJuIF9saXN0X2Zyb21fbGF5b3V0dHVwbGUoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImxheW91dCIsIHN0eWxlLCBsc3BlYykpCisKKworICAgIGRlZiBlbGVtZW50X2NyZWF0ZShzZWxmLCBlbGVtZW50bmFtZSwgZXR5cGUsICphcmdzLCAqKmt3KToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgdGhlbWUgb2YgZ2l2ZW4gZXR5cGUuIiIiCisgICAgICAgIHNwZWMsIG9wdHMgPSBfZm9ybWF0X2VsZW1jcmVhdGUoZXR5cGUsIEZhbHNlLCAqYXJncywgKiprdykKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgImNyZWF0ZSIsIGVsZW1lbnRuYW1lLCBldHlwZSwKKyAgICAgICAgICAgIHNwZWMsICpvcHRzKQorCisKKyAgICBkZWYgZWxlbWVudF9uYW1lcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbGlzdCBvZiBlbGVtZW50cyBkZWZpbmVkIGluIHRoZSBjdXJyZW50IHRoZW1lLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJlbGVtZW50IiwgIm5hbWVzIikKKworCisgICAgZGVmIGVsZW1lbnRfb3B0aW9ucyhzZWxmLCBlbGVtZW50bmFtZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgbGlzdCBvZiBlbGVtZW50bmFtZSdzIG9wdGlvbnMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImVsZW1lbnQiLCAib3B0aW9ucyIsIGVsZW1lbnRuYW1lKQorCisKKyAgICBkZWYgdGhlbWVfY3JlYXRlKHNlbGYsIHRoZW1lbmFtZSwgcGFyZW50PU5vbmUsIHNldHRpbmdzPU5vbmUpOgorICAgICAgICAiIiJDcmVhdGVzIGEgbmV3IHRoZW1lLgorCisgICAgICAgIEl0IGlzIGFuIGVycm9yIGlmIHRoZW1lbmFtZSBhbHJlYWR5IGV4aXN0cy4gSWYgcGFyZW50IGlzCisgICAgICAgIHNwZWNpZmllZCwgdGhlIG5ldyB0aGVtZSB3aWxsIGluaGVyaXQgc3R5bGVzLCBlbGVtZW50cyBhbmQKKyAgICAgICAgbGF5b3V0cyBmcm9tIHRoZSBzcGVjaWZpZWQgcGFyZW50IHRoZW1lLiBJZiBzZXR0aW5ncyBhcmUgcHJlc2VudCwKKyAgICAgICAgdGhleSBhcmUgZXhwZWN0ZWQgdG8gaGF2ZSB0aGUgc2FtZSBzeW50YXggdXNlZCBmb3IgdGhlbWVfc2V0dGluZ3MuIiIiCisgICAgICAgIHNjcmlwdCA9IF9zY3JpcHRfZnJvbV9zZXR0aW5ncyhzZXR0aW5ncykgaWYgc2V0dGluZ3MgZWxzZSAnJworCisgICAgICAgIGlmIHBhcmVudDoKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAidGhlbWUiLCAiY3JlYXRlIiwgdGhlbWVuYW1lLAorICAgICAgICAgICAgICAgICItcGFyZW50IiwgcGFyZW50LCAiLXNldHRpbmdzIiwgc2NyaXB0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJ0aGVtZSIsICJjcmVhdGUiLCB0aGVtZW5hbWUsCisgICAgICAgICAgICAgICAgIi1zZXR0aW5ncyIsIHNjcmlwdCkKKworCisgICAgZGVmIHRoZW1lX3NldHRpbmdzKHNlbGYsIHRoZW1lbmFtZSwgc2V0dGluZ3MpOgorICAgICAgICAiIiJUZW1wb3JhcmlseSBzZXRzIHRoZSBjdXJyZW50IHRoZW1lIHRvIHRoZW1lbmFtZSwgYXBwbHkgc3BlY2lmaWVkCisgICAgICAgIHNldHRpbmdzIGFuZCB0aGVuIHJlc3RvcmUgdGhlIHByZXZpb3VzIHRoZW1lLgorCisgICAgICAgIEVhY2gga2V5IGluIHNldHRpbmdzIGlzIGEgc3R5bGUgYW5kIGVhY2ggdmFsdWUgbWF5IGNvbnRhaW4gdGhlCisgICAgICAgIGtleXMgJ2NvbmZpZ3VyZScsICdtYXAnLCAnbGF5b3V0JyBhbmQgJ2VsZW1lbnQgY3JlYXRlJyBhbmQgdGhleQorICAgICAgICBhcmUgZXhwZWN0ZWQgdG8gaGF2ZSB0aGUgc2FtZSBmb3JtYXQgYXMgc3BlY2lmaWVkIGJ5IHRoZSBtZXRob2RzCisgICAgICAgIGNvbmZpZ3VyZSwgbWFwLCBsYXlvdXQgYW5kIGVsZW1lbnRfY3JlYXRlIHJlc3BlY3RpdmVseS4iIiIKKyAgICAgICAgc2NyaXB0ID0gX3NjcmlwdF9mcm9tX3NldHRpbmdzKHNldHRpbmdzKQorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgInRoZW1lIiwgInNldHRpbmdzIiwgdGhlbWVuYW1lLCBzY3JpcHQpCisKKworICAgIGRlZiB0aGVtZV9uYW1lcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBhIGxpc3Qgb2YgYWxsIGtub3duIHRoZW1lcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAidGhlbWUiLCAibmFtZXMiKQorCisKKyAgICBkZWYgdGhlbWVfdXNlKHNlbGYsIHRoZW1lbmFtZT1Ob25lKToKKyAgICAgICAgIiIiSWYgdGhlbWVuYW1lIGlzIE5vbmUsIHJldHVybnMgdGhlIHRoZW1lIGluIHVzZSwgb3RoZXJ3aXNlLCBzZXQKKyAgICAgICAgdGhlIGN1cnJlbnQgdGhlbWUgdG8gdGhlbWVuYW1lLCByZWZyZXNoZXMgYWxsIHdpZGdldHMgYW5kIGVtaXRzCisgICAgICAgIGEgPDxUaGVtZUNoYW5nZWQ+PiBldmVudC4iIiIKKyAgICAgICAgaWYgdGhlbWVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAjIFN0YXJ0aW5nIG9uIFRrIDguNiwgY2hlY2tpbmcgdGhpcyBnbG9iYWwgaXMgbm8gbG9uZ2VyIG5lZWRlZAorICAgICAgICAgICAgIyBzaW5jZSBpdCBhbGxvd3MgZG9pbmcgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJ0aGVtZSIsICJ1c2UiKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuZXZhbCgicmV0dXJuICR0dGs6OmN1cnJlbnRUaGVtZSIpCisKKyAgICAgICAgIyB1c2luZyAidHRrOjpzZXRUaGVtZSIgaW5zdGVhZCBvZiAidHRrOjpzdHlsZSB0aGVtZSB1c2UiIGNhdXNlcworICAgICAgICAjIHRoZSB2YXJpYWJsZSBjdXJyZW50VGhlbWUgdG8gYmUgdXBkYXRlZCwgYWxzbywgdHRrOjpzZXRUaGVtZSBjYWxscworICAgICAgICAjICJ0dGs6OnN0eWxlIHRoZW1lIHVzZSIgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZW1lLgorICAgICAgICBzZWxmLnRrLmNhbGwoInR0azo6c2V0VGhlbWUiLCB0aGVtZW5hbWUpCisKKworY2xhc3MgV2lkZ2V0KFRraW50ZXIuV2lkZ2V0KToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBUayB0aGVtZWQgd2lkZ2V0cy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHdpZGdldG5hbWUsIGt3PU5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3RzIGEgVHRrIFdpZGdldCB3aXRoIHRoZSBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGN1cnNvciwgdGFrZWZvY3VzLCBzdHlsZQorCisgICAgICAgIFNDUk9MTEFCTEUgV0lER0VUIE9QVElPTlMKKworICAgICAgICAgICAgeHNjcm9sbGNvbW1hbmQsIHlzY3JvbGxjb21tYW5kCisKKyAgICAgICAgTEFCRUwgV0lER0VUIE9QVElPTlMKKworICAgICAgICAgICAgdGV4dCwgdGV4dHZhcmlhYmxlLCB1bmRlcmxpbmUsIGltYWdlLCBjb21wb3VuZCwgd2lkdGgKKworICAgICAgICBXSURHRVQgU1RBVEVTCisKKyAgICAgICAgICAgIGFjdGl2ZSwgZGlzYWJsZWQsIGZvY3VzLCBwcmVzc2VkLCBzZWxlY3RlZCwgYmFja2dyb3VuZCwKKyAgICAgICAgICAgIHJlYWRvbmx5LCBhbHRlcm5hdGUsIGludmFsaWQKKyAgICAgICAgIiIiCisgICAgICAgIG1hc3RlciA9IHNldHVwX21hc3RlcihtYXN0ZXIpCisgICAgICAgIGlmIG5vdCBnZXRhdHRyKG1hc3RlciwgJ190aWxlX2xvYWRlZCcsIEZhbHNlKToKKyAgICAgICAgICAgICMgTG9hZCB0aWxlIG5vdywgaWYgbmVlZGVkCisgICAgICAgICAgICBfbG9hZF90aWxlKG1hc3RlcikKKyAgICAgICAgVGtpbnRlci5XaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCB3aWRnZXRuYW1lLCBrdz1rdykKKworCisgICAgZGVmIGlkZW50aWZ5KHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGF0IHBvc2l0aW9uIHgsIHksIG9yIHRoZSBlbXB0eQorICAgICAgICBzdHJpbmcgaWYgdGhlIHBvaW50IGRvZXMgbm90IGxpZSB3aXRoaW4gYW55IGVsZW1lbnQuCisKKyAgICAgICAgeCBhbmQgeSBhcmUgcGl4ZWwgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaWRlbnRpZnkiLCB4LCB5KQorCisKKyAgICBkZWYgaW5zdGF0ZShzZWxmLCBzdGF0ZXNwZWMsIGNhbGxiYWNrPU5vbmUsICphcmdzLCAqKmt3KToKKyAgICAgICAgIiIiVGVzdCB0aGUgd2lkZ2V0J3Mgc3RhdGUuCisKKyAgICAgICAgSWYgY2FsbGJhY2sgaXMgbm90IHNwZWNpZmllZCwgcmV0dXJucyBUcnVlIGlmIHRoZSB3aWRnZXQgc3RhdGUKKyAgICAgICAgbWF0Y2hlcyBzdGF0ZXNwZWMgYW5kIEZhbHNlIG90aGVyd2lzZS4gSWYgY2FsbGJhY2sgaXMgc3BlY2lmaWVkLAorICAgICAgICB0aGVuIGl0IHdpbGwgYmUgaW52b2tlZCB3aXRoICphcmdzLCAqKmt3IGlmIHRoZSB3aWRnZXQgc3RhdGUKKyAgICAgICAgbWF0Y2hlcyBzdGF0ZXNwZWMuIHN0YXRlc3BlYyBpcyBleHBlY3RlZCB0byBiZSBhIHNlcXVlbmNlLiIiIgorICAgICAgICByZXQgPSBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImluc3RhdGUiLCAnICcuam9pbihzdGF0ZXNwZWMpKQorICAgICAgICBpZiByZXQgYW5kIGNhbGxiYWNrOgorICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCphcmdzLCAqKmt3KQorCisgICAgICAgIHJldHVybiBib29sKHJldCkKKworCisgICAgZGVmIHN0YXRlKHNlbGYsIHN0YXRlc3BlYz1Ob25lKToKKyAgICAgICAgIiIiTW9kaWZ5IG9yIGlucXVpcmUgd2lkZ2V0IHN0YXRlLgorCisgICAgICAgIFdpZGdldCBzdGF0ZSBpcyByZXR1cm5lZCBpZiBzdGF0ZXNwZWMgaXMgTm9uZSwgb3RoZXJ3aXNlIGl0IGlzCisgICAgICAgIHNldCBhY2NvcmRpbmcgdG8gdGhlIHN0YXRlc3BlYyBmbGFncyBhbmQgdGhlbiBhIG5ldyBzdGF0ZSBzcGVjCisgICAgICAgIGlzIHJldHVybmVkIGluZGljYXRpbmcgd2hpY2ggZmxhZ3Mgd2VyZSBjaGFuZ2VkLiBzdGF0ZXNwZWMgaXMKKyAgICAgICAgZXhwZWN0ZWQgdG8gYmUgYSBzZXF1ZW5jZS4iIiIKKyAgICAgICAgaWYgc3RhdGVzcGVjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc3RhdGVzcGVjID0gJyAnLmpvaW4oc3RhdGVzcGVjKQorCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzdHIoc2VsZi50ay5jYWxsKHNlbGYuX3csICJzdGF0ZSIsIHN0YXRlc3BlYykpKQorCisKK2NsYXNzIEJ1dHRvbihXaWRnZXQpOgorICAgICIiIlR0ayBCdXR0b24gd2lkZ2V0LCBkaXNwbGF5cyBhIHRleHR1YWwgbGFiZWwgYW5kL29yIGltYWdlLCBhbmQKKyAgICBldmFsdWF0ZXMgYSBjb21tYW5kIHdoZW4gcHJlc3NlZC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFR0ayBCdXR0b24gd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBtYXN0ZXIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBjbGFzcywgY29tcG91bmQsIGN1cnNvciwgaW1hZ2UsIHN0YXRlLCBzdHlsZSwgdGFrZWZvY3VzLAorICAgICAgICAgICAgdGV4dCwgdGV4dHZhcmlhYmxlLCB1bmRlcmxpbmUsIHdpZHRoCisKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKworICAgICAgICAgICAgY29tbWFuZCwgZGVmYXVsdCwgd2lkdGgKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICJ0dGs6OmJ1dHRvbiIsIGt3KQorCisKKyAgICBkZWYgaW52b2tlKHNlbGYpOgorICAgICAgICAiIiJJbnZva2VzIHRoZSBjb21tYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnV0dG9uLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJpbnZva2UiKQorCisKK2NsYXNzIENoZWNrYnV0dG9uKFdpZGdldCk6CisgICAgIiIiVHRrIENoZWNrYnV0dG9uIHdpZGdldCB3aGljaCBpcyBlaXRoZXIgaW4gb24tIG9yIG9mZi1zdGF0ZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFR0ayBDaGVja2J1dHRvbiB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IG1hc3Rlci4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGNsYXNzLCBjb21wb3VuZCwgY3Vyc29yLCBpbWFnZSwgc3RhdGUsIHN0eWxlLCB0YWtlZm9jdXMsCisgICAgICAgICAgICB0ZXh0LCB0ZXh0dmFyaWFibGUsIHVuZGVybGluZSwgd2lkdGgKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBjb21tYW5kLCBvZmZ2YWx1ZSwgb252YWx1ZSwgdmFyaWFibGUKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICJ0dGs6OmNoZWNrYnV0dG9uIiwga3cpCisKKworICAgIGRlZiBpbnZva2Uoc2VsZik6CisgICAgICAgICIiIlRvZ2dsZXMgYmV0d2VlbiB0aGUgc2VsZWN0ZWQgYW5kIGRlc2VsZWN0ZWQgc3RhdGVzIGFuZAorICAgICAgICBpbnZva2VzIHRoZSBhc3NvY2lhdGVkIGNvbW1hbmQuIElmIHRoZSB3aWRnZXQgaXMgY3VycmVudGx5CisgICAgICAgIHNlbGVjdGVkLCBzZXRzIHRoZSBvcHRpb24gdmFyaWFibGUgdG8gdGhlIG9mZnZhbHVlIG9wdGlvbgorICAgICAgICBhbmQgZGVzZWxlY3RzIHRoZSB3aWRnZXQ7IG90aGVyd2lzZSwgc2V0cyB0aGUgb3B0aW9uIHZhcmlhYmxlCisgICAgICAgIHRvIHRoZSBvcHRpb24gb252YWx1ZS4KKworICAgICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGFzc29jaWF0ZWQgY29tbWFuZC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW52b2tlIikKKworCitjbGFzcyBFbnRyeShXaWRnZXQsIFRraW50ZXIuRW50cnkpOgorICAgICIiIlR0ayBFbnRyeSB3aWRnZXQgZGlzcGxheXMgYSBvbmUtbGluZSB0ZXh0IHN0cmluZyBhbmQgYWxsb3dzIHRoYXQKKyAgICBzdHJpbmcgdG8gYmUgZWRpdGVkIGJ5IHRoZSB1c2VyLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCB3aWRnZXQ9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdHMgYSBUdGsgRW50cnkgd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBtYXN0ZXIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBjbGFzcywgY3Vyc29yLCBzdHlsZSwgdGFrZWZvY3VzLCB4c2Nyb2xsY29tbWFuZAorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGV4cG9ydHNlbGVjdGlvbiwgaW52YWxpZGNvbW1hbmQsIGp1c3RpZnksIHNob3csIHN0YXRlLAorICAgICAgICAgICAgdGV4dHZhcmlhYmxlLCB2YWxpZGF0ZSwgdmFsaWRhdGVjb21tYW5kLCB3aWR0aAorCisgICAgICAgIFZBTElEQVRJT04gTU9ERVMKKworICAgICAgICAgICAgbm9uZSwga2V5LCBmb2N1cywgZm9jdXNpbiwgZm9jdXNvdXQsIGFsbAorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3Rlciwgd2lkZ2V0IG9yICJ0dGs6OmVudHJ5Iiwga3cpCisKKworICAgIGRlZiBiYm94KHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiUmV0dXJuIGEgdHVwbGUgb2YgKHgsIHksIHdpZHRoLCBoZWlnaHQpIHdoaWNoIGRlc2NyaWJlcyB0aGUKKyAgICAgICAgYm91bmRpbmcgYm94IG9mIHRoZSBjaGFyYWN0ZXIgZ2l2ZW4gYnkgaW5kZXguIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImJib3giLCBpbmRleCkKKworCisgICAgZGVmIGlkZW50aWZ5KHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGF0IHBvc2l0aW9uIHgsIHksIG9yIHRoZQorICAgICAgICBlbXB0eSBzdHJpbmcgaWYgdGhlIGNvb3JkaW5hdGVzIGFyZSBvdXRzaWRlIHRoZSB3aW5kb3cuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImlkZW50aWZ5IiwgeCwgeSkKKworCisgICAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgICAgICAiIiJGb3JjZSByZXZhbGlkYXRpb24sIGluZGVwZW5kZW50IG9mIHRoZSBjb25kaXRpb25zIHNwZWNpZmllZAorICAgICAgICBieSB0aGUgdmFsaWRhdGUgb3B0aW9uLiBSZXR1cm5zIEZhbHNlIGlmIHZhbGlkYXRpb24gZmFpbHMsIFRydWUKKyAgICAgICAgaWYgaXQgc3VjY2VlZHMuIFNldHMgb3IgY2xlYXJzIHRoZSBpbnZhbGlkIHN0YXRlIGFjY29yZGluZ2x5LiIiIgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLnRrLmNhbGwoc2VsZi5fdywgInZhbGlkYXRlIikpCisKKworY2xhc3MgQ29tYm9ib3goRW50cnkpOgorICAgICIiIlR0ayBDb21ib2JveCB3aWRnZXQgY29tYmluZXMgYSB0ZXh0IGZpZWxkIHdpdGggYSBwb3AtZG93biBsaXN0IG9mCisgICAgdmFsdWVzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIENvbWJvYm94IHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGN1cnNvciwgc3R5bGUsIHRha2Vmb2N1cworCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGV4cG9ydHNlbGVjdGlvbiwganVzdGlmeSwgaGVpZ2h0LCBwb3N0Y29tbWFuZCwgc3RhdGUsCisgICAgICAgICAgICB0ZXh0dmFyaWFibGUsIHZhbHVlcywgd2lkdGgKKyAgICAgICAgIiIiCisgICAgICAgIEVudHJ5Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6Y29tYm9ib3giLCAqKmt3KQorCisKKyAgICBkZWYgY3VycmVudChzZWxmLCBuZXdpbmRleD1Ob25lKToKKyAgICAgICAgIiIiSWYgbmV3aW5kZXggaXMgc3VwcGxpZWQsIHNldHMgdGhlIGNvbWJvYm94IHZhbHVlIHRvIHRoZQorICAgICAgICBlbGVtZW50IGF0IHBvc2l0aW9uIG5ld2luZGV4IGluIHRoZSBsaXN0IG9mIHZhbHVlcy4gT3RoZXJ3aXNlLAorICAgICAgICByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCB2YWx1ZSBpbiB0aGUgbGlzdCBvZiB2YWx1ZXMKKyAgICAgICAgb3IgLTEgaWYgdGhlIGN1cnJlbnQgdmFsdWUgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBsaXN0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJjdXJyZW50IiwgbmV3aW5kZXgpCisKKworICAgIGRlZiBzZXQoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiJTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29tYm9ib3ggdG8gdmFsdWUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAic2V0IiwgdmFsdWUpCisKKworY2xhc3MgRnJhbWUoV2lkZ2V0KToKKyAgICAiIiJUdGsgRnJhbWUgd2lkZ2V0IGlzIGEgY29udGFpbmVyLCB1c2VkIHRvIGdyb3VwIG90aGVyIHdpZGdldHMKKyAgICB0b2dldGhlci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFR0ayBGcmFtZSB3aXRoIHBhcmVudCBtYXN0ZXIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBjbGFzcywgY3Vyc29yLCBzdHlsZSwgdGFrZWZvY3VzCisKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKworICAgICAgICAgICAgYm9yZGVyd2lkdGgsIHJlbGllZiwgcGFkZGluZywgd2lkdGgsIGhlaWdodAorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6ZnJhbWUiLCBrdykKKworCitjbGFzcyBMYWJlbChXaWRnZXQpOgorICAgICIiIlR0ayBMYWJlbCB3aWRnZXQgZGlzcGxheXMgYSB0ZXh0dWFsIGxhYmVsIGFuZC9vciBpbWFnZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFR0ayBMYWJlbCB3aXRoIHBhcmVudCBtYXN0ZXIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBjbGFzcywgY29tcG91bmQsIGN1cnNvciwgaW1hZ2UsIHN0eWxlLCB0YWtlZm9jdXMsIHRleHQsCisgICAgICAgICAgICB0ZXh0dmFyaWFibGUsIHVuZGVybGluZSwgd2lkdGgKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBhbmNob3IsIGJhY2tncm91bmQsIGZvbnQsIGZvcmVncm91bmQsIGp1c3RpZnksIHBhZGRpbmcsCisgICAgICAgICAgICByZWxpZWYsIHRleHQsIHdyYXBsZW5ndGgKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICJ0dGs6OmxhYmVsIiwga3cpCisKKworY2xhc3MgTGFiZWxmcmFtZShXaWRnZXQpOgorICAgICIiIlR0ayBMYWJlbGZyYW1lIHdpZGdldCBpcyBhIGNvbnRhaW5lciB1c2VkIHRvIGdyb3VwIG90aGVyIHdpZGdldHMKKyAgICB0b2dldGhlci4gSXQgaGFzIGFuIG9wdGlvbmFsIGxhYmVsLCB3aGljaCBtYXkgYmUgYSBwbGFpbiB0ZXh0IHN0cmluZworICAgIG9yIGFub3RoZXIgd2lkZ2V0LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIExhYmVsZnJhbWUgd2l0aCBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGN1cnNvciwgc3R5bGUsIHRha2Vmb2N1cworCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisgICAgICAgICAgICBsYWJlbGFuY2hvciwgdGV4dCwgdW5kZXJsaW5lLCBwYWRkaW5nLCBsYWJlbHdpZGdldCwgd2lkdGgsCisgICAgICAgICAgICBoZWlnaHQKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICJ0dGs6OmxhYmVsZnJhbWUiLCBrdykKKworTGFiZWxGcmFtZSA9IExhYmVsZnJhbWUgIyBUa2ludGVyIG5hbWUgY29tcGF0aWJpbGl0eQorCisKK2NsYXNzIE1lbnVidXR0b24oV2lkZ2V0KToKKyAgICAiIiJUdGsgTWVudWJ1dHRvbiB3aWRnZXQgZGlzcGxheXMgYSB0ZXh0dWFsIGxhYmVsIGFuZC9vciBpbWFnZSwgYW5kCisgICAgZGlzcGxheXMgYSBtZW51IHdoZW4gcHJlc3NlZC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFR0ayBNZW51YnV0dG9uIHdpdGggcGFyZW50IG1hc3Rlci4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGNsYXNzLCBjb21wb3VuZCwgY3Vyc29yLCBpbWFnZSwgc3RhdGUsIHN0eWxlLCB0YWtlZm9jdXMsCisgICAgICAgICAgICB0ZXh0LCB0ZXh0dmFyaWFibGUsIHVuZGVybGluZSwgd2lkdGgKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBkaXJlY3Rpb24sIG1lbnUKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICJ0dGs6Om1lbnVidXR0b24iLCBrdykKKworCitjbGFzcyBOb3RlYm9vayhXaWRnZXQpOgorICAgICIiIlR0ayBOb3RlYm9vayB3aWRnZXQgbWFuYWdlcyBhIGNvbGxlY3Rpb24gb2Ygd2luZG93cyBhbmQgZGlzcGxheXMKKyAgICBhIHNpbmdsZSBvbmUgYXQgYSB0aW1lLiBFYWNoIGNoaWxkIHdpbmRvdyBpcyBhc3NvY2lhdGVkIHdpdGggYSB0YWIsCisgICAgd2hpY2ggdGhlIHVzZXIgbWF5IHNlbGVjdCB0byBjaGFuZ2UgdGhlIGN1cnJlbnRseS1kaXNwbGF5ZWQgd2luZG93LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIE5vdGVib29rIHdpdGggcGFyZW50IG1hc3Rlci4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGNsYXNzLCBjdXJzb3IsIHN0eWxlLCB0YWtlZm9jdXMKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBoZWlnaHQsIHBhZGRpbmcsIHdpZHRoCisKKyAgICAgICAgVEFCIE9QVElPTlMKKworICAgICAgICAgICAgc3RhdGUsIHN0aWNreSwgcGFkZGluZywgdGV4dCwgaW1hZ2UsIGNvbXBvdW5kLCB1bmRlcmxpbmUKKworICAgICAgICBUQUIgSURFTlRJRklFUlMgKHRhYl9pZCkKKworICAgICAgICAgICAgVGhlIHRhYl9pZCBhcmd1bWVudCBmb3VuZCBpbiBzZXZlcmFsIG1ldGhvZHMgbWF5IHRha2UgYW55IG9mCisgICAgICAgICAgICB0aGUgZm9sbG93aW5nIGZvcm1zOgorCisgICAgICAgICAgICAgICAgKiBBbiBpbnRlZ2VyIGJldHdlZW4gemVybyBhbmQgdGhlIG51bWJlciBvZiB0YWJzCisgICAgICAgICAgICAgICAgKiBUaGUgbmFtZSBvZiBhIGNoaWxkIHdpbmRvdworICAgICAgICAgICAgICAgICogQSBwb3NpdGlvbmFsIHNwZWNpZmljYXRpb24gb2YgdGhlIGZvcm0gIkB4LHkiLCB3aGljaAorICAgICAgICAgICAgICAgICAgZGVmaW5lcyB0aGUgdGFiCisgICAgICAgICAgICAgICAgKiBUaGUgc3RyaW5nICJjdXJyZW50Iiwgd2hpY2ggaWRlbnRpZmllcyB0aGUKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnRseS1zZWxlY3RlZCB0YWIKKyAgICAgICAgICAgICAgICAqIFRoZSBzdHJpbmcgImVuZCIsIHdoaWNoIHJldHVybnMgdGhlIG51bWJlciBvZiB0YWJzIChvbmx5CisgICAgICAgICAgICAgICAgICB2YWxpZCBmb3IgbWV0aG9kIGluZGV4KQorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6bm90ZWJvb2siLCBrdykKKworCisgICAgZGVmIGFkZChzZWxmLCBjaGlsZCwgKiprdyk6CisgICAgICAgICIiIkFkZHMgYSBuZXcgdGFiIHRvIHRoZSBub3RlYm9vay4KKworICAgICAgICBJZiB3aW5kb3cgaXMgY3VycmVudGx5IG1hbmFnZWQgYnkgdGhlIG5vdGVib29rIGJ1dCBoaWRkZW4sIGl0IGlzCisgICAgICAgIHJlc3RvcmVkIHRvIGl0cyBwcmV2aW91cyBwb3NpdGlvbi4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJhZGQiLCBjaGlsZCwgKihfZm9ybWF0X29wdGRpY3Qoa3cpKSkKKworCisgICAgZGVmIGZvcmdldChzZWxmLCB0YWJfaWQpOgorICAgICAgICAiIiJSZW1vdmVzIHRoZSB0YWIgc3BlY2lmaWVkIGJ5IHRhYl9pZCwgdW5tYXBzIGFuZCB1bm1hbmFnZXMgdGhlCisgICAgICAgIGFzc29jaWF0ZWQgd2luZG93LiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImZvcmdldCIsIHRhYl9pZCkKKworCisgICAgZGVmIGhpZGUoc2VsZiwgdGFiX2lkKToKKyAgICAgICAgIiIiSGlkZXMgdGhlIHRhYiBzcGVjaWZpZWQgYnkgdGFiX2lkLgorCisgICAgICAgIFRoZSB0YWIgd2lsbCBub3QgYmUgZGlzcGxheWVkLCBidXQgdGhlIGFzc29jaWF0ZWQgd2luZG93IHJlbWFpbnMKKyAgICAgICAgbWFuYWdlZCBieSB0aGUgbm90ZWJvb2sgYW5kIGl0cyBjb25maWd1cmF0aW9uIHJlbWVtYmVyZWQuIEhpZGRlbgorICAgICAgICB0YWJzIG1heSBiZSByZXN0b3JlZCB3aXRoIHRoZSBhZGQgY29tbWFuZC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJoaWRlIiwgdGFiX2lkKQorCisKKyAgICBkZWYgaWRlbnRpZnkoc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHRhYiBlbGVtZW50IGF0IHBvc2l0aW9uIHgsIHksIG9yIHRoZQorICAgICAgICBlbXB0eSBzdHJpbmcgaWYgbm9uZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaWRlbnRpZnkiLCB4LCB5KQorCisKKyAgICBkZWYgaW5kZXgoc2VsZiwgdGFiX2lkKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbnVtZXJpYyBpbmRleCBvZiB0aGUgdGFiIHNwZWNpZmllZCBieSB0YWJfaWQsIG9yCisgICAgICAgIHRoZSB0b3RhbCBudW1iZXIgb2YgdGFicyBpZiB0YWJfaWQgaXMgdGhlIHN0cmluZyAiZW5kIi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW5kZXgiLCB0YWJfaWQpCisKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgcG9zLCBjaGlsZCwgKiprdyk6CisgICAgICAgICIiIkluc2VydHMgYSBwYW5lIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCisKKyAgICAgICAgcG9zIGlzIGVpdGhlciB0aGUgc3RyaW5nIGVuZCwgYW4gaW50ZWdlciBpbmRleCwgb3IgdGhlIG5hbWUgb2YKKyAgICAgICAgYSBtYW5hZ2VkIGNoaWxkLiBJZiBjaGlsZCBpcyBhbHJlYWR5IG1hbmFnZWQgYnkgdGhlIG5vdGVib29rLAorICAgICAgICBtb3ZlcyBpdCB0byB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImluc2VydCIsIHBvcywgY2hpbGQsICooX2Zvcm1hdF9vcHRkaWN0KGt3KSkpCisKKworICAgIGRlZiBzZWxlY3Qoc2VsZiwgdGFiX2lkPU5vbmUpOgorICAgICAgICAiIiJTZWxlY3RzIHRoZSBzcGVjaWZpZWQgdGFiLgorCisgICAgICAgIFRoZSBhc3NvY2lhdGVkIGNoaWxkIHdpbmRvdyB3aWxsIGJlIGRpc3BsYXllZCwgYW5kIHRoZQorICAgICAgICBwcmV2aW91c2x5LXNlbGVjdGVkIHdpbmRvdyAoaWYgZGlmZmVyZW50KSBpcyB1bm1hcHBlZC4gSWYgdGFiX2lkCisgICAgICAgIGlzIG9taXR0ZWQsIHJldHVybnMgdGhlIHdpZGdldCBuYW1lIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgICAgcGFuZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAic2VsZWN0IiwgdGFiX2lkKQorCisKKyAgICBkZWYgdGFiKHNlbGYsIHRhYl9pZCwgb3B0aW9uPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJRdWVyeSBvciBtb2RpZnkgdGhlIG9wdGlvbnMgb2YgdGhlIHNwZWNpZmljIHRhYl9pZC4KKworICAgICAgICBJZiBrdyBpcyBub3QgZ2l2ZW4sIHJldHVybnMgYSBkaWN0IG9mIHRoZSB0YWIgb3B0aW9uIHZhbHVlcy4gSWYgb3B0aW9uCisgICAgICAgIGlzIHNwZWNpZmllZCwgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhhdCBvcHRpb24uIE90aGVyd2lzZSwgc2V0cyB0aGUKKyAgICAgICAgb3B0aW9ucyB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuIiIiCisgICAgICAgIGlmIG9wdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGt3W29wdGlvbl0gPSBOb25lCisgICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoa3csIHNlbGYudGsuY2FsbCwgc2VsZi5fdywgInRhYiIsIHRhYl9pZCkKKworCisgICAgZGVmIHRhYnMoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgYSBsaXN0IG9mIHdpbmRvd3MgbWFuYWdlZCBieSB0aGUgbm90ZWJvb2suIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInRhYnMiKSBvciAoKQorCisKKyAgICBkZWYgZW5hYmxlX3RyYXZlcnNhbChzZWxmKToKKyAgICAgICAgIiIiRW5hYmxlIGtleWJvYXJkIHRyYXZlcnNhbCBmb3IgYSB0b3BsZXZlbCB3aW5kb3cgY29udGFpbmluZworICAgICAgICB0aGlzIG5vdGVib29rLgorCisgICAgICAgIFRoaXMgd2lsbCBleHRlbmQgdGhlIGJpbmRpbmdzIGZvciB0aGUgdG9wbGV2ZWwgd2luZG93IGNvbnRhaW5pbmcKKyAgICAgICAgdGhpcyBub3RlYm9vayBhcyBmb2xsb3dzOgorCisgICAgICAgICAgICBDb250cm9sLVRhYjogc2VsZWN0cyB0aGUgdGFiIGZvbGxvd2luZyB0aGUgY3VycmVudGx5IHNlbGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgb25lCisKKyAgICAgICAgICAgIFNoaWZ0LUNvbnRyb2wtVGFiOiBzZWxlY3RzIHRoZSB0YWIgcHJlY2VkaW5nIHRoZSBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCBvbmUKKworICAgICAgICAgICAgQWx0LUs6IHdoZXJlIEsgaXMgdGhlIG1uZW1vbmljICh1bmRlcmxpbmVkKSBjaGFyYWN0ZXIgb2YgYW55CisgICAgICAgICAgICAgICAgICAgdGFiLCB3aWxsIHNlbGVjdCB0aGF0IHRhYi4KKworICAgICAgICBNdWx0aXBsZSBub3RlYm9va3MgaW4gYSBzaW5nbGUgdG9wbGV2ZWwgbWF5IGJlIGVuYWJsZWQgZm9yCisgICAgICAgIHRyYXZlcnNhbCwgaW5jbHVkaW5nIG5lc3RlZCBub3RlYm9va3MuIEhvd2V2ZXIsIG5vdGVib29rIHRyYXZlcnNhbAorICAgICAgICBvbmx5IHdvcmtzIHByb3Blcmx5IGlmIGFsbCBwYW5lcyBhcmUgZGlyZWN0IGNoaWxkcmVuIG9mIHRoZQorICAgICAgICBub3RlYm9vay4iIiIKKyAgICAgICAgIyBUaGUgb25seSwgYW5kIGdvb2QsIGRpZmZlcmVuY2UgSSBzZWUgaXMgYWJvdXQgbW5lbW9uaWNzLCB3aGljaCB3b3JrcworICAgICAgICAjIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuIENvbnRyb2wtVGFiIGFuZCBTaGlmdC1Db250cm9sLVRhYiBhbHdheXMKKyAgICAgICAgIyB3b3JrcyAoaGVyZSBhdCBsZWFzdCkuCisgICAgICAgIHNlbGYudGsuY2FsbCgidHRrOjpub3RlYm9vazo6ZW5hYmxlVHJhdmVyc2FsIiwgc2VsZi5fdykKKworCitjbGFzcyBQYW5lZHdpbmRvdyhXaWRnZXQsIFRraW50ZXIuUGFuZWRXaW5kb3cpOgorICAgICIiIlR0ayBQYW5lZHdpbmRvdyB3aWRnZXQgZGlzcGxheXMgYSBudW1iZXIgb2Ygc3Vid2luZG93cywgc3RhY2tlZAorICAgIGVpdGhlciB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFR0ayBQYW5lZHdpbmRvdyB3aXRoIHBhcmVudCBtYXN0ZXIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBjbGFzcywgY3Vyc29yLCBzdHlsZSwgdGFrZWZvY3VzCisKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKworICAgICAgICAgICAgb3JpZW50LCB3aWR0aCwgaGVpZ2h0CisKKyAgICAgICAgUEFORSBPUFRJT05TCisKKyAgICAgICAgICAgIHdlaWdodAorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6cGFuZWR3aW5kb3ciLCBrdykKKworCisgICAgZm9yZ2V0ID0gVGtpbnRlci5QYW5lZFdpbmRvdy5mb3JnZXQgIyBvdmVycmlkZXMgUGFjay5mb3JnZXQKKworCisgICAgZGVmIGluc2VydChzZWxmLCBwb3MsIGNoaWxkLCAqKmt3KToKKyAgICAgICAgIiIiSW5zZXJ0cyBhIHBhbmUgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbnMuCisKKyAgICAgICAgcG9zIGlzIGVpdGhlciB0aGUgc3RyaW5nIGVuZCwgYW5kIGludGVnZXIgaW5kZXgsIG9yIHRoZSBuYW1lCisgICAgICAgIG9mIGEgY2hpbGQuIElmIGNoaWxkIGlzIGFscmVhZHkgbWFuYWdlZCBieSB0aGUgcGFuZWQgd2luZG93LAorICAgICAgICBtb3ZlcyBpdCB0byB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImluc2VydCIsIHBvcywgY2hpbGQsICooX2Zvcm1hdF9vcHRkaWN0KGt3KSkpCisKKworICAgIGRlZiBwYW5lKHNlbGYsIHBhbmUsIG9wdGlvbj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiUXVlcnkgb3IgbW9kaWZ5IHRoZSBvcHRpb25zIG9mIHRoZSBzcGVjaWZpZWQgcGFuZS4KKworICAgICAgICBwYW5lIGlzIGVpdGhlciBhbiBpbnRlZ2VyIGluZGV4IG9yIHRoZSBuYW1lIG9mIGEgbWFuYWdlZCBzdWJ3aW5kb3cuCisgICAgICAgIElmIGt3IGlzIG5vdCBnaXZlbiwgcmV0dXJucyBhIGRpY3Qgb2YgdGhlIHBhbmUgb3B0aW9uIHZhbHVlcy4gSWYKKyAgICAgICAgb3B0aW9uIGlzIHNwZWNpZmllZCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhhdCBvcHRpb24gaXMgcmV0dXJuZWQuCisgICAgICAgIE90aGVyd2lzZSwgc2V0cyB0aGUgb3B0aW9ucyB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuIiIiCisgICAgICAgIGlmIG9wdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGt3W29wdGlvbl0gPSBOb25lCisgICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoa3csIHNlbGYudGsuY2FsbCwgc2VsZi5fdywgInBhbmUiLCBwYW5lKQorCisKKyAgICBkZWYgc2FzaHBvcyhzZWxmLCBpbmRleCwgbmV3cG9zPU5vbmUpOgorICAgICAgICAiIiJJZiBuZXdwb3MgaXMgc3BlY2lmaWVkLCBzZXRzIHRoZSBwb3NpdGlvbiBvZiBzYXNoIG51bWJlciBpbmRleC4KKworICAgICAgICBNYXkgYWRqdXN0IHRoZSBwb3NpdGlvbnMgb2YgYWRqYWNlbnQgc2FzaGVzIHRvIGVuc3VyZSB0aGF0CisgICAgICAgIHBvc2l0aW9ucyBhcmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLiBTYXNoIHBvc2l0aW9ucyBhcmUgZnVydGhlcgorICAgICAgICBjb25zdHJhaW5lZCB0byBiZSBiZXR3ZWVuIDAgYW5kIHRoZSB0b3RhbCBzaXplIG9mIHRoZSB3aWRnZXQuCisKKyAgICAgICAgUmV0dXJucyB0aGUgbmV3IHBvc2l0aW9uIG9mIHNhc2ggbnVtYmVyIGluZGV4LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJzYXNocG9zIiwgaW5kZXgsIG5ld3BvcykKKworUGFuZWRXaW5kb3cgPSBQYW5lZHdpbmRvdyAjIFRraW50ZXIgbmFtZSBjb21wYXRpYmlsaXR5CisKKworY2xhc3MgUHJvZ3Jlc3NiYXIoV2lkZ2V0KToKKyAgICAiIiJUdGsgUHJvZ3Jlc3NiYXIgd2lkZ2V0IHNob3dzIHRoZSBzdGF0dXMgb2YgYSBsb25nLXJ1bm5pbmcKKyAgICBvcGVyYXRpb24uIFRoZXkgY2FuIG9wZXJhdGUgaW4gdHdvIG1vZGVzOiBkZXRlcm1pbmF0ZSBtb2RlIHNob3dzIHRoZQorICAgIGFtb3VudCBjb21wbGV0ZWQgcmVsYXRpdmUgdG8gdGhlIHRvdGFsIGFtb3VudCBvZiB3b3JrIHRvIGJlIGRvbmUsIGFuZAorICAgIGluZGV0ZXJtaW5hdGUgbW9kZSBwcm92aWRlcyBhbiBhbmltYXRlZCBkaXNwbGF5IHRvIGxldCB0aGUgdXNlciBrbm93CisgICAgdGhhdCBzb21ldGhpbmcgaXMgaGFwcGVuaW5nLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIFByb2dyZXNzYmFyIHdpdGggcGFyZW50IG1hc3Rlci4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGNsYXNzLCBjdXJzb3IsIHN0eWxlLCB0YWtlZm9jdXMKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBvcmllbnQsIGxlbmd0aCwgbW9kZSwgbWF4aW11bSwgdmFsdWUsIHZhcmlhYmxlLCBwaGFzZQorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6cHJvZ3Jlc3NiYXIiLCBrdykKKworCisgICAgZGVmIHN0YXJ0KHNlbGYsIGludGVydmFsPU5vbmUpOgorICAgICAgICAiIiJCZWdpbiBhdXRvaW5jcmVtZW50IG1vZGU6IHNjaGVkdWxlcyBhIHJlY3VycmluZyB0aW1lciBldmVudAorICAgICAgICB0aGF0IGNhbGxzIG1ldGhvZCBzdGVwIGV2ZXJ5IGludGVydmFsIG1pbGxpc2Vjb25kcy4KKworICAgICAgICBpbnRlcnZhbCBkZWZhdWx0cyB0byA1MCBtaWxsaXNlY29uZHMgKDIwIHN0ZXBzL3NlY29uZCkgaWYgb21taXRlZC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJzdGFydCIsIGludGVydmFsKQorCisKKyAgICBkZWYgc3RlcChzZWxmLCBhbW91bnQ9Tm9uZSk6CisgICAgICAgICIiIkluY3JlbWVudHMgdGhlIHZhbHVlIG9wdGlvbiBieSBhbW91bnQuCisKKyAgICAgICAgYW1vdW50IGRlZmF1bHRzIHRvIDEuMCBpZiBvbWl0dGVkLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInN0ZXAiLCBhbW91bnQpCisKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICAiIiJTdG9wIGF1dG9pbmNyZW1lbnQgbW9kZTogY2FuY2VscyBhbnkgcmVjdXJyaW5nIHRpbWVyIGV2ZW50CisgICAgICAgIGluaXRpYXRlZCBieSBzdGFydC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJzdG9wIikKKworCitjbGFzcyBSYWRpb2J1dHRvbihXaWRnZXQpOgorICAgICIiIlR0ayBSYWRpb2J1dHRvbiB3aWRnZXRzIGFyZSB1c2VkIGluIGdyb3VwcyB0byBzaG93IG9yIGNoYW5nZSBhCisgICAgc2V0IG9mIG11dHVhbGx5LWV4Y2x1c2l2ZSBvcHRpb25zLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIFJhZGlvYnV0dG9uIHdpdGggcGFyZW50IG1hc3Rlci4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGNsYXNzLCBjb21wb3VuZCwgY3Vyc29yLCBpbWFnZSwgc3RhdGUsIHN0eWxlLCB0YWtlZm9jdXMsCisgICAgICAgICAgICB0ZXh0LCB0ZXh0dmFyaWFibGUsIHVuZGVybGluZSwgd2lkdGgKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBjb21tYW5kLCB2YWx1ZSwgdmFyaWFibGUKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICJ0dGs6OnJhZGlvYnV0dG9uIiwga3cpCisKKworICAgIGRlZiBpbnZva2Uoc2VsZik6CisgICAgICAgICIiIlNldHMgdGhlIG9wdGlvbiB2YXJpYWJsZSB0byB0aGUgb3B0aW9uIHZhbHVlLCBzZWxlY3RzIHRoZQorICAgICAgICB3aWRnZXQsIGFuZCBpbnZva2VzIHRoZSBhc3NvY2lhdGVkIGNvbW1hbmQuCisKKyAgICAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21tYW5kLCBvciBhbiBlbXB0eSBzdHJpbmcgaWYKKyAgICAgICAgbm8gY29tbWFuZCBpcyBzcGVjaWZpZWQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImludm9rZSIpCisKKworY2xhc3MgU2NhbGUoV2lkZ2V0LCBUa2ludGVyLlNjYWxlKToKKyAgICAiIiJUdGsgU2NhbGUgd2lkZ2V0IGlzIHR5cGljYWxseSB1c2VkIHRvIGNvbnRyb2wgdGhlIG51bWVyaWMgdmFsdWUgb2YKKyAgICBhIGxpbmtlZCB2YXJpYWJsZSB0aGF0IHZhcmllcyB1bmlmb3JtbHkgb3ZlciBzb21lIHJhbmdlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIFNjYWxlIHdpdGggcGFyZW50IG1hc3Rlci4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGNsYXNzLCBjdXJzb3IsIHN0eWxlLCB0YWtlZm9jdXMKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBjb21tYW5kLCBmcm9tLCBsZW5ndGgsIG9yaWVudCwgdG8sIHZhbHVlLCB2YXJpYWJsZQorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6c2NhbGUiLCBrdykKKworCisgICAgZGVmIGNvbmZpZ3VyZShzZWxmLCBjbmY9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIk1vZGlmeSBvciBxdWVyeSBzY2FsZSBvcHRpb25zLgorCisgICAgICAgIFNldHRpbmcgYSB2YWx1ZSBmb3IgYW55IG9mIHRoZSAiZnJvbSIsICJmcm9tXyIgb3IgInRvIiBvcHRpb25zCisgICAgICAgIGdlbmVyYXRlcyBhIDw8UmFuZ2VDaGFuZ2VkPj4gZXZlbnQuIiIiCisgICAgICAgIGlmIGNuZjoKKyAgICAgICAgICAgIGt3LnVwZGF0ZShjbmYpCisgICAgICAgIFdpZGdldC5jb25maWd1cmUoc2VsZiwgKiprdykKKyAgICAgICAgaWYgYW55KFsnZnJvbScgaW4ga3csICdmcm9tXycgaW4ga3csICd0bycgaW4ga3ddKToKKyAgICAgICAgICAgIHNlbGYuZXZlbnRfZ2VuZXJhdGUoJzw8UmFuZ2VDaGFuZ2VkPj4nKQorCisKKyAgICBkZWYgZ2V0KHNlbGYsIHg9Tm9uZSwgeT1Ob25lKToKKyAgICAgICAgIiIiR2V0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSB2YWx1ZSBvcHRpb24sIG9yIHRoZSB2YWx1ZQorICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb29yZGluYXRlcyB4LCB5IGlmIHRoZXkgYXJlIHNwZWNpZmllZC4KKworICAgICAgICB4IGFuZCB5IGFyZSBwaXhlbCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgc2NhbGUgd2lkZ2V0CisgICAgICAgIG9yaWdpbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZ2V0JywgeCwgeSkKKworCitjbGFzcyBTY3JvbGxiYXIoV2lkZ2V0LCBUa2ludGVyLlNjcm9sbGJhcik6CisgICAgIiIiVHRrIFNjcm9sbGJhciBjb250cm9scyB0aGUgdmlld3BvcnQgb2YgYSBzY3JvbGxhYmxlIHdpZGdldC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFR0ayBTY3JvbGxiYXIgd2l0aCBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGN1cnNvciwgc3R5bGUsIHRha2Vmb2N1cworCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGNvbW1hbmQsIG9yaWVudAorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6c2Nyb2xsYmFyIiwga3cpCisKKworY2xhc3MgU2VwYXJhdG9yKFdpZGdldCk6CisgICAgIiIiVHRrIFNlcGFyYXRvciB3aWRnZXQgZGlzcGxheXMgYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIHNlcGFyYXRvcgorICAgIGJhci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFR0ayBTZXBhcmF0b3Igd2l0aCBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGN1cnNvciwgc3R5bGUsIHRha2Vmb2N1cworCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIG9yaWVudAorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6c2VwYXJhdG9yIiwga3cpCisKKworY2xhc3MgU2l6ZWdyaXAoV2lkZ2V0KToKKyAgICAiIiJUdGsgU2l6ZWdyaXAgYWxsb3dzIHRoZSB1c2VyIHRvIHJlc2l6ZSB0aGUgY29udGFpbmluZyB0b3BsZXZlbAorICAgIHdpbmRvdyBieSBwcmVzc2luZyBhbmQgZHJhZ2dpbmcgdGhlIGdyaXAuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUdGsgU2l6ZWdyaXAgd2l0aCBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGN1cnNvciwgc3RhdGUsIHN0eWxlLCB0YWtlZm9jdXMKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICJ0dGs6OnNpemVncmlwIiwga3cpCisKKworY2xhc3MgVHJlZXZpZXcoV2lkZ2V0LCBUa2ludGVyLlhWaWV3LCBUa2ludGVyLllWaWV3KToKKyAgICAiIiJUdGsgVHJlZXZpZXcgd2lkZ2V0IGRpc3BsYXlzIGEgaGllcmFyY2hpY2FsIGNvbGxlY3Rpb24gb2YgaXRlbXMuCisKKyAgICBFYWNoIGl0ZW0gaGFzIGEgdGV4dHVhbCBsYWJlbCwgYW4gb3B0aW9uYWwgaW1hZ2UsIGFuZCBhbiBvcHRpb25hbCBsaXN0CisgICAgb2YgZGF0YSB2YWx1ZXMuIFRoZSBkYXRhIHZhbHVlcyBhcmUgZGlzcGxheWVkIGluIHN1Y2Nlc3NpdmUgY29sdW1ucworICAgIGFmdGVyIHRoZSB0cmVlIGxhYmVsLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIFRyZWV2aWV3IHdpdGggcGFyZW50IG1hc3Rlci4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGNsYXNzLCBjdXJzb3IsIHN0eWxlLCB0YWtlZm9jdXMsIHhzY3JvbGxjb21tYW5kLAorICAgICAgICAgICAgeXNjcm9sbGNvbW1hbmQKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBjb2x1bW5zLCBkaXNwbGF5Y29sdW1ucywgaGVpZ2h0LCBwYWRkaW5nLCBzZWxlY3Rtb2RlLCBzaG93CisKKyAgICAgICAgSVRFTSBPUFRJT05TCisKKyAgICAgICAgICAgIHRleHQsIGltYWdlLCB2YWx1ZXMsIG9wZW4sIHRhZ3MKKworICAgICAgICBUQUcgT1BUSU9OUworCisgICAgICAgICAgICBmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kLCBmb250LCBpbWFnZQorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6dHJlZXZpZXciLCBrdykKKworCisgICAgZGVmIGJib3goc2VsZiwgaXRlbSwgY29sdW1uPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBib3VuZGluZyBib3ggKHJlbGF0aXZlIHRvIHRoZSB0cmVldmlldyB3aWRnZXQncworICAgICAgICB3aW5kb3cpIG9mIHRoZSBzcGVjaWZpZWQgaXRlbSBpbiB0aGUgZm9ybSB4IHkgd2lkdGggaGVpZ2h0LgorCisgICAgICAgIElmIGNvbHVtbiBpcyBzcGVjaWZpZWQsIHJldHVybnMgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGF0IGNlbGwuCisgICAgICAgIElmIHRoZSBpdGVtIGlzIG5vdCB2aXNpYmxlIChpLmUuLCBpZiBpdCBpcyBhIGRlc2NlbmRhbnQgb2YgYQorICAgICAgICBjbG9zZWQgaXRlbSBvciBpcyBzY3JvbGxlZCBvZmZzY3JlZW4pLCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiYmJveCIsIGl0ZW0sIGNvbHVtbikKKworCisgICAgZGVmIGdldF9jaGlsZHJlbihzZWxmLCBpdGVtPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIGEgdHVwbGUgb2YgY2hpbGRyZW4gYmVsb25naW5nIHRvIGl0ZW0uCisKKyAgICAgICAgSWYgaXRlbSBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIHJvb3QgY2hpbGRyZW4uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImNoaWxkcmVuIiwgaXRlbSBvciAnJykgb3IgKCkKKworCisgICAgZGVmIHNldF9jaGlsZHJlbihzZWxmLCBpdGVtLCAqbmV3Y2hpbGRyZW4pOgorICAgICAgICAiIiJSZXBsYWNlcyBpdGVtJ3MgY2hpbGQgd2l0aCBuZXdjaGlsZHJlbi4KKworICAgICAgICBDaGlsZHJlbiBwcmVzZW50IGluIGl0ZW0gdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gbmV3Y2hpbGRyZW4KKyAgICAgICAgYXJlIGRldGFjaGVkIGZyb20gdHJlZS4gTm8gaXRlbXMgaW4gbmV3Y2hpbGRyZW4gbWF5IGJlIGFuCisgICAgICAgIGFuY2VzdG9yIG9mIGl0ZW0uIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAiY2hpbGRyZW4iLCBpdGVtLCBuZXdjaGlsZHJlbikKKworCisgICAgZGVmIGNvbHVtbihzZWxmLCBjb2x1bW4sIG9wdGlvbj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiUXVlcnkgb3IgbW9kaWZ5IHRoZSBvcHRpb25zIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KKworICAgICAgICBJZiBrdyBpcyBub3QgZ2l2ZW4sIHJldHVybnMgYSBkaWN0IG9mIHRoZSBjb2x1bW4gb3B0aW9uIHZhbHVlcy4gSWYKKyAgICAgICAgb3B0aW9uIGlzIHNwZWNpZmllZCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhhdCBvcHRpb24gaXMgcmV0dXJuZWQuCisgICAgICAgIE90aGVyd2lzZSwgc2V0cyB0aGUgb3B0aW9ucyB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuIiIiCisgICAgICAgIGlmIG9wdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGt3W29wdGlvbl0gPSBOb25lCisgICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoa3csIHNlbGYudGsuY2FsbCwgc2VsZi5fdywgImNvbHVtbiIsIGNvbHVtbikKKworCisgICAgZGVmIGRlbGV0ZShzZWxmLCAqaXRlbXMpOgorICAgICAgICAiIiJEZWxldGUgYWxsIHNwZWNpZmllZCBpdGVtcyBhbmQgYWxsIHRoZWlyIGRlc2NlbmRhbnRzLiBUaGUgcm9vdAorICAgICAgICBpdGVtIG1heSBub3QgYmUgZGVsZXRlZC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJkZWxldGUiLCBpdGVtcykKKworCisgICAgZGVmIGRldGFjaChzZWxmLCAqaXRlbXMpOgorICAgICAgICAiIiJVbmxpbmtzIGFsbCBvZiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHRyZWUuCisKKyAgICAgICAgVGhlIGl0ZW1zIGFuZCBhbGwgb2YgdGhlaXIgZGVzY2VuZGFudHMgYXJlIHN0aWxsIHByZXNlbnQsIGFuZCBtYXkKKyAgICAgICAgYmUgcmVpbnNlcnRlZCBhdCBhbm90aGVyIHBvaW50IGluIHRoZSB0cmVlLCBidXQgd2lsbCBub3QgYmUKKyAgICAgICAgZGlzcGxheWVkLiBUaGUgcm9vdCBpdGVtIG1heSBub3QgYmUgZGV0YWNoZWQuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAiZGV0YWNoIiwgaXRlbXMpCisKKworICAgIGRlZiBleGlzdHMoc2VsZiwgaXRlbSk6CisgICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGl0ZW0gaXMgcHJlc2VudCBpbiB0aGUgdHJlZSwKKyAgICAgICAgRmFsc2Ugb3RoZXJ3aXNlLiIiIgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLnRrLmNhbGwoc2VsZi5fdywgImV4aXN0cyIsIGl0ZW0pKQorCisKKyAgICBkZWYgZm9jdXMoc2VsZiwgaXRlbT1Ob25lKToKKyAgICAgICAgIiIiSWYgaXRlbSBpcyBzcGVjaWZpZWQsIHNldHMgdGhlIGZvY3VzIGl0ZW0gdG8gaXRlbS4gT3RoZXJ3aXNlLAorICAgICAgICByZXR1cm5zIHRoZSBjdXJyZW50IGZvY3VzIGl0ZW0sIG9yICcnIGlmIHRoZXJlIGlzIG5vbmUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImZvY3VzIiwgaXRlbSkKKworCisgICAgZGVmIGhlYWRpbmcoc2VsZiwgY29sdW1uLCBvcHRpb249Tm9uZSwgKiprdyk6CisgICAgICAgICIiIlF1ZXJ5IG9yIG1vZGlmeSB0aGUgaGVhZGluZyBvcHRpb25zIGZvciB0aGUgc3BlY2lmaWVkIGNvbHVtbi4KKworICAgICAgICBJZiBrdyBpcyBub3QgZ2l2ZW4sIHJldHVybnMgYSBkaWN0IG9mIHRoZSBoZWFkaW5nIG9wdGlvbiB2YWx1ZXMuIElmCisgICAgICAgIG9wdGlvbiBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgdmFsdWUgZm9yIHRoYXQgb3B0aW9uIGlzIHJldHVybmVkLgorICAgICAgICBPdGhlcndpc2UsIHNldHMgdGhlIG9wdGlvbnMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgorCisgICAgICAgIFZhbGlkIG9wdGlvbnMvdmFsdWVzIGFyZToKKyAgICAgICAgICAgIHRleHQ6IHRleHQKKyAgICAgICAgICAgICAgICBUaGUgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBjb2x1bW4gaGVhZGluZworICAgICAgICAgICAgaW1hZ2U6IGltYWdlX25hbWUKKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgYW4gaW1hZ2UgdG8gZGlzcGxheSB0byB0aGUgcmlnaHQgb2YgdGhlIGNvbHVtbgorICAgICAgICAgICAgICAgIGhlYWRpbmcKKyAgICAgICAgICAgIGFuY2hvcjogYW5jaG9yCisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGhvdyB0aGUgaGVhZGluZyB0ZXh0IHNob3VsZCBiZSBhbGlnbmVkLiBPbmUgb2YKKyAgICAgICAgICAgICAgICB0aGUgc3RhbmRhcmQgVGsgYW5jaG9yIHZhbHVlcworICAgICAgICAgICAgY29tbWFuZDogY2FsbGJhY2sKKyAgICAgICAgICAgICAgICBBIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgaGVhZGluZyBsYWJlbCBpcworICAgICAgICAgICAgICAgIHByZXNzZWQuCisKKyAgICAgICAgVG8gY29uZmlndXJlIHRoZSB0cmVlIGNvbHVtbiBoZWFkaW5nLCBjYWxsIHRoaXMgd2l0aCBjb2x1bW4gPSAiIzAiICIiIgorICAgICAgICBjbWQgPSBrdy5nZXQoJ2NvbW1hbmQnKQorICAgICAgICBpZiBjbWQgYW5kIG5vdCBpc2luc3RhbmNlKGNtZCwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAjIGNhbGxiYWNrIG5vdCByZWdpc3RlcmVkIHlldCwgZG8gaXQgbm93CisgICAgICAgICAgICBrd1snY29tbWFuZCddID0gc2VsZi5tYXN0ZXIucmVnaXN0ZXIoY21kLCBzZWxmLl9zdWJzdGl0dXRlKQorCisgICAgICAgIGlmIG9wdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGt3W29wdGlvbl0gPSBOb25lCisKKyAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChrdywgc2VsZi50ay5jYWxsLCBzZWxmLl93LCAnaGVhZGluZycsIGNvbHVtbikKKworCisgICAgZGVmIGlkZW50aWZ5KHNlbGYsIGNvbXBvbmVudCwgeCwgeSk6CisgICAgICAgICIiIlJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCB1bmRlciB0aGUKKyAgICAgICAgcG9pbnQgZ2l2ZW4gYnkgeCBhbmQgeSwgb3IgdGhlIGVtcHR5IHN0cmluZyBpZiBubyBzdWNoIGNvbXBvbmVudAorICAgICAgICBpcyBwcmVzZW50IGF0IHRoYXQgcG9zaXRpb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImlkZW50aWZ5IiwgY29tcG9uZW50LCB4LCB5KQorCisKKyAgICBkZWYgaWRlbnRpZnlfcm93KHNlbGYsIHkpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBpdGVtIElEIG9mIHRoZSBpdGVtIGF0IHBvc2l0aW9uIHkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmlkZW50aWZ5KCJyb3ciLCAwLCB5KQorCisKKyAgICBkZWYgaWRlbnRpZnlfY29sdW1uKHNlbGYsIHgpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBkYXRhIGNvbHVtbiBpZGVudGlmaWVyIG9mIHRoZSBjZWxsIGF0IHBvc2l0aW9uIHguCisKKyAgICAgICAgVGhlIHRyZWUgY29sdW1uIGhhcyBJRCAjMC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuaWRlbnRpZnkoImNvbHVtbiIsIHgsIDApCisKKworICAgIGRlZiBpZGVudGlmeV9yZWdpb24oc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlJldHVybnMgb25lIG9mOgorCisgICAgICAgIGhlYWRpbmc6IFRyZWUgaGVhZGluZyBhcmVhLgorICAgICAgICBzZXBhcmF0b3I6IFNwYWNlIGJldHdlZW4gdHdvIGNvbHVtbnMgaGVhZGluZ3M7CisgICAgICAgIHRyZWU6IFRoZSB0cmVlIGFyZWEuCisgICAgICAgIGNlbGw6IEEgZGF0YSBjZWxsLgorCisgICAgICAgICogQXZhaWxhYmlsaXR5OiBUayA4LjYiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuaWRlbnRpZnkoInJlZ2lvbiIsIHgsIHkpCisKKworICAgIGRlZiBpZGVudGlmeV9lbGVtZW50KHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBlbGVtZW50IGF0IHBvc2l0aW9uIHgsIHkuCisKKyAgICAgICAgKiBBdmFpbGFiaWxpdHk6IFRrIDguNiIiIgorICAgICAgICByZXR1cm4gc2VsZi5pZGVudGlmeSgiZWxlbWVudCIsIHgsIHkpCisKKworICAgIGRlZiBpbmRleChzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgaW50ZWdlciBpbmRleCBvZiBpdGVtIHdpdGhpbiBpdHMgcGFyZW50J3MgbGlzdAorICAgICAgICBvZiBjaGlsZHJlbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW5kZXgiLCBpdGVtKQorCisKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIHBhcmVudCwgaW5kZXgsIGlpZD1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ3JlYXRlcyBhIG5ldyBpdGVtIGFuZCByZXR1cm4gdGhlIGl0ZW0gaWRlbnRpZmllciBvZiB0aGUgbmV3bHkKKyAgICAgICAgY3JlYXRlZCBpdGVtLgorCisgICAgICAgIHBhcmVudCBpcyB0aGUgaXRlbSBJRCBvZiB0aGUgcGFyZW50IGl0ZW0sIG9yIHRoZSBlbXB0eSBzdHJpbmcKKyAgICAgICAgdG8gY3JlYXRlIGEgbmV3IHRvcC1sZXZlbCBpdGVtLiBpbmRleCBpcyBhbiBpbnRlZ2VyLCBvciB0aGUgdmFsdWUKKyAgICAgICAgZW5kLCBzcGVjaWZ5aW5nIHdoZXJlIGluIHRoZSBsaXN0IG9mIHBhcmVudCdzIGNoaWxkcmVuIHRvIGluc2VydAorICAgICAgICB0aGUgbmV3IGl0ZW0uIElmIGluZGV4IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCB0aGUgbmV3IG5vZGUKKyAgICAgICAgaXMgaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZywgaWYgaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCisgICAgICAgIHRoZSBjdXJyZW50IG51bWJlciBvZiBjaGlsZHJlbiwgaXQgaXMgaW5zZXJ0ZWQgYXQgdGhlIGVuZC4gSWYgaWlkCisgICAgICAgIGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBhcyB0aGUgaXRlbSBpZGVudGlmaWVyLCBpaWQgbXVzdCBub3QKKyAgICAgICAgYWxyZWFkeSBleGlzdCBpbiB0aGUgdHJlZS4gT3RoZXJ3aXNlLCBhIG5ldyB1bmlxdWUgaWRlbnRpZmllcgorICAgICAgICBpcyBnZW5lcmF0ZWQuIiIiCisgICAgICAgIG9wdHMgPSBfZm9ybWF0X29wdGRpY3Qoa3cpCisgICAgICAgIGlmIGlpZDoKKyAgICAgICAgICAgIHJlcyA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW5zZXJ0IiwgcGFyZW50LCBpbmRleCwKKyAgICAgICAgICAgICAgICAiLWlkIiwgaWlkLCAqb3B0cykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlcyA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW5zZXJ0IiwgcGFyZW50LCBpbmRleCwgKm9wdHMpCisKKyAgICAgICAgcmV0dXJuIHJlcworCisKKyAgICBkZWYgaXRlbShzZWxmLCBpdGVtLCBvcHRpb249Tm9uZSwgKiprdyk6CisgICAgICAgICIiIlF1ZXJ5IG9yIG1vZGlmeSB0aGUgb3B0aW9ucyBmb3IgdGhlIHNwZWNpZmllZCBpdGVtLgorCisgICAgICAgIElmIG5vIG9wdGlvbnMgYXJlIGdpdmVuLCBhIGRpY3Qgd2l0aCBvcHRpb25zL3ZhbHVlcyBmb3IgdGhlIGl0ZW0KKyAgICAgICAgaXMgcmV0dXJuZWQuIElmIG9wdGlvbiBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgdmFsdWUgZm9yIHRoYXQgb3B0aW9uCisgICAgICAgIGlzIHJldHVybmVkLiBPdGhlcndpc2UsIHNldHMgdGhlIG9wdGlvbnMgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgdmFsdWVzIGFzIGdpdmVuIGJ5IGt3LiIiIgorICAgICAgICBpZiBvcHRpb24gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBrd1tvcHRpb25dID0gTm9uZQorICAgICAgICByZXR1cm4gX3ZhbF9vcl9kaWN0KGt3LCBzZWxmLnRrLmNhbGwsIHNlbGYuX3csICJpdGVtIiwgaXRlbSkKKworCisgICAgZGVmIG1vdmUoc2VsZiwgaXRlbSwgcGFyZW50LCBpbmRleCk6CisgICAgICAgICIiIk1vdmVzIGl0ZW0gdG8gcG9zaXRpb24gaW5kZXggaW4gcGFyZW50J3MgbGlzdCBvZiBjaGlsZHJlbi4KKworICAgICAgICBJdCBpcyBpbGxlZ2FsIHRvIG1vdmUgYW4gaXRlbSB1bmRlciBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzLiBJZgorICAgICAgICBpbmRleCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gemVybywgaXRlbSBpcyBtb3ZlZCB0byB0aGUKKyAgICAgICAgYmVnaW5uaW5nLCBpZiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBjaGlsZHJlbiwKKyAgICAgICAgaXQgaXMgbW92ZWQgdG8gdGhlIGVuZC4gSWYgaXRlbSB3YXMgZGV0YWNoZWQgaXQgaXMgcmVhdHRhY2hlZC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJtb3ZlIiwgaXRlbSwgcGFyZW50LCBpbmRleCkKKworICAgIHJlYXR0YWNoID0gbW92ZSAjIEEgc2Vuc2libGUgbWV0aG9kIG5hbWUgZm9yIHJlYXR0YWNoaW5nIGRldGFjaGVkIGl0ZW1zCisKKworICAgIGRlZiBuZXh0KHNlbGYsIGl0ZW0pOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIGl0ZW0ncyBuZXh0IHNpYmxpbmcsIG9yICcnIGlmIGl0ZW0KKyAgICAgICAgaXMgdGhlIGxhc3QgY2hpbGQgb2YgaXRzIHBhcmVudC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAibmV4dCIsIGl0ZW0pCisKKworICAgIGRlZiBwYXJlbnQoc2VsZiwgaXRlbSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIElEIG9mIHRoZSBwYXJlbnQgb2YgaXRlbSwgb3IgJycgaWYgaXRlbSBpcyBhdCB0aGUKKyAgICAgICAgdG9wIGxldmVsIG9mIHRoZSBoaWVyYXJjaHkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInBhcmVudCIsIGl0ZW0pCisKKworICAgIGRlZiBwcmV2KHNlbGYsIGl0ZW0pOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBpZGVudGlmaWVyIG9mIGl0ZW0ncyBwcmV2aW91cyBzaWJsaW5nLCBvciAnJyBpZgorICAgICAgICBpdGVtIGlzIHRoZSBmaXJzdCBjaGlsZCBvZiBpdHMgcGFyZW50LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJwcmV2IiwgaXRlbSkKKworCisgICAgZGVmIHNlZShzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiRW5zdXJlIHRoYXQgaXRlbSBpcyB2aXNpYmxlLgorCisgICAgICAgIFNldHMgYWxsIG9mIGl0ZW0ncyBhbmNlc3RvcnMgb3BlbiBvcHRpb24gdG8gVHJ1ZSwgYW5kIHNjcm9sbHMKKyAgICAgICAgdGhlIHdpZGdldCBpZiBuZWNlc3Nhcnkgc28gdGhhdCBpdGVtIGlzIHdpdGhpbiB0aGUgdmlzaWJsZQorICAgICAgICBwb3J0aW9uIG9mIHRoZSB0cmVlLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInNlZSIsIGl0ZW0pCisKKworICAgIGRlZiBzZWxlY3Rpb24oc2VsZiwgc2Vsb3A9Tm9uZSwgaXRlbXM9Tm9uZSk6CisgICAgICAgICIiIklmIHNlbG9wIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgc2VsZWN0ZWQgaXRlbXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInNlbGVjdGlvbiIsIHNlbG9wLCBpdGVtcykKKworCisgICAgZGVmIHNlbGVjdGlvbl9zZXQoc2VsZiwgaXRlbXMpOgorICAgICAgICAiIiJpdGVtcyBiZWNvbWVzIHRoZSBuZXcgc2VsZWN0aW9uLiIiIgorICAgICAgICBzZWxmLnNlbGVjdGlvbigic2V0IiwgaXRlbXMpCisKKworICAgIGRlZiBzZWxlY3Rpb25fYWRkKHNlbGYsIGl0ZW1zKToKKyAgICAgICAgIiIiQWRkIGl0ZW1zIHRvIHRoZSBzZWxlY3Rpb24uIiIiCisgICAgICAgIHNlbGYuc2VsZWN0aW9uKCJhZGQiLCBpdGVtcykKKworCisgICAgZGVmIHNlbGVjdGlvbl9yZW1vdmUoc2VsZiwgaXRlbXMpOgorICAgICAgICAiIiJSZW1vdmUgaXRlbXMgZnJvbSB0aGUgc2VsZWN0aW9uLiIiIgorICAgICAgICBzZWxmLnNlbGVjdGlvbigicmVtb3ZlIiwgaXRlbXMpCisKKworICAgIGRlZiBzZWxlY3Rpb25fdG9nZ2xlKHNlbGYsIGl0ZW1zKToKKyAgICAgICAgIiIiVG9nZ2xlIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgZWFjaCBpdGVtIGluIGl0ZW1zLiIiIgorICAgICAgICBzZWxmLnNlbGVjdGlvbigidG9nZ2xlIiwgaXRlbXMpCisKKworICAgIGRlZiBzZXQoc2VsZiwgaXRlbSwgY29sdW1uPU5vbmUsIHZhbHVlPU5vbmUpOgorICAgICAgICAiIiJXaXRoIG9uZSBhcmd1bWVudCwgcmV0dXJucyBhIGRpY3Rpb25hcnkgb2YgY29sdW1uL3ZhbHVlIHBhaXJzCisgICAgICAgIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0uIFdpdGggdHdvIGFyZ3VtZW50cywgcmV0dXJucyB0aGUgY3VycmVudAorICAgICAgICB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbHVtbi4gV2l0aCB0aHJlZSBhcmd1bWVudHMsIHNldHMgdGhlCisgICAgICAgIHZhbHVlIG9mIGdpdmVuIGNvbHVtbiBpbiBnaXZlbiBpdGVtIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIiIiCisgICAgICAgIHJlcyA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAic2V0IiwgaXRlbSwgY29sdW1uLCB2YWx1ZSkKKyAgICAgICAgaWYgY29sdW1uIGlzIE5vbmUgYW5kIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gX2RpY3RfZnJvbV90Y2x0dXBsZShyZXMsIEZhbHNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHJlcworCisKKyAgICBkZWYgdGFnX2JpbmQoc2VsZiwgdGFnbmFtZSwgc2VxdWVuY2U9Tm9uZSwgY2FsbGJhY2s9Tm9uZSk6CisgICAgICAgICIiIkJpbmQgYSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIGV2ZW50IHNlcXVlbmNlIHRvIHRoZSB0YWcgdGFnbmFtZS4KKyAgICAgICAgV2hlbiBhbiBldmVudCBpcyBkZWxpdmVyZWQgdG8gYW4gaXRlbSwgdGhlIGNhbGxiYWNrcyBmb3IgZWFjaAorICAgICAgICBvZiB0aGUgaXRlbSdzIHRhZ3Mgb3B0aW9uIGFyZSBjYWxsZWQuIiIiCisgICAgICAgIHNlbGYuX2JpbmQoKHNlbGYuX3csICJ0YWciLCAiYmluZCIsIHRhZ25hbWUpLCBzZXF1ZW5jZSwgY2FsbGJhY2ssIGFkZD0wKQorCisKKyAgICBkZWYgdGFnX2NvbmZpZ3VyZShzZWxmLCB0YWduYW1lLCBvcHRpb249Tm9uZSwgKiprdyk6CisgICAgICAgICIiIlF1ZXJ5IG9yIG1vZGlmeSB0aGUgb3B0aW9ucyBmb3IgdGhlIHNwZWNpZmllZCB0YWduYW1lLgorCisgICAgICAgIElmIGt3IGlzIG5vdCBnaXZlbiwgcmV0dXJucyBhIGRpY3Qgb2YgdGhlIG9wdGlvbiBzZXR0aW5ncyBmb3IgdGFnbmFtZS4KKyAgICAgICAgSWYgb3B0aW9uIGlzIHNwZWNpZmllZCwgcmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoYXQgb3B0aW9uIGZvciB0aGUKKyAgICAgICAgc3BlY2lmaWVkIHRhZ25hbWUuIE90aGVyd2lzZSwgc2V0cyB0aGUgb3B0aW9ucyB0byB0aGUgY29ycmVzcG9uZGluZworICAgICAgICB2YWx1ZXMgZm9yIHRoZSBnaXZlbiB0YWduYW1lLiIiIgorICAgICAgICBpZiBvcHRpb24gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBrd1tvcHRpb25dID0gTm9uZQorICAgICAgICByZXR1cm4gX3ZhbF9vcl9kaWN0KGt3LCBzZWxmLnRrLmNhbGwsIHNlbGYuX3csICJ0YWciLCAiY29uZmlndXJlIiwKKyAgICAgICAgICAgIHRhZ25hbWUpCisKKworICAgIGRlZiB0YWdfaGFzKHNlbGYsIHRhZ25hbWUsIGl0ZW09Tm9uZSk6CisgICAgICAgICIiIklmIGl0ZW0gaXMgc3BlY2lmaWVkLCByZXR1cm5zIDEgb3IgMCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUKKyAgICAgICAgc3BlY2lmaWVkIGl0ZW0gaGFzIHRoZSBnaXZlbiB0YWduYW1lLiBPdGhlcndpc2UsIHJldHVybnMgYSBsaXN0IG9mCisgICAgICAgIGFsbCBpdGVtcyB3aGljaCBoYXZlIHRoZSBzcGVjaWZpZWQgdGFnLgorCisgICAgICAgICogQXZhaWxhYmlsaXR5OiBUayA4LjYiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAidGFnIiwgImhhcyIsIHRhZ25hbWUsIGl0ZW0pCisKKworIyBFeHRlbnNpb25zCisKK2NsYXNzIExhYmVsZWRTY2FsZShGcmFtZSwgb2JqZWN0KToKKyAgICAiIiJBIFR0ayBTY2FsZSB3aWRnZXQgd2l0aCBhIFR0ayBMYWJlbCB3aWRnZXQgaW5kaWNhdGluZyBpdHMKKyAgICBjdXJyZW50IHZhbHVlLgorCisgICAgVGhlIFR0ayBTY2FsZSBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCBpbnN0YW5jZS5zY2FsZSwgYW5kIFR0ayBMYWJlbAorICAgIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIGluc3RhbmNlLmxhYmVsIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHZhcmlhYmxlPU5vbmUsIGZyb21fPTAsIHRvPTEwLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGFuIGhvcml6b250YWwgTGFiZWxlZFNjYWxlIHdpdGggcGFyZW50IG1hc3RlciwgYQorICAgICAgICB2YXJpYWJsZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIFR0ayBTY2FsZSB3aWRnZXQgYW5kIGl0cyByYW5nZS4KKyAgICAgICAgSWYgdmFyaWFibGUgaXMgbm90IHNwZWNpZmllZCwgYSBUa2ludGVyLkludFZhciBpcyBjcmVhdGVkLgorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGNvbXBvdW5kOiAndG9wJyBvciAnYm90dG9tJworICAgICAgICAgICAgICAgIFNwZWNpZmllcyBob3cgdG8gZGlzcGxheSB0aGUgbGFiZWwgcmVsYXRpdmUgdG8gdGhlIHNjYWxlLgorICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvICd0b3AnLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fbGFiZWxfdG9wID0ga3cucG9wKCdjb21wb3VuZCcsICd0b3AnKSA9PSAndG9wJworCisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgKiprdykKKyAgICAgICAgc2VsZi5fdmFyaWFibGUgPSB2YXJpYWJsZSBvciBUa2ludGVyLkludFZhcihtYXN0ZXIpCisgICAgICAgIHNlbGYuX3ZhcmlhYmxlLnNldChmcm9tXykKKyAgICAgICAgc2VsZi5fbGFzdF92YWxpZCA9IGZyb21fCisKKyAgICAgICAgc2VsZi5sYWJlbCA9IExhYmVsKHNlbGYpCisgICAgICAgIHNlbGYuc2NhbGUgPSBTY2FsZShzZWxmLCB2YXJpYWJsZT1zZWxmLl92YXJpYWJsZSwgZnJvbV89ZnJvbV8sIHRvPXRvKQorICAgICAgICBzZWxmLnNjYWxlLmJpbmQoJzw8UmFuZ2VDaGFuZ2VkPj4nLCBzZWxmLl9hZGp1c3QpCisKKyAgICAgICAgIyBwb3NpdGlvbiBzY2FsZSBhbmQgbGFiZWwgYWNjb3JkaW5nIHRvIHRoZSBjb21wb3VuZCBvcHRpb24KKyAgICAgICAgc2NhbGVfc2lkZSA9ICdib3R0b20nIGlmIHNlbGYuX2xhYmVsX3RvcCBlbHNlICd0b3AnCisgICAgICAgIGxhYmVsX3NpZGUgPSAndG9wJyBpZiBzY2FsZV9zaWRlID09ICdib3R0b20nIGVsc2UgJ2JvdHRvbScKKyAgICAgICAgc2VsZi5zY2FsZS5wYWNrKHNpZGU9c2NhbGVfc2lkZSwgZmlsbD0neCcpCisgICAgICAgIHRtcCA9IExhYmVsKHNlbGYpLnBhY2soc2lkZT1sYWJlbF9zaWRlKSAjIHBsYWNlIGhvbGRlcgorICAgICAgICBzZWxmLmxhYmVsLnBsYWNlKGFuY2hvcj0nbicgaWYgbGFiZWxfc2lkZSA9PSAndG9wJyBlbHNlICdzJykKKworICAgICAgICAjIHVwZGF0ZSB0aGUgbGFiZWwgYXMgc2NhbGUgb3IgdmFyaWFibGUgY2hhbmdlcworICAgICAgICBzZWxmLl9fdHJhY2VjYiA9IHNlbGYuX3ZhcmlhYmxlLnRyYWNlX3ZhcmlhYmxlKCd3Jywgc2VsZi5fYWRqdXN0KQorICAgICAgICBzZWxmLmJpbmQoJzxDb25maWd1cmU+Jywgc2VsZi5fYWRqdXN0KQorICAgICAgICBzZWxmLmJpbmQoJzxNYXA+Jywgc2VsZi5fYWRqdXN0KQorCisKKyAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgIiIiRGVzdHJveSB0aGlzIHdpZGdldCBhbmQgcG9zc2libHkgaXRzIGFzc29jaWF0ZWQgdmFyaWFibGUuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3ZhcmlhYmxlLnRyYWNlX3ZkZWxldGUoJ3cnLCBzZWxmLl9fdHJhY2VjYikKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgIyB3aWRnZXQgaGFzIGJlZW4gZGVzdHJveWVkIGFscmVhZHkKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlbCBzZWxmLl92YXJpYWJsZQorICAgICAgICAgICAgRnJhbWUuZGVzdHJveShzZWxmKQorCisKKyAgICBkZWYgX2FkanVzdChzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkFkanVzdCB0aGUgbGFiZWwgcG9zaXRpb24gYWNjb3JkaW5nIHRvIHRoZSBzY2FsZS4iIiIKKyAgICAgICAgZGVmIGFkanVzdF9sYWJlbCgpOgorICAgICAgICAgICAgc2VsZi51cGRhdGVfaWRsZXRhc2tzKCkgIyAiZm9yY2UiIHNjYWxlIHJlZHJhdworCisgICAgICAgICAgICB4LCB5ID0gc2VsZi5zY2FsZS5jb29yZHMoKQorICAgICAgICAgICAgaWYgc2VsZi5fbGFiZWxfdG9wOgorICAgICAgICAgICAgICAgIHkgPSBzZWxmLnNjYWxlLndpbmZvX3koKSAtIHNlbGYubGFiZWwud2luZm9fcmVxaGVpZ2h0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeSA9IHNlbGYuc2NhbGUud2luZm9fcmVxaGVpZ2h0KCkgKyBzZWxmLmxhYmVsLndpbmZvX3JlcWhlaWdodCgpCisKKyAgICAgICAgICAgIHNlbGYubGFiZWwucGxhY2VfY29uZmlndXJlKHg9eCwgeT15KQorCisgICAgICAgIGZyb21fLCB0byA9IHNlbGYuc2NhbGVbJ2Zyb20nXSwgc2VsZi5zY2FsZVsndG8nXQorICAgICAgICBpZiB0byA8IGZyb21fOgorICAgICAgICAgICAgZnJvbV8sIHRvID0gdG8sIGZyb21fCisgICAgICAgIG5ld3ZhbCA9IHNlbGYuX3ZhcmlhYmxlLmdldCgpCisgICAgICAgIGlmIG5vdCBmcm9tXyA8PSBuZXd2YWwgPD0gdG86CisgICAgICAgICAgICAjIHZhbHVlIG91dHNpZGUgcmFuZ2UsIHNldCB2YWx1ZSBiYWNrIHRvIHRoZSBsYXN0IHZhbGlkIG9uZQorICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHNlbGYuX2xhc3RfdmFsaWQKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuX2xhc3RfdmFsaWQgPSBuZXd2YWwKKyAgICAgICAgc2VsZi5sYWJlbFsndGV4dCddID0gbmV3dmFsCisgICAgICAgIHNlbGYuYWZ0ZXJfaWRsZShhZGp1c3RfbGFiZWwpCisKKworICAgIGRlZiBfZ2V0X3ZhbHVlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gY3VycmVudCBzY2FsZSB2YWx1ZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ZhcmlhYmxlLmdldCgpCisKKworICAgIGRlZiBfc2V0X3ZhbHVlKHNlbGYsIHZhbCk6CisgICAgICAgICIiIlNldCBuZXcgc2NhbGUgdmFsdWUuIiIiCisgICAgICAgIHNlbGYuX3ZhcmlhYmxlLnNldCh2YWwpCisKKworICAgIHZhbHVlID0gcHJvcGVydHkoX2dldF92YWx1ZSwgX3NldF92YWx1ZSkKKworCitjbGFzcyBPcHRpb25NZW51KE1lbnVidXR0b24pOgorICAgICIiIlRoZW1lZCBPcHRpb25NZW51LCBiYXNlZCBhZnRlciBUa2ludGVyJ3MgT3B0aW9uTWVudSwgd2hpY2ggYWxsb3dzCisgICAgdGhlIHVzZXIgdG8gc2VsZWN0IGEgdmFsdWUgZnJvbSBhIG1lbnUuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCB2YXJpYWJsZSwgZGVmYXVsdD1Ob25lLCAqdmFsdWVzLCAqKmt3YXJncyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIHRoZW1lZCBPcHRpb25NZW51IHdpZGdldCB3aXRoIG1hc3RlciBhcyB0aGUgcGFyZW50LAorICAgICAgICB0aGUgcmVzb3VyY2UgdGV4dHZhcmlhYmxlIHNldCB0byB2YXJpYWJsZSwgdGhlIGluaXRpYWxseSBzZWxlY3RlZAorICAgICAgICB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIGRlZmF1bHQgcGFyYW1ldGVyLCB0aGUgbWVudSB2YWx1ZXMgZ2l2ZW4gYnkKKyAgICAgICAgKnZhbHVlcyBhbmQgYWRkaXRpb25hbCBrZXl3b3Jkcy4KKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBzdHlsZTogc3R5bGVuYW1lCisgICAgICAgICAgICAgICAgTWVudWJ1dHRvbiBzdHlsZS4KKyAgICAgICAgICAgIGRpcmVjdGlvbjogJ2Fib3ZlJywgJ2JlbG93JywgJ2xlZnQnLCAncmlnaHQnLCBvciAnZmx1c2gnCisgICAgICAgICAgICAgICAgTWVudWJ1dHRvbiBkaXJlY3Rpb24uCisgICAgICAgICAgICBjb21tYW5kOiBjYWxsYmFjaworICAgICAgICAgICAgICAgIEEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGludm9rZWQgYWZ0ZXIgc2VsZWN0aW5nIGFuIGl0ZW0uCisgICAgICAgICIiIgorICAgICAgICBrdyA9IHsndGV4dHZhcmlhYmxlJzogdmFyaWFibGUsICdzdHlsZSc6IGt3YXJncy5wb3AoJ3N0eWxlJywgTm9uZSksCisgICAgICAgICAgICAgICdkaXJlY3Rpb24nOiBrd2FyZ3MucG9wKCdkaXJlY3Rpb24nLCBOb25lKX0KKyAgICAgICAgTWVudWJ1dHRvbi5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICoqa3cpCisgICAgICAgIHNlbGZbJ21lbnUnXSA9IFRraW50ZXIuTWVudShzZWxmLCB0ZWFyb2ZmPUZhbHNlKQorCisgICAgICAgIHNlbGYuX3ZhcmlhYmxlID0gdmFyaWFibGUKKyAgICAgICAgc2VsZi5fY2FsbGJhY2sgPSBrd2FyZ3MucG9wKCdjb21tYW5kJywgTm9uZSkKKyAgICAgICAgaWYga3dhcmdzOgorICAgICAgICAgICAgcmFpc2UgVGtpbnRlci5UY2xFcnJvcigndW5rbm93biBvcHRpb24gLSVzJyAlICgKKyAgICAgICAgICAgICAgICBrd2FyZ3MuaXRlcmtleXMoKS5uZXh0KCkpKQorCisgICAgICAgIHNlbGYuc2V0X21lbnUoZGVmYXVsdCwgKnZhbHVlcykKKworCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGl0ZW0pOgorICAgICAgICBpZiBpdGVtID09ICdtZW51JzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWV0b3dpZGdldChNZW51YnV0dG9uLl9fZ2V0aXRlbV9fKHNlbGYsIGl0ZW0pKQorCisgICAgICAgIHJldHVybiBNZW51YnV0dG9uLl9fZ2V0aXRlbV9fKHNlbGYsIGl0ZW0pCisKKworICAgIGRlZiBzZXRfbWVudShzZWxmLCBkZWZhdWx0PU5vbmUsICp2YWx1ZXMpOgorICAgICAgICAiIiJCdWlsZCBhIG5ldyBtZW51IG9mIHJhZGlvYnV0dG9ucyB3aXRoICp2YWx1ZXMgYW5kIG9wdGlvbmFsbHkKKyAgICAgICAgYSBkZWZhdWx0IHZhbHVlLiIiIgorICAgICAgICBtZW51ID0gc2VsZlsnbWVudSddCisgICAgICAgIG1lbnUuZGVsZXRlKDAsICdlbmQnKQorICAgICAgICBmb3IgdmFsIGluIHZhbHVlczoKKyAgICAgICAgICAgIG1lbnUuYWRkX3JhZGlvYnV0dG9uKGxhYmVsPXZhbCwKKyAgICAgICAgICAgICAgICBjb21tYW5kPVRraW50ZXIuX3NldGl0KHNlbGYuX3ZhcmlhYmxlLCB2YWwsIHNlbGYuX2NhbGxiYWNrKSkKKworICAgICAgICBpZiBkZWZhdWx0OgorICAgICAgICAgICAgc2VsZi5fdmFyaWFibGUuc2V0KGRlZmF1bHQpCisKKworICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAiIiJEZXN0cm95IHRoaXMgd2lkZ2V0IGFuZCBpdHMgYXNzb2NpYXRlZCB2YXJpYWJsZS4iIiIKKyAgICAgICAgZGVsIHNlbGYuX3ZhcmlhYmxlCisgICAgICAgIE1lbnVidXR0b24uZGVzdHJveShzZWxmKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdHRrLnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL3R0ay5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzNjBmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3R0ay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdHRrLnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL3R0ay5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIzNjBmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3R0ay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdHVydGxlLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdHVydGxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NTQwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90dXJ0bGUucHkKQEAgLTAsMCArMSw0MDM1IEBACisjCisjIHR1cnRsZS5weTogYSBUa2ludGVyIGJhc2VkIHR1cnRsZSBncmFwaGljcyBtb2R1bGUgZm9yIFB5dGhvbgorIyBWZXJzaW9uIDEuMC4xIC0gMjQuIDkuIDIwMDkKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IC0gMjAxMCAgR3JlZ29yIExpbmdsCisjIGVtYWlsOiBnbGluZ2xAYW9uLmF0CisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCisKKyIiIgorVHVydGxlIGdyYXBoaWNzIGlzIGEgcG9wdWxhciB3YXkgZm9yIGludHJvZHVjaW5nIHByb2dyYW1taW5nIHRvCitraWRzLiBJdCB3YXMgcGFydCBvZiB0aGUgb3JpZ2luYWwgTG9nbyBwcm9ncmFtbWluZyBsYW5ndWFnZSBkZXZlbG9wZWQKK2J5IFdhbGx5IEZldXJ6aWcgYW5kIFNleW1vdXIgUGFwZXJ0IGluIDE5NjYuCisKK0ltYWdpbmUgYSByb2JvdGljIHR1cnRsZSBzdGFydGluZyBhdCAoMCwgMCkgaW4gdGhlIHgteSBwbGFuZS4gQWZ0ZXIgYW4gYGBpbXBvcnQgdHVydGxlYGAsIGdpdmUgaXQKK3RoZSBjb21tYW5kIHR1cnRsZS5mb3J3YXJkKDE1KSwgYW5kIGl0IG1vdmVzIChvbi1zY3JlZW4hKSAxNSBwaXhlbHMgaW4KK3RoZSBkaXJlY3Rpb24gaXQgaXMgZmFjaW5nLCBkcmF3aW5nIGEgbGluZSBhcyBpdCBtb3Zlcy4gR2l2ZSBpdCB0aGUKK2NvbW1hbmQgdHVydGxlLnJpZ2h0KDI1KSwgYW5kIGl0IHJvdGF0ZXMgaW4tcGxhY2UgMjUgZGVncmVlcyBjbG9ja3dpc2UuCisKK0J5IGNvbWJpbmluZyB0b2dldGhlciB0aGVzZSBhbmQgc2ltaWxhciBjb21tYW5kcywgaW50cmljYXRlIHNoYXBlcyBhbmQKK3BpY3R1cmVzIGNhbiBlYXNpbHkgYmUgZHJhd24uCisKKy0tLS0tIHR1cnRsZS5weQorCitUaGlzIG1vZHVsZSBpcyBhbiBleHRlbmRlZCByZWltcGxlbWVudGF0aW9uIG9mIHR1cnRsZS5weSBmcm9tIHRoZQorUHl0aG9uIHN0YW5kYXJkIGRpc3RyaWJ1dGlvbiB1cCB0byBQeXRob24gMi41LiAoU2VlOiBodHRwOi8vd3d3LnB5dGhvbi5vcmcpCisKK0l0IHRyaWVzIHRvIGtlZXAgdGhlIG1lcml0cyBvZiB0dXJ0bGUucHkgYW5kIHRvIGJlIChuZWFybHkpIDEwMCUKK2NvbXBhdGlibGUgd2l0aCBpdC4gVGhpcyBtZWFucyBpbiB0aGUgZmlyc3QgcGxhY2UgdG8gZW5hYmxlIHRoZQorbGVhcm5pbmcgcHJvZ3JhbW1lciB0byB1c2UgYWxsIHRoZSBjb21tYW5kcywgY2xhc3NlcyBhbmQgbWV0aG9kcworaW50ZXJhY3RpdmVseSB3aGVuIHVzaW5nIHRoZSBtb2R1bGUgZnJvbSB3aXRoaW4gSURMRSBydW4gd2l0aAordGhlIC1uIHN3aXRjaC4KKworUm91Z2hseSBpdCBoYXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhZGRlZDoKKworLSBCZXR0ZXIgYW5pbWF0aW9uIG9mIHRoZSB0dXJ0bGUgbW92ZW1lbnRzLCBlc3BlY2lhbGx5IG9mIHR1cm5pbmcgdGhlCisgIHR1cnRsZS4gU28gdGhlIHR1cnRsZXMgY2FuIG1vcmUgZWFzaWx5IGJlIHVzZWQgYXMgYSB2aXN1YWwgZmVlZGJhY2sKKyAgaW5zdHJ1bWVudCBieSB0aGUgKGJlZ2lubmluZykgcHJvZ3JhbW1lci4KKworLSBEaWZmZXJlbnQgdHVydGxlIHNoYXBlcywgZ2lmLWltYWdlcyBhcyB0dXJ0bGUgc2hhcGVzLCB1c2VyIGRlZmluZWQKKyAgYW5kIHVzZXIgY29udHJvbGxhYmxlIHR1cnRsZSBzaGFwZXMsIGFtb25nIHRoZW0gY29tcG91bmQKKyAgKG11bHRpY29sb3JlZCkgc2hhcGVzLiBUdXJ0bGUgc2hhcGVzIGNhbiBiZSBzdHJldGNoZWQgYW5kIHRpbHRlZCwgd2hpY2gKKyAgbWFrZXMgdHVydGxlcyB2ZXJ5IHZlcnNhdGlsZSBnZW9tZXRyaWNhbCBvYmplY3RzLgorCistIEZpbmUgY29udHJvbCBvdmVyIHR1cnRsZSBtb3ZlbWVudCBhbmQgc2NyZWVuIHVwZGF0ZXMgdmlhIGRlbGF5KCksCisgIGFuZCBlbmhhbmNlZCB0cmFjZXIoKSBhbmQgc3BlZWQoKSBtZXRob2RzLgorCistIEFsaWFzZXMgZm9yIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgY29tbWFuZHMsIGxpa2UgZmQgZm9yIGZvcndhcmQgZXRjLiwKKyAgZm9sbG93aW5nIHRoZSBlYXJseSBMb2dvIHRyYWRpdGlvbnMuIFRoaXMgcmVkdWNlcyB0aGUgYm9yaW5nIHdvcmsgb2YKKyAgdHlwaW5nIGxvbmcgc2VxdWVuY2VzIG9mIGNvbW1hbmRzLCB3aGljaCBvZnRlbiBvY2N1ciBpbiBhIG5hdHVyYWwgd2F5CisgIHdoZW4ga2lkcyB0cnkgdG8gcHJvZ3JhbSBmYW5jeSBwaWN0dXJlcyBvbiB0aGVpciBmaXJzdCBlbmNvdW50ZXIgd2l0aAorICB0dXJ0bGUgZ3JhcGhpY3MuCisKKy0gVHVydGxlcyBub3cgaGF2ZSBhbiB1bmRvKCktbWV0aG9kIHdpdGggY29uZmlndXJhYmxlIHVuZG8tYnVmZmVyLgorCistIFNvbWUgc2ltcGxlIGNvbW1hbmRzL21ldGhvZHMgZm9yIGNyZWF0aW5nIGV2ZW50IGRyaXZlbiBwcm9ncmFtcworICAobW91c2UtLCBrZXktLCB0aW1lci1ldmVudHMpLiBFc3BlY2lhbGx5IHVzZWZ1bCBmb3IgcHJvZ3JhbW1pbmcgZ2FtZXMuCisKKy0gQSBzY3JvbGxhYmxlIENhbnZhcyBjbGFzcy4gVGhlIGRlZmF1bHQgc2Nyb2xsYWJsZSBDYW52YXMgY2FuIGJlCisgIGV4dGVuZGVkIGludGVyYWN0aXZlbHkgYXMgbmVlZGVkIHdoaWxlIHBsYXlpbmcgYXJvdW5kIHdpdGggdGhlIHR1cnRsZShzKS4KKworLSBBIFR1cnRsZVNjcmVlbiBjbGFzcyB3aXRoIG1ldGhvZHMgY29udHJvbGxpbmcgYmFja2dyb3VuZCBjb2xvciBvcgorICBiYWNrZ3JvdW5kIGltYWdlLCB3aW5kb3cgYW5kIGNhbnZhcyBzaXplIGFuZCBvdGhlciBwcm9wZXJ0aWVzIG9mIHRoZQorICBUdXJ0bGVTY3JlZW4uCisKKy0gVGhlcmUgaXMgYSBtZXRob2QsIHNldHdvcmxkY29vcmRpbmF0ZXMoKSwgdG8gaW5zdGFsbCBhIHVzZXIgZGVmaW5lZAorICBjb29yZGluYXRlLXN5c3RlbSBmb3IgdGhlIFR1cnRsZVNjcmVlbi4KKworLSBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBhIDItdmVjdG9yIGNsYXNzIG5hbWVkIFZlYzJELCBkZXJpdmVkIGZyb20gdHVwbGUuCisgIFRoaXMgY2xhc3MgaXMgcHVibGljLCBzbyBpdCBjYW4gYmUgaW1wb3J0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIsCisgIHdoaWNoIG1ha2VzIGNlcnRhaW4gdHlwZXMgb2YgY29tcHV0YXRpb25zIHZlcnkgbmF0dXJhbCBhbmQgY29tcGFjdC4KKworLSBBcHBlYXJhbmNlIG9mIHRoZSBUdXJ0bGVTY3JlZW4gYW5kIHRoZSBUdXJ0bGVzIGF0IHN0YXJ0dXAvaW1wb3J0IGNhbiBiZQorICBjb25maWd1cmVkIGJ5IG1lYW5zIG9mIGEgdHVydGxlLmNmZyBjb25maWd1cmF0aW9uIGZpbGUuCisgIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbWltaWNzIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBvbGQgdHVydGxlIG1vZHVsZS4KKworLSBJZiBjb25maWd1cmVkIGFwcHJvcHJpYXRlbHkgdGhlIG1vZHVsZSByZWFkcyBpbiBkb2NzdHJpbmdzIGZyb20gYSBkb2NzdHJpbmcKKyAgZGljdGlvbmFyeSBpbiBzb21lIGRpZmZlcmVudCBsYW5ndWFnZSwgc3VwcGxpZWQgc2VwYXJhdGVseSAgYW5kIHJlcGxhY2VzCisgIHRoZSBFbmdsaXNoIG9uZXMgYnkgdGhvc2UgcmVhZCBpbi4gVGhlcmUgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uCisgIHdyaXRlX2RvY3N0cmluZ2RpY3QoKSB0byB3cml0ZSBhIGRpY3Rpb25hcnkgd2l0aCB0aGUgb3JpZ2luYWwgKEVuZ2xpc2gpCisgIGRvY3N0cmluZ3MgdG8gZGlzYywgc28gaXQgY2FuIHNlcnZlIGFzIGEgdGVtcGxhdGUgZm9yIHRyYW5zbGF0aW9ucy4KKworQmVoaW5kIHRoZSBzY2VuZXMgdGhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgaW5jbHVkZWQgd2l0aCBwb3NzaWJsZQorZXh0ZW5zaW9ucyBpbiBtaW5kLiBUaGVzZSB3aWxsIGJlIGNvbW1lbnRlZCBhbmQgZG9jdW1lbnRlZCBlbHNld2hlcmUuCisKKyIiIgorCitfdmVyID0gInR1cnRsZSAxLjBiMSAtIGZvciBQeXRob24gMi42ICAgLSAgMzAuIDUuIDIwMDgsIDE4OjA4IgorCisjcHJpbnQgX3ZlcgorCitpbXBvcnQgVGtpbnRlciBhcyBUSworaW1wb3J0IHR5cGVzCitpbXBvcnQgbWF0aAoraW1wb3J0IHRpbWUKK2ltcG9ydCBvcworCitmcm9tIG9zLnBhdGggaW1wb3J0IGlzZmlsZSwgc3BsaXQsIGpvaW4KK2Zyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKKworZnJvbSBtYXRoIGltcG9ydCAqICAgICMjIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIHR1cnRsZSBtb2R1bGUKKworX3RnX2NsYXNzZXMgPSBbJ1Njcm9sbGVkQ2FudmFzJywgJ1R1cnRsZVNjcmVlbicsICdTY3JlZW4nLAorICAgICAgICAgICAgICAgJ1Jhd1R1cnRsZScsICdUdXJ0bGUnLCAnUmF3UGVuJywgJ1BlbicsICdTaGFwZScsICdWZWMyRCddCitfdGdfc2NyZWVuX2Z1bmN0aW9ucyA9IFsnYWRkc2hhcGUnLCAnYmdjb2xvcicsICdiZ3BpYycsICdieWUnLAorICAgICAgICAnY2xlYXJzY3JlZW4nLCAnY29sb3Jtb2RlJywgJ2RlbGF5JywgJ2V4aXRvbmNsaWNrJywgJ2dldGNhbnZhcycsCisgICAgICAgICdnZXRzaGFwZXMnLCAnbGlzdGVuJywgJ21vZGUnLCAnb25rZXknLCAnb25zY3JlZW5jbGljaycsICdvbnRpbWVyJywKKyAgICAgICAgJ3JlZ2lzdGVyX3NoYXBlJywgJ3Jlc2V0c2NyZWVuJywgJ3NjcmVlbnNpemUnLCAnc2V0dXAnLAorICAgICAgICAnc2V0d29ybGRjb29yZGluYXRlcycsICd0aXRsZScsICd0cmFjZXInLCAndHVydGxlcycsICd1cGRhdGUnLAorICAgICAgICAnd2luZG93X2hlaWdodCcsICd3aW5kb3dfd2lkdGgnXQorX3RnX3R1cnRsZV9mdW5jdGlvbnMgPSBbJ2JhY2snLCAnYmFja3dhcmQnLCAnYmVnaW5fZmlsbCcsICdiZWdpbl9wb2x5JywgJ2JrJywKKyAgICAgICAgJ2NpcmNsZScsICdjbGVhcicsICdjbGVhcnN0YW1wJywgJ2NsZWFyc3RhbXBzJywgJ2Nsb25lJywgJ2NvbG9yJywKKyAgICAgICAgJ2RlZ3JlZXMnLCAnZGlzdGFuY2UnLCAnZG90JywgJ2Rvd24nLCAnZW5kX2ZpbGwnLCAnZW5kX3BvbHknLCAnZmQnLAorICAgICAgICAnZmlsbCcsICdmaWxsY29sb3InLCAnZm9yd2FyZCcsICdnZXRfcG9seScsICdnZXRwZW4nLCAnZ2V0c2NyZWVuJywKKyAgICAgICAgJ2dldHR1cnRsZScsICdnb3RvJywgJ2hlYWRpbmcnLCAnaGlkZXR1cnRsZScsICdob21lJywgJ2h0JywgJ2lzZG93bicsCisgICAgICAgICdpc3Zpc2libGUnLCAnbGVmdCcsICdsdCcsICdvbmNsaWNrJywgJ29uZHJhZycsICdvbnJlbGVhc2UnLCAncGQnLAorICAgICAgICAncGVuJywgJ3BlbmNvbG9yJywgJ3BlbmRvd24nLCAncGVuc2l6ZScsICdwZW51cCcsICdwb3MnLCAncG9zaXRpb24nLAorICAgICAgICAncHUnLCAncmFkaWFucycsICdyaWdodCcsICdyZXNldCcsICdyZXNpemVtb2RlJywgJ3J0JywKKyAgICAgICAgJ3NldGgnLCAnc2V0aGVhZGluZycsICdzZXRwb3MnLCAnc2V0cG9zaXRpb24nLCAnc2V0dGlsdGFuZ2xlJywKKyAgICAgICAgJ3NldHVuZG9idWZmZXInLCAnc2V0eCcsICdzZXR5JywgJ3NoYXBlJywgJ3NoYXBlc2l6ZScsICdzaG93dHVydGxlJywKKyAgICAgICAgJ3NwZWVkJywgJ3N0JywgJ3N0YW1wJywgJ3RpbHQnLCAndGlsdGFuZ2xlJywgJ3Rvd2FyZHMnLCAndHJhY2VyJywKKyAgICAgICAgJ3R1cnRsZXNpemUnLCAndW5kbycsICd1bmRvYnVmZmVyZW50cmllcycsICd1cCcsICd3aWR0aCcsCisgICAgICAgICd3aW5kb3dfaGVpZ2h0JywgJ3dpbmRvd193aWR0aCcsICd3cml0ZScsICd4Y29yJywgJ3ljb3InXQorX3RnX3V0aWxpdGllcyA9IFsnd3JpdGVfZG9jc3RyaW5nZGljdCcsICdkb25lJywgJ21haW5sb29wJ10KK19tYXRoX2Z1bmN0aW9ucyA9IFsnYWNvcycsICdhc2luJywgJ2F0YW4nLCAnYXRhbjInLCAnY2VpbCcsICdjb3MnLCAnY29zaCcsCisgICAgICAgICdlJywgJ2V4cCcsICdmYWJzJywgJ2Zsb29yJywgJ2Ztb2QnLCAnZnJleHAnLCAnaHlwb3QnLCAnbGRleHAnLCAnbG9nJywKKyAgICAgICAgJ2xvZzEwJywgJ21vZGYnLCAncGknLCAncG93JywgJ3NpbicsICdzaW5oJywgJ3NxcnQnLCAndGFuJywgJ3RhbmgnXQorCitfX2FsbF9fID0gKF90Z19jbGFzc2VzICsgX3RnX3NjcmVlbl9mdW5jdGlvbnMgKyBfdGdfdHVydGxlX2Z1bmN0aW9ucyArCisgICAgICAgICAgIF90Z191dGlsaXRpZXMgKyBfbWF0aF9mdW5jdGlvbnMpCisKK19hbGlhc19saXN0ID0gWydhZGRzaGFwZScsICdiYWNrd2FyZCcsICdiaycsICdmZCcsICdodCcsICdsdCcsICdwZCcsICdwb3MnLAorICAgICAgICAgICAgICAgJ3B1JywgJ3J0JywgJ3NldGgnLCAnc2V0cG9zJywgJ3NldHBvc2l0aW9uJywgJ3N0JywKKyAgICAgICAgICAgICAgICd0dXJ0bGVzaXplJywgJ3VwJywgJ3dpZHRoJ10KKworX0NGRyA9IHsid2lkdGgiIDogMC41LCAgICAgICAgICAgICAgICMgU2NyZWVuCisgICAgICAgICJoZWlnaHQiIDogMC43NSwKKyAgICAgICAgImNhbnZ3aWR0aCIgOiA0MDAsCisgICAgICAgICJjYW52aGVpZ2h0IjogMzAwLAorICAgICAgICAibGVmdHJpZ2h0IjogTm9uZSwKKyAgICAgICAgInRvcGJvdHRvbSI6IE5vbmUsCisgICAgICAgICJtb2RlIjogInN0YW5kYXJkIiwgICAgICAgICAgIyBUdXJ0bGVTY3JlZW4KKyAgICAgICAgImNvbG9ybW9kZSI6IDEuMCwKKyAgICAgICAgImRlbGF5IjogMTAsCisgICAgICAgICJ1bmRvYnVmZmVyc2l6ZSI6IDEwMDAsICAgICAgIyBSYXdUdXJ0bGUKKyAgICAgICAgInNoYXBlIjogImNsYXNzaWMiLAorICAgICAgICAicGVuY29sb3IiIDogImJsYWNrIiwKKyAgICAgICAgImZpbGxjb2xvciIgOiAiYmxhY2siLAorICAgICAgICAicmVzaXplbW9kZSIgOiAibm9yZXNpemUiLAorICAgICAgICAidmlzaWJsZSIgOiBUcnVlLAorICAgICAgICAibGFuZ3VhZ2UiOiAiZW5nbGlzaCIsICAgICAgICAjIGRvY3N0cmluZ3MKKyAgICAgICAgImV4YW1wbGV0dXJ0bGUiOiAidHVydGxlIiwKKyAgICAgICAgImV4YW1wbGVzY3JlZW4iOiAic2NyZWVuIiwKKyAgICAgICAgInRpdGxlIjogIlB5dGhvbiBUdXJ0bGUgR3JhcGhpY3MiLAorICAgICAgICAidXNpbmdfSURMRSI6IEZhbHNlCisgICAgICAgfQorCisjI3ByaW50ICJjd2Q6Iiwgb3MuZ2V0Y3dkKCkKKyMjcHJpbnQgIl9fZmlsZV9fOiIsIF9fZmlsZV9fCisjIworIyNkZWYgc2hvdyhkaWN0aW9uYXJ5KToKKyMjICAgIHByaW50ICI9PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyMjICAgIGZvciBrZXkgaW4gc29ydGVkKGRpY3Rpb25hcnkua2V5cygpKToKKyMjICAgICAgICBwcmludCBrZXksICI6IiwgZGljdGlvbmFyeVtrZXldCisjIyAgICBwcmludCAiPT09PT09PT09PT09PT09PT09PT09PT09PT0iCisjIyAgICBwcmludAorCitkZWYgY29uZmlnX2RpY3QoZmlsZW5hbWUpOgorICAgICIiIkNvbnZlcnQgY29udGVudCBvZiBjb25maWctZmlsZSBpbnRvIGRpY3Rpb25hcnkuIiIiCisgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJyIikKKyAgICBjZmdsaW5lcyA9IGYucmVhZGxpbmVzKCkKKyAgICBmLmNsb3NlKCkKKyAgICBjZmdkaWN0ID0ge30KKyAgICBmb3IgbGluZSBpbiBjZmdsaW5lczoKKyAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICBpZiBub3QgbGluZSBvciBsaW5lLnN0YXJ0c3dpdGgoIiMiKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGtleSwgdmFsdWUgPSBsaW5lLnNwbGl0KCI9IikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcHJpbnQgIkJhZCBsaW5lIGluIGNvbmZpZy1maWxlICVzOlxuJXMiICUgKGZpbGVuYW1lLGxpbmUpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBrZXkgPSBrZXkuc3RyaXAoKQorICAgICAgICB2YWx1ZSA9IHZhbHVlLnN0cmlwKCkKKyAgICAgICAgaWYgdmFsdWUgaW4gWyJUcnVlIiwgIkZhbHNlIiwgIk5vbmUiLCAiJyciLCAnIiInXToKKyAgICAgICAgICAgIHZhbHVlID0gZXZhbCh2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiAiLiIgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmxvYXQodmFsdWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpbnQodmFsdWUpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcyAjIHZhbHVlIG5lZWQgbm90IGJlIGNvbnZlcnRlZAorICAgICAgICBjZmdkaWN0W2tleV0gPSB2YWx1ZQorICAgIHJldHVybiBjZmdkaWN0CisKK2RlZiByZWFkY29uZmlnKGNmZ2RpY3QpOgorICAgICIiIlJlYWQgY29uZmlnLWZpbGVzLCBjaGFuZ2UgY29uZmlndXJhdGlvbi1kaWN0IGFjY29yZGluZ2x5LgorCisgICAgSWYgdGhlcmUgaXMgYSB0dXJ0bGUuY2ZnIGZpbGUgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksCisgICAgcmVhZCBpdCBmcm9tIHRoZXJlLiBJZiB0aGlzIGNvbnRhaW5zIGFuIGltcG9ydGNvbmZpZy12YWx1ZSwKKyAgICBzYXkgJ215d2F5JywgY29uc3RydWN0IGZpbGVuYW1lIHR1cnRsZV9tYXl3YXkuY2ZnIGVsc2UgdXNlCisgICAgdHVydGxlLmNmZyBhbmQgcmVhZCBpdCBmcm9tIHRoZSBpbXBvcnQtZGlyZWN0b3J5LCB3aGVyZQorICAgIHR1cnRsZS5weSBpcyBsb2NhdGVkLgorICAgIFVwZGF0ZSBjb25maWd1cmF0aW9uIGRpY3Rpb25hcnkgZmlyc3QgYWNjb3JkaW5nIHRvIGNvbmZpZy1maWxlLAorICAgIGluIHRoZSBpbXBvcnQgZGlyZWN0b3J5LCB0aGVuIGFjY29yZGluZyB0byBjb25maWctZmlsZSBpbiB0aGUKKyAgICBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorICAgIElmIG5vIGNvbmZpZy1maWxlIGlzIGZvdW5kLCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIHVzZWQuCisgICAgIiIiCisgICAgZGVmYXVsdF9jZmcgPSAidHVydGxlLmNmZyIKKyAgICBjZmdkaWN0MSA9IHt9CisgICAgY2ZnZGljdDIgPSB7fQorICAgIGlmIGlzZmlsZShkZWZhdWx0X2NmZyk6CisgICAgICAgIGNmZ2RpY3QxID0gY29uZmlnX2RpY3QoZGVmYXVsdF9jZmcpCisgICAgICAgICNwcmludCAiMS4gTG9hZGluZyBjb25maWctZmlsZSAlcyBmcm9tOiAlcyIgJSAoZGVmYXVsdF9jZmcsIG9zLmdldGN3ZCgpKQorICAgIGlmICJpbXBvcnRjb25maWciIGluIGNmZ2RpY3QxOgorICAgICAgICBkZWZhdWx0X2NmZyA9ICJ0dXJ0bGVfJXMuY2ZnIiAlIGNmZ2RpY3QxWyJpbXBvcnRjb25maWciXQorICAgIHRyeToKKyAgICAgICAgaGVhZCwgdGFpbCA9IHNwbGl0KF9fZmlsZV9fKQorICAgICAgICBjZmdfZmlsZTIgPSBqb2luKGhlYWQsIGRlZmF1bHRfY2ZnKQorICAgIGV4Y2VwdDoKKyAgICAgICAgY2ZnX2ZpbGUyID0gIiIKKyAgICBpZiBpc2ZpbGUoY2ZnX2ZpbGUyKToKKyAgICAgICAgI3ByaW50ICIyLiBMb2FkaW5nIGNvbmZpZy1maWxlICVzOiIgJSBjZmdfZmlsZTIKKyAgICAgICAgY2ZnZGljdDIgPSBjb25maWdfZGljdChjZmdfZmlsZTIpCisjIyAgICBzaG93KF9DRkcpCisjIyAgICBzaG93KGNmZ2RpY3QyKQorICAgIF9DRkcudXBkYXRlKGNmZ2RpY3QyKQorIyMgICAgc2hvdyhfQ0ZHKQorIyMgICAgc2hvdyhjZmdkaWN0MSkKKyAgICBfQ0ZHLnVwZGF0ZShjZmdkaWN0MSkKKyMjICAgIHNob3coX0NGRykKKwordHJ5OgorICAgIHJlYWRjb25maWcoX0NGRykKK2V4Y2VwdDoKKyAgICBwcmludCAiTm8gY29uZmlnZmlsZSByZWFkLCByZWFzb24gdW5rbm93biIKKworCitjbGFzcyBWZWMyRCh0dXBsZSk6CisgICAgIiIiQSAyIGRpbWVuc2lvbmFsIHZlY3RvciBjbGFzcywgdXNlZCBhcyBhIGhlbHBlciBjbGFzcworICAgIGZvciBpbXBsZW1lbnRpbmcgdHVydGxlIGdyYXBoaWNzLgorICAgIE1heSBiZSB1c2VmdWwgZm9yIHR1cnRsZSBncmFwaGljcyBwcm9ncmFtcyBhbHNvLgorICAgIERlcml2ZWQgZnJvbSB0dXBsZSwgc28gYSB2ZWN0b3IgaXMgYSB0dXBsZSEKKworICAgIFByb3ZpZGVzIChmb3IgYSwgYiB2ZWN0b3JzLCBrIG51bWJlcik6CisgICAgICAgYStiIHZlY3RvciBhZGRpdGlvbgorICAgICAgIGEtYiB2ZWN0b3Igc3VidHJhY3Rpb24KKyAgICAgICBhKmIgaW5uZXIgcHJvZHVjdAorICAgICAgIGsqYSBhbmQgYSprIG11bHRpcGxpY2F0aW9uIHdpdGggc2NhbGFyCisgICAgICAgfGF8IGFic29sdXRlIHZhbHVlIG9mIGEKKyAgICAgICBhLnJvdGF0ZShhbmdsZSkgcm90YXRpb24KKyAgICAiIiIKKyAgICBkZWYgX19uZXdfXyhjbHMsIHgsIHkpOgorICAgICAgICByZXR1cm4gdHVwbGUuX19uZXdfXyhjbHMsICh4LCB5KSkKKyAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBWZWMyRChzZWxmWzBdK290aGVyWzBdLCBzZWxmWzFdK290aGVyWzFdKQorICAgIGRlZiBfX211bF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVmVjMkQpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGZbMF0qb3RoZXJbMF0rc2VsZlsxXSpvdGhlclsxXQorICAgICAgICByZXR1cm4gVmVjMkQoc2VsZlswXSpvdGhlciwgc2VsZlsxXSpvdGhlcikKKyAgICBkZWYgX19ybXVsX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBpbnQpIG9yIGlzaW5zdGFuY2Uob3RoZXIsIGZsb2F0KToKKyAgICAgICAgICAgIHJldHVybiBWZWMyRChzZWxmWzBdKm90aGVyLCBzZWxmWzFdKm90aGVyKQorICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIFZlYzJEKHNlbGZbMF0tb3RoZXJbMF0sIHNlbGZbMV0tb3RoZXJbMV0pCisgICAgZGVmIF9fbmVnX18oc2VsZik6CisgICAgICAgIHJldHVybiBWZWMyRCgtc2VsZlswXSwgLXNlbGZbMV0pCisgICAgZGVmIF9fYWJzX18oc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZlswXSoqMiArIHNlbGZbMV0qKjIpKiowLjUKKyAgICBkZWYgcm90YXRlKHNlbGYsIGFuZ2xlKToKKyAgICAgICAgIiIicm90YXRlIHNlbGYgY291bnRlcmNsb2Nrd2lzZSBieSBhbmdsZQorICAgICAgICAiIiIKKyAgICAgICAgcGVycCA9IFZlYzJEKC1zZWxmWzFdLCBzZWxmWzBdKQorICAgICAgICBhbmdsZSA9IGFuZ2xlICogbWF0aC5waSAvIDE4MC4wCisgICAgICAgIGMsIHMgPSBtYXRoLmNvcyhhbmdsZSksIG1hdGguc2luKGFuZ2xlKQorICAgICAgICByZXR1cm4gVmVjMkQoc2VsZlswXSpjK3BlcnBbMF0qcywgc2VsZlsxXSpjK3BlcnBbMV0qcykKKyAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZlswXSwgc2VsZlsxXSkKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiKCUuMmYsJS4yZikiICUgc2VsZgorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIEZyb20gaGVyZSB1cCB0byBsaW5lICAgIDogVGtpbnRlciAtIEludGVyZmFjZSBmb3IgdHVydGxlLnB5ICAgICAgICAgICAgIyMjCisjIyMgTWF5IGJlIHJlcGxhY2VkIGJ5IGFuIGludGVyZmFjZSB0byBzb21lIGRpZmZlcmVudCBncmFwaGljcyB0b29sa2l0ICAgICAjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyBoZWxwZXIgZnVuY3Rpb25zIGZvciBTY3JvbGxlZCBDYW52YXMsIHRvIGZvcndhcmQgQ2FudmFzLW1ldGhvZHMKKyMjIHRvIFNjcm9sbGVkQ2FudmFzIGNsYXNzCisKK2RlZiBfX21ldGhvZERpY3QoY2xzLCBfZGljdCk6CisgICAgIiIiaGVscGVyIGZ1bmN0aW9uIGZvciBTY3JvbGxlZCBDYW52YXMiIiIKKyAgICBiYXNlTGlzdCA9IGxpc3QoY2xzLl9fYmFzZXNfXykKKyAgICBiYXNlTGlzdC5yZXZlcnNlKCkKKyAgICBmb3IgX3N1cGVyIGluIGJhc2VMaXN0OgorICAgICAgICBfX21ldGhvZERpY3QoX3N1cGVyLCBfZGljdCkKKyAgICBmb3Iga2V5LCB2YWx1ZSBpbiBjbHMuX19kaWN0X18uaXRlbXMoKToKKyAgICAgICAgaWYgdHlwZSh2YWx1ZSkgPT0gdHlwZXMuRnVuY3Rpb25UeXBlOgorICAgICAgICAgICAgX2RpY3Rba2V5XSA9IHZhbHVlCisKK2RlZiBfX21ldGhvZHMoY2xzKToKKyAgICAiIiJoZWxwZXIgZnVuY3Rpb24gZm9yIFNjcm9sbGVkIENhbnZhcyIiIgorICAgIF9kaWN0ID0ge30KKyAgICBfX21ldGhvZERpY3QoY2xzLCBfZGljdCkKKyAgICByZXR1cm4gX2RpY3Qua2V5cygpCisKK19fc3RyaW5nQm9keSA9ICgKKyAgICAnZGVmICUobWV0aG9kKXMoc2VsZiwgKmFyZ3MsICoqa3cpOiByZXR1cm4gJyArCisgICAgJ3NlbGYuJShhdHRyaWJ1dGUpcy4lKG1ldGhvZClzKCphcmdzLCAqKmt3KScpCisKK2RlZiBfX2ZvcndhcmRtZXRob2RzKGZyb21DbGFzcywgdG9DbGFzcywgdG9QYXJ0LCBleGNsdWRlID0gKCkpOgorICAgICIiIkhlbHBlciBmdW5jdGlvbnMgZm9yIFNjcm9sbGVkIENhbnZhcywgdXNlZCB0byBmb3J3YXJkCisgICAgU2Nyb2xsZWRDYW52YXMtbWV0aG9kcyB0byBUa2ludGVyLkNhbnZhcyBjbGFzcy4KKyAgICAiIiIKKyAgICBfZGljdCA9IHt9CisgICAgX19tZXRob2REaWN0KHRvQ2xhc3MsIF9kaWN0KQorICAgIGZvciBleCBpbiBfZGljdC5rZXlzKCk6CisgICAgICAgIGlmIGV4WzoxXSA9PSAnXycgb3IgZXhbLTE6XSA9PSAnXyc6CisgICAgICAgICAgICBkZWwgX2RpY3RbZXhdCisgICAgZm9yIGV4IGluIGV4Y2x1ZGU6CisgICAgICAgIGlmIGV4IGluIF9kaWN0OgorICAgICAgICAgICAgZGVsIF9kaWN0W2V4XQorICAgIGZvciBleCBpbiBfX21ldGhvZHMoZnJvbUNsYXNzKToKKyAgICAgICAgaWYgZXggaW4gX2RpY3Q6CisgICAgICAgICAgICBkZWwgX2RpY3RbZXhdCisKKyAgICBmb3IgbWV0aG9kLCBmdW5jIGluIF9kaWN0Lml0ZW1zKCk6CisgICAgICAgIGQgPSB7J21ldGhvZCc6IG1ldGhvZCwgJ2Z1bmMnOiBmdW5jfQorICAgICAgICBpZiB0eXBlKHRvUGFydCkgPT0gdHlwZXMuU3RyaW5nVHlwZToKKyAgICAgICAgICAgIGV4ZWNTdHJpbmcgPSBcCisgICAgICAgICAgICAgICAgX19zdHJpbmdCb2R5ICUgeydtZXRob2QnIDogbWV0aG9kLCAnYXR0cmlidXRlJyA6IHRvUGFydH0KKyAgICAgICAgZXhlYyBleGVjU3RyaW5nIGluIGQKKyAgICAgICAgZnJvbUNsYXNzLl9fZGljdF9fW21ldGhvZF0gPSBkW21ldGhvZF0KKworCitjbGFzcyBTY3JvbGxlZENhbnZhcyhUSy5GcmFtZSk6CisgICAgIiIiTW9kZWxlZCBhZnRlciB0aGUgc2Nyb2xsZWQgY2FudmFzIGNsYXNzIGZyb20gR3JheW9ucydzIFRraW50ZXIgYm9vay4KKworICAgIFVzZWQgYXMgdGhlIGRlZmF1bHQgY2FudmFzLCB3aGljaCBwb3BzIHVwIGF1dG9tYXRpY2FsbHkgd2hlbgorICAgIHVzaW5nIHR1cnRsZSBncmFwaGljcyBmdW5jdGlvbnMgb3IgdGhlIFR1cnRsZSBjbGFzcy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCB3aWR0aD01MDAsIGhlaWdodD0zNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW52d2lkdGg9NjAwLCBjYW52aGVpZ2h0PTUwMCk6CisgICAgICAgIFRLLkZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3Rlciwgd2lkdGg9d2lkdGgsIGhlaWdodD1oZWlnaHQpCisgICAgICAgIHNlbGYuX3Jvb3R3aW5kb3cgPSBzZWxmLndpbmZvX3RvcGxldmVsKCkKKyAgICAgICAgc2VsZi53aWR0aCwgc2VsZi5oZWlnaHQgPSB3aWR0aCwgaGVpZ2h0CisgICAgICAgIHNlbGYuY2FudndpZHRoLCBzZWxmLmNhbnZoZWlnaHQgPSBjYW52d2lkdGgsIGNhbnZoZWlnaHQKKyAgICAgICAgc2VsZi5iZyA9ICJ3aGl0ZSIKKyAgICAgICAgc2VsZi5fY2FudmFzID0gVEsuQ2FudmFzKG1hc3Rlciwgd2lkdGg9d2lkdGgsIGhlaWdodD1oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZz1zZWxmLmJnLCByZWxpZWY9VEsuU1VOS0VOLCBib3JkZXJ3aWR0aD0yKQorICAgICAgICBzZWxmLmhzY3JvbGwgPSBUSy5TY3JvbGxiYXIobWFzdGVyLCBjb21tYW5kPXNlbGYuX2NhbnZhcy54dmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudD1USy5IT1JJWk9OVEFMKQorICAgICAgICBzZWxmLnZzY3JvbGwgPSBUSy5TY3JvbGxiYXIobWFzdGVyLCBjb21tYW5kPXNlbGYuX2NhbnZhcy55dmlldykKKyAgICAgICAgc2VsZi5fY2FudmFzLmNvbmZpZ3VyZSh4c2Nyb2xsY29tbWFuZD1zZWxmLmhzY3JvbGwuc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlzY3JvbGxjb21tYW5kPXNlbGYudnNjcm9sbC5zZXQpCisgICAgICAgIHNlbGYucm93Y29uZmlndXJlKDAsIHdlaWdodD0xLCBtaW5zaXplPTApCisgICAgICAgIHNlbGYuY29sdW1uY29uZmlndXJlKDAsIHdlaWdodD0xLCBtaW5zaXplPTApCisgICAgICAgIHNlbGYuX2NhbnZhcy5ncmlkKHBhZHg9MSwgaW5fID0gc2VsZiwgcGFkeT0xLCByb3c9MCwKKyAgICAgICAgICAgICAgICBjb2x1bW49MCwgcm93c3Bhbj0xLCBjb2x1bW5zcGFuPTEsIHN0aWNreT0nbmV3cycpCisgICAgICAgIHNlbGYudnNjcm9sbC5ncmlkKHBhZHg9MSwgaW5fID0gc2VsZiwgcGFkeT0xLCByb3c9MCwKKyAgICAgICAgICAgICAgICBjb2x1bW49MSwgcm93c3Bhbj0xLCBjb2x1bW5zcGFuPTEsIHN0aWNreT0nbmV3cycpCisgICAgICAgIHNlbGYuaHNjcm9sbC5ncmlkKHBhZHg9MSwgaW5fID0gc2VsZiwgcGFkeT0xLCByb3c9MSwKKyAgICAgICAgICAgICAgICBjb2x1bW49MCwgcm93c3Bhbj0xLCBjb2x1bW5zcGFuPTEsIHN0aWNreT0nbmV3cycpCisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICBzZWxmLl9yb290d2luZG93LmJpbmQoJzxDb25maWd1cmU+Jywgc2VsZi5vblJlc2l6ZSkKKworICAgIGRlZiByZXNldChzZWxmLCBjYW52d2lkdGg9Tm9uZSwgY2FudmhlaWdodD1Ob25lLCBiZyA9IE5vbmUpOgorICAgICAgICAiIiJBZGp1c3QgY2FudmFzIGFuZCBzY3JvbGxiYXJzIGFjY29yZGluZyB0byBnaXZlbiBjYW52YXMgc2l6ZS4iIiIKKyAgICAgICAgaWYgY2FudndpZHRoOgorICAgICAgICAgICAgc2VsZi5jYW52d2lkdGggPSBjYW52d2lkdGgKKyAgICAgICAgaWYgY2FudmhlaWdodDoKKyAgICAgICAgICAgIHNlbGYuY2FudmhlaWdodCA9IGNhbnZoZWlnaHQKKyAgICAgICAgaWYgYmc6CisgICAgICAgICAgICBzZWxmLmJnID0gYmcKKyAgICAgICAgc2VsZi5fY2FudmFzLmNvbmZpZyhiZz1iZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbHJlZ2lvbj0oLXNlbGYuY2FudndpZHRoLy8yLCAtc2VsZi5jYW52aGVpZ2h0Ly8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYW52d2lkdGgvLzIsIHNlbGYuY2FudmhlaWdodC8vMikpCisgICAgICAgIHNlbGYuX2NhbnZhcy54dmlld19tb3ZldG8oMC41KihzZWxmLmNhbnZ3aWR0aCAtIHNlbGYud2lkdGggKyAzMCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYW52d2lkdGgpCisgICAgICAgIHNlbGYuX2NhbnZhcy55dmlld19tb3ZldG8oMC41KihzZWxmLmNhbnZoZWlnaHQtIHNlbGYuaGVpZ2h0ICsgMzApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYW52aGVpZ2h0KQorICAgICAgICBzZWxmLmFkanVzdFNjcm9sbHMoKQorCisKKyAgICBkZWYgYWRqdXN0U2Nyb2xscyhzZWxmKToKKyAgICAgICAgIiIiIEFkanVzdCBzY3JvbGxiYXJzIGFjY29yZGluZyB0byB3aW5kb3ctIGFuZCBjYW52YXMtc2l6ZS4KKyAgICAgICAgIiIiCisgICAgICAgIGN3aWR0aCA9IHNlbGYuX2NhbnZhcy53aW5mb193aWR0aCgpCisgICAgICAgIGNoZWlnaHQgPSBzZWxmLl9jYW52YXMud2luZm9faGVpZ2h0KCkKKyAgICAgICAgc2VsZi5fY2FudmFzLnh2aWV3X21vdmV0bygwLjUqKHNlbGYuY2FudndpZHRoLWN3aWR0aCkvc2VsZi5jYW52d2lkdGgpCisgICAgICAgIHNlbGYuX2NhbnZhcy55dmlld19tb3ZldG8oMC41KihzZWxmLmNhbnZoZWlnaHQtY2hlaWdodCkvc2VsZi5jYW52aGVpZ2h0KQorICAgICAgICBpZiBjd2lkdGggPCBzZWxmLmNhbnZ3aWR0aCBvciBjaGVpZ2h0IDwgc2VsZi5jYW52aGVpZ2h0OgorICAgICAgICAgICAgc2VsZi5oc2Nyb2xsLmdyaWQocGFkeD0xLCBpbl8gPSBzZWxmLCBwYWR5PTEsIHJvdz0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uPTAsIHJvd3NwYW49MSwgY29sdW1uc3Bhbj0xLCBzdGlja3k9J25ld3MnKQorICAgICAgICAgICAgc2VsZi52c2Nyb2xsLmdyaWQocGFkeD0xLCBpbl8gPSBzZWxmLCBwYWR5PTEsIHJvdz0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uPTEsIHJvd3NwYW49MSwgY29sdW1uc3Bhbj0xLCBzdGlja3k9J25ld3MnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5oc2Nyb2xsLmdyaWRfZm9yZ2V0KCkKKyAgICAgICAgICAgIHNlbGYudnNjcm9sbC5ncmlkX2ZvcmdldCgpCisKKyAgICBkZWYgb25SZXNpemUoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiJzZWxmLWV4cGxhbmF0b3J5IiIiCisgICAgICAgIHNlbGYuYWRqdXN0U2Nyb2xscygpCisKKyAgICBkZWYgYmJveChzZWxmLCAqYXJncyk6CisgICAgICAgICIiIiAnZm9yd2FyZCcgbWV0aG9kLCB3aGljaCBjYW52YXMgaXRzZWxmIGhhcyBpbmhlcml0ZWQuLi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jYW52YXMuYmJveCgqYXJncykKKworICAgIGRlZiBjZ2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIiAnZm9yd2FyZCcgbWV0aG9kLCB3aGljaCBjYW52YXMgaXRzZWxmIGhhcyBpbmhlcml0ZWQuLi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jYW52YXMuY2dldCgqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgY29uZmlnKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIiAnZm9yd2FyZCcgbWV0aG9kLCB3aGljaCBjYW52YXMgaXRzZWxmIGhhcyBpbmhlcml0ZWQuLi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NhbnZhcy5jb25maWcoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGJpbmQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiICdmb3J3YXJkJyBtZXRob2QsIHdoaWNoIGNhbnZhcyBpdHNlbGYgaGFzIGluaGVyaXRlZC4uLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2FudmFzLmJpbmQoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIHVuYmluZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiIgJ2ZvcndhcmQnIG1ldGhvZCwgd2hpY2ggY2FudmFzIGl0c2VsZiBoYXMgaW5oZXJpdGVkLi4uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jYW52YXMudW5iaW5kKCphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBmb2N1c19mb3JjZShzZWxmKToKKyAgICAgICAgIiIiICdmb3J3YXJkJyBtZXRob2QsIHdoaWNoIGNhbnZhcyBpdHNlbGYgaGFzIGluaGVyaXRlZC4uLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2FudmFzLmZvY3VzX2ZvcmNlKCkKKworX19mb3J3YXJkbWV0aG9kcyhTY3JvbGxlZENhbnZhcywgVEsuQ2FudmFzLCAnX2NhbnZhcycpCisKKworY2xhc3MgX1Jvb3QoVEsuVGspOgorICAgICIiIlJvb3QgY2xhc3MgZm9yIFNjcmVlbiBiYXNlZCBvbiBUa2ludGVyLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgVEsuVGsuX19pbml0X18oc2VsZikKKworICAgIGRlZiBzZXR1cGNhbnZhcyhzZWxmLCB3aWR0aCwgaGVpZ2h0LCBjd2lkdGgsIGNoZWlnaHQpOgorICAgICAgICBzZWxmLl9jYW52YXMgPSBTY3JvbGxlZENhbnZhcyhzZWxmLCB3aWR0aCwgaGVpZ2h0LCBjd2lkdGgsIGNoZWlnaHQpCisgICAgICAgIHNlbGYuX2NhbnZhcy5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKKworICAgIGRlZiBfZ2V0Y2FudmFzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FudmFzCisKKyAgICBkZWYgc2V0X2dlb21ldHJ5KHNlbGYsIHdpZHRoLCBoZWlnaHQsIHN0YXJ0eCwgc3RhcnR5KToKKyAgICAgICAgc2VsZi5nZW9tZXRyeSgiJWR4JWQlK2QlK2QiJSh3aWR0aCwgaGVpZ2h0LCBzdGFydHgsIHN0YXJ0eSkpCisKKyAgICBkZWYgb25kZXN0cm95KHNlbGYsIGRlc3Ryb3kpOgorICAgICAgICBzZWxmLndtX3Byb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgZGVzdHJveSkKKworICAgIGRlZiB3aW5fd2lkdGgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLndpbmZvX3NjcmVlbndpZHRoKCkKKworICAgIGRlZiB3aW5faGVpZ2h0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi53aW5mb19zY3JlZW5oZWlnaHQoKQorCitDYW52YXMgPSBUSy5DYW52YXMKKworCitjbGFzcyBUdXJ0bGVTY3JlZW5CYXNlKG9iamVjdCk6CisgICAgIiIiUHJvdmlkZSB0aGUgYmFzaWMgZ3JhcGhpY3MgZnVuY3Rpb25hbGl0eS4KKyAgICAgICBJbnRlcmZhY2UgYmV0d2VlbiBUa2ludGVyIGFuZCB0dXJ0bGUucHkuCisKKyAgICAgICBUbyBwb3J0IHR1cnRsZS5weSB0byBzb21lIGRpZmZlcmVudCBncmFwaGljcyB0b29sa2l0CisgICAgICAgYSBjb3JyZXNwb25kaW5nIFR1cnRsZVNjcmVlbkJhc2UgY2xhc3MgaGFzIHRvIGJlIGltcGxlbWVudGVkLgorICAgICIiIgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfYmxhbmtpbWFnZSgpOgorICAgICAgICAiIiJyZXR1cm4gYSBibGFuayBpbWFnZSBvYmplY3QKKyAgICAgICAgIiIiCisgICAgICAgIGltZyA9IFRLLlBob3RvSW1hZ2Uod2lkdGg9MSwgaGVpZ2h0PTEpCisgICAgICAgIGltZy5ibGFuaygpCisgICAgICAgIHJldHVybiBpbWcKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2ltYWdlKGZpbGVuYW1lKToKKyAgICAgICAgIiIicmV0dXJuIGFuIGltYWdlIG9iamVjdCBjb250YWluaW5nIHRoZQorICAgICAgICBpbWFnZWRhdGEgZnJvbSBhIGdpZi1maWxlIG5hbWVkIGZpbGVuYW1lLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFRLLlBob3RvSW1hZ2UoZmlsZT1maWxlbmFtZSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjdik6CisgICAgICAgIHNlbGYuY3YgPSBjdgorICAgICAgICBpZiBpc2luc3RhbmNlKGN2LCBTY3JvbGxlZENhbnZhcyk6CisgICAgICAgICAgICB3ID0gc2VsZi5jdi5jYW52d2lkdGgKKyAgICAgICAgICAgIGggPSBzZWxmLmN2LmNhbnZoZWlnaHQKKyAgICAgICAgZWxzZTogICMgZXhwZWN0ZWQ6IG9yZGluYXJ5IFRLLkNhbnZhcworICAgICAgICAgICAgdyA9IGludChzZWxmLmN2LmNnZXQoIndpZHRoIikpCisgICAgICAgICAgICBoID0gaW50KHNlbGYuY3YuY2dldCgiaGVpZ2h0IikpCisgICAgICAgICAgICBzZWxmLmN2LmNvbmZpZyhzY3JvbGxyZWdpb24gPSAoLXcvLzIsIC1oLy8yLCB3Ly8yLCBoLy8yICkpCisgICAgICAgIHNlbGYuY2FudndpZHRoID0gdworICAgICAgICBzZWxmLmNhbnZoZWlnaHQgPSBoCisgICAgICAgIHNlbGYueHNjYWxlID0gc2VsZi55c2NhbGUgPSAxLjAKKworICAgIGRlZiBfY3JlYXRlcG9seShzZWxmKToKKyAgICAgICAgIiIiQ3JlYXRlIGFuIGludmlzaWJsZSBwb2x5Z29uIGl0ZW0gb24gY2FudmFzIHNlbGYuY3YpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5jdi5jcmVhdGVfcG9seWdvbigoMCwgMCwgMCwgMCwgMCwgMCksIGZpbGw9IiIsIG91dGxpbmU9IiIpCisKKyAgICBkZWYgX2RyYXdwb2x5KHNlbGYsIHBvbHlpdGVtLCBjb29yZGxpc3QsIGZpbGw9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIG91dGxpbmU9Tm9uZSwgd2lkdGg9Tm9uZSwgdG9wPUZhbHNlKToKKyAgICAgICAgIiIiQ29uZmlndXJlIHBvbHlnb25pdGVtIHBvbHlpdGVtIGFjY29yZGluZyB0byBwcm92aWRlZAorICAgICAgICBhcmd1bWVudHM6CisgICAgICAgIGNvb3JkbGlzdCBpcyBzZXF1ZW5jZSBvZiBjb29yZGluYXRlcworICAgICAgICBmaWxsIGlzIGZpbGxpbmcgY29sb3IKKyAgICAgICAgb3V0bGluZSBpcyBvdXRsaW5lIGNvbG9yCisgICAgICAgIHRvcCBpcyBhIGJvb2xlYW4gdmFsdWUsIHdoaWNoIHNwZWNpZmllcyBpZiBwb2x5aXRlbQorICAgICAgICB3aWxsIGJlIHB1dCBvbiB0b3Agb2YgdGhlIGNhbnZhcycgZGlzcGxheWxpc3Qgc28gaXQKKyAgICAgICAgd2lsbCBub3QgYmUgY292ZXJlZCBieSBvdGhlciBpdGVtcy4KKyAgICAgICAgIiIiCisgICAgICAgIGNsID0gW10KKyAgICAgICAgZm9yIHgsIHkgaW4gY29vcmRsaXN0OgorICAgICAgICAgICAgY2wuYXBwZW5kKHggKiBzZWxmLnhzY2FsZSkKKyAgICAgICAgICAgIGNsLmFwcGVuZCgteSAqIHNlbGYueXNjYWxlKQorICAgICAgICBzZWxmLmN2LmNvb3Jkcyhwb2x5aXRlbSwgKmNsKQorICAgICAgICBpZiBmaWxsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jdi5pdGVtY29uZmlndXJlKHBvbHlpdGVtLCBmaWxsPWZpbGwpCisgICAgICAgIGlmIG91dGxpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmN2Lml0ZW1jb25maWd1cmUocG9seWl0ZW0sIG91dGxpbmU9b3V0bGluZSkKKyAgICAgICAgaWYgd2lkdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmN2Lml0ZW1jb25maWd1cmUocG9seWl0ZW0sIHdpZHRoPXdpZHRoKQorICAgICAgICBpZiB0b3A6CisgICAgICAgICAgICBzZWxmLmN2LnRhZ19yYWlzZShwb2x5aXRlbSkKKworICAgIGRlZiBfY3JlYXRlbGluZShzZWxmKToKKyAgICAgICAgIiIiQ3JlYXRlIGFuIGludmlzaWJsZSBsaW5lIGl0ZW0gb24gY2FudmFzIHNlbGYuY3YpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5jdi5jcmVhdGVfbGluZSgwLCAwLCAwLCAwLCBmaWxsPSIiLCB3aWR0aD0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBzdHlsZSA9IFRLLlJPVU5EKQorCisgICAgZGVmIF9kcmF3bGluZShzZWxmLCBsaW5laXRlbSwgY29vcmRsaXN0PU5vbmUsCisgICAgICAgICAgICAgICAgICBmaWxsPU5vbmUsIHdpZHRoPU5vbmUsIHRvcD1GYWxzZSk6CisgICAgICAgICIiIkNvbmZpZ3VyZSBsaW5laXRlbSBhY2NvcmRpbmcgdG8gcHJvdmlkZWQgYXJndW1lbnRzOgorICAgICAgICBjb29yZGxpc3QgaXMgc2VxdWVuY2Ugb2YgY29vcmRpbmF0ZXMKKyAgICAgICAgZmlsbCBpcyBkcmF3aW5nIGNvbG9yCisgICAgICAgIHdpZHRoIGlzIHdpZHRoIG9mIGRyYXduIGxpbmUuCisgICAgICAgIHRvcCBpcyBhIGJvb2xlYW4gdmFsdWUsIHdoaWNoIHNwZWNpZmllcyBpZiBwb2x5aXRlbQorICAgICAgICB3aWxsIGJlIHB1dCBvbiB0b3Agb2YgdGhlIGNhbnZhcycgZGlzcGxheWxpc3Qgc28gaXQKKyAgICAgICAgd2lsbCBub3QgYmUgY292ZXJlZCBieSBvdGhlciBpdGVtcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNvb3JkbGlzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNsID0gW10KKyAgICAgICAgICAgIGZvciB4LCB5IGluIGNvb3JkbGlzdDoKKyAgICAgICAgICAgICAgICBjbC5hcHBlbmQoeCAqIHNlbGYueHNjYWxlKQorICAgICAgICAgICAgICAgIGNsLmFwcGVuZCgteSAqIHNlbGYueXNjYWxlKQorICAgICAgICAgICAgc2VsZi5jdi5jb29yZHMobGluZWl0ZW0sICpjbCkKKyAgICAgICAgaWYgZmlsbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3YuaXRlbWNvbmZpZ3VyZShsaW5laXRlbSwgZmlsbD1maWxsKQorICAgICAgICBpZiB3aWR0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3YuaXRlbWNvbmZpZ3VyZShsaW5laXRlbSwgd2lkdGg9d2lkdGgpCisgICAgICAgIGlmIHRvcDoKKyAgICAgICAgICAgIHNlbGYuY3YudGFnX3JhaXNlKGxpbmVpdGVtKQorCisgICAgZGVmIF9kZWxldGUoc2VsZiwgaXRlbSk6CisgICAgICAgICIiIkRlbGV0ZSBncmFwaGljcyBpdGVtIGZyb20gY2FudmFzLgorICAgICAgICBJZiBpdGVtIGlzImFsbCIgZGVsZXRlIGFsbCBncmFwaGljcyBpdGVtcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY3YuZGVsZXRlKGl0ZW0pCisKKyAgICBkZWYgX3VwZGF0ZShzZWxmKToKKyAgICAgICAgIiIiUmVkcmF3IGdyYXBoaWNzIGl0ZW1zIG9uIGNhbnZhcworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jdi51cGRhdGUoKQorCisgICAgZGVmIF9kZWxheShzZWxmLCBkZWxheSk6CisgICAgICAgICIiIkRlbGF5IHN1YnNlcXVlbnQgY2FudmFzIGFjdGlvbnMgZm9yIGRlbGF5IG1zLiIiIgorICAgICAgICBzZWxmLmN2LmFmdGVyKGRlbGF5KQorCisgICAgZGVmIF9pc2NvbG9yc3RyaW5nKHNlbGYsIGNvbG9yKToKKyAgICAgICAgIiIiQ2hlY2sgaWYgdGhlIHN0cmluZyBjb2xvciBpcyBhIGxlZ2FsIFRraW50ZXIgY29sb3Igc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmdiID0gc2VsZi5jdi53aW5mb19yZ2IoY29sb3IpCisgICAgICAgICAgICBvayA9IFRydWUKKyAgICAgICAgZXhjZXB0IFRLLlRjbEVycm9yOgorICAgICAgICAgICAgb2sgPSBGYWxzZQorICAgICAgICByZXR1cm4gb2sKKworICAgIGRlZiBfYmdjb2xvcihzZWxmLCBjb2xvcj1Ob25lKToKKyAgICAgICAgIiIiU2V0IGNhbnZhcycgYmFja2dyb3VuZGNvbG9yIGlmIGNvbG9yIGlzIG5vdCBOb25lLAorICAgICAgICBlbHNlIHJldHVybiBiYWNrZ3JvdW5kY29sb3IuIiIiCisgICAgICAgIGlmIGNvbG9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jdi5jb25maWcoYmcgPSBjb2xvcikKKyAgICAgICAgICAgIHNlbGYuX3VwZGF0ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jdi5jZ2V0KCJiZyIpCisKKyAgICBkZWYgX3dyaXRlKHNlbGYsIHBvcywgdHh0LCBhbGlnbiwgZm9udCwgcGVuY29sb3IpOgorICAgICAgICAiIiJXcml0ZSB0eHQgYXQgcG9zIGluIGNhbnZhcyB3aXRoIHNwZWNpZmllZCBmb250CisgICAgICAgIGFuZCBjb2xvci4KKyAgICAgICAgUmV0dXJuIHRleHQgaXRlbSBhbmQgeC1jb29yZCBvZiByaWdodCBib3R0b20gY29ybmVyCisgICAgICAgIG9mIHRleHQncyBib3VuZGluZyBib3guIiIiCisgICAgICAgIHgsIHkgPSBwb3MKKyAgICAgICAgeCA9IHggKiBzZWxmLnhzY2FsZQorICAgICAgICB5ID0geSAqIHNlbGYueXNjYWxlCisgICAgICAgIGFuY2hvciA9IHsibGVmdCI6InN3IiwgImNlbnRlciI6InMiLCAicmlnaHQiOiJzZSIgfQorICAgICAgICBpdGVtID0gc2VsZi5jdi5jcmVhdGVfdGV4dCh4LTEsIC15LCB0ZXh0ID0gdHh0LCBhbmNob3IgPSBhbmNob3JbYWxpZ25dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBwZW5jb2xvciwgZm9udCA9IGZvbnQpCisgICAgICAgIHgwLCB5MCwgeDEsIHkxID0gc2VsZi5jdi5iYm94KGl0ZW0pCisgICAgICAgIHNlbGYuY3YudXBkYXRlKCkKKyAgICAgICAgcmV0dXJuIGl0ZW0sIHgxLTEKKworIyMgICAgZGVmIF9kb3Qoc2VsZiwgcG9zLCBzaXplLCBjb2xvcik6CisjIyAgICAgICAgIiIibWF5IGJlIGltcGxlbWVudGVkIGZvciBzb21lIG90aGVyIGdyYXBoaWNzIHRvb2xraXQiIiIKKworICAgIGRlZiBfb25jbGljayhzZWxmLCBpdGVtLCBmdW4sIG51bT0xLCBhZGQ9Tm9uZSk6CisgICAgICAgICIiIkJpbmQgZnVuIHRvIG1vdXNlLWNsaWNrIGV2ZW50IG9uIHR1cnRsZS4KKyAgICAgICAgZnVuIG11c3QgYmUgYSBmdW5jdGlvbiB3aXRoIHR3byBhcmd1bWVudHMsIHRoZSBjb29yZGluYXRlcworICAgICAgICBvZiB0aGUgY2xpY2tlZCBwb2ludCBvbiB0aGUgY2FudmFzLgorICAgICAgICBudW0sIHRoZSBudW1iZXIgb2YgdGhlIG1vdXNlLWJ1dHRvbiBkZWZhdWx0cyB0byAxCisgICAgICAgICIiIgorICAgICAgICBpZiBmdW4gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3YudGFnX3VuYmluZChpdGVtLCAiPEJ1dHRvbi0lcz4iICUgbnVtKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVmIGV2ZW50ZnVuKGV2ZW50KToKKyAgICAgICAgICAgICAgICB4LCB5ID0gKHNlbGYuY3YuY2FudmFzeChldmVudC54KS9zZWxmLnhzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1zZWxmLmN2LmNhbnZhc3koZXZlbnQueSkvc2VsZi55c2NhbGUpCisgICAgICAgICAgICAgICAgZnVuKHgsIHkpCisgICAgICAgICAgICBzZWxmLmN2LnRhZ19iaW5kKGl0ZW0sICI8QnV0dG9uLSVzPiIgJSBudW0sIGV2ZW50ZnVuLCBhZGQpCisKKyAgICBkZWYgX29ucmVsZWFzZShzZWxmLCBpdGVtLCBmdW4sIG51bT0xLCBhZGQ9Tm9uZSk6CisgICAgICAgICIiIkJpbmQgZnVuIHRvIG1vdXNlLWJ1dHRvbi1yZWxlYXNlIGV2ZW50IG9uIHR1cnRsZS4KKyAgICAgICAgZnVuIG11c3QgYmUgYSBmdW5jdGlvbiB3aXRoIHR3byBhcmd1bWVudHMsIHRoZSBjb29yZGluYXRlcworICAgICAgICBvZiB0aGUgcG9pbnQgb24gdGhlIGNhbnZhcyB3aGVyZSBtb3VzZSBidXR0b24gaXMgcmVsZWFzZWQuCisgICAgICAgIG51bSwgdGhlIG51bWJlciBvZiB0aGUgbW91c2UtYnV0dG9uIGRlZmF1bHRzIHRvIDEKKworICAgICAgICBJZiBhIHR1cnRsZSBpcyBjbGlja2VkLCBmaXJzdCBfb25jbGljay1ldmVudCB3aWxsIGJlIHBlcmZvcm1lZCwKKyAgICAgICAgdGhlbiBfb25zY3JlZW5zY2xpY2stZXZlbnQuCisgICAgICAgICIiIgorICAgICAgICBpZiBmdW4gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3YudGFnX3VuYmluZChpdGVtLCAiPEJ1dHRvbiVzLUJ1dHRvblJlbGVhc2U+IiAlIG51bSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlZiBldmVudGZ1bihldmVudCk6CisgICAgICAgICAgICAgICAgeCwgeSA9IChzZWxmLmN2LmNhbnZhc3goZXZlbnQueCkvc2VsZi54c2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5jdi5jYW52YXN5KGV2ZW50LnkpL3NlbGYueXNjYWxlKQorICAgICAgICAgICAgICAgIGZ1bih4LCB5KQorICAgICAgICAgICAgc2VsZi5jdi50YWdfYmluZChpdGVtLCAiPEJ1dHRvbiVzLUJ1dHRvblJlbGVhc2U+IiAlIG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRmdW4sIGFkZCkKKworICAgIGRlZiBfb25kcmFnKHNlbGYsIGl0ZW0sIGZ1biwgbnVtPTEsIGFkZD1Ob25lKToKKyAgICAgICAgIiIiQmluZCBmdW4gdG8gbW91c2UtbW92ZS1ldmVudCAod2l0aCBwcmVzc2VkIG1vdXNlIGJ1dHRvbikgb24gdHVydGxlLgorICAgICAgICBmdW4gbXVzdCBiZSBhIGZ1bmN0aW9uIHdpdGggdHdvIGFyZ3VtZW50cywgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZQorICAgICAgICBhY3R1YWwgbW91c2UgcG9zaXRpb24gb24gdGhlIGNhbnZhcy4KKyAgICAgICAgbnVtLCB0aGUgbnVtYmVyIG9mIHRoZSBtb3VzZS1idXR0b24gZGVmYXVsdHMgdG8gMQorCisgICAgICAgIEV2ZXJ5IHNlcXVlbmNlIG9mIG1vdXNlLW1vdmUtZXZlbnRzIG9uIGEgdHVydGxlIGlzIHByZWNlZGVkIGJ5IGEKKyAgICAgICAgbW91c2UtY2xpY2sgZXZlbnQgb24gdGhhdCB0dXJ0bGUuCisgICAgICAgICIiIgorICAgICAgICBpZiBmdW4gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3YudGFnX3VuYmluZChpdGVtLCAiPEJ1dHRvbiVzLU1vdGlvbj4iICUgbnVtKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVmIGV2ZW50ZnVuKGV2ZW50KToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHgsIHkgPSAoc2VsZi5jdi5jYW52YXN4KGV2ZW50LngpL3NlbGYueHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLXNlbGYuY3YuY2FudmFzeShldmVudC55KS9zZWxmLnlzY2FsZSkKKyAgICAgICAgICAgICAgICAgICAgZnVuKHgsIHkpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLmN2LnRhZ19iaW5kKGl0ZW0sICI8QnV0dG9uJXMtTW90aW9uPiIgJSBudW0sIGV2ZW50ZnVuLCBhZGQpCisKKyAgICBkZWYgX29uc2NyZWVuY2xpY2soc2VsZiwgZnVuLCBudW09MSwgYWRkPU5vbmUpOgorICAgICAgICAiIiJCaW5kIGZ1biB0byBtb3VzZS1jbGljayBldmVudCBvbiBjYW52YXMuCisgICAgICAgIGZ1biBtdXN0IGJlIGEgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzLCB0aGUgY29vcmRpbmF0ZXMKKyAgICAgICAgb2YgdGhlIGNsaWNrZWQgcG9pbnQgb24gdGhlIGNhbnZhcy4KKyAgICAgICAgbnVtLCB0aGUgbnVtYmVyIG9mIHRoZSBtb3VzZS1idXR0b24gZGVmYXVsdHMgdG8gMQorCisgICAgICAgIElmIGEgdHVydGxlIGlzIGNsaWNrZWQsIGZpcnN0IF9vbmNsaWNrLWV2ZW50IHdpbGwgYmUgcGVyZm9ybWVkLAorICAgICAgICB0aGVuIF9vbnNjcmVlbnNjbGljay1ldmVudC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZ1biBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jdi51bmJpbmQoIjxCdXR0b24tJXM+IiAlIG51bSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlZiBldmVudGZ1bihldmVudCk6CisgICAgICAgICAgICAgICAgeCwgeSA9IChzZWxmLmN2LmNhbnZhc3goZXZlbnQueCkvc2VsZi54c2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5jdi5jYW52YXN5KGV2ZW50LnkpL3NlbGYueXNjYWxlKQorICAgICAgICAgICAgICAgIGZ1bih4LCB5KQorICAgICAgICAgICAgc2VsZi5jdi5iaW5kKCI8QnV0dG9uLSVzPiIgJSBudW0sIGV2ZW50ZnVuLCBhZGQpCisKKyAgICBkZWYgX29ua2V5KHNlbGYsIGZ1biwga2V5KToKKyAgICAgICAgIiIiQmluZCBmdW4gdG8ga2V5LXJlbGVhc2UgZXZlbnQgb2Yga2V5LgorICAgICAgICBDYW52YXMgbXVzdCBoYXZlIGZvY3VzLiBTZWUgbWV0aG9kIGxpc3RlbgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZnVuIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmN2LnVuYmluZCgiPEtleVJlbGVhc2UtJXM+IiAlIGtleSwgTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlZiBldmVudGZ1bihldmVudCk6CisgICAgICAgICAgICAgICAgZnVuKCkKKyAgICAgICAgICAgIHNlbGYuY3YuYmluZCgiPEtleVJlbGVhc2UtJXM+IiAlIGtleSwgZXZlbnRmdW4pCisKKyAgICBkZWYgX2xpc3RlbihzZWxmKToKKyAgICAgICAgIiIiU2V0IGZvY3VzIG9uIGNhbnZhcyAoaW4gb3JkZXIgdG8gY29sbGVjdCBrZXktZXZlbnRzKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jdi5mb2N1c19mb3JjZSgpCisKKyAgICBkZWYgX29udGltZXIoc2VsZiwgZnVuLCB0KToKKyAgICAgICAgIiIiSW5zdGFsbCBhIHRpbWVyLCB3aGljaCBjYWxscyBmdW4gYWZ0ZXIgdCBtaWxsaXNlY29uZHMuCisgICAgICAgICIiIgorICAgICAgICBpZiB0ID09IDA6CisgICAgICAgICAgICBzZWxmLmN2LmFmdGVyX2lkbGUoZnVuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jdi5hZnRlcih0LCBmdW4pCisKKyAgICBkZWYgX2NyZWF0ZWltYWdlKHNlbGYsIGltYWdlKToKKyAgICAgICAgIiIiQ3JlYXRlIGFuZCByZXR1cm4gaW1hZ2UgaXRlbSBvbiBjYW52YXMuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5jdi5jcmVhdGVfaW1hZ2UoMCwgMCwgaW1hZ2U9aW1hZ2UpCisKKyAgICBkZWYgX2RyYXdpbWFnZShzZWxmLCBpdGVtLCAoeCwgeSksIGltYWdlKToKKyAgICAgICAgIiIiQ29uZmlndXJlIGltYWdlIGl0ZW0gYXMgdG8gZHJhdyBpbWFnZSBvYmplY3QKKyAgICAgICAgYXQgcG9zaXRpb24gKHgseSkgb24gY2FudmFzKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jdi5jb29yZHMoaXRlbSwgKHggKiBzZWxmLnhzY2FsZSwgLXkgKiBzZWxmLnlzY2FsZSkpCisgICAgICAgIHNlbGYuY3YuaXRlbWNvbmZpZyhpdGVtLCBpbWFnZT1pbWFnZSkKKworICAgIGRlZiBfc2V0YmdwaWMoc2VsZiwgaXRlbSwgaW1hZ2UpOgorICAgICAgICAiIiJDb25maWd1cmUgaW1hZ2UgaXRlbSBhcyB0byBkcmF3IGltYWdlIG9iamVjdAorICAgICAgICBhdCBjZW50ZXIgb2YgY2FudmFzLiBTZXQgaXRlbSB0byB0aGUgZmlyc3QgaXRlbQorICAgICAgICBpbiB0aGUgZGlzcGxheWxpc3QsIHNvIGl0IHdpbGwgYmUgZHJhd24gYmVsb3cKKyAgICAgICAgYW55IG90aGVyIGl0ZW0gLiIiIgorICAgICAgICBzZWxmLmN2Lml0ZW1jb25maWcoaXRlbSwgaW1hZ2U9aW1hZ2UpCisgICAgICAgIHNlbGYuY3YudGFnX2xvd2VyKGl0ZW0pCisKKyAgICBkZWYgX3R5cGUoc2VsZiwgaXRlbSk6CisgICAgICAgICIiIlJldHVybiAnbGluZScgb3IgJ3BvbHlnb24nIG9yICdpbWFnZScgZGVwZW5kaW5nIG9uCisgICAgICAgIHR5cGUgb2YgaXRlbS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmN2LnR5cGUoaXRlbSkKKworICAgIGRlZiBfcG9pbnRsaXN0KHNlbGYsIGl0ZW0pOgorICAgICAgICAiIiJyZXR1cm5zIGxpc3Qgb2YgY29vcmRpbmF0ZS1wYWlycyBvZiBwb2ludHMgb2YgaXRlbQorICAgICAgICBFeGFtcGxlIChmb3IgaW5zaWRlcnMpOgorICAgICAgICA+Pj4gZnJvbSB0dXJ0bGUgaW1wb3J0ICoKKyAgICAgICAgPj4+IGdldHNjcmVlbigpLl9wb2ludGxpc3QoZ2V0dHVydGxlKCkudHVydGxlLl9pdGVtKQorICAgICAgICBbKDAuMCwgOS45OTk5OTk5OTk5OTk5OTgyKSwgKDAuMCwgLTkuOTk5OTk5OTk5OTk5OTk4MiksCisgICAgICAgICg5Ljk5OTk5OTk5OTk5OTk5ODIsIDAuMCldCisgICAgICAgID4+PiAiIiIKKyAgICAgICAgY2wgPSBzZWxmLmN2LmNvb3JkcyhpdGVtKQorICAgICAgICBwbCA9IFsoY2xbaV0sIC1jbFtpKzFdKSBmb3IgaSBpbiByYW5nZSgwLCBsZW4oY2wpLCAyKV0KKyAgICAgICAgcmV0dXJuICBwbAorCisgICAgZGVmIF9zZXRzY3JvbGxyZWdpb24oc2VsZiwgc3J4MSwgc3J5MSwgc3J4Miwgc3J5Mik6CisgICAgICAgIHNlbGYuY3YuY29uZmlnKHNjcm9sbHJlZ2lvbj0oc3J4MSwgc3J5MSwgc3J4Miwgc3J5MikpCisKKyAgICBkZWYgX3Jlc2NhbGUoc2VsZiwgeHNjYWxlZmFjdG9yLCB5c2NhbGVmYWN0b3IpOgorICAgICAgICBpdGVtcyA9IHNlbGYuY3YuZmluZF9hbGwoKQorICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKKyAgICAgICAgICAgIGNvb3JkaW5hdGVzID0gc2VsZi5jdi5jb29yZHMoaXRlbSkKKyAgICAgICAgICAgIG5ld2Nvb3JkbGlzdCA9IFtdCisgICAgICAgICAgICB3aGlsZSBjb29yZGluYXRlczoKKyAgICAgICAgICAgICAgICB4LCB5ID0gY29vcmRpbmF0ZXNbOjJdCisgICAgICAgICAgICAgICAgbmV3Y29vcmRsaXN0LmFwcGVuZCh4ICogeHNjYWxlZmFjdG9yKQorICAgICAgICAgICAgICAgIG5ld2Nvb3JkbGlzdC5hcHBlbmQoeSAqIHlzY2FsZWZhY3RvcikKKyAgICAgICAgICAgICAgICBjb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzWzI6XQorICAgICAgICAgICAgc2VsZi5jdi5jb29yZHMoaXRlbSwgKm5ld2Nvb3JkbGlzdCkKKworICAgIGRlZiBfcmVzaXplKHNlbGYsIGNhbnZ3aWR0aD1Ob25lLCBjYW52aGVpZ2h0PU5vbmUsIGJnPU5vbmUpOgorICAgICAgICAiIiJSZXNpemUgdGhlIGNhbnZhcyB0aGUgdHVydGxlcyBhcmUgZHJhd2luZyBvbi4gRG9lcworICAgICAgICBub3QgYWx0ZXIgdGhlIGRyYXdpbmcgd2luZG93LgorICAgICAgICAiIiIKKyAgICAgICAgIyBuZWVkcyBhbWVuZG1lbnQKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5jdiwgU2Nyb2xsZWRDYW52YXMpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2FudndpZHRoLCBzZWxmLmNhbnZoZWlnaHQKKyAgICAgICAgaWYgY2FudndpZHRoIGlzIGNhbnZoZWlnaHQgaXMgYmcgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmN2LmNhbnZ3aWR0aCwgc2VsZi5jdi5jYW52aGVpZ2h0CisgICAgICAgIGlmIGNhbnZ3aWR0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY2FudndpZHRoID0gY2FudndpZHRoCisgICAgICAgIGlmIGNhbnZoZWlnaHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmNhbnZoZWlnaHQgPSBjYW52aGVpZ2h0CisgICAgICAgIHNlbGYuY3YucmVzZXQoY2FudndpZHRoLCBjYW52aGVpZ2h0LCBiZykKKworICAgIGRlZiBfd2luZG93X3NpemUoc2VsZik6CisgICAgICAgICIiIiBSZXR1cm4gdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIHR1cnRsZSB3aW5kb3cuCisgICAgICAgICIiIgorICAgICAgICB3aWR0aCA9IHNlbGYuY3Yud2luZm9fd2lkdGgoKQorICAgICAgICBpZiB3aWR0aCA8PSAxOiAgIyB0aGUgd2luZG93IGlzbid0IG1hbmFnZWQgYnkgYSBnZW9tZXRyeSBtYW5hZ2VyCisgICAgICAgICAgICB3aWR0aCA9IHNlbGYuY3ZbJ3dpZHRoJ10KKyAgICAgICAgaGVpZ2h0ID0gc2VsZi5jdi53aW5mb19oZWlnaHQoKQorICAgICAgICBpZiBoZWlnaHQgPD0gMTogIyB0aGUgd2luZG93IGlzbid0IG1hbmFnZWQgYnkgYSBnZW9tZXRyeSBtYW5hZ2VyCisgICAgICAgICAgICBoZWlnaHQgPSBzZWxmLmN2WydoZWlnaHQnXQorICAgICAgICByZXR1cm4gd2lkdGgsIGhlaWdodAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjICAgICAgICAgICAgICAgICAgRW5kIG9mIFRraW50ZXIgLSBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCitjbGFzcyBUZXJtaW5hdG9yIChFeGNlcHRpb24pOgorICAgICIiIldpbGwgYmUgcmFpc2VkIGluIFR1cnRsZVNjcmVlbi51cGRhdGUsIGlmIF9SVU5OSU5HIGJlY29tZXMgRmFsc2UuCisKKyAgICBUaGlzIHN0b3BzIGV4ZWN1dGlvbiBvZiBhIHR1cnRsZSBncmFwaGljcyBzY3JpcHQuCisgICAgTWFpbiBwdXJwb3NlOiB1c2UgaW4gdGhlIERlbW8tVmlld2VyIHR1cnRsZS5EZW1vLnB5LgorICAgICIiIgorICAgIHBhc3MKKworCitjbGFzcyBUdXJ0bGVHcmFwaGljc0Vycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiU29tZSBUdXJ0bGVHcmFwaGljcyBFcnJvcgorICAgICIiIgorCisKK2NsYXNzIFNoYXBlKG9iamVjdCk6CisgICAgIiIiRGF0YSBzdHJ1Y3R1cmUgbW9kZWxpbmcgc2hhcGVzLgorCisgICAgYXR0cmlidXRlIF90eXBlIGlzIG9uZSBvZiAicG9seWdvbiIsICJpbWFnZSIsICJjb21wb3VuZCIKKyAgICBhdHRyaWJ1dGUgX2RhdGEgaXMgLSBkZXBlbmRpbmcgb24gX3R5cGUgYSBwb3lnb24tdHVwbGUsCisgICAgYW4gaW1hZ2Ugb3IgYSBsaXN0IGNvbnN0cnVjdGVkIHVzaW5nIHRoZSBhZGRjb21wb25lbnQgbWV0aG9kLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlXywgZGF0YT1Ob25lKToKKyAgICAgICAgc2VsZi5fdHlwZSA9IHR5cGVfCisgICAgICAgIGlmIHR5cGVfID09ICJwb2x5Z29uIjoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgbGlzdCk6CisgICAgICAgICAgICAgICAgZGF0YSA9IHR1cGxlKGRhdGEpCisgICAgICAgIGVsaWYgdHlwZV8gPT0gImltYWdlIjoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgc3RyKToKKyAgICAgICAgICAgICAgICBpZiBkYXRhLmxvd2VyKCkuZW5kc3dpdGgoIi5naWYiKSBhbmQgaXNmaWxlKGRhdGEpOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gVHVydGxlU2NyZWVuLl9pbWFnZShkYXRhKQorICAgICAgICAgICAgICAgICMgZWxzZSBkYXRhIGFzc3VtZWQgdG8gYmUgUGhvdG9pbWFnZQorICAgICAgICBlbGlmIHR5cGVfID09ICJjb21wb3VuZCI6CisgICAgICAgICAgICBkYXRhID0gW10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR1cnRsZUdyYXBoaWNzRXJyb3IoIlRoZXJlIGlzIG5vIHNoYXBlIHR5cGUgJXMiICUgdHlwZV8pCisgICAgICAgIHNlbGYuX2RhdGEgPSBkYXRhCisKKyAgICBkZWYgYWRkY29tcG9uZW50KHNlbGYsIHBvbHksIGZpbGwsIG91dGxpbmU9Tm9uZSk6CisgICAgICAgICIiIkFkZCBjb21wb25lbnQgdG8gYSBzaGFwZSBvZiB0eXBlIGNvbXBvdW5kLgorCisgICAgICAgIEFyZ3VtZW50czogcG9seSBpcyBhIHBvbHlnb24sIGkuIGUuIGEgdHVwbGUgb2YgbnVtYmVyIHBhaXJzLgorICAgICAgICBmaWxsIGlzIHRoZSBmaWxsY29sb3Igb2YgdGhlIGNvbXBvbmVudCwKKyAgICAgICAgb3V0bGluZSBpcyB0aGUgb3V0bGluZSBjb2xvciBvZiB0aGUgY29tcG9uZW50LgorCisgICAgICAgIGNhbGwgKGZvciBhIFNoYXBlb2JqZWN0IG5hbWVuZCBzKToKKyAgICAgICAgLS0gICBzLmFkZGNvbXBvbmVudCgoKDAsMCksICgxMCwxMCksICgtMTAsMTApKSwgInJlZCIsICJibHVlIikKKworICAgICAgICBFeGFtcGxlOgorICAgICAgICA+Pj4gcG9seSA9ICgoMCwwKSwoMTAsLTUpLCgwLDEwKSwoLTEwLC01KSkKKyAgICAgICAgPj4+IHMgPSBTaGFwZSgiY29tcG91bmQiKQorICAgICAgICA+Pj4gcy5hZGRjb21wb25lbnQocG9seSwgInJlZCIsICJibHVlIikKKyAgICAgICAgPj4+ICMgLi4gYWRkIG1vcmUgY29tcG9uZW50cyBhbmQgdGhlbiB1c2UgcmVnaXN0ZXJfc2hhcGUoKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fdHlwZSAhPSAiY29tcG91bmQiOgorICAgICAgICAgICAgcmFpc2UgVHVydGxlR3JhcGhpY3NFcnJvcigiQ2Fubm90IGFkZCBjb21wb25lbnQgdG8gJXMgU2hhcGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBzZWxmLl90eXBlKQorICAgICAgICBpZiBvdXRsaW5lIGlzIE5vbmU6CisgICAgICAgICAgICBvdXRsaW5lID0gZmlsbAorICAgICAgICBzZWxmLl9kYXRhLmFwcGVuZChbcG9seSwgZmlsbCwgb3V0bGluZV0pCisKKworY2xhc3MgVGJ1ZmZlcihvYmplY3QpOgorICAgICIiIlJpbmcgYnVmZmVyIHVzZWQgYXMgdW5kb2J1ZmZlciBmb3IgUmF3VHVydGxlIG9iamVjdHMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1ZnNpemU9MTApOgorICAgICAgICBzZWxmLmJ1ZnNpemUgPSBidWZzaXplCisgICAgICAgIHNlbGYuYnVmZmVyID0gW1tOb25lXV0gKiBidWZzaXplCisgICAgICAgIHNlbGYucHRyID0gLTEKKyAgICAgICAgc2VsZi5jdW11bGF0ZSA9IEZhbHNlCisgICAgZGVmIHJlc2V0KHNlbGYsIGJ1ZnNpemU9Tm9uZSk6CisgICAgICAgIGlmIGJ1ZnNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuYnVmc2l6ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5idWZmZXJbaV0gPSBbTm9uZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYnVmc2l6ZSA9IGJ1ZnNpemUKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gW1tOb25lXV0gKiBidWZzaXplCisgICAgICAgIHNlbGYucHRyID0gLTEKKyAgICBkZWYgcHVzaChzZWxmLCBpdGVtKToKKyAgICAgICAgaWYgc2VsZi5idWZzaXplID4gMDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmN1bXVsYXRlOgorICAgICAgICAgICAgICAgIHNlbGYucHRyID0gKHNlbGYucHRyICsgMSkgJSBzZWxmLmJ1ZnNpemUKKyAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlcltzZWxmLnB0cl0gPSBpdGVtCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyW3NlbGYucHRyXS5hcHBlbmQoaXRlbSkKKyAgICBkZWYgcG9wKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmJ1ZnNpemUgPiAwOgorICAgICAgICAgICAgaXRlbSA9IHNlbGYuYnVmZmVyW3NlbGYucHRyXQorICAgICAgICAgICAgaWYgaXRlbSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyW3NlbGYucHRyXSA9IFtOb25lXQorICAgICAgICAgICAgICAgIHNlbGYucHRyID0gKHNlbGYucHRyIC0gMSkgJSBzZWxmLmJ1ZnNpemUKKyAgICAgICAgICAgICAgICByZXR1cm4gKGl0ZW0pCisgICAgZGVmIG5yX29mX2l0ZW1zKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5idWZzaXplIC0gc2VsZi5idWZmZXIuY291bnQoW05vbmVdKQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLmJ1ZmZlcikgKyAiICIgKyBzdHIoc2VsZi5wdHIpCisKKworCitjbGFzcyBUdXJ0bGVTY3JlZW4oVHVydGxlU2NyZWVuQmFzZSk6CisgICAgIiIiUHJvdmlkZXMgc2NyZWVuIG9yaWVudGVkIG1ldGhvZHMgbGlrZSBzZXRiZyBldGMuCisKKyAgICBPbmx5IHJlbGllcyB1cG9uIHRoZSBtZXRob2RzIG9mIFR1cnRsZVNjcmVlbkJhc2UgYW5kIE5PVAorICAgIHVwb24gY29tcG9uZW50cyBvZiB0aGUgdW5kZXJseWluZyBncmFwaGljcyB0b29sa2l0IC0KKyAgICB3aGljaCBpcyBUa2ludGVyIGluIHRoaXMgY2FzZS4KKyAgICAiIiIKKyMgICAgX1NUQU5EQVJEX0RFTEFZID0gNQorICAgIF9SVU5OSU5HID0gVHJ1ZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGN2LCBtb2RlPV9DRkdbIm1vZGUiXSwKKyAgICAgICAgICAgICAgICAgY29sb3Jtb2RlPV9DRkdbImNvbG9ybW9kZSJdLCBkZWxheT1fQ0ZHWyJkZWxheSJdKToKKyAgICAgICAgc2VsZi5fc2hhcGVzID0geworICAgICAgICAgICAgICAgICAgICJhcnJvdyIgOiBTaGFwZSgicG9seWdvbiIsICgoLTEwLDApLCAoMTAsMCksICgwLDEwKSkpLAorICAgICAgICAgICAgICAgICAgInR1cnRsZSIgOiBTaGFwZSgicG9seWdvbiIsICgoMCwxNiksICgtMiwxNCksICgtMSwxMCksICgtNCw3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNyw5KSwgKC05LDgpLCAoLTYsNSksICgtNywxKSwgKC01LC0zKSwgKC04LC02KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNiwtOCksICgtNCwtNSksICgwLC03KSwgKDQsLTUpLCAoNiwtOCksICg4LC02KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1LC0zKSwgKDcsMSksICg2LDUpLCAoOSw4KSwgKDcsOSksICg0LDcpLCAoMSwxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwxNCkpKSwKKyAgICAgICAgICAgICAgICAgICJjaXJjbGUiIDogU2hhcGUoInBvbHlnb24iLCAoKDEwLDApLCAoOS41MSwzLjA5KSwgKDguMDksNS44OCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNS44OCw4LjA5KSwgKDMuMDksOS41MSksICgwLDEwKSwgKC0zLjA5LDkuNTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC01Ljg4LDguMDkpLCAoLTguMDksNS44OCksICgtOS41MSwzLjA5KSwgKC0xMCwwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtOS41MSwtMy4wOSksICgtOC4wOSwtNS44OCksICgtNS44OCwtOC4wOSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuMDksLTkuNTEpLCAoLTAuMDAsLTEwLjAwKSwgKDMuMDksLTkuNTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUuODgsLTguMDkpLCAoOC4wOSwtNS44OCksICg5LjUxLC0zLjA5KSkpLAorICAgICAgICAgICAgICAgICAgInNxdWFyZSIgOiBTaGFwZSgicG9seWdvbiIsICgoMTAsLTEwKSwgKDEwLDEwKSwgKC0xMCwxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEwLC0xMCkpKSwKKyAgICAgICAgICAgICAgICAidHJpYW5nbGUiIDogU2hhcGUoInBvbHlnb24iLCAoKDEwLC01Ljc3KSwgKDAsMTEuNTUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xMCwtNS43NykpKSwKKyAgICAgICAgICAgICAgICAgICJjbGFzc2ljIjogU2hhcGUoInBvbHlnb24iLCAoKDAsMCksKC01LC05KSwoMCwtNyksKDUsLTkpKSksCisgICAgICAgICAgICAgICAgICAgImJsYW5rIiA6IFNoYXBlKCJpbWFnZSIsIHNlbGYuX2JsYW5raW1hZ2UoKSkKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICBzZWxmLl9iZ3BpY3MgPSB7Im5vcGljIiA6ICIifQorCisgICAgICAgIFR1cnRsZVNjcmVlbkJhc2UuX19pbml0X18oc2VsZiwgY3YpCisgICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCisgICAgICAgIHNlbGYuX2RlbGF5dmFsdWUgPSBkZWxheQorICAgICAgICBzZWxmLl9jb2xvcm1vZGUgPSBfQ0ZHWyJjb2xvcm1vZGUiXQorICAgICAgICBzZWxmLl9rZXlzID0gW10KKyAgICAgICAgc2VsZi5jbGVhcigpCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgICIiIkRlbGV0ZSBhbGwgZHJhd2luZ3MgYW5kIGFsbCB0dXJ0bGVzIGZyb20gdGhlIFR1cnRsZVNjcmVlbi4KKworICAgICAgICBSZXNldCBlbXB0eSBUdXJ0bGVTY3JlZW4gdG8gaXRzIGluaXRpYWwgc3RhdGU6IHdoaXRlIGJhY2tncm91bmQsCisgICAgICAgIG5vIGJhY2tncm91bmRpbWFnZSwgbm8gZXZlbnRiaW5kaW5ncyBhbmQgdHJhY2luZyBvbi4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi5jbGVhcigpCisKKyAgICAgICAgTm90ZTogdGhpcyBtZXRob2QgaXMgbm90IGF2YWlsYWJsZSBhcyBmdW5jdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2RlbGF5dmFsdWUgPSBfQ0ZHWyJkZWxheSJdCisgICAgICAgIHNlbGYuX2NvbG9ybW9kZSA9IF9DRkdbImNvbG9ybW9kZSJdCisgICAgICAgIHNlbGYuX2RlbGV0ZSgiYWxsIikKKyAgICAgICAgc2VsZi5fYmdwaWMgPSBzZWxmLl9jcmVhdGVpbWFnZSgiIikKKyAgICAgICAgc2VsZi5fYmdwaWNuYW1lID0gIm5vcGljIgorICAgICAgICBzZWxmLl90cmFjaW5nID0gMQorICAgICAgICBzZWxmLl91cGRhdGVjb3VudGVyID0gMAorICAgICAgICBzZWxmLl90dXJ0bGVzID0gW10KKyAgICAgICAgc2VsZi5iZ2NvbG9yKCJ3aGl0ZSIpCisgICAgICAgIGZvciBidG4gaW4gMSwgMiwgMzoKKyAgICAgICAgICAgIHNlbGYub25jbGljayhOb25lLCBidG4pCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fa2V5c1s6XToKKyAgICAgICAgICAgIHNlbGYub25rZXkoTm9uZSwga2V5KQorICAgICAgICBUdXJ0bGUuX3BlbiA9IE5vbmUKKworICAgIGRlZiBtb2RlKHNlbGYsIG1vZGU9Tm9uZSk6CisgICAgICAgICIiIlNldCB0dXJ0bGUtbW9kZSAoJ3N0YW5kYXJkJywgJ2xvZ28nIG9yICd3b3JsZCcpIGFuZCBwZXJmb3JtIHJlc2V0LgorCisgICAgICAgIE9wdGlvbmFsIGFyZ3VtZW50OgorICAgICAgICBtb2RlIC0tIG9uIG9mIHRoZSBzdHJpbmdzICdzdGFuZGFyZCcsICdsb2dvJyBvciAnd29ybGQnCisKKyAgICAgICAgTW9kZSAnc3RhbmRhcmQnIGlzIGNvbXBhdGlibGUgd2l0aCB0dXJ0bGUucHkuCisgICAgICAgIE1vZGUgJ2xvZ28nIGlzIGNvbXBhdGlibGUgd2l0aCBtb3N0IExvZ28tVHVydGxlLUdyYXBoaWNzLgorICAgICAgICBNb2RlICd3b3JsZCcgdXNlcyB1c2VyZGVmaW5lZCAnd29ybGRjb29yZGluYXRlcycuICpBdHRlbnRpb24qOiBpbgorICAgICAgICB0aGlzIG1vZGUgYW5nbGVzIGFwcGVhciBkaXN0b3J0ZWQgaWYgeC95IHVuaXQtcmF0aW8gZG9lc24ndCBlcXVhbCAxLgorICAgICAgICBJZiBtb2RlIGlzIG5vdCBnaXZlbiwgcmV0dXJuIHRoZSBjdXJyZW50IG1vZGUuCisKKyAgICAgICAgICAgICBNb2RlICAgICAgSW5pdGlhbCB0dXJ0bGUgaGVhZGluZyAgICAgcG9zaXRpdmUgYW5nbGVzCisgICAgICAgICAtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgJ3N0YW5kYXJkJyAgICB0byB0aGUgcmlnaHQgKGVhc3QpICAgICAgIGNvdW50ZXJjbG9ja3dpc2UKKyAgICAgICAgICAgICdsb2dvJyAgICAgICAgdXB3YXJkICAgIChub3J0aCkgICAgICAgICBjbG9ja3dpc2UKKworICAgICAgICBFeGFtcGxlczoKKyAgICAgICAgPj4+IG1vZGUoJ2xvZ28nKSAgICMgcmVzZXRzIHR1cnRsZSBoZWFkaW5nIHRvIG5vcnRoCisgICAgICAgID4+PiBtb2RlKCkKKyAgICAgICAgJ2xvZ28nCisgICAgICAgICIiIgorICAgICAgICBpZiBtb2RlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbW9kZQorICAgICAgICBtb2RlID0gbW9kZS5sb3dlcigpCisgICAgICAgIGlmIG1vZGUgbm90IGluIFsic3RhbmRhcmQiLCAibG9nbyIsICJ3b3JsZCJdOgorICAgICAgICAgICAgcmFpc2UgVHVydGxlR3JhcGhpY3NFcnJvcigiTm8gdHVydGxlLWdyYXBoaWNzLW1vZGUgJXMiICUgbW9kZSkKKyAgICAgICAgc2VsZi5fbW9kZSA9IG1vZGUKKyAgICAgICAgaWYgbW9kZSBpbiBbInN0YW5kYXJkIiwgImxvZ28iXToKKyAgICAgICAgICAgIHNlbGYuX3NldHNjcm9sbHJlZ2lvbigtc2VsZi5jYW52d2lkdGgvLzIsIC1zZWxmLmNhbnZoZWlnaHQvLzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhbnZ3aWR0aC8vMiwgc2VsZi5jYW52aGVpZ2h0Ly8yKQorICAgICAgICAgICAgc2VsZi54c2NhbGUgPSBzZWxmLnlzY2FsZSA9IDEuMAorICAgICAgICBzZWxmLnJlc2V0KCkKKworICAgIGRlZiBzZXR3b3JsZGNvb3JkaW5hdGVzKHNlbGYsIGxseCwgbGx5LCB1cngsIHVyeSk6CisgICAgICAgICIiIlNldCB1cCBhIHVzZXIgZGVmaW5lZCBjb29yZGluYXRlLXN5c3RlbS4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIGxseCAtLSBhIG51bWJlciwgeC1jb29yZGluYXRlIG9mIGxvd2VyIGxlZnQgY29ybmVyIG9mIGNhbnZhcworICAgICAgICBsbHkgLS0gYSBudW1iZXIsIHktY29vcmRpbmF0ZSBvZiBsb3dlciBsZWZ0IGNvcm5lciBvZiBjYW52YXMKKyAgICAgICAgdXJ4IC0tIGEgbnVtYmVyLCB4LWNvb3JkaW5hdGUgb2YgdXBwZXIgcmlnaHQgY29ybmVyIG9mIGNhbnZhcworICAgICAgICB1cnkgLS0gYSBudW1iZXIsIHktY29vcmRpbmF0ZSBvZiB1cHBlciByaWdodCBjb3JuZXIgb2YgY2FudmFzCisKKyAgICAgICAgU2V0IHVwIHVzZXIgY29vZGluYXQtc3lzdGVtIGFuZCBzd2l0Y2ggdG8gbW9kZSAnd29ybGQnIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgVGhpcyBwZXJmb3JtcyBhIHNjcmVlbi5yZXNldC4gSWYgbW9kZSAnd29ybGQnIGlzIGFscmVhZHkgYWN0aXZlLAorICAgICAgICBhbGwgZHJhd2luZ3MgYXJlIHJlZHJhd24gYWNjb3JkaW5nIHRvIHRoZSBuZXcgY29vcmRpbmF0ZXMuCisKKyAgICAgICAgQnV0IEFUVEVOVElPTjogaW4gdXNlci1kZWZpbmVkIGNvb3JkaW5hdGVzeXN0ZW1zIGFuZ2xlcyBtYXkgYXBwZWFyCisgICAgICAgIGRpc3RvcnRlZC4gKHNlZSBTY3JlZW4ubW9kZSgpKQorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLnNldHdvcmxkY29vcmRpbmF0ZXMoLTEwLC0wLjUsNTAsMS41KQorICAgICAgICA+Pj4gZm9yIF8gaW4gcmFuZ2UoMzYpOgorICAgICAgICAuLi4gICAgIGxlZnQoMTApCisgICAgICAgIC4uLiAgICAgZm9yd2FyZCgwLjUpCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLm1vZGUoKSAhPSAid29ybGQiOgorICAgICAgICAgICAgc2VsZi5tb2RlKCJ3b3JsZCIpCisgICAgICAgIHhzcGFuID0gZmxvYXQodXJ4IC0gbGx4KQorICAgICAgICB5c3BhbiA9IGZsb2F0KHVyeSAtIGxseSkKKyAgICAgICAgd3gsIHd5ID0gc2VsZi5fd2luZG93X3NpemUoKQorICAgICAgICBzZWxmLnNjcmVlbnNpemUod3gtMjAsIHd5LTIwKQorICAgICAgICBvbGR4c2NhbGUsIG9sZHlzY2FsZSA9IHNlbGYueHNjYWxlLCBzZWxmLnlzY2FsZQorICAgICAgICBzZWxmLnhzY2FsZSA9IHNlbGYuY2FudndpZHRoIC8geHNwYW4KKyAgICAgICAgc2VsZi55c2NhbGUgPSBzZWxmLmNhbnZoZWlnaHQgLyB5c3BhbgorICAgICAgICBzcngxID0gbGx4ICogc2VsZi54c2NhbGUKKyAgICAgICAgc3J5MSA9IC11cnkgKiBzZWxmLnlzY2FsZQorICAgICAgICBzcngyID0gc2VsZi5jYW52d2lkdGggKyBzcngxCisgICAgICAgIHNyeTIgPSBzZWxmLmNhbnZoZWlnaHQgKyBzcnkxCisgICAgICAgIHNlbGYuX3NldHNjcm9sbHJlZ2lvbihzcngxLCBzcnkxLCBzcngyLCBzcnkyKQorICAgICAgICBzZWxmLl9yZXNjYWxlKHNlbGYueHNjYWxlL29sZHhzY2FsZSwgc2VsZi55c2NhbGUvb2xkeXNjYWxlKQorICAgICAgICBzZWxmLnVwZGF0ZSgpCisKKyAgICBkZWYgcmVnaXN0ZXJfc2hhcGUoc2VsZiwgbmFtZSwgc2hhcGU9Tm9uZSk6CisgICAgICAgICIiIkFkZHMgYSB0dXJ0bGUgc2hhcGUgdG8gVHVydGxlU2NyZWVuJ3Mgc2hhcGVsaXN0LgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgKDEpIG5hbWUgaXMgdGhlIG5hbWUgb2YgYSBnaWYtZmlsZSBhbmQgc2hhcGUgaXMgTm9uZS4KKyAgICAgICAgICAgIEluc3RhbGxzIHRoZSBjb3JyZXNwb25kaW5nIGltYWdlIHNoYXBlLgorICAgICAgICAgICAgISEgSW1hZ2Utc2hhcGVzIERPIE5PVCByb3RhdGUgd2hlbiB0dXJuaW5nIHRoZSB0dXJ0bGUsCisgICAgICAgICAgICAhISBzbyB0aGV5IGRvIG5vdCBkaXNwbGF5IHRoZSBoZWFkaW5nIG9mIHRoZSB0dXJ0bGUhCisgICAgICAgICgyKSBuYW1lIGlzIGFuIGFyYml0cmFyeSBzdHJpbmcgYW5kIHNoYXBlIGlzIGEgdHVwbGUKKyAgICAgICAgICAgIG9mIHBhaXJzIG9mIGNvb3JkaW5hdGVzLiBJbnN0YWxscyB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICAgcG9seWdvbiBzaGFwZQorICAgICAgICAoMykgbmFtZSBpcyBhbiBhcmJpdHJhcnkgc3RyaW5nIGFuZCBzaGFwZSBpcyBhCisgICAgICAgICAgICAoY29tcG91bmQpIFNoYXBlIG9iamVjdC4gSW5zdGFsbHMgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgIGNvbXBvdW5kIHNoYXBlLgorICAgICAgICBUbyB1c2UgYSBzaGFwZSwgeW91IGhhdmUgdG8gaXNzdWUgdGhlIGNvbW1hbmQgc2hhcGUoc2hhcGVuYW1lKS4KKworICAgICAgICBjYWxsOiByZWdpc3Rlcl9zaGFwZSgidHVydGxlLmdpZiIpCisgICAgICAgIC0tb3I6IHJlZ2lzdGVyX3NoYXBlKCJ0cmkiLCAoKDAsMCksICgxMCwxMCksICgtMTAsMTApKSkKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi5yZWdpc3Rlcl9zaGFwZSgidHJpYW5nbGUiLCAoKDUsLTMpLCgwLDUpLCgtNSwtMykpKQorCisgICAgICAgICIiIgorICAgICAgICBpZiBzaGFwZSBpcyBOb25lOgorICAgICAgICAgICAgIyBpbWFnZQorICAgICAgICAgICAgaWYgbmFtZS5sb3dlcigpLmVuZHN3aXRoKCIuZ2lmIik6CisgICAgICAgICAgICAgICAgc2hhcGUgPSBTaGFwZSgiaW1hZ2UiLCBzZWxmLl9pbWFnZShuYW1lKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVHVydGxlR3JhcGhpY3NFcnJvcigiQmFkIGFyZ3VtZW50cyBmb3IgcmVnaXN0ZXJfc2hhcGUuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJVc2UgIGhlbHAocmVnaXN0ZXJfc2hhcGUpIiApCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzaGFwZSwgdHVwbGUpOgorICAgICAgICAgICAgc2hhcGUgPSBTaGFwZSgicG9seWdvbiIsIHNoYXBlKQorICAgICAgICAjIyBlbHNlIHNoYXBlIGFzc3VtZWQgdG8gYmUgU2hhcGUtaW5zdGFuY2UKKyAgICAgICAgc2VsZi5fc2hhcGVzW25hbWVdID0gc2hhcGUKKyAgICAgICAgIyBwcmludCAic2hhcGUgYWRkZWQ6IiAsIHNlbGYuX3NoYXBlcworCisgICAgZGVmIF9jb2xvcnN0cihzZWxmLCBjb2xvcik6CisgICAgICAgICIiIlJldHVybiBjb2xvciBzdHJpbmcgY29ycmVzcG9uZGluZyB0byBhcmdzLgorCisgICAgICAgIEFyZ3VtZW50IG1heSBiZSBhIHN0cmluZyBvciBhIHR1cGxlIG9mIHRocmVlCisgICAgICAgIG51bWJlcnMgY29ycmVzcG9uZGluZyB0byBhY3R1YWwgY29sb3Jtb2RlLAorICAgICAgICBpLmUuIGluIHRoZSByYW5nZSAwPD1uPD1jb2xvcm1vZGUuCisKKyAgICAgICAgSWYgdGhlIGFyZ3VtZW50IGRvZXNuJ3QgcmVwcmVzZW50IGEgY29sb3IsCisgICAgICAgIGFuIGVycm9yIGlzIHJhaXNlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihjb2xvcikgPT0gMToKKyAgICAgICAgICAgIGNvbG9yID0gY29sb3JbMF0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShjb2xvciwgc3RyKToKKyAgICAgICAgICAgIGlmIHNlbGYuX2lzY29sb3JzdHJpbmcoY29sb3IpIG9yIGNvbG9yID09ICIiOgorICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBUdXJ0bGVHcmFwaGljc0Vycm9yKCJiYWQgY29sb3Igc3RyaW5nOiAlcyIgJSBzdHIoY29sb3IpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByLCBnLCBiID0gY29sb3IKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmFpc2UgVHVydGxlR3JhcGhpY3NFcnJvcigiYmFkIGNvbG9yIGFyZ3VtZW50czogJXMiICUgc3RyKGNvbG9yKSkKKyAgICAgICAgaWYgc2VsZi5fY29sb3Jtb2RlID09IDEuMDoKKyAgICAgICAgICAgIHIsIGcsIGIgPSBbcm91bmQoMjU1LjAqeCkgZm9yIHggaW4gKHIsIGcsIGIpXQorICAgICAgICBpZiBub3QgKCgwIDw9IHIgPD0gMjU1KSBhbmQgKDAgPD0gZyA8PSAyNTUpIGFuZCAoMCA8PSBiIDw9IDI1NSkpOgorICAgICAgICAgICAgcmFpc2UgVHVydGxlR3JhcGhpY3NFcnJvcigiYmFkIGNvbG9yIHNlcXVlbmNlOiAlcyIgJSBzdHIoY29sb3IpKQorICAgICAgICByZXR1cm4gIiMlMDJ4JTAyeCUwMngiICUgKHIsIGcsIGIpCisKKyAgICBkZWYgX2NvbG9yKHNlbGYsIGNzdHIpOgorICAgICAgICBpZiBub3QgY3N0ci5zdGFydHN3aXRoKCIjIik6CisgICAgICAgICAgICByZXR1cm4gY3N0cgorICAgICAgICBpZiBsZW4oY3N0cikgPT0gNzoKKyAgICAgICAgICAgIGNsID0gW2ludChjc3RyW2k6aSsyXSwgMTYpIGZvciBpIGluICgxLCAzLCA1KV0KKyAgICAgICAgZWxpZiBsZW4oY3N0cikgPT0gNDoKKyAgICAgICAgICAgIGNsID0gWzE2KmludChjc3RyW2hdLCAxNikgZm9yIGggaW4gY3N0clsxOl1dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUdXJ0bGVHcmFwaGljc0Vycm9yKCJiYWQgY29sb3JzdHJpbmc6ICVzIiAlIGNzdHIpCisgICAgICAgIHJldHVybiB0dXBsZShbYyAqIHNlbGYuX2NvbG9ybW9kZS8yNTUgZm9yIGMgaW4gY2xdKQorCisgICAgZGVmIGNvbG9ybW9kZShzZWxmLCBjbW9kZT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjb2xvcm1vZGUgb3Igc2V0IGl0IHRvIDEuMCBvciAyNTUuCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQ6CisgICAgICAgIGNtb2RlIC0tIG9uZSBvZiB0aGUgdmFsdWVzIDEuMCBvciAyNTUKKworICAgICAgICByLCBnLCBiIHZhbHVlcyBvZiBjb2xvcnRyaXBsZXMgaGF2ZSB0byBiZSBpbiByYW5nZSAwLi5jbW9kZS4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi5jb2xvcm1vZGUoKQorICAgICAgICAxLjAKKyAgICAgICAgPj4+IHNjcmVlbi5jb2xvcm1vZGUoMjU1KQorICAgICAgICA+Pj4gcGVuY29sb3IoMjQwLDE2MCw4MCkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNtb2RlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29sb3Jtb2RlCisgICAgICAgIGlmIGNtb2RlID09IDEuMDoKKyAgICAgICAgICAgIHNlbGYuX2NvbG9ybW9kZSA9IGZsb2F0KGNtb2RlKQorICAgICAgICBlbGlmIGNtb2RlID09IDI1NToKKyAgICAgICAgICAgIHNlbGYuX2NvbG9ybW9kZSA9IGludChjbW9kZSkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgIiIiUmVzZXQgYWxsIFR1cnRsZXMgb24gdGhlIFNjcmVlbiB0byB0aGVpciBpbml0aWFsIHN0YXRlLgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLnJlc2V0KCkKKyAgICAgICAgIiIiCisgICAgICAgIGZvciB0dXJ0bGUgaW4gc2VsZi5fdHVydGxlczoKKyAgICAgICAgICAgIHR1cnRsZS5fc2V0bW9kZShzZWxmLl9tb2RlKQorICAgICAgICAgICAgdHVydGxlLnJlc2V0KCkKKworICAgIGRlZiB0dXJ0bGVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGxpc3Qgb2YgdHVydGxlcyBvbiB0aGUgc2NyZWVuLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLnR1cnRsZXMoKQorICAgICAgICBbPHR1cnRsZS5UdXJ0bGUgb2JqZWN0IGF0IDB4MDBFMTFGQjA+XQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3R1cnRsZXMKKworICAgIGRlZiBiZ2NvbG9yKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiU2V0IG9yIHJldHVybiBiYWNrZ3JvdW5kY29sb3Igb2YgdGhlIFR1cnRsZVNjcmVlbi4KKworICAgICAgICBBcmd1bWVudHMgKGlmIGdpdmVuKTogYSBjb2xvciBzdHJpbmcgb3IgdGhyZWUgbnVtYmVycworICAgICAgICBpbiB0aGUgcmFuZ2UgMC4uY29sb3Jtb2RlIG9yIGEgMy10dXBsZSBvZiBzdWNoIG51bWJlcnMuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisgICAgICAgID4+PiBzY3JlZW4uYmdjb2xvcigib3JhbmdlIikKKyAgICAgICAgPj4+IHNjcmVlbi5iZ2NvbG9yKCkKKyAgICAgICAgJ29yYW5nZScKKyAgICAgICAgPj4+IHNjcmVlbi5iZ2NvbG9yKDAuNSwwLDAuNSkKKyAgICAgICAgPj4+IHNjcmVlbi5iZ2NvbG9yKCkKKyAgICAgICAgJyM4MDAwODAnCisgICAgICAgICIiIgorICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgY29sb3IgPSBzZWxmLl9jb2xvcnN0cihhcmdzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29sb3IgPSBOb25lCisgICAgICAgIGNvbG9yID0gc2VsZi5fYmdjb2xvcihjb2xvcikKKyAgICAgICAgaWYgY29sb3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb2xvciA9IHNlbGYuX2NvbG9yKGNvbG9yKQorICAgICAgICByZXR1cm4gY29sb3IKKworICAgIGRlZiB0cmFjZXIoc2VsZiwgbj1Ob25lLCBkZWxheT1Ob25lKToKKyAgICAgICAgIiIiVHVybnMgdHVydGxlIGFuaW1hdGlvbiBvbi9vZmYgYW5kIHNldCBkZWxheSBmb3IgdXBkYXRlIGRyYXdpbmdzLgorCisgICAgICAgIE9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgbiAtLSBub25uZWdhdGl2ZSAgaW50ZWdlcgorICAgICAgICBkZWxheSAtLSBub25uZWdhdGl2ZSAgaW50ZWdlcgorCisgICAgICAgIElmIG4gaXMgZ2l2ZW4sIG9ubHkgZWFjaCBuLXRoIHJlZ3VsYXIgc2NyZWVuIHVwZGF0ZSBpcyByZWFsbHkgcGVyZm9ybWVkLgorICAgICAgICAoQ2FuIGJlIHVzZWQgdG8gYWNjZWxlcmF0ZSB0aGUgZHJhd2luZyBvZiBjb21wbGV4IGdyYXBoaWNzLikKKyAgICAgICAgU2Vjb25kIGFyZ3VtZW50cyBzZXRzIGRlbGF5IHZhbHVlIChzZWUgUmF3VHVydGxlLmRlbGF5KCkpCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisgICAgICAgID4+PiBzY3JlZW4udHJhY2VyKDgsIDI1KQorICAgICAgICA+Pj4gZGlzdCA9IDIKKyAgICAgICAgPj4+IGZvciBpIGluIHJhbmdlKDIwMCk6CisgICAgICAgIC4uLiAgICAgZmQoZGlzdCkKKyAgICAgICAgLi4uICAgICBydCg5MCkKKyAgICAgICAgLi4uICAgICBkaXN0ICs9IDIKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG4gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90cmFjaW5nCisgICAgICAgIHNlbGYuX3RyYWNpbmcgPSBpbnQobikKKyAgICAgICAgc2VsZi5fdXBkYXRlY291bnRlciA9IDAKKyAgICAgICAgaWYgZGVsYXkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9kZWxheXZhbHVlID0gaW50KGRlbGF5KQorICAgICAgICBpZiBzZWxmLl90cmFjaW5nOgorICAgICAgICAgICAgc2VsZi51cGRhdGUoKQorCisgICAgZGVmIGRlbGF5KHNlbGYsIGRlbGF5PU5vbmUpOgorICAgICAgICAiIiIgUmV0dXJuIG9yIHNldCB0aGUgZHJhd2luZyBkZWxheSBpbiBtaWxsaXNlY29uZHMuCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQ6CisgICAgICAgIGRlbGF5IC0tIHBvc2l0aXZlIGludGVnZXIKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi5kZWxheSgxNSkKKyAgICAgICAgPj4+IHNjcmVlbi5kZWxheSgpCisgICAgICAgIDE1CisgICAgICAgICIiIgorICAgICAgICBpZiBkZWxheSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RlbGF5dmFsdWUKKyAgICAgICAgc2VsZi5fZGVsYXl2YWx1ZSA9IGludChkZWxheSkKKworICAgIGRlZiBfaW5jcmVtZW50dWRjKHNlbGYpOgorICAgICAgICAiIiJJbmNyZW1lbnQgdXBhZGF0ZSBjb3VudGVyLiIiIgorICAgICAgICBpZiBub3QgVHVydGxlU2NyZWVuLl9SVU5OSU5HOgorICAgICAgICAgICAgVHVydGxlU2NyZWVuLl9SVU5OTklORyA9IFRydWUKKyAgICAgICAgICAgIHJhaXNlIFRlcm1pbmF0b3IKKyAgICAgICAgaWYgc2VsZi5fdHJhY2luZyA+IDA6CisgICAgICAgICAgICBzZWxmLl91cGRhdGVjb3VudGVyICs9IDEKKyAgICAgICAgICAgIHNlbGYuX3VwZGF0ZWNvdW50ZXIgJT0gc2VsZi5fdHJhY2luZworCisgICAgZGVmIHVwZGF0ZShzZWxmKToKKyAgICAgICAgIiIiUGVyZm9ybSBhIFR1cnRsZVNjcmVlbiB1cGRhdGUuCisgICAgICAgICIiIgorICAgICAgICB0cmFjaW5nID0gc2VsZi5fdHJhY2luZworICAgICAgICBzZWxmLl90cmFjaW5nID0gVHJ1ZQorICAgICAgICBmb3IgdCBpbiBzZWxmLnR1cnRsZXMoKToKKyAgICAgICAgICAgIHQuX3VwZGF0ZV9kYXRhKCkKKyAgICAgICAgICAgIHQuX2RyYXd0dXJ0bGUoKQorICAgICAgICBzZWxmLl90cmFjaW5nID0gdHJhY2luZworICAgICAgICBzZWxmLl91cGRhdGUoKQorCisgICAgZGVmIHdpbmRvd193aWR0aChzZWxmKToKKyAgICAgICAgIiIiIFJldHVybiB0aGUgd2lkdGggb2YgdGhlIHR1cnRsZSB3aW5kb3cuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisgICAgICAgID4+PiBzY3JlZW4ud2luZG93X3dpZHRoKCkKKyAgICAgICAgNjQwCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fd2luZG93X3NpemUoKVswXQorCisgICAgZGVmIHdpbmRvd19oZWlnaHQoc2VsZik6CisgICAgICAgICIiIiBSZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgdHVydGxlIHdpbmRvdy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi53aW5kb3dfaGVpZ2h0KCkKKyAgICAgICAgNDgwCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fd2luZG93X3NpemUoKVsxXQorCisgICAgZGVmIGdldGNhbnZhcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBDYW52YXMgb2YgdGhpcyBUdXJ0bGVTY3JlZW4uCisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisgICAgICAgID4+PiBjdiA9IHNjcmVlbi5nZXRjYW52YXMoKQorICAgICAgICA+Pj4gY3YKKyAgICAgICAgPHR1cnRsZS5TY3JvbGxlZENhbnZhcyBpbnN0YW5jZSBhdCAweDAxMDc0MkQ4PgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuY3YKKworICAgIGRlZiBnZXRzaGFwZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgbmFtZXMgb2YgYWxsIGN1cnJlbnRseSBhdmFpbGFibGUgdHVydGxlIHNoYXBlcy4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi5nZXRzaGFwZXMoKQorICAgICAgICBbJ2Fycm93JywgJ2JsYW5rJywgJ2NpcmNsZScsIC4uLiAsICd0dXJ0bGUnXQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNvcnRlZChzZWxmLl9zaGFwZXMua2V5cygpKQorCisgICAgZGVmIG9uY2xpY2soc2VsZiwgZnVuLCBidG49MSwgYWRkPU5vbmUpOgorICAgICAgICAiIiJCaW5kIGZ1biB0byBtb3VzZS1jbGljayBldmVudCBvbiBjYW52YXMuCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICBmdW4gLS0gYSBmdW5jdGlvbiB3aXRoIHR3byBhcmd1bWVudHMsIHRoZSBjb29yZGluYXRlcyBvZiB0aGUKKyAgICAgICAgICAgICAgIGNsaWNrZWQgcG9pbnQgb24gdGhlIGNhbnZhcy4KKyAgICAgICAgbnVtIC0tIHRoZSBudW1iZXIgb2YgdGhlIG1vdXNlLWJ1dHRvbiwgZGVmYXVsdHMgdG8gMQorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4KKyAgICAgICAgYW5kIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisKKyAgICAgICAgPj4+IHNjcmVlbi5vbmNsaWNrKGdvdG8pCisgICAgICAgID4+PiAjIFN1YnNlcXVlbnRseSBjbGlja2luZyBpbnRvIHRoZSBUdXJ0bGVTY3JlZW4gd2lsbAorICAgICAgICA+Pj4gIyBtYWtlIHRoZSB0dXJ0bGUgbW92ZSB0byB0aGUgY2xpY2tlZCBwb2ludC4KKyAgICAgICAgPj4+IHNjcmVlbi5vbmNsaWNrKE5vbmUpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9vbnNjcmVlbmNsaWNrKGZ1biwgYnRuLCBhZGQpCisKKyAgICBkZWYgb25rZXkoc2VsZiwgZnVuLCBrZXkpOgorICAgICAgICAiIiJCaW5kIGZ1biB0byBrZXktcmVsZWFzZSBldmVudCBvZiBrZXkuCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICBmdW4gLS0gYSBmdW5jdGlvbiB3aXRoIG5vIGFyZ3VtZW50cworICAgICAgICBrZXkgLS0gYSBzdHJpbmc6IGtleSAoZS5nLiAiYSIpIG9yIGtleS1zeW1ib2wgKGUuZy4gInNwYWNlIikKKworICAgICAgICBJbiBvcmRlciB0byBiZSBhYmxlIHRvIHJlZ2lzdGVyIGtleS1ldmVudHMsIFR1cnRsZVNjcmVlbgorICAgICAgICBtdXN0IGhhdmUgZm9jdXMuIChTZWUgbWV0aG9kIGxpc3Rlbi4pCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisKKyAgICAgICAgPj4+IGRlZiBmKCk6CisgICAgICAgIC4uLiAgICAgZmQoNTApCisgICAgICAgIC4uLiAgICAgbHQoNjApCisgICAgICAgIC4uLgorICAgICAgICA+Pj4gc2NyZWVuLm9ua2V5KGYsICJVcCIpCisgICAgICAgID4+PiBzY3JlZW4ubGlzdGVuKCkKKworICAgICAgICBTdWJzZXF1ZW50bHkgdGhlIHR1cnRsZSBjYW4gYmUgbW92ZWQgYnkgcmVwZWF0ZWRseSBwcmVzc2luZworICAgICAgICB0aGUgdXAtYXJyb3cga2V5LCBjb25zZXF1ZW50bHkgZHJhd2luZyBhIGhleGFnb24KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgZnVuIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBrZXkgaW4gc2VsZi5fa2V5czoKKyAgICAgICAgICAgICAgICBzZWxmLl9rZXlzLnJlbW92ZShrZXkpCisgICAgICAgIGVsaWYga2V5IG5vdCBpbiBzZWxmLl9rZXlzOgorICAgICAgICAgICAgc2VsZi5fa2V5cy5hcHBlbmQoa2V5KQorICAgICAgICBzZWxmLl9vbmtleShmdW4sIGtleSkKKworICAgIGRlZiBsaXN0ZW4oc2VsZiwgeGR1bW15PU5vbmUsIHlkdW1teT1Ob25lKToKKyAgICAgICAgIiIiU2V0IGZvY3VzIG9uIFR1cnRsZVNjcmVlbiAoaW4gb3JkZXIgdG8gY29sbGVjdCBrZXktZXZlbnRzKQorCisgICAgICAgIE5vIGFyZ3VtZW50cy4KKyAgICAgICAgRHVtbXkgYXJndW1lbnRzIGFyZSBwcm92aWRlZCBpbiBvcmRlcgorICAgICAgICB0byBiZSBhYmxlIHRvIHBhc3MgbGlzdGVuIHRvIHRoZSBvbmNsaWNrIG1ldGhvZC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi5saXN0ZW4oKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fbGlzdGVuKCkKKworICAgIGRlZiBvbnRpbWVyKHNlbGYsIGZ1biwgdD0wKToKKyAgICAgICAgIiIiSW5zdGFsbCBhIHRpbWVyLCB3aGljaCBjYWxscyBmdW4gYWZ0ZXIgdCBtaWxsaXNlY29uZHMuCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICBmdW4gLS0gYSBmdW5jdGlvbiB3aXRoIG5vIGFyZ3VtZW50cy4KKyAgICAgICAgdCAtLSBhIG51bWJlciA+PSAwCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisKKyAgICAgICAgPj4+IHJ1bm5pbmcgPSBUcnVlCisgICAgICAgID4+PiBkZWYgZigpOgorICAgICAgICAuLi4gICAgIGlmIHJ1bm5pbmc6CisgICAgICAgIC4uLiAgICAgICAgICAgICBmZCg1MCkKKyAgICAgICAgLi4uICAgICAgICAgICAgIGx0KDYwKQorICAgICAgICAuLi4gICAgICAgICAgICAgc2NyZWVuLm9udGltZXIoZiwgMjUwKQorICAgICAgICAuLi4KKyAgICAgICAgPj4+IGYoKSAgICMgbWFrZXMgdGhlIHR1cnRsZSBtYXJjaGluZyBhcm91bmQKKyAgICAgICAgPj4+IHJ1bm5pbmcgPSBGYWxzZQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fb250aW1lcihmdW4sIHQpCisKKyAgICBkZWYgYmdwaWMoc2VsZiwgcGljbmFtZT1Ob25lKToKKyAgICAgICAgIiIiU2V0IGJhY2tncm91bmQgaW1hZ2Ugb3IgcmV0dXJuIG5hbWUgb2YgY3VycmVudCBiYWNrZ3JvdW5kaW1hZ2UuCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQ6CisgICAgICAgIHBpY25hbWUgLS0gYSBzdHJpbmcsIG5hbWUgb2YgYSBnaWYtZmlsZSBvciAibm9waWMiLgorCisgICAgICAgIElmIHBpY25hbWUgaXMgYSBmaWxlbmFtZSwgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGltYWdlIGFzIGJhY2tncm91bmQuCisgICAgICAgIElmIHBpY25hbWUgaXMgIm5vcGljIiwgZGVsZXRlIGJhY2tncm91bmRpbWFnZSwgaWYgcHJlc2VudC4KKyAgICAgICAgSWYgcGljbmFtZSBpcyBOb25lLCByZXR1cm4gdGhlIGZpbGVuYW1lIG9mIHRoZSBjdXJyZW50IGJhY2tncm91bmRpbWFnZS4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi5iZ3BpYygpCisgICAgICAgICdub3BpYycKKyAgICAgICAgPj4+IHNjcmVlbi5iZ3BpYygibGFuZHNjYXBlLmdpZiIpCisgICAgICAgID4+PiBzY3JlZW4uYmdwaWMoKQorICAgICAgICAnbGFuZHNjYXBlLmdpZicKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHBpY25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9iZ3BpY25hbWUKKyAgICAgICAgaWYgcGljbmFtZSBub3QgaW4gc2VsZi5fYmdwaWNzOgorICAgICAgICAgICAgc2VsZi5fYmdwaWNzW3BpY25hbWVdID0gc2VsZi5faW1hZ2UocGljbmFtZSkKKyAgICAgICAgc2VsZi5fc2V0YmdwaWMoc2VsZi5fYmdwaWMsIHNlbGYuX2JncGljc1twaWNuYW1lXSkKKyAgICAgICAgc2VsZi5fYmdwaWNuYW1lID0gcGljbmFtZQorCisgICAgZGVmIHNjcmVlbnNpemUoc2VsZiwgY2FudndpZHRoPU5vbmUsIGNhbnZoZWlnaHQ9Tm9uZSwgYmc9Tm9uZSk6CisgICAgICAgICIiIlJlc2l6ZSB0aGUgY2FudmFzIHRoZSB0dXJ0bGVzIGFyZSBkcmF3aW5nIG9uLgorCisgICAgICAgIE9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgY2FudndpZHRoIC0tIHBvc2l0aXZlIGludGVnZXIsIG5ldyB3aWR0aCBvZiBjYW52YXMgaW4gcGl4ZWxzCisgICAgICAgIGNhbnZoZWlnaHQgLS0gIHBvc2l0aXZlIGludGVnZXIsIG5ldyBoZWlnaHQgb2YgY2FudmFzIGluIHBpeGVscworICAgICAgICBiZyAtLSBjb2xvcnN0cmluZyBvciBjb2xvci10dXBsZSwgbmV3IGJhY2tncm91bmRjb2xvcgorICAgICAgICBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuLCByZXR1cm4gY3VycmVudCAoY2FudmFzd2lkdGgsIGNhbnZhc2hlaWdodCkKKworICAgICAgICBEbyBub3QgYWx0ZXIgdGhlIGRyYXdpbmcgd2luZG93LiBUbyBvYnNlcnZlIGhpZGRlbiBwYXJ0cyBvZgorICAgICAgICB0aGUgY2FudmFzIHVzZSB0aGUgc2Nyb2xsYmFycy4gKENhbiBtYWtlIHZpc2libGUgdGhvc2UgcGFydHMKKyAgICAgICAgb2YgYSBkcmF3aW5nLCB3aGljaCB3ZXJlIG91dHNpZGUgdGhlIGNhbnZhcyBiZWZvcmUhKQorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnNjcmVlbnNpemUoMjAwMCwxNTAwKQorICAgICAgICA+Pj4gIyBlLiBnLiB0byBzZWFyY2ggZm9yIGFuIGVycm9uZW91c2x5IGVzY2FwZWQgdHVydGxlIDstKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Jlc2l6ZShjYW52d2lkdGgsIGNhbnZoZWlnaHQsIGJnKQorCisgICAgb25zY3JlZW5jbGljayA9IG9uY2xpY2sKKyAgICByZXNldHNjcmVlbiA9IHJlc2V0CisgICAgY2xlYXJzY3JlZW4gPSBjbGVhcgorICAgIGFkZHNoYXBlID0gcmVnaXN0ZXJfc2hhcGUKKworY2xhc3MgVE5hdmlnYXRvcihvYmplY3QpOgorICAgICIiIk5hdmlnYXRpb24gcGFydCBvZiB0aGUgUmF3VHVydGxlLgorICAgIEltcGxlbWVudHMgbWV0aG9kcyBmb3IgdHVydGxlIG1vdmVtZW50LgorICAgICIiIgorICAgIFNUQVJUX09SSUVOVEFUSU9OID0geworICAgICAgICAic3RhbmRhcmQiOiBWZWMyRCgxLjAsIDAuMCksCisgICAgICAgICJ3b3JsZCIgICA6IFZlYzJEKDEuMCwgMC4wKSwKKyAgICAgICAgImxvZ28iICAgIDogVmVjMkQoMC4wLCAxLjApICB9CisgICAgREVGQVVMVF9NT0RFID0gInN0YW5kYXJkIgorICAgIERFRkFVTFRfQU5HTEVPRkZTRVQgPSAwCisgICAgREVGQVVMVF9BTkdMRU9SSUVOVCA9IDEKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2RlPURFRkFVTFRfTU9ERSk6CisgICAgICAgIHNlbGYuX2FuZ2xlT2Zmc2V0ID0gc2VsZi5ERUZBVUxUX0FOR0xFT0ZGU0VUCisgICAgICAgIHNlbGYuX2FuZ2xlT3JpZW50ID0gc2VsZi5ERUZBVUxUX0FOR0xFT1JJRU5UCisgICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCisgICAgICAgIHNlbGYudW5kb2J1ZmZlciA9IE5vbmUKKyAgICAgICAgc2VsZi5kZWdyZWVzKCkKKyAgICAgICAgc2VsZi5fbW9kZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fc2V0bW9kZShtb2RlKQorICAgICAgICBUTmF2aWdhdG9yLnJlc2V0KHNlbGYpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgICIiInJlc2V0IHR1cnRsZSB0byBpdHMgaW5pdGlhbCB2YWx1ZXMKKworICAgICAgICBXaWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHBhcmVudCBjbGFzcworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBWZWMyRCgwLjAsIDAuMCkKKyAgICAgICAgc2VsZi5fb3JpZW50ID0gIFROYXZpZ2F0b3IuU1RBUlRfT1JJRU5UQVRJT05bc2VsZi5fbW9kZV0KKworICAgIGRlZiBfc2V0bW9kZShzZWxmLCBtb2RlPU5vbmUpOgorICAgICAgICAiIiJTZXQgdHVydGxlLW1vZGUgdG8gJ3N0YW5kYXJkJywgJ3dvcmxkJyBvciAnbG9nbycuCisgICAgICAgICIiIgorICAgICAgICBpZiBtb2RlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbW9kZQorICAgICAgICBpZiBtb2RlIG5vdCBpbiBbInN0YW5kYXJkIiwgImxvZ28iLCAid29ybGQiXToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9tb2RlID0gbW9kZQorICAgICAgICBpZiBtb2RlIGluIFsic3RhbmRhcmQiLCAid29ybGQiXToKKyAgICAgICAgICAgIHNlbGYuX2FuZ2xlT2Zmc2V0ID0gMAorICAgICAgICAgICAgc2VsZi5fYW5nbGVPcmllbnQgPSAxCisgICAgICAgIGVsc2U6ICMgbW9kZSA9PSAibG9nbyI6CisgICAgICAgICAgICBzZWxmLl9hbmdsZU9mZnNldCA9IHNlbGYuX2Z1bGxjaXJjbGUvNC4KKyAgICAgICAgICAgIHNlbGYuX2FuZ2xlT3JpZW50ID0gLTEKKworICAgIGRlZiBfc2V0RGVncmVlc1BlckFVKHNlbGYsIGZ1bGxjaXJjbGUpOgorICAgICAgICAiIiJIZWxwZXIgZnVuY3Rpb24gZm9yIGRlZ3JlZXMoKSBhbmQgcmFkaWFucygpIiIiCisgICAgICAgIHNlbGYuX2Z1bGxjaXJjbGUgPSBmdWxsY2lyY2xlCisgICAgICAgIHNlbGYuX2RlZ3JlZXNQZXJBVSA9IDM2MC9mdWxsY2lyY2xlCisgICAgICAgIGlmIHNlbGYuX21vZGUgPT0gInN0YW5kYXJkIjoKKyAgICAgICAgICAgIHNlbGYuX2FuZ2xlT2Zmc2V0ID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fYW5nbGVPZmZzZXQgPSBmdWxsY2lyY2xlLzQuCisKKyAgICBkZWYgZGVncmVlcyhzZWxmLCBmdWxsY2lyY2xlPTM2MC4wKToKKyAgICAgICAgIiIiIFNldCBhbmdsZSBtZWFzdXJlbWVudCB1bml0cyB0byBkZWdyZWVzLgorCisgICAgICAgIE9wdGlvbmFsIGFyZ3VtZW50OgorICAgICAgICBmdWxsY2lyY2xlIC0gIGEgbnVtYmVyCisKKyAgICAgICAgU2V0IGFuZ2xlIG1lYXN1cmVtZW50IHVuaXRzLCBpLiBlLiBzZXQgbnVtYmVyCisgICAgICAgIG9mICdkZWdyZWVzJyBmb3IgYSBmdWxsIGNpcmNsZS4gRGFmYXVsdCB2YWx1ZSBpcworICAgICAgICAzNjAgZGVncmVlcy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDkwKQorICAgICAgICA+Pj4gdHVydGxlLmhlYWRpbmcoKQorICAgICAgICA5MAorCisgICAgICAgIENoYW5nZSBhbmdsZSBtZWFzdXJlbWVudCB1bml0IHRvIGdyYWQgKGFsc28ga25vd24gYXMgZ29uLAorICAgICAgICBncmFkZSwgb3IgZ3JhZGlhbiBhbmQgZXF1YWxzIDEvMTAwLXRoIG9mIHRoZSByaWdodCBhbmdsZS4pCisgICAgICAgID4+PiB0dXJ0bGUuZGVncmVlcyg0MDAuMCkKKyAgICAgICAgPj4+IHR1cnRsZS5oZWFkaW5nKCkKKyAgICAgICAgMTAwCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3NldERlZ3JlZXNQZXJBVShmdWxsY2lyY2xlKQorCisgICAgZGVmIHJhZGlhbnMoc2VsZik6CisgICAgICAgICIiIiBTZXQgdGhlIGFuZ2xlIG1lYXN1cmVtZW50IHVuaXRzIHRvIHJhZGlhbnMuCisKKyAgICAgICAgTm8gYXJndW1lbnRzLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmhlYWRpbmcoKQorICAgICAgICA5MAorICAgICAgICA+Pj4gdHVydGxlLnJhZGlhbnMoKQorICAgICAgICA+Pj4gdHVydGxlLmhlYWRpbmcoKQorICAgICAgICAxLjU3MDc5NjMyNjc5NDg5NjYKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3NldERlZ3JlZXNQZXJBVSgyKm1hdGgucGkpCisKKyAgICBkZWYgX2dvKHNlbGYsIGRpc3RhbmNlKToKKyAgICAgICAgIiIibW92ZSB0dXJ0bGUgZm9yd2FyZCBieSBzcGVjaWZpZWQgZGlzdGFuY2UiIiIKKyAgICAgICAgZW5kZSA9IHNlbGYuX3Bvc2l0aW9uICsgc2VsZi5fb3JpZW50ICogZGlzdGFuY2UKKyAgICAgICAgc2VsZi5fZ290byhlbmRlKQorCisgICAgZGVmIF9yb3RhdGUoc2VsZiwgYW5nbGUpOgorICAgICAgICAiIiJUdXJuIHR1cnRsZSBjb3VudGVyY2xvY2t3aXNlIGJ5IHNwZWNpZmllZCBhbmdsZSBpZiBhbmdsZSA+IDAuIiIiCisgICAgICAgIGFuZ2xlICo9IHNlbGYuX2RlZ3JlZXNQZXJBVQorICAgICAgICBzZWxmLl9vcmllbnQgPSBzZWxmLl9vcmllbnQucm90YXRlKGFuZ2xlKQorCisgICAgZGVmIF9nb3RvKHNlbGYsIGVuZCk6CisgICAgICAgICIiIm1vdmUgdHVydGxlIHRvIHBvc2l0aW9uIGVuZC4iIiIKKyAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBlbmQKKworICAgIGRlZiBmb3J3YXJkKHNlbGYsIGRpc3RhbmNlKToKKyAgICAgICAgIiIiTW92ZSB0aGUgdHVydGxlIGZvcndhcmQgYnkgdGhlIHNwZWNpZmllZCBkaXN0YW5jZS4KKworICAgICAgICBBbGlhc2VzOiBmb3J3YXJkIHwgZmQKKworICAgICAgICBBcmd1bWVudDoKKyAgICAgICAgZGlzdGFuY2UgLS0gYSBudW1iZXIgKGludGVnZXIgb3IgZmxvYXQpCisKKyAgICAgICAgTW92ZSB0aGUgdHVydGxlIGZvcndhcmQgYnkgdGhlIHNwZWNpZmllZCBkaXN0YW5jZSwgaW4gdGhlIGRpcmVjdGlvbgorICAgICAgICB0aGUgdHVydGxlIGlzIGhlYWRlZC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgICgwLjAwLCAwLjAwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMjUpCisgICAgICAgID4+PiB0dXJ0bGUucG9zaXRpb24oKQorICAgICAgICAoMjUuMDAsMC4wMCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKC03NSkKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgICgtNTAuMDAsMC4wMCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2dvKGRpc3RhbmNlKQorCisgICAgZGVmIGJhY2soc2VsZiwgZGlzdGFuY2UpOgorICAgICAgICAiIiJNb3ZlIHRoZSB0dXJ0bGUgYmFja3dhcmQgYnkgZGlzdGFuY2UuCisKKyAgICAgICAgQWxpYXNlczogYmFjayB8IGJhY2t3YXJkIHwgYmsKKworICAgICAgICBBcmd1bWVudDoKKyAgICAgICAgZGlzdGFuY2UgLS0gYSBudW1iZXIKKworICAgICAgICBNb3ZlIHRoZSB0dXJ0bGUgYmFja3dhcmQgYnkgZGlzdGFuY2UgLG9wcG9zaXRlIHRvIHRoZSBkaXJlY3Rpb24gdGhlCisgICAgICAgIHR1cnRsZSBpcyBoZWFkZWQuIERvIG5vdCBjaGFuZ2UgdGhlIHR1cnRsZSdzIGhlYWRpbmcuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUucG9zaXRpb24oKQorICAgICAgICAoMC4wMCwgMC4wMCkKKyAgICAgICAgPj4+IHR1cnRsZS5iYWNrd2FyZCgzMCkKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgICgtMzAuMDAsIDAuMDApCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9nbygtZGlzdGFuY2UpCisKKyAgICBkZWYgcmlnaHQoc2VsZiwgYW5nbGUpOgorICAgICAgICAiIiJUdXJuIHR1cnRsZSByaWdodCBieSBhbmdsZSB1bml0cy4KKworICAgICAgICBBbGlhc2VzOiByaWdodCB8IHJ0CisKKyAgICAgICAgQXJndW1lbnQ6CisgICAgICAgIGFuZ2xlIC0tIGEgbnVtYmVyIChpbnRlZ2VyIG9yIGZsb2F0KQorCisgICAgICAgIFR1cm4gdHVydGxlIHJpZ2h0IGJ5IGFuZ2xlIHVuaXRzLiAoVW5pdHMgYXJlIGJ5IGRlZmF1bHQgZGVncmVlcywKKyAgICAgICAgYnV0IGNhbiBiZSBzZXQgdmlhIHRoZSBkZWdyZWVzKCkgYW5kIHJhZGlhbnMoKSBmdW5jdGlvbnMuKQorICAgICAgICBBbmdsZSBvcmllbnRhdGlvbiBkZXBlbmRzIG9uIG1vZGUuIChTZWUgdGhpcy4pCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuaGVhZGluZygpCisgICAgICAgIDIyLjAKKyAgICAgICAgPj4+IHR1cnRsZS5yaWdodCg0NSkKKyAgICAgICAgPj4+IHR1cnRsZS5oZWFkaW5nKCkKKyAgICAgICAgMzM3LjAKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3JvdGF0ZSgtYW5nbGUpCisKKyAgICBkZWYgbGVmdChzZWxmLCBhbmdsZSk6CisgICAgICAgICIiIlR1cm4gdHVydGxlIGxlZnQgYnkgYW5nbGUgdW5pdHMuCisKKyAgICAgICAgQWxpYXNlczogbGVmdCB8IGx0CisKKyAgICAgICAgQXJndW1lbnQ6CisgICAgICAgIGFuZ2xlIC0tIGEgbnVtYmVyIChpbnRlZ2VyIG9yIGZsb2F0KQorCisgICAgICAgIFR1cm4gdHVydGxlIGxlZnQgYnkgYW5nbGUgdW5pdHMuIChVbml0cyBhcmUgYnkgZGVmYXVsdCBkZWdyZWVzLAorICAgICAgICBidXQgY2FuIGJlIHNldCB2aWEgdGhlIGRlZ3JlZXMoKSBhbmQgcmFkaWFucygpIGZ1bmN0aW9ucy4pCisgICAgICAgIEFuZ2xlIG9yaWVudGF0aW9uIGRlcGVuZHMgb24gbW9kZS4gKFNlZSB0aGlzLikKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5oZWFkaW5nKCkKKyAgICAgICAgMjIuMAorICAgICAgICA+Pj4gdHVydGxlLmxlZnQoNDUpCisgICAgICAgID4+PiB0dXJ0bGUuaGVhZGluZygpCisgICAgICAgIDY3LjAKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3JvdGF0ZShhbmdsZSkKKworICAgIGRlZiBwb3Moc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgdHVydGxlJ3MgY3VycmVudCBsb2NhdGlvbiAoeCx5KSwgYXMgYSBWZWMyRC12ZWN0b3IuCisKKyAgICAgICAgQWxpYXNlczogcG9zIHwgcG9zaXRpb24KKworICAgICAgICBObyBhcmd1bWVudHMuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUucG9zKCkKKyAgICAgICAgKDAuMDAsIDI0MC4wMCkKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9wb3NpdGlvbgorCisgICAgZGVmIHhjb3Ioc2VsZik6CisgICAgICAgICIiIiBSZXR1cm4gdGhlIHR1cnRsZSdzIHggY29vcmRpbmF0ZS4KKworICAgICAgICBObyBhcmd1bWVudHMuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiByZXNldCgpCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg2MCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHByaW50IHR1cnRsZS54Y29yKCkKKyAgICAgICAgNTAuMAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Bvc2l0aW9uWzBdCisKKyAgICBkZWYgeWNvcihzZWxmKToKKyAgICAgICAgIiIiIFJldHVybiB0aGUgdHVydGxlJ3MgeSBjb29yZGluYXRlCisgICAgICAgIC0tLQorICAgICAgICBObyBhcmd1bWVudHMuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiByZXNldCgpCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg2MCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHByaW50IHR1cnRsZS55Y29yKCkKKyAgICAgICAgODYuNjAyNTQwMzc4NAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Bvc2l0aW9uWzFdCisKKworICAgIGRlZiBnb3RvKHNlbGYsIHgsIHk9Tm9uZSk6CisgICAgICAgICIiIk1vdmUgdHVydGxlIHRvIGFuIGFic29sdXRlIHBvc2l0aW9uLgorCisgICAgICAgIEFsaWFzZXM6IHNldHBvcyB8IHNldHBvc2l0aW9uIHwgZ290bzoKKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIHggLS0gYSBudW1iZXIgICAgICBvciAgICAgYSBwYWlyL3ZlY3RvciBvZiBudW1iZXJzCisgICAgICAgIHkgLS0gYSBudW1iZXIgICAgICAgICAgICAgTm9uZQorCisgICAgICAgIGNhbGw6IGdvdG8oeCwgeSkgICAgICAgICAjIHR3byBjb29yZGluYXRlcworICAgICAgICAtLW9yOiBnb3RvKCh4LCB5KSkgICAgICAgIyBhIHBhaXIgKHR1cGxlKSBvZiBjb29yZGluYXRlcworICAgICAgICAtLW9yOiBnb3RvKHZlYykgICAgICAgICAgIyBlLmcuIGFzIHJldHVybmVkIGJ5IHBvcygpCisKKyAgICAgICAgTW92ZSB0dXJ0bGUgdG8gYW4gYWJzb2x1dGUgcG9zaXRpb24uIElmIHRoZSBwZW4gaXMgZG93biwKKyAgICAgICAgYSBsaW5lIHdpbGwgYmUgZHJhd24uIFRoZSB0dXJ0bGUncyBvcmllbnRhdGlvbiBkb2VzIG5vdCBjaGFuZ2UuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0cCA9IHR1cnRsZS5wb3MoKQorICAgICAgICA+Pj4gdHAKKyAgICAgICAgKDAuMDAsIDAuMDApCisgICAgICAgID4+PiB0dXJ0bGUuc2V0cG9zKDYwLDMwKQorICAgICAgICA+Pj4gdHVydGxlLnBvcygpCisgICAgICAgICg2MC4wMCwzMC4wMCkKKyAgICAgICAgPj4+IHR1cnRsZS5zZXRwb3MoKDIwLDgwKSkKKyAgICAgICAgPj4+IHR1cnRsZS5wb3MoKQorICAgICAgICAoMjAuMDAsODAuMDApCisgICAgICAgID4+PiB0dXJ0bGUuc2V0cG9zKHRwKQorICAgICAgICA+Pj4gdHVydGxlLnBvcygpCisgICAgICAgICgwLjAwLDAuMDApCisgICAgICAgICIiIgorICAgICAgICBpZiB5IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9nb3RvKFZlYzJEKCp4KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2dvdG8oVmVjMkQoeCwgeSkpCisKKyAgICBkZWYgaG9tZShzZWxmKToKKyAgICAgICAgIiIiTW92ZSB0dXJ0bGUgdG8gdGhlIG9yaWdpbiAtIGNvb3JkaW5hdGVzICgwLDApLgorCisgICAgICAgIE5vIGFyZ3VtZW50cy4KKworICAgICAgICBNb3ZlIHR1cnRsZSB0byB0aGUgb3JpZ2luIC0gY29vcmRpbmF0ZXMgKDAsMCkgYW5kIHNldCBpdHMKKyAgICAgICAgaGVhZGluZyB0byBpdHMgc3RhcnQtb3JpZW50YXRpb24gKHdoaWNoIGRlcGVuZHMgb24gbW9kZSkuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuaG9tZSgpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmdvdG8oMCwgMCkKKyAgICAgICAgc2VsZi5zZXRoZWFkaW5nKDApCisKKyAgICBkZWYgc2V0eChzZWxmLCB4KToKKyAgICAgICAgIiIiU2V0IHRoZSB0dXJ0bGUncyBmaXJzdCBjb29yZGluYXRlIHRvIHgKKworICAgICAgICBBcmd1bWVudDoKKyAgICAgICAgeCAtLSBhIG51bWJlciAoaW50ZWdlciBvciBmbG9hdCkKKworICAgICAgICBTZXQgdGhlIHR1cnRsZSdzIGZpcnN0IGNvb3JkaW5hdGUgdG8geCwgbGVhdmUgc2Vjb25kIGNvb3JkaW5hdGUKKyAgICAgICAgdW5jaGFuZ2VkLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnBvc2l0aW9uKCkKKyAgICAgICAgKDAuMDAsIDI0MC4wMCkKKyAgICAgICAgPj4+IHR1cnRsZS5zZXR4KDEwKQorICAgICAgICA+Pj4gdHVydGxlLnBvc2l0aW9uKCkKKyAgICAgICAgKDEwLjAwLCAyNDAuMDApCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9nb3RvKFZlYzJEKHgsIHNlbGYuX3Bvc2l0aW9uWzFdKSkKKworICAgIGRlZiBzZXR5KHNlbGYsIHkpOgorICAgICAgICAiIiJTZXQgdGhlIHR1cnRsZSdzIHNlY29uZCBjb29yZGluYXRlIHRvIHkKKworICAgICAgICBBcmd1bWVudDoKKyAgICAgICAgeSAtLSBhIG51bWJlciAoaW50ZWdlciBvciBmbG9hdCkKKworICAgICAgICBTZXQgdGhlIHR1cnRsZSdzIGZpcnN0IGNvb3JkaW5hdGUgdG8geCwgc2Vjb25kIGNvb3JkaW5hdGUgcmVtYWlucworICAgICAgICB1bmNoYW5nZWQuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUucG9zaXRpb24oKQorICAgICAgICAoMC4wMCwgNDAuMDApCisgICAgICAgID4+PiB0dXJ0bGUuc2V0eSgtMTApCisgICAgICAgID4+PiB0dXJ0bGUucG9zaXRpb24oKQorICAgICAgICAoMC4wMCwgLTEwLjAwKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZ290byhWZWMyRChzZWxmLl9wb3NpdGlvblswXSwgeSkpCisKKyAgICBkZWYgZGlzdGFuY2Uoc2VsZiwgeCwgeT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSB0dXJ0bGUgdG8gKHgseSkgaW4gdHVydGxlIHN0ZXAgdW5pdHMuCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICB4IC0tIGEgbnVtYmVyICAgb3IgIGEgcGFpci92ZWN0b3Igb2YgbnVtYmVycyAgIG9yICAgYSB0dXJ0bGUgaW5zdGFuY2UKKyAgICAgICAgeSAtLSBhIG51bWJlciAgICAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUKKworICAgICAgICBjYWxsOiBkaXN0YW5jZSh4LCB5KSAgICAgICAgICMgdHdvIGNvb3JkaW5hdGVzCisgICAgICAgIC0tb3I6IGRpc3RhbmNlKCh4LCB5KSkgICAgICAgIyBhIHBhaXIgKHR1cGxlKSBvZiBjb29yZGluYXRlcworICAgICAgICAtLW9yOiBkaXN0YW5jZSh2ZWMpICAgICAgICAgICMgZS5nLiBhcyByZXR1cm5lZCBieSBwb3MoKQorICAgICAgICAtLW9yOiBkaXN0YW5jZShteXBlbikgICAgICAgICMgd2hlcmUgbXlwZW4gaXMgYW5vdGhlciB0dXJ0bGUKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5wb3MoKQorICAgICAgICAoMC4wMCwgMC4wMCkKKyAgICAgICAgPj4+IHR1cnRsZS5kaXN0YW5jZSgzMCw0MCkKKyAgICAgICAgNTAuMAorICAgICAgICA+Pj4gcGVuID0gVHVydGxlKCkKKyAgICAgICAgPj4+IHBlbi5mb3J3YXJkKDc3KQorICAgICAgICA+Pj4gdHVydGxlLmRpc3RhbmNlKHBlbikKKyAgICAgICAgNzcuMAorICAgICAgICAiIiIKKyAgICAgICAgaWYgeSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBvcyA9IFZlYzJEKHgsIHkpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoeCwgVmVjMkQpOgorICAgICAgICAgICAgcG9zID0geAorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoeCwgdHVwbGUpOgorICAgICAgICAgICAgcG9zID0gVmVjMkQoKngpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh4LCBUTmF2aWdhdG9yKToKKyAgICAgICAgICAgIHBvcyA9IHguX3Bvc2l0aW9uCisgICAgICAgIHJldHVybiBhYnMocG9zIC0gc2VsZi5fcG9zaXRpb24pCisKKyAgICBkZWYgdG93YXJkcyhzZWxmLCB4LCB5PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGFuZ2xlIG9mIHRoZSBsaW5lIGZyb20gdGhlIHR1cnRsZSdzIHBvc2l0aW9uIHRvICh4LCB5KS4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIHggLS0gYSBudW1iZXIgICBvciAgYSBwYWlyL3ZlY3RvciBvZiBudW1iZXJzICAgb3IgICBhIHR1cnRsZSBpbnN0YW5jZQorICAgICAgICB5IC0tIGEgbnVtYmVyICAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZQorCisgICAgICAgIGNhbGw6IGRpc3RhbmNlKHgsIHkpICAgICAgICAgIyB0d28gY29vcmRpbmF0ZXMKKyAgICAgICAgLS1vcjogZGlzdGFuY2UoKHgsIHkpKSAgICAgICAjIGEgcGFpciAodHVwbGUpIG9mIGNvb3JkaW5hdGVzCisgICAgICAgIC0tb3I6IGRpc3RhbmNlKHZlYykgICAgICAgICAgIyBlLmcuIGFzIHJldHVybmVkIGJ5IHBvcygpCisgICAgICAgIC0tb3I6IGRpc3RhbmNlKG15cGVuKSAgICAgICAgIyB3aGVyZSBteXBlbiBpcyBhbm90aGVyIHR1cnRsZQorCisgICAgICAgIFJldHVybiB0aGUgYW5nbGUsIGJldHdlZW4gdGhlIGxpbmUgZnJvbSB0dXJ0bGUtcG9zaXRpb24gdG8gcG9zaXRpb24KKyAgICAgICAgc3BlY2lmaWVkIGJ5IHgsIHkgYW5kIHRoZSB0dXJ0bGUncyBzdGFydCBvcmllbnRhdGlvbi4gKERlcGVuZHMgb24KKyAgICAgICAgbW9kZXMgLSAic3RhbmRhcmQiIG9yICJsb2dvIikKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5wb3MoKQorICAgICAgICAoMTAuMDAsIDEwLjAwKQorICAgICAgICA+Pj4gdHVydGxlLnRvd2FyZHMoMCwwKQorICAgICAgICAyMjUuMAorICAgICAgICAiIiIKKyAgICAgICAgaWYgeSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBvcyA9IFZlYzJEKHgsIHkpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoeCwgVmVjMkQpOgorICAgICAgICAgICAgcG9zID0geAorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoeCwgdHVwbGUpOgorICAgICAgICAgICAgcG9zID0gVmVjMkQoKngpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh4LCBUTmF2aWdhdG9yKToKKyAgICAgICAgICAgIHBvcyA9IHguX3Bvc2l0aW9uCisgICAgICAgIHgsIHkgPSBwb3MgLSBzZWxmLl9wb3NpdGlvbgorICAgICAgICByZXN1bHQgPSByb3VuZChtYXRoLmF0YW4yKHksIHgpKjE4MC4wL21hdGgucGksIDEwKSAlIDM2MC4wCisgICAgICAgIHJlc3VsdCAvPSBzZWxmLl9kZWdyZWVzUGVyQVUKKyAgICAgICAgcmV0dXJuIChzZWxmLl9hbmdsZU9mZnNldCArIHNlbGYuX2FuZ2xlT3JpZW50KnJlc3VsdCkgJSBzZWxmLl9mdWxsY2lyY2xlCisKKyAgICBkZWYgaGVhZGluZyhzZWxmKToKKyAgICAgICAgIiIiIFJldHVybiB0aGUgdHVydGxlJ3MgY3VycmVudCBoZWFkaW5nLgorCisgICAgICAgIE5vIGFyZ3VtZW50cy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDY3KQorICAgICAgICA+Pj4gdHVydGxlLmhlYWRpbmcoKQorICAgICAgICA2Ny4wCisgICAgICAgICIiIgorICAgICAgICB4LCB5ID0gc2VsZi5fb3JpZW50CisgICAgICAgIHJlc3VsdCA9IHJvdW5kKG1hdGguYXRhbjIoeSwgeCkqMTgwLjAvbWF0aC5waSwgMTApICUgMzYwLjAKKyAgICAgICAgcmVzdWx0IC89IHNlbGYuX2RlZ3JlZXNQZXJBVQorICAgICAgICByZXR1cm4gKHNlbGYuX2FuZ2xlT2Zmc2V0ICsgc2VsZi5fYW5nbGVPcmllbnQqcmVzdWx0KSAlIHNlbGYuX2Z1bGxjaXJjbGUKKworICAgIGRlZiBzZXRoZWFkaW5nKHNlbGYsIHRvX2FuZ2xlKToKKyAgICAgICAgIiIiU2V0IHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgdHVydGxlIHRvIHRvX2FuZ2xlLgorCisgICAgICAgIEFsaWFzZXM6ICBzZXRoZWFkaW5nIHwgc2V0aAorCisgICAgICAgIEFyZ3VtZW50OgorICAgICAgICB0b19hbmdsZSAtLSBhIG51bWJlciAoaW50ZWdlciBvciBmbG9hdCkKKworICAgICAgICBTZXQgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSB0dXJ0bGUgdG8gdG9fYW5nbGUuCisgICAgICAgIEhlcmUgYXJlIHNvbWUgY29tbW9uIGRpcmVjdGlvbnMgaW4gZGVncmVlczoKKworICAgICAgICAgc3RhbmRhcmQgLSBtb2RlOiAgICAgICAgICBsb2dvLW1vZGU6CisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgMCAtIGVhc3QgICAgICAgICAgICAgICAgMCAtIG5vcnRoCisgICAgICAgICAgOTAgLSBub3J0aCAgICAgICAgICAgICAgOTAgLSBlYXN0CisgICAgICAgICAxODAgLSB3ZXN0ICAgICAgICAgICAgICAxODAgLSBzb3V0aAorICAgICAgICAgMjcwIC0gc291dGggICAgICAgICAgICAgMjcwIC0gd2VzdAorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnNldGhlYWRpbmcoOTApCisgICAgICAgID4+PiB0dXJ0bGUuaGVhZGluZygpCisgICAgICAgIDkwCisgICAgICAgICIiIgorICAgICAgICBhbmdsZSA9ICh0b19hbmdsZSAtIHNlbGYuaGVhZGluZygpKSpzZWxmLl9hbmdsZU9yaWVudAorICAgICAgICBmdWxsID0gc2VsZi5fZnVsbGNpcmNsZQorICAgICAgICBhbmdsZSA9IChhbmdsZStmdWxsLzIuKSVmdWxsIC0gZnVsbC8yLgorICAgICAgICBzZWxmLl9yb3RhdGUoYW5nbGUpCisKKyAgICBkZWYgY2lyY2xlKHNlbGYsIHJhZGl1cywgZXh0ZW50ID0gTm9uZSwgc3RlcHMgPSBOb25lKToKKyAgICAgICAgIiIiIERyYXcgYSBjaXJjbGUgd2l0aCBnaXZlbiByYWRpdXMuCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICByYWRpdXMgLS0gYSBudW1iZXIKKyAgICAgICAgZXh0ZW50IChvcHRpb25hbCkgLS0gYSBudW1iZXIKKyAgICAgICAgc3RlcHMgKG9wdGlvbmFsKSAtLSBhbiBpbnRlZ2VyCisKKyAgICAgICAgRHJhdyBhIGNpcmNsZSB3aXRoIGdpdmVuIHJhZGl1cy4gVGhlIGNlbnRlciBpcyByYWRpdXMgdW5pdHMgbGVmdAorICAgICAgICBvZiB0aGUgdHVydGxlOyBleHRlbnQgLSBhbiBhbmdsZSAtIGRldGVybWluZXMgd2hpY2ggcGFydCBvZiB0aGUKKyAgICAgICAgY2lyY2xlIGlzIGRyYXduLiBJZiBleHRlbnQgaXMgbm90IGdpdmVuLCBkcmF3IHRoZSBlbnRpcmUgY2lyY2xlLgorICAgICAgICBJZiBleHRlbnQgaXMgbm90IGEgZnVsbCBjaXJjbGUsIG9uZSBlbmRwb2ludCBvZiB0aGUgYXJjIGlzIHRoZQorICAgICAgICBjdXJyZW50IHBlbiBwb3NpdGlvbi4gRHJhdyB0aGUgYXJjIGluIGNvdW50ZXJjbG9ja3dpc2UgZGlyZWN0aW9uCisgICAgICAgIGlmIHJhZGl1cyBpcyBwb3NpdGl2ZSwgb3RoZXJ3aXNlIGluIGNsb2Nrd2lzZSBkaXJlY3Rpb24uIEZpbmFsbHkKKyAgICAgICAgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdHVydGxlIGlzIGNoYW5nZWQgYnkgdGhlIGFtb3VudCBvZiBleHRlbnQuCisKKyAgICAgICAgQXMgdGhlIGNpcmNsZSBpcyBhcHByb3hpbWF0ZWQgYnkgYW4gaW5zY3JpYmVkIHJlZ3VsYXIgcG9seWdvbiwKKyAgICAgICAgc3RlcHMgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHN0ZXBzIHRvIHVzZS4gSWYgbm90IGdpdmVuLAorICAgICAgICBpdCB3aWxsIGJlIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseS4gTWF5YmUgdXNlZCB0byBkcmF3IHJlZ3VsYXIKKyAgICAgICAgcG9seWdvbnMuCisKKyAgICAgICAgY2FsbDogY2lyY2xlKHJhZGl1cykgICAgICAgICAgICAgICAgICAjIGZ1bGwgY2lyY2xlCisgICAgICAgIC0tb3I6IGNpcmNsZShyYWRpdXMsIGV4dGVudCkgICAgICAgICAgIyBhcmMKKyAgICAgICAgLS1vcjogY2lyY2xlKHJhZGl1cywgZXh0ZW50LCBzdGVwcykKKyAgICAgICAgLS1vcjogY2lyY2xlKHJhZGl1cywgc3RlcHM9NikgICAgICAgICAjIDYtc2lkZWQgcG9seWdvbgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmNpcmNsZSg1MCkKKyAgICAgICAgPj4+IHR1cnRsZS5jaXJjbGUoMTIwLCAxODApICAjIHNlbWljaXJjbGUKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYudW5kb2J1ZmZlcjoKKyAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5wdXNoKFsic2VxIl0pCisgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIuY3VtdWxhdGUgPSBUcnVlCisgICAgICAgIHNwZWVkID0gc2VsZi5zcGVlZCgpCisgICAgICAgIGlmIGV4dGVudCBpcyBOb25lOgorICAgICAgICAgICAgZXh0ZW50ID0gc2VsZi5fZnVsbGNpcmNsZQorICAgICAgICBpZiBzdGVwcyBpcyBOb25lOgorICAgICAgICAgICAgZnJhYyA9IGFicyhleHRlbnQpL3NlbGYuX2Z1bGxjaXJjbGUKKyAgICAgICAgICAgIHN0ZXBzID0gMStpbnQobWluKDExK2FicyhyYWRpdXMpLzYuMCwgNTkuMCkqZnJhYykKKyAgICAgICAgdyA9IDEuMCAqIGV4dGVudCAvIHN0ZXBzCisgICAgICAgIHcyID0gMC41ICogdworICAgICAgICBsID0gMi4wICogcmFkaXVzICogbWF0aC5zaW4odzIqbWF0aC5waS8xODAuMCpzZWxmLl9kZWdyZWVzUGVyQVUpCisgICAgICAgIGlmIHJhZGl1cyA8IDA6CisgICAgICAgICAgICBsLCB3LCB3MiA9IC1sLCAtdywgLXcyCisgICAgICAgIHRyID0gc2VsZi50cmFjZXIoKQorICAgICAgICBkbCA9IHNlbGYuX2RlbGF5KCkKKyAgICAgICAgaWYgc3BlZWQgPT0gMDoKKyAgICAgICAgICAgIHNlbGYudHJhY2VyKDAsIDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNwZWVkKDApCisgICAgICAgIHNlbGYuX3JvdGF0ZSh3MikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RlcHMpOgorICAgICAgICAgICAgc2VsZi5zcGVlZChzcGVlZCkKKyAgICAgICAgICAgIHNlbGYuX2dvKGwpCisgICAgICAgICAgICBzZWxmLnNwZWVkKDApCisgICAgICAgICAgICBzZWxmLl9yb3RhdGUodykKKyAgICAgICAgc2VsZi5fcm90YXRlKC13MikKKyAgICAgICAgaWYgc3BlZWQgPT0gMDoKKyAgICAgICAgICAgIHNlbGYudHJhY2VyKHRyLCBkbCkKKyAgICAgICAgc2VsZi5zcGVlZChzcGVlZCkKKyAgICAgICAgaWYgc2VsZi51bmRvYnVmZmVyOgorICAgICAgICAgICAgc2VsZi51bmRvYnVmZmVyLmN1bXVsYXRlID0gRmFsc2UKKworIyMgdGhyZWUgZHVtbXkgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSBjaGlsZCBjbGFzczoKKworICAgIGRlZiBzcGVlZChzZWxmLCBzPTApOgorICAgICAgICAiIiJkdW1teSBtZXRob2QgLSB0byBiZSBvdmVyd3JpdHRlbiBieSBjaGlsZCBjbGFzcyIiIgorICAgIGRlZiB0cmFjZXIoc2VsZiwgYT1Ob25lLCBiPU5vbmUpOgorICAgICAgICAiIiJkdW1teSBtZXRob2QgLSB0byBiZSBvdmVyd3JpdHRlbiBieSBjaGlsZCBjbGFzcyIiIgorICAgIGRlZiBfZGVsYXkoc2VsZiwgbj1Ob25lKToKKyAgICAgICAgIiIiZHVtbXkgbWV0aG9kIC0gdG8gYmUgb3ZlcndyaXR0ZW4gYnkgY2hpbGQgY2xhc3MiIiIKKworICAgIGZkID0gZm9yd2FyZAorICAgIGJrID0gYmFjaworICAgIGJhY2t3YXJkID0gYmFjaworICAgIHJ0ID0gcmlnaHQKKyAgICBsdCA9IGxlZnQKKyAgICBwb3NpdGlvbiA9IHBvcworICAgIHNldHBvcyA9IGdvdG8KKyAgICBzZXRwb3NpdGlvbiA9IGdvdG8KKyAgICBzZXRoID0gc2V0aGVhZGluZworCisKK2NsYXNzIFRQZW4ob2JqZWN0KToKKyAgICAiIiJEcmF3aW5nIHBhcnQgb2YgdGhlIFJhd1R1cnRsZS4KKyAgICBJbXBsZW1lbnRzIGRyYXdpbmcgcHJvcGVydGllcy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVzaXplbW9kZT1fQ0ZHWyJyZXNpemVtb2RlIl0pOgorICAgICAgICBzZWxmLl9yZXNpemVtb2RlID0gcmVzaXplbW9kZSAjIG9yICJ1c2VyIiBvciAibm9yZXNpemUiCisgICAgICAgIHNlbGYudW5kb2J1ZmZlciA9IE5vbmUKKyAgICAgICAgVFBlbi5fcmVzZXQoc2VsZikKKworICAgIGRlZiBfcmVzZXQoc2VsZiwgcGVuY29sb3I9X0NGR1sicGVuY29sb3IiXSwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGxjb2xvcj1fQ0ZHWyJmaWxsY29sb3IiXSk6CisgICAgICAgIHNlbGYuX3BlbnNpemUgPSAxCisgICAgICAgIHNlbGYuX3Nob3duID0gVHJ1ZQorICAgICAgICBzZWxmLl9wZW5jb2xvciA9IHBlbmNvbG9yCisgICAgICAgIHNlbGYuX2ZpbGxjb2xvciA9IGZpbGxjb2xvcgorICAgICAgICBzZWxmLl9kcmF3aW5nID0gVHJ1ZQorICAgICAgICBzZWxmLl9zcGVlZCA9IDMKKyAgICAgICAgc2VsZi5fc3RyZXRjaGZhY3RvciA9ICgxLCAxKQorICAgICAgICBzZWxmLl90aWx0ID0gMAorICAgICAgICBzZWxmLl9vdXRsaW5ld2lkdGggPSAxCisgICAgICAgICMjIyBzZWxmLnNjcmVlbiA9IE5vbmUgICMgdG8gb3ZlcnJpZGUgYnkgY2hpbGQgY2xhc3MKKworICAgIGRlZiByZXNpemVtb2RlKHNlbGYsIHJtb2RlPU5vbmUpOgorICAgICAgICAiIiJTZXQgcmVzaXplbW9kZSB0byBvbmUgb2YgdGhlIHZhbHVlczogImF1dG8iLCAidXNlciIsICJub3Jlc2l6ZSIuCisKKyAgICAgICAgKE9wdGlvbmFsKSBBcmd1bWVudDoKKyAgICAgICAgcm1vZGUgLS0gb25lIG9mIHRoZSBzdHJpbmdzICJhdXRvIiwgInVzZXIiLCAibm9yZXNpemUiCisKKyAgICAgICAgRGlmZmVyZW50IHJlc2l6ZW1vZGVzIGhhdmUgdGhlIGZvbGxvd2luZyBlZmZlY3RzOgorICAgICAgICAgIC0gImF1dG8iIGFkYXB0cyB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgdHVydGxlCisgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUgb2YgcGVuc2l6ZS4KKyAgICAgICAgICAtICJ1c2VyIiBhZGFwdHMgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIHR1cnRsZSBhY2NvcmRpbmcgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgdmFsdWVzIG9mIHN0cmV0Y2hmYWN0b3IgYW5kIG91dGxpbmV3aWR0aCAob3V0bGluZSksCisgICAgICAgICAgICAgICAgICAgd2hpY2ggYXJlIHNldCBieSBzaGFwZXNpemUoKQorICAgICAgICAgIC0gIm5vcmVzaXplIiBubyBhZGFwdGlvbiBvZiB0aGUgdHVydGxlJ3MgYXBwZWFyYW5jZSB0YWtlcyBwbGFjZS4KKyAgICAgICAgSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiBjdXJyZW50IHJlc2l6ZW1vZGUuCisgICAgICAgIHJlc2l6ZW1vZGUoInVzZXIiKSBpcyBjYWxsZWQgYnkgYSBjYWxsIG9mIHNoYXBlc2l6ZSB3aXRoIGFyZ3VtZW50cy4KKworCisgICAgICAgIEV4YW1wbGVzIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5yZXNpemVtb2RlKCJub3Jlc2l6ZSIpCisgICAgICAgID4+PiB0dXJ0bGUucmVzaXplbW9kZSgpCisgICAgICAgICdub3Jlc2l6ZScKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHJtb2RlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVzaXplbW9kZQorICAgICAgICBybW9kZSA9IHJtb2RlLmxvd2VyKCkKKyAgICAgICAgaWYgcm1vZGUgaW4gWyJhdXRvIiwgInVzZXIiLCAibm9yZXNpemUiXToKKyAgICAgICAgICAgIHNlbGYucGVuKHJlc2l6ZW1vZGU9cm1vZGUpCisKKyAgICBkZWYgcGVuc2l6ZShzZWxmLCB3aWR0aD1Ob25lKToKKyAgICAgICAgIiIiU2V0IG9yIHJldHVybiB0aGUgbGluZSB0aGlja25lc3MuCisKKyAgICAgICAgQWxpYXNlczogIHBlbnNpemUgfCB3aWR0aAorCisgICAgICAgIEFyZ3VtZW50OgorICAgICAgICB3aWR0aCAtLSBwb3NpdGl2ZSBudW1iZXIKKworICAgICAgICBTZXQgdGhlIGxpbmUgdGhpY2tuZXNzIHRvIHdpZHRoIG9yIHJldHVybiBpdC4gSWYgcmVzaXplbW9kZSBpcyBzZXQKKyAgICAgICAgdG8gImF1dG8iIGFuZCB0dXJ0bGVzaGFwZSBpcyBhIHBvbHlnb24sIHRoYXQgcG9seWdvbiBpcyBkcmF3biB3aXRoCisgICAgICAgIHRoZSBzYW1lIGxpbmUgdGhpY2tuZXNzLiBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgY3VycmVudCBwZW5zaXplCisgICAgICAgIGlzIHJldHVybmVkLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnBlbnNpemUoKQorICAgICAgICAxCisgICAgICAgID4+PiB0dXJ0bGUucGVuc2l6ZSgxMCkgICAjIGZyb20gaGVyZSBvbiBsaW5lcyBvZiB3aWR0aCAxMCBhcmUgZHJhd24KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHdpZHRoIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcGVuc2l6ZQorICAgICAgICBzZWxmLnBlbihwZW5zaXplPXdpZHRoKQorCisKKyAgICBkZWYgcGVudXAoc2VsZik6CisgICAgICAgICIiIlB1bGwgdGhlIHBlbiB1cCAtLSBubyBkcmF3aW5nIHdoZW4gbW92aW5nLgorCisgICAgICAgIEFsaWFzZXM6IHBlbnVwIHwgcHUgfCB1cAorCisgICAgICAgIE5vIGFyZ3VtZW50CisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUucGVudXAoKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX2RyYXdpbmc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5wZW4ocGVuZG93bj1GYWxzZSkKKworICAgIGRlZiBwZW5kb3duKHNlbGYpOgorICAgICAgICAiIiJQdWxsIHRoZSBwZW4gZG93biAtLSBkcmF3aW5nIHdoZW4gbW92aW5nLgorCisgICAgICAgIEFsaWFzZXM6IHBlbmRvd24gfCBwZCB8IGRvd24KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5wZW5kb3duKCkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX2RyYXdpbmc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5wZW4ocGVuZG93bj1UcnVlKQorCisgICAgZGVmIGlzZG93bihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgcGVuIGlzIGRvd24sIEZhbHNlIGlmIGl0J3MgdXAuCisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUucGVudXAoKQorICAgICAgICA+Pj4gdHVydGxlLmlzZG93bigpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiB0dXJ0bGUucGVuZG93bigpCisgICAgICAgID4+PiB0dXJ0bGUuaXNkb3duKCkKKyAgICAgICAgVHJ1ZQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RyYXdpbmcKKworICAgIGRlZiBzcGVlZChzZWxmLCBzcGVlZD1Ob25lKToKKyAgICAgICAgIiIiIFJldHVybiBvciBzZXQgdGhlIHR1cnRsZSdzIHNwZWVkLgorCisgICAgICAgIE9wdGlvbmFsIGFyZ3VtZW50OgorICAgICAgICBzcGVlZCAtLSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSAwLi4xMCBvciBhIHNwZWVkc3RyaW5nIChzZWUgYmVsb3cpCisKKyAgICAgICAgU2V0IHRoZSB0dXJ0bGUncyBzcGVlZCB0byBhbiBpbnRlZ2VyIHZhbHVlIGluIHRoZSByYW5nZSAwIC4uIDEwLgorICAgICAgICBJZiBubyBhcmd1bWVudCBpcyBnaXZlbjogcmV0dXJuIGN1cnJlbnQgc3BlZWQuCisKKyAgICAgICAgSWYgaW5wdXQgaXMgYSBudW1iZXIgZ3JlYXRlciB0aGFuIDEwIG9yIHNtYWxsZXIgdGhhbiAwLjUsCisgICAgICAgIHNwZWVkIGlzIHNldCB0byAwLgorICAgICAgICBTcGVlZHN0cmluZ3MgIGFyZSBtYXBwZWQgdG8gc3BlZWR2YWx1ZXMgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisgICAgICAgICAgICAnZmFzdGVzdCcgOiAgMAorICAgICAgICAgICAgJ2Zhc3QnICAgIDogIDEwCisgICAgICAgICAgICAnbm9ybWFsJyAgOiAgNgorICAgICAgICAgICAgJ3Nsb3cnICAgIDogIDMKKyAgICAgICAgICAgICdzbG93ZXN0JyA6ICAxCisgICAgICAgIHNwZWVkcyBmcm9tIDEgdG8gMTAgZW5mb3JjZSBpbmNyZWFzaW5nbHkgZmFzdGVyIGFuaW1hdGlvbiBvZgorICAgICAgICBsaW5lIGRyYXdpbmcgYW5kIHR1cnRsZSB0dXJuaW5nLgorCisgICAgICAgIEF0dGVudGlvbjoKKyAgICAgICAgc3BlZWQgPSAwIDogKm5vKiBhbmltYXRpb24gdGFrZXMgcGxhY2UuIGZvcndhcmQvYmFjayBtYWtlcyB0dXJ0bGUganVtcAorICAgICAgICBhbmQgbGlrZXdpc2UgbGVmdC9yaWdodCBtYWtlIHRoZSB0dXJ0bGUgdHVybiBpbnN0YW50bHkuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuc3BlZWQoMykKKyAgICAgICAgIiIiCisgICAgICAgIHNwZWVkcyA9IHsnZmFzdGVzdCc6MCwgJ2Zhc3QnOjEwLCAnbm9ybWFsJzo2LCAnc2xvdyc6MywgJ3Nsb3dlc3QnOjEgfQorICAgICAgICBpZiBzcGVlZCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NwZWVkCisgICAgICAgIGlmIHNwZWVkIGluIHNwZWVkczoKKyAgICAgICAgICAgIHNwZWVkID0gc3BlZWRzW3NwZWVkXQorICAgICAgICBlbGlmIDAuNSA8IHNwZWVkIDwgMTAuNToKKyAgICAgICAgICAgIHNwZWVkID0gaW50KHJvdW5kKHNwZWVkKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNwZWVkID0gMAorICAgICAgICBzZWxmLnBlbihzcGVlZD1zcGVlZCkKKworICAgIGRlZiBjb2xvcihzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlJldHVybiBvciBzZXQgdGhlIHBlbmNvbG9yIGFuZCBmaWxsY29sb3IuCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICBTZXZlcmFsIGlucHV0IGZvcm1hdHMgYXJlIGFsbG93ZWQuCisgICAgICAgIFRoZXkgdXNlIDAsIDEsIDIsIG9yIDMgYXJndW1lbnRzIGFzIGZvbGxvd3M6CisKKyAgICAgICAgY29sb3IoKQorICAgICAgICAgICAgUmV0dXJuIHRoZSBjdXJyZW50IHBlbmNvbG9yIGFuZCB0aGUgY3VycmVudCBmaWxsY29sb3IKKyAgICAgICAgICAgIGFzIGEgcGFpciBvZiBjb2xvciBzcGVjaWZpY2F0aW9uIHN0cmluZ3MgYXMgYXJlIHJldHVybmVkCisgICAgICAgICAgICBieSBwZW5jb2xvciBhbmQgZmlsbGNvbG9yLgorICAgICAgICBjb2xvcihjb2xvcnN0cmluZyksIGNvbG9yKChyLGcsYikpLCBjb2xvcihyLGcsYikKKyAgICAgICAgICAgIGlucHV0cyBhcyBpbiBwZW5jb2xvciwgc2V0IGJvdGgsIGZpbGxjb2xvciBhbmQgcGVuY29sb3IsCisgICAgICAgICAgICB0byB0aGUgZ2l2ZW4gdmFsdWUuCisgICAgICAgIGNvbG9yKGNvbG9yc3RyaW5nMSwgY29sb3JzdHJpbmcyKSwKKyAgICAgICAgY29sb3IoKHIxLGcxLGIxKSwgKHIyLGcyLGIyKSkKKyAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8gcGVuY29sb3IoY29sb3JzdHJpbmcxKSBhbmQgZmlsbGNvbG9yKGNvbG9yc3RyaW5nMikKKyAgICAgICAgICAgIGFuZCBhbmFsb2dvdXNseSwgaWYgdGhlIG90aGVyIGlucHV0IGZvcm1hdCBpcyB1c2VkLgorCisgICAgICAgIElmIHR1cnRsZXNoYXBlIGlzIGEgcG9seWdvbiwgb3V0bGluZSBhbmQgaW50ZXJpb3Igb2YgdGhhdCBwb2x5Z29uCisgICAgICAgIGlzIGRyYXduIHdpdGggdGhlIG5ld2x5IHNldCBjb2xvcnMuCisgICAgICAgIEZvciBtb3IgaW5mbyBzZWU6IHBlbmNvbG9yLCBmaWxsY29sb3IKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5jb2xvcigncmVkJywgJ2dyZWVuJykKKyAgICAgICAgPj4+IHR1cnRsZS5jb2xvcigpCisgICAgICAgICgncmVkJywgJ2dyZWVuJykKKyAgICAgICAgPj4+IGNvbG9ybW9kZSgyNTUpCisgICAgICAgID4+PiBjb2xvcigoNDAsIDgwLCAxMjApLCAoMTYwLCAyMDAsIDI0MCkpCisgICAgICAgID4+PiBjb2xvcigpCisgICAgICAgICgnIzI4NTA3OCcsICcjYTBjOGYwJykKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBsID0gbGVuKGFyZ3MpCisgICAgICAgICAgICBpZiBsID09IDE6CisgICAgICAgICAgICAgICAgcGNvbG9yID0gZmNvbG9yID0gYXJnc1swXQorICAgICAgICAgICAgZWxpZiBsID09IDI6CisgICAgICAgICAgICAgICAgcGNvbG9yLCBmY29sb3IgPSBhcmdzCisgICAgICAgICAgICBlbGlmIGwgPT0gMzoKKyAgICAgICAgICAgICAgICBwY29sb3IgPSBmY29sb3IgPSBhcmdzCisgICAgICAgICAgICBwY29sb3IgPSBzZWxmLl9jb2xvcnN0cihwY29sb3IpCisgICAgICAgICAgICBmY29sb3IgPSBzZWxmLl9jb2xvcnN0cihmY29sb3IpCisgICAgICAgICAgICBzZWxmLnBlbihwZW5jb2xvcj1wY29sb3IsIGZpbGxjb2xvcj1mY29sb3IpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29sb3Ioc2VsZi5fcGVuY29sb3IpLCBzZWxmLl9jb2xvcihzZWxmLl9maWxsY29sb3IpCisKKyAgICBkZWYgcGVuY29sb3Ioc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiIgUmV0dXJuIG9yIHNldCB0aGUgcGVuY29sb3IuCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICBGb3VyIGlucHV0IGZvcm1hdHMgYXJlIGFsbG93ZWQ6CisgICAgICAgICAgLSBwZW5jb2xvcigpCisgICAgICAgICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgcGVuY29sb3IgYXMgY29sb3Igc3BlY2lmaWNhdGlvbiBzdHJpbmcsCisgICAgICAgICAgICBwb3NzaWJseSBpbiBoZXgtbnVtYmVyIGZvcm1hdCAoc2VlIGV4YW1wbGUpLgorICAgICAgICAgICAgTWF5IGJlIHVzZWQgYXMgaW5wdXQgdG8gYW5vdGhlciBjb2xvci9wZW5jb2xvci9maWxsY29sb3IgY2FsbC4KKyAgICAgICAgICAtIHBlbmNvbG9yKGNvbG9yc3RyaW5nKQorICAgICAgICAgICAgcyBpcyBhIFRrIGNvbG9yIHNwZWNpZmljYXRpb24gc3RyaW5nLCBzdWNoIGFzICJyZWQiIG9yICJ5ZWxsb3ciCisgICAgICAgICAgLSBwZW5jb2xvcigociwgZywgYikpCisgICAgICAgICAgICAqYSB0dXBsZSogb2YgciwgZywgYW5kIGIsIHdoaWNoIHJlcHJlc2VudCwgYW4gUkdCIGNvbG9yLAorICAgICAgICAgICAgYW5kIGVhY2ggb2YgciwgZywgYW5kIGIgYXJlIGluIHRoZSByYW5nZSAwLi5jb2xvcm1vZGUsCisgICAgICAgICAgICB3aGVyZSBjb2xvcm1vZGUgaXMgZWl0aGVyIDEuMCBvciAyNTUKKyAgICAgICAgICAtIHBlbmNvbG9yKHIsIGcsIGIpCisgICAgICAgICAgICByLCBnLCBhbmQgYiByZXByZXNlbnQgYW4gUkdCIGNvbG9yLCBhbmQgZWFjaCBvZiByLCBnLCBhbmQgYgorICAgICAgICAgICAgYXJlIGluIHRoZSByYW5nZSAwLi5jb2xvcm1vZGUKKworICAgICAgICBJZiB0dXJ0bGVzaGFwZSBpcyBhIHBvbHlnb24sIHRoZSBvdXRsaW5lIG9mIHRoYXQgcG9seWdvbiBpcyBkcmF3bgorICAgICAgICB3aXRoIHRoZSBuZXdseSBzZXQgcGVuY29sb3IuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUucGVuY29sb3IoJ2Jyb3duJykKKyAgICAgICAgPj4+IHR1cCA9ICgwLjIsIDAuOCwgMC41NSkKKyAgICAgICAgPj4+IHR1cnRsZS5wZW5jb2xvcih0dXApCisgICAgICAgID4+PiB0dXJ0bGUucGVuY29sb3IoKQorICAgICAgICAnIzMzY2M4YycKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBjb2xvciA9IHNlbGYuX2NvbG9yc3RyKGFyZ3MpCisgICAgICAgICAgICBpZiBjb2xvciA9PSBzZWxmLl9wZW5jb2xvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYucGVuKHBlbmNvbG9yPWNvbG9yKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvbG9yKHNlbGYuX3BlbmNvbG9yKQorCisgICAgZGVmIGZpbGxjb2xvcihzZWxmLCAqYXJncyk6CisgICAgICAgICIiIiBSZXR1cm4gb3Igc2V0IHRoZSBmaWxsY29sb3IuCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICBGb3VyIGlucHV0IGZvcm1hdHMgYXJlIGFsbG93ZWQ6CisgICAgICAgICAgLSBmaWxsY29sb3IoKQorICAgICAgICAgICAgUmV0dXJuIHRoZSBjdXJyZW50IGZpbGxjb2xvciBhcyBjb2xvciBzcGVjaWZpY2F0aW9uIHN0cmluZywKKyAgICAgICAgICAgIHBvc3NpYmx5IGluIGhleC1udW1iZXIgZm9ybWF0IChzZWUgZXhhbXBsZSkuCisgICAgICAgICAgICBNYXkgYmUgdXNlZCBhcyBpbnB1dCB0byBhbm90aGVyIGNvbG9yL3BlbmNvbG9yL2ZpbGxjb2xvciBjYWxsLgorICAgICAgICAgIC0gZmlsbGNvbG9yKGNvbG9yc3RyaW5nKQorICAgICAgICAgICAgcyBpcyBhIFRrIGNvbG9yIHNwZWNpZmljYXRpb24gc3RyaW5nLCBzdWNoIGFzICJyZWQiIG9yICJ5ZWxsb3ciCisgICAgICAgICAgLSBmaWxsY29sb3IoKHIsIGcsIGIpKQorICAgICAgICAgICAgKmEgdHVwbGUqIG9mIHIsIGcsIGFuZCBiLCB3aGljaCByZXByZXNlbnQsIGFuIFJHQiBjb2xvciwKKyAgICAgICAgICAgIGFuZCBlYWNoIG9mIHIsIGcsIGFuZCBiIGFyZSBpbiB0aGUgcmFuZ2UgMC4uY29sb3Jtb2RlLAorICAgICAgICAgICAgd2hlcmUgY29sb3Jtb2RlIGlzIGVpdGhlciAxLjAgb3IgMjU1CisgICAgICAgICAgLSBmaWxsY29sb3IociwgZywgYikKKyAgICAgICAgICAgIHIsIGcsIGFuZCBiIHJlcHJlc2VudCBhbiBSR0IgY29sb3IsIGFuZCBlYWNoIG9mIHIsIGcsIGFuZCBiCisgICAgICAgICAgICBhcmUgaW4gdGhlIHJhbmdlIDAuLmNvbG9ybW9kZQorCisgICAgICAgIElmIHR1cnRsZXNoYXBlIGlzIGEgcG9seWdvbiwgdGhlIGludGVyaW9yIG9mIHRoYXQgcG9seWdvbiBpcyBkcmF3bgorICAgICAgICB3aXRoIHRoZSBuZXdseSBzZXQgZmlsbGNvbG9yLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmZpbGxjb2xvcigndmlvbGV0JykKKyAgICAgICAgPj4+IGNvbCA9IHR1cnRsZS5wZW5jb2xvcigpCisgICAgICAgID4+PiB0dXJ0bGUuZmlsbGNvbG9yKGNvbCkKKyAgICAgICAgPj4+IHR1cnRsZS5maWxsY29sb3IoMCwgLjUsIDApCisgICAgICAgICIiIgorICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgY29sb3IgPSBzZWxmLl9jb2xvcnN0cihhcmdzKQorICAgICAgICAgICAgaWYgY29sb3IgPT0gc2VsZi5fZmlsbGNvbG9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5wZW4oZmlsbGNvbG9yPWNvbG9yKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvbG9yKHNlbGYuX2ZpbGxjb2xvcikKKworICAgIGRlZiBzaG93dHVydGxlKHNlbGYpOgorICAgICAgICAiIiJNYWtlcyB0aGUgdHVydGxlIHZpc2libGUuCisKKyAgICAgICAgQWxpYXNlczogc2hvd3R1cnRsZSB8IHN0CisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuaGlkZXR1cnRsZSgpCisgICAgICAgID4+PiB0dXJ0bGUuc2hvd3R1cnRsZSgpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnBlbihzaG93bj1UcnVlKQorCisgICAgZGVmIGhpZGV0dXJ0bGUoc2VsZik6CisgICAgICAgICIiIk1ha2VzIHRoZSB0dXJ0bGUgaW52aXNpYmxlLgorCisgICAgICAgIEFsaWFzZXM6IGhpZGV0dXJ0bGUgfCBodAorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIEl0J3MgYSBnb29kIGlkZWEgdG8gZG8gdGhpcyB3aGlsZSB5b3UncmUgaW4gdGhlCisgICAgICAgIG1pZGRsZSBvZiBhIGNvbXBsaWNhdGVkIGRyYXdpbmcsIGJlY2F1c2UgaGlkaW5nCisgICAgICAgIHRoZSB0dXJ0bGUgc3BlZWRzIHVwIHRoZSBkcmF3aW5nIG9ic2VydmFibHkuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuaGlkZXR1cnRsZSgpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnBlbihzaG93bj1GYWxzZSkKKworICAgIGRlZiBpc3Zpc2libGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBUdXJ0bGUgaXMgc2hvd24sIEZhbHNlIGlmIGl0J3MgaGlkZGVuLgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmhpZGV0dXJ0bGUoKQorICAgICAgICA+Pj4gcHJpbnQgdHVydGxlLmlzdmlzaWJsZSgpOgorICAgICAgICBGYWxzZQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3duCisKKyAgICBkZWYgcGVuKHNlbGYsIHBlbj1Ob25lLCAqKnBlbmRpY3QpOgorICAgICAgICAiIiJSZXR1cm4gb3Igc2V0IHRoZSBwZW4ncyBhdHRyaWJ1dGVzLgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgICAgIHBlbiAtLSBhIGRpY3Rpb25hcnkgd2l0aCBzb21lIG9yIGFsbCBvZiB0aGUgYmVsb3cgbGlzdGVkIGtleXMuCisgICAgICAgICAgICAqKnBlbmRpY3QgLS0gb25lIG9yIG1vcmUga2V5d29yZC1hcmd1bWVudHMgd2l0aCB0aGUgYmVsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZWQga2V5cyBhcyBrZXl3b3Jkcy4KKworICAgICAgICBSZXR1cm4gb3Igc2V0IHRoZSBwZW4ncyBhdHRyaWJ1dGVzIGluIGEgJ3Blbi1kaWN0aW9uYXJ5JworICAgICAgICB3aXRoIHRoZSBmb2xsb3dpbmcga2V5L3ZhbHVlIHBhaXJzOgorICAgICAgICAgICAic2hvd24iICAgICAgOiAgIFRydWUvRmFsc2UKKyAgICAgICAgICAgInBlbmRvd24iICAgIDogICBUcnVlL0ZhbHNlCisgICAgICAgICAgICJwZW5jb2xvciIgICA6ICAgY29sb3Itc3RyaW5nIG9yIGNvbG9yLXR1cGxlCisgICAgICAgICAgICJmaWxsY29sb3IiICA6ICAgY29sb3Itc3RyaW5nIG9yIGNvbG9yLXR1cGxlCisgICAgICAgICAgICJwZW5zaXplIiAgICA6ICAgcG9zaXRpdmUgbnVtYmVyCisgICAgICAgICAgICJzcGVlZCIgICAgICA6ICAgbnVtYmVyIGluIHJhbmdlIDAuLjEwCisgICAgICAgICAgICJyZXNpemVtb2RlIiA6ICAgImF1dG8iIG9yICJ1c2VyIiBvciAibm9yZXNpemUiCisgICAgICAgICAgICJzdHJldGNoZmFjdG9yIjogKHBvc2l0aXZlIG51bWJlciwgcG9zaXRpdmUgbnVtYmVyKQorICAgICAgICAgICAib3V0bGluZSIgICAgOiAgIHBvc2l0aXZlIG51bWJlcgorICAgICAgICAgICAidGlsdCIgICAgICAgOiAgIG51bWJlcgorCisgICAgICAgIFRoaXMgZGljdGlvbmFyeSBjYW4gYmUgdXNlZCBhcyBhcmd1bWVudCBmb3IgYSBzdWJzZXF1ZW50CisgICAgICAgIHBlbigpLWNhbGwgdG8gcmVzdG9yZSB0aGUgZm9ybWVyIHBlbi1zdGF0ZS4gTW9yZW92ZXIgb25lCisgICAgICAgIG9yIG1vcmUgb2YgdGhlc2UgYXR0cmlidXRlcyBjYW4gYmUgcHJvdmlkZWQgYXMga2V5d29yZC1hcmd1bWVudHMuCisgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gc2V0IHNldmVyYWwgcGVuIGF0dHJpYnV0ZXMgaW4gb25lIHN0YXRlbWVudC4KKworCisgICAgICAgIEV4YW1wbGVzIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5wZW4oZmlsbGNvbG9yPSJibGFjayIsIHBlbmNvbG9yPSJyZWQiLCBwZW5zaXplPTEwKQorICAgICAgICA+Pj4gdHVydGxlLnBlbigpCisgICAgICAgIHsncGVuc2l6ZSc6IDEwLCAnc2hvd24nOiBUcnVlLCAncmVzaXplbW9kZSc6ICdhdXRvJywgJ291dGxpbmUnOiAxLAorICAgICAgICAncGVuY29sb3InOiAncmVkJywgJ3BlbmRvd24nOiBUcnVlLCAnZmlsbGNvbG9yJzogJ2JsYWNrJywKKyAgICAgICAgJ3N0cmV0Y2hmYWN0b3InOiAoMSwxKSwgJ3NwZWVkJzogM30KKyAgICAgICAgPj4+IHBlbnN0YXRlPXR1cnRsZS5wZW4oKQorICAgICAgICA+Pj4gdHVydGxlLmNvbG9yKCJ5ZWxsb3ciLCIiKQorICAgICAgICA+Pj4gdHVydGxlLnBlbnVwKCkKKyAgICAgICAgPj4+IHR1cnRsZS5wZW4oKQorICAgICAgICB7J3BlbnNpemUnOiAxMCwgJ3Nob3duJzogVHJ1ZSwgJ3Jlc2l6ZW1vZGUnOiAnYXV0bycsICdvdXRsaW5lJzogMSwKKyAgICAgICAgJ3BlbmNvbG9yJzogJ3llbGxvdycsICdwZW5kb3duJzogRmFsc2UsICdmaWxsY29sb3InOiAnJywKKyAgICAgICAgJ3N0cmV0Y2hmYWN0b3InOiAoMSwxKSwgJ3NwZWVkJzogM30KKyAgICAgICAgPj4+IHAucGVuKHBlbnN0YXRlLCBmaWxsY29sb3I9ImdyZWVuIikKKyAgICAgICAgPj4+IHAucGVuKCkKKyAgICAgICAgeydwZW5zaXplJzogMTAsICdzaG93bic6IFRydWUsICdyZXNpemVtb2RlJzogJ2F1dG8nLCAnb3V0bGluZSc6IDEsCisgICAgICAgICdwZW5jb2xvcic6ICdyZWQnLCAncGVuZG93bic6IFRydWUsICdmaWxsY29sb3InOiAnZ3JlZW4nLAorICAgICAgICAnc3RyZXRjaGZhY3Rvcic6ICgxLDEpLCAnc3BlZWQnOiAzfQorICAgICAgICAiIiIKKyAgICAgICAgX3BkID0gIHsic2hvd24iICAgICAgICAgOiBzZWxmLl9zaG93biwKKyAgICAgICAgICAgICAgICAicGVuZG93biIgICAgICAgOiBzZWxmLl9kcmF3aW5nLAorICAgICAgICAgICAgICAgICJwZW5jb2xvciIgICAgICA6IHNlbGYuX3BlbmNvbG9yLAorICAgICAgICAgICAgICAgICJmaWxsY29sb3IiICAgICA6IHNlbGYuX2ZpbGxjb2xvciwKKyAgICAgICAgICAgICAgICAicGVuc2l6ZSIgICAgICAgOiBzZWxmLl9wZW5zaXplLAorICAgICAgICAgICAgICAgICJzcGVlZCIgICAgICAgICA6IHNlbGYuX3NwZWVkLAorICAgICAgICAgICAgICAgICJyZXNpemVtb2RlIiAgICA6IHNlbGYuX3Jlc2l6ZW1vZGUsCisgICAgICAgICAgICAgICAgInN0cmV0Y2hmYWN0b3IiIDogc2VsZi5fc3RyZXRjaGZhY3RvciwKKyAgICAgICAgICAgICAgICAib3V0bGluZSIgICAgICAgOiBzZWxmLl9vdXRsaW5ld2lkdGgsCisgICAgICAgICAgICAgICAgInRpbHQiICAgICAgICAgIDogc2VsZi5fdGlsdAorICAgICAgICAgICAgICAgfQorCisgICAgICAgIGlmIG5vdCAocGVuIG9yIHBlbmRpY3QpOgorICAgICAgICAgICAgcmV0dXJuIF9wZAorCisgICAgICAgIGlmIGlzaW5zdGFuY2UocGVuLCBkaWN0KToKKyAgICAgICAgICAgIHAgPSBwZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHAgPSB7fQorICAgICAgICBwLnVwZGF0ZShwZW5kaWN0KQorCisgICAgICAgIF9wX2J1ZiA9IHt9CisgICAgICAgIGZvciBrZXkgaW4gcDoKKyAgICAgICAgICAgIF9wX2J1ZltrZXldID0gX3BkW2tleV0KKworICAgICAgICBpZiBzZWxmLnVuZG9idWZmZXI6CisgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIucHVzaCgoInBlbiIsIF9wX2J1ZikpCisKKyAgICAgICAgbmV3TGluZSA9IEZhbHNlCisgICAgICAgIGlmICJwZW5kb3duIiBpbiBwOgorICAgICAgICAgICAgaWYgc2VsZi5fZHJhd2luZyAhPSBwWyJwZW5kb3duIl06CisgICAgICAgICAgICAgICAgbmV3TGluZSA9IFRydWUKKyAgICAgICAgaWYgInBlbmNvbG9yIiBpbiBwOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwWyJwZW5jb2xvciJdLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgcFsicGVuY29sb3IiXSA9IHNlbGYuX2NvbG9yc3RyKChwWyJwZW5jb2xvciJdLCkpCisgICAgICAgICAgICBpZiBzZWxmLl9wZW5jb2xvciAhPSBwWyJwZW5jb2xvciJdOgorICAgICAgICAgICAgICAgIG5ld0xpbmUgPSBUcnVlCisgICAgICAgIGlmICJwZW5zaXplIiBpbiBwOgorICAgICAgICAgICAgaWYgc2VsZi5fcGVuc2l6ZSAhPSBwWyJwZW5zaXplIl06CisgICAgICAgICAgICAgICAgbmV3TGluZSA9IFRydWUKKyAgICAgICAgaWYgbmV3TGluZToKKyAgICAgICAgICAgIHNlbGYuX25ld0xpbmUoKQorICAgICAgICBpZiAicGVuZG93biIgaW4gcDoKKyAgICAgICAgICAgIHNlbGYuX2RyYXdpbmcgPSBwWyJwZW5kb3duIl0KKyAgICAgICAgaWYgInBlbmNvbG9yIiBpbiBwOgorICAgICAgICAgICAgc2VsZi5fcGVuY29sb3IgPSBwWyJwZW5jb2xvciJdCisgICAgICAgIGlmICJwZW5zaXplIiBpbiBwOgorICAgICAgICAgICAgc2VsZi5fcGVuc2l6ZSA9IHBbInBlbnNpemUiXQorICAgICAgICBpZiAiZmlsbGNvbG9yIiBpbiBwOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwWyJmaWxsY29sb3IiXSwgdHVwbGUpOgorICAgICAgICAgICAgICAgIHBbImZpbGxjb2xvciJdID0gc2VsZi5fY29sb3JzdHIoKHBbImZpbGxjb2xvciJdLCkpCisgICAgICAgICAgICBzZWxmLl9maWxsY29sb3IgPSBwWyJmaWxsY29sb3IiXQorICAgICAgICBpZiAic3BlZWQiIGluIHA6CisgICAgICAgICAgICBzZWxmLl9zcGVlZCA9IHBbInNwZWVkIl0KKyAgICAgICAgaWYgInJlc2l6ZW1vZGUiIGluIHA6CisgICAgICAgICAgICBzZWxmLl9yZXNpemVtb2RlID0gcFsicmVzaXplbW9kZSJdCisgICAgICAgIGlmICJzdHJldGNoZmFjdG9yIiBpbiBwOgorICAgICAgICAgICAgc2YgPSBwWyJzdHJldGNoZmFjdG9yIl0KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2YsIChpbnQsIGZsb2F0KSk6CisgICAgICAgICAgICAgICAgc2YgPSAoc2YsIHNmKQorICAgICAgICAgICAgc2VsZi5fc3RyZXRjaGZhY3RvciA9IHNmCisgICAgICAgIGlmICJvdXRsaW5lIiBpbiBwOgorICAgICAgICAgICAgc2VsZi5fb3V0bGluZXdpZHRoID0gcFsib3V0bGluZSJdCisgICAgICAgIGlmICJzaG93biIgaW4gcDoKKyAgICAgICAgICAgIHNlbGYuX3Nob3duID0gcFsic2hvd24iXQorICAgICAgICBpZiAidGlsdCIgaW4gcDoKKyAgICAgICAgICAgIHNlbGYuX3RpbHQgPSBwWyJ0aWx0Il0KKyAgICAgICAgc2VsZi5fdXBkYXRlKCkKKworIyMgdGhyZWUgZHVtbXkgbWV0aG9kcyB0byBiZSBpbXBsZW1lbnRlZCBieSBjaGlsZCBjbGFzczoKKworICAgIGRlZiBfbmV3TGluZShzZWxmLCB1c2VQb3MgPSBUcnVlKToKKyAgICAgICAgIiIiZHVtbXkgbWV0aG9kIC0gdG8gYmUgb3ZlcndyaXR0ZW4gYnkgY2hpbGQgY2xhc3MiIiIKKyAgICBkZWYgX3VwZGF0ZShzZWxmLCBjb3VudD1UcnVlLCBmb3JjZWQ9RmFsc2UpOgorICAgICAgICAiIiJkdW1teSBtZXRob2QgLSB0byBiZSBvdmVyd3JpdHRlbiBieSBjaGlsZCBjbGFzcyIiIgorICAgIGRlZiBfY29sb3Ioc2VsZiwgYXJncyk6CisgICAgICAgICIiImR1bW15IG1ldGhvZCAtIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IGNoaWxkIGNsYXNzIiIiCisgICAgZGVmIF9jb2xvcnN0cihzZWxmLCBhcmdzKToKKyAgICAgICAgIiIiZHVtbXkgbWV0aG9kIC0gdG8gYmUgb3ZlcndyaXR0ZW4gYnkgY2hpbGQgY2xhc3MiIiIKKworICAgIHdpZHRoID0gcGVuc2l6ZQorICAgIHVwID0gcGVudXAKKyAgICBwdSA9IHBlbnVwCisgICAgcGQgPSBwZW5kb3duCisgICAgZG93biA9IHBlbmRvd24KKyAgICBzdCA9IHNob3d0dXJ0bGUKKyAgICBodCA9IGhpZGV0dXJ0bGUKKworCitjbGFzcyBfVHVydGxlSW1hZ2Uob2JqZWN0KToKKyAgICAiIiJIZWxwZXIgY2xhc3M6IERhdGF0eXBlIHRvIHN0b3JlIFR1cnRsZSBhdHRyaWJ1dGVzCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2NyZWVuLCBzaGFwZUluZGV4KToKKyAgICAgICAgc2VsZi5zY3JlZW4gPSBzY3JlZW4KKyAgICAgICAgc2VsZi5fdHlwZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fc2V0c2hhcGUoc2hhcGVJbmRleCkKKworICAgIGRlZiBfc2V0c2hhcGUoc2VsZiwgc2hhcGVJbmRleCk6CisgICAgICAgIHNjcmVlbiA9IHNlbGYuc2NyZWVuICMgUmF3VHVydGxlLnNjcmVlbnNbc2VsZi5zY3JlZW5JbmRleF0KKyAgICAgICAgc2VsZi5zaGFwZUluZGV4ID0gc2hhcGVJbmRleAorICAgICAgICBpZiBzZWxmLl90eXBlID09ICJwb2x5Z29uIiA9PSBzY3JlZW4uX3NoYXBlc1tzaGFwZUluZGV4XS5fdHlwZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl90eXBlID09ICJpbWFnZSIgPT0gc2NyZWVuLl9zaGFwZXNbc2hhcGVJbmRleF0uX3R5cGU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fdHlwZSBpbiBbImltYWdlIiwgInBvbHlnb24iXToKKyAgICAgICAgICAgIHNjcmVlbi5fZGVsZXRlKHNlbGYuX2l0ZW0pCisgICAgICAgIGVsaWYgc2VsZi5fdHlwZSA9PSAiY29tcG91bmQiOgorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5faXRlbToKKyAgICAgICAgICAgICAgICBzY3JlZW4uX2RlbGV0ZShpdGVtKQorICAgICAgICBzZWxmLl90eXBlID0gc2NyZWVuLl9zaGFwZXNbc2hhcGVJbmRleF0uX3R5cGUKKyAgICAgICAgaWYgc2VsZi5fdHlwZSA9PSAicG9seWdvbiI6CisgICAgICAgICAgICBzZWxmLl9pdGVtID0gc2NyZWVuLl9jcmVhdGVwb2x5KCkKKyAgICAgICAgZWxpZiBzZWxmLl90eXBlID09ICJpbWFnZSI6CisgICAgICAgICAgICBzZWxmLl9pdGVtID0gc2NyZWVuLl9jcmVhdGVpbWFnZShzY3JlZW4uX3NoYXBlc1siYmxhbmsiXS5fZGF0YSkKKyAgICAgICAgZWxpZiBzZWxmLl90eXBlID09ICJjb21wb3VuZCI6CisgICAgICAgICAgICBzZWxmLl9pdGVtID0gW3NjcmVlbi5fY3JlYXRlcG9seSgpIGZvciBpdGVtIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4uX3NoYXBlc1tzaGFwZUluZGV4XS5fZGF0YV0KKworCitjbGFzcyBSYXdUdXJ0bGUoVFBlbiwgVE5hdmlnYXRvcik6CisgICAgIiIiQW5pbWF0aW9uIHBhcnQgb2YgdGhlIFJhd1R1cnRsZS4KKyAgICBQdXRzIFJhd1R1cnRsZSB1cG9uIGEgVHVydGxlU2NyZWVuIGFuZCBwcm92aWRlcyB0b29scyBmb3IKKyAgICBpdHMgYW5pbWF0aW9uLgorICAgICIiIgorICAgIHNjcmVlbnMgPSBbXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhbnZhcz1Ob25lLAorICAgICAgICAgICAgICAgICBzaGFwZT1fQ0ZHWyJzaGFwZSJdLAorICAgICAgICAgICAgICAgICB1bmRvYnVmZmVyc2l6ZT1fQ0ZHWyJ1bmRvYnVmZmVyc2l6ZSJdLAorICAgICAgICAgICAgICAgICB2aXNpYmxlPV9DRkdbInZpc2libGUiXSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoY2FudmFzLCBfU2NyZWVuKToKKyAgICAgICAgICAgIHNlbGYuc2NyZWVuID0gY2FudmFzCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShjYW52YXMsIFR1cnRsZVNjcmVlbik6CisgICAgICAgICAgICBpZiBjYW52YXMgbm90IGluIFJhd1R1cnRsZS5zY3JlZW5zOgorICAgICAgICAgICAgICAgIFJhd1R1cnRsZS5zY3JlZW5zLmFwcGVuZChjYW52YXMpCisgICAgICAgICAgICBzZWxmLnNjcmVlbiA9IGNhbnZhcworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoY2FudmFzLCAoU2Nyb2xsZWRDYW52YXMsIENhbnZhcykpOgorICAgICAgICAgICAgZm9yIHNjcmVlbiBpbiBSYXdUdXJ0bGUuc2NyZWVuczoKKyAgICAgICAgICAgICAgICBpZiBzY3JlZW4uY3YgPT0gY2FudmFzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNjcmVlbiA9IHNjcmVlbgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnNjcmVlbiA9IFR1cnRsZVNjcmVlbihjYW52YXMpCisgICAgICAgICAgICAgICAgUmF3VHVydGxlLnNjcmVlbnMuYXBwZW5kKHNlbGYuc2NyZWVuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHVydGxlR3JhcGhpY3NFcnJvcigiYmFkIGNhdmFzIGFyZ3VtZW50ICVzIiAlIGNhbnZhcykKKworICAgICAgICBzY3JlZW4gPSBzZWxmLnNjcmVlbgorICAgICAgICBUTmF2aWdhdG9yLl9faW5pdF9fKHNlbGYsIHNjcmVlbi5tb2RlKCkpCisgICAgICAgIFRQZW4uX19pbml0X18oc2VsZikKKyAgICAgICAgc2NyZWVuLl90dXJ0bGVzLmFwcGVuZChzZWxmKQorICAgICAgICBzZWxmLmRyYXdpbmdMaW5lSXRlbSA9IHNjcmVlbi5fY3JlYXRlbGluZSgpCisgICAgICAgIHNlbGYudHVydGxlID0gX1R1cnRsZUltYWdlKHNjcmVlbiwgc2hhcGUpCisgICAgICAgIHNlbGYuX3BvbHkgPSBOb25lCisgICAgICAgIHNlbGYuX2NyZWF0aW5nUG9seSA9IEZhbHNlCisgICAgICAgIHNlbGYuX2ZpbGxpdGVtID0gc2VsZi5fZmlsbHBhdGggPSBOb25lCisgICAgICAgIHNlbGYuX3Nob3duID0gdmlzaWJsZQorICAgICAgICBzZWxmLl9oaWRkZW5fZnJvbV9zY3JlZW4gPSBGYWxzZQorICAgICAgICBzZWxmLmN1cnJlbnRMaW5lSXRlbSA9IHNjcmVlbi5fY3JlYXRlbGluZSgpCisgICAgICAgIHNlbGYuY3VycmVudExpbmUgPSBbc2VsZi5fcG9zaXRpb25dCisgICAgICAgIHNlbGYuaXRlbXMgPSBbc2VsZi5jdXJyZW50TGluZUl0ZW1dCisgICAgICAgIHNlbGYuc3RhbXBJdGVtcyA9IFtdCisgICAgICAgIHNlbGYuX3VuZG9idWZmZXJzaXplID0gdW5kb2J1ZmZlcnNpemUKKyAgICAgICAgc2VsZi51bmRvYnVmZmVyID0gVGJ1ZmZlcih1bmRvYnVmZmVyc2l6ZSkKKyAgICAgICAgc2VsZi5fdXBkYXRlKCkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgIiIiRGVsZXRlIHRoZSB0dXJ0bGUncyBkcmF3aW5ncyBhbmQgcmVzdG9yZSBpdHMgZGVmYXVsdCB2YWx1ZXMuCisKKyAgICAgICAgTm8gYXJndW1lbnQuCissCisgICAgICAgIERlbGV0ZSB0aGUgdHVydGxlJ3MgZHJhd2luZ3MgZnJvbSB0aGUgc2NyZWVuLCByZS1jZW50ZXIgdGhlIHR1cnRsZQorICAgICAgICBhbmQgc2V0IHZhcmlhYmxlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZXMuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUucG9zaXRpb24oKQorICAgICAgICAoMC4wMCwtMjIuMDApCisgICAgICAgID4+PiB0dXJ0bGUuaGVhZGluZygpCisgICAgICAgIDEwMC4wCisgICAgICAgID4+PiB0dXJ0bGUucmVzZXQoKQorICAgICAgICA+Pj4gdHVydGxlLnBvc2l0aW9uKCkKKyAgICAgICAgKDAuMDAsMC4wMCkKKyAgICAgICAgPj4+IHR1cnRsZS5oZWFkaW5nKCkKKyAgICAgICAgMC4wCisgICAgICAgICIiIgorICAgICAgICBUTmF2aWdhdG9yLnJlc2V0KHNlbGYpCisgICAgICAgIFRQZW4uX3Jlc2V0KHNlbGYpCisgICAgICAgIHNlbGYuX2NsZWFyKCkKKyAgICAgICAgc2VsZi5fZHJhd3R1cnRsZSgpCisgICAgICAgIHNlbGYuX3VwZGF0ZSgpCisKKyAgICBkZWYgc2V0dW5kb2J1ZmZlcihzZWxmLCBzaXplKToKKyAgICAgICAgIiIiU2V0IG9yIGRpc2FibGUgdW5kb2J1ZmZlci4KKworICAgICAgICBBcmd1bWVudDoKKyAgICAgICAgc2l6ZSAtLSBhbiBpbnRlZ2VyIG9yIE5vbmUKKworICAgICAgICBJZiBzaXplIGlzIGFuIGludGVnZXIgYW4gZW1wdHkgdW5kb2J1ZmZlciBvZiBnaXZlbiBzaXplIGlzIGluc3RhbGxlZC4KKyAgICAgICAgU2l6ZSBnaXZlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdHVydGxlLWFjdGlvbnMgdGhhdCBjYW4gYmUgdW5kb25lCisgICAgICAgIGJ5IHRoZSB1bmRvKCkgZnVuY3Rpb24uCisgICAgICAgIElmIHNpemUgaXMgTm9uZSwgbm8gdW5kb2J1ZmZlciBpcyBwcmVzZW50LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnNldHVuZG9idWZmZXIoNDIpCisgICAgICAgICIiIgorICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIgPSBUYnVmZmVyKHNpemUpCisKKyAgICBkZWYgdW5kb2J1ZmZlcmVudHJpZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBjb3VudCBvZiBlbnRyaWVzIGluIHRoZSB1bmRvYnVmZmVyLgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gd2hpbGUgdW5kb2J1ZmZlcmVudHJpZXMoKToKKyAgICAgICAgLi4uICAgICB1bmRvKCkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYudW5kb2J1ZmZlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgcmV0dXJuIHNlbGYudW5kb2J1ZmZlci5ucl9vZl9pdGVtcygpCisKKyAgICBkZWYgX2NsZWFyKHNlbGYpOgorICAgICAgICAiIiJEZWxldGUgYWxsIG9mIHBlbidzIGRyYXdpbmdzIiIiCisgICAgICAgIHNlbGYuX2ZpbGxpdGVtID0gc2VsZi5fZmlsbHBhdGggPSBOb25lCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYuaXRlbXM6CisgICAgICAgICAgICBzZWxmLnNjcmVlbi5fZGVsZXRlKGl0ZW0pCisgICAgICAgIHNlbGYuY3VycmVudExpbmVJdGVtID0gc2VsZi5zY3JlZW4uX2NyZWF0ZWxpbmUoKQorICAgICAgICBzZWxmLmN1cnJlbnRMaW5lID0gW10KKyAgICAgICAgaWYgc2VsZi5fZHJhd2luZzoKKyAgICAgICAgICAgIHNlbGYuY3VycmVudExpbmUuYXBwZW5kKHNlbGYuX3Bvc2l0aW9uKQorICAgICAgICBzZWxmLml0ZW1zID0gW3NlbGYuY3VycmVudExpbmVJdGVtXQorICAgICAgICBzZWxmLmNsZWFyc3RhbXBzKCkKKyAgICAgICAgc2VsZi5zZXR1bmRvYnVmZmVyKHNlbGYuX3VuZG9idWZmZXJzaXplKQorCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgICIiIkRlbGV0ZSB0aGUgdHVydGxlJ3MgZHJhd2luZ3MgZnJvbSB0aGUgc2NyZWVuLiBEbyBub3QgbW92ZSB0dXJ0bGUuCisKKyAgICAgICAgTm8gYXJndW1lbnRzLgorCisgICAgICAgIERlbGV0ZSB0aGUgdHVydGxlJ3MgZHJhd2luZ3MgZnJvbSB0aGUgc2NyZWVuLiBEbyBub3QgbW92ZSB0dXJ0bGUuCisgICAgICAgIFN0YXRlIGFuZCBwb3NpdGlvbiBvZiB0aGUgdHVydGxlIGFzIHdlbGwgYXMgZHJhd2luZ3Mgb2Ygb3RoZXIKKyAgICAgICAgdHVydGxlcyBhcmUgbm90IGFmZmVjdGVkLgorCisgICAgICAgIEV4YW1wbGVzIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5jbGVhcigpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jbGVhcigpCisgICAgICAgIHNlbGYuX3VwZGF0ZSgpCisKKyAgICBkZWYgX3VwZGF0ZV9kYXRhKHNlbGYpOgorICAgICAgICBzZWxmLnNjcmVlbi5faW5jcmVtZW50dWRjKCkKKyAgICAgICAgaWYgc2VsZi5zY3JlZW4uX3VwZGF0ZWNvdW50ZXIgIT0gMDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBsZW4oc2VsZi5jdXJyZW50TGluZSk+MToKKyAgICAgICAgICAgIHNlbGYuc2NyZWVuLl9kcmF3bGluZShzZWxmLmN1cnJlbnRMaW5lSXRlbSwgc2VsZi5jdXJyZW50TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wZW5jb2xvciwgc2VsZi5fcGVuc2l6ZSkKKworICAgIGRlZiBfdXBkYXRlKHNlbGYpOgorICAgICAgICAiIiJQZXJmb3JtIGEgVHVydGxlLWRhdGEgdXBkYXRlLgorICAgICAgICAiIiIKKyAgICAgICAgc2NyZWVuID0gc2VsZi5zY3JlZW4KKyAgICAgICAgaWYgc2NyZWVuLl90cmFjaW5nID09IDA6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiBzY3JlZW4uX3RyYWNpbmcgPT0gMToKKyAgICAgICAgICAgIHNlbGYuX3VwZGF0ZV9kYXRhKCkKKyAgICAgICAgICAgIHNlbGYuX2RyYXd0dXJ0bGUoKQorICAgICAgICAgICAgc2NyZWVuLl91cGRhdGUoKSAgICAgICAgICAgICAgICAgICMgVHVydGxlU2NyZWVuQmFzZQorICAgICAgICAgICAgc2NyZWVuLl9kZWxheShzY3JlZW4uX2RlbGF5dmFsdWUpICMgVHVydGxlU2NyZWVuQmFzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fdXBkYXRlX2RhdGEoKQorICAgICAgICAgICAgaWYgc2NyZWVuLl91cGRhdGVjb3VudGVyID09IDA6CisgICAgICAgICAgICAgICAgZm9yIHQgaW4gc2NyZWVuLnR1cnRsZXMoKToKKyAgICAgICAgICAgICAgICAgICAgdC5fZHJhd3R1cnRsZSgpCisgICAgICAgICAgICAgICAgc2NyZWVuLl91cGRhdGUoKQorCisgICAgZGVmIHRyYWNlcihzZWxmLCBmbGFnPU5vbmUsIGRlbGF5PU5vbmUpOgorICAgICAgICAiIiJUdXJucyB0dXJ0bGUgYW5pbWF0aW9uIG9uL29mZiBhbmQgc2V0IGRlbGF5IGZvciB1cGRhdGUgZHJhd2luZ3MuCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICBuIC0tIG5vbm5lZ2F0aXZlICBpbnRlZ2VyCisgICAgICAgIGRlbGF5IC0tIG5vbm5lZ2F0aXZlICBpbnRlZ2VyCisKKyAgICAgICAgSWYgbiBpcyBnaXZlbiwgb25seSBlYWNoIG4tdGggcmVndWxhciBzY3JlZW4gdXBkYXRlIGlzIHJlYWxseSBwZXJmb3JtZWQuCisgICAgICAgIChDYW4gYmUgdXNlZCB0byBhY2NlbGVyYXRlIHRoZSBkcmF3aW5nIG9mIGNvbXBsZXggZ3JhcGhpY3MuKQorICAgICAgICBTZWNvbmQgYXJndW1lbnRzIHNldHMgZGVsYXkgdmFsdWUgKHNlZSBSYXdUdXJ0bGUuZGVsYXkoKSkKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS50cmFjZXIoOCwgMjUpCisgICAgICAgID4+PiBkaXN0ID0gMgorICAgICAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoMjAwKToKKyAgICAgICAgLi4uICAgICB0dXJ0bGUuZmQoZGlzdCkKKyAgICAgICAgLi4uICAgICB0dXJ0bGUucnQoOTApCisgICAgICAgIC4uLiAgICAgZGlzdCArPSAyCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zY3JlZW4udHJhY2VyKGZsYWcsIGRlbGF5KQorCisgICAgZGVmIF9jb2xvcihzZWxmLCBhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2NyZWVuLl9jb2xvcihhcmdzKQorCisgICAgZGVmIF9jb2xvcnN0cihzZWxmLCBhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2NyZWVuLl9jb2xvcnN0cihhcmdzKQorCisgICAgZGVmIF9jYyhzZWxmLCBhcmdzKToKKyAgICAgICAgIiIiQ29udmVydCBjb2xvcnRyaXBsZXMgdG8gaGV4c3RyaW5ncy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJncywgc3RyKToKKyAgICAgICAgICAgIHJldHVybiBhcmdzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHIsIGcsIGIgPSBhcmdzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJhaXNlIFR1cnRsZUdyYXBoaWNzRXJyb3IoImJhZCBjb2xvciBhcmd1bWVudHM6ICVzIiAlIHN0cihhcmdzKSkKKyAgICAgICAgaWYgc2VsZi5zY3JlZW4uX2NvbG9ybW9kZSA9PSAxLjA6CisgICAgICAgICAgICByLCBnLCBiID0gW3JvdW5kKDI1NS4wKngpIGZvciB4IGluIChyLCBnLCBiKV0KKyAgICAgICAgaWYgbm90ICgoMCA8PSByIDw9IDI1NSkgYW5kICgwIDw9IGcgPD0gMjU1KSBhbmQgKDAgPD0gYiA8PSAyNTUpKToKKyAgICAgICAgICAgIHJhaXNlIFR1cnRsZUdyYXBoaWNzRXJyb3IoImJhZCBjb2xvciBzZXF1ZW5jZTogJXMiICUgc3RyKGFyZ3MpKQorICAgICAgICByZXR1cm4gIiMlMDJ4JTAyeCUwMngiICUgKHIsIGcsIGIpCisKKyAgICBkZWYgY2xvbmUoc2VsZik6CisgICAgICAgICIiIkNyZWF0ZSBhbmQgcmV0dXJuIGEgY2xvbmUgb2YgdGhlIHR1cnRsZS4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBDcmVhdGUgYW5kIHJldHVybiBhIGNsb25lIG9mIHRoZSB0dXJ0bGUgd2l0aCBzYW1lIHBvc2l0aW9uLCBoZWFkaW5nCisgICAgICAgIGFuZCB0dXJ0bGUgcHJvcGVydGllcy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgbWljayk6CisgICAgICAgIG1pY2sgPSBUdXJ0bGUoKQorICAgICAgICBqb2UgPSBtaWNrLmNsb25lKCkKKyAgICAgICAgIiIiCisgICAgICAgIHNjcmVlbiA9IHNlbGYuc2NyZWVuCisgICAgICAgIHNlbGYuX25ld0xpbmUoc2VsZi5fZHJhd2luZykKKworICAgICAgICB0dXJ0bGUgPSBzZWxmLnR1cnRsZQorICAgICAgICBzZWxmLnNjcmVlbiA9IE5vbmUKKyAgICAgICAgc2VsZi50dXJ0bGUgPSBOb25lICAjIHRvbyBtYWtlIHNlbGYgZGVlcGNvcHktYWJsZQorCisgICAgICAgIHEgPSBkZWVwY29weShzZWxmKQorCisgICAgICAgIHNlbGYuc2NyZWVuID0gc2NyZWVuCisgICAgICAgIHNlbGYudHVydGxlID0gdHVydGxlCisKKyAgICAgICAgcS5zY3JlZW4gPSBzY3JlZW4KKyAgICAgICAgcS50dXJ0bGUgPSBfVHVydGxlSW1hZ2Uoc2NyZWVuLCBzZWxmLnR1cnRsZS5zaGFwZUluZGV4KQorCisgICAgICAgIHNjcmVlbi5fdHVydGxlcy5hcHBlbmQocSkKKyAgICAgICAgdHR5cGUgPSBzY3JlZW4uX3NoYXBlc1tzZWxmLnR1cnRsZS5zaGFwZUluZGV4XS5fdHlwZQorICAgICAgICBpZiB0dHlwZSA9PSAicG9seWdvbiI6CisgICAgICAgICAgICBxLnR1cnRsZS5faXRlbSA9IHNjcmVlbi5fY3JlYXRlcG9seSgpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gImltYWdlIjoKKyAgICAgICAgICAgIHEudHVydGxlLl9pdGVtID0gc2NyZWVuLl9jcmVhdGVpbWFnZShzY3JlZW4uX3NoYXBlc1siYmxhbmsiXS5fZGF0YSkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSAiY29tcG91bmQiOgorICAgICAgICAgICAgcS50dXJ0bGUuX2l0ZW0gPSBbc2NyZWVuLl9jcmVhdGVwb2x5KCkgZm9yIGl0ZW0gaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5fc2hhcGVzW3NlbGYudHVydGxlLnNoYXBlSW5kZXhdLl9kYXRhXQorICAgICAgICBxLmN1cnJlbnRMaW5lSXRlbSA9IHNjcmVlbi5fY3JlYXRlbGluZSgpCisgICAgICAgIHEuX3VwZGF0ZSgpCisgICAgICAgIHJldHVybiBxCisKKyAgICBkZWYgc2hhcGUoc2VsZiwgbmFtZT1Ob25lKToKKyAgICAgICAgIiIiU2V0IHR1cnRsZSBzaGFwZSB0byBzaGFwZSB3aXRoIGdpdmVuIG5hbWUgLyByZXR1cm4gY3VycmVudCBzaGFwZW5hbWUuCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQ6CisgICAgICAgIG5hbWUgLS0gYSBzdHJpbmcsIHdoaWNoIGlzIGEgdmFsaWQgc2hhcGVuYW1lCisKKyAgICAgICAgU2V0IHR1cnRsZSBzaGFwZSB0byBzaGFwZSB3aXRoIGdpdmVuIG5hbWUgb3IsIGlmIG5hbWUgaXMgbm90IGdpdmVuLAorICAgICAgICByZXR1cm4gbmFtZSBvZiBjdXJyZW50IHNoYXBlLgorICAgICAgICBTaGFwZSB3aXRoIG5hbWUgbXVzdCBleGlzdCBpbiB0aGUgVHVydGxlU2NyZWVuJ3Mgc2hhcGUgZGljdGlvbmFyeS4KKyAgICAgICAgSW5pdGlhbGx5IHRoZXJlIGFyZSB0aGUgZm9sbG93aW5nIHBvbHlnb24gc2hhcGVzOgorICAgICAgICAnYXJyb3cnLCAndHVydGxlJywgJ2NpcmNsZScsICdzcXVhcmUnLCAndHJpYW5nbGUnLCAnY2xhc3NpYycuCisgICAgICAgIFRvIGxlYXJuIGFib3V0IGhvdyB0byBkZWFsIHdpdGggc2hhcGVzIHNlZSBTY3JlZW4tbWV0aG9kIHJlZ2lzdGVyX3NoYXBlLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnNoYXBlKCkKKyAgICAgICAgJ2Fycm93JworICAgICAgICA+Pj4gdHVydGxlLnNoYXBlKCJ0dXJ0bGUiKQorICAgICAgICA+Pj4gdHVydGxlLnNoYXBlKCkKKyAgICAgICAgJ3R1cnRsZScKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnR1cnRsZS5zaGFwZUluZGV4CisgICAgICAgIGlmIG5vdCBuYW1lIGluIHNlbGYuc2NyZWVuLmdldHNoYXBlcygpOgorICAgICAgICAgICAgcmFpc2UgVHVydGxlR3JhcGhpY3NFcnJvcigiVGhlcmUgaXMgbm8gc2hhcGUgbmFtZWQgJXMiICUgbmFtZSkKKyAgICAgICAgc2VsZi50dXJ0bGUuX3NldHNoYXBlKG5hbWUpCisgICAgICAgIHNlbGYuX3VwZGF0ZSgpCisKKyAgICBkZWYgc2hhcGVzaXplKHNlbGYsIHN0cmV0Y2hfd2lkPU5vbmUsIHN0cmV0Y2hfbGVuPU5vbmUsIG91dGxpbmU9Tm9uZSk6CisgICAgICAgICIiIlNldC9yZXR1cm4gdHVydGxlJ3Mgc3RyZXRjaGZhY3RvcnMvb3V0bGluZS4gU2V0IHJlc2l6ZW1vZGUgdG8gInVzZXIiLgorCisgICAgICAgIE9wdGlub25hbCBhcmd1bWVudHM6CisgICAgICAgICAgIHN0cmV0Y2hfd2lkIDogcG9zaXRpdmUgbnVtYmVyCisgICAgICAgICAgIHN0cmV0Y2hfbGVuIDogcG9zaXRpdmUgbnVtYmVyCisgICAgICAgICAgIG91dGxpbmUgIDogcG9zaXRpdmUgbnVtYmVyCisKKyAgICAgICAgUmV0dXJuIG9yIHNldCB0aGUgcGVuJ3MgYXR0cmlidXRlcyB4L3ktc3RyZXRjaGZhY3RvcnMgYW5kL29yIG91dGxpbmUuCisgICAgICAgIFNldCByZXNpemVtb2RlIHRvICJ1c2VyIi4KKyAgICAgICAgSWYgYW5kIG9ubHkgaWYgcmVzaXplbW9kZSBpcyBzZXQgdG8gInVzZXIiLCB0aGUgdHVydGxlIHdpbGwgYmUgZGlzcGxheWVkCisgICAgICAgIHN0cmV0Y2hlZCBhY2NvcmRpbmcgdG8gaXRzIHN0cmV0Y2hmYWN0b3JzOgorICAgICAgICBzdHJldGNoX3dpZCBpcyBzdHJldGNoZmFjdG9yIHBlcnBlbmRpY3VsYXIgdG8gb3JpZW50YXRpb24KKyAgICAgICAgc3RyZXRjaF9sZW4gaXMgc3RyZXRjaGZhY3RvciBpbiBkaXJlY3Rpb24gb2YgdHVydGxlcyBvcmllbnRhdGlvbi4KKyAgICAgICAgb3V0bGluZSBkZXRlcm1pbmVzIHRoZSB3aWR0aCBvZiB0aGUgc2hhcGVzJ3Mgb3V0bGluZS4KKworICAgICAgICBFeGFtcGxlcyAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUucmVzaXplbW9kZSgidXNlciIpCisgICAgICAgID4+PiB0dXJ0bGUuc2hhcGVzaXplKDUsIDUsIDEyKQorICAgICAgICA+Pj4gdHVydGxlLnNoYXBlc2l6ZShvdXRsaW5lPTgpCisgICAgICAgICIiIgorICAgICAgICBpZiBzdHJldGNoX3dpZCBpcyBzdHJldGNoX2xlbiBpcyBvdXRsaW5lIGlzIE5vbmU6CisgICAgICAgICAgICBzdHJldGNoX3dpZCwgc3RyZXRjaF9sZW4gPSBzZWxmLl9zdHJldGNoZmFjdG9yCisgICAgICAgICAgICByZXR1cm4gc3RyZXRjaF93aWQsIHN0cmV0Y2hfbGVuLCBzZWxmLl9vdXRsaW5ld2lkdGgKKyAgICAgICAgaWYgc3RyZXRjaF93aWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzdHJldGNoX2xlbiBpcyBOb25lOgorICAgICAgICAgICAgICAgIHN0cmV0Y2hmYWN0b3IgPSBzdHJldGNoX3dpZCwgc3RyZXRjaF93aWQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RyZXRjaGZhY3RvciA9IHN0cmV0Y2hfd2lkLCBzdHJldGNoX2xlbgorICAgICAgICBlbGlmIHN0cmV0Y2hfbGVuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc3RyZXRjaGZhY3RvciA9IHNlbGYuX3N0cmV0Y2hmYWN0b3JbMF0sIHN0cmV0Y2hfbGVuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdHJldGNoZmFjdG9yID0gc2VsZi5fc3RyZXRjaGZhY3RvcgorICAgICAgICBpZiBvdXRsaW5lIGlzIE5vbmU6CisgICAgICAgICAgICBvdXRsaW5lID0gc2VsZi5fb3V0bGluZXdpZHRoCisgICAgICAgIHNlbGYucGVuKHJlc2l6ZW1vZGU9InVzZXIiLAorICAgICAgICAgICAgICAgICBzdHJldGNoZmFjdG9yPXN0cmV0Y2hmYWN0b3IsIG91dGxpbmU9b3V0bGluZSkKKworICAgIGRlZiBzZXR0aWx0YW5nbGUoc2VsZiwgYW5nbGUpOgorICAgICAgICAiIiJSb3RhdGUgdGhlIHR1cnRsZXNoYXBlIHRvIHBvaW50IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0aW9uCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQ6CisgICAgICAgIGFuZ2xlIC0tIG51bWJlcgorCisgICAgICAgIFJvdGF0ZSB0aGUgdHVydGxlc2hhcGUgdG8gcG9pbnQgaW4gdGhlIGRpcmVjdGlvbiBzcGVjaWZpZWQgYnkgYW5nbGUsCisgICAgICAgIHJlZ2FyZGxlc3Mgb2YgaXRzIGN1cnJlbnQgdGlsdC1hbmdsZS4gRE8gTk9UIGNoYW5nZSB0aGUgdHVydGxlJ3MKKyAgICAgICAgaGVhZGluZyAoZGlyZWN0aW9uIG9mIG1vdmVtZW50KS4KKworCisgICAgICAgIEV4YW1wbGVzIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5zaGFwZSgiY2lyY2xlIikKKyAgICAgICAgPj4+IHR1cnRsZS5zaGFwZXNpemUoNSwyKQorICAgICAgICA+Pj4gdHVydGxlLnNldHRpbHRhbmdsZSg0NSkKKyAgICAgICAgPj4+IHN0YW1wKCkKKyAgICAgICAgPj4+IHR1cnRsZS5mZCg1MCkKKyAgICAgICAgPj4+IHR1cnRsZS5zZXR0aWx0YW5nbGUoLTQ1KQorICAgICAgICA+Pj4gc3RhbXAoKQorICAgICAgICA+Pj4gdHVydGxlLmZkKDUwKQorICAgICAgICAiIiIKKyAgICAgICAgdGlsdCA9IC1hbmdsZSAqIHNlbGYuX2RlZ3JlZXNQZXJBVSAqIHNlbGYuX2FuZ2xlT3JpZW50CisgICAgICAgIHRpbHQgPSAodGlsdCAqIG1hdGgucGkgLyAxODAuMCkgJSAoMiptYXRoLnBpKQorICAgICAgICBzZWxmLnBlbihyZXNpemVtb2RlPSJ1c2VyIiwgdGlsdD10aWx0KQorCisgICAgZGVmIHRpbHRhbmdsZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IHRpbHQtYW5nbGUuCisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgUmV0dXJuIHRoZSBjdXJyZW50IHRpbHQtYW5nbGUsIGkuIGUuIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZQorICAgICAgICBvcmllbnRhdGlvbiBvZiB0aGUgdHVydGxlc2hhcGUgYW5kIHRoZSBoZWFkaW5nIG9mIHRoZSB0dXJ0bGUKKyAgICAgICAgKGl0cyBkaXJlY3Rpb24gb2YgbW92ZW1lbnQpLgorCisgICAgICAgIEV4YW1wbGVzIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5zaGFwZSgiY2lyY2xlIikKKyAgICAgICAgPj4+IHR1cnRsZS5zaGFwZXNpemUoNSwyKQorICAgICAgICA+Pj4gdHVydGxlLnRpbHQoNDUpCisgICAgICAgID4+PiB0dXJ0bGUudGlsdGFuZ2xlKCkKKyAgICAgICAgIiIiCisgICAgICAgIHRpbHQgPSAtc2VsZi5fdGlsdCAqICgxODAuMC9tYXRoLnBpKSAqIHNlbGYuX2FuZ2xlT3JpZW50CisgICAgICAgIHJldHVybiAodGlsdCAvIHNlbGYuX2RlZ3JlZXNQZXJBVSkgJSBzZWxmLl9mdWxsY2lyY2xlCisKKyAgICBkZWYgdGlsdChzZWxmLCBhbmdsZSk6CisgICAgICAgICIiIlJvdGF0ZSB0aGUgdHVydGxlc2hhcGUgYnkgYW5nbGUuCisKKyAgICAgICAgQXJndW1lbnQ6CisgICAgICAgIGFuZ2xlIC0gYSBudW1iZXIKKworICAgICAgICBSb3RhdGUgdGhlIHR1cnRsZXNoYXBlIGJ5IGFuZ2xlIGZyb20gaXRzIGN1cnJlbnQgdGlsdC1hbmdsZSwKKyAgICAgICAgYnV0IGRvIE5PVCBjaGFuZ2UgdGhlIHR1cnRsZSdzIGhlYWRpbmcgKGRpcmVjdGlvbiBvZiBtb3ZlbWVudCkuCisKKyAgICAgICAgRXhhbXBsZXMgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnNoYXBlKCJjaXJjbGUiKQorICAgICAgICA+Pj4gdHVydGxlLnNoYXBlc2l6ZSg1LDIpCisgICAgICAgID4+PiB0dXJ0bGUudGlsdCgzMCkKKyAgICAgICAgPj4+IHR1cnRsZS5mZCg1MCkKKyAgICAgICAgPj4+IHR1cnRsZS50aWx0KDMwKQorICAgICAgICA+Pj4gdHVydGxlLmZkKDUwKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zZXR0aWx0YW5nbGUoYW5nbGUgKyBzZWxmLnRpbHRhbmdsZSgpKQorCisgICAgZGVmIF9wb2x5dHJhZm8oc2VsZiwgcG9seSk6CisgICAgICAgICIiIkNvbXB1dGVzIHRyYW5zZm9ybWVkIHBvbHlnb24gc2hhcGVzIGZyb20gYSBzaGFwZQorICAgICAgICBhY2NvcmRpbmcgdG8gY3VycmVudCBwb3NpdGlvbiBhbmQgaGVhZGluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHNjcmVlbiA9IHNlbGYuc2NyZWVuCisgICAgICAgIHAwLCBwMSA9IHNlbGYuX3Bvc2l0aW9uCisgICAgICAgIGUwLCBlMSA9IHNlbGYuX29yaWVudAorICAgICAgICBlID0gVmVjMkQoZTAsIGUxICogc2NyZWVuLnlzY2FsZSAvIHNjcmVlbi54c2NhbGUpCisgICAgICAgIGUwLCBlMSA9ICgxLjAgLyBhYnMoZSkpICogZQorICAgICAgICByZXR1cm4gWyhwMCsoZTEqeCtlMCp5KS9zY3JlZW4ueHNjYWxlLCBwMSsoLWUwKngrZTEqeSkvc2NyZWVuLnlzY2FsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh4LCB5KSBpbiBwb2x5XQorCisgICAgZGVmIF9kcmF3dHVydGxlKHNlbGYpOgorICAgICAgICAiIiJNYW5hZ2VzIHRoZSBjb3JyZWN0IHJlbmRlcmluZyBvZiB0aGUgdHVydGxlIHdpdGggcmVzcGVjdCB0bworICAgICAgICBpdHMgc2hhcGUsIHJlc2l6ZW1vZGUsIHN0cmV0Y2ggYW5kIHRpbHQgZXRjLiIiIgorICAgICAgICBzY3JlZW4gPSBzZWxmLnNjcmVlbgorICAgICAgICBzaGFwZSA9IHNjcmVlbi5fc2hhcGVzW3NlbGYudHVydGxlLnNoYXBlSW5kZXhdCisgICAgICAgIHR0eXBlID0gc2hhcGUuX3R5cGUKKyAgICAgICAgdGl0ZW0gPSBzZWxmLnR1cnRsZS5faXRlbQorICAgICAgICBpZiBzZWxmLl9zaG93biBhbmQgc2NyZWVuLl91cGRhdGVjb3VudGVyID09IDAgYW5kIHNjcmVlbi5fdHJhY2luZyA+IDA6CisgICAgICAgICAgICBzZWxmLl9oaWRkZW5fZnJvbV9zY3JlZW4gPSBGYWxzZQorICAgICAgICAgICAgdHNoYXBlID0gc2hhcGUuX2RhdGEKKyAgICAgICAgICAgIGlmIHR0eXBlID09ICJwb2x5Z29uIjoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9yZXNpemVtb2RlID09ICJub3Jlc2l6ZSI6CisgICAgICAgICAgICAgICAgICAgIHcgPSAxCisgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gdHNoYXBlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fcmVzaXplbW9kZSA9PSAiYXV0byI6CisgICAgICAgICAgICAgICAgICAgICAgICBseCA9IGx5ID0gbWF4KDEsIHNlbGYuX3BlbnNpemUvNS4wKQorICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHNlbGYuX3BlbnNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbHRhbmdsZSA9IDAKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLl9yZXNpemVtb2RlID09ICJ1c2VyIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGx4LCBseSA9IHNlbGYuX3N0cmV0Y2hmYWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBzZWxmLl9vdXRsaW5ld2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbHRhbmdsZSA9IHNlbGYuX3RpbHQKKyAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBbKGx4KngsIGx5KnkpIGZvciAoeCwgeSkgaW4gdHNoYXBlXQorICAgICAgICAgICAgICAgICAgICB0MCwgdDEgPSBtYXRoLnNpbih0aWx0YW5nbGUpLCBtYXRoLmNvcyh0aWx0YW5nbGUpCisgICAgICAgICAgICAgICAgICAgIHNoYXBlID0gWyh0MSp4K3QwKnksIC10MCp4K3QxKnkpIGZvciAoeCwgeSkgaW4gc2hhcGVdCisgICAgICAgICAgICAgICAgc2hhcGUgPSBzZWxmLl9wb2x5dHJhZm8oc2hhcGUpCisgICAgICAgICAgICAgICAgZmMsIG9jID0gc2VsZi5fZmlsbGNvbG9yLCBzZWxmLl9wZW5jb2xvcgorICAgICAgICAgICAgICAgIHNjcmVlbi5fZHJhd3BvbHkodGl0ZW0sIHNoYXBlLCBmaWxsPWZjLCBvdXRsaW5lPW9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9dywgdG9wPVRydWUpCisgICAgICAgICAgICBlbGlmIHR0eXBlID09ICJpbWFnZSI6CisgICAgICAgICAgICAgICAgc2NyZWVuLl9kcmF3aW1hZ2UodGl0ZW0sIHNlbGYuX3Bvc2l0aW9uLCB0c2hhcGUpCisgICAgICAgICAgICBlbGlmIHR0eXBlID09ICJjb21wb3VuZCI6CisgICAgICAgICAgICAgICAgbHgsIGx5ID0gc2VsZi5fc3RyZXRjaGZhY3RvcgorICAgICAgICAgICAgICAgIHcgPSBzZWxmLl9vdXRsaW5ld2lkdGgKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSwgKHBvbHksIGZjLCBvYykgaW4gemlwKHRpdGVtLCB0c2hhcGUpOgorICAgICAgICAgICAgICAgICAgICBwb2x5ID0gWyhseCp4LCBseSp5KSBmb3IgKHgsIHkpIGluIHBvbHldCisgICAgICAgICAgICAgICAgICAgIHBvbHkgPSBzZWxmLl9wb2x5dHJhZm8ocG9seSkKKyAgICAgICAgICAgICAgICAgICAgc2NyZWVuLl9kcmF3cG9seShpdGVtLCBwb2x5LCBmaWxsPXNlbGYuX2NjKGZjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lPXNlbGYuX2NjKG9jKSwgd2lkdGg9dywgdG9wPVRydWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLl9oaWRkZW5fZnJvbV9zY3JlZW46CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiB0dHlwZSA9PSAicG9seWdvbiI6CisgICAgICAgICAgICAgICAgc2NyZWVuLl9kcmF3cG9seSh0aXRlbSwgKCgwLCAwKSwgKDAsIDApLCAoMCwgMCkpLCAiIiwgIiIpCisgICAgICAgICAgICBlbGlmIHR0eXBlID09ICJpbWFnZSI6CisgICAgICAgICAgICAgICAgc2NyZWVuLl9kcmF3aW1hZ2UodGl0ZW0sIHNlbGYuX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuLl9zaGFwZXNbImJsYW5rIl0uX2RhdGEpCisgICAgICAgICAgICBlbGlmIHR0eXBlID09ICJjb21wb3VuZCI6CisgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gdGl0ZW06CisgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5fZHJhd3BvbHkoaXRlbSwgKCgwLCAwKSwgKDAsIDApLCAoMCwgMCkpLCAiIiwgIiIpCisgICAgICAgICAgICBzZWxmLl9oaWRkZW5fZnJvbV9zY3JlZW4gPSBUcnVlCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgc3RhbXAgc3R1ZmYgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgIGRlZiBzdGFtcChzZWxmKToKKyAgICAgICAgIiIiU3RhbXAgYSBjb3B5IG9mIHRoZSB0dXJ0bGVzaGFwZSBvbnRvIHRoZSBjYW52YXMgYW5kIHJldHVybiBpdHMgaWQuCisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgU3RhbXAgYSBjb3B5IG9mIHRoZSB0dXJ0bGUgc2hhcGUgb250byB0aGUgY2FudmFzIGF0IHRoZSBjdXJyZW50CisgICAgICAgIHR1cnRsZSBwb3NpdGlvbi4gUmV0dXJuIGEgc3RhbXBfaWQgZm9yIHRoYXQgc3RhbXAsIHdoaWNoIGNhbiBiZQorICAgICAgICB1c2VkIHRvIGRlbGV0ZSBpdCBieSBjYWxsaW5nIGNsZWFyc3RhbXAoc3RhbXBfaWQpLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmNvbG9yKCJibHVlIikKKyAgICAgICAgPj4+IHR1cnRsZS5zdGFtcCgpCisgICAgICAgIDEzCisgICAgICAgID4+PiB0dXJ0bGUuZmQoNTApCisgICAgICAgICIiIgorICAgICAgICBzY3JlZW4gPSBzZWxmLnNjcmVlbgorICAgICAgICBzaGFwZSA9IHNjcmVlbi5fc2hhcGVzW3NlbGYudHVydGxlLnNoYXBlSW5kZXhdCisgICAgICAgIHR0eXBlID0gc2hhcGUuX3R5cGUKKyAgICAgICAgdHNoYXBlID0gc2hhcGUuX2RhdGEKKyAgICAgICAgaWYgdHR5cGUgPT0gInBvbHlnb24iOgorICAgICAgICAgICAgc3RpdGVtID0gc2NyZWVuLl9jcmVhdGVwb2x5KCkKKyAgICAgICAgICAgIGlmIHNlbGYuX3Jlc2l6ZW1vZGUgPT0gIm5vcmVzaXplIjoKKyAgICAgICAgICAgICAgICB3ID0gMQorICAgICAgICAgICAgICAgIHNoYXBlID0gdHNoYXBlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3Jlc2l6ZW1vZGUgPT0gImF1dG8iOgorICAgICAgICAgICAgICAgICAgICBseCA9IGx5ID0gbWF4KDEsIHNlbGYuX3BlbnNpemUvNS4wKQorICAgICAgICAgICAgICAgICAgICB3ID0gc2VsZi5fcGVuc2l6ZQorICAgICAgICAgICAgICAgICAgICB0aWx0YW5nbGUgPSAwCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLl9yZXNpemVtb2RlID09ICJ1c2VyIjoKKyAgICAgICAgICAgICAgICAgICAgbHgsIGx5ID0gc2VsZi5fc3RyZXRjaGZhY3RvcgorICAgICAgICAgICAgICAgICAgICB3ID0gc2VsZi5fb3V0bGluZXdpZHRoCisgICAgICAgICAgICAgICAgICAgIHRpbHRhbmdsZSA9IHNlbGYuX3RpbHQKKyAgICAgICAgICAgICAgICBzaGFwZSA9IFsobHgqeCwgbHkqeSkgZm9yICh4LCB5KSBpbiB0c2hhcGVdCisgICAgICAgICAgICAgICAgdDAsIHQxID0gbWF0aC5zaW4odGlsdGFuZ2xlKSwgbWF0aC5jb3ModGlsdGFuZ2xlKQorICAgICAgICAgICAgICAgIHNoYXBlID0gWyh0MSp4K3QwKnksIC10MCp4K3QxKnkpIGZvciAoeCwgeSkgaW4gc2hhcGVdCisgICAgICAgICAgICBzaGFwZSA9IHNlbGYuX3BvbHl0cmFmbyhzaGFwZSkKKyAgICAgICAgICAgIGZjLCBvYyA9IHNlbGYuX2ZpbGxjb2xvciwgc2VsZi5fcGVuY29sb3IKKyAgICAgICAgICAgIHNjcmVlbi5fZHJhd3BvbHkoc3RpdGVtLCBzaGFwZSwgZmlsbD1mYywgb3V0bGluZT1vYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9dywgdG9wPVRydWUpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gImltYWdlIjoKKyAgICAgICAgICAgIHN0aXRlbSA9IHNjcmVlbi5fY3JlYXRlaW1hZ2UoIiIpCisgICAgICAgICAgICBzY3JlZW4uX2RyYXdpbWFnZShzdGl0ZW0sIHNlbGYuX3Bvc2l0aW9uLCB0c2hhcGUpCisgICAgICAgIGVsaWYgdHR5cGUgPT0gImNvbXBvdW5kIjoKKyAgICAgICAgICAgIHN0aXRlbSA9IFtdCisgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiB0c2hhcGU6CisgICAgICAgICAgICAgICAgaXRlbSA9IHNjcmVlbi5fY3JlYXRlcG9seSgpCisgICAgICAgICAgICAgICAgc3RpdGVtLmFwcGVuZChpdGVtKQorICAgICAgICAgICAgc3RpdGVtID0gdHVwbGUoc3RpdGVtKQorICAgICAgICAgICAgbHgsIGx5ID0gc2VsZi5fc3RyZXRjaGZhY3RvcgorICAgICAgICAgICAgdyA9IHNlbGYuX291dGxpbmV3aWR0aAorICAgICAgICAgICAgZm9yIGl0ZW0sIChwb2x5LCBmYywgb2MpIGluIHppcChzdGl0ZW0sIHRzaGFwZSk6CisgICAgICAgICAgICAgICAgcG9seSA9IFsobHgqeCwgbHkqeSkgZm9yICh4LCB5KSBpbiBwb2x5XQorICAgICAgICAgICAgICAgIHBvbHkgPSBzZWxmLl9wb2x5dHJhZm8ocG9seSkKKyAgICAgICAgICAgICAgICBzY3JlZW4uX2RyYXdwb2x5KGl0ZW0sIHBvbHksIGZpbGw9c2VsZi5fY2MoZmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZT1zZWxmLl9jYyhvYyksIHdpZHRoPXcsIHRvcD1UcnVlKQorICAgICAgICBzZWxmLnN0YW1wSXRlbXMuYXBwZW5kKHN0aXRlbSkKKyAgICAgICAgc2VsZi51bmRvYnVmZmVyLnB1c2goKCJzdGFtcCIsIHN0aXRlbSkpCisgICAgICAgIHJldHVybiBzdGl0ZW0KKworICAgIGRlZiBfY2xlYXJzdGFtcChzZWxmLCBzdGFtcGlkKToKKyAgICAgICAgIiIiZG9lcyB0aGUgd29yayBmb3IgY2xlYXJzdGFtcCgpIGFuZCBjbGVhcnN0YW1wcygpCisgICAgICAgICIiIgorICAgICAgICBpZiBzdGFtcGlkIGluIHNlbGYuc3RhbXBJdGVtczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RhbXBpZCwgdHVwbGUpOgorICAgICAgICAgICAgICAgIGZvciBzdWJpdGVtIGluIHN0YW1waWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2NyZWVuLl9kZWxldGUoc3ViaXRlbSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zY3JlZW4uX2RlbGV0ZShzdGFtcGlkKQorICAgICAgICAgICAgc2VsZi5zdGFtcEl0ZW1zLnJlbW92ZShzdGFtcGlkKQorICAgICAgICAjIERlbGV0ZSBzdGFtcGl0ZW0gZnJvbSB1bmRvYnVmZmVyIGlmIG5lY2Vzc2FyeQorICAgICAgICAjIGlmIGNsZWFyc3RhbXAgaXMgY2FsbGVkIGRpcmVjdGx5LgorICAgICAgICBpdGVtID0gKCJzdGFtcCIsIHN0YW1waWQpCisgICAgICAgIGJ1ZiA9IHNlbGYudW5kb2J1ZmZlcgorICAgICAgICBpZiBpdGVtIG5vdCBpbiBidWYuYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGluZGV4ID0gYnVmLmJ1ZmZlci5pbmRleChpdGVtKQorICAgICAgICBidWYuYnVmZmVyLnJlbW92ZShpdGVtKQorICAgICAgICBpZiBpbmRleCA8PSBidWYucHRyOgorICAgICAgICAgICAgYnVmLnB0ciA9IChidWYucHRyIC0gMSkgJSBidWYuYnVmc2l6ZQorICAgICAgICBidWYuYnVmZmVyLmluc2VydCgoYnVmLnB0cisxKSVidWYuYnVmc2l6ZSwgW05vbmVdKQorCisgICAgZGVmIGNsZWFyc3RhbXAoc2VsZiwgc3RhbXBpZCk6CisgICAgICAgICIiIkRlbGV0ZSBzdGFtcCB3aXRoIGdpdmVuIHN0YW1waWQKKworICAgICAgICBBcmd1bWVudDoKKyAgICAgICAgc3RhbXBpZCAtIGFuIGludGVnZXIsIG11c3QgYmUgcmV0dXJuIHZhbHVlIG9mIHByZXZpb3VzIHN0YW1wKCkgY2FsbC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5jb2xvcigiYmx1ZSIpCisgICAgICAgID4+PiBhc3RhbXAgPSB0dXJ0bGUuc3RhbXAoKQorICAgICAgICA+Pj4gdHVydGxlLmZkKDUwKQorICAgICAgICA+Pj4gdHVydGxlLmNsZWFyc3RhbXAoYXN0YW1wKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2xlYXJzdGFtcChzdGFtcGlkKQorICAgICAgICBzZWxmLl91cGRhdGUoKQorCisgICAgZGVmIGNsZWFyc3RhbXBzKHNlbGYsIG49Tm9uZSk6CisgICAgICAgICIiIkRlbGV0ZSBhbGwgb3IgZmlyc3QvbGFzdCBuIG9mIHR1cnRsZSdzIHN0YW1wcy4KKworICAgICAgICBPcHRpb25hbCBhcmd1bWVudDoKKyAgICAgICAgbiAtLSBhbiBpbnRlZ2VyCisKKyAgICAgICAgSWYgbiBpcyBOb25lLCBkZWxldGUgYWxsIG9mIHBlbidzIHN0YW1wcywKKyAgICAgICAgZWxzZSBpZiBuID4gMCBkZWxldGUgZmlyc3QgbiBzdGFtcHMKKyAgICAgICAgZWxzZSBpZiBuIDwgMCBkZWxldGUgbGFzdCBuIHN0YW1wcy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IGZvciBpIGluIHJhbmdlKDgpOgorICAgICAgICAuLi4gICAgIHR1cnRsZS5zdGFtcCgpOyB0dXJ0bGUuZmQoMzApCisgICAgICAgIC4uLgorICAgICAgICA+Pj4gdHVydGxlLmNsZWFyc3RhbXBzKDIpCisgICAgICAgID4+PiB0dXJ0bGUuY2xlYXJzdGFtcHMoLTIpCisgICAgICAgID4+PiB0dXJ0bGUuY2xlYXJzdGFtcHMoKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbiBpcyBOb25lOgorICAgICAgICAgICAgdG9EZWxldGUgPSBzZWxmLnN0YW1wSXRlbXNbOl0KKyAgICAgICAgZWxpZiBuID49IDA6CisgICAgICAgICAgICB0b0RlbGV0ZSA9IHNlbGYuc3RhbXBJdGVtc1s6bl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRvRGVsZXRlID0gc2VsZi5zdGFtcEl0ZW1zW246XQorICAgICAgICBmb3IgaXRlbSBpbiB0b0RlbGV0ZToKKyAgICAgICAgICAgIHNlbGYuX2NsZWFyc3RhbXAoaXRlbSkKKyAgICAgICAgc2VsZi5fdXBkYXRlKCkKKworICAgIGRlZiBfZ290byhzZWxmLCBlbmQpOgorICAgICAgICAiIiJNb3ZlIHRoZSBwZW4gdG8gdGhlIHBvaW50IGVuZCwgdGhlcmVieSBkcmF3aW5nIGEgbGluZQorICAgICAgICBpZiBwZW4gaXMgZG93bi4gQWxsIG90aGVyIG1ldGhvZGVzIGZvciB0dXJ0bGUgbW92ZW1lbnQgZGVwZW5kCisgICAgICAgIG9uIHRoaXMgb25lLgorICAgICAgICAiIiIKKyAgICAgICAgIyMgVmVyc2lvbiBtaXQgdW5kby1zdHVmZgorICAgICAgICBnb19tb2RlcyA9ICggc2VsZi5fZHJhd2luZywKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BlbmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGVuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uoc2VsZi5fZmlsbHBhdGgsIGxpc3QpKQorICAgICAgICBzY3JlZW4gPSBzZWxmLnNjcmVlbgorICAgICAgICB1bmRvX2VudHJ5ID0gKCJnbyIsIHNlbGYuX3Bvc2l0aW9uLCBlbmQsIGdvX21vZGVzLAorICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmN1cnJlbnRMaW5lSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRMaW5lWzpdLAorICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5fcG9pbnRsaXN0KHNlbGYuY3VycmVudExpbmVJdGVtKSwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLml0ZW1zWzpdKQorICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgaWYgc2VsZi51bmRvYnVmZmVyOgorICAgICAgICAgICAgc2VsZi51bmRvYnVmZmVyLnB1c2godW5kb19lbnRyeSkKKyAgICAgICAgc3RhcnQgPSBzZWxmLl9wb3NpdGlvbgorICAgICAgICBpZiBzZWxmLl9zcGVlZCBhbmQgc2NyZWVuLl90cmFjaW5nID09IDE6CisgICAgICAgICAgICBkaWZmID0gKGVuZC1zdGFydCkKKyAgICAgICAgICAgIGRpZmZzcSA9IChkaWZmWzBdKnNjcmVlbi54c2NhbGUpKioyICsgKGRpZmZbMV0qc2NyZWVuLnlzY2FsZSkqKjIKKyAgICAgICAgICAgIG5ob3BzID0gMStpbnQoKGRpZmZzcSoqMC41KS8oMyooMS4xKipzZWxmLl9zcGVlZCkqc2VsZi5fc3BlZWQpKQorICAgICAgICAgICAgZGVsdGEgPSBkaWZmICogKDEuMC9uaG9wcykKKyAgICAgICAgICAgIGZvciBuIGluIHJhbmdlKDEsIG5ob3BzKToKKyAgICAgICAgICAgICAgICBpZiBuID09IDE6CisgICAgICAgICAgICAgICAgICAgIHRvcCA9IFRydWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0b3AgPSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gc3RhcnQgKyBkZWx0YSAqIG4KKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9kcmF3aW5nOgorICAgICAgICAgICAgICAgICAgICBzY3JlZW4uX2RyYXdsaW5lKHNlbGYuZHJhd2luZ0xpbmVJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGFydCwgc2VsZi5fcG9zaXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BlbmNvbG9yLCBzZWxmLl9wZW5zaXplLCB0b3ApCisgICAgICAgICAgICAgICAgc2VsZi5fdXBkYXRlKCkKKyAgICAgICAgICAgIGlmIHNlbGYuX2RyYXdpbmc6CisgICAgICAgICAgICAgICAgc2NyZWVuLl9kcmF3bGluZShzZWxmLmRyYXdpbmdMaW5lSXRlbSwgKCgwLCAwKSwgKDAsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD0iIiwgd2lkdGg9c2VsZi5fcGVuc2l6ZSkKKyAgICAgICAgIyBUdXJ0bGUgbm93IGF0IGVuZCwKKyAgICAgICAgaWYgc2VsZi5fZHJhd2luZzogIyBub3cgdXBkYXRlIGN1cnJlbnRMaW5lCisgICAgICAgICAgICBzZWxmLmN1cnJlbnRMaW5lLmFwcGVuZChlbmQpCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5fZmlsbHBhdGgsIGxpc3QpOgorICAgICAgICAgICAgc2VsZi5fZmlsbHBhdGguYXBwZW5kKGVuZCkKKyAgICAgICAgIyMjIyMjICAgIHZlcmVyYnVuZyEhISEhISEhISEhISEhISEhISEhISEKKyAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBlbmQKKyAgICAgICAgaWYgc2VsZi5fY3JlYXRpbmdQb2x5OgorICAgICAgICAgICAgc2VsZi5fcG9seS5hcHBlbmQoZW5kKQorICAgICAgICBpZiBsZW4oc2VsZi5jdXJyZW50TGluZSkgPiA0MjogIyA0MiEgYW5zd2VyIHRvIHRoZSB1bHRpbWF0ZSBxdWVzdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvZiBsaWZlLCB0aGUgdW5pdmVyc2UgYW5kIGV2ZXJ5dGhpbmcKKyAgICAgICAgICAgIHNlbGYuX25ld0xpbmUoKQorICAgICAgICBzZWxmLl91cGRhdGUoKSAjY291bnQ9VHJ1ZSkKKworICAgIGRlZiBfdW5kb2dvdG8oc2VsZiwgZW50cnkpOgorICAgICAgICAiIiJSZXZlcnNlIGEgX2dvdG8uIFVzZWQgZm9yIHVuZG8oKQorICAgICAgICAiIiIKKyAgICAgICAgb2xkLCBuZXcsIGdvX21vZGVzLCBjb29kYXRhID0gZW50cnkKKyAgICAgICAgZHJhd2luZywgcGMsIHBzLCBmaWxsaW5nID0gZ29fbW9kZXMKKyAgICAgICAgY0xJLCBjTCwgcGwsIGl0ZW1zID0gY29vZGF0YQorICAgICAgICBzY3JlZW4gPSBzZWxmLnNjcmVlbgorICAgICAgICBpZiBhYnMoc2VsZi5fcG9zaXRpb24gLSBuZXcpID4gMC41OgorICAgICAgICAgICAgcHJpbnQgInVuZG9nb3RvOiBIQUxMTy1EQS1TVElNTVQtV0FTLU5JQ0hUISIKKyAgICAgICAgIyByZXN0b3JlIGZvcm1lciBzaXR1YXRpb24KKyAgICAgICAgc2VsZi5jdXJyZW50TGluZUl0ZW0gPSBjTEkKKyAgICAgICAgc2VsZi5jdXJyZW50TGluZSA9IGNMCisKKyAgICAgICAgaWYgcGwgPT0gWygwLCAwKSwgKDAsIDApXToKKyAgICAgICAgICAgIHVzZXBjID0gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHVzZXBjID0gcGMKKyAgICAgICAgc2NyZWVuLl9kcmF3bGluZShjTEksIHBsLCBmaWxsPXVzZXBjLCB3aWR0aD1wcykKKworICAgICAgICB0b2RlbGV0ZSA9IFtpIGZvciBpIGluIHNlbGYuaXRlbXMgaWYgKGkgbm90IGluIGl0ZW1zKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzY3JlZW4uX3R5cGUoaSkgPT0gImxpbmUiKV0KKyAgICAgICAgZm9yIGkgaW4gdG9kZWxldGU6CisgICAgICAgICAgICBzY3JlZW4uX2RlbGV0ZShpKQorICAgICAgICAgICAgc2VsZi5pdGVtcy5yZW1vdmUoaSkKKworICAgICAgICBzdGFydCA9IG9sZAorICAgICAgICBpZiBzZWxmLl9zcGVlZCBhbmQgc2NyZWVuLl90cmFjaW5nID09IDE6CisgICAgICAgICAgICBkaWZmID0gb2xkIC0gbmV3CisgICAgICAgICAgICBkaWZmc3EgPSAoZGlmZlswXSpzY3JlZW4ueHNjYWxlKSoqMiArIChkaWZmWzFdKnNjcmVlbi55c2NhbGUpKioyCisgICAgICAgICAgICBuaG9wcyA9IDEraW50KChkaWZmc3EqKjAuNSkvKDMqKDEuMSoqc2VsZi5fc3BlZWQpKnNlbGYuX3NwZWVkKSkKKyAgICAgICAgICAgIGRlbHRhID0gZGlmZiAqICgxLjAvbmhvcHMpCisgICAgICAgICAgICBmb3IgbiBpbiByYW5nZSgxLCBuaG9wcyk6CisgICAgICAgICAgICAgICAgaWYgbiA9PSAxOgorICAgICAgICAgICAgICAgICAgICB0b3AgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdG9wID0gRmFsc2UKKyAgICAgICAgICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IG5ldyArIGRlbHRhICogbgorICAgICAgICAgICAgICAgIGlmIGRyYXdpbmc6CisgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5fZHJhd2xpbmUoc2VsZi5kcmF3aW5nTGluZUl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXJ0LCBzZWxmLl9wb3NpdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGMsIHBzLCB0b3ApCisgICAgICAgICAgICAgICAgc2VsZi5fdXBkYXRlKCkKKyAgICAgICAgICAgIGlmIGRyYXdpbmc6CisgICAgICAgICAgICAgICAgc2NyZWVuLl9kcmF3bGluZShzZWxmLmRyYXdpbmdMaW5lSXRlbSwgKCgwLCAwKSwgKDAsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD0iIiwgd2lkdGg9cHMpCisgICAgICAgICMgVHVydGxlIG5vdyBhdCBwb3NpdGlvbiBvbGQsCisgICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gb2xkCisgICAgICAgICMjICBpZiB1bmRvIGlzIGRvbmUgZHVyaW5nIGNyZWF0aW5nIGEgcG9seWdvbiwgdGhlIGxhc3QgdmVydGV4CisgICAgICAgICMjICB3aWxsIGJlIGRlbGV0ZWQuIGlmIHRoZSBwb2x5Z29uIGlzIGVudGlyZWx5IGRlbGV0ZWQsCisgICAgICAgICMjICBjcmVhdGluZ1BvbHkgd2lsbCBiZSBzZXQgdG8gRmFsc2UuCisgICAgICAgICMjICBQb2x5Z29ucyBjcmVhdGVkIGJlZm9yZSB0aGUgbGFzdCBvbmUgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgdW5kbygpCisgICAgICAgIGlmIHNlbGYuX2NyZWF0aW5nUG9seToKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLl9wb2x5KSA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5fcG9seS5wb3AoKQorICAgICAgICAgICAgaWYgc2VsZi5fcG9seSA9PSBbXToKKyAgICAgICAgICAgICAgICBzZWxmLl9jcmVhdGluZ1BvbHkgPSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYuX3BvbHkgPSBOb25lCisgICAgICAgIGlmIGZpbGxpbmc6CisgICAgICAgICAgICBpZiBzZWxmLl9maWxscGF0aCA9PSBbXToKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxscGF0aCA9IE5vbmUKKyAgICAgICAgICAgICAgICBwcmludCAiVW53YWhyc2NoZWlubGljaCBpbiBfdW5kb2dvdG8hIgorICAgICAgICAgICAgZWxpZiBzZWxmLl9maWxscGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxscGF0aC5wb3AoKQorICAgICAgICBzZWxmLl91cGRhdGUoKSAjY291bnQ9VHJ1ZSkKKworICAgIGRlZiBfcm90YXRlKHNlbGYsIGFuZ2xlKToKKyAgICAgICAgIiIiVHVybnMgcGVuIGNsb2Nrd2lzZSBieSBhbmdsZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYudW5kb2J1ZmZlcjoKKyAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5wdXNoKCgicm90IiwgYW5nbGUsIHNlbGYuX2RlZ3JlZXNQZXJBVSkpCisgICAgICAgIGFuZ2xlICo9IHNlbGYuX2RlZ3JlZXNQZXJBVQorICAgICAgICBuZXdvcmllbnQgPSBzZWxmLl9vcmllbnQucm90YXRlKGFuZ2xlKQorICAgICAgICB0cmFjaW5nID0gc2VsZi5zY3JlZW4uX3RyYWNpbmcKKyAgICAgICAgaWYgdHJhY2luZyA9PSAxIGFuZCBzZWxmLl9zcGVlZCA+IDA6CisgICAgICAgICAgICBhbmdsZXZlbCA9IDMuMCAqIHNlbGYuX3NwZWVkCisgICAgICAgICAgICBzdGVwcyA9IDEgKyBpbnQoYWJzKGFuZ2xlKS9hbmdsZXZlbCkKKyAgICAgICAgICAgIGRlbHRhID0gMS4wKmFuZ2xlL3N0ZXBzCisgICAgICAgICAgICBmb3IgXyBpbiByYW5nZShzdGVwcyk6CisgICAgICAgICAgICAgICAgc2VsZi5fb3JpZW50ID0gc2VsZi5fb3JpZW50LnJvdGF0ZShkZWx0YSkKKyAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGUoKQorICAgICAgICBzZWxmLl9vcmllbnQgPSBuZXdvcmllbnQKKyAgICAgICAgc2VsZi5fdXBkYXRlKCkKKworICAgIGRlZiBfbmV3TGluZShzZWxmLCB1c2VQb3M9VHJ1ZSk6CisgICAgICAgICIiIkNsb3NlcyBjdXJyZW50IGxpbmUgaXRlbSBhbmQgc3RhcnRzIGEgbmV3IG9uZS4KKyAgICAgICAgICAgUmVtYXJrOiBpZiBjdXJyZW50IGxpbmUgYmVjYW1lIHRvbyBsb25nLCBhbmltYXRpb24KKyAgICAgICAgICAgcGVyZm9ybWFuY2UgKHZpYSBfZHJhd2xpbmUpIHNsb3dlZCBkb3duIGNvbnNpZGVyYWJseS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihzZWxmLmN1cnJlbnRMaW5lKSA+IDE6CisgICAgICAgICAgICBzZWxmLnNjcmVlbi5fZHJhd2xpbmUoc2VsZi5jdXJyZW50TGluZUl0ZW0sIHNlbGYuY3VycmVudExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BlbmNvbG9yLCBzZWxmLl9wZW5zaXplKQorICAgICAgICAgICAgc2VsZi5jdXJyZW50TGluZUl0ZW0gPSBzZWxmLnNjcmVlbi5fY3JlYXRlbGluZSgpCisgICAgICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChzZWxmLmN1cnJlbnRMaW5lSXRlbSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2NyZWVuLl9kcmF3bGluZShzZWxmLmN1cnJlbnRMaW5lSXRlbSwgdG9wPVRydWUpCisgICAgICAgIHNlbGYuY3VycmVudExpbmUgPSBbXQorICAgICAgICBpZiB1c2VQb3M6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRMaW5lID0gW3NlbGYuX3Bvc2l0aW9uXQorCisgICAgZGVmIGZpbGwoc2VsZiwgZmxhZz1Ob25lKToKKyAgICAgICAgIiIiQ2FsbCBmaWxsKFRydWUpIGJlZm9yZSBkcmF3aW5nIGEgc2hhcGUgdG8gZmlsbCwgZmlsbChGYWxzZSkgd2hlbiBkb25lLgorCisgICAgICAgIE9wdGlvbmFsIGFyZ3VtZW50OgorICAgICAgICBmbGFnIC0tIFRydWUvRmFsc2UgKG9yIDEvMCByZXNwZWN0aXZlbHkpCisKKyAgICAgICAgQ2FsbCBmaWxsKFRydWUpIGJlZm9yZSBkcmF3aW5nIHRoZSBzaGFwZSB5b3Ugd2FudCB0byBmaWxsLAorICAgICAgICBhbmQgIGZpbGwoRmFsc2UpIHdoZW4gZG9uZS4KKyAgICAgICAgV2hlbiB1c2VkIHdpdGhvdXQgYXJndW1lbnQ6IHJldHVybiBmaWxsc3RhdGUgKFRydWUgaWYgZmlsbGluZywKKyAgICAgICAgRmFsc2UgZWxzZSkKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5maWxsKFRydWUpCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg5MCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDkwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gdHVydGxlLmxlZnQoOTApCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCisgICAgICAgID4+PiB0dXJ0bGUuZmlsbChGYWxzZSkKKyAgICAgICAgIiIiCisgICAgICAgIGZpbGxpbmcgPSBpc2luc3RhbmNlKHNlbGYuX2ZpbGxwYXRoLCBsaXN0KQorICAgICAgICBpZiBmbGFnIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZmlsbGluZworICAgICAgICBzY3JlZW4gPSBzZWxmLnNjcmVlbgorICAgICAgICBlbnRyeTEgPSBlbnRyeTIgPSAoKQorICAgICAgICBpZiBmaWxsaW5nOgorICAgICAgICAgICAgaWYgbGVuKHNlbGYuX2ZpbGxwYXRoKSA+IDI6CisgICAgICAgICAgICAgICAgc2VsZi5zY3JlZW4uX2RyYXdwb2x5KHNlbGYuX2ZpbGxpdGVtLCBzZWxmLl9maWxscGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1zZWxmLl9maWxsY29sb3IpCisgICAgICAgICAgICAgICAgZW50cnkxID0gKCJkb2ZpbGwiLCBzZWxmLl9maWxsaXRlbSkKKyAgICAgICAgaWYgZmxhZzoKKyAgICAgICAgICAgIHNlbGYuX2ZpbGxpdGVtID0gc2VsZi5zY3JlZW4uX2NyZWF0ZXBvbHkoKQorICAgICAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoc2VsZi5fZmlsbGl0ZW0pCisgICAgICAgICAgICBzZWxmLl9maWxscGF0aCA9IFtzZWxmLl9wb3NpdGlvbl0KKyAgICAgICAgICAgIGVudHJ5MiA9ICgiYmVnaW5maWxsIiwgc2VsZi5fZmlsbGl0ZW0pICMgLCBzZWxmLl9maWxscGF0aCkKKyAgICAgICAgICAgIHNlbGYuX25ld0xpbmUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZmlsbGl0ZW0gPSBzZWxmLl9maWxscGF0aCA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi51bmRvYnVmZmVyOgorICAgICAgICAgICAgaWYgZW50cnkxID09ICgpOgorICAgICAgICAgICAgICAgIGlmIGVudHJ5MiAhPSAoKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvYnVmZmVyLnB1c2goZW50cnkyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBlbnRyeTIgPT0gKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5wdXNoKGVudHJ5MSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIucHVzaChbInNlcSIsIGVudHJ5MSwgZW50cnkyXSkKKyAgICAgICAgc2VsZi5fdXBkYXRlKCkKKworICAgIGRlZiBiZWdpbl9maWxsKHNlbGYpOgorICAgICAgICAiIiJDYWxsZWQganVzdCBiZWZvcmUgZHJhd2luZyBhIHNoYXBlIHRvIGJlIGZpbGxlZC4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5iZWdpbl9maWxsKCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDkwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gdHVydGxlLmxlZnQoOTApCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg5MCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5lbmRfZmlsbCgpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmZpbGwoVHJ1ZSkKKworICAgIGRlZiBlbmRfZmlsbChzZWxmKToKKyAgICAgICAgIiIiRmlsbCB0aGUgc2hhcGUgZHJhd24gYWZ0ZXIgdGhlIGNhbGwgYmVnaW5fZmlsbCgpLgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmJlZ2luX2ZpbGwoKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gdHVydGxlLmxlZnQoOTApCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg5MCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDkwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gdHVydGxlLmVuZF9maWxsKCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZmlsbChGYWxzZSkKKworICAgIGRlZiBkb3Qoc2VsZiwgc2l6ZT1Ob25lLCAqY29sb3IpOgorICAgICAgICAiIiJEcmF3IGEgZG90IHdpdGggZGlhbWV0ZXIgc2l6ZSwgdXNpbmcgY29sb3IuCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICBzaXplIC0tIGFuIGludGVnZXIgPj0gMSAoaWYgZ2l2ZW4pCisgICAgICAgIGNvbG9yIC0tIGEgY29sb3JzdHJpbmcgb3IgYSBudW1lcmljIGNvbG9yIHR1cGxlCisKKyAgICAgICAgRHJhdyBhIGNpcmN1bGFyIGRvdCB3aXRoIGRpYW1ldGVyIHNpemUsIHVzaW5nIGNvbG9yLgorICAgICAgICBJZiBzaXplIGlzIG5vdCBnaXZlbiwgdGhlIG1heGltdW0gb2YgcGVuc2l6ZSs0IGFuZCAyKnBlbnNpemUgaXMgdXNlZC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5kb3QoKQorICAgICAgICA+Pj4gdHVydGxlLmZkKDUwKTsgdHVydGxlLmRvdCgyMCwgImJsdWUiKTsgdHVydGxlLmZkKDUwKQorICAgICAgICAiIiIKKyAgICAgICAgI3ByaW50ICJkb3QtMToiLCBzaXplLCBjb2xvcgorICAgICAgICBpZiBub3QgY29sb3I6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNpemUsIChzdHIsIHR1cGxlKSk6CisgICAgICAgICAgICAgICAgY29sb3IgPSBzZWxmLl9jb2xvcnN0cihzaXplKQorICAgICAgICAgICAgICAgIHNpemUgPSBzZWxmLl9wZW5zaXplICsgbWF4KHNlbGYuX3BlbnNpemUsIDQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbG9yID0gc2VsZi5fcGVuY29sb3IKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHNlbGYuX3BlbnNpemUgKyBtYXgoc2VsZi5fcGVuc2l6ZSwgNCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzaXplID0gc2VsZi5fcGVuc2l6ZSArIG1heChzZWxmLl9wZW5zaXplLCA0KQorICAgICAgICAgICAgY29sb3IgPSBzZWxmLl9jb2xvcnN0cihjb2xvcikKKyAgICAgICAgI3ByaW50ICJkb3QtMjoiLCBzaXplLCBjb2xvcgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuc2NyZWVuLCAiX2RvdCIpOgorICAgICAgICAgICAgaXRlbSA9IHNlbGYuc2NyZWVuLl9kb3Qoc2VsZi5fcG9zaXRpb24sIHNpemUsIGNvbG9yKQorICAgICAgICAgICAgI3ByaW50ICJkb3Q6Iiwgc2l6ZSwgY29sb3IsICJpdGVtOiIsIGl0ZW0KKyAgICAgICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKGl0ZW0pCisgICAgICAgICAgICBpZiBzZWxmLnVuZG9idWZmZXI6CisgICAgICAgICAgICAgICAgc2VsZi51bmRvYnVmZmVyLnB1c2goKCJkb3QiLCBpdGVtKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBlbiA9IHNlbGYucGVuKCkKKyAgICAgICAgICAgIGlmIHNlbGYudW5kb2J1ZmZlcjoKKyAgICAgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIucHVzaChbInNlcSJdKQorICAgICAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5jdW11bGF0ZSA9IFRydWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnJlc2l6ZW1vZGUoKSA9PSAnYXV0byc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaHQoKQorICAgICAgICAgICAgICAgIHNlbGYucGVuZG93bigpCisgICAgICAgICAgICAgICAgc2VsZi5wZW5zaXplKHNpemUpCisgICAgICAgICAgICAgICAgc2VsZi5wZW5jb2xvcihjb2xvcikKKyAgICAgICAgICAgICAgICBzZWxmLmZvcndhcmQoMCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2VsZi5wZW4ocGVuKQorICAgICAgICAgICAgaWYgc2VsZi51bmRvYnVmZmVyOgorICAgICAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5jdW11bGF0ZSA9IEZhbHNlCisKKyAgICBkZWYgX3dyaXRlKHNlbGYsIHR4dCwgYWxpZ24sIGZvbnQpOgorICAgICAgICAiIiJQZXJmb3JtcyB0aGUgd3JpdGluZyBmb3Igd3JpdGUoKQorICAgICAgICAiIiIKKyAgICAgICAgaXRlbSwgZW5kID0gc2VsZi5zY3JlZW4uX3dyaXRlKHNlbGYuX3Bvc2l0aW9uLCB0eHQsIGFsaWduLCBmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BlbmNvbG9yKQorICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChpdGVtKQorICAgICAgICBpZiBzZWxmLnVuZG9idWZmZXI6CisgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIucHVzaCgoIndyaSIsIGl0ZW0pKQorICAgICAgICByZXR1cm4gZW5kCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYXJnLCBtb3ZlPUZhbHNlLCBhbGlnbj0ibGVmdCIsIGZvbnQ9KCJBcmlhbCIsIDgsICJub3JtYWwiKSk6CisgICAgICAgICIiIldyaXRlIHRleHQgYXQgdGhlIGN1cnJlbnQgdHVydGxlIHBvc2l0aW9uLgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgYXJnIC0tIGluZm8sIHdoaWNoIGlzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIFR1cnRsZVNjcmVlbgorICAgICAgICBtb3ZlIChvcHRpb25hbCkgLS0gVHJ1ZS9GYWxzZQorICAgICAgICBhbGlnbiAob3B0aW9uYWwpIC0tIG9uZSBvZiB0aGUgc3RyaW5ncyAibGVmdCIsICJjZW50ZXIiIG9yIHJpZ2h0IgorICAgICAgICBmb250IChvcHRpb25hbCkgLS0gYSB0cmlwbGUgKGZvbnRuYW1lLCBmb250c2l6ZSwgZm9udHR5cGUpCisKKyAgICAgICAgV3JpdGUgdGV4dCAtIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYXJnIC0gYXQgdGhlIGN1cnJlbnQKKyAgICAgICAgdHVydGxlIHBvc2l0aW9uIGFjY29yZGluZyB0byBhbGlnbiAoImxlZnQiLCAiY2VudGVyIiBvciByaWdodCIpCisgICAgICAgIGFuZCB3aXRoIHRoZSBnaXZlbiBmb250LgorICAgICAgICBJZiBtb3ZlIGlzIFRydWUsIHRoZSBwZW4gaXMgbW92ZWQgdG8gdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIKKyAgICAgICAgb2YgdGhlIHRleHQuIEJ5IGRlZmF1bHQsIG1vdmUgaXMgRmFsc2UuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUud3JpdGUoJ0hvbWUgPSAnLCBUcnVlLCBhbGlnbj0iY2VudGVyIikKKyAgICAgICAgPj4+IHR1cnRsZS53cml0ZSgoMCwwKSwgVHJ1ZSkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYudW5kb2J1ZmZlcjoKKyAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5wdXNoKFsic2VxIl0pCisgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIuY3VtdWxhdGUgPSBUcnVlCisgICAgICAgIGVuZCA9IHNlbGYuX3dyaXRlKHN0cihhcmcpLCBhbGlnbi5sb3dlcigpLCBmb250KQorICAgICAgICBpZiBtb3ZlOgorICAgICAgICAgICAgeCwgeSA9IHNlbGYucG9zKCkKKyAgICAgICAgICAgIHNlbGYuc2V0cG9zKGVuZCwgeSkKKyAgICAgICAgaWYgc2VsZi51bmRvYnVmZmVyOgorICAgICAgICAgICAgc2VsZi51bmRvYnVmZmVyLmN1bXVsYXRlID0gRmFsc2UKKworICAgIGRlZiBiZWdpbl9wb2x5KHNlbGYpOgorICAgICAgICAiIiJTdGFydCByZWNvcmRpbmcgdGhlIHZlcnRpY2VzIG9mIGEgcG9seWdvbi4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBTdGFydCByZWNvcmRpbmcgdGhlIHZlcnRpY2VzIG9mIGEgcG9seWdvbi4gQ3VycmVudCB0dXJ0bGUgcG9zaXRpb24KKyAgICAgICAgaXMgZmlyc3QgcG9pbnQgb2YgcG9seWdvbi4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5iZWdpbl9wb2x5KCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3BvbHkgPSBbc2VsZi5fcG9zaXRpb25dCisgICAgICAgIHNlbGYuX2NyZWF0aW5nUG9seSA9IFRydWUKKworICAgIGRlZiBlbmRfcG9seShzZWxmKToKKyAgICAgICAgIiIiU3RvcCByZWNvcmRpbmcgdGhlIHZlcnRpY2VzIG9mIGEgcG9seWdvbi4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBTdG9wIHJlY29yZGluZyB0aGUgdmVydGljZXMgb2YgYSBwb2x5Z29uLiBDdXJyZW50IHR1cnRsZSBwb3NpdGlvbiBpcworICAgICAgICBsYXN0IHBvaW50IG9mIHBvbHlnb24uIFRoaXMgd2lsbCBiZSBjb25uZWN0ZWQgd2l0aCB0aGUgZmlyc3QgcG9pbnQuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuZW5kX3BvbHkoKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY3JlYXRpbmdQb2x5ID0gRmFsc2UKKworICAgIGRlZiBnZXRfcG9seShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBsYXN0bHkgcmVjb3JkZWQgcG9seWdvbi4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHAgPSB0dXJ0bGUuZ2V0X3BvbHkoKQorICAgICAgICA+Pj4gdHVydGxlLnJlZ2lzdGVyX3NoYXBlKCJteUZhdm91cml0ZVNoYXBlIiwgcCkKKyAgICAgICAgIiIiCisgICAgICAgICMjIGNoZWNrIGlmIHRoZXJlIGlzIGFueSBwb2x5PyAgLS0gMXN0IHNvbHV0aW9uOgorICAgICAgICBpZiBzZWxmLl9wb2x5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYuX3BvbHkpCisKKyAgICBkZWYgZ2V0c2NyZWVuKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIFR1cnRsZVNjcmVlbiBvYmplY3QsIHRoZSB0dXJ0bGUgaXMgZHJhd2luZyAgb24uCisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgUmV0dXJuIHRoZSBUdXJ0bGVTY3JlZW4gb2JqZWN0LCB0aGUgdHVydGxlIGlzIGRyYXdpbmcgIG9uLgorICAgICAgICBTbyBUdXJ0bGVTY3JlZW4tbWV0aG9kcyBjYW4gYmUgY2FsbGVkIGZvciB0aGF0IG9iamVjdC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHRzID0gdHVydGxlLmdldHNjcmVlbigpCisgICAgICAgID4+PiB0cworICAgICAgICA8dHVydGxlLlR1cnRsZVNjcmVlbiBvYmplY3QgYXQgMHgwMTA2Qjc3MD4KKyAgICAgICAgPj4+IHRzLmJnY29sb3IoInBpbmsiKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2NyZWVuCisKKyAgICBkZWYgZ2V0dHVydGxlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIFR1cnRsZW9iamVjdCBpdHNlbGYuCisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgT25seSByZWFzb25hYmxlIHVzZTogYXMgYSBmdW5jdGlvbiB0byByZXR1cm4gdGhlICdhbm9ueW1vdXMgdHVydGxlJzoKKworICAgICAgICBFeGFtcGxlOgorICAgICAgICA+Pj4gcGV0ID0gZ2V0dHVydGxlKCkKKyAgICAgICAgPj4+IHBldC5mZCg1MCkKKyAgICAgICAgPj4+IHBldAorICAgICAgICA8dHVydGxlLlR1cnRsZSBvYmplY3QgYXQgMHgwMTg3RDgxMD4KKyAgICAgICAgPj4+IHR1cnRsZXMoKQorICAgICAgICBbPHR1cnRsZS5UdXJ0bGUgb2JqZWN0IGF0IDB4MDE4N0Q4MTA+XQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGdldHBlbiA9IGdldHR1cnRsZQorCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyMjIHNjcmVlbiBvcmllbnRlZCBtZXRob2RzIHJlY3VycmluZyB0byBtZXRob2RzIG9mIFR1cnRsZVNjcmVlbgorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgIGRlZiB3aW5kb3dfd2lkdGgoc2VsZik6CisgICAgICAgICIiIiBSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgdHVydGxlIHdpbmRvdy4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi53aW5kb3dfd2lkdGgoKQorICAgICAgICA2NDAKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNjcmVlbi5fd2luZG93X3NpemUoKVswXQorCisgICAgZGVmIHdpbmRvd19oZWlnaHQoc2VsZik6CisgICAgICAgICIiIiBSZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgdHVydGxlIHdpbmRvdy4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi53aW5kb3dfaGVpZ2h0KCkKKyAgICAgICAgNDgwCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zY3JlZW4uX3dpbmRvd19zaXplKClbMV0KKworICAgIGRlZiBfZGVsYXkoc2VsZiwgZGVsYXk9Tm9uZSk6CisgICAgICAgICIiIlNldCBkZWxheSB2YWx1ZSB3aGljaCBkZXRlcm1pbmVzIHNwZWVkIG9mIHR1cnRsZSBhbmltYXRpb24uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zY3JlZW4uZGVsYXkoZGVsYXkpCisKKyAgICAjIyMjIyAgIGV2ZW50IGJpbmRpbmcgbWV0aG9kcyAgICMjIyMjCisKKyAgICBkZWYgb25jbGljayhzZWxmLCBmdW4sIGJ0bj0xLCBhZGQ9Tm9uZSk6CisgICAgICAgICIiIkJpbmQgZnVuIHRvIG1vdXNlLWNsaWNrIGV2ZW50IG9uIHRoaXMgdHVydGxlIG9uIGNhbnZhcy4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIGZ1biAtLSAgYSBmdW5jdGlvbiB3aXRoIHR3byBhcmd1bWVudHMsIHRvIHdoaWNoIHdpbGwgYmUgYXNzaWduZWQKKyAgICAgICAgICAgICAgICB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNsaWNrZWQgcG9pbnQgb24gdGhlIGNhbnZhcy4KKyAgICAgICAgbnVtIC0tICBudW1iZXIgb2YgdGhlIG1vdXNlLWJ1dHRvbiBkZWZhdWx0cyB0byAxIChsZWZ0IG1vdXNlIGJ1dHRvbikuCisgICAgICAgIGFkZCAtLSAgVHJ1ZSBvciBGYWxzZS4gSWYgVHJ1ZSwgbmV3IGJpbmRpbmcgd2lsbCBiZSBhZGRlZCwgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgaXQgd2lsbCByZXBsYWNlIGEgZm9ybWVyIGJpbmRpbmcuCisKKyAgICAgICAgRXhhbXBsZSBmb3IgdGhlIGFub255bW91cyB0dXJ0bGUsIGkuIGUuIHRoZSBwcm9jZWR1cmFsIHdheToKKworICAgICAgICA+Pj4gZGVmIHR1cm4oeCwgeSk6CisgICAgICAgIC4uLiAgICAgbGVmdCgzNjApCisgICAgICAgIC4uLgorICAgICAgICA+Pj4gb25jbGljayh0dXJuKSAgIyBOb3cgY2xpY2tpbmcgaW50byB0aGUgdHVydGxlIHdpbGwgdHVybiBpdC4KKyAgICAgICAgPj4+IG9uY2xpY2soTm9uZSkgICMgZXZlbnQtYmluZGluZyB3aWxsIGJlIHJlbW92ZWQKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc2NyZWVuLl9vbmNsaWNrKHNlbGYudHVydGxlLl9pdGVtLCBmdW4sIGJ0biwgYWRkKQorICAgICAgICBzZWxmLl91cGRhdGUoKQorCisgICAgZGVmIG9ucmVsZWFzZShzZWxmLCBmdW4sIGJ0bj0xLCBhZGQ9Tm9uZSk6CisgICAgICAgICIiIkJpbmQgZnVuIHRvIG1vdXNlLWJ1dHRvbi1yZWxlYXNlIGV2ZW50IG9uIHRoaXMgdHVydGxlIG9uIGNhbnZhcy4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIGZ1biAtLSBhIGZ1bmN0aW9uIHdpdGggdHdvIGFyZ3VtZW50cywgdG8gd2hpY2ggd2lsbCBiZSBhc3NpZ25lZAorICAgICAgICAgICAgICAgIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY2xpY2tlZCBwb2ludCBvbiB0aGUgY2FudmFzLgorICAgICAgICBudW0gLS0gIG51bWJlciBvZiB0aGUgbW91c2UtYnV0dG9uIGRlZmF1bHRzIHRvIDEgKGxlZnQgbW91c2UgYnV0dG9uKS4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBNeVR1cnRsZSBpbnN0YW5jZSBuYW1lZCBqb2UpOgorICAgICAgICA+Pj4gY2xhc3MgTXlUdXJ0bGUoVHVydGxlKToKKyAgICAgICAgLi4uICAgICBkZWYgZ2xvdyhzZWxmLHgseSk6CisgICAgICAgIC4uLiAgICAgICAgICAgICBzZWxmLmZpbGxjb2xvcigicmVkIikKKyAgICAgICAgLi4uICAgICBkZWYgdW5nbG93KHNlbGYseCx5KToKKyAgICAgICAgLi4uICAgICAgICAgICAgIHNlbGYuZmlsbGNvbG9yKCIiKQorICAgICAgICAuLi4KKyAgICAgICAgPj4+IGpvZSA9IE15VHVydGxlKCkKKyAgICAgICAgPj4+IGpvZS5vbmNsaWNrKGpvZS5nbG93KQorICAgICAgICA+Pj4gam9lLm9ucmVsZWFzZShqb2UudW5nbG93KQorCisgICAgICAgIENsaWNraW5nIG9uIGpvZSB0dXJucyBmaWxsY29sb3IgcmVkLCB1bmNsaWNraW5nIHR1cm5zIGl0IHRvCisgICAgICAgIHRyYW5zcGFyZW50LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zY3JlZW4uX29ucmVsZWFzZShzZWxmLnR1cnRsZS5faXRlbSwgZnVuLCBidG4sIGFkZCkKKyAgICAgICAgc2VsZi5fdXBkYXRlKCkKKworICAgIGRlZiBvbmRyYWcoc2VsZiwgZnVuLCBidG49MSwgYWRkPU5vbmUpOgorICAgICAgICAiIiJCaW5kIGZ1biB0byBtb3VzZS1tb3ZlIGV2ZW50IG9uIHRoaXMgdHVydGxlIG9uIGNhbnZhcy4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIGZ1biAtLSBhIGZ1bmN0aW9uIHdpdGggdHdvIGFyZ3VtZW50cywgdG8gd2hpY2ggd2lsbCBiZSBhc3NpZ25lZAorICAgICAgICAgICAgICAgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjbGlja2VkIHBvaW50IG9uIHRoZSBjYW52YXMuCisgICAgICAgIG51bSAtLSBudW1iZXIgb2YgdGhlIG1vdXNlLWJ1dHRvbiBkZWZhdWx0cyB0byAxIChsZWZ0IG1vdXNlIGJ1dHRvbikuCisKKyAgICAgICAgRXZlcnkgc2VxdWVuY2Ugb2YgbW91c2UtbW92ZS1ldmVudHMgb24gYSB0dXJ0bGUgaXMgcHJlY2VkZWQgYnkgYQorICAgICAgICBtb3VzZS1jbGljayBldmVudCBvbiB0aGF0IHR1cnRsZS4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5vbmRyYWcodHVydGxlLmdvdG8pCisKKyAgICAgICAgU3Vic2VxdWVudGx5IGNsaWNraW5nIGFuZCBkcmFnZ2luZyBhIFR1cnRsZSB3aWxsIG1vdmUgaXQKKyAgICAgICAgYWNyb3NzIHRoZSBzY3JlZW4gdGhlcmVieSBwcm9kdWNpbmcgaGFuZGRyYXdpbmdzIChpZiBwZW4gaXMKKyAgICAgICAgZG93bikuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnNjcmVlbi5fb25kcmFnKHNlbGYudHVydGxlLl9pdGVtLCBmdW4sIGJ0biwgYWRkKQorCisKKyAgICBkZWYgX3VuZG8oc2VsZiwgYWN0aW9uLCBkYXRhKToKKyAgICAgICAgIiIiRG9lcyB0aGUgbWFpbiBwYXJ0IG9mIHRoZSB3b3JrIGZvciB1bmRvKCkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYudW5kb2J1ZmZlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGFjdGlvbiA9PSAicm90IjoKKyAgICAgICAgICAgIGFuZ2xlLCBkZWdQQVUgPSBkYXRhCisgICAgICAgICAgICBzZWxmLl9yb3RhdGUoLWFuZ2xlKmRlZ1BBVS9zZWxmLl9kZWdyZWVzUGVyQVUpCisgICAgICAgICAgICBkdW1teSA9IHNlbGYudW5kb2J1ZmZlci5wb3AoKQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAic3RhbXAiOgorICAgICAgICAgICAgc3RpdGVtID0gZGF0YVswXQorICAgICAgICAgICAgc2VsZi5jbGVhcnN0YW1wKHN0aXRlbSkKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gImdvIjoKKyAgICAgICAgICAgIHNlbGYuX3VuZG9nb3RvKGRhdGEpCisgICAgICAgIGVsaWYgYWN0aW9uIGluIFsid3JpIiwgImRvdCJdOgorICAgICAgICAgICAgaXRlbSA9IGRhdGFbMF0KKyAgICAgICAgICAgIHNlbGYuc2NyZWVuLl9kZWxldGUoaXRlbSkKKyAgICAgICAgICAgIHNlbGYuaXRlbXMucmVtb3ZlKGl0ZW0pCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJkb2ZpbGwiOgorICAgICAgICAgICAgaXRlbSA9IGRhdGFbMF0KKyAgICAgICAgICAgIHNlbGYuc2NyZWVuLl9kcmF3cG9seShpdGVtLCAoKDAsIDApLCgwLCAwKSwoMCwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9IiIsIG91dGxpbmU9IiIpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJiZWdpbmZpbGwiOgorICAgICAgICAgICAgaXRlbSA9IGRhdGFbMF0KKyAgICAgICAgICAgIHNlbGYuX2ZpbGxpdGVtID0gc2VsZi5fZmlsbHBhdGggPSBOb25lCisgICAgICAgICAgICBzZWxmLnNjcmVlbi5fZGVsZXRlKGl0ZW0pCisgICAgICAgICAgICBzZWxmLml0ZW1zLnJlbW92ZShpdGVtKQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAicGVuIjoKKyAgICAgICAgICAgIFRQZW4ucGVuKHNlbGYsIGRhdGFbMF0pCisgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIucG9wKCkKKworICAgIGRlZiB1bmRvKHNlbGYpOgorICAgICAgICAiIiJ1bmRvIChyZXBlYXRlZGx5KSB0aGUgbGFzdCB0dXJ0bGUgYWN0aW9uLgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIHVuZG8gKHJlcGVhdGVkbHkpIHRoZSBsYXN0IHR1cnRsZSBhY3Rpb24uCisgICAgICAgIE51bWJlciBvZiBhdmFpbGFibGUgdW5kbyBhY3Rpb25zIGlzIGRldGVybWluZWQgYnkgdGhlIHNpemUgb2YKKyAgICAgICAgdGhlIHVuZG9idWZmZXIuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAgICAgLi4uICAgICB0dXJ0bGUuZmQoNTApOyB0dXJ0bGUubHQoODApCisgICAgICAgIC4uLgorICAgICAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoOCk6CisgICAgICAgIC4uLiAgICAgdHVydGxlLnVuZG8oKQorICAgICAgICAuLi4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYudW5kb2J1ZmZlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGl0ZW0gPSBzZWxmLnVuZG9idWZmZXIucG9wKCkKKyAgICAgICAgYWN0aW9uID0gaXRlbVswXQorICAgICAgICBkYXRhID0gaXRlbVsxOl0KKyAgICAgICAgaWYgYWN0aW9uID09ICJzZXEiOgorICAgICAgICAgICAgd2hpbGUgZGF0YToKKyAgICAgICAgICAgICAgICBpdGVtID0gZGF0YS5wb3AoKQorICAgICAgICAgICAgICAgIHNlbGYuX3VuZG8oaXRlbVswXSwgaXRlbVsxOl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl91bmRvKGFjdGlvbiwgZGF0YSkKKworICAgIHR1cnRsZXNpemUgPSBzaGFwZXNpemUKKworUmF3UGVuID0gUmF3VHVydGxlCisKKyMjIyAgU2NyZWVuIC0gU2luZ2xldG9uICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIFNjcmVlbigpOgorICAgICIiIlJldHVybiB0aGUgc2luZ2xldG9uIHNjcmVlbiBvYmplY3QuCisgICAgSWYgbm9uZSBleGlzdHMgYXQgdGhlIG1vbWVudCwgY3JlYXRlIGEgbmV3IG9uZSBhbmQgcmV0dXJuIGl0LAorICAgIGVsc2UgcmV0dXJuIHRoZSBleGlzdGluZyBvbmUuIiIiCisgICAgaWYgVHVydGxlLl9zY3JlZW4gaXMgTm9uZToKKyAgICAgICAgVHVydGxlLl9zY3JlZW4gPSBfU2NyZWVuKCkKKyAgICByZXR1cm4gVHVydGxlLl9zY3JlZW4KKworY2xhc3MgX1NjcmVlbihUdXJ0bGVTY3JlZW4pOgorCisgICAgX3Jvb3QgPSBOb25lCisgICAgX2NhbnZhcyA9IE5vbmUKKyAgICBfdGl0bGUgPSBfQ0ZHWyJ0aXRsZSJdCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgWFhYIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHRoaXMgY29kZSB0byBiZSBjb25kaXRpb25hbCwKKyAgICAgICAgIyBhcyB0aGVyZSB3aWxsIGJlIG9ubHkgYSBzaW5nbGUgX1NjcmVlbiBpbnN0YW5jZSwgYW55d2F5CisgICAgICAgICMgWFhYIGFjdHVhbGx5LCB0aGUgdHVydGxlIGRlbW8gaXMgaW5qZWN0aW5nIHJvb3Qgd2luZG93LAorICAgICAgICAjIHNvIHBlcmhhcHMgdGhlIGNvbmRpdGlvbmFsIGNyZWF0aW9uIG9mIGEgcm9vdCBzaG91bGQgYmUKKyAgICAgICAgIyBwcmVzZXJ2ZWQgKHBlcmhhcHMgYnkgcGFzc2luZyBpdCBhcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIpCisgICAgICAgIGlmIF9TY3JlZW4uX3Jvb3QgaXMgTm9uZToKKyAgICAgICAgICAgIF9TY3JlZW4uX3Jvb3QgPSBzZWxmLl9yb290ID0gX1Jvb3QoKQorICAgICAgICAgICAgc2VsZi5fcm9vdC50aXRsZShfU2NyZWVuLl90aXRsZSkKKyAgICAgICAgICAgIHNlbGYuX3Jvb3Qub25kZXN0cm95KHNlbGYuX2Rlc3Ryb3kpCisgICAgICAgIGlmIF9TY3JlZW4uX2NhbnZhcyBpcyBOb25lOgorICAgICAgICAgICAgd2lkdGggPSBfQ0ZHWyJ3aWR0aCJdCisgICAgICAgICAgICBoZWlnaHQgPSBfQ0ZHWyJoZWlnaHQiXQorICAgICAgICAgICAgY2FudndpZHRoID0gX0NGR1siY2FudndpZHRoIl0KKyAgICAgICAgICAgIGNhbnZoZWlnaHQgPSBfQ0ZHWyJjYW52aGVpZ2h0Il0KKyAgICAgICAgICAgIGxlZnRyaWdodCA9IF9DRkdbImxlZnRyaWdodCJdCisgICAgICAgICAgICB0b3Bib3R0b20gPSBfQ0ZHWyJ0b3Bib3R0b20iXQorICAgICAgICAgICAgc2VsZi5fcm9vdC5zZXR1cGNhbnZhcyh3aWR0aCwgaGVpZ2h0LCBjYW52d2lkdGgsIGNhbnZoZWlnaHQpCisgICAgICAgICAgICBfU2NyZWVuLl9jYW52YXMgPSBzZWxmLl9yb290Ll9nZXRjYW52YXMoKQorICAgICAgICAgICAgVHVydGxlU2NyZWVuLl9faW5pdF9fKHNlbGYsIF9TY3JlZW4uX2NhbnZhcykKKyAgICAgICAgICAgIHNlbGYuc2V0dXAod2lkdGgsIGhlaWdodCwgbGVmdHJpZ2h0LCB0b3Bib3R0b20pCisKKyAgICBkZWYgc2V0dXAoc2VsZiwgd2lkdGg9X0NGR1sid2lkdGgiXSwgaGVpZ2h0PV9DRkdbImhlaWdodCJdLAorICAgICAgICAgICAgICBzdGFydHg9X0NGR1sibGVmdHJpZ2h0Il0sIHN0YXJ0eT1fQ0ZHWyJ0b3Bib3R0b20iXSk6CisgICAgICAgICIiIiBTZXQgdGhlIHNpemUgYW5kIHBvc2l0aW9uIG9mIHRoZSBtYWluIHdpbmRvdy4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIHdpZHRoOiBhcyBpbnRlZ2VyIGEgc2l6ZSBpbiBwaXhlbHMsIGFzIGZsb2F0IGEgZnJhY3Rpb24gb2YgdGhlIHNjcmVlbi4KKyAgICAgICAgICBEZWZhdWx0IGlzIDUwJSBvZiBzY3JlZW4uCisgICAgICAgIGhlaWdodDogYXMgaW50ZWdlciB0aGUgaGVpZ2h0IGluIHBpeGVscywgYXMgZmxvYXQgYSBmcmFjdGlvbiBvZiB0aGUKKyAgICAgICAgICBzY3JlZW4uIERlZmF1bHQgaXMgNzUlIG9mIHNjcmVlbi4KKyAgICAgICAgc3RhcnR4OiBpZiBwb3NpdGl2ZSwgc3RhcnRpbmcgcG9zaXRpb24gaW4gcGl4ZWxzIGZyb20gdGhlIGxlZnQKKyAgICAgICAgICBlZGdlIG9mIHRoZSBzY3JlZW4sIGlmIG5lZ2F0aXZlIGZyb20gdGhlIHJpZ2h0IGVkZ2UKKyAgICAgICAgICBEZWZhdWx0LCBzdGFydHg9Tm9uZSBpcyB0byBjZW50ZXIgd2luZG93IGhvcml6b250YWxseS4KKyAgICAgICAgc3RhcnR5OiBpZiBwb3NpdGl2ZSwgc3RhcnRpbmcgcG9zaXRpb24gaW4gcGl4ZWxzIGZyb20gdGhlIHRvcAorICAgICAgICAgIGVkZ2Ugb2YgdGhlIHNjcmVlbiwgaWYgbmVnYXRpdmUgZnJvbSB0aGUgYm90dG9tIGVkZ2UKKyAgICAgICAgICBEZWZhdWx0LCBzdGFydHk9Tm9uZSBpcyB0byBjZW50ZXIgd2luZG93IHZlcnRpY2FsbHkuCisKKyAgICAgICAgRXhhbXBsZXMgKGZvciBhIFNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLnNldHVwICh3aWR0aD0yMDAsIGhlaWdodD0yMDAsIHN0YXJ0eD0wLCBzdGFydHk9MCkKKworICAgICAgICBzZXRzIHdpbmRvdyB0byAyMDB4MjAwIHBpeGVscywgaW4gdXBwZXIgbGVmdCBvZiBzY3JlZW4KKworICAgICAgICA+Pj4gc2NyZWVuLnNldHVwKHdpZHRoPS43NSwgaGVpZ2h0PTAuNSwgc3RhcnR4PU5vbmUsIHN0YXJ0eT1Ob25lKQorCisgICAgICAgIHNldHMgd2luZG93IHRvIDc1JSBvZiBzY3JlZW4gYnkgNTAlIG9mIHNjcmVlbiBhbmQgY2VudGVycworICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZi5fcm9vdCwgInNldF9nZW9tZXRyeSIpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHN3ID0gc2VsZi5fcm9vdC53aW5fd2lkdGgoKQorICAgICAgICBzaCA9IHNlbGYuX3Jvb3Qud2luX2hlaWdodCgpCisgICAgICAgIGlmIGlzaW5zdGFuY2Uod2lkdGgsIGZsb2F0KSBhbmQgMCA8PSB3aWR0aCA8PSAxOgorICAgICAgICAgICAgd2lkdGggPSBzdyp3aWR0aAorICAgICAgICBpZiBzdGFydHggaXMgTm9uZToKKyAgICAgICAgICAgIHN0YXJ0eCA9IChzdyAtIHdpZHRoKSAvIDIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShoZWlnaHQsIGZsb2F0KSBhbmQgMCA8PSBoZWlnaHQgPD0gMToKKyAgICAgICAgICAgIGhlaWdodCA9IHNoKmhlaWdodAorICAgICAgICBpZiBzdGFydHkgaXMgTm9uZToKKyAgICAgICAgICAgIHN0YXJ0eSA9IChzaCAtIGhlaWdodCkgLyAyCisgICAgICAgIHNlbGYuX3Jvb3Quc2V0X2dlb21ldHJ5KHdpZHRoLCBoZWlnaHQsIHN0YXJ0eCwgc3RhcnR5KQorICAgICAgICBzZWxmLnVwZGF0ZSgpCisKKyAgICBkZWYgdGl0bGUoc2VsZiwgdGl0bGVzdHJpbmcpOgorICAgICAgICAiIiJTZXQgdGl0bGUgb2YgdHVydGxlLXdpbmRvdworCisgICAgICAgIEFyZ3VtZW50OgorICAgICAgICB0aXRsZXN0cmluZyAtLSBhIHN0cmluZywgdG8gYXBwZWFyIGluIHRoZSB0aXRsZWJhciBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgdHVydGxlIGdyYXBoaWNzIHdpbmRvdy4KKworICAgICAgICBUaGlzIGlzIGEgbWV0aG9kIG9mIFNjcmVlbi1jbGFzcy4gTm90IGF2YWlsYWJsZSBmb3IgVHVydGxlU2NyZWVuLQorICAgICAgICBvYmplY3RzLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLnRpdGxlKCJXZWxjb21lIHRvIHRoZSB0dXJ0bGUtem9vISIpCisgICAgICAgICIiIgorICAgICAgICBpZiBfU2NyZWVuLl9yb290IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgX1NjcmVlbi5fcm9vdC50aXRsZSh0aXRsZXN0cmluZykKKyAgICAgICAgX1NjcmVlbi5fdGl0bGUgPSB0aXRsZXN0cmluZworCisgICAgZGVmIF9kZXN0cm95KHNlbGYpOgorICAgICAgICByb290ID0gc2VsZi5fcm9vdAorICAgICAgICBpZiByb290IGlzIF9TY3JlZW4uX3Jvb3Q6CisgICAgICAgICAgICBUdXJ0bGUuX3BlbiA9IE5vbmUKKyAgICAgICAgICAgIFR1cnRsZS5fc2NyZWVuID0gTm9uZQorICAgICAgICAgICAgX1NjcmVlbi5fcm9vdCA9IE5vbmUKKyAgICAgICAgICAgIF9TY3JlZW4uX2NhbnZhcyA9IE5vbmUKKyAgICAgICAgVHVydGxlU2NyZWVuLl9SVU5OSU5HID0gVHJ1ZQorICAgICAgICByb290LmRlc3Ryb3koKQorCisgICAgZGVmIGJ5ZShzZWxmKToKKyAgICAgICAgIiIiU2h1dCB0aGUgdHVydGxlZ3JhcGhpY3Mgd2luZG93LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLmJ5ZSgpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9kZXN0cm95KCkKKworICAgIGRlZiBleGl0b25jbGljayhzZWxmKToKKyAgICAgICAgIiIiR28gaW50byBtYWlubG9vcCB1bnRpbCB0aGUgbW91c2UgaXMgY2xpY2tlZC4KKworICAgICAgICBObyBhcmd1bWVudHMuCisKKyAgICAgICAgQmluZCBieWUoKSBtZXRob2QgdG8gbW91c2VjbGljayBvbiBUdXJ0bGVTY3JlZW4uCisgICAgICAgIElmICJ1c2luZ19JRExFIiAtIHZhbHVlIGluIGNvbmZpZ3VyYXRpb24gZGljdGlvbmFyeSBpcyBGYWxzZQorICAgICAgICAoZGVmYXVsdCB2YWx1ZSksIGVudGVyIG1haW5sb29wLgorICAgICAgICBJZiBJRExFIHdpdGggLW4gc3dpdGNoIChubyBzdWJwcm9jZXNzKSBpcyB1c2VkLCB0aGlzIHZhbHVlIHNob3VsZCBiZQorICAgICAgICBzZXQgdG8gVHJ1ZSBpbiB0dXJ0bGUuY2ZnLiBJbiB0aGlzIGNhc2UgSURMRSdzIG1haW5sb29wCisgICAgICAgIGlzIGFjdGl2ZSBhbHNvIGZvciB0aGUgY2xpZW50IHNjcmlwdC4KKworICAgICAgICBUaGlzIGlzIGEgbWV0aG9kIG9mIHRoZSBTY3JlZW4tY2xhc3MgYW5kIG5vdCBhdmFpbGFibGUgZm9yCisgICAgICAgIFR1cnRsZVNjcmVlbiBpbnN0YW5jZXMuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisgICAgICAgID4+PiBzY3JlZW4uZXhpdG9uY2xpY2soKQorCisgICAgICAgICIiIgorICAgICAgICBkZWYgZXhpdEdyYWNlZnVsbHkoeCwgeSk6CisgICAgICAgICAgICAiIiJTY3JlZW4uYnllKCkgd2l0aCB0d28gZHVtbXktcGFyYW1ldGVycyIiIgorICAgICAgICAgICAgc2VsZi5ieWUoKQorICAgICAgICBzZWxmLm9uY2xpY2soZXhpdEdyYWNlZnVsbHkpCisgICAgICAgIGlmIF9DRkdbInVzaW5nX0lETEUiXToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBtYWlubG9vcCgpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGV4aXQoMCkKKworCitjbGFzcyBUdXJ0bGUoUmF3VHVydGxlKToKKyAgICAiIiJSYXdUdXJ0bGUgYXV0by1jcmVhdGluZyAoc2Nyb2xsZWQpIGNhbnZhcy4KKworICAgIFdoZW4gYSBUdXJ0bGUgb2JqZWN0IGlzIGNyZWF0ZWQgb3IgYSBmdW5jdGlvbiBkZXJpdmVkIGZyb20gc29tZQorICAgIFR1cnRsZSBtZXRob2QgaXMgY2FsbGVkIGEgVHVydGxlU2NyZWVuIG9iamVjdCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQuCisgICAgIiIiCisgICAgX3BlbiA9IE5vbmUKKyAgICBfc2NyZWVuID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHNoYXBlPV9DRkdbInNoYXBlIl0sCisgICAgICAgICAgICAgICAgIHVuZG9idWZmZXJzaXplPV9DRkdbInVuZG9idWZmZXJzaXplIl0sCisgICAgICAgICAgICAgICAgIHZpc2libGU9X0NGR1sidmlzaWJsZSJdKToKKyAgICAgICAgaWYgVHVydGxlLl9zY3JlZW4gaXMgTm9uZToKKyAgICAgICAgICAgIFR1cnRsZS5fc2NyZWVuID0gU2NyZWVuKCkKKyAgICAgICAgUmF3VHVydGxlLl9faW5pdF9fKHNlbGYsIFR1cnRsZS5fc2NyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGU9c2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRvYnVmZmVyc2l6ZT11bmRvYnVmZmVyc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGU9dmlzaWJsZSkKKworUGVuID0gVHVydGxlCisKK2RlZiBfZ2V0cGVuKCk6CisgICAgIiIiQ3JlYXRlIHRoZSAnYW5vbnltb3VzJyB0dXJ0bGUgaWYgbm90IGFscmVhZHkgcHJlc2VudC4iIiIKKyAgICBpZiBUdXJ0bGUuX3BlbiBpcyBOb25lOgorICAgICAgICBUdXJ0bGUuX3BlbiA9IFR1cnRsZSgpCisgICAgcmV0dXJuIFR1cnRsZS5fcGVuCisKK2RlZiBfZ2V0c2NyZWVuKCk6CisgICAgIiIiQ3JlYXRlIGEgVHVydGxlU2NyZWVuIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuIiIiCisgICAgaWYgVHVydGxlLl9zY3JlZW4gaXMgTm9uZToKKyAgICAgICAgVHVydGxlLl9zY3JlZW4gPSBTY3JlZW4oKQorICAgIHJldHVybiBUdXJ0bGUuX3NjcmVlbgorCitkZWYgd3JpdGVfZG9jc3RyaW5nZGljdChmaWxlbmFtZT0idHVydGxlX2RvY3N0cmluZ2RpY3QiKToKKyAgICAiIiJDcmVhdGUgYW5kIHdyaXRlIGRvY3N0cmluZy1kaWN0aW9uYXJ5IHRvIGZpbGUuCisKKyAgICBPcHRpb25hbCBhcmd1bWVudDoKKyAgICBmaWxlbmFtZSAtLSBhIHN0cmluZywgdXNlZCBhcyBmaWxlbmFtZQorICAgICAgICAgICAgICAgIGRlZmF1bHQgdmFsdWUgaXMgdHVydGxlX2RvY3N0cmluZ2RpY3QKKworICAgIEhhcyB0byBiZSBjYWxsZWQgZXhwbGljaXRseSwgKG5vdCB1c2VkIGJ5IHRoZSB0dXJ0bGUtZ3JhcGhpY3MgY2xhc3NlcykKKyAgICBUaGUgZG9jc3RyaW5nIGRpY3Rpb25hcnkgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBQeXRob24gc2NyaXB0IDxmaWxuYW1lPi5weQorICAgIEl0IGlzIGludGVuZGVkIHRvIHNlcnZlIGFzIGEgdGVtcGxhdGUgZm9yIHRyYW5zbGF0aW9uIG9mIHRoZSBkb2NzdHJpbmdzCisgICAgaW50byBkaWZmZXJlbnQgbGFuZ3VhZ2VzLgorICAgICIiIgorICAgIGRvY3NkaWN0ID0ge30KKworICAgIGZvciBtZXRob2RuYW1lIGluIF90Z19zY3JlZW5fZnVuY3Rpb25zOgorICAgICAgICBrZXkgPSAiX1NjcmVlbi4iK21ldGhvZG5hbWUKKyAgICAgICAgZG9jc2RpY3Rba2V5XSA9IGV2YWwoa2V5KS5fX2RvY19fCisgICAgZm9yIG1ldGhvZG5hbWUgaW4gX3RnX3R1cnRsZV9mdW5jdGlvbnM6CisgICAgICAgIGtleSA9ICJUdXJ0bGUuIittZXRob2RuYW1lCisgICAgICAgIGRvY3NkaWN0W2tleV0gPSBldmFsKGtleSkuX19kb2NfXworCisgICAgZiA9IG9wZW4oIiVzLnB5IiAlIGZpbGVuYW1lLCJ3IikKKyAgICBrZXlzID0gc29ydGVkKFt4IGZvciB4IGluIGRvY3NkaWN0LmtleXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgeC5zcGxpdCgnLicpWzFdIG5vdCBpbiBfYWxpYXNfbGlzdF0pCisgICAgZi53cml0ZSgnZG9jc2RpY3QgPSB7XG5cbicpCisgICAgZm9yIGtleSBpbiBrZXlzWzotMV06CisgICAgICAgIGYud3JpdGUoJyVzIDpcbicgJSByZXByKGtleSkpCisgICAgICAgIGYud3JpdGUoJyAgICAgICAgIiIiJXNcbiIiIixcblxuJyAlIGRvY3NkaWN0W2tleV0pCisgICAga2V5ID0ga2V5c1stMV0KKyAgICBmLndyaXRlKCclcyA6XG4nICUgcmVwcihrZXkpKQorICAgIGYud3JpdGUoJyAgICAgICAgIiIiJXNcbiIiIlxuXG4nICUgZG9jc2RpY3Rba2V5XSkKKyAgICBmLndyaXRlKCJ9XG4iKQorICAgIGYuY2xvc2UoKQorCitkZWYgcmVhZF9kb2NzdHJpbmdzKGxhbmcpOgorICAgICIiIlJlYWQgaW4gZG9jc3RyaW5ncyBmcm9tIGxhbmctc3BlY2lmaWMgZG9jc3RyaW5nIGRpY3Rpb25hcnkuCisKKyAgICBUcmFuc2ZlciBkb2NzdHJpbmdzLCB0cmFuc2xhdGVkIHRvIGxhbmcsIGZyb20gYSBkaWN0aW9uYXJ5LWZpbGUKKyAgICB0byB0aGUgbWV0aG9kcyBvZiBjbGFzc2VzIFNjcmVlbiBhbmQgVHVydGxlIGFuZCAtIGluIHJldmlzZWQgZm9ybSAtCisgICAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zLgorICAgICIiIgorICAgIG1vZG5hbWUgPSAidHVydGxlX2RvY3N0cmluZ2RpY3RfJShsYW5ndWFnZSlzIiAlIHsnbGFuZ3VhZ2UnOmxhbmcubG93ZXIoKX0KKyAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKG1vZG5hbWUpCisgICAgZG9jc2RpY3QgPSBtb2R1bGUuZG9jc2RpY3QKKyAgICBmb3Iga2V5IGluIGRvY3NkaWN0OgorICAgICAgICAjcHJpbnQga2V5CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV2YWwoa2V5KS5pbV9mdW5jLl9fZG9jX18gPSBkb2NzZGljdFtrZXldCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHByaW50ICJCYWQgZG9jc3RyaW5nLWVudHJ5OiAlcyIgJSBrZXkKKworX0xBTkdVQUdFID0gX0NGR1sibGFuZ3VhZ2UiXQorCit0cnk6CisgICAgaWYgX0xBTkdVQUdFICE9ICJlbmdsaXNoIjoKKyAgICAgICAgcmVhZF9kb2NzdHJpbmdzKF9MQU5HVUFHRSkKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwcmludCAiQ2Fubm90IGZpbmQgZG9jc2RpY3QgZm9yIiwgX0xBTkdVQUdFCitleGNlcHQ6CisgICAgcHJpbnQgKCJVbmtub3duIEVycm9yIHdoZW4gdHJ5aW5nIHRvIGltcG9ydCAlcy1kb2NzdHJpbmctZGljdGlvbmFyeSIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0xBTkdVQUdFKQorCisKK2RlZiBnZXRtZXRocGFybGlzdChvYik6CisgICAgIkdldCBzdHJpbmdzIGRlc2NyaWJpbmcgdGhlIGFyZ3VtZW50cyBmb3IgdGhlIGdpdmVuIG9iamVjdCIKKyAgICBhcmdUZXh0MSA9IGFyZ1RleHQyID0gIiIKKyAgICAjIGJpdCBvZiBhIGhhY2sgZm9yIG1ldGhvZHMgLSB0dXJuIGl0IGludG8gYSBmdW5jdGlvbgorICAgICMgYnV0IHdlIGRyb3AgdGhlICJzZWxmIiBwYXJhbS4KKyAgICBpZiB0eXBlKG9iKT09dHlwZXMuTWV0aG9kVHlwZToKKyAgICAgICAgZm9iID0gb2IuaW1fZnVuYworICAgICAgICBhcmdPZmZzZXQgPSAxCisgICAgZWxzZToKKyAgICAgICAgZm9iID0gb2IKKyAgICAgICAgYXJnT2Zmc2V0ID0gMAorICAgICMgVHJ5IGFuZCBidWlsZCBvbmUgZm9yIFB5dGhvbiBkZWZpbmVkIGZ1bmN0aW9ucworICAgIGlmIHR5cGUoZm9iKSBpbiBbdHlwZXMuRnVuY3Rpb25UeXBlLCB0eXBlcy5MYW1iZGFUeXBlXToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY291bnRlciA9IGZvYi5mdW5jX2NvZGUuY29fYXJnY291bnQKKyAgICAgICAgICAgIGl0ZW1zMiA9IGxpc3QoZm9iLmZ1bmNfY29kZS5jb192YXJuYW1lc1thcmdPZmZzZXQ6Y291bnRlcl0pCisgICAgICAgICAgICByZWFsQXJncyA9IGZvYi5mdW5jX2NvZGUuY29fdmFybmFtZXNbYXJnT2Zmc2V0OmNvdW50ZXJdCisgICAgICAgICAgICBkZWZhdWx0cyA9IGZvYi5mdW5jX2RlZmF1bHRzIG9yIFtdCisgICAgICAgICAgICBkZWZhdWx0cyA9IGxpc3QobWFwKGxhbWJkYSBuYW1lOiAiPSVzIiAlIHJlcHIobmFtZSksIGRlZmF1bHRzKSkKKyAgICAgICAgICAgIGRlZmF1bHRzID0gWyIiXSAqIChsZW4ocmVhbEFyZ3MpLWxlbihkZWZhdWx0cykpICsgZGVmYXVsdHMKKyAgICAgICAgICAgIGl0ZW1zMSA9IG1hcChsYW1iZGEgYXJnLCBkZmx0OiBhcmcrZGZsdCwgcmVhbEFyZ3MsIGRlZmF1bHRzKQorICAgICAgICAgICAgaWYgZm9iLmZ1bmNfY29kZS5jb19mbGFncyAmIDB4NDoKKyAgICAgICAgICAgICAgICBpdGVtczEuYXBwZW5kKCIqIitmb2IuZnVuY19jb2RlLmNvX3Zhcm5hbWVzW2NvdW50ZXJdKQorICAgICAgICAgICAgICAgIGl0ZW1zMi5hcHBlbmQoIioiK2ZvYi5mdW5jX2NvZGUuY29fdmFybmFtZXNbY291bnRlcl0pCisgICAgICAgICAgICAgICAgY291bnRlciArPSAxCisgICAgICAgICAgICBpZiBmb2IuZnVuY19jb2RlLmNvX2ZsYWdzICYgMHg4OgorICAgICAgICAgICAgICAgIGl0ZW1zMS5hcHBlbmQoIioqIitmb2IuZnVuY19jb2RlLmNvX3Zhcm5hbWVzW2NvdW50ZXJdKQorICAgICAgICAgICAgICAgIGl0ZW1zMi5hcHBlbmQoIioqIitmb2IuZnVuY19jb2RlLmNvX3Zhcm5hbWVzW2NvdW50ZXJdKQorICAgICAgICAgICAgYXJnVGV4dDEgPSAiLCAiLmpvaW4oaXRlbXMxKQorICAgICAgICAgICAgYXJnVGV4dDEgPSAiKCVzKSIgJSBhcmdUZXh0MQorICAgICAgICAgICAgYXJnVGV4dDIgPSAiLCAiLmpvaW4oaXRlbXMyKQorICAgICAgICAgICAgYXJnVGV4dDIgPSAiKCVzKSIgJSBhcmdUZXh0MgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgcmV0dXJuIGFyZ1RleHQxLCBhcmdUZXh0MgorCitkZWYgX3R1cnRsZV9kb2NyZXZpc2UoZG9jc3RyKToKKyAgICAiIiJUbyByZWR1Y2UgZG9jc3RyaW5ncyBmcm9tIFJhd1R1cnRsZSBjbGFzcyBmb3IgZnVuY3Rpb25zCisgICAgIiIiCisgICAgaW1wb3J0IHJlCisgICAgaWYgZG9jc3RyIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBOb25lCisgICAgdHVydGxlbmFtZSA9IF9DRkdbImV4YW1wbGV0dXJ0bGUiXQorICAgIG5ld2RvY3N0ciA9IGRvY3N0ci5yZXBsYWNlKCIlcy4iICUgdHVydGxlbmFtZSwiIikKKyAgICBwYXJleHAgPSByZS5jb21waWxlKHInIFwoLisgJXNcKTonICUgdHVydGxlbmFtZSkKKyAgICBuZXdkb2NzdHIgPSBwYXJleHAuc3ViKCI6IiwgbmV3ZG9jc3RyKQorICAgIHJldHVybiBuZXdkb2NzdHIKKworZGVmIF9zY3JlZW5fZG9jcmV2aXNlKGRvY3N0cik6CisgICAgIiIiVG8gcmVkdWNlIGRvY3N0cmluZ3MgZnJvbSBUdXJ0bGVTY3JlZW4gY2xhc3MgZm9yIGZ1bmN0aW9ucworICAgICIiIgorICAgIGltcG9ydCByZQorICAgIGlmIGRvY3N0ciBpcyBOb25lOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHNjcmVlbm5hbWUgPSBfQ0ZHWyJleGFtcGxlc2NyZWVuIl0KKyAgICBuZXdkb2NzdHIgPSBkb2NzdHIucmVwbGFjZSgiJXMuIiAlIHNjcmVlbm5hbWUsIiIpCisgICAgcGFyZXhwID0gcmUuY29tcGlsZShyJyBcKC4rICVzXCk6JyAlIHNjcmVlbm5hbWUpCisgICAgbmV3ZG9jc3RyID0gcGFyZXhwLnN1YigiOiIsIG5ld2RvY3N0cikKKyAgICByZXR1cm4gbmV3ZG9jc3RyCisKKyMjIFRoZSBmb2xsb3dpbmcgbWVjaGFuaXNtIG1ha2VzIGFsbCBtZXRob2RzIG9mIFJhd1R1cnRsZSBhbmQgVHVydGxlIGF2YWlsYWJsZQorIyMgYXMgZnVuY3Rpb25zLiBTbyB3ZSBjYW4gZW5oYW5jZSwgY2hhbmdlLCBhZGQsIGRlbGV0ZSBtZXRob2RzIHRvIHRoZXNlCisjIyBjbGFzc2VzIGFuZCBkbyBub3QgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgaGVyZS4KKworCitmb3IgbWV0aG9kbmFtZSBpbiBfdGdfc2NyZWVuX2Z1bmN0aW9uczoKKyAgICBwbDEsIHBsMiA9IGdldG1ldGhwYXJsaXN0KGV2YWwoJ19TY3JlZW4uJyArIG1ldGhvZG5hbWUpKQorICAgIGlmIHBsMSA9PSAiIjoKKyAgICAgICAgcHJpbnQgIj4+Pj4+PiIsIHBsMSwgcGwyCisgICAgICAgIGNvbnRpbnVlCisgICAgZGVmc3RyID0gKCJkZWYgJShrZXkpcyUocGwxKXM6IHJldHVybiBfZ2V0c2NyZWVuKCkuJShrZXkpcyUocGwyKXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydrZXknOm1ldGhvZG5hbWUsICdwbDEnOnBsMSwgJ3BsMic6cGwyfSkKKyAgICBleGVjIGRlZnN0cgorICAgIGV2YWwobWV0aG9kbmFtZSkuX19kb2NfXyA9IF9zY3JlZW5fZG9jcmV2aXNlKGV2YWwoJ19TY3JlZW4uJyttZXRob2RuYW1lKS5fX2RvY19fKQorCitmb3IgbWV0aG9kbmFtZSBpbiBfdGdfdHVydGxlX2Z1bmN0aW9uczoKKyAgICBwbDEsIHBsMiA9IGdldG1ldGhwYXJsaXN0KGV2YWwoJ1R1cnRsZS4nICsgbWV0aG9kbmFtZSkpCisgICAgaWYgcGwxID09ICIiOgorICAgICAgICBwcmludCAiPj4+Pj4+IiwgcGwxLCBwbDIKKyAgICAgICAgY29udGludWUKKyAgICBkZWZzdHIgPSAoImRlZiAlKGtleSlzJShwbDEpczogcmV0dXJuIF9nZXRwZW4oKS4lKGtleSlzJShwbDIpcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2tleSc6bWV0aG9kbmFtZSwgJ3BsMSc6cGwxLCAncGwyJzpwbDJ9KQorICAgIGV4ZWMgZGVmc3RyCisgICAgZXZhbChtZXRob2RuYW1lKS5fX2RvY19fID0gX3R1cnRsZV9kb2NyZXZpc2UoZXZhbCgnVHVydGxlLicrbWV0aG9kbmFtZSkuX19kb2NfXykKKworCitkb25lID0gbWFpbmxvb3AgPSBUSy5tYWlubG9vcAorZGVsIHBsMSwgcGwyLCBkZWZzdHIKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBkZWYgc3dpdGNocGVuKCk6CisgICAgICAgIGlmIGlzZG93bigpOgorICAgICAgICAgICAgcHUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGQoKQorCisgICAgZGVmIGRlbW8xKCk6CisgICAgICAgICIiIkRlbW8gb2Ygb2xkIHR1cnRsZS5weSAtIG1vZHVsZSIiIgorICAgICAgICByZXNldCgpCisgICAgICAgIHRyYWNlcihUcnVlKQorICAgICAgICB1cCgpCisgICAgICAgIGJhY2t3YXJkKDEwMCkKKyAgICAgICAgZG93bigpCisgICAgICAgICMgZHJhdyAzIHNxdWFyZXM7IHRoZSBsYXN0IGZpbGxlZAorICAgICAgICB3aWR0aCgzKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIGlmIGkgPT0gMjoKKyAgICAgICAgICAgICAgICBmaWxsKDEpCisgICAgICAgICAgICBmb3IgXyBpbiByYW5nZSg0KToKKyAgICAgICAgICAgICAgICBmb3J3YXJkKDIwKQorICAgICAgICAgICAgICAgIGxlZnQoOTApCisgICAgICAgICAgICBpZiBpID09IDI6CisgICAgICAgICAgICAgICAgY29sb3IoIm1hcm9vbiIpCisgICAgICAgICAgICAgICAgZmlsbCgwKQorICAgICAgICAgICAgdXAoKQorICAgICAgICAgICAgZm9yd2FyZCgzMCkKKyAgICAgICAgICAgIGRvd24oKQorICAgICAgICB3aWR0aCgxKQorICAgICAgICBjb2xvcigiYmxhY2siKQorICAgICAgICAjIG1vdmUgb3V0IG9mIHRoZSB3YXkKKyAgICAgICAgdHJhY2VyKEZhbHNlKQorICAgICAgICB1cCgpCisgICAgICAgIHJpZ2h0KDkwKQorICAgICAgICBmb3J3YXJkKDEwMCkKKyAgICAgICAgcmlnaHQoOTApCisgICAgICAgIGZvcndhcmQoMTAwKQorICAgICAgICByaWdodCgxODApCisgICAgICAgIGRvd24oKQorICAgICAgICAjIHNvbWUgdGV4dAorICAgICAgICB3cml0ZSgic3RhcnRzdGFydCIsIDEpCisgICAgICAgIHdyaXRlKCJzdGFydCIsIDEpCisgICAgICAgIGNvbG9yKCJyZWQiKQorICAgICAgICAjIHN0YWlyY2FzZQorICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgIGZvcndhcmQoMjApCisgICAgICAgICAgICBsZWZ0KDkwKQorICAgICAgICAgICAgZm9yd2FyZCgyMCkKKyAgICAgICAgICAgIHJpZ2h0KDkwKQorICAgICAgICAjIGZpbGxlZCBzdGFpcmNhc2UKKyAgICAgICAgdHJhY2VyKFRydWUpCisgICAgICAgIGZpbGwoMSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICBmb3J3YXJkKDIwKQorICAgICAgICAgICAgbGVmdCg5MCkKKyAgICAgICAgICAgIGZvcndhcmQoMjApCisgICAgICAgICAgICByaWdodCg5MCkKKyAgICAgICAgZmlsbCgwKQorICAgICAgICAjIG1vcmUgdGV4dAorCisgICAgZGVmIGRlbW8yKCk6CisgICAgICAgICIiIkRlbW8gb2Ygc29tZSBuZXcgZmVhdHVyZXMuIiIiCisgICAgICAgIHNwZWVkKDEpCisgICAgICAgIHN0KCkKKyAgICAgICAgcGVuc2l6ZSgzKQorICAgICAgICBzZXRoZWFkaW5nKHRvd2FyZHMoMCwgMCkpCisgICAgICAgIHJhZGl1cyA9IGRpc3RhbmNlKDAsIDApLzIuMAorICAgICAgICBydCg5MCkKKyAgICAgICAgZm9yIF8gaW4gcmFuZ2UoMTgpOgorICAgICAgICAgICAgc3dpdGNocGVuKCkKKyAgICAgICAgICAgIGNpcmNsZShyYWRpdXMsIDEwKQorICAgICAgICB3cml0ZSgid2FpdCBhIG1vbWVudC4uLiIpCisgICAgICAgIHdoaWxlIHVuZG9idWZmZXJlbnRyaWVzKCk6CisgICAgICAgICAgICB1bmRvKCkKKyAgICAgICAgcmVzZXQoKQorICAgICAgICBsdCg5MCkKKyAgICAgICAgY29sb3Jtb2RlKDI1NSkKKyAgICAgICAgbGFlbmdlID0gMTAKKyAgICAgICAgcGVuY29sb3IoImdyZWVuIikKKyAgICAgICAgcGVuc2l6ZSgzKQorICAgICAgICBsdCgxODApCisgICAgICAgIGZvciBpIGluIHJhbmdlKC0yLCAxNik6CisgICAgICAgICAgICBpZiBpID4gMDoKKyAgICAgICAgICAgICAgICBiZWdpbl9maWxsKCkKKyAgICAgICAgICAgICAgICBmaWxsY29sb3IoMjU1LTE1KmksIDAsIDE1KmkpCisgICAgICAgICAgICBmb3IgXyBpbiByYW5nZSgzKToKKyAgICAgICAgICAgICAgICBmZChsYWVuZ2UpCisgICAgICAgICAgICAgICAgbHQoMTIwKQorICAgICAgICAgICAgbGFlbmdlICs9IDEwCisgICAgICAgICAgICBsdCgxNSkKKyAgICAgICAgICAgIHNwZWVkKChzcGVlZCgpKzEpJTEyKQorICAgICAgICBlbmRfZmlsbCgpCisKKyAgICAgICAgbHQoMTIwKQorICAgICAgICBwdSgpCisgICAgICAgIGZkKDcwKQorICAgICAgICBydCgzMCkKKyAgICAgICAgcGQoKQorICAgICAgICBjb2xvcigicmVkIiwieWVsbG93IikKKyAgICAgICAgc3BlZWQoMCkKKyAgICAgICAgZmlsbCgxKQorICAgICAgICBmb3IgXyBpbiByYW5nZSg0KToKKyAgICAgICAgICAgIGNpcmNsZSg1MCwgOTApCisgICAgICAgICAgICBydCg5MCkKKyAgICAgICAgICAgIGZkKDMwKQorICAgICAgICAgICAgcnQoOTApCisgICAgICAgIGZpbGwoMCkKKyAgICAgICAgbHQoOTApCisgICAgICAgIHB1KCkKKyAgICAgICAgZmQoMzApCisgICAgICAgIHBkKCkKKyAgICAgICAgc2hhcGUoInR1cnRsZSIpCisKKyAgICAgICAgdHJpID0gZ2V0dHVydGxlKCkKKyAgICAgICAgdHJpLnJlc2l6ZW1vZGUoImF1dG8iKQorICAgICAgICB0dXJ0bGUgPSBUdXJ0bGUoKQorICAgICAgICB0dXJ0bGUucmVzaXplbW9kZSgiYXV0byIpCisgICAgICAgIHR1cnRsZS5zaGFwZSgidHVydGxlIikKKyAgICAgICAgdHVydGxlLnJlc2V0KCkKKyAgICAgICAgdHVydGxlLmxlZnQoOTApCisgICAgICAgIHR1cnRsZS5zcGVlZCgwKQorICAgICAgICB0dXJ0bGUudXAoKQorICAgICAgICB0dXJ0bGUuZ290bygyODAsIDQwKQorICAgICAgICB0dXJ0bGUubHQoMzApCisgICAgICAgIHR1cnRsZS5kb3duKCkKKyAgICAgICAgdHVydGxlLnNwZWVkKDYpCisgICAgICAgIHR1cnRsZS5jb2xvcigiYmx1ZSIsIm9yYW5nZSIpCisgICAgICAgIHR1cnRsZS5wZW5zaXplKDIpCisgICAgICAgIHRyaS5zcGVlZCg2KQorICAgICAgICBzZXRoZWFkaW5nKHRvd2FyZHModHVydGxlKSkKKyAgICAgICAgY291bnQgPSAxCisgICAgICAgIHdoaWxlIHRyaS5kaXN0YW5jZSh0dXJ0bGUpID4gNDoKKyAgICAgICAgICAgIHR1cnRsZS5mZCgzLjUpCisgICAgICAgICAgICB0dXJ0bGUubHQoMC42KQorICAgICAgICAgICAgdHJpLnNldGhlYWRpbmcodHJpLnRvd2FyZHModHVydGxlKSkKKyAgICAgICAgICAgIHRyaS5mZCg0KQorICAgICAgICAgICAgaWYgY291bnQgJSAyMCA9PSAwOgorICAgICAgICAgICAgICAgIHR1cnRsZS5zdGFtcCgpCisgICAgICAgICAgICAgICAgdHJpLnN0YW1wKCkKKyAgICAgICAgICAgICAgICBzd2l0Y2hwZW4oKQorICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICB0cmkud3JpdGUoIkNBVUdIVCEgIiwgZm9udD0oIkFyaWFsIiwgMTYsICJib2xkIiksIGFsaWduPSJyaWdodCIpCisgICAgICAgIHRyaS5wZW5jb2xvcigiYmxhY2siKQorICAgICAgICB0cmkucGVuY29sb3IoInJlZCIpCisKKyAgICAgICAgZGVmIGJhYmEoeGR1bW15LCB5ZHVtbXkpOgorICAgICAgICAgICAgY2xlYXJzY3JlZW4oKQorICAgICAgICAgICAgYnllKCkKKworICAgICAgICB0aW1lLnNsZWVwKDIpCisKKyAgICAgICAgd2hpbGUgdW5kb2J1ZmZlcmVudHJpZXMoKToKKyAgICAgICAgICAgIHRyaS51bmRvKCkKKyAgICAgICAgICAgIHR1cnRsZS51bmRvKCkKKyAgICAgICAgdHJpLmZkKDUwKQorICAgICAgICB0cmkud3JpdGUoIiAgQ2xpY2sgbWUhIiwgZm9udCA9ICgiQ291cmllciIsIDEyLCAiYm9sZCIpICkKKyAgICAgICAgdHJpLm9uY2xpY2soYmFiYSwgMSkKKworICAgIGRlbW8xKCkKKyAgICBkZW1vMigpCisgICAgZXhpdG9uY2xpY2soKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdHVydGxlLnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL3R1cnRsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwMTFjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3R1cnRsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdHVydGxlLnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL3R1cnRsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwMTFjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3R1cnRsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL0dyYW1tYXIudHh0IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL0dyYW1tYXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMWYyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvR3JhbW1hci50eHQKQEAgLTAsMCArMSwxNTggQEAKKyMgR3JhbW1hciBmb3IgMnRvMy4gVGhpcyBncmFtbWFyIHN1cHBvcnRzIFB5dGhvbiAyLnggYW5kIDMueC4KKworIyBOb3RlOiAgQ2hhbmdpbmcgdGhlIGdyYW1tYXIgc3BlY2lmaWVkIGluIHRoaXMgZmlsZSB3aWxsIG1vc3QgbGlrZWx5CisjICAgICAgICByZXF1aXJlIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyBpbiB0aGUgcGFyc2VyIG1vZHVsZQorIyAgICAgICAgKC4uL01vZHVsZXMvcGFyc2VybW9kdWxlLmMpLiAgSWYgeW91IGNhbid0IG1ha2UgdGhlIGNoYW5nZXMgdG8KKyMgICAgICAgIHRoYXQgbW9kdWxlIHlvdXJzZWxmLCBwbGVhc2UgY28tb3JkaW5hdGUgdGhlIHJlcXVpcmVkIGNoYW5nZXMKKyMgICAgICAgIHdpdGggc29tZW9uZSB3aG8gY2FuOyBhc2sgYXJvdW5kIG9uIHB5dGhvbi1kZXYgZm9yIGhlbHAuICBGcmVkCisjICAgICAgICBEcmFrZSA8ZmRyYWtlQGFjbS5vcmc+IHdpbGwgcHJvYmFibHkgYmUgbGlzdGVuaW5nIHRoZXJlLgorCisjIE5PVEUgV0VMTDogWW91IHNob3VsZCBhbHNvIGZvbGxvdyBhbGwgdGhlIHN0ZXBzIGxpc3RlZCBpbiBQRVAgMzA2LAorIyAiSG93IHRvIENoYW5nZSBQeXRob24ncyBHcmFtbWFyIgorCisjIENvbW1hbmRzIGZvciBLZWVzIEJsb20ncyByYWlscm9hZCBwcm9ncmFtCisjZGlhZ3JhbTp0b2tlbiBOQU1FCisjZGlhZ3JhbTp0b2tlbiBOVU1CRVIKKyNkaWFncmFtOnRva2VuIFNUUklORworI2RpYWdyYW06dG9rZW4gTkVXTElORQorI2RpYWdyYW06dG9rZW4gRU5ETUFSS0VSCisjZGlhZ3JhbTp0b2tlbiBJTkRFTlQKKyNkaWFncmFtOm91dHB1dFxpbnB1dCBweXRob24uYmxhCisjZGlhZ3JhbTp0b2tlbiBERURFTlQKKyNkaWFncmFtOm91dHB1dFx0ZXh0d2lkdGggMjAuMDRjbVxvZGRzaWRlbWFyZ2luICAwLjBjbVxldmVuc2lkZW1hcmdpbiAwLjBjbQorI2RpYWdyYW06cnVsZXMKKworIyBTdGFydCBzeW1ib2xzIGZvciB0aGUgZ3JhbW1hcjoKKyMJZmlsZV9pbnB1dCBpcyBhIG1vZHVsZSBvciBzZXF1ZW5jZSBvZiBjb21tYW5kcyByZWFkIGZyb20gYW4gaW5wdXQgZmlsZTsKKyMJc2luZ2xlX2lucHV0IGlzIGEgc2luZ2xlIGludGVyYWN0aXZlIHN0YXRlbWVudDsKKyMJZXZhbF9pbnB1dCBpcyB0aGUgaW5wdXQgZm9yIHRoZSBldmFsKCkgYW5kIGlucHV0KCkgZnVuY3Rpb25zLgorIyBOQjogY29tcG91bmRfc3RtdCBpbiBzaW5nbGVfaW5wdXQgaXMgZm9sbG93ZWQgYnkgZXh0cmEgTkVXTElORSEKK2ZpbGVfaW5wdXQ6IChORVdMSU5FIHwgc3RtdCkqIEVORE1BUktFUgorc2luZ2xlX2lucHV0OiBORVdMSU5FIHwgc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10IE5FV0xJTkUKK2V2YWxfaW5wdXQ6IHRlc3RsaXN0IE5FV0xJTkUqIEVORE1BUktFUgorCitkZWNvcmF0b3I6ICdAJyBkb3R0ZWRfbmFtZSBbICcoJyBbYXJnbGlzdF0gJyknIF0gTkVXTElORQorZGVjb3JhdG9yczogZGVjb3JhdG9yKworZGVjb3JhdGVkOiBkZWNvcmF0b3JzIChjbGFzc2RlZiB8IGZ1bmNkZWYpCitmdW5jZGVmOiAnZGVmJyBOQU1FIHBhcmFtZXRlcnMgWyctPicgdGVzdF0gJzonIHN1aXRlCitwYXJhbWV0ZXJzOiAnKCcgW3R5cGVkYXJnc2xpc3RdICcpJwordHlwZWRhcmdzbGlzdDogKCh0ZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKgorICAgICAgICAgICAgICAgICgnKicgW3RuYW1lXSAoJywnIHRuYW1lIFsnPScgdGVzdF0pKiBbJywnICcqKicgdG5hbWVdIHwgJyoqJyB0bmFtZSkKKyAgICAgICAgICAgICAgICB8IHRmcGRlZiBbJz0nIHRlc3RdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnXSkKK3RuYW1lOiBOQU1FIFsnOicgdGVzdF0KK3RmcGRlZjogdG5hbWUgfCAnKCcgdGZwbGlzdCAnKScKK3RmcGxpc3Q6IHRmcGRlZiAoJywnIHRmcGRlZikqIFsnLCddCit2YXJhcmdzbGlzdDogKCh2ZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKgorICAgICAgICAgICAgICAoJyonIFt2bmFtZV0gKCcsJyB2bmFtZSBbJz0nIHRlc3RdKSogIFsnLCcgJyoqJyB2bmFtZV0gfCAnKionIHZuYW1lKQorICAgICAgICAgICAgICB8IHZmcGRlZiBbJz0nIHRlc3RdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnXSkKK3ZuYW1lOiBOQU1FCit2ZnBkZWY6IHZuYW1lIHwgJygnIHZmcGxpc3QgJyknCit2ZnBsaXN0OiB2ZnBkZWYgKCcsJyB2ZnBkZWYpKiBbJywnXQorCitzdG10OiBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQKK3NpbXBsZV9zdG10OiBzbWFsbF9zdG10ICgnOycgc21hbGxfc3RtdCkqIFsnOyddIE5FV0xJTkUKK3NtYWxsX3N0bXQ6IChleHByX3N0bXQgfCBwcmludF9zdG10ICB8IGRlbF9zdG10IHwgcGFzc19zdG10IHwgZmxvd19zdG10IHwKKyAgICAgICAgICAgICBpbXBvcnRfc3RtdCB8IGdsb2JhbF9zdG10IHwgZXhlY19zdG10IHwgYXNzZXJ0X3N0bXQpCitleHByX3N0bXQ6IHRlc3RsaXN0X3N0YXJfZXhwciAoYXVnYXNzaWduICh5aWVsZF9leHByfHRlc3RsaXN0KSB8CisgICAgICAgICAgICAgICAgICAgICAoJz0nICh5aWVsZF9leHByfHRlc3RsaXN0X3N0YXJfZXhwcikpKikKK3Rlc3RsaXN0X3N0YXJfZXhwcjogKHRlc3R8c3Rhcl9leHByKSAoJywnICh0ZXN0fHN0YXJfZXhwcikpKiBbJywnXQorYXVnYXNzaWduOiAoJys9JyB8ICctPScgfCAnKj0nIHwgJy89JyB8ICclPScgfCAnJj0nIHwgJ3w9JyB8ICdePScgfAorICAgICAgICAgICAgJzw8PScgfCAnPj49JyB8ICcqKj0nIHwgJy8vPScpCisjIEZvciBub3JtYWwgYXNzaWdubWVudHMsIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb25zIGVuZm9yY2VkIGJ5IHRoZSBpbnRlcnByZXRlcgorcHJpbnRfc3RtdDogJ3ByaW50JyAoIFsgdGVzdCAoJywnIHRlc3QpKiBbJywnXSBdIHwKKyAgICAgICAgICAgICAgICAgICAgICAnPj4nIHRlc3QgWyAoJywnIHRlc3QpKyBbJywnXSBdICkKK2RlbF9zdG10OiAnZGVsJyBleHBybGlzdAorcGFzc19zdG10OiAncGFzcycKK2Zsb3dfc3RtdDogYnJlYWtfc3RtdCB8IGNvbnRpbnVlX3N0bXQgfCByZXR1cm5fc3RtdCB8IHJhaXNlX3N0bXQgfCB5aWVsZF9zdG10CiticmVha19zdG10OiAnYnJlYWsnCitjb250aW51ZV9zdG10OiAnY29udGludWUnCityZXR1cm5fc3RtdDogJ3JldHVybicgW3Rlc3RsaXN0XQoreWllbGRfc3RtdDogeWllbGRfZXhwcgorcmFpc2Vfc3RtdDogJ3JhaXNlJyBbdGVzdCBbJ2Zyb20nIHRlc3QgfCAnLCcgdGVzdCBbJywnIHRlc3RdXV0KK2ltcG9ydF9zdG10OiBpbXBvcnRfbmFtZSB8IGltcG9ydF9mcm9tCitpbXBvcnRfbmFtZTogJ2ltcG9ydCcgZG90dGVkX2FzX25hbWVzCitpbXBvcnRfZnJvbTogKCdmcm9tJyAoJy4nKiBkb3R0ZWRfbmFtZSB8ICcuJyspCisgICAgICAgICAgICAgICdpbXBvcnQnICgnKicgfCAnKCcgaW1wb3J0X2FzX25hbWVzICcpJyB8IGltcG9ydF9hc19uYW1lcykpCitpbXBvcnRfYXNfbmFtZTogTkFNRSBbJ2FzJyBOQU1FXQorZG90dGVkX2FzX25hbWU6IGRvdHRlZF9uYW1lIFsnYXMnIE5BTUVdCitpbXBvcnRfYXNfbmFtZXM6IGltcG9ydF9hc19uYW1lICgnLCcgaW1wb3J0X2FzX25hbWUpKiBbJywnXQorZG90dGVkX2FzX25hbWVzOiBkb3R0ZWRfYXNfbmFtZSAoJywnIGRvdHRlZF9hc19uYW1lKSoKK2RvdHRlZF9uYW1lOiBOQU1FICgnLicgTkFNRSkqCitnbG9iYWxfc3RtdDogKCdnbG9iYWwnIHwgJ25vbmxvY2FsJykgTkFNRSAoJywnIE5BTUUpKgorZXhlY19zdG10OiAnZXhlYycgZXhwciBbJ2luJyB0ZXN0IFsnLCcgdGVzdF1dCithc3NlcnRfc3RtdDogJ2Fzc2VydCcgdGVzdCBbJywnIHRlc3RdCisKK2NvbXBvdW5kX3N0bXQ6IGlmX3N0bXQgfCB3aGlsZV9zdG10IHwgZm9yX3N0bXQgfCB0cnlfc3RtdCB8IHdpdGhfc3RtdCB8IGZ1bmNkZWYgfCBjbGFzc2RlZiB8IGRlY29yYXRlZAoraWZfc3RtdDogJ2lmJyB0ZXN0ICc6JyBzdWl0ZSAoJ2VsaWYnIHRlc3QgJzonIHN1aXRlKSogWydlbHNlJyAnOicgc3VpdGVdCit3aGlsZV9zdG10OiAnd2hpbGUnIHRlc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXQorZm9yX3N0bXQ6ICdmb3InIGV4cHJsaXN0ICdpbicgdGVzdGxpc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXQordHJ5X3N0bXQ6ICgndHJ5JyAnOicgc3VpdGUKKyAgICAgICAgICAgKChleGNlcHRfY2xhdXNlICc6JyBzdWl0ZSkrCisJICAgIFsnZWxzZScgJzonIHN1aXRlXQorCSAgICBbJ2ZpbmFsbHknICc6JyBzdWl0ZV0gfAorCSAgICdmaW5hbGx5JyAnOicgc3VpdGUpKQord2l0aF9zdG10OiAnd2l0aCcgd2l0aF9pdGVtICgnLCcgd2l0aF9pdGVtKSogICc6JyBzdWl0ZQord2l0aF9pdGVtOiB0ZXN0IFsnYXMnIGV4cHJdCit3aXRoX3ZhcjogJ2FzJyBleHByCisjIE5CIGNvbXBpbGUuYyBtYWtlcyBzdXJlIHRoYXQgdGhlIGRlZmF1bHQgZXhjZXB0IGNsYXVzZSBpcyBsYXN0CitleGNlcHRfY2xhdXNlOiAnZXhjZXB0JyBbdGVzdCBbKCcsJyB8ICdhcycpIHRlc3RdXQorc3VpdGU6IHNpbXBsZV9zdG10IHwgTkVXTElORSBJTkRFTlQgc3RtdCsgREVERU5UCisKKyMgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBjcnVmdCB0byBzdXBwb3J0OgorIyBbIHggZm9yIHggaW4gbGFtYmRhOiBUcnVlLCBsYW1iZGE6IEZhbHNlIGlmIHgoKSBdCisjIGV2ZW4gd2hpbGUgYWxzbyBhbGxvd2luZzoKKyMgbGFtYmRhIHg6IDUgaWYgeCBlbHNlIDIKKyMgKEJ1dCBub3QgYSBtaXggb2YgdGhlIHR3bykKK3Rlc3RsaXN0X3NhZmU6IG9sZF90ZXN0IFsoJywnIG9sZF90ZXN0KSsgWycsJ11dCitvbGRfdGVzdDogb3JfdGVzdCB8IG9sZF9sYW1iZGVmCitvbGRfbGFtYmRlZjogJ2xhbWJkYScgW3ZhcmFyZ3NsaXN0XSAnOicgb2xkX3Rlc3QKKwordGVzdDogb3JfdGVzdCBbJ2lmJyBvcl90ZXN0ICdlbHNlJyB0ZXN0XSB8IGxhbWJkZWYKK29yX3Rlc3Q6IGFuZF90ZXN0ICgnb3InIGFuZF90ZXN0KSoKK2FuZF90ZXN0OiBub3RfdGVzdCAoJ2FuZCcgbm90X3Rlc3QpKgorbm90X3Rlc3Q6ICdub3QnIG5vdF90ZXN0IHwgY29tcGFyaXNvbgorY29tcGFyaXNvbjogZXhwciAoY29tcF9vcCBleHByKSoKK2NvbXBfb3A6ICc8J3wnPid8Jz09J3wnPj0nfCc8PSd8Jzw+J3wnIT0nfCdpbid8J25vdCcgJ2luJ3wnaXMnfCdpcycgJ25vdCcKK3N0YXJfZXhwcjogJyonIGV4cHIKK2V4cHI6IHhvcl9leHByICgnfCcgeG9yX2V4cHIpKgoreG9yX2V4cHI6IGFuZF9leHByICgnXicgYW5kX2V4cHIpKgorYW5kX2V4cHI6IHNoaWZ0X2V4cHIgKCcmJyBzaGlmdF9leHByKSoKK3NoaWZ0X2V4cHI6IGFyaXRoX2V4cHIgKCgnPDwnfCc+PicpIGFyaXRoX2V4cHIpKgorYXJpdGhfZXhwcjogdGVybSAoKCcrJ3wnLScpIHRlcm0pKgordGVybTogZmFjdG9yICgoJyonfCcvJ3wnJSd8Jy8vJykgZmFjdG9yKSoKK2ZhY3RvcjogKCcrJ3wnLSd8J34nKSBmYWN0b3IgfCBwb3dlcgorcG93ZXI6IGF0b20gdHJhaWxlciogWycqKicgZmFjdG9yXQorYXRvbTogKCcoJyBbeWllbGRfZXhwcnx0ZXN0bGlzdF9nZXhwXSAnKScgfAorICAgICAgICdbJyBbbGlzdG1ha2VyXSAnXScgfAorICAgICAgICd7JyBbZGljdHNldG1ha2VyXSAnfScgfAorICAgICAgICdgJyB0ZXN0bGlzdDEgJ2AnIHwKKyAgICAgICBOQU1FIHwgTlVNQkVSIHwgU1RSSU5HKyB8ICcuJyAnLicgJy4nKQorbGlzdG1ha2VyOiAodGVzdHxzdGFyX2V4cHIpICggY29tcF9mb3IgfCAoJywnICh0ZXN0fHN0YXJfZXhwcikpKiBbJywnXSApCit0ZXN0bGlzdF9nZXhwOiAodGVzdHxzdGFyX2V4cHIpICggY29tcF9mb3IgfCAoJywnICh0ZXN0fHN0YXJfZXhwcikpKiBbJywnXSApCitsYW1iZGVmOiAnbGFtYmRhJyBbdmFyYXJnc2xpc3RdICc6JyB0ZXN0Cit0cmFpbGVyOiAnKCcgW2FyZ2xpc3RdICcpJyB8ICdbJyBzdWJzY3JpcHRsaXN0ICddJyB8ICcuJyBOQU1FCitzdWJzY3JpcHRsaXN0OiBzdWJzY3JpcHQgKCcsJyBzdWJzY3JpcHQpKiBbJywnXQorc3Vic2NyaXB0OiB0ZXN0IHwgW3Rlc3RdICc6JyBbdGVzdF0gW3NsaWNlb3BdCitzbGljZW9wOiAnOicgW3Rlc3RdCitleHBybGlzdDogKGV4cHJ8c3Rhcl9leHByKSAoJywnIChleHByfHN0YXJfZXhwcikpKiBbJywnXQordGVzdGxpc3Q6IHRlc3QgKCcsJyB0ZXN0KSogWycsJ10KK2RpY3RzZXRtYWtlcjogKCAodGVzdCAnOicgdGVzdCAoY29tcF9mb3IgfCAoJywnIHRlc3QgJzonIHRlc3QpKiBbJywnXSkpIHwKKyAgICAgICAgICAgICAgICAodGVzdCAoY29tcF9mb3IgfCAoJywnIHRlc3QpKiBbJywnXSkpICkKKworY2xhc3NkZWY6ICdjbGFzcycgTkFNRSBbJygnIFthcmdsaXN0XSAnKSddICc6JyBzdWl0ZQorCithcmdsaXN0OiAoYXJndW1lbnQgJywnKSogKGFyZ3VtZW50IFsnLCddCisgICAgICAgICAgICAgICAgICAgICAgICAgfCcqJyB0ZXN0ICgnLCcgYXJndW1lbnQpKiBbJywnICcqKicgdGVzdF0gCisgICAgICAgICAgICAgICAgICAgICAgICAgfCcqKicgdGVzdCkKK2FyZ3VtZW50OiB0ZXN0IFtjb21wX2Zvcl0gfCB0ZXN0ICc9JyB0ZXN0ICAjIFJlYWxseSBba2V5d29yZCAnPSddIHRlc3QKKworY29tcF9pdGVyOiBjb21wX2ZvciB8IGNvbXBfaWYKK2NvbXBfZm9yOiAnZm9yJyBleHBybGlzdCAnaW4nIHRlc3RsaXN0X3NhZmUgW2NvbXBfaXRlcl0KK2NvbXBfaWY6ICdpZicgb2xkX3Rlc3QgW2NvbXBfaXRlcl0KKwordGVzdGxpc3QxOiB0ZXN0ICgnLCcgdGVzdCkqCisKKyMgbm90IHVzZWQgaW4gZ3JhbW1hciwgYnV0IG1heSBhcHBlYXIgaW4gIm5vZGUiIHBhc3NlZCBmcm9tIFBhcnNlciB0byBDb21waWxlcgorZW5jb2RpbmdfZGVjbDogTkFNRQorCit5aWVsZF9leHByOiAneWllbGQnIFt0ZXN0bGlzdF0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9HcmFtbWFyMi43LjUuZmluYWwuMC5waWNrbGUgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvR3JhbW1hcjIuNy41LmZpbmFsLjAucGlja2xlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTE4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvR3JhbW1hcjIuNy41LmZpbmFsLjAucGlja2xlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9QYXR0ZXJuR3JhbW1hci50eHQgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvUGF0dGVybkdyYW1tYXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YmY4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvUGF0dGVybkdyYW1tYXIudHh0CkBAIC0wLDAgKzEsMjggQEAKKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIyBBIGdyYW1tYXIgdG8gZGVzY3JpYmUgdHJlZSBtYXRjaGluZyBwYXR0ZXJucy4KKyMgTm90IHNob3duIGhlcmU6CisjIC0gJ1RPS0VOJyBzdGFuZHMgZm9yIGFueSB0b2tlbiAobGVhZiBub2RlKQorIyAtICdhbnknIHN0YW5kcyBmb3IgYW55IG5vZGUgKGxlYWYgb3IgaW50ZXJpb3IpCisjIFdpdGggJ2FueScgd2UgY2FuIHN0aWxsIHNwZWNpZnkgdGhlIHN1Yi1zdHJ1Y3R1cmUuCisKKyMgVGhlIHN0YXJ0IHN5bWJvbCBpcyAnTWF0Y2hlcicuCisKK01hdGNoZXI6IEFsdGVybmF0aXZlcyBFTkRNQVJLRVIKKworQWx0ZXJuYXRpdmVzOiBBbHRlcm5hdGl2ZSAoJ3wnIEFsdGVybmF0aXZlKSoKKworQWx0ZXJuYXRpdmU6IChVbml0IHwgTmVnYXRlZFVuaXQpKworCitVbml0OiBbTkFNRSAnPSddICggU1RSSU5HIFtSZXBlYXRlcl0KKyAgICAgICAgICAgICAgICAgfCBOQU1FIFtEZXRhaWxzXSBbUmVwZWF0ZXJdCisgICAgICAgICAgICAgICAgIHwgJygnIEFsdGVybmF0aXZlcyAnKScgW1JlcGVhdGVyXQorICAgICAgICAgICAgICAgICB8ICdbJyBBbHRlcm5hdGl2ZXMgJ10nCisJCSApCisKK05lZ2F0ZWRVbml0OiAnbm90JyAoU1RSSU5HIHwgTkFNRSBbRGV0YWlsc10gfCAnKCcgQWx0ZXJuYXRpdmVzICcpJykKKworUmVwZWF0ZXI6ICcqJyB8ICcrJyB8ICd7JyBOVU1CRVIgWycsJyBOVU1CRVJdICd9JworCitEZXRhaWxzOiAnPCcgQWx0ZXJuYXRpdmVzICc+JwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL1BhdHRlcm5HcmFtbWFyMi43LjUuZmluYWwuMC5waWNrbGUgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvUGF0dGVybkdyYW1tYXIyLjcuNS5maW5hbC4wLnBpY2tsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNlNzAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL1BhdHRlcm5HcmFtbWFyMi43LjUuZmluYWwuMC5waWNrbGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMzA1NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19pbml0X18ucHkKQEAgLTAsMCArMSBAQAorI2VtcHR5CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2ZiZWJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2ZiZWJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19tYWluX18ucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19tYWluX18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2ODhiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9fX21haW5fXy5weQpAQCAtMCwwICsxLDQgQEAKK2ltcG9ydCBzeXMKK2Zyb20gLm1haW4gaW1wb3J0IG1haW4KKworc3lzLmV4aXQobWFpbigibGliMnRvMy5maXhlcyIpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL19fbWFpbl9fLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9fX21haW5fXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjOGQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9fX21haW5fXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL19fbWFpbl9fLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9fX21haW5fXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjOGQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9fX21haW5fXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2J0bV9tYXRjaGVyLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2J0bV9tYXRjaGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNmJhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX21hdGNoZXIucHkKQEAgLTAsMCArMSwxNjggQEAKKyIiIkEgYm90dG9tLXVwIHRyZWUgbWF0Y2hpbmcgYWxnb3JpdGhtIGltcGxlbWVudGF0aW9uIG1lYW50IHRvIHNwZWVkCit1cCAydG8zJ3MgbWF0Y2hpbmcgcHJvY2Vzcy4gQWZ0ZXIgdGhlIHRyZWUgcGF0dGVybnMgYXJlIHJlZHVjZWQgdG8KK3RoZWlyIHJhcmVzdCBsaW5lYXIgcGF0aCwgYSBsaW5lYXIgQWhvLUNvcmFzaWNrIGF1dG9tYXRvbiBpcworY3JlYXRlZC4gVGhlIGxpbmVhciBhdXRvbWF0b24gdHJhdmVyc2VzIHRoZSBsaW5lYXIgcGF0aHMgZnJvbSB0aGUKK2xlYXZlcyB0byB0aGUgcm9vdCBvZiB0aGUgQVNUIGFuZCByZXR1cm5zIGEgc2V0IG9mIG5vZGVzIGZvciBmdXJ0aGVyCittYXRjaGluZy4gVGhpcyByZWR1Y2VzIHNpZ25pZmljYW50bHkgdGhlIG51bWJlciBvZiBjYW5kaWRhdGUgbm9kZXMuIiIiCisKK19fYXV0aG9yX18gPSAiR2VvcmdlIEJvdXRzaW91a2lzIDxnYm91dHNpb3VraXNAZ21haWwuY29tPiIKKworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBpdGVydG9vbHMKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CisKK2Zyb20gLiBpbXBvcnQgcHl0cmVlCitmcm9tIC5idG1fdXRpbHMgaW1wb3J0IHJlZHVjZV90cmVlCisKK2NsYXNzIEJNTm9kZShvYmplY3QpOgorICAgICIiIkNsYXNzIGZvciBhIG5vZGUgb2YgdGhlIEFoby1Db3Jhc2ljayBhdXRvbWF0b24gdXNlZCBpbiBtYXRjaGluZyIiIgorICAgIGNvdW50ID0gaXRlcnRvb2xzLmNvdW50KCkKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudHJhbnNpdGlvbl90YWJsZSA9IHt9CisgICAgICAgIHNlbGYuZml4ZXJzID0gW10KKyAgICAgICAgc2VsZi5pZCA9IG5leHQoQk1Ob2RlLmNvdW50KQorICAgICAgICBzZWxmLmNvbnRlbnQgPSAnJworCitjbGFzcyBCb3R0b21NYXRjaGVyKG9iamVjdCk6CisgICAgIiIiVGhlIG1haW4gbWF0Y2hlciBjbGFzcy4gQWZ0ZXIgaW5zdGFudGlhdGluZyB0aGUgcGF0dGVybnMgc2hvdWxkCisgICAgYmUgYWRkZWQgdXNpbmcgdGhlIGFkZF9maXhlciBtZXRob2QiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5tYXRjaCA9IHNldCgpCisgICAgICAgIHNlbGYucm9vdCA9IEJNTm9kZSgpCisgICAgICAgIHNlbGYubm9kZXMgPSBbc2VsZi5yb290XQorICAgICAgICBzZWxmLmZpeGVycyA9IFtdCisgICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIlJlZmFjdG9yaW5nVG9vbCIpCisKKyAgICBkZWYgYWRkX2ZpeGVyKHNlbGYsIGZpeGVyKToKKyAgICAgICAgIiIiUmVkdWNlcyBhIGZpeGVyJ3MgcGF0dGVybiB0cmVlIHRvIGEgbGluZWFyIHBhdGggYW5kIGFkZHMgaXQKKyAgICAgICAgdG8gdGhlIG1hdGNoZXIoYSBjb21tb24gQWhvLUNvcmFzaWNrIGF1dG9tYXRvbikuIFRoZSBmaXhlciBpcworICAgICAgICBhcHBlbmRlZCBvbiB0aGUgbWF0Y2hpbmcgc3RhdGVzIGFuZCBjYWxsZWQgd2hlbiB0aGV5IGFyZQorICAgICAgICByZWFjaGVkIiIiCisgICAgICAgIHNlbGYuZml4ZXJzLmFwcGVuZChmaXhlcikKKyAgICAgICAgdHJlZSA9IHJlZHVjZV90cmVlKGZpeGVyLnBhdHRlcm5fdHJlZSkKKyAgICAgICAgbGluZWFyID0gdHJlZS5nZXRfbGluZWFyX3N1YnBhdHRlcm4oKQorICAgICAgICBtYXRjaF9ub2RlcyA9IHNlbGYuYWRkKGxpbmVhciwgc3RhcnQ9c2VsZi5yb290KQorICAgICAgICBmb3IgbWF0Y2hfbm9kZSBpbiBtYXRjaF9ub2RlczoKKyAgICAgICAgICAgIG1hdGNoX25vZGUuZml4ZXJzLmFwcGVuZChmaXhlcikKKworICAgIGRlZiBhZGQoc2VsZiwgcGF0dGVybiwgc3RhcnQpOgorICAgICAgICAiUmVjdXJzaXZlbHkgYWRkcyBhIGxpbmVhciBwYXR0ZXJuIHRvIHRoZSBBQyBhdXRvbWF0b24iCisgICAgICAgICNwcmludCgiYWRkaW5nIHBhdHRlcm4iLCBwYXR0ZXJuLCAidG8iLCBzdGFydCkKKyAgICAgICAgaWYgbm90IHBhdHRlcm46CisgICAgICAgICAgICAjcHJpbnQoImVtcHR5IHBhdHRlcm4iKQorICAgICAgICAgICAgcmV0dXJuIFtzdGFydF0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuWzBdLCB0dXBsZSk6CisgICAgICAgICAgICAjYWx0ZXJuYXRpdmVzCisgICAgICAgICAgICAjcHJpbnQoImFsdGVybmF0aXZlcyIpCisgICAgICAgICAgICBtYXRjaF9ub2RlcyA9IFtdCisgICAgICAgICAgICBmb3IgYWx0ZXJuYXRpdmUgaW4gcGF0dGVyblswXToKKyAgICAgICAgICAgICAgICAjYWRkIGFsbCBhbHRlcm5hdGl2ZXMsIGFuZCBhZGQgdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAjdG8gZWFjaCBlbmQgbm9kZQorICAgICAgICAgICAgICAgIGVuZF9ub2RlcyA9IHNlbGYuYWRkKGFsdGVybmF0aXZlLCBzdGFydD1zdGFydCkKKyAgICAgICAgICAgICAgICBmb3IgZW5kIGluIGVuZF9ub2RlczoKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hfbm9kZXMuZXh0ZW5kKHNlbGYuYWRkKHBhdHRlcm5bMTpdLCBlbmQpKQorICAgICAgICAgICAgcmV0dXJuIG1hdGNoX25vZGVzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjc2luZ2xlIHRva2VuCisgICAgICAgICAgICAjbm90IGxhc3QKKyAgICAgICAgICAgIGlmIHBhdHRlcm5bMF0gbm90IGluIHN0YXJ0LnRyYW5zaXRpb25fdGFibGU6CisgICAgICAgICAgICAgICAgI3RyYW5zaXRpb24gZGlkIG5vdCBleGlzdCwgY3JlYXRlIG5ldworICAgICAgICAgICAgICAgIG5leHRfbm9kZSA9IEJNTm9kZSgpCisgICAgICAgICAgICAgICAgc3RhcnQudHJhbnNpdGlvbl90YWJsZVtwYXR0ZXJuWzBdXSA9IG5leHRfbm9kZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjdHJhbnNpdGlvbiBleGlzdHMgYWxyZWFkeSwgZm9sbG93CisgICAgICAgICAgICAgICAgbmV4dF9ub2RlID0gc3RhcnQudHJhbnNpdGlvbl90YWJsZVtwYXR0ZXJuWzBdXQorCisgICAgICAgICAgICBpZiBwYXR0ZXJuWzE6XToKKyAgICAgICAgICAgICAgICBlbmRfbm9kZXMgPSBzZWxmLmFkZChwYXR0ZXJuWzE6XSwgc3RhcnQ9bmV4dF9ub2RlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbmRfbm9kZXMgPSBbbmV4dF9ub2RlXQorICAgICAgICAgICAgcmV0dXJuIGVuZF9ub2RlcworCisgICAgZGVmIHJ1bihzZWxmLCBsZWF2ZXMpOgorICAgICAgICAiIiJUaGUgbWFpbiBpbnRlcmZhY2Ugd2l0aCB0aGUgYm90dG9tIG1hdGNoZXIuIFRoZSB0cmVlIGlzCisgICAgICAgIHRyYXZlcnNlZCBmcm9tIHRoZSBib3R0b20gdXNpbmcgdGhlIGNvbnN0cnVjdGVkCisgICAgICAgIGF1dG9tYXRvbi4gTm9kZXMgYXJlIG9ubHkgY2hlY2tlZCBvbmNlIGFzIHRoZSB0cmVlIGlzCisgICAgICAgIHJldHJhdmVyc2VkLiBXaGVuIHRoZSBhdXRvbWF0b24gZmFpbHMsIHdlIGdpdmUgaXQgb25lIG1vcmUKKyAgICAgICAgc2hvdChpbiBjYXNlIHRoZSBhYm92ZSB0cmVlIG1hdGNoZXMgYXMgYSB3aG9sZSB3aXRoIHRoZQorICAgICAgICByZWplY3RlZCBsZWFmKSwgdGhlbiB3ZSBicmVhayBmb3IgdGhlIG5leHQgbGVhZi4gVGhlcmUgaXMgdGhlCisgICAgICAgIHNwZWNpYWwgY2FzZSBvZiBtdWx0aXBsZSBhcmd1bWVudHMoc2VlIGNvZGUgY29tbWVudHMpIHdoZXJlIHdlCisgICAgICAgIHJlY2hlY2sgdGhlIG5vZGVzCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgVGhlIGxlYXZlcyBvZiB0aGUgQVNUIHRyZWUgdG8gYmUgbWF0Y2hlZAorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgIEEgZGljdGlvbmFyeSBvZiBub2RlIG1hdGNoZXMgd2l0aCBmaXhlcnMgYXMgdGhlIGtleXMKKyAgICAgICAgIiIiCisgICAgICAgIGN1cnJlbnRfYWNfbm9kZSA9IHNlbGYucm9vdAorICAgICAgICByZXN1bHRzID0gZGVmYXVsdGRpY3QobGlzdCkKKyAgICAgICAgZm9yIGxlYWYgaW4gbGVhdmVzOgorICAgICAgICAgICAgY3VycmVudF9hc3Rfbm9kZSA9IGxlYWYKKyAgICAgICAgICAgIHdoaWxlIGN1cnJlbnRfYXN0X25vZGU6CisgICAgICAgICAgICAgICAgY3VycmVudF9hc3Rfbm9kZS53YXNfY2hlY2tlZCA9IFRydWUKKyAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gY3VycmVudF9hc3Rfbm9kZS5jaGlsZHJlbjoKKyAgICAgICAgICAgICAgICAgICAgIyBtdWx0aXBsZSBzdGF0ZW1lbnRzLCByZWNoZWNrCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2hpbGQsIHB5dHJlZS5MZWFmKSBhbmQgY2hpbGQudmFsdWUgPT0gdSI7IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYXN0X25vZGUud2FzX2NoZWNrZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBjdXJyZW50X2FzdF9ub2RlLnR5cGUgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgI25hbWUKKyAgICAgICAgICAgICAgICAgICAgbm9kZV90b2tlbiA9IGN1cnJlbnRfYXN0X25vZGUudmFsdWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBub2RlX3Rva2VuID0gY3VycmVudF9hc3Rfbm9kZS50eXBlCisKKyAgICAgICAgICAgICAgICBpZiBub2RlX3Rva2VuIGluIGN1cnJlbnRfYWNfbm9kZS50cmFuc2l0aW9uX3RhYmxlOgorICAgICAgICAgICAgICAgICAgICAjdG9rZW4gbWF0Y2hlcworICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2FjX25vZGUgPSBjdXJyZW50X2FjX25vZGUudHJhbnNpdGlvbl90YWJsZVtub2RlX3Rva2VuXQorICAgICAgICAgICAgICAgICAgICBmb3IgZml4ZXIgaW4gY3VycmVudF9hY19ub2RlLmZpeGVyczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmaXhlciBpbiByZXN1bHRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbZml4ZXJdID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbZml4ZXJdLmFwcGVuZChjdXJyZW50X2FzdF9ub2RlKQorCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgI21hdGNoaW5nIGZhaWxlZCwgcmVzZXQgYXV0b21hdG9uCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYWNfbm9kZSA9IHNlbGYucm9vdAorICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudF9hc3Rfbm9kZS5wYXJlbnQgaXMgbm90IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBjdXJyZW50X2FzdF9ub2RlLnBhcmVudC53YXNfY2hlY2tlZCk6CisgICAgICAgICAgICAgICAgICAgICAgICAjdGhlIHJlc3Qgb2YgdGhlIHRyZWUgdXB3YXJkcyBoYXMgYmVlbiBjaGVja2VkLCBuZXh0IGxlYWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICAgICAgICAgI3JlY2hlY2sgdGhlIHJlamVjdGVkIG5vZGUgb25jZSBmcm9tIHRoZSByb290CisgICAgICAgICAgICAgICAgICAgIGlmIG5vZGVfdG9rZW4gaW4gY3VycmVudF9hY19ub2RlLnRyYW5zaXRpb25fdGFibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAjdG9rZW4gbWF0Y2hlcworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9hY19ub2RlID0gY3VycmVudF9hY19ub2RlLnRyYW5zaXRpb25fdGFibGVbbm9kZV90b2tlbl0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmaXhlciBpbiBjdXJyZW50X2FjX25vZGUuZml4ZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmaXhlciBpbiByZXN1bHRzLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tmaXhlcl0gPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbZml4ZXJdLmFwcGVuZChjdXJyZW50X2FzdF9ub2RlKQorCisgICAgICAgICAgICAgICAgY3VycmVudF9hc3Rfbm9kZSA9IGN1cnJlbnRfYXN0X25vZGUucGFyZW50CisgICAgICAgIHJldHVybiByZXN1bHRzCisKKyAgICBkZWYgcHJpbnRfYWMoc2VsZik6CisgICAgICAgICJQcmludHMgYSBncmFwaHZpeiBkaWFncmFtIG9mIHRoZSBCTSBhdXRvbWF0b24oZm9yIGRlYnVnZ2luZykiCisgICAgICAgIHByaW50KCJkaWdyYXBoIGd7IikKKyAgICAgICAgZGVmIHByaW50X25vZGUobm9kZSk6CisgICAgICAgICAgICBmb3Igc3Vibm9kZV9rZXkgaW4gbm9kZS50cmFuc2l0aW9uX3RhYmxlLmtleXMoKToKKyAgICAgICAgICAgICAgICBzdWJub2RlID0gbm9kZS50cmFuc2l0aW9uX3RhYmxlW3N1Ym5vZGVfa2V5XQorICAgICAgICAgICAgICAgIHByaW50KCIlZCAtPiAlZCBbbGFiZWw9JXNdIC8vJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAobm9kZS5pZCwgc3Vibm9kZS5pZCwgdHlwZV9yZXByKHN1Ym5vZGVfa2V5KSwgc3RyKHN1Ym5vZGUuZml4ZXJzKSkpCisgICAgICAgICAgICAgICAgaWYgc3Vibm9kZV9rZXkgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQoc3Vibm9kZS5jb250ZW50KQorICAgICAgICAgICAgICAgIHByaW50X25vZGUoc3Vibm9kZSkKKyAgICAgICAgcHJpbnRfbm9kZShzZWxmLnJvb3QpCisgICAgICAgIHByaW50KCJ9IikKKworIyB0YWtlbiBmcm9tIHB5dHJlZS5weSBmb3IgZGVidWdnaW5nOyBvbmx5IHVzZWQgYnkgcHJpbnRfYWMKK190eXBlX3JlcHJzID0ge30KK2RlZiB0eXBlX3JlcHIodHlwZV9udW0pOgorICAgIGdsb2JhbCBfdHlwZV9yZXBycworICAgIGlmIG5vdCBfdHlwZV9yZXByczoKKyAgICAgICAgZnJvbSAucHlncmFtIGltcG9ydCBweXRob25fc3ltYm9scworICAgICAgICAjIHByaW50aW5nIHRva2VucyBpcyBwb3NzaWJsZSBidXQgbm90IGFzIHVzZWZ1bAorICAgICAgICAjIGZyb20gLnBnZW4yIGltcG9ydCB0b2tlbiAvLyB0b2tlbi5fX2RpY3RfXy5pdGVtcygpOgorICAgICAgICBmb3IgbmFtZSwgdmFsIGluIHB5dGhvbl9zeW1ib2xzLl9fZGljdF9fLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB0eXBlKHZhbCkgPT0gaW50OiBfdHlwZV9yZXByc1t2YWxdID0gbmFtZQorICAgIHJldHVybiBfdHlwZV9yZXBycy5zZXRkZWZhdWx0KHR5cGVfbnVtLCB0eXBlX251bSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9idG1fbWF0Y2hlci5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX21hdGNoZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMGY1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX21hdGNoZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9idG1fbWF0Y2hlci5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX21hdGNoZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMGY1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX21hdGNoZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9idG1fdXRpbHMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzZkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX3V0aWxzLnB5CkBAIC0wLDAgKzEsMjgzIEBACisiVXRpbGl0eSBmdW5jdGlvbnMgdXNlZCBieSB0aGUgYnRtX21hdGNoZXIgbW9kdWxlIgorCitmcm9tIC4gaW1wb3J0IHB5dHJlZQorZnJvbSAucGdlbjIgaW1wb3J0IGdyYW1tYXIsIHRva2VuCitmcm9tIC5weWdyYW0gaW1wb3J0IHBhdHRlcm5fc3ltYm9scywgcHl0aG9uX3N5bWJvbHMKKworc3ltcyA9IHBhdHRlcm5fc3ltYm9scworcHlzeW1zID0gcHl0aG9uX3N5bWJvbHMKK3Rva2VucyA9IGdyYW1tYXIub3BtYXAKK3Rva2VuX2xhYmVscyA9IHRva2VuCisKK1RZUEVfQU5ZID0gLTEKK1RZUEVfQUxURVJOQVRJVkVTID0gLTIKK1RZUEVfR1JPVVAgPSAtMworCitjbGFzcyBNaW5Ob2RlKG9iamVjdCk6CisgICAgIiIiVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgYW4gaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgIHBhdHRlcm4gdHJlZSBkdXJpbmcgdGhlIGNvbnZlcnNpb24gdG8gc2V0cyBvZiBsZWFmLXRvLXJvb3QKKyAgICBzdWJwYXR0ZXJucyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9Tm9uZSwgbmFtZT1Ob25lKToKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbXQorICAgICAgICBzZWxmLmxlYWYgPSBGYWxzZQorICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUKKyAgICAgICAgc2VsZi5hbHRlcm5hdGl2ZXMgPSBbXQorICAgICAgICBzZWxmLmdyb3VwID0gW10KKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLnR5cGUpICsgJyAnICsgc3RyKHNlbGYubmFtZSkKKworICAgIGRlZiBsZWFmX3RvX3Jvb3Qoc2VsZik6CisgICAgICAgICIiIkludGVybmFsIG1ldGhvZC4gUmV0dXJucyBhIGNoYXJhY3RlcmlzdGljIHBhdGggb2YgdGhlCisgICAgICAgIHBhdHRlcm4gdHJlZS4gVGhpcyBtZXRob2QgbXVzdCBiZSBydW4gZm9yIGFsbCBsZWF2ZXMgdW50aWwgdGhlCisgICAgICAgIGxpbmVhciBzdWJwYXR0ZXJucyBhcmUgbWVyZ2VkIGludG8gYSBzaW5nbGUiIiIKKyAgICAgICAgbm9kZSA9IHNlbGYKKyAgICAgICAgc3VicCA9IFtdCisgICAgICAgIHdoaWxlIG5vZGU6CisgICAgICAgICAgICBpZiBub2RlLnR5cGUgPT0gVFlQRV9BTFRFUk5BVElWRVM6CisgICAgICAgICAgICAgICAgbm9kZS5hbHRlcm5hdGl2ZXMuYXBwZW5kKHN1YnApCisgICAgICAgICAgICAgICAgaWYgbGVuKG5vZGUuYWx0ZXJuYXRpdmVzKSA9PSBsZW4obm9kZS5jaGlsZHJlbik6CisgICAgICAgICAgICAgICAgICAgICNsYXN0IGFsdGVybmF0aXZlCisgICAgICAgICAgICAgICAgICAgIHN1YnAgPSBbdHVwbGUobm9kZS5hbHRlcm5hdGl2ZXMpXQorICAgICAgICAgICAgICAgICAgICBub2RlLmFsdGVybmF0aXZlcyA9IFtdCisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudAorICAgICAgICAgICAgICAgICAgICBzdWJwID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBpZiBub2RlLnR5cGUgPT0gVFlQRV9HUk9VUDoKKyAgICAgICAgICAgICAgICBub2RlLmdyb3VwLmFwcGVuZChzdWJwKQorICAgICAgICAgICAgICAgICNwcm9iYWJseSBzaG91bGQgY2hlY2sgdGhlIG51bWJlciBvZiBsZWF2ZXMKKyAgICAgICAgICAgICAgICBpZiBsZW4obm9kZS5ncm91cCkgPT0gbGVuKG5vZGUuY2hpbGRyZW4pOgorICAgICAgICAgICAgICAgICAgICBzdWJwID0gZ2V0X2NoYXJhY3RlcmlzdGljX3N1YnBhdHRlcm4obm9kZS5ncm91cCkKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5ncm91cCA9IFtdCisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudAorICAgICAgICAgICAgICAgICAgICBzdWJwID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBpZiBub2RlLnR5cGUgPT0gdG9rZW5fbGFiZWxzLk5BTUUgYW5kIG5vZGUubmFtZToKKyAgICAgICAgICAgICAgICAjaW4gY2FzZSBvZiB0eXBlPW5hbWUsIHVzZSB0aGUgbmFtZSBpbnN0ZWFkCisgICAgICAgICAgICAgICAgc3VicC5hcHBlbmQobm9kZS5uYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdWJwLmFwcGVuZChub2RlLnR5cGUpCisKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudAorICAgICAgICByZXR1cm4gc3VicAorCisgICAgZGVmIGdldF9saW5lYXJfc3VicGF0dGVybihzZWxmKToKKyAgICAgICAgIiIiRHJpdmVzIHRoZSBsZWFmX3RvX3Jvb3QgbWV0aG9kLiBUaGUgcmVhc29uIHRoYXQKKyAgICAgICAgbGVhZl90b19yb290IG11c3QgYmUgcnVuIG11bHRpcGxlIHRpbWVzIGlzIGJlY2F1c2Ugd2UgbmVlZCB0bworICAgICAgICByZWplY3QgJ2dyb3VwJyBtYXRjaGVzOyBmb3IgZXhhbXBsZSB0aGUgYWx0ZXJuYXRpdmUgZm9ybQorICAgICAgICAoYSB8IGIgYykgY3JlYXRlcyBhIGdyb3VwIFtiIGNdIHRoYXQgbmVlZHMgdG8gYmUgbWF0Y2hlZC4gU2luY2UKKyAgICAgICAgbWF0Y2hpbmcgbXVsdGlwbGUgbGluZWFyIHBhdHRlcm5zIG92ZXJjb21lcyB0aGUgYXV0b21hdG9uJ3MKKyAgICAgICAgY2FwYWJpbGl0aWVzLCBsZWFmX3RvX3Jvb3QgbWVyZ2VzIGVhY2ggZ3JvdXAgaW50byBhIHNpbmdsZQorICAgICAgICBjaG9pY2UgYmFzZWQgb24gJ2NoYXJhY3RlcmlzdGljJ2l0eSwKKworICAgICAgICBpLmUuIChhfGIgYykgLT4gKGF8YikgaWYgYiBtb3JlIGNoYXJhY3RlcmlzdGljIHRoYW4gYworCisgICAgICAgIFJldHVybnM6IFRoZSBtb3N0ICdjaGFyYWN0ZXJpc3RpYycoYXMgZGVmaW5lZCBieQorICAgICAgICAgIGdldF9jaGFyYWN0ZXJpc3RpY19zdWJwYXR0ZXJuKSBwYXRoIGZvciB0aGUgY29tcGlsZWQgcGF0dGVybgorICAgICAgICAgIHRyZWUuCisgICAgICAgICIiIgorCisgICAgICAgIGZvciBsIGluIHNlbGYubGVhdmVzKCk6CisgICAgICAgICAgICBzdWJwID0gbC5sZWFmX3RvX3Jvb3QoKQorICAgICAgICAgICAgaWYgc3VicDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VicAorCisgICAgZGVmIGxlYXZlcyhzZWxmKToKKyAgICAgICAgIkdlbmVyYXRvciB0aGF0IHJldHVybnMgdGhlIGxlYXZlcyBvZiB0aGUgdHJlZSIKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuY2hpbGRyZW46CisgICAgICAgICAgICBmb3IgeCBpbiBjaGlsZC5sZWF2ZXMoKToKKyAgICAgICAgICAgICAgICB5aWVsZCB4CisgICAgICAgIGlmIG5vdCBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgeWllbGQgc2VsZgorCitkZWYgcmVkdWNlX3RyZWUobm9kZSwgcGFyZW50PU5vbmUpOgorICAgICIiIgorICAgIEludGVybmFsIGZ1bmN0aW9uLiBSZWR1Y2VzIGEgY29tcGlsZWQgcGF0dGVybiB0cmVlIHRvIGFuCisgICAgaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uIHN1aXRhYmxlIGZvciBmZWVkaW5nIHRoZQorICAgIGF1dG9tYXRvbi4gVGhpcyBhbHNvIHRyaW1zIG9mZiBhbnkgb3B0aW9uYWwgcGF0dGVybiBlbGVtZW50cyhsaWtlCisgICAgW2FdLCBhKikuCisgICAgIiIiCisKKyAgICBuZXdfbm9kZSA9IE5vbmUKKyAgICAjc3dpdGNoIG9uIHRoZSBub2RlIHR5cGUKKyAgICBpZiBub2RlLnR5cGUgPT0gc3ltcy5NYXRjaGVyOgorICAgICAgICAjc2tpcAorICAgICAgICBub2RlID0gbm9kZS5jaGlsZHJlblswXQorCisgICAgaWYgbm9kZS50eXBlID09IHN5bXMuQWx0ZXJuYXRpdmVzICA6CisgICAgICAgICMyIGNhc2VzCisgICAgICAgIGlmIGxlbihub2RlLmNoaWxkcmVuKSA8PSAyOgorICAgICAgICAgICAgI2p1c3QgYSBzaW5nbGUgJ0FsdGVybmF0aXZlJywgc2tpcCB0aGlzIG5vZGUKKyAgICAgICAgICAgIG5ld19ub2RlID0gcmVkdWNlX3RyZWUobm9kZS5jaGlsZHJlblswXSwgcGFyZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgI3JlYWwgYWx0ZXJuYXRpdmVzCisgICAgICAgICAgICBuZXdfbm9kZSA9IE1pbk5vZGUodHlwZT1UWVBFX0FMVEVSTkFUSVZFUykKKyAgICAgICAgICAgICNza2lwIG9kZCBjaGlsZHJlbignfCcgdG9rZW5zKQorICAgICAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGRyZW46CisgICAgICAgICAgICAgICAgaWYgbm9kZS5jaGlsZHJlbi5pbmRleChjaGlsZCklMjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICByZWR1Y2VkID0gcmVkdWNlX3RyZWUoY2hpbGQsIG5ld19ub2RlKQorICAgICAgICAgICAgICAgIGlmIHJlZHVjZWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG5ld19ub2RlLmNoaWxkcmVuLmFwcGVuZChyZWR1Y2VkKQorICAgIGVsaWYgbm9kZS50eXBlID09IHN5bXMuQWx0ZXJuYXRpdmU6CisgICAgICAgIGlmIGxlbihub2RlLmNoaWxkcmVuKSA+IDE6CisKKyAgICAgICAgICAgIG5ld19ub2RlID0gTWluTm9kZSh0eXBlPVRZUEVfR1JPVVApCisgICAgICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5jaGlsZHJlbjoKKyAgICAgICAgICAgICAgICByZWR1Y2VkID0gcmVkdWNlX3RyZWUoY2hpbGQsIG5ld19ub2RlKQorICAgICAgICAgICAgICAgIGlmIHJlZHVjZWQ6CisgICAgICAgICAgICAgICAgICAgIG5ld19ub2RlLmNoaWxkcmVuLmFwcGVuZChyZWR1Y2VkKQorICAgICAgICAgICAgaWYgbm90IG5ld19ub2RlLmNoaWxkcmVuOgorICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBncm91cCBpZiBhbGwgb2YgdGhlIGNoaWxkcmVuIHdlcmUgcmVkdWNlZCB0byBOb25lCisgICAgICAgICAgICAgICAgbmV3X25vZGUgPSBOb25lCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld19ub2RlID0gcmVkdWNlX3RyZWUobm9kZS5jaGlsZHJlblswXSwgcGFyZW50KQorCisgICAgZWxpZiBub2RlLnR5cGUgPT0gc3ltcy5Vbml0OgorICAgICAgICBpZiAoaXNpbnN0YW5jZShub2RlLmNoaWxkcmVuWzBdLCBweXRyZWUuTGVhZikgYW5kCisgICAgICAgICAgICBub2RlLmNoaWxkcmVuWzBdLnZhbHVlID09ICcoJyk6CisgICAgICAgICAgICAjc2tpcCBwYXJlbnRoZXNlcworICAgICAgICAgICAgcmV0dXJuIHJlZHVjZV90cmVlKG5vZGUuY2hpbGRyZW5bMV0sIHBhcmVudCkKKyAgICAgICAgaWYgKChpc2luc3RhbmNlKG5vZGUuY2hpbGRyZW5bMF0sIHB5dHJlZS5MZWFmKSBhbmQKKyAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW5bMF0udmFsdWUgPT0gJ1snKQorICAgICAgICAgICAgICAgb3IKKyAgICAgICAgICAgICAgIChsZW4obm9kZS5jaGlsZHJlbik+MSBhbmQKKyAgICAgICAgICAgICAgIGhhc2F0dHIobm9kZS5jaGlsZHJlblsxXSwgInZhbHVlIikgYW5kCisgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuWzFdLnZhbHVlID09ICdbJykpOgorICAgICAgICAgICAgI3NraXAgd2hvbGUgdW5pdCBpZiBpdHMgb3B0aW9uYWwKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgbGVhZiA9IFRydWUKKyAgICAgICAgZGV0YWlsc19ub2RlID0gTm9uZQorICAgICAgICBhbHRlcm5hdGl2ZXNfbm9kZSA9IE5vbmUKKyAgICAgICAgaGFzX3JlcGVhdGVyID0gRmFsc2UKKyAgICAgICAgcmVwZWF0ZXJfbm9kZSA9IE5vbmUKKyAgICAgICAgaGFzX3ZhcmlhYmxlX25hbWUgPSBGYWxzZQorCisgICAgICAgIGZvciBjaGlsZCBpbiBub2RlLmNoaWxkcmVuOgorICAgICAgICAgICAgaWYgY2hpbGQudHlwZSA9PSBzeW1zLkRldGFpbHM6CisgICAgICAgICAgICAgICAgbGVhZiA9IEZhbHNlCisgICAgICAgICAgICAgICAgZGV0YWlsc19ub2RlID0gY2hpbGQKKyAgICAgICAgICAgIGVsaWYgY2hpbGQudHlwZSA9PSBzeW1zLlJlcGVhdGVyOgorICAgICAgICAgICAgICAgIGhhc19yZXBlYXRlciA9IFRydWUKKyAgICAgICAgICAgICAgICByZXBlYXRlcl9ub2RlID0gY2hpbGQKKyAgICAgICAgICAgIGVsaWYgY2hpbGQudHlwZSA9PSBzeW1zLkFsdGVybmF0aXZlczoKKyAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZXNfbm9kZSA9IGNoaWxkCisgICAgICAgICAgICBpZiBoYXNhdHRyKGNoaWxkLCAndmFsdWUnKSBhbmQgY2hpbGQudmFsdWUgPT0gJz0nOiAjIHZhcmlhYmxlIG5hbWUKKyAgICAgICAgICAgICAgICBoYXNfdmFyaWFibGVfbmFtZSA9IFRydWUKKworICAgICAgICAjc2tpcCB2YXJpYWJsZSBuYW1lCisgICAgICAgIGlmIGhhc192YXJpYWJsZV9uYW1lOgorICAgICAgICAgICAgI3NraXAgdmFyaWFibGUgbmFtZSwgJz0nCisgICAgICAgICAgICBuYW1lX2xlYWYgPSBub2RlLmNoaWxkcmVuWzJdCisgICAgICAgICAgICBpZiBoYXNhdHRyKG5hbWVfbGVhZiwgJ3ZhbHVlJykgYW5kIG5hbWVfbGVhZi52YWx1ZSA9PSAnKCc6CisgICAgICAgICAgICAgICAgIyBza2lwIHBhcmVudGhlc2lzCisgICAgICAgICAgICAgICAgbmFtZV9sZWFmID0gbm9kZS5jaGlsZHJlblszXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZV9sZWFmID0gbm9kZS5jaGlsZHJlblswXQorCisgICAgICAgICNzZXQgbm9kZSB0eXBlCisgICAgICAgIGlmIG5hbWVfbGVhZi50eXBlID09IHRva2VuX2xhYmVscy5OQU1FOgorICAgICAgICAgICAgIyhweXRob24pIG5vbi1uYW1lIG9yIHdpbGRjYXJkCisgICAgICAgICAgICBpZiBuYW1lX2xlYWYudmFsdWUgPT0gJ2FueSc6CisgICAgICAgICAgICAgICAgbmV3X25vZGUgPSBNaW5Ob2RlKHR5cGU9VFlQRV9BTlkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIodG9rZW5fbGFiZWxzLCBuYW1lX2xlYWYudmFsdWUpOgorICAgICAgICAgICAgICAgICAgICBuZXdfbm9kZSA9IE1pbk5vZGUodHlwZT1nZXRhdHRyKHRva2VuX2xhYmVscywgbmFtZV9sZWFmLnZhbHVlKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBuZXdfbm9kZSA9IE1pbk5vZGUodHlwZT1nZXRhdHRyKHB5c3ltcywgbmFtZV9sZWFmLnZhbHVlKSkKKworICAgICAgICBlbGlmIG5hbWVfbGVhZi50eXBlID09IHRva2VuX2xhYmVscy5TVFJJTkc6CisgICAgICAgICAgICAjKHB5dGhvbikgbmFtZSBvciBjaGFyYWN0ZXI7IHJlbW92ZSB0aGUgYXBvc3Ryb3BoZXMgZnJvbQorICAgICAgICAgICAgI3RoZSBzdHJpbmcgdmFsdWUKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lX2xlYWYudmFsdWUuc3RyaXAoIiciKQorICAgICAgICAgICAgaWYgbmFtZSBpbiB0b2tlbnM6CisgICAgICAgICAgICAgICAgbmV3X25vZGUgPSBNaW5Ob2RlKHR5cGU9dG9rZW5zW25hbWVdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdfbm9kZSA9IE1pbk5vZGUodHlwZT10b2tlbl9sYWJlbHMuTkFNRSwgbmFtZT1uYW1lKQorICAgICAgICBlbGlmIG5hbWVfbGVhZi50eXBlID09IHN5bXMuQWx0ZXJuYXRpdmVzOgorICAgICAgICAgICAgbmV3X25vZGUgPSByZWR1Y2VfdHJlZShhbHRlcm5hdGl2ZXNfbm9kZSwgcGFyZW50KQorCisgICAgICAgICNoYW5kbGUgcmVwZWF0ZXJzCisgICAgICAgIGlmIGhhc19yZXBlYXRlcjoKKyAgICAgICAgICAgIGlmIHJlcGVhdGVyX25vZGUuY2hpbGRyZW5bMF0udmFsdWUgPT0gJyonOgorICAgICAgICAgICAgICAgICNyZWR1Y2UgdG8gTm9uZQorICAgICAgICAgICAgICAgIG5ld19ub2RlID0gTm9uZQorICAgICAgICAgICAgZWxpZiByZXBlYXRlcl9ub2RlLmNoaWxkcmVuWzBdLnZhbHVlID09ICcrJzoKKyAgICAgICAgICAgICAgICAjcmVkdWNlIHRvIGEgc2luZ2xlIG9jY3VyZW5jZSBpLmUuIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICNUT0RPOiBoYW5kbGUge21pbiwgbWF4fSByZXBlYXRlcnMKKyAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICNhZGQgY2hpbGRyZW4KKyAgICAgICAgaWYgZGV0YWlsc19ub2RlIGFuZCBuZXdfbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBjaGlsZCBpbiBkZXRhaWxzX25vZGUuY2hpbGRyZW5bMTotMV06CisgICAgICAgICAgICAgICAgI3NraXAgJzwnLCAnPicgbWFya2VycworICAgICAgICAgICAgICAgIHJlZHVjZWQgPSByZWR1Y2VfdHJlZShjaGlsZCwgbmV3X25vZGUpCisgICAgICAgICAgICAgICAgaWYgcmVkdWNlZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbmV3X25vZGUuY2hpbGRyZW4uYXBwZW5kKHJlZHVjZWQpCisgICAgaWYgbmV3X25vZGU6CisgICAgICAgIG5ld19ub2RlLnBhcmVudCA9IHBhcmVudAorICAgIHJldHVybiBuZXdfbm9kZQorCisKK2RlZiBnZXRfY2hhcmFjdGVyaXN0aWNfc3VicGF0dGVybihzdWJwYXR0ZXJucyk6CisgICAgIiIiUGlja3MgdGhlIG1vc3QgY2hhcmFjdGVyaXN0aWMgZnJvbSBhIGxpc3Qgb2YgbGluZWFyIHBhdHRlcm5zCisgICAgQ3VycmVudCBvcmRlciB1c2VkIGlzOgorICAgIG5hbWVzID4gY29tbW9uX25hbWVzID4gY29tbW9uX2NoYXJzCisgICAgIiIiCisgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3VicGF0dGVybnMsIGxpc3QpOgorICAgICAgICByZXR1cm4gc3VicGF0dGVybnMKKyAgICBpZiBsZW4oc3VicGF0dGVybnMpPT0xOgorICAgICAgICByZXR1cm4gc3VicGF0dGVybnNbMF0KKworICAgICMgZmlyc3QgcGljayBvdXQgdGhlIG9uZXMgY29udGFpbmluZyB2YXJpYWJsZSBuYW1lcworICAgIHN1YnBhdHRlcm5zX3dpdGhfbmFtZXMgPSBbXQorICAgIHN1YnBhdHRlcm5zX3dpdGhfY29tbW9uX25hbWVzID0gW10KKyAgICBjb21tb25fbmFtZXMgPSBbJ2luJywgJ2ZvcicsICdpZicgLCAnbm90JywgJ05vbmUnXQorICAgIHN1YnBhdHRlcm5zX3dpdGhfY29tbW9uX2NoYXJzID0gW10KKyAgICBjb21tb25fY2hhcnMgPSAiW10oKS4sOiIKKyAgICBmb3Igc3VicGF0dGVybiBpbiBzdWJwYXR0ZXJuczoKKyAgICAgICAgaWYgYW55KHJlY190ZXN0KHN1YnBhdHRlcm4sIGxhbWJkYSB4OiB0eXBlKHgpIGlzIHN0cikpOgorICAgICAgICAgICAgaWYgYW55KHJlY190ZXN0KHN1YnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHg6IGlzaW5zdGFuY2UoeCwgc3RyKSBhbmQgeCBpbiBjb21tb25fY2hhcnMpKToKKyAgICAgICAgICAgICAgICBzdWJwYXR0ZXJuc193aXRoX2NvbW1vbl9jaGFycy5hcHBlbmQoc3VicGF0dGVybikKKyAgICAgICAgICAgIGVsaWYgYW55KHJlY190ZXN0KHN1YnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgeDogaXNpbnN0YW5jZSh4LCBzdHIpIGFuZCB4IGluIGNvbW1vbl9uYW1lcykpOgorICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5zX3dpdGhfY29tbW9uX25hbWVzLmFwcGVuZChzdWJwYXR0ZXJuKQorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5zX3dpdGhfbmFtZXMuYXBwZW5kKHN1YnBhdHRlcm4pCisKKyAgICBpZiBzdWJwYXR0ZXJuc193aXRoX25hbWVzOgorICAgICAgICBzdWJwYXR0ZXJucyA9IHN1YnBhdHRlcm5zX3dpdGhfbmFtZXMKKyAgICBlbGlmIHN1YnBhdHRlcm5zX3dpdGhfY29tbW9uX25hbWVzOgorICAgICAgICBzdWJwYXR0ZXJucyA9IHN1YnBhdHRlcm5zX3dpdGhfY29tbW9uX25hbWVzCisgICAgZWxpZiBzdWJwYXR0ZXJuc193aXRoX2NvbW1vbl9jaGFyczoKKyAgICAgICAgc3VicGF0dGVybnMgPSBzdWJwYXR0ZXJuc193aXRoX2NvbW1vbl9jaGFycworICAgICMgb2YgdGhlIHJlbWFpbmluZyBzdWJwYXR0ZXJucyBwaWNrIG91dCB0aGUgbG9uZ2VzdCBvbmUKKyAgICByZXR1cm4gbWF4KHN1YnBhdHRlcm5zLCBrZXk9bGVuKQorCitkZWYgcmVjX3Rlc3Qoc2VxdWVuY2UsIHRlc3RfZnVuYyk6CisgICAgIiIiVGVzdHMgdGVzdF9mdW5jIG9uIGFsbCBpdGVtcyBvZiBzZXF1ZW5jZSBhbmQgaXRlbXMgb2YgaW5jbHVkZWQKKyAgICBzdWItaXRlcmFibGVzIiIiCisgICAgZm9yIHggaW4gc2VxdWVuY2U6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoeCwgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICBmb3IgeSBpbiByZWNfdGVzdCh4LCB0ZXN0X2Z1bmMpOgorICAgICAgICAgICAgICAgIHlpZWxkIHkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHlpZWxkIHRlc3RfZnVuYyh4KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2J0bV91dGlscy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX3V0aWxzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2UyODA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2J0bV91dGlscy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2J0bV91dGlscy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX3V0aWxzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2UyODA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2J0bV91dGlscy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX2Jhc2UucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXJfYmFzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjQyMWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX2Jhc2UucHkKQEAgLTAsMCArMSwxODkgQEAKKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiQmFzZSBjbGFzcyBmb3IgZml4ZXJzIChvcHRpb25hbCwgYnV0IHJlY29tbWVuZGVkKS4iIiIKKworIyBQeXRob24gaW1wb3J0cworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBpdGVydG9vbHMKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC5wYXRjb21wIGltcG9ydCBQYXR0ZXJuQ29tcGlsZXIKK2Zyb20gLiBpbXBvcnQgcHlncmFtCitmcm9tIC5maXhlcl91dGlsIGltcG9ydCBkb2VzX3RyZWVfaW1wb3J0CisKK2NsYXNzIEJhc2VGaXgob2JqZWN0KToKKworICAgICIiIk9wdGlvbmFsIGJhc2UgY2xhc3MgZm9yIGZpeGVycy4KKworICAgIFRoZSBzdWJjbGFzcyBuYW1lIG11c3QgYmUgRml4Rm9vQmFyIHdoZXJlIEZvb0JhciBpcyB0aGUgcmVzdWx0IG9mCisgICAgcmVtb3ZpbmcgdW5kZXJzY29yZXMgYW5kIGNhcGl0YWxpemluZyB0aGUgd29yZHMgb2YgdGhlIGZpeCBuYW1lLgorICAgIEZvciBleGFtcGxlLCB0aGUgY2xhc3MgbmFtZSBmb3IgYSBmaXhlciBuYW1lZCAnaGFzX2tleScgc2hvdWxkIGJlCisgICAgRml4SGFzS2V5LgorICAgICIiIgorCisgICAgUEFUVEVSTiA9IE5vbmUgICMgTW9zdCBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB3aXRoIGEgc3RyaW5nIGxpdGVyYWwKKyAgICBwYXR0ZXJuID0gTm9uZSAgIyBDb21waWxlZCBwYXR0ZXJuLCBzZXQgYnkgY29tcGlsZV9wYXR0ZXJuKCkKKyAgICBwYXR0ZXJuX3RyZWUgPSBOb25lICMgVHJlZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGF0dGVybgorICAgIG9wdGlvbnMgPSBOb25lICAjIE9wdGlvbnMgb2JqZWN0IHBhc3NlZCB0byBpbml0aWFsaXplcgorICAgIGZpbGVuYW1lID0gTm9uZSAjIFRoZSBmaWxlbmFtZSAoc2V0IGJ5IHNldF9maWxlbmFtZSkKKyAgICBsb2dnZXIgPSBOb25lICAgIyBBIGxvZ2dlciAoc2V0IGJ5IHNldF9maWxlbmFtZSkKKyAgICBudW1iZXJzID0gaXRlcnRvb2xzLmNvdW50KDEpICMgRm9yIG5ld19uYW1lKCkKKyAgICB1c2VkX25hbWVzID0gc2V0KCkgIyBBIHNldCBvZiBhbGwgdXNlZCBOQU1FcworICAgIG9yZGVyID0gInBvc3QiICMgRG9lcyB0aGUgZml4ZXIgcHJlZmVyIHByZS0gb3IgcG9zdC1vcmRlciB0cmF2ZXJzYWwKKyAgICBleHBsaWNpdCA9IEZhbHNlICMgSXMgdGhpcyBpZ25vcmVkIGJ5IHJlZmFjdG9yLnB5IC1mIGFsbD8KKyAgICBydW5fb3JkZXIgPSA1ICAgIyBGaXhlcnMgd2lsbCBiZSBzb3J0ZWQgYnkgcnVuIG9yZGVyIGJlZm9yZSBleGVjdXRpb24KKyAgICAgICAgICAgICAgICAgICAgIyBMb3dlciBudW1iZXJzIHdpbGwgYmUgcnVuIGZpcnN0LgorICAgIF9hY2NlcHRfdHlwZSA9IE5vbmUgIyBbQWR2YW5jZWQgYW5kIG5vdCBwdWJsaWNdIFRoaXMgdGVsbHMgUmVmYWN0b3JpbmdUb29sCisgICAgICAgICAgICAgICAgICAgICAgICAjIHdoaWNoIG5vZGUgdHlwZSB0byBhY2NlcHQgd2hlbiB0aGVyZSdzIG5vdCBhIHBhdHRlcm4uCisKKyAgICBrZWVwX2xpbmVfb3JkZXIgPSBGYWxzZSAjIEZvciB0aGUgYm90dG9tIG1hdGNoZXI6IG1hdGNoIHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcmlnaW5hbCBsaW5lIG9yZGVyCisgICAgQk1fY29tcGF0aWJsZSA9IEZhbHNlICMgQ29tcGF0aWJpbGl0eSB3aXRoIHRoZSBib3R0b20gbWF0Y2hpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtb2R1bGU7IGV2ZXJ5IGZpeGVyIHNob3VsZCBzZXQgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1hbnVhbGx5CisKKyAgICAjIFNob3J0Y3V0IGZvciBhY2Nlc3MgdG8gUHl0aG9uIGdyYW1tYXIgc3ltYm9scworICAgIHN5bXMgPSBweWdyYW0ucHl0aG9uX3N5bWJvbHMKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zLCBsb2cpOgorICAgICAgICAiIiJJbml0aWFsaXplci4gIFN1YmNsYXNzIG1heSBvdmVycmlkZS4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgb3B0aW9uczogYW4gZGljdCBjb250YWluaW5nIHRoZSBvcHRpb25zIHBhc3NlZCB0byBSZWZhY3RvcmluZ1Rvb2wKKyAgICAgICAgICAgIHRoYXQgY291bGQgYmUgdXNlZCB0byBjdXN0b21pemUgdGhlIGZpeGVyIHRocm91Z2ggdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgICAgICAgIGxvZzogYSBsaXN0IHRvIGFwcGVuZCB3YXJuaW5ncyBhbmQgb3RoZXIgbWVzc2FnZXMgdG8uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIHNlbGYubG9nID0gbG9nCisgICAgICAgIHNlbGYuY29tcGlsZV9wYXR0ZXJuKCkKKworICAgIGRlZiBjb21waWxlX3BhdHRlcm4oc2VsZik6CisgICAgICAgICIiIkNvbXBpbGVzIHNlbGYuUEFUVEVSTiBpbnRvIHNlbGYucGF0dGVybi4KKworICAgICAgICBTdWJjbGFzcyBtYXkgb3ZlcnJpZGUgaWYgaXQgZG9lc24ndCB3YW50IHRvIHVzZQorICAgICAgICBzZWxmLntwYXR0ZXJuLFBBVFRFUk59IGluIC5tYXRjaCgpLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5QQVRURVJOIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgUEMgPSBQYXR0ZXJuQ29tcGlsZXIoKQorICAgICAgICAgICAgc2VsZi5wYXR0ZXJuLCBzZWxmLnBhdHRlcm5fdHJlZSA9IFBDLmNvbXBpbGVfcGF0dGVybihzZWxmLlBBVFRFUk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhfdHJlZT1UcnVlKQorCisgICAgZGVmIHNldF9maWxlbmFtZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIlNldCB0aGUgZmlsZW5hbWUsIGFuZCBhIGxvZ2dlciBkZXJpdmVkIGZyb20gaXQuCisKKyAgICAgICAgVGhlIG1haW4gcmVmYWN0b3JpbmcgdG9vbCBzaG91bGQgY2FsbCB0aGlzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoZmlsZW5hbWUpCisKKyAgICBkZWYgbWF0Y2goc2VsZiwgbm9kZSk6CisgICAgICAgICIiIlJldHVybnMgbWF0Y2ggZm9yIGEgZ2l2ZW4gcGFyc2UgdHJlZSBub2RlLgorCisgICAgICAgIFNob3VsZCByZXR1cm4gYSB0cnVlIG9yIGZhbHNlIG9iamVjdCAobm90IG5lY2Vzc2FyaWx5IGEgYm9vbCkuCisgICAgICAgIEl0IG1heSByZXR1cm4gYSBub24tZW1wdHkgZGljdCBvZiBtYXRjaGluZyBzdWItbm9kZXMgYXMKKyAgICAgICAgcmV0dXJuZWQgYnkgYSBtYXRjaGluZyBwYXR0ZXJuLgorCisgICAgICAgIFN1YmNsYXNzIG1heSBvdmVycmlkZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJlc3VsdHMgPSB7Im5vZGUiOiBub2RlfQorICAgICAgICByZXR1cm4gc2VsZi5wYXR0ZXJuLm1hdGNoKG5vZGUsIHJlc3VsdHMpIGFuZCByZXN1bHRzCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSB0cmFuc2Zvcm1hdGlvbiBmb3IgYSBnaXZlbiBwYXJzZSB0cmVlIG5vZGUuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICBub2RlOiB0aGUgcm9vdCBvZiB0aGUgcGFyc2UgdHJlZSB0aGF0IG1hdGNoZWQgdGhlIGZpeGVyLgorICAgICAgICAgIHJlc3VsdHM6IGEgZGljdCBtYXBwaW5nIHN5bWJvbGljIG5hbWVzIHRvIHBhcnQgb2YgdGhlIG1hdGNoLgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgTm9uZSwgb3IgYSBub2RlIHRoYXQgaXMgYSBtb2RpZmllZCBjb3B5IG9mIHRoZQorICAgICAgICAgIGFyZ3VtZW50IG5vZGUuICBUaGUgbm9kZSBhcmd1bWVudCBtYXkgYWxzbyBiZSBtb2RpZmllZCBpbi1wbGFjZSB0bworICAgICAgICAgIGVmZmVjdCB0aGUgc2FtZSBjaGFuZ2UuCisKKyAgICAgICAgU3ViY2xhc3MgKm11c3QqIG92ZXJyaWRlLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgbmV3X25hbWUoc2VsZiwgdGVtcGxhdGU9dSJ4eHhfdG9kb19jaGFuZ2VtZSIpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBpZGVudGlmaWVyCisKKyAgICAgICAgVGhlIG5ldyBuYW1lIGlzIGd1YXJhbnRlZWQgbm90IHRvIGNvbmZsaWN0IHdpdGggb3RoZXIgaWRlbnRpZmllcnMuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gdGVtcGxhdGUKKyAgICAgICAgd2hpbGUgbmFtZSBpbiBzZWxmLnVzZWRfbmFtZXM6CisgICAgICAgICAgICBuYW1lID0gdGVtcGxhdGUgKyB1bmljb2RlKHNlbGYubnVtYmVycy5uZXh0KCkpCisgICAgICAgIHNlbGYudXNlZF9uYW1lcy5hZGQobmFtZSkKKyAgICAgICAgcmV0dXJuIG5hbWUKKworICAgIGRlZiBsb2dfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgaWYgc2VsZi5maXJzdF9sb2c6CisgICAgICAgICAgICBzZWxmLmZpcnN0X2xvZyA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLmxvZy5hcHBlbmQoIiMjIyBJbiBmaWxlICVzICMjIyIgJSBzZWxmLmZpbGVuYW1lKQorICAgICAgICBzZWxmLmxvZy5hcHBlbmQobWVzc2FnZSkKKworICAgIGRlZiBjYW5ub3RfY29udmVydChzZWxmLCBub2RlLCByZWFzb249Tm9uZSk6CisgICAgICAgICIiIldhcm4gdGhlIHVzZXIgdGhhdCBhIGdpdmVuIGNodW5rIG9mIGNvZGUgaXMgbm90IHZhbGlkIFB5dGhvbiAzLAorICAgICAgICBidXQgdGhhdCBpdCBjYW5ub3QgYmUgY29udmVydGVkIGF1dG9tYXRpY2FsbHkuCisKKyAgICAgICAgRmlyc3QgYXJndW1lbnQgaXMgdGhlIHRvcC1sZXZlbCBub2RlIGZvciB0aGUgY29kZSBpbiBxdWVzdGlvbi4KKyAgICAgICAgT3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IGlzIHdoeSBpdCBjYW4ndCBiZSBjb252ZXJ0ZWQuCisgICAgICAgICIiIgorICAgICAgICBsaW5lbm8gPSBub2RlLmdldF9saW5lbm8oKQorICAgICAgICBmb3Jfb3V0cHV0ID0gbm9kZS5jbG9uZSgpCisgICAgICAgIGZvcl9vdXRwdXQucHJlZml4ID0gdSIiCisgICAgICAgIG1zZyA9ICJMaW5lICVkOiBjb3VsZCBub3QgY29udmVydDogJXMiCisgICAgICAgIHNlbGYubG9nX21lc3NhZ2UobXNnICUgKGxpbmVubywgZm9yX291dHB1dCkpCisgICAgICAgIGlmIHJlYXNvbjoKKyAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UocmVhc29uKQorCisgICAgZGVmIHdhcm5pbmcoc2VsZiwgbm9kZSwgcmVhc29uKToKKyAgICAgICAgIiIiVXNlZCBmb3Igd2FybmluZyB0aGUgdXNlciBhYm91dCBwb3NzaWJsZSB1bmNlcnRhaW50eSBpbiB0aGUKKyAgICAgICAgdHJhbnNsYXRpb24uCisKKyAgICAgICAgRmlyc3QgYXJndW1lbnQgaXMgdGhlIHRvcC1sZXZlbCBub2RlIGZvciB0aGUgY29kZSBpbiBxdWVzdGlvbi4KKyAgICAgICAgT3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IGlzIHdoeSBpdCBjYW4ndCBiZSBjb252ZXJ0ZWQuCisgICAgICAgICIiIgorICAgICAgICBsaW5lbm8gPSBub2RlLmdldF9saW5lbm8oKQorICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJMaW5lICVkOiAlcyIgJSAobGluZW5vLCByZWFzb24pKQorCisgICAgZGVmIHN0YXJ0X3RyZWUoc2VsZiwgdHJlZSwgZmlsZW5hbWUpOgorICAgICAgICAiIiJTb21lIGZpeGVycyBuZWVkIHRvIG1haW50YWluIHRyZWUtd2lkZSBzdGF0ZS4KKyAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UsIGF0IHRoZSBzdGFydCBvZiB0cmVlIGZpeC11cC4KKworICAgICAgICB0cmVlIC0gdGhlIHJvb3Qgbm9kZSBvZiB0aGUgdHJlZSB0byBiZSBwcm9jZXNzZWQuCisgICAgICAgIGZpbGVuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlIHRyZWUgY2FtZSBmcm9tLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi51c2VkX25hbWVzID0gdHJlZS51c2VkX25hbWVzCisgICAgICAgIHNlbGYuc2V0X2ZpbGVuYW1lKGZpbGVuYW1lKQorICAgICAgICBzZWxmLm51bWJlcnMgPSBpdGVydG9vbHMuY291bnQoMSkKKyAgICAgICAgc2VsZi5maXJzdF9sb2cgPSBUcnVlCisKKyAgICBkZWYgZmluaXNoX3RyZWUoc2VsZiwgdHJlZSwgZmlsZW5hbWUpOgorICAgICAgICAiIiJTb21lIGZpeGVycyBuZWVkIHRvIG1haW50YWluIHRyZWUtd2lkZSBzdGF0ZS4KKyAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UsIGF0IHRoZSBjb25jbHVzaW9uIG9mIHRyZWUgZml4LXVwLgorCisgICAgICAgIHRyZWUgLSB0aGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlIHRvIGJlIHByb2Nlc3NlZC4KKyAgICAgICAgZmlsZW5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgdHJlZSBjYW1lIGZyb20uCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKworY2xhc3MgQ29uZGl0aW9uYWxGaXgoQmFzZUZpeCk6CisgICAgIiIiIEJhc2UgY2xhc3MgZm9yIGZpeGVycyB3aGljaCBub3QgZXhlY3V0ZSBpZiBhbiBpbXBvcnQgaXMgZm91bmQuICIiIgorCisgICAgIyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBpbXBvcnQgd2hpY2gsIGlmIGZvdW5kLCB3aWxsIGNhdXNlIHRoZSB0ZXN0IHRvIGJlIHNraXBwZWQKKyAgICBza2lwX29uID0gTm9uZQorCisgICAgZGVmIHN0YXJ0X3RyZWUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzdXBlcihDb25kaXRpb25hbEZpeCwgc2VsZikuc3RhcnRfdHJlZSgqYXJncykKKyAgICAgICAgc2VsZi5fc2hvdWxkX3NraXAgPSBOb25lCisKKyAgICBkZWYgc2hvdWxkX3NraXAoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIHNlbGYuX3Nob3VsZF9za2lwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3VsZF9za2lwCisgICAgICAgIHBrZyA9IHNlbGYuc2tpcF9vbi5zcGxpdCgiLiIpCisgICAgICAgIG5hbWUgPSBwa2dbLTFdCisgICAgICAgIHBrZyA9ICIuIi5qb2luKHBrZ1s6LTFdKQorICAgICAgICBzZWxmLl9zaG91bGRfc2tpcCA9IGRvZXNfdHJlZV9pbXBvcnQocGtnLCBuYW1lLCBub2RlKQorICAgICAgICByZXR1cm4gc2VsZi5fc2hvdWxkX3NraXAKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcl9iYXNlLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcl9iYXNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDVlZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX2Jhc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcl9iYXNlLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcl9iYXNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDVlZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX2Jhc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcl91dGlsLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmZGYyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcl91dGlsLnB5CkBAIC0wLDAgKzEsNDMyIEBACisiIiJVdGlsaXR5IGZ1bmN0aW9ucywgbm9kZSBjb25zdHJ1Y3Rpb24gbWFjcm9zLCBldGMuIiIiCisjIEF1dGhvcjogQ29sbGluIFdpbnRlcgorCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaXNsaWNlCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC5weXRyZWUgaW1wb3J0IExlYWYsIE5vZGUKK2Zyb20gLnB5Z3JhbSBpbXBvcnQgcHl0aG9uX3N5bWJvbHMgYXMgc3ltcworZnJvbSAuIGltcG9ydCBwYXRjb21wCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBDb21tb24gbm9kZS1jb25zdHJ1Y3Rpb24gIm1hY3JvcyIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiBLZXl3b3JkQXJnKGtleXdvcmQsIHZhbHVlKToKKyAgICByZXR1cm4gTm9kZShzeW1zLmFyZ3VtZW50LAorICAgICAgICAgICAgICAgIFtrZXl3b3JkLCBMZWFmKHRva2VuLkVRVUFMLCB1Ij0iKSwgdmFsdWVdKQorCitkZWYgTFBhcmVuKCk6CisgICAgcmV0dXJuIExlYWYodG9rZW4uTFBBUiwgdSIoIikKKworZGVmIFJQYXJlbigpOgorICAgIHJldHVybiBMZWFmKHRva2VuLlJQQVIsIHUiKSIpCisKK2RlZiBBc3NpZ24odGFyZ2V0LCBzb3VyY2UpOgorICAgICIiIkJ1aWxkIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50IiIiCisgICAgaWYgbm90IGlzaW5zdGFuY2UodGFyZ2V0LCBsaXN0KToKKyAgICAgICAgdGFyZ2V0ID0gW3RhcmdldF0KKyAgICBpZiBub3QgaXNpbnN0YW5jZShzb3VyY2UsIGxpc3QpOgorICAgICAgICBzb3VyY2UucHJlZml4ID0gdSIgIgorICAgICAgICBzb3VyY2UgPSBbc291cmNlXQorCisgICAgcmV0dXJuIE5vZGUoc3ltcy5hdG9tLAorICAgICAgICAgICAgICAgIHRhcmdldCArIFtMZWFmKHRva2VuLkVRVUFMLCB1Ij0iLCBwcmVmaXg9dSIgIildICsgc291cmNlKQorCitkZWYgTmFtZShuYW1lLCBwcmVmaXg9Tm9uZSk6CisgICAgIiIiUmV0dXJuIGEgTkFNRSBsZWFmIiIiCisgICAgcmV0dXJuIExlYWYodG9rZW4uTkFNRSwgbmFtZSwgcHJlZml4PXByZWZpeCkKKworZGVmIEF0dHIob2JqLCBhdHRyKToKKyAgICAiIiJBIG5vZGUgdHVwbGUgZm9yIG9iai5hdHRyIiIiCisgICAgcmV0dXJuIFtvYmosIE5vZGUoc3ltcy50cmFpbGVyLCBbRG90KCksIGF0dHJdKV0KKworZGVmIENvbW1hKCk6CisgICAgIiIiQSBjb21tYSBsZWFmIiIiCisgICAgcmV0dXJuIExlYWYodG9rZW4uQ09NTUEsIHUiLCIpCisKK2RlZiBEb3QoKToKKyAgICAiIiJBIHBlcmlvZCAoLikgbGVhZiIiIgorICAgIHJldHVybiBMZWFmKHRva2VuLkRPVCwgdSIuIikKKworZGVmIEFyZ0xpc3QoYXJncywgbHBhcmVuPUxQYXJlbigpLCBycGFyZW49UlBhcmVuKCkpOgorICAgICIiIkEgcGFyZW50aGVzaXNlZCBhcmd1bWVudCBsaXN0LCB1c2VkIGJ5IENhbGwoKSIiIgorICAgIG5vZGUgPSBOb2RlKHN5bXMudHJhaWxlciwgW2xwYXJlbi5jbG9uZSgpLCBycGFyZW4uY2xvbmUoKV0pCisgICAgaWYgYXJnczoKKyAgICAgICAgbm9kZS5pbnNlcnRfY2hpbGQoMSwgTm9kZShzeW1zLmFyZ2xpc3QsIGFyZ3MpKQorICAgIHJldHVybiBub2RlCisKK2RlZiBDYWxsKGZ1bmNfbmFtZSwgYXJncz1Ob25lLCBwcmVmaXg9Tm9uZSk6CisgICAgIiIiQSBmdW5jdGlvbiBjYWxsIiIiCisgICAgbm9kZSA9IE5vZGUoc3ltcy5wb3dlciwgW2Z1bmNfbmFtZSwgQXJnTGlzdChhcmdzKV0pCisgICAgaWYgcHJlZml4IGlzIG5vdCBOb25lOgorICAgICAgICBub2RlLnByZWZpeCA9IHByZWZpeAorICAgIHJldHVybiBub2RlCisKK2RlZiBOZXdsaW5lKCk6CisgICAgIiIiQSBuZXdsaW5lIGxpdGVyYWwiIiIKKyAgICByZXR1cm4gTGVhZih0b2tlbi5ORVdMSU5FLCB1IlxuIikKKworZGVmIEJsYW5rTGluZSgpOgorICAgICIiIkEgYmxhbmsgbGluZSIiIgorICAgIHJldHVybiBMZWFmKHRva2VuLk5FV0xJTkUsIHUiIikKKworZGVmIE51bWJlcihuLCBwcmVmaXg9Tm9uZSk6CisgICAgcmV0dXJuIExlYWYodG9rZW4uTlVNQkVSLCBuLCBwcmVmaXg9cHJlZml4KQorCitkZWYgU3Vic2NyaXB0KGluZGV4X25vZGUpOgorICAgICIiIkEgbnVtZXJpYyBvciBzdHJpbmcgc3Vic2NyaXB0IiIiCisgICAgcmV0dXJuIE5vZGUoc3ltcy50cmFpbGVyLCBbTGVhZih0b2tlbi5MQlJBQ0UsIHUiWyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4X25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVhZih0b2tlbi5SQlJBQ0UsIHUiXSIpXSkKKworZGVmIFN0cmluZyhzdHJpbmcsIHByZWZpeD1Ob25lKToKKyAgICAiIiJBIHN0cmluZyBsZWFmIiIiCisgICAgcmV0dXJuIExlYWYodG9rZW4uU1RSSU5HLCBzdHJpbmcsIHByZWZpeD1wcmVmaXgpCisKK2RlZiBMaXN0Q29tcCh4cCwgZnAsIGl0LCB0ZXN0PU5vbmUpOgorICAgICIiIkEgbGlzdCBjb21wcmVoZW5zaW9uIG9mIHRoZSBmb3JtIFt4cCBmb3IgZnAgaW4gaXQgaWYgdGVzdF0uCisKKyAgICBJZiB0ZXN0IGlzIE5vbmUsIHRoZSAiaWYgdGVzdCIgcGFydCBpcyBvbWl0dGVkLgorICAgICIiIgorICAgIHhwLnByZWZpeCA9IHUiIgorICAgIGZwLnByZWZpeCA9IHUiICIKKyAgICBpdC5wcmVmaXggPSB1IiAiCisgICAgZm9yX2xlYWYgPSBMZWFmKHRva2VuLk5BTUUsIHUiZm9yIikKKyAgICBmb3JfbGVhZi5wcmVmaXggPSB1IiAiCisgICAgaW5fbGVhZiA9IExlYWYodG9rZW4uTkFNRSwgdSJpbiIpCisgICAgaW5fbGVhZi5wcmVmaXggPSB1IiAiCisgICAgaW5uZXJfYXJncyA9IFtmb3JfbGVhZiwgZnAsIGluX2xlYWYsIGl0XQorICAgIGlmIHRlc3Q6CisgICAgICAgIHRlc3QucHJlZml4ID0gdSIgIgorICAgICAgICBpZl9sZWFmID0gTGVhZih0b2tlbi5OQU1FLCB1ImlmIikKKyAgICAgICAgaWZfbGVhZi5wcmVmaXggPSB1IiAiCisgICAgICAgIGlubmVyX2FyZ3MuYXBwZW5kKE5vZGUoc3ltcy5jb21wX2lmLCBbaWZfbGVhZiwgdGVzdF0pKQorICAgIGlubmVyID0gTm9kZShzeW1zLmxpc3RtYWtlciwgW3hwLCBOb2RlKHN5bXMuY29tcF9mb3IsIGlubmVyX2FyZ3MpXSkKKyAgICByZXR1cm4gTm9kZShzeW1zLmF0b20sCisgICAgICAgICAgICAgICAgICAgICAgIFtMZWFmKHRva2VuLkxCUkFDRSwgdSJbIiksCisgICAgICAgICAgICAgICAgICAgICAgICBpbm5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgIExlYWYodG9rZW4uUkJSQUNFLCB1Il0iKV0pCisKK2RlZiBGcm9tSW1wb3J0KHBhY2thZ2VfbmFtZSwgbmFtZV9sZWFmcyk6CisgICAgIiIiIFJldHVybiBhbiBpbXBvcnQgc3RhdGVtZW50IGluIHRoZSBmb3JtOgorICAgICAgICBmcm9tIHBhY2thZ2UgaW1wb3J0IG5hbWVfbGVhZnMiIiIKKyAgICAjIFhYWDogTWF5IG5vdCBoYW5kbGUgZG90dGVkIGltcG9ydHMgcHJvcGVybHkgKGVnLCBwYWNrYWdlX25hbWU9J2Zvby5iYXInKQorICAgICNhc3NlcnQgcGFja2FnZV9uYW1lID09ICcuJyBvciAnLicgbm90IGluIHBhY2thZ2VfbmFtZSwgIkZyb21JbXBvcnQgaGFzICJcCisgICAgIyAgICAgICAibm90IGJlZW4gdGVzdGVkIHdpdGggZG90dGVkIHBhY2thZ2UgbmFtZXMgLS0gdXNlIGF0IHlvdXIgb3duICJcCisgICAgIyAgICAgICAicGVyaWwhIgorCisgICAgZm9yIGxlYWYgaW4gbmFtZV9sZWFmczoKKyAgICAgICAgIyBQdWxsIHRoZSBsZWF2ZXMgb3V0IG9mIHRoZWlyIG9sZCB0cmVlCisgICAgICAgIGxlYWYucmVtb3ZlKCkKKworICAgIGNoaWxkcmVuID0gW0xlYWYodG9rZW4uTkFNRSwgdSJmcm9tIiksCisgICAgICAgICAgICAgICAgTGVhZih0b2tlbi5OQU1FLCBwYWNrYWdlX25hbWUsIHByZWZpeD11IiAiKSwKKyAgICAgICAgICAgICAgICBMZWFmKHRva2VuLk5BTUUsIHUiaW1wb3J0IiwgcHJlZml4PXUiICIpLAorICAgICAgICAgICAgICAgIE5vZGUoc3ltcy5pbXBvcnRfYXNfbmFtZXMsIG5hbWVfbGVhZnMpXQorICAgIGltcCA9IE5vZGUoc3ltcy5pbXBvcnRfZnJvbSwgY2hpbGRyZW4pCisgICAgcmV0dXJuIGltcAorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgRGV0ZXJtaW5lIHdoZXRoZXIgYSBub2RlIHJlcHJlc2VudHMgYSBnaXZlbiBsaXRlcmFsCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgaXNfdHVwbGUobm9kZSk6CisgICAgIiIiRG9lcyB0aGUgbm9kZSByZXByZXNlbnQgYSB0dXBsZSBsaXRlcmFsPyIiIgorICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgTm9kZSkgYW5kIG5vZGUuY2hpbGRyZW4gPT0gW0xQYXJlbigpLCBSUGFyZW4oKV06CisgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIChpc2luc3RhbmNlKG5vZGUsIE5vZGUpCisgICAgICAgICAgICBhbmQgbGVuKG5vZGUuY2hpbGRyZW4pID09IDMKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUuY2hpbGRyZW5bMF0sIExlYWYpCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLmNoaWxkcmVuWzFdLCBOb2RlKQorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uobm9kZS5jaGlsZHJlblsyXSwgTGVhZikKKyAgICAgICAgICAgIGFuZCBub2RlLmNoaWxkcmVuWzBdLnZhbHVlID09IHUiKCIKKyAgICAgICAgICAgIGFuZCBub2RlLmNoaWxkcmVuWzJdLnZhbHVlID09IHUiKSIpCisKK2RlZiBpc19saXN0KG5vZGUpOgorICAgICIiIkRvZXMgdGhlIG5vZGUgcmVwcmVzZW50IGEgbGlzdCBsaXRlcmFsPyIiIgorICAgIHJldHVybiAoaXNpbnN0YW5jZShub2RlLCBOb2RlKQorICAgICAgICAgICAgYW5kIGxlbihub2RlLmNoaWxkcmVuKSA+IDEKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUuY2hpbGRyZW5bMF0sIExlYWYpCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLmNoaWxkcmVuWy0xXSwgTGVhZikKKyAgICAgICAgICAgIGFuZCBub2RlLmNoaWxkcmVuWzBdLnZhbHVlID09IHUiWyIKKyAgICAgICAgICAgIGFuZCBub2RlLmNoaWxkcmVuWy0xXS52YWx1ZSA9PSB1Il0iKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgTWlzYworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIHBhcmVudGhlc2l6ZShub2RlKToKKyAgICByZXR1cm4gTm9kZShzeW1zLmF0b20sIFtMUGFyZW4oKSwgbm9kZSwgUlBhcmVuKCldKQorCisKK2NvbnN1bWluZ19jYWxscyA9IHNldChbInNvcnRlZCIsICJsaXN0IiwgInNldCIsICJhbnkiLCAiYWxsIiwgInR1cGxlIiwgInN1bSIsCisgICAgICAgICAgICAgICAgICAgICAgICJtaW4iLCAibWF4IiwgImVudW1lcmF0ZSJdKQorCitkZWYgYXR0cl9jaGFpbihvYmosIGF0dHIpOgorICAgICIiIkZvbGxvdyBhbiBhdHRyaWJ1dGUgY2hhaW4uCisKKyAgICBJZiB5b3UgaGF2ZSBhIGNoYWluIG9mIG9iamVjdHMgd2hlcmUgYS5mb28gLT4gYiwgYi5mb28tPiBjLCBldGMsCisgICAgdXNlIHRoaXMgdG8gaXRlcmF0ZSBvdmVyIGFsbCBvYmplY3RzIGluIHRoZSBjaGFpbi4gSXRlcmF0aW9uIGlzCisgICAgdGVybWluYXRlZCBieSBnZXRhdHRyKHgsIGF0dHIpIGlzIE5vbmUuCisKKyAgICBBcmdzOgorICAgICAgICBvYmo6IHRoZSBzdGFydGluZyBvYmplY3QKKyAgICAgICAgYXR0cjogdGhlIG5hbWUgb2YgdGhlIGNoYWluaW5nIGF0dHJpYnV0ZQorCisgICAgWWllbGRzOgorICAgICAgICBFYWNoIHN1Y2Nlc3NpdmUgb2JqZWN0IGluIHRoZSBjaGFpbi4KKyAgICAiIiIKKyAgICBuZXh0ID0gZ2V0YXR0cihvYmosIGF0dHIpCisgICAgd2hpbGUgbmV4dDoKKyAgICAgICAgeWllbGQgbmV4dAorICAgICAgICBuZXh0ID0gZ2V0YXR0cihuZXh0LCBhdHRyKQorCitwMCA9ICIiImZvcl9zdG10PCAnZm9yJyBhbnkgJ2luJyBub2RlPWFueSAnOicgYW55KiA+CisgICAgICAgIHwgY29tcF9mb3I8ICdmb3InIGFueSAnaW4nIG5vZGU9YW55IGFueSogPgorICAgICAiIiIKK3AxID0gIiIiCitwb3dlcjwKKyAgICAoICdpdGVyJyB8ICdsaXN0JyB8ICd0dXBsZScgfCAnc29ydGVkJyB8ICdzZXQnIHwgJ3N1bScgfAorICAgICAgJ2FueScgfCAnYWxsJyB8ICdlbnVtZXJhdGUnIHwgKGFueSogdHJhaWxlcjwgJy4nICdqb2luJyA+KSApCisgICAgdHJhaWxlcjwgJygnIG5vZGU9YW55ICcpJyA+CisgICAgYW55KgorPgorIiIiCitwMiA9ICIiIgorcG93ZXI8CisgICAgKCAnc29ydGVkJyB8ICdlbnVtZXJhdGUnICkKKyAgICB0cmFpbGVyPCAnKCcgYXJnbGlzdDxub2RlPWFueSBhbnkqPiAnKScgPgorICAgIGFueSoKKz4KKyIiIgorcGF0c19idWlsdCA9IEZhbHNlCitkZWYgaW5fc3BlY2lhbF9jb250ZXh0KG5vZGUpOgorICAgICIiIiBSZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBpbiBhbiBlbnZpcm9ubWVudCB3aGVyZSBhbGwgdGhhdCBpcyByZXF1aXJlZAorICAgICAgICBvZiBpdCBpcyBiZWluZyBpdGVyYWJsZSAoaWUsIGl0IGRvZXNuJ3QgbWF0dGVyIGlmIGl0IHJldHVybnMgYSBsaXN0CisgICAgICAgIG9yIGFuIGl0ZXJhdG9yKS4KKyAgICAgICAgU2VlIHRlc3RfbWFwX25vY2hhbmdlIGluIHRlc3RfZml4ZXJzLnB5IGZvciBzb21lIGV4YW1wbGVzIGFuZCB0ZXN0cy4KKyAgICAgICAgIiIiCisgICAgZ2xvYmFsIHAwLCBwMSwgcDIsIHBhdHNfYnVpbHQKKyAgICBpZiBub3QgcGF0c19idWlsdDoKKyAgICAgICAgcDAgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybihwMCkKKyAgICAgICAgcDEgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybihwMSkKKyAgICAgICAgcDIgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybihwMikKKyAgICAgICAgcGF0c19idWlsdCA9IFRydWUKKyAgICBwYXR0ZXJucyA9IFtwMCwgcDEsIHAyXQorICAgIGZvciBwYXR0ZXJuLCBwYXJlbnQgaW4gemlwKHBhdHRlcm5zLCBhdHRyX2NoYWluKG5vZGUsICJwYXJlbnQiKSk6CisgICAgICAgIHJlc3VsdHMgPSB7fQorICAgICAgICBpZiBwYXR0ZXJuLm1hdGNoKHBhcmVudCwgcmVzdWx0cykgYW5kIHJlc3VsdHNbIm5vZGUiXSBpcyBub2RlOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworZGVmIGlzX3Byb2JhYmx5X2J1aWx0aW4obm9kZSk6CisgICAgIiIiCisgICAgQ2hlY2sgdGhhdCBzb21ldGhpbmcgaXNuJ3QgYW4gYXR0cmlidXRlIG9yIGZ1bmN0aW9uIG5hbWUgZXRjLgorICAgICIiIgorICAgIHByZXYgPSBub2RlLnByZXZfc2libGluZworICAgIGlmIHByZXYgaXMgbm90IE5vbmUgYW5kIHByZXYudHlwZSA9PSB0b2tlbi5ET1Q6CisgICAgICAgICMgQXR0cmlidXRlIGxvb2t1cC4KKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcGFyZW50ID0gbm9kZS5wYXJlbnQKKyAgICBpZiBwYXJlbnQudHlwZSBpbiAoc3ltcy5mdW5jZGVmLCBzeW1zLmNsYXNzZGVmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgcGFyZW50LnR5cGUgPT0gc3ltcy5leHByX3N0bXQgYW5kIHBhcmVudC5jaGlsZHJlblswXSBpcyBub2RlOgorICAgICAgICAjIEFzc2lnbm1lbnQuCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIHBhcmVudC50eXBlID09IHN5bXMucGFyYW1ldGVycyBvciBcCisgICAgICAgICAgICAocGFyZW50LnR5cGUgPT0gc3ltcy50eXBlZGFyZ3NsaXN0IGFuZCAoCisgICAgICAgICAgICAocHJldiBpcyBub3QgTm9uZSBhbmQgcHJldi50eXBlID09IHRva2VuLkNPTU1BKSBvcgorICAgICAgICAgICAgcGFyZW50LmNoaWxkcmVuWzBdIGlzIG5vZGUKKyAgICAgICAgICAgICkpOgorICAgICAgICAjIFRoZSBuYW1lIG9mIGFuIGFyZ3VtZW50LgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCitkZWYgZmluZF9pbmRlbnRhdGlvbihub2RlKToKKyAgICAiIiJGaW5kIHRoZSBpbmRlbnRhdGlvbiBvZiAqbm9kZSouIiIiCisgICAgd2hpbGUgbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHN5bXMuc3VpdGUgYW5kIGxlbihub2RlLmNoaWxkcmVuKSA+IDI6CisgICAgICAgICAgICBpbmRlbnQgPSBub2RlLmNoaWxkcmVuWzFdCisgICAgICAgICAgICBpZiBpbmRlbnQudHlwZSA9PSB0b2tlbi5JTkRFTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGVudC52YWx1ZQorICAgICAgICBub2RlID0gbm9kZS5wYXJlbnQKKyAgICByZXR1cm4gdSIiCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHRvIGZpbmQgYmluZGluZ3MgaW4gYSBzdWl0ZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIG1ha2Vfc3VpdGUobm9kZSk6CisgICAgaWYgbm9kZS50eXBlID09IHN5bXMuc3VpdGU6CisgICAgICAgIHJldHVybiBub2RlCisgICAgbm9kZSA9IG5vZGUuY2xvbmUoKQorICAgIHBhcmVudCwgbm9kZS5wYXJlbnQgPSBub2RlLnBhcmVudCwgTm9uZQorICAgIHN1aXRlID0gTm9kZShzeW1zLnN1aXRlLCBbbm9kZV0pCisgICAgc3VpdGUucGFyZW50ID0gcGFyZW50CisgICAgcmV0dXJuIHN1aXRlCisKK2RlZiBmaW5kX3Jvb3Qobm9kZSk6CisgICAgIiIiRmluZCB0aGUgdG9wIGxldmVsIG5hbWVzcGFjZS4iIiIKKyAgICAjIFNjYW1wZXIgdXAgdG8gdGhlIHRvcCBsZXZlbCBuYW1lc3BhY2UKKyAgICB3aGlsZSBub2RlLnR5cGUgIT0gc3ltcy5maWxlX2lucHV0OgorICAgICAgICBub2RlID0gbm9kZS5wYXJlbnQKKyAgICAgICAgaWYgbm90IG5vZGU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyb290IGZvdW5kIGJlZm9yZSBmaWxlX2lucHV0IG5vZGUgd2FzIGZvdW5kLiIpCisgICAgcmV0dXJuIG5vZGUKKworZGVmIGRvZXNfdHJlZV9pbXBvcnQocGFja2FnZSwgbmFtZSwgbm9kZSk6CisgICAgIiIiIFJldHVybnMgdHJ1ZSBpZiBuYW1lIGlzIGltcG9ydGVkIGZyb20gcGFja2FnZSBhdCB0aGUKKyAgICAgICAgdG9wIGxldmVsIG9mIHRoZSB0cmVlIHdoaWNoIG5vZGUgYmVsb25ncyB0by4KKyAgICAgICAgVG8gY292ZXIgdGhlIGNhc2Ugb2YgYW4gaW1wb3J0IGxpa2UgJ2ltcG9ydCBmb28nLCB1c2UKKyAgICAgICAgTm9uZSBmb3IgdGhlIHBhY2thZ2UgYW5kICdmb28nIGZvciB0aGUgbmFtZS4gIiIiCisgICAgYmluZGluZyA9IGZpbmRfYmluZGluZyhuYW1lLCBmaW5kX3Jvb3Qobm9kZSksIHBhY2thZ2UpCisgICAgcmV0dXJuIGJvb2woYmluZGluZykKKworZGVmIGlzX2ltcG9ydChub2RlKToKKyAgICAiIiJSZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaXMgYW4gaW1wb3J0IHN0YXRlbWVudC4iIiIKKyAgICByZXR1cm4gbm9kZS50eXBlIGluIChzeW1zLmltcG9ydF9uYW1lLCBzeW1zLmltcG9ydF9mcm9tKQorCitkZWYgdG91Y2hfaW1wb3J0KHBhY2thZ2UsIG5hbWUsIG5vZGUpOgorICAgICIiIiBXb3JrcyBsaWtlIGBkb2VzX3RyZWVfaW1wb3J0YCBidXQgYWRkcyBhbiBpbXBvcnQgc3RhdGVtZW50CisgICAgICAgIGlmIGl0IHdhcyBub3QgaW1wb3J0ZWQuICIiIgorICAgIGRlZiBpc19pbXBvcnRfc3RtdChub2RlKToKKyAgICAgICAgcmV0dXJuIChub2RlLnR5cGUgPT0gc3ltcy5zaW1wbGVfc3RtdCBhbmQgbm9kZS5jaGlsZHJlbiBhbmQKKyAgICAgICAgICAgICAgICBpc19pbXBvcnQobm9kZS5jaGlsZHJlblswXSkpCisKKyAgICByb290ID0gZmluZF9yb290KG5vZGUpCisKKyAgICBpZiBkb2VzX3RyZWVfaW1wb3J0KHBhY2thZ2UsIG5hbWUsIHJvb3QpOgorICAgICAgICByZXR1cm4KKworICAgICMgZmlndXJlIG91dCB3aGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbXBvcnQuICBGaXJzdCB0cnkgdG8gZmluZAorICAgICMgdGhlIGZpcnN0IGltcG9ydCBhbmQgdGhlbiBza2lwIHRvIHRoZSBsYXN0IG9uZS4KKyAgICBpbnNlcnRfcG9zID0gb2Zmc2V0ID0gMAorICAgIGZvciBpZHgsIG5vZGUgaW4gZW51bWVyYXRlKHJvb3QuY2hpbGRyZW4pOgorICAgICAgICBpZiBub3QgaXNfaW1wb3J0X3N0bXQobm9kZSk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3Igb2Zmc2V0LCBub2RlMiBpbiBlbnVtZXJhdGUocm9vdC5jaGlsZHJlbltpZHg6XSk6CisgICAgICAgICAgICBpZiBub3QgaXNfaW1wb3J0X3N0bXQobm9kZTIpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGluc2VydF9wb3MgPSBpZHggKyBvZmZzZXQKKyAgICAgICAgYnJlYWsKKworICAgICMgaWYgdGhlcmUgYXJlIG5vIGltcG9ydHMgd2hlcmUgd2UgY2FuIGluc2VydCwgZmluZCB0aGUgZG9jc3RyaW5nLgorICAgICMgaWYgdGhhdCBhbHNvIGZhaWxzLCB3ZSBzdGljayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlCisgICAgaWYgaW5zZXJ0X3BvcyA9PSAwOgorICAgICAgICBmb3IgaWR4LCBub2RlIGluIGVudW1lcmF0ZShyb290LmNoaWxkcmVuKToKKyAgICAgICAgICAgIGlmIChub2RlLnR5cGUgPT0gc3ltcy5zaW1wbGVfc3RtdCBhbmQgbm9kZS5jaGlsZHJlbiBhbmQKKyAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW5bMF0udHlwZSA9PSB0b2tlbi5TVFJJTkcpOgorICAgICAgICAgICAgICAgIGluc2VydF9wb3MgPSBpZHggKyAxCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGlmIHBhY2thZ2UgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0XyA9IE5vZGUoc3ltcy5pbXBvcnRfbmFtZSwgWworICAgICAgICAgICAgTGVhZih0b2tlbi5OQU1FLCB1ImltcG9ydCIpLAorICAgICAgICAgICAgTGVhZih0b2tlbi5OQU1FLCBuYW1lLCBwcmVmaXg9dSIgIikKKyAgICAgICAgXSkKKyAgICBlbHNlOgorICAgICAgICBpbXBvcnRfID0gRnJvbUltcG9ydChwYWNrYWdlLCBbTGVhZih0b2tlbi5OQU1FLCBuYW1lLCBwcmVmaXg9dSIgIildKQorCisgICAgY2hpbGRyZW4gPSBbaW1wb3J0XywgTmV3bGluZSgpXQorICAgIHJvb3QuaW5zZXJ0X2NoaWxkKGluc2VydF9wb3MsIE5vZGUoc3ltcy5zaW1wbGVfc3RtdCwgY2hpbGRyZW4pKQorCisKK19kZWZfc3ltcyA9IHNldChbc3ltcy5jbGFzc2RlZiwgc3ltcy5mdW5jZGVmXSkKK2RlZiBmaW5kX2JpbmRpbmcobmFtZSwgbm9kZSwgcGFja2FnZT1Ob25lKToKKyAgICAiIiIgUmV0dXJucyB0aGUgbm9kZSB3aGljaCBiaW5kcyB2YXJpYWJsZSBuYW1lLCBvdGhlcndpc2UgTm9uZS4KKyAgICAgICAgSWYgb3B0aW9uYWwgYXJndW1lbnQgcGFja2FnZSBpcyBzdXBwbGllZCwgb25seSBpbXBvcnRzIHdpbGwKKyAgICAgICAgYmUgcmV0dXJuZWQuCisgICAgICAgIFNlZSB0ZXN0IGNhc2VzIGZvciBleGFtcGxlcy4iIiIKKyAgICBmb3IgY2hpbGQgaW4gbm9kZS5jaGlsZHJlbjoKKyAgICAgICAgcmV0ID0gTm9uZQorICAgICAgICBpZiBjaGlsZC50eXBlID09IHN5bXMuZm9yX3N0bXQ6CisgICAgICAgICAgICBpZiBfZmluZChuYW1lLCBjaGlsZC5jaGlsZHJlblsxXSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkCisgICAgICAgICAgICBuID0gZmluZF9iaW5kaW5nKG5hbWUsIG1ha2Vfc3VpdGUoY2hpbGQuY2hpbGRyZW5bLTFdKSwgcGFja2FnZSkKKyAgICAgICAgICAgIGlmIG46IHJldCA9IG4KKyAgICAgICAgZWxpZiBjaGlsZC50eXBlIGluIChzeW1zLmlmX3N0bXQsIHN5bXMud2hpbGVfc3RtdCk6CisgICAgICAgICAgICBuID0gZmluZF9iaW5kaW5nKG5hbWUsIG1ha2Vfc3VpdGUoY2hpbGQuY2hpbGRyZW5bLTFdKSwgcGFja2FnZSkKKyAgICAgICAgICAgIGlmIG46IHJldCA9IG4KKyAgICAgICAgZWxpZiBjaGlsZC50eXBlID09IHN5bXMudHJ5X3N0bXQ6CisgICAgICAgICAgICBuID0gZmluZF9iaW5kaW5nKG5hbWUsIG1ha2Vfc3VpdGUoY2hpbGQuY2hpbGRyZW5bMl0pLCBwYWNrYWdlKQorICAgICAgICAgICAgaWYgbjoKKyAgICAgICAgICAgICAgICByZXQgPSBuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBpLCBraWQgaW4gZW51bWVyYXRlKGNoaWxkLmNoaWxkcmVuWzM6XSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGtpZC50eXBlID09IHRva2VuLkNPTE9OIGFuZCBraWQudmFsdWUgPT0gIjoiOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBpKzMgaXMgdGhlIGNvbG9uLCBpKzQgaXMgdGhlIHN1aXRlCisgICAgICAgICAgICAgICAgICAgICAgICBuID0gZmluZF9iaW5kaW5nKG5hbWUsIG1ha2Vfc3VpdGUoY2hpbGQuY2hpbGRyZW5baSs0XSksIHBhY2thZ2UpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBuOiByZXQgPSBuCisgICAgICAgIGVsaWYgY2hpbGQudHlwZSBpbiBfZGVmX3N5bXMgYW5kIGNoaWxkLmNoaWxkcmVuWzFdLnZhbHVlID09IG5hbWU6CisgICAgICAgICAgICByZXQgPSBjaGlsZAorICAgICAgICBlbGlmIF9pc19pbXBvcnRfYmluZGluZyhjaGlsZCwgbmFtZSwgcGFja2FnZSk6CisgICAgICAgICAgICByZXQgPSBjaGlsZAorICAgICAgICBlbGlmIGNoaWxkLnR5cGUgPT0gc3ltcy5zaW1wbGVfc3RtdDoKKyAgICAgICAgICAgIHJldCA9IGZpbmRfYmluZGluZyhuYW1lLCBjaGlsZCwgcGFja2FnZSkKKyAgICAgICAgZWxpZiBjaGlsZC50eXBlID09IHN5bXMuZXhwcl9zdG10OgorICAgICAgICAgICAgaWYgX2ZpbmQobmFtZSwgY2hpbGQuY2hpbGRyZW5bMF0pOgorICAgICAgICAgICAgICAgIHJldCA9IGNoaWxkCisKKyAgICAgICAgaWYgcmV0OgorICAgICAgICAgICAgaWYgbm90IHBhY2thZ2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldAorICAgICAgICAgICAgaWYgaXNfaW1wb3J0KHJldCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldAorICAgIHJldHVybiBOb25lCisKK19ibG9ja19zeW1zID0gc2V0KFtzeW1zLmZ1bmNkZWYsIHN5bXMuY2xhc3NkZWYsIHN5bXMudHJhaWxlcl0pCitkZWYgX2ZpbmQobmFtZSwgbm9kZSk6CisgICAgbm9kZXMgPSBbbm9kZV0KKyAgICB3aGlsZSBub2RlczoKKyAgICAgICAgbm9kZSA9IG5vZGVzLnBvcCgpCisgICAgICAgIGlmIG5vZGUudHlwZSA+IDI1NiBhbmQgbm9kZS50eXBlIG5vdCBpbiBfYmxvY2tfc3ltczoKKyAgICAgICAgICAgIG5vZGVzLmV4dGVuZChub2RlLmNoaWxkcmVuKQorICAgICAgICBlbGlmIG5vZGUudHlwZSA9PSB0b2tlbi5OQU1FIGFuZCBub2RlLnZhbHVlID09IG5hbWU6CisgICAgICAgICAgICByZXR1cm4gbm9kZQorICAgIHJldHVybiBOb25lCisKK2RlZiBfaXNfaW1wb3J0X2JpbmRpbmcobm9kZSwgbmFtZSwgcGFja2FnZT1Ob25lKToKKyAgICAiIiIgV2lsbCByZXV0dXJuIG5vZGUgaWYgbm9kZSB3aWxsIGltcG9ydCBuYW1lLCBvciBub2RlCisgICAgICAgIHdpbGwgaW1wb3J0ICogZnJvbSBwYWNrYWdlLiAgTm9uZSBpcyByZXR1cm5lZCBvdGhlcndpc2UuCisgICAgICAgIFNlZSB0ZXN0IGNhc2VzIGZvciBleGFtcGxlcy4gIiIiCisKKyAgICBpZiBub2RlLnR5cGUgPT0gc3ltcy5pbXBvcnRfbmFtZSBhbmQgbm90IHBhY2thZ2U6CisgICAgICAgIGltcCA9IG5vZGUuY2hpbGRyZW5bMV0KKyAgICAgICAgaWYgaW1wLnR5cGUgPT0gc3ltcy5kb3R0ZWRfYXNfbmFtZXM6CisgICAgICAgICAgICBmb3IgY2hpbGQgaW4gaW1wLmNoaWxkcmVuOgorICAgICAgICAgICAgICAgIGlmIGNoaWxkLnR5cGUgPT0gc3ltcy5kb3R0ZWRfYXNfbmFtZToKKyAgICAgICAgICAgICAgICAgICAgaWYgY2hpbGQuY2hpbGRyZW5bMl0udmFsdWUgPT0gbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlCisgICAgICAgICAgICAgICAgZWxpZiBjaGlsZC50eXBlID09IHRva2VuLk5BTUUgYW5kIGNoaWxkLnZhbHVlID09IG5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlCisgICAgICAgIGVsaWYgaW1wLnR5cGUgPT0gc3ltcy5kb3R0ZWRfYXNfbmFtZToKKyAgICAgICAgICAgIGxhc3QgPSBpbXAuY2hpbGRyZW5bLTFdCisgICAgICAgICAgICBpZiBsYXN0LnR5cGUgPT0gdG9rZW4uTkFNRSBhbmQgbGFzdC52YWx1ZSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBub2RlCisgICAgICAgIGVsaWYgaW1wLnR5cGUgPT0gdG9rZW4uTkFNRSBhbmQgaW1wLnZhbHVlID09IG5hbWU6CisgICAgICAgICAgICByZXR1cm4gbm9kZQorICAgIGVsaWYgbm9kZS50eXBlID09IHN5bXMuaW1wb3J0X2Zyb206CisgICAgICAgICMgdW5pY29kZSguLi4pIGlzIHVzZWQgdG8gbWFrZSBsaWZlIGVhc2llciBoZXJlLCBiZWNhdXNlCisgICAgICAgICMgZnJvbSBhLmIgaW1wb3J0IHBhcnNlcyB0byBbJ2ltcG9ydCcsIFsnYScsICcuJywgJ2InXSwgLi4uXQorICAgICAgICBpZiBwYWNrYWdlIGFuZCB1bmljb2RlKG5vZGUuY2hpbGRyZW5bMV0pLnN0cmlwKCkgIT0gcGFja2FnZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIG4gPSBub2RlLmNoaWxkcmVuWzNdCisgICAgICAgIGlmIHBhY2thZ2UgYW5kIF9maW5kKHUiYXMiLCBuKToKKyAgICAgICAgICAgICMgU2VlIHRlc3RfZnJvbV9pbXBvcnRfYXMgZm9yIGV4cGxhbmF0aW9uCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbGlmIG4udHlwZSA9PSBzeW1zLmltcG9ydF9hc19uYW1lcyBhbmQgX2ZpbmQobmFtZSwgbik6CisgICAgICAgICAgICByZXR1cm4gbm9kZQorICAgICAgICBlbGlmIG4udHlwZSA9PSBzeW1zLmltcG9ydF9hc19uYW1lOgorICAgICAgICAgICAgY2hpbGQgPSBuLmNoaWxkcmVuWzJdCisgICAgICAgICAgICBpZiBjaGlsZC50eXBlID09IHRva2VuLk5BTUUgYW5kIGNoaWxkLnZhbHVlID09IG5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUKKyAgICAgICAgZWxpZiBuLnR5cGUgPT0gdG9rZW4uTkFNRSBhbmQgbi52YWx1ZSA9PSBuYW1lOgorICAgICAgICAgICAgcmV0dXJuIG5vZGUKKyAgICAgICAgZWxpZiBwYWNrYWdlIGFuZCBuLnR5cGUgPT0gdG9rZW4uU1RBUjoKKyAgICAgICAgICAgIHJldHVybiBub2RlCisgICAgcmV0dXJuIE5vbmUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcl91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcl91dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGYzNGJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcl91dGlsLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcl91dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGYzNGJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTMwNTRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKKyMgRHVtbXkgZmlsZSB0byBtYWtlIHRoaXMgZGlyZWN0b3J5IGEgcGFja2FnZS4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDQwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDQwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYXBwbHkucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2FwcGx5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZGMzYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2FwcGx5LnB5CkBAIC0wLDAgKzEsNTkgQEAKKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgZm9yIGFwcGx5KCkuCisKK1RoaXMgY29udmVydHMgYXBwbHkoZnVuYywgdiwgaykgaW50byAoZnVuYykoKnYsICoqaykuIiIiCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgcHl0cmVlCitmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgQ2FsbCwgQ29tbWEsIHBhcmVudGhlc2l6ZQorCitjbGFzcyBGaXhBcHBseShmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisKKyAgICBQQVRURVJOID0gIiIiCisgICAgcG93ZXI8ICdhcHBseScKKyAgICAgICAgdHJhaWxlcjwKKyAgICAgICAgICAgICcoJworICAgICAgICAgICAgYXJnbGlzdDwKKyAgICAgICAgICAgICAgICAobm90IGFyZ3VtZW50PE5BTUUgJz0nIGFueT4pIGZ1bmM9YW55ICcsJworICAgICAgICAgICAgICAgIChub3QgYXJndW1lbnQ8TkFNRSAnPScgYW55PikgYXJncz1hbnkgWycsJworICAgICAgICAgICAgICAgIChub3QgYXJndW1lbnQ8TkFNRSAnPScgYW55Pikga3dkcz1hbnldIFsnLCddCisgICAgICAgICAgICA+CisgICAgICAgICAgICAnKScKKyAgICAgICAgPgorICAgID4KKyAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIHN5bXMgPSBzZWxmLnN5bXMKKyAgICAgICAgYXNzZXJ0IHJlc3VsdHMKKyAgICAgICAgZnVuYyA9IHJlc3VsdHNbImZ1bmMiXQorICAgICAgICBhcmdzID0gcmVzdWx0c1siYXJncyJdCisgICAgICAgIGt3ZHMgPSByZXN1bHRzLmdldCgia3dkcyIpCisgICAgICAgIHByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgIGZ1bmMgPSBmdW5jLmNsb25lKCkKKyAgICAgICAgaWYgKGZ1bmMudHlwZSBub3QgaW4gKHRva2VuLk5BTUUsIHN5bXMuYXRvbSkgYW5kCisgICAgICAgICAgICAoZnVuYy50eXBlICE9IHN5bXMucG93ZXIgb3IKKyAgICAgICAgICAgICBmdW5jLmNoaWxkcmVuWy0yXS50eXBlID09IHRva2VuLkRPVUJMRVNUQVIpKToKKyAgICAgICAgICAgICMgTmVlZCB0byBwYXJlbnRoZXNpemUKKyAgICAgICAgICAgIGZ1bmMgPSBwYXJlbnRoZXNpemUoZnVuYykKKyAgICAgICAgZnVuYy5wcmVmaXggPSAiIgorICAgICAgICBhcmdzID0gYXJncy5jbG9uZSgpCisgICAgICAgIGFyZ3MucHJlZml4ID0gIiIKKyAgICAgICAgaWYga3dkcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGt3ZHMgPSBrd2RzLmNsb25lKCkKKyAgICAgICAgICAgIGt3ZHMucHJlZml4ID0gIiIKKyAgICAgICAgbF9uZXdhcmdzID0gW3B5dHJlZS5MZWFmKHRva2VuLlNUQVIsIHUiKiIpLCBhcmdzXQorICAgICAgICBpZiBrd2RzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbF9uZXdhcmdzLmV4dGVuZChbQ29tbWEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5dHJlZS5MZWFmKHRva2VuLkRPVUJMRVNUQVIsIHUiKioiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3ZHNdKQorICAgICAgICAgICAgbF9uZXdhcmdzWy0yXS5wcmVmaXggPSB1IiAiICMgdGhhdCdzIHRoZSAqKiB0b2tlbgorICAgICAgICAjIFhYWCBTb21ldGltZXMgd2UgY291bGQgYmUgY2xldmVyZXIsIGUuZy4gYXBwbHkoZiwgKHgsIHkpICsgdCkKKyAgICAgICAgIyBjYW4gYmUgdHJhbnNsYXRlZCBpbnRvIGYoeCwgeSwgKnQpIGluc3RlYWQgb2YgZigqKHgsIHkpICsgdCkKKyAgICAgICAgI25ldyA9IHB5dHJlZS5Ob2RlKHN5bXMucG93ZXIsIChmdW5jLCBBcmdMaXN0KGxfbmV3YXJncykpKQorICAgICAgICByZXR1cm4gQ2FsbChmdW5jLCBsX25ld2FyZ3MsIHByZWZpeD1wcmVmaXgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2FwcGx5LnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYXBwbHkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzRkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2FwcGx5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2FwcGx5LnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYXBwbHkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OGM2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2FwcGx5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Jhc2VzdHJpbmcucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Jhc2VzdHJpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjOWE0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYmFzZXN0cmluZy5weQpAQCAtMCwwICsxLDE0IEBACisiIiJGaXhlciBmb3IgYmFzZXN0cmluZyAtPiBzdHIuIiIiCisjIEF1dGhvcjogQ2hyaXN0aWFuIEhlaW1lcworCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lCisKK2NsYXNzIEZpeEJhc2VzdHJpbmcoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorCisgICAgUEFUVEVSTiA9ICInYmFzZXN0cmluZyciCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICByZXR1cm4gTmFtZSh1InN0ciIsIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYmFzZXN0cmluZy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Jhc2VzdHJpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDA3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Jhc2VzdHJpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYmFzZXN0cmluZy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Jhc2VzdHJpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMDA3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Jhc2VzdHJpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYnVmZmVyLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9idWZmZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZiMDkyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYnVmZmVyLnB5CkBAIC0wLDAgKzEsMjIgQEAKKyMgQ29weXJpZ2h0IDIwMDcgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgdGhhdCBjaGFuZ2VzIGJ1ZmZlciguLi4pIGludG8gbWVtb3J5dmlldyguLi4pLiIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lCisKKworY2xhc3MgRml4QnVmZmVyKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIGV4cGxpY2l0ID0gVHJ1ZSAjIFRoZSB1c2VyIG11c3QgYXNrIGZvciB0aGlzIGZpeGVyCisKKyAgICBQQVRURVJOID0gIiIiCisgICAgICAgICAgICAgIHBvd2VyPCBuYW1lPSdidWZmZXInIHRyYWlsZXI8ICcoJyBbYW55XSAnKScgPiBhbnkqID4KKyAgICAgICAgICAgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBuYW1lID0gcmVzdWx0c1sibmFtZSJdCisgICAgICAgIG5hbWUucmVwbGFjZShOYW1lKHUibWVtb3J5dmlldyIsIHByZWZpeD1uYW1lLnByZWZpeCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2J1ZmZlci5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2J1ZmZlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlN2UzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYnVmZmVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2J1ZmZlci5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2J1ZmZlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlN2UzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYnVmZmVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2NhbGxhYmxlLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9jYWxsYWJsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjMzZDYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9jYWxsYWJsZS5weQpAQCAtMCwwICsxLDM3IEBACisjIENvcHlyaWdodCAyMDA3IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkZpeGVyIGZvciBjYWxsYWJsZSgpLgorCitUaGlzIGNvbnZlcnRzIGNhbGxhYmxlKG9iaikgaW50byBpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuQ2FsbGFibGUpLCBhZGRpbmcgYQorY29sbGVjdGlvbnMgaW1wb3J0IGlmIG5lZWRlZC4iIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIGxpYjJ0bzMgaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gbGliMnRvMy5maXhlcl91dGlsIGltcG9ydCBDYWxsLCBOYW1lLCBTdHJpbmcsIEF0dHIsIHRvdWNoX2ltcG9ydAorCitjbGFzcyBGaXhDYWxsYWJsZShmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisKKyAgICBvcmRlciA9ICJwcmUiCisKKyAgICAjIElnbm9yZSBjYWxsYWJsZSgqYXJncykgb3IgdXNlIG9mIGtleXdvcmRzLgorICAgICMgRWl0aGVyIGNvdWxkIGJlIGEgaGludCB0aGF0IHRoZSBidWlsdGluIGNhbGxhYmxlKCkgaXMgbm90IGJlaW5nIHVzZWQuCisgICAgUEFUVEVSTiA9ICIiIgorICAgIHBvd2VyPCAnY2FsbGFibGUnCisgICAgICAgICAgIHRyYWlsZXI8IGxwYXI9JygnCisgICAgICAgICAgICAgICAgICAgICggbm90KGFyZ2xpc3QgfCBhcmd1bWVudDxhbnkgJz0nIGFueT4pIGZ1bmM9YW55CisgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jPWFyZ2xpc3Q8KG5vdCBhcmd1bWVudDxhbnkgJz0nIGFueT4pIGFueSAnLCc+ICkKKyAgICAgICAgICAgICAgICAgICAgcnBhcj0nKScgPgorICAgICAgICAgICBhZnRlcj1hbnkqCisgICAgPgorICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgZnVuYyA9IHJlc3VsdHNbJ2Z1bmMnXQorCisgICAgICAgIHRvdWNoX2ltcG9ydChOb25lLCB1J2NvbGxlY3Rpb25zJywgbm9kZT1ub2RlKQorCisgICAgICAgIGFyZ3MgPSBbZnVuYy5jbG9uZSgpLCBTdHJpbmcodScsICcpXQorICAgICAgICBhcmdzLmV4dGVuZChBdHRyKE5hbWUodSdjb2xsZWN0aW9ucycpLCBOYW1lKHUnQ2FsbGFibGUnKSkpCisgICAgICAgIHJldHVybiBDYWxsKE5hbWUodSdpc2luc3RhbmNlJyksIGFyZ3MsIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfY2FsbGFibGUucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9jYWxsYWJsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwZjc4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfY2FsbGFibGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfY2FsbGFibGUucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9jYWxsYWJsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwZjc4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfY2FsbGFibGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZGljdC5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZGljdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjgxZTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5CkBAIC0wLDAgKzEsMTA3IEBACisjIENvcHlyaWdodCAyMDA3IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkZpeGVyIGZvciBkaWN0IG1ldGhvZHMuCisKK2Qua2V5cygpIC0+IGxpc3QoZC5rZXlzKCkpCitkLml0ZW1zKCkgLT4gbGlzdChkLml0ZW1zKCkpCitkLnZhbHVlcygpIC0+IGxpc3QoZC52YWx1ZXMoKSkKKworZC5pdGVya2V5cygpIC0+IGl0ZXIoZC5rZXlzKCkpCitkLml0ZXJpdGVtcygpIC0+IGl0ZXIoZC5pdGVtcygpKQorZC5pdGVydmFsdWVzKCkgLT4gaXRlcihkLnZhbHVlcygpKQorCitkLnZpZXdrZXlzKCkgLT4gZC5rZXlzKCkKK2Qudmlld2l0ZW1zKCkgLT4gZC5pdGVtcygpCitkLnZpZXd2YWx1ZXMoKSAtPiBkLnZhbHVlcygpCisKK0V4Y2VwdCBpbiBjZXJ0YWluIHZlcnkgc3BlY2lmaWMgY29udGV4dHM6IHRoZSBpdGVyKCkgY2FuIGJlIGRyb3BwZWQKK3doZW4gdGhlIGNvbnRleHQgaXMgbGlzdCgpLCBzb3J0ZWQoKSwgaXRlcigpIG9yIGZvci4uLmluOyB0aGUgbGlzdCgpCitjYW4gYmUgZHJvcHBlZCB3aGVuIHRoZSBjb250ZXh0IGlzIGxpc3QoKSBvciBzb3J0ZWQoKSAoYnV0IG5vdCBpdGVyKCkKK29yIGZvci4uLmluISkuIFNwZWNpYWwgY29udGV4dHMgdGhhdCBhcHBseSB0byBib3RoOiBsaXN0KCksIHNvcnRlZCgpLCB0dXBsZSgpCitzZXQoKSwgYW55KCksIGFsbCgpLCBzdW0oKS4KKworTm90ZTogaXRlcihkLmtleXMoKSkgY291bGQgYmUgd3JpdHRlbiBhcyBpdGVyKGQpIGJ1dCBzaW5jZSB0aGUKK29yaWdpbmFsIGQuaXRlcmtleXMoKSB3YXMgYWxzbyByZWR1bmRhbnQgd2UgZG9uJ3QgZml4IHRoaXMuICBBbmQgdGhlcmUKK2FyZSAocmFyZSkgY29udGV4dHMgd2hlcmUgaXQgbWFrZXMgYSBkaWZmZXJlbmNlIChlLmcuIHdoZW4gcGFzc2luZyBpdAorYXMgYW4gYXJndW1lbnQgdG8gYSBmdW5jdGlvbiB0aGF0IGludHJvc3BlY3RzIHRoZSBhcmd1bWVudCkuCisiIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBweXRyZWUKK2Zyb20gLi4gaW1wb3J0IHBhdGNvbXAKK2Zyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBMUGFyZW4sIFJQYXJlbiwgQXJnTGlzdCwgRG90Citmcm9tIC4uIGltcG9ydCBmaXhlcl91dGlsCisKKworaXRlcl9leGVtcHQgPSBmaXhlcl91dGlsLmNvbnN1bWluZ19jYWxscyB8IHNldChbIml0ZXIiXSkKKworCitjbGFzcyBGaXhEaWN0KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICBwb3dlcjwgaGVhZD1hbnkrCisgICAgICAgICB0cmFpbGVyPCAnLicgbWV0aG9kPSgna2V5cyd8J2l0ZW1zJ3wndmFsdWVzJ3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpdGVya2V5cyd8J2l0ZXJpdGVtcyd8J2l0ZXJ2YWx1ZXMnfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpZXdrZXlzJ3wndmlld2l0ZW1zJ3wndmlld3ZhbHVlcycpID4KKyAgICAgICAgIHBhcmVucz10cmFpbGVyPCAnKCcgJyknID4KKyAgICAgICAgIHRhaWw9YW55KgorICAgID4KKyAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGhlYWQgPSByZXN1bHRzWyJoZWFkIl0KKyAgICAgICAgbWV0aG9kID0gcmVzdWx0c1sibWV0aG9kIl1bMF0gIyBFeHRyYWN0IG5vZGUgZm9yIG1ldGhvZCBuYW1lCisgICAgICAgIHRhaWwgPSByZXN1bHRzWyJ0YWlsIl0KKyAgICAgICAgc3ltcyA9IHNlbGYuc3ltcworICAgICAgICBtZXRob2RfbmFtZSA9IG1ldGhvZC52YWx1ZQorICAgICAgICBpc2l0ZXIgPSBtZXRob2RfbmFtZS5zdGFydHN3aXRoKHUiaXRlciIpCisgICAgICAgIGlzdmlldyA9IG1ldGhvZF9uYW1lLnN0YXJ0c3dpdGgodSJ2aWV3IikKKyAgICAgICAgaWYgaXNpdGVyIG9yIGlzdmlldzoKKyAgICAgICAgICAgIG1ldGhvZF9uYW1lID0gbWV0aG9kX25hbWVbNDpdCisgICAgICAgIGFzc2VydCBtZXRob2RfbmFtZSBpbiAodSJrZXlzIiwgdSJpdGVtcyIsIHUidmFsdWVzIiksIHJlcHIobWV0aG9kKQorICAgICAgICBoZWFkID0gW24uY2xvbmUoKSBmb3IgbiBpbiBoZWFkXQorICAgICAgICB0YWlsID0gW24uY2xvbmUoKSBmb3IgbiBpbiB0YWlsXQorICAgICAgICBzcGVjaWFsID0gbm90IHRhaWwgYW5kIHNlbGYuaW5fc3BlY2lhbF9jb250ZXh0KG5vZGUsIGlzaXRlcikKKyAgICAgICAgYXJncyA9IGhlYWQgKyBbcHl0cmVlLk5vZGUoc3ltcy50cmFpbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRG90KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lKG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9bWV0aG9kLnByZWZpeCldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1sicGFyZW5zIl0uY2xvbmUoKV0KKyAgICAgICAgbmV3ID0gcHl0cmVlLk5vZGUoc3ltcy5wb3dlciwgYXJncykKKyAgICAgICAgaWYgbm90IChzcGVjaWFsIG9yIGlzdmlldyk6CisgICAgICAgICAgICBuZXcucHJlZml4ID0gdSIiCisgICAgICAgICAgICBuZXcgPSBDYWxsKE5hbWUodSJpdGVyIiBpZiBpc2l0ZXIgZWxzZSB1Imxpc3QiKSwgW25ld10pCisgICAgICAgIGlmIHRhaWw6CisgICAgICAgICAgICBuZXcgPSBweXRyZWUuTm9kZShzeW1zLnBvd2VyLCBbbmV3XSArIHRhaWwpCisgICAgICAgIG5ldy5wcmVmaXggPSBub2RlLnByZWZpeAorICAgICAgICByZXR1cm4gbmV3CisKKyAgICBQMSA9ICJwb3dlcjwgZnVuYz1OQU1FIHRyYWlsZXI8ICcoJyBub2RlPWFueSAnKScgPiBhbnkqID4iCisgICAgcDEgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybihQMSkKKworICAgIFAyID0gIiIiZm9yX3N0bXQ8ICdmb3InIGFueSAnaW4nIG5vZGU9YW55ICc6JyBhbnkqID4KKyAgICAgICAgICAgIHwgY29tcF9mb3I8ICdmb3InIGFueSAnaW4nIG5vZGU9YW55IGFueSogPgorICAgICAgICAgIiIiCisgICAgcDIgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybihQMikKKworICAgIGRlZiBpbl9zcGVjaWFsX2NvbnRleHQoc2VsZiwgbm9kZSwgaXNpdGVyKToKKyAgICAgICAgaWYgbm9kZS5wYXJlbnQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXN1bHRzID0ge30KKyAgICAgICAgaWYgKG5vZGUucGFyZW50LnBhcmVudCBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgIHNlbGYucDEubWF0Y2gobm9kZS5wYXJlbnQucGFyZW50LCByZXN1bHRzKSBhbmQKKyAgICAgICAgICAgICAgIHJlc3VsdHNbIm5vZGUiXSBpcyBub2RlKToKKyAgICAgICAgICAgIGlmIGlzaXRlcjoKKyAgICAgICAgICAgICAgICAjIGl0ZXIoZC5pdGVya2V5cygpKSAtPiBpdGVyKGQua2V5cygpKSwgZXRjLgorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzWyJmdW5jIl0udmFsdWUgaW4gaXRlcl9leGVtcHQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBsaXN0KGQua2V5cygpKSAtPiBsaXN0KGQua2V5cygpKSwgZXRjLgorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzWyJmdW5jIl0udmFsdWUgaW4gZml4ZXJfdXRpbC5jb25zdW1pbmdfY2FsbHMKKyAgICAgICAgaWYgbm90IGlzaXRlcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAjIGZvciAuLi4gaW4gZC5pdGVya2V5cygpIC0+IGZvciAuLi4gaW4gZC5rZXlzKCksIGV0Yy4KKyAgICAgICAgcmV0dXJuIHNlbGYucDIubWF0Y2gobm9kZS5wYXJlbnQsIHJlc3VsdHMpIGFuZCByZXN1bHRzWyJub2RlIl0gaXMgbm9kZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZGljdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyN2U5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZGljdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZGljdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjN2UxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZGljdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGNlcHQucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4Y2VwdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI0NzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGNlcHQucHkKQEAgLTAsMCArMSw5MyBAQAorIiIiRml4ZXIgZm9yIGV4Y2VwdCBzdGF0ZW1lbnRzIHdpdGggbmFtZWQgZXhjZXB0aW9ucy4KKworVGhlIGZvbGxvd2luZyBjYXNlcyB3aWxsIGJlIGNvbnZlcnRlZDoKKworLSAiZXhjZXB0IEUsIFQ6IiB3aGVyZSBUIGlzIGEgbmFtZToKKworICAgIGV4Y2VwdCBFIGFzIFQ6CisKKy0gImV4Y2VwdCBFLCBUOiIgd2hlcmUgVCBpcyBub3QgYSBuYW1lLCB0dXBsZSBvciBsaXN0OgorCisgICAgICAgIGV4Y2VwdCBFIGFzIHQ6CisgICAgICAgICAgICBUID0gdAorCisgICAgVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlIHRhcmdldCBvZiBhbiAiZXhjZXB0IiBjbGF1c2UgbXVzdCBiZSBhCisgICAgbmFtZS4KKworLSAiZXhjZXB0IEUsIFQ6IiB3aGVyZSBUIGlzIGEgdHVwbGUgb3IgbGlzdCBsaXRlcmFsOgorCisgICAgICAgIGV4Y2VwdCBFIGFzIHQ6CisgICAgICAgICAgICBUID0gdC5hcmdzCisiIiIKKyMgQXV0aG9yOiBDb2xsaW4gV2ludGVyCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgcHl0cmVlCitmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgQXNzaWduLCBBdHRyLCBOYW1lLCBpc190dXBsZSwgaXNfbGlzdCwgc3ltcworCitkZWYgZmluZF9leGNlcHRzKG5vZGVzKToKKyAgICBmb3IgaSwgbiBpbiBlbnVtZXJhdGUobm9kZXMpOgorICAgICAgICBpZiBuLnR5cGUgPT0gc3ltcy5leGNlcHRfY2xhdXNlOgorICAgICAgICAgICAgaWYgbi5jaGlsZHJlblswXS52YWx1ZSA9PSB1J2V4Y2VwdCc6CisgICAgICAgICAgICAgICAgeWllbGQgKG4sIG5vZGVzW2krMl0pCisKK2NsYXNzIEZpeEV4Y2VwdChmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisKKyAgICBQQVRURVJOID0gIiIiCisgICAgdHJ5X3N0bXQ8ICd0cnknICc6JyAoc2ltcGxlX3N0bXQgfCBzdWl0ZSkKKyAgICAgICAgICAgICAgICAgIGNsZWFudXA9KGV4Y2VwdF9jbGF1c2UgJzonIChzaW1wbGVfc3RtdCB8IHN1aXRlKSkrCisgICAgICAgICAgICAgICAgICB0YWlsPShbJ2V4Y2VwdCcgJzonIChzaW1wbGVfc3RtdCB8IHN1aXRlKV0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsnZWxzZScgJzonIChzaW1wbGVfc3RtdCB8IHN1aXRlKV0KKyAgICAgICAgICAgICAgICAgICAgICAgIFsnZmluYWxseScgJzonIChzaW1wbGVfc3RtdCB8IHN1aXRlKV0pID4KKyAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIHN5bXMgPSBzZWxmLnN5bXMKKworICAgICAgICB0YWlsID0gW24uY2xvbmUoKSBmb3IgbiBpbiByZXN1bHRzWyJ0YWlsIl1dCisKKyAgICAgICAgdHJ5X2NsZWFudXAgPSBbY2guY2xvbmUoKSBmb3IgY2ggaW4gcmVzdWx0c1siY2xlYW51cCJdXQorICAgICAgICBmb3IgZXhjZXB0X2NsYXVzZSwgZV9zdWl0ZSBpbiBmaW5kX2V4Y2VwdHModHJ5X2NsZWFudXApOgorICAgICAgICAgICAgaWYgbGVuKGV4Y2VwdF9jbGF1c2UuY2hpbGRyZW4pID09IDQ6CisgICAgICAgICAgICAgICAgKEUsIGNvbW1hLCBOKSA9IGV4Y2VwdF9jbGF1c2UuY2hpbGRyZW5bMTo0XQorICAgICAgICAgICAgICAgIGNvbW1hLnJlcGxhY2UoTmFtZSh1ImFzIiwgcHJlZml4PXUiICIpKQorCisgICAgICAgICAgICAgICAgaWYgTi50eXBlICE9IHRva2VuLk5BTUU6CisgICAgICAgICAgICAgICAgICAgICMgR2VuZXJhdGUgYSBuZXcgTiBmb3IgdGhlIGV4Y2VwdCBjbGF1c2UKKyAgICAgICAgICAgICAgICAgICAgbmV3X04gPSBOYW1lKHNlbGYubmV3X25hbWUoKSwgcHJlZml4PXUiICIpCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IE4uY2xvbmUoKQorICAgICAgICAgICAgICAgICAgICB0YXJnZXQucHJlZml4ID0gdSIiCisgICAgICAgICAgICAgICAgICAgIE4ucmVwbGFjZShuZXdfTikKKyAgICAgICAgICAgICAgICAgICAgbmV3X04gPSBuZXdfTi5jbG9uZSgpCisKKyAgICAgICAgICAgICAgICAgICAgIyBJbnNlcnQgIm9sZF9OID0gbmV3X04iIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4KKyAgICAgICAgICAgICAgICAgICAgIyAgdGhlIGV4Y2VwdCBib2R5LiBUaGlzIGxvb3Agc2tpcHMgbGVhZGluZyB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgICAgICMgIGFuZCBpbmRlbnRzCisgICAgICAgICAgICAgICAgICAgICNUT0RPKGN3aW50ZXIpIHN1aXRlLWNsZWFudXAKKyAgICAgICAgICAgICAgICAgICAgc3VpdGVfc3RtdHMgPSBlX3N1aXRlLmNoaWxkcmVuCisgICAgICAgICAgICAgICAgICAgIGZvciBpLCBzdG10IGluIGVudW1lcmF0ZShzdWl0ZV9zdG10cyk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHN0bXQsIHB5dHJlZS5Ob2RlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgICAgICMgVGhlIGFzc2lnbm1lbnQgaXMgZGlmZmVyZW50IGlmIG9sZF9OIGlzIGEgdHVwbGUgb3IgbGlzdAorICAgICAgICAgICAgICAgICAgICAjIEluIHRoYXQgY2FzZSwgdGhlIGFzc2lnbm1lbnQgaXMgb2xkX04gPSBuZXdfTi5hcmdzCisgICAgICAgICAgICAgICAgICAgIGlmIGlzX3R1cGxlKE4pIG9yIGlzX2xpc3QoTik6CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24gPSBBc3NpZ24odGFyZ2V0LCBBdHRyKG5ld19OLCBOYW1lKHUnYXJncycpKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbiA9IEFzc2lnbih0YXJnZXQsIG5ld19OKQorCisgICAgICAgICAgICAgICAgICAgICNUT0RPKGN3aW50ZXIpIHN0b3BnYXAgdW50aWwgY2hpbGRyZW4gYmVjb21lcyBhIHNtYXJ0IGxpc3QKKyAgICAgICAgICAgICAgICAgICAgZm9yIGNoaWxkIGluIHJldmVyc2VkKHN1aXRlX3N0bXRzWzppXSk6CisgICAgICAgICAgICAgICAgICAgICAgICBlX3N1aXRlLmluc2VydF9jaGlsZCgwLCBjaGlsZCkKKyAgICAgICAgICAgICAgICAgICAgZV9zdWl0ZS5pbnNlcnRfY2hpbGQoaSwgYXNzaWduKQorICAgICAgICAgICAgICAgIGVsaWYgTi5wcmVmaXggPT0gdSIiOgorICAgICAgICAgICAgICAgICAgICAjIE5vIHNwYWNlIGFmdGVyIGEgY29tbWEgaXMgbGVnYWw7IG5vIHNwYWNlIGFmdGVyICJhcyIsCisgICAgICAgICAgICAgICAgICAgICMgbm90IHNvIG11Y2guCisgICAgICAgICAgICAgICAgICAgIE4ucHJlZml4ID0gdSIgIgorCisgICAgICAgICNUT0RPKGN3aW50ZXIpIGZpeCB0aGlzIHdoZW4gY2hpbGRyZW4gYmVjb21lcyBhIHNtYXJ0IGxpc3QKKyAgICAgICAgY2hpbGRyZW4gPSBbYy5jbG9uZSgpIGZvciBjIGluIG5vZGUuY2hpbGRyZW5bOjNdXSArIHRyeV9jbGVhbnVwICsgdGFpbAorICAgICAgICByZXR1cm4gcHl0cmVlLk5vZGUobm9kZS50eXBlLCBjaGlsZHJlbikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhjZXB0LnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhjZXB0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzE0ZWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGNlcHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhjZXB0LnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhjZXB0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzE0ZWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGNlcHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhlYy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhlYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGUxODU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5CkBAIC0wLDAgKzEsNDAgQEAKKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgZm9yIGV4ZWMuCisKK1RoaXMgY29udmVydHMgdXNhZ2VzIG9mIHRoZSBleGVjIHN0YXRlbWVudCBpbnRvIGNhbGxzIHRvIGEgYnVpbHQtaW4KK2V4ZWMoKSBmdW5jdGlvbi4KKworZXhlYyBjb2RlIGluIG5zMSwgbnMyIC0+IGV4ZWMoY29kZSwgbnMxLCBuczIpCisiIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBweXRyZWUKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBDb21tYSwgTmFtZSwgQ2FsbAorCisKK2NsYXNzIEZpeEV4ZWMoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorCisgICAgUEFUVEVSTiA9ICIiIgorICAgIGV4ZWNfc3RtdDwgJ2V4ZWMnIGE9YW55ICdpbicgYj1hbnkgWycsJyBjPWFueV0gPgorICAgIHwKKyAgICBleGVjX3N0bXQ8ICdleGVjJyAobm90IGF0b208JygnIFthbnldICcpJz4pIGE9YW55ID4KKyAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGFzc2VydCByZXN1bHRzCisgICAgICAgIHN5bXMgPSBzZWxmLnN5bXMKKyAgICAgICAgYSA9IHJlc3VsdHNbImEiXQorICAgICAgICBiID0gcmVzdWx0cy5nZXQoImIiKQorICAgICAgICBjID0gcmVzdWx0cy5nZXQoImMiKQorICAgICAgICBhcmdzID0gW2EuY2xvbmUoKV0KKyAgICAgICAgYXJnc1swXS5wcmVmaXggPSAiIgorICAgICAgICBpZiBiIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXJncy5leHRlbmQoW0NvbW1hKCksIGIuY2xvbmUoKV0pCisgICAgICAgIGlmIGMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhcmdzLmV4dGVuZChbQ29tbWEoKSwgYy5jbG9uZSgpXSkKKworICAgICAgICByZXR1cm4gQ2FsbChOYW1lKHUiZXhlYyIpLCBhcmdzLCBwcmVmaXg9bm9kZS5wcmVmaXgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWM3ZDUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzIyNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWNmaWxlLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjI5ZDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjZmlsZS5weQpAQCAtMCwwICsxLDUyIEBACisjIENvcHlyaWdodCAyMDA2IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkZpeGVyIGZvciBleGVjZmlsZS4KKworVGhpcyBjb252ZXJ0cyB1c2FnZXMgb2YgdGhlIGV4ZWNmaWxlIGZ1bmN0aW9uIGludG8gY2FsbHMgdG8gdGhlIGJ1aWx0LWluCitleGVjKCkgZnVuY3Rpb24uCisiIiIKKworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IChDb21tYSwgTmFtZSwgQ2FsbCwgTFBhcmVuLCBSUGFyZW4sIERvdCwgTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnTGlzdCwgU3RyaW5nLCBzeW1zKQorCisKK2NsYXNzIEZpeEV4ZWNmaWxlKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICBwb3dlcjwgJ2V4ZWNmaWxlJyB0cmFpbGVyPCAnKCcgYXJnbGlzdDwgZmlsZW5hbWU9YW55IFsnLCcgZ2xvYmFscz1hbnkgWycsJyBsb2NhbHM9YW55IF0gXSA+ICcpJyA+ID4KKyAgICB8CisgICAgcG93ZXI8ICdleGVjZmlsZScgdHJhaWxlcjwgJygnIGZpbGVuYW1lPWFueSAnKScgPiA+CisgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBhc3NlcnQgcmVzdWx0cworICAgICAgICBmaWxlbmFtZSA9IHJlc3VsdHNbImZpbGVuYW1lIl0KKyAgICAgICAgZ2xvYmFscyA9IHJlc3VsdHMuZ2V0KCJnbG9iYWxzIikKKyAgICAgICAgbG9jYWxzID0gcmVzdWx0cy5nZXQoImxvY2FscyIpCisKKyAgICAgICAgIyBDb3B5IG92ZXIgdGhlIHByZWZpeCBmcm9tIHRoZSByaWdodCBwYXJlbnRoZXNlcyBlbmQgb2YgdGhlIGV4ZWNmaWxlCisgICAgICAgICMgY2FsbC4KKyAgICAgICAgZXhlY2ZpbGVfcGFyZW4gPSBub2RlLmNoaWxkcmVuWy0xXS5jaGlsZHJlblstMV0uY2xvbmUoKQorICAgICAgICAjIENvbnN0cnVjdCBvcGVuKCkucmVhZCgpLgorICAgICAgICBvcGVuX2FyZ3MgPSBBcmdMaXN0KFtmaWxlbmFtZS5jbG9uZSgpXSwgcnBhcmVuPWV4ZWNmaWxlX3BhcmVuKQorICAgICAgICBvcGVuX2NhbGwgPSBOb2RlKHN5bXMucG93ZXIsIFtOYW1lKHUib3BlbiIpLCBvcGVuX2FyZ3NdKQorICAgICAgICByZWFkID0gW05vZGUoc3ltcy50cmFpbGVyLCBbRG90KCksIE5hbWUodSdyZWFkJyldKSwKKyAgICAgICAgICAgICAgICBOb2RlKHN5bXMudHJhaWxlciwgW0xQYXJlbigpLCBSUGFyZW4oKV0pXQorICAgICAgICBvcGVuX2V4cHIgPSBbb3Blbl9jYWxsXSArIHJlYWQKKyAgICAgICAgIyBXcmFwIHRoZSBvcGVuIGNhbGwgaW4gYSBjb21waWxlIGNhbGwuIFRoaXMgaXMgc28gdGhlIGZpbGVuYW1lIHdpbGwgYmUKKyAgICAgICAgIyBwcmVzZXJ2ZWQgaW4gdGhlIGV4ZWNlZCBjb2RlLgorICAgICAgICBmaWxlbmFtZV9hcmcgPSBmaWxlbmFtZS5jbG9uZSgpCisgICAgICAgIGZpbGVuYW1lX2FyZy5wcmVmaXggPSB1IiAiCisgICAgICAgIGV4ZWNfc3RyID0gU3RyaW5nKHUiJ2V4ZWMnIiwgdSIgIikKKyAgICAgICAgY29tcGlsZV9hcmdzID0gb3Blbl9leHByICsgW0NvbW1hKCksIGZpbGVuYW1lX2FyZywgQ29tbWEoKSwgZXhlY19zdHJdCisgICAgICAgIGNvbXBpbGVfY2FsbCA9IENhbGwoTmFtZSh1ImNvbXBpbGUiKSwgY29tcGlsZV9hcmdzLCB1IiIpCisgICAgICAgICMgRmluYWxseSwgcmVwbGFjZSB0aGUgZXhlY2ZpbGUgY2FsbCB3aXRoIGFuIGV4ZWMgY2FsbC4KKyAgICAgICAgYXJncyA9IFtjb21waWxlX2NhbGxdCisgICAgICAgIGlmIGdsb2JhbHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhcmdzLmV4dGVuZChbQ29tbWEoKSwgZ2xvYmFscy5jbG9uZSgpXSkKKyAgICAgICAgaWYgbG9jYWxzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXJncy5leHRlbmQoW0NvbW1hKCksIGxvY2Fscy5jbG9uZSgpXSkKKyAgICAgICAgcmV0dXJuIENhbGwoTmFtZSh1ImV4ZWMiKSwgYXJncywgcHJlZml4PW5vZGUucHJlZml4KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWNmaWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzBjMWZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWNmaWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWFkNjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGl0ZnVuYy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhpdGZ1bmMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmYjNkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhpdGZ1bmMucHkKQEAgLTAsMCArMSw3MiBAQAorIiIiCitDb252ZXJ0IHVzZSBvZiBzeXMuZXhpdGZ1bmMgdG8gdXNlIHRoZSBhdGV4aXQgbW9kdWxlLgorIiIiCisKKyMgQXV0aG9yOiBCZW5qYW1pbiBQZXRlcnNvbgorCitmcm9tIGxpYjJ0bzMgaW1wb3J0IHB5dHJlZSwgZml4ZXJfYmFzZQorZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIEF0dHIsIENhbGwsIENvbW1hLCBOZXdsaW5lLCBzeW1zCisKKworY2xhc3MgRml4RXhpdGZ1bmMoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBrZWVwX2xpbmVfb3JkZXIgPSBUcnVlCisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgc3lzX2ltcG9ydD1pbXBvcnRfbmFtZTwnaW1wb3J0JworICAgICAgICAgICAgICAgICAgICAgICgnc3lzJworICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICBkb3R0ZWRfYXNfbmFtZXM8IChhbnkgJywnKSogJ3N5cycgKCcsJyBhbnkpKiA+CisgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICBleHByX3N0bXQ8CisgICAgICAgICAgICAgICAgICAgICAgcG93ZXI8ICdzeXMnIHRyYWlsZXI8ICcuJyAnZXhpdGZ1bmMnID4gPgorICAgICAgICAgICAgICAgICAgJz0nIGZ1bmM9YW55ID4KKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHN1cGVyKEZpeEV4aXRmdW5jLCBzZWxmKS5fX2luaXRfXygqYXJncykKKworICAgIGRlZiBzdGFydF90cmVlKHNlbGYsIHRyZWUsIGZpbGVuYW1lKToKKyAgICAgICAgc3VwZXIoRml4RXhpdGZ1bmMsIHNlbGYpLnN0YXJ0X3RyZWUodHJlZSwgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuc3lzX2ltcG9ydCA9IE5vbmUKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgICMgRmlyc3QsIGZpbmQgYSB0aGUgc3lzIGltcG9ydC4gV2UnbGwganVzdCBob3BlIGl0J3MgZ2xvYmFsIHNjb3BlLgorICAgICAgICBpZiAic3lzX2ltcG9ydCIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIGlmIHNlbGYuc3lzX2ltcG9ydCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuc3lzX2ltcG9ydCA9IHJlc3VsdHNbInN5c19pbXBvcnQiXQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZnVuYyA9IHJlc3VsdHNbImZ1bmMiXS5jbG9uZSgpCisgICAgICAgIGZ1bmMucHJlZml4ID0gdSIiCisgICAgICAgIHJlZ2lzdGVyID0gcHl0cmVlLk5vZGUoc3ltcy5wb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyKE5hbWUodSJhdGV4aXQiKSwgTmFtZSh1InJlZ2lzdGVyIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBjYWxsID0gQ2FsbChyZWdpc3RlciwgW2Z1bmNdLCBub2RlLnByZWZpeCkKKyAgICAgICAgbm9kZS5yZXBsYWNlKGNhbGwpCisKKyAgICAgICAgaWYgc2VsZi5zeXNfaW1wb3J0IGlzIE5vbmU6CisgICAgICAgICAgICAjIFRoYXQncyBpbnRlcmVzdGluZy4KKyAgICAgICAgICAgIHNlbGYud2FybmluZyhub2RlLCAiQ2FuJ3QgZmluZCBzeXMgaW1wb3J0OyBQbGVhc2UgYWRkIGFuIGF0ZXhpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgYXQgdGhlIHRvcCBvZiB5b3VyIGZpbGUuIikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgTm93IGFkZCBhbiBhdGV4aXQgaW1wb3J0IGFmdGVyIHRoZSBzeXMgaW1wb3J0LgorICAgICAgICBuYW1lcyA9IHNlbGYuc3lzX2ltcG9ydC5jaGlsZHJlblsxXQorICAgICAgICBpZiBuYW1lcy50eXBlID09IHN5bXMuZG90dGVkX2FzX25hbWVzOgorICAgICAgICAgICAgbmFtZXMuYXBwZW5kX2NoaWxkKENvbW1hKCkpCisgICAgICAgICAgICBuYW1lcy5hcHBlbmRfY2hpbGQoTmFtZSh1ImF0ZXhpdCIsIHUiICIpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29udGFpbmluZ19zdG10ID0gc2VsZi5zeXNfaW1wb3J0LnBhcmVudAorICAgICAgICAgICAgcG9zaXRpb24gPSBjb250YWluaW5nX3N0bXQuY2hpbGRyZW4uaW5kZXgoc2VsZi5zeXNfaW1wb3J0KQorICAgICAgICAgICAgc3RtdF9jb250YWluZXIgPSBjb250YWluaW5nX3N0bXQucGFyZW50CisgICAgICAgICAgICBuZXdfaW1wb3J0ID0gcHl0cmVlLk5vZGUoc3ltcy5pbXBvcnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOYW1lKHUiaW1wb3J0IiksIE5hbWUodSJhdGV4aXQiLCB1IiAiKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIG5ldyA9IHB5dHJlZS5Ob2RlKHN5bXMuc2ltcGxlX3N0bXQsIFtuZXdfaW1wb3J0XSkKKyAgICAgICAgICAgIGNvbnRhaW5pbmdfc3RtdC5pbnNlcnRfY2hpbGQocG9zaXRpb24gKyAxLCBOZXdsaW5lKCkpCisgICAgICAgICAgICBjb250YWluaW5nX3N0bXQuaW5zZXJ0X2NoaWxkKHBvc2l0aW9uICsgMiwgbmV3KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGl0ZnVuYy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4aXRmdW5jLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlmODcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGl0ZnVuYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGl0ZnVuYy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4aXRmdW5jLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlmODcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGl0ZnVuYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9maWx0ZXIucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGVlMmZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9maWx0ZXIucHkKQEAgLTAsMCArMSw3NiBAQAorIyBDb3B5cmlnaHQgMjAwNyBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJGaXhlciB0aGF0IGNoYW5nZXMgZmlsdGVyKEYsIFgpIGludG8gbGlzdChmaWx0ZXIoRiwgWCkpLgorCitXZSBhdm9pZCB0aGUgdHJhbnNmb3JtYXRpb24gaWYgdGhlIGZpbHRlcigpIGNhbGwgaXMgZGlyZWN0bHkgY29udGFpbmVkCitpbiBpdGVyKDw+KSwgbGlzdCg8PiksIHR1cGxlKDw+KSwgc29ydGVkKDw+KSwgLi4uam9pbig8PiksIG9yCitmb3IgViBpbiA8PjouCisKK05PVEU6IFRoaXMgaXMgc3RpbGwgbm90IGNvcnJlY3QgaWYgdGhlIG9yaWdpbmFsIGNvZGUgd2FzIGRlcGVuZGluZyBvbgorZmlsdGVyKEYsIFgpIHRvIHJldHVybiBhIHN0cmluZyBpZiBYIGlzIGEgc3RyaW5nIGFuZCBhIHR1cGxlIGlmIFggaXMgYQordHVwbGUuICBUaGF0IHdvdWxkIHJlcXVpcmUgdHlwZSBpbmZlcmVuY2UsIHdoaWNoIHdlIGRvbid0IGRvLiAgTGV0CitQeXRob24gMi42IGZpZ3VyZSBpdCBvdXQuCisiIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgQ2FsbCwgTGlzdENvbXAsIGluX3NwZWNpYWxfY29udGV4dAorCitjbGFzcyBGaXhGaWx0ZXIoZml4ZXJfYmFzZS5Db25kaXRpb25hbEZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICBmaWx0ZXJfbGFtYmRhPXBvd2VyPAorICAgICAgICAnZmlsdGVyJworICAgICAgICB0cmFpbGVyPAorICAgICAgICAgICAgJygnCisgICAgICAgICAgICBhcmdsaXN0PAorICAgICAgICAgICAgICAgIGxhbWJkZWY8ICdsYW1iZGEnCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZwPU5BTUUgfCB2ZnBkZWY8ICcoJyBmcD1OQU1FICcpJz4gKSAnOicgeHA9YW55CisgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgICcsJworICAgICAgICAgICAgICAgIGl0PWFueQorICAgICAgICAgICAgPgorICAgICAgICAgICAgJyknCisgICAgICAgID4KKyAgICA+CisgICAgfAorICAgIHBvd2VyPAorICAgICAgICAnZmlsdGVyJworICAgICAgICB0cmFpbGVyPCAnKCcgYXJnbGlzdDwgbm9uZT0nTm9uZScgJywnIHNlcT1hbnkgPiAnKScgPgorICAgID4KKyAgICB8CisgICAgcG93ZXI8CisgICAgICAgICdmaWx0ZXInCisgICAgICAgIGFyZ3M9dHJhaWxlcjwgJygnIFthbnldICcpJyA+CisgICAgPgorICAgICIiIgorCisgICAgc2tpcF9vbiA9ICJmdXR1cmVfYnVpbHRpbnMuZmlsdGVyIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgaWYgc2VsZi5zaG91bGRfc2tpcChub2RlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmICJmaWx0ZXJfbGFtYmRhIiBpbiByZXN1bHRzOgorICAgICAgICAgICAgbmV3ID0gTGlzdENvbXAocmVzdWx0cy5nZXQoImZwIikuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZ2V0KCJmcCIpLmNsb25lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmdldCgiaXQiKS5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXQoInhwIikuY2xvbmUoKSkKKworICAgICAgICBlbGlmICJub25lIiBpbiByZXN1bHRzOgorICAgICAgICAgICAgbmV3ID0gTGlzdENvbXAoTmFtZSh1Il9mIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lKHUiX2YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbInNlcSJdLmNsb25lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lKHUiX2YiKSkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgaW5fc3BlY2lhbF9jb250ZXh0KG5vZGUpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBuZXcgPSBub2RlLmNsb25lKCkKKyAgICAgICAgICAgIG5ldy5wcmVmaXggPSB1IiIKKyAgICAgICAgICAgIG5ldyA9IENhbGwoTmFtZSh1Imxpc3QiKSwgW25ld10pCisgICAgICAgIG5ldy5wcmVmaXggPSBub2RlLnByZWZpeAorICAgICAgICByZXR1cm4gbmV3CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyYjhhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyYjhhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Z1bmNhdHRycy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnVuY2F0dHJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDVjMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Z1bmNhdHRycy5weQpAQCAtMCwwICsxLDIxIEBACisiIiJGaXggZnVuY3Rpb24gYXR0cmlidXRlIG5hbWVzIChmLmZ1bmNfeCAtPiBmLl9feF9fKS4iIiIKKyMgQXV0aG9yOiBDb2xsaW4gV2ludGVyCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUKKworCitjbGFzcyBGaXhGdW5jYXR0cnMoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorCisgICAgUEFUVEVSTiA9ICIiIgorICAgIHBvd2VyPCBhbnkrIHRyYWlsZXI8ICcuJyBhdHRyPSgnZnVuY19jbG9zdXJlJyB8ICdmdW5jX2RvYycgfCAnZnVuY19nbG9iYWxzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJ2Z1bmNfbmFtZScgfCAnZnVuY19kZWZhdWx0cycgfCAnZnVuY19jb2RlJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgJ2Z1bmNfZGljdCcpID4gYW55KiA+CisgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBhdHRyID0gcmVzdWx0c1siYXR0ciJdWzBdCisgICAgICAgIGF0dHIucmVwbGFjZShOYW1lKCh1Il9fJXNfXyIgJSBhdHRyLnZhbHVlWzU6XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1hdHRyLnByZWZpeCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Z1bmNhdHRycy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Z1bmNhdHRycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyM2U1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnVuY2F0dHJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Z1bmNhdHRycy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Z1bmNhdHRycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyM2U1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnVuY2F0dHJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Z1dHVyZS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnV0dXJlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiY2I4NmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Z1dHVyZS5weQpAQCAtMCwwICsxLDIyIEBACisiIiJSZW1vdmUgX19mdXR1cmVfXyBpbXBvcnRzCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZm9vIGlzIHJlcGxhY2VkIHdpdGggYW4gZW1wdHkgbGluZS4KKyIiIgorIyBBdXRob3I6IENocmlzdGlhbiBIZWltZXMKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgQmxhbmtMaW5lCisKK2NsYXNzIEZpeEZ1dHVyZShmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisKKyAgICBQQVRURVJOID0gIiIiaW1wb3J0X2Zyb208ICdmcm9tJyBtb2R1bGVfbmFtZT0iX19mdXR1cmVfXyIgJ2ltcG9ydCcgYW55ID4iIiIKKworICAgICMgVGhpcyBzaG91bGQgYmUgcnVuIGxhc3QgLS0gc29tZSB0aGluZ3MgY2hlY2sgZm9yIHRoZSBpbXBvcnQKKyAgICBydW5fb3JkZXIgPSAxMAorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgbmV3ID0gQmxhbmtMaW5lKCkKKyAgICAgICAgbmV3LnByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgIHJldHVybiBuZXcKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnV0dXJlLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnV0dXJlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjdkMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9mdXR1cmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnV0dXJlLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnV0dXJlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjdkMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9mdXR1cmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZ2V0Y3dkdS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZ2V0Y3dkdS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjIzM2M4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9nZXRjd2R1LnB5CkBAIC0wLDAgKzEsMTkgQEAKKyIiIgorRml4ZXIgdGhhdCBjaGFuZ2VzIG9zLmdldGN3ZHUoKSB0byBvcy5nZXRjd2QoKS4KKyIiIgorIyBBdXRob3I6IFZpY3RvciBTdGlubmVyCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUKKworY2xhc3MgRml4R2V0Y3dkdShmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisKKyAgICBQQVRURVJOID0gIiIiCisgICAgICAgICAgICAgIHBvd2VyPCAnb3MnIHRyYWlsZXI8IGRvdD0nLicgbmFtZT0nZ2V0Y3dkdScgPiBhbnkqID4KKyAgICAgICAgICAgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBuYW1lID0gcmVzdWx0c1sibmFtZSJdCisgICAgICAgIG5hbWUucmVwbGFjZShOYW1lKHUiZ2V0Y3dkIiwgcHJlZml4PW5hbWUucHJlZml4KSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZ2V0Y3dkdS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2dldGN3ZHUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYmQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2dldGN3ZHUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZ2V0Y3dkdS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2dldGN3ZHUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjYmQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2dldGN3ZHUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWFkNGNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9oYXNfa2V5LnB5CkBAIC0wLDAgKzEsMTEwIEBACisjIENvcHlyaWdodCAyMDA2IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkZpeGVyIGZvciBoYXNfa2V5KCkuCisKK0NhbGxzIHRvIC5oYXNfa2V5KCkgbWV0aG9kcyBhcmUgZXhwcmVzc2VkIGluIHRlcm1zIG9mIHRoZSAnaW4nCitvcGVyYXRvcjoKKworICAgIGQuaGFzX2tleShrKSAtPiBrIGluIGQKKworQ0FWRUFUUzoKKzEpIFdoaWxlIHRoZSBwcmltYXJ5IHRhcmdldCBvZiB0aGlzIGZpeGVyIGlzIGRpY3QuaGFzX2tleSgpLCB0aGUKKyAgIGZpeGVyIHdpbGwgY2hhbmdlIGFueSBoYXNfa2V5KCkgbWV0aG9kIGNhbGwsIHJlZ2FyZGxlc3Mgb2YgaXRzCisgICBjbGFzcy4KKworMikgQ2FzZXMgbGlrZSB0aGlzIHdpbGwgbm90IGJlIGNvbnZlcnRlZDoKKworICAgIG0gPSBkLmhhc19rZXkKKyAgICBpZiBtKGspOgorICAgICAgICAuLi4KKworICAgT25seSAqY2FsbHMqIHRvIGhhc19rZXkoKSBhcmUgY29udmVydGVkLiBXaGlsZSBpdCBpcyBwb3NzaWJsZSB0bworICAgY29udmVydCB0aGUgYWJvdmUgdG8gc29tZXRoaW5nIGxpa2UKKworICAgIG0gPSBkLl9fY29udGFpbnNfXworICAgIGlmIG0oayk6CisgICAgICAgIC4uLgorCisgICB0aGlzIGlzIGN1cnJlbnRseSBub3QgZG9uZS4KKyIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IHB5dHJlZQorZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIHBhcmVudGhlc2l6ZQorCisKK2NsYXNzIEZpeEhhc0tleShmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisKKyAgICBQQVRURVJOID0gIiIiCisgICAgYW5jaG9yPXBvd2VyPAorICAgICAgICBiZWZvcmU9YW55KworICAgICAgICB0cmFpbGVyPCAnLicgJ2hhc19rZXknID4KKyAgICAgICAgdHJhaWxlcjwKKyAgICAgICAgICAgICcoJworICAgICAgICAgICAgKCBub3QoYXJnbGlzdCB8IGFyZ3VtZW50PGFueSAnPScgYW55PikgYXJnPWFueQorICAgICAgICAgICAgfCBhcmdsaXN0PChub3QgYXJndW1lbnQ8YW55ICc9JyBhbnk+KSBhcmc9YW55ICcsJz4KKyAgICAgICAgICAgICkKKyAgICAgICAgICAgICcpJworICAgICAgICA+CisgICAgICAgIGFmdGVyPWFueSoKKyAgICA+CisgICAgfAorICAgIG5lZ2F0aW9uPW5vdF90ZXN0PAorICAgICAgICAnbm90JworICAgICAgICBhbmNob3I9cG93ZXI8CisgICAgICAgICAgICBiZWZvcmU9YW55KworICAgICAgICAgICAgdHJhaWxlcjwgJy4nICdoYXNfa2V5JyA+CisgICAgICAgICAgICB0cmFpbGVyPAorICAgICAgICAgICAgICAgICcoJworICAgICAgICAgICAgICAgICggbm90KGFyZ2xpc3QgfCBhcmd1bWVudDxhbnkgJz0nIGFueT4pIGFyZz1hbnkKKyAgICAgICAgICAgICAgICB8IGFyZ2xpc3Q8KG5vdCBhcmd1bWVudDxhbnkgJz0nIGFueT4pIGFyZz1hbnkgJywnPgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAnKScKKyAgICAgICAgICAgID4KKyAgICAgICAgPgorICAgID4KKyAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGFzc2VydCByZXN1bHRzCisgICAgICAgIHN5bXMgPSBzZWxmLnN5bXMKKyAgICAgICAgaWYgKG5vZGUucGFyZW50LnR5cGUgPT0gc3ltcy5ub3RfdGVzdCBhbmQKKyAgICAgICAgICAgIHNlbGYucGF0dGVybi5tYXRjaChub2RlLnBhcmVudCkpOgorICAgICAgICAgICAgIyBEb24ndCB0cmFuc2Zvcm0gYSBub2RlIG1hdGNoaW5nIHRoZSBmaXJzdCBhbHRlcm5hdGl2ZSBvZiB0aGUKKyAgICAgICAgICAgICMgcGF0dGVybiB3aGVuIGl0cyBwYXJlbnQgbWF0Y2hlcyB0aGUgc2Vjb25kIGFsdGVybmF0aXZlCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBuZWdhdGlvbiA9IHJlc3VsdHMuZ2V0KCJuZWdhdGlvbiIpCisgICAgICAgIGFuY2hvciA9IHJlc3VsdHNbImFuY2hvciJdCisgICAgICAgIHByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgIGJlZm9yZSA9IFtuLmNsb25lKCkgZm9yIG4gaW4gcmVzdWx0c1siYmVmb3JlIl1dCisgICAgICAgIGFyZyA9IHJlc3VsdHNbImFyZyJdLmNsb25lKCkKKyAgICAgICAgYWZ0ZXIgPSByZXN1bHRzLmdldCgiYWZ0ZXIiKQorICAgICAgICBpZiBhZnRlcjoKKyAgICAgICAgICAgIGFmdGVyID0gW24uY2xvbmUoKSBmb3IgbiBpbiBhZnRlcl0KKyAgICAgICAgaWYgYXJnLnR5cGUgaW4gKHN5bXMuY29tcGFyaXNvbiwgc3ltcy5ub3RfdGVzdCwgc3ltcy5hbmRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bXMub3JfdGVzdCwgc3ltcy50ZXN0LCBzeW1zLmxhbWJkZWYsIHN5bXMuYXJndW1lbnQpOgorICAgICAgICAgICAgYXJnID0gcGFyZW50aGVzaXplKGFyZykKKyAgICAgICAgaWYgbGVuKGJlZm9yZSkgPT0gMToKKyAgICAgICAgICAgIGJlZm9yZSA9IGJlZm9yZVswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmVmb3JlID0gcHl0cmVlLk5vZGUoc3ltcy5wb3dlciwgYmVmb3JlKQorICAgICAgICBiZWZvcmUucHJlZml4ID0gdSIgIgorICAgICAgICBuX29wID0gTmFtZSh1ImluIiwgcHJlZml4PXUiICIpCisgICAgICAgIGlmIG5lZ2F0aW9uOgorICAgICAgICAgICAgbl9ub3QgPSBOYW1lKHUibm90IiwgcHJlZml4PXUiICIpCisgICAgICAgICAgICBuX29wID0gcHl0cmVlLk5vZGUoc3ltcy5jb21wX29wLCAobl9ub3QsIG5fb3ApKQorICAgICAgICBuZXcgPSBweXRyZWUuTm9kZShzeW1zLmNvbXBhcmlzb24sIChhcmcsIG5fb3AsIGJlZm9yZSkpCisgICAgICAgIGlmIGFmdGVyOgorICAgICAgICAgICAgbmV3ID0gcGFyZW50aGVzaXplKG5ldykKKyAgICAgICAgICAgIG5ldyA9IHB5dHJlZS5Ob2RlKHN5bXMucG93ZXIsIChuZXcsKSArIHR1cGxlKGFmdGVyKSkKKyAgICAgICAgaWYgbm9kZS5wYXJlbnQudHlwZSBpbiAoc3ltcy5jb21wYXJpc29uLCBzeW1zLmV4cHIsIHN5bXMueG9yX2V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXMuYW5kX2V4cHIsIHN5bXMuc2hpZnRfZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltcy5hcml0aF9leHByLCBzeW1zLnRlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXMuZmFjdG9yLCBzeW1zLnBvd2VyKToKKyAgICAgICAgICAgIG5ldyA9IHBhcmVudGhlc2l6ZShuZXcpCisgICAgICAgIG5ldy5wcmVmaXggPSBwcmVmaXgKKyAgICAgICAgcmV0dXJuIG5ldwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9oYXNfa2V5LnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmNzY2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9oYXNfa2V5LnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwOWE3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaGFzX2tleS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pZGlvbXMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lkaW9tcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2I2ZWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pZGlvbXMucHkKQEAgLTAsMCArMSwxNTIgQEAKKyIiIkFkanVzdCBzb21lIG9sZCBQeXRob24gMiBpZGlvbXMgdG8gdGhlaXIgbW9kZXJuIGNvdW50ZXJwYXJ0cy4KKworKiBDaGFuZ2Ugc29tZSB0eXBlIGNvbXBhcmlzb25zIHRvIGlzaW5zdGFuY2UoKSBjYWxsczoKKyAgICB0eXBlKHgpID09IFQgLT4gaXNpbnN0YW5jZSh4LCBUKQorICAgIHR5cGUoeCkgaXMgVCAtPiBpc2luc3RhbmNlKHgsIFQpCisgICAgdHlwZSh4KSAhPSBUIC0+IG5vdCBpc2luc3RhbmNlKHgsIFQpCisgICAgdHlwZSh4KSBpcyBub3QgVCAtPiBub3QgaXNpbnN0YW5jZSh4LCBUKQorCisqIENoYW5nZSAid2hpbGUgMToiIGludG8gIndoaWxlIFRydWU6Ii4KKworKiBDaGFuZ2UgYm90aAorCisgICAgdiA9IGxpc3QoRVhQUikKKyAgICB2LnNvcnQoKQorICAgIGZvbyh2KQorCithbmQgdGhlIG1vcmUgZ2VuZXJhbAorCisgICAgdiA9IEVYUFIKKyAgICB2LnNvcnQoKQorICAgIGZvbyh2KQorCitpbnRvCisKKyAgICB2ID0gc29ydGVkKEVYUFIpCisgICAgZm9vKHYpCisiIiIKKyMgQXV0aG9yOiBKYWNxdWVzIEZyZWNoZXQsIENvbGxpbiBXaW50ZXIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgQ2FsbCwgQ29tbWEsIE5hbWUsIE5vZGUsIEJsYW5rTGluZSwgc3ltcworCitDTVAgPSAiKG49JyE9JyB8ICc9PScgfCAnaXMnIHwgbj1jb21wX29wPCAnaXMnICdub3QnID4pIgorVFlQRSA9ICJwb3dlcjwgJ3R5cGUnIHRyYWlsZXI8ICcoJyB4PWFueSAnKScgPiA+IgorCitjbGFzcyBGaXhJZGlvbXMoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBleHBsaWNpdCA9IFRydWUgIyBUaGUgdXNlciBtdXN0IGFzayBmb3IgdGhpcyBmaXhlcgorCisgICAgUEFUVEVSTiA9IHIiIiIKKyAgICAgICAgaXNpbnN0YW5jZT1jb21wYXJpc29uPCAlcyAlcyBUPWFueSA+CisgICAgICAgIHwKKyAgICAgICAgaXNpbnN0YW5jZT1jb21wYXJpc29uPCBUPWFueSAlcyAlcyA+CisgICAgICAgIHwKKyAgICAgICAgd2hpbGVfc3RtdDwgJ3doaWxlJyB3aGlsZT0nMScgJzonIGFueSsgPgorICAgICAgICB8CisgICAgICAgIHNvcnRlZD1hbnk8CisgICAgICAgICAgICBhbnkqCisgICAgICAgICAgICBzaW1wbGVfc3RtdDwKKyAgICAgICAgICAgICAgZXhwcl9zdG10PCBpZDE9YW55ICc9JworICAgICAgICAgICAgICAgICAgICAgICAgIHBvd2VyPCBsaXN0PSdsaXN0JyB0cmFpbGVyPCAnKCcgKG5vdCBhcmdsaXN0PGFueSs+KSBhbnkgJyknID4gPgorICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIHNvcnQ9CisgICAgICAgICAgICBzaW1wbGVfc3RtdDwKKyAgICAgICAgICAgICAgcG93ZXI8IGlkMj1hbnkKKyAgICAgICAgICAgICAgICAgICAgIHRyYWlsZXI8ICcuJyAnc29ydCcgPiB0cmFpbGVyPCAnKCcgJyknID4KKyAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICA+CisgICAgICAgICAgICBuZXh0PWFueSoKKyAgICAgICAgPgorICAgICAgICB8CisgICAgICAgIHNvcnRlZD1hbnk8CisgICAgICAgICAgICBhbnkqCisgICAgICAgICAgICBzaW1wbGVfc3RtdDwgZXhwcl9zdG10PCBpZDE9YW55ICc9JyBleHByPWFueSA+ICdcbicgPgorICAgICAgICAgICAgc29ydD0KKyAgICAgICAgICAgIHNpbXBsZV9zdG10PAorICAgICAgICAgICAgICBwb3dlcjwgaWQyPWFueQorICAgICAgICAgICAgICAgICAgICAgdHJhaWxlcjwgJy4nICdzb3J0JyA+IHRyYWlsZXI8ICcoJyAnKScgPgorICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIG5leHQ9YW55KgorICAgICAgICA+CisgICAgIiIiICUgKFRZUEUsIENNUCwgQ01QLCBUWVBFKQorCisgICAgZGVmIG1hdGNoKHNlbGYsIG5vZGUpOgorICAgICAgICByID0gc3VwZXIoRml4SWRpb21zLCBzZWxmKS5tYXRjaChub2RlKQorICAgICAgICAjIElmIHdlJ3ZlIG1hdGNoZWQgb25lIG9mIHRoZSBzb3J0L3NvcnRlZCBzdWJwYXR0ZXJucyBhYm92ZSwgd2UKKyAgICAgICAgIyB3YW50IHRvIHJlamVjdCBtYXRjaGVzIHdoZXJlIHRoZSBpbml0aWFsIGFzc2lnbm1lbnQgYW5kIHRoZQorICAgICAgICAjIHN1YnNlcXVlbnQgLnNvcnQoKSBjYWxsIGludm9sdmUgZGlmZmVyZW50IGlkZW50aWZpZXJzLgorICAgICAgICBpZiByIGFuZCAic29ydGVkIiBpbiByOgorICAgICAgICAgICAgaWYgclsiaWQxIl0gPT0gclsiaWQyIl06CisgICAgICAgICAgICAgICAgcmV0dXJuIHIKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiByCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBpZiAiaXNpbnN0YW5jZSIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRyYW5zZm9ybV9pc2luc3RhbmNlKG5vZGUsIHJlc3VsdHMpCisgICAgICAgIGVsaWYgIndoaWxlIiBpbiByZXN1bHRzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhbnNmb3JtX3doaWxlKG5vZGUsIHJlc3VsdHMpCisgICAgICAgIGVsaWYgInNvcnRlZCIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRyYW5zZm9ybV9zb3J0KG5vZGUsIHJlc3VsdHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkludmFsaWQgbWF0Y2giKQorCisgICAgZGVmIHRyYW5zZm9ybV9pc2luc3RhbmNlKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICB4ID0gcmVzdWx0c1sieCJdLmNsb25lKCkgIyBUaGUgdGhpbmcgaW5zaWRlIG9mIHR5cGUoKQorICAgICAgICBUID0gcmVzdWx0c1siVCJdLmNsb25lKCkgIyBUaGUgdHlwZSBiZWluZyBjb21wYXJlZCBhZ2FpbnN0CisgICAgICAgIHgucHJlZml4ID0gdSIiCisgICAgICAgIFQucHJlZml4ID0gdSIgIgorICAgICAgICB0ZXN0ID0gQ2FsbChOYW1lKHUiaXNpbnN0YW5jZSIpLCBbeCwgQ29tbWEoKSwgVF0pCisgICAgICAgIGlmICJuIiBpbiByZXN1bHRzOgorICAgICAgICAgICAgdGVzdC5wcmVmaXggPSB1IiAiCisgICAgICAgICAgICB0ZXN0ID0gTm9kZShzeW1zLm5vdF90ZXN0LCBbTmFtZSh1Im5vdCIpLCB0ZXN0XSkKKyAgICAgICAgdGVzdC5wcmVmaXggPSBub2RlLnByZWZpeAorICAgICAgICByZXR1cm4gdGVzdAorCisgICAgZGVmIHRyYW5zZm9ybV93aGlsZShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgb25lID0gcmVzdWx0c1sid2hpbGUiXQorICAgICAgICBvbmUucmVwbGFjZShOYW1lKHUiVHJ1ZSIsIHByZWZpeD1vbmUucHJlZml4KSkKKworICAgIGRlZiB0cmFuc2Zvcm1fc29ydChzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgc29ydF9zdG10ID0gcmVzdWx0c1sic29ydCJdCisgICAgICAgIG5leHRfc3RtdCA9IHJlc3VsdHNbIm5leHQiXQorICAgICAgICBsaXN0X2NhbGwgPSByZXN1bHRzLmdldCgibGlzdCIpCisgICAgICAgIHNpbXBsZV9leHByID0gcmVzdWx0cy5nZXQoImV4cHIiKQorCisgICAgICAgIGlmIGxpc3RfY2FsbDoKKyAgICAgICAgICAgIGxpc3RfY2FsbC5yZXBsYWNlKE5hbWUodSJzb3J0ZWQiLCBwcmVmaXg9bGlzdF9jYWxsLnByZWZpeCkpCisgICAgICAgIGVsaWYgc2ltcGxlX2V4cHI6CisgICAgICAgICAgICBuZXcgPSBzaW1wbGVfZXhwci5jbG9uZSgpCisgICAgICAgICAgICBuZXcucHJlZml4ID0gdSIiCisgICAgICAgICAgICBzaW1wbGVfZXhwci5yZXBsYWNlKENhbGwoTmFtZSh1InNvcnRlZCIpLCBbbmV3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9c2ltcGxlX2V4cHIucHJlZml4KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigic2hvdWxkIG5vdCBoYXZlIHJlYWNoZWQgaGVyZSIpCisgICAgICAgIHNvcnRfc3RtdC5yZW1vdmUoKQorCisgICAgICAgIGJ0d24gPSBzb3J0X3N0bXQucHJlZml4CisgICAgICAgICMgS2VlcCBhbnkgcHJlZml4IGxpbmVzIGJldHdlZW4gdGhlIHNvcnRfc3RtdCBhbmQgdGhlIGxpc3RfY2FsbCBhbmQKKyAgICAgICAgIyBzaG92ZSB0aGVtIHJpZ2h0IGFmdGVyIHRoZSBzb3J0ZWQoKSBjYWxsLgorICAgICAgICBpZiB1IlxuIiBpbiBidHduOgorICAgICAgICAgICAgaWYgbmV4dF9zdG10OgorICAgICAgICAgICAgICAgICMgVGhlIG5ldyBwcmVmaXggc2hvdWxkIGJlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgc29ydF9zdG10J3MKKyAgICAgICAgICAgICAgICAjIHByZWZpeCB1cCB0byB0aGUgbGFzdCBuZXdsaW5lLCB0aGVuIHRoZSBvbGQgcHJlZml4IGFmdGVyIGEgbmV3CisgICAgICAgICAgICAgICAgIyBsaW5lLgorICAgICAgICAgICAgICAgIHByZWZpeF9saW5lcyA9IChidHduLnJwYXJ0aXRpb24odSJcbiIpWzBdLCBuZXh0X3N0bXRbMF0ucHJlZml4KQorICAgICAgICAgICAgICAgIG5leHRfc3RtdFswXS5wcmVmaXggPSB1IlxuIi5qb2luKHByZWZpeF9saW5lcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGxpc3RfY2FsbC5wYXJlbnQKKyAgICAgICAgICAgICAgICBhc3NlcnQgbGlzdF9jYWxsLm5leHRfc2libGluZyBpcyBOb25lCisgICAgICAgICAgICAgICAgIyBQdXQgYSBibGFuayBsaW5lIGFmdGVyIGxpc3RfY2FsbCBhbmQgc2V0IGl0cyBwcmVmaXguCisgICAgICAgICAgICAgICAgZW5kX2xpbmUgPSBCbGFua0xpbmUoKQorICAgICAgICAgICAgICAgIGxpc3RfY2FsbC5wYXJlbnQuYXBwZW5kX2NoaWxkKGVuZF9saW5lKQorICAgICAgICAgICAgICAgIGFzc2VydCBsaXN0X2NhbGwubmV4dF9zaWJsaW5nIGlzIGVuZF9saW5lCisgICAgICAgICAgICAgICAgIyBUaGUgbmV3IHByZWZpeCBzaG91bGQgYmUgZXZlcnl0aGluZyB1cCB0byB0aGUgZmlyc3QgbmV3IGxpbmUKKyAgICAgICAgICAgICAgICAjIG9mIHNvcnRfc3RtdCdzIHByZWZpeC4KKyAgICAgICAgICAgICAgICBlbmRfbGluZS5wcmVmaXggPSBidHduLnJwYXJ0aXRpb24odSJcbiIpWzBdCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lkaW9tcy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lkaW9tcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFjMjE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaWRpb21zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lkaW9tcy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lkaW9tcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5ZmU0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaWRpb21zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMWU4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weQpAQCAtMCwwICsxLDk5IEBACisiIiJGaXhlciBmb3IgaW1wb3J0IHN0YXRlbWVudHMuCitJZiBzcGFtIGlzIGJlaW5nIGltcG9ydGVkIGZyb20gdGhlIGxvY2FsIGRpcmVjdG9yeSwgdGhpcyBpbXBvcnQ6CisgICAgZnJvbSBzcGFtIGltcG9ydCBlZ2dzCitCZWNvbWVzOgorICAgIGZyb20gLnNwYW0gaW1wb3J0IGVnZ3MKKworQW5kIHRoaXMgaW1wb3J0OgorICAgIGltcG9ydCBzcGFtCitCZWNvbWVzOgorICAgIGZyb20gLiBpbXBvcnQgc3BhbQorIiIiCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSBvcy5wYXRoIGltcG9ydCBkaXJuYW1lLCBqb2luLCBleGlzdHMsIHNlcAorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IEZyb21JbXBvcnQsIHN5bXMsIHRva2VuCisKKworZGVmIHRyYXZlcnNlX2ltcG9ydHMobmFtZXMpOgorICAgICIiIgorICAgIFdhbGtzIG92ZXIgYWxsIHRoZSBuYW1lcyBpbXBvcnRlZCBpbiBhIGRvdHRlZF9hc19uYW1lcyBub2RlLgorICAgICIiIgorICAgIHBlbmRpbmcgPSBbbmFtZXNdCisgICAgd2hpbGUgcGVuZGluZzoKKyAgICAgICAgbm9kZSA9IHBlbmRpbmcucG9wKCkKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHRva2VuLk5BTUU6CisgICAgICAgICAgICB5aWVsZCBub2RlLnZhbHVlCisgICAgICAgIGVsaWYgbm9kZS50eXBlID09IHN5bXMuZG90dGVkX25hbWU6CisgICAgICAgICAgICB5aWVsZCAiIi5qb2luKFtjaC52YWx1ZSBmb3IgY2ggaW4gbm9kZS5jaGlsZHJlbl0pCisgICAgICAgIGVsaWYgbm9kZS50eXBlID09IHN5bXMuZG90dGVkX2FzX25hbWU6CisgICAgICAgICAgICBwZW5kaW5nLmFwcGVuZChub2RlLmNoaWxkcmVuWzBdKQorICAgICAgICBlbGlmIG5vZGUudHlwZSA9PSBzeW1zLmRvdHRlZF9hc19uYW1lczoKKyAgICAgICAgICAgIHBlbmRpbmcuZXh0ZW5kKG5vZGUuY2hpbGRyZW5bOjotMl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigidW5rb3duIG5vZGUgdHlwZSIpCisKKworY2xhc3MgRml4SW1wb3J0KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICBpbXBvcnRfZnJvbTwgJ2Zyb20nIGltcD1hbnkgJ2ltcG9ydCcgWycoJ10gYW55IFsnKSddID4KKyAgICB8CisgICAgaW1wb3J0X25hbWU8ICdpbXBvcnQnIGltcD1hbnkgPgorICAgICIiIgorCisgICAgZGVmIHN0YXJ0X3RyZWUoc2VsZiwgdHJlZSwgbmFtZSk6CisgICAgICAgIHN1cGVyKEZpeEltcG9ydCwgc2VsZikuc3RhcnRfdHJlZSh0cmVlLCBuYW1lKQorICAgICAgICBzZWxmLnNraXAgPSAiYWJzb2x1dGVfaW1wb3J0IiBpbiB0cmVlLmZ1dHVyZV9mZWF0dXJlcworCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgaWYgc2VsZi5za2lwOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGltcCA9IHJlc3VsdHNbJ2ltcCddCisKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHN5bXMuaW1wb3J0X2Zyb206CisgICAgICAgICAgICAjIFNvbWUgaW1wcyBhcmUgdG9wLWxldmVsIChlZzogJ2ltcG9ydCBoYW0nKQorICAgICAgICAgICAgIyBzb21lIGFyZSBmaXJzdCBsZXZlbCAoZWc6ICdpbXBvcnQgaGFtLmVnZ3MnKQorICAgICAgICAgICAgIyBzb21lIGFyZSB0aGlyZCBsZXZlbCAoZWc6ICdpbXBvcnQgaGFtLmVnZ3MgYXMgc3BhbScpCisgICAgICAgICAgICAjIEhlbmNlLCB0aGUgbG9vcAorICAgICAgICAgICAgd2hpbGUgbm90IGhhc2F0dHIoaW1wLCAndmFsdWUnKToKKyAgICAgICAgICAgICAgICBpbXAgPSBpbXAuY2hpbGRyZW5bMF0KKyAgICAgICAgICAgIGlmIHNlbGYucHJvYmFibHlfYV9sb2NhbF9pbXBvcnQoaW1wLnZhbHVlKToKKyAgICAgICAgICAgICAgICBpbXAudmFsdWUgPSB1Ii4iICsgaW1wLnZhbHVlCisgICAgICAgICAgICAgICAgaW1wLmNoYW5nZWQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGF2ZV9sb2NhbCA9IEZhbHNlCisgICAgICAgICAgICBoYXZlX2Fic29sdXRlID0gRmFsc2UKKyAgICAgICAgICAgIGZvciBtb2RfbmFtZSBpbiB0cmF2ZXJzZV9pbXBvcnRzKGltcCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5wcm9iYWJseV9hX2xvY2FsX2ltcG9ydChtb2RfbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIGhhdmVfbG9jYWwgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaGF2ZV9hYnNvbHV0ZSA9IFRydWUKKyAgICAgICAgICAgIGlmIGhhdmVfYWJzb2x1dGU6CisgICAgICAgICAgICAgICAgaWYgaGF2ZV9sb2NhbDoKKyAgICAgICAgICAgICAgICAgICAgIyBXZSB3b24ndCBoYW5kbGUgYm90aCBzaWJsaW5nIGFuZCBhYnNvbHV0ZSBpbXBvcnRzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAjIHNhbWUgc3RhdGVtZW50IGF0IHRoZSBtb21lbnQuCisgICAgICAgICAgICAgICAgICAgIHNlbGYud2FybmluZyhub2RlLCAiYWJzb2x1dGUgYW5kIGxvY2FsIGltcG9ydHMgdG9nZXRoZXIiKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBuZXcgPSBGcm9tSW1wb3J0KHUiLiIsIFtpbXBdKQorICAgICAgICAgICAgbmV3LnByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgICAgICByZXR1cm4gbmV3CisKKyAgICBkZWYgcHJvYmFibHlfYV9sb2NhbF9pbXBvcnQoc2VsZiwgaW1wX25hbWUpOgorICAgICAgICBpZiBpbXBfbmFtZS5zdGFydHN3aXRoKHUiLiIpOgorICAgICAgICAgICAgIyBSZWxhdGl2ZSBpbXBvcnRzIGFyZSBjZXJ0YWlubHkgbm90IGxvY2FsIGltcG9ydHMuCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaW1wX25hbWUgPSBpbXBfbmFtZS5zcGxpdCh1Ii4iLCAxKVswXQorICAgICAgICBiYXNlX3BhdGggPSBkaXJuYW1lKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGJhc2VfcGF0aCA9IGpvaW4oYmFzZV9wYXRoLCBpbXBfbmFtZSkKKyAgICAgICAgIyBJZiB0aGVyZSBpcyBubyBfX2luaXRfXy5weSBuZXh0IHRvIHRoZSBmaWxlIGl0cyBub3QgaW4gYSBwYWNrYWdlCisgICAgICAgICMgc28gY2FuJ3QgYmUgYSByZWxhdGl2ZSBpbXBvcnQuCisgICAgICAgIGlmIG5vdCBleGlzdHMoam9pbihkaXJuYW1lKGJhc2VfcGF0aCksICJfX2luaXRfXy5weSIpKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmb3IgZXh0IGluIFsiLnB5Iiwgc2VwLCAiLnB5YyIsICIuc28iLCAiLnNsIiwgIi5weWQiXToKKyAgICAgICAgICAgIGlmIGV4aXN0cyhiYXNlX3BhdGggKyBleHQpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnQucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDE0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnQucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNDE0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnRzLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYzllNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkKQEAgLTAsMCArMSwxNDUgQEAKKyIiIkZpeCBpbmNvbXBhdGlibGUgaW1wb3J0cyBhbmQgbW9kdWxlIHJlZmVyZW5jZXMuIiIiCisjIEF1dGhvcnM6IENvbGxpbiBXaW50ZXIsIE5pY2sgRWRkcworCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBhdHRyX2NoYWluCisKK01BUFBJTkcgPSB7J1N0cmluZ0lPJzogICdpbycsCisgICAgICAgICAgICdjU3RyaW5nSU8nOiAnaW8nLAorICAgICAgICAgICAnY1BpY2tsZSc6ICdwaWNrbGUnLAorICAgICAgICAgICAnX19idWlsdGluX18nIDogJ2J1aWx0aW5zJywKKyAgICAgICAgICAgJ2NvcHlfcmVnJzogJ2NvcHlyZWcnLAorICAgICAgICAgICAnUXVldWUnOiAncXVldWUnLAorICAgICAgICAgICAnU29ja2V0U2VydmVyJzogJ3NvY2tldHNlcnZlcicsCisgICAgICAgICAgICdDb25maWdQYXJzZXInOiAnY29uZmlncGFyc2VyJywKKyAgICAgICAgICAgJ3JlcHInOiAncmVwcmxpYicsCisgICAgICAgICAgICdGaWxlRGlhbG9nJzogJ3RraW50ZXIuZmlsZWRpYWxvZycsCisgICAgICAgICAgICd0a0ZpbGVEaWFsb2cnOiAndGtpbnRlci5maWxlZGlhbG9nJywKKyAgICAgICAgICAgJ1NpbXBsZURpYWxvZyc6ICd0a2ludGVyLnNpbXBsZWRpYWxvZycsCisgICAgICAgICAgICd0a1NpbXBsZURpYWxvZyc6ICd0a2ludGVyLnNpbXBsZWRpYWxvZycsCisgICAgICAgICAgICd0a0NvbG9yQ2hvb3Nlcic6ICd0a2ludGVyLmNvbG9yY2hvb3NlcicsCisgICAgICAgICAgICd0a0NvbW1vbkRpYWxvZyc6ICd0a2ludGVyLmNvbW1vbmRpYWxvZycsCisgICAgICAgICAgICdEaWFsb2cnOiAndGtpbnRlci5kaWFsb2cnLAorICAgICAgICAgICAnVGtkbmQnOiAndGtpbnRlci5kbmQnLAorICAgICAgICAgICAndGtGb250JzogJ3RraW50ZXIuZm9udCcsCisgICAgICAgICAgICd0a01lc3NhZ2VCb3gnOiAndGtpbnRlci5tZXNzYWdlYm94JywKKyAgICAgICAgICAgJ1Njcm9sbGVkVGV4dCc6ICd0a2ludGVyLnNjcm9sbGVkdGV4dCcsCisgICAgICAgICAgICdUa2NvbnN0YW50cyc6ICd0a2ludGVyLmNvbnN0YW50cycsCisgICAgICAgICAgICdUaXgnOiAndGtpbnRlci50aXgnLAorICAgICAgICAgICAndHRrJzogJ3RraW50ZXIudHRrJywKKyAgICAgICAgICAgJ1RraW50ZXInOiAndGtpbnRlcicsCisgICAgICAgICAgICdtYXJrdXBiYXNlJzogJ19tYXJrdXBiYXNlJywKKyAgICAgICAgICAgJ193aW5yZWcnOiAnd2lucmVnJywKKyAgICAgICAgICAgJ3RocmVhZCc6ICdfdGhyZWFkJywKKyAgICAgICAgICAgJ2R1bW15X3RocmVhZCc6ICdfZHVtbXlfdGhyZWFkJywKKyAgICAgICAgICAgIyBhbnlkYm0gYW5kIHdoaWNoZGIgYXJlIGhhbmRsZWQgYnkgZml4X2ltcG9ydHMyCisgICAgICAgICAgICdkYmhhc2gnOiAnZGJtLmJzZCcsCisgICAgICAgICAgICdkdW1iZGJtJzogJ2RibS5kdW1iJywKKyAgICAgICAgICAgJ2RibSc6ICdkYm0ubmRibScsCisgICAgICAgICAgICdnZGJtJzogJ2RibS5nbnUnLAorICAgICAgICAgICAneG1scnBjbGliJzogJ3htbHJwYy5jbGllbnQnLAorICAgICAgICAgICAnRG9jWE1MUlBDU2VydmVyJzogJ3htbHJwYy5zZXJ2ZXInLAorICAgICAgICAgICAnU2ltcGxlWE1MUlBDU2VydmVyJzogJ3htbHJwYy5zZXJ2ZXInLAorICAgICAgICAgICAnaHR0cGxpYic6ICdodHRwLmNsaWVudCcsCisgICAgICAgICAgICdodG1sZW50aXR5ZGVmcycgOiAnaHRtbC5lbnRpdGllcycsCisgICAgICAgICAgICdIVE1MUGFyc2VyJyA6ICdodG1sLnBhcnNlcicsCisgICAgICAgICAgICdDb29raWUnOiAnaHR0cC5jb29raWVzJywKKyAgICAgICAgICAgJ2Nvb2tpZWxpYic6ICdodHRwLmNvb2tpZWphcicsCisgICAgICAgICAgICdCYXNlSFRUUFNlcnZlcic6ICdodHRwLnNlcnZlcicsCisgICAgICAgICAgICdTaW1wbGVIVFRQU2VydmVyJzogJ2h0dHAuc2VydmVyJywKKyAgICAgICAgICAgJ0NHSUhUVFBTZXJ2ZXInOiAnaHR0cC5zZXJ2ZXInLAorICAgICAgICAgICAjJ3Rlc3QudGVzdF9zdXBwb3J0JzogJ3Rlc3Quc3VwcG9ydCcsCisgICAgICAgICAgICdjb21tYW5kcyc6ICdzdWJwcm9jZXNzJywKKyAgICAgICAgICAgJ1VzZXJTdHJpbmcnIDogJ2NvbGxlY3Rpb25zJywKKyAgICAgICAgICAgJ1VzZXJMaXN0JyA6ICdjb2xsZWN0aW9ucycsCisgICAgICAgICAgICd1cmxwYXJzZScgOiAndXJsbGliLnBhcnNlJywKKyAgICAgICAgICAgJ3JvYm90cGFyc2VyJyA6ICd1cmxsaWIucm9ib3RwYXJzZXInLAorfQorCisKK2RlZiBhbHRlcm5hdGVzKG1lbWJlcnMpOgorICAgIHJldHVybiAiKCIgKyAifCIuam9pbihtYXAocmVwciwgbWVtYmVycykpICsgIikiCisKKworZGVmIGJ1aWxkX3BhdHRlcm4obWFwcGluZz1NQVBQSU5HKToKKyAgICBtb2RfbGlzdCA9ICcgfCAnLmpvaW4oWyJtb2R1bGVfbmFtZT0nJXMnIiAlIGtleSBmb3Iga2V5IGluIG1hcHBpbmddKQorICAgIGJhcmVfbmFtZXMgPSBhbHRlcm5hdGVzKG1hcHBpbmcua2V5cygpKQorCisgICAgeWllbGQgIiIibmFtZV9pbXBvcnQ9aW1wb3J0X25hbWU8ICdpbXBvcnQnICgoJXMpIHwKKyAgICAgICAgICAgICAgIG11bHRpcGxlX2ltcG9ydHM9ZG90dGVkX2FzX25hbWVzPCBhbnkqICglcykgYW55KiA+KSA+CisgICAgICAgICAgIiIiICUgKG1vZF9saXN0LCBtb2RfbGlzdCkKKyAgICB5aWVsZCAiIiJpbXBvcnRfZnJvbTwgJ2Zyb20nICglcykgJ2ltcG9ydCcgWycoJ10KKyAgICAgICAgICAgICAgKCBhbnkgfCBpbXBvcnRfYXNfbmFtZTwgYW55ICdhcycgYW55ID4gfAorICAgICAgICAgICAgICAgIGltcG9ydF9hc19uYW1lczwgYW55KiA+KSAgWycpJ10gPgorICAgICAgICAgICIiIiAlIG1vZF9saXN0CisgICAgeWllbGQgIiIiaW1wb3J0X25hbWU8ICdpbXBvcnQnIChkb3R0ZWRfYXNfbmFtZTwgKCVzKSAnYXMnIGFueSA+IHwKKyAgICAgICAgICAgICAgIG11bHRpcGxlX2ltcG9ydHM9ZG90dGVkX2FzX25hbWVzPAorICAgICAgICAgICAgICAgICBhbnkqIGRvdHRlZF9hc19uYW1lPCAoJXMpICdhcycgYW55ID4gYW55KiA+KSA+CisgICAgICAgICAgIiIiICUgKG1vZF9saXN0LCBtb2RfbGlzdCkKKworICAgICMgRmluZCB1c2FnZXMgb2YgbW9kdWxlIG1lbWJlcnMgaW4gY29kZSBlLmcuIHRocmVhZC5mb28oYmFyKQorICAgIHlpZWxkICJwb3dlcjwgYmFyZV93aXRoX2F0dHI9KCVzKSB0cmFpbGVyPCcuJyBhbnkgPiBhbnkqID4iICUgYmFyZV9uYW1lcworCisKK2NsYXNzIEZpeEltcG9ydHMoZml4ZXJfYmFzZS5CYXNlRml4KToKKworICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAga2VlcF9saW5lX29yZGVyID0gVHJ1ZQorICAgICMgVGhpcyBpcyBvdmVycmlkZGVuIGluIGZpeF9pbXBvcnRzMi4KKyAgICBtYXBwaW5nID0gTUFQUElORworCisgICAgIyBXZSB3YW50IHRvIHJ1biB0aGlzIGZpeGVyIGxhdGUsIHNvIGZpeF9pbXBvcnQgZG9lc24ndCB0cnkgdG8gbWFrZSBzdGRsaWIKKyAgICAjIHJlbmFtZXMgaW50byByZWxhdGl2ZSBpbXBvcnRzLgorICAgIHJ1bl9vcmRlciA9IDYKKworICAgIGRlZiBidWlsZF9wYXR0ZXJuKHNlbGYpOgorICAgICAgICByZXR1cm4gInwiLmpvaW4oYnVpbGRfcGF0dGVybihzZWxmLm1hcHBpbmcpKQorCisgICAgZGVmIGNvbXBpbGVfcGF0dGVybihzZWxmKToKKyAgICAgICAgIyBXZSBvdmVycmlkZSB0aGlzLCBzbyBNQVBQSU5HIGNhbiBiZSBwcmFnbWF0aWNhbGx5IGFsdGVyZWQgYW5kIHRoZQorICAgICAgICAjIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gUEFUVEVSTi4KKyAgICAgICAgc2VsZi5QQVRURVJOID0gc2VsZi5idWlsZF9wYXR0ZXJuKCkKKyAgICAgICAgc3VwZXIoRml4SW1wb3J0cywgc2VsZikuY29tcGlsZV9wYXR0ZXJuKCkKKworICAgICMgRG9uJ3QgbWF0Y2ggdGhlIG5vZGUgaWYgaXQncyB3aXRoaW4gYW5vdGhlciBtYXRjaC4KKyAgICBkZWYgbWF0Y2goc2VsZiwgbm9kZSk6CisgICAgICAgIG1hdGNoID0gc3VwZXIoRml4SW1wb3J0cywgc2VsZikubWF0Y2gKKyAgICAgICAgcmVzdWx0cyA9IG1hdGNoKG5vZGUpCisgICAgICAgIGlmIHJlc3VsdHM6CisgICAgICAgICAgICAjIE1vZHVsZSB1c2FnZSBjb3VsZCBiZSBpbiB0aGUgdHJhaWxlciBvZiBhbiBhdHRyaWJ1dGUgbG9va3VwLCBzbyB3ZQorICAgICAgICAgICAgIyBtaWdodCBoYXZlIG5lc3RlZCBtYXRjaGVzIHdoZW4gImJhcmVfd2l0aF9hdHRyIiBpcyBwcmVzZW50LgorICAgICAgICAgICAgaWYgImJhcmVfd2l0aF9hdHRyIiBub3QgaW4gcmVzdWx0cyBhbmQgXAorICAgICAgICAgICAgICAgICAgICBhbnkobWF0Y2gob2JqKSBmb3Igb2JqIGluIGF0dHJfY2hhaW4obm9kZSwgInBhcmVudCIpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIHJldHVybiByZXN1bHRzCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIHN0YXJ0X3RyZWUoc2VsZiwgdHJlZSwgZmlsZW5hbWUpOgorICAgICAgICBzdXBlcihGaXhJbXBvcnRzLCBzZWxmKS5zdGFydF90cmVlKHRyZWUsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLnJlcGxhY2UgPSB7fQorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgaW1wb3J0X21vZCA9IHJlc3VsdHMuZ2V0KCJtb2R1bGVfbmFtZSIpCisgICAgICAgIGlmIGltcG9ydF9tb2Q6CisgICAgICAgICAgICBtb2RfbmFtZSA9IGltcG9ydF9tb2QudmFsdWUKKyAgICAgICAgICAgIG5ld19uYW1lID0gdW5pY29kZShzZWxmLm1hcHBpbmdbbW9kX25hbWVdKQorICAgICAgICAgICAgaW1wb3J0X21vZC5yZXBsYWNlKE5hbWUobmV3X25hbWUsIHByZWZpeD1pbXBvcnRfbW9kLnByZWZpeCkpCisgICAgICAgICAgICBpZiAibmFtZV9pbXBvcnQiIGluIHJlc3VsdHM6CisgICAgICAgICAgICAgICAgIyBJZiBpdCdzIG5vdCBhICJmcm9tIHggaW1wb3J0IHgsIHkiIG9yICJpbXBvcnQgeCBhcyB5IiBpbXBvcnQsCisgICAgICAgICAgICAgICAgIyBtYXJrZWQgaXRzIHVzYWdlIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICAgICAgICAgIHNlbGYucmVwbGFjZVttb2RfbmFtZV0gPSBuZXdfbmFtZQorICAgICAgICAgICAgaWYgIm11bHRpcGxlX2ltcG9ydHMiIGluIHJlc3VsdHM6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgbmFzdHkgaGFjayB0byBmaXggbXVsdGlwbGUgaW1wb3J0cyBvbiBhIGxpbmUgKGUuZy4sCisgICAgICAgICAgICAgICAgIyAiaW1wb3J0IFN0cmluZ0lPLCB1cmxwYXJzZSIpLiBUaGUgcHJvYmxlbSBpcyB0aGF0IEkgY2FuJ3QKKyAgICAgICAgICAgICAgICAjIGZpZ3VyZSBvdXQgYW4gZWFzeSB3YXkgdG8gbWFrZSBhIHBhdHRlcm4gcmVjb2duaXplIHRoZSBrZXlzIG9mCisgICAgICAgICAgICAgICAgIyBNQVBQSU5HIHJhbmRvbWx5IHNwcmlua2xlZCBpbiBhbiBpbXBvcnQgc3RhdGVtZW50LgorICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBzZWxmLm1hdGNoKG5vZGUpCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0czoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50cmFuc2Zvcm0obm9kZSwgcmVzdWx0cykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgUmVwbGFjZSB1c2FnZSBvZiB0aGUgbW9kdWxlLgorICAgICAgICAgICAgYmFyZV9uYW1lID0gcmVzdWx0c1siYmFyZV93aXRoX2F0dHIiXVswXQorICAgICAgICAgICAgbmV3X25hbWUgPSBzZWxmLnJlcGxhY2UuZ2V0KGJhcmVfbmFtZS52YWx1ZSkKKyAgICAgICAgICAgIGlmIG5ld19uYW1lOgorICAgICAgICAgICAgICAgIGJhcmVfbmFtZS5yZXBsYWNlKE5hbWUobmV3X25hbWUsIHByZWZpeD1iYXJlX25hbWUucHJlZml4KSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0cy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YTllZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0cy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YTllZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0czIucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzNjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMyLnB5CkBAIC0wLDAgKzEsMTYgQEAKKyIiIkZpeCBpbmNvbXBhdGlibGUgaW1wb3J0cyBhbmQgbW9kdWxlIHJlZmVyZW5jZXMgdGhhdCBtdXN0IGJlIGZpeGVkIGFmdGVyCitmaXhfaW1wb3J0cy4iIiIKK2Zyb20gLiBpbXBvcnQgZml4X2ltcG9ydHMKKworCitNQVBQSU5HID0geworICAgICAgICAgICAgJ3doaWNoZGInOiAnZGJtJywKKyAgICAgICAgICAgICdhbnlkYm0nOiAnZGJtJywKKyAgICAgICAgICB9CisKKworY2xhc3MgRml4SW1wb3J0czIoZml4X2ltcG9ydHMuRml4SW1wb3J0cyk6CisKKyAgICBydW5fb3JkZXIgPSA3CisKKyAgICBtYXBwaW5nID0gTUFQUElORwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnRzMi5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjJlNTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnRzMi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnRzMi5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjJlNTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnRzMi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbnB1dC5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW5wdXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmNGM3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW5wdXQucHkKQEAgLTAsMCArMSwyNiBAQAorIiIiRml4ZXIgdGhhdCBjaGFuZ2VzIGlucHV0KC4uLikgaW50byBldmFsKGlucHV0KC4uLikpLiIiIgorIyBBdXRob3I6IEFuZHJlIFJvYmVyZ2UKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgQ2FsbCwgTmFtZQorZnJvbSAuLiBpbXBvcnQgcGF0Y29tcAorCisKK2NvbnRleHQgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybigicG93ZXI8ICdldmFsJyB0cmFpbGVyPCAnKCcgYW55ICcpJyA+ID4iKQorCisKK2NsYXNzIEZpeElucHV0KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIiIiCisgICAgICAgICAgICAgIHBvd2VyPCAnaW5wdXQnIGFyZ3M9dHJhaWxlcjwgJygnIFthbnldICcpJyA+ID4KKyAgICAgICAgICAgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICAjIElmIHdlJ3JlIGFscmVhZHkgd3JhcHBlZCBpbiBhIGV2YWwoKSBjYWxsLCB3ZSdyZSBkb25lLgorICAgICAgICBpZiBjb250ZXh0Lm1hdGNoKG5vZGUucGFyZW50LnBhcmVudCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBuZXcgPSBub2RlLmNsb25lKCkKKyAgICAgICAgbmV3LnByZWZpeCA9IHUiIgorICAgICAgICByZXR1cm4gQ2FsbChOYW1lKHUiZXZhbCIpLCBbbmV3XSwgcHJlZml4PW5vZGUucHJlZml4KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbnB1dC5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lucHV0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjBmYjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbnB1dC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbnB1dC5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lucHV0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjBmYjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbnB1dC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbnRlcm4ucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ludGVybi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2JiNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbnRlcm4ucHkKQEAgLTAsMCArMSw0NiBAQAorIyBDb3B5cmlnaHQgMjAwNiBHZW9yZyBCcmFuZGwuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgZm9yIGludGVybigpLgorCitpbnRlcm4ocykgLT4gc3lzLmludGVybihzKSIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IHB5dHJlZQorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIEF0dHIsIHRvdWNoX2ltcG9ydAorCisKK2NsYXNzIEZpeEludGVybihmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgb3JkZXIgPSAicHJlIgorCisgICAgUEFUVEVSTiA9ICIiIgorICAgIHBvd2VyPCAnaW50ZXJuJworICAgICAgICAgICB0cmFpbGVyPCBscGFyPScoJworICAgICAgICAgICAgICAgICAgICAoIG5vdChhcmdsaXN0IHwgYXJndW1lbnQ8YW55ICc9JyBhbnk+KSBvYmo9YW55CisgICAgICAgICAgICAgICAgICAgICAgfCBvYmo9YXJnbGlzdDwobm90IGFyZ3VtZW50PGFueSAnPScgYW55PikgYW55ICcsJz4gKQorICAgICAgICAgICAgICAgICAgICBycGFyPScpJyA+CisgICAgICAgICAgIGFmdGVyPWFueSoKKyAgICA+CisgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBzeW1zID0gc2VsZi5zeW1zCisgICAgICAgIG9iaiA9IHJlc3VsdHNbIm9iaiJdLmNsb25lKCkKKyAgICAgICAgaWYgb2JqLnR5cGUgPT0gc3ltcy5hcmdsaXN0OgorICAgICAgICAgICAgbmV3YXJnbGlzdCA9IG9iai5jbG9uZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXdhcmdsaXN0ID0gcHl0cmVlLk5vZGUoc3ltcy5hcmdsaXN0LCBbb2JqLmNsb25lKCldKQorICAgICAgICBhZnRlciA9IHJlc3VsdHNbImFmdGVyIl0KKyAgICAgICAgaWYgYWZ0ZXI6CisgICAgICAgICAgICBhZnRlciA9IFtuLmNsb25lKCkgZm9yIG4gaW4gYWZ0ZXJdCisgICAgICAgIG5ldyA9IHB5dHJlZS5Ob2RlKHN5bXMucG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIoTmFtZSh1InN5cyIpLCBOYW1lKHUiaW50ZXJuIikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3B5dHJlZS5Ob2RlKHN5bXMudHJhaWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZXN1bHRzWyJscGFyIl0uY2xvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdhcmdsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbInJwYXIiXS5jbG9uZSgpXSldICsgYWZ0ZXIpCisgICAgICAgIG5ldy5wcmVmaXggPSBub2RlLnByZWZpeAorICAgICAgICB0b3VjaF9pbXBvcnQoTm9uZSwgdSdzeXMnLCBub2RlKQorICAgICAgICByZXR1cm4gbmV3CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ludGVybi5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ludGVybi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkNDcyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW50ZXJuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ludGVybi5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ludGVybi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNkNDcyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW50ZXJuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lzaW5zdGFuY2UucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lzaW5zdGFuY2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwNGM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXNpbnN0YW5jZS5weQpAQCAtMCwwICsxLDUyIEBACisjIENvcHlyaWdodCAyMDA4IEFybWluIFJvbmFjaGVyLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkZpeGVyIHRoYXQgY2xlYW5zIHVwIGEgdHVwbGUgYXJndW1lbnQgdG8gaXNpbnN0YW5jZSBhZnRlciB0aGUgdG9rZW5zCitpbiBpdCB3ZXJlIGZpeGVkLiAgVGhpcyBpcyBtYWlubHkgdXNlZCB0byByZW1vdmUgZG91YmxlIG9jY3VycmVuY2VzIG9mCit0b2tlbnMgYXMgYSBsZWZ0b3ZlciBvZiB0aGUgbG9uZyAtPiBpbnQgLyB1bmljb2RlIC0+IHN0ciBjb252ZXJzaW9uLgorCitlZy4gIGlzaW5zdGFuY2UoeCwgKGludCwgbG9uZykpIC0+IGlzaW5zdGFuY2UoeCwgKGludCwgaW50KSkKKyAgICAgICAtPiBpc2luc3RhbmNlKHgsIGludCkKKyIiIgorCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgdG9rZW4KKworCitjbGFzcyBGaXhJc2luc3RhbmNlKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIiIiCisgICAgcG93ZXI8CisgICAgICAgICdpc2luc3RhbmNlJworICAgICAgICB0cmFpbGVyPCAnKCcgYXJnbGlzdDwgYW55ICcsJyBhdG9tPCAnKCcKKyAgICAgICAgICAgIGFyZ3M9dGVzdGxpc3RfZ2V4cDwgYW55KyA+CisgICAgICAgICcpJyA+ID4gJyknID4KKyAgICA+CisgICAgIiIiCisKKyAgICBydW5fb3JkZXIgPSA2CisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBuYW1lc19pbnNlcnRlZCA9IHNldCgpCisgICAgICAgIHRlc3RsaXN0ID0gcmVzdWx0c1siYXJncyJdCisgICAgICAgIGFyZ3MgPSB0ZXN0bGlzdC5jaGlsZHJlbgorICAgICAgICBuZXdfYXJncyA9IFtdCisgICAgICAgIGl0ZXJhdG9yID0gZW51bWVyYXRlKGFyZ3MpCisgICAgICAgIGZvciBpZHgsIGFyZyBpbiBpdGVyYXRvcjoKKyAgICAgICAgICAgIGlmIGFyZy50eXBlID09IHRva2VuLk5BTUUgYW5kIGFyZy52YWx1ZSBpbiBuYW1lc19pbnNlcnRlZDoKKyAgICAgICAgICAgICAgICBpZiBpZHggPCBsZW4oYXJncykgLSAxIGFuZCBhcmdzW2lkeCArIDFdLnR5cGUgPT0gdG9rZW4uQ09NTUE6CisgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLm5leHQoKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdfYXJncy5hcHBlbmQoYXJnKQorICAgICAgICAgICAgICAgIGlmIGFyZy50eXBlID09IHRva2VuLk5BTUU6CisgICAgICAgICAgICAgICAgICAgIG5hbWVzX2luc2VydGVkLmFkZChhcmcudmFsdWUpCisgICAgICAgIGlmIG5ld19hcmdzIGFuZCBuZXdfYXJnc1stMV0udHlwZSA9PSB0b2tlbi5DT01NQToKKyAgICAgICAgICAgIGRlbCBuZXdfYXJnc1stMV0KKyAgICAgICAgaWYgbGVuKG5ld19hcmdzKSA9PSAxOgorICAgICAgICAgICAgYXRvbSA9IHRlc3RsaXN0LnBhcmVudAorICAgICAgICAgICAgbmV3X2FyZ3NbMF0ucHJlZml4ID0gYXRvbS5wcmVmaXgKKyAgICAgICAgICAgIGF0b20ucmVwbGFjZShuZXdfYXJnc1swXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZ3NbOl0gPSBuZXdfYXJncworICAgICAgICAgICAgbm9kZS5jaGFuZ2VkKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXNpbnN0YW5jZS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lzaW5zdGFuY2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDUwZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lzaW5zdGFuY2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXNpbnN0YW5jZS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lzaW5zdGFuY2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDUwZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lzaW5zdGFuY2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmOGE0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzLnB5CkBAIC0wLDAgKzEsNDMgQEAKKyIiIiBGaXhlciBmb3IgaXRlcnRvb2xzLihpbWFwfGlmaWx0ZXJ8aXppcCkgLS0+IChtYXB8ZmlsdGVyfHppcCkgYW5kCisgICAgaXRlcnRvb2xzLmlmaWx0ZXJmYWxzZSAtLT4gaXRlcnRvb2xzLmZpbHRlcmZhbHNlIChidWdzIDIzNjAtMjM2MykKKworICAgIGltcG9ydHMgZnJvbSBpdGVydG9vbHMgYXJlIGZpeGVkIGluIGZpeF9pdGVydG9vbHNfaW1wb3J0LnB5CisKKyAgICBJZiBpdGVydG9vbHMgaXMgaW1wb3J0ZWQgYXMgc29tZXRoaW5nIGVsc2UgKGllOiBpbXBvcnQgaXRlcnRvb2xzIGFzIGl0OworICAgIGl0Lml6aXAoc3BhbSwgZWdncykpIG1ldGhvZCBjYWxscyB3aWxsIG5vdCBnZXQgZml4ZWQuCisgICAgIiIiCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUKKworY2xhc3MgRml4SXRlcnRvb2xzKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBpdF9mdW5jcyA9ICIoJ2ltYXAnfCdpZmlsdGVyJ3wnaXppcCd8J2l6aXBfbG9uZ2VzdCd8J2lmaWx0ZXJmYWxzZScpIgorICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgICAgICAgcG93ZXI8IGl0PSdpdGVydG9vbHMnCisgICAgICAgICAgICAgICAgICB0cmFpbGVyPAorICAgICAgICAgICAgICAgICAgICAgZG90PScuJyBmdW5jPSUoaXRfZnVuY3MpcyA+IHRyYWlsZXI8ICcoJyBbYW55XSAnKScgPiA+CisgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgcG93ZXI8IGZ1bmM9JShpdF9mdW5jcylzIHRyYWlsZXI8ICcoJyBbYW55XSAnKScgPiA+CisgICAgICAgICAgICAgICIiIiAlKGxvY2FscygpKQorCisgICAgIyBOZWVkcyB0byBiZSBydW4gYWZ0ZXIgZml4XyhtYXB8emlwfGZpbHRlcikKKyAgICBydW5fb3JkZXIgPSA2CisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBwcmVmaXggPSBOb25lCisgICAgICAgIGZ1bmMgPSByZXN1bHRzWydmdW5jJ11bMF0KKyAgICAgICAgaWYgKCdpdCcgaW4gcmVzdWx0cyBhbmQKKyAgICAgICAgICAgIGZ1bmMudmFsdWUgbm90IGluICh1J2lmaWx0ZXJmYWxzZScsIHUnaXppcF9sb25nZXN0JykpOgorICAgICAgICAgICAgZG90LCBpdCA9IChyZXN1bHRzWydkb3QnXSwgcmVzdWx0c1snaXQnXSkKKyAgICAgICAgICAgICMgUmVtb3ZlIHRoZSAnaXRlcnRvb2xzJworICAgICAgICAgICAgcHJlZml4ID0gaXQucHJlZml4CisgICAgICAgICAgICBpdC5yZW1vdmUoKQorICAgICAgICAgICAgIyBSZXBsYWNlIHRoZSBub2RlIHdpY2ggY29udGFpbnMgKCcuJywgJ2Z1bmN0aW9uJykgd2l0aCB0aGUKKyAgICAgICAgICAgICMgZnVuY3Rpb24gKHRvIGJlIGNvbnNpc3RhbnQgd2l0aCB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHBhdHRlcm4pCisgICAgICAgICAgICBkb3QucmVtb3ZlKCkKKyAgICAgICAgICAgIGZ1bmMucGFyZW50LnJlcGxhY2UoZnVuYykKKworICAgICAgICBwcmVmaXggPSBwcmVmaXggb3IgZnVuYy5wcmVmaXgKKyAgICAgICAgZnVuYy5yZXBsYWNlKE5hbWUoZnVuYy52YWx1ZVsxOl0sIHByZWZpeD1wcmVmaXgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHMucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODc5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29scy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHMucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODc5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29scy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHNfaW1wb3J0cy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzX2ltcG9ydHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2MTBjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzX2ltcG9ydHMucHkKQEAgLTAsMCArMSw1NyBAQAorIiIiIEZpeGVyIGZvciBpbXBvcnRzIG9mIGl0ZXJ0b29scy4oaW1hcHxpZmlsdGVyfGl6aXB8aWZpbHRlcmZhbHNlKSAiIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIGxpYjJ0bzMgaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gbGliMnRvMy5maXhlcl91dGlsIGltcG9ydCBCbGFua0xpbmUsIHN5bXMsIHRva2VuCisKKworY2xhc3MgRml4SXRlcnRvb2xzSW1wb3J0cyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgUEFUVEVSTiA9ICIiIgorICAgICAgICAgICAgICBpbXBvcnRfZnJvbTwgJ2Zyb20nICdpdGVydG9vbHMnICdpbXBvcnQnIGltcG9ydHM9YW55ID4KKyAgICAgICAgICAgICAgIiIiICUobG9jYWxzKCkpCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBpbXBvcnRzID0gcmVzdWx0c1snaW1wb3J0cyddCisgICAgICAgIGlmIGltcG9ydHMudHlwZSA9PSBzeW1zLmltcG9ydF9hc19uYW1lIG9yIG5vdCBpbXBvcnRzLmNoaWxkcmVuOgorICAgICAgICAgICAgY2hpbGRyZW4gPSBbaW1wb3J0c10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNoaWxkcmVuID0gaW1wb3J0cy5jaGlsZHJlbgorICAgICAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW5bOjoyXToKKyAgICAgICAgICAgIGlmIGNoaWxkLnR5cGUgPT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgICAgICBtZW1iZXIgPSBjaGlsZC52YWx1ZQorICAgICAgICAgICAgICAgIG5hbWVfbm9kZSA9IGNoaWxkCisgICAgICAgICAgICBlbGlmIGNoaWxkLnR5cGUgPT0gdG9rZW4uU1RBUjoKKyAgICAgICAgICAgICAgICAjIEp1c3QgbGVhdmUgdGhlIGltcG9ydCBhcyBpcy4KKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGNoaWxkLnR5cGUgPT0gc3ltcy5pbXBvcnRfYXNfbmFtZQorICAgICAgICAgICAgICAgIG5hbWVfbm9kZSA9IGNoaWxkLmNoaWxkcmVuWzBdCisgICAgICAgICAgICBtZW1iZXJfbmFtZSA9IG5hbWVfbm9kZS52YWx1ZQorICAgICAgICAgICAgaWYgbWVtYmVyX25hbWUgaW4gKHUnaW1hcCcsIHUnaXppcCcsIHUnaWZpbHRlcicpOgorICAgICAgICAgICAgICAgIGNoaWxkLnZhbHVlID0gTm9uZQorICAgICAgICAgICAgICAgIGNoaWxkLnJlbW92ZSgpCisgICAgICAgICAgICBlbGlmIG1lbWJlcl9uYW1lIGluICh1J2lmaWx0ZXJmYWxzZScsIHUnaXppcF9sb25nZXN0Jyk6CisgICAgICAgICAgICAgICAgbm9kZS5jaGFuZ2VkKCkKKyAgICAgICAgICAgICAgICBuYW1lX25vZGUudmFsdWUgPSAodSdmaWx0ZXJmYWxzZScgaWYgbWVtYmVyX25hbWVbMV0gPT0gdSdmJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHUnemlwX2xvbmdlc3QnKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBpbXBvcnQgc3RhdGVtZW50IGlzIHN0aWxsIHNhbmUKKyAgICAgICAgY2hpbGRyZW4gPSBpbXBvcnRzLmNoaWxkcmVuWzpdIG9yIFtpbXBvcnRzXQorICAgICAgICByZW1vdmVfY29tbWEgPSBUcnVlCisgICAgICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKKyAgICAgICAgICAgIGlmIHJlbW92ZV9jb21tYSBhbmQgY2hpbGQudHlwZSA9PSB0b2tlbi5DT01NQToKKyAgICAgICAgICAgICAgICBjaGlsZC5yZW1vdmUoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZW1vdmVfY29tbWEgXj0gVHJ1ZQorCisgICAgICAgIHdoaWxlIGNoaWxkcmVuIGFuZCBjaGlsZHJlblstMV0udHlwZSA9PSB0b2tlbi5DT01NQToKKyAgICAgICAgICAgIGNoaWxkcmVuLnBvcCgpLnJlbW92ZSgpCisKKyAgICAgICAgIyBJZiB0aGVyZSBhcmUgbm8gaW1wb3J0cyBsZWZ0LCBqdXN0IGdldCByaWQgb2YgdGhlIGVudGlyZSBzdGF0ZW1lbnQKKyAgICAgICAgaWYgKG5vdCAoaW1wb3J0cy5jaGlsZHJlbiBvciBnZXRhdHRyKGltcG9ydHMsICd2YWx1ZScsIE5vbmUpKSBvcgorICAgICAgICAgICAgaW1wb3J0cy5wYXJlbnQgaXMgTm9uZSk6CisgICAgICAgICAgICBwID0gbm9kZS5wcmVmaXgKKyAgICAgICAgICAgIG5vZGUgPSBCbGFua0xpbmUoKQorICAgICAgICAgICAgbm9kZS5wcmVmaXggPSBwCisgICAgICAgICAgICByZXR1cm4gbm9kZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHNfaW1wb3J0cy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29sc19pbXBvcnRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjNjZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHNfaW1wb3J0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHNfaW1wb3J0cy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29sc19pbXBvcnRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTc4Nzg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHNfaW1wb3J0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9sb25nLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9sb25nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZGRkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHkKQEAgLTAsMCArMSwxOSBAQAorIyBDb3B5cmlnaHQgMjAwNiBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJGaXhlciB0aGF0IHR1cm5zICdsb25nJyBpbnRvICdpbnQnIGV2ZXJ5d2hlcmUuCisiIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIGxpYjJ0bzMgaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gbGliMnRvMy5maXhlcl91dGlsIGltcG9ydCBpc19wcm9iYWJseV9idWlsdGluCisKKworY2xhc3MgRml4TG9uZyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgUEFUVEVSTiA9ICInbG9uZyciCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBpZiBpc19wcm9iYWJseV9idWlsdGluKG5vZGUpOgorICAgICAgICAgICAgbm9kZS52YWx1ZSA9IHUiaW50IgorICAgICAgICAgICAgbm9kZS5jaGFuZ2VkKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbG9uZy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMzY4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbG9uZy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMzY4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWFwLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tYXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3ZDBkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWFwLnB5CkBAIC0wLDAgKzEsOTEgQEAKKyMgQ29weXJpZ2h0IDIwMDcgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgdGhhdCBjaGFuZ2VzIG1hcChGLCAuLi4pIGludG8gbGlzdChtYXAoRiwgLi4uKSkgdW5sZXNzIHRoZXJlCitleGlzdHMgYSAnZnJvbSBmdXR1cmVfYnVpbHRpbnMgaW1wb3J0IG1hcCcgc3RhdGVtZW50IGluIHRoZSB0b3AtbGV2ZWwKK25hbWVzcGFjZS4KKworQXMgYSBzcGVjaWFsIGNhc2UsIG1hcChOb25lLCBYKSBpcyBjaGFuZ2VkIGludG8gbGlzdChYKS4gIChUaGlzIGlzCituZWNlc3NhcnkgYmVjYXVzZSB0aGUgc2VtYW50aWNzIGFyZSBjaGFuZ2VkIGluIHRoaXMgY2FzZSAtLSB0aGUgbmV3CittYXAoTm9uZSwgWCkgaXMgZXF1aXZhbGVudCB0byBbKHgsKSBmb3IgeCBpbiBYXS4pCisKK1dlIGF2b2lkIHRoZSB0cmFuc2Zvcm1hdGlvbiAoZXhjZXB0IGZvciB0aGUgc3BlY2lhbCBjYXNlIG1lbnRpb25lZAorYWJvdmUpIGlmIHRoZSBtYXAoKSBjYWxsIGlzIGRpcmVjdGx5IGNvbnRhaW5lZCBpbiBpdGVyKDw+KSwgbGlzdCg8PiksCit0dXBsZSg8PiksIHNvcnRlZCg8PiksIC4uLmpvaW4oPD4pLCBvciBmb3IgViBpbiA8PjouCisKK05PVEU6IFRoaXMgaXMgc3RpbGwgbm90IGNvcnJlY3QgaWYgdGhlIG9yaWdpbmFsIGNvZGUgd2FzIGRlcGVuZGluZyBvbgorbWFwKEYsIFgsIFksIC4uLikgdG8gZ28gb24gdW50aWwgdGhlIGxvbmdlc3QgYXJndW1lbnQgaXMgZXhoYXVzdGVkLAorc3Vic3RpdHV0aW5nIE5vbmUgZm9yIG1pc3NpbmcgdmFsdWVzIC0tIGxpa2UgemlwKCksIGl0IG5vdyBzdG9wcyBhcworc29vbiBhcyB0aGUgc2hvcnRlc3QgYXJndW1lbnQgaXMgZXhoYXVzdGVkLgorIiIiCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIExpc3RDb21wLCBpbl9zcGVjaWFsX2NvbnRleHQKK2Zyb20gLi5weWdyYW0gaW1wb3J0IHB5dGhvbl9zeW1ib2xzIGFzIHN5bXMKKworY2xhc3MgRml4TWFwKGZpeGVyX2Jhc2UuQ29uZGl0aW9uYWxGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisKKyAgICBQQVRURVJOID0gIiIiCisgICAgbWFwX25vbmU9cG93ZXI8CisgICAgICAgICdtYXAnCisgICAgICAgIHRyYWlsZXI8ICcoJyBhcmdsaXN0PCAnTm9uZScgJywnIGFyZz1hbnkgWycsJ10gPiAnKScgPgorICAgID4KKyAgICB8CisgICAgbWFwX2xhbWJkYT1wb3dlcjwKKyAgICAgICAgJ21hcCcKKyAgICAgICAgdHJhaWxlcjwKKyAgICAgICAgICAgICcoJworICAgICAgICAgICAgYXJnbGlzdDwKKyAgICAgICAgICAgICAgICBsYW1iZGVmPCAnbGFtYmRhJworICAgICAgICAgICAgICAgICAgICAgICAgIChmcD1OQU1FIHwgdmZwZGVmPCAnKCcgZnA9TkFNRSAnKSc+ICkgJzonIHhwPWFueQorICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICAnLCcKKyAgICAgICAgICAgICAgICBpdD1hbnkKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICcpJworICAgICAgICA+CisgICAgPgorICAgIHwKKyAgICBwb3dlcjwKKyAgICAgICAgJ21hcCcgdHJhaWxlcjwgJygnIFthcmdsaXN0PWFueV0gJyknID4KKyAgICA+CisgICAgIiIiCisKKyAgICBza2lwX29uID0gJ2Z1dHVyZV9idWlsdGlucy5tYXAnCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBpZiBzZWxmLnNob3VsZF9za2lwKG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgbm9kZS5wYXJlbnQudHlwZSA9PSBzeW1zLnNpbXBsZV9zdG10OgorICAgICAgICAgICAgc2VsZi53YXJuaW5nKG5vZGUsICJZb3Ugc2hvdWxkIHVzZSBhIGZvciBsb29wIGhlcmUiKQorICAgICAgICAgICAgbmV3ID0gbm9kZS5jbG9uZSgpCisgICAgICAgICAgICBuZXcucHJlZml4ID0gdSIiCisgICAgICAgICAgICBuZXcgPSBDYWxsKE5hbWUodSJsaXN0IiksIFtuZXddKQorICAgICAgICBlbGlmICJtYXBfbGFtYmRhIiBpbiByZXN1bHRzOgorICAgICAgICAgICAgbmV3ID0gTGlzdENvbXAocmVzdWx0c1sieHAiXS5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1siZnAiXS5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1siaXQiXS5jbG9uZSgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgIm1hcF9ub25lIiBpbiByZXN1bHRzOgorICAgICAgICAgICAgICAgIG5ldyA9IHJlc3VsdHNbImFyZyJdLmNsb25lKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgImFyZ2xpc3QiIGluIHJlc3VsdHM6CisgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSByZXN1bHRzWyJhcmdsaXN0Il0KKyAgICAgICAgICAgICAgICAgICAgaWYgYXJncy50eXBlID09IHN5bXMuYXJnbGlzdCBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmNoaWxkcmVuWzBdLnR5cGUgPT0gdG9rZW4uTkFNRSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmNoaWxkcmVuWzBdLnZhbHVlID09ICJOb25lIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2FybmluZyhub2RlLCAiY2Fubm90IGNvbnZlcnQgbWFwKE5vbmUsIC4uLikgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIG11bHRpcGxlIGFyZ3VtZW50cyBiZWNhdXNlIG1hcCgpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm93IHRydW5jYXRlcyB0byB0aGUgc2hvcnRlc3Qgc2VxdWVuY2UiKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgaWYgaW5fc3BlY2lhbF9jb250ZXh0KG5vZGUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIG5ldyA9IG5vZGUuY2xvbmUoKQorICAgICAgICAgICAgbmV3LnByZWZpeCA9IHUiIgorICAgICAgICAgICAgbmV3ID0gQ2FsbChOYW1lKHUibGlzdCIpLCBbbmV3XSkKKyAgICAgICAgbmV3LnByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgIHJldHVybiBuZXcKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWFwLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWFwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGE5MTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tYXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWFwLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWFwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGE5MTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tYXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tZXRhY2xhc3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2ZmJlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5CkBAIC0wLDAgKzEsMjI4IEBACisiIiJGaXhlciBmb3IgX19tZXRhY2xhc3NfXyA9IFggLT4gKG1ldGFjbGFzcz1YKSBtZXRob2RzLgorCisgICBUaGUgdmFyaW91cyBmb3JtcyBvZiBjbGFzc2VmIChpbmhlcml0cyBub3RoaW5nLCBpbmhlcml0cyBvbmNlLCBpbmhlcmludHMKKyAgIG1hbnkpIGRvbid0IHBhcnNlIHRoZSBzYW1lIGluIHRoZSBDU1Qgc28gd2UgbG9vayBhdCBBTEwgY2xhc3NlcyBmb3IKKyAgIGEgX19tZXRhY2xhc3NfXyBhbmQgaWYgd2UgZmluZCBvbmUgbm9ybWFsaXplIHRoZSBpbmhlcml0cyB0byBhbGwgYmUKKyAgIGFuIGFyZ2xpc3QuCisKKyAgIEZvciBvbmUtbGluZXIgY2xhc3NlcyAoJ2NsYXNzIFg6IHBhc3MnKSB0aGVyZSBpcyBubyBpbmRlbnQvZGVkZW50IHNvCisgICB3ZSBub3JtYWxpemUgdGhvc2UgaW50byBoYXZpbmcgYSBzdWl0ZS4KKworICAgTW92aW5nIHRoZSBfX21ldGFjbGFzc19fIGludG8gdGhlIGNsYXNzZGVmIGNhbiBhbHNvIGNhdXNlIHRoZSBjbGFzcworICAgYm9keSB0byBiZSBlbXB0eSBzbyB0aGVyZSBpcyBzb21lIHNwZWNpYWwgY2FzaW5nIGZvciB0aGF0IGFzIHdlbGwuCisKKyAgIFRoaXMgZml4ZXIgYWxzbyB0cmllcyB2ZXJ5IGhhcmQgdG8ga2VlcCBvcmlnaW5hbCBpbmRlbnRpbmcgYW5kIHNwYWNpbmcKKyAgIGluIGFsbCB0aG9zZSBjb3JuZXIgY2FzZXMuCisKKyIiIgorIyBBdXRob3I6IEphY2sgRGllZGVyaWNoCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLnB5Z3JhbSBpbXBvcnQgdG9rZW4KK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBzeW1zLCBOb2RlLCBMZWFmCisKKworZGVmIGhhc19tZXRhY2xhc3MocGFyZW50KToKKyAgICAiIiIgd2UgaGF2ZSB0byBjaGVjayB0aGUgY2xzX25vZGUgd2l0aG91dCBjaGFuZ2luZyBpdC4KKyAgICAgICAgVGhlcmUgYXJlIHR3byBwb3NzaWJsaXRpZXM6CisgICAgICAgICAgMSkgIGNsc2RlZiA9PiBzdWl0ZSA9PiBzaW1wbGVfc3RtdCA9PiBleHByX3N0bXQgPT4gTGVhZignX19tZXRhJykKKyAgICAgICAgICAyKSAgY2xzZGVmID0+IHNpbXBsZV9zdG10ID0+IGV4cHJfc3RtdCA9PiBMZWFmKCdfX21ldGEnKQorICAgICIiIgorICAgIGZvciBub2RlIGluIHBhcmVudC5jaGlsZHJlbjoKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHN5bXMuc3VpdGU6CisgICAgICAgICAgICByZXR1cm4gaGFzX21ldGFjbGFzcyhub2RlKQorICAgICAgICBlbGlmIG5vZGUudHlwZSA9PSBzeW1zLnNpbXBsZV9zdG10IGFuZCBub2RlLmNoaWxkcmVuOgorICAgICAgICAgICAgZXhwcl9ub2RlID0gbm9kZS5jaGlsZHJlblswXQorICAgICAgICAgICAgaWYgZXhwcl9ub2RlLnR5cGUgPT0gc3ltcy5leHByX3N0bXQgYW5kIGV4cHJfbm9kZS5jaGlsZHJlbjoKKyAgICAgICAgICAgICAgICBsZWZ0X3NpZGUgPSBleHByX25vZGUuY2hpbGRyZW5bMF0KKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGxlZnRfc2lkZSwgTGVhZikgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfc2lkZS52YWx1ZSA9PSAnX19tZXRhY2xhc3NfXyc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIGZpeHVwX3BhcnNlX3RyZWUoY2xzX25vZGUpOgorICAgICIiIiBvbmUtbGluZSBjbGFzc2VzIGRvbid0IGdldCBhIHN1aXRlIGluIHRoZSBwYXJzZSB0cmVlIHNvIHdlIGFkZAorICAgICAgICBvbmUgdG8gbm9ybWFsaXplIHRoZSB0cmVlCisgICAgIiIiCisgICAgZm9yIG5vZGUgaW4gY2xzX25vZGUuY2hpbGRyZW46CisgICAgICAgIGlmIG5vZGUudHlwZSA9PSBzeW1zLnN1aXRlOgorICAgICAgICAgICAgIyBhbHJlYWR5IGluIHRoZSBwcmVmZXJyZWQgZm9ybWF0LCBkbyBub3RoaW5nCisgICAgICAgICAgICByZXR1cm4KKworICAgICMgISVAIyEgb25lbGluZXJzIGhhdmUgbm8gc3VpdGUgbm9kZSwgd2UgaGF2ZSB0byBmYWtlIG9uZSB1cAorICAgIGZvciBpLCBub2RlIGluIGVudW1lcmF0ZShjbHNfbm9kZS5jaGlsZHJlbik6CisgICAgICAgIGlmIG5vZGUudHlwZSA9PSB0b2tlbi5DT0xPTjoKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm8gY2xhc3Mgc3VpdGUgYW5kIG5vICc6JyEiKQorCisgICAgIyBtb3ZlIGV2ZXJ5dGhpbmcgaW50byBhIHN1aXRlIG5vZGUKKyAgICBzdWl0ZSA9IE5vZGUoc3ltcy5zdWl0ZSwgW10pCisgICAgd2hpbGUgY2xzX25vZGUuY2hpbGRyZW5baSsxOl06CisgICAgICAgIG1vdmVfbm9kZSA9IGNsc19ub2RlLmNoaWxkcmVuW2krMV0KKyAgICAgICAgc3VpdGUuYXBwZW5kX2NoaWxkKG1vdmVfbm9kZS5jbG9uZSgpKQorICAgICAgICBtb3ZlX25vZGUucmVtb3ZlKCkKKyAgICBjbHNfbm9kZS5hcHBlbmRfY2hpbGQoc3VpdGUpCisgICAgbm9kZSA9IHN1aXRlCisKKworZGVmIGZpeHVwX3NpbXBsZV9zdG10KHBhcmVudCwgaSwgc3RtdF9ub2RlKToKKyAgICAiIiIgaWYgdGhlcmUgaXMgYSBzZW1pLWNvbG9uIGFsbCB0aGUgcGFydHMgY291bnQgYXMgcGFydCBvZiB0aGUgc2FtZQorICAgICAgICBzaW1wbGVfc3RtdC4gIFdlIGp1c3Qgd2FudCB0aGUgX19tZXRhY2xhc3NfXyBwYXJ0IHNvIHdlIG1vdmUKKyAgICAgICAgZXZlcnl0aGluZyBlZnRlciB0aGUgc2VtaS1jb2xvbiBpbnRvIGl0cyBvd24gc2ltcGxlX3N0bXQgbm9kZQorICAgICIiIgorICAgIGZvciBzZW1pX2luZCwgbm9kZSBpbiBlbnVtZXJhdGUoc3RtdF9ub2RlLmNoaWxkcmVuKToKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHRva2VuLlNFTUk6ICMgKnNpZ2gqCisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIHJldHVybgorCisgICAgbm9kZS5yZW1vdmUoKSAjIGtpbGwgdGhlIHNlbWljb2xvbgorICAgIG5ld19leHByID0gTm9kZShzeW1zLmV4cHJfc3RtdCwgW10pCisgICAgbmV3X3N0bXQgPSBOb2RlKHN5bXMuc2ltcGxlX3N0bXQsIFtuZXdfZXhwcl0pCisgICAgd2hpbGUgc3RtdF9ub2RlLmNoaWxkcmVuW3NlbWlfaW5kOl06CisgICAgICAgIG1vdmVfbm9kZSA9IHN0bXRfbm9kZS5jaGlsZHJlbltzZW1pX2luZF0KKyAgICAgICAgbmV3X2V4cHIuYXBwZW5kX2NoaWxkKG1vdmVfbm9kZS5jbG9uZSgpKQorICAgICAgICBtb3ZlX25vZGUucmVtb3ZlKCkKKyAgICBwYXJlbnQuaW5zZXJ0X2NoaWxkKGksIG5ld19zdG10KQorICAgIG5ld19sZWFmMSA9IG5ld19zdG10LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdCisgICAgb2xkX2xlYWYxID0gc3RtdF9ub2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdCisgICAgbmV3X2xlYWYxLnByZWZpeCA9IG9sZF9sZWFmMS5wcmVmaXgKKworCitkZWYgcmVtb3ZlX3RyYWlsaW5nX25ld2xpbmUobm9kZSk6CisgICAgaWYgbm9kZS5jaGlsZHJlbiBhbmQgbm9kZS5jaGlsZHJlblstMV0udHlwZSA9PSB0b2tlbi5ORVdMSU5FOgorICAgICAgICBub2RlLmNoaWxkcmVuWy0xXS5yZW1vdmUoKQorCisKK2RlZiBmaW5kX21ldGFzKGNsc19ub2RlKToKKyAgICAjIGZpbmQgdGhlIHN1aXRlIG5vZGUgKE1tbSwgc3dlZXQgbm9kZXMpCisgICAgZm9yIG5vZGUgaW4gY2xzX25vZGUuY2hpbGRyZW46CisgICAgICAgIGlmIG5vZGUudHlwZSA9PSBzeW1zLnN1aXRlOgorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJObyBjbGFzcyBzdWl0ZSEiKQorCisgICAgIyBsb29rIGZvciBzaW1wbGVfc3RtdFsgZXhwcl9zdG10WyBMZWFmKCdfX21ldGFjbGFzc19fJykgXSBdCisgICAgZm9yIGksIHNpbXBsZV9ub2RlIGluIGxpc3QoZW51bWVyYXRlKG5vZGUuY2hpbGRyZW4pKToKKyAgICAgICAgaWYgc2ltcGxlX25vZGUudHlwZSA9PSBzeW1zLnNpbXBsZV9zdG10IGFuZCBzaW1wbGVfbm9kZS5jaGlsZHJlbjoKKyAgICAgICAgICAgIGV4cHJfbm9kZSA9IHNpbXBsZV9ub2RlLmNoaWxkcmVuWzBdCisgICAgICAgICAgICBpZiBleHByX25vZGUudHlwZSA9PSBzeW1zLmV4cHJfc3RtdCBhbmQgZXhwcl9ub2RlLmNoaWxkcmVuOgorICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIGV4cHJfbm9kZSBpcyBhIHNpbXBsZSBhc3NpZ25tZW50LgorICAgICAgICAgICAgICAgIGxlZnRfbm9kZSA9IGV4cHJfbm9kZS5jaGlsZHJlblswXQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobGVmdF9ub2RlLCBMZWFmKSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9ub2RlLnZhbHVlID09IHUnX19tZXRhY2xhc3NfXyc6CisgICAgICAgICAgICAgICAgICAgICMgV2UgZm91bmQgYSBhc3NpZ25tZW50IHRvIF9fbWV0YWNsYXNzX18uCisgICAgICAgICAgICAgICAgICAgIGZpeHVwX3NpbXBsZV9zdG10KG5vZGUsIGksIHNpbXBsZV9ub2RlKQorICAgICAgICAgICAgICAgICAgICByZW1vdmVfdHJhaWxpbmdfbmV3bGluZShzaW1wbGVfbm9kZSkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKG5vZGUsIGksIHNpbXBsZV9ub2RlKQorCisKK2RlZiBmaXh1cF9pbmRlbnQoc3VpdGUpOgorICAgICIiIiBJZiBhbiBJTkRFTlQgaXMgZm9sbG93ZWQgYnkgYSB0aGluZyB3aXRoIGEgcHJlZml4IHRoZW4gbnVrZSB0aGUgcHJlZml4CisgICAgICAgIE90aGVyd2lzZSB3ZSBnZXQgaW4gdHJvdWJsZSB3aGVuIHJlbW92aW5nIF9fbWV0YWNsYXNzX18gYXQgc3VpdGUgc3RhcnQKKyAgICAiIiIKKyAgICBraWRzID0gc3VpdGUuY2hpbGRyZW5bOjotMV0KKyAgICAjIGZpbmQgdGhlIGZpcnN0IGluZGVudAorICAgIHdoaWxlIGtpZHM6CisgICAgICAgIG5vZGUgPSBraWRzLnBvcCgpCisgICAgICAgIGlmIG5vZGUudHlwZSA9PSB0b2tlbi5JTkRFTlQ6CisgICAgICAgICAgICBicmVhaworCisgICAgIyBmaW5kIHRoZSBmaXJzdCBMZWFmCisgICAgd2hpbGUga2lkczoKKyAgICAgICAgbm9kZSA9IGtpZHMucG9wKCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCBMZWFmKSBhbmQgbm9kZS50eXBlICE9IHRva2VuLkRFREVOVDoKKyAgICAgICAgICAgIGlmIG5vZGUucHJlZml4OgorICAgICAgICAgICAgICAgIG5vZGUucHJlZml4ID0gdScnCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGtpZHMuZXh0ZW5kKG5vZGUuY2hpbGRyZW5bOjotMV0pCisKKworY2xhc3MgRml4TWV0YWNsYXNzKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICBjbGFzc2RlZjxhbnkqPgorICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgaWYgbm90IGhhc19tZXRhY2xhc3Mobm9kZSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmaXh1cF9wYXJzZV90cmVlKG5vZGUpCisKKyAgICAgICAgIyBmaW5kIG1ldGFjbGFzc2VzLCBrZWVwIHRoZSBsYXN0IG9uZQorICAgICAgICBsYXN0X21ldGFjbGFzcyA9IE5vbmUKKyAgICAgICAgZm9yIHN1aXRlLCBpLCBzdG10IGluIGZpbmRfbWV0YXMobm9kZSk6CisgICAgICAgICAgICBsYXN0X21ldGFjbGFzcyA9IHN0bXQKKyAgICAgICAgICAgIHN0bXQucmVtb3ZlKCkKKworICAgICAgICB0ZXh0X3R5cGUgPSBub2RlLmNoaWxkcmVuWzBdLnR5cGUgIyBhbHdheXMgTGVhZihubm4sICdjbGFzcycpCisKKyAgICAgICAgIyBmaWd1cmUgb3V0IHdoYXQga2luZCBvZiBjbGFzc2RlZiB3ZSBoYXZlCisgICAgICAgIGlmIGxlbihub2RlLmNoaWxkcmVuKSA9PSA3OgorICAgICAgICAgICAgIyBOb2RlKGNsYXNzZGVmLCBbJ2NsYXNzJywgJ25hbWUnLCAnKCcsIGFyZ2xpc3QsICcpJywgJzonLCBzdWl0ZV0pCisgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAwICAgICAgICAxICAgICAgIDIgICAgMyAgICAgICAgNCAgICA1ICAgIDYKKyAgICAgICAgICAgIGlmIG5vZGUuY2hpbGRyZW5bM10udHlwZSA9PSBzeW1zLmFyZ2xpc3Q6CisgICAgICAgICAgICAgICAgYXJnbGlzdCA9IG5vZGUuY2hpbGRyZW5bM10KKyAgICAgICAgICAgICMgTm9kZShjbGFzc2RlZiwgWydjbGFzcycsICduYW1lJywgJygnLCAnUGFyZW50JywgJyknLCAnOicsIHN1aXRlXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFyZW50ID0gbm9kZS5jaGlsZHJlblszXS5jbG9uZSgpCisgICAgICAgICAgICAgICAgYXJnbGlzdCA9IE5vZGUoc3ltcy5hcmdsaXN0LCBbcGFyZW50XSkKKyAgICAgICAgICAgICAgICBub2RlLnNldF9jaGlsZCgzLCBhcmdsaXN0KQorICAgICAgICBlbGlmIGxlbihub2RlLmNoaWxkcmVuKSA9PSA2OgorICAgICAgICAgICAgIyBOb2RlKGNsYXNzZGVmLCBbJ2NsYXNzJywgJ25hbWUnLCAnKCcsICAnKScsICc6Jywgc3VpdGVdKQorICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgMCAgICAgICAgMSAgICAgICAyICAgICAzICAgIDQgICAgNQorICAgICAgICAgICAgYXJnbGlzdCA9IE5vZGUoc3ltcy5hcmdsaXN0LCBbXSkKKyAgICAgICAgICAgIG5vZGUuaW5zZXJ0X2NoaWxkKDMsIGFyZ2xpc3QpCisgICAgICAgIGVsaWYgbGVuKG5vZGUuY2hpbGRyZW4pID09IDQ6CisgICAgICAgICAgICAjIE5vZGUoY2xhc3NkZWYsIFsnY2xhc3MnLCAnbmFtZScsICc6Jywgc3VpdGVdKQorICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgMCAgICAgICAgMSAgICAgICAyICAgIDMKKyAgICAgICAgICAgIGFyZ2xpc3QgPSBOb2RlKHN5bXMuYXJnbGlzdCwgW10pCisgICAgICAgICAgICBub2RlLmluc2VydF9jaGlsZCgyLCBMZWFmKHRva2VuLlJQQVIsIHUnKScpKQorICAgICAgICAgICAgbm9kZS5pbnNlcnRfY2hpbGQoMiwgYXJnbGlzdCkKKyAgICAgICAgICAgIG5vZGUuaW5zZXJ0X2NoaWxkKDIsIExlYWYodG9rZW4uTFBBUiwgdScoJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmV4cGVjdGVkIGNsYXNzIGRlZmluaXRpb24iKQorCisgICAgICAgICMgbm93IHN0aWNrIHRoZSBtZXRhY2xhc3MgaW4gdGhlIGFyZ2xpc3QKKyAgICAgICAgbWV0YV90eHQgPSBsYXN0X21ldGFjbGFzcy5jaGlsZHJlblswXS5jaGlsZHJlblswXQorICAgICAgICBtZXRhX3R4dC52YWx1ZSA9ICdtZXRhY2xhc3MnCisgICAgICAgIG9yaWdfbWV0YV9wcmVmaXggPSBtZXRhX3R4dC5wcmVmaXgKKworICAgICAgICBpZiBhcmdsaXN0LmNoaWxkcmVuOgorICAgICAgICAgICAgYXJnbGlzdC5hcHBlbmRfY2hpbGQoTGVhZih0b2tlbi5DT01NQSwgdScsJykpCisgICAgICAgICAgICBtZXRhX3R4dC5wcmVmaXggPSB1JyAnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtZXRhX3R4dC5wcmVmaXggPSB1JycKKworICAgICAgICAjIGNvbXBhY3QgdGhlIGV4cHJlc3Npb24gIm1ldGFjbGFzcyA9IE1ldGEiIC0+ICJtZXRhY2xhc3M9TWV0YSIKKyAgICAgICAgZXhwcl9zdG10ID0gbGFzdF9tZXRhY2xhc3MuY2hpbGRyZW5bMF0KKyAgICAgICAgYXNzZXJ0IGV4cHJfc3RtdC50eXBlID09IHN5bXMuZXhwcl9zdG10CisgICAgICAgIGV4cHJfc3RtdC5jaGlsZHJlblsxXS5wcmVmaXggPSB1JycKKyAgICAgICAgZXhwcl9zdG10LmNoaWxkcmVuWzJdLnByZWZpeCA9IHUnJworCisgICAgICAgIGFyZ2xpc3QuYXBwZW5kX2NoaWxkKGxhc3RfbWV0YWNsYXNzKQorCisgICAgICAgIGZpeHVwX2luZGVudChzdWl0ZSkKKworICAgICAgICAjIGNoZWNrIGZvciBlbXB0eSBzdWl0ZQorICAgICAgICBpZiBub3Qgc3VpdGUuY2hpbGRyZW46CisgICAgICAgICAgICAjIG9uZS1saW5lciB0aGF0IHdhcyBqdXN0IF9fbWV0YWNsYXNzXworICAgICAgICAgICAgc3VpdGUucmVtb3ZlKCkKKyAgICAgICAgICAgIHBhc3NfbGVhZiA9IExlYWYodGV4dF90eXBlLCB1J3Bhc3MnKQorICAgICAgICAgICAgcGFzc19sZWFmLnByZWZpeCA9IG9yaWdfbWV0YV9wcmVmaXgKKyAgICAgICAgICAgIG5vZGUuYXBwZW5kX2NoaWxkKHBhc3NfbGVhZikKKyAgICAgICAgICAgIG5vZGUuYXBwZW5kX2NoaWxkKExlYWYodG9rZW4uTkVXTElORSwgdSdcbicpKQorCisgICAgICAgIGVsaWYgbGVuKHN1aXRlLmNoaWxkcmVuKSA+IDEgYW5kIFwKKyAgICAgICAgICAgICAgICAgKHN1aXRlLmNoaWxkcmVuWy0yXS50eXBlID09IHRva2VuLklOREVOVCBhbmQKKyAgICAgICAgICAgICAgICAgIHN1aXRlLmNoaWxkcmVuWy0xXS50eXBlID09IHRva2VuLkRFREVOVCk6CisgICAgICAgICAgICAjIHRoZXJlIHdhcyBvbmx5IG9uZSBsaW5lIGluIHRoZSBjbGFzcyBib2R5IGFuZCBpdCB3YXMgX19tZXRhY2xhc3NfXworICAgICAgICAgICAgcGFzc19sZWFmID0gTGVhZih0ZXh0X3R5cGUsIHUncGFzcycpCisgICAgICAgICAgICBzdWl0ZS5pbnNlcnRfY2hpbGQoLTEsIHBhc3NfbGVhZikKKyAgICAgICAgICAgIHN1aXRlLmluc2VydF9jaGlsZCgtMSwgTGVhZih0b2tlbi5ORVdMSU5FLCB1J1xuJykpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4YmU2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1MzUyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21ldGhvZGF0dHJzLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tZXRob2RhdHRycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2MxZWNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tZXRob2RhdHRycy5weQpAQCAtMCwwICsxLDI0IEBACisiIiJGaXggYm91bmQgbWV0aG9kIGF0dHJpYnV0ZXMgKG1ldGhvZC5pbV8/IC0+IG1ldGhvZC5fXz9fXykuCisiIiIKKyMgQXV0aG9yOiBDaHJpc3RpYW4gSGVpbWVzCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUKKworTUFQID0geworICAgICJpbV9mdW5jIiA6ICJfX2Z1bmNfXyIsCisgICAgImltX3NlbGYiIDogIl9fc2VsZl9fIiwKKyAgICAiaW1fY2xhc3MiIDogIl9fc2VsZl9fLl9fY2xhc3NfXyIKKyAgICB9CisKK2NsYXNzIEZpeE1ldGhvZGF0dHJzKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIiIiCisgICAgcG93ZXI8IGFueSsgdHJhaWxlcjwgJy4nIGF0dHI9KCdpbV9mdW5jJyB8ICdpbV9zZWxmJyB8ICdpbV9jbGFzcycpID4gYW55KiA+CisgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBhdHRyID0gcmVzdWx0c1siYXR0ciJdWzBdCisgICAgICAgIG5ldyA9IHVuaWNvZGUoTUFQW2F0dHIudmFsdWVdKQorICAgICAgICBhdHRyLnJlcGxhY2UoTmFtZShuZXcsIHByZWZpeD1hdHRyLnByZWZpeCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21ldGhvZGF0dHJzLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0aG9kYXR0cnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYzQ1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21ldGhvZGF0dHJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21ldGhvZGF0dHJzLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0aG9kYXR0cnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYzQ1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21ldGhvZGF0dHJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25lLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDI1OTgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZS5weQpAQCAtMCwwICsxLDIzIEBACisjIENvcHlyaWdodCAyMDA2IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkZpeGVyIHRoYXQgdHVybnMgPD4gaW50byAhPS4iIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBweXRyZWUKK2Zyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKKworCitjbGFzcyBGaXhOZShmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgICMgVGhpcyBpcyBzbyBzaW1wbGUgdGhhdCB3ZSBkb24ndCBuZWVkIHRoZSBwYXR0ZXJuIGNvbXBpbGVyLgorCisgICAgX2FjY2VwdF90eXBlID0gdG9rZW4uTk9URVFVQUwKKworICAgIGRlZiBtYXRjaChzZWxmLCBub2RlKToKKyAgICAgICAgIyBPdmVycmlkZQorICAgICAgICByZXR1cm4gbm9kZS52YWx1ZSA9PSB1Ijw+IgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgbmV3ID0gcHl0cmVlLkxlYWYodG9rZW4uTk9URVFVQUwsIHUiIT0iLCBwcmVmaXg9bm9kZS5wcmVmaXgpCisgICAgICAgIHJldHVybiBuZXcKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmUucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5MzgwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmUucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5MzgwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmV4dC5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmV4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDIxYTliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZXh0LnB5CkBAIC0wLDAgKzEsMTAzIEBACisiIiJGaXhlciBmb3IgaXQubmV4dCgpIC0+IG5leHQoaXQpLCBwZXIgUEVQIDMxMTQuIiIiCisjIEF1dGhvcjogQ29sbGluIFdpbnRlcgorCisjIFRoaW5ncyB0aGF0IGN1cnJlbnRseSBhcmVuJ3QgY292ZXJlZDoKKyMgICAtIGxpc3Rjb21wICJuZXh0IiBuYW1lcyBhcmVuJ3Qgd2FybmVkCisjICAgLSAid2l0aCIgc3RhdGVtZW50IHRhcmdldHMgYXJlbid0IGNoZWNrZWQKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC4ucHlncmFtIGltcG9ydCBweXRob25fc3ltYm9scyBhcyBzeW1zCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgQ2FsbCwgZmluZF9iaW5kaW5nCisKK2JpbmRfd2FybmluZyA9ICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCBieSBnbG9iYWwgYmluZGluZyIKKworCitjbGFzcyBGaXhOZXh0KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIiIiCisgICAgcG93ZXI8IGJhc2U9YW55KyB0cmFpbGVyPCAnLicgYXR0cj0nbmV4dCcgPiB0cmFpbGVyPCAnKCcgJyknID4gPgorICAgIHwKKyAgICBwb3dlcjwgaGVhZD1hbnkrIHRyYWlsZXI8ICcuJyBhdHRyPSduZXh0JyA+IG5vdCB0cmFpbGVyPCAnKCcgJyknID4gPgorICAgIHwKKyAgICBjbGFzc2RlZjwgJ2NsYXNzJyBhbnkrICc6JworICAgICAgICAgICAgICBzdWl0ZTwgYW55KgorICAgICAgICAgICAgICAgICAgICAgZnVuY2RlZjwgJ2RlZicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J25leHQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzPCAnKCcgTkFNRSAnKScgPiBhbnkrID4KKyAgICAgICAgICAgICAgICAgICAgIGFueSogPiA+CisgICAgfAorICAgIGdsb2JhbD1nbG9iYWxfc3RtdDwgJ2dsb2JhbCcgYW55KiAnbmV4dCcgYW55KiA+CisgICAgIiIiCisKKyAgICBvcmRlciA9ICJwcmUiICMgUHJlLW9yZGVyIHRyZWUgdHJhdmVyc2FsCisKKyAgICBkZWYgc3RhcnRfdHJlZShzZWxmLCB0cmVlLCBmaWxlbmFtZSk6CisgICAgICAgIHN1cGVyKEZpeE5leHQsIHNlbGYpLnN0YXJ0X3RyZWUodHJlZSwgZmlsZW5hbWUpCisKKyAgICAgICAgbiA9IGZpbmRfYmluZGluZyh1J25leHQnLCB0cmVlKQorICAgICAgICBpZiBuOgorICAgICAgICAgICAgc2VsZi53YXJuaW5nKG4sIGJpbmRfd2FybmluZykKKyAgICAgICAgICAgIHNlbGYuc2hhZG93ZWRfbmV4dCA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2hhZG93ZWRfbmV4dCA9IEZhbHNlCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBhc3NlcnQgcmVzdWx0cworCisgICAgICAgIGJhc2UgPSByZXN1bHRzLmdldCgiYmFzZSIpCisgICAgICAgIGF0dHIgPSByZXN1bHRzLmdldCgiYXR0ciIpCisgICAgICAgIG5hbWUgPSByZXN1bHRzLmdldCgibmFtZSIpCisKKyAgICAgICAgaWYgYmFzZToKKyAgICAgICAgICAgIGlmIHNlbGYuc2hhZG93ZWRfbmV4dDoKKyAgICAgICAgICAgICAgICBhdHRyLnJlcGxhY2UoTmFtZSh1Il9fbmV4dF9fIiwgcHJlZml4PWF0dHIucHJlZml4KSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYmFzZSA9IFtuLmNsb25lKCkgZm9yIG4gaW4gYmFzZV0KKyAgICAgICAgICAgICAgICBiYXNlWzBdLnByZWZpeCA9IHUiIgorICAgICAgICAgICAgICAgIG5vZGUucmVwbGFjZShDYWxsKE5hbWUodSJuZXh0IiwgcHJlZml4PW5vZGUucHJlZml4KSwgYmFzZSkpCisgICAgICAgIGVsaWYgbmFtZToKKyAgICAgICAgICAgIG4gPSBOYW1lKHUiX19uZXh0X18iLCBwcmVmaXg9bmFtZS5wcmVmaXgpCisgICAgICAgICAgICBuYW1lLnJlcGxhY2UobikKKyAgICAgICAgZWxpZiBhdHRyOgorICAgICAgICAgICAgIyBXZSBkb24ndCBkbyB0aGlzIHRyYW5zZm9ybWF0aW9uIGlmIHdlJ3JlIGFzc2lnbmluZyB0byAieC5uZXh0Ii4KKyAgICAgICAgICAgICMgVW5mb3J0dW5hdGVseSwgaXQgZG9lc24ndCBzZWVtIHBvc3NpYmxlIHRvIGRvIHRoaXMgaW4gUEFUVEVSTiwKKyAgICAgICAgICAgICMgIHNvIGl0J3MgYmVpbmcgZG9uZSBoZXJlLgorICAgICAgICAgICAgaWYgaXNfYXNzaWduX3RhcmdldChub2RlKToKKyAgICAgICAgICAgICAgICBoZWFkID0gcmVzdWx0c1siaGVhZCJdCisgICAgICAgICAgICAgICAgaWYgIiIuam9pbihbc3RyKG4pIGZvciBuIGluIGhlYWRdKS5zdHJpcCgpID09IHUnX19idWlsdGluX18nOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm5pbmcobm9kZSwgYmluZF93YXJuaW5nKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgYXR0ci5yZXBsYWNlKE5hbWUodSJfX25leHRfXyIpKQorICAgICAgICBlbGlmICJnbG9iYWwiIGluIHJlc3VsdHM6CisgICAgICAgICAgICBzZWxmLndhcm5pbmcobm9kZSwgYmluZF93YXJuaW5nKQorICAgICAgICAgICAgc2VsZi5zaGFkb3dlZF9uZXh0ID0gVHJ1ZQorCisKKyMjIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBoZWxwIHRlc3QgaWYgbm9kZSBpcyBwYXJ0IG9mIGFuIGFzc2lnbm1lbnQKKyMjIyAgdGFyZ2V0LgorCitkZWYgaXNfYXNzaWduX3RhcmdldChub2RlKToKKyAgICBhc3NpZ24gPSBmaW5kX2Fzc2lnbihub2RlKQorICAgIGlmIGFzc2lnbiBpcyBOb25lOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGZvciBjaGlsZCBpbiBhc3NpZ24uY2hpbGRyZW46CisgICAgICAgIGlmIGNoaWxkLnR5cGUgPT0gdG9rZW4uRVFVQUw6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxpZiBpc19zdWJ0cmVlKGNoaWxkLCBub2RlKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBmaW5kX2Fzc2lnbihub2RlKToKKyAgICBpZiBub2RlLnR5cGUgPT0gc3ltcy5leHByX3N0bXQ6CisgICAgICAgIHJldHVybiBub2RlCisgICAgaWYgbm9kZS50eXBlID09IHN5bXMuc2ltcGxlX3N0bXQgb3Igbm9kZS5wYXJlbnQgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gZmluZF9hc3NpZ24obm9kZS5wYXJlbnQpCisKK2RlZiBpc19zdWJ0cmVlKHJvb3QsIG5vZGUpOgorICAgIGlmIHJvb3QgPT0gbm9kZToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gYW55KGlzX3N1YnRyZWUoYywgbm9kZSkgZm9yIGMgaW4gcm9vdC5jaGlsZHJlbikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmV4dC5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25leHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NDg5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25leHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmV4dC5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25leHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTMxNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25leHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbm9uemVyby5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbm9uemVyby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTgzNDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5CkBAIC0wLDAgKzEsMjEgQEAKKyIiIkZpeGVyIGZvciBfX25vbnplcm9fXyAtPiBfX2Jvb2xfXyBtZXRob2RzLiIiIgorIyBBdXRob3I6IENvbGxpbiBXaW50ZXIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgc3ltcworCitjbGFzcyBGaXhOb256ZXJvKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIiIiCisgICAgY2xhc3NkZWY8ICdjbGFzcycgYW55KyAnOicKKyAgICAgICAgICAgICAgc3VpdGU8IGFueSoKKyAgICAgICAgICAgICAgICAgICAgIGZ1bmNkZWY8ICdkZWYnIG5hbWU9J19fbm9uemVyb19fJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczwgJygnIE5BTUUgJyknID4gYW55KyA+CisgICAgICAgICAgICAgICAgICAgICBhbnkqID4gPgorICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgbmFtZSA9IHJlc3VsdHNbIm5hbWUiXQorICAgICAgICBuZXcgPSBOYW1lKHUiX19ib29sX18iLCBwcmVmaXg9bmFtZS5wcmVmaXgpCisgICAgICAgIG5hbWUucmVwbGFjZShuZXcpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25vbnplcm8ucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2E1NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25vbnplcm8ucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2E1NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X251bWxpdGVyYWxzLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9udW1saXRlcmFscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGMyM2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9udW1saXRlcmFscy5weQpAQCAtMCwwICsxLDI4IEBACisiIiJGaXhlciB0aGF0IHR1cm5zIDFMIGludG8gMSwgMDc1NSBpbnRvIDBvNzU1LgorIiIiCisjIENvcHlyaWdodCAyMDA3IEdlb3JnIEJyYW5kbC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOdW1iZXIKKworCitjbGFzcyBGaXhOdW1saXRlcmFscyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgICMgVGhpcyBpcyBzbyBzaW1wbGUgdGhhdCB3ZSBkb24ndCBuZWVkIHRoZSBwYXR0ZXJuIGNvbXBpbGVyLgorCisgICAgX2FjY2VwdF90eXBlID0gdG9rZW4uTlVNQkVSCisKKyAgICBkZWYgbWF0Y2goc2VsZiwgbm9kZSk6CisgICAgICAgICMgT3ZlcnJpZGUKKyAgICAgICAgcmV0dXJuIChub2RlLnZhbHVlLnN0YXJ0c3dpdGgodSIwIikgb3Igbm9kZS52YWx1ZVstMV0gaW4gdSJMbCIpCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICB2YWwgPSBub2RlLnZhbHVlCisgICAgICAgIGlmIHZhbFstMV0gaW4gdSdMbCc6CisgICAgICAgICAgICB2YWwgPSB2YWxbOi0xXQorICAgICAgICBlbGlmIHZhbC5zdGFydHN3aXRoKHUnMCcpIGFuZCB2YWwuaXNkaWdpdCgpIGFuZCBsZW4oc2V0KHZhbCkpID4gMToKKyAgICAgICAgICAgIHZhbCA9IHUiMG8iICsgdmFsWzE6XQorCisgICAgICAgIHJldHVybiBOdW1iZXIodmFsLCBwcmVmaXg9bm9kZS5wcmVmaXgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X251bWxpdGVyYWxzLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbnVtbGl0ZXJhbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjUwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X251bWxpdGVyYWxzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X251bWxpdGVyYWxzLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbnVtbGl0ZXJhbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjUwNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X251bWxpdGVyYWxzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9vcGVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmYyYzBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9vcGVyYXRvci5weQpAQCAtMCwwICsxLDk2IEBACisiIiJGaXhlciBmb3Igb3BlcmF0b3IgZnVuY3Rpb25zLgorCitvcGVyYXRvci5pc0NhbGxhYmxlKG9iaikgICAgICAgLT4gaGFzYXR0cihvYmosICdfX2NhbGxfXycpCitvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKG9iaikgLT4gb3BlcmF0b3IuY29udGFpbnMob2JqKQorb3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUob2JqKSAgIC0+IGlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5TZXF1ZW5jZSkKK29wZXJhdG9yLmlzTWFwcGluZ1R5cGUob2JqKSAgICAtPiBpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuTWFwcGluZykKK29wZXJhdG9yLmlzTnVtYmVyVHlwZShvYmopICAgICAtPiBpc2luc3RhbmNlKG9iaiwgbnVtYmVycy5OdW1iZXIpCitvcGVyYXRvci5yZXBlYXQob2JqLCBuKSAgICAgICAgLT4gb3BlcmF0b3IubXVsKG9iaiwgbikKK29wZXJhdG9yLmlyZXBlYXQob2JqLCBuKSAgICAgICAtPiBvcGVyYXRvci5pbXVsKG9iaiwgbikKKyIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IENhbGwsIE5hbWUsIFN0cmluZywgdG91Y2hfaW1wb3J0CisKKworZGVmIGludm9jYXRpb24ocyk6CisgICAgZGVmIGRlYyhmKToKKyAgICAgICAgZi5pbnZvY2F0aW9uID0gcworICAgICAgICByZXR1cm4gZgorICAgIHJldHVybiBkZWMKKworCitjbGFzcyBGaXhPcGVyYXRvcihmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgb3JkZXIgPSAicHJlIgorCisgICAgbWV0aG9kcyA9ICIiIgorICAgICAgICAgICAgICBtZXRob2Q9KCdpc0NhbGxhYmxlJ3wnc2VxdWVuY2VJbmNsdWRlcycKKyAgICAgICAgICAgICAgICAgICAgIHwnaXNTZXF1ZW5jZVR5cGUnfCdpc01hcHBpbmdUeXBlJ3wnaXNOdW1iZXJUeXBlJworICAgICAgICAgICAgICAgICAgICAgfCdyZXBlYXQnfCdpcmVwZWF0JykKKyAgICAgICAgICAgICAgIiIiCisgICAgb2JqID0gIicoJyBvYmo9YW55ICcpJyIKKyAgICBQQVRURVJOID0gIiIiCisgICAgICAgICAgICAgIHBvd2VyPCBtb2R1bGU9J29wZXJhdG9yJworICAgICAgICAgICAgICAgIHRyYWlsZXI8ICcuJyAlKG1ldGhvZHMpcyA+IHRyYWlsZXI8ICUob2JqKXMgPiA+CisgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgcG93ZXI8ICUobWV0aG9kcylzIHRyYWlsZXI8ICUob2JqKXMgPiA+CisgICAgICAgICAgICAgICIiIiAlIGRpY3QobWV0aG9kcz1tZXRob2RzLCBvYmo9b2JqKQorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgbWV0aG9kID0gc2VsZi5fY2hlY2tfbWV0aG9kKG5vZGUsIHJlc3VsdHMpCisgICAgICAgIGlmIG1ldGhvZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBtZXRob2Qobm9kZSwgcmVzdWx0cykKKworICAgIEBpbnZvY2F0aW9uKCJvcGVyYXRvci5jb250YWlucyglcykiKQorICAgIGRlZiBfc2VxdWVuY2VJbmNsdWRlcyhzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2hhbmRsZV9yZW5hbWUobm9kZSwgcmVzdWx0cywgdSJjb250YWlucyIpCisKKyAgICBAaW52b2NhdGlvbigiaGFzYXR0ciglcywgJ19fY2FsbF9fJykiKQorICAgIGRlZiBfaXNDYWxsYWJsZShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgb2JqID0gcmVzdWx0c1sib2JqIl0KKyAgICAgICAgYXJncyA9IFtvYmouY2xvbmUoKSwgU3RyaW5nKHUiLCAiKSwgU3RyaW5nKHUiJ19fY2FsbF9fJyIpXQorICAgICAgICByZXR1cm4gQ2FsbChOYW1lKHUiaGFzYXR0ciIpLCBhcmdzLCBwcmVmaXg9bm9kZS5wcmVmaXgpCisKKyAgICBAaW52b2NhdGlvbigib3BlcmF0b3IubXVsKCVzKSIpCisgICAgZGVmIF9yZXBlYXQoc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIHJldHVybiBzZWxmLl9oYW5kbGVfcmVuYW1lKG5vZGUsIHJlc3VsdHMsIHUibXVsIikKKworICAgIEBpbnZvY2F0aW9uKCJvcGVyYXRvci5pbXVsKCVzKSIpCisgICAgZGVmIF9pcmVwZWF0KHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICByZXR1cm4gc2VsZi5faGFuZGxlX3JlbmFtZShub2RlLCByZXN1bHRzLCB1ImltdWwiKQorCisgICAgQGludm9jYXRpb24oImlzaW5zdGFuY2UoJXMsIGNvbGxlY3Rpb25zLlNlcXVlbmNlKSIpCisgICAgZGVmIF9pc1NlcXVlbmNlVHlwZShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2hhbmRsZV90eXBlMmFiYyhub2RlLCByZXN1bHRzLCB1ImNvbGxlY3Rpb25zIiwgdSJTZXF1ZW5jZSIpCisKKyAgICBAaW52b2NhdGlvbigiaXNpbnN0YW5jZSglcywgY29sbGVjdGlvbnMuTWFwcGluZykiKQorICAgIGRlZiBfaXNNYXBwaW5nVHlwZShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2hhbmRsZV90eXBlMmFiYyhub2RlLCByZXN1bHRzLCB1ImNvbGxlY3Rpb25zIiwgdSJNYXBwaW5nIikKKworICAgIEBpbnZvY2F0aW9uKCJpc2luc3RhbmNlKCVzLCBudW1iZXJzLk51bWJlcikiKQorICAgIGRlZiBfaXNOdW1iZXJUeXBlKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICByZXR1cm4gc2VsZi5faGFuZGxlX3R5cGUyYWJjKG5vZGUsIHJlc3VsdHMsIHUibnVtYmVycyIsIHUiTnVtYmVyIikKKworICAgIGRlZiBfaGFuZGxlX3JlbmFtZShzZWxmLCBub2RlLCByZXN1bHRzLCBuYW1lKToKKyAgICAgICAgbWV0aG9kID0gcmVzdWx0c1sibWV0aG9kIl1bMF0KKyAgICAgICAgbWV0aG9kLnZhbHVlID0gbmFtZQorICAgICAgICBtZXRob2QuY2hhbmdlZCgpCisKKyAgICBkZWYgX2hhbmRsZV90eXBlMmFiYyhzZWxmLCBub2RlLCByZXN1bHRzLCBtb2R1bGUsIGFiYyk6CisgICAgICAgIHRvdWNoX2ltcG9ydChOb25lLCBtb2R1bGUsIG5vZGUpCisgICAgICAgIG9iaiA9IHJlc3VsdHNbIm9iaiJdCisgICAgICAgIGFyZ3MgPSBbb2JqLmNsb25lKCksIFN0cmluZyh1IiwgIiArIHUiLiIuam9pbihbbW9kdWxlLCBhYmNdKSldCisgICAgICAgIHJldHVybiBDYWxsKE5hbWUodSJpc2luc3RhbmNlIiksIGFyZ3MsIHByZWZpeD1ub2RlLnByZWZpeCkKKworICAgIGRlZiBfY2hlY2tfbWV0aG9kKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsICJfIiArIHJlc3VsdHNbIm1ldGhvZCJdWzBdLnZhbHVlLmVuY29kZSgiYXNjaWkiKSkKKyAgICAgICAgaWYgY2FsbGFibGUobWV0aG9kKToKKyAgICAgICAgICAgIGlmICJtb2R1bGUiIGluIHJlc3VsdHM6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdWIgPSAodW5pY29kZShyZXN1bHRzWyJvYmoiXSksKQorICAgICAgICAgICAgICAgIGludm9jYXRpb25fc3RyID0gdW5pY29kZShtZXRob2QuaW52b2NhdGlvbikgJSBzdWIKKyAgICAgICAgICAgICAgICBzZWxmLndhcm5pbmcobm9kZSwgdSJZb3Ugc2hvdWxkIHVzZSAnJXMnIGhlcmUuIiAlIGludm9jYXRpb25fc3RyKQorICAgICAgICByZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9vcGVyYXRvci5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjVlNjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9vcGVyYXRvci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9vcGVyYXRvci5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjVlNjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9vcGVyYXRvci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wYXJlbi5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcGFyZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1MGNkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcGFyZW4ucHkKQEAgLTAsMCArMSw0NCBAQAorIiIiRml4ZXIgdGhhdCBhZGRlcyBwYXJlbnRoZXNlcyB3aGVyZSB0aGV5IGFyZSByZXF1aXJlZAorCitUaGlzIGNvbnZlcnRzIGBgW3ggZm9yIHggaW4gMSwgMl1gYCB0byBgYFt4IGZvciB4IGluICgxLCAyKV1gYC4iIiIKKworIyBCeSBUYWVrIEpvbyBLaW0gYW5kIEJlbmphbWluIFBldGVyc29uCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IExQYXJlbiwgUlBhcmVuCisKKyMgWFhYIFRoaXMgZG9lc24ndCBzdXBwb3J0IG5lc3RlZCBmb3IgbG9vcHMgbGlrZSBbeCBmb3IgeCBpbiAxLCAyIGZvciB4IGluIDEsIDJdCitjbGFzcyBGaXhQYXJlbihmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisKKyAgICBQQVRURVJOID0gIiIiCisgICAgICAgIGF0b208ICgnWycgfCAnKCcpCisgICAgICAgICAgICAobGlzdG1ha2VyPCBhbnkKKyAgICAgICAgICAgICAgICBjb21wX2ZvcjwKKyAgICAgICAgICAgICAgICAgICAgJ2ZvcicgTkFNRSAnaW4nCisgICAgICAgICAgICAgICAgICAgIHRhcmdldD10ZXN0bGlzdF9zYWZlPCBhbnkgKCcsJyBhbnkpKyBbJywnXQorICAgICAgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgICAgICBbYW55XQorICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIHwKKyAgICAgICAgICAgIHRlc3RsaXN0X2dleHA8IGFueQorICAgICAgICAgICAgICAgIGNvbXBfZm9yPAorICAgICAgICAgICAgICAgICAgICAnZm9yJyBOQU1FICdpbicKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PXRlc3RsaXN0X3NhZmU8IGFueSAoJywnIGFueSkrIFsnLCddCisgICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgICAgIFthbnldCisgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgPikKKyAgICAgICAgKCddJyB8ICcpJykgPgorICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgdGFyZ2V0ID0gcmVzdWx0c1sidGFyZ2V0Il0KKworICAgICAgICBscGFyZW4gPSBMUGFyZW4oKQorICAgICAgICBscGFyZW4ucHJlZml4ID0gdGFyZ2V0LnByZWZpeAorICAgICAgICB0YXJnZXQucHJlZml4ID0gdSIiICMgTWFrZSBpdCBodWcgdGhlIHBhcmVudGhlc2VzCisgICAgICAgIHRhcmdldC5pbnNlcnRfY2hpbGQoMCwgbHBhcmVuKQorICAgICAgICB0YXJnZXQuYXBwZW5kX2NoaWxkKFJQYXJlbigpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wYXJlbi5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3BhcmVuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTk2ZDUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wYXJlbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wYXJlbi5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3BhcmVuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTk2ZDUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wYXJlbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3ODZiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHkKQEAgLTAsMCArMSw4NyBAQAorIyBDb3B5cmlnaHQgMjAwNiBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJGaXhlciBmb3IgcHJpbnQuCisKK0NoYW5nZToKKyAgICAncHJpbnQnICAgICAgICAgIGludG8gJ3ByaW50KCknCisgICAgJ3ByaW50IC4uLicgICAgICBpbnRvICdwcmludCguLi4pJworICAgICdwcmludCAuLi4gLCcgICAgaW50byAncHJpbnQoLi4uLCBlbmQ9IiAiKScKKyAgICAncHJpbnQgPj54LCAuLi4nIGludG8gJ3ByaW50KC4uLiwgZmlsZT14KScKKworTm8gY2hhbmdlcyBhcmUgYXBwbGllZCBpZiBwcmludF9mdW5jdGlvbiBpcyBpbXBvcnRlZCBmcm9tIF9fZnV0dXJlX18KKworIiIiCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgcGF0Y29tcAorZnJvbSAuLiBpbXBvcnQgcHl0cmVlCitmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgQ2FsbCwgQ29tbWEsIFN0cmluZywgaXNfdHVwbGUKKworCitwYXJlbmRfZXhwciA9IHBhdGNvbXAuY29tcGlsZV9wYXR0ZXJuKAorICAgICAgICAgICAgICAiIiJhdG9tPCAnKCcgW2F0b218U1RSSU5HfE5BTUVdICcpJyA+IiIiCisgICAgICAgICAgICAgICkKKworCitjbGFzcyBGaXhQcmludChmaXhlcl9iYXNlLkJhc2VGaXgpOgorCisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgICAgICAgc2ltcGxlX3N0bXQ8IGFueSogYmFyZT0ncHJpbnQnIGFueSogPiB8IHByaW50X3N0bXQKKyAgICAgICAgICAgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBhc3NlcnQgcmVzdWx0cworCisgICAgICAgIGJhcmVfcHJpbnQgPSByZXN1bHRzLmdldCgiYmFyZSIpCisKKyAgICAgICAgaWYgYmFyZV9wcmludDoKKyAgICAgICAgICAgICMgU3BlY2lhbC1jYXNlIHByaW50IGFsbCBieSBpdHNlbGYKKyAgICAgICAgICAgIGJhcmVfcHJpbnQucmVwbGFjZShDYWxsKE5hbWUodSJwcmludCIpLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9YmFyZV9wcmludC5wcmVmaXgpKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGFzc2VydCBub2RlLmNoaWxkcmVuWzBdID09IE5hbWUodSJwcmludCIpCisgICAgICAgIGFyZ3MgPSBub2RlLmNoaWxkcmVuWzE6XQorICAgICAgICBpZiBsZW4oYXJncykgPT0gMSBhbmQgcGFyZW5kX2V4cHIubWF0Y2goYXJnc1swXSk6CisgICAgICAgICAgICAjIFdlIGRvbid0IHdhbnQgdG8ga2VlcCBzdGlja2luZyBwYXJlbnMgYXJvdW5kIGFuCisgICAgICAgICAgICAjIGFscmVhZHktcGFyZW50aGVzaXNlZCBleHByZXNzaW9uLgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VwID0gZW5kID0gZmlsZSA9IE5vbmUKKyAgICAgICAgaWYgYXJncyBhbmQgYXJnc1stMV0gPT0gQ29tbWEoKToKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzotMV0KKyAgICAgICAgICAgIGVuZCA9ICIgIgorICAgICAgICBpZiBhcmdzIGFuZCBhcmdzWzBdID09IHB5dHJlZS5MZWFmKHRva2VuLlJJR0hUU0hJRlQsIHUiPj4iKToKKyAgICAgICAgICAgIGFzc2VydCBsZW4oYXJncykgPj0gMgorICAgICAgICAgICAgZmlsZSA9IGFyZ3NbMV0uY2xvbmUoKQorICAgICAgICAgICAgYXJncyA9IGFyZ3NbMzpdICMgU3RyaXAgYSBwb3NzaWJsZSBjb21tYSBhZnRlciB0aGUgZmlsZSBleHByZXNzaW9uCisgICAgICAgICMgTm93IHN5bnRoZXNpemUgYSBwcmludChhcmdzLCBzZXA9Li4uLCBlbmQ9Li4uLCBmaWxlPS4uLikgbm9kZS4KKyAgICAgICAgbF9hcmdzID0gW2FyZy5jbG9uZSgpIGZvciBhcmcgaW4gYXJnc10KKyAgICAgICAgaWYgbF9hcmdzOgorICAgICAgICAgICAgbF9hcmdzWzBdLnByZWZpeCA9IHUiIgorICAgICAgICBpZiBzZXAgaXMgbm90IE5vbmUgb3IgZW5kIGlzIG5vdCBOb25lIG9yIGZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfa3dhcmcobF9hcmdzLCB1InNlcCIsIFN0cmluZyhyZXByKHNlcCkpKQorICAgICAgICAgICAgaWYgZW5kIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX2t3YXJnKGxfYXJncywgdSJlbmQiLCBTdHJpbmcocmVwcihlbmQpKSkKKyAgICAgICAgICAgIGlmIGZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfa3dhcmcobF9hcmdzLCB1ImZpbGUiLCBmaWxlKQorICAgICAgICBuX3N0bXQgPSBDYWxsKE5hbWUodSJwcmludCIpLCBsX2FyZ3MpCisgICAgICAgIG5fc3RtdC5wcmVmaXggPSBub2RlLnByZWZpeAorICAgICAgICByZXR1cm4gbl9zdG10CisKKyAgICBkZWYgYWRkX2t3YXJnKHNlbGYsIGxfbm9kZXMsIHNfa3dkLCBuX2V4cHIpOgorICAgICAgICAjIFhYWCBBbGwgdGhpcyBwcmVmaXgtc2V0dGluZyBtYXkgbG9zZSBjb21tZW50cyAodGhvdWdoIHJhcmVseSkKKyAgICAgICAgbl9leHByLnByZWZpeCA9IHUiIgorICAgICAgICBuX2FyZ3VtZW50ID0gcHl0cmVlLk5vZGUoc2VsZi5zeW1zLmFyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5hbWUoc19rd2QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5dHJlZS5MZWFmKHRva2VuLkVRVUFMLCB1Ij0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2V4cHIpKQorICAgICAgICBpZiBsX25vZGVzOgorICAgICAgICAgICAgbF9ub2Rlcy5hcHBlbmQoQ29tbWEoKSkKKyAgICAgICAgICAgIG5fYXJndW1lbnQucHJlZml4ID0gdSIgIgorICAgICAgICBsX25vZGVzLmFwcGVuZChuX2FyZ3VtZW50KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTExZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTk2NjJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYWlzZS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmFpc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1OGJhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmFpc2UucHkKQEAgLTAsMCArMSw5MCBAQAorIiIiRml4ZXIgZm9yICdyYWlzZSBFLCBWLCBUJworCityYWlzZSAgICAgICAgIC0+IHJhaXNlCityYWlzZSBFICAgICAgIC0+IHJhaXNlIEUKK3JhaXNlIEUsIFYgICAgLT4gcmFpc2UgRShWKQorcmFpc2UgRSwgViwgVCAtPiByYWlzZSBFKFYpLndpdGhfdHJhY2ViYWNrKFQpCityYWlzZSBFLCBOb25lLCBUIC0+IHJhaXNlIEUud2l0aF90cmFjZWJhY2soVCkKKworcmFpc2UgKCgoRSwgRScpLCBFJycpLCBFJycnKSwgViAtPiByYWlzZSBFKFYpCityYWlzZSAiZm9vIiwgViwgVCAgICAgICAgICAgICAgIC0+IHdhcm5zIGFib3V0IHN0cmluZyBleGNlcHRpb25zCisKKworQ0FWRUFUUzoKKzEpICJyYWlzZSBFLCBWIiB3aWxsIGJlIGluY29ycmVjdGx5IHRyYW5zbGF0ZWQgaWYgViBpcyBhbiBleGNlcHRpb24KKyAgIGluc3RhbmNlLiBUaGUgY29ycmVjdCBQeXRob24gMyBpZGlvbSBpcworCisgICAgICAgIHJhaXNlIEUgZnJvbSBWCisKKyAgIGJ1dCBzaW5jZSB3ZSBjYW4ndCBkZXRlY3QgaW5zdGFuY2UtaG9vZCBieSBzeW50YXggYWxvbmUgYW5kIHNpbmNlCisgICBhbnkgY2xpZW50IGNvZGUgd291bGQgaGF2ZSB0byBiZSBjaGFuZ2VkIGFzIHdlbGwsIHdlIGRvbid0IGF1dG9tYXRlCisgICB0aGlzLgorIiIiCisjIEF1dGhvcjogQ29sbGluIFdpbnRlcgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IHB5dHJlZQorZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIEF0dHIsIEFyZ0xpc3QsIGlzX3R1cGxlCisKK2NsYXNzIEZpeFJhaXNlKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIFBBVFRFUk4gPSAiIiIKKyAgICByYWlzZV9zdG10PCAncmFpc2UnIGV4Yz1hbnkgWycsJyB2YWw9YW55IFsnLCcgdGI9YW55XV0gPgorICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgc3ltcyA9IHNlbGYuc3ltcworCisgICAgICAgIGV4YyA9IHJlc3VsdHNbImV4YyJdLmNsb25lKCkKKyAgICAgICAgaWYgZXhjLnR5cGUgPT0gdG9rZW4uU1RSSU5HOgorICAgICAgICAgICAgbXNnID0gIlB5dGhvbiAzIGRvZXMgbm90IHN1cHBvcnQgc3RyaW5nIGV4Y2VwdGlvbnMiCisgICAgICAgICAgICBzZWxmLmNhbm5vdF9jb252ZXJ0KG5vZGUsIG1zZykKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgUHl0aG9uIDIgc3VwcG9ydHMKKyAgICAgICAgIyAgcmFpc2UgKCgoKEUxLCBFMiksIEUzKSwgRTQpLCBFNSksIFYKKyAgICAgICAgIyBhcyBhIHN5bm9ueW0gZm9yCisgICAgICAgICMgIHJhaXNlIEUxLCBWCisgICAgICAgICMgU2luY2UgUHl0aG9uIDMgd2lsbCBub3Qgc3VwcG9ydCB0aGlzLCB3ZSByZWN1cnNlIGRvd24gYW55IHR1cGxlCisgICAgICAgICMgbGl0ZXJhbHMsIGFsd2F5cyB0YWtpbmcgdGhlIGZpcnN0IGVsZW1lbnQuCisgICAgICAgIGlmIGlzX3R1cGxlKGV4Yyk6CisgICAgICAgICAgICB3aGlsZSBpc190dXBsZShleGMpOgorICAgICAgICAgICAgICAgICMgZXhjLmNoaWxkcmVuWzE6LTFdIGlzIHRoZSB1bnBhcmVudGhlc2l6ZWQgdHVwbGUKKyAgICAgICAgICAgICAgICAjIGV4Yy5jaGlsZHJlblsxXS5jaGlsZHJlblswXSBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgdHVwbGUKKyAgICAgICAgICAgICAgICBleGMgPSBleGMuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0uY2xvbmUoKQorICAgICAgICAgICAgZXhjLnByZWZpeCA9IHUiICIKKworICAgICAgICBpZiAidmFsIiBub3QgaW4gcmVzdWx0czoKKyAgICAgICAgICAgICMgT25lLWFyZ3VtZW50IHJhaXNlCisgICAgICAgICAgICBuZXcgPSBweXRyZWUuTm9kZShzeW1zLnJhaXNlX3N0bXQsIFtOYW1lKHUicmFpc2UiKSwgZXhjXSkKKyAgICAgICAgICAgIG5ldy5wcmVmaXggPSBub2RlLnByZWZpeAorICAgICAgICAgICAgcmV0dXJuIG5ldworCisgICAgICAgIHZhbCA9IHJlc3VsdHNbInZhbCJdLmNsb25lKCkKKyAgICAgICAgaWYgaXNfdHVwbGUodmFsKToKKyAgICAgICAgICAgIGFyZ3MgPSBbYy5jbG9uZSgpIGZvciBjIGluIHZhbC5jaGlsZHJlblsxOi0xXV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbC5wcmVmaXggPSB1IiIKKyAgICAgICAgICAgIGFyZ3MgPSBbdmFsXQorCisgICAgICAgIGlmICJ0YiIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIHRiID0gcmVzdWx0c1sidGIiXS5jbG9uZSgpCisgICAgICAgICAgICB0Yi5wcmVmaXggPSB1IiIKKworICAgICAgICAgICAgZSA9IGV4YworICAgICAgICAgICAgIyBJZiB0aGVyZSdzIGEgdHJhY2ViYWNrIGFuZCBOb25lIGlzIHBhc3NlZCBhcyB0aGUgdmFsdWUsIHRoZW4gZG9uJ3QKKyAgICAgICAgICAgICMgYWRkIGEgY2FsbCwgc2luY2UgdGhlIHVzZXIgcHJvYmFibHkganVzdCB3YW50cyB0byBhZGQgYQorICAgICAgICAgICAgIyB0cmFjZWJhY2suIFNlZSBpc3N1ZSAjOTY2MS4KKyAgICAgICAgICAgIGlmIHZhbC50eXBlICE9IHRva2VuLk5BTUUgb3IgdmFsLnZhbHVlICE9IHUiTm9uZSI6CisgICAgICAgICAgICAgICAgZSA9IENhbGwoZXhjLCBhcmdzKQorICAgICAgICAgICAgd2l0aF90YiA9IEF0dHIoZSwgTmFtZSh1J3dpdGhfdHJhY2ViYWNrJykpICsgW0FyZ0xpc3QoW3RiXSldCisgICAgICAgICAgICBuZXcgPSBweXRyZWUuTm9kZShzeW1zLnNpbXBsZV9zdG10LCBbTmFtZSh1InJhaXNlIildICsgd2l0aF90YikKKyAgICAgICAgICAgIG5ldy5wcmVmaXggPSBub2RlLnByZWZpeAorICAgICAgICAgICAgcmV0dXJuIG5ldworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHB5dHJlZS5Ob2RlKHN5bXMucmFpc2Vfc3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTmFtZSh1InJhaXNlIiksIENhbGwoZXhjLCBhcmdzKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PW5vZGUucHJlZml4KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYWlzZS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JhaXNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2VlOTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYWlzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYWlzZS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JhaXNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2VlOTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYWlzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYXdfaW5wdXQucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3Jhd19pbnB1dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTczYjgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYXdfaW5wdXQucHkKQEAgLTAsMCArMSwxNyBAQAorIiIiRml4ZXIgdGhhdCBjaGFuZ2VzIHJhd19pbnB1dCguLi4pIGludG8gaW5wdXQoLi4uKS4iIiIKKyMgQXV0aG9yOiBBbmRyZSBSb2JlcmdlCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUKKworY2xhc3MgRml4UmF3SW5wdXQoZml4ZXJfYmFzZS5CYXNlRml4KToKKworICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgUEFUVEVSTiA9ICIiIgorICAgICAgICAgICAgICBwb3dlcjwgbmFtZT0ncmF3X2lucHV0JyB0cmFpbGVyPCAnKCcgW2FueV0gJyknID4gYW55KiA+CisgICAgICAgICAgICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgbmFtZSA9IHJlc3VsdHNbIm5hbWUiXQorICAgICAgICBuYW1lLnJlcGxhY2UoTmFtZSh1ImlucHV0IiwgcHJlZml4PW5hbWUucHJlZml4KSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmF3X2lucHV0LnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmF3X2lucHV0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGU5ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYXdfaW5wdXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmF3X2lucHV0LnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmF3X2lucHV0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGU5ZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYXdfaW5wdXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVkdWNlLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZWR1Y2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkNzg1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVkdWNlLnB5CkBAIC0wLDAgKzEsMzUgQEAKKyMgQ29weXJpZ2h0IDIwMDggQXJtaW4gUm9uYWNoZXIuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgZm9yIHJlZHVjZSgpLgorCitNYWtlcyBzdXJlIHJlZHVjZSgpIGlzIGltcG9ydGVkIGZyb20gdGhlIGZ1bmN0b29scyBtb2R1bGUgaWYgcmVkdWNlIGlzCit1c2VkIGluIHRoYXQgbW9kdWxlLgorIiIiCisKK2Zyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IHRvdWNoX2ltcG9ydAorCisKKworY2xhc3MgRml4UmVkdWNlKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIG9yZGVyID0gInByZSIKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICBwb3dlcjwgJ3JlZHVjZScKKyAgICAgICAgdHJhaWxlcjwgJygnCisgICAgICAgICAgICBhcmdsaXN0PCAoCisgICAgICAgICAgICAgICAgKG5vdChhcmd1bWVudDxhbnkgJz0nIGFueT4pIGFueSAnLCcKKyAgICAgICAgICAgICAgICAgbm90KGFyZ3VtZW50PGFueSAnPScgYW55PikgYW55KSB8CisgICAgICAgICAgICAgICAgKG5vdChhcmd1bWVudDxhbnkgJz0nIGFueT4pIGFueSAnLCcKKyAgICAgICAgICAgICAgICAgbm90KGFyZ3VtZW50PGFueSAnPScgYW55PikgYW55ICcsJworICAgICAgICAgICAgICAgICBub3QoYXJndW1lbnQ8YW55ICc9JyBhbnk+KSBhbnkpCisgICAgICAgICAgICApID4KKyAgICAgICAgJyknID4KKyAgICA+CisgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICB0b3VjaF9pbXBvcnQodSdmdW5jdG9vbHMnLCB1J3JlZHVjZScsIG5vZGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlZHVjZS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlZHVjZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxNjlhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVkdWNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlZHVjZS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlZHVjZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxNjlhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVkdWNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlbmFtZXMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlbmFtZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjY2U4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weQpAQCAtMCwwICsxLDcwIEBACisiIiJGaXggaW5jb21wYXRpYmxlIHJlbmFtZXMKKworRml4ZXM6CisgICogc3lzLm1heGludCAtPiBzeXMubWF4c2l6ZQorIiIiCisjIEF1dGhvcjogQ2hyaXN0aWFuIEhlaW1lcworIyBiYXNlZCBvbiBDb2xsaW4gV2ludGVyJ3MgZml4X2ltcG9ydAorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBhdHRyX2NoYWluCisKK01BUFBJTkcgPSB7InN5cyI6ICB7Im1heGludCIgOiAibWF4c2l6ZSJ9LAorICAgICAgICAgIH0KK0xPT0tVUCA9IHt9CisKK2RlZiBhbHRlcm5hdGVzKG1lbWJlcnMpOgorICAgIHJldHVybiAiKCIgKyAifCIuam9pbihtYXAocmVwciwgbWVtYmVycykpICsgIikiCisKKworZGVmIGJ1aWxkX3BhdHRlcm4oKToKKyAgICAjYmFyZSA9IHNldCgpCisgICAgZm9yIG1vZHVsZSwgcmVwbGFjZSBpbiBNQVBQSU5HLml0ZW1zKCk6CisgICAgICAgIGZvciBvbGRfYXR0ciwgbmV3X2F0dHIgaW4gcmVwbGFjZS5pdGVtcygpOgorICAgICAgICAgICAgTE9PS1VQWyhtb2R1bGUsIG9sZF9hdHRyKV0gPSBuZXdfYXR0cgorICAgICAgICAgICAgI2JhcmUuYWRkKG1vZHVsZSkKKyAgICAgICAgICAgICNiYXJlLmFkZChvbGRfYXR0cikKKyAgICAgICAgICAgICN5aWVsZCAiIiIKKyAgICAgICAgICAgICMgICAgICBpbXBvcnRfbmFtZTwgJ2ltcG9ydCcgKG1vZHVsZT0lcgorICAgICAgICAgICAgIyAgICAgICAgICB8IGRvdHRlZF9hc19uYW1lczwgYW55KiBtb2R1bGU9JXIgYW55KiA+KSA+CisgICAgICAgICAgICAjICAgICAgIiIiICUgKG1vZHVsZSwgbW9kdWxlKQorICAgICAgICAgICAgeWllbGQgIiIiCisgICAgICAgICAgICAgICAgICBpbXBvcnRfZnJvbTwgJ2Zyb20nIG1vZHVsZV9uYW1lPSVyICdpbXBvcnQnCisgICAgICAgICAgICAgICAgICAgICAgKCBhdHRyX25hbWU9JXIgfCBpbXBvcnRfYXNfbmFtZTwgYXR0cl9uYW1lPSVyICdhcycgYW55ID4pID4KKyAgICAgICAgICAgICAgICAgICIiIiAlIChtb2R1bGUsIG9sZF9hdHRyLCBvbGRfYXR0cikKKyAgICAgICAgICAgIHlpZWxkICIiIgorICAgICAgICAgICAgICAgICAgcG93ZXI8IG1vZHVsZV9uYW1lPSVyIHRyYWlsZXI8ICcuJyBhdHRyX25hbWU9JXIgPiBhbnkqID4KKyAgICAgICAgICAgICAgICAgICIiIiAlIChtb2R1bGUsIG9sZF9hdHRyKQorICAgICN5aWVsZCAiIiJiYXJlX25hbWU9JXMiIiIgJSBhbHRlcm5hdGVzKGJhcmUpCisKKworY2xhc3MgRml4UmVuYW1lcyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgUEFUVEVSTiA9ICJ8Ii5qb2luKGJ1aWxkX3BhdHRlcm4oKSkKKworICAgIG9yZGVyID0gInByZSIgIyBQcmUtb3JkZXIgdHJlZSB0cmF2ZXJzYWwKKworICAgICMgRG9uJ3QgbWF0Y2ggdGhlIG5vZGUgaWYgaXQncyB3aXRoaW4gYW5vdGhlciBtYXRjaAorICAgIGRlZiBtYXRjaChzZWxmLCBub2RlKToKKyAgICAgICAgbWF0Y2ggPSBzdXBlcihGaXhSZW5hbWVzLCBzZWxmKS5tYXRjaAorICAgICAgICByZXN1bHRzID0gbWF0Y2gobm9kZSkKKyAgICAgICAgaWYgcmVzdWx0czoKKyAgICAgICAgICAgIGlmIGFueShtYXRjaChvYmopIGZvciBvYmogaW4gYXR0cl9jaGFpbihub2RlLCAicGFyZW50IikpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjZGVmIHN0YXJ0X3RyZWUoc2VsZiwgdHJlZSwgZmlsZW5hbWUpOgorICAgICMgICAgc3VwZXIoRml4UmVuYW1lcywgc2VsZikuc3RhcnRfdHJlZSh0cmVlLCBmaWxlbmFtZSkKKyAgICAjICAgIHNlbGYucmVwbGFjZSA9IHt9CisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBtb2RfbmFtZSA9IHJlc3VsdHMuZ2V0KCJtb2R1bGVfbmFtZSIpCisgICAgICAgIGF0dHJfbmFtZSA9IHJlc3VsdHMuZ2V0KCJhdHRyX25hbWUiKQorICAgICAgICAjYmFyZV9uYW1lID0gcmVzdWx0cy5nZXQoImJhcmVfbmFtZSIpCisgICAgICAgICNpbXBvcnRfbW9kID0gcmVzdWx0cy5nZXQoIm1vZHVsZSIpCisKKyAgICAgICAgaWYgbW9kX25hbWUgYW5kIGF0dHJfbmFtZToKKyAgICAgICAgICAgIG5ld19hdHRyID0gdW5pY29kZShMT09LVVBbKG1vZF9uYW1lLnZhbHVlLCBhdHRyX25hbWUudmFsdWUpXSkKKyAgICAgICAgICAgIGF0dHJfbmFtZS5yZXBsYWNlKE5hbWUobmV3X2F0dHIsIHByZWZpeD1hdHRyX25hbWUucHJlZml4KSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlbmFtZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzJjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlbmFtZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlbmFtZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzJjYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlbmFtZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVwci5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVwci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQzNjU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZXByLnB5CkBAIC0wLDAgKzEsMjMgQEAKKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgdGhhdCB0cmFuc2Zvcm1zIGB4eXp6eWAgaW50byByZXByKHh5enp5KS4iIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgQ2FsbCwgTmFtZSwgcGFyZW50aGVzaXplCisKKworY2xhc3MgRml4UmVwcihmaXhlcl9iYXNlLkJhc2VGaXgpOgorCisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIiIiCisgICAgICAgICAgICAgIGF0b20gPCAnYCcgZXhwcj1hbnkgJ2AnID4KKyAgICAgICAgICAgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBleHByID0gcmVzdWx0c1siZXhwciJdLmNsb25lKCkKKworICAgICAgICBpZiBleHByLnR5cGUgPT0gc2VsZi5zeW1zLnRlc3RsaXN0MToKKyAgICAgICAgICAgIGV4cHIgPSBwYXJlbnRoZXNpemUoZXhwcikKKyAgICAgICAgcmV0dXJuIENhbGwoTmFtZSh1InJlcHIiKSwgW2V4cHJdLCBwcmVmaXg9bm9kZS5wcmVmaXgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlcHIucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZXByLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDZlNjVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZXByLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlcHIucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZXByLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDZlNjVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZXByLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3NldF9saXRlcmFsLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zZXRfbGl0ZXJhbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2QzOGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zZXRfbGl0ZXJhbC5weQpAQCAtMCwwICsxLDUzIEBACisiIiIKK09wdGlvbmFsIGZpeGVyIHRvIHRyYW5zZm9ybSBzZXQoKSBjYWxscyB0byBzZXQgbGl0ZXJhbHMuCisiIiIKKworIyBBdXRob3I6IEJlbmphbWluIFBldGVyc29uCisKK2Zyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfYmFzZSwgcHl0cmVlCitmcm9tIGxpYjJ0bzMuZml4ZXJfdXRpbCBpbXBvcnQgdG9rZW4sIHN5bXMKKworCisKK2NsYXNzIEZpeFNldExpdGVyYWwoZml4ZXJfYmFzZS5CYXNlRml4KToKKworICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgZXhwbGljaXQgPSBUcnVlCisKKyAgICBQQVRURVJOID0gIiIicG93ZXI8ICdzZXQnIHRyYWlsZXI8ICcoJworICAgICAgICAgICAgICAgICAgICAgKGF0b209YXRvbTwgJ1snIChpdGVtcz1saXN0bWFrZXI8IGFueSAoKCcsJyBhbnkpKiBbJywnXSkgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZT1hbnkpICddJyA+CisgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgICAgICAgICBhdG9tPCAnKCcgaXRlbXM9dGVzdGxpc3RfZ2V4cDwgYW55ICgoJywnIGFueSkqIFsnLCddKSA+ICcpJyA+CisgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAnKScgPiA+CisgICAgICAgICAgICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgc2luZ2xlID0gcmVzdWx0cy5nZXQoInNpbmdsZSIpCisgICAgICAgIGlmIHNpbmdsZToKKyAgICAgICAgICAgICMgTWFrZSBhIGZha2UgbGlzdG1ha2VyCisgICAgICAgICAgICBmYWtlID0gcHl0cmVlLk5vZGUoc3ltcy5saXN0bWFrZXIsIFtzaW5nbGUuY2xvbmUoKV0pCisgICAgICAgICAgICBzaW5nbGUucmVwbGFjZShmYWtlKQorICAgICAgICAgICAgaXRlbXMgPSBmYWtlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpdGVtcyA9IHJlc3VsdHNbIml0ZW1zIl0KKworICAgICAgICAjIEJ1aWxkIHRoZSBjb250ZW50cyBvZiB0aGUgbGl0ZXJhbAorICAgICAgICBsaXRlcmFsID0gW3B5dHJlZS5MZWFmKHRva2VuLkxCUkFDRSwgdSJ7IildCisgICAgICAgIGxpdGVyYWwuZXh0ZW5kKG4uY2xvbmUoKSBmb3IgbiBpbiBpdGVtcy5jaGlsZHJlbikKKyAgICAgICAgbGl0ZXJhbC5hcHBlbmQocHl0cmVlLkxlYWYodG9rZW4uUkJSQUNFLCB1In0iKSkKKyAgICAgICAgIyBTZXQgdGhlIHByZWZpeCBvZiB0aGUgcmlnaHQgYnJhY2UgdG8gdGhhdCBvZiB0aGUgJyknIG9yICddJworICAgICAgICBsaXRlcmFsWy0xXS5wcmVmaXggPSBpdGVtcy5uZXh0X3NpYmxpbmcucHJlZml4CisgICAgICAgIG1ha2VyID0gcHl0cmVlLk5vZGUoc3ltcy5kaWN0c2V0bWFrZXIsIGxpdGVyYWwpCisgICAgICAgIG1ha2VyLnByZWZpeCA9IG5vZGUucHJlZml4CisKKyAgICAgICAgIyBJZiB0aGUgb3JpZ2luYWwgd2FzIGEgb25lIHR1cGxlLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgZXh0cmEgY29tbWEuCisgICAgICAgIGlmIGxlbihtYWtlci5jaGlsZHJlbikgPT0gNDoKKyAgICAgICAgICAgIG4gPSBtYWtlci5jaGlsZHJlblsyXQorICAgICAgICAgICAgbi5yZW1vdmUoKQorICAgICAgICAgICAgbWFrZXIuY2hpbGRyZW5bLTFdLnByZWZpeCA9IG4ucHJlZml4CisKKyAgICAgICAgIyBGaW5hbGx5LCByZXBsYWNlIHRoZSBzZXQgY2FsbCB3aXRoIG91ciBzaGlueSBuZXcgbGl0ZXJhbC4KKyAgICAgICAgcmV0dXJuIG1ha2VyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3NldF9saXRlcmFsLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc2V0X2xpdGVyYWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OWIxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3NldF9saXRlcmFsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3NldF9saXRlcmFsLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc2V0X2xpdGVyYWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OWIxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3NldF9saXRlcmFsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3N0YW5kYXJkZXJyb3IucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3N0YW5kYXJkZXJyb3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhZDUxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc3RhbmRhcmRlcnJvci5weQpAQCAtMCwwICsxLDE4IEBACisjIENvcHlyaWdodCAyMDA3IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkZpeGVyIGZvciBTdGFuZGFyZEVycm9yIC0+IEV4Y2VwdGlvbi4iIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZQorCisKK2NsYXNzIEZpeFN0YW5kYXJkZXJyb3IoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgICAgICAgJ1N0YW5kYXJkRXJyb3InCisgICAgICAgICAgICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgcmV0dXJuIE5hbWUodSJFeGNlcHRpb24iLCBwcmVmaXg9bm9kZS5wcmVmaXgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3N0YW5kYXJkZXJyb3IucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zdGFuZGFyZGVycm9yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjcxZDExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zdGFuZGFyZGVycm9yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3N0YW5kYXJkZXJyb3IucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zdGFuZGFyZGVycm9yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjcxZDExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zdGFuZGFyZGVycm9yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3N5c19leGMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3N5c19leGMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVjY2EyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc3lzX2V4Yy5weQpAQCAtMCwwICsxLDMwIEBACisiIiJGaXhlciBmb3Igc3lzLmV4Y197dHlwZSwgdmFsdWUsIHRyYWNlYmFja30KKworc3lzLmV4Y190eXBlIC0+IHN5cy5leGNfaW5mbygpWzBdCitzeXMuZXhjX3ZhbHVlIC0+IHN5cy5leGNfaW5mbygpWzFdCitzeXMuZXhjX3RyYWNlYmFjayAtPiBzeXMuZXhjX2luZm8oKVsyXQorIiIiCisKKyMgQnkgSmVmZiBCYWxvZ2ggYW5kIEJlbmphbWluIFBldGVyc29uCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IEF0dHIsIENhbGwsIE5hbWUsIE51bWJlciwgU3Vic2NyaXB0LCBOb2RlLCBzeW1zCisKK2NsYXNzIEZpeFN5c0V4YyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgICMgVGhpcyBvcmRlciBtYXRjaGVzIHRoZSBvcmRlcmluZyBvZiBzeXMuZXhjX2luZm8oKS4KKyAgICBleGNfaW5mbyA9IFt1ImV4Y190eXBlIiwgdSJleGNfdmFsdWUiLCB1ImV4Y190cmFjZWJhY2siXQorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgUEFUVEVSTiA9ICIiIgorICAgICAgICAgICAgICBwb3dlcjwgJ3N5cycgdHJhaWxlcjwgZG90PScuJyBhdHRyaWJ1dGU9KCVzKSA+ID4KKyAgICAgICAgICAgICAgIiIiICUgJ3wnLmpvaW4oIiclcyciICUgZSBmb3IgZSBpbiBleGNfaW5mbykKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIHN5c19hdHRyID0gcmVzdWx0c1siYXR0cmlidXRlIl1bMF0KKyAgICAgICAgaW5kZXggPSBOdW1iZXIoc2VsZi5leGNfaW5mby5pbmRleChzeXNfYXR0ci52YWx1ZSkpCisKKyAgICAgICAgY2FsbCA9IENhbGwoTmFtZSh1ImV4Y19pbmZvIiksIHByZWZpeD1zeXNfYXR0ci5wcmVmaXgpCisgICAgICAgIGF0dHIgPSBBdHRyKE5hbWUodSJzeXMiKSwgY2FsbCkKKyAgICAgICAgYXR0clsxXS5jaGlsZHJlblswXS5wcmVmaXggPSByZXN1bHRzWyJkb3QiXS5wcmVmaXgKKyAgICAgICAgYXR0ci5hcHBlbmQoU3Vic2NyaXB0KGluZGV4KSkKKyAgICAgICAgcmV0dXJuIE5vZGUoc3ltcy5wb3dlciwgYXR0ciwgcHJlZml4PW5vZGUucHJlZml4KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zeXNfZXhjLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc3lzX2V4Yy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwYzcwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc3lzX2V4Yy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zeXNfZXhjLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc3lzX2V4Yy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwYzcwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc3lzX2V4Yy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90aHJvdy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdGhyb3cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2OGQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdGhyb3cucHkKQEAgLTAsMCArMSw1NiBAQAorIiIiRml4ZXIgZm9yIGdlbmVyYXRvci50aHJvdyhFLCBWLCBUKS4KKworZy50aHJvdyhFKSAgICAgICAtPiBnLnRocm93KEUpCitnLnRocm93KEUsIFYpICAgIC0+IGcudGhyb3coRShWKSkKK2cudGhyb3coRSwgViwgVCkgLT4gZy50aHJvdyhFKFYpLndpdGhfdHJhY2ViYWNrKFQpKQorCitnLnRocm93KCJmb28iWywgVlssIFRdXSkgd2lsbCB3YXJuIGFib3V0IHN0cmluZyBleGNlcHRpb25zLiIiIgorIyBBdXRob3I6IENvbGxpbiBXaW50ZXIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBweXRyZWUKK2Zyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBBcmdMaXN0LCBBdHRyLCBpc190dXBsZQorCitjbGFzcyBGaXhUaHJvdyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgUEFUVEVSTiA9ICIiIgorICAgIHBvd2VyPCBhbnkgdHJhaWxlcjwgJy4nICd0aHJvdycgPgorICAgICAgICAgICB0cmFpbGVyPCAnKCcgYXJncz1hcmdsaXN0PCBleGM9YW55ICcsJyB2YWw9YW55IFsnLCcgdGI9YW55XSA+ICcpJyA+CisgICAgPgorICAgIHwKKyAgICBwb3dlcjwgYW55IHRyYWlsZXI8ICcuJyAndGhyb3cnID4gdHJhaWxlcjwgJygnIGV4Yz1hbnkgJyknID4gPgorICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgc3ltcyA9IHNlbGYuc3ltcworCisgICAgICAgIGV4YyA9IHJlc3VsdHNbImV4YyJdLmNsb25lKCkKKyAgICAgICAgaWYgZXhjLnR5cGUgaXMgdG9rZW4uU1RSSU5HOgorICAgICAgICAgICAgc2VsZi5jYW5ub3RfY29udmVydChub2RlLCAiUHl0aG9uIDMgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgZXhjZXB0aW9ucyIpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIExlYXZlICJnLnRocm93KEUpIiBhbG9uZQorICAgICAgICB2YWwgPSByZXN1bHRzLmdldCh1InZhbCIpCisgICAgICAgIGlmIHZhbCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdmFsID0gdmFsLmNsb25lKCkKKyAgICAgICAgaWYgaXNfdHVwbGUodmFsKToKKyAgICAgICAgICAgIGFyZ3MgPSBbYy5jbG9uZSgpIGZvciBjIGluIHZhbC5jaGlsZHJlblsxOi0xXV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbC5wcmVmaXggPSB1IiIKKyAgICAgICAgICAgIGFyZ3MgPSBbdmFsXQorCisgICAgICAgIHRocm93X2FyZ3MgPSByZXN1bHRzWyJhcmdzIl0KKworICAgICAgICBpZiAidGIiIGluIHJlc3VsdHM6CisgICAgICAgICAgICB0YiA9IHJlc3VsdHNbInRiIl0uY2xvbmUoKQorICAgICAgICAgICAgdGIucHJlZml4ID0gdSIiCisKKyAgICAgICAgICAgIGUgPSBDYWxsKGV4YywgYXJncykKKyAgICAgICAgICAgIHdpdGhfdGIgPSBBdHRyKGUsIE5hbWUodSd3aXRoX3RyYWNlYmFjaycpKSArIFtBcmdMaXN0KFt0Yl0pXQorICAgICAgICAgICAgdGhyb3dfYXJncy5yZXBsYWNlKHB5dHJlZS5Ob2RlKHN5bXMucG93ZXIsIHdpdGhfdGIpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGhyb3dfYXJncy5yZXBsYWNlKENhbGwoZXhjLCBhcmdzKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdGhyb3cucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90aHJvdy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzMWMwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdGhyb3cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdGhyb3cucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90aHJvdy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzMWMwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdGhyb3cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdHVwbGVfcGFyYW1zLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90dXBsZV9wYXJhbXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2MTcxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdHVwbGVfcGFyYW1zLnB5CkBAIC0wLDAgKzEsMTc1IEBACisiIiJGaXhlciBmb3IgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd2l0aCB0dXBsZSBwYXJhbWV0ZXJzLgorCitkZWYgZnVuYygoKGEsIGIpLCBjKSwgZCk6CisgICAgLi4uCisKKyAgICAtPgorCitkZWYgZnVuYyh4LCBkKToKKyAgICAoKGEsIGIpLCBjKSA9IHgKKyAgICAuLi4KKworSXQgd2lsbCBhbHNvIHN1cHBvcnQgbGFtYmRhczoKKworICAgIGxhbWJkYSAoeCwgeSk6IHggKyB5IC0+IGxhbWJkYSB0OiB0WzBdICsgdFsxXQorCisgICAgIyBUaGUgcGFyZW5zIGFyZSBhIHN5bnRheCBlcnJvciBpbiBQeXRob24gMworICAgIGxhbWJkYSAoeCk6IHggKyB5IC0+IGxhbWJkYSB4OiB4ICsgeQorIiIiCisjIEF1dGhvcjogQ29sbGluIFdpbnRlcgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IHB5dHJlZQorZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IEFzc2lnbiwgTmFtZSwgTmV3bGluZSwgTnVtYmVyLCBTdWJzY3JpcHQsIHN5bXMKKworZGVmIGlzX2RvY3N0cmluZyhzdG10KToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShzdG10LCBweXRyZWUuTm9kZSkgYW5kIFwKKyAgICAgICAgICAgc3RtdC5jaGlsZHJlblswXS50eXBlID09IHRva2VuLlNUUklORworCitjbGFzcyBGaXhUdXBsZVBhcmFtcyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIHJ1bl9vcmRlciA9IDQgI3VzZSBhIGxvd2VyIG9yZGVyIHNpbmNlIGxhbWJkYSBpcyBwYXJ0IG9mIG90aGVyCisgICAgICAgICAgICAgICAgICAjcGF0dGVybnMKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorCisgICAgUEFUVEVSTiA9ICIiIgorICAgICAgICAgICAgICBmdW5jZGVmPCAnZGVmJyBhbnkgcGFyYW1ldGVyczwgJygnIGFyZ3M9YW55ICcpJyA+CisgICAgICAgICAgICAgICAgICAgICAgIFsnLT4nIGFueV0gJzonIHN1aXRlPWFueSsgPgorICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgIGxhbWJkYT0KKyAgICAgICAgICAgICAgbGFtYmRlZjwgJ2xhbWJkYScgYXJncz12ZnBkZWY8ICcoJyBpbm5lcj1hbnkgJyknID4KKyAgICAgICAgICAgICAgICAgICAgICAgJzonIGJvZHk9YW55CisgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBpZiAibGFtYmRhIiBpbiByZXN1bHRzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhbnNmb3JtX2xhbWJkYShub2RlLCByZXN1bHRzKQorCisgICAgICAgIG5ld19saW5lcyA9IFtdCisgICAgICAgIHN1aXRlID0gcmVzdWx0c1sic3VpdGUiXQorICAgICAgICBhcmdzID0gcmVzdWx0c1siYXJncyJdCisgICAgICAgICMgVGhpcyBjcmFwIGlzIHNvICJkZWYgZm9vKC4uLik6IHggPSA1OyB5ID0gNyIgaXMgaGFuZGxlZCBjb3JyZWN0bHkuCisgICAgICAgICMgVE9ETyhjd2ludGVyKTogc3VpdGUtY2xlYW51cAorICAgICAgICBpZiBzdWl0ZVswXS5jaGlsZHJlblsxXS50eXBlID09IHRva2VuLklOREVOVDoKKyAgICAgICAgICAgIHN0YXJ0ID0gMgorICAgICAgICAgICAgaW5kZW50ID0gc3VpdGVbMF0uY2hpbGRyZW5bMV0udmFsdWUKKyAgICAgICAgICAgIGVuZCA9IE5ld2xpbmUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhcnQgPSAwCisgICAgICAgICAgICBpbmRlbnQgPSB1IjsgIgorICAgICAgICAgICAgZW5kID0gcHl0cmVlLkxlYWYodG9rZW4uSU5ERU5ULCB1IiIpCisKKyAgICAgICAgIyBXZSBuZWVkIGFjY2VzcyB0byBzZWxmIGZvciBuZXdfbmFtZSgpLCBhbmQgbWFraW5nIHRoaXMgYSBtZXRob2QKKyAgICAgICAgIyAgZG9lc24ndCBmZWVsIHJpZ2h0LiBDbG9zaW5nIG92ZXIgc2VsZiBhbmQgbmV3X2xpbmVzIG1ha2VzIHRoZQorICAgICAgICAjICBjb2RlIGJlbG93IGNsZWFuZXIuCisgICAgICAgIGRlZiBoYW5kbGVfdHVwbGUodHVwbGVfYXJnLCBhZGRfcHJlZml4PUZhbHNlKToKKyAgICAgICAgICAgIG4gPSBOYW1lKHNlbGYubmV3X25hbWUoKSkKKyAgICAgICAgICAgIGFyZyA9IHR1cGxlX2FyZy5jbG9uZSgpCisgICAgICAgICAgICBhcmcucHJlZml4ID0gdSIiCisgICAgICAgICAgICBzdG10ID0gQXNzaWduKGFyZywgbi5jbG9uZSgpKQorICAgICAgICAgICAgaWYgYWRkX3ByZWZpeDoKKyAgICAgICAgICAgICAgICBuLnByZWZpeCA9IHUiICIKKyAgICAgICAgICAgIHR1cGxlX2FyZy5yZXBsYWNlKG4pCisgICAgICAgICAgICBuZXdfbGluZXMuYXBwZW5kKHB5dHJlZS5Ob2RlKHN5bXMuc2ltcGxlX3N0bXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdG10LCBlbmQuY2xvbmUoKV0pKQorCisgICAgICAgIGlmIGFyZ3MudHlwZSA9PSBzeW1zLnRmcGRlZjoKKyAgICAgICAgICAgIGhhbmRsZV90dXBsZShhcmdzKQorICAgICAgICBlbGlmIGFyZ3MudHlwZSA9PSBzeW1zLnR5cGVkYXJnc2xpc3Q6CisgICAgICAgICAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzLmNoaWxkcmVuKToKKyAgICAgICAgICAgICAgICBpZiBhcmcudHlwZSA9PSBzeW1zLnRmcGRlZjoKKyAgICAgICAgICAgICAgICAgICAgIyBXaXRob3V0IGFkZF9wcmVmaXgsIHRoZSBlbWl0dGVkIGNvZGUgaXMgY29ycmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIyAganVzdCB1Z2x5LgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVfdHVwbGUoYXJnLCBhZGRfcHJlZml4PShpID4gMCkpCisKKyAgICAgICAgaWYgbm90IG5ld19saW5lczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgVGhpcyBpc24ndCBzdHJpY3RseSBuZWNlc3NhcnksIGJ1dCBpdCBwbGF5cyBuaWNlbHkgd2l0aCBvdGhlciBmaXhlcnMuCisgICAgICAgICMgVE9ETyhjd2ludGVyKSBnZXQgcmlkIG9mIHRoaXMgd2hlbiBjaGlsZHJlbiBiZWNvbWVzIGEgc21hcnQgbGlzdAorICAgICAgICBmb3IgbGluZSBpbiBuZXdfbGluZXM6CisgICAgICAgICAgICBsaW5lLnBhcmVudCA9IHN1aXRlWzBdCisKKyAgICAgICAgIyBUT0RPKGN3aW50ZXIpIHN1aXRlLWNsZWFudXAKKyAgICAgICAgYWZ0ZXIgPSBzdGFydAorICAgICAgICBpZiBzdGFydCA9PSAwOgorICAgICAgICAgICAgbmV3X2xpbmVzWzBdLnByZWZpeCA9IHUiICIKKyAgICAgICAgZWxpZiBpc19kb2NzdHJpbmcoc3VpdGVbMF0uY2hpbGRyZW5bc3RhcnRdKToKKyAgICAgICAgICAgIG5ld19saW5lc1swXS5wcmVmaXggPSBpbmRlbnQKKyAgICAgICAgICAgIGFmdGVyID0gc3RhcnQgKyAxCisKKyAgICAgICAgZm9yIGxpbmUgaW4gbmV3X2xpbmVzOgorICAgICAgICAgICAgbGluZS5wYXJlbnQgPSBzdWl0ZVswXQorICAgICAgICBzdWl0ZVswXS5jaGlsZHJlblthZnRlcjphZnRlcl0gPSBuZXdfbGluZXMKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYWZ0ZXIrMSwgYWZ0ZXIrbGVuKG5ld19saW5lcykrMSk6CisgICAgICAgICAgICBzdWl0ZVswXS5jaGlsZHJlbltpXS5wcmVmaXggPSBpbmRlbnQKKyAgICAgICAgc3VpdGVbMF0uY2hhbmdlZCgpCisKKyAgICBkZWYgdHJhbnNmb3JtX2xhbWJkYShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgYXJncyA9IHJlc3VsdHNbImFyZ3MiXQorICAgICAgICBib2R5ID0gcmVzdWx0c1siYm9keSJdCisgICAgICAgIGlubmVyID0gc2ltcGxpZnlfYXJncyhyZXN1bHRzWyJpbm5lciJdKQorCisgICAgICAgICMgUmVwbGFjZSBsYW1iZGEgKCgoKHgpKSkpOiB4ICB3aXRoIGxhbWJkYSB4OiB4CisgICAgICAgIGlmIGlubmVyLnR5cGUgPT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgIGlubmVyID0gaW5uZXIuY2xvbmUoKQorICAgICAgICAgICAgaW5uZXIucHJlZml4ID0gdSIgIgorICAgICAgICAgICAgYXJncy5yZXBsYWNlKGlubmVyKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcGFyYW1zID0gZmluZF9wYXJhbXMoYXJncykKKyAgICAgICAgdG9faW5kZXggPSBtYXBfdG9faW5kZXgocGFyYW1zKQorICAgICAgICB0dXBfbmFtZSA9IHNlbGYubmV3X25hbWUodHVwbGVfbmFtZShwYXJhbXMpKQorCisgICAgICAgIG5ld19wYXJhbSA9IE5hbWUodHVwX25hbWUsIHByZWZpeD11IiAiKQorICAgICAgICBhcmdzLnJlcGxhY2UobmV3X3BhcmFtLmNsb25lKCkpCisgICAgICAgIGZvciBuIGluIGJvZHkucG9zdF9vcmRlcigpOgorICAgICAgICAgICAgaWYgbi50eXBlID09IHRva2VuLk5BTUUgYW5kIG4udmFsdWUgaW4gdG9faW5kZXg6CisgICAgICAgICAgICAgICAgc3Vic2NyaXB0cyA9IFtjLmNsb25lKCkgZm9yIGMgaW4gdG9faW5kZXhbbi52YWx1ZV1dCisgICAgICAgICAgICAgICAgbmV3ID0gcHl0cmVlLk5vZGUoc3ltcy5wb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmV3X3BhcmFtLmNsb25lKCldICsgc3Vic2NyaXB0cykKKyAgICAgICAgICAgICAgICBuZXcucHJlZml4ID0gbi5wcmVmaXgKKyAgICAgICAgICAgICAgICBuLnJlcGxhY2UobmV3KQorCisKKyMjIyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0cmFuc2Zvcm1fbGFtYmRhKCkKKworZGVmIHNpbXBsaWZ5X2FyZ3Mobm9kZSk6CisgICAgaWYgbm9kZS50eXBlIGluIChzeW1zLnZmcGxpc3QsIHRva2VuLk5BTUUpOgorICAgICAgICByZXR1cm4gbm9kZQorICAgIGVsaWYgbm9kZS50eXBlID09IHN5bXMudmZwZGVmOgorICAgICAgICAjIFRoZXNlIGxvb2sgbGlrZSB2ZnBkZWY8ICcoJyB4ICcpJyA+IHdoZXJlIHggaXMgTkFNRQorICAgICAgICAjIG9yIGFub3RoZXIgdmZwZGVmIGluc3RhbmNlIChsZWFkaW5nIHRvIHJlY3Vyc2lvbikuCisgICAgICAgIHdoaWxlIG5vZGUudHlwZSA9PSBzeW1zLnZmcGRlZjoKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkcmVuWzFdCisgICAgICAgIHJldHVybiBub2RlCisgICAgcmFpc2UgUnVudGltZUVycm9yKCJSZWNlaXZlZCB1bmV4cGVjdGVkIG5vZGUgJXMiICUgbm9kZSkKKworZGVmIGZpbmRfcGFyYW1zKG5vZGUpOgorICAgIGlmIG5vZGUudHlwZSA9PSBzeW1zLnZmcGRlZjoKKyAgICAgICAgcmV0dXJuIGZpbmRfcGFyYW1zKG5vZGUuY2hpbGRyZW5bMV0pCisgICAgZWxpZiBub2RlLnR5cGUgPT0gdG9rZW4uTkFNRToKKyAgICAgICAgcmV0dXJuIG5vZGUudmFsdWUKKyAgICByZXR1cm4gW2ZpbmRfcGFyYW1zKGMpIGZvciBjIGluIG5vZGUuY2hpbGRyZW4gaWYgYy50eXBlICE9IHRva2VuLkNPTU1BXQorCitkZWYgbWFwX3RvX2luZGV4KHBhcmFtX2xpc3QsIHByZWZpeD1bXSwgZD1Ob25lKToKKyAgICBpZiBkIGlzIE5vbmU6CisgICAgICAgIGQgPSB7fQorICAgIGZvciBpLCBvYmogaW4gZW51bWVyYXRlKHBhcmFtX2xpc3QpOgorICAgICAgICB0cmFpbGVyID0gW1N1YnNjcmlwdChOdW1iZXIodW5pY29kZShpKSkpXQorICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgbGlzdCk6CisgICAgICAgICAgICBtYXBfdG9faW5kZXgob2JqLCB0cmFpbGVyLCBkPWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkW29ial0gPSBwcmVmaXggKyB0cmFpbGVyCisgICAgcmV0dXJuIGQKKworZGVmIHR1cGxlX25hbWUocGFyYW1fbGlzdCk6CisgICAgbCA9IFtdCisgICAgZm9yIG9iaiBpbiBwYXJhbV9saXN0OgorICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgbGlzdCk6CisgICAgICAgICAgICBsLmFwcGVuZCh0dXBsZV9uYW1lKG9iaikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsLmFwcGVuZChvYmopCisgICAgcmV0dXJuIHUiXyIuam9pbihsKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90dXBsZV9wYXJhbXMucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90dXBsZV9wYXJhbXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYjk0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3R1cGxlX3BhcmFtcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90dXBsZV9wYXJhbXMucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90dXBsZV9wYXJhbXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYjk0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3R1cGxlX3BhcmFtcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5ZDQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHkKQEAgLTAsMCArMSw2MiBAQAorIyBDb3B5cmlnaHQgMjAwNyBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJGaXhlciBmb3IgcmVtb3ZpbmcgdXNlcyBvZiB0aGUgdHlwZXMgbW9kdWxlLgorCitUaGVzZSB3b3JrIGZvciBvbmx5IHRoZSBrbm93biBuYW1lcyBpbiB0aGUgdHlwZXMgbW9kdWxlLiAgVGhlIGZvcm1zIGFib3ZlCitjYW4gaW5jbHVkZSB0eXBlcy4gb3Igbm90LiAgaWUsIEl0IGlzIGFzc3VtZWQgdGhlIG1vZHVsZSBpcyBpbXBvcnRlZCBlaXRoZXIgYXM6CisKKyAgICBpbXBvcnQgdHlwZXMKKyAgICBmcm9tIHR5cGVzIGltcG9ydCAuLi4gIyBlaXRoZXIgKiBvciBzcGVjaWZpYyB0eXBlcworCitUaGUgaW1wb3J0IHN0YXRlbWVudHMgYXJlIG5vdCBtb2RpZmllZC4KKworVGhlcmUgc2hvdWxkIGJlIGFub3RoZXIgZml4ZXIgdGhhdCBoYW5kbGVzIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorCisgICB0eXBlKFtdKSAtPiBsaXN0CisgICB0eXBlKCgpKSAtPiB0dXBsZQorICAgdHlwZSgnJykgLT4gc3RyCisKKyIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lCisKK19UWVBFX01BUFBJTkcgPSB7CisgICAgICAgICdCb29sZWFuVHlwZScgOiAnYm9vbCcsCisgICAgICAgICdCdWZmZXJUeXBlJyA6ICdtZW1vcnl2aWV3JywKKyAgICAgICAgJ0NsYXNzVHlwZScgOiAndHlwZScsCisgICAgICAgICdDb21wbGV4VHlwZScgOiAnY29tcGxleCcsCisgICAgICAgICdEaWN0VHlwZSc6ICdkaWN0JywKKyAgICAgICAgJ0RpY3Rpb25hcnlUeXBlJyA6ICdkaWN0JywKKyAgICAgICAgJ0VsbGlwc2lzVHlwZScgOiAndHlwZShFbGxpcHNpcyknLAorICAgICAgICAjJ0ZpbGVUeXBlJyA6ICdpby5JT0Jhc2UnLAorICAgICAgICAnRmxvYXRUeXBlJzogJ2Zsb2F0JywKKyAgICAgICAgJ0ludFR5cGUnOiAnaW50JywKKyAgICAgICAgJ0xpc3RUeXBlJzogJ2xpc3QnLAorICAgICAgICAnTG9uZ1R5cGUnOiAnaW50JywKKyAgICAgICAgJ09iamVjdFR5cGUnIDogJ29iamVjdCcsCisgICAgICAgICdOb25lVHlwZSc6ICd0eXBlKE5vbmUpJywKKyAgICAgICAgJ05vdEltcGxlbWVudGVkVHlwZScgOiAndHlwZShOb3RJbXBsZW1lbnRlZCknLAorICAgICAgICAnU2xpY2VUeXBlJyA6ICdzbGljZScsCisgICAgICAgICdTdHJpbmdUeXBlJzogJ2J5dGVzJywgIyBYWFggPworICAgICAgICAnU3RyaW5nVHlwZXMnIDogJ3N0cicsICMgWFhYID8KKyAgICAgICAgJ1R1cGxlVHlwZSc6ICd0dXBsZScsCisgICAgICAgICdUeXBlVHlwZScgOiAndHlwZScsCisgICAgICAgICdVbmljb2RlVHlwZSc6ICdzdHInLAorICAgICAgICAnWFJhbmdlVHlwZScgOiAncmFuZ2UnLAorICAgIH0KKworX3BhdHMgPSBbInBvd2VyPCAndHlwZXMnIHRyYWlsZXI8ICcuJyBuYW1lPSclcycgPiA+IiAlIHQgZm9yIHQgaW4gX1RZUEVfTUFQUElOR10KKworY2xhc3MgRml4VHlwZXMoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIFBBVFRFUk4gPSAnfCcuam9pbihfcGF0cykKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIG5ld192YWx1ZSA9IHVuaWNvZGUoX1RZUEVfTUFQUElORy5nZXQocmVzdWx0c1sibmFtZSJdLnZhbHVlKSkKKyAgICAgICAgaWYgbmV3X3ZhbHVlOgorICAgICAgICAgICAgcmV0dXJuIE5hbWUobmV3X3ZhbHVlLCBwcmVmaXg9bm9kZS5wcmVmaXgpCisgICAgICAgIHJldHVybiBOb25lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYWY0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYWY0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VuaWNvZGUucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VuaWNvZGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4OTU3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdW5pY29kZS5weQpAQCAtMCwwICsxLDI1IEBACisiIiJGaXhlciB0aGF0IGNoYW5nZXMgdW5pY29kZSB0byBzdHIsIHVuaWNociB0byBjaHIsIGFuZCB1Ii4uLiIgaW50byAiLi4uIi4KKworIiIiCisKK2ltcG9ydCByZQorZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorCitfbWFwcGluZyA9IHt1InVuaWNociIgOiB1ImNociIsIHUidW5pY29kZSIgOiB1InN0ciJ9CitfbGl0ZXJhbF9yZSA9IHJlLmNvbXBpbGUodXIiW3VVXVtyUl0/W1wnXCJdIikKKworY2xhc3MgRml4VW5pY29kZShmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgUEFUVEVSTiA9ICJTVFJJTkcgfCAndW5pY29kZScgfCAndW5pY2hyJyIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGlmIG5vZGUudHlwZSA9PSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgbmV3ID0gbm9kZS5jbG9uZSgpCisgICAgICAgICAgICBuZXcudmFsdWUgPSBfbWFwcGluZ1tub2RlLnZhbHVlXQorICAgICAgICAgICAgcmV0dXJuIG5ldworICAgICAgICBlbGlmIG5vZGUudHlwZSA9PSB0b2tlbi5TVFJJTkc6CisgICAgICAgICAgICBpZiBfbGl0ZXJhbF9yZS5tYXRjaChub2RlLnZhbHVlKToKKyAgICAgICAgICAgICAgICBuZXcgPSBub2RlLmNsb25lKCkKKyAgICAgICAgICAgICAgICBuZXcudmFsdWUgPSBuZXcudmFsdWVbMTpdCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91bmljb2RlLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdW5pY29kZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI4NGNhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdW5pY29kZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91bmljb2RlLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdW5pY29kZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI4NGNhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdW5pY29kZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGUxYjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHkKQEAgLTAsMCArMSwxOTcgQEAKKyIiIkZpeCBjaGFuZ2VzIGltcG9ydHMgb2YgdXJsbGliIHdoaWNoIGFyZSBub3cgaW5jb21wYXRpYmxlLgorICAgVGhpcyBpcyByYXRoZXIgc2ltaWxhciB0byBmaXhfaW1wb3J0cywgYnV0IGJlY2F1c2Ugb2YgdGhlIG1vcmUKKyAgIGNvbXBsZXggbmF0dXJlIG9mIHRoZSBmaXhpbmcgZm9yIHVybGxpYiwgaXQgaGFzIGl0cyBvd24gZml4ZXIuCisiIiIKKyMgQXV0aG9yOiBOaWNrIEVkZHMKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIGxpYjJ0bzMuZml4ZXMuZml4X2ltcG9ydHMgaW1wb3J0IGFsdGVybmF0ZXMsIEZpeEltcG9ydHMKK2Zyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IChOYW1lLCBDb21tYSwgRnJvbUltcG9ydCwgTmV3bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZF9pbmRlbnRhdGlvbiwgTm9kZSwgc3ltcykKKworTUFQUElORyA9IHsidXJsbGliIjogIFsKKyAgICAgICAgICAgICAgICAoInVybGxpYi5yZXF1ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgWyJVUkxvcGVuZXIiLCAiRmFuY3lVUkxvcGVuZXIiLCAidXJscmV0cmlldmUiLAorICAgICAgICAgICAgICAgICAgICAgIl91cmxvcGVuZXIiLCAidXJsb3BlbiIsICJ1cmxjbGVhbnVwIiwKKyAgICAgICAgICAgICAgICAgICAgICJwYXRobmFtZTJ1cmwiLCAidXJsMnBhdGhuYW1lIl0pLAorICAgICAgICAgICAgICAgICgidXJsbGliLnBhcnNlIiwKKyAgICAgICAgICAgICAgICAgICAgWyJxdW90ZSIsICJxdW90ZV9wbHVzIiwgInVucXVvdGUiLCAidW5xdW90ZV9wbHVzIiwKKyAgICAgICAgICAgICAgICAgICAgICJ1cmxlbmNvZGUiLCAic3BsaXRhdHRyIiwgInNwbGl0aG9zdCIsICJzcGxpdG5wb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICJzcGxpdHBhc3N3ZCIsICJzcGxpdHBvcnQiLCAic3BsaXRxdWVyeSIsICJzcGxpdHRhZyIsCisgICAgICAgICAgICAgICAgICAgICAic3BsaXR0eXBlIiwgInNwbGl0dXNlciIsICJzcGxpdHZhbHVlIiwgXSksCisgICAgICAgICAgICAgICAgKCJ1cmxsaWIuZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICBbIkNvbnRlbnRUb29TaG9ydEVycm9yIl0pXSwKKyAgICAgICAgICAgInVybGxpYjIiIDogWworICAgICAgICAgICAgICAgICgidXJsbGliLnJlcXVlc3QiLAorICAgICAgICAgICAgICAgICAgICBbInVybG9wZW4iLCAiaW5zdGFsbF9vcGVuZXIiLCAiYnVpbGRfb3BlbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICJSZXF1ZXN0IiwgIk9wZW5lckRpcmVjdG9yIiwgIkJhc2VIYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICJIVFRQRGVmYXVsdEVycm9ySGFuZGxlciIsICJIVFRQUmVkaXJlY3RIYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICJIVFRQQ29va2llUHJvY2Vzc29yIiwgIlByb3h5SGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAiSFRUUFBhc3N3b3JkTWdyIiwKKyAgICAgICAgICAgICAgICAgICAgICJIVFRQUGFzc3dvcmRNZ3JXaXRoRGVmYXVsdFJlYWxtIiwKKyAgICAgICAgICAgICAgICAgICAgICJBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgIkhUVFBCYXNpY0F1dGhIYW5kbGVyIiwgIlByb3h5QmFzaWNBdXRoSGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAiQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAiSFRUUERpZ2VzdEF1dGhIYW5kbGVyIiwgIlByb3h5RGlnZXN0QXV0aEhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgIkhUVFBIYW5kbGVyIiwgIkhUVFBTSGFuZGxlciIsICJGaWxlSGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAiRlRQSGFuZGxlciIsICJDYWNoZUZUUEhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgIlVua25vd25IYW5kbGVyIl0pLAorICAgICAgICAgICAgICAgICgidXJsbGliLmVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgWyJVUkxFcnJvciIsICJIVFRQRXJyb3IiXSksCisgICAgICAgICAgIF0KK30KKworIyBEdXBsaWNhdGUgdGhlIHVybCBwYXJzaW5nIGZ1bmN0aW9ucyBmb3IgdXJsbGliMi4KK01BUFBJTkdbInVybGxpYjIiXS5hcHBlbmQoTUFQUElOR1sidXJsbGliIl1bMV0pCisKKworZGVmIGJ1aWxkX3BhdHRlcm4oKToKKyAgICBiYXJlID0gc2V0KCkKKyAgICBmb3Igb2xkX21vZHVsZSwgY2hhbmdlcyBpbiBNQVBQSU5HLml0ZW1zKCk6CisgICAgICAgIGZvciBjaGFuZ2UgaW4gY2hhbmdlczoKKyAgICAgICAgICAgIG5ld19tb2R1bGUsIG1lbWJlcnMgPSBjaGFuZ2UKKyAgICAgICAgICAgIG1lbWJlcnMgPSBhbHRlcm5hdGVzKG1lbWJlcnMpCisgICAgICAgICAgICB5aWVsZCAiIiJpbXBvcnRfbmFtZTwgJ2ltcG9ydCcgKG1vZHVsZT0lcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZG90dGVkX2FzX25hbWVzPCBhbnkqIG1vZHVsZT0lciBhbnkqID4pID4KKyAgICAgICAgICAgICAgICAgICIiIiAlIChvbGRfbW9kdWxlLCBvbGRfbW9kdWxlKQorICAgICAgICAgICAgeWllbGQgIiIiaW1wb3J0X2Zyb208ICdmcm9tJyBtb2RfbWVtYmVyPSVyICdpbXBvcnQnCisgICAgICAgICAgICAgICAgICAgICAgICggbWVtYmVyPSVzIHwgaW1wb3J0X2FzX25hbWU8IG1lbWJlcj0lcyAnYXMnIGFueSA+IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRfYXNfbmFtZXM8IG1lbWJlcnM9YW55KiAgPikgPgorICAgICAgICAgICAgICAgICAgIiIiICUgKG9sZF9tb2R1bGUsIG1lbWJlcnMsIG1lbWJlcnMpCisgICAgICAgICAgICB5aWVsZCAiIiJpbXBvcnRfZnJvbTwgJ2Zyb20nIG1vZHVsZV9zdGFyPSVyICdpbXBvcnQnIHN0YXI9JyonID4KKyAgICAgICAgICAgICAgICAgICIiIiAlIG9sZF9tb2R1bGUKKyAgICAgICAgICAgIHlpZWxkICIiImltcG9ydF9uYW1lPCAnaW1wb3J0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdHRlZF9hc19uYW1lPCBtb2R1bGVfYXM9JXIgJ2FzJyBhbnkgPiA+CisgICAgICAgICAgICAgICAgICAiIiIgJSBvbGRfbW9kdWxlCisgICAgICAgICAgICAjIGJhcmVfd2l0aF9hdHRyIGhhcyBhIHNwZWNpYWwgc2lnbmlmaWNhbmNlIGZvciBGaXhJbXBvcnRzLm1hdGNoKCkuCisgICAgICAgICAgICB5aWVsZCAiIiJwb3dlcjwgYmFyZV93aXRoX2F0dHI9JXIgdHJhaWxlcjwgJy4nIG1lbWJlcj0lcyA+IGFueSogPgorICAgICAgICAgICAgICAgICAgIiIiICUgKG9sZF9tb2R1bGUsIG1lbWJlcnMpCisKKworY2xhc3MgRml4VXJsbGliKEZpeEltcG9ydHMpOgorCisgICAgZGVmIGJ1aWxkX3BhdHRlcm4oc2VsZik6CisgICAgICAgIHJldHVybiAifCIuam9pbihidWlsZF9wYXR0ZXJuKCkpCisKKyAgICBkZWYgdHJhbnNmb3JtX2ltcG9ydChzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgIiIiVHJhbnNmb3JtIGZvciB0aGUgYmFzaWMgaW1wb3J0IGNhc2UuIFJlcGxhY2VzIHRoZSBvbGQKKyAgICAgICAgICAgaW1wb3J0IG5hbWUgd2l0aCBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGl0cworICAgICAgICAgICByZXBsYWNlbWVudHMuCisgICAgICAgICIiIgorICAgICAgICBpbXBvcnRfbW9kID0gcmVzdWx0cy5nZXQoIm1vZHVsZSIpCisgICAgICAgIHByZWYgPSBpbXBvcnRfbW9kLnByZWZpeAorCisgICAgICAgIG5hbWVzID0gW10KKworICAgICAgICAjIGNyZWF0ZSBhIE5vZGUgbGlzdCBvZiB0aGUgcmVwbGFjZW1lbnQgbW9kdWxlcworICAgICAgICBmb3IgbmFtZSBpbiBNQVBQSU5HW2ltcG9ydF9tb2QudmFsdWVdWzotMV06CisgICAgICAgICAgICBuYW1lcy5leHRlbmQoW05hbWUobmFtZVswXSwgcHJlZml4PXByZWYpLCBDb21tYSgpXSkKKyAgICAgICAgbmFtZXMuYXBwZW5kKE5hbWUoTUFQUElOR1tpbXBvcnRfbW9kLnZhbHVlXVstMV1bMF0sIHByZWZpeD1wcmVmKSkKKyAgICAgICAgaW1wb3J0X21vZC5yZXBsYWNlKG5hbWVzKQorCisgICAgZGVmIHRyYW5zZm9ybV9tZW1iZXIoc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgICIiIlRyYW5zZm9ybSBmb3IgaW1wb3J0cyBvZiBzcGVjaWZpYyBtb2R1bGUgZWxlbWVudHMuIFJlcGxhY2VzCisgICAgICAgICAgIHRoZSBtb2R1bGUgdG8gYmUgaW1wb3J0ZWQgZnJvbSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBuZXcKKyAgICAgICAgICAgbW9kdWxlLgorICAgICAgICAiIiIKKyAgICAgICAgbW9kX21lbWJlciA9IHJlc3VsdHMuZ2V0KCJtb2RfbWVtYmVyIikKKyAgICAgICAgcHJlZiA9IG1vZF9tZW1iZXIucHJlZml4CisgICAgICAgIG1lbWJlciA9IHJlc3VsdHMuZ2V0KCJtZW1iZXIiKQorCisgICAgICAgICMgU2ltcGxlIGNhc2Ugd2l0aCBvbmx5IGEgc2luZ2xlIG1lbWJlciBiZWluZyBpbXBvcnRlZAorICAgICAgICBpZiBtZW1iZXI6CisgICAgICAgICAgICAjIHRoaXMgbWF5IGJlIGEgbGlzdCBvZiBsZW5ndGggb25lLCBvciBqdXN0IGEgbm9kZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShtZW1iZXIsIGxpc3QpOgorICAgICAgICAgICAgICAgIG1lbWJlciA9IG1lbWJlclswXQorICAgICAgICAgICAgbmV3X25hbWUgPSBOb25lCisgICAgICAgICAgICBmb3IgY2hhbmdlIGluIE1BUFBJTkdbbW9kX21lbWJlci52YWx1ZV06CisgICAgICAgICAgICAgICAgaWYgbWVtYmVyLnZhbHVlIGluIGNoYW5nZVsxXToKKyAgICAgICAgICAgICAgICAgICAgbmV3X25hbWUgPSBjaGFuZ2VbMF0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG5ld19uYW1lOgorICAgICAgICAgICAgICAgIG1vZF9tZW1iZXIucmVwbGFjZShOYW1lKG5ld19uYW1lLCBwcmVmaXg9cHJlZikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuY2Fubm90X2NvbnZlcnQobm9kZSwgIlRoaXMgaXMgYW4gaW52YWxpZCBtb2R1bGUgZWxlbWVudCIpCisKKyAgICAgICAgIyBNdWx0aXBsZSBtZW1iZXJzIGJlaW5nIGltcG9ydGVkCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGEgZGljdGlvbmFyeSBmb3IgcmVwbGFjZW1lbnRzLCBvcmRlciBtYXR0ZXJzCisgICAgICAgICAgICBtb2R1bGVzID0gW10KKyAgICAgICAgICAgIG1vZF9kaWN0ID0ge30KKyAgICAgICAgICAgIG1lbWJlcnMgPSByZXN1bHRzWyJtZW1iZXJzIl0KKyAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gbWVtYmVyczoKKyAgICAgICAgICAgICAgICAjIHdlIG9ubHkgY2FyZSBhYm91dCB0aGUgYWN0dWFsIG1lbWJlcnMKKyAgICAgICAgICAgICAgICBpZiBtZW1iZXIudHlwZSA9PSBzeW1zLmltcG9ydF9hc19uYW1lOgorICAgICAgICAgICAgICAgICAgICBhc19uYW1lID0gbWVtYmVyLmNoaWxkcmVuWzJdLnZhbHVlCisgICAgICAgICAgICAgICAgICAgIG1lbWJlcl9uYW1lID0gbWVtYmVyLmNoaWxkcmVuWzBdLnZhbHVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbWVtYmVyX25hbWUgPSBtZW1iZXIudmFsdWUKKyAgICAgICAgICAgICAgICAgICAgYXNfbmFtZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBtZW1iZXJfbmFtZSAhPSB1IiwiOgorICAgICAgICAgICAgICAgICAgICBmb3IgY2hhbmdlIGluIE1BUFBJTkdbbW9kX21lbWJlci52YWx1ZV06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBtZW1iZXJfbmFtZSBpbiBjaGFuZ2VbMV06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hhbmdlWzBdIG5vdCBpbiBtb2RfZGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcy5hcHBlbmQoY2hhbmdlWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZF9kaWN0LnNldGRlZmF1bHQoY2hhbmdlWzBdLCBbXSkuYXBwZW5kKG1lbWJlcikKKworICAgICAgICAgICAgbmV3X25vZGVzID0gW10KKyAgICAgICAgICAgIGluZGVudGF0aW9uID0gZmluZF9pbmRlbnRhdGlvbihub2RlKQorICAgICAgICAgICAgZmlyc3QgPSBUcnVlCisgICAgICAgICAgICBkZWYgaGFuZGxlX25hbWUobmFtZSwgcHJlZml4KToKKyAgICAgICAgICAgICAgICBpZiBuYW1lLnR5cGUgPT0gc3ltcy5pbXBvcnRfYXNfbmFtZToKKyAgICAgICAgICAgICAgICAgICAga2lkcyA9IFtOYW1lKG5hbWUuY2hpbGRyZW5bMF0udmFsdWUsIHByZWZpeD1wcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY2hpbGRyZW5bMV0uY2xvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNoaWxkcmVuWzJdLmNsb25lKCldCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBbTm9kZShzeW1zLmltcG9ydF9hc19uYW1lLCBraWRzKV0KKyAgICAgICAgICAgICAgICByZXR1cm4gW05hbWUobmFtZS52YWx1ZSwgcHJlZml4PXByZWZpeCldCisgICAgICAgICAgICBmb3IgbW9kdWxlIGluIG1vZHVsZXM6CisgICAgICAgICAgICAgICAgZWx0cyA9IG1vZF9kaWN0W21vZHVsZV0KKyAgICAgICAgICAgICAgICBuYW1lcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGVsdCBpbiBlbHRzWzotMV06CisgICAgICAgICAgICAgICAgICAgIG5hbWVzLmV4dGVuZChoYW5kbGVfbmFtZShlbHQsIHByZWYpKQorICAgICAgICAgICAgICAgICAgICBuYW1lcy5hcHBlbmQoQ29tbWEoKSkKKyAgICAgICAgICAgICAgICBuYW1lcy5leHRlbmQoaGFuZGxlX25hbWUoZWx0c1stMV0sIHByZWYpKQorICAgICAgICAgICAgICAgIG5ldyA9IEZyb21JbXBvcnQobW9kdWxlLCBuYW1lcykKKyAgICAgICAgICAgICAgICBpZiBub3QgZmlyc3Qgb3Igbm9kZS5wYXJlbnQucHJlZml4LmVuZHN3aXRoKGluZGVudGF0aW9uKToKKyAgICAgICAgICAgICAgICAgICAgbmV3LnByZWZpeCA9IGluZGVudGF0aW9uCisgICAgICAgICAgICAgICAgbmV3X25vZGVzLmFwcGVuZChuZXcpCisgICAgICAgICAgICAgICAgZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgaWYgbmV3X25vZGVzOgorICAgICAgICAgICAgICAgIG5vZGVzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgbmV3X25vZGUgaW4gbmV3X25vZGVzWzotMV06CisgICAgICAgICAgICAgICAgICAgIG5vZGVzLmV4dGVuZChbbmV3X25vZGUsIE5ld2xpbmUoKV0pCisgICAgICAgICAgICAgICAgbm9kZXMuYXBwZW5kKG5ld19ub2Rlc1stMV0pCisgICAgICAgICAgICAgICAgbm9kZS5yZXBsYWNlKG5vZGVzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbm5vdF9jb252ZXJ0KG5vZGUsICJBbGwgbW9kdWxlIGVsZW1lbnRzIGFyZSBpbnZhbGlkIikKKworICAgIGRlZiB0cmFuc2Zvcm1fZG90KHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICAiIiJUcmFuc2Zvcm0gZm9yIGNhbGxzIHRvIG1vZHVsZSBtZW1iZXJzIGluIGNvZGUuIiIiCisgICAgICAgIG1vZHVsZV9kb3QgPSByZXN1bHRzLmdldCgiYmFyZV93aXRoX2F0dHIiKQorICAgICAgICBtZW1iZXIgPSByZXN1bHRzLmdldCgibWVtYmVyIikKKyAgICAgICAgbmV3X25hbWUgPSBOb25lCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVtYmVyLCBsaXN0KToKKyAgICAgICAgICAgIG1lbWJlciA9IG1lbWJlclswXQorICAgICAgICBmb3IgY2hhbmdlIGluIE1BUFBJTkdbbW9kdWxlX2RvdC52YWx1ZV06CisgICAgICAgICAgICBpZiBtZW1iZXIudmFsdWUgaW4gY2hhbmdlWzFdOgorICAgICAgICAgICAgICAgIG5ld19uYW1lID0gY2hhbmdlWzBdCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbmV3X25hbWU6CisgICAgICAgICAgICBtb2R1bGVfZG90LnJlcGxhY2UoTmFtZShuZXdfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1tb2R1bGVfZG90LnByZWZpeCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNhbm5vdF9jb252ZXJ0KG5vZGUsICJUaGlzIGlzIGFuIGludmFsaWQgbW9kdWxlIGVsZW1lbnQiKQorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgaWYgcmVzdWx0cy5nZXQoIm1vZHVsZSIpOgorICAgICAgICAgICAgc2VsZi50cmFuc2Zvcm1faW1wb3J0KG5vZGUsIHJlc3VsdHMpCisgICAgICAgIGVsaWYgcmVzdWx0cy5nZXQoIm1vZF9tZW1iZXIiKToKKyAgICAgICAgICAgIHNlbGYudHJhbnNmb3JtX21lbWJlcihub2RlLCByZXN1bHRzKQorICAgICAgICBlbGlmIHJlc3VsdHMuZ2V0KCJiYXJlX3dpdGhfYXR0ciIpOgorICAgICAgICAgICAgc2VsZi50cmFuc2Zvcm1fZG90KG5vZGUsIHJlc3VsdHMpCisgICAgICAgICMgUmVuYW1pbmcgYW5kIHN0YXIgaW1wb3J0cyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgdGhlc2UgbW9kdWxlcy4KKyAgICAgICAgZWxpZiByZXN1bHRzLmdldCgibW9kdWxlX3N0YXIiKToKKyAgICAgICAgICAgIHNlbGYuY2Fubm90X2NvbnZlcnQobm9kZSwgIkNhbm5vdCBoYW5kbGUgc3RhciBpbXBvcnRzLiIpCisgICAgICAgIGVsaWYgcmVzdWx0cy5nZXQoIm1vZHVsZV9hcyIpOgorICAgICAgICAgICAgc2VsZi5jYW5ub3RfY29udmVydChub2RlLCAiVGhpcyBtb2R1bGUgaXMgbm93IG11bHRpcGxlIG1vZHVsZXMiKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMzYxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91cmxsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMzYxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF93c19jb21tYS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfd3NfY29tbWEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmZjYyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfd3NfY29tbWEucHkKQEAgLTAsMCArMSwzOSBAQAorIiIiRml4ZXIgdGhhdCBjaGFuZ2VzICdhICxiJyBpbnRvICdhLCBiJy4KKworVGhpcyBhbHNvIGNoYW5nZXMgJ3thIDpifScgaW50byAne2E6IGJ9JywgYnV0IGRvZXMgbm90IHRvdWNoIG90aGVyCit1c2VzIG9mIGNvbG9ucy4gIEl0IGRvZXMgbm90IHRvdWNoIG90aGVyIHVzZXMgb2Ygd2hpdGVzcGFjZS4KKworIiIiCisKK2Zyb20gLi4gaW1wb3J0IHB5dHJlZQorZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorCitjbGFzcyBGaXhXc0NvbW1hKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisKKyAgICBleHBsaWNpdCA9IFRydWUgIyBUaGUgdXNlciBtdXN0IGFzayBmb3IgdGhpcyBmaXhlcnMKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICBhbnk8KG5vdCgnLCcpIGFueSkrICcsJyAoKG5vdCgnLCcpIGFueSkrICcsJykqIFtub3QoJywnKSBhbnldPgorICAgICIiIgorCisgICAgQ09NTUEgPSBweXRyZWUuTGVhZih0b2tlbi5DT01NQSwgdSIsIikKKyAgICBDT0xPTiA9IHB5dHJlZS5MZWFmKHRva2VuLkNPTE9OLCB1IjoiKQorICAgIFNFUFMgPSAoQ09NTUEsIENPTE9OKQorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgbmV3ID0gbm9kZS5jbG9uZSgpCisgICAgICAgIGNvbW1hID0gRmFsc2UKKyAgICAgICAgZm9yIGNoaWxkIGluIG5ldy5jaGlsZHJlbjoKKyAgICAgICAgICAgIGlmIGNoaWxkIGluIHNlbGYuU0VQUzoKKyAgICAgICAgICAgICAgICBwcmVmaXggPSBjaGlsZC5wcmVmaXgKKyAgICAgICAgICAgICAgICBpZiBwcmVmaXguaXNzcGFjZSgpIGFuZCB1IlxuIiBub3QgaW4gcHJlZml4OgorICAgICAgICAgICAgICAgICAgICBjaGlsZC5wcmVmaXggPSB1IiIKKyAgICAgICAgICAgICAgICBjb21tYSA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgY29tbWE6CisgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGNoaWxkLnByZWZpeAorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcHJlZml4OgorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucHJlZml4ID0gdSIgIgorICAgICAgICAgICAgICAgIGNvbW1hID0gRmFsc2UKKyAgICAgICAgcmV0dXJuIG5ldwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF93c19jb21tYS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3dzX2NvbW1hLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDExNzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF93c19jb21tYS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF93c19jb21tYS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3dzX2NvbW1hLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDExNzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF93c19jb21tYS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF94cmFuZ2UucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyYW5nZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTQzNjcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF94cmFuZ2UucHkKQEAgLTAsMCArMSw3MyBAQAorIyBDb3B5cmlnaHQgMjAwNyBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJGaXhlciB0aGF0IGNoYW5nZXMgeHJhbmdlKC4uLikgaW50byByYW5nZSguLi4pLiIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBjb25zdW1pbmdfY2FsbHMKK2Zyb20gLi4gaW1wb3J0IHBhdGNvbXAKKworCitjbGFzcyBGaXhYcmFuZ2UoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgICAgICAgcG93ZXI8CisgICAgICAgICAgICAgICAgIChuYW1lPSdyYW5nZSd8bmFtZT0neHJhbmdlJykgdHJhaWxlcjwgJygnIGFyZ3M9YW55ICcpJyA+CisgICAgICAgICAgICAgIHJlc3Q9YW55KiA+CisgICAgICAgICAgICAgICIiIgorCisgICAgZGVmIHN0YXJ0X3RyZWUoc2VsZiwgdHJlZSwgZmlsZW5hbWUpOgorICAgICAgICBzdXBlcihGaXhYcmFuZ2UsIHNlbGYpLnN0YXJ0X3RyZWUodHJlZSwgZmlsZW5hbWUpCisgICAgICAgIHNlbGYudHJhbnNmb3JtZWRfeHJhbmdlcyA9IHNldCgpCisKKyAgICBkZWYgZmluaXNoX3RyZWUoc2VsZiwgdHJlZSwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLnRyYW5zZm9ybWVkX3hyYW5nZXMgPSBOb25lCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBuYW1lID0gcmVzdWx0c1sibmFtZSJdCisgICAgICAgIGlmIG5hbWUudmFsdWUgPT0gdSJ4cmFuZ2UiOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhbnNmb3JtX3hyYW5nZShub2RlLCByZXN1bHRzKQorICAgICAgICBlbGlmIG5hbWUudmFsdWUgPT0gdSJyYW5nZSI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFuc2Zvcm1fcmFuZ2Uobm9kZSwgcmVzdWx0cykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IocmVwcihuYW1lKSkKKworICAgIGRlZiB0cmFuc2Zvcm1feHJhbmdlKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBuYW1lID0gcmVzdWx0c1sibmFtZSJdCisgICAgICAgIG5hbWUucmVwbGFjZShOYW1lKHUicmFuZ2UiLCBwcmVmaXg9bmFtZS5wcmVmaXgpKQorICAgICAgICAjIFRoaXMgcHJldmVudHMgdGhlIG5ldyByYW5nZSBjYWxsIGZyb20gYmVpbmcgd3JhcHBlZCBpbiBhIGxpc3QgbGF0ZXIuCisgICAgICAgIHNlbGYudHJhbnNmb3JtZWRfeHJhbmdlcy5hZGQoaWQobm9kZSkpCisKKyAgICBkZWYgdHJhbnNmb3JtX3JhbmdlKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBpZiAoaWQobm9kZSkgbm90IGluIHNlbGYudHJhbnNmb3JtZWRfeHJhbmdlcyBhbmQKKyAgICAgICAgICAgIG5vdCBzZWxmLmluX3NwZWNpYWxfY29udGV4dChub2RlKSk6CisgICAgICAgICAgICByYW5nZV9jYWxsID0gQ2FsbChOYW1lKHUicmFuZ2UiKSwgW3Jlc3VsdHNbImFyZ3MiXS5jbG9uZSgpXSkKKyAgICAgICAgICAgICMgRW5jYXNlIHRoZSByYW5nZSBjYWxsIGluIGxpc3QoKS4KKyAgICAgICAgICAgIGxpc3RfY2FsbCA9IENhbGwoTmFtZSh1Imxpc3QiKSwgW3JhbmdlX2NhbGxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9bm9kZS5wcmVmaXgpCisgICAgICAgICAgICAjIFB1dCB0aGluZ3MgdGhhdCB3ZXJlIGFmdGVyIHRoZSByYW5nZSgpIGNhbGwgYWZ0ZXIgdGhlIGxpc3QgY2FsbC4KKyAgICAgICAgICAgIGZvciBuIGluIHJlc3VsdHNbInJlc3QiXToKKyAgICAgICAgICAgICAgICBsaXN0X2NhbGwuYXBwZW5kX2NoaWxkKG4pCisgICAgICAgICAgICByZXR1cm4gbGlzdF9jYWxsCisKKyAgICBQMSA9ICJwb3dlcjwgZnVuYz1OQU1FIHRyYWlsZXI8ICcoJyBub2RlPWFueSAnKScgPiBhbnkqID4iCisgICAgcDEgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybihQMSkKKworICAgIFAyID0gIiIiZm9yX3N0bXQ8ICdmb3InIGFueSAnaW4nIG5vZGU9YW55ICc6JyBhbnkqID4KKyAgICAgICAgICAgIHwgY29tcF9mb3I8ICdmb3InIGFueSAnaW4nIG5vZGU9YW55IGFueSogPgorICAgICAgICAgICAgfCBjb21wYXJpc29uPCBhbnkgJ2luJyBub2RlPWFueSBhbnkqPgorICAgICAgICAgIiIiCisgICAgcDIgPSBwYXRjb21wLmNvbXBpbGVfcGF0dGVybihQMikKKworICAgIGRlZiBpbl9zcGVjaWFsX2NvbnRleHQoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vZGUucGFyZW50IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmVzdWx0cyA9IHt9CisgICAgICAgIGlmIChub2RlLnBhcmVudC5wYXJlbnQgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICBzZWxmLnAxLm1hdGNoKG5vZGUucGFyZW50LnBhcmVudCwgcmVzdWx0cykgYW5kCisgICAgICAgICAgICAgICByZXN1bHRzWyJub2RlIl0gaXMgbm9kZSk6CisgICAgICAgICAgICAjIGxpc3QoZC5rZXlzKCkpIC0+IGxpc3QoZC5rZXlzKCkpLCBldGMuCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0c1siZnVuYyJdLnZhbHVlIGluIGNvbnN1bWluZ19jYWxscworICAgICAgICAjIGZvciAuLi4gaW4gZC5pdGVya2V5cygpIC0+IGZvciAuLi4gaW4gZC5rZXlzKCksIGV0Yy4KKyAgICAgICAgcmV0dXJuIHNlbGYucDIubWF0Y2gobm9kZS5wYXJlbnQsIHJlc3VsdHMpIGFuZCByZXN1bHRzWyJub2RlIl0gaXMgbm9kZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF94cmFuZ2UucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF94cmFuZ2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MTUyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyYW5nZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF94cmFuZ2UucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF94cmFuZ2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MTUyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyYW5nZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF94cmVhZGxpbmVzLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF94cmVhZGxpbmVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MGI5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyZWFkbGluZXMucHkKQEAgLTAsMCArMSwyNSBAQAorIiIiRml4ICJmb3IgeCBpbiBmLnhyZWFkbGluZXMoKSIgLT4gImZvciB4IGluIGYiLgorCitUaGlzIGZpeGVyIHdpbGwgYWxzbyBjb252ZXJ0IGcoZi54cmVhZGxpbmVzKSBpbnRvIGcoZi5fX2l0ZXJfXykuIiIiCisjIEF1dGhvcjogQ29sbGluIFdpbnRlcgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lCisKKworY2xhc3MgRml4WHJlYWRsaW5lcyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgUEFUVEVSTiA9ICIiIgorICAgIHBvd2VyPCBjYWxsPWFueSsgdHJhaWxlcjwgJy4nICd4cmVhZGxpbmVzJyA+IHRyYWlsZXI8ICcoJyAnKScgPiA+CisgICAgfAorICAgIHBvd2VyPCBhbnkrIHRyYWlsZXI8ICcuJyBub19jYWxsPSd4cmVhZGxpbmVzJyA+ID4KKyAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIG5vX2NhbGwgPSByZXN1bHRzLmdldCgibm9fY2FsbCIpCisKKyAgICAgICAgaWYgbm9fY2FsbDoKKyAgICAgICAgICAgIG5vX2NhbGwucmVwbGFjZShOYW1lKHUiX19pdGVyX18iLCBwcmVmaXg9bm9fY2FsbC5wcmVmaXgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbm9kZS5yZXBsYWNlKFt4LmNsb25lKCkgZm9yIHggaW4gcmVzdWx0c1siY2FsbCJdXSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfeHJlYWRsaW5lcy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyZWFkbGluZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGJiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyZWFkbGluZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfeHJlYWRsaW5lcy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyZWFkbGluZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGJiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyZWFkbGluZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfemlwLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF96aXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVkN2I2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfemlwLnB5CkBAIC0wLDAgKzEsMzUgQEAKKyIiIgorRml4ZXIgdGhhdCBjaGFuZ2VzIHppcChzZXEwLCBzZXExLCAuLi4pIGludG8gbGlzdCh6aXAoc2VxMCwgc2VxMSwgLi4uKQordW5sZXNzIHRoZXJlIGV4aXN0cyBhICdmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgemlwJyBzdGF0ZW1lbnQgaW4gdGhlCit0b3AtbGV2ZWwgbmFtZXNwYWNlLgorCitXZSBhdm9pZCB0aGUgdHJhbnNmb3JtYXRpb24gaWYgdGhlIHppcCgpIGNhbGwgaXMgZGlyZWN0bHkgY29udGFpbmVkIGluCitpdGVyKDw+KSwgbGlzdCg8PiksIHR1cGxlKDw+KSwgc29ydGVkKDw+KSwgLi4uam9pbig8PiksIG9yIGZvciBWIGluIDw+Oi4KKyIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBpbl9zcGVjaWFsX2NvbnRleHQKKworY2xhc3MgRml4WmlwKGZpeGVyX2Jhc2UuQ29uZGl0aW9uYWxGaXgpOgorCisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIiIiCisgICAgcG93ZXI8ICd6aXAnIGFyZ3M9dHJhaWxlcjwgJygnIFthbnldICcpJyA+CisgICAgPgorICAgICIiIgorCisgICAgc2tpcF9vbiA9ICJmdXR1cmVfYnVpbHRpbnMuemlwIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgaWYgc2VsZi5zaG91bGRfc2tpcChub2RlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGluX3NwZWNpYWxfY29udGV4dChub2RlKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgbmV3ID0gbm9kZS5jbG9uZSgpCisgICAgICAgIG5ldy5wcmVmaXggPSB1IiIKKyAgICAgICAgbmV3ID0gQ2FsbChOYW1lKHUibGlzdCIpLCBbbmV3XSkKKyAgICAgICAgbmV3LnByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgIHJldHVybiBuZXcKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfemlwLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfemlwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWYyMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF96aXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfemlwLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfemlwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWYyMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF96aXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9tYWluLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL21haW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwNjI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9tYWluLnB5CkBAIC0wLDAgKzEsMjY5IEBACisiIiIKK01haW4gcHJvZ3JhbSBmb3IgMnRvMy4KKyIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IGRpZmZsaWIKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgb3B0cGFyc2UKKworZnJvbSAuIGltcG9ydCByZWZhY3RvcgorCisKK2RlZiBkaWZmX3RleHRzKGEsIGIsIGZpbGVuYW1lKToKKyAgICAiIiJSZXR1cm4gYSB1bmlmaWVkIGRpZmYgb2YgdHdvIHN0cmluZ3MuIiIiCisgICAgYSA9IGEuc3BsaXRsaW5lcygpCisgICAgYiA9IGIuc3BsaXRsaW5lcygpCisgICAgcmV0dXJuIGRpZmZsaWIudW5pZmllZF9kaWZmKGEsIGIsIGZpbGVuYW1lLCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihvcmlnaW5hbCkiLCAiKHJlZmFjdG9yZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXRlcm09IiIpCisKKworY2xhc3MgU3Rkb3V0UmVmYWN0b3JpbmdUb29sKHJlZmFjdG9yLk11bHRpcHJvY2Vzc1JlZmFjdG9yaW5nVG9vbCk6CisgICAgIiIiCisgICAgQSByZWZhY3RvcmluZyB0b29sIHRoYXQgY2FuIGF2b2lkIG92ZXJ3cml0aW5nIGl0cyBpbnB1dCBmaWxlcy4KKyAgICBQcmludHMgb3V0cHV0IHRvIHN0ZG91dC4KKworICAgIE91dHB1dCBmaWxlcyBjYW4gb3B0aW9uYWxseSBiZSB3cml0dGVuIHRvIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBhbmQgb3IKKyAgICBoYXZlIGFuIGV4dHJhIGZpbGUgc3VmZml4IGFwcGVuZGVkIHRvIHRoZWlyIG5hbWUgZm9yIHVzZSBpbiBzaXR1YXRpb25zCisgICAgd2hlcmUgeW91IGRvIG5vdCB3YW50IHRvIHJlcGxhY2UgdGhlIGlucHV0IGZpbGVzLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpeGVycywgb3B0aW9ucywgZXhwbGljaXQsIG5vYmFja3Vwcywgc2hvd19kaWZmcywKKyAgICAgICAgICAgICAgICAgaW5wdXRfYmFzZV9kaXI9JycsIG91dHB1dF9kaXI9JycsIGFwcGVuZF9zdWZmaXg9JycpOgorICAgICAgICAiIiIKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIGZpeGVyczogQSBsaXN0IG9mIGZpeGVycyB0byBpbXBvcnQuCisgICAgICAgICAgICBvcHRpb25zOiBBIGRpY3Qgd2l0aCBSZWZhY3RvcmluZ1Rvb2wgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgIGV4cGxpY2l0OiBBIGxpc3Qgb2YgZml4ZXJzIHRvIHJ1biBldmVuIGlmIHRoZXkgYXJlIGV4cGxpY2l0LgorICAgICAgICAgICAgbm9iYWNrdXBzOiBJZiB0cnVlIG5vIGJhY2t1cCAnLmJhaycgZmlsZXMgd2lsbCBiZSBjcmVhdGVkIGZvciB0aG9zZQorICAgICAgICAgICAgICAgIGZpbGVzIHRoYXQgYXJlIGJlaW5nIHJlZmFjdG9yZWQuCisgICAgICAgICAgICBzaG93X2RpZmZzOiBTaG91bGQgZGlmZnMgb2YgdGhlIHJlZmFjdG9yaW5nIGJlIHByaW50ZWQgdG8gc3Rkb3V0PworICAgICAgICAgICAgaW5wdXRfYmFzZV9kaXI6IFRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgYWxsIGlucHV0IGZpbGVzLiAgVGhpcyBjbGFzcworICAgICAgICAgICAgICAgIHdpbGwgc3RyaXAgdGhpcyBwYXRoIHByZWZpeCBvZmYgb2YgZmlsZW5hbWVzIGJlZm9yZSBzdWJzdGl0dXRpbmcKKyAgICAgICAgICAgICAgICBpdCB3aXRoIG91dHB1dF9kaXIuICBPbmx5IG1lYW5pbmdmdWwgaWYgb3V0cHV0X2RpciBpcyBzdXBwbGllZC4KKyAgICAgICAgICAgICAgICBBbGwgZmlsZXMgcHJvY2Vzc2VkIGJ5IHJlZmFjdG9yKCkgbXVzdCBzdGFydCB3aXRoIHRoaXMgcGF0aC4KKyAgICAgICAgICAgIG91dHB1dF9kaXI6IElmIHN1cHBsaWVkLCBhbGwgY29udmVydGVkIGZpbGVzIHdpbGwgYmUgd3JpdHRlbiBpbnRvCisgICAgICAgICAgICAgICAgdGhpcyBkaXJlY3RvcnkgdHJlZSBpbnN0ZWFkIG9mIGlucHV0X2Jhc2VfZGlyLgorICAgICAgICAgICAgYXBwZW5kX3N1ZmZpeDogSWYgc3VwcGxpZWQsIGFsbCBmaWxlcyBvdXRwdXQgYnkgdGhpcyB0b29sIHdpbGwgaGF2ZQorICAgICAgICAgICAgICAgIHRoaXMgYXBwZW5kZWQgdG8gdGhlaXIgZmlsZW5hbWUuICBVc2VmdWwgZm9yIGNoYW5naW5nIC5weSB0bworICAgICAgICAgICAgICAgIC5weTMgZm9yIGV4YW1wbGUgYnkgcGFzc2luZyBhcHBlbmRfc3VmZml4PSczJy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubm9iYWNrdXBzID0gbm9iYWNrdXBzCisgICAgICAgIHNlbGYuc2hvd19kaWZmcyA9IHNob3dfZGlmZnMKKyAgICAgICAgaWYgaW5wdXRfYmFzZV9kaXIgYW5kIG5vdCBpbnB1dF9iYXNlX2Rpci5lbmRzd2l0aChvcy5zZXApOgorICAgICAgICAgICAgaW5wdXRfYmFzZV9kaXIgKz0gb3Muc2VwCisgICAgICAgIHNlbGYuX2lucHV0X2Jhc2VfZGlyID0gaW5wdXRfYmFzZV9kaXIKKyAgICAgICAgc2VsZi5fb3V0cHV0X2RpciA9IG91dHB1dF9kaXIKKyAgICAgICAgc2VsZi5fYXBwZW5kX3N1ZmZpeCA9IGFwcGVuZF9zdWZmaXgKKyAgICAgICAgc3VwZXIoU3Rkb3V0UmVmYWN0b3JpbmdUb29sLCBzZWxmKS5fX2luaXRfXyhmaXhlcnMsIG9wdGlvbnMsIGV4cGxpY2l0KQorCisgICAgZGVmIGxvZ19lcnJvcihzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZCgobXNnLCBhcmdzLCBrd2FyZ3MpKQorICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcihtc2csICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiB3cml0ZV9maWxlKHNlbGYsIG5ld190ZXh0LCBmaWxlbmFtZSwgb2xkX3RleHQsIGVuY29kaW5nKToKKyAgICAgICAgb3JpZ19maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIGlmIHNlbGYuX291dHB1dF9kaXI6CisgICAgICAgICAgICBpZiBmaWxlbmFtZS5zdGFydHN3aXRoKHNlbGYuX2lucHV0X2Jhc2VfZGlyKToKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLl9vdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lW2xlbihzZWxmLl9pbnB1dF9iYXNlX2Rpcik6XSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZmlsZW5hbWUgJXMgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lucHV0X2Jhc2VfZGlyICVzJyAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIHNlbGYuX2lucHV0X2Jhc2VfZGlyKSkKKyAgICAgICAgaWYgc2VsZi5fYXBwZW5kX3N1ZmZpeDoKKyAgICAgICAgICAgIGZpbGVuYW1lICs9IHNlbGYuX2FwcGVuZF9zdWZmaXgKKyAgICAgICAgaWYgb3JpZ19maWxlbmFtZSAhPSBmaWxlbmFtZToKKyAgICAgICAgICAgIG91dHB1dF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihvdXRwdXRfZGlyKToKKyAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhvdXRwdXRfZGlyKQorICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgnV3JpdGluZyBjb252ZXJ0ZWQgJXMgdG8gJXMuJywgb3JpZ19maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpCisgICAgICAgIGlmIG5vdCBzZWxmLm5vYmFja3VwczoKKyAgICAgICAgICAgICMgTWFrZSBiYWNrdXAKKyAgICAgICAgICAgIGJhY2t1cCA9IGZpbGVuYW1lICsgIi5iYWsiCisgICAgICAgICAgICBpZiBvcy5wYXRoLmxleGlzdHMoYmFja3VwKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShiYWNrdXApCisgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIkNhbid0IHJlbW92ZSBiYWNrdXAgJXMiLCBiYWNrdXApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MucmVuYW1lKGZpbGVuYW1lLCBiYWNrdXApCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJDYW4ndCByZW5hbWUgJXMgdG8gJXMiLCBmaWxlbmFtZSwgYmFja3VwKQorICAgICAgICAjIEFjdHVhbGx5IHdyaXRlIHRoZSBuZXcgZmlsZQorICAgICAgICB3cml0ZSA9IHN1cGVyKFN0ZG91dFJlZmFjdG9yaW5nVG9vbCwgc2VsZikud3JpdGVfZmlsZQorICAgICAgICB3cml0ZShuZXdfdGV4dCwgZmlsZW5hbWUsIG9sZF90ZXh0LCBlbmNvZGluZykKKyAgICAgICAgaWYgbm90IHNlbGYubm9iYWNrdXBzOgorICAgICAgICAgICAgc2h1dGlsLmNvcHltb2RlKGJhY2t1cCwgZmlsZW5hbWUpCisgICAgICAgIGlmIG9yaWdfZmlsZW5hbWUgIT0gZmlsZW5hbWU6CisgICAgICAgICAgICAjIFByZXNlcnZlIHRoZSBmaWxlIG1vZGUgaW4gdGhlIG5ldyBvdXRwdXQgZGlyZWN0b3J5LgorICAgICAgICAgICAgc2h1dGlsLmNvcHltb2RlKG9yaWdfZmlsZW5hbWUsIGZpbGVuYW1lKQorCisgICAgZGVmIHByaW50X291dHB1dChzZWxmLCBvbGQsIG5ldywgZmlsZW5hbWUsIGVxdWFsKToKKyAgICAgICAgaWYgZXF1YWw6CisgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJObyBjaGFuZ2VzIHRvICVzIiwgZmlsZW5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJSZWZhY3RvcmVkICVzIiwgZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBzZWxmLnNob3dfZGlmZnM6CisgICAgICAgICAgICAgICAgZGlmZl9saW5lcyA9IGRpZmZfdGV4dHMob2xkLCBuZXcsIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5vdXRwdXRfbG9jayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5vdXRwdXRfbG9jazoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBkaWZmX2xpbmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBkaWZmX2xpbmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IGxpbmUKKyAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICAgICAgICAgICAgICB3YXJuKCJjb3VsZG4ndCBlbmNvZGUgJXMncyBkaWZmIGZvciB5b3VyIHRlcm1pbmFsIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVuYW1lLCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisKK2RlZiB3YXJuKG1zZyk6CisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIldBUk5JTkc6ICVzIiAlIChtc2csKQorCisKK2RlZiBtYWluKGZpeGVyX3BrZywgYXJncz1Ob25lKToKKyAgICAiIiJNYWluIHByb2dyYW0uCisKKyAgICBBcmdzOgorICAgICAgICBmaXhlcl9wa2c6IHRoZSBuYW1lIG9mIGEgcGFja2FnZSB3aGVyZSB0aGUgZml4ZXJzIGFyZSBsb2NhdGVkLgorICAgICAgICBhcmdzOiBvcHRpb25hbDsgYSBsaXN0IG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIElmIG9taXR0ZWQsCisgICAgICAgICAgICAgIHN5cy5hcmd2WzE6XSBpcyB1c2VkLgorCisgICAgUmV0dXJucyBhIHN1Z2dlc3RlZCBleGl0IHN0YXR1cyAoMCwgMSwgMikuCisgICAgIiIiCisgICAgIyBTZXQgdXAgb3B0aW9uIHBhcnNlcgorICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcih1c2FnZT0iMnRvMyBbb3B0aW9uc10gZmlsZXxkaXIgLi4uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLWQiLCAiLS1kb2N0ZXN0c19vbmx5IiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJGaXggdXAgZG9jdGVzdHMgb25seSIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZml4IiwgYWN0aW9uPSJhcHBlbmQiLCBkZWZhdWx0PVtdLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkVhY2ggRklYIHNwZWNpZmllcyBhIHRyYW5zZm9ybWF0aW9uOyBkZWZhdWx0OiBhbGwiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItaiIsICItLXByb2Nlc3NlcyIsIGFjdGlvbj0ic3RvcmUiLCBkZWZhdWx0PTEsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiwgaGVscD0iUnVuIDJ0bzMgY29uY3VycmVudGx5IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLXgiLCAiLS1ub2ZpeCIsIGFjdGlvbj0iYXBwZW5kIiwgZGVmYXVsdD1bXSwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQcmV2ZW50IGEgdHJhbnNmb3JtYXRpb24gZnJvbSBiZWluZyBydW4iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItbCIsICItLWxpc3QtZml4ZXMiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Ikxpc3QgYXZhaWxhYmxlIHRyYW5zZm9ybWF0aW9ucyIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1wIiwgIi0tcHJpbnQtZnVuY3Rpb24iLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Ik1vZGlmeSB0aGUgZ3JhbW1hciBzbyB0aGF0IHByaW50KCkgaXMgYSBmdW5jdGlvbiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi12IiwgIi0tdmVyYm9zZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iTW9yZSB2ZXJib3NlIGxvZ2dpbmciKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItLW5vLWRpZmZzIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJEb24ndCBzaG93IGRpZmZzIG9mIHRoZSByZWZhY3RvcmluZyIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi13IiwgIi0td3JpdGUiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IldyaXRlIGJhY2sgbW9kaWZpZWQgZmlsZXMiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItbiIsICItLW5vYmFja3VwcyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRG9uJ3Qgd3JpdGUgYmFja3VwcyBmb3IgbW9kaWZpZWQgZmlsZXMiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItbyIsICItLW91dHB1dC1kaXIiLCBhY3Rpb249InN0b3JlIiwgdHlwZT0ic3RyIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIiLCBoZWxwPSJQdXQgb3V0cHV0IGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAiaW5zdGVhZCBvZiBvdmVyd3JpdGluZyB0aGUgaW5wdXQgZmlsZXMuICBSZXF1aXJlcyAtbi4iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItVyIsICItLXdyaXRlLXVuY2hhbmdlZC1maWxlcyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iQWxzbyB3cml0ZSBmaWxlcyBldmVuIGlmIG5vIGNoYW5nZXMgd2VyZSByZXF1aXJlZCIKKyAgICAgICAgICAgICAgICAgICAgICAiICh1c2VmdWwgd2l0aCAtLW91dHB1dC1kaXIpOyBpbXBsaWVzIC13LiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tYWRkLXN1ZmZpeCIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPSJzdHIiLCBkZWZhdWx0PSIiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkFwcGVuZCB0aGlzIHN0cmluZyB0byBhbGwgb3V0cHV0IGZpbGVuYW1lcy4iCisgICAgICAgICAgICAgICAgICAgICAgIiBSZXF1aXJlcyAtbiBpZiBub24tZW1wdHkuICAiCisgICAgICAgICAgICAgICAgICAgICAgImV4OiAtLWFkZC1zdWZmaXg9JzMnIHdpbGwgZ2VuZXJhdGUgLnB5MyBmaWxlcy4iKQorCisgICAgIyBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgcmVmYWN0b3Jfc3RkaW4gPSBGYWxzZQorICAgIGZsYWdzID0ge30KKyAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKKyAgICBpZiBvcHRpb25zLndyaXRlX3VuY2hhbmdlZF9maWxlczoKKyAgICAgICAgZmxhZ3NbIndyaXRlX3VuY2hhbmdlZF9maWxlcyJdID0gVHJ1ZQorICAgICAgICBpZiBub3Qgb3B0aW9ucy53cml0ZToKKyAgICAgICAgICAgIHdhcm4oIi0td3JpdGUtdW5jaGFuZ2VkLWZpbGVzLy1XIGltcGxpZXMgLXcuIikKKyAgICAgICAgb3B0aW9ucy53cml0ZSA9IFRydWUKKyAgICAjIElmIHdlIGFsbG93ZWQgdGhlc2UsIHRoZSBvcmlnaW5hbCBmaWxlcyB3b3VsZCBiZSByZW5hbWVkIHRvIGJhY2t1cCBuYW1lcworICAgICMgYnV0IG5vdCByZXBsYWNlZC4KKyAgICBpZiBvcHRpb25zLm91dHB1dF9kaXIgYW5kIG5vdCBvcHRpb25zLm5vYmFja3VwczoKKyAgICAgICAgcGFyc2VyLmVycm9yKCJDYW4ndCB1c2UgLS1vdXRwdXQtZGlyLy1vIHdpdGhvdXQgLW4uIikKKyAgICBpZiBvcHRpb25zLmFkZF9zdWZmaXggYW5kIG5vdCBvcHRpb25zLm5vYmFja3VwczoKKyAgICAgICAgcGFyc2VyLmVycm9yKCJDYW4ndCB1c2UgLS1hZGQtc3VmZml4IHdpdGhvdXQgLW4uIikKKworICAgIGlmIG5vdCBvcHRpb25zLndyaXRlIGFuZCBvcHRpb25zLm5vX2RpZmZzOgorICAgICAgICB3YXJuKCJub3Qgd3JpdGluZyBmaWxlcyBhbmQgbm90IHByaW50aW5nIGRpZmZzOyB0aGF0J3Mgbm90IHZlcnkgdXNlZnVsIikKKyAgICBpZiBub3Qgb3B0aW9ucy53cml0ZSBhbmQgb3B0aW9ucy5ub2JhY2t1cHM6CisgICAgICAgIHBhcnNlci5lcnJvcigiQ2FuJ3QgdXNlIC1uIHdpdGhvdXQgLXciKQorICAgIGlmIG9wdGlvbnMubGlzdF9maXhlczoKKyAgICAgICAgcHJpbnQgIkF2YWlsYWJsZSB0cmFuc2Zvcm1hdGlvbnMgZm9yIHRoZSAtZi8tLWZpeCBvcHRpb246IgorICAgICAgICBmb3IgZml4bmFtZSBpbiByZWZhY3Rvci5nZXRfYWxsX2ZpeF9uYW1lcyhmaXhlcl9wa2cpOgorICAgICAgICAgICAgcHJpbnQgZml4bmFtZQorICAgICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgaWYgbm90IGFyZ3M6CisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJBdCBsZWFzdCBvbmUgZmlsZSBvciBkaXJlY3RvcnkgYXJndW1lbnQgcmVxdWlyZWQuIgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiVXNlIC0taGVscCB0byBzaG93IHVzYWdlLiIKKyAgICAgICAgcmV0dXJuIDIKKyAgICBpZiAiLSIgaW4gYXJnczoKKyAgICAgICAgcmVmYWN0b3Jfc3RkaW4gPSBUcnVlCisgICAgICAgIGlmIG9wdGlvbnMud3JpdGU6CisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiQ2FuJ3Qgd3JpdGUgdG8gc3RkaW4uIgorICAgICAgICAgICAgcmV0dXJuIDIKKyAgICBpZiBvcHRpb25zLnByaW50X2Z1bmN0aW9uOgorICAgICAgICBmbGFnc1sicHJpbnRfZnVuY3Rpb24iXSA9IFRydWUKKworICAgICMgU2V0IHVwIGxvZ2dpbmcgaGFuZGxlcgorICAgIGxldmVsID0gbG9nZ2luZy5ERUJVRyBpZiBvcHRpb25zLnZlcmJvc2UgZWxzZSBsb2dnaW5nLklORk8KKyAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGZvcm1hdD0nJShuYW1lKXM6ICUobWVzc2FnZSlzJywgbGV2ZWw9bGV2ZWwpCisgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2xpYjJ0bzMubWFpbicpCisKKyAgICAjIEluaXRpYWxpemUgdGhlIHJlZmFjdG9yaW5nIHRvb2wKKyAgICBhdmFpbF9maXhlcyA9IHNldChyZWZhY3Rvci5nZXRfZml4ZXJzX2Zyb21fcGFja2FnZShmaXhlcl9wa2cpKQorICAgIHVud2FudGVkX2ZpeGVzID0gc2V0KGZpeGVyX3BrZyArICIuZml4XyIgKyBmaXggZm9yIGZpeCBpbiBvcHRpb25zLm5vZml4KQorICAgIGV4cGxpY2l0ID0gc2V0KCkKKyAgICBpZiBvcHRpb25zLmZpeDoKKyAgICAgICAgYWxsX3ByZXNlbnQgPSBGYWxzZQorICAgICAgICBmb3IgZml4IGluIG9wdGlvbnMuZml4OgorICAgICAgICAgICAgaWYgZml4ID09ICJhbGwiOgorICAgICAgICAgICAgICAgIGFsbF9wcmVzZW50ID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleHBsaWNpdC5hZGQoZml4ZXJfcGtnICsgIi5maXhfIiArIGZpeCkKKyAgICAgICAgcmVxdWVzdGVkID0gYXZhaWxfZml4ZXMudW5pb24oZXhwbGljaXQpIGlmIGFsbF9wcmVzZW50IGVsc2UgZXhwbGljaXQKKyAgICBlbHNlOgorICAgICAgICByZXF1ZXN0ZWQgPSBhdmFpbF9maXhlcy51bmlvbihleHBsaWNpdCkKKyAgICBmaXhlcl9uYW1lcyA9IHJlcXVlc3RlZC5kaWZmZXJlbmNlKHVud2FudGVkX2ZpeGVzKQorICAgIGlucHV0X2Jhc2VfZGlyID0gb3MucGF0aC5jb21tb25wcmVmaXgoYXJncykKKyAgICBpZiAoaW5wdXRfYmFzZV9kaXIgYW5kIG5vdCBpbnB1dF9iYXNlX2Rpci5lbmRzd2l0aChvcy5zZXApCisgICAgICAgIGFuZCBub3Qgb3MucGF0aC5pc2RpcihpbnB1dF9iYXNlX2RpcikpOgorICAgICAgICAjIE9uZSBvciBtb3JlIHNpbWlsYXIgbmFtZXMgd2VyZSBwYXNzZWQsIHRoZWlyIGRpcmVjdG9yeSBpcyB0aGUgYmFzZS4KKyAgICAgICAgIyBvcy5wYXRoLmNvbW1vbnByZWZpeCgpIGlzIGlnbm9yYW50IG9mIHBhdGggZWxlbWVudHMsIHRoaXMgY29ycmVjdHMKKyAgICAgICAgIyBmb3IgdGhhdCB3ZWlyZCBBUEkuCisgICAgICAgIGlucHV0X2Jhc2VfZGlyID0gb3MucGF0aC5kaXJuYW1lKGlucHV0X2Jhc2VfZGlyKQorICAgIGlmIG9wdGlvbnMub3V0cHV0X2RpcjoKKyAgICAgICAgaW5wdXRfYmFzZV9kaXIgPSBpbnB1dF9iYXNlX2Rpci5yc3RyaXAob3Muc2VwKQorICAgICAgICBsb2dnZXIuaW5mbygnT3V0cHV0IGluICVyIHdpbGwgbWlycm9yIHRoZSBpbnB1dCBkaXJlY3RvcnkgJXIgbGF5b3V0LicsCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMub3V0cHV0X2RpciwgaW5wdXRfYmFzZV9kaXIpCisgICAgcnQgPSBTdGRvdXRSZWZhY3RvcmluZ1Rvb2woCisgICAgICAgICAgICBzb3J0ZWQoZml4ZXJfbmFtZXMpLCBmbGFncywgc29ydGVkKGV4cGxpY2l0KSwKKyAgICAgICAgICAgIG9wdGlvbnMubm9iYWNrdXBzLCBub3Qgb3B0aW9ucy5ub19kaWZmcywKKyAgICAgICAgICAgIGlucHV0X2Jhc2VfZGlyPWlucHV0X2Jhc2VfZGlyLAorICAgICAgICAgICAgb3V0cHV0X2Rpcj1vcHRpb25zLm91dHB1dF9kaXIsCisgICAgICAgICAgICBhcHBlbmRfc3VmZml4PW9wdGlvbnMuYWRkX3N1ZmZpeCkKKworICAgICMgUmVmYWN0b3IgYWxsIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBwYXNzZWQgYXMgYXJndW1lbnRzCisgICAgaWYgbm90IHJ0LmVycm9yczoKKyAgICAgICAgaWYgcmVmYWN0b3Jfc3RkaW46CisgICAgICAgICAgICBydC5yZWZhY3Rvcl9zdGRpbigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcnQucmVmYWN0b3IoYXJncywgb3B0aW9ucy53cml0ZSwgb3B0aW9ucy5kb2N0ZXN0c19vbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMucHJvY2Vzc2VzKQorICAgICAgICAgICAgZXhjZXB0IHJlZmFjdG9yLk11bHRpcHJvY2Vzc2luZ1Vuc3VwcG9ydGVkOgorICAgICAgICAgICAgICAgIGFzc2VydCBvcHRpb25zLnByb2Nlc3NlcyA+IDEKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiU29ycnksIC1qIGlzbid0ICIgXAorICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uIgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHJ0LnN1bW1hcml6ZSgpCisKKyAgICAjIFJldHVybiBlcnJvciBzdGF0dXMgKDAgaWYgcnQuZXJyb3JzIGlzIHplcm8pCisgICAgcmV0dXJuIGludChib29sKHJ0LmVycm9ycykpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvbWFpbi5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvbWFpbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiYjhlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9tYWluLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvbWFpbi5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvbWFpbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJmOGI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9tYWluLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGF0Y29tcC5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wYXRjb21wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5M2U1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGF0Y29tcC5weQpAQCAtMCwwICsxLDIwNSBAQAorIyBDb3B5cmlnaHQgMjAwNiBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJQYXR0ZXJuIGNvbXBpbGVyLgorCitUaGUgZ3JhbW1lciBpcyB0YWtlbiBmcm9tIFBhdHRlcm5HcmFtbWFyLnR4dC4KKworVGhlIGNvbXBpbGVyIGNvbXBpbGVzIGEgcGF0dGVybiB0byBhIHB5dHJlZS4qUGF0dGVybiBpbnN0YW5jZS4KKyIiIgorCitfX2F1dGhvcl9fID0gIkd1aWRvIHZhbiBSb3NzdW0gPGd1aWRvQHB5dGhvbi5vcmc+IgorCisjIFB5dGhvbiBpbXBvcnRzCitpbXBvcnQgb3MKK2ltcG9ydCBTdHJpbmdJTworCisjIEZhaXJseSBsb2NhbCBpbXBvcnRzCitmcm9tIC5wZ2VuMiBpbXBvcnQgZHJpdmVyLCBsaXRlcmFscywgdG9rZW4sIHRva2VuaXplLCBwYXJzZSwgZ3JhbW1hcgorCisjIFJlYWxseSBsb2NhbCBpbXBvcnRzCitmcm9tIC4gaW1wb3J0IHB5dHJlZQorZnJvbSAuIGltcG9ydCBweWdyYW0KKworIyBUaGUgcGF0dGVybiBncmFtbWFyIGZpbGUKK19QQVRURVJOX0dSQU1NQVJfRklMRSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXR0ZXJuR3JhbW1hci50eHQiKQorCisKK2NsYXNzIFBhdHRlcm5TeW50YXhFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitkZWYgdG9rZW5pemVfd3JhcHBlcihpbnB1dCk6CisgICAgIiIiVG9rZW5pemVzIGEgc3RyaW5nIHN1cHByZXNzaW5nIHNpZ25pZmljYW50IHdoaXRlc3BhY2UuIiIiCisgICAgc2tpcCA9IHNldCgodG9rZW4uTkVXTElORSwgdG9rZW4uSU5ERU5ULCB0b2tlbi5ERURFTlQpKQorICAgIHRva2VucyA9IHRva2VuaXplLmdlbmVyYXRlX3Rva2VucyhTdHJpbmdJTy5TdHJpbmdJTyhpbnB1dCkucmVhZGxpbmUpCisgICAgZm9yIHF1aW50dXBsZSBpbiB0b2tlbnM6CisgICAgICAgIHR5cGUsIHZhbHVlLCBzdGFydCwgZW5kLCBsaW5lX3RleHQgPSBxdWludHVwbGUKKyAgICAgICAgaWYgdHlwZSBub3QgaW4gc2tpcDoKKyAgICAgICAgICAgIHlpZWxkIHF1aW50dXBsZQorCisKK2NsYXNzIFBhdHRlcm5Db21waWxlcihvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGdyYW1tYXJfZmlsZT1fUEFUVEVSTl9HUkFNTUFSX0ZJTEUpOgorICAgICAgICAiIiJJbml0aWFsaXplci4KKworICAgICAgICBUYWtlcyBhbiBvcHRpb25hbCBhbHRlcm5hdGl2ZSBmaWxlbmFtZSBmb3IgdGhlIHBhdHRlcm4gZ3JhbW1hci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZ3JhbW1hciA9IGRyaXZlci5sb2FkX2dyYW1tYXIoZ3JhbW1hcl9maWxlKQorICAgICAgICBzZWxmLnN5bXMgPSBweWdyYW0uU3ltYm9scyhzZWxmLmdyYW1tYXIpCisgICAgICAgIHNlbGYucHlncmFtbWFyID0gcHlncmFtLnB5dGhvbl9ncmFtbWFyCisgICAgICAgIHNlbGYucHlzeW1zID0gcHlncmFtLnB5dGhvbl9zeW1ib2xzCisgICAgICAgIHNlbGYuZHJpdmVyID0gZHJpdmVyLkRyaXZlcihzZWxmLmdyYW1tYXIsIGNvbnZlcnQ9cGF0dGVybl9jb252ZXJ0KQorCisgICAgZGVmIGNvbXBpbGVfcGF0dGVybihzZWxmLCBpbnB1dCwgZGVidWc9RmFsc2UsIHdpdGhfdHJlZT1GYWxzZSk6CisgICAgICAgICIiIkNvbXBpbGVzIGEgcGF0dGVybiBzdHJpbmcgdG8gYSBuZXN0ZWQgcHl0cmVlLipQYXR0ZXJuIG9iamVjdC4iIiIKKyAgICAgICAgdG9rZW5zID0gdG9rZW5pemVfd3JhcHBlcihpbnB1dCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcm9vdCA9IHNlbGYuZHJpdmVyLnBhcnNlX3Rva2Vucyh0b2tlbnMsIGRlYnVnPWRlYnVnKQorICAgICAgICBleGNlcHQgcGFyc2UuUGFyc2VFcnJvciBhcyBlOgorICAgICAgICAgICAgcmFpc2UgUGF0dGVyblN5bnRheEVycm9yKHN0cihlKSkKKyAgICAgICAgaWYgd2l0aF90cmVlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tcGlsZV9ub2RlKHJvb3QpLCByb290CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21waWxlX25vZGUocm9vdCkKKworICAgIGRlZiBjb21waWxlX25vZGUoc2VsZiwgbm9kZSk6CisgICAgICAgICIiIkNvbXBpbGVzIGEgbm9kZSwgcmVjdXJzaXZlbHkuCisKKyAgICAgICAgVGhpcyBpcyBvbmUgYmlnIHN3aXRjaCBvbiB0aGUgbm9kZSB0eXBlLgorICAgICAgICAiIiIKKyAgICAgICAgIyBYWFggT3B0aW1pemUgY2VydGFpbiBXaWxkY2FyZC1jb250YWluaW5nLVdpbGRjYXJkIHBhdHRlcm5zCisgICAgICAgICMgdGhhdCBjYW4gYmUgbWVyZ2VkCisgICAgICAgIGlmIG5vZGUudHlwZSA9PSBzZWxmLnN5bXMuTWF0Y2hlcjoKKyAgICAgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkcmVuWzBdICMgQXZvaWQgdW5uZWVkZWQgcmVjdXJzaW9uCisKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHNlbGYuc3ltcy5BbHRlcm5hdGl2ZXM6CisgICAgICAgICAgICAjIFNraXAgdGhlIG9kZCBjaGlsZHJlbiBzaW5jZSB0aGV5IGFyZSBqdXN0ICd8JyB0b2tlbnMKKyAgICAgICAgICAgIGFsdHMgPSBbc2VsZi5jb21waWxlX25vZGUoY2gpIGZvciBjaCBpbiBub2RlLmNoaWxkcmVuWzo6Ml1dCisgICAgICAgICAgICBpZiBsZW4oYWx0cykgPT0gMToKKyAgICAgICAgICAgICAgICByZXR1cm4gYWx0c1swXQorICAgICAgICAgICAgcCA9IHB5dHJlZS5XaWxkY2FyZFBhdHRlcm4oW1thXSBmb3IgYSBpbiBhbHRzXSwgbWluPTEsIG1heD0xKQorICAgICAgICAgICAgcmV0dXJuIHAub3B0aW1pemUoKQorCisgICAgICAgIGlmIG5vZGUudHlwZSA9PSBzZWxmLnN5bXMuQWx0ZXJuYXRpdmU6CisgICAgICAgICAgICB1bml0cyA9IFtzZWxmLmNvbXBpbGVfbm9kZShjaCkgZm9yIGNoIGluIG5vZGUuY2hpbGRyZW5dCisgICAgICAgICAgICBpZiBsZW4odW5pdHMpID09IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIHVuaXRzWzBdCisgICAgICAgICAgICBwID0gcHl0cmVlLldpbGRjYXJkUGF0dGVybihbdW5pdHNdLCBtaW49MSwgbWF4PTEpCisgICAgICAgICAgICByZXR1cm4gcC5vcHRpbWl6ZSgpCisKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHNlbGYuc3ltcy5OZWdhdGVkVW5pdDoKKyAgICAgICAgICAgIHBhdHRlcm4gPSBzZWxmLmNvbXBpbGVfYmFzaWMobm9kZS5jaGlsZHJlblsxOl0pCisgICAgICAgICAgICBwID0gcHl0cmVlLk5lZ2F0ZWRQYXR0ZXJuKHBhdHRlcm4pCisgICAgICAgICAgICByZXR1cm4gcC5vcHRpbWl6ZSgpCisKKyAgICAgICAgYXNzZXJ0IG5vZGUudHlwZSA9PSBzZWxmLnN5bXMuVW5pdAorCisgICAgICAgIG5hbWUgPSBOb25lCisgICAgICAgIG5vZGVzID0gbm9kZS5jaGlsZHJlbgorICAgICAgICBpZiBsZW4obm9kZXMpID49IDMgYW5kIG5vZGVzWzFdLnR5cGUgPT0gdG9rZW4uRVFVQUw6CisgICAgICAgICAgICBuYW1lID0gbm9kZXNbMF0udmFsdWUKKyAgICAgICAgICAgIG5vZGVzID0gbm9kZXNbMjpdCisgICAgICAgIHJlcGVhdCA9IE5vbmUKKyAgICAgICAgaWYgbGVuKG5vZGVzKSA+PSAyIGFuZCBub2Rlc1stMV0udHlwZSA9PSBzZWxmLnN5bXMuUmVwZWF0ZXI6CisgICAgICAgICAgICByZXBlYXQgPSBub2Rlc1stMV0KKyAgICAgICAgICAgIG5vZGVzID0gbm9kZXNbOi0xXQorCisgICAgICAgICMgTm93IHdlJ3ZlIHJlZHVjZWQgaXQgdG86IFNUUklORyB8IE5BTUUgW0RldGFpbHNdIHwgKC4uLikgfCBbLi4uXQorICAgICAgICBwYXR0ZXJuID0gc2VsZi5jb21waWxlX2Jhc2ljKG5vZGVzLCByZXBlYXQpCisKKyAgICAgICAgaWYgcmVwZWF0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXNzZXJ0IHJlcGVhdC50eXBlID09IHNlbGYuc3ltcy5SZXBlYXRlcgorICAgICAgICAgICAgY2hpbGRyZW4gPSByZXBlYXQuY2hpbGRyZW4KKyAgICAgICAgICAgIGNoaWxkID0gY2hpbGRyZW5bMF0KKyAgICAgICAgICAgIGlmIGNoaWxkLnR5cGUgPT0gdG9rZW4uU1RBUjoKKyAgICAgICAgICAgICAgICBtaW4gPSAwCisgICAgICAgICAgICAgICAgbWF4ID0gcHl0cmVlLkhVR0UKKyAgICAgICAgICAgIGVsaWYgY2hpbGQudHlwZSA9PSB0b2tlbi5QTFVTOgorICAgICAgICAgICAgICAgIG1pbiA9IDEKKyAgICAgICAgICAgICAgICBtYXggPSBweXRyZWUuSFVHRQorICAgICAgICAgICAgZWxpZiBjaGlsZC50eXBlID09IHRva2VuLkxCUkFDRToKKyAgICAgICAgICAgICAgICBhc3NlcnQgY2hpbGRyZW5bLTFdLnR5cGUgPT0gdG9rZW4uUkJSQUNFCisgICAgICAgICAgICAgICAgYXNzZXJ0ICBsZW4oY2hpbGRyZW4pIGluICgzLCA1KQorICAgICAgICAgICAgICAgIG1pbiA9IG1heCA9IHNlbGYuZ2V0X2ludChjaGlsZHJlblsxXSkKKyAgICAgICAgICAgICAgICBpZiBsZW4oY2hpbGRyZW4pID09IDU6CisgICAgICAgICAgICAgICAgICAgIG1heCA9IHNlbGYuZ2V0X2ludChjaGlsZHJlblszXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNzZXJ0IEZhbHNlCisgICAgICAgICAgICBpZiBtaW4gIT0gMSBvciBtYXggIT0gMToKKyAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5vcHRpbWl6ZSgpCisgICAgICAgICAgICAgICAgcGF0dGVybiA9IHB5dHJlZS5XaWxkY2FyZFBhdHRlcm4oW1twYXR0ZXJuXV0sIG1pbj1taW4sIG1heD1tYXgpCisKKyAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBhdHRlcm4ubmFtZSA9IG5hbWUKKyAgICAgICAgcmV0dXJuIHBhdHRlcm4ub3B0aW1pemUoKQorCisgICAgZGVmIGNvbXBpbGVfYmFzaWMoc2VsZiwgbm9kZXMsIHJlcGVhdD1Ob25lKToKKyAgICAgICAgIyBDb21waWxlIFNUUklORyB8IE5BTUUgW0RldGFpbHNdIHwgKC4uLikgfCBbLi4uXQorICAgICAgICBhc3NlcnQgbGVuKG5vZGVzKSA+PSAxCisgICAgICAgIG5vZGUgPSBub2Rlc1swXQorICAgICAgICBpZiBub2RlLnR5cGUgPT0gdG9rZW4uU1RSSU5HOgorICAgICAgICAgICAgdmFsdWUgPSB1bmljb2RlKGxpdGVyYWxzLmV2YWxTdHJpbmcobm9kZS52YWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gcHl0cmVlLkxlYWZQYXR0ZXJuKF90eXBlX29mX2xpdGVyYWwodmFsdWUpLCB2YWx1ZSkKKyAgICAgICAgZWxpZiBub2RlLnR5cGUgPT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgIHZhbHVlID0gbm9kZS52YWx1ZQorICAgICAgICAgICAgaWYgdmFsdWUuaXN1cHBlcigpOgorICAgICAgICAgICAgICAgIGlmIHZhbHVlIG5vdCBpbiBUT0tFTl9NQVA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhdHRlcm5TeW50YXhFcnJvcigiSW52YWxpZCB0b2tlbjogJXIiICUgdmFsdWUpCisgICAgICAgICAgICAgICAgaWYgbm9kZXNbMTpdOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXR0ZXJuU3ludGF4RXJyb3IoIkNhbid0IGhhdmUgZGV0YWlscyBmb3IgdG9rZW4iKQorICAgICAgICAgICAgICAgIHJldHVybiBweXRyZWUuTGVhZlBhdHRlcm4oVE9LRU5fTUFQW3ZhbHVlXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgdmFsdWUgPT0gImFueSI6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBOb25lCisgICAgICAgICAgICAgICAgZWxpZiBub3QgdmFsdWUuc3RhcnRzd2l0aCgiXyIpOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gZ2V0YXR0cihzZWxmLnB5c3ltcywgdmFsdWUsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgIGlmIHR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhdHRlcm5TeW50YXhFcnJvcigiSW52YWxpZCBzeW1ib2w6ICVyIiAlIHZhbHVlKQorICAgICAgICAgICAgICAgIGlmIG5vZGVzWzE6XTogIyBEZXRhaWxzIHByZXNlbnQKKyAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IFtzZWxmLmNvbXBpbGVfbm9kZShub2Rlc1sxXS5jaGlsZHJlblsxXSldCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IE5vbmUKKyAgICAgICAgICAgICAgICByZXR1cm4gcHl0cmVlLk5vZGVQYXR0ZXJuKHR5cGUsIGNvbnRlbnQpCisgICAgICAgIGVsaWYgbm9kZS52YWx1ZSA9PSAiKCI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21waWxlX25vZGUobm9kZXNbMV0pCisgICAgICAgIGVsaWYgbm9kZS52YWx1ZSA9PSAiWyI6CisgICAgICAgICAgICBhc3NlcnQgcmVwZWF0IGlzIE5vbmUKKyAgICAgICAgICAgIHN1YnBhdHRlcm4gPSBzZWxmLmNvbXBpbGVfbm9kZShub2Rlc1sxXSkKKyAgICAgICAgICAgIHJldHVybiBweXRyZWUuV2lsZGNhcmRQYXR0ZXJuKFtbc3VicGF0dGVybl1dLCBtaW49MCwgbWF4PTEpCisgICAgICAgIGFzc2VydCBGYWxzZSwgbm9kZQorCisgICAgZGVmIGdldF9pbnQoc2VsZiwgbm9kZSk6CisgICAgICAgIGFzc2VydCBub2RlLnR5cGUgPT0gdG9rZW4uTlVNQkVSCisgICAgICAgIHJldHVybiBpbnQobm9kZS52YWx1ZSkKKworCisjIE1hcCBuYW1lZCB0b2tlbnMgdG8gdGhlIHR5cGUgdmFsdWUgZm9yIGEgTGVhZlBhdHRlcm4KK1RPS0VOX01BUCA9IHsiTkFNRSI6IHRva2VuLk5BTUUsCisgICAgICAgICAgICAgIlNUUklORyI6IHRva2VuLlNUUklORywKKyAgICAgICAgICAgICAiTlVNQkVSIjogdG9rZW4uTlVNQkVSLAorICAgICAgICAgICAgICJUT0tFTiI6IE5vbmV9CisKKworZGVmIF90eXBlX29mX2xpdGVyYWwodmFsdWUpOgorICAgIGlmIHZhbHVlWzBdLmlzYWxwaGEoKToKKyAgICAgICAgcmV0dXJuIHRva2VuLk5BTUUKKyAgICBlbGlmIHZhbHVlIGluIGdyYW1tYXIub3BtYXA6CisgICAgICAgIHJldHVybiBncmFtbWFyLm9wbWFwW3ZhbHVlXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisKKworZGVmIHBhdHRlcm5fY29udmVydChncmFtbWFyLCByYXdfbm9kZV9pbmZvKToKKyAgICAiIiJDb252ZXJ0cyByYXcgbm9kZSBpbmZvcm1hdGlvbiB0byBhIE5vZGUgb3IgTGVhZiBpbnN0YW5jZS4iIiIKKyAgICB0eXBlLCB2YWx1ZSwgY29udGV4dCwgY2hpbGRyZW4gPSByYXdfbm9kZV9pbmZvCisgICAgaWYgY2hpbGRyZW4gb3IgdHlwZSBpbiBncmFtbWFyLm51bWJlcjJzeW1ib2w6CisgICAgICAgIHJldHVybiBweXRyZWUuTm9kZSh0eXBlLCBjaGlsZHJlbiwgY29udGV4dD1jb250ZXh0KQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBweXRyZWUuTGVhZih0eXBlLCB2YWx1ZSwgY29udGV4dD1jb250ZXh0KQorCisKK2RlZiBjb21waWxlX3BhdHRlcm4ocGF0dGVybik6CisgICAgcmV0dXJuIFBhdHRlcm5Db21waWxlcigpLmNvbXBpbGVfcGF0dGVybihwYXR0ZXJuKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BhdGNvbXAucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BhdGNvbXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzY3ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGF0Y29tcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BhdGNvbXAucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BhdGNvbXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZTNlMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGF0Y29tcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMzkwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvX19pbml0X18ucHkKQEAgLTAsMCArMSw0IEBACisjIENvcHlyaWdodCAyMDA0LTIwMDUgRWxlbWVudGFsIFNlY3VyaXR5LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiVGhlIHBnZW4yIHBhY2thZ2UuIiIiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2E3ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2E3ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvY29udi5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9jb252LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZmJiMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvY29udi5weQpAQCAtMCwwICsxLDI1NyBAQAorIyBDb3B5cmlnaHQgMjAwNC0yMDA1IEVsZW1lbnRhbCBTZWN1cml0eSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkNvbnZlcnQgZ3JhbWluaXQuW2NoXSBzcGl0IG91dCBieSBwZ2VuIHRvIFB5dGhvbiBjb2RlLgorCitQZ2VuIGlzIHRoZSBQeXRob24gcGFyc2VyIGdlbmVyYXRvci4gIEl0IGlzIHVzZWZ1bCB0byBxdWlja2x5IGNyZWF0ZSBhCitwYXJzZXIgZnJvbSBhIGdyYW1tYXIgZmlsZSBpbiBQeXRob24ncyBncmFtbWFyIG5vdGF0aW9uLiAgQnV0IEkgZG9uJ3QKK3dhbnQgbXkgcGFyc2VycyB0byBiZSB3cml0dGVuIGluIEMgKHlldCksIHNvIEknbSB0cmFuc2xhdGluZyB0aGUKK3BhcnNpbmcgdGFibGVzIHRvIFB5dGhvbiBkYXRhIHN0cnVjdHVyZXMgYW5kIHdyaXRpbmcgYSBQeXRob24gcGFyc2UKK2VuZ2luZS4KKworTm90ZSB0aGF0IHRoZSB0b2tlbiBudW1iZXJzIGFyZSBjb25zdGFudHMgZGV0ZXJtaW5lZCBieSB0aGUgc3RhbmRhcmQKK1B5dGhvbiB0b2tlbml6ZXIuICBUaGUgc3RhbmRhcmQgdG9rZW4gbW9kdWxlIGRlZmluZXMgdGhlc2UgbnVtYmVycyBhbmQKK3RoZWlyIG5hbWVzICh0aGUgbmFtZXMgYXJlIG5vdCB1c2VkIG11Y2gpLiAgVGhlIHRva2VuIG51bWJlcnMgYXJlCitoYXJkY29kZWQgaW50byB0aGUgUHl0aG9uIHRva2VuaXplciBhbmQgaW50byBwZ2VuLiAgQSBQeXRob24KK2ltcGxlbWVudGF0aW9uIG9mIHRoZSBQeXRob24gdG9rZW5pemVyIGlzIGFsc28gYXZhaWxhYmxlLCBpbiB0aGUKK3N0YW5kYXJkIHRva2VuaXplIG1vZHVsZS4KKworT24gdGhlIG90aGVyIGhhbmQsIHN5bWJvbCBudW1iZXJzIChyZXByZXNlbnRpbmcgdGhlIGdyYW1tYXIncworbm9uLXRlcm1pbmFscykgYXJlIGFzc2lnbmVkIGJ5IHBnZW4gYmFzZWQgb24gdGhlIGFjdHVhbCBncmFtbWFyCitpbnB1dC4KKworTm90ZTogdGhpcyBtb2R1bGUgaXMgcHJldHR5IG11Y2ggb2Jzb2xldGU7IHRoZSBwZ2VuIG1vZHVsZSBnZW5lcmF0ZXMKK2VxdWl2YWxlbnQgZ3JhbW1hciB0YWJsZXMgZGlyZWN0bHkgZnJvbSB0aGUgR3JhbW1hci50eHQgaW5wdXQgZmlsZQord2l0aG91dCBoYXZpbmcgdG8gaW52b2tlIHRoZSBQeXRob24gcGdlbiBDIHByb2dyYW0uCisKKyIiIgorCisjIFB5dGhvbiBpbXBvcnRzCitpbXBvcnQgcmUKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIHBnZW4yIGltcG9ydCBncmFtbWFyLCB0b2tlbgorCisKK2NsYXNzIENvbnZlcnRlcihncmFtbWFyLkdyYW1tYXIpOgorICAgICIiIkdyYW1tYXIgc3ViY2xhc3MgdGhhdCByZWFkcyBjbGFzc2ljIHBnZW4gb3V0cHV0IGZpbGVzLgorCisgICAgVGhlIHJ1bigpIG1ldGhvZCByZWFkcyB0aGUgdGFibGVzIGFzIHByb2R1Y2VkIGJ5IHRoZSBwZ2VuIHBhcnNlcgorICAgIGdlbmVyYXRvciwgdHlwaWNhbGx5IGNvbnRhaW5lZCBpbiB0d28gQyBmaWxlcywgZ3JhbWluaXQuaCBhbmQKKyAgICBncmFtaW5pdC5jLiAgVGhlIG90aGVyIG1ldGhvZHMgYXJlIGZvciBpbnRlcm5hbCB1c2Ugb25seS4KKworICAgIFNlZSB0aGUgYmFzZSBjbGFzcyBmb3IgbW9yZSBkb2N1bWVudGF0aW9uLgorCisgICAgIiIiCisKKyAgICBkZWYgcnVuKHNlbGYsIGdyYW1pbml0X2gsIGdyYW1pbml0X2MpOgorICAgICAgICAiIiJMb2FkIHRoZSBncmFtbWFyIHRhYmxlcyBmcm9tIHRoZSB0ZXh0IGZpbGVzIHdyaXR0ZW4gYnkgcGdlbi4iIiIKKyAgICAgICAgc2VsZi5wYXJzZV9ncmFtaW5pdF9oKGdyYW1pbml0X2gpCisgICAgICAgIHNlbGYucGFyc2VfZ3JhbWluaXRfYyhncmFtaW5pdF9jKQorICAgICAgICBzZWxmLmZpbmlzaF9vZmYoKQorCisgICAgZGVmIHBhcnNlX2dyYW1pbml0X2goc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiIiJQYXJzZSB0aGUgLmggZmlsZSB3cml0dGVuIGJ5IHBnZW4uICAoSW50ZXJuYWwpCisKKyAgICAgICAgVGhpcyBmaWxlIGlzIGEgc2VxdWVuY2Ugb2YgI2RlZmluZSBzdGF0ZW1lbnRzIGRlZmluaW5nIHRoZQorICAgICAgICBub250ZXJtaW5hbHMgb2YgdGhlIGdyYW1tYXIgYXMgbnVtYmVycy4gIFdlIGJ1aWxkIHR3byB0YWJsZXMKKyAgICAgICAgbWFwcGluZyB0aGUgbnVtYmVycyB0byBuYW1lcyBhbmQgYmFjay4KKworICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlcnI6CisgICAgICAgICAgICBwcmludCAiQ2FuJ3Qgb3BlbiAlczogJXMiICUgKGZpbGVuYW1lLCBlcnIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgc2VsZi5zeW1ib2wybnVtYmVyID0ge30KKyAgICAgICAgc2VsZi5udW1iZXIyc3ltYm9sID0ge30KKyAgICAgICAgbGluZW5vID0gMAorICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgbGluZW5vICs9IDEKKyAgICAgICAgICAgIG1vID0gcmUubWF0Y2gociJeI2RlZmluZVxzKyhcdyspXHMrKFxkKykkIiwgbGluZSkKKyAgICAgICAgICAgIGlmIG5vdCBtbyBhbmQgbGluZS5zdHJpcCgpOgorICAgICAgICAgICAgICAgIHByaW50ICIlcyglcyk6IGNhbid0IHBhcnNlICVzIiAlIChmaWxlbmFtZSwgbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnN0cmlwKCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN5bWJvbCwgbnVtYmVyID0gbW8uZ3JvdXBzKCkKKyAgICAgICAgICAgICAgICBudW1iZXIgPSBpbnQobnVtYmVyKQorICAgICAgICAgICAgICAgIGFzc2VydCBzeW1ib2wgbm90IGluIHNlbGYuc3ltYm9sMm51bWJlcgorICAgICAgICAgICAgICAgIGFzc2VydCBudW1iZXIgbm90IGluIHNlbGYubnVtYmVyMnN5bWJvbAorICAgICAgICAgICAgICAgIHNlbGYuc3ltYm9sMm51bWJlcltzeW1ib2xdID0gbnVtYmVyCisgICAgICAgICAgICAgICAgc2VsZi5udW1iZXIyc3ltYm9sW251bWJlcl0gPSBzeW1ib2wKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBwYXJzZV9ncmFtaW5pdF9jKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiUGFyc2UgdGhlIC5jIGZpbGUgd3JpdHRlbiBieSBwZ2VuLiAgKEludGVybmFsKQorCisgICAgICAgIFRoZSBmaWxlIGxvb2tzIGFzIGZvbGxvd3MuICBUaGUgZmlyc3QgdHdvIGxpbmVzIGFyZSBhbHdheXMgdGhpczoKKworICAgICAgICAjaW5jbHVkZSAicGdlbmhlYWRlcnMuaCIKKyAgICAgICAgI2luY2x1ZGUgImdyYW1tYXIuaCIKKworICAgICAgICBBZnRlciB0aGF0IGNvbWUgZm91ciBibG9ja3M6CisKKyAgICAgICAgMSkgb25lIG9yIG1vcmUgc3RhdGUgZGVmaW5pdGlvbnMKKyAgICAgICAgMikgYSB0YWJsZSBkZWZpbmluZyBkZmFzCisgICAgICAgIDMpIGEgdGFibGUgZGVmaW5pbmcgbGFiZWxzCisgICAgICAgIDQpIGEgc3RydWN0IGRlZmluaW5nIHRoZSBncmFtbWFyCisKKyAgICAgICAgQSBzdGF0ZSBkZWZpbml0aW9uIGhhcyB0aGUgZm9sbG93aW5nIGZvcm06CisgICAgICAgIC0gb25lIG9yIG1vcmUgYXJjIGFycmF5cywgZWFjaCBvZiB0aGUgZm9ybToKKyAgICAgICAgICBzdGF0aWMgYXJjIGFyY3NfPG4+XzxtPls8az5dID0geworICAgICAgICAgICAgICAgICAgezxpPiwgPGo+fSwKKyAgICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgIH07CisgICAgICAgIC0gZm9sbG93ZWQgYnkgYSBzdGF0ZSBhcnJheSwgb2YgdGhlIGZvcm06CisgICAgICAgICAgc3RhdGljIHN0YXRlIHN0YXRlc188cz5bPHQ+XSA9IHsKKyAgICAgICAgICAgICAgICAgIHs8az4sIGFyY3NfPG4+XzxtPn0sCisgICAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICB9OworCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHByaW50ICJDYW4ndCBvcGVuICVzOiAlcyIgJSAoZmlsZW5hbWUsIGVycikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAjIFRoZSBjb2RlIGJlbG93IGVzc2VudGlhbGx5IHVzZXMgZidzIGl0ZXJhdG9yLW5lc3MhCisgICAgICAgIGxpbmVubyA9IDAKKworICAgICAgICAjIEV4cGVjdCB0aGUgdHdvICNpbmNsdWRlIGxpbmVzCisgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICBhc3NlcnQgbGluZSA9PSAnI2luY2x1ZGUgInBnZW5oZWFkZXJzLmgiXG4nLCAobGluZW5vLCBsaW5lKQorICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IGxpbmUgPT0gJyNpbmNsdWRlICJncmFtbWFyLmgiXG4nLCAobGluZW5vLCBsaW5lKQorCisgICAgICAgICMgUGFyc2UgdGhlIHN0YXRlIGRlZmluaXRpb25zCisgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICBhbGxhcmNzID0ge30KKyAgICAgICAgc3RhdGVzID0gW10KKyAgICAgICAgd2hpbGUgbGluZS5zdGFydHN3aXRoKCJzdGF0aWMgYXJjICIpOgorICAgICAgICAgICAgd2hpbGUgbGluZS5zdGFydHN3aXRoKCJzdGF0aWMgYXJjICIpOgorICAgICAgICAgICAgICAgIG1vID0gcmUubWF0Y2gociJzdGF0aWMgYXJjIGFyY3NfKFxkKylfKFxkKylcWyhcZCspXF0gPSB7JCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKQorICAgICAgICAgICAgICAgIGFzc2VydCBtbywgKGxpbmVubywgbGluZSkKKyAgICAgICAgICAgICAgICBuLCBtLCBrID0gbWFwKGludCwgbW8uZ3JvdXBzKCkpCisgICAgICAgICAgICAgICAgYXJjcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2Uoayk6CisgICAgICAgICAgICAgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICAgICAgICAgICAgICBtbyA9IHJlLm1hdGNoKHIiXHMreyhcZCspLCAoXGQrKX0sJCIsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBtbywgKGxpbmVubywgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgaSwgaiA9IG1hcChpbnQsIG1vLmdyb3VwcygpKQorICAgICAgICAgICAgICAgICAgICBhcmNzLmFwcGVuZCgoaSwgaikpCisgICAgICAgICAgICAgICAgbGluZW5vLCBsaW5lID0gbGluZW5vKzEsIGYubmV4dCgpCisgICAgICAgICAgICAgICAgYXNzZXJ0IGxpbmUgPT0gIn07XG4iLCAobGluZW5vLCBsaW5lKQorICAgICAgICAgICAgICAgIGFsbGFyY3NbKG4sIG0pXSA9IGFyY3MKKyAgICAgICAgICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgICAgIG1vID0gcmUubWF0Y2gociJzdGF0aWMgc3RhdGUgc3RhdGVzXyhcZCspXFsoXGQrKVxdID0geyQiLCBsaW5lKQorICAgICAgICAgICAgYXNzZXJ0IG1vLCAobGluZW5vLCBsaW5lKQorICAgICAgICAgICAgcywgdCA9IG1hcChpbnQsIG1vLmdyb3VwcygpKQorICAgICAgICAgICAgYXNzZXJ0IHMgPT0gbGVuKHN0YXRlcyksIChsaW5lbm8sIGxpbmUpCisgICAgICAgICAgICBzdGF0ZSA9IFtdCisgICAgICAgICAgICBmb3IgXyBpbiByYW5nZSh0KToKKyAgICAgICAgICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgICAgICAgICBtbyA9IHJlLm1hdGNoKHIiXHMreyhcZCspLCBhcmNzXyhcZCspXyhcZCspfSwkIiwgbGluZSkKKyAgICAgICAgICAgICAgICBhc3NlcnQgbW8sIChsaW5lbm8sIGxpbmUpCisgICAgICAgICAgICAgICAgaywgbiwgbSA9IG1hcChpbnQsIG1vLmdyb3VwcygpKQorICAgICAgICAgICAgICAgIGFyY3MgPSBhbGxhcmNzW24sIG1dCisgICAgICAgICAgICAgICAgYXNzZXJ0IGsgPT0gbGVuKGFyY3MpLCAobGluZW5vLCBsaW5lKQorICAgICAgICAgICAgICAgIHN0YXRlLmFwcGVuZChhcmNzKQorICAgICAgICAgICAgc3RhdGVzLmFwcGVuZChzdGF0ZSkKKyAgICAgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICAgICAgYXNzZXJ0IGxpbmUgPT0gIn07XG4iLCAobGluZW5vLCBsaW5lKQorICAgICAgICAgICAgbGluZW5vLCBsaW5lID0gbGluZW5vKzEsIGYubmV4dCgpCisgICAgICAgIHNlbGYuc3RhdGVzID0gc3RhdGVzCisKKyAgICAgICAgIyBQYXJzZSB0aGUgZGZhcworICAgICAgICBkZmFzID0ge30KKyAgICAgICAgbW8gPSByZS5tYXRjaChyInN0YXRpYyBkZmEgZGZhc1xbKFxkKylcXSA9IHskIiwgbGluZSkKKyAgICAgICAgYXNzZXJ0IG1vLCAobGluZW5vLCBsaW5lKQorICAgICAgICBuZGZhcyA9IGludChtby5ncm91cCgxKSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobmRmYXMpOgorICAgICAgICAgICAgbGluZW5vLCBsaW5lID0gbGluZW5vKzEsIGYubmV4dCgpCisgICAgICAgICAgICBtbyA9IHJlLm1hdGNoKHInXHMreyhcZCspLCAiKFx3KykiLCAoXGQrKSwgKFxkKyksIHN0YXRlc18oXGQrKSwkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSkKKyAgICAgICAgICAgIGFzc2VydCBtbywgKGxpbmVubywgbGluZSkKKyAgICAgICAgICAgIHN5bWJvbCA9IG1vLmdyb3VwKDIpCisgICAgICAgICAgICBudW1iZXIsIHgsIHksIHogPSBtYXAoaW50LCBtby5ncm91cCgxLCAzLCA0LCA1KSkKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLnN5bWJvbDJudW1iZXJbc3ltYm9sXSA9PSBudW1iZXIsIChsaW5lbm8sIGxpbmUpCisgICAgICAgICAgICBhc3NlcnQgc2VsZi5udW1iZXIyc3ltYm9sW251bWJlcl0gPT0gc3ltYm9sLCAobGluZW5vLCBsaW5lKQorICAgICAgICAgICAgYXNzZXJ0IHggPT0gMCwgKGxpbmVubywgbGluZSkKKyAgICAgICAgICAgIHN0YXRlID0gc3RhdGVzW3pdCisgICAgICAgICAgICBhc3NlcnQgeSA9PSBsZW4oc3RhdGUpLCAobGluZW5vLCBsaW5lKQorICAgICAgICAgICAgbGluZW5vLCBsaW5lID0gbGluZW5vKzEsIGYubmV4dCgpCisgICAgICAgICAgICBtbyA9IHJlLm1hdGNoKHInXHMrKCIoPzpcXFxkXGRcZCkqIil9LCQnLCBsaW5lKQorICAgICAgICAgICAgYXNzZXJ0IG1vLCAobGluZW5vLCBsaW5lKQorICAgICAgICAgICAgZmlyc3QgPSB7fQorICAgICAgICAgICAgcmF3Yml0c2V0ID0gZXZhbChtby5ncm91cCgxKSkKKyAgICAgICAgICAgIGZvciBpLCBjIGluIGVudW1lcmF0ZShyYXdiaXRzZXQpOgorICAgICAgICAgICAgICAgIGJ5dGUgPSBvcmQoYykKKyAgICAgICAgICAgICAgICBmb3IgaiBpbiByYW5nZSg4KToKKyAgICAgICAgICAgICAgICAgICAgaWYgYnl0ZSAmICgxPDxqKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0W2kqOCArIGpdID0gMQorICAgICAgICAgICAgZGZhc1tudW1iZXJdID0gKHN0YXRlLCBmaXJzdCkKKyAgICAgICAgbGluZW5vLCBsaW5lID0gbGluZW5vKzEsIGYubmV4dCgpCisgICAgICAgIGFzc2VydCBsaW5lID09ICJ9O1xuIiwgKGxpbmVubywgbGluZSkKKyAgICAgICAgc2VsZi5kZmFzID0gZGZhcworCisgICAgICAgICMgUGFyc2UgdGhlIGxhYmVscworICAgICAgICBsYWJlbHMgPSBbXQorICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgbW8gPSByZS5tYXRjaChyInN0YXRpYyBsYWJlbCBsYWJlbHNcWyhcZCspXF0gPSB7JCIsIGxpbmUpCisgICAgICAgIGFzc2VydCBtbywgKGxpbmVubywgbGluZSkKKyAgICAgICAgbmxhYmVscyA9IGludChtby5ncm91cCgxKSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobmxhYmVscyk6CisgICAgICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgICAgIG1vID0gcmUubWF0Y2gocidccyt7KFxkKyksICgwfCJcdysiKX0sJCcsIGxpbmUpCisgICAgICAgICAgICBhc3NlcnQgbW8sIChsaW5lbm8sIGxpbmUpCisgICAgICAgICAgICB4LCB5ID0gbW8uZ3JvdXBzKCkKKyAgICAgICAgICAgIHggPSBpbnQoeCkKKyAgICAgICAgICAgIGlmIHkgPT0gIjAiOgorICAgICAgICAgICAgICAgIHkgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHkgPSBldmFsKHkpCisgICAgICAgICAgICBsYWJlbHMuYXBwZW5kKCh4LCB5KSkKKyAgICAgICAgbGluZW5vLCBsaW5lID0gbGluZW5vKzEsIGYubmV4dCgpCisgICAgICAgIGFzc2VydCBsaW5lID09ICJ9O1xuIiwgKGxpbmVubywgbGluZSkKKyAgICAgICAgc2VsZi5sYWJlbHMgPSBsYWJlbHMKKworICAgICAgICAjIFBhcnNlIHRoZSBncmFtbWFyIHN0cnVjdAorICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IGxpbmUgPT0gImdyYW1tYXIgX1B5UGFyc2VyX0dyYW1tYXIgPSB7XG4iLCAobGluZW5vLCBsaW5lKQorICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgbW8gPSByZS5tYXRjaChyIlxzKyhcZCspLCQiLCBsaW5lKQorICAgICAgICBhc3NlcnQgbW8sIChsaW5lbm8sIGxpbmUpCisgICAgICAgIG5kZmFzID0gaW50KG1vLmdyb3VwKDEpKQorICAgICAgICBhc3NlcnQgbmRmYXMgPT0gbGVuKHNlbGYuZGZhcykKKyAgICAgICAgbGluZW5vLCBsaW5lID0gbGluZW5vKzEsIGYubmV4dCgpCisgICAgICAgIGFzc2VydCBsaW5lID09ICJcdGRmYXMsXG4iLCAobGluZW5vLCBsaW5lKQorICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgbW8gPSByZS5tYXRjaChyIlxzK3soXGQrKSwgbGFiZWxzfSwkIiwgbGluZSkKKyAgICAgICAgYXNzZXJ0IG1vLCAobGluZW5vLCBsaW5lKQorICAgICAgICBubGFiZWxzID0gaW50KG1vLmdyb3VwKDEpKQorICAgICAgICBhc3NlcnQgbmxhYmVscyA9PSBsZW4oc2VsZi5sYWJlbHMpLCAobGluZW5vLCBsaW5lKQorICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgbW8gPSByZS5tYXRjaChyIlxzKyhcZCspJCIsIGxpbmUpCisgICAgICAgIGFzc2VydCBtbywgKGxpbmVubywgbGluZSkKKyAgICAgICAgc3RhcnQgPSBpbnQobW8uZ3JvdXAoMSkpCisgICAgICAgIGFzc2VydCBzdGFydCBpbiBzZWxmLm51bWJlcjJzeW1ib2wsIChsaW5lbm8sIGxpbmUpCisgICAgICAgIHNlbGYuc3RhcnQgPSBzdGFydAorICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IGxpbmUgPT0gIn07XG4iLCAobGluZW5vLCBsaW5lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnQgMCwgKGxpbmVubywgbGluZSkKKworICAgIGRlZiBmaW5pc2hfb2ZmKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgYWRkaXRpb25hbCB1c2VmdWwgc3RydWN0dXJlcy4gIChJbnRlcm5hbCkuIiIiCisgICAgICAgIHNlbGYua2V5d29yZHMgPSB7fSAjIG1hcCBmcm9tIGtleXdvcmQgc3RyaW5ncyB0byBhcmMgbGFiZWxzCisgICAgICAgIHNlbGYudG9rZW5zID0ge30gICAjIG1hcCBmcm9tIG51bWVyaWMgdG9rZW4gdmFsdWVzIHRvIGFyYyBsYWJlbHMKKyAgICAgICAgZm9yIGlsYWJlbCwgKHR5cGUsIHZhbHVlKSBpbiBlbnVtZXJhdGUoc2VsZi5sYWJlbHMpOgorICAgICAgICAgICAgaWYgdHlwZSA9PSB0b2tlbi5OQU1FIGFuZCB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmtleXdvcmRzW3ZhbHVlXSA9IGlsYWJlbAorICAgICAgICAgICAgZWxpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYudG9rZW5zW3R5cGVdID0gaWxhYmVsCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvY29udi5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvY29udi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM1NDE2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9jb252LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvY29udi5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvY29udi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljNDU1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9jb252LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZHJpdmVyLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2RyaXZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWRhZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2RyaXZlci5weQpAQCAtMCwwICsxLDE1NyBAQAorIyBDb3B5cmlnaHQgMjAwNC0yMDA1IEVsZW1lbnRhbCBTZWN1cml0eSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyMgTW9kaWZpY2F0aW9uczoKKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiUGFyc2VyIGRyaXZlci4KKworVGhpcyBwcm92aWRlcyBhIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlIHRvIHBhcnNlIGEgZmlsZSBpbnRvIGEgc3ludGF4IHRyZWUuCisKKyIiIgorCitfX2F1dGhvcl9fID0gIkd1aWRvIHZhbiBSb3NzdW0gPGd1aWRvQHB5dGhvbi5vcmc+IgorCitfX2FsbF9fID0gWyJEcml2ZXIiLCAibG9hZF9ncmFtbWFyIl0KKworIyBQeXRob24gaW1wb3J0cworaW1wb3J0IGNvZGVjcworaW1wb3J0IG9zCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgc3lzCisKKyMgUGdlbiBpbXBvcnRzCitmcm9tIC4gaW1wb3J0IGdyYW1tYXIsIHBhcnNlLCB0b2tlbiwgdG9rZW5pemUsIHBnZW4KKworCitjbGFzcyBEcml2ZXIob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncmFtbWFyLCBjb252ZXJ0PU5vbmUsIGxvZ2dlcj1Ob25lKToKKyAgICAgICAgc2VsZi5ncmFtbWFyID0gZ3JhbW1hcgorICAgICAgICBpZiBsb2dnZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkKKyAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnZXIKKyAgICAgICAgc2VsZi5jb252ZXJ0ID0gY29udmVydAorCisgICAgZGVmIHBhcnNlX3Rva2VucyhzZWxmLCB0b2tlbnMsIGRlYnVnPUZhbHNlKToKKyAgICAgICAgIiIiUGFyc2UgYSBzZXJpZXMgb2YgdG9rZW5zIGFuZCByZXR1cm4gdGhlIHN5bnRheCB0cmVlLiIiIgorICAgICAgICAjIFhYWCBNb3ZlIHRoZSBwcmVmaXggY29tcHV0YXRpb24gaW50byBhIHdyYXBwZXIgYXJvdW5kIHRva2VuaXplLgorICAgICAgICBwID0gcGFyc2UuUGFyc2VyKHNlbGYuZ3JhbW1hciwgc2VsZi5jb252ZXJ0KQorICAgICAgICBwLnNldHVwKCkKKyAgICAgICAgbGluZW5vID0gMQorICAgICAgICBjb2x1bW4gPSAwCisgICAgICAgIHR5cGUgPSB2YWx1ZSA9IHN0YXJ0ID0gZW5kID0gbGluZV90ZXh0ID0gTm9uZQorICAgICAgICBwcmVmaXggPSB1IiIKKyAgICAgICAgZm9yIHF1aW50dXBsZSBpbiB0b2tlbnM6CisgICAgICAgICAgICB0eXBlLCB2YWx1ZSwgc3RhcnQsIGVuZCwgbGluZV90ZXh0ID0gcXVpbnR1cGxlCisgICAgICAgICAgICBpZiBzdGFydCAhPSAobGluZW5vLCBjb2x1bW4pOgorICAgICAgICAgICAgICAgIGFzc2VydCAobGluZW5vLCBjb2x1bW4pIDw9IHN0YXJ0LCAoKGxpbmVubywgY29sdW1uKSwgc3RhcnQpCisgICAgICAgICAgICAgICAgc19saW5lbm8sIHNfY29sdW1uID0gc3RhcnQKKyAgICAgICAgICAgICAgICBpZiBsaW5lbm8gPCBzX2xpbmVubzoKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ICs9ICJcbiIgKiAoc19saW5lbm8gLSBsaW5lbm8pCisgICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IHNfbGluZW5vCisgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IDAKKyAgICAgICAgICAgICAgICBpZiBjb2x1bW4gPCBzX2NvbHVtbjoKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ICs9IGxpbmVfdGV4dFtjb2x1bW46c19jb2x1bW5dCisgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IHNfY29sdW1uCisgICAgICAgICAgICBpZiB0eXBlIGluICh0b2tlbml6ZS5DT01NRU5ULCB0b2tlbml6ZS5OTCk6CisgICAgICAgICAgICAgICAgcHJlZml4ICs9IHZhbHVlCisgICAgICAgICAgICAgICAgbGluZW5vLCBjb2x1bW4gPSBlbmQKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZS5lbmRzd2l0aCgiXG4iKToKKyAgICAgICAgICAgICAgICAgICAgbGluZW5vICs9IDEKKyAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiB0eXBlID09IHRva2VuLk9QOgorICAgICAgICAgICAgICAgIHR5cGUgPSBncmFtbWFyLm9wbWFwW3ZhbHVlXQorICAgICAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoIiVzICVyIChwcmVmaXg9JXIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi50b2tfbmFtZVt0eXBlXSwgdmFsdWUsIHByZWZpeCkKKyAgICAgICAgICAgIGlmIHAuYWRkdG9rZW4odHlwZSwgdmFsdWUsIChwcmVmaXgsIHN0YXJ0KSk6CisgICAgICAgICAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKCJTdG9wLiIpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHByZWZpeCA9ICIiCisgICAgICAgICAgICBsaW5lbm8sIGNvbHVtbiA9IGVuZAorICAgICAgICAgICAgaWYgdmFsdWUuZW5kc3dpdGgoIlxuIik6CisgICAgICAgICAgICAgICAgbGluZW5vICs9IDEKKyAgICAgICAgICAgICAgICBjb2x1bW4gPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlIG5ldmVyIGJyb2tlIG91dCAtLSBFT0YgaXMgdG9vIHNvb24gKGhvdyBjYW4gdGhpcyBoYXBwZW4/Pz8pCisgICAgICAgICAgICByYWlzZSBwYXJzZS5QYXJzZUVycm9yKCJpbmNvbXBsZXRlIGlucHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgdmFsdWUsIChwcmVmaXgsIHN0YXJ0KSkKKyAgICAgICAgcmV0dXJuIHAucm9vdG5vZGUKKworICAgIGRlZiBwYXJzZV9zdHJlYW1fcmF3KHNlbGYsIHN0cmVhbSwgZGVidWc9RmFsc2UpOgorICAgICAgICAiIiJQYXJzZSBhIHN0cmVhbSBhbmQgcmV0dXJuIHRoZSBzeW50YXggdHJlZS4iIiIKKyAgICAgICAgdG9rZW5zID0gdG9rZW5pemUuZ2VuZXJhdGVfdG9rZW5zKHN0cmVhbS5yZWFkbGluZSkKKyAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfdG9rZW5zKHRva2VucywgZGVidWcpCisKKyAgICBkZWYgcGFyc2Vfc3RyZWFtKHNlbGYsIHN0cmVhbSwgZGVidWc9RmFsc2UpOgorICAgICAgICAiIiJQYXJzZSBhIHN0cmVhbSBhbmQgcmV0dXJuIHRoZSBzeW50YXggdHJlZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucGFyc2Vfc3RyZWFtX3JhdyhzdHJlYW0sIGRlYnVnKQorCisgICAgZGVmIHBhcnNlX2ZpbGUoc2VsZiwgZmlsZW5hbWUsIGVuY29kaW5nPU5vbmUsIGRlYnVnPUZhbHNlKToKKyAgICAgICAgIiIiUGFyc2UgYSBmaWxlIGFuZCByZXR1cm4gdGhlIHN5bnRheCB0cmVlLiIiIgorICAgICAgICBzdHJlYW0gPSBjb2RlY3Mub3BlbihmaWxlbmFtZSwgInIiLCBlbmNvZGluZykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2Vfc3RyZWFtKHN0cmVhbSwgZGVidWcpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQorCisgICAgZGVmIHBhcnNlX3N0cmluZyhzZWxmLCB0ZXh0LCBkZWJ1Zz1GYWxzZSk6CisgICAgICAgICIiIlBhcnNlIGEgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHN5bnRheCB0cmVlLiIiIgorICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoU3RyaW5nSU8uU3RyaW5nSU8odGV4dCkucmVhZGxpbmUpCisgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX3Rva2Vucyh0b2tlbnMsIGRlYnVnKQorCisKK2RlZiBsb2FkX2dyYW1tYXIoZ3Q9IkdyYW1tYXIudHh0IiwgZ3A9Tm9uZSwKKyAgICAgICAgICAgICAgICAgc2F2ZT1UcnVlLCBmb3JjZT1GYWxzZSwgbG9nZ2VyPU5vbmUpOgorICAgICIiIkxvYWQgdGhlIGdyYW1tYXIgKG1heWJlIGZyb20gYSBwaWNrbGUpLiIiIgorICAgIGlmIGxvZ2dlciBpcyBOb25lOgorICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigpCisgICAgaWYgZ3AgaXMgTm9uZToKKyAgICAgICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXRleHQoZ3QpCisgICAgICAgIGlmIHRhaWwgPT0gIi50eHQiOgorICAgICAgICAgICAgdGFpbCA9ICIiCisgICAgICAgIGdwID0gaGVhZCArIHRhaWwgKyAiLiIuam9pbihtYXAoc3RyLCBzeXMudmVyc2lvbl9pbmZvKSkgKyAiLnBpY2tsZSIKKyAgICBpZiBmb3JjZSBvciBub3QgX25ld2VyKGdwLCBndCk6CisgICAgICAgIGxvZ2dlci5pbmZvKCJHZW5lcmF0aW5nIGdyYW1tYXIgdGFibGVzIGZyb20gJXMiLCBndCkKKyAgICAgICAgZyA9IHBnZW4uZ2VuZXJhdGVfZ3JhbW1hcihndCkKKyAgICAgICAgaWYgc2F2ZToKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJXcml0aW5nIGdyYW1tYXIgdGFibGVzIHRvICVzIiwgZ3ApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZy5kdW1wKGdwKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oIldyaXRpbmcgZmFpbGVkOiIrc3RyKGUpKQorICAgIGVsc2U6CisgICAgICAgIGcgPSBncmFtbWFyLkdyYW1tYXIoKQorICAgICAgICBnLmxvYWQoZ3ApCisgICAgcmV0dXJuIGcKKworCitkZWYgX25ld2VyKGEsIGIpOgorICAgICIiIklucXVpcmUgd2hldGhlciBmaWxlIGEgd2FzIHdyaXR0ZW4gc2luY2UgZmlsZSBiLiIiIgorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhhKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGIpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBvcy5wYXRoLmdldG10aW1lKGEpID49IG9zLnBhdGguZ2V0bXRpbWUoYikKKworCitkZWYgbWFpbigqYXJncyk6CisgICAgIiIiTWFpbiBwcm9ncmFtLCB3aGVuIHJ1biBhcyBhIHNjcmlwdDogcHJvZHVjZSBncmFtbWFyIHBpY2tsZSBmaWxlcy4KKworICAgIENhbGxzIGxvYWRfZ3JhbW1hciBmb3IgZWFjaCBhcmd1bWVudCwgYSBwYXRoIHRvIGEgZ3JhbW1hciB0ZXh0IGZpbGUuCisgICAgIiIiCisgICAgaWYgbm90IGFyZ3M6CisgICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKyAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGxldmVsPWxvZ2dpbmcuSU5GTywgc3RyZWFtPXN5cy5zdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9JyUobWVzc2FnZSlzJykKKyAgICBmb3IgZ3QgaW4gYXJnczoKKyAgICAgICAgbG9hZF9ncmFtbWFyKGd0LCBzYXZlPVRydWUsIGZvcmNlPVRydWUpCisgICAgcmV0dXJuIFRydWUKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBzeXMuZXhpdChpbnQobm90IG1haW4oKSkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZHJpdmVyLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9kcml2ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZTA2MjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZHJpdmVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZHJpdmVyLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9kcml2ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTVmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZHJpdmVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZ3JhbW1hci5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9ncmFtbWFyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTVjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZ3JhbW1hci5weQpAQCAtMCwwICsxLDE4NCBAQAorIyBDb3B5cmlnaHQgMjAwNC0yMDA1IEVsZW1lbnRhbCBTZWN1cml0eSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIlRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGRhdGEgc3RydWN0dXJlcyB1c2VkIHRvIHJlcHJlc2VudCBhIGdyYW1tYXIuCisKK1RoZXNlIGFyZSBhIGJpdCBhcmNhbmUgYmVjYXVzZSB0aGV5IGFyZSBkZXJpdmVkIGZyb20gdGhlIGRhdGEKK3N0cnVjdHVyZXMgdXNlZCBieSBQeXRob24ncyAncGdlbicgcGFyc2VyIGdlbmVyYXRvci4KKworVGhlcmUncyBhbHNvIGEgdGFibGUgaGVyZSBtYXBwaW5nIG9wZXJhdG9ycyB0byB0aGVpciBuYW1lcyBpbiB0aGUKK3Rva2VuIG1vZHVsZTsgdGhlIFB5dGhvbiB0b2tlbml6ZSBtb2R1bGUgcmVwb3J0cyBhbGwgb3BlcmF0b3JzIGFzIHRoZQorZmFsbGJhY2sgdG9rZW4gY29kZSBPUCwgYnV0IHRoZSBwYXJzZXIgbmVlZHMgdGhlIGFjdHVhbCB0b2tlbiBjb2RlLgorCisiIiIKKworIyBQeXRob24gaW1wb3J0cworaW1wb3J0IHBpY2tsZQorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLiBpbXBvcnQgdG9rZW4sIHRva2VuaXplCisKKworY2xhc3MgR3JhbW1hcihvYmplY3QpOgorICAgICIiIlBnZW4gcGFyc2luZyB0YWJsZXMgY29udmVyc2lvbiBjbGFzcy4KKworICAgIE9uY2UgaW5pdGlhbGl6ZWQsIHRoaXMgY2xhc3Mgc3VwcGxpZXMgdGhlIGdyYW1tYXIgdGFibGVzIGZvciB0aGUKKyAgICBwYXJzaW5nIGVuZ2luZSBpbXBsZW1lbnRlZCBieSBwYXJzZS5weS4gIFRoZSBwYXJzaW5nIGVuZ2luZQorICAgIGFjY2Vzc2VzIHRoZSBpbnN0YW5jZSB2YXJpYWJsZXMgZGlyZWN0bHkuICBUaGUgY2xhc3MgaGVyZSBkb2VzIG5vdAorICAgIHByb3ZpZGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHRhYmxlczsgc2V2ZXJhbCBzdWJjbGFzc2VzIGV4aXN0IHRvCisgICAgZG8gdGhpcyAoc2VlIHRoZSBjb252IGFuZCBwZ2VuIG1vZHVsZXMpLgorCisgICAgVGhlIGxvYWQoKSBtZXRob2QgcmVhZHMgdGhlIHRhYmxlcyBmcm9tIGEgcGlja2xlIGZpbGUsIHdoaWNoIGlzCisgICAgbXVjaCBmYXN0ZXIgdGhhbiB0aGUgb3RoZXIgd2F5cyBvZmZlcmVkIGJ5IHN1YmNsYXNzZXMuICBUaGUgcGlja2xlCisgICAgZmlsZSBpcyB3cml0dGVuIGJ5IGNhbGxpbmcgZHVtcCgpIChhZnRlciBsb2FkaW5nIHRoZSBncmFtbWFyCisgICAgdGFibGVzIHVzaW5nIGEgc3ViY2xhc3MpLiAgVGhlIHJlcG9ydCgpIG1ldGhvZCBwcmludHMgYSByZWFkYWJsZQorICAgIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0YWJsZXMgdG8gc3Rkb3V0LCBmb3IgZGVidWdnaW5nLgorCisgICAgVGhlIGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYXMgZm9sbG93czoKKworICAgIHN5bWJvbDJudW1iZXIgLS0gYSBkaWN0IG1hcHBpbmcgc3ltYm9sIG5hbWVzIHRvIG51bWJlcnMuICBTeW1ib2wKKyAgICAgICAgICAgICAgICAgICAgIG51bWJlcnMgYXJlIGFsd2F5cyAyNTYgb3IgaGlnaGVyLCB0byBkaXN0aW5ndWlzaAorICAgICAgICAgICAgICAgICAgICAgdGhlbSBmcm9tIHRva2VuIG51bWJlcnMsIHdoaWNoIGFyZSBiZXR3ZWVuIDAgYW5kCisgICAgICAgICAgICAgICAgICAgICAyNTUgKGluY2x1c2l2ZSkuCisKKyAgICBudW1iZXIyc3ltYm9sIC0tIGEgZGljdCBtYXBwaW5nIG51bWJlcnMgdG8gc3ltYm9sIG5hbWVzOworICAgICAgICAgICAgICAgICAgICAgdGhlc2UgdHdvIGFyZSBlYWNoIG90aGVyJ3MgaW52ZXJzZS4KKworICAgIHN0YXRlcyAgICAgICAgLS0gYSBsaXN0IG9mIERGQXMsIHdoZXJlIGVhY2ggREZBIGlzIGEgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgICAgc3RhdGVzLCBlYWNoIHN0YXRlIGlzIGEgbGlzdCBvZiBhcmNzLCBhbmQgZWFjaAorICAgICAgICAgICAgICAgICAgICAgYXJjIGlzIGEgKGksIGopIHBhaXIgd2hlcmUgaSBpcyBhIGxhYmVsIGFuZCBqIGlzCisgICAgICAgICAgICAgICAgICAgICBhIHN0YXRlIG51bWJlci4gIFRoZSBERkEgbnVtYmVyIGlzIHRoZSBpbmRleCBpbnRvCisgICAgICAgICAgICAgICAgICAgICB0aGlzIGxpc3QuICAoVGhpcyBuYW1lIGlzIHNsaWdodGx5IGNvbmZ1c2luZy4pCisgICAgICAgICAgICAgICAgICAgICBGaW5hbCBzdGF0ZXMgYXJlIHJlcHJlc2VudGVkIGJ5IGEgc3BlY2lhbCBhcmMgb2YKKyAgICAgICAgICAgICAgICAgICAgIHRoZSBmb3JtICgwLCBqKSB3aGVyZSBqIGlzIGl0cyBvd24gc3RhdGUgbnVtYmVyLgorCisgICAgZGZhcyAgICAgICAgICAtLSBhIGRpY3QgbWFwcGluZyBzeW1ib2wgbnVtYmVycyB0byAoREZBLCBmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgIHBhaXJzLCB3aGVyZSBERkEgaXMgYW4gaXRlbSBmcm9tIHRoZSBzdGF0ZXMgbGlzdAorICAgICAgICAgICAgICAgICAgICAgYWJvdmUsIGFuZCBmaXJzdCBpcyBhIHNldCBvZiB0b2tlbnMgdGhhdCBjYW4KKyAgICAgICAgICAgICAgICAgICAgIGJlZ2luIHRoaXMgZ3JhbW1hciBydWxlIChyZXByZXNlbnRlZCBieSBhIGRpY3QKKyAgICAgICAgICAgICAgICAgICAgIHdob3NlIHZhbHVlcyBhcmUgYWx3YXlzIDEpLgorCisgICAgbGFiZWxzICAgICAgICAtLSBhIGxpc3Qgb2YgKHgsIHkpIHBhaXJzIHdoZXJlIHggaXMgZWl0aGVyIGEgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvciBhIHN5bWJvbCBudW1iZXIsIGFuZCB5IGlzIGVpdGhlciBOb25lCisgICAgICAgICAgICAgICAgICAgICBvciBhIHN0cmluZzsgdGhlIHN0cmluZ3MgYXJlIGtleXdvcmRzLiAgVGhlIGxhYmVsCisgICAgICAgICAgICAgICAgICAgICBudW1iZXIgaXMgdGhlIGluZGV4IGluIHRoaXMgbGlzdDsgbGFiZWwgbnVtYmVycworICAgICAgICAgICAgICAgICAgICAgYXJlIHVzZWQgdG8gbWFyayBzdGF0ZSB0cmFuc2l0aW9ucyAoYXJjcykgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICBERkFzLgorCisgICAgc3RhcnQgICAgICAgICAtLSB0aGUgbnVtYmVyIG9mIHRoZSBncmFtbWFyJ3Mgc3RhcnQgc3ltYm9sLgorCisgICAga2V5d29yZHMgICAgICAtLSBhIGRpY3QgbWFwcGluZyBrZXl3b3JkIHN0cmluZ3MgdG8gYXJjIGxhYmVscy4KKworICAgIHRva2VucyAgICAgICAgLS0gYSBkaWN0IG1hcHBpbmcgdG9rZW4gbnVtYmVycyB0byBhcmMgbGFiZWxzLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc3ltYm9sMm51bWJlciA9IHt9CisgICAgICAgIHNlbGYubnVtYmVyMnN5bWJvbCA9IHt9CisgICAgICAgIHNlbGYuc3RhdGVzID0gW10KKyAgICAgICAgc2VsZi5kZmFzID0ge30KKyAgICAgICAgc2VsZi5sYWJlbHMgPSBbKDAsICJFTVBUWSIpXQorICAgICAgICBzZWxmLmtleXdvcmRzID0ge30KKyAgICAgICAgc2VsZi50b2tlbnMgPSB7fQorICAgICAgICBzZWxmLnN5bWJvbDJsYWJlbCA9IHt9CisgICAgICAgIHNlbGYuc3RhcnQgPSAyNTYKKworICAgIGRlZiBkdW1wKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiRHVtcCB0aGUgZ3JhbW1hciB0YWJsZXMgdG8gYSBwaWNrbGUgZmlsZS4iIiIKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3YiIpCisgICAgICAgIHBpY2tsZS5kdW1wKHNlbGYuX19kaWN0X18sIGYsIDIpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIGxvYWQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiIiJMb2FkIHRoZSBncmFtbWFyIHRhYmxlcyBmcm9tIGEgcGlja2xlIGZpbGUuIiIiCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAicmIiKQorICAgICAgICBkID0gcGlja2xlLmxvYWQoZikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGQpCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIENvcHkgdGhlIGdyYW1tYXIuCisgICAgICAgICIiIgorICAgICAgICBuZXcgPSBzZWxmLl9fY2xhc3NfXygpCisgICAgICAgIGZvciBkaWN0X2F0dHIgaW4gKCJzeW1ib2wybnVtYmVyIiwgIm51bWJlcjJzeW1ib2wiLCAiZGZhcyIsICJrZXl3b3JkcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b2tlbnMiLCAic3ltYm9sMmxhYmVsIik6CisgICAgICAgICAgICBzZXRhdHRyKG5ldywgZGljdF9hdHRyLCBnZXRhdHRyKHNlbGYsIGRpY3RfYXR0cikuY29weSgpKQorICAgICAgICBuZXcubGFiZWxzID0gc2VsZi5sYWJlbHNbOl0KKyAgICAgICAgbmV3LnN0YXRlcyA9IHNlbGYuc3RhdGVzWzpdCisgICAgICAgIG5ldy5zdGFydCA9IHNlbGYuc3RhcnQKKyAgICAgICAgcmV0dXJuIG5ldworCisgICAgZGVmIHJlcG9ydChzZWxmKToKKyAgICAgICAgIiIiRHVtcCB0aGUgZ3JhbW1hciB0YWJsZXMgdG8gc3RhbmRhcmQgb3V0cHV0LCBmb3IgZGVidWdnaW5nLiIiIgorICAgICAgICBmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CisgICAgICAgIHByaW50ICJzMm4iCisgICAgICAgIHBwcmludChzZWxmLnN5bWJvbDJudW1iZXIpCisgICAgICAgIHByaW50ICJuMnMiCisgICAgICAgIHBwcmludChzZWxmLm51bWJlcjJzeW1ib2wpCisgICAgICAgIHByaW50ICJzdGF0ZXMiCisgICAgICAgIHBwcmludChzZWxmLnN0YXRlcykKKyAgICAgICAgcHJpbnQgImRmYXMiCisgICAgICAgIHBwcmludChzZWxmLmRmYXMpCisgICAgICAgIHByaW50ICJsYWJlbHMiCisgICAgICAgIHBwcmludChzZWxmLmxhYmVscykKKyAgICAgICAgcHJpbnQgInN0YXJ0Iiwgc2VsZi5zdGFydAorCisKKyMgTWFwIGZyb20gb3BlcmF0b3IgdG8gbnVtYmVyIChzaW5jZSB0b2tlbml6ZSBkb2Vzbid0IGRvIHRoaXMpCisKK29wbWFwX3JhdyA9ICIiIgorKCBMUEFSCispIFJQQVIKK1sgTFNRQgorXSBSU1FCCis6IENPTE9OCissIENPTU1BCis7IFNFTUkKKysgUExVUworLSBNSU5VUworKiBTVEFSCisvIFNMQVNICit8IFZCQVIKKyYgQU1QRVIKKzwgTEVTUworPiBHUkVBVEVSCis9IEVRVUFMCisuIERPVAorJSBQRVJDRU5UCitgIEJBQ0tRVU9URQoreyBMQlJBQ0UKK30gUkJSQUNFCitAIEFUCis9PSBFUUVRVUFMCishPSBOT1RFUVVBTAorPD4gTk9URVFVQUwKKzw9IExFU1NFUVVBTAorPj0gR1JFQVRFUkVRVUFMCit+IFRJTERFCiteIENJUkNVTUZMRVgKKzw8IExFRlRTSElGVAorPj4gUklHSFRTSElGVAorKiogRE9VQkxFU1RBUgorKz0gUExVU0VRVUFMCistPSBNSU5FUVVBTAorKj0gU1RBUkVRVUFMCisvPSBTTEFTSEVRVUFMCislPSBQRVJDRU5URVFVQUwKKyY9IEFNUEVSRVFVQUwKK3w9IFZCQVJFUVVBTAorXj0gQ0lSQ1VNRkxFWEVRVUFMCis8PD0gTEVGVFNISUZURVFVQUwKKz4+PSBSSUdIVFNISUZURVFVQUwKKyoqPSBET1VCTEVTVEFSRVFVQUwKKy8vIERPVUJMRVNMQVNICisvLz0gRE9VQkxFU0xBU0hFUVVBTAorLT4gUkFSUk9XCisiIiIKKworb3BtYXAgPSB7fQorZm9yIGxpbmUgaW4gb3BtYXBfcmF3LnNwbGl0bGluZXMoKToKKyAgICBpZiBsaW5lOgorICAgICAgICBvcCwgbmFtZSA9IGxpbmUuc3BsaXQoKQorICAgICAgICBvcG1hcFtvcF0gPSBnZXRhdHRyKHRva2VuLCBuYW1lKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2dyYW1tYXIucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2dyYW1tYXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOWEwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZ3JhbW1hci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2dyYW1tYXIucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2dyYW1tYXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOWEwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZ3JhbW1hci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2xpdGVyYWxzLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2xpdGVyYWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzk0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvbGl0ZXJhbHMucHkKQEAgLTAsMCArMSw2MCBAQAorIyBDb3B5cmlnaHQgMjAwNC0yMDA1IEVsZW1lbnRhbCBTZWN1cml0eSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIlNhZmVseSBldmFsdWF0ZSBQeXRob24gc3RyaW5nIGxpdGVyYWxzIHdpdGhvdXQgdXNpbmcgZXZhbCgpLiIiIgorCitpbXBvcnQgcmUKKworc2ltcGxlX2VzY2FwZXMgPSB7ImEiOiAiXGEiLAorICAgICAgICAgICAgICAgICAgImIiOiAiXGIiLAorICAgICAgICAgICAgICAgICAgImYiOiAiXGYiLAorICAgICAgICAgICAgICAgICAgIm4iOiAiXG4iLAorICAgICAgICAgICAgICAgICAgInIiOiAiXHIiLAorICAgICAgICAgICAgICAgICAgInQiOiAiXHQiLAorICAgICAgICAgICAgICAgICAgInYiOiAiXHYiLAorICAgICAgICAgICAgICAgICAgIiciOiAiJyIsCisgICAgICAgICAgICAgICAgICAnIic6ICciJywKKyAgICAgICAgICAgICAgICAgICJcXCI6ICJcXCJ9CisKK2RlZiBlc2NhcGUobSk6CisgICAgYWxsLCB0YWlsID0gbS5ncm91cCgwLCAxKQorICAgIGFzc2VydCBhbGwuc3RhcnRzd2l0aCgiXFwiKQorICAgIGVzYyA9IHNpbXBsZV9lc2NhcGVzLmdldCh0YWlsKQorICAgIGlmIGVzYyBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIGVzYworICAgIGlmIHRhaWwuc3RhcnRzd2l0aCgieCIpOgorICAgICAgICBoZXhlcyA9IHRhaWxbMTpdCisgICAgICAgIGlmIGxlbihoZXhlcykgPCAyOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCBoZXggc3RyaW5nIGVzY2FwZSAoJ1xcJXMnKSIgJSB0YWlsKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpID0gaW50KGhleGVzLCAxNikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGhleCBzdHJpbmcgZXNjYXBlICgnXFwlcycpIiAlIHRhaWwpCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaSA9IGludCh0YWlsLCA4KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgb2N0YWwgc3RyaW5nIGVzY2FwZSAoJ1xcJXMnKSIgJSB0YWlsKQorICAgIHJldHVybiBjaHIoaSkKKworZGVmIGV2YWxTdHJpbmcocyk6CisgICAgYXNzZXJ0IHMuc3RhcnRzd2l0aCgiJyIpIG9yIHMuc3RhcnRzd2l0aCgnIicpLCByZXByKHNbOjFdKQorICAgIHEgPSBzWzBdCisgICAgaWYgc1s6M10gPT0gcSozOgorICAgICAgICBxID0gcSozCisgICAgYXNzZXJ0IHMuZW5kc3dpdGgocSksIHJlcHIoc1stbGVuKHEpOl0pCisgICAgYXNzZXJ0IGxlbihzKSA+PSAyKmxlbihxKQorICAgIHMgPSBzW2xlbihxKTotbGVuKHEpXQorICAgIHJldHVybiByZS5zdWIociJcXChcJ3xcInxcXHxbYWJmbnJ0dl18eC57MCwyfXxbMC03XXsxLDN9KSIsIGVzY2FwZSwgcykKKworZGVmIHRlc3QoKToKKyAgICBmb3IgaSBpbiByYW5nZSgyNTYpOgorICAgICAgICBjID0gY2hyKGkpCisgICAgICAgIHMgPSByZXByKGMpCisgICAgICAgIGUgPSBldmFsU3RyaW5nKHMpCisgICAgICAgIGlmIGUgIT0gYzoKKyAgICAgICAgICAgIHByaW50IGksIGMsIHMsIGUKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2xpdGVyYWxzLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9saXRlcmFscy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0MjBiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9saXRlcmFscy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2xpdGVyYWxzLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9saXRlcmFscy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyOTZjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9saXRlcmFscy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3BhcnNlLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3BhcnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZWJkYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGFyc2UucHkKQEAgLTAsMCArMSwyMDEgQEAKKyMgQ29weXJpZ2h0IDIwMDQtMjAwNSBFbGVtZW50YWwgU2VjdXJpdHksIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJQYXJzZXIgZW5naW5lIGZvciB0aGUgZ3JhbW1hciB0YWJsZXMgZ2VuZXJhdGVkIGJ5IHBnZW4uCisKK1RoZSBncmFtbWFyIHRhYmxlIG11c3QgYmUgbG9hZGVkIGZpcnN0LgorCitTZWUgUGFyc2VyL3BhcnNlci5jIGluIHRoZSBQeXRob24gZGlzdHJpYnV0aW9uIGZvciBhZGRpdGlvbmFsIGluZm8gb24KK2hvdyB0aGlzIHBhcnNpbmcgZW5naW5lIHdvcmtzLgorCisiIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4gaW1wb3J0IHRva2VuCisKK2NsYXNzIFBhcnNlRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gdG8gc2lnbmFsIHRoZSBwYXJzZXIgaXMgc3R1Y2suIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbXNnLCB0eXBlLCB2YWx1ZSwgY29udGV4dCk6CisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCAiJXM6IHR5cGU9JXIsIHZhbHVlPSVyLCBjb250ZXh0PSVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobXNnLCB0eXBlLCB2YWx1ZSwgY29udGV4dCkpCisgICAgICAgIHNlbGYubXNnID0gbXNnCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYuY29udGV4dCA9IGNvbnRleHQKKworY2xhc3MgUGFyc2VyKG9iamVjdCk6CisgICAgIiIiUGFyc2VyIGVuZ2luZS4KKworICAgIFRoZSBwcm9wZXIgdXNhZ2Ugc2VxdWVuY2UgaXM6CisKKyAgICBwID0gUGFyc2VyKGdyYW1tYXIsIFtjb252ZXJ0ZXJdKSAgIyBjcmVhdGUgaW5zdGFuY2UKKyAgICBwLnNldHVwKFtzdGFydF0pICAgICAgICAgICAgICAgICAgIyBwcmVwYXJlIGZvciBwYXJzaW5nCisgICAgPGZvciBlYWNoIGlucHV0IHRva2VuPjoKKyAgICAgICAgaWYgcC5hZGR0b2tlbiguLi4pOiAgICAgICAgICAgIyBwYXJzZSBhIHRva2VuOyBtYXkgcmFpc2UgUGFyc2VFcnJvcgorICAgICAgICAgICAgYnJlYWsKKyAgICByb290ID0gcC5yb290bm9kZSAgICAgICAgICAgICAgICAgIyByb290IG9mIGFic3RyYWN0IHN5bnRheCB0cmVlCisKKyAgICBBIFBhcnNlciBpbnN0YW5jZSBtYXkgYmUgcmV1c2VkIGJ5IGNhbGxpbmcgc2V0dXAoKSByZXBlYXRlZGx5LgorCisgICAgQSBQYXJzZXIgaW5zdGFuY2UgY29udGFpbnMgc3RhdGUgcGVydGFpbmluZyB0byB0aGUgY3VycmVudCB0b2tlbgorICAgIHNlcXVlbmNlLCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGNvbmN1cnJlbnRseSBieSBkaWZmZXJlbnQgdGhyZWFkcworICAgIHRvIHBhcnNlIHNlcGFyYXRlIHRva2VuIHNlcXVlbmNlcy4KKworICAgIFNlZSBkcml2ZXIucHkgZm9yIGhvdyB0byBnZXQgaW5wdXQgdG9rZW5zIGJ5IHRva2VuaXppbmcgYSBmaWxlIG9yCisgICAgc3RyaW5nLgorCisgICAgUGFyc2luZyBpcyBjb21wbGV0ZSB3aGVuIGFkZHRva2VuKCkgcmV0dXJucyBUcnVlOyB0aGUgcm9vdCBvZiB0aGUKKyAgICBhYnN0cmFjdCBzeW50YXggdHJlZSBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcm9vdG5vZGUKKyAgICBpbnN0YW5jZSB2YXJpYWJsZS4gIFdoZW4gYSBzeW50YXggZXJyb3Igb2NjdXJzLCBhZGR0b2tlbigpIHJhaXNlcworICAgIHRoZSBQYXJzZUVycm9yIGV4Y2VwdGlvbi4gIFRoZXJlIGlzIG5vIGVycm9yIHJlY292ZXJ5OyB0aGUgcGFyc2VyCisgICAgY2Fubm90IGJlIHVzZWQgYWZ0ZXIgYSBzeW50YXggZXJyb3Igd2FzIHJlcG9ydGVkIChidXQgaXQgY2FuIGJlCisgICAgcmVpbml0aWFsaXplZCBieSBjYWxsaW5nIHNldHVwKCkpLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZ3JhbW1hciwgY29udmVydD1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuCisKKyAgICAgICAgVGhlIGdyYW1tYXIgYXJndW1lbnQgaXMgYSBncmFtbWFyLkdyYW1tYXIgaW5zdGFuY2U7IHNlZSB0aGUKKyAgICAgICAgZ3JhbW1hciBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgICAgICAgVGhlIHBhcnNlciBpcyBub3QgcmVhZHkgeWV0IGZvciBwYXJzaW5nOyB5b3UgbXVzdCBjYWxsIHRoZQorICAgICAgICBzZXR1cCgpIG1ldGhvZCB0byBnZXQgaXQgc3RhcnRlZC4KKworICAgICAgICBUaGUgb3B0aW9uYWwgY29udmVydCBhcmd1bWVudCBpcyBhIGZ1bmN0aW9uIG1hcHBpbmcgY29uY3JldGUKKyAgICAgICAgc3ludGF4IHRyZWUgbm9kZXMgdG8gYWJzdHJhY3Qgc3ludGF4IHRyZWUgbm9kZXMuICBJZiBub3QKKyAgICAgICAgZ2l2ZW4sIG5vIGNvbnZlcnNpb24gaXMgZG9uZSBhbmQgdGhlIHN5bnRheCB0cmVlIHByb2R1Y2VkIGlzCisgICAgICAgIHRoZSBjb25jcmV0ZSBzeW50YXggdHJlZS4gIElmIGdpdmVuLCBpdCBtdXN0IGJlIGEgZnVuY3Rpb24gb2YKKyAgICAgICAgdHdvIGFyZ3VtZW50cywgdGhlIGZpcnN0IGJlaW5nIHRoZSBncmFtbWFyIChhIGdyYW1tYXIuR3JhbW1hcgorICAgICAgICBpbnN0YW5jZSksIGFuZCB0aGUgc2Vjb25kIGJlaW5nIHRoZSBjb25jcmV0ZSBzeW50YXggdHJlZSBub2RlCisgICAgICAgIHRvIGJlIGNvbnZlcnRlZC4gIFRoZSBzeW50YXggdHJlZSBpcyBjb252ZXJ0ZWQgZnJvbSB0aGUgYm90dG9tCisgICAgICAgIHVwLgorCisgICAgICAgIEEgY29uY3JldGUgc3ludGF4IHRyZWUgbm9kZSBpcyBhICh0eXBlLCB2YWx1ZSwgY29udGV4dCwgbm9kZXMpCisgICAgICAgIHR1cGxlLCB3aGVyZSB0eXBlIGlzIHRoZSBub2RlIHR5cGUgKGEgdG9rZW4gb3Igc3ltYm9sIG51bWJlciksCisgICAgICAgIHZhbHVlIGlzIE5vbmUgZm9yIHN5bWJvbHMgYW5kIGEgc3RyaW5nIGZvciB0b2tlbnMsIGNvbnRleHQgaXMKKyAgICAgICAgTm9uZSBvciBhbiBvcGFxdWUgdmFsdWUgdXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nICh0eXBpY2FsbHkgYQorICAgICAgICAobGluZW5vLCBvZmZzZXQpIHBhaXIpLCBhbmQgbm9kZXMgaXMgYSBsaXN0IG9mIGNoaWxkcmVuIGZvcgorICAgICAgICBzeW1ib2xzLCBhbmQgTm9uZSBmb3IgdG9rZW5zLgorCisgICAgICAgIEFuIGFic3RyYWN0IHN5bnRheCB0cmVlIG5vZGUgbWF5IGJlIGFueXRoaW5nOyB0aGlzIGlzIGVudGlyZWx5CisgICAgICAgIHVwIHRvIHRoZSBjb252ZXJ0ZXIgZnVuY3Rpb24uCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZ3JhbW1hciA9IGdyYW1tYXIKKyAgICAgICAgc2VsZi5jb252ZXJ0ID0gY29udmVydCBvciAobGFtYmRhIGdyYW1tYXIsIG5vZGU6IG5vZGUpCisKKyAgICBkZWYgc2V0dXAoc2VsZiwgc3RhcnQ9Tm9uZSk6CisgICAgICAgICIiIlByZXBhcmUgZm9yIHBhcnNpbmcuCisKKyAgICAgICAgVGhpcyAqbXVzdCogYmUgY2FsbGVkIGJlZm9yZSBzdGFydGluZyB0byBwYXJzZS4KKworICAgICAgICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgaXMgYW4gYWx0ZXJuYXRpdmUgc3RhcnQgc3ltYm9sOyBpdAorICAgICAgICBkZWZhdWx0cyB0byB0aGUgZ3JhbW1hcidzIHN0YXJ0IHN5bWJvbC4KKworICAgICAgICBZb3UgY2FuIHVzZSBhIFBhcnNlciBpbnN0YW5jZSB0byBwYXJzZSBhbnkgbnVtYmVyIG9mIHByb2dyYW1zOworICAgICAgICBlYWNoIHRpbWUgeW91IGNhbGwgc2V0dXAoKSB0aGUgcGFyc2VyIGlzIHJlc2V0IHRvIGFuIGluaXRpYWwKKyAgICAgICAgc3RhdGUgZGV0ZXJtaW5lZCBieSB0aGUgKGltcGxpY2l0IG9yIGV4cGxpY2l0KSBzdGFydCBzeW1ib2wuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHN0YXJ0IGlzIE5vbmU6CisgICAgICAgICAgICBzdGFydCA9IHNlbGYuZ3JhbW1hci5zdGFydAorICAgICAgICAjIEVhY2ggc3RhY2sgZW50cnkgaXMgYSB0dXBsZTogKGRmYSwgc3RhdGUsIG5vZGUpLgorICAgICAgICAjIEEgbm9kZSBpcyBhIHR1cGxlOiAodHlwZSwgdmFsdWUsIGNvbnRleHQsIGNoaWxkcmVuKSwKKyAgICAgICAgIyB3aGVyZSBjaGlsZHJlbiBpcyBhIGxpc3Qgb2Ygbm9kZXMgb3IgTm9uZSwgYW5kIGNvbnRleHQgbWF5IGJlIE5vbmUuCisgICAgICAgIG5ld25vZGUgPSAoc3RhcnQsIE5vbmUsIE5vbmUsIFtdKQorICAgICAgICBzdGFja2VudHJ5ID0gKHNlbGYuZ3JhbW1hci5kZmFzW3N0YXJ0XSwgMCwgbmV3bm9kZSkKKyAgICAgICAgc2VsZi5zdGFjayA9IFtzdGFja2VudHJ5XQorICAgICAgICBzZWxmLnJvb3Rub2RlID0gTm9uZQorICAgICAgICBzZWxmLnVzZWRfbmFtZXMgPSBzZXQoKSAjIEFsaWFzZWQgdG8gc2VsZi5yb290bm9kZS51c2VkX25hbWVzIGluIHBvcCgpCisKKyAgICBkZWYgYWRkdG9rZW4oc2VsZiwgdHlwZSwgdmFsdWUsIGNvbnRleHQpOgorICAgICAgICAiIiJBZGQgYSB0b2tlbjsgcmV0dXJuIFRydWUgaWZmIHRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgcHJvZ3JhbS4iIiIKKyAgICAgICAgIyBNYXAgZnJvbSB0b2tlbiB0byBsYWJlbAorICAgICAgICBpbGFiZWwgPSBzZWxmLmNsYXNzaWZ5KHR5cGUsIHZhbHVlLCBjb250ZXh0KQorICAgICAgICAjIExvb3AgdW50aWwgdGhlIHRva2VuIGlzIHNoaWZ0ZWQ7IG1heSByYWlzZSBleGNlcHRpb25zCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBkZmEsIHN0YXRlLCBub2RlID0gc2VsZi5zdGFja1stMV0KKyAgICAgICAgICAgIHN0YXRlcywgZmlyc3QgPSBkZmEKKyAgICAgICAgICAgIGFyY3MgPSBzdGF0ZXNbc3RhdGVdCisgICAgICAgICAgICAjIExvb2sgZm9yIGEgc3RhdGUgd2l0aCB0aGlzIGxhYmVsCisgICAgICAgICAgICBmb3IgaSwgbmV3c3RhdGUgaW4gYXJjczoKKyAgICAgICAgICAgICAgICB0LCB2ID0gc2VsZi5ncmFtbWFyLmxhYmVsc1tpXQorICAgICAgICAgICAgICAgIGlmIGlsYWJlbCA9PSBpOgorICAgICAgICAgICAgICAgICAgICAjIExvb2sgaXQgdXAgaW4gdGhlIGxpc3Qgb2YgbGFiZWxzCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCB0IDwgMjU2CisgICAgICAgICAgICAgICAgICAgICMgU2hpZnQgYSB0b2tlbjsgd2UncmUgZG9uZSB3aXRoIGl0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2hpZnQodHlwZSwgdmFsdWUsIG5ld3N0YXRlLCBjb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAjIFBvcCB3aGlsZSB3ZSBhcmUgaW4gYW4gYWNjZXB0LW9ubHkgc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBuZXdzdGF0ZQorICAgICAgICAgICAgICAgICAgICB3aGlsZSBzdGF0ZXNbc3RhdGVdID09IFsoMCwgc3RhdGUpXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnN0YWNrOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRG9uZSBwYXJzaW5nIQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBkZmEsIHN0YXRlLCBub2RlID0gc2VsZi5zdGFja1stMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlcywgZmlyc3QgPSBkZmEKKyAgICAgICAgICAgICAgICAgICAgIyBEb25lIHdpdGggdGhpcyB0b2tlbgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgICAgICBlbGlmIHQgPj0gMjU2OgorICAgICAgICAgICAgICAgICAgICAjIFNlZSBpZiBpdCdzIGEgc3ltYm9sIGFuZCBpZiB3ZSdyZSBpbiBpdHMgZmlyc3Qgc2V0CisgICAgICAgICAgICAgICAgICAgIGl0c2RmYSA9IHNlbGYuZ3JhbW1hci5kZmFzW3RdCisgICAgICAgICAgICAgICAgICAgIGl0c3N0YXRlcywgaXRzZmlyc3QgPSBpdHNkZmEKKyAgICAgICAgICAgICAgICAgICAgaWYgaWxhYmVsIGluIGl0c2ZpcnN0OgorICAgICAgICAgICAgICAgICAgICAgICAgIyBQdXNoIGEgc3ltYm9sCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB1c2godCwgc2VsZi5ncmFtbWFyLmRmYXNbdF0sIG5ld3N0YXRlLCBjb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgIyBUbyBjb250aW51ZSB0aGUgb3V0ZXIgd2hpbGUgbG9vcAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiAoMCwgc3RhdGUpIGluIGFyY3M6CisgICAgICAgICAgICAgICAgICAgICMgQW4gYWNjZXB0aW5nIHN0YXRlLCBwb3AgaXQgYW5kIHRyeSBzb21ldGhpbmcgZWxzZQorICAgICAgICAgICAgICAgICAgICBzZWxmLnBvcCgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnN0YWNrOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBEb25lIHBhcnNpbmcsIGJ1dCBhbm90aGVyIHRva2VuIGlzIGlucHV0CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKCJ0b28gbXVjaCBpbnB1dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHZhbHVlLCBjb250ZXh0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgTm8gc3VjY2VzcyBmaW5kaW5nIGEgdHJhbnNpdGlvbgorICAgICAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKCJiYWQgaW5wdXQiLCB0eXBlLCB2YWx1ZSwgY29udGV4dCkKKworICAgIGRlZiBjbGFzc2lmeShzZWxmLCB0eXBlLCB2YWx1ZSwgY29udGV4dCk6CisgICAgICAgICIiIlR1cm4gYSB0b2tlbiBpbnRvIGEgbGFiZWwuICAoSW50ZXJuYWwpIiIiCisgICAgICAgIGlmIHR5cGUgPT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgICMgS2VlcCBhIGxpc3Rpbmcgb2YgYWxsIHVzZWQgbmFtZXMKKyAgICAgICAgICAgIHNlbGYudXNlZF9uYW1lcy5hZGQodmFsdWUpCisgICAgICAgICAgICAjIENoZWNrIGZvciByZXNlcnZlZCB3b3JkcworICAgICAgICAgICAgaWxhYmVsID0gc2VsZi5ncmFtbWFyLmtleXdvcmRzLmdldCh2YWx1ZSkKKyAgICAgICAgICAgIGlmIGlsYWJlbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gaWxhYmVsCisgICAgICAgIGlsYWJlbCA9IHNlbGYuZ3JhbW1hci50b2tlbnMuZ2V0KHR5cGUpCisgICAgICAgIGlmIGlsYWJlbCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgUGFyc2VFcnJvcigiYmFkIHRva2VuIiwgdHlwZSwgdmFsdWUsIGNvbnRleHQpCisgICAgICAgIHJldHVybiBpbGFiZWwKKworICAgIGRlZiBzaGlmdChzZWxmLCB0eXBlLCB2YWx1ZSwgbmV3c3RhdGUsIGNvbnRleHQpOgorICAgICAgICAiIiJTaGlmdCBhIHRva2VuLiAgKEludGVybmFsKSIiIgorICAgICAgICBkZmEsIHN0YXRlLCBub2RlID0gc2VsZi5zdGFja1stMV0KKyAgICAgICAgbmV3bm9kZSA9ICh0eXBlLCB2YWx1ZSwgY29udGV4dCwgTm9uZSkKKyAgICAgICAgbmV3bm9kZSA9IHNlbGYuY29udmVydChzZWxmLmdyYW1tYXIsIG5ld25vZGUpCisgICAgICAgIGlmIG5ld25vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlWy0xXS5hcHBlbmQobmV3bm9kZSkKKyAgICAgICAgc2VsZi5zdGFja1stMV0gPSAoZGZhLCBuZXdzdGF0ZSwgbm9kZSkKKworICAgIGRlZiBwdXNoKHNlbGYsIHR5cGUsIG5ld2RmYSwgbmV3c3RhdGUsIGNvbnRleHQpOgorICAgICAgICAiIiJQdXNoIGEgbm9udGVybWluYWwuICAoSW50ZXJuYWwpIiIiCisgICAgICAgIGRmYSwgc3RhdGUsIG5vZGUgPSBzZWxmLnN0YWNrWy0xXQorICAgICAgICBuZXdub2RlID0gKHR5cGUsIE5vbmUsIGNvbnRleHQsIFtdKQorICAgICAgICBzZWxmLnN0YWNrWy0xXSA9IChkZmEsIG5ld3N0YXRlLCBub2RlKQorICAgICAgICBzZWxmLnN0YWNrLmFwcGVuZCgobmV3ZGZhLCAwLCBuZXdub2RlKSkKKworICAgIGRlZiBwb3Aoc2VsZik6CisgICAgICAgICIiIlBvcCBhIG5vbnRlcm1pbmFsLiAgKEludGVybmFsKSIiIgorICAgICAgICBwb3BkZmEsIHBvcHN0YXRlLCBwb3Bub2RlID0gc2VsZi5zdGFjay5wb3AoKQorICAgICAgICBuZXdub2RlID0gc2VsZi5jb252ZXJ0KHNlbGYuZ3JhbW1hciwgcG9wbm9kZSkKKyAgICAgICAgaWYgbmV3bm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuc3RhY2s6CisgICAgICAgICAgICAgICAgZGZhLCBzdGF0ZSwgbm9kZSA9IHNlbGYuc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgbm9kZVstMV0uYXBwZW5kKG5ld25vZGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucm9vdG5vZGUgPSBuZXdub2RlCisgICAgICAgICAgICAgICAgc2VsZi5yb290bm9kZS51c2VkX25hbWVzID0gc2VsZi51c2VkX25hbWVzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGFyc2UucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3BhcnNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODQ5MzE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3BhcnNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGFyc2UucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3BhcnNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTgzYjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3BhcnNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGdlbi5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9wZ2VuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMDg0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGdlbi5weQpAQCAtMCwwICsxLDM4NiBAQAorIyBDb3B5cmlnaHQgMjAwNC0yMDA1IEVsZW1lbnRhbCBTZWN1cml0eSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyMgUGdlbiBpbXBvcnRzCitmcm9tIC4gaW1wb3J0IGdyYW1tYXIsIHRva2VuLCB0b2tlbml6ZQorCitjbGFzcyBQZ2VuR3JhbW1hcihncmFtbWFyLkdyYW1tYXIpOgorICAgIHBhc3MKKworY2xhc3MgUGFyc2VyR2VuZXJhdG9yKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIHN0cmVhbT1Ob25lKToKKyAgICAgICAgY2xvc2Vfc3RyZWFtID0gTm9uZQorICAgICAgICBpZiBzdHJlYW0gaXMgTm9uZToKKyAgICAgICAgICAgIHN0cmVhbSA9IG9wZW4oZmlsZW5hbWUpCisgICAgICAgICAgICBjbG9zZV9zdHJlYW0gPSBzdHJlYW0uY2xvc2UKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCisgICAgICAgIHNlbGYuZ2VuZXJhdG9yID0gdG9rZW5pemUuZ2VuZXJhdGVfdG9rZW5zKHN0cmVhbS5yZWFkbGluZSkKKyAgICAgICAgc2VsZi5nZXR0b2tlbigpICMgSW5pdGlhbGl6ZSBsb29rYWhlYWQKKyAgICAgICAgc2VsZi5kZmFzLCBzZWxmLnN0YXJ0c3ltYm9sID0gc2VsZi5wYXJzZSgpCisgICAgICAgIGlmIGNsb3NlX3N0cmVhbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNsb3NlX3N0cmVhbSgpCisgICAgICAgIHNlbGYuZmlyc3QgPSB7fSAjIG1hcCBmcm9tIHN5bWJvbCBuYW1lIHRvIHNldCBvZiB0b2tlbnMKKyAgICAgICAgc2VsZi5hZGRmaXJzdHNldHMoKQorCisgICAgZGVmIG1ha2VfZ3JhbW1hcihzZWxmKToKKyAgICAgICAgYyA9IFBnZW5HcmFtbWFyKCkKKyAgICAgICAgbmFtZXMgPSBzZWxmLmRmYXMua2V5cygpCisgICAgICAgIG5hbWVzLnNvcnQoKQorICAgICAgICBuYW1lcy5yZW1vdmUoc2VsZi5zdGFydHN5bWJvbCkKKyAgICAgICAgbmFtZXMuaW5zZXJ0KDAsIHNlbGYuc3RhcnRzeW1ib2wpCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgaSA9IDI1NiArIGxlbihjLnN5bWJvbDJudW1iZXIpCisgICAgICAgICAgICBjLnN5bWJvbDJudW1iZXJbbmFtZV0gPSBpCisgICAgICAgICAgICBjLm51bWJlcjJzeW1ib2xbaV0gPSBuYW1lCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgZGZhID0gc2VsZi5kZmFzW25hbWVdCisgICAgICAgICAgICBzdGF0ZXMgPSBbXQorICAgICAgICAgICAgZm9yIHN0YXRlIGluIGRmYToKKyAgICAgICAgICAgICAgICBhcmNzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgbGFiZWwsIG5leHQgaW4gc3RhdGUuYXJjcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgYXJjcy5hcHBlbmQoKHNlbGYubWFrZV9sYWJlbChjLCBsYWJlbCksIGRmYS5pbmRleChuZXh0KSkpCisgICAgICAgICAgICAgICAgaWYgc3RhdGUuaXNmaW5hbDoKKyAgICAgICAgICAgICAgICAgICAgYXJjcy5hcHBlbmQoKDAsIGRmYS5pbmRleChzdGF0ZSkpKQorICAgICAgICAgICAgICAgIHN0YXRlcy5hcHBlbmQoYXJjcykKKyAgICAgICAgICAgIGMuc3RhdGVzLmFwcGVuZChzdGF0ZXMpCisgICAgICAgICAgICBjLmRmYXNbYy5zeW1ib2wybnVtYmVyW25hbWVdXSA9IChzdGF0ZXMsIHNlbGYubWFrZV9maXJzdChjLCBuYW1lKSkKKyAgICAgICAgYy5zdGFydCA9IGMuc3ltYm9sMm51bWJlcltzZWxmLnN0YXJ0c3ltYm9sXQorICAgICAgICByZXR1cm4gYworCisgICAgZGVmIG1ha2VfZmlyc3Qoc2VsZiwgYywgbmFtZSk6CisgICAgICAgIHJhd2ZpcnN0ID0gc2VsZi5maXJzdFtuYW1lXQorICAgICAgICBmaXJzdCA9IHt9CisgICAgICAgIGZvciBsYWJlbCBpbiByYXdmaXJzdDoKKyAgICAgICAgICAgIGlsYWJlbCA9IHNlbGYubWFrZV9sYWJlbChjLCBsYWJlbCkKKyAgICAgICAgICAgICMjYXNzZXJ0IGlsYWJlbCBub3QgaW4gZmlyc3QgIyBYWFggZmFpbGVkIG9uIDw+IC4uLiAhPQorICAgICAgICAgICAgZmlyc3RbaWxhYmVsXSA9IDEKKyAgICAgICAgcmV0dXJuIGZpcnN0CisKKyAgICBkZWYgbWFrZV9sYWJlbChzZWxmLCBjLCBsYWJlbCk6CisgICAgICAgICMgWFhYIE1heWJlIHRoaXMgc2hvdWxkIGJlIGEgbWV0aG9kIG9uIGEgc3ViY2xhc3Mgb2YgY29udmVydGVyPworICAgICAgICBpbGFiZWwgPSBsZW4oYy5sYWJlbHMpCisgICAgICAgIGlmIGxhYmVsWzBdLmlzYWxwaGEoKToKKyAgICAgICAgICAgICMgRWl0aGVyIGEgc3ltYm9sIG5hbWUgb3IgYSBuYW1lZCB0b2tlbgorICAgICAgICAgICAgaWYgbGFiZWwgaW4gYy5zeW1ib2wybnVtYmVyOgorICAgICAgICAgICAgICAgICMgQSBzeW1ib2wgbmFtZSAoYSBub24tdGVybWluYWwpCisgICAgICAgICAgICAgICAgaWYgbGFiZWwgaW4gYy5zeW1ib2wybGFiZWw6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnN5bWJvbDJsYWJlbFtsYWJlbF0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjLmxhYmVscy5hcHBlbmQoKGMuc3ltYm9sMm51bWJlcltsYWJlbF0sIE5vbmUpKQorICAgICAgICAgICAgICAgICAgICBjLnN5bWJvbDJsYWJlbFtsYWJlbF0gPSBpbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlsYWJlbAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEEgbmFtZWQgdG9rZW4gKE5BTUUsIE5VTUJFUiwgU1RSSU5HKQorICAgICAgICAgICAgICAgIGl0b2tlbiA9IGdldGF0dHIodG9rZW4sIGxhYmVsLCBOb25lKQorICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGl0b2tlbiwgaW50KSwgbGFiZWwKKyAgICAgICAgICAgICAgICBhc3NlcnQgaXRva2VuIGluIHRva2VuLnRva19uYW1lLCBsYWJlbAorICAgICAgICAgICAgICAgIGlmIGl0b2tlbiBpbiBjLnRva2VuczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMudG9rZW5zW2l0b2tlbl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjLmxhYmVscy5hcHBlbmQoKGl0b2tlbiwgTm9uZSkpCisgICAgICAgICAgICAgICAgICAgIGMudG9rZW5zW2l0b2tlbl0gPSBpbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlsYWJlbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBFaXRoZXIgYSBrZXl3b3JkIG9yIGFuIG9wZXJhdG9yCisgICAgICAgICAgICBhc3NlcnQgbGFiZWxbMF0gaW4gKCciJywgIiciKSwgbGFiZWwKKyAgICAgICAgICAgIHZhbHVlID0gZXZhbChsYWJlbCkKKyAgICAgICAgICAgIGlmIHZhbHVlWzBdLmlzYWxwaGEoKToKKyAgICAgICAgICAgICAgICAjIEEga2V5d29yZAorICAgICAgICAgICAgICAgIGlmIHZhbHVlIGluIGMua2V5d29yZHM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmtleXdvcmRzW3ZhbHVlXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGMubGFiZWxzLmFwcGVuZCgodG9rZW4uTkFNRSwgdmFsdWUpKQorICAgICAgICAgICAgICAgICAgICBjLmtleXdvcmRzW3ZhbHVlXSA9IGlsYWJlbAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWxhYmVsCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQW4gb3BlcmF0b3IgKGFueSBub24tbnVtZXJpYyB0b2tlbikKKyAgICAgICAgICAgICAgICBpdG9rZW4gPSBncmFtbWFyLm9wbWFwW3ZhbHVlXSAjIEZhaWxzIGlmIHVua25vd24gdG9rZW4KKyAgICAgICAgICAgICAgICBpZiBpdG9rZW4gaW4gYy50b2tlbnM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjLnRva2Vuc1tpdG9rZW5dCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYy5sYWJlbHMuYXBwZW5kKChpdG9rZW4sIE5vbmUpKQorICAgICAgICAgICAgICAgICAgICBjLnRva2Vuc1tpdG9rZW5dID0gaWxhYmVsCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbGFiZWwKKworICAgIGRlZiBhZGRmaXJzdHNldHMoc2VsZik6CisgICAgICAgIG5hbWVzID0gc2VsZi5kZmFzLmtleXMoKQorICAgICAgICBuYW1lcy5zb3J0KCkKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLmZpcnN0OgorICAgICAgICAgICAgICAgIHNlbGYuY2FsY2ZpcnN0KG5hbWUpCisgICAgICAgICAgICAjcHJpbnQgbmFtZSwgc2VsZi5maXJzdFtuYW1lXS5rZXlzKCkKKworICAgIGRlZiBjYWxjZmlyc3Qoc2VsZiwgbmFtZSk6CisgICAgICAgIGRmYSA9IHNlbGYuZGZhc1tuYW1lXQorICAgICAgICBzZWxmLmZpcnN0W25hbWVdID0gTm9uZSAjIGR1bW15IHRvIGRldGVjdCBsZWZ0IHJlY3Vyc2lvbgorICAgICAgICBzdGF0ZSA9IGRmYVswXQorICAgICAgICB0b3RhbHNldCA9IHt9CisgICAgICAgIG92ZXJsYXBjaGVjayA9IHt9CisgICAgICAgIGZvciBsYWJlbCwgbmV4dCBpbiBzdGF0ZS5hcmNzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYgbGFiZWwgaW4gc2VsZi5kZmFzOgorICAgICAgICAgICAgICAgIGlmIGxhYmVsIGluIHNlbGYuZmlyc3Q6CisgICAgICAgICAgICAgICAgICAgIGZzZXQgPSBzZWxmLmZpcnN0W2xhYmVsXQorICAgICAgICAgICAgICAgICAgICBpZiBmc2V0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZWN1cnNpb24gZm9yIHJ1bGUgJXIiICUgbmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNhbGNmaXJzdChsYWJlbCkKKyAgICAgICAgICAgICAgICAgICAgZnNldCA9IHNlbGYuZmlyc3RbbGFiZWxdCisgICAgICAgICAgICAgICAgdG90YWxzZXQudXBkYXRlKGZzZXQpCisgICAgICAgICAgICAgICAgb3ZlcmxhcGNoZWNrW2xhYmVsXSA9IGZzZXQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdG90YWxzZXRbbGFiZWxdID0gMQorICAgICAgICAgICAgICAgIG92ZXJsYXBjaGVja1tsYWJlbF0gPSB7bGFiZWw6IDF9CisgICAgICAgIGludmVyc2UgPSB7fQorICAgICAgICBmb3IgbGFiZWwsIGl0c2ZpcnN0IGluIG92ZXJsYXBjaGVjay5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGZvciBzeW1ib2wgaW4gaXRzZmlyc3Q6CisgICAgICAgICAgICAgICAgaWYgc3ltYm9sIGluIGludmVyc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInJ1bGUgJXMgaXMgYW1iaWd1b3VzOyAlcyBpcyBpbiB0aGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmaXJzdCBzZXRzIG9mICVzIGFzIHdlbGwgYXMgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgc3ltYm9sLCBsYWJlbCwgaW52ZXJzZVtzeW1ib2xdKSkKKyAgICAgICAgICAgICAgICBpbnZlcnNlW3N5bWJvbF0gPSBsYWJlbAorICAgICAgICBzZWxmLmZpcnN0W25hbWVdID0gdG90YWxzZXQKKworICAgIGRlZiBwYXJzZShzZWxmKToKKyAgICAgICAgZGZhcyA9IHt9CisgICAgICAgIHN0YXJ0c3ltYm9sID0gTm9uZQorICAgICAgICAjIE1TVEFSVDogKE5FV0xJTkUgfCBSVUxFKSogRU5ETUFSS0VSCisgICAgICAgIHdoaWxlIHNlbGYudHlwZSAhPSB0b2tlbi5FTkRNQVJLRVI6CisgICAgICAgICAgICB3aGlsZSBzZWxmLnR5cGUgPT0gdG9rZW4uTkVXTElORToKKyAgICAgICAgICAgICAgICBzZWxmLmdldHRva2VuKCkKKyAgICAgICAgICAgICMgUlVMRTogTkFNRSAnOicgUkhTIE5FV0xJTkUKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLmV4cGVjdCh0b2tlbi5OQU1FKQorICAgICAgICAgICAgc2VsZi5leHBlY3QodG9rZW4uT1AsICI6IikKKyAgICAgICAgICAgIGEsIHogPSBzZWxmLnBhcnNlX3JocygpCisgICAgICAgICAgICBzZWxmLmV4cGVjdCh0b2tlbi5ORVdMSU5FKQorICAgICAgICAgICAgI3NlbGYuZHVtcF9uZmEobmFtZSwgYSwgeikKKyAgICAgICAgICAgIGRmYSA9IHNlbGYubWFrZV9kZmEoYSwgeikKKyAgICAgICAgICAgICNzZWxmLmR1bXBfZGZhKG5hbWUsIGRmYSkKKyAgICAgICAgICAgIG9sZGxlbiA9IGxlbihkZmEpCisgICAgICAgICAgICBzZWxmLnNpbXBsaWZ5X2RmYShkZmEpCisgICAgICAgICAgICBuZXdsZW4gPSBsZW4oZGZhKQorICAgICAgICAgICAgZGZhc1tuYW1lXSA9IGRmYQorICAgICAgICAgICAgI3ByaW50IG5hbWUsIG9sZGxlbiwgbmV3bGVuCisgICAgICAgICAgICBpZiBzdGFydHN5bWJvbCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHN0YXJ0c3ltYm9sID0gbmFtZQorICAgICAgICByZXR1cm4gZGZhcywgc3RhcnRzeW1ib2wKKworICAgIGRlZiBtYWtlX2RmYShzZWxmLCBzdGFydCwgZmluaXNoKToKKyAgICAgICAgIyBUbyB0dXJuIGFuIE5GQSBpbnRvIGEgREZBLCB3ZSBkZWZpbmUgdGhlIHN0YXRlcyBvZiB0aGUgREZBCisgICAgICAgICMgdG8gY29ycmVzcG9uZCB0byAqc2V0cyogb2Ygc3RhdGVzIG9mIHRoZSBORkEuICBUaGVuIGRvIHNvbWUKKyAgICAgICAgIyBzdGF0ZSByZWR1Y3Rpb24uICBMZXQncyByZXByZXNlbnQgc2V0cyBhcyBkaWN0cyB3aXRoIDEgZm9yCisgICAgICAgICMgdmFsdWVzLgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShzdGFydCwgTkZBU3RhdGUpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGZpbmlzaCwgTkZBU3RhdGUpCisgICAgICAgIGRlZiBjbG9zdXJlKHN0YXRlKToKKyAgICAgICAgICAgIGJhc2UgPSB7fQorICAgICAgICAgICAgYWRkY2xvc3VyZShzdGF0ZSwgYmFzZSkKKyAgICAgICAgICAgIHJldHVybiBiYXNlCisgICAgICAgIGRlZiBhZGRjbG9zdXJlKHN0YXRlLCBiYXNlKToKKyAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHN0YXRlLCBORkFTdGF0ZSkKKyAgICAgICAgICAgIGlmIHN0YXRlIGluIGJhc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBiYXNlW3N0YXRlXSA9IDEKKyAgICAgICAgICAgIGZvciBsYWJlbCwgbmV4dCBpbiBzdGF0ZS5hcmNzOgorICAgICAgICAgICAgICAgIGlmIGxhYmVsIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGFkZGNsb3N1cmUobmV4dCwgYmFzZSkKKyAgICAgICAgc3RhdGVzID0gW0RGQVN0YXRlKGNsb3N1cmUoc3RhcnQpLCBmaW5pc2gpXQorICAgICAgICBmb3Igc3RhdGUgaW4gc3RhdGVzOiAjIE5CIHN0YXRlcyBncm93cyB3aGlsZSB3ZSdyZSBpdGVyYXRpbmcKKyAgICAgICAgICAgIGFyY3MgPSB7fQorICAgICAgICAgICAgZm9yIG5mYXN0YXRlIGluIHN0YXRlLm5mYXNldDoKKyAgICAgICAgICAgICAgICBmb3IgbGFiZWwsIG5leHQgaW4gbmZhc3RhdGUuYXJjczoKKyAgICAgICAgICAgICAgICAgICAgaWYgbGFiZWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRjbG9zdXJlKG5leHQsIGFyY3Muc2V0ZGVmYXVsdChsYWJlbCwge30pKQorICAgICAgICAgICAgZm9yIGxhYmVsLCBuZmFzZXQgaW4gYXJjcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBmb3Igc3QgaW4gc3RhdGVzOgorICAgICAgICAgICAgICAgICAgICBpZiBzdC5uZmFzZXQgPT0gbmZhc2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzdCA9IERGQVN0YXRlKG5mYXNldCwgZmluaXNoKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZXMuYXBwZW5kKHN0KQorICAgICAgICAgICAgICAgIHN0YXRlLmFkZGFyYyhzdCwgbGFiZWwpCisgICAgICAgIHJldHVybiBzdGF0ZXMgIyBMaXN0IG9mIERGQVN0YXRlIGluc3RhbmNlczsgZmlyc3Qgb25lIGlzIHN0YXJ0CisKKyAgICBkZWYgZHVtcF9uZmEoc2VsZiwgbmFtZSwgc3RhcnQsIGZpbmlzaCk6CisgICAgICAgIHByaW50ICJEdW1wIG9mIE5GQSBmb3IiLCBuYW1lCisgICAgICAgIHRvZG8gPSBbc3RhcnRdCisgICAgICAgIGZvciBpLCBzdGF0ZSBpbiBlbnVtZXJhdGUodG9kbyk6CisgICAgICAgICAgICBwcmludCAiICBTdGF0ZSIsIGksIHN0YXRlIGlzIGZpbmlzaCBhbmQgIihmaW5hbCkiIG9yICIiCisgICAgICAgICAgICBmb3IgbGFiZWwsIG5leHQgaW4gc3RhdGUuYXJjczoKKyAgICAgICAgICAgICAgICBpZiBuZXh0IGluIHRvZG86CisgICAgICAgICAgICAgICAgICAgIGogPSB0b2RvLmluZGV4KG5leHQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaiA9IGxlbih0b2RvKQorICAgICAgICAgICAgICAgICAgICB0b2RvLmFwcGVuZChuZXh0KQorICAgICAgICAgICAgICAgIGlmIGxhYmVsIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIgICAgLT4gJWQiICUgagorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIgICAgJXMgLT4gJWQiICUgKGxhYmVsLCBqKQorCisgICAgZGVmIGR1bXBfZGZhKHNlbGYsIG5hbWUsIGRmYSk6CisgICAgICAgIHByaW50ICJEdW1wIG9mIERGQSBmb3IiLCBuYW1lCisgICAgICAgIGZvciBpLCBzdGF0ZSBpbiBlbnVtZXJhdGUoZGZhKToKKyAgICAgICAgICAgIHByaW50ICIgIFN0YXRlIiwgaSwgc3RhdGUuaXNmaW5hbCBhbmQgIihmaW5hbCkiIG9yICIiCisgICAgICAgICAgICBmb3IgbGFiZWwsIG5leHQgaW4gc3RhdGUuYXJjcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBwcmludCAiICAgICVzIC0+ICVkIiAlIChsYWJlbCwgZGZhLmluZGV4KG5leHQpKQorCisgICAgZGVmIHNpbXBsaWZ5X2RmYShzZWxmLCBkZmEpOgorICAgICAgICAjIFRoaXMgaXMgbm90IHRoZW9yZXRpY2FsbHkgb3B0aW1hbCwgYnV0IHdvcmtzIHdlbGwgZW5vdWdoLgorICAgICAgICAjIEFsZ29yaXRobTogcmVwZWF0ZWRseSBsb29rIGZvciB0d28gc3RhdGVzIHRoYXQgaGF2ZSB0aGUgc2FtZQorICAgICAgICAjIHNldCBvZiBhcmNzIChzYW1lIGxhYmVscyBwb2ludGluZyB0byB0aGUgc2FtZSBub2RlcykgYW5kCisgICAgICAgICMgdW5pZnkgdGhlbSwgdW50aWwgdGhpbmdzIHN0b3AgY2hhbmdpbmcuCisKKyAgICAgICAgIyBkZmEgaXMgYSBsaXN0IG9mIERGQVN0YXRlIGluc3RhbmNlcworICAgICAgICBjaGFuZ2VzID0gVHJ1ZQorICAgICAgICB3aGlsZSBjaGFuZ2VzOgorICAgICAgICAgICAgY2hhbmdlcyA9IEZhbHNlCisgICAgICAgICAgICBmb3IgaSwgc3RhdGVfaSBpbiBlbnVtZXJhdGUoZGZhKToKKyAgICAgICAgICAgICAgICBmb3IgaiBpbiByYW5nZShpKzEsIGxlbihkZmEpKToKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVfaiA9IGRmYVtqXQorICAgICAgICAgICAgICAgICAgICBpZiBzdGF0ZV9pID09IHN0YXRlX2o6CisgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbnQgIiAgdW5pZnkiLCBpLCBqCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgZGZhW2pdCisgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3RhdGUgaW4gZGZhOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnVuaWZ5c3RhdGUoc3RhdGVfaiwgc3RhdGVfaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIHBhcnNlX3JocyhzZWxmKToKKyAgICAgICAgIyBSSFM6IEFMVCAoJ3wnIEFMVCkqCisgICAgICAgIGEsIHogPSBzZWxmLnBhcnNlX2FsdCgpCisgICAgICAgIGlmIHNlbGYudmFsdWUgIT0gInwiOgorICAgICAgICAgICAgcmV0dXJuIGEsIHoKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFhID0gTkZBU3RhdGUoKQorICAgICAgICAgICAgenogPSBORkFTdGF0ZSgpCisgICAgICAgICAgICBhYS5hZGRhcmMoYSkKKyAgICAgICAgICAgIHouYWRkYXJjKHp6KQorICAgICAgICAgICAgd2hpbGUgc2VsZi52YWx1ZSA9PSAifCI6CisgICAgICAgICAgICAgICAgc2VsZi5nZXR0b2tlbigpCisgICAgICAgICAgICAgICAgYSwgeiA9IHNlbGYucGFyc2VfYWx0KCkKKyAgICAgICAgICAgICAgICBhYS5hZGRhcmMoYSkKKyAgICAgICAgICAgICAgICB6LmFkZGFyYyh6eikKKyAgICAgICAgICAgIHJldHVybiBhYSwgenoKKworICAgIGRlZiBwYXJzZV9hbHQoc2VsZik6CisgICAgICAgICMgQUxUOiBJVEVNKworICAgICAgICBhLCBiID0gc2VsZi5wYXJzZV9pdGVtKCkKKyAgICAgICAgd2hpbGUgKHNlbGYudmFsdWUgaW4gKCIoIiwgIlsiKSBvcgorICAgICAgICAgICAgICAgc2VsZi50eXBlIGluICh0b2tlbi5OQU1FLCB0b2tlbi5TVFJJTkcpKToKKyAgICAgICAgICAgIGMsIGQgPSBzZWxmLnBhcnNlX2l0ZW0oKQorICAgICAgICAgICAgYi5hZGRhcmMoYykKKyAgICAgICAgICAgIGIgPSBkCisgICAgICAgIHJldHVybiBhLCBiCisKKyAgICBkZWYgcGFyc2VfaXRlbShzZWxmKToKKyAgICAgICAgIyBJVEVNOiAnWycgUkhTICddJyB8IEFUT00gWycrJyB8ICcqJ10KKyAgICAgICAgaWYgc2VsZi52YWx1ZSA9PSAiWyI6CisgICAgICAgICAgICBzZWxmLmdldHRva2VuKCkKKyAgICAgICAgICAgIGEsIHogPSBzZWxmLnBhcnNlX3JocygpCisgICAgICAgICAgICBzZWxmLmV4cGVjdCh0b2tlbi5PUCwgIl0iKQorICAgICAgICAgICAgYS5hZGRhcmMoeikKKyAgICAgICAgICAgIHJldHVybiBhLCB6CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhLCB6ID0gc2VsZi5wYXJzZV9hdG9tKCkKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi52YWx1ZQorICAgICAgICAgICAgaWYgdmFsdWUgbm90IGluICgiKyIsICIqIik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGEsIHoKKyAgICAgICAgICAgIHNlbGYuZ2V0dG9rZW4oKQorICAgICAgICAgICAgei5hZGRhcmMoYSkKKyAgICAgICAgICAgIGlmIHZhbHVlID09ICIrIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gYSwgegorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gYSwgYQorCisgICAgZGVmIHBhcnNlX2F0b20oc2VsZik6CisgICAgICAgICMgQVRPTTogJygnIFJIUyAnKScgfCBOQU1FIHwgU1RSSU5HCisgICAgICAgIGlmIHNlbGYudmFsdWUgPT0gIigiOgorICAgICAgICAgICAgc2VsZi5nZXR0b2tlbigpCisgICAgICAgICAgICBhLCB6ID0gc2VsZi5wYXJzZV9yaHMoKQorICAgICAgICAgICAgc2VsZi5leHBlY3QodG9rZW4uT1AsICIpIikKKyAgICAgICAgICAgIHJldHVybiBhLCB6CisgICAgICAgIGVsaWYgc2VsZi50eXBlIGluICh0b2tlbi5OQU1FLCB0b2tlbi5TVFJJTkcpOgorICAgICAgICAgICAgYSA9IE5GQVN0YXRlKCkKKyAgICAgICAgICAgIHogPSBORkFTdGF0ZSgpCisgICAgICAgICAgICBhLmFkZGFyYyh6LCBzZWxmLnZhbHVlKQorICAgICAgICAgICAgc2VsZi5nZXR0b2tlbigpCisgICAgICAgICAgICByZXR1cm4gYSwgegorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yYWlzZV9lcnJvcigiZXhwZWN0ZWQgKC4uLikgb3IgTkFNRSBvciBTVFJJTkcsIGdvdCAlcy8lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZSwgc2VsZi52YWx1ZSkKKworICAgIGRlZiBleHBlY3Qoc2VsZiwgdHlwZSwgdmFsdWU9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYudHlwZSAhPSB0eXBlIG9yICh2YWx1ZSBpcyBub3QgTm9uZSBhbmQgc2VsZi52YWx1ZSAhPSB2YWx1ZSk6CisgICAgICAgICAgICBzZWxmLnJhaXNlX2Vycm9yKCJleHBlY3RlZCAlcy8lcywgZ290ICVzLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgdmFsdWUsIHNlbGYudHlwZSwgc2VsZi52YWx1ZSkKKyAgICAgICAgdmFsdWUgPSBzZWxmLnZhbHVlCisgICAgICAgIHNlbGYuZ2V0dG9rZW4oKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBnZXR0b2tlbihzZWxmKToKKyAgICAgICAgdHVwID0gc2VsZi5nZW5lcmF0b3IubmV4dCgpCisgICAgICAgIHdoaWxlIHR1cFswXSBpbiAodG9rZW5pemUuQ09NTUVOVCwgdG9rZW5pemUuTkwpOgorICAgICAgICAgICAgdHVwID0gc2VsZi5nZW5lcmF0b3IubmV4dCgpCisgICAgICAgIHNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi5iZWdpbiwgc2VsZi5lbmQsIHNlbGYubGluZSA9IHR1cAorICAgICAgICAjcHJpbnQgdG9rZW4udG9rX25hbWVbc2VsZi50eXBlXSwgcmVwcihzZWxmLnZhbHVlKQorCisgICAgZGVmIHJhaXNlX2Vycm9yKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1zZyA9IG1zZyAlIGFyZ3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBtc2cgPSAiICIuam9pbihbbXNnXSArIG1hcChzdHIsIGFyZ3MpKQorICAgICAgICByYWlzZSBTeW50YXhFcnJvcihtc2csIChzZWxmLmZpbGVuYW1lLCBzZWxmLmVuZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbmRbMV0sIHNlbGYubGluZSkpCisKK2NsYXNzIE5GQVN0YXRlKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYXJjcyA9IFtdICMgbGlzdCBvZiAobGFiZWwsIE5GQVN0YXRlKSBwYWlycworCisgICAgZGVmIGFkZGFyYyhzZWxmLCBuZXh0LCBsYWJlbD1Ob25lKToKKyAgICAgICAgYXNzZXJ0IGxhYmVsIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShsYWJlbCwgc3RyKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuZXh0LCBORkFTdGF0ZSkKKyAgICAgICAgc2VsZi5hcmNzLmFwcGVuZCgobGFiZWwsIG5leHQpKQorCitjbGFzcyBERkFTdGF0ZShvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5mYXNldCwgZmluYWwpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuZmFzZXQsIGRpY3QpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGl0ZXIobmZhc2V0KS5uZXh0KCksIE5GQVN0YXRlKQorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShmaW5hbCwgTkZBU3RhdGUpCisgICAgICAgIHNlbGYubmZhc2V0ID0gbmZhc2V0CisgICAgICAgIHNlbGYuaXNmaW5hbCA9IGZpbmFsIGluIG5mYXNldAorICAgICAgICBzZWxmLmFyY3MgPSB7fSAjIG1hcCBmcm9tIGxhYmVsIHRvIERGQVN0YXRlCisKKyAgICBkZWYgYWRkYXJjKHNlbGYsIG5leHQsIGxhYmVsKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobGFiZWwsIHN0cikKKyAgICAgICAgYXNzZXJ0IGxhYmVsIG5vdCBpbiBzZWxmLmFyY3MKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmV4dCwgREZBU3RhdGUpCisgICAgICAgIHNlbGYuYXJjc1tsYWJlbF0gPSBuZXh0CisKKyAgICBkZWYgdW5pZnlzdGF0ZShzZWxmLCBvbGQsIG5ldyk6CisgICAgICAgIGZvciBsYWJlbCwgbmV4dCBpbiBzZWxmLmFyY3MuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBpZiBuZXh0IGlzIG9sZDoKKyAgICAgICAgICAgICAgICBzZWxmLmFyY3NbbGFiZWxdID0gbmV3CisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIyBFcXVhbGl0eSB0ZXN0IC0tIGlnbm9yZSB0aGUgbmZhc2V0IGluc3RhbmNlIHZhcmlhYmxlCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG90aGVyLCBERkFTdGF0ZSkKKyAgICAgICAgaWYgc2VsZi5pc2ZpbmFsICE9IG90aGVyLmlzZmluYWw6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgIyBDYW4ndCBqdXN0IHJldHVybiBzZWxmLmFyY3MgPT0gb3RoZXIuYXJjcywgYmVjYXVzZSB0aGF0CisgICAgICAgICMgd291bGQgaW52b2tlIHRoaXMgbWV0aG9kIHJlY3Vyc2l2ZWx5LCB3aXRoIGN5Y2xlcy4uLgorICAgICAgICBpZiBsZW4oc2VsZi5hcmNzKSAhPSBsZW4ob3RoZXIuYXJjcyk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZm9yIGxhYmVsLCBuZXh0IGluIHNlbGYuYXJjcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5leHQgaXMgbm90IG90aGVyLmFyY3MuZ2V0KGxhYmVsKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIF9faGFzaF9fID0gTm9uZSAjIEZvciBQeTMgY29tcGF0aWJpbGl0eS4KKworZGVmIGdlbmVyYXRlX2dyYW1tYXIoZmlsZW5hbWU9IkdyYW1tYXIudHh0Iik6CisgICAgcCA9IFBhcnNlckdlbmVyYXRvcihmaWxlbmFtZSkKKyAgICByZXR1cm4gcC5tYWtlX2dyYW1tYXIoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3BnZW4ucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3BnZW4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2M2U1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGdlbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3BnZW4ucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3BnZW4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZWJkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGdlbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxNDY4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW4ucHkKQEAgLTAsMCArMSw4MiBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiJUb2tlbiBjb25zdGFudHMgKGZyb20gInRva2VuLmgiKS4iIiIKKworIyAgVGFrZW4gZnJvbSBQeXRob24gKHI1Mzc1NykgYW5kIG1vZGlmaWVkIHRvIGluY2x1ZGUgc29tZSB0b2tlbnMKKyMgICBvcmlnaW5hbGx5IG1vbmtleXBhdGNoZWQgaW4gYnkgcGdlbjIudG9rZW5pemUKKworIy0tc3RhcnQgY29uc3RhbnRzLS0KK0VORE1BUktFUiA9IDAKK05BTUUgPSAxCitOVU1CRVIgPSAyCitTVFJJTkcgPSAzCitORVdMSU5FID0gNAorSU5ERU5UID0gNQorREVERU5UID0gNgorTFBBUiA9IDcKK1JQQVIgPSA4CitMU1FCID0gOQorUlNRQiA9IDEwCitDT0xPTiA9IDExCitDT01NQSA9IDEyCitTRU1JID0gMTMKK1BMVVMgPSAxNAorTUlOVVMgPSAxNQorU1RBUiA9IDE2CitTTEFTSCA9IDE3CitWQkFSID0gMTgKK0FNUEVSID0gMTkKK0xFU1MgPSAyMAorR1JFQVRFUiA9IDIxCitFUVVBTCA9IDIyCitET1QgPSAyMworUEVSQ0VOVCA9IDI0CitCQUNLUVVPVEUgPSAyNQorTEJSQUNFID0gMjYKK1JCUkFDRSA9IDI3CitFUUVRVUFMID0gMjgKK05PVEVRVUFMID0gMjkKK0xFU1NFUVVBTCA9IDMwCitHUkVBVEVSRVFVQUwgPSAzMQorVElMREUgPSAzMgorQ0lSQ1VNRkxFWCA9IDMzCitMRUZUU0hJRlQgPSAzNAorUklHSFRTSElGVCA9IDM1CitET1VCTEVTVEFSID0gMzYKK1BMVVNFUVVBTCA9IDM3CitNSU5FUVVBTCA9IDM4CitTVEFSRVFVQUwgPSAzOQorU0xBU0hFUVVBTCA9IDQwCitQRVJDRU5URVFVQUwgPSA0MQorQU1QRVJFUVVBTCA9IDQyCitWQkFSRVFVQUwgPSA0MworQ0lSQ1VNRkxFWEVRVUFMID0gNDQKK0xFRlRTSElGVEVRVUFMID0gNDUKK1JJR0hUU0hJRlRFUVVBTCA9IDQ2CitET1VCTEVTVEFSRVFVQUwgPSA0NworRE9VQkxFU0xBU0ggPSA0OAorRE9VQkxFU0xBU0hFUVVBTCA9IDQ5CitBVCA9IDUwCitPUCA9IDUxCitDT01NRU5UID0gNTIKK05MID0gNTMKK1JBUlJPVyA9IDU0CitFUlJPUlRPS0VOID0gNTUKK05fVE9LRU5TID0gNTYKK05UX09GRlNFVCA9IDI1NgorIy0tZW5kIGNvbnN0YW50cy0tCisKK3Rva19uYW1lID0ge30KK2ZvciBfbmFtZSwgX3ZhbHVlIGluIGdsb2JhbHMoKS5pdGVtcygpOgorICAgIGlmIHR5cGUoX3ZhbHVlKSBpcyB0eXBlKDApOgorICAgICAgICB0b2tfbmFtZVtfdmFsdWVdID0gX25hbWUKKworCitkZWYgSVNURVJNSU5BTCh4KToKKyAgICByZXR1cm4geCA8IE5UX09GRlNFVAorCitkZWYgSVNOT05URVJNSU5BTCh4KToKKyAgICByZXR1cm4geCA+PSBOVF9PRkZTRVQKKworZGVmIElTRU9GKHgpOgorICAgIHJldHVybiB4ID09IEVORE1BUktFUgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi90b2tlbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyNTI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi90b2tlbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi90b2tlbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyNTI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi90b2tlbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuaXplLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuaXplLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOTBhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW5pemUucHkKQEAgLTAsMCArMSw1MDAgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisiIiJUb2tlbml6YXRpb24gaGVscCBmb3IgUHl0aG9uIHByb2dyYW1zLgorCitnZW5lcmF0ZV90b2tlbnMocmVhZGxpbmUpIGlzIGEgZ2VuZXJhdG9yIHRoYXQgYnJlYWtzIGEgc3RyZWFtIG9mCit0ZXh0IGludG8gUHl0aG9uIHRva2Vucy4gIEl0IGFjY2VwdHMgYSByZWFkbGluZS1saWtlIG1ldGhvZCB3aGljaCBpcyBjYWxsZWQKK3JlcGVhdGVkbHkgdG8gZ2V0IHRoZSBuZXh0IGxpbmUgb2YgaW5wdXQgKG9yICIiIGZvciBFT0YpLiAgSXQgZ2VuZXJhdGVzCis1LXR1cGxlcyB3aXRoIHRoZXNlIG1lbWJlcnM6CisKKyAgICB0aGUgdG9rZW4gdHlwZSAoc2VlIHRva2VuLnB5KQorICAgIHRoZSB0b2tlbiAoYSBzdHJpbmcpCisgICAgdGhlIHN0YXJ0aW5nIChyb3csIGNvbHVtbikgaW5kaWNlcyBvZiB0aGUgdG9rZW4gKGEgMi10dXBsZSBvZiBpbnRzKQorICAgIHRoZSBlbmRpbmcgKHJvdywgY29sdW1uKSBpbmRpY2VzIG9mIHRoZSB0b2tlbiAoYSAyLXR1cGxlIG9mIGludHMpCisgICAgdGhlIG9yaWdpbmFsIGxpbmUgKHN0cmluZykKKworSXQgaXMgZGVzaWduZWQgdG8gbWF0Y2ggdGhlIHdvcmtpbmcgb2YgdGhlIFB5dGhvbiB0b2tlbml6ZXIgZXhhY3RseSwgZXhjZXB0Cit0aGF0IGl0IHByb2R1Y2VzIENPTU1FTlQgdG9rZW5zIGZvciBjb21tZW50cyBhbmQgZ2l2ZXMgdHlwZSBPUCBmb3IgYWxsCitvcGVyYXRvcnMKKworT2xkZXIgZW50cnkgcG9pbnRzCisgICAgdG9rZW5pemVfbG9vcChyZWFkbGluZSwgdG9rZW5lYXRlcikKKyAgICB0b2tlbml6ZShyZWFkbGluZSwgdG9rZW5lYXRlcj1wcmludHRva2VuKQorYXJlIHRoZSBzYW1lLCBleGNlcHQgaW5zdGVhZCBvZiBnZW5lcmF0aW5nIHRva2VucywgdG9rZW5lYXRlciBpcyBhIGNhbGxiYWNrCitmdW5jdGlvbiB0byB3aGljaCB0aGUgNSBmaWVsZHMgZGVzY3JpYmVkIGFib3ZlIGFyZSBwYXNzZWQgYXMgNSBhcmd1bWVudHMsCitlYWNoIHRpbWUgYSBuZXcgdG9rZW4gaXMgZm91bmQuIiIiCisKK19fYXV0aG9yX18gPSAnS2EtUGluZyBZZWUgPHBpbmdAbGZ3Lm9yZz4nCitfX2NyZWRpdHNfXyA9IFwKKyAgICAnR3ZSLCBFU1IsIFRpbSBQZXRlcnMsIFRob21hcyBXb3V0ZXJzLCBGcmVkIERyYWtlLCBTa2lwIE1vbnRhbmFybycKKworaW1wb3J0IHN0cmluZywgcmUKK2Zyb20gY29kZWNzIGltcG9ydCBCT01fVVRGOCwgbG9va3VwCitmcm9tIGxpYjJ0bzMucGdlbjIudG9rZW4gaW1wb3J0ICoKKworZnJvbSAuIGltcG9ydCB0b2tlbgorX19hbGxfXyA9IFt4IGZvciB4IGluIGRpcih0b2tlbikgaWYgeFswXSAhPSAnXyddICsgWyJ0b2tlbml6ZSIsCisgICAgICAgICAgICJnZW5lcmF0ZV90b2tlbnMiLCAidW50b2tlbml6ZSJdCitkZWwgdG9rZW4KKwordHJ5OgorICAgIGJ5dGVzCitleGNlcHQgTmFtZUVycm9yOgorICAgICMgU3VwcG9ydCBieXRlcyB0eXBlIGluIFB5dGhvbiA8PSAyLjUsIHNvIDJ0bzMgdHVybnMgaXRzZWxmIGludG8KKyAgICAjIHZhbGlkIFB5dGhvbiAzIGNvZGUuCisgICAgYnl0ZXMgPSBzdHIKKworZGVmIGdyb3VwKCpjaG9pY2VzKTogcmV0dXJuICcoJyArICd8Jy5qb2luKGNob2ljZXMpICsgJyknCitkZWYgYW55KCpjaG9pY2VzKTogcmV0dXJuIGdyb3VwKCpjaG9pY2VzKSArICcqJworZGVmIG1heWJlKCpjaG9pY2VzKTogcmV0dXJuIGdyb3VwKCpjaG9pY2VzKSArICc/JworCitXaGl0ZXNwYWNlID0gcidbIFxmXHRdKicKK0NvbW1lbnQgPSByJyNbXlxyXG5dKicKK0lnbm9yZSA9IFdoaXRlc3BhY2UgKyBhbnkocidcXFxyP1xuJyArIFdoaXRlc3BhY2UpICsgbWF5YmUoQ29tbWVudCkKK05hbWUgPSByJ1thLXpBLVpfXVx3KicKKworQmlubnVtYmVyID0gcicwW2JCXVswMV0qJworSGV4bnVtYmVyID0gcicwW3hYXVtcZGEtZkEtRl0qW2xMXT8nCitPY3RudW1iZXIgPSByJzBbb09dP1swLTddKltsTF0/JworRGVjbnVtYmVyID0gcidbMS05XVxkKltsTF0/JworSW50bnVtYmVyID0gZ3JvdXAoQmlubnVtYmVyLCBIZXhudW1iZXIsIE9jdG51bWJlciwgRGVjbnVtYmVyKQorRXhwb25lbnQgPSByJ1tlRV1bLStdP1xkKycKK1BvaW50ZmxvYXQgPSBncm91cChyJ1xkK1wuXGQqJywgcidcLlxkKycpICsgbWF5YmUoRXhwb25lbnQpCitFeHBmbG9hdCA9IHInXGQrJyArIEV4cG9uZW50CitGbG9hdG51bWJlciA9IGdyb3VwKFBvaW50ZmxvYXQsIEV4cGZsb2F0KQorSW1hZ251bWJlciA9IGdyb3VwKHInXGQrW2pKXScsIEZsb2F0bnVtYmVyICsgcidbakpdJykKK051bWJlciA9IGdyb3VwKEltYWdudW1iZXIsIEZsb2F0bnVtYmVyLCBJbnRudW1iZXIpCisKKyMgVGFpbCBlbmQgb2YgJyBzdHJpbmcuCitTaW5nbGUgPSByIlteJ1xcXSooPzpcXC5bXidcXF0qKSonIgorIyBUYWlsIGVuZCBvZiAiIHN0cmluZy4KK0RvdWJsZSA9IHInW14iXFxdKig/OlxcLlteIlxcXSopKiInCisjIFRhaWwgZW5kIG9mICcnJyBzdHJpbmcuCitTaW5nbGUzID0gciJbXidcXF0qKD86KD86XFwufCcoPyEnJykpW14nXFxdKikqJycnIgorIyBUYWlsIGVuZCBvZiAiIiIgc3RyaW5nLgorRG91YmxlMyA9IHInW14iXFxdKig/Oig/OlxcLnwiKD8hIiIpKVteIlxcXSopKiIiIicKK1RyaXBsZSA9IGdyb3VwKCJbdWJVQl0/W3JSXT8nJyciLCAnW3ViVUJdP1tyUl0/IiIiJykKKyMgU2luZ2xlLWxpbmUgJyBvciAiIHN0cmluZy4KK1N0cmluZyA9IGdyb3VwKHIiW3VVXT9bclJdPydbXlxuJ1xcXSooPzpcXC5bXlxuJ1xcXSopKiciLAorICAgICAgICAgICAgICAgcidbdVVdP1tyUl0/IlteXG4iXFxdKig/OlxcLlteXG4iXFxdKikqIicpCisKKyMgQmVjYXVzZSBvZiBsZWZ0bW9zdC10aGVuLWxvbmdlc3QgbWF0Y2ggc2VtYW50aWNzLCBiZSBzdXJlIHRvIHB1dCB0aGUKKyMgbG9uZ2VzdCBvcGVyYXRvcnMgZmlyc3QgKGUuZy4sIGlmID0gY2FtZSBiZWZvcmUgPT0sID09IHdvdWxkIGdldAorIyByZWNvZ25pemVkIGFzIHR3byBpbnN0YW5jZXMgb2YgPSkuCitPcGVyYXRvciA9IGdyb3VwKHIiXCpcKj0/IiwgciI+Pj0/IiwgciI8PD0/IiwgciI8PiIsIHIiIT0iLAorICAgICAgICAgICAgICAgICByIi8vPT8iLCByIi0+IiwKKyAgICAgICAgICAgICAgICAgciJbK1wtKi8lJnxePTw+XT0/IiwKKyAgICAgICAgICAgICAgICAgciJ+IikKKworQnJhY2tldCA9ICdbXVsoKXt9XScKK1NwZWNpYWwgPSBncm91cChyJ1xyP1xuJywgcidbOjsuLGBAXScpCitGdW5ueSA9IGdyb3VwKE9wZXJhdG9yLCBCcmFja2V0LCBTcGVjaWFsKQorCitQbGFpblRva2VuID0gZ3JvdXAoTnVtYmVyLCBGdW5ueSwgU3RyaW5nLCBOYW1lKQorVG9rZW4gPSBJZ25vcmUgKyBQbGFpblRva2VuCisKKyMgRmlyc3QgKG9yIG9ubHkpIGxpbmUgb2YgJyBvciAiIHN0cmluZy4KK0NvbnRTdHIgPSBncm91cChyIlt1VWJCXT9bclJdPydbXlxuJ1xcXSooPzpcXC5bXlxuJ1xcXSopKiIgKworICAgICAgICAgICAgICAgIGdyb3VwKCInIiwgcidcXFxyP1xuJyksCisgICAgICAgICAgICAgICAgcidbdVViQl0/W3JSXT8iW15cbiJcXF0qKD86XFwuW15cbiJcXF0qKSonICsKKyAgICAgICAgICAgICAgICBncm91cCgnIicsIHInXFxccj9cbicpKQorUHNldWRvRXh0cmFzID0gZ3JvdXAocidcXFxyP1xuJywgQ29tbWVudCwgVHJpcGxlKQorUHNldWRvVG9rZW4gPSBXaGl0ZXNwYWNlICsgZ3JvdXAoUHNldWRvRXh0cmFzLCBOdW1iZXIsIEZ1bm55LCBDb250U3RyLCBOYW1lKQorCit0b2tlbnByb2csIHBzZXVkb3Byb2csIHNpbmdsZTNwcm9nLCBkb3VibGUzcHJvZyA9IG1hcCgKKyAgICByZS5jb21waWxlLCAoVG9rZW4sIFBzZXVkb1Rva2VuLCBTaW5nbGUzLCBEb3VibGUzKSkKK2VuZHByb2dzID0geyInIjogcmUuY29tcGlsZShTaW5nbGUpLCAnIic6IHJlLmNvbXBpbGUoRG91YmxlKSwKKyAgICAgICAgICAgICInJyciOiBzaW5nbGUzcHJvZywgJyIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgInInJyciOiBzaW5nbGUzcHJvZywgJ3IiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJ1JycnIjogc2luZ2xlM3Byb2csICd1IiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiYicnJyI6IHNpbmdsZTNwcm9nLCAnYiIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgInVyJycnIjogc2luZ2xlM3Byb2csICd1ciIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgImJyJycnIjogc2luZ2xlM3Byb2csICdiciIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgIlInJyciOiBzaW5nbGUzcHJvZywgJ1IiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJVJycnIjogc2luZ2xlM3Byb2csICdVIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiQicnJyI6IHNpbmdsZTNwcm9nLCAnQiIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgInVSJycnIjogc2luZ2xlM3Byb2csICd1UiIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgIlVyJycnIjogc2luZ2xlM3Byb2csICdVciIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgIlVSJycnIjogc2luZ2xlM3Byb2csICdVUiIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgImJSJycnIjogc2luZ2xlM3Byb2csICdiUiIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgIkJyJycnIjogc2luZ2xlM3Byb2csICdCciIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgIkJSJycnIjogc2luZ2xlM3Byb2csICdCUiIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgJ3InOiBOb25lLCAnUic6IE5vbmUsCisgICAgICAgICAgICAndSc6IE5vbmUsICdVJzogTm9uZSwKKyAgICAgICAgICAgICdiJzogTm9uZSwgJ0InOiBOb25lfQorCit0cmlwbGVfcXVvdGVkID0ge30KK2ZvciB0IGluICgiJycnIiwgJyIiIicsCisgICAgICAgICAgInInJyciLCAnciIiIicsICJSJycnIiwgJ1IiIiInLAorICAgICAgICAgICJ1JycnIiwgJ3UiIiInLCAiVScnJyIsICdVIiIiJywKKyAgICAgICAgICAiYicnJyIsICdiIiIiJywgIkInJyciLCAnQiIiIicsCisgICAgICAgICAgInVyJycnIiwgJ3VyIiIiJywgIlVyJycnIiwgJ1VyIiIiJywKKyAgICAgICAgICAidVInJyciLCAndVIiIiInLCAiVVInJyciLCAnVVIiIiInLAorICAgICAgICAgICJicicnJyIsICdiciIiIicsICJCcicnJyIsICdCciIiIicsCisgICAgICAgICAgImJSJycnIiwgJ2JSIiIiJywgIkJSJycnIiwgJ0JSIiIiJywpOgorICAgIHRyaXBsZV9xdW90ZWRbdF0gPSB0CitzaW5nbGVfcXVvdGVkID0ge30KK2ZvciB0IGluICgiJyIsICciJywKKyAgICAgICAgICAiciciLCAnciInLCAiUiciLCAnUiInLAorICAgICAgICAgICJ1JyIsICd1IicsICJVJyIsICdVIicsCisgICAgICAgICAgImInIiwgJ2IiJywgIkInIiwgJ0IiJywKKyAgICAgICAgICAidXInIiwgJ3VyIicsICJVciciLCAnVXIiJywKKyAgICAgICAgICAidVInIiwgJ3VSIicsICJVUiciLCAnVVIiJywKKyAgICAgICAgICAiYnInIiwgJ2JyIicsICJCciciLCAnQnIiJywKKyAgICAgICAgICAiYlInIiwgJ2JSIicsICJCUiciLCAnQlIiJywgKToKKyAgICBzaW5nbGVfcXVvdGVkW3RdID0gdAorCit0YWJzaXplID0gOAorCitjbGFzcyBUb2tlbkVycm9yKEV4Y2VwdGlvbik6IHBhc3MKKworY2xhc3MgU3RvcFRva2VuaXppbmcoRXhjZXB0aW9uKTogcGFzcworCitkZWYgcHJpbnR0b2tlbih0eXBlLCB0b2tlbiwgc3RhcnQsIGVuZCwgbGluZSk6ICMgZm9yIHRlc3RpbmcKKyAgICAoc3Jvdywgc2NvbCkgPSBzdGFydAorICAgIChlcm93LCBlY29sKSA9IGVuZAorICAgIHByaW50ICIlZCwlZC0lZCwlZDpcdCVzXHQlcyIgJSBcCisgICAgICAgIChzcm93LCBzY29sLCBlcm93LCBlY29sLCB0b2tfbmFtZVt0eXBlXSwgcmVwcih0b2tlbikpCisKK2RlZiB0b2tlbml6ZShyZWFkbGluZSwgdG9rZW5lYXRlcj1wcmludHRva2VuKToKKyAgICAiIiIKKyAgICBUaGUgdG9rZW5pemUoKSBmdW5jdGlvbiBhY2NlcHRzIHR3byBwYXJhbWV0ZXJzOiBvbmUgcmVwcmVzZW50aW5nIHRoZQorICAgIGlucHV0IHN0cmVhbSwgYW5kIG9uZSBwcm92aWRpbmcgYW4gb3V0cHV0IG1lY2hhbmlzbSBmb3IgdG9rZW5pemUoKS4KKworICAgIFRoZSBmaXJzdCBwYXJhbWV0ZXIsIHJlYWRsaW5lLCBtdXN0IGJlIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHByb3ZpZGVzCisgICAgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZSByZWFkbGluZSgpIG1ldGhvZCBvZiBidWlsdC1pbiBmaWxlIG9iamVjdHMuCisgICAgRWFjaCBjYWxsIHRvIHRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIG9uZSBsaW5lIG9mIGlucHV0IGFzIGEgc3RyaW5nLgorCisgICAgVGhlIHNlY29uZCBwYXJhbWV0ZXIsIHRva2VuZWF0ZXIsIG11c3QgYWxzbyBiZSBhIGNhbGxhYmxlIG9iamVjdC4gSXQgaXMKKyAgICBjYWxsZWQgb25jZSBmb3IgZWFjaCB0b2tlbiwgd2l0aCBmaXZlIGFyZ3VtZW50cywgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICB0dXBsZXMgZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlX3Rva2VucygpLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgdG9rZW5pemVfbG9vcChyZWFkbGluZSwgdG9rZW5lYXRlcikKKyAgICBleGNlcHQgU3RvcFRva2VuaXppbmc6CisgICAgICAgIHBhc3MKKworIyBiYWNrd2FyZHMgY29tcGF0aWJsZSBpbnRlcmZhY2UKK2RlZiB0b2tlbml6ZV9sb29wKHJlYWRsaW5lLCB0b2tlbmVhdGVyKToKKyAgICBmb3IgdG9rZW5faW5mbyBpbiBnZW5lcmF0ZV90b2tlbnMocmVhZGxpbmUpOgorICAgICAgICB0b2tlbmVhdGVyKCp0b2tlbl9pbmZvKQorCitjbGFzcyBVbnRva2VuaXplcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi50b2tlbnMgPSBbXQorICAgICAgICBzZWxmLnByZXZfcm93ID0gMQorICAgICAgICBzZWxmLnByZXZfY29sID0gMAorCisgICAgZGVmIGFkZF93aGl0ZXNwYWNlKHNlbGYsIHN0YXJ0KToKKyAgICAgICAgcm93LCBjb2wgPSBzdGFydAorICAgICAgICBhc3NlcnQgcm93IDw9IHNlbGYucHJldl9yb3cKKyAgICAgICAgY29sX29mZnNldCA9IGNvbCAtIHNlbGYucHJldl9jb2wKKyAgICAgICAgaWYgY29sX29mZnNldDoKKyAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZCgiICIgKiBjb2xfb2Zmc2V0KQorCisgICAgZGVmIHVudG9rZW5pemUoc2VsZiwgaXRlcmFibGUpOgorICAgICAgICBmb3IgdCBpbiBpdGVyYWJsZToKKyAgICAgICAgICAgIGlmIGxlbih0KSA9PSAyOgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGF0KHQsIGl0ZXJhYmxlKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0b2tfdHlwZSwgdG9rZW4sIHN0YXJ0LCBlbmQsIGxpbmUgPSB0CisgICAgICAgICAgICBzZWxmLmFkZF93aGl0ZXNwYWNlKHN0YXJ0KQorICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHRva2VuKQorICAgICAgICAgICAgc2VsZi5wcmV2X3Jvdywgc2VsZi5wcmV2X2NvbCA9IGVuZAorICAgICAgICAgICAgaWYgdG9rX3R5cGUgaW4gKE5FV0xJTkUsIE5MKToKKyAgICAgICAgICAgICAgICBzZWxmLnByZXZfcm93ICs9IDEKKyAgICAgICAgICAgICAgICBzZWxmLnByZXZfY29sID0gMAorICAgICAgICByZXR1cm4gIiIuam9pbihzZWxmLnRva2VucykKKworICAgIGRlZiBjb21wYXQoc2VsZiwgdG9rZW4sIGl0ZXJhYmxlKToKKyAgICAgICAgc3RhcnRsaW5lID0gRmFsc2UKKyAgICAgICAgaW5kZW50cyA9IFtdCisgICAgICAgIHRva3NfYXBwZW5kID0gc2VsZi50b2tlbnMuYXBwZW5kCisgICAgICAgIHRva251bSwgdG9rdmFsID0gdG9rZW4KKyAgICAgICAgaWYgdG9rbnVtIGluIChOQU1FLCBOVU1CRVIpOgorICAgICAgICAgICAgdG9rdmFsICs9ICcgJworICAgICAgICBpZiB0b2tudW0gaW4gKE5FV0xJTkUsIE5MKToKKyAgICAgICAgICAgIHN0YXJ0bGluZSA9IFRydWUKKyAgICAgICAgZm9yIHRvayBpbiBpdGVyYWJsZToKKyAgICAgICAgICAgIHRva251bSwgdG9rdmFsID0gdG9rWzoyXQorCisgICAgICAgICAgICBpZiB0b2tudW0gaW4gKE5BTUUsIE5VTUJFUik6CisgICAgICAgICAgICAgICAgdG9rdmFsICs9ICcgJworCisgICAgICAgICAgICBpZiB0b2tudW0gPT0gSU5ERU5UOgorICAgICAgICAgICAgICAgIGluZGVudHMuYXBwZW5kKHRva3ZhbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiB0b2tudW0gPT0gREVERU5UOgorICAgICAgICAgICAgICAgIGluZGVudHMucG9wKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiB0b2tudW0gaW4gKE5FV0xJTkUsIE5MKToKKyAgICAgICAgICAgICAgICBzdGFydGxpbmUgPSBUcnVlCisgICAgICAgICAgICBlbGlmIHN0YXJ0bGluZSBhbmQgaW5kZW50czoKKyAgICAgICAgICAgICAgICB0b2tzX2FwcGVuZChpbmRlbnRzWy0xXSkKKyAgICAgICAgICAgICAgICBzdGFydGxpbmUgPSBGYWxzZQorICAgICAgICAgICAgdG9rc19hcHBlbmQodG9rdmFsKQorCitjb29raWVfcmUgPSByZS5jb21waWxlKCJjb2RpbmdbOj1dXHMqKFstXHcuXSspIikKKworZGVmIF9nZXRfbm9ybWFsX25hbWUob3JpZ19lbmMpOgorICAgICIiIkltaXRhdGVzIGdldF9ub3JtYWxfbmFtZSBpbiB0b2tlbml6ZXIuYy4iIiIKKyAgICAjIE9ubHkgY2FyZSBhYm91dCB0aGUgZmlyc3QgMTIgY2hhcmFjdGVycy4KKyAgICBlbmMgPSBvcmlnX2VuY1s6MTJdLmxvd2VyKCkucmVwbGFjZSgiXyIsICItIikKKyAgICBpZiBlbmMgPT0gInV0Zi04IiBvciBlbmMuc3RhcnRzd2l0aCgidXRmLTgtIik6CisgICAgICAgIHJldHVybiAidXRmLTgiCisgICAgaWYgZW5jIGluICgibGF0aW4tMSIsICJpc28tODg1OS0xIiwgImlzby1sYXRpbi0xIikgb3IgXAorICAgICAgIGVuYy5zdGFydHN3aXRoKCgibGF0aW4tMS0iLCAiaXNvLTg4NTktMS0iLCAiaXNvLWxhdGluLTEtIikpOgorICAgICAgICByZXR1cm4gImlzby04ODU5LTEiCisgICAgcmV0dXJuIG9yaWdfZW5jCisKK2RlZiBkZXRlY3RfZW5jb2RpbmcocmVhZGxpbmUpOgorICAgICIiIgorICAgIFRoZSBkZXRlY3RfZW5jb2RpbmcoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGRldGVjdCB0aGUgZW5jb2RpbmcgdGhhdCBzaG91bGQKKyAgICBiZSB1c2VkIHRvIGRlY29kZSBhIFB5dGhvbiBzb3VyY2UgZmlsZS4gSXQgcmVxdWlyZXMgb25lIGFyZ21lbnQsIHJlYWRsaW5lLAorICAgIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgdG9rZW5pemUoKSBnZW5lcmF0b3IuCisKKyAgICBJdCB3aWxsIGNhbGwgcmVhZGxpbmUgYSBtYXhpbXVtIG9mIHR3aWNlLCBhbmQgcmV0dXJuIHRoZSBlbmNvZGluZyB1c2VkCisgICAgKGFzIGEgc3RyaW5nKSBhbmQgYSBsaXN0IG9mIGFueSBsaW5lcyAobGVmdCBhcyBieXRlcykgaXQgaGFzIHJlYWQKKyAgICBpbi4KKworICAgIEl0IGRldGVjdHMgdGhlIGVuY29kaW5nIGZyb20gdGhlIHByZXNlbmNlIG9mIGEgdXRmLTggYm9tIG9yIGFuIGVuY29kaW5nCisgICAgY29va2llIGFzIHNwZWNpZmllZCBpbiBwZXAtMDI2My4gSWYgYm90aCBhIGJvbSBhbmQgYSBjb29raWUgYXJlIHByZXNlbnQsIGJ1dAorICAgIGRpc2FncmVlLCBhIFN5bnRheEVycm9yIHdpbGwgYmUgcmFpc2VkLiBJZiB0aGUgZW5jb2RpbmcgY29va2llIGlzIGFuIGludmFsaWQKKyAgICBjaGFyc2V0LCByYWlzZSBhIFN5bnRheEVycm9yLiAgTm90ZSB0aGF0IGlmIGEgdXRmLTggYm9tIGlzIGZvdW5kLAorICAgICd1dGYtOC1zaWcnIGlzIHJldHVybmVkLgorCisgICAgSWYgbm8gZW5jb2RpbmcgaXMgc3BlY2lmaWVkLCB0aGVuIHRoZSBkZWZhdWx0IG9mICd1dGYtOCcgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAiIiIKKyAgICBib21fZm91bmQgPSBGYWxzZQorICAgIGVuY29kaW5nID0gTm9uZQorICAgIGRlZmF1bHQgPSAndXRmLTgnCisgICAgZGVmIHJlYWRfb3Jfc3RvcCgpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gcmVhZGxpbmUoKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBieXRlcygpCisKKyAgICBkZWYgZmluZF9jb29raWUobGluZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmVfc3RyaW5nID0gbGluZS5kZWNvZGUoJ2FzY2lpJykKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgbWF0Y2hlcyA9IGNvb2tpZV9yZS5maW5kYWxsKGxpbmVfc3RyaW5nKQorICAgICAgICBpZiBub3QgbWF0Y2hlczoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVuY29kaW5nID0gX2dldF9ub3JtYWxfbmFtZShtYXRjaGVzWzBdKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb2RlYyA9IGxvb2t1cChlbmNvZGluZykKKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgIyBUaGlzIGJlaGF2aW91ciBtaW1pY3MgdGhlIFB5dGhvbiBpbnRlcnByZXRlcgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoInVua25vd24gZW5jb2Rpbmc6ICIgKyBlbmNvZGluZykKKworICAgICAgICBpZiBib21fZm91bmQ6CisgICAgICAgICAgICBpZiBjb2RlYy5uYW1lICE9ICd1dGYtOCc6CisgICAgICAgICAgICAgICAgIyBUaGlzIGJlaGF2aW91ciBtaW1pY3MgdGhlIFB5dGhvbiBpbnRlcnByZXRlcgorICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCdlbmNvZGluZyBwcm9ibGVtOiB1dGYtOCcpCisgICAgICAgICAgICBlbmNvZGluZyArPSAnLXNpZycKKyAgICAgICAgcmV0dXJuIGVuY29kaW5nCisKKyAgICBmaXJzdCA9IHJlYWRfb3Jfc3RvcCgpCisgICAgaWYgZmlyc3Quc3RhcnRzd2l0aChCT01fVVRGOCk6CisgICAgICAgIGJvbV9mb3VuZCA9IFRydWUKKyAgICAgICAgZmlyc3QgPSBmaXJzdFszOl0KKyAgICAgICAgZGVmYXVsdCA9ICd1dGYtOC1zaWcnCisgICAgaWYgbm90IGZpcnN0OgorICAgICAgICByZXR1cm4gZGVmYXVsdCwgW10KKworICAgIGVuY29kaW5nID0gZmluZF9jb29raWUoZmlyc3QpCisgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgIHJldHVybiBlbmNvZGluZywgW2ZpcnN0XQorCisgICAgc2Vjb25kID0gcmVhZF9vcl9zdG9wKCkKKyAgICBpZiBub3Qgc2Vjb25kOgorICAgICAgICByZXR1cm4gZGVmYXVsdCwgW2ZpcnN0XQorCisgICAgZW5jb2RpbmcgPSBmaW5kX2Nvb2tpZShzZWNvbmQpCisgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgIHJldHVybiBlbmNvZGluZywgW2ZpcnN0LCBzZWNvbmRdCisKKyAgICByZXR1cm4gZGVmYXVsdCwgW2ZpcnN0LCBzZWNvbmRdCisKK2RlZiB1bnRva2VuaXplKGl0ZXJhYmxlKToKKyAgICAiIiJUcmFuc2Zvcm0gdG9rZW5zIGJhY2sgaW50byBQeXRob24gc291cmNlIGNvZGUuCisKKyAgICBFYWNoIGVsZW1lbnQgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlIG11c3QgYmUgYSB0b2tlbiBzZXF1ZW5jZQorICAgIHdpdGggYXQgbGVhc3QgdHdvIGVsZW1lbnRzLCBhIHRva2VuIG51bWJlciBhbmQgdG9rZW4gdmFsdWUuICBJZgorICAgIG9ubHkgdHdvIHRva2VucyBhcmUgcGFzc2VkLCB0aGUgcmVzdWx0aW5nIG91dHB1dCBpcyBwb29yLgorCisgICAgUm91bmQtdHJpcCBpbnZhcmlhbnQgZm9yIGZ1bGwgaW5wdXQ6CisgICAgICAgIFVudG9rZW5pemVkIHNvdXJjZSB3aWxsIG1hdGNoIGlucHV0IHNvdXJjZSBleGFjdGx5CisKKyAgICBSb3VuZC10cmlwIGludmFyaWFudCBmb3IgbGltaXRlZCBpbnRwdXQ6CisgICAgICAgICMgT3V0cHV0IHRleHQgd2lsbCB0b2tlbml6ZSB0aGUgYmFjayB0byB0aGUgaW5wdXQKKyAgICAgICAgdDEgPSBbdG9rWzoyXSBmb3IgdG9rIGluIGdlbmVyYXRlX3Rva2VucyhmLnJlYWRsaW5lKV0KKyAgICAgICAgbmV3Y29kZSA9IHVudG9rZW5pemUodDEpCisgICAgICAgIHJlYWRsaW5lID0gaXRlcihuZXdjb2RlLnNwbGl0bGluZXMoMSkpLm5leHQKKyAgICAgICAgdDIgPSBbdG9rWzoyXSBmb3IgdG9raW4gZ2VuZXJhdGVfdG9rZW5zKHJlYWRsaW5lKV0KKyAgICAgICAgYXNzZXJ0IHQxID09IHQyCisgICAgIiIiCisgICAgdXQgPSBVbnRva2VuaXplcigpCisgICAgcmV0dXJuIHV0LnVudG9rZW5pemUoaXRlcmFibGUpCisKK2RlZiBnZW5lcmF0ZV90b2tlbnMocmVhZGxpbmUpOgorICAgICIiIgorICAgIFRoZSBnZW5lcmF0ZV90b2tlbnMoKSBnZW5lcmF0b3IgcmVxdWlyZXMgb25lIGFyZ21lbnQsIHJlYWRsaW5lLCB3aGljaAorICAgIG11c3QgYmUgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcHJvdmlkZXMgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZQorICAgIHJlYWRsaW5lKCkgbWV0aG9kIG9mIGJ1aWx0LWluIGZpbGUgb2JqZWN0cy4gRWFjaCBjYWxsIHRvIHRoZSBmdW5jdGlvbgorICAgIHNob3VsZCByZXR1cm4gb25lIGxpbmUgb2YgaW5wdXQgYXMgYSBzdHJpbmcuICBBbHRlcm5hdGVseSwgcmVhZGxpbmUKKyAgICBjYW4gYmUgYSBjYWxsYWJsZSBmdW5jdGlvbiB0ZXJtaW5hdGluZyB3aXRoIFN0b3BJdGVyYXRpb246CisgICAgICAgIHJlYWRsaW5lID0gb3BlbihteWZpbGUpLm5leHQgICAgIyBFeGFtcGxlIG9mIGFsdGVybmF0ZSByZWFkbGluZQorCisgICAgVGhlIGdlbmVyYXRvciBwcm9kdWNlcyA1LXR1cGxlcyB3aXRoIHRoZXNlIG1lbWJlcnM6IHRoZSB0b2tlbiB0eXBlOyB0aGUKKyAgICB0b2tlbiBzdHJpbmc7IGEgMi10dXBsZSAoc3Jvdywgc2NvbCkgb2YgaW50cyBzcGVjaWZ5aW5nIHRoZSByb3cgYW5kCisgICAgY29sdW1uIHdoZXJlIHRoZSB0b2tlbiBiZWdpbnMgaW4gdGhlIHNvdXJjZTsgYSAyLXR1cGxlIChlcm93LCBlY29sKSBvZgorICAgIGludHMgc3BlY2lmeWluZyB0aGUgcm93IGFuZCBjb2x1bW4gd2hlcmUgdGhlIHRva2VuIGVuZHMgaW4gdGhlIHNvdXJjZTsKKyAgICBhbmQgdGhlIGxpbmUgb24gd2hpY2ggdGhlIHRva2VuIHdhcyBmb3VuZC4gVGhlIGxpbmUgcGFzc2VkIGlzIHRoZQorICAgIGxvZ2ljYWwgbGluZTsgY29udGludWF0aW9uIGxpbmVzIGFyZSBpbmNsdWRlZC4KKyAgICAiIiIKKyAgICBsbnVtID0gcGFyZW5sZXYgPSBjb250aW51ZWQgPSAwCisgICAgbmFtZWNoYXJzLCBudW1jaGFycyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgJ18nLCAnMDEyMzQ1Njc4OScKKyAgICBjb250c3RyLCBuZWVkY29udCA9ICcnLCAwCisgICAgY29udGxpbmUgPSBOb25lCisgICAgaW5kZW50cyA9IFswXQorCisgICAgd2hpbGUgMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbG9vcCBvdmVyIGxpbmVzIGluIHN0cmVhbQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaW5lID0gcmVhZGxpbmUoKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIGxpbmUgPSAnJworICAgICAgICBsbnVtID0gbG51bSArIDEKKyAgICAgICAgcG9zLCBtYXggPSAwLCBsZW4obGluZSkKKworICAgICAgICBpZiBjb250c3RyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlZCBzdHJpbmcKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHJhaXNlIFRva2VuRXJyb3IsICgiRU9GIGluIG11bHRpLWxpbmUgc3RyaW5nIiwgc3Ryc3RhcnQpCisgICAgICAgICAgICBlbmRtYXRjaCA9IGVuZHByb2cubWF0Y2gobGluZSkKKyAgICAgICAgICAgIGlmIGVuZG1hdGNoOgorICAgICAgICAgICAgICAgIHBvcyA9IGVuZCA9IGVuZG1hdGNoLmVuZCgwKQorICAgICAgICAgICAgICAgIHlpZWxkIChTVFJJTkcsIGNvbnRzdHIgKyBsaW5lWzplbmRdLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJzdGFydCwgKGxudW0sIGVuZCksIGNvbnRsaW5lICsgbGluZSkKKyAgICAgICAgICAgICAgICBjb250c3RyLCBuZWVkY29udCA9ICcnLCAwCisgICAgICAgICAgICAgICAgY29udGxpbmUgPSBOb25lCisgICAgICAgICAgICBlbGlmIG5lZWRjb250IGFuZCBsaW5lWy0yOl0gIT0gJ1xcXG4nIGFuZCBsaW5lWy0zOl0gIT0gJ1xcXHJcbic6CisgICAgICAgICAgICAgICAgeWllbGQgKEVSUk9SVE9LRU4sIGNvbnRzdHIgKyBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RhcnQsIChsbnVtLCBsZW4obGluZSkpLCBjb250bGluZSkKKyAgICAgICAgICAgICAgICBjb250c3RyID0gJycKKyAgICAgICAgICAgICAgICBjb250bGluZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb250c3RyID0gY29udHN0ciArIGxpbmUKKyAgICAgICAgICAgICAgICBjb250bGluZSA9IGNvbnRsaW5lICsgbGluZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgZWxpZiBwYXJlbmxldiA9PSAwIGFuZCBub3QgY29udGludWVkOiAgIyBuZXcgc3RhdGVtZW50CisgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgICAgIGNvbHVtbiA9IDAKKyAgICAgICAgICAgIHdoaWxlIHBvcyA8IG1heDogICAgICAgICAgICAgICAgICAgIyBtZWFzdXJlIGxlYWRpbmcgd2hpdGVzcGFjZQorICAgICAgICAgICAgICAgIGlmIGxpbmVbcG9zXSA9PSAnICc6IGNvbHVtbiA9IGNvbHVtbiArIDEKKyAgICAgICAgICAgICAgICBlbGlmIGxpbmVbcG9zXSA9PSAnXHQnOiBjb2x1bW4gPSAoY29sdW1uLy90YWJzaXplICsgMSkqdGFic2l6ZQorICAgICAgICAgICAgICAgIGVsaWYgbGluZVtwb3NdID09ICdcZic6IGNvbHVtbiA9IDAKKyAgICAgICAgICAgICAgICBlbHNlOiBicmVhaworICAgICAgICAgICAgICAgIHBvcyA9IHBvcyArIDEKKyAgICAgICAgICAgIGlmIHBvcyA9PSBtYXg6IGJyZWFrCisKKyAgICAgICAgICAgIGlmIGxpbmVbcG9zXSBpbiAnI1xyXG4nOiAgICAgICAgICAgIyBza2lwIGNvbW1lbnRzIG9yIGJsYW5rIGxpbmVzCisgICAgICAgICAgICAgICAgaWYgbGluZVtwb3NdID09ICcjJzoKKyAgICAgICAgICAgICAgICAgICAgY29tbWVudF90b2tlbiA9IGxpbmVbcG9zOl0ucnN0cmlwKCdcclxuJykKKyAgICAgICAgICAgICAgICAgICAgbmxfcG9zID0gcG9zICsgbGVuKGNvbW1lbnRfdG9rZW4pCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIChDT01NRU5ULCBjb21tZW50X3Rva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxudW0sIHBvcyksIChsbnVtLCBwb3MgKyBsZW4oY29tbWVudF90b2tlbikpLCBsaW5lKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoTkwsIGxpbmVbbmxfcG9zOl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG51bSwgbmxfcG9zKSwgKGxudW0sIGxlbihsaW5lKSksIGxpbmUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKChOTCwgQ09NTUVOVClbbGluZVtwb3NdID09ICcjJ10sIGxpbmVbcG9zOl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG51bSwgcG9zKSwgKGxudW0sIGxlbihsaW5lKSksIGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgY29sdW1uID4gaW5kZW50c1stMV06ICAgICAgICAgICAjIGNvdW50IGluZGVudHMgb3IgZGVkZW50cworICAgICAgICAgICAgICAgIGluZGVudHMuYXBwZW5kKGNvbHVtbikKKyAgICAgICAgICAgICAgICB5aWVsZCAoSU5ERU5ULCBsaW5lWzpwb3NdLCAobG51bSwgMCksIChsbnVtLCBwb3MpLCBsaW5lKQorICAgICAgICAgICAgd2hpbGUgY29sdW1uIDwgaW5kZW50c1stMV06CisgICAgICAgICAgICAgICAgaWYgY29sdW1uIG5vdCBpbiBpbmRlbnRzOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbmRlbnRhdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgInVuaW5kZW50IGRvZXMgbm90IG1hdGNoIGFueSBvdXRlciBpbmRlbnRhdGlvbiBsZXZlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAoIjx0b2tlbml6ZT4iLCBsbnVtLCBwb3MsIGxpbmUpKQorICAgICAgICAgICAgICAgIGluZGVudHMgPSBpbmRlbnRzWzotMV0KKyAgICAgICAgICAgICAgICB5aWVsZCAoREVERU5ULCAnJywgKGxudW0sIHBvcyksIChsbnVtLCBwb3MpLCBsaW5lKQorCisgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGludWVkIHN0YXRlbWVudAorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVG9rZW5FcnJvciwgKCJFT0YgaW4gbXVsdGktbGluZSBzdGF0ZW1lbnQiLCAobG51bSwgMCkpCisgICAgICAgICAgICBjb250aW51ZWQgPSAwCisKKyAgICAgICAgd2hpbGUgcG9zIDwgbWF4OgorICAgICAgICAgICAgcHNldWRvbWF0Y2ggPSBwc2V1ZG9wcm9nLm1hdGNoKGxpbmUsIHBvcykKKyAgICAgICAgICAgIGlmIHBzZXVkb21hdGNoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzY2FuIGZvciB0b2tlbnMKKyAgICAgICAgICAgICAgICBzdGFydCwgZW5kID0gcHNldWRvbWF0Y2guc3BhbigxKQorICAgICAgICAgICAgICAgIHNwb3MsIGVwb3MsIHBvcyA9IChsbnVtLCBzdGFydCksIChsbnVtLCBlbmQpLCBlbmQKKyAgICAgICAgICAgICAgICB0b2tlbiwgaW5pdGlhbCA9IGxpbmVbc3RhcnQ6ZW5kXSwgbGluZVtzdGFydF0KKworICAgICAgICAgICAgICAgIGlmIGluaXRpYWwgaW4gbnVtY2hhcnMgb3IgXAorICAgICAgICAgICAgICAgICAgIChpbml0aWFsID09ICcuJyBhbmQgdG9rZW4gIT0gJy4nKTogICAgICAjIG9yZGluYXJ5IG51bWJlcgorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoTlVNQkVSLCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKyAgICAgICAgICAgICAgICBlbGlmIGluaXRpYWwgaW4gJ1xyXG4nOgorICAgICAgICAgICAgICAgICAgICBuZXdsaW5lID0gTkVXTElORQorICAgICAgICAgICAgICAgICAgICBpZiBwYXJlbmxldiA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lID0gTkwKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKG5ld2xpbmUsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCA9PSAnIyc6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBub3QgdG9rZW4uZW5kc3dpdGgoIlxuIikKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKENPTU1FTlQsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorICAgICAgICAgICAgICAgIGVsaWYgdG9rZW4gaW4gdHJpcGxlX3F1b3RlZDoKKyAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IGVuZHByb2dzW3Rva2VuXQorICAgICAgICAgICAgICAgICAgICBlbmRtYXRjaCA9IGVuZHByb2cubWF0Y2gobGluZSwgcG9zKQorICAgICAgICAgICAgICAgICAgICBpZiBlbmRtYXRjaDogICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFsbCBvbiBvbmUgbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gZW5kbWF0Y2guZW5kKDApCisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxpbmVbc3RhcnQ6cG9zXQorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgKFNUUklORywgdG9rZW4sIHNwb3MsIChsbnVtLCBwb3MpLCBsaW5lKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RhcnQgPSAobG51bSwgc3RhcnQpICAgICAgICAgICAjIG11bHRpcGxlIGxpbmVzCisgICAgICAgICAgICAgICAgICAgICAgICBjb250c3RyID0gbGluZVtzdGFydDpdCisgICAgICAgICAgICAgICAgICAgICAgICBjb250bGluZSA9IGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsIGluIHNpbmdsZV9xdW90ZWQgb3IgXAorICAgICAgICAgICAgICAgICAgICB0b2tlbls6Ml0gaW4gc2luZ2xlX3F1b3RlZCBvciBcCisgICAgICAgICAgICAgICAgICAgIHRva2VuWzozXSBpbiBzaW5nbGVfcXVvdGVkOgorICAgICAgICAgICAgICAgICAgICBpZiB0b2tlblstMV0gPT0gJ1xuJzogICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlZCBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0ID0gKGxudW0sIHN0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IChlbmRwcm9nc1tpbml0aWFsXSBvciBlbmRwcm9nc1t0b2tlblsxXV0gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZ3NbdG9rZW5bMl1dKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udHN0ciwgbmVlZGNvbnQgPSBsaW5lW3N0YXJ0Ol0sIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcmRpbmFyeSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIChTVFJJTkcsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCBpbiBuYW1lY2hhcnM6ICAgICAgICAgICAgICAgICAjIG9yZGluYXJ5IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKE5BTUUsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCA9PSAnXFwnOiAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlZCBzdG10CisgICAgICAgICAgICAgICAgICAgICMgVGhpcyB5aWVsZCBpcyBuZXc7IG5lZWRlZCBmb3IgYmV0dGVyIGlkZW1wb3RlbmN5OgorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoTkwsIHRva2VuLCBzcG9zLCAobG51bSwgcG9zKSwgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWVkID0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGluaXRpYWwgaW4gJyhbeyc6IHBhcmVubGV2ID0gcGFyZW5sZXYgKyAxCisgICAgICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCBpbiAnKV19JzogcGFyZW5sZXYgPSBwYXJlbmxldiAtIDEKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKE9QLCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgKEVSUk9SVE9LRU4sIGxpbmVbcG9zXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsbnVtLCBwb3MpLCAobG51bSwgcG9zKzEpLCBsaW5lKQorICAgICAgICAgICAgICAgIHBvcyA9IHBvcyArIDEKKworICAgIGZvciBpbmRlbnQgaW4gaW5kZW50c1sxOl06ICAgICAgICAgICAgICAgICAjIHBvcCByZW1haW5pbmcgaW5kZW50IGxldmVscworICAgICAgICB5aWVsZCAoREVERU5ULCAnJywgKGxudW0sIDApLCAobG51bSwgMCksICcnKQorICAgIHlpZWxkIChFTkRNQVJLRVIsICcnLCAobG51bSwgMCksIChsbnVtLCAwKSwgJycpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6ICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0aW5nCisgICAgaW1wb3J0IHN5cworICAgIGlmIGxlbihzeXMuYXJndikgPiAxOiB0b2tlbml6ZShvcGVuKHN5cy5hcmd2WzFdKS5yZWFkbGluZSkKKyAgICBlbHNlOiB0b2tlbml6ZShzeXMuc3RkaW4ucmVhZGxpbmUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW5pemUucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuaXplLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTgwMzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuaXplLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW5pemUucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuaXplLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODc0ZDBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuaXplLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcHlncmFtLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3B5Z3JhbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjFmZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3B5Z3JhbS5weQpAQCAtMCwwICsxLDQwIEBACisjIENvcHlyaWdodCAyMDA2IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkV4cG9ydCB0aGUgUHl0aG9uIGdyYW1tYXIgYW5kIHN5bWJvbHMuIiIiCisKKyMgUHl0aG9uIGltcG9ydHMKK2ltcG9ydCBvcworCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLnBnZW4yIGltcG9ydCB0b2tlbgorZnJvbSAucGdlbjIgaW1wb3J0IGRyaXZlcgorZnJvbSAuIGltcG9ydCBweXRyZWUKKworIyBUaGUgZ3JhbW1hciBmaWxlCitfR1JBTU1BUl9GSUxFID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJHcmFtbWFyLnR4dCIpCitfUEFUVEVSTl9HUkFNTUFSX0ZJTEUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGF0dGVybkdyYW1tYXIudHh0IikKKworCitjbGFzcyBTeW1ib2xzKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZ3JhbW1hcik6CisgICAgICAgICIiIkluaXRpYWxpemVyLgorCisgICAgICAgIENyZWF0ZXMgYW4gYXR0cmlidXRlIGZvciBlYWNoIGdyYW1tYXIgc3ltYm9sIChub250ZXJtaW5hbCksCisgICAgICAgIHdob3NlIHZhbHVlIGlzIHRoZSBzeW1ib2wncyB0eXBlIChhbiBpbnQgPj0gMjU2KS4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBuYW1lLCBzeW1ib2wgaW4gZ3JhbW1hci5zeW1ib2wybnVtYmVyLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBzeW1ib2wpCisKKworcHl0aG9uX2dyYW1tYXIgPSBkcml2ZXIubG9hZF9ncmFtbWFyKF9HUkFNTUFSX0ZJTEUpCisKK3B5dGhvbl9zeW1ib2xzID0gU3ltYm9scyhweXRob25fZ3JhbW1hcikKKworcHl0aG9uX2dyYW1tYXJfbm9fcHJpbnRfc3RhdGVtZW50ID0gcHl0aG9uX2dyYW1tYXIuY29weSgpCitkZWwgcHl0aG9uX2dyYW1tYXJfbm9fcHJpbnRfc3RhdGVtZW50LmtleXdvcmRzWyJwcmludCJdCisKK3BhdHRlcm5fZ3JhbW1hciA9IGRyaXZlci5sb2FkX2dyYW1tYXIoX1BBVFRFUk5fR1JBTU1BUl9GSUxFKQorcGF0dGVybl9zeW1ib2xzID0gU3ltYm9scyhwYXR0ZXJuX2dyYW1tYXIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcHlncmFtLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9weWdyYW0ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjFjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcHlncmFtLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcHlncmFtLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9weWdyYW0ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjFjNmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcHlncmFtLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcHl0cmVlLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3B5dHJlZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzljYWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3B5dHJlZS5weQpAQCAtMCwwICsxLDg4NyBAQAorIyBDb3B5cmlnaHQgMjAwNiBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiIKK1B5dGhvbiBwYXJzZSB0cmVlIGRlZmluaXRpb25zLgorCitUaGlzIGlzIGEgdmVyeSBjb25jcmV0ZSBwYXJzZSB0cmVlOyB3ZSBuZWVkIHRvIGtlZXAgZXZlcnkgdG9rZW4gYW5kCitldmVuIHRoZSBjb21tZW50cyBhbmQgd2hpdGVzcGFjZSBiZXR3ZWVuIHRva2Vucy4KKworVGhlcmUncyBhbHNvIGEgcGF0dGVybiBtYXRjaGluZyBpbXBsZW1lbnRhdGlvbiBoZXJlLgorIiIiCisKK19fYXV0aG9yX18gPSAiR3VpZG8gdmFuIFJvc3N1bSA8Z3VpZG9AcHl0aG9uLm9yZz4iCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworSFVHRSA9IDB4N0ZGRkZGRkYgICMgbWF4aW11bSByZXBlYXQgY291bnQsIGRlZmF1bHQgbWF4CisKK190eXBlX3JlcHJzID0ge30KK2RlZiB0eXBlX3JlcHIodHlwZV9udW0pOgorICAgIGdsb2JhbCBfdHlwZV9yZXBycworICAgIGlmIG5vdCBfdHlwZV9yZXByczoKKyAgICAgICAgZnJvbSAucHlncmFtIGltcG9ydCBweXRob25fc3ltYm9scworICAgICAgICAjIHByaW50aW5nIHRva2VucyBpcyBwb3NzaWJsZSBidXQgbm90IGFzIHVzZWZ1bAorICAgICAgICAjIGZyb20gLnBnZW4yIGltcG9ydCB0b2tlbiAvLyB0b2tlbi5fX2RpY3RfXy5pdGVtcygpOgorICAgICAgICBmb3IgbmFtZSwgdmFsIGluIHB5dGhvbl9zeW1ib2xzLl9fZGljdF9fLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB0eXBlKHZhbCkgPT0gaW50OiBfdHlwZV9yZXByc1t2YWxdID0gbmFtZQorICAgIHJldHVybiBfdHlwZV9yZXBycy5zZXRkZWZhdWx0KHR5cGVfbnVtLCB0eXBlX251bSkKKworY2xhc3MgQmFzZShvYmplY3QpOgorCisgICAgIiIiCisgICAgQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgTm9kZSBhbmQgTGVhZi4KKworICAgIFRoaXMgcHJvdmlkZXMgc29tZSBkZWZhdWx0IGZ1bmN0aW9uYWxpdHkgYW5kIGJvaWxlcnBsYXRlIHVzaW5nIHRoZQorICAgIHRlbXBsYXRlIHBhdHRlcm4uCisKKyAgICBBIG5vZGUgbWF5IGJlIGEgc3Vibm9kZSBvZiBhdCBtb3N0IG9uZSBwYXJlbnQuCisgICAgIiIiCisKKyAgICAjIERlZmF1bHQgdmFsdWVzIGZvciBpbnN0YW5jZSB2YXJpYWJsZXMKKyAgICB0eXBlID0gTm9uZSAgICAjIGludDogdG9rZW4gbnVtYmVyICg8IDI1Nikgb3Igc3ltYm9sIG51bWJlciAoPj0gMjU2KQorICAgIHBhcmVudCA9IE5vbmUgICMgUGFyZW50IG5vZGUgcG9pbnRlciwgb3IgTm9uZQorICAgIGNoaWxkcmVuID0gKCkgICMgVHVwbGUgb2Ygc3Vibm9kZXMKKyAgICB3YXNfY2hhbmdlZCA9IEZhbHNlCisgICAgd2FzX2NoZWNrZWQgPSBGYWxzZQorCisgICAgZGVmIF9fbmV3X18oY2xzLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IgdGhhdCBwcmV2ZW50cyBCYXNlIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiIiIgorICAgICAgICBhc3NlcnQgY2xzIGlzIG5vdCBCYXNlLCAiQ2Fubm90IGluc3RhbnRpYXRlIEJhc2UiCisgICAgICAgIHJldHVybiBvYmplY3QuX19uZXdfXyhjbHMpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiCisgICAgICAgIENvbXBhcmUgdHdvIG5vZGVzIGZvciBlcXVhbGl0eS4KKworICAgICAgICBUaGlzIGNhbGxzIHRoZSBtZXRob2QgX2VxKCkuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9fY2xhc3NfXyBpcyBub3Qgb3RoZXIuX19jbGFzc19fOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBzZWxmLl9lcShvdGhlcikKKworICAgIF9faGFzaF9fID0gTm9uZSAjIEZvciBQeTMgY29tcGF0aWJpbGl0eS4KKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29tcGFyZSB0d28gbm9kZXMgZm9yIGluZXF1YWxpdHkuCisKKyAgICAgICAgVGhpcyBjYWxscyB0aGUgbWV0aG9kIF9lcSgpLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fX2NsYXNzX18gaXMgbm90IG90aGVyLl9fY2xhc3NfXzoKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gbm90IHNlbGYuX2VxKG90aGVyKQorCisgICAgZGVmIF9lcShzZWxmLCBvdGhlcik6CisgICAgICAgICIiIgorICAgICAgICBDb21wYXJlIHR3byBub2RlcyBmb3IgZXF1YWxpdHkuCisKKyAgICAgICAgVGhpcyBpcyBjYWxsZWQgYnkgX19lcV9fIGFuZCBfX25lX18uICBJdCBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgdHdvIG5vZGVzCisgICAgICAgIGhhdmUgdGhlIHNhbWUgdHlwZS4gIFRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgY29uY3JldGUgc3ViY2xhc3MuCisgICAgICAgIE5vZGVzIHNob3VsZCBiZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBzdHJ1Y3R1cmUsCisgICAgICAgIGlnbm9yaW5nIHRoZSBwcmVmaXggc3RyaW5nIGFuZCBvdGhlciBjb250ZXh0IGluZm9ybWF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGNsb25lKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgY2xvbmVkIChkZWVwKSBjb3B5IG9mIHNlbGYuCisKKyAgICAgICAgVGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjb25jcmV0ZSBzdWJjbGFzcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBwb3N0X29yZGVyKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgcG9zdC1vcmRlciBpdGVyYXRvciBmb3IgdGhlIHRyZWUuCisKKyAgICAgICAgVGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjb25jcmV0ZSBzdWJjbGFzcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBwcmVfb3JkZXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBwcmUtb3JkZXIgaXRlcmF0b3IgZm9yIHRoZSB0cmVlLgorCisgICAgICAgIFRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgY29uY3JldGUgc3ViY2xhc3MuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgc2V0X3ByZWZpeChzZWxmLCBwcmVmaXgpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0IHRoZSBwcmVmaXggZm9yIHRoZSBub2RlIChzZWUgTGVhZiBjbGFzcykuCisKKyAgICAgICAgREVQUkVDQVRFRDsgdXNlIHRoZSBwcmVmaXggcHJvcGVydHkgZGlyZWN0bHkuCisgICAgICAgICIiIgorICAgICAgICB3YXJuaW5ncy53YXJuKCJzZXRfcHJlZml4KCkgaXMgZGVwcmVjYXRlZDsgdXNlIHRoZSBwcmVmaXggcHJvcGVydHkiLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICBzZWxmLnByZWZpeCA9IHByZWZpeAorCisgICAgZGVmIGdldF9wcmVmaXgoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIHByZWZpeCBmb3IgdGhlIG5vZGUgKHNlZSBMZWFmIGNsYXNzKS4KKworICAgICAgICBERVBSRUNBVEVEOyB1c2UgdGhlIHByZWZpeCBwcm9wZXJ0eSBkaXJlY3RseS4KKyAgICAgICAgIiIiCisgICAgICAgIHdhcm5pbmdzLndhcm4oImdldF9wcmVmaXgoKSBpcyBkZXByZWNhdGVkOyB1c2UgdGhlIHByZWZpeCBwcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHJldHVybiBzZWxmLnByZWZpeAorCisgICAgZGVmIHJlcGxhY2Uoc2VsZiwgbmV3KToKKyAgICAgICAgIiIiUmVwbGFjZSB0aGlzIG5vZGUgd2l0aCBhIG5ldyBvbmUgaW4gdGhlIHBhcmVudC4iIiIKKyAgICAgICAgYXNzZXJ0IHNlbGYucGFyZW50IGlzIG5vdCBOb25lLCBzdHIoc2VsZikKKyAgICAgICAgYXNzZXJ0IG5ldyBpcyBub3QgTm9uZQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuZXcsIGxpc3QpOgorICAgICAgICAgICAgbmV3ID0gW25ld10KKyAgICAgICAgbF9jaGlsZHJlbiA9IFtdCisgICAgICAgIGZvdW5kID0gRmFsc2UKKyAgICAgICAgZm9yIGNoIGluIHNlbGYucGFyZW50LmNoaWxkcmVuOgorICAgICAgICAgICAgaWYgY2ggaXMgc2VsZjoKKyAgICAgICAgICAgICAgICBhc3NlcnQgbm90IGZvdW5kLCAoc2VsZi5wYXJlbnQuY2hpbGRyZW4sIHNlbGYsIG5ldykKKyAgICAgICAgICAgICAgICBpZiBuZXcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGxfY2hpbGRyZW4uZXh0ZW5kKG5ldykKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbF9jaGlsZHJlbi5hcHBlbmQoY2gpCisgICAgICAgIGFzc2VydCBmb3VuZCwgKHNlbGYuY2hpbGRyZW4sIHNlbGYsIG5ldykKKyAgICAgICAgc2VsZi5wYXJlbnQuY2hhbmdlZCgpCisgICAgICAgIHNlbGYucGFyZW50LmNoaWxkcmVuID0gbF9jaGlsZHJlbgorICAgICAgICBmb3IgeCBpbiBuZXc6CisgICAgICAgICAgICB4LnBhcmVudCA9IHNlbGYucGFyZW50CisgICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQorCisgICAgZGVmIGdldF9saW5lbm8oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbGluZSBudW1iZXIgd2hpY2ggZ2VuZXJhdGVkIHRoZSBpbnZvY2FudCBub2RlLiIiIgorICAgICAgICBub2RlID0gc2VsZgorICAgICAgICB3aGlsZSBub3QgaXNpbnN0YW5jZShub2RlLCBMZWFmKToKKyAgICAgICAgICAgIGlmIG5vdCBub2RlLmNoaWxkcmVuOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGRyZW5bMF0KKyAgICAgICAgcmV0dXJuIG5vZGUubGluZW5vCisKKyAgICBkZWYgY2hhbmdlZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wYXJlbnQ6CisgICAgICAgICAgICBzZWxmLnBhcmVudC5jaGFuZ2VkKCkKKyAgICAgICAgc2VsZi53YXNfY2hhbmdlZCA9IFRydWUKKworICAgIGRlZiByZW1vdmUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZW1vdmUgdGhlIG5vZGUgZnJvbSB0aGUgdHJlZS4gUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIG5vZGUgaW4gaXRzCisgICAgICAgIHBhcmVudCdzIGNoaWxkcmVuIGJlZm9yZSBpdCB3YXMgcmVtb3ZlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYucGFyZW50OgorICAgICAgICAgICAgZm9yIGksIG5vZGUgaW4gZW51bWVyYXRlKHNlbGYucGFyZW50LmNoaWxkcmVuKToKKyAgICAgICAgICAgICAgICBpZiBub2RlIGlzIHNlbGY6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LmNoYW5nZWQoKQorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5wYXJlbnQuY2hpbGRyZW5baV0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmV4dF9zaWJsaW5nKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhlIG5vZGUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBpbnZvY2FudCBpbiB0aGVpciBwYXJlbnQncyBjaGlsZHJlbgorICAgICAgICBsaXN0LiBJZiB0aGUgaW52b2NhbnQgZG9lcyBub3QgaGF2ZSBhIG5leHQgc2libGluZywgaXQgaXMgTm9uZQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5wYXJlbnQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBDYW4ndCB1c2UgaW5kZXgoKTsgd2UgbmVlZCB0byB0ZXN0IGJ5IGlkZW50aXR5CisgICAgICAgIGZvciBpLCBjaGlsZCBpbiBlbnVtZXJhdGUoc2VsZi5wYXJlbnQuY2hpbGRyZW4pOgorICAgICAgICAgICAgaWYgY2hpbGQgaXMgc2VsZjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5jaGlsZHJlbltpKzFdCisgICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcHJldl9zaWJsaW5nKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhlIG5vZGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHRoZSBpbnZvY2FudCBpbiB0aGVpciBwYXJlbnQncyBjaGlsZHJlbgorICAgICAgICBsaXN0LiBJZiB0aGUgaW52b2NhbnQgZG9lcyBub3QgaGF2ZSBhIHByZXZpb3VzIHNpYmxpbmcsIGl0IGlzIE5vbmUuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIENhbid0IHVzZSBpbmRleCgpOyB3ZSBuZWVkIHRvIHRlc3QgYnkgaWRlbnRpdHkKKyAgICAgICAgZm9yIGksIGNoaWxkIGluIGVudW1lcmF0ZShzZWxmLnBhcmVudC5jaGlsZHJlbik6CisgICAgICAgICAgICBpZiBjaGlsZCBpcyBzZWxmOgorICAgICAgICAgICAgICAgIGlmIGkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQuY2hpbGRyZW5baS0xXQorCisgICAgZGVmIGxlYXZlcyhzZWxmKToKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuY2hpbGRyZW46CisgICAgICAgICAgICBmb3IgeCBpbiBjaGlsZC5sZWF2ZXMoKToKKyAgICAgICAgICAgICAgICB5aWVsZCB4CisKKyAgICBkZWYgZGVwdGgoc2VsZik6CisgICAgICAgIGlmIHNlbGYucGFyZW50IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICByZXR1cm4gMSArIHNlbGYucGFyZW50LmRlcHRoKCkKKworICAgIGRlZiBnZXRfc3VmZml4KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBzdHJpbmcgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBpbnZvY2FudCBub2RlLiBUaGlzIGlzCisgICAgICAgIGVmZmVjdGl2ZWx5IGVxdWl2YWxlbnQgdG8gbm9kZS5uZXh0X3NpYmxpbmcucHJlZml4CisgICAgICAgICIiIgorICAgICAgICBuZXh0X3NpYiA9IHNlbGYubmV4dF9zaWJsaW5nCisgICAgICAgIGlmIG5leHRfc2liIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdSIiCisgICAgICAgIHJldHVybiBuZXh0X3NpYi5wcmVmaXgKKworICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCk6CisgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUoc2VsZikuZW5jb2RlKCJhc2NpaSIpCisKK2NsYXNzIE5vZGUoQmFzZSk6CisKKyAgICAiIiJDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgaW50ZXJpb3Igbm9kZXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZix0eXBlLCBjaGlsZHJlbiwKKyAgICAgICAgICAgICAgICAgY29udGV4dD1Ob25lLAorICAgICAgICAgICAgICAgICBwcmVmaXg9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZml4ZXJzX2FwcGxpZWQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplci4KKworICAgICAgICBUYWtlcyBhIHR5cGUgY29uc3RhbnQgKGEgc3ltYm9sIG51bWJlciA+PSAyNTYpLCBhIHNlcXVlbmNlIG9mCisgICAgICAgIGNoaWxkIG5vZGVzLCBhbmQgYW4gb3B0aW9uYWwgY29udGV4dCBrZXl3b3JkIGFyZ3VtZW50LgorCisgICAgICAgIEFzIGEgc2lkZSBlZmZlY3QsIHRoZSBwYXJlbnQgcG9pbnRlcnMgb2YgdGhlIGNoaWxkcmVuIGFyZSB1cGRhdGVkLgorICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IHR5cGUgPj0gMjU2LCB0eXBlCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICAgICAgc2VsZi5jaGlsZHJlbiA9IGxpc3QoY2hpbGRyZW4pCisgICAgICAgIGZvciBjaCBpbiBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgYXNzZXJ0IGNoLnBhcmVudCBpcyBOb25lLCByZXByKGNoKQorICAgICAgICAgICAgY2gucGFyZW50ID0gc2VsZgorICAgICAgICBpZiBwcmVmaXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnByZWZpeCA9IHByZWZpeAorICAgICAgICBpZiBmaXhlcnNfYXBwbGllZDoKKyAgICAgICAgICAgIHNlbGYuZml4ZXJzX2FwcGxpZWQgPSBmaXhlcnNfYXBwbGllZFs6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5maXhlcnNfYXBwbGllZCA9IE5vbmUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgY2Fub25pY2FsIHN0cmluZyByZXByZXNlbnRhdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuICIlcyglcywgJXIpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX3JlcHIoc2VsZi50eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuKQorCisgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgcHJldHR5IHN0cmluZyByZXByZXNlbnRhdGlvbi4KKworICAgICAgICBUaGlzIHJlcHJvZHVjZXMgdGhlIGlucHV0IHNvdXJjZSBleGFjdGx5LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHUiIi5qb2luKG1hcCh1bmljb2RlLCBzZWxmLmNoaWxkcmVuKSkKKworICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPiAoMywgMCk6CisgICAgICAgIF9fc3RyX18gPSBfX3VuaWNvZGVfXworCisgICAgZGVmIF9lcShzZWxmLCBvdGhlcik6CisgICAgICAgICIiIkNvbXBhcmUgdHdvIG5vZGVzIGZvciBlcXVhbGl0eS4iIiIKKyAgICAgICAgcmV0dXJuIChzZWxmLnR5cGUsIHNlbGYuY2hpbGRyZW4pID09IChvdGhlci50eXBlLCBvdGhlci5jaGlsZHJlbikKKworICAgIGRlZiBjbG9uZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgY2xvbmVkIChkZWVwKSBjb3B5IG9mIHNlbGYuIiIiCisgICAgICAgIHJldHVybiBOb2RlKHNlbGYudHlwZSwgW2NoLmNsb25lKCkgZm9yIGNoIGluIHNlbGYuY2hpbGRyZW5dLAorICAgICAgICAgICAgICAgICAgICBmaXhlcnNfYXBwbGllZD1zZWxmLmZpeGVyc19hcHBsaWVkKQorCisgICAgZGVmIHBvc3Rfb3JkZXIoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIHBvc3Qtb3JkZXIgaXRlcmF0b3IgZm9yIHRoZSB0cmVlLiIiIgorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIGZvciBub2RlIGluIGNoaWxkLnBvc3Rfb3JkZXIoKToKKyAgICAgICAgICAgICAgICB5aWVsZCBub2RlCisgICAgICAgIHlpZWxkIHNlbGYKKworICAgIGRlZiBwcmVfb3JkZXIoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIHByZS1vcmRlciBpdGVyYXRvciBmb3IgdGhlIHRyZWUuIiIiCisgICAgICAgIHlpZWxkIHNlbGYKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuY2hpbGRyZW46CisgICAgICAgICAgICBmb3Igbm9kZSBpbiBjaGlsZC5wcmVfb3JkZXIoKToKKyAgICAgICAgICAgICAgICB5aWVsZCBub2RlCisKKyAgICBkZWYgX3ByZWZpeF9nZXR0ZXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUaGUgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgcHJlY2VkaW5nIHRoaXMgbm9kZSBpbiB0aGUgaW5wdXQuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICByZXR1cm4gc2VsZi5jaGlsZHJlblswXS5wcmVmaXgKKworICAgIGRlZiBfcHJlZml4X3NldHRlcihzZWxmLCBwcmVmaXgpOgorICAgICAgICBpZiBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgc2VsZi5jaGlsZHJlblswXS5wcmVmaXggPSBwcmVmaXgKKworICAgIHByZWZpeCA9IHByb3BlcnR5KF9wcmVmaXhfZ2V0dGVyLCBfcHJlZml4X3NldHRlcikKKworICAgIGRlZiBzZXRfY2hpbGQoc2VsZiwgaSwgY2hpbGQpOgorICAgICAgICAiIiIKKyAgICAgICAgRXF1aXZhbGVudCB0byAnbm9kZS5jaGlsZHJlbltpXSA9IGNoaWxkJy4gVGhpcyBtZXRob2QgYWxzbyBzZXRzIHRoZQorICAgICAgICBjaGlsZCdzIHBhcmVudCBhdHRyaWJ1dGUgYXBwcm9wcmlhdGVseS4KKyAgICAgICAgIiIiCisgICAgICAgIGNoaWxkLnBhcmVudCA9IHNlbGYKKyAgICAgICAgc2VsZi5jaGlsZHJlbltpXS5wYXJlbnQgPSBOb25lCisgICAgICAgIHNlbGYuY2hpbGRyZW5baV0gPSBjaGlsZAorICAgICAgICBzZWxmLmNoYW5nZWQoKQorCisgICAgZGVmIGluc2VydF9jaGlsZChzZWxmLCBpLCBjaGlsZCk6CisgICAgICAgICIiIgorICAgICAgICBFcXVpdmFsZW50IHRvICdub2RlLmNoaWxkcmVuLmluc2VydChpLCBjaGlsZCknLiBUaGlzIG1ldGhvZCBhbHNvIHNldHMKKyAgICAgICAgdGhlIGNoaWxkJ3MgcGFyZW50IGF0dHJpYnV0ZSBhcHByb3ByaWF0ZWx5LgorICAgICAgICAiIiIKKyAgICAgICAgY2hpbGQucGFyZW50ID0gc2VsZgorICAgICAgICBzZWxmLmNoaWxkcmVuLmluc2VydChpLCBjaGlsZCkKKyAgICAgICAgc2VsZi5jaGFuZ2VkKCkKKworICAgIGRlZiBhcHBlbmRfY2hpbGQoc2VsZiwgY2hpbGQpOgorICAgICAgICAiIiIKKyAgICAgICAgRXF1aXZhbGVudCB0byAnbm9kZS5jaGlsZHJlbi5hcHBlbmQoY2hpbGQpJy4gVGhpcyBtZXRob2QgYWxzbyBzZXRzIHRoZQorICAgICAgICBjaGlsZCdzIHBhcmVudCBhdHRyaWJ1dGUgYXBwcm9wcmlhdGVseS4KKyAgICAgICAgIiIiCisgICAgICAgIGNoaWxkLnBhcmVudCA9IHNlbGYKKyAgICAgICAgc2VsZi5jaGlsZHJlbi5hcHBlbmQoY2hpbGQpCisgICAgICAgIHNlbGYuY2hhbmdlZCgpCisKKworY2xhc3MgTGVhZihCYXNlKToKKworICAgICIiIkNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGZvciBsZWFmIG5vZGVzLiIiIgorCisgICAgIyBEZWZhdWx0IHZhbHVlcyBmb3IgaW5zdGFuY2UgdmFyaWFibGVzCisgICAgX3ByZWZpeCA9ICIiICAjIFdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIHByZWNlZGluZyB0aGlzIHRva2VuIGluIHRoZSBpbnB1dAorICAgIGxpbmVubyA9IDAgICAgIyBMaW5lIHdoZXJlIHRoaXMgdG9rZW4gc3RhcnRzIGluIHRoZSBpbnB1dAorICAgIGNvbHVtbiA9IDAgICAgIyBDb2x1bW4gd2hlcmUgdGhpcyB0b2tlbiB0YXJ0cyBpbiB0aGUgaW5wdXQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgY29udGV4dD1Ob25lLAorICAgICAgICAgICAgICAgICBwcmVmaXg9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZml4ZXJzX2FwcGxpZWQ9W10pOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZXIuCisKKyAgICAgICAgVGFrZXMgYSB0eXBlIGNvbnN0YW50IChhIHRva2VuIG51bWJlciA8IDI1NiksIGEgc3RyaW5nIHZhbHVlLCBhbmQgYW4KKyAgICAgICAgb3B0aW9uYWwgY29udGV4dCBrZXl3b3JkIGFyZ3VtZW50LgorICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IDAgPD0gdHlwZSA8IDI1NiwgdHlwZQorICAgICAgICBpZiBjb250ZXh0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fcHJlZml4LCAoc2VsZi5saW5lbm8sIHNlbGYuY29sdW1uKSA9IGNvbnRleHQKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgaWYgcHJlZml4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fcHJlZml4ID0gcHJlZml4CisgICAgICAgIHNlbGYuZml4ZXJzX2FwcGxpZWQgPSBmaXhlcnNfYXBwbGllZFs6XQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiIiIgorICAgICAgICByZXR1cm4gIiVzKCVyLCAlcikiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZhbHVlKQorCisgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgcHJldHR5IHN0cmluZyByZXByZXNlbnRhdGlvbi4KKworICAgICAgICBUaGlzIHJlcHJvZHVjZXMgdGhlIGlucHV0IHNvdXJjZSBleGFjdGx5LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucHJlZml4ICsgdW5pY29kZShzZWxmLnZhbHVlKQorCisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+ICgzLCAwKToKKyAgICAgICAgX19zdHJfXyA9IF9fdW5pY29kZV9fCisKKyAgICBkZWYgX2VxKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQ29tcGFyZSB0d28gbm9kZXMgZm9yIGVxdWFsaXR5LiIiIgorICAgICAgICByZXR1cm4gKHNlbGYudHlwZSwgc2VsZi52YWx1ZSkgPT0gKG90aGVyLnR5cGUsIG90aGVyLnZhbHVlKQorCisgICAgZGVmIGNsb25lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBjbG9uZWQgKGRlZXApIGNvcHkgb2Ygc2VsZi4iIiIKKyAgICAgICAgcmV0dXJuIExlYWYoc2VsZi50eXBlLCBzZWxmLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAoc2VsZi5wcmVmaXgsIChzZWxmLmxpbmVubywgc2VsZi5jb2x1bW4pKSwKKyAgICAgICAgICAgICAgICAgICAgZml4ZXJzX2FwcGxpZWQ9c2VsZi5maXhlcnNfYXBwbGllZCkKKworICAgIGRlZiBsZWF2ZXMoc2VsZik6CisgICAgICAgIHlpZWxkIHNlbGYKKworICAgIGRlZiBwb3N0X29yZGVyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBwb3N0LW9yZGVyIGl0ZXJhdG9yIGZvciB0aGUgdHJlZS4iIiIKKyAgICAgICAgeWllbGQgc2VsZgorCisgICAgZGVmIHByZV9vcmRlcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgcHJlLW9yZGVyIGl0ZXJhdG9yIGZvciB0aGUgdHJlZS4iIiIKKyAgICAgICAgeWllbGQgc2VsZgorCisgICAgZGVmIF9wcmVmaXhfZ2V0dGVyKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhlIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIHByZWNlZGluZyB0aGlzIHRva2VuIGluIHRoZSBpbnB1dC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9wcmVmaXgKKworICAgIGRlZiBfcHJlZml4X3NldHRlcihzZWxmLCBwcmVmaXgpOgorICAgICAgICBzZWxmLmNoYW5nZWQoKQorICAgICAgICBzZWxmLl9wcmVmaXggPSBwcmVmaXgKKworICAgIHByZWZpeCA9IHByb3BlcnR5KF9wcmVmaXhfZ2V0dGVyLCBfcHJlZml4X3NldHRlcikKKworZGVmIGNvbnZlcnQoZ3IsIHJhd19ub2RlKToKKyAgICAiIiIKKyAgICBDb252ZXJ0IHJhdyBub2RlIGluZm9ybWF0aW9uIHRvIGEgTm9kZSBvciBMZWFmIGluc3RhbmNlLgorCisgICAgVGhpcyBpcyBwYXNzZWQgdG8gdGhlIHBhcnNlciBkcml2ZXIgd2hpY2ggY2FsbHMgaXQgd2hlbmV2ZXIgYSByZWR1Y3Rpb24gb2YgYQorICAgIGdyYW1tYXIgcnVsZSBwcm9kdWNlcyBhIG5ldyBjb21wbGV0ZSBub2RlLCBzbyB0aGF0IHRoZSB0cmVlIGlzIGJ1aWxkCisgICAgc3RyaWN0bHkgYm90dG9tLXVwLgorICAgICIiIgorICAgIHR5cGUsIHZhbHVlLCBjb250ZXh0LCBjaGlsZHJlbiA9IHJhd19ub2RlCisgICAgaWYgY2hpbGRyZW4gb3IgdHlwZSBpbiBnci5udW1iZXIyc3ltYm9sOgorICAgICAgICAjIElmIHRoZXJlJ3MgZXhhY3RseSBvbmUgY2hpbGQsIHJldHVybiB0aGF0IGNoaWxkIGluc3RlYWQgb2YKKyAgICAgICAgIyBjcmVhdGluZyBhIG5ldyBub2RlLgorICAgICAgICBpZiBsZW4oY2hpbGRyZW4pID09IDE6CisgICAgICAgICAgICByZXR1cm4gY2hpbGRyZW5bMF0KKyAgICAgICAgcmV0dXJuIE5vZGUodHlwZSwgY2hpbGRyZW4sIGNvbnRleHQ9Y29udGV4dCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTGVhZih0eXBlLCB2YWx1ZSwgY29udGV4dD1jb250ZXh0KQorCisKK2NsYXNzIEJhc2VQYXR0ZXJuKG9iamVjdCk6CisKKyAgICAiIiIKKyAgICBBIHBhdHRlcm4gaXMgYSB0cmVlIG1hdGNoaW5nIHBhdHRlcm4uCisKKyAgICBJdCBsb29rcyBmb3IgYSBzcGVjaWZpYyBub2RlIHR5cGUgKHRva2VuIG9yIHN5bWJvbCksIGFuZAorICAgIG9wdGlvbmFsbHkgZm9yIGEgc3BlY2lmaWMgY29udGVudC4KKworICAgIFRoaXMgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcy4gIFRoZXJlIGFyZSB0aHJlZSBjb25jcmV0ZQorICAgIHN1YmNsYXNzZXM6CisKKyAgICAtIExlYWZQYXR0ZXJuIG1hdGNoZXMgYSBzaW5nbGUgbGVhZiBub2RlOworICAgIC0gTm9kZVBhdHRlcm4gbWF0Y2hlcyBhIHNpbmdsZSBub2RlICh1c3VhbGx5IG5vbi1sZWFmKTsKKyAgICAtIFdpbGRjYXJkUGF0dGVybiBtYXRjaGVzIGEgc2VxdWVuY2Ugb2Ygbm9kZXMgb2YgdmFyaWFibGUgbGVuZ3RoLgorICAgICIiIgorCisgICAgIyBEZWZhdWx0cyBmb3IgaW5zdGFuY2UgdmFyaWFibGVzCisgICAgdHlwZSA9IE5vbmUgICAgICMgTm9kZSB0eXBlICh0b2tlbiBpZiA8IDI1Niwgc3ltYm9sIGlmID49IDI1NikKKyAgICBjb250ZW50ID0gTm9uZSAgIyBPcHRpb25hbCBjb250ZW50IG1hdGNoaW5nIHBhdHRlcm4KKyAgICBuYW1lID0gTm9uZSAgICAgIyBPcHRpb25hbCBuYW1lIHVzZWQgdG8gc3RvcmUgbWF0Y2ggaW4gcmVzdWx0cyBkaWN0CisKKyAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICAiIiJDb25zdHJ1Y3RvciB0aGF0IHByZXZlbnRzIEJhc2VQYXR0ZXJuIGZyb20gYmVpbmcgaW5zdGFudGlhdGVkLiIiIgorICAgICAgICBhc3NlcnQgY2xzIGlzIG5vdCBCYXNlUGF0dGVybiwgIkNhbm5vdCBpbnN0YW50aWF0ZSBCYXNlUGF0dGVybiIKKyAgICAgICAgcmV0dXJuIG9iamVjdC5fX25ld19fKGNscykKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgYXJncyA9IFt0eXBlX3JlcHIoc2VsZi50eXBlKSwgc2VsZi5jb250ZW50LCBzZWxmLm5hbWVdCisgICAgICAgIHdoaWxlIGFyZ3MgYW5kIGFyZ3NbLTFdIGlzIE5vbmU6CisgICAgICAgICAgICBkZWwgYXJnc1stMV0KKyAgICAgICAgcmV0dXJuICIlcyglcykiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAiLCAiLmpvaW4obWFwKHJlcHIsIGFyZ3MpKSkKKworICAgIGRlZiBvcHRpbWl6ZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEEgc3ViY2xhc3MgY2FuIGRlZmluZSB0aGlzIGFzIGEgaG9vayBmb3Igb3B0aW1pemF0aW9ucy4KKworICAgICAgICBSZXR1cm5zIGVpdGhlciBzZWxmIG9yIGFub3RoZXIgbm9kZSB3aXRoIHRoZSBzYW1lIGVmZmVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbWF0Y2goc2VsZiwgbm9kZSwgcmVzdWx0cz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIERvZXMgdGhpcyBwYXR0ZXJuIGV4YWN0bHkgbWF0Y2ggYSBub2RlPworCisgICAgICAgIFJldHVybnMgVHJ1ZSBpZiBpdCBtYXRjaGVzLCBGYWxzZSBpZiBub3QuCisKKyAgICAgICAgSWYgcmVzdWx0cyBpcyBub3QgTm9uZSwgaXQgbXVzdCBiZSBhIGRpY3Qgd2hpY2ggd2lsbCBiZQorICAgICAgICB1cGRhdGVkIHdpdGggdGhlIG5vZGVzIG1hdGNoaW5nIG5hbWVkIHN1YnBhdHRlcm5zLgorCisgICAgICAgIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIG5vbi13aWxkY2FyZCBwYXR0ZXJucy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYudHlwZSBpcyBub3QgTm9uZSBhbmQgbm9kZS50eXBlICE9IHNlbGYudHlwZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLmNvbnRlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByID0gTm9uZQorICAgICAgICAgICAgaWYgcmVzdWx0cyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByID0ge30KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zdWJtYXRjaChub2RlLCByKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIHI6CisgICAgICAgICAgICAgICAgcmVzdWx0cy51cGRhdGUocikKKyAgICAgICAgaWYgcmVzdWx0cyBpcyBub3QgTm9uZSBhbmQgc2VsZi5uYW1lOgorICAgICAgICAgICAgcmVzdWx0c1tzZWxmLm5hbWVdID0gbm9kZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIG1hdGNoX3NlcShzZWxmLCBub2RlcywgcmVzdWx0cz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIERvZXMgdGhpcyBwYXR0ZXJuIGV4YWN0bHkgbWF0Y2ggYSBzZXF1ZW5jZSBvZiBub2Rlcz8KKworICAgICAgICBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBub24td2lsZGNhcmQgcGF0dGVybnMuCisgICAgICAgICIiIgorICAgICAgICBpZiBsZW4obm9kZXMpICE9IDE6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIHNlbGYubWF0Y2gobm9kZXNbMF0sIHJlc3VsdHMpCisKKyAgICBkZWYgZ2VuZXJhdGVfbWF0Y2hlcyhzZWxmLCBub2Rlcyk6CisgICAgICAgICIiIgorICAgICAgICBHZW5lcmF0b3IgeWllbGRpbmcgYWxsIG1hdGNoZXMgZm9yIHRoaXMgcGF0dGVybi4KKworICAgICAgICBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBub24td2lsZGNhcmQgcGF0dGVybnMuCisgICAgICAgICIiIgorICAgICAgICByID0ge30KKyAgICAgICAgaWYgbm9kZXMgYW5kIHNlbGYubWF0Y2gobm9kZXNbMF0sIHIpOgorICAgICAgICAgICAgeWllbGQgMSwgcgorCisKK2NsYXNzIExlYWZQYXR0ZXJuKEJhc2VQYXR0ZXJuKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPU5vbmUsIGNvbnRlbnQ9Tm9uZSwgbmFtZT1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemVyLiAgVGFrZXMgb3B0aW9uYWwgdHlwZSwgY29udGVudCwgYW5kIG5hbWUuCisKKyAgICAgICAgVGhlIHR5cGUsIGlmIGdpdmVuIG11c3QgYmUgYSB0b2tlbiB0eXBlICg8IDI1NikuICBJZiBub3QgZ2l2ZW4sCisgICAgICAgIHRoaXMgbWF0Y2hlcyBhbnkgKmxlYWYqIG5vZGU7IHRoZSBjb250ZW50IG1heSBzdGlsbCBiZSByZXF1aXJlZC4KKworICAgICAgICBUaGUgY29udGVudCwgaWYgZ2l2ZW4sIG11c3QgYmUgYSBzdHJpbmcuCisKKyAgICAgICAgSWYgYSBuYW1lIGlzIGdpdmVuLCB0aGUgbWF0Y2hpbmcgbm9kZSBpcyBzdG9yZWQgaW4gdGhlIHJlc3VsdHMKKyAgICAgICAgZGljdCB1bmRlciB0aGF0IGtleS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHR5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhc3NlcnQgMCA8PSB0eXBlIDwgMjU2LCB0eXBlCisgICAgICAgIGlmIGNvbnRlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShjb250ZW50LCBiYXNlc3RyaW5nKSwgcmVwcihjb250ZW50KQorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgICAgIHNlbGYuY29udGVudCA9IGNvbnRlbnQKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorCisgICAgZGVmIG1hdGNoKHNlbGYsIG5vZGUsIHJlc3VsdHM9Tm9uZSk6CisgICAgICAgICIiIk92ZXJyaWRlIG1hdGNoKCkgdG8gaW5zaXN0IG9uIGEgbGVhZiBub2RlLiIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCBMZWFmKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gQmFzZVBhdHRlcm4ubWF0Y2goc2VsZiwgbm9kZSwgcmVzdWx0cykKKworICAgIGRlZiBfc3VibWF0Y2goc2VsZiwgbm9kZSwgcmVzdWx0cz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIE1hdGNoIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgbm9kZSdzIGNoaWxkcmVuLgorCisgICAgICAgIFRoaXMgYXNzdW1lcyB0aGUgbm9kZSB0eXBlIG1hdGNoZXMgYW5kIHNlbGYuY29udGVudCBpcyBub3QgTm9uZS4KKworICAgICAgICBSZXR1cm5zIFRydWUgaWYgaXQgbWF0Y2hlcywgRmFsc2UgaWYgbm90LgorCisgICAgICAgIElmIHJlc3VsdHMgaXMgbm90IE5vbmUsIGl0IG11c3QgYmUgYSBkaWN0IHdoaWNoIHdpbGwgYmUKKyAgICAgICAgdXBkYXRlZCB3aXRoIHRoZSBub2RlcyBtYXRjaGluZyBuYW1lZCBzdWJwYXR0ZXJucy4KKworICAgICAgICBXaGVuIHJldHVybmluZyBGYWxzZSwgdGhlIHJlc3VsdHMgZGljdCBtYXkgc3RpbGwgYmUgdXBkYXRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmNvbnRlbnQgPT0gbm9kZS52YWx1ZQorCisKK2NsYXNzIE5vZGVQYXR0ZXJuKEJhc2VQYXR0ZXJuKToKKworICAgIHdpbGRjYXJkcyA9IEZhbHNlCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1Ob25lLCBjb250ZW50PU5vbmUsIG5hbWU9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplci4gIFRha2VzIG9wdGlvbmFsIHR5cGUsIGNvbnRlbnQsIGFuZCBuYW1lLgorCisgICAgICAgIFRoZSB0eXBlLCBpZiBnaXZlbiwgbXVzdCBiZSBhIHN5bWJvbCB0eXBlICg+PSAyNTYpLiAgSWYgdGhlCisgICAgICAgIHR5cGUgaXMgTm9uZSB0aGlzIG1hdGNoZXMgKmFueSogc2luZ2xlIG5vZGUgKGxlYWYgb3Igbm90KSwKKyAgICAgICAgZXhjZXB0IGlmIGNvbnRlbnQgaXMgbm90IE5vbmUsIGluIHdoaWNoIGl0IG9ubHkgbWF0Y2hlcworICAgICAgICBub24tbGVhZiBub2RlcyB0aGF0IGFsc28gbWF0Y2ggdGhlIGNvbnRlbnQgcGF0dGVybi4KKworICAgICAgICBUaGUgY29udGVudCwgaWYgbm90IE5vbmUsIG11c3QgYmUgYSBzZXF1ZW5jZSBvZiBQYXR0ZXJucyB0aGF0CisgICAgICAgIG11c3QgbWF0Y2ggdGhlIG5vZGUncyBjaGlsZHJlbiBleGFjdGx5LiAgSWYgdGhlIGNvbnRlbnQgaXMKKyAgICAgICAgZ2l2ZW4sIHRoZSB0eXBlIG11c3Qgbm90IGJlIE5vbmUuCisKKyAgICAgICAgSWYgYSBuYW1lIGlzIGdpdmVuLCB0aGUgbWF0Y2hpbmcgbm9kZSBpcyBzdG9yZWQgaW4gdGhlIHJlc3VsdHMKKyAgICAgICAgZGljdCB1bmRlciB0aGF0IGtleS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHR5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhc3NlcnQgdHlwZSA+PSAyNTYsIHR5cGUKKyAgICAgICAgaWYgY29udGVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFzc2VydCBub3QgaXNpbnN0YW5jZShjb250ZW50LCBiYXNlc3RyaW5nKSwgcmVwcihjb250ZW50KQorICAgICAgICAgICAgY29udGVudCA9IGxpc3QoY29udGVudCkKKyAgICAgICAgICAgIGZvciBpLCBpdGVtIGluIGVudW1lcmF0ZShjb250ZW50KToKKyAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShpdGVtLCBCYXNlUGF0dGVybiksIChpLCBpdGVtKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgV2lsZGNhcmRQYXR0ZXJuKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53aWxkY2FyZHMgPSBUcnVlCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICAgICAgc2VsZi5jb250ZW50ID0gY29udGVudAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICBkZWYgX3N1Ym1hdGNoKHNlbGYsIG5vZGUsIHJlc3VsdHM9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBNYXRjaCB0aGUgcGF0dGVybidzIGNvbnRlbnQgdG8gdGhlIG5vZGUncyBjaGlsZHJlbi4KKworICAgICAgICBUaGlzIGFzc3VtZXMgdGhlIG5vZGUgdHlwZSBtYXRjaGVzIGFuZCBzZWxmLmNvbnRlbnQgaXMgbm90IE5vbmUuCisKKyAgICAgICAgUmV0dXJucyBUcnVlIGlmIGl0IG1hdGNoZXMsIEZhbHNlIGlmIG5vdC4KKworICAgICAgICBJZiByZXN1bHRzIGlzIG5vdCBOb25lLCBpdCBtdXN0IGJlIGEgZGljdCB3aGljaCB3aWxsIGJlCisgICAgICAgIHVwZGF0ZWQgd2l0aCB0aGUgbm9kZXMgbWF0Y2hpbmcgbmFtZWQgc3VicGF0dGVybnMuCisKKyAgICAgICAgV2hlbiByZXR1cm5pbmcgRmFsc2UsIHRoZSByZXN1bHRzIGRpY3QgbWF5IHN0aWxsIGJlIHVwZGF0ZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLndpbGRjYXJkczoKKyAgICAgICAgICAgIGZvciBjLCByIGluIGdlbmVyYXRlX21hdGNoZXMoc2VsZi5jb250ZW50LCBub2RlLmNoaWxkcmVuKToKKyAgICAgICAgICAgICAgICBpZiBjID09IGxlbihub2RlLmNoaWxkcmVuKToKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0cyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMudXBkYXRlKHIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgbGVuKHNlbGYuY29udGVudCkgIT0gbGVuKG5vZGUuY2hpbGRyZW4pOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBzdWJwYXR0ZXJuLCBjaGlsZCBpbiB6aXAoc2VsZi5jb250ZW50LCBub2RlLmNoaWxkcmVuKToKKyAgICAgICAgICAgIGlmIG5vdCBzdWJwYXR0ZXJuLm1hdGNoKGNoaWxkLCByZXN1bHRzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitjbGFzcyBXaWxkY2FyZFBhdHRlcm4oQmFzZVBhdHRlcm4pOgorCisgICAgIiIiCisgICAgQSB3aWxkY2FyZCBwYXR0ZXJuIGNhbiBtYXRjaCB6ZXJvIG9yIG1vcmUgbm9kZXMuCisKKyAgICBUaGlzIGhhcyBhbGwgdGhlIGZsZXhpYmlsaXR5IG5lZWRlZCB0byBpbXBsZW1lbnQgcGF0dGVybnMgbGlrZToKKworICAgIC4qICAgICAgLisgICAgICAuPyAgICAgIC57bSxufQorICAgIChhIGIgYyB8IGQgZSB8IGYpCisgICAgKC4uLikqICAoLi4uKSsgICguLi4pPyAgKC4uLil7bSxufQorCisgICAgZXhjZXB0IGl0IGFsd2F5cyB1c2VzIG5vbi1ncmVlZHkgbWF0Y2hpbmcuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29udGVudD1Ob25lLCBtaW49MCwgbWF4PUhVR0UsIG5hbWU9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplci4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgY29udGVudDogb3B0aW9uYWwgc2VxdWVuY2Ugb2Ygc3Vic2VxdWVuY2VzIG9mIHBhdHRlcm5zOworICAgICAgICAgICAgICAgICAgICAgaWYgYWJzZW50LCBtYXRjaGVzIG9uZSBub2RlOworICAgICAgICAgICAgICAgICAgICAgaWYgcHJlc2VudCwgZWFjaCBzdWJzZXF1ZW5jZSBpcyBhbiBhbHRlcm5hdGl2ZSBbKl0KKyAgICAgICAgICAgIG1pbjogb3B0aW9uYWwgbWluaW11bSBudW1iZXIgb2YgdGltZXMgdG8gbWF0Y2gsIGRlZmF1bHQgMAorICAgICAgICAgICAgbWF4OiBvcHRpb25hbCBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0byBtYXRjaCwgZGVmYXVsdCBIVUdFCisgICAgICAgICAgICBuYW1lOiBvcHRpb25hbCBuYW1lIGFzc2lnbmVkIHRvIHRoaXMgbWF0Y2gKKworICAgICAgICBbKl0gVGh1cywgaWYgY29udGVudCBpcyBbW2EsIGIsIGNdLCBbZCwgZV0sIFtmLCBnLCBoXV0gdGhpcyBpcworICAgICAgICAgICAgZXF1aXZhbGVudCB0byAoYSBiIGMgfCBkIGUgfCBmIGcgaCk7IGlmIGNvbnRlbnQgaXMgTm9uZSwKKyAgICAgICAgICAgIHRoaXMgaXMgZXF1aXZhbGVudCB0byAnLicgaW4gcmVndWxhciBleHByZXNzaW9uIHRlcm1zLgorICAgICAgICAgICAgVGhlIG1pbiBhbmQgbWF4IHBhcmFtZXRlcnMgd29yayBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgIG1pbj0wLCBtYXg9bWF4aW50OiAuKgorICAgICAgICAgICAgICAgIG1pbj0xLCBtYXg9bWF4aW50OiAuKworICAgICAgICAgICAgICAgIG1pbj0wLCBtYXg9MTogLj8KKyAgICAgICAgICAgICAgICBtaW49MSwgbWF4PTE6IC4KKyAgICAgICAgICAgIElmIGNvbnRlbnQgaXMgbm90IE5vbmUsIHJlcGxhY2UgdGhlIGRvdCB3aXRoIHRoZSBwYXJlbnRoZXNpemVkCisgICAgICAgICAgICBsaXN0IG9mIGFsdGVybmF0aXZlcywgZS5nLiAoYSBiIGMgfCBkIGUgfCBmIGcgaCkqCisgICAgICAgICIiIgorICAgICAgICBhc3NlcnQgMCA8PSBtaW4gPD0gbWF4IDw9IEhVR0UsIChtaW4sIG1heCkKKyAgICAgICAgaWYgY29udGVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvbnRlbnQgPSB0dXBsZShtYXAodHVwbGUsIGNvbnRlbnQpKSAgIyBQcm90ZWN0IGFnYWluc3QgYWx0ZXJhdGlvbnMKKyAgICAgICAgICAgICMgQ2hlY2sgc2FuaXR5IG9mIGFsdGVybmF0aXZlcworICAgICAgICAgICAgYXNzZXJ0IGxlbihjb250ZW50KSwgcmVwcihjb250ZW50KSAgIyBDYW4ndCBoYXZlIHplcm8gYWx0ZXJuYXRpdmVzCisgICAgICAgICAgICBmb3IgYWx0IGluIGNvbnRlbnQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGxlbihhbHQpLCByZXByKGFsdCkgIyBDYW4gaGF2ZSBlbXB0eSBhbHRlcm5hdGl2ZXMKKyAgICAgICAgc2VsZi5jb250ZW50ID0gY29udGVudAorICAgICAgICBzZWxmLm1pbiA9IG1pbgorICAgICAgICBzZWxmLm1heCA9IG1heAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICBkZWYgb3B0aW1pemUoc2VsZik6CisgICAgICAgICIiIk9wdGltaXplIGNlcnRhaW4gc3RhY2tlZCB3aWxkY2FyZCBwYXR0ZXJucy4iIiIKKyAgICAgICAgc3VicGF0dGVybiA9IE5vbmUKKyAgICAgICAgaWYgKHNlbGYuY29udGVudCBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgIGxlbihzZWxmLmNvbnRlbnQpID09IDEgYW5kIGxlbihzZWxmLmNvbnRlbnRbMF0pID09IDEpOgorICAgICAgICAgICAgc3VicGF0dGVybiA9IHNlbGYuY29udGVudFswXVswXQorICAgICAgICBpZiBzZWxmLm1pbiA9PSAxIGFuZCBzZWxmLm1heCA9PSAxOgorICAgICAgICAgICAgaWYgc2VsZi5jb250ZW50IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vZGVQYXR0ZXJuKG5hbWU9c2VsZi5uYW1lKQorICAgICAgICAgICAgaWYgc3VicGF0dGVybiBpcyBub3QgTm9uZSBhbmQgIHNlbGYubmFtZSA9PSBzdWJwYXR0ZXJuLm5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnBhdHRlcm4ub3B0aW1pemUoKQorICAgICAgICBpZiAoc2VsZi5taW4gPD0gMSBhbmQgaXNpbnN0YW5jZShzdWJwYXR0ZXJuLCBXaWxkY2FyZFBhdHRlcm4pIGFuZAorICAgICAgICAgICAgc3VicGF0dGVybi5taW4gPD0gMSBhbmQgc2VsZi5uYW1lID09IHN1YnBhdHRlcm4ubmFtZSk6CisgICAgICAgICAgICByZXR1cm4gV2lsZGNhcmRQYXR0ZXJuKHN1YnBhdHRlcm4uY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5taW4qc3VicGF0dGVybi5taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWF4KnN1YnBhdHRlcm4ubWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXR0ZXJuLm5hbWUpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbWF0Y2goc2VsZiwgbm9kZSwgcmVzdWx0cz1Ob25lKToKKyAgICAgICAgIiIiRG9lcyB0aGlzIHBhdHRlcm4gZXhhY3RseSBtYXRjaCBhIG5vZGU/IiIiCisgICAgICAgIHJldHVybiBzZWxmLm1hdGNoX3NlcShbbm9kZV0sIHJlc3VsdHMpCisKKyAgICBkZWYgbWF0Y2hfc2VxKHNlbGYsIG5vZGVzLCByZXN1bHRzPU5vbmUpOgorICAgICAgICAiIiJEb2VzIHRoaXMgcGF0dGVybiBleGFjdGx5IG1hdGNoIGEgc2VxdWVuY2Ugb2Ygbm9kZXM/IiIiCisgICAgICAgIGZvciBjLCByIGluIHNlbGYuZ2VuZXJhdGVfbWF0Y2hlcyhub2Rlcyk6CisgICAgICAgICAgICBpZiBjID09IGxlbihub2Rlcyk6CisgICAgICAgICAgICAgICAgaWYgcmVzdWx0cyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy51cGRhdGUocikKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tzZWxmLm5hbWVdID0gbGlzdChub2RlcykKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBnZW5lcmF0ZV9tYXRjaGVzKHNlbGYsIG5vZGVzKToKKyAgICAgICAgIiIiCisgICAgICAgIEdlbmVyYXRvciB5aWVsZGluZyBtYXRjaGVzIGZvciBhIHNlcXVlbmNlIG9mIG5vZGVzLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBub2Rlczogc2VxdWVuY2Ugb2Ygbm9kZXMKKworICAgICAgICBZaWVsZHM6CisgICAgICAgICAgICAoY291bnQsIHJlc3VsdHMpIHR1cGxlcyB3aGVyZToKKyAgICAgICAgICAgIGNvdW50OiB0aGUgbWF0Y2ggY29tcHJpc2VzIG5vZGVzWzpjb3VudF07CisgICAgICAgICAgICByZXN1bHRzOiBkaWN0IGNvbnRhaW5pbmcgbmFtZWQgc3VibWF0Y2hlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY29udGVudCBpcyBOb25lOgorICAgICAgICAgICAgIyBTaG9ydGN1dCBmb3Igc3BlY2lhbCBjYXNlIChzZWUgX19pbml0X18uX19kb2NfXykKKyAgICAgICAgICAgIGZvciBjb3VudCBpbiB4cmFuZ2Uoc2VsZi5taW4sIDEgKyBtaW4obGVuKG5vZGVzKSwgc2VsZi5tYXgpKToKKyAgICAgICAgICAgICAgICByID0ge30KKyAgICAgICAgICAgICAgICBpZiBzZWxmLm5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJbc2VsZi5uYW1lXSA9IG5vZGVzWzpjb3VudF0KKyAgICAgICAgICAgICAgICB5aWVsZCBjb3VudCwgcgorICAgICAgICBlbGlmIHNlbGYubmFtZSA9PSAiYmFyZV9uYW1lIjoKKyAgICAgICAgICAgIHlpZWxkIHNlbGYuX2JhcmVfbmFtZV9tYXRjaGVzKG5vZGVzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgaGl0dGluZyB0aGUgcmVjdXJzaW9uIGxpbWl0IHVzdWFsbHkKKyAgICAgICAgICAgICMgcmVzdWx0cyBpbiBzb21lIHVnbHkgbWVzc2FnZXMgYWJvdXQgaG93IFJ1bnRpbWVFcnJvcnMgYXJlIGJlaW5nCisgICAgICAgICAgICAjIGlnbm9yZWQuIFdlIGRvbid0IGRvIHRoaXMgb24gbm9uLUNQeXRob24gaW1wbGVtZW50YXRpb24gYmVjYXVzZQorICAgICAgICAgICAgIyB0aGV5IGRvbid0IGhhdmUgdGhpcyBwcm9ibGVtLgorICAgICAgICAgICAgaWYgaGFzYXR0cihzeXMsICJnZXRyZWZjb3VudCIpOgorICAgICAgICAgICAgICAgIHNhdmVfc3RkZXJyID0gc3lzLnN0ZGVycgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBTdHJpbmdJTygpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9yIGNvdW50LCByIGluIHNlbGYuX3JlY3Vyc2l2ZV9tYXRjaGVzKG5vZGVzLCAwKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgcltzZWxmLm5hbWVdID0gbm9kZXNbOmNvdW50XQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBjb3VudCwgcgorICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFdlIGZhbGwgYmFjayB0byB0aGUgaXRlcmF0aXZlIHBhdHRlcm4gbWF0Y2hpbmcgc2NoZW1lIGlmIHRoZSByZWN1cnNpdmUKKyAgICAgICAgICAgICAgICAjIHNjaGVtZSBoaXRzIHRoZSByZWN1cnNpb24gbGltaXQuCisgICAgICAgICAgICAgICAgZm9yIGNvdW50LCByIGluIHNlbGYuX2l0ZXJhdGl2ZV9tYXRjaGVzKG5vZGVzKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgcltzZWxmLm5hbWVdID0gbm9kZXNbOmNvdW50XQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBjb3VudCwgcgorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHN5cywgImdldHJlZmNvdW50Iik6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzYXZlX3N0ZGVycgorCisgICAgZGVmIF9pdGVyYXRpdmVfbWF0Y2hlcyhzZWxmLCBub2Rlcyk6CisgICAgICAgICIiIkhlbHBlciB0byBpdGVyYXRpdmVseSB5aWVsZCB0aGUgbWF0Y2hlcy4iIiIKKyAgICAgICAgbm9kZWxlbiA9IGxlbihub2RlcykKKyAgICAgICAgaWYgMCA+PSBzZWxmLm1pbjoKKyAgICAgICAgICAgIHlpZWxkIDAsIHt9CisKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgICMgZ2VuZXJhdGUgbWF0Y2hlcyB0aGF0IHVzZSBqdXN0IG9uZSBhbHQgZnJvbSBzZWxmLmNvbnRlbnQKKyAgICAgICAgZm9yIGFsdCBpbiBzZWxmLmNvbnRlbnQ6CisgICAgICAgICAgICBmb3IgYywgciBpbiBnZW5lcmF0ZV9tYXRjaGVzKGFsdCwgbm9kZXMpOgorICAgICAgICAgICAgICAgIHlpZWxkIGMsIHIKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgoYywgcikpCisKKyAgICAgICAgIyBmb3IgZWFjaCBtYXRjaCwgaXRlcmF0ZSBkb3duIHRoZSBub2RlcworICAgICAgICB3aGlsZSByZXN1bHRzOgorICAgICAgICAgICAgbmV3X3Jlc3VsdHMgPSBbXQorICAgICAgICAgICAgZm9yIGMwLCByMCBpbiByZXN1bHRzOgorICAgICAgICAgICAgICAgICMgc3RvcCBpZiB0aGUgZW50aXJlIHNldCBvZiBub2RlcyBoYXMgYmVlbiBtYXRjaGVkCisgICAgICAgICAgICAgICAgaWYgYzAgPCBub2RlbGVuIGFuZCBjMCA8PSBzZWxmLm1heDoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGFsdCBpbiBzZWxmLmNvbnRlbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYzEsIHIxIGluIGdlbmVyYXRlX21hdGNoZXMoYWx0LCBub2Rlc1tjMDpdKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjMSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnVwZGF0ZShyMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci51cGRhdGUocjEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGMwICsgYzEsIHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3Jlc3VsdHMuYXBwZW5kKChjMCArIGMxLCByKSkKKyAgICAgICAgICAgIHJlc3VsdHMgPSBuZXdfcmVzdWx0cworCisgICAgZGVmIF9iYXJlX25hbWVfbWF0Y2hlcyhzZWxmLCBub2Rlcyk6CisgICAgICAgICIiIlNwZWNpYWwgb3B0aW1pemVkIG1hdGNoZXIgZm9yIGJhcmVfbmFtZS4iIiIKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHIgPSB7fQorICAgICAgICBkb25lID0gRmFsc2UKKyAgICAgICAgbWF4ID0gbGVuKG5vZGVzKQorICAgICAgICB3aGlsZSBub3QgZG9uZSBhbmQgY291bnQgPCBtYXg6CisgICAgICAgICAgICBkb25lID0gVHJ1ZQorICAgICAgICAgICAgZm9yIGxlYWYgaW4gc2VsZi5jb250ZW50OgorICAgICAgICAgICAgICAgIGlmIGxlYWZbMF0ubWF0Y2gobm9kZXNbY291bnRdLCByKToKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgICAgICAgICBkb25lID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcltzZWxmLm5hbWVdID0gbm9kZXNbOmNvdW50XQorICAgICAgICByZXR1cm4gY291bnQsIHIKKworICAgIGRlZiBfcmVjdXJzaXZlX21hdGNoZXMoc2VsZiwgbm9kZXMsIGNvdW50KToKKyAgICAgICAgIiIiSGVscGVyIHRvIHJlY3Vyc2l2ZWx5IHlpZWxkIHRoZSBtYXRjaGVzLiIiIgorICAgICAgICBhc3NlcnQgc2VsZi5jb250ZW50IGlzIG5vdCBOb25lCisgICAgICAgIGlmIGNvdW50ID49IHNlbGYubWluOgorICAgICAgICAgICAgeWllbGQgMCwge30KKyAgICAgICAgaWYgY291bnQgPCBzZWxmLm1heDoKKyAgICAgICAgICAgIGZvciBhbHQgaW4gc2VsZi5jb250ZW50OgorICAgICAgICAgICAgICAgIGZvciBjMCwgcjAgaW4gZ2VuZXJhdGVfbWF0Y2hlcyhhbHQsIG5vZGVzKToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGMxLCByMSBpbiBzZWxmLl9yZWN1cnNpdmVfbWF0Y2hlcyhub2Rlc1tjMDpdLCBjb3VudCsxKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgci51cGRhdGUocjApCisgICAgICAgICAgICAgICAgICAgICAgICByLnVwZGF0ZShyMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGMwICsgYzEsIHIKKworCitjbGFzcyBOZWdhdGVkUGF0dGVybihCYXNlUGF0dGVybik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29udGVudD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemVyLgorCisgICAgICAgIFRoZSBhcmd1bWVudCBpcyBlaXRoZXIgYSBwYXR0ZXJuIG9yIE5vbmUuICBJZiBpdCBpcyBOb25lLCB0aGlzCisgICAgICAgIG9ubHkgbWF0Y2hlcyBhbiBlbXB0eSBzZXF1ZW5jZSAoZWZmZWN0aXZlbHkgJyQnIGluIHJlZ2V4CisgICAgICAgIGxpbmdvKS4gIElmIGl0IGlzIG5vdCBOb25lLCB0aGlzIG1hdGNoZXMgd2hlbmV2ZXIgdGhlIGFyZ3VtZW50CisgICAgICAgIHBhdHRlcm4gZG9lc24ndCBoYXZlIGFueSBtYXRjaGVzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgY29udGVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGNvbnRlbnQsIEJhc2VQYXR0ZXJuKSwgcmVwcihjb250ZW50KQorICAgICAgICBzZWxmLmNvbnRlbnQgPSBjb250ZW50CisKKyAgICBkZWYgbWF0Y2goc2VsZiwgbm9kZSk6CisgICAgICAgICMgV2UgbmV2ZXIgbWF0Y2ggYSBub2RlIGluIGl0cyBlbnRpcmV0eQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBtYXRjaF9zZXEoc2VsZiwgbm9kZXMpOgorICAgICAgICAjIFdlIG9ubHkgbWF0Y2ggYW4gZW1wdHkgc2VxdWVuY2Ugb2Ygbm9kZXMgaW4gaXRzIGVudGlyZXR5CisgICAgICAgIHJldHVybiBsZW4obm9kZXMpID09IDAKKworICAgIGRlZiBnZW5lcmF0ZV9tYXRjaGVzKHNlbGYsIG5vZGVzKToKKyAgICAgICAgaWYgc2VsZi5jb250ZW50IGlzIE5vbmU6CisgICAgICAgICAgICAjIFJldHVybiBhIG1hdGNoIGlmIHRoZXJlIGlzIGFuIGVtcHR5IHNlcXVlbmNlCisgICAgICAgICAgICBpZiBsZW4obm9kZXMpID09IDA6CisgICAgICAgICAgICAgICAgeWllbGQgMCwge30KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgUmV0dXJuIGEgbWF0Y2ggaWYgdGhlIGFyZ3VtZW50IHBhdHRlcm4gaGFzIG5vIG1hdGNoZXMKKyAgICAgICAgICAgIGZvciBjLCByIGluIHNlbGYuY29udGVudC5nZW5lcmF0ZV9tYXRjaGVzKG5vZGVzKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHlpZWxkIDAsIHt9CisKKworZGVmIGdlbmVyYXRlX21hdGNoZXMocGF0dGVybnMsIG5vZGVzKToKKyAgICAiIiIKKyAgICBHZW5lcmF0b3IgeWllbGRpbmcgbWF0Y2hlcyBmb3IgYSBzZXF1ZW5jZSBvZiBwYXR0ZXJucyBhbmQgbm9kZXMuCisKKyAgICBBcmdzOgorICAgICAgICBwYXR0ZXJuczogYSBzZXF1ZW5jZSBvZiBwYXR0ZXJucworICAgICAgICBub2RlczogYSBzZXF1ZW5jZSBvZiBub2RlcworCisgICAgWWllbGRzOgorICAgICAgICAoY291bnQsIHJlc3VsdHMpIHR1cGxlcyB3aGVyZToKKyAgICAgICAgY291bnQ6IHRoZSBlbnRpcmUgc2VxdWVuY2Ugb2YgcGF0dGVybnMgbWF0Y2hlcyBub2Rlc1s6Y291bnRdOworICAgICAgICByZXN1bHRzOiBkaWN0IGNvbnRhaW5pbmcgbmFtZWQgc3VibWF0Y2hlcy4KKyAgICAgICAgIiIiCisgICAgaWYgbm90IHBhdHRlcm5zOgorICAgICAgICB5aWVsZCAwLCB7fQorICAgIGVsc2U6CisgICAgICAgIHAsIHJlc3QgPSBwYXR0ZXJuc1swXSwgcGF0dGVybnNbMTpdCisgICAgICAgIGZvciBjMCwgcjAgaW4gcC5nZW5lcmF0ZV9tYXRjaGVzKG5vZGVzKToKKyAgICAgICAgICAgIGlmIG5vdCByZXN0OgorICAgICAgICAgICAgICAgIHlpZWxkIGMwLCByMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgYzEsIHIxIGluIGdlbmVyYXRlX21hdGNoZXMocmVzdCwgbm9kZXNbYzA6XSk6CisgICAgICAgICAgICAgICAgICAgIHIgPSB7fQorICAgICAgICAgICAgICAgICAgICByLnVwZGF0ZShyMCkKKyAgICAgICAgICAgICAgICAgICAgci51cGRhdGUocjEpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGMwICsgYzEsIHIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9weXRyZWUucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3B5dHJlZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJjNDBjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9weXRyZWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9weXRyZWUucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3B5dHJlZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1Y2EzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9weXRyZWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9yZWZhY3Rvci5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9yZWZhY3Rvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGMxNjhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3JlZmFjdG9yLnB5CkBAIC0wLDAgKzEsNzQ3IEBACisjIENvcHlyaWdodCAyMDA2IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIlJlZmFjdG9yaW5nIGZyYW1ld29yay4KKworVXNlZCBhcyBhIG1haW4gcHJvZ3JhbSwgdGhpcyBjYW4gcmVmYWN0b3IgYW55IG51bWJlciBvZiBmaWxlcyBhbmQvb3IKK3JlY3Vyc2l2ZWx5IGRlc2NlbmQgZG93biBkaXJlY3Rvcmllcy4gIEltcG9ydGVkIGFzIGEgbW9kdWxlLCB0aGlzCitwcm92aWRlcyBpbmZyYXN0cnVjdHVyZSB0byB3cml0ZSB5b3VyIG93biByZWZhY3RvcmluZyB0b29sLgorIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKKworX19hdXRob3JfXyA9ICJHdWlkbyB2YW4gUm9zc3VtIDxndWlkb0BweXRob24ub3JnPiIKKworCisjIFB5dGhvbiBpbXBvcnRzCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IFN0cmluZ0lPCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC5wZ2VuMiBpbXBvcnQgZHJpdmVyLCB0b2tlbml6ZSwgdG9rZW4KK2Zyb20gLmZpeGVyX3V0aWwgaW1wb3J0IGZpbmRfcm9vdAorZnJvbSAuIGltcG9ydCBweXRyZWUsIHB5Z3JhbQorZnJvbSAuIGltcG9ydCBidG1fdXRpbHMgYXMgYnUKK2Zyb20gLiBpbXBvcnQgYnRtX21hdGNoZXIgYXMgYm0KKworCitkZWYgZ2V0X2FsbF9maXhfbmFtZXMoZml4ZXJfcGtnLCByZW1vdmVfcHJlZml4PVRydWUpOgorICAgICIiIlJldHVybiBhIHNvcnRlZCBsaXN0IG9mIGFsbCBhdmFpbGFibGUgZml4IG5hbWVzIGluIHRoZSBnaXZlbiBwYWNrYWdlLiIiIgorICAgIHBrZyA9IF9faW1wb3J0X18oZml4ZXJfcGtnLCBbXSwgW10sIFsiKiJdKQorICAgIGZpeGVyX2RpciA9IG9zLnBhdGguZGlybmFtZShwa2cuX19maWxlX18pCisgICAgZml4X25hbWVzID0gW10KKyAgICBmb3IgbmFtZSBpbiBzb3J0ZWQob3MubGlzdGRpcihmaXhlcl9kaXIpKToKKyAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCJmaXhfIikgYW5kIG5hbWUuZW5kc3dpdGgoIi5weSIpOgorICAgICAgICAgICAgaWYgcmVtb3ZlX3ByZWZpeDoKKyAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVs0Ol0KKyAgICAgICAgICAgIGZpeF9uYW1lcy5hcHBlbmQobmFtZVs6LTNdKQorICAgIHJldHVybiBmaXhfbmFtZXMKKworCitjbGFzcyBfRXZlcnlOb2RlKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2RlZiBfZ2V0X2hlYWRfdHlwZXMocGF0KToKKyAgICAiIiIgQWNjZXB0cyBhIHB5dHJlZSBQYXR0ZXJuIE5vZGUgYW5kIHJldHVybnMgYSBzZXQKKyAgICAgICAgb2YgdGhlIHBhdHRlcm4gdHlwZXMgd2hpY2ggd2lsbCBtYXRjaCBmaXJzdC4gIiIiCisKKyAgICBpZiBpc2luc3RhbmNlKHBhdCwgKHB5dHJlZS5Ob2RlUGF0dGVybiwgcHl0cmVlLkxlYWZQYXR0ZXJuKSk6CisgICAgICAgICMgTm9kZVBhdHRlcnMgbXVzdCBlaXRoZXIgaGF2ZSBubyB0eXBlIGFuZCBubyBjb250ZW50CisgICAgICAgICMgICBvciBhIHR5cGUgYW5kIGNvbnRlbnQgLS0gc28gdGhleSBkb24ndCBnZXQgYW55IGZhcnRoZXIKKyAgICAgICAgIyBBbHdheXMgcmV0dXJuIGxlYWZzCisgICAgICAgIGlmIHBhdC50eXBlIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBfRXZlcnlOb2RlCisgICAgICAgIHJldHVybiBzZXQoW3BhdC50eXBlXSkKKworICAgIGlmIGlzaW5zdGFuY2UocGF0LCBweXRyZWUuTmVnYXRlZFBhdHRlcm4pOgorICAgICAgICBpZiBwYXQuY29udGVudDoKKyAgICAgICAgICAgIHJldHVybiBfZ2V0X2hlYWRfdHlwZXMocGF0LmNvbnRlbnQpCisgICAgICAgIHJhaXNlIF9FdmVyeU5vZGUgIyBOZWdhdGVkIFBhdHRlcm5zIGRvbid0IGhhdmUgYSB0eXBlCisKKyAgICBpZiBpc2luc3RhbmNlKHBhdCwgcHl0cmVlLldpbGRjYXJkUGF0dGVybik6CisgICAgICAgICMgUmVjdXJzZSBvbiBlYWNoIG5vZGUgaW4gY29udGVudAorICAgICAgICByID0gc2V0KCkKKyAgICAgICAgZm9yIHAgaW4gcGF0LmNvbnRlbnQ6CisgICAgICAgICAgICBmb3IgeCBpbiBwOgorICAgICAgICAgICAgICAgIHIudXBkYXRlKF9nZXRfaGVhZF90eXBlcyh4KSkKKyAgICAgICAgcmV0dXJuIHIKKworICAgIHJhaXNlIEV4Y2VwdGlvbigiT2ggbm8hIEkgZG9uJ3QgdW5kZXJzdGFuZCBwYXR0ZXJuICVzIiAlKHBhdCkpCisKKworZGVmIF9nZXRfaGVhZG5vZGVfZGljdChmaXhlcl9saXN0KToKKyAgICAiIiIgQWNjZXB0cyBhIGxpc3Qgb2YgZml4ZXJzIGFuZCByZXR1cm5zIGEgZGljdGlvbmFyeQorICAgICAgICBvZiBoZWFkIG5vZGUgdHlwZSAtLT4gZml4ZXIgbGlzdC4gICIiIgorICAgIGhlYWRfbm9kZXMgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChsaXN0KQorICAgIGV2ZXJ5ID0gW10KKyAgICBmb3IgZml4ZXIgaW4gZml4ZXJfbGlzdDoKKyAgICAgICAgaWYgZml4ZXIucGF0dGVybjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBoZWFkcyA9IF9nZXRfaGVhZF90eXBlcyhmaXhlci5wYXR0ZXJuKQorICAgICAgICAgICAgZXhjZXB0IF9FdmVyeU5vZGU6CisgICAgICAgICAgICAgICAgZXZlcnkuYXBwZW5kKGZpeGVyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3Igbm9kZV90eXBlIGluIGhlYWRzOgorICAgICAgICAgICAgICAgICAgICBoZWFkX25vZGVzW25vZGVfdHlwZV0uYXBwZW5kKGZpeGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgZml4ZXIuX2FjY2VwdF90eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGhlYWRfbm9kZXNbZml4ZXIuX2FjY2VwdF90eXBlXS5hcHBlbmQoZml4ZXIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV2ZXJ5LmFwcGVuZChmaXhlcikKKyAgICBmb3Igbm9kZV90eXBlIGluIGNoYWluKHB5Z3JhbS5weXRob25fZ3JhbW1hci5zeW1ib2wybnVtYmVyLml0ZXJ2YWx1ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5Z3JhbS5weXRob25fZ3JhbW1hci50b2tlbnMpOgorICAgICAgICBoZWFkX25vZGVzW25vZGVfdHlwZV0uZXh0ZW5kKGV2ZXJ5KQorICAgIHJldHVybiBkaWN0KGhlYWRfbm9kZXMpCisKKworZGVmIGdldF9maXhlcnNfZnJvbV9wYWNrYWdlKHBrZ19uYW1lKToKKyAgICAiIiIKKyAgICBSZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lcyBmb3IgZml4ZXJzIGluIHRoZSBwYWNrYWdlIHBrZ19uYW1lLgorICAgICIiIgorICAgIHJldHVybiBbcGtnX25hbWUgKyAiLiIgKyBmaXhfbmFtZQorICAgICAgICAgICAgZm9yIGZpeF9uYW1lIGluIGdldF9hbGxfZml4X25hbWVzKHBrZ19uYW1lLCBGYWxzZSldCisKK2RlZiBfaWRlbnRpdHkob2JqKToKKyAgICByZXR1cm4gb2JqCisKK2lmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywgMCk6CisgICAgaW1wb3J0IGNvZGVjcworICAgIF9vcGVuX3dpdGhfZW5jb2RpbmcgPSBjb2RlY3Mub3BlbgorICAgICMgY29kZWNzLm9wZW4gZG9lc24ndCB0cmFuc2xhdGUgbmV3bGluZXMgc2FkbHkuCisgICAgZGVmIF9mcm9tX3N5c3RlbV9uZXdsaW5lcyhpbnB1dCk6CisgICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKHUiXHJcbiIsIHUiXG4iKQorICAgIGRlZiBfdG9fc3lzdGVtX25ld2xpbmVzKGlucHV0KToKKyAgICAgICAgaWYgb3MubGluZXNlcCAhPSAiXG4iOgorICAgICAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UodSJcbiIsIG9zLmxpbmVzZXApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gaW5wdXQKK2Vsc2U6CisgICAgX29wZW5fd2l0aF9lbmNvZGluZyA9IG9wZW4KKyAgICBfZnJvbV9zeXN0ZW1fbmV3bGluZXMgPSBfaWRlbnRpdHkKKyAgICBfdG9fc3lzdGVtX25ld2xpbmVzID0gX2lkZW50aXR5CisKKworZGVmIF9kZXRlY3RfZnV0dXJlX2ZlYXR1cmVzKHNvdXJjZSk6CisgICAgaGF2ZV9kb2NzdHJpbmcgPSBGYWxzZQorICAgIGdlbiA9IHRva2VuaXplLmdlbmVyYXRlX3Rva2VucyhTdHJpbmdJTy5TdHJpbmdJTyhzb3VyY2UpLnJlYWRsaW5lKQorICAgIGRlZiBhZHZhbmNlKCk6CisgICAgICAgIHRvayA9IGdlbi5uZXh0KCkKKyAgICAgICAgcmV0dXJuIHRva1swXSwgdG9rWzFdCisgICAgaWdub3JlID0gZnJvemVuc2V0KCh0b2tlbi5ORVdMSU5FLCB0b2tlbml6ZS5OTCwgdG9rZW4uQ09NTUVOVCkpCisgICAgZmVhdHVyZXMgPSBzZXQoKQorICAgIHRyeToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRwLCB2YWx1ZSA9IGFkdmFuY2UoKQorICAgICAgICAgICAgaWYgdHAgaW4gaWdub3JlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRwID09IHRva2VuLlNUUklORzoKKyAgICAgICAgICAgICAgICBpZiBoYXZlX2RvY3N0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBoYXZlX2RvY3N0cmluZyA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgdHAgPT0gdG9rZW4uTkFNRSBhbmQgdmFsdWUgPT0gdSJmcm9tIjoKKyAgICAgICAgICAgICAgICB0cCwgdmFsdWUgPSBhZHZhbmNlKCkKKyAgICAgICAgICAgICAgICBpZiB0cCAhPSB0b2tlbi5OQU1FIG9yIHZhbHVlICE9IHUiX19mdXR1cmVfXyI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgaWYgdHAgIT0gdG9rZW4uTkFNRSBvciB2YWx1ZSAhPSB1ImltcG9ydCI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgaWYgdHAgPT0gdG9rZW4uT1AgYW5kIHZhbHVlID09IHUiKCI6CisgICAgICAgICAgICAgICAgICAgIHRwLCB2YWx1ZSA9IGFkdmFuY2UoKQorICAgICAgICAgICAgICAgIHdoaWxlIHRwID09IHRva2VuLk5BTUU6CisgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzLmFkZCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIGlmIHRwICE9IHRva2VuLk9QIG9yIHZhbHVlICE9IHUiLCI6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICB0cCwgdmFsdWUgPSBhZHZhbmNlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgcGFzcworICAgIHJldHVybiBmcm96ZW5zZXQoZmVhdHVyZXMpCisKKworY2xhc3MgRml4ZXJFcnJvcihFeGNlcHRpb24pOgorICAgICIiIkEgZml4ZXIgY291bGQgbm90IGJlIGxvYWRlZC4iIiIKKworCitjbGFzcyBSZWZhY3RvcmluZ1Rvb2wob2JqZWN0KToKKworICAgIF9kZWZhdWx0X29wdGlvbnMgPSB7InByaW50X2Z1bmN0aW9uIiA6IEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRlX3VuY2hhbmdlZF9maWxlcyIgOiBGYWxzZX0KKworICAgIENMQVNTX1BSRUZJWCA9ICJGaXgiICMgVGhlIHByZWZpeCBmb3IgZml4ZXIgY2xhc3NlcworICAgIEZJTEVfUFJFRklYID0gImZpeF8iICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlcyB3aXRoIGEgZml4ZXIgd2l0aGluCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZml4ZXJfbmFtZXMsIG9wdGlvbnM9Tm9uZSwgZXhwbGljaXQ9Tm9uZSk6CisgICAgICAgICIiIkluaXRpYWxpemVyLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBmaXhlcl9uYW1lczogYSBsaXN0IG9mIGZpeGVycyB0byBpbXBvcnQKKyAgICAgICAgICAgIG9wdGlvbnM6IGFuIGRpY3Qgd2l0aCBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgZXhwbGljaXQ6IGEgbGlzdCBvZiBmaXhlcnMgdG8gcnVuIGV2ZW4gaWYgdGhleSBhcmUgZXhwbGljaXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmZpeGVycyA9IGZpeGVyX25hbWVzCisgICAgICAgIHNlbGYuZXhwbGljaXQgPSBleHBsaWNpdCBvciBbXQorICAgICAgICBzZWxmLm9wdGlvbnMgPSBzZWxmLl9kZWZhdWx0X29wdGlvbnMuY29weSgpCisgICAgICAgIGlmIG9wdGlvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLm9wdGlvbnMudXBkYXRlKG9wdGlvbnMpCisgICAgICAgIGlmIHNlbGYub3B0aW9uc1sicHJpbnRfZnVuY3Rpb24iXToKKyAgICAgICAgICAgIHNlbGYuZ3JhbW1hciA9IHB5Z3JhbS5weXRob25fZ3JhbW1hcl9ub19wcmludF9zdGF0ZW1lbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZ3JhbW1hciA9IHB5Z3JhbS5weXRob25fZ3JhbW1hcgorICAgICAgICAjIFdoZW4gdGhpcyBpcyBUcnVlLCB0aGUgcmVmYWN0b3IqKCkgbWV0aG9kcyB3aWxsIGNhbGwgd3JpdGVfZmlsZSgpIGZvcgorICAgICAgICAjIGZpbGVzIHByb2Nlc3NlZCBldmVuIGlmIHRoZXkgd2VyZSBub3QgY2hhbmdlZCBkdXJpbmcgcmVmYWN0b3JpbmcuIElmCisgICAgICAgICMgYW5kIG9ubHkgaWYgdGhlIHJlZmFjdG9yIG1ldGhvZCdzIHdyaXRlIHBhcmFtZXRlciB3YXMgVHJ1ZS4KKyAgICAgICAgc2VsZi53cml0ZV91bmNoYW5nZWRfZmlsZXMgPSBzZWxmLm9wdGlvbnMuZ2V0KCJ3cml0ZV91bmNoYW5nZWRfZmlsZXMiKQorICAgICAgICBzZWxmLmVycm9ycyA9IFtdCisgICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIlJlZmFjdG9yaW5nVG9vbCIpCisgICAgICAgIHNlbGYuZml4ZXJfbG9nID0gW10KKyAgICAgICAgc2VsZi53cm90ZSA9IEZhbHNlCisgICAgICAgIHNlbGYuZHJpdmVyID0gZHJpdmVyLkRyaXZlcihzZWxmLmdyYW1tYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0PXB5dHJlZS5jb252ZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyPXNlbGYubG9nZ2VyKQorICAgICAgICBzZWxmLnByZV9vcmRlciwgc2VsZi5wb3N0X29yZGVyID0gc2VsZi5nZXRfZml4ZXJzKCkKKworCisgICAgICAgIHNlbGYuZmlsZXMgPSBbXSAgIyBMaXN0IG9mIGZpbGVzIHRoYXQgd2VyZSBvciBzaG91bGQgYmUgbW9kaWZpZWQKKworICAgICAgICBzZWxmLkJNID0gYm0uQm90dG9tTWF0Y2hlcigpCisgICAgICAgIHNlbGYuYm1pX3ByZV9vcmRlciA9IFtdICMgQm90dG9tIE1hdGNoZXIgaW5jb21wYXRpYmxlIGZpeGVycworICAgICAgICBzZWxmLmJtaV9wb3N0X29yZGVyID0gW10KKworICAgICAgICBmb3IgZml4ZXIgaW4gY2hhaW4oc2VsZi5wb3N0X29yZGVyLCBzZWxmLnByZV9vcmRlcik6CisgICAgICAgICAgICBpZiBmaXhlci5CTV9jb21wYXRpYmxlOgorICAgICAgICAgICAgICAgIHNlbGYuQk0uYWRkX2ZpeGVyKGZpeGVyKQorICAgICAgICAgICAgICAgICMgcmVtb3ZlIGZpeGVycyB0aGF0IHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgYm90dG9tLXVwCisgICAgICAgICAgICAgICAgIyBtYXRjaGVyCisgICAgICAgICAgICBlbGlmIGZpeGVyIGluIHNlbGYucHJlX29yZGVyOgorICAgICAgICAgICAgICAgIHNlbGYuYm1pX3ByZV9vcmRlci5hcHBlbmQoZml4ZXIpCisgICAgICAgICAgICBlbGlmIGZpeGVyIGluIHNlbGYucG9zdF9vcmRlcjoKKyAgICAgICAgICAgICAgICBzZWxmLmJtaV9wb3N0X29yZGVyLmFwcGVuZChmaXhlcikKKworICAgICAgICBzZWxmLmJtaV9wcmVfb3JkZXJfaGVhZHMgPSBfZ2V0X2hlYWRub2RlX2RpY3Qoc2VsZi5ibWlfcHJlX29yZGVyKQorICAgICAgICBzZWxmLmJtaV9wb3N0X29yZGVyX2hlYWRzID0gX2dldF9oZWFkbm9kZV9kaWN0KHNlbGYuYm1pX3Bvc3Rfb3JkZXIpCisKKworCisgICAgZGVmIGdldF9maXhlcnMoc2VsZik6CisgICAgICAgICIiIkluc3BlY3RzIHRoZSBvcHRpb25zIHRvIGxvYWQgdGhlIHJlcXVlc3RlZCBwYXR0ZXJucyBhbmQgaGFuZGxlcnMuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAocHJlX29yZGVyLCBwb3N0X29yZGVyKSwgd2hlcmUgcHJlX29yZGVyIGlzIHRoZSBsaXN0IG9mIGZpeGVycyB0aGF0CisgICAgICAgICAgd2FudCBhIHByZS1vcmRlciBBU1QgdHJhdmVyc2FsLCBhbmQgcG9zdF9vcmRlciBpcyB0aGUgbGlzdCB0aGF0IHdhbnQKKyAgICAgICAgICBwb3N0LW9yZGVyIHRyYXZlcnNhbC4KKyAgICAgICAgIiIiCisgICAgICAgIHByZV9vcmRlcl9maXhlcnMgPSBbXQorICAgICAgICBwb3N0X29yZGVyX2ZpeGVycyA9IFtdCisgICAgICAgIGZvciBmaXhfbW9kX3BhdGggaW4gc2VsZi5maXhlcnM6CisgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKGZpeF9tb2RfcGF0aCwge30sIHt9LCBbIioiXSkKKyAgICAgICAgICAgIGZpeF9uYW1lID0gZml4X21vZF9wYXRoLnJzcGxpdCgiLiIsIDEpWy0xXQorICAgICAgICAgICAgaWYgZml4X25hbWUuc3RhcnRzd2l0aChzZWxmLkZJTEVfUFJFRklYKToKKyAgICAgICAgICAgICAgICBmaXhfbmFtZSA9IGZpeF9uYW1lW2xlbihzZWxmLkZJTEVfUFJFRklYKTpdCisgICAgICAgICAgICBwYXJ0cyA9IGZpeF9uYW1lLnNwbGl0KCJfIikKKyAgICAgICAgICAgIGNsYXNzX25hbWUgPSBzZWxmLkNMQVNTX1BSRUZJWCArICIiLmpvaW4oW3AudGl0bGUoKSBmb3IgcCBpbiBwYXJ0c10pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZml4X2NsYXNzID0gZ2V0YXR0cihtb2QsIGNsYXNzX25hbWUpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRml4ZXJFcnJvcigiQ2FuJ3QgZmluZCAlcy4lcyIgJSAoZml4X25hbWUsIGNsYXNzX25hbWUpKQorICAgICAgICAgICAgZml4ZXIgPSBmaXhfY2xhc3Moc2VsZi5vcHRpb25zLCBzZWxmLmZpeGVyX2xvZykKKyAgICAgICAgICAgIGlmIGZpeGVyLmV4cGxpY2l0IGFuZCBzZWxmLmV4cGxpY2l0IGlzIG5vdCBUcnVlIGFuZCBcCisgICAgICAgICAgICAgICAgICAgIGZpeF9tb2RfcGF0aCBub3QgaW4gc2VsZi5leHBsaWNpdDoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJTa2lwcGluZyBpbXBsaWNpdCBmaXhlcjogJXMiLCBmaXhfbmFtZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiQWRkaW5nIHRyYW5zZm9ybWF0aW9uOiAlcyIsIGZpeF9uYW1lKQorICAgICAgICAgICAgaWYgZml4ZXIub3JkZXIgPT0gInByZSI6CisgICAgICAgICAgICAgICAgcHJlX29yZGVyX2ZpeGVycy5hcHBlbmQoZml4ZXIpCisgICAgICAgICAgICBlbGlmIGZpeGVyLm9yZGVyID09ICJwb3N0IjoKKyAgICAgICAgICAgICAgICBwb3N0X29yZGVyX2ZpeGVycy5hcHBlbmQoZml4ZXIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIEZpeGVyRXJyb3IoIklsbGVnYWwgZml4ZXIgb3JkZXI6ICVyIiAlIGZpeGVyLm9yZGVyKQorCisgICAgICAgIGtleV9mdW5jID0gb3BlcmF0b3IuYXR0cmdldHRlcigicnVuX29yZGVyIikKKyAgICAgICAgcHJlX29yZGVyX2ZpeGVycy5zb3J0KGtleT1rZXlfZnVuYykKKyAgICAgICAgcG9zdF9vcmRlcl9maXhlcnMuc29ydChrZXk9a2V5X2Z1bmMpCisgICAgICAgIHJldHVybiAocHJlX29yZGVyX2ZpeGVycywgcG9zdF9vcmRlcl9maXhlcnMpCisKKyAgICBkZWYgbG9nX2Vycm9yKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICIiIkNhbGxlZCB3aGVuIGFuIGVycm9yIG9jY3Vycy4iIiIKKyAgICAgICAgcmFpc2UKKworICAgIGRlZiBsb2dfbWVzc2FnZShzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgIiIiSG9vayB0byBsb2cgYSBtZXNzYWdlLiIiIgorICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgbXNnID0gbXNnICUgYXJncworICAgICAgICBzZWxmLmxvZ2dlci5pbmZvKG1zZykKKworICAgIGRlZiBsb2dfZGVidWcoc2VsZiwgbXNnLCAqYXJncyk6CisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBtc2cgPSBtc2cgJSBhcmdzCisgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKG1zZykKKworICAgIGRlZiBwcmludF9vdXRwdXQoc2VsZiwgb2xkX3RleHQsIG5ld190ZXh0LCBmaWxlbmFtZSwgZXF1YWwpOgorICAgICAgICAiIiJDYWxsZWQgd2l0aCB0aGUgb2xkIHZlcnNpb24sIG5ldyB2ZXJzaW9uLCBhbmQgZmlsZW5hbWUgb2YgYQorICAgICAgICByZWZhY3RvcmVkIGZpbGUuIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiByZWZhY3RvcihzZWxmLCBpdGVtcywgd3JpdGU9RmFsc2UsIGRvY3Rlc3RzX29ubHk9RmFsc2UpOgorICAgICAgICAiIiJSZWZhY3RvciBhIGxpc3Qgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiIiIgorCisgICAgICAgIGZvciBkaXJfb3JfZmlsZSBpbiBpdGVtczoKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlyX29yX2ZpbGUpOgorICAgICAgICAgICAgICAgIHNlbGYucmVmYWN0b3JfZGlyKGRpcl9vcl9maWxlLCB3cml0ZSwgZG9jdGVzdHNfb25seSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5yZWZhY3Rvcl9maWxlKGRpcl9vcl9maWxlLCB3cml0ZSwgZG9jdGVzdHNfb25seSkKKworICAgIGRlZiByZWZhY3Rvcl9kaXIoc2VsZiwgZGlyX25hbWUsIHdyaXRlPUZhbHNlLCBkb2N0ZXN0c19vbmx5PUZhbHNlKToKKyAgICAgICAgIiIiRGVzY2VuZHMgZG93biBhIGRpcmVjdG9yeSBhbmQgcmVmYWN0b3IgZXZlcnkgUHl0aG9uIGZpbGUgZm91bmQuCisKKyAgICAgICAgUHl0aG9uIGZpbGVzIGFyZSBhc3N1bWVkIHRvIGhhdmUgYSAucHkgZXh0ZW5zaW9uLgorCisgICAgICAgIEZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyBzdGFydGluZyB3aXRoICcuJyBhcmUgc2tpcHBlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHB5X2V4dCA9IG9zLmV4dHNlcCArICJweSIKKyAgICAgICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2FsayhkaXJfbmFtZSk6CisgICAgICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiRGVzY2VuZGluZyBpbnRvICVzIiwgZGlycGF0aCkKKyAgICAgICAgICAgIGRpcm5hbWVzLnNvcnQoKQorICAgICAgICAgICAgZmlsZW5hbWVzLnNvcnQoKQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgIGlmIChub3QgbmFtZS5zdGFydHN3aXRoKCIuIikgYW5kCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguc3BsaXRleHQobmFtZSlbMV0gPT0gcHlfZXh0KToKKyAgICAgICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlycGF0aCwgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZhY3Rvcl9maWxlKGZ1bGxuYW1lLCB3cml0ZSwgZG9jdGVzdHNfb25seSkKKyAgICAgICAgICAgICMgTW9kaWZ5IGRpcm5hbWVzIGluLXBsYWNlIHRvIHJlbW92ZSBzdWJkaXJzIHdpdGggbGVhZGluZyBkb3RzCisgICAgICAgICAgICBkaXJuYW1lc1s6XSA9IFtkbiBmb3IgZG4gaW4gZGlybmFtZXMgaWYgbm90IGRuLnN0YXJ0c3dpdGgoIi4iKV0KKworICAgIGRlZiBfcmVhZF9weXRob25fc291cmNlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIERvIG91ciBiZXN0IHRvIGRlY29kZSBhIFB5dGhvbiBzb3VyY2UgZmlsZSBjb3JyZWN0bHkuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgInJiIikKKyAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgc2VsZi5sb2dfZXJyb3IoIkNhbid0IG9wZW4gJXM6ICVzIiwgZmlsZW5hbWUsIGVycikKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVuY29kaW5nID0gdG9rZW5pemUuZGV0ZWN0X2VuY29kaW5nKGYucmVhZGxpbmUpWzBdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgd2l0aCBfb3Blbl93aXRoX2VuY29kaW5nKGZpbGVuYW1lLCAiciIsIGVuY29kaW5nPWVuY29kaW5nKSBhcyBmOgorICAgICAgICAgICAgcmV0dXJuIF9mcm9tX3N5c3RlbV9uZXdsaW5lcyhmLnJlYWQoKSksIGVuY29kaW5nCisKKyAgICBkZWYgcmVmYWN0b3JfZmlsZShzZWxmLCBmaWxlbmFtZSwgd3JpdGU9RmFsc2UsIGRvY3Rlc3RzX29ubHk9RmFsc2UpOgorICAgICAgICAiIiJSZWZhY3RvcnMgYSBmaWxlLiIiIgorICAgICAgICBpbnB1dCwgZW5jb2RpbmcgPSBzZWxmLl9yZWFkX3B5dGhvbl9zb3VyY2UoZmlsZW5hbWUpCisgICAgICAgIGlmIGlucHV0IGlzIE5vbmU6CisgICAgICAgICAgICAjIFJlYWRpbmcgdGhlIGZpbGUgZmFpbGVkLgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlucHV0ICs9IHUiXG4iICMgU2lsZW5jZSBjZXJ0YWluIHBhcnNlIGVycm9ycworICAgICAgICBpZiBkb2N0ZXN0c19vbmx5OgorICAgICAgICAgICAgc2VsZi5sb2dfZGVidWcoIlJlZmFjdG9yaW5nIGRvY3Rlc3RzIGluICVzIiwgZmlsZW5hbWUpCisgICAgICAgICAgICBvdXRwdXQgPSBzZWxmLnJlZmFjdG9yX2RvY3N0cmluZyhpbnB1dCwgZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBzZWxmLndyaXRlX3VuY2hhbmdlZF9maWxlcyBvciBvdXRwdXQgIT0gaW5wdXQ6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzZWRfZmlsZShvdXRwdXQsIGZpbGVuYW1lLCBpbnB1dCwgd3JpdGUsIGVuY29kaW5nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiTm8gZG9jdGVzdCBjaGFuZ2VzIGluICVzIiwgZmlsZW5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cmVlID0gc2VsZi5yZWZhY3Rvcl9zdHJpbmcoaW5wdXQsIGZpbGVuYW1lKQorICAgICAgICAgICAgaWYgc2VsZi53cml0ZV91bmNoYW5nZWRfZmlsZXMgb3IgKHRyZWUgYW5kIHRyZWUud2FzX2NoYW5nZWQpOgorICAgICAgICAgICAgICAgICMgVGhlIFs6LTFdIGlzIHRvIHRha2Ugb2ZmIHRoZSBcbiB3ZSBhZGRlZCBlYXJsaWVyCisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzZWRfZmlsZSh1bmljb2RlKHRyZWUpWzotMV0sIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGU9d3JpdGUsIGVuY29kaW5nPWVuY29kaW5nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiTm8gY2hhbmdlcyBpbiAlcyIsIGZpbGVuYW1lKQorCisgICAgZGVmIHJlZmFjdG9yX3N0cmluZyhzZWxmLCBkYXRhLCBuYW1lKToKKyAgICAgICAgIiIiUmVmYWN0b3IgYSBnaXZlbiBpbnB1dCBzdHJpbmcuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIGRhdGE6IGEgc3RyaW5nIGhvbGRpbmcgdGhlIGNvZGUgdG8gYmUgcmVmYWN0b3JlZC4KKyAgICAgICAgICAgIG5hbWU6IGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdXNlIGluIGVycm9yL2xvZyBtZXNzYWdlcy4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgQW4gQVNUIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlZmFjdG9yZWQgaW5wdXQgc3RyZWFtOyBOb25lIGlmCisgICAgICAgICAgICB0aGVyZSB3ZXJlIGVycm9ycyBkdXJpbmcgdGhlIHBhcnNlLgorICAgICAgICAiIiIKKyAgICAgICAgZmVhdHVyZXMgPSBfZGV0ZWN0X2Z1dHVyZV9mZWF0dXJlcyhkYXRhKQorICAgICAgICBpZiAicHJpbnRfZnVuY3Rpb24iIGluIGZlYXR1cmVzOgorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZ3JhbW1hciA9IHB5Z3JhbS5weXRob25fZ3JhbW1hcl9ub19wcmludF9zdGF0ZW1lbnQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJlZSA9IHNlbGYuZHJpdmVyLnBhcnNlX3N0cmluZyhkYXRhKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKKyAgICAgICAgICAgIHNlbGYubG9nX2Vycm9yKCJDYW4ndCBwYXJzZSAlczogJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGVyci5fX2NsYXNzX18uX19uYW1lX18sIGVycikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5kcml2ZXIuZ3JhbW1hciA9IHNlbGYuZ3JhbW1hcgorICAgICAgICB0cmVlLmZ1dHVyZV9mZWF0dXJlcyA9IGZlYXR1cmVzCisgICAgICAgIHNlbGYubG9nX2RlYnVnKCJSZWZhY3RvcmluZyAlcyIsIG5hbWUpCisgICAgICAgIHNlbGYucmVmYWN0b3JfdHJlZSh0cmVlLCBuYW1lKQorICAgICAgICByZXR1cm4gdHJlZQorCisgICAgZGVmIHJlZmFjdG9yX3N0ZGluKHNlbGYsIGRvY3Rlc3RzX29ubHk9RmFsc2UpOgorICAgICAgICBpbnB1dCA9IHN5cy5zdGRpbi5yZWFkKCkKKyAgICAgICAgaWYgZG9jdGVzdHNfb25seToKKyAgICAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJSZWZhY3RvcmluZyBkb2N0ZXN0cyBpbiBzdGRpbiIpCisgICAgICAgICAgICBvdXRwdXQgPSBzZWxmLnJlZmFjdG9yX2RvY3N0cmluZyhpbnB1dCwgIjxzdGRpbj4iKQorICAgICAgICAgICAgaWYgc2VsZi53cml0ZV91bmNoYW5nZWRfZmlsZXMgb3Igb3V0cHV0ICE9IGlucHV0OgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc2VkX2ZpbGUob3V0cHV0LCAiPHN0ZGluPiIsIGlucHV0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiTm8gZG9jdGVzdCBjaGFuZ2VzIGluIHN0ZGluIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyZWUgPSBzZWxmLnJlZmFjdG9yX3N0cmluZyhpbnB1dCwgIjxzdGRpbj4iKQorICAgICAgICAgICAgaWYgc2VsZi53cml0ZV91bmNoYW5nZWRfZmlsZXMgb3IgKHRyZWUgYW5kIHRyZWUud2FzX2NoYW5nZWQpOgorICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc2VkX2ZpbGUodW5pY29kZSh0cmVlKSwgIjxzdGRpbj4iLCBpbnB1dCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dfZGVidWcoIk5vIGNoYW5nZXMgaW4gc3RkaW4iKQorCisgICAgZGVmIHJlZmFjdG9yX3RyZWUoc2VsZiwgdHJlZSwgbmFtZSk6CisgICAgICAgICIiIlJlZmFjdG9ycyBhIHBhcnNlIHRyZWUgKG1vZGlmeWluZyB0aGUgdHJlZSBpbiBwbGFjZSkuCisKKyAgICAgICAgRm9yIGNvbXBhdGlibGUgcGF0dGVybnMgdGhlIGJvdHRvbSBtYXRjaGVyIG1vZHVsZSBpcworICAgICAgICB1c2VkLiBPdGhlcndpc2UgdGhlIHRyZWUgaXMgdHJhdmVyc2VkIG5vZGUtdG8tbm9kZSBmb3IKKyAgICAgICAgbWF0Y2hlcy4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgdHJlZTogYSBweXRyZWUuTm9kZSBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIHJvb3Qgb2YgdGhlIHRyZWUKKyAgICAgICAgICAgICAgICAgIHRvIGJlIHJlZmFjdG9yZWQuCisgICAgICAgICAgICBuYW1lOiBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgdHJlZS4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgVHJ1ZSBpZiB0aGUgdHJlZSB3YXMgbW9kaWZpZWQsIEZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZm9yIGZpeGVyIGluIGNoYWluKHNlbGYucHJlX29yZGVyLCBzZWxmLnBvc3Rfb3JkZXIpOgorICAgICAgICAgICAgZml4ZXIuc3RhcnRfdHJlZSh0cmVlLCBuYW1lKQorCisgICAgICAgICN1c2UgdHJhZGl0aW9uYWwgbWF0Y2hpbmcgZm9yIHRoZSBpbmNvbXBhdGlibGUgZml4ZXJzCisgICAgICAgIHNlbGYudHJhdmVyc2VfYnkoc2VsZi5ibWlfcHJlX29yZGVyX2hlYWRzLCB0cmVlLnByZV9vcmRlcigpKQorICAgICAgICBzZWxmLnRyYXZlcnNlX2J5KHNlbGYuYm1pX3Bvc3Rfb3JkZXJfaGVhZHMsIHRyZWUucG9zdF9vcmRlcigpKQorCisgICAgICAgICMgb2J0YWluIGEgc2V0IG9mIGNhbmRpZGF0ZSBub2RlcworICAgICAgICBtYXRjaF9zZXQgPSBzZWxmLkJNLnJ1bih0cmVlLmxlYXZlcygpKQorCisgICAgICAgIHdoaWxlIGFueShtYXRjaF9zZXQudmFsdWVzKCkpOgorICAgICAgICAgICAgZm9yIGZpeGVyIGluIHNlbGYuQk0uZml4ZXJzOgorICAgICAgICAgICAgICAgIGlmIGZpeGVyIGluIG1hdGNoX3NldCBhbmQgbWF0Y2hfc2V0W2ZpeGVyXToKKyAgICAgICAgICAgICAgICAgICAgI3NvcnQgYnkgZGVwdGg7IGFwcGx5IGZpeGVycyBmcm9tIGJvdHRvbShvZiB0aGUgQVNUKSB0byB0b3AKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hfc2V0W2ZpeGVyXS5zb3J0KGtleT1weXRyZWUuQmFzZS5kZXB0aCwgcmV2ZXJzZT1UcnVlKQorCisgICAgICAgICAgICAgICAgICAgIGlmIGZpeGVyLmtlZXBfbGluZV9vcmRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICNzb21lIGZpeGVycyhlZyBmaXhfaW1wb3J0cykgbXVzdCBiZSBhcHBsaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAjd2l0aCB0aGUgb3JpZ2luYWwgZmlsZSdzIGxpbmUgb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX3NldFtmaXhlcl0uc29ydChrZXk9cHl0cmVlLkJhc2UuZ2V0X2xpbmVubykKKworICAgICAgICAgICAgICAgICAgICBmb3Igbm9kZSBpbiBsaXN0KG1hdGNoX3NldFtmaXhlcl0pOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm9kZSBpbiBtYXRjaF9zZXRbZml4ZXJdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX3NldFtmaXhlcl0ucmVtb3ZlKG5vZGUpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kX3Jvb3Qobm9kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhpcyBub2RlIGhhcyBiZWVuIGN1dCBvZmYgZnJvbSBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmV2aW91cyB0cmFuc2Zvcm1hdGlvbiA7IHNraXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub2RlLmZpeGVyc19hcHBsaWVkIGFuZCBmaXhlciBpbiBub2RlLmZpeGVyc19hcHBsaWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG8gbm90IGFwcGx5IHRoZSBzYW1lIGZpeGVyIGFnYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGZpeGVyLm1hdGNoKG5vZGUpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJlc3VsdHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ID0gZml4ZXIudHJhbnNmb3JtKG5vZGUsIHJlc3VsdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmV3IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJlcGxhY2UobmV3KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbmV3LmZpeGVyc19hcHBsaWVkLmFwcGVuZChmaXhlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5vZGUgaW4gbmV3LnBvc3Rfb3JkZXIoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG8gbm90IGFwcGx5IHRoZSBmaXhlciBhZ2FpbiB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGlzIG9yIGFueSBzdWJub2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgbm9kZS5maXhlcnNfYXBwbGllZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmZpeGVyc19hcHBsaWVkID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZml4ZXJzX2FwcGxpZWQuYXBwZW5kKGZpeGVyKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdXBkYXRlIHRoZSBvcmlnaW5hbCBtYXRjaCBzZXQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIGFkZGVkIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X21hdGNoZXMgPSBzZWxmLkJNLnJ1bihuZXcubGVhdmVzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmeHIgaW4gbmV3X21hdGNoZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZnhyIGluIG1hdGNoX3NldDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9zZXRbZnhyXT1bXQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9zZXRbZnhyXS5leHRlbmQobmV3X21hdGNoZXNbZnhyXSkKKworICAgICAgICBmb3IgZml4ZXIgaW4gY2hhaW4oc2VsZi5wcmVfb3JkZXIsIHNlbGYucG9zdF9vcmRlcik6CisgICAgICAgICAgICBmaXhlci5maW5pc2hfdHJlZSh0cmVlLCBuYW1lKQorICAgICAgICByZXR1cm4gdHJlZS53YXNfY2hhbmdlZAorCisgICAgZGVmIHRyYXZlcnNlX2J5KHNlbGYsIGZpeGVycywgdHJhdmVyc2FsKToKKyAgICAgICAgIiIiVHJhdmVyc2UgYW4gQVNULCBhcHBseWluZyBhIHNldCBvZiBmaXhlcnMgdG8gZWFjaCBub2RlLgorCisgICAgICAgIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kIGZvciByZWZhY3Rvcl90cmVlKCkuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIGZpeGVyczogYSBsaXN0IG9mIGZpeGVyIGluc3RhbmNlcy4KKyAgICAgICAgICAgIHRyYXZlcnNhbDogYSBnZW5lcmF0b3IgdGhhdCB5aWVsZHMgQVNUIG5vZGVzLgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBOb25lCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgZml4ZXJzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZvciBub2RlIGluIHRyYXZlcnNhbDoKKyAgICAgICAgICAgIGZvciBmaXhlciBpbiBmaXhlcnNbbm9kZS50eXBlXToKKyAgICAgICAgICAgICAgICByZXN1bHRzID0gZml4ZXIubWF0Y2gobm9kZSkKKyAgICAgICAgICAgICAgICBpZiByZXN1bHRzOgorICAgICAgICAgICAgICAgICAgICBuZXcgPSBmaXhlci50cmFuc2Zvcm0obm9kZSwgcmVzdWx0cykKKyAgICAgICAgICAgICAgICAgICAgaWYgbmV3IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5yZXBsYWNlKG5ldykKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBuZXcKKworICAgIGRlZiBwcm9jZXNzZWRfZmlsZShzZWxmLCBuZXdfdGV4dCwgZmlsZW5hbWUsIG9sZF90ZXh0PU5vbmUsIHdyaXRlPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIENhbGxlZCB3aGVuIGEgZmlsZSBoYXMgYmVlbiByZWZhY3RvcmVkIGFuZCB0aGVyZSBtYXkgYmUgY2hhbmdlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKGZpbGVuYW1lKQorICAgICAgICBpZiBvbGRfdGV4dCBpcyBOb25lOgorICAgICAgICAgICAgb2xkX3RleHQgPSBzZWxmLl9yZWFkX3B5dGhvbl9zb3VyY2UoZmlsZW5hbWUpWzBdCisgICAgICAgICAgICBpZiBvbGRfdGV4dCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlcXVhbCA9IG9sZF90ZXh0ID09IG5ld190ZXh0CisgICAgICAgIHNlbGYucHJpbnRfb3V0cHV0KG9sZF90ZXh0LCBuZXdfdGV4dCwgZmlsZW5hbWUsIGVxdWFsKQorICAgICAgICBpZiBlcXVhbDoKKyAgICAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJObyBjaGFuZ2VzIHRvICVzIiwgZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi53cml0ZV91bmNoYW5nZWRfZmlsZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHdyaXRlOgorICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKG5ld190ZXh0LCBmaWxlbmFtZSwgb2xkX3RleHQsIGVuY29kaW5nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sb2dfZGVidWcoIk5vdCB3cml0aW5nIGNoYW5nZXMgdG8gJXMiLCBmaWxlbmFtZSkKKworICAgIGRlZiB3cml0ZV9maWxlKHNlbGYsIG5ld190ZXh0LCBmaWxlbmFtZSwgb2xkX3RleHQsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICAiIiJXcml0ZXMgYSBzdHJpbmcgdG8gYSBmaWxlLgorCisgICAgICAgIEl0IGZpcnN0IHNob3dzIGEgdW5pZmllZCBkaWZmIGJldHdlZW4gdGhlIG9sZCB0ZXh0IGFuZCB0aGUgbmV3IHRleHQsIGFuZAorICAgICAgICB0aGVuIHJld3JpdGVzIHRoZSBmaWxlOyB0aGUgbGF0dGVyIGlzIG9ubHkgZG9uZSBpZiB0aGUgd3JpdGUgb3B0aW9uIGlzCisgICAgICAgIHNldC4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBfb3Blbl93aXRoX2VuY29kaW5nKGZpbGVuYW1lLCAidyIsIGVuY29kaW5nPWVuY29kaW5nKQorICAgICAgICBleGNlcHQgb3MuZXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgc2VsZi5sb2dfZXJyb3IoIkNhbid0IGNyZWF0ZSAlczogJXMiLCBmaWxlbmFtZSwgZXJyKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoX3RvX3N5c3RlbV9uZXdsaW5lcyhuZXdfdGV4dCkpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvciBhcyBlcnI6CisgICAgICAgICAgICBzZWxmLmxvZ19lcnJvcigiQ2FuJ3Qgd3JpdGUgJXM6ICVzIiwgZmlsZW5hbWUsIGVycikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiV3JvdGUgY2hhbmdlcyB0byAlcyIsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLndyb3RlID0gVHJ1ZQorCisgICAgUFMxID0gIj4+PiAiCisgICAgUFMyID0gIi4uLiAiCisKKyAgICBkZWYgcmVmYWN0b3JfZG9jc3RyaW5nKHNlbGYsIGlucHV0LCBmaWxlbmFtZSk6CisgICAgICAgICIiIlJlZmFjdG9ycyBhIGRvY3N0cmluZywgbG9va2luZyBmb3IgZG9jdGVzdHMuCisKKyAgICAgICAgVGhpcyByZXR1cm5zIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQgc3RyaW5nLiAgSXQgbG9va3MKKyAgICAgICAgZm9yIGRvY3Rlc3RzLCB3aGljaCBzdGFydCB3aXRoIGEgIj4+PiIgcHJvbXB0LCBhbmQgbWF5IGJlCisgICAgICAgIGNvbnRpbnVlZCB3aXRoICIuLi4iIHByb21wdHMsIGFzIGxvbmcgYXMgdGhlICIuLi4iIGlzIGluZGVudGVkCisgICAgICAgIHRoZSBzYW1lIGFzIHRoZSAiPj4+Ii4KKworICAgICAgICAoVW5mb3J0dW5hdGVseSB3ZSBjYW4ndCB1c2UgdGhlIGRvY3Rlc3QgbW9kdWxlJ3MgcGFyc2VyLAorICAgICAgICBzaW5jZSwgbGlrZSBtb3N0IHBhcnNlcnMsIGl0IGlzIG5vdCBnZWFyZWQgdG93YXJkcyBwcmVzZXJ2aW5nCisgICAgICAgIHRoZSBvcmlnaW5hbCBzb3VyY2UuKQorICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgYmxvY2sgPSBOb25lCisgICAgICAgIGJsb2NrX2xpbmVubyA9IE5vbmUKKyAgICAgICAgaW5kZW50ID0gTm9uZQorICAgICAgICBsaW5lbm8gPSAwCisgICAgICAgIGZvciBsaW5lIGluIGlucHV0LnNwbGl0bGluZXMoVHJ1ZSk6CisgICAgICAgICAgICBsaW5lbm8gKz0gMQorICAgICAgICAgICAgaWYgbGluZS5sc3RyaXAoKS5zdGFydHN3aXRoKHNlbGYuUFMxKToKKyAgICAgICAgICAgICAgICBpZiBibG9jayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChzZWxmLnJlZmFjdG9yX2RvY3Rlc3QoYmxvY2ssIGJsb2NrX2xpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50LCBmaWxlbmFtZSkpCisgICAgICAgICAgICAgICAgYmxvY2tfbGluZW5vID0gbGluZW5vCisgICAgICAgICAgICAgICAgYmxvY2sgPSBbbGluZV0KKyAgICAgICAgICAgICAgICBpID0gbGluZS5maW5kKHNlbGYuUFMxKQorICAgICAgICAgICAgICAgIGluZGVudCA9IGxpbmVbOmldCisgICAgICAgICAgICBlbGlmIChpbmRlbnQgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgICAobGluZS5zdGFydHN3aXRoKGluZGVudCArIHNlbGYuUFMyKSBvcgorICAgICAgICAgICAgICAgICAgIGxpbmUgPT0gaW5kZW50ICsgc2VsZi5QUzIucnN0cmlwKCkgKyB1IlxuIikpOgorICAgICAgICAgICAgICAgIGJsb2NrLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBibG9jayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChzZWxmLnJlZmFjdG9yX2RvY3Rlc3QoYmxvY2ssIGJsb2NrX2xpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50LCBmaWxlbmFtZSkpCisgICAgICAgICAgICAgICAgYmxvY2sgPSBOb25lCisgICAgICAgICAgICAgICAgaW5kZW50ID0gTm9uZQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZSkKKyAgICAgICAgaWYgYmxvY2sgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKHNlbGYucmVmYWN0b3JfZG9jdGVzdChibG9jaywgYmxvY2tfbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50LCBmaWxlbmFtZSkpCisgICAgICAgIHJldHVybiB1IiIuam9pbihyZXN1bHQpCisKKyAgICBkZWYgcmVmYWN0b3JfZG9jdGVzdChzZWxmLCBibG9jaywgbGluZW5vLCBpbmRlbnQsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiUmVmYWN0b3JzIG9uZSBkb2N0ZXN0LgorCisgICAgICAgIEEgZG9jdGVzdCBpcyBnaXZlbiBhcyBhIGJsb2NrIG9mIGxpbmVzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggc3RhcnRzCisgICAgICAgIHdpdGggIj4+PiIgKHBvc3NpYmx5IGluZGVudGVkKSwgd2hpbGUgdGhlIHJlbWFpbmluZyBsaW5lcyBzdGFydAorICAgICAgICB3aXRoICIuLi4iIChpZGVudGljYWxseSBpbmRlbnRlZCkuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyZWUgPSBzZWxmLnBhcnNlX2Jsb2NrKGJsb2NrLCBsaW5lbm8sIGluZGVudCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlcnI6CisgICAgICAgICAgICBpZiBzZWxmLmxvZ2dlci5pc0VuYWJsZWRGb3IobG9nZ2luZy5ERUJVRyk6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gYmxvY2s6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJTb3VyY2U6ICVzIiwgbGluZS5yc3RyaXAodSJcbiIpKQorICAgICAgICAgICAgc2VsZi5sb2dfZXJyb3IoIkNhbid0IHBhcnNlIGRvY3N0cmluZyBpbiAlcyBsaW5lICVzOiAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVubywgZXJyLl9fY2xhc3NfXy5fX25hbWVfXywgZXJyKQorICAgICAgICAgICAgcmV0dXJuIGJsb2NrCisgICAgICAgIGlmIHNlbGYucmVmYWN0b3JfdHJlZSh0cmVlLCBmaWxlbmFtZSk6CisgICAgICAgICAgICBuZXcgPSB1bmljb2RlKHRyZWUpLnNwbGl0bGluZXMoVHJ1ZSkKKyAgICAgICAgICAgICMgVW5kbyB0aGUgYWRqdXN0bWVudCBvZiB0aGUgbGluZSBudW1iZXJzIGluIHdyYXBfdG9rcygpIGJlbG93LgorICAgICAgICAgICAgY2xpcHBlZCwgbmV3ID0gbmV3WzpsaW5lbm8tMV0sIG5ld1tsaW5lbm8tMTpdCisgICAgICAgICAgICBhc3NlcnQgY2xpcHBlZCA9PSBbdSJcbiJdICogKGxpbmVuby0xKSwgY2xpcHBlZAorICAgICAgICAgICAgaWYgbm90IG5ld1stMV0uZW5kc3dpdGgodSJcbiIpOgorICAgICAgICAgICAgICAgIG5ld1stMV0gKz0gdSJcbiIKKyAgICAgICAgICAgIGJsb2NrID0gW2luZGVudCArIHNlbGYuUFMxICsgbmV3LnBvcCgwKV0KKyAgICAgICAgICAgIGlmIG5ldzoKKyAgICAgICAgICAgICAgICBibG9jayArPSBbaW5kZW50ICsgc2VsZi5QUzIgKyBsaW5lIGZvciBsaW5lIGluIG5ld10KKyAgICAgICAgcmV0dXJuIGJsb2NrCisKKyAgICBkZWYgc3VtbWFyaXplKHNlbGYpOgorICAgICAgICBpZiBzZWxmLndyb3RlOgorICAgICAgICAgICAgd2VyZSA9ICJ3ZXJlIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2VyZSA9ICJuZWVkIHRvIGJlIgorICAgICAgICBpZiBub3Qgc2VsZi5maWxlczoKKyAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIk5vIGZpbGVzICVzIG1vZGlmaWVkLiIsIHdlcmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJGaWxlcyB0aGF0ICVzIG1vZGlmaWVkOiIsIHdlcmUpCisgICAgICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLmZpbGVzOgorICAgICAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoZmlsZSkKKyAgICAgICAgaWYgc2VsZi5maXhlcl9sb2c6CisgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJXYXJuaW5ncy9tZXNzYWdlcyB3aGlsZSByZWZhY3RvcmluZzoiKQorICAgICAgICAgICAgZm9yIG1lc3NhZ2UgaW4gc2VsZi5maXhlcl9sb2c6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZShtZXNzYWdlKQorICAgICAgICBpZiBzZWxmLmVycm9yczoKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmVycm9ycykgPT0gMToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJUaGVyZSB3YXMgMSBlcnJvcjoiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJUaGVyZSB3ZXJlICVkIGVycm9yczoiLCBsZW4oc2VsZi5lcnJvcnMpKQorICAgICAgICAgICAgZm9yIG1zZywgYXJncywga3dkcyBpbiBzZWxmLmVycm9yczoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKG1zZywgKmFyZ3MsICoqa3dkcykKKworICAgIGRlZiBwYXJzZV9ibG9jayhzZWxmLCBibG9jaywgbGluZW5vLCBpbmRlbnQpOgorICAgICAgICAiIiJQYXJzZXMgYSBibG9jayBpbnRvIGEgdHJlZS4KKworICAgICAgICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBnZXQgY29ycmVjdCBsaW5lIG51bWJlciAvIG9mZnNldCBpbmZvcm1hdGlvbgorICAgICAgICBpbiB0aGUgcGFyc2VyIGRpYWdub3N0aWNzIGFuZCBlbWJlZGRlZCBpbnRvIHRoZSBwYXJzZSB0cmVlLgorICAgICAgICAiIiIKKyAgICAgICAgdHJlZSA9IHNlbGYuZHJpdmVyLnBhcnNlX3Rva2VucyhzZWxmLndyYXBfdG9rcyhibG9jaywgbGluZW5vLCBpbmRlbnQpKQorICAgICAgICB0cmVlLmZ1dHVyZV9mZWF0dXJlcyA9IGZyb3plbnNldCgpCisgICAgICAgIHJldHVybiB0cmVlCisKKyAgICBkZWYgd3JhcF90b2tzKHNlbGYsIGJsb2NrLCBsaW5lbm8sIGluZGVudCk6CisgICAgICAgICIiIldyYXBzIGEgdG9rZW5pemUgc3RyZWFtIHRvIHN5c3RlbWF0aWNhbGx5IG1vZGlmeSBzdGFydC9lbmQuIiIiCisgICAgICAgIHRva2VucyA9IHRva2VuaXplLmdlbmVyYXRlX3Rva2VucyhzZWxmLmdlbl9saW5lcyhibG9jaywgaW5kZW50KS5uZXh0KQorICAgICAgICBmb3IgdHlwZSwgdmFsdWUsIChsaW5lMCwgY29sMCksIChsaW5lMSwgY29sMSksIGxpbmVfdGV4dCBpbiB0b2tlbnM6CisgICAgICAgICAgICBsaW5lMCArPSBsaW5lbm8gLSAxCisgICAgICAgICAgICBsaW5lMSArPSBsaW5lbm8gLSAxCisgICAgICAgICAgICAjIERvbid0IGJvdGhlciB1cGRhdGluZyB0aGUgY29sdW1uczsgdGhpcyBpcyB0b28gY29tcGxpY2F0ZWQKKyAgICAgICAgICAgICMgc2luY2UgbGluZV90ZXh0IHdvdWxkIGFsc28gaGF2ZSB0byBiZSB1cGRhdGVkIGFuZCBpdCB3b3VsZAorICAgICAgICAgICAgIyBzdGlsbCBicmVhayBmb3IgdG9rZW5zIHNwYW5uaW5nIGxpbmVzLiAgTGV0IHRoZSB1c2VyIGd1ZXNzCisgICAgICAgICAgICAjIHRoYXQgdGhlIGNvbHVtbiBudW1iZXJzIGZvciBkb2N0ZXN0cyBhcmUgcmVsYXRpdmUgdG8gdGhlCisgICAgICAgICAgICAjIGVuZCBvZiB0aGUgcHJvbXB0IHN0cmluZyAoUFMxIG9yIFBTMikuCisgICAgICAgICAgICB5aWVsZCB0eXBlLCB2YWx1ZSwgKGxpbmUwLCBjb2wwKSwgKGxpbmUxLCBjb2wxKSwgbGluZV90ZXh0CisKKworICAgIGRlZiBnZW5fbGluZXMoc2VsZiwgYmxvY2ssIGluZGVudCk6CisgICAgICAgICIiIkdlbmVyYXRlcyBsaW5lcyBhcyBleHBlY3RlZCBieSB0b2tlbml6ZSBmcm9tIGEgbGlzdCBvZiBsaW5lcy4KKworICAgICAgICBUaGlzIHN0cmlwcyB0aGUgZmlyc3QgbGVuKGluZGVudCArIHNlbGYuUFMxKSBjaGFyYWN0ZXJzIG9mZiBlYWNoIGxpbmUuCisgICAgICAgICIiIgorICAgICAgICBwcmVmaXgxID0gaW5kZW50ICsgc2VsZi5QUzEKKyAgICAgICAgcHJlZml4MiA9IGluZGVudCArIHNlbGYuUFMyCisgICAgICAgIHByZWZpeCA9IHByZWZpeDEKKyAgICAgICAgZm9yIGxpbmUgaW4gYmxvY2s6CisgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgocHJlZml4KToKKyAgICAgICAgICAgICAgICB5aWVsZCBsaW5lW2xlbihwcmVmaXgpOl0KKyAgICAgICAgICAgIGVsaWYgbGluZSA9PSBwcmVmaXgucnN0cmlwKCkgKyB1IlxuIjoKKyAgICAgICAgICAgICAgICB5aWVsZCB1IlxuIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigibGluZT0lciwgcHJlZml4PSVyIiAlIChsaW5lLCBwcmVmaXgpKQorICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4MgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgeWllbGQgIiIKKworCitjbGFzcyBNdWx0aXByb2Nlc3NpbmdVbnN1cHBvcnRlZChFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBNdWx0aXByb2Nlc3NSZWZhY3RvcmluZ1Rvb2woUmVmYWN0b3JpbmdUb29sKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzdXBlcihNdWx0aXByb2Nlc3NSZWZhY3RvcmluZ1Rvb2wsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5xdWV1ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5vdXRwdXRfbG9jayA9IE5vbmUKKworICAgIGRlZiByZWZhY3RvcihzZWxmLCBpdGVtcywgd3JpdGU9RmFsc2UsIGRvY3Rlc3RzX29ubHk9RmFsc2UsCisgICAgICAgICAgICAgICAgIG51bV9wcm9jZXNzZXM9MSk6CisgICAgICAgIGlmIG51bV9wcm9jZXNzZXMgPT0gMToKKyAgICAgICAgICAgIHJldHVybiBzdXBlcihNdWx0aXByb2Nlc3NSZWZhY3RvcmluZ1Rvb2wsIHNlbGYpLnJlZmFjdG9yKAorICAgICAgICAgICAgICAgIGl0ZW1zLCB3cml0ZSwgZG9jdGVzdHNfb25seSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IG11bHRpcHJvY2Vzc2luZworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByYWlzZSBNdWx0aXByb2Nlc3NpbmdVbnN1cHBvcnRlZAorICAgICAgICBpZiBzZWxmLnF1ZXVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJhbHJlYWR5IGRvaW5nIG11bHRpcGxlIHByb2Nlc3NlcyIpCisgICAgICAgIHNlbGYucXVldWUgPSBtdWx0aXByb2Nlc3NpbmcuSm9pbmFibGVRdWV1ZSgpCisgICAgICAgIHNlbGYub3V0cHV0X2xvY2sgPSBtdWx0aXByb2Nlc3NpbmcuTG9jaygpCisgICAgICAgIHByb2Nlc3NlcyA9IFttdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fY2hpbGQpCisgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobnVtX3Byb2Nlc3NlcyldCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBwIGluIHByb2Nlc3NlczoKKyAgICAgICAgICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgICAgIHN1cGVyKE11bHRpcHJvY2Vzc1JlZmFjdG9yaW5nVG9vbCwgc2VsZikucmVmYWN0b3IoaXRlbXMsIHdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N0ZXN0c19vbmx5KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5xdWV1ZS5qb2luKCkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShudW1fcHJvY2Vzc2VzKToKKyAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlLnB1dChOb25lKQorICAgICAgICAgICAgZm9yIHAgaW4gcHJvY2Vzc2VzOgorICAgICAgICAgICAgICAgIGlmIHAuaXNfYWxpdmUoKToKKyAgICAgICAgICAgICAgICAgICAgcC5qb2luKCkKKyAgICAgICAgICAgIHNlbGYucXVldWUgPSBOb25lCisKKyAgICBkZWYgX2NoaWxkKHNlbGYpOgorICAgICAgICB0YXNrID0gc2VsZi5xdWV1ZS5nZXQoKQorICAgICAgICB3aGlsZSB0YXNrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXJncywga3dhcmdzID0gdGFzaworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN1cGVyKE11bHRpcHJvY2Vzc1JlZmFjdG9yaW5nVG9vbCwgc2VsZikucmVmYWN0b3JfZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlLnRhc2tfZG9uZSgpCisgICAgICAgICAgICB0YXNrID0gc2VsZi5xdWV1ZS5nZXQoKQorCisgICAgZGVmIHJlZmFjdG9yX2ZpbGUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgaWYgc2VsZi5xdWV1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucXVldWUucHV0KChhcmdzLCBrd2FyZ3MpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHN1cGVyKE11bHRpcHJvY2Vzc1JlZmFjdG9yaW5nVG9vbCwgc2VsZikucmVmYWN0b3JfZmlsZSgKKyAgICAgICAgICAgICAgICAqYXJncywgKiprd2FyZ3MpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcmVmYWN0b3IucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3JlZmFjdG9yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzJjODJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3JlZmFjdG9yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcmVmYWN0b3IucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3JlZmFjdG9yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTFhMDNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3JlZmFjdG9yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhZWEwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDI0IEBACisiIiJNYWtlIHRlc3RzLyBpbnRvIGEgcGFja2FnZS4gVGhpcyBhbGxvd3MgdXMgdG8gImltcG9ydCB0ZXN0cyIgYW5kCitoYXZlIHRlc3RzLmFsbF90ZXN0cyBiZSBhIFRlc3RTdWl0ZSByZXByZXNlbnRpbmcgYWxsIHRlc3QgY2FzZXMKK2Zyb20gYWxsIHRlc3RfKi5weSBmaWxlcyBpbiB0ZXN0cy8uIiIiCisjIEF1dGhvcjogQ29sbGluIFdpbnRlcgorCitpbXBvcnQgb3MKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0eXBlcworCitmcm9tIC4gaW1wb3J0IHN1cHBvcnQKKworYWxsX3Rlc3RzID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKwordGVzdHNfZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICcuLicsICd0ZXN0cycpCit0ZXN0cyA9IFt0WzA6LTNdIGZvciB0IGluIG9zLmxpc3RkaXIodGVzdHNfZGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdC5zdGFydHN3aXRoKCd0ZXN0XycpIGFuZCB0LmVuZHN3aXRoKCcucHknKV0KKworbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKK2ZvciB0IGluIHRlc3RzOgorICAgIF9faW1wb3J0X18oIiIsZ2xvYmFscygpLGxvY2FscygpLFt0XSxsZXZlbD0xKQorICAgIG1vZCA9IGdsb2JhbHMoKVt0XQorICAgIGFsbF90ZXN0cy5hZGRUZXN0cyhsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShtb2QpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5ODk1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5ODk1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvUkVBRE1FIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYTQ3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9SRUFETUUKQEAgLTAsMCArMSw2IEBACitJbiB0aGlzIGRpcmVjdG9yeToKKy0gcHkyX3Rlc3RfZ3JhbW1hci5weSAtLSB0ZXN0IGZpbGUgdGhhdCBleGVyY2lzZXMgbW9zdC9hbGwgb2YgUHl0aG9uIDIueCdzIGdyYW1tYXIuCistIHB5M190ZXN0X2dyYW1tYXIucHkgLS0gdGVzdCBmaWxlIHRoYXQgZXhlcmNpc2VzIG1vc3QvYWxsIG9mIFB5dGhvbiAzLngncyBncmFtbWFyLgorLSBpbmZpbml0ZV9yZWN1cnNpb24ucHkgLS0gdGVzdCBmaWxlIHRoYXQgY2F1c2VzIGxpYjJ0bzMncyBmYXN0ZXIgcmVjdXJzaXZlIHBhdHRlcm4gbWF0Y2hpbmcKKyAgc2NoZW1lIHRvIGZhaWwsIGJ1dCBwYXNzZXMgd2hlbiBsaWIydG8zIGZhbGxzIGJhY2sgdG8gaXRlcmF0aXZlIHBhdHRlcm4gbWF0Y2hpbmcuCistIGZpeGVzLyAtLSBmb3IgdXNlIGJ5IHRlc3RfcmVmYWN0b3IucHkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2JvbS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2JvbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmMzOTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvYm9tLnB5CkBAIC0wLDAgKzEsMiBAQAor77u/IyBjb2Rpbmc6IHV0Zi04CitwcmludCAiQk9NIEJPT00hIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvY3JsZi5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2NybGYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlMmQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2NybGYucHkKQEAgLTAsMCArMSwzIEBACitwcmludCAiaGkiCisKK3ByaW50ICJMaWtlIGJhZCBXaW5kb3dzIG5ld2xpbmVzPyIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2RpZmZlcmVudF9lbmNvZGluZy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2RpZmZlcmVudF9lbmNvZGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjMyYmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZGlmZmVyZW50X2VuY29kaW5nLnB5CkBAIC0wLDAgKzEsNiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorcHJpbnQgdSfDn8Ogw6HDosOjw6TDpcOmw6fDqMOpw6rDq8Osw63DrsOvw7DDscOyw7PDtMO1w7bDuMO5w7rDu8O8w73DvsO/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOYw5nDmsObw5zDncOeJworCitkZWYgZih4KToKKyAgICBwcmludCAnJXNcdC0+ICDOsSglMmkpOiVzICDOsiglcyknCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvYmFkX29yZGVyLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL2JhZF9vcmRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjFiYmYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL2JhZF9vcmRlci5weQpAQCAtMCwwICsxLDUgQEAKK2Zyb20gbGliMnRvMy5maXhlcl9iYXNlIGltcG9ydCBCYXNlRml4CisKK2NsYXNzIEZpeEJhZE9yZGVyKEJhc2VGaXgpOgorCisgICAgb3JkZXIgPSAiY3JhenkiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL215Zml4ZXMvZml4X2V4cGxpY2l0LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL215Zml4ZXMvZml4X2V4cGxpY2l0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZTE2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9maXhfZXhwbGljaXQucHkKQEAgLTAsMCArMSw2IEBACitmcm9tIGxpYjJ0bzMuZml4ZXJfYmFzZSBpbXBvcnQgQmFzZUZpeAorCitjbGFzcyBGaXhFeHBsaWNpdChCYXNlRml4KToKKyAgICBleHBsaWNpdCA9IFRydWUKKworICAgIGRlZiBtYXRjaChzZWxmKTogcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9maXhfZmlyc3QucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9maXhfZmlyc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg4ODIxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9maXJzdC5weQpAQCAtMCwwICsxLDYgQEAKK2Zyb20gbGliMnRvMy5maXhlcl9iYXNlIGltcG9ydCBCYXNlRml4CisKK2NsYXNzIEZpeEZpcnN0KEJhc2VGaXgpOgorICAgIHJ1bl9vcmRlciA9IDEKKworICAgIGRlZiBtYXRjaChzZWxmLCBub2RlKTogcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9maXhfbGFzdC5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9sYXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMDc3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9maXhfbGFzdC5weQpAQCAtMCwwICsxLDcgQEAKK2Zyb20gbGliMnRvMy5maXhlcl9iYXNlIGltcG9ydCBCYXNlRml4CisKK2NsYXNzIEZpeExhc3QoQmFzZUZpeCk6CisKKyAgICBydW5fb3JkZXIgPSAxMAorCisgICAgZGVmIG1hdGNoKHNlbGYsIG5vZGUpOiByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9wYXJyb3QucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9maXhfcGFycm90LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjc5YWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9maXhfcGFycm90LnB5CkBAIC0wLDAgKzEsMTMgQEAKK2Zyb20gbGliMnRvMy5maXhlcl9iYXNlIGltcG9ydCBCYXNlRml4Citmcm9tIGxpYjJ0bzMuZml4ZXJfdXRpbCBpbXBvcnQgTmFtZQorCitjbGFzcyBGaXhQYXJyb3QoQmFzZUZpeCk6CisgICAgIiIiCisgICAgQ2hhbmdlIGZ1bmN0aW9ucyBuYW1lZCAncGFycm90JyB0byAnY2hlZXNlJy4KKyAgICAiIiIKKworICAgIFBBVFRFUk4gPSAiIiJmdW5jZGVmIDwgJ2RlZicgbmFtZT0ncGFycm90JyBhbnkqID4iIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIG5hbWUgPSByZXN1bHRzWyJuYW1lIl0KKyAgICAgICAgbmFtZS5yZXBsYWNlKE5hbWUoImNoZWVzZSIsIG5hbWUucHJlZml4KSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9wcmVvcmRlci5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9wcmVvcmRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWJmYmJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL215Zml4ZXMvZml4X3ByZW9yZGVyLnB5CkBAIC0wLDAgKzEsNiBAQAorZnJvbSBsaWIydG8zLmZpeGVyX2Jhc2UgaW1wb3J0IEJhc2VGaXgKKworY2xhc3MgRml4UHJlb3JkZXIoQmFzZUZpeCk6CisgICAgb3JkZXIgPSAicHJlIgorCisgICAgZGVmIG1hdGNoKHNlbGYsIG5vZGUpOiByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9ub19maXhlcl9jbHMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbm9fZml4ZXJfY2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNmY3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbm9fZml4ZXJfY2xzLnB5CkBAIC0wLDAgKzEgQEAKKyMgVGhpcyBpcyBlbXB0eSBzbyB0cnlpbmcgdG8gZmV0Y2ggdGhlIGZpeGVyIGNsYXNzIGdpdmVzIGFuIEF0dHJpYnV0ZUVycm9yCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvcGFycm90X2V4YW1wbGUucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvcGFycm90X2V4YW1wbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1MjkyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9wYXJyb3RfZXhhbXBsZS5weQpAQCAtMCwwICsxLDIgQEAKK2RlZiBwYXJyb3QoKToKKyAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9pbmZpbml0ZV9yZWN1cnNpb24ucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9pbmZpbml0ZV9yZWN1cnNpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3MTVlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2luZmluaXRlX3JlY3Vyc2lvbi5weQpAQCAtMCwwICsxLDI2NjkgQEAKKyMgVGhpcyBmaWxlIGlzIHVzZWQgdG8gdmVyaWZ5IHRoYXQgMnRvMyBmYWxscyBiYWNrIHRvIGEgc2xvd2VyLCBpdGVyYXRpdmUgcGF0dGVybiBtYXRjaGluZworIyBzY2hlbWUgaW4gdGhlIGV2ZW50IHRoYXQgdGhlIGZhc3RlciByZWN1cnNpdmUgc3lzdGVtIGZhaWxzIGR1ZSB0byBpbmZpbml0ZSByZWN1cnNpb24uCitmcm9tIGN0eXBlcyBpbXBvcnQgKgorU1RSSU5HID0gY19jaGFyX3AKKworCitPU1Vua25vd25CeXRlT3JkZXIgPSAwCitVSVRfUFJPTVBUID0gMQorUF9QR0lEID0gMgorUF9QSUQgPSAxCitVSVRfRVJST1IgPSA1CitVSVRfSU5GTyA9IDQKK1VJVF9OT05FID0gMAorUF9BTEwgPSAwCitVSVRfVkVSSUZZID0gMgorT1NCaWdFbmRpYW4gPSAyCitVSVRfQk9PTEVBTiA9IDMKK09TTGl0dGxlRW5kaWFuID0gMQorX19kYXJ3aW5fbmxfaXRlbSA9IGNfaW50CitfX2Rhcndpbl93Y3RyYW5zX3QgPSBjX2ludAorX19kYXJ3aW5fd2N0eXBlX3QgPSBjX3Vsb25nCitfX2ludDhfdCA9IGNfYnl0ZQorX191aW50OF90ID0gY191Ynl0ZQorX19pbnQxNl90ID0gY19zaG9ydAorX191aW50MTZfdCA9IGNfdXNob3J0CitfX2ludDMyX3QgPSBjX2ludAorX191aW50MzJfdCA9IGNfdWludAorX19pbnQ2NF90ID0gY19sb25nbG9uZworX191aW50NjRfdCA9IGNfdWxvbmdsb25nCitfX2Rhcndpbl9pbnRwdHJfdCA9IGNfbG9uZworX19kYXJ3aW5fbmF0dXJhbF90ID0gY191aW50CitfX2Rhcndpbl9jdF9ydW5lX3QgPSBjX2ludAorY2xhc3MgX19tYnN0YXRlX3QoVW5pb24pOgorICAgIHBhc3MKK19fbWJzdGF0ZV90Ll9wYWNrXyA9IDQKK19fbWJzdGF0ZV90Ll9maWVsZHNfID0gWworICAgICgnX19tYnN0YXRlOCcsIGNfY2hhciAqIDEyOCksCisgICAgKCdfbWJzdGF0ZUwnLCBjX2xvbmdsb25nKSwKK10KK2Fzc2VydCBzaXplb2YoX19tYnN0YXRlX3QpID09IDEyOCwgc2l6ZW9mKF9fbWJzdGF0ZV90KQorYXNzZXJ0IGFsaWdubWVudChfX21ic3RhdGVfdCkgPT0gNCwgYWxpZ25tZW50KF9fbWJzdGF0ZV90KQorX19kYXJ3aW5fbWJzdGF0ZV90ID0gX19tYnN0YXRlX3QKK19fZGFyd2luX3B0cmRpZmZfdCA9IGNfaW50CitfX2Rhcndpbl9zaXplX3QgPSBjX3Vsb25nCitfX2Rhcndpbl92YV9saXN0ID0gU1RSSU5HCitfX2Rhcndpbl93Y2hhcl90ID0gY19pbnQKK19fZGFyd2luX3J1bmVfdCA9IF9fZGFyd2luX3djaGFyX3QKK19fZGFyd2luX3dpbnRfdCA9IGNfaW50CitfX2Rhcndpbl9jbG9ja190ID0gY191bG9uZworX19kYXJ3aW5fc29ja2xlbl90ID0gX191aW50MzJfdAorX19kYXJ3aW5fc3NpemVfdCA9IGNfbG9uZworX19kYXJ3aW5fdGltZV90ID0gY19sb25nCitzaWdfYXRvbWljX3QgPSBjX2ludAorY2xhc3Mgc2lnY29udGV4dChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3NpZ2NvbnRleHQuX2ZpZWxkc18gPSBbCisgICAgKCdzY19vbnN0YWNrJywgY19pbnQpLAorICAgICgnc2NfbWFzaycsIGNfaW50KSwKKyAgICAoJ3NjX2VheCcsIGNfdWludCksCisgICAgKCdzY19lYngnLCBjX3VpbnQpLAorICAgICgnc2NfZWN4JywgY191aW50KSwKKyAgICAoJ3NjX2VkeCcsIGNfdWludCksCisgICAgKCdzY19lZGknLCBjX3VpbnQpLAorICAgICgnc2NfZXNpJywgY191aW50KSwKKyAgICAoJ3NjX2VicCcsIGNfdWludCksCisgICAgKCdzY19lc3AnLCBjX3VpbnQpLAorICAgICgnc2Nfc3MnLCBjX3VpbnQpLAorICAgICgnc2NfZWZsYWdzJywgY191aW50KSwKKyAgICAoJ3NjX2VpcCcsIGNfdWludCksCisgICAgKCdzY19jcycsIGNfdWludCksCisgICAgKCdzY19kcycsIGNfdWludCksCisgICAgKCdzY19lcycsIGNfdWludCksCisgICAgKCdzY19mcycsIGNfdWludCksCisgICAgKCdzY19ncycsIGNfdWludCksCitdCithc3NlcnQgc2l6ZW9mKHNpZ2NvbnRleHQpID09IDcyLCBzaXplb2Yoc2lnY29udGV4dCkKK2Fzc2VydCBhbGlnbm1lbnQoc2lnY29udGV4dCkgPT0gNCwgYWxpZ25tZW50KHNpZ2NvbnRleHQpCit1X2ludDhfdCA9IGNfdWJ5dGUKK3VfaW50MTZfdCA9IGNfdXNob3J0Cit1X2ludDMyX3QgPSBjX3VpbnQKK3VfaW50NjRfdCA9IGNfdWxvbmdsb25nCitpbnQzMl90ID0gY19pbnQKK3JlZ2lzdGVyX3QgPSBpbnQzMl90Cit1c2VyX2FkZHJfdCA9IHVfaW50NjRfdAordXNlcl9zaXplX3QgPSB1X2ludDY0X3QKK2ludDY0X3QgPSBjX2xvbmdsb25nCit1c2VyX3NzaXplX3QgPSBpbnQ2NF90Cit1c2VyX2xvbmdfdCA9IGludDY0X3QKK3VzZXJfdWxvbmdfdCA9IHVfaW50NjRfdAordXNlcl90aW1lX3QgPSBpbnQ2NF90CitzeXNjYWxsX2FyZ190ID0gdV9pbnQ2NF90CisKKyMgdmFsdWVzIGZvciB1bm5hbWVkIGVudW1lcmF0aW9uCitjbGFzcyBhZXNfa2V5X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYWVzX2tleV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3JkX2tleScsIGNfdWxvbmcgKiA2MCksCisgICAgKCdyb3VuZHMnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKGFlc19rZXlfc3QpID09IDI0NCwgc2l6ZW9mKGFlc19rZXlfc3QpCithc3NlcnQgYWxpZ25tZW50KGFlc19rZXlfc3QpID09IDQsIGFsaWdubWVudChhZXNfa2V5X3N0KQorQUVTX0tFWSA9IGFlc19rZXlfc3QKK2NsYXNzIGFzbjFfY3R4X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYXNuMV9jdHhfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdwJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdlb3MnLCBjX2ludCksCisgICAgKCdlcnJvcicsIGNfaW50KSwKKyAgICAoJ2luZicsIGNfaW50KSwKKyAgICAoJ3RhZycsIGNfaW50KSwKKyAgICAoJ3hjbGFzcycsIGNfaW50KSwKKyAgICAoJ3NsZW4nLCBjX2xvbmcpLAorICAgICgnbWF4JywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdxJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdwcCcsIFBPSU5URVIoUE9JTlRFUihjX3VieXRlKSkpLAorICAgICgnbGluZScsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoYXNuMV9jdHhfc3QpID09IDQ0LCBzaXplb2YoYXNuMV9jdHhfc3QpCithc3NlcnQgYWxpZ25tZW50KGFzbjFfY3R4X3N0KSA9PSA0LCBhbGlnbm1lbnQoYXNuMV9jdHhfc3QpCitBU04xX0NUWCA9IGFzbjFfY3R4X3N0CitjbGFzcyBhc24xX29iamVjdF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2FzbjFfb2JqZWN0X3N0Ll9maWVsZHNfID0gWworICAgICgnc24nLCBTVFJJTkcpLAorICAgICgnbG4nLCBTVFJJTkcpLAorICAgICgnbmlkJywgY19pbnQpLAorICAgICgnbGVuZ3RoJywgY19pbnQpLAorICAgICgnZGF0YScsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnZmxhZ3MnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKGFzbjFfb2JqZWN0X3N0KSA9PSAyNCwgc2l6ZW9mKGFzbjFfb2JqZWN0X3N0KQorYXNzZXJ0IGFsaWdubWVudChhc24xX29iamVjdF9zdCkgPT0gNCwgYWxpZ25tZW50KGFzbjFfb2JqZWN0X3N0KQorQVNOMV9PQkpFQ1QgPSBhc24xX29iamVjdF9zdAorY2xhc3MgYXNuMV9zdHJpbmdfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCithc24xX3N0cmluZ19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2xlbmd0aCcsIGNfaW50KSwKKyAgICAoJ3R5cGUnLCBjX2ludCksCisgICAgKCdkYXRhJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdmbGFncycsIGNfbG9uZyksCitdCithc3NlcnQgc2l6ZW9mKGFzbjFfc3RyaW5nX3N0KSA9PSAxNiwgc2l6ZW9mKGFzbjFfc3RyaW5nX3N0KQorYXNzZXJ0IGFsaWdubWVudChhc24xX3N0cmluZ19zdCkgPT0gNCwgYWxpZ25tZW50KGFzbjFfc3RyaW5nX3N0KQorQVNOMV9TVFJJTkcgPSBhc24xX3N0cmluZ19zdAorY2xhc3MgQVNOMV9FTkNPRElOR19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0FTTjFfRU5DT0RJTkdfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdlbmMnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ2xlbicsIGNfbG9uZyksCisgICAgKCdtb2RpZmllZCcsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoQVNOMV9FTkNPRElOR19zdCkgPT0gMTIsIHNpemVvZihBU04xX0VOQ09ESU5HX3N0KQorYXNzZXJ0IGFsaWdubWVudChBU04xX0VOQ09ESU5HX3N0KSA9PSA0LCBhbGlnbm1lbnQoQVNOMV9FTkNPRElOR19zdCkKK0FTTjFfRU5DT0RJTkcgPSBBU04xX0VOQ09ESU5HX3N0CitjbGFzcyBhc24xX3N0cmluZ190YWJsZV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2FzbjFfc3RyaW5nX3RhYmxlX3N0Ll9maWVsZHNfID0gWworICAgICgnbmlkJywgY19pbnQpLAorICAgICgnbWluc2l6ZScsIGNfbG9uZyksCisgICAgKCdtYXhzaXplJywgY19sb25nKSwKKyAgICAoJ21hc2snLCBjX3Vsb25nKSwKKyAgICAoJ2ZsYWdzJywgY191bG9uZyksCitdCithc3NlcnQgc2l6ZW9mKGFzbjFfc3RyaW5nX3RhYmxlX3N0KSA9PSAyMCwgc2l6ZW9mKGFzbjFfc3RyaW5nX3RhYmxlX3N0KQorYXNzZXJ0IGFsaWdubWVudChhc24xX3N0cmluZ190YWJsZV9zdCkgPT0gNCwgYWxpZ25tZW50KGFzbjFfc3RyaW5nX3RhYmxlX3N0KQorQVNOMV9TVFJJTkdfVEFCTEUgPSBhc24xX3N0cmluZ190YWJsZV9zdAorY2xhc3MgQVNOMV9URU1QTEFURV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0FTTjFfVEVNUExBVEVfc3QuX2ZpZWxkc18gPSBbCitdCitBU04xX1RFTVBMQVRFID0gQVNOMV9URU1QTEFURV9zdAorY2xhc3MgQVNOMV9JVEVNX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworQVNOMV9JVEVNID0gQVNOMV9JVEVNX3N0CitBU04xX0lURU1fc3QuX2ZpZWxkc18gPSBbCitdCitjbGFzcyBBU04xX1RMQ19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0FTTjFfVExDID0gQVNOMV9UTENfc3QKK0FTTjFfVExDX3N0Ll9maWVsZHNfID0gWworXQorY2xhc3MgQVNOMV9WQUxVRV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0FTTjFfVkFMVUVfc3QuX2ZpZWxkc18gPSBbCitdCitBU04xX1ZBTFVFID0gQVNOMV9WQUxVRV9zdAorQVNOMV9JVEVNX0VYUCA9IEFTTjFfSVRFTQorY2xhc3MgYXNuMV90eXBlX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY2xhc3MgTjEyYXNuMV90eXBlX3N0NERPTExBUl8xMUUoVW5pb24pOgorICAgIHBhc3MKK0FTTjFfQk9PTEVBTiA9IGNfaW50CitBU04xX0lOVEVHRVIgPSBhc24xX3N0cmluZ19zdAorQVNOMV9FTlVNRVJBVEVEID0gYXNuMV9zdHJpbmdfc3QKK0FTTjFfQklUX1NUUklORyA9IGFzbjFfc3RyaW5nX3N0CitBU04xX09DVEVUX1NUUklORyA9IGFzbjFfc3RyaW5nX3N0CitBU04xX1BSSU5UQUJMRVNUUklORyA9IGFzbjFfc3RyaW5nX3N0CitBU04xX1Q2MVNUUklORyA9IGFzbjFfc3RyaW5nX3N0CitBU04xX0lBNVNUUklORyA9IGFzbjFfc3RyaW5nX3N0CitBU04xX0dFTkVSQUxTVFJJTkcgPSBhc24xX3N0cmluZ19zdAorQVNOMV9CTVBTVFJJTkcgPSBhc24xX3N0cmluZ19zdAorQVNOMV9VTklWRVJTQUxTVFJJTkcgPSBhc24xX3N0cmluZ19zdAorQVNOMV9VVENUSU1FID0gYXNuMV9zdHJpbmdfc3QKK0FTTjFfR0VORVJBTElaRURUSU1FID0gYXNuMV9zdHJpbmdfc3QKK0FTTjFfVklTSUJMRVNUUklORyA9IGFzbjFfc3RyaW5nX3N0CitBU04xX1VURjhTVFJJTkcgPSBhc24xX3N0cmluZ19zdAorTjEyYXNuMV90eXBlX3N0NERPTExBUl8xMUUuX2ZpZWxkc18gPSBbCisgICAgKCdwdHInLCBTVFJJTkcpLAorICAgICgnYm9vbGVhbicsIEFTTjFfQk9PTEVBTiksCisgICAgKCdhc24xX3N0cmluZycsIFBPSU5URVIoQVNOMV9TVFJJTkcpKSwKKyAgICAoJ29iamVjdCcsIFBPSU5URVIoQVNOMV9PQkpFQ1QpKSwKKyAgICAoJ2ludGVnZXInLCBQT0lOVEVSKEFTTjFfSU5URUdFUikpLAorICAgICgnZW51bWVyYXRlZCcsIFBPSU5URVIoQVNOMV9FTlVNRVJBVEVEKSksCisgICAgKCdiaXRfc3RyaW5nJywgUE9JTlRFUihBU04xX0JJVF9TVFJJTkcpKSwKKyAgICAoJ29jdGV0X3N0cmluZycsIFBPSU5URVIoQVNOMV9PQ1RFVF9TVFJJTkcpKSwKKyAgICAoJ3ByaW50YWJsZXN0cmluZycsIFBPSU5URVIoQVNOMV9QUklOVEFCTEVTVFJJTkcpKSwKKyAgICAoJ3Q2MXN0cmluZycsIFBPSU5URVIoQVNOMV9UNjFTVFJJTkcpKSwKKyAgICAoJ2lhNXN0cmluZycsIFBPSU5URVIoQVNOMV9JQTVTVFJJTkcpKSwKKyAgICAoJ2dlbmVyYWxzdHJpbmcnLCBQT0lOVEVSKEFTTjFfR0VORVJBTFNUUklORykpLAorICAgICgnYm1wc3RyaW5nJywgUE9JTlRFUihBU04xX0JNUFNUUklORykpLAorICAgICgndW5pdmVyc2Fsc3RyaW5nJywgUE9JTlRFUihBU04xX1VOSVZFUlNBTFNUUklORykpLAorICAgICgndXRjdGltZScsIFBPSU5URVIoQVNOMV9VVENUSU1FKSksCisgICAgKCdnZW5lcmFsaXplZHRpbWUnLCBQT0lOVEVSKEFTTjFfR0VORVJBTElaRURUSU1FKSksCisgICAgKCd2aXNpYmxlc3RyaW5nJywgUE9JTlRFUihBU04xX1ZJU0lCTEVTVFJJTkcpKSwKKyAgICAoJ3V0ZjhzdHJpbmcnLCBQT0lOVEVSKEFTTjFfVVRGOFNUUklORykpLAorICAgICgnc2V0JywgUE9JTlRFUihBU04xX1NUUklORykpLAorICAgICgnc2VxdWVuY2UnLCBQT0lOVEVSKEFTTjFfU1RSSU5HKSksCitdCithc3NlcnQgc2l6ZW9mKE4xMmFzbjFfdHlwZV9zdDRET0xMQVJfMTFFKSA9PSA0LCBzaXplb2YoTjEyYXNuMV90eXBlX3N0NERPTExBUl8xMUUpCithc3NlcnQgYWxpZ25tZW50KE4xMmFzbjFfdHlwZV9zdDRET0xMQVJfMTFFKSA9PSA0LCBhbGlnbm1lbnQoTjEyYXNuMV90eXBlX3N0NERPTExBUl8xMUUpCithc24xX3R5cGVfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd0eXBlJywgY19pbnQpLAorICAgICgndmFsdWUnLCBOMTJhc24xX3R5cGVfc3Q0RE9MTEFSXzExRSksCitdCithc3NlcnQgc2l6ZW9mKGFzbjFfdHlwZV9zdCkgPT0gOCwgc2l6ZW9mKGFzbjFfdHlwZV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYXNuMV90eXBlX3N0KSA9PSA0LCBhbGlnbm1lbnQoYXNuMV90eXBlX3N0KQorQVNOMV9UWVBFID0gYXNuMV90eXBlX3N0CitjbGFzcyBhc24xX21ldGhvZF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2FzbjFfbWV0aG9kX3N0Ll9maWVsZHNfID0gWworICAgICgnaTJkJywgQ0ZVTkNUWVBFKGNfaW50KSksCisgICAgKCdkMmknLCBDRlVOQ1RZUEUoU1RSSU5HKSksCisgICAgKCdjcmVhdGUnLCBDRlVOQ1RZUEUoU1RSSU5HKSksCisgICAgKCdkZXN0cm95JywgQ0ZVTkNUWVBFKE5vbmUpKSwKK10KK2Fzc2VydCBzaXplb2YoYXNuMV9tZXRob2Rfc3QpID09IDE2LCBzaXplb2YoYXNuMV9tZXRob2Rfc3QpCithc3NlcnQgYWxpZ25tZW50KGFzbjFfbWV0aG9kX3N0KSA9PSA0LCBhbGlnbm1lbnQoYXNuMV9tZXRob2Rfc3QpCitBU04xX01FVEhPRCA9IGFzbjFfbWV0aG9kX3N0CitjbGFzcyBhc24xX2hlYWRlcl9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2FzbjFfaGVhZGVyX3N0Ll9maWVsZHNfID0gWworICAgICgnaGVhZGVyJywgUE9JTlRFUihBU04xX09DVEVUX1NUUklORykpLAorICAgICgnZGF0YScsIFNUUklORyksCisgICAgKCdtZXRoJywgUE9JTlRFUihBU04xX01FVEhPRCkpLAorXQorYXNzZXJ0IHNpemVvZihhc24xX2hlYWRlcl9zdCkgPT0gMTIsIHNpemVvZihhc24xX2hlYWRlcl9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYXNuMV9oZWFkZXJfc3QpID09IDQsIGFsaWdubWVudChhc24xX2hlYWRlcl9zdCkKK0FTTjFfSEVBREVSID0gYXNuMV9oZWFkZXJfc3QKK2NsYXNzIEJJVF9TVFJJTkdfQklUTkFNRV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0JJVF9TVFJJTkdfQklUTkFNRV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2JpdG51bScsIGNfaW50KSwKKyAgICAoJ2xuYW1lJywgU1RSSU5HKSwKKyAgICAoJ3NuYW1lJywgU1RSSU5HKSwKK10KK2Fzc2VydCBzaXplb2YoQklUX1NUUklOR19CSVROQU1FX3N0KSA9PSAxMiwgc2l6ZW9mKEJJVF9TVFJJTkdfQklUTkFNRV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoQklUX1NUUklOR19CSVROQU1FX3N0KSA9PSA0LCBhbGlnbm1lbnQoQklUX1NUUklOR19CSVROQU1FX3N0KQorQklUX1NUUklOR19CSVROQU1FID0gQklUX1NUUklOR19CSVROQU1FX3N0CitjbGFzcyBiaW9fc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitCSU8gPSBiaW9fc3QKK2Jpb19pbmZvX2NiID0gQ0ZVTkNUWVBFKE5vbmUsIFBPSU5URVIoYmlvX3N0KSwgY19pbnQsIFNUUklORywgY19pbnQsIGNfbG9uZywgY19sb25nKQorY2xhc3MgYmlvX21ldGhvZF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2Jpb19tZXRob2Rfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd0eXBlJywgY19pbnQpLAorICAgICgnbmFtZScsIFNUUklORyksCisgICAgKCdid3JpdGUnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoQklPKSwgU1RSSU5HLCBjX2ludCkpLAorICAgICgnYnJlYWQnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoQklPKSwgU1RSSU5HLCBjX2ludCkpLAorICAgICgnYnB1dHMnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoQklPKSwgU1RSSU5HKSksCisgICAgKCdiZ2V0cycsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihCSU8pLCBTVFJJTkcsIGNfaW50KSksCisgICAgKCdjdHJsJywgQ0ZVTkNUWVBFKGNfbG9uZywgUE9JTlRFUihCSU8pLCBjX2ludCwgY19sb25nLCBjX3ZvaWRfcCkpLAorICAgICgnY3JlYXRlJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEJJTykpKSwKKyAgICAoJ2Rlc3Ryb3knLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoQklPKSkpLAorICAgICgnY2FsbGJhY2tfY3RybCcsIENGVU5DVFlQRShjX2xvbmcsIFBPSU5URVIoQklPKSwgY19pbnQsIFBPSU5URVIoYmlvX2luZm9fY2IpKSksCitdCithc3NlcnQgc2l6ZW9mKGJpb19tZXRob2Rfc3QpID09IDQwLCBzaXplb2YoYmlvX21ldGhvZF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYmlvX21ldGhvZF9zdCkgPT0gNCwgYWxpZ25tZW50KGJpb19tZXRob2Rfc3QpCitCSU9fTUVUSE9EID0gYmlvX21ldGhvZF9zdAorY2xhc3MgY3J5cHRvX2V4X2RhdGFfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitjbGFzcyBzdGFja19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1NUQUNLID0gc3RhY2tfc3QKK2NyeXB0b19leF9kYXRhX3N0Ll9maWVsZHNfID0gWworICAgICgnc2snLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdkdW1teScsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoY3J5cHRvX2V4X2RhdGFfc3QpID09IDgsIHNpemVvZihjcnlwdG9fZXhfZGF0YV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoY3J5cHRvX2V4X2RhdGFfc3QpID09IDQsIGFsaWdubWVudChjcnlwdG9fZXhfZGF0YV9zdCkKK0NSWVBUT19FWF9EQVRBID0gY3J5cHRvX2V4X2RhdGFfc3QKK2Jpb19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ21ldGhvZCcsIFBPSU5URVIoQklPX01FVEhPRCkpLAorICAgICgnY2FsbGJhY2snLCBDRlVOQ1RZUEUoY19sb25nLCBQT0lOVEVSKGJpb19zdCksIGNfaW50LCBTVFJJTkcsIGNfaW50LCBjX2xvbmcsIGNfbG9uZykpLAorICAgICgnY2JfYXJnJywgU1RSSU5HKSwKKyAgICAoJ2luaXQnLCBjX2ludCksCisgICAgKCdzaHV0ZG93bicsIGNfaW50KSwKKyAgICAoJ2ZsYWdzJywgY19pbnQpLAorICAgICgncmV0cnlfcmVhc29uJywgY19pbnQpLAorICAgICgnbnVtJywgY19pbnQpLAorICAgICgncHRyJywgY192b2lkX3ApLAorICAgICgnbmV4dF9iaW8nLCBQT0lOVEVSKGJpb19zdCkpLAorICAgICgncHJldl9iaW8nLCBQT0lOVEVSKGJpb19zdCkpLAorICAgICgncmVmZXJlbmNlcycsIGNfaW50KSwKKyAgICAoJ251bV9yZWFkJywgY191bG9uZyksCisgICAgKCdudW1fd3JpdGUnLCBjX3Vsb25nKSwKKyAgICAoJ2V4X2RhdGEnLCBDUllQVE9fRVhfREFUQSksCitdCithc3NlcnQgc2l6ZW9mKGJpb19zdCkgPT0gNjQsIHNpemVvZihiaW9fc3QpCithc3NlcnQgYWxpZ25tZW50KGJpb19zdCkgPT0gNCwgYWxpZ25tZW50KGJpb19zdCkKK2NsYXNzIGJpb19mX2J1ZmZlcl9jdHhfc3RydWN0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYmlvX2ZfYnVmZmVyX2N0eF9zdHJ1Y3QuX2ZpZWxkc18gPSBbCisgICAgKCdpYnVmX3NpemUnLCBjX2ludCksCisgICAgKCdvYnVmX3NpemUnLCBjX2ludCksCisgICAgKCdpYnVmJywgU1RSSU5HKSwKKyAgICAoJ2lidWZfbGVuJywgY19pbnQpLAorICAgICgnaWJ1Zl9vZmYnLCBjX2ludCksCisgICAgKCdvYnVmJywgU1RSSU5HKSwKKyAgICAoJ29idWZfbGVuJywgY19pbnQpLAorICAgICgnb2J1Zl9vZmYnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKGJpb19mX2J1ZmZlcl9jdHhfc3RydWN0KSA9PSAzMiwgc2l6ZW9mKGJpb19mX2J1ZmZlcl9jdHhfc3RydWN0KQorYXNzZXJ0IGFsaWdubWVudChiaW9fZl9idWZmZXJfY3R4X3N0cnVjdCkgPT0gNCwgYWxpZ25tZW50KGJpb19mX2J1ZmZlcl9jdHhfc3RydWN0KQorQklPX0ZfQlVGRkVSX0NUWCA9IGJpb19mX2J1ZmZlcl9jdHhfc3RydWN0CitjbGFzcyBob3N0ZW50KFN0cnVjdHVyZSk6CisgICAgcGFzcworaG9zdGVudC5fZmllbGRzXyA9IFsKK10KK2NsYXNzIGJmX2tleV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2JmX2tleV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ1AnLCBjX3VpbnQgKiAxOCksCisgICAgKCdTJywgY191aW50ICogMTAyNCksCitdCithc3NlcnQgc2l6ZW9mKGJmX2tleV9zdCkgPT0gNDE2OCwgc2l6ZW9mKGJmX2tleV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYmZfa2V5X3N0KSA9PSA0LCBhbGlnbm1lbnQoYmZfa2V5X3N0KQorQkZfS0VZID0gYmZfa2V5X3N0CitjbGFzcyBiaWdudW1fc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitiaWdudW1fc3QuX2ZpZWxkc18gPSBbCisgICAgKCdkJywgUE9JTlRFUihjX3Vsb25nKSksCisgICAgKCd0b3AnLCBjX2ludCksCisgICAgKCdkbWF4JywgY19pbnQpLAorICAgICgnbmVnJywgY19pbnQpLAorICAgICgnZmxhZ3MnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKGJpZ251bV9zdCkgPT0gMjAsIHNpemVvZihiaWdudW1fc3QpCithc3NlcnQgYWxpZ25tZW50KGJpZ251bV9zdCkgPT0gNCwgYWxpZ25tZW50KGJpZ251bV9zdCkKK0JJR05VTSA9IGJpZ251bV9zdAorY2xhc3MgYmlnbnVtX2N0eChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2JpZ251bV9jdHguX2ZpZWxkc18gPSBbCitdCitCTl9DVFggPSBiaWdudW1fY3R4CitjbGFzcyBibl9ibGluZGluZ19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2JuX2JsaW5kaW5nX3N0Ll9maWVsZHNfID0gWworICAgICgnaW5pdCcsIGNfaW50KSwKKyAgICAoJ0EnLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgnQWknLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgnbW9kJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ3RocmVhZF9pZCcsIGNfdWxvbmcpLAorXQorYXNzZXJ0IHNpemVvZihibl9ibGluZGluZ19zdCkgPT0gMjAsIHNpemVvZihibl9ibGluZGluZ19zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYm5fYmxpbmRpbmdfc3QpID09IDQsIGFsaWdubWVudChibl9ibGluZGluZ19zdCkKK0JOX0JMSU5ESU5HID0gYm5fYmxpbmRpbmdfc3QKK2NsYXNzIGJuX21vbnRfY3R4X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYm5fbW9udF9jdHhfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdyaScsIGNfaW50KSwKKyAgICAoJ1JSJywgQklHTlVNKSwKKyAgICAoJ04nLCBCSUdOVU0pLAorICAgICgnTmknLCBCSUdOVU0pLAorICAgICgnbjAnLCBjX3Vsb25nKSwKKyAgICAoJ2ZsYWdzJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihibl9tb250X2N0eF9zdCkgPT0gNzIsIHNpemVvZihibl9tb250X2N0eF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYm5fbW9udF9jdHhfc3QpID09IDQsIGFsaWdubWVudChibl9tb250X2N0eF9zdCkKK0JOX01PTlRfQ1RYID0gYm5fbW9udF9jdHhfc3QKK2NsYXNzIGJuX3JlY3BfY3R4X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYm5fcmVjcF9jdHhfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdOJywgQklHTlVNKSwKKyAgICAoJ05yJywgQklHTlVNKSwKKyAgICAoJ251bV9iaXRzJywgY19pbnQpLAorICAgICgnc2hpZnQnLCBjX2ludCksCisgICAgKCdmbGFncycsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoYm5fcmVjcF9jdHhfc3QpID09IDUyLCBzaXplb2YoYm5fcmVjcF9jdHhfc3QpCithc3NlcnQgYWxpZ25tZW50KGJuX3JlY3BfY3R4X3N0KSA9PSA0LCBhbGlnbm1lbnQoYm5fcmVjcF9jdHhfc3QpCitCTl9SRUNQX0NUWCA9IGJuX3JlY3BfY3R4X3N0CitjbGFzcyBidWZfbWVtX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYnVmX21lbV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2xlbmd0aCcsIGNfaW50KSwKKyAgICAoJ2RhdGEnLCBTVFJJTkcpLAorICAgICgnbWF4JywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihidWZfbWVtX3N0KSA9PSAxMiwgc2l6ZW9mKGJ1Zl9tZW1fc3QpCithc3NlcnQgYWxpZ25tZW50KGJ1Zl9tZW1fc3QpID09IDQsIGFsaWdubWVudChidWZfbWVtX3N0KQorQlVGX01FTSA9IGJ1Zl9tZW1fc3QKK2NsYXNzIGNhc3Rfa2V5X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY2FzdF9rZXlfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdkYXRhJywgY191bG9uZyAqIDMyKSwKKyAgICAoJ3Nob3J0X2tleScsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoY2FzdF9rZXlfc3QpID09IDEzMiwgc2l6ZW9mKGNhc3Rfa2V5X3N0KQorYXNzZXJ0IGFsaWdubWVudChjYXN0X2tleV9zdCkgPT0gNCwgYWxpZ25tZW50KGNhc3Rfa2V5X3N0KQorQ0FTVF9LRVkgPSBjYXN0X2tleV9zdAorY2xhc3MgY29tcF9tZXRob2Rfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitjb21wX21ldGhvZF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3R5cGUnLCBjX2ludCksCisgICAgKCduYW1lJywgU1RSSU5HKSwKKyAgICAoJ2luaXQnLCBDRlVOQ1RZUEUoY19pbnQpKSwKKyAgICAoJ2ZpbmlzaCcsIENGVU5DVFlQRShOb25lKSksCisgICAgKCdjb21wcmVzcycsIENGVU5DVFlQRShjX2ludCkpLAorICAgICgnZXhwYW5kJywgQ0ZVTkNUWVBFKGNfaW50KSksCisgICAgKCdjdHJsJywgQ0ZVTkNUWVBFKGNfbG9uZykpLAorICAgICgnY2FsbGJhY2tfY3RybCcsIENGVU5DVFlQRShjX2xvbmcpKSwKK10KK2Fzc2VydCBzaXplb2YoY29tcF9tZXRob2Rfc3QpID09IDMyLCBzaXplb2YoY29tcF9tZXRob2Rfc3QpCithc3NlcnQgYWxpZ25tZW50KGNvbXBfbWV0aG9kX3N0KSA9PSA0LCBhbGlnbm1lbnQoY29tcF9tZXRob2Rfc3QpCitDT01QX01FVEhPRCA9IGNvbXBfbWV0aG9kX3N0CitjbGFzcyBjb21wX2N0eF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2NvbXBfY3R4X3N0Ll9maWVsZHNfID0gWworICAgICgnbWV0aCcsIFBPSU5URVIoQ09NUF9NRVRIT0QpKSwKKyAgICAoJ2NvbXByZXNzX2luJywgY191bG9uZyksCisgICAgKCdjb21wcmVzc19vdXQnLCBjX3Vsb25nKSwKKyAgICAoJ2V4cGFuZF9pbicsIGNfdWxvbmcpLAorICAgICgnZXhwYW5kX291dCcsIGNfdWxvbmcpLAorICAgICgnZXhfZGF0YScsIENSWVBUT19FWF9EQVRBKSwKK10KK2Fzc2VydCBzaXplb2YoY29tcF9jdHhfc3QpID09IDI4LCBzaXplb2YoY29tcF9jdHhfc3QpCithc3NlcnQgYWxpZ25tZW50KGNvbXBfY3R4X3N0KSA9PSA0LCBhbGlnbm1lbnQoY29tcF9jdHhfc3QpCitDT01QX0NUWCA9IGNvbXBfY3R4X3N0CitjbGFzcyBDUllQVE9fZHlubG9ja192YWx1ZShTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0NSWVBUT19keW5sb2NrX3ZhbHVlLl9maWVsZHNfID0gWworXQorY2xhc3MgQ1JZUFRPX2R5bmxvY2soU3RydWN0dXJlKToKKyAgICBwYXNzCitDUllQVE9fZHlubG9jay5fZmllbGRzXyA9IFsKKyAgICAoJ3JlZmVyZW5jZXMnLCBjX2ludCksCisgICAgKCdkYXRhJywgUE9JTlRFUihDUllQVE9fZHlubG9ja192YWx1ZSkpLAorXQorYXNzZXJ0IHNpemVvZihDUllQVE9fZHlubG9jaykgPT0gOCwgc2l6ZW9mKENSWVBUT19keW5sb2NrKQorYXNzZXJ0IGFsaWdubWVudChDUllQVE9fZHlubG9jaykgPT0gNCwgYWxpZ25tZW50KENSWVBUT19keW5sb2NrKQorQklPX2R1bW15ID0gYmlvX3N0CitDUllQVE9fRVhfbmV3ID0gQ0ZVTkNUWVBFKGNfaW50LCBjX3ZvaWRfcCwgY192b2lkX3AsIFBPSU5URVIoQ1JZUFRPX0VYX0RBVEEpLCBjX2ludCwgY19sb25nLCBjX3ZvaWRfcCkKK0NSWVBUT19FWF9mcmVlID0gQ0ZVTkNUWVBFKE5vbmUsIGNfdm9pZF9wLCBjX3ZvaWRfcCwgUE9JTlRFUihDUllQVE9fRVhfREFUQSksIGNfaW50LCBjX2xvbmcsIGNfdm9pZF9wKQorQ1JZUFRPX0VYX2R1cCA9IENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihDUllQVE9fRVhfREFUQSksIFBPSU5URVIoQ1JZUFRPX0VYX0RBVEEpLCBjX3ZvaWRfcCwgY19pbnQsIGNfbG9uZywgY192b2lkX3ApCitjbGFzcyBjcnlwdG9fZXhfZGF0YV9mdW5jX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY3J5cHRvX2V4X2RhdGFfZnVuY19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2FyZ2wnLCBjX2xvbmcpLAorICAgICgnYXJncCcsIGNfdm9pZF9wKSwKKyAgICAoJ25ld19mdW5jJywgUE9JTlRFUihDUllQVE9fRVhfbmV3KSksCisgICAgKCdmcmVlX2Z1bmMnLCBQT0lOVEVSKENSWVBUT19FWF9mcmVlKSksCisgICAgKCdkdXBfZnVuYycsIFBPSU5URVIoQ1JZUFRPX0VYX2R1cCkpLAorXQorYXNzZXJ0IHNpemVvZihjcnlwdG9fZXhfZGF0YV9mdW5jX3N0KSA9PSAyMCwgc2l6ZW9mKGNyeXB0b19leF9kYXRhX2Z1bmNfc3QpCithc3NlcnQgYWxpZ25tZW50KGNyeXB0b19leF9kYXRhX2Z1bmNfc3QpID09IDQsIGFsaWdubWVudChjcnlwdG9fZXhfZGF0YV9mdW5jX3N0KQorQ1JZUFRPX0VYX0RBVEFfRlVOQ1MgPSBjcnlwdG9fZXhfZGF0YV9mdW5jX3N0CitjbGFzcyBzdF9DUllQVE9fRVhfREFUQV9JTVBMKFN0cnVjdHVyZSk6CisgICAgcGFzcworQ1JZUFRPX0VYX0RBVEFfSU1QTCA9IHN0X0NSWVBUT19FWF9EQVRBX0lNUEwKK3N0X0NSWVBUT19FWF9EQVRBX0lNUEwuX2ZpZWxkc18gPSBbCitdCitDUllQVE9fTUVNX0xFQUtfQ0IgPSBDRlVOQ1RZUEUoY192b2lkX3AsIGNfdWxvbmcsIFNUUklORywgY19pbnQsIGNfaW50LCBjX3ZvaWRfcCkKK0RFU19jYmxvY2sgPSBjX3VieXRlICogOAorY29uc3RfREVTX2NibG9jayA9IGNfdWJ5dGUgKiA4CitjbGFzcyBERVNfa3MoU3RydWN0dXJlKToKKyAgICBwYXNzCitjbGFzcyBONkRFU19rczNET0xMQVJfOUUoVW5pb24pOgorICAgIHBhc3MKK042REVTX2tzM0RPTExBUl85RS5fZmllbGRzXyA9IFsKKyAgICAoJ2NibG9jaycsIERFU19jYmxvY2spLAorICAgICgnZGVzbG9uZycsIGNfdWxvbmcgKiAyKSwKK10KK2Fzc2VydCBzaXplb2YoTjZERVNfa3MzRE9MTEFSXzlFKSA9PSA4LCBzaXplb2YoTjZERVNfa3MzRE9MTEFSXzlFKQorYXNzZXJ0IGFsaWdubWVudChONkRFU19rczNET0xMQVJfOUUpID09IDQsIGFsaWdubWVudChONkRFU19rczNET0xMQVJfOUUpCitERVNfa3MuX2ZpZWxkc18gPSBbCisgICAgKCdrcycsIE42REVTX2tzM0RPTExBUl85RSAqIDE2KSwKK10KK2Fzc2VydCBzaXplb2YoREVTX2tzKSA9PSAxMjgsIHNpemVvZihERVNfa3MpCithc3NlcnQgYWxpZ25tZW50KERFU19rcykgPT0gNCwgYWxpZ25tZW50KERFU19rcykKK0RFU19rZXlfc2NoZWR1bGUgPSBERVNfa3MKK19vc3NsX29sZF9kZXNfY2Jsb2NrID0gY191Ynl0ZSAqIDgKK2NsYXNzIF9vc3NsX29sZF9kZXNfa3Nfc3RydWN0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY2xhc3MgTjIzX29zc2xfb2xkX2Rlc19rc19zdHJ1Y3Q0RE9MTEFSXzEwRShVbmlvbik6CisgICAgcGFzcworTjIzX29zc2xfb2xkX2Rlc19rc19zdHJ1Y3Q0RE9MTEFSXzEwRS5fZmllbGRzXyA9IFsKKyAgICAoJ18nLCBfb3NzbF9vbGRfZGVzX2NibG9jayksCisgICAgKCdwYWQnLCBjX3Vsb25nICogMiksCitdCithc3NlcnQgc2l6ZW9mKE4yM19vc3NsX29sZF9kZXNfa3Nfc3RydWN0NERPTExBUl8xMEUpID09IDgsIHNpemVvZihOMjNfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdDRET0xMQVJfMTBFKQorYXNzZXJ0IGFsaWdubWVudChOMjNfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdDRET0xMQVJfMTBFKSA9PSA0LCBhbGlnbm1lbnQoTjIzX29zc2xfb2xkX2Rlc19rc19zdHJ1Y3Q0RE9MTEFSXzEwRSkKK19vc3NsX29sZF9kZXNfa3Nfc3RydWN0Ll9maWVsZHNfID0gWworICAgICgna3MnLCBOMjNfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdDRET0xMQVJfMTBFKSwKK10KK2Fzc2VydCBzaXplb2YoX29zc2xfb2xkX2Rlc19rc19zdHJ1Y3QpID09IDgsIHNpemVvZihfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdCkKK2Fzc2VydCBhbGlnbm1lbnQoX29zc2xfb2xkX2Rlc19rc19zdHJ1Y3QpID09IDQsIGFsaWdubWVudChfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdCkKK19vc3NsX29sZF9kZXNfa2V5X3NjaGVkdWxlID0gX29zc2xfb2xkX2Rlc19rc19zdHJ1Y3QgKiAxNgorY2xhc3MgZGhfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitESCA9IGRoX3N0CitjbGFzcyBkaF9tZXRob2QoU3RydWN0dXJlKToKKyAgICBwYXNzCitkaF9tZXRob2QuX2ZpZWxkc18gPSBbCisgICAgKCduYW1lJywgU1RSSU5HKSwKKyAgICAoJ2dlbmVyYXRlX2tleScsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihESCkpKSwKKyAgICAoJ2NvbXB1dGVfa2V5JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKGNfdWJ5dGUpLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoREgpKSksCisgICAgKCdibl9tb2RfZXhwJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKERIKSwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJOX0NUWCksIFBPSU5URVIoQk5fTU9OVF9DVFgpKSksCisgICAgKCdpbml0JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKERIKSkpLAorICAgICgnZmluaXNoJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKERIKSkpLAorICAgICgnZmxhZ3MnLCBjX2ludCksCisgICAgKCdhcHBfZGF0YScsIFNUUklORyksCitdCithc3NlcnQgc2l6ZW9mKGRoX21ldGhvZCkgPT0gMzIsIHNpemVvZihkaF9tZXRob2QpCithc3NlcnQgYWxpZ25tZW50KGRoX21ldGhvZCkgPT0gNCwgYWxpZ25tZW50KGRoX21ldGhvZCkKK0RIX01FVEhPRCA9IGRoX21ldGhvZAorY2xhc3MgZW5naW5lX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworRU5HSU5FID0gZW5naW5lX3N0CitkaF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3BhZCcsIGNfaW50KSwKKyAgICAoJ3ZlcnNpb24nLCBjX2ludCksCisgICAgKCdwJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ2cnLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgnbGVuZ3RoJywgY19sb25nKSwKKyAgICAoJ3B1Yl9rZXknLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgncHJpdl9rZXknLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgnZmxhZ3MnLCBjX2ludCksCisgICAgKCdtZXRob2RfbW9udF9wJywgU1RSSU5HKSwKKyAgICAoJ3EnLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgnaicsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdzZWVkJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdzZWVkbGVuJywgY19pbnQpLAorICAgICgnY291bnRlcicsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdyZWZlcmVuY2VzJywgY19pbnQpLAorICAgICgnZXhfZGF0YScsIENSWVBUT19FWF9EQVRBKSwKKyAgICAoJ21ldGgnLCBQT0lOVEVSKERIX01FVEhPRCkpLAorICAgICgnZW5naW5lJywgUE9JTlRFUihFTkdJTkUpKSwKK10KK2Fzc2VydCBzaXplb2YoZGhfc3QpID09IDc2LCBzaXplb2YoZGhfc3QpCithc3NlcnQgYWxpZ25tZW50KGRoX3N0KSA9PSA0LCBhbGlnbm1lbnQoZGhfc3QpCitjbGFzcyBkc2Ffc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitEU0EgPSBkc2Ffc3QKK2NsYXNzIERTQV9TSUdfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitEU0FfU0lHX3N0Ll9maWVsZHNfID0gWworICAgICgncicsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdzJywgUE9JTlRFUihCSUdOVU0pKSwKK10KK2Fzc2VydCBzaXplb2YoRFNBX1NJR19zdCkgPT0gOCwgc2l6ZW9mKERTQV9TSUdfc3QpCithc3NlcnQgYWxpZ25tZW50KERTQV9TSUdfc3QpID09IDQsIGFsaWdubWVudChEU0FfU0lHX3N0KQorRFNBX1NJRyA9IERTQV9TSUdfc3QKK2NsYXNzIGRzYV9tZXRob2QoU3RydWN0dXJlKToKKyAgICBwYXNzCitkc2FfbWV0aG9kLl9maWVsZHNfID0gWworICAgICgnbmFtZScsIFNUUklORyksCisgICAgKCdkc2FfZG9fc2lnbicsIENGVU5DVFlQRShQT0lOVEVSKERTQV9TSUcpLCBQT0lOVEVSKGNfdWJ5dGUpLCBjX2ludCwgUE9JTlRFUihEU0EpKSksCisgICAgKCdkc2Ffc2lnbl9zZXR1cCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihEU0EpLCBQT0lOVEVSKEJOX0NUWCksIFBPSU5URVIoUE9JTlRFUihCSUdOVU0pKSwgUE9JTlRFUihQT0lOVEVSKEJJR05VTSkpKSksCisgICAgKCdkc2FfZG9fdmVyaWZ5JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKGNfdWJ5dGUpLCBjX2ludCwgUE9JTlRFUihEU0FfU0lHKSwgUE9JTlRFUihEU0EpKSksCisgICAgKCdkc2FfbW9kX2V4cCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihEU0EpLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJOX0NUWCksIFBPSU5URVIoQk5fTU9OVF9DVFgpKSksCisgICAgKCdibl9tb2RfZXhwJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKERTQSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihCTl9DVFgpLCBQT0lOVEVSKEJOX01PTlRfQ1RYKSkpLAorICAgICgnaW5pdCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihEU0EpKSksCisgICAgKCdmaW5pc2gnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoRFNBKSkpLAorICAgICgnZmxhZ3MnLCBjX2ludCksCisgICAgKCdhcHBfZGF0YScsIFNUUklORyksCitdCithc3NlcnQgc2l6ZW9mKGRzYV9tZXRob2QpID09IDQwLCBzaXplb2YoZHNhX21ldGhvZCkKK2Fzc2VydCBhbGlnbm1lbnQoZHNhX21ldGhvZCkgPT0gNCwgYWxpZ25tZW50KGRzYV9tZXRob2QpCitEU0FfTUVUSE9EID0gZHNhX21ldGhvZAorZHNhX3N0Ll9maWVsZHNfID0gWworICAgICgncGFkJywgY19pbnQpLAorICAgICgndmVyc2lvbicsIGNfbG9uZyksCisgICAgKCd3cml0ZV9wYXJhbXMnLCBjX2ludCksCisgICAgKCdwJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ3EnLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgnZycsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdwdWJfa2V5JywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ3ByaXZfa2V5JywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ2tpbnYnLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgncicsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdmbGFncycsIGNfaW50KSwKKyAgICAoJ21ldGhvZF9tb250X3AnLCBTVFJJTkcpLAorICAgICgncmVmZXJlbmNlcycsIGNfaW50KSwKKyAgICAoJ2V4X2RhdGEnLCBDUllQVE9fRVhfREFUQSksCisgICAgKCdtZXRoJywgUE9JTlRFUihEU0FfTUVUSE9EKSksCisgICAgKCdlbmdpbmUnLCBQT0lOVEVSKEVOR0lORSkpLAorXQorYXNzZXJ0IHNpemVvZihkc2Ffc3QpID09IDY4LCBzaXplb2YoZHNhX3N0KQorYXNzZXJ0IGFsaWdubWVudChkc2Ffc3QpID09IDQsIGFsaWdubWVudChkc2Ffc3QpCitjbGFzcyBldnBfcGtleV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2NsYXNzIE4xMWV2cF9wa2V5X3N0NERPTExBUl8xMkUoVW5pb24pOgorICAgIHBhc3MKK2NsYXNzIHJzYV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK04xMWV2cF9wa2V5X3N0NERPTExBUl8xMkUuX2ZpZWxkc18gPSBbCisgICAgKCdwdHInLCBTVFJJTkcpLAorICAgICgncnNhJywgUE9JTlRFUihyc2Ffc3QpKSwKKyAgICAoJ2RzYScsIFBPSU5URVIoZHNhX3N0KSksCisgICAgKCdkaCcsIFBPSU5URVIoZGhfc3QpKSwKK10KK2Fzc2VydCBzaXplb2YoTjExZXZwX3BrZXlfc3Q0RE9MTEFSXzEyRSkgPT0gNCwgc2l6ZW9mKE4xMWV2cF9wa2V5X3N0NERPTExBUl8xMkUpCithc3NlcnQgYWxpZ25tZW50KE4xMWV2cF9wa2V5X3N0NERPTExBUl8xMkUpID09IDQsIGFsaWdubWVudChOMTFldnBfcGtleV9zdDRET0xMQVJfMTJFKQorZXZwX3BrZXlfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd0eXBlJywgY19pbnQpLAorICAgICgnc2F2ZV90eXBlJywgY19pbnQpLAorICAgICgncmVmZXJlbmNlcycsIGNfaW50KSwKKyAgICAoJ3BrZXknLCBOMTFldnBfcGtleV9zdDRET0xMQVJfMTJFKSwKKyAgICAoJ3NhdmVfcGFyYW1ldGVycycsIGNfaW50KSwKKyAgICAoJ2F0dHJpYnV0ZXMnLCBQT0lOVEVSKFNUQUNLKSksCitdCithc3NlcnQgc2l6ZW9mKGV2cF9wa2V5X3N0KSA9PSAyNCwgc2l6ZW9mKGV2cF9wa2V5X3N0KQorYXNzZXJ0IGFsaWdubWVudChldnBfcGtleV9zdCkgPT0gNCwgYWxpZ25tZW50KGV2cF9wa2V5X3N0KQorY2xhc3MgZW52X21kX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY2xhc3MgZW52X21kX2N0eF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0VWUF9NRF9DVFggPSBlbnZfbWRfY3R4X3N0CitlbnZfbWRfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd0eXBlJywgY19pbnQpLAorICAgICgncGtleV90eXBlJywgY19pbnQpLAorICAgICgnbWRfc2l6ZScsIGNfaW50KSwKKyAgICAoJ2ZsYWdzJywgY191bG9uZyksCisgICAgKCdpbml0JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEVWUF9NRF9DVFgpKSksCisgICAgKCd1cGRhdGUnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoRVZQX01EX0NUWCksIGNfdm9pZF9wLCBjX3Vsb25nKSksCisgICAgKCdmaW5hbCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihFVlBfTURfQ1RYKSwgUE9JTlRFUihjX3VieXRlKSkpLAorICAgICgnY29weScsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihFVlBfTURfQ1RYKSwgUE9JTlRFUihFVlBfTURfQ1RYKSkpLAorICAgICgnY2xlYW51cCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihFVlBfTURfQ1RYKSkpLAorICAgICgnc2lnbicsIENGVU5DVFlQRShjX2ludCkpLAorICAgICgndmVyaWZ5JywgQ0ZVTkNUWVBFKGNfaW50KSksCisgICAgKCdyZXF1aXJlZF9wa2V5X3R5cGUnLCBjX2ludCAqIDUpLAorICAgICgnYmxvY2tfc2l6ZScsIGNfaW50KSwKKyAgICAoJ2N0eF9zaXplJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihlbnZfbWRfc3QpID09IDcyLCBzaXplb2YoZW52X21kX3N0KQorYXNzZXJ0IGFsaWdubWVudChlbnZfbWRfc3QpID09IDQsIGFsaWdubWVudChlbnZfbWRfc3QpCitFVlBfTUQgPSBlbnZfbWRfc3QKK2Vudl9tZF9jdHhfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdkaWdlc3QnLCBQT0lOVEVSKEVWUF9NRCkpLAorICAgICgnZW5naW5lJywgUE9JTlRFUihFTkdJTkUpKSwKKyAgICAoJ2ZsYWdzJywgY191bG9uZyksCisgICAgKCdtZF9kYXRhJywgY192b2lkX3ApLAorXQorYXNzZXJ0IHNpemVvZihlbnZfbWRfY3R4X3N0KSA9PSAxNiwgc2l6ZW9mKGVudl9tZF9jdHhfc3QpCithc3NlcnQgYWxpZ25tZW50KGVudl9tZF9jdHhfc3QpID09IDQsIGFsaWdubWVudChlbnZfbWRfY3R4X3N0KQorY2xhc3MgZXZwX2NpcGhlcl9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2NsYXNzIGV2cF9jaXBoZXJfY3R4X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworRVZQX0NJUEhFUl9DVFggPSBldnBfY2lwaGVyX2N0eF9zdAorZXZwX2NpcGhlcl9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ25pZCcsIGNfaW50KSwKKyAgICAoJ2Jsb2NrX3NpemUnLCBjX2ludCksCisgICAgKCdrZXlfbGVuJywgY19pbnQpLAorICAgICgnaXZfbGVuJywgY19pbnQpLAorICAgICgnZmxhZ3MnLCBjX3Vsb25nKSwKKyAgICAoJ2luaXQnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoRVZQX0NJUEhFUl9DVFgpLCBQT0lOVEVSKGNfdWJ5dGUpLCBQT0lOVEVSKGNfdWJ5dGUpLCBjX2ludCkpLAorICAgICgnZG9fY2lwaGVyJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEVWUF9DSVBIRVJfQ1RYKSwgUE9JTlRFUihjX3VieXRlKSwgUE9JTlRFUihjX3VieXRlKSwgY191aW50KSksCisgICAgKCdjbGVhbnVwJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEVWUF9DSVBIRVJfQ1RYKSkpLAorICAgICgnY3R4X3NpemUnLCBjX2ludCksCisgICAgKCdzZXRfYXNuMV9wYXJhbWV0ZXJzJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEVWUF9DSVBIRVJfQ1RYKSwgUE9JTlRFUihBU04xX1RZUEUpKSksCisgICAgKCdnZXRfYXNuMV9wYXJhbWV0ZXJzJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEVWUF9DSVBIRVJfQ1RYKSwgUE9JTlRFUihBU04xX1RZUEUpKSksCisgICAgKCdjdHJsJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEVWUF9DSVBIRVJfQ1RYKSwgY19pbnQsIGNfaW50LCBjX3ZvaWRfcCkpLAorICAgICgnYXBwX2RhdGEnLCBjX3ZvaWRfcCksCitdCithc3NlcnQgc2l6ZW9mKGV2cF9jaXBoZXJfc3QpID09IDUyLCBzaXplb2YoZXZwX2NpcGhlcl9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoZXZwX2NpcGhlcl9zdCkgPT0gNCwgYWxpZ25tZW50KGV2cF9jaXBoZXJfc3QpCitjbGFzcyBldnBfY2lwaGVyX2luZm9fc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitFVlBfQ0lQSEVSID0gZXZwX2NpcGhlcl9zdAorZXZwX2NpcGhlcl9pbmZvX3N0Ll9maWVsZHNfID0gWworICAgICgnY2lwaGVyJywgUE9JTlRFUihFVlBfQ0lQSEVSKSksCisgICAgKCdpdicsIGNfdWJ5dGUgKiAxNiksCitdCithc3NlcnQgc2l6ZW9mKGV2cF9jaXBoZXJfaW5mb19zdCkgPT0gMjAsIHNpemVvZihldnBfY2lwaGVyX2luZm9fc3QpCithc3NlcnQgYWxpZ25tZW50KGV2cF9jaXBoZXJfaW5mb19zdCkgPT0gNCwgYWxpZ25tZW50KGV2cF9jaXBoZXJfaW5mb19zdCkKK0VWUF9DSVBIRVJfSU5GTyA9IGV2cF9jaXBoZXJfaW5mb19zdAorZXZwX2NpcGhlcl9jdHhfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdjaXBoZXInLCBQT0lOVEVSKEVWUF9DSVBIRVIpKSwKKyAgICAoJ2VuZ2luZScsIFBPSU5URVIoRU5HSU5FKSksCisgICAgKCdlbmNyeXB0JywgY19pbnQpLAorICAgICgnYnVmX2xlbicsIGNfaW50KSwKKyAgICAoJ29pdicsIGNfdWJ5dGUgKiAxNiksCisgICAgKCdpdicsIGNfdWJ5dGUgKiAxNiksCisgICAgKCdidWYnLCBjX3VieXRlICogMzIpLAorICAgICgnbnVtJywgY19pbnQpLAorICAgICgnYXBwX2RhdGEnLCBjX3ZvaWRfcCksCisgICAgKCdrZXlfbGVuJywgY19pbnQpLAorICAgICgnZmxhZ3MnLCBjX3Vsb25nKSwKKyAgICAoJ2NpcGhlcl9kYXRhJywgY192b2lkX3ApLAorICAgICgnZmluYWxfdXNlZCcsIGNfaW50KSwKKyAgICAoJ2Jsb2NrX21hc2snLCBjX2ludCksCisgICAgKCdmaW5hbCcsIGNfdWJ5dGUgKiAzMiksCitdCithc3NlcnQgc2l6ZW9mKGV2cF9jaXBoZXJfY3R4X3N0KSA9PSAxNDAsIHNpemVvZihldnBfY2lwaGVyX2N0eF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoZXZwX2NpcGhlcl9jdHhfc3QpID09IDQsIGFsaWdubWVudChldnBfY2lwaGVyX2N0eF9zdCkKK2NsYXNzIGV2cF9FbmNvZGVfQ3R4X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworZXZwX0VuY29kZV9DdHhfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdudW0nLCBjX2ludCksCisgICAgKCdsZW5ndGgnLCBjX2ludCksCisgICAgKCdlbmNfZGF0YScsIGNfdWJ5dGUgKiA4MCksCisgICAgKCdsaW5lX251bScsIGNfaW50KSwKKyAgICAoJ2V4cGVjdF9ubCcsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoZXZwX0VuY29kZV9DdHhfc3QpID09IDk2LCBzaXplb2YoZXZwX0VuY29kZV9DdHhfc3QpCithc3NlcnQgYWxpZ25tZW50KGV2cF9FbmNvZGVfQ3R4X3N0KSA9PSA0LCBhbGlnbm1lbnQoZXZwX0VuY29kZV9DdHhfc3QpCitFVlBfRU5DT0RFX0NUWCA9IGV2cF9FbmNvZGVfQ3R4X3N0CitFVlBfUEJFX0tFWUdFTiA9IENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihFVlBfQ0lQSEVSX0NUWCksIFNUUklORywgY19pbnQsIFBPSU5URVIoQVNOMV9UWVBFKSwgUE9JTlRFUihFVlBfQ0lQSEVSKSwgUE9JTlRFUihFVlBfTUQpLCBjX2ludCkKK2NsYXNzIGxoYXNoX25vZGVfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitsaGFzaF9ub2RlX3N0Ll9maWVsZHNfID0gWworICAgICgnZGF0YScsIGNfdm9pZF9wKSwKKyAgICAoJ25leHQnLCBQT0lOVEVSKGxoYXNoX25vZGVfc3QpKSwKKyAgICAoJ2hhc2gnLCBjX3Vsb25nKSwKK10KK2Fzc2VydCBzaXplb2YobGhhc2hfbm9kZV9zdCkgPT0gMTIsIHNpemVvZihsaGFzaF9ub2RlX3N0KQorYXNzZXJ0IGFsaWdubWVudChsaGFzaF9ub2RlX3N0KSA9PSA0LCBhbGlnbm1lbnQobGhhc2hfbm9kZV9zdCkKK0xIQVNIX05PREUgPSBsaGFzaF9ub2RlX3N0CitMSEFTSF9DT01QX0ZOX1RZUEUgPSBDRlVOQ1RZUEUoY19pbnQsIGNfdm9pZF9wLCBjX3ZvaWRfcCkKK0xIQVNIX0hBU0hfRk5fVFlQRSA9IENGVU5DVFlQRShjX3Vsb25nLCBjX3ZvaWRfcCkKK0xIQVNIX0RPQUxMX0ZOX1RZUEUgPSBDRlVOQ1RZUEUoTm9uZSwgY192b2lkX3ApCitMSEFTSF9ET0FMTF9BUkdfRk5fVFlQRSA9IENGVU5DVFlQRShOb25lLCBjX3ZvaWRfcCwgY192b2lkX3ApCitjbGFzcyBsaGFzaF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2xoYXNoX3N0Ll9maWVsZHNfID0gWworICAgICgnYicsIFBPSU5URVIoUE9JTlRFUihMSEFTSF9OT0RFKSkpLAorICAgICgnY29tcCcsIExIQVNIX0NPTVBfRk5fVFlQRSksCisgICAgKCdoYXNoJywgTEhBU0hfSEFTSF9GTl9UWVBFKSwKKyAgICAoJ251bV9ub2RlcycsIGNfdWludCksCisgICAgKCdudW1fYWxsb2Nfbm9kZXMnLCBjX3VpbnQpLAorICAgICgncCcsIGNfdWludCksCisgICAgKCdwbWF4JywgY191aW50KSwKKyAgICAoJ3VwX2xvYWQnLCBjX3Vsb25nKSwKKyAgICAoJ2Rvd25fbG9hZCcsIGNfdWxvbmcpLAorICAgICgnbnVtX2l0ZW1zJywgY191bG9uZyksCisgICAgKCdudW1fZXhwYW5kcycsIGNfdWxvbmcpLAorICAgICgnbnVtX2V4cGFuZF9yZWFsbG9jcycsIGNfdWxvbmcpLAorICAgICgnbnVtX2NvbnRyYWN0cycsIGNfdWxvbmcpLAorICAgICgnbnVtX2NvbnRyYWN0X3JlYWxsb2NzJywgY191bG9uZyksCisgICAgKCdudW1faGFzaF9jYWxscycsIGNfdWxvbmcpLAorICAgICgnbnVtX2NvbXBfY2FsbHMnLCBjX3Vsb25nKSwKKyAgICAoJ251bV9pbnNlcnQnLCBjX3Vsb25nKSwKKyAgICAoJ251bV9yZXBsYWNlJywgY191bG9uZyksCisgICAgKCdudW1fZGVsZXRlJywgY191bG9uZyksCisgICAgKCdudW1fbm9fZGVsZXRlJywgY191bG9uZyksCisgICAgKCdudW1fcmV0cmlldmUnLCBjX3Vsb25nKSwKKyAgICAoJ251bV9yZXRyaWV2ZV9taXNzJywgY191bG9uZyksCisgICAgKCdudW1faGFzaF9jb21wcycsIGNfdWxvbmcpLAorICAgICgnZXJyb3InLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKGxoYXNoX3N0KSA9PSA5Niwgc2l6ZW9mKGxoYXNoX3N0KQorYXNzZXJ0IGFsaWdubWVudChsaGFzaF9zdCkgPT0gNCwgYWxpZ25tZW50KGxoYXNoX3N0KQorTEhBU0ggPSBsaGFzaF9zdAorY2xhc3MgTUQyc3RhdGVfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitNRDJzdGF0ZV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ251bScsIGNfaW50KSwKKyAgICAoJ2RhdGEnLCBjX3VieXRlICogMTYpLAorICAgICgnY2tzbScsIGNfdWludCAqIDE2KSwKKyAgICAoJ3N0YXRlJywgY191aW50ICogMTYpLAorXQorYXNzZXJ0IHNpemVvZihNRDJzdGF0ZV9zdCkgPT0gMTQ4LCBzaXplb2YoTUQyc3RhdGVfc3QpCithc3NlcnQgYWxpZ25tZW50KE1EMnN0YXRlX3N0KSA9PSA0LCBhbGlnbm1lbnQoTUQyc3RhdGVfc3QpCitNRDJfQ1RYID0gTUQyc3RhdGVfc3QKK2NsYXNzIE1ENHN0YXRlX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworTUQ0c3RhdGVfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdBJywgY191aW50KSwKKyAgICAoJ0InLCBjX3VpbnQpLAorICAgICgnQycsIGNfdWludCksCisgICAgKCdEJywgY191aW50KSwKKyAgICAoJ05sJywgY191aW50KSwKKyAgICAoJ05oJywgY191aW50KSwKKyAgICAoJ2RhdGEnLCBjX3VpbnQgKiAxNiksCisgICAgKCdudW0nLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKE1ENHN0YXRlX3N0KSA9PSA5Miwgc2l6ZW9mKE1ENHN0YXRlX3N0KQorYXNzZXJ0IGFsaWdubWVudChNRDRzdGF0ZV9zdCkgPT0gNCwgYWxpZ25tZW50KE1ENHN0YXRlX3N0KQorTUQ0X0NUWCA9IE1ENHN0YXRlX3N0CitjbGFzcyBNRDVzdGF0ZV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK01ENXN0YXRlX3N0Ll9maWVsZHNfID0gWworICAgICgnQScsIGNfdWludCksCisgICAgKCdCJywgY191aW50KSwKKyAgICAoJ0MnLCBjX3VpbnQpLAorICAgICgnRCcsIGNfdWludCksCisgICAgKCdObCcsIGNfdWludCksCisgICAgKCdOaCcsIGNfdWludCksCisgICAgKCdkYXRhJywgY191aW50ICogMTYpLAorICAgICgnbnVtJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihNRDVzdGF0ZV9zdCkgPT0gOTIsIHNpemVvZihNRDVzdGF0ZV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoTUQ1c3RhdGVfc3QpID09IDQsIGFsaWdubWVudChNRDVzdGF0ZV9zdCkKK01ENV9DVFggPSBNRDVzdGF0ZV9zdAorY2xhc3MgbWRjMl9jdHhfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCittZGMyX2N0eF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ251bScsIGNfaW50KSwKKyAgICAoJ2RhdGEnLCBjX3VieXRlICogOCksCisgICAgKCdoJywgREVTX2NibG9jayksCisgICAgKCdoaCcsIERFU19jYmxvY2spLAorICAgICgncGFkX3R5cGUnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKG1kYzJfY3R4X3N0KSA9PSAzMiwgc2l6ZW9mKG1kYzJfY3R4X3N0KQorYXNzZXJ0IGFsaWdubWVudChtZGMyX2N0eF9zdCkgPT0gNCwgYWxpZ25tZW50KG1kYzJfY3R4X3N0KQorTURDMl9DVFggPSBtZGMyX2N0eF9zdAorY2xhc3Mgb2JqX25hbWVfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitvYmpfbmFtZV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3R5cGUnLCBjX2ludCksCisgICAgKCdhbGlhcycsIGNfaW50KSwKKyAgICAoJ25hbWUnLCBTVFJJTkcpLAorICAgICgnZGF0YScsIFNUUklORyksCitdCithc3NlcnQgc2l6ZW9mKG9ial9uYW1lX3N0KSA9PSAxNiwgc2l6ZW9mKG9ial9uYW1lX3N0KQorYXNzZXJ0IGFsaWdubWVudChvYmpfbmFtZV9zdCkgPT0gNCwgYWxpZ25tZW50KG9ial9uYW1lX3N0KQorT0JKX05BTUUgPSBvYmpfbmFtZV9zdAorQVNOMV9USU1FID0gYXNuMV9zdHJpbmdfc3QKK0FTTjFfTlVMTCA9IGNfaW50CitFVlBfUEtFWSA9IGV2cF9wa2V5X3N0CitjbGFzcyB4NTA5X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworWDUwOSA9IHg1MDlfc3QKK2NsYXNzIFg1MDlfYWxnb3Jfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X0FMR09SID0gWDUwOV9hbGdvcl9zdAorY2xhc3MgWDUwOV9jcmxfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X0NSTCA9IFg1MDlfY3JsX3N0CitjbGFzcyBYNTA5X25hbWVfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X05BTUUgPSBYNTA5X25hbWVfc3QKK2NsYXNzIHg1MDlfc3RvcmVfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X1NUT1JFID0geDUwOV9zdG9yZV9zdAorY2xhc3MgeDUwOV9zdG9yZV9jdHhfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X1NUT1JFX0NUWCA9IHg1MDlfc3RvcmVfY3R4X3N0CitlbmdpbmVfc3QuX2ZpZWxkc18gPSBbCitdCitjbGFzcyBQRU1fRW5jb2RlX1NlYWxfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitQRU1fRW5jb2RlX1NlYWxfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdlbmNvZGUnLCBFVlBfRU5DT0RFX0NUWCksCisgICAgKCdtZCcsIEVWUF9NRF9DVFgpLAorICAgICgnY2lwaGVyJywgRVZQX0NJUEhFUl9DVFgpLAorXQorYXNzZXJ0IHNpemVvZihQRU1fRW5jb2RlX1NlYWxfc3QpID09IDI1Miwgc2l6ZW9mKFBFTV9FbmNvZGVfU2VhbF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoUEVNX0VuY29kZV9TZWFsX3N0KSA9PSA0LCBhbGlnbm1lbnQoUEVNX0VuY29kZV9TZWFsX3N0KQorUEVNX0VOQ09ERV9TRUFMX0NUWCA9IFBFTV9FbmNvZGVfU2VhbF9zdAorY2xhc3MgcGVtX3JlY2lwX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworcGVtX3JlY2lwX3N0Ll9maWVsZHNfID0gWworICAgICgnbmFtZScsIFNUUklORyksCisgICAgKCdkbicsIFBPSU5URVIoWDUwOV9OQU1FKSksCisgICAgKCdjaXBoZXInLCBjX2ludCksCisgICAgKCdrZXlfZW5jJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihwZW1fcmVjaXBfc3QpID09IDE2LCBzaXplb2YocGVtX3JlY2lwX3N0KQorYXNzZXJ0IGFsaWdubWVudChwZW1fcmVjaXBfc3QpID09IDQsIGFsaWdubWVudChwZW1fcmVjaXBfc3QpCitQRU1fVVNFUiA9IHBlbV9yZWNpcF9zdAorY2xhc3MgcGVtX2N0eF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2NsYXNzIE4xMHBlbV9jdHhfc3Q0RE9MTEFSXzE2RShTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK04xMHBlbV9jdHhfc3Q0RE9MTEFSXzE2RS5fZmllbGRzXyA9IFsKKyAgICAoJ3ZlcnNpb24nLCBjX2ludCksCisgICAgKCdtb2RlJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihOMTBwZW1fY3R4X3N0NERPTExBUl8xNkUpID09IDgsIHNpemVvZihOMTBwZW1fY3R4X3N0NERPTExBUl8xNkUpCithc3NlcnQgYWxpZ25tZW50KE4xMHBlbV9jdHhfc3Q0RE9MTEFSXzE2RSkgPT0gNCwgYWxpZ25tZW50KE4xMHBlbV9jdHhfc3Q0RE9MTEFSXzE2RSkKK2NsYXNzIE4xMHBlbV9jdHhfc3Q0RE9MTEFSXzE3RShTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK04xMHBlbV9jdHhfc3Q0RE9MTEFSXzE3RS5fZmllbGRzXyA9IFsKKyAgICAoJ2NpcGhlcicsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoTjEwcGVtX2N0eF9zdDRET0xMQVJfMTdFKSA9PSA0LCBzaXplb2YoTjEwcGVtX2N0eF9zdDRET0xMQVJfMTdFKQorYXNzZXJ0IGFsaWdubWVudChOMTBwZW1fY3R4X3N0NERPTExBUl8xN0UpID09IDQsIGFsaWdubWVudChOMTBwZW1fY3R4X3N0NERPTExBUl8xN0UpCitwZW1fY3R4X3N0Ll9maWVsZHNfID0gWworICAgICgndHlwZScsIGNfaW50KSwKKyAgICAoJ3Byb2NfdHlwZScsIE4xMHBlbV9jdHhfc3Q0RE9MTEFSXzE2RSksCisgICAgKCdkb21haW4nLCBTVFJJTkcpLAorICAgICgnREVLX2luZm8nLCBOMTBwZW1fY3R4X3N0NERPTExBUl8xN0UpLAorICAgICgnb3JpZ2luYXRvcicsIFBPSU5URVIoUEVNX1VTRVIpKSwKKyAgICAoJ251bV9yZWNpcGllbnQnLCBjX2ludCksCisgICAgKCdyZWNpcGllbnQnLCBQT0lOVEVSKFBPSU5URVIoUEVNX1VTRVIpKSksCisgICAgKCd4NTA5X2NoYWluJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnbWQnLCBQT0lOVEVSKEVWUF9NRCkpLAorICAgICgnbWRfZW5jJywgY19pbnQpLAorICAgICgnbWRfbGVuJywgY19pbnQpLAorICAgICgnbWRfZGF0YScsIFNUUklORyksCisgICAgKCdkZWMnLCBQT0lOVEVSKEVWUF9DSVBIRVIpKSwKKyAgICAoJ2tleV9sZW4nLCBjX2ludCksCisgICAgKCdrZXknLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ2RhdGFfZW5jJywgY19pbnQpLAorICAgICgnZGF0YV9sZW4nLCBjX2ludCksCisgICAgKCdkYXRhJywgUE9JTlRFUihjX3VieXRlKSksCitdCithc3NlcnQgc2l6ZW9mKHBlbV9jdHhfc3QpID09IDc2LCBzaXplb2YocGVtX2N0eF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQocGVtX2N0eF9zdCkgPT0gNCwgYWxpZ25tZW50KHBlbV9jdHhfc3QpCitQRU1fQ1RYID0gcGVtX2N0eF9zdAorcGVtX3Bhc3N3b3JkX2NiID0gQ0ZVTkNUWVBFKGNfaW50LCBTVFJJTkcsIGNfaW50LCBjX2ludCwgY192b2lkX3ApCitjbGFzcyBwa2NzN19pc3N1ZXJfYW5kX3NlcmlhbF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3BrY3M3X2lzc3Vlcl9hbmRfc2VyaWFsX3N0Ll9maWVsZHNfID0gWworICAgICgnaXNzdWVyJywgUE9JTlRFUihYNTA5X05BTUUpKSwKKyAgICAoJ3NlcmlhbCcsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCitdCithc3NlcnQgc2l6ZW9mKHBrY3M3X2lzc3Vlcl9hbmRfc2VyaWFsX3N0KSA9PSA4LCBzaXplb2YocGtjczdfaXNzdWVyX2FuZF9zZXJpYWxfc3QpCithc3NlcnQgYWxpZ25tZW50KHBrY3M3X2lzc3Vlcl9hbmRfc2VyaWFsX3N0KSA9PSA0LCBhbGlnbm1lbnQocGtjczdfaXNzdWVyX2FuZF9zZXJpYWxfc3QpCitQS0NTN19JU1NVRVJfQU5EX1NFUklBTCA9IHBrY3M3X2lzc3Vlcl9hbmRfc2VyaWFsX3N0CitjbGFzcyBwa2NzN19zaWduZXJfaW5mb19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3BrY3M3X3NpZ25lcl9pbmZvX3N0Ll9maWVsZHNfID0gWworICAgICgndmVyc2lvbicsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCisgICAgKCdpc3N1ZXJfYW5kX3NlcmlhbCcsIFBPSU5URVIoUEtDUzdfSVNTVUVSX0FORF9TRVJJQUwpKSwKKyAgICAoJ2RpZ2VzdF9hbGcnLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKKyAgICAoJ2F1dGhfYXR0cicsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2RpZ2VzdF9lbmNfYWxnJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdlbmNfZGlnZXN0JywgUE9JTlRFUihBU04xX09DVEVUX1NUUklORykpLAorICAgICgndW5hdXRoX2F0dHInLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdwa2V5JywgUE9JTlRFUihFVlBfUEtFWSkpLAorXQorYXNzZXJ0IHNpemVvZihwa2NzN19zaWduZXJfaW5mb19zdCkgPT0gMzIsIHNpemVvZihwa2NzN19zaWduZXJfaW5mb19zdCkKK2Fzc2VydCBhbGlnbm1lbnQocGtjczdfc2lnbmVyX2luZm9fc3QpID09IDQsIGFsaWdubWVudChwa2NzN19zaWduZXJfaW5mb19zdCkKK1BLQ1M3X1NJR05FUl9JTkZPID0gcGtjczdfc2lnbmVyX2luZm9fc3QKK2NsYXNzIHBrY3M3X3JlY2lwX2luZm9fc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitwa2NzN19yZWNpcF9pbmZvX3N0Ll9maWVsZHNfID0gWworICAgICgndmVyc2lvbicsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCisgICAgKCdpc3N1ZXJfYW5kX3NlcmlhbCcsIFBPSU5URVIoUEtDUzdfSVNTVUVSX0FORF9TRVJJQUwpKSwKKyAgICAoJ2tleV9lbmNfYWxnb3InLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKKyAgICAoJ2VuY19rZXknLCBQT0lOVEVSKEFTTjFfT0NURVRfU1RSSU5HKSksCisgICAgKCdjZXJ0JywgUE9JTlRFUihYNTA5KSksCitdCithc3NlcnQgc2l6ZW9mKHBrY3M3X3JlY2lwX2luZm9fc3QpID09IDIwLCBzaXplb2YocGtjczdfcmVjaXBfaW5mb19zdCkKK2Fzc2VydCBhbGlnbm1lbnQocGtjczdfcmVjaXBfaW5mb19zdCkgPT0gNCwgYWxpZ25tZW50KHBrY3M3X3JlY2lwX2luZm9fc3QpCitQS0NTN19SRUNJUF9JTkZPID0gcGtjczdfcmVjaXBfaW5mb19zdAorY2xhc3MgcGtjczdfc2lnbmVkX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY2xhc3MgcGtjczdfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitwa2NzN19zaWduZWRfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd2ZXJzaW9uJywgUE9JTlRFUihBU04xX0lOVEVHRVIpKSwKKyAgICAoJ21kX2FsZ3MnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdjZXJ0JywgUE9JTlRFUihTVEFDSykpLAorICAgICgnY3JsJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnc2lnbmVyX2luZm8nLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdjb250ZW50cycsIFBPSU5URVIocGtjczdfc3QpKSwKK10KK2Fzc2VydCBzaXplb2YocGtjczdfc2lnbmVkX3N0KSA9PSAyNCwgc2l6ZW9mKHBrY3M3X3NpZ25lZF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQocGtjczdfc2lnbmVkX3N0KSA9PSA0LCBhbGlnbm1lbnQocGtjczdfc2lnbmVkX3N0KQorUEtDUzdfU0lHTkVEID0gcGtjczdfc2lnbmVkX3N0CitjbGFzcyBwa2NzN19lbmNfY29udGVudF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3BrY3M3X2VuY19jb250ZW50X3N0Ll9maWVsZHNfID0gWworICAgICgnY29udGVudF90eXBlJywgUE9JTlRFUihBU04xX09CSkVDVCkpLAorICAgICgnYWxnb3JpdGhtJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdlbmNfZGF0YScsIFBPSU5URVIoQVNOMV9PQ1RFVF9TVFJJTkcpKSwKKyAgICAoJ2NpcGhlcicsIFBPSU5URVIoRVZQX0NJUEhFUikpLAorXQorYXNzZXJ0IHNpemVvZihwa2NzN19lbmNfY29udGVudF9zdCkgPT0gMTYsIHNpemVvZihwa2NzN19lbmNfY29udGVudF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQocGtjczdfZW5jX2NvbnRlbnRfc3QpID09IDQsIGFsaWdubWVudChwa2NzN19lbmNfY29udGVudF9zdCkKK1BLQ1M3X0VOQ19DT05URU5UID0gcGtjczdfZW5jX2NvbnRlbnRfc3QKK2NsYXNzIHBrY3M3X2VudmVsb3BlZF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3BrY3M3X2VudmVsb3BlZF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3ZlcnNpb24nLCBQT0lOVEVSKEFTTjFfSU5URUdFUikpLAorICAgICgncmVjaXBpZW50aW5mbycsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2VuY19kYXRhJywgUE9JTlRFUihQS0NTN19FTkNfQ09OVEVOVCkpLAorXQorYXNzZXJ0IHNpemVvZihwa2NzN19lbnZlbG9wZWRfc3QpID09IDEyLCBzaXplb2YocGtjczdfZW52ZWxvcGVkX3N0KQorYXNzZXJ0IGFsaWdubWVudChwa2NzN19lbnZlbG9wZWRfc3QpID09IDQsIGFsaWdubWVudChwa2NzN19lbnZlbG9wZWRfc3QpCitQS0NTN19FTlZFTE9QRSA9IHBrY3M3X2VudmVsb3BlZF9zdAorY2xhc3MgcGtjczdfc2lnbmVkYW5kZW52ZWxvcGVkX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworcGtjczdfc2lnbmVkYW5kZW52ZWxvcGVkX3N0Ll9maWVsZHNfID0gWworICAgICgndmVyc2lvbicsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCisgICAgKCdtZF9hbGdzJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnY2VydCcsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2NybCcsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ3NpZ25lcl9pbmZvJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnZW5jX2RhdGEnLCBQT0lOVEVSKFBLQ1M3X0VOQ19DT05URU5UKSksCisgICAgKCdyZWNpcGllbnRpbmZvJywgUE9JTlRFUihTVEFDSykpLAorXQorYXNzZXJ0IHNpemVvZihwa2NzN19zaWduZWRhbmRlbnZlbG9wZWRfc3QpID09IDI4LCBzaXplb2YocGtjczdfc2lnbmVkYW5kZW52ZWxvcGVkX3N0KQorYXNzZXJ0IGFsaWdubWVudChwa2NzN19zaWduZWRhbmRlbnZlbG9wZWRfc3QpID09IDQsIGFsaWdubWVudChwa2NzN19zaWduZWRhbmRlbnZlbG9wZWRfc3QpCitQS0NTN19TSUdOX0VOVkVMT1BFID0gcGtjczdfc2lnbmVkYW5kZW52ZWxvcGVkX3N0CitjbGFzcyBwa2NzN19kaWdlc3Rfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitwa2NzN19kaWdlc3Rfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd2ZXJzaW9uJywgUE9JTlRFUihBU04xX0lOVEVHRVIpKSwKKyAgICAoJ21kJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdjb250ZW50cycsIFBPSU5URVIocGtjczdfc3QpKSwKKyAgICAoJ2RpZ2VzdCcsIFBPSU5URVIoQVNOMV9PQ1RFVF9TVFJJTkcpKSwKK10KK2Fzc2VydCBzaXplb2YocGtjczdfZGlnZXN0X3N0KSA9PSAxNiwgc2l6ZW9mKHBrY3M3X2RpZ2VzdF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQocGtjczdfZGlnZXN0X3N0KSA9PSA0LCBhbGlnbm1lbnQocGtjczdfZGlnZXN0X3N0KQorUEtDUzdfRElHRVNUID0gcGtjczdfZGlnZXN0X3N0CitjbGFzcyBwa2NzN19lbmNyeXB0ZWRfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitwa2NzN19lbmNyeXB0ZWRfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd2ZXJzaW9uJywgUE9JTlRFUihBU04xX0lOVEVHRVIpKSwKKyAgICAoJ2VuY19kYXRhJywgUE9JTlRFUihQS0NTN19FTkNfQ09OVEVOVCkpLAorXQorYXNzZXJ0IHNpemVvZihwa2NzN19lbmNyeXB0ZWRfc3QpID09IDgsIHNpemVvZihwa2NzN19lbmNyeXB0ZWRfc3QpCithc3NlcnQgYWxpZ25tZW50KHBrY3M3X2VuY3J5cHRlZF9zdCkgPT0gNCwgYWxpZ25tZW50KHBrY3M3X2VuY3J5cHRlZF9zdCkKK1BLQ1M3X0VOQ1JZUFQgPSBwa2NzN19lbmNyeXB0ZWRfc3QKK2NsYXNzIE44cGtjczdfc3Q0RE9MTEFSXzE1RShVbmlvbik6CisgICAgcGFzcworTjhwa2NzN19zdDRET0xMQVJfMTVFLl9maWVsZHNfID0gWworICAgICgncHRyJywgU1RSSU5HKSwKKyAgICAoJ2RhdGEnLCBQT0lOVEVSKEFTTjFfT0NURVRfU1RSSU5HKSksCisgICAgKCdzaWduJywgUE9JTlRFUihQS0NTN19TSUdORUQpKSwKKyAgICAoJ2VudmVsb3BlZCcsIFBPSU5URVIoUEtDUzdfRU5WRUxPUEUpKSwKKyAgICAoJ3NpZ25lZF9hbmRfZW52ZWxvcGVkJywgUE9JTlRFUihQS0NTN19TSUdOX0VOVkVMT1BFKSksCisgICAgKCdkaWdlc3QnLCBQT0lOVEVSKFBLQ1M3X0RJR0VTVCkpLAorICAgICgnZW5jcnlwdGVkJywgUE9JTlRFUihQS0NTN19FTkNSWVBUKSksCisgICAgKCdvdGhlcicsIFBPSU5URVIoQVNOMV9UWVBFKSksCitdCithc3NlcnQgc2l6ZW9mKE44cGtjczdfc3Q0RE9MTEFSXzE1RSkgPT0gNCwgc2l6ZW9mKE44cGtjczdfc3Q0RE9MTEFSXzE1RSkKK2Fzc2VydCBhbGlnbm1lbnQoTjhwa2NzN19zdDRET0xMQVJfMTVFKSA9PSA0LCBhbGlnbm1lbnQoTjhwa2NzN19zdDRET0xMQVJfMTVFKQorcGtjczdfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdhc24xJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdsZW5ndGgnLCBjX2xvbmcpLAorICAgICgnc3RhdGUnLCBjX2ludCksCisgICAgKCdkZXRhY2hlZCcsIGNfaW50KSwKKyAgICAoJ3R5cGUnLCBQT0lOVEVSKEFTTjFfT0JKRUNUKSksCisgICAgKCdkJywgTjhwa2NzN19zdDRET0xMQVJfMTVFKSwKK10KK2Fzc2VydCBzaXplb2YocGtjczdfc3QpID09IDI0LCBzaXplb2YocGtjczdfc3QpCithc3NlcnQgYWxpZ25tZW50KHBrY3M3X3N0KSA9PSA0LCBhbGlnbm1lbnQocGtjczdfc3QpCitQS0NTNyA9IHBrY3M3X3N0CitjbGFzcyByYzJfa2V5X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworcmMyX2tleV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2RhdGEnLCBjX3VpbnQgKiA2NCksCitdCithc3NlcnQgc2l6ZW9mKHJjMl9rZXlfc3QpID09IDI1Niwgc2l6ZW9mKHJjMl9rZXlfc3QpCithc3NlcnQgYWxpZ25tZW50KHJjMl9rZXlfc3QpID09IDQsIGFsaWdubWVudChyYzJfa2V5X3N0KQorUkMyX0tFWSA9IHJjMl9rZXlfc3QKK2NsYXNzIHJjNF9rZXlfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCityYzRfa2V5X3N0Ll9maWVsZHNfID0gWworICAgICgneCcsIGNfdWJ5dGUpLAorICAgICgneScsIGNfdWJ5dGUpLAorICAgICgnZGF0YScsIGNfdWJ5dGUgKiAyNTYpLAorXQorYXNzZXJ0IHNpemVvZihyYzRfa2V5X3N0KSA9PSAyNTgsIHNpemVvZihyYzRfa2V5X3N0KQorYXNzZXJ0IGFsaWdubWVudChyYzRfa2V5X3N0KSA9PSAxLCBhbGlnbm1lbnQocmM0X2tleV9zdCkKK1JDNF9LRVkgPSByYzRfa2V5X3N0CitjbGFzcyByYzVfa2V5X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworcmM1X2tleV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3JvdW5kcycsIGNfaW50KSwKKyAgICAoJ2RhdGEnLCBjX3Vsb25nICogMzQpLAorXQorYXNzZXJ0IHNpemVvZihyYzVfa2V5X3N0KSA9PSAxNDAsIHNpemVvZihyYzVfa2V5X3N0KQorYXNzZXJ0IGFsaWdubWVudChyYzVfa2V5X3N0KSA9PSA0LCBhbGlnbm1lbnQocmM1X2tleV9zdCkKK1JDNV8zMl9LRVkgPSByYzVfa2V5X3N0CitjbGFzcyBSSVBFTUQxNjBzdGF0ZV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1JJUEVNRDE2MHN0YXRlX3N0Ll9maWVsZHNfID0gWworICAgICgnQScsIGNfdWludCksCisgICAgKCdCJywgY191aW50KSwKKyAgICAoJ0MnLCBjX3VpbnQpLAorICAgICgnRCcsIGNfdWludCksCisgICAgKCdFJywgY191aW50KSwKKyAgICAoJ05sJywgY191aW50KSwKKyAgICAoJ05oJywgY191aW50KSwKKyAgICAoJ2RhdGEnLCBjX3VpbnQgKiAxNiksCisgICAgKCdudW0nLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKFJJUEVNRDE2MHN0YXRlX3N0KSA9PSA5Niwgc2l6ZW9mKFJJUEVNRDE2MHN0YXRlX3N0KQorYXNzZXJ0IGFsaWdubWVudChSSVBFTUQxNjBzdGF0ZV9zdCkgPT0gNCwgYWxpZ25tZW50KFJJUEVNRDE2MHN0YXRlX3N0KQorUklQRU1EMTYwX0NUWCA9IFJJUEVNRDE2MHN0YXRlX3N0CitSU0EgPSByc2Ffc3QKK2NsYXNzIHJzYV9tZXRoX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworcnNhX21ldGhfc3QuX2ZpZWxkc18gPSBbCisgICAgKCduYW1lJywgU1RSSU5HKSwKKyAgICAoJ3JzYV9wdWJfZW5jJywgQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCwgUE9JTlRFUihjX3VieXRlKSwgUE9JTlRFUihjX3VieXRlKSwgUE9JTlRFUihSU0EpLCBjX2ludCkpLAorICAgICgncnNhX3B1Yl9kZWMnLCBDRlVOQ1RZUEUoY19pbnQsIGNfaW50LCBQT0lOVEVSKGNfdWJ5dGUpLCBQT0lOVEVSKGNfdWJ5dGUpLCBQT0lOVEVSKFJTQSksIGNfaW50KSksCisgICAgKCdyc2FfcHJpdl9lbmMnLCBDRlVOQ1RZUEUoY19pbnQsIGNfaW50LCBQT0lOVEVSKGNfdWJ5dGUpLCBQT0lOVEVSKGNfdWJ5dGUpLCBQT0lOVEVSKFJTQSksIGNfaW50KSksCisgICAgKCdyc2FfcHJpdl9kZWMnLCBDRlVOQ1RZUEUoY19pbnQsIGNfaW50LCBQT0lOVEVSKGNfdWJ5dGUpLCBQT0lOVEVSKGNfdWJ5dGUpLCBQT0lOVEVSKFJTQSksIGNfaW50KSksCisgICAgKCdyc2FfbW9kX2V4cCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoUlNBKSkpLAorICAgICgnYm5fbW9kX2V4cCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJOX0NUWCksIFBPSU5URVIoQk5fTU9OVF9DVFgpKSksCisgICAgKCdpbml0JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFJTQSkpKSwKKyAgICAoJ2ZpbmlzaCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihSU0EpKSksCisgICAgKCdmbGFncycsIGNfaW50KSwKKyAgICAoJ2FwcF9kYXRhJywgU1RSSU5HKSwKKyAgICAoJ3JzYV9zaWduJywgQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCwgUE9JTlRFUihjX3VieXRlKSwgY191aW50LCBQT0lOVEVSKGNfdWJ5dGUpLCBQT0lOVEVSKGNfdWludCksIFBPSU5URVIoUlNBKSkpLAorICAgICgncnNhX3ZlcmlmeScsIENGVU5DVFlQRShjX2ludCwgY19pbnQsIFBPSU5URVIoY191Ynl0ZSksIGNfdWludCwgUE9JTlRFUihjX3VieXRlKSwgY191aW50LCBQT0lOVEVSKFJTQSkpKSwKK10KK2Fzc2VydCBzaXplb2YocnNhX21ldGhfc3QpID09IDUyLCBzaXplb2YocnNhX21ldGhfc3QpCithc3NlcnQgYWxpZ25tZW50KHJzYV9tZXRoX3N0KSA9PSA0LCBhbGlnbm1lbnQocnNhX21ldGhfc3QpCitSU0FfTUVUSE9EID0gcnNhX21ldGhfc3QKK3JzYV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3BhZCcsIGNfaW50KSwKKyAgICAoJ3ZlcnNpb24nLCBjX2xvbmcpLAorICAgICgnbWV0aCcsIFBPSU5URVIoUlNBX01FVEhPRCkpLAorICAgICgnZW5naW5lJywgUE9JTlRFUihFTkdJTkUpKSwKKyAgICAoJ24nLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgnZScsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdkJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ3AnLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgncScsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdkbXAxJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ2RtcTEnLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgnaXFtcCcsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdleF9kYXRhJywgQ1JZUFRPX0VYX0RBVEEpLAorICAgICgncmVmZXJlbmNlcycsIGNfaW50KSwKKyAgICAoJ2ZsYWdzJywgY19pbnQpLAorICAgICgnX21ldGhvZF9tb2RfbicsIFBPSU5URVIoQk5fTU9OVF9DVFgpKSwKKyAgICAoJ19tZXRob2RfbW9kX3AnLCBQT0lOVEVSKEJOX01PTlRfQ1RYKSksCisgICAgKCdfbWV0aG9kX21vZF9xJywgUE9JTlRFUihCTl9NT05UX0NUWCkpLAorICAgICgnYmlnbnVtX2RhdGEnLCBTVFJJTkcpLAorICAgICgnYmxpbmRpbmcnLCBQT0lOVEVSKEJOX0JMSU5ESU5HKSksCitdCithc3NlcnQgc2l6ZW9mKHJzYV9zdCkgPT0gODQsIHNpemVvZihyc2Ffc3QpCithc3NlcnQgYWxpZ25tZW50KHJzYV9zdCkgPT0gNCwgYWxpZ25tZW50KHJzYV9zdCkKK29wZW5zc2xfZnB0ciA9IENGVU5DVFlQRShOb25lKQorY2xhc3MgU0hBc3RhdGVfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitTSEFzdGF0ZV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2gwJywgY191aW50KSwKKyAgICAoJ2gxJywgY191aW50KSwKKyAgICAoJ2gyJywgY191aW50KSwKKyAgICAoJ2gzJywgY191aW50KSwKKyAgICAoJ2g0JywgY191aW50KSwKKyAgICAoJ05sJywgY191aW50KSwKKyAgICAoJ05oJywgY191aW50KSwKKyAgICAoJ2RhdGEnLCBjX3VpbnQgKiAxNiksCisgICAgKCdudW0nLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKFNIQXN0YXRlX3N0KSA9PSA5Niwgc2l6ZW9mKFNIQXN0YXRlX3N0KQorYXNzZXJ0IGFsaWdubWVudChTSEFzdGF0ZV9zdCkgPT0gNCwgYWxpZ25tZW50KFNIQXN0YXRlX3N0KQorU0hBX0NUWCA9IFNIQXN0YXRlX3N0CitjbGFzcyBzc2xfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitzc2xfY3JvY2tfc3QgPSBQT0lOVEVSKHNzbF9zdCkKK2NsYXNzIHNzbF9jaXBoZXJfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitzc2xfY2lwaGVyX3N0Ll9maWVsZHNfID0gWworICAgICgndmFsaWQnLCBjX2ludCksCisgICAgKCduYW1lJywgU1RSSU5HKSwKKyAgICAoJ2lkJywgY191bG9uZyksCisgICAgKCdhbGdvcml0aG1zJywgY191bG9uZyksCisgICAgKCdhbGdvX3N0cmVuZ3RoJywgY191bG9uZyksCisgICAgKCdhbGdvcml0aG0yJywgY191bG9uZyksCisgICAgKCdzdHJlbmd0aF9iaXRzJywgY19pbnQpLAorICAgICgnYWxnX2JpdHMnLCBjX2ludCksCisgICAgKCdtYXNrJywgY191bG9uZyksCisgICAgKCdtYXNrX3N0cmVuZ3RoJywgY191bG9uZyksCitdCithc3NlcnQgc2l6ZW9mKHNzbF9jaXBoZXJfc3QpID09IDQwLCBzaXplb2Yoc3NsX2NpcGhlcl9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoc3NsX2NpcGhlcl9zdCkgPT0gNCwgYWxpZ25tZW50KHNzbF9jaXBoZXJfc3QpCitTU0xfQ0lQSEVSID0gc3NsX2NpcGhlcl9zdAorU1NMID0gc3NsX3N0CitjbGFzcyBzc2xfY3R4X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworU1NMX0NUWCA9IHNzbF9jdHhfc3QKK2NsYXNzIHNzbF9tZXRob2Rfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitjbGFzcyBzc2wzX2VuY19tZXRob2QoU3RydWN0dXJlKToKKyAgICBwYXNzCitzc2xfbWV0aG9kX3N0Ll9maWVsZHNfID0gWworICAgICgndmVyc2lvbicsIGNfaW50KSwKKyAgICAoJ3NzbF9uZXcnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoU1NMKSkpLAorICAgICgnc3NsX2NsZWFyJywgQ0ZVTkNUWVBFKE5vbmUsIFBPSU5URVIoU1NMKSkpLAorICAgICgnc3NsX2ZyZWUnLCBDRlVOQ1RZUEUoTm9uZSwgUE9JTlRFUihTU0wpKSksCisgICAgKCdzc2xfYWNjZXB0JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFNTTCkpKSwKKyAgICAoJ3NzbF9jb25uZWN0JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFNTTCkpKSwKKyAgICAoJ3NzbF9yZWFkJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFNTTCksIGNfdm9pZF9wLCBjX2ludCkpLAorICAgICgnc3NsX3BlZWsnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoU1NMKSwgY192b2lkX3AsIGNfaW50KSksCisgICAgKCdzc2xfd3JpdGUnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoU1NMKSwgY192b2lkX3AsIGNfaW50KSksCisgICAgKCdzc2xfc2h1dGRvd24nLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoU1NMKSkpLAorICAgICgnc3NsX3JlbmVnb3RpYXRlJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFNTTCkpKSwKKyAgICAoJ3NzbF9yZW5lZ290aWF0ZV9jaGVjaycsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihTU0wpKSksCisgICAgKCdzc2xfY3RybCcsIENGVU5DVFlQRShjX2xvbmcsIFBPSU5URVIoU1NMKSwgY19pbnQsIGNfbG9uZywgY192b2lkX3ApKSwKKyAgICAoJ3NzbF9jdHhfY3RybCcsIENGVU5DVFlQRShjX2xvbmcsIFBPSU5URVIoU1NMX0NUWCksIGNfaW50LCBjX2xvbmcsIGNfdm9pZF9wKSksCisgICAgKCdnZXRfY2lwaGVyX2J5X2NoYXInLCBDRlVOQ1RZUEUoUE9JTlRFUihTU0xfQ0lQSEVSKSwgUE9JTlRFUihjX3VieXRlKSkpLAorICAgICgncHV0X2NpcGhlcl9ieV9jaGFyJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFNTTF9DSVBIRVIpLCBQT0lOVEVSKGNfdWJ5dGUpKSksCisgICAgKCdzc2xfcGVuZGluZycsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihTU0wpKSksCisgICAgKCdudW1fY2lwaGVycycsIENGVU5DVFlQRShjX2ludCkpLAorICAgICgnZ2V0X2NpcGhlcicsIENGVU5DVFlQRShQT0lOVEVSKFNTTF9DSVBIRVIpLCBjX3VpbnQpKSwKKyAgICAoJ2dldF9zc2xfbWV0aG9kJywgQ0ZVTkNUWVBFKFBPSU5URVIoc3NsX21ldGhvZF9zdCksIGNfaW50KSksCisgICAgKCdnZXRfdGltZW91dCcsIENGVU5DVFlQRShjX2xvbmcpKSwKKyAgICAoJ3NzbDNfZW5jJywgUE9JTlRFUihzc2wzX2VuY19tZXRob2QpKSwKKyAgICAoJ3NzbF92ZXJzaW9uJywgQ0ZVTkNUWVBFKGNfaW50KSksCisgICAgKCdzc2xfY2FsbGJhY2tfY3RybCcsIENGVU5DVFlQRShjX2xvbmcsIFBPSU5URVIoU1NMKSwgY19pbnQsIENGVU5DVFlQRShOb25lKSkpLAorICAgICgnc3NsX2N0eF9jYWxsYmFja19jdHJsJywgQ0ZVTkNUWVBFKGNfbG9uZywgUE9JTlRFUihTU0xfQ1RYKSwgY19pbnQsIENGVU5DVFlQRShOb25lKSkpLAorXQorYXNzZXJ0IHNpemVvZihzc2xfbWV0aG9kX3N0KSA9PSAxMDAsIHNpemVvZihzc2xfbWV0aG9kX3N0KQorYXNzZXJ0IGFsaWdubWVudChzc2xfbWV0aG9kX3N0KSA9PSA0LCBhbGlnbm1lbnQoc3NsX21ldGhvZF9zdCkKK3NzbDNfZW5jX21ldGhvZC5fZmllbGRzXyA9IFsKK10KK1NTTF9NRVRIT0QgPSBzc2xfbWV0aG9kX3N0CitjbGFzcyBzc2xfc2Vzc2lvbl9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2NsYXNzIHNlc3NfY2VydF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3NzbF9zZXNzaW9uX3N0Ll9maWVsZHNfID0gWworICAgICgnc3NsX3ZlcnNpb24nLCBjX2ludCksCisgICAgKCdrZXlfYXJnX2xlbmd0aCcsIGNfdWludCksCisgICAgKCdrZXlfYXJnJywgY191Ynl0ZSAqIDgpLAorICAgICgnbWFzdGVyX2tleV9sZW5ndGgnLCBjX2ludCksCisgICAgKCdtYXN0ZXJfa2V5JywgY191Ynl0ZSAqIDQ4KSwKKyAgICAoJ3Nlc3Npb25faWRfbGVuZ3RoJywgY191aW50KSwKKyAgICAoJ3Nlc3Npb25faWQnLCBjX3VieXRlICogMzIpLAorICAgICgnc2lkX2N0eF9sZW5ndGgnLCBjX3VpbnQpLAorICAgICgnc2lkX2N0eCcsIGNfdWJ5dGUgKiAzMiksCisgICAgKCdub3RfcmVzdW1hYmxlJywgY19pbnQpLAorICAgICgnc2Vzc19jZXJ0JywgUE9JTlRFUihzZXNzX2NlcnRfc3QpKSwKKyAgICAoJ3BlZXInLCBQT0lOVEVSKFg1MDkpKSwKKyAgICAoJ3ZlcmlmeV9yZXN1bHQnLCBjX2xvbmcpLAorICAgICgncmVmZXJlbmNlcycsIGNfaW50KSwKKyAgICAoJ3RpbWVvdXQnLCBjX2xvbmcpLAorICAgICgndGltZScsIGNfbG9uZyksCisgICAgKCdjb21wcmVzc19tZXRoJywgY19pbnQpLAorICAgICgnY2lwaGVyJywgUE9JTlRFUihTU0xfQ0lQSEVSKSksCisgICAgKCdjaXBoZXJfaWQnLCBjX3Vsb25nKSwKKyAgICAoJ2NpcGhlcnMnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdleF9kYXRhJywgQ1JZUFRPX0VYX0RBVEEpLAorICAgICgncHJldicsIFBPSU5URVIoc3NsX3Nlc3Npb25fc3QpKSwKKyAgICAoJ25leHQnLCBQT0lOVEVSKHNzbF9zZXNzaW9uX3N0KSksCitdCithc3NlcnQgc2l6ZW9mKHNzbF9zZXNzaW9uX3N0KSA9PSAyMDAsIHNpemVvZihzc2xfc2Vzc2lvbl9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoc3NsX3Nlc3Npb25fc3QpID09IDQsIGFsaWdubWVudChzc2xfc2Vzc2lvbl9zdCkKK3Nlc3NfY2VydF9zdC5fZmllbGRzXyA9IFsKK10KK1NTTF9TRVNTSU9OID0gc3NsX3Nlc3Npb25fc3QKK0dFTl9TRVNTSU9OX0NCID0gQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFNTTCksIFBPSU5URVIoY191Ynl0ZSksIFBPSU5URVIoY191aW50KSkKK2NsYXNzIHNzbF9jb21wX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworc3NsX2NvbXBfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdpZCcsIGNfaW50KSwKKyAgICAoJ25hbWUnLCBTVFJJTkcpLAorICAgICgnbWV0aG9kJywgUE9JTlRFUihDT01QX01FVEhPRCkpLAorXQorYXNzZXJ0IHNpemVvZihzc2xfY29tcF9zdCkgPT0gMTIsIHNpemVvZihzc2xfY29tcF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoc3NsX2NvbXBfc3QpID09IDQsIGFsaWdubWVudChzc2xfY29tcF9zdCkKK1NTTF9DT01QID0gc3NsX2NvbXBfc3QKK2NsYXNzIE4xMHNzbF9jdHhfc3Q0RE9MTEFSXzE4RShTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK04xMHNzbF9jdHhfc3Q0RE9MTEFSXzE4RS5fZmllbGRzXyA9IFsKKyAgICAoJ3Nlc3NfY29ubmVjdCcsIGNfaW50KSwKKyAgICAoJ3Nlc3NfY29ubmVjdF9yZW5lZ290aWF0ZScsIGNfaW50KSwKKyAgICAoJ3Nlc3NfY29ubmVjdF9nb29kJywgY19pbnQpLAorICAgICgnc2Vzc19hY2NlcHQnLCBjX2ludCksCisgICAgKCdzZXNzX2FjY2VwdF9yZW5lZ290aWF0ZScsIGNfaW50KSwKKyAgICAoJ3Nlc3NfYWNjZXB0X2dvb2QnLCBjX2ludCksCisgICAgKCdzZXNzX21pc3MnLCBjX2ludCksCisgICAgKCdzZXNzX3RpbWVvdXQnLCBjX2ludCksCisgICAgKCdzZXNzX2NhY2hlX2Z1bGwnLCBjX2ludCksCisgICAgKCdzZXNzX2hpdCcsIGNfaW50KSwKKyAgICAoJ3Nlc3NfY2JfaGl0JywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihOMTBzc2xfY3R4X3N0NERPTExBUl8xOEUpID09IDQ0LCBzaXplb2YoTjEwc3NsX2N0eF9zdDRET0xMQVJfMThFKQorYXNzZXJ0IGFsaWdubWVudChOMTBzc2xfY3R4X3N0NERPTExBUl8xOEUpID09IDQsIGFsaWdubWVudChOMTBzc2xfY3R4X3N0NERPTExBUl8xOEUpCitjbGFzcyBjZXJ0X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworc3NsX2N0eF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ21ldGhvZCcsIFBPSU5URVIoU1NMX01FVEhPRCkpLAorICAgICgnY2lwaGVyX2xpc3QnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdjaXBoZXJfbGlzdF9ieV9pZCcsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2NlcnRfc3RvcmUnLCBQT0lOVEVSKHg1MDlfc3RvcmVfc3QpKSwKKyAgICAoJ3Nlc3Npb25zJywgUE9JTlRFUihsaGFzaF9zdCkpLAorICAgICgnc2Vzc2lvbl9jYWNoZV9zaXplJywgY191bG9uZyksCisgICAgKCdzZXNzaW9uX2NhY2hlX2hlYWQnLCBQT0lOVEVSKHNzbF9zZXNzaW9uX3N0KSksCisgICAgKCdzZXNzaW9uX2NhY2hlX3RhaWwnLCBQT0lOVEVSKHNzbF9zZXNzaW9uX3N0KSksCisgICAgKCdzZXNzaW9uX2NhY2hlX21vZGUnLCBjX2ludCksCisgICAgKCdzZXNzaW9uX3RpbWVvdXQnLCBjX2xvbmcpLAorICAgICgnbmV3X3Nlc3Npb25fY2InLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoc3NsX3N0KSwgUE9JTlRFUihTU0xfU0VTU0lPTikpKSwKKyAgICAoJ3JlbW92ZV9zZXNzaW9uX2NiJywgQ0ZVTkNUWVBFKE5vbmUsIFBPSU5URVIoc3NsX2N0eF9zdCksIFBPSU5URVIoU1NMX1NFU1NJT04pKSksCisgICAgKCdnZXRfc2Vzc2lvbl9jYicsIENGVU5DVFlQRShQT0lOVEVSKFNTTF9TRVNTSU9OKSwgUE9JTlRFUihzc2xfc3QpLCBQT0lOVEVSKGNfdWJ5dGUpLCBjX2ludCwgUE9JTlRFUihjX2ludCkpKSwKKyAgICAoJ3N0YXRzJywgTjEwc3NsX2N0eF9zdDRET0xMQVJfMThFKSwKKyAgICAoJ3JlZmVyZW5jZXMnLCBjX2ludCksCisgICAgKCdhcHBfdmVyaWZ5X2NhbGxiYWNrJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSwgY192b2lkX3ApKSwKKyAgICAoJ2FwcF92ZXJpZnlfYXJnJywgY192b2lkX3ApLAorICAgICgnZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2snLCBQT0lOVEVSKHBlbV9wYXNzd29yZF9jYikpLAorICAgICgnZGVmYXVsdF9wYXNzd2RfY2FsbGJhY2tfdXNlcmRhdGEnLCBjX3ZvaWRfcCksCisgICAgKCdjbGllbnRfY2VydF9jYicsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihTU0wpLCBQT0lOVEVSKFBPSU5URVIoWDUwOSkpLCBQT0lOVEVSKFBPSU5URVIoRVZQX1BLRVkpKSkpLAorICAgICgnZXhfZGF0YScsIENSWVBUT19FWF9EQVRBKSwKKyAgICAoJ3JzYV9tZDUnLCBQT0lOVEVSKEVWUF9NRCkpLAorICAgICgnbWQ1JywgUE9JTlRFUihFVlBfTUQpKSwKKyAgICAoJ3NoYTEnLCBQT0lOVEVSKEVWUF9NRCkpLAorICAgICgnZXh0cmFfY2VydHMnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdjb21wX21ldGhvZHMnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdpbmZvX2NhbGxiYWNrJywgQ0ZVTkNUWVBFKE5vbmUsIFBPSU5URVIoU1NMKSwgY19pbnQsIGNfaW50KSksCisgICAgKCdjbGllbnRfQ0EnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdvcHRpb25zJywgY191bG9uZyksCisgICAgKCdtb2RlJywgY191bG9uZyksCisgICAgKCdtYXhfY2VydF9saXN0JywgY19sb25nKSwKKyAgICAoJ2NlcnQnLCBQT0lOVEVSKGNlcnRfc3QpKSwKKyAgICAoJ3JlYWRfYWhlYWQnLCBjX2ludCksCisgICAgKCdtc2dfY2FsbGJhY2snLCBDRlVOQ1RZUEUoTm9uZSwgY19pbnQsIGNfaW50LCBjX2ludCwgY192b2lkX3AsIGNfdWxvbmcsIFBPSU5URVIoU1NMKSwgY192b2lkX3ApKSwKKyAgICAoJ21zZ19jYWxsYmFja19hcmcnLCBjX3ZvaWRfcCksCisgICAgKCd2ZXJpZnlfbW9kZScsIGNfaW50KSwKKyAgICAoJ3ZlcmlmeV9kZXB0aCcsIGNfaW50KSwKKyAgICAoJ3NpZF9jdHhfbGVuZ3RoJywgY191aW50KSwKKyAgICAoJ3NpZF9jdHgnLCBjX3VieXRlICogMzIpLAorICAgICgnZGVmYXVsdF92ZXJpZnlfY2FsbGJhY2snLCBDRlVOQ1RZUEUoY19pbnQsIGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSkpLAorICAgICgnZ2VuZXJhdGVfc2Vzc2lvbl9pZCcsIEdFTl9TRVNTSU9OX0NCKSwKKyAgICAoJ3B1cnBvc2UnLCBjX2ludCksCisgICAgKCd0cnVzdCcsIGNfaW50KSwKKyAgICAoJ3F1aWV0X3NodXRkb3duJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihzc2xfY3R4X3N0KSA9PSAyNDgsIHNpemVvZihzc2xfY3R4X3N0KQorYXNzZXJ0IGFsaWdubWVudChzc2xfY3R4X3N0KSA9PSA0LCBhbGlnbm1lbnQoc3NsX2N0eF9zdCkKK2NlcnRfc3QuX2ZpZWxkc18gPSBbCitdCitjbGFzcyBzc2wyX3N0YXRlX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY2xhc3Mgc3NsM19zdGF0ZV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3NzbF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3ZlcnNpb24nLCBjX2ludCksCisgICAgKCd0eXBlJywgY19pbnQpLAorICAgICgnbWV0aG9kJywgUE9JTlRFUihTU0xfTUVUSE9EKSksCisgICAgKCdyYmlvJywgUE9JTlRFUihCSU8pKSwKKyAgICAoJ3diaW8nLCBQT0lOVEVSKEJJTykpLAorICAgICgnYmJpbycsIFBPSU5URVIoQklPKSksCisgICAgKCdyd3N0YXRlJywgY19pbnQpLAorICAgICgnaW5faGFuZHNoYWtlJywgY19pbnQpLAorICAgICgnaGFuZHNoYWtlX2Z1bmMnLCBDRlVOQ1RZUEUoY19pbnQpKSwKKyAgICAoJ3NlcnZlcicsIGNfaW50KSwKKyAgICAoJ25ld19zZXNzaW9uJywgY19pbnQpLAorICAgICgncXVpZXRfc2h1dGRvd24nLCBjX2ludCksCisgICAgKCdzaHV0ZG93bicsIGNfaW50KSwKKyAgICAoJ3N0YXRlJywgY19pbnQpLAorICAgICgncnN0YXRlJywgY19pbnQpLAorICAgICgnaW5pdF9idWYnLCBQT0lOVEVSKEJVRl9NRU0pKSwKKyAgICAoJ2luaXRfbXNnJywgY192b2lkX3ApLAorICAgICgnaW5pdF9udW0nLCBjX2ludCksCisgICAgKCdpbml0X29mZicsIGNfaW50KSwKKyAgICAoJ3BhY2tldCcsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgncGFja2V0X2xlbmd0aCcsIGNfdWludCksCisgICAgKCdzMicsIFBPSU5URVIoc3NsMl9zdGF0ZV9zdCkpLAorICAgICgnczMnLCBQT0lOVEVSKHNzbDNfc3RhdGVfc3QpKSwKKyAgICAoJ3JlYWRfYWhlYWQnLCBjX2ludCksCisgICAgKCdtc2dfY2FsbGJhY2snLCBDRlVOQ1RZUEUoTm9uZSwgY19pbnQsIGNfaW50LCBjX2ludCwgY192b2lkX3AsIGNfdWxvbmcsIFBPSU5URVIoU1NMKSwgY192b2lkX3ApKSwKKyAgICAoJ21zZ19jYWxsYmFja19hcmcnLCBjX3ZvaWRfcCksCisgICAgKCdoaXQnLCBjX2ludCksCisgICAgKCdwdXJwb3NlJywgY19pbnQpLAorICAgICgndHJ1c3QnLCBjX2ludCksCisgICAgKCdjaXBoZXJfbGlzdCcsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2NpcGhlcl9saXN0X2J5X2lkJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnZW5jX3JlYWRfY3R4JywgUE9JTlRFUihFVlBfQ0lQSEVSX0NUWCkpLAorICAgICgncmVhZF9oYXNoJywgUE9JTlRFUihFVlBfTUQpKSwKKyAgICAoJ2V4cGFuZCcsIFBPSU5URVIoQ09NUF9DVFgpKSwKKyAgICAoJ2VuY193cml0ZV9jdHgnLCBQT0lOVEVSKEVWUF9DSVBIRVJfQ1RYKSksCisgICAgKCd3cml0ZV9oYXNoJywgUE9JTlRFUihFVlBfTUQpKSwKKyAgICAoJ2NvbXByZXNzJywgUE9JTlRFUihDT01QX0NUWCkpLAorICAgICgnY2VydCcsIFBPSU5URVIoY2VydF9zdCkpLAorICAgICgnc2lkX2N0eF9sZW5ndGgnLCBjX3VpbnQpLAorICAgICgnc2lkX2N0eCcsIGNfdWJ5dGUgKiAzMiksCisgICAgKCdzZXNzaW9uJywgUE9JTlRFUihTU0xfU0VTU0lPTikpLAorICAgICgnZ2VuZXJhdGVfc2Vzc2lvbl9pZCcsIEdFTl9TRVNTSU9OX0NCKSwKKyAgICAoJ3ZlcmlmeV9tb2RlJywgY19pbnQpLAorICAgICgndmVyaWZ5X2RlcHRoJywgY19pbnQpLAorICAgICgndmVyaWZ5X2NhbGxiYWNrJywgQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCkpKSwKKyAgICAoJ2luZm9fY2FsbGJhY2snLCBDRlVOQ1RZUEUoTm9uZSwgUE9JTlRFUihTU0wpLCBjX2ludCwgY19pbnQpKSwKKyAgICAoJ2Vycm9yJywgY19pbnQpLAorICAgICgnZXJyb3JfY29kZScsIGNfaW50KSwKKyAgICAoJ2N0eCcsIFBPSU5URVIoU1NMX0NUWCkpLAorICAgICgnZGVidWcnLCBjX2ludCksCisgICAgKCd2ZXJpZnlfcmVzdWx0JywgY19sb25nKSwKKyAgICAoJ2V4X2RhdGEnLCBDUllQVE9fRVhfREFUQSksCisgICAgKCdjbGllbnRfQ0EnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdyZWZlcmVuY2VzJywgY19pbnQpLAorICAgICgnb3B0aW9ucycsIGNfdWxvbmcpLAorICAgICgnbW9kZScsIGNfdWxvbmcpLAorICAgICgnbWF4X2NlcnRfbGlzdCcsIGNfbG9uZyksCisgICAgKCdmaXJzdF9wYWNrZXQnLCBjX2ludCksCisgICAgKCdjbGllbnRfdmVyc2lvbicsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2Yoc3NsX3N0KSA9PSAyNjgsIHNpemVvZihzc2xfc3QpCithc3NlcnQgYWxpZ25tZW50KHNzbF9zdCkgPT0gNCwgYWxpZ25tZW50KHNzbF9zdCkKK2NsYXNzIE4xM3NzbDJfc3RhdGVfc3Q0RE9MTEFSXzE5RShTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK04xM3NzbDJfc3RhdGVfc3Q0RE9MTEFSXzE5RS5fZmllbGRzXyA9IFsKKyAgICAoJ2Nvbm5faWRfbGVuZ3RoJywgY191aW50KSwKKyAgICAoJ2NlcnRfdHlwZScsIGNfdWludCksCisgICAgKCdjZXJ0X2xlbmd0aCcsIGNfdWludCksCisgICAgKCdjc2wnLCBjX3VpbnQpLAorICAgICgnY2xlYXInLCBjX3VpbnQpLAorICAgICgnZW5jJywgY191aW50KSwKKyAgICAoJ2NjbCcsIGNfdWJ5dGUgKiAzMiksCisgICAgKCdjaXBoZXJfc3BlY19sZW5ndGgnLCBjX3VpbnQpLAorICAgICgnc2Vzc2lvbl9pZF9sZW5ndGgnLCBjX3VpbnQpLAorICAgICgnY2xlbicsIGNfdWludCksCisgICAgKCdybGVuJywgY191aW50KSwKK10KK2Fzc2VydCBzaXplb2YoTjEzc3NsMl9zdGF0ZV9zdDRET0xMQVJfMTlFKSA9PSA3Miwgc2l6ZW9mKE4xM3NzbDJfc3RhdGVfc3Q0RE9MTEFSXzE5RSkKK2Fzc2VydCBhbGlnbm1lbnQoTjEzc3NsMl9zdGF0ZV9zdDRET0xMQVJfMTlFKSA9PSA0LCBhbGlnbm1lbnQoTjEzc3NsMl9zdGF0ZV9zdDRET0xMQVJfMTlFKQorc3NsMl9zdGF0ZV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3RocmVlX2J5dGVfaGVhZGVyJywgY19pbnQpLAorICAgICgnY2xlYXJfdGV4dCcsIGNfaW50KSwKKyAgICAoJ2VzY2FwZScsIGNfaW50KSwKKyAgICAoJ3NzbDJfcm9sbGJhY2snLCBjX2ludCksCisgICAgKCd3bnVtJywgY191aW50KSwKKyAgICAoJ3dwZW5kX3RvdCcsIGNfaW50KSwKKyAgICAoJ3dwZW5kX2J1ZicsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnd3BlbmRfb2ZmJywgY19pbnQpLAorICAgICgnd3BlbmRfbGVuJywgY19pbnQpLAorICAgICgnd3BlbmRfcmV0JywgY19pbnQpLAorICAgICgncmJ1Zl9sZWZ0JywgY19pbnQpLAorICAgICgncmJ1Zl9vZmZzJywgY19pbnQpLAorICAgICgncmJ1ZicsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnd2J1ZicsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnd3JpdGVfcHRyJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdwYWRkaW5nJywgY191aW50KSwKKyAgICAoJ3JsZW5ndGgnLCBjX3VpbnQpLAorICAgICgncmFjdF9kYXRhX2xlbmd0aCcsIGNfaW50KSwKKyAgICAoJ3dsZW5ndGgnLCBjX3VpbnQpLAorICAgICgnd2FjdF9kYXRhX2xlbmd0aCcsIGNfaW50KSwKKyAgICAoJ3JhY3RfZGF0YScsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnd2FjdF9kYXRhJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdtYWNfZGF0YScsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgncmVhZF9rZXknLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ3dyaXRlX2tleScsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnY2hhbGxlbmdlX2xlbmd0aCcsIGNfdWludCksCisgICAgKCdjaGFsbGVuZ2UnLCBjX3VieXRlICogMzIpLAorICAgICgnY29ubl9pZF9sZW5ndGgnLCBjX3VpbnQpLAorICAgICgnY29ubl9pZCcsIGNfdWJ5dGUgKiAxNiksCisgICAgKCdrZXlfbWF0ZXJpYWxfbGVuZ3RoJywgY191aW50KSwKKyAgICAoJ2tleV9tYXRlcmlhbCcsIGNfdWJ5dGUgKiA0OCksCisgICAgKCdyZWFkX3NlcXVlbmNlJywgY191bG9uZyksCisgICAgKCd3cml0ZV9zZXF1ZW5jZScsIGNfdWxvbmcpLAorICAgICgndG1wJywgTjEzc3NsMl9zdGF0ZV9zdDRET0xMQVJfMTlFKSwKK10KK2Fzc2VydCBzaXplb2Yoc3NsMl9zdGF0ZV9zdCkgPT0gMjg4LCBzaXplb2Yoc3NsMl9zdGF0ZV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoc3NsMl9zdGF0ZV9zdCkgPT0gNCwgYWxpZ25tZW50KHNzbDJfc3RhdGVfc3QpCitTU0wyX1NUQVRFID0gc3NsMl9zdGF0ZV9zdAorY2xhc3Mgc3NsM19yZWNvcmRfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitzc2wzX3JlY29yZF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3R5cGUnLCBjX2ludCksCisgICAgKCdsZW5ndGgnLCBjX3VpbnQpLAorICAgICgnb2ZmJywgY191aW50KSwKKyAgICAoJ2RhdGEnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ2lucHV0JywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdjb21wJywgUE9JTlRFUihjX3VieXRlKSksCitdCithc3NlcnQgc2l6ZW9mKHNzbDNfcmVjb3JkX3N0KSA9PSAyNCwgc2l6ZW9mKHNzbDNfcmVjb3JkX3N0KQorYXNzZXJ0IGFsaWdubWVudChzc2wzX3JlY29yZF9zdCkgPT0gNCwgYWxpZ25tZW50KHNzbDNfcmVjb3JkX3N0KQorU1NMM19SRUNPUkQgPSBzc2wzX3JlY29yZF9zdAorY2xhc3Mgc3NsM19idWZmZXJfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitzaXplX3QgPSBfX2Rhcndpbl9zaXplX3QKK3NzbDNfYnVmZmVyX3N0Ll9maWVsZHNfID0gWworICAgICgnYnVmJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdsZW4nLCBzaXplX3QpLAorICAgICgnb2Zmc2V0JywgY19pbnQpLAorICAgICgnbGVmdCcsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2Yoc3NsM19idWZmZXJfc3QpID09IDE2LCBzaXplb2Yoc3NsM19idWZmZXJfc3QpCithc3NlcnQgYWxpZ25tZW50KHNzbDNfYnVmZmVyX3N0KSA9PSA0LCBhbGlnbm1lbnQoc3NsM19idWZmZXJfc3QpCitTU0wzX0JVRkZFUiA9IHNzbDNfYnVmZmVyX3N0CitjbGFzcyBOMTNzc2wzX3N0YXRlX3N0NERPTExBUl8yMEUoU3RydWN0dXJlKToKKyAgICBwYXNzCitOMTNzc2wzX3N0YXRlX3N0NERPTExBUl8yMEUuX2ZpZWxkc18gPSBbCisgICAgKCdjZXJ0X3ZlcmlmeV9tZCcsIGNfdWJ5dGUgKiA3MiksCisgICAgKCdmaW5pc2hfbWQnLCBjX3VieXRlICogNzIpLAorICAgICgnZmluaXNoX21kX2xlbicsIGNfaW50KSwKKyAgICAoJ3BlZXJfZmluaXNoX21kJywgY191Ynl0ZSAqIDcyKSwKKyAgICAoJ3BlZXJfZmluaXNoX21kX2xlbicsIGNfaW50KSwKKyAgICAoJ21lc3NhZ2Vfc2l6ZScsIGNfdWxvbmcpLAorICAgICgnbWVzc2FnZV90eXBlJywgY19pbnQpLAorICAgICgnbmV3X2NpcGhlcicsIFBPSU5URVIoU1NMX0NJUEhFUikpLAorICAgICgnZGgnLCBQT0lOVEVSKERIKSksCisgICAgKCduZXh0X3N0YXRlJywgY19pbnQpLAorICAgICgncmV1c2VfbWVzc2FnZScsIGNfaW50KSwKKyAgICAoJ2NlcnRfcmVxJywgY19pbnQpLAorICAgICgnY3R5cGVfbnVtJywgY19pbnQpLAorICAgICgnY3R5cGUnLCBjX2NoYXIgKiA3KSwKKyAgICAoJ2NhX25hbWVzJywgUE9JTlRFUihTVEFDSykpLAorICAgICgndXNlX3JzYV90bXAnLCBjX2ludCksCisgICAgKCdrZXlfYmxvY2tfbGVuZ3RoJywgY19pbnQpLAorICAgICgna2V5X2Jsb2NrJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCduZXdfc3ltX2VuYycsIFBPSU5URVIoRVZQX0NJUEhFUikpLAorICAgICgnbmV3X2hhc2gnLCBQT0lOVEVSKEVWUF9NRCkpLAorICAgICgnbmV3X2NvbXByZXNzaW9uJywgUE9JTlRFUihTU0xfQ09NUCkpLAorICAgICgnY2VydF9yZXF1ZXN0JywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihOMTNzc2wzX3N0YXRlX3N0NERPTExBUl8yMEUpID09IDI5Niwgc2l6ZW9mKE4xM3NzbDNfc3RhdGVfc3Q0RE9MTEFSXzIwRSkKK2Fzc2VydCBhbGlnbm1lbnQoTjEzc3NsM19zdGF0ZV9zdDRET0xMQVJfMjBFKSA9PSA0LCBhbGlnbm1lbnQoTjEzc3NsM19zdGF0ZV9zdDRET0xMQVJfMjBFKQorc3NsM19zdGF0ZV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2ZsYWdzJywgY19sb25nKSwKKyAgICAoJ2RlbGF5X2J1Zl9wb3BfcmV0JywgY19pbnQpLAorICAgICgncmVhZF9zZXF1ZW5jZScsIGNfdWJ5dGUgKiA4KSwKKyAgICAoJ3JlYWRfbWFjX3NlY3JldCcsIGNfdWJ5dGUgKiAzNiksCisgICAgKCd3cml0ZV9zZXF1ZW5jZScsIGNfdWJ5dGUgKiA4KSwKKyAgICAoJ3dyaXRlX21hY19zZWNyZXQnLCBjX3VieXRlICogMzYpLAorICAgICgnc2VydmVyX3JhbmRvbScsIGNfdWJ5dGUgKiAzMiksCisgICAgKCdjbGllbnRfcmFuZG9tJywgY191Ynl0ZSAqIDMyKSwKKyAgICAoJ25lZWRfZW1wdHlfZnJhZ21lbnRzJywgY19pbnQpLAorICAgICgnZW1wdHlfZnJhZ21lbnRfZG9uZScsIGNfaW50KSwKKyAgICAoJ3JidWYnLCBTU0wzX0JVRkZFUiksCisgICAgKCd3YnVmJywgU1NMM19CVUZGRVIpLAorICAgICgncnJlYycsIFNTTDNfUkVDT1JEKSwKKyAgICAoJ3dyZWMnLCBTU0wzX1JFQ09SRCksCisgICAgKCdhbGVydF9mcmFnbWVudCcsIGNfdWJ5dGUgKiAyKSwKKyAgICAoJ2FsZXJ0X2ZyYWdtZW50X2xlbicsIGNfdWludCksCisgICAgKCdoYW5kc2hha2VfZnJhZ21lbnQnLCBjX3VieXRlICogNCksCisgICAgKCdoYW5kc2hha2VfZnJhZ21lbnRfbGVuJywgY191aW50KSwKKyAgICAoJ3dudW0nLCBjX3VpbnQpLAorICAgICgnd3BlbmRfdG90JywgY19pbnQpLAorICAgICgnd3BlbmRfdHlwZScsIGNfaW50KSwKKyAgICAoJ3dwZW5kX3JldCcsIGNfaW50KSwKKyAgICAoJ3dwZW5kX2J1ZicsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnZmluaXNoX2Rnc3QxJywgRVZQX01EX0NUWCksCisgICAgKCdmaW5pc2hfZGdzdDInLCBFVlBfTURfQ1RYKSwKKyAgICAoJ2NoYW5nZV9jaXBoZXJfc3BlYycsIGNfaW50KSwKKyAgICAoJ3dhcm5fYWxlcnQnLCBjX2ludCksCisgICAgKCdmYXRhbF9hbGVydCcsIGNfaW50KSwKKyAgICAoJ2FsZXJ0X2Rpc3BhdGNoJywgY19pbnQpLAorICAgICgnc2VuZF9hbGVydCcsIGNfdWJ5dGUgKiAyKSwKKyAgICAoJ3JlbmVnb3RpYXRlJywgY19pbnQpLAorICAgICgndG90YWxfcmVuZWdvdGlhdGlvbnMnLCBjX2ludCksCisgICAgKCdudW1fcmVuZWdvdGlhdGlvbnMnLCBjX2ludCksCisgICAgKCdpbl9yZWFkX2FwcF9kYXRhJywgY19pbnQpLAorICAgICgndG1wJywgTjEzc3NsM19zdGF0ZV9zdDRET0xMQVJfMjBFKSwKK10KK2Fzc2VydCBzaXplb2Yoc3NsM19zdGF0ZV9zdCkgPT0gNjQ4LCBzaXplb2Yoc3NsM19zdGF0ZV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoc3NsM19zdGF0ZV9zdCkgPT0gNCwgYWxpZ25tZW50KHNzbDNfc3RhdGVfc3QpCitTU0wzX1NUQVRFID0gc3NsM19zdGF0ZV9zdAorc3RhY2tfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdudW0nLCBjX2ludCksCisgICAgKCdkYXRhJywgUE9JTlRFUihTVFJJTkcpKSwKKyAgICAoJ3NvcnRlZCcsIGNfaW50KSwKKyAgICAoJ251bV9hbGxvYycsIGNfaW50KSwKKyAgICAoJ2NvbXAnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoU1RSSU5HKSwgUE9JTlRFUihTVFJJTkcpKSksCitdCithc3NlcnQgc2l6ZW9mKHN0YWNrX3N0KSA9PSAyMCwgc2l6ZW9mKHN0YWNrX3N0KQorYXNzZXJ0IGFsaWdubWVudChzdGFja19zdCkgPT0gNCwgYWxpZ25tZW50KHN0YWNrX3N0KQorY2xhc3MgdWlfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCit1aV9zdC5fZmllbGRzXyA9IFsKK10KK1VJID0gdWlfc3QKK2NsYXNzIHVpX21ldGhvZF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3VpX21ldGhvZF9zdC5fZmllbGRzXyA9IFsKK10KK1VJX01FVEhPRCA9IHVpX21ldGhvZF9zdAorY2xhc3MgdWlfc3RyaW5nX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcwordWlfc3RyaW5nX3N0Ll9maWVsZHNfID0gWworXQorVUlfU1RSSU5HID0gdWlfc3RyaW5nX3N0CisKKyMgdmFsdWVzIGZvciBlbnVtZXJhdGlvbiAnVUlfc3RyaW5nX3R5cGVzJworVUlfc3RyaW5nX3R5cGVzID0gY19pbnQgIyBlbnVtCitjbGFzcyBYNTA5X29iamVjdHNfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X29iamVjdHNfc3QuX2ZpZWxkc18gPSBbCisgICAgKCduaWQnLCBjX2ludCksCisgICAgKCdhMmknLCBDRlVOQ1RZUEUoY19pbnQpKSwKKyAgICAoJ2kyYScsIENGVU5DVFlQRShjX2ludCkpLAorXQorYXNzZXJ0IHNpemVvZihYNTA5X29iamVjdHNfc3QpID09IDEyLCBzaXplb2YoWDUwOV9vYmplY3RzX3N0KQorYXNzZXJ0IGFsaWdubWVudChYNTA5X29iamVjdHNfc3QpID09IDQsIGFsaWdubWVudChYNTA5X29iamVjdHNfc3QpCitYNTA5X09CSkVDVFMgPSBYNTA5X29iamVjdHNfc3QKK1g1MDlfYWxnb3Jfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdhbGdvcml0aG0nLCBQT0lOVEVSKEFTTjFfT0JKRUNUKSksCisgICAgKCdwYXJhbWV0ZXInLCBQT0lOVEVSKEFTTjFfVFlQRSkpLAorXQorYXNzZXJ0IHNpemVvZihYNTA5X2FsZ29yX3N0KSA9PSA4LCBzaXplb2YoWDUwOV9hbGdvcl9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoWDUwOV9hbGdvcl9zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfYWxnb3Jfc3QpCitjbGFzcyBYNTA5X3ZhbF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1g1MDlfdmFsX3N0Ll9maWVsZHNfID0gWworICAgICgnbm90QmVmb3JlJywgUE9JTlRFUihBU04xX1RJTUUpKSwKKyAgICAoJ25vdEFmdGVyJywgUE9JTlRFUihBU04xX1RJTUUpKSwKK10KK2Fzc2VydCBzaXplb2YoWDUwOV92YWxfc3QpID09IDgsIHNpemVvZihYNTA5X3ZhbF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoWDUwOV92YWxfc3QpID09IDQsIGFsaWdubWVudChYNTA5X3ZhbF9zdCkKK1g1MDlfVkFMID0gWDUwOV92YWxfc3QKK2NsYXNzIFg1MDlfcHVia2V5X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworWDUwOV9wdWJrZXlfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdhbGdvcicsIFBPSU5URVIoWDUwOV9BTEdPUikpLAorICAgICgncHVibGljX2tleScsIFBPSU5URVIoQVNOMV9CSVRfU1RSSU5HKSksCisgICAgKCdwa2V5JywgUE9JTlRFUihFVlBfUEtFWSkpLAorXQorYXNzZXJ0IHNpemVvZihYNTA5X3B1YmtleV9zdCkgPT0gMTIsIHNpemVvZihYNTA5X3B1YmtleV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoWDUwOV9wdWJrZXlfc3QpID09IDQsIGFsaWdubWVudChYNTA5X3B1YmtleV9zdCkKK1g1MDlfUFVCS0VZID0gWDUwOV9wdWJrZXlfc3QKK2NsYXNzIFg1MDlfc2lnX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworWDUwOV9zaWdfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdhbGdvcicsIFBPSU5URVIoWDUwOV9BTEdPUikpLAorICAgICgnZGlnZXN0JywgUE9JTlRFUihBU04xX09DVEVUX1NUUklORykpLAorXQorYXNzZXJ0IHNpemVvZihYNTA5X3NpZ19zdCkgPT0gOCwgc2l6ZW9mKFg1MDlfc2lnX3N0KQorYXNzZXJ0IGFsaWdubWVudChYNTA5X3NpZ19zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfc2lnX3N0KQorWDUwOV9TSUcgPSBYNTA5X3NpZ19zdAorY2xhc3MgWDUwOV9uYW1lX2VudHJ5X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworWDUwOV9uYW1lX2VudHJ5X3N0Ll9maWVsZHNfID0gWworICAgICgnb2JqZWN0JywgUE9JTlRFUihBU04xX09CSkVDVCkpLAorICAgICgndmFsdWUnLCBQT0lOVEVSKEFTTjFfU1RSSU5HKSksCisgICAgKCdzZXQnLCBjX2ludCksCisgICAgKCdzaXplJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihYNTA5X25hbWVfZW50cnlfc3QpID09IDE2LCBzaXplb2YoWDUwOV9uYW1lX2VudHJ5X3N0KQorYXNzZXJ0IGFsaWdubWVudChYNTA5X25hbWVfZW50cnlfc3QpID09IDQsIGFsaWdubWVudChYNTA5X25hbWVfZW50cnlfc3QpCitYNTA5X05BTUVfRU5UUlkgPSBYNTA5X25hbWVfZW50cnlfc3QKK1g1MDlfbmFtZV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2VudHJpZXMnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdtb2RpZmllZCcsIGNfaW50KSwKKyAgICAoJ2J5dGVzJywgUE9JTlRFUihCVUZfTUVNKSksCisgICAgKCdoYXNoJywgY191bG9uZyksCitdCithc3NlcnQgc2l6ZW9mKFg1MDlfbmFtZV9zdCkgPT0gMTYsIHNpemVvZihYNTA5X25hbWVfc3QpCithc3NlcnQgYWxpZ25tZW50KFg1MDlfbmFtZV9zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfbmFtZV9zdCkKK2NsYXNzIFg1MDlfZXh0ZW5zaW9uX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworWDUwOV9leHRlbnNpb25fc3QuX2ZpZWxkc18gPSBbCisgICAgKCdvYmplY3QnLCBQT0lOVEVSKEFTTjFfT0JKRUNUKSksCisgICAgKCdjcml0aWNhbCcsIEFTTjFfQk9PTEVBTiksCisgICAgKCd2YWx1ZScsIFBPSU5URVIoQVNOMV9PQ1RFVF9TVFJJTkcpKSwKK10KK2Fzc2VydCBzaXplb2YoWDUwOV9leHRlbnNpb25fc3QpID09IDEyLCBzaXplb2YoWDUwOV9leHRlbnNpb25fc3QpCithc3NlcnQgYWxpZ25tZW50KFg1MDlfZXh0ZW5zaW9uX3N0KSA9PSA0LCBhbGlnbm1lbnQoWDUwOV9leHRlbnNpb25fc3QpCitYNTA5X0VYVEVOU0lPTiA9IFg1MDlfZXh0ZW5zaW9uX3N0CitjbGFzcyB4NTA5X2F0dHJpYnV0ZXNfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitjbGFzcyBOMTh4NTA5X2F0dHJpYnV0ZXNfc3Q0RE9MTEFSXzEzRShVbmlvbik6CisgICAgcGFzcworTjE4eDUwOV9hdHRyaWJ1dGVzX3N0NERPTExBUl8xM0UuX2ZpZWxkc18gPSBbCisgICAgKCdwdHInLCBTVFJJTkcpLAorICAgICgnc2V0JywgUE9JTlRFUihTVEFDSykpLAorICAgICgnc2luZ2xlJywgUE9JTlRFUihBU04xX1RZUEUpKSwKK10KK2Fzc2VydCBzaXplb2YoTjE4eDUwOV9hdHRyaWJ1dGVzX3N0NERPTExBUl8xM0UpID09IDQsIHNpemVvZihOMTh4NTA5X2F0dHJpYnV0ZXNfc3Q0RE9MTEFSXzEzRSkKK2Fzc2VydCBhbGlnbm1lbnQoTjE4eDUwOV9hdHRyaWJ1dGVzX3N0NERPTExBUl8xM0UpID09IDQsIGFsaWdubWVudChOMTh4NTA5X2F0dHJpYnV0ZXNfc3Q0RE9MTEFSXzEzRSkKK3g1MDlfYXR0cmlidXRlc19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ29iamVjdCcsIFBPSU5URVIoQVNOMV9PQkpFQ1QpKSwKKyAgICAoJ3NpbmdsZScsIGNfaW50KSwKKyAgICAoJ3ZhbHVlJywgTjE4eDUwOV9hdHRyaWJ1dGVzX3N0NERPTExBUl8xM0UpLAorXQorYXNzZXJ0IHNpemVvZih4NTA5X2F0dHJpYnV0ZXNfc3QpID09IDEyLCBzaXplb2YoeDUwOV9hdHRyaWJ1dGVzX3N0KQorYXNzZXJ0IGFsaWdubWVudCh4NTA5X2F0dHJpYnV0ZXNfc3QpID09IDQsIGFsaWdubWVudCh4NTA5X2F0dHJpYnV0ZXNfc3QpCitYNTA5X0FUVFJJQlVURSA9IHg1MDlfYXR0cmlidXRlc19zdAorY2xhc3MgWDUwOV9yZXFfaW5mb19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1g1MDlfcmVxX2luZm9fc3QuX2ZpZWxkc18gPSBbCisgICAgKCdlbmMnLCBBU04xX0VOQ09ESU5HKSwKKyAgICAoJ3ZlcnNpb24nLCBQT0lOVEVSKEFTTjFfSU5URUdFUikpLAorICAgICgnc3ViamVjdCcsIFBPSU5URVIoWDUwOV9OQU1FKSksCisgICAgKCdwdWJrZXknLCBQT0lOVEVSKFg1MDlfUFVCS0VZKSksCisgICAgKCdhdHRyaWJ1dGVzJywgUE9JTlRFUihTVEFDSykpLAorXQorYXNzZXJ0IHNpemVvZihYNTA5X3JlcV9pbmZvX3N0KSA9PSAyOCwgc2l6ZW9mKFg1MDlfcmVxX2luZm9fc3QpCithc3NlcnQgYWxpZ25tZW50KFg1MDlfcmVxX2luZm9fc3QpID09IDQsIGFsaWdubWVudChYNTA5X3JlcV9pbmZvX3N0KQorWDUwOV9SRVFfSU5GTyA9IFg1MDlfcmVxX2luZm9fc3QKK2NsYXNzIFg1MDlfcmVxX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworWDUwOV9yZXFfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdyZXFfaW5mbycsIFBPSU5URVIoWDUwOV9SRVFfSU5GTykpLAorICAgICgnc2lnX2FsZycsIFBPSU5URVIoWDUwOV9BTEdPUikpLAorICAgICgnc2lnbmF0dXJlJywgUE9JTlRFUihBU04xX0JJVF9TVFJJTkcpKSwKKyAgICAoJ3JlZmVyZW5jZXMnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKFg1MDlfcmVxX3N0KSA9PSAxNiwgc2l6ZW9mKFg1MDlfcmVxX3N0KQorYXNzZXJ0IGFsaWdubWVudChYNTA5X3JlcV9zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfcmVxX3N0KQorWDUwOV9SRVEgPSBYNTA5X3JlcV9zdAorY2xhc3MgeDUwOV9jaW5mX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworeDUwOV9jaW5mX3N0Ll9maWVsZHNfID0gWworICAgICgndmVyc2lvbicsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCisgICAgKCdzZXJpYWxOdW1iZXInLCBQT0lOVEVSKEFTTjFfSU5URUdFUikpLAorICAgICgnc2lnbmF0dXJlJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdpc3N1ZXInLCBQT0lOVEVSKFg1MDlfTkFNRSkpLAorICAgICgndmFsaWRpdHknLCBQT0lOVEVSKFg1MDlfVkFMKSksCisgICAgKCdzdWJqZWN0JywgUE9JTlRFUihYNTA5X05BTUUpKSwKKyAgICAoJ2tleScsIFBPSU5URVIoWDUwOV9QVUJLRVkpKSwKKyAgICAoJ2lzc3VlclVJRCcsIFBPSU5URVIoQVNOMV9CSVRfU1RSSU5HKSksCisgICAgKCdzdWJqZWN0VUlEJywgUE9JTlRFUihBU04xX0JJVF9TVFJJTkcpKSwKKyAgICAoJ2V4dGVuc2lvbnMnLCBQT0lOVEVSKFNUQUNLKSksCitdCithc3NlcnQgc2l6ZW9mKHg1MDlfY2luZl9zdCkgPT0gNDAsIHNpemVvZih4NTA5X2NpbmZfc3QpCithc3NlcnQgYWxpZ25tZW50KHg1MDlfY2luZl9zdCkgPT0gNCwgYWxpZ25tZW50KHg1MDlfY2luZl9zdCkKK1g1MDlfQ0lORiA9IHg1MDlfY2luZl9zdAorY2xhc3MgeDUwOV9jZXJ0X2F1eF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3g1MDlfY2VydF9hdXhfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd0cnVzdCcsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ3JlamVjdCcsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2FsaWFzJywgUE9JTlRFUihBU04xX1VURjhTVFJJTkcpKSwKKyAgICAoJ2tleWlkJywgUE9JTlRFUihBU04xX09DVEVUX1NUUklORykpLAorICAgICgnb3RoZXInLCBQT0lOVEVSKFNUQUNLKSksCitdCithc3NlcnQgc2l6ZW9mKHg1MDlfY2VydF9hdXhfc3QpID09IDIwLCBzaXplb2YoeDUwOV9jZXJ0X2F1eF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoeDUwOV9jZXJ0X2F1eF9zdCkgPT0gNCwgYWxpZ25tZW50KHg1MDlfY2VydF9hdXhfc3QpCitYNTA5X0NFUlRfQVVYID0geDUwOV9jZXJ0X2F1eF9zdAorY2xhc3MgQVVUSE9SSVRZX0tFWUlEX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworeDUwOV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2NlcnRfaW5mbycsIFBPSU5URVIoWDUwOV9DSU5GKSksCisgICAgKCdzaWdfYWxnJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdzaWduYXR1cmUnLCBQT0lOVEVSKEFTTjFfQklUX1NUUklORykpLAorICAgICgndmFsaWQnLCBjX2ludCksCisgICAgKCdyZWZlcmVuY2VzJywgY19pbnQpLAorICAgICgnbmFtZScsIFNUUklORyksCisgICAgKCdleF9kYXRhJywgQ1JZUFRPX0VYX0RBVEEpLAorICAgICgnZXhfcGF0aGxlbicsIGNfbG9uZyksCisgICAgKCdleF9mbGFncycsIGNfdWxvbmcpLAorICAgICgnZXhfa3VzYWdlJywgY191bG9uZyksCisgICAgKCdleF94a3VzYWdlJywgY191bG9uZyksCisgICAgKCdleF9uc2NlcnQnLCBjX3Vsb25nKSwKKyAgICAoJ3NraWQnLCBQT0lOVEVSKEFTTjFfT0NURVRfU1RSSU5HKSksCisgICAgKCdha2lkJywgUE9JTlRFUihBVVRIT1JJVFlfS0VZSURfc3QpKSwKKyAgICAoJ3NoYTFfaGFzaCcsIGNfdWJ5dGUgKiAyMCksCisgICAgKCdhdXgnLCBQT0lOVEVSKFg1MDlfQ0VSVF9BVVgpKSwKK10KK2Fzc2VydCBzaXplb2YoeDUwOV9zdCkgPT0gODQsIHNpemVvZih4NTA5X3N0KQorYXNzZXJ0IGFsaWdubWVudCh4NTA5X3N0KSA9PSA0LCBhbGlnbm1lbnQoeDUwOV9zdCkKK0FVVEhPUklUWV9LRVlJRF9zdC5fZmllbGRzXyA9IFsKK10KK2NsYXNzIHg1MDlfdHJ1c3Rfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCit4NTA5X3RydXN0X3N0Ll9maWVsZHNfID0gWworICAgICgndHJ1c3QnLCBjX2ludCksCisgICAgKCdmbGFncycsIGNfaW50KSwKKyAgICAoJ2NoZWNrX3RydXN0JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKHg1MDlfdHJ1c3Rfc3QpLCBQT0lOVEVSKFg1MDkpLCBjX2ludCkpLAorICAgICgnbmFtZScsIFNUUklORyksCisgICAgKCdhcmcxJywgY19pbnQpLAorICAgICgnYXJnMicsIGNfdm9pZF9wKSwKK10KK2Fzc2VydCBzaXplb2YoeDUwOV90cnVzdF9zdCkgPT0gMjQsIHNpemVvZih4NTA5X3RydXN0X3N0KQorYXNzZXJ0IGFsaWdubWVudCh4NTA5X3RydXN0X3N0KSA9PSA0LCBhbGlnbm1lbnQoeDUwOV90cnVzdF9zdCkKK1g1MDlfVFJVU1QgPSB4NTA5X3RydXN0X3N0CitjbGFzcyBYNTA5X3Jldm9rZWRfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X3Jldm9rZWRfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdzZXJpYWxOdW1iZXInLCBQT0lOVEVSKEFTTjFfSU5URUdFUikpLAorICAgICgncmV2b2NhdGlvbkRhdGUnLCBQT0lOVEVSKEFTTjFfVElNRSkpLAorICAgICgnZXh0ZW5zaW9ucycsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ3NlcXVlbmNlJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihYNTA5X3Jldm9rZWRfc3QpID09IDE2LCBzaXplb2YoWDUwOV9yZXZva2VkX3N0KQorYXNzZXJ0IGFsaWdubWVudChYNTA5X3Jldm9rZWRfc3QpID09IDQsIGFsaWdubWVudChYNTA5X3Jldm9rZWRfc3QpCitYNTA5X1JFVk9LRUQgPSBYNTA5X3Jldm9rZWRfc3QKK2NsYXNzIFg1MDlfY3JsX2luZm9fc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X2NybF9pbmZvX3N0Ll9maWVsZHNfID0gWworICAgICgndmVyc2lvbicsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCisgICAgKCdzaWdfYWxnJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdpc3N1ZXInLCBQT0lOVEVSKFg1MDlfTkFNRSkpLAorICAgICgnbGFzdFVwZGF0ZScsIFBPSU5URVIoQVNOMV9USU1FKSksCisgICAgKCduZXh0VXBkYXRlJywgUE9JTlRFUihBU04xX1RJTUUpKSwKKyAgICAoJ3Jldm9rZWQnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdleHRlbnNpb25zJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnZW5jJywgQVNOMV9FTkNPRElORyksCitdCithc3NlcnQgc2l6ZW9mKFg1MDlfY3JsX2luZm9fc3QpID09IDQwLCBzaXplb2YoWDUwOV9jcmxfaW5mb19zdCkKK2Fzc2VydCBhbGlnbm1lbnQoWDUwOV9jcmxfaW5mb19zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfY3JsX2luZm9fc3QpCitYNTA5X0NSTF9JTkZPID0gWDUwOV9jcmxfaW5mb19zdAorWDUwOV9jcmxfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdjcmwnLCBQT0lOVEVSKFg1MDlfQ1JMX0lORk8pKSwKKyAgICAoJ3NpZ19hbGcnLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKKyAgICAoJ3NpZ25hdHVyZScsIFBPSU5URVIoQVNOMV9CSVRfU1RSSU5HKSksCisgICAgKCdyZWZlcmVuY2VzJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihYNTA5X2NybF9zdCkgPT0gMTYsIHNpemVvZihYNTA5X2NybF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoWDUwOV9jcmxfc3QpID09IDQsIGFsaWdubWVudChYNTA5X2NybF9zdCkKK2NsYXNzIHByaXZhdGVfa2V5X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworcHJpdmF0ZV9rZXlfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd2ZXJzaW9uJywgY19pbnQpLAorICAgICgnZW5jX2FsZ29yJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdlbmNfcGtleScsIFBPSU5URVIoQVNOMV9PQ1RFVF9TVFJJTkcpKSwKKyAgICAoJ2RlY19wa2V5JywgUE9JTlRFUihFVlBfUEtFWSkpLAorICAgICgna2V5X2xlbmd0aCcsIGNfaW50KSwKKyAgICAoJ2tleV9kYXRhJywgU1RSSU5HKSwKKyAgICAoJ2tleV9mcmVlJywgY19pbnQpLAorICAgICgnY2lwaGVyJywgRVZQX0NJUEhFUl9JTkZPKSwKKyAgICAoJ3JlZmVyZW5jZXMnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKHByaXZhdGVfa2V5X3N0KSA9PSA1Miwgc2l6ZW9mKHByaXZhdGVfa2V5X3N0KQorYXNzZXJ0IGFsaWdubWVudChwcml2YXRlX2tleV9zdCkgPT0gNCwgYWxpZ25tZW50KHByaXZhdGVfa2V5X3N0KQorWDUwOV9QS0VZID0gcHJpdmF0ZV9rZXlfc3QKK2NsYXNzIFg1MDlfaW5mb19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1g1MDlfaW5mb19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3g1MDknLCBQT0lOVEVSKFg1MDkpKSwKKyAgICAoJ2NybCcsIFBPSU5URVIoWDUwOV9DUkwpKSwKKyAgICAoJ3hfcGtleScsIFBPSU5URVIoWDUwOV9QS0VZKSksCisgICAgKCdlbmNfY2lwaGVyJywgRVZQX0NJUEhFUl9JTkZPKSwKKyAgICAoJ2VuY19sZW4nLCBjX2ludCksCisgICAgKCdlbmNfZGF0YScsIFNUUklORyksCisgICAgKCdyZWZlcmVuY2VzJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihYNTA5X2luZm9fc3QpID09IDQ0LCBzaXplb2YoWDUwOV9pbmZvX3N0KQorYXNzZXJ0IGFsaWdubWVudChYNTA5X2luZm9fc3QpID09IDQsIGFsaWdubWVudChYNTA5X2luZm9fc3QpCitYNTA5X0lORk8gPSBYNTA5X2luZm9fc3QKK2NsYXNzIE5ldHNjYXBlX3Nwa2FjX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworTmV0c2NhcGVfc3BrYWNfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdwdWJrZXknLCBQT0lOVEVSKFg1MDlfUFVCS0VZKSksCisgICAgKCdjaGFsbGVuZ2UnLCBQT0lOVEVSKEFTTjFfSUE1U1RSSU5HKSksCitdCithc3NlcnQgc2l6ZW9mKE5ldHNjYXBlX3Nwa2FjX3N0KSA9PSA4LCBzaXplb2YoTmV0c2NhcGVfc3BrYWNfc3QpCithc3NlcnQgYWxpZ25tZW50KE5ldHNjYXBlX3Nwa2FjX3N0KSA9PSA0LCBhbGlnbm1lbnQoTmV0c2NhcGVfc3BrYWNfc3QpCitORVRTQ0FQRV9TUEtBQyA9IE5ldHNjYXBlX3Nwa2FjX3N0CitjbGFzcyBOZXRzY2FwZV9zcGtpX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworTmV0c2NhcGVfc3BraV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3Nwa2FjJywgUE9JTlRFUihORVRTQ0FQRV9TUEtBQykpLAorICAgICgnc2lnX2FsZ29yJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdzaWduYXR1cmUnLCBQT0lOVEVSKEFTTjFfQklUX1NUUklORykpLAorXQorYXNzZXJ0IHNpemVvZihOZXRzY2FwZV9zcGtpX3N0KSA9PSAxMiwgc2l6ZW9mKE5ldHNjYXBlX3Nwa2lfc3QpCithc3NlcnQgYWxpZ25tZW50KE5ldHNjYXBlX3Nwa2lfc3QpID09IDQsIGFsaWdubWVudChOZXRzY2FwZV9zcGtpX3N0KQorTkVUU0NBUEVfU1BLSSA9IE5ldHNjYXBlX3Nwa2lfc3QKK2NsYXNzIE5ldHNjYXBlX2NlcnRpZmljYXRlX3NlcXVlbmNlKFN0cnVjdHVyZSk6CisgICAgcGFzcworTmV0c2NhcGVfY2VydGlmaWNhdGVfc2VxdWVuY2UuX2ZpZWxkc18gPSBbCisgICAgKCd0eXBlJywgUE9JTlRFUihBU04xX09CSkVDVCkpLAorICAgICgnY2VydHMnLCBQT0lOVEVSKFNUQUNLKSksCitdCithc3NlcnQgc2l6ZW9mKE5ldHNjYXBlX2NlcnRpZmljYXRlX3NlcXVlbmNlKSA9PSA4LCBzaXplb2YoTmV0c2NhcGVfY2VydGlmaWNhdGVfc2VxdWVuY2UpCithc3NlcnQgYWxpZ25tZW50KE5ldHNjYXBlX2NlcnRpZmljYXRlX3NlcXVlbmNlKSA9PSA0LCBhbGlnbm1lbnQoTmV0c2NhcGVfY2VydGlmaWNhdGVfc2VxdWVuY2UpCitORVRTQ0FQRV9DRVJUX1NFUVVFTkNFID0gTmV0c2NhcGVfY2VydGlmaWNhdGVfc2VxdWVuY2UKK2NsYXNzIFBCRVBBUkFNX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworUEJFUEFSQU1fc3QuX2ZpZWxkc18gPSBbCisgICAgKCdzYWx0JywgUE9JTlRFUihBU04xX09DVEVUX1NUUklORykpLAorICAgICgnaXRlcicsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCitdCithc3NlcnQgc2l6ZW9mKFBCRVBBUkFNX3N0KSA9PSA4LCBzaXplb2YoUEJFUEFSQU1fc3QpCithc3NlcnQgYWxpZ25tZW50KFBCRVBBUkFNX3N0KSA9PSA0LCBhbGlnbm1lbnQoUEJFUEFSQU1fc3QpCitQQkVQQVJBTSA9IFBCRVBBUkFNX3N0CitjbGFzcyBQQkUyUEFSQU1fc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitQQkUyUEFSQU1fc3QuX2ZpZWxkc18gPSBbCisgICAgKCdrZXlmdW5jJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdlbmNyeXB0aW9uJywgUE9JTlRFUihYNTA5X0FMR09SKSksCitdCithc3NlcnQgc2l6ZW9mKFBCRTJQQVJBTV9zdCkgPT0gOCwgc2l6ZW9mKFBCRTJQQVJBTV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoUEJFMlBBUkFNX3N0KSA9PSA0LCBhbGlnbm1lbnQoUEJFMlBBUkFNX3N0KQorUEJFMlBBUkFNID0gUEJFMlBBUkFNX3N0CitjbGFzcyBQQktERjJQQVJBTV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1BCS0RGMlBBUkFNX3N0Ll9maWVsZHNfID0gWworICAgICgnc2FsdCcsIFBPSU5URVIoQVNOMV9UWVBFKSksCisgICAgKCdpdGVyJywgUE9JTlRFUihBU04xX0lOVEVHRVIpKSwKKyAgICAoJ2tleWxlbmd0aCcsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCisgICAgKCdwcmYnLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKK10KK2Fzc2VydCBzaXplb2YoUEJLREYyUEFSQU1fc3QpID09IDE2LCBzaXplb2YoUEJLREYyUEFSQU1fc3QpCithc3NlcnQgYWxpZ25tZW50KFBCS0RGMlBBUkFNX3N0KSA9PSA0LCBhbGlnbm1lbnQoUEJLREYyUEFSQU1fc3QpCitQQktERjJQQVJBTSA9IFBCS0RGMlBBUkFNX3N0CitjbGFzcyBwa2NzOF9wcml2X2tleV9pbmZvX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworcGtjczhfcHJpdl9rZXlfaW5mb19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2Jyb2tlbicsIGNfaW50KSwKKyAgICAoJ3ZlcnNpb24nLCBQT0lOVEVSKEFTTjFfSU5URUdFUikpLAorICAgICgncGtleWFsZycsIFBPSU5URVIoWDUwOV9BTEdPUikpLAorICAgICgncGtleScsIFBPSU5URVIoQVNOMV9UWVBFKSksCisgICAgKCdhdHRyaWJ1dGVzJywgUE9JTlRFUihTVEFDSykpLAorXQorYXNzZXJ0IHNpemVvZihwa2NzOF9wcml2X2tleV9pbmZvX3N0KSA9PSAyMCwgc2l6ZW9mKHBrY3M4X3ByaXZfa2V5X2luZm9fc3QpCithc3NlcnQgYWxpZ25tZW50KHBrY3M4X3ByaXZfa2V5X2luZm9fc3QpID09IDQsIGFsaWdubWVudChwa2NzOF9wcml2X2tleV9pbmZvX3N0KQorUEtDUzhfUFJJVl9LRVlfSU5GTyA9IHBrY3M4X3ByaXZfa2V5X2luZm9fc3QKK2NsYXNzIHg1MDlfaGFzaF9kaXJfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCit4NTA5X2hhc2hfZGlyX3N0Ll9maWVsZHNfID0gWworICAgICgnbnVtX2RpcnMnLCBjX2ludCksCisgICAgKCdkaXJzJywgUE9JTlRFUihTVFJJTkcpKSwKKyAgICAoJ2RpcnNfdHlwZScsIFBPSU5URVIoY19pbnQpKSwKKyAgICAoJ251bV9kaXJzX2FsbG9jZWQnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKHg1MDlfaGFzaF9kaXJfc3QpID09IDE2LCBzaXplb2YoeDUwOV9oYXNoX2Rpcl9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoeDUwOV9oYXNoX2Rpcl9zdCkgPT0gNCwgYWxpZ25tZW50KHg1MDlfaGFzaF9kaXJfc3QpCitYNTA5X0hBU0hfRElSX0NUWCA9IHg1MDlfaGFzaF9kaXJfc3QKK2NsYXNzIHg1MDlfZmlsZV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3g1MDlfZmlsZV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ251bV9wYXRocycsIGNfaW50KSwKKyAgICAoJ251bV9hbGxvY2VkJywgY19pbnQpLAorICAgICgncGF0aHMnLCBQT0lOVEVSKFNUUklORykpLAorICAgICgncGF0aF90eXBlJywgUE9JTlRFUihjX2ludCkpLAorXQorYXNzZXJ0IHNpemVvZih4NTA5X2ZpbGVfc3QpID09IDE2LCBzaXplb2YoeDUwOV9maWxlX3N0KQorYXNzZXJ0IGFsaWdubWVudCh4NTA5X2ZpbGVfc3QpID09IDQsIGFsaWdubWVudCh4NTA5X2ZpbGVfc3QpCitYNTA5X0NFUlRfRklMRV9DVFggPSB4NTA5X2ZpbGVfc3QKK2NsYXNzIHg1MDlfb2JqZWN0X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY2xhc3MgTjE0eDUwOV9vYmplY3Rfc3Q0RE9MTEFSXzE0RShVbmlvbik6CisgICAgcGFzcworTjE0eDUwOV9vYmplY3Rfc3Q0RE9MTEFSXzE0RS5fZmllbGRzXyA9IFsKKyAgICAoJ3B0cicsIFNUUklORyksCisgICAgKCd4NTA5JywgUE9JTlRFUihYNTA5KSksCisgICAgKCdjcmwnLCBQT0lOVEVSKFg1MDlfQ1JMKSksCisgICAgKCdwa2V5JywgUE9JTlRFUihFVlBfUEtFWSkpLAorXQorYXNzZXJ0IHNpemVvZihOMTR4NTA5X29iamVjdF9zdDRET0xMQVJfMTRFKSA9PSA0LCBzaXplb2YoTjE0eDUwOV9vYmplY3Rfc3Q0RE9MTEFSXzE0RSkKK2Fzc2VydCBhbGlnbm1lbnQoTjE0eDUwOV9vYmplY3Rfc3Q0RE9MTEFSXzE0RSkgPT0gNCwgYWxpZ25tZW50KE4xNHg1MDlfb2JqZWN0X3N0NERPTExBUl8xNEUpCit4NTA5X29iamVjdF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3R5cGUnLCBjX2ludCksCisgICAgKCdkYXRhJywgTjE0eDUwOV9vYmplY3Rfc3Q0RE9MTEFSXzE0RSksCitdCithc3NlcnQgc2l6ZW9mKHg1MDlfb2JqZWN0X3N0KSA9PSA4LCBzaXplb2YoeDUwOV9vYmplY3Rfc3QpCithc3NlcnQgYWxpZ25tZW50KHg1MDlfb2JqZWN0X3N0KSA9PSA0LCBhbGlnbm1lbnQoeDUwOV9vYmplY3Rfc3QpCitYNTA5X09CSkVDVCA9IHg1MDlfb2JqZWN0X3N0CitjbGFzcyB4NTA5X2xvb2t1cF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1g1MDlfTE9PS1VQID0geDUwOV9sb29rdXBfc3QKK2NsYXNzIHg1MDlfbG9va3VwX21ldGhvZF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3g1MDlfbG9va3VwX21ldGhvZF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ25hbWUnLCBTVFJJTkcpLAorICAgICgnbmV3X2l0ZW0nLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9MT09LVVApKSksCisgICAgKCdmcmVlJywgQ0ZVTkNUWVBFKE5vbmUsIFBPSU5URVIoWDUwOV9MT09LVVApKSksCisgICAgKCdpbml0JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfTE9PS1VQKSkpLAorICAgICgnc2h1dGRvd24nLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9MT09LVVApKSksCisgICAgKCdjdHJsJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfTE9PS1VQKSwgY19pbnQsIFNUUklORywgY19sb25nLCBQT0lOVEVSKFNUUklORykpKSwKKyAgICAoJ2dldF9ieV9zdWJqZWN0JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfTE9PS1VQKSwgY19pbnQsIFBPSU5URVIoWDUwOV9OQU1FKSwgUE9JTlRFUihYNTA5X09CSkVDVCkpKSwKKyAgICAoJ2dldF9ieV9pc3N1ZXJfc2VyaWFsJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfTE9PS1VQKSwgY19pbnQsIFBPSU5URVIoWDUwOV9OQU1FKSwgUE9JTlRFUihBU04xX0lOVEVHRVIpLCBQT0lOVEVSKFg1MDlfT0JKRUNUKSkpLAorICAgICgnZ2V0X2J5X2ZpbmdlcnByaW50JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfTE9PS1VQKSwgY19pbnQsIFBPSU5URVIoY191Ynl0ZSksIGNfaW50LCBQT0lOVEVSKFg1MDlfT0JKRUNUKSkpLAorICAgICgnZ2V0X2J5X2FsaWFzJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfTE9PS1VQKSwgY19pbnQsIFNUUklORywgY19pbnQsIFBPSU5URVIoWDUwOV9PQkpFQ1QpKSksCitdCithc3NlcnQgc2l6ZW9mKHg1MDlfbG9va3VwX21ldGhvZF9zdCkgPT0gNDAsIHNpemVvZih4NTA5X2xvb2t1cF9tZXRob2Rfc3QpCithc3NlcnQgYWxpZ25tZW50KHg1MDlfbG9va3VwX21ldGhvZF9zdCkgPT0gNCwgYWxpZ25tZW50KHg1MDlfbG9va3VwX21ldGhvZF9zdCkKK1g1MDlfTE9PS1VQX01FVEhPRCA9IHg1MDlfbG9va3VwX21ldGhvZF9zdAoreDUwOV9zdG9yZV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2NhY2hlJywgY19pbnQpLAorICAgICgnb2JqcycsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2dldF9jZXJ0X21ldGhvZHMnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdmbGFncycsIGNfdWxvbmcpLAorICAgICgncHVycG9zZScsIGNfaW50KSwKKyAgICAoJ3RydXN0JywgY19pbnQpLAorICAgICgndmVyaWZ5JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSkpLAorICAgICgndmVyaWZ5X2NiJywgQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCkpKSwKKyAgICAoJ2dldF9pc3N1ZXInLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoUE9JTlRFUihYNTA5KSksIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpLCBQT0lOVEVSKFg1MDkpKSksCisgICAgKCdjaGVja19pc3N1ZWQnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpLCBQT0lOVEVSKFg1MDkpLCBQT0lOVEVSKFg1MDkpKSksCisgICAgKCdjaGVja19yZXZvY2F0aW9uJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSkpLAorICAgICgnZ2V0X2NybCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCksIFBPSU5URVIoUE9JTlRFUihYNTA5X0NSTCkpLCBQT0lOVEVSKFg1MDkpKSksCisgICAgKCdjaGVja19jcmwnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpLCBQT0lOVEVSKFg1MDlfQ1JMKSkpLAorICAgICgnY2VydF9jcmwnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpLCBQT0lOVEVSKFg1MDlfQ1JMKSwgUE9JTlRFUihYNTA5KSkpLAorICAgICgnY2xlYW51cCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCkpKSwKKyAgICAoJ2V4X2RhdGEnLCBDUllQVE9fRVhfREFUQSksCisgICAgKCdyZWZlcmVuY2VzJywgY19pbnQpLAorICAgICgnZGVwdGgnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKHg1MDlfc3RvcmVfc3QpID09IDc2LCBzaXplb2YoeDUwOV9zdG9yZV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoeDUwOV9zdG9yZV9zdCkgPT0gNCwgYWxpZ25tZW50KHg1MDlfc3RvcmVfc3QpCit4NTA5X2xvb2t1cF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2luaXQnLCBjX2ludCksCisgICAgKCdza2lwJywgY19pbnQpLAorICAgICgnbWV0aG9kJywgUE9JTlRFUihYNTA5X0xPT0tVUF9NRVRIT0QpKSwKKyAgICAoJ21ldGhvZF9kYXRhJywgU1RSSU5HKSwKKyAgICAoJ3N0b3JlX2N0eCcsIFBPSU5URVIoWDUwOV9TVE9SRSkpLAorXQorYXNzZXJ0IHNpemVvZih4NTA5X2xvb2t1cF9zdCkgPT0gMjAsIHNpemVvZih4NTA5X2xvb2t1cF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoeDUwOV9sb29rdXBfc3QpID09IDQsIGFsaWdubWVudCh4NTA5X2xvb2t1cF9zdCkKK3RpbWVfdCA9IF9fZGFyd2luX3RpbWVfdAoreDUwOV9zdG9yZV9jdHhfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdjdHgnLCBQT0lOVEVSKFg1MDlfU1RPUkUpKSwKKyAgICAoJ2N1cnJlbnRfbWV0aG9kJywgY19pbnQpLAorICAgICgnY2VydCcsIFBPSU5URVIoWDUwOSkpLAorICAgICgndW50cnVzdGVkJywgUE9JTlRFUihTVEFDSykpLAorICAgICgncHVycG9zZScsIGNfaW50KSwKKyAgICAoJ3RydXN0JywgY19pbnQpLAorICAgICgnY2hlY2tfdGltZScsIHRpbWVfdCksCisgICAgKCdmbGFncycsIGNfdWxvbmcpLAorICAgICgnb3RoZXJfY3R4JywgY192b2lkX3ApLAorICAgICgndmVyaWZ5JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSkpLAorICAgICgndmVyaWZ5X2NiJywgQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCkpKSwKKyAgICAoJ2dldF9pc3N1ZXInLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoUE9JTlRFUihYNTA5KSksIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpLCBQT0lOVEVSKFg1MDkpKSksCisgICAgKCdjaGVja19pc3N1ZWQnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpLCBQT0lOVEVSKFg1MDkpLCBQT0lOVEVSKFg1MDkpKSksCisgICAgKCdjaGVja19yZXZvY2F0aW9uJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSkpLAorICAgICgnZ2V0X2NybCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCksIFBPSU5URVIoUE9JTlRFUihYNTA5X0NSTCkpLCBQT0lOVEVSKFg1MDkpKSksCisgICAgKCdjaGVja19jcmwnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpLCBQT0lOVEVSKFg1MDlfQ1JMKSkpLAorICAgICgnY2VydF9jcmwnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpLCBQT0lOVEVSKFg1MDlfQ1JMKSwgUE9JTlRFUihYNTA5KSkpLAorICAgICgnY2xlYW51cCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCkpKSwKKyAgICAoJ2RlcHRoJywgY19pbnQpLAorICAgICgndmFsaWQnLCBjX2ludCksCisgICAgKCdsYXN0X3VudHJ1c3RlZCcsIGNfaW50KSwKKyAgICAoJ2NoYWluJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnZXJyb3JfZGVwdGgnLCBjX2ludCksCisgICAgKCdlcnJvcicsIGNfaW50KSwKKyAgICAoJ2N1cnJlbnRfY2VydCcsIFBPSU5URVIoWDUwOSkpLAorICAgICgnY3VycmVudF9pc3N1ZXInLCBQT0lOVEVSKFg1MDkpKSwKKyAgICAoJ2N1cnJlbnRfY3JsJywgUE9JTlRFUihYNTA5X0NSTCkpLAorICAgICgnZXhfZGF0YScsIENSWVBUT19FWF9EQVRBKSwKK10KK2Fzc2VydCBzaXplb2YoeDUwOV9zdG9yZV9jdHhfc3QpID09IDExNiwgc2l6ZW9mKHg1MDlfc3RvcmVfY3R4X3N0KQorYXNzZXJ0IGFsaWdubWVudCh4NTA5X3N0b3JlX2N0eF9zdCkgPT0gNCwgYWxpZ25tZW50KHg1MDlfc3RvcmVfY3R4X3N0KQordmFfbGlzdCA9IF9fZGFyd2luX3ZhX2xpc3QKK19fZGFyd2luX29mZl90ID0gX19pbnQ2NF90CitmcG9zX3QgPSBfX2Rhcndpbl9vZmZfdAorY2xhc3MgX19zYnVmKFN0cnVjdHVyZSk6CisgICAgcGFzcworX19zYnVmLl9maWVsZHNfID0gWworICAgICgnX2Jhc2UnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ19zaXplJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihfX3NidWYpID09IDgsIHNpemVvZihfX3NidWYpCithc3NlcnQgYWxpZ25tZW50KF9fc2J1ZikgPT0gNCwgYWxpZ25tZW50KF9fc2J1ZikKK2NsYXNzIF9fc0ZJTEVYKFN0cnVjdHVyZSk6CisgICAgcGFzcworX19zRklMRVguX2ZpZWxkc18gPSBbCitdCitjbGFzcyBfX3NGSUxFKFN0cnVjdHVyZSk6CisgICAgcGFzcworX19zRklMRS5fcGFja18gPSA0CitfX3NGSUxFLl9maWVsZHNfID0gWworICAgICgnX3AnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ19yJywgY19pbnQpLAorICAgICgnX3cnLCBjX2ludCksCisgICAgKCdfZmxhZ3MnLCBjX3Nob3J0KSwKKyAgICAoJ19maWxlJywgY19zaG9ydCksCisgICAgKCdfYmYnLCBfX3NidWYpLAorICAgICgnX2xiZnNpemUnLCBjX2ludCksCisgICAgKCdfY29va2llJywgY192b2lkX3ApLAorICAgICgnX2Nsb3NlJywgQ0ZVTkNUWVBFKGNfaW50LCBjX3ZvaWRfcCkpLAorICAgICgnX3JlYWQnLCBDRlVOQ1RZUEUoY19pbnQsIGNfdm9pZF9wLCBTVFJJTkcsIGNfaW50KSksCisgICAgKCdfc2VlaycsIENGVU5DVFlQRShmcG9zX3QsIGNfdm9pZF9wLCBjX2xvbmdsb25nLCBjX2ludCkpLAorICAgICgnX3dyaXRlJywgQ0ZVTkNUWVBFKGNfaW50LCBjX3ZvaWRfcCwgU1RSSU5HLCBjX2ludCkpLAorICAgICgnX3ViJywgX19zYnVmKSwKKyAgICAoJ19leHRyYScsIFBPSU5URVIoX19zRklMRVgpKSwKKyAgICAoJ191cicsIGNfaW50KSwKKyAgICAoJ191YnVmJywgY191Ynl0ZSAqIDMpLAorICAgICgnX25idWYnLCBjX3VieXRlICogMSksCisgICAgKCdfbGInLCBfX3NidWYpLAorICAgICgnX2Jsa3NpemUnLCBjX2ludCksCisgICAgKCdfb2Zmc2V0JywgZnBvc190KSwKK10KK2Fzc2VydCBzaXplb2YoX19zRklMRSkgPT0gODgsIHNpemVvZihfX3NGSUxFKQorYXNzZXJ0IGFsaWdubWVudChfX3NGSUxFKSA9PSA0LCBhbGlnbm1lbnQoX19zRklMRSkKK0ZJTEUgPSBfX3NGSUxFCitjdF9ydW5lX3QgPSBfX2Rhcndpbl9jdF9ydW5lX3QKK3J1bmVfdCA9IF9fZGFyd2luX3J1bmVfdAorY2xhc3MgZGl2X3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitkaXZfdC5fZmllbGRzXyA9IFsKKyAgICAoJ3F1b3QnLCBjX2ludCksCisgICAgKCdyZW0nLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKGRpdl90KSA9PSA4LCBzaXplb2YoZGl2X3QpCithc3NlcnQgYWxpZ25tZW50KGRpdl90KSA9PSA0LCBhbGlnbm1lbnQoZGl2X3QpCitjbGFzcyBsZGl2X3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitsZGl2X3QuX2ZpZWxkc18gPSBbCisgICAgKCdxdW90JywgY19sb25nKSwKKyAgICAoJ3JlbScsIGNfbG9uZyksCitdCithc3NlcnQgc2l6ZW9mKGxkaXZfdCkgPT0gOCwgc2l6ZW9mKGxkaXZfdCkKK2Fzc2VydCBhbGlnbm1lbnQobGRpdl90KSA9PSA0LCBhbGlnbm1lbnQobGRpdl90KQorY2xhc3MgbGxkaXZfdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2xsZGl2X3QuX3BhY2tfID0gNAorbGxkaXZfdC5fZmllbGRzXyA9IFsKKyAgICAoJ3F1b3QnLCBjX2xvbmdsb25nKSwKKyAgICAoJ3JlbScsIGNfbG9uZ2xvbmcpLAorXQorYXNzZXJ0IHNpemVvZihsbGRpdl90KSA9PSAxNiwgc2l6ZW9mKGxsZGl2X3QpCithc3NlcnQgYWxpZ25tZW50KGxsZGl2X3QpID09IDQsIGFsaWdubWVudChsbGRpdl90KQorX19kYXJ3aW5fZGV2X3QgPSBfX2ludDMyX3QKK2Rldl90ID0gX19kYXJ3aW5fZGV2X3QKK19fZGFyd2luX21vZGVfdCA9IF9fdWludDE2X3QKK21vZGVfdCA9IF9fZGFyd2luX21vZGVfdAorY2xhc3MgbWNvbnRleHQoU3RydWN0dXJlKToKKyAgICBwYXNzCittY29udGV4dC5fZmllbGRzXyA9IFsKK10KK2NsYXNzIG1jb250ZXh0NjQoU3RydWN0dXJlKToKKyAgICBwYXNzCittY29udGV4dDY0Ll9maWVsZHNfID0gWworXQorY2xhc3MgX19kYXJ3aW5fcHRocmVhZF9oYW5kbGVyX3JlYyhTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK19fZGFyd2luX3B0aHJlYWRfaGFuZGxlcl9yZWMuX2ZpZWxkc18gPSBbCisgICAgKCdfX3JvdXRpbmUnLCBDRlVOQ1RZUEUoTm9uZSwgY192b2lkX3ApKSwKKyAgICAoJ19fYXJnJywgY192b2lkX3ApLAorICAgICgnX19uZXh0JywgUE9JTlRFUihfX2Rhcndpbl9wdGhyZWFkX2hhbmRsZXJfcmVjKSksCitdCithc3NlcnQgc2l6ZW9mKF9fZGFyd2luX3B0aHJlYWRfaGFuZGxlcl9yZWMpID09IDEyLCBzaXplb2YoX19kYXJ3aW5fcHRocmVhZF9oYW5kbGVyX3JlYykKK2Fzc2VydCBhbGlnbm1lbnQoX19kYXJ3aW5fcHRocmVhZF9oYW5kbGVyX3JlYykgPT0gNCwgYWxpZ25tZW50KF9fZGFyd2luX3B0aHJlYWRfaGFuZGxlcl9yZWMpCitjbGFzcyBfb3BhcXVlX3B0aHJlYWRfYXR0cl90KFN0cnVjdHVyZSk6CisgICAgcGFzcworX29wYXF1ZV9wdGhyZWFkX2F0dHJfdC5fZmllbGRzXyA9IFsKKyAgICAoJ19fc2lnJywgY19sb25nKSwKKyAgICAoJ19fb3BhcXVlJywgY19jaGFyICogMzYpLAorXQorYXNzZXJ0IHNpemVvZihfb3BhcXVlX3B0aHJlYWRfYXR0cl90KSA9PSA0MCwgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9hdHRyX3QpCithc3NlcnQgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF9hdHRyX3QpID09IDQsIGFsaWdubWVudChfb3BhcXVlX3B0aHJlYWRfYXR0cl90KQorY2xhc3MgX29wYXF1ZV9wdGhyZWFkX2NvbmRfdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK19vcGFxdWVfcHRocmVhZF9jb25kX3QuX2ZpZWxkc18gPSBbCisgICAgKCdfX3NpZycsIGNfbG9uZyksCisgICAgKCdfX29wYXF1ZScsIGNfY2hhciAqIDI0KSwKK10KK2Fzc2VydCBzaXplb2YoX29wYXF1ZV9wdGhyZWFkX2NvbmRfdCkgPT0gMjgsIHNpemVvZihfb3BhcXVlX3B0aHJlYWRfY29uZF90KQorYXNzZXJ0IGFsaWdubWVudChfb3BhcXVlX3B0aHJlYWRfY29uZF90KSA9PSA0LCBhbGlnbm1lbnQoX29wYXF1ZV9wdGhyZWFkX2NvbmRfdCkKK2NsYXNzIF9vcGFxdWVfcHRocmVhZF9jb25kYXR0cl90KFN0cnVjdHVyZSk6CisgICAgcGFzcworX29wYXF1ZV9wdGhyZWFkX2NvbmRhdHRyX3QuX2ZpZWxkc18gPSBbCisgICAgKCdfX3NpZycsIGNfbG9uZyksCisgICAgKCdfX29wYXF1ZScsIGNfY2hhciAqIDQpLAorXQorYXNzZXJ0IHNpemVvZihfb3BhcXVlX3B0aHJlYWRfY29uZGF0dHJfdCkgPT0gOCwgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9jb25kYXR0cl90KQorYXNzZXJ0IGFsaWdubWVudChfb3BhcXVlX3B0aHJlYWRfY29uZGF0dHJfdCkgPT0gNCwgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF9jb25kYXR0cl90KQorY2xhc3MgX29wYXF1ZV9wdGhyZWFkX211dGV4X3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitfb3BhcXVlX3B0aHJlYWRfbXV0ZXhfdC5fZmllbGRzXyA9IFsKKyAgICAoJ19fc2lnJywgY19sb25nKSwKKyAgICAoJ19fb3BhcXVlJywgY19jaGFyICogNDApLAorXQorYXNzZXJ0IHNpemVvZihfb3BhcXVlX3B0aHJlYWRfbXV0ZXhfdCkgPT0gNDQsIHNpemVvZihfb3BhcXVlX3B0aHJlYWRfbXV0ZXhfdCkKK2Fzc2VydCBhbGlnbm1lbnQoX29wYXF1ZV9wdGhyZWFkX211dGV4X3QpID09IDQsIGFsaWdubWVudChfb3BhcXVlX3B0aHJlYWRfbXV0ZXhfdCkKK2NsYXNzIF9vcGFxdWVfcHRocmVhZF9tdXRleGF0dHJfdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK19vcGFxdWVfcHRocmVhZF9tdXRleGF0dHJfdC5fZmllbGRzXyA9IFsKKyAgICAoJ19fc2lnJywgY19sb25nKSwKKyAgICAoJ19fb3BhcXVlJywgY19jaGFyICogOCksCitdCithc3NlcnQgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9tdXRleGF0dHJfdCkgPT0gMTIsIHNpemVvZihfb3BhcXVlX3B0aHJlYWRfbXV0ZXhhdHRyX3QpCithc3NlcnQgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF9tdXRleGF0dHJfdCkgPT0gNCwgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF9tdXRleGF0dHJfdCkKK2NsYXNzIF9vcGFxdWVfcHRocmVhZF9vbmNlX3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitfb3BhcXVlX3B0aHJlYWRfb25jZV90Ll9maWVsZHNfID0gWworICAgICgnX19zaWcnLCBjX2xvbmcpLAorICAgICgnX19vcGFxdWUnLCBjX2NoYXIgKiA0KSwKK10KK2Fzc2VydCBzaXplb2YoX29wYXF1ZV9wdGhyZWFkX29uY2VfdCkgPT0gOCwgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9vbmNlX3QpCithc3NlcnQgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF9vbmNlX3QpID09IDQsIGFsaWdubWVudChfb3BhcXVlX3B0aHJlYWRfb25jZV90KQorY2xhc3MgX29wYXF1ZV9wdGhyZWFkX3J3bG9ja190KFN0cnVjdHVyZSk6CisgICAgcGFzcworX29wYXF1ZV9wdGhyZWFkX3J3bG9ja190Ll9maWVsZHNfID0gWworICAgICgnX19zaWcnLCBjX2xvbmcpLAorICAgICgnX19vcGFxdWUnLCBjX2NoYXIgKiAxMjQpLAorXQorYXNzZXJ0IHNpemVvZihfb3BhcXVlX3B0aHJlYWRfcndsb2NrX3QpID09IDEyOCwgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9yd2xvY2tfdCkKK2Fzc2VydCBhbGlnbm1lbnQoX29wYXF1ZV9wdGhyZWFkX3J3bG9ja190KSA9PSA0LCBhbGlnbm1lbnQoX29wYXF1ZV9wdGhyZWFkX3J3bG9ja190KQorY2xhc3MgX29wYXF1ZV9wdGhyZWFkX3J3bG9ja2F0dHJfdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK19vcGFxdWVfcHRocmVhZF9yd2xvY2thdHRyX3QuX2ZpZWxkc18gPSBbCisgICAgKCdfX3NpZycsIGNfbG9uZyksCisgICAgKCdfX29wYXF1ZScsIGNfY2hhciAqIDEyKSwKK10KK2Fzc2VydCBzaXplb2YoX29wYXF1ZV9wdGhyZWFkX3J3bG9ja2F0dHJfdCkgPT0gMTYsIHNpemVvZihfb3BhcXVlX3B0aHJlYWRfcndsb2NrYXR0cl90KQorYXNzZXJ0IGFsaWdubWVudChfb3BhcXVlX3B0aHJlYWRfcndsb2NrYXR0cl90KSA9PSA0LCBhbGlnbm1lbnQoX29wYXF1ZV9wdGhyZWFkX3J3bG9ja2F0dHJfdCkKK2NsYXNzIF9vcGFxdWVfcHRocmVhZF90KFN0cnVjdHVyZSk6CisgICAgcGFzcworX29wYXF1ZV9wdGhyZWFkX3QuX2ZpZWxkc18gPSBbCisgICAgKCdfX3NpZycsIGNfbG9uZyksCisgICAgKCdfX2NsZWFudXBfc3RhY2snLCBQT0lOVEVSKF9fZGFyd2luX3B0aHJlYWRfaGFuZGxlcl9yZWMpKSwKKyAgICAoJ19fb3BhcXVlJywgY19jaGFyICogNTk2KSwKK10KK2Fzc2VydCBzaXplb2YoX29wYXF1ZV9wdGhyZWFkX3QpID09IDYwNCwgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF90KQorYXNzZXJ0IGFsaWdubWVudChfb3BhcXVlX3B0aHJlYWRfdCkgPT0gNCwgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF90KQorX19kYXJ3aW5fYmxrY250X3QgPSBfX2ludDY0X3QKK19fZGFyd2luX2Jsa3NpemVfdCA9IF9faW50MzJfdAorX19kYXJ3aW5fZnNibGtjbnRfdCA9IGNfdWludAorX19kYXJ3aW5fZnNmaWxjbnRfdCA9IGNfdWludAorX19kYXJ3aW5fZ2lkX3QgPSBfX3VpbnQzMl90CitfX2Rhcndpbl9pZF90ID0gX191aW50MzJfdAorX19kYXJ3aW5faW5vX3QgPSBfX3VpbnQzMl90CitfX2Rhcndpbl9tYWNoX3BvcnRfbmFtZV90ID0gX19kYXJ3aW5fbmF0dXJhbF90CitfX2Rhcndpbl9tYWNoX3BvcnRfdCA9IF9fZGFyd2luX21hY2hfcG9ydF9uYW1lX3QKK19fZGFyd2luX21jb250ZXh0X3QgPSBQT0lOVEVSKG1jb250ZXh0KQorX19kYXJ3aW5fbWNvbnRleHQ2NF90ID0gUE9JTlRFUihtY29udGV4dDY0KQorX19kYXJ3aW5fcGlkX3QgPSBfX2ludDMyX3QKK19fZGFyd2luX3B0aHJlYWRfYXR0cl90ID0gX29wYXF1ZV9wdGhyZWFkX2F0dHJfdAorX19kYXJ3aW5fcHRocmVhZF9jb25kX3QgPSBfb3BhcXVlX3B0aHJlYWRfY29uZF90CitfX2Rhcndpbl9wdGhyZWFkX2NvbmRhdHRyX3QgPSBfb3BhcXVlX3B0aHJlYWRfY29uZGF0dHJfdAorX19kYXJ3aW5fcHRocmVhZF9rZXlfdCA9IGNfdWxvbmcKK19fZGFyd2luX3B0aHJlYWRfbXV0ZXhfdCA9IF9vcGFxdWVfcHRocmVhZF9tdXRleF90CitfX2Rhcndpbl9wdGhyZWFkX211dGV4YXR0cl90ID0gX29wYXF1ZV9wdGhyZWFkX211dGV4YXR0cl90CitfX2Rhcndpbl9wdGhyZWFkX29uY2VfdCA9IF9vcGFxdWVfcHRocmVhZF9vbmNlX3QKK19fZGFyd2luX3B0aHJlYWRfcndsb2NrX3QgPSBfb3BhcXVlX3B0aHJlYWRfcndsb2NrX3QKK19fZGFyd2luX3B0aHJlYWRfcndsb2NrYXR0cl90ID0gX29wYXF1ZV9wdGhyZWFkX3J3bG9ja2F0dHJfdAorX19kYXJ3aW5fcHRocmVhZF90ID0gUE9JTlRFUihfb3BhcXVlX3B0aHJlYWRfdCkKK19fZGFyd2luX3NpZ3NldF90ID0gX191aW50MzJfdAorX19kYXJ3aW5fc3VzZWNvbmRzX3QgPSBfX2ludDMyX3QKK19fZGFyd2luX3VpZF90ID0gX191aW50MzJfdAorX19kYXJ3aW5fdXNlY29uZHNfdCA9IF9fdWludDMyX3QKK19fZGFyd2luX3V1aWRfdCA9IGNfdWJ5dGUgKiAxNgorY2xhc3Mgc2lnYWx0c3RhY2soU3RydWN0dXJlKToKKyAgICBwYXNzCitzaWdhbHRzdGFjay5fZmllbGRzXyA9IFsKKyAgICAoJ3NzX3NwJywgY192b2lkX3ApLAorICAgICgnc3Nfc2l6ZScsIF9fZGFyd2luX3NpemVfdCksCisgICAgKCdzc19mbGFncycsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2Yoc2lnYWx0c3RhY2spID09IDEyLCBzaXplb2Yoc2lnYWx0c3RhY2spCithc3NlcnQgYWxpZ25tZW50KHNpZ2FsdHN0YWNrKSA9PSA0LCBhbGlnbm1lbnQoc2lnYWx0c3RhY2spCitfX2Rhcndpbl9zdGFja190ID0gc2lnYWx0c3RhY2sKK2NsYXNzIHVjb250ZXh0KFN0cnVjdHVyZSk6CisgICAgcGFzcwordWNvbnRleHQuX2ZpZWxkc18gPSBbCisgICAgKCd1Y19vbnN0YWNrJywgY19pbnQpLAorICAgICgndWNfc2lnbWFzaycsIF9fZGFyd2luX3NpZ3NldF90KSwKKyAgICAoJ3VjX3N0YWNrJywgX19kYXJ3aW5fc3RhY2tfdCksCisgICAgKCd1Y19saW5rJywgUE9JTlRFUih1Y29udGV4dCkpLAorICAgICgndWNfbWNzaXplJywgX19kYXJ3aW5fc2l6ZV90KSwKKyAgICAoJ3VjX21jb250ZXh0JywgX19kYXJ3aW5fbWNvbnRleHRfdCksCitdCithc3NlcnQgc2l6ZW9mKHVjb250ZXh0KSA9PSAzMiwgc2l6ZW9mKHVjb250ZXh0KQorYXNzZXJ0IGFsaWdubWVudCh1Y29udGV4dCkgPT0gNCwgYWxpZ25tZW50KHVjb250ZXh0KQorX19kYXJ3aW5fdWNvbnRleHRfdCA9IHVjb250ZXh0CitjbGFzcyB1Y29udGV4dDY0KFN0cnVjdHVyZSk6CisgICAgcGFzcwordWNvbnRleHQ2NC5fZmllbGRzXyA9IFsKKyAgICAoJ3VjX29uc3RhY2snLCBjX2ludCksCisgICAgKCd1Y19zaWdtYXNrJywgX19kYXJ3aW5fc2lnc2V0X3QpLAorICAgICgndWNfc3RhY2snLCBfX2Rhcndpbl9zdGFja190KSwKKyAgICAoJ3VjX2xpbmsnLCBQT0lOVEVSKHVjb250ZXh0NjQpKSwKKyAgICAoJ3VjX21jc2l6ZScsIF9fZGFyd2luX3NpemVfdCksCisgICAgKCd1Y19tY29udGV4dDY0JywgX19kYXJ3aW5fbWNvbnRleHQ2NF90KSwKK10KK2Fzc2VydCBzaXplb2YodWNvbnRleHQ2NCkgPT0gMzIsIHNpemVvZih1Y29udGV4dDY0KQorYXNzZXJ0IGFsaWdubWVudCh1Y29udGV4dDY0KSA9PSA0LCBhbGlnbm1lbnQodWNvbnRleHQ2NCkKK19fZGFyd2luX3Vjb250ZXh0NjRfdCA9IHVjb250ZXh0NjQKK2NsYXNzIHRpbWV2YWwoU3RydWN0dXJlKToKKyAgICBwYXNzCit0aW1ldmFsLl9maWVsZHNfID0gWworICAgICgndHZfc2VjJywgX19kYXJ3aW5fdGltZV90KSwKKyAgICAoJ3R2X3VzZWMnLCBfX2Rhcndpbl9zdXNlY29uZHNfdCksCitdCithc3NlcnQgc2l6ZW9mKHRpbWV2YWwpID09IDgsIHNpemVvZih0aW1ldmFsKQorYXNzZXJ0IGFsaWdubWVudCh0aW1ldmFsKSA9PSA0LCBhbGlnbm1lbnQodGltZXZhbCkKK3JsaW1fdCA9IF9faW50NjRfdAorY2xhc3MgcnVzYWdlKFN0cnVjdHVyZSk6CisgICAgcGFzcworcnVzYWdlLl9maWVsZHNfID0gWworICAgICgncnVfdXRpbWUnLCB0aW1ldmFsKSwKKyAgICAoJ3J1X3N0aW1lJywgdGltZXZhbCksCisgICAgKCdydV9tYXhyc3MnLCBjX2xvbmcpLAorICAgICgncnVfaXhyc3MnLCBjX2xvbmcpLAorICAgICgncnVfaWRyc3MnLCBjX2xvbmcpLAorICAgICgncnVfaXNyc3MnLCBjX2xvbmcpLAorICAgICgncnVfbWluZmx0JywgY19sb25nKSwKKyAgICAoJ3J1X21hamZsdCcsIGNfbG9uZyksCisgICAgKCdydV9uc3dhcCcsIGNfbG9uZyksCisgICAgKCdydV9pbmJsb2NrJywgY19sb25nKSwKKyAgICAoJ3J1X291YmxvY2snLCBjX2xvbmcpLAorICAgICgncnVfbXNnc25kJywgY19sb25nKSwKKyAgICAoJ3J1X21zZ3JjdicsIGNfbG9uZyksCisgICAgKCdydV9uc2lnbmFscycsIGNfbG9uZyksCisgICAgKCdydV9udmNzdycsIGNfbG9uZyksCisgICAgKCdydV9uaXZjc3cnLCBjX2xvbmcpLAorXQorYXNzZXJ0IHNpemVvZihydXNhZ2UpID09IDcyLCBzaXplb2YocnVzYWdlKQorYXNzZXJ0IGFsaWdubWVudChydXNhZ2UpID09IDQsIGFsaWdubWVudChydXNhZ2UpCitjbGFzcyBybGltaXQoU3RydWN0dXJlKToKKyAgICBwYXNzCitybGltaXQuX3BhY2tfID0gNAorcmxpbWl0Ll9maWVsZHNfID0gWworICAgICgncmxpbV9jdXInLCBybGltX3QpLAorICAgICgncmxpbV9tYXgnLCBybGltX3QpLAorXQorYXNzZXJ0IHNpemVvZihybGltaXQpID09IDE2LCBzaXplb2YocmxpbWl0KQorYXNzZXJ0IGFsaWdubWVudChybGltaXQpID09IDQsIGFsaWdubWVudChybGltaXQpCittY29udGV4dF90ID0gX19kYXJ3aW5fbWNvbnRleHRfdAorbWNvbnRleHQ2NF90ID0gX19kYXJ3aW5fbWNvbnRleHQ2NF90CitwdGhyZWFkX2F0dHJfdCA9IF9fZGFyd2luX3B0aHJlYWRfYXR0cl90CitzaWdzZXRfdCA9IF9fZGFyd2luX3NpZ3NldF90Cit1Y29udGV4dF90ID0gX19kYXJ3aW5fdWNvbnRleHRfdAordWNvbnRleHQ2NF90ID0gX19kYXJ3aW5fdWNvbnRleHQ2NF90Cit1aWRfdCA9IF9fZGFyd2luX3VpZF90CitjbGFzcyBzaWd2YWwoVW5pb24pOgorICAgIHBhc3MKK3NpZ3ZhbC5fZmllbGRzXyA9IFsKKyAgICAoJ3NpdmFsX2ludCcsIGNfaW50KSwKKyAgICAoJ3NpdmFsX3B0cicsIGNfdm9pZF9wKSwKK10KK2Fzc2VydCBzaXplb2Yoc2lndmFsKSA9PSA0LCBzaXplb2Yoc2lndmFsKQorYXNzZXJ0IGFsaWdubWVudChzaWd2YWwpID09IDQsIGFsaWdubWVudChzaWd2YWwpCitjbGFzcyBzaWdldmVudChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3NpZ2V2ZW50Ll9maWVsZHNfID0gWworICAgICgnc2lnZXZfbm90aWZ5JywgY19pbnQpLAorICAgICgnc2lnZXZfc2lnbm8nLCBjX2ludCksCisgICAgKCdzaWdldl92YWx1ZScsIHNpZ3ZhbCksCisgICAgKCdzaWdldl9ub3RpZnlfZnVuY3Rpb24nLCBDRlVOQ1RZUEUoTm9uZSwgc2lndmFsKSksCisgICAgKCdzaWdldl9ub3RpZnlfYXR0cmlidXRlcycsIFBPSU5URVIocHRocmVhZF9hdHRyX3QpKSwKK10KK2Fzc2VydCBzaXplb2Yoc2lnZXZlbnQpID09IDIwLCBzaXplb2Yoc2lnZXZlbnQpCithc3NlcnQgYWxpZ25tZW50KHNpZ2V2ZW50KSA9PSA0LCBhbGlnbm1lbnQoc2lnZXZlbnQpCitjbGFzcyBfX3NpZ2luZm8oU3RydWN0dXJlKToKKyAgICBwYXNzCitwaWRfdCA9IF9fZGFyd2luX3BpZF90CitfX3NpZ2luZm8uX2ZpZWxkc18gPSBbCisgICAgKCdzaV9zaWdubycsIGNfaW50KSwKKyAgICAoJ3NpX2Vycm5vJywgY19pbnQpLAorICAgICgnc2lfY29kZScsIGNfaW50KSwKKyAgICAoJ3NpX3BpZCcsIHBpZF90KSwKKyAgICAoJ3NpX3VpZCcsIHVpZF90KSwKKyAgICAoJ3NpX3N0YXR1cycsIGNfaW50KSwKKyAgICAoJ3NpX2FkZHInLCBjX3ZvaWRfcCksCisgICAgKCdzaV92YWx1ZScsIHNpZ3ZhbCksCisgICAgKCdzaV9iYW5kJywgY19sb25nKSwKKyAgICAoJ3BhZCcsIGNfdWxvbmcgKiA3KSwKK10KK2Fzc2VydCBzaXplb2YoX19zaWdpbmZvKSA9PSA2NCwgc2l6ZW9mKF9fc2lnaW5mbykKK2Fzc2VydCBhbGlnbm1lbnQoX19zaWdpbmZvKSA9PSA0LCBhbGlnbm1lbnQoX19zaWdpbmZvKQorc2lnaW5mb190ID0gX19zaWdpbmZvCitjbGFzcyBfX3NpZ2FjdGlvbl91KFVuaW9uKToKKyAgICBwYXNzCitfX3NpZ2FjdGlvbl91Ll9maWVsZHNfID0gWworICAgICgnX19zYV9oYW5kbGVyJywgQ0ZVTkNUWVBFKE5vbmUsIGNfaW50KSksCisgICAgKCdfX3NhX3NpZ2FjdGlvbicsIENGVU5DVFlQRShOb25lLCBjX2ludCwgUE9JTlRFUihfX3NpZ2luZm8pLCBjX3ZvaWRfcCkpLAorXQorYXNzZXJ0IHNpemVvZihfX3NpZ2FjdGlvbl91KSA9PSA0LCBzaXplb2YoX19zaWdhY3Rpb25fdSkKK2Fzc2VydCBhbGlnbm1lbnQoX19zaWdhY3Rpb25fdSkgPT0gNCwgYWxpZ25tZW50KF9fc2lnYWN0aW9uX3UpCitjbGFzcyBfX3NpZ2FjdGlvbihTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK19fc2lnYWN0aW9uLl9maWVsZHNfID0gWworICAgICgnX19zaWdhY3Rpb25fdScsIF9fc2lnYWN0aW9uX3UpLAorICAgICgnc2FfdHJhbXAnLCBDRlVOQ1RZUEUoTm9uZSwgY192b2lkX3AsIGNfaW50LCBjX2ludCwgUE9JTlRFUihzaWdpbmZvX3QpLCBjX3ZvaWRfcCkpLAorICAgICgnc2FfbWFzaycsIHNpZ3NldF90KSwKKyAgICAoJ3NhX2ZsYWdzJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihfX3NpZ2FjdGlvbikgPT0gMTYsIHNpemVvZihfX3NpZ2FjdGlvbikKK2Fzc2VydCBhbGlnbm1lbnQoX19zaWdhY3Rpb24pID09IDQsIGFsaWdubWVudChfX3NpZ2FjdGlvbikKK2NsYXNzIHNpZ2FjdGlvbihTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3NpZ2FjdGlvbi5fZmllbGRzXyA9IFsKKyAgICAoJ19fc2lnYWN0aW9uX3UnLCBfX3NpZ2FjdGlvbl91KSwKKyAgICAoJ3NhX21hc2snLCBzaWdzZXRfdCksCisgICAgKCdzYV9mbGFncycsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2Yoc2lnYWN0aW9uKSA9PSAxMiwgc2l6ZW9mKHNpZ2FjdGlvbikKK2Fzc2VydCBhbGlnbm1lbnQoc2lnYWN0aW9uKSA9PSA0LCBhbGlnbm1lbnQoc2lnYWN0aW9uKQorc2lnX3QgPSBDRlVOQ1RZUEUoTm9uZSwgY19pbnQpCitzdGFja190ID0gX19kYXJ3aW5fc3RhY2tfdAorY2xhc3Mgc2lndmVjKFN0cnVjdHVyZSk6CisgICAgcGFzcworc2lndmVjLl9maWVsZHNfID0gWworICAgICgnc3ZfaGFuZGxlcicsIENGVU5DVFlQRShOb25lLCBjX2ludCkpLAorICAgICgnc3ZfbWFzaycsIGNfaW50KSwKKyAgICAoJ3N2X2ZsYWdzJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihzaWd2ZWMpID09IDEyLCBzaXplb2Yoc2lndmVjKQorYXNzZXJ0IGFsaWdubWVudChzaWd2ZWMpID09IDQsIGFsaWdubWVudChzaWd2ZWMpCitjbGFzcyBzaWdzdGFjayhTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3NpZ3N0YWNrLl9maWVsZHNfID0gWworICAgICgnc3Nfc3AnLCBTVFJJTkcpLAorICAgICgnc3Nfb25zdGFjaycsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2Yoc2lnc3RhY2spID09IDgsIHNpemVvZihzaWdzdGFjaykKK2Fzc2VydCBhbGlnbm1lbnQoc2lnc3RhY2spID09IDQsIGFsaWdubWVudChzaWdzdGFjaykKK3VfY2hhciA9IGNfdWJ5dGUKK3Vfc2hvcnQgPSBjX3VzaG9ydAordV9pbnQgPSBjX3VpbnQKK3VfbG9uZyA9IGNfdWxvbmcKK3VzaG9ydCA9IGNfdXNob3J0Cit1aW50ID0gY191aW50Cit1X3F1YWRfdCA9IHVfaW50NjRfdAorcXVhZF90ID0gaW50NjRfdAorcWFkZHJfdCA9IFBPSU5URVIocXVhZF90KQorY2FkZHJfdCA9IFNUUklORworZGFkZHJfdCA9IGludDMyX3QKK2ZpeHB0X3QgPSB1X2ludDMyX3QKK2Jsa2NudF90ID0gX19kYXJ3aW5fYmxrY250X3QKK2Jsa3NpemVfdCA9IF9fZGFyd2luX2Jsa3NpemVfdAorZ2lkX3QgPSBfX2Rhcndpbl9naWRfdAoraW5fYWRkcl90ID0gX191aW50MzJfdAoraW5fcG9ydF90ID0gX191aW50MTZfdAoraW5vX3QgPSBfX2Rhcndpbl9pbm9fdAora2V5X3QgPSBfX2ludDMyX3QKK25saW5rX3QgPSBfX3VpbnQxNl90CitvZmZfdCA9IF9fZGFyd2luX29mZl90CitzZWdzel90ID0gaW50MzJfdAorc3dibGtfdCA9IGludDMyX3QKK2Nsb2NrX3QgPSBfX2Rhcndpbl9jbG9ja190Citzc2l6ZV90ID0gX19kYXJ3aW5fc3NpemVfdAordXNlY29uZHNfdCA9IF9fZGFyd2luX3VzZWNvbmRzX3QKK3N1c2Vjb25kc190ID0gX19kYXJ3aW5fc3VzZWNvbmRzX3QKK2ZkX21hc2sgPSBfX2ludDMyX3QKK2NsYXNzIGZkX3NldChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2ZkX3NldC5fZmllbGRzXyA9IFsKKyAgICAoJ2Zkc19iaXRzJywgX19pbnQzMl90ICogMzIpLAorXQorYXNzZXJ0IHNpemVvZihmZF9zZXQpID09IDEyOCwgc2l6ZW9mKGZkX3NldCkKK2Fzc2VydCBhbGlnbm1lbnQoZmRfc2V0KSA9PSA0LCBhbGlnbm1lbnQoZmRfc2V0KQorcHRocmVhZF9jb25kX3QgPSBfX2Rhcndpbl9wdGhyZWFkX2NvbmRfdAorcHRocmVhZF9jb25kYXR0cl90ID0gX19kYXJ3aW5fcHRocmVhZF9jb25kYXR0cl90CitwdGhyZWFkX211dGV4X3QgPSBfX2Rhcndpbl9wdGhyZWFkX211dGV4X3QKK3B0aHJlYWRfbXV0ZXhhdHRyX3QgPSBfX2Rhcndpbl9wdGhyZWFkX211dGV4YXR0cl90CitwdGhyZWFkX29uY2VfdCA9IF9fZGFyd2luX3B0aHJlYWRfb25jZV90CitwdGhyZWFkX3J3bG9ja190ID0gX19kYXJ3aW5fcHRocmVhZF9yd2xvY2tfdAorcHRocmVhZF9yd2xvY2thdHRyX3QgPSBfX2Rhcndpbl9wdGhyZWFkX3J3bG9ja2F0dHJfdAorcHRocmVhZF90ID0gX19kYXJ3aW5fcHRocmVhZF90CitwdGhyZWFkX2tleV90ID0gX19kYXJ3aW5fcHRocmVhZF9rZXlfdAorZnNibGtjbnRfdCA9IF9fZGFyd2luX2ZzYmxrY250X3QKK2ZzZmlsY250X3QgPSBfX2Rhcndpbl9mc2ZpbGNudF90CisKKyMgdmFsdWVzIGZvciBlbnVtZXJhdGlvbiAnaWR0eXBlX3QnCitpZHR5cGVfdCA9IGNfaW50ICMgZW51bQoraWRfdCA9IF9fZGFyd2luX2lkX3QKK2NsYXNzIHdhaXQoVW5pb24pOgorICAgIHBhc3MKK2NsYXNzIE40d2FpdDNET0xMQVJfM0UoU3RydWN0dXJlKToKKyAgICBwYXNzCitONHdhaXQzRE9MTEFSXzNFLl9maWVsZHNfID0gWworICAgICgnd19UZXJtc2lnJywgY191aW50LCA3KSwKKyAgICAoJ3dfQ29yZWR1bXAnLCBjX3VpbnQsIDEpLAorICAgICgnd19SZXRjb2RlJywgY191aW50LCA4KSwKKyAgICAoJ3dfRmlsbGVyJywgY191aW50LCAxNiksCitdCithc3NlcnQgc2l6ZW9mKE40d2FpdDNET0xMQVJfM0UpID09IDQsIHNpemVvZihONHdhaXQzRE9MTEFSXzNFKQorYXNzZXJ0IGFsaWdubWVudChONHdhaXQzRE9MTEFSXzNFKSA9PSA0LCBhbGlnbm1lbnQoTjR3YWl0M0RPTExBUl8zRSkKK2NsYXNzIE40d2FpdDNET0xMQVJfNEUoU3RydWN0dXJlKToKKyAgICBwYXNzCitONHdhaXQzRE9MTEFSXzRFLl9maWVsZHNfID0gWworICAgICgnd19TdG9wdmFsJywgY191aW50LCA4KSwKKyAgICAoJ3dfU3RvcHNpZycsIGNfdWludCwgOCksCisgICAgKCd3X0ZpbGxlcicsIGNfdWludCwgMTYpLAorXQorYXNzZXJ0IHNpemVvZihONHdhaXQzRE9MTEFSXzRFKSA9PSA0LCBzaXplb2YoTjR3YWl0M0RPTExBUl80RSkKK2Fzc2VydCBhbGlnbm1lbnQoTjR3YWl0M0RPTExBUl80RSkgPT0gNCwgYWxpZ25tZW50KE40d2FpdDNET0xMQVJfNEUpCit3YWl0Ll9maWVsZHNfID0gWworICAgICgnd19zdGF0dXMnLCBjX2ludCksCisgICAgKCd3X1QnLCBONHdhaXQzRE9MTEFSXzNFKSwKKyAgICAoJ3dfUycsIE40d2FpdDNET0xMQVJfNEUpLAorXQorYXNzZXJ0IHNpemVvZih3YWl0KSA9PSA0LCBzaXplb2Yod2FpdCkKK2Fzc2VydCBhbGlnbm1lbnQod2FpdCkgPT0gNCwgYWxpZ25tZW50KHdhaXQpCitjbGFzcyB0aW1lc3BlYyhTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3RpbWVzcGVjLl9maWVsZHNfID0gWworICAgICgndHZfc2VjJywgdGltZV90KSwKKyAgICAoJ3R2X25zZWMnLCBjX2xvbmcpLAorXQorYXNzZXJ0IHNpemVvZih0aW1lc3BlYykgPT0gOCwgc2l6ZW9mKHRpbWVzcGVjKQorYXNzZXJ0IGFsaWdubWVudCh0aW1lc3BlYykgPT0gNCwgYWxpZ25tZW50KHRpbWVzcGVjKQorY2xhc3MgdG0oU3RydWN0dXJlKToKKyAgICBwYXNzCit0bS5fZmllbGRzXyA9IFsKKyAgICAoJ3RtX3NlYycsIGNfaW50KSwKKyAgICAoJ3RtX21pbicsIGNfaW50KSwKKyAgICAoJ3RtX2hvdXInLCBjX2ludCksCisgICAgKCd0bV9tZGF5JywgY19pbnQpLAorICAgICgndG1fbW9uJywgY19pbnQpLAorICAgICgndG1feWVhcicsIGNfaW50KSwKKyAgICAoJ3RtX3dkYXknLCBjX2ludCksCisgICAgKCd0bV95ZGF5JywgY19pbnQpLAorICAgICgndG1faXNkc3QnLCBjX2ludCksCisgICAgKCd0bV9nbXRvZmYnLCBjX2xvbmcpLAorICAgICgndG1fem9uZScsIFNUUklORyksCitdCithc3NlcnQgc2l6ZW9mKHRtKSA9PSA0NCwgc2l6ZW9mKHRtKQorYXNzZXJ0IGFsaWdubWVudCh0bSkgPT0gNCwgYWxpZ25tZW50KHRtKQorX19nbnVjX3ZhX2xpc3QgPSBTVFJJTkcKK3B0cmRpZmZfdCA9IGNfaW50CitpbnQ4X3QgPSBjX2J5dGUKK2ludDE2X3QgPSBjX3Nob3J0Cit1aW50OF90ID0gY191Ynl0ZQordWludDE2X3QgPSBjX3VzaG9ydAordWludDMyX3QgPSBjX3VpbnQKK3VpbnQ2NF90ID0gY191bG9uZ2xvbmcKK2ludF9sZWFzdDhfdCA9IGludDhfdAoraW50X2xlYXN0MTZfdCA9IGludDE2X3QKK2ludF9sZWFzdDMyX3QgPSBpbnQzMl90CitpbnRfbGVhc3Q2NF90ID0gaW50NjRfdAordWludF9sZWFzdDhfdCA9IHVpbnQ4X3QKK3VpbnRfbGVhc3QxNl90ID0gdWludDE2X3QKK3VpbnRfbGVhc3QzMl90ID0gdWludDMyX3QKK3VpbnRfbGVhc3Q2NF90ID0gdWludDY0X3QKK2ludF9mYXN0OF90ID0gaW50OF90CitpbnRfZmFzdDE2X3QgPSBpbnQxNl90CitpbnRfZmFzdDMyX3QgPSBpbnQzMl90CitpbnRfZmFzdDY0X3QgPSBpbnQ2NF90Cit1aW50X2Zhc3Q4X3QgPSB1aW50OF90Cit1aW50X2Zhc3QxNl90ID0gdWludDE2X3QKK3VpbnRfZmFzdDMyX3QgPSB1aW50MzJfdAordWludF9mYXN0NjRfdCA9IHVpbnQ2NF90CitpbnRwdHJfdCA9IGNfbG9uZwordWludHB0cl90ID0gY191bG9uZworaW50bWF4X3QgPSBjX2xvbmdsb25nCit1aW50bWF4X3QgPSBjX3Vsb25nbG9uZworX19hbGxfXyA9IFsnRU5HSU5FJywgJ3BrY3M3X2VuY19jb250ZW50X3N0JywgJ19faW50MTZfdCcsCisgICAgICAgICAgICdYNTA5X1JFVk9LRUQnLCAnU1NMX0NUWCcsICdVSVRfQk9PTEVBTicsCisgICAgICAgICAgICdfX2Rhcndpbl90aW1lX3QnLCAndWNvbnRleHQ2NF90JywgJ2ludF9mYXN0MzJfdCcsCisgICAgICAgICAgICdwZW1fY3R4X3N0JywgJ3VpbnQ4X3QnLCAnZnBvc190JywgJ1g1MDknLCAnQ09NUF9DVFgnLAorICAgICAgICAgICAndG0nLCAnTjEwcGVtX2N0eF9zdDRET0xMQVJfMTdFJywgJ3N3YmxrX3QnLAorICAgICAgICAgICAnQVNOMV9URU1QTEFURScsICdfX2Rhcndpbl9wdGhyZWFkX3QnLCAnZml4cHRfdCcsCisgICAgICAgICAgICdCSU9fTUVUSE9EJywgJ0FTTjFfUFJJTlRBQkxFU1RSSU5HJywgJ0VWUF9FTkNPREVfQ1RYJywKKyAgICAgICAgICAgJ2RoX21ldGhvZCcsICdiaW9fZl9idWZmZXJfY3R4X3N0cnVjdCcsICdpbl9wb3J0X3QnLAorICAgICAgICAgICAnWDUwOV9TSUcnLCAnX19kYXJ3aW5fc3NpemVfdCcsICdfX2Rhcndpbl9zaWdzZXRfdCcsCisgICAgICAgICAgICd3YWl0JywgJ3VpbnRfZmFzdDE2X3QnLCAnTjEyYXNuMV90eXBlX3N0NERPTExBUl8xMUUnLAorICAgICAgICAgICAndWludF9sZWFzdDhfdCcsICdwdGhyZWFkX3J3bG9ja190JywgJ0FTTjFfSUE1U1RSSU5HJywKKyAgICAgICAgICAgJ2ZzZmlsY250X3QnLCAndWNvbnRleHQnLCAnX191aW50NjRfdCcsICd0aW1lc3BlYycsCisgICAgICAgICAgICd4NTA5X2NpbmZfc3QnLCAnQ09NUF9NRVRIT0QnLCAnTUQ1X0NUWCcsICdidWZfbWVtX3N0JywKKyAgICAgICAgICAgJ0FTTjFfRU5DT0RJTkdfc3QnLCAnUEJFUEFSQU0nLCAnWDUwOV9OQU1FX0VOVFJZJywKKyAgICAgICAgICAgJ19fZGFyd2luX3ZhX2xpc3QnLCAndWNvbnRleHRfdCcsICdsaGFzaF9zdCcsCisgICAgICAgICAgICdONHdhaXQzRE9MTEFSXzRFJywgJ19fZGFyd2luX3V1aWRfdCcsCisgICAgICAgICAgICdfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdCcsICdpZF90JywgJ0FTTjFfQklUX1NUUklORycsCisgICAgICAgICAgICd2YV9saXN0JywgJ19fZGFyd2luX3djaGFyX3QnLCAncHRocmVhZF9rZXlfdCcsCisgICAgICAgICAgICdwa2NzN19zaWduZXJfaW5mb19zdCcsICdBU04xX01FVEhPRCcsICdEU0FfU0lHJywgJ0RTQScsCisgICAgICAgICAgICdVSVRfTk9ORScsICdwdGhyZWFkX3QnLCAnX19kYXJ3aW5fdXNlY29uZHNfdCcsCisgICAgICAgICAgICd1aW50X2Zhc3Q4X3QnLCAnVUlfU1RSSU5HJywgJ0RFU19jYmxvY2snLAorICAgICAgICAgICAnX19kYXJ3aW5fbWNvbnRleHQ2NF90JywgJ3JsaW1fdCcsICdQRU1fRW5jb2RlX1NlYWxfc3QnLAorICAgICAgICAgICAnU0hBc3RhdGVfc3QnLCAndV9xdWFkX3QnLCAnb3BlbnNzbF9mcHRyJywKKyAgICAgICAgICAgJ19vcGFxdWVfcHRocmVhZF9yd2xvY2thdHRyX3QnLAorICAgICAgICAgICAnTjE4eDUwOV9hdHRyaWJ1dGVzX3N0NERPTExBUl8xM0UnLAorICAgICAgICAgICAnX19kYXJ3aW5fcHRocmVhZF9yd2xvY2tfdCcsICdkYWRkcl90JywgJ3VpX3N0cmluZ19zdCcsCisgICAgICAgICAgICd4NTA5X2ZpbGVfc3QnLCAnWDUwOV9yZXFfaW5mb19zdCcsICdpbnRfbGVhc3Q2NF90JywKKyAgICAgICAgICAgJ2V2cF9FbmNvZGVfQ3R4X3N0JywgJ1g1MDlfT0JKRUNUUycsICdDUllQVE9fRVhfREFUQScsCisgICAgICAgICAgICdfX2ludDhfdCcsICdBVVRIT1JJVFlfS0VZSURfc3QnLCAnX29wYXF1ZV9wdGhyZWFkX2F0dHJfdCcsCisgICAgICAgICAgICdzaWdzdGFjaycsICdFVlBfQ0lQSEVSX0NUWCcsICdYNTA5X2V4dGVuc2lvbl9zdCcsICdwaWRfdCcsCisgICAgICAgICAgICdSU0FfTUVUSE9EJywgJ1BFTV9VU0VSJywgJ3BlbV9yZWNpcF9zdCcsICdlbnZfbWRfY3R4X3N0JywKKyAgICAgICAgICAgJ3JjNV9rZXlfc3QnLCAndWlfc3QnLCAnWDUwOV9QVUJLRVknLCAndV9pbnQ4X3QnLAorICAgICAgICAgICAnQVNOMV9JVEVNX3N0JywgJ3BrY3M3X3JlY2lwX2luZm9fc3QnLCAnc3NsMl9zdGF0ZV9zdCcsCisgICAgICAgICAgICdvZmZfdCcsICdOMTBzc2xfY3R4X3N0NERPTExBUl8xOEUnLCAnY3J5cHRvX2V4X2RhdGFfc3QnLAorICAgICAgICAgICAndWlfbWV0aG9kX3N0JywgJ19fZGFyd2luX3B0aHJlYWRfcndsb2NrYXR0cl90JywKKyAgICAgICAgICAgJ0NSWVBUT19FWF9kdXAnLCAnX19kYXJ3aW5faW5vX3QnLCAnX19zRklMRScsCisgICAgICAgICAgICdPU1Vua25vd25CeXRlT3JkZXInLCAnQk5fTU9OVF9DVFgnLCAnQVNOMV9OVUxMJywgJ3RpbWVfdCcsCisgICAgICAgICAgICdDUllQVE9fRVhfbmV3JywgJ2FzbjFfdHlwZV9zdCcsICdDUllQVE9fRVhfREFUQV9GVU5DUycsCisgICAgICAgICAgICd1c2VyX3RpbWVfdCcsICdCSUdOVU0nLCAncHRocmVhZF9yd2xvY2thdHRyX3QnLAorICAgICAgICAgICAnQVNOMV9WQUxVRV9zdCcsICdESF9NRVRIT0QnLCAnX19kYXJ3aW5fb2ZmX3QnLAorICAgICAgICAgICAnX29wYXF1ZV9wdGhyZWFkX3QnLCAnYm5fYmxpbmRpbmdfc3QnLCAnUlNBJywgJ3NzaXplX3QnLAorICAgICAgICAgICAnbWNvbnRleHQ2NF90JywgJ3VzZXJfbG9uZ190JywgJ2ZzYmxrY250X3QnLCAnY2VydF9zdCcsCisgICAgICAgICAgICdfX2Rhcndpbl9wdGhyZWFkX2NvbmRhdHRyX3QnLCAnWDUwOV9QS0VZJywKKyAgICAgICAgICAgJ19fZGFyd2luX2lkX3QnLCAnX19kYXJ3aW5fbmxfaXRlbScsICdTU0wyX1NUQVRFJywgJ0ZJTEUnLAorICAgICAgICAgICAncHRocmVhZF9tdXRleGF0dHJfdCcsICdzaXplX3QnLAorICAgICAgICAgICAnX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUnLCAncGtjczdfaXNzdWVyX2FuZF9zZXJpYWxfc3QnLAorICAgICAgICAgICAnc2lndmFsJywgJ0NSWVBUT19NRU1fTEVBS19DQicsICdYNTA5X05BTUUnLCAnYmxrY250X3QnLAorICAgICAgICAgICAndWludF9sZWFzdDE2X3QnLCAnX19kYXJ3aW5fZGV2X3QnLCAnZXZwX2NpcGhlcl9pbmZvX3N0JywKKyAgICAgICAgICAgJ0JOX0JMSU5ESU5HJywgJ3NzbDNfc3RhdGVfc3QnLCAndWludF9sZWFzdDY0X3QnLAorICAgICAgICAgICAndXNlcl9hZGRyX3QnLCAnREVTX2tleV9zY2hlZHVsZScsICdSSVBFTUQxNjBfQ1RYJywKKyAgICAgICAgICAgJ3VfY2hhcicsICdYNTA5X2FsZ29yX3N0JywgJ3VpZF90JywgJ3Nlc3NfY2VydF9zdCcsCisgICAgICAgICAgICd1X2ludDY0X3QnLCAndV9pbnQxNl90JywgJ3NpZ3NldF90JywgJ19fZGFyd2luX3B0cmRpZmZfdCcsCisgICAgICAgICAgICdBU04xX0NUWCcsICdTVEFDSycsICdfX2ludDMyX3QnLCAnVUlfTUVUSE9EJywKKyAgICAgICAgICAgJ05FVFNDQVBFX1NQS0knLCAnVUlUX1BST01QVCcsICdzdF9DUllQVE9fRVhfREFUQV9JTVBMJywKKyAgICAgICAgICAgJ2Nhc3Rfa2V5X3N0JywgJ1g1MDlfSEFTSF9ESVJfQ1RYJywgJ3NpZ2V2ZW50JywKKyAgICAgICAgICAgJ3VzZXJfc3NpemVfdCcsICdjbG9ja190JywgJ2Flc19rZXlfc3QnLAorICAgICAgICAgICAnX19kYXJ3aW5fc29ja2xlbl90JywgJ19fZGFyd2luX2ludHB0cl90JywgJ2ludF9mYXN0NjRfdCcsCisgICAgICAgICAgICdhc24xX3N0cmluZ190YWJsZV9zdCcsICd1aW50X2Zhc3QzMl90JywKKyAgICAgICAgICAgJ0FTTjFfVklTSUJMRVNUUklORycsICdEU0FfU0lHX3N0JywgJ29ial9uYW1lX3N0JywKKyAgICAgICAgICAgJ1g1MDlfTE9PS1VQX01FVEhPRCcsICd1X2ludDMyX3QnLCAnRVZQX0NJUEhFUl9JTkZPJywKKyAgICAgICAgICAgJ19fZ251Y192YV9saXN0JywgJ0FFU19LRVknLCAnUEtDUzdfSVNTVUVSX0FORF9TRVJJQUwnLAorICAgICAgICAgICAnQk5fQ1RYJywgJ19fZGFyd2luX2Jsa2NudF90JywgJ2tleV90JywgJ1NIQV9DVFgnLAorICAgICAgICAgICAncGtjczdfc2lnbmVkX3N0JywgJ1NTTCcsICdOMTBwZW1fY3R4X3N0NERPTExBUl8xNkUnLAorICAgICAgICAgICAncHRocmVhZF9hdHRyX3QnLCAnRVZQX01EJywgJ3VpbnQnLCAnQVNOMV9CT09MRUFOJywKKyAgICAgICAgICAgJ2lub190JywgJ19fZGFyd2luX2Nsb2NrX3QnLCAnQVNOMV9PQ1RFVF9TVFJJTkcnLAorICAgICAgICAgICAnYXNuMV9jdHhfc3QnLCAnQklPX0ZfQlVGRkVSX0NUWCcsICdibl9tb250X2N0eF9zdCcsCisgICAgICAgICAgICdYNTA5X1JFUV9JTkZPJywgJ1BFTV9DVFgnLCAnc2lndmVjJywKKyAgICAgICAgICAgJ19fZGFyd2luX3B0aHJlYWRfbXV0ZXhhdHRyX3QnLCAneDUwOV9hdHRyaWJ1dGVzX3N0JywKKyAgICAgICAgICAgJ3N0YWNrX3QnLCAnX19kYXJ3aW5fbW9kZV90JywgJ19fbWJzdGF0ZV90JywKKyAgICAgICAgICAgJ2FzbjFfb2JqZWN0X3N0JywgJ0FTTjFfRU5DT0RJTkcnLCAnX191aW50OF90JywKKyAgICAgICAgICAgJ0xIQVNIX05PREUnLCAnUEtDUzdfU0lHTkVSX0lORk8nLCAnYXNuMV9tZXRob2Rfc3QnLAorICAgICAgICAgICAnc3RhY2tfc3QnLCAnYmlvX2luZm9fY2InLCAnZGl2X3QnLCAnVUlUX1ZFUklGWScsCisgICAgICAgICAgICdQQkVQQVJBTV9zdCcsICdONHdhaXQzRE9MTEFSXzNFJywgJ3F1YWRfdCcsICdfX3NpZ2luZm8nLAorICAgICAgICAgICAnX19kYXJ3aW5fbWJzdGF0ZV90JywgJ3JzYV9zdCcsICdBU04xX1VOSVZFUlNBTFNUUklORycsCisgICAgICAgICAgICd1aW50NjRfdCcsICdzc2xfY29tcF9zdCcsICdYNTA5X09CSkVDVCcsICdwdGhyZWFkX2NvbmRfdCcsCisgICAgICAgICAgICdESCcsICdfX2Rhcndpbl93Y3R5cGVfdCcsICdQS0NTN19FTlZFTE9QRScsICdBU04xX1RMQ19zdCcsCisgICAgICAgICAgICdzaWdfYXRvbWljX3QnLCAnQklPJywgJ25saW5rX3QnLCAnQlVGX01FTScsICdTU0wzX1JFQ09SRCcsCisgICAgICAgICAgICdiaW9fbWV0aG9kX3N0JywgJ3RpbWV2YWwnLCAnVUlfc3RyaW5nX3R5cGVzJywgJ0JJT19kdW1teScsCisgICAgICAgICAgICdzc2xfY3R4X3N0JywgJ05FVFNDQVBFX0NFUlRfU0VRVUVOQ0UnLAorICAgICAgICAgICAnQklUX1NUUklOR19CSVROQU1FX3N0JywgJ19fZGFyd2luX3B0aHJlYWRfYXR0cl90JywKKyAgICAgICAgICAgJ2ludDhfdCcsICdfX2Rhcndpbl93aW50X3QnLCAnT0JKX05BTUUnLAorICAgICAgICAgICAnUEtDUzhfUFJJVl9LRVlfSU5GTycsICdQQkUyUEFSQU1fc3QnLAorICAgICAgICAgICAnTEhBU0hfRE9BTExfRk5fVFlQRScsICd4NTA5X3N0JywgJ1g1MDlfVkFMJywgJ2Rldl90JywKKyAgICAgICAgICAgJ0FTTjFfVEVNUExBVEVfc3QnLCAnTUQ1c3RhdGVfc3QnLCAnX191aW50MTZfdCcsCisgICAgICAgICAgICdMSEFTSF9ET0FMTF9BUkdfRk5fVFlQRScsICdtZGMyX2N0eF9zdCcsICdTU0wzX1NUQVRFJywKKyAgICAgICAgICAgJ3NzbDNfYnVmZmVyX3N0JywgJ0FTTjFfSVRFTV9FWFAnLAorICAgICAgICAgICAnX29wYXF1ZV9wdGhyZWFkX2NvbmRhdHRyX3QnLCAnbW9kZV90JywgJ0FTTjFfVkFMVUUnLAorICAgICAgICAgICAncWFkZHJfdCcsICdfX2Rhcndpbl9naWRfdCcsICdFVlBfUEtFWScsICdDUllQVE9fRVhfZnJlZScsCisgICAgICAgICAgICdfb3NzbF9vbGRfZGVzX2NibG9jaycsICdYNTA5X0lORk8nLCAnYXNuMV9zdHJpbmdfc3QnLAorICAgICAgICAgICAnaW50cHRyX3QnLCAnVUlUX0lORk8nLCAnaW50X2Zhc3Q4X3QnLCAnc2lnYWx0c3RhY2snLAorICAgICAgICAgICAnZW52X21kX3N0JywgJ0xIQVNIJywgJ19fZGFyd2luX3Vjb250ZXh0X3QnLAorICAgICAgICAgICAnUEtDUzdfU0lHTl9FTlZFTE9QRScsICdfX2Rhcndpbl9tY29udGV4dF90JywgJ2N0X3J1bmVfdCcsCisgICAgICAgICAgICdNRDJfQ1RYJywgJ3B0aHJlYWRfb25jZV90JywgJ1NTTDNfQlVGRkVSJywgJ2ZkX21hc2snLAorICAgICAgICAgICAnQVNOMV9UWVBFJywgJ1BLQ1M3X1NJR05FRCcsICdzc2wzX3JlY29yZF9zdCcsICdCRl9LRVknLAorICAgICAgICAgICAnTUQ0c3RhdGVfc3QnLCAnTUQ0X0NUWCcsICdpbnQxNl90JywgJ1NTTF9DSVBIRVInLAorICAgICAgICAgICAncnVuZV90JywgJ1g1MDlfVFJVU1QnLCAnc2lnaW5mb190JywgJ1g1MDlfU1RPUkUnLAorICAgICAgICAgICAnX19zYnVmJywgJ1g1MDlfU1RPUkVfQ1RYJywgJ19fZGFyd2luX2Jsa3NpemVfdCcsICdsZGl2X3QnLAorICAgICAgICAgICAnQVNOMV9USU1FJywgJ1NTTF9NRVRIT0QnLCAnWDUwOV9MT09LVVAnLAorICAgICAgICAgICAnTmV0c2NhcGVfc3BraV9zdCcsICdQX1BJRCcsICdzaWdhY3Rpb24nLCAnc2lnX3QnLAorICAgICAgICAgICAnaG9zdGVudCcsICd4NTA5X2NlcnRfYXV4X3N0JywgJ19vcGFxdWVfcHRocmVhZF9jb25kX3QnLAorICAgICAgICAgICAnc2Vnc3pfdCcsICd1c2hvcnQnLCAnX19kYXJ3aW5fY3RfcnVuZV90JywgJ2ZkX3NldCcsCisgICAgICAgICAgICdCTl9SRUNQX0NUWCcsICd4NTA5X2xvb2t1cF9zdCcsICd1aW50MTZfdCcsICdwa2NzN19zdCcsCisgICAgICAgICAgICdhc24xX2hlYWRlcl9zdCcsICdfX2Rhcndpbl9wdGhyZWFkX2tleV90JywKKyAgICAgICAgICAgJ3g1MDlfdHJ1c3Rfc3QnLCAnX19kYXJ3aW5fcHRocmVhZF9oYW5kbGVyX3JlYycsICdpbnQzMl90JywKKyAgICAgICAgICAgJ1g1MDlfQ1JMX0lORk8nLCAnTjExZXZwX3BrZXlfc3Q0RE9MTEFSXzEyRScsICdNREMyX0NUWCcsCisgICAgICAgICAgICdOMjNfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdDRET0xMQVJfMTBFJywgJ0FTTjFfSEVBREVSJywKKyAgICAgICAgICAgJ1g1MDlfY3JsX2luZm9fc3QnLCAnTEhBU0hfSEFTSF9GTl9UWVBFJywKKyAgICAgICAgICAgJ19vcGFxdWVfcHRocmVhZF9tdXRleGF0dHJfdCcsICdzc2xfc3QnLAorICAgICAgICAgICAnTjhwa2NzN19zdDRET0xMQVJfMTVFJywgJ2V2cF9wa2V5X3N0JywKKyAgICAgICAgICAgJ3BrY3M3X3NpZ25lZGFuZGVudmVsb3BlZF9zdCcsICdfX2Rhcndpbl9tYWNoX3BvcnRfdCcsCisgICAgICAgICAgICdFVlBfUEJFX0tFWUdFTicsICdfb3BhcXVlX3B0aHJlYWRfbXV0ZXhfdCcsCisgICAgICAgICAgICdBU04xX1VUQ1RJTUUnLCAnbWNvbnRleHQnLCAnY3J5cHRvX2V4X2RhdGFfZnVuY19zdCcsCisgICAgICAgICAgICd1X2xvbmcnLCAnUEJLREYyUEFSQU1fc3QnLCAncmM0X2tleV9zdCcsICdEU0FfTUVUSE9EJywKKyAgICAgICAgICAgJ0VWUF9DSVBIRVInLCAnQklUX1NUUklOR19CSVROQU1FJywgJ1BLQ1M3X1JFQ0lQX0lORk8nLAorICAgICAgICAgICAnc3NsM19lbmNfbWV0aG9kJywgJ1g1MDlfQ0VSVF9BVVgnLCAndWludG1heF90JywKKyAgICAgICAgICAgJ2ludF9mYXN0MTZfdCcsICdSQzVfMzJfS0VZJywgJ3Vjb250ZXh0NjQnLCAnQVNOMV9JTlRFR0VSJywKKyAgICAgICAgICAgJ3Vfc2hvcnQnLCAnTjE0eDUwOV9vYmplY3Rfc3Q0RE9MTEFSXzE0RScsICdtY29udGV4dDY0JywKKyAgICAgICAgICAgJ1g1MDlfc2lnX3N0JywgJ0FTTjFfR0VORVJBTFNUUklORycsICdQS0NTNycsICdfX3NGSUxFWCcsCisgICAgICAgICAgICdYNTA5X25hbWVfZW50cnlfc3QnLCAnc3NsX3Nlc3Npb25fc3QnLCAnY2FkZHJfdCcsCisgICAgICAgICAgICdiaWdudW1fc3QnLCAnWDUwOV9DSU5GJywgJ19fZGFyd2luX3B0aHJlYWRfY29uZF90JywKKyAgICAgICAgICAgJ0FTTjFfVExDJywgJ1BLQ1M3X0VOQ1JZUFQnLCAnTkVUU0NBUEVfU1BLQUMnLAorICAgICAgICAgICAnTmV0c2NhcGVfc3BrYWNfc3QnLCAnaWR0eXBlX3QnLCAnVUlUX0VSUk9SJywKKyAgICAgICAgICAgJ3VpbnRfZmFzdDY0X3QnLCAnaW5fYWRkcl90JywgJ3B0aHJlYWRfbXV0ZXhfdCcsCisgICAgICAgICAgICdfX2ludDY0X3QnLCAnQVNOMV9CTVBTVFJJTkcnLCAndWludDMyX3QnLAorICAgICAgICAgICAnUEVNX0VOQ09ERV9TRUFMX0NUWCcsICdzdXNlY29uZHNfdCcsICdBU04xX09CSkVDVCcsCisgICAgICAgICAgICdYNTA5X3ZhbF9zdCcsICdwcml2YXRlX2tleV9zdCcsICdDUllQVE9fZHlubG9jaycsCisgICAgICAgICAgICdYNTA5X29iamVjdHNfc3QnLCAnQ1JZUFRPX0VYX0RBVEFfSU1QTCcsCisgICAgICAgICAgICdwdGhyZWFkX2NvbmRhdHRyX3QnLCAnUEtDUzdfRElHRVNUJywgJ3VpbnRfbGVhc3QzMl90JywKKyAgICAgICAgICAgJ0FTTjFfU1RSSU5HJywgJ19fdWludDMyX3QnLCAnUF9QR0lEJywgJ3JzYV9tZXRoX3N0JywKKyAgICAgICAgICAgJ1g1MDlfY3JsX3N0JywgJ1JDMl9LRVknLCAnX19kYXJ3aW5fZnNmaWxjbnRfdCcsCisgICAgICAgICAgICdYNTA5X3Jldm9rZWRfc3QnLCAnUEJFMlBBUkFNJywgJ2Jsa3NpemVfdCcsCisgICAgICAgICAgICdOZXRzY2FwZV9jZXJ0aWZpY2F0ZV9zZXF1ZW5jZScsICdzc2xfY2lwaGVyX3N0JywKKyAgICAgICAgICAgJ2JpZ251bV9jdHgnLCAncmVnaXN0ZXJfdCcsICdBU04xX1VURjhTVFJJTkcnLAorICAgICAgICAgICAncGtjczdfZW5jcnlwdGVkX3N0JywgJ1JDNF9LRVknLCAnX19kYXJ3aW5fdWNvbnRleHQ2NF90JywKKyAgICAgICAgICAgJ04xM3NzbDJfc3RhdGVfc3Q0RE9MTEFSXzE5RScsICdibl9yZWNwX2N0eF9zdCcsCisgICAgICAgICAgICdDQVNUX0tFWScsICdYNTA5X0FUVFJJQlVURScsICdfX2Rhcndpbl9zdXNlY29uZHNfdCcsCisgICAgICAgICAgICdfX3NpZ2FjdGlvbicsICd1c2VyX3Vsb25nX3QnLCAnc3lzY2FsbF9hcmdfdCcsCisgICAgICAgICAgICdldnBfY2lwaGVyX2N0eF9zdCcsICdYNTA5X0FMR09SJywgJ21jb250ZXh0X3QnLAorICAgICAgICAgICAnY29uc3RfREVTX2NibG9jaycsICdfX2Rhcndpbl9mc2Jsa2NudF90JywgJ2RzYV9zdCcsCisgICAgICAgICAgICdpbnRfbGVhc3Q4X3QnLCAnTUQyc3RhdGVfc3QnLCAnWDUwOV9FWFRFTlNJT04nLAorICAgICAgICAgICAnR0VOX1NFU1NJT05fQ0InLCAnaW50X2xlYXN0MTZfdCcsICdfX2Rhcndpbl93Y3RyYW5zX3QnLAorICAgICAgICAgICAnUEJLREYyUEFSQU0nLCAneDUwOV9sb29rdXBfbWV0aG9kX3N0JywgJ3BlbV9wYXNzd29yZF9jYicsCisgICAgICAgICAgICdYNTA5X2luZm9fc3QnLCAneDUwOV9zdG9yZV9zdCcsICdfX2Rhcndpbl9uYXR1cmFsX3QnLAorICAgICAgICAgICAnWDUwOV9wdWJrZXlfc3QnLCAncGtjczdfZGlnZXN0X3N0JywgJ19fZGFyd2luX3NpemVfdCcsCisgICAgICAgICAgICdBU04xX1NUUklOR19UQUJMRScsICdPU0xpdHRsZUVuZGlhbicsICdSSVBFTUQxNjBzdGF0ZV9zdCcsCisgICAgICAgICAgICdwa2NzN19lbnZlbG9wZWRfc3QnLCAnVUknLCAncHRyZGlmZl90JywgJ1g1MDlfUkVRJywKKyAgICAgICAgICAgJ0NSWVBUT19keW5sb2NrX3ZhbHVlJywgJ1g1MDlfcmVxX3N0JywgJ3g1MDlfc3RvcmVfY3R4X3N0JywKKyAgICAgICAgICAgJ04xM3NzbDNfc3RhdGVfc3Q0RE9MTEFSXzIwRScsICdsaGFzaF9ub2RlX3N0JywKKyAgICAgICAgICAgJ19fZGFyd2luX3B0aHJlYWRfbXV0ZXhfdCcsICdMSEFTSF9DT01QX0ZOX1RZUEUnLAorICAgICAgICAgICAnX19kYXJ3aW5fcnVuZV90JywgJ3JsaW1pdCcsICdfX2Rhcndpbl9wdGhyZWFkX29uY2VfdCcsCisgICAgICAgICAgICdPU0JpZ0VuZGlhbicsICd1aW50cHRyX3QnLCAnX19kYXJ3aW5fdWlkX3QnLCAndV9pbnQnLAorICAgICAgICAgICAnQVNOMV9UNjFTVFJJTkcnLCAnZ2lkX3QnLCAnc3NsX21ldGhvZF9zdCcsICdBU04xX0lURU0nLAorICAgICAgICAgICAnQVNOMV9FTlVNRVJBVEVEJywgJ19vcGFxdWVfcHRocmVhZF9yd2xvY2tfdCcsCisgICAgICAgICAgICdwa2NzOF9wcml2X2tleV9pbmZvX3N0JywgJ2ludG1heF90JywgJ3NpZ2NvbnRleHQnLAorICAgICAgICAgICAnWDUwOV9DUkwnLCAncmMyX2tleV9zdCcsICdlbmdpbmVfc3QnLCAneDUwOV9vYmplY3Rfc3QnLAorICAgICAgICAgICAnX29wYXF1ZV9wdGhyZWFkX29uY2VfdCcsICdERVNfa3MnLCAnU1NMX0NPTVAnLAorICAgICAgICAgICAnZHNhX21ldGhvZCcsICdpbnQ2NF90JywgJ2Jpb19zdCcsICdiZl9rZXlfc3QnLAorICAgICAgICAgICAnQVNOMV9HRU5FUkFMSVpFRFRJTUUnLCAnUEtDUzdfRU5DX0NPTlRFTlQnLAorICAgICAgICAgICAnX19kYXJ3aW5fcGlkX3QnLCAnbGxkaXZfdCcsICdjb21wX21ldGhvZF9zdCcsCisgICAgICAgICAgICdFVlBfTURfQ1RYJywgJ2V2cF9jaXBoZXJfc3QnLCAnWDUwOV9uYW1lX3N0JywKKyAgICAgICAgICAgJ3g1MDlfaGFzaF9kaXJfc3QnLCAnX19kYXJ3aW5fbWFjaF9wb3J0X25hbWVfdCcsCisgICAgICAgICAgICd1c2Vjb25kc190JywgJ3VzZXJfc2l6ZV90JywgJ1NTTF9TRVNTSU9OJywgJ3J1c2FnZScsCisgICAgICAgICAgICdzc2xfY3JvY2tfc3QnLCAnaW50X2xlYXN0MzJfdCcsICdfX3NpZ2FjdGlvbl91JywgJ2RoX3N0JywKKyAgICAgICAgICAgJ1BfQUxMJywgJ19fZGFyd2luX3N0YWNrX3QnLCAnTjZERVNfa3MzRE9MTEFSXzlFJywKKyAgICAgICAgICAgJ2NvbXBfY3R4X3N0JywgJ1g1MDlfQ0VSVF9GSUxFX0NUWCddCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9weTJfdGVzdF9ncmFtbWFyLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvcHkyX3Rlc3RfZ3JhbW1hci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE0MTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvcHkyX3Rlc3RfZ3JhbW1hci5weQpAQCAtMCwwICsxLDk3NCBAQAorIyBQeXRob24gdGVzdCBzZXQgLS0gcGFydCAxLCBncmFtbWFyLgorIyBUaGlzIGp1c3QgdGVzdHMgd2hldGhlciB0aGUgcGFyc2VyIGFjY2VwdHMgdGhlbSBhbGwuCisKKyMgTk9URTogV2hlbiB5b3UgcnVuIHRoaXMgdGVzdCBhcyBhIHNjcmlwdCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIHlvdQorIyBnZXQgd2FybmluZ3MgYWJvdXQgY2VydGFpbiBoZXgvb2N0IGNvbnN0YW50cy4gIFNpbmNlIHRob3NlIGFyZQorIyBpc3N1ZWQgYnkgdGhlIHBhcnNlciwgeW91IGNhbid0IHN1cHByZXNzIHRoZW0gYnkgYWRkaW5nIGEKKyMgZmlsdGVyd2FybmluZ3MoKSBjYWxsIHRvIHRoaXMgbW9kdWxlLiAgVGhlcmVmb3JlLCB0byBzaHV0IHVwIHRoZQorIyByZWdyZXNzaW9uIHRlc3QsIHRoZSBmaWx0ZXJ3YXJuaW5ncygpIGNhbGwgaGFzIGJlZW4gYWRkZWQgdG8KKyMgcmVncnRlc3QucHkuCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfc3ludGF4X2Vycm9yCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKKyMgdGVzdGluZyBpbXBvcnQgKgorZnJvbSBzeXMgaW1wb3J0ICoKKworY2xhc3MgVG9rZW5UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdEJhY2tzbGFzaChzZWxmKToKKyAgICAgICAgIyBCYWNrc2xhc2ggbWVhbnMgbGluZSBjb250aW51YXRpb246CisgICAgICAgIHggPSAxIFwKKyAgICAgICAgKyAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIDIsICdiYWNrc2xhc2ggZm9yIGxpbmUgY29udGludWF0aW9uJykKKworICAgICAgICAjIEJhY2tzbGFzaCBkb2VzIG5vdCBtZWFucyBjb250aW51YXRpb24gaW4gY29tbWVudHMgOlwKKyAgICAgICAgeCA9IDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgMCwgJ2JhY2tzbGFzaCBlbmRpbmcgY29tbWVudCcpCisKKyAgICBkZWYgdGVzdFBsYWluSW50ZWdlcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDB4ZmYsIDI1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMDM3NywgMjU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCAwMTc3Nzc3Nzc3NzcpCisgICAgICAgICMgIjB4IiBpcyBub3QgYSB2YWxpZCBsaXRlcmFsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiMHgiKQorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgbWF4aW50CisgICAgICAgIGlmIG1heGludCA9PSAyMTQ3NDgzNjQ3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoLTIxNDc0ODM2NDctMSwgLTAyMDAwMDAwMDAwMCkKKyAgICAgICAgICAgICMgWFhYIC0yMTQ3NDgzNjQ4CisgICAgICAgICAgICBzZWxmLmFzc2VydF8oMDM3Nzc3Nzc3Nzc3ID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygweGZmZmZmZmZmID4gMCkKKyAgICAgICAgICAgIGZvciBzIGluICcyMTQ3NDgzNjQ4JywgJzA0MDAwMDAwMDAwMCcsICcweDEwMDAwMDAwMCc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB4ID0gZXZhbChzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk92ZXJmbG93RXJyb3Igb24gaHVnZSBpbnRlZ2VyIGxpdGVyYWwgJXIiICUgcykKKyAgICAgICAgZWxpZiBtYXhpbnQgPT0gOTIyMzM3MjAzNjg1NDc3NTgwNzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKC05MjIzMzcyMDM2ODU0Nzc1ODA3LTEsIC0wMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyA+IDApCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oMHhmZmZmZmZmZmZmZmZmZmZmID4gMCkKKyAgICAgICAgICAgIGZvciBzIGluICc5MjIzMzcyMDM2ODU0Nzc1ODA4JywgJzAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywgXAorICAgICAgICAgICAgICAgICAgICAgJzB4MTAwMDAwMDAwMDAwMDAwMDAnOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgeCA9IGV2YWwocykKKyAgICAgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJPdmVyZmxvd0Vycm9yIG9uIGh1Z2UgaW50ZWdlciBsaXRlcmFsICVyIiAlIHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ1dlaXJkIG1heGludCB2YWx1ZSAlcicgJSBtYXhpbnQpCisKKyAgICBkZWYgdGVzdExvbmdJbnRlZ2VycyhzZWxmKToKKyAgICAgICAgeCA9IDBMCisgICAgICAgIHggPSAwbAorICAgICAgICB4ID0gMHhmZmZmZmZmZmZmZmZmZmZmTAorICAgICAgICB4ID0gMHhmZmZmZmZmZmZmZmZmZmZmbAorICAgICAgICB4ID0gMDc3Nzc3Nzc3Nzc3Nzc3Nzc3TAorICAgICAgICB4ID0gMDc3Nzc3Nzc3Nzc3Nzc3Nzc3bAorICAgICAgICB4ID0gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwTAorICAgICAgICB4ID0gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwbAorCisgICAgZGVmIHRlc3RGbG9hdHMoc2VsZik6CisgICAgICAgIHggPSAzLjE0CisgICAgICAgIHggPSAzMTQuCisgICAgICAgIHggPSAwLjMxNAorICAgICAgICAjIFhYWCB4ID0gMDAwLjMxNAorICAgICAgICB4ID0gLjMxNAorICAgICAgICB4ID0gM2UxNAorICAgICAgICB4ID0gM0UxNAorICAgICAgICB4ID0gM2UtMTQKKyAgICAgICAgeCA9IDNlKzE0CisgICAgICAgIHggPSAzLmUxNAorICAgICAgICB4ID0gLjNlMTQKKyAgICAgICAgeCA9IDMuMWU0CisKKyAgICBkZWYgdGVzdFN0cmluZ0xpdGVyYWxzKHNlbGYpOgorICAgICAgICB4ID0gJyc7IHkgPSAiIjsgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAwIGFuZCB4ID09IHkpCisgICAgICAgIHggPSAnXCcnOyB5ID0gIiciOyBzZWxmLmFzc2VydF8obGVuKHgpID09IDEgYW5kIHggPT0geSBhbmQgb3JkKHgpID09IDM5KQorICAgICAgICB4ID0gJyInOyB5ID0gIlwiIjsgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAxIGFuZCB4ID09IHkgYW5kIG9yZCh4KSA9PSAzNCkKKyAgICAgICAgeCA9ICJkb2Vzbid0IFwic2hyaW5rXCIgZG9lcyBpdCIKKyAgICAgICAgeSA9ICdkb2VzblwndCAic2hyaW5rIiBkb2VzIGl0JworICAgICAgICBzZWxmLmFzc2VydF8obGVuKHgpID09IDI0IGFuZCB4ID09IHkpCisgICAgICAgIHggPSAiZG9lcyBcInNocmlua1wiIGRvZXNuJ3QgaXQiCisgICAgICAgIHkgPSAnZG9lcyAic2hyaW5rIiBkb2VzblwndCBpdCcKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAyNCBhbmQgeCA9PSB5KQorICAgICAgICB4ID0gIiIiCitUaGUgInF1aWNrIgorYnJvd24gZm94CitqdW1wcyBvdmVyCit0aGUgJ2xhenknIGRvZy4KKyIiIgorICAgICAgICB5ID0gJ1xuVGhlICJxdWljayJcbmJyb3duIGZveFxuanVtcHMgb3ZlclxudGhlIFwnbGF6eVwnIGRvZy5cbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgeSkKKyAgICAgICAgeSA9ICcnJworVGhlICJxdWljayIKK2Jyb3duIGZveAoranVtcHMgb3ZlcgordGhlICdsYXp5JyBkb2cuCisnJycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgeSkKKyAgICAgICAgeSA9ICJcblwKK1RoZSBcInF1aWNrXCJcblwKK2Jyb3duIGZveFxuXAoranVtcHMgb3ZlclxuXAordGhlICdsYXp5JyBkb2cuXG5cCisiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIHkpCisgICAgICAgIHkgPSAnXG5cCitUaGUgXCJxdWlja1wiXG5cCiticm93biBmb3hcblwKK2p1bXBzIG92ZXJcblwKK3RoZSBcJ2xhenlcJyBkb2cuXG5cCisnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIHkpCisKKworY2xhc3MgR3JhbW1hclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICMgc2luZ2xlX2lucHV0OiBORVdMSU5FIHwgc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10IE5FV0xJTkUKKyAgICAjIFhYWCBjYW4ndCB0ZXN0IGluIGEgc2NyaXB0IC0tIHRoaXMgcnVsZSBpcyBvbmx5IHVzZWQgd2hlbiBpbnRlcmFjdGl2ZQorCisgICAgIyBmaWxlX2lucHV0OiAoTkVXTElORSB8IHN0bXQpKiBFTkRNQVJLRVIKKyAgICAjIEJlaW5nIHRlc3RlZCBhcyB0aGlzIHZlcnkgbW9tZW50IHRoaXMgdmVyeSBtb2R1bGUKKworICAgICMgZXhwcl9pbnB1dDogdGVzdGxpc3QgTkVXTElORQorICAgICMgWFhYIEhhcmQgdG8gdGVzdCAtLSB1c2VkIG9ubHkgaW4gY2FsbHMgdG8gaW5wdXQoKQorCisgICAgZGVmIHRlc3RFdmFsSW5wdXQoc2VsZik6CisgICAgICAgICMgdGVzdGxpc3QgRU5ETUFSS0VSCisgICAgICAgIHggPSBldmFsKCcxLCAwIG9yIDEnKQorCisgICAgZGVmIHRlc3RGdW5jZGVmKHNlbGYpOgorICAgICAgICAjIyMgJ2RlZicgTkFNRSBwYXJhbWV0ZXJzICc6JyBzdWl0ZQorICAgICAgICAjIyMgcGFyYW1ldGVyczogJygnIFt2YXJhcmdzbGlzdF0gJyknCisgICAgICAgICMjIyB2YXJhcmdzbGlzdDogKGZwZGVmIFsnPScgdGVzdF0gJywnKSogKCcqJyBOQU1FIFsnLCcgKCcqKid8JyonICcqJykgTkFNRV0KKyAgICAgICAgIyMjICAgICAgICAgICAgfCAoJyoqJ3wnKicgJyonKSBOQU1FKQorICAgICAgICAjIyMgICAgICAgICAgICB8IGZwZGVmIFsnPScgdGVzdF0gKCcsJyBmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10KKyAgICAgICAgIyMjIGZwZGVmOiBOQU1FIHwgJygnIGZwbGlzdCAnKScKKyAgICAgICAgIyMjIGZwbGlzdDogZnBkZWYgKCcsJyBmcGRlZikqIFsnLCddCisgICAgICAgICMjIyBhcmdsaXN0OiAoYXJndW1lbnQgJywnKSogKGFyZ3VtZW50IHwgKicgdGVzdCBbJywnICcqKicgdGVzdF0gfCAnKionIHRlc3QpCisgICAgICAgICMjIyBhcmd1bWVudDogW3Rlc3QgJz0nXSB0ZXN0ICAgIyBSZWFsbHkgW2tleXdvcmQgJz0nXSB0ZXN0CisgICAgICAgIGRlZiBmMSgpOiBwYXNzCisgICAgICAgIGYxKCkKKyAgICAgICAgZjEoKigpKQorICAgICAgICBmMSgqKCksICoqe30pCisgICAgICAgIGRlZiBmMihvbmVfYXJndW1lbnQpOiBwYXNzCisgICAgICAgIGRlZiBmMyh0d28sIGFyZ3VtZW50cyk6IHBhc3MKKyAgICAgICAgZGVmIGY0KHR3bywgKGNvbXBvdW5kLCAoYXJndW1lbnQsIGxpc3QpKSk6IHBhc3MKKyAgICAgICAgZGVmIGY1KChjb21wb3VuZCwgZmlyc3QpLCB0d28pOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYyLmZ1bmNfY29kZS5jb192YXJuYW1lcywgKCdvbmVfYXJndW1lbnQnLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYzLmZ1bmNfY29kZS5jb192YXJuYW1lcywgKCd0d28nLCAnYXJndW1lbnRzJykpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmNC5mdW5jX2NvZGUuY29fdmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAgKCd0d28nLCAnKGNvbXBvdW5kLCAoYXJndW1lbnQsIGxpc3QpKScsICdjb21wb3VuZCcsICdhcmd1bWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaXN0JywpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjUuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgICgnKGNvbXBvdW5kLCBmaXJzdCknLCAndHdvJywgJ2NvbXBvdW5kJywgJ2ZpcnN0JykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmNC5mdW5jX2NvZGUuY29fdmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAoJ3R3bycsICcuMScsICdjb21wb3VuZCcsICdhcmd1bWVudCcsICAnbGlzdCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjUuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgKCcuMCcsICd0d28nLCAnY29tcG91bmQnLCAnZmlyc3QnKSkKKyAgICAgICAgZGVmIGExKG9uZV9hcmcsKTogcGFzcworICAgICAgICBkZWYgYTIodHdvLCBhcmdzLCk6IHBhc3MKKyAgICAgICAgZGVmIHYwKCpyZXN0KTogcGFzcworICAgICAgICBkZWYgdjEoYSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGRlZiB2MihhLCBiLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZGVmIHYzKGEsIChiLCBjKSwgKnJlc3QpOiByZXR1cm4gYSwgYiwgYywgcmVzdAorCisgICAgICAgIGYxKCkKKyAgICAgICAgZjIoMSkKKyAgICAgICAgZjIoMSwpCisgICAgICAgIGYzKDEsIDIpCisgICAgICAgIGYzKDEsIDIsKQorICAgICAgICBmNCgxLCAoMiwgKDMsIDQpKSkKKyAgICAgICAgdjAoKQorICAgICAgICB2MCgxKQorICAgICAgICB2MCgxLCkKKyAgICAgICAgdjAoMSwyKQorICAgICAgICB2MCgxLDIsMyw0LDUsNiw3LDgsOSwwKQorICAgICAgICB2MSgxKQorICAgICAgICB2MSgxLCkKKyAgICAgICAgdjEoMSwyKQorICAgICAgICB2MSgxLDIsMykKKyAgICAgICAgdjEoMSwyLDMsNCw1LDYsNyw4LDksMCkKKyAgICAgICAgdjIoMSwyKQorICAgICAgICB2MigxLDIsMykKKyAgICAgICAgdjIoMSwyLDMsNCkKKyAgICAgICAgdjIoMSwyLDMsNCw1LDYsNyw4LDksMCkKKyAgICAgICAgdjMoMSwoMiwzKSkKKyAgICAgICAgdjMoMSwoMiwzKSw0KQorICAgICAgICB2MygxLCgyLDMpLDQsNSw2LDcsOCw5LDApCisKKyAgICAgICAgIyBjZXZhbCB1bnBhY2tzIHRoZSBmb3JtYWwgYXJndW1lbnRzIGludG8gdGhlIGZpcnN0IGFyZ2NvdW50IG5hbWVzOworICAgICAgICAjIHRodXMsIHRoZSBuYW1lcyBuZXN0ZWQgaW5zaWRlIHR1cGxlcyBtdXN0IGFwcGVhciBhZnRlciB0aGVzZSBuYW1lcy4KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHYzLmZ1bmNfY29kZS5jb192YXJuYW1lcywgKCdhJywgJyhiLCBjKScsICdyZXN0JywgJ2InLCAnYycpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModjMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ2EnLCAnLjEnLCAncmVzdCcsICdiJywgJ2MnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModjMoMSwgKDIsIDMpLCA0KSwgKDEsIDIsIDMsICg0LCkpKQorICAgICAgICBkZWYgZDAxKGE9MSk6IHBhc3MKKyAgICAgICAgZDAxKCkKKyAgICAgICAgZDAxKDEpCisgICAgICAgIGQwMSgqKDEsKSkKKyAgICAgICAgZDAxKCoqeydhJzoyfSkKKyAgICAgICAgZGVmIGQxMShhLCBiPTEpOiBwYXNzCisgICAgICAgIGQxMSgxKQorICAgICAgICBkMTEoMSwgMikKKyAgICAgICAgZDExKDEsICoqeydiJzoyfSkKKyAgICAgICAgZGVmIGQyMShhLCBiLCBjPTEpOiBwYXNzCisgICAgICAgIGQyMSgxLCAyKQorICAgICAgICBkMjEoMSwgMiwgMykKKyAgICAgICAgZDIxKCooMSwgMiwgMykpCisgICAgICAgIGQyMSgxLCAqKDIsIDMpKQorICAgICAgICBkMjEoMSwgMiwgKigzLCkpCisgICAgICAgIGQyMSgxLCAyLCAqKnsnYyc6M30pCisgICAgICAgIGRlZiBkMDIoYT0xLCBiPTIpOiBwYXNzCisgICAgICAgIGQwMigpCisgICAgICAgIGQwMigxKQorICAgICAgICBkMDIoMSwgMikKKyAgICAgICAgZDAyKCooMSwgMikpCisgICAgICAgIGQwMigxLCAqKDIsKSkKKyAgICAgICAgZDAyKDEsICoqeydiJzoyfSkKKyAgICAgICAgZDAyKCoqeydhJzogMSwgJ2InOiAyfSkKKyAgICAgICAgZGVmIGQxMihhLCBiPTEsIGM9Mik6IHBhc3MKKyAgICAgICAgZDEyKDEpCisgICAgICAgIGQxMigxLCAyKQorICAgICAgICBkMTIoMSwgMiwgMykKKyAgICAgICAgZGVmIGQyMihhLCBiLCBjPTEsIGQ9Mik6IHBhc3MKKyAgICAgICAgZDIyKDEsIDIpCisgICAgICAgIGQyMigxLCAyLCAzKQorICAgICAgICBkMjIoMSwgMiwgMywgNCkKKyAgICAgICAgZGVmIGQwMXYoYT0xLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDAxdigpCisgICAgICAgIGQwMXYoMSkKKyAgICAgICAgZDAxdigxLCAyKQorICAgICAgICBkMDF2KCooMSwgMiwgMywgNCkpCisgICAgICAgIGQwMXYoKigxLCkpCisgICAgICAgIGQwMXYoKip7J2EnOjJ9KQorICAgICAgICBkZWYgZDExdihhLCBiPTEsICpyZXN0KTogcGFzcworICAgICAgICBkMTF2KDEpCisgICAgICAgIGQxMXYoMSwgMikKKyAgICAgICAgZDExdigxLCAyLCAzKQorICAgICAgICBkZWYgZDIxdihhLCBiLCBjPTEsICpyZXN0KTogcGFzcworICAgICAgICBkMjF2KDEsIDIpCisgICAgICAgIGQyMXYoMSwgMiwgMykKKyAgICAgICAgZDIxdigxLCAyLCAzLCA0KQorICAgICAgICBkMjF2KCooMSwgMiwgMywgNCkpCisgICAgICAgIGQyMXYoMSwgMiwgKip7J2MnOiAzfSkKKyAgICAgICAgZGVmIGQwMnYoYT0xLCBiPTIsICpyZXN0KTogcGFzcworICAgICAgICBkMDJ2KCkKKyAgICAgICAgZDAydigxKQorICAgICAgICBkMDJ2KDEsIDIpCisgICAgICAgIGQwMnYoMSwgMiwgMykKKyAgICAgICAgZDAydigxLCAqKDIsIDMsIDQpKQorICAgICAgICBkMDJ2KCoqeydhJzogMSwgJ2InOiAyfSkKKyAgICAgICAgZGVmIGQxMnYoYSwgYj0xLCBjPTIsICpyZXN0KTogcGFzcworICAgICAgICBkMTJ2KDEpCisgICAgICAgIGQxMnYoMSwgMikKKyAgICAgICAgZDEydigxLCAyLCAzKQorICAgICAgICBkMTJ2KDEsIDIsIDMsIDQpCisgICAgICAgIGQxMnYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDEydigxLCAyLCAqKDMsIDQsIDUpKQorICAgICAgICBkMTJ2KDEsICooMiwpLCAqKnsnYyc6IDN9KQorICAgICAgICBkZWYgZDIydihhLCBiLCBjPTEsIGQ9MiwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQyMnYoMSwgMikKKyAgICAgICAgZDIydigxLCAyLCAzKQorICAgICAgICBkMjJ2KDEsIDIsIDMsIDQpCisgICAgICAgIGQyMnYoMSwgMiwgMywgNCwgNSkKKyAgICAgICAgZDIydigqKDEsIDIsIDMsIDQpKQorICAgICAgICBkMjJ2KDEsIDIsICooMywgNCwgNSkpCisgICAgICAgIGQyMnYoMSwgKigyLCAzKSwgKip7J2QnOiA0fSkKKyAgICAgICAgZGVmIGQzMXYoKHgpKTogcGFzcworICAgICAgICBkMzF2KDEpCisgICAgICAgIGRlZiBkMzJ2KCh4LCkpOiBwYXNzCisgICAgICAgIGQzMnYoKDEsKSkKKworICAgICAgICAjIGtleXdvcmQgYXJndW1lbnRzIGFmdGVyICphcmdsaXN0CisgICAgICAgIGRlZiBmKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICByZXR1cm4gYXJncywga3dhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYoMSwgeD0yLCAqWzMsIDRdLCB5PTUpLCAoKDEsIDMsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsneCc6MiwgJ3knOjV9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICJmKDEsICooMiwzKSwgNCkiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgImYoMSwgeD0yLCAqKDMsNCksIHg9NSkiKQorCisgICAgICAgICMgQ2hlY2sgYXN0IGVycm9ycyBpbiAqYXJncyBhbmQgKmt3YXJncworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImYoKmcoMT0yKSkiKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImYoKipnKDE9MikpIikKKworICAgIGRlZiB0ZXN0TGFtYmRlZihzZWxmKToKKyAgICAgICAgIyMjIGxhbWJkZWY6ICdsYW1iZGEnIFt2YXJhcmdzbGlzdF0gJzonIHRlc3QKKyAgICAgICAgbDEgPSBsYW1iZGEgOiAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGwxKCksIDApCisgICAgICAgIGwyID0gbGFtYmRhIDogYVtkXSAjIFhYWCBqdXN0IHRlc3RpbmcgdGhlIGV4cHJlc3Npb24KKyAgICAgICAgbDMgPSBsYW1iZGEgOiBbMiA8IHggZm9yIHggaW4gWy0xLCAzLCAwTF1dCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGwzKCksIFswLCAxLCAwXSkKKyAgICAgICAgbDQgPSBsYW1iZGEgeCA9IGxhbWJkYSB5ID0gbGFtYmRhIHo9MSA6IHogOiB5KCkgOiB4KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDQoKSwgMSkKKyAgICAgICAgbDUgPSBsYW1iZGEgeCwgeSwgej0yOiB4ICsgeSArIHoKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDUoMSwgMiksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGw1KDEsIDIsIDMpLCA2KQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImxhbWJkYSB4OiB4ID0gMiIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAibGFtYmRhIChOb25lLCk6IE5vbmUiKQorCisgICAgIyMjIHN0bXQ6IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdAorICAgICMgVGVzdGVkIGJlbG93CisKKyAgICBkZWYgdGVzdFNpbXBsZVN0bXQoc2VsZik6CisgICAgICAgICMjIyBzaW1wbGVfc3RtdDogc21hbGxfc3RtdCAoJzsnIHNtYWxsX3N0bXQpKiBbJzsnXQorICAgICAgICB4ID0gMTsgcGFzczsgZGVsIHgKKyAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgIyB2ZXJpZnkgc3RhdGVtZW50cyB0aGF0IGVuZCB3aXRoIHNlbWktY29sb25zCisgICAgICAgICAgICB4ID0gMTsgcGFzczsgZGVsIHg7CisgICAgICAgIGZvbygpCisKKyAgICAjIyMgc21hbGxfc3RtdDogZXhwcl9zdG10IHwgcHJpbnRfc3RtdCAgfCBwYXNzX3N0bXQgfCBkZWxfc3RtdCB8IGZsb3dfc3RtdCB8IGltcG9ydF9zdG10IHwgZ2xvYmFsX3N0bXQgfCBhY2Nlc3Nfc3RtdCB8IGV4ZWNfc3RtdAorICAgICMgVGVzdGVkIGJlbG93CisKKyAgICBkZWYgdGVzdEV4cHJTdG10KHNlbGYpOgorICAgICAgICAjIChleHBybGlzdCAnPScpKiBleHBybGlzdAorICAgICAgICAxCisgICAgICAgIDEsIDIsIDMKKyAgICAgICAgeCA9IDEKKyAgICAgICAgeCA9IDEsIDIsIDMKKyAgICAgICAgeCA9IHkgPSB6ID0gMSwgMiwgMworICAgICAgICB4LCB5LCB6ID0gMSwgMiwgMworICAgICAgICBhYmMgPSBhLCBiLCBjID0geCwgeSwgeiA9IHh5eiA9IDEsIDIsICgzLCA0KQorCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAieCArIDEgPSAxIikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJhICsgMSA9IGIgKyAyIikKKworICAgIGRlZiB0ZXN0UHJpbnRTdG10KHNlbGYpOgorICAgICAgICAjICdwcmludCcgKHRlc3QgJywnKSogW3Rlc3RdCisgICAgICAgIGltcG9ydCBTdHJpbmdJTworCisgICAgICAgICMgQ2FuJ3QgdGVzdCBwcmludGluZyB0byByZWFsIHN0ZG91dCB3aXRob3V0IGNvbXBhcmluZyBvdXRwdXQKKyAgICAgICAgIyB3aGljaCBpcyBub3QgYXZhaWxhYmxlIGluIHVuaXR0ZXN0LgorICAgICAgICBzYXZlX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc3lzLnN0ZG91dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKworICAgICAgICBwcmludCAxLCAyLCAzCisgICAgICAgIHByaW50IDEsIDIsIDMsCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50IDAgb3IgMSwgMCBvciAxLAorICAgICAgICBwcmludCAwIG9yIDEKKworICAgICAgICAjICdwcmludCcgJz4+JyB0ZXN0ICcsJworICAgICAgICBwcmludCA+PiBzeXMuc3Rkb3V0LCAxLCAyLCAzCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRvdXQsIDEsIDIsIDMsCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRvdXQKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dCwgMCBvciAxLCAwIG9yIDEsCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRvdXQsIDAgb3IgMQorCisgICAgICAgICMgdGVzdCBwcmludGluZyB0byBhbiBpbnN0YW5jZQorICAgICAgICBjbGFzcyBHdWxwOgorICAgICAgICAgICAgZGVmIHdyaXRlKHNlbGYsIG1zZyk6IHBhc3MKKworICAgICAgICBndWxwID0gR3VscCgpCisgICAgICAgIHByaW50ID4+IGd1bHAsIDEsIDIsIDMKKyAgICAgICAgcHJpbnQgPj4gZ3VscCwgMSwgMiwgMywKKyAgICAgICAgcHJpbnQgPj4gZ3VscAorICAgICAgICBwcmludCA+PiBndWxwLCAwIG9yIDEsIDAgb3IgMSwKKyAgICAgICAgcHJpbnQgPj4gZ3VscCwgMCBvciAxCisKKyAgICAgICAgIyB0ZXN0IHByaW50ID4+IE5vbmUKKyAgICAgICAgZGVmIGRyaXZlcigpOgorICAgICAgICAgICAgb2xkc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IEd1bHAoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRlbGxtZShHdWxwKCkpCisgICAgICAgICAgICAgICAgdGVsbG1lKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IG9sZHN0ZG91dAorCisgICAgICAgICMgd2Ugc2hvdWxkIHNlZSB0aGlzIG9uY2UKKyAgICAgICAgZGVmIHRlbGxtZShmaWxlPXN5cy5zdGRvdXQpOgorICAgICAgICAgICAgcHJpbnQgPj4gZmlsZSwgJ2hlbGxvIHdvcmxkJworCisgICAgICAgIGRyaXZlcigpCisKKyAgICAgICAgIyB3ZSBzaG91bGQgbm90IHNlZSB0aGlzIGF0IGFsbAorICAgICAgICBkZWYgdGVsbG1lKGZpbGU9Tm9uZSk6CisgICAgICAgICAgICBwcmludCA+PiBmaWxlLCAnZ29vZGJ5ZSB1bml2ZXJzZScKKworICAgICAgICBkcml2ZXIoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLnN0ZG91dC5nZXR2YWx1ZSgpLCAnJydcCisxIDIgMworMSAyIDMKKzEgMSAxCisxIDIgMworMSAyIDMKKzEgMSAxCitoZWxsbyB3b3JsZAorJycnKQorICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKKworICAgICAgICAjIHN5bnRheCBlcnJvcnMKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICdwcmludCAsJykKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICdwcmludCA+PiB4LCcpCisKKyAgICBkZWYgdGVzdERlbFN0bXQoc2VsZik6CisgICAgICAgICMgJ2RlbCcgZXhwcmxpc3QKKyAgICAgICAgYWJjID0gWzEsMiwzXQorICAgICAgICB4LCB5LCB6ID0gYWJjCisgICAgICAgIHh5eiA9IHgsIHksIHoKKworICAgICAgICBkZWwgYWJjCisgICAgICAgIGRlbCB4LCB5LCAoeiwgeHl6KQorCisgICAgZGVmIHRlc3RQYXNzU3RtdChzZWxmKToKKyAgICAgICAgIyAncGFzcycKKyAgICAgICAgcGFzcworCisgICAgIyBmbG93X3N0bXQ6IGJyZWFrX3N0bXQgfCBjb250aW51ZV9zdG10IHwgcmV0dXJuX3N0bXQgfCByYWlzZV9zdG10CisgICAgIyBUZXN0ZWQgYmVsb3cKKworICAgIGRlZiB0ZXN0QnJlYWtTdG10KHNlbGYpOgorICAgICAgICAjICdicmVhaycKKyAgICAgICAgd2hpbGUgMTogYnJlYWsKKworICAgIGRlZiB0ZXN0Q29udGludWVTdG10KHNlbGYpOgorICAgICAgICAjICdjb250aW51ZScKKyAgICAgICAgaSA9IDEKKyAgICAgICAgd2hpbGUgaTogaSA9IDA7IGNvbnRpbnVlCisKKyAgICAgICAgbXNnID0gIiIKKyAgICAgICAgd2hpbGUgbm90IG1zZzoKKyAgICAgICAgICAgIG1zZyA9ICJvayIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIG1zZyA9ICJjb250aW51ZSBmYWlsZWQgdG8gY29udGludWUgaW5zaWRlIHRyeSIKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBtc2cgPSAiY29udGludWUgaW5zaWRlIHRyeSBjYWxsZWQgZXhjZXB0IGJsb2NrIgorICAgICAgICBpZiBtc2cgIT0gIm9rIjoKKyAgICAgICAgICAgIHNlbGYuZmFpbChtc2cpCisKKyAgICAgICAgbXNnID0gIiIKKyAgICAgICAgd2hpbGUgbm90IG1zZzoKKyAgICAgICAgICAgIG1zZyA9ICJmaW5hbGx5IGJsb2NrIG5vdCBjYWxsZWQiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgbXNnID0gIm9rIgorICAgICAgICBpZiBtc2cgIT0gIm9rIjoKKyAgICAgICAgICAgIHNlbGYuZmFpbChtc2cpCisKKyAgICBkZWYgdGVzdF9icmVha19jb250aW51ZV9sb29wKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdCB3YXJyYW50cyBhbiBleHBsYW5hdGlvbi4gSXQgaXMgYSB0ZXN0IHNwZWNpZmljYWxseSBmb3IgU0YgYnVncworICAgICAgICAjICM0NjMzNTkgYW5kICM0NjI5MzcuIFRoZSBidWcgaXMgdGhhdCBhICdicmVhaycgc3RhdGVtZW50IGV4ZWN1dGVkIG9yCisgICAgICAgICMgZXhjZXB0aW9uIHJhaXNlZCBpbnNpZGUgYSB0cnkvZXhjZXB0IGluc2lkZSBhIGxvb3AsICphZnRlciogYSBjb250aW51ZQorICAgICAgICAjIHN0YXRlbWVudCBoYXMgYmVlbiBleGVjdXRlZCBpbiB0aGF0IGxvb3AsIHdpbGwgY2F1c2UgdGhlIHdyb25nIG51bWJlciBvZgorICAgICAgICAjIGFyZ3VtZW50cyB0byBiZSBwb3BwZWQgb2ZmIHRoZSBzdGFjayBhbmQgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgcmVzZXQgdG8KKyAgICAgICAgIyBhIHZlcnkgc21hbGwgbnVtYmVyICh1c3VhbGx5IDAuKSBCZWNhdXNlIG9mIHRoaXMsIHRoZSBmb2xsb3dpbmcgdGVzdAorICAgICAgICAjICptdXN0KiB3cml0dGVuIGFzIGEgZnVuY3Rpb24sIGFuZCB0aGUgdHJhY2tpbmcgdmFycyAqbXVzdCogYmUgZnVuY3Rpb24KKyAgICAgICAgIyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcy4gT3RoZXJ3aXNlLCB0aGUgdGVzdCB3aWxsIGxvb3AgYW5kIGxvb3AuCisKKyAgICAgICAgZGVmIHRlc3RfaW5uZXIoZXh0cmFfYnVybmluZ19vaWwgPSAxLCBjb3VudD0wKToKKyAgICAgICAgICAgIGJpZ19oaXBwbyA9IDIKKyAgICAgICAgICAgIHdoaWxlIGJpZ19oaXBwbzoKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBleHRyYV9idXJuaW5nX29pbCBhbmQgYmlnX2hpcHBvID09IDE6CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9idXJuaW5nX29pbCAtPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBiaWdfaGlwcG8gLT0gMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGlmIGNvdW50ID4gMiBvciBiaWdfaGlwcG8gPD4gMToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImNvbnRpbnVlIHRoZW4gYnJlYWsgaW4gdHJ5L2V4Y2VwdCBpbiBsb29wIGJyb2tlbiEiKQorICAgICAgICB0ZXN0X2lubmVyKCkKKworICAgIGRlZiB0ZXN0UmV0dXJuKHNlbGYpOgorICAgICAgICAjICdyZXR1cm4nIFt0ZXN0bGlzdF0KKyAgICAgICAgZGVmIGcxKCk6IHJldHVybgorICAgICAgICBkZWYgZzIoKTogcmV0dXJuIDEKKyAgICAgICAgZzEoKQorICAgICAgICB4ID0gZzIoKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImNsYXNzIGZvbzpyZXR1cm4gMSIpCisKKyAgICBkZWYgdGVzdFlpZWxkKHNlbGYpOgorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImNsYXNzIGZvbzp5aWVsZCAxIikKKworICAgIGRlZiB0ZXN0UmFpc2Uoc2VsZik6CisgICAgICAgICMgJ3JhaXNlJyB0ZXN0IFsnLCcgdGVzdF0KKyAgICAgICAgdHJ5OiByYWlzZSBSdW50aW1lRXJyb3IsICdqdXN0IHRlc3RpbmcnCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6IHBhc3MKKyAgICAgICAgdHJ5OiByYWlzZSBLZXlib2FyZEludGVycnVwdAorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6IHBhc3MKKworICAgIGRlZiB0ZXN0SW1wb3J0KHNlbGYpOgorICAgICAgICAjICdpbXBvcnQnIGRvdHRlZF9hc19uYW1lcworICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGltcG9ydCB0aW1lLCBzeXMKKyAgICAgICAgIyAnZnJvbScgZG90dGVkX25hbWUgJ2ltcG9ydCcgKCcqJyB8ICcoJyBpbXBvcnRfYXNfbmFtZXMgJyknIHwgaW1wb3J0X2FzX25hbWVzKQorICAgICAgICBmcm9tIHRpbWUgaW1wb3J0IHRpbWUKKyAgICAgICAgZnJvbSB0aW1lIGltcG9ydCAodGltZSkKKyAgICAgICAgIyBub3QgdGVzdGFibGUgaW5zaWRlIGEgZnVuY3Rpb24sIGJ1dCBhbHJlYWR5IGRvbmUgYXQgdG9wIG9mIHRoZSBtb2R1bGUKKyAgICAgICAgIyBmcm9tIHN5cyBpbXBvcnQgKgorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgcGF0aCwgYXJndgorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgKHBhdGgsIGFyZ3YpCisgICAgICAgIGZyb20gc3lzIGltcG9ydCAocGF0aCwgYXJndiwpCisKKyAgICBkZWYgdGVzdEdsb2JhbChzZWxmKToKKyAgICAgICAgIyAnZ2xvYmFsJyBOQU1FICgnLCcgTkFNRSkqCisgICAgICAgIGdsb2JhbCBhCisgICAgICAgIGdsb2JhbCBhLCBiCisgICAgICAgIGdsb2JhbCBvbmUsIHR3bywgdGhyZWUsIGZvdXIsIGZpdmUsIHNpeCwgc2V2ZW4sIGVpZ2h0LCBuaW5lLCB0ZW4KKworICAgIGRlZiB0ZXN0RXhlYyhzZWxmKToKKyAgICAgICAgIyAnZXhlYycgZXhwciBbJ2luJyBleHByIFsnLCcgZXhwcl1dCisgICAgICAgIHogPSBOb25lCisgICAgICAgIGRlbCB6CisgICAgICAgIGV4ZWMgJ3o9MSsxXG4nCisgICAgICAgIGlmIHogIT0gMjogc2VsZi5mYWlsKCdleGVjIFwnej0xKzFcJ1xcbicpCisgICAgICAgIGRlbCB6CisgICAgICAgIGV4ZWMgJ3o9MSsxJworICAgICAgICBpZiB6ICE9IDI6IHNlbGYuZmFpbCgnZXhlYyBcJ3o9MSsxXCcnKQorICAgICAgICB6ID0gTm9uZQorICAgICAgICBkZWwgegorICAgICAgICBpbXBvcnQgdHlwZXMKKyAgICAgICAgaWYgaGFzYXR0cih0eXBlcywgIlVuaWNvZGVUeXBlIik6CisgICAgICAgICAgICBleGVjIHIiIiJpZiAxOgorICAgICAgICAgICAgZXhlYyB1J3o9MSsxXG4nCisgICAgICAgICAgICBpZiB6ICE9IDI6IHNlbGYuZmFpbCgnZXhlYyB1XCd6PTErMVwnXFxuJykKKyAgICAgICAgICAgIGRlbCB6CisgICAgICAgICAgICBleGVjIHUnej0xKzEnCisgICAgICAgICAgICBpZiB6ICE9IDI6IHNlbGYuZmFpbCgnZXhlYyB1XCd6PTErMVwnJykiIiIKKyAgICAgICAgZyA9IHt9CisgICAgICAgIGV4ZWMgJ3ogPSAxJyBpbiBnCisgICAgICAgIGlmIGcuaGFzX2tleSgnX19idWlsdGluc19fJyk6IGRlbCBnWydfX2J1aWx0aW5zX18nXQorICAgICAgICBpZiBnICE9IHsneic6IDF9OiBzZWxmLmZhaWwoJ2V4ZWMgXCd6ID0gMVwnIGluIGcnKQorICAgICAgICBnID0ge30KKyAgICAgICAgbCA9IHt9CisKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiZ2xvYmFsIHN0YXRlbWVudCIsIG1vZHVsZT0iPHN0cmluZz4iKQorICAgICAgICBleGVjICdnbG9iYWwgYTsgYSA9IDE7IGIgPSAyJyBpbiBnLCBsCisgICAgICAgIGlmIGcuaGFzX2tleSgnX19idWlsdGluc19fJyk6IGRlbCBnWydfX2J1aWx0aW5zX18nXQorICAgICAgICBpZiBsLmhhc19rZXkoJ19fYnVpbHRpbnNfXycpOiBkZWwgbFsnX19idWlsdGluc19fJ10KKyAgICAgICAgaWYgKGcsIGwpICE9ICh7J2EnOjF9LCB7J2InOjJ9KToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnZXhlYyAuLi4gaW4gZyAoJXMpLCBsICglcyknICUoZyxsKSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0KHNlbGYpOgorICAgICAgICAjIGFzc2VydF9zdG10OiAnYXNzZXJ0JyB0ZXN0IFsnLCcgdGVzdF0KKyAgICAgICAgYXNzZXJ0IDEKKyAgICAgICAgYXNzZXJ0IDEsIDEKKyAgICAgICAgYXNzZXJ0IGxhbWJkYSB4OngKKyAgICAgICAgYXNzZXJ0IDEsIGxhbWJkYSB4OngrMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhc3NlcnQgMCwgIm1zZyIKKyAgICAgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZS5hcmdzWzBdLCAibXNnIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkFzc2VydGlvbkVycm9yIG5vdCByYWlzZWQgYnkgYXNzZXJ0IDAiKQorCisgICAgIyMjIGNvbXBvdW5kX3N0bXQ6IGlmX3N0bXQgfCB3aGlsZV9zdG10IHwgZm9yX3N0bXQgfCB0cnlfc3RtdCB8IGZ1bmNkZWYgfCBjbGFzc2RlZgorICAgICMgVGVzdGVkIGJlbG93CisKKyAgICBkZWYgdGVzdElmKHNlbGYpOgorICAgICAgICAjICdpZicgdGVzdCAnOicgc3VpdGUgKCdlbGlmJyB0ZXN0ICc6JyBzdWl0ZSkqIFsnZWxzZScgJzonIHN1aXRlXQorICAgICAgICBpZiAxOiBwYXNzCisgICAgICAgIGlmIDE6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworICAgICAgICBpZiAwOiBwYXNzCisgICAgICAgIGVsaWYgMDogcGFzcworICAgICAgICBpZiAwOiBwYXNzCisgICAgICAgIGVsaWYgMDogcGFzcworICAgICAgICBlbGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKKworICAgIGRlZiB0ZXN0V2hpbGUoc2VsZik6CisgICAgICAgICMgJ3doaWxlJyB0ZXN0ICc6JyBzdWl0ZSBbJ2Vsc2UnICc6JyBzdWl0ZV0KKyAgICAgICAgd2hpbGUgMDogcGFzcworICAgICAgICB3aGlsZSAwOiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKKworICAgICAgICAjIElzc3VlMTkyMDogIndoaWxlIDAiIGlzIG9wdGltaXplZCBhd2F5LAorICAgICAgICAjIGVuc3VyZSB0aGF0IHRoZSAiZWxzZSIgY2xhdXNlIGlzIHN0aWxsIHByZXNlbnQuCisgICAgICAgIHggPSAwCisgICAgICAgIHdoaWxlIDA6CisgICAgICAgICAgICB4ID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeCA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgMikKKworICAgIGRlZiB0ZXN0Rm9yKHNlbGYpOgorICAgICAgICAjICdmb3InIGV4cHJsaXN0ICdpbicgZXhwcmxpc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXQorICAgICAgICBmb3IgaSBpbiAxLCAyLCAzOiBwYXNzCisgICAgICAgIGZvciBpLCBqLCBrIGluICgpOiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKKyAgICAgICAgY2xhc3MgU3F1YXJlczoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXgpOgorICAgICAgICAgICAgICAgIHNlbGYubWF4ID0gbWF4CisgICAgICAgICAgICAgICAgc2VsZi5zb2ZhciA9IFtdCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIGxlbihzZWxmLnNvZmFyKQorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIGlmIG5vdCAwIDw9IGkgPCBzZWxmLm1heDogcmFpc2UgSW5kZXhFcnJvcgorICAgICAgICAgICAgICAgIG4gPSBsZW4oc2VsZi5zb2ZhcikKKyAgICAgICAgICAgICAgICB3aGlsZSBuIDw9IGk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc29mYXIuYXBwZW5kKG4qbikKKyAgICAgICAgICAgICAgICAgICAgbiA9IG4rMQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNvZmFyW2ldCisgICAgICAgIG4gPSAwCisgICAgICAgIGZvciB4IGluIFNxdWFyZXMoMTApOiBuID0gbit4CisgICAgICAgIGlmIG4gIT0gMjg1OgorICAgICAgICAgICAgc2VsZi5mYWlsKCdmb3Igb3ZlciBncm93aW5nIHNlcXVlbmNlJykKKworICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgeCwgaW4gWygxLCksICgyLCksICgzLCldOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWzEsIDIsIDNdKQorCisgICAgZGVmIHRlc3RUcnkoc2VsZik6CisgICAgICAgICMjIyB0cnlfc3RtdDogJ3RyeScgJzonIHN1aXRlIChleGNlcHRfY2xhdXNlICc6JyBzdWl0ZSkrIFsnZWxzZScgJzonIHN1aXRlXQorICAgICAgICAjIyMgICAgICAgICB8ICd0cnknICc6JyBzdWl0ZSAnZmluYWxseScgJzonIHN1aXRlCisgICAgICAgICMjIyBleGNlcHRfY2xhdXNlOiAnZXhjZXB0JyBbZXhwciBbKCdhcycgfCAnLCcpIGV4cHJdXQorICAgICAgICB0cnk6CisgICAgICAgICAgICAxLzAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6IDEvMAorICAgICAgICBleGNlcHQgRU9GRXJyb3I6IHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBtc2c6IHBhc3MKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvciwgbXNnOiBwYXNzCisgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisgICAgICAgIHRyeTogMS8wCisgICAgICAgIGV4Y2VwdCAoRU9GRXJyb3IsIFR5cGVFcnJvciwgWmVyb0RpdmlzaW9uRXJyb3IpOiBwYXNzCisgICAgICAgIHRyeTogMS8wCisgICAgICAgIGV4Y2VwdCAoRU9GRXJyb3IsIFR5cGVFcnJvciwgWmVyb0RpdmlzaW9uRXJyb3IpLCBtc2c6IHBhc3MKKyAgICAgICAgdHJ5OiBwYXNzCisgICAgICAgIGZpbmFsbHk6IHBhc3MKKworICAgIGRlZiB0ZXN0U3VpdGUoc2VsZik6CisgICAgICAgICMgc2ltcGxlX3N0bXQgfCBORVdMSU5FIElOREVOVCBORVdMSU5FKiAoc3RtdCBORVdMSU5FKikrIERFREVOVAorICAgICAgICBpZiAxOiBwYXNzCisgICAgICAgIGlmIDE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIDE6CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjCisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjCisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjCisKKyAgICBkZWYgdGVzdFRlc3Qoc2VsZik6CisgICAgICAgICMjIyBhbmRfdGVzdCAoJ29yJyBhbmRfdGVzdCkqCisgICAgICAgICMjIyBhbmRfdGVzdDogbm90X3Rlc3QgKCdhbmQnIG5vdF90ZXN0KSoKKyAgICAgICAgIyMjIG5vdF90ZXN0OiAnbm90JyBub3RfdGVzdCB8IGNvbXBhcmlzb24KKyAgICAgICAgaWYgbm90IDE6IHBhc3MKKyAgICAgICAgaWYgMSBhbmQgMTogcGFzcworICAgICAgICBpZiAxIG9yIDE6IHBhc3MKKyAgICAgICAgaWYgbm90IG5vdCBub3QgMTogcGFzcworICAgICAgICBpZiBub3QgMSBhbmQgMSBhbmQgMTogcGFzcworICAgICAgICBpZiAxIGFuZCAxIG9yIDEgYW5kIDEgYW5kIDEgb3Igbm90IDEgYW5kIDE6IHBhc3MKKworICAgIGRlZiB0ZXN0Q29tcGFyaXNvbihzZWxmKToKKyAgICAgICAgIyMjIGNvbXBhcmlzb246IGV4cHIgKGNvbXBfb3AgZXhwcikqCisgICAgICAgICMjIyBjb21wX29wOiAnPCd8Jz4nfCc9PSd8Jz49J3wnPD0nfCc8Pid8JyE9J3wnaW4nfCdub3QnICdpbid8J2lzJ3wnaXMnICdub3QnCisgICAgICAgIGlmIDE6IHBhc3MKKyAgICAgICAgeCA9ICgxID09IDEpCisgICAgICAgIGlmIDEgPT0gMTogcGFzcworICAgICAgICBpZiAxICE9IDE6IHBhc3MKKyAgICAgICAgaWYgMSA8PiAxOiBwYXNzCisgICAgICAgIGlmIDEgPCAxOiBwYXNzCisgICAgICAgIGlmIDEgPiAxOiBwYXNzCisgICAgICAgIGlmIDEgPD0gMTogcGFzcworICAgICAgICBpZiAxID49IDE6IHBhc3MKKyAgICAgICAgaWYgMSBpcyAxOiBwYXNzCisgICAgICAgIGlmIDEgaXMgbm90IDE6IHBhc3MKKyAgICAgICAgaWYgMSBpbiAoKTogcGFzcworICAgICAgICBpZiAxIG5vdCBpbiAoKTogcGFzcworICAgICAgICBpZiAxIDwgMSA+IDEgPT0gMSA+PSAxIDw9IDEgPD4gMSAhPSAxIGluIDEgbm90IGluIDEgaXMgMSBpcyBub3QgMTogcGFzcworCisgICAgZGVmIHRlc3RCaW5hcnlNYXNrT3BzKHNlbGYpOgorICAgICAgICB4ID0gMSAmIDEKKyAgICAgICAgeCA9IDEgXiAxCisgICAgICAgIHggPSAxIHwgMQorCisgICAgZGVmIHRlc3RTaGlmdE9wcyhzZWxmKToKKyAgICAgICAgeCA9IDEgPDwgMQorICAgICAgICB4ID0gMSA+PiAxCisgICAgICAgIHggPSAxIDw8IDEgPj4gMQorCisgICAgZGVmIHRlc3RBZGRpdGl2ZU9wcyhzZWxmKToKKyAgICAgICAgeCA9IDEKKyAgICAgICAgeCA9IDEgKyAxCisgICAgICAgIHggPSAxIC0gMSAtIDEKKyAgICAgICAgeCA9IDEgLSAxICsgMSAtIDEgKyAxCisKKyAgICBkZWYgdGVzdE11bHRpcGxpY2F0aXZlT3BzKHNlbGYpOgorICAgICAgICB4ID0gMSAqIDEKKyAgICAgICAgeCA9IDEgLyAxCisgICAgICAgIHggPSAxICUgMQorICAgICAgICB4ID0gMSAvIDEgKiAxICUgMQorCisgICAgZGVmIHRlc3RVbmFyeU9wcyhzZWxmKToKKyAgICAgICAgeCA9ICsxCisgICAgICAgIHggPSAtMQorICAgICAgICB4ID0gfjEKKyAgICAgICAgeCA9IH4xIF4gMSAmIDEgfCAxICYgMSBeIC0xCisgICAgICAgIHggPSAtMSoxLzEgKyAxKjEgLSAtLS0xKjEKKworICAgIGRlZiB0ZXN0U2VsZWN0b3JzKHNlbGYpOgorICAgICAgICAjIyMgdHJhaWxlcjogJygnIFt0ZXN0bGlzdF0gJyknIHwgJ1snIHN1YnNjcmlwdCAnXScgfCAnLicgTkFNRQorICAgICAgICAjIyMgc3Vic2NyaXB0OiBleHByIHwgW2V4cHJdICc6JyBbZXhwcl0KKworICAgICAgICBpbXBvcnQgc3lzLCB0aW1lCisgICAgICAgIGMgPSBzeXMucGF0aFswXQorICAgICAgICB4ID0gdGltZS50aW1lKCkKKyAgICAgICAgeCA9IHN5cy5tb2R1bGVzWyd0aW1lJ10udGltZSgpCisgICAgICAgIGEgPSAnMDEyMzQnCisgICAgICAgIGMgPSBhWzBdCisgICAgICAgIGMgPSBhWy0xXQorICAgICAgICBzID0gYVswOjVdCisgICAgICAgIHMgPSBhWzo1XQorICAgICAgICBzID0gYVswOl0KKyAgICAgICAgcyA9IGFbOl0KKyAgICAgICAgcyA9IGFbLTU6XQorICAgICAgICBzID0gYVs6LTFdCisgICAgICAgIHMgPSBhWy00Oi0zXQorICAgICAgICAjIEEgcm91Z2ggdGVzdCBvZiBTRiBidWcgMTMzMzk4Mi4gIGh0dHA6Ly9weXRob24ub3JnL3NmLzEzMzM5ODIKKyAgICAgICAgIyBUaGUgdGVzdGluZyBoZXJlIGlzIGZhaXJseSBpbmNvbXBsZXRlLgorICAgICAgICAjIFRlc3QgY2FzZXMgc2hvdWxkIGluY2x1ZGU6IGNvbW1hcyB3aXRoIDEgYW5kIDIgY29sb25zCisgICAgICAgIGQgPSB7fQorICAgICAgICBkWzFdID0gMQorICAgICAgICBkWzEsXSA9IDIKKyAgICAgICAgZFsxLDJdID0gMworICAgICAgICBkWzEsMiwzXSA9IDQKKyAgICAgICAgTCA9IGxpc3QoZCkKKyAgICAgICAgTC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3RyKEwpLCAnWzEsICgxLCksICgxLCAyKSwgKDEsIDIsIDMpXScpCisKKyAgICBkZWYgdGVzdEF0b21zKHNlbGYpOgorICAgICAgICAjIyMgYXRvbTogJygnIFt0ZXN0bGlzdF0gJyknIHwgJ1snIFt0ZXN0bGlzdF0gJ10nIHwgJ3snIFtkaWN0bWFrZXJdICd9JyB8ICdgJyB0ZXN0bGlzdCAnYCcgfCBOQU1FIHwgTlVNQkVSIHwgU1RSSU5HCisgICAgICAgICMjIyBkaWN0bWFrZXI6IHRlc3QgJzonIHRlc3QgKCcsJyB0ZXN0ICc6JyB0ZXN0KSogWycsJ10KKworICAgICAgICB4ID0gKDEpCisgICAgICAgIHggPSAoMSBvciAyIG9yIDMpCisgICAgICAgIHggPSAoMSBvciAyIG9yIDMsIDIsIDMpCisKKyAgICAgICAgeCA9IFtdCisgICAgICAgIHggPSBbMV0KKyAgICAgICAgeCA9IFsxIG9yIDIgb3IgM10KKyAgICAgICAgeCA9IFsxIG9yIDIgb3IgMywgMiwgM10KKyAgICAgICAgeCA9IFtdCisKKyAgICAgICAgeCA9IHt9CisgICAgICAgIHggPSB7J29uZSc6IDF9CisgICAgICAgIHggPSB7J29uZSc6IDEsfQorICAgICAgICB4ID0geydvbmUnIG9yICd0d28nOiAxIG9yIDJ9CisgICAgICAgIHggPSB7J29uZSc6IDEsICd0d28nOiAyfQorICAgICAgICB4ID0geydvbmUnOiAxLCAndHdvJzogMix9CisgICAgICAgIHggPSB7J29uZSc6IDEsICd0d28nOiAyLCAndGhyZWUnOiAzLCAnZm91cic6IDQsICdmaXZlJzogNSwgJ3NpeCc6IDZ9CisKKyAgICAgICAgeCA9IGB4YAorICAgICAgICB4ID0gYDEgb3IgMiBvciAzYAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGAxLDJgLCAnKDEsIDIpJykKKworICAgICAgICB4ID0geAorICAgICAgICB4ID0gJ3gnCisgICAgICAgIHggPSAxMjMKKworICAgICMjIyBleHBybGlzdDogZXhwciAoJywnIGV4cHIpKiBbJywnXQorICAgICMjIyB0ZXN0bGlzdDogdGVzdCAoJywnIHRlc3QpKiBbJywnXQorICAgICMgVGhlc2UgaGF2ZSBiZWVuIGV4ZXJjaXNlZCBlbm91Z2ggYWJvdmUKKworICAgIGRlZiB0ZXN0Q2xhc3NkZWYoc2VsZik6CisgICAgICAgICMgJ2NsYXNzJyBOQU1FIFsnKCcgW3Rlc3RsaXN0XSAnKSddICc6JyBzdWl0ZQorICAgICAgICBjbGFzcyBCOiBwYXNzCisgICAgICAgIGNsYXNzIEIyKCk6IHBhc3MKKyAgICAgICAgY2xhc3MgQzEoQik6IHBhc3MKKyAgICAgICAgY2xhc3MgQzIoQik6IHBhc3MKKyAgICAgICAgY2xhc3MgRChDMSwgQzIsIEIpOiBwYXNzCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgbWV0aDEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBtZXRoMihzZWxmLCBhcmcpOiBwYXNzCisgICAgICAgICAgICBkZWYgbWV0aDMoc2VsZiwgYTEsIGEyKTogcGFzcworICAgICAgICAjIGRlY29yYXRvcjogJ0AnIGRvdHRlZF9uYW1lIFsgJygnIFthcmdsaXN0XSAnKScgXSBORVdMSU5FCisgICAgICAgICMgZGVjb3JhdG9yczogZGVjb3JhdG9yKworICAgICAgICAjIGRlY29yYXRlZDogZGVjb3JhdG9ycyAoY2xhc3NkZWYgfCBmdW5jZGVmKQorICAgICAgICBkZWYgY2xhc3NfZGVjb3JhdG9yKHgpOgorICAgICAgICAgICAgeC5kZWNvcmF0ZWQgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4geAorICAgICAgICBAY2xhc3NfZGVjb3JhdG9yCisgICAgICAgIGNsYXNzIEc6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRy5kZWNvcmF0ZWQsIFRydWUpCisKKyAgICBkZWYgdGVzdExpc3Rjb21wcyhzZWxmKToKKyAgICAgICAgIyBsaXN0IGNvbXByZWhlbnNpb24gdGVzdHMKKyAgICAgICAgbnVtcyA9IFsxLCAyLCAzLCA0LCA1XQorICAgICAgICBzdHJzID0gWyJBcHBsZSIsICJCYW5hbmEiLCAiQ29jb251dCJdCisgICAgICAgIHNwY3MgPSBbIiAgQXBwbGUiLCAiIEJhbmFuYSAiLCAiQ29jbyAgbnV0ICAiXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3Muc3RyaXAoKSBmb3IgcyBpbiBzcGNzXSwgWydBcHBsZScsICdCYW5hbmEnLCAnQ29jbyAgbnV0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzMgKiB4IGZvciB4IGluIG51bXNdLCBbMywgNiwgOSwgMTIsIDE1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbeCBmb3IgeCBpbiBudW1zIGlmIHggPiAyXSwgWzMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoaSwgcykgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBzdHJzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKDEsICdBcHBsZScpLCAoMSwgJ0JhbmFuYScpLCAoMSwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdBcHBsZScpLCAoMiwgJ0JhbmFuYScpLCAoMiwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdBcHBsZScpLCAoMywgJ0JhbmFuYScpLCAoMywgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdBcHBsZScpLCAoNCwgJ0JhbmFuYScpLCAoNCwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdBcHBsZScpLCAoNSwgJ0JhbmFuYScpLCAoNSwgJ0NvY29udXQnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhpLCBzKSBmb3IgaSBpbiBudW1zIGZvciBzIGluIFtmIGZvciBmIGluIHN0cnMgaWYgIm4iIGluIGZdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKDEsICdCYW5hbmEnKSwgKDEsICdDb2NvbnV0JyksICgyLCAnQmFuYW5hJyksICgyLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ0JhbmFuYScpLCAoMywgJ0NvY29udXQnKSwgKDQsICdCYW5hbmEnKSwgKDQsICdDb2NvbnV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnQmFuYW5hJyksICg1LCAnQ29jb251dCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKGxhbWJkYSBhOlthKippIGZvciBpIGluIHJhbmdlKGErMSldKShqKSBmb3IgaiBpbiByYW5nZSg1KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgW1sxXSwgWzEsIDFdLCBbMSwgMiwgNF0sIFsxLCAzLCA5LCAyN10sIFsxLCA0LCAxNiwgNjQsIDI1Nl1dKQorCisgICAgICAgIGRlZiB0ZXN0X2luX2Z1bmMobCk6CisgICAgICAgICAgICByZXR1cm4gW05vbmUgPCB4IDwgMyBmb3IgeCBpbiBsIGlmIHggPiAyXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9pbl9mdW5jKG51bXMpLCBbRmFsc2UsIEZhbHNlLCBGYWxzZV0pCisKKyAgICAgICAgZGVmIHRlc3RfbmVzdGVkX2Zyb250KCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtbeSBmb3IgeSBpbiBbeCwgeCArIDFdXSBmb3IgeCBpbiBbMSwzLDVdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dKQorCisgICAgICAgIHRlc3RfbmVzdGVkX2Zyb250KCkKKworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIltpLCBzIGZvciBpIGluIG51bXMgZm9yIHMgaW4gc3Ryc10iKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIlt4IGlmIHldIikKKworICAgICAgICBzdXBwbGllcnMgPSBbCisgICAgICAgICAgKDEsICJCb2VpbmciKSwKKyAgICAgICAgICAoMiwgIkZvcmQiKSwKKyAgICAgICAgICAoMywgIk1hY2RvbmFsZHMiKQorICAgICAgICBdCisKKyAgICAgICAgcGFydHMgPSBbCisgICAgICAgICAgKDEwLCAiQWlybGluZXIiKSwKKyAgICAgICAgICAoMjAsICJFbmdpbmUiKSwKKyAgICAgICAgICAoMzAsICJDaGVlc2VidXJnZXIiKQorICAgICAgICBdCisKKyAgICAgICAgc3VwcGFydCA9IFsKKyAgICAgICAgICAoMSwgMTApLCAoMSwgMjApLCAoMiwgMjApLCAoMywgMzApCisgICAgICAgIF0KKworICAgICAgICB4ID0gWworICAgICAgICAgIChzbmFtZSwgcG5hbWUpCisgICAgICAgICAgICBmb3IgKHNubywgc25hbWUpIGluIHN1cHBsaWVycworICAgICAgICAgICAgICBmb3IgKHBubywgcG5hbWUpIGluIHBhcnRzCisgICAgICAgICAgICAgICAgZm9yIChzcF9zbm8sIHNwX3BubykgaW4gc3VwcGFydAorICAgICAgICAgICAgICAgICAgaWYgc25vID09IHNwX3NubyBhbmQgcG5vID09IHNwX3BubworICAgICAgICBdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBbKCdCb2VpbmcnLCAnQWlybGluZXInKSwgKCdCb2VpbmcnLCAnRW5naW5lJyksICgnRm9yZCcsICdFbmdpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdNYWNkb25hbGRzJywgJ0NoZWVzZWJ1cmdlcicpXSkKKworICAgIGRlZiB0ZXN0R2VuZXhwcyhzZWxmKToKKyAgICAgICAgIyBnZW5lcmF0b3IgZXhwcmVzc2lvbiB0ZXN0cworICAgICAgICBnID0gKFt4IGZvciB4IGluIHJhbmdlKDEwKV0gZm9yIHggaW4gcmFuZ2UoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZy5uZXh0KCksIFt4IGZvciB4IGluIHJhbmdlKDEwKV0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGcubmV4dCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoJ3Nob3VsZCBwcm9kdWNlIFN0b3BJdGVyYXRpb24gZXhjZXB0aW9uJykKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgYSA9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZyA9IChhIGZvciBkIGluIGEpCisgICAgICAgICAgICBnLm5leHQoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCdzaG91bGQgcHJvZHVjZSBUeXBlRXJyb3InKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgoeCwgeSkgZm9yIHggaW4gJ2FiY2QnIGZvciB5IGluICdhYmNkJyksIFsoeCwgeSkgZm9yIHggaW4gJ2FiY2QnIGZvciB5IGluICdhYmNkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgoeCwgeSkgZm9yIHggaW4gJ2FiJyBmb3IgeSBpbiAneHknKSwgWyh4LCB5KSBmb3IgeCBpbiAnYWInIGZvciB5IGluICd4eSddKQorCisgICAgICAgIGEgPSBbeCBmb3IgeCBpbiByYW5nZSgxMCldCisgICAgICAgIGIgPSAoeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiBhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oYiksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4KioyIGZvciB4IGluIHJhbmdlKDEwKSksIHN1bShbeCoqMiBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCp4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4JTIpLCBzdW0oW3gqeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCUyXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gcmFuZ2UoMTApKSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkpKSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiBbeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkpXSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkgaWYgVHJ1ZSkpIGlmIFRydWUpLCBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gKHogZm9yIHogaW4gcmFuZ2UoMTApIGlmIFRydWUpIGlmIEZhbHNlKSBpZiBUcnVlKSwgMCkKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmb28oeCBmb3IgeCBpbiByYW5nZSgxMCksIDEwMCkiKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImZvbygxMDAsIHggZm9yIHggaW4gcmFuZ2UoMTApKSIpCisKKyAgICBkZWYgdGVzdENvbXByZWhlbnNpb25TcGVjaWFscyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGZvciBvdXRtb3N0IGl0ZXJhYmxlIHByZWNvbXB1dGF0aW9uCisgICAgICAgIHggPSAxMDsgZyA9IChpIGZvciBpIGluIHJhbmdlKHgpKTsgeCA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGlzdChnKSksIDEwKQorCisgICAgICAgICMgVGhpcyBzaG91bGQgaG9sZCwgc2luY2Ugd2UncmUgb25seSBwcmVjb21wdXRpbmcgb3V0bW9zdCBpdGVyYWJsZS4KKyAgICAgICAgeCA9IDEwOyB0ID0gRmFsc2U7IGcgPSAoKGksaikgZm9yIGkgaW4gcmFuZ2UoeCkgaWYgdCBmb3IgaiBpbiByYW5nZSh4KSkKKyAgICAgICAgeCA9IDU7IHQgPSBUcnVlOworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoaSxqKSBmb3IgaSBpbiByYW5nZSgxMCkgZm9yIGogaW4gcmFuZ2UoNSldLCBsaXN0KGcpKQorCisgICAgICAgICMgR3JhbW1hciBhbGxvd3MgbXVsdGlwbGUgYWRqYWNlbnQgJ2lmJ3MgaW4gbGlzdGNvbXBzIGFuZCBnZW5leHBzLAorICAgICAgICAjIGV2ZW4gdGhvdWdoIGl0J3Mgc2lsbHkuIE1ha2Ugc3VyZSBpdCB3b3JrcyAoaWZlbHNlIGJyb2tlIHRoaXMuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsgeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCAlIDIgaWYgeCAlIDMgXSwgWzEsIDUsIDddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCAlIDIgaWYgeCAlIDMpLCBbMSwgNSwgN10pCisKKyAgICAgICAgIyB2ZXJpZnkgdW5wYWNraW5nIHNpbmdsZSBlbGVtZW50IHR1cGxlcyBpbiBsaXN0Y29tcC9nZW5leHAuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3ggZm9yIHgsIGluIFsoNCwpLCAoNSwpLCAoNiwpXV0sIFs0LCA1LCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHggZm9yIHgsIGluIFsoNywpLCAoOCwpLCAoOSwpXSksIFs3LCA4LCA5XSkKKworICAgIGRlZiB0ZXN0X3dpdGhfc3RhdGVtZW50KHNlbGYpOgorICAgICAgICBjbGFzcyBtYW5hZ2VyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoMSwgMikKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHdpdGggbWFuYWdlcigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIG1hbmFnZXIoKSBhcyB4OgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIG1hbmFnZXIoKSBhcyAoeCwgeSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpLCBtYW5hZ2VyKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzIHgsIG1hbmFnZXIoKSBhcyB5OgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIG1hbmFnZXIoKSBhcyB4LCBtYW5hZ2VyKCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdElmRWxzZUV4cHIoc2VsZik6CisgICAgICAgICMgVGVzdCBpZmVsc2UgZXhwcmVzc2lvbnMgaW4gdmFyaW91cyBjYXNlcworICAgICAgICBkZWYgX2NoZWNrZXZhbChtc2csIHJldCk6CisgICAgICAgICAgICAiaGVscGVyIHRvIGNoZWNrIHRoYXQgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucyBpcyBkb25lIGNvcnJlY3RseSIKKyAgICAgICAgICAgIHByaW50IHgKKyAgICAgICAgICAgIHJldHVybiByZXQKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsgeCgpIGZvciB4IGluIGxhbWJkYTogVHJ1ZSwgbGFtYmRhOiBGYWxzZSBpZiB4KCkgXSwgW1RydWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsgeCgpIGZvciB4IGluIChsYW1iZGE6IFRydWUsIGxhbWJkYTogRmFsc2UpIGlmIHgoKSBdLCBbVHJ1ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4KEZhbHNlKSBmb3IgeCBpbiAobGFtYmRhIHg6IEZhbHNlIGlmIHggZWxzZSBUcnVlLCBsYW1iZGEgeDogVHJ1ZSBpZiB4IGVsc2UgRmFsc2UpIGlmIHgoRmFsc2UpIF0sIFtUcnVlXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgMSIsIDApKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoX2NoZWNrZXZhbCgiY2hlY2sgMiIsIDApIGlmIDAgZWxzZSA1KSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSBhbmQgNiBpZiAwIGVsc2UgMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCg1IGFuZCA2KSBpZiAwIGVsc2UgMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDUgYW5kICg2IGlmIDEgZWxzZSAxKSksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAgb3IgX2NoZWNrZXZhbCgiY2hlY2sgMyIsIDIpIGlmIDAgZWxzZSAzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMSBvciBfY2hlY2tldmFsKCJjaGVjayA0IiwgMikgaWYgMSBlbHNlIF9jaGVja2V2YWwoImNoZWNrIDUiLCAzKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAgb3IgNSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgNiIsIDMpKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobm90IDUgaWYgMSBlbHNlIDEpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobm90IDUgaWYgMCBlbHNlIDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2ICsgMSBpZiAxIGVsc2UgMiksIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgLSAxIGlmIDEgZWxzZSAyKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiAqIDIgaWYgMSBlbHNlIDQpLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiAvIDIgaWYgMSBlbHNlIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2IDwgNCBpZiAwIGVsc2UgMiksIDIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUb2tlblRlc3RzLCBHcmFtbWFyVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL3B5M190ZXN0X2dyYW1tYXIucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9weTNfdGVzdF9ncmFtbWFyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYmY3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9weTNfdGVzdF9ncmFtbWFyLnB5CkBAIC0wLDAgKzEsOTIzIEBACisjIFB5dGhvbiB0ZXN0IHNldCAtLSBwYXJ0IDEsIGdyYW1tYXIuCisjIFRoaXMganVzdCB0ZXN0cyB3aGV0aGVyIHRoZSBwYXJzZXIgYWNjZXB0cyB0aGVtIGFsbC4KKworIyBOT1RFOiBXaGVuIHlvdSBydW4gdGhpcyB0ZXN0IGFzIGEgc2NyaXB0IGZyb20gdGhlIGNvbW1hbmQgbGluZSwgeW91CisjIGdldCB3YXJuaW5ncyBhYm91dCBjZXJ0YWluIGhleC9vY3QgY29uc3RhbnRzLiAgU2luY2UgdGhvc2UgYXJlCisjIGlzc3VlZCBieSB0aGUgcGFyc2VyLCB5b3UgY2FuJ3Qgc3VwcHJlc3MgdGhlbSBieSBhZGRpbmcgYQorIyBmaWx0ZXJ3YXJuaW5ncygpIGNhbGwgdG8gdGhpcyBtb2R1bGUuICBUaGVyZWZvcmUsIHRvIHNodXQgdXAgdGhlCisjIHJlZ3Jlc3Npb24gdGVzdCwgdGhlIGZpbHRlcndhcm5pbmdzKCkgY2FsbCBoYXMgYmVlbiBhZGRlZCB0bworIyByZWdydGVzdC5weS4KKworZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfc3ludGF4X2Vycm9yCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKKyMgdGVzdGluZyBpbXBvcnQgKgorZnJvbSBzeXMgaW1wb3J0ICoKKworY2xhc3MgVG9rZW5UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdEJhY2tzbGFzaChzZWxmKToKKyAgICAgICAgIyBCYWNrc2xhc2ggbWVhbnMgbGluZSBjb250aW51YXRpb246CisgICAgICAgIHggPSAxIFwKKyAgICAgICAgKyAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIDIsICdiYWNrc2xhc2ggZm9yIGxpbmUgY29udGludWF0aW9uJykKKworICAgICAgICAjIEJhY2tzbGFzaCBkb2VzIG5vdCBtZWFucyBjb250aW51YXRpb24gaW4gY29tbWVudHMgOlwKKyAgICAgICAgeCA9IDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgMCwgJ2JhY2tzbGFzaCBlbmRpbmcgY29tbWVudCcpCisKKyAgICBkZWYgdGVzdFBsYWluSW50ZWdlcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHR5cGUoMDAwKSwgdHlwZSgwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMHhmZiwgMjU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwbzM3NywgMjU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCAwbzE3Nzc3Nzc3Nzc3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwYjEwMDEsIDkpCisgICAgICAgICMgIjB4IiBpcyBub3QgYSB2YWxpZCBsaXRlcmFsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiMHgiKQorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgbWF4c2l6ZQorICAgICAgICBpZiBtYXhzaXplID09IDIxNDc0ODM2NDc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscygtMjE0NzQ4MzY0Ny0xLCAtMG8yMDAwMDAwMDAwMCkKKyAgICAgICAgICAgICMgWFhYIC0yMTQ3NDgzNjQ4CisgICAgICAgICAgICBzZWxmLmFzc2VydF8oMG8zNzc3Nzc3Nzc3NyA+IDApCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oMHhmZmZmZmZmZiA+IDApCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExID4gMCkKKyAgICAgICAgICAgIGZvciBzIGluICgnMjE0NzQ4MzY0OCcsICcwbzQwMDAwMDAwMDAwJywgJzB4MTAwMDAwMDAwJywKKyAgICAgICAgICAgICAgICAgICAgICAnMGIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgeCA9IGV2YWwocykKKyAgICAgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJPdmVyZmxvd0Vycm9yIG9uIGh1Z2UgaW50ZWdlciBsaXRlcmFsICVyIiAlIHMpCisgICAgICAgIGVsaWYgbWF4c2l6ZSA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoLTkyMjMzNzIwMzY4NTQ3NzU4MDctMSwgLTBvMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwbzE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcgPiAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDB4ZmZmZmZmZmZmZmZmZmZmZiA+IDApCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSA+IDApCisgICAgICAgICAgICBmb3IgcyBpbiAnOTIyMzM3MjAzNjg1NDc3NTgwOCcsICcwbzIwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCBcCisgICAgICAgICAgICAgICAgICAgICAnMHgxMDAwMDAwMDAwMDAwMDAwMCcsIFwKKyAgICAgICAgICAgICAgICAgICAgICcwYjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB4ID0gZXZhbChzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk92ZXJmbG93RXJyb3Igb24gaHVnZSBpbnRlZ2VyIGxpdGVyYWwgJXIiICUgcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnV2VpcmQgbWF4c2l6ZSB2YWx1ZSAlcicgJSBtYXhzaXplKQorCisgICAgZGVmIHRlc3RMb25nSW50ZWdlcnMoc2VsZik6CisgICAgICAgIHggPSAwCisgICAgICAgIHggPSAweGZmZmZmZmZmZmZmZmZmZmYKKyAgICAgICAgeCA9IDBYZmZmZmZmZmZmZmZmZmZmZgorICAgICAgICB4ID0gMG83Nzc3Nzc3Nzc3Nzc3Nzc3NworICAgICAgICB4ID0gME83Nzc3Nzc3Nzc3Nzc3Nzc3NworICAgICAgICB4ID0gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwCisgICAgICAgIHggPSAwYjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorICAgICAgICB4ID0gMEIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKKworICAgIGRlZiB0ZXN0RmxvYXRzKHNlbGYpOgorICAgICAgICB4ID0gMy4xNAorICAgICAgICB4ID0gMzE0LgorICAgICAgICB4ID0gMC4zMTQKKyAgICAgICAgIyBYWFggeCA9IDAwMC4zMTQKKyAgICAgICAgeCA9IC4zMTQKKyAgICAgICAgeCA9IDNlMTQKKyAgICAgICAgeCA9IDNFMTQKKyAgICAgICAgeCA9IDNlLTE0CisgICAgICAgIHggPSAzZSsxNAorICAgICAgICB4ID0gMy5lMTQKKyAgICAgICAgeCA9IC4zZTE0CisgICAgICAgIHggPSAzLjFlNAorCisgICAgZGVmIHRlc3RTdHJpbmdMaXRlcmFscyhzZWxmKToKKyAgICAgICAgeCA9ICcnOyB5ID0gIiI7IHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMCBhbmQgeCA9PSB5KQorICAgICAgICB4ID0gJ1wnJzsgeSA9ICInIjsgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAxIGFuZCB4ID09IHkgYW5kIG9yZCh4KSA9PSAzOSkKKyAgICAgICAgeCA9ICciJzsgeSA9ICJcIiI7IHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzQpCisgICAgICAgIHggPSAiZG9lc24ndCBcInNocmlua1wiIGRvZXMgaXQiCisgICAgICAgIHkgPSAnZG9lc25cJ3QgInNocmluayIgZG9lcyBpdCcKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAyNCBhbmQgeCA9PSB5KQorICAgICAgICB4ID0gImRvZXMgXCJzaHJpbmtcIiBkb2Vzbid0IGl0IgorICAgICAgICB5ID0gJ2RvZXMgInNocmluayIgZG9lc25cJ3QgaXQnCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMjQgYW5kIHggPT0geSkKKyAgICAgICAgeCA9ICIiIgorVGhlICJxdWljayIKK2Jyb3duIGZveAoranVtcHMgb3ZlcgordGhlICdsYXp5JyBkb2cuCisiIiIKKyAgICAgICAgeSA9ICdcblRoZSAicXVpY2siXG5icm93biBmb3hcbmp1bXBzIG92ZXJcbnRoZSBcJ2xhenlcJyBkb2cuXG4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIHkpCisgICAgICAgIHkgPSAnJycKK1RoZSAicXVpY2siCiticm93biBmb3gKK2p1bXBzIG92ZXIKK3RoZSAnbGF6eScgZG9nLgorJycnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIHkpCisgICAgICAgIHkgPSAiXG5cCitUaGUgXCJxdWlja1wiXG5cCiticm93biBmb3hcblwKK2p1bXBzIG92ZXJcblwKK3RoZSAnbGF6eScgZG9nLlxuXAorIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCB5KQorICAgICAgICB5ID0gJ1xuXAorVGhlIFwicXVpY2tcIlxuXAorYnJvd24gZm94XG5cCitqdW1wcyBvdmVyXG5cCit0aGUgXCdsYXp5XCcgZG9nLlxuXAorJworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCB5KQorCisgICAgZGVmIHRlc3RFbGxpcHNpcyhzZWxmKToKKyAgICAgICAgeCA9IC4uLgorICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyBFbGxpcHNpcykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICIuLiAuIikKKworY2xhc3MgR3JhbW1hclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICMgc2luZ2xlX2lucHV0OiBORVdMSU5FIHwgc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10IE5FV0xJTkUKKyAgICAjIFhYWCBjYW4ndCB0ZXN0IGluIGEgc2NyaXB0IC0tIHRoaXMgcnVsZSBpcyBvbmx5IHVzZWQgd2hlbiBpbnRlcmFjdGl2ZQorCisgICAgIyBmaWxlX2lucHV0OiAoTkVXTElORSB8IHN0bXQpKiBFTkRNQVJLRVIKKyAgICAjIEJlaW5nIHRlc3RlZCBhcyB0aGlzIHZlcnkgbW9tZW50IHRoaXMgdmVyeSBtb2R1bGUKKworICAgICMgZXhwcl9pbnB1dDogdGVzdGxpc3QgTkVXTElORQorICAgICMgWFhYIEhhcmQgdG8gdGVzdCAtLSB1c2VkIG9ubHkgaW4gY2FsbHMgdG8gaW5wdXQoKQorCisgICAgZGVmIHRlc3RFdmFsSW5wdXQoc2VsZik6CisgICAgICAgICMgdGVzdGxpc3QgRU5ETUFSS0VSCisgICAgICAgIHggPSBldmFsKCcxLCAwIG9yIDEnKQorCisgICAgZGVmIHRlc3RGdW5jZGVmKHNlbGYpOgorICAgICAgICAjIyMgW2RlY29yYXRvcnNdICdkZWYnIE5BTUUgcGFyYW1ldGVycyBbJy0+JyB0ZXN0XSAnOicgc3VpdGUKKyAgICAgICAgIyMjIGRlY29yYXRvcjogJ0AnIGRvdHRlZF9uYW1lIFsgJygnIFthcmdsaXN0XSAnKScgXSBORVdMSU5FCisgICAgICAgICMjIyBkZWNvcmF0b3JzOiBkZWNvcmF0b3IrCisgICAgICAgICMjIyBwYXJhbWV0ZXJzOiAnKCcgW3R5cGVkYXJnc2xpc3RdICcpJworICAgICAgICAjIyMgdHlwZWRhcmdzbGlzdDogKCh0ZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKgorICAgICAgICAjIyMgICAgICAgICAgICAgICAgKCcqJyBbdGZwZGVmXSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJyAnKionIHRmcGRlZl0gfCAnKionIHRmcGRlZikKKyAgICAgICAgIyMjICAgICAgICAgICAgICAgIHwgdGZwZGVmIFsnPScgdGVzdF0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddKQorICAgICAgICAjIyMgdGZwZGVmOiBOQU1FIFsnOicgdGVzdF0KKyAgICAgICAgIyMjIHZhcmFyZ3NsaXN0OiAoKHZmcGRlZiBbJz0nIHRlc3RdICcsJykqCisgICAgICAgICMjIyAgICAgICAgICAgICAgKCcqJyBbdmZwZGVmXSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogIFsnLCcgJyoqJyB2ZnBkZWZdIHwgJyoqJyB2ZnBkZWYpCisgICAgICAgICMjIyAgICAgICAgICAgICAgfCB2ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHZmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10pCisgICAgICAgICMjIyB2ZnBkZWY6IE5BTUUKKyAgICAgICAgZGVmIGYxKCk6IHBhc3MKKyAgICAgICAgZjEoKQorICAgICAgICBmMSgqKCkpCisgICAgICAgIGYxKCooKSwgKip7fSkKKyAgICAgICAgZGVmIGYyKG9uZV9hcmd1bWVudCk6IHBhc3MKKyAgICAgICAgZGVmIGYzKHR3bywgYXJndW1lbnRzKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmMi5fX2NvZGVfXy5jb192YXJuYW1lcywgKCdvbmVfYXJndW1lbnQnLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYzLl9fY29kZV9fLmNvX3Zhcm5hbWVzLCAoJ3R3bycsICdhcmd1bWVudHMnKSkKKyAgICAgICAgZGVmIGExKG9uZV9hcmcsKTogcGFzcworICAgICAgICBkZWYgYTIodHdvLCBhcmdzLCk6IHBhc3MKKyAgICAgICAgZGVmIHYwKCpyZXN0KTogcGFzcworICAgICAgICBkZWYgdjEoYSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGRlZiB2MihhLCBiLCAqcmVzdCk6IHBhc3MKKworICAgICAgICBmMSgpCisgICAgICAgIGYyKDEpCisgICAgICAgIGYyKDEsKQorICAgICAgICBmMygxLCAyKQorICAgICAgICBmMygxLCAyLCkKKyAgICAgICAgdjAoKQorICAgICAgICB2MCgxKQorICAgICAgICB2MCgxLCkKKyAgICAgICAgdjAoMSwyKQorICAgICAgICB2MCgxLDIsMyw0LDUsNiw3LDgsOSwwKQorICAgICAgICB2MSgxKQorICAgICAgICB2MSgxLCkKKyAgICAgICAgdjEoMSwyKQorICAgICAgICB2MSgxLDIsMykKKyAgICAgICAgdjEoMSwyLDMsNCw1LDYsNyw4LDksMCkKKyAgICAgICAgdjIoMSwyKQorICAgICAgICB2MigxLDIsMykKKyAgICAgICAgdjIoMSwyLDMsNCkKKyAgICAgICAgdjIoMSwyLDMsNCw1LDYsNyw4LDksMCkKKworICAgICAgICBkZWYgZDAxKGE9MSk6IHBhc3MKKyAgICAgICAgZDAxKCkKKyAgICAgICAgZDAxKDEpCisgICAgICAgIGQwMSgqKDEsKSkKKyAgICAgICAgZDAxKCoqeydhJzoyfSkKKyAgICAgICAgZGVmIGQxMShhLCBiPTEpOiBwYXNzCisgICAgICAgIGQxMSgxKQorICAgICAgICBkMTEoMSwgMikKKyAgICAgICAgZDExKDEsICoqeydiJzoyfSkKKyAgICAgICAgZGVmIGQyMShhLCBiLCBjPTEpOiBwYXNzCisgICAgICAgIGQyMSgxLCAyKQorICAgICAgICBkMjEoMSwgMiwgMykKKyAgICAgICAgZDIxKCooMSwgMiwgMykpCisgICAgICAgIGQyMSgxLCAqKDIsIDMpKQorICAgICAgICBkMjEoMSwgMiwgKigzLCkpCisgICAgICAgIGQyMSgxLCAyLCAqKnsnYyc6M30pCisgICAgICAgIGRlZiBkMDIoYT0xLCBiPTIpOiBwYXNzCisgICAgICAgIGQwMigpCisgICAgICAgIGQwMigxKQorICAgICAgICBkMDIoMSwgMikKKyAgICAgICAgZDAyKCooMSwgMikpCisgICAgICAgIGQwMigxLCAqKDIsKSkKKyAgICAgICAgZDAyKDEsICoqeydiJzoyfSkKKyAgICAgICAgZDAyKCoqeydhJzogMSwgJ2InOiAyfSkKKyAgICAgICAgZGVmIGQxMihhLCBiPTEsIGM9Mik6IHBhc3MKKyAgICAgICAgZDEyKDEpCisgICAgICAgIGQxMigxLCAyKQorICAgICAgICBkMTIoMSwgMiwgMykKKyAgICAgICAgZGVmIGQyMihhLCBiLCBjPTEsIGQ9Mik6IHBhc3MKKyAgICAgICAgZDIyKDEsIDIpCisgICAgICAgIGQyMigxLCAyLCAzKQorICAgICAgICBkMjIoMSwgMiwgMywgNCkKKyAgICAgICAgZGVmIGQwMXYoYT0xLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDAxdigpCisgICAgICAgIGQwMXYoMSkKKyAgICAgICAgZDAxdigxLCAyKQorICAgICAgICBkMDF2KCooMSwgMiwgMywgNCkpCisgICAgICAgIGQwMXYoKigxLCkpCisgICAgICAgIGQwMXYoKip7J2EnOjJ9KQorICAgICAgICBkZWYgZDExdihhLCBiPTEsICpyZXN0KTogcGFzcworICAgICAgICBkMTF2KDEpCisgICAgICAgIGQxMXYoMSwgMikKKyAgICAgICAgZDExdigxLCAyLCAzKQorICAgICAgICBkZWYgZDIxdihhLCBiLCBjPTEsICpyZXN0KTogcGFzcworICAgICAgICBkMjF2KDEsIDIpCisgICAgICAgIGQyMXYoMSwgMiwgMykKKyAgICAgICAgZDIxdigxLCAyLCAzLCA0KQorICAgICAgICBkMjF2KCooMSwgMiwgMywgNCkpCisgICAgICAgIGQyMXYoMSwgMiwgKip7J2MnOiAzfSkKKyAgICAgICAgZGVmIGQwMnYoYT0xLCBiPTIsICpyZXN0KTogcGFzcworICAgICAgICBkMDJ2KCkKKyAgICAgICAgZDAydigxKQorICAgICAgICBkMDJ2KDEsIDIpCisgICAgICAgIGQwMnYoMSwgMiwgMykKKyAgICAgICAgZDAydigxLCAqKDIsIDMsIDQpKQorICAgICAgICBkMDJ2KCoqeydhJzogMSwgJ2InOiAyfSkKKyAgICAgICAgZGVmIGQxMnYoYSwgYj0xLCBjPTIsICpyZXN0KTogcGFzcworICAgICAgICBkMTJ2KDEpCisgICAgICAgIGQxMnYoMSwgMikKKyAgICAgICAgZDEydigxLCAyLCAzKQorICAgICAgICBkMTJ2KDEsIDIsIDMsIDQpCisgICAgICAgIGQxMnYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDEydigxLCAyLCAqKDMsIDQsIDUpKQorICAgICAgICBkMTJ2KDEsICooMiwpLCAqKnsnYyc6IDN9KQorICAgICAgICBkZWYgZDIydihhLCBiLCBjPTEsIGQ9MiwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQyMnYoMSwgMikKKyAgICAgICAgZDIydigxLCAyLCAzKQorICAgICAgICBkMjJ2KDEsIDIsIDMsIDQpCisgICAgICAgIGQyMnYoMSwgMiwgMywgNCwgNSkKKyAgICAgICAgZDIydigqKDEsIDIsIDMsIDQpKQorICAgICAgICBkMjJ2KDEsIDIsICooMywgNCwgNSkpCisgICAgICAgIGQyMnYoMSwgKigyLCAzKSwgKip7J2QnOiA0fSkKKworICAgICAgICAjIGtleXdvcmQgYXJndW1lbnQgdHlwZSB0ZXN0cworICAgICAgICB0cnk6CisgICAgICAgICAgICBzdHIoJ3gnLCAqKntiJ2Zvbyc6MSB9KQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdCeXRlcyBzaG91bGQgbm90IHdvcmsgYXMga2V5d29yZCBhcmd1bWVudCBuYW1lcycpCisgICAgICAgICMga2V5d29yZCBvbmx5IGFyZ3VtZW50IHRlc3RzCisgICAgICAgIGRlZiBwb3Mwa2V5MSgqLCBrZXkpOiByZXR1cm4ga2V5CisgICAgICAgIHBvczBrZXkxKGtleT0xMDApCisgICAgICAgIGRlZiBwb3Mya2V5MihwMSwgcDIsICosIGsxLCBrMj0xMDApOiByZXR1cm4gcDEscDIsazEsazIKKyAgICAgICAgcG9zMmtleTIoMSwgMiwgazE9MTAwKQorICAgICAgICBwb3Mya2V5MigxLCAyLCBrMT0xMDAsIGsyPTIwMCkKKyAgICAgICAgcG9zMmtleTIoMSwgMiwgazI9MTAwLCBrMT0yMDApCisgICAgICAgIGRlZiBwb3Mya2V5MmRpY3QocDEsIHAyLCAqLCBrMT0xMDAsIGsyLCAqKmt3YXJnKTogcmV0dXJuIHAxLHAyLGsxLGsyLGt3YXJnCisgICAgICAgIHBvczJrZXkyZGljdCgxLDIsazI9MTAwLHRva3dhcmcxPTEwMCx0b2t3YXJnMj0yMDApCisgICAgICAgIHBvczJrZXkyZGljdCgxLDIsdG9rd2FyZzE9MTAwLHRva3dhcmcyPTIwMCwgazI9MTAwKQorCisgICAgICAgICMga2V5d29yZCBhcmd1bWVudHMgYWZ0ZXIgKmFyZ2xpc3QKKyAgICAgICAgZGVmIGYoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHJldHVybiBhcmdzLCBrd2FyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZigxLCB4PTIsICpbMywgNF0sIHk9NSksICgoMSwgMywgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyd4JzoyLCAneSc6NX0pKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgImYoMSwgKigyLDMpLCA0KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiZigxLCB4PTIsICooMyw0KSwgeD01KSIpCisKKyAgICAgICAgIyBhcmd1bWVudCBhbm5vdGF0aW9uIHRlc3RzCisgICAgICAgIGRlZiBmKHgpIC0+IGxpc3Q6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZi5fX2Fubm90YXRpb25zX18sIHsncmV0dXJuJzogbGlzdH0pCisgICAgICAgIGRlZiBmKHg6aW50KTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLl9fYW5ub3RhdGlvbnNfXywgeyd4JzogaW50fSkKKyAgICAgICAgZGVmIGYoKng6c3RyKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLl9fYW5ub3RhdGlvbnNfXywgeyd4Jzogc3RyfSkKKyAgICAgICAgZGVmIGYoKip4OmZsb2F0KTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLl9fYW5ub3RhdGlvbnNfXywgeyd4JzogZmxvYXR9KQorICAgICAgICBkZWYgZih4LCB5OjErMik6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZi5fX2Fubm90YXRpb25zX18sIHsneSc6IDN9KQorICAgICAgICBkZWYgZihhLCBiOjEsIGM6MiwgZCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZi5fX2Fubm90YXRpb25zX18sIHsnYic6IDEsICdjJzogMn0pCisgICAgICAgIGRlZiBmKGEsIGI6MSwgYzoyLCBkLCBlOjM9NCwgZj01LCAqZzo2KTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLl9fYW5ub3RhdGlvbnNfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeydiJzogMSwgJ2MnOiAyLCAnZSc6IDMsICdnJzogNn0pCisgICAgICAgIGRlZiBmKGEsIGI6MSwgYzoyLCBkLCBlOjM9NCwgZj01LCAqZzo2LCBoOjcsIGk9OCwgajo5PTEwLAorICAgICAgICAgICAgICAqKms6MTEpIC0+IDEyOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYuX19hbm5vdGF0aW9uc19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICB7J2InOiAxLCAnYyc6IDIsICdlJzogMywgJ2cnOiA2LCAnaCc6IDcsICdqJzogOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdrJzogMTEsICdyZXR1cm4nOiAxMn0pCisgICAgICAgICMgQ2hlY2sgZm9yIFNGIEJ1ZyAjMTY5NzI0OCAtIG1peGluZyBkZWNvcmF0b3JzIGFuZCBhIHJldHVybiBhbm5vdGF0aW9uCisgICAgICAgIGRlZiBudWxsKHgpOiByZXR1cm4geAorICAgICAgICBAbnVsbAorICAgICAgICBkZWYgZih4KSAtPiBsaXN0OiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYuX19hbm5vdGF0aW9uc19fLCB7J3JldHVybic6IGxpc3R9KQorCisgICAgICAgICMgdGVzdCBNQUtFX0NMT1NVUkUgd2l0aCBhIHZhcmlldHkgb2Ygb3BhcmcncworICAgICAgICBjbG9zdXJlID0gMQorICAgICAgICBkZWYgZigpOiByZXR1cm4gY2xvc3VyZQorICAgICAgICBkZWYgZih4PTEpOiByZXR1cm4gY2xvc3VyZQorICAgICAgICBkZWYgZigqLCBrPTEpOiByZXR1cm4gY2xvc3VyZQorICAgICAgICBkZWYgZigpIC0+IGludDogcmV0dXJuIGNsb3N1cmUKKworICAgICAgICAjIENoZWNrIGFzdCBlcnJvcnMgaW4gKmFyZ3MgYW5kICprd2FyZ3MKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmKCpnKDE9MikpIikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmKCoqZygxPTIpKSIpCisKKyAgICBkZWYgdGVzdExhbWJkZWYoc2VsZik6CisgICAgICAgICMjIyBsYW1iZGVmOiAnbGFtYmRhJyBbdmFyYXJnc2xpc3RdICc6JyB0ZXN0CisgICAgICAgIGwxID0gbGFtYmRhIDogMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsMSgpLCAwKQorICAgICAgICBsMiA9IGxhbWJkYSA6IGFbZF0gIyBYWFgganVzdCB0ZXN0aW5nIHRoZSBleHByZXNzaW9uCisgICAgICAgIGwzID0gbGFtYmRhIDogWzIgPCB4IGZvciB4IGluIFstMSwgMywgMF1dCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGwzKCksIFswLCAxLCAwXSkKKyAgICAgICAgbDQgPSBsYW1iZGEgeCA9IGxhbWJkYSB5ID0gbGFtYmRhIHo9MSA6IHogOiB5KCkgOiB4KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDQoKSwgMSkKKyAgICAgICAgbDUgPSBsYW1iZGEgeCwgeSwgej0yOiB4ICsgeSArIHoKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDUoMSwgMiksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGw1KDEsIDIsIDMpLCA2KQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImxhbWJkYSB4OiB4ID0gMiIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAibGFtYmRhIChOb25lLCk6IE5vbmUiKQorICAgICAgICBsNiA9IGxhbWJkYSB4LCB5LCAqLCBrPTIwOiB4K3kraworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsNigxLDIpLCAxKzIrMjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGw2KDEsMixrPTEwKSwgMSsyKzEwKQorCisKKyAgICAjIyMgc3RtdDogc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10CisgICAgIyBUZXN0ZWQgYmVsb3cKKworICAgIGRlZiB0ZXN0U2ltcGxlU3RtdChzZWxmKToKKyAgICAgICAgIyMjIHNpbXBsZV9zdG10OiBzbWFsbF9zdG10ICgnOycgc21hbGxfc3RtdCkqIFsnOyddCisgICAgICAgIHggPSAxOyBwYXNzOyBkZWwgeAorICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAjIHZlcmlmeSBzdGF0ZW1lbnRzIHRoYXQgZW5kIHdpdGggc2VtaS1jb2xvbnMKKyAgICAgICAgICAgIHggPSAxOyBwYXNzOyBkZWwgeDsKKyAgICAgICAgZm9vKCkKKworICAgICMjIyBzbWFsbF9zdG10OiBleHByX3N0bXQgfCBwYXNzX3N0bXQgfCBkZWxfc3RtdCB8IGZsb3dfc3RtdCB8IGltcG9ydF9zdG10IHwgZ2xvYmFsX3N0bXQgfCBhY2Nlc3Nfc3RtdAorICAgICMgVGVzdGVkIGJlbG93CisKKyAgICBkZWYgdGVzdEV4cHJTdG10KHNlbGYpOgorICAgICAgICAjIChleHBybGlzdCAnPScpKiBleHBybGlzdAorICAgICAgICAxCisgICAgICAgIDEsIDIsIDMKKyAgICAgICAgeCA9IDEKKyAgICAgICAgeCA9IDEsIDIsIDMKKyAgICAgICAgeCA9IHkgPSB6ID0gMSwgMiwgMworICAgICAgICB4LCB5LCB6ID0gMSwgMiwgMworICAgICAgICBhYmMgPSBhLCBiLCBjID0geCwgeSwgeiA9IHh5eiA9IDEsIDIsICgzLCA0KQorCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAieCArIDEgPSAxIikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJhICsgMSA9IGIgKyAyIikKKworICAgIGRlZiB0ZXN0RGVsU3RtdChzZWxmKToKKyAgICAgICAgIyAnZGVsJyBleHBybGlzdAorICAgICAgICBhYmMgPSBbMSwyLDNdCisgICAgICAgIHgsIHksIHogPSBhYmMKKyAgICAgICAgeHl6ID0geCwgeSwgegorCisgICAgICAgIGRlbCBhYmMKKyAgICAgICAgZGVsIHgsIHksICh6LCB4eXopCisKKyAgICBkZWYgdGVzdFBhc3NTdG10KHNlbGYpOgorICAgICAgICAjICdwYXNzJworICAgICAgICBwYXNzCisKKyAgICAjIGZsb3dfc3RtdDogYnJlYWtfc3RtdCB8IGNvbnRpbnVlX3N0bXQgfCByZXR1cm5fc3RtdCB8IHJhaXNlX3N0bXQKKyAgICAjIFRlc3RlZCBiZWxvdworCisgICAgZGVmIHRlc3RCcmVha1N0bXQoc2VsZik6CisgICAgICAgICMgJ2JyZWFrJworICAgICAgICB3aGlsZSAxOiBicmVhaworCisgICAgZGVmIHRlc3RDb250aW51ZVN0bXQoc2VsZik6CisgICAgICAgICMgJ2NvbnRpbnVlJworICAgICAgICBpID0gMQorICAgICAgICB3aGlsZSBpOiBpID0gMDsgY29udGludWUKKworICAgICAgICBtc2cgPSAiIgorICAgICAgICB3aGlsZSBub3QgbXNnOgorICAgICAgICAgICAgbXNnID0gIm9rIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbXNnID0gImNvbnRpbnVlIGZhaWxlZCB0byBjb250aW51ZSBpbnNpZGUgdHJ5IgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIG1zZyA9ICJjb250aW51ZSBpbnNpZGUgdHJ5IGNhbGxlZCBleGNlcHQgYmxvY2siCisgICAgICAgIGlmIG1zZyAhPSAib2siOgorICAgICAgICAgICAgc2VsZi5mYWlsKG1zZykKKworICAgICAgICBtc2cgPSAiIgorICAgICAgICB3aGlsZSBub3QgbXNnOgorICAgICAgICAgICAgbXNnID0gImZpbmFsbHkgYmxvY2sgbm90IGNhbGxlZCIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBtc2cgPSAib2siCisgICAgICAgIGlmIG1zZyAhPSAib2siOgorICAgICAgICAgICAgc2VsZi5mYWlsKG1zZykKKworICAgIGRlZiB0ZXN0X2JyZWFrX2NvbnRpbnVlX2xvb3Aoc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0IHdhcnJhbnRzIGFuIGV4cGxhbmF0aW9uLiBJdCBpcyBhIHRlc3Qgc3BlY2lmaWNhbGx5IGZvciBTRiBidWdzCisgICAgICAgICMgIzQ2MzM1OSBhbmQgIzQ2MjkzNy4gVGhlIGJ1ZyBpcyB0aGF0IGEgJ2JyZWFrJyBzdGF0ZW1lbnQgZXhlY3V0ZWQgb3IKKyAgICAgICAgIyBleGNlcHRpb24gcmFpc2VkIGluc2lkZSBhIHRyeS9leGNlcHQgaW5zaWRlIGEgbG9vcCwgKmFmdGVyKiBhIGNvbnRpbnVlCisgICAgICAgICMgc3RhdGVtZW50IGhhcyBiZWVuIGV4ZWN1dGVkIGluIHRoYXQgbG9vcCwgd2lsbCBjYXVzZSB0aGUgd3JvbmcgbnVtYmVyIG9mCisgICAgICAgICMgYXJndW1lbnRzIHRvIGJlIHBvcHBlZCBvZmYgdGhlIHN0YWNrIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciByZXNldCB0bworICAgICAgICAjIGEgdmVyeSBzbWFsbCBudW1iZXIgKHVzdWFsbHkgMC4pIEJlY2F1c2Ugb2YgdGhpcywgdGhlIGZvbGxvd2luZyB0ZXN0CisgICAgICAgICMgKm11c3QqIHdyaXR0ZW4gYXMgYSBmdW5jdGlvbiwgYW5kIHRoZSB0cmFja2luZyB2YXJzICptdXN0KiBiZSBmdW5jdGlvbgorICAgICAgICAjIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzLiBPdGhlcndpc2UsIHRoZSB0ZXN0IHdpbGwgbG9vcCBhbmQgbG9vcC4KKworICAgICAgICBkZWYgdGVzdF9pbm5lcihleHRyYV9idXJuaW5nX29pbCA9IDEsIGNvdW50PTApOgorICAgICAgICAgICAgYmlnX2hpcHBvID0gMgorICAgICAgICAgICAgd2hpbGUgYmlnX2hpcHBvOgorICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhX2J1cm5pbmdfb2lsIGFuZCBiaWdfaGlwcG8gPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2J1cm5pbmdfb2lsIC09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGJpZ19oaXBwbyAtPSAxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgaWYgY291bnQgPiAyIG9yIGJpZ19oaXBwbyAhPSAxOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiY29udGludWUgdGhlbiBicmVhayBpbiB0cnkvZXhjZXB0IGluIGxvb3AgYnJva2VuISIpCisgICAgICAgIHRlc3RfaW5uZXIoKQorCisgICAgZGVmIHRlc3RSZXR1cm4oc2VsZik6CisgICAgICAgICMgJ3JldHVybicgW3Rlc3RsaXN0XQorICAgICAgICBkZWYgZzEoKTogcmV0dXJuCisgICAgICAgIGRlZiBnMigpOiByZXR1cm4gMQorICAgICAgICBnMSgpCisgICAgICAgIHggPSBnMigpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiY2xhc3MgZm9vOnJldHVybiAxIikKKworICAgIGRlZiB0ZXN0WWllbGQoc2VsZik6CisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiY2xhc3MgZm9vOnlpZWxkIDEiKQorCisgICAgZGVmIHRlc3RSYWlzZShzZWxmKToKKyAgICAgICAgIyAncmFpc2UnIHRlc3QgWycsJyB0ZXN0XQorICAgICAgICB0cnk6IHJhaXNlIFJ1bnRpbWVFcnJvcignanVzdCB0ZXN0aW5nJykKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjogcGFzcworICAgICAgICB0cnk6IHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDogcGFzcworCisgICAgZGVmIHRlc3RJbXBvcnQoc2VsZik6CisgICAgICAgICMgJ2ltcG9ydCcgZG90dGVkX2FzX25hbWVzCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaW1wb3J0IHRpbWUsIHN5cworICAgICAgICAjICdmcm9tJyBkb3R0ZWRfbmFtZSAnaW1wb3J0JyAoJyonIHwgJygnIGltcG9ydF9hc19uYW1lcyAnKScgfCBpbXBvcnRfYXNfbmFtZXMpCisgICAgICAgIGZyb20gdGltZSBpbXBvcnQgdGltZQorICAgICAgICBmcm9tIHRpbWUgaW1wb3J0ICh0aW1lKQorICAgICAgICAjIG5vdCB0ZXN0YWJsZSBpbnNpZGUgYSBmdW5jdGlvbiwgYnV0IGFscmVhZHkgZG9uZSBhdCB0b3Agb2YgdGhlIG1vZHVsZQorICAgICAgICAjIGZyb20gc3lzIGltcG9ydCAqCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBwYXRoLCBhcmd2CisgICAgICAgIGZyb20gc3lzIGltcG9ydCAocGF0aCwgYXJndikKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IChwYXRoLCBhcmd2LCkKKworICAgIGRlZiB0ZXN0R2xvYmFsKHNlbGYpOgorICAgICAgICAjICdnbG9iYWwnIE5BTUUgKCcsJyBOQU1FKSoKKyAgICAgICAgZ2xvYmFsIGEKKyAgICAgICAgZ2xvYmFsIGEsIGIKKyAgICAgICAgZ2xvYmFsIG9uZSwgdHdvLCB0aHJlZSwgZm91ciwgZml2ZSwgc2l4LCBzZXZlbiwgZWlnaHQsIG5pbmUsIHRlbgorCisgICAgZGVmIHRlc3ROb25sb2NhbChzZWxmKToKKyAgICAgICAgIyAnbm9ubG9jYWwnIE5BTUUgKCcsJyBOQU1FKSoKKyAgICAgICAgeCA9IDAKKyAgICAgICAgeSA9IDAKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIG5vbmxvY2FsIHgKKyAgICAgICAgICAgIG5vbmxvY2FsIHgsIHkKKworICAgIGRlZiB0ZXN0QXNzZXJ0KHNlbGYpOgorICAgICAgICAjIGFzc2VydF9zdG10OiAnYXNzZXJ0JyB0ZXN0IFsnLCcgdGVzdF0KKyAgICAgICAgYXNzZXJ0IDEKKyAgICAgICAgYXNzZXJ0IDEsIDEKKyAgICAgICAgYXNzZXJ0IGxhbWJkYSB4OngKKyAgICAgICAgYXNzZXJ0IDEsIGxhbWJkYSB4OngrMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhc3NlcnQgMCwgIm1zZyIKKyAgICAgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yIGFzIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlLmFyZ3NbMF0sICJtc2ciKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiQXNzZXJ0aW9uRXJyb3Igbm90IHJhaXNlZCBieSBhc3NlcnQgMCIpCisKKyAgICAjIyMgY29tcG91bmRfc3RtdDogaWZfc3RtdCB8IHdoaWxlX3N0bXQgfCBmb3Jfc3RtdCB8IHRyeV9zdG10IHwgZnVuY2RlZiB8IGNsYXNzZGVmCisgICAgIyBUZXN0ZWQgYmVsb3cKKworICAgIGRlZiB0ZXN0SWYoc2VsZik6CisgICAgICAgICMgJ2lmJyB0ZXN0ICc6JyBzdWl0ZSAoJ2VsaWYnIHRlc3QgJzonIHN1aXRlKSogWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgIGlmIDE6IHBhc3MKKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisgICAgICAgIGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGVsaWYgMDogcGFzcworICAgICAgICBlbGlmIDA6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworCisgICAgZGVmIHRlc3RXaGlsZShzZWxmKToKKyAgICAgICAgIyAnd2hpbGUnIHRlc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXQorICAgICAgICB3aGlsZSAwOiBwYXNzCisgICAgICAgIHdoaWxlIDA6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworCisgICAgICAgICMgSXNzdWUxOTIwOiAid2hpbGUgMCIgaXMgb3B0aW1pemVkIGF3YXksCisgICAgICAgICMgZW5zdXJlIHRoYXQgdGhlICJlbHNlIiBjbGF1c2UgaXMgc3RpbGwgcHJlc2VudC4KKyAgICAgICAgeCA9IDAKKyAgICAgICAgd2hpbGUgMDoKKyAgICAgICAgICAgIHggPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4ID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCAyKQorCisgICAgZGVmIHRlc3RGb3Ioc2VsZik6CisgICAgICAgICMgJ2ZvcicgZXhwcmxpc3QgJ2luJyBleHBybGlzdCAnOicgc3VpdGUgWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgIGZvciBpIGluIDEsIDIsIDM6IHBhc3MKKyAgICAgICAgZm9yIGksIGosIGsgaW4gKCk6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworICAgICAgICBjbGFzcyBTcXVhcmVzOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1heCk6CisgICAgICAgICAgICAgICAgc2VsZi5tYXggPSBtYXgKKyAgICAgICAgICAgICAgICBzZWxmLnNvZmFyID0gW10KKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuc29mYXIpCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgbm90IDAgPD0gaSA8IHNlbGYubWF4OiByYWlzZSBJbmRleEVycm9yCisgICAgICAgICAgICAgICAgbiA9IGxlbihzZWxmLnNvZmFyKQorICAgICAgICAgICAgICAgIHdoaWxlIG4gPD0gaToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2Zhci5hcHBlbmQobipuKQorICAgICAgICAgICAgICAgICAgICBuID0gbisxCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc29mYXJbaV0KKyAgICAgICAgbiA9IDAKKyAgICAgICAgZm9yIHggaW4gU3F1YXJlcygxMCk6IG4gPSBuK3gKKyAgICAgICAgaWYgbiAhPSAyODU6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2ZvciBvdmVyIGdyb3dpbmcgc2VxdWVuY2UnKQorCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciB4LCBpbiBbKDEsKSwgKDIsKSwgKDMsKV06CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBbMSwgMiwgM10pCisKKyAgICBkZWYgdGVzdFRyeShzZWxmKToKKyAgICAgICAgIyMjIHRyeV9zdG10OiAndHJ5JyAnOicgc3VpdGUgKGV4Y2VwdF9jbGF1c2UgJzonIHN1aXRlKSsgWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgICMjIyAgICAgICAgIHwgJ3RyeScgJzonIHN1aXRlICdmaW5hbGx5JyAnOicgc3VpdGUKKyAgICAgICAgIyMjIGV4Y2VwdF9jbGF1c2U6ICdleGNlcHQnIFtleHByIFsnYXMnIGV4cHJdXQorICAgICAgICB0cnk6CisgICAgICAgICAgICAxLzAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6IDEvMAorICAgICAgICBleGNlcHQgRU9GRXJyb3I6IHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBtc2c6IHBhc3MKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBtc2c6IHBhc3MKKyAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKKyAgICAgICAgdHJ5OiAxLzAKKyAgICAgICAgZXhjZXB0IChFT0ZFcnJvciwgVHlwZUVycm9yLCBaZXJvRGl2aXNpb25FcnJvcik6IHBhc3MKKyAgICAgICAgdHJ5OiAxLzAKKyAgICAgICAgZXhjZXB0IChFT0ZFcnJvciwgVHlwZUVycm9yLCBaZXJvRGl2aXNpb25FcnJvcikgYXMgbXNnOiBwYXNzCisgICAgICAgIHRyeTogcGFzcworICAgICAgICBmaW5hbGx5OiBwYXNzCisKKyAgICBkZWYgdGVzdFN1aXRlKHNlbGYpOgorICAgICAgICAjIHNpbXBsZV9zdG10IHwgTkVXTElORSBJTkRFTlQgTkVXTElORSogKHN0bXQgTkVXTElORSopKyBERURFTlQKKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICBpZiAxOgorICAgICAgICAgICAgcGFzcworICAgICAgICBpZiAxOgorICAgICAgICAgICAgIworICAgICAgICAgICAgIworICAgICAgICAgICAgIworICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIworICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIworCisgICAgZGVmIHRlc3RUZXN0KHNlbGYpOgorICAgICAgICAjIyMgYW5kX3Rlc3QgKCdvcicgYW5kX3Rlc3QpKgorICAgICAgICAjIyMgYW5kX3Rlc3Q6IG5vdF90ZXN0ICgnYW5kJyBub3RfdGVzdCkqCisgICAgICAgICMjIyBub3RfdGVzdDogJ25vdCcgbm90X3Rlc3QgfCBjb21wYXJpc29uCisgICAgICAgIGlmIG5vdCAxOiBwYXNzCisgICAgICAgIGlmIDEgYW5kIDE6IHBhc3MKKyAgICAgICAgaWYgMSBvciAxOiBwYXNzCisgICAgICAgIGlmIG5vdCBub3Qgbm90IDE6IHBhc3MKKyAgICAgICAgaWYgbm90IDEgYW5kIDEgYW5kIDE6IHBhc3MKKyAgICAgICAgaWYgMSBhbmQgMSBvciAxIGFuZCAxIGFuZCAxIG9yIG5vdCAxIGFuZCAxOiBwYXNzCisKKyAgICBkZWYgdGVzdENvbXBhcmlzb24oc2VsZik6CisgICAgICAgICMjIyBjb21wYXJpc29uOiBleHByIChjb21wX29wIGV4cHIpKgorICAgICAgICAjIyMgY29tcF9vcDogJzwnfCc+J3wnPT0nfCc+PSd8Jzw9J3wnIT0nfCdpbid8J25vdCcgJ2luJ3wnaXMnfCdpcycgJ25vdCcKKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICB4ID0gKDEgPT0gMSkKKyAgICAgICAgaWYgMSA9PSAxOiBwYXNzCisgICAgICAgIGlmIDEgIT0gMTogcGFzcworICAgICAgICBpZiAxIDwgMTogcGFzcworICAgICAgICBpZiAxID4gMTogcGFzcworICAgICAgICBpZiAxIDw9IDE6IHBhc3MKKyAgICAgICAgaWYgMSA+PSAxOiBwYXNzCisgICAgICAgIGlmIDEgaXMgMTogcGFzcworICAgICAgICBpZiAxIGlzIG5vdCAxOiBwYXNzCisgICAgICAgIGlmIDEgaW4gKCk6IHBhc3MKKyAgICAgICAgaWYgMSBub3QgaW4gKCk6IHBhc3MKKyAgICAgICAgaWYgMSA8IDEgPiAxID09IDEgPj0gMSA8PSAxICE9IDEgaW4gMSBub3QgaW4gMSBpcyAxIGlzIG5vdCAxOiBwYXNzCisKKyAgICBkZWYgdGVzdEJpbmFyeU1hc2tPcHMoc2VsZik6CisgICAgICAgIHggPSAxICYgMQorICAgICAgICB4ID0gMSBeIDEKKyAgICAgICAgeCA9IDEgfCAxCisKKyAgICBkZWYgdGVzdFNoaWZ0T3BzKHNlbGYpOgorICAgICAgICB4ID0gMSA8PCAxCisgICAgICAgIHggPSAxID4+IDEKKyAgICAgICAgeCA9IDEgPDwgMSA+PiAxCisKKyAgICBkZWYgdGVzdEFkZGl0aXZlT3BzKHNlbGYpOgorICAgICAgICB4ID0gMQorICAgICAgICB4ID0gMSArIDEKKyAgICAgICAgeCA9IDEgLSAxIC0gMQorICAgICAgICB4ID0gMSAtIDEgKyAxIC0gMSArIDEKKworICAgIGRlZiB0ZXN0TXVsdGlwbGljYXRpdmVPcHMoc2VsZik6CisgICAgICAgIHggPSAxICogMQorICAgICAgICB4ID0gMSAvIDEKKyAgICAgICAgeCA9IDEgJSAxCisgICAgICAgIHggPSAxIC8gMSAqIDEgJSAxCisKKyAgICBkZWYgdGVzdFVuYXJ5T3BzKHNlbGYpOgorICAgICAgICB4ID0gKzEKKyAgICAgICAgeCA9IC0xCisgICAgICAgIHggPSB+MQorICAgICAgICB4ID0gfjEgXiAxICYgMSB8IDEgJiAxIF4gLTEKKyAgICAgICAgeCA9IC0xKjEvMSArIDEqMSAtIC0tLTEqMQorCisgICAgZGVmIHRlc3RTZWxlY3RvcnMoc2VsZik6CisgICAgICAgICMjIyB0cmFpbGVyOiAnKCcgW3Rlc3RsaXN0XSAnKScgfCAnWycgc3Vic2NyaXB0ICddJyB8ICcuJyBOQU1FCisgICAgICAgICMjIyBzdWJzY3JpcHQ6IGV4cHIgfCBbZXhwcl0gJzonIFtleHByXQorCisgICAgICAgIGltcG9ydCBzeXMsIHRpbWUKKyAgICAgICAgYyA9IHN5cy5wYXRoWzBdCisgICAgICAgIHggPSB0aW1lLnRpbWUoKQorICAgICAgICB4ID0gc3lzLm1vZHVsZXNbJ3RpbWUnXS50aW1lKCkKKyAgICAgICAgYSA9ICcwMTIzNCcKKyAgICAgICAgYyA9IGFbMF0KKyAgICAgICAgYyA9IGFbLTFdCisgICAgICAgIHMgPSBhWzA6NV0KKyAgICAgICAgcyA9IGFbOjVdCisgICAgICAgIHMgPSBhWzA6XQorICAgICAgICBzID0gYVs6XQorICAgICAgICBzID0gYVstNTpdCisgICAgICAgIHMgPSBhWzotMV0KKyAgICAgICAgcyA9IGFbLTQ6LTNdCisgICAgICAgICMgQSByb3VnaCB0ZXN0IG9mIFNGIGJ1ZyAxMzMzOTgyLiAgaHR0cDovL3B5dGhvbi5vcmcvc2YvMTMzMzk4MgorICAgICAgICAjIFRoZSB0ZXN0aW5nIGhlcmUgaXMgZmFpcmx5IGluY29tcGxldGUuCisgICAgICAgICMgVGVzdCBjYXNlcyBzaG91bGQgaW5jbHVkZTogY29tbWFzIHdpdGggMSBhbmQgMiBjb2xvbnMKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGRbMV0gPSAxCisgICAgICAgIGRbMSxdID0gMgorICAgICAgICBkWzEsMl0gPSAzCisgICAgICAgIGRbMSwyLDNdID0gNAorICAgICAgICBMID0gbGlzdChkKQorICAgICAgICBMLnNvcnQoa2V5PWxhbWJkYSB4OiB4IGlmIGlzaW5zdGFuY2UoeCwgdHVwbGUpIGVsc2UgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN0cihMKSwgJ1sxLCAoMSwpLCAoMSwgMiksICgxLCAyLCAzKV0nKQorCisgICAgZGVmIHRlc3RBdG9tcyhzZWxmKToKKyAgICAgICAgIyMjIGF0b206ICcoJyBbdGVzdGxpc3RdICcpJyB8ICdbJyBbdGVzdGxpc3RdICddJyB8ICd7JyBbZGljdHNldG1ha2VyXSAnfScgfCBOQU1FIHwgTlVNQkVSIHwgU1RSSU5HCisgICAgICAgICMjIyBkaWN0c2V0bWFrZXI6ICh0ZXN0ICc6JyB0ZXN0ICgnLCcgdGVzdCAnOicgdGVzdCkqIFsnLCddKSB8ICh0ZXN0ICgnLCcgdGVzdCkqIFsnLCddKQorCisgICAgICAgIHggPSAoMSkKKyAgICAgICAgeCA9ICgxIG9yIDIgb3IgMykKKyAgICAgICAgeCA9ICgxIG9yIDIgb3IgMywgMiwgMykKKworICAgICAgICB4ID0gW10KKyAgICAgICAgeCA9IFsxXQorICAgICAgICB4ID0gWzEgb3IgMiBvciAzXQorICAgICAgICB4ID0gWzEgb3IgMiBvciAzLCAyLCAzXQorICAgICAgICB4ID0gW10KKworICAgICAgICB4ID0ge30KKyAgICAgICAgeCA9IHsnb25lJzogMX0KKyAgICAgICAgeCA9IHsnb25lJzogMSx9CisgICAgICAgIHggPSB7J29uZScgb3IgJ3R3byc6IDEgb3IgMn0KKyAgICAgICAgeCA9IHsnb25lJzogMSwgJ3R3byc6IDJ9CisgICAgICAgIHggPSB7J29uZSc6IDEsICd0d28nOiAyLH0KKyAgICAgICAgeCA9IHsnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMsICdmb3VyJzogNCwgJ2ZpdmUnOiA1LCAnc2l4JzogNn0KKworICAgICAgICB4ID0geydvbmUnfQorICAgICAgICB4ID0geydvbmUnLCAxLH0KKyAgICAgICAgeCA9IHsnb25lJywgJ3R3bycsICd0aHJlZSd9CisgICAgICAgIHggPSB7MiwgMywgNCx9CisKKyAgICAgICAgeCA9IHgKKyAgICAgICAgeCA9ICd4JworICAgICAgICB4ID0gMTIzCisKKyAgICAjIyMgZXhwcmxpc3Q6IGV4cHIgKCcsJyBleHByKSogWycsJ10KKyAgICAjIyMgdGVzdGxpc3Q6IHRlc3QgKCcsJyB0ZXN0KSogWycsJ10KKyAgICAjIFRoZXNlIGhhdmUgYmVlbiBleGVyY2lzZWQgZW5vdWdoIGFib3ZlCisKKyAgICBkZWYgdGVzdENsYXNzZGVmKHNlbGYpOgorICAgICAgICAjICdjbGFzcycgTkFNRSBbJygnIFt0ZXN0bGlzdF0gJyknXSAnOicgc3VpdGUKKyAgICAgICAgY2xhc3MgQjogcGFzcworICAgICAgICBjbGFzcyBCMigpOiBwYXNzCisgICAgICAgIGNsYXNzIEMxKEIpOiBwYXNzCisgICAgICAgIGNsYXNzIEMyKEIpOiBwYXNzCisgICAgICAgIGNsYXNzIEQoQzEsIEMyLCBCKTogcGFzcworICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIG1ldGgxKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgbWV0aDIoc2VsZiwgYXJnKTogcGFzcworICAgICAgICAgICAgZGVmIG1ldGgzKHNlbGYsIGExLCBhMik6IHBhc3MKKworICAgICAgICAjIGRlY29yYXRvcjogJ0AnIGRvdHRlZF9uYW1lIFsgJygnIFthcmdsaXN0XSAnKScgXSBORVdMSU5FCisgICAgICAgICMgZGVjb3JhdG9yczogZGVjb3JhdG9yKworICAgICAgICAjIGRlY29yYXRlZDogZGVjb3JhdG9ycyAoY2xhc3NkZWYgfCBmdW5jZGVmKQorICAgICAgICBkZWYgY2xhc3NfZGVjb3JhdG9yKHgpOiByZXR1cm4geAorICAgICAgICBAY2xhc3NfZGVjb3JhdG9yCisgICAgICAgIGNsYXNzIEc6IHBhc3MKKworICAgIGRlZiB0ZXN0RGljdGNvbXBzKHNlbGYpOgorICAgICAgICAjIGRpY3RvcnNldG1ha2VyOiAoICh0ZXN0ICc6JyB0ZXN0IChjb21wX2ZvciB8CisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnLCcgdGVzdCAnOicgdGVzdCkqIFsnLCddKSkgfAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICh0ZXN0IChjb21wX2ZvciB8ICgnLCcgdGVzdCkqIFsnLCddKSkgKQorICAgICAgICBudW1zID0gWzEsIDIsIDNdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe2k6aSsxIGZvciBpIGluIG51bXN9LCB7MTogMiwgMjogMywgMzogNH0pCisKKyAgICBkZWYgdGVzdExpc3Rjb21wcyhzZWxmKToKKyAgICAgICAgIyBsaXN0IGNvbXByZWhlbnNpb24gdGVzdHMKKyAgICAgICAgbnVtcyA9IFsxLCAyLCAzLCA0LCA1XQorICAgICAgICBzdHJzID0gWyJBcHBsZSIsICJCYW5hbmEiLCAiQ29jb251dCJdCisgICAgICAgIHNwY3MgPSBbIiAgQXBwbGUiLCAiIEJhbmFuYSAiLCAiQ29jbyAgbnV0ICAiXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3Muc3RyaXAoKSBmb3IgcyBpbiBzcGNzXSwgWydBcHBsZScsICdCYW5hbmEnLCAnQ29jbyAgbnV0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzMgKiB4IGZvciB4IGluIG51bXNdLCBbMywgNiwgOSwgMTIsIDE1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbeCBmb3IgeCBpbiBudW1zIGlmIHggPiAyXSwgWzMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoaSwgcykgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBzdHJzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKDEsICdBcHBsZScpLCAoMSwgJ0JhbmFuYScpLCAoMSwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdBcHBsZScpLCAoMiwgJ0JhbmFuYScpLCAoMiwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdBcHBsZScpLCAoMywgJ0JhbmFuYScpLCAoMywgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdBcHBsZScpLCAoNCwgJ0JhbmFuYScpLCAoNCwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdBcHBsZScpLCAoNSwgJ0JhbmFuYScpLCAoNSwgJ0NvY29udXQnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhpLCBzKSBmb3IgaSBpbiBudW1zIGZvciBzIGluIFtmIGZvciBmIGluIHN0cnMgaWYgIm4iIGluIGZdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKDEsICdCYW5hbmEnKSwgKDEsICdDb2NvbnV0JyksICgyLCAnQmFuYW5hJyksICgyLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ0JhbmFuYScpLCAoMywgJ0NvY29udXQnKSwgKDQsICdCYW5hbmEnKSwgKDQsICdDb2NvbnV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnQmFuYW5hJyksICg1LCAnQ29jb251dCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKGxhbWJkYSBhOlthKippIGZvciBpIGluIHJhbmdlKGErMSldKShqKSBmb3IgaiBpbiByYW5nZSg1KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgW1sxXSwgWzEsIDFdLCBbMSwgMiwgNF0sIFsxLCAzLCA5LCAyN10sIFsxLCA0LCAxNiwgNjQsIDI1Nl1dKQorCisgICAgICAgIGRlZiB0ZXN0X2luX2Z1bmMobCk6CisgICAgICAgICAgICByZXR1cm4gWzAgPCB4IDwgMyBmb3IgeCBpbiBsIGlmIHggPiAyXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9pbl9mdW5jKG51bXMpLCBbRmFsc2UsIEZhbHNlLCBGYWxzZV0pCisKKyAgICAgICAgZGVmIHRlc3RfbmVzdGVkX2Zyb250KCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtbeSBmb3IgeSBpbiBbeCwgeCArIDFdXSBmb3IgeCBpbiBbMSwzLDVdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dKQorCisgICAgICAgIHRlc3RfbmVzdGVkX2Zyb250KCkKKworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIltpLCBzIGZvciBpIGluIG51bXMgZm9yIHMgaW4gc3Ryc10iKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIlt4IGlmIHldIikKKworICAgICAgICBzdXBwbGllcnMgPSBbCisgICAgICAgICAgKDEsICJCb2VpbmciKSwKKyAgICAgICAgICAoMiwgIkZvcmQiKSwKKyAgICAgICAgICAoMywgIk1hY2RvbmFsZHMiKQorICAgICAgICBdCisKKyAgICAgICAgcGFydHMgPSBbCisgICAgICAgICAgKDEwLCAiQWlybGluZXIiKSwKKyAgICAgICAgICAoMjAsICJFbmdpbmUiKSwKKyAgICAgICAgICAoMzAsICJDaGVlc2VidXJnZXIiKQorICAgICAgICBdCisKKyAgICAgICAgc3VwcGFydCA9IFsKKyAgICAgICAgICAoMSwgMTApLCAoMSwgMjApLCAoMiwgMjApLCAoMywgMzApCisgICAgICAgIF0KKworICAgICAgICB4ID0gWworICAgICAgICAgIChzbmFtZSwgcG5hbWUpCisgICAgICAgICAgICBmb3IgKHNubywgc25hbWUpIGluIHN1cHBsaWVycworICAgICAgICAgICAgICBmb3IgKHBubywgcG5hbWUpIGluIHBhcnRzCisgICAgICAgICAgICAgICAgZm9yIChzcF9zbm8sIHNwX3BubykgaW4gc3VwcGFydAorICAgICAgICAgICAgICAgICAgaWYgc25vID09IHNwX3NubyBhbmQgcG5vID09IHNwX3BubworICAgICAgICBdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBbKCdCb2VpbmcnLCAnQWlybGluZXInKSwgKCdCb2VpbmcnLCAnRW5naW5lJyksICgnRm9yZCcsICdFbmdpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdNYWNkb25hbGRzJywgJ0NoZWVzZWJ1cmdlcicpXSkKKworICAgIGRlZiB0ZXN0R2VuZXhwcyhzZWxmKToKKyAgICAgICAgIyBnZW5lcmF0b3IgZXhwcmVzc2lvbiB0ZXN0cworICAgICAgICBnID0gKFt4IGZvciB4IGluIHJhbmdlKDEwKV0gZm9yIHggaW4gcmFuZ2UoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChnKSwgW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV4dChnKQorICAgICAgICAgICAgc2VsZi5mYWlsKCdzaG91bGQgcHJvZHVjZSBTdG9wSXRlcmF0aW9uIGV4Y2VwdGlvbicpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGEgPSAxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGcgPSAoYSBmb3IgZCBpbiBhKQorICAgICAgICAgICAgbmV4dChnKQorICAgICAgICAgICAgc2VsZi5mYWlsKCdzaG91bGQgcHJvZHVjZSBUeXBlRXJyb3InKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgoeCwgeSkgZm9yIHggaW4gJ2FiY2QnIGZvciB5IGluICdhYmNkJyksIFsoeCwgeSkgZm9yIHggaW4gJ2FiY2QnIGZvciB5IGluICdhYmNkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgoeCwgeSkgZm9yIHggaW4gJ2FiJyBmb3IgeSBpbiAneHknKSwgWyh4LCB5KSBmb3IgeCBpbiAnYWInIGZvciB5IGluICd4eSddKQorCisgICAgICAgIGEgPSBbeCBmb3IgeCBpbiByYW5nZSgxMCldCisgICAgICAgIGIgPSAoeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiBhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oYiksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4KioyIGZvciB4IGluIHJhbmdlKDEwKSksIHN1bShbeCoqMiBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCp4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4JTIpLCBzdW0oW3gqeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCUyXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gcmFuZ2UoMTApKSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkpKSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiBbeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkpXSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkgaWYgVHJ1ZSkpIGlmIFRydWUpLCBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gKHogZm9yIHogaW4gcmFuZ2UoMTApIGlmIFRydWUpIGlmIEZhbHNlKSBpZiBUcnVlKSwgMCkKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmb28oeCBmb3IgeCBpbiByYW5nZSgxMCksIDEwMCkiKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImZvbygxMDAsIHggZm9yIHggaW4gcmFuZ2UoMTApKSIpCisKKyAgICBkZWYgdGVzdENvbXByZWhlbnNpb25TcGVjaWFscyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGZvciBvdXRtb3N0IGl0ZXJhYmxlIHByZWNvbXB1dGF0aW9uCisgICAgICAgIHggPSAxMDsgZyA9IChpIGZvciBpIGluIHJhbmdlKHgpKTsgeCA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGlzdChnKSksIDEwKQorCisgICAgICAgICMgVGhpcyBzaG91bGQgaG9sZCwgc2luY2Ugd2UncmUgb25seSBwcmVjb21wdXRpbmcgb3V0bW9zdCBpdGVyYWJsZS4KKyAgICAgICAgeCA9IDEwOyB0ID0gRmFsc2U7IGcgPSAoKGksaikgZm9yIGkgaW4gcmFuZ2UoeCkgaWYgdCBmb3IgaiBpbiByYW5nZSh4KSkKKyAgICAgICAgeCA9IDU7IHQgPSBUcnVlOworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoaSxqKSBmb3IgaSBpbiByYW5nZSgxMCkgZm9yIGogaW4gcmFuZ2UoNSldLCBsaXN0KGcpKQorCisgICAgICAgICMgR3JhbW1hciBhbGxvd3MgbXVsdGlwbGUgYWRqYWNlbnQgJ2lmJ3MgaW4gbGlzdGNvbXBzIGFuZCBnZW5leHBzLAorICAgICAgICAjIGV2ZW4gdGhvdWdoIGl0J3Mgc2lsbHkuIE1ha2Ugc3VyZSBpdCB3b3JrcyAoaWZlbHNlIGJyb2tlIHRoaXMuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsgeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCAlIDIgaWYgeCAlIDMgXSwgWzEsIDUsIDddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCAlIDIgaWYgeCAlIDMpLCBbMSwgNSwgN10pCisKKyAgICAgICAgIyB2ZXJpZnkgdW5wYWNraW5nIHNpbmdsZSBlbGVtZW50IHR1cGxlcyBpbiBsaXN0Y29tcC9nZW5leHAuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3ggZm9yIHgsIGluIFsoNCwpLCAoNSwpLCAoNiwpXV0sIFs0LCA1LCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHggZm9yIHgsIGluIFsoNywpLCAoOCwpLCAoOSwpXSksIFs3LCA4LCA5XSkKKworICAgIGRlZiB0ZXN0X3dpdGhfc3RhdGVtZW50KHNlbGYpOgorICAgICAgICBjbGFzcyBtYW5hZ2VyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoMSwgMikKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHdpdGggbWFuYWdlcigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIG1hbmFnZXIoKSBhcyB4OgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIG1hbmFnZXIoKSBhcyAoeCwgeSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpLCBtYW5hZ2VyKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzIHgsIG1hbmFnZXIoKSBhcyB5OgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIG1hbmFnZXIoKSBhcyB4LCBtYW5hZ2VyKCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdElmRWxzZUV4cHIoc2VsZik6CisgICAgICAgICMgVGVzdCBpZmVsc2UgZXhwcmVzc2lvbnMgaW4gdmFyaW91cyBjYXNlcworICAgICAgICBkZWYgX2NoZWNrZXZhbChtc2csIHJldCk6CisgICAgICAgICAgICAiaGVscGVyIHRvIGNoZWNrIHRoYXQgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucyBpcyBkb25lIGNvcnJlY3RseSIKKyAgICAgICAgICAgIHByaW50KHgpCisgICAgICAgICAgICByZXR1cm4gcmV0CisKKyAgICAgICAgIyB0aGUgbmV4dCBsaW5lIGlzIG5vdCBhbGxvd2VkIGFueW1vcmUKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwoWyB4KCkgZm9yIHggaW4gbGFtYmRhOiBUcnVlLCBsYW1iZGE6IEZhbHNlIGlmIHgoKSBdLCBbVHJ1ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4KCkgZm9yIHggaW4gKGxhbWJkYTogVHJ1ZSwgbGFtYmRhOiBGYWxzZSkgaWYgeCgpIF0sIFtUcnVlXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbIHgoRmFsc2UpIGZvciB4IGluIChsYW1iZGEgeDogRmFsc2UgaWYgeCBlbHNlIFRydWUsIGxhbWJkYSB4OiBUcnVlIGlmIHggZWxzZSBGYWxzZSkgaWYgeChGYWxzZSkgXSwgW1RydWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg1IGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayAxIiwgMCkpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChfY2hlY2tldmFsKCJjaGVjayAyIiwgMCkgaWYgMCBlbHNlIDUpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg1IGFuZCA2IGlmIDAgZWxzZSAxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoKDUgYW5kIDYpIGlmIDAgZWxzZSAxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSBhbmQgKDYgaWYgMSBlbHNlIDEpKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMCBvciBfY2hlY2tldmFsKCJjaGVjayAzIiwgMikgaWYgMCBlbHNlIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxIG9yIF9jaGVja2V2YWwoImNoZWNrIDQiLCAyKSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgNSIsIDMpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMCBvciA1IGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayA2IiwgMykpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChub3QgNSBpZiAxIGVsc2UgMSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChub3QgNSBpZiAwIGVsc2UgMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgKyAxIGlmIDEgZWxzZSAyKSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiAtIDEgaWYgMSBlbHNlIDIpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2ICogMiBpZiAxIGVsc2UgNCksIDEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2IC8gMiBpZiAxIGVsc2UgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgPCA0IGlmIDAgZWxzZSAyKSwgMikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRva2VuVGVzdHMsIEdyYW1tYXJUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3B5dHJlZV9pZGVtcG90ZW5jeS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9weXRyZWVfaWRlbXBvdGVuY3kucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjQzZjdlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9weXRyZWVfaWRlbXBvdGVuY3kucHkKQEAgLTAsMCArMSw5MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIENvcHlyaWdodCAyMDA2IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIk1haW4gcHJvZ3JhbSBmb3IgdGVzdGluZyB0aGUgaW5mcmFzdHJ1Y3R1cmUuIiIiCisKK19fYXV0aG9yX18gPSAiR3VpZG8gdmFuIFJvc3N1bSA8Z3VpZG9AcHl0aG9uLm9yZz4iCisKKyMgU3VwcG9ydCBpbXBvcnRzIChuZWVkIHRvIGJlIGltcG9ydGVkIGZpcnN0KQorZnJvbSAuIGltcG9ydCBzdXBwb3J0CisKKyMgUHl0aG9uIGltcG9ydHMKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGxvZ2dpbmcKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBweXRyZWUKK2ltcG9ydCBwZ2VuMgorZnJvbSBwZ2VuMiBpbXBvcnQgZHJpdmVyCisKK2xvZ2dpbmcuYmFzaWNDb25maWcoKQorCitkZWYgbWFpbigpOgorICAgIGdyID0gZHJpdmVyLmxvYWRfZ3JhbW1hcigiR3JhbW1hci50eHQiKQorICAgIGRyID0gZHJpdmVyLkRyaXZlcihnciwgY29udmVydD1weXRyZWUuY29udmVydCkKKworICAgIGZuID0gImV4YW1wbGUucHkiCisgICAgdHJlZSA9IGRyLnBhcnNlX2ZpbGUoZm4sIGRlYnVnPVRydWUpCisgICAgaWYgbm90IGRpZmYoZm4sIHRyZWUpOgorICAgICAgICBwcmludCAiTm8gZGlmZnMuIgorICAgIGlmIG5vdCBzeXMuYXJndlsxOl06CisgICAgICAgIHJldHVybiAjIFBhc3MgYSBkdW1teSBhcmd1bWVudCB0byBydW4gdGhlIGNvbXBsZXRlIHRlc3Qgc3VpdGUgYmVsb3cKKworICAgIHByb2JsZW1zID0gW10KKworICAgICMgUHJvY2VzcyBldmVyeSBpbXBvcnRlZCBtb2R1bGUKKyAgICBmb3IgbmFtZSBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbbmFtZV0KKyAgICAgICAgaWYgbW9kIGlzIE5vbmUgb3Igbm90IGhhc2F0dHIobW9kLCAiX19maWxlX18iKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZuID0gbW9kLl9fZmlsZV9fCisgICAgICAgIGlmIGZuLmVuZHN3aXRoKCIucHljIik6CisgICAgICAgICAgICBmbiA9IGZuWzotMV0KKyAgICAgICAgaWYgbm90IGZuLmVuZHN3aXRoKCIucHkiKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlBhcnNpbmciLCBmbgorICAgICAgICB0cmVlID0gZHIucGFyc2VfZmlsZShmbiwgZGVidWc9VHJ1ZSkKKyAgICAgICAgaWYgZGlmZihmbiwgdHJlZSk6CisgICAgICAgICAgICBwcm9ibGVtcy5hcHBlbmQoZm4pCisKKyAgICAjIFByb2Nlc3MgZXZlcnkgc2luZ2xlIG1vZHVsZSBvbiBzeXMucGF0aCAoYnV0IG5vdCBpbiBwYWNrYWdlcykKKyAgICBmb3IgZGlyIGluIHN5cy5wYXRoOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlyKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJTY2FubmluZyIsIGRpciwgIi4uLiIKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBpZiBub3QgbmFtZS5lbmRzd2l0aCgiLnB5Iik6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlBhcnNpbmciLCBuYW1lCisgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbihkaXIsIG5hbWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHJlZSA9IGRyLnBhcnNlX2ZpbGUoZm4sIGRlYnVnPVRydWUpCisgICAgICAgICAgICBleGNlcHQgcGdlbjIucGFyc2UuUGFyc2VFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIHByaW50ICJQYXJzZUVycm9yOiIsIGVycgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBkaWZmKGZuLCB0cmVlKToKKyAgICAgICAgICAgICAgICAgICAgcHJvYmxlbXMuYXBwZW5kKGZuKQorCisgICAgIyBTaG93IHN1bW1hcnkgb2YgcHJvYmxlbSBmaWxlcworICAgIGlmIG5vdCBwcm9ibGVtczoKKyAgICAgICAgcHJpbnQgIk5vIHByb2JsZW1zLiAgQ29uZ3JhdHVsYXRpb25zISIKKyAgICBlbHNlOgorICAgICAgICBwcmludCAiUHJvYmxlbXMgaW4gZm9sbG93aW5nIGZpbGVzOiIKKyAgICAgICAgZm9yIGZuIGluIHByb2JsZW1zOgorICAgICAgICAgICAgcHJpbnQgIioqKiIsIGZuCisKK2RlZiBkaWZmKGZuLCB0cmVlKToKKyAgICBmID0gb3BlbigiQCIsICJ3IikKKyAgICB0cnk6CisgICAgICAgIGYud3JpdGUoc3RyKHRyZWUpKQorICAgIGZpbmFsbHk6CisgICAgICAgIGYuY2xvc2UoKQorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIG9zLnN5c3RlbSgiZGlmZiAtdSAlcyBAIiAlIGZuKQorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLnJlbW92ZSgiQCIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvcHl0cmVlX2lkZW1wb3RlbmN5LnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9weXRyZWVfaWRlbXBvdGVuY3kucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNTZhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvcHl0cmVlX2lkZW1wb3RlbmN5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvcHl0cmVlX2lkZW1wb3RlbmN5LnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9weXRyZWVfaWRlbXBvdGVuY3kucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNTZhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvcHl0cmVlX2lkZW1wb3RlbmN5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9zdXBwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDY5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weQpAQCAtMCwwICsxLDU0IEBACisiIiJTdXBwb3J0IGNvZGUgZm9yIHRlc3RfKi5weSBmaWxlcyIiIgorIyBBdXRob3I6IENvbGxpbiBXaW50ZXIKKworIyBQeXRob24gaW1wb3J0cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgcmUKK2Zyb20gdGV4dHdyYXAgaW1wb3J0IGRlZGVudAorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gbGliMnRvMyBpbXBvcnQgcHl0cmVlLCByZWZhY3RvcgorZnJvbSBsaWIydG8zLnBnZW4yIGltcG9ydCBkcml2ZXIKKwordGVzdF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCitwcm9qX2RpciA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHRlc3RfZGlyLCAiLi4iKSkKK2dyYW1tYXJfcGF0aCA9IG9zLnBhdGguam9pbih0ZXN0X2RpciwgIi4uIiwgIkdyYW1tYXIudHh0IikKK2dyYW1tYXIgPSBkcml2ZXIubG9hZF9ncmFtbWFyKGdyYW1tYXJfcGF0aCkKK2RyaXZlciA9IGRyaXZlci5Ecml2ZXIoZ3JhbW1hciwgY29udmVydD1weXRyZWUuY29udmVydCkKKworZGVmIHBhcnNlX3N0cmluZyhzdHJpbmcpOgorICAgIHJldHVybiBkcml2ZXIucGFyc2Vfc3RyaW5nKHJlZm9ybWF0KHN0cmluZyksIGRlYnVnPVRydWUpCisKK2RlZiBydW5fYWxsX3Rlc3RzKHRlc3RfbW9kPU5vbmUsIHRlc3RzPU5vbmUpOgorICAgIGlmIHRlc3RzIGlzIE5vbmU6CisgICAgICAgIHRlc3RzID0gdW5pdHRlc3QuVGVzdExvYWRlcigpLmxvYWRUZXN0c0Zyb21Nb2R1bGUodGVzdF9tb2QpCisgICAgdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIodmVyYm9zaXR5PTIpLnJ1bih0ZXN0cykKKworZGVmIHJlZm9ybWF0KHN0cmluZyk6CisgICAgcmV0dXJuIGRlZGVudChzdHJpbmcpICsgdSJcblxuIgorCitkZWYgZ2V0X3JlZmFjdG9yZXIoZml4ZXJfcGtnPSJsaWIydG8zIiwgZml4ZXJzPU5vbmUsIG9wdGlvbnM9Tm9uZSk6CisgICAgIiIiCisgICAgQSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBSZWZhY3RvcmluZ1Rvb2wgZm9yIHRlc3RzLgorCisgICAgZml4ZXJzIGlzIGEgbGlzdCBvZiBmaXhlcnMgZm9yIHRoZSBSZWZhY3RvcmluZ1Rvb2wgdG8gdXNlLiBCeSBkZWZhdWx0CisgICAgImxpYjJ0bzMuZml4ZXMuKiIgaXMgdXNlZC4gb3B0aW9ucyBpcyBhbiBvcHRpb25hbCBkaWN0aW9uYXJ5IG9mIG9wdGlvbnMgdG8KKyAgICBiZSBwYXNzZWQgdG8gdGhlIFJlZmFjdG9yaW5nVG9vbC4KKyAgICAiIiIKKyAgICBpZiBmaXhlcnMgaXMgbm90IE5vbmU6CisgICAgICAgIGZpeGVycyA9IFtmaXhlcl9wa2cgKyAiLmZpeGVzLmZpeF8iICsgZml4IGZvciBmaXggaW4gZml4ZXJzXQorICAgIGVsc2U6CisgICAgICAgIGZpeGVycyA9IHJlZmFjdG9yLmdldF9maXhlcnNfZnJvbV9wYWNrYWdlKGZpeGVyX3BrZyArICIuZml4ZXMiKQorICAgIG9wdGlvbnMgPSBvcHRpb25zIG9yIHt9CisgICAgcmV0dXJuIHJlZmFjdG9yLlJlZmFjdG9yaW5nVG9vbChmaXhlcnMsIG9wdGlvbnMsIGV4cGxpY2l0PVRydWUpCisKK2RlZiBhbGxfcHJvamVjdF9maWxlcygpOgorICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsocHJval9kaXIpOgorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoIi5weSIpOgorICAgICAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihkaXJwYXRoLCBmaWxlbmFtZSkKKworVGVzdENhc2UgPSB1bml0dGVzdC5UZXN0Q2FzZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTE4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTE4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0YjNkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHkKQEAgLTAsMCArMSwyMyBAQAorIiIiVGVzdHMgdGhhdCBydW4gYWxsIGZpeGVyIG1vZHVsZXMgb3ZlciBhbiBpbnB1dCBzdHJlYW0uCisKK1RoaXMgaGFzIGJlZW4gYnJva2VuIG91dCBpbnRvIGl0cyBvd24gdGVzdCBtb2R1bGUgYmVjYXVzZSBvZiBpdHMKK3J1bm5pbmcgdGltZS4KKyIiIgorIyBBdXRob3I6IENvbGxpbiBXaW50ZXIKKworIyBQeXRob24gaW1wb3J0cworaW1wb3J0IHVuaXR0ZXN0CisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSBsaWIydG8zIGltcG9ydCByZWZhY3RvcgorZnJvbSAuIGltcG9ydCBzdXBwb3J0CisKKworY2xhc3MgVGVzdF9hbGwoc3VwcG9ydC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucmVmYWN0b3IgPSBzdXBwb3J0LmdldF9yZWZhY3RvcmVyKCkKKworICAgIGRlZiB0ZXN0X2FsbF9wcm9qZWN0X2ZpbGVzKHNlbGYpOgorICAgICAgICBmb3IgZmlsZXBhdGggaW4gc3VwcG9ydC5hbGxfcHJvamVjdF9maWxlcygpOgorICAgICAgICAgICAgc2VsZi5yZWZhY3Rvci5yZWZhY3Rvcl9maWxlKGZpbGVwYXRoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTdjNjBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTdjNjBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDgyODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkKQEAgLTAsMCArMSw0NTQxIEBACisiIiIgVGVzdCBzdWl0ZSBmb3IgdGhlIGZpeGVyIG1vZHVsZXMgIiIiCisKKyMgUHl0aG9uIGltcG9ydHMKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4KK2Zyb20gb3BlcmF0b3IgaW1wb3J0IGl0ZW1nZXR0ZXIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIGxpYjJ0bzMgaW1wb3J0IHB5Z3JhbSwgcHl0cmVlLCByZWZhY3RvciwgZml4ZXJfdXRpbAorZnJvbSBsaWIydG8zLnRlc3RzIGltcG9ydCBzdXBwb3J0CisKKworY2xhc3MgRml4ZXJUZXN0Q2FzZShzdXBwb3J0LlRlc3RDYXNlKToKKworICAgICMgT3RoZXIgdGVzdCBjYXNlcyBjYW4gc3ViY2xhc3MgdGhpcyBjbGFzcyBhbmQgcmVwbGFjZSAiZml4ZXJfcGtnIiB3aXRoCisgICAgIyB0aGVpciBvd24uCisgICAgZGVmIHNldFVwKHNlbGYsIGZpeF9saXN0PU5vbmUsIGZpeGVyX3BrZz0ibGliMnRvMyIsIG9wdGlvbnM9Tm9uZSk6CisgICAgICAgIGlmIGZpeF9saXN0IGlzIE5vbmU6CisgICAgICAgICAgICBmaXhfbGlzdCA9IFtzZWxmLmZpeGVyXQorICAgICAgICBzZWxmLnJlZmFjdG9yID0gc3VwcG9ydC5nZXRfcmVmYWN0b3JlcihmaXhlcl9wa2csIGZpeF9saXN0LCBvcHRpb25zKQorICAgICAgICBzZWxmLmZpeGVyX2xvZyA9IFtdCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSB1IjxzdHJpbmc+IgorCisgICAgICAgIGZvciBmaXhlciBpbiBjaGFpbihzZWxmLnJlZmFjdG9yLnByZV9vcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVmYWN0b3IucG9zdF9vcmRlcik6CisgICAgICAgICAgICBmaXhlci5sb2cgPSBzZWxmLmZpeGVyX2xvZworCisgICAgZGVmIF9jaGVjayhzZWxmLCBiZWZvcmUsIGFmdGVyKToKKyAgICAgICAgYmVmb3JlID0gc3VwcG9ydC5yZWZvcm1hdChiZWZvcmUpCisgICAgICAgIGFmdGVyID0gc3VwcG9ydC5yZWZvcm1hdChhZnRlcikKKyAgICAgICAgdHJlZSA9IHNlbGYucmVmYWN0b3IucmVmYWN0b3Jfc3RyaW5nKGJlZm9yZSwgc2VsZi5maWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZnRlciwgdW5pY29kZSh0cmVlKSkKKyAgICAgICAgcmV0dXJuIHRyZWUKKworICAgIGRlZiBjaGVjayhzZWxmLCBiZWZvcmUsIGFmdGVyLCBpZ25vcmVfd2FybmluZ3M9RmFsc2UpOgorICAgICAgICB0cmVlID0gc2VsZi5fY2hlY2soYmVmb3JlLCBhZnRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRyZWUud2FzX2NoYW5nZWQpCisgICAgICAgIGlmIG5vdCBpZ25vcmVfd2FybmluZ3M6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZml4ZXJfbG9nLCBbXSkKKworICAgIGRlZiB3YXJucyhzZWxmLCBiZWZvcmUsIGFmdGVyLCBtZXNzYWdlLCB1bmNoYW5nZWQ9RmFsc2UpOgorICAgICAgICB0cmVlID0gc2VsZi5fY2hlY2soYmVmb3JlLCBhZnRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UgaW4gIiIuam9pbihzZWxmLmZpeGVyX2xvZykpCisgICAgICAgIGlmIG5vdCB1bmNoYW5nZWQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHJlZS53YXNfY2hhbmdlZCkKKworICAgIGRlZiB3YXJuc191bmNoYW5nZWQoc2VsZiwgYmVmb3JlLCBtZXNzYWdlKToKKyAgICAgICAgc2VsZi53YXJucyhiZWZvcmUsIGJlZm9yZSwgbWVzc2FnZSwgdW5jaGFuZ2VkPVRydWUpCisKKyAgICBkZWYgdW5jaGFuZ2VkKHNlbGYsIGJlZm9yZSwgaWdub3JlX3dhcm5pbmdzPUZhbHNlKToKKyAgICAgICAgc2VsZi5fY2hlY2soYmVmb3JlLCBiZWZvcmUpCisgICAgICAgIGlmIG5vdCBpZ25vcmVfd2FybmluZ3M6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZml4ZXJfbG9nLCBbXSkKKworICAgIGRlZiBhc3NlcnRfcnVuc19hZnRlcihzZWxmLCAqbmFtZXMpOgorICAgICAgICBmaXhlcyA9IFtzZWxmLmZpeGVyXQorICAgICAgICBmaXhlcy5leHRlbmQobmFtZXMpCisgICAgICAgIHIgPSBzdXBwb3J0LmdldF9yZWZhY3RvcmVyKCJsaWIydG8zIiwgZml4ZXMpCisgICAgICAgIChwcmUsIHBvc3QpID0gci5nZXRfZml4ZXJzKCkKKyAgICAgICAgbiA9ICJmaXhfIiArIHNlbGYuZml4ZXIKKyAgICAgICAgaWYgcG9zdCBhbmQgcG9zdFstMV0uX19jbGFzc19fLl9fbW9kdWxlX18uZW5kc3dpdGgobik6CisgICAgICAgICAgICAjIFdlJ3JlIHRoZSBsYXN0IGZpeGVyIHRvIHJ1bgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHByZSBhbmQgcHJlWy0xXS5fX2NsYXNzX18uX19tb2R1bGVfXy5lbmRzd2l0aChuKSBhbmQgbm90IHBvc3Q6CisgICAgICAgICAgICAjIFdlJ3JlIHRoZSBsYXN0IGluIHByZSBhbmQgcG9zdCBpcyBlbXB0eQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZmFpbCgiRml4ZXIgcnVuIG9yZGVyICglcykgaXMgaW5jb3JyZWN0OyAlcyBzaG91bGQgYmUgbGFzdC4iXAorICAgICAgICAgICAgICAgJSgiLCAiLmpvaW4oW3guX19jbGFzc19fLl9fbW9kdWxlX18gZm9yIHggaW4gKHByZStwb3N0KV0pLCBuKSkKKworY2xhc3MgVGVzdF9uZShGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJuZSIKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBiID0gIiIiaWYgeCA8PiB5OgorICAgICAgICAgICAgcGFzcyIiIgorCisgICAgICAgIGEgPSAiIiJpZiB4ICE9IHk6CisgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X25vX3NwYWNlcyhzZWxmKToKKyAgICAgICAgYiA9ICIiImlmIHg8Pnk6CisgICAgICAgICAgICBwYXNzIiIiCisKKyAgICAgICAgYSA9ICIiImlmIHghPXk6CisgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2NoYWluZWQoc2VsZik6CisgICAgICAgIGIgPSAiIiJpZiB4PD55PD56OgorICAgICAgICAgICAgcGFzcyIiIgorCisgICAgICAgIGEgPSAiIiJpZiB4IT15IT16OgorICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfaGFzX2tleShGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJoYXNfa2V5IgorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBkLmhhc19rZXkoIngiKSBvciBkLmhhc19rZXkoInkiKSIiIgorICAgICAgICBhID0gIiIieCA9ICJ4IiBpbiBkIG9yICJ5IiBpbiBkIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYS5iLmMuZC5oYXNfa2V5KCJ4IikgKiogMyIiIgorICAgICAgICBhID0gIiIieCA9ICgieCIgaW4gYS5iLmMuZCkgKiogMyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8zKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGEuYi5oYXNfa2V5KDEgKyAyKS5fX3JlcHJfXygpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gKDEgKyAyIGluIGEuYikuX19yZXByX18oKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF80KHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGEuYi5oYXNfa2V5KDEgKyAyKS5fX3JlcHJfXygpICoqIC0zICoqIDQiIiIKKyAgICAgICAgYSA9ICIiInggPSAoMSArIDIgaW4gYS5iKS5fX3JlcHJfXygpICoqIC0zICoqIDQiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNShzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBhLmhhc19rZXkoZiBvciBnKSIiIgorICAgICAgICBhID0gIiIieCA9IChmIG9yIGcpIGluIGEiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBhICsgYi5oYXNfa2V5KGMpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gYSArIChjIGluIGIpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0Xzcoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYS5oYXNfa2V5KGxhbWJkYTogMTIpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gKGxhbWJkYTogMTIpIGluIGEiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfOChzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBhLmhhc19rZXkoYSBmb3IgYSBpbiBiKSIiIgorICAgICAgICBhID0gIiIieCA9IChhIGZvciBhIGluIGIpIGluIGEiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfOShzZWxmKToKKyAgICAgICAgYiA9ICIiImlmIG5vdCBhLmhhc19rZXkoYik6IHBhc3MiIiIKKyAgICAgICAgYSA9ICIiImlmIGIgbm90IGluIGE6IHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMTAoc2VsZik6CisgICAgICAgIGIgPSAiIiJpZiBub3QgYS5oYXNfa2V5KGIpLl9fcmVwcl9fKCk6IHBhc3MiIiIKKyAgICAgICAgYSA9ICIiImlmIG5vdCAoYiBpbiBhKS5fX3JlcHJfXygpOiBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzExKHNlbGYpOgorICAgICAgICBiID0gIiIiaWYgbm90IGEuaGFzX2tleShiKSAqKiAyOiBwYXNzIiIiCisgICAgICAgIGEgPSAiIiJpZiBub3QgKGIgaW4gYSkgKiogMjogcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfYXBwbHkoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiYXBwbHkiCisKKyAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGFwcGx5KGYsIGcgKyBoKSIiIgorICAgICAgICBhID0gIiIieCA9IGYoKmcgKyBoKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBiID0gIiIieSA9IGFwcGx5KGYsIGcsIGgpIiIiCisgICAgICAgIGEgPSAiIiJ5ID0gZigqZywgKipoKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8zKHNlbGYpOgorICAgICAgICBiID0gIiIieiA9IGFwcGx5KGZzWzBdLCBnIG9yIGgsIGggb3IgZykiIiIKKyAgICAgICAgYSA9ICIiInogPSBmc1swXSgqZyBvciBoLCAqKmggb3IgZykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNChzZWxmKToKKyAgICAgICAgYiA9ICIiImFwcGx5KGYsICh4LCB5KSArIHQpIiIiCisgICAgICAgIGEgPSAiIiJmKCooeCwgeSkgKyB0KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF81KHNlbGYpOgorICAgICAgICBiID0gIiIiYXBwbHkoZiwgYXJncywpIiIiCisgICAgICAgIGEgPSAiIiJmKCphcmdzKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF82KHNlbGYpOgorICAgICAgICBiID0gIiIiYXBwbHkoZiwgYXJncywga3dkcywpIiIiCisgICAgICAgIGEgPSAiIiJmKCphcmdzLCAqKmt3ZHMpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICMgVGVzdCB0aGF0IGNvbXBsZXggZnVuY3Rpb25zIGFyZSBwYXJlbnRoZXNpemVkCisKKyAgICBkZWYgdGVzdF9jb21wbGV4XzEoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYXBwbHkoZitnLCBhcmdzKSIiIgorICAgICAgICBhID0gIiIieCA9IChmK2cpKCphcmdzKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9jb21wbGV4XzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYXBwbHkoZipnLCBhcmdzKSIiIgorICAgICAgICBhID0gIiIieCA9IChmKmcpKCphcmdzKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9jb21wbGV4XzMoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYXBwbHkoZioqZywgYXJncykiIiIKKyAgICAgICAgYSA9ICIiInggPSAoZioqZykoKmFyZ3MpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICMgQnV0IGRvdHRlZCBuYW1lcyBldGMuIG5vdAorCisgICAgZGVmIHRlc3RfZG90dGVkX25hbWUoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYXBwbHkoZi5nLCBhcmdzKSIiIgorICAgICAgICBhID0gIiIieCA9IGYuZygqYXJncykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfc3Vic2NyaXB0KHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGFwcGx5KGZbeF0sIGFyZ3MpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gZlt4XSgqYXJncykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfY2FsbChzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBhcHBseShmKCksIGFyZ3MpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gZigpKCphcmdzKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAjIEV4dHJlbWUgY2FzZQorICAgIGRlZiB0ZXN0X2V4dHJlbWUoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYXBwbHkoYS5iLmMuZC5lLmYsIGFyZ3MsIGt3ZHMpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gYS5iLmMuZC5lLmYoKmFyZ3MsICoqa3dkcykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgIyBYWFggQ29tbWVudHMgaW4gd2VpcmQgcGxhY2VzIHN0aWxsIGdldCBsb3N0CisgICAgZGVmIHRlc3Rfd2VpcmRfY29tbWVudHMoc2VsZik6CisgICAgICAgIGIgPSAiIiJhcHBseSggICAjIGZvbworICAgICAgICAgIGYsICMgYmFyCisgICAgICAgICAgYXJncykiIiIKKyAgICAgICAgYSA9ICIiImYoKmFyZ3MpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICMgVGhlc2Ugc2hvdWxkICpub3QqIGJlIHRvdWNoZWQKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF8xKHNlbGYpOgorICAgICAgICBzID0gIiIiYXBwbHkoKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzIoc2VsZik6CisgICAgICAgIHMgPSAiIiJhcHBseShmKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzMoc2VsZik6CisgICAgICAgIHMgPSAiIiJhcHBseShmLCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF80KHNlbGYpOgorICAgICAgICBzID0gIiIiYXBwbHkoZiwgYXJncywga3dkcywgZXh0cmFzKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzUoc2VsZik6CisgICAgICAgIHMgPSAiIiJhcHBseShmLCAqYXJncywgKiprd2RzKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzYoc2VsZik6CisgICAgICAgIHMgPSAiIiJhcHBseShmLCAqYXJncykiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF83KHNlbGYpOgorICAgICAgICBzID0gIiIiYXBwbHkoZnVuYz1mLCBhcmdzPWFyZ3MsIGt3ZHM9a3dkcykiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF84KHNlbGYpOgorICAgICAgICBzID0gIiIiYXBwbHkoZiwgYXJncz1hcmdzLCBrd2RzPWt3ZHMpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfOShzZWxmKToKKyAgICAgICAgcyA9ICIiImFwcGx5KGYsIGFyZ3MsIGt3ZHM9a3dkcykiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3NwYWNlXzEoc2VsZik6CisgICAgICAgIGEgPSAiIiJhcHBseSggIGYsICBhcmdzLCAgIGt3ZHMpIiIiCisgICAgICAgIGIgPSAiIiJmKCphcmdzLCAqKmt3ZHMpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYSwgYikKKworICAgIGRlZiB0ZXN0X3NwYWNlXzIoc2VsZik6CisgICAgICAgIGEgPSAiIiJhcHBseSggIGYgICxhcmdzLGt3ZHMgICApIiIiCisgICAgICAgIGIgPSAiIiJmKCphcmdzLCAqKmt3ZHMpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYSwgYikKKworY2xhc3MgVGVzdF9pbnRlcm4oRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiaW50ZXJuIgorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSAgIGludGVybiggIGEgICkiIiIKKyAgICAgICAgYSA9ICIiImltcG9ydCBzeXNcbnggPSAgIHN5cy5pbnRlcm4oICBhICApIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieSA9IGludGVybigiYiIgIyB0ZXN0CisgICAgICAgICAgICAgICkiIiIKKyAgICAgICAgYSA9ICIiImltcG9ydCBzeXNcbnkgPSBzeXMuaW50ZXJuKCJiIiAjIHRlc3QKKyAgICAgICAgICAgICAgKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInogPSBpbnRlcm4oYStiK2MuZCwgICApIiIiCisgICAgICAgIGEgPSAiIiJpbXBvcnQgc3lzXG56ID0gc3lzLmludGVybihhK2IrYy5kLCAgICkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gaW50ZXJuKGEpIiIiCisgICAgICAgIGEgPSAiIiJpbXBvcnQgc3lzXG54ID0gc3lzLmludGVybihhKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInogPSBpbnRlcm4oYStiK2MuZCwpIiIiCisgICAgICAgIGEgPSAiIiJpbXBvcnQgc3lzXG56ID0gc3lzLmludGVybihhK2IrYy5kLCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJpbnRlcm4oInklcyIgJSA1KS5yZXBsYWNlKCJ5IiwgIiIpIiIiCisgICAgICAgIGEgPSAiIiJpbXBvcnQgc3lzXG5zeXMuaW50ZXJuKCJ5JXMiICUgNSkucmVwbGFjZSgieSIsICIiKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAjIFRoZXNlIHNob3VsZCBub3QgYmUgcmVmYWN0b3JlZAorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBzID0gIiIiaW50ZXJuKGE9MSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIiaW50ZXJuKGYsIGcpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiImludGVybigqaCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIiaW50ZXJuKCoqaSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIiaW50ZXJuKCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworY2xhc3MgVGVzdF9yZWR1Y2UoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAicmVkdWNlIgorCisgICAgZGVmIHRlc3Rfc2ltcGxlX2NhbGwoc2VsZik6CisgICAgICAgIGIgPSAicmVkdWNlKGEsIGIsIGMpIgorICAgICAgICBhID0gImZyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2VcbnJlZHVjZShhLCBiLCBjKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfYnVnXzcyNTMoc2VsZik6CisgICAgICAgICMgZml4X3R1cGxlX3BhcmFtcyB3YXMgYmVpbmcgYmFkIGFuZCBvcnBoYW5pbmcgbm9kZXMgaW4gdGhlIHRyZWUuCisgICAgICAgIGIgPSAiZGVmIHgoYXJnKTogcmVkdWNlKHN1bSwgW10pIgorICAgICAgICBhID0gImZyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2VcbmRlZiB4KGFyZyk6IHJlZHVjZShzdW0sIFtdKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfY2FsbF93aXRoX2xhbWJkYShzZWxmKToKKyAgICAgICAgYiA9ICJyZWR1Y2UobGFtYmRhIHgsIHk6IHggKyB5LCBzZXEpIgorICAgICAgICBhID0gImZyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2VcbnJlZHVjZShsYW1iZGEgeCwgeTogeCArIHksIHNlcSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZChzZWxmKToKKyAgICAgICAgcyA9ICJyZWR1Y2UoYSkiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICJyZWR1Y2UoYSwgYj00MikiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICJyZWR1Y2UoYSwgYiwgYywgZCkiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICJyZWR1Y2UoKipjKSIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gInJlZHVjZSgpIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCitjbGFzcyBUZXN0X3ByaW50KEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gInByaW50IgorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInByaW50IDEsICAgMSsxLCAgIDErMSsxIiIiCisgICAgICAgIGEgPSAiIiJwcmludCgxLCAgIDErMSwgICAxKzErMSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfaWRlbXBvdGVuY3koc2VsZik6CisgICAgICAgIHMgPSAiIiJwcmludCgpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiInByaW50KCcnKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfaWRlbXBvdGVuY3lfcHJpbnRfYXNfZnVuY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYucmVmYWN0b3IuZHJpdmVyLmdyYW1tYXIgPSBweWdyYW0ucHl0aG9uX2dyYW1tYXJfbm9fcHJpbnRfc3RhdGVtZW50CisgICAgICAgIHMgPSAiIiJwcmludCgxLCAxKzEsIDErMSsxKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJwcmludCgpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiInByaW50KCcnKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgYiA9ICIiInByaW50IDEsIDErMSwgMSsxKzEiIiIKKyAgICAgICAgYSA9ICIiInByaW50KDEsIDErMSwgMSsxKzEpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJwcmludCAxLCAyIiIiCisgICAgICAgIGEgPSAiIiJwcmludCgxLCAyKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8zKHNlbGYpOgorICAgICAgICBiID0gIiIicHJpbnQiIiIKKyAgICAgICAgYSA9ICIiInByaW50KCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNChzZWxmKToKKyAgICAgICAgIyBmcm9tIGJ1ZyAzMDAwCisgICAgICAgIGIgPSAiIiJwcmludCB3aGF0ZXZlcjsgcHJpbnQiIiIKKyAgICAgICAgYSA9ICIiInByaW50KHdoYXRldmVyKTsgcHJpbnQoKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF81KHNlbGYpOgorICAgICAgICBiID0gIiIicHJpbnQ7IHByaW50IHdoYXRldmVyOyIiIgorICAgICAgICBhID0gIiIicHJpbnQoKTsgcHJpbnQod2hhdGV2ZXIpOyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90dXBsZShzZWxmKToKKyAgICAgICAgYiA9ICIiInByaW50IChhLCBiLCBjKSIiIgorICAgICAgICBhID0gIiIicHJpbnQoKGEsIGIsIGMpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAjIHRyYWlsaW5nIGNvbW1hcworCisgICAgZGVmIHRlc3RfdHJhaWxpbmdfY29tbWFfMShzZWxmKToKKyAgICAgICAgYiA9ICIiInByaW50IDEsIDIsIDMsIiIiCisgICAgICAgIGEgPSAiIiJwcmludCgxLCAyLCAzLCBlbmQ9JyAnKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90cmFpbGluZ19jb21tYV8yKHNlbGYpOgorICAgICAgICBiID0gIiIicHJpbnQgMSwgMiwiIiIKKyAgICAgICAgYSA9ICIiInByaW50KDEsIDIsIGVuZD0nICcpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RyYWlsaW5nX2NvbW1hXzMoc2VsZik6CisgICAgICAgIGIgPSAiIiJwcmludCAxLCIiIgorICAgICAgICBhID0gIiIicHJpbnQoMSwgZW5kPScgJykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgIyA+PiBzdHVmZgorCisgICAgZGVmIHRlc3RfdmFyZ3Nfd2l0aG91dF90cmFpbGluZ19jb21tYShzZWxmKToKKyAgICAgICAgYiA9ICIiInByaW50ID4+c3lzLnN0ZGVyciwgMSwgMiwgMyIiIgorICAgICAgICBhID0gIiIicHJpbnQoMSwgMiwgMywgZmlsZT1zeXMuc3RkZXJyKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF93aXRoX3RyYWlsaW5nX2NvbW1hKHNlbGYpOgorICAgICAgICBiID0gIiIicHJpbnQgPj5zeXMuc3RkZXJyLCAxLCAyLCIiIgorICAgICAgICBhID0gIiIicHJpbnQoMSwgMiwgZW5kPScgJywgZmlsZT1zeXMuc3RkZXJyKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9ub190cmFpbGluZ19jb21tYShzZWxmKToKKyAgICAgICAgYiA9ICIiInByaW50ID4+c3lzLnN0ZGVyciwgMSsxIiIiCisgICAgICAgIGEgPSAiIiJwcmludCgxKzEsIGZpbGU9c3lzLnN0ZGVycikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfc3BhY2VzX2JlZm9yZV9maWxlKHNlbGYpOgorICAgICAgICBiID0gIiIicHJpbnQgPj4gIHN5cy5zdGRlcnIiIiIKKyAgICAgICAgYSA9ICIiInByaW50KGZpbGU9c3lzLnN0ZGVycikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfd2l0aF9mdXR1cmVfcHJpbnRfZnVuY3Rpb24oc2VsZik6CisgICAgICAgIHMgPSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvblxuIiBcCisgICAgICAgICAgICAicHJpbnQoJ0hhaSEnLCBlbmQ9JyAnKSIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBiID0gInByaW50ICdIZWxsbywgd29ybGQhJyIKKyAgICAgICAgYSA9ICJwcmludCgnSGVsbG8sIHdvcmxkIScpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKworY2xhc3MgVGVzdF9leGVjKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImV4ZWMiCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uKHNlbGYpOgorICAgICAgICBiID0gIiIiICBleGVjIGNvZGUgaW4gbnMxLCAgIG5zMiIiIgorICAgICAgICBhID0gIiIiICBleGVjKGNvZGUsIG5zMSwgICBuczIpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBiID0gIiIiZXhlYyBjb2RlIiIiCisgICAgICAgIGEgPSAiIiJleGVjKGNvZGUpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3dpdGhfZ2xvYmFscyhzZWxmKToKKyAgICAgICAgYiA9ICIiImV4ZWMgY29kZSBpbiBucyIiIgorICAgICAgICBhID0gIiIiZXhlYyhjb2RlLCBucykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfd2l0aF9nbG9iYWxzX2xvY2FscyhzZWxmKToKKyAgICAgICAgYiA9ICIiImV4ZWMgY29kZSBpbiBuczEsIG5zMiIiIgorICAgICAgICBhID0gIiIiZXhlYyhjb2RlLCBuczEsIG5zMikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfY29tcGxleF8xKHNlbGYpOgorICAgICAgICBiID0gIiIiZXhlYyAoYS5iKCkpIGluIG5zIiIiCisgICAgICAgIGEgPSAiIiJleGVjKChhLmIoKSksIG5zKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9jb21wbGV4XzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJleGVjIGEuYigpICsgYyBpbiBucyIiIgorICAgICAgICBhID0gIiIiZXhlYyhhLmIoKSArIGMsIG5zKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAjIFRoZXNlIHNob3VsZCBub3QgYmUgdG91Y2hlZAorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzEoc2VsZik6CisgICAgICAgIHMgPSAiIiJleGVjKGNvZGUpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMihzZWxmKToKKyAgICAgICAgcyA9ICIiImV4ZWMgKGNvZGUpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMyhzZWxmKToKKyAgICAgICAgcyA9ICIiImV4ZWMoY29kZSwgbnMpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfNChzZWxmKToKKyAgICAgICAgcyA9ICIiImV4ZWMoY29kZSwgbnMxLCBuczIpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKK2NsYXNzIFRlc3RfcmVwcihGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJyZXByIgorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSAgIGAxICsgMmAiIiIKKyAgICAgICAgYSA9ICIiInggPSAgIHJlcHIoMSArIDIpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV8xKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGAxICsgMmAiIiIKKyAgICAgICAgYSA9ICIiInggPSByZXByKDEgKyAyKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfMihzZWxmKToKKyAgICAgICAgYiA9ICIiInkgPSBgeGAiIiIKKyAgICAgICAgYSA9ICIiInkgPSByZXByKHgpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2NvbXBsZXgoc2VsZik6CisgICAgICAgIGIgPSAiIiJ6ID0gYHlgLl9fcmVwcl9fKCkiIiIKKyAgICAgICAgYSA9ICIiInogPSByZXByKHkpLl9fcmVwcl9fKCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdHVwbGUoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYDEsIDIsIDNgIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gcmVwcigoMSwgMiwgMykpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X25lc3RlZChzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBgMSArIGAyYGAiIiIKKyAgICAgICAgYSA9ICIiInggPSByZXByKDEgKyByZXByKDIpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfdHVwbGVzKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGAxLCAyICsgYDMsIDRgYCIiIgorICAgICAgICBhID0gIiIieCA9IHJlcHIoKDEsIDIgKyByZXByKCgzLCA0KSkpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfZXhjZXB0KEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImV4Y2VwdCIKKworICAgIGRlZiB0ZXN0X3ByZWZpeF9wcmVzZXJ2YXRpb24oc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgKFJ1bnRpbWVFcnJvciwgSW1wb3J0RXJyb3IpLCAgICBlOgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCAoUnVudGltZUVycm9yLCBJbXBvcnRFcnJvcikgYXMgICAgZToKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBGb28sIGU6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEZvbyBhcyBlOgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX25vX3NwYWNlX2JlZm9yZV90YXJnZXQoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRm9vLGU6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEZvbyBhcyBlOgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdHVwbGVfdW5wYWNrKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgKGYsIGUpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICBwYXNzIiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeHh4X3RvZG9fY2hhbmdlbWU6CisgICAgICAgICAgICAgICAgICAgIChmLCBlKSA9IHh4eF90b2RvX2NoYW5nZW1lLmFyZ3MKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X211bHRpX2NsYXNzKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IChSdW50aW1lRXJyb3IsIEltcG9ydEVycm9yKSwgZToKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCAoUnVudGltZUVycm9yLCBJbXBvcnRFcnJvcikgYXMgZToKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2xpc3RfdW5wYWNrKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgW2EsIGJdOgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4eHhfdG9kb19jaGFuZ2VtZToKKyAgICAgICAgICAgICAgICBbYSwgYl0gPSB4eHhfdG9kb19jaGFuZ2VtZS5hcmdzCisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF93ZWlyZF90YXJnZXRfMShzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGRbNV06CisgICAgICAgICAgICAgICAgcGFzcyIiIgorCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHh4eF90b2RvX2NoYW5nZW1lOgorICAgICAgICAgICAgICAgIGRbNV0gPSB4eHhfdG9kb19jaGFuZ2VtZQorICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfd2VpcmRfdGFyZ2V0XzIoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBhLmZvbzoKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeHh4X3RvZG9fY2hhbmdlbWU6CisgICAgICAgICAgICAgICAgYS5mb28gPSB4eHhfdG9kb19jaGFuZ2VtZQorICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfd2VpcmRfdGFyZ2V0XzMoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBhKCkuZm9vOgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4eHhfdG9kb19jaGFuZ2VtZToKKyAgICAgICAgICAgICAgICBhKCkuZm9vID0geHh4X3RvZG9fY2hhbmdlbWUKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2JhcmVfZXhjZXB0KHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfYmFyZV9leGNlcHRfYW5kX2Vsc2VfZmluYWxseShzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbXVsdGlfZml4ZWRfZXhjZXB0c19iZWZvcmVfYmFyZV9leGNlcHQoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBiOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBiOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9vbmVfbGluZV9zdWl0ZXMoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeTogcmFpc2UgVHlwZUVycm9yCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6IHJhaXNlIFR5cGVFcnJvcgorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGU6IHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGU6IHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeTogcmFpc2UgVHlwZUVycm9yCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlOiBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgdHJ5OiByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZTogcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OiByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGU6IHBhc3MKKyAgICAgICAgICAgIGVsc2U6IGZ1bmN0aW9uKCkKKyAgICAgICAgICAgIGZpbmFsbHk6IGRvbmUoKQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHRyeTogcmFpc2UgVHlwZUVycm9yCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGU6IHBhc3MKKyAgICAgICAgICAgIGVsc2U6IGZ1bmN0aW9uKCkKKyAgICAgICAgICAgIGZpbmFsbHk6IGRvbmUoKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICMgVGhlc2Ugc2hvdWxkIG5vdCBiZSB0b3VjaGVkOgorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzEoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzIoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF8zKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IChFeGNlcHRpb24sIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworY2xhc3MgVGVzdF9yYWlzZShGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJyYWlzZSIKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBiID0gIiIicmFpc2UgRXhjZXB0aW9uLCA1IiIiCisgICAgICAgIGEgPSAiIiJyYWlzZSBFeGNlcHRpb24oNSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInJhaXNlIEV4Y2VwdGlvbiw1IiIiCisgICAgICAgIGEgPSAiIiJyYWlzZSBFeGNlcHRpb24oNSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJyYWlzZSAgIEV4Y2VwdGlvbiwgICAgNSIiIgorICAgICAgICBhID0gIiIicmFpc2UgICBFeGNlcHRpb24oNSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfd2l0aF9jb21tZW50cyhzZWxmKToKKyAgICAgICAgYiA9ICIiInJhaXNlIEV4Y2VwdGlvbiwgNSAjIGZvbyIiIgorICAgICAgICBhID0gIiIicmFpc2UgRXhjZXB0aW9uKDUpICMgZm9vIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIicmFpc2UgRSwgKDUsIDYpICUgKGEsIGIpICMgZm9vIiIiCisgICAgICAgIGEgPSAiIiJyYWlzZSBFKCg1LCA2KSAlIChhLCBiKSkgIyBmb28iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiwgNSwgNiAjIGZvbyIiIgorICAgICAgICBhID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oNSkud2l0aF90cmFjZWJhY2soNikgIyBmb28iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfTm9uZV92YWx1ZShzZWxmKToKKyAgICAgICAgYiA9ICIiInJhaXNlIEV4Y2VwdGlvbig1KSwgTm9uZSwgdGIiIiIKKyAgICAgICAgYSA9ICIiInJhaXNlIEV4Y2VwdGlvbig1KS53aXRoX3RyYWNlYmFjayh0YikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdHVwbGVfdmFsdWUoc2VsZik6CisgICAgICAgIGIgPSAiIiJyYWlzZSBFeGNlcHRpb24sICg1LCA2LCA3KSIiIgorICAgICAgICBhID0gIiIicmFpc2UgRXhjZXB0aW9uKDUsIDYsIDcpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3R1cGxlX2RldGVjdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInJhaXNlIEUsICg1LCA2KSAlIChhLCBiKSIiIgorICAgICAgICBhID0gIiIicmFpc2UgRSgoNSwgNikgJSAoYSwgYikpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3R1cGxlX2V4Y18xKHNlbGYpOgorICAgICAgICBiID0gIiIicmFpc2UgKCgoRTEsIEUyKSwgRTMpLCBFNCksIFYiIiIKKyAgICAgICAgYSA9ICIiInJhaXNlIEUxKFYpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3R1cGxlX2V4Y18yKHNlbGYpOgorICAgICAgICBiID0gIiIicmFpc2UgKEUxLCAoRTIsIEUzKSwgRTQpLCBWIiIiCisgICAgICAgIGEgPSAiIiJyYWlzZSBFMShWKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAjIFRoZXNlIHNob3VsZCBwcm9kdWNlIGEgd2FybmluZworCisgICAgZGVmIHRlc3Rfc3RyaW5nX2V4YyhzZWxmKToKKyAgICAgICAgcyA9ICIiInJhaXNlICdmb28nIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJQeXRob24gMyBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyBleGNlcHRpb25zIikKKworICAgIGRlZiB0ZXN0X3N0cmluZ19leGNfdmFsKHNlbGYpOgorICAgICAgICBzID0gIiIicmFpc2UgImZvbyIsIDUiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIlB5dGhvbiAzIGRvZXMgbm90IHN1cHBvcnQgc3RyaW5nIGV4Y2VwdGlvbnMiKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nX2V4Y192YWxfdGIoc2VsZik6CisgICAgICAgIHMgPSAiIiJyYWlzZSAiZm9vIiwgNSwgNiIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiUHl0aG9uIDMgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgZXhjZXB0aW9ucyIpCisKKyAgICAjIFRoZXNlIHNob3VsZCByZXN1bHQgaW4gdHJhY2ViYWNrLWFzc2lnbm1lbnQKKworICAgIGRlZiB0ZXN0X3RiXzEoc2VsZik6CisgICAgICAgIGIgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiwgNSwgNiIiIgorICAgICAgICBhID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oNSkud2l0aF90cmFjZWJhY2soNikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdGJfMihzZWxmKToKKyAgICAgICAgYiA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDUKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLCA1LCA2CisgICAgICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIGEgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGEgPSA1CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbig1KS53aXRoX3RyYWNlYmFjayg2KQorICAgICAgICAgICAgICAgICAgICBiID0gNiIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90Yl8zKHNlbGYpOgorICAgICAgICBiID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sNSw2IiIiCisgICAgICAgIGEgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbig1KS53aXRoX3RyYWNlYmFjayg2KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90Yl80KHNlbGYpOgorICAgICAgICBiID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBhID0gNQorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sNSw2CisgICAgICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIGEgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGEgPSA1CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbig1KS53aXRoX3RyYWNlYmFjayg2KQorICAgICAgICAgICAgICAgICAgICBiID0gNiIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90Yl81KHNlbGYpOgorICAgICAgICBiID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sICg1LCA2LCA3KSwgNiIiIgorICAgICAgICBhID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oNSwgNiwgNykud2l0aF90cmFjZWJhY2soNikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdGJfNihzZWxmKToKKyAgICAgICAgYiA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDUKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLCAoNSwgNiwgNyksIDYKKyAgICAgICAgICAgICAgICAgICAgYiA9IDYiIiIKKyAgICAgICAgYSA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDUKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKDUsIDYsIDcpLndpdGhfdHJhY2ViYWNrKDYpCisgICAgICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF90aHJvdyhGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJ0aHJvdyIKKworICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgIGIgPSAiIiJnLnRocm93KEV4Y2VwdGlvbiwgNSkiIiIKKyAgICAgICAgYSA9ICIiImcudGhyb3coRXhjZXB0aW9uKDUpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBiID0gIiIiZy50aHJvdyhFeGNlcHRpb24sNSkiIiIKKyAgICAgICAgYSA9ICIiImcudGhyb3coRXhjZXB0aW9uKDUpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8zKHNlbGYpOgorICAgICAgICBiID0gIiIiZy50aHJvdyhFeGNlcHRpb24sICg1LCA2LCA3KSkiIiIKKyAgICAgICAgYSA9ICIiImcudGhyb3coRXhjZXB0aW9uKDUsIDYsIDcpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF80KHNlbGYpOgorICAgICAgICBiID0gIiIiNSArIGcudGhyb3coRXhjZXB0aW9uLCA1KSIiIgorICAgICAgICBhID0gIiIiNSArIGcudGhyb3coRXhjZXB0aW9uKDUpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAjIFRoZXNlIHNob3VsZCBwcm9kdWNlIHdhcm5pbmdzCisKKyAgICBkZWYgdGVzdF93YXJuXzEoc2VsZik6CisgICAgICAgIHMgPSAiIiJnLnRocm93KCJmb28iKSIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiUHl0aG9uIDMgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgZXhjZXB0aW9ucyIpCisKKyAgICBkZWYgdGVzdF93YXJuXzIoc2VsZik6CisgICAgICAgIHMgPSAiIiJnLnRocm93KCJmb28iLCA1KSIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiUHl0aG9uIDMgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgZXhjZXB0aW9ucyIpCisKKyAgICBkZWYgdGVzdF93YXJuXzMoc2VsZik6CisgICAgICAgIHMgPSAiIiJnLnRocm93KCJmb28iLCA1LCA2KSIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiUHl0aG9uIDMgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgZXhjZXB0aW9ucyIpCisKKyAgICAjIFRoZXNlIHNob3VsZCBub3QgYmUgdG91Y2hlZAorCisgICAgZGVmIHRlc3RfdW50b3VjaGVkXzEoc2VsZik6CisgICAgICAgIHMgPSAiIiJnLnRocm93KEV4Y2VwdGlvbikiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VudG91Y2hlZF8yKHNlbGYpOgorICAgICAgICBzID0gIiIiZy50aHJvdyhFeGNlcHRpb24oNSwgNikpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bnRvdWNoZWRfMyhzZWxmKToKKyAgICAgICAgcyA9ICIiIjUgKyBnLnRocm93KEV4Y2VwdGlvbig1LCA2KSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICMgVGhlc2Ugc2hvdWxkIHJlc3VsdCBpbiB0cmFjZWJhY2stYXNzaWdubWVudAorCisgICAgZGVmIHRlc3RfdGJfMShzZWxmKToKKyAgICAgICAgYiA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgZy50aHJvdyhFeGNlcHRpb24sIDUsIDYpIiIiCisgICAgICAgIGEgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGcudGhyb3coRXhjZXB0aW9uKDUpLndpdGhfdHJhY2ViYWNrKDYpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90Yl8yKHNlbGYpOgorICAgICAgICBiID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBhID0gNQorICAgICAgICAgICAgICAgICAgICBnLnRocm93KEV4Y2VwdGlvbiwgNSwgNikKKyAgICAgICAgICAgICAgICAgICAgYiA9IDYiIiIKKyAgICAgICAgYSA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDUKKyAgICAgICAgICAgICAgICAgICAgZy50aHJvdyhFeGNlcHRpb24oNSkud2l0aF90cmFjZWJhY2soNikpCisgICAgICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RiXzMoc2VsZik6CisgICAgICAgIGIgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGcudGhyb3coRXhjZXB0aW9uLDUsNikiIiIKKyAgICAgICAgYSA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgZy50aHJvdyhFeGNlcHRpb24oNSkud2l0aF90cmFjZWJhY2soNikpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RiXzQoc2VsZik6CisgICAgICAgIGIgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGEgPSA1CisgICAgICAgICAgICAgICAgICAgIGcudGhyb3coRXhjZXB0aW9uLDUsNikKKyAgICAgICAgICAgICAgICAgICAgYiA9IDYiIiIKKyAgICAgICAgYSA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDUKKyAgICAgICAgICAgICAgICAgICAgZy50aHJvdyhFeGNlcHRpb24oNSkud2l0aF90cmFjZWJhY2soNikpCisgICAgICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RiXzUoc2VsZik6CisgICAgICAgIGIgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGcudGhyb3coRXhjZXB0aW9uLCAoNSwgNiwgNyksIDYpIiIiCisgICAgICAgIGEgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGcudGhyb3coRXhjZXB0aW9uKDUsIDYsIDcpLndpdGhfdHJhY2ViYWNrKDYpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90Yl82KHNlbGYpOgorICAgICAgICBiID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBhID0gNQorICAgICAgICAgICAgICAgICAgICBnLnRocm93KEV4Y2VwdGlvbiwgKDUsIDYsIDcpLCA2KQorICAgICAgICAgICAgICAgICAgICBiID0gNiIiIgorICAgICAgICBhID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBhID0gNQorICAgICAgICAgICAgICAgICAgICBnLnRocm93KEV4Y2VwdGlvbig1LCA2LCA3KS53aXRoX3RyYWNlYmFjayg2KSkKKyAgICAgICAgICAgICAgICAgICAgYiA9IDYiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdGJfNyhzZWxmKToKKyAgICAgICAgYiA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgYSArIGcudGhyb3coRXhjZXB0aW9uLCA1LCA2KSIiIgorICAgICAgICBhID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBhICsgZy50aHJvdyhFeGNlcHRpb24oNSkud2l0aF90cmFjZWJhY2soNikpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RiXzgoc2VsZik6CisgICAgICAgIGIgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGEgPSA1CisgICAgICAgICAgICAgICAgICAgIGEgKyBnLnRocm93KEV4Y2VwdGlvbiwgNSwgNikKKyAgICAgICAgICAgICAgICAgICAgYiA9IDYiIiIKKyAgICAgICAgYSA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDUKKyAgICAgICAgICAgICAgICAgICAgYSArIGcudGhyb3coRXhjZXB0aW9uKDUpLndpdGhfdHJhY2ViYWNrKDYpKQorICAgICAgICAgICAgICAgICAgICBiID0gNiIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfbG9uZyhGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJsb25nIgorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBsb25nKHgpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gaW50KHgpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJ5ID0gaXNpbnN0YW5jZSh4LCBsb25nKSIiIgorICAgICAgICBhID0gIiIieSA9IGlzaW5zdGFuY2UoeCwgaW50KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8zKHNlbGYpOgorICAgICAgICBiID0gIiIieiA9IHR5cGUoeCkgaW4gKGludCwgbG9uZykiIiIKKyAgICAgICAgYSA9ICIiInogPSB0eXBlKHgpIGluIChpbnQsIGludCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBzID0gIiIibG9uZyA9IFRydWUiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIicy5sb25nID0gVHJ1ZSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJkZWYgbG9uZygpOiBwYXNzIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiImNsYXNzIGxvbmcoKTogcGFzcyIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJkZWYgZihsb25nKTogcGFzcyIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJkZWYgZihnLCBsb25nKTogcGFzcyIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJkZWYgZih4LCBsb25nPVRydWUpOiBwYXNzIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9ICAgbG9uZyggIHggICkiIiIKKyAgICAgICAgYSA9ICIiInggPSAgIGludCggIHggICkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisKK2NsYXNzIFRlc3RfZXhlY2ZpbGUoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiZXhlY2ZpbGUiCisKKyAgICBkZWYgdGVzdF9jb252ZXJzaW9uKHNlbGYpOgorICAgICAgICBiID0gIiIiZXhlY2ZpbGUoImZuIikiIiIKKyAgICAgICAgYSA9ICIiImV4ZWMoY29tcGlsZShvcGVuKCJmbiIpLnJlYWQoKSwgImZuIiwgJ2V4ZWMnKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJleGVjZmlsZSgiZm4iLCBnbG9iKSIiIgorICAgICAgICBhID0gIiIiZXhlYyhjb21waWxlKG9wZW4oImZuIikucmVhZCgpLCAiZm4iLCAnZXhlYycpLCBnbG9iKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImV4ZWNmaWxlKCJmbiIsIGdsb2IsIGxvYykiIiIKKyAgICAgICAgYSA9ICIiImV4ZWMoY29tcGlsZShvcGVuKCJmbiIpLnJlYWQoKSwgImZuIiwgJ2V4ZWMnKSwgZ2xvYiwgbG9jKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImV4ZWNmaWxlKCJmbiIsIGdsb2JhbHM9Z2xvYikiIiIKKyAgICAgICAgYSA9ICIiImV4ZWMoY29tcGlsZShvcGVuKCJmbiIpLnJlYWQoKSwgImZuIiwgJ2V4ZWMnKSwgZ2xvYmFscz1nbG9iKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImV4ZWNmaWxlKCJmbiIsIGxvY2Fscz1sb2MpIiIiCisgICAgICAgIGEgPSAiIiJleGVjKGNvbXBpbGUob3BlbigiZm4iKS5yZWFkKCksICJmbiIsICdleGVjJyksIGxvY2Fscz1sb2MpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiZXhlY2ZpbGUoImZuIiwgZ2xvYmFscz1nbG9iLCBsb2NhbHM9bG9jKSIiIgorICAgICAgICBhID0gIiIiZXhlYyhjb21waWxlKG9wZW4oImZuIikucmVhZCgpLCAiZm4iLCAnZXhlYycpLCBnbG9iYWxzPWdsb2IsIGxvY2Fscz1sb2MpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3NwYWNpbmcoc2VsZik6CisgICAgICAgIGIgPSAiIiJleGVjZmlsZSggImZuIiApIiIiCisgICAgICAgIGEgPSAiIiJleGVjKGNvbXBpbGUob3BlbiggImZuIiApLnJlYWQoKSwgImZuIiwgJ2V4ZWMnKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJleGVjZmlsZSgiZm4iLCAgZ2xvYmFscyA9IGdsb2IpIiIiCisgICAgICAgIGEgPSAiIiJleGVjKGNvbXBpbGUob3BlbigiZm4iKS5yZWFkKCksICJmbiIsICdleGVjJyksICBnbG9iYWxzID0gZ2xvYikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisKK2NsYXNzIFRlc3RfaXNpbnN0YW5jZShGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJpc2luc3RhbmNlIgorCisgICAgZGVmIHRlc3RfcmVtb3ZlX211bHRpcGxlX2l0ZW1zKHNlbGYpOgorICAgICAgICBiID0gIiIiaXNpbnN0YW5jZSh4LCAoaW50LCBpbnQsIGludCkpIiIiCisgICAgICAgIGEgPSAiIiJpc2luc3RhbmNlKHgsIGludCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJpc2luc3RhbmNlKHgsIChpbnQsIGZsb2F0LCBpbnQsIGludCwgZmxvYXQpKSIiIgorICAgICAgICBhID0gIiIiaXNpbnN0YW5jZSh4LCAoaW50LCBmbG9hdCkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiaXNpbnN0YW5jZSh4LCAoaW50LCBmbG9hdCwgaW50LCBpbnQsIGZsb2F0LCBzdHIpKSIiIgorICAgICAgICBhID0gIiIiaXNpbnN0YW5jZSh4LCAoaW50LCBmbG9hdCwgc3RyKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJpc2luc3RhbmNlKGZvbygpICsgYmFyKCksICh4KCksIHkoKSwgeCgpLCBpbnQsIGludCkpIiIiCisgICAgICAgIGEgPSAiIiJpc2luc3RhbmNlKGZvbygpICsgYmFyKCksICh4KCksIHkoKSwgeCgpLCBpbnQpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uKHNlbGYpOgorICAgICAgICBiID0gIiIiaWYgICAgaXNpbnN0YW5jZSggIGZvbygpLCAoICBiYXIsIGJhciwgYmF6ICkpIDogcGFzcyIiIgorICAgICAgICBhID0gIiIiaWYgICAgaXNpbnN0YW5jZSggIGZvbygpLCAoICBiYXIsIGJheiApKSA6IHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBzZWxmLnVuY2hhbmdlZCgiaXNpbnN0YW5jZSh4LCAoc3RyLCBpbnQpKSIpCisKK2NsYXNzIFRlc3RfZGljdChGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJkaWN0IgorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICJpZiAgIGQuIGtleXMgICggICkgIDogcGFzcyIKKyAgICAgICAgYSA9ICJpZiAgIGxpc3QoZC4ga2V5cyAgKCAgKSkgIDogcGFzcyIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiaWYgICBkLiBpdGVtcyAgKCAgKSAgOiBwYXNzIgorICAgICAgICBhID0gImlmICAgbGlzdChkLiBpdGVtcyAgKCAgKSkgIDogcGFzcyIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiaWYgICBkLiBpdGVya2V5cyAgKCApICA6IHBhc3MiCisgICAgICAgIGEgPSAiaWYgICBpdGVyKGQuIGtleXMgICggKSkgIDogcGFzcyIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiW2kgZm9yIGkgaW4gICAgZC4gIGl0ZXJrZXlzKCAgKSAgXSIKKyAgICAgICAgYSA9ICJbaSBmb3IgaSBpbiAgICBkLiAga2V5cyggICkgIF0iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImlmICAgZC4gdmlld2tleXMgICggKSAgOiBwYXNzIgorICAgICAgICBhID0gImlmICAgZC4ga2V5cyAgKCApICA6IHBhc3MiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIltpIGZvciBpIGluICAgIGQuICB2aWV3a2V5cyggICkgIF0iCisgICAgICAgIGEgPSAiW2kgZm9yIGkgaW4gICAgZC4gIGtleXMoICApICBdIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90cmFpbGluZ19jb21tZW50KHNlbGYpOgorICAgICAgICBiID0gImQua2V5cygpICMgZm9vIgorICAgICAgICBhID0gImxpc3QoZC5rZXlzKCkpICMgZm9vIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICJkLml0ZW1zKCkgICMgZm9vIgorICAgICAgICBhID0gImxpc3QoZC5pdGVtcygpKSAgIyBmb28iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImQuaXRlcmtleXMoKSAgIyBmb28iCisgICAgICAgIGEgPSAiaXRlcihkLmtleXMoKSkgICMgZm9vIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIltpIGZvciBpIGluIGQuaXRlcmtleXMoKSAjIGZvbworICAgICAgICAgICAgICAgXSIiIgorICAgICAgICBhID0gIiIiW2kgZm9yIGkgaW4gZC5rZXlzKCkgIyBmb28KKyAgICAgICAgICAgICAgIF0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJbaSBmb3IgaSBpbiBkLml0ZXJrZXlzKCkgIyBmb28KKyAgICAgICAgICAgICAgIF0iIiIKKyAgICAgICAgYSA9ICIiIltpIGZvciBpIGluIGQua2V5cygpICMgZm9vCisgICAgICAgICAgICAgICBdIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImQudmlld2l0ZW1zKCkgICMgZm9vIgorICAgICAgICBhID0gImQuaXRlbXMoKSAgIyBmb28iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZChzZWxmKToKKyAgICAgICAgZm9yIHdyYXBwZXIgaW4gZml4ZXJfdXRpbC5jb25zdW1pbmdfY2FsbHM6CisgICAgICAgICAgICBzID0gInMgPSAlcyhkLmtleXMoKSkiICUgd3JhcHBlcgorICAgICAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICAgICAgcyA9ICJzID0gJXMoZC52YWx1ZXMoKSkiICUgd3JhcHBlcgorICAgICAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICAgICAgcyA9ICJzID0gJXMoZC5pdGVtcygpKSIgJSB3cmFwcGVyCisgICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfMDEoc2VsZik6CisgICAgICAgIGIgPSAiZC5rZXlzKCkiCisgICAgICAgIGEgPSAibGlzdChkLmtleXMoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImFbMF0uZm9vKCkua2V5cygpIgorICAgICAgICBhID0gImxpc3QoYVswXS5mb28oKS5rZXlzKCkpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8wMihzZWxmKToKKyAgICAgICAgYiA9ICJkLml0ZW1zKCkiCisgICAgICAgIGEgPSAibGlzdChkLml0ZW1zKCkpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8wMyhzZWxmKToKKyAgICAgICAgYiA9ICJkLnZhbHVlcygpIgorICAgICAgICBhID0gImxpc3QoZC52YWx1ZXMoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzA0KHNlbGYpOgorICAgICAgICBiID0gImQuaXRlcmtleXMoKSIKKyAgICAgICAgYSA9ICJpdGVyKGQua2V5cygpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMDUoc2VsZik6CisgICAgICAgIGIgPSAiZC5pdGVyaXRlbXMoKSIKKyAgICAgICAgYSA9ICJpdGVyKGQuaXRlbXMoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzA2KHNlbGYpOgorICAgICAgICBiID0gImQuaXRlcnZhbHVlcygpIgorICAgICAgICBhID0gIml0ZXIoZC52YWx1ZXMoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzA3KHNlbGYpOgorICAgICAgICBzID0gImxpc3QoZC5rZXlzKCkpIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfMDgoc2VsZik6CisgICAgICAgIHMgPSAic29ydGVkKGQua2V5cygpKSIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0XzA5KHNlbGYpOgorICAgICAgICBiID0gIml0ZXIoZC5rZXlzKCkpIgorICAgICAgICBhID0gIml0ZXIobGlzdChkLmtleXMoKSkpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xMChzZWxmKToKKyAgICAgICAgYiA9ICJmb28oZC5rZXlzKCkpIgorICAgICAgICBhID0gImZvbyhsaXN0KGQua2V5cygpKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzExKHNlbGYpOgorICAgICAgICBiID0gImZvciBpIGluIGQua2V5cygpOiBwcmludCBpIgorICAgICAgICBhID0gImZvciBpIGluIGxpc3QoZC5rZXlzKCkpOiBwcmludCBpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xMihzZWxmKToKKyAgICAgICAgYiA9ICJmb3IgaSBpbiBkLml0ZXJrZXlzKCk6IHByaW50IGkiCisgICAgICAgIGEgPSAiZm9yIGkgaW4gZC5rZXlzKCk6IHByaW50IGkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzEzKHNlbGYpOgorICAgICAgICBiID0gIltpIGZvciBpIGluIGQua2V5cygpXSIKKyAgICAgICAgYSA9ICJbaSBmb3IgaSBpbiBsaXN0KGQua2V5cygpKV0iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzE0KHNlbGYpOgorICAgICAgICBiID0gIltpIGZvciBpIGluIGQuaXRlcmtleXMoKV0iCisgICAgICAgIGEgPSAiW2kgZm9yIGkgaW4gZC5rZXlzKCldIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xNShzZWxmKToKKyAgICAgICAgYiA9ICIoaSBmb3IgaSBpbiBkLmtleXMoKSkiCisgICAgICAgIGEgPSAiKGkgZm9yIGkgaW4gbGlzdChkLmtleXMoKSkpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xNihzZWxmKToKKyAgICAgICAgYiA9ICIoaSBmb3IgaSBpbiBkLml0ZXJrZXlzKCkpIgorICAgICAgICBhID0gIihpIGZvciBpIGluIGQua2V5cygpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMTcoc2VsZik6CisgICAgICAgIGIgPSAiaXRlcihkLml0ZXJrZXlzKCkpIgorICAgICAgICBhID0gIml0ZXIoZC5rZXlzKCkpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xOChzZWxmKToKKyAgICAgICAgYiA9ICJsaXN0KGQuaXRlcmtleXMoKSkiCisgICAgICAgIGEgPSAibGlzdChkLmtleXMoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzE5KHNlbGYpOgorICAgICAgICBiID0gInNvcnRlZChkLml0ZXJrZXlzKCkpIgorICAgICAgICBhID0gInNvcnRlZChkLmtleXMoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzIwKHNlbGYpOgorICAgICAgICBiID0gImZvbyhkLml0ZXJrZXlzKCkpIgorICAgICAgICBhID0gImZvbyhpdGVyKGQua2V5cygpKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzIxKHNlbGYpOgorICAgICAgICBiID0gInByaW50IGguaXRlcmtleXMoKS5uZXh0KCkiCisgICAgICAgIGEgPSAicHJpbnQgaXRlcihoLmtleXMoKSkubmV4dCgpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yMihzZWxmKToKKyAgICAgICAgYiA9ICJwcmludCBoLmtleXMoKVswXSIKKyAgICAgICAgYSA9ICJwcmludCBsaXN0KGgua2V5cygpKVswXSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMjMoc2VsZik6CisgICAgICAgIGIgPSAicHJpbnQgbGlzdChoLml0ZXJrZXlzKCkubmV4dCgpKSIKKyAgICAgICAgYSA9ICJwcmludCBsaXN0KGl0ZXIoaC5rZXlzKCkpLm5leHQoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzI0KHNlbGYpOgorICAgICAgICBiID0gImZvciB4IGluIGgua2V5cygpWzBdOiBwcmludCB4IgorICAgICAgICBhID0gImZvciB4IGluIGxpc3QoaC5rZXlzKCkpWzBdOiBwcmludCB4IgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yNShzZWxmKToKKyAgICAgICAgYiA9ICJkLnZpZXdrZXlzKCkiCisgICAgICAgIGEgPSAiZC5rZXlzKCkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzI2KHNlbGYpOgorICAgICAgICBiID0gImQudmlld2l0ZW1zKCkiCisgICAgICAgIGEgPSAiZC5pdGVtcygpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yNyhzZWxmKToKKyAgICAgICAgYiA9ICJkLnZpZXd2YWx1ZXMoKSIKKyAgICAgICAgYSA9ICJkLnZhbHVlcygpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xNChzZWxmKToKKyAgICAgICAgYiA9ICJbaSBmb3IgaSBpbiBkLnZpZXdrZXlzKCldIgorICAgICAgICBhID0gIltpIGZvciBpIGluIGQua2V5cygpXSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMTUoc2VsZik6CisgICAgICAgIGIgPSAiKGkgZm9yIGkgaW4gZC52aWV3a2V5cygpKSIKKyAgICAgICAgYSA9ICIoaSBmb3IgaSBpbiBkLmtleXMoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzE3KHNlbGYpOgorICAgICAgICBiID0gIml0ZXIoZC52aWV3a2V5cygpKSIKKyAgICAgICAgYSA9ICJpdGVyKGQua2V5cygpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMTgoc2VsZik6CisgICAgICAgIGIgPSAibGlzdChkLnZpZXdrZXlzKCkpIgorICAgICAgICBhID0gImxpc3QoZC5rZXlzKCkpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xOShzZWxmKToKKyAgICAgICAgYiA9ICJzb3J0ZWQoZC52aWV3a2V5cygpKSIKKyAgICAgICAgYSA9ICJzb3J0ZWQoZC5rZXlzKCkpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfeHJhbmdlKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gInhyYW5nZSIKKworICAgIGRlZiB0ZXN0X3ByZWZpeF9wcmVzZXJ2YXRpb24oc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gICAgeHJhbmdlKCAgMTAgICkiIiIKKyAgICAgICAgYSA9ICIiInggPSAgICByYW5nZSggIDEwICApIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieCA9IHhyYW5nZSggIDEgICwgIDEwICAgKSIiIgorICAgICAgICBhID0gIiIieCA9IHJhbmdlKCAgMSAgLCAgMTAgICApIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieCA9IHhyYW5nZSggIDAgICwgIDEwICwgIDIgKSIiIgorICAgICAgICBhID0gIiIieCA9IHJhbmdlKCAgMCAgLCAgMTAgLCAgMiApIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3NpbmdsZV9hcmcoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0geHJhbmdlKDEwKSIiIgorICAgICAgICBhID0gIiIieCA9IHJhbmdlKDEwKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90d29fYXJncyhzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSB4cmFuZ2UoMSwgMTApIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gcmFuZ2UoMSwgMTApIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RocmVlX2FyZ3Moc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0geHJhbmdlKDAsIDEwLCAyKSIiIgorICAgICAgICBhID0gIiIieCA9IHJhbmdlKDAsIDEwLCAyKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF93cmFwX2luX2xpc3Qoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gcmFuZ2UoMTAsIDMsIDkpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gbGlzdChyYW5nZSgxMCwgMywgOSkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieCA9IGZvbyhyYW5nZSgxMCwgMywgOSkpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gZm9vKGxpc3QocmFuZ2UoMTAsIDMsIDkpKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0gcmFuZ2UoMTAsIDMsIDkpICsgWzRdIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gbGlzdChyYW5nZSgxMCwgMywgOSkpICsgWzRdIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieCA9IHJhbmdlKDEwKVs6Oi0xXSIiIgorICAgICAgICBhID0gIiIieCA9IGxpc3QocmFuZ2UoMTApKVs6Oi0xXSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInggPSByYW5nZSgxMCkgIFszXSIiIgorICAgICAgICBhID0gIiIieCA9IGxpc3QocmFuZ2UoMTApKSAgWzNdIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3hyYW5nZV9pbl9mb3Ioc2VsZik6CisgICAgICAgIGIgPSAiIiJmb3IgaSBpbiB4cmFuZ2UoMTApOlxuICAgIGo9aSIiIgorICAgICAgICBhID0gIiIiZm9yIGkgaW4gcmFuZ2UoMTApOlxuICAgIGo9aSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIltpIGZvciBpIGluIHhyYW5nZSgxMCldIiIiCisgICAgICAgIGEgPSAiIiJbaSBmb3IgaSBpbiByYW5nZSgxMCldIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3JhbmdlX2luX2ZvcihzZWxmKToKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoImZvciBpIGluIHJhbmdlKDEwKTogcGFzcyIpCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKCJbaSBmb3IgaSBpbiByYW5nZSgxMCldIikKKworICAgIGRlZiB0ZXN0X2luX2NvbnRhaW5zX3Rlc3Qoc2VsZik6CisgICAgICAgIHNlbGYudW5jaGFuZ2VkKCJ4IGluIHJhbmdlKDEwLCAzLCA5KSIpCisKKyAgICBkZWYgdGVzdF9pbl9jb25zdW1pbmdfY29udGV4dChzZWxmKToKKyAgICAgICAgZm9yIGNhbGwgaW4gZml4ZXJfdXRpbC5jb25zdW1pbmdfY2FsbHM6CisgICAgICAgICAgICBzZWxmLnVuY2hhbmdlZCgiYSA9ICVzKHJhbmdlKDEwKSkiICUgY2FsbCkKKworY2xhc3MgVGVzdF94cmFuZ2Vfd2l0aF9yZWR1Y2UoRml4ZXJUZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RfeHJhbmdlX3dpdGhfcmVkdWNlLCBzZWxmKS5zZXRVcChbInhyYW5nZSIsICJyZWR1Y2UiXSkKKworICAgIGRlZiB0ZXN0X2RvdWJsZV90cmFuc2Zvcm0oc2VsZik6CisgICAgICAgIGIgPSAiIiJyZWR1Y2UoeCwgeHJhbmdlKDUpKSIiIgorICAgICAgICBhID0gIiIiZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQorcmVkdWNlKHgsIHJhbmdlKDUpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfcmF3X2lucHV0KEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gInJhd19pbnB1dCIKKworICAgIGRlZiB0ZXN0X3ByZWZpeF9wcmVzZXJ2YXRpb24oc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gICAgcmF3X2lucHV0KCAgICkiIiIKKyAgICAgICAgYSA9ICIiInggPSAgICBpbnB1dCggICApIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieCA9IHJhd19pbnB1dCggICAnJyAgICkiIiIKKyAgICAgICAgYSA9ICIiInggPSBpbnB1dCggICAnJyAgICkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSByYXdfaW5wdXQoKSIiIgorICAgICAgICBhID0gIiIieCA9IGlucHV0KCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSByYXdfaW5wdXQoJycpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gaW5wdXQoJycpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzMoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gcmF3X2lucHV0KCdwcm9tcHQnKSIiIgorICAgICAgICBhID0gIiIieCA9IGlucHV0KCdwcm9tcHQnKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF80KHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IHJhd19pbnB1dChmb28oYSkgKyA2KSIiIgorICAgICAgICBhID0gIiIieCA9IGlucHV0KGZvbyhhKSArIDYpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzUoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gcmF3X2lucHV0KGludml0ZSkuc3BsaXQoKSIiIgorICAgICAgICBhID0gIiIieCA9IGlucHV0KGludml0ZSkuc3BsaXQoKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF82KHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IHJhd19pbnB1dChpbnZpdGUpIC4gc3BsaXQgKCkiIiIKKyAgICAgICAgYSA9ICIiInggPSBpbnB1dChpbnZpdGUpIC4gc3BsaXQgKCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfOChzZWxmKToKKyAgICAgICAgYiA9ICJ4ID0gaW50KHJhd19pbnB1dCgpKSIKKyAgICAgICAgYSA9ICJ4ID0gaW50KGlucHV0KCkpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfZnVuY2F0dHJzKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImZ1bmNhdHRycyIKKworICAgIGF0dHJzID0gWyJjbG9zdXJlIiwgImRvYyIsICJuYW1lIiwgImRlZmF1bHRzIiwgImNvZGUiLCAiZ2xvYmFscyIsICJkaWN0Il0KKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLmF0dHJzOgorICAgICAgICAgICAgYiA9ICJhLmZ1bmNfJXMiICUgYXR0cgorICAgICAgICAgICAgYSA9ICJhLl9fJXNfXyIgJSBhdHRyCisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgICAgIGIgPSAic2VsZi5mb28uZnVuY18lcy5mb29fYmFyIiAlIGF0dHIKKyAgICAgICAgICAgIGEgPSAic2VsZi5mb28uX18lc19fLmZvb19iYXIiICUgYXR0cgorICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLmF0dHJzOgorICAgICAgICAgICAgcyA9ICJmb28oZnVuY18lcyArIDUpIiAlIGF0dHIKKyAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgICAgIHMgPSAiZihmb28uX18lc19fKSIgJSBhdHRyCisgICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgICAgICBzID0gImYoZm9vLl9fJXNfXy5mb28pIiAlIGF0dHIKKyAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKK2NsYXNzIFRlc3RfeHJlYWRsaW5lcyhGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJ4cmVhZGxpbmVzIgorCisgICAgZGVmIHRlc3RfY2FsbChzZWxmKToKKyAgICAgICAgYiA9ICJmb3IgeCBpbiBmLnhyZWFkbGluZXMoKTogcGFzcyIKKyAgICAgICAgYSA9ICJmb3IgeCBpbiBmOiBwYXNzIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICJmb3IgeCBpbiBmb28oKS54cmVhZGxpbmVzKCk6IHBhc3MiCisgICAgICAgIGEgPSAiZm9yIHggaW4gZm9vKCk6IHBhc3MiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImZvciB4IGluICg1ICsgZm9vKCkpLnhyZWFkbGluZXMoKTogcGFzcyIKKyAgICAgICAgYSA9ICJmb3IgeCBpbiAoNSArIGZvbygpKTogcGFzcyIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfYXR0cl9yZWYoc2VsZik6CisgICAgICAgIGIgPSAiZm9vKGYueHJlYWRsaW5lcyArIDUpIgorICAgICAgICBhID0gImZvbyhmLl9faXRlcl9fICsgNSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImZvbyhmKCkueHJlYWRsaW5lcyArIDUpIgorICAgICAgICBhID0gImZvbyhmKCkuX19pdGVyX18gKyA1KSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiZm9vKCg1ICsgZigpKS54cmVhZGxpbmVzICsgNSkiCisgICAgICAgIGEgPSAiZm9vKCg1ICsgZigpKS5fX2l0ZXJfXyArIDUpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIHMgPSAiZm9yIHggaW4gZi54cmVhZGxpbmVzKDUpOiBwYXNzIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiZm9yIHggaW4gZi54cmVhZGxpbmVzKGs9NSk6IHBhc3MiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICJmb3IgeCBpbiBmLnhyZWFkbGluZXMoKmssICoqdik6IHBhc3MiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICJmb28oeHJlYWRsaW5lcykiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKworY2xhc3MgSW1wb3J0c0ZpeGVyVGVzdHM6CisKKyAgICBkZWYgdGVzdF9pbXBvcnRfbW9kdWxlKHNlbGYpOgorICAgICAgICBmb3Igb2xkLCBuZXcgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBiID0gImltcG9ydCAlcyIgJSBvbGQKKyAgICAgICAgICAgIGEgPSAiaW1wb3J0ICVzIiAlIG5ldworICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICAgICBiID0gImltcG9ydCBmb28sICVzLCBiYXIiICUgb2xkCisgICAgICAgICAgICBhID0gImltcG9ydCBmb28sICVzLCBiYXIiICUgbmV3CisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfZnJvbShzZWxmKToKKyAgICAgICAgZm9yIG9sZCwgbmV3IGluIHNlbGYubW9kdWxlcy5pdGVtcygpOgorICAgICAgICAgICAgYiA9ICJmcm9tICVzIGltcG9ydCBmb28iICUgb2xkCisgICAgICAgICAgICBhID0gImZyb20gJXMgaW1wb3J0IGZvbyIgJSBuZXcKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAgICAgYiA9ICJmcm9tICVzIGltcG9ydCBmb28sIGJhciIgJSBvbGQKKyAgICAgICAgICAgIGEgPSAiZnJvbSAlcyBpbXBvcnQgZm9vLCBiYXIiICUgbmV3CisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgICAgIGIgPSAiZnJvbSAlcyBpbXBvcnQgKHllcywgbm8pIiAlIG9sZAorICAgICAgICAgICAgYSA9ICJmcm9tICVzIGltcG9ydCAoeWVzLCBubykiICUgbmV3CisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfbW9kdWxlX2FzKHNlbGYpOgorICAgICAgICBmb3Igb2xkLCBuZXcgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBiID0gImltcG9ydCAlcyBhcyBmb29fYmFyIiAlIG9sZAorICAgICAgICAgICAgYSA9ICJpbXBvcnQgJXMgYXMgZm9vX2JhciIgJSBuZXcKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAgICAgYiA9ICJpbXBvcnQgJXMgYXMgZm9vX2JhciIgJSBvbGQKKyAgICAgICAgICAgIGEgPSAiaW1wb3J0ICVzIGFzIGZvb19iYXIiICUgbmV3CisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfZnJvbV9hcyhzZWxmKToKKyAgICAgICAgZm9yIG9sZCwgbmV3IGluIHNlbGYubW9kdWxlcy5pdGVtcygpOgorICAgICAgICAgICAgYiA9ICJmcm9tICVzIGltcG9ydCBmb28gYXMgYmFyIiAlIG9sZAorICAgICAgICAgICAgYSA9ICJmcm9tICVzIGltcG9ydCBmb28gYXMgYmFyIiAlIG5ldworICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfc3RhcihzZWxmKToKKyAgICAgICAgZm9yIG9sZCwgbmV3IGluIHNlbGYubW9kdWxlcy5pdGVtcygpOgorICAgICAgICAgICAgYiA9ICJmcm9tICVzIGltcG9ydCAqIiAlIG9sZAorICAgICAgICAgICAgYSA9ICJmcm9tICVzIGltcG9ydCAqIiAlIG5ldworICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X21vZHVsZV91c2FnZShzZWxmKToKKyAgICAgICAgZm9yIG9sZCwgbmV3IGluIHNlbGYubW9kdWxlcy5pdGVtcygpOgorICAgICAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgICAgIGltcG9ydCAlcworICAgICAgICAgICAgICAgIGZvbyglcy5iYXIpCisgICAgICAgICAgICAgICAgIiIiICUgKG9sZCwgb2xkKQorICAgICAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgICAgIGltcG9ydCAlcworICAgICAgICAgICAgICAgIGZvbyglcy5iYXIpCisgICAgICAgICAgICAgICAgIiIiICUgKG5ldywgbmV3KQorICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICAgICBiID0gIiIiCisgICAgICAgICAgICAgICAgZnJvbSAlcyBpbXBvcnQgeAorICAgICAgICAgICAgICAgICVzID0gMjMKKyAgICAgICAgICAgICAgICAiIiIgJSAob2xkLCBvbGQpCisgICAgICAgICAgICBhID0gIiIiCisgICAgICAgICAgICAgICAgZnJvbSAlcyBpbXBvcnQgeAorICAgICAgICAgICAgICAgICVzID0gMjMKKyAgICAgICAgICAgICAgICAiIiIgJSAobmV3LCBvbGQpCisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgICAgICAlcy5tZXRob2QoKQorICAgICAgICAgICAgICAgICIiIiAlIChvbGQsKQorICAgICAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICAgICAgIyB0ZXN0IG5lc3RlZCB1c2FnZQorICAgICAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgICAgIGltcG9ydCAlcworICAgICAgICAgICAgICAgICVzLmJhciglcy5mb28pCisgICAgICAgICAgICAgICAgIiIiICUgKG9sZCwgb2xkLCBvbGQpCisgICAgICAgICAgICBhID0gIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0ICVzCisgICAgICAgICAgICAgICAgJXMuYmFyKCVzLmZvbykKKyAgICAgICAgICAgICAgICAiIiIgJSAobmV3LCBuZXcsIG5ldykKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgICAgIGltcG9ydCAlcworICAgICAgICAgICAgICAgIHguJXMKKyAgICAgICAgICAgICAgICAiIiIgJSAob2xkLCBvbGQpCisgICAgICAgICAgICBhID0gIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0ICVzCisgICAgICAgICAgICAgICAgeC4lcworICAgICAgICAgICAgICAgICIiIiAlIChuZXcsIG9sZCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworCitjbGFzcyBUZXN0X2ltcG9ydHMoRml4ZXJUZXN0Q2FzZSwgSW1wb3J0c0ZpeGVyVGVzdHMpOgorICAgIGZpeGVyID0gImltcG9ydHMiCisgICAgZnJvbSAuLmZpeGVzLmZpeF9pbXBvcnRzIGltcG9ydCBNQVBQSU5HIGFzIG1vZHVsZXMKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX2ltcG9ydHMoc2VsZik6CisgICAgICAgIGIgPSAiIiJpbXBvcnQgdXJscGFyc2UsIGNTdHJpbmdJTyIiIgorICAgICAgICBhID0gIiIiaW1wb3J0IHVybGxpYi5wYXJzZSwgaW8iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfaW1wb3J0c19hcyhzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IGNvcHlfcmVnIGFzIGJhciwgSFRNTFBhcnNlciBhcyBmb28sIHVybHBhcnNlCisgICAgICAgICAgICBzID0gdXJscGFyc2Uuc3BhbShiYXIuZm9vKCkpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IGNvcHlyZWcgYXMgYmFyLCBodG1sLnBhcnNlciBhcyBmb28sIHVybGxpYi5wYXJzZQorICAgICAgICAgICAgcyA9IHVybGxpYi5wYXJzZS5zcGFtKGJhci5mb28oKSkKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKworY2xhc3MgVGVzdF9pbXBvcnRzMihGaXhlclRlc3RDYXNlLCBJbXBvcnRzRml4ZXJUZXN0cyk6CisgICAgZml4ZXIgPSAiaW1wb3J0czIiCisgICAgZnJvbSAuLmZpeGVzLmZpeF9pbXBvcnRzMiBpbXBvcnQgTUFQUElORyBhcyBtb2R1bGVzCisKKworY2xhc3MgVGVzdF9pbXBvcnRzX2ZpeGVyX29yZGVyKEZpeGVyVGVzdENhc2UsIEltcG9ydHNGaXhlclRlc3RzKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdF9pbXBvcnRzX2ZpeGVyX29yZGVyLCBzZWxmKS5zZXRVcChbJ2ltcG9ydHMnLCAnaW1wb3J0czInXSkKKyAgICAgICAgZnJvbSAuLmZpeGVzLmZpeF9pbXBvcnRzMiBpbXBvcnQgTUFQUElORyBhcyBtYXBwaW5nMgorICAgICAgICBzZWxmLm1vZHVsZXMgPSBtYXBwaW5nMi5jb3B5KCkKKyAgICAgICAgZnJvbSAuLmZpeGVzLmZpeF9pbXBvcnRzIGltcG9ydCBNQVBQSU5HIGFzIG1hcHBpbmcxCisgICAgICAgIGZvciBrZXkgaW4gKCdkYmhhc2gnLCAnZHVtYmRibScsICdkYm0nLCAnZ2RibScpOgorICAgICAgICAgICAgc2VsZi5tb2R1bGVzW2tleV0gPSBtYXBwaW5nMVtrZXldCisKKyAgICBkZWYgdGVzdF9hZnRlcl9sb2NhbF9pbXBvcnRzX3JlZmFjdG9yaW5nKHNlbGYpOgorICAgICAgICBmb3IgZml4IGluICgiaW1wb3J0cyIsICJpbXBvcnRzMiIpOgorICAgICAgICAgICAgc2VsZi5maXhlciA9IGZpeAorICAgICAgICAgICAgc2VsZi5hc3NlcnRfcnVuc19hZnRlcigiaW1wb3J0IikKKworCitjbGFzcyBUZXN0X3VybGxpYihGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJ1cmxsaWIiCisgICAgZnJvbSAuLmZpeGVzLmZpeF91cmxsaWIgaW1wb3J0IE1BUFBJTkcgYXMgbW9kdWxlcworCisgICAgZGVmIHRlc3RfaW1wb3J0X21vZHVsZShzZWxmKToKKyAgICAgICAgZm9yIG9sZCwgY2hhbmdlcyBpbiBzZWxmLm1vZHVsZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGIgPSAiaW1wb3J0ICVzIiAlIG9sZAorICAgICAgICAgICAgYSA9ICJpbXBvcnQgJXMiICUgIiwgIi5qb2luKG1hcChpdGVtZ2V0dGVyKDApLCBjaGFuZ2VzKSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9mcm9tKHNlbGYpOgorICAgICAgICBmb3Igb2xkLCBjaGFuZ2VzIGluIHNlbGYubW9kdWxlcy5pdGVtcygpOgorICAgICAgICAgICAgYWxsX21lbWJlcnMgPSBbXQorICAgICAgICAgICAgZm9yIG5ldywgbWVtYmVycyBpbiBjaGFuZ2VzOgorICAgICAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gbWVtYmVyczoKKyAgICAgICAgICAgICAgICAgICAgYWxsX21lbWJlcnMuYXBwZW5kKG1lbWJlcikKKyAgICAgICAgICAgICAgICAgICAgYiA9ICJmcm9tICVzIGltcG9ydCAlcyIgJSAob2xkLCBtZW1iZXIpCisgICAgICAgICAgICAgICAgICAgIGEgPSAiZnJvbSAlcyBpbXBvcnQgJXMiICUgKG5ldywgbWVtYmVyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgICAgICAgICAgICAgcyA9ICJmcm9tIGZvbyBpbXBvcnQgJXMiICUgbWVtYmVyCisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgICAgICAgICBiID0gImZyb20gJXMgaW1wb3J0ICVzIiAlIChvbGQsICIsICIuam9pbihtZW1iZXJzKSkKKyAgICAgICAgICAgICAgICBhID0gImZyb20gJXMgaW1wb3J0ICVzIiAlIChuZXcsICIsICIuam9pbihtZW1iZXJzKSkKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgICAgICAgICBzID0gImZyb20gZm9vIGltcG9ydCAlcyIgJSAiLCAiLmpvaW4obWVtYmVycykKKyAgICAgICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgICAgICAjIHRlc3QgdGhlIGJyZWFraW5nIG9mIGEgbW9kdWxlIGludG8gbXVsdGlwbGUgcmVwbGFjZW1lbnRzCisgICAgICAgICAgICBiID0gImZyb20gJXMgaW1wb3J0ICVzIiAlIChvbGQsICIsICIuam9pbihhbGxfbWVtYmVycykpCisgICAgICAgICAgICBhID0gIlxuIi5qb2luKFsiZnJvbSAlcyBpbXBvcnQgJXMiICUgKG5ldywgIiwgIi5qb2luKG1lbWJlcnMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobmV3LCBtZW1iZXJzKSBpbiBjaGFuZ2VzXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9tb2R1bGVfYXMoc2VsZik6CisgICAgICAgIGZvciBvbGQgaW4gc2VsZi5tb2R1bGVzOgorICAgICAgICAgICAgcyA9ICJpbXBvcnQgJXMgYXMgZm9vIiAlIG9sZAorICAgICAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIlRoaXMgbW9kdWxlIGlzIG5vdyBtdWx0aXBsZSBtb2R1bGVzIikKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9mcm9tX2FzKHNlbGYpOgorICAgICAgICBmb3Igb2xkLCBjaGFuZ2VzIGluIHNlbGYubW9kdWxlcy5pdGVtcygpOgorICAgICAgICAgICAgZm9yIG5ldywgbWVtYmVycyBpbiBjaGFuZ2VzOgorICAgICAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gbWVtYmVyczoKKyAgICAgICAgICAgICAgICAgICAgYiA9ICJmcm9tICVzIGltcG9ydCAlcyBhcyBmb29fYmFyIiAlIChvbGQsIG1lbWJlcikKKyAgICAgICAgICAgICAgICAgICAgYSA9ICJmcm9tICVzIGltcG9ydCAlcyBhcyBmb29fYmFyIiAlIChuZXcsIG1lbWJlcikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorICAgICAgICAgICAgICAgICAgICBiID0gImZyb20gJXMgaW1wb3J0ICVzIGFzIGJsYWgsICVzIiAlIChvbGQsIG1lbWJlciwgbWVtYmVyKQorICAgICAgICAgICAgICAgICAgICBhID0gImZyb20gJXMgaW1wb3J0ICVzIGFzIGJsYWgsICVzIiAlIChuZXcsIG1lbWJlciwgbWVtYmVyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9zdGFyKHNlbGYpOgorICAgICAgICBmb3Igb2xkIGluIHNlbGYubW9kdWxlczoKKyAgICAgICAgICAgIHMgPSAiZnJvbSAlcyBpbXBvcnQgKiIgJSBvbGQKKyAgICAgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYW5ub3QgaGFuZGxlIHN0YXIgaW1wb3J0cyIpCisKKyAgICBkZWYgdGVzdF9pbmRlbnRlZChzZWxmKToKKyAgICAgICAgYiA9ICIiIgorZGVmIGZvbygpOgorICAgIGZyb20gdXJsbGliIGltcG9ydCB1cmxlbmNvZGUsIHVybG9wZW4KKyIiIgorICAgICAgICBhID0gIiIiCitkZWYgZm9vKCk6CisgICAgZnJvbSB1cmxsaWIucGFyc2UgaW1wb3J0IHVybGVuY29kZQorICAgIGZyb20gdXJsbGliLnJlcXVlc3QgaW1wb3J0IHVybG9wZW4KKyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorZGVmIGZvbygpOgorICAgIG90aGVyKCkKKyAgICBmcm9tIHVybGxpYiBpbXBvcnQgdXJsZW5jb2RlLCB1cmxvcGVuCisiIiIKKyAgICAgICAgYSA9ICIiIgorZGVmIGZvbygpOgorICAgIG90aGVyKCkKKyAgICBmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJsZW5jb2RlCisgICAgZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlbgorIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfbW9kdWxlX3VzYWdlKHNlbGYpOgorICAgICAgICBmb3Igb2xkLCBjaGFuZ2VzIGluIHNlbGYubW9kdWxlcy5pdGVtcygpOgorICAgICAgICAgICAgZm9yIG5ldywgbWVtYmVycyBpbiBjaGFuZ2VzOgorICAgICAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gbWVtYmVyczoKKyAgICAgICAgICAgICAgICAgICAgbmV3X2ltcG9ydCA9ICIsICIuam9pbihbbiBmb3IgKG4sIG1lbXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHNlbGYubW9kdWxlc1tvbGRdXSkKKyAgICAgICAgICAgICAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0ICVzCisgICAgICAgICAgICAgICAgICAgICAgICBmb28oJXMuJXMpCisgICAgICAgICAgICAgICAgICAgICAgICAiIiIgJSAob2xkLCBvbGQsIG1lbWJlcikKKyAgICAgICAgICAgICAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0ICVzCisgICAgICAgICAgICAgICAgICAgICAgICBmb28oJXMuJXMpCisgICAgICAgICAgICAgICAgICAgICAgICAiIiIgJSAobmV3X2ltcG9ydCwgbmV3LCBtZW1iZXIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKyAgICAgICAgICAgICAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0ICVzCisgICAgICAgICAgICAgICAgICAgICAgICAlcy4lcyglcy4lcykKKyAgICAgICAgICAgICAgICAgICAgICAgICIiIiAlIChvbGQsIG9sZCwgbWVtYmVyLCBvbGQsIG1lbWJlcikKKyAgICAgICAgICAgICAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0ICVzCisgICAgICAgICAgICAgICAgICAgICAgICAlcy4lcyglcy4lcykKKyAgICAgICAgICAgICAgICAgICAgICAgICIiIiAlIChuZXdfaW1wb3J0LCBuZXcsIG1lbWJlciwgbmV3LCBtZW1iZXIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworCitjbGFzcyBUZXN0X2lucHV0KEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImlucHV0IgorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSAgIGlucHV0KCAgICkiIiIKKyAgICAgICAgYSA9ICIiInggPSAgIGV2YWwoaW5wdXQoICAgKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0gaW5wdXQoICAgJycgICApIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gZXZhbChpbnB1dCggICAnJyAgICkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RyYWlsaW5nX2NvbW1lbnQoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gaW5wdXQoKSAgIyAgZm9vIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gZXZhbChpbnB1dCgpKSAgIyAgZm9vIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2lkZW1wb3RlbmN5KHNlbGYpOgorICAgICAgICBzID0gIiIieCA9IGV2YWwoaW5wdXQoKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIieCA9IGV2YWwoaW5wdXQoJycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJ4ID0gZXZhbChpbnB1dChmb28oNSkgKyA5KSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gaW5wdXQoKSIiIgorICAgICAgICBhID0gIiIieCA9IGV2YWwoaW5wdXQoKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBpbnB1dCgnJykiIiIKKyAgICAgICAgYSA9ICIiInggPSBldmFsKGlucHV0KCcnKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMyhzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBpbnB1dCgncHJvbXB0JykiIiIKKyAgICAgICAgYSA9ICIiInggPSBldmFsKGlucHV0KCdwcm9tcHQnKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNChzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBpbnB1dChmb28oNSkgKyA5KSIiIgorICAgICAgICBhID0gIiIieCA9IGV2YWwoaW5wdXQoZm9vKDUpICsgOSkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF90dXBsZV9wYXJhbXMoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAidHVwbGVfcGFyYW1zIgorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzEoc2VsZik6CisgICAgICAgIHMgPSAiIiJkZWYgZm9vKCk6IHBhc3MiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF8yKHNlbGYpOgorICAgICAgICBzID0gIiIiZGVmIGZvbyhhLCBiLCBjKTogcGFzcyIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzMoc2VsZik6CisgICAgICAgIHMgPSAiIiJkZWYgZm9vKGE9MywgYj00LCBjPTUpOiBwYXNzIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCgoYSwgYiksIGMpKToKKyAgICAgICAgICAgICAgICB4ID0gNSIiIgorCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oeHh4X3RvZG9fY2hhbmdlbWUpOgorICAgICAgICAgICAgICAgICgoYSwgYiksIGMpID0geHh4X3RvZG9fY2hhbmdlbWUKKyAgICAgICAgICAgICAgICB4ID0gNSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCgoYSwgYiksIGMpLCBkKToKKyAgICAgICAgICAgICAgICB4ID0gNSIiIgorCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oeHh4X3RvZG9fY2hhbmdlbWUsIGQpOgorICAgICAgICAgICAgICAgICgoYSwgYiksIGMpID0geHh4X3RvZG9fY2hhbmdlbWUKKyAgICAgICAgICAgICAgICB4ID0gNSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8zKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCgoYSwgYiksIGMpLCBkKSAtPiBlOgorICAgICAgICAgICAgICAgIHggPSA1IiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbyh4eHhfdG9kb19jaGFuZ2VtZSwgZCkgLT4gZToKKyAgICAgICAgICAgICAgICAoKGEsIGIpLCBjKSA9IHh4eF90b2RvX2NoYW5nZW1lCisgICAgICAgICAgICAgICAgeCA9IDUiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfc2VtaWNvbG9uKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCgoYSwgYiksIGMpKTogeCA9IDU7IHkgPSA3IiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbyh4eHhfdG9kb19jaGFuZ2VtZSk6ICgoYSwgYiksIGMpID0geHh4X3RvZG9fY2hhbmdlbWU7IHggPSA1OyB5ID0gNyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9rZXl3b3JkcyhzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbygoKGEsIGIpLCBjKSwgZCwgZT01KSAtPiB6OgorICAgICAgICAgICAgICAgIHggPSA1IiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbyh4eHhfdG9kb19jaGFuZ2VtZSwgZCwgZT01KSAtPiB6OgorICAgICAgICAgICAgICAgICgoYSwgYiksIGMpID0geHh4X3RvZG9fY2hhbmdlbWUKKyAgICAgICAgICAgICAgICB4ID0gNSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF92YXJhcmdzKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCgoYSwgYiksIGMpLCBkLCAqdmFyZ3MsICoqa3dhcmdzKSAtPiB6OgorICAgICAgICAgICAgICAgIHggPSA1IiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbyh4eHhfdG9kb19jaGFuZ2VtZSwgZCwgKnZhcmdzLCAqKmt3YXJncykgLT4gejoKKyAgICAgICAgICAgICAgICAoKGEsIGIpLCBjKSA9IHh4eF90b2RvX2NoYW5nZW1lCisgICAgICAgICAgICAgICAgeCA9IDUiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbXVsdGlfMShzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbygoKGEsIGIpLCBjKSwgKGQsIGUsIGYpKSAtPiB6OgorICAgICAgICAgICAgICAgIHggPSA1IiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbyh4eHhfdG9kb19jaGFuZ2VtZSwgeHh4X3RvZG9fY2hhbmdlbWUxKSAtPiB6OgorICAgICAgICAgICAgICAgICgoYSwgYiksIGMpID0geHh4X3RvZG9fY2hhbmdlbWUKKyAgICAgICAgICAgICAgICAoZCwgZSwgZikgPSB4eHhfdG9kb19jaGFuZ2VtZTEKKyAgICAgICAgICAgICAgICB4ID0gNSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9tdWx0aV8yKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKHgsICgoYSwgYiksIGMpLCBkLCAoZSwgZiwgZyksIHkpIC0+IHo6CisgICAgICAgICAgICAgICAgeCA9IDUiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKHgsIHh4eF90b2RvX2NoYW5nZW1lLCBkLCB4eHhfdG9kb19jaGFuZ2VtZTEsIHkpIC0+IHo6CisgICAgICAgICAgICAgICAgKChhLCBiKSwgYykgPSB4eHhfdG9kb19jaGFuZ2VtZQorICAgICAgICAgICAgICAgIChlLCBmLCBnKSA9IHh4eF90b2RvX2NoYW5nZW1lMQorICAgICAgICAgICAgICAgIHggPSA1IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbygoKGEsIGIpLCBjKSwgKGQsIGUsIGYpKSAtPiB6OgorICAgICAgICAgICAgICAgICJmb28gZm9vIGZvbyBmb28iCisgICAgICAgICAgICAgICAgeCA9IDUiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKHh4eF90b2RvX2NoYW5nZW1lLCB4eHhfdG9kb19jaGFuZ2VtZTEpIC0+IHo6CisgICAgICAgICAgICAgICAgImZvbyBmb28gZm9vIGZvbyIKKyAgICAgICAgICAgICAgICAoKGEsIGIpLCBjKSA9IHh4eF90b2RvX2NoYW5nZW1lCisgICAgICAgICAgICAgICAgKGQsIGUsIGYpID0geHh4X3RvZG9fY2hhbmdlbWUxCisgICAgICAgICAgICAgICAgeCA9IDUiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbGFtYmRhX25vX2NoYW5nZShzZWxmKToKKyAgICAgICAgcyA9ICIiImxhbWJkYSB4OiB4ICsgNSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfbGFtYmRhX3BhcmVuc19zaW5nbGVfYXJnKHNlbGYpOgorICAgICAgICBiID0gIiIibGFtYmRhICh4KTogeCArIDUiIiIKKyAgICAgICAgYSA9ICIiImxhbWJkYSB4OiB4ICsgNSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImxhbWJkYSh4KTogeCArIDUiIiIKKyAgICAgICAgYSA9ICIiImxhbWJkYSB4OiB4ICsgNSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImxhbWJkYSAoKCgoeCkpKSk6IHggKyA1IiIiCisgICAgICAgIGEgPSAiIiJsYW1iZGEgeDogeCArIDUiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJsYW1iZGEoKCgoeCkpKSk6IHggKyA1IiIiCisgICAgICAgIGEgPSAiIiJsYW1iZGEgeDogeCArIDUiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbGFtYmRhX3NpbXBsZShzZWxmKToKKyAgICAgICAgYiA9ICIiImxhbWJkYSAoeCwgeSk6IHggKyBmKHkpIiIiCisgICAgICAgIGEgPSAiIiJsYW1iZGEgeF95OiB4X3lbMF0gKyBmKHhfeVsxXSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJsYW1iZGEoeCwgeSk6IHggKyBmKHkpIiIiCisgICAgICAgIGEgPSAiIiJsYW1iZGEgeF95OiB4X3lbMF0gKyBmKHhfeVsxXSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJsYW1iZGEgKCgoeCwgeSkpKTogeCArIGYoeSkiIiIKKyAgICAgICAgYSA9ICIiImxhbWJkYSB4X3k6IHhfeVswXSArIGYoeF95WzFdKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImxhbWJkYSgoKHgsIHkpKSk6IHggKyBmKHkpIiIiCisgICAgICAgIGEgPSAiIiJsYW1iZGEgeF95OiB4X3lbMF0gKyBmKHhfeVsxXSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbGFtYmRhX29uZV90dXBsZShzZWxmKToKKyAgICAgICAgYiA9ICIiImxhbWJkYSAoeCwpOiB4ICsgZih4KSIiIgorICAgICAgICBhID0gIiIibGFtYmRhIHgxOiB4MVswXSArIGYoeDFbMF0pIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIibGFtYmRhICgoKHgsKSkpOiB4ICsgZih4KSIiIgorICAgICAgICBhID0gIiIibGFtYmRhIHgxOiB4MVswXSArIGYoeDFbMF0pIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2xhbWJkYV9zaW1wbGVfbXVsdGlfdXNlKHNlbGYpOgorICAgICAgICBiID0gIiIibGFtYmRhICh4LCB5KTogeCArIHggKyBmKHgpICsgeCIiIgorICAgICAgICBhID0gIiIibGFtYmRhIHhfeTogeF95WzBdICsgeF95WzBdICsgZih4X3lbMF0pICsgeF95WzBdIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2xhbWJkYV9zaW1wbGVfcmV2ZXJzZShzZWxmKToKKyAgICAgICAgYiA9ICIiImxhbWJkYSAoeCwgeSk6IHkgKyB4IiIiCisgICAgICAgIGEgPSAiIiJsYW1iZGEgeF95OiB4X3lbMV0gKyB4X3lbMF0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbGFtYmRhX25lc3RlZChzZWxmKToKKyAgICAgICAgYiA9ICIiImxhbWJkYSAoeCwgKHksIHopKTogeCArIHkgKyB6IiIiCisgICAgICAgIGEgPSAiIiJsYW1iZGEgeF95X3o6IHhfeV96WzBdICsgeF95X3pbMV1bMF0gKyB4X3lfelsxXVsxXSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImxhbWJkYSAoKCh4LCAoeSwgeikpKSk6IHggKyB5ICsgeiIiIgorICAgICAgICBhID0gIiIibGFtYmRhIHhfeV96OiB4X3lfelswXSArIHhfeV96WzFdWzBdICsgeF95X3pbMV1bMV0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbGFtYmRhX25lc3RlZF9tdWx0aV91c2Uoc2VsZik6CisgICAgICAgIGIgPSAiIiJsYW1iZGEgKHgsICh5LCB6KSk6IHggKyB5ICsgZih5KSIiIgorICAgICAgICBhID0gIiIibGFtYmRhIHhfeV96OiB4X3lfelswXSArIHhfeV96WzFdWzBdICsgZih4X3lfelsxXVswXSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCitjbGFzcyBUZXN0X21ldGhvZGF0dHJzKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gIm1ldGhvZGF0dHJzIgorCisgICAgYXR0cnMgPSBbImZ1bmMiLCAic2VsZiIsICJjbGFzcyJdCisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5hdHRyczoKKyAgICAgICAgICAgIGIgPSAiYS5pbV8lcyIgJSBhdHRyCisgICAgICAgICAgICBpZiBhdHRyID09ICJjbGFzcyI6CisgICAgICAgICAgICAgICAgYSA9ICJhLl9fc2VsZl9fLl9fY2xhc3NfXyIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9ICJhLl9fJXNfXyIgJSBhdHRyCisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgICAgIGIgPSAic2VsZi5mb28uaW1fJXMuZm9vX2JhciIgJSBhdHRyCisgICAgICAgICAgICBpZiBhdHRyID09ICJjbGFzcyI6CisgICAgICAgICAgICAgICAgYSA9ICJzZWxmLmZvby5fX3NlbGZfXy5fX2NsYXNzX18uZm9vX2JhciIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYSA9ICJzZWxmLmZvby5fXyVzX18uZm9vX2JhciIgJSBhdHRyCisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIGZvciBhdHRyIGluIHNlbGYuYXR0cnM6CisgICAgICAgICAgICBzID0gImZvbyhpbV8lcyArIDUpIiAlIGF0dHIKKyAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgICAgIHMgPSAiZihmb28uX18lc19fKSIgJSBhdHRyCisgICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgICAgICBzID0gImYoZm9vLl9fJXNfXy5mb28pIiAlIGF0dHIKKyAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKK2NsYXNzIFRlc3RfbmV4dChGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJuZXh0IgorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgYiA9ICIiIml0Lm5leHQoKSIiIgorICAgICAgICBhID0gIiIibmV4dChpdCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgYiA9ICIiImEuYi5jLmQubmV4dCgpIiIiCisgICAgICAgIGEgPSAiIiJuZXh0KGEuYi5jLmQpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzMoc2VsZik6CisgICAgICAgIGIgPSAiIiIoYSArIGIpLm5leHQoKSIiIgorICAgICAgICBhID0gIiIibmV4dCgoYSArIGIpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF80KHNlbGYpOgorICAgICAgICBiID0gIiIiYSgpLm5leHQoKSIiIgorICAgICAgICBhID0gIiIibmV4dChhKCkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzUoc2VsZik6CisgICAgICAgIGIgPSAiIiJhKCkubmV4dCgpICsgYiIiIgorICAgICAgICBhID0gIiIibmV4dChhKCkpICsgYiIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF82KHNlbGYpOgorICAgICAgICBiID0gIiIiYyggICAgICBhKCkubmV4dCgpICsgYikiIiIKKyAgICAgICAgYSA9ICIiImMoICAgICAgbmV4dChhKCkpICsgYikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbl8xKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBmb3IgYSBpbiBiOgorICAgICAgICAgICAgICAgIGZvbyhhKQorICAgICAgICAgICAgICAgIGEubmV4dCgpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgZm9yIGEgaW4gYjoKKyAgICAgICAgICAgICAgICBmb28oYSkKKyAgICAgICAgICAgICAgICBuZXh0KGEpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbl8yKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBmb3IgYSBpbiBiOgorICAgICAgICAgICAgICAgIGZvbyhhKSAjIGFiYworICAgICAgICAgICAgICAgICMgZGVmCisgICAgICAgICAgICAgICAgYS5uZXh0KCkKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBmb3IgYSBpbiBiOgorICAgICAgICAgICAgICAgIGZvbyhhKSAjIGFiYworICAgICAgICAgICAgICAgICMgZGVmCisgICAgICAgICAgICAgICAgbmV4dChhKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3ByZWZpeF9wcmVzZXJ2YXRpb25fMyhzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgbmV4dCA9IDUKKyAgICAgICAgICAgIGZvciBhIGluIGI6CisgICAgICAgICAgICAgICAgZm9vKGEpCisgICAgICAgICAgICAgICAgYS5uZXh0KCkKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBuZXh0ID0gNQorICAgICAgICAgICAgZm9yIGEgaW4gYjoKKyAgICAgICAgICAgICAgICBmb28oYSkKKyAgICAgICAgICAgICAgICBhLl9fbmV4dF9fKCkKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEsIGlnbm9yZV93YXJuaW5ncz1UcnVlKQorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbl80KHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBuZXh0ID0gNQorICAgICAgICAgICAgZm9yIGEgaW4gYjoKKyAgICAgICAgICAgICAgICBmb28oYSkgIyBhYmMKKyAgICAgICAgICAgICAgICAjIGRlZgorICAgICAgICAgICAgICAgIGEubmV4dCgpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgbmV4dCA9IDUKKyAgICAgICAgICAgIGZvciBhIGluIGI6CisgICAgICAgICAgICAgICAgZm9vKGEpICMgYWJjCisgICAgICAgICAgICAgICAgIyBkZWYKKyAgICAgICAgICAgICAgICBhLl9fbmV4dF9fKCkKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEsIGlnbm9yZV93YXJuaW5ncz1UcnVlKQorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbl81KHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBuZXh0ID0gNQorICAgICAgICAgICAgZm9yIGEgaW4gYjoKKyAgICAgICAgICAgICAgICBmb28oZm9vKGEpLCAjIGFiYworICAgICAgICAgICAgICAgICAgICBhLm5leHQoKSkKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBuZXh0ID0gNQorICAgICAgICAgICAgZm9yIGEgaW4gYjoKKyAgICAgICAgICAgICAgICBmb28oZm9vKGEpLCAjIGFiYworICAgICAgICAgICAgICAgICAgICBhLl9fbmV4dF9fKCkpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhLCBpZ25vcmVfd2FybmluZ3M9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3ByZWZpeF9wcmVzZXJ2YXRpb25fNihzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgZm9yIGEgaW4gYjoKKyAgICAgICAgICAgICAgICBmb28oZm9vKGEpLCAjIGFiYworICAgICAgICAgICAgICAgICAgICBhLm5leHQoKSkKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBmb3IgYSBpbiBiOgorICAgICAgICAgICAgICAgIGZvbyhmb28oYSksICMgYWJjCisgICAgICAgICAgICAgICAgICAgIG5leHQoYSkpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbWV0aG9kXzEoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBfX25leHRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X21ldGhvZF8yKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGVmIF9fbmV4dF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbWV0aG9kXzMoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoeCk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBfX25leHRfXyh4KToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X21ldGhvZF80KHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworCisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworCisgICAgICAgICAgICAgICAgZGVmIF9fbmV4dF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbWV0aG9kX3VuY2hhbmdlZChzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dpbmdfYXNzaWduX3NpbXBsZShzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgbmV4dCA9IGZvbworCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYsIGEsIGIpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19hc3NpZ25fdHVwbGVfMShzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgKG5leHQsIGEpID0gZm9vCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2Fzc2lnbl90dXBsZV8yKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICAoYSwgKGIsIChuZXh0LCBjKSksIGEpID0gZm9vCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2Fzc2lnbl9saXN0XzEoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIFtuZXh0LCBhXSA9IGZvbworCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYsIGEsIGIpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19hc3NpZ25fbGlzdF8yKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBbYSwgW2IsIFtuZXh0LCBjXV0sIGFdID0gZm9vCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3RfYnVpbHRpbl9hc3NpZ24oc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oKToKKyAgICAgICAgICAgICAgICBfX2J1aWx0aW5fXy5uZXh0ID0gZm9vCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3RfYnVpbHRpbl9hc3NpZ25faW5fdHVwbGUoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAoYSwgX19idWlsdGluX18ubmV4dCkgPSBmb28KKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9idWlsdGluX2Fzc2lnbl9pbl9saXN0KHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgW2EsIF9fYnVpbHRpbl9fLm5leHRdID0gZm9vCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3RfYXNzaWduX3RvX25leHQoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oKToKKyAgICAgICAgICAgICAgICBBLm5leHQgPSBmb28KKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9hc3NpZ25fdG9fbmV4dF9pbl90dXBsZShzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIChhLCBBLm5leHQpID0gZm9vCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfYXNzaWduX3RvX25leHRfaW5fbGlzdChzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIFthLCBBLm5leHRdID0gZm9vCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2ltcG9ydF8xKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgZm9vLmJhciBhcyBuZXh0CisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2ltcG9ydF8yKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgYmFyLCBiYXIuZm9vIGFzIG5leHQKKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dpbmdfaW1wb3J0XzMoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGltcG9ydCBiYXIsIGJhci5mb28gYXMgbmV4dCwgYmF6CisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2ltcG9ydF9mcm9tXzEoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZyb20geCBpbXBvcnQgbmV4dAorCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYsIGEsIGIpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19pbXBvcnRfZnJvbV8yKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBmcm9tIHguYSBpbXBvcnQgbmV4dAorCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYsIGEsIGIpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19pbXBvcnRfZnJvbV8zKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBmcm9tIHggaW1wb3J0IGEsIG5leHQsIGIKKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dpbmdfaW1wb3J0X2Zyb21fNChzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZnJvbSB4LmEgaW1wb3J0IGEsIG5leHQsIGIKKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dpbmdfZnVuY2RlZl8xKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBkZWYgbmV4dChhKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2Z1bmNkZWZfMihzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgZGVmIG5leHQoYSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGl0Lm5leHQoKQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGRlZiBuZXh0KGEpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgX19uZXh0X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgaXQuX19uZXh0X18oKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnMoYiwgYSwgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19nbG9iYWxfMShzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICAgICBnbG9iYWwgbmV4dAorICAgICAgICAgICAgICAgIG5leHQgPSA1CisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19nbG9iYWxfMihzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICAgICBnbG9iYWwgYSwgbmV4dCwgYgorICAgICAgICAgICAgICAgIG5leHQgPSA1CisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19mb3Jfc2ltcGxlKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBmb3IgbmV4dCBpbiBpdCgpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgYiA9IDUKKyAgICAgICAgICAgIGMgPSA2CisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19mb3JfdHVwbGVfMShzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZm9yIG5leHQsIGIgaW4gaXQoKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGIgPSA1CisgICAgICAgICAgICBjID0gNgorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dpbmdfZm9yX3R1cGxlXzIoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZvciBhLCAobmV4dCwgYyksIGIgaW4gaXQoKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGIgPSA1CisgICAgICAgICAgICBjID0gNgorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9ub25jYWxsX2FjY2Vzc18xKHNlbGYpOgorICAgICAgICBiID0gIiIiZ25leHQgPSBnLm5leHQiIiIKKyAgICAgICAgYSA9ICIiImduZXh0ID0gZy5fX25leHRfXyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9ub25jYWxsX2FjY2Vzc18yKHNlbGYpOgorICAgICAgICBiID0gIiIiZihnLm5leHQgKyA1KSIiIgorICAgICAgICBhID0gIiIiZihnLl9fbmV4dF9fICsgNSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfbm9uY2FsbF9hY2Nlc3NfMyhzZWxmKToKKyAgICAgICAgYiA9ICIiImYoZygpLm5leHQgKyA1KSIiIgorICAgICAgICBhID0gIiIiZihnKCkuX19uZXh0X18gKyA1KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3Rfbm9uemVybyhGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJub256ZXJvIgorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzIoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgICAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGVmIF9fYm9vbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzEoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgICAgICBkZWYgX19ib29sX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzIoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgICAgICBkZWYgX19ub256ZXJvX18oc2VsZiwgYSk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkX2Z1bmMoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworY2xhc3MgVGVzdF9udW1saXRlcmFscyhGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJudW1saXRlcmFscyIKKworICAgIGRlZiB0ZXN0X29jdGFsXzEoc2VsZik6CisgICAgICAgIGIgPSAiIiIwNzU1IiIiCisgICAgICAgIGEgPSAiIiIwbzc1NSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9sb25nX2ludF8xKHNlbGYpOgorICAgICAgICBiID0gIiIiYSA9IDEyTCIiIgorICAgICAgICBhID0gIiIiYSA9IDEyIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2xvbmdfaW50XzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJhID0gMTJsIiIiCisgICAgICAgIGEgPSAiIiJhID0gMTIiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbG9uZ19oZXgoc2VsZik6CisgICAgICAgIGIgPSAiIiJiID0gMHgxMmwiIiIKKyAgICAgICAgYSA9ICIiImIgPSAweDEyIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRzX2FuZF9zcGFjaW5nKHNlbGYpOgorICAgICAgICBiID0gIiIiYiA9ICAgMHgxMkwiIiIKKyAgICAgICAgYSA9ICIiImIgPSAgIDB4MTIiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJiID0gMDc1NSAjIHNwYW0iIiIKKyAgICAgICAgYSA9ICIiImIgPSAwbzc1NSAjIHNwYW0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkX2ludChzZWxmKToKKyAgICAgICAgcyA9ICIiIjUiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF9mbG9hdChzZWxmKToKKyAgICAgICAgcyA9ICIiIjUuMCIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkX29jdGFsKHNlbGYpOgorICAgICAgICBzID0gIiIiMG83NTUiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF9oZXgoc2VsZik6CisgICAgICAgIHMgPSAiIiIweEFCQyIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkX2V4cChzZWxmKToKKyAgICAgICAgcyA9ICIiIjUuMGUxMCIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkX2NvbXBsZXhfaW50KHNlbGYpOgorICAgICAgICBzID0gIiIiNSArIDRqIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfY29tcGxleF9mbG9hdChzZWxmKToKKyAgICAgICAgcyA9ICIiIjUuNCArIDQuOWoiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF9jb21wbGV4X2JhcmUoc2VsZik6CisgICAgICAgIHMgPSAiIiI0aiIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorICAgICAgICBzID0gIiIiNC40aiIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCitjbGFzcyBUZXN0X3JlbmFtZXMoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAicmVuYW1lcyIKKworICAgIG1vZHVsZXMgPSB7InN5cyI6ICAoIm1heGludCIsICJtYXhzaXplIiksCisgICAgICAgICAgICAgIH0KKworICAgIGRlZiB0ZXN0X2ltcG9ydF9mcm9tKHNlbGYpOgorICAgICAgICBmb3IgbW9kLCAob2xkLCBuZXcpIGluIHNlbGYubW9kdWxlcy5pdGVtcygpOgorICAgICAgICAgICAgYiA9ICJmcm9tICVzIGltcG9ydCAlcyIgJSAobW9kLCBvbGQpCisgICAgICAgICAgICBhID0gImZyb20gJXMgaW1wb3J0ICVzIiAlIChtb2QsIG5ldykKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAgICAgcyA9ICJmcm9tIGZvbyBpbXBvcnQgJXMiICUgb2xkCisgICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2Zyb21fYXMoc2VsZik6CisgICAgICAgIGZvciBtb2QsIChvbGQsIG5ldykgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBiID0gImZyb20gJXMgaW1wb3J0ICVzIGFzIGZvb19iYXIiICUgKG1vZCwgb2xkKQorICAgICAgICAgICAgYSA9ICJmcm9tICVzIGltcG9ydCAlcyBhcyBmb29fYmFyIiAlIChtb2QsIG5ldykKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9tb2R1bGVfdXNhZ2Uoc2VsZik6CisgICAgICAgIGZvciBtb2QsIChvbGQsIG5ldykgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBiID0gIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0ICVzCisgICAgICAgICAgICAgICAgZm9vKCVzLCAlcy4lcykKKyAgICAgICAgICAgICAgICAiIiIgJSAobW9kLCBtb2QsIG1vZCwgb2xkKQorICAgICAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgICAgIGltcG9ydCAlcworICAgICAgICAgICAgICAgIGZvbyglcywgJXMuJXMpCisgICAgICAgICAgICAgICAgIiIiICUgKG1vZCwgbW9kLCBtb2QsIG5ldykKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiBYWFhfdGVzdF9mcm9tX2ltcG9ydF91c2FnZShzZWxmKToKKyAgICAgICAgIyBub3QgaW1wbGVtZW50ZWQgeWV0CisgICAgICAgIGZvciBtb2QsIChvbGQsIG5ldykgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBiID0gIiIiCisgICAgICAgICAgICAgICAgZnJvbSAlcyBpbXBvcnQgJXMKKyAgICAgICAgICAgICAgICBmb28oJXMsICVzKQorICAgICAgICAgICAgICAgICIiIiAlIChtb2QsIG9sZCwgbW9kLCBvbGQpCisgICAgICAgICAgICBhID0gIiIiCisgICAgICAgICAgICAgICAgZnJvbSAlcyBpbXBvcnQgJXMKKyAgICAgICAgICAgICAgICBmb28oJXMsICVzKQorICAgICAgICAgICAgICAgICIiIiAlIChtb2QsIG5ldywgbW9kLCBuZXcpCisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfdW5pY29kZShGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJ1bmljb2RlIgorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZShzZWxmKToKKyAgICAgICAgYiA9ICIiInVuaWNvZGUoIHgpIiIiCisgICAgICAgIGEgPSAiIiJzdHIoIHgpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiIHVuaWNvZGUoeCApIiIiCisgICAgICAgIGEgPSAiIiIgc3RyKHggKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIiB1J2gnIiIiCisgICAgICAgIGEgPSAiIiIgJ2gnIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfY2FsbChzZWxmKToKKyAgICAgICAgYiA9ICIiInVuaWNvZGUoeCwgeSwgeikiIiIKKyAgICAgICAgYSA9ICIiInN0cih4LCB5LCB6KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF91bmljaHIoc2VsZik6CisgICAgICAgIGIgPSAiIiJ1bmljaHIodSdoJykiIiIKKyAgICAgICAgYSA9ICIiImNocignaCcpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfbGl0ZXJhbF8xKHNlbGYpOgorICAgICAgICBiID0gJycndSJ4IicnJworICAgICAgICBhID0gJycnIngiJycnCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfbGl0ZXJhbF8yKHNlbGYpOgorICAgICAgICBiID0gIiIidXIneCciIiIKKyAgICAgICAgYSA9ICIiInIneCciIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9saXRlcmFsXzMoc2VsZik6CisgICAgICAgIGIgPSAiIiJVUicnJ3gnJycgIiIiCisgICAgICAgIGEgPSAiIiJSJycneCcnJyAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCitjbGFzcyBUZXN0X2NhbGxhYmxlKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImNhbGxhYmxlIgorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiImNhbGxhYmxlKCAgICB4KSIiIgorICAgICAgICBhID0gIiIiaW1wb3J0IGNvbGxlY3Rpb25zXG5pc2luc3RhbmNlKCAgICB4LCBjb2xsZWN0aW9ucy5DYWxsYWJsZSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJpZiAgICAgY2FsbGFibGUoeCk6IHBhc3MiIiIKKyAgICAgICAgYSA9ICIiImltcG9ydCBjb2xsZWN0aW9ucworaWYgICAgIGlzaW5zdGFuY2UoeCwgY29sbGVjdGlvbnMuQ2FsbGFibGUpOiBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2NhbGxhYmxlX2NhbGwoc2VsZik6CisgICAgICAgIGIgPSAiIiJjYWxsYWJsZSh4KSIiIgorICAgICAgICBhID0gIiIiaW1wb3J0IGNvbGxlY3Rpb25zXG5pc2luc3RhbmNlKHgsIGNvbGxlY3Rpb25zLkNhbGxhYmxlKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9nbG9iYWxfaW1wb3J0KHNlbGYpOgorICAgICAgICBiID0gIiIiCitkZWYgc3BhbShmb28pOgorICAgIGNhbGxhYmxlKGZvbykiIiJbMTpdCisgICAgICAgIGEgPSAiIiIKK2ltcG9ydCBjb2xsZWN0aW9ucworZGVmIHNwYW0oZm9vKToKKyAgICBpc2luc3RhbmNlKGZvbywgY29sbGVjdGlvbnMuQ2FsbGFibGUpIiIiWzE6XQorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgoraW1wb3J0IGNvbGxlY3Rpb25zCitkZWYgc3BhbShmb28pOgorICAgIGNhbGxhYmxlKGZvbykiIiJbMTpdCisgICAgICAgICMgc2FtZSBvdXRwdXQgaWYgaXQgd2FzIGFscmVhZHkgaW1wb3J0ZWQKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0ICoKK2RlZiBzcGFtKGZvbyk6CisgICAgY2FsbGFibGUoZm9vKSIiIlsxOl0KKyAgICAgICAgYSA9ICIiIgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgKgoraW1wb3J0IGNvbGxlY3Rpb25zCitkZWYgc3BhbShmb28pOgorICAgIGlzaW5zdGFuY2UoZm9vLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSkiIiJbMTpdCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCitkb19zdHVmZigpCitkb19zb21lX290aGVyX3N0dWZmKCkKK2Fzc2VydCBjYWxsYWJsZShkb19zdHVmZikiIiJbMTpdCisgICAgICAgIGEgPSAiIiIKK2ltcG9ydCBjb2xsZWN0aW9ucworZG9fc3R1ZmYoKQorZG9fc29tZV9vdGhlcl9zdHVmZigpCithc3NlcnQgaXNpbnN0YW5jZShkb19zdHVmZiwgY29sbGVjdGlvbnMuQ2FsbGFibGUpIiIiWzE6XQorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgoraWYgaXNpbnN0YW5jZShkb19zdHVmZiwgQ2FsbGFibGUpOgorICAgIGFzc2VydCBjYWxsYWJsZShkb19zdHVmZikKKyAgICBkb19zdHVmZihkb19zdHVmZikKKyAgICBpZiBub3QgY2FsbGFibGUoZG9fc3R1ZmYpOgorICAgICAgICBleGl0KDEpCisgICAgZWxzZToKKyAgICAgICAgYXNzZXJ0IGNhbGxhYmxlKGRvX3N0dWZmKQorZWxzZToKKyAgICBhc3NlcnQgbm90IGNhbGxhYmxlKGRvX3N0dWZmKSIiIlsxOl0KKyAgICAgICAgYSA9ICIiIgoraW1wb3J0IGNvbGxlY3Rpb25zCitpZiBpc2luc3RhbmNlKGRvX3N0dWZmLCBDYWxsYWJsZSk6CisgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZG9fc3R1ZmYsIGNvbGxlY3Rpb25zLkNhbGxhYmxlKQorICAgIGRvX3N0dWZmKGRvX3N0dWZmKQorICAgIGlmIG5vdCBpc2luc3RhbmNlKGRvX3N0dWZmLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSk6CisgICAgICAgIGV4aXQoMSkKKyAgICBlbHNlOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkb19zdHVmZiwgY29sbGVjdGlvbnMuQ2FsbGFibGUpCitlbHNlOgorICAgIGFzc2VydCBub3QgaXNpbnN0YW5jZShkb19zdHVmZiwgY29sbGVjdGlvbnMuQ2FsbGFibGUpIiIiWzE6XQorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9jYWxsYWJsZV9zaG91bGRfbm90X2NoYW5nZShzZWxmKToKKyAgICAgICAgYSA9ICIiImNhbGxhYmxlKCp4KSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorCisgICAgICAgIGEgPSAiIiJjYWxsYWJsZSh4LCB5KSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorCisgICAgICAgIGEgPSAiIiJjYWxsYWJsZSh4LCBrdz15KSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorCisgICAgICAgIGEgPSAiIiJjYWxsYWJsZSgpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisKK2NsYXNzIFRlc3RfZmlsdGVyKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImZpbHRlciIKKworICAgIGRlZiB0ZXN0X3ByZWZpeF9wcmVzZXJ2YXRpb24oc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gICBmaWx0ZXIoICAgIGZvbywgICAgICdhYmMnICAgKSIiIgorICAgICAgICBhID0gIiIieCA9ICAgbGlzdChmaWx0ZXIoICAgIGZvbywgICAgICdhYmMnICAgKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0gICBmaWx0ZXIoICBOb25lICwgJ2FiYycgICkiIiIKKyAgICAgICAgYSA9ICIiInggPSAgIFtfZiBmb3IgX2YgaW4gJ2FiYycgaWYgX2ZdIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2ZpbHRlcl9iYXNpYyhzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBmaWx0ZXIoTm9uZSwgJ2FiYycpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gW19mIGZvciBfZiBpbiAnYWJjJyBpZiBfZl0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0gbGVuKGZpbHRlcihmLCAnYWJjJykpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gbGVuKGxpc3QoZmlsdGVyKGYsICdhYmMnKSkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieCA9IGZpbHRlcihsYW1iZGEgeDogeCUyID09IDAsIHJhbmdlKDEwKSkiIiIKKyAgICAgICAgYSA9ICIiInggPSBbeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCUyID09IDBdIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAjIE5vdGUgdGhlIHBhcmVucyBhcm91bmQgeAorICAgICAgICBiID0gIiIieCA9IGZpbHRlcihsYW1iZGEgKHgpOiB4JTIgPT0gMCwgcmFuZ2UoMTApKSIiIgorICAgICAgICBhID0gIiIieCA9IFt4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4JTIgPT0gMF0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICMgWFhYIFRoaXMgKHJhcmUpIGNhc2UgaXMgbm90IHN1cHBvcnRlZAorIyMgICAgICAgICBiID0gIiIieCA9IGZpbHRlcihmLCAnYWJjJylbMF0iIiIKKyMjICAgICAgICAgYSA9ICIiInggPSBsaXN0KGZpbHRlcihmLCAnYWJjJykpWzBdIiIiCisjIyAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2ZpbHRlcl9ub2NoYW5nZShzZWxmKToKKyAgICAgICAgYSA9ICIiImIuam9pbihmaWx0ZXIoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiKGEgKyBmb28oNSkpLmpvaW4oZmlsdGVyKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiIml0ZXIoZmlsdGVyKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImxpc3QoZmlsdGVyKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImxpc3QoZmlsdGVyKGYsICdhYmMnKSlbMF0iIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInNldChmaWx0ZXIoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIic2V0KGZpbHRlcihmLCAnYWJjJykpLnBvcCgpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJ0dXBsZShmaWx0ZXIoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiYW55KGZpbHRlcihmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJhbGwoZmlsdGVyKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInN1bShmaWx0ZXIoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIic29ydGVkKGZpbHRlcihmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJzb3J0ZWQoZmlsdGVyKGYsICdhYmMnKSwga2V5PWJsYWgpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJzb3J0ZWQoZmlsdGVyKGYsICdhYmMnKSwga2V5PWJsYWgpWzBdIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJlbnVtZXJhdGUoZmlsdGVyKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImVudW1lcmF0ZShmaWx0ZXIoZiwgJ2FiYycpLCBzdGFydD0xKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiZm9yIGkgaW4gZmlsdGVyKGYsICdhYmMnKTogcGFzcyIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiW3ggZm9yIHggaW4gZmlsdGVyKGYsICdhYmMnKV0iIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiIih4IGZvciB4IGluIGZpbHRlcihmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisKKyAgICBkZWYgdGVzdF9mdXR1cmVfYnVpbHRpbnMoc2VsZik6CisgICAgICAgIGEgPSAiZnJvbSBmdXR1cmVfYnVpbHRpbnMgaW1wb3J0IHNwYW0sIGZpbHRlcjsgZmlsdGVyKGYsICdoYW0nKSIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKworICAgICAgICBiID0gIiIiZnJvbSBmdXR1cmVfYnVpbHRpbnMgaW1wb3J0IHNwYW07IHggPSBmaWx0ZXIoZiwgJ2FiYycpIiIiCisgICAgICAgIGEgPSAiIiJmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgc3BhbTsgeCA9IGxpc3QoZmlsdGVyKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGEgPSAiZnJvbSBmdXR1cmVfYnVpbHRpbnMgaW1wb3J0ICo7IGZpbHRlcihmLCAnaGFtJykiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisKK2NsYXNzIFRlc3RfbWFwKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gIm1hcCIKKworICAgIGRlZiBjaGVjayhzZWxmLCBiLCBhKToKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoImZyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCBtYXA7ICIgKyBiLCBhKQorICAgICAgICBzdXBlcihUZXN0X21hcCwgc2VsZikuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3ByZWZpeF9wcmVzZXJ2YXRpb24oc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gICAgbWFwKCAgIGYsICAgICdhYmMnICAgKSIiIgorICAgICAgICBhID0gIiIieCA9ICAgIGxpc3QobWFwKCAgIGYsICAgICdhYmMnICAgKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdHJhaWxpbmdfY29tbWVudChzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBtYXAoZiwgJ2FiYycpICAgIyAgIGZvbyIiIgorICAgICAgICBhID0gIiIieCA9IGxpc3QobWFwKGYsICdhYmMnKSkgICAjICAgZm9vIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X05vbmVfd2l0aF9tdWx0aXBsZV9hcmd1bWVudHMoc2VsZik6CisgICAgICAgIHMgPSAiIiJ4ID0gbWFwKE5vbmUsIGEsIGIsIGMpIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJjYW5ub3QgY29udmVydCBtYXAoTm9uZSwgLi4uKSB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIGFyZ3VtZW50cyIpCisKKyAgICBkZWYgdGVzdF9tYXBfYmFzaWMoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gbWFwKGYsICdhYmMnKSIiIgorICAgICAgICBhID0gIiIieCA9IGxpc3QobWFwKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0gbGVuKG1hcChmLCAnYWJjJywgJ2RlZicpKSIiIgorICAgICAgICBhID0gIiIieCA9IGxlbihsaXN0KG1hcChmLCAnYWJjJywgJ2RlZicpKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0gbWFwKE5vbmUsICdhYmMnKSIiIgorICAgICAgICBhID0gIiIieCA9IGxpc3QoJ2FiYycpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieCA9IG1hcChsYW1iZGEgeDogeCsxLCByYW5nZSg0KSkiIiIKKyAgICAgICAgYSA9ICIiInggPSBbeCsxIGZvciB4IGluIHJhbmdlKDQpXSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgIyBOb3RlIHRoZSBwYXJlbnMgYXJvdW5kIHgKKyAgICAgICAgYiA9ICIiInggPSBtYXAobGFtYmRhICh4KTogeCsxLCByYW5nZSg0KSkiIiIKKyAgICAgICAgYSA9ICIiInggPSBbeCsxIGZvciB4IGluIHJhbmdlKDQpXSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgZm9vKCkKKyAgICAgICAgICAgICMgZm9vCisgICAgICAgICAgICBtYXAoZiwgeCkKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBmb28oKQorICAgICAgICAgICAgIyBmb28KKyAgICAgICAgICAgIGxpc3QobWFwKGYsIHgpKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnMoYiwgYSwgIllvdSBzaG91bGQgdXNlIGEgZm9yIGxvb3AgaGVyZSIpCisKKyAgICAgICAgIyBYWFggVGhpcyAocmFyZSkgY2FzZSBpcyBub3Qgc3VwcG9ydGVkCisjIyAgICAgICAgIGIgPSAiIiJ4ID0gbWFwKGYsICdhYmMnKVswXSIiIgorIyMgICAgICAgICBhID0gIiIieCA9IGxpc3QobWFwKGYsICdhYmMnKSlbMF0iIiIKKyMjICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbWFwX25vY2hhbmdlKHNlbGYpOgorICAgICAgICBhID0gIiIiYi5qb2luKG1hcChmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiIoYSArIGZvbyg1KSkuam9pbihtYXAoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiaXRlcihtYXAoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIibGlzdChtYXAoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIibGlzdChtYXAoZiwgJ2FiYycpKVswXSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIic2V0KG1hcChmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJzZXQobWFwKGYsICdhYmMnKSkucG9wKCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInR1cGxlKG1hcChmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJhbnkobWFwKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImFsbChtYXAoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIic3VtKG1hcChmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJzb3J0ZWQobWFwKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInNvcnRlZChtYXAoZiwgJ2FiYycpLCBrZXk9YmxhaCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInNvcnRlZChtYXAoZiwgJ2FiYycpLCBrZXk9YmxhaClbMF0iIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImVudW1lcmF0ZShtYXAoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiZW51bWVyYXRlKG1hcChmLCAnYWJjJyksIHN0YXJ0PTEpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJmb3IgaSBpbiBtYXAoZiwgJ2FiYycpOiBwYXNzIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJbeCBmb3IgeCBpbiBtYXAoZiwgJ2FiYycpXSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiKHggZm9yIHggaW4gbWFwKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKworICAgIGRlZiB0ZXN0X2Z1dHVyZV9idWlsdGlucyhzZWxmKToKKyAgICAgICAgYSA9ICJmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgc3BhbSwgbWFwLCBlZ2dzOyBtYXAoZiwgJ2hhbScpIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorCisgICAgICAgIGIgPSAiIiJmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgc3BhbSwgZWdnczsgeCA9IG1hcChmLCAnYWJjJykiIiIKKyAgICAgICAgYSA9ICIiImZyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCBzcGFtLCBlZ2dzOyB4ID0gbGlzdChtYXAoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYSA9ICJmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgKjsgbWFwKGYsICdoYW0nKSIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKworY2xhc3MgVGVzdF96aXAoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiemlwIgorCisgICAgZGVmIGNoZWNrKHNlbGYsIGIsIGEpOgorICAgICAgICBzZWxmLnVuY2hhbmdlZCgiZnJvbSBmdXR1cmVfYnVpbHRpbnMgaW1wb3J0IHppcDsgIiArIGIsIGEpCisgICAgICAgIHN1cGVyKFRlc3RfemlwLCBzZWxmKS5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfemlwX2Jhc2ljKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IHppcChhLCBiLCBjKSIiIgorICAgICAgICBhID0gIiIieCA9IGxpc3QoemlwKGEsIGIsIGMpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInggPSBsZW4oemlwKGEsIGIpKSIiIgorICAgICAgICBhID0gIiIieCA9IGxlbihsaXN0KHppcChhLCBiKSkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3ppcF9ub2NoYW5nZShzZWxmKToKKyAgICAgICAgYSA9ICIiImIuam9pbih6aXAoYSwgYikpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiIoYSArIGZvbyg1KSkuam9pbih6aXAoYSwgYikpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJpdGVyKHppcChhLCBiKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImxpc3QoemlwKGEsIGIpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIibGlzdCh6aXAoYSwgYikpWzBdIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJzZXQoemlwKGEsIGIpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIic2V0KHppcChhLCBiKSkucG9wKCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInR1cGxlKHppcChhLCBiKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImFueSh6aXAoYSwgYikpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJhbGwoemlwKGEsIGIpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIic3VtKHppcChhLCBiKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInNvcnRlZCh6aXAoYSwgYikpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJzb3J0ZWQoemlwKGEsIGIpLCBrZXk9YmxhaCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInNvcnRlZCh6aXAoYSwgYiksIGtleT1ibGFoKVswXSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiZW51bWVyYXRlKHppcChhLCBiKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImVudW1lcmF0ZSh6aXAoYSwgYiksIHN0YXJ0PTEpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJmb3IgaSBpbiB6aXAoYSwgYik6IHBhc3MiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiIlt4IGZvciB4IGluIHppcChhLCBiKV0iIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiIih4IGZvciB4IGluIHppcChhLCBiKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKworICAgIGRlZiB0ZXN0X2Z1dHVyZV9idWlsdGlucyhzZWxmKToKKyAgICAgICAgYSA9ICJmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgc3BhbSwgemlwLCBlZ2dzOyB6aXAoYSwgYikiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisKKyAgICAgICAgYiA9ICIiImZyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCBzcGFtLCBlZ2dzOyB4ID0gemlwKGEsIGIpIiIiCisgICAgICAgIGEgPSAiIiJmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgc3BhbSwgZWdnczsgeCA9IGxpc3QoemlwKGEsIGIpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYSA9ICJmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgKjsgemlwKGEsIGIpIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorCitjbGFzcyBUZXN0X3N0YW5kYXJkZXJyb3IoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAic3RhbmRhcmRlcnJvciIKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBiID0gIiIieCA9ICAgIFN0YW5kYXJkRXJyb3IoKSIiIgorICAgICAgICBhID0gIiIieCA9ICAgIEV4Y2VwdGlvbigpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieCA9IFN0YW5kYXJkRXJyb3IoYSwgYiwgYykiIiIKKyAgICAgICAgYSA9ICIiInggPSBFeGNlcHRpb24oYSwgYiwgYykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJmKDIgKyBTdGFuZGFyZEVycm9yKGEsIGIsIGMpKSIiIgorICAgICAgICBhID0gIiIiZigyICsgRXhjZXB0aW9uKGEsIGIsIGMpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfdHlwZXMoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAidHlwZXMiCisKKyAgICBkZWYgdGVzdF9iYXNpY190eXBlc19jb252ZXJ0KHNlbGYpOgorICAgICAgICBiID0gIiIidHlwZXMuU3RyaW5nVHlwZSIiIgorICAgICAgICBhID0gIiIiYnl0ZXMiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ0eXBlcy5EaWN0VHlwZSIiIgorICAgICAgICBhID0gIiIiZGljdCIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInR5cGVzIC4gSW50VHlwZSIiIgorICAgICAgICBhID0gIiIiaW50IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIidHlwZXMuTGlzdFR5cGUiIiIKKyAgICAgICAgYSA9ICIiImxpc3QiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ0eXBlcy5Mb25nVHlwZSIiIgorICAgICAgICBhID0gIiIiaW50IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIidHlwZXMuTm9uZVR5cGUiIiIKKyAgICAgICAgYSA9ICIiInR5cGUoTm9uZSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCitjbGFzcyBUZXN0X2lkaW9tcyhGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJpZGlvbXMiCisKKyAgICBkZWYgdGVzdF93aGlsZShzZWxmKToKKyAgICAgICAgYiA9ICIiIndoaWxlIDE6IGZvbygpIiIiCisgICAgICAgIGEgPSAiIiJ3aGlsZSBUcnVlOiBmb28oKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIndoaWxlICAgMTogZm9vKCkiIiIKKyAgICAgICAgYSA9ICIiIndoaWxlICAgVHJ1ZTogZm9vKCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgZm9vKCkKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGZvbygpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfd2hpbGVfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBzID0gIiIid2hpbGUgMTE6IGZvbygpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiIndoaWxlIDA6IGZvbygpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiIndoaWxlIGZvbygpOiBmb28oKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJ3aGlsZSBbXTogZm9vKCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X2VxX3NpbXBsZShzZWxmKToKKyAgICAgICAgYiA9ICIiInR5cGUoeCkgPT0gVCIiIgorICAgICAgICBhID0gIiIiaXNpbnN0YW5jZSh4LCBUKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImlmICAgdHlwZSh4KSA9PSBUOiBwYXNzIiIiCisgICAgICAgIGEgPSAiIiJpZiAgIGlzaW5zdGFuY2UoeCwgVCk6IHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfZXFfcmV2ZXJzZShzZWxmKToKKyAgICAgICAgYiA9ICIiIlQgPT0gdHlwZSh4KSIiIgorICAgICAgICBhID0gIiIiaXNpbnN0YW5jZSh4LCBUKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImlmICAgVCA9PSB0eXBlKHgpOiBwYXNzIiIiCisgICAgICAgIGEgPSAiIiJpZiAgIGlzaW5zdGFuY2UoeCwgVCk6IHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfZXFfZXhwcmVzc2lvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInR5cGUoeCt5KSA9PSBkLmdldCgnVCcpIiIiCisgICAgICAgIGEgPSAiIiJpc2luc3RhbmNlKHgreSwgZC5nZXQoJ1QnKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ0eXBlKCAgIHggICsgIHkpID09IGQuZ2V0KCdUJykiIiIKKyAgICAgICAgYSA9ICIiImlzaW5zdGFuY2UoeCAgKyAgeSwgZC5nZXQoJ1QnKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfaXNfc2ltcGxlKHNlbGYpOgorICAgICAgICBiID0gIiIidHlwZSh4KSBpcyBUIiIiCisgICAgICAgIGEgPSAiIiJpc2luc3RhbmNlKHgsIFQpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiaWYgICB0eXBlKHgpIGlzIFQ6IHBhc3MiIiIKKyAgICAgICAgYSA9ICIiImlmICAgaXNpbnN0YW5jZSh4LCBUKTogcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pc19yZXZlcnNlKHNlbGYpOgorICAgICAgICBiID0gIiIiVCBpcyB0eXBlKHgpIiIiCisgICAgICAgIGEgPSAiIiJpc2luc3RhbmNlKHgsIFQpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiaWYgICBUIGlzIHR5cGUoeCk6IHBhc3MiIiIKKyAgICAgICAgYSA9ICIiImlmICAgaXNpbnN0YW5jZSh4LCBUKTogcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pc19leHByZXNzaW9uKHNlbGYpOgorICAgICAgICBiID0gIiIidHlwZSh4K3kpIGlzIGQuZ2V0KCdUJykiIiIKKyAgICAgICAgYSA9ICIiImlzaW5zdGFuY2UoeCt5LCBkLmdldCgnVCcpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInR5cGUoICAgeCAgKyAgeSkgaXMgZC5nZXQoJ1QnKSIiIgorICAgICAgICBhID0gIiIiaXNpbnN0YW5jZSh4ICArICB5LCBkLmdldCgnVCcpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pc19ub3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICBiID0gIiIidHlwZSh4KSBpcyBub3QgVCIiIgorICAgICAgICBhID0gIiIibm90IGlzaW5zdGFuY2UoeCwgVCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJpZiAgIHR5cGUoeCkgaXMgbm90IFQ6IHBhc3MiIiIKKyAgICAgICAgYSA9ICIiImlmICAgbm90IGlzaW5zdGFuY2UoeCwgVCk6IHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfaXNfbm90X3JldmVyc2Uoc2VsZik6CisgICAgICAgIGIgPSAiIiJUIGlzIG5vdCB0eXBlKHgpIiIiCisgICAgICAgIGEgPSAiIiJub3QgaXNpbnN0YW5jZSh4LCBUKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImlmICAgVCBpcyBub3QgdHlwZSh4KTogcGFzcyIiIgorICAgICAgICBhID0gIiIiaWYgICBub3QgaXNpbnN0YW5jZSh4LCBUKTogcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pc19ub3RfZXhwcmVzc2lvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInR5cGUoeCt5KSBpcyBub3QgZC5nZXQoJ1QnKSIiIgorICAgICAgICBhID0gIiIibm90IGlzaW5zdGFuY2UoeCt5LCBkLmdldCgnVCcpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInR5cGUoICAgeCAgKyAgeSkgaXMgbm90IGQuZ2V0KCdUJykiIiIKKyAgICAgICAgYSA9ICIiIm5vdCBpc2luc3RhbmNlKHggICsgIHksIGQuZ2V0KCdUJykpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X25lX3NpbXBsZShzZWxmKToKKyAgICAgICAgYiA9ICIiInR5cGUoeCkgIT0gVCIiIgorICAgICAgICBhID0gIiIibm90IGlzaW5zdGFuY2UoeCwgVCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJpZiAgIHR5cGUoeCkgIT0gVDogcGFzcyIiIgorICAgICAgICBhID0gIiIiaWYgICBub3QgaXNpbnN0YW5jZSh4LCBUKTogcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9uZV9yZXZlcnNlKHNlbGYpOgorICAgICAgICBiID0gIiIiVCAhPSB0eXBlKHgpIiIiCisgICAgICAgIGEgPSAiIiJub3QgaXNpbnN0YW5jZSh4LCBUKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImlmICAgVCAhPSB0eXBlKHgpOiBwYXNzIiIiCisgICAgICAgIGEgPSAiIiJpZiAgIG5vdCBpc2luc3RhbmNlKHgsIFQpOiBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X25lX2V4cHJlc3Npb24oc2VsZik6CisgICAgICAgIGIgPSAiIiJ0eXBlKHgreSkgIT0gZC5nZXQoJ1QnKSIiIgorICAgICAgICBhID0gIiIibm90IGlzaW5zdGFuY2UoeCt5LCBkLmdldCgnVCcpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInR5cGUoICAgeCAgKyAgeSkgIT0gZC5nZXQoJ1QnKSIiIgorICAgICAgICBhID0gIiIibm90IGlzaW5zdGFuY2UoeCAgKyAgeSwgZC5nZXQoJ1QnKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdHlwZV91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIGEgPSAiIiJ0eXBlKHgpLl9fbmFtZV9fIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisKKyAgICBkZWYgdGVzdF9zb3J0X2xpc3RfY2FsbChzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdiA9IGxpc3QodCkKKyAgICAgICAgICAgIHYuc29ydCgpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB2ID0gc29ydGVkKHQpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdiA9IGxpc3QoZm9vKGIpICsgZCkKKyAgICAgICAgICAgIHYuc29ydCgpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB2ID0gc29ydGVkKGZvbyhiKSArIGQpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgd2hpbGUgeDoKKyAgICAgICAgICAgICAgICB2ID0gbGlzdCh0KQorICAgICAgICAgICAgICAgIHYuc29ydCgpCisgICAgICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgd2hpbGUgeDoKKyAgICAgICAgICAgICAgICB2ID0gc29ydGVkKHQpCisgICAgICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHYgPSBsaXN0KHQpCisgICAgICAgICAgICAjIGZvbworICAgICAgICAgICAgdi5zb3J0KCkKKyAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHYgPSBzb3J0ZWQodCkKKyAgICAgICAgICAgICMgZm9vCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9IHIiIiIKKyAgICAgICAgICAgIHYgPSBsaXN0KCAgIHQpCisgICAgICAgICAgICB2LnNvcnQoKQorICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9IHIiIiIKKyAgICAgICAgICAgIHYgPSBzb3J0ZWQoICAgdCkKKyAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gciIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG0gPSBsaXN0KHMpCisgICAgICAgICAgICAgICAgbS5zb3J0KCkKKyAgICAgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICAgICAgIiIiCisKKyAgICAgICAgYSA9IHIiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtID0gc29ydGVkKHMpCisgICAgICAgICAgICBleGNlcHQ6IHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9IHIiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtID0gbGlzdChzKQorICAgICAgICAgICAgICAgICMgZm9vCisgICAgICAgICAgICAgICAgbS5zb3J0KCkKKyAgICAgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICAgICAgIiIiCisKKyAgICAgICAgYSA9IHIiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtID0gc29ydGVkKHMpCisgICAgICAgICAgICAgICAgIyBmb28KKyAgICAgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gciIiIgorICAgICAgICAgICAgbSA9IGxpc3QocykKKyAgICAgICAgICAgICMgbW9yZSBjb21tZW50cworICAgICAgICAgICAgbS5zb3J0KCkiIiIKKworICAgICAgICBhID0gciIiIgorICAgICAgICAgICAgbSA9IHNvcnRlZChzKQorICAgICAgICAgICAgIyBtb3JlIGNvbW1lbnRzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3NvcnRfc2ltcGxlX2V4cHIoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHYgPSB0CisgICAgICAgICAgICB2LnNvcnQoKQorICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgdiA9IHNvcnRlZCh0KQorICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHYgPSBmb28oYikKKyAgICAgICAgICAgIHYuc29ydCgpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB2ID0gc29ydGVkKGZvbyhiKSkKKyAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCisgICAgICAgICAgICB2ID0gYi5rZXlzKCkKKyAgICAgICAgICAgIHYuc29ydCgpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB2ID0gc29ydGVkKGIua2V5cygpKQorICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHYgPSBmb28oYikgKyBkCisgICAgICAgICAgICB2LnNvcnQoKQorICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgdiA9IHNvcnRlZChmb28oYikgKyBkKQorICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHdoaWxlIHg6CisgICAgICAgICAgICAgICAgdiA9IHQKKyAgICAgICAgICAgICAgICB2LnNvcnQoKQorICAgICAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHdoaWxlIHg6CisgICAgICAgICAgICAgICAgdiA9IHNvcnRlZCh0KQorICAgICAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCisgICAgICAgICAgICB2ID0gdAorICAgICAgICAgICAgIyBmb28KKyAgICAgICAgICAgIHYuc29ydCgpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB2ID0gc29ydGVkKHQpCisgICAgICAgICAgICAjIGZvbworICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSByIiIiCisgICAgICAgICAgICB2ID0gICB0CisgICAgICAgICAgICB2LnNvcnQoKQorICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9IHIiIiIKKyAgICAgICAgICAgIHYgPSAgIHNvcnRlZCh0KQorICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfc29ydF91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHYgPSBsaXN0KHQpCisgICAgICAgICAgICB3LnNvcnQoKQorICAgICAgICAgICAgZm9vKHcpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB2ID0gbGlzdCh0KQorICAgICAgICAgICAgdi5zb3J0KHUpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCitjbGFzcyBUZXN0X2Jhc2VzdHJpbmcoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiYmFzZXN0cmluZyIKKworICAgIGRlZiB0ZXN0X2Jhc2VzdHJpbmcoc2VsZik6CisgICAgICAgIGIgPSAiIiJpc2luc3RhbmNlKHgsIGJhc2VzdHJpbmcpIiIiCisgICAgICAgIGEgPSAiIiJpc2luc3RhbmNlKHgsIHN0cikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCitjbGFzcyBUZXN0X2J1ZmZlcihGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJidWZmZXIiCisKKyAgICBkZWYgdGVzdF9idWZmZXIoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYnVmZmVyKHkpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gbWVtb3J5dmlldyh5KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9zbGljaW5nKHNlbGYpOgorICAgICAgICBiID0gIiIiYnVmZmVyKHkpWzQ6NV0iIiIKKyAgICAgICAgYSA9ICIiIm1lbW9yeXZpZXcoeSlbNDo1XSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfZnV0dXJlKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImZ1dHVyZSIKKworICAgIGRlZiB0ZXN0X2Z1dHVyZShzZWxmKToKKyAgICAgICAgYiA9ICIiImZyb20gX19mdXR1cmVfXyBpbXBvcnQgYnJhY2VzIiIiCisgICAgICAgIGEgPSAiIiIiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIjIGNvbW1lbnRcbmZyb20gX19mdXR1cmVfXyBpbXBvcnQgYnJhY2VzIiIiCisgICAgICAgIGEgPSAiIiIjIGNvbW1lbnRcbiIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImZyb20gX19mdXR1cmVfXyBpbXBvcnQgYnJhY2VzXG4jIGNvbW1lbnQiIiIKKyAgICAgICAgYSA9ICIiIlxuIyBjb21tZW50IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3J1bl9vcmRlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRfcnVuc19hZnRlcigncHJpbnQnKQorCitjbGFzcyBUZXN0X2l0ZXJ0b29scyhGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJpdGVydG9vbHMiCisKKyAgICBkZWYgY2hlY2thbGwoc2VsZiwgYmVmb3JlLCBhZnRlcik6CisgICAgICAgICMgQmVjYXVzZSB3ZSBuZWVkIHRvIGNoZWNrIHdpdGggYW5kIHdpdGhvdXQgdGhlIGl0ZXJ0b29scyBwcmVmaXgKKyAgICAgICAgIyBhbmQgb24gZWFjaCBvZiB0aGUgdGhyZWUgZnVuY3Rpb25zLCB0aGVzZSBsb29wcyBtYWtlIGl0IGFsbAorICAgICAgICAjIG11Y2ggZWFzaWVyCisgICAgICAgIGZvciBpIGluICgnaXRlcnRvb2xzLicsICcnKToKKyAgICAgICAgICAgIGZvciBmIGluICgnbWFwJywgJ2ZpbHRlcicsICd6aXAnKToKKyAgICAgICAgICAgICAgICBiID0gYmVmb3JlICUoaSsnaScrZikKKyAgICAgICAgICAgICAgICBhID0gYWZ0ZXIgJShmKQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzAoc2VsZik6CisgICAgICAgICMgQSBzaW1wbGUgZXhhbXBsZSAtLSB0ZXN0XzEgY292ZXJzIGV4YWN0bHkgdGhlIHNhbWUgdGhpbmcsCisgICAgICAgICMgYnV0IGl0J3Mgbm90IHF1aXRlIGFzIGNsZWFyLgorICAgICAgICBiID0gIml0ZXJ0b29scy5pemlwKGEsIGIpIgorICAgICAgICBhID0gInppcChhLCBiKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgYiA9ICIiIiVzKGYsIGEpIiIiCisgICAgICAgIGEgPSAiIiIlcyhmLCBhKSIiIgorICAgICAgICBzZWxmLmNoZWNrYWxsKGIsIGEpCisKKyAgICBkZWYgdGVzdF9xdWFsaWZpZWQoc2VsZik6CisgICAgICAgIGIgPSAiIiJpdGVydG9vbHMuaWZpbHRlcmZhbHNlKGEsIGIpIiIiCisgICAgICAgIGEgPSAiIiJpdGVydG9vbHMuZmlsdGVyZmFsc2UoYSwgYikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJpdGVydG9vbHMuaXppcF9sb25nZXN0KGEsIGIpIiIiCisgICAgICAgIGEgPSAiIiJpdGVydG9vbHMuemlwX2xvbmdlc3QoYSwgYikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgYiA9ICIiImlmaWx0ZXJmYWxzZShhLCBiKSIiIgorICAgICAgICBhID0gIiIiZmlsdGVyZmFsc2UoYSwgYikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJpemlwX2xvbmdlc3QoYSwgYikiIiIKKyAgICAgICAgYSA9ICIiInppcF9sb25nZXN0KGEsIGIpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3NwYWNlXzEoc2VsZik6CisgICAgICAgIGIgPSAiIiIgICAgJXMoZiwgYSkiIiIKKyAgICAgICAgYSA9ICIiIiAgICAlcyhmLCBhKSIiIgorICAgICAgICBzZWxmLmNoZWNrYWxsKGIsIGEpCisKKyAgICBkZWYgdGVzdF9zcGFjZV8yKHNlbGYpOgorICAgICAgICBiID0gIiIiICAgIGl0ZXJ0b29scy5pZmlsdGVyZmFsc2UoYSwgYikiIiIKKyAgICAgICAgYSA9ICIiIiAgICBpdGVydG9vbHMuZmlsdGVyZmFsc2UoYSwgYikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIgICAgaXRlcnRvb2xzLml6aXBfbG9uZ2VzdChhLCBiKSIiIgorICAgICAgICBhID0gIiIiICAgIGl0ZXJ0b29scy56aXBfbG9uZ2VzdChhLCBiKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9ydW5fb3JkZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0X3J1bnNfYWZ0ZXIoJ21hcCcsICd6aXAnLCAnZmlsdGVyJykKKworCitjbGFzcyBUZXN0X2l0ZXJ0b29sc19pbXBvcnRzKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gJ2l0ZXJ0b29sc19pbXBvcnRzJworCisgICAgZGVmIHRlc3RfcmVkdWNlZChzZWxmKToKKyAgICAgICAgYiA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaW1hcCwgaXppcCwgZm9vIgorICAgICAgICBhID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBmb28iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBiYXIsIGltYXAsIGl6aXAsIGZvbyIKKyAgICAgICAgYSA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgYmFyLCBmb28iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbiwgaW1hcCwgaXppcCIKKyAgICAgICAgYSA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRzKHNlbGYpOgorICAgICAgICBiID0gIiNmb29cbmZyb20gaXRlcnRvb2xzIGltcG9ydCBpbWFwLCBpemlwIgorICAgICAgICBhID0gIiNmb29cbiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfbm9uZShzZWxmKToKKyAgICAgICAgYiA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaW1hcCwgaXppcCIKKyAgICAgICAgYSA9ICIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBpemlwIgorICAgICAgICBhID0gIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2FzKHNlbGYpOgorICAgICAgICBiID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBpemlwLCBiYXIgYXMgYmFuZywgaW1hcCIKKyAgICAgICAgYSA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgYmFyIGFzIGJhbmciCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBpemlwIGFzIF96aXAsIGltYXAsIGJhciIKKyAgICAgICAgYSA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgYmFyIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaW1hcCBhcyBfbWFwIgorICAgICAgICBhID0gIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0IGltYXAgYXMgX21hcCwgaXppcCBhcyBfemlwIgorICAgICAgICBhID0gIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIHMgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0IGJhciBhcyBiYW5nIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfaWZpbHRlcl9hbmRfemlwX2xvbmdlc3Qoc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluICJmaWx0ZXJmYWxzZSIsICJ6aXBfbG9uZ2VzdCI6CisgICAgICAgICAgICBiID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBpJXMiICUgKG5hbWUsKQorICAgICAgICAgICAgYSA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgJXMiICUgKG5hbWUsKQorICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICAgICBiID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBpbWFwLCBpJXMsIGZvbyIgJSAobmFtZSwpCisgICAgICAgICAgICBhID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCAlcywgZm9vIiAlIChuYW1lLCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAgICAgYiA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgYmFyLCBpJXMsIGZvbyIgJSAobmFtZSwpCisgICAgICAgICAgICBhID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBiYXIsICVzLCBmb28iICUgKG5hbWUsKQorICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X3N0YXIoc2VsZik6CisgICAgICAgIHMgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0ICoiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZChzZWxmKToKKyAgICAgICAgcyA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgZm9vIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisKK2NsYXNzIFRlc3RfaW1wb3J0KEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImltcG9ydCIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdF9pbXBvcnQsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgIyBOZWVkIHRvIHJlcGxhY2UgZml4X2ltcG9ydCdzIGV4aXN0cyBtZXRob2QKKyAgICAgICAgIyBzbyB3ZSBjYW4gY2hlY2sgdGhhdCBpdCdzIGRvaW5nIHRoZSByaWdodCB0aGluZworICAgICAgICBzZWxmLmZpbGVzX2NoZWNrZWQgPSBbXQorICAgICAgICBzZWxmLnByZXNlbnRfZmlsZXMgPSBzZXQoKQorICAgICAgICBzZWxmLmFsd2F5c19leGlzdHMgPSBUcnVlCisgICAgICAgIGRlZiBmYWtlX2V4aXN0cyhuYW1lKToKKyAgICAgICAgICAgIHNlbGYuZmlsZXNfY2hlY2tlZC5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFsd2F5c19leGlzdHMgb3IgKG5hbWUgaW4gc2VsZi5wcmVzZW50X2ZpbGVzKQorCisgICAgICAgIGZyb20gbGliMnRvMy5maXhlcyBpbXBvcnQgZml4X2ltcG9ydAorICAgICAgICBmaXhfaW1wb3J0LmV4aXN0cyA9IGZha2VfZXhpc3RzCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZyb20gbGliMnRvMy5maXhlcyBpbXBvcnQgZml4X2ltcG9ydAorICAgICAgICBmaXhfaW1wb3J0LmV4aXN0cyA9IG9zLnBhdGguZXhpc3RzCisKKyAgICBkZWYgY2hlY2tfYm90aChzZWxmLCBiLCBhKToKKyAgICAgICAgc2VsZi5hbHdheXNfZXhpc3RzID0gVHJ1ZQorICAgICAgICBzdXBlcihUZXN0X2ltcG9ydCwgc2VsZikuY2hlY2soYiwgYSkKKyAgICAgICAgc2VsZi5hbHdheXNfZXhpc3RzID0gRmFsc2UKKyAgICAgICAgc3VwZXIoVGVzdF9pbXBvcnQsIHNlbGYpLnVuY2hhbmdlZChiKQorCisgICAgZGVmIHRlc3RfZmlsZXNfY2hlY2tlZChzZWxmKToKKyAgICAgICAgZGVmIHAocGF0aCk6CisgICAgICAgICAgICAjIFRha2VzIGEgdW5peCBwYXRoIGFuZCByZXR1cm5zIGEgcGF0aCB3aXRoIGNvcnJlY3Qgc2VwYXJhdG9ycworICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGgucGF0aHNlcC5qb2luKHBhdGguc3BsaXQoIi8iKSkKKworICAgICAgICBzZWxmLmFsd2F5c19leGlzdHMgPSBGYWxzZQorICAgICAgICBzZWxmLnByZXNlbnRfZmlsZXMgPSBzZXQoWydfX2luaXRfXy5weSddKQorICAgICAgICBleHBlY3RlZF9leHRlbnNpb25zID0gKCcucHknLCBvcy5wYXRoLnNlcCwgJy5weWMnLCAnLnNvJywgJy5zbCcsICcucHlkJykKKyAgICAgICAgbmFtZXNfdG9fdGVzdCA9IChwKCIvc3BhbS9lZ2dzLnB5IiksICJuaS5weSIsIHAoIi4uLy4uL3NocnViYmVyeS5weSIpKQorCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzX3RvX3Rlc3Q6CisgICAgICAgICAgICBzZWxmLmZpbGVzX2NoZWNrZWQgPSBbXQorICAgICAgICAgICAgc2VsZi5maWxlbmFtZSA9IG5hbWUKKyAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKCJpbXBvcnQgamFtIikKKworICAgICAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKG5hbWUpOgorICAgICAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmRpcm5hbWUobmFtZSkgKyAnL2phbScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmFtZSA9ICdqYW0nCisgICAgICAgICAgICBleHBlY3RlZF9jaGVja3MgPSBzZXQobmFtZSArIGV4dCBmb3IgZXh0IGluIGV4cGVjdGVkX2V4dGVuc2lvbnMpCisgICAgICAgICAgICBleHBlY3RlZF9jaGVja3MuYWRkKCJfX2luaXRfXy5weSIpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHNlbGYuZmlsZXNfY2hlY2tlZCksIGV4cGVjdGVkX2NoZWNrcykKKworICAgIGRlZiB0ZXN0X25vdF9pbl9wYWNrYWdlKHNlbGYpOgorICAgICAgICBzID0gImltcG9ydCBiYXIiCisgICAgICAgIHNlbGYuYWx3YXlzX2V4aXN0cyA9IEZhbHNlCisgICAgICAgIHNlbGYucHJlc2VudF9maWxlcyA9IHNldChbImJhci5weSJdKQorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3Rfd2l0aF9hYnNvbHV0ZV9pbXBvcnRfZW5hYmxlZChzZWxmKToKKyAgICAgICAgcyA9ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydFxuaW1wb3J0IGJhciIKKyAgICAgICAgc2VsZi5hbHdheXNfZXhpc3RzID0gRmFsc2UKKyAgICAgICAgc2VsZi5wcmVzZW50X2ZpbGVzID0gc2V0KFsiX19pbml0X18ucHkiLCAiYmFyLnB5Il0pCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9pbl9wYWNrYWdlKHNlbGYpOgorICAgICAgICBiID0gImltcG9ydCBiYXIiCisgICAgICAgIGEgPSAiZnJvbSAuIGltcG9ydCBiYXIiCisgICAgICAgIHNlbGYuYWx3YXlzX2V4aXN0cyA9IEZhbHNlCisgICAgICAgIHNlbGYucHJlc2VudF9maWxlcyA9IHNldChbIl9faW5pdF9fLnB5IiwgImJhci5weSJdKQorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfZnJvbV9wYWNrYWdlKHNlbGYpOgorICAgICAgICBiID0gImltcG9ydCBiYXIiCisgICAgICAgIGEgPSAiZnJvbSAuIGltcG9ydCBiYXIiCisgICAgICAgIHNlbGYuYWx3YXlzX2V4aXN0cyA9IEZhbHNlCisgICAgICAgIHNlbGYucHJlc2VudF9maWxlcyA9IHNldChbIl9faW5pdF9fLnB5IiwgImJhciIgKyBvcy5wYXRoLnNlcF0pCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2FscmVhZHlfcmVsYXRpdmVfaW1wb3J0KHNlbGYpOgorICAgICAgICBzID0gImZyb20gLiBpbXBvcnQgYmFyIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfY29tbWVudHNfYW5kX2luZGVudChzZWxmKToKKyAgICAgICAgYiA9ICJpbXBvcnQgYmFyICMgRm9vIgorICAgICAgICBhID0gImZyb20gLiBpbXBvcnQgYmFyICMgRm9vIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9mcm9tKHNlbGYpOgorICAgICAgICBiID0gImZyb20gZm9vIGltcG9ydCBiYXIsIGJheiIKKyAgICAgICAgYSA9ICJmcm9tIC5mb28gaW1wb3J0IGJhciwgYmF6IgorICAgICAgICBzZWxmLmNoZWNrX2JvdGgoYiwgYSkKKworICAgICAgICBiID0gImZyb20gZm9vIGltcG9ydCBiYXIiCisgICAgICAgIGEgPSAiZnJvbSAuZm9vIGltcG9ydCBiYXIiCisgICAgICAgIHNlbGYuY2hlY2tfYm90aChiLCBhKQorCisgICAgICAgIGIgPSAiZnJvbSBmb28gaW1wb3J0IChiYXIsIGJheikiCisgICAgICAgIGEgPSAiZnJvbSAuZm9vIGltcG9ydCAoYmFyLCBiYXopIgorICAgICAgICBzZWxmLmNoZWNrX2JvdGgoYiwgYSkKKworICAgIGRlZiB0ZXN0X2RvdHRlZF9mcm9tKHNlbGYpOgorICAgICAgICBiID0gImZyb20gZ3JlZW4uZWdncyBpbXBvcnQgaGFtIgorICAgICAgICBhID0gImZyb20gLmdyZWVuLmVnZ3MgaW1wb3J0IGhhbSIKKyAgICAgICAgc2VsZi5jaGVja19ib3RoKGIsIGEpCisKKyAgICBkZWYgdGVzdF9mcm9tX2FzKHNlbGYpOgorICAgICAgICBiID0gImZyb20gZ3JlZW4uZWdncyBpbXBvcnQgaGFtIGFzIHNwYW0iCisgICAgICAgIGEgPSAiZnJvbSAuZ3JlZW4uZWdncyBpbXBvcnQgaGFtIGFzIHNwYW0iCisgICAgICAgIHNlbGYuY2hlY2tfYm90aChiLCBhKQorCisgICAgZGVmIHRlc3RfaW1wb3J0KHNlbGYpOgorICAgICAgICBiID0gImltcG9ydCBmb28iCisgICAgICAgIGEgPSAiZnJvbSAuIGltcG9ydCBmb28iCisgICAgICAgIHNlbGYuY2hlY2tfYm90aChiLCBhKQorCisgICAgICAgIGIgPSAiaW1wb3J0IGZvbywgYmFyIgorICAgICAgICBhID0gImZyb20gLiBpbXBvcnQgZm9vLCBiYXIiCisgICAgICAgIHNlbGYuY2hlY2tfYm90aChiLCBhKQorCisgICAgICAgIGIgPSAiaW1wb3J0IGZvbywgYmFyLCB4IgorICAgICAgICBhID0gImZyb20gLiBpbXBvcnQgZm9vLCBiYXIsIHgiCisgICAgICAgIHNlbGYuY2hlY2tfYm90aChiLCBhKQorCisgICAgICAgIGIgPSAiaW1wb3J0IHgsIHksIHoiCisgICAgICAgIGEgPSAiZnJvbSAuIGltcG9ydCB4LCB5LCB6IgorICAgICAgICBzZWxmLmNoZWNrX2JvdGgoYiwgYSkKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9hcyhzZWxmKToKKyAgICAgICAgYiA9ICJpbXBvcnQgZm9vIGFzIHgiCisgICAgICAgIGEgPSAiZnJvbSAuIGltcG9ydCBmb28gYXMgeCIKKyAgICAgICAgc2VsZi5jaGVja19ib3RoKGIsIGEpCisKKyAgICAgICAgYiA9ICJpbXBvcnQgYSBhcyBiLCBiIGFzIGMsIGMgYXMgZCIKKyAgICAgICAgYSA9ICJmcm9tIC4gaW1wb3J0IGEgYXMgYiwgYiBhcyBjLCBjIGFzIGQiCisgICAgICAgIHNlbGYuY2hlY2tfYm90aChiLCBhKQorCisgICAgZGVmIHRlc3RfbG9jYWxfYW5kX2Fic29sdXRlKHNlbGYpOgorICAgICAgICBzZWxmLmFsd2F5c19leGlzdHMgPSBGYWxzZQorICAgICAgICBzZWxmLnByZXNlbnRfZmlsZXMgPSBzZXQoWyJmb28ucHkiLCAiX19pbml0X18ucHkiXSkKKworICAgICAgICBzID0gImltcG9ydCBmb28sIGJhciIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgImFic29sdXRlIGFuZCBsb2NhbCBpbXBvcnRzIHRvZ2V0aGVyIikKKworICAgIGRlZiB0ZXN0X2RvdHRlZF9pbXBvcnQoc2VsZik6CisgICAgICAgIGIgPSAiaW1wb3J0IGZvby5iYXIiCisgICAgICAgIGEgPSAiZnJvbSAuIGltcG9ydCBmb28uYmFyIgorICAgICAgICBzZWxmLmNoZWNrX2JvdGgoYiwgYSkKKworICAgIGRlZiB0ZXN0X2RvdHRlZF9pbXBvcnRfYXMoc2VsZik6CisgICAgICAgIGIgPSAiaW1wb3J0IGZvby5iYXIgYXMgYmFuZyIKKyAgICAgICAgYSA9ICJmcm9tIC4gaW1wb3J0IGZvby5iYXIgYXMgYmFuZyIKKyAgICAgICAgc2VsZi5jaGVja19ib3RoKGIsIGEpCisKKyAgICBkZWYgdGVzdF9wcmVmaXgoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgIyBwcmVmaXgKKyAgICAgICAgaW1wb3J0IGZvby5iYXIKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgIyBwcmVmaXgKKyAgICAgICAgZnJvbSAuIGltcG9ydCBmb28uYmFyCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrX2JvdGgoYiwgYSkKKworCitjbGFzcyBUZXN0X3NldF9saXRlcmFsKEZpeGVyVGVzdENhc2UpOgorCisgICAgZml4ZXIgPSAic2V0X2xpdGVyYWwiCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgYiA9ICIiInNldChbMSwgMiwgM10pIiIiCisgICAgICAgIGEgPSAiIiJ7MSwgMiwgM30iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJzZXQoKDEsIDIsIDMpKSIiIgorICAgICAgICBhID0gIiIiezEsIDIsIDN9IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIic2V0KCgxLCkpIiIiCisgICAgICAgIGEgPSAiIiJ7MX0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJzZXQoWzFdKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldCgoYSwgYikpIiIiCisgICAgICAgIGEgPSAiIiJ7YSwgYn0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJzZXQoW2EsIGJdKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldCgoYSoyMzQsIGYoYXJncz0yMykpKSIiIgorICAgICAgICBhID0gIiIie2EqMjM0LCBmKGFyZ3M9MjMpfSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldChbYSoyMywgZigyMyldKSIiIgorICAgICAgICBhID0gIiIie2EqMjMsIGYoMjMpfSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldChbYS0yMzQqKjIzXSkiIiIKKyAgICAgICAgYSA9ICIiInthLTIzNCoqMjN9IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2xpc3Rjb21wcyhzZWxmKToKKyAgICAgICAgYiA9ICIiInNldChbeCBmb3IgeCBpbiB5XSkiIiIKKyAgICAgICAgYSA9ICIiInt4IGZvciB4IGluIHl9IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIic2V0KFt4IGZvciB4IGluIHkgaWYgeCA9PSBtXSkiIiIKKyAgICAgICAgYSA9ICIiInt4IGZvciB4IGluIHkgaWYgeCA9PSBtfSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldChbeCBmb3IgeCBpbiB5IGZvciBhIGluIGJdKSIiIgorICAgICAgICBhID0gIiIie3ggZm9yIHggaW4geSBmb3IgYSBpbiBifSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldChbZih4KSAtIDIzIGZvciB4IGluIHldKSIiIgorICAgICAgICBhID0gIiIie2YoeCkgLSAyMyBmb3IgeCBpbiB5fSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlKHNlbGYpOgorICAgICAgICBiID0gIiIic2V0KCBbMSwgMl0pIiIiCisgICAgICAgIGEgPSAiIiJ7MSwgMn0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJzZXQoWzEgLCAgMl0pIiIiCisgICAgICAgIGEgPSAiIiJ7MSAsICAyfSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldChbIDEgXSkiIiIKKyAgICAgICAgYSA9ICIiInsgMSB9IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIic2V0KCBbMV0gKSIiIgorICAgICAgICBhID0gIiIiezF9IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIic2V0KFsgIDEsICAyICBdKSIiIgorICAgICAgICBhID0gIiIieyAgMSwgIDIgIH0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJzZXQoW3ggIGZvciB4IGluIHkgXSkiIiIKKyAgICAgICAgYSA9ICIiInt4ICBmb3IgeCBpbiB5IH0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJzZXQoCisgICAgICAgICAgICAgICAgICAgWzEsIDJdCisgICAgICAgICAgICAgICApCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiInsxLCAyfVxuIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRzKHNlbGYpOgorICAgICAgICBiID0gIiIic2V0KCgxLCAyKSkgIyBIaSIiIgorICAgICAgICBhID0gIiIiezEsIDJ9ICMgSGkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICMgVGhpcyBpc24ndCBvcHRpbWFsIGJlaGF2aW9yLCBidXQgdGhlIGZpeGVyIGlzIG9wdGlvbmFsLgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICAjIEZvbworICAgICAgICAgICAgc2V0KCAjIEJhcgorICAgICAgICAgICAgICAgKDEsIDIpCisgICAgICAgICAgICApCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgIyBGb28KKyAgICAgICAgICAgIHsxLCAyfQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZChzZWxmKToKKyAgICAgICAgcyA9ICIiInNldCgpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiInNldChhKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJzZXQoYSwgYiwgYykiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICAjIERvbid0IHRyYW5zZm9ybSBnZW5lcmF0b3JzIGJlY2F1c2UgdGhleSBtaWdodCBoYXZlIHRvIGJlIGxhenkuCisgICAgICAgIHMgPSAiIiJzZXQoeCBmb3IgeCBpbiB5KSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJzZXQoeCBmb3IgeCBpbiB5IGlmIHopIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiInNldChhKjgyMy0yMyoqMiArIGYoMjMpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisKK2NsYXNzIFRlc3Rfc3lzX2V4YyhGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJzeXNfZXhjIgorCisgICAgZGVmIHRlc3RfMChzZWxmKToKKyAgICAgICAgYiA9ICJzeXMuZXhjX3R5cGUiCisgICAgICAgIGEgPSAic3lzLmV4Y19pbmZvKClbMF0iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgIGIgPSAic3lzLmV4Y192YWx1ZSIKKyAgICAgICAgYSA9ICJzeXMuZXhjX2luZm8oKVsxXSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgYiA9ICJzeXMuZXhjX3RyYWNlYmFjayIKKyAgICAgICAgYSA9ICJzeXMuZXhjX2luZm8oKVsyXSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMyhzZWxmKToKKyAgICAgICAgYiA9ICJzeXMuZXhjX3R5cGUgIyBGb28iCisgICAgICAgIGEgPSAic3lzLmV4Y19pbmZvKClbMF0gIyBGb28iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzQoc2VsZik6CisgICAgICAgIGIgPSAic3lzLiAgZXhjX3R5cGUiCisgICAgICAgIGEgPSAic3lzLiAgZXhjX2luZm8oKVswXSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNShzZWxmKToKKyAgICAgICAgYiA9ICJzeXMgIC5leGNfdHlwZSIKKyAgICAgICAgYSA9ICJzeXMgIC5leGNfaW5mbygpWzBdIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKworY2xhc3MgVGVzdF9wYXJlbihGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJwYXJlbiIKKworICAgIGRlZiB0ZXN0XzAoc2VsZik6CisgICAgICAgIGIgPSAiIiJbaSBmb3IgaSBpbiAxLCAyIF0iIiIKKyAgICAgICAgYSA9ICIiIltpIGZvciBpIGluICgxLCAyKSBdIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgIGIgPSAiIiJbaSBmb3IgaSBpbiAxLCAyLCBdIiIiCisgICAgICAgIGEgPSAiIiJbaSBmb3IgaSBpbiAoMSwgMiwpIF0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgYiA9ICIiIltpIGZvciBpICBpbiAgICAgMSwgMiBdIiIiCisgICAgICAgIGEgPSAiIiJbaSBmb3IgaSAgaW4gICAgICgxLCAyKSBdIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzMoc2VsZik6CisgICAgICAgIGIgPSAiIiJbaSBmb3IgaSBpbiAxLCAyIGlmIGldIiIiCisgICAgICAgIGEgPSAiIiJbaSBmb3IgaSBpbiAoMSwgMikgaWYgaV0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNChzZWxmKToKKyAgICAgICAgYiA9ICIiIltpIGZvciBpIGluIDEsICAgIDIgICAgXSIiIgorICAgICAgICBhID0gIiIiW2kgZm9yIGkgaW4gKDEsICAgIDIpICAgIF0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNShzZWxmKToKKyAgICAgICAgYiA9ICIiIihpIGZvciBpIGluIDEsIDIpIiIiCisgICAgICAgIGEgPSAiIiIoaSBmb3IgaSBpbiAoMSwgMikpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzYoc2VsZik6CisgICAgICAgIGIgPSAiIiIoaSBmb3IgaSBpbiAxICAgLDIgICBpZiBpKSIiIgorICAgICAgICBhID0gIiIiKGkgZm9yIGkgaW4gKDEgICAsMikgICBpZiBpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMChzZWxmKToKKyAgICAgICAgcyA9ICIiIltpIGZvciBpIGluICgxLCAyKV0iIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF8xKHNlbGYpOgorICAgICAgICBzID0gIiIiW2kgZm9yIGkgaW4gZm9vKCldIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMihzZWxmKToKKyAgICAgICAgcyA9ICIiIltpIGZvciBpIGluICgxLCAyKSBpZiBub3RoaW5nXSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzMoc2VsZik6CisgICAgICAgIHMgPSAiIiIoaSBmb3IgaSBpbiAoMSwgMikpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfNChzZWxmKToKKyAgICAgICAgcyA9ICIiIltpIGZvciBpIGluIG1dIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKK2NsYXNzIFRlc3RfbWV0YWNsYXNzKEZpeGVyVGVzdENhc2UpOgorCisgICAgZml4ZXIgPSAnbWV0YWNsYXNzJworCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBzZWxmLnVuY2hhbmdlZCgiY2xhc3MgWCgpOiBwYXNzIikKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoImNsYXNzIFgob2JqZWN0KTogcGFzcyIpCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKCJjbGFzcyBYKG9iamVjdDEsIG9iamVjdDIpOiBwYXNzIikKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoImNsYXNzIFgob2JqZWN0MSwgb2JqZWN0Miwgb2JqZWN0Myk6IHBhc3MiKQorICAgICAgICBzZWxmLnVuY2hhbmdlZCgiY2xhc3MgWChtZXRhY2xhc3M9TWV0YSk6IHBhc3MiKQorICAgICAgICBzZWxmLnVuY2hhbmdlZCgiY2xhc3MgWChiLCBhcmc9MjMsIG1ldGNsYXNzPU1ldGEpOiBwYXNzIikKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoImNsYXNzIFgoYiwgYXJnPTIzLCBtZXRhY2xhc3M9TWV0YSwgb3RoZXI9NDIpOiBwYXNzIikKKworICAgICAgICBzID0gIiIiCisgICAgICAgIGNsYXNzIFg6CisgICAgICAgICAgICBkZWYgX19tZXRhY2xhc3NfXyhzZWxmKTogcGFzcworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIiCisgICAgICAgIGNsYXNzIFg6CisgICAgICAgICAgICBhWzIzXSA9IDc0CisgICAgICAgICIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfY29tbWVudHMoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgICMgaGkKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBBcHBsZU1ldGEKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgY2xhc3MgWChtZXRhY2xhc3M9QXBwbGVNZXRhKToKKyAgICAgICAgICAgICMgaGkKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCisgICAgICAgIGNsYXNzIFg6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gTWV0YQorICAgICAgICAgICAgIyBCZWR0aW1lIQorICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICBjbGFzcyBYKG1ldGFjbGFzcz1NZXRhKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgQmVkdGltZSEKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X21ldGEoc2VsZik6CisgICAgICAgICMgbm8tcGFyZW50IGNsYXNzLCBvZGQgYm9keQorICAgICAgICBiID0gIiIiCisgICAgICAgIGNsYXNzIFgoKToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBRCisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgIGNsYXNzIFgobWV0YWNsYXNzPVEpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICMgb25lIHBhcmVudCBjbGFzcywgbm8gYm9keQorICAgICAgICBiID0gIiIiY2xhc3MgWChvYmplY3QpOiBfX21ldGFjbGFzc19fID0gUSIiIgorICAgICAgICBhID0gIiIiY2xhc3MgWChvYmplY3QsIG1ldGFjbGFzcz1RKTogcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKworICAgICAgICAjIG9uZSBwYXJlbnQsIHNpbXBsZSBib2R5CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE1ldGEKKyAgICAgICAgICAgIGJhciA9IDcKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgY2xhc3MgWChvYmplY3QsIG1ldGFjbGFzcz1NZXRhKToKKyAgICAgICAgICAgIGJhciA9IDcKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCisgICAgICAgIGNsYXNzIFg6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gTWV0YTsgeCA9IDQ7IGcgPSAyMworICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICBjbGFzcyBYKG1ldGFjbGFzcz1NZXRhKToKKyAgICAgICAgICAgIHggPSA0OyBnID0gMjMKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAjIG9uZSBwYXJlbnQsIHNpbXBsZSBib2R5LCBfX21ldGFjbGFzc19fIGxhc3QKKyAgICAgICAgYiA9ICIiIgorICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICBiYXIgPSA3CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gTWV0YQorICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICBjbGFzcyBYKG9iamVjdCwgbWV0YWNsYXNzPU1ldGEpOgorICAgICAgICAgICAgYmFyID0gNworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICMgcmVkZWZpbmluZyBfX21ldGFjbGFzc19fCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgY2xhc3MgWCgpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IEEKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBCCisgICAgICAgICAgICBiYXIgPSA3CisgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgIGNsYXNzIFgobWV0YWNsYXNzPUIpOgorICAgICAgICAgICAgYmFyID0gNworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICMgbXVsdGlwbGUgaW5oZXJpdGFuY2UsIHNpbXBsZSBib2R5CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgY2xhc3MgWChjbHNBLCBjbHNCKToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhCisgICAgICAgICAgICBiYXIgPSA3CisgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgIGNsYXNzIFgoY2xzQSwgY2xzQiwgbWV0YWNsYXNzPU1ldGEpOgorICAgICAgICAgICAgYmFyID0gNworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICMga2V5d29yZHMgaW4gdGhlIGNsYXNzIHN0YXRlbWVudAorICAgICAgICBiID0gIiIiY2xhc3MgbShhLCBhcmc9MjMpOiBfX21ldGFjbGFzc19fID0gTWV0YSIiIgorICAgICAgICBhID0gIiIiY2xhc3MgbShhLCBhcmc9MjMsIG1ldGFjbGFzcz1NZXRhKTogcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorICAgICAgICBjbGFzcyBYKGV4cHJlc3Npb24oMiArIDQpKToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhCisgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgIGNsYXNzIFgoZXhwcmVzc2lvbigyICsgNCksIG1ldGFjbGFzcz1NZXRhKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCisgICAgICAgIGNsYXNzIFgoZXhwcmVzc2lvbigyICsgNCksIHgqKjQpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE1ldGEKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgY2xhc3MgWChleHByZXNzaW9uKDIgKyA0KSwgeCoqNCwgbWV0YWNsYXNzPU1ldGEpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhCisgICAgICAgICAgICBzYXZlLnB5ID0gMjMKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgY2xhc3MgWChtZXRhY2xhc3M9TWV0YSk6CisgICAgICAgICAgICBzYXZlLnB5ID0gMjMKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworCitjbGFzcyBUZXN0X2dldGN3ZHUoRml4ZXJUZXN0Q2FzZSk6CisKKyAgICBmaXhlciA9ICdnZXRjd2R1JworCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIGIgPSAiIiJvcy5nZXRjd2R1IiIiCisgICAgICAgIGEgPSAiIiJvcy5nZXRjd2QiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJvcy5nZXRjd2R1KCkiIiIKKyAgICAgICAgYSA9ICIiIm9zLmdldGN3ZCgpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIibWV0aCA9IG9zLmdldGN3ZHUiIiIKKyAgICAgICAgYSA9ICIiIm1ldGggPSBvcy5nZXRjd2QiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJvcy5nZXRjd2R1KGFyZ3MpIiIiCisgICAgICAgIGEgPSAiIiJvcy5nZXRjd2QoYXJncykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfY29tbWVudChzZWxmKToKKyAgICAgICAgYiA9ICIiIm9zLmdldGN3ZHUoKSAjIEZvbyIiIgorICAgICAgICBhID0gIiIib3MuZ2V0Y3dkKCkgIyBGb28iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBzID0gIiIib3MuZ2V0Y3dkKCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIiZ2V0Y3dkdSgpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiIm9zLmdldGN3ZGIoKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfaW5kZW50YXRpb24oc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGlmIDE6CisgICAgICAgICAgICAgICAgb3MuZ2V0Y3dkdSgpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgaWYgMToKKyAgICAgICAgICAgICAgICBvcy5nZXRjd2QoKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X211bHRpbGF0aW9uKHNlbGYpOgorICAgICAgICBiID0gIiIib3MgLmdldGN3ZHUoKSIiIgorICAgICAgICBhID0gIiIib3MgLmdldGN3ZCgpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIib3MuICBnZXRjd2R1IiIiCisgICAgICAgIGEgPSAiIiJvcy4gIGdldGN3ZCIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIm9zLmdldGN3ZHUgKCAgKSIiIgorICAgICAgICBhID0gIiIib3MuZ2V0Y3dkICggICkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisKK2NsYXNzIFRlc3Rfb3BlcmF0b3IoRml4ZXJUZXN0Q2FzZSk6CisKKyAgICBmaXhlciA9ICJvcGVyYXRvciIKKworICAgIGRlZiB0ZXN0X29wZXJhdG9yX2lzQ2FsbGFibGUoc2VsZik6CisgICAgICAgIGIgPSAib3BlcmF0b3IuaXNDYWxsYWJsZSh4KSIKKyAgICAgICAgYSA9ICJoYXNhdHRyKHgsICdfX2NhbGxfXycpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9vcGVyYXRvcl9zZXF1ZW5jZUluY2x1ZGVzKHNlbGYpOgorICAgICAgICBiID0gIm9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMoeCwgeSkiCisgICAgICAgIGEgPSAib3BlcmF0b3IuY29udGFpbnMoeCwgeSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIm9wZXJhdG9yIC5zZXF1ZW5jZUluY2x1ZGVzKHgsIHkpIgorICAgICAgICBhID0gIm9wZXJhdG9yIC5jb250YWlucyh4LCB5KSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAib3BlcmF0b3IuICBzZXF1ZW5jZUluY2x1ZGVzKHgsIHkpIgorICAgICAgICBhID0gIm9wZXJhdG9yLiAgY29udGFpbnMoeCwgeSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X29wZXJhdG9yX2lzU2VxdWVuY2VUeXBlKHNlbGYpOgorICAgICAgICBiID0gIm9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKHgpIgorICAgICAgICBhID0gImltcG9ydCBjb2xsZWN0aW9uc1xuaXNpbnN0YW5jZSh4LCBjb2xsZWN0aW9ucy5TZXF1ZW5jZSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X29wZXJhdG9yX2lzTWFwcGluZ1R5cGUoc2VsZik6CisgICAgICAgIGIgPSAib3BlcmF0b3IuaXNNYXBwaW5nVHlwZSh4KSIKKyAgICAgICAgYSA9ICJpbXBvcnQgY29sbGVjdGlvbnNcbmlzaW5zdGFuY2UoeCwgY29sbGVjdGlvbnMuTWFwcGluZykiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X29wZXJhdG9yX2lzTnVtYmVyVHlwZShzZWxmKToKKyAgICAgICAgYiA9ICJvcGVyYXRvci5pc051bWJlclR5cGUoeCkiCisgICAgICAgIGEgPSAiaW1wb3J0IG51bWJlcnNcbmlzaW5zdGFuY2UoeCwgbnVtYmVycy5OdW1iZXIpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9vcGVyYXRvcl9yZXBlYXQoc2VsZik6CisgICAgICAgIGIgPSAib3BlcmF0b3IucmVwZWF0KHgsIG4pIgorICAgICAgICBhID0gIm9wZXJhdG9yLm11bCh4LCBuKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAib3BlcmF0b3IgLnJlcGVhdCh4LCBuKSIKKyAgICAgICAgYSA9ICJvcGVyYXRvciAubXVsKHgsIG4pIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICJvcGVyYXRvci4gIHJlcGVhdCh4LCBuKSIKKyAgICAgICAgYSA9ICJvcGVyYXRvci4gIG11bCh4LCBuKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfb3BlcmF0b3JfaXJlcGVhdChzZWxmKToKKyAgICAgICAgYiA9ICJvcGVyYXRvci5pcmVwZWF0KHgsIG4pIgorICAgICAgICBhID0gIm9wZXJhdG9yLmltdWwoeCwgbikiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIm9wZXJhdG9yIC5pcmVwZWF0KHgsIG4pIgorICAgICAgICBhID0gIm9wZXJhdG9yIC5pbXVsKHgsIG4pIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICJvcGVyYXRvci4gIGlyZXBlYXQoeCwgbikiCisgICAgICAgIGEgPSAib3BlcmF0b3IuICBpbXVsKHgsIG4pIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9iYXJlX2lzQ2FsbGFibGUoc2VsZik6CisgICAgICAgIHMgPSAiaXNDYWxsYWJsZSh4KSIKKyAgICAgICAgdCA9ICJZb3Ugc2hvdWxkIHVzZSAnaGFzYXR0cih4LCAnX19jYWxsX18nKScgaGVyZS4iCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsIHQpCisKKyAgICBkZWYgdGVzdF9iYXJlX3NlcXVlbmNlSW5jbHVkZXMoc2VsZik6CisgICAgICAgIHMgPSAic2VxdWVuY2VJbmNsdWRlcyh4LCB5KSIKKyAgICAgICAgdCA9ICJZb3Ugc2hvdWxkIHVzZSAnb3BlcmF0b3IuY29udGFpbnMoeCwgeSknIGhlcmUuIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCB0KQorCisgICAgZGVmIHRlc3RfYmFyZV9vcGVyYXRvcl9pc1NlcXVlbmNlVHlwZShzZWxmKToKKyAgICAgICAgcyA9ICJpc1NlcXVlbmNlVHlwZSh6KSIKKyAgICAgICAgdCA9ICJZb3Ugc2hvdWxkIHVzZSAnaXNpbnN0YW5jZSh6LCBjb2xsZWN0aW9ucy5TZXF1ZW5jZSknIGhlcmUuIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCB0KQorCisgICAgZGVmIHRlc3RfYmFyZV9vcGVyYXRvcl9pc01hcHBpbmdUeXBlKHNlbGYpOgorICAgICAgICBzID0gImlzTWFwcGluZ1R5cGUoeCkiCisgICAgICAgIHQgPSAiWW91IHNob3VsZCB1c2UgJ2lzaW5zdGFuY2UoeCwgY29sbGVjdGlvbnMuTWFwcGluZyknIGhlcmUuIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCB0KQorCisgICAgZGVmIHRlc3RfYmFyZV9vcGVyYXRvcl9pc051bWJlclR5cGUoc2VsZik6CisgICAgICAgIHMgPSAiaXNOdW1iZXJUeXBlKHkpIgorICAgICAgICB0ID0gIllvdSBzaG91bGQgdXNlICdpc2luc3RhbmNlKHksIG51bWJlcnMuTnVtYmVyKScgaGVyZS4iCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsIHQpCisKKyAgICBkZWYgdGVzdF9iYXJlX29wZXJhdG9yX3JlcGVhdChzZWxmKToKKyAgICAgICAgcyA9ICJyZXBlYXQoeCwgbikiCisgICAgICAgIHQgPSAiWW91IHNob3VsZCB1c2UgJ29wZXJhdG9yLm11bCh4LCBuKScgaGVyZS4iCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsIHQpCisKKyAgICBkZWYgdGVzdF9iYXJlX29wZXJhdG9yX2lyZXBlYXQoc2VsZik6CisgICAgICAgIHMgPSAiaXJlcGVhdCh5LCAxODcpIgorICAgICAgICB0ID0gIllvdSBzaG91bGQgdXNlICdvcGVyYXRvci5pbXVsKHksIDE4NyknIGhlcmUuIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCB0KQorCisKK2NsYXNzIFRlc3RfZXhpdGZ1bmMoRml4ZXJUZXN0Q2FzZSk6CisKKyAgICBmaXhlciA9ICJleGl0ZnVuYyIKKworICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgc3lzLmV4aXRmdW5jID0gbXlfYXRleGl0CisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgaW1wb3J0IGF0ZXhpdAorICAgICAgICAgICAgYXRleGl0LnJlZ2lzdGVyKG15X2F0ZXhpdCkKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9uYW1lc19pbXBvcnQoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGltcG9ydCBzeXMsIGNydW1icworICAgICAgICAgICAgc3lzLmV4aXRmdW5jID0gbXlfZnVuYworICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGltcG9ydCBzeXMsIGNydW1icywgYXRleGl0CisgICAgICAgICAgICBhdGV4aXQucmVnaXN0ZXIobXlfZnVuYykKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9jb21wbGV4X2V4cHJlc3Npb24oc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgIHN5cy5leGl0ZnVuYyA9IGRvKGQpL2EoKStjb21wbGV4KGY9MjMsIGc9MjMpKmV4cHJlc3Npb24KKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICBpbXBvcnQgYXRleGl0CisgICAgICAgICAgICBhdGV4aXQucmVnaXN0ZXIoZG8oZCkvYSgpK2NvbXBsZXgoZj0yMywgZz0yMykqZXhwcmVzc2lvbikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9jb21tZW50cyhzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IHN5cyAjIEZvbworICAgICAgICAgICAgc3lzLmV4aXRmdW5jID0gZiAjIEJsYWgKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICBpbXBvcnQgYXRleGl0ICMgRm9vCisgICAgICAgICAgICBhdGV4aXQucmVnaXN0ZXIoZikgIyBCbGFoCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGltcG9ydCBhcHBsZXMsIHN5cywgY3J1bWJzLCBsYXJyeSAjIFBsZWFzYW50IGNvbW1lbnRzCisgICAgICAgICAgICBzeXMuZXhpdGZ1bmMgPSBmdW5jCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IGFwcGxlcywgc3lzLCBjcnVtYnMsIGxhcnJ5LCBhdGV4aXQgIyBQbGVhc2FudCBjb21tZW50cworICAgICAgICAgICAgYXRleGl0LnJlZ2lzdGVyKGZ1bmMpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfaW5fYV9mdW5jdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICAgICBzeXMuZXhpdGZ1bmMgPSBmdW5jCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgaW1wb3J0IGF0ZXhpdAorICAgICAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICAgICBhdGV4aXQucmVnaXN0ZXIoZnVuYykKKyAgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfbm9fc3lzX2ltcG9ydChzZWxmKToKKyAgICAgICAgYiA9ICIiInN5cy5leGl0ZnVuYyA9IGYiIiIKKyAgICAgICAgYSA9ICIiImF0ZXhpdC5yZWdpc3RlcihmKSIiIgorICAgICAgICBtc2cgPSAoIkNhbid0IGZpbmQgc3lzIGltcG9ydDsgUGxlYXNlIGFkZCBhbiBhdGV4aXQgaW1wb3J0IGF0IHRoZSAiCisgICAgICAgICAgICAidG9wIG9mIHlvdXIgZmlsZS4iKQorICAgICAgICBzZWxmLndhcm5zKGIsIGEsIG1zZykKKworCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBzID0gIiIiZihzeXMuZXhpdGZ1bmMpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJmNGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJmNGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfZml4ZXJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9tYWluLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfbWFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjhiMjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfbWFpbi5weQpAQCAtMCwwICsxLDE0OSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK2ltcG9ydCBzeXMKK2ltcG9ydCBjb2RlY3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHNodXRpbAoraW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGxpYjJ0bzMgaW1wb3J0IG1haW4KKworCitURVNUX0RBVEFfRElSID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJkYXRhIikKK1BZMl9URVNUX01PRFVMRSA9IG9zLnBhdGguam9pbihURVNUX0RBVEFfRElSLCAicHkyX3Rlc3RfZ3JhbW1hci5weSIpCisKKworY2xhc3MgVGVzdE1haW4odW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgaWYgbm90IGhhc2F0dHIodW5pdHRlc3QuVGVzdENhc2UsICdhc3NlcnROb3RSZWdleCcpOgorICAgICAgICAjIFRoaXMgbWV0aG9kIHdhcyBvbmx5IGludHJvZHVjZWQgaW4gMy4yLgorICAgICAgICBkZWYgYXNzZXJ0Tm90UmVnZXgoc2VsZiwgdGV4dCwgcmVnZXhwLCBtc2c9Tm9uZSk6CisgICAgICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKHJlZ2V4cCwgJ3NlYXJjaCcpOgorICAgICAgICAgICAgICAgIHJlZ2V4cCA9IHJlLmNvbXBpbGUocmVnZXhwKQorICAgICAgICAgICAgaWYgcmVnZXhwLnNlYXJjaCh0ZXh0KToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlZ2V4cCAlcyBNQVRDSEVEIHRleHQgJXIiICUgKHJlZ2V4cC5wYXR0ZXJuLCB0ZXh0KSkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZW1wX2RpciA9IE5vbmUgICMgdGVhckRvd24oKSB3aWxsIHJtdHJlZSB0aGlzIGRpcmVjdG9yeSBpZiBzZXQuCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICMgQ2xlYW4gdXAgbG9nZ2luZyBjb25maWd1cmF0aW9uIGRvd24gYnkgbWFpbi4KKyAgICAgICAgZGVsIGxvZ2dpbmcucm9vdC5oYW5kbGVyc1s6XQorICAgICAgICBpZiBzZWxmLnRlbXBfZGlyOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLnRlbXBfZGlyKQorCisgICAgZGVmIHJ1bl8ydG8zX2NhcHR1cmUoc2VsZiwgYXJncywgaW5fY2FwdHVyZSwgb3V0X2NhcHR1cmUsIGVycl9jYXB0dXJlKToKKyAgICAgICAgc2F2ZV9zdGRpbiA9IHN5cy5zdGRpbgorICAgICAgICBzYXZlX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc2F2ZV9zdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgIHN5cy5zdGRpbiA9IGluX2NhcHR1cmUKKyAgICAgICAgc3lzLnN0ZG91dCA9IG91dF9jYXB0dXJlCisgICAgICAgIHN5cy5zdGRlcnIgPSBlcnJfY2FwdHVyZQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gbWFpbi5tYWluKCJsaWIydG8zLmZpeGVzIiwgYXJncykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRpbiA9IHNhdmVfc3RkaW4KKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlX3N0ZG91dAorICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHNhdmVfc3RkZXJyCisKKyAgICBkZWYgdGVzdF91bmVuY29kYWJsZV9kaWZmKHNlbGYpOgorICAgICAgICBpbnB1dF9zdHJlYW0gPSBTdHJpbmdJTy5TdHJpbmdJTyh1InByaW50ICdub3RoaW5nJ1xucHJpbnQgdSfDvGJlcidcbiIpCisgICAgICAgIG91dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgb3V0X2VuYyA9IGNvZGVjcy5nZXR3cml0ZXIoImFzY2lpIikob3V0KQorICAgICAgICBlcnIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHJldCA9IHNlbGYucnVuXzJ0bzNfY2FwdHVyZShbIi0iXSwgaW5wdXRfc3RyZWFtLCBvdXRfZW5jLCBlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LCAwKQorICAgICAgICBvdXRwdXQgPSBvdXQuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIi1wcmludCAnbm90aGluZyciIGluIG91dHB1dCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJXQVJOSU5HOiBjb3VsZG4ndCBlbmNvZGUgPHN0ZGluPidzIGRpZmYgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ5b3VyIHRlcm1pbmFsIiBpbiBlcnIuZ2V0dmFsdWUoKSkKKworICAgIGRlZiBzZXR1cF90ZXN0X3NvdXJjZV90cmVlcyhzZWxmKToKKyAgICAgICAgIiIiU2V0dXAgYSB0ZXN0IHNvdXJjZSB0cmVlIGFuZCBvdXRwdXQgZGVzdGluYXRpb24gdHJlZS4iIiIKKyAgICAgICAgc2VsZi50ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKSAgIyB0ZWFyRG93bigpIGNsZWFucyB0aGlzIHVwLgorICAgICAgICBzZWxmLnB5Ml9zcmNfZGlyID0gb3MucGF0aC5qb2luKHNlbGYudGVtcF9kaXIsICJweXRob24yX3Byb2plY3QiKQorICAgICAgICBzZWxmLnB5M19kZXN0X2RpciA9IG9zLnBhdGguam9pbihzZWxmLnRlbXBfZGlyLCAicHl0aG9uM19wcm9qZWN0IikKKyAgICAgICAgb3MubWtkaXIoc2VsZi5weTJfc3JjX2RpcikKKyAgICAgICAgb3MubWtkaXIoc2VsZi5weTNfZGVzdF9kaXIpCisgICAgICAgICMgVHVybiBpdCBpbnRvIGEgcGFja2FnZSB3aXRoIGEgZmV3IGZpbGVzLgorICAgICAgICBzZWxmLnNldHVwX2ZpbGVzID0gW10KKyAgICAgICAgb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5weTJfc3JjX2RpciwgIl9faW5pdF9fLnB5IiksICJ3IikuY2xvc2UoKQorICAgICAgICBzZWxmLnNldHVwX2ZpbGVzLmFwcGVuZCgiX19pbml0X18ucHkiKQorICAgICAgICBzaHV0aWwuY29weShQWTJfVEVTVF9NT0RVTEUsIHNlbGYucHkyX3NyY19kaXIpCisgICAgICAgIHNlbGYuc2V0dXBfZmlsZXMuYXBwZW5kKG9zLnBhdGguYmFzZW5hbWUoUFkyX1RFU1RfTU9EVUxFKSkKKyAgICAgICAgc2VsZi50cml2aWFsX3B5Ml9maWxlID0gb3MucGF0aC5qb2luKHNlbGYucHkyX3NyY19kaXIsICJ0cml2aWFsLnB5IikKKyAgICAgICAgc2VsZi5pbml0X3B5Ml9maWxlID0gb3MucGF0aC5qb2luKHNlbGYucHkyX3NyY19kaXIsICJfX2luaXRfXy5weSIpCisgICAgICAgIHdpdGggb3BlbihzZWxmLnRyaXZpYWxfcHkyX2ZpbGUsICJ3IikgYXMgdHJpdmlhbDoKKyAgICAgICAgICAgIHRyaXZpYWwud3JpdGUoInByaW50ICdJIG5lZWQgYSBzaW1wbGUgY29udmVyc2lvbi4nIikKKyAgICAgICAgc2VsZi5zZXR1cF9maWxlcy5hcHBlbmQoInRyaXZpYWwucHkiKQorCisgICAgZGVmIHRlc3RfZmlsZW5hbWVfY2hhbmdpbmdfb25fb3V0cHV0X3NpbmdsZV9kaXIoc2VsZik6CisgICAgICAgICIiIjJ0bzMgYSBzaW5nbGUgZGlyZWN0b3J5IHdpdGggYSBuZXcgb3V0cHV0IGRpciBhbmQgc3VmZml4LiIiIgorICAgICAgICBzZWxmLnNldHVwX3Rlc3Rfc291cmNlX3RyZWVzKCkKKyAgICAgICAgb3V0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBlcnIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHN1ZmZpeCA9ICJURVNUIgorICAgICAgICByZXQgPSBzZWxmLnJ1bl8ydG8zX2NhcHR1cmUoCisgICAgICAgICAgICAgICAgWyItbiIsICItLWFkZC1zdWZmaXgiLCBzdWZmaXgsICItLXdyaXRlLXVuY2hhbmdlZC1maWxlcyIsCisgICAgICAgICAgICAgICAgICItLW5vLWRpZmZzIiwgIi0tb3V0cHV0LWRpciIsCisgICAgICAgICAgICAgICAgIHNlbGYucHkzX2Rlc3RfZGlyLCBzZWxmLnB5Ml9zcmNfZGlyXSwKKyAgICAgICAgICAgICAgICBTdHJpbmdJTy5TdHJpbmdJTygiIiksIG91dCwgZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldCwgMCkKKyAgICAgICAgc3RkZXJyID0gZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiIGltcGxpZXMgLXcuIiwgc3RkZXJyKQorICAgICAgICBzZWxmLmFzc2VydEluKAorICAgICAgICAgICAgICAgICJPdXRwdXQgaW4gJXIgd2lsbCBtaXJyb3IgdGhlIGlucHV0IGRpcmVjdG9yeSAlciBsYXlvdXQiICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5weTNfZGVzdF9kaXIsIHNlbGYucHkyX3NyY19kaXIpLCBzdGRlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KG5hbWUrc3VmZml4IGZvciBuYW1lIGluIHNlbGYuc2V0dXBfZmlsZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNldChvcy5saXN0ZGlyKHNlbGYucHkzX2Rlc3RfZGlyKSkpCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuc2V0dXBfZmlsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJXcml0aW5nIGNvbnZlcnRlZCAlcyB0byAlcyIgJSAoCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLnB5Ml9zcmNfZGlyLCBuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYucHkzX2Rlc3RfZGlyLCBuYW1lK3N1ZmZpeCkpLCBzdGRlcnIpCisgICAgICAgIHNlcCA9IHJlLmVzY2FwZShvcy5zZXApCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcygKKyAgICAgICAgICAgICAgICBzdGRlcnIsIHIiTm8gY2hhbmdlcyB0byAuKi9fX2luaXRfX1wucHkiLnJlcGxhY2UoIi8iLCBzZXApKQorICAgICAgICBzZWxmLmFzc2VydE5vdFJlZ2V4KAorICAgICAgICAgICAgICAgIHN0ZGVyciwgciJObyBjaGFuZ2VzIHRvIC4qL3RyaXZpYWxcLnB5Ii5yZXBsYWNlKCIvIiwgc2VwKSkKKworICAgIGRlZiB0ZXN0X2ZpbGVuYW1lX2NoYW5naW5nX29uX291dHB1dF90d29fZmlsZXMoc2VsZik6CisgICAgICAgICIiIjJ0bzMgdHdvIGZpbGVzIGluIG9uZSBkaXJlY3Rvcnkgd2l0aCBhIG5ldyBvdXRwdXQgZGlyLiIiIgorICAgICAgICBzZWxmLnNldHVwX3Rlc3Rfc291cmNlX3RyZWVzKCkKKyAgICAgICAgZXJyID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBweTJfZmlsZXMgPSBbc2VsZi50cml2aWFsX3B5Ml9maWxlLCBzZWxmLmluaXRfcHkyX2ZpbGVdCisgICAgICAgIGV4cGVjdGVkX2ZpbGVzID0gc2V0KG9zLnBhdGguYmFzZW5hbWUobmFtZSkgZm9yIG5hbWUgaW4gcHkyX2ZpbGVzKQorICAgICAgICByZXQgPSBzZWxmLnJ1bl8ydG8zX2NhcHR1cmUoCisgICAgICAgICAgICAgICAgWyItbiIsICItdyIsICItLXdyaXRlLXVuY2hhbmdlZC1maWxlcyIsCisgICAgICAgICAgICAgICAgICItLW5vLWRpZmZzIiwgIi0tb3V0cHV0LWRpciIsIHNlbGYucHkzX2Rlc3RfZGlyXSArIHB5Ml9maWxlcywKKyAgICAgICAgICAgICAgICBTdHJpbmdJTy5TdHJpbmdJTygiIiksIFN0cmluZ0lPLlN0cmluZ0lPKCksIGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXQsIDApCisgICAgICAgIHN0ZGVyciA9IGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oCisgICAgICAgICAgICAgICAgIk91dHB1dCBpbiAlciB3aWxsIG1pcnJvciB0aGUgaW5wdXQgZGlyZWN0b3J5ICVyIGxheW91dCIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB5M19kZXN0X2Rpciwgc2VsZi5weTJfc3JjX2RpciksIHN0ZGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9maWxlcywgc2V0KG9zLmxpc3RkaXIoc2VsZi5weTNfZGVzdF9kaXIpKSkKKworICAgIGRlZiB0ZXN0X2ZpbGVuYW1lX2NoYW5naW5nX29uX291dHB1dF9zaW5nbGVfZmlsZShzZWxmKToKKyAgICAgICAgIiIiMnRvMyBhIHNpbmdsZSBmaWxlIHdpdGggYSBuZXcgb3V0cHV0IGRpci4iIiIKKyAgICAgICAgc2VsZi5zZXR1cF90ZXN0X3NvdXJjZV90cmVlcygpCisgICAgICAgIGVyciA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgcmV0ID0gc2VsZi5ydW5fMnRvM19jYXB0dXJlKAorICAgICAgICAgICAgICAgIFsiLW4iLCAiLXciLCAiLS1uby1kaWZmcyIsICItLW91dHB1dC1kaXIiLCBzZWxmLnB5M19kZXN0X2RpciwKKyAgICAgICAgICAgICAgICAgc2VsZi50cml2aWFsX3B5Ml9maWxlXSwKKyAgICAgICAgICAgICAgICBTdHJpbmdJTy5TdHJpbmdJTygiIiksIFN0cmluZ0lPLlN0cmluZ0lPKCksIGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXQsIDApCisgICAgICAgIHN0ZGVyciA9IGVyci5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oCisgICAgICAgICAgICAgICAgIk91dHB1dCBpbiAlciB3aWxsIG1pcnJvciB0aGUgaW5wdXQgZGlyZWN0b3J5ICVyIGxheW91dCIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB5M19kZXN0X2Rpciwgc2VsZi5weTJfc3JjX2RpciksIHN0ZGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoW29zLnBhdGguYmFzZW5hbWUoc2VsZi50cml2aWFsX3B5Ml9maWxlKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNldChvcy5saXN0ZGlyKHNlbGYucHkzX2Rlc3RfZGlyKSkpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X21haW4ucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfbWFpbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1ZDljYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X21haW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X21haW4ucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfbWFpbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1ZDljYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X21haW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjAyMzgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcGFyc2VyLnB5CkBAIC0wLDAgKzEsMjI3IEBACisiIiJUZXN0IHN1aXRlIGZvciAydG8zJ3MgcGFyc2VyIGFuZCBncmFtbWFyIGZpbGVzLgorCitUaGlzIGlzIHRoZSBwbGFjZSB0byBhZGQgdGVzdHMgZm9yIGNoYW5nZXMgdG8gMnRvMydzIGdyYW1tYXIsIHN1Y2ggYXMgdGhvc2UKK21lcmdpbmcgdGhlIGdyYW1tYXJzIGZvciBQeXRob24gMiBhbmQgMy4gSW4gYWRkaXRpb24gdG8gc3BlY2lmaWMgdGVzdHMgZm9yCitwYXJ0cyBvZiB0aGUgZ3JhbW1hciB3ZSd2ZSBjaGFuZ2VkLCB3ZSBhbHNvIG1ha2Ugc3VyZSB3ZSBjYW4gcGFyc2UgdGhlCit0ZXN0X2dyYW1tYXIucHkgZmlsZXMgZnJvbSBib3RoIFB5dGhvbiAyIGFuZCBQeXRob24gMy4KKyIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKKyMgVGVzdGluZyBpbXBvcnRzCitmcm9tIC4gaW1wb3J0IHN1cHBvcnQKK2Zyb20gLnN1cHBvcnQgaW1wb3J0IGRyaXZlciwgdGVzdF9kaXIKKworIyBQeXRob24gaW1wb3J0cworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSBsaWIydG8zLnBnZW4yIGltcG9ydCB0b2tlbml6ZQorZnJvbSAuLnBnZW4yLnBhcnNlIGltcG9ydCBQYXJzZUVycm9yCitmcm9tIGxpYjJ0bzMucHlncmFtIGltcG9ydCBweXRob25fc3ltYm9scyBhcyBzeW1zCisKKworY2xhc3MgVGVzdERyaXZlcihzdXBwb3J0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Zvcm1mZWVkKHNlbGYpOgorICAgICAgICBzID0gIiIicHJpbnQgMVxuXHgwQ3ByaW50IDJcbiIiIgorICAgICAgICB0ID0gZHJpdmVyLnBhcnNlX3N0cmluZyhzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0udHlwZSwgc3ltcy5wcmludF9zdG10KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuY2hpbGRyZW5bMV0uY2hpbGRyZW5bMF0udHlwZSwgc3ltcy5wcmludF9zdG10KQorCisKK2NsYXNzIEdyYW1tYXJUZXN0KHN1cHBvcnQuVGVzdENhc2UpOgorICAgIGRlZiB2YWxpZGF0ZShzZWxmLCBjb2RlKToKKyAgICAgICAgc3VwcG9ydC5wYXJzZV9zdHJpbmcoY29kZSkKKworICAgIGRlZiBpbnZhbGlkX3N5bnRheChzZWxmLCBjb2RlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi52YWxpZGF0ZShjb2RlKQorICAgICAgICBleGNlcHQgUGFyc2VFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJTeW50YXggc2hvdWxkbid0IGhhdmUgYmVlbiB2YWxpZCIpCisKKworY2xhc3MgVGVzdFJhaXNlQ2hhbmdlcyhHcmFtbWFyVGVzdCk6CisgICAgZGVmIHRlc3RfMnhfc3R5bGVfMShzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgicmFpc2UiKQorCisgICAgZGVmIHRlc3RfMnhfc3R5bGVfMihzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgicmFpc2UgRSwgViIpCisKKyAgICBkZWYgdGVzdF8yeF9zdHlsZV8zKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCJyYWlzZSBFLCBWLCBUIikKKworICAgIGRlZiB0ZXN0XzJ4X3N0eWxlX2ludmFsaWRfMShzZWxmKToKKyAgICAgICAgc2VsZi5pbnZhbGlkX3N5bnRheCgicmFpc2UgRSwgViwgVCwgWiIpCisKKyAgICBkZWYgdGVzdF8zeF9zdHlsZShzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgicmFpc2UgRTEgZnJvbSBFMiIpCisKKyAgICBkZWYgdGVzdF8zeF9zdHlsZV9pbnZhbGlkXzEoc2VsZik6CisgICAgICAgIHNlbGYuaW52YWxpZF9zeW50YXgoInJhaXNlIEUsIFYgZnJvbSBFMSIpCisKKyAgICBkZWYgdGVzdF8zeF9zdHlsZV9pbnZhbGlkXzIoc2VsZik6CisgICAgICAgIHNlbGYuaW52YWxpZF9zeW50YXgoInJhaXNlIEUgZnJvbSBFMSwgRTIiKQorCisgICAgZGVmIHRlc3RfM3hfc3R5bGVfaW52YWxpZF8zKHNlbGYpOgorICAgICAgICBzZWxmLmludmFsaWRfc3ludGF4KCJyYWlzZSBmcm9tIEUxLCBFMiIpCisKKyAgICBkZWYgdGVzdF8zeF9zdHlsZV9pbnZhbGlkXzQoc2VsZik6CisgICAgICAgIHNlbGYuaW52YWxpZF9zeW50YXgoInJhaXNlIEUgZnJvbSIpCisKKworIyBBZGFwYXRlZCBmcm9tIFB5dGhvbiAzJ3MgTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5OkdyYW1tYXJUZXN0cy50ZXN0RnVuY2RlZgorY2xhc3MgVGVzdEZ1bmN0aW9uQW5ub3RhdGlvbnMoR3JhbW1hclRlc3QpOgorICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoIiIiZGVmIGYoeCkgLT4gbGlzdDogcGFzcyIiIikKKworICAgIGRlZiB0ZXN0XzIoc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoIiIiZGVmIGYoeDppbnQpOiBwYXNzIiIiKQorCisgICAgZGVmIHRlc3RfMyhzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiIiJkZWYgZigqeDpzdHIpOiBwYXNzIiIiKQorCisgICAgZGVmIHRlc3RfNChzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiIiJkZWYgZigqKng6ZmxvYXQpOiBwYXNzIiIiKQorCisgICAgZGVmIHRlc3RfNShzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiIiJkZWYgZih4LCB5OjErMik6IHBhc3MiIiIpCisKKyAgICBkZWYgdGVzdF82KHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCIiImRlZiBmKGEsIChiOjEsIGM6MiwgZCkpOiBwYXNzIiIiKQorCisgICAgZGVmIHRlc3RfNyhzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiIiJkZWYgZihhLCAoYjoxLCBjOjIsIGQpLCBlOjM9NCwgZj01LCAqZzo2KTogcGFzcyIiIikKKworICAgIGRlZiB0ZXN0Xzgoc2VsZik6CisgICAgICAgIHMgPSAiIiJkZWYgZihhLCAoYjoxLCBjOjIsIGQpLCBlOjM9NCwgZj01LAorICAgICAgICAgICAgICAgICAgICAgICAgKmc6NiwgaDo3LCBpPTgsIGo6OT0xMCwgKiprOjExKSAtPiAxMjogcGFzcyIiIgorICAgICAgICBzZWxmLnZhbGlkYXRlKHMpCisKKworY2xhc3MgVGVzdEV4Y2VwdChHcmFtbWFyVGVzdCk6CisgICAgZGVmIHRlc3RfbmV3KHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeAorICAgICAgICAgICAgZXhjZXB0IEUgYXMgTjoKKyAgICAgICAgICAgICAgICB5IiIiCisgICAgICAgIHNlbGYudmFsaWRhdGUocykKKworICAgIGRlZiB0ZXN0X29sZChzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHgKKyAgICAgICAgICAgIGV4Y2VwdCBFLCBOOgorICAgICAgICAgICAgICAgIHkiIiIKKyAgICAgICAgc2VsZi52YWxpZGF0ZShzKQorCisKKyMgQWRhcHRlZCBmcm9tIFB5dGhvbiAzJ3MgTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5OkdyYW1tYXJUZXN0cy50ZXN0QXRvbXMKK2NsYXNzIFRlc3RTZXRMaXRlcmFsKEdyYW1tYXJUZXN0KToKKyAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCIiInggPSB7J29uZSd9IiIiKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiIiJ4ID0geydvbmUnLCAxLH0iIiIpCisKKyAgICBkZWYgdGVzdF8zKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCIiInggPSB7J29uZScsICd0d28nLCAndGhyZWUnfSIiIikKKworICAgIGRlZiB0ZXN0XzQoc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoIiIieCA9IHsyLCAzLCA0LH0iIiIpCisKKworY2xhc3MgVGVzdE51bWVyaWNMaXRlcmFscyhHcmFtbWFyVGVzdCk6CisgICAgZGVmIHRlc3RfbmV3X29jdGFsX25vdGF0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCIiIjBvNzc3Nzc3Nzc3Nzc3NyIiIikKKyAgICAgICAgc2VsZi5pbnZhbGlkX3N5bnRheCgiIiIwbzczMjQ1Mjg4ODciIiIpCisKKyAgICBkZWYgdGVzdF9uZXdfYmluYXJ5X25vdGF0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCIiIjBiMTAxMDEwIiIiKQorICAgICAgICBzZWxmLmludmFsaWRfc3ludGF4KCIiIjBiMDEwMTAyMSIiIikKKworCitjbGFzcyBUZXN0Q2xhc3NEZWYoR3JhbW1hclRlc3QpOgorICAgIGRlZiB0ZXN0X25ld19zeW50YXgoc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoImNsYXNzIEIodD03KTogcGFzcyIpCisgICAgICAgIHNlbGYudmFsaWRhdGUoImNsYXNzIEIodCwgKmFyZ3MpOiBwYXNzIikKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiY2xhc3MgQih0LCAqKmt3YXJncyk6IHBhc3MiKQorICAgICAgICBzZWxmLnZhbGlkYXRlKCJjbGFzcyBCKHQsICphcmdzLCAqKmt3YXJncyk6IHBhc3MiKQorICAgICAgICBzZWxmLnZhbGlkYXRlKCJjbGFzcyBCKHQsIHk9OSwgKmFyZ3MsICoqa3dhcmdzKTogcGFzcyIpCisKKworY2xhc3MgVGVzdFBhcnNlcklkZW1wb3RlbmN5KHN1cHBvcnQuVGVzdENhc2UpOgorCisgICAgIiIiQSBjdXQtZG93biB2ZXJzaW9uIG9mIHB5dHJlZV9pZGVtcG90ZW5jeS5weS4iIiIKKworICAgIGRlZiB0ZXN0X2FsbF9wcm9qZWN0X2ZpbGVzKHNlbGYpOgorICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIik6CisgICAgICAgICAgICAjIFhYWCBzb21ldGhpbmcgd2l0aCBuZXdsaW5lcyBnb2VzIHdyb25nIG9uIFdpbmRvd3MuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZm9yIGZpbGVwYXRoIGluIHN1cHBvcnQuYWxsX3Byb2plY3RfZmlsZXMoKToKKyAgICAgICAgICAgIHdpdGggb3BlbihmaWxlcGF0aCwgInJiIikgYXMgZnA6CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSB0b2tlbml6ZS5kZXRlY3RfZW5jb2RpbmcoZnAucmVhZGxpbmUpWzBdCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZW5jb2RpbmcgaXMgbm90IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbid0IGRldGVjdCBlbmNvZGluZyBmb3IgJXMiICUgZmlsZXBhdGgpCisgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZXBhdGgsICJyIikgYXMgZnA6CisgICAgICAgICAgICAgICAgc291cmNlID0gZnAucmVhZCgpCisgICAgICAgICAgICAgICAgc291cmNlID0gc291cmNlLmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIHRyZWUgPSBkcml2ZXIucGFyc2Vfc3RyaW5nKHNvdXJjZSkKKyAgICAgICAgICAgIG5ldyA9IHVuaWNvZGUodHJlZSkKKyAgICAgICAgICAgIGlmIGRpZmYoZmlsZXBhdGgsIG5ldywgZW5jb2RpbmcpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiSWRlbXBvdGVuY3kgZmFpbGVkOiAlcyIgJSBmaWxlcGF0aCkKKworICAgIGRlZiB0ZXN0X2V4dGVuZGVkX3VucGFja2luZyhzZWxmKToKKyAgICAgICAgZHJpdmVyLnBhcnNlX3N0cmluZygiYSwgKmIsIGMgPSB4XG4iKQorICAgICAgICBkcml2ZXIucGFyc2Vfc3RyaW5nKCJbKmEsIGJdID0geFxuIikKKyAgICAgICAgZHJpdmVyLnBhcnNlX3N0cmluZygiKHosICp5LCB3KSA9IG1cbiIpCisgICAgICAgIGRyaXZlci5wYXJzZV9zdHJpbmcoImZvciAqeiwgbSBpbiBkOiBwYXNzXG4iKQorCitjbGFzcyBUZXN0TGl0ZXJhbHMoR3JhbW1hclRlc3QpOgorCisgICAgZGVmIHZhbGlkYXRlKHNlbGYsIHMpOgorICAgICAgICBkcml2ZXIucGFyc2Vfc3RyaW5nKHN1cHBvcnQuZGVkZW50KHMpICsgIlxuXG4iKQorCisgICAgZGVmIHRlc3RfbXVsdGlsaW5lX2J5dGVzX2xpdGVyYWxzKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBtZDV0ZXN0KGIiXHhhYSIgKiA4MCwKKyAgICAgICAgICAgICAgICAgICAgKGIiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAiCisgICAgICAgICAgICAgICAgICAgICBiImFuZCBMYXJnZXIgVGhhbiBPbmUgQmxvY2stU2l6ZSBEYXRhIiksCisgICAgICAgICAgICAgICAgICAgICI2ZjYzMGZhZDY3Y2RhMGVlMWZiMWY1NjJkYjNhYTUzZSIpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi52YWxpZGF0ZShzKQorCisgICAgZGVmIHRlc3RfbXVsdGlsaW5lX2J5dGVzX3RyaXBxdW90ZV9saXRlcmFscyhzZWxmKToKKyAgICAgICAgcyA9ICcnJworICAgICAgICAgICAgYiIiIgorICAgICAgICAgICAgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKyAgICAgICAgICAgIDwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlIENvbXB1dGVyLy9EVEQgUExJU1QgMS4wLy9FTiI+CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgICcnJworICAgICAgICBzZWxmLnZhbGlkYXRlKHMpCisKKyAgICBkZWYgdGVzdF9tdWx0aWxpbmVfc3RyX2xpdGVyYWxzKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBtZDV0ZXN0KCJceGFhIiAqIDgwLAorICAgICAgICAgICAgICAgICAgICAoIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgIgorICAgICAgICAgICAgICAgICAgICAgImFuZCBMYXJnZXIgVGhhbiBPbmUgQmxvY2stU2l6ZSBEYXRhIiksCisgICAgICAgICAgICAgICAgICAgICI2ZjYzMGZhZDY3Y2RhMGVlMWZiMWY1NjJkYjNhYTUzZSIpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi52YWxpZGF0ZShzKQorCisKK2RlZiBkaWZmKGZuLCByZXN1bHQsIGVuY29kaW5nKToKKyAgICBmID0gb3BlbigiQCIsICJ3IikKKyAgICB0cnk6CisgICAgICAgIGYud3JpdGUocmVzdWx0LmVuY29kZShlbmNvZGluZykpCisgICAgZmluYWxseToKKyAgICAgICAgZi5jbG9zZSgpCisgICAgdHJ5OgorICAgICAgICBmbiA9IGZuLnJlcGxhY2UoJyInLCAnXFwiJykKKyAgICAgICAgcmV0dXJuIG9zLnN5c3RlbSgnZGlmZiAtdSAiJXMiIEAnICUgZm4pCisgICAgZmluYWxseToKKyAgICAgICAgb3MucmVtb3ZlKCJAIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZGFlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZGFlYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3B5dHJlZS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3B5dHJlZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzdkOTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5CkBAIC0wLDAgKzEsNDk0IEBACisjIENvcHlyaWdodCAyMDA2IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIlVuaXQgdGVzdHMgZm9yIHB5dHJlZS5weS4KKworTk9URTogUGxlYXNlICpkb24ndCogYWRkIGRvYyBzdHJpbmdzIHRvIGluZGl2aWR1YWwgdGVzdCBtZXRob2RzIQorSW4gdmVyYm9zZSBtb2RlLCBwcmludGluZyBvZiB0aGUgbW9kdWxlLCBjbGFzcyBhbmQgbWV0aG9kIG5hbWUgaXMgbXVjaAorbW9yZSBoZWxwZnVsIHRoYW4gcHJpbnRpbmcgb2YgKHRoZSBmaXJzdCBsaW5lIG9mKSB0aGUgZG9jc3RyaW5nLAorZXNwZWNpYWxseSB3aGVuIGRlYnVnZ2luZyBhIHRlc3QuCisiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAorCitpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKKworIyBUZXN0aW5nIGltcG9ydHMKK2Zyb20gLiBpbXBvcnQgc3VwcG9ydAorCitmcm9tIGxpYjJ0bzMgaW1wb3J0IHB5dHJlZQorCit0cnk6CisgICAgc29ydGVkCitleGNlcHQgTmFtZUVycm9yOgorICAgIGRlZiBzb3J0ZWQobHN0KToKKyAgICAgICAgbCA9IGxpc3QobHN0KQorICAgICAgICBsLnNvcnQoKQorICAgICAgICByZXR1cm4gbAorCitjbGFzcyBUZXN0Tm9kZXMoc3VwcG9ydC5UZXN0Q2FzZSk6CisKKyAgICAiIiJVbml0IHRlc3RzIGZvciBub2RlcyAoQmFzZSwgTGVhZiwgTm9kZSkuIiIiCisKKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgyLDYpOgorICAgICAgICAjIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzIGlzIG5ldyBpbiAyLjYuCisgICAgICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfcHJlZml4X21ldGhvZHMoc2VsZik6CisgICAgICAgICAgICBsID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJhbHdheXMiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLmdldF9wcmVmaXgoKSwgIiIpCisgICAgICAgICAgICAgICAgbC5zZXRfcHJlZml4KCJoaSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwucHJlZml4LCAiaGkiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDIpCisgICAgICAgICAgICBmb3Igd2FybmluZyBpbiB3OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3YXJuaW5nLmNhdGVnb3J5IGlzIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHdbMF0ubWVzc2FnZSksICJnZXRfcHJlZml4KCkgaXMgZGVwcmVjYXRlZDsgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIHRoZSBwcmVmaXggcHJvcGVydHkiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod1sxXS5tZXNzYWdlKSwgInNldF9wcmVmaXgoKSBpcyBkZXByZWNhdGVkOyAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgdGhlIHByZWZpeCBwcm9wZXJ0eSIpCisKKyAgICBkZWYgdGVzdF9pbnN0YW50aWF0ZV9iYXNlKHNlbGYpOgorICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAjIFRlc3QgdGhhdCBpbnN0YW50aWF0aW5nIEJhc2UoKSByYWlzZXMgYW4gQXNzZXJ0aW9uRXJyb3IKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBweXRyZWUuQmFzZSkKKworICAgIGRlZiB0ZXN0X2xlYWYoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS50eXBlLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEudmFsdWUsICJmb28iKQorCisgICAgZGVmIHRlc3RfbGVhZl9yZXByKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihsMSksICJMZWFmKDEwMCwgJ2ZvbycpIikKKworICAgIGRlZiB0ZXN0X2xlYWZfc3RyKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGwxKSwgImZvbyIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIiwgY29udGV4dD0oIiAiLCAoMTAsIDEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobDIpLCAiIGZvbyIpCisKKyAgICBkZWYgdGVzdF9sZWFmX3N0cl9udW1lcmljX3ZhbHVlKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBMZWFmJ3MgdmFsdWUgaXMgc3RyaW5naWZpZWQuIEZhaWxpbmcgdG8KKyAgICAgICAgIyAgZG8gdGhpcyBjYW4gY2F1c2UgYSBUeXBlRXJyb3IgaW4gY2VydGFpbiBzaXR1YXRpb25zLgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDIsIDUpCisgICAgICAgIGwxLnByZWZpeCA9ICJmb29fIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihsMSksICJmb29fNSIpCisKKyAgICBkZWYgdGVzdF9sZWFmX2VxdWFsaXR5KHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIiwgY29udGV4dD0oIiAiLCAoMSwgMCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLCBsMikKKyAgICAgICAgbDMgPSBweXRyZWUuTGVhZigxMDEsICJmb28iKQorICAgICAgICBsNCA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobDEsIGwzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGwxLCBsNCkKKworICAgIGRlZiB0ZXN0X2xlYWZfcHJlZml4KHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucHJlZml4LCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsMS53YXNfY2hhbmdlZCkKKyAgICAgICAgbDEucHJlZml4ID0gIiAgIyNcblxuIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnByZWZpeCwgIiAgIyNcblxuIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwxLndhc19jaGFuZ2VkKQorCisgICAgZGVmIHRlc3Rfbm9kZShzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDIwMCwgImJhciIpCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEudHlwZSwgMTAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5jaGlsZHJlbiwgW2wxLCBsMl0pCisKKyAgICBkZWYgdGVzdF9ub2RlX3JlcHIoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiLCBjb250ZXh0PSgiICIsICgxLCAwKSkpCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihuMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIk5vZGUoMTAwMCwgWyVzLCAlc10pIiAlIChyZXByKGwxKSwgcmVwcihsMikpKQorCisgICAgZGVmIHRlc3Rfbm9kZV9zdHIoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiLCBjb250ZXh0PSgiICIsICgxLCAwKSkpCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG4xKSwgImZvbyBiYXIiKQorCisgICAgZGVmIHRlc3Rfbm9kZV9wcmVmaXgoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS5wcmVmaXgsICIiKQorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEucHJlZml4LCAiIikKKyAgICAgICAgbjEucHJlZml4ID0gIiAiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEucHJlZml4LCAiICIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucHJlZml4LCAiICIpCisKKyAgICBkZWYgdGVzdF9nZXRfc3VmZml4KHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIsIHByZWZpeD0iYSIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIiwgcHJlZml4PSJiIikKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLmdldF9zdWZmaXgoKSwgbDIucHJlZml4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwyLmdldF9zdWZmaXgoKSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEuZ2V0X3N1ZmZpeCgpLCAiIikKKworICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIsIHByZWZpeD0iYyIpCisgICAgICAgIG4yID0gcHl0cmVlLk5vZGUoMTAwMCwgW24xLCBsM10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5nZXRfc3VmZml4KCksIGwzLnByZWZpeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMy5nZXRfc3VmZml4KCksICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4yLmdldF9zdWZmaXgoKSwgIiIpCisKKyAgICBkZWYgdGVzdF9ub2RlX2VxdWFsaXR5KHNlbGYpOgorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsICgpKQorICAgICAgICBuMiA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtdLCBjb250ZXh0PSgiICIsICgxLCAwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEsIG4yKQorICAgICAgICBuMyA9IHB5dHJlZS5Ob2RlKDEwMDEsICgpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG4xLCBuMykKKworICAgIGRlZiB0ZXN0X25vZGVfcmVjdXJzaXZlX2VxdWFsaXR5KHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDFdKQorICAgICAgICBuMiA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEsIG4yKQorICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIpCisgICAgICAgIG4zID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wzXSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChuMSwgbjMpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiKyIpCisgICAgICAgIGwzID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIikKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyLCBsM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEuY2hpbGRyZW4sIFtsMSwgbDIsIGwzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobjEuY2hpbGRyZW4sIGxpc3QpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG4xLndhc19jaGFuZ2VkKQorICAgICAgICBsMm5ldyA9IHB5dHJlZS5MZWFmKDEwMCwgIi0iKQorICAgICAgICBsMi5yZXBsYWNlKGwybmV3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4xLmNoaWxkcmVuLCBbbDEsIGwybmV3LCBsM10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG4xLmNoaWxkcmVuLCBsaXN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG4xLndhc19jaGFuZ2VkKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZV93aXRoX2xpc3Qoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICIrIikKKyAgICAgICAgbDMgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMSwgbDIsIGwzXSkKKworICAgICAgICBsMi5yZXBsYWNlKFtweXRyZWUuTGVhZigxMDAsICIqIiksIHB5dHJlZS5MZWFmKDEwMCwgIioiKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG4xKSwgImZvbyoqYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobjEuY2hpbGRyZW4sIGxpc3QpKQorCisgICAgZGVmIHRlc3RfbGVhdmVzKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIikKKyAgICAgICAgbDMgPSBweXRyZWUuTGVhZigxMDAsICJmb29leSIpCisgICAgICAgIG4yID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCisgICAgICAgIG4zID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wzXSkKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbjIsIG4zXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobjEubGVhdmVzKCkpLCBbbDEsIGwyLCBsM10pCisKKyAgICBkZWYgdGVzdF9kZXB0aChzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIpCisgICAgICAgIG4yID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCisgICAgICAgIG4zID0gcHl0cmVlLk5vZGUoMTAwMCwgW10pCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW24yLCBuM10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS5kZXB0aCgpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4zLmRlcHRoKCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEuZGVwdGgoKSwgMCkKKworICAgIGRlZiB0ZXN0X3Bvc3Rfb3JkZXIoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQorICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMCwgImZvb2V5IikKKyAgICAgICAgYzEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbYzEsIGwzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG4xLnBvc3Rfb3JkZXIoKSksIFtsMSwgbDIsIGMxLCBsMywgbjFdKQorCisgICAgZGVmIHRlc3RfcHJlX29yZGVyKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIikKKyAgICAgICAgbDMgPSBweXRyZWUuTGVhZigxMDAsICJmb29leSIpCisgICAgICAgIGMxID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2MxLCBsM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChuMS5wcmVfb3JkZXIoKSksIFtuMSwgYzEsIGwxLCBsMiwgbDNdKQorCisgICAgZGVmIHRlc3RfY2hhbmdlZChzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsMS53YXNfY2hhbmdlZCkKKyAgICAgICAgbDEuY2hhbmdlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsMS53YXNfY2hhbmdlZCkKKworICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImYiKQorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobjEud2FzX2NoYW5nZWQpCisgICAgICAgIG4xLmNoYW5nZWQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobjEud2FzX2NoYW5nZWQpCisKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgIisiKQorICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIpCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMiwgbDNdKQorICAgICAgICBuMiA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtuMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobDEud2FzX2NoYW5nZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobjEud2FzX2NoYW5nZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobjIud2FzX2NoYW5nZWQpCisKKyAgICAgICAgbjEuY2hhbmdlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuMS53YXNfY2hhbmdlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG4yLndhc19jaGFuZ2VkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGwxLndhc19jaGFuZ2VkKQorCisgICAgZGVmIHRlc3RfbGVhZl9jb25zdHJ1Y3Rvcl9wcmVmaXgoc2VsZik6CisgICAgICAgIGZvciBwcmVmaXggaW4gKCJ4eXpfIiwgIiIpOgorICAgICAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJzZWxmIiwgcHJlZml4PXByZWZpeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIobDEpLCBwcmVmaXggKyAic2VsZiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnByZWZpeCwgcHJlZml4KQorCisgICAgZGVmIHRlc3Rfbm9kZV9jb25zdHJ1Y3Rvcl9wcmVmaXgoc2VsZik6CisgICAgICAgIGZvciBwcmVmaXggaW4gKCJ4eXpfIiwgIiIpOgorICAgICAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJzZWxmIikKKyAgICAgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIiwgcHJlZml4PSJfIikKKyAgICAgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0sIHByZWZpeD1wcmVmaXgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKG4xKSwgcHJlZml4ICsgInNlbGZfZm9vIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEucHJlZml4LCBwcmVmaXgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnByZWZpeCwgcHJlZml4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMi5wcmVmaXgsICJfIikKKworICAgIGRlZiB0ZXN0X3JlbW92ZShzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCisgICAgICAgIG4yID0gcHl0cmVlLk5vZGUoMTAwMCwgW24xXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4xLnJlbW92ZSgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4yLmNoaWxkcmVuLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS5wYXJlbnQsIG4xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4xLnBhcmVudCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMi5wYXJlbnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobjEud2FzX2NoYW5nZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuMi53YXNfY2hhbmdlZCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwyLnJlbW92ZSgpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnJlbW92ZSgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4xLmNoaWxkcmVuLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS5wYXJlbnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEucGFyZW50LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4yLnBhcmVudCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG4xLndhc19jaGFuZ2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobjIud2FzX2NoYW5nZWQpCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfcGFyZW50bGVzcyhzZWxmKToKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbXSkKKyAgICAgICAgbjEucmVtb3ZlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5wYXJlbnQsIE5vbmUpCisKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBsMS5yZW1vdmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnBhcmVudCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X25vZGVfc2V0X2NoaWxkKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxXSkKKworICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIpCisgICAgICAgIG4xLnNldF9jaGlsZCgwLCBsMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS5wYXJlbnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDIucGFyZW50LCBuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5jaGlsZHJlbiwgW2wyXSkKKworICAgICAgICBuMiA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMV0pCisgICAgICAgIG4yLnNldF9jaGlsZCgwLCBuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS5wYXJlbnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEucGFyZW50LCBuMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMi5wYXJlbnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjIuY2hpbGRyZW4sIFtuMV0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbjEuc2V0X2NoaWxkLCA0LCBsMikKKyAgICAgICAgIyBJIGRvbid0IGNhcmUgd2hhdCBpdCByYWlzZXMsIHNvIGxvbmcgYXMgaXQncyBhbiBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLCBuMS5zZXRfY2hpbGQsIDAsIGxpc3QpCisKKyAgICBkZWYgdGVzdF9ub2RlX2luc2VydF9jaGlsZChzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMV0pCisKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQorICAgICAgICBuMS5pbnNlcnRfY2hpbGQoMCwgbDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDIucGFyZW50LCBuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5jaGlsZHJlbiwgW2wyLCBsMV0pCisKKyAgICAgICAgbDMgPSBweXRyZWUuTGVhZigxMDAsICJhYmMiKQorICAgICAgICBuMS5pbnNlcnRfY2hpbGQoMiwgbDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEuY2hpbGRyZW4sIFtsMiwgbDEsIGwzXSkKKworICAgICAgICAjIEkgZG9uJ3QgY2FyZSB3aGF0IGl0IHJhaXNlcywgc28gbG9uZyBhcyBpdCdzIGFuIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIG4xLmluc2VydF9jaGlsZCwgMCwgbGlzdCkKKworICAgIGRlZiB0ZXN0X25vZGVfYXBwZW5kX2NoaWxkKHNlbGYpOgorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtdKQorCisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbjEuYXBwZW5kX2NoaWxkKGwxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnBhcmVudCwgbjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEuY2hpbGRyZW4sIFtsMV0pCisKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQorICAgICAgICBuMS5hcHBlbmRfY2hpbGQobDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDIucGFyZW50LCBuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5jaGlsZHJlbiwgW2wxLCBsMl0pCisKKyAgICAgICAgIyBJIGRvbid0IGNhcmUgd2hhdCBpdCByYWlzZXMsIHNvIGxvbmcgYXMgaXQncyBhbiBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLCBuMS5hcHBlbmRfY2hpbGQsIGxpc3QpCisKKyAgICBkZWYgdGVzdF9ub2RlX25leHRfc2libGluZyhzZWxmKToKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbXSkKKyAgICAgICAgbjIgPSBweXRyZWUuTm9kZSgxMDAwLCBbXSkKKyAgICAgICAgcDEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbjEsIG4yXSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUobjEubmV4dF9zaWJsaW5nIGlzIG4yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4yLm5leHRfc2libGluZywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5uZXh0X3NpYmxpbmcsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9sZWFmX25leHRfc2libGluZyhzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJhIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiIikKKyAgICAgICAgcDEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUobDEubmV4dF9zaWJsaW5nIGlzIGwyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwyLm5leHRfc2libGluZywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5uZXh0X3NpYmxpbmcsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9ub2RlX3ByZXZfc2libGluZyhzZWxmKToKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbXSkKKyAgICAgICAgbjIgPSBweXRyZWUuTm9kZSgxMDAwLCBbXSkKKyAgICAgICAgcDEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbjEsIG4yXSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUobjIucHJldl9zaWJsaW5nIGlzIG4xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4xLnByZXZfc2libGluZywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5wcmV2X3NpYmxpbmcsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9sZWFmX3ByZXZfc2libGluZyhzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJhIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiIikKKyAgICAgICAgcDEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUobDIucHJldl9zaWJsaW5nIGlzIGwxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnByZXZfc2libGluZywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5wcmV2X3NpYmxpbmcsIE5vbmUpCisKKworY2xhc3MgVGVzdFBhdHRlcm5zKHN1cHBvcnQuVGVzdENhc2UpOgorCisgICAgIiIiVW5pdCB0ZXN0cyBmb3IgdHJlZSBtYXRjaGluZyBwYXR0ZXJucy4iIiIKKworICAgIGRlZiB0ZXN0X2Jhc2ljX3BhdHRlcm5zKHNlbGYpOgorICAgICAgICAjIEJ1aWxkIGEgdHJlZQorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIikKKyAgICAgICAgbDMgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMSwgbDJdKQorICAgICAgICBuMiA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsM10pCisgICAgICAgIHJvb3QgPSBweXRyZWUuTm9kZSgxMDAwLCBbbjEsIG4yXSkKKyAgICAgICAgIyBCdWlsZCBhIHBhdHRlcm4gbWF0Y2hpbmcgYSBsZWFmCisgICAgICAgIHBsID0gcHl0cmVlLkxlYWZQYXR0ZXJuKDEwMCwgImZvbyIsIG5hbWU9InBsIikKKyAgICAgICAgciA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocGwubWF0Y2gocm9vdCwgcmVzdWx0cz1yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwbC5tYXRjaChuMSwgcmVzdWx0cz1yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwbC5tYXRjaChuMiwgcmVzdWx0cz1yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBsLm1hdGNoKGwxLCByZXN1bHRzPXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIHsicGwiOiBsMX0pCisgICAgICAgIHIgPSB7fQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBsLm1hdGNoKGwyLCByZXN1bHRzPXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIHt9KQorICAgICAgICAjIEJ1aWxkIGEgcGF0dGVybiBtYXRjaGluZyBhIG5vZGUKKyAgICAgICAgcG4gPSBweXRyZWUuTm9kZVBhdHRlcm4oMTAwMCwgW3BsXSwgbmFtZT0icG4iKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBuLm1hdGNoKHJvb3QsIHJlc3VsdHM9cikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocG4ubWF0Y2gobjEsIHJlc3VsdHM9cikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwbi5tYXRjaChuMiwgcmVzdWx0cz1yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB7InBuIjogbjIsICJwbCI6IGwzfSkKKyAgICAgICAgciA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocG4ubWF0Y2gobDEsIHJlc3VsdHM9cikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocG4ubWF0Y2gobDIsIHJlc3VsdHM9cikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwge30pCisKKyAgICBkZWYgdGVzdF93aWxkY2FyZChzZWxmKToKKyAgICAgICAgIyBCdWlsZCBhIHRyZWUgZm9yIHRlc3RpbmcKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIpCisgICAgICAgIGwzID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKKyAgICAgICAgbjIgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDNdKQorICAgICAgICByb290ID0gcHl0cmVlLk5vZGUoMTAwMCwgW24xLCBuMl0pCisgICAgICAgICMgQnVpbGQgYSBwYXR0ZXJuCisgICAgICAgIHBsID0gcHl0cmVlLkxlYWZQYXR0ZXJuKDEwMCwgImZvbyIsIG5hbWU9InBsIikKKyAgICAgICAgcG4gPSBweXRyZWUuTm9kZVBhdHRlcm4oMTAwMCwgW3BsXSwgbmFtZT0icG4iKQorICAgICAgICBwdyA9IHB5dHJlZS5XaWxkY2FyZFBhdHRlcm4oW1twbl0sIFtwbCwgcGxdXSwgbmFtZT0icHciKQorICAgICAgICByID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwdy5tYXRjaF9zZXEoW3Jvb3RdLCByKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwdy5tYXRjaF9zZXEoW24xXSwgcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwdy5tYXRjaF9zZXEoW24yXSwgcikpCisgICAgICAgICMgVGhlc2UgYXJlIGVhc2llciB0byBkZWJ1ZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChyLmtleXMoKSksIFsicGwiLCAicG4iLCAicHciXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyWyJwbCJdLCBsMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyWyJwbiJdLCBuMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyWyJwdyJdLCBbbjJdKQorICAgICAgICAjIEJ1dCB0aGlzIGlzIGVxdWl2YWxlbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB7InBsIjogbDEsICJwbiI6IG4yLCAicHciOiBbbjJdfSkKKyAgICAgICAgciA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwdy5tYXRjaF9zZXEoW2wxLCBsM10sIHIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIHsicGwiOiBsMywgInB3IjogW2wxLCBsM119KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoclsicGwiXSBpcyBsMykKKyAgICAgICAgciA9IHt9CisKKyAgICBkZWYgdGVzdF9nZW5lcmF0ZV9tYXRjaGVzKHNlbGYpOgorICAgICAgICBsYSA9IHB5dHJlZS5MZWFmKDEsICJhIikKKyAgICAgICAgbGIgPSBweXRyZWUuTGVhZigxLCAiYiIpCisgICAgICAgIGxjID0gcHl0cmVlLkxlYWYoMSwgImMiKQorICAgICAgICBsZCA9IHB5dHJlZS5MZWFmKDEsICJkIikKKyAgICAgICAgbGUgPSBweXRyZWUuTGVhZigxLCAiZSIpCisgICAgICAgIGxmID0gcHl0cmVlLkxlYWYoMSwgImYiKQorICAgICAgICBsZWF2ZXMgPSBbbGEsIGxiLCBsYywgbGQsIGxlLCBsZl0KKyAgICAgICAgcm9vdCA9IHB5dHJlZS5Ob2RlKDEwMDAsIGxlYXZlcykKKyAgICAgICAgcGEgPSBweXRyZWUuTGVhZlBhdHRlcm4oMSwgImEiLCAicGEiKQorICAgICAgICBwYiA9IHB5dHJlZS5MZWFmUGF0dGVybigxLCAiYiIsICJwYiIpCisgICAgICAgIHBjID0gcHl0cmVlLkxlYWZQYXR0ZXJuKDEsICJjIiwgInBjIikKKyAgICAgICAgcGQgPSBweXRyZWUuTGVhZlBhdHRlcm4oMSwgImQiLCAicGQiKQorICAgICAgICBwZSA9IHB5dHJlZS5MZWFmUGF0dGVybigxLCAiZSIsICJwZSIpCisgICAgICAgIHBmID0gcHl0cmVlLkxlYWZQYXR0ZXJuKDEsICJmIiwgInBmIikKKyAgICAgICAgcHcgPSBweXRyZWUuV2lsZGNhcmRQYXR0ZXJuKFtbcGEsIHBiLCBwY10sIFtwZCwgcGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYSwgcGJdLCBbcGMsIHBkXSwgW3BlLCBwZl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluPTEsIG1heD00LCBuYW1lPSJwdyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3hbMF0gZm9yIHggaW4gcHcuZ2VuZXJhdGVfbWF0Y2hlcyhsZWF2ZXMpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbMywgNSwgMiwgNCwgNl0pCisgICAgICAgIHByID0gcHl0cmVlLk5vZGVQYXR0ZXJuKHR5cGU9MTAwMCwgY29udGVudD1bcHddLCBuYW1lPSJwciIpCisgICAgICAgIG1hdGNoZXMgPSBsaXN0KHB5dHJlZS5nZW5lcmF0ZV9tYXRjaGVzKFtwcl0sIFtyb290XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1hdGNoZXMpLCAxKQorICAgICAgICBjLCByID0gbWF0Y2hlc1swXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHJbInByIl0pLCAiYWJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyWyJwdyJdLCBbbGEsIGxiLCBsYywgbGQsIGxlLCBsZl0pCisgICAgICAgIGZvciBjIGluICJhYmNkZWYiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyWyJwIiArIGNdLCBweXRyZWUuTGVhZigxLCBjKSkKKworICAgIGRlZiB0ZXN0X2hhc19rZXlfZXhhbXBsZShzZWxmKToKKyAgICAgICAgcGF0dGVybiA9IHB5dHJlZS5Ob2RlUGF0dGVybigzMzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB5dHJlZS5MZWFmUGF0dGVybig3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0cmVlLldpbGRjYXJkUGF0dGVybihuYW1lPSJhcmdzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5dHJlZS5MZWFmUGF0dGVybig4KSkpCisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoNywgIigiKQorICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDMsICJ4IikKKyAgICAgICAgbDMgPSBweXRyZWUuTGVhZig4LCAiKSIpCisgICAgICAgIG5vZGUgPSBweXRyZWUuTm9kZSgzMzEsIFtsMSwgbDIsIGwzXSkKKyAgICAgICAgciA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXR0ZXJuLm1hdGNoKG5vZGUsIHIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbImFyZ3MiXSwgW2wyXSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3B5dHJlZS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZWEzZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3B5dHJlZS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjJiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyMGQxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5CkBAIC0wLDAgKzEsMzE3IEBACisiIiIKK1VuaXQgdGVzdHMgZm9yIHJlZmFjdG9yLnB5LgorIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgY29kZWNzCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBTdHJpbmdJTworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworCitmcm9tIGxpYjJ0bzMgaW1wb3J0IHJlZmFjdG9yLCBweWdyYW0sIGZpeGVyX2Jhc2UKK2Zyb20gbGliMnRvMy5wZ2VuMiBpbXBvcnQgdG9rZW4KKworZnJvbSAuIGltcG9ydCBzdXBwb3J0CisKKworVEVTVF9EQVRBX0RJUiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAiZGF0YSIpCitGSVhFUl9ESVIgPSBvcy5wYXRoLmpvaW4oVEVTVF9EQVRBX0RJUiwgImZpeGVycyIpCisKK3N5cy5wYXRoLmFwcGVuZChGSVhFUl9ESVIpCit0cnk6CisgICAgX0RFRkFVTFRfRklYRVJTID0gcmVmYWN0b3IuZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UoIm15Zml4ZXMiKQorZmluYWxseToKKyAgICBzeXMucGF0aC5wb3AoKQorCitfMlRPM19GSVhFUlMgPSByZWZhY3Rvci5nZXRfZml4ZXJzX2Zyb21fcGFja2FnZSgibGliMnRvMy5maXhlcyIpCisKK2NsYXNzIFRlc3RSZWZhY3RvcmluZ1Rvb2wodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzeXMucGF0aC5hcHBlbmQoRklYRVJfRElSKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMucGF0aC5wb3AoKQorCisgICAgZGVmIGNoZWNrX2luc3RhbmNlcyhzZWxmLCBpbnN0YW5jZXMsIGNsYXNzZXMpOgorICAgICAgICBmb3IgaW5zdCwgY2xzIGluIHppcChpbnN0YW5jZXMsIGNsYXNzZXMpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaW5zdCwgY2xzKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzIGFyZSBub3QgaW5zdGFuY2VzIG9mICVzIiAlIGluc3RhbmNlcywgY2xhc3NlcykKKworICAgIGRlZiBydChzZWxmLCBvcHRpb25zPU5vbmUsIGZpeGVycz1fREVGQVVMVF9GSVhFUlMsIGV4cGxpY2l0PU5vbmUpOgorICAgICAgICByZXR1cm4gcmVmYWN0b3IuUmVmYWN0b3JpbmdUb29sKGZpeGVycywgb3B0aW9ucywgZXhwbGljaXQpCisKKyAgICBkZWYgdGVzdF9wcmludF9mdW5jdGlvbl9vcHRpb24oc2VsZik6CisgICAgICAgIHJ0ID0gc2VsZi5ydCh7InByaW50X2Z1bmN0aW9uIiA6IFRydWV9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnQuZ3JhbW1hciBpcyBweWdyYW0ucHl0aG9uX2dyYW1tYXJfbm9fcHJpbnRfc3RhdGVtZW50KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnQuZHJpdmVyLmdyYW1tYXIgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHB5Z3JhbS5weXRob25fZ3JhbW1hcl9ub19wcmludF9zdGF0ZW1lbnQpCisKKyAgICBkZWYgdGVzdF93cml0ZV91bmNoYW5nZWRfZmlsZXNfb3B0aW9uKHNlbGYpOgorICAgICAgICBydCA9IHNlbGYucnQoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJ0LndyaXRlX3VuY2hhbmdlZF9maWxlcykKKyAgICAgICAgcnQgPSBzZWxmLnJ0KHsid3JpdGVfdW5jaGFuZ2VkX2ZpbGVzIiA6IFRydWV9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnQud3JpdGVfdW5jaGFuZ2VkX2ZpbGVzKQorCisgICAgZGVmIHRlc3RfZml4ZXJfbG9hZGluZ19oZWxwZXJzKHNlbGYpOgorICAgICAgICBjb250ZW50cyA9IFsiZXhwbGljaXQiLCAiZmlyc3QiLCAibGFzdCIsICJwYXJyb3QiLCAicHJlb3JkZXIiXQorICAgICAgICBub25fcHJlZml4ZWQgPSByZWZhY3Rvci5nZXRfYWxsX2ZpeF9uYW1lcygibXlmaXhlcyIpCisgICAgICAgIHByZWZpeGVkID0gcmVmYWN0b3IuZ2V0X2FsbF9maXhfbmFtZXMoIm15Zml4ZXMiLCBGYWxzZSkKKyAgICAgICAgZnVsbF9uYW1lcyA9IHJlZmFjdG9yLmdldF9maXhlcnNfZnJvbV9wYWNrYWdlKCJteWZpeGVzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcmVmaXhlZCwgWyJmaXhfIiArIG5hbWUgZm9yIG5hbWUgaW4gY29udGVudHNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vbl9wcmVmaXhlZCwgY29udGVudHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVsbF9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBbIm15Zml4ZXMuZml4XyIgKyBuYW1lIGZvciBuYW1lIGluIGNvbnRlbnRzXSkKKworICAgIGRlZiB0ZXN0X2RldGVjdF9mdXR1cmVfZmVhdHVyZXMoc2VsZik6CisgICAgICAgIHJ1biA9IHJlZmFjdG9yLl9kZXRlY3RfZnV0dXJlX2ZlYXR1cmVzCisgICAgICAgIGZzID0gZnJvemVuc2V0CisgICAgICAgIGVtcHR5ID0gZnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bigiIiksIGVtcHR5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bigiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZzKCgicHJpbnRfZnVuY3Rpb24iLCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bigiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgZnMoKCJnZW5lcmF0b3JzIiwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oImZyb20gX19mdXR1cmVfXyBpbXBvcnQgZ2VuZXJhdG9ycywgZmVhdHVyZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZzKCgiZ2VuZXJhdG9ycyIsICJmZWF0dXJlIikpKQorICAgICAgICBpbnAgPSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzLCBwcmludF9mdW5jdGlvbiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oaW5wKSwgZnMoKCJnZW5lcmF0b3JzIiwgInByaW50X2Z1bmN0aW9uIikpKQorICAgICAgICBpbnAgPSJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uLCBnZW5lcmF0b3JzIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bihpbnApLCBmcygoInByaW50X2Z1bmN0aW9uIiwgImdlbmVyYXRvcnMiKSkpCisgICAgICAgIGlucCA9ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IChwcmludF9mdW5jdGlvbiwpIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bihpbnApLCBmcygoInByaW50X2Z1bmN0aW9uIiwpKSkKKyAgICAgICAgaW5wID0gImZyb20gX19mdXR1cmVfXyBpbXBvcnQgKGdlbmVyYXRvcnMsIHByaW50X2Z1bmN0aW9uKSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oaW5wKSwgZnMoKCJnZW5lcmF0b3JzIiwgInByaW50X2Z1bmN0aW9uIikpKQorICAgICAgICBpbnAgPSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAoZ2VuZXJhdG9ycywgbmVzdGVkX3Njb3BlcykiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKGlucCksIGZzKCgiZ2VuZXJhdG9ycyIsICJuZXN0ZWRfc2NvcGVzIikpKQorICAgICAgICBpbnAgPSAiIiJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24iIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oaW5wKSwgZnMoKCJnZW5lcmF0b3JzIiwgInByaW50X2Z1bmN0aW9uIikpKQorICAgICAgICBpbnZhbGlkID0gKCJmcm9tIiwKKyAgICAgICAgICAgICAgICAgICAiZnJvbSA0IiwKKyAgICAgICAgICAgICAgICAgICAiZnJvbSB4IiwKKyAgICAgICAgICAgICAgICAgICAiZnJvbSB4IDUiLAorICAgICAgICAgICAgICAgICAgICJmcm9tIHggaW0iLAorICAgICAgICAgICAgICAgICAgICJmcm9tIHggaW1wb3J0IiwKKyAgICAgICAgICAgICAgICAgICAiZnJvbSB4IGltcG9ydCA0IiwKKyAgICAgICAgICAgICAgICAgICApCisgICAgICAgIGZvciBpbnAgaW4gaW52YWxpZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKGlucCksIGVtcHR5KQorICAgICAgICBpbnAgPSAiJ2RvY3N0cmluZydcbmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKGlucCksIGZzKCgicHJpbnRfZnVuY3Rpb24iLCkpKQorICAgICAgICBpbnAgPSAiJ2RvY3N0cmluZydcbidzb21uZydcbmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKGlucCksIGVtcHR5KQorICAgICAgICBpbnAgPSAiIyBjb21tZW50XG5mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bihpbnApLCBmcygoInByaW50X2Z1bmN0aW9uIiwpKSkKKyAgICAgICAgaW5wID0gIiMgY29tbWVudFxuJ2RvYydcbmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKGlucCksIGZzKCgicHJpbnRfZnVuY3Rpb24iLCkpKQorICAgICAgICBpbnAgPSAiY2xhc3MgeDogcGFzc1xuZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oaW5wKSwgZW1wdHkpCisKKyAgICBkZWYgdGVzdF9nZXRfaGVhZG5vZGVfZGljdChzZWxmKToKKyAgICAgICAgY2xhc3MgTm9uZUZpeChmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEZpbGVJbnB1dEZpeChmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgICAgICAgICAgUEFUVEVSTiA9ICJmaWxlX2lucHV0PCBhbnkgKiA+IgorCisgICAgICAgIGNsYXNzIFNpbXBsZUZpeChmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgICAgICAgICAgUEFUVEVSTiA9ICInbmFtZSciCisKKyAgICAgICAgbm9faGVhZCA9IE5vbmVGaXgoe30sIFtdKQorICAgICAgICB3aXRoX2hlYWQgPSBGaWxlSW5wdXRGaXgoe30sIFtdKQorICAgICAgICBzaW1wbGUgPSBTaW1wbGVGaXgoe30sIFtdKQorICAgICAgICBkID0gcmVmYWN0b3IuX2dldF9oZWFkbm9kZV9kaWN0KFtub19oZWFkLCB3aXRoX2hlYWQsIHNpbXBsZV0pCisgICAgICAgIHRvcF9maXhlcyA9IGQucG9wKHB5Z3JhbS5weXRob25fc3ltYm9scy5maWxlX2lucHV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRvcF9maXhlcywgW3dpdGhfaGVhZCwgbm9faGVhZF0pCisgICAgICAgIG5hbWVfZml4ZXMgPSBkLnBvcCh0b2tlbi5OQU1FKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVfZml4ZXMsIFtzaW1wbGUsIG5vX2hlYWRdKQorICAgICAgICBmb3IgZml4ZXMgaW4gZC5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeGVzLCBbbm9faGVhZF0pCisKKyAgICBkZWYgdGVzdF9maXhlcl9sb2FkaW5nKHNlbGYpOgorICAgICAgICBmcm9tIG15Zml4ZXMuZml4X2ZpcnN0IGltcG9ydCBGaXhGaXJzdAorICAgICAgICBmcm9tIG15Zml4ZXMuZml4X2xhc3QgaW1wb3J0IEZpeExhc3QKKyAgICAgICAgZnJvbSBteWZpeGVzLmZpeF9wYXJyb3QgaW1wb3J0IEZpeFBhcnJvdAorICAgICAgICBmcm9tIG15Zml4ZXMuZml4X3ByZW9yZGVyIGltcG9ydCBGaXhQcmVvcmRlcgorCisgICAgICAgIHJ0ID0gc2VsZi5ydCgpCisgICAgICAgIHByZSwgcG9zdCA9IHJ0LmdldF9maXhlcnMoKQorCisgICAgICAgIHNlbGYuY2hlY2tfaW5zdGFuY2VzKHByZSwgW0ZpeFByZW9yZGVyXSkKKyAgICAgICAgc2VsZi5jaGVja19pbnN0YW5jZXMocG9zdCwgW0ZpeEZpcnN0LCBGaXhQYXJyb3QsIEZpeExhc3RdKQorCisgICAgZGVmIHRlc3RfbmF1Z2h0eV9maXhlcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yLCBzZWxmLnJ0LCBmaXhlcnM9WyJub3RfaGVyZSJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZWZhY3Rvci5GaXhlckVycm9yLCBzZWxmLnJ0LCBmaXhlcnM9WyJub19maXhlcl9jbHMiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmVmYWN0b3IuRml4ZXJFcnJvciwgc2VsZi5ydCwgZml4ZXJzPVsiYmFkX29yZGVyIl0pCisKKyAgICBkZWYgdGVzdF9yZWZhY3Rvcl9zdHJpbmcoc2VsZik6CisgICAgICAgIHJ0ID0gc2VsZi5ydCgpCisgICAgICAgIGlucHV0ID0gImRlZiBwYXJyb3QoKTogcGFzc1xuXG4iCisgICAgICAgIHRyZWUgPSBydC5yZWZhY3Rvcl9zdHJpbmcoaW5wdXQsICI8dGVzdD4iKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHN0cih0cmVlKSwgaW5wdXQpCisKKyAgICAgICAgaW5wdXQgPSAiZGVmIGYoKTogcGFzc1xuXG4iCisgICAgICAgIHRyZWUgPSBydC5yZWZhY3Rvcl9zdHJpbmcoaW5wdXQsICI8dGVzdD4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0cmVlKSwgaW5wdXQpCisKKyAgICBkZWYgdGVzdF9yZWZhY3Rvcl9zdGRpbihzZWxmKToKKworICAgICAgICBjbGFzcyBNeVJUKHJlZmFjdG9yLlJlZmFjdG9yaW5nVG9vbCk6CisKKyAgICAgICAgICAgIGRlZiBwcmludF9vdXRwdXQoc2VsZiwgb2xkX3RleHQsIG5ld190ZXh0LCBmaWxlbmFtZSwgZXF1YWwpOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuZXh0ZW5kKFtvbGRfdGV4dCwgbmV3X3RleHQsIGZpbGVuYW1lLCBlcXVhbF0pCisKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIHJ0ID0gTXlSVChfREVGQVVMVF9GSVhFUlMpCisgICAgICAgIHNhdmUgPSBzeXMuc3RkaW4KKyAgICAgICAgc3lzLnN0ZGluID0gU3RyaW5nSU8uU3RyaW5nSU8oImRlZiBwYXJyb3QoKTogcGFzc1xuXG4iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBydC5yZWZhY3Rvcl9zdGRpbigpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3RkaW4gPSBzYXZlCisgICAgICAgIGV4cGVjdGVkID0gWyJkZWYgcGFycm90KCk6IHBhc3NcblxuIiwKKyAgICAgICAgICAgICAgICAgICAgImRlZiBjaGVlc2UoKTogcGFzc1xuXG4iLAorICAgICAgICAgICAgICAgICAgICAiPHN0ZGluPiIsIEZhbHNlXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMsIGV4cGVjdGVkKQorCisgICAgZGVmIGNoZWNrX2ZpbGVfcmVmYWN0b3Jpbmcoc2VsZiwgdGVzdF9maWxlLCBmaXhlcnM9XzJUTzNfRklYRVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9Tm9uZSwgbW9ja19sb2dfZGVidWc9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxseV93cml0ZT1UcnVlKToKKyAgICAgICAgdG1wZGlyID0gdGVtcGZpbGUubWtkdGVtcChwcmVmaXg9IjJ0bzMtdGVzdF9yZWZhY3RvciIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzaHV0aWwucm10cmVlLCB0bXBkaXIpCisgICAgICAgICMgbWFrZSBhIGNvcHkgb2YgdGhlIHRlc3RlZCBmaWxlIHRoYXQgd2UgY2FuIHdyaXRlIHRvCisgICAgICAgIHNodXRpbC5jb3B5KHRlc3RfZmlsZSwgdG1wZGlyKQorICAgICAgICB0ZXN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBvcy5wYXRoLmJhc2VuYW1lKHRlc3RfZmlsZSkpCisgICAgICAgIG9zLmNobW9kKHRlc3RfZmlsZSwgMG82NDQpCisKKyAgICAgICAgZGVmIHJlYWRfZmlsZSgpOgorICAgICAgICAgICAgd2l0aCBvcGVuKHRlc3RfZmlsZSwgInJiIikgYXMgZnA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZwLnJlYWQoKQorCisgICAgICAgIG9sZF9jb250ZW50cyA9IHJlYWRfZmlsZSgpCisgICAgICAgIHJ0ID0gc2VsZi5ydChmaXhlcnM9Zml4ZXJzLCBvcHRpb25zPW9wdGlvbnMpCisgICAgICAgIGlmIG1vY2tfbG9nX2RlYnVnOgorICAgICAgICAgICAgcnQubG9nX2RlYnVnID0gbW9ja19sb2dfZGVidWcKKworICAgICAgICBydC5yZWZhY3Rvcl9maWxlKHRlc3RfZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvbGRfY29udGVudHMsIHJlYWRfZmlsZSgpKQorCisgICAgICAgIGlmIG5vdCBhY3R1YWxseV93cml0ZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBydC5yZWZhY3Rvcl9maWxlKHRlc3RfZmlsZSwgVHJ1ZSkKKyAgICAgICAgbmV3X2NvbnRlbnRzID0gcmVhZF9maWxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvbGRfY29udGVudHMsIG5ld19jb250ZW50cykKKyAgICAgICAgcmV0dXJuIG5ld19jb250ZW50cworCisgICAgZGVmIHRlc3RfcmVmYWN0b3JfZmlsZShzZWxmKToKKyAgICAgICAgdGVzdF9maWxlID0gb3MucGF0aC5qb2luKEZJWEVSX0RJUiwgInBhcnJvdF9leGFtcGxlLnB5IikKKyAgICAgICAgc2VsZi5jaGVja19maWxlX3JlZmFjdG9yaW5nKHRlc3RfZmlsZSwgX0RFRkFVTFRfRklYRVJTKQorCisgICAgZGVmIHRlc3RfcmVmYWN0b3JfZmlsZV93cml0ZV91bmNoYW5nZWRfZmlsZShzZWxmKToKKyAgICAgICAgdGVzdF9maWxlID0gb3MucGF0aC5qb2luKEZJWEVSX0RJUiwgInBhcnJvdF9leGFtcGxlLnB5IikKKyAgICAgICAgZGVidWdfbWVzc2FnZXMgPSBbXQorICAgICAgICBkZWYgcmVjb3JkaW5nX2xvZ19kZWJ1Zyhtc2csICphcmdzKToKKyAgICAgICAgICAgIGRlYnVnX21lc3NhZ2VzLmFwcGVuZChtc2cgJSBhcmdzKQorICAgICAgICBzZWxmLmNoZWNrX2ZpbGVfcmVmYWN0b3JpbmcodGVzdF9maWxlLCBmaXhlcnM9KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zPXsid3JpdGVfdW5jaGFuZ2VkX2ZpbGVzIjogVHJ1ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2NrX2xvZ19kZWJ1Zz1yZWNvcmRpbmdfbG9nX2RlYnVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsbHlfd3JpdGU9RmFsc2UpCisgICAgICAgICMgVGVzdGluZyB0aGF0IGl0IGxvZ2dlZCB0aGlzIG1lc3NhZ2Ugd2hlbiB3cml0ZT1GYWxzZSB3YXMgcGFzc2VkIGlzCisgICAgICAgICMgc3VmZmljaWVudCB0byBzZWUgdGhhdCBpdCBkaWQgbm90IGJhaWwgZWFybHkgYWZ0ZXIgIk5vIGNoYW5nZXMiLgorICAgICAgICBtZXNzYWdlX3JlZ2V4ID0gciJOb3Qgd3JpdGluZyBjaGFuZ2VzIHRvIC4qJXMlcyIgJSAoCisgICAgICAgICAgICAgICAgb3Muc2VwLCBvcy5wYXRoLmJhc2VuYW1lKHRlc3RfZmlsZSkpCisgICAgICAgIGZvciBtZXNzYWdlIGluIGRlYnVnX21lc3NhZ2VzOgorICAgICAgICAgICAgaWYgIk5vdCB3cml0aW5nIGNoYW5nZXMiIGluIG1lc3NhZ2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKG1lc3NhZ2UsIG1lc3NhZ2VfcmVnZXgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiJXIgbm90IG1hdGNoZWQgaW4gJXIiICUgKG1lc3NhZ2VfcmVnZXgsIGRlYnVnX21lc3NhZ2VzKSkKKworICAgIGRlZiB0ZXN0X3JlZmFjdG9yX2RpcihzZWxmKToKKyAgICAgICAgZGVmIGNoZWNrKHN0cnVjdHVyZSwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgZGVmIG1vY2tfcmVmYWN0b3JfZmlsZShzZWxmLCBmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgZ290LmFwcGVuZChmKQorICAgICAgICAgICAgc2F2ZV9mdW5jID0gcmVmYWN0b3IuUmVmYWN0b3JpbmdUb29sLnJlZmFjdG9yX2ZpbGUKKyAgICAgICAgICAgIHJlZmFjdG9yLlJlZmFjdG9yaW5nVG9vbC5yZWZhY3Rvcl9maWxlID0gbW9ja19yZWZhY3Rvcl9maWxlCisgICAgICAgICAgICBydCA9IHNlbGYucnQoKQorICAgICAgICAgICAgZ290ID0gW10KKyAgICAgICAgICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAocHJlZml4PSIydG8zLXRlc3RfcmVmYWN0b3IiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihkaXIsICJhX2RpciIpKQorICAgICAgICAgICAgICAgIGZvciBmbiBpbiBzdHJ1Y3R1cmU6CisgICAgICAgICAgICAgICAgICAgIG9wZW4ob3MucGF0aC5qb2luKGRpciwgZm4pLCAid2IiKS5jbG9zZSgpCisgICAgICAgICAgICAgICAgcnQucmVmYWN0b3JfZGlyKGRpcikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcmVmYWN0b3IuUmVmYWN0b3JpbmdUb29sLnJlZmFjdG9yX2ZpbGUgPSBzYXZlX2Z1bmMKKyAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKGRpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3MucGF0aC5qb2luKGRpciwgcGF0aCkgZm9yIHBhdGggaW4gZXhwZWN0ZWRdKQorICAgICAgICBjaGVjayhbXSwgW10pCisgICAgICAgIHRyZWUgPSBbIm5vdGhpbmciLAorICAgICAgICAgICAgICAgICJoaS5weSIsCisgICAgICAgICAgICAgICAgIi5kdW1iIiwKKyAgICAgICAgICAgICAgICAiLmFmdGVyLnB5IiwKKyAgICAgICAgICAgICAgICAibm90cHkubnB5IiwKKyAgICAgICAgICAgICAgICAic2FwcHkiXQorICAgICAgICBleHBlY3RlZCA9IFsiaGkucHkiXQorICAgICAgICBjaGVjayh0cmVlLCBleHBlY3RlZCkKKyAgICAgICAgdHJlZSA9IFsiaGkucHkiLAorICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigiYV9kaXIiLCAic3R1ZmYucHkiKV0KKyAgICAgICAgY2hlY2sodHJlZSwgdHJlZSkKKworICAgIGRlZiB0ZXN0X2ZpbGVfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIGZuID0gb3MucGF0aC5qb2luKFRFU1RfREFUQV9ESVIsICJkaWZmZXJlbnRfZW5jb2RpbmcucHkiKQorICAgICAgICBzZWxmLmNoZWNrX2ZpbGVfcmVmYWN0b3JpbmcoZm4pCisKKyAgICBkZWYgdGVzdF9ib20oc2VsZik6CisgICAgICAgIGZuID0gb3MucGF0aC5qb2luKFRFU1RfREFUQV9ESVIsICJib20ucHkiKQorICAgICAgICBkYXRhID0gc2VsZi5jaGVja19maWxlX3JlZmFjdG9yaW5nKGZuKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGF0YS5zdGFydHN3aXRoKGNvZGVjcy5CT01fVVRGOCkpCisKKyAgICBkZWYgdGVzdF9jcmxmX25ld2xpbmVzKHNlbGYpOgorICAgICAgICBvbGRfc2VwID0gb3MubGluZXNlcAorICAgICAgICBvcy5saW5lc2VwID0gIlxyXG4iCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKFRFU1RfREFUQV9ESVIsICJjcmxmLnB5IikKKyAgICAgICAgICAgIGZpeGVzID0gcmVmYWN0b3IuZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UoImxpYjJ0bzMuZml4ZXMiKQorICAgICAgICAgICAgc2VsZi5jaGVja19maWxlX3JlZmFjdG9yaW5nKGZuLCBmaXhlcykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmxpbmVzZXAgPSBvbGRfc2VwCisKKyAgICBkZWYgdGVzdF9yZWZhY3Rvcl9kb2NzdHJpbmcoc2VsZik6CisgICAgICAgIHJ0ID0gc2VsZi5ydCgpCisKKyAgICAgICAgZG9jID0gIiIiCis+Pj4gZXhhbXBsZSgpCis0MgorIiIiCisgICAgICAgIG91dCA9IHJ0LnJlZmFjdG9yX2RvY3N0cmluZyhkb2MsICI8dGVzdD4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgZG9jKQorCisgICAgICAgIGRvYyA9ICIiIgorPj4+IGRlZiBwYXJyb3QoKToKKy4uLiAgICAgIHJldHVybiA0MworIiIiCisgICAgICAgIG91dCA9IHJ0LnJlZmFjdG9yX2RvY3N0cmluZyhkb2MsICI8dGVzdD4iKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG91dCwgZG9jKQorCisgICAgZGVmIHRlc3RfZXhwbGljaXQoc2VsZik6CisgICAgICAgIGZyb20gbXlmaXhlcy5maXhfZXhwbGljaXQgaW1wb3J0IEZpeEV4cGxpY2l0CisKKyAgICAgICAgcnQgPSBzZWxmLnJ0KGZpeGVycz1bIm15Zml4ZXMuZml4X2V4cGxpY2l0Il0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJ0LnBvc3Rfb3JkZXIpLCAwKQorCisgICAgICAgIHJ0ID0gc2VsZi5ydChleHBsaWNpdD1bIm15Zml4ZXMuZml4X2V4cGxpY2l0Il0pCisgICAgICAgIGZvciBmaXggaW4gcnQucG9zdF9vcmRlcjoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZml4LCBGaXhFeHBsaWNpdCk6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwbGljaXQgZml4ZXIgbm90IGxvYWRlZCIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmMWI3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmMWI3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmFiOGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weQpAQCAtMCwwICsxLDU5NCBAQAorIiIiIFRlc3Qgc3VpdGUgZm9yIHRoZSBjb2RlIGluIGZpeGVyX3V0aWwgIiIiCisKKyMgVGVzdGluZyBpbXBvcnRzCitmcm9tIC4gaW1wb3J0IHN1cHBvcnQKKworIyBQeXRob24gaW1wb3J0cworaW1wb3J0IG9zLnBhdGgKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIGxpYjJ0bzMucHl0cmVlIGltcG9ydCBOb2RlLCBMZWFmCitmcm9tIGxpYjJ0bzMgaW1wb3J0IGZpeGVyX3V0aWwKK2Zyb20gbGliMnRvMy5maXhlcl91dGlsIGltcG9ydCBBdHRyLCBOYW1lLCBDYWxsLCBDb21tYQorZnJvbSBsaWIydG8zLnBnZW4yIGltcG9ydCB0b2tlbgorCitkZWYgcGFyc2UoY29kZSwgc3RyaXBfbGV2ZWxzPTApOgorICAgICMgVGhlIHRvcG1vc3Qgbm9kZSBpcyBmaWxlX2lucHV0LCB3aGljaCB3ZSBkb24ndCBjYXJlIGFib3V0LgorICAgICMgVGhlIG5leHQtdG9wbW9zdCBub2RlIGlzIGEgKl9zdG10IG5vZGUsIHdoaWNoIHdlIGFsc28gZG9uJ3QgY2FyZSBhYm91dAorICAgIHRyZWUgPSBzdXBwb3J0LnBhcnNlX3N0cmluZyhjb2RlKQorICAgIGZvciBpIGluIHJhbmdlKHN0cmlwX2xldmVscyk6CisgICAgICAgIHRyZWUgPSB0cmVlLmNoaWxkcmVuWzBdCisgICAgdHJlZS5wYXJlbnQgPSBOb25lCisgICAgcmV0dXJuIHRyZWUKKworY2xhc3MgTWFjcm9UZXN0Q2FzZShzdXBwb3J0LlRlc3RDYXNlKToKKyAgICBkZWYgYXNzZXJ0U3RyKHNlbGYsIG5vZGUsIHN0cmluZyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZSwgKHR1cGxlLCBsaXN0KSk6CisgICAgICAgICAgICBub2RlID0gTm9kZShmaXhlcl91dGlsLnN5bXMuc2ltcGxlX3N0bXQsIG5vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG5vZGUpLCBzdHJpbmcpCisKKworY2xhc3MgVGVzdF9pc190dXBsZShzdXBwb3J0LlRlc3RDYXNlKToKKyAgICBkZWYgaXNfdHVwbGUoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgcmV0dXJuIGZpeGVyX3V0aWwuaXNfdHVwbGUocGFyc2Uoc3RyaW5nLCBzdHJpcF9sZXZlbHM9MikpCisKKyAgICBkZWYgdGVzdF92YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaXNfdHVwbGUoIihhLCBiKSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pc190dXBsZSgiKGEsIChiLCBjKSkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaXNfdHVwbGUoIigoYSwgKGIsIGMpKSwpIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX3R1cGxlKCIoYSwpIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX3R1cGxlKCIoKSIpKQorCisgICAgZGVmIHRlc3RfaW52YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmlzX3R1cGxlKCIoYSkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmlzX3R1cGxlKCIoJ2ZvbycpICUgKGIsIGMpIikpCisKKworY2xhc3MgVGVzdF9pc19saXN0KHN1cHBvcnQuVGVzdENhc2UpOgorICAgIGRlZiBpc19saXN0KHNlbGYsIHN0cmluZyk6CisgICAgICAgIHJldHVybiBmaXhlcl91dGlsLmlzX2xpc3QocGFyc2Uoc3RyaW5nLCBzdHJpcF9sZXZlbHM9MikpCisKKyAgICBkZWYgdGVzdF92YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaXNfbGlzdCgiW10iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaXNfbGlzdCgiW2FdIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2xpc3QoIlthLCBiXSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pc19saXN0KCJbYSwgW2IsIGNdXSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pc19saXN0KCJbW2EsIFtiLCBjXV0sXSIpKQorCisgICAgZGVmIHRlc3RfaW52YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmlzX2xpc3QoIltdK1tdIikpCisKKworY2xhc3MgVGVzdF9BdHRyKE1hY3JvVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBjYWxsID0gcGFyc2UoImZvbygpIiwgc3RyaXBfbGV2ZWxzPTIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoQXR0cihOYW1lKCJhIiksIE5hbWUoImIiKSksICJhLmIiKQorICAgICAgICBzZWxmLmFzc2VydFN0cihBdHRyKGNhbGwsIE5hbWUoImIiKSksICJmb28oKS5iIikKKworICAgIGRlZiB0ZXN0X3JldHVybnMoc2VsZik6CisgICAgICAgIGF0dHIgPSBBdHRyKE5hbWUoImEiKSwgTmFtZSgiYiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYXR0ciksIGxpc3QpCisKKworY2xhc3MgVGVzdF9OYW1lKE1hY3JvVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFN0cihOYW1lKCJhIiksICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoTmFtZSgiZm9vLmZvbygpLmJhciIpLCAiZm9vLmZvbygpLmJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyKE5hbWUoImEiLCBwcmVmaXg9ImIiKSwgImJhIikKKworCitjbGFzcyBUZXN0X0NhbGwoTWFjcm9UZXN0Q2FzZSk6CisgICAgZGVmIF9DYWxsKHNlbGYsIG5hbWUsIGFyZ3M9Tm9uZSwgcHJlZml4PU5vbmUpOgorICAgICAgICAiIiJIZWxwIHRoZSBuZXh0IHRlc3QiIiIKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBpZiBpc2luc3RhbmNlKGFyZ3MsIGxpc3QpOgorICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICAgICAgICAgIGNoaWxkcmVuLmFwcGVuZChhcmcpCisgICAgICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kKENvbW1hKCkpCisgICAgICAgICAgICBjaGlsZHJlbi5wb3AoKQorICAgICAgICByZXR1cm4gQ2FsbChOYW1lKG5hbWUpLCBjaGlsZHJlbiwgcHJlZml4KQorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGtpZHMgPSBbTm9uZSwKKyAgICAgICAgICAgICAgICBbTGVhZih0b2tlbi5OVU1CRVIsIDEpLCBMZWFmKHRva2VuLk5VTUJFUiwgMiksCisgICAgICAgICAgICAgICAgIExlYWYodG9rZW4uTlVNQkVSLCAzKV0sCisgICAgICAgICAgICAgICAgW0xlYWYodG9rZW4uTlVNQkVSLCAxKSwgTGVhZih0b2tlbi5OVU1CRVIsIDMpLAorICAgICAgICAgICAgICAgICBMZWFmKHRva2VuLk5VTUJFUiwgMiksIExlYWYodG9rZW4uTlVNQkVSLCA0KV0sCisgICAgICAgICAgICAgICAgW0xlYWYodG9rZW4uU1RSSU5HLCAiYiIpLCBMZWFmKHRva2VuLlNUUklORywgImoiLCBwcmVmaXg9IiAiKV0KKyAgICAgICAgICAgICAgICBdCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyKHNlbGYuX0NhbGwoIkEiKSwgIkEoKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyKHNlbGYuX0NhbGwoImIiLCBraWRzWzFdKSwgImIoMSwyLDMpIikKKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoc2VsZi5fQ2FsbCgiYS5iKCkuYyIsIGtpZHNbMl0pLCAiYS5iKCkuYygxLDMsMiw0KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyKHNlbGYuX0NhbGwoImQiLCBraWRzWzNdLCBwcmVmaXg9IiAiKSwgIiBkKGIsIGopIikKKworCitjbGFzcyBUZXN0X2RvZXNfdHJlZV9pbXBvcnQoc3VwcG9ydC5UZXN0Q2FzZSk6CisgICAgZGVmIF9maW5kX2JpbmRfcmVjKHNlbGYsIG5hbWUsIG5vZGUpOgorICAgICAgICAjIFNlYXJjaCBhIHRyZWUgZm9yIGEgYmluZGluZyAtLSB1c2VkIHRvIGZpbmQgdGhlIHN0YXJ0aW5nCisgICAgICAgICMgcG9pbnQgZm9yIHRoZXNlIHRlc3RzLgorICAgICAgICBjID0gZml4ZXJfdXRpbC5maW5kX2JpbmRpbmcobmFtZSwgbm9kZSkKKyAgICAgICAgaWYgYzogcmV0dXJuIGMKKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGRyZW46CisgICAgICAgICAgICBjID0gc2VsZi5fZmluZF9iaW5kX3JlYyhuYW1lLCBjaGlsZCkKKyAgICAgICAgICAgIGlmIGM6IHJldHVybiBjCisKKyAgICBkZWYgZG9lc190cmVlX2ltcG9ydChzZWxmLCBwYWNrYWdlLCBuYW1lLCBzdHJpbmcpOgorICAgICAgICBub2RlID0gcGFyc2Uoc3RyaW5nKQorICAgICAgICAjIEZpbmQgdGhlIGJpbmRpbmcgb2Ygc3RhcnQgLS0gdGhhdCdzIHdoYXQgd2UnbGwgZ28gZnJvbQorICAgICAgICBub2RlID0gc2VsZi5fZmluZF9iaW5kX3JlYygnc3RhcnQnLCBub2RlKQorICAgICAgICByZXR1cm4gZml4ZXJfdXRpbC5kb2VzX3RyZWVfaW1wb3J0KHBhY2thZ2UsIG5hbWUsIG5vZGUpCisKKyAgICBkZWYgdHJ5X3dpdGgoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgZmFpbGluZ190ZXN0cyA9ICgoImEiLCAiYSIsICJmcm9tIGEgaW1wb3J0IGIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoImEuZCIsICJhIiwgImZyb20gYS5kIGltcG9ydCBiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJkLmEiLCAiYSIsICJmcm9tIGQuYSBpbXBvcnQgYiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCAiYSIsICJpbXBvcnQgYiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCAiYSIsICJpbXBvcnQgYiwgYywgZCIpKQorICAgICAgICBmb3IgcGFja2FnZSwgbmFtZSwgaW1wb3J0XyBpbiBmYWlsaW5nX3Rlc3RzOgorICAgICAgICAgICAgbiA9IHNlbGYuZG9lc190cmVlX2ltcG9ydChwYWNrYWdlLCBuYW1lLCBpbXBvcnRfICsgIlxuIiArIHN0cmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobikKKyAgICAgICAgICAgIG4gPSBzZWxmLmRvZXNfdHJlZV9pbXBvcnQocGFja2FnZSwgbmFtZSwgc3RyaW5nICsgIlxuIiArIGltcG9ydF8pCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG4pCisKKyAgICAgICAgcGFzc2luZ190ZXN0cyA9ICgoImEiLCAiYSIsICJmcm9tIGEgaW1wb3J0IGEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoIngiLCAiYSIsICJmcm9tIHggaW1wb3J0IGEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoIngiLCAiYSIsICJmcm9tIHggaW1wb3J0IGIsIGMsIGEsIGQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoInguYiIsICJhIiwgImZyb20geC5iIGltcG9ydCBhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJ4LmIiLCAiYSIsICJmcm9tIHguYiBpbXBvcnQgYiwgYywgYSwgZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCAiYSIsICJpbXBvcnQgYSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCAiYSIsICJpbXBvcnQgYiwgYywgYSwgZCIpKQorICAgICAgICBmb3IgcGFja2FnZSwgbmFtZSwgaW1wb3J0XyBpbiBwYXNzaW5nX3Rlc3RzOgorICAgICAgICAgICAgbiA9IHNlbGYuZG9lc190cmVlX2ltcG9ydChwYWNrYWdlLCBuYW1lLCBpbXBvcnRfICsgIlxuIiArIHN0cmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuKQorICAgICAgICAgICAgbiA9IHNlbGYuZG9lc190cmVlX2ltcG9ydChwYWNrYWdlLCBuYW1lLCBzdHJpbmcgKyAiXG4iICsgaW1wb3J0XykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuKQorCisgICAgZGVmIHRlc3RfaW5fZnVuY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYudHJ5X3dpdGgoImRlZiBmb28oKTpcblx0YmFyLmJheigpXG5cdHN0YXJ0PTMiKQorCitjbGFzcyBUZXN0X2ZpbmRfYmluZGluZyhzdXBwb3J0LlRlc3RDYXNlKToKKyAgICBkZWYgZmluZF9iaW5kaW5nKHNlbGYsIG5hbWUsIHN0cmluZywgcGFja2FnZT1Ob25lKToKKyAgICAgICAgcmV0dXJuIGZpeGVyX3V0aWwuZmluZF9iaW5kaW5nKG5hbWUsIHBhcnNlKHN0cmluZyksIHBhY2thZ2UpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfYXNzaWdubWVudChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImEgPSBiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJhID0gW2IsIGMsIGRdIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJhID0gZm9vKCkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImEgPSBmb28oKS5mb28uZm9vWzZdW2Zvb10iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmb28gPSBhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZm9vID0gKGEsIGIsIGMpIikpCisKKyAgICBkZWYgdGVzdF90dXBsZV9hc3NpZ25tZW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiKGEsKSA9IGIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgIihhLCBiLCBjKSA9IFtiLCBjLCBkXSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiKGMsIChkLCBhKSwgYikgPSBmb28oKSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiKGEsIGIpID0gZm9vKCkuZm9vWzZdW2Zvb10iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICIoZm9vLCBiKSA9IChiLCBhKSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgIihmb28sIChiLCBjKSkgPSAoYSwgYiwgYykiKSkKKworICAgIGRlZiB0ZXN0X2xpc3RfYXNzaWdubWVudChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgIlthXSA9IGIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgIlthLCBiLCBjXSA9IFtiLCBjLCBkXSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiW2MsIFtkLCBhXSwgYl0gPSBmb28oKSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiW2EsIGJdID0gZm9vKCkuZm9vW2FdW2Zvb10iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJbZm9vLCBiXSA9IChiLCBhKSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgIltmb28sIFtiLCBjXV0gPSAoYSwgYiwgYykiKSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfYXNzaWdubWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZm9vLmEgPSA1IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZm9vW2FdID0gNSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZvbyhhKSA9IDUiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmb28oYSwgYikgPSA1IikpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfaW1wb3J0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiaW1wb3J0IGEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImltcG9ydCBiLCBjLCBhLCBkIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiaW1wb3J0IGIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJpbXBvcnQgYiwgYywgZCIpKQorCisgICAgZGVmIHRlc3RfZnJvbV9pbXBvcnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHggaW1wb3J0IGEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20gYSBpbXBvcnQgYSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSB4IGltcG9ydCBiLCBjLCBhLCBkIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHguYiBpbXBvcnQgYSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSB4LmIgaW1wb3J0IGIsIGMsIGEsIGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIGEgaW1wb3J0IGIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIGEuZCBpbXBvcnQgYiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20gZC5hIGltcG9ydCBiIikpCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfYXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJpbXBvcnQgYiBhcyBhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJpbXBvcnQgYiBhcyBhLCBjLCBhIGFzIGYsIGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJpbXBvcnQgYSBhcyBmIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiaW1wb3J0IGIsIGMgYXMgZiwgZCBhcyBlIikpCisKKyAgICBkZWYgdGVzdF9mcm9tX2ltcG9ydF9hcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20geCBpbXBvcnQgYiBhcyBhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHggaW1wb3J0IGcgYXMgYSwgZCBhcyBiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHguYiBpbXBvcnQgdCBhcyBhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHguYiBpbXBvcnQgZyBhcyBhLCBkIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSBhIGltcG9ydCBiIGFzIHQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIGEuZCBpbXBvcnQgYiBhcyB0IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSBkLmEgaW1wb3J0IGIgYXMgdCIpKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX2ltcG9ydF93aXRoX3BhY2thZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYiIsICJpbXBvcnQgYiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImIiLCAiaW1wb3J0IGIsIGMsIGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYiIsICJpbXBvcnQgYiIsICJiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImIiLCAiaW1wb3J0IGIsIGMsIGQiLCAiYyIpKQorCisgICAgZGVmIHRlc3RfZnJvbV9pbXBvcnRfd2l0aF9wYWNrYWdlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSB4IGltcG9ydCBhIiwgIngiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20gYSBpbXBvcnQgYSIsICJhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHggaW1wb3J0ICoiLCAieCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSB4IGltcG9ydCBiLCBjLCBhLCBkIiwgIngiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20geC5iIGltcG9ydCBhIiwgInguYiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSB4LmIgaW1wb3J0ICoiLCAieC5iIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHguYiBpbXBvcnQgYiwgYywgYSwgZCIsICJ4LmIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIGEgaW1wb3J0IGIiLCAiYSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20gYS5kIGltcG9ydCBiIiwgImEuZCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20gZC5hIGltcG9ydCBiIiwgImEuZCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20geC55IGltcG9ydCAqIiwgImEuYiIpKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2FzX3dpdGhfcGFja2FnZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJpbXBvcnQgYi5jIGFzIGEiLCAiYi5jIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiaW1wb3J0IGEgYXMgZiIsICJmIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiaW1wb3J0IGEgYXMgZiIsICJhIikpCisKKyAgICBkZWYgdGVzdF9mcm9tX2ltcG9ydF9hc193aXRoX3BhY2thZ2Uoc2VsZik6CisgICAgICAgICMgQmVjYXVzZSBpdCB3b3VsZCB0YWtlIGEgbG90IG9mIHNwZWNpYWwtY2FzZSBjb2RlIGluIHRoZSBmaXhlcnMKKyAgICAgICAgIyB0byBkZWFsIHdpdGggZnJvbSBmb28gaW1wb3J0IGJhciBhcyBiYXosIHdlJ2xsIHNpbXBseSBhbHdheXMKKyAgICAgICAgIyBmYWlsIGlmIHRoZXJlIGlzIGFuICJmcm9tIC4uLiBpbXBvcnQgLi4uIGFzIC4uLiIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHggaW1wb3J0IGIgYXMgYSIsICJ4IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSB4IGltcG9ydCBnIGFzIGEsIGQgYXMgYiIsICJ4IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSB4LmIgaW1wb3J0IHQgYXMgYSIsICJ4LmIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHguYiBpbXBvcnQgZyBhcyBhLCBkIiwgInguYiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20gYSBpbXBvcnQgYiBhcyB0IiwgImEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIGEgaW1wb3J0IGIgYXMgdCIsICJiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSBhIGltcG9ydCBiIGFzIHQiLCAidCIpKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb25fZGVmKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZGVmIGEoKTogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZGVmIGEoYiwgYywgZCk6IHBhc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImRlZiBhKCk6IGIgPSA3IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZGVmIGQoYiwgKGMsIGEpLCBlKTogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImRlZiBkKGE9Nyk6IHBhc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJkZWYgZChhKTogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImRlZiBkKCk6IGEgPSA3IikpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZGVmIGQoKToKKyAgICAgICAgICAgICAgICBkZWYgYSgpOgorICAgICAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgIGRlZiB0ZXN0X2NsYXNzX2RlZihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImNsYXNzIGE6IHBhc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImNsYXNzIGEoKTogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiY2xhc3MgYShiKTogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiY2xhc3MgYShiLCBjPTgpOiBwYXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiY2xhc3MgZDogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImNsYXNzIGQoYSk6IHBhc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJjbGFzcyBkKGIsIGE9Nyk6IHBhc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJjbGFzcyBkKGIsICphKTogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImNsYXNzIGQoYiwgKiphKTogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImNsYXNzIGQ6IGEgPSA3IikpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgY2xhc3MgZCgpOgorICAgICAgICAgICAgICAgIGNsYXNzIGEoKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICBkZWYgdGVzdF9mb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmb3IgYSBpbiByOiBwYXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmb3IgYSwgYiBpbiByOiBwYXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmb3IgKGEsIGIpIGluIHI6IHBhc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZvciBjLCAoYSwpIGluIHI6IHBhc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZvciBjLCAoYSwgYikgaW4gcjogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZm9yIGMgaW4gcjogYSA9IGMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmb3IgYyBpbiBhOiBwYXNzIikpCisKKyAgICBkZWYgdGVzdF9mb3JfbmVzdGVkKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBmb3IgYiBpbiByOgorICAgICAgICAgICAgICAgIGZvciBhIGluIGI6CisgICAgICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZm9yIGIgaW4gcjoKKyAgICAgICAgICAgICAgICBmb3IgYSwgYyBpbiBiOgorICAgICAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZvciBiIGluIHI6CisgICAgICAgICAgICAgICAgZm9yIChhLCBjKSBpbiBiOgorICAgICAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZvciBiIGluIHI6CisgICAgICAgICAgICAgICAgZm9yIChhLCkgaW4gYjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBmb3IgYiBpbiByOgorICAgICAgICAgICAgICAgIGZvciBjLCAoYSwgZCkgaW4gYjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBmb3IgYiBpbiByOgorICAgICAgICAgICAgICAgIGZvciBjIGluIGI6CisgICAgICAgICAgICAgICAgICAgIGEgPSA3IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZvciBiIGluIHI6CisgICAgICAgICAgICAgICAgZm9yIGMgaW4gYjoKKyAgICAgICAgICAgICAgICAgICAgZCA9IGEiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZvciBiIGluIHI6CisgICAgICAgICAgICAgICAgZm9yIGMgaW4gYToKKyAgICAgICAgICAgICAgICAgICAgZCA9IDciIiIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgZGVmIHRlc3RfaWYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJpZiBiIGluIHI6IGEgPSBjIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiaWYgYSBpbiByOiBkID0gZSIpKQorCisgICAgZGVmIHRlc3RfaWZfbmVzdGVkKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBpZiBiIGluIHI6CisgICAgICAgICAgICAgICAgaWYgYyBpbiBkOgorICAgICAgICAgICAgICAgICAgICBhID0gYyIiIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBpZiBiIGluIHI6CisgICAgICAgICAgICAgICAgaWYgYyBpbiBkOgorICAgICAgICAgICAgICAgICAgICBjID0gYSIiIgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICBkZWYgdGVzdF93aGlsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgIndoaWxlIGIgaW4gcjogYSA9IGMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJ3aGlsZSBhIGluIHI6IGQgPSBlIikpCisKKyAgICBkZWYgdGVzdF93aGlsZV9uZXN0ZWQoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHdoaWxlIGIgaW4gcjoKKyAgICAgICAgICAgICAgICB3aGlsZSBjIGluIGQ6CisgICAgICAgICAgICAgICAgICAgIGEgPSBjIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHdoaWxlIGIgaW4gcjoKKyAgICAgICAgICAgICAgICB3aGlsZSBjIGluIGQ6CisgICAgICAgICAgICAgICAgICAgIGMgPSBhIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgIGRlZiB0ZXN0X3RyeV9leGNlcHQoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhID0gNgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGIgPSA4IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGEgPSA2IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBhID0gNiIiIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYiA9IDgKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBiID0gNiIiIgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICBkZWYgdGVzdF90cnlfZXhjZXB0X25lc3RlZChzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDYKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBiID0gOCIiIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYiA9IDgKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGEgPSA2CisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgYSA9IDYiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYiA9IDgKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIGEgPSA2CisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYiA9IDgKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIGEgPSA2IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgYyA9IGQKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGIgPSA2CisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICB0ID0gOAorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgbyA9IHkiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgZGVmIHRlc3RfdHJ5X2V4Y2VwdF9maW5hbGx5KHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYyA9IDYKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBhID0gOSIiIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYiA9IDgKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgYSA9IDYiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGIgPSA4CisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYiA9IDgKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBiID0gOQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBiID0gNiIiIgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICBkZWYgdGVzdF90cnlfZXhjZXB0X2ZpbmFsbHlfbmVzdGVkKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYyA9IDYKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGEgPSA5CisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBiID0gOQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGMgPSA5IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBhID0gNiIiIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYiA9IDgKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBiID0gNgorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGIgPSA3IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworY2xhc3MgVGVzdF90b3VjaF9pbXBvcnQoc3VwcG9ydC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hZnRlcl9kb2NzdHJpbmcoc2VsZik6CisgICAgICAgIG5vZGUgPSBwYXJzZSgnIiIiZm9vIiIiXG5iYXIoKScpCisgICAgICAgIGZpeGVyX3V0aWwudG91Y2hfaW1wb3J0KE5vbmUsICJmb28iLCBub2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihub2RlKSwgJyIiImZvbyIiIlxuaW1wb3J0IGZvb1xuYmFyKClcblxuJykKKworICAgIGRlZiB0ZXN0X2FmdGVyX2ltcG9ydHMoc2VsZik6CisgICAgICAgIG5vZGUgPSBwYXJzZSgnIiIiZm9vIiIiXG5pbXBvcnQgYmFyXG5iYXIoKScpCisgICAgICAgIGZpeGVyX3V0aWwudG91Y2hfaW1wb3J0KE5vbmUsICJmb28iLCBub2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihub2RlKSwgJyIiImZvbyIiIlxuaW1wb3J0IGJhclxuaW1wb3J0IGZvb1xuYmFyKClcblxuJykKKworICAgIGRlZiB0ZXN0X2JlZ2lubmluZyhzZWxmKToKKyAgICAgICAgbm9kZSA9IHBhcnNlKCdiYXIoKScpCisgICAgICAgIGZpeGVyX3V0aWwudG91Y2hfaW1wb3J0KE5vbmUsICJmb28iLCBub2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihub2RlKSwgJ2ltcG9ydCBmb29cbmJhcigpXG5cbicpCisKKyAgICBkZWYgdGVzdF9mcm9tX2ltcG9ydChzZWxmKToKKyAgICAgICAgbm9kZSA9IHBhcnNlKCdiYXIoKScpCisgICAgICAgIGZpeGVyX3V0aWwudG91Y2hfaW1wb3J0KCJodG1sIiwgImVzY2FwZSIsIG5vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG5vZGUpLCAnZnJvbSBodG1sIGltcG9ydCBlc2NhcGVcbmJhcigpXG5cbicpCisKKyAgICBkZWYgdGVzdF9uYW1lX2ltcG9ydChzZWxmKToKKyAgICAgICAgbm9kZSA9IHBhcnNlKCdiYXIoKScpCisgICAgICAgIGZpeGVyX3V0aWwudG91Y2hfaW1wb3J0KE5vbmUsICJjZ2kiLCBub2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihub2RlKSwgJ2ltcG9ydCBjZ2lcbmJhcigpXG5cbicpCisKK2NsYXNzIFRlc3RfZmluZF9pbmRlbnRhdGlvbihzdXBwb3J0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X25vdGhpbmcoc2VsZik6CisgICAgICAgIGZpID0gZml4ZXJfdXRpbC5maW5kX2luZGVudGF0aW9uCisgICAgICAgIG5vZGUgPSBwYXJzZSgibm9kZSgpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaShub2RlKSwgdSIiKQorICAgICAgICBub2RlID0gcGFyc2UoIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkobm9kZSksIHUiIikKKworICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgZmkgPSBmaXhlcl91dGlsLmZpbmRfaW5kZW50YXRpb24KKyAgICAgICAgbm9kZSA9IHBhcnNlKCJkZWYgZigpOlxuICAgIHgoKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkobm9kZSksIHUiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaShub2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzRdLmNoaWxkcmVuWzJdKSwgdSIgICAgIikKKyAgICAgICAgbm9kZSA9IHBhcnNlKCJkZWYgZigpOlxuICAgIHgoKVxuICAgIHkoKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkobm9kZS5jaGlsZHJlblswXS5jaGlsZHJlbls0XS5jaGlsZHJlbls0XSksIHUiICAgICIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTcxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMTcxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpbmVjYWNoZS5weSBiL2xpYi9weXRob24yLjcvbGluZWNhY2hlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMWYyN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpbmVjYWNoZS5weQpAQCAtMCwwICsxLDEzNSBAQAorIiIiQ2FjaGUgbGluZXMgZnJvbSBmaWxlcy4KKworVGhpcyBpcyBpbnRlbmRlZCB0byByZWFkIGxpbmVzIGZyb20gbW9kdWxlcyBpbXBvcnRlZCAtLSBoZW5jZSBpZiBhIGZpbGVuYW1lCitpcyBub3QgZm91bmQsIGl0IHdpbGwgbG9vayBkb3duIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGggZm9yIGEgZmlsZSBieQordGhhdCBuYW1lLgorIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworCitfX2FsbF9fID0gWyJnZXRsaW5lIiwgImNsZWFyY2FjaGUiLCAiY2hlY2tjYWNoZSJdCisKK2RlZiBnZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZV9nbG9iYWxzPU5vbmUpOgorICAgIGxpbmVzID0gZ2V0bGluZXMoZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzKQorICAgIGlmIDEgPD0gbGluZW5vIDw9IGxlbihsaW5lcyk6CisgICAgICAgIHJldHVybiBsaW5lc1tsaW5lbm8tMV0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gJycKKworCisjIFRoZSBjYWNoZQorCitjYWNoZSA9IHt9ICMgVGhlIGNhY2hlCisKKworZGVmIGNsZWFyY2FjaGUoKToKKyAgICAiIiJDbGVhciB0aGUgY2FjaGUgZW50aXJlbHkuIiIiCisKKyAgICBnbG9iYWwgY2FjaGUKKyAgICBjYWNoZSA9IHt9CisKKworZGVmIGdldGxpbmVzKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscz1Ob25lKToKKyAgICAiIiJHZXQgdGhlIGxpbmVzIGZvciBhIGZpbGUgZnJvbSB0aGUgY2FjaGUuCisgICAgVXBkYXRlIHRoZSBjYWNoZSBpZiBpdCBkb2Vzbid0IGNvbnRhaW4gYW4gZW50cnkgZm9yIHRoaXMgZmlsZSBhbHJlYWR5LiIiIgorCisgICAgaWYgZmlsZW5hbWUgaW4gY2FjaGU6CisgICAgICAgIHJldHVybiBjYWNoZVtmaWxlbmFtZV1bMl0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gdXBkYXRlY2FjaGUoZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzKQorCisKK2RlZiBjaGVja2NhY2hlKGZpbGVuYW1lPU5vbmUpOgorICAgICIiIkRpc2NhcmQgY2FjaGUgZW50cmllcyB0aGF0IGFyZSBvdXQgb2YgZGF0ZS4KKyAgICAoVGhpcyBpcyBub3QgY2hlY2tlZCB1cG9uIGVhY2ggY2FsbCEpIiIiCisKKyAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICBmaWxlbmFtZXMgPSBjYWNoZS5rZXlzKCkKKyAgICBlbHNlOgorICAgICAgICBpZiBmaWxlbmFtZSBpbiBjYWNoZToKKyAgICAgICAgICAgIGZpbGVuYW1lcyA9IFtmaWxlbmFtZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgc2l6ZSwgbXRpbWUsIGxpbmVzLCBmdWxsbmFtZSA9IGNhY2hlW2ZpbGVuYW1lXQorICAgICAgICBpZiBtdGltZSBpcyBOb25lOgorICAgICAgICAgICAgY29udGludWUgICAjIG5vLW9wIGZvciBmaWxlcyBsb2FkZWQgdmlhIGEgX19sb2FkZXJfXworICAgICAgICB0cnk6CisgICAgICAgICAgICBzdGF0ID0gb3Muc3RhdChmdWxsbmFtZSkKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgZGVsIGNhY2hlW2ZpbGVuYW1lXQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgc2l6ZSAhPSBzdGF0LnN0X3NpemUgb3IgbXRpbWUgIT0gc3RhdC5zdF9tdGltZToKKyAgICAgICAgICAgIGRlbCBjYWNoZVtmaWxlbmFtZV0KKworCitkZWYgdXBkYXRlY2FjaGUoZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzPU5vbmUpOgorICAgICIiIlVwZGF0ZSBhIGNhY2hlIGVudHJ5IGFuZCByZXR1cm4gaXRzIGxpc3Qgb2YgbGluZXMuCisgICAgSWYgc29tZXRoaW5nJ3Mgd3JvbmcsIHByaW50IGEgbWVzc2FnZSwgZGlzY2FyZCB0aGUgY2FjaGUgZW50cnksCisgICAgYW5kIHJldHVybiBhbiBlbXB0eSBsaXN0LiIiIgorCisgICAgaWYgZmlsZW5hbWUgaW4gY2FjaGU6CisgICAgICAgIGRlbCBjYWNoZVtmaWxlbmFtZV0KKyAgICBpZiBub3QgZmlsZW5hbWUgb3IgKGZpbGVuYW1lLnN0YXJ0c3dpdGgoJzwnKSBhbmQgZmlsZW5hbWUuZW5kc3dpdGgoJz4nKSk6CisgICAgICAgIHJldHVybiBbXQorCisgICAgZnVsbG5hbWUgPSBmaWxlbmFtZQorICAgIHRyeToKKyAgICAgICAgc3RhdCA9IG9zLnN0YXQoZnVsbG5hbWUpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIGJhc2VuYW1lID0gZmlsZW5hbWUKKworICAgICAgICAjIFRyeSBmb3IgYSBfX2xvYWRlcl9fLCBpZiBhdmFpbGFibGUKKyAgICAgICAgaWYgbW9kdWxlX2dsb2JhbHMgYW5kICdfX2xvYWRlcl9fJyBpbiBtb2R1bGVfZ2xvYmFsczoKKyAgICAgICAgICAgIG5hbWUgPSBtb2R1bGVfZ2xvYmFscy5nZXQoJ19fbmFtZV9fJykKKyAgICAgICAgICAgIGxvYWRlciA9IG1vZHVsZV9nbG9iYWxzWydfX2xvYWRlcl9fJ10KKyAgICAgICAgICAgIGdldF9zb3VyY2UgPSBnZXRhdHRyKGxvYWRlciwgJ2dldF9zb3VyY2UnLCBOb25lKQorCisgICAgICAgICAgICBpZiBuYW1lIGFuZCBnZXRfc291cmNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGdldF9zb3VyY2UobmFtZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBJT0Vycm9yKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgTm8gbHVjaywgdGhlIFBFUDMwMiBsb2FkZXIgY2Fubm90IGZpbmQgdGhlIHNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3IgdGhpcyBtb2R1bGUuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgICAgICAgICAgICAgY2FjaGVbZmlsZW5hbWVdID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGRhdGEpLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xpbmUrJ1xuJyBmb3IgbGluZSBpbiBkYXRhLnNwbGl0bGluZXMoKV0sIGZ1bGxuYW1lCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlW2ZpbGVuYW1lXVsyXQorCisgICAgICAgICMgVHJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUgbW9kdWxlIHNlYXJjaCBwYXRoLCB3aGljaCBpcyBvbmx5IHVzZWZ1bAorICAgICAgICAjIHdoZW4gaGFuZGxpbmcgYSByZWxhdGl2ZSBmaWxlbmFtZS4KKyAgICAgICAgaWYgb3MucGF0aC5pc2FicyhmaWxlbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICBmb3IgZGlybmFtZSBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgICMgV2hlbiB1c2luZyBpbXB1dGlsLCBzeXMucGF0aCBtYXkgY29udGFpbiB0aGluZ3Mgb3RoZXIgdGhhbgorICAgICAgICAgICAgIyBzdHJpbmdzOyBpZ25vcmUgdGhlbSB3aGVuIGl0IGhhcHBlbnMuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgYmFzZW5hbWUpCisgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgICAgICMgTm90IHN1ZmZpY2llbnRseSBzdHJpbmctbGlrZSB0byBkbyBhbnl0aGluZyB1c2VmdWwgd2l0aC4KKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN0YXQgPSBvcy5zdGF0KGZ1bGxuYW1lKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgdHJ5OgorICAgICAgICB3aXRoIG9wZW4oZnVsbG5hbWUsICdyVScpIGFzIGZwOgorICAgICAgICAgICAgbGluZXMgPSBmcC5yZWFkbGluZXMoKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICByZXR1cm4gW10KKyAgICBpZiBsaW5lcyBhbmQgbm90IGxpbmVzWy0xXS5lbmRzd2l0aCgnXG4nKToKKyAgICAgICAgbGluZXNbLTFdICs9ICdcbicKKyAgICBzaXplLCBtdGltZSA9IHN0YXQuc3Rfc2l6ZSwgc3RhdC5zdF9tdGltZQorICAgIGNhY2hlW2ZpbGVuYW1lXSA9IHNpemUsIG10aW1lLCBsaW5lcywgZnVsbG5hbWUKKyAgICByZXR1cm4gbGluZXMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGluZWNhY2hlLnB5YyBiL2xpYi9weXRob24yLjcvbGluZWNhY2hlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI5Y2E5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saW5lY2FjaGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGluZWNhY2hlLnB5byBiL2xpYi9weXRob24yLjcvbGluZWNhY2hlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI5Y2E5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saW5lY2FjaGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbG9jYWxlLnB5IGIvbGliL3B5dGhvbjIuNy9sb2NhbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkZmRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbG9jYWxlLnB5CkBAIC0wLDAgKzEsMTg4MiBAQAorIiIiIExvY2FsZSBzdXBwb3J0LgorCisgICAgVGhlIG1vZHVsZSBwcm92aWRlcyBsb3ctbGV2ZWwgYWNjZXNzIHRvIHRoZSBDIGxpYidzIGxvY2FsZSBBUElzCisgICAgYW5kIGFkZHMgaGlnaCBsZXZlbCBudW1iZXIgZm9ybWF0dGluZyBBUElzIGFzIHdlbGwgYXMgYSBsb2NhbGUKKyAgICBhbGlhc2luZyBlbmdpbmUgdG8gY29tcGxlbWVudCB0aGVzZS4KKworICAgIFRoZSBhbGlhc2luZyBlbmdpbmUgaW5jbHVkZXMgc3VwcG9ydCBmb3IgbWFueSBjb21tb25seSB1c2VkIGxvY2FsZQorICAgIG5hbWVzIGFuZCBtYXBzIHRoZW0gdG8gdmFsdWVzIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIHRoZSBDIGxpYidzCisgICAgc2V0bG9jYWxlKCkgZnVuY3Rpb24uIEl0IGFsc28gaW5jbHVkZXMgZGVmYXVsdCBlbmNvZGluZ3MgZm9yIGFsbAorICAgIHN1cHBvcnRlZCBsb2NhbGUgbmFtZXMuCisKKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgZW5jb2RpbmdzCitpbXBvcnQgZW5jb2RpbmdzLmFsaWFzZXMKK2ltcG9ydCByZQoraW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgZnVuY3Rvb2xzCisKK3RyeToKKyAgICBfdW5pY29kZSA9IHVuaWNvZGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgIyBJZiBQeXRob24gaXMgYnVpbHQgd2l0aG91dCBVbmljb2RlIHN1cHBvcnQsIHRoZSB1bmljb2RlIHR5cGUKKyAgICAjIHdpbGwgbm90IGV4aXN0LiBGYWtlIG9uZS4KKyAgICBjbGFzcyBfdW5pY29kZShvYmplY3QpOgorICAgICAgICBwYXNzCisKKyMgVHJ5IGltcG9ydGluZyB0aGUgX2xvY2FsZSBtb2R1bGUuCisjCisjIElmIHRoaXMgZmFpbHMsIGZhbGwgYmFjayBvbiBhIGJhc2ljICdDJyBsb2NhbGUgZW11bGF0aW9uLgorCisjIFl1Y2s6ICBMQ19NRVNTQUdFUyBpcyBub24tc3RhbmRhcmQ6ICBjYW4ndCB0ZWxsIHdoZXRoZXIgaXQgZXhpc3RzIGJlZm9yZQorIyB0cnlpbmcgdGhlIGltcG9ydC4gIFNvIF9fYWxsX18gaXMgYWxzbyBmaWRkbGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuCitfX2FsbF9fID0gWyJnZXRsb2NhbGUiLCAiZ2V0ZGVmYXVsdGxvY2FsZSIsICJnZXRwcmVmZXJyZWRlbmNvZGluZyIsICJFcnJvciIsCisgICAgICAgICAgICJzZXRsb2NhbGUiLCAicmVzZXRsb2NhbGUiLCAibG9jYWxlY29udiIsICJzdHJjb2xsIiwgInN0cnhmcm0iLAorICAgICAgICAgICAic3RyIiwgImF0b2YiLCAiYXRvaSIsICJmb3JtYXQiLCAiZm9ybWF0X3N0cmluZyIsICJjdXJyZW5jeSIsCisgICAgICAgICAgICJub3JtYWxpemUiLCAiTENfQ1RZUEUiLCAiTENfQ09MTEFURSIsICJMQ19USU1FIiwgIkxDX01PTkVUQVJZIiwKKyAgICAgICAgICAgIkxDX05VTUVSSUMiLCAiTENfQUxMIiwgIkNIQVJfTUFYIl0KKwordHJ5OgorCisgICAgZnJvbSBfbG9jYWxlIGltcG9ydCAqCisKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKworICAgICMgTG9jYWxlIGVtdWxhdGlvbgorCisgICAgQ0hBUl9NQVggPSAxMjcKKyAgICBMQ19BTEwgPSA2CisgICAgTENfQ09MTEFURSA9IDMKKyAgICBMQ19DVFlQRSA9IDAKKyAgICBMQ19NRVNTQUdFUyA9IDUKKyAgICBMQ19NT05FVEFSWSA9IDQKKyAgICBMQ19OVU1FUklDID0gMQorICAgIExDX1RJTUUgPSAyCisgICAgRXJyb3IgPSBWYWx1ZUVycm9yCisKKyAgICBkZWYgbG9jYWxlY29udigpOgorICAgICAgICAiIiIgbG9jYWxlY29udigpIC0+IGRpY3QuCisgICAgICAgICAgICBSZXR1cm5zIG51bWVyaWMgYW5kIG1vbmV0YXJ5IGxvY2FsZS1zcGVjaWZpYyBwYXJhbWV0ZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgIyAnQycgbG9jYWxlIGRlZmF1bHQgdmFsdWVzCisgICAgICAgIHJldHVybiB7J2dyb3VwaW5nJzogWzEyN10sCisgICAgICAgICAgICAgICAgJ2N1cnJlbmN5X3N5bWJvbCc6ICcnLAorICAgICAgICAgICAgICAgICduX3NpZ25fcG9zbic6IDEyNywKKyAgICAgICAgICAgICAgICAncF9jc19wcmVjZWRlcyc6IDEyNywKKyAgICAgICAgICAgICAgICAnbl9jc19wcmVjZWRlcyc6IDEyNywKKyAgICAgICAgICAgICAgICAnbW9uX2dyb3VwaW5nJzogW10sCisgICAgICAgICAgICAgICAgJ25fc2VwX2J5X3NwYWNlJzogMTI3LAorICAgICAgICAgICAgICAgICdkZWNpbWFsX3BvaW50JzogJy4nLAorICAgICAgICAgICAgICAgICduZWdhdGl2ZV9zaWduJzogJycsCisgICAgICAgICAgICAgICAgJ3Bvc2l0aXZlX3NpZ24nOiAnJywKKyAgICAgICAgICAgICAgICAncF9zZXBfYnlfc3BhY2UnOiAxMjcsCisgICAgICAgICAgICAgICAgJ2ludF9jdXJyX3N5bWJvbCc6ICcnLAorICAgICAgICAgICAgICAgICdwX3NpZ25fcG9zbic6IDEyNywKKyAgICAgICAgICAgICAgICAndGhvdXNhbmRzX3NlcCc6ICcnLAorICAgICAgICAgICAgICAgICdtb25fdGhvdXNhbmRzX3NlcCc6ICcnLAorICAgICAgICAgICAgICAgICdmcmFjX2RpZ2l0cyc6IDEyNywKKyAgICAgICAgICAgICAgICAnbW9uX2RlY2ltYWxfcG9pbnQnOiAnJywKKyAgICAgICAgICAgICAgICAnaW50X2ZyYWNfZGlnaXRzJzogMTI3fQorCisgICAgZGVmIHNldGxvY2FsZShjYXRlZ29yeSwgdmFsdWU9Tm9uZSk6CisgICAgICAgICIiIiBzZXRsb2NhbGUoaW50ZWdlcixzdHJpbmc9Tm9uZSkgLT4gc3RyaW5nLgorICAgICAgICAgICAgQWN0aXZhdGVzL3F1ZXJpZXMgbG9jYWxlIHByb2Nlc3NpbmcuCisgICAgICAgICIiIgorICAgICAgICBpZiB2YWx1ZSBub3QgaW4gKE5vbmUsICcnLCAnQycpOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdfbG9jYWxlIGVtdWxhdGlvbiBvbmx5IHN1cHBvcnRzICJDIiBsb2NhbGUnCisgICAgICAgIHJldHVybiAnQycKKworICAgIGRlZiBzdHJjb2xsKGEsYik6CisgICAgICAgICIiIiBzdHJjb2xsKHN0cmluZyxzdHJpbmcpIC0+IGludC4KKyAgICAgICAgICAgIENvbXBhcmVzIHR3byBzdHJpbmdzIGFjY29yZGluZyB0byB0aGUgbG9jYWxlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGNtcChhLGIpCisKKyAgICBkZWYgc3RyeGZybShzKToKKyAgICAgICAgIiIiIHN0cnhmcm0oc3RyaW5nKSAtPiBzdHJpbmcuCisgICAgICAgICAgICBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgYmVoYXZlcyBmb3IgY21wIGxvY2FsZS1hd2FyZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzCisKKworX2xvY2FsZWNvbnYgPSBsb2NhbGVjb252CisKKyMgV2l0aCB0aGlzIGRpY3QsIHlvdSBjYW4gb3ZlcnJpZGUgc29tZSBpdGVtcyBvZiBsb2NhbGVjb252J3MgcmV0dXJuIHZhbHVlLgorIyBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KK19vdmVycmlkZV9sb2NhbGVjb252ID0ge30KKworQGZ1bmN0b29scy53cmFwcyhfbG9jYWxlY29udikKK2RlZiBsb2NhbGVjb252KCk6CisgICAgZCA9IF9sb2NhbGVjb252KCkKKyAgICBpZiBfb3ZlcnJpZGVfbG9jYWxlY29udjoKKyAgICAgICAgZC51cGRhdGUoX292ZXJyaWRlX2xvY2FsZWNvbnYpCisgICAgcmV0dXJuIGQKKworCisjIyMgTnVtYmVyIGZvcm1hdHRpbmcgQVBJcworCisjIEF1dGhvcjogTWFydGluIHZvbiBMb2V3aXMKKyMgaW1wcm92ZWQgYnkgR2VvcmcgQnJhbmRsCisKKyMgSXRlcmF0ZSBvdmVyIGdyb3VwaW5nIGludGVydmFscworZGVmIF9ncm91cGluZ19pbnRlcnZhbHMoZ3JvdXBpbmcpOgorICAgIGxhc3RfaW50ZXJ2YWwgPSBOb25lCisgICAgZm9yIGludGVydmFsIGluIGdyb3VwaW5nOgorICAgICAgICAjIGlmIGdyb3VwaW5nIGlzIC0xLCB3ZSBhcmUgZG9uZQorICAgICAgICBpZiBpbnRlcnZhbCA9PSBDSEFSX01BWDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIDA6IHJlLXVzZSBsYXN0IGdyb3VwIGFkIGluZmluaXR1bQorICAgICAgICBpZiBpbnRlcnZhbCA9PSAwOgorICAgICAgICAgICAgaWYgbGFzdF9pbnRlcnZhbCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgZ3JvdXBpbmciKQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB5aWVsZCBsYXN0X2ludGVydmFsCisgICAgICAgIHlpZWxkIGludGVydmFsCisgICAgICAgIGxhc3RfaW50ZXJ2YWwgPSBpbnRlcnZhbAorCisjcGVyZm9ybSB0aGUgZ3JvdXBpbmcgZnJvbSByaWdodCB0byBsZWZ0CitkZWYgX2dyb3VwKHMsIG1vbmV0YXJ5PUZhbHNlKToKKyAgICBjb252ID0gbG9jYWxlY29udigpCisgICAgdGhvdXNhbmRzX3NlcCA9IGNvbnZbbW9uZXRhcnkgYW5kICdtb25fdGhvdXNhbmRzX3NlcCcgb3IgJ3Rob3VzYW5kc19zZXAnXQorICAgIGdyb3VwaW5nID0gY29udlttb25ldGFyeSBhbmQgJ21vbl9ncm91cGluZycgb3IgJ2dyb3VwaW5nJ10KKyAgICBpZiBub3QgZ3JvdXBpbmc6CisgICAgICAgIHJldHVybiAocywgMCkKKyAgICBpZiBzWy0xXSA9PSAnICc6CisgICAgICAgIHN0cmlwcGVkID0gcy5yc3RyaXAoKQorICAgICAgICByaWdodF9zcGFjZXMgPSBzW2xlbihzdHJpcHBlZCk6XQorICAgICAgICBzID0gc3RyaXBwZWQKKyAgICBlbHNlOgorICAgICAgICByaWdodF9zcGFjZXMgPSAnJworICAgIGxlZnRfc3BhY2VzID0gJycKKyAgICBncm91cHMgPSBbXQorICAgIGZvciBpbnRlcnZhbCBpbiBfZ3JvdXBpbmdfaW50ZXJ2YWxzKGdyb3VwaW5nKToKKyAgICAgICAgaWYgbm90IHMgb3Igc1stMV0gbm90IGluICIwMTIzNDU2Nzg5IjoKKyAgICAgICAgICAgICMgb25seSBub24tZGlnaXQgY2hhcmFjdGVycyByZW1haW4gKHNpZ24sIHNwYWNlcykKKyAgICAgICAgICAgIGxlZnRfc3BhY2VzID0gcworICAgICAgICAgICAgcyA9ICcnCisgICAgICAgICAgICBicmVhaworICAgICAgICBncm91cHMuYXBwZW5kKHNbLWludGVydmFsOl0pCisgICAgICAgIHMgPSBzWzotaW50ZXJ2YWxdCisgICAgaWYgczoKKyAgICAgICAgZ3JvdXBzLmFwcGVuZChzKQorICAgIGdyb3Vwcy5yZXZlcnNlKCkKKyAgICByZXR1cm4gKAorICAgICAgICBsZWZ0X3NwYWNlcyArIHRob3VzYW5kc19zZXAuam9pbihncm91cHMpICsgcmlnaHRfc3BhY2VzLAorICAgICAgICBsZW4odGhvdXNhbmRzX3NlcCkgKiAobGVuKGdyb3VwcykgLSAxKQorICAgICkKKworIyBTdHJpcCBhIGdpdmVuIGFtb3VudCBvZiBleGNlc3MgcGFkZGluZyBmcm9tIHRoZSBnaXZlbiBzdHJpbmcKK2RlZiBfc3RyaXBfcGFkZGluZyhzLCBhbW91bnQpOgorICAgIGxwb3MgPSAwCisgICAgd2hpbGUgYW1vdW50IGFuZCBzW2xwb3NdID09ICcgJzoKKyAgICAgICAgbHBvcyArPSAxCisgICAgICAgIGFtb3VudCAtPSAxCisgICAgcnBvcyA9IGxlbihzKSAtIDEKKyAgICB3aGlsZSBhbW91bnQgYW5kIHNbcnBvc10gPT0gJyAnOgorICAgICAgICBycG9zIC09IDEKKyAgICAgICAgYW1vdW50IC09IDEKKyAgICByZXR1cm4gc1tscG9zOnJwb3MrMV0KKworX3BlcmNlbnRfcmUgPSByZS5jb21waWxlKHInJSg/OlwoKD9QPGtleT4uKj8pXCkpPycKKyAgICAgICAgICAgICAgICAgICAgICAgICByJyg/UDxtb2RpZmllcnM+Wy0jMC05ICsqLmhsTF0qPylbZUVmRmdHZGlvdXhYY3JzJV0nKQorCitkZWYgZm9ybWF0KHBlcmNlbnQsIHZhbHVlLCBncm91cGluZz1GYWxzZSwgbW9uZXRhcnk9RmFsc2UsICphZGRpdGlvbmFsKToKKyAgICAiIiJSZXR1cm5zIHRoZSBsb2NhbGUtYXdhcmUgc3Vic3RpdHV0aW9uIG9mIGEgJT8gc3BlY2lmaWVyCisgICAgKHBlcmNlbnQpLgorCisgICAgYWRkaXRpb25hbCBpcyBmb3IgZm9ybWF0IHN0cmluZ3Mgd2hpY2ggY29udGFpbiBvbmUgb3IgbW9yZQorICAgICcqJyBtb2RpZmllcnMuIiIiCisgICAgIyB0aGlzIGlzIG9ubHkgZm9yIG9uZS1wZXJjZW50LXNwZWNpZmllciBzdHJpbmdzIGFuZCB0aGlzIHNob3VsZCBiZSBjaGVja2VkCisgICAgbWF0Y2ggPSBfcGVyY2VudF9yZS5tYXRjaChwZXJjZW50KQorICAgIGlmIG5vdCBtYXRjaCBvciBsZW4obWF0Y2guZ3JvdXAoKSkhPSBsZW4ocGVyY2VudCk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoKCJmb3JtYXQoKSBtdXN0IGJlIGdpdmVuIGV4YWN0bHkgb25lICUlY2hhciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCBzcGVjaWZpZXIsICVzIG5vdCB2YWxpZCIpICUgcmVwcihwZXJjZW50KSkKKyAgICByZXR1cm4gX2Zvcm1hdChwZXJjZW50LCB2YWx1ZSwgZ3JvdXBpbmcsIG1vbmV0YXJ5LCAqYWRkaXRpb25hbCkKKworZGVmIF9mb3JtYXQocGVyY2VudCwgdmFsdWUsIGdyb3VwaW5nPUZhbHNlLCBtb25ldGFyeT1GYWxzZSwgKmFkZGl0aW9uYWwpOgorICAgIGlmIGFkZGl0aW9uYWw6CisgICAgICAgIGZvcm1hdHRlZCA9IHBlcmNlbnQgJSAoKHZhbHVlLCkgKyBhZGRpdGlvbmFsKQorICAgIGVsc2U6CisgICAgICAgIGZvcm1hdHRlZCA9IHBlcmNlbnQgJSB2YWx1ZQorICAgICMgZmxvYXRzIGFuZCBkZWNpbWFsIGludHMgbmVlZCBzcGVjaWFsIGFjdGlvbiEKKyAgICBpZiBwZXJjZW50Wy0xXSBpbiAnZUVmRmdHJzoKKyAgICAgICAgc2VwcyA9IDAKKyAgICAgICAgcGFydHMgPSBmb3JtYXR0ZWQuc3BsaXQoJy4nKQorICAgICAgICBpZiBncm91cGluZzoKKyAgICAgICAgICAgIHBhcnRzWzBdLCBzZXBzID0gX2dyb3VwKHBhcnRzWzBdLCBtb25ldGFyeT1tb25ldGFyeSkKKyAgICAgICAgZGVjaW1hbF9wb2ludCA9IGxvY2FsZWNvbnYoKVttb25ldGFyeSBhbmQgJ21vbl9kZWNpbWFsX3BvaW50JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yICdkZWNpbWFsX3BvaW50J10KKyAgICAgICAgZm9ybWF0dGVkID0gZGVjaW1hbF9wb2ludC5qb2luKHBhcnRzKQorICAgICAgICBpZiBzZXBzOgorICAgICAgICAgICAgZm9ybWF0dGVkID0gX3N0cmlwX3BhZGRpbmcoZm9ybWF0dGVkLCBzZXBzKQorICAgIGVsaWYgcGVyY2VudFstMV0gaW4gJ2RpdSc6CisgICAgICAgIHNlcHMgPSAwCisgICAgICAgIGlmIGdyb3VwaW5nOgorICAgICAgICAgICAgZm9ybWF0dGVkLCBzZXBzID0gX2dyb3VwKGZvcm1hdHRlZCwgbW9uZXRhcnk9bW9uZXRhcnkpCisgICAgICAgIGlmIHNlcHM6CisgICAgICAgICAgICBmb3JtYXR0ZWQgPSBfc3RyaXBfcGFkZGluZyhmb3JtYXR0ZWQsIHNlcHMpCisgICAgcmV0dXJuIGZvcm1hdHRlZAorCitkZWYgZm9ybWF0X3N0cmluZyhmLCB2YWwsIGdyb3VwaW5nPUZhbHNlKToKKyAgICAiIiJGb3JtYXRzIGEgc3RyaW5nIGluIHRoZSBzYW1lIHdheSB0aGF0IHRoZSAlIGZvcm1hdHRpbmcgd291bGQgdXNlLAorICAgIGJ1dCB0YWtlcyB0aGUgY3VycmVudCBsb2NhbGUgaW50byBhY2NvdW50LgorICAgIEdyb3VwaW5nIGlzIGFwcGxpZWQgaWYgdGhlIHRoaXJkIHBhcmFtZXRlciBpcyB0cnVlLiIiIgorICAgIHBlcmNlbnRzID0gbGlzdChfcGVyY2VudF9yZS5maW5kaXRlcihmKSkKKyAgICBuZXdfZiA9IF9wZXJjZW50X3JlLnN1YignJXMnLCBmKQorCisgICAgaWYgb3BlcmF0b3IuaXNNYXBwaW5nVHlwZSh2YWwpOgorICAgICAgICBuZXdfdmFsID0gW10KKyAgICAgICAgZm9yIHBlcmMgaW4gcGVyY2VudHM6CisgICAgICAgICAgICBpZiBwZXJjLmdyb3VwKClbLTFdPT0nJSc6CisgICAgICAgICAgICAgICAgbmV3X3ZhbC5hcHBlbmQoJyUnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdfdmFsLmFwcGVuZChmb3JtYXQocGVyYy5ncm91cCgpLCB2YWwsIGdyb3VwaW5nKSkKKyAgICBlbHNlOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWwsIHR1cGxlKToKKyAgICAgICAgICAgIHZhbCA9ICh2YWwsKQorICAgICAgICBuZXdfdmFsID0gW10KKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIHBlcmMgaW4gcGVyY2VudHM6CisgICAgICAgICAgICBpZiBwZXJjLmdyb3VwKClbLTFdPT0nJSc6CisgICAgICAgICAgICAgICAgbmV3X3ZhbC5hcHBlbmQoJyUnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGFyY291bnQgPSBwZXJjLmdyb3VwKCdtb2RpZmllcnMnKS5jb3VudCgnKicpCisgICAgICAgICAgICAgICAgbmV3X3ZhbC5hcHBlbmQoX2Zvcm1hdChwZXJjLmdyb3VwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdmFsW2krMTppKzErc3RhcmNvdW50XSkpCisgICAgICAgICAgICAgICAgaSArPSAoMSArIHN0YXJjb3VudCkKKyAgICB2YWwgPSB0dXBsZShuZXdfdmFsKQorCisgICAgcmV0dXJuIG5ld19mICUgdmFsCisKK2RlZiBjdXJyZW5jeSh2YWwsIHN5bWJvbD1UcnVlLCBncm91cGluZz1GYWxzZSwgaW50ZXJuYXRpb25hbD1GYWxzZSk6CisgICAgIiIiRm9ybWF0cyB2YWwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW5jeSBzZXR0aW5ncworICAgIGluIHRoZSBjdXJyZW50IGxvY2FsZS4iIiIKKyAgICBjb252ID0gbG9jYWxlY29udigpCisKKyAgICAjIGNoZWNrIGZvciBpbGxlZ2FsIHZhbHVlcworICAgIGRpZ2l0cyA9IGNvbnZbaW50ZXJuYXRpb25hbCBhbmQgJ2ludF9mcmFjX2RpZ2l0cycgb3IgJ2ZyYWNfZGlnaXRzJ10KKyAgICBpZiBkaWdpdHMgPT0gMTI3OgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDdXJyZW5jeSBmb3JtYXR0aW5nIGlzIG5vdCBwb3NzaWJsZSB1c2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSAnQycgbG9jYWxlLiIpCisKKyAgICBzID0gZm9ybWF0KCclJS4laWYnICUgZGlnaXRzLCBhYnModmFsKSwgZ3JvdXBpbmcsIG1vbmV0YXJ5PVRydWUpCisgICAgIyAnPCcgYW5kICc+JyBhcmUgbWFya2VycyBpZiB0aGUgc2lnbiBtdXN0IGJlIGluc2VydGVkIGJldHdlZW4gc3ltYm9sIGFuZCB2YWx1ZQorICAgIHMgPSAnPCcgKyBzICsgJz4nCisKKyAgICBpZiBzeW1ib2w6CisgICAgICAgIHNtYiA9IGNvbnZbaW50ZXJuYXRpb25hbCBhbmQgJ2ludF9jdXJyX3N5bWJvbCcgb3IgJ2N1cnJlbmN5X3N5bWJvbCddCisgICAgICAgIHByZWNlZGVzID0gY29udlt2YWw8MCBhbmQgJ25fY3NfcHJlY2VkZXMnIG9yICdwX2NzX3ByZWNlZGVzJ10KKyAgICAgICAgc2VwYXJhdGVkID0gY29udlt2YWw8MCBhbmQgJ25fc2VwX2J5X3NwYWNlJyBvciAncF9zZXBfYnlfc3BhY2UnXQorCisgICAgICAgIGlmIHByZWNlZGVzOgorICAgICAgICAgICAgcyA9IHNtYiArIChzZXBhcmF0ZWQgYW5kICcgJyBvciAnJykgKyBzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzID0gcyArIChzZXBhcmF0ZWQgYW5kICcgJyBvciAnJykgKyBzbWIKKworICAgIHNpZ25fcG9zID0gY29udlt2YWw8MCBhbmQgJ25fc2lnbl9wb3NuJyBvciAncF9zaWduX3Bvc24nXQorICAgIHNpZ24gPSBjb252W3ZhbDwwIGFuZCAnbmVnYXRpdmVfc2lnbicgb3IgJ3Bvc2l0aXZlX3NpZ24nXQorCisgICAgaWYgc2lnbl9wb3MgPT0gMDoKKyAgICAgICAgcyA9ICcoJyArIHMgKyAnKScKKyAgICBlbGlmIHNpZ25fcG9zID09IDE6CisgICAgICAgIHMgPSBzaWduICsgcworICAgIGVsaWYgc2lnbl9wb3MgPT0gMjoKKyAgICAgICAgcyA9IHMgKyBzaWduCisgICAgZWxpZiBzaWduX3BvcyA9PSAzOgorICAgICAgICBzID0gcy5yZXBsYWNlKCc8Jywgc2lnbikKKyAgICBlbGlmIHNpZ25fcG9zID09IDQ6CisgICAgICAgIHMgPSBzLnJlcGxhY2UoJz4nLCBzaWduKQorICAgIGVsc2U6CisgICAgICAgICMgdGhlIGRlZmF1bHQgaWYgbm90aGluZyBzcGVjaWZpZWQ7CisgICAgICAgICMgdGhpcyBzaG91bGQgYmUgdGhlIG1vc3QgZml0dGluZyBzaWduIHBvc2l0aW9uCisgICAgICAgIHMgPSBzaWduICsgcworCisgICAgcmV0dXJuIHMucmVwbGFjZSgnPCcsICcnKS5yZXBsYWNlKCc+JywgJycpCisKK2RlZiBzdHIodmFsKToKKyAgICAiIiJDb252ZXJ0IGZsb2F0IHRvIGludGVnZXIsIHRha2luZyB0aGUgbG9jYWxlIGludG8gYWNjb3VudC4iIiIKKyAgICByZXR1cm4gZm9ybWF0KCIlLjEyZyIsIHZhbCkKKworZGVmIGF0b2Yoc3RyaW5nLCBmdW5jPWZsb2F0KToKKyAgICAiUGFyc2VzIGEgc3RyaW5nIGFzIGEgZmxvYXQgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGUgc2V0dGluZ3MuIgorICAgICNGaXJzdCwgZ2V0IHJpZCBvZiB0aGUgZ3JvdXBpbmcKKyAgICB0cyA9IGxvY2FsZWNvbnYoKVsndGhvdXNhbmRzX3NlcCddCisgICAgaWYgdHM6CisgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHRzLCAnJykKKyAgICAjbmV4dCwgcmVwbGFjZSB0aGUgZGVjaW1hbCBwb2ludCB3aXRoIGEgZG90CisgICAgZGQgPSBsb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXQorICAgIGlmIGRkOgorICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShkZCwgJy4nKQorICAgICNmaW5hbGx5LCBwYXJzZSB0aGUgc3RyaW5nCisgICAgcmV0dXJuIGZ1bmMoc3RyaW5nKQorCitkZWYgYXRvaShzdHIpOgorICAgICJDb252ZXJ0cyBhIHN0cmluZyB0byBhbiBpbnRlZ2VyIGFjY29yZGluZyB0byB0aGUgbG9jYWxlIHNldHRpbmdzLiIKKyAgICByZXR1cm4gYXRvZihzdHIsIGludCkKKworZGVmIF90ZXN0KCk6CisgICAgc2V0bG9jYWxlKExDX0FMTCwgIiIpCisgICAgI2RvIGdyb3VwaW5nCisgICAgczEgPSBmb3JtYXQoIiVkIiwgMTIzNDU2Nzg5LDEpCisgICAgcHJpbnQgczEsICJpcyIsIGF0b2koczEpCisgICAgI3N0YW5kYXJkIGZvcm1hdHRpbmcKKyAgICBzMSA9IHN0cigzLjE0KQorICAgIHByaW50IHMxLCAiaXMiLCBhdG9mKHMxKQorCisjIyMgTG9jYWxlIG5hbWUgYWxpYXNpbmcgZW5naW5lCisKKyMgQXV0aG9yOiBNYXJjLUFuZHJlIExlbWJ1cmcsIG1hbEBsZW1idXJnLmNvbQorIyBWYXJpb3VzIHR3ZWFrcyBieSBGcmVkcmlrIEx1bmRoIDxmcmVkcmlrQHB5dGhvbndhcmUuY29tPgorCisjIHN0b3JlIGF3YXkgdGhlIGxvdy1sZXZlbCB2ZXJzaW9uIG9mIHNldGxvY2FsZSAoaXQncworIyBvdmVycmlkZGVuIGJlbG93KQorX3NldGxvY2FsZSA9IHNldGxvY2FsZQorCisjIEF2b2lkIHJlbHlpbmcgb24gdGhlIGxvY2FsZS1kZXBlbmRlbnQgLmxvd2VyKCkgbWV0aG9kCisjIChzZWUgaXNzdWUgIzE4MTMpLgorX2FzY2lpX2xvd2VyX21hcCA9ICcnLmpvaW4oCisgICAgY2hyKHggKyAzMiBpZiB4ID49IG9yZCgnQScpIGFuZCB4IDw9IG9yZCgnWicpIGVsc2UgeCkKKyAgICBmb3IgeCBpbiByYW5nZSgyNTYpCispCisKK2RlZiBub3JtYWxpemUobG9jYWxlbmFtZSk6CisKKyAgICAiIiIgUmV0dXJucyBhIG5vcm1hbGl6ZWQgbG9jYWxlIGNvZGUgZm9yIHRoZSBnaXZlbiBsb2NhbGUKKyAgICAgICAgbmFtZS4KKworICAgICAgICBUaGUgcmV0dXJuZWQgbG9jYWxlIGNvZGUgaXMgZm9ybWF0dGVkIGZvciB1c2Ugd2l0aAorICAgICAgICBzZXRsb2NhbGUoKS4KKworICAgICAgICBJZiBub3JtYWxpemF0aW9uIGZhaWxzLCB0aGUgb3JpZ2luYWwgbmFtZSBpcyByZXR1cm5lZAorICAgICAgICB1bmNoYW5nZWQuCisKKyAgICAgICAgSWYgdGhlIGdpdmVuIGVuY29kaW5nIGlzIG5vdCBrbm93biwgdGhlIGZ1bmN0aW9uIGRlZmF1bHRzIHRvCisgICAgICAgIHRoZSBkZWZhdWx0IGVuY29kaW5nIGZvciB0aGUgbG9jYWxlIGNvZGUganVzdCBsaWtlIHNldGxvY2FsZSgpCisgICAgICAgIGRvZXMuCisKKyAgICAiIiIKKyAgICAjIE5vcm1hbGl6ZSB0aGUgbG9jYWxlIG5hbWUgYW5kIGV4dHJhY3QgdGhlIGVuY29kaW5nCisgICAgaWYgaXNpbnN0YW5jZShsb2NhbGVuYW1lLCBfdW5pY29kZSk6CisgICAgICAgIGxvY2FsZW5hbWUgPSBsb2NhbGVuYW1lLmVuY29kZSgnYXNjaWknKQorICAgIGZ1bGxuYW1lID0gbG9jYWxlbmFtZS50cmFuc2xhdGUoX2FzY2lpX2xvd2VyX21hcCkKKyAgICBpZiAnOicgaW4gZnVsbG5hbWU6CisgICAgICAgICMgJzonIGlzIHNvbWV0aW1lcyB1c2VkIGFzIGVuY29kaW5nIGRlbGltaXRlci4KKyAgICAgICAgZnVsbG5hbWUgPSBmdWxsbmFtZS5yZXBsYWNlKCc6JywgJy4nKQorICAgIGlmICcuJyBpbiBmdWxsbmFtZToKKyAgICAgICAgbGFuZ25hbWUsIGVuY29kaW5nID0gZnVsbG5hbWUuc3BsaXQoJy4nKVs6Ml0KKyAgICAgICAgZnVsbG5hbWUgPSBsYW5nbmFtZSArICcuJyArIGVuY29kaW5nCisgICAgZWxzZToKKyAgICAgICAgbGFuZ25hbWUgPSBmdWxsbmFtZQorICAgICAgICBlbmNvZGluZyA9ICcnCisKKyAgICAjIEZpcnN0IGxvb2t1cDogZnVsbG5hbWUgKHBvc3NpYmx5IHdpdGggZW5jb2RpbmcpCisgICAgbm9ybV9lbmNvZGluZyA9IGVuY29kaW5nLnJlcGxhY2UoJy0nLCAnJykKKyAgICBub3JtX2VuY29kaW5nID0gbm9ybV9lbmNvZGluZy5yZXBsYWNlKCdfJywgJycpCisgICAgbG9va3VwX25hbWUgPSBsYW5nbmFtZSArICcuJyArIGVuY29kaW5nCisgICAgY29kZSA9IGxvY2FsZV9hbGlhcy5nZXQobG9va3VwX25hbWUsIE5vbmUpCisgICAgaWYgY29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIGNvZGUKKyAgICAjcHJpbnQgJ2ZpcnN0IGxvb2t1cCBmYWlsZWQnCisKKyAgICAjIFNlY29uZCB0cnk6IGxhbmduYW1lICh3aXRob3V0IGVuY29kaW5nKQorICAgIGNvZGUgPSBsb2NhbGVfYWxpYXMuZ2V0KGxhbmduYW1lLCBOb25lKQorICAgIGlmIGNvZGUgaXMgbm90IE5vbmU6CisgICAgICAgICNwcmludCAnbGFuZ25hbWUgbG9va3VwIHN1Y2NlZWRlZCcKKyAgICAgICAgaWYgJy4nIGluIGNvZGU6CisgICAgICAgICAgICBsYW5nbmFtZSwgZGVmZW5jID0gY29kZS5zcGxpdCgnLicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYW5nbmFtZSA9IGNvZGUKKyAgICAgICAgICAgIGRlZmVuYyA9ICcnCisgICAgICAgIGlmIGVuY29kaW5nOgorICAgICAgICAgICAgIyBDb252ZXJ0IHRoZSBlbmNvZGluZyB0byBhIEMgbGliIGNvbXBhdGlibGUgZW5jb2Rpbmcgc3RyaW5nCisgICAgICAgICAgICBub3JtX2VuY29kaW5nID0gZW5jb2RpbmdzLm5vcm1hbGl6ZV9lbmNvZGluZyhlbmNvZGluZykKKyAgICAgICAgICAgICNwcmludCAnbm9ybSBlbmNvZGluZzogJXInICUgbm9ybV9lbmNvZGluZworICAgICAgICAgICAgbm9ybV9lbmNvZGluZyA9IGVuY29kaW5ncy5hbGlhc2VzLmFsaWFzZXMuZ2V0KG5vcm1fZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybV9lbmNvZGluZykKKyAgICAgICAgICAgICNwcmludCAnYWxpYXNlZCBlbmNvZGluZzogJXInICUgbm9ybV9lbmNvZGluZworICAgICAgICAgICAgZW5jb2RpbmcgPSBsb2NhbGVfZW5jb2RpbmdfYWxpYXMuZ2V0KG5vcm1fZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybV9lbmNvZGluZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gZGVmZW5jCisgICAgICAgICNwcmludCAnZm91bmQgZW5jb2RpbmcgJXInICUgZW5jb2RpbmcKKyAgICAgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgICAgICByZXR1cm4gbGFuZ25hbWUgKyAnLicgKyBlbmNvZGluZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGxhbmduYW1lCisKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gbG9jYWxlbmFtZQorCitkZWYgX3BhcnNlX2xvY2FsZW5hbWUobG9jYWxlbmFtZSk6CisKKyAgICAiIiIgUGFyc2VzIHRoZSBsb2NhbGUgY29kZSBmb3IgbG9jYWxlbmFtZSBhbmQgcmV0dXJucyB0aGUKKyAgICAgICAgcmVzdWx0IGFzIHR1cGxlIChsYW5ndWFnZSBjb2RlLCBlbmNvZGluZykuCisKKyAgICAgICAgVGhlIGxvY2FsZW5hbWUgaXMgbm9ybWFsaXplZCBhbmQgcGFzc2VkIHRocm91Z2ggdGhlIGxvY2FsZQorICAgICAgICBhbGlhcyBlbmdpbmUuIEEgVmFsdWVFcnJvciBpcyByYWlzZWQgaW4gY2FzZSB0aGUgbG9jYWxlIG5hbWUKKyAgICAgICAgY2Fubm90IGJlIHBhcnNlZC4KKworICAgICAgICBUaGUgbGFuZ3VhZ2UgY29kZSBjb3JyZXNwb25kcyB0byBSRkMgMTc2Ni4gIGNvZGUgYW5kIGVuY29kaW5nCisgICAgICAgIGNhbiBiZSBOb25lIGluIGNhc2UgdGhlIHZhbHVlcyBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBvciBhcmUKKyAgICAgICAgdW5rbm93biB0byB0aGlzIGltcGxlbWVudGF0aW9uLgorCisgICAgIiIiCisgICAgY29kZSA9IG5vcm1hbGl6ZShsb2NhbGVuYW1lKQorICAgIGlmICdAJyBpbiBjb2RlOgorICAgICAgICAjIERlYWwgd2l0aCBsb2NhbGUgbW9kaWZpZXJzCisgICAgICAgIGNvZGUsIG1vZGlmaWVyID0gY29kZS5zcGxpdCgnQCcpCisgICAgICAgIGlmIG1vZGlmaWVyID09ICdldXJvJyBhbmQgJy4nIG5vdCBpbiBjb2RlOgorICAgICAgICAgICAgIyBBc3N1bWUgTGF0aW4tOSBmb3IgQGV1cm8gbG9jYWxlcy4gVGhpcyBpcyBib2d1cywKKyAgICAgICAgICAgICMgc2luY2Ugc29tZSBzeXN0ZW1zIG1heSB1c2Ugb3RoZXIgZW5jb2RpbmdzIGZvciB0aGVzZQorICAgICAgICAgICAgIyBsb2NhbGVzLiBBbHNvLCB3ZSBpZ25vcmUgb3RoZXIgbW9kaWZpZXJzLgorICAgICAgICAgICAgcmV0dXJuIGNvZGUsICdpc28tODg1OS0xNScKKworICAgIGlmICcuJyBpbiBjb2RlOgorICAgICAgICByZXR1cm4gdHVwbGUoY29kZS5zcGxpdCgnLicpWzoyXSkKKyAgICBlbGlmIGNvZGUgPT0gJ0MnOgorICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorICAgIHJhaXNlIFZhbHVlRXJyb3IsICd1bmtub3duIGxvY2FsZTogJXMnICUgbG9jYWxlbmFtZQorCitkZWYgX2J1aWxkX2xvY2FsZW5hbWUobG9jYWxldHVwbGUpOgorCisgICAgIiIiIEJ1aWxkcyBhIGxvY2FsZSBjb2RlIGZyb20gdGhlIGdpdmVuIHR1cGxlIChsYW5ndWFnZSBjb2RlLAorICAgICAgICBlbmNvZGluZykuCisKKyAgICAgICAgTm8gYWxpYXNpbmcgb3Igbm9ybWFsaXppbmcgdGFrZXMgcGxhY2UuCisKKyAgICAiIiIKKyAgICBsYW5ndWFnZSwgZW5jb2RpbmcgPSBsb2NhbGV0dXBsZQorICAgIGlmIGxhbmd1YWdlIGlzIE5vbmU6CisgICAgICAgIGxhbmd1YWdlID0gJ0MnCisgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIGxhbmd1YWdlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGxhbmd1YWdlICsgJy4nICsgZW5jb2RpbmcKKworZGVmIGdldGRlZmF1bHRsb2NhbGUoZW52dmFycz0oJ0xDX0FMTCcsICdMQ19DVFlQRScsICdMQU5HJywgJ0xBTkdVQUdFJykpOgorCisgICAgIiIiIFRyaWVzIHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBsb2NhbGUgc2V0dGluZ3MgYW5kIHJldHVybnMKKyAgICAgICAgdGhlbSBhcyB0dXBsZSAobGFuZ3VhZ2UgY29kZSwgZW5jb2RpbmcpLgorCisgICAgICAgIEFjY29yZGluZyB0byBQT1NJWCwgYSBwcm9ncmFtIHdoaWNoIGhhcyBub3QgY2FsbGVkCisgICAgICAgIHNldGxvY2FsZShMQ19BTEwsICIiKSBydW5zIHVzaW5nIHRoZSBwb3J0YWJsZSAnQycgbG9jYWxlLgorICAgICAgICBDYWxsaW5nIHNldGxvY2FsZShMQ19BTEwsICIiKSBsZXRzIGl0IHVzZSB0aGUgZGVmYXVsdCBsb2NhbGUgYXMKKyAgICAgICAgZGVmaW5lZCBieSB0aGUgTEFORyB2YXJpYWJsZS4gU2luY2Ugd2UgZG9uJ3Qgd2FudCB0byBpbnRlcmZlcmUKKyAgICAgICAgd2l0aCB0aGUgY3VycmVudCBsb2NhbGUgc2V0dGluZyB3ZSB0aHVzIGVtdWxhdGUgdGhlIGJlaGF2aW9yCisgICAgICAgIGluIHRoZSB3YXkgZGVzY3JpYmVkIGFib3ZlLgorCisgICAgICAgIFRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBwbGF0Zm9ybXMsIG5vdCBvbmx5IHRoZQorICAgICAgICBMQU5HIHZhcmlhYmxlIGlzIHRlc3RlZCwgYnV0IGEgbGlzdCBvZiB2YXJpYWJsZXMgZ2l2ZW4gYXMKKyAgICAgICAgZW52dmFycyBwYXJhbWV0ZXIuIFRoZSBmaXJzdCBmb3VuZCB0byBiZSBkZWZpbmVkIHdpbGwgYmUKKyAgICAgICAgdXNlZC4gZW52dmFycyBkZWZhdWx0cyB0byB0aGUgc2VhcmNoIHBhdGggdXNlZCBpbiBHTlUgZ2V0dGV4dDsKKyAgICAgICAgaXQgbXVzdCBhbHdheXMgY29udGFpbiB0aGUgdmFyaWFibGUgbmFtZSAnTEFORycuCisKKyAgICAgICAgRXhjZXB0IGZvciB0aGUgY29kZSAnQycsIHRoZSBsYW5ndWFnZSBjb2RlIGNvcnJlc3BvbmRzIHRvIFJGQworICAgICAgICAxNzY2LiAgY29kZSBhbmQgZW5jb2RpbmcgY2FuIGJlIE5vbmUgaW4gY2FzZSB0aGUgdmFsdWVzIGNhbm5vdAorICAgICAgICBiZSBkZXRlcm1pbmVkLgorCisgICAgIiIiCisKKyAgICB0cnk6CisgICAgICAgICMgY2hlY2sgaWYgaXQncyBzdXBwb3J0ZWQgYnkgdGhlIF9sb2NhbGUgbW9kdWxlCisgICAgICAgIGltcG9ydCBfbG9jYWxlCisgICAgICAgIGNvZGUsIGVuY29kaW5nID0gX2xvY2FsZS5fZ2V0ZGVmYXVsdGxvY2FsZSgpCisgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGNvZGUvZW5jb2RpbmcgdmFsdWVzIGFyZSB2YWxpZAorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIiBhbmQgY29kZSBhbmQgY29kZVs6Ml0gPT0gIjB4IjoKKyAgICAgICAgICAgICMgbWFwIHdpbmRvd3MgbGFuZ3VhZ2UgaWRlbnRpZmllciB0byBsYW5ndWFnZSBuYW1lCisgICAgICAgICAgICBjb2RlID0gd2luZG93c19sb2NhbGUuZ2V0KGludChjb2RlLCAwKSkKKyAgICAgICAgIyAuLi5hZGQgb3RoZXIgcGxhdGZvcm0tc3BlY2lmaWMgcHJvY2Vzc2luZyBoZXJlLCBpZgorICAgICAgICAjIG5lY2Vzc2FyeS4uLgorICAgICAgICByZXR1cm4gY29kZSwgZW5jb2RpbmcKKworICAgICMgZmFsbCBiYWNrIG9uIFBPU0lYIGJlaGF2aW91cgorICAgIGltcG9ydCBvcworICAgIGxvb2t1cCA9IG9zLmVudmlyb24uZ2V0CisgICAgZm9yIHZhcmlhYmxlIGluIGVudnZhcnM6CisgICAgICAgIGxvY2FsZW5hbWUgPSBsb29rdXAodmFyaWFibGUsTm9uZSkKKyAgICAgICAgaWYgbG9jYWxlbmFtZToKKyAgICAgICAgICAgIGlmIHZhcmlhYmxlID09ICdMQU5HVUFHRSc6CisgICAgICAgICAgICAgICAgbG9jYWxlbmFtZSA9IGxvY2FsZW5hbWUuc3BsaXQoJzonKVswXQorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICBsb2NhbGVuYW1lID0gJ0MnCisgICAgcmV0dXJuIF9wYXJzZV9sb2NhbGVuYW1lKGxvY2FsZW5hbWUpCisKKworZGVmIGdldGxvY2FsZShjYXRlZ29yeT1MQ19DVFlQRSk6CisKKyAgICAiIiIgUmV0dXJucyB0aGUgY3VycmVudCBzZXR0aW5nIGZvciB0aGUgZ2l2ZW4gbG9jYWxlIGNhdGVnb3J5IGFzCisgICAgICAgIHR1cGxlIChsYW5ndWFnZSBjb2RlLCBlbmNvZGluZykuCisKKyAgICAgICAgY2F0ZWdvcnkgbWF5IGJlIG9uZSBvZiB0aGUgTENfKiB2YWx1ZSBleGNlcHQgTENfQUxMLiBJdAorICAgICAgICBkZWZhdWx0cyB0byBMQ19DVFlQRS4KKworICAgICAgICBFeGNlcHQgZm9yIHRoZSBjb2RlICdDJywgdGhlIGxhbmd1YWdlIGNvZGUgY29ycmVzcG9uZHMgdG8gUkZDCisgICAgICAgIDE3NjYuICBjb2RlIGFuZCBlbmNvZGluZyBjYW4gYmUgTm9uZSBpbiBjYXNlIHRoZSB2YWx1ZXMgY2Fubm90CisgICAgICAgIGJlIGRldGVybWluZWQuCisKKyAgICAiIiIKKyAgICBsb2NhbGVuYW1lID0gX3NldGxvY2FsZShjYXRlZ29yeSkKKyAgICBpZiBjYXRlZ29yeSA9PSBMQ19BTEwgYW5kICc7JyBpbiBsb2NhbGVuYW1lOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICdjYXRlZ29yeSBMQ19BTEwgaXMgbm90IHN1cHBvcnRlZCcKKyAgICByZXR1cm4gX3BhcnNlX2xvY2FsZW5hbWUobG9jYWxlbmFtZSkKKworZGVmIHNldGxvY2FsZShjYXRlZ29yeSwgbG9jYWxlPU5vbmUpOgorCisgICAgIiIiIFNldCB0aGUgbG9jYWxlIGZvciB0aGUgZ2l2ZW4gY2F0ZWdvcnkuICBUaGUgbG9jYWxlIGNhbiBiZQorICAgICAgICBhIHN0cmluZywgYW4gaXRlcmFibGUgb2YgdHdvIHN0cmluZ3MgKGxhbmd1YWdlIGNvZGUgYW5kIGVuY29kaW5nKSwKKyAgICAgICAgb3IgTm9uZS4KKworICAgICAgICBJdGVyYWJsZXMgYXJlIGNvbnZlcnRlZCB0byBzdHJpbmdzIHVzaW5nIHRoZSBsb2NhbGUgYWxpYXNpbmcKKyAgICAgICAgZW5naW5lLiAgTG9jYWxlIHN0cmluZ3MgYXJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgQyBsaWIuCisKKyAgICAgICAgY2F0ZWdvcnkgbWF5IGJlIGdpdmVuIGFzIG9uZSBvZiB0aGUgTENfKiB2YWx1ZXMuCisKKyAgICAiIiIKKyAgICBpZiBsb2NhbGUgYW5kIHR5cGUobG9jYWxlKSBpcyBub3QgdHlwZSgiIik6CisgICAgICAgICMgY29udmVydCB0byBzdHJpbmcKKyAgICAgICAgbG9jYWxlID0gbm9ybWFsaXplKF9idWlsZF9sb2NhbGVuYW1lKGxvY2FsZSkpCisgICAgcmV0dXJuIF9zZXRsb2NhbGUoY2F0ZWdvcnksIGxvY2FsZSkKKworZGVmIHJlc2V0bG9jYWxlKGNhdGVnb3J5PUxDX0FMTCk6CisKKyAgICAiIiIgU2V0cyB0aGUgbG9jYWxlIGZvciBjYXRlZ29yeSB0byB0aGUgZGVmYXVsdCBzZXR0aW5nLgorCisgICAgICAgIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgZGV0ZXJtaW5lZCBieSBjYWxsaW5nCisgICAgICAgIGdldGRlZmF1bHRsb2NhbGUoKS4gY2F0ZWdvcnkgZGVmYXVsdHMgdG8gTENfQUxMLgorCisgICAgIiIiCisgICAgX3NldGxvY2FsZShjYXRlZ29yeSwgX2J1aWxkX2xvY2FsZW5hbWUoZ2V0ZGVmYXVsdGxvY2FsZSgpKSkKKworaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpOgorICAgICMgT24gV2luMzIsIHRoaXMgd2lsbCByZXR1cm4gdGhlIEFOU0kgY29kZSBwYWdlCisgICAgZGVmIGdldHByZWZlcnJlZGVuY29kaW5nKGRvX3NldGxvY2FsZSA9IFRydWUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNoYXJzZXQgdGhhdCB0aGUgdXNlciBpcyBsaWtlbHkgdXNpbmcuIiIiCisgICAgICAgIGltcG9ydCBfbG9jYWxlCisgICAgICAgIHJldHVybiBfbG9jYWxlLl9nZXRkZWZhdWx0bG9jYWxlKClbMV0KK2Vsc2U6CisgICAgIyBPbiBVbml4LCBpZiBDT0RFU0VUIGlzIGF2YWlsYWJsZSwgdXNlIHRoYXQuCisgICAgdHJ5OgorICAgICAgICBDT0RFU0VUCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgIyBGYWxsIGJhY2sgdG8gcGFyc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgOi0oCisgICAgICAgIGRlZiBnZXRwcmVmZXJyZWRlbmNvZGluZyhkb19zZXRsb2NhbGUgPSBUcnVlKToKKyAgICAgICAgICAgICIiIlJldHVybiB0aGUgY2hhcnNldCB0aGF0IHRoZSB1c2VyIGlzIGxpa2VseSB1c2luZywKKyAgICAgICAgICAgIGJ5IGxvb2tpbmcgYXQgZW52aXJvbm1lbnQgdmFyaWFibGVzLiIiIgorICAgICAgICAgICAgcmV0dXJuIGdldGRlZmF1bHRsb2NhbGUoKVsxXQorICAgIGVsc2U6CisgICAgICAgIGRlZiBnZXRwcmVmZXJyZWRlbmNvZGluZyhkb19zZXRsb2NhbGUgPSBUcnVlKToKKyAgICAgICAgICAgICIiIlJldHVybiB0aGUgY2hhcnNldCB0aGF0IHRoZSB1c2VyIGlzIGxpa2VseSB1c2luZywKKyAgICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgc3lzdGVtIGNvbmZpZ3VyYXRpb24uIiIiCisgICAgICAgICAgICBpZiBkb19zZXRsb2NhbGU6CisgICAgICAgICAgICAgICAgb2xkbG9jID0gc2V0bG9jYWxlKExDX0NUWVBFKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2V0bG9jYWxlKExDX0NUWVBFLCAiIikKKyAgICAgICAgICAgICAgICBleGNlcHQgRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBubF9sYW5naW5mbyhDT0RFU0VUKQorICAgICAgICAgICAgICAgIHNldGxvY2FsZShMQ19DVFlQRSwgb2xkbG9jKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5sX2xhbmdpbmZvKENPREVTRVQpCisKKworIyMjIERhdGFiYXNlCisjCisjIFRoZSBmb2xsb3dpbmcgZGF0YSB3YXMgZXh0cmFjdGVkIGZyb20gdGhlIGxvY2FsZS5hbGlhcyBmaWxlIHdoaWNoCisjIGNvbWVzIHdpdGggWDExIGFuZCB0aGVuIGhhbmQgZWRpdGVkIHJlbW92aW5nIHRoZSBleHBsaWNpdCBlbmNvZGluZworIyBkZWZpbml0aW9ucyBhbmQgYWRkaW5nIHNvbWUgbW9yZSBhbGlhc2VzLiBUaGUgZmlsZSBpcyB1c3VhbGx5CisjIGF2YWlsYWJsZSBhcyAvdXNyL2xpYi9YMTEvbG9jYWxlL2xvY2FsZS5hbGlhcy4KKyMKKworIworIyBUaGUgbG9jYWxfZW5jb2RpbmdfYWxpYXMgdGFibGUgbWFwcyBsb3dlcmNhc2UgZW5jb2RpbmcgYWxpYXMgbmFtZXMKKyMgdG8gQyBsb2NhbGUgZW5jb2RpbmcgbmFtZXMgKGNhc2Utc2Vuc2l0aXZlKS4gTm90ZSB0aGF0IG5vcm1hbGl6ZSgpCisjIGZpcnN0IGxvb2tzIHVwIHRoZSBlbmNvZGluZyBpbiB0aGUgZW5jb2RpbmdzLmFsaWFzZXMgZGljdGlvbmFyeSBhbmQKKyMgdGhlbiBhcHBsaWVzIHRoaXMgbWFwcGluZyB0byBmaW5kIHRoZSBjb3JyZWN0IEMgbGliIG5hbWUgZm9yIHRoZQorIyBlbmNvZGluZy4KKyMKK2xvY2FsZV9lbmNvZGluZ19hbGlhcyA9IHsKKworICAgICMgTWFwcGluZ3MgZm9yIG5vbi1zdGFuZGFyZCBlbmNvZGluZyBuYW1lcyB1c2VkIGluIGxvY2FsZSBuYW1lcworICAgICc0MzcnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnLAorICAgICdjJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnLAorICAgICdlbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktMScsCisgICAgJ2ppcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnSklTNycsCisgICAgJ2ppczcnOiAgICAgICAgICAgICAgICAgICAgICAgICAnSklTNycsCisgICAgJ2FqZWMnOiAgICAgICAgICAgICAgICAgICAgICAgICAnZXVjSlAnLAorCisgICAgIyBNYXBwaW5ncyBmcm9tIFB5dGhvbiBjb2RlYyBuYW1lcyB0byBDIGxpYiBlbmNvZGluZyBuYW1lcworICAgICdhc2NpaSc6ICAgICAgICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktMScsCisgICAgJ2xhdGluXzEnOiAgICAgICAgICAgICAgICAgICAgICAnSVNPODg1OS0xJywKKyAgICAnaXNvODg1OV8xJzogICAgICAgICAgICAgICAgICAgICdJU084ODU5LTEnLAorICAgICdpc284ODU5XzEwJzogICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktMTAnLAorICAgICdpc284ODU5XzExJzogICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktMTEnLAorICAgICdpc284ODU5XzEzJzogICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktMTMnLAorICAgICdpc284ODU5XzE0JzogICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktMTQnLAorICAgICdpc284ODU5XzE1JzogICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktMTUnLAorICAgICdpc284ODU5XzE2JzogICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktMTYnLAorICAgICdpc284ODU5XzInOiAgICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktMicsCisgICAgJ2lzbzg4NTlfMyc6ICAgICAgICAgICAgICAgICAgICAnSVNPODg1OS0zJywKKyAgICAnaXNvODg1OV80JzogICAgICAgICAgICAgICAgICAgICdJU084ODU5LTQnLAorICAgICdpc284ODU5XzUnOiAgICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktNScsCisgICAgJ2lzbzg4NTlfNic6ICAgICAgICAgICAgICAgICAgICAnSVNPODg1OS02JywKKyAgICAnaXNvODg1OV83JzogICAgICAgICAgICAgICAgICAgICdJU084ODU5LTcnLAorICAgICdpc284ODU5XzgnOiAgICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktOCcsCisgICAgJ2lzbzg4NTlfOSc6ICAgICAgICAgICAgICAgICAgICAnSVNPODg1OS05JywKKyAgICAnaXNvMjAyMl9qcCc6ICAgICAgICAgICAgICAgICAgICdKSVM3JywKKyAgICAnc2hpZnRfamlzJzogICAgICAgICAgICAgICAgICAgICdTSklTJywKKyAgICAndGFjdGlzJzogICAgICAgICAgICAgICAgICAgICAgICdUQUNUSVMnLAorICAgICdldWNfanAnOiAgICAgICAgICAgICAgICAgICAgICAgJ2V1Y0pQJywKKyAgICAnZXVjX2tyJzogICAgICAgICAgICAgICAgICAgICAgICdldWNLUicsCisgICAgJ3V0Zl84JzogICAgICAgICAgICAgICAgICAgICAgICAnVVRGLTgnLAorICAgICdrb2k4X3InOiAgICAgICAgICAgICAgICAgICAgICAgJ0tPSTgtUicsCisgICAgJ2tvaThfdSc6ICAgICAgICAgICAgICAgICAgICAgICAnS09JOC1VJywKKyAgICAjIFhYWCBUaGlzIGxpc3QgaXMgc3RpbGwgaW5jb21wbGV0ZS4gSWYgeW91IGtub3cgbW9yZQorICAgICMgbWFwcGluZ3MsIHBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydC4gVGhhbmtzLgorfQorCisjCisjIFRoZSBsb2NhbGVfYWxpYXMgdGFibGUgbWFwcyBsb3dlcmNhc2UgYWxpYXMgbmFtZXMgdG8gQyBsb2NhbGUgbmFtZXMKKyMgKGNhc2Utc2Vuc2l0aXZlKS4gRW5jb2RpbmdzIGFyZSBhbHdheXMgc2VwYXJhdGVkIGZyb20gdGhlIGxvY2FsZQorIyBuYW1lIHVzaW5nIGEgZG90ICgnLicpOyB0aGV5IHNob3VsZCBvbmx5IGJlIGdpdmVuIGluIGNhc2UgdGhlCisjIGxhbmd1YWdlIG5hbWUgaXMgbmVlZGVkIHRvIGludGVycHJldCB0aGUgZ2l2ZW4gZW5jb2RpbmcgYWxpYXMKKyMgY29ycmVjdGx5IChDSksgY29kZXMgb2Z0ZW4gaGF2ZSB0aGlzIG5lZWQpLgorIworIyBOb3RlIHRoYXQgdGhlIG5vcm1hbGl6ZSgpIGZ1bmN0aW9uIHdoaWNoIHVzZXMgdGhpcyB0YWJsZXMKKyMgcmVtb3ZlcyAnXycgYW5kICctJyBjaGFyYWN0ZXJzIGZyb20gdGhlIGVuY29kaW5nIHBhcnQgb2YgdGhlCisjIGxvY2FsZSBuYW1lIGJlZm9yZSBkb2luZyB0aGUgbG9va3VwLiBUaGlzIHNhdmVzIGEgbG90IG9mCisjIHNwYWNlIGluIHRoZSB0YWJsZS4KKyMKKyMgTUFMIDIwMDQtMTItMTA6CisjIFVwZGF0ZWQgYWxpYXMgbWFwcGluZyB0byBtb3N0IHJlY2VudCBsb2NhbGUuYWxpYXMgZmlsZQorIyBmcm9tIFgub3JnIGRpc3RyaWJ1dGlvbiB1c2luZyBtYWtlbG9jYWxlYWxpYXMucHkuCisjCisjIFRoZXNlIGFyZSB0aGUgZGlmZmVyZW5jZXMgY29tcGFyZWQgdG8gdGhlIG9sZCBtYXBwaW5nIChQeXRob24gMi40CisjIGFuZCBvbGRlcik6CisjCisjICAgIHVwZGF0ZWQgJ2JnJyAtPiAnYmdfQkcuSVNPODg1OS01JyB0byAnYmdfQkcuQ1AxMjUxJworIyAgICB1cGRhdGVkICdiZ19iZycgLT4gJ2JnX0JHLklTTzg4NTktNScgdG8gJ2JnX0JHLkNQMTI1MScKKyMgICAgdXBkYXRlZCAnYnVsZ2FyaWFuJyAtPiAnYmdfQkcuSVNPODg1OS01JyB0byAnYmdfQkcuQ1AxMjUxJworIyAgICB1cGRhdGVkICdjeicgLT4gJ2N6X0NaLklTTzg4NTktMicgdG8gJ2NzX0NaLklTTzg4NTktMicKKyMgICAgdXBkYXRlZCAnY3pfY3onIC0+ICdjel9DWi5JU084ODU5LTInIHRvICdjc19DWi5JU084ODU5LTInCisjICAgIHVwZGF0ZWQgJ2N6ZWNoJyAtPiAnY3NfQ1MuSVNPODg1OS0yJyB0byAnY3NfQ1ouSVNPODg1OS0yJworIyAgICB1cGRhdGVkICdkdXRjaCcgLT4gJ25sX0JFLklTTzg4NTktMScgdG8gJ25sX05MLklTTzg4NTktMScKKyMgICAgdXBkYXRlZCAnZXQnIC0+ICdldF9FRS5JU084ODU5LTQnIHRvICdldF9FRS5JU084ODU5LTE1JworIyAgICB1cGRhdGVkICdldF9lZScgLT4gJ2V0X0VFLklTTzg4NTktNCcgdG8gJ2V0X0VFLklTTzg4NTktMTUnCisjICAgIHVwZGF0ZWQgJ2ZpJyAtPiAnZmlfRkkuSVNPODg1OS0xJyB0byAnZmlfRkkuSVNPODg1OS0xNScKKyMgICAgdXBkYXRlZCAnZmlfZmknIC0+ICdmaV9GSS5JU084ODU5LTEnIHRvICdmaV9GSS5JU084ODU5LTE1JworIyAgICB1cGRhdGVkICdpdycgLT4gJ2l3X0lMLklTTzg4NTktOCcgdG8gJ2hlX0lMLklTTzg4NTktOCcKKyMgICAgdXBkYXRlZCAnaXdfaWwnIC0+ICdpd19JTC5JU084ODU5LTgnIHRvICdoZV9JTC5JU084ODU5LTgnCisjICAgIHVwZGF0ZWQgJ2phcGFuZXNlJyAtPiAnamFfSlAuU0pJUycgdG8gJ2phX0pQLmV1Y0pQJworIyAgICB1cGRhdGVkICdsdCcgLT4gJ2x0X0xULklTTzg4NTktNCcgdG8gJ2x0X0xULklTTzg4NTktMTMnCisjICAgIHVwZGF0ZWQgJ2x2JyAtPiAnbHZfTFYuSVNPODg1OS00JyB0byAnbHZfTFYuSVNPODg1OS0xMycKKyMgICAgdXBkYXRlZCAnc2wnIC0+ICdzbF9DUy5JU084ODU5LTInIHRvICdzbF9TSS5JU084ODU5LTInCisjICAgIHVwZGF0ZWQgJ3Nsb3ZlbmUnIC0+ICdzbF9DUy5JU084ODU5LTInIHRvICdzbF9TSS5JU084ODU5LTInCisjICAgIHVwZGF0ZWQgJ3RoX3RoJyAtPiAndGhfVEguVEFDVElTJyB0byAndGhfVEguSVNPODg1OS0xMScKKyMgICAgdXBkYXRlZCAnemhfY24nIC0+ICd6aF9DTi5ldWNDTicgdG8gJ3poX0NOLmdiMjMxMicKKyMgICAgdXBkYXRlZCAnemhfY24uYmlnNScgLT4gJ3poX1RXLmV1Y1RXJyB0byAnemhfVFcuYmlnNScKKyMgICAgdXBkYXRlZCAnemhfdHcnIC0+ICd6aF9UVy5ldWNUVycgdG8gJ3poX1RXLmJpZzUnCisjCisjIE1BTCAyMDA4LTA1LTMwOgorIyBVcGRhdGVkIGFsaWFzIG1hcHBpbmcgdG8gbW9zdCByZWNlbnQgbG9jYWxlLmFsaWFzIGZpbGUKKyMgZnJvbSBYLm9yZyBkaXN0cmlidXRpb24gdXNpbmcgbWFrZWxvY2FsZWFsaWFzLnB5LgorIworIyBUaGVzZSBhcmUgdGhlIGRpZmZlcmVuY2VzIGNvbXBhcmVkIHRvIHRoZSBvbGQgbWFwcGluZyAoUHl0aG9uIDIuNQorIyBhbmQgb2xkZXIpOgorIworIyAgICB1cGRhdGVkICdjc19jcy5pc284ODU5MicgLT4gJ2NzX0NaLklTTzg4NTktMicgdG8gJ2NzX0NTLklTTzg4NTktMicKKyMgICAgdXBkYXRlZCAnc2VyYm9jcm9hdGlhbicgLT4gJ3NoX1lVLklTTzg4NTktMicgdG8gJ3NyX0NTLklTTzg4NTktMicKKyMgICAgdXBkYXRlZCAnc2gnIC0+ICdzaF9ZVS5JU084ODU5LTInIHRvICdzcl9DUy5JU084ODU5LTInCisjICAgIHVwZGF0ZWQgJ3NoX2hyLmlzbzg4NTkyJyAtPiAnc2hfSFIuSVNPODg1OS0yJyB0byAnaHJfSFIuSVNPODg1OS0yJworIyAgICB1cGRhdGVkICdzaF9zcCcgLT4gJ3NoX1lVLklTTzg4NTktMicgdG8gJ3NyX0NTLklTTzg4NTktMicKKyMgICAgdXBkYXRlZCAnc2hfeXUnIC0+ICdzaF9ZVS5JU084ODU5LTInIHRvICdzcl9DUy5JU084ODU5LTInCisjICAgIHVwZGF0ZWQgJ3NwJyAtPiAnc3BfWVUuSVNPODg1OS01JyB0byAnc3JfQ1MuSVNPODg1OS01JworIyAgICB1cGRhdGVkICdzcF95dScgLT4gJ3NwX1lVLklTTzg4NTktNScgdG8gJ3NyX0NTLklTTzg4NTktNScKKyMgICAgdXBkYXRlZCAnc3InIC0+ICdzcl9ZVS5JU084ODU5LTUnIHRvICdzcl9DUy5JU084ODU5LTUnCisjICAgIHVwZGF0ZWQgJ3NyQGN5cmlsbGljJyAtPiAnc3JfWVUuSVNPODg1OS01JyB0byAnc3JfQ1MuSVNPODg1OS01JworIyAgICB1cGRhdGVkICdzcl9zcCcgLT4gJ3NyX1NQLklTTzg4NTktMicgdG8gJ3NyX0NTLklTTzg4NTktMicKKyMgICAgdXBkYXRlZCAnc3JfeXUnIC0+ICdzcl9ZVS5JU084ODU5LTUnIHRvICdzcl9DUy5JU084ODU5LTUnCisjICAgIHVwZGF0ZWQgJ3NyX3l1LmNwMTI1MUBjeXJpbGxpYycgLT4gJ3NyX1lVLkNQMTI1MScgdG8gJ3NyX0NTLkNQMTI1MScKKyMgICAgdXBkYXRlZCAnc3JfeXUuaXNvODg1OTInIC0+ICdzcl9ZVS5JU084ODU5LTInIHRvICdzcl9DUy5JU084ODU5LTInCisjICAgIHVwZGF0ZWQgJ3NyX3l1Lmlzbzg4NTk1JyAtPiAnc3JfWVUuSVNPODg1OS01JyB0byAnc3JfQ1MuSVNPODg1OS01JworIyAgICB1cGRhdGVkICdzcl95dS5pc284ODU5NUBjeXJpbGxpYycgLT4gJ3NyX1lVLklTTzg4NTktNScgdG8gJ3NyX0NTLklTTzg4NTktNScKKyMgICAgdXBkYXRlZCAnc3JfeXUubWljcm9zb2Z0Y3AxMjUxQGN5cmlsbGljJyAtPiAnc3JfWVUuQ1AxMjUxJyB0byAnc3JfQ1MuQ1AxMjUxJworIyAgICB1cGRhdGVkICdzcl95dS51dGY4QGN5cmlsbGljJyAtPiAnc3JfWVUuVVRGLTgnIHRvICdzcl9DUy5VVEYtOCcKKyMgICAgdXBkYXRlZCAnc3JfeXVAY3lyaWxsaWMnIC0+ICdzcl9ZVS5JU084ODU5LTUnIHRvICdzcl9DUy5JU084ODU5LTUnCisjCisjIEFQIDIwMTAtMDQtMTI6CisjIFVwZGF0ZWQgYWxpYXMgbWFwcGluZyB0byBtb3N0IHJlY2VudCBsb2NhbGUuYWxpYXMgZmlsZQorIyBmcm9tIFgub3JnIGRpc3RyaWJ1dGlvbiB1c2luZyBtYWtlbG9jYWxlYWxpYXMucHkuCisjCisjIFRoZXNlIGFyZSB0aGUgZGlmZmVyZW5jZXMgY29tcGFyZWQgdG8gdGhlIG9sZCBtYXBwaW5nIChQeXRob24gMi42LjUKKyMgYW5kIG9sZGVyKToKKyMKKyMgICAgdXBkYXRlZCAncnUnIC0+ICdydV9SVS5JU084ODU5LTUnIHRvICdydV9SVS5VVEYtOCcKKyMgICAgdXBkYXRlZCAncnVfcnUnIC0+ICdydV9SVS5JU084ODU5LTUnIHRvICdydV9SVS5VVEYtOCcKKyMgICAgdXBkYXRlZCAnc2VyYm9jcm9hdGlhbicgLT4gJ3NyX0NTLklTTzg4NTktMicgdG8gJ3NyX1JTLlVURi04QGxhdGluJworIyAgICB1cGRhdGVkICdzaCcgLT4gJ3NyX0NTLklTTzg4NTktMicgdG8gJ3NyX1JTLlVURi04QGxhdGluJworIyAgICB1cGRhdGVkICdzaF95dScgLT4gJ3NyX0NTLklTTzg4NTktMicgdG8gJ3NyX1JTLlVURi04QGxhdGluJworIyAgICB1cGRhdGVkICdzcicgLT4gJ3NyX0NTLklTTzg4NTktNScgdG8gJ3NyX1JTLlVURi04JworIyAgICB1cGRhdGVkICdzckBjeXJpbGxpYycgLT4gJ3NyX0NTLklTTzg4NTktNScgdG8gJ3NyX1JTLlVURi04JworIyAgICB1cGRhdGVkICdzckBsYXRuJyAtPiAnc3JfQ1MuSVNPODg1OS0yJyB0byAnc3JfUlMuVVRGLThAbGF0aW4nCisjICAgIHVwZGF0ZWQgJ3NyX2NzLnV0ZjhAbGF0bicgLT4gJ3NyX0NTLlVURi04JyB0byAnc3JfUlMuVVRGLThAbGF0aW4nCisjICAgIHVwZGF0ZWQgJ3NyX2NzQGxhdG4nIC0+ICdzcl9DUy5JU084ODU5LTInIHRvICdzcl9SUy5VVEYtOEBsYXRpbicKKyMgICAgdXBkYXRlZCAnc3JfeXUnIC0+ICdzcl9DUy5JU084ODU5LTUnIHRvICdzcl9SUy5VVEYtOEBsYXRpbicKKyMgICAgdXBkYXRlZCAnc3JfeXUudXRmOEBjeXJpbGxpYycgLT4gJ3NyX0NTLlVURi04JyB0byAnc3JfUlMuVVRGLTgnCisjICAgIHVwZGF0ZWQgJ3NyX3l1QGN5cmlsbGljJyAtPiAnc3JfQ1MuSVNPODg1OS01JyB0byAnc3JfUlMuVVRGLTgnCisjCisKK2xvY2FsZV9hbGlhcyA9IHsKKyAgICAnYTMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EzX0FaLktPSTgtQycsCisgICAgJ2EzX2F6JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhM19BWi5LT0k4LUMnLAorICAgICdhM19hei5rb2k4Yyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnYTNfQVouS09JOC1DJywKKyAgICAnYWYnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FmX1pBLklTTzg4NTktMScsCisgICAgJ2FmX3phJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZl9aQS5JU084ODU5LTEnLAorICAgICdhZl96YS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnYWZfWkEuSVNPODg1OS0xJywKKyAgICAnYW0nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FtX0VULlVURi04JywKKyAgICAnYW1fZXQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FtX0VULlVURi04JywKKyAgICAnYW1lcmljYW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMScsCisgICAgJ2FtZXJpY2FuLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTEnLAorICAgICdhcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfQUEuSVNPODg1OS02JywKKyAgICAnYXJfYWEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0FBLklTTzg4NTktNicsCisgICAgJ2FyX2FhLmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9BQS5JU084ODU5LTYnLAorICAgICdhcl9hZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfQUUuSVNPODg1OS02JywKKyAgICAnYXJfYWUuaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0FFLklTTzg4NTktNicsCisgICAgJ2FyX2JoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9CSC5JU084ODU5LTYnLAorICAgICdhcl9iaC5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfQkguSVNPODg1OS02JywKKyAgICAnYXJfZHonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0RaLklTTzg4NTktNicsCisgICAgJ2FyX2R6Lmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9EWi5JU084ODU5LTYnLAorICAgICdhcl9lZyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfRUcuSVNPODg1OS02JywKKyAgICAnYXJfZWcuaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0VHLklTTzg4NTktNicsCisgICAgJ2FyX2lxJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9JUS5JU084ODU5LTYnLAorICAgICdhcl9pcS5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfSVEuSVNPODg1OS02JywKKyAgICAnYXJfam8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0pPLklTTzg4NTktNicsCisgICAgJ2FyX2pvLmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9KTy5JU084ODU5LTYnLAorICAgICdhcl9rdyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfS1cuSVNPODg1OS02JywKKyAgICAnYXJfa3cuaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0tXLklTTzg4NTktNicsCisgICAgJ2FyX2xiJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9MQi5JU084ODU5LTYnLAorICAgICdhcl9sYi5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfTEIuSVNPODg1OS02JywKKyAgICAnYXJfbHknOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0xZLklTTzg4NTktNicsCisgICAgJ2FyX2x5Lmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9MWS5JU084ODU5LTYnLAorICAgICdhcl9tYSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfTUEuSVNPODg1OS02JywKKyAgICAnYXJfbWEuaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX01BLklTTzg4NTktNicsCisgICAgJ2FyX29tJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9PTS5JU084ODU5LTYnLAorICAgICdhcl9vbS5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfT00uSVNPODg1OS02JywKKyAgICAnYXJfcWEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX1FBLklTTzg4NTktNicsCisgICAgJ2FyX3FhLmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9RQS5JU084ODU5LTYnLAorICAgICdhcl9zYSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfU0EuSVNPODg1OS02JywKKyAgICAnYXJfc2EuaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX1NBLklTTzg4NTktNicsCisgICAgJ2FyX3NkJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9TRC5JU084ODU5LTYnLAorICAgICdhcl9zZC5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfU0QuSVNPODg1OS02JywKKyAgICAnYXJfc3knOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX1NZLklTTzg4NTktNicsCisgICAgJ2FyX3N5Lmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9TWS5JU084ODU5LTYnLAorICAgICdhcl90bic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfVE4uSVNPODg1OS02JywKKyAgICAnYXJfdG4uaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX1ROLklTTzg4NTktNicsCisgICAgJ2FyX3llJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9ZRS5JU084ODU5LTYnLAorICAgICdhcl95ZS5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfWUUuSVNPODg1OS02JywKKyAgICAnYXJhYmljJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0FBLklTTzg4NTktNicsCisgICAgJ2FyYWJpYy5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICdhcl9BQS5JU084ODU5LTYnLAorICAgICdhcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXNfSU4uVVRGLTgnLAorICAgICdheic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXpfQVouSVNPODg1OS05RScsCisgICAgJ2F6X2F6JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhel9BWi5JU084ODU5LTlFJywKKyAgICAnYXpfYXouaXNvODg1OTllJzogICAgICAgICAgICAgICAgICAgICAgJ2F6X0FaLklTTzg4NTktOUUnLAorICAgICdiZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmVfQlkuQ1AxMjUxJywKKyAgICAnYmVAbGF0aW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JlX0JZLlVURi04QGxhdGluJywKKyAgICAnYmVfYnknOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JlX0JZLkNQMTI1MScsCisgICAgJ2JlX2J5LmNwMTI1MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdiZV9CWS5DUDEyNTEnLAorICAgICdiZV9ieS5taWNyb3NvZnRjcDEyNTEnOiAgICAgICAgICAgICAgICAnYmVfQlkuQ1AxMjUxJywKKyAgICAnYmVfYnkudXRmOEBsYXRpbic6ICAgICAgICAgICAgICAgICAgICAgJ2JlX0JZLlVURi04QGxhdGluJywKKyAgICAnYmVfYnlAbGF0aW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JlX0JZLlVURi04QGxhdGluJywKKyAgICAnYmcnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnX0JHLkNQMTI1MScsCisgICAgJ2JnX2JnJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZ19CRy5DUDEyNTEnLAorICAgICdiZ19iZy5jcDEyNTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAnYmdfQkcuQ1AxMjUxJywKKyAgICAnYmdfYmcuaXNvODg1OTUnOiAgICAgICAgICAgICAgICAgICAgICAgJ2JnX0JHLklTTzg4NTktNScsCisgICAgJ2JnX2JnLmtvaThyJzogICAgICAgICAgICAgICAgICAgICAgICAgICdiZ19CRy5LT0k4LVInLAorICAgICdiZ19iZy5taWNyb3NvZnRjcDEyNTEnOiAgICAgICAgICAgICAgICAnYmdfQkcuQ1AxMjUxJywKKyAgICAnYm5faW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JuX0lOLlVURi04JywKKyAgICAnYm9rbWFsJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25iX05PLklTTzg4NTktMScsCisgICAgJ2Jva21ceGU1bCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYl9OTy5JU084ODU5LTEnLAorICAgICdicic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnJfRlIuSVNPODg1OS0xJywKKyAgICAnYnJfZnInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JyX0ZSLklTTzg4NTktMScsCisgICAgJ2JyX2ZyLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdicl9GUi5JU084ODU5LTEnLAorICAgICdicl9mci5pc284ODU5MTQnOiAgICAgICAgICAgICAgICAgICAgICAnYnJfRlIuSVNPODg1OS0xNCcsCisgICAgJ2JyX2ZyLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdicl9GUi5JU084ODU5LTE1JywKKyAgICAnYnJfZnIuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ2JyX0ZSLklTTzg4NTktMTUnLAorICAgICdicl9mci51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnYnJfRlIuVVRGLTgnLAorICAgICdicl9mckBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnYnJfRlIuSVNPODg1OS0xNScsCisgICAgJ2JzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdic19CQS5JU084ODU5LTInLAorICAgICdic19iYSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnNfQkEuSVNPODg1OS0yJywKKyAgICAnYnNfYmEuaXNvODg1OTInOiAgICAgICAgICAgICAgICAgICAgICAgJ2JzX0JBLklTTzg4NTktMicsCisgICAgJ2J1bGdhcmlhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZ19CRy5DUDEyNTEnLAorICAgICdjJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycsCisgICAgJ2MtZnJlbmNoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9DQS5JU084ODU5LTEnLAorICAgICdjLWZyZW5jaC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAnZnJfQ0EuSVNPODg1OS0xJywKKyAgICAnYy5lbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnLAorICAgICdjLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnY19jJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnLAorICAgICdjX2MuYyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycsCisgICAgJ2NhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYV9FUy5JU084ODU5LTEnLAorICAgICdjYV9hZCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FfQUQuSVNPODg1OS0xJywKKyAgICAnY2FfYWQuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2NhX0FELklTTzg4NTktMScsCisgICAgJ2NhX2FkLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdjYV9BRC5JU084ODU5LTE1JywKKyAgICAnY2FfYWQuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ2NhX0FELklTTzg4NTktMTUnLAorICAgICdjYV9hZC51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnY2FfQUQuVVRGLTgnLAorICAgICdjYV9hZEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FfQUQuSVNPODg1OS0xNScsCisgICAgJ2NhX2VzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYV9FUy5JU084ODU5LTEnLAorICAgICdjYV9lcy5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnY2FfRVMuSVNPODg1OS0xJywKKyAgICAnY2FfZXMuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2NhX0VTLklTTzg4NTktMTUnLAorICAgICdjYV9lcy5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnY2FfRVMuSVNPODg1OS0xNScsCisgICAgJ2NhX2VzLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdjYV9FUy5VVEYtOCcsCisgICAgJ2NhX2VzQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYV9FUy5JU084ODU5LTE1JywKKyAgICAnY2FfZnInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhX0ZSLklTTzg4NTktMScsCisgICAgJ2NhX2ZyLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdjYV9GUi5JU084ODU5LTEnLAorICAgICdjYV9mci5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnY2FfRlIuSVNPODg1OS0xNScsCisgICAgJ2NhX2ZyLmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdjYV9GUi5JU084ODU5LTE1JywKKyAgICAnY2FfZnIudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2NhX0ZSLlVURi04JywKKyAgICAnY2FfZnJAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhX0ZSLklTTzg4NTktMTUnLAorICAgICdjYV9pdCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FfSVQuSVNPODg1OS0xJywKKyAgICAnY2FfaXQuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2NhX0lULklTTzg4NTktMScsCisgICAgJ2NhX2l0Lmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdjYV9JVC5JU084ODU5LTE1JywKKyAgICAnY2FfaXQuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ2NhX0lULklTTzg4NTktMTUnLAorICAgICdjYV9pdC51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnY2FfSVQuVVRGLTgnLAorICAgICdjYV9pdEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FfSVQuSVNPODg1OS0xNScsCisgICAgJ2NhdGFsYW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYV9FUy5JU084ODU5LTEnLAorICAgICdjZXh0ZW5kJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnY2V4dGVuZC5lbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMScsCisgICAgJ2NoaW5lc2Utcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6aF9DTi5ldWNDTicsCisgICAgJ2NoaW5lc2UtdCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6aF9UVy5ldWNUVycsCisgICAgJ2Nyb2F0aWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdocl9IUi5JU084ODU5LTInLAorICAgICdjcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3NfQ1ouSVNPODg1OS0yJywKKyAgICAnY3NfY3MnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NzX0NaLklTTzg4NTktMicsCisgICAgJ2NzX2NzLmlzbzg4NTkyJzogICAgICAgICAgICAgICAgICAgICAgICdjc19DUy5JU084ODU5LTInLAorICAgICdjc19jeic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3NfQ1ouSVNPODg1OS0yJywKKyAgICAnY3NfY3ouaXNvODg1OTInOiAgICAgICAgICAgICAgICAgICAgICAgJ2NzX0NaLklTTzg4NTktMicsCisgICAgJ2N5JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjeV9HQi5JU084ODU5LTEnLAorICAgICdjeV9nYic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3lfR0IuSVNPODg1OS0xJywKKyAgICAnY3lfZ2IuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2N5X0dCLklTTzg4NTktMScsCisgICAgJ2N5X2diLmlzbzg4NTkxNCc6ICAgICAgICAgICAgICAgICAgICAgICdjeV9HQi5JU084ODU5LTE0JywKKyAgICAnY3lfZ2IuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2N5X0dCLklTTzg4NTktMTUnLAorICAgICdjeV9nYkBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnY3lfR0IuSVNPODg1OS0xNScsCisgICAgJ2N6JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjc19DWi5JU084ODU5LTInLAorICAgICdjel9jeic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3NfQ1ouSVNPODg1OS0yJywKKyAgICAnY3plY2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NzX0NaLklTTzg4NTktMicsCisgICAgJ2RhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYV9ESy5JU084ODU5LTEnLAorICAgICdkYS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAgICAnZGFfREsuSVNPODg1OS0xNScsCisgICAgJ2RhX2RrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYV9ESy5JU084ODU5LTEnLAorICAgICdkYV9kay44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZGFfREsuSVNPODg1OS0xJywKKyAgICAnZGFfZGsuODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgICAgJ2RhX0RLLklTTzg4NTktMTUnLAorICAgICdkYV9kay5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZGFfREsuSVNPODg1OS0xJywKKyAgICAnZGFfZGsuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2RhX0RLLklTTzg4NTktMTUnLAorICAgICdkYV9ka0BldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZGFfREsuSVNPODg1OS0xNScsCisgICAgJ2RhbmlzaCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYV9ESy5JU084ODU5LTEnLAorICAgICdkYW5pc2guaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAnZGFfREsuSVNPODg1OS0xJywKKyAgICAnZGFuc2snOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhX0RLLklTTzg4NTktMScsCisgICAgJ2RlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZV9ERS5JU084ODU5LTEnLAorICAgICdkZS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfREUuSVNPODg1OS0xNScsCisgICAgJ2RlX2F0JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZV9BVC5JU084ODU5LTEnLAorICAgICdkZV9hdC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZGVfQVQuSVNPODg1OS0xJywKKyAgICAnZGVfYXQuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2RlX0FULklTTzg4NTktMTUnLAorICAgICdkZV9hdC5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnZGVfQVQuSVNPODg1OS0xNScsCisgICAgJ2RlX2F0LnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdkZV9BVC5VVEYtOCcsCisgICAgJ2RlX2F0QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZV9BVC5JU084ODU5LTE1JywKKyAgICAnZGVfYmUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0JFLklTTzg4NTktMScsCisgICAgJ2RlX2JlLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdkZV9CRS5JU084ODU5LTEnLAorICAgICdkZV9iZS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZGVfQkUuSVNPODg1OS0xNScsCisgICAgJ2RlX2JlLmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdkZV9CRS5JU084ODU5LTE1JywKKyAgICAnZGVfYmUudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2RlX0JFLlVURi04JywKKyAgICAnZGVfYmVAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0JFLklTTzg4NTktMTUnLAorICAgICdkZV9jaCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfQ0guSVNPODg1OS0xJywKKyAgICAnZGVfY2guaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0NILklTTzg4NTktMScsCisgICAgJ2RlX2NoLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdkZV9DSC5JU084ODU5LTE1JywKKyAgICAnZGVfY2hAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0NILklTTzg4NTktMTUnLAorICAgICdkZV9kZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfREUuSVNPODg1OS0xJywKKyAgICAnZGVfZGUuODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0RFLklTTzg4NTktMScsCisgICAgJ2RlX2RlLjg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdkZV9ERS5JU084ODU5LTE1JywKKyAgICAnZGVfZGUuODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgJ2RlX0RFLklTTzg4NTktMTUnLAorICAgICdkZV9kZS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZGVfREUuSVNPODg1OS0xJywKKyAgICAnZGVfZGUuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2RlX0RFLklTTzg4NTktMTUnLAorICAgICdkZV9kZS5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnZGVfREUuSVNPODg1OS0xNScsCisgICAgJ2RlX2RlLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdkZV9ERS5VVEYtOCcsCisgICAgJ2RlX2RlQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZV9ERS5JU084ODU5LTE1JywKKyAgICAnZGVfbHUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0xVLklTTzg4NTktMScsCisgICAgJ2RlX2x1Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdkZV9MVS5JU084ODU5LTEnLAorICAgICdkZV9sdS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZGVfTFUuSVNPODg1OS0xNScsCisgICAgJ2RlX2x1Lmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdkZV9MVS5JU084ODU5LTE1JywKKyAgICAnZGVfbHUudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2RlX0xVLlVURi04JywKKyAgICAnZGVfbHVAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0xVLklTTzg4NTktMTUnLAorICAgICdkZXV0c2NoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfREUuSVNPODg1OS0xJywKKyAgICAnZHV0Y2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25sX05MLklTTzg4NTktMScsCisgICAgJ2R1dGNoLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdubF9CRS5JU084ODU5LTEnLAorICAgICdlZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWVfRUUuSVNPODg1OS00JywKKyAgICAnZWVfZWUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VlX0VFLklTTzg4NTktNCcsCisgICAgJ2VlX2VlLmlzbzg4NTk0JzogICAgICAgICAgICAgICAgICAgICAgICdlZV9FRS5JU084ODU5LTQnLAorICAgICdlZXN0aSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXRfRUUuSVNPODg1OS0xJywKKyAgICAnZWwnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsX0dSLklTTzg4NTktNycsCisgICAgJ2VsX2dyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbF9HUi5JU084ODU5LTcnLAorICAgICdlbF9nci5pc284ODU5Nyc6ICAgICAgICAgICAgICAgICAgICAgICAnZWxfR1IuSVNPODg1OS03JywKKyAgICAnZWxfZ3JAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsX0dSLklTTzg4NTktMTUnLAorICAgICdlbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnZW4uaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMScsCisgICAgJ2VuX2F1JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9BVS5JU084ODU5LTEnLAorICAgICdlbl9hdS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZW5fQVUuSVNPODg1OS0xJywKKyAgICAnZW5fYmUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0JFLklTTzg4NTktMScsCisgICAgJ2VuX2JlQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9CRS5JU084ODU5LTE1JywKKyAgICAnZW5fYncnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0JXLklTTzg4NTktMScsCisgICAgJ2VuX2J3Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlbl9CVy5JU084ODU5LTEnLAorICAgICdlbl9jYSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fQ0EuSVNPODg1OS0xJywKKyAgICAnZW5fY2EuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0NBLklTTzg4NTktMScsCisgICAgJ2VuX2diJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9HQi5JU084ODU5LTEnLAorICAgICdlbl9nYi44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fR0IuSVNPODg1OS0xJywKKyAgICAnZW5fZ2IuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0dCLklTTzg4NTktMScsCisgICAgJ2VuX2diLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdlbl9HQi5JU084ODU5LTE1JywKKyAgICAnZW5fZ2JAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0dCLklTTzg4NTktMTUnLAorICAgICdlbl9oayc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fSEsuSVNPODg1OS0xJywKKyAgICAnZW5faGsuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0hLLklTTzg4NTktMScsCisgICAgJ2VuX2llJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9JRS5JU084ODU5LTEnLAorICAgICdlbl9pZS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZW5fSUUuSVNPODg1OS0xJywKKyAgICAnZW5faWUuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2VuX0lFLklTTzg4NTktMTUnLAorICAgICdlbl9pZS5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnZW5fSUUuSVNPODg1OS0xNScsCisgICAgJ2VuX2llLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdlbl9JRS5VVEYtOCcsCisgICAgJ2VuX2llQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9JRS5JU084ODU5LTE1JywKKyAgICAnZW5faW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0lOLklTTzg4NTktMScsCisgICAgJ2VuX256JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9OWi5JU084ODU5LTEnLAorICAgICdlbl9uei5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZW5fTlouSVNPODg1OS0xJywKKyAgICAnZW5fcGgnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1BILklTTzg4NTktMScsCisgICAgJ2VuX3BoLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlbl9QSC5JU084ODU5LTEnLAorICAgICdlbl9zZyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fU0cuSVNPODg1OS0xJywKKyAgICAnZW5fc2cuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1NHLklTTzg4NTktMScsCisgICAgJ2VuX3VrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9HQi5JU084ODU5LTEnLAorICAgICdlbl91cyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnZW5fdXMuODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMScsCisgICAgJ2VuX3VzLjg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTE1JywKKyAgICAnZW5fdXMuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMScsCisgICAgJ2VuX3VzLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTE1JywKKyAgICAnZW5fdXMuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMTUnLAorICAgICdlbl91c0BldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xNScsCisgICAgJ2VuX3VzQGV1cm9AZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTE1JywKKyAgICAnZW5femEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1pBLklTTzg4NTktMScsCisgICAgJ2VuX3phLjg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9aQS5JU084ODU5LTEnLAorICAgICdlbl96YS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZW5fWkEuSVNPODg1OS0xJywKKyAgICAnZW5femEuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2VuX1pBLklTTzg4NTktMTUnLAorICAgICdlbl96YUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fWkEuSVNPODg1OS0xNScsCisgICAgJ2VuX3p3JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9aVy5JU084ODU5LTEnLAorICAgICdlbl96dy5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZW5fWlcuSVNPODg1OS0xJywKKyAgICAnZW5nX2diJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0dCLklTTzg4NTktMScsCisgICAgJ2VuZ19nYi44ODU5JzogICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9HQi5JU084ODU5LTEnLAorICAgICdlbmdsaXNoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fRU4uSVNPODg1OS0xJywKKyAgICAnZW5nbGlzaC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgJ2VuX0VOLklTTzg4NTktMScsCisgICAgJ2VuZ2xpc2hfdWsnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9HQi5JU084ODU5LTEnLAorICAgICdlbmdsaXNoX3VrLjg4NTknOiAgICAgICAgICAgICAgICAgICAgICAnZW5fR0IuSVNPODg1OS0xJywKKyAgICAnZW5nbGlzaF91bml0ZWQtc3RhdGVzJzogICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMScsCisgICAgJ2VuZ2xpc2hfdW5pdGVkLXN0YXRlcy40MzcnOiAgICAgICAgICAgICdDJywKKyAgICAnZW5nbGlzaF91cyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMScsCisgICAgJ2VuZ2xpc2hfdXMuODg1OSc6ICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTEnLAorICAgICdlbmdsaXNoX3VzLmFzY2lpJzogICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnZW8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VvX1hYLklTTzg4NTktMycsCisgICAgJ2VvX2VvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlb19FTy5JU084ODU5LTMnLAorICAgICdlb19lby5pc284ODU5Myc6ICAgICAgICAgICAgICAgICAgICAgICAnZW9fRU8uSVNPODg1OS0zJywKKyAgICAnZW9feHgnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VvX1hYLklTTzg4NTktMycsCisgICAgJ2VvX3h4Lmlzbzg4NTkzJzogICAgICAgICAgICAgICAgICAgICAgICdlb19YWC5JU084ODU5LTMnLAorICAgICdlcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfRVMuSVNPODg1OS0xJywKKyAgICAnZXNfYXInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0FSLklTTzg4NTktMScsCisgICAgJ2VzX2FyLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19BUi5JU084ODU5LTEnLAorICAgICdlc19ibyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfQk8uSVNPODg1OS0xJywKKyAgICAnZXNfYm8uaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0JPLklTTzg4NTktMScsCisgICAgJ2VzX2NsJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19DTC5JU084ODU5LTEnLAorICAgICdlc19jbC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXNfQ0wuSVNPODg1OS0xJywKKyAgICAnZXNfY28nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0NPLklTTzg4NTktMScsCisgICAgJ2VzX2NvLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19DTy5JU084ODU5LTEnLAorICAgICdlc19jcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfQ1IuSVNPODg1OS0xJywKKyAgICAnZXNfY3IuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0NSLklTTzg4NTktMScsCisgICAgJ2VzX2RvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19ETy5JU084ODU5LTEnLAorICAgICdlc19kby5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXNfRE8uSVNPODg1OS0xJywKKyAgICAnZXNfZWMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0VDLklTTzg4NTktMScsCisgICAgJ2VzX2VjLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19FQy5JU084ODU5LTEnLAorICAgICdlc19lcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfRVMuSVNPODg1OS0xJywKKyAgICAnZXNfZXMuODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0VTLklTTzg4NTktMScsCisgICAgJ2VzX2VzLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19FUy5JU084ODU5LTEnLAorICAgICdlc19lcy5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZXNfRVMuSVNPODg1OS0xNScsCisgICAgJ2VzX2VzLmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdlc19FUy5JU084ODU5LTE1JywKKyAgICAnZXNfZXMudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2VzX0VTLlVURi04JywKKyAgICAnZXNfZXNAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0VTLklTTzg4NTktMTUnLAorICAgICdlc19ndCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfR1QuSVNPODg1OS0xJywKKyAgICAnZXNfZ3QuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0dULklTTzg4NTktMScsCisgICAgJ2VzX2huJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19ITi5JU084ODU5LTEnLAorICAgICdlc19obi5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXNfSE4uSVNPODg1OS0xJywKKyAgICAnZXNfbXgnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX01YLklTTzg4NTktMScsCisgICAgJ2VzX214Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19NWC5JU084ODU5LTEnLAorICAgICdlc19uaSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfTkkuSVNPODg1OS0xJywKKyAgICAnZXNfbmkuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX05JLklTTzg4NTktMScsCisgICAgJ2VzX3BhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19QQS5JU084ODU5LTEnLAorICAgICdlc19wYS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXNfUEEuSVNPODg1OS0xJywKKyAgICAnZXNfcGEuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2VzX1BBLklTTzg4NTktMTUnLAorICAgICdlc19wYUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfUEEuSVNPODg1OS0xNScsCisgICAgJ2VzX3BlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19QRS5JU084ODU5LTEnLAorICAgICdlc19wZS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXNfUEUuSVNPODg1OS0xJywKKyAgICAnZXNfcGUuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2VzX1BFLklTTzg4NTktMTUnLAorICAgICdlc19wZUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfUEUuSVNPODg1OS0xNScsCisgICAgJ2VzX3ByJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19QUi5JU084ODU5LTEnLAorICAgICdlc19wci5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXNfUFIuSVNPODg1OS0xJywKKyAgICAnZXNfcHknOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1BZLklTTzg4NTktMScsCisgICAgJ2VzX3B5Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19QWS5JU084ODU5LTEnLAorICAgICdlc19weS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZXNfUFkuSVNPODg1OS0xNScsCisgICAgJ2VzX3B5QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19QWS5JU084ODU5LTE1JywKKyAgICAnZXNfc3YnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1NWLklTTzg4NTktMScsCisgICAgJ2VzX3N2Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19TVi5JU084ODU5LTEnLAorICAgICdlc19zdi5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZXNfU1YuSVNPODg1OS0xNScsCisgICAgJ2VzX3N2QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19TVi5JU084ODU5LTE1JywKKyAgICAnZXNfdXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1VTLklTTzg4NTktMScsCisgICAgJ2VzX3VzLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19VUy5JU084ODU5LTEnLAorICAgICdlc191eSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfVVkuSVNPODg1OS0xJywKKyAgICAnZXNfdXkuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1VZLklTTzg4NTktMScsCisgICAgJ2VzX3V5Lmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdlc19VWS5JU084ODU5LTE1JywKKyAgICAnZXNfdXlAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1VZLklTTzg4NTktMTUnLAorICAgICdlc192ZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfVkUuSVNPODg1OS0xJywKKyAgICAnZXNfdmUuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1ZFLklTTzg4NTktMScsCisgICAgJ2VzX3ZlLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdlc19WRS5JU084ODU5LTE1JywKKyAgICAnZXNfdmVAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1ZFLklTTzg4NTktMTUnLAorICAgICdlc3Rvbmlhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXRfRUUuSVNPODg1OS0xJywKKyAgICAnZXQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V0X0VFLklTTzg4NTktMTUnLAorICAgICdldF9lZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXRfRUUuSVNPODg1OS0xNScsCisgICAgJ2V0X2VlLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdldF9FRS5JU084ODU5LTEnLAorICAgICdldF9lZS5pc284ODU5MTMnOiAgICAgICAgICAgICAgICAgICAgICAnZXRfRUUuSVNPODg1OS0xMycsCisgICAgJ2V0X2VlLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdldF9FRS5JU084ODU5LTE1JywKKyAgICAnZXRfZWUuaXNvODg1OTQnOiAgICAgICAgICAgICAgICAgICAgICAgJ2V0X0VFLklTTzg4NTktNCcsCisgICAgJ2V0X2VlQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdldF9FRS5JU084ODU5LTE1JywKKyAgICAnZXUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V1X0VTLklTTzg4NTktMScsCisgICAgJ2V1X2VzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldV9FUy5JU084ODU5LTEnLAorICAgICdldV9lcy5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXVfRVMuSVNPODg1OS0xJywKKyAgICAnZXVfZXMuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2V1X0VTLklTTzg4NTktMTUnLAorICAgICdldV9lcy5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnZXVfRVMuSVNPODg1OS0xNScsCisgICAgJ2V1X2VzLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdldV9FUy5VVEYtOCcsCisgICAgJ2V1X2VzQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdldV9FUy5JU084ODU5LTE1JywKKyAgICAnZmEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhX0lSLlVURi04JywKKyAgICAnZmFfaXInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhX0lSLlVURi04JywKKyAgICAnZmFfaXIuaXNpcmkzMzQyJzogICAgICAgICAgICAgICAgICAgICAgJ2ZhX0lSLklTSVJJLTMzNDInLAorICAgICdmaSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlfRkkuSVNPODg1OS0xNScsCisgICAgJ2ZpLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdmaV9GSS5JU084ODU5LTE1JywKKyAgICAnZmlfZmknOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpX0ZJLklTTzg4NTktMTUnLAorICAgICdmaV9maS44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlfRkkuSVNPODg1OS0xJywKKyAgICAnZmlfZmkuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2ZpX0ZJLklTTzg4NTktMScsCisgICAgJ2ZpX2ZpLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdmaV9GSS5JU084ODU5LTE1JywKKyAgICAnZmlfZmkuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ2ZpX0ZJLklTTzg4NTktMTUnLAorICAgICdmaV9maS51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnZmlfRkkuVVRGLTgnLAorICAgICdmaV9maUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlfRkkuSVNPODg1OS0xNScsCisgICAgJ2Zpbm5pc2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaV9GSS5JU084ODU5LTEnLAorICAgICdmaW5uaXNoLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAnZmlfRkkuSVNPODg1OS0xJywKKyAgICAnZm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvX0ZPLklTTzg4NTktMScsCisgICAgJ2ZvX2ZvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb19GTy5JU084ODU5LTEnLAorICAgICdmb19mby5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZm9fRk8uSVNPODg1OS0xJywKKyAgICAnZm9fZm8uaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2ZvX0ZPLklTTzg4NTktMTUnLAorICAgICdmb19mb0BldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9fRk8uSVNPODg1OS0xNScsCisgICAgJ2ZyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9GUi5JU084ODU5LTEnLAorICAgICdmci5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfRlIuSVNPODg1OS0xNScsCisgICAgJ2ZyX2JlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9CRS5JU084ODU5LTEnLAorICAgICdmcl9iZS44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfQkUuSVNPODg1OS0xJywKKyAgICAnZnJfYmUuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0JFLklTTzg4NTktMScsCisgICAgJ2ZyX2JlLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdmcl9CRS5JU084ODU5LTE1JywKKyAgICAnZnJfYmUuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ2ZyX0JFLklTTzg4NTktMTUnLAorICAgICdmcl9iZS51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnZnJfQkUuVVRGLTgnLAorICAgICdmcl9iZUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfQkUuSVNPODg1OS0xNScsCisgICAgJ2ZyX2NhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9DQS5JU084ODU5LTEnLAorICAgICdmcl9jYS44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfQ0EuSVNPODg1OS0xJywKKyAgICAnZnJfY2EuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0NBLklTTzg4NTktMScsCisgICAgJ2ZyX2NhLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdmcl9DQS5JU084ODU5LTE1JywKKyAgICAnZnJfY2FAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0NBLklTTzg4NTktMTUnLAorICAgICdmcl9jaCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfQ0guSVNPODg1OS0xJywKKyAgICAnZnJfY2guODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0NILklTTzg4NTktMScsCisgICAgJ2ZyX2NoLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdmcl9DSC5JU084ODU5LTEnLAorICAgICdmcl9jaC5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZnJfQ0guSVNPODg1OS0xNScsCisgICAgJ2ZyX2NoQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9DSC5JU084ODU5LTE1JywKKyAgICAnZnJfZnInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0ZSLklTTzg4NTktMScsCisgICAgJ2ZyX2ZyLjg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9GUi5JU084ODU5LTEnLAorICAgICdmcl9mci5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZnJfRlIuSVNPODg1OS0xJywKKyAgICAnZnJfZnIuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2ZyX0ZSLklTTzg4NTktMTUnLAorICAgICdmcl9mci5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnZnJfRlIuSVNPODg1OS0xNScsCisgICAgJ2ZyX2ZyLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdmcl9GUi5VVEYtOCcsCisgICAgJ2ZyX2ZyQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9GUi5JU084ODU5LTE1JywKKyAgICAnZnJfbHUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0xVLklTTzg4NTktMScsCisgICAgJ2ZyX2x1Ljg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9MVS5JU084ODU5LTEnLAorICAgICdmcl9sdS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZnJfTFUuSVNPODg1OS0xJywKKyAgICAnZnJfbHUuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2ZyX0xVLklTTzg4NTktMTUnLAorICAgICdmcl9sdS5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnZnJfTFUuSVNPODg1OS0xNScsCisgICAgJ2ZyX2x1LnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdmcl9MVS5VVEYtOCcsCisgICAgJ2ZyX2x1QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9MVS5JU084ODU5LTE1JywKKyAgICAnZnJhblx4ZTdhaXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0ZSLklTTzg4NTktMScsCisgICAgJ2ZyZV9mcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9GUi5JU084ODU5LTEnLAorICAgICdmcmVfZnIuODg1OSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfRlIuSVNPODg1OS0xJywKKyAgICAnZnJlbmNoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0ZSLklTTzg4NTktMScsCisgICAgJ2ZyZW5jaC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICdmcl9DSC5JU084ODU5LTEnLAorICAgICdmcmVuY2hfZnJhbmNlJzogICAgICAgICAgICAgICAgICAgICAgICAnZnJfRlIuSVNPODg1OS0xJywKKyAgICAnZnJlbmNoX2ZyYW5jZS44ODU5JzogICAgICAgICAgICAgICAgICAgJ2ZyX0ZSLklTTzg4NTktMScsCisgICAgJ2dhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnYV9JRS5JU084ODU5LTEnLAorICAgICdnYV9pZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2FfSUUuSVNPODg1OS0xJywKKyAgICAnZ2FfaWUuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2dhX0lFLklTTzg4NTktMScsCisgICAgJ2dhX2llLmlzbzg4NTkxNCc6ICAgICAgICAgICAgICAgICAgICAgICdnYV9JRS5JU084ODU5LTE0JywKKyAgICAnZ2FfaWUuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2dhX0lFLklTTzg4NTktMTUnLAorICAgICdnYV9pZS5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnZ2FfSUUuSVNPODg1OS0xNScsCisgICAgJ2dhX2llLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdnYV9JRS5VVEYtOCcsCisgICAgJ2dhX2llQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdnYV9JRS5JU084ODU5LTE1JywKKyAgICAnZ2FsZWdvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsX0VTLklTTzg4NTktMScsCisgICAgJ2dhbGljaWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbF9FUy5JU084ODU5LTEnLAorICAgICdnZCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2RfR0IuSVNPODg1OS0xJywKKyAgICAnZ2RfZ2InOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dkX0dCLklTTzg4NTktMScsCisgICAgJ2dkX2diLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdnZF9HQi5JU084ODU5LTEnLAorICAgICdnZF9nYi5pc284ODU5MTQnOiAgICAgICAgICAgICAgICAgICAgICAnZ2RfR0IuSVNPODg1OS0xNCcsCisgICAgJ2dkX2diLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdnZF9HQi5JU084ODU5LTE1JywKKyAgICAnZ2RfZ2JAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dkX0dCLklTTzg4NTktMTUnLAorICAgICdnZXJfZGUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfREUuSVNPODg1OS0xJywKKyAgICAnZ2VyX2RlLjg4NTknOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0RFLklTTzg4NTktMScsCisgICAgJ2dlcm1hbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZV9ERS5JU084ODU5LTEnLAorICAgICdnZXJtYW4uaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAnZGVfQ0guSVNPODg1OS0xJywKKyAgICAnZ2VybWFuX2dlcm1hbnknOiAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0RFLklTTzg4NTktMScsCisgICAgJ2dlcm1hbl9nZXJtYW55Ljg4NTknOiAgICAgICAgICAgICAgICAgICdkZV9ERS5JU084ODU5LTEnLAorICAgICdnbCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xfRVMuSVNPODg1OS0xJywKKyAgICAnZ2xfZXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsX0VTLklTTzg4NTktMScsCisgICAgJ2dsX2VzLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdnbF9FUy5JU084ODU5LTEnLAorICAgICdnbF9lcy5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZ2xfRVMuSVNPODg1OS0xNScsCisgICAgJ2dsX2VzLmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdnbF9FUy5JU084ODU5LTE1JywKKyAgICAnZ2xfZXMudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2dsX0VTLlVURi04JywKKyAgICAnZ2xfZXNAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsX0VTLklTTzg4NTktMTUnLAorICAgICdncmVlayc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxfR1IuSVNPODg1OS03JywKKyAgICAnZ3JlZWsuaXNvODg1OTcnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VsX0dSLklTTzg4NTktNycsCisgICAgJ2d1X2luJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdndV9JTi5VVEYtOCcsCisgICAgJ2d2JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdndl9HQi5JU084ODU5LTEnLAorICAgICdndl9nYic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3ZfR0IuSVNPODg1OS0xJywKKyAgICAnZ3ZfZ2IuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2d2X0dCLklTTzg4NTktMScsCisgICAgJ2d2X2diLmlzbzg4NTkxNCc6ICAgICAgICAgICAgICAgICAgICAgICdndl9HQi5JU084ODU5LTE0JywKKyAgICAnZ3ZfZ2IuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2d2X0dCLklTTzg4NTktMTUnLAorICAgICdndl9nYkBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3ZfR0IuSVNPODg1OS0xNScsCisgICAgJ2hlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZV9JTC5JU084ODU5LTgnLAorICAgICdoZV9pbCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVfSUwuSVNPODg1OS04JywKKyAgICAnaGVfaWwuY3AxMjU1JzogICAgICAgICAgICAgICAgICAgICAgICAgJ2hlX0lMLkNQMTI1NScsCisgICAgJ2hlX2lsLmlzbzg4NTk4JzogICAgICAgICAgICAgICAgICAgICAgICdoZV9JTC5JU084ODU5LTgnLAorICAgICdoZV9pbC5taWNyb3NvZnRjcDEyNTUnOiAgICAgICAgICAgICAgICAnaGVfSUwuQ1AxMjU1JywKKyAgICAnaGVicmV3JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l3X0lMLklTTzg4NTktOCcsCisgICAgJ2hlYnJldy5pc284ODU5OCc6ICAgICAgICAgICAgICAgICAgICAgICdpd19JTC5JU084ODU5LTgnLAorICAgICdoaSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGlfSU4uSVNDSUktREVWJywKKyAgICAnaGlfaW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hpX0lOLklTQ0lJLURFVicsCisgICAgJ2hpX2luLmlzY2lpZGV2JzogICAgICAgICAgICAgICAgICAgICAgICdoaV9JTi5JU0NJSS1ERVYnLAorICAgICdobmUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG5lX0lOLlVURi04JywKKyAgICAnaHInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hyX0hSLklTTzg4NTktMicsCisgICAgJ2hyX2hyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdocl9IUi5JU084ODU5LTInLAorICAgICdocl9oci5pc284ODU5Mic6ICAgICAgICAgICAgICAgICAgICAgICAnaHJfSFIuSVNPODg1OS0yJywKKyAgICAnaHJ2YXRza2knOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hyX0hSLklTTzg4NTktMicsCisgICAgJ2h1JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdodV9IVS5JU084ODU5LTInLAorICAgICdodV9odSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHVfSFUuSVNPODg1OS0yJywKKyAgICAnaHVfaHUuaXNvODg1OTInOiAgICAgICAgICAgICAgICAgICAgICAgJ2h1X0hVLklTTzg4NTktMicsCisgICAgJ2h1bmdhcmlhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdodV9IVS5JU084ODU5LTInLAorICAgICdpY2VsYW5kaWMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNfSVMuSVNPODg1OS0xJywKKyAgICAnaWNlbGFuZGljLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgJ2lzX0lTLklTTzg4NTktMScsCisgICAgJ2lkJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZF9JRC5JU084ODU5LTEnLAorICAgICdpZF9pZCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWRfSUQuSVNPODg1OS0xJywKKyAgICAnaW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkX0lELklTTzg4NTktMScsCisgICAgJ2luX2lkJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZF9JRC5JU084ODU5LTEnLAorICAgICdpcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNfSVMuSVNPODg1OS0xJywKKyAgICAnaXNfaXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzX0lTLklTTzg4NTktMScsCisgICAgJ2lzX2lzLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdpc19JUy5JU084ODU5LTEnLAorICAgICdpc19pcy5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnaXNfSVMuSVNPODg1OS0xNScsCisgICAgJ2lzX2lzQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc19JUy5JU084ODU5LTE1JywKKyAgICAnaXNvLTg4NTktMSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMScsCisgICAgJ2lzby04ODU5LTE1JzogICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTE1JywKKyAgICAnaXNvODg1OS0xJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMScsCisgICAgJ2lzbzg4NTktMTUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTE1JywKKyAgICAnaXNvXzg4NTlfMSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMScsCisgICAgJ2lzb184ODU5XzE1JzogICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTE1JywKKyAgICAnaXQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0X0lULklTTzg4NTktMScsCisgICAgJ2l0Lmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdpdF9JVC5JU084ODU5LTE1JywKKyAgICAnaXRfY2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0X0NILklTTzg4NTktMScsCisgICAgJ2l0X2NoLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdpdF9DSC5JU084ODU5LTEnLAorICAgICdpdF9jaC5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnaXRfQ0guSVNPODg1OS0xNScsCisgICAgJ2l0X2NoQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdpdF9DSC5JU084ODU5LTE1JywKKyAgICAnaXRfaXQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0X0lULklTTzg4NTktMScsCisgICAgJ2l0X2l0Ljg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdpdF9JVC5JU084ODU5LTEnLAorICAgICdpdF9pdC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnaXRfSVQuSVNPODg1OS0xJywKKyAgICAnaXRfaXQuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2l0X0lULklTTzg4NTktMTUnLAorICAgICdpdF9pdC5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnaXRfSVQuSVNPODg1OS0xNScsCisgICAgJ2l0X2l0LnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdpdF9JVC5VVEYtOCcsCisgICAgJ2l0X2l0QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdpdF9JVC5JU084ODU5LTE1JywKKyAgICAnaXRhbGlhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0X0lULklTTzg4NTktMScsCisgICAgJ2l0YWxpYW4uaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICdpdF9JVC5JU084ODU5LTEnLAorICAgICdpdSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXVfQ0EuTlVOQUNPTS04JywKKyAgICAnaXVfY2EnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l1X0NBLk5VTkFDT00tOCcsCisgICAgJ2l1X2NhLm51bmFjb204JzogICAgICAgICAgICAgICAgICAgICAgICdpdV9DQS5OVU5BQ09NLTgnLAorICAgICdpdyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVfSUwuSVNPODg1OS04JywKKyAgICAnaXdfaWwnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlX0lMLklTTzg4NTktOCcsCisgICAgJ2l3X2lsLmlzbzg4NTk4JzogICAgICAgICAgICAgICAgICAgICAgICdoZV9JTC5JU084ODU5LTgnLAorICAgICdqYSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuZXVjSlAnLAorICAgICdqYS5qaXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuSklTNycsCisgICAgJ2phLnNqaXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5TSklTJywKKyAgICAnamFfanAnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2phX0pQLmV1Y0pQJywKKyAgICAnamFfanAuYWplYyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2phX0pQLmV1Y0pQJywKKyAgICAnamFfanAuZXVjJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2phX0pQLmV1Y0pQJywKKyAgICAnamFfanAuZXVjanAnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2phX0pQLmV1Y0pQJywKKyAgICAnamFfanAuaXNvLTIwMjItanAnOiAgICAgICAgICAgICAgICAgICAgJ2phX0pQLkpJUzcnLAorICAgICdqYV9qcC5pc28yMDIyanAnOiAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuSklTNycsCisgICAgJ2phX2pwLmppcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5KSVM3JywKKyAgICAnamFfanAuamlzNyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2phX0pQLkpJUzcnLAorICAgICdqYV9qcC5tc2NvZGUnOiAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuU0pJUycsCisgICAgJ2phX2pwLnBjayc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5TSklTJywKKyAgICAnamFfanAuc2ppcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2phX0pQLlNKSVMnLAorICAgICdqYV9qcC51amlzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuZXVjSlAnLAorICAgICdqYXBhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuZXVjSlAnLAorICAgICdqYXBhbmVzZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuZXVjSlAnLAorICAgICdqYXBhbmVzZS1ldWMnOiAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuZXVjSlAnLAorICAgICdqYXBhbmVzZS5ldWMnOiAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuZXVjSlAnLAorICAgICdqYXBhbmVzZS5zamlzJzogICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuU0pJUycsCisgICAgJ2pwX2pwJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5ldWNKUCcsCisgICAgJ2thJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrYV9HRS5HRU9SR0lBTi1BQ0FERU1ZJywKKyAgICAna2FfZ2UnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2thX0dFLkdFT1JHSUFOLUFDQURFTVknLAorICAgICdrYV9nZS5nZW9yZ2lhbmFjYWRlbXknOiAgICAgICAgICAgICAgICAna2FfR0UuR0VPUkdJQU4tQUNBREVNWScsCisgICAgJ2thX2dlLmdlb3JnaWFucHMnOiAgICAgICAgICAgICAgICAgICAgICdrYV9HRS5HRU9SR0lBTi1QUycsCisgICAgJ2thX2dlLmdlb3JnaWFucnMnOiAgICAgICAgICAgICAgICAgICAgICdrYV9HRS5HRU9SR0lBTi1BQ0FERU1ZJywKKyAgICAna2wnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tsX0dMLklTTzg4NTktMScsCisgICAgJ2tsX2dsJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrbF9HTC5JU084ODU5LTEnLAorICAgICdrbF9nbC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAna2xfR0wuSVNPODg1OS0xJywKKyAgICAna2xfZ2wuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2tsX0dMLklTTzg4NTktMTUnLAorICAgICdrbF9nbEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAna2xfR0wuSVNPODg1OS0xNScsCisgICAgJ2ttX2toJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrbV9LSC5VVEYtOCcsCisgICAgJ2tuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrbl9JTi5VVEYtOCcsCisgICAgJ2tuX2luJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrbl9JTi5VVEYtOCcsCisgICAgJ2tvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrb19LUi5ldWNLUicsCisgICAgJ2tvX2tyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrb19LUi5ldWNLUicsCisgICAgJ2tvX2tyLmV1Yyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrb19LUi5ldWNLUicsCisgICAgJ2tvX2tyLmV1Y2tyJzogICAgICAgICAgICAgICAgICAgICAgICAgICdrb19LUi5ldWNLUicsCisgICAgJ2tvcmVhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrb19LUi5ldWNLUicsCisgICAgJ2tvcmVhbi5ldWMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdrb19LUi5ldWNLUicsCisgICAgJ2tzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrc19JTi5VVEYtOCcsCisgICAgJ2tzX2luQGRldmFuYWdhcmknOiAgICAgICAgICAgICAgICAgICAgICdrc19JTkBkZXZhbmFnYXJpLlVURi04JywKKyAgICAna3cnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2t3X0dCLklTTzg4NTktMScsCisgICAgJ2t3X2diJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdrd19HQi5JU084ODU5LTEnLAorICAgICdrd19nYi5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAna3dfR0IuSVNPODg1OS0xJywKKyAgICAna3dfZ2IuaXNvODg1OTE0JzogICAgICAgICAgICAgICAgICAgICAgJ2t3X0dCLklTTzg4NTktMTQnLAorICAgICdrd19nYi5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAna3dfR0IuSVNPODg1OS0xNScsCisgICAgJ2t3X2diQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdrd19HQi5JU084ODU5LTE1JywKKyAgICAna3knOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2t5X0tHLlVURi04JywKKyAgICAna3lfa2cnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2t5X0tHLlVURi04JywKKyAgICAnbGl0aHVhbmlhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2x0X0xULklTTzg4NTktMTMnLAorICAgICdsbyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9fTEEuTVVMRUxBTy0xJywKKyAgICAnbG9fbGEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvX0xBLk1VTEVMQU8tMScsCisgICAgJ2xvX2xhLmNwMTEzMyc6ICAgICAgICAgICAgICAgICAgICAgICAgICdsb19MQS5JQk0tQ1AxMTMzJywKKyAgICAnbG9fbGEuaWJtY3AxMTMzJzogICAgICAgICAgICAgICAgICAgICAgJ2xvX0xBLklCTS1DUDExMzMnLAorICAgICdsb19sYS5tdWxlbGFvMSc6ICAgICAgICAgICAgICAgICAgICAgICAnbG9fTEEuTVVMRUxBTy0xJywKKyAgICAnbHQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2x0X0xULklTTzg4NTktMTMnLAorICAgICdsdF9sdCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbHRfTFQuSVNPODg1OS0xMycsCisgICAgJ2x0X2x0Lmlzbzg4NTkxMyc6ICAgICAgICAgICAgICAgICAgICAgICdsdF9MVC5JU084ODU5LTEzJywKKyAgICAnbHRfbHQuaXNvODg1OTQnOiAgICAgICAgICAgICAgICAgICAgICAgJ2x0X0xULklTTzg4NTktNCcsCisgICAgJ2x2JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsdl9MVi5JU084ODU5LTEzJywKKyAgICAnbHZfbHYnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2x2X0xWLklTTzg4NTktMTMnLAorICAgICdsdl9sdi5pc284ODU5MTMnOiAgICAgICAgICAgICAgICAgICAgICAnbHZfTFYuSVNPODg1OS0xMycsCisgICAgJ2x2X2x2Lmlzbzg4NTk0JzogICAgICAgICAgICAgICAgICAgICAgICdsdl9MVi5JU084ODU5LTQnLAorICAgICdtYWknOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFpX0lOLlVURi04JywKKyAgICAnbWknOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pX05aLklTTzg4NTktMScsCisgICAgJ21pX256JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaV9OWi5JU084ODU5LTEnLAorICAgICdtaV9uei5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnbWlfTlouSVNPODg1OS0xJywKKyAgICAnbWsnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21rX01LLklTTzg4NTktNScsCisgICAgJ21rX21rJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdta19NSy5JU084ODU5LTUnLAorICAgICdta19tay5jcDEyNTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAnbWtfTUsuQ1AxMjUxJywKKyAgICAnbWtfbWsuaXNvODg1OTUnOiAgICAgICAgICAgICAgICAgICAgICAgJ21rX01LLklTTzg4NTktNScsCisgICAgJ21rX21rLm1pY3Jvc29mdGNwMTI1MSc6ICAgICAgICAgICAgICAgICdta19NSy5DUDEyNTEnLAorICAgICdtbCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWxfSU4uVVRGLTgnLAorICAgICdtcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXJfSU4uVVRGLTgnLAorICAgICdtcl9pbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXJfSU4uVVRGLTgnLAorICAgICdtcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXNfTVkuSVNPODg1OS0xJywKKyAgICAnbXNfbXknOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21zX01ZLklTTzg4NTktMScsCisgICAgJ21zX215Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdtc19NWS5JU084ODU5LTEnLAorICAgICdtdCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXRfTVQuSVNPODg1OS0zJywKKyAgICAnbXRfbXQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ210X01ULklTTzg4NTktMycsCisgICAgJ210X210Lmlzbzg4NTkzJzogICAgICAgICAgICAgICAgICAgICAgICdtdF9NVC5JU084ODU5LTMnLAorICAgICduYic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmJfTk8uSVNPODg1OS0xJywKKyAgICAnbmJfbm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25iX05PLklTTzg4NTktMScsCisgICAgJ25iX25vLjg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICduYl9OTy5JU084ODU5LTEnLAorICAgICduYl9uby5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnbmJfTk8uSVNPODg1OS0xJywKKyAgICAnbmJfbm8uaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ25iX05PLklTTzg4NTktMTUnLAorICAgICduYl9ub0BldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnbmJfTk8uSVNPODg1OS0xNScsCisgICAgJ25sJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdubF9OTC5JU084ODU5LTEnLAorICAgICdubC5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAgICAnbmxfTkwuSVNPODg1OS0xNScsCisgICAgJ25sX2JlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdubF9CRS5JU084ODU5LTEnLAorICAgICdubF9iZS44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnbmxfQkUuSVNPODg1OS0xJywKKyAgICAnbmxfYmUuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ25sX0JFLklTTzg4NTktMScsCisgICAgJ25sX2JlLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdubF9CRS5JU084ODU5LTE1JywKKyAgICAnbmxfYmUuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ25sX0JFLklTTzg4NTktMTUnLAorICAgICdubF9iZS51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnbmxfQkUuVVRGLTgnLAorICAgICdubF9iZUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnbmxfQkUuSVNPODg1OS0xNScsCisgICAgJ25sX25sJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdubF9OTC5JU084ODU5LTEnLAorICAgICdubF9ubC44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnbmxfTkwuSVNPODg1OS0xJywKKyAgICAnbmxfbmwuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ25sX05MLklTTzg4NTktMScsCisgICAgJ25sX25sLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdubF9OTC5JU084ODU5LTE1JywKKyAgICAnbmxfbmwuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ25sX05MLklTTzg4NTktMTUnLAorICAgICdubF9ubC51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnbmxfTkwuVVRGLTgnLAorICAgICdubF9ubEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnbmxfTkwuSVNPODg1OS0xNScsCisgICAgJ25uJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdubl9OTy5JU084ODU5LTEnLAorICAgICdubl9ubyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm5fTk8uSVNPODg1OS0xJywKKyAgICAnbm5fbm8uODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ25uX05PLklTTzg4NTktMScsCisgICAgJ25uX25vLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdubl9OTy5JU084ODU5LTEnLAorICAgICdubl9uby5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnbm5fTk8uSVNPODg1OS0xNScsCisgICAgJ25uX25vQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdubl9OTy5JU084ODU5LTE1JywKKyAgICAnbm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vX05PLklTTzg4NTktMScsCisgICAgJ25vQG55bm9yc2snOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdueV9OTy5JU084ODU5LTEnLAorICAgICdub19ubyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9fTk8uSVNPODg1OS0xJywKKyAgICAnbm9fbm8uODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vX05PLklTTzg4NTktMScsCisgICAgJ25vX25vLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdub19OTy5JU084ODU5LTEnLAorICAgICdub19uby5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnbm9fTk8uSVNPODg1OS0xNScsCisgICAgJ25vX25vLmlzbzg4NTkxQGJva21hbCc6ICAgICAgICAgICAgICAgICdub19OTy5JU084ODU5LTEnLAorICAgICdub19uby5pc284ODU5MUBueW5vcnNrJzogICAgICAgICAgICAgICAnbm9fTk8uSVNPODg1OS0xJywKKyAgICAnbm9fbm9AZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vX05PLklTTzg4NTktMTUnLAorICAgICdub3J3ZWdpYW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9fTk8uSVNPODg1OS0xJywKKyAgICAnbm9yd2VnaWFuLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgJ25vX05PLklTTzg4NTktMScsCisgICAgJ25yJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICducl9aQS5JU084ODU5LTEnLAorICAgICducl96YSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnJfWkEuSVNPODg1OS0xJywKKyAgICAnbnJfemEuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ25yX1pBLklTTzg4NTktMScsCisgICAgJ25zbyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduc29fWkEuSVNPODg1OS0xNScsCisgICAgJ25zb196YSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduc29fWkEuSVNPODg1OS0xNScsCisgICAgJ25zb196YS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICduc29fWkEuSVNPODg1OS0xNScsCisgICAgJ255JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdueV9OTy5JU084ODU5LTEnLAorICAgICdueV9ubyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnlfTk8uSVNPODg1OS0xJywKKyAgICAnbnlfbm8uODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ255X05PLklTTzg4NTktMScsCisgICAgJ255X25vLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdueV9OTy5JU084ODU5LTEnLAorICAgICdueV9uby5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnbnlfTk8uSVNPODg1OS0xNScsCisgICAgJ255X25vQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdueV9OTy5JU084ODU5LTE1JywKKyAgICAnbnlub3Jzayc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25uX05PLklTTzg4NTktMScsCisgICAgJ29jJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvY19GUi5JU084ODU5LTEnLAorICAgICdvY19mcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2NfRlIuSVNPODg1OS0xJywKKyAgICAnb2NfZnIuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ29jX0ZSLklTTzg4NTktMScsCisgICAgJ29jX2ZyLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdvY19GUi5JU084ODU5LTE1JywKKyAgICAnb2NfZnJAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29jX0ZSLklTTzg4NTktMTUnLAorICAgICdvcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JfSU4uVVRGLTgnLAorICAgICdwYSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFfSU4uVVRGLTgnLAorICAgICdwYV9pbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFfSU4uVVRGLTgnLAorICAgICdwZCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGRfVVMuSVNPODg1OS0xJywKKyAgICAncGRfZGUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BkX0RFLklTTzg4NTktMScsCisgICAgJ3BkX2RlLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdwZF9ERS5JU084ODU5LTEnLAorICAgICdwZF9kZS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAncGRfREUuSVNPODg1OS0xNScsCisgICAgJ3BkX2RlQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwZF9ERS5JU084ODU5LTE1JywKKyAgICAncGRfdXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BkX1VTLklTTzg4NTktMScsCisgICAgJ3BkX3VzLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdwZF9VUy5JU084ODU5LTEnLAorICAgICdwZF91cy5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAncGRfVVMuSVNPODg1OS0xNScsCisgICAgJ3BkX3VzQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwZF9VUy5JU084ODU5LTE1JywKKyAgICAncGgnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BoX1BILklTTzg4NTktMScsCisgICAgJ3BoX3BoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwaF9QSC5JU084ODU5LTEnLAorICAgICdwaF9waC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAncGhfUEguSVNPODg1OS0xJywKKyAgICAncGwnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsX1BMLklTTzg4NTktMicsCisgICAgJ3BsX3BsJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbF9QTC5JU084ODU5LTInLAorICAgICdwbF9wbC5pc284ODU5Mic6ICAgICAgICAgICAgICAgICAgICAgICAncGxfUEwuSVNPODg1OS0yJywKKyAgICAncG9saXNoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsX1BMLklTTzg4NTktMicsCisgICAgJ3BvcnR1Z3Vlc2UnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdF9QVC5JU084ODU5LTEnLAorICAgICdwb3J0dWd1ZXNlLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAncHRfUFQuSVNPODg1OS0xJywKKyAgICAncG9ydHVndWVzZV9icmF6aWwnOiAgICAgICAgICAgICAgICAgICAgJ3B0X0JSLklTTzg4NTktMScsCisgICAgJ3BvcnR1Z3Vlc2VfYnJhemlsLjg4NTknOiAgICAgICAgICAgICAgICdwdF9CUi5JU084ODU5LTEnLAorICAgICdwb3NpeCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycsCisgICAgJ3Bvc2l4LXV0ZjInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJywKKyAgICAncHAnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BwX0FOLklTTzg4NTktMScsCisgICAgJ3BwX2FuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcF9BTi5JU084ODU5LTEnLAorICAgICdwcF9hbi5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAncHBfQU4uSVNPODg1OS0xJywKKyAgICAncHQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B0X1BULklTTzg4NTktMScsCisgICAgJ3B0Lmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdwdF9QVC5JU084ODU5LTE1JywKKyAgICAncHRfYnInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B0X0JSLklTTzg4NTktMScsCisgICAgJ3B0X2JyLjg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdwdF9CUi5JU084ODU5LTEnLAorICAgICdwdF9ici5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAncHRfQlIuSVNPODg1OS0xJywKKyAgICAncHRfYnIuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ3B0X0JSLklTTzg4NTktMTUnLAorICAgICdwdF9ickBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAncHRfQlIuSVNPODg1OS0xNScsCisgICAgJ3B0X3B0JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdF9QVC5JU084ODU5LTEnLAorICAgICdwdF9wdC44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAncHRfUFQuSVNPODg1OS0xJywKKyAgICAncHRfcHQuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ3B0X1BULklTTzg4NTktMScsCisgICAgJ3B0X3B0Lmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdwdF9QVC5JU084ODU5LTE1JywKKyAgICAncHRfcHQuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ3B0X1BULklTTzg4NTktMTUnLAorICAgICdwdF9wdC51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAncHRfUFQuVVRGLTgnLAorICAgICdwdF9wdEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAncHRfUFQuSVNPODg1OS0xNScsCisgICAgJ3JvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyb19STy5JU084ODU5LTInLAorICAgICdyb19ybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncm9fUk8uSVNPODg1OS0yJywKKyAgICAncm9fcm8uaXNvODg1OTInOiAgICAgICAgICAgICAgICAgICAgICAgJ3JvX1JPLklTTzg4NTktMicsCisgICAgJ3JvbWFuaWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyb19STy5JU084ODU5LTInLAorICAgICdydSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVfUlUuVVRGLTgnLAorICAgICdydS5rb2k4cic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVfUlUuS09JOC1SJywKKyAgICAncnVfcnUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1X1JVLlVURi04JywKKyAgICAncnVfcnUuY3AxMjUxJzogICAgICAgICAgICAgICAgICAgICAgICAgJ3J1X1JVLkNQMTI1MScsCisgICAgJ3J1X3J1Lmlzbzg4NTk1JzogICAgICAgICAgICAgICAgICAgICAgICdydV9SVS5JU084ODU5LTUnLAorICAgICdydV9ydS5rb2k4cic6ICAgICAgICAgICAgICAgICAgICAgICAgICAncnVfUlUuS09JOC1SJywKKyAgICAncnVfcnUubWljcm9zb2Z0Y3AxMjUxJzogICAgICAgICAgICAgICAgJ3J1X1JVLkNQMTI1MScsCisgICAgJ3J1X3VhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydV9VQS5LT0k4LVUnLAorICAgICdydV91YS5jcDEyNTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAncnVfVUEuQ1AxMjUxJywKKyAgICAncnVfdWEua29pOHUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1X1VBLktPSTgtVScsCisgICAgJ3J1X3VhLm1pY3Jvc29mdGNwMTI1MSc6ICAgICAgICAgICAgICAgICdydV9VQS5DUDEyNTEnLAorICAgICdydW1hbmlhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncm9fUk8uSVNPODg1OS0yJywKKyAgICAncnVzc2lhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1X1JVLklTTzg4NTktNScsCisgICAgJ3J3JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyd19SVy5JU084ODU5LTEnLAorICAgICdyd19ydyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncndfUlcuSVNPODg1OS0xJywKKyAgICAncndfcncuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ3J3X1JXLklTTzg4NTktMScsCisgICAgJ3NkJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZF9JTkBkZXZhbmFnYXJpLlVURi04JywKKyAgICAnc2Vfbm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlX05PLlVURi04JywKKyAgICAnc2VyYm9jcm9hdGlhbic6ICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04QGxhdGluJywKKyAgICAnc2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04QGxhdGluJywKKyAgICAnc2hfYmEuaXNvODg1OTJAYm9zbmlhJzogICAgICAgICAgICAgICAgJ3NyX0NTLklTTzg4NTktMicsCisgICAgJ3NoX2hyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaF9IUi5JU084ODU5LTInLAorICAgICdzaF9oci5pc284ODU5Mic6ICAgICAgICAgICAgICAgICAgICAgICAnaHJfSFIuSVNPODg1OS0yJywKKyAgICAnc2hfc3AnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX0NTLklTTzg4NTktMicsCisgICAgJ3NoX3l1JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOEBsYXRpbicsCisgICAgJ3NpJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaV9MSy5VVEYtOCcsCisgICAgJ3NpX2xrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaV9MSy5VVEYtOCcsCisgICAgJ3NpbmhhbGEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaV9MSy5VVEYtOCcsCisgICAgJ3NrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdza19TSy5JU084ODU5LTInLAorICAgICdza19zayc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2tfU0suSVNPODg1OS0yJywKKyAgICAnc2tfc2suaXNvODg1OTInOiAgICAgICAgICAgICAgICAgICAgICAgJ3NrX1NLLklTTzg4NTktMicsCisgICAgJ3NsJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzbF9TSS5JU084ODU5LTInLAorICAgICdzbF9jcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2xfQ1MuSVNPODg1OS0yJywKKyAgICAnc2xfc2knOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NsX1NJLklTTzg4NTktMicsCisgICAgJ3NsX3NpLmlzbzg4NTkyJzogICAgICAgICAgICAgICAgICAgICAgICdzbF9TSS5JU084ODU5LTInLAorICAgICdzbG92YWsnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2tfU0suSVNPODg1OS0yJywKKyAgICAnc2xvdmVuZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NsX1NJLklTTzg4NTktMicsCisgICAgJ3Nsb3Zlbmlhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzbF9TSS5JU084ODU5LTInLAorICAgICdzcCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfQ1MuSVNPODg1OS01JywKKyAgICAnc3BfeXUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX0NTLklTTzg4NTktNScsCisgICAgJ3NwYW5pc2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19FUy5JU084ODU5LTEnLAorICAgICdzcGFuaXNoLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAnZXNfRVMuSVNPODg1OS0xJywKKyAgICAnc3BhbmlzaF9zcGFpbic6ICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0VTLklTTzg4NTktMScsCisgICAgJ3NwYW5pc2hfc3BhaW4uODg1OSc6ICAgICAgICAgICAgICAgICAgICdlc19FUy5JU084ODU5LTEnLAorICAgICdzcSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3FfQUwuSVNPODg1OS0yJywKKyAgICAnc3FfYWwnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NxX0FMLklTTzg4NTktMicsCisgICAgJ3NxX2FsLmlzbzg4NTkyJzogICAgICAgICAgICAgICAgICAgICAgICdzcV9BTC5JU084ODU5LTInLAorICAgICdzcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLTgnLAorICAgICdzckBjeXJpbGxpYyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLTgnLAorICAgICdzckBsYXRpbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLThAbGF0aW4nLAorICAgICdzckBsYXRuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLThAbGF0aW4nLAorICAgICdzcl9jcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLTgnLAorICAgICdzcl9jcy5pc284ODU5Mic6ICAgICAgICAgICAgICAgICAgICAgICAnc3JfQ1MuSVNPODg1OS0yJywKKyAgICAnc3JfY3MuaXNvODg1OTJAbGF0bic6ICAgICAgICAgICAgICAgICAgJ3NyX0NTLklTTzg4NTktMicsCisgICAgJ3NyX2NzLmlzbzg4NTk1JzogICAgICAgICAgICAgICAgICAgICAgICdzcl9DUy5JU084ODU5LTUnLAorICAgICdzcl9jcy51dGY4QGxhdG4nOiAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLThAbGF0aW4nLAorICAgICdzcl9jc0BsYXRuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLThAbGF0aW4nLAorICAgICdzcl9tZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfTUUuVVRGLTgnLAorICAgICdzcl9ycyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLTgnLAorICAgICdzcl9ycy51dGY4QGxhdG4nOiAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLThAbGF0aW4nLAorICAgICdzcl9yc0BsYXRpbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLThAbGF0aW4nLAorICAgICdzcl9yc0BsYXRuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLThAbGF0aW4nLAorICAgICdzcl9zcCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfQ1MuSVNPODg1OS0yJywKKyAgICAnc3JfeXUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04QGxhdGluJywKKyAgICAnc3JfeXUuY3AxMjUxQGN5cmlsbGljJzogICAgICAgICAgICAgICAgJ3NyX0NTLkNQMTI1MScsCisgICAgJ3NyX3l1Lmlzbzg4NTkyJzogICAgICAgICAgICAgICAgICAgICAgICdzcl9DUy5JU084ODU5LTInLAorICAgICdzcl95dS5pc284ODU5NSc6ICAgICAgICAgICAgICAgICAgICAgICAnc3JfQ1MuSVNPODg1OS01JywKKyAgICAnc3JfeXUuaXNvODg1OTVAY3lyaWxsaWMnOiAgICAgICAgICAgICAgJ3NyX0NTLklTTzg4NTktNScsCisgICAgJ3NyX3l1Lm1pY3Jvc29mdGNwMTI1MUBjeXJpbGxpYyc6ICAgICAgICdzcl9DUy5DUDEyNTEnLAorICAgICdzcl95dS51dGY4QGN5cmlsbGljJzogICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLTgnLAorICAgICdzcl95dUBjeXJpbGxpYyc6ICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLTgnLAorICAgICdzcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3NfWkEuSVNPODg1OS0xJywKKyAgICAnc3NfemEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NzX1pBLklTTzg4NTktMScsCisgICAgJ3NzX3phLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdzc19aQS5JU084ODU5LTEnLAorICAgICdzdCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RfWkEuSVNPODg1OS0xJywKKyAgICAnc3RfemEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0X1pBLklTTzg4NTktMScsCisgICAgJ3N0X3phLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdzdF9aQS5JU084ODU5LTEnLAorICAgICdzdic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ZfU0UuSVNPODg1OS0xJywKKyAgICAnc3YuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgICAgJ3N2X1NFLklTTzg4NTktMTUnLAorICAgICdzdl9maSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ZfRkkuSVNPODg1OS0xJywKKyAgICAnc3ZfZmkuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ3N2X0ZJLklTTzg4NTktMScsCisgICAgJ3N2X2ZpLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdzdl9GSS5JU084ODU5LTE1JywKKyAgICAnc3ZfZmkuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ3N2X0ZJLklTTzg4NTktMTUnLAorICAgICdzdl9maS51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnc3ZfRkkuVVRGLTgnLAorICAgICdzdl9maUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ZfRkkuSVNPODg1OS0xNScsCisgICAgJ3N2X3NlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdl9TRS5JU084ODU5LTEnLAorICAgICdzdl9zZS44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ZfU0UuSVNPODg1OS0xJywKKyAgICAnc3Zfc2UuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ3N2X1NFLklTTzg4NTktMScsCisgICAgJ3N2X3NlLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdzdl9TRS5JU084ODU5LTE1JywKKyAgICAnc3Zfc2VAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N2X1NFLklTTzg4NTktMTUnLAorICAgICdzd2VkaXNoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ZfU0UuSVNPODg1OS0xJywKKyAgICAnc3dlZGlzaC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgJ3N2X1NFLklTTzg4NTktMScsCisgICAgJ3RhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0YV9JTi5UU0NJSS0wJywKKyAgICAndGFfaW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhX0lOLlRTQ0lJLTAnLAorICAgICd0YV9pbi50c2NpaSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAndGFfSU4uVFNDSUktMCcsCisgICAgJ3RhX2luLnRzY2lpMCc6ICAgICAgICAgICAgICAgICAgICAgICAgICd0YV9JTi5UU0NJSS0wJywKKyAgICAndGUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RlX0lOLlVURi04JywKKyAgICAndGcnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RnX1RKLktPSTgtQycsCisgICAgJ3RnX3RqJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0Z19USi5LT0k4LUMnLAorICAgICd0Z190ai5rb2k4Yyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAndGdfVEouS09JOC1DJywKKyAgICAndGgnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoX1RILklTTzg4NTktMTEnLAorICAgICd0aF90aCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhfVEguSVNPODg1OS0xMScsCisgICAgJ3RoX3RoLmlzbzg4NTkxMSc6ICAgICAgICAgICAgICAgICAgICAgICd0aF9USC5JU084ODU5LTExJywKKyAgICAndGhfdGgudGFjdGlzJzogICAgICAgICAgICAgICAgICAgICAgICAgJ3RoX1RILlRJUzYyMCcsCisgICAgJ3RoX3RoLnRpczYyMCc6ICAgICAgICAgICAgICAgICAgICAgICAgICd0aF9USC5USVM2MjAnLAorICAgICd0aGFpJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhfVEguSVNPODg1OS0xMScsCisgICAgJ3RsJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0bF9QSC5JU084ODU5LTEnLAorICAgICd0bF9waCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGxfUEguSVNPODg1OS0xJywKKyAgICAndGxfcGguaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ3RsX1BILklTTzg4NTktMScsCisgICAgJ3RuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0bl9aQS5JU084ODU5LTE1JywKKyAgICAndG5femEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RuX1pBLklTTzg4NTktMTUnLAorICAgICd0bl96YS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAndG5fWkEuSVNPODg1OS0xNScsCisgICAgJ3RyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cl9UUi5JU084ODU5LTknLAorICAgICd0cl90cic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJfVFIuSVNPODg1OS05JywKKyAgICAndHJfdHIuaXNvODg1OTknOiAgICAgICAgICAgICAgICAgICAgICAgJ3RyX1RSLklTTzg4NTktOScsCisgICAgJ3RzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0c19aQS5JU084ODU5LTEnLAorICAgICd0c196YSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHNfWkEuSVNPODg1OS0xJywKKyAgICAndHNfemEuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ3RzX1pBLklTTzg4NTktMScsCisgICAgJ3R0JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0dF9SVS5UQVRBUi1DWVInLAorICAgICd0dF9ydSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHRfUlUuVEFUQVItQ1lSJywKKyAgICAndHRfcnUua29pOGMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R0X1JVLktPSTgtQycsCisgICAgJ3R0X3J1LnRhdGFyY3lyJzogICAgICAgICAgICAgICAgICAgICAgICd0dF9SVS5UQVRBUi1DWVInLAorICAgICd0dXJraXNoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHJfVFIuSVNPODg1OS05JywKKyAgICAndHVya2lzaC5pc284ODU5OSc6ICAgICAgICAgICAgICAgICAgICAgJ3RyX1RSLklTTzg4NTktOScsCisgICAgJ3VrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1a19VQS5LT0k4LVUnLAorICAgICd1a191YSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndWtfVUEuS09JOC1VJywKKyAgICAndWtfdWEuY3AxMjUxJzogICAgICAgICAgICAgICAgICAgICAgICAgJ3VrX1VBLkNQMTI1MScsCisgICAgJ3VrX3VhLmlzbzg4NTk1JzogICAgICAgICAgICAgICAgICAgICAgICd1a19VQS5JU084ODU5LTUnLAorICAgICd1a191YS5rb2k4dSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAndWtfVUEuS09JOC1VJywKKyAgICAndWtfdWEubWljcm9zb2Z0Y3AxMjUxJzogICAgICAgICAgICAgICAgJ3VrX1VBLkNQMTI1MScsCisgICAgJ3VuaXYnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy51dGYnLAorICAgICd1bml2ZXJzYWwnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMudXRmJywKKyAgICAndW5pdmVyc2FsLnV0ZjhAdWNzNCc6ICAgICAgICAgICAgICAgICAgJ2VuX1VTLlVURi04JywKKyAgICAndXInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VyX1BLLkNQMTI1NicsCisgICAgJ3VyX3BrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1cl9QSy5DUDEyNTYnLAorICAgICd1cl9way5jcDEyNTYnOiAgICAgICAgICAgICAgICAgICAgICAgICAndXJfUEsuQ1AxMjU2JywKKyAgICAndXJfcGsubWljcm9zb2Z0Y3AxMjU2JzogICAgICAgICAgICAgICAgJ3VyX1BLLkNQMTI1NicsCisgICAgJ3V6JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1el9VWi5VVEYtOCcsCisgICAgJ3V6X3V6JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1el9VWi5VVEYtOCcsCisgICAgJ3V6X3V6Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICd1el9VWi5JU084ODU5LTEnLAorICAgICd1el91ei51dGY4QGN5cmlsbGljJzogICAgICAgICAgICAgICAgICAndXpfVVouVVRGLTgnLAorICAgICd1el91ekBjeXJpbGxpYyc6ICAgICAgICAgICAgICAgICAgICAgICAndXpfVVouVVRGLTgnLAorICAgICd2ZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVfWkEuVVRGLTgnLAorICAgICd2ZV96YSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVfWkEuVVRGLTgnLAorICAgICd2aSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmlfVk4uVENWTicsCisgICAgJ3ZpX3ZuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aV9WTi5UQ1ZOJywKKyAgICAndmlfdm4udGN2bic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpX1ZOLlRDVk4nLAorICAgICd2aV92bi50Y3ZuNTcxMic6ICAgICAgICAgICAgICAgICAgICAgICAndmlfVk4uVENWTicsCisgICAgJ3ZpX3ZuLnZpc2NpaSc6ICAgICAgICAgICAgICAgICAgICAgICAgICd2aV9WTi5WSVNDSUknLAorICAgICd2aV92bi52aXNjaWkxMTEnOiAgICAgICAgICAgICAgICAgICAgICAndmlfVk4uVklTQ0lJJywKKyAgICAnd2EnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhX0JFLklTTzg4NTktMScsCisgICAgJ3dhX2JlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YV9CRS5JU084ODU5LTEnLAorICAgICd3YV9iZS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnd2FfQkUuSVNPODg1OS0xJywKKyAgICAnd2FfYmUuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ3dhX0JFLklTTzg4NTktMTUnLAorICAgICd3YV9iZS5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnd2FfQkUuSVNPODg1OS0xNScsCisgICAgJ3dhX2JlQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YV9CRS5JU084ODU5LTE1JywKKyAgICAneGgnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3hoX1pBLklTTzg4NTktMScsCisgICAgJ3hoX3phJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd4aF9aQS5JU084ODU5LTEnLAorICAgICd4aF96YS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAneGhfWkEuSVNPODg1OS0xJywKKyAgICAneWknOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3lpX1VTLkNQMTI1NScsCisgICAgJ3lpX3VzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd5aV9VUy5DUDEyNTUnLAorICAgICd5aV91cy5jcDEyNTUnOiAgICAgICAgICAgICAgICAgICAgICAgICAneWlfVVMuQ1AxMjU1JywKKyAgICAneWlfdXMubWljcm9zb2Z0Y3AxMjU1JzogICAgICAgICAgICAgICAgJ3lpX1VTLkNQMTI1NScsCisgICAgJ3poJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6aF9DTi5ldWNDTicsCisgICAgJ3poX2NuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6aF9DTi5nYjIzMTInLAorICAgICd6aF9jbi5iaWc1JzogICAgICAgICAgICAgICAgICAgICAgICAgICAnemhfVFcuYmlnNScsCisgICAgJ3poX2NuLmV1Yyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6aF9DTi5ldWNDTicsCisgICAgJ3poX2NuLmdiMTgwMzAnOiAgICAgICAgICAgICAgICAgICAgICAgICd6aF9DTi5nYjE4MDMwJywKKyAgICAnemhfY24uZ2IyMzEyJzogICAgICAgICAgICAgICAgICAgICAgICAgJ3poX0NOLmdiMjMxMicsCisgICAgJ3poX2NuLmdiayc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6aF9DTi5nYmsnLAorICAgICd6aF9oayc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnemhfSEsuYmlnNWhrc2NzJywKKyAgICAnemhfaGsuYmlnNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3poX0hLLmJpZzUnLAorICAgICd6aF9oay5iaWc1aGsnOiAgICAgICAgICAgICAgICAgICAgICAgICAnemhfSEsuYmlnNWhrc2NzJywKKyAgICAnemhfaGsuYmlnNWhrc2NzJzogICAgICAgICAgICAgICAgICAgICAgJ3poX0hLLmJpZzVoa3NjcycsCisgICAgJ3poX3R3JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6aF9UVy5iaWc1JywKKyAgICAnemhfdHcuYmlnNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3poX1RXLmJpZzUnLAorICAgICd6aF90dy5ldWMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnemhfVFcuZXVjVFcnLAorICAgICd6aF90dy5ldWN0dyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnemhfVFcuZXVjVFcnLAorICAgICd6dSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnenVfWkEuSVNPODg1OS0xJywKKyAgICAnenVfemEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3p1X1pBLklTTzg4NTktMScsCisgICAgJ3p1X3phLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICd6dV9aQS5JU084ODU5LTEnLAorfQorCisjCisjIFRoaXMgbWFwcyBXaW5kb3dzIGxhbmd1YWdlIGlkZW50aWZpZXJzIHRvIGxvY2FsZSBzdHJpbmdzLgorIworIyBUaGlzIGxpc3QgaGFzIGJlZW4gdXBkYXRlZCBmcm9tCisjIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9kZWZhdWx0LmFzcD91cmw9L2xpYnJhcnkvZW4tdXMvaW50bC9ubHNfMjM4ei5hc3AKKyMgdG8gaW5jbHVkZSBldmVyeSBsb2NhbGUgdXAgdG8gV2luZG93cyBWaXN0YS4KKyMKKyMgTk9URTogdGhpcyBtYXBwaW5nIGlzIGluY29tcGxldGUuICBJZiB5b3VyIGxhbmd1YWdlIGlzIG1pc3NpbmcsIHBsZWFzZQorIyBzdWJtaXQgYSBidWcgcmVwb3J0IHRvIHRoZSBQeXRob24gYnVnIHRyYWNrZXIgYXQgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy8KKyMgTWFrZSBzdXJlIHlvdSBpbmNsdWRlIHRoZSBtaXNzaW5nIGxhbmd1YWdlIGlkZW50aWZpZXIgYW5kIHRoZSBzdWdnZXN0ZWQKKyMgbG9jYWxlIGNvZGUuCisjCisKK3dpbmRvd3NfbG9jYWxlID0geworICAgIDB4MDQzNjogImFmX1pBIiwgIyBBZnJpa2FhbnMKKyAgICAweDA0MWM6ICJzcV9BTCIsICMgQWxiYW5pYW4KKyAgICAweDA0ODQ6ICJnc3dfRlIiLCMgQWxzYXRpYW4gLSBGcmFuY2UKKyAgICAweDA0NWU6ICJhbV9FVCIsICMgQW1oYXJpYyAtIEV0aGlvcGlhCisgICAgMHgwNDAxOiAiYXJfU0EiLCAjIEFyYWJpYyAtIFNhdWRpIEFyYWJpYQorICAgIDB4MDgwMTogImFyX0lRIiwgIyBBcmFiaWMgLSBJcmFxCisgICAgMHgwYzAxOiAiYXJfRUciLCAjIEFyYWJpYyAtIEVneXB0CisgICAgMHgxMDAxOiAiYXJfTFkiLCAjIEFyYWJpYyAtIExpYnlhCisgICAgMHgxNDAxOiAiYXJfRFoiLCAjIEFyYWJpYyAtIEFsZ2VyaWEKKyAgICAweDE4MDE6ICJhcl9NQSIsICMgQXJhYmljIC0gTW9yb2NjbworICAgIDB4MWMwMTogImFyX1ROIiwgIyBBcmFiaWMgLSBUdW5pc2lhCisgICAgMHgyMDAxOiAiYXJfT00iLCAjIEFyYWJpYyAtIE9tYW4KKyAgICAweDI0MDE6ICJhcl9ZRSIsICMgQXJhYmljIC0gWWVtZW4KKyAgICAweDI4MDE6ICJhcl9TWSIsICMgQXJhYmljIC0gU3lyaWEKKyAgICAweDJjMDE6ICJhcl9KTyIsICMgQXJhYmljIC0gSm9yZGFuCisgICAgMHgzMDAxOiAiYXJfTEIiLCAjIEFyYWJpYyAtIExlYmFub24KKyAgICAweDM0MDE6ICJhcl9LVyIsICMgQXJhYmljIC0gS3V3YWl0CisgICAgMHgzODAxOiAiYXJfQUUiLCAjIEFyYWJpYyAtIFVuaXRlZCBBcmFiIEVtaXJhdGVzCisgICAgMHgzYzAxOiAiYXJfQkgiLCAjIEFyYWJpYyAtIEJhaHJhaW4KKyAgICAweDQwMDE6ICJhcl9RQSIsICMgQXJhYmljIC0gUWF0YXIKKyAgICAweDA0MmI6ICJoeV9BTSIsICMgQXJtZW5pYW4KKyAgICAweDA0NGQ6ICJhc19JTiIsICMgQXNzYW1lc2UgLSBJbmRpYQorICAgIDB4MDQyYzogImF6X0FaIiwgIyBBemVyaSAtIExhdGluCisgICAgMHgwODJjOiAiYXpfQVoiLCAjIEF6ZXJpIC0gQ3lyaWxsaWMKKyAgICAweDA0NmQ6ICJiYV9SVSIsICMgQmFzaGtpcgorICAgIDB4MDQyZDogImV1X0VTIiwgIyBCYXNxdWUgLSBSdXNzaWEKKyAgICAweDA0MjM6ICJiZV9CWSIsICMgQmVsYXJ1c2lhbgorICAgIDB4MDQ0NTogImJuX0lOIiwgIyBCZWdhbGkKKyAgICAweDIwMWE6ICJic19CQSIsICMgQm9zbmlhbiAtIEN5cmlsbGljCisgICAgMHgxNDFhOiAiYnNfQkEiLCAjIEJvc25pYW4gLSBMYXRpbgorICAgIDB4MDQ3ZTogImJyX0ZSIiwgIyBCcmV0b24gLSBGcmFuY2UKKyAgICAweDA0MDI6ICJiZ19CRyIsICMgQnVsZ2FyaWFuCisjICAgIDB4MDQ1NTogIm15X01NIiwgIyBCdXJtZXNlIC0gTm90IHN1cHBvcnRlZAorICAgIDB4MDQwMzogImNhX0VTIiwgIyBDYXRhbGFuCisgICAgMHgwMDA0OiAiemhfQ0hTIiwjIENoaW5lc2UgLSBTaW1wbGlmaWVkCisgICAgMHgwNDA0OiAiemhfVFciLCAjIENoaW5lc2UgLSBUYWl3YW4KKyAgICAweDA4MDQ6ICJ6aF9DTiIsICMgQ2hpbmVzZSAtIFBSQworICAgIDB4MGMwNDogInpoX0hLIiwgIyBDaGluZXNlIC0gSG9uZyBLb25nIFMuQS5SLgorICAgIDB4MTAwNDogInpoX1NHIiwgIyBDaGluZXNlIC0gU2luZ2Fwb3JlCisgICAgMHgxNDA0OiAiemhfTU8iLCAjIENoaW5lc2UgLSBNYWNhbyBTLkEuUi4KKyAgICAweDdjMDQ6ICJ6aF9DSFQiLCMgQ2hpbmVzZSAtIFRyYWRpdGlvbmFsCisgICAgMHgwNDgzOiAiY29fRlIiLCAjIENvcnNpY2FuIC0gRnJhbmNlCisgICAgMHgwNDFhOiAiaHJfSFIiLCAjIENyb2F0aWFuCisgICAgMHgxMDFhOiAiaHJfQkEiLCAjIENyb2F0aWFuIC0gQm9zbmlhCisgICAgMHgwNDA1OiAiY3NfQ1oiLCAjIEN6ZWNoCisgICAgMHgwNDA2OiAiZGFfREsiLCAjIERhbmlzaAorICAgIDB4MDQ4YzogImdiel9BRiIsIyBEYXJpIC0gQWZnaGFuaXN0YW4KKyAgICAweDA0NjU6ICJkaXZfTVYiLCMgRGl2ZWhpIC0gTWFsZGl2ZXMKKyAgICAweDA0MTM6ICJubF9OTCIsICMgRHV0Y2ggLSBUaGUgTmV0aGVybGFuZHMKKyAgICAweDA4MTM6ICJubF9CRSIsICMgRHV0Y2ggLSBCZWxnaXVtCisgICAgMHgwNDA5OiAiZW5fVVMiLCAjIEVuZ2xpc2ggLSBVbml0ZWQgU3RhdGVzCisgICAgMHgwODA5OiAiZW5fR0IiLCAjIEVuZ2xpc2ggLSBVbml0ZWQgS2luZ2RvbQorICAgIDB4MGMwOTogImVuX0FVIiwgIyBFbmdsaXNoIC0gQXVzdHJhbGlhCisgICAgMHgxMDA5OiAiZW5fQ0EiLCAjIEVuZ2xpc2ggLSBDYW5hZGEKKyAgICAweDE0MDk6ICJlbl9OWiIsICMgRW5nbGlzaCAtIE5ldyBaZWFsYW5kCisgICAgMHgxODA5OiAiZW5fSUUiLCAjIEVuZ2xpc2ggLSBJcmVsYW5kCisgICAgMHgxYzA5OiAiZW5fWkEiLCAjIEVuZ2xpc2ggLSBTb3V0aCBBZnJpY2EKKyAgICAweDIwMDk6ICJlbl9KQSIsICMgRW5nbGlzaCAtIEphbWFpY2EKKyAgICAweDI0MDk6ICJlbl9DQiIsICMgRW5nbGlzaCAtIENhcnJpYmJlYW4KKyAgICAweDI4MDk6ICJlbl9CWiIsICMgRW5nbGlzaCAtIEJlbGl6ZQorICAgIDB4MmMwOTogImVuX1RUIiwgIyBFbmdsaXNoIC0gVHJpbmlkYWQKKyAgICAweDMwMDk6ICJlbl9aVyIsICMgRW5nbGlzaCAtIFppbWJhYndlCisgICAgMHgzNDA5OiAiZW5fUEgiLCAjIEVuZ2xpc2ggLSBQaGlsaXBwaW5lcworICAgIDB4NDAwOTogImVuX0lOIiwgIyBFbmdsaXNoIC0gSW5kaWEKKyAgICAweDQ0MDk6ICJlbl9NWSIsICMgRW5nbGlzaCAtIE1hbGF5c2lhCisgICAgMHg0ODA5OiAiZW5fSU4iLCAjIEVuZ2xpc2ggLSBTaW5nYXBvcmUKKyAgICAweDA0MjU6ICJldF9FRSIsICMgRXN0b25pYW4KKyAgICAweDA0Mzg6ICJmb19GTyIsICMgRmFyb2VzZQorICAgIDB4MDQ2NDogImZpbF9QSCIsIyBGaWxpcGlubworICAgIDB4MDQwYjogImZpX0ZJIiwgIyBGaW5uaXNoCisgICAgMHgwNDBjOiAiZnJfRlIiLCAjIEZyZW5jaCAtIEZyYW5jZQorICAgIDB4MDgwYzogImZyX0JFIiwgIyBGcmVuY2ggLSBCZWxnaXVtCisgICAgMHgwYzBjOiAiZnJfQ0EiLCAjIEZyZW5jaCAtIENhbmFkYQorICAgIDB4MTAwYzogImZyX0NIIiwgIyBGcmVuY2ggLSBTd2l0emVybGFuZAorICAgIDB4MTQwYzogImZyX0xVIiwgIyBGcmVuY2ggLSBMdXhlbWJvdXJnCisgICAgMHgxODBjOiAiZnJfTUMiLCAjIEZyZW5jaCAtIE1vbmFjbworICAgIDB4MDQ2MjogImZ5X05MIiwgIyBGcmlzaWFuIC0gTmV0aGVybGFuZHMKKyAgICAweDA0NTY6ICJnbF9FUyIsICMgR2FsaWNpYW4KKyAgICAweDA0Mzc6ICJrYV9HRSIsICMgR2VvcmdpYW4KKyAgICAweDA0MDc6ICJkZV9ERSIsICMgR2VybWFuIC0gR2VybWFueQorICAgIDB4MDgwNzogImRlX0NIIiwgIyBHZXJtYW4gLSBTd2l0emVybGFuZAorICAgIDB4MGMwNzogImRlX0FUIiwgIyBHZXJtYW4gLSBBdXN0cmlhCisgICAgMHgxMDA3OiAiZGVfTFUiLCAjIEdlcm1hbiAtIEx1eGVtYm91cmcKKyAgICAweDE0MDc6ICJkZV9MSSIsICMgR2VybWFuIC0gTGllY2h0ZW5zdGVpbgorICAgIDB4MDQwODogImVsX0dSIiwgIyBHcmVlaworICAgIDB4MDQ2ZjogImtsX0dMIiwgIyBHcmVlbmxhbmRpYyAtIEdyZWVubGFuZAorICAgIDB4MDQ0NzogImd1X0lOIiwgIyBHdWphcmF0aQorICAgIDB4MDQ2ODogImhhX05HIiwgIyBIYXVzYSAtIExhdGluCisgICAgMHgwNDBkOiAiaGVfSUwiLCAjIEhlYnJldworICAgIDB4MDQzOTogImhpX0lOIiwgIyBIaW5kaQorICAgIDB4MDQwZTogImh1X0hVIiwgIyBIdW5nYXJpYW4KKyAgICAweDA0MGY6ICJpc19JUyIsICMgSWNlbGFuZGljCisgICAgMHgwNDIxOiAiaWRfSUQiLCAjIEluZG9uZXNpYW4KKyAgICAweDA0NWQ6ICJpdV9DQSIsICMgSW51a3RpdHV0IC0gU3lsbGFiaWNzCisgICAgMHgwODVkOiAiaXVfQ0EiLCAjIEludWt0aXR1dCAtIExhdGluCisgICAgMHgwODNjOiAiZ2FfSUUiLCAjIElyaXNoIC0gSXJlbGFuZAorICAgIDB4MDQxMDogIml0X0lUIiwgIyBJdGFsaWFuIC0gSXRhbHkKKyAgICAweDA4MTA6ICJpdF9DSCIsICMgSXRhbGlhbiAtIFN3aXR6ZXJsYW5kCisgICAgMHgwNDExOiAiamFfSlAiLCAjIEphcGFuZXNlCisgICAgMHgwNDRiOiAia25fSU4iLCAjIEthbm5hZGEgLSBJbmRpYQorICAgIDB4MDQzZjogImtrX0taIiwgIyBLYXpha2gKKyAgICAweDA0NTM6ICJraF9LSCIsICMgS2htZXIgLSBDYW1ib2RpYQorICAgIDB4MDQ4NjogInF1dF9HVCIsIyBLJ2ljaGUgLSBHdWF0ZW1hbGEKKyAgICAweDA0ODc6ICJyd19SVyIsICMgS2lueWFyd2FuZGEgLSBSd2FuZGEKKyAgICAweDA0NTc6ICJrb2tfSU4iLCMgS29ua2FuaQorICAgIDB4MDQxMjogImtvX0tSIiwgIyBLb3JlYW4KKyAgICAweDA0NDA6ICJreV9LRyIsICMgS3lyZ3l6CisgICAgMHgwNDU0OiAibG9fTEEiLCAjIExhbyAtIExhbyBQRFIKKyAgICAweDA0MjY6ICJsdl9MViIsICMgTGF0dmlhbgorICAgIDB4MDQyNzogImx0X0xUIiwgIyBMaXRodWFuaWFuCisgICAgMHgwODJlOiAiZHNiX0RFIiwjIExvd2VyIFNvcmJpYW4gLSBHZXJtYW55CisgICAgMHgwNDZlOiAibGJfTFUiLCAjIEx1eGVtYm91cmdpc2gKKyAgICAweDA0MmY6ICJta19NSyIsICMgRllST00gTWFjZWRvbmlhbgorICAgIDB4MDQzZTogIm1zX01ZIiwgIyBNYWxheSAtIE1hbGF5c2lhCisgICAgMHgwODNlOiAibXNfQk4iLCAjIE1hbGF5IC0gQnJ1bmVpIERhcnVzc2FsYW0KKyAgICAweDA0NGM6ICJtbF9JTiIsICMgTWFsYXlhbGFtIC0gSW5kaWEKKyAgICAweDA0M2E6ICJtdF9NVCIsICMgTWFsdGVzZQorICAgIDB4MDQ4MTogIm1pX05aIiwgIyBNYW9yaQorICAgIDB4MDQ3YTogImFybl9DTCIsIyBNYXB1ZHVuZ3VuCisgICAgMHgwNDRlOiAibXJfSU4iLCAjIE1hcmF0aGkKKyAgICAweDA0N2M6ICJtb2hfQ0EiLCMgTW9oYXdrIC0gQ2FuYWRhCisgICAgMHgwNDUwOiAibW5fTU4iLCAjIE1vbmdvbGlhbiAtIEN5cmlsbGljCisgICAgMHgwODUwOiAibW5fQ04iLCAjIE1vbmdvbGlhbiAtIFBSQworICAgIDB4MDQ2MTogIm5lX05QIiwgIyBOZXBhbGkKKyAgICAweDA0MTQ6ICJuYl9OTyIsICMgTm9yd2VnaWFuIC0gQm9rbWFsCisgICAgMHgwODE0OiAibm5fTk8iLCAjIE5vcndlZ2lhbiAtIE55bm9yc2sKKyAgICAweDA0ODI6ICJvY19GUiIsICMgT2NjaXRhbiAtIEZyYW5jZQorICAgIDB4MDQ0ODogIm9yX0lOIiwgIyBPcml5YSAtIEluZGlhCisgICAgMHgwNDYzOiAicHNfQUYiLCAjIFBhc2h0byAtIEFmZ2hhbmlzdGFuCisgICAgMHgwNDI5OiAiZmFfSVIiLCAjIFBlcnNpYW4KKyAgICAweDA0MTU6ICJwbF9QTCIsICMgUG9saXNoCisgICAgMHgwNDE2OiAicHRfQlIiLCAjIFBvcnR1Z3Vlc2UgLSBCcmF6aWwKKyAgICAweDA4MTY6ICJwdF9QVCIsICMgUG9ydHVndWVzZSAtIFBvcnR1Z2FsCisgICAgMHgwNDQ2OiAicGFfSU4iLCAjIFB1bmphYmkKKyAgICAweDA0NmI6ICJxdXpfQk8iLCMgUXVlY2h1YSAoQm9saXZpYSkKKyAgICAweDA4NmI6ICJxdXpfRUMiLCMgUXVlY2h1YSAoRWN1YWRvcikKKyAgICAweDBjNmI6ICJxdXpfUEUiLCMgUXVlY2h1YSAoUGVydSkKKyAgICAweDA0MTg6ICJyb19STyIsICMgUm9tYW5pYW4gLSBSb21hbmlhCisgICAgMHgwNDE3OiAicm1fQ0giLCAjIFJvbWFuc2gKKyAgICAweDA0MTk6ICJydV9SVSIsICMgUnVzc2lhbgorICAgIDB4MjQzYjogInNtbl9GSSIsIyBTYW1pIEZpbmxhbmQKKyAgICAweDEwM2I6ICJzbWpfTk8iLCMgU2FtaSBOb3J3YXkKKyAgICAweDE0M2I6ICJzbWpfU0UiLCMgU2FtaSBTd2VkZW4KKyAgICAweDA0M2I6ICJzZV9OTyIsICMgU2FtaSBOb3J0aGVybiBOb3J3YXkKKyAgICAweDA4M2I6ICJzZV9TRSIsICMgU2FtaSBOb3J0aGVybiBTd2VkZW4KKyAgICAweDBjM2I6ICJzZV9GSSIsICMgU2FtaSBOb3J0aGVybiBGaW5sYW5kCisgICAgMHgyMDNiOiAic21zX0ZJIiwjIFNhbWkgU2tvbHQKKyAgICAweDE4M2I6ICJzbWFfTk8iLCMgU2FtaSBTb3V0aGVybiBOb3J3YXkKKyAgICAweDFjM2I6ICJzbWFfU0UiLCMgU2FtaSBTb3V0aGVybiBTd2VkZW4KKyAgICAweDA0NGY6ICJzYV9JTiIsICMgU2Fuc2tyaXQKKyAgICAweDBjMWE6ICJzcl9TUCIsICMgU2VyYmlhbiAtIEN5cmlsbGljCisgICAgMHgxYzFhOiAic3JfQkEiLCAjIFNlcmJpYW4gLSBCb3NuaWEgQ3lyaWxsaWMKKyAgICAweDA4MWE6ICJzcl9TUCIsICMgU2VyYmlhbiAtIExhdGluCisgICAgMHgxODFhOiAic3JfQkEiLCAjIFNlcmJpYW4gLSBCb3NuaWEgTGF0aW4KKyAgICAweDA0NWI6ICJzaV9MSyIsICMgU2luaGFsYSAtIFNyaSBMYW5rYQorICAgIDB4MDQ2YzogIm5zX1pBIiwgIyBOb3J0aGVybiBTb3RobworICAgIDB4MDQzMjogInRuX1pBIiwgIyBTZXRzd2FuYSAtIFNvdXRoZXJuIEFmcmljYQorICAgIDB4MDQxYjogInNrX1NLIiwgIyBTbG92YWsKKyAgICAweDA0MjQ6ICJzbF9TSSIsICMgU2xvdmVuaWFuCisgICAgMHgwNDBhOiAiZXNfRVMiLCAjIFNwYW5pc2ggLSBTcGFpbgorICAgIDB4MDgwYTogImVzX01YIiwgIyBTcGFuaXNoIC0gTWV4aWNvCisgICAgMHgwYzBhOiAiZXNfRVMiLCAjIFNwYW5pc2ggLSBTcGFpbiAoTW9kZXJuKQorICAgIDB4MTAwYTogImVzX0dUIiwgIyBTcGFuaXNoIC0gR3VhdGVtYWxhCisgICAgMHgxNDBhOiAiZXNfQ1IiLCAjIFNwYW5pc2ggLSBDb3N0YSBSaWNhCisgICAgMHgxODBhOiAiZXNfUEEiLCAjIFNwYW5pc2ggLSBQYW5hbWEKKyAgICAweDFjMGE6ICJlc19ETyIsICMgU3BhbmlzaCAtIERvbWluaWNhbiBSZXB1YmxpYworICAgIDB4MjAwYTogImVzX1ZFIiwgIyBTcGFuaXNoIC0gVmVuZXp1ZWxhCisgICAgMHgyNDBhOiAiZXNfQ08iLCAjIFNwYW5pc2ggLSBDb2xvbWJpYQorICAgIDB4MjgwYTogImVzX1BFIiwgIyBTcGFuaXNoIC0gUGVydQorICAgIDB4MmMwYTogImVzX0FSIiwgIyBTcGFuaXNoIC0gQXJnZW50aW5hCisgICAgMHgzMDBhOiAiZXNfRUMiLCAjIFNwYW5pc2ggLSBFY3VhZG9yCisgICAgMHgzNDBhOiAiZXNfQ0wiLCAjIFNwYW5pc2ggLSBDaGlsZQorICAgIDB4MzgwYTogImVzX1VSIiwgIyBTcGFuaXNoIC0gVXJ1Z3VheQorICAgIDB4M2MwYTogImVzX1BZIiwgIyBTcGFuaXNoIC0gUGFyYWd1YXkKKyAgICAweDQwMGE6ICJlc19CTyIsICMgU3BhbmlzaCAtIEJvbGl2aWEKKyAgICAweDQ0MGE6ICJlc19TViIsICMgU3BhbmlzaCAtIEVsIFNhbHZhZG9yCisgICAgMHg0ODBhOiAiZXNfSE4iLCAjIFNwYW5pc2ggLSBIb25kdXJhcworICAgIDB4NGMwYTogImVzX05JIiwgIyBTcGFuaXNoIC0gTmljYXJhZ3VhCisgICAgMHg1MDBhOiAiZXNfUFIiLCAjIFNwYW5pc2ggLSBQdWVydG8gUmljbworICAgIDB4NTQwYTogImVzX1VTIiwgIyBTcGFuaXNoIC0gVW5pdGVkIFN0YXRlcworIyAgICAweDA0MzA6ICIiLCAjIFN1dHUgLSBOb3Qgc3VwcG9ydGVkCisgICAgMHgwNDQxOiAic3dfS0UiLCAjIFN3YWhpbGkKKyAgICAweDA0MWQ6ICJzdl9TRSIsICMgU3dlZGlzaCAtIFN3ZWRlbgorICAgIDB4MDgxZDogInN2X0ZJIiwgIyBTd2VkaXNoIC0gRmlubGFuZAorICAgIDB4MDQ1YTogInN5cl9TWSIsIyBTeXJpYWMKKyAgICAweDA0Mjg6ICJ0Z19USiIsICMgVGFqaWsgLSBDeXJpbGxpYworICAgIDB4MDg1ZjogInRtel9EWiIsIyBUYW1hemlnaHQgLSBMYXRpbgorICAgIDB4MDQ0OTogInRhX0lOIiwgIyBUYW1pbAorICAgIDB4MDQ0NDogInR0X1JVIiwgIyBUYXRhcgorICAgIDB4MDQ0YTogInRlX0lOIiwgIyBUZWx1Z3UKKyAgICAweDA0MWU6ICJ0aF9USCIsICMgVGhhaQorICAgIDB4MDg1MTogImJvX0JUIiwgIyBUaWJldGFuIC0gQmh1dGFuCisgICAgMHgwNDUxOiAiYm9fQ04iLCAjIFRpYmV0YW4gLSBQUkMKKyAgICAweDA0MWY6ICJ0cl9UUiIsICMgVHVya2lzaAorICAgIDB4MDQ0MjogInRrX1RNIiwgIyBUdXJrbWVuIC0gQ3lyaWxsaWMKKyAgICAweDA0ODA6ICJ1Z19DTiIsICMgVWlnaHVyIC0gQXJhYmljCisgICAgMHgwNDIyOiAidWtfVUEiLCAjIFVrcmFpbmlhbgorICAgIDB4MDQyZTogIndlbl9ERSIsIyBVcHBlciBTb3JiaWFuIC0gR2VybWFueQorICAgIDB4MDQyMDogInVyX1BLIiwgIyBVcmR1CisgICAgMHgwODIwOiAidXJfSU4iLCAjIFVyZHUgLSBJbmRpYQorICAgIDB4MDQ0MzogInV6X1VaIiwgIyBVemJlayAtIExhdGluCisgICAgMHgwODQzOiAidXpfVVoiLCAjIFV6YmVrIC0gQ3lyaWxsaWMKKyAgICAweDA0MmE6ICJ2aV9WTiIsICMgVmlldG5hbWVzZQorICAgIDB4MDQ1MjogImN5X0dCIiwgIyBXZWxzaAorICAgIDB4MDQ4ODogIndvX1NOIiwgIyBXb2xvZiAtIFNlbmVnYWwKKyAgICAweDA0MzQ6ICJ4aF9aQSIsICMgWGhvc2EgLSBTb3V0aCBBZnJpY2EKKyAgICAweDA0ODU6ICJzYWhfUlUiLCMgWWFrdXQgLSBDeXJpbGxpYworICAgIDB4MDQ3ODogImlpX0NOIiwgIyBZaSAtIFBSQworICAgIDB4MDQ2YTogInlvX05HIiwgIyBZb3J1YmEgLSBOaWdlcmlhCisgICAgMHgwNDM1OiAienVfWkEiLCAjIFp1bHUKK30KKworZGVmIF9wcmludF9sb2NhbGUoKToKKworICAgICIiIiBUZXN0IGZ1bmN0aW9uLgorICAgICIiIgorICAgIGNhdGVnb3JpZXMgPSB7fQorICAgIGRlZiBfaW5pdF9jYXRlZ29yaWVzKGNhdGVnb3JpZXM9Y2F0ZWdvcmllcyk6CisgICAgICAgIGZvciBrLHYgaW4gZ2xvYmFscygpLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBrWzozXSA9PSAnTENfJzoKKyAgICAgICAgICAgICAgICBjYXRlZ29yaWVzW2tdID0gdgorICAgIF9pbml0X2NhdGVnb3JpZXMoKQorICAgIGRlbCBjYXRlZ29yaWVzWydMQ19BTEwnXQorCisgICAgcHJpbnQgJ0xvY2FsZSBkZWZhdWx0cyBhcyBkZXRlcm1pbmVkIGJ5IGdldGRlZmF1bHRsb2NhbGUoKTonCisgICAgcHJpbnQgJy0nKjcyCisgICAgbGFuZywgZW5jID0gZ2V0ZGVmYXVsdGxvY2FsZSgpCisgICAgcHJpbnQgJ0xhbmd1YWdlOiAnLCBsYW5nIG9yICcodW5kZWZpbmVkKScKKyAgICBwcmludCAnRW5jb2Rpbmc6ICcsIGVuYyBvciAnKHVuZGVmaW5lZCknCisgICAgcHJpbnQKKworICAgIHByaW50ICdMb2NhbGUgc2V0dGluZ3Mgb24gc3RhcnR1cDonCisgICAgcHJpbnQgJy0nKjcyCisgICAgZm9yIG5hbWUsY2F0ZWdvcnkgaW4gY2F0ZWdvcmllcy5pdGVtcygpOgorICAgICAgICBwcmludCBuYW1lLCAnLi4uJworICAgICAgICBsYW5nLCBlbmMgPSBnZXRsb2NhbGUoY2F0ZWdvcnkpCisgICAgICAgIHByaW50ICcgICBMYW5ndWFnZTogJywgbGFuZyBvciAnKHVuZGVmaW5lZCknCisgICAgICAgIHByaW50ICcgICBFbmNvZGluZzogJywgZW5jIG9yICcodW5kZWZpbmVkKScKKyAgICAgICAgcHJpbnQKKworICAgIHByaW50CisgICAgcHJpbnQgJ0xvY2FsZSBzZXR0aW5ncyBhZnRlciBjYWxsaW5nIHJlc2V0bG9jYWxlKCk6JworICAgIHByaW50ICctJyo3MgorICAgIHJlc2V0bG9jYWxlKCkKKyAgICBmb3IgbmFtZSxjYXRlZ29yeSBpbiBjYXRlZ29yaWVzLml0ZW1zKCk6CisgICAgICAgIHByaW50IG5hbWUsICcuLi4nCisgICAgICAgIGxhbmcsIGVuYyA9IGdldGxvY2FsZShjYXRlZ29yeSkKKyAgICAgICAgcHJpbnQgJyAgIExhbmd1YWdlOiAnLCBsYW5nIG9yICcodW5kZWZpbmVkKScKKyAgICAgICAgcHJpbnQgJyAgIEVuY29kaW5nOiAnLCBlbmMgb3IgJyh1bmRlZmluZWQpJworICAgICAgICBwcmludAorCisgICAgdHJ5OgorICAgICAgICBzZXRsb2NhbGUoTENfQUxMLCAiIikKKyAgICBleGNlcHQ6CisgICAgICAgIHByaW50ICdOT1RFOicKKyAgICAgICAgcHJpbnQgJ3NldGxvY2FsZShMQ19BTEwsICIiKSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBkZWZhdWx0IGxvY2FsZScKKyAgICAgICAgcHJpbnQgJ2dpdmVuIGluIHRoZSBPUyBlbnZpcm9ubWVudCB2YXJpYWJsZXMuJworICAgIGVsc2U6CisgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICdMb2NhbGUgc2V0dGluZ3MgYWZ0ZXIgY2FsbGluZyBzZXRsb2NhbGUoTENfQUxMLCAiIik6JworICAgICAgICBwcmludCAnLScqNzIKKyAgICAgICAgZm9yIG5hbWUsY2F0ZWdvcnkgaW4gY2F0ZWdvcmllcy5pdGVtcygpOgorICAgICAgICAgICAgcHJpbnQgbmFtZSwgJy4uLicKKyAgICAgICAgICAgIGxhbmcsIGVuYyA9IGdldGxvY2FsZShjYXRlZ29yeSkKKyAgICAgICAgICAgIHByaW50ICcgICBMYW5ndWFnZTogJywgbGFuZyBvciAnKHVuZGVmaW5lZCknCisgICAgICAgICAgICBwcmludCAnICAgRW5jb2Rpbmc6ICcsIGVuYyBvciAnKHVuZGVmaW5lZCknCisgICAgICAgICAgICBwcmludAorCisjIyMKKwordHJ5OgorICAgIExDX01FU1NBR0VTCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgX19hbGxfXy5hcHBlbmQoIkxDX01FU1NBR0VTIikKKworaWYgX19uYW1lX189PSdfX21haW5fXyc6CisgICAgcHJpbnQgJ0xvY2FsZSBhbGlhc2luZzonCisgICAgcHJpbnQKKyAgICBfcHJpbnRfbG9jYWxlKCkKKyAgICBwcmludAorICAgIHByaW50ICdOdW1iZXIgZm9ybWF0dGluZzonCisgICAgcHJpbnQKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xvY2FsZS5weWMgYi9saWIvcHl0aG9uMi43L2xvY2FsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyYzg4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbG9jYWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xvY2FsZS5weW8gYi9saWIvcHl0aG9uMi43L2xvY2FsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyYzg4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbG9jYWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xvZ2dpbmcvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2MjJhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbG9nZ2luZy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDE3MjYgQEAKKyMgQ29weXJpZ2h0IDIwMDEtMjAxMiBieSBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisjIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKKyMgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorIyBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyMgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBWaW5heSBTYWppcAorIyBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24KKyMgb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyMgVklOQVkgU0FKSVAgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworIyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwKKyMgVklOQVkgU0FKSVAgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCisjIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUgorIyBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAorIyBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisiIiIKK0xvZ2dpbmcgcGFja2FnZSBmb3IgUHl0aG9uLiBCYXNlZCBvbiBQRVAgMjgyIGFuZCBjb21tZW50cyB0aGVyZXRvIGluCitjb21wLmxhbmcucHl0aG9uLgorCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMiBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworVG8gdXNlLCBzaW1wbHkgJ2ltcG9ydCBsb2dnaW5nJyBhbmQgbG9nIGF3YXkhCisiIiIKKworaW1wb3J0IHN5cywgb3MsIHRpbWUsIGNTdHJpbmdJTywgdHJhY2ViYWNrLCB3YXJuaW5ncywgd2Vha3JlZgorCitfX2FsbF9fID0gWydCQVNJQ19GT1JNQVQnLCAnQnVmZmVyaW5nRm9ybWF0dGVyJywgJ0NSSVRJQ0FMJywgJ0RFQlVHJywgJ0VSUk9SJywKKyAgICAgICAgICAgJ0ZBVEFMJywgJ0ZpbGVIYW5kbGVyJywgJ0ZpbHRlcicsICdGb3JtYXR0ZXInLCAnSGFuZGxlcicsICdJTkZPJywKKyAgICAgICAgICAgJ0xvZ1JlY29yZCcsICdMb2dnZXInLCAnTG9nZ2VyQWRhcHRlcicsICdOT1RTRVQnLCAnTnVsbEhhbmRsZXInLAorICAgICAgICAgICAnU3RyZWFtSGFuZGxlcicsICdXQVJOJywgJ1dBUk5JTkcnLCAnYWRkTGV2ZWxOYW1lJywgJ2Jhc2ljQ29uZmlnJywKKyAgICAgICAgICAgJ2NhcHR1cmVXYXJuaW5ncycsICdjcml0aWNhbCcsICdkZWJ1ZycsICdkaXNhYmxlJywgJ2Vycm9yJywKKyAgICAgICAgICAgJ2V4Y2VwdGlvbicsICdmYXRhbCcsICdnZXRMZXZlbE5hbWUnLCAnZ2V0TG9nZ2VyJywgJ2dldExvZ2dlckNsYXNzJywKKyAgICAgICAgICAgJ2luZm8nLCAnbG9nJywgJ21ha2VMb2dSZWNvcmQnLCAnc2V0TG9nZ2VyQ2xhc3MnLCAnd2FybicsICd3YXJuaW5nJ10KKwordHJ5OgorICAgIGltcG9ydCBjb2RlY3MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBjb2RlY3MgPSBOb25lCisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkCisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZCA9IE5vbmUKKworX19hdXRob3JfXyAgPSAiVmluYXkgU2FqaXAgPHZpbmF5X3NhamlwQHJlZC1kb3ZlLmNvbT4iCitfX3N0YXR1c19fICA9ICJwcm9kdWN0aW9uIgorX192ZXJzaW9uX18gPSAiMC41LjEuMiIKK19fZGF0ZV9fICAgID0gIjA3IEZlYnJ1YXJ5IDIwMTAiCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICBNaXNjZWxsYW5lb3VzIG1vZHVsZSBkYXRhCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0cnk6CisgICAgdW5pY29kZQorICAgIF91bmljb2RlID0gVHJ1ZQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBfdW5pY29kZSA9IEZhbHNlCisKKyMKKyMgX3NyY2ZpbGUgaXMgdXNlZCB3aGVuIHdhbGtpbmcgdGhlIHN0YWNrIHRvIGNoZWNrIHdoZW4gd2UndmUgZ290IHRoZSBmaXJzdAorIyBjYWxsZXIgc3RhY2sgZnJhbWUuCisjCitpZiBoYXNhdHRyKHN5cywgJ2Zyb3plbicpOiAjc3VwcG9ydCBmb3IgcHkyZXhlCisgICAgX3NyY2ZpbGUgPSAibG9nZ2luZyVzX19pbml0X18lcyIgJSAob3Muc2VwLCBfX2ZpbGVfX1stNDpdKQorZWxpZiBfX2ZpbGVfX1stNDpdLmxvd2VyKCkgaW4gWycucHljJywgJy5weW8nXToKKyAgICBfc3JjZmlsZSA9IF9fZmlsZV9fWzotNF0gKyAnLnB5JworZWxzZToKKyAgICBfc3JjZmlsZSA9IF9fZmlsZV9fCitfc3JjZmlsZSA9IG9zLnBhdGgubm9ybWNhc2UoX3NyY2ZpbGUpCisKKyMgbmV4dCBiaXQgZmlsY2hlZCBmcm9tIDEuNS4yJ3MgaW5zcGVjdC5weQorZGVmIGN1cnJlbnRmcmFtZSgpOgorICAgICIiIlJldHVybiB0aGUgZnJhbWUgb2JqZWN0IGZvciB0aGUgY2FsbGVyJ3Mgc3RhY2sgZnJhbWUuIiIiCisgICAgdHJ5OgorICAgICAgICByYWlzZSBFeGNlcHRpb24KKyAgICBleGNlcHQ6CisgICAgICAgIHJldHVybiBzeXMuZXhjX2luZm8oKVsyXS50Yl9mcmFtZS5mX2JhY2sKKworaWYgaGFzYXR0cihzeXMsICdfZ2V0ZnJhbWUnKTogY3VycmVudGZyYW1lID0gbGFtYmRhOiBzeXMuX2dldGZyYW1lKDMpCisjIGRvbmUgZmlsY2hpbmcKKworIyBfc3JjZmlsZSBpcyBvbmx5IHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBzeXMuX2dldGZyYW1lKCkuCisjIFRvIHByb3ZpZGUgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIFB5dGhvbiwgc2V0IF9zcmNmaWxlCisjIHRvIE5vbmUgaWYgX2dldGZyYW1lKCkgaXMgbm90IGF2YWlsYWJsZTsgdGhpcyB2YWx1ZSB3aWxsIHByZXZlbnQKKyMgZmluZENhbGxlcigpIGZyb20gYmVpbmcgY2FsbGVkLgorI2lmIG5vdCBoYXNhdHRyKHN5cywgIl9nZXRmcmFtZSIpOgorIyAgICBfc3JjZmlsZSA9IE5vbmUKKworIworI19zdGFydFRpbWUgaXMgdXNlZCBhcyB0aGUgYmFzZSB3aGVuIGNhbGN1bGF0aW5nIHRoZSByZWxhdGl2ZSB0aW1lIG9mIGV2ZW50cworIworX3N0YXJ0VGltZSA9IHRpbWUudGltZSgpCisKKyMKKyNyYWlzZUV4Y2VwdGlvbnMgaXMgdXNlZCB0byBzZWUgaWYgZXhjZXB0aW9ucyBkdXJpbmcgaGFuZGxpbmcgc2hvdWxkIGJlCisjcHJvcGFnYXRlZAorIworcmFpc2VFeGNlcHRpb25zID0gMQorCisjCisjIElmIHlvdSBkb24ndCB3YW50IHRocmVhZGluZyBpbmZvcm1hdGlvbiBpbiB0aGUgbG9nLCBzZXQgdGhpcyB0byB6ZXJvCisjCitsb2dUaHJlYWRzID0gMQorCisjCisjIElmIHlvdSBkb24ndCB3YW50IG11bHRpcHJvY2Vzc2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgbG9nLCBzZXQgdGhpcyB0byB6ZXJvCisjCitsb2dNdWx0aXByb2Nlc3NpbmcgPSAxCisKKyMKKyMgSWYgeW91IGRvbid0IHdhbnQgcHJvY2VzcyBpbmZvcm1hdGlvbiBpbiB0aGUgbG9nLCBzZXQgdGhpcyB0byB6ZXJvCisjCitsb2dQcm9jZXNzZXMgPSAxCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICBMZXZlbCByZWxhdGVkIHN0dWZmCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIERlZmF1bHQgbGV2ZWxzIGFuZCBsZXZlbCBuYW1lcywgdGhlc2UgY2FuIGJlIHJlcGxhY2VkIHdpdGggYW55IHBvc2l0aXZlIHNldAorIyBvZiB2YWx1ZXMgaGF2aW5nIGNvcnJlc3BvbmRpbmcgbmFtZXMuIFRoZXJlIGlzIGEgcHNldWRvLWxldmVsLCBOT1RTRVQsIHdoaWNoCisjIGlzIG9ubHkgcmVhbGx5IHRoZXJlIGFzIGEgbG93ZXIgbGltaXQgZm9yIHVzZXItZGVmaW5lZCBsZXZlbHMuIEhhbmRsZXJzIGFuZAorIyBsb2dnZXJzIGFyZSBpbml0aWFsaXplZCB3aXRoIE5PVFNFVCBzbyB0aGF0IHRoZXkgd2lsbCBsb2cgYWxsIG1lc3NhZ2VzLCBldmVuCisjIGF0IHVzZXItZGVmaW5lZCBsZXZlbHMuCisjCisKK0NSSVRJQ0FMID0gNTAKK0ZBVEFMID0gQ1JJVElDQUwKK0VSUk9SID0gNDAKK1dBUk5JTkcgPSAzMAorV0FSTiA9IFdBUk5JTkcKK0lORk8gPSAyMAorREVCVUcgPSAxMAorTk9UU0VUID0gMAorCitfbGV2ZWxOYW1lcyA9IHsKKyAgICBDUklUSUNBTCA6ICdDUklUSUNBTCcsCisgICAgRVJST1IgOiAnRVJST1InLAorICAgIFdBUk5JTkcgOiAnV0FSTklORycsCisgICAgSU5GTyA6ICdJTkZPJywKKyAgICBERUJVRyA6ICdERUJVRycsCisgICAgTk9UU0VUIDogJ05PVFNFVCcsCisgICAgJ0NSSVRJQ0FMJyA6IENSSVRJQ0FMLAorICAgICdFUlJPUicgOiBFUlJPUiwKKyAgICAnV0FSTicgOiBXQVJOSU5HLAorICAgICdXQVJOSU5HJyA6IFdBUk5JTkcsCisgICAgJ0lORk8nIDogSU5GTywKKyAgICAnREVCVUcnIDogREVCVUcsCisgICAgJ05PVFNFVCcgOiBOT1RTRVQsCit9CisKK2RlZiBnZXRMZXZlbE5hbWUobGV2ZWwpOgorICAgICIiIgorICAgIFJldHVybiB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBsb2dnaW5nIGxldmVsICdsZXZlbCcuCisKKyAgICBJZiB0aGUgbGV2ZWwgaXMgb25lIG9mIHRoZSBwcmVkZWZpbmVkIGxldmVscyAoQ1JJVElDQUwsIEVSUk9SLCBXQVJOSU5HLAorICAgIElORk8sIERFQlVHKSB0aGVuIHlvdSBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nLiBJZiB5b3UgaGF2ZQorICAgIGFzc29jaWF0ZWQgbGV2ZWxzIHdpdGggbmFtZXMgdXNpbmcgYWRkTGV2ZWxOYW1lIHRoZW4gdGhlIG5hbWUgeW91IGhhdmUKKyAgICBhc3NvY2lhdGVkIHdpdGggJ2xldmVsJyBpcyByZXR1cm5lZC4KKworICAgIElmIGEgbnVtZXJpYyB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIG9uZSBvZiB0aGUgZGVmaW5lZCBsZXZlbHMgaXMgcGFzc2VkCisgICAgaW4sIHRoZSBjb3JyZXNwb25kaW5nIHN0cmluZyByZXByZXNlbnRhdGlvbiBpcyByZXR1cm5lZC4KKworICAgIE90aGVyd2lzZSwgdGhlIHN0cmluZyAiTGV2ZWwgJXMiICUgbGV2ZWwgaXMgcmV0dXJuZWQuCisgICAgIiIiCisgICAgcmV0dXJuIF9sZXZlbE5hbWVzLmdldChsZXZlbCwgKCJMZXZlbCAlcyIgJSBsZXZlbCkpCisKK2RlZiBhZGRMZXZlbE5hbWUobGV2ZWwsIGxldmVsTmFtZSk6CisgICAgIiIiCisgICAgQXNzb2NpYXRlICdsZXZlbE5hbWUnIHdpdGggJ2xldmVsJy4KKworICAgIFRoaXMgaXMgdXNlZCB3aGVuIGNvbnZlcnRpbmcgbGV2ZWxzIHRvIHRleHQgZHVyaW5nIG1lc3NhZ2UgZm9ybWF0dGluZy4KKyAgICAiIiIKKyAgICBfYWNxdWlyZUxvY2soKQorICAgIHRyeTogICAgI3VubGlrZWx5IHRvIGNhdXNlIGFuIGV4Y2VwdGlvbiwgYnV0IHlvdSBuZXZlciBrbm93Li4uCisgICAgICAgIF9sZXZlbE5hbWVzW2xldmVsXSA9IGxldmVsTmFtZQorICAgICAgICBfbGV2ZWxOYW1lc1tsZXZlbE5hbWVdID0gbGV2ZWwKKyAgICBmaW5hbGx5OgorICAgICAgICBfcmVsZWFzZUxvY2soKQorCitkZWYgX2NoZWNrTGV2ZWwobGV2ZWwpOgorICAgIGlmIGlzaW5zdGFuY2UobGV2ZWwsIChpbnQsIGxvbmcpKToKKyAgICAgICAgcnYgPSBsZXZlbAorICAgIGVsaWYgc3RyKGxldmVsKSA9PSBsZXZlbDoKKyAgICAgICAgaWYgbGV2ZWwgbm90IGluIF9sZXZlbE5hbWVzOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5rbm93biBsZXZlbDogJXIiICUgbGV2ZWwpCisgICAgICAgIHJ2ID0gX2xldmVsTmFtZXNbbGV2ZWxdCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJMZXZlbCBub3QgYW4gaW50ZWdlciBvciBhIHZhbGlkIHN0cmluZzogJXIiICUgbGV2ZWwpCisgICAgcmV0dXJuIHJ2CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICBUaHJlYWQtcmVsYXRlZCBzdHVmZgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjCisjX2xvY2sgaXMgdXNlZCB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHNoYXJlZCBkYXRhIHN0cnVjdHVyZXMgaW4gdGhpcyBtb2R1bGUuCisjVGhpcyBuZWVkcyB0byBiZSBhbiBSTG9jayBiZWNhdXNlIGZpbGVDb25maWcoKSBjcmVhdGVzIGFuZCBjb25maWd1cmVzCisjSGFuZGxlcnMsIGFuZCBzbyBtaWdodCBhcmJpdHJhcnkgdXNlciB0aHJlYWRzLiBTaW5jZSBIYW5kbGVyIGNvZGUgdXBkYXRlcyB0aGUKKyNzaGFyZWQgZGljdGlvbmFyeSBfaGFuZGxlcnMsIGl0IG5lZWRzIHRvIGFjcXVpcmUgdGhlIGxvY2suIEJ1dCBpZiBjb25maWd1cmluZywKKyN0aGUgbG9jayB3b3VsZCBhbHJlYWR5IGhhdmUgYmVlbiBhY3F1aXJlZCAtIHNvIHdlIG5lZWQgYW4gUkxvY2suCisjVGhlIHNhbWUgYXJndW1lbnQgYXBwbGllcyB0byBMb2dnZXJzIGFuZCBNYW5hZ2VyLmxvZ2dlckRpY3QuCisjCitpZiB0aHJlYWQ6CisgICAgX2xvY2sgPSB0aHJlYWRpbmcuUkxvY2soKQorZWxzZToKKyAgICBfbG9jayA9IE5vbmUKKworZGVmIF9hY3F1aXJlTG9jaygpOgorICAgICIiIgorICAgIEFjcXVpcmUgdGhlIG1vZHVsZS1sZXZlbCBsb2NrIGZvciBzZXJpYWxpemluZyBhY2Nlc3MgdG8gc2hhcmVkIGRhdGEuCisKKyAgICBUaGlzIHNob3VsZCBiZSByZWxlYXNlZCB3aXRoIF9yZWxlYXNlTG9jaygpLgorICAgICIiIgorICAgIGlmIF9sb2NrOgorICAgICAgICBfbG9jay5hY3F1aXJlKCkKKworZGVmIF9yZWxlYXNlTG9jaygpOgorICAgICIiIgorICAgIFJlbGVhc2UgdGhlIG1vZHVsZS1sZXZlbCBsb2NrIGFjcXVpcmVkIGJ5IGNhbGxpbmcgX2FjcXVpcmVMb2NrKCkuCisgICAgIiIiCisgICAgaWYgX2xvY2s6CisgICAgICAgIF9sb2NrLnJlbGVhc2UoKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgVGhlIGxvZ2dpbmcgcmVjb3JkCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExvZ1JlY29yZChvYmplY3QpOgorICAgICIiIgorICAgIEEgTG9nUmVjb3JkIGluc3RhbmNlIHJlcHJlc2VudHMgYW4gZXZlbnQgYmVpbmcgbG9nZ2VkLgorCisgICAgTG9nUmVjb3JkIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBldmVyeSB0aW1lIHNvbWV0aGluZyBpcyBsb2dnZWQuIFRoZXkKKyAgICBjb250YWluIGFsbCB0aGUgaW5mb3JtYXRpb24gcGVydGluZW50IHRvIHRoZSBldmVudCBiZWluZyBsb2dnZWQuIFRoZQorICAgIG1haW4gaW5mb3JtYXRpb24gcGFzc2VkIGluIGlzIGluIG1zZyBhbmQgYXJncywgd2hpY2ggYXJlIGNvbWJpbmVkCisgICAgdXNpbmcgc3RyKG1zZykgJSBhcmdzIHRvIGNyZWF0ZSB0aGUgbWVzc2FnZSBmaWVsZCBvZiB0aGUgcmVjb3JkLiBUaGUKKyAgICByZWNvcmQgYWxzbyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIHdoZW4gdGhlIHJlY29yZCB3YXMgY3JlYXRlZCwKKyAgICB0aGUgc291cmNlIGxpbmUgd2hlcmUgdGhlIGxvZ2dpbmcgY2FsbCB3YXMgbWFkZSwgYW5kIGFueSBleGNlcHRpb24KKyAgICBpbmZvcm1hdGlvbiB0byBiZSBsb2dnZWQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGxldmVsLCBwYXRobmFtZSwgbGluZW5vLAorICAgICAgICAgICAgICAgICBtc2csIGFyZ3MsIGV4Y19pbmZvLCBmdW5jPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZSBhIGxvZ2dpbmcgcmVjb3JkIHdpdGggaW50ZXJlc3RpbmcgaW5mb3JtYXRpb24uCisgICAgICAgICIiIgorICAgICAgICBjdCA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKyAgICAgICAgIworICAgICAgICAjIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50IGFsbG93cyBwYXNzaW5nIG9mIGEgZGljdGlvbmFyeSBhcyBhIHNvbGUKKyAgICAgICAgIyBhcmd1bWVudCwgc28gdGhhdCB5b3UgY2FuIGRvIHNvbWV0aGluZyBsaWtlCisgICAgICAgICMgIGxvZ2dpbmcuZGVidWcoImEgJShhKWQgYiAlKGIpcyIsIHsnYSc6MSwgJ2InOjJ9KQorICAgICAgICAjIFN1Z2dlc3RlZCBieSBTdGVmYW4gQmVobmVsLgorICAgICAgICAjIE5vdGUgdGhhdCB3aXRob3V0IHRoZSB0ZXN0IGZvciBhcmdzWzBdLCB3ZSBnZXQgYSBwcm9ibGVtIGJlY2F1c2UKKyAgICAgICAgIyBkdXJpbmcgZm9ybWF0dGluZywgd2UgdGVzdCB0byBzZWUgaWYgdGhlIGFyZyBpcyBwcmVzZW50IHVzaW5nCisgICAgICAgICMgJ2lmIHNlbGYuYXJnczonLiBJZiB0aGUgZXZlbnQgYmVpbmcgbG9nZ2VkIGlzIGUuZy4gJ1ZhbHVlIGlzICVkJworICAgICAgICAjIGFuZCBpZiB0aGUgcGFzc2VkIGFyZyBmYWlscyAnaWYgc2VsZi5hcmdzOicgdGhlbiBubyBmb3JtYXR0aW5nCisgICAgICAgICMgaXMgZG9uZS4gRm9yIGV4YW1wbGUsIGxvZ2dlci53YXJuKCdWYWx1ZSBpcyAlZCcsIDApIHdvdWxkIGxvZworICAgICAgICAjICdWYWx1ZSBpcyAlZCcgaW5zdGVhZCBvZiAnVmFsdWUgaXMgMCcuCisgICAgICAgICMgRm9yIHRoZSB1c2UgY2FzZSBvZiBwYXNzaW5nIGEgZGljdGlvbmFyeSwgdGhpcyBzaG91bGQgbm90IGJlIGEKKyAgICAgICAgIyBwcm9ibGVtLgorICAgICAgICBpZiBhcmdzIGFuZCBsZW4oYXJncykgPT0gMSBhbmQgaXNpbnN0YW5jZShhcmdzWzBdLCBkaWN0KSBhbmQgYXJnc1swXToKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzBdCisgICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKKyAgICAgICAgc2VsZi5sZXZlbG5hbWUgPSBnZXRMZXZlbE5hbWUobGV2ZWwpCisgICAgICAgIHNlbGYubGV2ZWxubyA9IGxldmVsCisgICAgICAgIHNlbGYucGF0aG5hbWUgPSBwYXRobmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRobmFtZSkKKyAgICAgICAgICAgIHNlbGYubW9kdWxlID0gb3MucGF0aC5zcGxpdGV4dChzZWxmLmZpbGVuYW1lKVswXQorICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5maWxlbmFtZSA9IHBhdGhuYW1lCisgICAgICAgICAgICBzZWxmLm1vZHVsZSA9ICJVbmtub3duIG1vZHVsZSIKKyAgICAgICAgc2VsZi5leGNfaW5mbyA9IGV4Y19pbmZvCisgICAgICAgIHNlbGYuZXhjX3RleHQgPSBOb25lICAgICAgIyB1c2VkIHRvIGNhY2hlIHRoZSB0cmFjZWJhY2sgdGV4dAorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworICAgICAgICBzZWxmLmZ1bmNOYW1lID0gZnVuYworICAgICAgICBzZWxmLmNyZWF0ZWQgPSBjdAorICAgICAgICBzZWxmLm1zZWNzID0gKGN0IC0gbG9uZyhjdCkpICogMTAwMAorICAgICAgICBzZWxmLnJlbGF0aXZlQ3JlYXRlZCA9IChzZWxmLmNyZWF0ZWQgLSBfc3RhcnRUaW1lKSAqIDEwMDAKKyAgICAgICAgaWYgbG9nVGhyZWFkcyBhbmQgdGhyZWFkOgorICAgICAgICAgICAgc2VsZi50aHJlYWQgPSB0aHJlYWQuZ2V0X2lkZW50KCkKKyAgICAgICAgICAgIHNlbGYudGhyZWFkTmFtZSA9IHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGhyZWFkID0gTm9uZQorICAgICAgICAgICAgc2VsZi50aHJlYWROYW1lID0gTm9uZQorICAgICAgICBpZiBub3QgbG9nTXVsdGlwcm9jZXNzaW5nOgorICAgICAgICAgICAgc2VsZi5wcm9jZXNzTmFtZSA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc05hbWUgPSAnTWFpblByb2Nlc3MnCisgICAgICAgICAgICBtcCA9IHN5cy5tb2R1bGVzLmdldCgnbXVsdGlwcm9jZXNzaW5nJykKKyAgICAgICAgICAgIGlmIG1wIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgRXJyb3JzIG1heSBvY2N1ciBpZiBtdWx0aXByb2Nlc3NpbmcgaGFzIG5vdCBmaW5pc2hlZCBsb2FkaW5nCisgICAgICAgICAgICAgICAgIyB5ZXQgLSBlLmcuIGlmIGEgY3VzdG9tIGltcG9ydCBob29rIGNhdXNlcyB0aGlyZC1wYXJ0eSBjb2RlCisgICAgICAgICAgICAgICAgIyB0byBydW4gd2hlbiBtdWx0aXByb2Nlc3NpbmcgY2FsbHMgaW1wb3J0LiBTZWUgaXNzdWUgODIwMAorICAgICAgICAgICAgICAgICMgZm9yIGFuIGV4YW1wbGUKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc05hbWUgPSBtcC5jdXJyZW50X3Byb2Nlc3MoKS5uYW1lCisgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgbG9nUHJvY2Vzc2VzIGFuZCBoYXNhdHRyKG9zLCAnZ2V0cGlkJyk6CisgICAgICAgICAgICBzZWxmLnByb2Nlc3MgPSBvcy5nZXRwaWQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wcm9jZXNzID0gTm9uZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPExvZ1JlY29yZDogJXMsICVzLCAlcywgJXMsICIlcyI+JyUoc2VsZi5uYW1lLCBzZWxmLmxldmVsbm8sCisgICAgICAgICAgICBzZWxmLnBhdGhuYW1lLCBzZWxmLmxpbmVubywgc2VsZi5tc2cpCisKKyAgICBkZWYgZ2V0TWVzc2FnZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgbWVzc2FnZSBmb3IgdGhpcyBMb2dSZWNvcmQuCisKKyAgICAgICAgUmV0dXJuIHRoZSBtZXNzYWdlIGZvciB0aGlzIExvZ1JlY29yZCBhZnRlciBtZXJnaW5nIGFueSB1c2VyLXN1cHBsaWVkCisgICAgICAgIGFyZ3VtZW50cyB3aXRoIHRoZSBtZXNzYWdlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IF91bmljb2RlOiAjaWYgbm8gdW5pY29kZSBzdXBwb3J0Li4uCisgICAgICAgICAgICBtc2cgPSBzdHIoc2VsZi5tc2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgPSBzZWxmLm1zZworICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobXNnLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9IHN0cihzZWxmLm1zZykKKyAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLm1zZyAgICAgICNEZWZlciBlbmNvZGluZyB0aWxsIGxhdGVyCisgICAgICAgIGlmIHNlbGYuYXJnczoKKyAgICAgICAgICAgIG1zZyA9IG1zZyAlIHNlbGYuYXJncworICAgICAgICByZXR1cm4gbXNnCisKK2RlZiBtYWtlTG9nUmVjb3JkKGRpY3QpOgorICAgICIiIgorICAgIE1ha2UgYSBMb2dSZWNvcmQgd2hvc2UgYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIGRpY3Rpb25hcnksCisgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIGNvbnZlcnRpbmcgYSBsb2dnaW5nIGV2ZW50IHJlY2VpdmVkIG92ZXIKKyAgICBhIHNvY2tldCBjb25uZWN0aW9uICh3aGljaCBpcyBzZW50IGFzIGEgZGljdGlvbmFyeSkgaW50byBhIExvZ1JlY29yZAorICAgIGluc3RhbmNlLgorICAgICIiIgorICAgIHJ2ID0gTG9nUmVjb3JkKE5vbmUsIE5vbmUsICIiLCAwLCAiIiwgKCksIE5vbmUsIE5vbmUpCisgICAgcnYuX19kaWN0X18udXBkYXRlKGRpY3QpCisgICAgcmV0dXJuIHJ2CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICBGb3JtYXR0ZXIgY2xhc3NlcyBhbmQgZnVuY3Rpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEZvcm1hdHRlcihvYmplY3QpOgorICAgICIiIgorICAgIEZvcm1hdHRlciBpbnN0YW5jZXMgYXJlIHVzZWQgdG8gY29udmVydCBhIExvZ1JlY29yZCB0byB0ZXh0LgorCisgICAgRm9ybWF0dGVycyBuZWVkIHRvIGtub3cgaG93IGEgTG9nUmVjb3JkIGlzIGNvbnN0cnVjdGVkLiBUaGV5IGFyZQorICAgIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIGEgTG9nUmVjb3JkIHRvICh1c3VhbGx5KSBhIHN0cmluZyB3aGljaCBjYW4KKyAgICBiZSBpbnRlcnByZXRlZCBieSBlaXRoZXIgYSBodW1hbiBvciBhbiBleHRlcm5hbCBzeXN0ZW0uIFRoZSBiYXNlIEZvcm1hdHRlcgorICAgIGFsbG93cyBhIGZvcm1hdHRpbmcgc3RyaW5nIHRvIGJlIHNwZWNpZmllZC4gSWYgbm9uZSBpcyBzdXBwbGllZCwgdGhlCisgICAgZGVmYXVsdCB2YWx1ZSBvZiAiJXMobWVzc2FnZSlcXG4iIGlzIHVzZWQuCisKKyAgICBUaGUgRm9ybWF0dGVyIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIGEgZm9ybWF0IHN0cmluZyB3aGljaCBtYWtlcyB1c2Ugb2YKKyAgICBrbm93bGVkZ2Ugb2YgdGhlIExvZ1JlY29yZCBhdHRyaWJ1dGVzIC0gZS5nLiB0aGUgZGVmYXVsdCB2YWx1ZSBtZW50aW9uZWQKKyAgICBhYm92ZSBtYWtlcyB1c2Ugb2YgdGhlIGZhY3QgdGhhdCB0aGUgdXNlcidzIG1lc3NhZ2UgYW5kIGFyZ3VtZW50cyBhcmUgcHJlLQorICAgIGZvcm1hdHRlZCBpbnRvIGEgTG9nUmVjb3JkJ3MgbWVzc2FnZSBhdHRyaWJ1dGUuIEN1cnJlbnRseSwgdGhlIHVzZWZ1bAorICAgIGF0dHJpYnV0ZXMgaW4gYSBMb2dSZWNvcmQgYXJlIGRlc2NyaWJlZCBieToKKworICAgICUobmFtZSlzICAgICAgICAgICAgTmFtZSBvZiB0aGUgbG9nZ2VyIChsb2dnaW5nIGNoYW5uZWwpCisgICAgJShsZXZlbG5vKXMgICAgICAgICBOdW1lcmljIGxvZ2dpbmcgbGV2ZWwgZm9yIHRoZSBtZXNzYWdlIChERUJVRywgSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgIFdBUk5JTkcsIEVSUk9SLCBDUklUSUNBTCkKKyAgICAlKGxldmVsbmFtZSlzICAgICAgIFRleHQgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIG1lc3NhZ2UgKCJERUJVRyIsICJJTkZPIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJXQVJOSU5HIiwgIkVSUk9SIiwgIkNSSVRJQ0FMIikKKyAgICAlKHBhdGhuYW1lKXMgICAgICAgIEZ1bGwgcGF0aG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBsb2dnaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsIHdhcyBpc3N1ZWQgKGlmIGF2YWlsYWJsZSkKKyAgICAlKGZpbGVuYW1lKXMgICAgICAgIEZpbGVuYW1lIHBvcnRpb24gb2YgcGF0aG5hbWUKKyAgICAlKG1vZHVsZSlzICAgICAgICAgIE1vZHVsZSAobmFtZSBwb3J0aW9uIG9mIGZpbGVuYW1lKQorICAgICUobGluZW5vKWQgICAgICAgICAgU291cmNlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBsb2dnaW5nIGNhbGwgd2FzIGlzc3VlZAorICAgICAgICAgICAgICAgICAgICAgICAgKGlmIGF2YWlsYWJsZSkKKyAgICAlKGZ1bmNOYW1lKXMgICAgICAgIEZ1bmN0aW9uIG5hbWUKKyAgICAlKGNyZWF0ZWQpZiAgICAgICAgIFRpbWUgd2hlbiB0aGUgTG9nUmVjb3JkIHdhcyBjcmVhdGVkICh0aW1lLnRpbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlKQorICAgICUoYXNjdGltZSlzICAgICAgICAgVGV4dHVhbCB0aW1lIHdoZW4gdGhlIExvZ1JlY29yZCB3YXMgY3JlYXRlZAorICAgICUobXNlY3MpZCAgICAgICAgICAgTWlsbGlzZWNvbmQgcG9ydGlvbiBvZiB0aGUgY3JlYXRpb24gdGltZQorICAgICUocmVsYXRpdmVDcmVhdGVkKWQgVGltZSBpbiBtaWxsaXNlY29uZHMgd2hlbiB0aGUgTG9nUmVjb3JkIHdhcyBjcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHRpbWUgdGhlIGxvZ2dpbmcgbW9kdWxlIHdhcyBsb2FkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICh0eXBpY2FsbHkgYXQgYXBwbGljYXRpb24gc3RhcnR1cCB0aW1lKQorICAgICUodGhyZWFkKWQgICAgICAgICAgVGhyZWFkIElEIChpZiBhdmFpbGFibGUpCisgICAgJSh0aHJlYWROYW1lKXMgICAgICBUaHJlYWQgbmFtZSAoaWYgYXZhaWxhYmxlKQorICAgICUocHJvY2VzcylkICAgICAgICAgUHJvY2VzcyBJRCAoaWYgYXZhaWxhYmxlKQorICAgICUobWVzc2FnZSlzICAgICAgICAgVGhlIHJlc3VsdCBvZiByZWNvcmQuZ2V0TWVzc2FnZSgpLCBjb21wdXRlZCBqdXN0IGFzCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVjb3JkIGlzIGVtaXR0ZWQKKyAgICAiIiIKKworICAgIGNvbnZlcnRlciA9IHRpbWUubG9jYWx0aW1lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZm10PU5vbmUsIGRhdGVmbXQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIHRoZSBmb3JtYXR0ZXIgd2l0aCBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZ3MuCisKKyAgICAgICAgSW5pdGlhbGl6ZSB0aGUgZm9ybWF0dGVyIGVpdGhlciB3aXRoIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZywgb3IgYQorICAgICAgICBkZWZhdWx0IGFzIGRlc2NyaWJlZCBhYm92ZS4gQWxsb3cgZm9yIHNwZWNpYWxpemVkIGRhdGUgZm9ybWF0dGluZyB3aXRoCisgICAgICAgIHRoZSBvcHRpb25hbCBkYXRlZm10IGFyZ3VtZW50IChpZiBvbWl0dGVkLCB5b3UgZ2V0IHRoZSBJU084NjAxIGZvcm1hdCkuCisgICAgICAgICIiIgorICAgICAgICBpZiBmbXQ6CisgICAgICAgICAgICBzZWxmLl9mbXQgPSBmbXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2ZtdCA9ICIlKG1lc3NhZ2UpcyIKKyAgICAgICAgc2VsZi5kYXRlZm10ID0gZGF0ZWZtdAorCisgICAgZGVmIGZvcm1hdFRpbWUoc2VsZiwgcmVjb3JkLCBkYXRlZm10PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSBzcGVjaWZpZWQgTG9nUmVjb3JkIGFzIGZvcm1hdHRlZCB0ZXh0LgorCisgICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBmb3JtYXQoKSBieSBhIGZvcm1hdHRlciB3aGljaAorICAgICAgICB3YW50cyB0byBtYWtlIHVzZSBvZiBhIGZvcm1hdHRlZCB0aW1lLiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbgorICAgICAgICBpbiBmb3JtYXR0ZXJzIHRvIHByb3ZpZGUgZm9yIGFueSBzcGVjaWZpYyByZXF1aXJlbWVudCwgYnV0IHRoZQorICAgICAgICBiYXNpYyBiZWhhdmlvdXIgaXMgYXMgZm9sbG93czogaWYgZGF0ZWZtdCAoYSBzdHJpbmcpIGlzIHNwZWNpZmllZCwKKyAgICAgICAgaXQgaXMgdXNlZCB3aXRoIHRpbWUuc3RyZnRpbWUoKSB0byBmb3JtYXQgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlCisgICAgICAgIHJlY29yZC4gT3RoZXJ3aXNlLCB0aGUgSVNPODYwMSBmb3JtYXQgaXMgdXNlZC4gVGhlIHJlc3VsdGluZworICAgICAgICBzdHJpbmcgaXMgcmV0dXJuZWQuIFRoaXMgZnVuY3Rpb24gdXNlcyBhIHVzZXItY29uZmlndXJhYmxlIGZ1bmN0aW9uCisgICAgICAgIHRvIGNvbnZlcnQgdGhlIGNyZWF0aW9uIHRpbWUgdG8gYSB0dXBsZS4gQnkgZGVmYXVsdCwgdGltZS5sb2NhbHRpbWUoKQorICAgICAgICBpcyB1c2VkOyB0byBjaGFuZ2UgdGhpcyBmb3IgYSBwYXJ0aWN1bGFyIGZvcm1hdHRlciBpbnN0YW5jZSwgc2V0IHRoZQorICAgICAgICAnY29udmVydGVyJyBhdHRyaWJ1dGUgdG8gYSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhcworICAgICAgICB0aW1lLmxvY2FsdGltZSgpIG9yIHRpbWUuZ210aW1lKCkuIFRvIGNoYW5nZSBpdCBmb3IgYWxsIGZvcm1hdHRlcnMsCisgICAgICAgIGZvciBleGFtcGxlIGlmIHlvdSB3YW50IGFsbCBsb2dnaW5nIHRpbWVzIHRvIGJlIHNob3duIGluIEdNVCwKKyAgICAgICAgc2V0IHRoZSAnY29udmVydGVyJyBhdHRyaWJ1dGUgaW4gdGhlIEZvcm1hdHRlciBjbGFzcy4KKyAgICAgICAgIiIiCisgICAgICAgIGN0ID0gc2VsZi5jb252ZXJ0ZXIocmVjb3JkLmNyZWF0ZWQpCisgICAgICAgIGlmIGRhdGVmbXQ6CisgICAgICAgICAgICBzID0gdGltZS5zdHJmdGltZShkYXRlZm10LCBjdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHQgPSB0aW1lLnN0cmZ0aW1lKCIlWS0lbS0lZCAlSDolTTolUyIsIGN0KQorICAgICAgICAgICAgcyA9ICIlcywlMDNkIiAlICh0LCByZWNvcmQubXNlY3MpCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgZm9ybWF0RXhjZXB0aW9uKHNlbGYsIGVpKToKKyAgICAgICAgIiIiCisgICAgICAgIEZvcm1hdCBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGFzIGEgc3RyaW5nLgorCisgICAgICAgIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IHVzZXMKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4Y2VwdGlvbigpCisgICAgICAgICIiIgorICAgICAgICBzaW8gPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjZXB0aW9uKGVpWzBdLCBlaVsxXSwgZWlbMl0sIE5vbmUsIHNpbykKKyAgICAgICAgcyA9IHNpby5nZXR2YWx1ZSgpCisgICAgICAgIHNpby5jbG9zZSgpCisgICAgICAgIGlmIHNbLTE6XSA9PSAiXG4iOgorICAgICAgICAgICAgcyA9IHNbOi0xXQorICAgICAgICByZXR1cm4gcworCisgICAgZGVmIHVzZXNUaW1lKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2hlY2sgaWYgdGhlIGZvcm1hdCB1c2VzIHRoZSBjcmVhdGlvbiB0aW1lIG9mIHRoZSByZWNvcmQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZm10LmZpbmQoIiUoYXNjdGltZSkiKSA+PSAwCisKKyAgICBkZWYgZm9ybWF0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBGb3JtYXQgdGhlIHNwZWNpZmllZCByZWNvcmQgYXMgdGV4dC4KKworICAgICAgICBUaGUgcmVjb3JkJ3MgYXR0cmlidXRlIGRpY3Rpb25hcnkgaXMgdXNlZCBhcyB0aGUgb3BlcmFuZCB0byBhCisgICAgICAgIHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdGlvbiB3aGljaCB5aWVsZHMgdGhlIHJldHVybmVkIHN0cmluZy4KKyAgICAgICAgQmVmb3JlIGZvcm1hdHRpbmcgdGhlIGRpY3Rpb25hcnksIGEgY291cGxlIG9mIHByZXBhcmF0b3J5IHN0ZXBzCisgICAgICAgIGFyZSBjYXJyaWVkIG91dC4gVGhlIG1lc3NhZ2UgYXR0cmlidXRlIG9mIHRoZSByZWNvcmQgaXMgY29tcHV0ZWQKKyAgICAgICAgdXNpbmcgTG9nUmVjb3JkLmdldE1lc3NhZ2UoKS4gSWYgdGhlIGZvcm1hdHRpbmcgc3RyaW5nIHVzZXMgdGhlCisgICAgICAgIHRpbWUgKGFzIGRldGVybWluZWQgYnkgYSBjYWxsIHRvIHVzZXNUaW1lKCksIGZvcm1hdFRpbWUoKSBpcworICAgICAgICBjYWxsZWQgdG8gZm9ybWF0IHRoZSBldmVudCB0aW1lLiBJZiB0aGVyZSBpcyBleGNlcHRpb24gaW5mb3JtYXRpb24sCisgICAgICAgIGl0IGlzIGZvcm1hdHRlZCB1c2luZyBmb3JtYXRFeGNlcHRpb24oKSBhbmQgYXBwZW5kZWQgdG8gdGhlIG1lc3NhZ2UuCisgICAgICAgICIiIgorICAgICAgICByZWNvcmQubWVzc2FnZSA9IHJlY29yZC5nZXRNZXNzYWdlKCkKKyAgICAgICAgaWYgc2VsZi51c2VzVGltZSgpOgorICAgICAgICAgICAgcmVjb3JkLmFzY3RpbWUgPSBzZWxmLmZvcm1hdFRpbWUocmVjb3JkLCBzZWxmLmRhdGVmbXQpCisgICAgICAgIHMgPSBzZWxmLl9mbXQgJSByZWNvcmQuX19kaWN0X18KKyAgICAgICAgaWYgcmVjb3JkLmV4Y19pbmZvOgorICAgICAgICAgICAgIyBDYWNoZSB0aGUgdHJhY2ViYWNrIHRleHQgdG8gYXZvaWQgY29udmVydGluZyBpdCBtdWx0aXBsZSB0aW1lcworICAgICAgICAgICAgIyAoaXQncyBjb25zdGFudCBhbnl3YXkpCisgICAgICAgICAgICBpZiBub3QgcmVjb3JkLmV4Y190ZXh0OgorICAgICAgICAgICAgICAgIHJlY29yZC5leGNfdGV4dCA9IHNlbGYuZm9ybWF0RXhjZXB0aW9uKHJlY29yZC5leGNfaW5mbykKKyAgICAgICAgaWYgcmVjb3JkLmV4Y190ZXh0OgorICAgICAgICAgICAgaWYgc1stMTpdICE9ICJcbiI6CisgICAgICAgICAgICAgICAgcyA9IHMgKyAiXG4iCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcyA9IHMgKyByZWNvcmQuZXhjX3RleHQKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBTb21ldGltZXMgZmlsZW5hbWVzIGhhdmUgbm9uLUFTQ0lJIGNoYXJzLCB3aGljaCBjYW4gbGVhZAorICAgICAgICAgICAgICAgICMgdG8gZXJyb3JzIHdoZW4gcyBpcyBVbmljb2RlIGFuZCByZWNvcmQuZXhjX3RleHQgaXMgc3RyCisgICAgICAgICAgICAgICAgIyBTZWUgaXNzdWUgODkyNC4KKyAgICAgICAgICAgICAgICAjIFdlIGFsc28gdXNlIHJlcGxhY2UgZm9yIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCisgICAgICAgICAgICAgICAgIyBlbmNvZGluZ3MsIGUuZy4gVVRGLTggZm9yIHRoZSBmaWxlc3lzdGVtIGFuZCBsYXRpbi0xCisgICAgICAgICAgICAgICAgIyBmb3IgYSBzY3JpcHQuIFNlZSBpc3N1ZSAxMzIzMi4KKyAgICAgICAgICAgICAgICBzID0gcyArIHJlY29yZC5leGNfdGV4dC5kZWNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwbGFjZScpCisgICAgICAgIHJldHVybiBzCisKKyMKKyMgICBUaGUgZGVmYXVsdCBmb3JtYXR0ZXIgdG8gdXNlIHdoZW4gbm8gb3RoZXIgaXMgc3BlY2lmaWVkCisjCitfZGVmYXVsdEZvcm1hdHRlciA9IEZvcm1hdHRlcigpCisKK2NsYXNzIEJ1ZmZlcmluZ0Zvcm1hdHRlcihvYmplY3QpOgorICAgICIiIgorICAgIEEgZm9ybWF0dGVyIHN1aXRhYmxlIGZvciBmb3JtYXR0aW5nIGEgbnVtYmVyIG9mIHJlY29yZHMuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmVmbXQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBPcHRpb25hbGx5IHNwZWNpZnkgYSBmb3JtYXR0ZXIgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGZvcm1hdCBlYWNoCisgICAgICAgIGluZGl2aWR1YWwgcmVjb3JkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGluZWZtdDoKKyAgICAgICAgICAgIHNlbGYubGluZWZtdCA9IGxpbmVmbXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubGluZWZtdCA9IF9kZWZhdWx0Rm9ybWF0dGVyCisKKyAgICBkZWYgZm9ybWF0SGVhZGVyKHNlbGYsIHJlY29yZHMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBoZWFkZXIgc3RyaW5nIGZvciB0aGUgc3BlY2lmaWVkIHJlY29yZHMuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gIiIKKworICAgIGRlZiBmb3JtYXRGb290ZXIoc2VsZiwgcmVjb3Jkcyk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGZvb3RlciBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVjb3Jkcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAiIgorCisgICAgZGVmIGZvcm1hdChzZWxmLCByZWNvcmRzKToKKyAgICAgICAgIiIiCisgICAgICAgIEZvcm1hdCB0aGUgc3BlY2lmaWVkIHJlY29yZHMgYW5kIHJldHVybiB0aGUgcmVzdWx0IGFzIGEgc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgcnYgPSAiIgorICAgICAgICBpZiBsZW4ocmVjb3JkcykgPiAwOgorICAgICAgICAgICAgcnYgPSBydiArIHNlbGYuZm9ybWF0SGVhZGVyKHJlY29yZHMpCisgICAgICAgICAgICBmb3IgcmVjb3JkIGluIHJlY29yZHM6CisgICAgICAgICAgICAgICAgcnYgPSBydiArIHNlbGYubGluZWZtdC5mb3JtYXQocmVjb3JkKQorICAgICAgICAgICAgcnYgPSBydiArIHNlbGYuZm9ybWF0Rm9vdGVyKHJlY29yZHMpCisgICAgICAgIHJldHVybiBydgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgRmlsdGVyIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBGaWx0ZXIob2JqZWN0KToKKyAgICAiIiIKKyAgICBGaWx0ZXIgaW5zdGFuY2VzIGFyZSB1c2VkIHRvIHBlcmZvcm0gYXJiaXRyYXJ5IGZpbHRlcmluZyBvZiBMb2dSZWNvcmRzLgorCisgICAgTG9nZ2VycyBhbmQgSGFuZGxlcnMgY2FuIG9wdGlvbmFsbHkgdXNlIEZpbHRlciBpbnN0YW5jZXMgdG8gZmlsdGVyCisgICAgcmVjb3JkcyBhcyBkZXNpcmVkLiBUaGUgYmFzZSBmaWx0ZXIgY2xhc3Mgb25seSBhbGxvd3MgZXZlbnRzIHdoaWNoIGFyZQorICAgIGJlbG93IGEgY2VydGFpbiBwb2ludCBpbiB0aGUgbG9nZ2VyIGhpZXJhcmNoeS4gRm9yIGV4YW1wbGUsIGEgZmlsdGVyCisgICAgaW5pdGlhbGl6ZWQgd2l0aCAiQS5CIiB3aWxsIGFsbG93IGV2ZW50cyBsb2dnZWQgYnkgbG9nZ2VycyAiQS5CIiwKKyAgICAiQS5CLkMiLCAiQS5CLkMuRCIsICJBLkIuRCIgZXRjLiBidXQgbm90ICJBLkJCIiwgIkIuQS5CIiBldGMuIElmCisgICAgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZW1wdHkgc3RyaW5nLCBhbGwgZXZlbnRzIGFyZSBwYXNzZWQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9JycpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZSBhIGZpbHRlci4KKworICAgICAgICBJbml0aWFsaXplIHdpdGggdGhlIG5hbWUgb2YgdGhlIGxvZ2dlciB3aGljaCwgdG9nZXRoZXIgd2l0aCBpdHMKKyAgICAgICAgY2hpbGRyZW4sIHdpbGwgaGF2ZSBpdHMgZXZlbnRzIGFsbG93ZWQgdGhyb3VnaCB0aGUgZmlsdGVyLiBJZiBubworICAgICAgICBuYW1lIGlzIHNwZWNpZmllZCwgYWxsb3cgZXZlcnkgZXZlbnQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYubmxlbiA9IGxlbihuYW1lKQorCisgICAgZGVmIGZpbHRlcihzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRGV0ZXJtaW5lIGlmIHRoZSBzcGVjaWZpZWQgcmVjb3JkIGlzIHRvIGJlIGxvZ2dlZC4KKworICAgICAgICBJcyB0aGUgc3BlY2lmaWVkIHJlY29yZCB0byBiZSBsb2dnZWQ/IFJldHVybnMgMCBmb3Igbm8sIG5vbnplcm8gZm9yCisgICAgICAgIHllcy4gSWYgZGVlbWVkIGFwcHJvcHJpYXRlLCB0aGUgcmVjb3JkIG1heSBiZSBtb2RpZmllZCBpbi1wbGFjZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYubmxlbiA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZWxpZiBzZWxmLm5hbWUgPT0gcmVjb3JkLm5hbWU6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbGlmIHJlY29yZC5uYW1lLmZpbmQoc2VsZi5uYW1lLCAwLCBzZWxmLm5sZW4pICE9IDA6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICByZXR1cm4gKHJlY29yZC5uYW1lW3NlbGYubmxlbl0gPT0gIi4iKQorCitjbGFzcyBGaWx0ZXJlcihvYmplY3QpOgorICAgICIiIgorICAgIEEgYmFzZSBjbGFzcyBmb3IgbG9nZ2VycyBhbmQgaGFuZGxlcnMgd2hpY2ggYWxsb3dzIHRoZW0gdG8gc2hhcmUKKyAgICBjb21tb24gY29kZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIHRoZSBsaXN0IG9mIGZpbHRlcnMgdG8gYmUgYW4gZW1wdHkgbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZmlsdGVycyA9IFtdCisKKyAgICBkZWYgYWRkRmlsdGVyKHNlbGYsIGZpbHRlcik6CisgICAgICAgICIiIgorICAgICAgICBBZGQgdGhlIHNwZWNpZmllZCBmaWx0ZXIgdG8gdGhpcyBoYW5kbGVyLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IChmaWx0ZXIgaW4gc2VsZi5maWx0ZXJzKToKKyAgICAgICAgICAgIHNlbGYuZmlsdGVycy5hcHBlbmQoZmlsdGVyKQorCisgICAgZGVmIHJlbW92ZUZpbHRlcihzZWxmLCBmaWx0ZXIpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZmlsdGVyIGZyb20gdGhpcyBoYW5kbGVyLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZmlsdGVyIGluIHNlbGYuZmlsdGVyczoKKyAgICAgICAgICAgIHNlbGYuZmlsdGVycy5yZW1vdmUoZmlsdGVyKQorCisgICAgZGVmIGZpbHRlcihzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRGV0ZXJtaW5lIGlmIGEgcmVjb3JkIGlzIGxvZ2dhYmxlIGJ5IGNvbnN1bHRpbmcgYWxsIHRoZSBmaWx0ZXJzLgorCisgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRvIGFsbG93IHRoZSByZWNvcmQgdG8gYmUgbG9nZ2VkOyBhbnkgZmlsdGVyIGNhbiB2ZXRvCisgICAgICAgIHRoaXMgYW5kIHRoZSByZWNvcmQgaXMgdGhlbiBkcm9wcGVkLiBSZXR1cm5zIGEgemVybyB2YWx1ZSBpZiBhIHJlY29yZAorICAgICAgICBpcyB0byBiZSBkcm9wcGVkLCBlbHNlIG5vbi16ZXJvLgorICAgICAgICAiIiIKKyAgICAgICAgcnYgPSAxCisgICAgICAgIGZvciBmIGluIHNlbGYuZmlsdGVyczoKKyAgICAgICAgICAgIGlmIG5vdCBmLmZpbHRlcihyZWNvcmQpOgorICAgICAgICAgICAgICAgIHJ2ID0gMAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBydgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgSGFuZGxlciBjbGFzc2VzIGFuZCBmdW5jdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworX2hhbmRsZXJzID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkgICNtYXAgb2YgaGFuZGxlciBuYW1lcyB0byBoYW5kbGVycworX2hhbmRsZXJMaXN0ID0gW10gIyBhZGRlZCB0byBhbGxvdyBoYW5kbGVycyB0byBiZSByZW1vdmVkIGluIHJldmVyc2Ugb2Ygb3JkZXIgaW5pdGlhbGl6ZWQKKworZGVmIF9yZW1vdmVIYW5kbGVyUmVmKHdyKToKKyAgICAiIiIKKyAgICBSZW1vdmUgYSBoYW5kbGVyIHJlZmVyZW5jZSBmcm9tIHRoZSBpbnRlcm5hbCBjbGVhbnVwIGxpc3QuCisgICAgIiIiCisgICAgIyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZHVyaW5nIG1vZHVsZSB0ZWFyZG93biwgd2hlbiBnbG9iYWxzIGFyZQorICAgICMgc2V0IHRvIE5vbmUuIElmIF9hY3F1aXJlTG9jayBpcyBOb25lLCBhc3N1bWUgdGhpcyBpcyB0aGUgY2FzZSBhbmQgZG8KKyAgICAjIG5vdGhpbmcuCisgICAgaWYgKF9hY3F1aXJlTG9jayBpcyBub3QgTm9uZSBhbmQgX2hhbmRsZXJMaXN0IGlzIG5vdCBOb25lIGFuZAorICAgICAgICBfcmVsZWFzZUxvY2sgaXMgbm90IE5vbmUpOgorICAgICAgICBfYWNxdWlyZUxvY2soKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiB3ciBpbiBfaGFuZGxlckxpc3Q6CisgICAgICAgICAgICAgICAgX2hhbmRsZXJMaXN0LnJlbW92ZSh3cikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIF9yZWxlYXNlTG9jaygpCisKK2RlZiBfYWRkSGFuZGxlclJlZihoYW5kbGVyKToKKyAgICAiIiIKKyAgICBBZGQgYSBoYW5kbGVyIHRvIHRoZSBpbnRlcm5hbCBjbGVhbnVwIGxpc3QgdXNpbmcgYSB3ZWFrIHJlZmVyZW5jZS4KKyAgICAiIiIKKyAgICBfYWNxdWlyZUxvY2soKQorICAgIHRyeToKKyAgICAgICAgX2hhbmRsZXJMaXN0LmFwcGVuZCh3ZWFrcmVmLnJlZihoYW5kbGVyLCBfcmVtb3ZlSGFuZGxlclJlZikpCisgICAgZmluYWxseToKKyAgICAgICAgX3JlbGVhc2VMb2NrKCkKKworY2xhc3MgSGFuZGxlcihGaWx0ZXJlcik6CisgICAgIiIiCisgICAgSGFuZGxlciBpbnN0YW5jZXMgZGlzcGF0Y2ggbG9nZ2luZyBldmVudHMgdG8gc3BlY2lmaWMgZGVzdGluYXRpb25zLgorCisgICAgVGhlIGJhc2UgaGFuZGxlciBjbGFzcy4gQWN0cyBhcyBhIHBsYWNlaG9sZGVyIHdoaWNoIGRlZmluZXMgdGhlIEhhbmRsZXIKKyAgICBpbnRlcmZhY2UuIEhhbmRsZXJzIGNhbiBvcHRpb25hbGx5IHVzZSBGb3JtYXR0ZXIgaW5zdGFuY2VzIHRvIGZvcm1hdAorICAgIHJlY29yZHMgYXMgZGVzaXJlZC4gQnkgZGVmYXVsdCwgbm8gZm9ybWF0dGVyIGlzIHNwZWNpZmllZDsgaW4gdGhpcyBjYXNlLAorICAgIHRoZSAncmF3JyBtZXNzYWdlIGFzIGRldGVybWluZWQgYnkgcmVjb3JkLm1lc3NhZ2UgaXMgbG9nZ2VkLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZXZlbD1OT1RTRVQpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlIC0gYmFzaWNhbGx5IHNldHRpbmcgdGhlIGZvcm1hdHRlciB0byBOb25lCisgICAgICAgIGFuZCB0aGUgZmlsdGVyIGxpc3QgdG8gZW1wdHkuCisgICAgICAgICIiIgorICAgICAgICBGaWx0ZXJlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLl9uYW1lID0gTm9uZQorICAgICAgICBzZWxmLmxldmVsID0gX2NoZWNrTGV2ZWwobGV2ZWwpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyID0gTm9uZQorICAgICAgICAjIEFkZCB0aGUgaGFuZGxlciB0byB0aGUgZ2xvYmFsIF9oYW5kbGVyTGlzdCAoZm9yIGNsZWFudXAgb24gc2h1dGRvd24pCisgICAgICAgIF9hZGRIYW5kbGVyUmVmKHNlbGYpCisgICAgICAgIHNlbGYuY3JlYXRlTG9jaygpCisKKyAgICBkZWYgZ2V0X25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBkZWYgc2V0X25hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIF9hY3F1aXJlTG9jaygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX25hbWUgaW4gX2hhbmRsZXJzOgorICAgICAgICAgICAgICAgIGRlbCBfaGFuZGxlcnNbc2VsZi5fbmFtZV0KKyAgICAgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCisgICAgICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgICAgIF9oYW5kbGVyc1tuYW1lXSA9IHNlbGYKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIF9yZWxlYXNlTG9jaygpCisKKyAgICBuYW1lID0gcHJvcGVydHkoZ2V0X25hbWUsIHNldF9uYW1lKQorCisgICAgZGVmIGNyZWF0ZUxvY2soc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBBY3F1aXJlIGEgdGhyZWFkIGxvY2sgZm9yIHNlcmlhbGl6aW5nIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBJL08uCisgICAgICAgICIiIgorICAgICAgICBpZiB0aHJlYWQ6CisgICAgICAgICAgICBzZWxmLmxvY2sgPSB0aHJlYWRpbmcuUkxvY2soKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sb2NrID0gTm9uZQorCisgICAgZGVmIGFjcXVpcmUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBBY3F1aXJlIHRoZSBJL08gdGhyZWFkIGxvY2suCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmxvY2s6CisgICAgICAgICAgICBzZWxmLmxvY2suYWNxdWlyZSgpCisKKyAgICBkZWYgcmVsZWFzZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlbGVhc2UgdGhlIEkvTyB0aHJlYWQgbG9jay4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYubG9jazoKKyAgICAgICAgICAgIHNlbGYubG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBzZXRMZXZlbChzZWxmLCBsZXZlbCk6CisgICAgICAgICIiIgorICAgICAgICBTZXQgdGhlIGxvZ2dpbmcgbGV2ZWwgb2YgdGhpcyBoYW5kbGVyLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5sZXZlbCA9IF9jaGVja0xldmVsKGxldmVsKQorCisgICAgZGVmIGZvcm1hdChzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRm9ybWF0IHRoZSBzcGVjaWZpZWQgcmVjb3JkLgorCisgICAgICAgIElmIGEgZm9ybWF0dGVyIGlzIHNldCwgdXNlIGl0LiBPdGhlcndpc2UsIHVzZSB0aGUgZGVmYXVsdCBmb3JtYXR0ZXIKKyAgICAgICAgZm9yIHRoZSBtb2R1bGUuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmZvcm1hdHRlcjoKKyAgICAgICAgICAgIGZtdCA9IHNlbGYuZm9ybWF0dGVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbXQgPSBfZGVmYXVsdEZvcm1hdHRlcgorICAgICAgICByZXR1cm4gZm10LmZvcm1hdChyZWNvcmQpCisKKyAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRG8gd2hhdGV2ZXIgaXQgdGFrZXMgdG8gYWN0dWFsbHkgbG9nIHRoZSBzcGVjaWZpZWQgbG9nZ2luZyByZWNvcmQuCisKKyAgICAgICAgVGhpcyB2ZXJzaW9uIGlzIGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgYW5kIHNvCisgICAgICAgIHJhaXNlcyBhIE5vdEltcGxlbWVudGVkRXJyb3IuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdlbWl0IG11c3QgYmUgaW1wbGVtZW50ZWQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdieSBIYW5kbGVyIHN1YmNsYXNzZXMnKQorCisgICAgZGVmIGhhbmRsZShzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29uZGl0aW9uYWxseSBlbWl0IHRoZSBzcGVjaWZpZWQgbG9nZ2luZyByZWNvcmQuCisKKyAgICAgICAgRW1pc3Npb24gZGVwZW5kcyBvbiBmaWx0ZXJzIHdoaWNoIG1heSBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGhhbmRsZXIuCisgICAgICAgIFdyYXAgdGhlIGFjdHVhbCBlbWlzc2lvbiBvZiB0aGUgcmVjb3JkIHdpdGggYWNxdWlzaXRpb24vcmVsZWFzZSBvZgorICAgICAgICB0aGUgSS9PIHRocmVhZCBsb2NrLiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZpbHRlciBwYXNzZWQgdGhlIHJlY29yZCBmb3IKKyAgICAgICAgZW1pc3Npb24uCisgICAgICAgICIiIgorICAgICAgICBydiA9IHNlbGYuZmlsdGVyKHJlY29yZCkKKyAgICAgICAgaWYgcnY6CisgICAgICAgICAgICBzZWxmLmFjcXVpcmUoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdChyZWNvcmQpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCisgICAgICAgIHJldHVybiBydgorCisgICAgZGVmIHNldEZvcm1hdHRlcihzZWxmLCBmbXQpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0IHRoZSBmb3JtYXR0ZXIgZm9yIHRoaXMgaGFuZGxlci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZm9ybWF0dGVyID0gZm10CisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBFbnN1cmUgYWxsIGxvZ2dpbmcgb3V0cHV0IGhhcyBiZWVuIGZsdXNoZWQuCisKKyAgICAgICAgVGhpcyB2ZXJzaW9uIGRvZXMgbm90aGluZyBhbmQgaXMgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkKKyAgICAgICAgc3ViY2xhc3Nlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRpZHkgdXAgYW55IHJlc291cmNlcyB1c2VkIGJ5IHRoZSBoYW5kbGVyLgorCisgICAgICAgIFRoaXMgdmVyc2lvbiByZW1vdmVzIHRoZSBoYW5kbGVyIGZyb20gYW4gaW50ZXJuYWwgbWFwIG9mIGhhbmRsZXJzLAorICAgICAgICBfaGFuZGxlcnMsIHdoaWNoIGlzIHVzZWQgZm9yIGhhbmRsZXIgbG9va3VwIGJ5IG5hbWUuIFN1YmNsYXNzZXMKKyAgICAgICAgc2hvdWxkIGVuc3VyZSB0aGF0IHRoaXMgZ2V0cyBjYWxsZWQgZnJvbSBvdmVycmlkZGVuIGNsb3NlKCkKKyAgICAgICAgbWV0aG9kcy4KKyAgICAgICAgIiIiCisgICAgICAgICNnZXQgdGhlIG1vZHVsZSBkYXRhIGxvY2ssIGFzIHdlJ3JlIHVwZGF0aW5nIGEgc2hhcmVkIHN0cnVjdHVyZS4KKyAgICAgICAgX2FjcXVpcmVMb2NrKCkKKyAgICAgICAgdHJ5OiAgICAjdW5saWtlbHkgdG8gcmFpc2UgYW4gZXhjZXB0aW9uLCBidXQgeW91IG5ldmVyIGtub3cuLi4KKyAgICAgICAgICAgIGlmIHNlbGYuX25hbWUgYW5kIHNlbGYuX25hbWUgaW4gX2hhbmRsZXJzOgorICAgICAgICAgICAgICAgIGRlbCBfaGFuZGxlcnNbc2VsZi5fbmFtZV0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIF9yZWxlYXNlTG9jaygpCisKKyAgICBkZWYgaGFuZGxlRXJyb3Ioc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEhhbmRsZSBlcnJvcnMgd2hpY2ggb2NjdXIgZHVyaW5nIGFuIGVtaXQoKSBjYWxsLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBoYW5kbGVycyB3aGVuIGFuIGV4Y2VwdGlvbiBpcworICAgICAgICBlbmNvdW50ZXJlZCBkdXJpbmcgYW4gZW1pdCgpIGNhbGwuIElmIHJhaXNlRXhjZXB0aW9ucyBpcyBmYWxzZSwKKyAgICAgICAgZXhjZXB0aW9ucyBnZXQgc2lsZW50bHkgaWdub3JlZC4gVGhpcyBpcyB3aGF0IGlzIG1vc3RseSB3YW50ZWQKKyAgICAgICAgZm9yIGEgbG9nZ2luZyBzeXN0ZW0gLSBtb3N0IHVzZXJzIHdpbGwgbm90IGNhcmUgYWJvdXQgZXJyb3JzIGluCisgICAgICAgIHRoZSBsb2dnaW5nIHN5c3RlbSwgdGhleSBhcmUgbW9yZSBpbnRlcmVzdGVkIGluIGFwcGxpY2F0aW9uIGVycm9ycy4KKyAgICAgICAgWW91IGNvdWxkLCBob3dldmVyLCByZXBsYWNlIHRoaXMgd2l0aCBhIGN1c3RvbSBoYW5kbGVyIGlmIHlvdSB3aXNoLgorICAgICAgICBUaGUgcmVjb3JkIHdoaWNoIHdhcyBiZWluZyBwcm9jZXNzZWQgaXMgcGFzc2VkIGluIHRvIHRoaXMgbWV0aG9kLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgcmFpc2VFeGNlcHRpb25zIGFuZCBzeXMuc3RkZXJyOiAgIyBzZWUgaXNzdWUgMTM4MDcKKyAgICAgICAgICAgIGVpID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjZXB0aW9uKGVpWzBdLCBlaVsxXSwgZWlbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBzeXMuc3RkZXJyKQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ0xvZ2dlZCBmcm9tIGZpbGUgJXMsIGxpbmUgJXNcbicgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQuZmlsZW5hbWUsIHJlY29yZC5saW5lbm8pKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcyAgICAjIHNlZSBpc3N1ZSA1OTcxCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGRlbCBlaQorCitjbGFzcyBTdHJlYW1IYW5kbGVyKEhhbmRsZXIpOgorICAgICIiIgorICAgIEEgaGFuZGxlciBjbGFzcyB3aGljaCB3cml0ZXMgbG9nZ2luZyByZWNvcmRzLCBhcHByb3ByaWF0ZWx5IGZvcm1hdHRlZCwKKyAgICB0byBhIHN0cmVhbS4gTm90ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3QgY2xvc2UgdGhlIHN0cmVhbSwgYXMKKyAgICBzeXMuc3Rkb3V0IG9yIHN5cy5zdGRlcnIgbWF5IGJlIHVzZWQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZSB0aGUgaGFuZGxlci4KKworICAgICAgICBJZiBzdHJlYW0gaXMgbm90IHNwZWNpZmllZCwgc3lzLnN0ZGVyciBpcyB1c2VkLgorICAgICAgICAiIiIKKyAgICAgICAgSGFuZGxlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBpZiBzdHJlYW0gaXMgTm9uZToKKyAgICAgICAgICAgIHN0cmVhbSA9IHN5cy5zdGRlcnIKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEZsdXNoZXMgdGhlIHN0cmVhbS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuc3RyZWFtIGFuZCBoYXNhdHRyKHNlbGYuc3RyZWFtLCAiZmx1c2giKToKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS5mbHVzaCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQorCisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVtaXQgYSByZWNvcmQuCisKKyAgICAgICAgSWYgYSBmb3JtYXR0ZXIgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIHRvIGZvcm1hdCB0aGUgcmVjb3JkLgorICAgICAgICBUaGUgcmVjb3JkIGlzIHRoZW4gd3JpdHRlbiB0byB0aGUgc3RyZWFtIHdpdGggYSB0cmFpbGluZyBuZXdsaW5lLiAgSWYKKyAgICAgICAgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGlzIHByZXNlbnQsIGl0IGlzIGZvcm1hdHRlZCB1c2luZworICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjZXB0aW9uIGFuZCBhcHBlbmRlZCB0byB0aGUgc3RyZWFtLiAgSWYgdGhlIHN0cmVhbQorICAgICAgICBoYXMgYW4gJ2VuY29kaW5nJyBhdHRyaWJ1dGUsIGl0IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdyB0byBkbyB0aGUKKyAgICAgICAgb3V0cHV0IHRvIHRoZSBzdHJlYW0uCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBzZWxmLmZvcm1hdChyZWNvcmQpCisgICAgICAgICAgICBzdHJlYW0gPSBzZWxmLnN0cmVhbQorICAgICAgICAgICAgZnMgPSAiJXNcbiIKKyAgICAgICAgICAgIGlmIG5vdCBfdW5pY29kZTogI2lmIG5vIHVuaWNvZGUgc3VwcG9ydC4uLgorICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZShmcyAlIG1zZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiAoaXNpbnN0YW5jZShtc2csIHVuaWNvZGUpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihzdHJlYW0sICdlbmNvZGluZycsIE5vbmUpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHVmcyA9IGZzLmRlY29kZShzdHJlYW0uZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKHVmcyAlIG1zZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI1ByaW50aW5nIHRvIHRlcm1pbmFscyBzb21ldGltZXMgZmFpbHMuIEZvciBleGFtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICN3aXRoIGFuIGVuY29kaW5nIG9mICdjcDEyNTEnLCB0aGUgYWJvdmUgd3JpdGUgd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICN3b3JrIGlmIHdyaXR0ZW4gdG8gYSBzdHJlYW0gb3BlbmVkIG9yIHdyYXBwZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGhlIGNvZGVjcyBtb2R1bGUsIGJ1dCBmYWlsIHdoZW4gd3JpdGluZyB0byBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3Rlcm1pbmFsIGV2ZW4gd2hlbiB0aGUgY29kZXBhZ2UgaXMgc2V0IHRvIGNwMTI1MS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjQW4gZXh0cmEgZW5jb2Rpbmcgc3RlcCBzZWVtcyB0byBiZSBuZWVkZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKCh1ZnMgJSBtc2cpLmVuY29kZShzdHJlYW0uZW5jb2RpbmcpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKGZzICUgbXNnKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZShmcyAlIG1zZy5lbmNvZGUoIlVURi04IikpCisgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlY29yZCkKKworY2xhc3MgRmlsZUhhbmRsZXIoU3RyZWFtSGFuZGxlcik6CisgICAgIiIiCisgICAgQSBoYW5kbGVyIGNsYXNzIHdoaWNoIHdyaXRlcyBmb3JtYXR0ZWQgbG9nZ2luZyByZWNvcmRzIHRvIGRpc2sgZmlsZXMuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBtb2RlPSdhJywgZW5jb2Rpbmc9Tm9uZSwgZGVsYXk9MCk6CisgICAgICAgICIiIgorICAgICAgICBPcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSBhbmQgdXNlIGl0IGFzIHRoZSBzdHJlYW0gZm9yIGxvZ2dpbmcuCisgICAgICAgICIiIgorICAgICAgICAja2VlcCB0aGUgYWJzb2x1dGUgcGF0aCwgb3RoZXJ3aXNlIGRlcml2ZWQgY2xhc3NlcyB3aGljaCB1c2UgdGhpcworICAgICAgICAjbWF5IGNvbWUgYSBjcm9wcGVyIHdoZW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGNoYW5nZXMKKyAgICAgICAgaWYgY29kZWNzIGlzIE5vbmU6CisgICAgICAgICAgICBlbmNvZGluZyA9IE5vbmUKKyAgICAgICAgc2VsZi5iYXNlRmlsZW5hbWUgPSBvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpCisgICAgICAgIHNlbGYubW9kZSA9IG1vZGUKKyAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgIGlmIGRlbGF5OgorICAgICAgICAgICAgI1dlIGRvbid0IG9wZW4gdGhlIHN0cmVhbSwgYnV0IHdlIHN0aWxsIG5lZWQgdG8gY2FsbCB0aGUKKyAgICAgICAgICAgICNIYW5kbGVyIGNvbnN0cnVjdG9yIHRvIHNldCBsZXZlbCwgZm9ybWF0dGVyLCBsb2NrIGV0Yy4KKyAgICAgICAgICAgIEhhbmRsZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgU3RyZWFtSGFuZGxlci5fX2luaXRfXyhzZWxmLCBzZWxmLl9vcGVuKCkpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDbG9zZXMgdGhlIHN0cmVhbS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuc3RyZWFtOgorICAgICAgICAgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5zdHJlYW0sICJjbG9zZSIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCisgICAgICAgICAgICAgICAgU3RyZWFtSGFuZGxlci5jbG9zZShzZWxmKQorICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gTm9uZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZWxlYXNlKCkKKworICAgIGRlZiBfb3BlbihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIE9wZW4gdGhlIGN1cnJlbnQgYmFzZSBmaWxlIHdpdGggdGhlIChvcmlnaW5hbCkgbW9kZSBhbmQgZW5jb2RpbmcuCisgICAgICAgIFJldHVybiB0aGUgcmVzdWx0aW5nIHN0cmVhbS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIHN0cmVhbSA9IG9wZW4oc2VsZi5iYXNlRmlsZW5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0cmVhbSA9IGNvZGVjcy5vcGVuKHNlbGYuYmFzZUZpbGVuYW1lLCBzZWxmLm1vZGUsIHNlbGYuZW5jb2RpbmcpCisgICAgICAgIHJldHVybiBzdHJlYW0KKworICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBFbWl0IGEgcmVjb3JkLgorCisgICAgICAgIElmIHRoZSBzdHJlYW0gd2FzIG5vdCBvcGVuZWQgYmVjYXVzZSAnZGVsYXknIHdhcyBzcGVjaWZpZWQgaW4gdGhlCisgICAgICAgIGNvbnN0cnVjdG9yLCBvcGVuIGl0IGJlZm9yZSBjYWxsaW5nIHRoZSBzdXBlcmNsYXNzJ3MgZW1pdC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuc3RyZWFtIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHNlbGYuX29wZW4oKQorICAgICAgICBTdHJlYW1IYW5kbGVyLmVtaXQoc2VsZiwgcmVjb3JkKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgTWFuYWdlciBjbGFzc2VzIGFuZCBmdW5jdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgUGxhY2VIb2xkZXIob2JqZWN0KToKKyAgICAiIiIKKyAgICBQbGFjZUhvbGRlciBpbnN0YW5jZXMgYXJlIHVzZWQgaW4gdGhlIE1hbmFnZXIgbG9nZ2VyIGhpZXJhcmNoeSB0byB0YWtlCisgICAgdGhlIHBsYWNlIG9mIG5vZGVzIGZvciB3aGljaCBubyBsb2dnZXJzIGhhdmUgYmVlbiBkZWZpbmVkLiBUaGlzIGNsYXNzIGlzCisgICAgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5IGFuZCBub3QgYXMgcGFydCBvZiB0aGUgcHVibGljIEFQSS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWxvZ2dlcik6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIHdpdGggdGhlIHNwZWNpZmllZCBsb2dnZXIgYmVpbmcgYSBjaGlsZCBvZiB0aGlzIHBsYWNlaG9sZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgI3NlbGYubG9nZ2VycyA9IFthbG9nZ2VyXQorICAgICAgICBzZWxmLmxvZ2dlck1hcCA9IHsgYWxvZ2dlciA6IE5vbmUgfQorCisgICAgZGVmIGFwcGVuZChzZWxmLCBhbG9nZ2VyKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCB0aGUgc3BlY2lmaWVkIGxvZ2dlciBhcyBhIGNoaWxkIG9mIHRoaXMgcGxhY2Vob2xkZXIuCisgICAgICAgICIiIgorICAgICAgICAjaWYgYWxvZ2dlciBub3QgaW4gc2VsZi5sb2dnZXJzOgorICAgICAgICBpZiBhbG9nZ2VyIG5vdCBpbiBzZWxmLmxvZ2dlck1hcDoKKyAgICAgICAgICAgICNzZWxmLmxvZ2dlcnMuYXBwZW5kKGFsb2dnZXIpCisgICAgICAgICAgICBzZWxmLmxvZ2dlck1hcFthbG9nZ2VyXSA9IE5vbmUKKworIworIyAgIERldGVybWluZSB3aGljaCBjbGFzcyB0byB1c2Ugd2hlbiBpbnN0YW50aWF0aW5nIGxvZ2dlcnMuCisjCitfbG9nZ2VyQ2xhc3MgPSBOb25lCisKK2RlZiBzZXRMb2dnZXJDbGFzcyhrbGFzcyk6CisgICAgIiIiCisgICAgU2V0IHRoZSBjbGFzcyB0byBiZSB1c2VkIHdoZW4gaW5zdGFudGlhdGluZyBhIGxvZ2dlci4gVGhlIGNsYXNzIHNob3VsZAorICAgIGRlZmluZSBfX2luaXRfXygpIHN1Y2ggdGhhdCBvbmx5IGEgbmFtZSBhcmd1bWVudCBpcyByZXF1aXJlZCwgYW5kIHRoZQorICAgIF9faW5pdF9fKCkgc2hvdWxkIGNhbGwgTG9nZ2VyLl9faW5pdF9fKCkKKyAgICAiIiIKKyAgICBpZiBrbGFzcyAhPSBMb2dnZXI6CisgICAgICAgIGlmIG5vdCBpc3N1YmNsYXNzKGtsYXNzLCBMb2dnZXIpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJsb2dnZXIgbm90IGRlcml2ZWQgZnJvbSBsb2dnaW5nLkxvZ2dlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsga2xhc3MuX19uYW1lX18pCisgICAgZ2xvYmFsIF9sb2dnZXJDbGFzcworICAgIF9sb2dnZXJDbGFzcyA9IGtsYXNzCisKK2RlZiBnZXRMb2dnZXJDbGFzcygpOgorICAgICIiIgorICAgIFJldHVybiB0aGUgY2xhc3MgdG8gYmUgdXNlZCB3aGVuIGluc3RhbnRpYXRpbmcgYSBsb2dnZXIuCisgICAgIiIiCisKKyAgICByZXR1cm4gX2xvZ2dlckNsYXNzCisKK2NsYXNzIE1hbmFnZXIob2JqZWN0KToKKyAgICAiIiIKKyAgICBUaGVyZSBpcyBbdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXNdIGp1c3Qgb25lIE1hbmFnZXIgaW5zdGFuY2UsIHdoaWNoCisgICAgaG9sZHMgdGhlIGhpZXJhcmNoeSBvZiBsb2dnZXJzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290bm9kZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIHRoZSBtYW5hZ2VyIHdpdGggdGhlIHJvb3Qgbm9kZSBvZiB0aGUgbG9nZ2VyIGhpZXJhcmNoeS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucm9vdCA9IHJvb3Rub2RlCisgICAgICAgIHNlbGYuZGlzYWJsZSA9IDAKKyAgICAgICAgc2VsZi5lbWl0dGVkTm9IYW5kbGVyV2FybmluZyA9IDAKKyAgICAgICAgc2VsZi5sb2dnZXJEaWN0ID0ge30KKyAgICAgICAgc2VsZi5sb2dnZXJDbGFzcyA9IE5vbmUKKworICAgIGRlZiBnZXRMb2dnZXIoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIgorICAgICAgICBHZXQgYSBsb2dnZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgKGNoYW5uZWwgbmFtZSksIGNyZWF0aW5nIGl0CisgICAgICAgIGlmIGl0IGRvZXNuJ3QgeWV0IGV4aXN0LiBUaGlzIG5hbWUgaXMgYSBkb3Qtc2VwYXJhdGVkIGhpZXJhcmNoaWNhbAorICAgICAgICBuYW1lLCBzdWNoIGFzICJhIiwgImEuYiIsICJhLmIuYyIgb3Igc2ltaWxhci4KKworICAgICAgICBJZiBhIFBsYWNlSG9sZGVyIGV4aXN0ZWQgZm9yIHRoZSBzcGVjaWZpZWQgbmFtZSBbaS5lLiB0aGUgbG9nZ2VyCisgICAgICAgIGRpZG4ndCBleGlzdCBidXQgYSBjaGlsZCBvZiBpdCBkaWRdLCByZXBsYWNlIGl0IHdpdGggdGhlIGNyZWF0ZWQKKyAgICAgICAgbG9nZ2VyIGFuZCBmaXggdXAgdGhlIHBhcmVudC9jaGlsZCByZWZlcmVuY2VzIHdoaWNoIHBvaW50ZWQgdG8gdGhlCisgICAgICAgIHBsYWNlaG9sZGVyIHRvIG5vdyBwb2ludCB0byB0aGUgbG9nZ2VyLgorICAgICAgICAiIiIKKyAgICAgICAgcnYgPSBOb25lCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5hbWUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdBIGxvZ2dlciBuYW1lIG11c3QgYmUgc3RyaW5nIG9yIFVuaWNvZGUnKQorICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWUsIHVuaWNvZGUpOgorICAgICAgICAgICAgbmFtZSA9IG5hbWUuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIF9hY3F1aXJlTG9jaygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5sb2dnZXJEaWN0OgorICAgICAgICAgICAgICAgIHJ2ID0gc2VsZi5sb2dnZXJEaWN0W25hbWVdCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShydiwgUGxhY2VIb2xkZXIpOgorICAgICAgICAgICAgICAgICAgICBwaCA9IHJ2CisgICAgICAgICAgICAgICAgICAgIHJ2ID0gKHNlbGYubG9nZ2VyQ2xhc3Mgb3IgX2xvZ2dlckNsYXNzKShuYW1lKQorICAgICAgICAgICAgICAgICAgICBydi5tYW5hZ2VyID0gc2VsZgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlckRpY3RbbmFtZV0gPSBydgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9maXh1cENoaWxkcmVuKHBoLCBydikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZml4dXBQYXJlbnRzKHJ2KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBydiA9IChzZWxmLmxvZ2dlckNsYXNzIG9yIF9sb2dnZXJDbGFzcykobmFtZSkKKyAgICAgICAgICAgICAgICBydi5tYW5hZ2VyID0gc2VsZgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyRGljdFtuYW1lXSA9IHJ2CisgICAgICAgICAgICAgICAgc2VsZi5fZml4dXBQYXJlbnRzKHJ2KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX3JlbGVhc2VMb2NrKCkKKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgc2V0TG9nZ2VyQ2xhc3Moc2VsZiwga2xhc3MpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0IHRoZSBjbGFzcyB0byBiZSB1c2VkIHdoZW4gaW5zdGFudGlhdGluZyBhIGxvZ2dlciB3aXRoIHRoaXMgTWFuYWdlci4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGtsYXNzICE9IExvZ2dlcjoKKyAgICAgICAgICAgIGlmIG5vdCBpc3N1YmNsYXNzKGtsYXNzLCBMb2dnZXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigibG9nZ2VyIG5vdCBkZXJpdmVkIGZyb20gbG9nZ2luZy5Mb2dnZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBrbGFzcy5fX25hbWVfXykKKyAgICAgICAgc2VsZi5sb2dnZXJDbGFzcyA9IGtsYXNzCisKKyAgICBkZWYgX2ZpeHVwUGFyZW50cyhzZWxmLCBhbG9nZ2VyKToKKyAgICAgICAgIiIiCisgICAgICAgIEVuc3VyZSB0aGF0IHRoZXJlIGFyZSBlaXRoZXIgbG9nZ2VycyBvciBwbGFjZWhvbGRlcnMgYWxsIHRoZSB3YXkKKyAgICAgICAgZnJvbSB0aGUgc3BlY2lmaWVkIGxvZ2dlciB0byB0aGUgcm9vdCBvZiB0aGUgbG9nZ2VyIGhpZXJhcmNoeS4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSBhbG9nZ2VyLm5hbWUKKyAgICAgICAgaSA9IG5hbWUucmZpbmQoIi4iKQorICAgICAgICBydiA9IE5vbmUKKyAgICAgICAgd2hpbGUgKGkgPiAwKSBhbmQgbm90IHJ2OgorICAgICAgICAgICAgc3Vic3RyID0gbmFtZVs6aV0KKyAgICAgICAgICAgIGlmIHN1YnN0ciBub3QgaW4gc2VsZi5sb2dnZXJEaWN0OgorICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyRGljdFtzdWJzdHJdID0gUGxhY2VIb2xkZXIoYWxvZ2dlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2JqID0gc2VsZi5sb2dnZXJEaWN0W3N1YnN0cl0KKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgTG9nZ2VyKToKKyAgICAgICAgICAgICAgICAgICAgcnYgPSBvYmoKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvYmosIFBsYWNlSG9sZGVyKQorICAgICAgICAgICAgICAgICAgICBvYmouYXBwZW5kKGFsb2dnZXIpCisgICAgICAgICAgICBpID0gbmFtZS5yZmluZCgiLiIsIDAsIGkgLSAxKQorICAgICAgICBpZiBub3QgcnY6CisgICAgICAgICAgICBydiA9IHNlbGYucm9vdAorICAgICAgICBhbG9nZ2VyLnBhcmVudCA9IHJ2CisKKyAgICBkZWYgX2ZpeHVwQ2hpbGRyZW4oc2VsZiwgcGgsIGFsb2dnZXIpOgorICAgICAgICAiIiIKKyAgICAgICAgRW5zdXJlIHRoYXQgY2hpbGRyZW4gb2YgdGhlIHBsYWNlaG9sZGVyIHBoIGFyZSBjb25uZWN0ZWQgdG8gdGhlCisgICAgICAgIHNwZWNpZmllZCBsb2dnZXIuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gYWxvZ2dlci5uYW1lCisgICAgICAgIG5hbWVsZW4gPSBsZW4obmFtZSkKKyAgICAgICAgZm9yIGMgaW4gcGgubG9nZ2VyTWFwLmtleXMoKToKKyAgICAgICAgICAgICNUaGUgaWYgbWVhbnMgLi4uIGlmIG5vdCBjLnBhcmVudC5uYW1lLnN0YXJ0c3dpdGgobm0pCisgICAgICAgICAgICBpZiBjLnBhcmVudC5uYW1lWzpuYW1lbGVuXSAhPSBuYW1lOgorICAgICAgICAgICAgICAgIGFsb2dnZXIucGFyZW50ID0gYy5wYXJlbnQKKyAgICAgICAgICAgICAgICBjLnBhcmVudCA9IGFsb2dnZXIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgIExvZ2dlciBjbGFzc2VzIGFuZCBmdW5jdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTG9nZ2VyKEZpbHRlcmVyKToKKyAgICAiIiIKKyAgICBJbnN0YW5jZXMgb2YgdGhlIExvZ2dlciBjbGFzcyByZXByZXNlbnQgYSBzaW5nbGUgbG9nZ2luZyBjaGFubmVsLiBBCisgICAgImxvZ2dpbmcgY2hhbm5lbCIgaW5kaWNhdGVzIGFuIGFyZWEgb2YgYW4gYXBwbGljYXRpb24uIEV4YWN0bHkgaG93IGFuCisgICAgImFyZWEiIGlzIGRlZmluZWQgaXMgdXAgdG8gdGhlIGFwcGxpY2F0aW9uIGRldmVsb3Blci4gU2luY2UgYW4KKyAgICBhcHBsaWNhdGlvbiBjYW4gaGF2ZSBhbnkgbnVtYmVyIG9mIGFyZWFzLCBsb2dnaW5nIGNoYW5uZWxzIGFyZSBpZGVudGlmaWVkCisgICAgYnkgYSB1bmlxdWUgc3RyaW5nLiBBcHBsaWNhdGlvbiBhcmVhcyBjYW4gYmUgbmVzdGVkIChlLmcuIGFuIGFyZWEKKyAgICBvZiAiaW5wdXQgcHJvY2Vzc2luZyIgbWlnaHQgaW5jbHVkZSBzdWItYXJlYXMgInJlYWQgQ1NWIGZpbGVzIiwgInJlYWQKKyAgICBYTFMgZmlsZXMiIGFuZCAicmVhZCBHbnVtZXJpYyBmaWxlcyIpLiBUbyBjYXRlciBmb3IgdGhpcyBuYXR1cmFsIG5lc3RpbmcsCisgICAgY2hhbm5lbCBuYW1lcyBhcmUgb3JnYW5pemVkIGludG8gYSBuYW1lc3BhY2UgaGllcmFyY2h5IHdoZXJlIGxldmVscyBhcmUKKyAgICBzZXBhcmF0ZWQgYnkgcGVyaW9kcywgbXVjaCBsaWtlIHRoZSBKYXZhIG9yIFB5dGhvbiBwYWNrYWdlIG5hbWVzcGFjZS4gU28KKyAgICBpbiB0aGUgaW5zdGFuY2UgZ2l2ZW4gYWJvdmUsIGNoYW5uZWwgbmFtZXMgbWlnaHQgYmUgImlucHV0IiBmb3IgdGhlIHVwcGVyCisgICAgbGV2ZWwsIGFuZCAiaW5wdXQuY3N2IiwgImlucHV0LnhscyIgYW5kICJpbnB1dC5nbnUiIGZvciB0aGUgc3ViLWxldmVscy4KKyAgICBUaGVyZSBpcyBubyBhcmJpdHJhcnkgbGltaXQgdG8gdGhlIGRlcHRoIG9mIG5lc3RpbmcuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGxldmVsPU5PVFNFVCk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIHRoZSBsb2dnZXIgd2l0aCBhIG5hbWUgYW5kIGFuIG9wdGlvbmFsIGxldmVsLgorICAgICAgICAiIiIKKyAgICAgICAgRmlsdGVyZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmxldmVsID0gX2NoZWNrTGV2ZWwobGV2ZWwpCisgICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQorICAgICAgICBzZWxmLnByb3BhZ2F0ZSA9IDEKKyAgICAgICAgc2VsZi5oYW5kbGVycyA9IFtdCisgICAgICAgIHNlbGYuZGlzYWJsZWQgPSAwCisKKyAgICBkZWYgc2V0TGV2ZWwoc2VsZiwgbGV2ZWwpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0IHRoZSBsb2dnaW5nIGxldmVsIG9mIHRoaXMgbG9nZ2VyLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5sZXZlbCA9IF9jaGVja0xldmVsKGxldmVsKQorCisgICAgZGVmIGRlYnVnKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIExvZyAnbXNnICUgYXJncycgd2l0aCBzZXZlcml0eSAnREVCVUcnLgorCisgICAgICAgIFRvIHBhc3MgZXhjZXB0aW9uIGluZm9ybWF0aW9uLCB1c2UgdGhlIGtleXdvcmQgYXJndW1lbnQgZXhjX2luZm8gd2l0aAorICAgICAgICBhIHRydWUgdmFsdWUsIGUuZy4KKworICAgICAgICBsb2dnZXIuZGVidWcoIkhvdXN0b24sIHdlIGhhdmUgYSAlcyIsICJ0aG9ybnkgcHJvYmxlbSIsIGV4Y19pbmZvPTEpCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmlzRW5hYmxlZEZvcihERUJVRyk6CisgICAgICAgICAgICBzZWxmLl9sb2coREVCVUcsIG1zZywgYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgaW5mbyhzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBMb2cgJ21zZyAlIGFyZ3MnIHdpdGggc2V2ZXJpdHkgJ0lORk8nLgorCisgICAgICAgIFRvIHBhc3MgZXhjZXB0aW9uIGluZm9ybWF0aW9uLCB1c2UgdGhlIGtleXdvcmQgYXJndW1lbnQgZXhjX2luZm8gd2l0aAorICAgICAgICBhIHRydWUgdmFsdWUsIGUuZy4KKworICAgICAgICBsb2dnZXIuaW5mbygiSG91c3Rvbiwgd2UgaGF2ZSBhICVzIiwgImludGVyZXN0aW5nIHByb2JsZW0iLCBleGNfaW5mbz0xKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5pc0VuYWJsZWRGb3IoSU5GTyk6CisgICAgICAgICAgICBzZWxmLl9sb2coSU5GTywgbXNnLCBhcmdzLCAqKmt3YXJncykKKworICAgIGRlZiB3YXJuaW5nKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIExvZyAnbXNnICUgYXJncycgd2l0aCBzZXZlcml0eSAnV0FSTklORycuCisKKyAgICAgICAgVG8gcGFzcyBleGNlcHRpb24gaW5mb3JtYXRpb24sIHVzZSB0aGUga2V5d29yZCBhcmd1bWVudCBleGNfaW5mbyB3aXRoCisgICAgICAgIGEgdHJ1ZSB2YWx1ZSwgZS5nLgorCisgICAgICAgIGxvZ2dlci53YXJuaW5nKCJIb3VzdG9uLCB3ZSBoYXZlIGEgJXMiLCAiYml0IG9mIGEgcHJvYmxlbSIsIGV4Y19pbmZvPTEpCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmlzRW5hYmxlZEZvcihXQVJOSU5HKToKKyAgICAgICAgICAgIHNlbGYuX2xvZyhXQVJOSU5HLCBtc2csIGFyZ3MsICoqa3dhcmdzKQorCisgICAgd2FybiA9IHdhcm5pbmcKKworICAgIGRlZiBlcnJvcihzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBMb2cgJ21zZyAlIGFyZ3MnIHdpdGggc2V2ZXJpdHkgJ0VSUk9SJy4KKworICAgICAgICBUbyBwYXNzIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiwgdXNlIHRoZSBrZXl3b3JkIGFyZ3VtZW50IGV4Y19pbmZvIHdpdGgKKyAgICAgICAgYSB0cnVlIHZhbHVlLCBlLmcuCisKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJIb3VzdG9uLCB3ZSBoYXZlIGEgJXMiLCAibWFqb3IgcHJvYmxlbSIsIGV4Y19pbmZvPTEpCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmlzRW5hYmxlZEZvcihFUlJPUik6CisgICAgICAgICAgICBzZWxmLl9sb2coRVJST1IsIG1zZywgYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgZXhjZXB0aW9uKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgbG9nZ2luZyBhbiBFUlJPUiB3aXRoIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIGt3YXJnc1snZXhjX2luZm8nXSA9IDEKKyAgICAgICAgc2VsZi5lcnJvcihtc2csICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBjcml0aWNhbChzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBMb2cgJ21zZyAlIGFyZ3MnIHdpdGggc2V2ZXJpdHkgJ0NSSVRJQ0FMJy4KKworICAgICAgICBUbyBwYXNzIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiwgdXNlIHRoZSBrZXl3b3JkIGFyZ3VtZW50IGV4Y19pbmZvIHdpdGgKKyAgICAgICAgYSB0cnVlIHZhbHVlLCBlLmcuCisKKyAgICAgICAgbG9nZ2VyLmNyaXRpY2FsKCJIb3VzdG9uLCB3ZSBoYXZlIGEgJXMiLCAibWFqb3IgZGlzYXN0ZXIiLCBleGNfaW5mbz0xKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5pc0VuYWJsZWRGb3IoQ1JJVElDQUwpOgorICAgICAgICAgICAgc2VsZi5fbG9nKENSSVRJQ0FMLCBtc2csIGFyZ3MsICoqa3dhcmdzKQorCisgICAgZmF0YWwgPSBjcml0aWNhbAorCisgICAgZGVmIGxvZyhzZWxmLCBsZXZlbCwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgTG9nICdtc2cgJSBhcmdzJyB3aXRoIHRoZSBpbnRlZ2VyIHNldmVyaXR5ICdsZXZlbCcuCisKKyAgICAgICAgVG8gcGFzcyBleGNlcHRpb24gaW5mb3JtYXRpb24sIHVzZSB0aGUga2V5d29yZCBhcmd1bWVudCBleGNfaW5mbyB3aXRoCisgICAgICAgIGEgdHJ1ZSB2YWx1ZSwgZS5nLgorCisgICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsICJXZSBoYXZlIGEgJXMiLCAibXlzdGVyaW91cyBwcm9ibGVtIiwgZXhjX2luZm89MSkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGxldmVsLCBpbnQpOgorICAgICAgICAgICAgaWYgcmFpc2VFeGNlcHRpb25zOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigibGV2ZWwgbXVzdCBiZSBhbiBpbnRlZ2VyIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuaXNFbmFibGVkRm9yKGxldmVsKToKKyAgICAgICAgICAgIHNlbGYuX2xvZyhsZXZlbCwgbXNnLCBhcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBmaW5kQ2FsbGVyKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgRmluZCB0aGUgc3RhY2sgZnJhbWUgb2YgdGhlIGNhbGxlciBzbyB0aGF0IHdlIGNhbiBub3RlIHRoZSBzb3VyY2UKKyAgICAgICAgZmlsZSBuYW1lLCBsaW5lIG51bWJlciBhbmQgZnVuY3Rpb24gbmFtZS4KKyAgICAgICAgIiIiCisgICAgICAgIGYgPSBjdXJyZW50ZnJhbWUoKQorICAgICAgICAjT24gc29tZSB2ZXJzaW9ucyBvZiBJcm9uUHl0aG9uLCBjdXJyZW50ZnJhbWUoKSByZXR1cm5zIE5vbmUgaWYKKyAgICAgICAgI0lyb25QeXRob24gaXNuJ3QgcnVuIHdpdGggLVg6RnJhbWVzLgorICAgICAgICBpZiBmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZiA9IGYuZl9iYWNrCisgICAgICAgIHJ2ID0gIih1bmtub3duIGZpbGUpIiwgMCwgIih1bmtub3duIGZ1bmN0aW9uKSIKKyAgICAgICAgd2hpbGUgaGFzYXR0cihmLCAiZl9jb2RlIik6CisgICAgICAgICAgICBjbyA9IGYuZl9jb2RlCisgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGgubm9ybWNhc2UoY28uY29fZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSBfc3JjZmlsZToKKyAgICAgICAgICAgICAgICBmID0gZi5mX2JhY2sKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcnYgPSAoY28uY29fZmlsZW5hbWUsIGYuZl9saW5lbm8sIGNvLmNvX25hbWUpCisgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBtYWtlUmVjb3JkKHNlbGYsIG5hbWUsIGxldmVsLCBmbiwgbG5vLCBtc2csIGFyZ3MsIGV4Y19pbmZvLCBmdW5jPU5vbmUsIGV4dHJhPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQSBmYWN0b3J5IG1ldGhvZCB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBzdWJjbGFzc2VzIHRvIGNyZWF0ZQorICAgICAgICBzcGVjaWFsaXplZCBMb2dSZWNvcmRzLgorICAgICAgICAiIiIKKyAgICAgICAgcnYgPSBMb2dSZWNvcmQobmFtZSwgbGV2ZWwsIGZuLCBsbm8sIG1zZywgYXJncywgZXhjX2luZm8sIGZ1bmMpCisgICAgICAgIGlmIGV4dHJhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9yIGtleSBpbiBleHRyYToKKyAgICAgICAgICAgICAgICBpZiAoa2V5IGluIFsibWVzc2FnZSIsICJhc2N0aW1lIl0pIG9yIChrZXkgaW4gcnYuX19kaWN0X18pOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiQXR0ZW1wdCB0byBvdmVyd3JpdGUgJXIgaW4gTG9nUmVjb3JkIiAlIGtleSkKKyAgICAgICAgICAgICAgICBydi5fX2RpY3RfX1trZXldID0gZXh0cmFba2V5XQorICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBfbG9nKHNlbGYsIGxldmVsLCBtc2csIGFyZ3MsIGV4Y19pbmZvPU5vbmUsIGV4dHJhPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgTG93LWxldmVsIGxvZ2dpbmcgcm91dGluZSB3aGljaCBjcmVhdGVzIGEgTG9nUmVjb3JkIGFuZCB0aGVuIGNhbGxzCisgICAgICAgIGFsbCB0aGUgaGFuZGxlcnMgb2YgdGhpcyBsb2dnZXIgdG8gaGFuZGxlIHRoZSByZWNvcmQuCisgICAgICAgICIiIgorICAgICAgICBpZiBfc3JjZmlsZToKKyAgICAgICAgICAgICNJcm9uUHl0aG9uIGRvZXNuJ3QgdHJhY2sgUHl0aG9uIGZyYW1lcywgc28gZmluZENhbGxlciByYWlzZXMgYW4KKyAgICAgICAgICAgICNleGNlcHRpb24gb24gc29tZSB2ZXJzaW9ucyBvZiBJcm9uUHl0aG9uLiBXZSB0cmFwIGl0IGhlcmUgc28gdGhhdAorICAgICAgICAgICAgI0lyb25QeXRob24gY2FuIHVzZSBsb2dnaW5nLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZuLCBsbm8sIGZ1bmMgPSBzZWxmLmZpbmRDYWxsZXIoKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgZm4sIGxubywgZnVuYyA9ICIodW5rbm93biBmaWxlKSIsIDAsICIodW5rbm93biBmdW5jdGlvbikiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbiwgbG5vLCBmdW5jID0gIih1bmtub3duIGZpbGUpIiwgMCwgIih1bmtub3duIGZ1bmN0aW9uKSIKKyAgICAgICAgaWYgZXhjX2luZm86CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGNfaW5mbywgdHVwbGUpOgorICAgICAgICAgICAgICAgIGV4Y19pbmZvID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgcmVjb3JkID0gc2VsZi5tYWtlUmVjb3JkKHNlbGYubmFtZSwgbGV2ZWwsIGZuLCBsbm8sIG1zZywgYXJncywgZXhjX2luZm8sIGZ1bmMsIGV4dHJhKQorICAgICAgICBzZWxmLmhhbmRsZShyZWNvcmQpCisKKyAgICBkZWYgaGFuZGxlKHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBDYWxsIHRoZSBoYW5kbGVycyBmb3IgdGhlIHNwZWNpZmllZCByZWNvcmQuCisKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgdW5waWNrbGVkIHJlY29yZHMgcmVjZWl2ZWQgZnJvbSBhIHNvY2tldCwgYXMKKyAgICAgICAgd2VsbCBhcyB0aG9zZSBjcmVhdGVkIGxvY2FsbHkuIExvZ2dlci1sZXZlbCBmaWx0ZXJpbmcgaXMgYXBwbGllZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIChub3Qgc2VsZi5kaXNhYmxlZCkgYW5kIHNlbGYuZmlsdGVyKHJlY29yZCk6CisgICAgICAgICAgICBzZWxmLmNhbGxIYW5kbGVycyhyZWNvcmQpCisKKyAgICBkZWYgYWRkSGFuZGxlcihzZWxmLCBoZGxyKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCB0aGUgc3BlY2lmaWVkIGhhbmRsZXIgdG8gdGhpcyBsb2dnZXIuCisgICAgICAgICIiIgorICAgICAgICBfYWNxdWlyZUxvY2soKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3QgKGhkbHIgaW4gc2VsZi5oYW5kbGVycyk6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVycy5hcHBlbmQoaGRscikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIF9yZWxlYXNlTG9jaygpCisKKyAgICBkZWYgcmVtb3ZlSGFuZGxlcihzZWxmLCBoZGxyKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGhhbmRsZXIgZnJvbSB0aGlzIGxvZ2dlci4KKyAgICAgICAgIiIiCisgICAgICAgIF9hY3F1aXJlTG9jaygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGhkbHIgaW4gc2VsZi5oYW5kbGVyczoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZXJzLnJlbW92ZShoZGxyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX3JlbGVhc2VMb2NrKCkKKworICAgIGRlZiBjYWxsSGFuZGxlcnMoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIFBhc3MgYSByZWNvcmQgdG8gYWxsIHJlbGV2YW50IGhhbmRsZXJzLgorCisgICAgICAgIExvb3AgdGhyb3VnaCBhbGwgaGFuZGxlcnMgZm9yIHRoaXMgbG9nZ2VyIGFuZCBpdHMgcGFyZW50cyBpbiB0aGUKKyAgICAgICAgbG9nZ2VyIGhpZXJhcmNoeS4gSWYgbm8gaGFuZGxlciB3YXMgZm91bmQsIG91dHB1dCBhIG9uZS1vZmYgZXJyb3IKKyAgICAgICAgbWVzc2FnZSB0byBzeXMuc3RkZXJyLiBTdG9wIHNlYXJjaGluZyB1cCB0aGUgaGllcmFyY2h5IHdoZW5ldmVyIGEKKyAgICAgICAgbG9nZ2VyIHdpdGggdGhlICJwcm9wYWdhdGUiIGF0dHJpYnV0ZSBzZXQgdG8gemVybyBpcyBmb3VuZCAtIHRoYXQKKyAgICAgICAgd2lsbCBiZSB0aGUgbGFzdCBsb2dnZXIgd2hvc2UgaGFuZGxlcnMgYXJlIGNhbGxlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGMgPSBzZWxmCisgICAgICAgIGZvdW5kID0gMAorICAgICAgICB3aGlsZSBjOgorICAgICAgICAgICAgZm9yIGhkbHIgaW4gYy5oYW5kbGVyczoKKyAgICAgICAgICAgICAgICBmb3VuZCA9IGZvdW5kICsgMQorICAgICAgICAgICAgICAgIGlmIHJlY29yZC5sZXZlbG5vID49IGhkbHIubGV2ZWw6CisgICAgICAgICAgICAgICAgICAgIGhkbHIuaGFuZGxlKHJlY29yZCkKKyAgICAgICAgICAgIGlmIG5vdCBjLnByb3BhZ2F0ZToKKyAgICAgICAgICAgICAgICBjID0gTm9uZSAgICAjYnJlYWsgb3V0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGMgPSBjLnBhcmVudAorICAgICAgICBpZiAoZm91bmQgPT0gMCkgYW5kIHJhaXNlRXhjZXB0aW9ucyBhbmQgbm90IHNlbGYubWFuYWdlci5lbWl0dGVkTm9IYW5kbGVyV2FybmluZzoKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIk5vIGhhbmRsZXJzIGNvdWxkIGJlIGZvdW5kIGZvciBsb2dnZXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgXCIlc1wiXG4iICUgc2VsZi5uYW1lKQorICAgICAgICAgICAgc2VsZi5tYW5hZ2VyLmVtaXR0ZWROb0hhbmRsZXJXYXJuaW5nID0gMQorCisgICAgZGVmIGdldEVmZmVjdGl2ZUxldmVsKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgR2V0IHRoZSBlZmZlY3RpdmUgbGV2ZWwgZm9yIHRoaXMgbG9nZ2VyLgorCisgICAgICAgIExvb3AgdGhyb3VnaCB0aGlzIGxvZ2dlciBhbmQgaXRzIHBhcmVudHMgaW4gdGhlIGxvZ2dlciBoaWVyYXJjaHksCisgICAgICAgIGxvb2tpbmcgZm9yIGEgbm9uLXplcm8gbG9nZ2luZyBsZXZlbC4gUmV0dXJuIHRoZSBmaXJzdCBvbmUgZm91bmQuCisgICAgICAgICIiIgorICAgICAgICBsb2dnZXIgPSBzZWxmCisgICAgICAgIHdoaWxlIGxvZ2dlcjoKKyAgICAgICAgICAgIGlmIGxvZ2dlci5sZXZlbDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9nZ2VyLmxldmVsCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnZXIucGFyZW50CisgICAgICAgIHJldHVybiBOT1RTRVQKKworICAgIGRlZiBpc0VuYWJsZWRGb3Ioc2VsZiwgbGV2ZWwpOgorICAgICAgICAiIiIKKyAgICAgICAgSXMgdGhpcyBsb2dnZXIgZW5hYmxlZCBmb3IgbGV2ZWwgJ2xldmVsJz8KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYubWFuYWdlci5kaXNhYmxlID49IGxldmVsOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgcmV0dXJuIGxldmVsID49IHNlbGYuZ2V0RWZmZWN0aXZlTGV2ZWwoKQorCisgICAgZGVmIGdldENoaWxkKHNlbGYsIHN1ZmZpeCk6CisgICAgICAgICIiIgorICAgICAgICBHZXQgYSBsb2dnZXIgd2hpY2ggaXMgYSBkZXNjZW5kYW50IHRvIHRoaXMgb25lLgorCisgICAgICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QsIHN1Y2ggdGhhdAorCisgICAgICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhYmMnKS5nZXRDaGlsZCgnZGVmLmdoaScpCisKKyAgICAgICAgaXMgdGhlIHNhbWUgYXMKKworICAgICAgICBsb2dnaW5nLmdldExvZ2dlcignYWJjLmRlZi5naGknKQorCisgICAgICAgIEl0J3MgdXNlZnVsLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgcGFyZW50IGxvZ2dlciBpcyBuYW1lZCB1c2luZworICAgICAgICBfX25hbWVfXyByYXRoZXIgdGhhbiBhIGxpdGVyYWwgc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5yb290IGlzIG5vdCBzZWxmOgorICAgICAgICAgICAgc3VmZml4ID0gJy4nLmpvaW4oKHNlbGYubmFtZSwgc3VmZml4KSkKKyAgICAgICAgcmV0dXJuIHNlbGYubWFuYWdlci5nZXRMb2dnZXIoc3VmZml4KQorCitjbGFzcyBSb290TG9nZ2VyKExvZ2dlcik6CisgICAgIiIiCisgICAgQSByb290IGxvZ2dlciBpcyBub3QgdGhhdCBkaWZmZXJlbnQgdG8gYW55IG90aGVyIGxvZ2dlciwgZXhjZXB0IHRoYXQKKyAgICBpdCBtdXN0IGhhdmUgYSBsb2dnaW5nIGxldmVsIGFuZCB0aGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiBpdCBpbgorICAgIHRoZSBoaWVyYXJjaHkuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxldmVsKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemUgdGhlIGxvZ2dlciB3aXRoIHRoZSBuYW1lICJyb290Ii4KKyAgICAgICAgIiIiCisgICAgICAgIExvZ2dlci5fX2luaXRfXyhzZWxmLCAicm9vdCIsIGxldmVsKQorCitfbG9nZ2VyQ2xhc3MgPSBMb2dnZXIKKworY2xhc3MgTG9nZ2VyQWRhcHRlcihvYmplY3QpOgorICAgICIiIgorICAgIEFuIGFkYXB0ZXIgZm9yIGxvZ2dlcnMgd2hpY2ggbWFrZXMgaXQgZWFzaWVyIHRvIHNwZWNpZnkgY29udGV4dHVhbAorICAgIGluZm9ybWF0aW9uIGluIGxvZ2dpbmcgb3V0cHV0LgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvZ2dlciwgZXh0cmEpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZSB0aGUgYWRhcHRlciB3aXRoIGEgbG9nZ2VyIGFuZCBhIGRpY3QtbGlrZSBvYmplY3Qgd2hpY2gKKyAgICAgICAgcHJvdmlkZXMgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4gVGhpcyBjb25zdHJ1Y3RvciBzaWduYXR1cmUgYWxsb3dzCisgICAgICAgIGVhc3kgc3RhY2tpbmcgb2YgTG9nZ2VyQWRhcHRlcnMsIGlmIHNvIGRlc2lyZWQuCisKKyAgICAgICAgWW91IGNhbiBlZmZlY3RpdmVseSBwYXNzIGtleXdvcmQgYXJndW1lbnRzIGFzIHNob3duIGluIHRoZQorICAgICAgICBmb2xsb3dpbmcgZXhhbXBsZToKKworICAgICAgICBhZGFwdGVyID0gTG9nZ2VyQWRhcHRlcihzb21lTG9nZ2VyLCBkaWN0KHAxPXYxLCBwMj0idjIiKSkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubG9nZ2VyID0gbG9nZ2VyCisgICAgICAgIHNlbGYuZXh0cmEgPSBleHRyYQorCisgICAgZGVmIHByb2Nlc3Moc2VsZiwgbXNnLCBrd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgUHJvY2VzcyB0aGUgbG9nZ2luZyBtZXNzYWdlIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyBwYXNzZWQgaW4gdG8KKyAgICAgICAgYSBsb2dnaW5nIGNhbGwgdG8gaW5zZXJ0IGNvbnRleHR1YWwgaW5mb3JtYXRpb24uIFlvdSBjYW4gZWl0aGVyCisgICAgICAgIG1hbmlwdWxhdGUgdGhlIG1lc3NhZ2UgaXRzZWxmLCB0aGUga2V5d29yZCBhcmdzIG9yIGJvdGguIFJldHVybgorICAgICAgICB0aGUgbWVzc2FnZSBhbmQga3dhcmdzIG1vZGlmaWVkIChvciBub3QpIHRvIHN1aXQgeW91ciBuZWVkcy4KKworICAgICAgICBOb3JtYWxseSwgeW91J2xsIG9ubHkgbmVlZCB0byBvdmVycmlkZSB0aGlzIG9uZSBtZXRob2QgaW4gYQorICAgICAgICBMb2dnZXJBZGFwdGVyIHN1YmNsYXNzIGZvciB5b3VyIHNwZWNpZmljIG5lZWRzLgorICAgICAgICAiIiIKKyAgICAgICAga3dhcmdzWyJleHRyYSJdID0gc2VsZi5leHRyYQorICAgICAgICByZXR1cm4gbXNnLCBrd2FyZ3MKKworICAgIGRlZiBkZWJ1ZyhzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBEZWxlZ2F0ZSBhIGRlYnVnIGNhbGwgdG8gdGhlIHVuZGVybHlpbmcgbG9nZ2VyLCBhZnRlciBhZGRpbmcKKyAgICAgICAgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgYWRhcHRlciBpbnN0YW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIG1zZywga3dhcmdzID0gc2VsZi5wcm9jZXNzKG1zZywga3dhcmdzKQorICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1Zyhtc2csICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBpbmZvKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIERlbGVnYXRlIGFuIGluZm8gY2FsbCB0byB0aGUgdW5kZXJseWluZyBsb2dnZXIsIGFmdGVyIGFkZGluZworICAgICAgICBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gdGhpcyBhZGFwdGVyIGluc3RhbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgbXNnLCBrd2FyZ3MgPSBzZWxmLnByb2Nlc3MobXNnLCBrd2FyZ3MpCisgICAgICAgIHNlbGYubG9nZ2VyLmluZm8obXNnLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgd2FybmluZyhzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBEZWxlZ2F0ZSBhIHdhcm5pbmcgY2FsbCB0byB0aGUgdW5kZXJseWluZyBsb2dnZXIsIGFmdGVyIGFkZGluZworICAgICAgICBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gdGhpcyBhZGFwdGVyIGluc3RhbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgbXNnLCBrd2FyZ3MgPSBzZWxmLnByb2Nlc3MobXNnLCBrd2FyZ3MpCisgICAgICAgIHNlbGYubG9nZ2VyLndhcm5pbmcobXNnLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgRGVsZWdhdGUgYW4gZXJyb3IgY2FsbCB0byB0aGUgdW5kZXJseWluZyBsb2dnZXIsIGFmdGVyIGFkZGluZworICAgICAgICBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gdGhpcyBhZGFwdGVyIGluc3RhbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgbXNnLCBrd2FyZ3MgPSBzZWxmLnByb2Nlc3MobXNnLCBrd2FyZ3MpCisgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKG1zZywgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGV4Y2VwdGlvbihzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBEZWxlZ2F0ZSBhbiBleGNlcHRpb24gY2FsbCB0byB0aGUgdW5kZXJseWluZyBsb2dnZXIsIGFmdGVyIGFkZGluZworICAgICAgICBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gdGhpcyBhZGFwdGVyIGluc3RhbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgbXNnLCBrd2FyZ3MgPSBzZWxmLnByb2Nlc3MobXNnLCBrd2FyZ3MpCisgICAgICAgIGt3YXJnc1siZXhjX2luZm8iXSA9IDEKKyAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IobXNnLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgY3JpdGljYWwoc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgRGVsZWdhdGUgYSBjcml0aWNhbCBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIGxvZ2dlciwgYWZ0ZXIgYWRkaW5nCisgICAgICAgIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSB0aGlzIGFkYXB0ZXIgaW5zdGFuY2UuCisgICAgICAgICIiIgorICAgICAgICBtc2csIGt3YXJncyA9IHNlbGYucHJvY2Vzcyhtc2csIGt3YXJncykKKyAgICAgICAgc2VsZi5sb2dnZXIuY3JpdGljYWwobXNnLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgbG9nKHNlbGYsIGxldmVsLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBEZWxlZ2F0ZSBhIGxvZyBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIGxvZ2dlciwgYWZ0ZXIgYWRkaW5nCisgICAgICAgIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSB0aGlzIGFkYXB0ZXIgaW5zdGFuY2UuCisgICAgICAgICIiIgorICAgICAgICBtc2csIGt3YXJncyA9IHNlbGYucHJvY2Vzcyhtc2csIGt3YXJncykKKyAgICAgICAgc2VsZi5sb2dnZXIubG9nKGxldmVsLCBtc2csICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBpc0VuYWJsZWRGb3Ioc2VsZiwgbGV2ZWwpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VlIGlmIHRoZSB1bmRlcmx5aW5nIGxvZ2dlciBpcyBlbmFibGVkIGZvciB0aGUgc3BlY2lmaWVkIGxldmVsLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYubG9nZ2VyLmlzRW5hYmxlZEZvcihsZXZlbCkKKworcm9vdCA9IFJvb3RMb2dnZXIoV0FSTklORykKK0xvZ2dlci5yb290ID0gcm9vdAorTG9nZ2VyLm1hbmFnZXIgPSBNYW5hZ2VyKExvZ2dlci5yb290KQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gY2xhc3NlcyBhbmQgZnVuY3Rpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JBU0lDX0ZPUk1BVCA9ICIlKGxldmVsbmFtZSlzOiUobmFtZSlzOiUobWVzc2FnZSlzIgorCitkZWYgYmFzaWNDb25maWcoKiprd2FyZ3MpOgorICAgICIiIgorICAgIERvIGJhc2ljIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBsb2dnaW5nIHN5c3RlbS4KKworICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGlmIHRoZSByb290IGxvZ2dlciBhbHJlYWR5IGhhcyBoYW5kbGVycworICAgIGNvbmZpZ3VyZWQuIEl0IGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGludGVuZGVkIGZvciB1c2UgYnkgc2ltcGxlIHNjcmlwdHMKKyAgICB0byBkbyBvbmUtc2hvdCBjb25maWd1cmF0aW9uIG9mIHRoZSBsb2dnaW5nIHBhY2thZ2UuCisKKyAgICBUaGUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gY3JlYXRlIGEgU3RyZWFtSGFuZGxlciB3aGljaCB3cml0ZXMgdG8KKyAgICBzeXMuc3RkZXJyLCBzZXQgYSBmb3JtYXR0ZXIgdXNpbmcgdGhlIEJBU0lDX0ZPUk1BVCBmb3JtYXQgc3RyaW5nLCBhbmQKKyAgICBhZGQgdGhlIGhhbmRsZXIgdG8gdGhlIHJvb3QgbG9nZ2VyLgorCisgICAgQSBudW1iZXIgb2Ygb3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgbWF5IGJlIHNwZWNpZmllZCwgd2hpY2ggY2FuIGFsdGVyCisgICAgdGhlIGRlZmF1bHQgYmVoYXZpb3VyLgorCisgICAgZmlsZW5hbWUgIFNwZWNpZmllcyB0aGF0IGEgRmlsZUhhbmRsZXIgYmUgY3JlYXRlZCwgdXNpbmcgdGhlIHNwZWNpZmllZAorICAgICAgICAgICAgICBmaWxlbmFtZSwgcmF0aGVyIHRoYW4gYSBTdHJlYW1IYW5kbGVyLgorICAgIGZpbGVtb2RlICBTcGVjaWZpZXMgdGhlIG1vZGUgdG8gb3BlbiB0aGUgZmlsZSwgaWYgZmlsZW5hbWUgaXMgc3BlY2lmaWVkCisgICAgICAgICAgICAgIChpZiBmaWxlbW9kZSBpcyB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gJ2EnKS4KKyAgICBmb3JtYXQgICAgVXNlIHRoZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZyBmb3IgdGhlIGhhbmRsZXIuCisgICAgZGF0ZWZtdCAgIFVzZSB0aGUgc3BlY2lmaWVkIGRhdGUvdGltZSBmb3JtYXQuCisgICAgbGV2ZWwgICAgIFNldCB0aGUgcm9vdCBsb2dnZXIgbGV2ZWwgdG8gdGhlIHNwZWNpZmllZCBsZXZlbC4KKyAgICBzdHJlYW0gICAgVXNlIHRoZSBzcGVjaWZpZWQgc3RyZWFtIHRvIGluaXRpYWxpemUgdGhlIFN0cmVhbUhhbmRsZXIuIE5vdGUKKyAgICAgICAgICAgICAgdGhhdCB0aGlzIGFyZ3VtZW50IGlzIGluY29tcGF0aWJsZSB3aXRoICdmaWxlbmFtZScgLSBpZiBib3RoCisgICAgICAgICAgICAgIGFyZSBwcmVzZW50LCAnc3RyZWFtJyBpcyBpZ25vcmVkLgorCisgICAgTm90ZSB0aGF0IHlvdSBjb3VsZCBzcGVjaWZ5IGEgc3RyZWFtIGNyZWF0ZWQgdXNpbmcgb3BlbihmaWxlbmFtZSwgbW9kZSkKKyAgICByYXRoZXIgdGhhbiBwYXNzaW5nIHRoZSBmaWxlbmFtZSBhbmQgbW9kZSBpbi4gSG93ZXZlciwgaXQgc2hvdWxkIGJlCisgICAgcmVtZW1iZXJlZCB0aGF0IFN0cmVhbUhhbmRsZXIgZG9lcyBub3QgY2xvc2UgaXRzIHN0cmVhbSAoc2luY2UgaXQgbWF5IGJlCisgICAgdXNpbmcgc3lzLnN0ZG91dCBvciBzeXMuc3RkZXJyKSwgd2hlcmVhcyBGaWxlSGFuZGxlciBjbG9zZXMgaXRzIHN0cmVhbQorICAgIHdoZW4gdGhlIGhhbmRsZXIgaXMgY2xvc2VkLgorICAgICIiIgorICAgICMgQWRkIHRocmVhZCBzYWZldHkgaW4gY2FzZSBzb21lb25lIG1pc3Rha2VubHkgY2FsbHMKKyAgICAjIGJhc2ljQ29uZmlnKCkgZnJvbSBtdWx0aXBsZSB0aHJlYWRzCisgICAgX2FjcXVpcmVMb2NrKCkKKyAgICB0cnk6CisgICAgICAgIGlmIGxlbihyb290LmhhbmRsZXJzKSA9PSAwOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBrd2FyZ3MuZ2V0KCJmaWxlbmFtZSIpCisgICAgICAgICAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgICAgICAgICBtb2RlID0ga3dhcmdzLmdldCgiZmlsZW1vZGUiLCAnYScpCisgICAgICAgICAgICAgICAgaGRsciA9IEZpbGVIYW5kbGVyKGZpbGVuYW1lLCBtb2RlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBrd2FyZ3MuZ2V0KCJzdHJlYW0iKQorICAgICAgICAgICAgICAgIGhkbHIgPSBTdHJlYW1IYW5kbGVyKHN0cmVhbSkKKyAgICAgICAgICAgIGZzID0ga3dhcmdzLmdldCgiZm9ybWF0IiwgQkFTSUNfRk9STUFUKQorICAgICAgICAgICAgZGZzID0ga3dhcmdzLmdldCgiZGF0ZWZtdCIsIE5vbmUpCisgICAgICAgICAgICBmbXQgPSBGb3JtYXR0ZXIoZnMsIGRmcykKKyAgICAgICAgICAgIGhkbHIuc2V0Rm9ybWF0dGVyKGZtdCkKKyAgICAgICAgICAgIHJvb3QuYWRkSGFuZGxlcihoZGxyKQorICAgICAgICAgICAgbGV2ZWwgPSBrd2FyZ3MuZ2V0KCJsZXZlbCIpCisgICAgICAgICAgICBpZiBsZXZlbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByb290LnNldExldmVsKGxldmVsKQorICAgIGZpbmFsbHk6CisgICAgICAgIF9yZWxlYXNlTG9jaygpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVXRpbGl0eSBmdW5jdGlvbnMgYXQgbW9kdWxlIGxldmVsLgorIyBCYXNpY2FsbHkgZGVsZWdhdGUgZXZlcnl0aGluZyB0byB0aGUgcm9vdCBsb2dnZXIuCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBnZXRMb2dnZXIobmFtZT1Ob25lKToKKyAgICAiIiIKKyAgICBSZXR1cm4gYSBsb2dnZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGNyZWF0aW5nIGl0IGlmIG5lY2Vzc2FyeS4KKworICAgIElmIG5vIG5hbWUgaXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIHJvb3QgbG9nZ2VyLgorICAgICIiIgorICAgIGlmIG5hbWU6CisgICAgICAgIHJldHVybiBMb2dnZXIubWFuYWdlci5nZXRMb2dnZXIobmFtZSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcm9vdAorCisjZGVmIGdldFJvb3RMb2dnZXIoKToKKyMgICAgIiIiCisjICAgIFJldHVybiB0aGUgcm9vdCBsb2dnZXIuCisjCisjICAgIE5vdGUgdGhhdCBnZXRMb2dnZXIoJycpIG5vdyBkb2VzIHRoZSBzYW1lIHRoaW5nLCBzbyB0aGlzIGZ1bmN0aW9uIGlzCisjICAgIGRlcHJlY2F0ZWQgYW5kIG1heSBkaXNhcHBlYXIgaW4gdGhlIGZ1dHVyZS4KKyMgICAgIiIiCisjICAgIHJldHVybiByb290CisKK2RlZiBjcml0aWNhbChtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgIiIiCisgICAgTG9nIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5ICdDUklUSUNBTCcgb24gdGhlIHJvb3QgbG9nZ2VyLgorICAgICIiIgorICAgIGlmIGxlbihyb290LmhhbmRsZXJzKSA9PSAwOgorICAgICAgICBiYXNpY0NvbmZpZygpCisgICAgcm9vdC5jcml0aWNhbChtc2csICphcmdzLCAqKmt3YXJncykKKworZmF0YWwgPSBjcml0aWNhbAorCitkZWYgZXJyb3IobXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICIiIgorICAgIExvZyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSAnRVJST1InIG9uIHRoZSByb290IGxvZ2dlci4KKyAgICAiIiIKKyAgICBpZiBsZW4ocm9vdC5oYW5kbGVycykgPT0gMDoKKyAgICAgICAgYmFzaWNDb25maWcoKQorICAgIHJvb3QuZXJyb3IobXNnLCAqYXJncywgKiprd2FyZ3MpCisKK2RlZiBleGNlcHRpb24obXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICIiIgorICAgIExvZyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSAnRVJST1InIG9uIHRoZSByb290IGxvZ2dlciwKKyAgICB3aXRoIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbi4KKyAgICAiIiIKKyAgICBrd2FyZ3NbJ2V4Y19pbmZvJ10gPSAxCisgICAgZXJyb3IobXNnLCAqYXJncywgKiprd2FyZ3MpCisKK2RlZiB3YXJuaW5nKG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiIKKyAgICBMb2cgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkgJ1dBUk5JTkcnIG9uIHRoZSByb290IGxvZ2dlci4KKyAgICAiIiIKKyAgICBpZiBsZW4ocm9vdC5oYW5kbGVycykgPT0gMDoKKyAgICAgICAgYmFzaWNDb25maWcoKQorICAgIHJvb3Qud2FybmluZyhtc2csICphcmdzLCAqKmt3YXJncykKKword2FybiA9IHdhcm5pbmcKKworZGVmIGluZm8obXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICIiIgorICAgIExvZyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSAnSU5GTycgb24gdGhlIHJvb3QgbG9nZ2VyLgorICAgICIiIgorICAgIGlmIGxlbihyb290LmhhbmRsZXJzKSA9PSAwOgorICAgICAgICBiYXNpY0NvbmZpZygpCisgICAgcm9vdC5pbmZvKG1zZywgKmFyZ3MsICoqa3dhcmdzKQorCitkZWYgZGVidWcobXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICIiIgorICAgIExvZyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSAnREVCVUcnIG9uIHRoZSByb290IGxvZ2dlci4KKyAgICAiIiIKKyAgICBpZiBsZW4ocm9vdC5oYW5kbGVycykgPT0gMDoKKyAgICAgICAgYmFzaWNDb25maWcoKQorICAgIHJvb3QuZGVidWcobXNnLCAqYXJncywgKiprd2FyZ3MpCisKK2RlZiBsb2cobGV2ZWwsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiIKKyAgICBMb2cgJ21zZyAlIGFyZ3MnIHdpdGggdGhlIGludGVnZXIgc2V2ZXJpdHkgJ2xldmVsJyBvbiB0aGUgcm9vdCBsb2dnZXIuCisgICAgIiIiCisgICAgaWYgbGVuKHJvb3QuaGFuZGxlcnMpID09IDA6CisgICAgICAgIGJhc2ljQ29uZmlnKCkKKyAgICByb290LmxvZyhsZXZlbCwgbXNnLCAqYXJncywgKiprd2FyZ3MpCisKK2RlZiBkaXNhYmxlKGxldmVsKToKKyAgICAiIiIKKyAgICBEaXNhYmxlIGFsbCBsb2dnaW5nIGNhbGxzIG9mIHNldmVyaXR5ICdsZXZlbCcgYW5kIGJlbG93LgorICAgICIiIgorICAgIHJvb3QubWFuYWdlci5kaXNhYmxlID0gbGV2ZWwKKworZGVmIHNodXRkb3duKGhhbmRsZXJMaXN0PV9oYW5kbGVyTGlzdCk6CisgICAgIiIiCisgICAgUGVyZm9ybSBhbnkgY2xlYW51cCBhY3Rpb25zIGluIHRoZSBsb2dnaW5nIHN5c3RlbSAoZS5nLiBmbHVzaGluZworICAgIGJ1ZmZlcnMpLgorCisgICAgU2hvdWxkIGJlIGNhbGxlZCBhdCBhcHBsaWNhdGlvbiBleGl0LgorICAgICIiIgorICAgIGZvciB3ciBpbiByZXZlcnNlZChoYW5kbGVyTGlzdFs6XSk6CisgICAgICAgICNlcnJvcnMgbWlnaHQgb2NjdXIsIGZvciBleGFtcGxlLCBpZiBmaWxlcyBhcmUgbG9ja2VkCisgICAgICAgICN3ZSBqdXN0IGlnbm9yZSB0aGVtIGlmIHJhaXNlRXhjZXB0aW9ucyBpcyBub3Qgc2V0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGggPSB3cigpCisgICAgICAgICAgICBpZiBoOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaC5hY3F1aXJlKCkKKyAgICAgICAgICAgICAgICAgICAgaC5mbHVzaCgpCisgICAgICAgICAgICAgICAgICAgIGguY2xvc2UoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgICMgSWdub3JlIGVycm9ycyB3aGljaCBtaWdodCBiZSBjYXVzZWQKKyAgICAgICAgICAgICAgICAgICAgIyBiZWNhdXNlIGhhbmRsZXJzIGhhdmUgYmVlbiBjbG9zZWQgYnV0CisgICAgICAgICAgICAgICAgICAgICMgcmVmZXJlbmNlcyB0byB0aGVtIGFyZSBzdGlsbCBhcm91bmQgYXQKKyAgICAgICAgICAgICAgICAgICAgIyBhcHBsaWNhdGlvbiBleGl0LgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgaC5yZWxlYXNlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaWYgcmFpc2VFeGNlcHRpb25zOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAjZWxzZSwgc3dhbGxvdworCisjTGV0J3MgdHJ5IGFuZCBzaHV0ZG93biBhdXRvbWF0aWNhbGx5IG9uIGFwcGxpY2F0aW9uIGV4aXQuLi4KK2ltcG9ydCBhdGV4aXQKK2F0ZXhpdC5yZWdpc3RlcihzaHV0ZG93bikKKworIyBOdWxsIGhhbmRsZXIKKworY2xhc3MgTnVsbEhhbmRsZXIoSGFuZGxlcik6CisgICAgIiIiCisgICAgVGhpcyBoYW5kbGVyIGRvZXMgbm90aGluZy4gSXQncyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGF2b2lkIHRoZQorICAgICJObyBoYW5kbGVycyBjb3VsZCBiZSBmb3VuZCBmb3IgbG9nZ2VyIFhYWCIgb25lLW9mZiB3YXJuaW5nLiBUaGlzIGlzCisgICAgaW1wb3J0YW50IGZvciBsaWJyYXJ5IGNvZGUsIHdoaWNoIG1heSBjb250YWluIGNvZGUgdG8gbG9nIGV2ZW50cy4gSWYgYSB1c2VyCisgICAgb2YgdGhlIGxpYnJhcnkgZG9lcyBub3QgY29uZmlndXJlIGxvZ2dpbmcsIHRoZSBvbmUtb2ZmIHdhcm5pbmcgbWlnaHQgYmUKKyAgICBwcm9kdWNlZDsgdG8gYXZvaWQgdGhpcywgdGhlIGxpYnJhcnkgZGV2ZWxvcGVyIHNpbXBseSBuZWVkcyB0byBpbnN0YW50aWF0ZQorICAgIGEgTnVsbEhhbmRsZXIgYW5kIGFkZCBpdCB0byB0aGUgdG9wLWxldmVsIGxvZ2dlciBvZiB0aGUgbGlicmFyeSBtb2R1bGUgb3IKKyAgICBwYWNrYWdlLgorICAgICIiIgorICAgIGRlZiBoYW5kbGUoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGNyZWF0ZUxvY2soc2VsZik6CisgICAgICAgIHNlbGYubG9jayA9IE5vbmUKKworIyBXYXJuaW5ncyBpbnRlZ3JhdGlvbgorCitfd2FybmluZ3Nfc2hvd3dhcm5pbmcgPSBOb25lCisKK2RlZiBfc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKToKKyAgICAiIiIKKyAgICBJbXBsZW1lbnRhdGlvbiBvZiBzaG93d2FybmluZ3Mgd2hpY2ggcmVkaXJlY3RzIHRvIGxvZ2dpbmcsIHdoaWNoIHdpbGwgZmlyc3QKKyAgICBjaGVjayB0byBzZWUgaWYgdGhlIGZpbGUgcGFyYW1ldGVyIGlzIE5vbmUuIElmIGEgZmlsZSBpcyBzcGVjaWZpZWQsIGl0IHdpbGwKKyAgICBkZWxlZ2F0ZSB0byB0aGUgb3JpZ2luYWwgd2FybmluZ3MgaW1wbGVtZW50YXRpb24gb2Ygc2hvd3dhcm5pbmcuIE90aGVyd2lzZSwKKyAgICBpdCB3aWxsIGNhbGwgd2FybmluZ3MuZm9ybWF0d2FybmluZyBhbmQgd2lsbCBsb2cgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gYQorICAgIHdhcm5pbmdzIGxvZ2dlciBuYW1lZCAicHkud2FybmluZ3MiIHdpdGggbGV2ZWwgbG9nZ2luZy5XQVJOSU5HLgorICAgICIiIgorICAgIGlmIGZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIF93YXJuaW5nc19zaG93d2FybmluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIF93YXJuaW5nc19zaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZSwgbGluZSkKKyAgICBlbHNlOgorICAgICAgICBzID0gd2FybmluZ3MuZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbGluZSkKKyAgICAgICAgbG9nZ2VyID0gZ2V0TG9nZ2VyKCJweS53YXJuaW5ncyIpCisgICAgICAgIGlmIG5vdCBsb2dnZXIuaGFuZGxlcnM6CisgICAgICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihOdWxsSGFuZGxlcigpKQorICAgICAgICBsb2dnZXIud2FybmluZygiJXMiLCBzKQorCitkZWYgY2FwdHVyZVdhcm5pbmdzKGNhcHR1cmUpOgorICAgICIiIgorICAgIElmIGNhcHR1cmUgaXMgdHJ1ZSwgcmVkaXJlY3QgYWxsIHdhcm5pbmdzIHRvIHRoZSBsb2dnaW5nIHBhY2thZ2UuCisgICAgSWYgY2FwdHVyZSBpcyBGYWxzZSwgZW5zdXJlIHRoYXQgd2FybmluZ3MgYXJlIG5vdCByZWRpcmVjdGVkIHRvIGxvZ2dpbmcKKyAgICBidXQgdG8gdGhlaXIgb3JpZ2luYWwgZGVzdGluYXRpb25zLgorICAgICIiIgorICAgIGdsb2JhbCBfd2FybmluZ3Nfc2hvd3dhcm5pbmcKKyAgICBpZiBjYXB0dXJlOgorICAgICAgICBpZiBfd2FybmluZ3Nfc2hvd3dhcm5pbmcgaXMgTm9uZToKKyAgICAgICAgICAgIF93YXJuaW5nc19zaG93d2FybmluZyA9IHdhcm5pbmdzLnNob3d3YXJuaW5nCisgICAgICAgICAgICB3YXJuaW5ncy5zaG93d2FybmluZyA9IF9zaG93d2FybmluZworICAgIGVsc2U6CisgICAgICAgIGlmIF93YXJuaW5nc19zaG93d2FybmluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNob3d3YXJuaW5nID0gX3dhcm5pbmdzX3Nob3d3YXJuaW5nCisgICAgICAgICAgICBfd2FybmluZ3Nfc2hvd3dhcm5pbmcgPSBOb25lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xvZ2dpbmcvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9sb2dnaW5nL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTkyM2RjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9sb2dnaW5nL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xvZ2dpbmcvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9sb2dnaW5nL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGFlNTNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9sb2dnaW5nL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xvZ2dpbmcvY29uZmlnLnB5IGIvbGliL3B5dGhvbjIuNy9sb2dnaW5nL2NvbmZpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmIwMTYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9sb2dnaW5nL2NvbmZpZy5weQpAQCAtMCwwICsxLDkzMiBAQAorIyBDb3B5cmlnaHQgMjAwMS0yMDEzIGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorIyBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisjIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorIyBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFZpbmF5IFNhamlwCisjIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbgorIyBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorIyBWSU5BWSBTQUpJUCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCisjIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTAorIyBWSU5BWSBTQUpJUCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKKyMgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCisjIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisjIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyIiIgorQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgZm9yIHRoZSBsb2dnaW5nIHBhY2thZ2UgZm9yIFB5dGhvbi4gVGhlIGNvcmUgcGFja2FnZQoraXMgYmFzZWQgb24gUEVQIDI4MiBhbmQgY29tbWVudHMgdGhlcmV0byBpbiBjb21wLmxhbmcucHl0aG9uLCBhbmQgaW5mbHVlbmNlZAorYnkgQXBhY2hlJ3MgbG9nNGogc3lzdGVtLgorCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworVG8gdXNlLCBzaW1wbHkgJ2ltcG9ydCBsb2dnaW5nJyBhbmQgbG9nIGF3YXkhCisiIiIKKworaW1wb3J0IHN5cywgbG9nZ2luZywgbG9nZ2luZy5oYW5kbGVycywgc29ja2V0LCBzdHJ1Y3QsIG9zLCB0cmFjZWJhY2ssIHJlCitpbXBvcnQgdHlwZXMsIGNTdHJpbmdJTworCit0cnk6CisgICAgaW1wb3J0IHRocmVhZAorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWQgPSBOb25lCisKK2Zyb20gU29ja2V0U2VydmVyIGltcG9ydCBUaHJlYWRpbmdUQ1BTZXJ2ZXIsIFN0cmVhbVJlcXVlc3RIYW5kbGVyCisKKworREVGQVVMVF9MT0dHSU5HX0NPTkZJR19QT1JUID0gOTAzMAorCitpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICBSRVNFVF9FUlJPUiA9IDEwMDU0ICAgI1dTQUVDT05OUkVTRVQKK2Vsc2U6CisgICAgUkVTRVRfRVJST1IgPSAxMDQgICAgICNFQ09OTlJFU0VUCisKKyMKKyMgICBUaGUgZm9sbG93aW5nIGNvZGUgaW1wbGVtZW50cyBhIHNvY2tldCBsaXN0ZW5lciBmb3Igb24tdGhlLWZseQorIyAgIHJlY29uZmlndXJhdGlvbiBvZiBsb2dnaW5nLgorIworIyAgIF9saXN0ZW5lciBob2xkcyB0aGUgc2VydmVyIG9iamVjdCBkb2luZyB0aGUgbGlzdGVuaW5nCitfbGlzdGVuZXIgPSBOb25lCisKK2RlZiBmaWxlQ29uZmlnKGZuYW1lLCBkZWZhdWx0cz1Ob25lLCBkaXNhYmxlX2V4aXN0aW5nX2xvZ2dlcnM9VHJ1ZSk6CisgICAgIiIiCisgICAgUmVhZCB0aGUgbG9nZ2luZyBjb25maWd1cmF0aW9uIGZyb20gYSBDb25maWdQYXJzZXItZm9ybWF0IGZpbGUuCisKKyAgICBUaGlzIGNhbiBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBmcm9tIGFuIGFwcGxpY2F0aW9uLCBhbGxvd2luZyBhbiBlbmQgdXNlcgorICAgIHRoZSBhYmlsaXR5IHRvIHNlbGVjdCBmcm9tIHZhcmlvdXMgcHJlLWNhbm5lZCBjb25maWd1cmF0aW9ucyAoaWYgdGhlCisgICAgZGV2ZWxvcGVyIHByb3ZpZGVzIGEgbWVjaGFuaXNtIHRvIHByZXNlbnQgdGhlIGNob2ljZXMgYW5kIGxvYWQgdGhlIGNob3NlbgorICAgIGNvbmZpZ3VyYXRpb24pLgorICAgICIiIgorICAgIGltcG9ydCBDb25maWdQYXJzZXIKKworICAgIGNwID0gQ29uZmlnUGFyc2VyLkNvbmZpZ1BhcnNlcihkZWZhdWx0cykKKyAgICBpZiBoYXNhdHRyKGZuYW1lLCAncmVhZGxpbmUnKToKKyAgICAgICAgY3AucmVhZGZwKGZuYW1lKQorICAgIGVsc2U6CisgICAgICAgIGNwLnJlYWQoZm5hbWUpCisKKyAgICBmb3JtYXR0ZXJzID0gX2NyZWF0ZV9mb3JtYXR0ZXJzKGNwKQorCisgICAgIyBjcml0aWNhbCBzZWN0aW9uCisgICAgbG9nZ2luZy5fYWNxdWlyZUxvY2soKQorICAgIHRyeToKKyAgICAgICAgbG9nZ2luZy5faGFuZGxlcnMuY2xlYXIoKQorICAgICAgICBkZWwgbG9nZ2luZy5faGFuZGxlckxpc3RbOl0KKyAgICAgICAgIyBIYW5kbGVycyBhZGQgdGhlbXNlbHZlcyB0byBsb2dnaW5nLl9oYW5kbGVycworICAgICAgICBoYW5kbGVycyA9IF9pbnN0YWxsX2hhbmRsZXJzKGNwLCBmb3JtYXR0ZXJzKQorICAgICAgICBfaW5zdGFsbF9sb2dnZXJzKGNwLCBoYW5kbGVycywgZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzKQorICAgIGZpbmFsbHk6CisgICAgICAgIGxvZ2dpbmcuX3JlbGVhc2VMb2NrKCkKKworCitkZWYgX3Jlc29sdmUobmFtZSk6CisgICAgIiIiUmVzb2x2ZSBhIGRvdHRlZCBuYW1lIHRvIGEgZ2xvYmFsIG9iamVjdC4iIiIKKyAgICBuYW1lID0gbmFtZS5zcGxpdCgnLicpCisgICAgdXNlZCA9IG5hbWUucG9wKDApCisgICAgZm91bmQgPSBfX2ltcG9ydF9fKHVzZWQpCisgICAgZm9yIG4gaW4gbmFtZToKKyAgICAgICAgdXNlZCA9IHVzZWQgKyAnLicgKyBuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvdW5kID0gZ2V0YXR0cihmb3VuZCwgbikKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgX19pbXBvcnRfXyh1c2VkKQorICAgICAgICAgICAgZm91bmQgPSBnZXRhdHRyKGZvdW5kLCBuKQorICAgIHJldHVybiBmb3VuZAorCitkZWYgX3N0cmlwX3NwYWNlcyhhbGlzdCk6CisgICAgcmV0dXJuIG1hcChsYW1iZGEgeDogeC5zdHJpcCgpLCBhbGlzdCkKKworZGVmIF9lbmNvZGVkKHMpOgorICAgIHJldHVybiBzIGlmIGlzaW5zdGFuY2Uocywgc3RyKSBlbHNlIHMuZW5jb2RlKCd1dGYtOCcpCisKK2RlZiBfY3JlYXRlX2Zvcm1hdHRlcnMoY3ApOgorICAgICIiIkNyZWF0ZSBhbmQgcmV0dXJuIGZvcm1hdHRlcnMiIiIKKyAgICBmbGlzdCA9IGNwLmdldCgiZm9ybWF0dGVycyIsICJrZXlzIikKKyAgICBpZiBub3QgbGVuKGZsaXN0KToKKyAgICAgICAgcmV0dXJuIHt9CisgICAgZmxpc3QgPSBmbGlzdC5zcGxpdCgiLCIpCisgICAgZmxpc3QgPSBfc3RyaXBfc3BhY2VzKGZsaXN0KQorICAgIGZvcm1hdHRlcnMgPSB7fQorICAgIGZvciBmb3JtIGluIGZsaXN0OgorICAgICAgICBzZWN0bmFtZSA9ICJmb3JtYXR0ZXJfJXMiICUgZm9ybQorICAgICAgICBvcHRzID0gY3Aub3B0aW9ucyhzZWN0bmFtZSkKKyAgICAgICAgaWYgImZvcm1hdCIgaW4gb3B0czoKKyAgICAgICAgICAgIGZzID0gY3AuZ2V0KHNlY3RuYW1lLCAiZm9ybWF0IiwgMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZzID0gTm9uZQorICAgICAgICBpZiAiZGF0ZWZtdCIgaW4gb3B0czoKKyAgICAgICAgICAgIGRmcyA9IGNwLmdldChzZWN0bmFtZSwgImRhdGVmbXQiLCAxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGZzID0gTm9uZQorICAgICAgICBjID0gbG9nZ2luZy5Gb3JtYXR0ZXIKKyAgICAgICAgaWYgImNsYXNzIiBpbiBvcHRzOgorICAgICAgICAgICAgY2xhc3NfbmFtZSA9IGNwLmdldChzZWN0bmFtZSwgImNsYXNzIikKKyAgICAgICAgICAgIGlmIGNsYXNzX25hbWU6CisgICAgICAgICAgICAgICAgYyA9IF9yZXNvbHZlKGNsYXNzX25hbWUpCisgICAgICAgIGYgPSBjKGZzLCBkZnMpCisgICAgICAgIGZvcm1hdHRlcnNbZm9ybV0gPSBmCisgICAgcmV0dXJuIGZvcm1hdHRlcnMKKworCitkZWYgX2luc3RhbGxfaGFuZGxlcnMoY3AsIGZvcm1hdHRlcnMpOgorICAgICIiIkluc3RhbGwgYW5kIHJldHVybiBoYW5kbGVycyIiIgorICAgIGhsaXN0ID0gY3AuZ2V0KCJoYW5kbGVycyIsICJrZXlzIikKKyAgICBpZiBub3QgbGVuKGhsaXN0KToKKyAgICAgICAgcmV0dXJuIHt9CisgICAgaGxpc3QgPSBobGlzdC5zcGxpdCgiLCIpCisgICAgaGxpc3QgPSBfc3RyaXBfc3BhY2VzKGhsaXN0KQorICAgIGhhbmRsZXJzID0ge30KKyAgICBmaXh1cHMgPSBbXSAjZm9yIGludGVyLWhhbmRsZXIgcmVmZXJlbmNlcworICAgIGZvciBoYW5kIGluIGhsaXN0OgorICAgICAgICBzZWN0bmFtZSA9ICJoYW5kbGVyXyVzIiAlIGhhbmQKKyAgICAgICAga2xhc3MgPSBjcC5nZXQoc2VjdG5hbWUsICJjbGFzcyIpCisgICAgICAgIG9wdHMgPSBjcC5vcHRpb25zKHNlY3RuYW1lKQorICAgICAgICBpZiAiZm9ybWF0dGVyIiBpbiBvcHRzOgorICAgICAgICAgICAgZm10ID0gY3AuZ2V0KHNlY3RuYW1lLCAiZm9ybWF0dGVyIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZtdCA9ICIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGtsYXNzID0gZXZhbChrbGFzcywgdmFycyhsb2dnaW5nKSkKKyAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgTmFtZUVycm9yKToKKyAgICAgICAgICAgIGtsYXNzID0gX3Jlc29sdmUoa2xhc3MpCisgICAgICAgIGFyZ3MgPSBjcC5nZXQoc2VjdG5hbWUsICJhcmdzIikKKyAgICAgICAgYXJncyA9IGV2YWwoYXJncywgdmFycyhsb2dnaW5nKSkKKyAgICAgICAgaCA9IGtsYXNzKCphcmdzKQorICAgICAgICBpZiAibGV2ZWwiIGluIG9wdHM6CisgICAgICAgICAgICBsZXZlbCA9IGNwLmdldChzZWN0bmFtZSwgImxldmVsIikKKyAgICAgICAgICAgIGguc2V0TGV2ZWwobG9nZ2luZy5fbGV2ZWxOYW1lc1tsZXZlbF0pCisgICAgICAgIGlmIGxlbihmbXQpOgorICAgICAgICAgICAgaC5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyc1tmbXRdKQorICAgICAgICBpZiBpc3N1YmNsYXNzKGtsYXNzLCBsb2dnaW5nLmhhbmRsZXJzLk1lbW9yeUhhbmRsZXIpOgorICAgICAgICAgICAgaWYgInRhcmdldCIgaW4gb3B0czoKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSBjcC5nZXQoc2VjdG5hbWUsInRhcmdldCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRhcmdldCA9ICIiCisgICAgICAgICAgICBpZiBsZW4odGFyZ2V0KTogI3RoZSB0YXJnZXQgaGFuZGxlciBtYXkgbm90IGJlIGxvYWRlZCB5ZXQsIHNvIGtlZXAgZm9yIGxhdGVyLi4uCisgICAgICAgICAgICAgICAgZml4dXBzLmFwcGVuZCgoaCwgdGFyZ2V0KSkKKyAgICAgICAgaGFuZGxlcnNbaGFuZF0gPSBoCisgICAgI25vdyBhbGwgaGFuZGxlcnMgYXJlIGxvYWRlZCwgZml4dXAgaW50ZXItaGFuZGxlciByZWZlcmVuY2VzLi4uCisgICAgZm9yIGgsIHQgaW4gZml4dXBzOgorICAgICAgICBoLnNldFRhcmdldChoYW5kbGVyc1t0XSkKKyAgICByZXR1cm4gaGFuZGxlcnMKKworCitkZWYgX2luc3RhbGxfbG9nZ2VycyhjcCwgaGFuZGxlcnMsIGRpc2FibGVfZXhpc3RpbmdfbG9nZ2Vycyk6CisgICAgIiIiQ3JlYXRlIGFuZCBpbnN0YWxsIGxvZ2dlcnMiIiIKKworICAgICMgY29uZmlndXJlIHRoZSByb290IGZpcnN0CisgICAgbGxpc3QgPSBjcC5nZXQoImxvZ2dlcnMiLCAia2V5cyIpCisgICAgbGxpc3QgPSBsbGlzdC5zcGxpdCgiLCIpCisgICAgbGxpc3QgPSBsaXN0KG1hcChsYW1iZGEgeDogeC5zdHJpcCgpLCBsbGlzdCkpCisgICAgbGxpc3QucmVtb3ZlKCJyb290IikKKyAgICBzZWN0bmFtZSA9ICJsb2dnZXJfcm9vdCIKKyAgICByb290ID0gbG9nZ2luZy5yb290CisgICAgbG9nID0gcm9vdAorICAgIG9wdHMgPSBjcC5vcHRpb25zKHNlY3RuYW1lKQorICAgIGlmICJsZXZlbCIgaW4gb3B0czoKKyAgICAgICAgbGV2ZWwgPSBjcC5nZXQoc2VjdG5hbWUsICJsZXZlbCIpCisgICAgICAgIGxvZy5zZXRMZXZlbChsb2dnaW5nLl9sZXZlbE5hbWVzW2xldmVsXSkKKyAgICBmb3IgaCBpbiByb290LmhhbmRsZXJzWzpdOgorICAgICAgICByb290LnJlbW92ZUhhbmRsZXIoaCkKKyAgICBobGlzdCA9IGNwLmdldChzZWN0bmFtZSwgImhhbmRsZXJzIikKKyAgICBpZiBsZW4oaGxpc3QpOgorICAgICAgICBobGlzdCA9IGhsaXN0LnNwbGl0KCIsIikKKyAgICAgICAgaGxpc3QgPSBfc3RyaXBfc3BhY2VzKGhsaXN0KQorICAgICAgICBmb3IgaGFuZCBpbiBobGlzdDoKKyAgICAgICAgICAgIGxvZy5hZGRIYW5kbGVyKGhhbmRsZXJzW2hhbmRdKQorCisgICAgI2FuZCBub3cgdGhlIG90aGVycy4uLgorICAgICN3ZSBkb24ndCB3YW50IHRvIGxvc2UgdGhlIGV4aXN0aW5nIGxvZ2dlcnMsCisgICAgI3NpbmNlIG90aGVyIHRocmVhZHMgbWF5IGhhdmUgcG9pbnRlcnMgdG8gdGhlbS4KKyAgICAjZXhpc3RpbmcgaXMgc2V0IHRvIGNvbnRhaW4gYWxsIGV4aXN0aW5nIGxvZ2dlcnMsCisgICAgI2FuZCBhcyB3ZSBnbyB0aHJvdWdoIHRoZSBuZXcgY29uZmlndXJhdGlvbiB3ZQorICAgICNyZW1vdmUgYW55IHdoaWNoIGFyZSBjb25maWd1cmVkLiBBdCB0aGUgZW5kLAorICAgICN3aGF0J3MgbGVmdCBpbiBleGlzdGluZyBpcyB0aGUgc2V0IG9mIGxvZ2dlcnMKKyAgICAjd2hpY2ggd2VyZSBpbiB0aGUgcHJldmlvdXMgY29uZmlndXJhdGlvbiBidXQKKyAgICAjd2hpY2ggYXJlIG5vdCBpbiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCisgICAgZXhpc3RpbmcgPSBsaXN0KHJvb3QubWFuYWdlci5sb2dnZXJEaWN0LmtleXMoKSkKKyAgICAjVGhlIGxpc3QgbmVlZHMgdG8gYmUgc29ydGVkIHNvIHRoYXQgd2UgY2FuCisgICAgI2F2b2lkIGRpc2FibGluZyBjaGlsZCBsb2dnZXJzIG9mIGV4cGxpY2l0bHkKKyAgICAjbmFtZWQgbG9nZ2Vycy4gV2l0aCBhIHNvcnRlZCBsaXN0IGl0IGlzIGVhc2llcgorICAgICN0byBmaW5kIHRoZSBjaGlsZCBsb2dnZXJzLgorICAgIGV4aXN0aW5nLnNvcnQoKQorICAgICNXZSdsbCBrZWVwIHRoZSBsaXN0IG9mIGV4aXN0aW5nIGxvZ2dlcnMKKyAgICAjd2hpY2ggYXJlIGNoaWxkcmVuIG9mIG5hbWVkIGxvZ2dlcnMgaGVyZS4uLgorICAgIGNoaWxkX2xvZ2dlcnMgPSBbXQorICAgICNub3cgc2V0IHVwIHRoZSBuZXcgb25lcy4uLgorICAgIGZvciBsb2cgaW4gbGxpc3Q6CisgICAgICAgIHNlY3RuYW1lID0gImxvZ2dlcl8lcyIgJSBsb2cKKyAgICAgICAgcW4gPSBjcC5nZXQoc2VjdG5hbWUsICJxdWFsbmFtZSIpCisgICAgICAgIG9wdHMgPSBjcC5vcHRpb25zKHNlY3RuYW1lKQorICAgICAgICBpZiAicHJvcGFnYXRlIiBpbiBvcHRzOgorICAgICAgICAgICAgcHJvcGFnYXRlID0gY3AuZ2V0aW50KHNlY3RuYW1lLCAicHJvcGFnYXRlIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByb3BhZ2F0ZSA9IDEKKyAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIocW4pCisgICAgICAgIGlmIHFuIGluIGV4aXN0aW5nOgorICAgICAgICAgICAgaSA9IGV4aXN0aW5nLmluZGV4KHFuKSArIDEgIyBzdGFydCB3aXRoIHRoZSBlbnRyeSBhZnRlciBxbgorICAgICAgICAgICAgcHJlZml4ZWQgPSBxbiArICIuIgorICAgICAgICAgICAgcGZsZW4gPSBsZW4ocHJlZml4ZWQpCisgICAgICAgICAgICBudW1fZXhpc3RpbmcgPSBsZW4oZXhpc3RpbmcpCisgICAgICAgICAgICB3aGlsZSBpIDwgbnVtX2V4aXN0aW5nOgorICAgICAgICAgICAgICAgIGlmIGV4aXN0aW5nW2ldWzpwZmxlbl0gPT0gcHJlZml4ZWQ6CisgICAgICAgICAgICAgICAgICAgIGNoaWxkX2xvZ2dlcnMuYXBwZW5kKGV4aXN0aW5nW2ldKQorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgZXhpc3RpbmcucmVtb3ZlKHFuKQorICAgICAgICBpZiAibGV2ZWwiIGluIG9wdHM6CisgICAgICAgICAgICBsZXZlbCA9IGNwLmdldChzZWN0bmFtZSwgImxldmVsIikKKyAgICAgICAgICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLl9sZXZlbE5hbWVzW2xldmVsXSkKKyAgICAgICAgZm9yIGggaW4gbG9nZ2VyLmhhbmRsZXJzWzpdOgorICAgICAgICAgICAgbG9nZ2VyLnJlbW92ZUhhbmRsZXIoaCkKKyAgICAgICAgbG9nZ2VyLnByb3BhZ2F0ZSA9IHByb3BhZ2F0ZQorICAgICAgICBsb2dnZXIuZGlzYWJsZWQgPSAwCisgICAgICAgIGhsaXN0ID0gY3AuZ2V0KHNlY3RuYW1lLCAiaGFuZGxlcnMiKQorICAgICAgICBpZiBsZW4oaGxpc3QpOgorICAgICAgICAgICAgaGxpc3QgPSBobGlzdC5zcGxpdCgiLCIpCisgICAgICAgICAgICBobGlzdCA9IF9zdHJpcF9zcGFjZXMoaGxpc3QpCisgICAgICAgICAgICBmb3IgaGFuZCBpbiBobGlzdDoKKyAgICAgICAgICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyc1toYW5kXSkKKworICAgICNEaXNhYmxlIGFueSBvbGQgbG9nZ2Vycy4gVGhlcmUncyBubyBwb2ludCBkZWxldGluZworICAgICN0aGVtIGFzIG90aGVyIHRocmVhZHMgbWF5IGNvbnRpbnVlIHRvIGhvbGQgcmVmZXJlbmNlcworICAgICNhbmQgYnkgZGlzYWJsaW5nIHRoZW0sIHlvdSBzdG9wIHRoZW0gZG9pbmcgYW55IGxvZ2dpbmcuCisgICAgI0hvd2V2ZXIsIGRvbid0IGRpc2FibGUgY2hpbGRyZW4gb2YgbmFtZWQgbG9nZ2VycywgYXMgdGhhdCdzCisgICAgI3Byb2JhYmx5IG5vdCB3aGF0IHdhcyBpbnRlbmRlZCBieSB0aGUgdXNlci4KKyAgICBmb3IgbG9nIGluIGV4aXN0aW5nOgorICAgICAgICBsb2dnZXIgPSByb290Lm1hbmFnZXIubG9nZ2VyRGljdFtsb2ddCisgICAgICAgIGlmIGxvZyBpbiBjaGlsZF9sb2dnZXJzOgorICAgICAgICAgICAgbG9nZ2VyLmxldmVsID0gbG9nZ2luZy5OT1RTRVQKKyAgICAgICAgICAgIGxvZ2dlci5oYW5kbGVycyA9IFtdCisgICAgICAgICAgICBsb2dnZXIucHJvcGFnYXRlID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nZ2VyLmRpc2FibGVkID0gZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzCisKKworCitJREVOVElGSUVSID0gcmUuY29tcGlsZSgnXlthLXpfXVthLXowLTlfXSokJywgcmUuSSkKKworCitkZWYgdmFsaWRfaWRlbnQocyk6CisgICAgbSA9IElERU5USUZJRVIubWF0Y2gocykKKyAgICBpZiBub3QgbToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTm90IGEgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXI6ICVyJyAlIHMpCisgICAgcmV0dXJuIFRydWUKKworCisjIFRoZSBDb252ZXJ0aW5nWFhYIGNsYXNzZXMgYXJlIHdyYXBwZXJzIGFyb3VuZCBzdGFuZGFyZCBQeXRob24gY29udGFpbmVycywKKyMgYW5kIHRoZXkgc2VydmUgdG8gY29udmVydCBhbnkgc3VpdGFibGUgdmFsdWVzIGluIHRoZSBjb250YWluZXIuIFRoZQorIyBjb252ZXJzaW9uIGNvbnZlcnRzIGJhc2UgZGljdHMsIGxpc3RzIGFuZCB0dXBsZXMgdG8gdGhlaXIgd3JhcHBlZAorIyBlcXVpdmFsZW50cywgd2hlcmVhcyBzdHJpbmdzIHdoaWNoIG1hdGNoIGEgY29udmVyc2lvbiBmb3JtYXQgYXJlIGNvbnZlcnRlZAorIyBhcHByb3ByaWF0ZWx5LgorIworIyBFYWNoIHdyYXBwZXIgc2hvdWxkIGhhdmUgYSBjb25maWd1cmF0b3IgYXR0cmlidXRlIGhvbGRpbmcgdGhlIGFjdHVhbAorIyBjb25maWd1cmF0b3IgdG8gdXNlIGZvciBjb252ZXJzaW9uLgorCitjbGFzcyBDb252ZXJ0aW5nRGljdChkaWN0KToKKyAgICAiIiJBIGNvbnZlcnRpbmcgZGljdGlvbmFyeSB3cmFwcGVyLiIiIgorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHZhbHVlID0gZGljdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCisgICAgICAgICNJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CisgICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKKyAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCisgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgdmFsdWUgPSBkaWN0LmdldChzZWxmLCBrZXksIGRlZmF1bHQpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCisgICAgICAgICNJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CisgICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKKyAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCisgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgdmFsdWUgPSBkaWN0LnBvcChzZWxmLCBrZXksIGRlZmF1bHQpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CisgICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKKyAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgorICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCitjbGFzcyBDb252ZXJ0aW5nTGlzdChsaXN0KToKKyAgICAiIiJBIGNvbnZlcnRpbmcgbGlzdCB3cmFwcGVyLiIiIgorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICB2YWx1ZSA9IGxpc3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQorICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQorICAgICAgICAjSWYgdGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBkaWZmZXJlbnQsIHNhdmUgZm9yIG5leHQgdGltZQorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgorICAgICAgICAgICAgc2VsZltrZXldID0gcmVzdWx0CisgICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKKyAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgorICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHBvcChzZWxmLCBpZHg9LTEpOgorICAgICAgICB2YWx1ZSA9IGxpc3QucG9wKHNlbGYsIGlkeCkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKKyAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCisgICAgICAgIHJldHVybiByZXN1bHQKKworY2xhc3MgQ29udmVydGluZ1R1cGxlKHR1cGxlKToKKyAgICAiIiJBIGNvbnZlcnRpbmcgdHVwbGUgd3JhcHBlci4iIiIKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgdmFsdWUgPSB0dXBsZS5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CisgICAgICAgICAgICBpZiB0eXBlKHJlc3VsdCkgaW4gKENvbnZlcnRpbmdEaWN0LCBDb252ZXJ0aW5nTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGluZ1R1cGxlKToKKyAgICAgICAgICAgICAgICByZXN1bHQucGFyZW50ID0gc2VsZgorICAgICAgICAgICAgICAgIHJlc3VsdC5rZXkgPSBrZXkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCitjbGFzcyBCYXNlQ29uZmlndXJhdG9yKG9iamVjdCk6CisgICAgIiIiCisgICAgVGhlIGNvbmZpZ3VyYXRvciBiYXNlIGNsYXNzIHdoaWNoIGRlZmluZXMgc29tZSB1c2VmdWwgZGVmYXVsdHMuCisgICAgIiIiCisKKyAgICBDT05WRVJUX1BBVFRFUk4gPSByZS5jb21waWxlKHInXig/UDxwcmVmaXg+W2Etel0rKTovLyg/UDxzdWZmaXg+LiopJCcpCisKKyAgICBXT1JEX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlxzKihcdyspXHMqJykKKyAgICBET1RfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXC5ccyooXHcrKVxzKicpCisgICAgSU5ERVhfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXFtccyooXHcrKVxzKlxdXHMqJykKKyAgICBESUdJVF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cZCskJykKKworICAgIHZhbHVlX2NvbnZlcnRlcnMgPSB7CisgICAgICAgICdleHQnIDogJ2V4dF9jb252ZXJ0JywKKyAgICAgICAgJ2NmZycgOiAnY2ZnX2NvbnZlcnQnLAorICAgIH0KKworICAgICMgV2UgbWlnaHQgd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgb25lLCBlLmcuIGltcG9ydGxpYgorICAgIGltcG9ydGVyID0gX19pbXBvcnRfXworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbmZpZyk6CisgICAgICAgIHNlbGYuY29uZmlnID0gQ29udmVydGluZ0RpY3QoY29uZmlnKQorICAgICAgICBzZWxmLmNvbmZpZy5jb25maWd1cmF0b3IgPSBzZWxmCisgICAgICAgICMgSXNzdWUgMTI3MTg6IHdpbnBkYiByZXBsYWNlcyBfX2ltcG9ydF9fIHdpdGggYSBQeXRob24gZnVuY3Rpb24sIHdoaWNoCisgICAgICAgICMgZW5kcyB1cCBiZWluZyB0cmVhdGVkIGFzIGEgYm91bmQgbWV0aG9kLiBUbyBhdm9pZCBwcm9ibGVtcywgd2UKKyAgICAgICAgIyBzZXQgdGhlIGltcG9ydGVyIG9uIHRoZSBpbnN0YW5jZSwgYnV0IGxlYXZlIGl0IGRlZmluZWQgaW4gdGhlIGNsYXNzCisgICAgICAgICMgc28gZXhpc3RpbmcgY29kZSBkb2Vzbid0IGJyZWFrCisgICAgICAgIGlmIHR5cGUoX19pbXBvcnRfXykgPT0gdHlwZXMuRnVuY3Rpb25UeXBlOgorICAgICAgICAgICAgc2VsZi5pbXBvcnRlciA9IF9faW1wb3J0X18KKworICAgIGRlZiByZXNvbHZlKHNlbGYsIHMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVzb2x2ZSBzdHJpbmdzIHRvIG9iamVjdHMgdXNpbmcgc3RhbmRhcmQgaW1wb3J0IGFuZCBhdHRyaWJ1dGUKKyAgICAgICAgc3ludGF4LgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9IHMuc3BsaXQoJy4nKQorICAgICAgICB1c2VkID0gbmFtZS5wb3AoMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm91bmQgPSBzZWxmLmltcG9ydGVyKHVzZWQpCisgICAgICAgICAgICBmb3IgZnJhZyBpbiBuYW1lOgorICAgICAgICAgICAgICAgIHVzZWQgKz0gJy4nICsgZnJhZworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBnZXRhdHRyKGZvdW5kLCBmcmFnKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbXBvcnRlcih1c2VkKQorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGdldGF0dHIoZm91bmQsIGZyYWcpCisgICAgICAgICAgICByZXR1cm4gZm91bmQKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZSwgdGIgPSBzeXMuZXhjX2luZm8oKVsxOl0KKyAgICAgICAgICAgIHYgPSBWYWx1ZUVycm9yKCdDYW5ub3QgcmVzb2x2ZSAlcjogJXMnICUgKHMsIGUpKQorICAgICAgICAgICAgdi5fX2NhdXNlX18sIHYuX190cmFjZWJhY2tfXyA9IGUsIHRiCisgICAgICAgICAgICByYWlzZSB2CisKKyAgICBkZWYgZXh0X2NvbnZlcnQoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiJEZWZhdWx0IGNvbnZlcnRlciBmb3IgdGhlIGV4dDovLyBwcm90b2NvbC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucmVzb2x2ZSh2YWx1ZSkKKworICAgIGRlZiBjZmdfY29udmVydChzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIkRlZmF1bHQgY29udmVydGVyIGZvciB0aGUgY2ZnOi8vIHByb3RvY29sLiIiIgorICAgICAgICByZXN0ID0gdmFsdWUKKyAgICAgICAgbSA9IHNlbGYuV09SRF9QQVRURVJOLm1hdGNoKHJlc3QpCisgICAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVyIiAlIHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdCA9IHJlc3RbbS5lbmQoKTpdCisgICAgICAgICAgICBkID0gc2VsZi5jb25maWdbbS5ncm91cHMoKVswXV0KKyAgICAgICAgICAgICNwcmludCBkLCByZXN0CisgICAgICAgICAgICB3aGlsZSByZXN0OgorICAgICAgICAgICAgICAgIG0gPSBzZWxmLkRPVF9QQVRURVJOLm1hdGNoKHJlc3QpCisgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgZCA9IGRbbS5ncm91cHMoKVswXV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtID0gc2VsZi5JTkRFWF9QQVRURVJOLm1hdGNoKHJlc3QpCisgICAgICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBtLmdyb3VwcygpWzBdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5ESUdJVF9QQVRURVJOLm1hdGNoKGlkeCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbaWR4XQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBpbnQoaWR4KSAjIHRyeSBhcyBudW1iZXIgZmlyc3QgKG1vc3QgbGlrZWx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFtuXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkW2lkeF0KKyAgICAgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICAgICByZXN0ID0gcmVzdFttLmVuZCgpOl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29udmVydCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyIGF0ICVyJyAlICh2YWx1ZSwgcmVzdCkpCisgICAgICAgICNyZXN0IHNob3VsZCBiZSBlbXB0eQorICAgICAgICByZXR1cm4gZAorCisgICAgZGVmIGNvbnZlcnQoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29udmVydCB2YWx1ZXMgdG8gYW4gYXBwcm9wcmlhdGUgdHlwZS4gZGljdHMsIGxpc3RzIGFuZCB0dXBsZXMgYXJlCisgICAgICAgIHJlcGxhY2VkIGJ5IHRoZWlyIGNvbnZlcnRpbmcgYWx0ZXJuYXRpdmVzLiBTdHJpbmdzIGFyZSBjaGVja2VkIHRvCisgICAgICAgIHNlZSBpZiB0aGV5IGhhdmUgYSBjb252ZXJzaW9uIGZvcm1hdCBhbmQgYXJlIGNvbnZlcnRlZCBpZiB0aGV5IGRvLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENvbnZlcnRpbmdEaWN0KSBhbmQgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CisgICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRpbmdEaWN0KHZhbHVlKQorICAgICAgICAgICAgdmFsdWUuY29uZmlndXJhdG9yID0gc2VsZgorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDb252ZXJ0aW5nTGlzdCkgYW5kIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgorICAgICAgICAgICAgdmFsdWUgPSBDb252ZXJ0aW5nTGlzdCh2YWx1ZSkKKyAgICAgICAgICAgIHZhbHVlLmNvbmZpZ3VyYXRvciA9IHNlbGYKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQ29udmVydGluZ1R1cGxlKSBhbmRcCisgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKKyAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ1R1cGxlKHZhbHVlKQorICAgICAgICAgICAgdmFsdWUuY29uZmlndXJhdG9yID0gc2VsZgorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGJhc2VzdHJpbmcpOiAjIHN0ciBmb3IgcHkzaworICAgICAgICAgICAgbSA9IHNlbGYuQ09OVkVSVF9QQVRURVJOLm1hdGNoKHZhbHVlKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBkID0gbS5ncm91cGRpY3QoKQorICAgICAgICAgICAgICAgIHByZWZpeCA9IGRbJ3ByZWZpeCddCisgICAgICAgICAgICAgICAgY29udmVydGVyID0gc2VsZi52YWx1ZV9jb252ZXJ0ZXJzLmdldChwcmVmaXgsIE5vbmUpCisgICAgICAgICAgICAgICAgaWYgY29udmVydGVyOgorICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBkWydzdWZmaXgnXQorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBnZXRhdHRyKHNlbGYsIGNvbnZlcnRlcikKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBjb252ZXJ0ZXIoc3VmZml4KQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBjb25maWd1cmVfY3VzdG9tKHNlbGYsIGNvbmZpZyk6CisgICAgICAgICIiIkNvbmZpZ3VyZSBhbiBvYmplY3Qgd2l0aCBhIHVzZXItc3VwcGxpZWQgZmFjdG9yeS4iIiIKKyAgICAgICAgYyA9IGNvbmZpZy5wb3AoJygpJykKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoYywgJ19fY2FsbF9fJykgYW5kIGhhc2F0dHIodHlwZXMsICdDbGFzc1R5cGUnKSBhbmQgdHlwZShjKSAhPSB0eXBlcy5DbGFzc1R5cGU6CisgICAgICAgICAgICBjID0gc2VsZi5yZXNvbHZlKGMpCisgICAgICAgIHByb3BzID0gY29uZmlnLnBvcCgnLicsIE5vbmUpCisgICAgICAgICMgQ2hlY2sgZm9yIHZhbGlkIGlkZW50aWZpZXJzCisgICAgICAgIGt3YXJncyA9IGRpY3QoWyhrLCBjb25maWdba10pIGZvciBrIGluIGNvbmZpZyBpZiB2YWxpZF9pZGVudChrKV0pCisgICAgICAgIHJlc3VsdCA9IGMoKiprd2FyZ3MpCisgICAgICAgIGlmIHByb3BzOgorICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHByb3BzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgc2V0YXR0cihyZXN1bHQsIG5hbWUsIHZhbHVlKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgYXNfdHVwbGUoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiJVdGlsaXR5IGZ1bmN0aW9uIHdoaWNoIGNvbnZlcnRzIGxpc3RzIHRvIHR1cGxlcy4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CisgICAgICAgICAgICB2YWx1ZSA9IHR1cGxlKHZhbHVlKQorICAgICAgICByZXR1cm4gdmFsdWUKKworY2xhc3MgRGljdENvbmZpZ3VyYXRvcihCYXNlQ29uZmlndXJhdG9yKToKKyAgICAiIiIKKyAgICBDb25maWd1cmUgbG9nZ2luZyB1c2luZyBhIGRpY3Rpb25hcnktbGlrZSBvYmplY3QgdG8gZGVzY3JpYmUgdGhlCisgICAgY29uZmlndXJhdGlvbi4KKyAgICAiIiIKKworICAgIGRlZiBjb25maWd1cmUoc2VsZik6CisgICAgICAgICIiIkRvIHRoZSBjb25maWd1cmF0aW9uLiIiIgorCisgICAgICAgIGNvbmZpZyA9IHNlbGYuY29uZmlnCisgICAgICAgIGlmICd2ZXJzaW9uJyBub3QgaW4gY29uZmlnOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZGljdGlvbmFyeSBkb2Vzbid0IHNwZWNpZnkgYSB2ZXJzaW9uIikKKyAgICAgICAgaWYgY29uZmlnWyd2ZXJzaW9uJ10gIT0gMToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVuc3VwcG9ydGVkIHZlcnNpb246ICVzIiAlIGNvbmZpZ1sndmVyc2lvbiddKQorICAgICAgICBpbmNyZW1lbnRhbCA9IGNvbmZpZy5wb3AoJ2luY3JlbWVudGFsJywgRmFsc2UpCisgICAgICAgIEVNUFRZX0RJQ1QgPSB7fQorICAgICAgICBsb2dnaW5nLl9hY3F1aXJlTG9jaygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGluY3JlbWVudGFsOgorICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gY29uZmlnLmdldCgnaGFuZGxlcnMnLCBFTVBUWV9ESUNUKQorICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGhhbmRsZXJzOgorICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBsb2dnaW5nLl9oYW5kbGVyczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ05vIGhhbmRsZXIgZm91bmQgd2l0aCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lICVyJyAgJSBuYW1lKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBsb2dnaW5nLl9oYW5kbGVyc1tuYW1lXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfY29uZmlnID0gaGFuZGxlcnNbbmFtZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGhhbmRsZXJfY29uZmlnLmdldCgnbGV2ZWwnLCBOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxldmVsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnNldExldmVsKGxvZ2dpbmcuX2NoZWNrTGV2ZWwobGV2ZWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBoYW5kbGVyICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQorICAgICAgICAgICAgICAgIGxvZ2dlcnMgPSBjb25maWcuZ2V0KCdsb2dnZXJzJywgRU1QVFlfRElDVCkKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBsb2dnZXJzOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9sb2dnZXIobmFtZSwgbG9nZ2Vyc1tuYW1lXSwgVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGxvZ2dlciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQorICAgICAgICAgICAgICAgIHJvb3QgPSBjb25maWcuZ2V0KCdyb290JywgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiByb290OgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9yb290KHJvb3QsIFRydWUpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSByb290ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZ2dlcjogJXMnICUgZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGlzYWJsZV9leGlzdGluZyA9IGNvbmZpZy5wb3AoJ2Rpc2FibGVfZXhpc3RpbmdfbG9nZ2VycycsIFRydWUpCisKKyAgICAgICAgICAgICAgICBsb2dnaW5nLl9oYW5kbGVycy5jbGVhcigpCisgICAgICAgICAgICAgICAgZGVsIGxvZ2dpbmcuX2hhbmRsZXJMaXN0WzpdCisKKyAgICAgICAgICAgICAgICAjIERvIGZvcm1hdHRlcnMgZmlyc3QgLSB0aGV5IGRvbid0IHJlZmVyIHRvIGFueXRoaW5nIGVsc2UKKyAgICAgICAgICAgICAgICBmb3JtYXR0ZXJzID0gY29uZmlnLmdldCgnZm9ybWF0dGVycycsIEVNUFRZX0RJQ1QpCisgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZm9ybWF0dGVyczoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyc1tuYW1lXSA9IHNlbGYuY29uZmlndXJlX2Zvcm1hdHRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcnNbbmFtZV0pCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb3JtYXR0ZXIgJXI6ICVzJyAlIChuYW1lLCBlKSkKKyAgICAgICAgICAgICAgICAjIE5leHQsIGRvIGZpbHRlcnMgLSB0aGV5IGRvbid0IHJlZmVyIHRvIGFueXRoaW5nIGVsc2UsIGVpdGhlcgorICAgICAgICAgICAgICAgIGZpbHRlcnMgPSBjb25maWcuZ2V0KCdmaWx0ZXJzJywgRU1QVFlfRElDVCkKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWx0ZXJzOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzW25hbWVdID0gc2VsZi5jb25maWd1cmVfZmlsdGVyKGZpbHRlcnNbbmFtZV0pCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWx0ZXIgJXI6ICVzJyAlIChuYW1lLCBlKSkKKworICAgICAgICAgICAgICAgICMgTmV4dCwgZG8gaGFuZGxlcnMgLSB0aGV5IHJlZmVyIHRvIGZvcm1hdHRlcnMgYW5kIGZpbHRlcnMKKyAgICAgICAgICAgICAgICAjIEFzIGhhbmRsZXJzIGNhbiByZWZlciB0byBvdGhlciBoYW5kbGVycywgc29ydCB0aGUga2V5cworICAgICAgICAgICAgICAgICMgdG8gYWxsb3cgYSBkZXRlcm1pbmlzdGljIG9yZGVyIG9mIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICBoYW5kbGVycyA9IGNvbmZpZy5nZXQoJ2hhbmRsZXJzJywgRU1QVFlfRElDVCkKKyAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IFtdCisgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gc29ydGVkKGhhbmRsZXJzKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuY29uZmlndXJlX2hhbmRsZXIoaGFuZGxlcnNbbmFtZV0pCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLm5hbWUgPSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyc1tuYW1lXSA9IGhhbmRsZXIKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAndGFyZ2V0IG5vdCBjb25maWd1cmVkIHlldCcgaW4gc3RyKGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLmFwcGVuZChuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGhhbmRsZXIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAobmFtZSwgZSkpCisKKyAgICAgICAgICAgICAgICAjIE5vdyBkbyBhbnkgdGhhdCB3ZXJlIGRlZmVycmVkCisgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZGVmZXJyZWQ6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBzZWxmLmNvbmZpZ3VyZV9oYW5kbGVyKGhhbmRsZXJzW25hbWVdKQorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5uYW1lID0gbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcnNbbmFtZV0gPSBoYW5kbGVyCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSBoYW5kbGVyICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAobmFtZSwgZSkpCisKKyAgICAgICAgICAgICAgICAjIE5leHQsIGRvIGxvZ2dlcnMgLSB0aGV5IHJlZmVyIHRvIGhhbmRsZXJzIGFuZCBmaWx0ZXJzCisKKyAgICAgICAgICAgICAgICAjd2UgZG9uJ3Qgd2FudCB0byBsb3NlIHRoZSBleGlzdGluZyBsb2dnZXJzLAorICAgICAgICAgICAgICAgICNzaW5jZSBvdGhlciB0aHJlYWRzIG1heSBoYXZlIHBvaW50ZXJzIHRvIHRoZW0uCisgICAgICAgICAgICAgICAgI2V4aXN0aW5nIGlzIHNldCB0byBjb250YWluIGFsbCBleGlzdGluZyBsb2dnZXJzLAorICAgICAgICAgICAgICAgICNhbmQgYXMgd2UgZ28gdGhyb3VnaCB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gd2UKKyAgICAgICAgICAgICAgICAjcmVtb3ZlIGFueSB3aGljaCBhcmUgY29uZmlndXJlZC4gQXQgdGhlIGVuZCwKKyAgICAgICAgICAgICAgICAjd2hhdCdzIGxlZnQgaW4gZXhpc3RpbmcgaXMgdGhlIHNldCBvZiBsb2dnZXJzCisgICAgICAgICAgICAgICAgI3doaWNoIHdlcmUgaW4gdGhlIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24gYnV0CisgICAgICAgICAgICAgICAgI3doaWNoIGFyZSBub3QgaW4gdGhlIG5ldyBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgIHJvb3QgPSBsb2dnaW5nLnJvb3QKKyAgICAgICAgICAgICAgICBleGlzdGluZyA9IHJvb3QubWFuYWdlci5sb2dnZXJEaWN0LmtleXMoKQorICAgICAgICAgICAgICAgICNUaGUgbGlzdCBuZWVkcyB0byBiZSBzb3J0ZWQgc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgICAgICAgICAjYXZvaWQgZGlzYWJsaW5nIGNoaWxkIGxvZ2dlcnMgb2YgZXhwbGljaXRseQorICAgICAgICAgICAgICAgICNuYW1lZCBsb2dnZXJzLiBXaXRoIGEgc29ydGVkIGxpc3QgaXQgaXMgZWFzaWVyCisgICAgICAgICAgICAgICAgI3RvIGZpbmQgdGhlIGNoaWxkIGxvZ2dlcnMuCisgICAgICAgICAgICAgICAgZXhpc3Rpbmcuc29ydCgpCisgICAgICAgICAgICAgICAgI1dlJ2xsIGtlZXAgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgbG9nZ2VycworICAgICAgICAgICAgICAgICN3aGljaCBhcmUgY2hpbGRyZW4gb2YgbmFtZWQgbG9nZ2VycyBoZXJlLi4uCisgICAgICAgICAgICAgICAgY2hpbGRfbG9nZ2VycyA9IFtdCisgICAgICAgICAgICAgICAgI25vdyBzZXQgdXAgdGhlIG5ldyBvbmVzLi4uCisgICAgICAgICAgICAgICAgbG9nZ2VycyA9IGNvbmZpZy5nZXQoJ2xvZ2dlcnMnLCBFTVBUWV9ESUNUKQorICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGxvZ2dlcnM6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBfZW5jb2RlZChuYW1lKQorICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIGluIGV4aXN0aW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGV4aXN0aW5nLmluZGV4KG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhlZCA9IG5hbWUgKyAiLiIKKyAgICAgICAgICAgICAgICAgICAgICAgIHBmbGVuID0gbGVuKHByZWZpeGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2V4aXN0aW5nID0gbGVuKGV4aXN0aW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxICMgbG9vayBhdCB0aGUgZW50cnkgYWZ0ZXIgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBudW1fZXhpc3RpbmcpIGFuZFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleGlzdGluZ1tpXVs6cGZsZW5dID09IHByZWZpeGVkKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZF9sb2dnZXJzLmFwcGVuZChleGlzdGluZ1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnJlbW92ZShuYW1lKQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9sb2dnZXIobmFtZSwgbG9nZ2Vyc1tuYW1lXSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGxvZ2dlciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcjogJXMnICUgKG5hbWUsIGUpKQorCisgICAgICAgICAgICAgICAgI0Rpc2FibGUgYW55IG9sZCBsb2dnZXJzLiBUaGVyZSdzIG5vIHBvaW50IGRlbGV0aW5nCisgICAgICAgICAgICAgICAgI3RoZW0gYXMgb3RoZXIgdGhyZWFkcyBtYXkgY29udGludWUgdG8gaG9sZCByZWZlcmVuY2VzCisgICAgICAgICAgICAgICAgI2FuZCBieSBkaXNhYmxpbmcgdGhlbSwgeW91IHN0b3AgdGhlbSBkb2luZyBhbnkgbG9nZ2luZy4KKyAgICAgICAgICAgICAgICAjSG93ZXZlciwgZG9uJ3QgZGlzYWJsZSBjaGlsZHJlbiBvZiBuYW1lZCBsb2dnZXJzLCBhcyB0aGF0J3MKKyAgICAgICAgICAgICAgICAjcHJvYmFibHkgbm90IHdoYXQgd2FzIGludGVuZGVkIGJ5IHRoZSB1c2VyLgorICAgICAgICAgICAgICAgIGZvciBsb2cgaW4gZXhpc3Rpbmc6CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlciA9IHJvb3QubWFuYWdlci5sb2dnZXJEaWN0W2xvZ10KKyAgICAgICAgICAgICAgICAgICAgaWYgbG9nIGluIGNoaWxkX2xvZ2dlcnM6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubGV2ZWwgPSBsb2dnaW5nLk5PVFNFVAorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmhhbmRsZXJzID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5wcm9wYWdhdGUgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGVsaWYgZGlzYWJsZV9leGlzdGluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kaXNhYmxlZCA9IFRydWUKKworICAgICAgICAgICAgICAgICMgQW5kIGZpbmFsbHksIGRvIHRoZSByb290IGxvZ2dlcgorICAgICAgICAgICAgICAgIHJvb3QgPSBjb25maWcuZ2V0KCdyb290JywgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiByb290OgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpZ3VyZV9yb290KHJvb3QpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGNvbmZpZ3VyZSByb290ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZ2dlcjogJXMnICUgZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvZ2dpbmcuX3JlbGVhc2VMb2NrKCkKKworICAgIGRlZiBjb25maWd1cmVfZm9ybWF0dGVyKHNlbGYsIGNvbmZpZyk6CisgICAgICAgICIiIkNvbmZpZ3VyZSBhIGZvcm1hdHRlciBmcm9tIGEgZGljdGlvbmFyeS4iIiIKKyAgICAgICAgaWYgJygpJyBpbiBjb25maWc6CisgICAgICAgICAgICBmYWN0b3J5ID0gY29uZmlnWycoKSddICMgZm9yIHVzZSBpbiBleGNlcHRpb24gaGFuZGxlcgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShjb25maWcpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yLCB0ZToKKyAgICAgICAgICAgICAgICBpZiAiJ2Zvcm1hdCciIG5vdCBpbiBzdHIodGUpOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICNOYW1lIG9mIHBhcmFtZXRlciBjaGFuZ2VkIGZyb20gZm10IHRvIGZvcm1hdC4KKyAgICAgICAgICAgICAgICAjUmV0cnkgd2l0aCBvbGQgbmFtZS4KKyAgICAgICAgICAgICAgICAjVGhpcyBpcyBzbyB0aGF0IGNvZGUgY2FuIGJlIHVzZWQgd2l0aCBvbGRlciBQeXRob24gdmVyc2lvbnMKKyAgICAgICAgICAgICAgICAjKGUuZy4gYnkgRGphbmdvKQorICAgICAgICAgICAgICAgIGNvbmZpZ1snZm10J10gPSBjb25maWcucG9wKCdmb3JtYXQnKQorICAgICAgICAgICAgICAgIGNvbmZpZ1snKCknXSA9IGZhY3RvcnkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyZV9jdXN0b20oY29uZmlnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm10ID0gY29uZmlnLmdldCgnZm9ybWF0JywgTm9uZSkKKyAgICAgICAgICAgIGRmbXQgPSBjb25maWcuZ2V0KCdkYXRlZm10JywgTm9uZSkKKyAgICAgICAgICAgIHJlc3VsdCA9IGxvZ2dpbmcuRm9ybWF0dGVyKGZtdCwgZGZtdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGNvbmZpZ3VyZV9maWx0ZXIoc2VsZiwgY29uZmlnKToKKyAgICAgICAgIiIiQ29uZmlndXJlIGEgZmlsdGVyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgorICAgICAgICBpZiAnKCknIGluIGNvbmZpZzoKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShjb25maWcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lID0gY29uZmlnLmdldCgnbmFtZScsICcnKQorICAgICAgICAgICAgcmVzdWx0ID0gbG9nZ2luZy5GaWx0ZXIobmFtZSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGFkZF9maWx0ZXJzKHNlbGYsIGZpbHRlcmVyLCBmaWx0ZXJzKToKKyAgICAgICAgIiIiQWRkIGZpbHRlcnMgdG8gYSBmaWx0ZXJlciBmcm9tIGEgbGlzdCBvZiBuYW1lcy4iIiIKKyAgICAgICAgZm9yIGYgaW4gZmlsdGVyczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaWx0ZXJlci5hZGRGaWx0ZXIoc2VsZi5jb25maWdbJ2ZpbHRlcnMnXVtmXSkKKyAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yLCBlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBhZGQgZmlsdGVyICVyOiAlcycgJSAoZiwgZSkpCisKKyAgICBkZWYgY29uZmlndXJlX2hhbmRsZXIoc2VsZiwgY29uZmlnKToKKyAgICAgICAgIiIiQ29uZmlndXJlIGEgaGFuZGxlciBmcm9tIGEgZGljdGlvbmFyeS4iIiIKKyAgICAgICAgZm9ybWF0dGVyID0gY29uZmlnLnBvcCgnZm9ybWF0dGVyJywgTm9uZSkKKyAgICAgICAgaWYgZm9ybWF0dGVyOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IHNlbGYuY29uZmlnWydmb3JtYXR0ZXJzJ11bZm9ybWF0dGVyXQorICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIHNldCBmb3JtYXR0ZXIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAoZm9ybWF0dGVyLCBlKSkKKyAgICAgICAgbGV2ZWwgPSBjb25maWcucG9wKCdsZXZlbCcsIE5vbmUpCisgICAgICAgIGZpbHRlcnMgPSBjb25maWcucG9wKCdmaWx0ZXJzJywgTm9uZSkKKyAgICAgICAgaWYgJygpJyBpbiBjb25maWc6CisgICAgICAgICAgICBjID0gY29uZmlnLnBvcCgnKCknKQorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoYywgJ19fY2FsbF9fJykgYW5kIGhhc2F0dHIodHlwZXMsICdDbGFzc1R5cGUnKSBhbmQgdHlwZShjKSAhPSB0eXBlcy5DbGFzc1R5cGU6CisgICAgICAgICAgICAgICAgYyA9IHNlbGYucmVzb2x2ZShjKQorICAgICAgICAgICAgZmFjdG9yeSA9IGMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNuYW1lID0gY29uZmlnLnBvcCgnY2xhc3MnKQorICAgICAgICAgICAga2xhc3MgPSBzZWxmLnJlc29sdmUoY25hbWUpCisgICAgICAgICAgICAjU3BlY2lhbCBjYXNlIGZvciBoYW5kbGVyIHdoaWNoIHJlZmVycyB0byBhbm90aGVyIGhhbmRsZXIKKyAgICAgICAgICAgIGlmIGlzc3ViY2xhc3Moa2xhc3MsIGxvZ2dpbmcuaGFuZGxlcnMuTWVtb3J5SGFuZGxlcikgYW5kXAorICAgICAgICAgICAgICAgICd0YXJnZXQnIGluIGNvbmZpZzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRoID0gc2VsZi5jb25maWdbJ2hhbmRsZXJzJ11bY29uZmlnWyd0YXJnZXQnXV0KKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGgsIGxvZ2dpbmcuSGFuZGxlcik6CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdbJ2NsYXNzJ10gPSBjbmFtZSAjIHJlc3RvcmUgZm9yIGRlZmVycmVkIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0YW5kYXJkRXJyb3IoJ3RhcmdldCBub3QgY29uZmlndXJlZCB5ZXQnKQorICAgICAgICAgICAgICAgICAgICBjb25maWdbJ3RhcmdldCddID0gdGgKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIHNldCB0YXJnZXQgaGFuZGxlciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAoY29uZmlnWyd0YXJnZXQnXSwgZSkpCisgICAgICAgICAgICBlbGlmIGlzc3ViY2xhc3Moa2xhc3MsIGxvZ2dpbmcuaGFuZGxlcnMuU01UUEhhbmRsZXIpIGFuZFwKKyAgICAgICAgICAgICAgICAnbWFpbGhvc3QnIGluIGNvbmZpZzoKKyAgICAgICAgICAgICAgICBjb25maWdbJ21haWxob3N0J10gPSBzZWxmLmFzX3R1cGxlKGNvbmZpZ1snbWFpbGhvc3QnXSkKKyAgICAgICAgICAgIGVsaWYgaXNzdWJjbGFzcyhrbGFzcywgbG9nZ2luZy5oYW5kbGVycy5TeXNMb2dIYW5kbGVyKSBhbmRcCisgICAgICAgICAgICAgICAgJ2FkZHJlc3MnIGluIGNvbmZpZzoKKyAgICAgICAgICAgICAgICBjb25maWdbJ2FkZHJlc3MnXSA9IHNlbGYuYXNfdHVwbGUoY29uZmlnWydhZGRyZXNzJ10pCisgICAgICAgICAgICBmYWN0b3J5ID0ga2xhc3MKKyAgICAgICAga3dhcmdzID0gZGljdChbKGssIGNvbmZpZ1trXSkgZm9yIGsgaW4gY29uZmlnIGlmIHZhbGlkX2lkZW50KGspXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gZmFjdG9yeSgqKmt3YXJncykKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgdGU6CisgICAgICAgICAgICBpZiAiJ3N0cmVhbSciIG5vdCBpbiBzdHIodGUpOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAjVGhlIGFyZ3VtZW50IG5hbWUgY2hhbmdlZCBmcm9tIHN0cm0gdG8gc3RyZWFtCisgICAgICAgICAgICAjUmV0cnkgd2l0aCBvbGQgbmFtZS4KKyAgICAgICAgICAgICNUaGlzIGlzIHNvIHRoYXQgY29kZSBjYW4gYmUgdXNlZCB3aXRoIG9sZGVyIFB5dGhvbiB2ZXJzaW9ucworICAgICAgICAgICAgIyhlLmcuIGJ5IERqYW5nbykKKyAgICAgICAgICAgIGt3YXJnc1snc3RybSddID0ga3dhcmdzLnBvcCgnc3RyZWFtJykKKyAgICAgICAgICAgIHJlc3VsdCA9IGZhY3RvcnkoKiprd2FyZ3MpCisgICAgICAgIGlmIGZvcm1hdHRlcjoKKyAgICAgICAgICAgIHJlc3VsdC5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKQorICAgICAgICBpZiBsZXZlbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJlc3VsdC5zZXRMZXZlbChsb2dnaW5nLl9jaGVja0xldmVsKGxldmVsKSkKKyAgICAgICAgaWYgZmlsdGVyczoKKyAgICAgICAgICAgIHNlbGYuYWRkX2ZpbHRlcnMocmVzdWx0LCBmaWx0ZXJzKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgYWRkX2hhbmRsZXJzKHNlbGYsIGxvZ2dlciwgaGFuZGxlcnMpOgorICAgICAgICAiIiJBZGQgaGFuZGxlcnMgdG8gYSBsb2dnZXIgZnJvbSBhIGxpc3Qgb2YgbmFtZXMuIiIiCisgICAgICAgIGZvciBoIGluIGhhbmRsZXJzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKHNlbGYuY29uZmlnWydoYW5kbGVycyddW2hdKQorICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGFkZCBoYW5kbGVyICVyOiAlcycgJSAoaCwgZSkpCisKKyAgICBkZWYgY29tbW9uX2xvZ2dlcl9jb25maWcoc2VsZiwgbG9nZ2VyLCBjb25maWcsIGluY3JlbWVudGFsPUZhbHNlKToKKyAgICAgICAgIiIiCisgICAgICAgIFBlcmZvcm0gY29uZmlndXJhdGlvbiB3aGljaCBpcyBjb21tb24gdG8gcm9vdCBhbmQgbm9uLXJvb3QgbG9nZ2Vycy4KKyAgICAgICAgIiIiCisgICAgICAgIGxldmVsID0gY29uZmlnLmdldCgnbGV2ZWwnLCBOb25lKQorICAgICAgICBpZiBsZXZlbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLl9jaGVja0xldmVsKGxldmVsKSkKKyAgICAgICAgaWYgbm90IGluY3JlbWVudGFsOgorICAgICAgICAgICAgI1JlbW92ZSBhbnkgZXhpc3RpbmcgaGFuZGxlcnMKKyAgICAgICAgICAgIGZvciBoIGluIGxvZ2dlci5oYW5kbGVyc1s6XToKKyAgICAgICAgICAgICAgICBsb2dnZXIucmVtb3ZlSGFuZGxlcihoKQorICAgICAgICAgICAgaGFuZGxlcnMgPSBjb25maWcuZ2V0KCdoYW5kbGVycycsIE5vbmUpCisgICAgICAgICAgICBpZiBoYW5kbGVyczoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9oYW5kbGVycyhsb2dnZXIsIGhhbmRsZXJzKQorICAgICAgICAgICAgZmlsdGVycyA9IGNvbmZpZy5nZXQoJ2ZpbHRlcnMnLCBOb25lKQorICAgICAgICAgICAgaWYgZmlsdGVyczoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9maWx0ZXJzKGxvZ2dlciwgZmlsdGVycykKKworICAgIGRlZiBjb25maWd1cmVfbG9nZ2VyKHNlbGYsIG5hbWUsIGNvbmZpZywgaW5jcmVtZW50YWw9RmFsc2UpOgorICAgICAgICAiIiJDb25maWd1cmUgYSBub24tcm9vdCBsb2dnZXIgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCisgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKG5hbWUpCisgICAgICAgIHNlbGYuY29tbW9uX2xvZ2dlcl9jb25maWcobG9nZ2VyLCBjb25maWcsIGluY3JlbWVudGFsKQorICAgICAgICBwcm9wYWdhdGUgPSBjb25maWcuZ2V0KCdwcm9wYWdhdGUnLCBOb25lKQorICAgICAgICBpZiBwcm9wYWdhdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsb2dnZXIucHJvcGFnYXRlID0gcHJvcGFnYXRlCisKKyAgICBkZWYgY29uZmlndXJlX3Jvb3Qoc2VsZiwgY29uZmlnLCBpbmNyZW1lbnRhbD1GYWxzZSk6CisgICAgICAgICIiIkNvbmZpZ3VyZSBhIHJvb3QgbG9nZ2VyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgorICAgICAgICByb290ID0gbG9nZ2luZy5nZXRMb2dnZXIoKQorICAgICAgICBzZWxmLmNvbW1vbl9sb2dnZXJfY29uZmlnKHJvb3QsIGNvbmZpZywgaW5jcmVtZW50YWwpCisKK2RpY3RDb25maWdDbGFzcyA9IERpY3RDb25maWd1cmF0b3IKKworZGVmIGRpY3RDb25maWcoY29uZmlnKToKKyAgICAiIiJDb25maWd1cmUgbG9nZ2luZyB1c2luZyBhIGRpY3Rpb25hcnkuIiIiCisgICAgZGljdENvbmZpZ0NsYXNzKGNvbmZpZykuY29uZmlndXJlKCkKKworCitkZWYgbGlzdGVuKHBvcnQ9REVGQVVMVF9MT0dHSU5HX0NPTkZJR19QT1JUKToKKyAgICAiIiIKKyAgICBTdGFydCB1cCBhIHNvY2tldCBzZXJ2ZXIgb24gdGhlIHNwZWNpZmllZCBwb3J0LCBhbmQgbGlzdGVuIGZvciBuZXcKKyAgICBjb25maWd1cmF0aW9ucy4KKworICAgIFRoZXNlIHdpbGwgYmUgc2VudCBhcyBhIGZpbGUgc3VpdGFibGUgZm9yIHByb2Nlc3NpbmcgYnkgZmlsZUNvbmZpZygpLgorICAgIFJldHVybnMgYSBUaHJlYWQgb2JqZWN0IG9uIHdoaWNoIHlvdSBjYW4gY2FsbCBzdGFydCgpIHRvIHN0YXJ0IHRoZSBzZXJ2ZXIsCisgICAgYW5kIHdoaWNoIHlvdSBjYW4gam9pbigpIHdoZW4gYXBwcm9wcmlhdGUuIFRvIHN0b3AgdGhlIHNlcnZlciwgY2FsbAorICAgIHN0b3BMaXN0ZW5pbmcoKS4KKyAgICAiIiIKKyAgICBpZiBub3QgdGhyZWFkOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJsaXN0ZW4oKSBuZWVkcyB0aHJlYWRpbmcgdG8gd29yayIpCisKKyAgICBjbGFzcyBDb25maWdTdHJlYW1IYW5kbGVyKFN0cmVhbVJlcXVlc3RIYW5kbGVyKToKKyAgICAgICAgIiIiCisgICAgICAgIEhhbmRsZXIgZm9yIGEgbG9nZ2luZyBjb25maWd1cmF0aW9uIHJlcXVlc3QuCisKKyAgICAgICAgSXQgZXhwZWN0cyBhIGNvbXBsZXRlbHkgbmV3IGxvZ2dpbmcgY29uZmlndXJhdGlvbiBhbmQgdXNlcyBmaWxlQ29uZmlnCisgICAgICAgIHRvIGluc3RhbGwgaXQuCisgICAgICAgICIiIgorICAgICAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBIYW5kbGUgYSByZXF1ZXN0LgorCisgICAgICAgICAgICBFYWNoIHJlcXVlc3QgaXMgZXhwZWN0ZWQgdG8gYmUgYSA0LWJ5dGUgbGVuZ3RoLCBwYWNrZWQgdXNpbmcKKyAgICAgICAgICAgIHN0cnVjdC5wYWNrKCI+TCIsIG4pLCBmb2xsb3dlZCBieSB0aGUgY29uZmlnIGZpbGUuCisgICAgICAgICAgICBVc2VzIGZpbGVDb25maWcoKSB0byBkbyB0aGUgZ3J1bnQgd29yay4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgaW1wb3J0IHRlbXBmaWxlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29ubiA9IHNlbGYuY29ubmVjdGlvbgorICAgICAgICAgICAgICAgIGNodW5rID0gY29ubi5yZWN2KDQpCisgICAgICAgICAgICAgICAgaWYgbGVuKGNodW5rKSA9PSA0OgorICAgICAgICAgICAgICAgICAgICBzbGVuID0gc3RydWN0LnVucGFjaygiPkwiLCBjaHVuaylbMF0KKyAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBzZWxmLmNvbm5lY3Rpb24ucmVjdihzbGVuKQorICAgICAgICAgICAgICAgICAgICB3aGlsZSBsZW4oY2h1bmspIDwgc2xlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmsgKyBjb25uLnJlY3Yoc2xlbiAtIGxlbihjaHVuaykpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBqc29uCisgICAgICAgICAgICAgICAgICAgICAgICBkID1qc29uLmxvYWRzKGNodW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZCwgZGljdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RDb25maWcoZCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgI0FwcGx5IG5ldyBjb25maWd1cmF0aW9uLgorCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlID0gY1N0cmluZ0lPLlN0cmluZ0lPKGNodW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVDb25maWcoZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuc2VydmVyLnJlYWR5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIucmVhZHkuc2V0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZS5hcmdzLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZXJyY29kZSA9IGUuYXJnc1swXQorICAgICAgICAgICAgICAgICAgICBpZiBlcnJjb2RlICE9IFJFU0VUX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKworICAgIGNsYXNzIENvbmZpZ1NvY2tldFJlY2VpdmVyKFRocmVhZGluZ1RDUFNlcnZlcik6CisgICAgICAgICIiIgorICAgICAgICBBIHNpbXBsZSBUQ1Agc29ja2V0LWJhc2VkIGxvZ2dpbmcgY29uZmlnIHJlY2VpdmVyLgorICAgICAgICAiIiIKKworICAgICAgICBhbGxvd19yZXVzZV9hZGRyZXNzID0gMQorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PURFRkFVTFRfTE9HR0lOR19DT05GSUdfUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXI9Tm9uZSwgcmVhZHk9Tm9uZSk6CisgICAgICAgICAgICBUaHJlYWRpbmdUQ1BTZXJ2ZXIuX19pbml0X18oc2VsZiwgKGhvc3QsIHBvcnQpLCBoYW5kbGVyKQorICAgICAgICAgICAgbG9nZ2luZy5fYWNxdWlyZUxvY2soKQorICAgICAgICAgICAgc2VsZi5hYm9ydCA9IDAKKyAgICAgICAgICAgIGxvZ2dpbmcuX3JlbGVhc2VMb2NrKCkKKyAgICAgICAgICAgIHNlbGYudGltZW91dCA9IDEKKyAgICAgICAgICAgIHNlbGYucmVhZHkgPSByZWFkeQorCisgICAgICAgIGRlZiBzZXJ2ZV91bnRpbF9zdG9wcGVkKHNlbGYpOgorICAgICAgICAgICAgaW1wb3J0IHNlbGVjdAorICAgICAgICAgICAgYWJvcnQgPSAwCisgICAgICAgICAgICB3aGlsZSBub3QgYWJvcnQ6CisgICAgICAgICAgICAgICAgcmQsIHdyLCBleCA9IHNlbGVjdC5zZWxlY3QoW3NlbGYuc29ja2V0LmZpbGVubygpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aW1lb3V0KQorICAgICAgICAgICAgICAgIGlmIHJkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICBsb2dnaW5nLl9hY3F1aXJlTG9jaygpCisgICAgICAgICAgICAgICAgYWJvcnQgPSBzZWxmLmFib3J0CisgICAgICAgICAgICAgICAgbG9nZ2luZy5fcmVsZWFzZUxvY2soKQorICAgICAgICAgICAgc2VsZi5zb2NrZXQuY2xvc2UoKQorCisgICAgY2xhc3MgU2VydmVyKHRocmVhZGluZy5UaHJlYWQpOgorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCByY3ZyLCBoZGxyLCBwb3J0KToKKyAgICAgICAgICAgIHN1cGVyKFNlcnZlciwgc2VsZikuX19pbml0X18oKQorICAgICAgICAgICAgc2VsZi5yY3ZyID0gcmN2cgorICAgICAgICAgICAgc2VsZi5oZGxyID0gaGRscgorICAgICAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICAgICAgc2VsZi5yZWFkeSA9IHRocmVhZGluZy5FdmVudCgpCisKKyAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgIHNlcnZlciA9IHNlbGYucmN2cihwb3J0PXNlbGYucG9ydCwgaGFuZGxlcj1zZWxmLmhkbHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZHk9c2VsZi5yZWFkeSkKKyAgICAgICAgICAgIGlmIHNlbGYucG9ydCA9PSAwOgorICAgICAgICAgICAgICAgIHNlbGYucG9ydCA9IHNlcnZlci5zZXJ2ZXJfYWRkcmVzc1sxXQorICAgICAgICAgICAgc2VsZi5yZWFkeS5zZXQoKQorICAgICAgICAgICAgZ2xvYmFsIF9saXN0ZW5lcgorICAgICAgICAgICAgbG9nZ2luZy5fYWNxdWlyZUxvY2soKQorICAgICAgICAgICAgX2xpc3RlbmVyID0gc2VydmVyCisgICAgICAgICAgICBsb2dnaW5nLl9yZWxlYXNlTG9jaygpCisgICAgICAgICAgICBzZXJ2ZXIuc2VydmVfdW50aWxfc3RvcHBlZCgpCisKKyAgICByZXR1cm4gU2VydmVyKENvbmZpZ1NvY2tldFJlY2VpdmVyLCBDb25maWdTdHJlYW1IYW5kbGVyLCBwb3J0KQorCitkZWYgc3RvcExpc3RlbmluZygpOgorICAgICIiIgorICAgIFN0b3AgdGhlIGxpc3RlbmluZyBzZXJ2ZXIgd2hpY2ggd2FzIGNyZWF0ZWQgd2l0aCBhIGNhbGwgdG8gbGlzdGVuKCkuCisgICAgIiIiCisgICAgZ2xvYmFsIF9saXN0ZW5lcgorICAgIGxvZ2dpbmcuX2FjcXVpcmVMb2NrKCkKKyAgICB0cnk6CisgICAgICAgIGlmIF9saXN0ZW5lcjoKKyAgICAgICAgICAgIF9saXN0ZW5lci5hYm9ydCA9IDEKKyAgICAgICAgICAgIF9saXN0ZW5lciA9IE5vbmUKKyAgICBmaW5hbGx5OgorICAgICAgICBsb2dnaW5nLl9yZWxlYXNlTG9jaygpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xvZ2dpbmcvY29uZmlnLnB5YyBiL2xpYi9weXRob24yLjcvbG9nZ2luZy9jb25maWcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NzBjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvY29uZmlnLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xvZ2dpbmcvY29uZmlnLnB5byBiL2xpYi9weXRob24yLjcvbG9nZ2luZy9jb25maWcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMGI0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvY29uZmlnLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xvZ2dpbmcvaGFuZGxlcnMucHkgYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvaGFuZGxlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzN2Y0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbG9nZ2luZy9oYW5kbGVycy5weQpAQCAtMCwwICsxLDEyMjEgQEAKKyMgQ29weXJpZ2h0IDIwMDEtMjAxMyBieSBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisjIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKKyMgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorIyBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyMgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBWaW5heSBTYWppcAorIyBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24KKyMgb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyMgVklOQVkgU0FKSVAgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworIyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwKKyMgVklOQVkgU0FKSVAgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCisjIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUgorIyBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAorIyBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisiIiIKK0FkZGl0aW9uYWwgaGFuZGxlcnMgZm9yIHRoZSBsb2dnaW5nIHBhY2thZ2UgZm9yIFB5dGhvbi4gVGhlIGNvcmUgcGFja2FnZSBpcworYmFzZWQgb24gUEVQIDI4MiBhbmQgY29tbWVudHMgdGhlcmV0byBpbiBjb21wLmxhbmcucHl0aG9uLgorCitDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMyBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworVG8gdXNlLCBzaW1wbHkgJ2ltcG9ydCBsb2dnaW5nLmhhbmRsZXJzJyBhbmQgbG9nIGF3YXkhCisiIiIKKworaW1wb3J0IGVycm5vLCBsb2dnaW5nLCBzb2NrZXQsIG9zLCBjUGlja2xlLCBzdHJ1Y3QsIHRpbWUsIHJlCitmcm9tIHN0YXQgaW1wb3J0IFNUX0RFViwgU1RfSU5PLCBTVF9NVElNRQorCit0cnk6CisgICAgaW1wb3J0IGNvZGVjcworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGNvZGVjcyA9IE5vbmUKK3RyeToKKyAgICB1bmljb2RlCisgICAgX3VuaWNvZGUgPSBUcnVlCitleGNlcHQgTmFtZUVycm9yOgorICAgIF91bmljb2RlID0gRmFsc2UKKworIworIyBTb21lIGNvbnN0YW50cy4uLgorIworCitERUZBVUxUX1RDUF9MT0dHSU5HX1BPUlQgICAgPSA5MDIwCitERUZBVUxUX1VEUF9MT0dHSU5HX1BPUlQgICAgPSA5MDIxCitERUZBVUxUX0hUVFBfTE9HR0lOR19QT1JUICAgPSA5MDIyCitERUZBVUxUX1NPQVBfTE9HR0lOR19QT1JUICAgPSA5MDIzCitTWVNMT0dfVURQX1BPUlQgICAgICAgICAgICAgPSA1MTQKK1NZU0xPR19UQ1BfUE9SVCAgICAgICAgICAgICA9IDUxNAorCitfTUlETklHSFQgPSAyNCAqIDYwICogNjAgICMgbnVtYmVyIG9mIHNlY29uZHMgaW4gYSBkYXkKKworY2xhc3MgQmFzZVJvdGF0aW5nSGFuZGxlcihsb2dnaW5nLkZpbGVIYW5kbGVyKToKKyAgICAiIiIKKyAgICBCYXNlIGNsYXNzIGZvciBoYW5kbGVycyB0aGF0IHJvdGF0ZSBsb2cgZmlsZXMgYXQgYSBjZXJ0YWluIHBvaW50LgorICAgIE5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuICBJbnN0ZWFkLCB1c2UgUm90YXRpbmdGaWxlSGFuZGxlcgorICAgIG9yIFRpbWVkUm90YXRpbmdGaWxlSGFuZGxlci4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIG1vZGUsIGVuY29kaW5nPU5vbmUsIGRlbGF5PTApOgorICAgICAgICAiIiIKKyAgICAgICAgVXNlIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUgZm9yIHN0cmVhbWVkIGxvZ2dpbmcKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNvZGVjcyBpcyBOb25lOgorICAgICAgICAgICAgZW5jb2RpbmcgPSBOb25lCisgICAgICAgIGxvZ2dpbmcuRmlsZUhhbmRsZXIuX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIG1vZGUsIGVuY29kaW5nLCBkZWxheSkKKyAgICAgICAgc2VsZi5tb2RlID0gbW9kZQorICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKworICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBFbWl0IGEgcmVjb3JkLgorCisgICAgICAgIE91dHB1dCB0aGUgcmVjb3JkIHRvIHRoZSBmaWxlLCBjYXRlcmluZyBmb3Igcm9sbG92ZXIgYXMgZGVzY3JpYmVkCisgICAgICAgIGluIGRvUm9sbG92ZXIoKS4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuc2hvdWxkUm9sbG92ZXIocmVjb3JkKToKKyAgICAgICAgICAgICAgICBzZWxmLmRvUm9sbG92ZXIoKQorICAgICAgICAgICAgbG9nZ2luZy5GaWxlSGFuZGxlci5lbWl0KHNlbGYsIHJlY29yZCkKKyAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlY29yZCkKKworY2xhc3MgUm90YXRpbmdGaWxlSGFuZGxlcihCYXNlUm90YXRpbmdIYW5kbGVyKToKKyAgICAiIiIKKyAgICBIYW5kbGVyIGZvciBsb2dnaW5nIHRvIGEgc2V0IG9mIGZpbGVzLCB3aGljaCBzd2l0Y2hlcyBmcm9tIG9uZSBmaWxlCisgICAgdG8gdGhlIG5leHQgd2hlbiB0aGUgY3VycmVudCBmaWxlIHJlYWNoZXMgYSBjZXJ0YWluIHNpemUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBtb2RlPSdhJywgbWF4Qnl0ZXM9MCwgYmFja3VwQ291bnQ9MCwgZW5jb2Rpbmc9Tm9uZSwgZGVsYXk9MCk6CisgICAgICAgICIiIgorICAgICAgICBPcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSBhbmQgdXNlIGl0IGFzIHRoZSBzdHJlYW0gZm9yIGxvZ2dpbmcuCisKKyAgICAgICAgQnkgZGVmYXVsdCwgdGhlIGZpbGUgZ3Jvd3MgaW5kZWZpbml0ZWx5LiBZb3UgY2FuIHNwZWNpZnkgcGFydGljdWxhcgorICAgICAgICB2YWx1ZXMgb2YgbWF4Qnl0ZXMgYW5kIGJhY2t1cENvdW50IHRvIGFsbG93IHRoZSBmaWxlIHRvIHJvbGxvdmVyIGF0CisgICAgICAgIGEgcHJlZGV0ZXJtaW5lZCBzaXplLgorCisgICAgICAgIFJvbGxvdmVyIG9jY3VycyB3aGVuZXZlciB0aGUgY3VycmVudCBsb2cgZmlsZSBpcyBuZWFybHkgbWF4Qnl0ZXMgaW4KKyAgICAgICAgbGVuZ3RoLiBJZiBiYWNrdXBDb3VudCBpcyA+PSAxLCB0aGUgc3lzdGVtIHdpbGwgc3VjY2Vzc2l2ZWx5IGNyZWF0ZQorICAgICAgICBuZXcgZmlsZXMgd2l0aCB0aGUgc2FtZSBwYXRobmFtZSBhcyB0aGUgYmFzZSBmaWxlLCBidXQgd2l0aCBleHRlbnNpb25zCisgICAgICAgICIuMSIsICIuMiIgZXRjLiBhcHBlbmRlZCB0byBpdC4gRm9yIGV4YW1wbGUsIHdpdGggYSBiYWNrdXBDb3VudCBvZiA1CisgICAgICAgIGFuZCBhIGJhc2UgZmlsZSBuYW1lIG9mICJhcHAubG9nIiwgeW91IHdvdWxkIGdldCAiYXBwLmxvZyIsCisgICAgICAgICJhcHAubG9nLjEiLCAiYXBwLmxvZy4yIiwgLi4uIHRocm91Z2ggdG8gImFwcC5sb2cuNSIuIFRoZSBmaWxlIGJlaW5nCisgICAgICAgIHdyaXR0ZW4gdG8gaXMgYWx3YXlzICJhcHAubG9nIiAtIHdoZW4gaXQgZ2V0cyBmaWxsZWQgdXAsIGl0IGlzIGNsb3NlZAorICAgICAgICBhbmQgcmVuYW1lZCB0byAiYXBwLmxvZy4xIiwgYW5kIGlmIGZpbGVzICJhcHAubG9nLjEiLCAiYXBwLmxvZy4yIiBldGMuCisgICAgICAgIGV4aXN0LCB0aGVuIHRoZXkgYXJlIHJlbmFtZWQgdG8gImFwcC5sb2cuMiIsICJhcHAubG9nLjMiIGV0Yy4KKyAgICAgICAgcmVzcGVjdGl2ZWx5LgorCisgICAgICAgIElmIG1heEJ5dGVzIGlzIHplcm8sIHJvbGxvdmVyIG5ldmVyIG9jY3Vycy4KKyAgICAgICAgIiIiCisgICAgICAgICMgSWYgcm90YXRpb24vcm9sbG92ZXIgaXMgd2FudGVkLCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gdXNlIGFub3RoZXIKKyAgICAgICAgIyBtb2RlLiBJZiBmb3IgZXhhbXBsZSAndycgd2VyZSBzcGVjaWZpZWQsIHRoZW4gaWYgdGhlcmUgd2VyZSBtdWx0aXBsZQorICAgICAgICAjIHJ1bnMgb2YgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24sIHRoZSBsb2dzIGZyb20gcHJldmlvdXMgcnVucyB3b3VsZCBiZQorICAgICAgICAjIGxvc3QgaWYgdGhlICd3JyBpcyByZXNwZWN0ZWQsIGJlY2F1c2UgdGhlIGxvZyBmaWxlIHdvdWxkIGJlIHRydW5jYXRlZAorICAgICAgICAjIG9uIGVhY2ggcnVuLgorICAgICAgICBpZiBtYXhCeXRlcyA+IDA6CisgICAgICAgICAgICBtb2RlID0gJ2EnCisgICAgICAgIEJhc2VSb3RhdGluZ0hhbmRsZXIuX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIG1vZGUsIGVuY29kaW5nLCBkZWxheSkKKyAgICAgICAgc2VsZi5tYXhCeXRlcyA9IG1heEJ5dGVzCisgICAgICAgIHNlbGYuYmFja3VwQ291bnQgPSBiYWNrdXBDb3VudAorCisgICAgZGVmIGRvUm9sbG92ZXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBEbyBhIHJvbGxvdmVyLCBhcyBkZXNjcmliZWQgaW4gX19pbml0X18oKS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuc3RyZWFtOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBOb25lCisgICAgICAgIGlmIHNlbGYuYmFja3VwQ291bnQgPiAwOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5iYWNrdXBDb3VudCAtIDEsIDAsIC0xKToKKyAgICAgICAgICAgICAgICBzZm4gPSAiJXMuJWQiICUgKHNlbGYuYmFzZUZpbGVuYW1lLCBpKQorICAgICAgICAgICAgICAgIGRmbiA9ICIlcy4lZCIgJSAoc2VsZi5iYXNlRmlsZW5hbWUsIGkgKyAxKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNmbik6CisgICAgICAgICAgICAgICAgICAgICNwcmludCAiJXMgLT4gJXMiICUgKHNmbiwgZGZuKQorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkZm4pOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGRmbikKKyAgICAgICAgICAgICAgICAgICAgb3MucmVuYW1lKHNmbiwgZGZuKQorICAgICAgICAgICAgZGZuID0gc2VsZi5iYXNlRmlsZW5hbWUgKyAiLjEiCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkZm4pOgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShkZm4pCisgICAgICAgICAgICBvcy5yZW5hbWUoc2VsZi5iYXNlRmlsZW5hbWUsIGRmbikKKyAgICAgICAgICAgICNwcmludCAiJXMgLT4gJXMiICUgKHNlbGYuYmFzZUZpbGVuYW1lLCBkZm4pCisgICAgICAgIHNlbGYuc3RyZWFtID0gc2VsZi5fb3BlbigpCisKKyAgICBkZWYgc2hvdWxkUm9sbG92ZXIoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIERldGVybWluZSBpZiByb2xsb3ZlciBzaG91bGQgb2NjdXIuCisKKyAgICAgICAgQmFzaWNhbGx5LCBzZWUgaWYgdGhlIHN1cHBsaWVkIHJlY29yZCB3b3VsZCBjYXVzZSB0aGUgZmlsZSB0byBleGNlZWQKKyAgICAgICAgdGhlIHNpemUgbGltaXQgd2UgaGF2ZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuc3RyZWFtIGlzIE5vbmU6ICAgICAgICAgICAgICAgICAjIGRlbGF5IHdhcyBzZXQuLi4KKyAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc2VsZi5fb3BlbigpCisgICAgICAgIGlmIHNlbGYubWF4Qnl0ZXMgPiAwOiAgICAgICAgICAgICAgICAgICAjIGFyZSB3ZSByb2xsaW5nIG92ZXI/CisgICAgICAgICAgICBtc2cgPSAiJXNcbiIgJSBzZWxmLmZvcm1hdChyZWNvcmQpCisgICAgICAgICAgICBzZWxmLnN0cmVhbS5zZWVrKDAsIDIpICAjZHVlIHRvIG5vbi1wb3NpeC1jb21wbGlhbnQgV2luZG93cyBmZWF0dXJlCisgICAgICAgICAgICBpZiBzZWxmLnN0cmVhbS50ZWxsKCkgKyBsZW4obXNnKSA+PSBzZWxmLm1heEJ5dGVzOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHJldHVybiAwCisKK2NsYXNzIFRpbWVkUm90YXRpbmdGaWxlSGFuZGxlcihCYXNlUm90YXRpbmdIYW5kbGVyKToKKyAgICAiIiIKKyAgICBIYW5kbGVyIGZvciBsb2dnaW5nIHRvIGEgZmlsZSwgcm90YXRpbmcgdGhlIGxvZyBmaWxlIGF0IGNlcnRhaW4gdGltZWQKKyAgICBpbnRlcnZhbHMuCisKKyAgICBJZiBiYWNrdXBDb3VudCBpcyA+IDAsIHdoZW4gcm9sbG92ZXIgaXMgZG9uZSwgbm8gbW9yZSB0aGFuIGJhY2t1cENvdW50CisgICAgZmlsZXMgYXJlIGtlcHQgLSB0aGUgb2xkZXN0IG9uZXMgYXJlIGRlbGV0ZWQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCB3aGVuPSdoJywgaW50ZXJ2YWw9MSwgYmFja3VwQ291bnQ9MCwgZW5jb2Rpbmc9Tm9uZSwgZGVsYXk9RmFsc2UsIHV0Yz1GYWxzZSk6CisgICAgICAgIEJhc2VSb3RhdGluZ0hhbmRsZXIuX19pbml0X18oc2VsZiwgZmlsZW5hbWUsICdhJywgZW5jb2RpbmcsIGRlbGF5KQorICAgICAgICBzZWxmLndoZW4gPSB3aGVuLnVwcGVyKCkKKyAgICAgICAgc2VsZi5iYWNrdXBDb3VudCA9IGJhY2t1cENvdW50CisgICAgICAgIHNlbGYudXRjID0gdXRjCisgICAgICAgICMgQ2FsY3VsYXRlIHRoZSByZWFsIHJvbGxvdmVyIGludGVydmFsLCB3aGljaCBpcyBqdXN0IHRoZSBudW1iZXIgb2YKKyAgICAgICAgIyBzZWNvbmRzIGJldHdlZW4gcm9sbG92ZXJzLiAgQWxzbyBzZXQgdGhlIGZpbGVuYW1lIHN1ZmZpeCB1c2VkIHdoZW4KKyAgICAgICAgIyBhIHJvbGxvdmVyIG9jY3Vycy4gIEN1cnJlbnQgJ3doZW4nIGV2ZW50cyBzdXBwb3J0ZWQ6CisgICAgICAgICMgUyAtIFNlY29uZHMKKyAgICAgICAgIyBNIC0gTWludXRlcworICAgICAgICAjIEggLSBIb3VycworICAgICAgICAjIEQgLSBEYXlzCisgICAgICAgICMgbWlkbmlnaHQgLSByb2xsIG92ZXIgYXQgbWlkbmlnaHQKKyAgICAgICAgIyBXezAtNn0gLSByb2xsIG92ZXIgb24gYSBjZXJ0YWluIGRheTsgMCAtIE1vbmRheQorICAgICAgICAjCisgICAgICAgICMgQ2FzZSBvZiB0aGUgJ3doZW4nIHNwZWNpZmllciBpcyBub3QgaW1wb3J0YW50OyBsb3dlciBvciB1cHBlciBjYXNlCisgICAgICAgICMgd2lsbCB3b3JrLgorICAgICAgICBpZiBzZWxmLndoZW4gPT0gJ1MnOgorICAgICAgICAgICAgc2VsZi5pbnRlcnZhbCA9IDEgIyBvbmUgc2Vjb25kCisgICAgICAgICAgICBzZWxmLnN1ZmZpeCA9ICIlWS0lbS0lZF8lSC0lTS0lUyIKKyAgICAgICAgICAgIHNlbGYuZXh0TWF0Y2ggPSByIl5cZHs0fS1cZHsyfS1cZHsyfV9cZHsyfS1cZHsyfS1cZHsyfSQiCisgICAgICAgIGVsaWYgc2VsZi53aGVuID09ICdNJzoKKyAgICAgICAgICAgIHNlbGYuaW50ZXJ2YWwgPSA2MCAjIG9uZSBtaW51dGUKKyAgICAgICAgICAgIHNlbGYuc3VmZml4ID0gIiVZLSVtLSVkXyVILSVNIgorICAgICAgICAgICAgc2VsZi5leHRNYXRjaCA9IHIiXlxkezR9LVxkezJ9LVxkezJ9X1xkezJ9LVxkezJ9JCIKKyAgICAgICAgZWxpZiBzZWxmLndoZW4gPT0gJ0gnOgorICAgICAgICAgICAgc2VsZi5pbnRlcnZhbCA9IDYwICogNjAgIyBvbmUgaG91cgorICAgICAgICAgICAgc2VsZi5zdWZmaXggPSAiJVktJW0tJWRfJUgiCisgICAgICAgICAgICBzZWxmLmV4dE1hdGNoID0gciJeXGR7NH0tXGR7Mn0tXGR7Mn1fXGR7Mn0kIgorICAgICAgICBlbGlmIHNlbGYud2hlbiA9PSAnRCcgb3Igc2VsZi53aGVuID09ICdNSUROSUdIVCc6CisgICAgICAgICAgICBzZWxmLmludGVydmFsID0gNjAgKiA2MCAqIDI0ICMgb25lIGRheQorICAgICAgICAgICAgc2VsZi5zdWZmaXggPSAiJVktJW0tJWQiCisgICAgICAgICAgICBzZWxmLmV4dE1hdGNoID0gciJeXGR7NH0tXGR7Mn0tXGR7Mn0kIgorICAgICAgICBlbGlmIHNlbGYud2hlbi5zdGFydHN3aXRoKCdXJyk6CisgICAgICAgICAgICBzZWxmLmludGVydmFsID0gNjAgKiA2MCAqIDI0ICogNyAjIG9uZSB3ZWVrCisgICAgICAgICAgICBpZiBsZW4oc2VsZi53aGVuKSAhPSAyOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIllvdSBtdXN0IHNwZWNpZnkgYSBkYXkgZm9yIHdlZWtseSByb2xsb3ZlciBmcm9tIDAgdG8gNiAoMCBpcyBNb25kYXkpOiAlcyIgJSBzZWxmLndoZW4pCisgICAgICAgICAgICBpZiBzZWxmLndoZW5bMV0gPCAnMCcgb3Igc2VsZi53aGVuWzFdID4gJzYnOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZGF5IHNwZWNpZmllZCBmb3Igd2Vla2x5IHJvbGxvdmVyOiAlcyIgJSBzZWxmLndoZW4pCisgICAgICAgICAgICBzZWxmLmRheU9mV2VlayA9IGludChzZWxmLndoZW5bMV0pCisgICAgICAgICAgICBzZWxmLnN1ZmZpeCA9ICIlWS0lbS0lZCIKKyAgICAgICAgICAgIHNlbGYuZXh0TWF0Y2ggPSByIl5cZHs0fS1cZHsyfS1cZHsyfSQiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIHJvbGxvdmVyIGludGVydmFsIHNwZWNpZmllZDogJXMiICUgc2VsZi53aGVuKQorCisgICAgICAgIHNlbGYuZXh0TWF0Y2ggPSByZS5jb21waWxlKHNlbGYuZXh0TWF0Y2gpCisgICAgICAgIHNlbGYuaW50ZXJ2YWwgPSBzZWxmLmludGVydmFsICogaW50ZXJ2YWwgIyBtdWx0aXBseSBieSB1bml0cyByZXF1ZXN0ZWQKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICAgICAgdCA9IG9zLnN0YXQoZmlsZW5hbWUpW1NUX01USU1FXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdCA9IGludCh0aW1lLnRpbWUoKSkKKyAgICAgICAgc2VsZi5yb2xsb3ZlckF0ID0gc2VsZi5jb21wdXRlUm9sbG92ZXIodCkKKworICAgIGRlZiBjb21wdXRlUm9sbG92ZXIoc2VsZiwgY3VycmVudFRpbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgV29yayBvdXQgdGhlIHJvbGxvdmVyIHRpbWUgYmFzZWQgb24gdGhlIHNwZWNpZmllZCB0aW1lLgorICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0ID0gY3VycmVudFRpbWUgKyBzZWxmLmludGVydmFsCisgICAgICAgICMgSWYgd2UgYXJlIHJvbGxpbmcgb3ZlciBhdCBtaWRuaWdodCBvciB3ZWVrbHksIHRoZW4gdGhlIGludGVydmFsIGlzIGFscmVhZHkga25vd24uCisgICAgICAgICMgV2hhdCB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgaXMgV0hFTiB0aGUgbmV4dCBpbnRlcnZhbCBpcy4gIEluIG90aGVyIHdvcmRzLAorICAgICAgICAjIGlmIHlvdSBhcmUgcm9sbGluZyBvdmVyIGF0IG1pZG5pZ2h0LCB0aGVuIHlvdXIgYmFzZSBpbnRlcnZhbCBpcyAxIGRheSwKKyAgICAgICAgIyBidXQgeW91IHdhbnQgdG8gc3RhcnQgdGhhdCBvbmUgZGF5IGNsb2NrIGF0IG1pZG5pZ2h0LCBub3Qgbm93LiAgU28sIHdlCisgICAgICAgICMgaGF2ZSB0byBmdWRnZSB0aGUgcm9sbG92ZXJBdCB2YWx1ZSBpbiBvcmRlciB0byB0cmlnZ2VyIHRoZSBmaXJzdCByb2xsb3ZlcgorICAgICAgICAjIGF0IHRoZSByaWdodCB0aW1lLiAgQWZ0ZXIgdGhhdCwgdGhlIHJlZ3VsYXIgaW50ZXJ2YWwgd2lsbCB0YWtlIGNhcmUgb2YKKyAgICAgICAgIyB0aGUgcmVzdC4gIE5vdGUgdGhhdCB0aGlzIGNvZGUgZG9lc24ndCBjYXJlIGFib3V0IGxlYXAgc2Vjb25kcy4gOikKKyAgICAgICAgaWYgc2VsZi53aGVuID09ICdNSUROSUdIVCcgb3Igc2VsZi53aGVuLnN0YXJ0c3dpdGgoJ1cnKToKKyAgICAgICAgICAgICMgVGhpcyBjb3VsZCBiZSBkb25lIHdpdGggbGVzcyBjb2RlLCBidXQgSSB3YW50ZWQgaXQgdG8gYmUgY2xlYXIKKyAgICAgICAgICAgIGlmIHNlbGYudXRjOgorICAgICAgICAgICAgICAgIHQgPSB0aW1lLmdtdGltZShjdXJyZW50VGltZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdCA9IHRpbWUubG9jYWx0aW1lKGN1cnJlbnRUaW1lKQorICAgICAgICAgICAgY3VycmVudEhvdXIgPSB0WzNdCisgICAgICAgICAgICBjdXJyZW50TWludXRlID0gdFs0XQorICAgICAgICAgICAgY3VycmVudFNlY29uZCA9IHRbNV0KKyAgICAgICAgICAgICMgciBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgbGVmdCBiZXR3ZWVuIG5vdyBhbmQgbWlkbmlnaHQKKyAgICAgICAgICAgIHIgPSBfTUlETklHSFQgLSAoKGN1cnJlbnRIb3VyICogNjAgKyBjdXJyZW50TWludXRlKSAqIDYwICsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFNlY29uZCkKKyAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnRUaW1lICsgcgorICAgICAgICAgICAgIyBJZiB3ZSBhcmUgcm9sbGluZyBvdmVyIG9uIGEgY2VydGFpbiBkYXksIGFkZCBpbiB0aGUgbnVtYmVyIG9mIGRheXMgdW50aWwKKyAgICAgICAgICAgICMgdGhlIG5leHQgcm9sbG92ZXIsIGJ1dCBvZmZzZXQgYnkgMSBzaW5jZSB3ZSBqdXN0IGNhbGN1bGF0ZWQgdGhlIHRpbWUKKyAgICAgICAgICAgICMgdW50aWwgdGhlIG5leHQgZGF5IHN0YXJ0cy4gIFRoZXJlIGFyZSB0aHJlZSBjYXNlczoKKyAgICAgICAgICAgICMgQ2FzZSAxKSBUaGUgZGF5IHRvIHJvbGxvdmVyIGlzIHRvZGF5OyBpbiB0aGlzIGNhc2UsIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICMgQ2FzZSAyKSBUaGUgZGF5IHRvIHJvbGxvdmVyIGlzIGZ1cnRoZXIgaW4gdGhlIGludGVydmFsIChpLmUuLCB0b2RheSBpcworICAgICAgICAgICAgIyAgICAgICAgIGRheSAyIChXZWRuZXNkYXkpIGFuZCByb2xsb3ZlciBpcyBvbiBkYXkgNiAoU3VuZGF5KS4gIERheXMgdG8KKyAgICAgICAgICAgICMgICAgICAgICBuZXh0IHJvbGxvdmVyIGlzIHNpbXBseSA2IC0gMiAtIDEsIG9yIDMuCisgICAgICAgICAgICAjIENhc2UgMykgVGhlIGRheSB0byByb2xsb3ZlciBpcyBiZWhpbmQgdXMgaW4gdGhlIGludGVydmFsIChpLmUuLCB0b2RheQorICAgICAgICAgICAgIyAgICAgICAgIGlzIGRheSA1IChTYXR1cmRheSkgYW5kIHJvbGxvdmVyIGlzIG9uIGRheSAzIChUaHVyc2RheSkuCisgICAgICAgICAgICAjICAgICAgICAgRGF5cyB0byByb2xsb3ZlciBpcyA2IC0gNSArIDMsIG9yIDQuICBJbiB0aGlzIGNhc2UsIGl0J3MgdGhlCisgICAgICAgICAgICAjICAgICAgICAgbnVtYmVyIG9mIGRheXMgbGVmdCBpbiB0aGUgY3VycmVudCB3ZWVrICgxKSBwbHVzIHRoZSBudW1iZXIKKyAgICAgICAgICAgICMgICAgICAgICBvZiBkYXlzIGluIHRoZSBuZXh0IHdlZWsgdW50aWwgdGhlIHJvbGxvdmVyIGRheSAoMykuCisgICAgICAgICAgICAjIFRoZSBjYWxjdWxhdGlvbnMgZGVzY3JpYmVkIGluIDIpIGFuZCAzKSBhYm92ZSBuZWVkIHRvIGhhdmUgYSBkYXkgYWRkZWQuCisgICAgICAgICAgICAjIFRoaXMgaXMgYmVjYXVzZSB0aGUgYWJvdmUgdGltZSBjYWxjdWxhdGlvbiB0YWtlcyB1cyB0byBtaWRuaWdodCBvbiB0aGlzCisgICAgICAgICAgICAjIGRheSwgaS5lLiB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZGF5LgorICAgICAgICAgICAgaWYgc2VsZi53aGVuLnN0YXJ0c3dpdGgoJ1cnKToKKyAgICAgICAgICAgICAgICBkYXkgPSB0WzZdICMgMCBpcyBNb25kYXkKKyAgICAgICAgICAgICAgICBpZiBkYXkgIT0gc2VsZi5kYXlPZldlZWs6CisgICAgICAgICAgICAgICAgICAgIGlmIGRheSA8IHNlbGYuZGF5T2ZXZWVrOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF5c1RvV2FpdCA9IHNlbGYuZGF5T2ZXZWVrIC0gZGF5CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXlzVG9XYWl0ID0gNiAtIGRheSArIHNlbGYuZGF5T2ZXZWVrICsgMQorICAgICAgICAgICAgICAgICAgICBuZXdSb2xsb3ZlckF0ID0gcmVzdWx0ICsgKGRheXNUb1dhaXQgKiAoNjAgKiA2MCAqIDI0KSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYudXRjOgorICAgICAgICAgICAgICAgICAgICAgICAgZHN0Tm93ID0gdFstMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdEF0Um9sbG92ZXIgPSB0aW1lLmxvY2FsdGltZShuZXdSb2xsb3ZlckF0KVstMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRzdE5vdyAhPSBkc3RBdFJvbGxvdmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBkc3ROb3c6ICAjIERTVCBraWNrcyBpbiBiZWZvcmUgbmV4dCByb2xsb3Zlciwgc28gd2UgbmVlZCB0byBkZWR1Y3QgYW4gaG91cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlbmQgPSAtMzYwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAjIERTVCBib3dzIG91dCBiZWZvcmUgbmV4dCByb2xsb3Zlciwgc28gd2UgbmVlZCB0byBhZGQgYW4gaG91cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlbmQgPSAzNjAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um9sbG92ZXJBdCArPSBhZGRlbmQKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3Um9sbG92ZXJBdAorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgc2hvdWxkUm9sbG92ZXIoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIERldGVybWluZSBpZiByb2xsb3ZlciBzaG91bGQgb2NjdXIuCisKKyAgICAgICAgcmVjb3JkIGlzIG5vdCB1c2VkLCBhcyB3ZSBhcmUganVzdCBjb21wYXJpbmcgdGltZXMsIGJ1dCBpdCBpcyBuZWVkZWQgc28KKyAgICAgICAgdGhlIG1ldGhvZCBzaWduYXR1cmVzIGFyZSB0aGUgc2FtZQorICAgICAgICAiIiIKKyAgICAgICAgdCA9IGludCh0aW1lLnRpbWUoKSkKKyAgICAgICAgaWYgdCA+PSBzZWxmLnJvbGxvdmVyQXQ6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAjcHJpbnQgIk5vIG5lZWQgdG8gcm9sbG92ZXI6ICVkLCAlZCIgJSAodCwgc2VsZi5yb2xsb3ZlckF0KQorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGdldEZpbGVzVG9EZWxldGUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBEZXRlcm1pbmUgdGhlIGZpbGVzIHRvIGRlbGV0ZSB3aGVuIHJvbGxpbmcgb3Zlci4KKworICAgICAgICBNb3JlIHNwZWNpZmljIHRoYW4gdGhlIGVhcmxpZXIgbWV0aG9kLCB3aGljaCBqdXN0IHVzZWQgZ2xvYi5nbG9iKCkuCisgICAgICAgICIiIgorICAgICAgICBkaXJOYW1lLCBiYXNlTmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5iYXNlRmlsZW5hbWUpCisgICAgICAgIGZpbGVOYW1lcyA9IG9zLmxpc3RkaXIoZGlyTmFtZSkKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgcHJlZml4ID0gYmFzZU5hbWUgKyAiLiIKKyAgICAgICAgcGxlbiA9IGxlbihwcmVmaXgpCisgICAgICAgIGZvciBmaWxlTmFtZSBpbiBmaWxlTmFtZXM6CisgICAgICAgICAgICBpZiBmaWxlTmFtZVs6cGxlbl0gPT0gcHJlZml4OgorICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGZpbGVOYW1lW3BsZW46XQorICAgICAgICAgICAgICAgIGlmIHNlbGYuZXh0TWF0Y2gubWF0Y2goc3VmZml4KToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChvcy5wYXRoLmpvaW4oZGlyTmFtZSwgZmlsZU5hbWUpKQorICAgICAgICByZXN1bHQuc29ydCgpCisgICAgICAgIGlmIGxlbihyZXN1bHQpIDwgc2VsZi5iYWNrdXBDb3VudDoKKyAgICAgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHRbOmxlbihyZXN1bHQpIC0gc2VsZi5iYWNrdXBDb3VudF0KKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGRvUm9sbG92ZXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBkbyBhIHJvbGxvdmVyOyBpbiB0aGlzIGNhc2UsIGEgZGF0ZS90aW1lIHN0YW1wIGlzIGFwcGVuZGVkIHRvIHRoZSBmaWxlbmFtZQorICAgICAgICB3aGVuIHRoZSByb2xsb3ZlciBoYXBwZW5zLiAgSG93ZXZlciwgeW91IHdhbnQgdGhlIGZpbGUgdG8gYmUgbmFtZWQgZm9yIHRoZQorICAgICAgICBzdGFydCBvZiB0aGUgaW50ZXJ2YWwsIG5vdCB0aGUgY3VycmVudCB0aW1lLiAgSWYgdGhlcmUgaXMgYSBiYWNrdXAgY291bnQsCisgICAgICAgIHRoZW4gd2UgaGF2ZSB0byBnZXQgYSBsaXN0IG9mIG1hdGNoaW5nIGZpbGVuYW1lcywgc29ydCB0aGVtIGFuZCByZW1vdmUKKyAgICAgICAgdGhlIG9uZSB3aXRoIHRoZSBvbGRlc3Qgc3VmZml4LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5zdHJlYW06CisgICAgICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IE5vbmUKKyAgICAgICAgIyBnZXQgdGhlIHRpbWUgdGhhdCB0aGlzIHNlcXVlbmNlIHN0YXJ0ZWQgYXQgYW5kIG1ha2UgaXQgYSBUaW1lVHVwbGUKKyAgICAgICAgY3VycmVudFRpbWUgPSBpbnQodGltZS50aW1lKCkpCisgICAgICAgIGRzdE5vdyA9IHRpbWUubG9jYWx0aW1lKGN1cnJlbnRUaW1lKVstMV0KKyAgICAgICAgdCA9IHNlbGYucm9sbG92ZXJBdCAtIHNlbGYuaW50ZXJ2YWwKKyAgICAgICAgaWYgc2VsZi51dGM6CisgICAgICAgICAgICB0aW1lVHVwbGUgPSB0aW1lLmdtdGltZSh0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGltZVR1cGxlID0gdGltZS5sb2NhbHRpbWUodCkKKyAgICAgICAgICAgIGRzdFRoZW4gPSB0aW1lVHVwbGVbLTFdCisgICAgICAgICAgICBpZiBkc3ROb3cgIT0gZHN0VGhlbjoKKyAgICAgICAgICAgICAgICBpZiBkc3ROb3c6CisgICAgICAgICAgICAgICAgICAgIGFkZGVuZCA9IDM2MDAKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhZGRlbmQgPSAtMzYwMAorICAgICAgICAgICAgICAgIHRpbWVUdXBsZSA9IHRpbWUubG9jYWx0aW1lKHQgKyBhZGRlbmQpCisgICAgICAgIGRmbiA9IHNlbGYuYmFzZUZpbGVuYW1lICsgIi4iICsgdGltZS5zdHJmdGltZShzZWxmLnN1ZmZpeCwgdGltZVR1cGxlKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkZm4pOgorICAgICAgICAgICAgb3MucmVtb3ZlKGRmbikKKyAgICAgICAgb3MucmVuYW1lKHNlbGYuYmFzZUZpbGVuYW1lLCBkZm4pCisgICAgICAgIGlmIHNlbGYuYmFja3VwQ291bnQgPiAwOgorICAgICAgICAgICAgIyBmaW5kIHRoZSBvbGRlc3QgbG9nIGZpbGUgYW5kIGRlbGV0ZSBpdAorICAgICAgICAgICAgI3MgPSBnbG9iLmdsb2Ioc2VsZi5iYXNlRmlsZW5hbWUgKyAiLjIwKiIpCisgICAgICAgICAgICAjaWYgbGVuKHMpID4gc2VsZi5iYWNrdXBDb3VudDoKKyAgICAgICAgICAgICMgICAgcy5zb3J0KCkKKyAgICAgICAgICAgICMgICAgb3MucmVtb3ZlKHNbMF0pCisgICAgICAgICAgICBmb3IgcyBpbiBzZWxmLmdldEZpbGVzVG9EZWxldGUoKToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUocykKKyAgICAgICAgI3ByaW50ICIlcyAtPiAlcyIgJSAoc2VsZi5iYXNlRmlsZW5hbWUsIGRmbikKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzZWxmLl9vcGVuKCkKKyAgICAgICAgbmV3Um9sbG92ZXJBdCA9IHNlbGYuY29tcHV0ZVJvbGxvdmVyKGN1cnJlbnRUaW1lKQorICAgICAgICB3aGlsZSBuZXdSb2xsb3ZlckF0IDw9IGN1cnJlbnRUaW1lOgorICAgICAgICAgICAgbmV3Um9sbG92ZXJBdCA9IG5ld1JvbGxvdmVyQXQgKyBzZWxmLmludGVydmFsCisgICAgICAgICNJZiBEU1QgY2hhbmdlcyBhbmQgbWlkbmlnaHQgb3Igd2Vla2x5IHJvbGxvdmVyLCBhZGp1c3QgZm9yIHRoaXMuCisgICAgICAgIGlmIChzZWxmLndoZW4gPT0gJ01JRE5JR0hUJyBvciBzZWxmLndoZW4uc3RhcnRzd2l0aCgnVycpKSBhbmQgbm90IHNlbGYudXRjOgorICAgICAgICAgICAgZHN0QXRSb2xsb3ZlciA9IHRpbWUubG9jYWx0aW1lKG5ld1JvbGxvdmVyQXQpWy0xXQorICAgICAgICAgICAgaWYgZHN0Tm93ICE9IGRzdEF0Um9sbG92ZXI6CisgICAgICAgICAgICAgICAgaWYgbm90IGRzdE5vdzogICMgRFNUIGtpY2tzIGluIGJlZm9yZSBuZXh0IHJvbGxvdmVyLCBzbyB3ZSBuZWVkIHRvIGRlZHVjdCBhbiBob3VyCisgICAgICAgICAgICAgICAgICAgIGFkZGVuZCA9IC0zNjAwCisgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICMgRFNUIGJvd3Mgb3V0IGJlZm9yZSBuZXh0IHJvbGxvdmVyLCBzbyB3ZSBuZWVkIHRvIGFkZCBhbiBob3VyCisgICAgICAgICAgICAgICAgICAgIGFkZGVuZCA9IDM2MDAKKyAgICAgICAgICAgICAgICBuZXdSb2xsb3ZlckF0ICs9IGFkZGVuZAorICAgICAgICBzZWxmLnJvbGxvdmVyQXQgPSBuZXdSb2xsb3ZlckF0CisKK2NsYXNzIFdhdGNoZWRGaWxlSGFuZGxlcihsb2dnaW5nLkZpbGVIYW5kbGVyKToKKyAgICAiIiIKKyAgICBBIGhhbmRsZXIgZm9yIGxvZ2dpbmcgdG8gYSBmaWxlLCB3aGljaCB3YXRjaGVzIHRoZSBmaWxlCisgICAgdG8gc2VlIGlmIGl0IGhhcyBjaGFuZ2VkIHdoaWxlIGluIHVzZS4gVGhpcyBjYW4gaGFwcGVuIGJlY2F1c2Ugb2YKKyAgICB1c2FnZSBvZiBwcm9ncmFtcyBzdWNoIGFzIG5ld3N5c2xvZyBhbmQgbG9ncm90YXRlIHdoaWNoIHBlcmZvcm0KKyAgICBsb2cgZmlsZSByb3RhdGlvbi4gVGhpcyBoYW5kbGVyLCBpbnRlbmRlZCBmb3IgdXNlIHVuZGVyIFVuaXgsCisgICAgd2F0Y2hlcyB0aGUgZmlsZSB0byBzZWUgaWYgaXQgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgZW1pdC4KKyAgICAoQSBmaWxlIGhhcyBjaGFuZ2VkIGlmIGl0cyBkZXZpY2Ugb3IgaW5vZGUgaGF2ZSBjaGFuZ2VkLikKKyAgICBJZiBpdCBoYXMgY2hhbmdlZCwgdGhlIG9sZCBmaWxlIHN0cmVhbSBpcyBjbG9zZWQsIGFuZCB0aGUgZmlsZQorICAgIG9wZW5lZCB0byBnZXQgYSBuZXcgc3RyZWFtLgorCisgICAgVGhpcyBoYW5kbGVyIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdXNlIHVuZGVyIFdpbmRvd3MsIGJlY2F1c2UKKyAgICB1bmRlciBXaW5kb3dzIG9wZW4gZmlsZXMgY2Fubm90IGJlIG1vdmVkIG9yIHJlbmFtZWQgLSBsb2dnaW5nCisgICAgb3BlbnMgdGhlIGZpbGVzIHdpdGggZXhjbHVzaXZlIGxvY2tzIC0gYW5kIHNvIHRoZXJlIGlzIG5vIG5lZWQKKyAgICBmb3Igc3VjaCBhIGhhbmRsZXIuIEZ1cnRoZXJtb3JlLCBTVF9JTk8gaXMgbm90IHN1cHBvcnRlZCB1bmRlcgorICAgIFdpbmRvd3M7IHN0YXQgYWx3YXlzIHJldHVybnMgemVybyBmb3IgdGhpcyB2YWx1ZS4KKworICAgIFRoaXMgaGFuZGxlciBpcyBiYXNlZCBvbiBhIHN1Z2dlc3Rpb24gYW5kIHBhdGNoIGJ5IENoYWQgSi4KKyAgICBTY2hyb2VkZXIuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBtb2RlPSdhJywgZW5jb2Rpbmc9Tm9uZSwgZGVsYXk9MCk6CisgICAgICAgIGxvZ2dpbmcuRmlsZUhhbmRsZXIuX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIG1vZGUsIGVuY29kaW5nLCBkZWxheSkKKyAgICAgICAgc2VsZi5kZXYsIHNlbGYuaW5vID0gLTEsIC0xCisgICAgICAgIHNlbGYuX3N0YXRzdHJlYW0oKQorCisgICAgZGVmIF9zdGF0c3RyZWFtKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnN0cmVhbToKKyAgICAgICAgICAgIHNyZXMgPSBvcy5mc3RhdChzZWxmLnN0cmVhbS5maWxlbm8oKSkKKyAgICAgICAgICAgIHNlbGYuZGV2LCBzZWxmLmlubyA9IHNyZXNbU1RfREVWXSwgc3Jlc1tTVF9JTk9dCisKKyAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRW1pdCBhIHJlY29yZC4KKworICAgICAgICBGaXJzdCBjaGVjayBpZiB0aGUgdW5kZXJseWluZyBmaWxlIGhhcyBjaGFuZ2VkLCBhbmQgaWYgaXQKKyAgICAgICAgaGFzLCBjbG9zZSB0aGUgb2xkIHN0cmVhbSBhbmQgcmVvcGVuIHRoZSBmaWxlIHRvIGdldCB0aGUKKyAgICAgICAgY3VycmVudCBzdHJlYW0uCisgICAgICAgICIiIgorICAgICAgICAjIFJlZHVjZSB0aGUgY2hhbmNlIG9mIHJhY2UgY29uZGl0aW9ucyBieSBzdGF0J2luZyBieSBwYXRoIG9ubHkKKyAgICAgICAgIyBvbmNlIGFuZCB0aGVuIGZzdGF0J2luZyBvdXIgbmV3IGZkIGlmIHdlIG9wZW5lZCBhIG5ldyBsb2cgc3RyZWFtLgorICAgICAgICAjIFNlZSBpc3N1ZSAjMTQ2MzI6IFRoYW5rcyB0byBKb2huIE11bGxpZ2FuIGZvciB0aGUgcHJvYmxlbSByZXBvcnQKKyAgICAgICAgIyBhbmQgcGF0Y2guCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgc3RhdCB0aGUgZmlsZSBieSBwYXRoLCBjaGVja2luZyBmb3IgZXhpc3RlbmNlCisgICAgICAgICAgICBzcmVzID0gb3Muc3RhdChzZWxmLmJhc2VGaWxlbmFtZSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgaWYgZXJyLmVycm5vID09IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICBzcmVzID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAjIGNvbXBhcmUgZmlsZSBzeXN0ZW0gc3RhdCB3aXRoIHRoYXQgb2Ygb3VyIHN0cmVhbSBmaWxlIGhhbmRsZQorICAgICAgICBpZiBub3Qgc3JlcyBvciBzcmVzW1NUX0RFVl0gIT0gc2VsZi5kZXYgb3Igc3Jlc1tTVF9JTk9dICE9IHNlbGYuaW5vOgorICAgICAgICAgICAgaWYgc2VsZi5zdHJlYW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyB3ZSBoYXZlIGFuIG9wZW4gZmlsZSBoYW5kbGUsIGNsZWFuIGl0IHVwCisgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0uZmx1c2goKQorICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAjIG9wZW4gYSBuZXcgZmlsZSBoYW5kbGUgYW5kIGdldCBuZXcgc3RhdCBpbmZvIGZyb20gdGhhdCBmZAorICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc2VsZi5fb3BlbigpCisgICAgICAgICAgICAgICAgc2VsZi5fc3RhdHN0cmVhbSgpCisgICAgICAgIGxvZ2dpbmcuRmlsZUhhbmRsZXIuZW1pdChzZWxmLCByZWNvcmQpCisKK2NsYXNzIFNvY2tldEhhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKKyAgICAiIiIKKyAgICBBIGhhbmRsZXIgY2xhc3Mgd2hpY2ggd3JpdGVzIGxvZ2dpbmcgcmVjb3JkcywgaW4gcGlja2xlIGZvcm1hdCwgdG8KKyAgICBhIHN0cmVhbWluZyBzb2NrZXQuIFRoZSBzb2NrZXQgaXMga2VwdCBvcGVuIGFjcm9zcyBsb2dnaW5nIGNhbGxzLgorICAgIElmIHRoZSBwZWVyIHJlc2V0cyBpdCwgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHJlY29ubmVjdCBvbiB0aGUgbmV4dCBjYWxsLgorICAgIFRoZSBwaWNrbGUgd2hpY2ggaXMgc2VudCBpcyB0aGF0IG9mIHRoZSBMb2dSZWNvcmQncyBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgIChfX2RpY3RfXyksIHNvIHRoYXQgdGhlIHJlY2VpdmVyIGRvZXMgbm90IG5lZWQgdG8gaGF2ZSB0aGUgbG9nZ2luZyBtb2R1bGUKKyAgICBpbnN0YWxsZWQgaW4gb3JkZXIgdG8gcHJvY2VzcyB0aGUgbG9nZ2luZyBldmVudC4KKworICAgIFRvIHVucGlja2xlIHRoZSByZWNvcmQgYXQgdGhlIHJlY2VpdmluZyBlbmQgaW50byBhIExvZ1JlY29yZCwgdXNlIHRoZQorICAgIG1ha2VMb2dSZWNvcmQgZnVuY3Rpb24uCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplcyB0aGUgaGFuZGxlciB3aXRoIGEgc3BlY2lmaWMgaG9zdCBhZGRyZXNzIGFuZCBwb3J0LgorCisgICAgICAgIFRoZSBhdHRyaWJ1dGUgJ2Nsb3NlT25FcnJvcicgaXMgc2V0IHRvIDEgLSB3aGljaCBtZWFucyB0aGF0IGlmCisgICAgICAgIGEgc29ja2V0IGVycm9yIG9jY3VycywgdGhlIHNvY2tldCBpcyBzaWxlbnRseSBjbG9zZWQgYW5kIHRoZW4KKyAgICAgICAgcmVvcGVuZWQgb24gdGhlIG5leHQgbG9nZ2luZyBjYWxsLgorICAgICAgICAiIiIKKyAgICAgICAgbG9nZ2luZy5IYW5kbGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLnNvY2sgPSBOb25lCisgICAgICAgIHNlbGYuY2xvc2VPbkVycm9yID0gMAorICAgICAgICBzZWxmLnJldHJ5VGltZSA9IE5vbmUKKyAgICAgICAgIworICAgICAgICAjIEV4cG9uZW50aWFsIGJhY2tvZmYgcGFyYW1ldGVycy4KKyAgICAgICAgIworICAgICAgICBzZWxmLnJldHJ5U3RhcnQgPSAxLjAKKyAgICAgICAgc2VsZi5yZXRyeU1heCA9IDMwLjAKKyAgICAgICAgc2VsZi5yZXRyeUZhY3RvciA9IDIuMAorCisgICAgZGVmIG1ha2VTb2NrZXQoc2VsZiwgdGltZW91dD0xKToKKyAgICAgICAgIiIiCisgICAgICAgIEEgZmFjdG9yeSBtZXRob2Qgd2hpY2ggYWxsb3dzIHN1YmNsYXNzZXMgdG8gZGVmaW5lIHRoZSBwcmVjaXNlCisgICAgICAgIHR5cGUgb2Ygc29ja2V0IHRoZXkgd2FudC4KKyAgICAgICAgIiIiCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIGlmIGhhc2F0dHIocywgJ3NldHRpbWVvdXQnKToKKyAgICAgICAgICAgIHMuc2V0dGltZW91dCh0aW1lb3V0KQorICAgICAgICBzLmNvbm5lY3QoKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSkKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBjcmVhdGVTb2NrZXQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUcnkgdG8gY3JlYXRlIGEgc29ja2V0LCB1c2luZyBhbiBleHBvbmVudGlhbCBiYWNrb2ZmIHdpdGgKKyAgICAgICAgYSBtYXggcmV0cnkgdGltZS4gVGhhbmtzIHRvIFJvYmVydCBPbHNvbiBmb3IgdGhlIG9yaWdpbmFsIHBhdGNoCisgICAgICAgIChTRiAjODE1OTExKSB3aGljaCBoYXMgYmVlbiBzbGlnaHRseSByZWZhY3RvcmVkLgorICAgICAgICAiIiIKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgIyBFaXRoZXIgcmV0cnlUaW1lIGlzIE5vbmUsIGluIHdoaWNoIGNhc2UgdGhpcworICAgICAgICAjIGlzIHRoZSBmaXJzdCB0aW1lIGJhY2sgYWZ0ZXIgYSBkaXNjb25uZWN0LCBvcgorICAgICAgICAjIHdlJ3ZlIHdhaXRlZCBsb25nIGVub3VnaC4KKyAgICAgICAgaWYgc2VsZi5yZXRyeVRpbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGF0dGVtcHQgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhdHRlbXB0ID0gKG5vdyA+PSBzZWxmLnJldHJ5VGltZSkKKyAgICAgICAgaWYgYXR0ZW1wdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBzZWxmLm1ha2VTb2NrZXQoKQorICAgICAgICAgICAgICAgIHNlbGYucmV0cnlUaW1lID0gTm9uZSAjIG5leHQgdGltZSwgbm8gZGVsYXkgYmVmb3JlIHRyeWluZworICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICAjQ3JlYXRpb24gZmFpbGVkLCBzbyBzZXQgdGhlIHJldHJ5IHRpbWUgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICBpZiBzZWxmLnJldHJ5VGltZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHJ5UGVyaW9kID0gc2VsZi5yZXRyeVN0YXJ0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXRyeVBlcmlvZCA9IHNlbGYucmV0cnlQZXJpb2QgKiBzZWxmLnJldHJ5RmFjdG9yCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucmV0cnlQZXJpb2QgPiBzZWxmLnJldHJ5TWF4OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXRyeVBlcmlvZCA9IHNlbGYucmV0cnlNYXgKKyAgICAgICAgICAgICAgICBzZWxmLnJldHJ5VGltZSA9IG5vdyArIHNlbGYucmV0cnlQZXJpb2QKKworICAgIGRlZiBzZW5kKHNlbGYsIHMpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VuZCBhIHBpY2tsZWQgc3RyaW5nIHRvIHRoZSBzb2NrZXQuCisKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBhbGxvd3MgZm9yIHBhcnRpYWwgc2VuZHMgd2hpY2ggY2FuIGhhcHBlbiB3aGVuIHRoZQorICAgICAgICBuZXR3b3JrIGlzIGJ1c3kuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnNvY2sgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlU29ja2V0KCkKKyAgICAgICAgI3NlbGYuc29jayBjYW4gYmUgTm9uZSBlaXRoZXIgYmVjYXVzZSB3ZSBoYXZlbid0IHJlYWNoZWQgdGhlIHJldHJ5CisgICAgICAgICN0aW1lIHlldCwgb3IgYmVjYXVzZSB3ZSBoYXZlIHJlYWNoZWQgdGhlIHJldHJ5IHRpbWUgYW5kIHJldHJpZWQsCisgICAgICAgICNidXQgYXJlIHN0aWxsIHVuYWJsZSB0byBjb25uZWN0LgorICAgICAgICBpZiBzZWxmLnNvY2s6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLnNvY2ssICJzZW5kYWxsIik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc29jay5zZW5kYWxsKHMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VudHNvZmFyID0gMAorICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbGVuKHMpCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIGxlZnQgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VudCA9IHNlbGYuc29jay5zZW5kKHNbc2VudHNvZmFyOl0pCisgICAgICAgICAgICAgICAgICAgICAgICBzZW50c29mYXIgPSBzZW50c29mYXIgKyBzZW50CisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbGVmdCAtIHNlbnQKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBOb25lICAjIHNvIHdlIGNhbiBjYWxsIGNyZWF0ZVNvY2tldCBuZXh0IHRpbWUKKworICAgIGRlZiBtYWtlUGlja2xlKHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBQaWNrbGVzIHRoZSByZWNvcmQgaW4gYmluYXJ5IGZvcm1hdCB3aXRoIGEgbGVuZ3RoIHByZWZpeCwgYW5kCisgICAgICAgIHJldHVybnMgaXQgcmVhZHkgZm9yIHRyYW5zbWlzc2lvbiBhY3Jvc3MgdGhlIHNvY2tldC4KKyAgICAgICAgIiIiCisgICAgICAgIGVpID0gcmVjb3JkLmV4Y19pbmZvCisgICAgICAgIGlmIGVpOgorICAgICAgICAgICAgIyBqdXN0IHRvIGdldCB0cmFjZWJhY2sgdGV4dCBpbnRvIHJlY29yZC5leGNfdGV4dCAuLi4KKyAgICAgICAgICAgIGR1bW15ID0gc2VsZi5mb3JtYXQocmVjb3JkKQorICAgICAgICAgICAgcmVjb3JkLmV4Y19pbmZvID0gTm9uZSAgIyB0byBhdm9pZCBVbnBpY2tsZWFibGUgZXJyb3IKKyAgICAgICAgIyBTZWUgaXNzdWUgIzE0NDM2OiBJZiBtc2cgb3IgYXJncyBhcmUgb2JqZWN0cywgdGhleSBtYXkgbm90IGJlCisgICAgICAgICMgYXZhaWxhYmxlIG9uIHRoZSByZWNlaXZpbmcgZW5kLiBTbyB3ZSBjb252ZXJ0IHRoZSBtc2cgJSBhcmdzCisgICAgICAgICMgdG8gYSBzdHJpbmcsIHNhdmUgaXQgYXMgbXNnIGFuZCB6YXAgdGhlIGFyZ3MuCisgICAgICAgIGQgPSBkaWN0KHJlY29yZC5fX2RpY3RfXykKKyAgICAgICAgZFsnbXNnJ10gPSByZWNvcmQuZ2V0TWVzc2FnZSgpCisgICAgICAgIGRbJ2FyZ3MnXSA9IE5vbmUKKyAgICAgICAgcyA9IGNQaWNrbGUuZHVtcHMoZCwgMSkKKyAgICAgICAgaWYgZWk6CisgICAgICAgICAgICByZWNvcmQuZXhjX2luZm8gPSBlaSAgIyBmb3IgbmV4dCBoYW5kbGVyCisgICAgICAgIHNsZW4gPSBzdHJ1Y3QucGFjaygiPkwiLCBsZW4ocykpCisgICAgICAgIHJldHVybiBzbGVuICsgcworCisgICAgZGVmIGhhbmRsZUVycm9yKHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBIYW5kbGUgYW4gZXJyb3IgZHVyaW5nIGxvZ2dpbmcuCisKKyAgICAgICAgQW4gZXJyb3IgaGFzIG9jY3VycmVkIGR1cmluZyBsb2dnaW5nLiBNb3N0IGxpa2VseSBjYXVzZSAtCisgICAgICAgIGNvbm5lY3Rpb24gbG9zdC4gQ2xvc2UgdGhlIHNvY2tldCBzbyB0aGF0IHdlIGNhbiByZXRyeSBvbiB0aGUKKyAgICAgICAgbmV4dCBldmVudC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2xvc2VPbkVycm9yIGFuZCBzZWxmLnNvY2s6CisgICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5zb2NrID0gTm9uZSAgICAgICAgI3RyeSB0byByZWNvbm5lY3QgbmV4dCB0aW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2dnaW5nLkhhbmRsZXIuaGFuZGxlRXJyb3Ioc2VsZiwgcmVjb3JkKQorCisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVtaXQgYSByZWNvcmQuCisKKyAgICAgICAgUGlja2xlcyB0aGUgcmVjb3JkIGFuZCB3cml0ZXMgaXQgdG8gdGhlIHNvY2tldCBpbiBiaW5hcnkgZm9ybWF0LgorICAgICAgICBJZiB0aGVyZSBpcyBhbiBlcnJvciB3aXRoIHRoZSBzb2NrZXQsIHNpbGVudGx5IGRyb3AgdGhlIHBhY2tldC4KKyAgICAgICAgSWYgdGhlcmUgd2FzIGEgcHJvYmxlbSB3aXRoIHRoZSBzb2NrZXQsIHJlLWVzdGFibGlzaGVzIHRoZQorICAgICAgICBzb2NrZXQuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gc2VsZi5tYWtlUGlja2xlKHJlY29yZCkKKyAgICAgICAgICAgIHNlbGYuc2VuZChzKQorICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlRXJyb3IocmVjb3JkKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2xvc2VzIHRoZSBzb2NrZXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLnNvY2s6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBOb25lCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQorICAgICAgICBsb2dnaW5nLkhhbmRsZXIuY2xvc2Uoc2VsZikKKworY2xhc3MgRGF0YWdyYW1IYW5kbGVyKFNvY2tldEhhbmRsZXIpOgorICAgICIiIgorICAgIEEgaGFuZGxlciBjbGFzcyB3aGljaCB3cml0ZXMgbG9nZ2luZyByZWNvcmRzLCBpbiBwaWNrbGUgZm9ybWF0LCB0bworICAgIGEgZGF0YWdyYW0gc29ja2V0LiAgVGhlIHBpY2tsZSB3aGljaCBpcyBzZW50IGlzIHRoYXQgb2YgdGhlIExvZ1JlY29yZCdzCisgICAgYXR0cmlidXRlIGRpY3Rpb25hcnkgKF9fZGljdF9fKSwgc28gdGhhdCB0aGUgcmVjZWl2ZXIgZG9lcyBub3QgbmVlZCB0bworICAgIGhhdmUgdGhlIGxvZ2dpbmcgbW9kdWxlIGluc3RhbGxlZCBpbiBvcmRlciB0byBwcm9jZXNzIHRoZSBsb2dnaW5nIGV2ZW50LgorCisgICAgVG8gdW5waWNrbGUgdGhlIHJlY29yZCBhdCB0aGUgcmVjZWl2aW5nIGVuZCBpbnRvIGEgTG9nUmVjb3JkLCB1c2UgdGhlCisgICAgbWFrZUxvZ1JlY29yZCBmdW5jdGlvbi4KKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0KToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemVzIHRoZSBoYW5kbGVyIHdpdGggYSBzcGVjaWZpYyBob3N0IGFkZHJlc3MgYW5kIHBvcnQuCisgICAgICAgICIiIgorICAgICAgICBTb2NrZXRIYW5kbGVyLl9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQpCisgICAgICAgIHNlbGYuY2xvc2VPbkVycm9yID0gMAorCisgICAgZGVmIG1ha2VTb2NrZXQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUaGUgZmFjdG9yeSBtZXRob2Qgb2YgU29ja2V0SGFuZGxlciBpcyBoZXJlIG92ZXJyaWRkZW4gdG8gY3JlYXRlCisgICAgICAgIGEgVURQIHNvY2tldCAoU09DS19ER1JBTSkuCisgICAgICAgICIiIgorICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgc2VuZChzZWxmLCBzKToKKyAgICAgICAgIiIiCisgICAgICAgIFNlbmQgYSBwaWNrbGVkIHN0cmluZyB0byBhIHNvY2tldC4KKworICAgICAgICBUaGlzIGZ1bmN0aW9uIG5vIGxvbmdlciBhbGxvd3MgZm9yIHBhcnRpYWwgc2VuZHMgd2hpY2ggY2FuIGhhcHBlbgorICAgICAgICB3aGVuIHRoZSBuZXR3b3JrIGlzIGJ1c3kgLSBVRFAgZG9lcyBub3QgZ3VhcmFudGVlIGRlbGl2ZXJ5IGFuZAorICAgICAgICBjYW4gZGVsaXZlciBwYWNrZXRzIG91dCBvZiBzZXF1ZW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuc29jayBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jcmVhdGVTb2NrZXQoKQorICAgICAgICBzZWxmLnNvY2suc2VuZHRvKHMsIChzZWxmLmhvc3QsIHNlbGYucG9ydCkpCisKK2NsYXNzIFN5c0xvZ0hhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKKyAgICAiIiIKKyAgICBBIGhhbmRsZXIgY2xhc3Mgd2hpY2ggc2VuZHMgZm9ybWF0dGVkIGxvZ2dpbmcgcmVjb3JkcyB0byBhIHN5c2xvZworICAgIHNlcnZlci4gQmFzZWQgb24gU2FtIFJ1c2hpbmcncyBzeXNsb2cgbW9kdWxlOgorICAgIGh0dHA6Ly93d3cubmlnaHRtYXJlLmNvbS9zcXVpcmwvcHl0aG9uLWV4dC9taXNjL3N5c2xvZy5weQorICAgIENvbnRyaWJ1dGVkIGJ5IE5pY29sYXMgVW50eiAoYWZ0ZXIgd2hpY2ggbWlub3IgcmVmYWN0b3JpbmcgY2hhbmdlcworICAgIGhhdmUgYmVlbiBtYWRlKS4KKyAgICAiIiIKKworICAgICMgZnJvbSA8bGludXgvc3lzL3N5c2xvZy5oPjoKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIHByaW9yaXRpZXMvZmFjaWxpdGllcyBhcmUgZW5jb2RlZCBpbnRvIGEgc2luZ2xlIDMyLWJpdCBxdWFudGl0eSwgd2hlcmUKKyAgICAjIHRoZSBib3R0b20gMyBiaXRzIGFyZSB0aGUgcHJpb3JpdHkgKDAtNykgYW5kIHRoZSB0b3AgMjggYml0cyBhcmUgdGhlCisgICAgIyBmYWNpbGl0eSAoMC1iaWcgbnVtYmVyKS4gQm90aCB0aGUgcHJpb3JpdGllcyBhbmQgdGhlIGZhY2lsaXRpZXMgbWFwCisgICAgIyByb3VnaGx5IG9uZS10by1vbmUgdG8gc3RyaW5ncyBpbiB0aGUgc3lzbG9nZCg4KSBzb3VyY2UgY29kZS4gIFRoaXMKKyAgICAjIG1hcHBpbmcgaXMgaW5jbHVkZWQgaW4gdGhpcyBmaWxlLgorICAgICMKKyAgICAjIHByaW9yaXRpZXMgKHRoZXNlIGFyZSBvcmRlcmVkKQorCisgICAgTE9HX0VNRVJHICAgICA9IDAgICAgICAgIyAgc3lzdGVtIGlzIHVudXNhYmxlCisgICAgTE9HX0FMRVJUICAgICA9IDEgICAgICAgIyAgYWN0aW9uIG11c3QgYmUgdGFrZW4gaW1tZWRpYXRlbHkKKyAgICBMT0dfQ1JJVCAgICAgID0gMiAgICAgICAjICBjcml0aWNhbCBjb25kaXRpb25zCisgICAgTE9HX0VSUiAgICAgICA9IDMgICAgICAgIyAgZXJyb3IgY29uZGl0aW9ucworICAgIExPR19XQVJOSU5HICAgPSA0ICAgICAgICMgIHdhcm5pbmcgY29uZGl0aW9ucworICAgIExPR19OT1RJQ0UgICAgPSA1ICAgICAgICMgIG5vcm1hbCBidXQgc2lnbmlmaWNhbnQgY29uZGl0aW9uCisgICAgTE9HX0lORk8gICAgICA9IDYgICAgICAgIyAgaW5mb3JtYXRpb25hbAorICAgIExPR19ERUJVRyAgICAgPSA3ICAgICAgICMgIGRlYnVnLWxldmVsIG1lc3NhZ2VzCisKKyAgICAjICBmYWNpbGl0eSBjb2RlcworICAgIExPR19LRVJOICAgICAgPSAwICAgICAgICMgIGtlcm5lbCBtZXNzYWdlcworICAgIExPR19VU0VSICAgICAgPSAxICAgICAgICMgIHJhbmRvbSB1c2VyLWxldmVsIG1lc3NhZ2VzCisgICAgTE9HX01BSUwgICAgICA9IDIgICAgICAgIyAgbWFpbCBzeXN0ZW0KKyAgICBMT0dfREFFTU9OICAgID0gMyAgICAgICAjICBzeXN0ZW0gZGFlbW9ucworICAgIExPR19BVVRIICAgICAgPSA0ICAgICAgICMgIHNlY3VyaXR5L2F1dGhvcml6YXRpb24gbWVzc2FnZXMKKyAgICBMT0dfU1lTTE9HICAgID0gNSAgICAgICAjICBtZXNzYWdlcyBnZW5lcmF0ZWQgaW50ZXJuYWxseSBieSBzeXNsb2dkCisgICAgTE9HX0xQUiAgICAgICA9IDYgICAgICAgIyAgbGluZSBwcmludGVyIHN1YnN5c3RlbQorICAgIExPR19ORVdTICAgICAgPSA3ICAgICAgICMgIG5ldHdvcmsgbmV3cyBzdWJzeXN0ZW0KKyAgICBMT0dfVVVDUCAgICAgID0gOCAgICAgICAjICBVVUNQIHN1YnN5c3RlbQorICAgIExPR19DUk9OICAgICAgPSA5ICAgICAgICMgIGNsb2NrIGRhZW1vbgorICAgIExPR19BVVRIUFJJViAgPSAxMCAgICAgICMgIHNlY3VyaXR5L2F1dGhvcml6YXRpb24gbWVzc2FnZXMgKHByaXZhdGUpCisgICAgTE9HX0ZUUCAgICAgICA9IDExICAgICAgIyAgRlRQIGRhZW1vbgorCisgICAgIyAgb3RoZXIgY29kZXMgdGhyb3VnaCAxNSByZXNlcnZlZCBmb3Igc3lzdGVtIHVzZQorICAgIExPR19MT0NBTDAgICAgPSAxNiAgICAgICMgIHJlc2VydmVkIGZvciBsb2NhbCB1c2UKKyAgICBMT0dfTE9DQUwxICAgID0gMTcgICAgICAjICByZXNlcnZlZCBmb3IgbG9jYWwgdXNlCisgICAgTE9HX0xPQ0FMMiAgICA9IDE4ICAgICAgIyAgcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZQorICAgIExPR19MT0NBTDMgICAgPSAxOSAgICAgICMgIHJlc2VydmVkIGZvciBsb2NhbCB1c2UKKyAgICBMT0dfTE9DQUw0ICAgID0gMjAgICAgICAjICByZXNlcnZlZCBmb3IgbG9jYWwgdXNlCisgICAgTE9HX0xPQ0FMNSAgICA9IDIxICAgICAgIyAgcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZQorICAgIExPR19MT0NBTDYgICAgPSAyMiAgICAgICMgIHJlc2VydmVkIGZvciBsb2NhbCB1c2UKKyAgICBMT0dfTE9DQUw3ICAgID0gMjMgICAgICAjICByZXNlcnZlZCBmb3IgbG9jYWwgdXNlCisKKyAgICBwcmlvcml0eV9uYW1lcyA9IHsKKyAgICAgICAgImFsZXJ0IjogICAgTE9HX0FMRVJULAorICAgICAgICAiY3JpdCI6ICAgICBMT0dfQ1JJVCwKKyAgICAgICAgImNyaXRpY2FsIjogTE9HX0NSSVQsCisgICAgICAgICJkZWJ1ZyI6ICAgIExPR19ERUJVRywKKyAgICAgICAgImVtZXJnIjogICAgTE9HX0VNRVJHLAorICAgICAgICAiZXJyIjogICAgICBMT0dfRVJSLAorICAgICAgICAiZXJyb3IiOiAgICBMT0dfRVJSLCAgICAgICAgIyAgREVQUkVDQVRFRAorICAgICAgICAiaW5mbyI6ICAgICBMT0dfSU5GTywKKyAgICAgICAgIm5vdGljZSI6ICAgTE9HX05PVElDRSwKKyAgICAgICAgInBhbmljIjogICAgTE9HX0VNRVJHLCAgICAgICMgIERFUFJFQ0FURUQKKyAgICAgICAgIndhcm4iOiAgICAgTE9HX1dBUk5JTkcsICAgICMgIERFUFJFQ0FURUQKKyAgICAgICAgIndhcm5pbmciOiAgTE9HX1dBUk5JTkcsCisgICAgICAgIH0KKworICAgIGZhY2lsaXR5X25hbWVzID0geworICAgICAgICAiYXV0aCI6ICAgICBMT0dfQVVUSCwKKyAgICAgICAgImF1dGhwcml2IjogTE9HX0FVVEhQUklWLAorICAgICAgICAiY3JvbiI6ICAgICBMT0dfQ1JPTiwKKyAgICAgICAgImRhZW1vbiI6ICAgTE9HX0RBRU1PTiwKKyAgICAgICAgImZ0cCI6ICAgICAgTE9HX0ZUUCwKKyAgICAgICAgImtlcm4iOiAgICAgTE9HX0tFUk4sCisgICAgICAgICJscHIiOiAgICAgIExPR19MUFIsCisgICAgICAgICJtYWlsIjogICAgIExPR19NQUlMLAorICAgICAgICAibmV3cyI6ICAgICBMT0dfTkVXUywKKyAgICAgICAgInNlY3VyaXR5IjogTE9HX0FVVEgsICAgICAgICMgIERFUFJFQ0FURUQKKyAgICAgICAgInN5c2xvZyI6ICAgTE9HX1NZU0xPRywKKyAgICAgICAgInVzZXIiOiAgICAgTE9HX1VTRVIsCisgICAgICAgICJ1dWNwIjogICAgIExPR19VVUNQLAorICAgICAgICAibG9jYWwwIjogICBMT0dfTE9DQUwwLAorICAgICAgICAibG9jYWwxIjogICBMT0dfTE9DQUwxLAorICAgICAgICAibG9jYWwyIjogICBMT0dfTE9DQUwyLAorICAgICAgICAibG9jYWwzIjogICBMT0dfTE9DQUwzLAorICAgICAgICAibG9jYWw0IjogICBMT0dfTE9DQUw0LAorICAgICAgICAibG9jYWw1IjogICBMT0dfTE9DQUw1LAorICAgICAgICAibG9jYWw2IjogICBMT0dfTE9DQUw2LAorICAgICAgICAibG9jYWw3IjogICBMT0dfTE9DQUw3LAorICAgICAgICB9CisKKyAgICAjVGhlIG1hcCBiZWxvdyBhcHBlYXJzIHRvIGJlIHRyaXZpYWxseSBsb3dlcmNhc2luZyB0aGUga2V5LiBIb3dldmVyLAorICAgICN0aGVyZSdzIG1vcmUgdG8gaXQgdGhhbiBtZWV0cyB0aGUgZXllIC0gaW4gc29tZSBsb2NhbGVzLCBsb3dlcmNhc2luZworICAgICNnaXZlcyB1bmV4cGVjdGVkIHJlc3VsdHMuIFNlZSBTRiAjMTUyNDA4MTogaW4gdGhlIFR1cmtpc2ggbG9jYWxlLAorICAgICMiSU5GTyIubG93ZXIoKSAhPSAiaW5mbyIKKyAgICBwcmlvcml0eV9tYXAgPSB7CisgICAgICAgICJERUJVRyIgOiAiZGVidWciLAorICAgICAgICAiSU5GTyIgOiAiaW5mbyIsCisgICAgICAgICJXQVJOSU5HIiA6ICJ3YXJuaW5nIiwKKyAgICAgICAgIkVSUk9SIiA6ICJlcnJvciIsCisgICAgICAgICJDUklUSUNBTCIgOiAiY3JpdGljYWwiCisgICAgfQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3M9KCdsb2NhbGhvc3QnLCBTWVNMT0dfVURQX1BPUlQpLAorICAgICAgICAgICAgICAgICBmYWNpbGl0eT1MT0dfVVNFUiwgc29ja3R5cGU9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIGEgaGFuZGxlci4KKworICAgICAgICBJZiBhZGRyZXNzIGlzIHNwZWNpZmllZCBhcyBhIHN0cmluZywgYSBVTklYIHNvY2tldCBpcyB1c2VkLiBUbyBsb2cgdG8gYQorICAgICAgICBsb2NhbCBzeXNsb2dkLCAiU3lzTG9nSGFuZGxlcihhZGRyZXNzPSIvZGV2L2xvZyIpIiBjYW4gYmUgdXNlZC4KKyAgICAgICAgSWYgZmFjaWxpdHkgaXMgbm90IHNwZWNpZmllZCwgTE9HX1VTRVIgaXMgdXNlZC4gSWYgc29ja3R5cGUgaXMKKyAgICAgICAgc3BlY2lmaWVkIGFzIHNvY2tldC5TT0NLX0RHUkFNIG9yIHNvY2tldC5TT0NLX1NUUkVBTSwgdGhhdCBzcGVjaWZpYworICAgICAgICBzb2NrZXQgdHlwZSB3aWxsIGJlIHVzZWQuIEZvciBVbml4IHNvY2tldHMsIHlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEKKyAgICAgICAgc29ja3R5cGUgb2YgTm9uZSwgaW4gd2hpY2ggY2FzZSBzb2NrZXQuU09DS19ER1JBTSB3aWxsIGJlIHVzZWQsIGZhbGxpbmcKKyAgICAgICAgYmFjayB0byBzb2NrZXQuU09DS19TVFJFQU0uCisgICAgICAgICIiIgorICAgICAgICBsb2dnaW5nLkhhbmRsZXIuX19pbml0X18oc2VsZikKKworICAgICAgICBzZWxmLmFkZHJlc3MgPSBhZGRyZXNzCisgICAgICAgIHNlbGYuZmFjaWxpdHkgPSBmYWNpbGl0eQorICAgICAgICBzZWxmLnNvY2t0eXBlID0gc29ja3R5cGUKKworICAgICAgICBpZiBpc2luc3RhbmNlKGFkZHJlc3MsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgc2VsZi51bml4c29ja2V0ID0gMQorICAgICAgICAgICAgc2VsZi5fY29ubmVjdF91bml4c29ja2V0KGFkZHJlc3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnVuaXhzb2NrZXQgPSAwCisgICAgICAgICAgICBpZiBzb2NrdHlwZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNvY2t0eXBlID0gc29ja2V0LlNPQ0tfREdSQU0KKyAgICAgICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja3R5cGUpCisgICAgICAgICAgICBpZiBzb2NrdHlwZSA9PSBzb2NrZXQuU09DS19TVFJFQU06CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuY29ubmVjdChhZGRyZXNzKQorICAgICAgICAgICAgc2VsZi5zb2NrdHlwZSA9IHNvY2t0eXBlCisgICAgICAgIHNlbGYuZm9ybWF0dGVyID0gTm9uZQorCisgICAgZGVmIF9jb25uZWN0X3VuaXhzb2NrZXQoc2VsZiwgYWRkcmVzcyk6CisgICAgICAgIHVzZV9zb2NrdHlwZSA9IHNlbGYuc29ja3R5cGUKKyAgICAgICAgaWYgdXNlX3NvY2t0eXBlIGlzIE5vbmU6CisgICAgICAgICAgICB1c2Vfc29ja3R5cGUgPSBzb2NrZXQuU09DS19ER1JBTQorICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1VOSVgsIHVzZV9zb2NrdHlwZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zb2NrZXQuY29ubmVjdChhZGRyZXNzKQorICAgICAgICAgICAgIyBpdCB3b3JrZWQsIHNvIHNldCBzZWxmLnNvY2t0eXBlIHRvIHRoZSB1c2VkIHR5cGUKKyAgICAgICAgICAgIHNlbGYuc29ja3R5cGUgPSB1c2Vfc29ja3R5cGUKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHNlbGYuc29ja3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyB1c2VyIGRpZG4ndCBzcGVjaWZ5IGZhbGxpbmcgYmFjaywgc28gZmFpbAorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICB1c2Vfc29ja3R5cGUgPSBzb2NrZXQuU09DS19TVFJFQU0KKyAgICAgICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVU5JWCwgdXNlX3NvY2t0eXBlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0LmNvbm5lY3QoYWRkcmVzcykKKyAgICAgICAgICAgICAgICAjIGl0IHdvcmtlZCwgc28gc2V0IHNlbGYuc29ja3R5cGUgdG8gdGhlIHVzZWQgdHlwZQorICAgICAgICAgICAgICAgIHNlbGYuc29ja3R5cGUgPSB1c2Vfc29ja3R5cGUKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAjIGN1cmlvdXM6IHdoZW4gdGFsa2luZyB0byB0aGUgdW5peC1kb21haW4gJy9kZXYvbG9nJyBzb2NrZXQsIGEKKyAgICAjICAgemVyby10ZXJtaW5hdG9yIHNlZW1zIHRvIGJlIHJlcXVpcmVkLiAgdGhpcyBzdHJpbmcgaXMgcGxhY2VkCisgICAgIyAgIGludG8gYSBjbGFzcyB2YXJpYWJsZSBzbyB0aGF0IGl0IGNhbiBiZSBvdmVycmlkZGVuIGlmCisgICAgIyAgIG5lY2Vzc2FyeS4KKyAgICBsb2dfZm9ybWF0X3N0cmluZyA9ICc8JWQ+JXNcMDAwJworCisgICAgZGVmIGVuY29kZVByaW9yaXR5KHNlbGYsIGZhY2lsaXR5LCBwcmlvcml0eSk6CisgICAgICAgICIiIgorICAgICAgICBFbmNvZGUgdGhlIGZhY2lsaXR5IGFuZCBwcmlvcml0eS4gWW91IGNhbiBwYXNzIGluIHN0cmluZ3Mgb3IKKyAgICAgICAgaW50ZWdlcnMgLSBpZiBzdHJpbmdzIGFyZSBwYXNzZWQsIHRoZSBmYWNpbGl0eV9uYW1lcyBhbmQKKyAgICAgICAgcHJpb3JpdHlfbmFtZXMgbWFwcGluZyBkaWN0aW9uYXJpZXMgYXJlIHVzZWQgdG8gY29udmVydCB0aGVtIHRvCisgICAgICAgIGludGVnZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmYWNpbGl0eSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBmYWNpbGl0eSA9IHNlbGYuZmFjaWxpdHlfbmFtZXNbZmFjaWxpdHldCisgICAgICAgIGlmIGlzaW5zdGFuY2UocHJpb3JpdHksIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgcHJpb3JpdHkgPSBzZWxmLnByaW9yaXR5X25hbWVzW3ByaW9yaXR5XQorICAgICAgICByZXR1cm4gKGZhY2lsaXR5IDw8IDMpIHwgcHJpb3JpdHkKKworICAgIGRlZiBjbG9zZSAoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDbG9zZXMgdGhlIHNvY2tldC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYudW5peHNvY2tldDoKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQorICAgICAgICBsb2dnaW5nLkhhbmRsZXIuY2xvc2Uoc2VsZikKKworICAgIGRlZiBtYXBQcmlvcml0eShzZWxmLCBsZXZlbE5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgTWFwIGEgbG9nZ2luZyBsZXZlbCBuYW1lIHRvIGEga2V5IGluIHRoZSBwcmlvcml0eV9uYW1lcyBtYXAuCisgICAgICAgIFRoaXMgaXMgdXNlZnVsIGluIHR3byBzY2VuYXJpb3M6IHdoZW4gY3VzdG9tIGxldmVscyBhcmUgYmVpbmcKKyAgICAgICAgdXNlZCwgYW5kIGluIHRoZSBjYXNlIHdoZXJlIHlvdSBjYW4ndCBkbyBhIHN0cmFpZ2h0Zm9yd2FyZAorICAgICAgICBtYXBwaW5nIGJ5IGxvd2VyY2FzaW5nIHRoZSBsb2dnaW5nIGxldmVsIG5hbWUgYmVjYXVzZSBvZiBsb2NhbGUtCisgICAgICAgIHNwZWNpZmljIGlzc3VlcyAoc2VlIFNGICMxNTI0MDgxKS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnByaW9yaXR5X21hcC5nZXQobGV2ZWxOYW1lLCAid2FybmluZyIpCisKKyAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRW1pdCBhIHJlY29yZC4KKworICAgICAgICBUaGUgcmVjb3JkIGlzIGZvcm1hdHRlZCwgYW5kIHRoZW4gc2VudCB0byB0aGUgc3lzbG9nIHNlcnZlci4gSWYKKyAgICAgICAgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGlzIHByZXNlbnQsIGl0IGlzIE5PVCBzZW50IHRvIHRoZSBzZXJ2ZXIuCisgICAgICAgICIiIgorICAgICAgICBtc2cgPSBzZWxmLmZvcm1hdChyZWNvcmQpICsgJ1wwMDAnCisgICAgICAgICIiIgorICAgICAgICBXZSBuZWVkIHRvIGNvbnZlcnQgcmVjb3JkIGxldmVsIHRvIGxvd2VyY2FzZSwgbWF5YmUgdGhpcyB3aWxsCisgICAgICAgIGNoYW5nZSBpbiB0aGUgZnV0dXJlLgorICAgICAgICAiIiIKKyAgICAgICAgcHJpbyA9ICc8JWQ+JyAlIHNlbGYuZW5jb2RlUHJpb3JpdHkoc2VsZi5mYWNpbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXBQcmlvcml0eShyZWNvcmQubGV2ZWxuYW1lKSkKKyAgICAgICAgIyBNZXNzYWdlIGlzIGEgc3RyaW5nLiBDb252ZXJ0IHRvIGJ5dGVzIGFzIHJlcXVpcmVkIGJ5IFJGQyA1NDI0CisgICAgICAgIGlmIHR5cGUobXNnKSBpcyB1bmljb2RlOgorICAgICAgICAgICAgbXNnID0gbXNnLmVuY29kZSgndXRmLTgnKQorICAgICAgICBtc2cgPSBwcmlvICsgbXNnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYudW5peHNvY2tldDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0LnNlbmQobXNnKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3RfdW5peHNvY2tldChzZWxmLmFkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0LnNlbmQobXNnKQorICAgICAgICAgICAgZWxpZiBzZWxmLnNvY2t0eXBlID09IHNvY2tldC5TT0NLX0RHUkFNOgorICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0LnNlbmR0byhtc2csIHNlbGYuYWRkcmVzcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuc2VuZGFsbChtc2cpCisgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihyZWNvcmQpCisKK2NsYXNzIFNNVFBIYW5kbGVyKGxvZ2dpbmcuSGFuZGxlcik6CisgICAgIiIiCisgICAgQSBoYW5kbGVyIGNsYXNzIHdoaWNoIHNlbmRzIGFuIFNNVFAgZW1haWwgZm9yIGVhY2ggbG9nZ2luZyBldmVudC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFpbGhvc3QsIGZyb21hZGRyLCB0b2FkZHJzLCBzdWJqZWN0LAorICAgICAgICAgICAgICAgICBjcmVkZW50aWFscz1Ob25lLCBzZWN1cmU9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIHRoZSBoYW5kbGVyLgorCisgICAgICAgIEluaXRpYWxpemUgdGhlIGluc3RhbmNlIHdpdGggdGhlIGZyb20gYW5kIHRvIGFkZHJlc3NlcyBhbmQgc3ViamVjdAorICAgICAgICBsaW5lIG9mIHRoZSBlbWFpbC4gVG8gc3BlY2lmeSBhIG5vbi1zdGFuZGFyZCBTTVRQIHBvcnQsIHVzZSB0aGUKKyAgICAgICAgKGhvc3QsIHBvcnQpIHR1cGxlIGZvcm1hdCBmb3IgdGhlIG1haWxob3N0IGFyZ3VtZW50LiBUbyBzcGVjaWZ5CisgICAgICAgIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzLCBzdXBwbHkgYSAodXNlcm5hbWUsIHBhc3N3b3JkKSB0dXBsZQorICAgICAgICBmb3IgdGhlIGNyZWRlbnRpYWxzIGFyZ3VtZW50LiBUbyBzcGVjaWZ5IHRoZSB1c2Ugb2YgYSBzZWN1cmUKKyAgICAgICAgcHJvdG9jb2wgKFRMUyksIHBhc3MgaW4gYSB0dXBsZSBmb3IgdGhlIHNlY3VyZSBhcmd1bWVudC4gVGhpcyB3aWxsCisgICAgICAgIG9ubHkgYmUgdXNlZCB3aGVuIGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIGFyZSBzdXBwbGllZC4gVGhlIHR1cGxlCisgICAgICAgIHdpbGwgYmUgZWl0aGVyIGFuIGVtcHR5IHR1cGxlLCBvciBhIHNpbmdsZS12YWx1ZSB0dXBsZSB3aXRoIHRoZSBuYW1lCisgICAgICAgIG9mIGEga2V5ZmlsZSwgb3IgYSAyLXZhbHVlIHR1cGxlIHdpdGggdGhlIG5hbWVzIG9mIHRoZSBrZXlmaWxlIGFuZAorICAgICAgICBjZXJ0aWZpY2F0ZSBmaWxlLiAoVGhpcyB0dXBsZSBpcyBwYXNzZWQgdG8gdGhlIGBzdGFydHRsc2AgbWV0aG9kKS4KKyAgICAgICAgIiIiCisgICAgICAgIGxvZ2dpbmcuSGFuZGxlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBpZiBpc2luc3RhbmNlKG1haWxob3N0LCB0dXBsZSk6CisgICAgICAgICAgICBzZWxmLm1haWxob3N0LCBzZWxmLm1haWxwb3J0ID0gbWFpbGhvc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubWFpbGhvc3QsIHNlbGYubWFpbHBvcnQgPSBtYWlsaG9zdCwgTm9uZQorICAgICAgICBpZiBpc2luc3RhbmNlKGNyZWRlbnRpYWxzLCB0dXBsZSk6CisgICAgICAgICAgICBzZWxmLnVzZXJuYW1lLCBzZWxmLnBhc3N3b3JkID0gY3JlZGVudGlhbHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudXNlcm5hbWUgPSBOb25lCisgICAgICAgIHNlbGYuZnJvbWFkZHIgPSBmcm9tYWRkcgorICAgICAgICBpZiBpc2luc3RhbmNlKHRvYWRkcnMsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgdG9hZGRycyA9IFt0b2FkZHJzXQorICAgICAgICBzZWxmLnRvYWRkcnMgPSB0b2FkZHJzCisgICAgICAgIHNlbGYuc3ViamVjdCA9IHN1YmplY3QKKyAgICAgICAgc2VsZi5zZWN1cmUgPSBzZWN1cmUKKyAgICAgICAgc2VsZi5fdGltZW91dCA9IDUuMAorCisgICAgZGVmIGdldFN1YmplY3Qoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIERldGVybWluZSB0aGUgc3ViamVjdCBmb3IgdGhlIGVtYWlsLgorCisgICAgICAgIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBzdWJqZWN0IGxpbmUgd2hpY2ggaXMgcmVjb3JkLWRlcGVuZGVudCwKKyAgICAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zdWJqZWN0CisKKyAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRW1pdCBhIHJlY29yZC4KKworICAgICAgICBGb3JtYXQgdGhlIHJlY29yZCBhbmQgc2VuZCBpdCB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3NlZXMuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgc210cGxpYgorICAgICAgICAgICAgZnJvbSBlbWFpbC51dGlscyBpbXBvcnQgZm9ybWF0ZGF0ZQorICAgICAgICAgICAgcG9ydCA9IHNlbGYubWFpbHBvcnQKKyAgICAgICAgICAgIGlmIG5vdCBwb3J0OgorICAgICAgICAgICAgICAgIHBvcnQgPSBzbXRwbGliLlNNVFBfUE9SVAorICAgICAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChzZWxmLm1haWxob3N0LCBwb3J0LCB0aW1lb3V0PXNlbGYuX3RpbWVvdXQpCisgICAgICAgICAgICBtc2cgPSBzZWxmLmZvcm1hdChyZWNvcmQpCisgICAgICAgICAgICBtc2cgPSAiRnJvbTogJXNcclxuVG86ICVzXHJcblN1YmplY3Q6ICVzXHJcbkRhdGU6ICVzXHJcblxyXG4lcyIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mcm9tYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCIuam9pbihzZWxmLnRvYWRkcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0U3ViamVjdChyZWNvcmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdGRhdGUoKSwgbXNnKQorICAgICAgICAgICAgaWYgc2VsZi51c2VybmFtZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNlY3VyZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc210cC5laGxvKCkKKyAgICAgICAgICAgICAgICAgICAgc210cC5zdGFydHRscygqc2VsZi5zZWN1cmUpCisgICAgICAgICAgICAgICAgICAgIHNtdHAuZWhsbygpCisgICAgICAgICAgICAgICAgc210cC5sb2dpbihzZWxmLnVzZXJuYW1lLCBzZWxmLnBhc3N3b3JkKQorICAgICAgICAgICAgc210cC5zZW5kbWFpbChzZWxmLmZyb21hZGRyLCBzZWxmLnRvYWRkcnMsIG1zZykKKyAgICAgICAgICAgIHNtdHAucXVpdCgpCisgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihyZWNvcmQpCisKK2NsYXNzIE5URXZlbnRMb2dIYW5kbGVyKGxvZ2dpbmcuSGFuZGxlcik6CisgICAgIiIiCisgICAgQSBoYW5kbGVyIGNsYXNzIHdoaWNoIHNlbmRzIGV2ZW50cyB0byB0aGUgTlQgRXZlbnQgTG9nLiBBZGRzIGEKKyAgICByZWdpc3RyeSBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBhcHBsaWNhdGlvbiBuYW1lLiBJZiBubyBkbGxuYW1lIGlzCisgICAgcHJvdmlkZWQsIHdpbjMyc2VydmljZS5weWQgKHdoaWNoIGNvbnRhaW5zIHNvbWUgYmFzaWMgbWVzc2FnZQorICAgIHBsYWNlaG9sZGVycykgaXMgdXNlZC4gTm90ZSB0aGF0IHVzZSBvZiB0aGVzZSBwbGFjZWhvbGRlcnMgd2lsbCBtYWtlCisgICAgeW91ciBldmVudCBsb2dzIGJpZywgYXMgdGhlIGVudGlyZSBtZXNzYWdlIHNvdXJjZSBpcyBoZWxkIGluIHRoZSBsb2cuCisgICAgSWYgeW91IHdhbnQgc2xpbW1lciBsb2dzLCB5b3UgaGF2ZSB0byBwYXNzIGluIHRoZSBuYW1lIG9mIHlvdXIgb3duIERMTAorICAgIHdoaWNoIGNvbnRhaW5zIHRoZSBtZXNzYWdlIGRlZmluaXRpb25zIHlvdSB3YW50IHRvIHVzZSBpbiB0aGUgZXZlbnQgbG9nLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcHBuYW1lLCBkbGxuYW1lPU5vbmUsIGxvZ3R5cGU9IkFwcGxpY2F0aW9uIik6CisgICAgICAgIGxvZ2dpbmcuSGFuZGxlci5fX2luaXRfXyhzZWxmKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgd2luMzJldnRsb2d1dGlsLCB3aW4zMmV2dGxvZworICAgICAgICAgICAgc2VsZi5hcHBuYW1lID0gYXBwbmFtZQorICAgICAgICAgICAgc2VsZi5fd2VsdSA9IHdpbjMyZXZ0bG9ndXRpbAorICAgICAgICAgICAgaWYgbm90IGRsbG5hbWU6CisgICAgICAgICAgICAgICAgZGxsbmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5fd2VsdS5fX2ZpbGVfXykKKyAgICAgICAgICAgICAgICBkbGxuYW1lID0gb3MucGF0aC5zcGxpdChkbGxuYW1lWzBdKQorICAgICAgICAgICAgICAgIGRsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGxsbmFtZVswXSwgcid3aW4zMnNlcnZpY2UucHlkJykKKyAgICAgICAgICAgIHNlbGYuZGxsbmFtZSA9IGRsbG5hbWUKKyAgICAgICAgICAgIHNlbGYubG9ndHlwZSA9IGxvZ3R5cGUKKyAgICAgICAgICAgIHNlbGYuX3dlbHUuQWRkU291cmNlVG9SZWdpc3RyeShhcHBuYW1lLCBkbGxuYW1lLCBsb2d0eXBlKQorICAgICAgICAgICAgc2VsZi5kZWZ0eXBlID0gd2luMzJldnRsb2cuRVZFTlRMT0dfRVJST1JfVFlQRQorICAgICAgICAgICAgc2VsZi50eXBlbWFwID0geworICAgICAgICAgICAgICAgIGxvZ2dpbmcuREVCVUcgICA6IHdpbjMyZXZ0bG9nLkVWRU5UTE9HX0lORk9STUFUSU9OX1RZUEUsCisgICAgICAgICAgICAgICAgbG9nZ2luZy5JTkZPICAgIDogd2luMzJldnRsb2cuRVZFTlRMT0dfSU5GT1JNQVRJT05fVFlQRSwKKyAgICAgICAgICAgICAgICBsb2dnaW5nLldBUk5JTkcgOiB3aW4zMmV2dGxvZy5FVkVOVExPR19XQVJOSU5HX1RZUEUsCisgICAgICAgICAgICAgICAgbG9nZ2luZy5FUlJPUiAgIDogd2luMzJldnRsb2cuRVZFTlRMT0dfRVJST1JfVFlQRSwKKyAgICAgICAgICAgICAgICBsb2dnaW5nLkNSSVRJQ0FMOiB3aW4zMmV2dGxvZy5FVkVOVExPR19FUlJPUl9UWVBFLAorICAgICAgICAgfQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwcmludCgiVGhlIFB5dGhvbiBXaW4zMiBleHRlbnNpb25zIGZvciBOVCAoc2VydmljZSwgZXZlbnQgIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICJsb2dnaW5nKSBhcHBlYXIgbm90IHRvIGJlIGF2YWlsYWJsZS4iKQorICAgICAgICAgICAgc2VsZi5fd2VsdSA9IE5vbmUKKworICAgIGRlZiBnZXRNZXNzYWdlSUQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgbWVzc2FnZSBJRCBmb3IgdGhlIGV2ZW50IHJlY29yZC4gSWYgeW91IGFyZSB1c2luZyB5b3VyCisgICAgICAgIG93biBtZXNzYWdlcywgeW91IGNvdWxkIGRvIHRoaXMgYnkgaGF2aW5nIHRoZSBtc2cgcGFzc2VkIHRvIHRoZQorICAgICAgICBsb2dnZXIgYmVpbmcgYW4gSUQgcmF0aGVyIHRoYW4gYSBmb3JtYXR0aW5nIHN0cmluZy4gVGhlbiwgaW4gaGVyZSwKKyAgICAgICAgeW91IGNvdWxkIHVzZSBhIGRpY3Rpb25hcnkgbG9va3VwIHRvIGdldCB0aGUgbWVzc2FnZSBJRC4gVGhpcworICAgICAgICB2ZXJzaW9uIHJldHVybnMgMSwgd2hpY2ggaXMgdGhlIGJhc2UgbWVzc2FnZSBJRCBpbiB3aW4zMnNlcnZpY2UucHlkLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBnZXRFdmVudENhdGVnb3J5KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGV2ZW50IGNhdGVnb3J5IGZvciB0aGUgcmVjb3JkLgorCisgICAgICAgIE92ZXJyaWRlIHRoaXMgaWYgeW91IHdhbnQgdG8gc3BlY2lmeSB5b3VyIG93biBjYXRlZ29yaWVzLiBUaGlzIHZlcnNpb24KKyAgICAgICAgcmV0dXJucyAwLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBnZXRFdmVudFR5cGUoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgZXZlbnQgdHlwZSBmb3IgdGhlIHJlY29yZC4KKworICAgICAgICBPdmVycmlkZSB0aGlzIGlmIHlvdSB3YW50IHRvIHNwZWNpZnkgeW91ciBvd24gdHlwZXMuIFRoaXMgdmVyc2lvbiBkb2VzCisgICAgICAgIGEgbWFwcGluZyB1c2luZyB0aGUgaGFuZGxlcidzIHR5cGVtYXAgYXR0cmlidXRlLCB3aGljaCBpcyBzZXQgdXAgaW4KKyAgICAgICAgX19pbml0X18oKSB0byBhIGRpY3Rpb25hcnkgd2hpY2ggY29udGFpbnMgbWFwcGluZ3MgZm9yIERFQlVHLCBJTkZPLAorICAgICAgICBXQVJOSU5HLCBFUlJPUiBhbmQgQ1JJVElDQUwuIElmIHlvdSBhcmUgdXNpbmcgeW91ciBvd24gbGV2ZWxzIHlvdSB3aWxsCisgICAgICAgIGVpdGhlciBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9yIHBsYWNlIGEgc3VpdGFibGUgZGljdGlvbmFyeSBpbgorICAgICAgICB0aGUgaGFuZGxlcidzIHR5cGVtYXAgYXR0cmlidXRlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZW1hcC5nZXQocmVjb3JkLmxldmVsbm8sIHNlbGYuZGVmdHlwZSkKKworICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBFbWl0IGEgcmVjb3JkLgorCisgICAgICAgIERldGVybWluZSB0aGUgbWVzc2FnZSBJRCwgZXZlbnQgY2F0ZWdvcnkgYW5kIGV2ZW50IHR5cGUuIFRoZW4KKyAgICAgICAgbG9nIHRoZSBtZXNzYWdlIGluIHRoZSBOVCBldmVudCBsb2cuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl93ZWx1OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlkID0gc2VsZi5nZXRNZXNzYWdlSUQocmVjb3JkKQorICAgICAgICAgICAgICAgIGNhdCA9IHNlbGYuZ2V0RXZlbnRDYXRlZ29yeShyZWNvcmQpCisgICAgICAgICAgICAgICAgdHlwZSA9IHNlbGYuZ2V0RXZlbnRUeXBlKHJlY29yZCkKKyAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLmZvcm1hdChyZWNvcmQpCisgICAgICAgICAgICAgICAgc2VsZi5fd2VsdS5SZXBvcnRFdmVudChzZWxmLmFwcG5hbWUsIGlkLCBjYXQsIHR5cGUsIFttc2ddKQorICAgICAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlY29yZCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIENsZWFuIHVwIHRoaXMgaGFuZGxlci4KKworICAgICAgICBZb3UgY2FuIHJlbW92ZSB0aGUgYXBwbGljYXRpb24gbmFtZSBmcm9tIHRoZSByZWdpc3RyeSBhcyBhCisgICAgICAgIHNvdXJjZSBvZiBldmVudCBsb2cgZW50cmllcy4gSG93ZXZlciwgaWYgeW91IGRvIHRoaXMsIHlvdSB3aWxsCisgICAgICAgIG5vdCBiZSBhYmxlIHRvIHNlZSB0aGUgZXZlbnRzIGFzIHlvdSBpbnRlbmRlZCBpbiB0aGUgRXZlbnQgTG9nCisgICAgICAgIFZpZXdlciAtIGl0IG5lZWRzIHRvIGJlIGFibGUgdG8gYWNjZXNzIHRoZSByZWdpc3RyeSB0byBnZXQgdGhlCisgICAgICAgIERMTCBuYW1lLgorICAgICAgICAiIiIKKyAgICAgICAgI3NlbGYuX3dlbHUuUmVtb3ZlU291cmNlRnJvbVJlZ2lzdHJ5KHNlbGYuYXBwbmFtZSwgc2VsZi5sb2d0eXBlKQorICAgICAgICBsb2dnaW5nLkhhbmRsZXIuY2xvc2Uoc2VsZikKKworY2xhc3MgSFRUUEhhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKKyAgICAiIiIKKyAgICBBIGNsYXNzIHdoaWNoIHNlbmRzIHJlY29yZHMgdG8gYSBXZWIgc2VydmVyLCB1c2luZyBlaXRoZXIgR0VUIG9yCisgICAgUE9TVCBzZW1hbnRpY3MuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHVybCwgbWV0aG9kPSJHRVQiKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemUgdGhlIGluc3RhbmNlIHdpdGggdGhlIGhvc3QsIHRoZSByZXF1ZXN0IFVSTCwgYW5kIHRoZSBtZXRob2QKKyAgICAgICAgKCJHRVQiIG9yICJQT1NUIikKKyAgICAgICAgIiIiCisgICAgICAgIGxvZ2dpbmcuSGFuZGxlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBtZXRob2QgPSBtZXRob2QudXBwZXIoKQorICAgICAgICBpZiBtZXRob2Qgbm90IGluIFsiR0VUIiwgIlBPU1QiXToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1ldGhvZCBtdXN0IGJlIEdFVCBvciBQT1NUIikKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnVybCA9IHVybAorICAgICAgICBzZWxmLm1ldGhvZCA9IG1ldGhvZAorCisgICAgZGVmIG1hcExvZ1JlY29yZChzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBtYXBwaW5nIHRoZSBsb2cgcmVjb3JkIGludG8gYSBkaWN0CisgICAgICAgIHRoYXQgaXMgc2VudCBhcyB0aGUgQ0dJIGRhdGEuIE92ZXJ3cml0ZSBpbiB5b3VyIGNsYXNzLgorICAgICAgICBDb250cmlidXRlZCBieSBGcmFueiAgR2xhc25lci4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiByZWNvcmQuX19kaWN0X18KKworICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBFbWl0IGEgcmVjb3JkLgorCisgICAgICAgIFNlbmQgdGhlIHJlY29yZCB0byB0aGUgV2ViIHNlcnZlciBhcyBhIHBlcmNlbnQtZW5jb2RlZCBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgaHR0cGxpYiwgdXJsbGliCisgICAgICAgICAgICBob3N0ID0gc2VsZi5ob3N0CisgICAgICAgICAgICBoID0gaHR0cGxpYi5IVFRQKGhvc3QpCisgICAgICAgICAgICB1cmwgPSBzZWxmLnVybAorICAgICAgICAgICAgZGF0YSA9IHVybGxpYi51cmxlbmNvZGUoc2VsZi5tYXBMb2dSZWNvcmQocmVjb3JkKSkKKyAgICAgICAgICAgIGlmIHNlbGYubWV0aG9kID09ICJHRVQiOgorICAgICAgICAgICAgICAgIGlmICh1cmwuZmluZCgnPycpID49IDApOgorICAgICAgICAgICAgICAgICAgICBzZXAgPSAnJicKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZXAgPSAnPycKKyAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAiJWMlcyIgJSAoc2VwLCBkYXRhKQorICAgICAgICAgICAgaC5wdXRyZXF1ZXN0KHNlbGYubWV0aG9kLCB1cmwpCisgICAgICAgICAgICAjIHN1cHBvcnQgbXVsdGlwbGUgaG9zdHMgb24gb25lIElQIGFkZHJlc3MuLi4KKyAgICAgICAgICAgICMgbmVlZCB0byBzdHJpcCBvcHRpb25hbCA6cG9ydCBmcm9tIGhvc3QsIGlmIHByZXNlbnQKKyAgICAgICAgICAgIGkgPSBob3N0LmZpbmQoIjoiKQorICAgICAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgICAgIGhvc3QgPSBob3N0WzppXQorICAgICAgICAgICAgaC5wdXRoZWFkZXIoIkhvc3QiLCBob3N0KQorICAgICAgICAgICAgaWYgc2VsZi5tZXRob2QgPT0gIlBPU1QiOgorICAgICAgICAgICAgICAgIGgucHV0aGVhZGVyKCJDb250ZW50LXR5cGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICAgICAgICAgICAgICAgIGgucHV0aGVhZGVyKCJDb250ZW50LWxlbmd0aCIsIHN0cihsZW4oZGF0YSkpKQorICAgICAgICAgICAgaC5lbmRoZWFkZXJzKGRhdGEgaWYgc2VsZi5tZXRob2QgPT0gIlBPU1QiIGVsc2UgTm9uZSkKKyAgICAgICAgICAgIGguZ2V0cmVwbHkoKSAgICAjY2FuJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgcmVzdWx0CisgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihyZWNvcmQpCisKK2NsYXNzIEJ1ZmZlcmluZ0hhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKKyAgICAiIiIKKyAgQSBoYW5kbGVyIGNsYXNzIHdoaWNoIGJ1ZmZlcnMgbG9nZ2luZyByZWNvcmRzIGluIG1lbW9yeS4gV2hlbmV2ZXIgZWFjaAorICByZWNvcmQgaXMgYWRkZWQgdG8gdGhlIGJ1ZmZlciwgYSBjaGVjayBpcyBtYWRlIHRvIHNlZSBpZiB0aGUgYnVmZmVyIHNob3VsZAorICBiZSBmbHVzaGVkLiBJZiBpdCBzaG91bGQsIHRoZW4gZmx1c2goKSBpcyBleHBlY3RlZCB0byBkbyB3aGF0J3MgbmVlZGVkLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYXBhY2l0eSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIHRoZSBoYW5kbGVyIHdpdGggdGhlIGJ1ZmZlciBzaXplLgorICAgICAgICAiIiIKKyAgICAgICAgbG9nZ2luZy5IYW5kbGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuY2FwYWNpdHkgPSBjYXBhY2l0eQorICAgICAgICBzZWxmLmJ1ZmZlciA9IFtdCisKKyAgICBkZWYgc2hvdWxkRmx1c2goc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIFNob3VsZCB0aGUgaGFuZGxlciBmbHVzaCBpdHMgYnVmZmVyPworCisgICAgICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVyIGlzIHVwIHRvIGNhcGFjaXR5LiBUaGlzIG1ldGhvZCBjYW4gYmUKKyAgICAgICAgb3ZlcnJpZGRlbiB0byBpbXBsZW1lbnQgY3VzdG9tIGZsdXNoaW5nIHN0cmF0ZWdpZXMuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gKGxlbihzZWxmLmJ1ZmZlcikgPj0gc2VsZi5jYXBhY2l0eSkKKworICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBFbWl0IGEgcmVjb3JkLgorCisgICAgICAgIEFwcGVuZCB0aGUgcmVjb3JkLiBJZiBzaG91bGRGbHVzaCgpIHRlbGxzIHVzIHRvLCBjYWxsIGZsdXNoKCkgdG8gcHJvY2VzcworICAgICAgICB0aGUgYnVmZmVyLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5idWZmZXIuYXBwZW5kKHJlY29yZCkKKyAgICAgICAgaWYgc2VsZi5zaG91bGRGbHVzaChyZWNvcmQpOgorICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBPdmVycmlkZSB0byBpbXBsZW1lbnQgY3VzdG9tIGZsdXNoaW5nIGJlaGF2aW91ci4KKworICAgICAgICBUaGlzIHZlcnNpb24ganVzdCB6YXBzIHRoZSBidWZmZXIgdG8gZW1wdHkuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IFtdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2xvc2UgdGhlIGhhbmRsZXIuCisKKyAgICAgICAgVGhpcyB2ZXJzaW9uIGp1c3QgZmx1c2hlcyBhbmQgY2hhaW5zIHRvIHRoZSBwYXJlbnQgY2xhc3MnIGNsb3NlKCkuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgbG9nZ2luZy5IYW5kbGVyLmNsb3NlKHNlbGYpCisKK2NsYXNzIE1lbW9yeUhhbmRsZXIoQnVmZmVyaW5nSGFuZGxlcik6CisgICAgIiIiCisgICAgQSBoYW5kbGVyIGNsYXNzIHdoaWNoIGJ1ZmZlcnMgbG9nZ2luZyByZWNvcmRzIGluIG1lbW9yeSwgcGVyaW9kaWNhbGx5CisgICAgZmx1c2hpbmcgdGhlbSB0byBhIHRhcmdldCBoYW5kbGVyLiBGbHVzaGluZyBvY2N1cnMgd2hlbmV2ZXIgdGhlIGJ1ZmZlcgorICAgIGlzIGZ1bGwsIG9yIHdoZW4gYW4gZXZlbnQgb2YgYSBjZXJ0YWluIHNldmVyaXR5IG9yIGdyZWF0ZXIgaXMgc2Vlbi4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FwYWNpdHksIGZsdXNoTGV2ZWw9bG9nZ2luZy5FUlJPUiwgdGFyZ2V0PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZSB0aGUgaGFuZGxlciB3aXRoIHRoZSBidWZmZXIgc2l6ZSwgdGhlIGxldmVsIGF0IHdoaWNoCisgICAgICAgIGZsdXNoaW5nIHNob3VsZCBvY2N1ciBhbmQgYW4gb3B0aW9uYWwgdGFyZ2V0LgorCisgICAgICAgIE5vdGUgdGhhdCB3aXRob3V0IGEgdGFyZ2V0IGJlaW5nIHNldCBlaXRoZXIgaGVyZSBvciB2aWEgc2V0VGFyZ2V0KCksCisgICAgICAgIGEgTWVtb3J5SGFuZGxlciBpcyBubyB1c2UgdG8gYW55b25lIQorICAgICAgICAiIiIKKyAgICAgICAgQnVmZmVyaW5nSGFuZGxlci5fX2luaXRfXyhzZWxmLCBjYXBhY2l0eSkKKyAgICAgICAgc2VsZi5mbHVzaExldmVsID0gZmx1c2hMZXZlbAorICAgICAgICBzZWxmLnRhcmdldCA9IHRhcmdldAorCisgICAgZGVmIHNob3VsZEZsdXNoKHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayBmb3IgYnVmZmVyIGZ1bGwgb3IgYSByZWNvcmQgYXQgdGhlIGZsdXNoTGV2ZWwgb3IgaGlnaGVyLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIChsZW4oc2VsZi5idWZmZXIpID49IHNlbGYuY2FwYWNpdHkpIG9yIFwKKyAgICAgICAgICAgICAgICAocmVjb3JkLmxldmVsbm8gPj0gc2VsZi5mbHVzaExldmVsKQorCisgICAgZGVmIHNldFRhcmdldChzZWxmLCB0YXJnZXQpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0IHRoZSB0YXJnZXQgaGFuZGxlciBmb3IgdGhpcyBoYW5kbGVyLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi50YXJnZXQgPSB0YXJnZXQKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEZvciBhIE1lbW9yeUhhbmRsZXIsIGZsdXNoaW5nIG1lYW5zIGp1c3Qgc2VuZGluZyB0aGUgYnVmZmVyZWQKKyAgICAgICAgcmVjb3JkcyB0byB0aGUgdGFyZ2V0LCBpZiB0aGVyZSBpcyBvbmUuIE92ZXJyaWRlIGlmIHlvdSB3YW50CisgICAgICAgIGRpZmZlcmVudCBiZWhhdmlvdXIuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLnRhcmdldDoKKyAgICAgICAgICAgICAgICBmb3IgcmVjb3JkIGluIHNlbGYuYnVmZmVyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRhcmdldC5oYW5kbGUocmVjb3JkKQorICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gW10KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBGbHVzaCwgc2V0IHRoZSB0YXJnZXQgdG8gTm9uZSBhbmQgbG9zZSB0aGUgYnVmZmVyLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHNlbGYuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGFyZ2V0ID0gTm9uZQorICAgICAgICAgICAgQnVmZmVyaW5nSGFuZGxlci5jbG9zZShzZWxmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZWxlYXNlKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbG9nZ2luZy9oYW5kbGVycy5weWMgYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvaGFuZGxlcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjFhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvaGFuZGxlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbG9nZ2luZy9oYW5kbGVycy5weW8gYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvaGFuZGxlcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjFhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvaGFuZGxlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFjcGF0aC5weSBiL2xpYi9weXRob24yLjcvbWFjcGF0aC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDRjYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tYWNwYXRoLnB5CkBAIC0wLDAgKzEsMjE1IEBACisiIiJQYXRobmFtZSBhbmQgcGF0aC1yZWxhdGVkIG9wZXJhdGlvbnMgZm9yIHRoZSBNYWNpbnRvc2guIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHdhcm5pbmdzCitmcm9tIHN0YXQgaW1wb3J0ICoKK2ltcG9ydCBnZW5lcmljcGF0aAorZnJvbSBnZW5lcmljcGF0aCBpbXBvcnQgKgorCitfX2FsbF9fID0gWyJub3JtY2FzZSIsImlzYWJzIiwiam9pbiIsInNwbGl0ZHJpdmUiLCJzcGxpdCIsInNwbGl0ZXh0IiwKKyAgICAgICAgICAgImJhc2VuYW1lIiwiZGlybmFtZSIsImNvbW1vbnByZWZpeCIsImdldHNpemUiLCJnZXRtdGltZSIsCisgICAgICAgICAgICJnZXRhdGltZSIsImdldGN0aW1lIiwgImlzbGluayIsImV4aXN0cyIsImxleGlzdHMiLCJpc2RpciIsImlzZmlsZSIsCisgICAgICAgICAgICJ3YWxrIiwiZXhwYW5kdXNlciIsImV4cGFuZHZhcnMiLCJub3JtcGF0aCIsImFic3BhdGgiLAorICAgICAgICAgICAiY3VyZGlyIiwicGFyZGlyIiwic2VwIiwicGF0aHNlcCIsImRlZnBhdGgiLCJhbHRzZXAiLCJleHRzZXAiLAorICAgICAgICAgICAiZGV2bnVsbCIsInJlYWxwYXRoIiwic3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMiXQorCisjIHN0cmluZ3MgcmVwcmVzZW50aW5nIHZhcmlvdXMgcGF0aC1yZWxhdGVkIGJpdHMgYW5kIHBpZWNlcworY3VyZGlyID0gJzonCitwYXJkaXIgPSAnOjonCitleHRzZXAgPSAnLicKK3NlcCA9ICc6JworcGF0aHNlcCA9ICdcbicKK2RlZnBhdGggPSAnOicKK2FsdHNlcCA9IE5vbmUKK2Rldm51bGwgPSAnRGV2Ok51bGwnCisKKyMgTm9ybWFsaXplIHRoZSBjYXNlIG9mIGEgcGF0aG5hbWUuICBEdW1teSBpbiBQb3NpeCwgYnV0IDxzPi5sb3dlcigpIGhlcmUuCisKK2RlZiBub3JtY2FzZShwYXRoKToKKyAgICByZXR1cm4gcGF0aC5sb3dlcigpCisKKworZGVmIGlzYWJzKHMpOgorICAgICIiIlJldHVybiB0cnVlIGlmIGEgcGF0aCBpcyBhYnNvbHV0ZS4KKyAgICBPbiB0aGUgTWFjLCByZWxhdGl2ZSBwYXRocyBiZWdpbiB3aXRoIGEgY29sb24sCisgICAgYnV0IGFzIGEgc3BlY2lhbCBjYXNlLCBwYXRocyB3aXRoIG5vIGNvbG9ucyBhdCBhbGwgYXJlIGFsc28gcmVsYXRpdmUuCisgICAgQW55dGhpbmcgZWxzZSBpcyBhYnNvbHV0ZSAodGhlIHN0cmluZyB1cCB0byB0aGUgZmlyc3QgY29sb24gaXMgdGhlCisgICAgdm9sdW1lIG5hbWUpLiIiIgorCisgICAgcmV0dXJuICc6JyBpbiBzIGFuZCBzWzBdICE9ICc6JworCisKK2RlZiBqb2luKHMsICpwKToKKyAgICBwYXRoID0gcworICAgIGZvciB0IGluIHA6CisgICAgICAgIGlmIChub3Qgcykgb3IgaXNhYnModCk6CisgICAgICAgICAgICBwYXRoID0gdAorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgdFs6MV0gPT0gJzonOgorICAgICAgICAgICAgdCA9IHRbMTpdCisgICAgICAgIGlmICc6JyBub3QgaW4gcGF0aDoKKyAgICAgICAgICAgIHBhdGggPSAnOicgKyBwYXRoCisgICAgICAgIGlmIHBhdGhbLTE6XSAhPSAnOic6CisgICAgICAgICAgICBwYXRoID0gcGF0aCArICc6JworICAgICAgICBwYXRoID0gcGF0aCArIHQKKyAgICByZXR1cm4gcGF0aAorCisKK2RlZiBzcGxpdChzKToKKyAgICAiIiJTcGxpdCBhIHBhdGhuYW1lIGludG8gdHdvIHBhcnRzOiB0aGUgZGlyZWN0b3J5IGxlYWRpbmcgdXAgdG8gdGhlIGZpbmFsCisgICAgYml0LCBhbmQgdGhlIGJhc2VuYW1lICh0aGUgZmlsZW5hbWUsIHdpdGhvdXQgY29sb25zLCBpbiB0aGF0IGRpcmVjdG9yeSkuCisgICAgVGhlIHJlc3VsdCAocywgdCkgaXMgc3VjaCB0aGF0IGpvaW4ocywgdCkgeWllbGRzIHRoZSBvcmlnaW5hbCBhcmd1bWVudC4iIiIKKworICAgIGlmICc6JyBub3QgaW4gczogcmV0dXJuICcnLCBzCisgICAgY29sb24gPSAwCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHMpKToKKyAgICAgICAgaWYgc1tpXSA9PSAnOic6IGNvbG9uID0gaSArIDEKKyAgICBwYXRoLCBmaWxlID0gc1s6Y29sb24tMV0sIHNbY29sb246XQorICAgIGlmIHBhdGggYW5kIG5vdCAnOicgaW4gcGF0aDoKKyAgICAgICAgcGF0aCA9IHBhdGggKyAnOicKKyAgICByZXR1cm4gcGF0aCwgZmlsZQorCisKK2RlZiBzcGxpdGV4dChwKToKKyAgICByZXR1cm4gZ2VuZXJpY3BhdGguX3NwbGl0ZXh0KHAsIHNlcCwgYWx0c2VwLCBleHRzZXApCitzcGxpdGV4dC5fX2RvY19fID0gZ2VuZXJpY3BhdGguX3NwbGl0ZXh0Ll9fZG9jX18KKworZGVmIHNwbGl0ZHJpdmUocCk6CisgICAgIiIiU3BsaXQgYSBwYXRobmFtZSBpbnRvIGEgZHJpdmUgc3BlY2lmaWNhdGlvbiBhbmQgdGhlIHJlc3Qgb2YgdGhlCisgICAgcGF0aC4gIFVzZWZ1bCBvbiBET1MvV2luZG93cy9OVDsgb24gdGhlIE1hYywgdGhlIGRyaXZlIGlzIGFsd2F5cworICAgIGVtcHR5IChkb24ndCB1c2UgdGhlIHZvbHVtZSBuYW1lIC0tIGl0IGRvZXNuJ3QgaGF2ZSB0aGUgc2FtZQorICAgIHN5bnRhY3RpYyBhbmQgc2VtYW50aWMgb2RkaXRpZXMgYXMgRE9TIGRyaXZlIGxldHRlcnMsIHN1Y2ggYXMgdGhlcmUKKyAgICBiZWluZyBhIHNlcGFyYXRlIGN1cnJlbnQgZGlyZWN0b3J5IHBlciBkcml2ZSkuIiIiCisKKyAgICByZXR1cm4gJycsIHAKKworCisjIFNob3J0IGludGVyZmFjZXMgdG8gc3BsaXQoKQorCitkZWYgZGlybmFtZShzKTogcmV0dXJuIHNwbGl0KHMpWzBdCitkZWYgYmFzZW5hbWUocyk6IHJldHVybiBzcGxpdChzKVsxXQorCitkZWYgaXNtb3VudChzKToKKyAgICBpZiBub3QgaXNhYnMocyk6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGNvbXBvbmVudHMgPSBzcGxpdChzKQorICAgIHJldHVybiBsZW4oY29tcG9uZW50cykgPT0gMiBhbmQgY29tcG9uZW50c1sxXSA9PSAnJworCitkZWYgaXNsaW5rKHMpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBwYXRobmFtZSByZWZlcnMgdG8gYSBzeW1ib2xpYyBsaW5rLiIiIgorCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgQ2FyYm9uLkZpbGUKKyAgICAgICAgcmV0dXJuIENhcmJvbi5GaWxlLlJlc29sdmVBbGlhc0ZpbGUocywgMClbMl0KKyAgICBleGNlcHQ6CisgICAgICAgIHJldHVybiBGYWxzZQorCisjIElzIGBzdGF0YC9gbHN0YXRgIGEgbWVhbmluZ2Z1bCBkaWZmZXJlbmNlIG9uIHRoZSBNYWM/ICBUaGlzIGlzIHNhZmUgaW4gYW55CisjIGNhc2UuCisKK2RlZiBsZXhpc3RzKHBhdGgpOgorICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggZXhpc3RzLiAgUmV0dXJucyBUcnVlIGZvciBicm9rZW4gc3ltYm9saWMgbGlua3MiIiIKKworICAgIHRyeToKKyAgICAgICAgc3QgPSBvcy5sc3RhdChwYXRoKQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworZGVmIGV4cGFuZHZhcnMocGF0aCk6CisgICAgIiIiRHVtbXkgdG8gcmV0YWluIGludGVyZmFjZS1jb21wYXRpYmlsaXR5IHdpdGggb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuIiIiCisgICAgcmV0dXJuIHBhdGgKKworCitkZWYgZXhwYW5kdXNlcihwYXRoKToKKyAgICAiIiJEdW1teSB0byByZXRhaW4gaW50ZXJmYWNlLWNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcy4iIiIKKyAgICByZXR1cm4gcGF0aAorCitjbGFzcyBub3JtX2Vycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiUGF0aCBjYW5ub3QgYmUgbm9ybWFsaXplZCIiIgorCitkZWYgbm9ybXBhdGgocyk6CisgICAgIiIiTm9ybWFsaXplIGEgcGF0aG5hbWUuICBXaWxsIHJldHVybiB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgZXF1aXZhbGVudCBwYXRocy4iIiIKKworICAgIGlmICI6IiBub3QgaW4gczoKKyAgICAgICAgcmV0dXJuICI6IitzCisKKyAgICBjb21wcyA9IHMuc3BsaXQoIjoiKQorICAgIGkgPSAxCisgICAgd2hpbGUgaSA8IGxlbihjb21wcyktMToKKyAgICAgICAgaWYgY29tcHNbaV0gPT0gIiIgYW5kIGNvbXBzW2ktMV0gIT0gIiI6CisgICAgICAgICAgICBpZiBpID4gMToKKyAgICAgICAgICAgICAgICBkZWwgY29tcHNbaS0xOmkrMV0KKyAgICAgICAgICAgICAgICBpID0gaSAtIDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBiZXN0IHdheSB0byBoYW5kbGUgdGhpcyBpcyB0byByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICAgICByYWlzZSBub3JtX2Vycm9yLCAnQ2Fubm90IHVzZSA6OiBpbW1lZGlhdGVseSBhZnRlciB2b2x1bWUgbmFtZScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGkgPSBpICsgMQorCisgICAgcyA9ICI6Ii5qb2luKGNvbXBzKQorCisgICAgIyByZW1vdmUgdHJhaWxpbmcgIjoiIGV4Y2VwdCBmb3IgIjoiIGFuZCAiVm9sdW1lOiIKKyAgICBpZiBzWy0xXSA9PSAiOiIgYW5kIGxlbihjb21wcykgPiAyIGFuZCBzICE9ICI6IipsZW4ocyk6CisgICAgICAgIHMgPSBzWzotMV0KKyAgICByZXR1cm4gcworCisKK2RlZiB3YWxrKHRvcCwgZnVuYywgYXJnKToKKyAgICAiIiJEaXJlY3RvcnkgdHJlZSB3YWxrIHdpdGggY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBGb3IgZWFjaCBkaXJlY3RvcnkgaW4gdGhlIGRpcmVjdG9yeSB0cmVlIHJvb3RlZCBhdCB0b3AgKGluY2x1ZGluZyB0b3AKKyAgICBpdHNlbGYsIGJ1dCBleGNsdWRpbmcgJy4nIGFuZCAnLi4nKSwgY2FsbCBmdW5jKGFyZywgZGlybmFtZSwgZm5hbWVzKS4KKyAgICBkaXJuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnksIGFuZCBmbmFtZXMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZgorICAgIHRoZSBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgaW4gZGlybmFtZSAoZXhjbHVkaW5nICcuJyBhbmQgJy4uJykuICBmdW5jCisgICAgbWF5IG1vZGlmeSB0aGUgZm5hbWVzIGxpc3QgaW4tcGxhY2UgKGUuZy4gdmlhIGRlbCBvciBzbGljZSBhc3NpZ25tZW50KSwKKyAgICBhbmQgd2FsayB3aWxsIG9ubHkgcmVjdXJzZSBpbnRvIHRoZSBzdWJkaXJlY3RvcmllcyB3aG9zZSBuYW1lcyByZW1haW4gaW4KKyAgICBmbmFtZXM7IHRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGEgZmlsdGVyLCBvciB0byBpbXBvc2UgYSBzcGVjaWZpYworICAgIG9yZGVyIG9mIHZpc2l0aW5nLiAgTm8gc2VtYW50aWNzIGFyZSBkZWZpbmVkIGZvciwgb3IgcmVxdWlyZWQgb2YsIGFyZywKKyAgICBiZXlvbmQgdGhhdCBhcmcgaXMgYWx3YXlzIHBhc3NlZCB0byBmdW5jLiAgSXQgY2FuIGJlIHVzZWQsIGUuZy4sIHRvIHBhc3MKKyAgICBhIGZpbGVuYW1lIHBhdHRlcm4sIG9yIGEgbXV0YWJsZSBvYmplY3QgZGVzaWduZWQgdG8gYWNjdW11bGF0ZQorICAgIHN0YXRpc3RpY3MuICBQYXNzaW5nIE5vbmUgZm9yIGFyZyBpcyBjb21tb24uIiIiCisgICAgd2FybmluZ3Mud2FybnB5M2soIkluIDMueCwgb3MucGF0aC53YWxrIGlzIHJlbW92ZWQgaW4gZmF2b3Igb2Ygb3Mud2Fsay4iLAorICAgICAgICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MikKKyAgICB0cnk6CisgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcih0b3ApCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4KKyAgICBmdW5jKGFyZywgdG9wLCBuYW1lcykKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgbmFtZSA9IGpvaW4odG9wLCBuYW1lKQorICAgICAgICBpZiBpc2RpcihuYW1lKSBhbmQgbm90IGlzbGluayhuYW1lKToKKyAgICAgICAgICAgIHdhbGsobmFtZSwgZnVuYywgYXJnKQorCisKK2RlZiBhYnNwYXRoKHBhdGgpOgorICAgICIiIlJldHVybiBhbiBhYnNvbHV0ZSBwYXRoLiIiIgorICAgIGlmIG5vdCBpc2FicyhwYXRoKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCB1bmljb2RlKToKKyAgICAgICAgICAgIGN3ZCA9IG9zLmdldGN3ZHUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgcGF0aCA9IGpvaW4oY3dkLCBwYXRoKQorICAgIHJldHVybiBub3JtcGF0aChwYXRoKQorCisjIHJlYWxwYXRoIGlzIGEgbm8tb3Agb24gc3lzdGVtcyB3aXRob3V0IGlzbGluayBzdXBwb3J0CitkZWYgcmVhbHBhdGgocGF0aCk6CisgICAgcGF0aCA9IGFic3BhdGgocGF0aCkKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBDYXJib24uRmlsZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcmV0dXJuIHBhdGgKKyAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgcmV0dXJuIHBhdGgKKyAgICBjb21wb25lbnRzID0gcGF0aC5zcGxpdCgnOicpCisgICAgcGF0aCA9IGNvbXBvbmVudHNbMF0gKyAnOicKKyAgICBmb3IgYyBpbiBjb21wb25lbnRzWzE6XToKKyAgICAgICAgcGF0aCA9IGpvaW4ocGF0aCwgYykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGF0aCA9IENhcmJvbi5GaWxlLkZTUmVzb2x2ZUFsaWFzRmlsZShwYXRoLCAxKVswXS5hc19wYXRobmFtZSgpCisgICAgICAgIGV4Y2VwdCBDYXJib24uRmlsZS5FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICByZXR1cm4gcGF0aAorCitzdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lcyA9IFRydWUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFjcGF0aC5weWMgYi9saWIvcHl0aG9uMi43L21hY3BhdGgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OGVhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21hY3BhdGgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFjcGF0aC5weW8gYi9saWIvcHl0aG9uMi43L21hY3BhdGgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OGVhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21hY3BhdGgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFjdXJsMnBhdGgucHkgYi9saWIvcHl0aG9uMi43L21hY3VybDJwYXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNWFlNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21hY3VybDJwYXRoLnB5CkBAIC0wLDAgKzEsOTcgQEAKKyIiIk1hY2ludG9zaC1zcGVjaWZpYyBtb2R1bGUgZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBwYXRobmFtZXMgYW5kIFVSTHMuCisKK0RvIG5vdCBpbXBvcnQgZGlyZWN0bHk7IHVzZSB1cmxsaWIgaW5zdGVhZC4iIiIKKworaW1wb3J0IHVybGxpYgoraW1wb3J0IG9zCisKK19fYWxsX18gPSBbInVybDJwYXRobmFtZSIsInBhdGhuYW1lMnVybCJdCisKK2RlZiB1cmwycGF0aG5hbWUocGF0aG5hbWUpOgorICAgICIiIk9TLXNwZWNpZmljIGNvbnZlcnNpb24gZnJvbSBhIHJlbGF0aXZlIFVSTCBvZiB0aGUgJ2ZpbGUnIHNjaGVtZQorICAgIHRvIGEgZmlsZSBzeXN0ZW0gcGF0aDsgbm90IHJlY29tbWVuZGVkIGZvciBnZW5lcmFsIHVzZS4iIiIKKyAgICAjCisgICAgIyBYWFhYIFRoZSAuLiBoYW5kbGluZyBzaG91bGQgYmUgZml4ZWQuLi4KKyAgICAjCisgICAgdHAgPSB1cmxsaWIuc3BsaXR0eXBlKHBhdGhuYW1lKVswXQorICAgIGlmIHRwIGFuZCB0cCAhPSAnZmlsZSc6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ0Nhbm5vdCBjb252ZXJ0IG5vbi1sb2NhbCBVUkwgdG8gcGF0aG5hbWUnCisgICAgIyBUdXJuIHN0YXJ0aW5nIC8vLyBpbnRvIC8sIGFuIGVtcHR5IGhvc3RuYW1lIG1lYW5zIGN1cnJlbnQgaG9zdAorICAgIGlmIHBhdGhuYW1lWzozXSA9PSAnLy8vJzoKKyAgICAgICAgcGF0aG5hbWUgPSBwYXRobmFtZVsyOl0KKyAgICBlbGlmIHBhdGhuYW1lWzoyXSA9PSAnLy8nOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICdDYW5ub3QgY29udmVydCBub24tbG9jYWwgVVJMIHRvIHBhdGhuYW1lJworICAgIGNvbXBvbmVudHMgPSBwYXRobmFtZS5zcGxpdCgnLycpCisgICAgIyBSZW1vdmUgLiBhbmQgZW1iZWRkZWQgLi4KKyAgICBpID0gMAorICAgIHdoaWxlIGkgPCBsZW4oY29tcG9uZW50cyk6CisgICAgICAgIGlmIGNvbXBvbmVudHNbaV0gPT0gJy4nOgorICAgICAgICAgICAgZGVsIGNvbXBvbmVudHNbaV0KKyAgICAgICAgZWxpZiBjb21wb25lbnRzW2ldID09ICcuLicgYW5kIGkgPiAwIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1tpLTFdIG5vdCBpbiAoJycsICcuLicpOgorICAgICAgICAgICAgZGVsIGNvbXBvbmVudHNbaS0xOmkrMV0KKyAgICAgICAgICAgIGkgPSBpLTEKKyAgICAgICAgZWxpZiBjb21wb25lbnRzW2ldID09ICcnIGFuZCBpID4gMCBhbmQgY29tcG9uZW50c1tpLTFdICE9ICcnOgorICAgICAgICAgICAgZGVsIGNvbXBvbmVudHNbaV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGkgPSBpKzEKKyAgICBpZiBub3QgY29tcG9uZW50c1swXToKKyAgICAgICAgIyBBYnNvbHV0ZSB1bml4IHBhdGgsIGRvbid0IHN0YXJ0IHdpdGggY29sb24KKyAgICAgICAgcnYgPSAnOicuam9pbihjb21wb25lbnRzWzE6XSkKKyAgICBlbHNlOgorICAgICAgICAjIHJlbGF0aXZlIHVuaXggcGF0aCwgc3RhcnQgd2l0aCBjb2xvbi4gRmlyc3QgcmVwbGFjZQorICAgICAgICAjIGxlYWRpbmcgLi4gYnkgZW1wdHkgc3RyaW5ncyAoZ2l2aW5nIDo6ZmlsZSkKKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUgaSA8IGxlbihjb21wb25lbnRzKSBhbmQgY29tcG9uZW50c1tpXSA9PSAnLi4nOgorICAgICAgICAgICAgY29tcG9uZW50c1tpXSA9ICcnCisgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgcnYgPSAnOicgKyAnOicuam9pbihjb21wb25lbnRzKQorICAgICMgYW5kIGZpbmFsbHkgdW5xdW90ZSBzbGFzaGVzIGFuZCBvdGhlciBmdW5ueSBjaGFyYWN0ZXJzCisgICAgcmV0dXJuIHVybGxpYi51bnF1b3RlKHJ2KQorCitkZWYgcGF0aG5hbWUydXJsKHBhdGhuYW1lKToKKyAgICAiIiJPUy1zcGVjaWZpYyBjb252ZXJzaW9uIGZyb20gYSBmaWxlIHN5c3RlbSBwYXRoIHRvIGEgcmVsYXRpdmUgVVJMCisgICAgb2YgdGhlICdmaWxlJyBzY2hlbWU7IG5vdCByZWNvbW1lbmRlZCBmb3IgZ2VuZXJhbCB1c2UuIiIiCisgICAgaWYgJy8nIGluIHBhdGhuYW1lOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJDYW5ub3QgY29udmVydCBwYXRobmFtZSBjb250YWluaW5nIHNsYXNoZXMiCisgICAgY29tcG9uZW50cyA9IHBhdGhuYW1lLnNwbGl0KCc6JykKKyAgICAjIFJlbW92ZSBlbXB0eSBmaXJzdCBhbmQvb3IgbGFzdCBjb21wb25lbnQKKyAgICBpZiBjb21wb25lbnRzWzBdID09ICcnOgorICAgICAgICBkZWwgY29tcG9uZW50c1swXQorICAgIGlmIGNvbXBvbmVudHNbLTFdID09ICcnOgorICAgICAgICBkZWwgY29tcG9uZW50c1stMV0KKyAgICAjIFJlcGxhY2UgZW1wdHkgc3RyaW5nICgnOjonKSBieSAuLiAod2lsbCByZXN1bHQgaW4gJy8uLi8nIGxhdGVyKQorICAgIGZvciBpIGluIHJhbmdlKGxlbihjb21wb25lbnRzKSk6CisgICAgICAgIGlmIGNvbXBvbmVudHNbaV0gPT0gJyc6CisgICAgICAgICAgICBjb21wb25lbnRzW2ldID0gJy4uJworICAgICMgVHJ1bmNhdGUgbmFtZXMgbG9uZ2VyIHRoYW4gMzEgYnl0ZXMKKyAgICBjb21wb25lbnRzID0gbWFwKF9wbmNvbXAydXJsLCBjb21wb25lbnRzKQorCisgICAgaWYgb3MucGF0aC5pc2FicyhwYXRobmFtZSk6CisgICAgICAgIHJldHVybiAnLycgKyAnLycuam9pbihjb21wb25lbnRzKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnLycuam9pbihjb21wb25lbnRzKQorCitkZWYgX3BuY29tcDJ1cmwoY29tcG9uZW50KToKKyAgICBjb21wb25lbnQgPSB1cmxsaWIucXVvdGUoY29tcG9uZW50WzozMV0sIHNhZmU9JycpICAjIFdlIHdhbnQgdG8gcXVvdGUgc2xhc2hlcworICAgIHJldHVybiBjb21wb25lbnQKKworZGVmIHRlc3QoKToKKyAgICBmb3IgdXJsIGluIFsiaW5kZXguaHRtbCIsCisgICAgICAgICAgICAgICAgImJhci9pbmRleC5odG1sIiwKKyAgICAgICAgICAgICAgICAiL2Zvby9iYXIvaW5kZXguaHRtbCIsCisgICAgICAgICAgICAgICAgIi9mb28vYmFyLyIsCisgICAgICAgICAgICAgICAgIi8iXToKKyAgICAgICAgcHJpbnQgJyVyIC0+ICVyJyAlICh1cmwsIHVybDJwYXRobmFtZSh1cmwpKQorICAgIGZvciBwYXRoIGluIFsiZHJpdmU6IiwKKyAgICAgICAgICAgICAgICAgImRyaXZlOmRpcjoiLAorICAgICAgICAgICAgICAgICAiZHJpdmU6ZGlyOmZpbGUiLAorICAgICAgICAgICAgICAgICAiZHJpdmU6ZmlsZSIsCisgICAgICAgICAgICAgICAgICJmaWxlIiwKKyAgICAgICAgICAgICAgICAgIjpmaWxlIiwKKyAgICAgICAgICAgICAgICAgIjpkaXI6IiwKKyAgICAgICAgICAgICAgICAgIjpkaXI6ZmlsZSJdOgorICAgICAgICBwcmludCAnJXIgLT4gJXInICUgKHBhdGgsIHBhdGhuYW1lMnVybChwYXRoKSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFjdXJsMnBhdGgucHljIGIvbGliL3B5dGhvbjIuNy9tYWN1cmwycGF0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2YzA2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWFjdXJsMnBhdGgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFjdXJsMnBhdGgucHlvIGIvbGliL3B5dGhvbjIuNy9tYWN1cmwycGF0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2YzA2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWFjdXJsMnBhdGgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFpbGJveC5weSBiL2xpYi9weXRob24yLjcvbWFpbGJveC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzBkM2M1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tYWlsYm94LnB5CkBAIC0wLDAgKzEsMjIzMCBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiJSZWFkL3dyaXRlIHN1cHBvcnQgZm9yIE1haWxkaXIsIG1ib3gsIE1ILCBCYWJ5bCwgYW5kIE1NREYgbWFpbGJveGVzLiIiIgorCisjIE5vdGVzIGZvciBhdXRob3JzIG9mIG5ldyBtYWlsYm94IHN1YmNsYXNzZXM6CisjCisjIFJlbWVtYmVyIHRvIGZzeW5jKCkgY2hhbmdlcyB0byBkaXNrIGJlZm9yZSBjbG9zaW5nIGEgbW9kaWZpZWQgZmlsZQorIyBvciByZXR1cm5pbmcgZnJvbSBhIGZsdXNoKCkgbWV0aG9kLiAgU2VlIGZ1bmN0aW9ucyBfc3luY19mbHVzaCgpIGFuZAorIyBfc3luY19jbG9zZSgpLgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB0aW1lCitpbXBvcnQgY2FsZW5kYXIKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBlcnJubworaW1wb3J0IGNvcHkKK2ltcG9ydCBlbWFpbAoraW1wb3J0IGVtYWlsLm1lc3NhZ2UKK2ltcG9ydCBlbWFpbC5nZW5lcmF0b3IKK2ltcG9ydCBTdHJpbmdJTwordHJ5OgorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnb3MyZW14JzoKKyAgICAgICAgIyBPUy8yIEVNWCBmY250bCgpIG5vdCBhZGVxdWF0ZQorICAgICAgICByYWlzZSBJbXBvcnRFcnJvcgorICAgIGltcG9ydCBmY250bAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZjbnRsID0gTm9uZQorCitpbXBvcnQgd2FybmluZ3MKK3dpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICBpZiBzeXMucHkza3dhcm5pbmc6CisgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLipyZmM4MjIgaGFzIGJlZW4gcmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKyAgICBpbXBvcnQgcmZjODIyCisKK19fYWxsX18gPSBbICdNYWlsYm94JywgJ01haWxkaXInLCAnbWJveCcsICdNSCcsICdCYWJ5bCcsICdNTURGJywKKyAgICAgICAgICAgICdNZXNzYWdlJywgJ01haWxkaXJNZXNzYWdlJywgJ21ib3hNZXNzYWdlJywgJ01ITWVzc2FnZScsCisgICAgICAgICAgICAnQmFieWxNZXNzYWdlJywgJ01NREZNZXNzYWdlJywgJ1VuaXhNYWlsYm94JywKKyAgICAgICAgICAgICdQb3J0YWJsZVVuaXhNYWlsYm94JywgJ01tZGZNYWlsYm94JywgJ01ITWFpbGJveCcsICdCYWJ5bE1haWxib3gnIF0KKworY2xhc3MgTWFpbGJveDoKKyAgICAiIiJBIGdyb3VwIG9mIG1lc3NhZ2VzIGluIGEgcGFydGljdWxhciBwbGFjZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmUsIGNyZWF0ZT1UcnVlKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIE1haWxib3ggaW5zdGFuY2UuIiIiCisgICAgICAgIHNlbGYuX3BhdGggPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5leHBhbmR1c2VyKHBhdGgpKQorICAgICAgICBzZWxmLl9mYWN0b3J5ID0gZmFjdG9yeQorCisgICAgZGVmIGFkZChzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQWRkIG1lc3NhZ2UgYW5kIHJldHVybiBhc3NpZ25lZCBrZXkuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgIGRlZiByZW1vdmUoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmVtb3ZlIHRoZSBrZXllZCBtZXNzYWdlOyByYWlzZSBLZXlFcnJvciBpZiBpdCBkb2Vzbid0IGV4aXN0LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgc2VsZi5yZW1vdmUoa2V5KQorCisgICAgZGVmIGRpc2NhcmQoc2VsZiwga2V5KToKKyAgICAgICAgIiIiSWYgdGhlIGtleWVkIG1lc3NhZ2UgZXhpc3RzLCByZW1vdmUgaXQuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucmVtb3ZlKGtleSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgbWVzc2FnZSk6CisgICAgICAgICIiIlJlcGxhY2UgdGhlIGtleWVkIG1lc3NhZ2U7IHJhaXNlIEtleUVycm9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGtleWVkIG1lc3NhZ2UsIG9yIGRlZmF1bHQgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19nZXRpdGVtX18oa2V5KQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiB0aGUga2V5ZWQgbWVzc2FnZTsgcmFpc2UgS2V5RXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX2ZhY3Rvcnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfbWVzc2FnZShrZXkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFjdG9yeShzZWxmLmdldF9maWxlKGtleSkpCisKKyAgICBkZWYgZ2V0X21lc3NhZ2Uoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYgZ2V0X3N0cmluZyhzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgZGVmIGdldF9maWxlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBhIGZpbGUtbGlrZSByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYgaXRlcmtleXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIGtleXMuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGtleXMuIiIiCisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcmtleXMoKSkKKworICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBhbGwgbWVzc2FnZXMuIiIiCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5pdGVya2V5cygpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZltrZXldCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHlpZWxkIHZhbHVlCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLml0ZXJ2YWx1ZXMoKQorCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBtZXNzYWdlcy4gTWVtb3J5IGludGVuc2l2ZS4iIiIKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVydmFsdWVzKCkpCisKKyAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciAoa2V5LCBtZXNzYWdlKSB0dXBsZXMuIiIiCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5pdGVya2V5cygpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZltrZXldCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHlpZWxkIChrZXksIHZhbHVlKQorCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIChrZXksIG1lc3NhZ2UpIHR1cGxlcy4gTWVtb3J5IGludGVuc2l2ZS4iIiIKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyaXRlbXMoKSkKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBrZXllZCBtZXNzYWdlIGV4aXN0cywgRmFsc2Ugb3RoZXJ3aXNlLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBzZWxmLmhhc19rZXkoa2V5KQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGNvdW50IG9mIG1lc3NhZ2VzIGluIHRoZSBtYWlsYm94LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgICIiIkRlbGV0ZSBhbGwgbWVzc2FnZXMuIiIiCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5pdGVya2V5cygpOgorICAgICAgICAgICAgc2VsZi5kaXNjYXJkKGtleSkKKworICAgIGRlZiBwb3Aoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAiIiJEZWxldGUgdGhlIGtleWVkIG1lc3NhZ2UgYW5kIHJldHVybiBpdCwgb3IgZGVmYXVsdC4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltrZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgICAgIHNlbGYuZGlzY2FyZChrZXkpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBwb3BpdGVtKHNlbGYpOgorICAgICAgICAiIiJEZWxldGUgYW4gYXJiaXRyYXJ5IChrZXksIG1lc3NhZ2UpIHBhaXIgYW5kIHJldHVybiBpdC4iIiIKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLml0ZXJrZXlzKCk6CisgICAgICAgICAgICByZXR1cm4gKGtleSwgc2VsZi5wb3Aoa2V5KSkgICAgICMgVGhpcyBpcyBvbmx5IHJ1biBvbmNlLgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ05vIG1lc3NhZ2VzIGluIG1haWxib3gnKQorCisgICAgZGVmIHVwZGF0ZShzZWxmLCBhcmc9Tm9uZSk6CisgICAgICAgICIiIkNoYW5nZSB0aGUgbWVzc2FnZXMgdGhhdCBjb3JyZXNwb25kIHRvIGNlcnRhaW4ga2V5cy4iIiIKKyAgICAgICAgaWYgaGFzYXR0cihhcmcsICdpdGVyaXRlbXMnKToKKyAgICAgICAgICAgIHNvdXJjZSA9IGFyZy5pdGVyaXRlbXMoKQorICAgICAgICBlbGlmIGhhc2F0dHIoYXJnLCAnaXRlbXMnKToKKyAgICAgICAgICAgIHNvdXJjZSA9IGFyZy5pdGVtcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzb3VyY2UgPSBhcmcKKyAgICAgICAgYmFkX2tleSA9IEZhbHNlCisgICAgICAgIGZvciBrZXksIG1lc3NhZ2UgaW4gc291cmNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IG1lc3NhZ2UKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBiYWRfa2V5ID0gVHJ1ZQorICAgICAgICBpZiBiYWRfa2V5OgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ05vIG1lc3NhZ2Ugd2l0aCBrZXkocyknKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICAiIiJXcml0ZSBhbnkgcGVuZGluZyBjaGFuZ2VzIHRvIHRoZSBkaXNrLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYgbG9jayhzZWxmKToKKyAgICAgICAgIiIiTG9jayB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgZGVmIHVubG9jayhzZWxmKToKKyAgICAgICAgIiIiVW5sb2NrIHRoZSBtYWlsYm94IGlmIGl0IGlzIGxvY2tlZC4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJGbHVzaCBhbmQgY2xvc2UgdGhlIG1haWxib3guIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgICMgV2hldGhlciBlYWNoIG1lc3NhZ2UgbXVzdCBlbmQgaW4gYSBuZXdsaW5lCisgICAgX2FwcGVuZF9uZXdsaW5lID0gRmFsc2UKKworICAgIGRlZiBfZHVtcF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UsIHRhcmdldCwgbWFuZ2xlX2Zyb21fPUZhbHNlKToKKyAgICAgICAgIyBNb3N0IGZpbGVzIGFyZSBvcGVuZWQgaW4gYmluYXJ5IG1vZGUgdG8gYWxsb3cgcHJlZGljdGFibGUgc2Vla2luZy4KKyAgICAgICAgIyBUbyBnZXQgbmF0aXZlIGxpbmUgZW5kaW5ncyBvbiBkaXNrLCB0aGUgdXNlci1mcmllbmRseSBcbiBsaW5lIGVuZGluZ3MKKyAgICAgICAgIyB1c2VkIGluIHN0cmluZ3MgYW5kIGJ5IGVtYWlsLk1lc3NhZ2UgYXJlIHRyYW5zbGF0ZWQgaGVyZS4KKyAgICAgICAgIiIiRHVtcCBtZXNzYWdlIGNvbnRlbnRzIHRvIHRhcmdldCBmaWxlLiIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSk6CisgICAgICAgICAgICBidWZmZXIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBnZW4gPSBlbWFpbC5nZW5lcmF0b3IuR2VuZXJhdG9yKGJ1ZmZlciwgbWFuZ2xlX2Zyb21fLCAwKQorICAgICAgICAgICAgZ2VuLmZsYXR0ZW4obWVzc2FnZSkKKyAgICAgICAgICAgIGJ1ZmZlci5zZWVrKDApCisgICAgICAgICAgICBkYXRhID0gYnVmZmVyLnJlYWQoKS5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApCisgICAgICAgICAgICB0YXJnZXQud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGlmIHNlbGYuX2FwcGVuZF9uZXdsaW5lIGFuZCBub3QgZGF0YS5lbmRzd2l0aChvcy5saW5lc2VwKToKKyAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBlbmRzIHdpdGggYSBuZXdsaW5lCisgICAgICAgICAgICAgICAgdGFyZ2V0LndyaXRlKG9zLmxpbmVzZXApCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBzdHIpOgorICAgICAgICAgICAgaWYgbWFuZ2xlX2Zyb21fOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoJ1xuRnJvbSAnLCAnXG4+RnJvbSAnKQorICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgnXG4nLCBvcy5saW5lc2VwKQorICAgICAgICAgICAgdGFyZ2V0LndyaXRlKG1lc3NhZ2UpCisgICAgICAgICAgICBpZiBzZWxmLl9hcHBlbmRfbmV3bGluZSBhbmQgbm90IG1lc3NhZ2UuZW5kc3dpdGgob3MubGluZXNlcCk6CisgICAgICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIG1lc3NhZ2UgZW5kcyB3aXRoIGEgbmV3bGluZQorICAgICAgICAgICAgICAgIHRhcmdldC53cml0ZShvcy5saW5lc2VwKQorICAgICAgICBlbGlmIGhhc2F0dHIobWVzc2FnZSwgJ3JlYWQnKToKKyAgICAgICAgICAgIGxhc3RsaW5lID0gTm9uZQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gbWVzc2FnZS5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBtYW5nbGVfZnJvbV8gYW5kIGxpbmUuc3RhcnRzd2l0aCgnRnJvbSAnKToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9ICc+RnJvbSAnICsgbGluZVs1Ol0KKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApCisgICAgICAgICAgICAgICAgdGFyZ2V0LndyaXRlKGxpbmUpCisgICAgICAgICAgICAgICAgbGFzdGxpbmUgPSBsaW5lCisgICAgICAgICAgICBpZiBzZWxmLl9hcHBlbmRfbmV3bGluZSBhbmQgbGFzdGxpbmUgYW5kIG5vdCBsYXN0bGluZS5lbmRzd2l0aChvcy5saW5lc2VwKToKKyAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBlbmRzIHdpdGggYSBuZXdsaW5lCisgICAgICAgICAgICAgICAgdGFyZ2V0LndyaXRlKG9zLmxpbmVzZXApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0ludmFsaWQgbWVzc2FnZSB0eXBlOiAlcycgJSB0eXBlKG1lc3NhZ2UpKQorCisKK2NsYXNzIE1haWxkaXIoTWFpbGJveCk6CisgICAgIiIiQSBxbWFpbC1zdHlsZSBNYWlsZGlyIG1haWxib3guIiIiCisKKyAgICBjb2xvbiA9ICc6JworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpcm5hbWUsIGZhY3Rvcnk9cmZjODIyLk1lc3NhZ2UsIGNyZWF0ZT1UcnVlKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIE1haWxkaXIgaW5zdGFuY2UuIiIiCisgICAgICAgIE1haWxib3guX19pbml0X18oc2VsZiwgZGlybmFtZSwgZmFjdG9yeSwgY3JlYXRlKQorICAgICAgICBzZWxmLl9wYXRocyA9IHsKKyAgICAgICAgICAgICd0bXAnOiBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ3RtcCcpLAorICAgICAgICAgICAgJ25ldyc6IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnbmV3JyksCisgICAgICAgICAgICAnY3VyJzogb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICdjdXInKSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuX3BhdGgpOgorICAgICAgICAgICAgaWYgY3JlYXRlOgorICAgICAgICAgICAgICAgIG9zLm1rZGlyKHNlbGYuX3BhdGgsIDA3MDApCisgICAgICAgICAgICAgICAgZm9yIHBhdGggaW4gc2VsZi5fcGF0aHMudmFsdWVzKCk6CisgICAgICAgICAgICAgICAgICAgIG9zLm1rZGlyKHBhdGgsIDBvNzAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBOb1N1Y2hNYWlsYm94RXJyb3Ioc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5fdG9jID0ge30KKyAgICAgICAgc2VsZi5fdG9jX210aW1lcyA9IHsnY3VyJzogMCwgJ25ldyc6IDB9CisgICAgICAgIHNlbGYuX2xhc3RfcmVhZCA9IDAgICAgICAgICAjIFJlY29yZHMgbGFzdCB0aW1lIHdlIHJlYWQgY3VyL25ldworICAgICAgICBzZWxmLl9za2V3ZmFjdG9yID0gMC4xICAgICAgIyBBZGp1c3QgaWYgb3MvZnMgY2xvY2tzIGFyZSBza2V3aW5nCisKKyAgICBkZWYgYWRkKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJBZGQgbWVzc2FnZSBhbmQgcmV0dXJuIGFzc2lnbmVkIGtleS4iIiIKKyAgICAgICAgdG1wX2ZpbGUgPSBzZWxmLl9jcmVhdGVfdG1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fZHVtcF9tZXNzYWdlKG1lc3NhZ2UsIHRtcF9maWxlKQorICAgICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHRtcF9maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnJlbW92ZSh0bXBfZmlsZS5uYW1lKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgX3N5bmNfY2xvc2UodG1wX2ZpbGUpCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWFpbGRpck1lc3NhZ2UpOgorICAgICAgICAgICAgc3ViZGlyID0gbWVzc2FnZS5nZXRfc3ViZGlyKCkKKyAgICAgICAgICAgIHN1ZmZpeCA9IHNlbGYuY29sb24gKyBtZXNzYWdlLmdldF9pbmZvKCkKKyAgICAgICAgICAgIGlmIHN1ZmZpeCA9PSBzZWxmLmNvbG9uOgorICAgICAgICAgICAgICAgIHN1ZmZpeCA9ICcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdWJkaXIgPSAnbmV3JworICAgICAgICAgICAgc3VmZml4ID0gJycKKyAgICAgICAgdW5pcSA9IG9zLnBhdGguYmFzZW5hbWUodG1wX2ZpbGUubmFtZSkuc3BsaXQoc2VsZi5jb2xvbilbMF0KKyAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdWJkaXIsIHVuaXEgKyBzdWZmaXgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICdsaW5rJyk6CisgICAgICAgICAgICAgICAgb3MubGluayh0bXBfZmlsZS5uYW1lLCBkZXN0KQorICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0bXBfZmlsZS5uYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy5yZW5hbWUodG1wX2ZpbGUubmFtZSwgZGVzdCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICBvcy5yZW1vdmUodG1wX2ZpbGUubmFtZSkKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4dGVybmFsQ2xhc2hFcnJvcignTmFtZSBjbGFzaCB3aXRoIGV4aXN0aW5nIG1lc3NhZ2U6ICVzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIGRlc3QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWFpbGRpck1lc3NhZ2UpOgorICAgICAgICAgICAgb3MudXRpbWUoZGVzdCwgKG9zLnBhdGguZ2V0YXRpbWUoZGVzdCksIG1lc3NhZ2UuZ2V0X2RhdGUoKSkpCisgICAgICAgIHJldHVybiB1bmlxCisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJlbW92ZSB0aGUga2V5ZWQgbWVzc2FnZTsgcmFpc2UgS2V5RXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzZWxmLl9sb29rdXAoa2V5KSkpCisKKyAgICBkZWYgZGlzY2FyZChzZWxmLCBrZXkpOgorICAgICAgICAiIiJJZiB0aGUga2V5ZWQgbWVzc2FnZSBleGlzdHMsIHJlbW92ZSBpdC4iIiIKKyAgICAgICAgIyBUaGlzIG92ZXJyaWRlcyBhbiBpbmFwcGxpY2FibGUgaW1wbGVtZW50YXRpb24gaW4gdGhlIHN1cGVyY2xhc3MuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucmVtb3ZlKGtleSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBtZXNzYWdlKToKKyAgICAgICAgIiIiUmVwbGFjZSB0aGUga2V5ZWQgbWVzc2FnZTsgcmFpc2UgS2V5RXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgb2xkX3N1YnBhdGggPSBzZWxmLl9sb29rdXAoa2V5KQorICAgICAgICB0ZW1wX2tleSA9IHNlbGYuYWRkKG1lc3NhZ2UpCisgICAgICAgIHRlbXBfc3VicGF0aCA9IHNlbGYuX2xvb2t1cCh0ZW1wX2tleSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNYWlsZGlyTWVzc2FnZSk6CisgICAgICAgICAgICAjIHRlbXAncyBzdWJkaXIgYW5kIHN1ZmZpeCB3ZXJlIHNwZWNpZmllZCBieSBtZXNzYWdlLgorICAgICAgICAgICAgZG9taW5hbnRfc3VicGF0aCA9IHRlbXBfc3VicGF0aAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB0ZW1wJ3Mgc3ViZGlyIGFuZCBzdWZmaXggd2VyZSBkZWZhdWx0cyBmcm9tIGFkZCgpLgorICAgICAgICAgICAgZG9taW5hbnRfc3VicGF0aCA9IG9sZF9zdWJwYXRoCisgICAgICAgIHN1YmRpciA9IG9zLnBhdGguZGlybmFtZShkb21pbmFudF9zdWJwYXRoKQorICAgICAgICBpZiBzZWxmLmNvbG9uIGluIGRvbWluYW50X3N1YnBhdGg6CisgICAgICAgICAgICBzdWZmaXggPSBzZWxmLmNvbG9uICsgZG9taW5hbnRfc3VicGF0aC5zcGxpdChzZWxmLmNvbG9uKVstMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1ZmZpeCA9ICcnCisgICAgICAgIHNlbGYuZGlzY2FyZChrZXkpCisgICAgICAgIG5ld19wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN1YmRpciwga2V5ICsgc3VmZml4KQorICAgICAgICBvcy5yZW5hbWUob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHRlbXBfc3VicGF0aCksIG5ld19wYXRoKQorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1haWxkaXJNZXNzYWdlKToKKyAgICAgICAgICAgIG9zLnV0aW1lKG5ld19wYXRoLCAob3MucGF0aC5nZXRhdGltZShuZXdfcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0X2RhdGUoKSkpCisKKyAgICBkZWYgZ2V0X21lc3NhZ2Uoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICBzdWJwYXRoID0gc2VsZi5fbG9va3VwKGtleSkKKyAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN1YnBhdGgpLCAncicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX2ZhY3Rvcnk6CisgICAgICAgICAgICAgICAgbXNnID0gc2VsZi5fZmFjdG9yeShmKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtc2cgPSBNYWlsZGlyTWVzc2FnZShmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHN1YmRpciwgbmFtZSA9IG9zLnBhdGguc3BsaXQoc3VicGF0aCkKKyAgICAgICAgbXNnLnNldF9zdWJkaXIoc3ViZGlyKQorICAgICAgICBpZiBzZWxmLmNvbG9uIGluIG5hbWU6CisgICAgICAgICAgICBtc2cuc2V0X2luZm8obmFtZS5zcGxpdChzZWxmLmNvbG9uKVstMV0pCisgICAgICAgIG1zZy5zZXRfZGF0ZShvcy5wYXRoLmdldG10aW1lKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdWJwYXRoKSkpCisgICAgICAgIHJldHVybiBtc2cKKworICAgIGRlZiBnZXRfc3RyaW5nKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc2VsZi5fbG9va3VwKGtleSkpLCAncicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBmLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgZ2V0X2ZpbGUoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgZmlsZS1saWtlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzZWxmLl9sb29rdXAoa2V5KSksICdyYicpCisgICAgICAgIHJldHVybiBfUHJveHlGaWxlKGYpCisKKyAgICBkZWYgaXRlcmtleXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIGtleXMuIiIiCisgICAgICAgIHNlbGYuX3JlZnJlc2goKQorICAgICAgICBmb3Iga2V5IGluIHNlbGYuX3RvYzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9sb29rdXAoa2V5KQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB5aWVsZCBrZXkKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBrZXllZCBtZXNzYWdlIGV4aXN0cywgRmFsc2Ugb3RoZXJ3aXNlLiIiIgorICAgICAgICBzZWxmLl9yZWZyZXNoKCkKKyAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLl90b2MKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBjb3VudCBvZiBtZXNzYWdlcyBpbiB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgc2VsZi5fcmVmcmVzaCgpCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fdG9jKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICAiIiJXcml0ZSBhbnkgcGVuZGluZyBjaGFuZ2VzIHRvIGRpc2suIiIiCisgICAgICAgICMgTWFpbGRpciBjaGFuZ2VzIGFyZSBhbHdheXMgd3JpdHRlbiBpbW1lZGlhdGVseSwgc28gdGhlcmUncyBub3RoaW5nCisgICAgICAgICMgdG8gZG8uCisgICAgICAgIHBhc3MKKworICAgIGRlZiBsb2NrKHNlbGYpOgorICAgICAgICAiIiJMb2NrIHRoZSBtYWlsYm94LiIiIgorICAgICAgICByZXR1cm4KKworICAgIGRlZiB1bmxvY2soc2VsZik6CisgICAgICAgICIiIlVubG9jayB0aGUgbWFpbGJveCBpZiBpdCBpcyBsb2NrZWQuIiIiCisgICAgICAgIHJldHVybgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJGbHVzaCBhbmQgY2xvc2UgdGhlIG1haWxib3guIiIiCisgICAgICAgIHJldHVybgorCisgICAgZGVmIGxpc3RfZm9sZGVycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBmb2xkZXIgbmFtZXMuIiIiCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKHNlbGYuX3BhdGgpOgorICAgICAgICAgICAgaWYgbGVuKGVudHJ5KSA+IDEgYW5kIGVudHJ5WzBdID09ICcuJyBhbmQgXAorICAgICAgICAgICAgICAgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZW50cnkpKToKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGVudHJ5WzE6XSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGdldF9mb2xkZXIoc2VsZiwgZm9sZGVyKToKKyAgICAgICAgIiIiUmV0dXJuIGEgTWFpbGRpciBpbnN0YW5jZSBmb3IgdGhlIG5hbWVkIGZvbGRlci4iIiIKKyAgICAgICAgcmV0dXJuIE1haWxkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcuJyArIGZvbGRlciksCisgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcnk9c2VsZi5fZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlPUZhbHNlKQorCisgICAgZGVmIGFkZF9mb2xkZXIoc2VsZiwgZm9sZGVyKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgZm9sZGVyIGFuZCByZXR1cm4gYSBNYWlsZGlyIGluc3RhbmNlIHJlcHJlc2VudGluZyBpdC4iIiIKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnLicgKyBmb2xkZXIpCisgICAgICAgIHJlc3VsdCA9IE1haWxkaXIocGF0aCwgZmFjdG9yeT1zZWxmLl9mYWN0b3J5KQorICAgICAgICBtYWlsZGlyZm9sZGVyX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ21haWxkaXJmb2xkZXInKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobWFpbGRpcmZvbGRlcl9wYXRoKToKKyAgICAgICAgICAgIG9zLmNsb3NlKG9zLm9wZW4obWFpbGRpcmZvbGRlcl9wYXRoLCBvcy5PX0NSRUFUIHwgb3MuT19XUk9OTFksCisgICAgICAgICAgICAgICAgMDY2NikpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiByZW1vdmVfZm9sZGVyKHNlbGYsIGZvbGRlcik6CisgICAgICAgICIiIkRlbGV0ZSB0aGUgbmFtZWQgZm9sZGVyLCB3aGljaCBtdXN0IGJlIGVtcHR5LiIiIgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcuJyArIGZvbGRlcikKKyAgICAgICAgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHBhdGgsICduZXcnKSkgKyBcCisgICAgICAgICAgICAgICAgICAgICBvcy5saXN0ZGlyKG9zLnBhdGguam9pbihwYXRoLCAnY3VyJykpOgorICAgICAgICAgICAgaWYgbGVuKGVudHJ5KSA8IDEgb3IgZW50cnlbMF0gIT0gJy4nOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vdEVtcHR5RXJyb3IoJ0ZvbGRlciBjb250YWlucyBtZXNzYWdlKHMpOiAlcycgJSBmb2xkZXIpCisgICAgICAgIGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKHBhdGgpOgorICAgICAgICAgICAgaWYgZW50cnkgIT0gJ25ldycgYW5kIGVudHJ5ICE9ICdjdXInIGFuZCBlbnRyeSAhPSAndG1wJyBhbmQgXAorICAgICAgICAgICAgICAgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4ocGF0aCwgZW50cnkpKToKKyAgICAgICAgICAgICAgICByYWlzZSBOb3RFbXB0eUVycm9yKCJGb2xkZXIgY29udGFpbnMgc3ViZGlyZWN0b3J5ICclcyc6ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9sZGVyLCBlbnRyeSkpCisgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHBhdGgsIHRvcGRvd249RmFsc2UpOgorICAgICAgICAgICAgZm9yIGVudHJ5IGluIGZpbGVzOgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4ocm9vdCwgZW50cnkpKQorICAgICAgICAgICAgZm9yIGVudHJ5IGluIGRpcnM6CisgICAgICAgICAgICAgICAgb3Mucm1kaXIob3MucGF0aC5qb2luKHJvb3QsIGVudHJ5KSkKKyAgICAgICAgb3Mucm1kaXIocGF0aCkKKworICAgIGRlZiBjbGVhbihzZWxmKToKKyAgICAgICAgIiIiRGVsZXRlIG9sZCBmaWxlcyBpbiAidG1wIi4iIiIKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICd0bXAnKSk6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICd0bXAnLCBlbnRyeSkKKyAgICAgICAgICAgIGlmIG5vdyAtIG9zLnBhdGguZ2V0YXRpbWUocGF0aCkgPiAxMjk2MDA6ICAgIyA2MCAqIDYwICogMzYKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUocGF0aCkKKworICAgIF9jb3VudCA9IDEgICMgVGhpcyBpcyB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBmaWxlIG5hbWVzLgorCisgICAgZGVmIF9jcmVhdGVfdG1wKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgYSBmaWxlIGluIHRoZSB0bXAgc3ViZGlyZWN0b3J5IGFuZCBvcGVuIGFuZCByZXR1cm4gaXQuIiIiCisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIGhvc3RuYW1lID0gc29ja2V0LmdldGhvc3RuYW1lKCkKKyAgICAgICAgaWYgJy8nIGluIGhvc3RuYW1lOgorICAgICAgICAgICAgaG9zdG5hbWUgPSBob3N0bmFtZS5yZXBsYWNlKCcvJywgcidcMDU3JykKKyAgICAgICAgaWYgJzonIGluIGhvc3RuYW1lOgorICAgICAgICAgICAgaG9zdG5hbWUgPSBob3N0bmFtZS5yZXBsYWNlKCc6JywgcidcMDcyJykKKyAgICAgICAgdW5pcSA9ICIlcy5NJXNQJXNRJXMuJXMiICUgKGludChub3cpLCBpbnQobm93ICUgMSAqIDFlNiksIG9zLmdldHBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbGRpci5fY291bnQsIGhvc3RuYW1lKQorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICd0bXAnLCB1bmlxKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5zdGF0KHBhdGgpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgTWFpbGRpci5fY291bnQgKz0gMQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVfY2FyZWZ1bGx5KHBhdGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICAjIEZhbGwgdGhyb3VnaCB0byBoZXJlIGlmIHN0YXQgc3VjY2VlZGVkIG9yIG9wZW4gcmFpc2VkIEVFWElTVC4KKyAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdOYW1lIGNsYXNoIHByZXZlbnRlZCBmaWxlIGNyZWF0aW9uOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCkKKworICAgIGRlZiBfcmVmcmVzaChzZWxmKToKKyAgICAgICAgIiIiVXBkYXRlIHRhYmxlIG9mIGNvbnRlbnRzIG1hcHBpbmcuIiIiCisgICAgICAgICMgSWYgaXQgaGFzIGJlZW4gbGVzcyB0aGFuIHR3byBzZWNvbmRzIHNpbmNlIHRoZSBsYXN0IF9yZWZyZXNoKCkgY2FsbCwKKyAgICAgICAgIyB3ZSBoYXZlIHRvIHVuY29uZGl0aW9uYWxseSByZS1yZWFkIHRoZSBtYWlsYm94IGp1c3QgaW4gY2FzZSBpdCBoYXMKKyAgICAgICAgIyBiZWVuIG1vZGlmaWVkLCBiZWNhdXNlIG9zLnBhdGgubXRpbWUoKSBoYXMgYSAyIHNlYyByZXNvbHV0aW9uIGluIHRoZQorICAgICAgICAjIG1vc3QgY29tbW9uIHdvcnN0IGNhc2UgKEZBVCkgYW5kIGEgMSBzZWMgcmVzb2x1dGlvbiB0eXBpY2FsbHkuICBUaGlzCisgICAgICAgICMgcmVzdWx0cyBpbiBhIGZldyB1bm5lY2Vzc2FyeSByZS1yZWFkcyB3aGVuIF9yZWZyZXNoKCkgaXMgY2FsbGVkCisgICAgICAgICMgbXVsdGlwbGUgdGltZXMgaW4gdGhhdCBpbnRlcnZhbCwgYnV0IG9uY2UgdGhlIGNsb2NrIHRpY2tzIG92ZXIsIHdlCisgICAgICAgICMgd2lsbCBvbmx5IHJlLXJlYWQgYXMgbmVlZGVkLiAgQmVjYXVzZSB0aGUgZmlsZXN5c3RlbSBtaWdodCBiZSBiZWluZworICAgICAgICAjIHNlcnZlZCBieSBhbiBpbmRlcGVuZGVudCBzeXN0ZW0gd2l0aCBpdHMgb3duIGNsb2NrLCB3ZSByZWNvcmQgYW5kCisgICAgICAgICMgY29tcGFyZSB3aXRoIHRoZSBtdGltZXMgZnJvbSB0aGUgZmlsZXN5c3RlbS4gIEJlY2F1c2UgdGhlIG90aGVyCisgICAgICAgICMgc3lzdGVtJ3MgY2xvY2sgbWlnaHQgYmUgc2tld2luZyByZWxhdGl2ZSB0byBvdXIgY2xvY2ssIHdlIGFkZCBhbgorICAgICAgICAjIGV4dHJhIGRlbHRhIHRvIG91ciB3YWl0LiAgVGhlIGRlZmF1bHQgaXMgb25lIHRlbnRoIHNlY29uZCwgYnV0IGlzIGFuCisgICAgICAgICMgaW5zdGFuY2UgdmFyaWFibGUgYW5kIHNvIGNhbiBiZSBhZGp1c3RlZCBpZiBkZWFsaW5nIHdpdGggYQorICAgICAgICAjIHBhcnRpY3VsYXJseSBza2V3ZWQgb3IgaXJyZWd1bGFyIHN5c3RlbS4KKyAgICAgICAgaWYgdGltZS50aW1lKCkgLSBzZWxmLl9sYXN0X3JlYWQgPiAyICsgc2VsZi5fc2tld2ZhY3RvcjoKKyAgICAgICAgICAgIHJlZnJlc2ggPSBGYWxzZQorICAgICAgICAgICAgZm9yIHN1YmRpciBpbiBzZWxmLl90b2NfbXRpbWVzOgorICAgICAgICAgICAgICAgIG10aW1lID0gb3MucGF0aC5nZXRtdGltZShzZWxmLl9wYXRoc1tzdWJkaXJdKQorICAgICAgICAgICAgICAgIGlmIG10aW1lID4gc2VsZi5fdG9jX210aW1lc1tzdWJkaXJdOgorICAgICAgICAgICAgICAgICAgICByZWZyZXNoID0gVHJ1ZQorICAgICAgICAgICAgICAgIHNlbGYuX3RvY19tdGltZXNbc3ViZGlyXSA9IG10aW1lCisgICAgICAgICAgICBpZiBub3QgcmVmcmVzaDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBSZWZyZXNoIHRvYworICAgICAgICBzZWxmLl90b2MgPSB7fQorICAgICAgICBmb3Igc3ViZGlyIGluIHNlbGYuX3RvY19tdGltZXM6CisgICAgICAgICAgICBwYXRoID0gc2VsZi5fcGF0aHNbc3ViZGlyXQorICAgICAgICAgICAgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIocGF0aCk6CisgICAgICAgICAgICAgICAgcCA9IG9zLnBhdGguam9pbihwYXRoLCBlbnRyeSkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHApOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHVuaXEgPSBlbnRyeS5zcGxpdChzZWxmLmNvbG9uKVswXQorICAgICAgICAgICAgICAgIHNlbGYuX3RvY1t1bmlxXSA9IG9zLnBhdGguam9pbihzdWJkaXIsIGVudHJ5KQorICAgICAgICBzZWxmLl9sYXN0X3JlYWQgPSB0aW1lLnRpbWUoKQorCisgICAgZGVmIF9sb29rdXAoc2VsZiwga2V5KToKKyAgICAgICAgIiIiVXNlIFRPQyB0byByZXR1cm4gc3VicGF0aCBmb3IgZ2l2ZW4ga2V5LCBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc2VsZi5fdG9jW2tleV0pKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdG9jW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLl9yZWZyZXNoKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RvY1trZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdObyBtZXNzYWdlIHdpdGgga2V5OiAlcycgJSBrZXkpCisKKyAgICAjIFRoaXMgbWV0aG9kIGlzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9ubHkuCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBtZXNzYWdlIGluIGEgb25lLXRpbWUgaXRlcmF0aW9uLiIiIgorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnX29uZXRpbWVfa2V5cycpOgorICAgICAgICAgICAgc2VsZi5fb25ldGltZV9rZXlzID0gc2VsZi5pdGVya2V5cygpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGZbc2VsZi5fb25ldGltZV9rZXlzLm5leHQoKV0KKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKworCitjbGFzcyBfc2luZ2xlZmlsZU1haWxib3goTWFpbGJveCk6CisgICAgIiIiQSBzaW5nbGUtZmlsZSBtYWlsYm94LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGZhY3Rvcnk9Tm9uZSwgY3JlYXRlPVRydWUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgc2luZ2xlLWZpbGUgbWFpbGJveC4iIiIKKyAgICAgICAgTWFpbGJveC5fX2luaXRfXyhzZWxmLCBwYXRoLCBmYWN0b3J5LCBjcmVhdGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuX3BhdGgsICdyYisnKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIGlmIGNyZWF0ZToKKyAgICAgICAgICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5fcGF0aCwgJ3diKycpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTm9TdWNoTWFpbGJveEVycm9yKHNlbGYuX3BhdGgpCisgICAgICAgICAgICBlbGlmIGUuZXJybm8gaW4gKGVycm5vLkVBQ0NFUywgZXJybm8uRVJPRlMpOgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuX3BhdGgsICdyYicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHNlbGYuX2ZpbGUgPSBmCisgICAgICAgIHNlbGYuX3RvYyA9IE5vbmUKKyAgICAgICAgc2VsZi5fbmV4dF9rZXkgPSAwCisgICAgICAgIHNlbGYuX3BlbmRpbmcgPSBGYWxzZSAgICAgICAjIE5vIGNoYW5nZXMgcmVxdWlyZSByZXdyaXRpbmcgdGhlIGZpbGUuCisgICAgICAgIHNlbGYuX3BlbmRpbmdfc3luYyA9IEZhbHNlICAjIE5vIG5lZWQgdG8gc3luYyB0aGUgZmlsZQorICAgICAgICBzZWxmLl9sb2NrZWQgPSBGYWxzZQorICAgICAgICBzZWxmLl9maWxlX2xlbmd0aCA9IE5vbmUgICAgIyBVc2VkIHRvIHJlY29yZCBtYWlsYm94IHNpemUKKworICAgIGRlZiBhZGQoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkFkZCBtZXNzYWdlIGFuZCByZXR1cm4gYXNzaWduZWQga2V5LiIiIgorICAgICAgICBzZWxmLl9sb29rdXAoKQorICAgICAgICBzZWxmLl90b2Nbc2VsZi5fbmV4dF9rZXldID0gc2VsZi5fYXBwZW5kX21lc3NhZ2UobWVzc2FnZSkKKyAgICAgICAgc2VsZi5fbmV4dF9rZXkgKz0gMQorICAgICAgICAjIF9hcHBlbmRfbWVzc2FnZSBhcHBlbmRzIHRoZSBtZXNzYWdlIHRvIHRoZSBtYWlsYm94IGZpbGUuIFdlCisgICAgICAgICMgZG9uJ3QgbmVlZCBhIGZ1bGwgcmV3cml0ZSArIHJlbmFtZSwgc3luYyBpcyBlbm91Z2guCisgICAgICAgIHNlbGYuX3BlbmRpbmdfc3luYyA9IFRydWUKKyAgICAgICAgcmV0dXJuIHNlbGYuX25leHRfa2V5IC0gMQorCisgICAgZGVmIHJlbW92ZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZW1vdmUgdGhlIGtleWVkIG1lc3NhZ2U7IHJhaXNlIEtleUVycm9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgICAgIHNlbGYuX2xvb2t1cChrZXkpCisgICAgICAgIGRlbCBzZWxmLl90b2Nba2V5XQorICAgICAgICBzZWxmLl9wZW5kaW5nID0gVHJ1ZQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgbWVzc2FnZSk6CisgICAgICAgICIiIlJlcGxhY2UgdGhlIGtleWVkIG1lc3NhZ2U7IHJhaXNlIEtleUVycm9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgICAgIHNlbGYuX2xvb2t1cChrZXkpCisgICAgICAgIHNlbGYuX3RvY1trZXldID0gc2VsZi5fYXBwZW5kX21lc3NhZ2UobWVzc2FnZSkKKyAgICAgICAgc2VsZi5fcGVuZGluZyA9IFRydWUKKworICAgIGRlZiBpdGVya2V5cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIga2V5cy4iIiIKKyAgICAgICAgc2VsZi5fbG9va3VwKCkKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl90b2Mua2V5cygpOgorICAgICAgICAgICAgeWllbGQga2V5CisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUga2V5ZWQgbWVzc2FnZSBleGlzdHMsIEZhbHNlIG90aGVyd2lzZS4iIiIKKyAgICAgICAgc2VsZi5fbG9va3VwKCkKKyAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLl90b2MKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBjb3VudCBvZiBtZXNzYWdlcyBpbiB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgc2VsZi5fbG9va3VwKCkKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl90b2MpCisKKyAgICBkZWYgbG9jayhzZWxmKToKKyAgICAgICAgIiIiTG9jayB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgIF9sb2NrX2ZpbGUoc2VsZi5fZmlsZSkKKyAgICAgICAgICAgIHNlbGYuX2xvY2tlZCA9IFRydWUKKworICAgIGRlZiB1bmxvY2soc2VsZik6CisgICAgICAgICIiIlVubG9jayB0aGUgbWFpbGJveCBpZiBpdCBpcyBsb2NrZWQuIiIiCisgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgIF91bmxvY2tfZmlsZShzZWxmLl9maWxlKQorICAgICAgICAgICAgc2VsZi5fbG9ja2VkID0gRmFsc2UKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgIiIiV3JpdGUgYW55IHBlbmRpbmcgY2hhbmdlcyB0byBkaXNrLiIiIgorICAgICAgICBpZiBub3Qgc2VsZi5fcGVuZGluZzoKKyAgICAgICAgICAgIGlmIHNlbGYuX3BlbmRpbmdfc3luYzoKKyAgICAgICAgICAgICAgICAjIE1lc3NhZ2VzIGhhdmUgb25seSBiZWVuIGFkZGVkLCBzbyBzeW5jaW5nIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgIyBpcyBlbm91Z2guCisgICAgICAgICAgICAgICAgX3N5bmNfZmx1c2goc2VsZi5fZmlsZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9wZW5kaW5nX3N5bmMgPSBGYWxzZQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBJbiBvcmRlciB0byBiZSB3cml0aW5nIGFueXRoaW5nIG91dCBhdCBhbGwsIHNlbGYuX3RvYyBtdXN0CisgICAgICAgICMgYWxyZWFkeSBoYXZlIGJlZW4gZ2VuZXJhdGVkIChhbmQgcHJlc3VtYWJseSBoYXMgYmVlbiBtb2RpZmllZAorICAgICAgICAjIGJ5IGFkZGluZyBvciBkZWxldGluZyBhbiBpdGVtKS4KKyAgICAgICAgYXNzZXJ0IHNlbGYuX3RvYyBpcyBub3QgTm9uZQorCisgICAgICAgICMgQ2hlY2sgbGVuZ3RoIG9mIHNlbGYuX2ZpbGU7IGlmIGl0J3MgY2hhbmdlZCwgc29tZSBvdGhlciBwcm9jZXNzCisgICAgICAgICMgaGFzIG1vZGlmaWVkIHRoZSBtYWlsYm94IHNpbmNlIHdlIHNjYW5uZWQgaXQuCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlaygwLCAyKQorICAgICAgICBjdXJfbGVuID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgaWYgY3VyX2xlbiAhPSBzZWxmLl9maWxlX2xlbmd0aDoKKyAgICAgICAgICAgIHJhaXNlIEV4dGVybmFsQ2xhc2hFcnJvcignU2l6ZSBvZiBtYWlsYm94IGZpbGUgY2hhbmdlZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhleHBlY3RlZCAlaSwgZm91bmQgJWkpJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX2ZpbGVfbGVuZ3RoLCBjdXJfbGVuKSkKKworICAgICAgICBuZXdfZmlsZSA9IF9jcmVhdGVfdGVtcG9yYXJ5KHNlbGYuX3BhdGgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5ld190b2MgPSB7fQorICAgICAgICAgICAgc2VsZi5fcHJlX21haWxib3hfaG9vayhuZXdfZmlsZSkKKyAgICAgICAgICAgIGZvciBrZXkgaW4gc29ydGVkKHNlbGYuX3RvYy5rZXlzKCkpOgorICAgICAgICAgICAgICAgIHN0YXJ0LCBzdG9wID0gc2VsZi5fdG9jW2tleV0KKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLnNlZWsoc3RhcnQpCisgICAgICAgICAgICAgICAgc2VsZi5fcHJlX21lc3NhZ2VfaG9vayhuZXdfZmlsZSkKKyAgICAgICAgICAgICAgICBuZXdfc3RhcnQgPSBuZXdfZmlsZS50ZWxsKCkKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBzZWxmLl9maWxlLnJlYWQobWluKDQwOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCAtIHNlbGYuX2ZpbGUudGVsbCgpKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgYnVmZmVyID09ICcnOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgbmV3X2ZpbGUud3JpdGUoYnVmZmVyKQorICAgICAgICAgICAgICAgIG5ld190b2Nba2V5XSA9IChuZXdfc3RhcnQsIG5ld19maWxlLnRlbGwoKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9wb3N0X21lc3NhZ2VfaG9vayhuZXdfZmlsZSkKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVfbGVuZ3RoID0gbmV3X2ZpbGUudGVsbCgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIG5ld19maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnJlbW92ZShuZXdfZmlsZS5uYW1lKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgX3N5bmNfY2xvc2UobmV3X2ZpbGUpCisgICAgICAgICMgc2VsZi5fZmlsZSBpcyBhYm91dCB0byBnZXQgcmVwbGFjZWQsIHNvIG5vIG5lZWQgdG8gc3luYy4KKyAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBuZXcgZmlsZSdzIG1vZGUgaXMgdGhlIHNhbWUgYXMgdGhlIG9sZCBmaWxlJ3MKKyAgICAgICAgbW9kZSA9IG9zLnN0YXQoc2VsZi5fcGF0aCkuc3RfbW9kZQorICAgICAgICBvcy5jaG1vZChuZXdfZmlsZS5uYW1lLCBtb2RlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW5hbWUobmV3X2ZpbGUubmFtZSwgc2VsZi5fcGF0aCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVFWElTVCBvciBcCisgICAgICAgICAgICAgIChvcy5uYW1lID09ICdvczInIGFuZCBlLmVycm5vID09IGVycm5vLkVBQ0NFUyk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuX3BhdGgpCisgICAgICAgICAgICAgICAgb3MucmVuYW1lKG5ld19maWxlLm5hbWUsIHNlbGYuX3BhdGgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHNlbGYuX2ZpbGUgPSBvcGVuKHNlbGYuX3BhdGgsICdyYisnKQorICAgICAgICBzZWxmLl90b2MgPSBuZXdfdG9jCisgICAgICAgIHNlbGYuX3BlbmRpbmcgPSBGYWxzZQorICAgICAgICBzZWxmLl9wZW5kaW5nX3N5bmMgPSBGYWxzZQorICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICBfbG9ja19maWxlKHNlbGYuX2ZpbGUsIGRvdGxvY2s9RmFsc2UpCisKKyAgICBkZWYgX3ByZV9tYWlsYm94X2hvb2soc2VsZiwgZik6CisgICAgICAgICIiIkNhbGxlZCBiZWZvcmUgd3JpdGluZyB0aGUgbWFpbGJveCB0byBmaWxlIGYuIiIiCisgICAgICAgIHJldHVybgorCisgICAgZGVmIF9wcmVfbWVzc2FnZV9ob29rKHNlbGYsIGYpOgorICAgICAgICAiIiJDYWxsZWQgYmVmb3JlIHdyaXRpbmcgZWFjaCBtZXNzYWdlIHRvIGZpbGUgZi4iIiIKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgX3Bvc3RfbWVzc2FnZV9ob29rKHNlbGYsIGYpOgorICAgICAgICAiIiJDYWxsZWQgYWZ0ZXIgd3JpdGluZyBlYWNoIG1lc3NhZ2UgdG8gZmlsZSBmLiIiIgorICAgICAgICByZXR1cm4KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiRmx1c2ggYW5kIGNsb3NlIHRoZSBtYWlsYm94LiIiIgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgc2VsZi51bmxvY2soKQorICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkgICMgU3luYyBoYXMgYmVlbiBkb25lIGJ5IHNlbGYuZmx1c2goKSBhYm92ZS4KKworICAgIGRlZiBfbG9va3VwKHNlbGYsIGtleT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIChzdGFydCwgc3RvcCkgb3IgcmFpc2UgS2V5RXJyb3IuIiIiCisgICAgICAgIGlmIHNlbGYuX3RvYyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fZ2VuZXJhdGVfdG9jKCkKKyAgICAgICAgaWYga2V5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl90b2Nba2V5XQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdObyBtZXNzYWdlIHdpdGgga2V5OiAlcycgJSBrZXkpCisKKyAgICBkZWYgX2FwcGVuZF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJBcHBlbmQgbWVzc2FnZSB0byBtYWlsYm94IGFuZCByZXR1cm4gKHN0YXJ0LCBzdG9wKSBvZmZzZXRzLiIiIgorICAgICAgICBzZWxmLl9maWxlLnNlZWsoMCwgMikKKyAgICAgICAgYmVmb3JlID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgaWYgbGVuKHNlbGYuX3RvYykgPT0gMCBhbmQgbm90IHNlbGYuX3BlbmRpbmc6CisgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIGZpcnN0IG1lc3NhZ2UsIGFuZCB0aGUgX3ByZV9tYWlsYm94X2hvb2sKKyAgICAgICAgICAgICMgaGFzbid0IHlldCBiZWVuIGNhbGxlZC4gSWYgc2VsZi5fcGVuZGluZyBpcyBUcnVlLAorICAgICAgICAgICAgIyBtZXNzYWdlcyBoYXZlIGJlZW4gcmVtb3ZlZCwgc28gX3ByZV9tYWlsYm94X2hvb2sgbXVzdAorICAgICAgICAgICAgIyBoYXZlIGJlZW4gY2FsbGVkIGFscmVhZHkuCisgICAgICAgICAgICBzZWxmLl9wcmVfbWFpbGJveF9ob29rKHNlbGYuX2ZpbGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3ByZV9tZXNzYWdlX2hvb2soc2VsZi5fZmlsZSkKKyAgICAgICAgICAgIG9mZnNldHMgPSBzZWxmLl9pbnN0YWxsX21lc3NhZ2UobWVzc2FnZSkKKyAgICAgICAgICAgIHNlbGYuX3Bvc3RfbWVzc2FnZV9ob29rKHNlbGYuX2ZpbGUpCisgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uOgorICAgICAgICAgICAgc2VsZi5fZmlsZS50cnVuY2F0ZShiZWZvcmUpCisgICAgICAgICAgICByYWlzZQorICAgICAgICBzZWxmLl9maWxlLmZsdXNoKCkKKyAgICAgICAgc2VsZi5fZmlsZV9sZW5ndGggPSBzZWxmLl9maWxlLnRlbGwoKSAgIyBSZWNvcmQgY3VycmVudCBsZW5ndGggb2YgbWFpbGJveAorICAgICAgICByZXR1cm4gb2Zmc2V0cworCisKKworY2xhc3MgX21ib3hNTURGKF9zaW5nbGVmaWxlTWFpbGJveCk6CisgICAgIiIiQW4gbWJveCBvciBNTURGIG1haWxib3guIiIiCisKKyAgICBfbWFuZ2xlX2Zyb21fID0gVHJ1ZQorCisgICAgZGVmIGdldF9tZXNzYWdlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBhIE1lc3NhZ2UgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgc3RhcnQsIHN0b3AgPSBzZWxmLl9sb29rdXAoa2V5KQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoc3RhcnQpCisgICAgICAgIGZyb21fbGluZSA9IHNlbGYuX2ZpbGUucmVhZGxpbmUoKS5yZXBsYWNlKG9zLmxpbmVzZXAsICcnKQorICAgICAgICBzdHJpbmcgPSBzZWxmLl9maWxlLnJlYWQoc3RvcCAtIHNlbGYuX2ZpbGUudGVsbCgpKQorICAgICAgICBtc2cgPSBzZWxmLl9tZXNzYWdlX2ZhY3Rvcnkoc3RyaW5nLnJlcGxhY2Uob3MubGluZXNlcCwgJ1xuJykpCisgICAgICAgIG1zZy5zZXRfZnJvbShmcm9tX2xpbmVbNTpdKQorICAgICAgICByZXR1cm4gbXNnCisKKyAgICBkZWYgZ2V0X3N0cmluZyhzZWxmLCBrZXksIGZyb21fPUZhbHNlKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHN0YXJ0LCBzdG9wID0gc2VsZi5fbG9va3VwKGtleSkKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHN0YXJ0KQorICAgICAgICBpZiBub3QgZnJvbV86CisgICAgICAgICAgICBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgc3RyaW5nID0gc2VsZi5fZmlsZS5yZWFkKHN0b3AgLSBzZWxmLl9maWxlLnRlbGwoKSkKKyAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpCisKKyAgICBkZWYgZ2V0X2ZpbGUoc2VsZiwga2V5LCBmcm9tXz1GYWxzZSk6CisgICAgICAgICIiIlJldHVybiBhIGZpbGUtbGlrZSByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICBzdGFydCwgc3RvcCA9IHNlbGYuX2xvb2t1cChrZXkpCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzdGFydCkKKyAgICAgICAgaWYgbm90IGZyb21fOgorICAgICAgICAgICAgc2VsZi5fZmlsZS5yZWFkbGluZSgpCisgICAgICAgIHJldHVybiBfUGFydGlhbEZpbGUoc2VsZi5fZmlsZSwgc2VsZi5fZmlsZS50ZWxsKCksIHN0b3ApCisKKyAgICBkZWYgX2luc3RhbGxfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiRm9ybWF0IGEgbWVzc2FnZSBhbmQgYmxpbmRseSB3cml0ZSB0byBzZWxmLl9maWxlLiIiIgorICAgICAgICBmcm9tX2xpbmUgPSBOb25lCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgc3RyKSBhbmQgbWVzc2FnZS5zdGFydHN3aXRoKCdGcm9tICcpOgorICAgICAgICAgICAgbmV3bGluZSA9IG1lc3NhZ2UuZmluZCgnXG4nKQorICAgICAgICAgICAgaWYgbmV3bGluZSAhPSAtMToKKyAgICAgICAgICAgICAgICBmcm9tX2xpbmUgPSBtZXNzYWdlWzpuZXdsaW5lXQorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlW25ld2xpbmUgKyAxOl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZnJvbV9saW5lID0gbWVzc2FnZQorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnJworICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgX21ib3hNTURGTWVzc2FnZSk6CisgICAgICAgICAgICBmcm9tX2xpbmUgPSAnRnJvbSAnICsgbWVzc2FnZS5nZXRfZnJvbSgpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UpOgorICAgICAgICAgICAgZnJvbV9saW5lID0gbWVzc2FnZS5nZXRfdW5peGZyb20oKSAgIyBNYXkgYmUgTm9uZS4KKyAgICAgICAgaWYgZnJvbV9saW5lIGlzIE5vbmU6CisgICAgICAgICAgICBmcm9tX2xpbmUgPSAnRnJvbSBNQUlMRVItREFFTU9OICVzJyAlIHRpbWUuYXNjdGltZSh0aW1lLmdtdGltZSgpKQorICAgICAgICBzdGFydCA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoZnJvbV9saW5lICsgb3MubGluZXNlcCkKKyAgICAgICAgc2VsZi5fZHVtcF9tZXNzYWdlKG1lc3NhZ2UsIHNlbGYuX2ZpbGUsIHNlbGYuX21hbmdsZV9mcm9tXykKKyAgICAgICAgc3RvcCA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIHJldHVybiAoc3RhcnQsIHN0b3ApCisKKworY2xhc3MgbWJveChfbWJveE1NREYpOgorICAgICIiIkEgY2xhc3NpYyBtYm94IG1haWxib3guIiIiCisKKyAgICBfbWFuZ2xlX2Zyb21fID0gVHJ1ZQorCisgICAgIyBBbGwgbWVzc2FnZXMgbXVzdCBlbmQgaW4gYSBuZXdsaW5lIGNoYXJhY3RlciwgYW5kCisgICAgIyBfcG9zdF9tZXNzYWdlX2hvb2tzIG91dHB1dHMgYW4gZW1wdHkgbGluZSBiZXR3ZWVuIG1lc3NhZ2VzLgorICAgIF9hcHBlbmRfbmV3bGluZSA9IFRydWUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmUsIGNyZWF0ZT1UcnVlKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBtYm94IG1haWxib3guIiIiCisgICAgICAgIHNlbGYuX21lc3NhZ2VfZmFjdG9yeSA9IG1ib3hNZXNzYWdlCisgICAgICAgIF9tYm94TU1ERi5fX2luaXRfXyhzZWxmLCBwYXRoLCBmYWN0b3J5LCBjcmVhdGUpCisKKyAgICBkZWYgX3Bvc3RfbWVzc2FnZV9ob29rKHNlbGYsIGYpOgorICAgICAgICAiIiJDYWxsZWQgYWZ0ZXIgd3JpdGluZyBlYWNoIG1lc3NhZ2UgdG8gZmlsZSBmLiIiIgorICAgICAgICBmLndyaXRlKG9zLmxpbmVzZXApCisKKyAgICBkZWYgX2dlbmVyYXRlX3RvYyhzZWxmKToKKyAgICAgICAgIiIiR2VuZXJhdGUga2V5LXRvLShzdGFydCwgc3RvcCkgdGFibGUgb2YgY29udGVudHMuIiIiCisgICAgICAgIHN0YXJ0cywgc3RvcHMgPSBbXSwgW10KKyAgICAgICAgbGFzdF93YXNfZW1wdHkgPSBGYWxzZQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoMCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmVfcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnRnJvbSAnKToKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3RvcHMpIDwgbGVuKHN0YXJ0cyk6CisgICAgICAgICAgICAgICAgICAgIGlmIGxhc3Rfd2FzX2VtcHR5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMuYXBwZW5kKGxpbmVfcG9zIC0gbGVuKG9zLmxpbmVzZXApKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbGFzdCBsaW5lIGJlZm9yZSB0aGUgIkZyb20gIiBsaW5lIHdhc24ndAorICAgICAgICAgICAgICAgICAgICAgICAgIyBibGFuaywgYnV0IHdlIGNvbnNpZGVyIGl0IGEgc3RhcnQgb2YgYQorICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXNzYWdlIGFueXdheS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzLmFwcGVuZChsaW5lX3BvcykKKyAgICAgICAgICAgICAgICBzdGFydHMuYXBwZW5kKGxpbmVfcG9zKQorICAgICAgICAgICAgICAgIGxhc3Rfd2FzX2VtcHR5ID0gRmFsc2UKKyAgICAgICAgICAgIGVsaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgaWYgbGFzdF93YXNfZW1wdHk6CisgICAgICAgICAgICAgICAgICAgIHN0b3BzLmFwcGVuZChsaW5lX3BvcyAtIGxlbihvcy5saW5lc2VwKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzdG9wcy5hcHBlbmQobGluZV9wb3MpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgbGluZSA9PSBvcy5saW5lc2VwOgorICAgICAgICAgICAgICAgIGxhc3Rfd2FzX2VtcHR5ID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsYXN0X3dhc19lbXB0eSA9IEZhbHNlCisgICAgICAgIHNlbGYuX3RvYyA9IGRpY3QoZW51bWVyYXRlKHppcChzdGFydHMsIHN0b3BzKSkpCisgICAgICAgIHNlbGYuX25leHRfa2V5ID0gbGVuKHNlbGYuX3RvYykKKyAgICAgICAgc2VsZi5fZmlsZV9sZW5ndGggPSBzZWxmLl9maWxlLnRlbGwoKQorCisKK2NsYXNzIE1NREYoX21ib3hNTURGKToKKyAgICAiIiJBbiBNTURGIG1haWxib3guIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lLCBjcmVhdGU9VHJ1ZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYW4gTU1ERiBtYWlsYm94LiIiIgorICAgICAgICBzZWxmLl9tZXNzYWdlX2ZhY3RvcnkgPSBNTURGTWVzc2FnZQorICAgICAgICBfbWJveE1NREYuX19pbml0X18oc2VsZiwgcGF0aCwgZmFjdG9yeSwgY3JlYXRlKQorCisgICAgZGVmIF9wcmVfbWVzc2FnZV9ob29rKHNlbGYsIGYpOgorICAgICAgICAiIiJDYWxsZWQgYmVmb3JlIHdyaXRpbmcgZWFjaCBtZXNzYWdlIHRvIGZpbGUgZi4iIiIKKyAgICAgICAgZi53cml0ZSgnXDAwMVwwMDFcMDAxXDAwMScgKyBvcy5saW5lc2VwKQorCisgICAgZGVmIF9wb3N0X21lc3NhZ2VfaG9vayhzZWxmLCBmKToKKyAgICAgICAgIiIiQ2FsbGVkIGFmdGVyIHdyaXRpbmcgZWFjaCBtZXNzYWdlIHRvIGZpbGUgZi4iIiIKKyAgICAgICAgZi53cml0ZShvcy5saW5lc2VwICsgJ1wwMDFcMDAxXDAwMVwwMDEnICsgb3MubGluZXNlcCkKKworICAgIGRlZiBfZ2VuZXJhdGVfdG9jKHNlbGYpOgorICAgICAgICAiIiJHZW5lcmF0ZSBrZXktdG8tKHN0YXJ0LCBzdG9wKSB0YWJsZSBvZiBjb250ZW50cy4iIiIKKyAgICAgICAgc3RhcnRzLCBzdG9wcyA9IFtdLCBbXQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoMCkKKyAgICAgICAgbmV4dF9wb3MgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBsaW5lX3BvcyA9IG5leHRfcG9zCisgICAgICAgICAgICBsaW5lID0gc2VsZi5fZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBuZXh0X3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ1wwMDFcMDAxXDAwMVwwMDEnICsgb3MubGluZXNlcCk6CisgICAgICAgICAgICAgICAgc3RhcnRzLmFwcGVuZChuZXh0X3BvcykKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBsaW5lX3BvcyA9IG5leHRfcG9zCisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgbmV4dF9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lID09ICdcMDAxXDAwMVwwMDFcMDAxJyArIG9zLmxpbmVzZXA6CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wcy5hcHBlbmQobGluZV9wb3MgLSBsZW4ob3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbGlmIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wcy5hcHBlbmQobGluZV9wb3MpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuX3RvYyA9IGRpY3QoZW51bWVyYXRlKHppcChzdGFydHMsIHN0b3BzKSkpCisgICAgICAgIHNlbGYuX25leHRfa2V5ID0gbGVuKHNlbGYuX3RvYykKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKDAsIDIpCisgICAgICAgIHNlbGYuX2ZpbGVfbGVuZ3RoID0gc2VsZi5fZmlsZS50ZWxsKCkKKworCitjbGFzcyBNSChNYWlsYm94KToKKyAgICAiIiJBbiBNSCBtYWlsYm94LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGZhY3Rvcnk9Tm9uZSwgY3JlYXRlPVRydWUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGFuIE1IIGluc3RhbmNlLiIiIgorICAgICAgICBNYWlsYm94Ll9faW5pdF9fKHNlbGYsIHBhdGgsIGZhY3RvcnksIGNyZWF0ZSkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuX3BhdGgpOgorICAgICAgICAgICAgaWYgY3JlYXRlOgorICAgICAgICAgICAgICAgIG9zLm1rZGlyKHNlbGYuX3BhdGgsIDA3MDApCisgICAgICAgICAgICAgICAgb3MuY2xvc2Uob3Mub3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJy5taF9zZXF1ZW5jZXMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLk9fQ1JFQVQgfCBvcy5PX0VYQ0wgfCBvcy5PX1dST05MWSwgMDYwMCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vU3VjaE1haWxib3hFcnJvcihzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLl9sb2NrZWQgPSBGYWxzZQorCisgICAgZGVmIGFkZChzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQWRkIG1lc3NhZ2UgYW5kIHJldHVybiBhc3NpZ25lZCBrZXkuIiIiCisgICAgICAgIGtleXMgPSBzZWxmLmtleXMoKQorICAgICAgICBpZiBsZW4oa2V5cykgPT0gMDoKKyAgICAgICAgICAgIG5ld19rZXkgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXdfa2V5ID0gbWF4KGtleXMpICsgMQorICAgICAgICBuZXdfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIobmV3X2tleSkpCisgICAgICAgIGYgPSBfY3JlYXRlX2NhcmVmdWxseShuZXdfcGF0aCkKKyAgICAgICAgY2xvc2VkID0gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgICAgIF9sb2NrX2ZpbGUoZikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R1bXBfbWVzc2FnZShtZXNzYWdlLCBmKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAjIFVubG9jayBhbmQgY2xvc2Ugc28gaXQgY2FuIGJlIGRlbGV0ZWQgb24gV2luZG93cworICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBfdW5sb2NrX2ZpbGUoZikKKyAgICAgICAgICAgICAgICAgICAgX3N5bmNfY2xvc2UoZikKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUobmV3X3BhdGgpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNSE1lc3NhZ2UpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdW1wX3NlcXVlbmNlcyhtZXNzYWdlLCBuZXdfa2V5KQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgICAgIF91bmxvY2tfZmlsZShmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IGNsb3NlZDoKKyAgICAgICAgICAgICAgICBfc3luY19jbG9zZShmKQorICAgICAgICByZXR1cm4gbmV3X2tleQorCisgICAgZGVmIHJlbW92ZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZW1vdmUgdGhlIGtleWVkIG1lc3NhZ2U7IHJhaXNlIEtleUVycm9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKGtleSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgsICdyYisnKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdObyBtZXNzYWdlIHdpdGgga2V5OiAlcycgJSBrZXkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoKQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgbWVzc2FnZSk6CisgICAgICAgICIiIlJlcGxhY2UgdGhlIGtleWVkIG1lc3NhZ2U7IHJhaXNlIEtleUVycm9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKGtleSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgsICdyYisnKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdObyBtZXNzYWdlIHdpdGgga2V5OiAlcycgJSBrZXkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICBfbG9ja19maWxlKGYpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MuY2xvc2Uob3Mub3BlbihwYXRoLCBvcy5PX1dST05MWSB8IG9zLk9fVFJVTkMpKQorICAgICAgICAgICAgICAgIHNlbGYuX2R1bXBfbWVzc2FnZShtZXNzYWdlLCBmKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTUhNZXNzYWdlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHVtcF9zZXF1ZW5jZXMobWVzc2FnZSwga2V5KQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgICAgIF91bmxvY2tfZmlsZShmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX3N5bmNfY2xvc2UoZikKKworICAgIGRlZiBnZXRfbWVzc2FnZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBNZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKGtleSkpLCAncisnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKGtleSkpLCAncicpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ05vIG1lc3NhZ2Ugd2l0aCBrZXk6ICVzJyAlIGtleSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgICAgIF9sb2NrX2ZpbGUoZikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtc2cgPSBNSE1lc3NhZ2UoZikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgICAgICAgICBfdW5sb2NrX2ZpbGUoZikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmb3IgbmFtZSwga2V5X2xpc3QgaW4gc2VsZi5nZXRfc2VxdWVuY2VzKCkuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBpZiBrZXkgaW4ga2V5X2xpc3Q6CisgICAgICAgICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZShuYW1lKQorICAgICAgICByZXR1cm4gbXNnCisKKyAgICBkZWYgZ2V0X3N0cmluZyhzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSksICdyKycpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSksICdyJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignTm8gbWVzc2FnZSB3aXRoIGtleTogJXMnICUga2V5KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgX2xvY2tfZmlsZShmKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBmLnJlYWQoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgICAgIF91bmxvY2tfZmlsZShmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgZ2V0X2ZpbGUoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgZmlsZS1saWtlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSksICdyYicpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ05vIG1lc3NhZ2Ugd2l0aCBrZXk6ICVzJyAlIGtleSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIF9Qcm94eUZpbGUoZikKKworICAgIGRlZiBpdGVya2V5cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIga2V5cy4iIiIKKyAgICAgICAgcmV0dXJuIGl0ZXIoc29ydGVkKGludChlbnRyeSkgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIoc2VsZi5fcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW50cnkuaXNkaWdpdCgpKSkKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBrZXllZCBtZXNzYWdlIGV4aXN0cywgRmFsc2Ugb3RoZXJ3aXNlLiIiIgorICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSkKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBjb3VudCBvZiBtZXNzYWdlcyBpbiB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgcmV0dXJuIGxlbihsaXN0KHNlbGYuaXRlcmtleXMoKSkpCisKKyAgICBkZWYgbG9jayhzZWxmKToKKyAgICAgICAgIiIiTG9jayB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnLm1oX3NlcXVlbmNlcycpLCAncmIrJykKKyAgICAgICAgICAgIF9sb2NrX2ZpbGUoc2VsZi5fZmlsZSkKKyAgICAgICAgICAgIHNlbGYuX2xvY2tlZCA9IFRydWUKKworICAgIGRlZiB1bmxvY2soc2VsZik6CisgICAgICAgICIiIlVubG9jayB0aGUgbWFpbGJveCBpZiBpdCBpcyBsb2NrZWQuIiIiCisgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgIF91bmxvY2tfZmlsZShzZWxmLl9maWxlKQorICAgICAgICAgICAgX3N5bmNfY2xvc2Uoc2VsZi5fZmlsZSkKKyAgICAgICAgICAgIGRlbCBzZWxmLl9maWxlCisgICAgICAgICAgICBzZWxmLl9sb2NrZWQgPSBGYWxzZQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICAiIiJXcml0ZSBhbnkgcGVuZGluZyBjaGFuZ2VzIHRvIHRoZSBkaXNrLiIiIgorICAgICAgICByZXR1cm4KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiRmx1c2ggYW5kIGNsb3NlIHRoZSBtYWlsYm94LiIiIgorICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICBzZWxmLnVubG9jaygpCisKKyAgICBkZWYgbGlzdF9mb2xkZXJzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGZvbGRlciBuYW1lcy4iIiIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIoc2VsZi5fcGF0aCk6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBlbnRyeSkpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnkpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBnZXRfZm9sZGVyKHNlbGYsIGZvbGRlcik6CisgICAgICAgICIiIlJldHVybiBhbiBNSCBpbnN0YW5jZSBmb3IgdGhlIG5hbWVkIGZvbGRlci4iIiIKKyAgICAgICAgcmV0dXJuIE1IKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBmb2xkZXIpLAorICAgICAgICAgICAgICAgICAgZmFjdG9yeT1zZWxmLl9mYWN0b3J5LCBjcmVhdGU9RmFsc2UpCisKKyAgICBkZWYgYWRkX2ZvbGRlcihzZWxmLCBmb2xkZXIpOgorICAgICAgICAiIiJDcmVhdGUgYSBmb2xkZXIgYW5kIHJldHVybiBhbiBNSCBpbnN0YW5jZSByZXByZXNlbnRpbmcgaXQuIiIiCisgICAgICAgIHJldHVybiBNSChvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZm9sZGVyKSwKKyAgICAgICAgICAgICAgICAgIGZhY3Rvcnk9c2VsZi5fZmFjdG9yeSkKKworICAgIGRlZiByZW1vdmVfZm9sZGVyKHNlbGYsIGZvbGRlcik6CisgICAgICAgICIiIkRlbGV0ZSB0aGUgbmFtZWQgZm9sZGVyLCB3aGljaCBtdXN0IGJlIGVtcHR5LiIiIgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIGZvbGRlcikKKyAgICAgICAgZW50cmllcyA9IG9zLmxpc3RkaXIocGF0aCkKKyAgICAgICAgaWYgZW50cmllcyA9PSBbJy5taF9zZXF1ZW5jZXMnXToKKyAgICAgICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4ocGF0aCwgJy5taF9zZXF1ZW5jZXMnKSkKKyAgICAgICAgZWxpZiBlbnRyaWVzID09IFtdOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgTm90RW1wdHlFcnJvcignRm9sZGVyIG5vdCBlbXB0eTogJXMnICUgc2VsZi5fcGF0aCkKKyAgICAgICAgb3Mucm1kaXIocGF0aCkKKworICAgIGRlZiBnZXRfc2VxdWVuY2VzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBuYW1lLXRvLWtleS1saXN0IGRpY3Rpb25hcnkgdG8gZGVmaW5lIGVhY2ggc2VxdWVuY2UuIiIiCisgICAgICAgIHJlc3VsdHMgPSB7fQorICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJy5taF9zZXF1ZW5jZXMnKSwgJ3InKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhbGxfa2V5cyA9IHNldChzZWxmLmtleXMoKSkKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBuYW1lLCBjb250ZW50cyA9IGxpbmUuc3BsaXQoJzonKQorICAgICAgICAgICAgICAgICAgICBrZXlzID0gc2V0KCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIHNwZWMgaW4gY29udGVudHMuc3BsaXQoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNwZWMuaXNkaWdpdCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMuYWRkKGludChzcGVjKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIHN0b3AgPSAoaW50KHgpIGZvciB4IGluIHNwZWMuc3BsaXQoJy0nKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnVwZGF0ZShyYW5nZShzdGFydCwgc3RvcCArIDEpKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRzW25hbWVdID0gW2tleSBmb3Iga2V5IGluIHNvcnRlZChrZXlzKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGtleSBpbiBhbGxfa2V5c10KKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHJlc3VsdHNbbmFtZV0pID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgcmVzdWx0c1tuYW1lXQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBGb3JtYXRFcnJvcignSW52YWxpZCBzZXF1ZW5jZSBzcGVjaWZpY2F0aW9uOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnJzdHJpcCgpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHJldHVybiByZXN1bHRzCisKKyAgICBkZWYgc2V0X3NlcXVlbmNlcyhzZWxmLCBzZXF1ZW5jZXMpOgorICAgICAgICAiIiJTZXQgc2VxdWVuY2VzIHVzaW5nIHRoZSBnaXZlbiBuYW1lLXRvLWtleS1saXN0IGRpY3Rpb25hcnkuIiIiCisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnLm1oX3NlcXVlbmNlcycpLCAncisnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5jbG9zZShvcy5vcGVuKGYubmFtZSwgb3MuT19XUk9OTFkgfCBvcy5PX1RSVU5DKSkKKyAgICAgICAgICAgIGZvciBuYW1lLCBrZXlzIGluIHNlcXVlbmNlcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBsZW4oa2V5cykgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBmLndyaXRlKCclczonICUgbmFtZSkKKyAgICAgICAgICAgICAgICBwcmV2ID0gTm9uZQorICAgICAgICAgICAgICAgIGNvbXBsZXRpbmcgPSBGYWxzZQorICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gc29ydGVkKHNldChrZXlzKSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGtleSAtIDEgPT0gcHJldjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjb21wbGV0aW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpbmcgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnLScpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgY29tcGxldGluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpbmcgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnJXMgJXMnICUgKHByZXYsIGtleSkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCcgJXMnICUga2V5KQorICAgICAgICAgICAgICAgICAgICBwcmV2ID0ga2V5CisgICAgICAgICAgICAgICAgaWYgY29tcGxldGluZzoKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZShzdHIocHJldikgKyAnXG4nKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJ1xuJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIF9zeW5jX2Nsb3NlKGYpCisKKyAgICBkZWYgcGFjayhzZWxmKToKKyAgICAgICAgIiIiUmUtbmFtZSBtZXNzYWdlcyB0byBlbGltaW5hdGUgbnVtYmVyaW5nIGdhcHMuIEludmFsaWRhdGVzIGtleXMuIiIiCisgICAgICAgIHNlcXVlbmNlcyA9IHNlbGYuZ2V0X3NlcXVlbmNlcygpCisgICAgICAgIHByZXYgPSAwCisgICAgICAgIGNoYW5nZXMgPSBbXQorICAgICAgICBmb3Iga2V5IGluIHNlbGYuaXRlcmtleXMoKToKKyAgICAgICAgICAgIGlmIGtleSAtIDEgIT0gcHJldjoKKyAgICAgICAgICAgICAgICBjaGFuZ2VzLmFwcGVuZCgoa2V5LCBwcmV2ICsgMSkpCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgJ2xpbmsnKToKKyAgICAgICAgICAgICAgICAgICAgb3MubGluayhvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKGtleSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIocHJldiArIDEpKSkKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVuYW1lKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKHByZXYgKyAxKSkpCisgICAgICAgICAgICBwcmV2ICs9IDEKKyAgICAgICAgc2VsZi5fbmV4dF9rZXkgPSBwcmV2ICsgMQorICAgICAgICBpZiBsZW4oY2hhbmdlcykgPT0gMDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmb3IgbmFtZSwga2V5X2xpc3QgaW4gc2VxdWVuY2VzLml0ZW1zKCk6CisgICAgICAgICAgICBmb3Igb2xkLCBuZXcgaW4gY2hhbmdlczoKKyAgICAgICAgICAgICAgICBpZiBvbGQgaW4ga2V5X2xpc3Q6CisgICAgICAgICAgICAgICAgICAgIGtleV9saXN0W2tleV9saXN0LmluZGV4KG9sZCldID0gbmV3CisgICAgICAgIHNlbGYuc2V0X3NlcXVlbmNlcyhzZXF1ZW5jZXMpCisKKyAgICBkZWYgX2R1bXBfc2VxdWVuY2VzKHNlbGYsIG1lc3NhZ2UsIGtleSk6CisgICAgICAgICIiIkluc3BlY3QgYSBuZXcgTUhNZXNzYWdlIGFuZCB1cGRhdGUgc2VxdWVuY2VzIGFwcHJvcHJpYXRlbHkuIiIiCisgICAgICAgIHBlbmRpbmdfc2VxdWVuY2VzID0gbWVzc2FnZS5nZXRfc2VxdWVuY2VzKCkKKyAgICAgICAgYWxsX3NlcXVlbmNlcyA9IHNlbGYuZ2V0X3NlcXVlbmNlcygpCisgICAgICAgIGZvciBuYW1lLCBrZXlfbGlzdCBpbiBhbGxfc2VxdWVuY2VzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYgbmFtZSBpbiBwZW5kaW5nX3NlcXVlbmNlczoKKyAgICAgICAgICAgICAgICBrZXlfbGlzdC5hcHBlbmQoa2V5KQorICAgICAgICAgICAgZWxpZiBrZXkgaW4ga2V5X2xpc3Q6CisgICAgICAgICAgICAgICAgZGVsIGtleV9saXN0W2tleV9saXN0LmluZGV4KGtleSldCisgICAgICAgIGZvciBzZXF1ZW5jZSBpbiBwZW5kaW5nX3NlcXVlbmNlczoKKyAgICAgICAgICAgIGlmIHNlcXVlbmNlIG5vdCBpbiBhbGxfc2VxdWVuY2VzOgorICAgICAgICAgICAgICAgIGFsbF9zZXF1ZW5jZXNbc2VxdWVuY2VdID0gW2tleV0KKyAgICAgICAgc2VsZi5zZXRfc2VxdWVuY2VzKGFsbF9zZXF1ZW5jZXMpCisKKworY2xhc3MgQmFieWwoX3NpbmdsZWZpbGVNYWlsYm94KToKKyAgICAiIiJBbiBSbWFpbC1zdHlsZSBCYWJ5bCBtYWlsYm94LiIiIgorCisgICAgX3NwZWNpYWxfbGFiZWxzID0gZnJvemVuc2V0KCgndW5zZWVuJywgJ2RlbGV0ZWQnLCAnZmlsZWQnLCAnYW5zd2VyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvcndhcmRlZCcsICdlZGl0ZWQnLCAncmVzZW50JykpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lLCBjcmVhdGU9VHJ1ZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBCYWJ5bCBtYWlsYm94LiIiIgorICAgICAgICBfc2luZ2xlZmlsZU1haWxib3guX19pbml0X18oc2VsZiwgcGF0aCwgZmFjdG9yeSwgY3JlYXRlKQorICAgICAgICBzZWxmLl9sYWJlbHMgPSB7fQorCisgICAgZGVmIGFkZChzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQWRkIG1lc3NhZ2UgYW5kIHJldHVybiBhc3NpZ25lZCBrZXkuIiIiCisgICAgICAgIGtleSA9IF9zaW5nbGVmaWxlTWFpbGJveC5hZGQoc2VsZiwgbWVzc2FnZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBCYWJ5bE1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5fbGFiZWxzW2tleV0gPSBtZXNzYWdlLmdldF9sYWJlbHMoKQorICAgICAgICByZXR1cm4ga2V5CisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJlbW92ZSB0aGUga2V5ZWQgbWVzc2FnZTsgcmFpc2UgS2V5RXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgX3NpbmdsZWZpbGVNYWlsYm94LnJlbW92ZShzZWxmLCBrZXkpCisgICAgICAgIGlmIGtleSBpbiBzZWxmLl9sYWJlbHM6CisgICAgICAgICAgICBkZWwgc2VsZi5fbGFiZWxzW2tleV0KKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIG1lc3NhZ2UpOgorICAgICAgICAiIiJSZXBsYWNlIHRoZSBrZXllZCBtZXNzYWdlOyByYWlzZSBLZXlFcnJvciBpZiBpdCBkb2Vzbid0IGV4aXN0LiIiIgorICAgICAgICBfc2luZ2xlZmlsZU1haWxib3guX19zZXRpdGVtX18oc2VsZiwga2V5LCBtZXNzYWdlKQorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIEJhYnlsTWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLl9sYWJlbHNba2V5XSA9IG1lc3NhZ2UuZ2V0X2xhYmVscygpCisKKyAgICBkZWYgZ2V0X21lc3NhZ2Uoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICBzdGFydCwgc3RvcCA9IHNlbGYuX2xvb2t1cChrZXkpCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzdGFydCkKKyAgICAgICAgc2VsZi5fZmlsZS5yZWFkbGluZSgpICAgIyBTa2lwICcxLCcgbGluZSBzcGVjaWZ5aW5nIGxhYmVscy4KKyAgICAgICAgb3JpZ2luYWxfaGVhZGVycyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gJyoqKiBFT09IICoqKicgKyBvcy5saW5lc2VwIG9yIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG9yaWdpbmFsX2hlYWRlcnMud3JpdGUobGluZS5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpKQorICAgICAgICB2aXNpYmxlX2hlYWRlcnMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5fZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBsaW5lID09IG9zLmxpbmVzZXAgb3IgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdmlzaWJsZV9oZWFkZXJzLndyaXRlKGxpbmUucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKSkKKyAgICAgICAgYm9keSA9IHNlbGYuX2ZpbGUucmVhZChzdG9wIC0gc2VsZi5fZmlsZS50ZWxsKCkpLnJlcGxhY2Uob3MubGluZXNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJykKKyAgICAgICAgbXNnID0gQmFieWxNZXNzYWdlKG9yaWdpbmFsX2hlYWRlcnMuZ2V0dmFsdWUoKSArIGJvZHkpCisgICAgICAgIG1zZy5zZXRfdmlzaWJsZSh2aXNpYmxlX2hlYWRlcnMuZ2V0dmFsdWUoKSkKKyAgICAgICAgaWYga2V5IGluIHNlbGYuX2xhYmVsczoKKyAgICAgICAgICAgIG1zZy5zZXRfbGFiZWxzKHNlbGYuX2xhYmVsc1trZXldKQorICAgICAgICByZXR1cm4gbXNnCisKKyAgICBkZWYgZ2V0X3N0cmluZyhzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgc3RhcnQsIHN0b3AgPSBzZWxmLl9sb29rdXAoa2V5KQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoc3RhcnQpCisgICAgICAgIHNlbGYuX2ZpbGUucmVhZGxpbmUoKSAgICMgU2tpcCAnMSwnIGxpbmUgc3BlY2lmeWluZyBsYWJlbHMuCisgICAgICAgIG9yaWdpbmFsX2hlYWRlcnMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5fZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBsaW5lID09ICcqKiogRU9PSCAqKionICsgb3MubGluZXNlcCBvciBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBvcmlnaW5hbF9oZWFkZXJzLndyaXRlKGxpbmUucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKSkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gb3MubGluZXNlcCBvciBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBvcmlnaW5hbF9oZWFkZXJzLmdldHZhbHVlKCkgKyBcCisgICAgICAgICAgICAgICBzZWxmLl9maWxlLnJlYWQoc3RvcCAtIHNlbGYuX2ZpbGUudGVsbCgpKS5yZXBsYWNlKG9zLmxpbmVzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbicpCisKKyAgICBkZWYgZ2V0X2ZpbGUoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgZmlsZS1saWtlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHJldHVybiBTdHJpbmdJTy5TdHJpbmdJTyhzZWxmLmdldF9zdHJpbmcoa2V5KS5yZXBsYWNlKCdcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmxpbmVzZXApKQorCisgICAgZGVmIGdldF9sYWJlbHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgdXNlci1kZWZpbmVkIGxhYmVscyBpbiB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgc2VsZi5fbG9va3VwKCkKKyAgICAgICAgbGFiZWxzID0gc2V0KCkKKyAgICAgICAgZm9yIGxhYmVsX2xpc3QgaW4gc2VsZi5fbGFiZWxzLnZhbHVlcygpOgorICAgICAgICAgICAgbGFiZWxzLnVwZGF0ZShsYWJlbF9saXN0KQorICAgICAgICBsYWJlbHMuZGlmZmVyZW5jZV91cGRhdGUoc2VsZi5fc3BlY2lhbF9sYWJlbHMpCisgICAgICAgIHJldHVybiBsaXN0KGxhYmVscykKKworICAgIGRlZiBfZ2VuZXJhdGVfdG9jKHNlbGYpOgorICAgICAgICAiIiJHZW5lcmF0ZSBrZXktdG8tKHN0YXJ0LCBzdG9wKSB0YWJsZSBvZiBjb250ZW50cy4iIiIKKyAgICAgICAgc3RhcnRzLCBzdG9wcyA9IFtdLCBbXQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoMCkKKyAgICAgICAgbmV4dF9wb3MgPSAwCisgICAgICAgIGxhYmVsX2xpc3RzID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmVfcG9zID0gbmV4dF9wb3MKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIG5leHRfcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gJ1wwMzdcMDE0JyArIG9zLmxpbmVzZXA6CisgICAgICAgICAgICAgICAgaWYgbGVuKHN0b3BzKSA8IGxlbihzdGFydHMpOgorICAgICAgICAgICAgICAgICAgICBzdG9wcy5hcHBlbmQobGluZV9wb3MgLSBsZW4ob3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgc3RhcnRzLmFwcGVuZChuZXh0X3BvcykKKyAgICAgICAgICAgICAgICBsYWJlbHMgPSBbbGFiZWwuc3RyaXAoKSBmb3IgbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzZWxmLl9maWxlLnJlYWRsaW5lKClbMTpdLnNwbGl0KCcsJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsYWJlbC5zdHJpcCgpICE9ICcnXQorICAgICAgICAgICAgICAgIGxhYmVsX2xpc3RzLmFwcGVuZChsYWJlbHMpCisgICAgICAgICAgICBlbGlmIGxpbmUgPT0gJ1wwMzcnIG9yIGxpbmUgPT0gJ1wwMzcnICsgb3MubGluZXNlcDoKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3RvcHMpIDwgbGVuKHN0YXJ0cyk6CisgICAgICAgICAgICAgICAgICAgIHN0b3BzLmFwcGVuZChsaW5lX3BvcyAtIGxlbihvcy5saW5lc2VwKSkKKyAgICAgICAgICAgIGVsaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICBzdG9wcy5hcHBlbmQobGluZV9wb3MgLSBsZW4ob3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5fdG9jID0gZGljdChlbnVtZXJhdGUoemlwKHN0YXJ0cywgc3RvcHMpKSkKKyAgICAgICAgc2VsZi5fbGFiZWxzID0gZGljdChlbnVtZXJhdGUobGFiZWxfbGlzdHMpKQorICAgICAgICBzZWxmLl9uZXh0X2tleSA9IGxlbihzZWxmLl90b2MpCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlaygwLCAyKQorICAgICAgICBzZWxmLl9maWxlX2xlbmd0aCA9IHNlbGYuX2ZpbGUudGVsbCgpCisKKyAgICBkZWYgX3ByZV9tYWlsYm94X2hvb2soc2VsZiwgZik6CisgICAgICAgICIiIkNhbGxlZCBiZWZvcmUgd3JpdGluZyB0aGUgbWFpbGJveCB0byBmaWxlIGYuIiIiCisgICAgICAgIGYud3JpdGUoJ0JBQllMIE9QVElPTlM6JXNWZXJzaW9uOiA1JXNMYWJlbHM6JXMlc1wwMzcnICUKKyAgICAgICAgICAgICAgICAob3MubGluZXNlcCwgb3MubGluZXNlcCwgJywnLmpvaW4oc2VsZi5nZXRfbGFiZWxzKCkpLAorICAgICAgICAgICAgICAgICBvcy5saW5lc2VwKSkKKworICAgIGRlZiBfcHJlX21lc3NhZ2VfaG9vayhzZWxmLCBmKToKKyAgICAgICAgIiIiQ2FsbGVkIGJlZm9yZSB3cml0aW5nIGVhY2ggbWVzc2FnZSB0byBmaWxlIGYuIiIiCisgICAgICAgIGYud3JpdGUoJ1wwMTQnICsgb3MubGluZXNlcCkKKworICAgIGRlZiBfcG9zdF9tZXNzYWdlX2hvb2soc2VsZiwgZik6CisgICAgICAgICIiIkNhbGxlZCBhZnRlciB3cml0aW5nIGVhY2ggbWVzc2FnZSB0byBmaWxlIGYuIiIiCisgICAgICAgIGYud3JpdGUob3MubGluZXNlcCArICdcMDM3JykKKworICAgIGRlZiBfaW5zdGFsbF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJXcml0ZSBtZXNzYWdlIGNvbnRlbnRzIGFuZCByZXR1cm4gKHN0YXJ0LCBzdG9wKS4iIiIKKyAgICAgICAgc3RhcnQgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIEJhYnlsTWVzc2FnZSk6CisgICAgICAgICAgICBzcGVjaWFsX2xhYmVscyA9IFtdCisgICAgICAgICAgICBsYWJlbHMgPSBbXQorICAgICAgICAgICAgZm9yIGxhYmVsIGluIG1lc3NhZ2UuZ2V0X2xhYmVscygpOgorICAgICAgICAgICAgICAgIGlmIGxhYmVsIGluIHNlbGYuX3NwZWNpYWxfbGFiZWxzOgorICAgICAgICAgICAgICAgICAgICBzcGVjaWFsX2xhYmVscy5hcHBlbmQobGFiZWwpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmFwcGVuZChsYWJlbCkKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJzEnKQorICAgICAgICAgICAgZm9yIGxhYmVsIGluIHNwZWNpYWxfbGFiZWxzOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJywgJyArIGxhYmVsKQorICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnLCwnKQorICAgICAgICAgICAgZm9yIGxhYmVsIGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKCcgJyArIGxhYmVsICsgJywnKQorICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShvcy5saW5lc2VwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnMSwsJyArIG9zLmxpbmVzZXApCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgZW1haWwubWVzc2FnZS5NZXNzYWdlKToKKyAgICAgICAgICAgIG9yaWdfYnVmZmVyID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgb3JpZ19nZW5lcmF0b3IgPSBlbWFpbC5nZW5lcmF0b3IuR2VuZXJhdG9yKG9yaWdfYnVmZmVyLCBGYWxzZSwgMCkKKyAgICAgICAgICAgIG9yaWdfZ2VuZXJhdG9yLmZsYXR0ZW4obWVzc2FnZSkKKyAgICAgICAgICAgIG9yaWdfYnVmZmVyLnNlZWsoMCkKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgbGluZSA9IG9yaWdfYnVmZmVyLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKGxpbmUucmVwbGFjZSgnXG4nLCBvcy5saW5lc2VwKSkKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICdcbicgb3IgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJyoqKiBFT09IICoqKicgKyBvcy5saW5lc2VwKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBCYWJ5bE1lc3NhZ2UpOgorICAgICAgICAgICAgICAgIHZpc19idWZmZXIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICAgICAgdmlzX2dlbmVyYXRvciA9IGVtYWlsLmdlbmVyYXRvci5HZW5lcmF0b3IodmlzX2J1ZmZlciwgRmFsc2UsIDApCisgICAgICAgICAgICAgICAgdmlzX2dlbmVyYXRvci5mbGF0dGVuKG1lc3NhZ2UuZ2V0X3Zpc2libGUoKSkKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gdmlzX2J1ZmZlci5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUobGluZS5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lID09ICdcbicgb3IgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9yaWdfYnVmZmVyLnNlZWsoMCkKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gb3JpZ19idWZmZXIucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKGxpbmUucmVwbGFjZSgnXG4nLCBvcy5saW5lc2VwKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnXG4nIG9yIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBvcmlnX2J1ZmZlci5yZWFkKDQwOTYpICMgQnVmZmVyIHNpemUgaXMgYXJiaXRyYXJ5LgorICAgICAgICAgICAgICAgIGlmIGJ1ZmZlciA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKGJ1ZmZlci5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgc3RyKToKKyAgICAgICAgICAgIGJvZHlfc3RhcnQgPSBtZXNzYWdlLmZpbmQoJ1xuXG4nKSArIDIKKyAgICAgICAgICAgIGlmIGJvZHlfc3RhcnQgLSAyICE9IC0xOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUobWVzc2FnZVs6Ym9keV9zdGFydF0ucmVwbGFjZSgnXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5saW5lc2VwKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKCcqKiogRU9PSCAqKionICsgb3MubGluZXNlcCkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKG1lc3NhZ2VbOmJvZHlfc3RhcnRdLnJlcGxhY2UoJ1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShtZXNzYWdlW2JvZHlfc3RhcnQ6XS5yZXBsYWNlKCdcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmxpbmVzZXApKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKCcqKiogRU9PSCAqKionICsgb3MubGluZXNlcCArIG9zLmxpbmVzZXApCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShtZXNzYWdlLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkpCisgICAgICAgIGVsaWYgaGFzYXR0cihtZXNzYWdlLCAncmVhZGxpbmUnKToKKyAgICAgICAgICAgIG9yaWdpbmFsX3BvcyA9IG1lc3NhZ2UudGVsbCgpCisgICAgICAgICAgICBmaXJzdF9wYXNzID0gVHJ1ZQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gbWVzc2FnZS5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShsaW5lLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnXG4nIG9yIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgIGlmIGZpcnN0X3Bhc3M6CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9wYXNzID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJyoqKiBFT09IICoqKicgKyBvcy5saW5lc2VwKQorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zZWVrKG9yaWdpbmFsX3BvcykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG1lc3NhZ2UucmVhZCg0MDk2KSAgICAgIyBCdWZmZXIgc2l6ZSBpcyBhcmJpdHJhcnkuCisgICAgICAgICAgICAgICAgaWYgYnVmZmVyID09ICcnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoYnVmZmVyLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0ludmFsaWQgbWVzc2FnZSB0eXBlOiAlcycgJSB0eXBlKG1lc3NhZ2UpKQorICAgICAgICBzdG9wID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgcmV0dXJuIChzdGFydCwgc3RvcCkKKworCitjbGFzcyBNZXNzYWdlKGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSk6CisgICAgIiIiTWVzc2FnZSB3aXRoIG1haWxib3gtZm9ybWF0LXNwZWNpZmljIHByb3BlcnRpZXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIE1lc3NhZ2UgaW5zdGFuY2UuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgZW1haWwubWVzc2FnZS5NZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuX2JlY29tZV9tZXNzYWdlKGNvcHkuZGVlcGNvcHkobWVzc2FnZSkpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1lc3NhZ2UpOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuX2V4cGxhaW5fdG8oc2VsZikKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIHN0cik6CisgICAgICAgICAgICBzZWxmLl9iZWNvbWVfbWVzc2FnZShlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG1lc3NhZ2UpKQorICAgICAgICBlbGlmIGhhc2F0dHIobWVzc2FnZSwgInJlYWQiKToKKyAgICAgICAgICAgIHNlbGYuX2JlY29tZV9tZXNzYWdlKGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKG1lc3NhZ2UpKQorICAgICAgICBlbGlmIG1lc3NhZ2UgaXMgTm9uZToKKyAgICAgICAgICAgIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZS5fX2luaXRfXyhzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdJbnZhbGlkIG1lc3NhZ2UgdHlwZTogJXMnICUgdHlwZShtZXNzYWdlKSkKKworICAgIGRlZiBfYmVjb21lX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkFzc3VtZSB0aGUgbm9uLWZvcm1hdC1zcGVjaWZpYyBzdGF0ZSBvZiBtZXNzYWdlLiIiIgorICAgICAgICBmb3IgbmFtZSBpbiAoJ19oZWFkZXJzJywgJ191bml4ZnJvbScsICdfcGF5bG9hZCcsICdfY2hhcnNldCcsCisgICAgICAgICAgICAgICAgICAgICAncHJlYW1ibGUnLCAnZXBpbG9ndWUnLCAnZGVmZWN0cycsICdfZGVmYXVsdF90eXBlJyk6CisgICAgICAgICAgICBzZWxmLl9fZGljdF9fW25hbWVdID0gbWVzc2FnZS5fX2RpY3RfX1tuYW1lXQorCisgICAgZGVmIF9leHBsYWluX3RvKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJDb3B5IGZvcm1hdC1zcGVjaWZpYyBzdGF0ZSB0byBtZXNzYWdlIGluc29mYXIgYXMgcG9zc2libGUuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWVzc2FnZSk6CisgICAgICAgICAgICByZXR1cm4gICMgVGhlcmUncyBub3RoaW5nIGZvcm1hdC1zcGVjaWZpYyB0byBleHBsYWluLgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB0byBzcGVjaWZpZWQgdHlwZScpCisKKworY2xhc3MgTWFpbGRpck1lc3NhZ2UoTWVzc2FnZSk6CisgICAgIiIiTWVzc2FnZSB3aXRoIE1haWxkaXItc3BlY2lmaWMgcHJvcGVydGllcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgTWFpbGRpck1lc3NhZ2UgaW5zdGFuY2UuIiIiCisgICAgICAgIHNlbGYuX3N1YmRpciA9ICduZXcnCisgICAgICAgIHNlbGYuX2luZm8gPSAnJworICAgICAgICBzZWxmLl9kYXRlID0gdGltZS50aW1lKCkKKyAgICAgICAgTWVzc2FnZS5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorCisgICAgZGVmIGdldF9zdWJkaXIoc2VsZik6CisgICAgICAgICIiIlJldHVybiAnbmV3JyBvciAnY3VyJy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3N1YmRpcgorCisgICAgZGVmIHNldF9zdWJkaXIoc2VsZiwgc3ViZGlyKToKKyAgICAgICAgIiIiU2V0IHN1YmRpciB0byAnbmV3JyBvciAnY3VyJy4iIiIKKyAgICAgICAgaWYgc3ViZGlyID09ICduZXcnIG9yIHN1YmRpciA9PSAnY3VyJzoKKyAgICAgICAgICAgIHNlbGYuX3N1YmRpciA9IHN1YmRpcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3ViZGlyIG11c3QgYmUgJ25ldycgb3IgJ2N1cic6ICVzIiAlIHN1YmRpcikKKworICAgIGRlZiBnZXRfZmxhZ3Moc2VsZik6CisgICAgICAgICIiIlJldHVybiBhcyBhIHN0cmluZyB0aGUgZmxhZ3MgdGhhdCBhcmUgc2V0LiIiIgorICAgICAgICBpZiBzZWxmLl9pbmZvLnN0YXJ0c3dpdGgoJzIsJyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5faW5mb1syOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnJworCisgICAgZGVmIHNldF9mbGFncyhzZWxmLCBmbGFncyk6CisgICAgICAgICIiIlNldCB0aGUgZ2l2ZW4gZmxhZ3MgYW5kIHVuc2V0IGFsbCBvdGhlcnMuIiIiCisgICAgICAgIHNlbGYuX2luZm8gPSAnMiwnICsgJycuam9pbihzb3J0ZWQoZmxhZ3MpKQorCisgICAgZGVmIGFkZF9mbGFnKHNlbGYsIGZsYWcpOgorICAgICAgICAiIiJTZXQgdGhlIGdpdmVuIGZsYWcocykgd2l0aG91dCBjaGFuZ2luZyBvdGhlcnMuIiIiCisgICAgICAgIHNlbGYuc2V0X2ZsYWdzKCcnLmpvaW4oc2V0KHNlbGYuZ2V0X2ZsYWdzKCkpIHwgc2V0KGZsYWcpKSkKKworICAgIGRlZiByZW1vdmVfZmxhZyhzZWxmLCBmbGFnKToKKyAgICAgICAgIiIiVW5zZXQgdGhlIGdpdmVuIHN0cmluZyBmbGFnKHMpIHdpdGhvdXQgY2hhbmdpbmcgb3RoZXJzLiIiIgorICAgICAgICBpZiBzZWxmLmdldF9mbGFncygpICE9ICcnOgorICAgICAgICAgICAgc2VsZi5zZXRfZmxhZ3MoJycuam9pbihzZXQoc2VsZi5nZXRfZmxhZ3MoKSkgLSBzZXQoZmxhZykpKQorCisgICAgZGVmIGdldF9kYXRlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gZGVsaXZlcnkgZGF0ZSBvZiBtZXNzYWdlLCBpbiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGUKKworICAgIGRlZiBzZXRfZGF0ZShzZWxmLCBkYXRlKToKKyAgICAgICAgIiIiU2V0IGRlbGl2ZXJ5IGRhdGUgb2YgbWVzc2FnZSwgaW4gc2Vjb25kcyBzaW5jZSB0aGUgZXBvY2guIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2RhdGUgPSBmbG9hdChkYXRlKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2FuJ3QgY29udmVydCB0byBmbG9hdDogJXMiICUgZGF0ZSkKKworICAgIGRlZiBnZXRfaW5mbyhzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBtZXNzYWdlJ3MgImluZm8iIGFzIGEgc3RyaW5nLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5faW5mbworCisgICAgZGVmIHNldF9pbmZvKHNlbGYsIGluZm8pOgorICAgICAgICAiIiJTZXQgdGhlIG1lc3NhZ2UncyAiaW5mbyIgc3RyaW5nLiIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKGluZm8sIHN0cik6CisgICAgICAgICAgICBzZWxmLl9pbmZvID0gaW5mbworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdpbmZvIG11c3QgYmUgYSBzdHJpbmc6ICVzJyAlIHR5cGUoaW5mbykpCisKKyAgICBkZWYgX2V4cGxhaW5fdG8oc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkNvcHkgTWFpbGRpci1zcGVjaWZpYyBzdGF0ZSB0byBtZXNzYWdlIGluc29mYXIgYXMgcG9zc2libGUuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWFpbGRpck1lc3NhZ2UpOgorICAgICAgICAgICAgbWVzc2FnZS5zZXRfZmxhZ3Moc2VsZi5nZXRfZmxhZ3MoKSkKKyAgICAgICAgICAgIG1lc3NhZ2Uuc2V0X3N1YmRpcihzZWxmLmdldF9zdWJkaXIoKSkKKyAgICAgICAgICAgIG1lc3NhZ2Uuc2V0X2RhdGUoc2VsZi5nZXRfZGF0ZSgpKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgX21ib3hNTURGTWVzc2FnZSk6CisgICAgICAgICAgICBmbGFncyA9IHNldChzZWxmLmdldF9mbGFncygpKQorICAgICAgICAgICAgaWYgJ1MnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ1InKQorICAgICAgICAgICAgaWYgc2VsZi5nZXRfc3ViZGlyKCkgPT0gJ2N1cic6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnTycpCisgICAgICAgICAgICBpZiAnVCcgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnRCcpCisgICAgICAgICAgICBpZiAnRicgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnRicpCisgICAgICAgICAgICBpZiAnUicgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnQScpCisgICAgICAgICAgICBtZXNzYWdlLnNldF9mcm9tKCdNQUlMRVItREFFTU9OJywgdGltZS5nbXRpbWUoc2VsZi5nZXRfZGF0ZSgpKSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1ITWVzc2FnZSk6CisgICAgICAgICAgICBmbGFncyA9IHNldChzZWxmLmdldF9mbGFncygpKQorICAgICAgICAgICAgaWYgJ1MnIG5vdCBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9zZXF1ZW5jZSgndW5zZWVuJykKKyAgICAgICAgICAgIGlmICdSJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9zZXF1ZW5jZSgncmVwbGllZCcpCisgICAgICAgICAgICBpZiAnRicgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgQmFieWxNZXNzYWdlKToKKyAgICAgICAgICAgIGZsYWdzID0gc2V0KHNlbGYuZ2V0X2ZsYWdzKCkpCisgICAgICAgICAgICBpZiAnUycgbm90IGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2xhYmVsKCd1bnNlZW4nKQorICAgICAgICAgICAgaWYgJ1QnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2xhYmVsKCdkZWxldGVkJykKKyAgICAgICAgICAgIGlmICdSJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9sYWJlbCgnYW5zd2VyZWQnKQorICAgICAgICAgICAgaWYgJ1AnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2xhYmVsKCdmb3J3YXJkZWQnKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWVzc2FnZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHRvIHNwZWNpZmllZCB0eXBlOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUobWVzc2FnZSkpCisKKworY2xhc3MgX21ib3hNTURGTWVzc2FnZShNZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggbWJveC0gb3IgTU1ERi1zcGVjaWZpYyBwcm9wZXJ0aWVzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYW4gbWJveE1NREZNZXNzYWdlIGluc3RhbmNlLiIiIgorICAgICAgICBzZWxmLnNldF9mcm9tKCdNQUlMRVItREFFTU9OJywgVHJ1ZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UpOgorICAgICAgICAgICAgdW5peGZyb20gPSBtZXNzYWdlLmdldF91bml4ZnJvbSgpCisgICAgICAgICAgICBpZiB1bml4ZnJvbSBpcyBub3QgTm9uZSBhbmQgdW5peGZyb20uc3RhcnRzd2l0aCgnRnJvbSAnKToKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9mcm9tKHVuaXhmcm9tWzU6XSkKKyAgICAgICAgTWVzc2FnZS5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorCisgICAgZGVmIGdldF9mcm9tKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gY29udGVudHMgb2YgIkZyb20gIiBsaW5lLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZnJvbQorCisgICAgZGVmIHNldF9mcm9tKHNlbGYsIGZyb21fLCB0aW1lXz1Ob25lKToKKyAgICAgICAgIiIiU2V0ICJGcm9tICIgbGluZSwgZm9ybWF0dGluZyBhbmQgYXBwZW5kaW5nIHRpbWVfIGlmIHNwZWNpZmllZC4iIiIKKyAgICAgICAgaWYgdGltZV8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiB0aW1lXyBpcyBUcnVlOgorICAgICAgICAgICAgICAgIHRpbWVfID0gdGltZS5nbXRpbWUoKQorICAgICAgICAgICAgZnJvbV8gKz0gJyAnICsgdGltZS5hc2N0aW1lKHRpbWVfKQorICAgICAgICBzZWxmLl9mcm9tID0gZnJvbV8KKworICAgIGRlZiBnZXRfZmxhZ3Moc2VsZik6CisgICAgICAgICIiIlJldHVybiBhcyBhIHN0cmluZyB0aGUgZmxhZ3MgdGhhdCBhcmUgc2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXQoJ1N0YXR1cycsICcnKSArIHNlbGYuZ2V0KCdYLVN0YXR1cycsICcnKQorCisgICAgZGVmIHNldF9mbGFncyhzZWxmLCBmbGFncyk6CisgICAgICAgICIiIlNldCB0aGUgZ2l2ZW4gZmxhZ3MgYW5kIHVuc2V0IGFsbCBvdGhlcnMuIiIiCisgICAgICAgIGZsYWdzID0gc2V0KGZsYWdzKQorICAgICAgICBzdGF0dXNfZmxhZ3MsIHhzdGF0dXNfZmxhZ3MgPSAnJywgJycKKyAgICAgICAgZm9yIGZsYWcgaW4gKCdSJywgJ08nKToKKyAgICAgICAgICAgIGlmIGZsYWcgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgc3RhdHVzX2ZsYWdzICs9IGZsYWcKKyAgICAgICAgICAgICAgICBmbGFncy5yZW1vdmUoZmxhZykKKyAgICAgICAgZm9yIGZsYWcgaW4gKCdEJywgJ0YnLCAnQScpOgorICAgICAgICAgICAgaWYgZmxhZyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICB4c3RhdHVzX2ZsYWdzICs9IGZsYWcKKyAgICAgICAgICAgICAgICBmbGFncy5yZW1vdmUoZmxhZykKKyAgICAgICAgeHN0YXR1c19mbGFncyArPSAnJy5qb2luKHNvcnRlZChmbGFncykpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucmVwbGFjZV9oZWFkZXIoJ1N0YXR1cycsIHN0YXR1c19mbGFncykKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZi5hZGRfaGVhZGVyKCdTdGF0dXMnLCBzdGF0dXNfZmxhZ3MpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucmVwbGFjZV9oZWFkZXIoJ1gtU3RhdHVzJywgeHN0YXR1c19mbGFncykKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZi5hZGRfaGVhZGVyKCdYLVN0YXR1cycsIHhzdGF0dXNfZmxhZ3MpCisKKyAgICBkZWYgYWRkX2ZsYWcoc2VsZiwgZmxhZyk6CisgICAgICAgICIiIlNldCB0aGUgZ2l2ZW4gZmxhZyhzKSB3aXRob3V0IGNoYW5naW5nIG90aGVycy4iIiIKKyAgICAgICAgc2VsZi5zZXRfZmxhZ3MoJycuam9pbihzZXQoc2VsZi5nZXRfZmxhZ3MoKSkgfCBzZXQoZmxhZykpKQorCisgICAgZGVmIHJlbW92ZV9mbGFnKHNlbGYsIGZsYWcpOgorICAgICAgICAiIiJVbnNldCB0aGUgZ2l2ZW4gc3RyaW5nIGZsYWcocykgd2l0aG91dCBjaGFuZ2luZyBvdGhlcnMuIiIiCisgICAgICAgIGlmICdTdGF0dXMnIGluIHNlbGYgb3IgJ1gtU3RhdHVzJyBpbiBzZWxmOgorICAgICAgICAgICAgc2VsZi5zZXRfZmxhZ3MoJycuam9pbihzZXQoc2VsZi5nZXRfZmxhZ3MoKSkgLSBzZXQoZmxhZykpKQorCisgICAgZGVmIF9leHBsYWluX3RvKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJDb3B5IG1ib3gtIG9yIE1NREYtc3BlY2lmaWMgc3RhdGUgdG8gbWVzc2FnZSBpbnNvZmFyIGFzIHBvc3NpYmxlLiIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1haWxkaXJNZXNzYWdlKToKKyAgICAgICAgICAgIGZsYWdzID0gc2V0KHNlbGYuZ2V0X2ZsYWdzKCkpCisgICAgICAgICAgICBpZiAnTycgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRfc3ViZGlyKCdjdXInKQorICAgICAgICAgICAgaWYgJ0YnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ0YnKQorICAgICAgICAgICAgaWYgJ0EnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ1InKQorICAgICAgICAgICAgaWYgJ1InIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ1MnKQorICAgICAgICAgICAgaWYgJ0QnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ1QnKQorICAgICAgICAgICAgZGVsIG1lc3NhZ2VbJ3N0YXR1cyddCisgICAgICAgICAgICBkZWwgbWVzc2FnZVsneC1zdGF0dXMnXQorICAgICAgICAgICAgbWF5YmVfZGF0ZSA9ICcgJy5qb2luKHNlbGYuZ2V0X2Zyb20oKS5zcGxpdCgpWy01Ol0pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRfZGF0ZShjYWxlbmRhci50aW1lZ20odGltZS5zdHJwdGltZShtYXliZV9kYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVhICViICVkICVIOiVNOiVTICVZJykpKQorICAgICAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBfbWJveE1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIG1lc3NhZ2Uuc2V0X2ZsYWdzKHNlbGYuZ2V0X2ZsYWdzKCkpCisgICAgICAgICAgICBtZXNzYWdlLnNldF9mcm9tKHNlbGYuZ2V0X2Zyb20oKSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1ITWVzc2FnZSk6CisgICAgICAgICAgICBmbGFncyA9IHNldChzZWxmLmdldF9mbGFncygpKQorICAgICAgICAgICAgaWYgJ1InIG5vdCBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9zZXF1ZW5jZSgndW5zZWVuJykKKyAgICAgICAgICAgIGlmICdBJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9zZXF1ZW5jZSgncmVwbGllZCcpCisgICAgICAgICAgICBpZiAnRicgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQorICAgICAgICAgICAgZGVsIG1lc3NhZ2VbJ3N0YXR1cyddCisgICAgICAgICAgICBkZWwgbWVzc2FnZVsneC1zdGF0dXMnXQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgQmFieWxNZXNzYWdlKToKKyAgICAgICAgICAgIGZsYWdzID0gc2V0KHNlbGYuZ2V0X2ZsYWdzKCkpCisgICAgICAgICAgICBpZiAnUicgbm90IGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2xhYmVsKCd1bnNlZW4nKQorICAgICAgICAgICAgaWYgJ0QnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2xhYmVsKCdkZWxldGVkJykKKyAgICAgICAgICAgIGlmICdBJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9sYWJlbCgnYW5zd2VyZWQnKQorICAgICAgICAgICAgZGVsIG1lc3NhZ2VbJ3N0YXR1cyddCisgICAgICAgICAgICBkZWwgbWVzc2FnZVsneC1zdGF0dXMnXQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWVzc2FnZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHRvIHNwZWNpZmllZCB0eXBlOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUobWVzc2FnZSkpCisKKworY2xhc3MgbWJveE1lc3NhZ2UoX21ib3hNTURGTWVzc2FnZSk6CisgICAgIiIiTWVzc2FnZSB3aXRoIG1ib3gtc3BlY2lmaWMgcHJvcGVydGllcy4iIiIKKworCitjbGFzcyBNSE1lc3NhZ2UoTWVzc2FnZSk6CisgICAgIiIiTWVzc2FnZSB3aXRoIE1ILXNwZWNpZmljIHByb3BlcnRpZXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBNSE1lc3NhZ2UgaW5zdGFuY2UuIiIiCisgICAgICAgIHNlbGYuX3NlcXVlbmNlcyA9IFtdCisgICAgICAgIE1lc3NhZ2UuX19pbml0X18oc2VsZiwgbWVzc2FnZSkKKworICAgIGRlZiBnZXRfc2VxdWVuY2VzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHNlcXVlbmNlcyB0aGF0IGluY2x1ZGUgdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9zZXF1ZW5jZXNbOl0KKworICAgIGRlZiBzZXRfc2VxdWVuY2VzKHNlbGYsIHNlcXVlbmNlcyk6CisgICAgICAgICIiIlNldCB0aGUgbGlzdCBvZiBzZXF1ZW5jZXMgdGhhdCBpbmNsdWRlIHRoZSBtZXNzYWdlLiIiIgorICAgICAgICBzZWxmLl9zZXF1ZW5jZXMgPSBsaXN0KHNlcXVlbmNlcykKKworICAgIGRlZiBhZGRfc2VxdWVuY2Uoc2VsZiwgc2VxdWVuY2UpOgorICAgICAgICAiIiJBZGQgc2VxdWVuY2UgdG8gbGlzdCBvZiBzZXF1ZW5jZXMgaW5jbHVkaW5nIHRoZSBtZXNzYWdlLiIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlcXVlbmNlLCBzdHIpOgorICAgICAgICAgICAgaWYgbm90IHNlcXVlbmNlIGluIHNlbGYuX3NlcXVlbmNlczoKKyAgICAgICAgICAgICAgICBzZWxmLl9zZXF1ZW5jZXMuYXBwZW5kKHNlcXVlbmNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdzZXF1ZW5jZSBtdXN0IGJlIGEgc3RyaW5nOiAlcycgJSB0eXBlKHNlcXVlbmNlKSkKKworICAgIGRlZiByZW1vdmVfc2VxdWVuY2Uoc2VsZiwgc2VxdWVuY2UpOgorICAgICAgICAiIiJSZW1vdmUgc2VxdWVuY2UgZnJvbSB0aGUgbGlzdCBvZiBzZXF1ZW5jZXMgaW5jbHVkaW5nIHRoZSBtZXNzYWdlLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9zZXF1ZW5jZXMucmVtb3ZlKHNlcXVlbmNlKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfZXhwbGFpbl90byhzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQ29weSBNSC1zcGVjaWZpYyBzdGF0ZSB0byBtZXNzYWdlIGluc29mYXIgYXMgcG9zc2libGUuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWFpbGRpck1lc3NhZ2UpOgorICAgICAgICAgICAgc2VxdWVuY2VzID0gc2V0KHNlbGYuZ2V0X3NlcXVlbmNlcygpKQorICAgICAgICAgICAgaWYgJ3Vuc2VlbicgaW4gc2VxdWVuY2VzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0X3N1YmRpcignY3VyJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRfc3ViZGlyKCdjdXInKQorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ1MnKQorICAgICAgICAgICAgaWYgJ2ZsYWdnZWQnIGluIHNlcXVlbmNlczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdGJykKKyAgICAgICAgICAgIGlmICdyZXBsaWVkJyBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUicpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBfbWJveE1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIHNlcXVlbmNlcyA9IHNldChzZWxmLmdldF9zZXF1ZW5jZXMoKSkKKyAgICAgICAgICAgIGlmICd1bnNlZW4nIG5vdCBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUk8nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdPJykKKyAgICAgICAgICAgIGlmICdmbGFnZ2VkJyBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnRicpCisgICAgICAgICAgICBpZiAncmVwbGllZCcgaW4gc2VxdWVuY2VzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ0EnKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTUhNZXNzYWdlKToKKyAgICAgICAgICAgIGZvciBzZXF1ZW5jZSBpbiBzZWxmLmdldF9zZXF1ZW5jZXMoKToKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9zZXF1ZW5jZShzZXF1ZW5jZSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIEJhYnlsTWVzc2FnZSk6CisgICAgICAgICAgICBzZXF1ZW5jZXMgPSBzZXQoc2VsZi5nZXRfc2VxdWVuY2VzKCkpCisgICAgICAgICAgICBpZiAndW5zZWVuJyBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ3Vuc2VlbicpCisgICAgICAgICAgICBpZiAncmVwbGllZCcgaW4gc2VxdWVuY2VzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2xhYmVsKCdhbnN3ZXJlZCcpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdG8gc3BlY2lmaWVkIHR5cGU6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShtZXNzYWdlKSkKKworCitjbGFzcyBCYWJ5bE1lc3NhZ2UoTWVzc2FnZSk6CisgICAgIiIiTWVzc2FnZSB3aXRoIEJhYnlsLXNwZWNpZmljIHByb3BlcnRpZXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBCYWJ5bE1lc3NhZ2UgaW5zdGFuY2UuIiIiCisgICAgICAgIHNlbGYuX2xhYmVscyA9IFtdCisgICAgICAgIHNlbGYuX3Zpc2libGUgPSBNZXNzYWdlKCkKKyAgICAgICAgTWVzc2FnZS5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorCisgICAgZGVmIGdldF9sYWJlbHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgbGFiZWxzIG9uIHRoZSBtZXNzYWdlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fbGFiZWxzWzpdCisKKyAgICBkZWYgc2V0X2xhYmVscyhzZWxmLCBsYWJlbHMpOgorICAgICAgICAiIiJTZXQgdGhlIGxpc3Qgb2YgbGFiZWxzIG9uIHRoZSBtZXNzYWdlLiIiIgorICAgICAgICBzZWxmLl9sYWJlbHMgPSBsaXN0KGxhYmVscykKKworICAgIGRlZiBhZGRfbGFiZWwoc2VsZiwgbGFiZWwpOgorICAgICAgICAiIiJBZGQgbGFiZWwgdG8gbGlzdCBvZiBsYWJlbHMgb24gdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UobGFiZWwsIHN0cik6CisgICAgICAgICAgICBpZiBsYWJlbCBub3QgaW4gc2VsZi5fbGFiZWxzOgorICAgICAgICAgICAgICAgIHNlbGYuX2xhYmVscy5hcHBlbmQobGFiZWwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2xhYmVsIG11c3QgYmUgYSBzdHJpbmc6ICVzJyAlIHR5cGUobGFiZWwpKQorCisgICAgZGVmIHJlbW92ZV9sYWJlbChzZWxmLCBsYWJlbCk6CisgICAgICAgICIiIlJlbW92ZSBsYWJlbCBmcm9tIHRoZSBsaXN0IG9mIGxhYmVscyBvbiB0aGUgbWVzc2FnZS4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fbGFiZWxzLnJlbW92ZShsYWJlbCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2V0X3Zpc2libGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIE1lc3NhZ2UgcmVwcmVzZW50YXRpb24gb2YgdmlzaWJsZSBoZWFkZXJzLiIiIgorICAgICAgICByZXR1cm4gTWVzc2FnZShzZWxmLl92aXNpYmxlKQorCisgICAgZGVmIHNldF92aXNpYmxlKHNlbGYsIHZpc2libGUpOgorICAgICAgICAiIiJTZXQgdGhlIE1lc3NhZ2UgcmVwcmVzZW50YXRpb24gb2YgdmlzaWJsZSBoZWFkZXJzLiIiIgorICAgICAgICBzZWxmLl92aXNpYmxlID0gTWVzc2FnZSh2aXNpYmxlKQorCisgICAgZGVmIHVwZGF0ZV92aXNpYmxlKHNlbGYpOgorICAgICAgICAiIiJVcGRhdGUgYW5kL29yIHNlbnNpYmx5IGdlbmVyYXRlIGEgc2V0IG9mIHZpc2libGUgaGVhZGVycy4iIiIKKyAgICAgICAgZm9yIGhlYWRlciBpbiBzZWxmLl92aXNpYmxlLmtleXMoKToKKyAgICAgICAgICAgIGlmIGhlYWRlciBpbiBzZWxmOgorICAgICAgICAgICAgICAgIHNlbGYuX3Zpc2libGUucmVwbGFjZV9oZWFkZXIoaGVhZGVyLCBzZWxmW2hlYWRlcl0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl92aXNpYmxlW2hlYWRlcl0KKyAgICAgICAgZm9yIGhlYWRlciBpbiAoJ0RhdGUnLCAnRnJvbScsICdSZXBseS1UbycsICdUbycsICdDQycsICdTdWJqZWN0Jyk6CisgICAgICAgICAgICBpZiBoZWFkZXIgaW4gc2VsZiBhbmQgaGVhZGVyIG5vdCBpbiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgICAgIHNlbGYuX3Zpc2libGVbaGVhZGVyXSA9IHNlbGZbaGVhZGVyXQorCisgICAgZGVmIF9leHBsYWluX3RvKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJDb3B5IEJhYnlsLXNwZWNpZmljIHN0YXRlIHRvIG1lc3NhZ2UgaW5zb2ZhciBhcyBwb3NzaWJsZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNYWlsZGlyTWVzc2FnZSk6CisgICAgICAgICAgICBsYWJlbHMgPSBzZXQoc2VsZi5nZXRfbGFiZWxzKCkpCisgICAgICAgICAgICBpZiAndW5zZWVuJyBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRfc3ViZGlyKCdjdXInKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNldF9zdWJkaXIoJ2N1cicpCisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUycpCisgICAgICAgICAgICBpZiAnZm9yd2FyZGVkJyBpbiBsYWJlbHMgb3IgJ3Jlc2VudCcgaW4gbGFiZWxzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ1AnKQorICAgICAgICAgICAgaWYgJ2Fuc3dlcmVkJyBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUicpCisgICAgICAgICAgICBpZiAnZGVsZXRlZCcgaW4gbGFiZWxzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ1QnKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgX21ib3hNTURGTWVzc2FnZSk6CisgICAgICAgICAgICBsYWJlbHMgPSBzZXQoc2VsZi5nZXRfbGFiZWxzKCkpCisgICAgICAgICAgICBpZiAndW5zZWVuJyBub3QgaW4gbGFiZWxzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ1JPJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnTycpCisgICAgICAgICAgICBpZiAnZGVsZXRlZCcgaW4gbGFiZWxzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ0QnKQorICAgICAgICAgICAgaWYgJ2Fuc3dlcmVkJyBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnQScpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNSE1lc3NhZ2UpOgorICAgICAgICAgICAgbGFiZWxzID0gc2V0KHNlbGYuZ2V0X2xhYmVscygpKQorICAgICAgICAgICAgaWYgJ3Vuc2VlbicgaW4gbGFiZWxzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQorICAgICAgICAgICAgaWYgJ2Fuc3dlcmVkJyBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfc2VxdWVuY2UoJ3JlcGxpZWQnKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgQmFieWxNZXNzYWdlKToKKyAgICAgICAgICAgIG1lc3NhZ2Uuc2V0X3Zpc2libGUoc2VsZi5nZXRfdmlzaWJsZSgpKQorICAgICAgICAgICAgZm9yIGxhYmVsIGluIHNlbGYuZ2V0X2xhYmVscygpOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2xhYmVsKGxhYmVsKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWVzc2FnZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHRvIHNwZWNpZmllZCB0eXBlOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUobWVzc2FnZSkpCisKKworY2xhc3MgTU1ERk1lc3NhZ2UoX21ib3hNTURGTWVzc2FnZSk6CisgICAgIiIiTWVzc2FnZSB3aXRoIE1NREYtc3BlY2lmaWMgcHJvcGVydGllcy4iIiIKKworCitjbGFzcyBfUHJveHlGaWxlOgorICAgICIiIkEgcmVhZC1vbmx5IHdyYXBwZXIgb2YgYSBmaWxlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGYsIHBvcz1Ob25lKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIF9Qcm94eUZpbGUuIiIiCisgICAgICAgIHNlbGYuX2ZpbGUgPSBmCisgICAgICAgIGlmIHBvcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fcG9zID0gZi50ZWxsKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3BvcyA9IHBvcworCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT1Ob25lKToKKyAgICAgICAgIiIiUmVhZCBieXRlcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWQoc2l6ZSwgc2VsZi5fZmlsZS5yZWFkKQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9Tm9uZSk6CisgICAgICAgICIiIlJlYWQgYSBsaW5lLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZChzaXplLCBzZWxmLl9maWxlLnJlYWRsaW5lKQorCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmLCBzaXplaGludD1Ob25lKToKKyAgICAgICAgIiIiUmVhZCBtdWx0aXBsZSBsaW5lcy4iIiIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZjoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIGlmIHNpemVoaW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNpemVoaW50IC09IGxlbihsaW5lKQorICAgICAgICAgICAgICAgIGlmIHNpemVoaW50IDw9IDA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgIiIiSXRlcmF0ZSBvdmVyIGxpbmVzLiIiIgorICAgICAgICByZXR1cm4gaXRlcihzZWxmLnJlYWRsaW5lLCAiIikKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHBvc2l0aW9uLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fcG9zCisKKyAgICBkZWYgc2VlayhzZWxmLCBvZmZzZXQsIHdoZW5jZT0wKToKKyAgICAgICAgIiIiQ2hhbmdlIHBvc2l0aW9uLiIiIgorICAgICAgICBpZiB3aGVuY2UgPT0gMToKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzZWxmLl9wb3MpCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhvZmZzZXQsIHdoZW5jZSkKKyAgICAgICAgc2VsZi5fcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIGZpbGUuIiIiCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ19maWxlJyk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX2ZpbGUsICdjbG9zZScpOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUuY2xvc2UoKQorICAgICAgICAgICAgZGVsIHNlbGYuX2ZpbGUKKworICAgIGRlZiBfcmVhZChzZWxmLCBzaXplLCByZWFkX21ldGhvZCk6CisgICAgICAgICIiIlJlYWQgc2l6ZSBieXRlcyB1c2luZyByZWFkX21ldGhvZC4iIiIKKyAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgc2l6ZSA9IC0xCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzZWxmLl9wb3MpCisgICAgICAgIHJlc3VsdCA9IHJlYWRfbWV0aG9kKHNpemUpCisgICAgICAgIHNlbGYuX3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIHJldHVybiByZXN1bHQKKworCitjbGFzcyBfUGFydGlhbEZpbGUoX1Byb3h5RmlsZSk6CisgICAgIiIiQSByZWFkLW9ubHkgd3JhcHBlciBvZiBwYXJ0IG9mIGEgZmlsZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmLCBzdGFydD1Ob25lLCBzdG9wPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgX1BhcnRpYWxGaWxlLiIiIgorICAgICAgICBfUHJveHlGaWxlLl9faW5pdF9fKHNlbGYsIGYsIHN0YXJ0KQorICAgICAgICBzZWxmLl9zdGFydCA9IHN0YXJ0CisgICAgICAgIHNlbGYuX3N0b3AgPSBzdG9wCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBwb3NpdGlvbiB3aXRoIHJlc3BlY3QgdG8gc3RhcnQuIiIiCisgICAgICAgIHJldHVybiBfUHJveHlGaWxlLnRlbGwoc2VsZikgLSBzZWxmLl9zdGFydAorCisgICAgZGVmIHNlZWsoc2VsZiwgb2Zmc2V0LCB3aGVuY2U9MCk6CisgICAgICAgICIiIkNoYW5nZSBwb3NpdGlvbiwgcG9zc2libHkgd2l0aCByZXNwZWN0IHRvIHN0YXJ0IG9yIHN0b3AuIiIiCisgICAgICAgIGlmIHdoZW5jZSA9PSAwOgorICAgICAgICAgICAgc2VsZi5fcG9zID0gc2VsZi5fc3RhcnQKKyAgICAgICAgICAgIHdoZW5jZSA9IDEKKyAgICAgICAgZWxpZiB3aGVuY2UgPT0gMjoKKyAgICAgICAgICAgIHNlbGYuX3BvcyA9IHNlbGYuX3N0b3AKKyAgICAgICAgICAgIHdoZW5jZSA9IDEKKyAgICAgICAgX1Byb3h5RmlsZS5zZWVrKHNlbGYsIG9mZnNldCwgd2hlbmNlKQorCisgICAgZGVmIF9yZWFkKHNlbGYsIHNpemUsIHJlYWRfbWV0aG9kKToKKyAgICAgICAgIiIiUmVhZCBzaXplIGJ5dGVzIHVzaW5nIHJlYWRfbWV0aG9kLCBob25vcmluZyBzdGFydCBhbmQgc3RvcC4iIiIKKyAgICAgICAgcmVtYWluaW5nID0gc2VsZi5fc3RvcCAtIHNlbGYuX3BvcworICAgICAgICBpZiByZW1haW5pbmcgPD0gMDoKKyAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICBpZiBzaXplIGlzIE5vbmUgb3Igc2l6ZSA8IDAgb3Igc2l6ZSA+IHJlbWFpbmluZzoKKyAgICAgICAgICAgIHNpemUgPSByZW1haW5pbmcKKyAgICAgICAgcmV0dXJuIF9Qcm94eUZpbGUuX3JlYWQoc2VsZiwgc2l6ZSwgcmVhZF9tZXRob2QpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICMgZG8gKm5vdCogY2xvc2UgdGhlIHVuZGVybHlpbmcgZmlsZSBvYmplY3QgZm9yIHBhcnRpYWwgZmlsZXMsCisgICAgICAgICMgc2luY2UgaXQncyBnbG9iYWwgdG8gdGhlIG1haWxib3ggb2JqZWN0CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ19maWxlJyk6CisgICAgICAgICAgICBkZWwgc2VsZi5fZmlsZQorCisKK2RlZiBfbG9ja19maWxlKGYsIGRvdGxvY2s9VHJ1ZSk6CisgICAgIiIiTG9jayBmaWxlIGYgdXNpbmcgbG9ja2YgYW5kIGRvdCBsb2NraW5nLiIiIgorICAgIGRvdGxvY2tfZG9uZSA9IEZhbHNlCisgICAgdHJ5OgorICAgICAgICBpZiBmY250bDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmY250bC5sb2NrZihmLCBmY250bC5MT0NLX0VYIHwgZmNudGwuTE9DS19OQikKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gaW4gKGVycm5vLkVBR0FJTiwgZXJybm8uRUFDQ0VTLCBlcnJuby5FUk9GUyk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4dGVybmFsQ2xhc2hFcnJvcignbG9ja2Y6IGxvY2sgdW5hdmFpbGFibGU6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgaWYgZG90bG9jazoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwcmVfbG9jayA9IF9jcmVhdGVfdGVtcG9yYXJ5KGYubmFtZSArICcubG9jaycpCisgICAgICAgICAgICAgICAgcHJlX2xvY2suY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyBpbiAoZXJybm8uRUFDQ0VTLCBlcnJuby5FUk9GUyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAgIyBXaXRob3V0IHdyaXRlIGFjY2VzcywganVzdCBza2lwIGRvdGxvY2tpbmcuCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAnbGluaycpOgorICAgICAgICAgICAgICAgICAgICBvcy5saW5rKHByZV9sb2NrLm5hbWUsIGYubmFtZSArICcubG9jaycpCisgICAgICAgICAgICAgICAgICAgIGRvdGxvY2tfZG9uZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHByZV9sb2NrLm5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVuYW1lKHByZV9sb2NrLm5hbWUsIGYubmFtZSArICcubG9jaycpCisgICAgICAgICAgICAgICAgICAgIGRvdGxvY2tfZG9uZSA9IFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUVYSVNUIG9yIFwKKyAgICAgICAgICAgICAgICAgIChvcy5uYW1lID09ICdvczInIGFuZCBlLmVycm5vID09IGVycm5vLkVBQ0NFUyk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwcmVfbG9jay5uYW1lKQorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeHRlcm5hbENsYXNoRXJyb3IoJ2RvdCBsb2NrIHVuYXZhaWxhYmxlOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5uYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgZXhjZXB0OgorICAgICAgICBpZiBmY250bDoKKyAgICAgICAgICAgIGZjbnRsLmxvY2tmKGYsIGZjbnRsLkxPQ0tfVU4pCisgICAgICAgIGlmIGRvdGxvY2tfZG9uZToKKyAgICAgICAgICAgIG9zLnJlbW92ZShmLm5hbWUgKyAnLmxvY2snKQorICAgICAgICByYWlzZQorCitkZWYgX3VubG9ja19maWxlKGYpOgorICAgICIiIlVubG9jayBmaWxlIGYgdXNpbmcgbG9ja2YgYW5kIGRvdCBsb2NraW5nLiIiIgorICAgIGlmIGZjbnRsOgorICAgICAgICBmY250bC5sb2NrZihmLCBmY250bC5MT0NLX1VOKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKGYubmFtZSArICcubG9jaycpOgorICAgICAgICBvcy5yZW1vdmUoZi5uYW1lICsgJy5sb2NrJykKKworZGVmIF9jcmVhdGVfY2FyZWZ1bGx5KHBhdGgpOgorICAgICIiIkNyZWF0ZSBhIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdCBhbmQgb3BlbiBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iIiIKKyAgICBmZCA9IG9zLm9wZW4ocGF0aCwgb3MuT19DUkVBVCB8IG9zLk9fRVhDTCB8IG9zLk9fUkRXUiwgMDY2NikKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBvcGVuKHBhdGgsICdyYisnKQorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLmNsb3NlKGZkKQorCitkZWYgX2NyZWF0ZV90ZW1wb3JhcnkocGF0aCk6CisgICAgIiIiQ3JlYXRlIGEgdGVtcCBmaWxlIGJhc2VkIG9uIHBhdGggYW5kIG9wZW4gZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcuIiIiCisgICAgcmV0dXJuIF9jcmVhdGVfY2FyZWZ1bGx5KCclcy4lcy4lcy4lcycgJSAocGF0aCwgaW50KHRpbWUudGltZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuZ2V0aG9zdG5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5nZXRwaWQoKSkpCisKK2RlZiBfc3luY19mbHVzaChmKToKKyAgICAiIiJFbnN1cmUgY2hhbmdlcyB0byBmaWxlIGYgYXJlIHBoeXNpY2FsbHkgb24gZGlzay4iIiIKKyAgICBmLmZsdXNoKCkKKyAgICBpZiBoYXNhdHRyKG9zLCAnZnN5bmMnKToKKyAgICAgICAgb3MuZnN5bmMoZi5maWxlbm8oKSkKKworZGVmIF9zeW5jX2Nsb3NlKGYpOgorICAgICIiIkNsb3NlIGZpbGUgZiwgZW5zdXJpbmcgYWxsIGNoYW5nZXMgYXJlIHBoeXNpY2FsbHkgb24gZGlzay4iIiIKKyAgICBfc3luY19mbHVzaChmKQorICAgIGYuY2xvc2UoKQorCisjIyBTdGFydDogY2xhc3NlcyBmcm9tIHRoZSBvcmlnaW5hbCBtb2R1bGUgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KS4KKworIyBOb3RlIHRoYXQgdGhlIE1haWxkaXIgY2xhc3MsIHdob3NlIG5hbWUgaXMgdW5jaGFuZ2VkLCBpdHNlbGYgb2ZmZXJzIGEgbmV4dCgpCisjIG1ldGhvZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKworY2xhc3MgX01haWxib3g6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnAsIGZhY3Rvcnk9cmZjODIyLk1lc3NhZ2UpOgorICAgICAgICBzZWxmLmZwID0gZnAKKyAgICAgICAgc2VsZi5zZWVrcCA9IDAKKyAgICAgICAgc2VsZi5mYWN0b3J5ID0gZmFjdG9yeQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaXRlcihzZWxmLm5leHQsIE5vbmUpCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHNlbGYuZnAuc2VlayhzZWxmLnNlZWtwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3NlYXJjaF9zdGFydCgpCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5zZWVrcCA9IHNlbGYuZnAudGVsbCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5mcC50ZWxsKCkKKyAgICAgICAgICAgIHNlbGYuX3NlYXJjaF9lbmQoKQorICAgICAgICAgICAgc2VsZi5zZWVrcCA9IHN0b3AgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICAgICAgaWYgc3RhcnQgIT0gc3RvcDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gc2VsZi5mYWN0b3J5KF9QYXJ0aWFsRmlsZShzZWxmLmZwLCBzdGFydCwgc3RvcCkpCisKKyMgUmVjb21tZW5kZWQgdG8gdXNlIFBvcnRhYmxlVW5peE1haWxib3ggaW5zdGVhZCEKK2NsYXNzIFVuaXhNYWlsYm94KF9NYWlsYm94KToKKworICAgIGRlZiBfc2VhcmNoX3N0YXJ0KHNlbGYpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgcG9zID0gc2VsZi5mcC50ZWxsKCkKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgICAgICAgICBpZiBsaW5lWzo1XSA9PSAnRnJvbSAnIGFuZCBzZWxmLl9pc3JlYWxmcm9tbGluZShsaW5lKToKKyAgICAgICAgICAgICAgICBzZWxmLmZwLnNlZWsocG9zKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIF9zZWFyY2hfZW5kKHNlbGYpOgorICAgICAgICBzZWxmLmZwLnJlYWRsaW5lKCkgICAgICAjIFRocm93IGF3YXkgaGVhZGVyIGxpbmUKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHBvcyA9IHNlbGYuZnAudGVsbCgpCisgICAgICAgICAgICBsaW5lID0gc2VsZi5mcC5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIGxpbmVbOjVdID09ICdGcm9tICcgYW5kIHNlbGYuX2lzcmVhbGZyb21saW5lKGxpbmUpOgorICAgICAgICAgICAgICAgIHNlbGYuZnAuc2Vlayhwb3MpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIEFuIG92ZXJyaWRhYmxlIG1lY2hhbmlzbSB0byB0ZXN0IGZvciBGcm9tLWxpbmUtbmVzcy4gIFlvdSBjYW4gZWl0aGVyCisgICAgIyBzcGVjaWZ5IGEgZGlmZmVyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBkZWZpbmUgYSB3aG9sZSBuZXcKKyAgICAjIF9pc3JlYWxmcm9tbGluZSgpIG1ldGhvZC4gIE5vdGUgdGhhdCB0aGlzIG9ubHkgZ2V0cyBjYWxsZWQgZm9yIGxpbmVzCisgICAgIyBzdGFydGluZyB3aXRoIHRoZSA1IGNoYXJhY3RlcnMgIkZyb20gIi4KKyAgICAjCisgICAgIyBCQVc6IEFjY29yZGluZyB0bworICAgICNodHRwOi8vaG9tZS5uZXRzY2FwZS5jb20vZW5nL21vemlsbGEvMi4wL3JlbG5vdGVzL2RlbW8vY29udGVudC1sZW5ndGguaHRtbAorICAgICMgdGhlIG9ubHkgcG9ydGFibGUsIHJlbGlhYmxlIHdheSB0byBmaW5kIG1lc3NhZ2UgZGVsaW1pdGVycyBpbiBhIEJTRCAoaS5lCisgICAgIyBVbml4IG1haWxib3gpIHN0eWxlIGZvbGRlciBpcyB0byBzZWFyY2ggZm9yICJcblxuRnJvbSAuKlxuIiwgb3IgYXQgdGhlCisgICAgIyBiZWdpbm5pbmcgb2YgdGhlIGZpbGUsICJeRnJvbSAuKlxuIi4gIFdoaWxlIF9mcm9tbGluZXBhdHRlcm4gYmVsb3cgc2VlbXMKKyAgICAjIGxpa2UgYSBnb29kIGlkZWEsIGluIHByYWN0aWNlLCB0aGVyZSBhcmUgdG9vIG1hbnkgdmFyaWF0aW9ucyBmb3IgbW9yZQorICAgICMgc3RyaWN0IHBhcnNpbmcgb2YgdGhlIGxpbmUgdG8gYmUgY29tcGxldGVseSBhY2N1cmF0ZS4KKyAgICAjCisgICAgIyBfc3RyaWN0X2lzcmVhbGZyb21saW5lKCkgaXMgdGhlIG9sZCB2ZXJzaW9uIHdoaWNoIHRyaWVzIHRvIGRvIHN0cmljdGVyCisgICAgIyBwYXJzaW5nIG9mIHRoZSBGcm9tXyBsaW5lLiAgX3BvcnRhYmxlX2lzcmVhbGZyb21saW5lKCkgc2ltcGx5IHJldHVybnMKKyAgICAjIHRydWUsIHNpbmNlIGl0J3MgbmV2ZXIgY2FsbGVkIGlmIHRoZSBsaW5lIGRvZXNuJ3QgYWxyZWFkeSBzdGFydCB3aXRoCisgICAgIyAiRnJvbSAiLgorICAgICMKKyAgICAjIFRoaXMgYWxnb3JpdGhtLCBhbmQgdGhlIHdheSBpdCBpbnRlcmFjdHMgd2l0aCBfc2VhcmNoX3N0YXJ0KCkgYW5kCisgICAgIyBfc2VhcmNoX2VuZCgpIG1heSBub3QgYmUgY29tcGxldGVseSBjb3JyZWN0LCBiZWNhdXNlIGl0IGRvZXNuJ3QgY2hlY2sKKyAgICAjIHRoYXQgdGhlIHR3byBjaGFyYWN0ZXJzIHByZWNlZGluZyAiRnJvbSAiIGFyZSBcblxuIG9yIHRoZSBiZWdpbm5pbmcgb2YKKyAgICAjIHRoZSBmaWxlLiAgRml4aW5nIHRoaXMgd291bGQgcmVxdWlyZSBhIG1vcmUgZXh0ZW5zaXZlIHJld3JpdGUgdGhhbiBpcworICAgICMgbmVjZXNzYXJ5LiAgRm9yIGNvbnZlbmllbmNlLCB3ZSd2ZSBhZGRlZCBhIFBvcnRhYmxlVW5peE1haWxib3ggY2xhc3MKKyAgICAjIHdoaWNoIGRvZXMgbm8gY2hlY2tpbmcgb2YgdGhlIGZvcm1hdCBvZiB0aGUgJ0Zyb20nIGxpbmUuCisKKyAgICBfZnJvbWxpbmVwYXR0ZXJuID0gKHIiRnJvbSBccypbXlxzXStccytcd1x3XHdccytcd1x3XHdccytcZD9cZFxzKyIKKyAgICAgICAgICAgICAgICAgICAgICAgIHIiXGQ/XGQ6XGRcZCg6XGRcZCk/KFxzK1teXHNdKyk/XHMrXGRcZFxkXGRccyoiCisgICAgICAgICAgICAgICAgICAgICAgICByIlteXHNdKlxzKiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIkIikKKyAgICBfcmVnZXhwID0gTm9uZQorCisgICAgZGVmIF9zdHJpY3RfaXNyZWFsZnJvbWxpbmUoc2VsZiwgbGluZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9yZWdleHA6CisgICAgICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgICAgIHNlbGYuX3JlZ2V4cCA9IHJlLmNvbXBpbGUoc2VsZi5fZnJvbWxpbmVwYXR0ZXJuKQorICAgICAgICByZXR1cm4gc2VsZi5fcmVnZXhwLm1hdGNoKGxpbmUpCisKKyAgICBkZWYgX3BvcnRhYmxlX2lzcmVhbGZyb21saW5lKHNlbGYsIGxpbmUpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgX2lzcmVhbGZyb21saW5lID0gX3N0cmljdF9pc3JlYWxmcm9tbGluZQorCisKK2NsYXNzIFBvcnRhYmxlVW5peE1haWxib3goVW5peE1haWxib3gpOgorICAgIF9pc3JlYWxmcm9tbGluZSA9IFVuaXhNYWlsYm94Ll9wb3J0YWJsZV9pc3JlYWxmcm9tbGluZQorCisKK2NsYXNzIE1tZGZNYWlsYm94KF9NYWlsYm94KToKKworICAgIGRlZiBfc2VhcmNoX3N0YXJ0KHNlbGYpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IHNlbGYuZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKKyAgICAgICAgICAgIGlmIGxpbmVbOjVdID09ICdcMDAxXDAwMVwwMDFcMDAxXG4nOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIF9zZWFyY2hfZW5kKHNlbGYpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgcG9zID0gc2VsZi5mcC50ZWxsKCkKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgbGluZSA9PSAnXDAwMVwwMDFcMDAxXDAwMVxuJzoKKyAgICAgICAgICAgICAgICBzZWxmLmZwLnNlZWsocG9zKQorICAgICAgICAgICAgICAgIHJldHVybgorCisKK2NsYXNzIE1ITWFpbGJveDoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXJuYW1lLCBmYWN0b3J5PXJmYzgyMi5NZXNzYWdlKToKKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoJ15bMS05XVswLTldKiQnKQorICAgICAgICBzZWxmLmRpcm5hbWUgPSBkaXJuYW1lCisgICAgICAgICMgdGhlIHRocmVlIGZvbGxvd2luZyBsaW5lcyBjb3VsZCBiZSBjb21iaW5lZCBpbnRvOgorICAgICAgICAjIGxpc3QgPSBtYXAobG9uZywgZmlsdGVyKHBhdC5tYXRjaCwgb3MubGlzdGRpcihzZWxmLmRpcm5hbWUpKSkKKyAgICAgICAgbGlzdCA9IG9zLmxpc3RkaXIoc2VsZi5kaXJuYW1lKQorICAgICAgICBsaXN0ID0gZmlsdGVyKHBhdC5tYXRjaCwgbGlzdCkKKyAgICAgICAgbGlzdCA9IG1hcChsb25nLCBsaXN0KQorICAgICAgICBsaXN0LnNvcnQoKQorICAgICAgICAjIFRoaXMgb25seSB3b3JrcyBpbiBQeXRob24gMS42IG9yIGxhdGVyOworICAgICAgICAjIGJlZm9yZSB0aGF0IHN0cigpIGFkZGVkICdMJzoKKyAgICAgICAgc2VsZi5ib3hlcyA9IG1hcChzdHIsIGxpc3QpCisgICAgICAgIHNlbGYuYm94ZXMucmV2ZXJzZSgpCisgICAgICAgIHNlbGYuZmFjdG9yeSA9IGZhY3RvcnkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5uZXh0LCBOb25lKQorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmJveGVzOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZm4gPSBzZWxmLmJveGVzLnBvcCgpCisgICAgICAgIGZwID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBmbikpCisgICAgICAgIG1zZyA9IHNlbGYuZmFjdG9yeShmcCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnLl9taF9tc2dubyA9IGZuCisgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBtc2cKKworCitjbGFzcyBCYWJ5bE1haWxib3goX01haWxib3gpOgorCisgICAgZGVmIF9zZWFyY2hfc3RhcnQoc2VsZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5mcC5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICAgICAgaWYgbGluZSA9PSAnKioqIEVPT0ggKioqXG4nOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIF9zZWFyY2hfZW5kKHNlbGYpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgcG9zID0gc2VsZi5mcC50ZWxsKCkKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgbGluZSA9PSAnXDAzN1wwMTRcbicgb3IgbGluZSA9PSAnXDAzNyc6CisgICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHBvcykKKyAgICAgICAgICAgICAgICByZXR1cm4KKworIyMgRW5kOiBjbGFzc2VzIGZyb20gdGhlIG9yaWdpbmFsIG1vZHVsZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgorCisKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiUmFpc2VkIGZvciBtb2R1bGUtc3BlY2lmaWMgZXJyb3JzLiIiIgorCitjbGFzcyBOb1N1Y2hNYWlsYm94RXJyb3IoRXJyb3IpOgorICAgICIiIlRoZSBzcGVjaWZpZWQgbWFpbGJveCBkb2VzIG5vdCBleGlzdCBhbmQgd29uJ3QgYmUgY3JlYXRlZC4iIiIKKworY2xhc3MgTm90RW1wdHlFcnJvcihFcnJvcik6CisgICAgIiIiVGhlIHNwZWNpZmllZCBtYWlsYm94IGlzIG5vdCBlbXB0eSBhbmQgZGVsZXRpb24gd2FzIHJlcXVlc3RlZC4iIiIKKworY2xhc3MgRXh0ZXJuYWxDbGFzaEVycm9yKEVycm9yKToKKyAgICAiIiJBbm90aGVyIHByb2Nlc3MgY2F1c2VkIGFuIGFjdGlvbiB0byBmYWlsLiIiIgorCitjbGFzcyBGb3JtYXRFcnJvcihFcnJvcik6CisgICAgIiIiQSBmaWxlIGFwcGVhcnMgdG8gaGF2ZSBhbiBpbnZhbGlkIGZvcm1hdC4iIiIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFpbGJveC5weWMgYi9saWIvcHl0aG9uMi43L21haWxib3gucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5M2QxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21haWxib3gucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFpbGJveC5weW8gYi9saWIvcHl0aG9uMi43L21haWxib3gucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMGVkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21haWxib3gucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFpbGNhcC5weSBiL2xpYi9weXRob24yLjcvbWFpbGNhcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmRkYWNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tYWlsY2FwLnB5CkBAIC0wLDAgKzEsMjU1IEBACisiIiJNYWlsY2FwIGZpbGUgaGFuZGxpbmcuICBTZWUgUkZDIDE1MjQuIiIiCisKK2ltcG9ydCBvcworCitfX2FsbF9fID0gWyJnZXRjYXBzIiwiZmluZG1hdGNoIl0KKworIyBQYXJ0IDE6IHRvcC1sZXZlbCBpbnRlcmZhY2UuCisKK2RlZiBnZXRjYXBzKCk6CisgICAgIiIiUmV0dXJuIGEgZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBtYWlsY2FwIGRhdGFiYXNlLgorCisgICAgVGhlIGRpY3Rpb25hcnkgbWFwcyBhIE1JTUUgdHlwZSAoaW4gYWxsIGxvd2VyY2FzZSwgZS5nLiAndGV4dC9wbGFpbicpCisgICAgdG8gYSBsaXN0IG9mIGRpY3Rpb25hcmllcyBjb3JyZXNwb25kaW5nIHRvIG1haWxjYXAgZW50cmllcy4gIFRoZSBsaXN0CisgICAgY29sbGVjdHMgYWxsIHRoZSBlbnRyaWVzIGZvciB0aGF0IE1JTUUgdHlwZSBmcm9tIGFsbCBhdmFpbGFibGUgbWFpbGNhcAorICAgIGZpbGVzLiAgRWFjaCBkaWN0aW9uYXJ5IGNvbnRhaW5zIGtleS12YWx1ZSBwYWlycyBmb3IgdGhhdCBNSU1FIHR5cGUsCisgICAgd2hlcmUgdGhlIHZpZXdpbmcgY29tbWFuZCBpcyBzdG9yZWQgd2l0aCB0aGUga2V5ICJ2aWV3Ii4KKworICAgICIiIgorICAgIGNhcHMgPSB7fQorICAgIGZvciBtYWlsY2FwIGluIGxpc3RtYWlsY2FwZmlsZXMoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnAgPSBvcGVuKG1haWxjYXAsICdyJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBtb3JlY2FwcyA9IHJlYWRtYWlsY2FwZmlsZShmcCkKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBtb3JlY2Fwcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBrZXkgaW4gY2FwczoKKyAgICAgICAgICAgICAgICBjYXBzW2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjYXBzW2tleV0gPSBjYXBzW2tleV0gKyB2YWx1ZQorICAgIHJldHVybiBjYXBzCisKK2RlZiBsaXN0bWFpbGNhcGZpbGVzKCk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgbWFpbGNhcCBmaWxlcyBmb3VuZCBvbiB0aGUgc3lzdGVtLiIiIgorICAgICMgWFhYIEFjdHVhbGx5LCB0aGlzIGlzIFVuaXgtc3BlY2lmaWMKKyAgICBpZiAnTUFJTENBUFMnIGluIG9zLmVudmlyb246CisgICAgICAgIHN0ciA9IG9zLmVudmlyb25bJ01BSUxDQVBTJ10KKyAgICAgICAgbWFpbGNhcHMgPSBzdHIuc3BsaXQoJzonKQorICAgIGVsc2U6CisgICAgICAgIGlmICdIT01FJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgaG9tZSA9IG9zLmVudmlyb25bJ0hPTUUnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBEb24ndCBib3RoZXIgd2l0aCBnZXRwd3VpZCgpCisgICAgICAgICAgICBob21lID0gJy4nICMgTGFzdCByZXNvcnQKKyAgICAgICAgbWFpbGNhcHMgPSBbaG9tZSArICcvLm1haWxjYXAnLCAnL2V0Yy9tYWlsY2FwJywKKyAgICAgICAgICAgICAgICAnL3Vzci9ldGMvbWFpbGNhcCcsICcvdXNyL2xvY2FsL2V0Yy9tYWlsY2FwJ10KKyAgICByZXR1cm4gbWFpbGNhcHMKKworCisjIFBhcnQgMjogdGhlIHBhcnNlci4KKworZGVmIHJlYWRtYWlsY2FwZmlsZShmcCk6CisgICAgIiIiUmVhZCBhIG1haWxjYXAgZmlsZSBhbmQgcmV0dXJuIGEgZGljdGlvbmFyeSBrZXllZCBieSBNSU1FIHR5cGUuCisKKyAgICBFYWNoIE1JTUUgdHlwZSBpcyBtYXBwZWQgdG8gYW4gZW50cnkgY29uc2lzdGluZyBvZiBhIGxpc3Qgb2YKKyAgICBkaWN0aW9uYXJpZXM7IHRoZSBsaXN0IHdpbGwgY29udGFpbiBtb3JlIHRoYW4gb25lIHN1Y2ggZGljdGlvbmFyeQorICAgIGlmIGEgZ2l2ZW4gTUlNRSB0eXBlIGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIG1haWxjYXAgZmlsZS4KKyAgICBFYWNoIGRpY3Rpb25hcnkgY29udGFpbnMga2V5LXZhbHVlIHBhaXJzIGZvciB0aGF0IE1JTUUgdHlwZSwgd2hlcmUKKyAgICB0aGUgdmlld2luZyBjb21tYW5kIGlzIHN0b3JlZCB3aXRoIHRoZSBrZXkgInZpZXciLgorICAgICIiIgorICAgIGNhcHMgPSB7fQorICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgICAgICAjIElnbm9yZSBjb21tZW50cyBhbmQgYmxhbmsgbGluZXMKKyAgICAgICAgaWYgbGluZVswXSA9PSAnIycgb3IgbGluZS5zdHJpcCgpID09ICcnOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbmV4dGxpbmUgPSBsaW5lCisgICAgICAgICMgSm9pbiBjb250aW51YXRpb24gbGluZXMKKyAgICAgICAgd2hpbGUgbmV4dGxpbmVbLTI6XSA9PSAnXFxcbic6CisgICAgICAgICAgICBuZXh0bGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBuZXh0bGluZTogbmV4dGxpbmUgPSAnXG4nCisgICAgICAgICAgICBsaW5lID0gbGluZVs6LTJdICsgbmV4dGxpbmUKKyAgICAgICAgIyBQYXJzZSB0aGUgbGluZQorICAgICAgICBrZXksIGZpZWxkcyA9IHBhcnNlbGluZShsaW5lKQorICAgICAgICBpZiBub3QgKGtleSBhbmQgZmllbGRzKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICMgTm9ybWFsaXplIHRoZSBrZXkKKyAgICAgICAgdHlwZXMgPSBrZXkuc3BsaXQoJy8nKQorICAgICAgICBmb3IgaiBpbiByYW5nZShsZW4odHlwZXMpKToKKyAgICAgICAgICAgIHR5cGVzW2pdID0gdHlwZXNbal0uc3RyaXAoKQorICAgICAgICBrZXkgPSAnLycuam9pbih0eXBlcykubG93ZXIoKQorICAgICAgICAjIFVwZGF0ZSB0aGUgZGF0YWJhc2UKKyAgICAgICAgaWYga2V5IGluIGNhcHM6CisgICAgICAgICAgICBjYXBzW2tleV0uYXBwZW5kKGZpZWxkcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNhcHNba2V5XSA9IFtmaWVsZHNdCisgICAgcmV0dXJuIGNhcHMKKworZGVmIHBhcnNlbGluZShsaW5lKToKKyAgICAiIiJQYXJzZSBvbmUgZW50cnkgaW4gYSBtYWlsY2FwIGZpbGUgYW5kIHJldHVybiBhIGRpY3Rpb25hcnkuCisKKyAgICBUaGUgdmlld2luZyBjb21tYW5kIGlzIHN0b3JlZCBhcyB0aGUgdmFsdWUgd2l0aCB0aGUga2V5ICJ2aWV3IiwKKyAgICBhbmQgdGhlIHJlc3Qgb2YgdGhlIGZpZWxkcyBwcm9kdWNlIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgZGljdC4KKyAgICAiIiIKKyAgICBmaWVsZHMgPSBbXQorICAgIGksIG4gPSAwLCBsZW4obGluZSkKKyAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgZmllbGQsIGkgPSBwYXJzZWZpZWxkKGxpbmUsIGksIG4pCisgICAgICAgIGZpZWxkcy5hcHBlbmQoZmllbGQpCisgICAgICAgIGkgPSBpKzEgIyBTa2lwIHNlbWljb2xvbgorICAgIGlmIGxlbihmaWVsZHMpIDwgMjoKKyAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKyAgICBrZXksIHZpZXcsIHJlc3QgPSBmaWVsZHNbMF0sIGZpZWxkc1sxXSwgZmllbGRzWzI6XQorICAgIGZpZWxkcyA9IHsndmlldyc6IHZpZXd9CisgICAgZm9yIGZpZWxkIGluIHJlc3Q6CisgICAgICAgIGkgPSBmaWVsZC5maW5kKCc9JykKKyAgICAgICAgaWYgaSA8IDA6CisgICAgICAgICAgICBma2V5ID0gZmllbGQKKyAgICAgICAgICAgIGZ2YWx1ZSA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBma2V5ID0gZmllbGRbOmldLnN0cmlwKCkKKyAgICAgICAgICAgIGZ2YWx1ZSA9IGZpZWxkW2krMTpdLnN0cmlwKCkKKyAgICAgICAgaWYgZmtleSBpbiBmaWVsZHM6CisgICAgICAgICAgICAjIElnbm9yZSBpdAorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmllbGRzW2ZrZXldID0gZnZhbHVlCisgICAgcmV0dXJuIGtleSwgZmllbGRzCisKK2RlZiBwYXJzZWZpZWxkKGxpbmUsIGksIG4pOgorICAgICIiIlNlcGFyYXRlIG9uZSBrZXktdmFsdWUgcGFpciBpbiBhIG1haWxjYXAgZW50cnkuIiIiCisgICAgc3RhcnQgPSBpCisgICAgd2hpbGUgaSA8IG46CisgICAgICAgIGMgPSBsaW5lW2ldCisgICAgICAgIGlmIGMgPT0gJzsnOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxpZiBjID09ICdcXCc6CisgICAgICAgICAgICBpID0gaSsyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpID0gaSsxCisgICAgcmV0dXJuIGxpbmVbc3RhcnQ6aV0uc3RyaXAoKSwgaQorCisKKyMgUGFydCAzOiB1c2luZyB0aGUgZGF0YWJhc2UuCisKK2RlZiBmaW5kbWF0Y2goY2FwcywgTUlNRXR5cGUsIGtleT0ndmlldycsIGZpbGVuYW1lPSIvZGV2L251bGwiLCBwbGlzdD1bXSk6CisgICAgIiIiRmluZCBhIG1hdGNoIGZvciBhIG1haWxjYXAgZW50cnkuCisKKyAgICBSZXR1cm4gYSB0dXBsZSBjb250YWluaW5nIHRoZSBjb21tYW5kIGxpbmUsIGFuZCB0aGUgbWFpbGNhcCBlbnRyeQorICAgIHVzZWQ7IChOb25lLCBOb25lKSBpZiBubyBtYXRjaCBpcyBmb3VuZC4gIFRoaXMgbWF5IGludm9rZSB0aGUKKyAgICAndGVzdCcgY29tbWFuZCBvZiBzZXZlcmFsIG1hdGNoaW5nIGVudHJpZXMgYmVmb3JlIGRlY2lkaW5nIHdoaWNoCisgICAgZW50cnkgdG8gdXNlLgorCisgICAgIiIiCisgICAgZW50cmllcyA9IGxvb2t1cChjYXBzLCBNSU1FdHlwZSwga2V5KQorICAgICMgWFhYIFRoaXMgY29kZSBzaG91bGQgc29tZWhvdyBjaGVjayBmb3IgdGhlIG5lZWRzdGVybWluYWwgZmxhZy4KKyAgICBmb3IgZSBpbiBlbnRyaWVzOgorICAgICAgICBpZiAndGVzdCcgaW4gZToKKyAgICAgICAgICAgIHRlc3QgPSBzdWJzdChlWyd0ZXN0J10sIGZpbGVuYW1lLCBwbGlzdCkKKyAgICAgICAgICAgIGlmIHRlc3QgYW5kIG9zLnN5c3RlbSh0ZXN0KSAhPSAwOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGNvbW1hbmQgPSBzdWJzdChlW2tleV0sIE1JTUV0eXBlLCBmaWxlbmFtZSwgcGxpc3QpCisgICAgICAgIHJldHVybiBjb21tYW5kLCBlCisgICAgcmV0dXJuIE5vbmUsIE5vbmUKKworZGVmIGxvb2t1cChjYXBzLCBNSU1FdHlwZSwga2V5PU5vbmUpOgorICAgIGVudHJpZXMgPSBbXQorICAgIGlmIE1JTUV0eXBlIGluIGNhcHM6CisgICAgICAgIGVudHJpZXMgPSBlbnRyaWVzICsgY2Fwc1tNSU1FdHlwZV0KKyAgICBNSU1FdHlwZXMgPSBNSU1FdHlwZS5zcGxpdCgnLycpCisgICAgTUlNRXR5cGUgPSBNSU1FdHlwZXNbMF0gKyAnLyonCisgICAgaWYgTUlNRXR5cGUgaW4gY2FwczoKKyAgICAgICAgZW50cmllcyA9IGVudHJpZXMgKyBjYXBzW01JTUV0eXBlXQorICAgIGlmIGtleSBpcyBub3QgTm9uZToKKyAgICAgICAgZW50cmllcyA9IGZpbHRlcihsYW1iZGEgZSwga2V5PWtleToga2V5IGluIGUsIGVudHJpZXMpCisgICAgcmV0dXJuIGVudHJpZXMKKworZGVmIHN1YnN0KGZpZWxkLCBNSU1FdHlwZSwgZmlsZW5hbWUsIHBsaXN0PVtdKToKKyAgICAjIFhYWCBBY3R1YWxseSwgdGhpcyBpcyBVbml4LXNwZWNpZmljCisgICAgcmVzID0gJycKKyAgICBpLCBuID0gMCwgbGVuKGZpZWxkKQorICAgIHdoaWxlIGkgPCBuOgorICAgICAgICBjID0gZmllbGRbaV07IGkgPSBpKzEKKyAgICAgICAgaWYgYyAhPSAnJSc6CisgICAgICAgICAgICBpZiBjID09ICdcXCc6CisgICAgICAgICAgICAgICAgYyA9IGZpZWxkW2k6aSsxXTsgaSA9IGkrMQorICAgICAgICAgICAgcmVzID0gcmVzICsgYworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYyA9IGZpZWxkW2ldOyBpID0gaSsxCisgICAgICAgICAgICBpZiBjID09ICclJzoKKyAgICAgICAgICAgICAgICByZXMgPSByZXMgKyBjCisgICAgICAgICAgICBlbGlmIGMgPT0gJ3MnOgorICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArIGZpbGVuYW1lCisgICAgICAgICAgICBlbGlmIGMgPT0gJ3QnOgorICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArIE1JTUV0eXBlCisgICAgICAgICAgICBlbGlmIGMgPT0gJ3snOgorICAgICAgICAgICAgICAgIHN0YXJ0ID0gaQorICAgICAgICAgICAgICAgIHdoaWxlIGkgPCBuIGFuZCBmaWVsZFtpXSAhPSAnfSc6CisgICAgICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgICAgICBuYW1lID0gZmllbGRbc3RhcnQ6aV0KKyAgICAgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgZmluZHBhcmFtKG5hbWUsIHBsaXN0KQorICAgICAgICAgICAgIyBYWFggVG8gZG86CisgICAgICAgICAgICAjICVuID09IG51bWJlciBvZiBwYXJ0cyBpZiB0eXBlIGlzIG11bHRpcGFydC8qCisgICAgICAgICAgICAjICVGID09IGxpc3Qgb2YgYWx0ZXJuYXRpbmcgdHlwZSBhbmQgZmlsZW5hbWUgZm9yIHBhcnRzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArICclJyArIGMKKyAgICByZXR1cm4gcmVzCisKK2RlZiBmaW5kcGFyYW0obmFtZSwgcGxpc3QpOgorICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkgKyAnPScKKyAgICBuID0gbGVuKG5hbWUpCisgICAgZm9yIHAgaW4gcGxpc3Q6CisgICAgICAgIGlmIHBbOm5dLmxvd2VyKCkgPT0gbmFtZToKKyAgICAgICAgICAgIHJldHVybiBwW246XQorICAgIHJldHVybiAnJworCisKKyMgUGFydCA0OiB0ZXN0IHByb2dyYW0uCisKK2RlZiB0ZXN0KCk6CisgICAgaW1wb3J0IHN5cworICAgIGNhcHMgPSBnZXRjYXBzKCkKKyAgICBpZiBub3Qgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBzaG93KGNhcHMpCisgICAgICAgIHJldHVybgorICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihzeXMuYXJndiksIDIpOgorICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbaTppKzJdCisgICAgICAgIGlmIGxlbihhcmdzKSA8IDI6CisgICAgICAgICAgICBwcmludCAidXNhZ2U6IG1haWxjYXAgW01JTUV0eXBlIGZpbGVdIC4uLiIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBNSU1FdHlwZSA9IGFyZ3NbMF0KKyAgICAgICAgZmlsZSA9IGFyZ3NbMV0KKyAgICAgICAgY29tbWFuZCwgZSA9IGZpbmRtYXRjaChjYXBzLCBNSU1FdHlwZSwgJ3ZpZXcnLCBmaWxlKQorICAgICAgICBpZiBub3QgY29tbWFuZDoKKyAgICAgICAgICAgIHByaW50ICJObyB2aWV3ZXIgZm91bmQgZm9yIiwgdHlwZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgIkV4ZWN1dGluZzoiLCBjb21tYW5kCisgICAgICAgICAgICBzdHMgPSBvcy5zeXN0ZW0oY29tbWFuZCkKKyAgICAgICAgICAgIGlmIHN0czoKKyAgICAgICAgICAgICAgICBwcmludCAiRXhpdCBzdGF0dXM6Iiwgc3RzCisKK2RlZiBzaG93KGNhcHMpOgorICAgIHByaW50ICJNYWlsY2FwIGZpbGVzOiIKKyAgICBmb3IgZm4gaW4gbGlzdG1haWxjYXBmaWxlcygpOiBwcmludCAiXHQiICsgZm4KKyAgICBwcmludAorICAgIGlmIG5vdCBjYXBzOiBjYXBzID0gZ2V0Y2FwcygpCisgICAgcHJpbnQgIk1haWxjYXAgZW50cmllczoiCisgICAgcHJpbnQKKyAgICBja2V5cyA9IGNhcHMua2V5cygpCisgICAgY2tleXMuc29ydCgpCisgICAgZm9yIHR5cGUgaW4gY2tleXM6CisgICAgICAgIHByaW50IHR5cGUKKyAgICAgICAgZW50cmllcyA9IGNhcHNbdHlwZV0KKyAgICAgICAgZm9yIGUgaW4gZW50cmllczoKKyAgICAgICAgICAgIGtleXMgPSBlLmtleXMoKQorICAgICAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgICAgIGZvciBrIGluIGtleXM6CisgICAgICAgICAgICAgICAgcHJpbnQgIiAgJS0xNXMiICUgaywgZVtrXQorICAgICAgICAgICAgcHJpbnQKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFpbGNhcC5weWMgYi9saWIvcHl0aG9uMi43L21haWxjYXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzI4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21haWxjYXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFpbGNhcC5weW8gYi9saWIvcHl0aG9uMi43L21haWxjYXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzI4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21haWxjYXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFya3VwYmFzZS5weSBiL2xpYi9weXRob24yLjcvbWFya3VwYmFzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGViOTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tYXJrdXBiYXNlLnB5CkBAIC0wLDAgKzEsMzk2IEBACisiIiJTaGFyZWQgc3VwcG9ydCBmb3Igc2Nhbm5pbmcgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbnMgaW4gSFRNTCBhbmQgWEhUTUwuCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgYXMgYSBmb3VuZGF0aW9uIGZvciB0aGUgSFRNTFBhcnNlciBhbmQgc2dtbGxpYgorbW9kdWxlcyAoaW5kaXJlY3RseSwgZm9yIGh0bWxsaWIgYXMgd2VsbCkuICBJdCBoYXMgbm8gZG9jdW1lbnRlZAorcHVibGljIEFQSSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LgorCisiIiIKKworaW1wb3J0IHJlCisKK19kZWNsbmFtZV9tYXRjaCA9IHJlLmNvbXBpbGUocidbYS16QS1aXVstXy5hLXpBLVowLTldKlxzKicpLm1hdGNoCitfZGVjbHN0cmluZ2xpdF9tYXRjaCA9IHJlLmNvbXBpbGUocicoXCdbXlwnXSpcJ3wiW14iXSoiKVxzKicpLm1hdGNoCitfY29tbWVudGNsb3NlID0gcmUuY29tcGlsZShyJy0tXHMqPicpCitfbWFya2Vkc2VjdGlvbmNsb3NlID0gcmUuY29tcGlsZShyJ11ccypdXHMqPicpCisKKyMgQW4gYW5hbHlzaXMgb2YgdGhlIE1TLVdvcmQgZXh0ZW5zaW9ucyBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5wbGFuZXRwdWJsaXNoLmNvbS94bWxhcmVuYS94YXAvVGh1cnNkYXkvV29yZHRvWE1MLnBkZgorCitfbXNtYXJrZWRzZWN0aW9uY2xvc2UgPSByZS5jb21waWxlKHInXVxzKj4nKQorCitkZWwgcmUKKworCitjbGFzcyBQYXJzZXJCYXNlOgorICAgICIiIlBhcnNlciBiYXNlIGNsYXNzIHdoaWNoIHByb3ZpZGVzIHNvbWUgY29tbW9uIHN1cHBvcnQgbWV0aG9kcyB1c2VkCisgICAgYnkgdGhlIFNHTUwvSFRNTCBhbmQgWEhUTUwgcGFyc2Vycy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fX2NsYXNzX18gaXMgUGFyc2VyQmFzZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAgICAgICAibWFya3VwYmFzZS5QYXJzZXJCYXNlIG11c3QgYmUgc3ViY2xhc3NlZCIpCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICAgICAic3ViY2xhc3NlcyBvZiBQYXJzZXJCYXNlIG11c3Qgb3ZlcnJpZGUgZXJyb3IoKSIpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYubGluZW5vID0gMQorICAgICAgICBzZWxmLm9mZnNldCA9IDAKKworICAgIGRlZiBnZXRwb3Moc2VsZik6CisgICAgICAgICIiIlJldHVybiBjdXJyZW50IGxpbmUgbnVtYmVyIGFuZCBvZmZzZXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmxpbmVubywgc2VsZi5vZmZzZXQKKworICAgICMgSW50ZXJuYWwgLS0gdXBkYXRlIGxpbmUgbnVtYmVyIGFuZCBvZmZzZXQuICBUaGlzIHNob3VsZCBiZQorICAgICMgY2FsbGVkIGZvciBlYWNoIHBpZWNlIG9mIGRhdGEgZXhhY3RseSBvbmNlLCBpbiBvcmRlciAtLSBpbiBvdGhlcgorICAgICMgd29yZHMgdGhlIGNvbmNhdGVuYXRpb24gb2YgYWxsIHRoZSBpbnB1dCBzdHJpbmdzIHRvIHRoaXMKKyAgICAjIGZ1bmN0aW9uIHNob3VsZCBiZSBleGFjdGx5IHRoZSBlbnRpcmUgaW5wdXQuCisgICAgZGVmIHVwZGF0ZXBvcyhzZWxmLCBpLCBqKToKKyAgICAgICAgaWYgaSA+PSBqOgorICAgICAgICAgICAgcmV0dXJuIGoKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBubGluZXMgPSByYXdkYXRhLmNvdW50KCJcbiIsIGksIGopCisgICAgICAgIGlmIG5saW5lczoKKyAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyBubGluZXMKKyAgICAgICAgICAgIHBvcyA9IHJhd2RhdGEucmluZGV4KCJcbiIsIGksIGopICMgU2hvdWxkIG5vdCBmYWlsCisgICAgICAgICAgICBzZWxmLm9mZnNldCA9IGotKHBvcysxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5vZmZzZXQgPSBzZWxmLm9mZnNldCArIGotaQorICAgICAgICByZXR1cm4gagorCisgICAgX2RlY2xfb3RoZXJjaGFycyA9ICcnCisKKyAgICAjIEludGVybmFsIC0tIHBhcnNlIGRlY2xhcmF0aW9uIChmb3IgdXNlIGJ5IHN1YmNsYXNzZXMpLgorICAgIGRlZiBwYXJzZV9kZWNsYXJhdGlvbihzZWxmLCBpKToKKyAgICAgICAgIyBUaGlzIGlzIHNvbWUgc29ydCBvZiBkZWNsYXJhdGlvbjsgaW4gIkhUTUwgYXMKKyAgICAgICAgIyBkZXBsb3llZCwiIHRoaXMgc2hvdWxkIG9ubHkgYmUgdGhlIGRvY3VtZW50IHR5cGUKKyAgICAgICAgIyBkZWNsYXJhdGlvbiAoIjwhRE9DVFlQRSBodG1sLi4uPiIpLgorICAgICAgICAjIElTTyA4ODc5OjE5ODYsIGhvd2V2ZXIsIGhhcyBtb3JlIGNvbXBsZXgKKyAgICAgICAgIyBkZWNsYXJhdGlvbiBzeW50YXggZm9yIGVsZW1lbnRzIGluIDwhLi4uPiwgaW5jbHVkaW5nOgorICAgICAgICAjIC0tY29tbWVudC0tCisgICAgICAgICMgW21hcmtlZCBzZWN0aW9uXQorICAgICAgICAjIG5hbWUgaW4gdGhlIGZvbGxvd2luZyBsaXN0OiBFTlRJVFksIERPQ1RZUEUsIEVMRU1FTlQsCisgICAgICAgICMgQVRUTElTVCwgTk9UQVRJT04sIFNIT1JUUkVGLCBVU0VNQVAsCisgICAgICAgICMgTElOS1RZUEUsIExJTkssIElETElOSywgVVNFTElOSywgU1lTVEVNCisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgaiA9IGkgKyAyCisgICAgICAgIGFzc2VydCByYXdkYXRhW2k6al0gPT0gIjwhIiwgInVuZXhwZWN0ZWQgY2FsbCB0byBwYXJzZV9kZWNsYXJhdGlvbiIKKyAgICAgICAgaWYgcmF3ZGF0YVtqOmorMV0gPT0gIj4iOgorICAgICAgICAgICAgIyB0aGUgZW1wdHkgY29tbWVudCA8IT4KKyAgICAgICAgICAgIHJldHVybiBqICsgMQorICAgICAgICBpZiByYXdkYXRhW2o6aisxXSBpbiAoIi0iLCAiIik6CisgICAgICAgICAgICAjIFN0YXJ0IG9mIGNvbW1lbnQgZm9sbG93ZWQgYnkgYnVmZmVyIGJvdW5kYXJ5LAorICAgICAgICAgICAgIyBvciBqdXN0IGEgYnVmZmVyIGJvdW5kYXJ5LgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICMgQSBzaW1wbGUsIHByYWN0aWNhbCB2ZXJzaW9uIGNvdWxkIGxvb2sgbGlrZTogKChuYW1lfHN0cmluZ2xpdCkgUyopICsgJz4nCisgICAgICAgIG4gPSBsZW4ocmF3ZGF0YSkKKyAgICAgICAgaWYgcmF3ZGF0YVtqOmorMl0gPT0gJy0tJzogI2NvbW1lbnQKKyAgICAgICAgICAgICMgTG9jYXRlIC0tLiotLSBhcyB0aGUgYm9keSBvZiB0aGUgY29tbWVudAorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfY29tbWVudChpKQorICAgICAgICBlbGlmIHJhd2RhdGFbal0gPT0gJ1snOiAjbWFya2VkIHNlY3Rpb24KKyAgICAgICAgICAgICMgTG9jYXRlIFtzdGF0dXNXb3JkIFsuLi5hcmJpdHJhcnkgU0dNTC4uLl1dIGFzIHRoZSBib2R5IG9mIHRoZSBtYXJrZWQgc2VjdGlvbgorICAgICAgICAgICAgIyBXaGVyZSBzdGF0dXNXb3JkIGlzIG9uZSBvZiBURU1QLCBDREFUQSwgSUdOT1JFLCBJTkNMVURFLCBSQ0RBVEEKKyAgICAgICAgICAgICMgTm90ZSB0aGF0IHRoaXMgaXMgZXh0ZW5kZWQgYnkgTWljcm9zb2Z0IE9mZmljZSAiU2F2ZSBhcyBXZWIiIGZ1bmN0aW9uCisgICAgICAgICAgICAjIHRvIGluY2x1ZGUgW2lmLi4uXSBhbmQgW2VuZGlmXS4KKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX21hcmtlZF9zZWN0aW9uKGkpCisgICAgICAgIGVsc2U6ICNhbGwgb3RoZXIgZGVjbGFyYXRpb24gZWxlbWVudHMKKyAgICAgICAgICAgIGRlY2x0eXBlLCBqID0gc2VsZi5fc2Nhbl9uYW1lKGosIGkpCisgICAgICAgIGlmIGogPCAwOgorICAgICAgICAgICAgcmV0dXJuIGoKKyAgICAgICAgaWYgZGVjbHR5cGUgPT0gImRvY3R5cGUiOgorICAgICAgICAgICAgc2VsZi5fZGVjbF9vdGhlcmNoYXJzID0gJycKKyAgICAgICAgd2hpbGUgaiA8IG46CisgICAgICAgICAgICBjID0gcmF3ZGF0YVtqXQorICAgICAgICAgICAgaWYgYyA9PSAiPiI6CisgICAgICAgICAgICAgICAgIyBlbmQgb2YgZGVjbGFyYXRpb24gc3ludGF4CisgICAgICAgICAgICAgICAgZGF0YSA9IHJhd2RhdGFbaSsyOmpdCisgICAgICAgICAgICAgICAgaWYgZGVjbHR5cGUgPT0gImRvY3R5cGUiOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kZWNsKGRhdGEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBBY2NvcmRpbmcgdG8gdGhlIEhUTUw1IHNwZWNzIHNlY3Rpb25zICI4LjIuNC40NCBCb2d1cworICAgICAgICAgICAgICAgICAgICAjIGNvbW1lbnQgc3RhdGUiIGFuZCAiOC4yLjQuNDUgTWFya3VwIGRlY2xhcmF0aW9uIG9wZW4KKyAgICAgICAgICAgICAgICAgICAgIyBzdGF0ZSIsIGEgY29tbWVudCB0b2tlbiBzaG91bGQgYmUgZW1pdHRlZC4KKyAgICAgICAgICAgICAgICAgICAgIyBDYWxsaW5nIHVua25vd25fZGVjbCBwcm92aWRlcyBtb3JlIGZsZXhpYmlsaXR5IHRob3VnaC4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmtub3duX2RlY2woZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaiArIDEKKyAgICAgICAgICAgIGlmIGMgaW4gIlwiJyI6CisgICAgICAgICAgICAgICAgbSA9IF9kZWNsc3RyaW5nbGl0X21hdGNoKHJhd2RhdGEsIGopCisgICAgICAgICAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMSAjIGluY29tcGxldGUKKyAgICAgICAgICAgICAgICBqID0gbS5lbmQoKQorICAgICAgICAgICAgZWxpZiBjIGluICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjoKKyAgICAgICAgICAgICAgICBuYW1lLCBqID0gc2VsZi5fc2Nhbl9uYW1lKGosIGkpCisgICAgICAgICAgICBlbGlmIGMgaW4gc2VsZi5fZGVjbF9vdGhlcmNoYXJzOgorICAgICAgICAgICAgICAgIGogPSBqICsgMQorICAgICAgICAgICAgZWxpZiBjID09ICJbIjoKKyAgICAgICAgICAgICAgICAjIHRoaXMgY291bGQgYmUgaGFuZGxlZCBpbiBhIHNlcGFyYXRlIGRvY3R5cGUgcGFyc2VyCisgICAgICAgICAgICAgICAgaWYgZGVjbHR5cGUgPT0gImRvY3R5cGUiOgorICAgICAgICAgICAgICAgICAgICBqID0gc2VsZi5fcGFyc2VfZG9jdHlwZV9zdWJzZXQoaiArIDEsIGkpCisgICAgICAgICAgICAgICAgZWxpZiBkZWNsdHlwZSBpbiAoImF0dGxpc3QiLCAibGlua3R5cGUiLCAibGluayIsICJlbGVtZW50Iik6CisgICAgICAgICAgICAgICAgICAgICMgbXVzdCB0b2xlcmF0ZSBbXSdkIGdyb3VwcyBpbiBhIGNvbnRlbnQgbW9kZWwgaW4gYW4gZWxlbWVudCBkZWNsYXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAjIGFsc28gaW4gZGF0YSBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbnMgb2YgYXR0bGlzdCBkZWNsYXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAjIGFsc28gbGluayB0eXBlIGRlY2xhcmF0aW9uIHN1YnNldHMgaW4gbGlua3R5cGUgZGVjbGFyYXRpb25zCisgICAgICAgICAgICAgICAgICAgICMgYWxzbyBsaW5rIGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9uIGxpc3RzIGluIGxpbmsgZGVjbGFyYXRpb25zCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoInVuc3VwcG9ydGVkICdbJyBjaGFyIGluICVzIGRlY2xhcmF0aW9uIiAlIGRlY2x0eXBlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoInVuZXhwZWN0ZWQgJ1snIGNoYXIgaW4gZGVjbGFyYXRpb24iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yKAorICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCAlciBjaGFyIGluIGRlY2xhcmF0aW9uIiAlIHJhd2RhdGFbal0pCisgICAgICAgICAgICBpZiBqIDwgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gagorICAgICAgICByZXR1cm4gLTEgIyBpbmNvbXBsZXRlCisKKyAgICAjIEludGVybmFsIC0tIHBhcnNlIGEgbWFya2VkIHNlY3Rpb24KKyAgICAjIE92ZXJyaWRlIHRoaXMgdG8gaGFuZGxlIE1TLXdvcmQgZXh0ZW5zaW9uIHN5bnRheCA8IVtpZiB3b3JkXT5jb250ZW50PCFbZW5kaWZdPgorICAgIGRlZiBwYXJzZV9tYXJrZWRfc2VjdGlvbihzZWxmLCBpLCByZXBvcnQ9MSk6CisgICAgICAgIHJhd2RhdGE9IHNlbGYucmF3ZGF0YQorICAgICAgICBhc3NlcnQgcmF3ZGF0YVtpOmkrM10gPT0gJzwhWycsICJ1bmV4cGVjdGVkIGNhbGwgdG8gcGFyc2VfbWFya2VkX3NlY3Rpb24oKSIKKyAgICAgICAgc2VjdE5hbWUsIGogPSBzZWxmLl9zY2FuX25hbWUoIGkrMywgaSApCisgICAgICAgIGlmIGogPCAwOgorICAgICAgICAgICAgcmV0dXJuIGoKKyAgICAgICAgaWYgc2VjdE5hbWUgaW4gKCJ0ZW1wIiwgImNkYXRhIiwgImlnbm9yZSIsICJpbmNsdWRlIiwgInJjZGF0YSIpOgorICAgICAgICAgICAgIyBsb29rIGZvciBzdGFuZGFyZCBdXT4gZW5kaW5nCisgICAgICAgICAgICBtYXRjaD0gX21hcmtlZHNlY3Rpb25jbG9zZS5zZWFyY2gocmF3ZGF0YSwgaSszKQorICAgICAgICBlbGlmIHNlY3ROYW1lIGluICgiaWYiLCAiZWxzZSIsICJlbmRpZiIpOgorICAgICAgICAgICAgIyBsb29rIGZvciBNUyBPZmZpY2UgXT4gZW5kaW5nCisgICAgICAgICAgICBtYXRjaD0gX21zbWFya2Vkc2VjdGlvbmNsb3NlLnNlYXJjaChyYXdkYXRhLCBpKzMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmVycm9yKCd1bmtub3duIHN0YXR1cyBrZXl3b3JkICVyIGluIG1hcmtlZCBzZWN0aW9uJyAlIHJhd2RhdGFbaSszOmpdKQorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgaWYgcmVwb3J0OgorICAgICAgICAgICAgaiA9IG1hdGNoLnN0YXJ0KDApCisgICAgICAgICAgICBzZWxmLnVua25vd25fZGVjbChyYXdkYXRhW2krMzogal0pCisgICAgICAgIHJldHVybiBtYXRjaC5lbmQoMCkKKworICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgY29tbWVudCwgcmV0dXJuIGxlbmd0aCBvciAtMSBpZiBub3QgdGVybWluYXRlZAorICAgIGRlZiBwYXJzZV9jb21tZW50KHNlbGYsIGksIHJlcG9ydD0xKToKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBpZiByYXdkYXRhW2k6aSs0XSAhPSAnPCEtLSc6CisgICAgICAgICAgICBzZWxmLmVycm9yKCd1bmV4cGVjdGVkIGNhbGwgdG8gcGFyc2VfY29tbWVudCgpJykKKyAgICAgICAgbWF0Y2ggPSBfY29tbWVudGNsb3NlLnNlYXJjaChyYXdkYXRhLCBpKzQpCisgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBpZiByZXBvcnQ6CisgICAgICAgICAgICBqID0gbWF0Y2guc3RhcnQoMCkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2NvbW1lbnQocmF3ZGF0YVtpKzQ6IGpdKQorICAgICAgICByZXR1cm4gbWF0Y2guZW5kKDApCisKKyAgICAjIEludGVybmFsIC0tIHNjYW4gcGFzdCB0aGUgaW50ZXJuYWwgc3Vic2V0IGluIGEgPCFET0NUWVBFIGRlY2xhcmF0aW9uLAorICAgICMgcmV0dXJuaW5nIHRoZSBpbmRleCBqdXN0IHBhc3QgYW55IHdoaXRlc3BhY2UgZm9sbG93aW5nIHRoZSB0cmFpbGluZyAnXScuCisgICAgZGVmIF9wYXJzZV9kb2N0eXBlX3N1YnNldChzZWxmLCBpLCBkZWNsc3RhcnRwb3MpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIG4gPSBsZW4ocmF3ZGF0YSkKKyAgICAgICAgaiA9IGkKKyAgICAgICAgd2hpbGUgaiA8IG46CisgICAgICAgICAgICBjID0gcmF3ZGF0YVtqXQorICAgICAgICAgICAgaWYgYyA9PSAiPCI6CisgICAgICAgICAgICAgICAgcyA9IHJhd2RhdGFbajpqKzJdCisgICAgICAgICAgICAgICAgaWYgcyA9PSAiPCI6CisgICAgICAgICAgICAgICAgICAgICMgZW5kIG9mIGJ1ZmZlcjsgaW5jb21wbGV0ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICBpZiBzICE9ICI8ISI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlcG9zKGRlY2xzdGFydHBvcywgaiArIDEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoInVuZXhwZWN0ZWQgY2hhciBpbiBpbnRlcm5hbCBzdWJzZXQgKGluICVyKSIgJSBzKQorICAgICAgICAgICAgICAgIGlmIChqICsgMikgPT0gbjoKKyAgICAgICAgICAgICAgICAgICAgIyBlbmQgb2YgYnVmZmVyOyBpbmNvbXBsZXRlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgICAgIGlmIChqICsgNCkgPiBuOgorICAgICAgICAgICAgICAgICAgICAjIGVuZCBvZiBidWZmZXI7IGluY29tcGxldGUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgaWYgcmF3ZGF0YVtqOmorNF0gPT0gIjwhLS0iOgorICAgICAgICAgICAgICAgICAgICBqID0gc2VsZi5wYXJzZV9jb21tZW50KGosIHJlcG9ydD0wKQorICAgICAgICAgICAgICAgICAgICBpZiBqIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbmFtZSwgaiA9IHNlbGYuX3NjYW5fbmFtZShqICsgMiwgZGVjbHN0YXJ0cG9zKQorICAgICAgICAgICAgICAgIGlmIGogPT0gLTE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluICgiYXR0bGlzdCIsICJlbGVtZW50IiwgImVudGl0eSIsICJub3RhdGlvbiIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZXBvcyhkZWNsc3RhcnRwb3MsIGogKyAyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gZGVjbGFyYXRpb24gJXIgaW4gaW50ZXJuYWwgc3Vic2V0IiAlIG5hbWUpCisgICAgICAgICAgICAgICAgIyBoYW5kbGUgdGhlIGluZGl2aWR1YWwgbmFtZXMKKyAgICAgICAgICAgICAgICBtZXRoID0gZ2V0YXR0cihzZWxmLCAiX3BhcnNlX2RvY3R5cGVfIiArIG5hbWUpCisgICAgICAgICAgICAgICAgaiA9IG1ldGgoaiwgZGVjbHN0YXJ0cG9zKQorICAgICAgICAgICAgICAgIGlmIGogPCAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gagorICAgICAgICAgICAgZWxpZiBjID09ICIlIjoKKyAgICAgICAgICAgICAgICAjIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgaWYgKGogKyAxKSA9PSBuOgorICAgICAgICAgICAgICAgICAgICAjIGVuZCBvZiBidWZmZXI7IGluY29tcGxldGUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgcywgaiA9IHNlbGYuX3NjYW5fbmFtZShqICsgMSwgZGVjbHN0YXJ0cG9zKQorICAgICAgICAgICAgICAgIGlmIGogPCAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gagorICAgICAgICAgICAgICAgIGlmIHJhd2RhdGFbal0gPT0gIjsiOgorICAgICAgICAgICAgICAgICAgICBqID0gaiArIDEKKyAgICAgICAgICAgIGVsaWYgYyA9PSAiXSI6CisgICAgICAgICAgICAgICAgaiA9IGogKyAxCisgICAgICAgICAgICAgICAgd2hpbGUgaiA8IG4gYW5kIHJhd2RhdGFbal0uaXNzcGFjZSgpOgorICAgICAgICAgICAgICAgICAgICBqID0gaiArIDEKKyAgICAgICAgICAgICAgICBpZiBqIDwgbjoKKyAgICAgICAgICAgICAgICAgICAgaWYgcmF3ZGF0YVtqXSA9PSAiPiI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gagorICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZXBvcyhkZWNsc3RhcnRwb3MsIGopCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoInVuZXhwZWN0ZWQgY2hhciBhZnRlciBpbnRlcm5hbCBzdWJzZXQiKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgZWxpZiBjLmlzc3BhY2UoKToKKyAgICAgICAgICAgICAgICBqID0gaiArIDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVwb3MoZGVjbHN0YXJ0cG9zLCBqKQorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoInVuZXhwZWN0ZWQgY2hhciAlciBpbiBpbnRlcm5hbCBzdWJzZXQiICUgYykKKyAgICAgICAgIyBlbmQgb2YgYnVmZmVyIHJlYWNoZWQKKyAgICAgICAgcmV0dXJuIC0xCisKKyAgICAjIEludGVybmFsIC0tIHNjYW4gcGFzdCA8IUVMRU1FTlQgZGVjbGFyYXRpb25zCisgICAgZGVmIF9wYXJzZV9kb2N0eXBlX2VsZW1lbnQoc2VsZiwgaSwgZGVjbHN0YXJ0cG9zKToKKyAgICAgICAgbmFtZSwgaiA9IHNlbGYuX3NjYW5fbmFtZShpLCBkZWNsc3RhcnRwb3MpCisgICAgICAgIGlmIGogPT0gLTE6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgIyBzdHlsZSBjb250ZW50IG1vZGVsOyBqdXN0IHNraXAgdW50aWwgJz4nCisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgaWYgJz4nIGluIHJhd2RhdGFbajpdOgorICAgICAgICAgICAgcmV0dXJuIHJhd2RhdGEuZmluZCgiPiIsIGopICsgMQorICAgICAgICByZXR1cm4gLTEKKworICAgICMgSW50ZXJuYWwgLS0gc2NhbiBwYXN0IDwhQVRUTElTVCBkZWNsYXJhdGlvbnMKKyAgICBkZWYgX3BhcnNlX2RvY3R5cGVfYXR0bGlzdChzZWxmLCBpLCBkZWNsc3RhcnRwb3MpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIG5hbWUsIGogPSBzZWxmLl9zY2FuX25hbWUoaSwgZGVjbHN0YXJ0cG9zKQorICAgICAgICBjID0gcmF3ZGF0YVtqOmorMV0KKyAgICAgICAgaWYgYyA9PSAiIjoKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBpZiBjID09ICI+IjoKKyAgICAgICAgICAgIHJldHVybiBqICsgMQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgIyBzY2FuIGEgc2VyaWVzIG9mIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbnM7IHNpbXBsaWZpZWQ6CisgICAgICAgICAgICAjICAgbmFtZSB0eXBlIFt2YWx1ZV0gWyNjb25zdHJhaW50XQorICAgICAgICAgICAgbmFtZSwgaiA9IHNlbGYuX3NjYW5fbmFtZShqLCBkZWNsc3RhcnRwb3MpCisgICAgICAgICAgICBpZiBqIDwgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gagorICAgICAgICAgICAgYyA9IHJhd2RhdGFbajpqKzFdCisgICAgICAgICAgICBpZiBjID09ICIiOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgaWYgYyA9PSAiKCI6CisgICAgICAgICAgICAgICAgIyBhbiBlbnVtZXJhdGVkIHR5cGU7IGxvb2sgZm9yICcpJworICAgICAgICAgICAgICAgIGlmICIpIiBpbiByYXdkYXRhW2o6XToKKyAgICAgICAgICAgICAgICAgICAgaiA9IHJhd2RhdGEuZmluZCgiKSIsIGopICsgMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgICAgIHdoaWxlIHJhd2RhdGFbajpqKzFdLmlzc3BhY2UoKToKKyAgICAgICAgICAgICAgICAgICAgaiA9IGogKyAxCisgICAgICAgICAgICAgICAgaWYgbm90IHJhd2RhdGFbajpdOgorICAgICAgICAgICAgICAgICAgICAjIGVuZCBvZiBidWZmZXIsIGluY29tcGxldGUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWUsIGogPSBzZWxmLl9zY2FuX25hbWUoaiwgZGVjbHN0YXJ0cG9zKQorICAgICAgICAgICAgYyA9IHJhd2RhdGFbajpqKzFdCisgICAgICAgICAgICBpZiBub3QgYzoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGlmIGMgaW4gIidcIiI6CisgICAgICAgICAgICAgICAgbSA9IF9kZWNsc3RyaW5nbGl0X21hdGNoKHJhd2RhdGEsIGopCisgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgaiA9IG0uZW5kKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICBjID0gcmF3ZGF0YVtqOmorMV0KKyAgICAgICAgICAgICAgICBpZiBub3QgYzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBpZiBjID09ICIjIjoKKyAgICAgICAgICAgICAgICBpZiByYXdkYXRhW2o6XSA9PSAiIyI6CisgICAgICAgICAgICAgICAgICAgICMgZW5kIG9mIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICBuYW1lLCBqID0gc2VsZi5fc2Nhbl9uYW1lKGogKyAxLCBkZWNsc3RhcnRwb3MpCisgICAgICAgICAgICAgICAgaWYgaiA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBqCisgICAgICAgICAgICAgICAgYyA9IHJhd2RhdGFbajpqKzFdCisgICAgICAgICAgICAgICAgaWYgbm90IGM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgaWYgYyA9PSAnPic6CisgICAgICAgICAgICAgICAgIyBhbGwgZG9uZQorICAgICAgICAgICAgICAgIHJldHVybiBqICsgMQorCisgICAgIyBJbnRlcm5hbCAtLSBzY2FuIHBhc3QgPCFOT1RBVElPTiBkZWNsYXJhdGlvbnMKKyAgICBkZWYgX3BhcnNlX2RvY3R5cGVfbm90YXRpb24oc2VsZiwgaSwgZGVjbHN0YXJ0cG9zKToKKyAgICAgICAgbmFtZSwgaiA9IHNlbGYuX3NjYW5fbmFtZShpLCBkZWNsc3RhcnRwb3MpCisgICAgICAgIGlmIGogPCAwOgorICAgICAgICAgICAgcmV0dXJuIGoKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgYyA9IHJhd2RhdGFbajpqKzFdCisgICAgICAgICAgICBpZiBub3QgYzoKKyAgICAgICAgICAgICAgICAjIGVuZCBvZiBidWZmZXI7IGluY29tcGxldGUKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGlmIGMgPT0gJz4nOgorICAgICAgICAgICAgICAgIHJldHVybiBqICsgMQorICAgICAgICAgICAgaWYgYyBpbiAiJ1wiIjoKKyAgICAgICAgICAgICAgICBtID0gX2RlY2xzdHJpbmdsaXRfbWF0Y2gocmF3ZGF0YSwgaikKKyAgICAgICAgICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgaiA9IG0uZW5kKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmFtZSwgaiA9IHNlbGYuX3NjYW5fbmFtZShqLCBkZWNsc3RhcnRwb3MpCisgICAgICAgICAgICAgICAgaWYgaiA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBqCisKKyAgICAjIEludGVybmFsIC0tIHNjYW4gcGFzdCA8IUVOVElUWSBkZWNsYXJhdGlvbnMKKyAgICBkZWYgX3BhcnNlX2RvY3R5cGVfZW50aXR5KHNlbGYsIGksIGRlY2xzdGFydHBvcyk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgaWYgcmF3ZGF0YVtpOmkrMV0gPT0gIiUiOgorICAgICAgICAgICAgaiA9IGkgKyAxCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGMgPSByYXdkYXRhW2o6aisxXQorICAgICAgICAgICAgICAgIGlmIG5vdCBjOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICBpZiBjLmlzc3BhY2UoKToKKyAgICAgICAgICAgICAgICAgICAgaiA9IGogKyAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGogPSBpCisgICAgICAgIG5hbWUsIGogPSBzZWxmLl9zY2FuX25hbWUoaiwgZGVjbHN0YXJ0cG9zKQorICAgICAgICBpZiBqIDwgMDoKKyAgICAgICAgICAgIHJldHVybiBqCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBjID0gc2VsZi5yYXdkYXRhW2o6aisxXQorICAgICAgICAgICAgaWYgbm90IGM6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBpZiBjIGluICInXCIiOgorICAgICAgICAgICAgICAgIG0gPSBfZGVjbHN0cmluZ2xpdF9tYXRjaChyYXdkYXRhLCBqKQorICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgIGogPSBtLmVuZCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xICAgICMgaW5jb21wbGV0ZQorICAgICAgICAgICAgZWxpZiBjID09ICI+IjoKKyAgICAgICAgICAgICAgICByZXR1cm4gaiArIDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmFtZSwgaiA9IHNlbGYuX3NjYW5fbmFtZShqLCBkZWNsc3RhcnRwb3MpCisgICAgICAgICAgICAgICAgaWYgaiA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBqCisKKyAgICAjIEludGVybmFsIC0tIHNjYW4gYSBuYW1lIHRva2VuIGFuZCB0aGUgbmV3IHBvc2l0aW9uIGFuZCB0aGUgdG9rZW4sIG9yCisgICAgIyByZXR1cm4gLTEgaWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAgZGVmIF9zY2FuX25hbWUoc2VsZiwgaSwgZGVjbHN0YXJ0cG9zKToKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBuID0gbGVuKHJhd2RhdGEpCisgICAgICAgIGlmIGkgPT0gbjoKKyAgICAgICAgICAgIHJldHVybiBOb25lLCAtMQorICAgICAgICBtID0gX2RlY2xuYW1lX21hdGNoKHJhd2RhdGEsIGkpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBzID0gbS5ncm91cCgpCisgICAgICAgICAgICBuYW1lID0gcy5zdHJpcCgpCisgICAgICAgICAgICBpZiAoaSArIGxlbihzKSkgPT0gbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZSwgLTEgICMgZW5kIG9mIGJ1ZmZlcgorICAgICAgICAgICAgcmV0dXJuIG5hbWUubG93ZXIoKSwgbS5lbmQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi51cGRhdGVwb3MoZGVjbHN0YXJ0cG9zLCBpKQorICAgICAgICAgICAgc2VsZi5lcnJvcigiZXhwZWN0ZWQgbmFtZSB0b2tlbiBhdCAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgJSByYXdkYXRhW2RlY2xzdGFydHBvczpkZWNsc3RhcnRwb3MrMjBdKQorCisgICAgIyBUbyBiZSBvdmVycmlkZGVuIC0tIGhhbmRsZXJzIGZvciB1bmtub3duIG9iamVjdHMKKyAgICBkZWYgdW5rbm93bl9kZWNsKHNlbGYsIGRhdGEpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21hcmt1cGJhc2UucHljIGIvbGliL3B5dGhvbjIuNy9tYXJrdXBiYXNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWQyY2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tYXJrdXBiYXNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21hcmt1cGJhc2UucHlvIGIvbGliL3B5dGhvbjIuNy9tYXJrdXBiYXNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWIxOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tYXJrdXBiYXNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21kNS5weSBiL2xpYi9weXRob24yLjcvbWQ1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NGNhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21kNS5weQpAQCAtMCwwICsxLDE0IEBACisjICRJZCQKKyMKKyMgIENvcHlyaWdodCAoQykgMjAwNSAgIEdyZWdvcnkgUC4gU21pdGggKGdyZWdAa3J5cHRvLm9yZykKKyMgIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy53YXJuKCJ0aGUgbWQ1IG1vZHVsZSBpcyBkZXByZWNhdGVkOyB1c2UgaGFzaGxpYiBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisKK2Zyb20gaGFzaGxpYiBpbXBvcnQgbWQ1CituZXcgPSBtZDUKKworYmxvY2tzaXplID0gMSAgICAgICAgIyBsZWdhY3kgdmFsdWUgKHdyb25nIGluIGFueSB1c2VmdWwgc2Vuc2UpCitkaWdlc3Rfc2l6ZSA9IDE2CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21kNS5weWMgYi9saWIvcHl0aG9uMi43L21kNS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkZDBkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWQ1LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21kNS5weW8gYi9saWIvcHl0aG9uMi43L21kNS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkZDBkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWQ1LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21obGliLnB5IGIvbGliL3B5dGhvbjIuNy9taGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTZlODc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9taGxpYi5weQpAQCAtMCwwICsxLDEwMDUgQEAKKyIiIk1IIGludGVyZmFjZSAtLSBwdXJlbHkgb2JqZWN0LW9yaWVudGVkICh3ZWxsLCBhbG1vc3QpCisKK0V4ZWN1dGl2ZSBzdW1tYXJ5OgorCitpbXBvcnQgbWhsaWIKKworbWggPSBtaGxpYi5NSCgpICAgICAgICAgIyB1c2UgZGVmYXVsdCBtYWlsYm94IGRpcmVjdG9yeSBhbmQgcHJvZmlsZQorbWggPSBtaGxpYi5NSChtYWlsYm94KSAgIyBvdmVycmlkZSBtYWlsYm94IGxvY2F0aW9uIChkZWZhdWx0IGZyb20gcHJvZmlsZSkKK21oID0gbWhsaWIuTUgobWFpbGJveCwgcHJvZmlsZSkgIyBvdmVycmlkZSBtYWlsYm94IGFuZCBwcm9maWxlCisKK21oLmVycm9yKGZvcm1hdCwgLi4uKSAgICMgcHJpbnQgZXJyb3IgbWVzc2FnZSAtLSBjYW4gYmUgb3ZlcnJpZGRlbgorcyA9IG1oLmdldHByb2ZpbGUoa2V5KSAgIyBwcm9maWxlIGVudHJ5IChOb25lIGlmIG5vdCBzZXQpCitwYXRoID0gbWguZ2V0cGF0aCgpICAgICAjIG1haWxib3ggcGF0aG5hbWUKK25hbWUgPSBtaC5nZXRjb250ZXh0KCkgICMgbmFtZSBvZiBjdXJyZW50IGZvbGRlcgorbWguc2V0Y29udGV4dChuYW1lKSAgICAgIyBzZXQgbmFtZSBvZiBjdXJyZW50IGZvbGRlcgorCitsaXN0ID0gbWgubGlzdGZvbGRlcnMoKSAjIG5hbWVzIG9mIHRvcC1sZXZlbCBmb2xkZXJzCitsaXN0ID0gbWgubGlzdGFsbGZvbGRlcnMoKSAjIG5hbWVzIG9mIGFsbCBmb2xkZXJzLCBpbmNsdWRpbmcgc3ViZm9sZGVycworbGlzdCA9IG1oLmxpc3RzdWJmb2xkZXJzKG5hbWUpICMgZGlyZWN0IHN1YmZvbGRlcnMgb2YgZ2l2ZW4gZm9sZGVyCitsaXN0ID0gbWgubGlzdGFsbHN1YmZvbGRlcnMobmFtZSkgIyBhbGwgc3ViZm9sZGVycyBvZiBnaXZlbiBmb2xkZXIKKworbWgubWFrZWZvbGRlcihuYW1lKSAgICAgIyBjcmVhdGUgbmV3IGZvbGRlcgorbWguZGVsZXRlZm9sZGVyKG5hbWUpICAgIyBkZWxldGUgZm9sZGVyIC0tIG11c3QgaGF2ZSBubyBzdWJmb2xkZXJzCisKK2YgPSBtaC5vcGVuZm9sZGVyKG5hbWUpICMgbmV3IG9wZW4gZm9sZGVyIG9iamVjdAorCitmLmVycm9yKGZvcm1hdCwgLi4uKSAgICAjIHNhbWUgYXMgbWguZXJyb3IoZm9ybWF0LCAuLi4pCitwYXRoID0gZi5nZXRmdWxsbmFtZSgpICAjIGZvbGRlcidzIGZ1bGwgcGF0aG5hbWUKK3BhdGggPSBmLmdldHNlcXVlbmNlc2ZpbGVuYW1lKCkgIyBmdWxsIHBhdGhuYW1lIG9mIGZvbGRlcidzIHNlcXVlbmNlcyBmaWxlCitwYXRoID0gZi5nZXRtZXNzYWdlZmlsZW5hbWUobikgICMgZnVsbCBwYXRobmFtZSBvZiBtZXNzYWdlIG4gaW4gZm9sZGVyCisKK2xpc3QgPSBmLmxpc3RtZXNzYWdlcygpICMgbGlzdCBvZiBtZXNzYWdlcyBpbiBmb2xkZXIgKGFzIG51bWJlcnMpCituID0gZi5nZXRjdXJyZW50KCkgICAgICAjIGdldCBjdXJyZW50IG1lc3NhZ2UKK2Yuc2V0Y3VycmVudChuKSAgICAgICAgICMgc2V0IGN1cnJlbnQgbWVzc2FnZQorbGlzdCA9IGYucGFyc2VzZXF1ZW5jZShzZXEpICAgICAjIHBhcnNlIG1zZ3Mgc3ludGF4IGludG8gbGlzdCBvZiBtZXNzYWdlcworbiA9IGYuZ2V0bGFzdCgpICAgICAgICAgIyBnZXQgbGFzdCBtZXNzYWdlICgwIGlmIG5vIG1lc3NhZ3NlKQorZi5zZXRsYXN0KG4pICAgICAgICAgICAgIyBzZXQgbGFzdCBtZXNzYWdlIChpbnRlcm5hbCB1c2Ugb25seSkKKworZGljdCA9IGYuZ2V0c2VxdWVuY2VzKCkgIyBkaWN0aW9uYXJ5IG9mIHNlcXVlbmNlcyBpbiBmb2xkZXIge25hbWU6IGxpc3R9CitmLnB1dHNlcXVlbmNlcyhkaWN0KSAgICAjIHdyaXRlIHNlcXVlbmNlcyBiYWNrIHRvIGZvbGRlcgorCitmLmNyZWF0ZW1lc3NhZ2UobiwgZnApICAjIGFkZCBtZXNzYWdlIGZyb20gZmlsZSBmIGFzIG51bWJlciBuCitmLnJlbW92ZW1lc3NhZ2VzKGxpc3QpICAjIHJlbW92ZSBtZXNzYWdlcyBpbiBsaXN0IGZyb20gZm9sZGVyCitmLnJlZmlsZW1lc3NhZ2VzKGxpc3QsIHRvZm9sZGVyKSAjIG1vdmUgbWVzc2FnZXMgaW4gbGlzdCB0byBvdGhlciBmb2xkZXIKK2YubW92ZW1lc3NhZ2UobiwgdG9mb2xkZXIsIHRvbikgICMgbW92ZSBvbmUgbWVzc2FnZSB0byBhIGdpdmVuIGRlc3RpbmF0aW9uCitmLmNvcHltZXNzYWdlKG4sIHRvZm9sZGVyLCB0b24pICAjIGNvcHkgb25lIG1lc3NhZ2UgdG8gYSBnaXZlbiBkZXN0aW5hdGlvbgorCittID0gZi5vcGVubWVzc2FnZShuKSAgICAjIG5ldyBvcGVuIG1lc3NhZ2Ugb2JqZWN0IChjb3N0cyBhIGZpbGUgZGVzY3JpcHRvcikKK20gaXMgYSBkZXJpdmVkIGNsYXNzIG9mIG1pbWV0b29scy5NZXNzYWdlKHJmYzgyMi5NZXNzYWdlKSwgd2l0aDoKK3MgPSBtLmdldGhlYWRlcnRleHQoKSAgICMgdGV4dCBvZiBtZXNzYWdlJ3MgaGVhZGVycworcyA9IG0uZ2V0aGVhZGVydGV4dChwcmVkKSAjIHRleHQgb2YgbWVzc2FnZSdzIGhlYWRlcnMsIGZpbHRlcmVkIGJ5IHByZWQKK3MgPSBtLmdldGJvZHl0ZXh0KCkgICAgICMgdGV4dCBvZiBtZXNzYWdlJ3MgYm9keSwgZGVjb2RlZAorcyA9IG0uZ2V0Ym9keXRleHQoMCkgICAgIyB0ZXh0IG9mIG1lc3NhZ2UncyBib2R5LCBub3QgZGVjb2RlZAorIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSBtaGxpYiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wOyB1c2UgdGhlIG1haWxib3ggIgorICAgICAgICAgICAgIm1vZHVsZSBpbnN0ZWFkIiwgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKKyMgWFhYIFRvIGRvLCBmdW5jdGlvbmFsaXR5OgorIyAtIGFubm90YXRlIG1lc3NhZ2VzCisjIC0gc2VuZCBtZXNzYWdlcworIworIyBYWFggVG8gZG8sIG9yZ2FuaXphdGlvbjoKKyMgLSBtb3ZlIEludFNldCB0byBzZXBhcmF0ZSBmaWxlCisjIC0gbW92ZSBtb3N0IE1lc3NhZ2UgZnVuY3Rpb25hbGl0eSB0byBtb2R1bGUgbWltZXRvb2xzCisKKworIyBDdXN0b21pemFibGUgZGVmYXVsdHMKKworTUhfUFJPRklMRSA9ICd+Ly5taF9wcm9maWxlJworUEFUSCA9ICd+L01haWwnCitNSF9TRVFVRU5DRVMgPSAnLm1oX3NlcXVlbmNlcycKK0ZPTERFUl9QUk9URUNUID0gMDcwMAorCisKKyMgSW1wb3J0ZWQgbW9kdWxlcworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IG1pbWV0b29scworaW1wb3J0IG11bHRpZmlsZQoraW1wb3J0IHNodXRpbAorZnJvbSBiaXNlY3QgaW1wb3J0IGJpc2VjdAorCitfX2FsbF9fID0gWyJNSCIsIkVycm9yIiwiRm9sZGVyIiwiTWVzc2FnZSJdCisKKyMgRXhwb3J0ZWQgY29uc3RhbnRzCisKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIE1IOgorICAgICIiIkNsYXNzIHJlcHJlc2VudGluZyBhIHBhcnRpY3VsYXIgY29sbGVjdGlvbiBvZiBmb2xkZXJzLgorICAgIE9wdGlvbmFsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBhcmUgdGhlIHBhdGhuYW1lIGZvciB0aGUgZGlyZWN0b3J5CisgICAgY29udGFpbmluZyB0aGUgY29sbGVjdGlvbiwgYW5kIHRoZSBNSCBwcm9maWxlIHRvIHVzZS4KKyAgICBJZiBlaXRoZXIgaXMgb21pdHRlZCBvciBlbXB0eSBhIGRlZmF1bHQgaXMgdXNlZDsgdGhlIGRlZmF1bHQKKyAgICBkaXJlY3RvcnkgaXMgdGFrZW4gZnJvbSB0aGUgTUggcHJvZmlsZSBpZiBpdCBpcyBzcGVjaWZpZWQgdGhlcmUuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCA9IE5vbmUsIHByb2ZpbGUgPSBOb25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuIiIiCisgICAgICAgIGlmIHByb2ZpbGUgaXMgTm9uZTogcHJvZmlsZSA9IE1IX1BST0ZJTEUKKyAgICAgICAgc2VsZi5wcm9maWxlID0gb3MucGF0aC5leHBhbmR1c2VyKHByb2ZpbGUpCisgICAgICAgIGlmIHBhdGggaXMgTm9uZTogcGF0aCA9IHNlbGYuZ2V0cHJvZmlsZSgnUGF0aCcpCisgICAgICAgIGlmIG5vdCBwYXRoOiBwYXRoID0gUEFUSAorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhwYXRoKSBhbmQgcGF0aFswXSAhPSAnfic6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKCd+JywgcGF0aCkKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguZXhwYW5kdXNlcihwYXRoKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihwYXRoKTogcmFpc2UgRXJyb3IsICdNSCgpIHBhdGggbm90IGZvdW5kJworICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIlN0cmluZyByZXByZXNlbnRhdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuICdNSCglciwgJXIpJyAlIChzZWxmLnBhdGgsIHNlbGYucHJvZmlsZSkKKworICAgIGRlZiBlcnJvcihzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgIiIiUm91dGluZSB0byBwcmludCBhbiBlcnJvci4gIE1heSBiZSBvdmVycmlkZGVuIGJ5IGEgZGVyaXZlZCBjbGFzcy4iIiIKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnTUggZXJyb3I6ICVzXG4nICUgKG1zZyAlIGFyZ3MpKQorCisgICAgZGVmIGdldHByb2ZpbGUoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgcHJvZmlsZSBlbnRyeSwgTm9uZSBpZiBub3QgZm91bmQuIiIiCisgICAgICAgIHJldHVybiBwaWNrbGluZShzZWxmLnByb2ZpbGUsIGtleSkKKworICAgIGRlZiBnZXRwYXRoKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHBhdGggKHRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uJ3MgZGlyZWN0b3J5KS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucGF0aAorCisgICAgZGVmIGdldGNvbnRleHQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBmb2xkZXIuIiIiCisgICAgICAgIGNvbnRleHQgPSBwaWNrbGluZShvcy5wYXRoLmpvaW4oc2VsZi5nZXRwYXRoKCksICdjb250ZXh0JyksCisgICAgICAgICAgICAgICAgICAnQ3VycmVudC1Gb2xkZXInKQorICAgICAgICBpZiBub3QgY29udGV4dDogY29udGV4dCA9ICdpbmJveCcKKyAgICAgICAgcmV0dXJuIGNvbnRleHQKKworICAgIGRlZiBzZXRjb250ZXh0KHNlbGYsIGNvbnRleHQpOgorICAgICAgICAiIiJTZXQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZm9sZGVyLiIiIgorICAgICAgICBmbiA9IG9zLnBhdGguam9pbihzZWxmLmdldHBhdGgoKSwgJ2NvbnRleHQnKQorICAgICAgICBmID0gb3BlbihmbiwgInciKQorICAgICAgICBmLndyaXRlKCJDdXJyZW50LUZvbGRlcjogJXNcbiIgJSBjb250ZXh0KQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBsaXN0Zm9sZGVycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgdG9wLWxldmVsIGZvbGRlcnMuIiIiCisgICAgICAgIGZvbGRlcnMgPSBbXQorICAgICAgICBwYXRoID0gc2VsZi5nZXRwYXRoKCkKKyAgICAgICAgZm9yIG5hbWUgaW4gb3MubGlzdGRpcihwYXRoKToKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHBhdGgsIG5hbWUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxuYW1lKToKKyAgICAgICAgICAgICAgICBmb2xkZXJzLmFwcGVuZChuYW1lKQorICAgICAgICBmb2xkZXJzLnNvcnQoKQorICAgICAgICByZXR1cm4gZm9sZGVycworCisgICAgZGVmIGxpc3RzdWJmb2xkZXJzKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBzdWJmb2xkZXJzIGluIGEgZ2l2ZW4gZm9sZGVyCisgICAgICAgIChwcmVmaXhlZCB3aXRoIHRoZSBnaXZlbiBmb2xkZXIgbmFtZSkuIiIiCisgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHNlbGYucGF0aCwgbmFtZSkKKyAgICAgICAgIyBHZXQgdGhlIGxpbmsgY291bnQgc28gd2UgY2FuIGF2b2lkIGxpc3RpbmcgZm9sZGVycworICAgICAgICAjIHRoYXQgaGF2ZSBubyBzdWJmb2xkZXJzLgorICAgICAgICBubGlua3MgPSBvcy5zdGF0KGZ1bGxuYW1lKS5zdF9ubGluaworICAgICAgICBpZiBubGlua3MgPD0gMjoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBzdWJmb2xkZXJzID0gW10KKyAgICAgICAgc3VibmFtZXMgPSBvcy5saXN0ZGlyKGZ1bGxuYW1lKQorICAgICAgICBmb3Igc3VibmFtZSBpbiBzdWJuYW1lczoKKyAgICAgICAgICAgIGZ1bGxzdWJuYW1lID0gb3MucGF0aC5qb2luKGZ1bGxuYW1lLCBzdWJuYW1lKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsc3VibmFtZSk6CisgICAgICAgICAgICAgICAgbmFtZV9zdWJuYW1lID0gb3MucGF0aC5qb2luKG5hbWUsIHN1Ym5hbWUpCisgICAgICAgICAgICAgICAgc3ViZm9sZGVycy5hcHBlbmQobmFtZV9zdWJuYW1lKQorICAgICAgICAgICAgICAgICMgU3RvcCBsb29raW5nIGZvciBzdWJmb2xkZXJzIHdoZW4KKyAgICAgICAgICAgICAgICAjIHdlJ3ZlIHNlZW4gdGhlbSBhbGwKKyAgICAgICAgICAgICAgICBubGlua3MgPSBubGlua3MgLSAxCisgICAgICAgICAgICAgICAgaWYgbmxpbmtzIDw9IDI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHN1YmZvbGRlcnMuc29ydCgpCisgICAgICAgIHJldHVybiBzdWJmb2xkZXJzCisKKyAgICBkZWYgbGlzdGFsbGZvbGRlcnMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbmFtZXMgb2YgYWxsIGZvbGRlcnMgYW5kIHN1YmZvbGRlcnMsIHJlY3Vyc2l2ZWx5LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5saXN0YWxsc3ViZm9sZGVycygnJykKKworICAgIGRlZiBsaXN0YWxsc3ViZm9sZGVycyhzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lcyBvZiBzdWJmb2xkZXJzIGluIGEgZ2l2ZW4gZm9sZGVyLCByZWN1cnNpdmVseS4iIiIKKyAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBuYW1lKQorICAgICAgICAjIEdldCB0aGUgbGluayBjb3VudCBzbyB3ZSBjYW4gYXZvaWQgbGlzdGluZyBmb2xkZXJzCisgICAgICAgICMgdGhhdCBoYXZlIG5vIHN1YmZvbGRlcnMuCisgICAgICAgIG5saW5rcyA9IG9zLnN0YXQoZnVsbG5hbWUpLnN0X25saW5rCisgICAgICAgIGlmIG5saW5rcyA8PSAyOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIHN1YmZvbGRlcnMgPSBbXQorICAgICAgICBzdWJuYW1lcyA9IG9zLmxpc3RkaXIoZnVsbG5hbWUpCisgICAgICAgIGZvciBzdWJuYW1lIGluIHN1Ym5hbWVzOgorICAgICAgICAgICAgaWYgc3VibmFtZVswXSA9PSAnLCcgb3IgaXNudW1lcmljKHN1Ym5hbWUpOiBjb250aW51ZQorICAgICAgICAgICAgZnVsbHN1Ym5hbWUgPSBvcy5wYXRoLmpvaW4oZnVsbG5hbWUsIHN1Ym5hbWUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxzdWJuYW1lKToKKyAgICAgICAgICAgICAgICBuYW1lX3N1Ym5hbWUgPSBvcy5wYXRoLmpvaW4obmFtZSwgc3VibmFtZSkKKyAgICAgICAgICAgICAgICBzdWJmb2xkZXJzLmFwcGVuZChuYW1lX3N1Ym5hbWUpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNsaW5rKGZ1bGxzdWJuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgc3Vic3ViZm9sZGVycyA9IHNlbGYubGlzdGFsbHN1YmZvbGRlcnMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3N1Ym5hbWUpCisgICAgICAgICAgICAgICAgICAgIHN1YmZvbGRlcnMgPSBzdWJmb2xkZXJzICsgc3Vic3ViZm9sZGVycworICAgICAgICAgICAgICAgICMgU3RvcCBsb29raW5nIGZvciBzdWJmb2xkZXJzIHdoZW4KKyAgICAgICAgICAgICAgICAjIHdlJ3ZlIHNlZW4gdGhlbSBhbGwKKyAgICAgICAgICAgICAgICBubGlua3MgPSBubGlua3MgLSAxCisgICAgICAgICAgICAgICAgaWYgbmxpbmtzIDw9IDI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHN1YmZvbGRlcnMuc29ydCgpCisgICAgICAgIHJldHVybiBzdWJmb2xkZXJzCisKKyAgICBkZWYgb3BlbmZvbGRlcihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbmV3IEZvbGRlciBvYmplY3QgZm9yIHRoZSBuYW1lZCBmb2xkZXIuIiIiCisgICAgICAgIHJldHVybiBGb2xkZXIoc2VsZiwgbmFtZSkKKworICAgIGRlZiBtYWtlZm9sZGVyKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgZm9sZGVyIChvciByYWlzZSBvcy5lcnJvciBpZiBpdCBjYW5ub3QgYmUgY3JlYXRlZCkuIiIiCisgICAgICAgIHByb3RlY3QgPSBwaWNrbGluZShzZWxmLnByb2ZpbGUsICdGb2xkZXItUHJvdGVjdCcpCisgICAgICAgIGlmIHByb3RlY3QgYW5kIGlzbnVtZXJpYyhwcm90ZWN0KToKKyAgICAgICAgICAgIG1vZGUgPSBpbnQocHJvdGVjdCwgOCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZGUgPSBGT0xERVJfUFJPVEVDVAorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5nZXRwYXRoKCksIG5hbWUpLCBtb2RlKQorCisgICAgZGVmIGRlbGV0ZWZvbGRlcihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiRGVsZXRlIGEgZm9sZGVyLiAgVGhpcyByZW1vdmVzIGZpbGVzIGluIHRoZSBmb2xkZXIgYnV0IG5vdAorICAgICAgICBzdWJkaXJlY3Rvcmllcy4gIFJhaXNlIG9zLmVycm9yIGlmIGRlbGV0aW5nIHRoZSBmb2xkZXIgaXRzZWxmIGZhaWxzLiIiIgorICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmdldHBhdGgoKSwgbmFtZSkKKyAgICAgICAgZm9yIHN1Ym5hbWUgaW4gb3MubGlzdGRpcihmdWxsbmFtZSk6CisgICAgICAgICAgICBmdWxsc3VibmFtZSA9IG9zLnBhdGguam9pbihmdWxsbmFtZSwgc3VibmFtZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZnVsbHN1Ym5hbWUpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5lcnJvcignJXMgbm90IGRlbGV0ZWQsIGNvbnRpbnVpbmcuLi4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbHN1Ym5hbWUpCisgICAgICAgIG9zLnJtZGlyKGZ1bGxuYW1lKQorCisKK251bWVyaWNwcm9nID0gcmUuY29tcGlsZSgnXlsxLTldWzAtOV0qJCcpCitkZWYgaXNudW1lcmljKHN0cik6CisgICAgcmV0dXJuIG51bWVyaWNwcm9nLm1hdGNoKHN0cikgaXMgbm90IE5vbmUKKworY2xhc3MgRm9sZGVyOgorICAgICIiIkNsYXNzIHJlcHJlc2VudGluZyBhIHBhcnRpY3VsYXIgZm9sZGVyLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1oLCBuYW1lKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuIiIiCisgICAgICAgIHNlbGYubWggPSBtaAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHNlbGYuZ2V0ZnVsbG5hbWUoKSk6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ25vIGZvbGRlciAlcycgJSBuYW1lCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIlN0cmluZyByZXByZXNlbnRhdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuICdGb2xkZXIoJXIsICVyKScgJSAoc2VsZi5taCwgc2VsZi5uYW1lKQorCisgICAgZGVmIGVycm9yKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiRXJyb3IgbWVzc2FnZSBoYW5kbGVyLiIiIgorICAgICAgICBzZWxmLm1oLmVycm9yKCphcmdzKQorCisgICAgZGVmIGdldGZ1bGxuYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGZvbGRlci4iIiIKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLm1oLnBhdGgsIHNlbGYubmFtZSkKKworICAgIGRlZiBnZXRzZXF1ZW5jZXNmaWxlbmFtZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBmb2xkZXIncyBzZXF1ZW5jZXMgZmlsZS4iIiIKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmdldGZ1bGxuYW1lKCksIE1IX1NFUVVFTkNFUykKKworICAgIGRlZiBnZXRtZXNzYWdlZmlsZW5hbWUoc2VsZiwgbik6CisgICAgICAgICIiIlJldHVybiB0aGUgZnVsbCBwYXRobmFtZSBvZiBhIG1lc3NhZ2UgaW4gdGhlIGZvbGRlci4iIiIKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmdldGZ1bGxuYW1lKCksIHN0cihuKSkKKworICAgIGRlZiBsaXN0c3ViZm9sZGVycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgZGlyZWN0IHN1YmZvbGRlcnMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLm1oLmxpc3RzdWJmb2xkZXJzKHNlbGYubmFtZSkKKworICAgIGRlZiBsaXN0YWxsc3ViZm9sZGVycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgYWxsIHN1YmZvbGRlcnMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLm1oLmxpc3RhbGxzdWJmb2xkZXJzKHNlbGYubmFtZSkKKworICAgIGRlZiBsaXN0bWVzc2FnZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbGlzdCBvZiBtZXNzYWdlcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgZm9sZGVyLgorICAgICAgICBBcyBhIHNpZGUgZWZmZWN0LCBzZXQgc2VsZi5sYXN0IHRvIHRoZSBsYXN0IG1lc3NhZ2UgKG9yIDApLiIiIgorICAgICAgICBtZXNzYWdlcyA9IFtdCisgICAgICAgIG1hdGNoID0gbnVtZXJpY3Byb2cubWF0Y2gKKyAgICAgICAgYXBwZW5kID0gbWVzc2FnZXMuYXBwZW5kCisgICAgICAgIGZvciBuYW1lIGluIG9zLmxpc3RkaXIoc2VsZi5nZXRmdWxsbmFtZSgpKToKKyAgICAgICAgICAgIGlmIG1hdGNoKG5hbWUpOgorICAgICAgICAgICAgICAgIGFwcGVuZChuYW1lKQorICAgICAgICBtZXNzYWdlcyA9IG1hcChpbnQsIG1lc3NhZ2VzKQorICAgICAgICBtZXNzYWdlcy5zb3J0KCkKKyAgICAgICAgaWYgbWVzc2FnZXM6CisgICAgICAgICAgICBzZWxmLmxhc3QgPSBtZXNzYWdlc1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubGFzdCA9IDAKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VzCisKKyAgICBkZWYgZ2V0c2VxdWVuY2VzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHNldCBvZiBzZXF1ZW5jZXMgZm9yIHRoZSBmb2xkZXIuIiIiCisgICAgICAgIHNlcXVlbmNlcyA9IHt9CisgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5nZXRzZXF1ZW5jZXNmaWxlbmFtZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKGZ1bGxuYW1lLCAncicpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlcworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgICAgICBmaWVsZHMgPSBsaW5lLnNwbGl0KCc6JykKKyAgICAgICAgICAgIGlmIGxlbihmaWVsZHMpICE9IDI6CisgICAgICAgICAgICAgICAgc2VsZi5lcnJvcignYmFkIHNlcXVlbmNlIGluICVzOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVsbG5hbWUsIGxpbmUuc3RyaXAoKSkpCisgICAgICAgICAgICBrZXkgPSBmaWVsZHNbMF0uc3RyaXAoKQorICAgICAgICAgICAgdmFsdWUgPSBJbnRTZXQoZmllbGRzWzFdLnN0cmlwKCksICcgJykudG9saXN0KCkKKyAgICAgICAgICAgIHNlcXVlbmNlc1trZXldID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIHNlcXVlbmNlcworCisgICAgZGVmIHB1dHNlcXVlbmNlcyhzZWxmLCBzZXF1ZW5jZXMpOgorICAgICAgICAiIiJXcml0ZSB0aGUgc2V0IG9mIHNlcXVlbmNlcyBiYWNrIHRvIHRoZSBmb2xkZXIuIiIiCisgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5nZXRzZXF1ZW5jZXNmaWxlbmFtZSgpCisgICAgICAgIGYgPSBOb25lCisgICAgICAgIGZvciBrZXksIHNlcSBpbiBzZXF1ZW5jZXMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzID0gSW50U2V0KCcnLCAnICcpCisgICAgICAgICAgICBzLmZyb21saXN0KHNlcSkKKyAgICAgICAgICAgIGlmIG5vdCBmOiBmID0gb3BlbihmdWxsbmFtZSwgJ3cnKQorICAgICAgICAgICAgZi53cml0ZSgnJXM6ICVzXG4nICUgKGtleSwgcy50b3N0cmluZygpKSkKKyAgICAgICAgaWYgbm90IGY6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGZ1bGxuYW1lKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIGdldGN1cnJlbnQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCBtZXNzYWdlLiAgUmFpc2UgRXJyb3Igd2hlbiB0aGVyZSBpcyBub25lLiIiIgorICAgICAgICBzZXFzID0gc2VsZi5nZXRzZXF1ZW5jZXMoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gbWF4KHNlcXNbJ2N1ciddKQorICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIEtleUVycm9yKToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAibm8gY3VyIG1lc3NhZ2UiCisKKyAgICBkZWYgc2V0Y3VycmVudChzZWxmLCBuKToKKyAgICAgICAgIiIiU2V0IHRoZSBjdXJyZW50IG1lc3NhZ2UuIiIiCisgICAgICAgIHVwZGF0ZWxpbmUoc2VsZi5nZXRzZXF1ZW5jZXNmaWxlbmFtZSgpLCAnY3VyJywgc3RyKG4pLCAwKQorCisgICAgZGVmIHBhcnNlc2VxdWVuY2Uoc2VsZiwgc2VxKToKKyAgICAgICAgIiIiUGFyc2UgYW4gTUggc2VxdWVuY2Ugc3BlY2lmaWNhdGlvbiBpbnRvIGEgbWVzc2FnZSBsaXN0LgorICAgICAgICBBdHRlbXB0IHRvIG1pbWljIG1oLXNlcXVlbmNlKDUpIGFzIGNsb3NlIGFzIHBvc3NpYmxlLgorICAgICAgICBBbHNvIGF0dGVtcHQgdG8gbWltaWMgb2JzZXJ2ZWQgYmVoYXZpb3IgcmVnYXJkaW5nIHdoaWNoCisgICAgICAgIGNvbmRpdGlvbnMgY2F1c2Ugd2hpY2ggZXJyb3IgbWVzc2FnZXMuIiIiCisgICAgICAgICMgWFhYIFN0aWxsIG5vdCBjb21wbGV0ZSAoc2VlIG1oLWZvcm1hdCg1KSkuCisgICAgICAgICMgTWlzc2luZyBhcmU6CisgICAgICAgICMgLSAncHJldicsICduZXh0JyBhcyBjb3VudAorICAgICAgICAjIC0gU2VxdWVuY2UtTmVnYXRpb24gb3B0aW9uCisgICAgICAgIGFsbCA9IHNlbGYubGlzdG1lc3NhZ2VzKCkKKyAgICAgICAgIyBPYnNlcnZlZCBiZWhhdmlvcjogdGVzdCBmb3IgZW1wdHkgZm9sZGVyIGlzIGRvbmUgZmlyc3QKKyAgICAgICAgaWYgbm90IGFsbDoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAibm8gbWVzc2FnZXMgaW4gJXMiICUgc2VsZi5uYW1lCisgICAgICAgICMgQ29tbW9uIGNhc2UgZmlyc3Q6IGFsbCBpcyBmcmVxdWVudGx5IHRoZSBkZWZhdWx0CisgICAgICAgIGlmIHNlcSA9PSAnYWxsJzoKKyAgICAgICAgICAgIHJldHVybiBhbGwKKyAgICAgICAgIyBUZXN0IGZvciBYOlkgYmVmb3JlIFgtWSBiZWNhdXNlICdzZXE6LW4nIG1hdGNoZXMgYm90aAorICAgICAgICBpID0gc2VxLmZpbmQoJzonKQorICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICBoZWFkLCBkaXIsIHRhaWwgPSBzZXFbOmldLCAnJywgc2VxW2krMTpdCisgICAgICAgICAgICBpZiB0YWlsWzoxXSBpbiAnLSsnOgorICAgICAgICAgICAgICAgIGRpciwgdGFpbCA9IHRhaWxbOjFdLCB0YWlsWzE6XQorICAgICAgICAgICAgaWYgbm90IGlzbnVtZXJpYyh0YWlsKToKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgImJhZCBtZXNzYWdlIGxpc3QgJXMiICUgc2VxCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY291bnQgPSBpbnQodGFpbCkKKyAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgT3ZlcmZsb3dFcnJvcik6CisgICAgICAgICAgICAgICAgIyBDYW4ndCB1c2Ugc3lzLm1heGludCBiZWNhdXNlIG9mIGkrY291bnQgYmVsb3cKKyAgICAgICAgICAgICAgICBjb3VudCA9IGxlbihhbGwpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYW5jaG9yID0gc2VsZi5fcGFyc2VpbmRleChoZWFkLCBhbGwpCisgICAgICAgICAgICBleGNlcHQgRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBzZXFzID0gc2VsZi5nZXRzZXF1ZW5jZXMoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBoZWFkIGluIHNlcXM6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtc2c6CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAiYmFkIG1lc3NhZ2UgbGlzdCAlcyIgJSBzZXEKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsIG1zZywgc3lzLmV4Y19pbmZvKClbMl0KKyAgICAgICAgICAgICAgICBtc2dzID0gc2Vxc1toZWFkXQorICAgICAgICAgICAgICAgIGlmIG5vdCBtc2dzOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgInNlcXVlbmNlICVzIGVtcHR5IiAlIGhlYWQKKyAgICAgICAgICAgICAgICBpZiBkaXIgPT0gJy0nOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbXNnc1stY291bnQ6XQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtc2dzWzpjb3VudF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbm90IGRpcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgaGVhZCBpbiAoJ3ByZXYnLCAnbGFzdCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgZGlyID0gJy0nCisgICAgICAgICAgICAgICAgaWYgZGlyID09ICctJzoKKyAgICAgICAgICAgICAgICAgICAgaSA9IGJpc2VjdChhbGwsIGFuY2hvcikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbFttYXgoMCwgaS1jb3VudCk6aV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpID0gYmlzZWN0KGFsbCwgYW5jaG9yLTEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxbaTppK2NvdW50XQorICAgICAgICAjIFRlc3QgZm9yIFgtWSBuZXh0CisgICAgICAgIGkgPSBzZXEuZmluZCgnLScpCisgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgIGJlZ2luID0gc2VsZi5fcGFyc2VpbmRleChzZXFbOmldLCBhbGwpCisgICAgICAgICAgICBlbmQgPSBzZWxmLl9wYXJzZWluZGV4KHNlcVtpKzE6XSwgYWxsKQorICAgICAgICAgICAgaSA9IGJpc2VjdChhbGwsIGJlZ2luLTEpCisgICAgICAgICAgICBqID0gYmlzZWN0KGFsbCwgZW5kKQorICAgICAgICAgICAgciA9IGFsbFtpOmpdCisgICAgICAgICAgICBpZiBub3QgcjoKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgImJhZCBtZXNzYWdlIGxpc3QgJXMiICUgc2VxCisgICAgICAgICAgICByZXR1cm4gcgorICAgICAgICAjIE5laXRoZXIgWDpZIG5vciBYLVk7IG11c3QgYmUgYSBudW1iZXIgb3IgYSAocHNldWRvLSlzZXF1ZW5jZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuID0gc2VsZi5fcGFyc2VpbmRleChzZXEsIGFsbCkKKyAgICAgICAgZXhjZXB0IEVycm9yLCBtc2c6CisgICAgICAgICAgICBzZXFzID0gc2VsZi5nZXRzZXF1ZW5jZXMoKQorICAgICAgICAgICAgaWYgbm90IHNlcSBpbiBzZXFzOgorICAgICAgICAgICAgICAgIGlmIG5vdCBtc2c6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJiYWQgbWVzc2FnZSBsaXN0ICVzIiAlIHNlcQorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCBtc2cKKyAgICAgICAgICAgIHJldHVybiBzZXFzW3NlcV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG4gbm90IGluIGFsbDoKKyAgICAgICAgICAgICAgICBpZiBpc251bWVyaWMoc2VxKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJtZXNzYWdlICVkIGRvZXNuJ3QgZXhpc3QiICUgbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAibm8gJXMgbWVzc2FnZSIgJSBzZXEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtuXQorCisgICAgZGVmIF9wYXJzZWluZGV4KHNlbGYsIHNlcSwgYWxsKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHBhcnNlIGEgbWVzc2FnZSBudW1iZXIgKG9yIGN1ciwgZmlyc3QsIGV0Yy4pLiIiIgorICAgICAgICBpZiBpc251bWVyaWMoc2VxKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50KHNlcSkKKyAgICAgICAgICAgIGV4Y2VwdCAoT3ZlcmZsb3dFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN5cy5tYXhpbnQKKyAgICAgICAgaWYgc2VxIGluICgnY3VyJywgJy4nKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdldGN1cnJlbnQoKQorICAgICAgICBpZiBzZXEgPT0gJ2ZpcnN0JzoKKyAgICAgICAgICAgIHJldHVybiBhbGxbMF0KKyAgICAgICAgaWYgc2VxID09ICdsYXN0JzoKKyAgICAgICAgICAgIHJldHVybiBhbGxbLTFdCisgICAgICAgIGlmIHNlcSA9PSAnbmV4dCc6CisgICAgICAgICAgICBuID0gc2VsZi5nZXRjdXJyZW50KCkKKyAgICAgICAgICAgIGkgPSBiaXNlY3QoYWxsLCBuKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBhbGxbaV0KKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAibm8gbmV4dCBtZXNzYWdlIgorICAgICAgICBpZiBzZXEgPT0gJ3ByZXYnOgorICAgICAgICAgICAgbiA9IHNlbGYuZ2V0Y3VycmVudCgpCisgICAgICAgICAgICBpID0gYmlzZWN0KGFsbCwgbi0xKQorICAgICAgICAgICAgaWYgaSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAibm8gcHJldiBtZXNzYWdlIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBhbGxbaS0xXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJubyBwcmV2IG1lc3NhZ2UiCisgICAgICAgIHJhaXNlIEVycm9yLCBOb25lCisKKyAgICBkZWYgb3Blbm1lc3NhZ2Uoc2VsZiwgbik6CisgICAgICAgICIiIk9wZW4gYSBtZXNzYWdlIC0tIHJldHVybnMgYSBNZXNzYWdlIG9iamVjdC4iIiIKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2Uoc2VsZiwgbikKKworICAgIGRlZiByZW1vdmVtZXNzYWdlcyhzZWxmLCBsaXN0KToKKyAgICAgICAgIiIiUmVtb3ZlIG9uZSBvciBtb3JlIG1lc3NhZ2VzIC0tIG1heSByYWlzZSBvcy5lcnJvci4iIiIKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgZGVsZXRlZCA9IFtdCisgICAgICAgIGZvciBuIGluIGxpc3Q6CisgICAgICAgICAgICBwYXRoID0gc2VsZi5nZXRtZXNzYWdlZmlsZW5hbWUobikKKyAgICAgICAgICAgIGNvbW1hcGF0aCA9IHNlbGYuZ2V0bWVzc2FnZWZpbGVuYW1lKCcsJyArIHN0cihuKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoY29tbWFwYXRoKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5yZW5hbWUocGF0aCwgY29tbWFwYXRoKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChtc2cpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlbGV0ZWQuYXBwZW5kKG4pCisgICAgICAgIGlmIGRlbGV0ZWQ6CisgICAgICAgICAgICBzZWxmLnJlbW92ZWZyb21hbGxzZXF1ZW5jZXMoZGVsZXRlZCkKKyAgICAgICAgaWYgZXJyb3JzOgorICAgICAgICAgICAgaWYgbGVuKGVycm9ycykgPT0gMToKKyAgICAgICAgICAgICAgICByYWlzZSBvcy5lcnJvciwgZXJyb3JzWzBdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIG9zLmVycm9yLCAoJ211bHRpcGxlIGVycm9yczonLCBlcnJvcnMpCisKKyAgICBkZWYgcmVmaWxlbWVzc2FnZXMoc2VsZiwgbGlzdCwgdG9mb2xkZXIsIGtlZXBzZXF1ZW5jZXM9MCk6CisgICAgICAgICIiIlJlZmlsZSBvbmUgb3IgbW9yZSBtZXNzYWdlcyAtLSBtYXkgcmFpc2Ugb3MuZXJyb3IuCisgICAgICAgICd0b2ZvbGRlcicgaXMgYW4gb3BlbiBmb2xkZXIgb2JqZWN0LiIiIgorICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICByZWZpbGVkID0ge30KKyAgICAgICAgZm9yIG4gaW4gbGlzdDoKKyAgICAgICAgICAgIHRvbiA9IHRvZm9sZGVyLmdldGxhc3QoKSArIDEKKyAgICAgICAgICAgIHBhdGggPSBzZWxmLmdldG1lc3NhZ2VmaWxlbmFtZShuKQorICAgICAgICAgICAgdG9wYXRoID0gdG9mb2xkZXIuZ2V0bWVzc2FnZWZpbGVuYW1lKHRvbikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5yZW5hbWUocGF0aCwgdG9wYXRoKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgICMgVHJ5IGNvcHlpbmcKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5MihwYXRoLCB0b3BhdGgpCisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhwYXRoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgb3MuZXJyb3IpLCBtc2c6CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQobXNnKQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsodG9wYXRoKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0b2ZvbGRlci5zZXRsYXN0KHRvbikKKyAgICAgICAgICAgIHJlZmlsZWRbbl0gPSB0b24KKyAgICAgICAgaWYgcmVmaWxlZDoKKyAgICAgICAgICAgIGlmIGtlZXBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgdG9mb2xkZXIuX2NvcHlzZXF1ZW5jZXMoc2VsZiwgcmVmaWxlZC5pdGVtcygpKQorICAgICAgICAgICAgc2VsZi5yZW1vdmVmcm9tYWxsc2VxdWVuY2VzKHJlZmlsZWQua2V5cygpKQorICAgICAgICBpZiBlcnJvcnM6CisgICAgICAgICAgICBpZiBsZW4oZXJyb3JzKSA9PSAxOgorICAgICAgICAgICAgICAgIHJhaXNlIG9zLmVycm9yLCBlcnJvcnNbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2Ugb3MuZXJyb3IsICgnbXVsdGlwbGUgZXJyb3JzOicsIGVycm9ycykKKworICAgIGRlZiBfY29weXNlcXVlbmNlcyhzZWxmLCBmcm9tZm9sZGVyLCByZWZpbGVkaXRlbXMpOgorICAgICAgICAiIiJIZWxwZXIgZm9yIHJlZmlsZW1lc3NhZ2VzKCkgdG8gY29weSBzZXF1ZW5jZXMuIiIiCisgICAgICAgIGZyb21zZXF1ZW5jZXMgPSBmcm9tZm9sZGVyLmdldHNlcXVlbmNlcygpCisgICAgICAgIHRvc2VxdWVuY2VzID0gc2VsZi5nZXRzZXF1ZW5jZXMoKQorICAgICAgICBjaGFuZ2VkID0gMAorICAgICAgICBmb3IgbmFtZSwgc2VxIGluIGZyb21zZXF1ZW5jZXMuaXRlbXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0b3NlcSA9IHRvc2VxdWVuY2VzW25hbWVdCisgICAgICAgICAgICAgICAgbmV3ID0gMAorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHRvc2VxID0gW10KKyAgICAgICAgICAgICAgICBuZXcgPSAxCisgICAgICAgICAgICBmb3IgZnJvbW4sIHRvbiBpbiByZWZpbGVkaXRlbXM6CisgICAgICAgICAgICAgICAgaWYgZnJvbW4gaW4gc2VxOgorICAgICAgICAgICAgICAgICAgICB0b3NlcS5hcHBlbmQodG9uKQorICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICAgICAgaWYgbmV3IGFuZCB0b3NlcToKKyAgICAgICAgICAgICAgICB0b3NlcXVlbmNlc1tuYW1lXSA9IHRvc2VxCisgICAgICAgIGlmIGNoYW5nZWQ6CisgICAgICAgICAgICBzZWxmLnB1dHNlcXVlbmNlcyh0b3NlcXVlbmNlcykKKworICAgIGRlZiBtb3ZlbWVzc2FnZShzZWxmLCBuLCB0b2ZvbGRlciwgdG9uKToKKyAgICAgICAgIiIiTW92ZSBvbmUgbWVzc2FnZSBvdmVyIGEgc3BlY2lmaWMgZGVzdGluYXRpb24gbWVzc2FnZSwKKyAgICAgICAgd2hpY2ggbWF5IG9yIG1heSBub3QgYWxyZWFkeSBleGlzdC4iIiIKKyAgICAgICAgcGF0aCA9IHNlbGYuZ2V0bWVzc2FnZWZpbGVuYW1lKG4pCisgICAgICAgICMgT3BlbiBpdCB0byBjaGVjayB0aGF0IGl0IGV4aXN0cworICAgICAgICBmID0gb3BlbihwYXRoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZGVsIGYKKyAgICAgICAgdG9wYXRoID0gdG9mb2xkZXIuZ2V0bWVzc2FnZWZpbGVuYW1lKHRvbikKKyAgICAgICAgYmFja3VwdG9wYXRoID0gdG9mb2xkZXIuZ2V0bWVzc2FnZWZpbGVuYW1lKCcsJWQnICUgdG9uKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW5hbWUodG9wYXRoLCBiYWNrdXB0b3BhdGgpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVuYW1lKHBhdGgsIHRvcGF0aCkKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgIyBUcnkgY29weWluZworICAgICAgICAgICAgb2sgPSAwCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdG9mb2xkZXIuc2V0bGFzdChOb25lKQorICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5MihwYXRoLCB0b3BhdGgpCisgICAgICAgICAgICAgICAgb2sgPSAxCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIG5vdCBvazoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHRvcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgb3MudW5saW5rKHBhdGgpCisgICAgICAgIHNlbGYucmVtb3ZlZnJvbWFsbHNlcXVlbmNlcyhbbl0pCisKKyAgICBkZWYgY29weW1lc3NhZ2Uoc2VsZiwgbiwgdG9mb2xkZXIsIHRvbik6CisgICAgICAgICIiIkNvcHkgb25lIG1lc3NhZ2Ugb3ZlciBhIHNwZWNpZmljIGRlc3RpbmF0aW9uIG1lc3NhZ2UsCisgICAgICAgIHdoaWNoIG1heSBvciBtYXkgbm90IGFscmVhZHkgZXhpc3QuIiIiCisgICAgICAgIHBhdGggPSBzZWxmLmdldG1lc3NhZ2VmaWxlbmFtZShuKQorICAgICAgICAjIE9wZW4gaXQgdG8gY2hlY2sgdGhhdCBpdCBleGlzdHMKKyAgICAgICAgZiA9IG9wZW4ocGF0aCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGRlbCBmCisgICAgICAgIHRvcGF0aCA9IHRvZm9sZGVyLmdldG1lc3NhZ2VmaWxlbmFtZSh0b24pCisgICAgICAgIGJhY2t1cHRvcGF0aCA9IHRvZm9sZGVyLmdldG1lc3NhZ2VmaWxlbmFtZSgnLCVkJyAlIHRvbikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVuYW1lKHRvcGF0aCwgYmFja3VwdG9wYXRoKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG9rID0gMAorICAgICAgICB0cnk6CisgICAgICAgICAgICB0b2ZvbGRlci5zZXRsYXN0KE5vbmUpCisgICAgICAgICAgICBzaHV0aWwuY29weTIocGF0aCwgdG9wYXRoKQorICAgICAgICAgICAgb2sgPSAxCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3Qgb2s6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsodG9wYXRoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGNyZWF0ZW1lc3NhZ2Uoc2VsZiwgbiwgdHh0KToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbWVzc2FnZSwgd2l0aCB0ZXh0IGZyb20gdGhlIG9wZW4gZmlsZSB0eHQuIiIiCisgICAgICAgIHBhdGggPSBzZWxmLmdldG1lc3NhZ2VmaWxlbmFtZShuKQorICAgICAgICBiYWNrdXBwYXRoID0gc2VsZi5nZXRtZXNzYWdlZmlsZW5hbWUoJywlZCcgJSBuKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW5hbWUocGF0aCwgYmFja3VwcGF0aCkKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBvayA9IDAKKyAgICAgICAgQlVGU0laRSA9IDE2KjEwMjQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCwgInciKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBidWYgPSB0eHQucmVhZChCVUZTSVpFKQorICAgICAgICAgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZi53cml0ZShidWYpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIG9rID0gMQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHBhdGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgcmVtb3ZlZnJvbWFsbHNlcXVlbmNlcyhzZWxmLCBsaXN0KToKKyAgICAgICAgIiIiUmVtb3ZlIG9uZSBvciBtb3JlIG1lc3NhZ2VzIGZyb20gYWxsIHNlcXVlbmNlcyAoaW5jbHVkaW5nIGxhc3QpCisgICAgICAgIC0tIGJ1dCBub3QgZnJvbSAnY3VyJyEhISIiIgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdsYXN0JykgYW5kIHNlbGYubGFzdCBpbiBsaXN0OgorICAgICAgICAgICAgZGVsIHNlbGYubGFzdAorICAgICAgICBzZXF1ZW5jZXMgPSBzZWxmLmdldHNlcXVlbmNlcygpCisgICAgICAgIGNoYW5nZWQgPSAwCisgICAgICAgIGZvciBuYW1lLCBzZXEgaW4gc2VxdWVuY2VzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBuYW1lID09ICdjdXInOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmb3IgbiBpbiBsaXN0OgorICAgICAgICAgICAgICAgIGlmIG4gaW4gc2VxOgorICAgICAgICAgICAgICAgICAgICBzZXEucmVtb3ZlKG4pCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZXE6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc2VxdWVuY2VzW25hbWVdCisgICAgICAgIGlmIGNoYW5nZWQ6CisgICAgICAgICAgICBzZWxmLnB1dHNlcXVlbmNlcyhzZXF1ZW5jZXMpCisKKyAgICBkZWYgZ2V0bGFzdChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBsYXN0IG1lc3NhZ2UgbnVtYmVyLiIiIgorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnbGFzdCcpOgorICAgICAgICAgICAgc2VsZi5saXN0bWVzc2FnZXMoKSAjIFNldCBzZWxmLmxhc3QKKyAgICAgICAgcmV0dXJuIHNlbGYubGFzdAorCisgICAgZGVmIHNldGxhc3Qoc2VsZiwgbGFzdCk6CisgICAgICAgICIiIlNldCB0aGUgbGFzdCBtZXNzYWdlIG51bWJlci4iIiIKKyAgICAgICAgaWYgbGFzdCBpcyBOb25lOgorICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnbGFzdCcpOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmxhc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubGFzdCA9IGxhc3QKKworY2xhc3MgTWVzc2FnZShtaW1ldG9vbHMuTWVzc2FnZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZiwgbiwgZnAgPSBOb25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuIiIiCisgICAgICAgIHNlbGYuZm9sZGVyID0gZgorICAgICAgICBzZWxmLm51bWJlciA9IG4KKyAgICAgICAgaWYgZnAgaXMgTm9uZToKKyAgICAgICAgICAgIHBhdGggPSBmLmdldG1lc3NhZ2VmaWxlbmFtZShuKQorICAgICAgICAgICAgZnAgPSBvcGVuKHBhdGgsICdyJykKKyAgICAgICAgbWltZXRvb2xzLk1lc3NhZ2UuX19pbml0X18oc2VsZiwgZnApCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIlN0cmluZyByZXByZXNlbnRhdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuICdNZXNzYWdlKCVzLCAlcyknICUgKHJlcHIoc2VsZi5mb2xkZXIpLCBzZWxmLm51bWJlcikKKworICAgIGRlZiBnZXRoZWFkZXJ0ZXh0KHNlbGYsIHByZWQgPSBOb25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBtZXNzYWdlJ3MgaGVhZGVyIHRleHQgYXMgYSBzdHJpbmcuICBJZiBhbgorICAgICAgICBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIGl0IGlzIHVzZWQgYXMgYSBmaWx0ZXIgcHJlZGljYXRlIHRvCisgICAgICAgIGRlY2lkZSB3aGljaCBoZWFkZXJzIHRvIHJldHVybiAoaXRzIGFyZ3VtZW50IGlzIHRoZSBoZWFkZXIKKyAgICAgICAgbmFtZSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSkuIiIiCisgICAgICAgIGlmIHByZWQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHNlbGYuaGVhZGVycykKKyAgICAgICAgaGVhZGVycyA9IFtdCisgICAgICAgIGhpdCA9IDAKKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5oZWFkZXJzOgorICAgICAgICAgICAgaWYgbm90IGxpbmVbMF0uaXNzcGFjZSgpOgorICAgICAgICAgICAgICAgIGkgPSBsaW5lLmZpbmQoJzonKQorICAgICAgICAgICAgICAgIGlmIGkgPiAwOgorICAgICAgICAgICAgICAgICAgICBoaXQgPSBwcmVkKGxpbmVbOmldLmxvd2VyKCkpCisgICAgICAgICAgICBpZiBoaXQ6IGhlYWRlcnMuYXBwZW5kKGxpbmUpCisgICAgICAgIHJldHVybiAnJy5qb2luKGhlYWRlcnMpCisKKyAgICBkZWYgZ2V0Ym9keXRleHQoc2VsZiwgZGVjb2RlID0gMSk6CisgICAgICAgICIiIlJldHVybiB0aGUgbWVzc2FnZSdzIGJvZHkgdGV4dCBhcyBzdHJpbmcuICBUaGlzIHVuZG9lcyBhCisgICAgICAgIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcsIGJ1dCBkb2VzIG5vdCBpbnRlcnByZXQgb3RoZXIgTUlNRQorICAgICAgICBmZWF0dXJlcyAoZS5nLiBtdWx0aXBhcnQgbWVzc2FnZXMpLiAgVG8gc3VwcHJlc3MgZGVjb2RpbmcsCisgICAgICAgIHBhc3MgMCBhcyBhbiBhcmd1bWVudC4iIiIKKyAgICAgICAgc2VsZi5mcC5zZWVrKHNlbGYuc3RhcnRvZmJvZHkpCisgICAgICAgIGVuY29kaW5nID0gc2VsZi5nZXRlbmNvZGluZygpCisgICAgICAgIGlmIG5vdCBkZWNvZGUgb3IgZW5jb2RpbmcgaW4gKCcnLCAnN2JpdCcsICc4Yml0JywgJ2JpbmFyeScpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZnAucmVhZCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTygpCisgICAgICAgIG1pbWV0b29scy5kZWNvZGUoc2VsZi5mcCwgb3V0cHV0LCBlbmNvZGluZykKKyAgICAgICAgcmV0dXJuIG91dHB1dC5nZXR2YWx1ZSgpCisKKyAgICBkZWYgZ2V0Ym9keXBhcnRzKHNlbGYpOgorICAgICAgICAiIiJPbmx5IGZvciBtdWx0aXBhcnQgbWVzc2FnZXM6IHJldHVybiB0aGUgbWVzc2FnZSdzIGJvZHkgYXMgYQorICAgICAgICBsaXN0IG9mIFN1Yk1lc3NhZ2Ugb2JqZWN0cy4gIEVhY2ggc3VibWVzc2FnZSBvYmplY3QgYmVoYXZlcworICAgICAgICAoYWxtb3N0KSBhcyBhIE1lc3NhZ2Ugb2JqZWN0LiIiIgorICAgICAgICBpZiBzZWxmLmdldG1haW50eXBlKCkgIT0gJ211bHRpcGFydCc6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ0NvbnRlbnQtVHlwZSBpcyBub3QgbXVsdGlwYXJ0LyonCisgICAgICAgIGJkcnkgPSBzZWxmLmdldHBhcmFtKCdib3VuZGFyeScpCisgICAgICAgIGlmIG5vdCBiZHJ5OgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdtdWx0aXBhcnQvKiB3aXRob3V0IGJvdW5kYXJ5IHBhcmFtJworICAgICAgICBzZWxmLmZwLnNlZWsoc2VsZi5zdGFydG9mYm9keSkKKyAgICAgICAgbWYgPSBtdWx0aWZpbGUuTXVsdGlGaWxlKHNlbGYuZnApCisgICAgICAgIG1mLnB1c2goYmRyeSkKKyAgICAgICAgcGFydHMgPSBbXQorICAgICAgICB3aGlsZSBtZi5uZXh0KCk6CisgICAgICAgICAgICBuID0gIiVzLiVyIiAlIChzZWxmLm51bWJlciwgMSArIGxlbihwYXJ0cykpCisgICAgICAgICAgICBwYXJ0ID0gU3ViTWVzc2FnZShzZWxmLmZvbGRlciwgbiwgbWYpCisgICAgICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKKyAgICAgICAgbWYucG9wKCkKKyAgICAgICAgcmV0dXJuIHBhcnRzCisKKyAgICBkZWYgZ2V0Ym9keShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGJvZHksIGVpdGhlciBhIHN0cmluZyBvciBhIGxpc3Qgb2YgbWVzc2FnZXMuIiIiCisgICAgICAgIGlmIHNlbGYuZ2V0bWFpbnR5cGUoKSA9PSAnbXVsdGlwYXJ0JzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdldGJvZHlwYXJ0cygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRib2R5dGV4dCgpCisKKworY2xhc3MgU3ViTWVzc2FnZShNZXNzYWdlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmLCBuLCBmcCk6CisgICAgICAgICIiIkNvbnN0cnVjdG9yLiIiIgorICAgICAgICBNZXNzYWdlLl9faW5pdF9fKHNlbGYsIGYsIG4sIGZwKQorICAgICAgICBpZiBzZWxmLmdldG1haW50eXBlKCkgPT0gJ211bHRpcGFydCc6CisgICAgICAgICAgICBzZWxmLmJvZHkgPSBNZXNzYWdlLmdldGJvZHlwYXJ0cyhzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5ib2R5ID0gTWVzc2FnZS5nZXRib2R5dGV4dChzZWxmKQorICAgICAgICBzZWxmLmJvZHllbmNvZGVkID0gTWVzc2FnZS5nZXRib2R5dGV4dChzZWxmLCBkZWNvZGU9MCkKKyAgICAgICAgICAgICMgWFhYIElmIHRoaXMgaXMgYmlnLCBzaG91bGQgcmVtZW1iZXIgZmlsZSBwb2ludGVycworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAiIiJTdHJpbmcgcmVwcmVzZW50YXRpb24uIiIiCisgICAgICAgIGYsIG4sIGZwID0gc2VsZi5mb2xkZXIsIHNlbGYubnVtYmVyLCBzZWxmLmZwCisgICAgICAgIHJldHVybiAnU3ViTWVzc2FnZSglcywgJXMsICVzKScgJSAoZiwgbiwgZnApCisKKyAgICBkZWYgZ2V0Ym9keXRleHQoc2VsZiwgZGVjb2RlID0gMSk6CisgICAgICAgIGlmIG5vdCBkZWNvZGU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5ib2R5ZW5jb2RlZAorICAgICAgICBpZiB0eXBlKHNlbGYuYm9keSkgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5ib2R5CisKKyAgICBkZWYgZ2V0Ym9keXBhcnRzKHNlbGYpOgorICAgICAgICBpZiB0eXBlKHNlbGYuYm9keSkgPT0gdHlwZShbXSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5ib2R5CisKKyAgICBkZWYgZ2V0Ym9keShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYm9keQorCisKK2NsYXNzIEludFNldDoKKyAgICAiIiJDbGFzcyBpbXBsZW1lbnRpbmcgc2V0cyBvZiBpbnRlZ2Vycy4KKworICAgIFRoaXMgaXMgYW4gZWZmaWNpZW50IHJlcHJlc2VudGF0aW9uIGZvciBzZXRzIGNvbnNpc3Rpbmcgb2Ygc2V2ZXJhbAorICAgIGNvbnRpbnVvdXMgcmFuZ2VzLCBlLmcuIDEtMTAwLDIwMC00MDAsNDAyLTEwMDAgaXMgcmVwcmVzZW50ZWQKKyAgICBpbnRlcm5hbGx5IGFzIGEgbGlzdCBvZiB0aHJlZSBwYWlyczogWygxLDEwMCksICgyMDAsNDAwKSwKKyAgICAoNDAyLDEwMDApXS4gIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBpcyBhbHdheXMga2VwdCBub3JtYWxpemVkLgorCisgICAgVGhlIGNvbnN0cnVjdG9yIGhhcyB1cCB0byB0aHJlZSBhcmd1bWVudHM6CisgICAgLSB0aGUgc3RyaW5nIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgc2V0IChkZWZhdWx0ICcnKSwKKyAgICAtIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiByYW5nZXMgKGRlZmF1bHQgJywnKQorICAgIC0gdGhlIHNlcGFyYXRvciBiZXR3ZWVuIGJlZ2luIGFuZCBlbmQgb2YgYSByYW5nZSAoZGVmYXVsdCAnLScpCisgICAgVGhlIHNlcGFyYXRvcnMgbXVzdCBiZSBzdHJpbmdzIChub3QgcmVnZXhwcnMpIGFuZCBzaG91bGQgYmUgZGlmZmVyZW50LgorCisgICAgVGhlIHRvc3RyaW5nKCkgZnVuY3Rpb24geWllbGRzIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBhbm90aGVyCisgICAgSW50U2V0IGNvbnN0cnVjdG9yOyBfX3JlcHJfXygpIGlzIGEgdmFsaWQgSW50U2V0IGNvbnN0cnVjdG9yIGl0c2VsZi4KKyAgICAiIiIKKworICAgICMgWFhYIFRoZSBkZWZhdWx0IGJlZ2luL2VuZCBzZXBhcmF0b3IgbWVhbnMgdGhhdCBuZWdhdGl2ZSBudW1iZXJzIGFyZQorICAgICMgICAgIG5vdCBzdXBwb3J0ZWQgdmVyeSB3ZWxsLgorICAgICMKKyAgICAjIFhYWCBUaGVyZSBhcmUgY3VycmVudGx5IG5vIG9wZXJhdGlvbnMgdG8gcmVtb3ZlIHNldCBlbGVtZW50cy4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhID0gTm9uZSwgc2VwID0gJywnLCBybmcgPSAnLScpOgorICAgICAgICBzZWxmLnBhaXJzID0gW10KKyAgICAgICAgc2VsZi5zZXAgPSBzZXAKKyAgICAgICAgc2VsZi5ybmcgPSBybmcKKyAgICAgICAgaWYgZGF0YTogc2VsZi5mcm9tc3RyaW5nKGRhdGEpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYucGFpcnMgPSBbXQorCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gY21wKHNlbGYucGFpcnMsIG90aGVyLnBhaXJzKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaChzZWxmLnBhaXJzKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJ0ludFNldCglciwgJXIsICVyKScgJSAoc2VsZi50b3N0cmluZygpLCBzZWxmLnNlcCwgc2VsZi5ybmcpCisKKyAgICBkZWYgbm9ybWFsaXplKHNlbGYpOgorICAgICAgICBzZWxmLnBhaXJzLnNvcnQoKQorICAgICAgICBpID0gMQorICAgICAgICB3aGlsZSBpIDwgbGVuKHNlbGYucGFpcnMpOgorICAgICAgICAgICAgYWxvLCBhaGkgPSBzZWxmLnBhaXJzW2ktMV0KKyAgICAgICAgICAgIGJsbywgYmhpID0gc2VsZi5wYWlyc1tpXQorICAgICAgICAgICAgaWYgYWhpID49IGJsby0xOgorICAgICAgICAgICAgICAgIHNlbGYucGFpcnNbaS0xOmkrMV0gPSBbKGFsbywgbWF4KGFoaSwgYmhpKSldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGkgPSBpKzEKKworICAgIGRlZiB0b3N0cmluZyhzZWxmKToKKyAgICAgICAgcyA9ICcnCisgICAgICAgIGZvciBsbywgaGkgaW4gc2VsZi5wYWlyczoKKyAgICAgICAgICAgIGlmIGxvID09IGhpOiB0ID0gcmVwcihsbykKKyAgICAgICAgICAgIGVsc2U6IHQgPSByZXByKGxvKSArIHNlbGYucm5nICsgcmVwcihoaSkKKyAgICAgICAgICAgIGlmIHM6IHMgPSBzICsgKHNlbGYuc2VwICsgdCkKKyAgICAgICAgICAgIGVsc2U6IHMgPSB0CisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgdG9saXN0KHNlbGYpOgorICAgICAgICBsID0gW10KKyAgICAgICAgZm9yIGxvLCBoaSBpbiBzZWxmLnBhaXJzOgorICAgICAgICAgICAgbSA9IHJhbmdlKGxvLCBoaSsxKQorICAgICAgICAgICAgbCA9IGwgKyBtCisgICAgICAgIHJldHVybiBsCisKKyAgICBkZWYgZnJvbWxpc3Qoc2VsZiwgbGlzdCk6CisgICAgICAgIGZvciBpIGluIGxpc3Q6CisgICAgICAgICAgICBzZWxmLmFwcGVuZChpKQorCisgICAgZGVmIGNsb25lKHNlbGYpOgorICAgICAgICBuZXcgPSBJbnRTZXQoKQorICAgICAgICBuZXcucGFpcnMgPSBzZWxmLnBhaXJzWzpdCisgICAgICAgIHJldHVybiBuZXcKKworICAgIGRlZiBtaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBhaXJzWzBdWzBdCisKKyAgICBkZWYgbWF4KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wYWlyc1stMV1bLTFdCisKKyAgICBkZWYgY29udGFpbnMoc2VsZiwgeCk6CisgICAgICAgIGZvciBsbywgaGkgaW4gc2VsZi5wYWlyczoKKyAgICAgICAgICAgIGlmIGxvIDw9IHggPD0gaGk6IHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGFwcGVuZChzZWxmLCB4KToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYucGFpcnMpKToKKyAgICAgICAgICAgIGxvLCBoaSA9IHNlbGYucGFpcnNbaV0KKyAgICAgICAgICAgIGlmIHggPCBsbzogIyBOZWVkIHRvIGluc2VydCBiZWZvcmUKKyAgICAgICAgICAgICAgICBpZiB4KzEgPT0gbG86CisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFpcnNbaV0gPSAoeCwgaGkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWlycy5pbnNlcnQoaSwgKHgsIHgpKQorICAgICAgICAgICAgICAgIGlmIGkgPiAwIGFuZCB4LTEgPT0gc2VsZi5wYWlyc1tpLTFdWzFdOgorICAgICAgICAgICAgICAgICAgICAjIE1lcmdlIHdpdGggcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWlyc1tpLTE6aSsxXSA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5wYWlyc1tpLTFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhaXJzW2ldWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiB4IDw9IGhpOiAjIEFscmVhZHkgaW4gc2V0CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGkgPSBsZW4oc2VsZi5wYWlycykgLSAxCisgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgIGxvLCBoaSA9IHNlbGYucGFpcnNbaV0KKyAgICAgICAgICAgIGlmIHgtMSA9PSBoaToKKyAgICAgICAgICAgICAgICBzZWxmLnBhaXJzW2ldID0gbG8sIHgKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5wYWlycy5hcHBlbmQoKHgsIHgpKQorCisgICAgZGVmIGFkZHBhaXIoc2VsZiwgeGxvLCB4aGkpOgorICAgICAgICBpZiB4bG8gPiB4aGk6IHJldHVybgorICAgICAgICBzZWxmLnBhaXJzLmFwcGVuZCgoeGxvLCB4aGkpKQorICAgICAgICBzZWxmLm5vcm1hbGl6ZSgpCisKKyAgICBkZWYgZnJvbXN0cmluZyhzZWxmLCBkYXRhKToKKyAgICAgICAgbmV3ID0gW10KKyAgICAgICAgZm9yIHBhcnQgaW4gZGF0YS5zcGxpdChzZWxmLnNlcCk6CisgICAgICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgICAgIGZvciBzdWJwIGluIHBhcnQuc3BsaXQoc2VsZi5ybmcpOgorICAgICAgICAgICAgICAgIHMgPSBzdWJwLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChpbnQocykpCisgICAgICAgICAgICBpZiBsZW4obGlzdCkgPT0gMToKKyAgICAgICAgICAgICAgICBuZXcuYXBwZW5kKChsaXN0WzBdLCBsaXN0WzBdKSkKKyAgICAgICAgICAgIGVsaWYgbGVuKGxpc3QpID09IDIgYW5kIGxpc3RbMF0gPD0gbGlzdFsxXToKKyAgICAgICAgICAgICAgICBuZXcuYXBwZW5kKChsaXN0WzBdLCBsaXN0WzFdKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ2JhZCBkYXRhIHBhc3NlZCB0byBJbnRTZXQnCisgICAgICAgIHNlbGYucGFpcnMgPSBzZWxmLnBhaXJzICsgbmV3CisgICAgICAgIHNlbGYubm9ybWFsaXplKCkKKworCisjIFN1YnJvdXRpbmVzIHRvIHJlYWQvd3JpdGUgZW50cmllcyBpbiAubWhfcHJvZmlsZSBhbmQgLm1oX3NlcXVlbmNlcworCitkZWYgcGlja2xpbmUoZmlsZSwga2V5LCBjYXNlZm9sZCA9IDEpOgorICAgIHRyeToKKyAgICAgICAgZiA9IG9wZW4oZmlsZSwgJ3InKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHBhdCA9IHJlLmVzY2FwZShrZXkpICsgJzonCisgICAgcHJvZyA9IHJlLmNvbXBpbGUocGF0LCBjYXNlZm9sZCBhbmQgcmUuSUdOT1JFQ0FTRSkKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgICAgICBpZiBwcm9nLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgdGV4dCA9IGxpbmVbbGVuKGtleSkrMTpdCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZSBvciBub3QgbGluZVswXS5pc3NwYWNlKCk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQgKyBsaW5lCisgICAgICAgICAgICByZXR1cm4gdGV4dC5zdHJpcCgpCisgICAgcmV0dXJuIE5vbmUKKworZGVmIHVwZGF0ZWxpbmUoZmlsZSwga2V5LCB2YWx1ZSwgY2FzZWZvbGQgPSAxKToKKyAgICB0cnk6CisgICAgICAgIGYgPSBvcGVuKGZpbGUsICdyJykKKyAgICAgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCisgICAgICAgIGYuY2xvc2UoKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBsaW5lcyA9IFtdCisgICAgcGF0ID0gcmUuZXNjYXBlKGtleSkgKyAnOiguKilcbicKKyAgICBwcm9nID0gcmUuY29tcGlsZShwYXQsIGNhc2Vmb2xkIGFuZCByZS5JR05PUkVDQVNFKQorICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgIG5ld2xpbmUgPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgbmV3bGluZSA9ICclczogJXNcbicgJSAoa2V5LCB2YWx1ZSkKKyAgICBmb3IgaSBpbiByYW5nZShsZW4obGluZXMpKToKKyAgICAgICAgbGluZSA9IGxpbmVzW2ldCisgICAgICAgIGlmIHByb2cubWF0Y2gobGluZSk6CisgICAgICAgICAgICBpZiBuZXdsaW5lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVsIGxpbmVzW2ldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpbmVzW2ldID0gbmV3bGluZQorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICBpZiBuZXdsaW5lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKG5ld2xpbmUpCisgICAgdGVtcGZpbGUgPSBmaWxlICsgIn4iCisgICAgZiA9IG9wZW4odGVtcGZpbGUsICd3JykKKyAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgZi53cml0ZShsaW5lKQorICAgIGYuY2xvc2UoKQorICAgIG9zLnJlbmFtZSh0ZW1wZmlsZSwgZmlsZSkKKworCisjIFRlc3QgcHJvZ3JhbQorCitkZWYgdGVzdCgpOgorICAgIGdsb2JhbCBtaCwgZgorICAgIG9zLnN5c3RlbSgncm0gLXJmICRIT01FL01haWwvQHRlc3QnKQorICAgIG1oID0gTUgoKQorICAgIGRlZiBkbyhzKTogcHJpbnQgczsgcHJpbnQgZXZhbChzKQorICAgIGRvKCdtaC5saXN0Zm9sZGVycygpJykKKyAgICBkbygnbWgubGlzdGFsbGZvbGRlcnMoKScpCisgICAgdGVzdGZvbGRlcnMgPSBbJ0B0ZXN0JywgJ0B0ZXN0L3Rlc3QxJywgJ0B0ZXN0L3Rlc3QyJywKKyAgICAgICAgICAgICAgICAgICAnQHRlc3QvdGVzdDEvdGVzdDExJywgJ0B0ZXN0L3Rlc3QxL3Rlc3QxMicsCisgICAgICAgICAgICAgICAgICAgJ0B0ZXN0L3Rlc3QxL3Rlc3QxMS90ZXN0MTExJ10KKyAgICBmb3IgdCBpbiB0ZXN0Zm9sZGVyczogZG8oJ21oLm1ha2Vmb2xkZXIoJXIpJyAlICh0LCkpCisgICAgZG8oJ21oLmxpc3RzdWJmb2xkZXJzKFwnQHRlc3RcJyknKQorICAgIGRvKCdtaC5saXN0YWxsc3ViZm9sZGVycyhcJ0B0ZXN0XCcpJykKKyAgICBmID0gbWgub3BlbmZvbGRlcignQHRlc3QnKQorICAgIGRvKCdmLmxpc3RzdWJmb2xkZXJzKCknKQorICAgIGRvKCdmLmxpc3RhbGxzdWJmb2xkZXJzKCknKQorICAgIGRvKCdmLmdldHNlcXVlbmNlcygpJykKKyAgICBzZXFzID0gZi5nZXRzZXF1ZW5jZXMoKQorICAgIHNlcXNbJ2ZvbyddID0gSW50U2V0KCcxLTEwIDEyLTIwJywgJyAnKS50b2xpc3QoKQorICAgIHByaW50IHNlcXMKKyAgICBmLnB1dHNlcXVlbmNlcyhzZXFzKQorICAgIGRvKCdmLmdldHNlcXVlbmNlcygpJykKKyAgICBmb3IgdCBpbiByZXZlcnNlZCh0ZXN0Zm9sZGVycyk6IGRvKCdtaC5kZWxldGVmb2xkZXIoJXIpJyAlICh0LCkpCisgICAgZG8oJ21oLmdldGNvbnRleHQoKScpCisgICAgY29udGV4dCA9IG1oLmdldGNvbnRleHQoKQorICAgIGYgPSBtaC5vcGVuZm9sZGVyKGNvbnRleHQpCisgICAgZG8oJ2YuZ2V0Y3VycmVudCgpJykKKyAgICBmb3Igc2VxIGluICgnZmlyc3QnLCAnbGFzdCcsICdjdXInLCAnLicsICdwcmV2JywgJ25leHQnLAorICAgICAgICAgICAgICAgICdmaXJzdDozJywgJ2xhc3Q6MycsICdjdXI6MycsICdjdXI6LTMnLAorICAgICAgICAgICAgICAgICdwcmV2OjMnLCAnbmV4dDozJywKKyAgICAgICAgICAgICAgICAnMTozJywgJzE6LTMnLCAnMTAwOjMnLCAnMTAwOi0zJywgJzEwMDAwOjMnLCAnMTAwMDA6LTMnLAorICAgICAgICAgICAgICAgICdhbGwnKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZG8oJ2YucGFyc2VzZXF1ZW5jZSglciknICUgKHNlcSwpKQorICAgICAgICBleGNlcHQgRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHByaW50ICJFcnJvcjoiLCBtc2cKKyAgICAgICAgc3R1ZmYgPSBvcy5wb3BlbigicGljayAlciAyPi9kZXYvbnVsbCIgJSAoc2VxLCkpLnJlYWQoKQorICAgICAgICBsaXN0ID0gbWFwKGludCwgc3R1ZmYuc3BsaXQoKSkKKyAgICAgICAgcHJpbnQgbGlzdCwgIjwtLSBwaWNrIgorICAgIGRvKCdmLmxpc3RtZXNzYWdlcygpJykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9taGxpYi5weWMgYi9saWIvcHl0aG9uMi43L21obGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU3ZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9taGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9taGxpYi5weW8gYi9saWIvcHl0aG9uMi43L21obGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmU3ZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9taGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9taW1ldG9vbHMucHkgYi9saWIvcHl0aG9uMi43L21pbWV0b29scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNhOGY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9taW1ldG9vbHMucHkKQEAgLTAsMCArMSwyNTAgQEAKKyIiIlZhcmlvdXMgdG9vbHMgdXNlZCBieSBNSU1FLXJlYWRpbmcgb3IgTUlNRS13cml0aW5nIHByb2dyYW1zLiIiIgorCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitmcm9tIHdhcm5pbmdzIGltcG9ydCBmaWx0ZXJ3YXJuaW5ncywgY2F0Y2hfd2FybmluZ3MKK3dpdGggY2F0Y2hfd2FybmluZ3MoKToKKyAgICBpZiBzeXMucHkza3dhcm5pbmc6CisgICAgICAgIGZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLipyZmM4MjIgaGFzIGJlZW4gcmVtb3ZlZCIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICBpbXBvcnQgcmZjODIyCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiaW4gMy54LCBtaW1ldG9vbHMgaGFzIGJlZW4gcmVtb3ZlZCBpbiBmYXZvciBvZiB0aGUgZW1haWwgcGFja2FnZSIsCisgICAgICAgICBzdGFja2xldmVsPTIpCisKK19fYWxsX18gPSBbIk1lc3NhZ2UiLCJjaG9vc2VfYm91bmRhcnkiLCJlbmNvZGUiLCJkZWNvZGUiLCJjb3B5bGl0ZXJhbCIsCisgICAgICAgICAgICJjb3B5YmluYXJ5Il0KKworY2xhc3MgTWVzc2FnZShyZmM4MjIuTWVzc2FnZSk6CisgICAgIiIiQSBkZXJpdmVkIGNsYXNzIG9mIHJmYzgyMi5NZXNzYWdlIHRoYXQga25vd3MgYWJvdXQgTUlNRSBoZWFkZXJzIGFuZAorICAgIGNvbnRhaW5zIHNvbWUgaG9va3MgZm9yIGRlY29kaW5nIGVuY29kZWQgYW5kIG11bHRpcGFydCBtZXNzYWdlcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCwgc2Vla2FibGUgPSAxKToKKyAgICAgICAgcmZjODIyLk1lc3NhZ2UuX19pbml0X18oc2VsZiwgZnAsIHNlZWthYmxlKQorICAgICAgICBzZWxmLmVuY29kaW5naGVhZGVyID0gXAorICAgICAgICAgICAgICAgIHNlbGYuZ2V0aGVhZGVyKCdjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJykKKyAgICAgICAgc2VsZi50eXBlaGVhZGVyID0gXAorICAgICAgICAgICAgICAgIHNlbGYuZ2V0aGVhZGVyKCdjb250ZW50LXR5cGUnKQorICAgICAgICBzZWxmLnBhcnNldHlwZSgpCisgICAgICAgIHNlbGYucGFyc2VwbGlzdCgpCisKKyAgICBkZWYgcGFyc2V0eXBlKHNlbGYpOgorICAgICAgICBzdHIgPSBzZWxmLnR5cGVoZWFkZXIKKyAgICAgICAgaWYgc3RyIGlzIE5vbmU6CisgICAgICAgICAgICBzdHIgPSAndGV4dC9wbGFpbicKKyAgICAgICAgaWYgJzsnIGluIHN0cjoKKyAgICAgICAgICAgIGkgPSBzdHIuaW5kZXgoJzsnKQorICAgICAgICAgICAgc2VsZi5wbGlzdHRleHQgPSBzdHJbaTpdCisgICAgICAgICAgICBzdHIgPSBzdHJbOmldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnBsaXN0dGV4dCA9ICcnCisgICAgICAgIGZpZWxkcyA9IHN0ci5zcGxpdCgnLycpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihmaWVsZHMpKToKKyAgICAgICAgICAgIGZpZWxkc1tpXSA9IGZpZWxkc1tpXS5zdHJpcCgpLmxvd2VyKCkKKyAgICAgICAgc2VsZi50eXBlID0gJy8nLmpvaW4oZmllbGRzKQorICAgICAgICBzZWxmLm1haW50eXBlID0gZmllbGRzWzBdCisgICAgICAgIHNlbGYuc3VidHlwZSA9ICcvJy5qb2luKGZpZWxkc1sxOl0pCisKKyAgICBkZWYgcGFyc2VwbGlzdChzZWxmKToKKyAgICAgICAgc3RyID0gc2VsZi5wbGlzdHRleHQKKyAgICAgICAgc2VsZi5wbGlzdCA9IFtdCisgICAgICAgIHdoaWxlIHN0cls6MV0gPT0gJzsnOgorICAgICAgICAgICAgc3RyID0gc3RyWzE6XQorICAgICAgICAgICAgaWYgJzsnIGluIHN0cjoKKyAgICAgICAgICAgICAgICAjIFhYWCBTaG91bGQgcGFyc2UgcXVvdGVzIQorICAgICAgICAgICAgICAgIGVuZCA9IHN0ci5pbmRleCgnOycpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVuZCA9IGxlbihzdHIpCisgICAgICAgICAgICBmID0gc3RyWzplbmRdCisgICAgICAgICAgICBpZiAnPScgaW4gZjoKKyAgICAgICAgICAgICAgICBpID0gZi5pbmRleCgnPScpCisgICAgICAgICAgICAgICAgZiA9IGZbOmldLnN0cmlwKCkubG93ZXIoKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICc9JyArIGZbaSsxOl0uc3RyaXAoKQorICAgICAgICAgICAgc2VsZi5wbGlzdC5hcHBlbmQoZi5zdHJpcCgpKQorICAgICAgICAgICAgc3RyID0gc3RyW2VuZDpdCisKKyAgICBkZWYgZ2V0cGxpc3Qoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBsaXN0CisKKyAgICBkZWYgZ2V0cGFyYW0oc2VsZiwgbmFtZSk6CisgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkgKyAnPScKKyAgICAgICAgbiA9IGxlbihuYW1lKQorICAgICAgICBmb3IgcCBpbiBzZWxmLnBsaXN0OgorICAgICAgICAgICAgaWYgcFs6bl0gPT0gbmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmZjODIyLnVucXVvdGUocFtuOl0pCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZ2V0cGFyYW1uYW1lcyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIHAgaW4gc2VsZi5wbGlzdDoKKyAgICAgICAgICAgIGkgPSBwLmZpbmQoJz0nKQorICAgICAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocFs6aV0ubG93ZXIoKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGdldGVuY29kaW5nKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmVuY29kaW5naGVhZGVyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gJzdiaXQnCisgICAgICAgIHJldHVybiBzZWxmLmVuY29kaW5naGVhZGVyLmxvd2VyKCkKKworICAgIGRlZiBnZXR0eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlCisKKyAgICBkZWYgZ2V0bWFpbnR5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1haW50eXBlCisKKyAgICBkZWYgZ2V0c3VidHlwZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3VidHlwZQorCisKKworCisjIFV0aWxpdHkgZnVuY3Rpb25zCisjIC0tLS0tLS0tLS0tLS0tLS0tCisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IGR1bW15X3RocmVhZCBhcyB0aHJlYWQKK19jb3VudGVyX2xvY2sgPSB0aHJlYWQuYWxsb2NhdGVfbG9jaygpCitkZWwgdGhyZWFkCisKK19jb3VudGVyID0gMAorZGVmIF9nZXRfbmV4dF9jb3VudGVyKCk6CisgICAgZ2xvYmFsIF9jb3VudGVyCisgICAgX2NvdW50ZXJfbG9jay5hY3F1aXJlKCkKKyAgICBfY291bnRlciArPSAxCisgICAgcmVzdWx0ID0gX2NvdW50ZXIKKyAgICBfY291bnRlcl9sb2NrLnJlbGVhc2UoKQorICAgIHJldHVybiByZXN1bHQKKworX3ByZWZpeCA9IE5vbmUKKworZGVmIGNob29zZV9ib3VuZGFyeSgpOgorICAgICIiIlJldHVybiBhIHN0cmluZyB1c2FibGUgYXMgYSBtdWx0aXBhcnQgYm91bmRhcnkuCisKKyAgICBUaGUgc3RyaW5nIGNob3NlbiBpcyB1bmlxdWUgd2l0aGluIGEgc2luZ2xlIHByb2dyYW0gcnVuLCBhbmQKKyAgICBpbmNvcnBvcmF0ZXMgdGhlIHVzZXIgaWQgKGlmIGF2YWlsYWJsZSksIHByb2Nlc3MgaWQgKGlmIGF2YWlsYWJsZSksCisgICAgYW5kIGN1cnJlbnQgdGltZS4gIFNvIGl0J3MgdmVyeSB1bmxpa2VseSB0aGUgcmV0dXJuZWQgc3RyaW5nIGFwcGVhcnMKKyAgICBpbiBtZXNzYWdlIHRleHQsIGJ1dCB0aGVyZSdzIG5vIGd1YXJhbnRlZS4KKworICAgIFRoZSBib3VuZGFyeSBjb250YWlucyBkb3RzIHNvIHlvdSBoYXZlIHRvIHF1b3RlIGl0IGluIHRoZSBoZWFkZXIuIiIiCisKKyAgICBnbG9iYWwgX3ByZWZpeAorICAgIGltcG9ydCB0aW1lCisgICAgaWYgX3ByZWZpeCBpcyBOb25lOgorICAgICAgICBpbXBvcnQgc29ja2V0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhvc3RpZCA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgICAgICBleGNlcHQgc29ja2V0LmdhaWVycm9yOgorICAgICAgICAgICAgaG9zdGlkID0gJzEyNy4wLjAuMScKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdWlkID0gcmVwcihvcy5nZXR1aWQoKSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgdWlkID0gJzEnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBpZCA9IHJlcHIob3MuZ2V0cGlkKCkpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBpZCA9ICcxJworICAgICAgICBfcHJlZml4ID0gaG9zdGlkICsgJy4nICsgdWlkICsgJy4nICsgcGlkCisgICAgcmV0dXJuICIlcy4lLjNmLiVkIiAlIChfcHJlZml4LCB0aW1lLnRpbWUoKSwgX2dldF9uZXh0X2NvdW50ZXIoKSkKKworCisjIFN1YnJvdXRpbmVzIGZvciBkZWNvZGluZyBzb21lIGNvbW1vbiBjb250ZW50LXRyYW5zZmVyLXR5cGVzCisKK2RlZiBkZWNvZGUoaW5wdXQsIG91dHB1dCwgZW5jb2RpbmcpOgorICAgICIiIkRlY29kZSBjb21tb24gY29udGVudC10cmFuc2Zlci1lbmNvZGluZ3MgKGJhc2U2NCwgcXVvcHJpLCB1dWVuY29kZSkuIiIiCisgICAgaWYgZW5jb2RpbmcgPT0gJ2Jhc2U2NCc6CisgICAgICAgIGltcG9ydCBiYXNlNjQKKyAgICAgICAgcmV0dXJuIGJhc2U2NC5kZWNvZGUoaW5wdXQsIG91dHB1dCkKKyAgICBpZiBlbmNvZGluZyA9PSAncXVvdGVkLXByaW50YWJsZSc6CisgICAgICAgIGltcG9ydCBxdW9wcmkKKyAgICAgICAgcmV0dXJuIHF1b3ByaS5kZWNvZGUoaW5wdXQsIG91dHB1dCkKKyAgICBpZiBlbmNvZGluZyBpbiAoJ3V1ZW5jb2RlJywgJ3gtdXVlbmNvZGUnLCAndXVlJywgJ3gtdXVlJyk6CisgICAgICAgIGltcG9ydCB1dQorICAgICAgICByZXR1cm4gdXUuZGVjb2RlKGlucHV0LCBvdXRwdXQpCisgICAgaWYgZW5jb2RpbmcgaW4gKCc3Yml0JywgJzhiaXQnKToKKyAgICAgICAgcmV0dXJuIG91dHB1dC53cml0ZShpbnB1dC5yZWFkKCkpCisgICAgaWYgZW5jb2RpbmcgaW4gZGVjb2RldGFiOgorICAgICAgICBwaXBldGhyb3VnaChpbnB1dCwgZGVjb2RldGFiW2VuY29kaW5nXSwgb3V0cHV0KQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgJ3Vua25vd24gQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogJXMnICUgZW5jb2RpbmcKKworZGVmIGVuY29kZShpbnB1dCwgb3V0cHV0LCBlbmNvZGluZyk6CisgICAgIiIiRW5jb2RlIGNvbW1vbiBjb250ZW50LXRyYW5zZmVyLWVuY29kaW5ncyAoYmFzZTY0LCBxdW9wcmksIHV1ZW5jb2RlKS4iIiIKKyAgICBpZiBlbmNvZGluZyA9PSAnYmFzZTY0JzoKKyAgICAgICAgaW1wb3J0IGJhc2U2NAorICAgICAgICByZXR1cm4gYmFzZTY0LmVuY29kZShpbnB1dCwgb3V0cHV0KQorICAgIGlmIGVuY29kaW5nID09ICdxdW90ZWQtcHJpbnRhYmxlJzoKKyAgICAgICAgaW1wb3J0IHF1b3ByaQorICAgICAgICByZXR1cm4gcXVvcHJpLmVuY29kZShpbnB1dCwgb3V0cHV0LCAwKQorICAgIGlmIGVuY29kaW5nIGluICgndXVlbmNvZGUnLCAneC11dWVuY29kZScsICd1dWUnLCAneC11dWUnKToKKyAgICAgICAgaW1wb3J0IHV1CisgICAgICAgIHJldHVybiB1dS5lbmNvZGUoaW5wdXQsIG91dHB1dCkKKyAgICBpZiBlbmNvZGluZyBpbiAoJzdiaXQnLCAnOGJpdCcpOgorICAgICAgICByZXR1cm4gb3V0cHV0LndyaXRlKGlucHV0LnJlYWQoKSkKKyAgICBpZiBlbmNvZGluZyBpbiBlbmNvZGV0YWI6CisgICAgICAgIHBpcGV0aHJvdWdoKGlucHV0LCBlbmNvZGV0YWJbZW5jb2RpbmddLCBvdXRwdXQpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAndW5rbm93biBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAlcycgJSBlbmNvZGluZworCisjIFRoZSBmb2xsb3dpbmcgaXMgbm8gbG9uZ2VyIHVzZWQgZm9yIHN0YW5kYXJkIGVuY29kaW5ncworCisjIFhYWCBUaGlzIHJlcXVpcmVzIHRoYXQgdXVkZWNvZGUgYW5kIG1tZW5jb2RlIGFyZSBpbiAkUEFUSAorCit1dWRlY29kZV9waXBlID0gJycnKAorVEVNUD0vdG1wL0B1dS4kJAorc2VkICJzJV5iZWdpbiBbMC03XVswLTddKiAuKiViZWdpbiA2MDAgJFRFTVAlIiB8IHV1ZGVjb2RlCitjYXQgJFRFTVAKK3JtICRURU1QCispJycnCisKK2RlY29kZXRhYiA9IHsKKyAgICAgICAgJ3V1ZW5jb2RlJzogICAgICAgICAgICAgdXVkZWNvZGVfcGlwZSwKKyAgICAgICAgJ3gtdXVlbmNvZGUnOiAgICAgICAgICAgdXVkZWNvZGVfcGlwZSwKKyAgICAgICAgJ3V1ZSc6ICAgICAgICAgICAgICAgICAgdXVkZWNvZGVfcGlwZSwKKyAgICAgICAgJ3gtdXVlJzogICAgICAgICAgICAgICAgdXVkZWNvZGVfcGlwZSwKKyAgICAgICAgJ3F1b3RlZC1wcmludGFibGUnOiAgICAgJ21tZW5jb2RlIC11IC1xJywKKyAgICAgICAgJ2Jhc2U2NCc6ICAgICAgICAgICAgICAgJ21tZW5jb2RlIC11IC1iJywKK30KKworZW5jb2RldGFiID0geworICAgICAgICAneC11dWVuY29kZSc6ICAgICAgICAgICAndXVlbmNvZGUgdGVtcGZpbGUnLAorICAgICAgICAndXVlbmNvZGUnOiAgICAgICAgICAgICAndXVlbmNvZGUgdGVtcGZpbGUnLAorICAgICAgICAneC11dWUnOiAgICAgICAgICAgICAgICAndXVlbmNvZGUgdGVtcGZpbGUnLAorICAgICAgICAndXVlJzogICAgICAgICAgICAgICAgICAndXVlbmNvZGUgdGVtcGZpbGUnLAorICAgICAgICAncXVvdGVkLXByaW50YWJsZSc6ICAgICAnbW1lbmNvZGUgLXEnLAorICAgICAgICAnYmFzZTY0JzogICAgICAgICAgICAgICAnbW1lbmNvZGUgLWInLAorfQorCitkZWYgcGlwZXRvKGlucHV0LCBjb21tYW5kKToKKyAgICBwaXBlID0gb3MucG9wZW4oY29tbWFuZCwgJ3cnKQorICAgIGNvcHlsaXRlcmFsKGlucHV0LCBwaXBlKQorICAgIHBpcGUuY2xvc2UoKQorCitkZWYgcGlwZXRocm91Z2goaW5wdXQsIGNvbW1hbmQsIG91dHB1dCk6CisgICAgKGZkLCB0ZW1wbmFtZSkgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICB0ZW1wID0gb3MuZmRvcGVuKGZkLCAndycpCisgICAgY29weWxpdGVyYWwoaW5wdXQsIHRlbXApCisgICAgdGVtcC5jbG9zZSgpCisgICAgcGlwZSA9IG9zLnBvcGVuKGNvbW1hbmQgKyAnIDwnICsgdGVtcG5hbWUsICdyJykKKyAgICBjb3B5YmluYXJ5KHBpcGUsIG91dHB1dCkKKyAgICBwaXBlLmNsb3NlKCkKKyAgICBvcy51bmxpbmsodGVtcG5hbWUpCisKK2RlZiBjb3B5bGl0ZXJhbChpbnB1dCwgb3V0cHV0KToKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gaW5wdXQucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgb3V0cHV0LndyaXRlKGxpbmUpCisKK2RlZiBjb3B5YmluYXJ5KGlucHV0LCBvdXRwdXQpOgorICAgIEJVRlNJWkUgPSA4MTkyCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGlucHV0LnJlYWQoQlVGU0laRSkKKyAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgIG91dHB1dC53cml0ZShsaW5lKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9taW1ldG9vbHMucHljIGIvbGliL3B5dGhvbjIuNy9taW1ldG9vbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhM2E4YWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21pbWV0b29scy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9taW1ldG9vbHMucHlvIGIvbGliL3B5dGhvbjIuNy9taW1ldG9vbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhM2E4YWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21pbWV0b29scy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9taW1ldHlwZXMucHkgYi9saWIvcHl0aG9uMi43L21pbWV0eXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGFkZTczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9taW1ldHlwZXMucHkKQEAgLTAsMCArMSw1OTQgQEAKKyIiIkd1ZXNzIHRoZSBNSU1FIHR5cGUgb2YgYSBmaWxlLgorCitUaGlzIG1vZHVsZSBkZWZpbmVzIHR3byB1c2VmdWwgZnVuY3Rpb25zOgorCitndWVzc190eXBlKHVybCwgc3RyaWN0PTEpIC0tIGd1ZXNzIHRoZSBNSU1FIHR5cGUgYW5kIGVuY29kaW5nIG9mIGEgVVJMLgorCitndWVzc19leHRlbnNpb24odHlwZSwgc3RyaWN0PTEpIC0tIGd1ZXNzIHRoZSBleHRlbnNpb24gZm9yIGEgZ2l2ZW4gTUlNRSB0eXBlLgorCitJdCBhbHNvIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcsIGZvciB0dW5pbmcgdGhlIGJlaGF2aW9yOgorCitEYXRhOgorCitrbm93bmZpbGVzIC0tIGxpc3Qgb2YgZmlsZXMgdG8gcGFyc2UKK2luaXRlZCAtLSBmbGFnIHNldCB3aGVuIGluaXQoKSBoYXMgYmVlbiBjYWxsZWQKK3N1ZmZpeF9tYXAgLS0gZGljdGlvbmFyeSBtYXBwaW5nIHN1ZmZpeGVzIHRvIHN1ZmZpeGVzCitlbmNvZGluZ3NfbWFwIC0tIGRpY3Rpb25hcnkgbWFwcGluZyBzdWZmaXhlcyB0byBlbmNvZGluZ3MKK3R5cGVzX21hcCAtLSBkaWN0aW9uYXJ5IG1hcHBpbmcgc3VmZml4ZXMgdG8gdHlwZXMKKworRnVuY3Rpb25zOgorCitpbml0KFtmaWxlc10pIC0tIHBhcnNlIGEgbGlzdCBvZiBmaWxlcywgZGVmYXVsdCBrbm93bmZpbGVzIChvbiBXaW5kb3dzLCB0aGUKKyAgZGVmYXVsdCB2YWx1ZXMgYXJlIHRha2VuIGZyb20gdGhlIHJlZ2lzdHJ5KQorcmVhZF9taW1lX3R5cGVzKGZpbGUpIC0tIHBhcnNlIG9uZSBmaWxlLCByZXR1cm4gYSBkaWN0aW9uYXJ5IG9yIE5vbmUKKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBwb3NpeHBhdGgKK2ltcG9ydCB1cmxsaWIKK3RyeToKKyAgICBpbXBvcnQgX3dpbnJlZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF93aW5yZWcgPSBOb25lCisKK19fYWxsX18gPSBbCisgICAgImd1ZXNzX3R5cGUiLCJndWVzc19leHRlbnNpb24iLCJndWVzc19hbGxfZXh0ZW5zaW9ucyIsCisgICAgImFkZF90eXBlIiwicmVhZF9taW1lX3R5cGVzIiwiaW5pdCIKK10KKwora25vd25maWxlcyA9IFsKKyAgICAiL2V0Yy9taW1lLnR5cGVzIiwKKyAgICAiL2V0Yy9odHRwZC9taW1lLnR5cGVzIiwgICAgICAgICAgICAgICAgICAgICMgTWFjIE9TIFgKKyAgICAiL2V0Yy9odHRwZC9jb25mL21pbWUudHlwZXMiLCAgICAgICAgICAgICAgICMgQXBhY2hlCisgICAgIi9ldGMvYXBhY2hlL21pbWUudHlwZXMiLCAgICAgICAgICAgICAgICAgICAjIEFwYWNoZSAxCisgICAgIi9ldGMvYXBhY2hlMi9taW1lLnR5cGVzIiwgICAgICAgICAgICAgICAgICAjIEFwYWNoZSAyCisgICAgIi91c3IvbG9jYWwvZXRjL2h0dHBkL2NvbmYvbWltZS50eXBlcyIsCisgICAgIi91c3IvbG9jYWwvbGliL25ldHNjYXBlL21pbWUudHlwZXMiLAorICAgICIvdXNyL2xvY2FsL2V0Yy9odHRwZC9jb25mL21pbWUudHlwZXMiLCAgICAgIyBBcGFjaGUgMS4yCisgICAgIi91c3IvbG9jYWwvZXRjL21pbWUudHlwZXMiLCAgICAgICAgICAgICAgICAjIEFwYWNoZSAxLjMKKyAgICBdCisKK2luaXRlZCA9IEZhbHNlCitfZGIgPSBOb25lCisKKworY2xhc3MgTWltZVR5cGVzOgorICAgICIiIk1JTUUtdHlwZXMgZGF0YXN0b3JlLgorCisgICAgVGhpcyBkYXRhc3RvcmUgY2FuIGhhbmRsZSBpbmZvcm1hdGlvbiBmcm9tIG1pbWUudHlwZXMtc3R5bGUgZmlsZXMKKyAgICBhbmQgc3VwcG9ydHMgYmFzaWMgZGV0ZXJtaW5hdGlvbiBvZiBNSU1FIHR5cGUgZnJvbSBhIGZpbGVuYW1lIG9yCisgICAgVVJMLCBhbmQgY2FuIGd1ZXNzIGEgcmVhc29uYWJsZSBleHRlbnNpb24gZ2l2ZW4gYSBNSU1FIHR5cGUuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWVzPSgpLCBzdHJpY3Q9VHJ1ZSk6CisgICAgICAgIGlmIG5vdCBpbml0ZWQ6CisgICAgICAgICAgICBpbml0KCkKKyAgICAgICAgc2VsZi5lbmNvZGluZ3NfbWFwID0gZW5jb2RpbmdzX21hcC5jb3B5KCkKKyAgICAgICAgc2VsZi5zdWZmaXhfbWFwID0gc3VmZml4X21hcC5jb3B5KCkKKyAgICAgICAgc2VsZi50eXBlc19tYXAgPSAoe30sIHt9KSAjIGRpY3QgZm9yIChub24tc3RyaWN0LCBzdHJpY3QpCisgICAgICAgIHNlbGYudHlwZXNfbWFwX2ludiA9ICh7fSwge30pCisgICAgICAgIGZvciAoZXh0LCB0eXBlKSBpbiB0eXBlc19tYXAuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYWRkX3R5cGUodHlwZSwgZXh0LCBUcnVlKQorICAgICAgICBmb3IgKGV4dCwgdHlwZSkgaW4gY29tbW9uX3R5cGVzLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFkZF90eXBlKHR5cGUsIGV4dCwgRmFsc2UpCisgICAgICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgIHNlbGYucmVhZChuYW1lLCBzdHJpY3QpCisKKyAgICBkZWYgYWRkX3R5cGUoc2VsZiwgdHlwZSwgZXh0LCBzdHJpY3Q9VHJ1ZSk6CisgICAgICAgICIiIkFkZCBhIG1hcHBpbmcgYmV0d2VlbiBhIHR5cGUgYW5kIGFuIGV4dGVuc2lvbi4KKworICAgICAgICBXaGVuIHRoZSBleHRlbnNpb24gaXMgYWxyZWFkeSBrbm93biwgdGhlIG5ldworICAgICAgICB0eXBlIHdpbGwgcmVwbGFjZSB0aGUgb2xkIG9uZS4gV2hlbiB0aGUgdHlwZQorICAgICAgICBpcyBhbHJlYWR5IGtub3duIHRoZSBleHRlbnNpb24gd2lsbCBiZSBhZGRlZAorICAgICAgICB0byB0aGUgbGlzdCBvZiBrbm93biBleHRlbnNpb25zLgorCisgICAgICAgIElmIHN0cmljdCBpcyB0cnVlLCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFkZGVkIHRvCisgICAgICAgIGxpc3Qgb2Ygc3RhbmRhcmQgdHlwZXMsIGVsc2UgdG8gdGhlIGxpc3Qgb2Ygbm9uLXN0YW5kYXJkCisgICAgICAgIHR5cGVzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi50eXBlc19tYXBbc3RyaWN0XVtleHRdID0gdHlwZQorICAgICAgICBleHRzID0gc2VsZi50eXBlc19tYXBfaW52W3N0cmljdF0uc2V0ZGVmYXVsdCh0eXBlLCBbXSkKKyAgICAgICAgaWYgZXh0IG5vdCBpbiBleHRzOgorICAgICAgICAgICAgZXh0cy5hcHBlbmQoZXh0KQorCisgICAgZGVmIGd1ZXNzX3R5cGUoc2VsZiwgdXJsLCBzdHJpY3Q9VHJ1ZSk6CisgICAgICAgICIiIkd1ZXNzIHRoZSB0eXBlIG9mIGEgZmlsZSBiYXNlZCBvbiBpdHMgVVJMLgorCisgICAgICAgIFJldHVybiB2YWx1ZSBpcyBhIHR1cGxlICh0eXBlLCBlbmNvZGluZykgd2hlcmUgdHlwZSBpcyBOb25lIGlmCisgICAgICAgIHRoZSB0eXBlIGNhbid0IGJlIGd1ZXNzZWQgKG5vIG9yIHVua25vd24gc3VmZml4KSBvciBhIHN0cmluZworICAgICAgICBvZiB0aGUgZm9ybSB0eXBlL3N1YnR5cGUsIHVzYWJsZSBmb3IgYSBNSU1FIENvbnRlbnQtdHlwZQorICAgICAgICBoZWFkZXI7IGFuZCBlbmNvZGluZyBpcyBOb25lIGZvciBubyBlbmNvZGluZyBvciB0aGUgbmFtZSBvZgorICAgICAgICB0aGUgcHJvZ3JhbSB1c2VkIHRvIGVuY29kZSAoZS5nLiBjb21wcmVzcyBvciBnemlwKS4gIFRoZQorICAgICAgICBtYXBwaW5ncyBhcmUgdGFibGUgZHJpdmVuLiAgRW5jb2Rpbmcgc3VmZml4ZXMgYXJlIGNhc2UKKyAgICAgICAgc2Vuc2l0aXZlOyB0eXBlIHN1ZmZpeGVzIGFyZSBmaXJzdCB0cmllZCBjYXNlIHNlbnNpdGl2ZSwgdGhlbgorICAgICAgICBjYXNlIGluc2Vuc2l0aXZlLgorCisgICAgICAgIFRoZSBzdWZmaXhlcyAudGd6LCAudGF6IGFuZCAudHogKGNhc2Ugc2Vuc2l0aXZlISkgYXJlIGFsbAorICAgICAgICBtYXBwZWQgdG8gJy50YXIuZ3onLiAgKFRoaXMgaXMgdGFibGUtZHJpdmVuIHRvbywgdXNpbmcgdGhlCisgICAgICAgIGRpY3Rpb25hcnkgc3VmZml4X21hcC4pCisKKyAgICAgICAgT3B0aW9uYWwgYHN0cmljdCcgYXJndW1lbnQgd2hlbiBGYWxzZSBhZGRzIGEgYnVuY2ggb2YgY29tbW9ubHkgZm91bmQsCisgICAgICAgIGJ1dCBub24tc3RhbmRhcmQgdHlwZXMuCisgICAgICAgICIiIgorICAgICAgICBzY2hlbWUsIHVybCA9IHVybGxpYi5zcGxpdHR5cGUodXJsKQorICAgICAgICBpZiBzY2hlbWUgPT0gJ2RhdGEnOgorICAgICAgICAgICAgIyBzeW50YXggb2YgZGF0YSBVUkxzOgorICAgICAgICAgICAgIyBkYXRhdXJsICAgOj0gImRhdGE6IiBbIG1lZGlhdHlwZSBdIFsgIjtiYXNlNjQiIF0gIiwiIGRhdGEKKyAgICAgICAgICAgICMgbWVkaWF0eXBlIDo9IFsgdHlwZSAiLyIgc3VidHlwZSBdICooICI7IiBwYXJhbWV0ZXIgKQorICAgICAgICAgICAgIyBkYXRhICAgICAgOj0gKnVybGNoYXIKKyAgICAgICAgICAgICMgcGFyYW1ldGVyIDo9IGF0dHJpYnV0ZSAiPSIgdmFsdWUKKyAgICAgICAgICAgICMgdHlwZS9zdWJ0eXBlIGRlZmF1bHRzIHRvICJ0ZXh0L3BsYWluIgorICAgICAgICAgICAgY29tbWEgPSB1cmwuZmluZCgnLCcpCisgICAgICAgICAgICBpZiBjb21tYSA8IDA6CisgICAgICAgICAgICAgICAgIyBiYWQgZGF0YSBVUkwKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorICAgICAgICAgICAgc2VtaSA9IHVybC5maW5kKCc7JywgMCwgY29tbWEpCisgICAgICAgICAgICBpZiBzZW1pID49IDA6CisgICAgICAgICAgICAgICAgdHlwZSA9IHVybFs6c2VtaV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHlwZSA9IHVybFs6Y29tbWFdCisgICAgICAgICAgICBpZiAnPScgaW4gdHlwZSBvciAnLycgbm90IGluIHR5cGU6CisgICAgICAgICAgICAgICAgdHlwZSA9ICd0ZXh0L3BsYWluJworICAgICAgICAgICAgcmV0dXJuIHR5cGUsIE5vbmUgICAgICAgICAgICMgbmV2ZXIgY29tcHJlc3NlZCwgc28gZW5jb2RpbmcgaXMgTm9uZQorICAgICAgICBiYXNlLCBleHQgPSBwb3NpeHBhdGguc3BsaXRleHQodXJsKQorICAgICAgICB3aGlsZSBleHQgaW4gc2VsZi5zdWZmaXhfbWFwOgorICAgICAgICAgICAgYmFzZSwgZXh0ID0gcG9zaXhwYXRoLnNwbGl0ZXh0KGJhc2UgKyBzZWxmLnN1ZmZpeF9tYXBbZXh0XSkKKyAgICAgICAgaWYgZXh0IGluIHNlbGYuZW5jb2RpbmdzX21hcDoKKyAgICAgICAgICAgIGVuY29kaW5nID0gc2VsZi5lbmNvZGluZ3NfbWFwW2V4dF0KKyAgICAgICAgICAgIGJhc2UsIGV4dCA9IHBvc2l4cGF0aC5zcGxpdGV4dChiYXNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW5jb2RpbmcgPSBOb25lCisgICAgICAgIHR5cGVzX21hcCA9IHNlbGYudHlwZXNfbWFwW1RydWVdCisgICAgICAgIGlmIGV4dCBpbiB0eXBlc19tYXA6CisgICAgICAgICAgICByZXR1cm4gdHlwZXNfbWFwW2V4dF0sIGVuY29kaW5nCisgICAgICAgIGVsaWYgZXh0Lmxvd2VyKCkgaW4gdHlwZXNfbWFwOgorICAgICAgICAgICAgcmV0dXJuIHR5cGVzX21hcFtleHQubG93ZXIoKV0sIGVuY29kaW5nCisgICAgICAgIGVsaWYgc3RyaWN0OgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIGVuY29kaW5nCisgICAgICAgIHR5cGVzX21hcCA9IHNlbGYudHlwZXNfbWFwW0ZhbHNlXQorICAgICAgICBpZiBleHQgaW4gdHlwZXNfbWFwOgorICAgICAgICAgICAgcmV0dXJuIHR5cGVzX21hcFtleHRdLCBlbmNvZGluZworICAgICAgICBlbGlmIGV4dC5sb3dlcigpIGluIHR5cGVzX21hcDoKKyAgICAgICAgICAgIHJldHVybiB0eXBlc19tYXBbZXh0Lmxvd2VyKCldLCBlbmNvZGluZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIGVuY29kaW5nCisKKyAgICBkZWYgZ3Vlc3NfYWxsX2V4dGVuc2lvbnMoc2VsZiwgdHlwZSwgc3RyaWN0PVRydWUpOgorICAgICAgICAiIiJHdWVzcyB0aGUgZXh0ZW5zaW9ucyBmb3IgYSBmaWxlIGJhc2VkIG9uIGl0cyBNSU1FIHR5cGUuCisKKyAgICAgICAgUmV0dXJuIHZhbHVlIGlzIGEgbGlzdCBvZiBzdHJpbmdzIGdpdmluZyB0aGUgcG9zc2libGUgZmlsZW5hbWUKKyAgICAgICAgZXh0ZW5zaW9ucywgaW5jbHVkaW5nIHRoZSBsZWFkaW5nIGRvdCAoJy4nKS4gIFRoZSBleHRlbnNpb24gaXMgbm90CisgICAgICAgIGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuIGFzc29jaWF0ZWQgd2l0aCBhbnkgcGFydGljdWxhciBkYXRhIHN0cmVhbSwKKyAgICAgICAgYnV0IHdvdWxkIGJlIG1hcHBlZCB0byB0aGUgTUlNRSB0eXBlIGB0eXBlJyBieSBndWVzc190eXBlKCkuCisKKyAgICAgICAgT3B0aW9uYWwgYHN0cmljdCcgYXJndW1lbnQgd2hlbiBmYWxzZSBhZGRzIGEgYnVuY2ggb2YgY29tbW9ubHkgZm91bmQsCisgICAgICAgIGJ1dCBub24tc3RhbmRhcmQgdHlwZXMuCisgICAgICAgICIiIgorICAgICAgICB0eXBlID0gdHlwZS5sb3dlcigpCisgICAgICAgIGV4dGVuc2lvbnMgPSBzZWxmLnR5cGVzX21hcF9pbnZbVHJ1ZV0uZ2V0KHR5cGUsIFtdKQorICAgICAgICBpZiBub3Qgc3RyaWN0OgorICAgICAgICAgICAgZm9yIGV4dCBpbiBzZWxmLnR5cGVzX21hcF9pbnZbRmFsc2VdLmdldCh0eXBlLCBbXSk6CisgICAgICAgICAgICAgICAgaWYgZXh0IG5vdCBpbiBleHRlbnNpb25zOgorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zLmFwcGVuZChleHQpCisgICAgICAgIHJldHVybiBleHRlbnNpb25zCisKKyAgICBkZWYgZ3Vlc3NfZXh0ZW5zaW9uKHNlbGYsIHR5cGUsIHN0cmljdD1UcnVlKToKKyAgICAgICAgIiIiR3Vlc3MgdGhlIGV4dGVuc2lvbiBmb3IgYSBmaWxlIGJhc2VkIG9uIGl0cyBNSU1FIHR5cGUuCisKKyAgICAgICAgUmV0dXJuIHZhbHVlIGlzIGEgc3RyaW5nIGdpdmluZyBhIGZpbGVuYW1lIGV4dGVuc2lvbiwKKyAgICAgICAgaW5jbHVkaW5nIHRoZSBsZWFkaW5nIGRvdCAoJy4nKS4gIFRoZSBleHRlbnNpb24gaXMgbm90CisgICAgICAgIGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuIGFzc29jaWF0ZWQgd2l0aCBhbnkgcGFydGljdWxhciBkYXRhCisgICAgICAgIHN0cmVhbSwgYnV0IHdvdWxkIGJlIG1hcHBlZCB0byB0aGUgTUlNRSB0eXBlIGB0eXBlJyBieQorICAgICAgICBndWVzc190eXBlKCkuICBJZiBubyBleHRlbnNpb24gY2FuIGJlIGd1ZXNzZWQgZm9yIGB0eXBlJywgTm9uZQorICAgICAgICBpcyByZXR1cm5lZC4KKworICAgICAgICBPcHRpb25hbCBgc3RyaWN0JyBhcmd1bWVudCB3aGVuIGZhbHNlIGFkZHMgYSBidW5jaCBvZiBjb21tb25seSBmb3VuZCwKKyAgICAgICAgYnV0IG5vbi1zdGFuZGFyZCB0eXBlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGV4dGVuc2lvbnMgPSBzZWxmLmd1ZXNzX2FsbF9leHRlbnNpb25zKHR5cGUsIHN0cmljdCkKKyAgICAgICAgaWYgbm90IGV4dGVuc2lvbnM6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gZXh0ZW5zaW9uc1swXQorCisgICAgZGVmIHJlYWQoc2VsZiwgZmlsZW5hbWUsIHN0cmljdD1UcnVlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlYWQgYSBzaW5nbGUgbWltZS50eXBlcy1mb3JtYXQgZmlsZSwgc3BlY2lmaWVkIGJ5IHBhdGhuYW1lLgorCisgICAgICAgIElmIHN0cmljdCBpcyB0cnVlLCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFkZGVkIHRvCisgICAgICAgIGxpc3Qgb2Ygc3RhbmRhcmQgdHlwZXMsIGVsc2UgdG8gdGhlIGxpc3Qgb2Ygbm9uLXN0YW5kYXJkCisgICAgICAgIHR5cGVzLgorICAgICAgICAiIiIKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYucmVhZGZwKGZwLCBzdHJpY3QpCisKKyAgICBkZWYgcmVhZGZwKHNlbGYsIGZwLCBzdHJpY3Q9VHJ1ZSk6CisgICAgICAgICIiIgorICAgICAgICBSZWFkIGEgc2luZ2xlIG1pbWUudHlwZXMtZm9ybWF0IGZpbGUuCisKKyAgICAgICAgSWYgc3RyaWN0IGlzIHRydWUsIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQgdG8KKyAgICAgICAgbGlzdCBvZiBzdGFuZGFyZCB0eXBlcywgZWxzZSB0byB0aGUgbGlzdCBvZiBub24tc3RhbmRhcmQKKyAgICAgICAgdHlwZXMuCisgICAgICAgICIiIgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB3b3JkcyA9IGxpbmUuc3BsaXQoKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHdvcmRzKSk6CisgICAgICAgICAgICAgICAgaWYgd29yZHNbaV1bMF0gPT0gJyMnOgorICAgICAgICAgICAgICAgICAgICBkZWwgd29yZHNbaTpdCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBub3Qgd29yZHM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHR5cGUsIHN1ZmZpeGVzID0gd29yZHNbMF0sIHdvcmRzWzE6XQorICAgICAgICAgICAgZm9yIHN1ZmYgaW4gc3VmZml4ZXM6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfdHlwZSh0eXBlLCAnLicgKyBzdWZmLCBzdHJpY3QpCisKKyAgICBkZWYgcmVhZF93aW5kb3dzX3JlZ2lzdHJ5KHNlbGYsIHN0cmljdD1UcnVlKToKKyAgICAgICAgIiIiCisgICAgICAgIExvYWQgdGhlIE1JTUUgdHlwZXMgZGF0YWJhc2UgZnJvbSBXaW5kb3dzIHJlZ2lzdHJ5LgorCisgICAgICAgIElmIHN0cmljdCBpcyB0cnVlLCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFkZGVkIHRvCisgICAgICAgIGxpc3Qgb2Ygc3RhbmRhcmQgdHlwZXMsIGVsc2UgdG8gdGhlIGxpc3Qgb2Ygbm9uLXN0YW5kYXJkCisgICAgICAgIHR5cGVzLgorICAgICAgICAiIiIKKworICAgICAgICAjIFdpbmRvd3Mgb25seQorICAgICAgICBpZiBub3QgX3dpbnJlZzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGRlZiBlbnVtX3R5cGVzKG1pbWVkYik6CisgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGN0eXBlID0gX3dpbnJlZy5FbnVtS2V5KG1pbWVkYiwgaSkKKyAgICAgICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGN0eXBlID0gY3R5cGUuZW5jb2RlKGRlZmF1bHRfZW5jb2RpbmcpICMgb21pdCBpbiAzLnghCisgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGN0eXBlCisgICAgICAgICAgICAgICAgaSArPSAxCisKKyAgICAgICAgZGVmYXVsdF9lbmNvZGluZyA9IHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQorICAgICAgICB3aXRoIF93aW5yZWcuT3BlbktleShfd2lucmVnLkhLRVlfQ0xBU1NFU19ST09ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ01JTUVcRGF0YWJhc2VcQ29udGVudCBUeXBlJykgYXMgbWltZWRiOgorICAgICAgICAgICAgZm9yIGN0eXBlIGluIGVudW1fdHlwZXMobWltZWRiKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHdpdGggX3dpbnJlZy5PcGVuS2V5KG1pbWVkYiwgY3R5cGUpIGFzIGtleToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCwgZGF0YXR5cGUgPSBfd2lucmVnLlF1ZXJ5VmFsdWVFeChrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V4dGVuc2lvbicpCisgICAgICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgZGF0YXR5cGUgIT0gX3dpbnJlZy5SRUdfU1o6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBzdWZmaXguZW5jb2RlKGRlZmF1bHRfZW5jb2RpbmcpICMgb21pdCBpbiAzLnghCisgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF90eXBlKGN0eXBlLCBzdWZmaXgsIHN0cmljdCkKKworCitkZWYgZ3Vlc3NfdHlwZSh1cmwsIHN0cmljdD1UcnVlKToKKyAgICAiIiJHdWVzcyB0aGUgdHlwZSBvZiBhIGZpbGUgYmFzZWQgb24gaXRzIFVSTC4KKworICAgIFJldHVybiB2YWx1ZSBpcyBhIHR1cGxlICh0eXBlLCBlbmNvZGluZykgd2hlcmUgdHlwZSBpcyBOb25lIGlmIHRoZQorICAgIHR5cGUgY2FuJ3QgYmUgZ3Vlc3NlZCAobm8gb3IgdW5rbm93biBzdWZmaXgpIG9yIGEgc3RyaW5nIG9mIHRoZQorICAgIGZvcm0gdHlwZS9zdWJ0eXBlLCB1c2FibGUgZm9yIGEgTUlNRSBDb250ZW50LXR5cGUgaGVhZGVyOyBhbmQKKyAgICBlbmNvZGluZyBpcyBOb25lIGZvciBubyBlbmNvZGluZyBvciB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbSB1c2VkCisgICAgdG8gZW5jb2RlIChlLmcuIGNvbXByZXNzIG9yIGd6aXApLiAgVGhlIG1hcHBpbmdzIGFyZSB0YWJsZQorICAgIGRyaXZlbi4gIEVuY29kaW5nIHN1ZmZpeGVzIGFyZSBjYXNlIHNlbnNpdGl2ZTsgdHlwZSBzdWZmaXhlcyBhcmUKKyAgICBmaXJzdCB0cmllZCBjYXNlIHNlbnNpdGl2ZSwgdGhlbiBjYXNlIGluc2Vuc2l0aXZlLgorCisgICAgVGhlIHN1ZmZpeGVzIC50Z3osIC50YXogYW5kIC50eiAoY2FzZSBzZW5zaXRpdmUhKSBhcmUgYWxsIG1hcHBlZAorICAgIHRvICIudGFyLmd6Ii4gIChUaGlzIGlzIHRhYmxlLWRyaXZlbiB0b28sIHVzaW5nIHRoZSBkaWN0aW9uYXJ5CisgICAgc3VmZml4X21hcCkuCisKKyAgICBPcHRpb25hbCBgc3RyaWN0JyBhcmd1bWVudCB3aGVuIGZhbHNlIGFkZHMgYSBidW5jaCBvZiBjb21tb25seSBmb3VuZCwgYnV0CisgICAgbm9uLXN0YW5kYXJkIHR5cGVzLgorICAgICIiIgorICAgIGlmIF9kYiBpcyBOb25lOgorICAgICAgICBpbml0KCkKKyAgICByZXR1cm4gX2RiLmd1ZXNzX3R5cGUodXJsLCBzdHJpY3QpCisKKworZGVmIGd1ZXNzX2FsbF9leHRlbnNpb25zKHR5cGUsIHN0cmljdD1UcnVlKToKKyAgICAiIiJHdWVzcyB0aGUgZXh0ZW5zaW9ucyBmb3IgYSBmaWxlIGJhc2VkIG9uIGl0cyBNSU1FIHR5cGUuCisKKyAgICBSZXR1cm4gdmFsdWUgaXMgYSBsaXN0IG9mIHN0cmluZ3MgZ2l2aW5nIHRoZSBwb3NzaWJsZSBmaWxlbmFtZQorICAgIGV4dGVuc2lvbnMsIGluY2x1ZGluZyB0aGUgbGVhZGluZyBkb3QgKCcuJykuICBUaGUgZXh0ZW5zaW9uIGlzIG5vdAorICAgIGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuIGFzc29jaWF0ZWQgd2l0aCBhbnkgcGFydGljdWxhciBkYXRhCisgICAgc3RyZWFtLCBidXQgd291bGQgYmUgbWFwcGVkIHRvIHRoZSBNSU1FIHR5cGUgYHR5cGUnIGJ5CisgICAgZ3Vlc3NfdHlwZSgpLiAgSWYgbm8gZXh0ZW5zaW9uIGNhbiBiZSBndWVzc2VkIGZvciBgdHlwZScsIE5vbmUKKyAgICBpcyByZXR1cm5lZC4KKworICAgIE9wdGlvbmFsIGBzdHJpY3QnIGFyZ3VtZW50IHdoZW4gZmFsc2UgYWRkcyBhIGJ1bmNoIG9mIGNvbW1vbmx5IGZvdW5kLAorICAgIGJ1dCBub24tc3RhbmRhcmQgdHlwZXMuCisgICAgIiIiCisgICAgaWYgX2RiIGlzIE5vbmU6CisgICAgICAgIGluaXQoKQorICAgIHJldHVybiBfZGIuZ3Vlc3NfYWxsX2V4dGVuc2lvbnModHlwZSwgc3RyaWN0KQorCitkZWYgZ3Vlc3NfZXh0ZW5zaW9uKHR5cGUsIHN0cmljdD1UcnVlKToKKyAgICAiIiJHdWVzcyB0aGUgZXh0ZW5zaW9uIGZvciBhIGZpbGUgYmFzZWQgb24gaXRzIE1JTUUgdHlwZS4KKworICAgIFJldHVybiB2YWx1ZSBpcyBhIHN0cmluZyBnaXZpbmcgYSBmaWxlbmFtZSBleHRlbnNpb24sIGluY2x1ZGluZyB0aGUKKyAgICBsZWFkaW5nIGRvdCAoJy4nKS4gIFRoZSBleHRlbnNpb24gaXMgbm90IGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuCisgICAgYXNzb2NpYXRlZCB3aXRoIGFueSBwYXJ0aWN1bGFyIGRhdGEgc3RyZWFtLCBidXQgd291bGQgYmUgbWFwcGVkIHRvIHRoZQorICAgIE1JTUUgdHlwZSBgdHlwZScgYnkgZ3Vlc3NfdHlwZSgpLiAgSWYgbm8gZXh0ZW5zaW9uIGNhbiBiZSBndWVzc2VkIGZvcgorICAgIGB0eXBlJywgTm9uZSBpcyByZXR1cm5lZC4KKworICAgIE9wdGlvbmFsIGBzdHJpY3QnIGFyZ3VtZW50IHdoZW4gZmFsc2UgYWRkcyBhIGJ1bmNoIG9mIGNvbW1vbmx5IGZvdW5kLAorICAgIGJ1dCBub24tc3RhbmRhcmQgdHlwZXMuCisgICAgIiIiCisgICAgaWYgX2RiIGlzIE5vbmU6CisgICAgICAgIGluaXQoKQorICAgIHJldHVybiBfZGIuZ3Vlc3NfZXh0ZW5zaW9uKHR5cGUsIHN0cmljdCkKKworZGVmIGFkZF90eXBlKHR5cGUsIGV4dCwgc3RyaWN0PVRydWUpOgorICAgICIiIkFkZCBhIG1hcHBpbmcgYmV0d2VlbiBhIHR5cGUgYW5kIGFuIGV4dGVuc2lvbi4KKworICAgIFdoZW4gdGhlIGV4dGVuc2lvbiBpcyBhbHJlYWR5IGtub3duLCB0aGUgbmV3CisgICAgdHlwZSB3aWxsIHJlcGxhY2UgdGhlIG9sZCBvbmUuIFdoZW4gdGhlIHR5cGUKKyAgICBpcyBhbHJlYWR5IGtub3duIHRoZSBleHRlbnNpb24gd2lsbCBiZSBhZGRlZAorICAgIHRvIHRoZSBsaXN0IG9mIGtub3duIGV4dGVuc2lvbnMuCisKKyAgICBJZiBzdHJpY3QgaXMgdHJ1ZSwgaW5mb3JtYXRpb24gd2lsbCBiZSBhZGRlZCB0bworICAgIGxpc3Qgb2Ygc3RhbmRhcmQgdHlwZXMsIGVsc2UgdG8gdGhlIGxpc3Qgb2Ygbm9uLXN0YW5kYXJkCisgICAgdHlwZXMuCisgICAgIiIiCisgICAgaWYgX2RiIGlzIE5vbmU6CisgICAgICAgIGluaXQoKQorICAgIHJldHVybiBfZGIuYWRkX3R5cGUodHlwZSwgZXh0LCBzdHJpY3QpCisKKworZGVmIGluaXQoZmlsZXM9Tm9uZSk6CisgICAgZ2xvYmFsIHN1ZmZpeF9tYXAsIHR5cGVzX21hcCwgZW5jb2RpbmdzX21hcCwgY29tbW9uX3R5cGVzCisgICAgZ2xvYmFsIGluaXRlZCwgX2RiCisgICAgaW5pdGVkID0gVHJ1ZSAgICAjIHNvIHRoYXQgTWltZVR5cGVzLl9faW5pdF9fKCkgZG9lc24ndCBjYWxsIHVzIGFnYWluCisgICAgZGIgPSBNaW1lVHlwZXMoKQorICAgIGlmIGZpbGVzIGlzIE5vbmU6CisgICAgICAgIGlmIF93aW5yZWc6CisgICAgICAgICAgICBkYi5yZWFkX3dpbmRvd3NfcmVnaXN0cnkoKQorICAgICAgICBmaWxlcyA9IGtub3duZmlsZXMKKyAgICBmb3IgZmlsZSBpbiBmaWxlczoKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZSk6CisgICAgICAgICAgICBkYi5yZWFkKGZpbGUpCisgICAgZW5jb2RpbmdzX21hcCA9IGRiLmVuY29kaW5nc19tYXAKKyAgICBzdWZmaXhfbWFwID0gZGIuc3VmZml4X21hcAorICAgIHR5cGVzX21hcCA9IGRiLnR5cGVzX21hcFtUcnVlXQorICAgIGNvbW1vbl90eXBlcyA9IGRiLnR5cGVzX21hcFtGYWxzZV0KKyAgICAjIE1ha2UgdGhlIERCIGEgZ2xvYmFsIHZhcmlhYmxlIG5vdyB0aGF0IGl0IGlzIGZ1bGx5IGluaXRpYWxpemVkCisgICAgX2RiID0gZGIKKworCitkZWYgcmVhZF9taW1lX3R5cGVzKGZpbGUpOgorICAgIHRyeToKKyAgICAgICAgZiA9IG9wZW4oZmlsZSkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBkYiA9IE1pbWVUeXBlcygpCisgICAgZGIucmVhZGZwKGYsIFRydWUpCisgICAgcmV0dXJuIGRiLnR5cGVzX21hcFtUcnVlXQorCisKK2RlZiBfZGVmYXVsdF9taW1lX3R5cGVzKCk6CisgICAgZ2xvYmFsIHN1ZmZpeF9tYXAKKyAgICBnbG9iYWwgZW5jb2RpbmdzX21hcAorICAgIGdsb2JhbCB0eXBlc19tYXAKKyAgICBnbG9iYWwgY29tbW9uX3R5cGVzCisKKyAgICBzdWZmaXhfbWFwID0geworICAgICAgICAnLnRneic6ICcudGFyLmd6JywKKyAgICAgICAgJy50YXonOiAnLnRhci5neicsCisgICAgICAgICcudHonOiAnLnRhci5neicsCisgICAgICAgICcudGJ6Mic6ICcudGFyLmJ6MicsCisgICAgICAgICcudHh6JzogJy50YXIueHonLAorICAgICAgICB9CisKKyAgICBlbmNvZGluZ3NfbWFwID0geworICAgICAgICAnLmd6JzogJ2d6aXAnLAorICAgICAgICAnLlonOiAnY29tcHJlc3MnLAorICAgICAgICAnLmJ6Mic6ICdiemlwMicsCisgICAgICAgICcueHonOiAneHonLAorICAgICAgICB9CisKKyAgICAjIEJlZm9yZSBhZGRpbmcgbmV3IHR5cGVzLCBtYWtlIHN1cmUgdGhleSBhcmUgZWl0aGVyIHJlZ2lzdGVyZWQgd2l0aCBJQU5BLAorICAgICMgYXQgaHR0cDovL3d3dy5pc2kuZWR1L2luLW5vdGVzL2lhbmEvYXNzaWdubWVudHMvbWVkaWEtdHlwZXMKKyAgICAjIG9yIGV4dGVuc2lvbnMsIGkuZS4gdXNpbmcgdGhlIHgtIHByZWZpeAorCisgICAgIyBJZiB5b3UgYWRkIHRvIHRoZXNlLCBwbGVhc2Uga2VlcCB0aGVtIHNvcnRlZCEKKyAgICB0eXBlc19tYXAgPSB7CisgICAgICAgICcuYScgICAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAorICAgICAgICAnLmFpJyAgICAgOiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCisgICAgICAgICcuYWlmJyAgICA6ICdhdWRpby94LWFpZmYnLAorICAgICAgICAnLmFpZmMnICAgOiAnYXVkaW8veC1haWZmJywKKyAgICAgICAgJy5haWZmJyAgIDogJ2F1ZGlvL3gtYWlmZicsCisgICAgICAgICcuYXUnICAgICA6ICdhdWRpby9iYXNpYycsCisgICAgICAgICcuYXZpJyAgICA6ICd2aWRlby94LW1zdmlkZW8nLAorICAgICAgICAnLmJhdCcgICAgOiAndGV4dC9wbGFpbicsCisgICAgICAgICcuYmNwaW8nICA6ICdhcHBsaWNhdGlvbi94LWJjcGlvJywKKyAgICAgICAgJy5iaW4nICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCisgICAgICAgICcuYm1wJyAgICA6ICdpbWFnZS94LW1zLWJtcCcsCisgICAgICAgICcuYycgICAgICA6ICd0ZXh0L3BsYWluJywKKyAgICAgICAgIyBEdXBsaWNhdGVzIDooCisgICAgICAgICcuY2RmJyAgICA6ICdhcHBsaWNhdGlvbi94LWNkZicsCisgICAgICAgICcuY2RmJyAgICA6ICdhcHBsaWNhdGlvbi94LW5ldGNkZicsCisgICAgICAgICcuY3BpbycgICA6ICdhcHBsaWNhdGlvbi94LWNwaW8nLAorICAgICAgICAnLmNzaCcgICAgOiAnYXBwbGljYXRpb24veC1jc2gnLAorICAgICAgICAnLmNzcycgICAgOiAndGV4dC9jc3MnLAorICAgICAgICAnLmRsbCcgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5kb2MnICAgIDogJ2FwcGxpY2F0aW9uL21zd29yZCcsCisgICAgICAgICcuZG90JyAgICA6ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAorICAgICAgICAnLmR2aScgICAgOiAnYXBwbGljYXRpb24veC1kdmknLAorICAgICAgICAnLmVtbCcgICAgOiAnbWVzc2FnZS9yZmM4MjInLAorICAgICAgICAnLmVwcycgICAgOiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCisgICAgICAgICcuZXR4JyAgICA6ICd0ZXh0L3gtc2V0ZXh0JywKKyAgICAgICAgJy5leGUnICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCisgICAgICAgICcuZ2lmJyAgICA6ICdpbWFnZS9naWYnLAorICAgICAgICAnLmd0YXInICAgOiAnYXBwbGljYXRpb24veC1ndGFyJywKKyAgICAgICAgJy5oJyAgICAgIDogJ3RleHQvcGxhaW4nLAorICAgICAgICAnLmhkZicgICAgOiAnYXBwbGljYXRpb24veC1oZGYnLAorICAgICAgICAnLmh0bScgICAgOiAndGV4dC9odG1sJywKKyAgICAgICAgJy5odG1sJyAgIDogJ3RleHQvaHRtbCcsCisgICAgICAgICcuaWNvJyAgICA6ICdpbWFnZS92bmQubWljcm9zb2Z0Lmljb24nLAorICAgICAgICAnLmllZicgICAgOiAnaW1hZ2UvaWVmJywKKyAgICAgICAgJy5qcGUnICAgIDogJ2ltYWdlL2pwZWcnLAorICAgICAgICAnLmpwZWcnICAgOiAnaW1hZ2UvanBlZycsCisgICAgICAgICcuanBnJyAgICA6ICdpbWFnZS9qcGVnJywKKyAgICAgICAgJy5qcycgICAgIDogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLAorICAgICAgICAnLmtzaCcgICAgOiAndGV4dC9wbGFpbicsCisgICAgICAgICcubGF0ZXgnICA6ICdhcHBsaWNhdGlvbi94LWxhdGV4JywKKyAgICAgICAgJy5tMXYnICAgIDogJ3ZpZGVvL21wZWcnLAorICAgICAgICAnLm1hbicgICAgOiAnYXBwbGljYXRpb24veC10cm9mZi1tYW4nLAorICAgICAgICAnLm1lJyAgICAgOiAnYXBwbGljYXRpb24veC10cm9mZi1tZScsCisgICAgICAgICcubWh0JyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCisgICAgICAgICcubWh0bWwnICA6ICdtZXNzYWdlL3JmYzgyMicsCisgICAgICAgICcubWlmJyAgICA6ICdhcHBsaWNhdGlvbi94LW1pZicsCisgICAgICAgICcubW92JyAgICA6ICd2aWRlby9xdWlja3RpbWUnLAorICAgICAgICAnLm1vdmllJyAgOiAndmlkZW8veC1zZ2ktbW92aWUnLAorICAgICAgICAnLm1wMicgICAgOiAnYXVkaW8vbXBlZycsCisgICAgICAgICcubXAzJyAgICA6ICdhdWRpby9tcGVnJywKKyAgICAgICAgJy5tcDQnICAgIDogJ3ZpZGVvL21wNCcsCisgICAgICAgICcubXBhJyAgICA6ICd2aWRlby9tcGVnJywKKyAgICAgICAgJy5tcGUnICAgIDogJ3ZpZGVvL21wZWcnLAorICAgICAgICAnLm1wZWcnICAgOiAndmlkZW8vbXBlZycsCisgICAgICAgICcubXBnJyAgICA6ICd2aWRlby9tcGVnJywKKyAgICAgICAgJy5tcycgICAgIDogJ2FwcGxpY2F0aW9uL3gtdHJvZmYtbXMnLAorICAgICAgICAnLm5jJyAgICAgOiAnYXBwbGljYXRpb24veC1uZXRjZGYnLAorICAgICAgICAnLm53cycgICAgOiAnbWVzc2FnZS9yZmM4MjInLAorICAgICAgICAnLm8nICAgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5vYmonICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCisgICAgICAgICcub2RhJyAgICA6ICdhcHBsaWNhdGlvbi9vZGEnLAorICAgICAgICAnLnAxMicgICAgOiAnYXBwbGljYXRpb24veC1wa2NzMTInLAorICAgICAgICAnLnA3YycgICAgOiAnYXBwbGljYXRpb24vcGtjczctbWltZScsCisgICAgICAgICcucGJtJyAgICA6ICdpbWFnZS94LXBvcnRhYmxlLWJpdG1hcCcsCisgICAgICAgICcucGRmJyAgICA6ICdhcHBsaWNhdGlvbi9wZGYnLAorICAgICAgICAnLnBmeCcgICAgOiAnYXBwbGljYXRpb24veC1wa2NzMTInLAorICAgICAgICAnLnBnbScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1ncmF5bWFwJywKKyAgICAgICAgJy5wbCcgICAgIDogJ3RleHQvcGxhaW4nLAorICAgICAgICAnLnBuZycgICAgOiAnaW1hZ2UvcG5nJywKKyAgICAgICAgJy5wbm0nICAgIDogJ2ltYWdlL3gtcG9ydGFibGUtYW55bWFwJywKKyAgICAgICAgJy5wb3QnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKKyAgICAgICAgJy5wcGEnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKKyAgICAgICAgJy5wcG0nICAgIDogJ2ltYWdlL3gtcG9ydGFibGUtcGl4bWFwJywKKyAgICAgICAgJy5wcHMnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKKyAgICAgICAgJy5wcHQnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKKyAgICAgICAgJy5wcycgICAgIDogJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAorICAgICAgICAnLnB3eicgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnB5JyAgICAgOiAndGV4dC94LXB5dGhvbicsCisgICAgICAgICcucHljJyAgICA6ICdhcHBsaWNhdGlvbi94LXB5dGhvbi1jb2RlJywKKyAgICAgICAgJy5weW8nICAgIDogJ2FwcGxpY2F0aW9uL3gtcHl0aG9uLWNvZGUnLAorICAgICAgICAnLnF0JyAgICAgOiAndmlkZW8vcXVpY2t0aW1lJywKKyAgICAgICAgJy5yYScgICAgIDogJ2F1ZGlvL3gtcG4tcmVhbGF1ZGlvJywKKyAgICAgICAgJy5yYW0nICAgIDogJ2FwcGxpY2F0aW9uL3gtcG4tcmVhbGF1ZGlvJywKKyAgICAgICAgJy5yYXMnICAgIDogJ2ltYWdlL3gtY211LXJhc3RlcicsCisgICAgICAgICcucmRmJyAgICA6ICdhcHBsaWNhdGlvbi94bWwnLAorICAgICAgICAnLnJnYicgICAgOiAnaW1hZ2UveC1yZ2InLAorICAgICAgICAnLnJvZmYnICAgOiAnYXBwbGljYXRpb24veC10cm9mZicsCisgICAgICAgICcucnR4JyAgICA6ICd0ZXh0L3JpY2h0ZXh0JywKKyAgICAgICAgJy5zZ20nICAgIDogJ3RleHQveC1zZ21sJywKKyAgICAgICAgJy5zZ21sJyAgIDogJ3RleHQveC1zZ21sJywKKyAgICAgICAgJy5zaCcgICAgIDogJ2FwcGxpY2F0aW9uL3gtc2gnLAorICAgICAgICAnLnNoYXInICAgOiAnYXBwbGljYXRpb24veC1zaGFyJywKKyAgICAgICAgJy5zbmQnICAgIDogJ2F1ZGlvL2Jhc2ljJywKKyAgICAgICAgJy5zbycgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCisgICAgICAgICcuc3JjJyAgICA6ICdhcHBsaWNhdGlvbi94LXdhaXMtc291cmNlJywKKyAgICAgICAgJy5zdjRjcGlvJzogJ2FwcGxpY2F0aW9uL3gtc3Y0Y3BpbycsCisgICAgICAgICcuc3Y0Y3JjJyA6ICdhcHBsaWNhdGlvbi94LXN2NGNyYycsCisgICAgICAgICcuc3dmJyAgICA6ICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsCisgICAgICAgICcudCcgICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmJywKKyAgICAgICAgJy50YXInICAgIDogJ2FwcGxpY2F0aW9uL3gtdGFyJywKKyAgICAgICAgJy50Y2wnICAgIDogJ2FwcGxpY2F0aW9uL3gtdGNsJywKKyAgICAgICAgJy50ZXgnICAgIDogJ2FwcGxpY2F0aW9uL3gtdGV4JywKKyAgICAgICAgJy50ZXhpJyAgIDogJ2FwcGxpY2F0aW9uL3gtdGV4aW5mbycsCisgICAgICAgICcudGV4aW5mbyc6ICdhcHBsaWNhdGlvbi94LXRleGluZm8nLAorICAgICAgICAnLnRpZicgICAgOiAnaW1hZ2UvdGlmZicsCisgICAgICAgICcudGlmZicgICA6ICdpbWFnZS90aWZmJywKKyAgICAgICAgJy50cicgICAgIDogJ2FwcGxpY2F0aW9uL3gtdHJvZmYnLAorICAgICAgICAnLnRzdicgICAgOiAndGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcycsCisgICAgICAgICcudHh0JyAgICA6ICd0ZXh0L3BsYWluJywKKyAgICAgICAgJy51c3RhcicgIDogJ2FwcGxpY2F0aW9uL3gtdXN0YXInLAorICAgICAgICAnLnZjZicgICAgOiAndGV4dC94LXZjYXJkJywKKyAgICAgICAgJy53YXYnICAgIDogJ2F1ZGlvL3gtd2F2JywKKyAgICAgICAgJy53aXonICAgIDogJ2FwcGxpY2F0aW9uL21zd29yZCcsCisgICAgICAgICcud3NkbCcgICA6ICdhcHBsaWNhdGlvbi94bWwnLAorICAgICAgICAnLnhibScgICAgOiAnaW1hZ2UveC14Yml0bWFwJywKKyAgICAgICAgJy54bGInICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsCisgICAgICAgICMgRHVwbGljYXRlcyA6KAorICAgICAgICAnLnhscycgICAgOiAnYXBwbGljYXRpb24vZXhjZWwnLAorICAgICAgICAnLnhscycgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywKKyAgICAgICAgJy54bWwnICAgIDogJ3RleHQveG1sJywKKyAgICAgICAgJy54cGRsJyAgIDogJ2FwcGxpY2F0aW9uL3htbCcsCisgICAgICAgICcueHBtJyAgICA6ICdpbWFnZS94LXhwaXhtYXAnLAorICAgICAgICAnLnhzbCcgICAgOiAnYXBwbGljYXRpb24veG1sJywKKyAgICAgICAgJy54d2QnICAgIDogJ2ltYWdlL3gteHdpbmRvd2R1bXAnLAorICAgICAgICAnLnppcCcgICAgOiAnYXBwbGljYXRpb24vemlwJywKKyAgICAgICAgfQorCisgICAgIyBUaGVzZSBhcmUgbm9uLXN0YW5kYXJkIHR5cGVzLCBjb21tb25seSBmb3VuZCBpbiB0aGUgd2lsZC4gIFRoZXkgd2lsbAorICAgICMgb25seSBtYXRjaCBpZiBzdHJpY3Q9MCBmbGFnIGlzIGdpdmVuIHRvIHRoZSBBUEkgbWV0aG9kcy4KKworICAgICMgUGxlYXNlIHNvcnQgdGhlc2UgdG9vCisgICAgY29tbW9uX3R5cGVzID0geworICAgICAgICAnLmpwZycgOiAnaW1hZ2UvanBnJywKKyAgICAgICAgJy5taWQnIDogJ2F1ZGlvL21pZGknLAorICAgICAgICAnLm1pZGknOiAnYXVkaW8vbWlkaScsCisgICAgICAgICcucGN0JyA6ICdpbWFnZS9waWN0JywKKyAgICAgICAgJy5waWMnIDogJ2ltYWdlL3BpY3QnLAorICAgICAgICAnLnBpY3QnOiAnaW1hZ2UvcGljdCcsCisgICAgICAgICcucnRmJyA6ICdhcHBsaWNhdGlvbi9ydGYnLAorICAgICAgICAnLnh1bCcgOiAndGV4dC94dWwnCisgICAgICAgIH0KKworCitfZGVmYXVsdF9taW1lX3R5cGVzKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBnZXRvcHQKKworICAgIFVTQUdFID0gIiIiXAorVXNhZ2U6IG1pbWV0eXBlcy5weSBbb3B0aW9uc10gdHlwZQorCitPcHRpb25zOgorICAgIC0taGVscCAvIC1oICAgICAgIC0tIHByaW50IHRoaXMgbWVzc2FnZSBhbmQgZXhpdAorICAgIC0tbGVuaWVudCAvIC1sICAgIC0tIGFkZGl0aW9uYWxseSBzZWFyY2ggb2Ygc29tZSBjb21tb24sIGJ1dCBub24tc3RhbmRhcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlcy4KKyAgICAtLWV4dGVuc2lvbiAvIC1lICAtLSBndWVzcyBleHRlbnNpb24gaW5zdGVhZCBvZiB0eXBlCisKK01vcmUgdGhhbiBvbmUgdHlwZSBhcmd1bWVudCBtYXkgYmUgZ2l2ZW4uCisiIiIKKworICAgIGRlZiB1c2FnZShjb2RlLCBtc2c9JycpOgorICAgICAgICBwcmludCBVU0FHRQorICAgICAgICBpZiBtc2c6IHByaW50IG1zZworICAgICAgICBzeXMuZXhpdChjb2RlKQorCisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdobGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2hlbHAnLCAnbGVuaWVudCcsICdleHRlbnNpb24nXSkKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgIHVzYWdlKDEsIG1zZykKKworICAgIHN0cmljdCA9IDEKKyAgICBleHRlbnNpb24gPSAwCisgICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6CisgICAgICAgIGlmIG9wdCBpbiAoJy1oJywgJy0taGVscCcpOgorICAgICAgICAgICAgdXNhZ2UoMCkKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctbCcsICctLWxlbmllbnQnKToKKyAgICAgICAgICAgIHN0cmljdCA9IDAKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctZScsICctLWV4dGVuc2lvbicpOgorICAgICAgICAgICAgZXh0ZW5zaW9uID0gMQorICAgIGZvciBndHlwZSBpbiBhcmdzOgorICAgICAgICBpZiBleHRlbnNpb246CisgICAgICAgICAgICBndWVzcyA9IGd1ZXNzX2V4dGVuc2lvbihndHlwZSwgc3RyaWN0KQorICAgICAgICAgICAgaWYgbm90IGd1ZXNzOiBwcmludCAiSSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IHR5cGUiLCBndHlwZQorICAgICAgICAgICAgZWxzZTogcHJpbnQgZ3Vlc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGd1ZXNzLCBlbmNvZGluZyA9IGd1ZXNzX3R5cGUoZ3R5cGUsIHN0cmljdCkKKyAgICAgICAgICAgIGlmIG5vdCBndWVzczogcHJpbnQgIkkgZG9uJ3Qga25vdyBhbnl0aGluZyBhYm91dCB0eXBlIiwgZ3R5cGUKKyAgICAgICAgICAgIGVsc2U6IHByaW50ICd0eXBlOicsIGd1ZXNzLCAnZW5jb2Rpbmc6JywgZW5jb2RpbmcKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWltZXR5cGVzLnB5YyBiL2xpYi9weXRob24yLjcvbWltZXR5cGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmY5ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9taW1ldHlwZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWltZXR5cGVzLnB5byBiL2xpYi9weXRob24yLjcvbWltZXR5cGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmY5ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9taW1ldHlwZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWltaWZ5LnB5IGIvbGliL3B5dGhvbjIuNy9taW1pZnkucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWMxNTk4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWltaWZ5LnB5CkBAIC0wLDAgKzEsNDY4IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIk1pbWlmaWNhdGlvbiBhbmQgdW5taW1pZmljYXRpb24gb2YgbWFpbCBtZXNzYWdlcy4KKworRGVjb2RlIHF1b3RlZC1wcmludGFibGUgcGFydHMgb2YgYSBtYWlsIG1lc3NhZ2Ugb3IgZW5jb2RlIHVzaW5nCitxdW90ZWQtcHJpbnRhYmxlLgorCitVc2FnZToKKyAgICAgICAgbWltaWZ5KGlucHV0LCBvdXRwdXQpCisgICAgICAgIHVubWltaWZ5KGlucHV0LCBvdXRwdXQsIGRlY29kZV9iYXNlNjQgPSAwKQordG8gZW5jb2RlIGFuZCBkZWNvZGUgcmVzcGVjdGl2ZWx5LiAgSW5wdXQgYW5kIG91dHB1dCBtYXkgYmUgdGhlIG5hbWUKK29mIGEgZmlsZSBvciBhbiBvcGVuIGZpbGUgb2JqZWN0LiAgT25seSBhIHJlYWRsaW5lKCkgbWV0aG9kIGlzIHVzZWQKK29uIHRoZSBpbnB1dCBmaWxlLCBvbmx5IGEgd3JpdGUoKSBtZXRob2QgaXMgdXNlZCBvbiB0aGUgb3V0cHV0IGZpbGUuCitXaGVuIHVzaW5nIGZpbGUgbmFtZXMsIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGUgbmFtZXMgbWF5IGJlIHRoZQorc2FtZS4KKworSW50ZXJhY3RpdmUgdXNhZ2U6CisgICAgICAgIG1pbWlmeS5weSAtZSBbaW5maWxlIFtvdXRmaWxlXV0KKyAgICAgICAgbWltaWZ5LnB5IC1kIFtpbmZpbGUgW291dGZpbGVdXQordG8gZW5jb2RlIGFuZCBkZWNvZGUgcmVzcGVjdGl2ZWx5LiAgSW5maWxlIGRlZmF1bHRzIHRvIHN0YW5kYXJkCitpbnB1dCBhbmQgb3V0ZmlsZSB0byBzdGFuZGFyZCBvdXRwdXQuCisiIiIKKworIyBDb25maWd1cmUKK01BWExFTiA9IDIwMCAgICAjIGlmIGxpbmVzIGxvbmdlciB0aGFuIHRoaXMsIGVuY29kZSBhcyBxdW90ZWQtcHJpbnRhYmxlCitDSEFSU0VUID0gJ0lTTy04ODU5LTEnICAjIGRlZmF1bHQgY2hhcnNldCBmb3Igbm9uLVVTLUFTQ0lJIG1haWwKK1FVT1RFID0gJz4gJyAgICAgICAgICAgICMgc3RyaW5nIHJlcGxpZXMgYXJlIHF1b3RlZCB3aXRoCisjIEVuZCBjb25maWd1cmUKKworaW1wb3J0IHJlCisKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3Mud2FybigidGhlIG1pbWlmeSBtb2R1bGUgaXMgZGVwcmVjYXRlZDsgdXNlIHRoZSBlbWFpbCBwYWNrYWdlIGluc3RlYWQiLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKKworX19hbGxfXyA9IFsibWltaWZ5IiwidW5taW1pZnkiLCJtaW1lX2VuY29kZV9oZWFkZXIiLCJtaW1lX2RlY29kZV9oZWFkZXIiXQorCitxcCA9IHJlLmNvbXBpbGUoJ15jb250ZW50LXRyYW5zZmVyLWVuY29kaW5nOlxccypxdW90ZWQtcHJpbnRhYmxlJywgcmUuSSkKK2Jhc2U2NF9yZSA9IHJlLmNvbXBpbGUoJ15jb250ZW50LXRyYW5zZmVyLWVuY29kaW5nOlxccypiYXNlNjQnLCByZS5JKQorbXAgPSByZS5jb21waWxlKCdeY29udGVudC10eXBlOi4qbXVsdGlwYXJ0Ly4qYm91bmRhcnk9Ij8oW147IlxuXSopJywgcmUuSXxyZS5TKQorY2hyc2V0ID0gcmUuY29tcGlsZSgnXihjb250ZW50LXR5cGU6LipjaGFyc2V0PSIpKHVzLWFzY2lpfGlzby04ODU5LVswLTldKykoIi4qKScsIHJlLkl8cmUuUykKK2hlID0gcmUuY29tcGlsZSgnXi0qXG4nKQorbWltZV9jb2RlID0gcmUuY29tcGlsZSgnPShbMC05YS1mXVswLTlhLWZdKScsIHJlLkkpCittaW1lX2hlYWQgPSByZS5jb21waWxlKCc9XFw/aXNvLTg4NTktMVxcP3FcXD8oW14/IFx0XG5dKylcXD89JywgcmUuSSkKK3JlcGwgPSByZS5jb21waWxlKCdec3ViamVjdDpcXHMrcmU6ICcsIHJlLkkpCisKK2NsYXNzIEZpbGU6CisgICAgIiIiQSBzaW1wbGUgZmFrZSBmaWxlIG9iamVjdCB0aGF0IGtub3dzIGFib3V0IGxpbWl0ZWQgcmVhZC1haGVhZCBhbmQKKyAgICBib3VuZGFyaWVzLiAgVGhlIG9ubHkgc3VwcG9ydGVkIG1ldGhvZCBpcyByZWFkbGluZSgpLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIGJvdW5kYXJ5KToKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICBzZWxmLmJvdW5kYXJ5ID0gYm91bmRhcnkKKyAgICAgICAgc2VsZi5wZWVrID0gTm9uZQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnBlZWsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gJycKKyAgICAgICAgbGluZSA9IHNlbGYuZmlsZS5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgcmV0dXJuIGxpbmUKKyAgICAgICAgaWYgc2VsZi5ib3VuZGFyeToKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gc2VsZi5ib3VuZGFyeSArICdcbic6CisgICAgICAgICAgICAgICAgc2VsZi5wZWVrID0gbGluZQorICAgICAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICAgICAgaWYgbGluZSA9PSBzZWxmLmJvdW5kYXJ5ICsgJy0tXG4nOgorICAgICAgICAgICAgICAgIHNlbGYucGVlayA9IGxpbmUKKyAgICAgICAgICAgICAgICByZXR1cm4gJycKKyAgICAgICAgcmV0dXJuIGxpbmUKKworY2xhc3MgSGVhZGVyRmlsZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSk6CisgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5wZWVrID0gTm9uZQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnBlZWsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5wZWVrCisgICAgICAgICAgICBzZWxmLnBlZWsgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICByZXR1cm4gbGluZQorICAgICAgICBpZiBoZS5tYXRjaChsaW5lKToKKyAgICAgICAgICAgIHJldHVybiBsaW5lCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBzZWxmLnBlZWsgPSBzZWxmLmZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbGVuKHNlbGYucGVlaykgPT0gMCBvciBcCisgICAgICAgICAgICAgICAoc2VsZi5wZWVrWzBdICE9ICcgJyBhbmQgc2VsZi5wZWVrWzBdICE9ICdcdCcpOgorICAgICAgICAgICAgICAgIHJldHVybiBsaW5lCisgICAgICAgICAgICBsaW5lID0gbGluZSArIHNlbGYucGVlaworICAgICAgICAgICAgc2VsZi5wZWVrID0gTm9uZQorCitkZWYgbWltZV9kZWNvZGUobGluZSk6CisgICAgIiIiRGVjb2RlIGEgc2luZ2xlIGxpbmUgb2YgcXVvdGVkLXByaW50YWJsZSB0ZXh0IHRvIDhiaXQuIiIiCisgICAgbmV3bGluZSA9ICcnCisgICAgcG9zID0gMAorICAgIHdoaWxlIDE6CisgICAgICAgIHJlcyA9IG1pbWVfY29kZS5zZWFyY2gobGluZSwgcG9zKQorICAgICAgICBpZiByZXMgaXMgTm9uZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG5ld2xpbmUgPSBuZXdsaW5lICsgbGluZVtwb3M6cmVzLnN0YXJ0KDApXSArIFwKKyAgICAgICAgICAgICAgICAgIGNocihpbnQocmVzLmdyb3VwKDEpLCAxNikpCisgICAgICAgIHBvcyA9IHJlcy5lbmQoMCkKKyAgICByZXR1cm4gbmV3bGluZSArIGxpbmVbcG9zOl0KKworZGVmIG1pbWVfZGVjb2RlX2hlYWRlcihsaW5lKToKKyAgICAiIiJEZWNvZGUgYSBoZWFkZXIgbGluZSB0byA4Yml0LiIiIgorICAgIG5ld2xpbmUgPSAnJworICAgIHBvcyA9IDAKKyAgICB3aGlsZSAxOgorICAgICAgICByZXMgPSBtaW1lX2hlYWQuc2VhcmNoKGxpbmUsIHBvcykKKyAgICAgICAgaWYgcmVzIGlzIE5vbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBtYXRjaCA9IHJlcy5ncm91cCgxKQorICAgICAgICAjIGNvbnZlcnQgdW5kZXJzY29yZXMgdG8gc3BhY2VzIChiZWZvcmUgPVhYIGNvbnZlcnNpb24hKQorICAgICAgICBtYXRjaCA9ICcgJy5qb2luKG1hdGNoLnNwbGl0KCdfJykpCisgICAgICAgIG5ld2xpbmUgPSBuZXdsaW5lICsgbGluZVtwb3M6cmVzLnN0YXJ0KDApXSArIG1pbWVfZGVjb2RlKG1hdGNoKQorICAgICAgICBwb3MgPSByZXMuZW5kKDApCisgICAgcmV0dXJuIG5ld2xpbmUgKyBsaW5lW3BvczpdCisKK2RlZiB1bm1pbWlmeV9wYXJ0KGlmaWxlLCBvZmlsZSwgZGVjb2RlX2Jhc2U2NCA9IDApOgorICAgICIiIkNvbnZlcnQgYSBxdW90ZWQtcHJpbnRhYmxlIHBhcnQgb2YgYSBNSU1FIG1haWwgbWVzc2FnZSB0byA4Yml0LiIiIgorICAgIG11bHRpcGFydCA9IE5vbmUKKyAgICBxdW90ZWRfcHJpbnRhYmxlID0gMAorICAgIGlzX2Jhc2U2NCA9IDAKKyAgICBpc19yZXBsID0gMAorICAgIGlmIGlmaWxlLmJvdW5kYXJ5IGFuZCBpZmlsZS5ib3VuZGFyeVs6Ml0gPT0gUVVPVEU6CisgICAgICAgIHByZWZpeCA9IFFVT1RFCisgICAgZWxzZToKKyAgICAgICAgcHJlZml4ID0gJycKKworICAgICMgcmVhZCBoZWFkZXIKKyAgICBoZmlsZSA9IEhlYWRlckZpbGUoaWZpbGUpCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGhmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgcHJlZml4IGFuZCBsaW5lWzpsZW4ocHJlZml4KV0gPT0gcHJlZml4OgorICAgICAgICAgICAgbGluZSA9IGxpbmVbbGVuKHByZWZpeCk6XQorICAgICAgICAgICAgcHJlZiA9IHByZWZpeAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJlZiA9ICcnCisgICAgICAgIGxpbmUgPSBtaW1lX2RlY29kZV9oZWFkZXIobGluZSkKKyAgICAgICAgaWYgcXAubWF0Y2gobGluZSk6CisgICAgICAgICAgICBxdW90ZWRfcHJpbnRhYmxlID0gMQorICAgICAgICAgICAgY29udGludWUgICAgICAgICMgc2tpcCB0aGlzIGhlYWRlcgorICAgICAgICBpZiBkZWNvZGVfYmFzZTY0IGFuZCBiYXNlNjRfcmUubWF0Y2gobGluZSk6CisgICAgICAgICAgICBpc19iYXNlNjQgPSAxCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBvZmlsZS53cml0ZShwcmVmICsgbGluZSkKKyAgICAgICAgaWYgbm90IHByZWZpeCBhbmQgcmVwbC5tYXRjaChsaW5lKToKKyAgICAgICAgICAgICMgd2UncmUgZGVhbGluZyB3aXRoIGEgcmVwbHkgbWVzc2FnZQorICAgICAgICAgICAgaXNfcmVwbCA9IDEKKyAgICAgICAgbXBfcmVzID0gbXAubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbXBfcmVzOgorICAgICAgICAgICAgbXVsdGlwYXJ0ID0gJy0tJyArIG1wX3Jlcy5ncm91cCgxKQorICAgICAgICBpZiBoZS5tYXRjaChsaW5lKToKKyAgICAgICAgICAgIGJyZWFrCisgICAgaWYgaXNfcmVwbCBhbmQgKHF1b3RlZF9wcmludGFibGUgb3IgbXVsdGlwYXJ0KToKKyAgICAgICAgaXNfcmVwbCA9IDAKKworICAgICMgcmVhZCBib2R5CisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGlmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbGluZSA9IHJlLnN1YihtaW1lX2hlYWQsICdcXDEnLCBsaW5lKQorICAgICAgICBpZiBwcmVmaXggYW5kIGxpbmVbOmxlbihwcmVmaXgpXSA9PSBwcmVmaXg6CisgICAgICAgICAgICBsaW5lID0gbGluZVtsZW4ocHJlZml4KTpdCisgICAgICAgICAgICBwcmVmID0gcHJlZml4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmVmID0gJycKKyMjICAgICAgICAgICAgICBpZiBpc19yZXBsIGFuZCBsZW4obGluZSkgPj0gNCBhbmQgbGluZVs6NF0gPT0gUVVPVEUrJy0tJyBhbmQgbGluZVstMzpdICE9ICctLVxuJzoKKyMjICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGFydCA9IGxpbmVbOi0xXQorICAgICAgICB3aGlsZSBtdWx0aXBhcnQ6CisgICAgICAgICAgICBpZiBsaW5lID09IG11bHRpcGFydCArICctLVxuJzoKKyAgICAgICAgICAgICAgICBvZmlsZS53cml0ZShwcmVmICsgbGluZSkKKyAgICAgICAgICAgICAgICBtdWx0aXBhcnQgPSBOb25lCisgICAgICAgICAgICAgICAgbGluZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbGluZSA9PSBtdWx0aXBhcnQgKyAnXG4nOgorICAgICAgICAgICAgICAgIG9maWxlLndyaXRlKHByZWYgKyBsaW5lKQorICAgICAgICAgICAgICAgIG5pZmlsZSA9IEZpbGUoaWZpbGUsIG11bHRpcGFydCkKKyAgICAgICAgICAgICAgICB1bm1pbWlmeV9wYXJ0KG5pZmlsZSwgb2ZpbGUsIGRlY29kZV9iYXNlNjQpCisgICAgICAgICAgICAgICAgbGluZSA9IG5pZmlsZS5wZWVrCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgICAgICMgcHJlbWF0dXJlIGVuZCBvZiBmaWxlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgbm90IGEgYm91bmRhcnkgYmV0d2VlbiBwYXJ0cworICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbGluZSBhbmQgcXVvdGVkX3ByaW50YWJsZToKKyAgICAgICAgICAgIHdoaWxlIGxpbmVbLTI6XSA9PSAnPVxuJzoKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTJdCisgICAgICAgICAgICAgICAgbmV3bGluZSA9IGlmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBuZXdsaW5lWzpsZW4oUVVPVEUpXSA9PSBRVU9URToKKyAgICAgICAgICAgICAgICAgICAgbmV3bGluZSA9IG5ld2xpbmVbbGVuKFFVT1RFKTpdCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUgKyBuZXdsaW5lCisgICAgICAgICAgICBsaW5lID0gbWltZV9kZWNvZGUobGluZSkKKyAgICAgICAgaWYgbGluZSBhbmQgaXNfYmFzZTY0IGFuZCBub3QgcHJlZjoKKyAgICAgICAgICAgIGltcG9ydCBiYXNlNjQKKyAgICAgICAgICAgIGxpbmUgPSBiYXNlNjQuZGVjb2Rlc3RyaW5nKGxpbmUpCisgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICBvZmlsZS53cml0ZShwcmVmICsgbGluZSkKKworZGVmIHVubWltaWZ5KGluZmlsZSwgb3V0ZmlsZSwgZGVjb2RlX2Jhc2U2NCA9IDApOgorICAgICIiIkNvbnZlcnQgcXVvdGVkLXByaW50YWJsZSBwYXJ0cyBvZiBhIE1JTUUgbWFpbCBtZXNzYWdlIHRvIDhiaXQuIiIiCisgICAgaWYgdHlwZShpbmZpbGUpID09IHR5cGUoJycpOgorICAgICAgICBpZmlsZSA9IG9wZW4oaW5maWxlKQorICAgICAgICBpZiB0eXBlKG91dGZpbGUpID09IHR5cGUoJycpIGFuZCBpbmZpbGUgPT0gb3V0ZmlsZToKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgZCwgZiA9IG9zLnBhdGguc3BsaXQoaW5maWxlKQorICAgICAgICAgICAgb3MucmVuYW1lKGluZmlsZSwgb3MucGF0aC5qb2luKGQsICcsJyArIGYpKQorICAgIGVsc2U6CisgICAgICAgIGlmaWxlID0gaW5maWxlCisgICAgaWYgdHlwZShvdXRmaWxlKSA9PSB0eXBlKCcnKToKKyAgICAgICAgb2ZpbGUgPSBvcGVuKG91dGZpbGUsICd3JykKKyAgICBlbHNlOgorICAgICAgICBvZmlsZSA9IG91dGZpbGUKKyAgICBuaWZpbGUgPSBGaWxlKGlmaWxlLCBOb25lKQorICAgIHVubWltaWZ5X3BhcnQobmlmaWxlLCBvZmlsZSwgZGVjb2RlX2Jhc2U2NCkKKyAgICBvZmlsZS5mbHVzaCgpCisKK21pbWVfY2hhciA9IHJlLmNvbXBpbGUoJ1s9XDE3Ny1cMzc3XScpICMgcXVvdGUgdGhlc2UgY2hhcnMgaW4gYm9keQorbWltZV9oZWFkZXJfY2hhciA9IHJlLmNvbXBpbGUoJ1s9P1wxNzctXDM3N10nKSAjIHF1b3RlIHRoZXNlIGluIGhlYWRlcgorCitkZWYgbWltZV9lbmNvZGUobGluZSwgaGVhZGVyKToKKyAgICAiIiJDb2RlIGEgc2luZ2xlIGxpbmUgYXMgcXVvdGVkLXByaW50YWJsZS4KKyAgICBJZiBoZWFkZXIgaXMgc2V0LCBxdW90ZSBzb21lIGV4dHJhIGNoYXJhY3RlcnMuIiIiCisgICAgaWYgaGVhZGVyOgorICAgICAgICByZWcgPSBtaW1lX2hlYWRlcl9jaGFyCisgICAgZWxzZToKKyAgICAgICAgcmVnID0gbWltZV9jaGFyCisgICAgbmV3bGluZSA9ICcnCisgICAgcG9zID0gMAorICAgIGlmIGxlbihsaW5lKSA+PSA1IGFuZCBsaW5lWzo1XSA9PSAnRnJvbSAnOgorICAgICAgICAjIHF1b3RlICdGcm9tICcgYXQgdGhlIHN0YXJ0IG9mIGEgbGluZSBmb3Igc3R1cGlkIG1haWxlcnMKKyAgICAgICAgbmV3bGluZSA9ICgnPSUwMngnICUgb3JkKCdGJykpLnVwcGVyKCkKKyAgICAgICAgcG9zID0gMQorICAgIHdoaWxlIDE6CisgICAgICAgIHJlcyA9IHJlZy5zZWFyY2gobGluZSwgcG9zKQorICAgICAgICBpZiByZXMgaXMgTm9uZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG5ld2xpbmUgPSBuZXdsaW5lICsgbGluZVtwb3M6cmVzLnN0YXJ0KDApXSArIFwKKyAgICAgICAgICAgICAgICAgICgnPSUwMngnICUgb3JkKHJlcy5ncm91cCgwKSkpLnVwcGVyKCkKKyAgICAgICAgcG9zID0gcmVzLmVuZCgwKQorICAgIGxpbmUgPSBuZXdsaW5lICsgbGluZVtwb3M6XQorCisgICAgbmV3bGluZSA9ICcnCisgICAgd2hpbGUgbGVuKGxpbmUpID49IDc1OgorICAgICAgICBpID0gNzMKKyAgICAgICAgd2hpbGUgbGluZVtpXSA9PSAnPScgb3IgbGluZVtpLTFdID09ICc9JzoKKyAgICAgICAgICAgIGkgPSBpIC0gMQorICAgICAgICBpID0gaSArIDEKKyAgICAgICAgbmV3bGluZSA9IG5ld2xpbmUgKyBsaW5lWzppXSArICc9XG4nCisgICAgICAgIGxpbmUgPSBsaW5lW2k6XQorICAgIHJldHVybiBuZXdsaW5lICsgbGluZQorCittaW1lX2hlYWRlciA9IHJlLmNvbXBpbGUoJyhbIFx0KF18XikoWy1hLXpBLVowLTlfK10qW1wxNzctXDM3N11bLWEtekEtWjAtOV8rXDE3Ny1cMzc3XSopKD89WyBcdCldfFxuKScpCisKK2RlZiBtaW1lX2VuY29kZV9oZWFkZXIobGluZSk6CisgICAgIiIiQ29kZSBhIHNpbmdsZSBoZWFkZXIgbGluZSBhcyBxdW90ZWQtcHJpbnRhYmxlLiIiIgorICAgIG5ld2xpbmUgPSAnJworICAgIHBvcyA9IDAKKyAgICB3aGlsZSAxOgorICAgICAgICByZXMgPSBtaW1lX2hlYWRlci5zZWFyY2gobGluZSwgcG9zKQorICAgICAgICBpZiByZXMgaXMgTm9uZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG5ld2xpbmUgPSAnJXMlcyVzPT8lcz9RPyVzPz0nICUgXAorICAgICAgICAgICAgICAgICAgKG5ld2xpbmUsIGxpbmVbcG9zOnJlcy5zdGFydCgwKV0sIHJlcy5ncm91cCgxKSwKKyAgICAgICAgICAgICAgICAgICBDSEFSU0VULCBtaW1lX2VuY29kZShyZXMuZ3JvdXAoMiksIDEpKQorICAgICAgICBwb3MgPSByZXMuZW5kKDApCisgICAgcmV0dXJuIG5ld2xpbmUgKyBsaW5lW3BvczpdCisKK212ID0gcmUuY29tcGlsZSgnXm1pbWUtdmVyc2lvbjonLCByZS5JKQorY3RlID0gcmUuY29tcGlsZSgnXmNvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6JywgcmUuSSkKK2lzb19jaGFyID0gcmUuY29tcGlsZSgnW1wxNzctXDM3N10nKQorCitkZWYgbWltaWZ5X3BhcnQoaWZpbGUsIG9maWxlLCBpc19taW1lKToKKyAgICAiIiJDb252ZXJ0IGFuIDhiaXQgcGFydCBvZiBhIE1JTUUgbWFpbCBtZXNzYWdlIHRvIHF1b3RlZC1wcmludGFibGUuIiIiCisgICAgaGFzX2N0ZSA9IGlzX3FwID0gaXNfYmFzZTY0ID0gMAorICAgIG11bHRpcGFydCA9IE5vbmUKKyAgICBtdXN0X3F1b3RlX2JvZHkgPSBtdXN0X3F1b3RlX2hlYWRlciA9IGhhc19pc29fY2hhcnMgPSAwCisKKyAgICBoZWFkZXIgPSBbXQorICAgIGhlYWRlcl9lbmQgPSAnJworICAgIG1lc3NhZ2UgPSBbXQorICAgIG1lc3NhZ2VfZW5kID0gJycKKyAgICAjIHJlYWQgaGVhZGVyCisgICAgaGZpbGUgPSBIZWFkZXJGaWxlKGlmaWxlKQorICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBoZmlsZS5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbm90IG11c3RfcXVvdGVfaGVhZGVyIGFuZCBpc29fY2hhci5zZWFyY2gobGluZSk6CisgICAgICAgICAgICBtdXN0X3F1b3RlX2hlYWRlciA9IDEKKyAgICAgICAgaWYgbXYubWF0Y2gobGluZSk6CisgICAgICAgICAgICBpc19taW1lID0gMQorICAgICAgICBpZiBjdGUubWF0Y2gobGluZSk6CisgICAgICAgICAgICBoYXNfY3RlID0gMQorICAgICAgICAgICAgaWYgcXAubWF0Y2gobGluZSk6CisgICAgICAgICAgICAgICAgaXNfcXAgPSAxCisgICAgICAgICAgICBlbGlmIGJhc2U2NF9yZS5tYXRjaChsaW5lKToKKyAgICAgICAgICAgICAgICBpc19iYXNlNjQgPSAxCisgICAgICAgIG1wX3JlcyA9IG1wLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG1wX3JlczoKKyAgICAgICAgICAgIG11bHRpcGFydCA9ICctLScgKyBtcF9yZXMuZ3JvdXAoMSkKKyAgICAgICAgaWYgaGUubWF0Y2gobGluZSk6CisgICAgICAgICAgICBoZWFkZXJfZW5kID0gbGluZQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaGVhZGVyLmFwcGVuZChsaW5lKQorCisgICAgIyByZWFkIGJvZHkKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gaWZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIG11bHRpcGFydDoKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gbXVsdGlwYXJ0ICsgJy0tXG4nOgorICAgICAgICAgICAgICAgIG1lc3NhZ2VfZW5kID0gbGluZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lID09IG11bHRpcGFydCArICdcbic6CisgICAgICAgICAgICAgICAgbWVzc2FnZV9lbmQgPSBsaW5lCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgaXNfYmFzZTY0OgorICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGlzX3FwOgorICAgICAgICAgICAgd2hpbGUgbGluZVstMjpdID09ICc9XG4nOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMl0KKyAgICAgICAgICAgICAgICBuZXdsaW5lID0gaWZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIG5ld2xpbmVbOmxlbihRVU9URSldID09IFFVT1RFOgorICAgICAgICAgICAgICAgICAgICBuZXdsaW5lID0gbmV3bGluZVtsZW4oUVVPVEUpOl0KKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArIG5ld2xpbmUKKyAgICAgICAgICAgIGxpbmUgPSBtaW1lX2RlY29kZShsaW5lKQorICAgICAgICBtZXNzYWdlLmFwcGVuZChsaW5lKQorICAgICAgICBpZiBub3QgaGFzX2lzb19jaGFyczoKKyAgICAgICAgICAgIGlmIGlzb19jaGFyLnNlYXJjaChsaW5lKToKKyAgICAgICAgICAgICAgICBoYXNfaXNvX2NoYXJzID0gbXVzdF9xdW90ZV9ib2R5ID0gMQorICAgICAgICBpZiBub3QgbXVzdF9xdW90ZV9ib2R5OgorICAgICAgICAgICAgaWYgbGVuKGxpbmUpID4gTUFYTEVOOgorICAgICAgICAgICAgICAgIG11c3RfcXVvdGVfYm9keSA9IDEKKworICAgICMgY29udmVydCBhbmQgb3V0cHV0IGhlYWRlciBhbmQgYm9keQorICAgIGZvciBsaW5lIGluIGhlYWRlcjoKKyAgICAgICAgaWYgbXVzdF9xdW90ZV9oZWFkZXI6CisgICAgICAgICAgICBsaW5lID0gbWltZV9lbmNvZGVfaGVhZGVyKGxpbmUpCisgICAgICAgIGNocnNldF9yZXMgPSBjaHJzZXQubWF0Y2gobGluZSkKKyAgICAgICAgaWYgY2hyc2V0X3JlczoKKyAgICAgICAgICAgIGlmIGhhc19pc29fY2hhcnM6CisgICAgICAgICAgICAgICAgIyBjaGFuZ2UgdXMtYXNjaWkgaW50byBpc28tODg1OS0xCisgICAgICAgICAgICAgICAgaWYgY2hyc2V0X3Jlcy5ncm91cCgyKS5sb3dlcigpID09ICd1cy1hc2NpaSc6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSAnJXMlcyVzJyAlIChjaHJzZXRfcmVzLmdyb3VwKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBUlNFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocnNldF9yZXMuZ3JvdXAoMykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgY2hhbmdlIGlzby04ODU5LSogaW50byB1cy1hc2NpaQorICAgICAgICAgICAgICAgIGxpbmUgPSAnJXN1cy1hc2NpaSVzJyAlIGNocnNldF9yZXMuZ3JvdXAoMSwgMykKKyAgICAgICAgaWYgaGFzX2N0ZSBhbmQgY3RlLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgbGluZSA9ICdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAnCisgICAgICAgICAgICBpZiBpc19iYXNlNjQ6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAnYmFzZTY0XG4nCisgICAgICAgICAgICBlbGlmIG11c3RfcXVvdGVfYm9keToKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArICdxdW90ZWQtcHJpbnRhYmxlXG4nCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgJzdiaXRcbicKKyAgICAgICAgb2ZpbGUud3JpdGUobGluZSkKKyAgICBpZiAobXVzdF9xdW90ZV9oZWFkZXIgb3IgbXVzdF9xdW90ZV9ib2R5KSBhbmQgbm90IGlzX21pbWU6CisgICAgICAgIG9maWxlLndyaXRlKCdNaW1lLVZlcnNpb246IDEuMFxuJykKKyAgICAgICAgb2ZpbGUud3JpdGUoJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgJykKKyAgICAgICAgaWYgaGFzX2lzb19jaGFyczoKKyAgICAgICAgICAgIG9maWxlLndyaXRlKCdjaGFyc2V0PSIlcyJcbicgJSBDSEFSU0VUKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2ZpbGUud3JpdGUoJ2NoYXJzZXQ9InVzLWFzY2lpIlxuJykKKyAgICBpZiBtdXN0X3F1b3RlX2JvZHkgYW5kIG5vdCBoYXNfY3RlOgorICAgICAgICBvZmlsZS53cml0ZSgnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogcXVvdGVkLXByaW50YWJsZVxuJykKKyAgICBvZmlsZS53cml0ZShoZWFkZXJfZW5kKQorCisgICAgZm9yIGxpbmUgaW4gbWVzc2FnZToKKyAgICAgICAgaWYgbXVzdF9xdW90ZV9ib2R5OgorICAgICAgICAgICAgbGluZSA9IG1pbWVfZW5jb2RlKGxpbmUsIDApCisgICAgICAgIG9maWxlLndyaXRlKGxpbmUpCisgICAgb2ZpbGUud3JpdGUobWVzc2FnZV9lbmQpCisKKyAgICBsaW5lID0gbWVzc2FnZV9lbmQKKyAgICB3aGlsZSBtdWx0aXBhcnQ6CisgICAgICAgIGlmIGxpbmUgPT0gbXVsdGlwYXJ0ICsgJy0tXG4nOgorICAgICAgICAgICAgIyByZWFkIGJpdCBhZnRlciB0aGUgZW5kIG9mIHRoZSBsYXN0IHBhcnQKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgbGluZSA9IGlmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgaWYgbXVzdF9xdW90ZV9ib2R5OgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbWltZV9lbmNvZGUobGluZSwgMCkKKyAgICAgICAgICAgICAgICBvZmlsZS53cml0ZShsaW5lKQorICAgICAgICBpZiBsaW5lID09IG11bHRpcGFydCArICdcbic6CisgICAgICAgICAgICBuaWZpbGUgPSBGaWxlKGlmaWxlLCBtdWx0aXBhcnQpCisgICAgICAgICAgICBtaW1pZnlfcGFydChuaWZpbGUsIG9maWxlLCAxKQorICAgICAgICAgICAgbGluZSA9IG5pZmlsZS5wZWVrCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAjIHByZW1hdHVyZSBlbmQgb2YgZmlsZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBvZmlsZS53cml0ZShsaW5lKQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgIyB1bmV4cGVjdGVkbHkgbm8gbXVsdGlwYXJ0IHNlcGFyYXRvci0tY29weSByZXN0IG9mIGZpbGUKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBpZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG11c3RfcXVvdGVfYm9keToKKyAgICAgICAgICAgICAgICBsaW5lID0gbWltZV9lbmNvZGUobGluZSwgMCkKKyAgICAgICAgICAgIG9maWxlLndyaXRlKGxpbmUpCisKK2RlZiBtaW1pZnkoaW5maWxlLCBvdXRmaWxlKToKKyAgICAiIiJDb252ZXJ0IDhiaXQgcGFydHMgb2YgYSBNSU1FIG1haWwgbWVzc2FnZSB0byBxdW90ZWQtcHJpbnRhYmxlLiIiIgorICAgIGlmIHR5cGUoaW5maWxlKSA9PSB0eXBlKCcnKToKKyAgICAgICAgaWZpbGUgPSBvcGVuKGluZmlsZSkKKyAgICAgICAgaWYgdHlwZShvdXRmaWxlKSA9PSB0eXBlKCcnKSBhbmQgaW5maWxlID09IG91dGZpbGU6CisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGQsIGYgPSBvcy5wYXRoLnNwbGl0KGluZmlsZSkKKyAgICAgICAgICAgIG9zLnJlbmFtZShpbmZpbGUsIG9zLnBhdGguam9pbihkLCAnLCcgKyBmKSkKKyAgICBlbHNlOgorICAgICAgICBpZmlsZSA9IGluZmlsZQorICAgIGlmIHR5cGUob3V0ZmlsZSkgPT0gdHlwZSgnJyk6CisgICAgICAgIG9maWxlID0gb3BlbihvdXRmaWxlLCAndycpCisgICAgZWxzZToKKyAgICAgICAgb2ZpbGUgPSBvdXRmaWxlCisgICAgbmlmaWxlID0gRmlsZShpZmlsZSwgTm9uZSkKKyAgICBtaW1pZnlfcGFydChuaWZpbGUsIG9maWxlLCAwKQorICAgIG9maWxlLmZsdXNoKCkKKworaW1wb3J0IHN5cworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJyBvciAobGVuKHN5cy5hcmd2KSA+IDAgYW5kIHN5cy5hcmd2WzBdID09ICdtaW1pZnknKToKKyAgICBpbXBvcnQgZ2V0b3B0CisgICAgdXNhZ2UgPSAnVXNhZ2U6IG1pbWlmeSBbLWwgbGVuXSAtW2VkXSBbaW5maWxlIFtvdXRmaWxlXV0nCisKKyAgICBkZWNvZGVfYmFzZTY0ID0gMAorICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ2w6ZWRiJykKKyAgICBpZiBsZW4oYXJncykgbm90IGluICgwLCAxLCAyKToKKyAgICAgICAgcHJpbnQgdXNhZ2UKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBpZiAoKCctZScsICcnKSBpbiBvcHRzKSA9PSAoKCctZCcsICcnKSBpbiBvcHRzKSBvciBcCisgICAgICAgKCgoJy1iJywgJycpIGluIG9wdHMpIGFuZCAoKCctZCcsICcnKSBub3QgaW4gb3B0cykpOgorICAgICAgICBwcmludCB1c2FnZQorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGZvciBvLCBhIGluIG9wdHM6CisgICAgICAgIGlmIG8gPT0gJy1lJzoKKyAgICAgICAgICAgIGVuY29kZSA9IG1pbWlmeQorICAgICAgICBlbGlmIG8gPT0gJy1kJzoKKyAgICAgICAgICAgIGVuY29kZSA9IHVubWltaWZ5CisgICAgICAgIGVsaWYgbyA9PSAnLWwnOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIE1BWExFTiA9IGludChhKQorICAgICAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yKToKKyAgICAgICAgICAgICAgICBwcmludCB1c2FnZQorICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIGVsaWYgbyA9PSAnLWInOgorICAgICAgICAgICAgZGVjb2RlX2Jhc2U2NCA9IDEKKyAgICBpZiBsZW4oYXJncykgPT0gMDoKKyAgICAgICAgZW5jb2RlX2FyZ3MgPSAoc3lzLnN0ZGluLCBzeXMuc3Rkb3V0KQorICAgIGVsaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgIGVuY29kZV9hcmdzID0gKGFyZ3NbMF0sIHN5cy5zdGRvdXQpCisgICAgZWxzZToKKyAgICAgICAgZW5jb2RlX2FyZ3MgPSAoYXJnc1swXSwgYXJnc1sxXSkKKyAgICBpZiBkZWNvZGVfYmFzZTY0OgorICAgICAgICBlbmNvZGVfYXJncyA9IGVuY29kZV9hcmdzICsgKGRlY29kZV9iYXNlNjQsKQorICAgIGVuY29kZSgqZW5jb2RlX2FyZ3MpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21pbWlmeS5weWMgYi9saWIvcHl0aG9uMi43L21pbWlmeS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlYjNlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWltaWZ5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21pbWlmeS5weW8gYi9saWIvcHl0aG9uMi43L21pbWlmeS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FlYjNlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWltaWZ5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21vZHVsZWZpbmRlci5weSBiL2xpYi9weXRob24yLjcvbW9kdWxlZmluZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMmJmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21vZHVsZWZpbmRlci5weQpAQCAtMCwwICsxLDY3MSBAQAorIiIiRmluZCBtb2R1bGVzIHVzZWQgYnkgYSBzY3JpcHQsIHVzaW5nIGludHJvc3BlY3Rpb24uIiIiCisjIFRoaXMgbW9kdWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4yLCBzZWUgUEVQIDI5MS4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzCitpbXBvcnQgZGlzCitpbXBvcnQgaW1wCitpbXBvcnQgbWFyc2hhbAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdHlwZXMKK2ltcG9ydCBzdHJ1Y3QKKworaWYgaGFzYXR0cihzeXMuX19zdGRvdXRfXywgIm5ld2xpbmVzIik6CisgICAgUkVBRF9NT0RFID0gIlUiICAjIHVuaXZlcnNhbCBsaW5lIGVuZGluZ3MKK2Vsc2U6CisgICAgIyByZW1haW4gY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAgPCAyLjMKKyAgICBSRUFEX01PREUgPSAiciIKKworTE9BRF9DT05TVCA9IGNocihkaXMub3BuYW1lLmluZGV4KCdMT0FEX0NPTlNUJykpCitJTVBPUlRfTkFNRSA9IGNocihkaXMub3BuYW1lLmluZGV4KCdJTVBPUlRfTkFNRScpKQorU1RPUkVfTkFNRSA9IGNocihkaXMub3BuYW1lLmluZGV4KCdTVE9SRV9OQU1FJykpCitTVE9SRV9HTE9CQUwgPSBjaHIoZGlzLm9wbmFtZS5pbmRleCgnU1RPUkVfR0xPQkFMJykpCitTVE9SRV9PUFMgPSBbU1RPUkVfTkFNRSwgU1RPUkVfR0xPQkFMXQorSEFWRV9BUkdVTUVOVCA9IGNocihkaXMuSEFWRV9BUkdVTUVOVCkKKworIyBNb2R1bGVmaW5kZXIgZG9lcyBhIGdvb2Qgam9iIGF0IHNpbXVsYXRpbmcgUHl0aG9uJ3MsIGJ1dCBpdCBjYW4gbm90CisjIGhhbmRsZSBfX3BhdGhfXyBtb2RpZmljYXRpb25zIHBhY2thZ2VzIG1ha2UgYXQgcnVudGltZS4gIFRoZXJlZm9yZSB0aGVyZQorIyBpcyBhIG1lY2hhbmlzbSB3aGVyZWJ5IHlvdSBjYW4gcmVnaXN0ZXIgZXh0cmEgcGF0aHMgaW4gdGhpcyBtYXAgZm9yIGEKKyMgcGFja2FnZSwgYW5kIGl0IHdpbGwgYmUgaG9ub3JlZC4KKworIyBOb3RlIHRoaXMgaXMgYSBtYXBwaW5nIGlzIGxpc3RzIG9mIHBhdGhzLgorcGFja2FnZVBhdGhNYXAgPSB7fQorCisjIEEgUHVibGljIGludGVyZmFjZQorZGVmIEFkZFBhY2thZ2VQYXRoKHBhY2thZ2VuYW1lLCBwYXRoKToKKyAgICBwYXRocyA9IHBhY2thZ2VQYXRoTWFwLmdldChwYWNrYWdlbmFtZSwgW10pCisgICAgcGF0aHMuYXBwZW5kKHBhdGgpCisgICAgcGFja2FnZVBhdGhNYXBbcGFja2FnZW5hbWVdID0gcGF0aHMKKworcmVwbGFjZVBhY2thZ2VNYXAgPSB7fQorCisjIFRoaXMgUmVwbGFjZVBhY2thZ2UgbWVjaGFuaXNtIGFsbG93cyBtb2R1bGVmaW5kZXIgdG8gd29yayBhcm91bmQgdGhlCisjIHdheSB0aGUgX3htbHBsdXMgcGFja2FnZSBpbmplY3RzIGl0c2VsZiB1bmRlciB0aGUgbmFtZSAieG1sIiBpbnRvCisjIHN5cy5tb2R1bGVzIGF0IHJ1bnRpbWUgYnkgY2FsbGluZyBSZXBsYWNlUGFja2FnZSgiX3htbHBsdXMiLCAieG1sIikKKyMgYmVmb3JlIHJ1bm5pbmcgTW9kdWxlRmluZGVyLgorCitkZWYgUmVwbGFjZVBhY2thZ2Uob2xkbmFtZSwgbmV3bmFtZSk6CisgICAgcmVwbGFjZVBhY2thZ2VNYXBbb2xkbmFtZV0gPSBuZXduYW1lCisKKworY2xhc3MgTW9kdWxlOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGZpbGU9Tm9uZSwgcGF0aD1Ob25lKToKKyAgICAgICAgc2VsZi5fX25hbWVfXyA9IG5hbWUKKyAgICAgICAgc2VsZi5fX2ZpbGVfXyA9IGZpbGUKKyAgICAgICAgc2VsZi5fX3BhdGhfXyA9IHBhdGgKKyAgICAgICAgc2VsZi5fX2NvZGVfXyA9IE5vbmUKKyAgICAgICAgIyBUaGUgc2V0IG9mIGdsb2JhbCBuYW1lcyB0aGF0IGFyZSBhc3NpZ25lZCB0byBpbiB0aGUgbW9kdWxlLgorICAgICAgICAjIFRoaXMgaW5jbHVkZXMgdGhvc2UgbmFtZXMgaW1wb3J0ZWQgdGhyb3VnaCBzdGFyaW1wb3J0cyBvZgorICAgICAgICAjIFB5dGhvbiBtb2R1bGVzLgorICAgICAgICBzZWxmLmdsb2JhbG5hbWVzID0ge30KKyAgICAgICAgIyBUaGUgc2V0IG9mIHN0YXJpbXBvcnRzIHRoaXMgbW9kdWxlIGRpZCB0aGF0IGNvdWxkIG5vdCBiZQorICAgICAgICAjIHJlc29sdmVkLCBpZS4gYSBzdGFyaW1wb3J0IGZyb20gYSBub24tUHl0aG9uIG1vZHVsZS4KKyAgICAgICAgc2VsZi5zdGFyaW1wb3J0cyA9IHt9CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHMgPSAiTW9kdWxlKCVyIiAlIChzZWxmLl9fbmFtZV9fLCkKKyAgICAgICAgaWYgc2VsZi5fX2ZpbGVfXyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHMgPSBzICsgIiwgJXIiICUgKHNlbGYuX19maWxlX18sKQorICAgICAgICBpZiBzZWxmLl9fcGF0aF9fIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcyA9IHMgKyAiLCAlciIgJSAoc2VsZi5fX3BhdGhfXywpCisgICAgICAgIHMgPSBzICsgIikiCisgICAgICAgIHJldHVybiBzCisKK2NsYXNzIE1vZHVsZUZpbmRlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPU5vbmUsIGRlYnVnPTAsIGV4Y2x1ZGVzPVtdLCByZXBsYWNlX3BhdGhzPVtdKToKKyAgICAgICAgaWYgcGF0aCBpcyBOb25lOgorICAgICAgICAgICAgcGF0aCA9IHN5cy5wYXRoCisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5tb2R1bGVzID0ge30KKyAgICAgICAgc2VsZi5iYWRtb2R1bGVzID0ge30KKyAgICAgICAgc2VsZi5kZWJ1ZyA9IGRlYnVnCisgICAgICAgIHNlbGYuaW5kZW50ID0gMAorICAgICAgICBzZWxmLmV4Y2x1ZGVzID0gZXhjbHVkZXMKKyAgICAgICAgc2VsZi5yZXBsYWNlX3BhdGhzID0gcmVwbGFjZV9wYXRocworICAgICAgICBzZWxmLnByb2Nlc3NlZF9wYXRocyA9IFtdICAgIyBVc2VkIGluIGRlYnVnZ2luZyBvbmx5CisKKyAgICBkZWYgbXNnKHNlbGYsIGxldmVsLCBzdHIsICphcmdzKToKKyAgICAgICAgaWYgbGV2ZWwgPD0gc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuaW5kZW50KToKKyAgICAgICAgICAgICAgICBwcmludCAiICAgIiwKKyAgICAgICAgICAgIHByaW50IHN0ciwKKyAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgICAgICBwcmludCByZXByKGFyZyksCisgICAgICAgICAgICBwcmludAorCisgICAgZGVmIG1zZ2luKHNlbGYsICphcmdzKToKKyAgICAgICAgbGV2ZWwgPSBhcmdzWzBdCisgICAgICAgIGlmIGxldmVsIDw9IHNlbGYuZGVidWc6CisgICAgICAgICAgICBzZWxmLmluZGVudCA9IHNlbGYuaW5kZW50ICsgMQorICAgICAgICAgICAgc2VsZi5tc2coKmFyZ3MpCisKKyAgICBkZWYgbXNnb3V0KHNlbGYsICphcmdzKToKKyAgICAgICAgbGV2ZWwgPSBhcmdzWzBdCisgICAgICAgIGlmIGxldmVsIDw9IHNlbGYuZGVidWc6CisgICAgICAgICAgICBzZWxmLmluZGVudCA9IHNlbGYuaW5kZW50IC0gMQorICAgICAgICAgICAgc2VsZi5tc2coKmFyZ3MpCisKKyAgICBkZWYgcnVuX3NjcmlwdChzZWxmLCBwYXRobmFtZSk6CisgICAgICAgIHNlbGYubXNnKDIsICJydW5fc2NyaXB0IiwgcGF0aG5hbWUpCisgICAgICAgIGZwID0gb3BlbihwYXRobmFtZSwgUkVBRF9NT0RFKQorICAgICAgICBzdHVmZiA9ICgiIiwgInIiLCBpbXAuUFlfU09VUkNFKQorICAgICAgICBzZWxmLmxvYWRfbW9kdWxlKCdfX21haW5fXycsIGZwLCBwYXRobmFtZSwgc3R1ZmYpCisKKyAgICBkZWYgbG9hZF9maWxlKHNlbGYsIHBhdGhuYW1lKToKKyAgICAgICAgZGlyLCBuYW1lID0gb3MucGF0aC5zcGxpdChwYXRobmFtZSkKKyAgICAgICAgbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQorICAgICAgICBmcCA9IG9wZW4ocGF0aG5hbWUsIFJFQURfTU9ERSkKKyAgICAgICAgc3R1ZmYgPSAoZXh0LCAiciIsIGltcC5QWV9TT1VSQ0UpCisgICAgICAgIHNlbGYubG9hZF9tb2R1bGUobmFtZSwgZnAsIHBhdGhuYW1lLCBzdHVmZikKKworICAgIGRlZiBpbXBvcnRfaG9vayhzZWxmLCBuYW1lLCBjYWxsZXI9Tm9uZSwgZnJvbWxpc3Q9Tm9uZSwgbGV2ZWw9LTEpOgorICAgICAgICBzZWxmLm1zZygzLCAiaW1wb3J0X2hvb2siLCBuYW1lLCBjYWxsZXIsIGZyb21saXN0LCBsZXZlbCkKKyAgICAgICAgcGFyZW50ID0gc2VsZi5kZXRlcm1pbmVfcGFyZW50KGNhbGxlciwgbGV2ZWw9bGV2ZWwpCisgICAgICAgIHEsIHRhaWwgPSBzZWxmLmZpbmRfaGVhZF9wYWNrYWdlKHBhcmVudCwgbmFtZSkKKyAgICAgICAgbSA9IHNlbGYubG9hZF90YWlsKHEsIHRhaWwpCisgICAgICAgIGlmIG5vdCBmcm9tbGlzdDoKKyAgICAgICAgICAgIHJldHVybiBxCisgICAgICAgIGlmIG0uX19wYXRoX186CisgICAgICAgICAgICBzZWxmLmVuc3VyZV9mcm9tbGlzdChtLCBmcm9tbGlzdCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBkZXRlcm1pbmVfcGFyZW50KHNlbGYsIGNhbGxlciwgbGV2ZWw9LTEpOgorICAgICAgICBzZWxmLm1zZ2luKDQsICJkZXRlcm1pbmVfcGFyZW50IiwgY2FsbGVyLCBsZXZlbCkKKyAgICAgICAgaWYgbm90IGNhbGxlciBvciBsZXZlbCA9PSAwOgorICAgICAgICAgICAgc2VsZi5tc2dvdXQoNCwgImRldGVybWluZV9wYXJlbnQgLT4gTm9uZSIpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBwbmFtZSA9IGNhbGxlci5fX25hbWVfXworICAgICAgICBpZiBsZXZlbCA+PSAxOiAjIHJlbGF0aXZlIGltcG9ydAorICAgICAgICAgICAgaWYgY2FsbGVyLl9fcGF0aF9fOgorICAgICAgICAgICAgICAgIGxldmVsIC09IDEKKyAgICAgICAgICAgIGlmIGxldmVsID09IDA6CisgICAgICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5tb2R1bGVzW3BuYW1lXQorICAgICAgICAgICAgICAgIGFzc2VydCBwYXJlbnQgaXMgY2FsbGVyCisgICAgICAgICAgICAgICAgc2VsZi5tc2dvdXQoNCwgImRldGVybWluZV9wYXJlbnQgLT4iLCBwYXJlbnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudAorICAgICAgICAgICAgaWYgcG5hbWUuY291bnQoIi4iKSA8IGxldmVsOgorICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAicmVsYXRpdmUgaW1wb3J0cGF0aCB0b28gZGVlcCIKKyAgICAgICAgICAgIHBuYW1lID0gIi4iLmpvaW4ocG5hbWUuc3BsaXQoIi4iKVs6LWxldmVsXSkKKyAgICAgICAgICAgIHBhcmVudCA9IHNlbGYubW9kdWxlc1twbmFtZV0KKyAgICAgICAgICAgIHNlbGYubXNnb3V0KDQsICJkZXRlcm1pbmVfcGFyZW50IC0+IiwgcGFyZW50KQorICAgICAgICAgICAgcmV0dXJuIHBhcmVudAorICAgICAgICBpZiBjYWxsZXIuX19wYXRoX186CisgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLm1vZHVsZXNbcG5hbWVdCisgICAgICAgICAgICBhc3NlcnQgY2FsbGVyIGlzIHBhcmVudAorICAgICAgICAgICAgc2VsZi5tc2dvdXQoNCwgImRldGVybWluZV9wYXJlbnQgLT4iLCBwYXJlbnQpCisgICAgICAgICAgICByZXR1cm4gcGFyZW50CisgICAgICAgIGlmICcuJyBpbiBwbmFtZToKKyAgICAgICAgICAgIGkgPSBwbmFtZS5yZmluZCgnLicpCisgICAgICAgICAgICBwbmFtZSA9IHBuYW1lWzppXQorICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5tb2R1bGVzW3BuYW1lXQorICAgICAgICAgICAgYXNzZXJ0IHBhcmVudC5fX25hbWVfXyA9PSBwbmFtZQorICAgICAgICAgICAgc2VsZi5tc2dvdXQoNCwgImRldGVybWluZV9wYXJlbnQgLT4iLCBwYXJlbnQpCisgICAgICAgICAgICByZXR1cm4gcGFyZW50CisgICAgICAgIHNlbGYubXNnb3V0KDQsICJkZXRlcm1pbmVfcGFyZW50IC0+IE5vbmUiKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGZpbmRfaGVhZF9wYWNrYWdlKHNlbGYsIHBhcmVudCwgbmFtZSk6CisgICAgICAgIHNlbGYubXNnaW4oNCwgImZpbmRfaGVhZF9wYWNrYWdlIiwgcGFyZW50LCBuYW1lKQorICAgICAgICBpZiAnLicgaW4gbmFtZToKKyAgICAgICAgICAgIGkgPSBuYW1lLmZpbmQoJy4nKQorICAgICAgICAgICAgaGVhZCA9IG5hbWVbOmldCisgICAgICAgICAgICB0YWlsID0gbmFtZVtpKzE6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGVhZCA9IG5hbWUKKyAgICAgICAgICAgIHRhaWwgPSAiIgorICAgICAgICBpZiBwYXJlbnQ6CisgICAgICAgICAgICBxbmFtZSA9ICIlcy4lcyIgJSAocGFyZW50Ll9fbmFtZV9fLCBoZWFkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcW5hbWUgPSBoZWFkCisgICAgICAgIHEgPSBzZWxmLmltcG9ydF9tb2R1bGUoaGVhZCwgcW5hbWUsIHBhcmVudCkKKyAgICAgICAgaWYgcToKKyAgICAgICAgICAgIHNlbGYubXNnb3V0KDQsICJmaW5kX2hlYWRfcGFja2FnZSAtPiIsIChxLCB0YWlsKSkKKyAgICAgICAgICAgIHJldHVybiBxLCB0YWlsCisgICAgICAgIGlmIHBhcmVudDoKKyAgICAgICAgICAgIHFuYW1lID0gaGVhZAorICAgICAgICAgICAgcGFyZW50ID0gTm9uZQorICAgICAgICAgICAgcSA9IHNlbGYuaW1wb3J0X21vZHVsZShoZWFkLCBxbmFtZSwgcGFyZW50KQorICAgICAgICAgICAgaWYgcToKKyAgICAgICAgICAgICAgICBzZWxmLm1zZ291dCg0LCAiZmluZF9oZWFkX3BhY2thZ2UgLT4iLCAocSwgdGFpbCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHEsIHRhaWwKKyAgICAgICAgc2VsZi5tc2dvdXQoNCwgInJhaXNlIEltcG9ydEVycm9yOiBObyBtb2R1bGUgbmFtZWQiLCBxbmFtZSkKKyAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJObyBtb2R1bGUgbmFtZWQgIiArIHFuYW1lCisKKyAgICBkZWYgbG9hZF90YWlsKHNlbGYsIHEsIHRhaWwpOgorICAgICAgICBzZWxmLm1zZ2luKDQsICJsb2FkX3RhaWwiLCBxLCB0YWlsKQorICAgICAgICBtID0gcQorICAgICAgICB3aGlsZSB0YWlsOgorICAgICAgICAgICAgaSA9IHRhaWwuZmluZCgnLicpCisgICAgICAgICAgICBpZiBpIDwgMDogaSA9IGxlbih0YWlsKQorICAgICAgICAgICAgaGVhZCwgdGFpbCA9IHRhaWxbOmldLCB0YWlsW2krMTpdCisgICAgICAgICAgICBtbmFtZSA9ICIlcy4lcyIgJSAobS5fX25hbWVfXywgaGVhZCkKKyAgICAgICAgICAgIG0gPSBzZWxmLmltcG9ydF9tb2R1bGUoaGVhZCwgbW5hbWUsIG0pCisgICAgICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgICAgICBzZWxmLm1zZ291dCg0LCAicmFpc2UgSW1wb3J0RXJyb3I6IE5vIG1vZHVsZSBuYW1lZCIsIG1uYW1lKQorICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiTm8gbW9kdWxlIG5hbWVkICIgKyBtbmFtZQorICAgICAgICBzZWxmLm1zZ291dCg0LCAibG9hZF90YWlsIC0+IiwgbSkKKyAgICAgICAgcmV0dXJuIG0KKworICAgIGRlZiBlbnN1cmVfZnJvbWxpc3Qoc2VsZiwgbSwgZnJvbWxpc3QsIHJlY3Vyc2l2ZT0wKToKKyAgICAgICAgc2VsZi5tc2coNCwgImVuc3VyZV9mcm9tbGlzdCIsIG0sIGZyb21saXN0LCByZWN1cnNpdmUpCisgICAgICAgIGZvciBzdWIgaW4gZnJvbWxpc3Q6CisgICAgICAgICAgICBpZiBzdWIgPT0gIioiOgorICAgICAgICAgICAgICAgIGlmIG5vdCByZWN1cnNpdmU6CisgICAgICAgICAgICAgICAgICAgIGFsbCA9IHNlbGYuZmluZF9hbGxfc3VibW9kdWxlcyhtKQorICAgICAgICAgICAgICAgICAgICBpZiBhbGw6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVuc3VyZV9mcm9tbGlzdChtLCBhbGwsIDEpCisgICAgICAgICAgICBlbGlmIG5vdCBoYXNhdHRyKG0sIHN1Yik6CisgICAgICAgICAgICAgICAgc3VibmFtZSA9ICIlcy4lcyIgJSAobS5fX25hbWVfXywgc3ViKQorICAgICAgICAgICAgICAgIHN1Ym1vZCA9IHNlbGYuaW1wb3J0X21vZHVsZShzdWIsIHN1Ym5hbWUsIG0pCisgICAgICAgICAgICAgICAgaWYgbm90IHN1Ym1vZDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJObyBtb2R1bGUgbmFtZWQgIiArIHN1Ym5hbWUKKworICAgIGRlZiBmaW5kX2FsbF9zdWJtb2R1bGVzKHNlbGYsIG0pOgorICAgICAgICBpZiBub3QgbS5fX3BhdGhfXzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtb2R1bGVzID0ge30KKyAgICAgICAgIyAnc3VmZml4ZXMnIHVzZWQgdG8gYmUgYSBsaXN0IGhhcmRjb2RlZCB0byBbIi5weSIsICIucHljIiwgIi5weW8iXS4KKyAgICAgICAgIyBCdXQgd2UgbXVzdCBhbHNvIGNvbGxlY3QgUHl0aG9uIGV4dGVuc2lvbiBtb2R1bGVzIC0gYWx0aG91Z2gKKyAgICAgICAgIyB3ZSBjYW5ub3Qgc2VwYXJhdGUgbm9ybWFsIGRsbHMgZnJvbSBQeXRob24gZXh0ZW5zaW9ucy4KKyAgICAgICAgc3VmZml4ZXMgPSBbXQorICAgICAgICBmb3IgdHJpcGxlIGluIGltcC5nZXRfc3VmZml4ZXMoKToKKyAgICAgICAgICAgIHN1ZmZpeGVzLmFwcGVuZCh0cmlwbGVbMF0pCisgICAgICAgIGZvciBkaXIgaW4gbS5fX3BhdGhfXzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlyKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYubXNnKDIsICJjYW4ndCBsaXN0IGRpcmVjdG9yeSIsIGRpcikKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICAgICAgbW9kID0gTm9uZQorICAgICAgICAgICAgICAgIGZvciBzdWZmIGluIHN1ZmZpeGVzOgorICAgICAgICAgICAgICAgICAgICBuID0gbGVuKHN1ZmYpCisgICAgICAgICAgICAgICAgICAgIGlmIG5hbWVbLW46XSA9PSBzdWZmOgorICAgICAgICAgICAgICAgICAgICAgICAgbW9kID0gbmFtZVs6LW5dCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIG1vZCBhbmQgbW9kICE9ICJfX2luaXRfXyI6CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZXNbbW9kXSA9IG1vZAorICAgICAgICByZXR1cm4gbW9kdWxlcy5rZXlzKCkKKworICAgIGRlZiBpbXBvcnRfbW9kdWxlKHNlbGYsIHBhcnRuYW1lLCBmcW5hbWUsIHBhcmVudCk6CisgICAgICAgIHNlbGYubXNnaW4oMywgImltcG9ydF9tb2R1bGUiLCBwYXJ0bmFtZSwgZnFuYW1lLCBwYXJlbnQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG0gPSBzZWxmLm1vZHVsZXNbZnFuYW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1zZ291dCgzLCAiaW1wb3J0X21vZHVsZSAtPiIsIG0pCisgICAgICAgICAgICByZXR1cm4gbQorICAgICAgICBpZiBmcW5hbWUgaW4gc2VsZi5iYWRtb2R1bGVzOgorICAgICAgICAgICAgc2VsZi5tc2dvdXQoMywgImltcG9ydF9tb2R1bGUgLT4gTm9uZSIpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBwYXJlbnQgYW5kIHBhcmVudC5fX3BhdGhfXyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5tc2dvdXQoMywgImltcG9ydF9tb2R1bGUgLT4gTm9uZSIpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcCwgcGF0aG5hbWUsIHN0dWZmID0gc2VsZi5maW5kX21vZHVsZShwYXJ0bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCBhbmQgcGFyZW50Ll9fcGF0aF9fLCBwYXJlbnQpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHNlbGYubXNnb3V0KDMsICJpbXBvcnRfbW9kdWxlIC0+IiwgTm9uZSkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG0gPSBzZWxmLmxvYWRfbW9kdWxlKGZxbmFtZSwgZnAsIHBhdGhuYW1lLCBzdHVmZikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGZwOiBmcC5jbG9zZSgpCisgICAgICAgIGlmIHBhcmVudDoKKyAgICAgICAgICAgIHNldGF0dHIocGFyZW50LCBwYXJ0bmFtZSwgbSkKKyAgICAgICAgc2VsZi5tc2dvdXQoMywgImltcG9ydF9tb2R1bGUgLT4iLCBtKQorICAgICAgICByZXR1cm4gbQorCisgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZxbmFtZSwgZnAsIHBhdGhuYW1lLCBmaWxlX2luZm8pOgorICAgICAgICBzdWZmaXgsIG1vZGUsIHR5cGUgPSBmaWxlX2luZm8KKyAgICAgICAgc2VsZi5tc2dpbigyLCAibG9hZF9tb2R1bGUiLCBmcW5hbWUsIGZwIGFuZCAiZnAiLCBwYXRobmFtZSkKKyAgICAgICAgaWYgdHlwZSA9PSBpbXAuUEtHX0RJUkVDVE9SWToKKyAgICAgICAgICAgIG0gPSBzZWxmLmxvYWRfcGFja2FnZShmcW5hbWUsIHBhdGhuYW1lKQorICAgICAgICAgICAgc2VsZi5tc2dvdXQoMiwgImxvYWRfbW9kdWxlIC0+IiwgbSkKKyAgICAgICAgICAgIHJldHVybiBtCisgICAgICAgIGlmIHR5cGUgPT0gaW1wLlBZX1NPVVJDRToKKyAgICAgICAgICAgIGNvID0gY29tcGlsZShmcC5yZWFkKCkrJ1xuJywgcGF0aG5hbWUsICdleGVjJykKKyAgICAgICAgZWxpZiB0eXBlID09IGltcC5QWV9DT01QSUxFRDoKKyAgICAgICAgICAgIGlmIGZwLnJlYWQoNCkgIT0gaW1wLmdldF9tYWdpYygpOgorICAgICAgICAgICAgICAgIHNlbGYubXNnb3V0KDIsICJyYWlzZSBJbXBvcnRFcnJvcjogQmFkIG1hZ2ljIG51bWJlciIsIHBhdGhuYW1lKQorICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiQmFkIG1hZ2ljIG51bWJlciBpbiAlcyIgJSBwYXRobmFtZQorICAgICAgICAgICAgZnAucmVhZCg0KQorICAgICAgICAgICAgY28gPSBtYXJzaGFsLmxvYWQoZnApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbyA9IE5vbmUKKyAgICAgICAgbSA9IHNlbGYuYWRkX21vZHVsZShmcW5hbWUpCisgICAgICAgIG0uX19maWxlX18gPSBwYXRobmFtZQorICAgICAgICBpZiBjbzoKKyAgICAgICAgICAgIGlmIHNlbGYucmVwbGFjZV9wYXRoczoKKyAgICAgICAgICAgICAgICBjbyA9IHNlbGYucmVwbGFjZV9wYXRoc19pbl9jb2RlKGNvKQorICAgICAgICAgICAgbS5fX2NvZGVfXyA9IGNvCisgICAgICAgICAgICBzZWxmLnNjYW5fY29kZShjbywgbSkKKyAgICAgICAgc2VsZi5tc2dvdXQoMiwgImxvYWRfbW9kdWxlIC0+IiwgbSkKKyAgICAgICAgcmV0dXJuIG0KKworICAgIGRlZiBfYWRkX2JhZG1vZHVsZShzZWxmLCBuYW1lLCBjYWxsZXIpOgorICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLmJhZG1vZHVsZXM6CisgICAgICAgICAgICBzZWxmLmJhZG1vZHVsZXNbbmFtZV0gPSB7fQorICAgICAgICBpZiBjYWxsZXI6CisgICAgICAgICAgICBzZWxmLmJhZG1vZHVsZXNbbmFtZV1bY2FsbGVyLl9fbmFtZV9fXSA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYmFkbW9kdWxlc1tuYW1lXVsiLSJdID0gMQorCisgICAgZGVmIF9zYWZlX2ltcG9ydF9ob29rKHNlbGYsIG5hbWUsIGNhbGxlciwgZnJvbWxpc3QsIGxldmVsPS0xKToKKyAgICAgICAgIyB3cmFwcGVyIGZvciBzZWxmLmltcG9ydF9ob29rKCkgdGhhdCB3b24ndCByYWlzZSBJbXBvcnRFcnJvcgorICAgICAgICBpZiBuYW1lIGluIHNlbGYuYmFkbW9kdWxlczoKKyAgICAgICAgICAgIHNlbGYuX2FkZF9iYWRtb2R1bGUobmFtZSwgY2FsbGVyKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuaW1wb3J0X2hvb2sobmFtZSwgY2FsbGVyLCBsZXZlbD1sZXZlbCkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBtc2c6CisgICAgICAgICAgICBzZWxmLm1zZygyLCAiSW1wb3J0RXJyb3I6Iiwgc3RyKG1zZykpCisgICAgICAgICAgICBzZWxmLl9hZGRfYmFkbW9kdWxlKG5hbWUsIGNhbGxlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGZyb21saXN0OgorICAgICAgICAgICAgICAgIGZvciBzdWIgaW4gZnJvbWxpc3Q6CisgICAgICAgICAgICAgICAgICAgIGlmIHN1YiBpbiBzZWxmLmJhZG1vZHVsZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9hZGRfYmFkbW9kdWxlKHN1YiwgY2FsbGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbXBvcnRfaG9vayhuYW1lLCBjYWxsZXIsIFtzdWJdLCBsZXZlbD1sZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1zZygyLCAiSW1wb3J0RXJyb3I6Iiwgc3RyKG1zZykpCisgICAgICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IG5hbWUgKyAiLiIgKyBzdWIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2FkZF9iYWRtb2R1bGUoZnVsbG5hbWUsIGNhbGxlcikKKworICAgIGRlZiBzY2FuX29wY29kZXMoc2VsZiwgY28sCisgICAgICAgICAgICAgICAgICAgICB1bnBhY2sgPSBzdHJ1Y3QudW5wYWNrKToKKyAgICAgICAgIyBTY2FuIHRoZSBjb2RlLCBhbmQgeWllbGQgJ2ludGVyZXN0aW5nJyBvcGNvZGUgY29tYmluYXRpb25zCisgICAgICAgICMgVmVyc2lvbiBmb3IgUHl0aG9uIDIuNCBhbmQgb2xkZXIKKyAgICAgICAgY29kZSA9IGNvLmNvX2NvZGUKKyAgICAgICAgbmFtZXMgPSBjby5jb19uYW1lcworICAgICAgICBjb25zdHMgPSBjby5jb19jb25zdHMKKyAgICAgICAgd2hpbGUgY29kZToKKyAgICAgICAgICAgIGMgPSBjb2RlWzBdCisgICAgICAgICAgICBpZiBjIGluIFNUT1JFX09QUzoKKyAgICAgICAgICAgICAgICBvcGFyZywgPSB1bnBhY2soJzxIJywgY29kZVsxOjNdKQorICAgICAgICAgICAgICAgIHlpZWxkICJzdG9yZSIsIChuYW1lc1tvcGFyZ10sKQorICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlWzM6XQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBjID09IExPQURfQ09OU1QgYW5kIGNvZGVbM10gPT0gSU1QT1JUX05BTUU6CisgICAgICAgICAgICAgICAgb3BhcmdfMSwgb3BhcmdfMiA9IHVucGFjaygnPHhIeEgnLCBjb2RlWzo2XSkKKyAgICAgICAgICAgICAgICB5aWVsZCAiaW1wb3J0IiwgKGNvbnN0c1tvcGFyZ18xXSwgbmFtZXNbb3BhcmdfMl0pCisgICAgICAgICAgICAgICAgY29kZSA9IGNvZGVbNjpdCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGMgPj0gSEFWRV9BUkdVTUVOVDoKKyAgICAgICAgICAgICAgICBjb2RlID0gY29kZVszOl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29kZSA9IGNvZGVbMTpdCisKKyAgICBkZWYgc2Nhbl9vcGNvZGVzXzI1KHNlbGYsIGNvLAorICAgICAgICAgICAgICAgICAgICAgdW5wYWNrID0gc3RydWN0LnVucGFjayk6CisgICAgICAgICMgU2NhbiB0aGUgY29kZSwgYW5kIHlpZWxkICdpbnRlcmVzdGluZycgb3Bjb2RlIGNvbWJpbmF0aW9ucworICAgICAgICAjIFB5dGhvbiAyLjUgdmVyc2lvbiAoaGFzIGFic29sdXRlIGFuZCByZWxhdGl2ZSBpbXBvcnRzKQorICAgICAgICBjb2RlID0gY28uY29fY29kZQorICAgICAgICBuYW1lcyA9IGNvLmNvX25hbWVzCisgICAgICAgIGNvbnN0cyA9IGNvLmNvX2NvbnN0cworICAgICAgICBMT0FEX0xPQURfQU5EX0lNUE9SVCA9IExPQURfQ09OU1QgKyBMT0FEX0NPTlNUICsgSU1QT1JUX05BTUUKKyAgICAgICAgd2hpbGUgY29kZToKKyAgICAgICAgICAgIGMgPSBjb2RlWzBdCisgICAgICAgICAgICBpZiBjIGluIFNUT1JFX09QUzoKKyAgICAgICAgICAgICAgICBvcGFyZywgPSB1bnBhY2soJzxIJywgY29kZVsxOjNdKQorICAgICAgICAgICAgICAgIHlpZWxkICJzdG9yZSIsIChuYW1lc1tvcGFyZ10sKQorICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlWzM6XQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBjb2RlWzo5OjNdID09IExPQURfTE9BRF9BTkRfSU1QT1JUOgorICAgICAgICAgICAgICAgIG9wYXJnXzEsIG9wYXJnXzIsIG9wYXJnXzMgPSB1bnBhY2soJzx4SHhIeEgnLCBjb2RlWzo5XSkKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGNvbnN0c1tvcGFyZ18xXQorICAgICAgICAgICAgICAgIGlmIGxldmVsID09IC0xOiAjIG5vcm1hbCBpbXBvcnQKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgImltcG9ydCIsIChjb25zdHNbb3BhcmdfMl0sIG5hbWVzW29wYXJnXzNdKQorICAgICAgICAgICAgICAgIGVsaWYgbGV2ZWwgPT0gMDogIyBhYnNvbHV0ZSBpbXBvcnQKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgImFic29sdXRlX2ltcG9ydCIsIChjb25zdHNbb3BhcmdfMl0sIG5hbWVzW29wYXJnXzNdKQorICAgICAgICAgICAgICAgIGVsc2U6ICMgcmVsYXRpdmUgaW1wb3J0CisgICAgICAgICAgICAgICAgICAgIHlpZWxkICJyZWxhdGl2ZV9pbXBvcnQiLCAobGV2ZWwsIGNvbnN0c1tvcGFyZ18yXSwgbmFtZXNbb3BhcmdfM10pCisgICAgICAgICAgICAgICAgY29kZSA9IGNvZGVbOTpdCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGMgPj0gSEFWRV9BUkdVTUVOVDoKKyAgICAgICAgICAgICAgICBjb2RlID0gY29kZVszOl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29kZSA9IGNvZGVbMTpdCisKKyAgICBkZWYgc2Nhbl9jb2RlKHNlbGYsIGNvLCBtKToKKyAgICAgICAgY29kZSA9IGNvLmNvX2NvZGUKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMiwgNSk6CisgICAgICAgICAgICBzY2FubmVyID0gc2VsZi5zY2FuX29wY29kZXNfMjUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNjYW5uZXIgPSBzZWxmLnNjYW5fb3Bjb2RlcworICAgICAgICBmb3Igd2hhdCwgYXJncyBpbiBzY2FubmVyKGNvKToKKyAgICAgICAgICAgIGlmIHdoYXQgPT0gInN0b3JlIjoKKyAgICAgICAgICAgICAgICBuYW1lLCA9IGFyZ3MKKyAgICAgICAgICAgICAgICBtLmdsb2JhbG5hbWVzW25hbWVdID0gMQorICAgICAgICAgICAgZWxpZiB3aGF0IGluICgiaW1wb3J0IiwgImFic29sdXRlX2ltcG9ydCIpOgorICAgICAgICAgICAgICAgIGZyb21saXN0LCBuYW1lID0gYXJncworICAgICAgICAgICAgICAgIGhhdmVfc3RhciA9IDAKKyAgICAgICAgICAgICAgICBpZiBmcm9tbGlzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgIioiIGluIGZyb21saXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZV9zdGFyID0gMQorICAgICAgICAgICAgICAgICAgICBmcm9tbGlzdCA9IFtmIGZvciBmIGluIGZyb21saXN0IGlmIGYgIT0gIioiXQorICAgICAgICAgICAgICAgIGlmIHdoYXQgPT0gImFic29sdXRlX2ltcG9ydCI6IGxldmVsID0gMAorICAgICAgICAgICAgICAgIGVsc2U6IGxldmVsID0gLTEKKyAgICAgICAgICAgICAgICBzZWxmLl9zYWZlX2ltcG9ydF9ob29rKG5hbWUsIG0sIGZyb21saXN0LCBsZXZlbD1sZXZlbCkKKyAgICAgICAgICAgICAgICBpZiBoYXZlX3N0YXI6CisgICAgICAgICAgICAgICAgICAgICMgV2UndmUgZW5jb3VudGVyZWQgYW4gImltcG9ydCAqIi4gSWYgaXQgaXMgYSBQeXRob24gbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAjIHRoZSBjb2RlIGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkIGFuZCB3ZSBjYW4gc3VjayBvdXQgdGhlCisgICAgICAgICAgICAgICAgICAgICMgZ2xvYmFsIG5hbWVzLgorICAgICAgICAgICAgICAgICAgICBtbSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgbS5fX3BhdGhfXzoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQXQgdGhpcyBwb2ludCB3ZSBkb24ndCBrbm93IHdoZXRoZXIgJ25hbWUnIGlzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3VibW9kdWxlIG9mICdtJyBvciBhIGdsb2JhbCBtb2R1bGUuIExldCdzIGp1c3QgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBmdWxsIG5hbWUgZmlyc3QuCisgICAgICAgICAgICAgICAgICAgICAgICBtbSA9IHNlbGYubW9kdWxlcy5nZXQobS5fX25hbWVfXyArICIuIiArIG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGlmIG1tIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBtbSA9IHNlbGYubW9kdWxlcy5nZXQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBtLmdsb2JhbG5hbWVzLnVwZGF0ZShtbS5nbG9iYWxuYW1lcykKKyAgICAgICAgICAgICAgICAgICAgICAgIG0uc3RhcmltcG9ydHMudXBkYXRlKG1tLnN0YXJpbXBvcnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbW0uX19jb2RlX18gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnN0YXJpbXBvcnRzW25hbWVdID0gMQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbS5zdGFyaW1wb3J0c1tuYW1lXSA9IDEKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAicmVsYXRpdmVfaW1wb3J0IjoKKyAgICAgICAgICAgICAgICBsZXZlbCwgZnJvbWxpc3QsIG5hbWUgPSBhcmdzCisgICAgICAgICAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2FmZV9pbXBvcnRfaG9vayhuYW1lLCBtLCBmcm9tbGlzdCwgbGV2ZWw9bGV2ZWwpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5kZXRlcm1pbmVfcGFyZW50KG0sIGxldmVsPWxldmVsKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zYWZlX2ltcG9ydF9ob29rKHBhcmVudC5fX25hbWVfXywgTm9uZSwgZnJvbWxpc3QsIGxldmVsPTApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgV2UgZG9uJ3QgZXhwZWN0IGFueXRoaW5nIGVsc2UgZnJvbSB0aGUgZ2VuZXJhdG9yLgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcih3aGF0KQorCisgICAgICAgIGZvciBjIGluIGNvLmNvX2NvbnN0czoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYywgdHlwZShjbykpOgorICAgICAgICAgICAgICAgIHNlbGYuc2Nhbl9jb2RlKGMsIG0pCisKKyAgICBkZWYgbG9hZF9wYWNrYWdlKHNlbGYsIGZxbmFtZSwgcGF0aG5hbWUpOgorICAgICAgICBzZWxmLm1zZ2luKDIsICJsb2FkX3BhY2thZ2UiLCBmcW5hbWUsIHBhdGhuYW1lKQorICAgICAgICBuZXduYW1lID0gcmVwbGFjZVBhY2thZ2VNYXAuZ2V0KGZxbmFtZSkKKyAgICAgICAgaWYgbmV3bmFtZToKKyAgICAgICAgICAgIGZxbmFtZSA9IG5ld25hbWUKKyAgICAgICAgbSA9IHNlbGYuYWRkX21vZHVsZShmcW5hbWUpCisgICAgICAgIG0uX19maWxlX18gPSBwYXRobmFtZQorICAgICAgICBtLl9fcGF0aF9fID0gW3BhdGhuYW1lXQorCisgICAgICAgICMgQXMgcGVyIGNvbW1lbnQgYXQgdG9wIG9mIGZpbGUsIHNpbXVsYXRlIHJ1bnRpbWUgX19wYXRoX18gYWRkaXRpb25zLgorICAgICAgICBtLl9fcGF0aF9fID0gbS5fX3BhdGhfXyArIHBhY2thZ2VQYXRoTWFwLmdldChmcW5hbWUsIFtdKQorCisgICAgICAgIGZwLCBidWYsIHN0dWZmID0gc2VsZi5maW5kX21vZHVsZSgiX19pbml0X18iLCBtLl9fcGF0aF9fKQorICAgICAgICBzZWxmLmxvYWRfbW9kdWxlKGZxbmFtZSwgZnAsIGJ1Ziwgc3R1ZmYpCisgICAgICAgIHNlbGYubXNnb3V0KDIsICJsb2FkX3BhY2thZ2UgLT4iLCBtKQorICAgICAgICByZXR1cm4gbQorCisgICAgZGVmIGFkZF9tb2R1bGUoc2VsZiwgZnFuYW1lKToKKyAgICAgICAgaWYgZnFuYW1lIGluIHNlbGYubW9kdWxlczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm1vZHVsZXNbZnFuYW1lXQorICAgICAgICBzZWxmLm1vZHVsZXNbZnFuYW1lXSA9IG0gPSBNb2R1bGUoZnFuYW1lKQorICAgICAgICByZXR1cm4gbQorCisgICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIG5hbWUsIHBhdGgsIHBhcmVudD1Ob25lKToKKyAgICAgICAgaWYgcGFyZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBhc3NlcnQgcGF0aCBpcyBub3QgTm9uZQorICAgICAgICAgICAgZnVsbG5hbWUgPSBwYXJlbnQuX19uYW1lX18rJy4nK25hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gbmFtZQorICAgICAgICBpZiBmdWxsbmFtZSBpbiBzZWxmLmV4Y2x1ZGVzOgorICAgICAgICAgICAgc2VsZi5tc2dvdXQoMywgImZpbmRfbW9kdWxlIC0+IEV4Y2x1ZGVkIiwgZnVsbG5hbWUpCisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgbmFtZQorCisgICAgICAgIGlmIHBhdGggaXMgTm9uZToKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgorICAgICAgICAgICAgICAgIHJldHVybiAoTm9uZSwgTm9uZSwgKCIiLCAiIiwgaW1wLkNfQlVJTFRJTikpCisKKyAgICAgICAgICAgIHBhdGggPSBzZWxmLnBhdGgKKyAgICAgICAgcmV0dXJuIGltcC5maW5kX21vZHVsZShuYW1lLCBwYXRoKQorCisgICAgZGVmIHJlcG9ydChzZWxmKToKKyAgICAgICAgIiIiUHJpbnQgYSByZXBvcnQgdG8gc3Rkb3V0LCBsaXN0aW5nIHRoZSBmb3VuZCBtb2R1bGVzIHdpdGggdGhlaXIKKyAgICAgICAgcGF0aHMsIGFzIHdlbGwgYXMgbW9kdWxlcyB0aGF0IGFyZSBtaXNzaW5nLCBvciBzZWVtIHRvIGJlIG1pc3NpbmcuCisgICAgICAgICIiIgorICAgICAgICBwcmludAorICAgICAgICBwcmludCAiICAlLTI1cyAlcyIgJSAoIk5hbWUiLCAiRmlsZSIpCisgICAgICAgIHByaW50ICIgICUtMjVzICVzIiAlICgiLS0tLSIsICItLS0tIikKKyAgICAgICAgIyBQcmludCBtb2R1bGVzIGZvdW5kCisgICAgICAgIGtleXMgPSBzZWxmLm1vZHVsZXMua2V5cygpCisgICAgICAgIGtleXMuc29ydCgpCisgICAgICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgICAgICAgIG0gPSBzZWxmLm1vZHVsZXNba2V5XQorICAgICAgICAgICAgaWYgbS5fX3BhdGhfXzoKKyAgICAgICAgICAgICAgICBwcmludCAiUCIsCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICJtIiwKKyAgICAgICAgICAgIHByaW50ICIlLTI1cyIgJSBrZXksIG0uX19maWxlX18gb3IgIiIKKworICAgICAgICAjIFByaW50IG1pc3NpbmcgbW9kdWxlcworICAgICAgICBtaXNzaW5nLCBtYXliZSA9IHNlbGYuYW55X21pc3NpbmdfbWF5YmUoKQorICAgICAgICBpZiBtaXNzaW5nOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICJNaXNzaW5nIG1vZHVsZXM6IgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gbWlzc2luZzoKKyAgICAgICAgICAgICAgICBtb2RzID0gc2VsZi5iYWRtb2R1bGVzW25hbWVdLmtleXMoKQorICAgICAgICAgICAgICAgIG1vZHMuc29ydCgpCisgICAgICAgICAgICAgICAgcHJpbnQgIj8iLCBuYW1lLCAiaW1wb3J0ZWQgZnJvbSIsICcsICcuam9pbihtb2RzKQorICAgICAgICAjIFByaW50IG1vZHVsZXMgdGhhdCBtYXkgYmUgbWlzc2luZywgYnV0IHRoZW4gYWdhaW4sIG1heWJlIG5vdC4uLgorICAgICAgICBpZiBtYXliZToKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAiU3VibW9kdWxlcyB0aGF5IGFwcGVhciB0byBiZSBtaXNzaW5nLCBidXQgY291bGQgYWxzbyBiZSIsCisgICAgICAgICAgICBwcmludCAiZ2xvYmFsIG5hbWVzIGluIHRoZSBwYXJlbnQgcGFja2FnZToiCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBtYXliZToKKyAgICAgICAgICAgICAgICBtb2RzID0gc2VsZi5iYWRtb2R1bGVzW25hbWVdLmtleXMoKQorICAgICAgICAgICAgICAgIG1vZHMuc29ydCgpCisgICAgICAgICAgICAgICAgcHJpbnQgIj8iLCBuYW1lLCAiaW1wb3J0ZWQgZnJvbSIsICcsICcuam9pbihtb2RzKQorCisgICAgZGVmIGFueV9taXNzaW5nKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIG1vZHVsZXMgdGhhdCBhcHBlYXIgdG8gYmUgbWlzc2luZy4gVXNlCisgICAgICAgIGFueV9taXNzaW5nX21heWJlKCkgaWYgeW91IHdhbnQgdG8ga25vdyB3aGljaCBtb2R1bGVzIGFyZQorICAgICAgICBjZXJ0YWluIHRvIGJlIG1pc3NpbmcsIGFuZCB3aGljaCAqbWF5KiBiZSBtaXNzaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgbWlzc2luZywgbWF5YmUgPSBzZWxmLmFueV9taXNzaW5nX21heWJlKCkKKyAgICAgICAgcmV0dXJuIG1pc3NpbmcgKyBtYXliZQorCisgICAgZGVmIGFueV9taXNzaW5nX21heWJlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdHdvIGxpc3RzLCBvbmUgd2l0aCBtb2R1bGVzIHRoYXQgYXJlIGNlcnRhaW5seSBtaXNzaW5nCisgICAgICAgIGFuZCBvbmUgd2l0aCBtb2R1bGVzIHRoYXQgKm1heSogYmUgbWlzc2luZy4gVGhlIGxhdHRlciBuYW1lcyBjb3VsZAorICAgICAgICBlaXRoZXIgYmUgc3VibW9kdWxlcyAqb3IqIGp1c3QgZ2xvYmFsIG5hbWVzIGluIHRoZSBwYWNrYWdlLgorCisgICAgICAgIFRoZSByZWFzb24gaXQgY2FuJ3QgYWx3YXlzIGJlIGRldGVybWluZWQgaXMgdGhhdCBpdCdzIGltcG9zc2libGUgdG8KKyAgICAgICAgdGVsbCB3aGljaCBuYW1lcyBhcmUgaW1wb3J0ZWQgd2hlbiAiZnJvbSBtb2R1bGUgaW1wb3J0ICoiIGlzIGRvbmUKKyAgICAgICAgd2l0aCBhbiBleHRlbnNpb24gbW9kdWxlLCBzaG9ydCBvZiBhY3R1YWxseSBpbXBvcnRpbmcgaXQuCisgICAgICAgICIiIgorICAgICAgICBtaXNzaW5nID0gW10KKyAgICAgICAgbWF5YmUgPSBbXQorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmJhZG1vZHVsZXM6CisgICAgICAgICAgICBpZiBuYW1lIGluIHNlbGYuZXhjbHVkZXM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGkgPSBuYW1lLnJmaW5kKCIuIikKKyAgICAgICAgICAgIGlmIGkgPCAwOgorICAgICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHN1Ym5hbWUgPSBuYW1lW2krMTpdCisgICAgICAgICAgICBwa2duYW1lID0gbmFtZVs6aV0KKyAgICAgICAgICAgIHBrZyA9IHNlbGYubW9kdWxlcy5nZXQocGtnbmFtZSkKKyAgICAgICAgICAgIGlmIHBrZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBwa2duYW1lIGluIHNlbGYuYmFkbW9kdWxlc1tuYW1lXToKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgcGFja2FnZSB0cmllZCB0byBpbXBvcnQgdGhpcyBtb2R1bGUgaXRzZWxmIGFuZAorICAgICAgICAgICAgICAgICAgICAjIGZhaWxlZC4gSXQncyBkZWZpbml0ZWx5IG1pc3NpbmcuCisgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICAgICAgZWxpZiBzdWJuYW1lIGluIHBrZy5nbG9iYWxuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgIyBJdCdzIGEgZ2xvYmFsIGluIHRoZSBwYWNrYWdlOiBkZWZpbml0ZWx5IG5vdCBtaXNzaW5nLgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxpZiBwa2cuc3RhcmltcG9ydHM6CisgICAgICAgICAgICAgICAgICAgICMgSXQgY291bGQgYmUgbWlzc2luZywgYnV0IHRoZSBwYWNrYWdlIGRpZCBhbiAiaW1wb3J0ICoiCisgICAgICAgICAgICAgICAgICAgICMgZnJvbSBhIG5vbi1QeXRob24gbW9kdWxlLCBzbyB3ZSBzaW1wbHkgY2FuJ3QgYmUgc3VyZS4KKyAgICAgICAgICAgICAgICAgICAgbWF5YmUuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBJdCdzIG5vdCBhIGdsb2JhbCBpbiB0aGUgcGFja2FnZSwgdGhlIHBhY2thZ2UgZGlkbid0CisgICAgICAgICAgICAgICAgICAgICMgZG8gZnVubnkgc3RhciBpbXBvcnRzLCBpdCdzIHZlcnkgbGlrZWx5IHRvIGJlIG1pc3NpbmcuCisgICAgICAgICAgICAgICAgICAgICMgVGhlIHN5bWJvbCBjb3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBwYWNrYWdlIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgICMgb3V0c2lkZSwgYnV0IHNpbmNlIHRoYXQncyBub3QgZ29vZCBzdHlsZSB3ZSBzaW1wbHkgbGlzdAorICAgICAgICAgICAgICAgICAgICAjIGl0IG1pc3NpbmcuCisgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKG5hbWUpCisgICAgICAgIG1pc3Npbmcuc29ydCgpCisgICAgICAgIG1heWJlLnNvcnQoKQorICAgICAgICByZXR1cm4gbWlzc2luZywgbWF5YmUKKworICAgIGRlZiByZXBsYWNlX3BhdGhzX2luX2NvZGUoc2VsZiwgY28pOgorICAgICAgICBuZXdfZmlsZW5hbWUgPSBvcmlnaW5hbF9maWxlbmFtZSA9IG9zLnBhdGgubm9ybXBhdGgoY28uY29fZmlsZW5hbWUpCisgICAgICAgIGZvciBmLCByIGluIHNlbGYucmVwbGFjZV9wYXRoczoKKyAgICAgICAgICAgIGlmIG9yaWdpbmFsX2ZpbGVuYW1lLnN0YXJ0c3dpdGgoZik6CisgICAgICAgICAgICAgICAgbmV3X2ZpbGVuYW1lID0gciArIG9yaWdpbmFsX2ZpbGVuYW1lW2xlbihmKTpdCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBzZWxmLmRlYnVnIGFuZCBvcmlnaW5hbF9maWxlbmFtZSBub3QgaW4gc2VsZi5wcm9jZXNzZWRfcGF0aHM6CisgICAgICAgICAgICBpZiBuZXdfZmlsZW5hbWUgIT0gb3JpZ2luYWxfZmlsZW5hbWU6CisgICAgICAgICAgICAgICAgc2VsZi5tc2dvdXQoMiwgImNvX2ZpbGVuYW1lICVyIGNoYW5nZWQgdG8gJXIiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKG9yaWdpbmFsX2ZpbGVuYW1lLG5ld19maWxlbmFtZSwpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLm1zZ291dCgyLCAiY29fZmlsZW5hbWUgJXIgcmVtYWlucyB1bmNoYW5nZWQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKG9yaWdpbmFsX2ZpbGVuYW1lLCkpCisgICAgICAgICAgICBzZWxmLnByb2Nlc3NlZF9wYXRocy5hcHBlbmQob3JpZ2luYWxfZmlsZW5hbWUpCisKKyAgICAgICAgY29uc3RzID0gbGlzdChjby5jb19jb25zdHMpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihjb25zdHMpKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY29uc3RzW2ldLCB0eXBlKGNvKSk6CisgICAgICAgICAgICAgICAgY29uc3RzW2ldID0gc2VsZi5yZXBsYWNlX3BhdGhzX2luX2NvZGUoY29uc3RzW2ldKQorCisgICAgICAgIHJldHVybiB0eXBlcy5Db2RlVHlwZShjby5jb19hcmdjb3VudCwgY28uY29fbmxvY2FscywgY28uY29fc3RhY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvLmNvX2ZsYWdzLCBjby5jb19jb2RlLCB0dXBsZShjb25zdHMpLCBjby5jb19uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjby5jb192YXJuYW1lcywgbmV3X2ZpbGVuYW1lLCBjby5jb19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvLmNvX2ZpcnN0bGluZW5vLCBjby5jb19sbm90YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY28uY29fZnJlZXZhcnMsIGNvLmNvX2NlbGx2YXJzKQorCisKK2RlZiB0ZXN0KCk6CisgICAgIyBQYXJzZSBjb21tYW5kIGxpbmUKKyAgICBpbXBvcnQgZ2V0b3B0CisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJkbXA6cXg6IikKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgIHByaW50IG1zZworICAgICAgICByZXR1cm4KKworICAgICMgUHJvY2VzcyBvcHRpb25zCisgICAgZGVidWcgPSAxCisgICAgZG9tb2RzID0gMAorICAgIGFkZHBhdGggPSBbXQorICAgIGV4Y2x1ZGUgPSBbXQorICAgIGZvciBvLCBhIGluIG9wdHM6CisgICAgICAgIGlmIG8gPT0gJy1kJzoKKyAgICAgICAgICAgIGRlYnVnID0gZGVidWcgKyAxCisgICAgICAgIGlmIG8gPT0gJy1tJzoKKyAgICAgICAgICAgIGRvbW9kcyA9IDEKKyAgICAgICAgaWYgbyA9PSAnLXAnOgorICAgICAgICAgICAgYWRkcGF0aCA9IGFkZHBhdGggKyBhLnNwbGl0KG9zLnBhdGhzZXApCisgICAgICAgIGlmIG8gPT0gJy1xJzoKKyAgICAgICAgICAgIGRlYnVnID0gMAorICAgICAgICBpZiBvID09ICcteCc6CisgICAgICAgICAgICBleGNsdWRlLmFwcGVuZChhKQorCisgICAgIyBQcm92aWRlIGRlZmF1bHQgYXJndW1lbnRzCisgICAgaWYgbm90IGFyZ3M6CisgICAgICAgIHNjcmlwdCA9ICJoZWxsby5weSIKKyAgICBlbHNlOgorICAgICAgICBzY3JpcHQgPSBhcmdzWzBdCisKKyAgICAjIFNldCB0aGUgcGF0aCBiYXNlZCBvbiBzeXMucGF0aCBhbmQgdGhlIHNjcmlwdCBkaXJlY3RvcnkKKyAgICBwYXRoID0gc3lzLnBhdGhbOl0KKyAgICBwYXRoWzBdID0gb3MucGF0aC5kaXJuYW1lKHNjcmlwdCkKKyAgICBwYXRoID0gYWRkcGF0aCArIHBhdGgKKyAgICBpZiBkZWJ1ZyA+IDE6CisgICAgICAgIHByaW50ICJwYXRoOiIKKyAgICAgICAgZm9yIGl0ZW0gaW4gcGF0aDoKKyAgICAgICAgICAgIHByaW50ICIgICAiLCByZXByKGl0ZW0pCisKKyAgICAjIENyZWF0ZSB0aGUgbW9kdWxlIGZpbmRlciBhbmQgdHVybiBpdHMgY3JhbmsKKyAgICBtZiA9IE1vZHVsZUZpbmRlcihwYXRoLCBkZWJ1ZywgZXhjbHVkZSkKKyAgICBmb3IgYXJnIGluIGFyZ3NbMTpdOgorICAgICAgICBpZiBhcmcgPT0gJy1tJzoKKyAgICAgICAgICAgIGRvbW9kcyA9IDEKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGRvbW9kczoKKyAgICAgICAgICAgIGlmIGFyZ1stMjpdID09ICcuKic6CisgICAgICAgICAgICAgICAgbWYuaW1wb3J0X2hvb2soYXJnWzotMl0sIE5vbmUsIFsiKiJdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtZi5pbXBvcnRfaG9vayhhcmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtZi5sb2FkX2ZpbGUoYXJnKQorICAgIG1mLnJ1bl9zY3JpcHQoc2NyaXB0KQorICAgIG1mLnJlcG9ydCgpCisgICAgcmV0dXJuIG1mICAjIGZvciAtaSBkZWJ1Z2dpbmcKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRyeToKKyAgICAgICAgbWYgPSB0ZXN0KCkKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHByaW50ICJcbltpbnRlcnJ1cHRdIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tb2R1bGVmaW5kZXIucHljIGIvbGliL3B5dGhvbjIuNy9tb2R1bGVmaW5kZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YTA2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21vZHVsZWZpbmRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tb2R1bGVmaW5kZXIucHlvIGIvbGliL3B5dGhvbjIuNy9tb2R1bGVmaW5kZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTViNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21vZHVsZWZpbmRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aWZpbGUucHkgYi9saWIvcHl0aG9uMi43L211bHRpZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWIwMjAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aWZpbGUucHkKQEAgLTAsMCArMSwxNjIgQEAKKyIiIkEgcmVhZGxpbmUoKS1zdHlsZSBpbnRlcmZhY2UgdG8gdGhlIHBhcnRzIG9mIGEgbXVsdGlwYXJ0IG1lc3NhZ2UuCisKK1RoZSBNdWx0aUZpbGUgY2xhc3MgbWFrZXMgZWFjaCBwYXJ0IG9mIGEgbXVsdGlwYXJ0IG1lc3NhZ2UgImZlZWwiIGxpa2UKK2FuIG9yZGluYXJ5IGZpbGUsIGFzIGxvbmcgYXMgeW91IHVzZSBmcC5yZWFkbGluZSgpLiAgQWxsb3dzIHJlY3Vyc2l2ZQordXNlLCBmb3IgbmVzdGVkIG11bHRpcGFydCBtZXNzYWdlcy4gIFByb2JhYmx5IGJlc3QgdXNlZCB0b2dldGhlcgord2l0aCBtb2R1bGUgbWltZXRvb2xzLgorCitTdWdnZXN0ZWQgdXNlOgorCityZWFsX2ZwID0gb3BlbiguLi4pCitmcCA9IE11bHRpRmlsZShyZWFsX2ZwKQorCisicmVhZCBzb21lIGxpbmVzIGZyb20gZnAiCitmcC5wdXNoKHNlcGFyYXRvcikKK3doaWxlIDE6CisgICAgICAgICJyZWFkIGxpbmVzIGZyb20gZnAgdW50aWwgaXQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmciIChBKQorICAgICAgICBpZiBub3QgZnAubmV4dCgpOiBicmVhaworZnAucG9wKCkKKyJyZWFkIHJlbWFpbmluZyBsaW5lcyBmcm9tIGZwIHVudGlsIGl0IHJldHVybnMgYW4gZW1wdHkgc3RyaW5nIgorCitUaGUgbGF0dGVyIHNlcXVlbmNlIG1heSBiZSB1c2VkIHJlY3Vyc2l2ZWx5IGF0IChBKS4KK0l0IGlzIGFsc28gYWxsb3dlZCB0byB1c2UgbXVsdGlwbGUgcHVzaCgpLi4ucG9wKCkgc2VxdWVuY2VzLgorCitJZiBzZWVrYWJsZSBpcyBnaXZlbiBhcyAwLCB0aGUgY2xhc3MgY29kZSB3aWxsIG5vdCBkbyB0aGUgYm9va2tlZXBpbmcKK2l0IG5vcm1hbGx5IGF0dGVtcHRzIGluIG9yZGVyIHRvIG1ha2Ugc2Vla3MgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKK2N1cnJlbnQgZmlsZSBwYXJ0LiAgVGhpcyBtYXkgYmUgdXNlZnVsIHdoZW4gdXNpbmcgTXVsdGlGaWxlIHdpdGggYSBub24tCitzZWVrYWJsZSBzdHJlYW0gb2JqZWN0LgorIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCit3YXJuKCJ0aGUgbXVsdGlmaWxlIG1vZHVsZSBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIFB5dGhvbiAyLjUiLAorICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKK2RlbCB3YXJuCisKK19fYWxsX18gPSBbIk11bHRpRmlsZSIsIkVycm9yIl0KKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2NsYXNzIE11bHRpRmlsZToKKworICAgIHNlZWthYmxlID0gMAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZwLCBzZWVrYWJsZT0xKToKKyAgICAgICAgc2VsZi5mcCA9IGZwCisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorICAgICAgICBzZWxmLmxldmVsID0gMAorICAgICAgICBzZWxmLmxhc3QgPSAwCisgICAgICAgIGlmIHNlZWthYmxlOgorICAgICAgICAgICAgc2VsZi5zZWVrYWJsZSA9IDEKKyAgICAgICAgICAgIHNlbGYuc3RhcnQgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICAgICAgc2VsZi5wb3NzdGFjayA9IFtdCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5sZXZlbCA+IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5sYXN0cG9zCisgICAgICAgIHJldHVybiBzZWxmLmZwLnRlbGwoKSAtIHNlbGYuc3RhcnQKKworICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlPTApOgorICAgICAgICBoZXJlID0gc2VsZi50ZWxsKCkKKyAgICAgICAgaWYgd2hlbmNlOgorICAgICAgICAgICAgaWYgd2hlbmNlID09IDE6CisgICAgICAgICAgICAgICAgcG9zID0gcG9zICsgaGVyZQorICAgICAgICAgICAgZWxpZiB3aGVuY2UgPT0gMjoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmxldmVsID4gMDoKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gcG9zICsgc2VsZi5sYXN0cG9zCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJjYW4ndCB1c2Ugd2hlbmNlPTIgeWV0IgorICAgICAgICBpZiBub3QgMCA8PSBwb3MgPD0gaGVyZSBvciBcCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxldmVsID4gMCBhbmQgcG9zID4gc2VsZi5sYXN0cG9zOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdiYWQgTXVsdGlGaWxlLnNlZWsoKSBjYWxsJworICAgICAgICBzZWxmLmZwLnNlZWsocG9zICsgc2VsZi5zdGFydCkKKyAgICAgICAgc2VsZi5sZXZlbCA9IDAKKyAgICAgICAgc2VsZi5sYXN0ID0gMAorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmxldmVsID4gMDoKKyAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICBsaW5lID0gc2VsZi5mcC5yZWFkbGluZSgpCisgICAgICAgICMgUmVhbCBFT0Y/CisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgc2VsZi5sZXZlbCA9IGxlbihzZWxmLnN0YWNrKQorICAgICAgICAgICAgc2VsZi5sYXN0ID0gKHNlbGYubGV2ZWwgPiAwKQorICAgICAgICAgICAgaWYgc2VsZi5sYXN0OgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnc3VkZGVuIEVPRiBpbiBNdWx0aUZpbGUucmVhZGxpbmUoKScKKyAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICBhc3NlcnQgc2VsZi5sZXZlbCA9PSAwCisgICAgICAgICMgRmFzdCBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyBqdXN0IGRhdGEKKyAgICAgICAgaWYgc2VsZi5pc19kYXRhKGxpbmUpOgorICAgICAgICAgICAgcmV0dXJuIGxpbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgSWdub3JlIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb24gbWFya2VyIGxpbmVzCisgICAgICAgICAgICBtYXJrZXIgPSBsaW5lLnJzdHJpcCgpCisgICAgICAgICMgTm8/ICBPSywgdHJ5IHRvIG1hdGNoIGEgYm91bmRhcnkuCisgICAgICAgICMgUmV0dXJuIHRoZSBsaW5lICh1bnN0cmlwcGVkKSBpZiB3ZSBkb24ndC4KKyAgICAgICAgZm9yIGksIHNlcCBpbiBlbnVtZXJhdGUocmV2ZXJzZWQoc2VsZi5zdGFjaykpOgorICAgICAgICAgICAgaWYgbWFya2VyID09IHNlbGYuc2VjdGlvbl9kaXZpZGVyKHNlcCk6CisgICAgICAgICAgICAgICAgc2VsZi5sYXN0ID0gMAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIG1hcmtlciA9PSBzZWxmLmVuZF9tYXJrZXIoc2VwKToKKyAgICAgICAgICAgICAgICBzZWxmLmxhc3QgPSAxCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBsaW5lCisgICAgICAgICMgV2Ugb25seSBnZXQgaGVyZSBpZiB3ZSBzZWUgYSBzZWN0aW9uIGRpdmlkZXIgb3IgRU9NIGxpbmUKKyAgICAgICAgaWYgc2VsZi5zZWVrYWJsZToKKyAgICAgICAgICAgIHNlbGYubGFzdHBvcyA9IHNlbGYudGVsbCgpIC0gbGVuKGxpbmUpCisgICAgICAgIHNlbGYubGV2ZWwgPSBpKzEKKyAgICAgICAgaWYgc2VsZi5sZXZlbCA+IDE6CisgICAgICAgICAgICByYWlzZSBFcnJvciwnTWlzc2luZyBlbmRtYXJrZXIgaW4gTXVsdGlGaWxlLnJlYWRsaW5lKCknCisgICAgICAgIHJldHVybiAnJworCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgbGlzdCA9IFtdCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgICAgIGxpc3QuYXBwZW5kKGxpbmUpCisgICAgICAgIHJldHVybiBsaXN0CisKKyAgICBkZWYgcmVhZChzZWxmKTogIyBOb3RlOiBubyBzaXplIGFyZ3VtZW50IC0tIHJlYWQgdW50aWwgRU9GIG9ubHkhCisgICAgICAgIHJldHVybiAnJy5qb2luKHNlbGYucmVhZGxpbmVzKCkpCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgd2hpbGUgc2VsZi5yZWFkbGluZSgpOiBwYXNzCisgICAgICAgIGlmIHNlbGYubGV2ZWwgPiAxIG9yIHNlbGYubGFzdDoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHNlbGYubGV2ZWwgPSAwCisgICAgICAgIHNlbGYubGFzdCA9IDAKKyAgICAgICAgaWYgc2VsZi5zZWVrYWJsZToKKyAgICAgICAgICAgIHNlbGYuc3RhcnQgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIHB1c2goc2VsZiwgc2VwKToKKyAgICAgICAgaWYgc2VsZi5sZXZlbCA+IDA6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2JhZCBNdWx0aUZpbGUucHVzaCgpIGNhbGwnCisgICAgICAgIHNlbGYuc3RhY2suYXBwZW5kKHNlcCkKKyAgICAgICAgaWYgc2VsZi5zZWVrYWJsZToKKyAgICAgICAgICAgIHNlbGYucG9zc3RhY2suYXBwZW5kKHNlbGYuc3RhcnQpCisgICAgICAgICAgICBzZWxmLnN0YXJ0ID0gc2VsZi5mcC50ZWxsKCkKKworICAgIGRlZiBwb3Aoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RhY2sgPT0gW106CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2JhZCBNdWx0aUZpbGUucG9wKCkgY2FsbCcKKyAgICAgICAgaWYgc2VsZi5sZXZlbCA8PSAxOgorICAgICAgICAgICAgc2VsZi5sYXN0ID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWJzbGFzdHBvcyA9IHNlbGYubGFzdHBvcyArIHNlbGYuc3RhcnQKKyAgICAgICAgc2VsZi5sZXZlbCA9IG1heCgwLCBzZWxmLmxldmVsIC0gMSkKKyAgICAgICAgc2VsZi5zdGFjay5wb3AoKQorICAgICAgICBpZiBzZWxmLnNlZWthYmxlOgorICAgICAgICAgICAgc2VsZi5zdGFydCA9IHNlbGYucG9zc3RhY2sucG9wKCkKKyAgICAgICAgICAgIGlmIHNlbGYubGV2ZWwgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYubGFzdHBvcyA9IGFic2xhc3Rwb3MgLSBzZWxmLnN0YXJ0CisKKyAgICBkZWYgaXNfZGF0YShzZWxmLCBsaW5lKToKKyAgICAgICAgcmV0dXJuIGxpbmVbOjJdICE9ICctLScKKworICAgIGRlZiBzZWN0aW9uX2RpdmlkZXIoc2VsZiwgc3RyKToKKyAgICAgICAgcmV0dXJuICItLSIgKyBzdHIKKworICAgIGRlZiBlbmRfbWFya2VyKHNlbGYsIHN0cik6CisgICAgICAgIHJldHVybiAiLS0iICsgc3RyICsgIi0tIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aWZpbGUucHljIGIvbGliL3B5dGhvbjIuNy9tdWx0aWZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwOWQyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aWZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy9tdWx0aWZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjgzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTkxZThlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvX19pbml0X18ucHkKQEAgLTAsMCArMSwyNzcgQEAKKyMKKyMgUGFja2FnZSBhbmFsb2dvdXMgdG8gJ3RocmVhZGluZy5weScgYnV0IHVzaW5nIHByb2Nlc3NlcworIworIyBtdWx0aXByb2Nlc3NpbmcvX19pbml0X18ucHkKKyMKKyMgVGhpcyBwYWNrYWdlIGlzIGludGVuZGVkIHRvIGR1cGxpY2F0ZSB0aGUgZnVuY3Rpb25hbGl0eSAoYW5kIG11Y2ggb2YKKyMgdGhlIEFQSSkgb2YgdGhyZWFkaW5nLnB5IGJ1dCB1c2VzIHByb2Nlc3NlcyBpbnN0ZWFkIG9mIHRocmVhZHMuICBBCisjIHN1YnBhY2thZ2UgJ211bHRpcHJvY2Vzc2luZy5kdW1teScgaGFzIHRoZSBzYW1lIEFQSSBidXQgaXMgYSBzaW1wbGUKKyMgd3JhcHBlciBmb3IgJ3RocmVhZGluZycuCisjCisjIFRyeSBjYWxsaW5nIGBtdWx0aXByb2Nlc3NpbmcuZG9jLm1haW4oKWAgdG8gcmVhZCB0aGUgaHRtbAorIyBkb2N1bWVudGF0aW9uIGluIGEgd2ViYnJvd3Nlci4KKyMKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDgsIFIgT3Vka2VyaworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlCisjICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKworX192ZXJzaW9uX18gPSAnMC43MGExJworCitfX2FsbF9fID0gWworICAgICdQcm9jZXNzJywgJ2N1cnJlbnRfcHJvY2VzcycsICdhY3RpdmVfY2hpbGRyZW4nLCAnZnJlZXplX3N1cHBvcnQnLAorICAgICdNYW5hZ2VyJywgJ1BpcGUnLCAnY3B1X2NvdW50JywgJ2xvZ190b19zdGRlcnInLCAnZ2V0X2xvZ2dlcicsCisgICAgJ2FsbG93X2Nvbm5lY3Rpb25fcGlja2xpbmcnLCAnQnVmZmVyVG9vU2hvcnQnLCAnVGltZW91dEVycm9yJywKKyAgICAnTG9jaycsICdSTG9jaycsICdTZW1hcGhvcmUnLCAnQm91bmRlZFNlbWFwaG9yZScsICdDb25kaXRpb24nLAorICAgICdFdmVudCcsICdRdWV1ZScsICdKb2luYWJsZVF1ZXVlJywgJ1Bvb2wnLCAnVmFsdWUnLCAnQXJyYXknLAorICAgICdSYXdWYWx1ZScsICdSYXdBcnJheScsICdTVUJERUJVRycsICdTVUJXQVJOSU5HJywKKyAgICBdCisKK19fYXV0aG9yX18gPSAnUi4gT3Vka2VyayAoci5tLm91ZGtlcmtAZ21haWwuY29tKScKKworIworIyBJbXBvcnRzCisjCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitmcm9tIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzIGltcG9ydCBQcm9jZXNzLCBjdXJyZW50X3Byb2Nlc3MsIGFjdGl2ZV9jaGlsZHJlbgorZnJvbSBtdWx0aXByb2Nlc3NpbmcudXRpbCBpbXBvcnQgU1VCREVCVUcsIFNVQldBUk5JTkcKKworIworIyBFeGNlcHRpb25zCisjCisKK2NsYXNzIFByb2Nlc3NFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgQnVmZmVyVG9vU2hvcnQoUHJvY2Vzc0Vycm9yKToKKyAgICBwYXNzCisKK2NsYXNzIFRpbWVvdXRFcnJvcihQcm9jZXNzRXJyb3IpOgorICAgIHBhc3MKKworY2xhc3MgQXV0aGVudGljYXRpb25FcnJvcihQcm9jZXNzRXJyb3IpOgorICAgIHBhc3MKKworIyBUaGlzIGlzIGRvd24gaGVyZSBiZWNhdXNlIF9tdWx0aXByb2Nlc3NpbmcgdXNlcyBCdWZmZXJUb29TaG9ydAoraW1wb3J0IF9tdWx0aXByb2Nlc3NpbmcKKworIworIyBEZWZpbml0aW9ucyBub3QgZGVwZW5kaW5nIG9uIG5hdGl2ZSBzZW1hcGhvcmVzCisjCisKK2RlZiBNYW5hZ2VyKCk6CisgICAgJycnCisgICAgUmV0dXJucyBhIG1hbmFnZXIgYXNzb2NpYXRlZCB3aXRoIGEgcnVubmluZyBzZXJ2ZXIgcHJvY2VzcworCisgICAgVGhlIG1hbmFnZXJzIG1ldGhvZHMgc3VjaCBhcyBgTG9jaygpYCwgYENvbmRpdGlvbigpYCBhbmQgYFF1ZXVlKClgCisgICAgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHNoYXJlZCBvYmplY3RzLgorICAgICcnJworICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzIGltcG9ydCBTeW5jTWFuYWdlcgorICAgIG0gPSBTeW5jTWFuYWdlcigpCisgICAgbS5zdGFydCgpCisgICAgcmV0dXJuIG0KKworZGVmIFBpcGUoZHVwbGV4PVRydWUpOgorICAgICcnJworICAgIFJldHVybnMgdHdvIGNvbm5lY3Rpb24gb2JqZWN0IGNvbm5lY3RlZCBieSBhIHBpcGUKKyAgICAnJycKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5jb25uZWN0aW9uIGltcG9ydCBQaXBlCisgICAgcmV0dXJuIFBpcGUoZHVwbGV4KQorCitkZWYgY3B1X2NvdW50KCk6CisgICAgJycnCisgICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbQorICAgICcnJworICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBudW0gPSBpbnQob3MuZW52aXJvblsnTlVNQkVSX09GX1BST0NFU1NPUlMnXSkKKyAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBLZXlFcnJvcik6CisgICAgICAgICAgICBudW0gPSAwCisgICAgZWxpZiAnYnNkJyBpbiBzeXMucGxhdGZvcm0gb3Igc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICBjb21tID0gJy9zYmluL3N5c2N0bCAtbiBody5uY3B1JworICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICBjb21tID0gJy91c3InICsgY29tbQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIG9zLnBvcGVuKGNvbW0pIGFzIHA6CisgICAgICAgICAgICAgICAgbnVtID0gaW50KHAucmVhZCgpKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIG51bSA9IDAKKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBudW0gPSBvcy5zeXNjb25mKCdTQ19OUFJPQ0VTU09SU19PTkxOJykKKyAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBPU0Vycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBudW0gPSAwCisKKyAgICBpZiBudW0gPj0gMToKKyAgICAgICAgcmV0dXJuIG51bQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ2Nhbm5vdCBkZXRlcm1pbmUgbnVtYmVyIG9mIGNwdXMnKQorCitkZWYgZnJlZXplX3N1cHBvcnQoKToKKyAgICAnJycKKyAgICBDaGVjayB3aGV0aGVyIHRoaXMgaXMgYSBmYWtlIGZvcmtlZCBwcm9jZXNzIGluIGEgZnJvemVuIGV4ZWN1dGFibGUuCisgICAgSWYgc28gdGhlbiBydW4gY29kZSBzcGVjaWZpZWQgYnkgY29tbWFuZGxpbmUgYW5kIGV4aXQuCisgICAgJycnCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMicgYW5kIGdldGF0dHIoc3lzLCAnZnJvemVuJywgRmFsc2UpOgorICAgICAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5mb3JraW5nIGltcG9ydCBmcmVlemVfc3VwcG9ydAorICAgICAgICBmcmVlemVfc3VwcG9ydCgpCisKK2RlZiBnZXRfbG9nZ2VyKCk6CisgICAgJycnCisgICAgUmV0dXJuIHBhY2thZ2UgbG9nZ2VyIC0tIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QgdGhlbiBpdCBpcyBjcmVhdGVkCisgICAgJycnCisgICAgZnJvbSBtdWx0aXByb2Nlc3NpbmcudXRpbCBpbXBvcnQgZ2V0X2xvZ2dlcgorICAgIHJldHVybiBnZXRfbG9nZ2VyKCkKKworZGVmIGxvZ190b19zdGRlcnIobGV2ZWw9Tm9uZSk6CisgICAgJycnCisgICAgVHVybiBvbiBsb2dnaW5nIGFuZCBhZGQgYSBoYW5kbGVyIHdoaWNoIHByaW50cyB0byBzdGRlcnIKKyAgICAnJycKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy51dGlsIGltcG9ydCBsb2dfdG9fc3RkZXJyCisgICAgcmV0dXJuIGxvZ190b19zdGRlcnIobGV2ZWwpCisKK2RlZiBhbGxvd19jb25uZWN0aW9uX3BpY2tsaW5nKCk6CisgICAgJycnCisgICAgSW5zdGFsbCBzdXBwb3J0IGZvciBzZW5kaW5nIGNvbm5lY3Rpb25zIGFuZCBzb2NrZXRzIGJldHdlZW4gcHJvY2Vzc2VzCisgICAgJycnCisgICAgZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0IHJlZHVjdGlvbgorCisjCisjIERlZmluaXRpb25zIGRlcGVuZGluZyBvbiBuYXRpdmUgc2VtYXBob3JlcworIworCitkZWYgTG9jaygpOgorICAgICcnJworICAgIFJldHVybnMgYSBub24tcmVjdXJzaXZlIGxvY2sgb2JqZWN0CisgICAgJycnCisgICAgZnJvbSBtdWx0aXByb2Nlc3Npbmcuc3luY2hyb25pemUgaW1wb3J0IExvY2sKKyAgICByZXR1cm4gTG9jaygpCisKK2RlZiBSTG9jaygpOgorICAgICcnJworICAgIFJldHVybnMgYSByZWN1cnNpdmUgbG9jayBvYmplY3QKKyAgICAnJycKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5zeW5jaHJvbml6ZSBpbXBvcnQgUkxvY2sKKyAgICByZXR1cm4gUkxvY2soKQorCitkZWYgQ29uZGl0aW9uKGxvY2s9Tm9uZSk6CisgICAgJycnCisgICAgUmV0dXJucyBhIGNvbmRpdGlvbiBvYmplY3QKKyAgICAnJycKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5zeW5jaHJvbml6ZSBpbXBvcnQgQ29uZGl0aW9uCisgICAgcmV0dXJuIENvbmRpdGlvbihsb2NrKQorCitkZWYgU2VtYXBob3JlKHZhbHVlPTEpOgorICAgICcnJworICAgIFJldHVybnMgYSBzZW1hcGhvcmUgb2JqZWN0CisgICAgJycnCisgICAgZnJvbSBtdWx0aXByb2Nlc3Npbmcuc3luY2hyb25pemUgaW1wb3J0IFNlbWFwaG9yZQorICAgIHJldHVybiBTZW1hcGhvcmUodmFsdWUpCisKK2RlZiBCb3VuZGVkU2VtYXBob3JlKHZhbHVlPTEpOgorICAgICcnJworICAgIFJldHVybnMgYSBib3VuZGVkIHNlbWFwaG9yZSBvYmplY3QKKyAgICAnJycKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5zeW5jaHJvbml6ZSBpbXBvcnQgQm91bmRlZFNlbWFwaG9yZQorICAgIHJldHVybiBCb3VuZGVkU2VtYXBob3JlKHZhbHVlKQorCitkZWYgRXZlbnQoKToKKyAgICAnJycKKyAgICBSZXR1cm5zIGFuIGV2ZW50IG9iamVjdAorICAgICcnJworICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLnN5bmNocm9uaXplIGltcG9ydCBFdmVudAorICAgIHJldHVybiBFdmVudCgpCisKK2RlZiBRdWV1ZShtYXhzaXplPTApOgorICAgICcnJworICAgIFJldHVybnMgYSBxdWV1ZSBvYmplY3QKKyAgICAnJycKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5xdWV1ZXMgaW1wb3J0IFF1ZXVlCisgICAgcmV0dXJuIFF1ZXVlKG1heHNpemUpCisKK2RlZiBKb2luYWJsZVF1ZXVlKG1heHNpemU9MCk6CisgICAgJycnCisgICAgUmV0dXJucyBhIHF1ZXVlIG9iamVjdAorICAgICcnJworICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLnF1ZXVlcyBpbXBvcnQgSm9pbmFibGVRdWV1ZQorICAgIHJldHVybiBKb2luYWJsZVF1ZXVlKG1heHNpemUpCisKK2RlZiBQb29sKHByb2Nlc3Nlcz1Ob25lLCBpbml0aWFsaXplcj1Ob25lLCBpbml0YXJncz0oKSwgbWF4dGFza3NwZXJjaGlsZD1Ob25lKToKKyAgICAnJycKKyAgICBSZXR1cm5zIGEgcHJvY2VzcyBwb29sIG9iamVjdAorICAgICcnJworICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLnBvb2wgaW1wb3J0IFBvb2wKKyAgICByZXR1cm4gUG9vbChwcm9jZXNzZXMsIGluaXRpYWxpemVyLCBpbml0YXJncywgbWF4dGFza3NwZXJjaGlsZCkKKworZGVmIFJhd1ZhbHVlKHR5cGVjb2RlX29yX3R5cGUsICphcmdzKToKKyAgICAnJycKKyAgICBSZXR1cm5zIGEgc2hhcmVkIG9iamVjdAorICAgICcnJworICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLnNoYXJlZGN0eXBlcyBpbXBvcnQgUmF3VmFsdWUKKyAgICByZXR1cm4gUmF3VmFsdWUodHlwZWNvZGVfb3JfdHlwZSwgKmFyZ3MpCisKK2RlZiBSYXdBcnJheSh0eXBlY29kZV9vcl90eXBlLCBzaXplX29yX2luaXRpYWxpemVyKToKKyAgICAnJycKKyAgICBSZXR1cm5zIGEgc2hhcmVkIGFycmF5CisgICAgJycnCisgICAgZnJvbSBtdWx0aXByb2Nlc3Npbmcuc2hhcmVkY3R5cGVzIGltcG9ydCBSYXdBcnJheQorICAgIHJldHVybiBSYXdBcnJheSh0eXBlY29kZV9vcl90eXBlLCBzaXplX29yX2luaXRpYWxpemVyKQorCitkZWYgVmFsdWUodHlwZWNvZGVfb3JfdHlwZSwgKmFyZ3MsICoqa3dkcyk6CisgICAgJycnCisgICAgUmV0dXJucyBhIHN5bmNocm9uaXplZCBzaGFyZWQgb2JqZWN0CisgICAgJycnCisgICAgZnJvbSBtdWx0aXByb2Nlc3Npbmcuc2hhcmVkY3R5cGVzIGltcG9ydCBWYWx1ZQorICAgIHJldHVybiBWYWx1ZSh0eXBlY29kZV9vcl90eXBlLCAqYXJncywgKiprd2RzKQorCitkZWYgQXJyYXkodHlwZWNvZGVfb3JfdHlwZSwgc2l6ZV9vcl9pbml0aWFsaXplciwgKiprd2RzKToKKyAgICAnJycKKyAgICBSZXR1cm5zIGEgc3luY2hyb25pemVkIHNoYXJlZCBhcnJheQorICAgICcnJworICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLnNoYXJlZGN0eXBlcyBpbXBvcnQgQXJyYXkKKyAgICByZXR1cm4gQXJyYXkodHlwZWNvZGVfb3JfdHlwZSwgc2l6ZV9vcl9pbml0aWFsaXplciwgKiprd2RzKQorCisjCisjCisjCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorCisgICAgZGVmIHNldF9leGVjdXRhYmxlKGV4ZWN1dGFibGUpOgorICAgICAgICAnJycKKyAgICAgICAgU2V0cyB0aGUgcGF0aCB0byBhIHB5dGhvbi5leGUgb3IgcHl0aG9udy5leGUgYmluYXJ5IHVzZWQgdG8gcnVuCisgICAgICAgIGNoaWxkIHByb2Nlc3NlcyBvbiBXaW5kb3dzIGluc3RlYWQgb2Ygc3lzLmV4ZWN1dGFibGUuCisgICAgICAgIFVzZWZ1bCBmb3IgcGVvcGxlIGVtYmVkZGluZyBQeXRob24uCisgICAgICAgICcnJworICAgICAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5mb3JraW5nIGltcG9ydCBzZXRfZXhlY3V0YWJsZQorICAgICAgICBzZXRfZXhlY3V0YWJsZShleGVjdXRhYmxlKQorCisgICAgX19hbGxfXyArPSBbJ3NldF9leGVjdXRhYmxlJ10KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzBhM2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzBhM2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24ucHkgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YmY4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLnB5CkBAIC0wLDAgKzEsNDY1IEBACisjCisjIEEgaGlnaGVyIGxldmVsIG1vZHVsZSBmb3IgdXNpbmcgc29ja2V0cyAob3IgV2luZG93cyBuYW1lZCBwaXBlcykKKyMKKyMgbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24ucHkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDgsIFIgT3Vka2VyaworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlCisjICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKworX19hbGxfXyA9IFsgJ0NsaWVudCcsICdMaXN0ZW5lcicsICdQaXBlJyBdCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHNvY2tldAoraW1wb3J0IGVycm5vCitpbXBvcnQgdGltZQoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgaXRlcnRvb2xzCisKK2ltcG9ydCBfbXVsdGlwcm9jZXNzaW5nCitmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgY3VycmVudF9wcm9jZXNzLCBBdXRoZW50aWNhdGlvbkVycm9yCitmcm9tIG11bHRpcHJvY2Vzc2luZy51dGlsIGltcG9ydCBnZXRfdGVtcF9kaXIsIEZpbmFsaXplLCBzdWJfZGVidWcsIGRlYnVnCitmcm9tIG11bHRpcHJvY2Vzc2luZy5mb3JraW5nIGltcG9ydCBkdXBsaWNhdGUsIGNsb3NlCisKKworIworIworIworCitCVUZTSVpFID0gODE5MgorIyBBIHZlcnkgZ2VuZXJvdXMgdGltZW91dCB3aGVuIGl0IGNvbWVzIHRvIGxvY2FsIGNvbm5lY3Rpb25zLi4uCitDT05ORUNUSU9OX1RJTUVPVVQgPSAyMC4KKworX21tYXBfY291bnRlciA9IGl0ZXJ0b29scy5jb3VudCgpCisKK2RlZmF1bHRfZmFtaWx5ID0gJ0FGX0lORVQnCitmYW1pbGllcyA9IFsnQUZfSU5FVCddCisKK2lmIGhhc2F0dHIoc29ja2V0LCAnQUZfVU5JWCcpOgorICAgIGRlZmF1bHRfZmFtaWx5ID0gJ0FGX1VOSVgnCisgICAgZmFtaWxpZXMgKz0gWydBRl9VTklYJ10KKworaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgZGVmYXVsdF9mYW1pbHkgPSAnQUZfUElQRScKKyAgICBmYW1pbGllcyArPSBbJ0FGX1BJUEUnXQorCisKK2RlZiBfaW5pdF90aW1lb3V0KHRpbWVvdXQ9Q09OTkVDVElPTl9USU1FT1VUKToKKyAgICByZXR1cm4gdGltZS50aW1lKCkgKyB0aW1lb3V0CisKK2RlZiBfY2hlY2tfdGltZW91dCh0KToKKyAgICByZXR1cm4gdGltZS50aW1lKCkgPiB0CisKKyMKKyMKKyMKKworZGVmIGFyYml0cmFyeV9hZGRyZXNzKGZhbWlseSk6CisgICAgJycnCisgICAgUmV0dXJuIGFuIGFyYml0cmFyeSBmcmVlIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBmYW1pbHkKKyAgICAnJycKKyAgICBpZiBmYW1pbHkgPT0gJ0FGX0lORVQnOgorICAgICAgICByZXR1cm4gKCdsb2NhbGhvc3QnLCAwKQorICAgIGVsaWYgZmFtaWx5ID09ICdBRl9VTklYJzoKKyAgICAgICAgcmV0dXJuIHRlbXBmaWxlLm1rdGVtcChwcmVmaXg9J2xpc3RlbmVyLScsIGRpcj1nZXRfdGVtcF9kaXIoKSkKKyAgICBlbGlmIGZhbWlseSA9PSAnQUZfUElQRSc6CisgICAgICAgIHJldHVybiB0ZW1wZmlsZS5ta3RlbXAocHJlZml4PXInXFwuXHBpcGVccHljLSVkLSVkLScgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcy5nZXRwaWQoKSwgX21tYXBfY291bnRlci5uZXh0KCkpKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3VucmVjb2duaXplZCBmYW1pbHknKQorCisKK2RlZiBhZGRyZXNzX3R5cGUoYWRkcmVzcyk6CisgICAgJycnCisgICAgUmV0dXJuIHRoZSB0eXBlcyBvZiB0aGUgYWRkcmVzcworCisgICAgVGhpcyBjYW4gYmUgJ0FGX0lORVQnLCAnQUZfVU5JWCcsIG9yICdBRl9QSVBFJworICAgICcnJworICAgIGlmIHR5cGUoYWRkcmVzcykgPT0gdHVwbGU6CisgICAgICAgIHJldHVybiAnQUZfSU5FVCcKKyAgICBlbGlmIHR5cGUoYWRkcmVzcykgaXMgc3RyIGFuZCBhZGRyZXNzLnN0YXJ0c3dpdGgoJ1xcXFwnKToKKyAgICAgICAgcmV0dXJuICdBRl9QSVBFJworICAgIGVsaWYgdHlwZShhZGRyZXNzKSBpcyBzdHI6CisgICAgICAgIHJldHVybiAnQUZfVU5JWCcKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdhZGRyZXNzIHR5cGUgb2YgJXIgdW5yZWNvZ25pemVkJyAlIGFkZHJlc3MpCisKKyMKKyMgUHVibGljIGZ1bmN0aW9ucworIworCitjbGFzcyBMaXN0ZW5lcihvYmplY3QpOgorICAgICcnJworICAgIFJldHVybnMgYSBsaXN0ZW5lciBvYmplY3QuCisKKyAgICBUaGlzIGlzIGEgd3JhcHBlciBmb3IgYSBib3VuZCBzb2NrZXQgd2hpY2ggaXMgJ2xpc3RlbmluZycgZm9yCisgICAgY29ubmVjdGlvbnMsIG9yIGZvciBhIFdpbmRvd3MgbmFtZWQgcGlwZS4KKyAgICAnJycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcz1Ob25lLCBmYW1pbHk9Tm9uZSwgYmFja2xvZz0xLCBhdXRoa2V5PU5vbmUpOgorICAgICAgICBmYW1pbHkgPSBmYW1pbHkgb3IgKGFkZHJlc3MgYW5kIGFkZHJlc3NfdHlwZShhZGRyZXNzKSkgXAorICAgICAgICAgICAgICAgICBvciBkZWZhdWx0X2ZhbWlseQorICAgICAgICBhZGRyZXNzID0gYWRkcmVzcyBvciBhcmJpdHJhcnlfYWRkcmVzcyhmYW1pbHkpCisKKyAgICAgICAgaWYgZmFtaWx5ID09ICdBRl9QSVBFJzoKKyAgICAgICAgICAgIHNlbGYuX2xpc3RlbmVyID0gUGlwZUxpc3RlbmVyKGFkZHJlc3MsIGJhY2tsb2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9saXN0ZW5lciA9IFNvY2tldExpc3RlbmVyKGFkZHJlc3MsIGZhbWlseSwgYmFja2xvZykKKworICAgICAgICBpZiBhdXRoa2V5IGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShhdXRoa2V5LCBieXRlcyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICdhdXRoa2V5IHNob3VsZCBiZSBhIGJ5dGUgc3RyaW5nJworCisgICAgICAgIHNlbGYuX2F1dGhrZXkgPSBhdXRoa2V5CisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgQWNjZXB0IGEgY29ubmVjdGlvbiBvbiB0aGUgYm91bmQgc29ja2V0IG9yIG5hbWVkIHBpcGUgb2YgYHNlbGZgLgorCisgICAgICAgIFJldHVybnMgYSBgQ29ubmVjdGlvbmAgb2JqZWN0LgorICAgICAgICAnJycKKyAgICAgICAgYyA9IHNlbGYuX2xpc3RlbmVyLmFjY2VwdCgpCisgICAgICAgIGlmIHNlbGYuX2F1dGhrZXk6CisgICAgICAgICAgICBkZWxpdmVyX2NoYWxsZW5nZShjLCBzZWxmLl9hdXRoa2V5KQorICAgICAgICAgICAgYW5zd2VyX2NoYWxsZW5nZShjLCBzZWxmLl9hdXRoa2V5KQorICAgICAgICByZXR1cm4gYworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgQ2xvc2UgdGhlIGJvdW5kIHNvY2tldCBvciBuYW1lZCBwaXBlIG9mIGBzZWxmYC4KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiBzZWxmLl9saXN0ZW5lci5jbG9zZSgpCisKKyAgICBhZGRyZXNzID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IHNlbGYuX2xpc3RlbmVyLl9hZGRyZXNzKQorICAgIGxhc3RfYWNjZXB0ZWQgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogc2VsZi5fbGlzdGVuZXIuX2xhc3RfYWNjZXB0ZWQpCisKKworZGVmIENsaWVudChhZGRyZXNzLCBmYW1pbHk9Tm9uZSwgYXV0aGtleT1Ob25lKToKKyAgICAnJycKKyAgICBSZXR1cm5zIGEgY29ubmVjdGlvbiB0byB0aGUgYWRkcmVzcyBvZiBhIGBMaXN0ZW5lcmAKKyAgICAnJycKKyAgICBmYW1pbHkgPSBmYW1pbHkgb3IgYWRkcmVzc190eXBlKGFkZHJlc3MpCisgICAgaWYgZmFtaWx5ID09ICdBRl9QSVBFJzoKKyAgICAgICAgYyA9IFBpcGVDbGllbnQoYWRkcmVzcykKKyAgICBlbHNlOgorICAgICAgICBjID0gU29ja2V0Q2xpZW50KGFkZHJlc3MpCisKKyAgICBpZiBhdXRoa2V5IGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShhdXRoa2V5LCBieXRlcyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgJ2F1dGhrZXkgc2hvdWxkIGJlIGEgYnl0ZSBzdHJpbmcnCisKKyAgICBpZiBhdXRoa2V5IGlzIG5vdCBOb25lOgorICAgICAgICBhbnN3ZXJfY2hhbGxlbmdlKGMsIGF1dGhrZXkpCisgICAgICAgIGRlbGl2ZXJfY2hhbGxlbmdlKGMsIGF1dGhrZXkpCisKKyAgICByZXR1cm4gYworCisKK2lmIHN5cy5wbGF0Zm9ybSAhPSAnd2luMzInOgorCisgICAgZGVmIFBpcGUoZHVwbGV4PVRydWUpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJucyBwYWlyIG9mIGNvbm5lY3Rpb24gb2JqZWN0cyBhdCBlaXRoZXIgZW5kIG9mIGEgcGlwZQorICAgICAgICAnJycKKyAgICAgICAgaWYgZHVwbGV4OgorICAgICAgICAgICAgczEsIHMyID0gc29ja2V0LnNvY2tldHBhaXIoKQorICAgICAgICAgICAgczEuc2V0YmxvY2tpbmcoVHJ1ZSkKKyAgICAgICAgICAgIHMyLnNldGJsb2NraW5nKFRydWUpCisgICAgICAgICAgICBjMSA9IF9tdWx0aXByb2Nlc3NpbmcuQ29ubmVjdGlvbihvcy5kdXAoczEuZmlsZW5vKCkpKQorICAgICAgICAgICAgYzIgPSBfbXVsdGlwcm9jZXNzaW5nLkNvbm5lY3Rpb24ob3MuZHVwKHMyLmZpbGVubygpKSkKKyAgICAgICAgICAgIHMxLmNsb3NlKCkKKyAgICAgICAgICAgIHMyLmNsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZkMSwgZmQyID0gb3MucGlwZSgpCisgICAgICAgICAgICBjMSA9IF9tdWx0aXByb2Nlc3NpbmcuQ29ubmVjdGlvbihmZDEsIHdyaXRhYmxlPUZhbHNlKQorICAgICAgICAgICAgYzIgPSBfbXVsdGlwcm9jZXNzaW5nLkNvbm5lY3Rpb24oZmQyLCByZWFkYWJsZT1GYWxzZSkKKworICAgICAgICByZXR1cm4gYzEsIGMyCisKK2Vsc2U6CisgICAgZnJvbSBfbXVsdGlwcm9jZXNzaW5nIGltcG9ydCB3aW4zMgorCisgICAgZGVmIFBpcGUoZHVwbGV4PVRydWUpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJucyBwYWlyIG9mIGNvbm5lY3Rpb24gb2JqZWN0cyBhdCBlaXRoZXIgZW5kIG9mIGEgcGlwZQorICAgICAgICAnJycKKyAgICAgICAgYWRkcmVzcyA9IGFyYml0cmFyeV9hZGRyZXNzKCdBRl9QSVBFJykKKyAgICAgICAgaWYgZHVwbGV4OgorICAgICAgICAgICAgb3Blbm1vZGUgPSB3aW4zMi5QSVBFX0FDQ0VTU19EVVBMRVgKKyAgICAgICAgICAgIGFjY2VzcyA9IHdpbjMyLkdFTkVSSUNfUkVBRCB8IHdpbjMyLkdFTkVSSUNfV1JJVEUKKyAgICAgICAgICAgIG9ic2l6ZSwgaWJzaXplID0gQlVGU0laRSwgQlVGU0laRQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3Blbm1vZGUgPSB3aW4zMi5QSVBFX0FDQ0VTU19JTkJPVU5ECisgICAgICAgICAgICBhY2Nlc3MgPSB3aW4zMi5HRU5FUklDX1dSSVRFCisgICAgICAgICAgICBvYnNpemUsIGlic2l6ZSA9IDAsIEJVRlNJWkUKKworICAgICAgICBoMSA9IHdpbjMyLkNyZWF0ZU5hbWVkUGlwZSgKKyAgICAgICAgICAgIGFkZHJlc3MsIG9wZW5tb2RlLAorICAgICAgICAgICAgd2luMzIuUElQRV9UWVBFX01FU1NBR0UgfCB3aW4zMi5QSVBFX1JFQURNT0RFX01FU1NBR0UgfAorICAgICAgICAgICAgd2luMzIuUElQRV9XQUlULAorICAgICAgICAgICAgMSwgb2JzaXplLCBpYnNpemUsIHdpbjMyLk5NUFdBSVRfV0FJVF9GT1JFVkVSLCB3aW4zMi5OVUxMCisgICAgICAgICAgICApCisgICAgICAgIGgyID0gd2luMzIuQ3JlYXRlRmlsZSgKKyAgICAgICAgICAgIGFkZHJlc3MsIGFjY2VzcywgMCwgd2luMzIuTlVMTCwgd2luMzIuT1BFTl9FWElTVElORywgMCwgd2luMzIuTlVMTAorICAgICAgICAgICAgKQorICAgICAgICB3aW4zMi5TZXROYW1lZFBpcGVIYW5kbGVTdGF0ZSgKKyAgICAgICAgICAgIGgyLCB3aW4zMi5QSVBFX1JFQURNT0RFX01FU1NBR0UsIE5vbmUsIE5vbmUKKyAgICAgICAgICAgICkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aW4zMi5Db25uZWN0TmFtZWRQaXBlKGgxLCB3aW4zMi5OVUxMKQorICAgICAgICBleGNlcHQgV2luZG93c0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5hcmdzWzBdICE9IHdpbjMyLkVSUk9SX1BJUEVfQ09OTkVDVEVEOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgYzEgPSBfbXVsdGlwcm9jZXNzaW5nLlBpcGVDb25uZWN0aW9uKGgxLCB3cml0YWJsZT1kdXBsZXgpCisgICAgICAgIGMyID0gX211bHRpcHJvY2Vzc2luZy5QaXBlQ29ubmVjdGlvbihoMiwgcmVhZGFibGU9ZHVwbGV4KQorCisgICAgICAgIHJldHVybiBjMSwgYzIKKworIworIyBEZWZpbml0aW9ucyBmb3IgY29ubmVjdGlvbnMgYmFzZWQgb24gc29ja2V0cworIworCitjbGFzcyBTb2NrZXRMaXN0ZW5lcihvYmplY3QpOgorICAgICcnJworICAgIFJlcHJlc2VudGF0aW9uIG9mIGEgc29ja2V0IHdoaWNoIGlzIGJvdW5kIHRvIGFuIGFkZHJlc3MgYW5kIGxpc3RlbmluZworICAgICcnJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzLCBmYW1pbHksIGJhY2tsb2c9MSk6CisgICAgICAgIHNlbGYuX3NvY2tldCA9IHNvY2tldC5zb2NrZXQoZ2V0YXR0cihzb2NrZXQsIGZhbWlseSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3NvY2tldC5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQorICAgICAgICAgICAgc2VsZi5fc29ja2V0LnNldGJsb2NraW5nKFRydWUpCisgICAgICAgICAgICBzZWxmLl9zb2NrZXQuYmluZChhZGRyZXNzKQorICAgICAgICAgICAgc2VsZi5fc29ja2V0Lmxpc3RlbihiYWNrbG9nKQorICAgICAgICAgICAgc2VsZi5fYWRkcmVzcyA9IHNlbGYuX3NvY2tldC5nZXRzb2NrbmFtZSgpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBzZWxmLl9zb2NrZXQuY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgc2VsZi5fZmFtaWx5ID0gZmFtaWx5CisgICAgICAgIHNlbGYuX2xhc3RfYWNjZXB0ZWQgPSBOb25lCisKKyAgICAgICAgaWYgZmFtaWx5ID09ICdBRl9VTklYJzoKKyAgICAgICAgICAgIHNlbGYuX3VubGluayA9IEZpbmFsaXplKAorICAgICAgICAgICAgICAgIHNlbGYsIG9zLnVubGluaywgYXJncz0oYWRkcmVzcywpLCBleGl0cHJpb3JpdHk9MAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3VubGluayA9IE5vbmUKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIHMsIHNlbGYuX2xhc3RfYWNjZXB0ZWQgPSBzZWxmLl9zb2NrZXQuYWNjZXB0KCkKKyAgICAgICAgcy5zZXRibG9ja2luZyhUcnVlKQorICAgICAgICBmZCA9IGR1cGxpY2F0ZShzLmZpbGVubygpKQorICAgICAgICBjb25uID0gX211bHRpcHJvY2Vzc2luZy5Db25uZWN0aW9uKGZkKQorICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIGNvbm4KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fc29ja2V0LmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5fdW5saW5rIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fdW5saW5rKCkKKworCitkZWYgU29ja2V0Q2xpZW50KGFkZHJlc3MpOgorICAgICcnJworICAgIFJldHVybiBhIGNvbm5lY3Rpb24gb2JqZWN0IGNvbm5lY3RlZCB0byB0aGUgc29ja2V0IGdpdmVuIGJ5IGBhZGRyZXNzYAorICAgICcnJworICAgIGZhbWlseSA9IGFkZHJlc3NfdHlwZShhZGRyZXNzKQorICAgIHMgPSBzb2NrZXQuc29ja2V0KCBnZXRhdHRyKHNvY2tldCwgZmFtaWx5KSApCisgICAgcy5zZXRibG9ja2luZyhUcnVlKQorICAgIHQgPSBfaW5pdF90aW1lb3V0KCkKKworICAgIHdoaWxlIDE6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMuY29ubmVjdChhZGRyZXNzKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5hcmdzWzBdICE9IGVycm5vLkVDT05OUkVGVVNFRCBvciBfY2hlY2tfdGltZW91dCh0KToKKyAgICAgICAgICAgICAgICBkZWJ1ZygnZmFpbGVkIHRvIGNvbm5lY3QgdG8gYWRkcmVzcyAlcycsIGFkZHJlc3MpCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UKKworICAgIGZkID0gZHVwbGljYXRlKHMuZmlsZW5vKCkpCisgICAgY29ubiA9IF9tdWx0aXByb2Nlc3NpbmcuQ29ubmVjdGlvbihmZCkKKyAgICBzLmNsb3NlKCkKKyAgICByZXR1cm4gY29ubgorCisjCisjIERlZmluaXRpb25zIGZvciBjb25uZWN0aW9ucyBiYXNlZCBvbiBuYW1lZCBwaXBlcworIworCitpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKworICAgIGNsYXNzIFBpcGVMaXN0ZW5lcihvYmplY3QpOgorICAgICAgICAnJycKKyAgICAgICAgUmVwcmVzZW50YXRpb24gb2YgYSBuYW1lZCBwaXBlCisgICAgICAgICcnJworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcywgYmFja2xvZz1Ob25lKToKKyAgICAgICAgICAgIHNlbGYuX2FkZHJlc3MgPSBhZGRyZXNzCisgICAgICAgICAgICBoYW5kbGUgPSB3aW4zMi5DcmVhdGVOYW1lZFBpcGUoCisgICAgICAgICAgICAgICAgYWRkcmVzcywgd2luMzIuUElQRV9BQ0NFU1NfRFVQTEVYLAorICAgICAgICAgICAgICAgIHdpbjMyLlBJUEVfVFlQRV9NRVNTQUdFIHwgd2luMzIuUElQRV9SRUFETU9ERV9NRVNTQUdFIHwKKyAgICAgICAgICAgICAgICB3aW4zMi5QSVBFX1dBSVQsCisgICAgICAgICAgICAgICAgd2luMzIuUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTLCBCVUZTSVpFLCBCVUZTSVpFLAorICAgICAgICAgICAgICAgIHdpbjMyLk5NUFdBSVRfV0FJVF9GT1JFVkVSLCB3aW4zMi5OVUxMCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5faGFuZGxlX3F1ZXVlID0gW2hhbmRsZV0KKyAgICAgICAgICAgIHNlbGYuX2xhc3RfYWNjZXB0ZWQgPSBOb25lCisKKyAgICAgICAgICAgIHN1Yl9kZWJ1ZygnbGlzdGVuZXIgY3JlYXRlZCB3aXRoIGFkZHJlc3M9JXInLCBzZWxmLl9hZGRyZXNzKQorCisgICAgICAgICAgICBzZWxmLmNsb3NlID0gRmluYWxpemUoCisgICAgICAgICAgICAgICAgc2VsZiwgUGlwZUxpc3RlbmVyLl9maW5hbGl6ZV9waXBlX2xpc3RlbmVyLAorICAgICAgICAgICAgICAgIGFyZ3M9KHNlbGYuX2hhbmRsZV9xdWV1ZSwgc2VsZi5fYWRkcmVzcyksIGV4aXRwcmlvcml0eT0wCisgICAgICAgICAgICAgICAgKQorCisgICAgICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgICAgICBuZXdoYW5kbGUgPSB3aW4zMi5DcmVhdGVOYW1lZFBpcGUoCisgICAgICAgICAgICAgICAgc2VsZi5fYWRkcmVzcywgd2luMzIuUElQRV9BQ0NFU1NfRFVQTEVYLAorICAgICAgICAgICAgICAgIHdpbjMyLlBJUEVfVFlQRV9NRVNTQUdFIHwgd2luMzIuUElQRV9SRUFETU9ERV9NRVNTQUdFIHwKKyAgICAgICAgICAgICAgICB3aW4zMi5QSVBFX1dBSVQsCisgICAgICAgICAgICAgICAgd2luMzIuUElQRV9VTkxJTUlURURfSU5TVEFOQ0VTLCBCVUZTSVpFLCBCVUZTSVpFLAorICAgICAgICAgICAgICAgIHdpbjMyLk5NUFdBSVRfV0FJVF9GT1JFVkVSLCB3aW4zMi5OVUxMCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5faGFuZGxlX3F1ZXVlLmFwcGVuZChuZXdoYW5kbGUpCisgICAgICAgICAgICBoYW5kbGUgPSBzZWxmLl9oYW5kbGVfcXVldWUucG9wKDApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2luMzIuQ29ubmVjdE5hbWVkUGlwZShoYW5kbGUsIHdpbjMyLk5VTEwpCisgICAgICAgICAgICBleGNlcHQgV2luZG93c0Vycm9yLCBlOgorICAgICAgICAgICAgICAgICMgRVJST1JfTk9fREFUQSBjYW4gb2NjdXIgaWYgYSBjbGllbnQgaGFzIGFscmVhZHkgY29ubmVjdGVkLAorICAgICAgICAgICAgICAgICMgd3JpdHRlbiBkYXRhIGFuZCB0aGVuIGRpc2Nvbm5lY3RlZCAtLSBzZWUgSXNzdWUgMTQ3MjUuCisgICAgICAgICAgICAgICAgaWYgZS5hcmdzWzBdIG5vdCBpbiAod2luMzIuRVJST1JfUElQRV9DT05ORUNURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luMzIuRVJST1JfTk9fREFUQSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICByZXR1cm4gX211bHRpcHJvY2Vzc2luZy5QaXBlQ29ubmVjdGlvbihoYW5kbGUpCisKKyAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICBkZWYgX2ZpbmFsaXplX3BpcGVfbGlzdGVuZXIocXVldWUsIGFkZHJlc3MpOgorICAgICAgICAgICAgc3ViX2RlYnVnKCdjbG9zaW5nIGxpc3RlbmVyIHdpdGggYWRkcmVzcz0lcicsIGFkZHJlc3MpCisgICAgICAgICAgICBmb3IgaGFuZGxlIGluIHF1ZXVlOgorICAgICAgICAgICAgICAgIGNsb3NlKGhhbmRsZSkKKworICAgIGRlZiBQaXBlQ2xpZW50KGFkZHJlc3MpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJuIGEgY29ubmVjdGlvbiBvYmplY3QgY29ubmVjdGVkIHRvIHRoZSBwaXBlIGdpdmVuIGJ5IGBhZGRyZXNzYAorICAgICAgICAnJycKKyAgICAgICAgdCA9IF9pbml0X3RpbWVvdXQoKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpbjMyLldhaXROYW1lZFBpcGUoYWRkcmVzcywgMTAwMCkKKyAgICAgICAgICAgICAgICBoID0gd2luMzIuQ3JlYXRlRmlsZSgKKyAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgd2luMzIuR0VORVJJQ19SRUFEIHwgd2luMzIuR0VORVJJQ19XUklURSwKKyAgICAgICAgICAgICAgICAgICAgMCwgd2luMzIuTlVMTCwgd2luMzIuT1BFTl9FWElTVElORywgMCwgd2luMzIuTlVMTAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBleGNlcHQgV2luZG93c0Vycm9yLCBlOgorICAgICAgICAgICAgICAgIGlmIGUuYXJnc1swXSBub3QgaW4gKHdpbjMyLkVSUk9SX1NFTV9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbjMyLkVSUk9SX1BJUEVfQlVTWSkgb3IgX2NoZWNrX3RpbWVvdXQodCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZQorCisgICAgICAgIHdpbjMyLlNldE5hbWVkUGlwZUhhbmRsZVN0YXRlKAorICAgICAgICAgICAgaCwgd2luMzIuUElQRV9SRUFETU9ERV9NRVNTQUdFLCBOb25lLCBOb25lCisgICAgICAgICAgICApCisgICAgICAgIHJldHVybiBfbXVsdGlwcm9jZXNzaW5nLlBpcGVDb25uZWN0aW9uKGgpCisKKyMKKyMgQXV0aGVudGljYXRpb24gc3R1ZmYKKyMKKworTUVTU0FHRV9MRU5HVEggPSAyMAorCitDSEFMTEVOR0UgPSBiJyNDSEFMTEVOR0UjJworV0VMQ09NRSA9IGInI1dFTENPTUUjJworRkFJTFVSRSA9IGInI0ZBSUxVUkUjJworCitkZWYgZGVsaXZlcl9jaGFsbGVuZ2UoY29ubmVjdGlvbiwgYXV0aGtleSk6CisgICAgaW1wb3J0IGhtYWMKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShhdXRoa2V5LCBieXRlcykKKyAgICBtZXNzYWdlID0gb3MudXJhbmRvbShNRVNTQUdFX0xFTkdUSCkKKyAgICBjb25uZWN0aW9uLnNlbmRfYnl0ZXMoQ0hBTExFTkdFICsgbWVzc2FnZSkKKyAgICBkaWdlc3QgPSBobWFjLm5ldyhhdXRoa2V5LCBtZXNzYWdlKS5kaWdlc3QoKQorICAgIHJlc3BvbnNlID0gY29ubmVjdGlvbi5yZWN2X2J5dGVzKDI1NikgICAgICAgICMgcmVqZWN0IGxhcmdlIG1lc3NhZ2UKKyAgICBpZiByZXNwb25zZSA9PSBkaWdlc3Q6CisgICAgICAgIGNvbm5lY3Rpb24uc2VuZF9ieXRlcyhXRUxDT01FKQorICAgIGVsc2U6CisgICAgICAgIGNvbm5lY3Rpb24uc2VuZF9ieXRlcyhGQUlMVVJFKQorICAgICAgICByYWlzZSBBdXRoZW50aWNhdGlvbkVycm9yKCdkaWdlc3QgcmVjZWl2ZWQgd2FzIHdyb25nJykKKworZGVmIGFuc3dlcl9jaGFsbGVuZ2UoY29ubmVjdGlvbiwgYXV0aGtleSk6CisgICAgaW1wb3J0IGhtYWMKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShhdXRoa2V5LCBieXRlcykKKyAgICBtZXNzYWdlID0gY29ubmVjdGlvbi5yZWN2X2J5dGVzKDI1NikgICAgICAgICAjIHJlamVjdCBsYXJnZSBtZXNzYWdlCisgICAgYXNzZXJ0IG1lc3NhZ2VbOmxlbihDSEFMTEVOR0UpXSA9PSBDSEFMTEVOR0UsICdtZXNzYWdlID0gJXInICUgbWVzc2FnZQorICAgIG1lc3NhZ2UgPSBtZXNzYWdlW2xlbihDSEFMTEVOR0UpOl0KKyAgICBkaWdlc3QgPSBobWFjLm5ldyhhdXRoa2V5LCBtZXNzYWdlKS5kaWdlc3QoKQorICAgIGNvbm5lY3Rpb24uc2VuZF9ieXRlcyhkaWdlc3QpCisgICAgcmVzcG9uc2UgPSBjb25uZWN0aW9uLnJlY3ZfYnl0ZXMoMjU2KSAgICAgICAgIyByZWplY3QgbGFyZ2UgbWVzc2FnZQorICAgIGlmIHJlc3BvbnNlICE9IFdFTENPTUU6CisgICAgICAgIHJhaXNlIEF1dGhlbnRpY2F0aW9uRXJyb3IoJ2RpZ2VzdCBzZW50IHdhcyByZWplY3RlZCcpCisKKyMKKyMgU3VwcG9ydCBmb3IgdXNpbmcgeG1scnBjbGliIGZvciBzZXJpYWxpemF0aW9uCisjCisKK2NsYXNzIENvbm5lY3Rpb25XcmFwcGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4sIGR1bXBzLCBsb2Fkcyk6CisgICAgICAgIHNlbGYuX2Nvbm4gPSBjb25uCisgICAgICAgIHNlbGYuX2R1bXBzID0gZHVtcHMKKyAgICAgICAgc2VsZi5fbG9hZHMgPSBsb2FkcworICAgICAgICBmb3IgYXR0ciBpbiAoJ2ZpbGVubycsICdjbG9zZScsICdwb2xsJywgJ3JlY3ZfYnl0ZXMnLCAnc2VuZF9ieXRlcycpOgorICAgICAgICAgICAgb2JqID0gZ2V0YXR0cihjb25uLCBhdHRyKQorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCBvYmopCisgICAgZGVmIHNlbmQoc2VsZiwgb2JqKToKKyAgICAgICAgcyA9IHNlbGYuX2R1bXBzKG9iaikKKyAgICAgICAgc2VsZi5fY29ubi5zZW5kX2J5dGVzKHMpCisgICAgZGVmIHJlY3Yoc2VsZik6CisgICAgICAgIHMgPSBzZWxmLl9jb25uLnJlY3ZfYnl0ZXMoKQorICAgICAgICByZXR1cm4gc2VsZi5fbG9hZHMocykKKworZGVmIF94bWxfZHVtcHMob2JqKToKKyAgICByZXR1cm4geG1scnBjbGliLmR1bXBzKChvYmosKSwgTm9uZSwgTm9uZSwgTm9uZSwgMSkuZW5jb2RlKCd1dGY4JykKKworZGVmIF94bWxfbG9hZHMocyk6CisgICAgKG9iaiwpLCBtZXRob2QgPSB4bWxycGNsaWIubG9hZHMocy5kZWNvZGUoJ3V0ZjgnKSkKKyAgICByZXR1cm4gb2JqCisKK2NsYXNzIFhtbExpc3RlbmVyKExpc3RlbmVyKToKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICBnbG9iYWwgeG1scnBjbGliCisgICAgICAgIGltcG9ydCB4bWxycGNsaWIKKyAgICAgICAgb2JqID0gTGlzdGVuZXIuYWNjZXB0KHNlbGYpCisgICAgICAgIHJldHVybiBDb25uZWN0aW9uV3JhcHBlcihvYmosIF94bWxfZHVtcHMsIF94bWxfbG9hZHMpCisKK2RlZiBYbWxDbGllbnQoKmFyZ3MsICoqa3dkcyk6CisgICAgZ2xvYmFsIHhtbHJwY2xpYgorICAgIGltcG9ydCB4bWxycGNsaWIKKyAgICByZXR1cm4gQ29ubmVjdGlvbldyYXBwZXIoQ2xpZW50KCphcmdzLCAqKmt3ZHMpLCBfeG1sX2R1bXBzLCBfeG1sX2xvYWRzKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5weWMgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2JhOTAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5weW8gYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk3OGFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2IxMjZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvX19pbml0X18ucHkKQEAgLTAsMCArMSwxNTMgQEAKKyMKKyMgU3VwcG9ydCBmb3IgdGhlIEFQSSBvZiB0aGUgbXVsdGlwcm9jZXNzaW5nIHBhY2thZ2UgdXNpbmcgdGhyZWFkcworIworIyBtdWx0aXByb2Nlc3NpbmcvZHVtbXkvX19pbml0X18ucHkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDgsIFIgT3Vka2VyaworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlCisjICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKworX19hbGxfXyA9IFsKKyAgICAnUHJvY2VzcycsICdjdXJyZW50X3Byb2Nlc3MnLCAnYWN0aXZlX2NoaWxkcmVuJywgJ2ZyZWV6ZV9zdXBwb3J0JywKKyAgICAnTG9jaycsICdSTG9jaycsICdTZW1hcGhvcmUnLCAnQm91bmRlZFNlbWFwaG9yZScsICdDb25kaXRpb24nLAorICAgICdFdmVudCcsICdRdWV1ZScsICdNYW5hZ2VyJywgJ1BpcGUnLCAnUG9vbCcsICdKb2luYWJsZVF1ZXVlJworICAgIF0KKworIworIyBJbXBvcnRzCisjCisKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCBzeXMKK2ltcG9ydCB3ZWFrcmVmCitpbXBvcnQgYXJyYXkKK2ltcG9ydCBpdGVydG9vbHMKKworZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0IFRpbWVvdXRFcnJvciwgY3B1X2NvdW50Citmcm9tIG11bHRpcHJvY2Vzc2luZy5kdW1teS5jb25uZWN0aW9uIGltcG9ydCBQaXBlCitmcm9tIHRocmVhZGluZyBpbXBvcnQgTG9jaywgUkxvY2ssIFNlbWFwaG9yZSwgQm91bmRlZFNlbWFwaG9yZQorZnJvbSB0aHJlYWRpbmcgaW1wb3J0IEV2ZW50Citmcm9tIFF1ZXVlIGltcG9ydCBRdWV1ZQorCisjCisjCisjCisKK2NsYXNzIER1bW15UHJvY2Vzcyh0aHJlYWRpbmcuVGhyZWFkKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncm91cD1Ob25lLCB0YXJnZXQ9Tm9uZSwgbmFtZT1Ob25lLCBhcmdzPSgpLCBrd2FyZ3M9e30pOgorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYsIGdyb3VwLCB0YXJnZXQsIG5hbWUsIGFyZ3MsIGt3YXJncykKKyAgICAgICAgc2VsZi5fcGlkID0gTm9uZQorICAgICAgICBzZWxmLl9jaGlsZHJlbiA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoKQorICAgICAgICBzZWxmLl9zdGFydF9jYWxsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLl9wYXJlbnQgPSBjdXJyZW50X3Byb2Nlc3MoKQorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5fcGFyZW50IGlzIGN1cnJlbnRfcHJvY2VzcygpCisgICAgICAgIHNlbGYuX3N0YXJ0X2NhbGxlZCA9IFRydWUKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLl9wYXJlbnQsICdfY2hpbGRyZW4nKToKKyAgICAgICAgICAgIHNlbGYuX3BhcmVudC5fY2hpbGRyZW5bc2VsZl0gPSBOb25lCisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuc3RhcnQoc2VsZikKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBleGl0Y29kZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fc3RhcnRfY2FsbGVkIGFuZCBub3Qgc2VsZi5pc19hbGl2ZSgpOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyMKKyMKKyMKKworY2xhc3MgQ29uZGl0aW9uKHRocmVhZGluZy5fQ29uZGl0aW9uKToKKyAgICBub3RpZnlfYWxsID0gdGhyZWFkaW5nLl9Db25kaXRpb24ubm90aWZ5X2FsbC5pbV9mdW5jCisKKyMKKyMKKyMKKworUHJvY2VzcyA9IER1bW15UHJvY2VzcworY3VycmVudF9wcm9jZXNzID0gdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkCitjdXJyZW50X3Byb2Nlc3MoKS5fY2hpbGRyZW4gPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKKworZGVmIGFjdGl2ZV9jaGlsZHJlbigpOgorICAgIGNoaWxkcmVuID0gY3VycmVudF9wcm9jZXNzKCkuX2NoaWxkcmVuCisgICAgZm9yIHAgaW4gbGlzdChjaGlsZHJlbik6CisgICAgICAgIGlmIG5vdCBwLmlzX2FsaXZlKCk6CisgICAgICAgICAgICBjaGlsZHJlbi5wb3AocCwgTm9uZSkKKyAgICByZXR1cm4gbGlzdChjaGlsZHJlbikKKworZGVmIGZyZWV6ZV9zdXBwb3J0KCk6CisgICAgcGFzcworCisjCisjCisjCisKK2NsYXNzIE5hbWVzcGFjZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3ZHMpOgorICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShrd2RzKQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgaXRlbXMgPSBzZWxmLl9fZGljdF9fLml0ZW1zKCkKKyAgICAgICAgdGVtcCA9IFtdCisgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBpdGVtczoKKyAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKToKKyAgICAgICAgICAgICAgICB0ZW1wLmFwcGVuZCgnJXM9JXInICUgKG5hbWUsIHZhbHVlKSkKKyAgICAgICAgdGVtcC5zb3J0KCkKKyAgICAgICAgcmV0dXJuICdOYW1lc3BhY2UoJXMpJyAlIHN0ci5qb2luKCcsICcsIHRlbXApCisKK2RpY3QgPSBkaWN0CitsaXN0ID0gbGlzdAorCitkZWYgQXJyYXkodHlwZWNvZGUsIHNlcXVlbmNlLCBsb2NrPVRydWUpOgorICAgIHJldHVybiBhcnJheS5hcnJheSh0eXBlY29kZSwgc2VxdWVuY2UpCisKK2NsYXNzIFZhbHVlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVjb2RlLCB2YWx1ZSwgbG9jaz1UcnVlKToKKyAgICAgICAgc2VsZi5fdHlwZWNvZGUgPSB0eXBlY29kZQorICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCisgICAgZGVmIF9nZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl92YWx1ZQorICAgIGRlZiBfc2V0KHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZQorICAgIHZhbHVlID0gcHJvcGVydHkoX2dldCwgX3NldCkKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPCVyKCVyLCAlcik+JyUodHlwZShzZWxmKS5fX25hbWVfXyxzZWxmLl90eXBlY29kZSxzZWxmLl92YWx1ZSkKKworZGVmIE1hbmFnZXIoKToKKyAgICByZXR1cm4gc3lzLm1vZHVsZXNbX19uYW1lX19dCisKK2RlZiBzaHV0ZG93bigpOgorICAgIHBhc3MKKworZGVmIFBvb2wocHJvY2Vzc2VzPU5vbmUsIGluaXRpYWxpemVyPU5vbmUsIGluaXRhcmdzPSgpKToKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5wb29sIGltcG9ydCBUaHJlYWRQb29sCisgICAgcmV0dXJuIFRocmVhZFBvb2wocHJvY2Vzc2VzLCBpbml0aWFsaXplciwgaW5pdGFyZ3MpCisKK0pvaW5hYmxlUXVldWUgPSBRdWV1ZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZjA0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYjA0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvY29ubmVjdGlvbi5weSBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2R1bW15L2Nvbm5lY3Rpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkYzlmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2R1bW15L2Nvbm5lY3Rpb24ucHkKQEAgLTAsMCArMSw4NyBAQAorIworIyBBbmFsb2d1ZSBvZiBgbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb25gIHdoaWNoIHVzZXMgcXVldWVzIGluc3RlYWQgb2Ygc29ja2V0cworIworIyBtdWx0aXByb2Nlc3NpbmcvZHVtbXkvY29ubmVjdGlvbi5weQorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgUiBPdWRrZXJrCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyMgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCitfX2FsbF9fID0gWyAnQ2xpZW50JywgJ0xpc3RlbmVyJywgJ1BpcGUnIF0KKworZnJvbSBRdWV1ZSBpbXBvcnQgUXVldWUKKworCitmYW1pbGllcyA9IFtOb25lXQorCisKK2NsYXNzIExpc3RlbmVyKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcz1Ob25lLCBmYW1pbHk9Tm9uZSwgYmFja2xvZz0xKToKKyAgICAgICAgc2VsZi5fYmFja2xvZ19xdWV1ZSA9IFF1ZXVlKGJhY2tsb2cpCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICByZXR1cm4gQ29ubmVjdGlvbigqc2VsZi5fYmFja2xvZ19xdWV1ZS5nZXQoKSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fYmFja2xvZ19xdWV1ZSA9IE5vbmUKKworICAgIGFkZHJlc3MgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogc2VsZi5fYmFja2xvZ19xdWV1ZSkKKworCitkZWYgQ2xpZW50KGFkZHJlc3MpOgorICAgIF9pbiwgX291dCA9IFF1ZXVlKCksIFF1ZXVlKCkKKyAgICBhZGRyZXNzLnB1dCgoX291dCwgX2luKSkKKyAgICByZXR1cm4gQ29ubmVjdGlvbihfaW4sIF9vdXQpCisKKworZGVmIFBpcGUoZHVwbGV4PVRydWUpOgorICAgIGEsIGIgPSBRdWV1ZSgpLCBRdWV1ZSgpCisgICAgcmV0dXJuIENvbm5lY3Rpb24oYSwgYiksIENvbm5lY3Rpb24oYiwgYSkKKworCitjbGFzcyBDb25uZWN0aW9uKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX2luLCBfb3V0KToKKyAgICAgICAgc2VsZi5fb3V0ID0gX291dAorICAgICAgICBzZWxmLl9pbiA9IF9pbgorICAgICAgICBzZWxmLnNlbmQgPSBzZWxmLnNlbmRfYnl0ZXMgPSBfb3V0LnB1dAorICAgICAgICBzZWxmLnJlY3YgPSBzZWxmLnJlY3ZfYnl0ZXMgPSBfaW4uZ2V0CisKKyAgICBkZWYgcG9sbChzZWxmLCB0aW1lb3V0PTAuMCk6CisgICAgICAgIGlmIHNlbGYuX2luLnFzaXplKCkgPiAwOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgdGltZW91dCA8PSAwLjA6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgc2VsZi5faW4ubm90X2VtcHR5LmFjcXVpcmUoKQorICAgICAgICBzZWxmLl9pbi5ub3RfZW1wdHkud2FpdCh0aW1lb3V0KQorICAgICAgICBzZWxmLl9pbi5ub3RfZW1wdHkucmVsZWFzZSgpCisgICAgICAgIHJldHVybiBzZWxmLl9pbi5xc2l6ZSgpID4gMAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9jb25uZWN0aW9uLnB5YyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2R1bW15L2Nvbm5lY3Rpb24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjAwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9jb25uZWN0aW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9jb25uZWN0aW9uLnB5byBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2R1bW15L2Nvbm5lY3Rpb24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZjAwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9jb25uZWN0aW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9mb3JraW5nLnB5IGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZm9ya2luZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQ2NWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZm9ya2luZy5weQpAQCAtMCwwICsxLDUxMiBAQAorIworIyBNb2R1bGUgZm9yIHN0YXJ0aW5nIGEgcHJvY2VzcyBvYmplY3QgdXNpbmcgb3MuZm9yaygpIG9yIENyZWF0ZVByb2Nlc3MoKQorIworIyBtdWx0aXByb2Nlc3NpbmcvZm9ya2luZy5weQorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgUiBPdWRrZXJrCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyMgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBlcnJubworCitmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgdXRpbCwgcHJvY2VzcworCitfX2FsbF9fID0gWydQb3BlbicsICdhc3NlcnRfc3Bhd25pbmcnLCAnZXhpdCcsICdkdXBsaWNhdGUnLCAnY2xvc2UnLCAnRm9ya2luZ1BpY2tsZXInXQorCisjCisjIENoZWNrIHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHNwYXduaW5nIGEgY2hpbGQgcHJvY2VzcworIworCitkZWYgYXNzZXJ0X3NwYXduaW5nKHNlbGYpOgorICAgIGlmIG5vdCBQb3Blbi50aHJlYWRfaXNfc3Bhd25pbmcoKToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICAgJyVzIG9iamVjdHMgc2hvdWxkIG9ubHkgYmUgc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzJworICAgICAgICAgICAgJyB0aHJvdWdoIGluaGVyaXRhbmNlJyAlIHR5cGUoc2VsZikuX19uYW1lX18KKyAgICAgICAgICAgICkKKworIworIyBUcnkgbWFraW5nIHNvbWUgY2FsbGFibGUgdHlwZXMgcGlja2xhYmxlCisjCisKK2Zyb20gcGlja2xlIGltcG9ydCBQaWNrbGVyCitjbGFzcyBGb3JraW5nUGlja2xlcihQaWNrbGVyKToKKyAgICBkaXNwYXRjaCA9IFBpY2tsZXIuZGlzcGF0Y2guY29weSgpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgcmVnaXN0ZXIoY2xzLCB0eXBlLCByZWR1Y2UpOgorICAgICAgICBkZWYgZGlzcGF0Y2hlcihzZWxmLCBvYmopOgorICAgICAgICAgICAgcnYgPSByZWR1Y2Uob2JqKQorICAgICAgICAgICAgc2VsZi5zYXZlX3JlZHVjZShvYmo9b2JqLCAqcnYpCisgICAgICAgIGNscy5kaXNwYXRjaFt0eXBlXSA9IGRpc3BhdGNoZXIKKworZGVmIF9yZWR1Y2VfbWV0aG9kKG0pOgorICAgIGlmIG0uaW1fc2VsZiBpcyBOb25lOgorICAgICAgICByZXR1cm4gZ2V0YXR0ciwgKG0uaW1fY2xhc3MsIG0uaW1fZnVuYy5mdW5jX25hbWUpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGdldGF0dHIsIChtLmltX3NlbGYsIG0uaW1fZnVuYy5mdW5jX25hbWUpCitGb3JraW5nUGlja2xlci5yZWdpc3Rlcih0eXBlKEZvcmtpbmdQaWNrbGVyLnNhdmUpLCBfcmVkdWNlX21ldGhvZCkKKworZGVmIF9yZWR1Y2VfbWV0aG9kX2Rlc2NyaXB0b3IobSk6CisgICAgcmV0dXJuIGdldGF0dHIsIChtLl9fb2JqY2xhc3NfXywgbS5fX25hbWVfXykKK0ZvcmtpbmdQaWNrbGVyLnJlZ2lzdGVyKHR5cGUobGlzdC5hcHBlbmQpLCBfcmVkdWNlX21ldGhvZF9kZXNjcmlwdG9yKQorRm9ya2luZ1BpY2tsZXIucmVnaXN0ZXIodHlwZShpbnQuX19hZGRfXyksIF9yZWR1Y2VfbWV0aG9kX2Rlc2NyaXB0b3IpCisKKyNkZWYgX3JlZHVjZV9idWlsdGluX2Z1bmN0aW9uX29yX21ldGhvZChtKToKKyMgICAgcmV0dXJuIGdldGF0dHIsIChtLl9fc2VsZl9fLCBtLl9fbmFtZV9fKQorI0ZvcmtpbmdQaWNrbGVyLnJlZ2lzdGVyKHR5cGUobGlzdCgpLmFwcGVuZCksIF9yZWR1Y2VfYnVpbHRpbl9mdW5jdGlvbl9vcl9tZXRob2QpCisjRm9ya2luZ1BpY2tsZXIucmVnaXN0ZXIodHlwZShpbnQoKS5fX2FkZF9fKSwgX3JlZHVjZV9idWlsdGluX2Z1bmN0aW9uX29yX21ldGhvZCkKKwordHJ5OgorICAgIGZyb20gZnVuY3Rvb2xzIGltcG9ydCBwYXJ0aWFsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBkZWYgX3JlZHVjZV9wYXJ0aWFsKHApOgorICAgICAgICByZXR1cm4gX3JlYnVpbGRfcGFydGlhbCwgKHAuZnVuYywgcC5hcmdzLCBwLmtleXdvcmRzIG9yIHt9KQorICAgIGRlZiBfcmVidWlsZF9wYXJ0aWFsKGZ1bmMsIGFyZ3MsIGtleXdvcmRzKToKKyAgICAgICAgcmV0dXJuIHBhcnRpYWwoZnVuYywgKmFyZ3MsICoqa2V5d29yZHMpCisgICAgRm9ya2luZ1BpY2tsZXIucmVnaXN0ZXIocGFydGlhbCwgX3JlZHVjZV9wYXJ0aWFsKQorCisjCisjIFVuaXgKKyMKKworaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6CisgICAgaW1wb3J0IHRpbWUKKworICAgIGV4aXQgPSBvcy5fZXhpdAorICAgIGR1cGxpY2F0ZSA9IG9zLmR1cAorICAgIGNsb3NlID0gb3MuY2xvc2UKKworICAgICMKKyAgICAjIFdlIGRlZmluZSBhIFBvcGVuIGNsYXNzIHNpbWlsYXIgdG8gdGhlIG9uZSBmcm9tIHN1YnByb2Nlc3MsIGJ1dAorICAgICMgd2hvc2UgY29uc3RydWN0b3IgdGFrZXMgYSBwcm9jZXNzIG9iamVjdCBhcyBpdHMgYXJndW1lbnQuCisgICAgIworCisgICAgY2xhc3MgUG9wZW4ob2JqZWN0KToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc19vYmopOgorICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IE5vbmUKKworICAgICAgICAgICAgc2VsZi5waWQgPSBvcy5mb3JrKCkKKyAgICAgICAgICAgIGlmIHNlbGYucGlkID09IDA6CisgICAgICAgICAgICAgICAgaWYgJ3JhbmRvbScgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCByYW5kb20KKyAgICAgICAgICAgICAgICAgICAgcmFuZG9tLnNlZWQoKQorICAgICAgICAgICAgICAgIGNvZGUgPSBwcm9jZXNzX29iai5fYm9vdHN0cmFwKCkKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgICAgICAgICBvcy5fZXhpdChjb2RlKQorCisgICAgICAgIGRlZiBwb2xsKHNlbGYsIGZsYWc9b3MuV05PSEFORyk6CisgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBwaWQsIHN0cyA9IG9zLndhaXRwaWQoc2VsZi5waWQsIGZsYWcpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGlsZCBwcm9jZXNzIG5vdCB5ZXQgY3JlYXRlZC4gU2VlICMxNzMxNzE3CisgICAgICAgICAgICAgICAgICAgICAgICAjIGUuZXJybm8gPT0gZXJybm8uRUNISUxEID09IDEwCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBwaWQgPT0gc2VsZi5waWQ6CisgICAgICAgICAgICAgICAgICAgIGlmIG9zLldJRlNJR05BTEVEKHN0cyk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSAtb3MuV1RFUk1TSUcoc3RzKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG9zLldJRkVYSVRFRChzdHMpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBvcy5XRVhJVFNUQVRVUyhzdHMpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCisKKyAgICAgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wb2xsKDApCisgICAgICAgICAgICBkZWFkbGluZSA9IHRpbWUudGltZSgpICsgdGltZW91dAorICAgICAgICAgICAgZGVsYXkgPSAwLjAwMDUKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgcmVzID0gc2VsZi5wb2xsKCkKKyAgICAgICAgICAgICAgICBpZiByZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcmVtYWluaW5nID0gZGVhZGxpbmUgLSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgICAgIGlmIHJlbWFpbmluZyA8PSAwOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGRlbGF5ID0gbWluKGRlbGF5ICogMiwgcmVtYWluaW5nLCAwLjA1KQorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoZGVsYXkpCisgICAgICAgICAgICByZXR1cm4gcmVzCisKKyAgICAgICAgZGVmIHRlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3Mua2lsbChzZWxmLnBpZCwgc2lnbmFsLlNJR1RFUk0pCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYud2FpdCh0aW1lb3V0PTAuMSkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICBkZWYgdGhyZWFkX2lzX3NwYXduaW5nKCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworIworIyBXaW5kb3dzCisjCisKK2Vsc2U6CisgICAgaW1wb3J0IHRocmVhZAorICAgIGltcG9ydCBtc3ZjcnQKKyAgICBpbXBvcnQgX3N1YnByb2Nlc3MKKyAgICBpbXBvcnQgdGltZQorCisgICAgZnJvbSBfbXVsdGlwcm9jZXNzaW5nIGltcG9ydCB3aW4zMiwgQ29ubmVjdGlvbiwgUGlwZUNvbm5lY3Rpb24KKyAgICBmcm9tIC51dGlsIGltcG9ydCBGaW5hbGl6ZQorCisgICAgI3RyeToKKyAgICAjICAgIGZyb20gY1BpY2tsZSBpbXBvcnQgZHVtcCwgbG9hZCwgSElHSEVTVF9QUk9UT0NPTAorICAgICNleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBwaWNrbGUgaW1wb3J0IGxvYWQsIEhJR0hFU1RfUFJPVE9DT0wKKworICAgIGRlZiBkdW1wKG9iaiwgZmlsZSwgcHJvdG9jb2w9Tm9uZSk6CisgICAgICAgIEZvcmtpbmdQaWNrbGVyKGZpbGUsIHByb3RvY29sKS5kdW1wKG9iaikKKworICAgICMKKyAgICAjCisgICAgIworCisgICAgVEVSTUlOQVRFID0gMHgxMDAwMAorICAgIFdJTkVYRSA9IChzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBhbmQgZ2V0YXR0cihzeXMsICdmcm96ZW4nLCBGYWxzZSkpCisgICAgV0lOU0VSVklDRSA9IHN5cy5leGVjdXRhYmxlLmxvd2VyKCkuZW5kc3dpdGgoInB5dGhvbnNlcnZpY2UuZXhlIikKKworICAgIGV4aXQgPSB3aW4zMi5FeGl0UHJvY2VzcworICAgIGNsb3NlID0gd2luMzIuQ2xvc2VIYW5kbGUKKworICAgICMKKyAgICAjIF9weXRob25fZXhlIGlzIHRoZSBhc3N1bWVkIHBhdGggdG8gdGhlIHB5dGhvbiBleGVjdXRhYmxlLgorICAgICMgUGVvcGxlIGVtYmVkZGluZyBQeXRob24gd2FudCB0byBtb2RpZnkgaXQuCisgICAgIworCisgICAgaWYgV0lOU0VSVklDRToKKyAgICAgICAgX3B5dGhvbl9leGUgPSBvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LCAncHl0aG9uLmV4ZScpCisgICAgZWxzZToKKyAgICAgICAgX3B5dGhvbl9leGUgPSBzeXMuZXhlY3V0YWJsZQorCisgICAgZGVmIHNldF9leGVjdXRhYmxlKGV4ZSk6CisgICAgICAgIGdsb2JhbCBfcHl0aG9uX2V4ZQorICAgICAgICBfcHl0aG9uX2V4ZSA9IGV4ZQorCisgICAgIworICAgICMKKyAgICAjCisKKyAgICBkZWYgZHVwbGljYXRlKGhhbmRsZSwgdGFyZ2V0X3Byb2Nlc3M9Tm9uZSwgaW5oZXJpdGFibGU9RmFsc2UpOgorICAgICAgICBpZiB0YXJnZXRfcHJvY2VzcyBpcyBOb25lOgorICAgICAgICAgICAgdGFyZ2V0X3Byb2Nlc3MgPSBfc3VicHJvY2Vzcy5HZXRDdXJyZW50UHJvY2VzcygpCisgICAgICAgIHJldHVybiBfc3VicHJvY2Vzcy5EdXBsaWNhdGVIYW5kbGUoCisgICAgICAgICAgICBfc3VicHJvY2Vzcy5HZXRDdXJyZW50UHJvY2VzcygpLCBoYW5kbGUsIHRhcmdldF9wcm9jZXNzLAorICAgICAgICAgICAgMCwgaW5oZXJpdGFibGUsIF9zdWJwcm9jZXNzLkRVUExJQ0FURV9TQU1FX0FDQ0VTUworICAgICAgICAgICAgKS5EZXRhY2goKQorCisgICAgIworICAgICMgV2UgZGVmaW5lIGEgUG9wZW4gY2xhc3Mgc2ltaWxhciB0byB0aGUgb25lIGZyb20gc3VicHJvY2VzcywgYnV0CisgICAgIyB3aG9zZSBjb25zdHJ1Y3RvciB0YWtlcyBhIHByb2Nlc3Mgb2JqZWN0IGFzIGl0cyBhcmd1bWVudC4KKyAgICAjCisKKyAgICBjbGFzcyBQb3BlbihvYmplY3QpOgorICAgICAgICAnJycKKyAgICAgICAgU3RhcnQgYSBzdWJwcm9jZXNzIHRvIHJ1biB0aGUgY29kZSBvZiBhIHByb2Nlc3Mgb2JqZWN0CisgICAgICAgICcnJworICAgICAgICBfdGxzID0gdGhyZWFkLl9sb2NhbCgpCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3Nfb2JqKToKKyAgICAgICAgICAgICMgY3JlYXRlIHBpcGUgZm9yIGNvbW11bmljYXRpb24gd2l0aCBjaGlsZAorICAgICAgICAgICAgcmZkLCB3ZmQgPSBvcy5waXBlKCkKKworICAgICAgICAgICAgIyBnZXQgaGFuZGxlIGZvciByZWFkIGVuZCBvZiB0aGUgcGlwZSBhbmQgbWFrZSBpdCBpbmhlcml0YWJsZQorICAgICAgICAgICAgcmhhbmRsZSA9IGR1cGxpY2F0ZShtc3ZjcnQuZ2V0X29zZmhhbmRsZShyZmQpLCBpbmhlcml0YWJsZT1UcnVlKQorICAgICAgICAgICAgb3MuY2xvc2UocmZkKQorCisgICAgICAgICAgICAjIHN0YXJ0IHByb2Nlc3MKKyAgICAgICAgICAgIGNtZCA9IGdldF9jb21tYW5kX2xpbmUoKSArIFtyaGFuZGxlXQorICAgICAgICAgICAgY21kID0gJyAnLmpvaW4oJyIlcyInICUgeCBmb3IgeCBpbiBjbWQpCisgICAgICAgICAgICBocCwgaHQsIHBpZCwgdGlkID0gX3N1YnByb2Nlc3MuQ3JlYXRlUHJvY2VzcygKKyAgICAgICAgICAgICAgICBfcHl0aG9uX2V4ZSwgY21kLCBOb25lLCBOb25lLCAxLCAwLCBOb25lLCBOb25lLCBOb25lCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgaHQuQ2xvc2UoKQorICAgICAgICAgICAgY2xvc2UocmhhbmRsZSkKKworICAgICAgICAgICAgIyBzZXQgYXR0cmlidXRlcyBvZiBzZWxmCisgICAgICAgICAgICBzZWxmLnBpZCA9IHBpZAorICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gTm9uZQorICAgICAgICAgICAgc2VsZi5faGFuZGxlID0gaHAKKworICAgICAgICAgICAgIyBzZW5kIGluZm9ybWF0aW9uIHRvIGNoaWxkCisgICAgICAgICAgICBwcmVwX2RhdGEgPSBnZXRfcHJlcGFyYXRpb25fZGF0YShwcm9jZXNzX29iai5fbmFtZSkKKyAgICAgICAgICAgIHRvX2NoaWxkID0gb3MuZmRvcGVuKHdmZCwgJ3diJykKKyAgICAgICAgICAgIFBvcGVuLl90bHMucHJvY2Vzc19oYW5kbGUgPSBpbnQoaHApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZHVtcChwcmVwX2RhdGEsIHRvX2NoaWxkLCBISUdIRVNUX1BST1RPQ09MKQorICAgICAgICAgICAgICAgIGR1bXAocHJvY2Vzc19vYmosIHRvX2NoaWxkLCBISUdIRVNUX1BST1RPQ09MKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBkZWwgUG9wZW4uX3Rscy5wcm9jZXNzX2hhbmRsZQorICAgICAgICAgICAgICAgIHRvX2NoaWxkLmNsb3NlKCkKKworICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgIGRlZiB0aHJlYWRfaXNfc3Bhd25pbmcoKToKKyAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKFBvcGVuLl90bHMsICdwcm9jZXNzX2hhbmRsZScsIE5vbmUpIGlzIG5vdCBOb25lCisKKyAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICBkZWYgZHVwbGljYXRlX2Zvcl9jaGlsZChoYW5kbGUpOgorICAgICAgICAgICAgcmV0dXJuIGR1cGxpY2F0ZShoYW5kbGUsIFBvcGVuLl90bHMucHJvY2Vzc19oYW5kbGUpCisKKyAgICAgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbXNlY3MgPSBfc3VicHJvY2Vzcy5JTkZJTklURQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1zZWNzID0gbWF4KDAsIGludCh0aW1lb3V0ICogMTAwMCArIDAuNSkpCisKKyAgICAgICAgICAgICAgICByZXMgPSBfc3VicHJvY2Vzcy5XYWl0Rm9yU2luZ2xlT2JqZWN0KGludChzZWxmLl9oYW5kbGUpLCBtc2VjcykKKyAgICAgICAgICAgICAgICBpZiByZXMgPT0gX3N1YnByb2Nlc3MuV0FJVF9PQkpFQ1RfMDoKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IF9zdWJwcm9jZXNzLkdldEV4aXRDb2RlUHJvY2VzcyhzZWxmLl9oYW5kbGUpCisgICAgICAgICAgICAgICAgICAgIGlmIGNvZGUgPT0gVEVSTUlOQVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IC1zaWduYWwuU0lHVEVSTQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBjb2RlCisKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJldHVybmNvZGUKKworICAgICAgICBkZWYgcG9sbChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLndhaXQodGltZW91dD0wKQorCisgICAgICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIF9zdWJwcm9jZXNzLlRlcm1pbmF0ZVByb2Nlc3MoaW50KHNlbGYuX2hhbmRsZSksIFRFUk1JTkFURSkKKyAgICAgICAgICAgICAgICBleGNlcHQgV2luZG93c0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLndhaXQodGltZW91dD0wLjEpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgIworICAgICMKKyAgICAjCisKKyAgICBkZWYgaXNfZm9ya2luZyhhcmd2KToKKyAgICAgICAgJycnCisgICAgICAgIFJldHVybiB3aGV0aGVyIGNvbW1hbmRsaW5lIGluZGljYXRlcyB3ZSBhcmUgZm9ya2luZworICAgICAgICAnJycKKyAgICAgICAgaWYgbGVuKGFyZ3YpID49IDIgYW5kIGFyZ3ZbMV0gPT0gJy0tbXVsdGlwcm9jZXNzaW5nLWZvcmsnOgorICAgICAgICAgICAgYXNzZXJ0IGxlbihhcmd2KSA9PSAzCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKworICAgIGRlZiBmcmVlemVfc3VwcG9ydCgpOgorICAgICAgICAnJycKKyAgICAgICAgUnVuIGNvZGUgZm9yIHByb2Nlc3Mgb2JqZWN0IGlmIHRoaXMgaW4gbm90IHRoZSBtYWluIHByb2Nlc3MKKyAgICAgICAgJycnCisgICAgICAgIGlmIGlzX2Zvcmtpbmcoc3lzLmFyZ3YpOgorICAgICAgICAgICAgbWFpbigpCisgICAgICAgICAgICBzeXMuZXhpdCgpCisKKworICAgIGRlZiBnZXRfY29tbWFuZF9saW5lKCk6CisgICAgICAgICcnJworICAgICAgICBSZXR1cm5zIHByZWZpeCBvZiBjb21tYW5kIGxpbmUgdXNlZCBmb3Igc3Bhd25pbmcgYSBjaGlsZCBwcm9jZXNzCisgICAgICAgICcnJworICAgICAgICBpZiBnZXRhdHRyKHByb2Nlc3MuY3VycmVudF9wcm9jZXNzKCksICdfaW5oZXJpdGluZycsIEZhbHNlKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignJycKKyAgICAgICAgICAgIEF0dGVtcHQgdG8gc3RhcnQgYSBuZXcgcHJvY2VzcyBiZWZvcmUgdGhlIGN1cnJlbnQgcHJvY2VzcworICAgICAgICAgICAgaGFzIGZpbmlzaGVkIGl0cyBib290c3RyYXBwaW5nIHBoYXNlLgorCisgICAgICAgICAgICBUaGlzIHByb2JhYmx5IG1lYW5zIHRoYXQgeW91IGFyZSBvbiBXaW5kb3dzIGFuZCB5b3UgaGF2ZQorICAgICAgICAgICAgZm9yZ290dGVuIHRvIHVzZSB0aGUgcHJvcGVyIGlkaW9tIGluIHRoZSBtYWluIG1vZHVsZToKKworICAgICAgICAgICAgICAgIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgICAgICAgICAgICAgICAgIGZyZWV6ZV9zdXBwb3J0KCkKKyAgICAgICAgICAgICAgICAgICAgLi4uCisKKyAgICAgICAgICAgIFRoZSAiZnJlZXplX3N1cHBvcnQoKSIgbGluZSBjYW4gYmUgb21pdHRlZCBpZiB0aGUgcHJvZ3JhbQorICAgICAgICAgICAgaXMgbm90IGdvaW5nIHRvIGJlIGZyb3plbiB0byBwcm9kdWNlIGEgV2luZG93cyBleGVjdXRhYmxlLicnJykKKworICAgICAgICBpZiBnZXRhdHRyKHN5cywgJ2Zyb3plbicsIEZhbHNlKToKKyAgICAgICAgICAgIHJldHVybiBbc3lzLmV4ZWN1dGFibGUsICctLW11bHRpcHJvY2Vzc2luZy1mb3JrJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByb2cgPSAnZnJvbSBtdWx0aXByb2Nlc3NpbmcuZm9ya2luZyBpbXBvcnQgbWFpbjsgbWFpbigpJworICAgICAgICAgICAgb3B0cyA9IHV0aWwuX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpCisgICAgICAgICAgICByZXR1cm4gW19weXRob25fZXhlXSArIG9wdHMgKyBbJy1jJywgcHJvZywgJy0tbXVsdGlwcm9jZXNzaW5nLWZvcmsnXQorCisKKyAgICBkZWYgbWFpbigpOgorICAgICAgICAnJycKKyAgICAgICAgUnVuIGNvZGUgc3BlY2lmZWQgYnkgZGF0YSByZWNlaXZlZCBvdmVyIHBpcGUKKyAgICAgICAgJycnCisgICAgICAgIGFzc2VydCBpc19mb3JraW5nKHN5cy5hcmd2KQorCisgICAgICAgIGhhbmRsZSA9IGludChzeXMuYXJndlstMV0pCisgICAgICAgIGZkID0gbXN2Y3J0Lm9wZW5fb3NmaGFuZGxlKGhhbmRsZSwgb3MuT19SRE9OTFkpCisgICAgICAgIGZyb21fcGFyZW50ID0gb3MuZmRvcGVuKGZkLCAncmInKQorCisgICAgICAgIHByb2Nlc3MuY3VycmVudF9wcm9jZXNzKCkuX2luaGVyaXRpbmcgPSBUcnVlCisgICAgICAgIHByZXBhcmF0aW9uX2RhdGEgPSBsb2FkKGZyb21fcGFyZW50KQorICAgICAgICBwcmVwYXJlKHByZXBhcmF0aW9uX2RhdGEpCisgICAgICAgIHNlbGYgPSBsb2FkKGZyb21fcGFyZW50KQorICAgICAgICBwcm9jZXNzLmN1cnJlbnRfcHJvY2VzcygpLl9pbmhlcml0aW5nID0gRmFsc2UKKworICAgICAgICBmcm9tX3BhcmVudC5jbG9zZSgpCisKKyAgICAgICAgZXhpdGNvZGUgPSBzZWxmLl9ib290c3RyYXAoKQorICAgICAgICBleGl0KGV4aXRjb2RlKQorCisKKyAgICBkZWYgZ2V0X3ByZXBhcmF0aW9uX2RhdGEobmFtZSk6CisgICAgICAgICcnJworICAgICAgICBSZXR1cm4gaW5mbyBhYm91dCBwYXJlbnQgbmVlZGVkIGJ5IGNoaWxkIHRvIHVucGlja2xlIHByb2Nlc3Mgb2JqZWN0CisgICAgICAgICcnJworICAgICAgICBmcm9tIC51dGlsIGltcG9ydCBfbG9nZ2VyLCBfbG9nX3RvX3N0ZGVycgorCisgICAgICAgIGQgPSBkaWN0KAorICAgICAgICAgICAgbmFtZT1uYW1lLAorICAgICAgICAgICAgc3lzX3BhdGg9c3lzLnBhdGgsCisgICAgICAgICAgICBzeXNfYXJndj1zeXMuYXJndiwKKyAgICAgICAgICAgIGxvZ190b19zdGRlcnI9X2xvZ190b19zdGRlcnIsCisgICAgICAgICAgICBvcmlnX2Rpcj1wcm9jZXNzLk9SSUdJTkFMX0RJUiwKKyAgICAgICAgICAgIGF1dGhrZXk9cHJvY2Vzcy5jdXJyZW50X3Byb2Nlc3MoKS5hdXRoa2V5LAorICAgICAgICAgICAgKQorCisgICAgICAgIGlmIF9sb2dnZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkWydsb2dfbGV2ZWwnXSA9IF9sb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKQorCisgICAgICAgIGlmIG5vdCBXSU5FWEUgYW5kIG5vdCBXSU5TRVJWSUNFOgorICAgICAgICAgICAgbWFpbl9wYXRoID0gZ2V0YXR0cihzeXMubW9kdWxlc1snX19tYWluX18nXSwgJ19fZmlsZV9fJywgTm9uZSkKKyAgICAgICAgICAgIGlmIG5vdCBtYWluX3BhdGggYW5kIHN5cy5hcmd2WzBdIG5vdCBpbiAoJycsICctYycpOgorICAgICAgICAgICAgICAgIG1haW5fcGF0aCA9IHN5cy5hcmd2WzBdCisgICAgICAgICAgICBpZiBtYWluX3BhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMobWFpbl9wYXRoKSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5PUklHSU5BTF9ESVIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG1haW5fcGF0aCA9IG9zLnBhdGguam9pbihwcm9jZXNzLk9SSUdJTkFMX0RJUiwgbWFpbl9wYXRoKQorICAgICAgICAgICAgICAgIGRbJ21haW5fcGF0aCddID0gb3MucGF0aC5ub3JtcGF0aChtYWluX3BhdGgpCisKKyAgICAgICAgcmV0dXJuIGQKKworICAgICMKKyAgICAjIE1ha2UgKFBpcGUpQ29ubmVjdGlvbiBwaWNrbGFibGUKKyAgICAjCisKKyAgICBkZWYgcmVkdWNlX2Nvbm5lY3Rpb24oY29ubik6CisgICAgICAgIGlmIG5vdCBQb3Blbi50aHJlYWRfaXNfc3Bhd25pbmcoKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAgICAgICAnQnkgZGVmYXVsdCAlcyBvYmplY3RzIGNhbiBvbmx5IGJlIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3Nlc1xuJworICAgICAgICAgICAgICAgICd1c2luZyBpbmhlcml0YW5jZScgJSB0eXBlKGNvbm4pLl9fbmFtZV9fCisgICAgICAgICAgICAgICAgKQorICAgICAgICByZXR1cm4gdHlwZShjb25uKSwgKFBvcGVuLmR1cGxpY2F0ZV9mb3JfY2hpbGQoY29ubi5maWxlbm8oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubi5yZWFkYWJsZSwgY29ubi53cml0YWJsZSkKKworICAgIEZvcmtpbmdQaWNrbGVyLnJlZ2lzdGVyKENvbm5lY3Rpb24sIHJlZHVjZV9jb25uZWN0aW9uKQorICAgIEZvcmtpbmdQaWNrbGVyLnJlZ2lzdGVyKFBpcGVDb25uZWN0aW9uLCByZWR1Y2VfY29ubmVjdGlvbikKKworIworIyBQcmVwYXJlIGN1cnJlbnQgcHJvY2VzcworIworCitvbGRfbWFpbl9tb2R1bGVzID0gW10KKworZGVmIHByZXBhcmUoZGF0YSk6CisgICAgJycnCisgICAgVHJ5IHRvIGdldCBjdXJyZW50IHByb2Nlc3MgcmVhZHkgdG8gdW5waWNrbGUgcHJvY2VzcyBvYmplY3QKKyAgICAnJycKKyAgICBvbGRfbWFpbl9tb2R1bGVzLmFwcGVuZChzeXMubW9kdWxlc1snX19tYWluX18nXSkKKworICAgIGlmICduYW1lJyBpbiBkYXRhOgorICAgICAgICBwcm9jZXNzLmN1cnJlbnRfcHJvY2VzcygpLm5hbWUgPSBkYXRhWyduYW1lJ10KKworICAgIGlmICdhdXRoa2V5JyBpbiBkYXRhOgorICAgICAgICBwcm9jZXNzLmN1cnJlbnRfcHJvY2VzcygpLl9hdXRoa2V5ID0gZGF0YVsnYXV0aGtleSddCisKKyAgICBpZiAnbG9nX3RvX3N0ZGVycicgaW4gZGF0YSBhbmQgZGF0YVsnbG9nX3RvX3N0ZGVyciddOgorICAgICAgICB1dGlsLmxvZ190b19zdGRlcnIoKQorCisgICAgaWYgJ2xvZ19sZXZlbCcgaW4gZGF0YToKKyAgICAgICAgdXRpbC5nZXRfbG9nZ2VyKCkuc2V0TGV2ZWwoZGF0YVsnbG9nX2xldmVsJ10pCisKKyAgICBpZiAnc3lzX3BhdGgnIGluIGRhdGE6CisgICAgICAgIHN5cy5wYXRoID0gZGF0YVsnc3lzX3BhdGgnXQorCisgICAgaWYgJ3N5c19hcmd2JyBpbiBkYXRhOgorICAgICAgICBzeXMuYXJndiA9IGRhdGFbJ3N5c19hcmd2J10KKworICAgIGlmICdkaXInIGluIGRhdGE6CisgICAgICAgIG9zLmNoZGlyKGRhdGFbJ2RpciddKQorCisgICAgaWYgJ29yaWdfZGlyJyBpbiBkYXRhOgorICAgICAgICBwcm9jZXNzLk9SSUdJTkFMX0RJUiA9IGRhdGFbJ29yaWdfZGlyJ10KKworICAgIGlmICdtYWluX3BhdGgnIGluIGRhdGE6CisgICAgICAgIG1haW5fcGF0aCA9IGRhdGFbJ21haW5fcGF0aCddCisgICAgICAgIG1haW5fbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShtYWluX3BhdGgpKVswXQorICAgICAgICBpZiBtYWluX25hbWUgPT0gJ19faW5pdF9fJzoKKyAgICAgICAgICAgIG1haW5fbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUob3MucGF0aC5kaXJuYW1lKG1haW5fcGF0aCkpCisKKyAgICAgICAgaWYgbWFpbl9uYW1lICE9ICdpcHl0aG9uJzoKKyAgICAgICAgICAgIGltcG9ydCBpbXAKKworICAgICAgICAgICAgaWYgbWFpbl9wYXRoIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGlycyA9IE5vbmUKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5iYXNlbmFtZShtYWluX3BhdGgpLnN0YXJ0c3dpdGgoJ19faW5pdF9fLnB5Jyk6CisgICAgICAgICAgICAgICAgZGlycyA9IFtvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG1haW5fcGF0aCkpXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkaXJzID0gW29zLnBhdGguZGlybmFtZShtYWluX3BhdGgpXQorCisgICAgICAgICAgICBhc3NlcnQgbWFpbl9uYW1lIG5vdCBpbiBzeXMubW9kdWxlcywgbWFpbl9uYW1lCisgICAgICAgICAgICBmaWxlLCBwYXRoX25hbWUsIGV0YyA9IGltcC5maW5kX21vZHVsZShtYWluX25hbWUsIGRpcnMpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBXZSB3b3VsZCBsaWtlIHRvIGRvICJpbXAubG9hZF9tb2R1bGUoJ19fbWFpbl9fJywgLi4uKSIKKyAgICAgICAgICAgICAgICAjIGhlcmUuICBIb3dldmVyLCB0aGF0IHdvdWxkIGNhdXNlICdpZiBfX25hbWVfXyA9PQorICAgICAgICAgICAgICAgICMgIl9fbWFpbl9fIicgY2xhdXNlcyB0byBiZSBleGVjdXRlZC4KKyAgICAgICAgICAgICAgICBtYWluX21vZHVsZSA9IGltcC5sb2FkX21vZHVsZSgKKyAgICAgICAgICAgICAgICAgICAgJ19fcGFyZW50c19tYWluX18nLCBmaWxlLCBwYXRoX25hbWUsIGV0YworICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIGZpbGU6CisgICAgICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorCisgICAgICAgICAgICBzeXMubW9kdWxlc1snX19tYWluX18nXSA9IG1haW5fbW9kdWxlCisgICAgICAgICAgICBtYWluX21vZHVsZS5fX25hbWVfXyA9ICdfX21haW5fXycKKworICAgICAgICAgICAgIyBUcnkgdG8gbWFrZSB0aGUgcG90ZW50aWFsbHkgcGlja2xhYmxlIG9iamVjdHMgaW4KKyAgICAgICAgICAgICMgc3lzLm1vZHVsZXNbJ19fbWFpbl9fJ10gcmVhbGl6ZSB0aGV5IGFyZSBpbiB0aGUgbWFpbgorICAgICAgICAgICAgIyBtb2R1bGUgLS0gc29tZXdoYXQgdWdseS4KKyAgICAgICAgICAgIGZvciBvYmogaW4gbWFpbl9tb2R1bGUuX19kaWN0X18udmFsdWVzKCk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBvYmouX19tb2R1bGVfXyA9PSAnX19wYXJlbnRzX21haW5fXyc6CisgICAgICAgICAgICAgICAgICAgICAgICBvYmouX19tb2R1bGVfXyA9ICdfX21haW5fXycKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9mb3JraW5nLnB5YyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2ZvcmtpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMGY1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9mb3JraW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9mb3JraW5nLnB5byBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2ZvcmtpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNGFjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9mb3JraW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9oZWFwLnB5IGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvaGVhcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWYzNzExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvaGVhcC5weQpAQCAtMCwwICsxLDI1NCBAQAorIworIyBNb2R1bGUgd2hpY2ggc3VwcG9ydHMgYWxsb2NhdGlvbiBvZiBtZW1vcnkgZnJvbSBhbiBtbWFwCisjCisjIG11bHRpcHJvY2Vzc2luZy9oZWFwLnB5CisjCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4LCBSIE91ZGtlcmsKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZQorIyAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisKK2ltcG9ydCBiaXNlY3QKK2ltcG9ydCBtbWFwCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRocmVhZGluZworaW1wb3J0IGl0ZXJ0b29scworCitpbXBvcnQgX211bHRpcHJvY2Vzc2luZworZnJvbSBtdWx0aXByb2Nlc3NpbmcudXRpbCBpbXBvcnQgRmluYWxpemUsIGluZm8KK2Zyb20gbXVsdGlwcm9jZXNzaW5nLmZvcmtpbmcgaW1wb3J0IGFzc2VydF9zcGF3bmluZworCitfX2FsbF9fID0gWydCdWZmZXJXcmFwcGVyJ10KKworIworIyBJbmhlaXJ0YWJsZSBjbGFzcyB3aGljaCB3cmFwcyBhbiBtbWFwLCBhbmQgZnJvbSB3aGljaCBibG9ja3MgY2FuIGJlIGFsbG9jYXRlZAorIworCitpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKworICAgIGZyb20gX211bHRpcHJvY2Vzc2luZyBpbXBvcnQgd2luMzIKKworICAgIGNsYXNzIEFyZW5hKG9iamVjdCk6CisKKyAgICAgICAgX2NvdW50ZXIgPSBpdGVydG9vbHMuY291bnQoKQorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToKKyAgICAgICAgICAgIHNlbGYuc2l6ZSA9IHNpemUKKyAgICAgICAgICAgIHNlbGYubmFtZSA9ICdweW0tJWQtJWQnICUgKG9zLmdldHBpZCgpLCBBcmVuYS5fY291bnRlci5uZXh0KCkpCisgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IG1tYXAubW1hcCgtMSwgc2VsZi5zaXplLCB0YWduYW1lPXNlbGYubmFtZSkKKyAgICAgICAgICAgIGFzc2VydCB3aW4zMi5HZXRMYXN0RXJyb3IoKSA9PSAwLCAndGFnbmFtZSBhbHJlYWR5IGluIHVzZScKKyAgICAgICAgICAgIHNlbGYuX3N0YXRlID0gKHNlbGYuc2l6ZSwgc2VsZi5uYW1lKQorCisgICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICAgICBhc3NlcnRfc3Bhd25pbmcoc2VsZikKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zdGF0ZQorCisgICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAgICAgc2VsZi5zaXplLCBzZWxmLm5hbWUgPSBzZWxmLl9zdGF0ZSA9IHN0YXRlCisgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IG1tYXAubW1hcCgtMSwgc2VsZi5zaXplLCB0YWduYW1lPXNlbGYubmFtZSkKKyAgICAgICAgICAgIGFzc2VydCB3aW4zMi5HZXRMYXN0RXJyb3IoKSA9PSB3aW4zMi5FUlJPUl9BTFJFQURZX0VYSVNUUworCitlbHNlOgorCisgICAgY2xhc3MgQXJlbmEob2JqZWN0KToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6CisgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IG1tYXAubW1hcCgtMSwgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuc2l6ZSA9IHNpemUKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IE5vbmUKKworIworIyBDbGFzcyBhbGxvd2luZyBhbGxvY2F0aW9uIG9mIGNodW5rcyBvZiBtZW1vcnkgZnJvbSBhcmVuYXMKKyMKKworY2xhc3MgSGVhcChvYmplY3QpOgorCisgICAgX2FsaWdubWVudCA9IDgKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplPW1tYXAuUEFHRVNJWkUpOgorICAgICAgICBzZWxmLl9sYXN0cGlkID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgc2VsZi5fbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKyAgICAgICAgc2VsZi5fc2l6ZSA9IHNpemUKKyAgICAgICAgc2VsZi5fbGVuZ3RocyA9IFtdCisgICAgICAgIHNlbGYuX2xlbl90b19zZXEgPSB7fQorICAgICAgICBzZWxmLl9zdGFydF90b19ibG9jayA9IHt9CisgICAgICAgIHNlbGYuX3N0b3BfdG9fYmxvY2sgPSB7fQorICAgICAgICBzZWxmLl9hbGxvY2F0ZWRfYmxvY2tzID0gc2V0KCkKKyAgICAgICAgc2VsZi5fYXJlbmFzID0gW10KKyAgICAgICAgIyBsaXN0IG9mIHBlbmRpbmcgYmxvY2tzIHRvIGZyZWUgLSBzZWUgZnJlZSgpIGNvbW1lbnQgYmVsb3cKKyAgICAgICAgc2VsZi5fcGVuZGluZ19mcmVlX2Jsb2NrcyA9IFtdCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9yb3VuZHVwKG4sIGFsaWdubWVudCk6CisgICAgICAgICMgYWxpZ25tZW50IG11c3QgYmUgYSBwb3dlciBvZiAyCisgICAgICAgIG1hc2sgPSBhbGlnbm1lbnQgLSAxCisgICAgICAgIHJldHVybiAobiArIG1hc2spICYgfm1hc2sKKworICAgIGRlZiBfbWFsbG9jKHNlbGYsIHNpemUpOgorICAgICAgICAjIHJldHVybnMgYSBsYXJnZSBlbm91Z2ggYmxvY2sgLS0gaXQgbWlnaHQgYmUgbXVjaCBsYXJnZXIKKyAgICAgICAgaSA9IGJpc2VjdC5iaXNlY3RfbGVmdChzZWxmLl9sZW5ndGhzLCBzaXplKQorICAgICAgICBpZiBpID09IGxlbihzZWxmLl9sZW5ndGhzKToKKyAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYuX3JvdW5kdXAobWF4KHNlbGYuX3NpemUsIHNpemUpLCBtbWFwLlBBR0VTSVpFKQorICAgICAgICAgICAgc2VsZi5fc2l6ZSAqPSAyCisgICAgICAgICAgICBpbmZvKCdhbGxvY2F0aW5nIGEgbmV3IG1tYXAgb2YgbGVuZ3RoICVkJywgbGVuZ3RoKQorICAgICAgICAgICAgYXJlbmEgPSBBcmVuYShsZW5ndGgpCisgICAgICAgICAgICBzZWxmLl9hcmVuYXMuYXBwZW5kKGFyZW5hKQorICAgICAgICAgICAgcmV0dXJuIChhcmVuYSwgMCwgbGVuZ3RoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5fbGVuZ3Roc1tpXQorICAgICAgICAgICAgc2VxID0gc2VsZi5fbGVuX3RvX3NlcVtsZW5ndGhdCisgICAgICAgICAgICBibG9jayA9IHNlcS5wb3AoKQorICAgICAgICAgICAgaWYgbm90IHNlcToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fbGVuX3RvX3NlcVtsZW5ndGhdLCBzZWxmLl9sZW5ndGhzW2ldCisKKyAgICAgICAgKGFyZW5hLCBzdGFydCwgc3RvcCkgPSBibG9jaworICAgICAgICBkZWwgc2VsZi5fc3RhcnRfdG9fYmxvY2tbKGFyZW5hLCBzdGFydCldCisgICAgICAgIGRlbCBzZWxmLl9zdG9wX3RvX2Jsb2NrWyhhcmVuYSwgc3RvcCldCisgICAgICAgIHJldHVybiBibG9jaworCisgICAgZGVmIF9mcmVlKHNlbGYsIGJsb2NrKToKKyAgICAgICAgIyBmcmVlIGxvY2F0aW9uIGFuZCB0cnkgdG8gbWVyZ2Ugd2l0aCBuZWlnaGJvdXJzCisgICAgICAgIChhcmVuYSwgc3RhcnQsIHN0b3ApID0gYmxvY2sKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmV2X2Jsb2NrID0gc2VsZi5fc3RvcF90b19ibG9ja1soYXJlbmEsIHN0YXJ0KV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhcnQsIF8gPSBzZWxmLl9hYnNvcmIocHJldl9ibG9jaykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXh0X2Jsb2NrID0gc2VsZi5fc3RhcnRfdG9fYmxvY2tbKGFyZW5hLCBzdG9wKV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgXywgc3RvcCA9IHNlbGYuX2Fic29yYihuZXh0X2Jsb2NrKQorCisgICAgICAgIGJsb2NrID0gKGFyZW5hLCBzdGFydCwgc3RvcCkKKyAgICAgICAgbGVuZ3RoID0gc3RvcCAtIHN0YXJ0CisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fbGVuX3RvX3NlcVtsZW5ndGhdLmFwcGVuZChibG9jaykKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZi5fbGVuX3RvX3NlcVtsZW5ndGhdID0gW2Jsb2NrXQorICAgICAgICAgICAgYmlzZWN0Lmluc29ydChzZWxmLl9sZW5ndGhzLCBsZW5ndGgpCisKKyAgICAgICAgc2VsZi5fc3RhcnRfdG9fYmxvY2tbKGFyZW5hLCBzdGFydCldID0gYmxvY2sKKyAgICAgICAgc2VsZi5fc3RvcF90b19ibG9ja1soYXJlbmEsIHN0b3ApXSA9IGJsb2NrCisKKyAgICBkZWYgX2Fic29yYihzZWxmLCBibG9jayk6CisgICAgICAgICMgZGVyZWdpc3RlciB0aGlzIGJsb2NrIHNvIGl0IGNhbiBiZSBtZXJnZWQgd2l0aCBhIG5laWdoYm91cgorICAgICAgICAoYXJlbmEsIHN0YXJ0LCBzdG9wKSA9IGJsb2NrCisgICAgICAgIGRlbCBzZWxmLl9zdGFydF90b19ibG9ja1soYXJlbmEsIHN0YXJ0KV0KKyAgICAgICAgZGVsIHNlbGYuX3N0b3BfdG9fYmxvY2tbKGFyZW5hLCBzdG9wKV0KKworICAgICAgICBsZW5ndGggPSBzdG9wIC0gc3RhcnQKKyAgICAgICAgc2VxID0gc2VsZi5fbGVuX3RvX3NlcVtsZW5ndGhdCisgICAgICAgIHNlcS5yZW1vdmUoYmxvY2spCisgICAgICAgIGlmIG5vdCBzZXE6CisgICAgICAgICAgICBkZWwgc2VsZi5fbGVuX3RvX3NlcVtsZW5ndGhdCisgICAgICAgICAgICBzZWxmLl9sZW5ndGhzLnJlbW92ZShsZW5ndGgpCisKKyAgICAgICAgcmV0dXJuIHN0YXJ0LCBzdG9wCisKKyAgICBkZWYgX2ZyZWVfcGVuZGluZ19ibG9ja3Moc2VsZik6CisgICAgICAgICMgRnJlZSBhbGwgdGhlIGJsb2NrcyBpbiB0aGUgcGVuZGluZyBsaXN0IC0gY2FsbGVkIHdpdGggdGhlIGxvY2sgaGVsZC4KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBibG9jayA9IHNlbGYuX3BlbmRpbmdfZnJlZV9ibG9ja3MucG9wKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzZWxmLl9hbGxvY2F0ZWRfYmxvY2tzLnJlbW92ZShibG9jaykKKyAgICAgICAgICAgIHNlbGYuX2ZyZWUoYmxvY2spCisKKyAgICBkZWYgZnJlZShzZWxmLCBibG9jayk6CisgICAgICAgICMgZnJlZSBhIGJsb2NrIHJldHVybmVkIGJ5IG1hbGxvYygpCisgICAgICAgICMgU2luY2UgZnJlZSgpIGNhbiBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkgYnkgdGhlIEdDLCBpdCBjb3VsZCBoYXBwZW4KKyAgICAgICAgIyB0aGF0IGl0J3MgY2FsbGVkIHdoaWxlIHNlbGYuX2xvY2sgaXMgaGVsZDogaW4gdGhhdCBjYXNlLAorICAgICAgICAjIHNlbGYuX2xvY2suYWNxdWlyZSgpIHdvdWxkIGRlYWRsb2NrIChpc3N1ZSAjMTIzNTIpLiBUbyBhdm9pZCB0aGF0LCBhCisgICAgICAgICMgdHJ5bG9jayBpcyB1c2VkIGluc3RlYWQsIGFuZCBpZiB0aGUgbG9jayBjYW4ndCBiZSBhY3F1aXJlZAorICAgICAgICAjIGltbWVkaWF0ZWx5LCB0aGUgYmxvY2sgaXMgYWRkZWQgdG8gYSBsaXN0IG9mIGJsb2NrcyB0byBiZSBmcmVlZAorICAgICAgICAjIHN5bmNocm9ub3VzbHkgc29tZXRpbWVzIGxhdGVyIGZyb20gbWFsbG9jKCkgb3IgZnJlZSgpLCBieSBjYWxsaW5nCisgICAgICAgICMgX2ZyZWVfcGVuZGluZ19ibG9ja3MoKSAoYXBwZW5kaW5nIGFuZCByZXRyaWV2aW5nIGZyb20gYSBsaXN0IGlzIG5vdAorICAgICAgICAjIHN0cmljdGx5IHRocmVhZC1zYWZlIGJ1dCB1bmRlciBjUHl0aG9uIGl0J3MgYXRvbWljIHRoYW5rcyB0byB0aGUgR0lMKS4KKyAgICAgICAgYXNzZXJ0IG9zLmdldHBpZCgpID09IHNlbGYuX2xhc3RwaWQKKyAgICAgICAgaWYgbm90IHNlbGYuX2xvY2suYWNxdWlyZShGYWxzZSk6CisgICAgICAgICAgICAjIGNhbid0IGFjcXVpcmUgdGhlIGxvY2sgcmlnaHQgbm93LCBhZGQgdGhlIGJsb2NrIHRvIHRoZSBsaXN0IG9mCisgICAgICAgICAgICAjIHBlbmRpbmcgYmxvY2tzIHRvIGZyZWUKKyAgICAgICAgICAgIHNlbGYuX3BlbmRpbmdfZnJlZV9ibG9ja3MuYXBwZW5kKGJsb2NrKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB3ZSBob2xkIHRoZSBsb2NrCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fZnJlZV9wZW5kaW5nX2Jsb2NrcygpCisgICAgICAgICAgICAgICAgc2VsZi5fYWxsb2NhdGVkX2Jsb2Nrcy5yZW1vdmUoYmxvY2spCisgICAgICAgICAgICAgICAgc2VsZi5fZnJlZShibG9jaykKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBtYWxsb2Moc2VsZiwgc2l6ZSk6CisgICAgICAgICMgcmV0dXJuIGEgYmxvY2sgb2YgcmlnaHQgc2l6ZSAocG9zc2libHkgcm91bmRlZCB1cCkKKyAgICAgICAgYXNzZXJ0IDAgPD0gc2l6ZSA8IHN5cy5tYXhpbnQKKyAgICAgICAgaWYgb3MuZ2V0cGlkKCkgIT0gc2VsZi5fbGFzdHBpZDoKKyAgICAgICAgICAgIHNlbGYuX19pbml0X18oKSAgICAgICAgICAgICAgICAgICAgICMgcmVpbml0aWFsaXplIGFmdGVyIGZvcmsKKyAgICAgICAgc2VsZi5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5fZnJlZV9wZW5kaW5nX2Jsb2NrcygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNpemUgPSBzZWxmLl9yb3VuZHVwKG1heChzaXplLDEpLCBzZWxmLl9hbGlnbm1lbnQpCisgICAgICAgICAgICAoYXJlbmEsIHN0YXJ0LCBzdG9wKSA9IHNlbGYuX21hbGxvYyhzaXplKQorICAgICAgICAgICAgbmV3X3N0b3AgPSBzdGFydCArIHNpemUKKyAgICAgICAgICAgIGlmIG5ld19zdG9wIDwgc3RvcDoKKyAgICAgICAgICAgICAgICBzZWxmLl9mcmVlKChhcmVuYSwgbmV3X3N0b3AsIHN0b3ApKQorICAgICAgICAgICAgYmxvY2sgPSAoYXJlbmEsIHN0YXJ0LCBuZXdfc3RvcCkKKyAgICAgICAgICAgIHNlbGYuX2FsbG9jYXRlZF9ibG9ja3MuYWRkKGJsb2NrKQorICAgICAgICAgICAgcmV0dXJuIGJsb2NrCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorCisjCisjIENsYXNzIHJlcHJlc2VudGluZyBhIGNodW5rIG9mIGFuIG1tYXAgLS0gY2FuIGJlIGluaGVyaXRlZAorIworCitjbGFzcyBCdWZmZXJXcmFwcGVyKG9iamVjdCk6CisKKyAgICBfaGVhcCA9IEhlYXAoKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemUpOgorICAgICAgICBhc3NlcnQgMCA8PSBzaXplIDwgc3lzLm1heGludAorICAgICAgICBibG9jayA9IEJ1ZmZlcldyYXBwZXIuX2hlYXAubWFsbG9jKHNpemUpCisgICAgICAgIHNlbGYuX3N0YXRlID0gKGJsb2NrLCBzaXplKQorICAgICAgICBGaW5hbGl6ZShzZWxmLCBCdWZmZXJXcmFwcGVyLl9oZWFwLmZyZWUsIGFyZ3M9KGJsb2NrLCkpCisKKyAgICBkZWYgZ2V0X2FkZHJlc3Moc2VsZik6CisgICAgICAgIChhcmVuYSwgc3RhcnQsIHN0b3ApLCBzaXplID0gc2VsZi5fc3RhdGUKKyAgICAgICAgYWRkcmVzcywgbGVuZ3RoID0gX211bHRpcHJvY2Vzc2luZy5hZGRyZXNzX29mX2J1ZmZlcihhcmVuYS5idWZmZXIpCisgICAgICAgIGFzc2VydCBzaXplIDw9IGxlbmd0aAorICAgICAgICByZXR1cm4gYWRkcmVzcyArIHN0YXJ0CisKKyAgICBkZWYgZ2V0X3NpemUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zdGF0ZVsxXQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvaGVhcC5weWMgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9oZWFwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmNlYmZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvaGVhcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvaGVhcC5weW8gYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9oZWFwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWU5OTJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvaGVhcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvbWFuYWdlcnMucHkgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmU1ODEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvbWFuYWdlcnMucHkKQEAgLTAsMCArMSwxMTE2IEBACisjCisjIE1vZHVsZSBwcm92aWRpbmcgdGhlIGBTeW5jTWFuYWdlcmAgY2xhc3MgZm9yIGRlYWxpbmcKKyMgd2l0aCBzaGFyZWQgb2JqZWN0cworIworIyBtdWx0aXByb2Nlc3NpbmcvbWFuYWdlcnMucHkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDgsIFIgT3Vka2VyaworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlCisjICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKworX19hbGxfXyA9IFsgJ0Jhc2VNYW5hZ2VyJywgJ1N5bmNNYW5hZ2VyJywgJ0Jhc2VQcm94eScsICdUb2tlbicgXQorCisjCisjIEltcG9ydHMKKyMKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgd2Vha3JlZgoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IGFycmF5CitpbXBvcnQgUXVldWUKKworZnJvbSB0cmFjZWJhY2sgaW1wb3J0IGZvcm1hdF9leGMKK2Zyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBQcm9jZXNzLCBjdXJyZW50X3Byb2Nlc3MsIGFjdGl2ZV9jaGlsZHJlbiwgUG9vbCwgdXRpbCwgY29ubmVjdGlvbgorZnJvbSBtdWx0aXByb2Nlc3NpbmcucHJvY2VzcyBpbXBvcnQgQXV0aGVudGljYXRpb25TdHJpbmcKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLmZvcmtpbmcgaW1wb3J0IGV4aXQsIFBvcGVuLCBhc3NlcnRfc3Bhd25pbmcsIEZvcmtpbmdQaWNrbGVyCitmcm9tIG11bHRpcHJvY2Vzc2luZy51dGlsIGltcG9ydCBGaW5hbGl6ZSwgaW5mbworCit0cnk6CisgICAgZnJvbSBjUGlja2xlIGltcG9ydCBQaWNrbGluZ0Vycm9yCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBwaWNrbGUgaW1wb3J0IFBpY2tsaW5nRXJyb3IKKworIworIyBSZWdpc3RlciBzb21lIHRoaW5ncyBmb3IgcGlja2xpbmcKKyMKKworZGVmIHJlZHVjZV9hcnJheShhKToKKyAgICByZXR1cm4gYXJyYXkuYXJyYXksIChhLnR5cGVjb2RlLCBhLnRvc3RyaW5nKCkpCitGb3JraW5nUGlja2xlci5yZWdpc3RlcihhcnJheS5hcnJheSwgcmVkdWNlX2FycmF5KQorCit2aWV3X3R5cGVzID0gW3R5cGUoZ2V0YXR0cih7fSwgbmFtZSkoKSkgZm9yIG5hbWUgaW4gKCdpdGVtcycsJ2tleXMnLCd2YWx1ZXMnKV0KKworIworIyBUeXBlIGZvciBpZGVudGlmeWluZyBzaGFyZWQgb2JqZWN0cworIworCitjbGFzcyBUb2tlbihvYmplY3QpOgorICAgICcnJworICAgIFR5cGUgdG8gdW5pcXVlbHkgaW5kZW50aWZ5IGEgc2hhcmVkIG9iamVjdAorICAgICcnJworICAgIF9fc2xvdHNfXyA9ICgndHlwZWlkJywgJ2FkZHJlc3MnLCAnaWQnKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVpZCwgYWRkcmVzcywgaWQpOgorICAgICAgICAoc2VsZi50eXBlaWQsIHNlbGYuYWRkcmVzcywgc2VsZi5pZCkgPSAodHlwZWlkLCBhZGRyZXNzLCBpZCkKKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi50eXBlaWQsIHNlbGYuYWRkcmVzcywgc2VsZi5pZCkKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAoc2VsZi50eXBlaWQsIHNlbGYuYWRkcmVzcywgc2VsZi5pZCkgPSBzdGF0ZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJ1Rva2VuKHR5cGVpZD0lciwgYWRkcmVzcz0lciwgaWQ9JXIpJyAlIFwKKyAgICAgICAgICAgICAgIChzZWxmLnR5cGVpZCwgc2VsZi5hZGRyZXNzLCBzZWxmLmlkKQorCisjCisjIEZ1bmN0aW9uIGZvciBjb21tdW5pY2F0aW9uIHdpdGggYSBtYW5hZ2VyJ3Mgc2VydmVyIHByb2Nlc3MKKyMKKworZGVmIGRpc3BhdGNoKGMsIGlkLCBtZXRob2RuYW1lLCBhcmdzPSgpLCBrd2RzPXt9KToKKyAgICAnJycKKyAgICBTZW5kIGEgbWVzc2FnZSB0byBtYW5hZ2VyIHVzaW5nIGNvbm5lY3Rpb24gYGNgIGFuZCByZXR1cm4gcmVzcG9uc2UKKyAgICAnJycKKyAgICBjLnNlbmQoKGlkLCBtZXRob2RuYW1lLCBhcmdzLCBrd2RzKSkKKyAgICBraW5kLCByZXN1bHQgPSBjLnJlY3YoKQorICAgIGlmIGtpbmQgPT0gJyNSRVRVUk4nOgorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgcmFpc2UgY29udmVydF90b19lcnJvcihraW5kLCByZXN1bHQpCisKK2RlZiBjb252ZXJ0X3RvX2Vycm9yKGtpbmQsIHJlc3VsdCk6CisgICAgaWYga2luZCA9PSAnI0VSUk9SJzoKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIGVsaWYga2luZCA9PSAnI1RSQUNFQkFDSyc6CisgICAgICAgIGFzc2VydCB0eXBlKHJlc3VsdCkgaXMgc3RyCisgICAgICAgIHJldHVybiAgUmVtb3RlRXJyb3IocmVzdWx0KQorICAgIGVsaWYga2luZCA9PSAnI1VOU0VSSUFMSVpBQkxFJzoKKyAgICAgICAgYXNzZXJ0IHR5cGUocmVzdWx0KSBpcyBzdHIKKyAgICAgICAgcmV0dXJuIFJlbW90ZUVycm9yKCdVbnNlcmlhbGl6YWJsZSBtZXNzYWdlOiAlc1xuJyAlIHJlc3VsdCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gVmFsdWVFcnJvcignVW5yZWNvZ25pemVkIG1lc3NhZ2UgdHlwZScpCisKK2NsYXNzIFJlbW90ZUVycm9yKEV4Y2VwdGlvbik6CisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAoJ1xuJyArICctJyo3NSArICdcbicgKyBzdHIoc2VsZi5hcmdzWzBdKSArICctJyo3NSkKKworIworIyBGdW5jdGlvbnMgZm9yIGZpbmRpbmcgdGhlIG1ldGhvZCBuYW1lcyBvZiBhbiBvYmplY3QKKyMKKworZGVmIGFsbF9tZXRob2RzKG9iaik6CisgICAgJycnCisgICAgUmV0dXJuIGEgbGlzdCBvZiBuYW1lcyBvZiBtZXRob2RzIG9mIGBvYmpgCisgICAgJycnCisgICAgdGVtcCA9IFtdCisgICAgZm9yIG5hbWUgaW4gZGlyKG9iaik6CisgICAgICAgIGZ1bmMgPSBnZXRhdHRyKG9iaiwgbmFtZSkKKyAgICAgICAgaWYgaGFzYXR0cihmdW5jLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgIHRlbXAuYXBwZW5kKG5hbWUpCisgICAgcmV0dXJuIHRlbXAKKworZGVmIHB1YmxpY19tZXRob2RzKG9iaik6CisgICAgJycnCisgICAgUmV0dXJuIGEgbGlzdCBvZiBuYW1lcyBvZiBtZXRob2RzIG9mIGBvYmpgIHdoaWNoIGRvIG5vdCBzdGFydCB3aXRoICdfJworICAgICcnJworICAgIHJldHVybiBbbmFtZSBmb3IgbmFtZSBpbiBhbGxfbWV0aG9kcyhvYmopIGlmIG5hbWVbMF0gIT0gJ18nXQorCisjCisjIFNlcnZlciB3aGljaCBpcyBydW4gaW4gYSBwcm9jZXNzIGNvbnRyb2xsZWQgYnkgYSBtYW5hZ2VyCisjCisKK2NsYXNzIFNlcnZlcihvYmplY3QpOgorICAgICcnJworICAgIFNlcnZlciBjbGFzcyB3aGljaCBydW5zIGluIGEgcHJvY2VzcyBjb250cm9sbGVkIGJ5IGEgbWFuYWdlciBvYmplY3QKKyAgICAnJycKKyAgICBwdWJsaWMgPSBbJ3NodXRkb3duJywgJ2NyZWF0ZScsICdhY2NlcHRfY29ubmVjdGlvbicsICdnZXRfbWV0aG9kcycsCisgICAgICAgICAgICAgICdkZWJ1Z19pbmZvJywgJ251bWJlcl9vZl9vYmplY3RzJywgJ2R1bW15JywgJ2luY3JlZicsICdkZWNyZWYnXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlZ2lzdHJ5LCBhZGRyZXNzLCBhdXRoa2V5LCBzZXJpYWxpemVyKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYXV0aGtleSwgYnl0ZXMpCisgICAgICAgIHNlbGYucmVnaXN0cnkgPSByZWdpc3RyeQorICAgICAgICBzZWxmLmF1dGhrZXkgPSBBdXRoZW50aWNhdGlvblN0cmluZyhhdXRoa2V5KQorICAgICAgICBMaXN0ZW5lciwgQ2xpZW50ID0gbGlzdGVuZXJfY2xpZW50W3NlcmlhbGl6ZXJdCisKKyAgICAgICAgIyBkbyBhdXRoZW50aWNhdGlvbiBsYXRlcgorICAgICAgICBzZWxmLmxpc3RlbmVyID0gTGlzdGVuZXIoYWRkcmVzcz1hZGRyZXNzLCBiYWNrbG9nPTE2KQorICAgICAgICBzZWxmLmFkZHJlc3MgPSBzZWxmLmxpc3RlbmVyLmFkZHJlc3MKKworICAgICAgICBzZWxmLmlkX3RvX29iaiA9IHsnMCc6IChOb25lLCAoKSl9CisgICAgICAgIHNlbGYuaWRfdG9fcmVmY291bnQgPSB7fQorICAgICAgICBzZWxmLm11dGV4ID0gdGhyZWFkaW5nLlJMb2NrKCkKKyAgICAgICAgc2VsZi5zdG9wID0gMAorCisgICAgZGVmIHNlcnZlX2ZvcmV2ZXIoc2VsZik6CisgICAgICAgICcnJworICAgICAgICBSdW4gdGhlIHNlcnZlciBmb3JldmVyCisgICAgICAgICcnJworICAgICAgICBjdXJyZW50X3Byb2Nlc3MoKS5fbWFuYWdlcl9zZXJ2ZXIgPSBzZWxmCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gc2VsZi5saXN0ZW5lci5hY2NlcHQoKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuaGFuZGxlX3JlcXVlc3QsIGFyZ3M9KGMsKSkKKyAgICAgICAgICAgICAgICAgICAgdC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zdG9wID0gOTk5CisgICAgICAgICAgICBzZWxmLmxpc3RlbmVyLmNsb3NlKCkKKworICAgIGRlZiBoYW5kbGVfcmVxdWVzdChzZWxmLCBjKToKKyAgICAgICAgJycnCisgICAgICAgIEhhbmRsZSBhIG5ldyBjb25uZWN0aW9uCisgICAgICAgICcnJworICAgICAgICBmdW5jbmFtZSA9IHJlc3VsdCA9IHJlcXVlc3QgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uZGVsaXZlcl9jaGFsbGVuZ2UoYywgc2VsZi5hdXRoa2V5KQorICAgICAgICAgICAgY29ubmVjdGlvbi5hbnN3ZXJfY2hhbGxlbmdlKGMsIHNlbGYuYXV0aGtleSkKKyAgICAgICAgICAgIHJlcXVlc3QgPSBjLnJlY3YoKQorICAgICAgICAgICAgaWdub3JlLCBmdW5jbmFtZSwgYXJncywga3dkcyA9IHJlcXVlc3QKKyAgICAgICAgICAgIGFzc2VydCBmdW5jbmFtZSBpbiBzZWxmLnB1YmxpYywgJyVyIHVucmVjb2duaXplZCcgJSBmdW5jbmFtZQorICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoc2VsZiwgZnVuY25hbWUpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBtc2cgPSAoJyNUUkFDRUJBQ0snLCBmb3JtYXRfZXhjKCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYyhjLCAqYXJncywgKiprd2RzKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBtc2cgPSAoJyNUUkFDRUJBQ0snLCBmb3JtYXRfZXhjKCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1zZyA9ICgnI1JFVFVSTicsIHJlc3VsdCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYy5zZW5kKG1zZykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjLnNlbmQoKCcjVFJBQ0VCQUNLJywgZm9ybWF0X2V4YygpKSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdXRpbC5pbmZvKCdGYWlsdXJlIHRvIHNlbmQgbWVzc2FnZTogJXInLCBtc2cpCisgICAgICAgICAgICB1dGlsLmluZm8oJyAuLi4gcmVxdWVzdCB3YXMgJXInLCByZXF1ZXN0KQorICAgICAgICAgICAgdXRpbC5pbmZvKCcgLi4uIGV4Y2VwdGlvbiB3YXMgJXInLCBlKQorCisgICAgICAgIGMuY2xvc2UoKQorCisgICAgZGVmIHNlcnZlX2NsaWVudChzZWxmLCBjb25uKToKKyAgICAgICAgJycnCisgICAgICAgIEhhbmRsZSByZXF1ZXN0cyBmcm9tIHRoZSBwcm94aWVzIGluIGEgcGFydGljdWxhciBwcm9jZXNzL3RocmVhZAorICAgICAgICAnJycKKyAgICAgICAgdXRpbC5kZWJ1Zygnc3RhcnRpbmcgc2VydmVyIHRocmVhZCB0byBzZXJ2aWNlICVyJywKKyAgICAgICAgICAgICAgICAgICB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lKQorCisgICAgICAgIHJlY3YgPSBjb25uLnJlY3YKKyAgICAgICAgc2VuZCA9IGNvbm4uc2VuZAorICAgICAgICBpZF90b19vYmogPSBzZWxmLmlkX3RvX29iagorCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLnN0b3A6CisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtZXRob2RuYW1lID0gb2JqID0gTm9uZQorICAgICAgICAgICAgICAgIHJlcXVlc3QgPSByZWN2KCkKKyAgICAgICAgICAgICAgICBpZGVudCwgbWV0aG9kbmFtZSwgYXJncywga3dkcyA9IHJlcXVlc3QKKyAgICAgICAgICAgICAgICBvYmosIGV4cG9zZWQsIGdldHR5cGVpZCA9IGlkX3RvX29ialtpZGVudF0KKworICAgICAgICAgICAgICAgIGlmIG1ldGhvZG5hbWUgbm90IGluIGV4cG9zZWQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgJ21ldGhvZCAlciBvZiAlciBvYmplY3QgaXMgbm90IGluIGV4cG9zZWQ9JXInICUKKyAgICAgICAgICAgICAgICAgICAgICAgIChtZXRob2RuYW1lLCB0eXBlKG9iaiksIGV4cG9zZWQpCisgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiA9IGdldGF0dHIob2JqLCBtZXRob2RuYW1lKQorCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXMgPSBmdW5jdGlvbigqYXJncywgKiprd2RzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9ICgnI0VSUk9SJywgZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0eXBlaWQgPSBnZXR0eXBlaWQgYW5kIGdldHR5cGVpZC5nZXQobWV0aG9kbmFtZSwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdHlwZWlkOgorICAgICAgICAgICAgICAgICAgICAgICAgcmlkZW50LCByZXhwb3NlZCA9IHNlbGYuY3JlYXRlKGNvbm4sIHR5cGVpZCwgcmVzKQorICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBUb2tlbih0eXBlaWQsIHNlbGYuYWRkcmVzcywgcmlkZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gKCcjUFJPWFknLCAocmV4cG9zZWQsIHRva2VuKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICgnI1JFVFVSTicsIHJlcykKKworICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIGlmIG1ldGhvZG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gKCcjVFJBQ0VCQUNLJywgZm9ybWF0X2V4YygpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrX2Z1bmMgPSBzZWxmLmZhbGxiYWNrX21hcHBpbmdbbWV0aG9kbmFtZV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbGxiYWNrX2Z1bmMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgY29ubiwgaWRlbnQsIG9iaiwgKmFyZ3MsICoqa3dkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICgnI1JFVFVSTicsIHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICgnI1RSQUNFQkFDSycsIGZvcm1hdF9leGMoKSkKKworICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIHV0aWwuZGVidWcoJ2dvdCBFT0YgLS0gZXhpdGluZyB0aHJlYWQgc2VydmluZyAlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lKQorICAgICAgICAgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgbXNnID0gKCcjVFJBQ0VCQUNLJywgZm9ybWF0X2V4YygpKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZW5kKG1zZykKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgICAgICBzZW5kKCgnI1VOU0VSSUFMSVpBQkxFJywgcmVwcihtc2cpKSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgdXRpbC5pbmZvKCdleGNlcHRpb24gaW4gdGhyZWFkIHNlcnZpbmcgJXInLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSkKKyAgICAgICAgICAgICAgICB1dGlsLmluZm8oJyAuLi4gbWVzc2FnZSB3YXMgJXInLCBtc2cpCisgICAgICAgICAgICAgICAgdXRpbC5pbmZvKCcgLi4uIGV4Y2VwdGlvbiB3YXMgJXInLCBlKQorICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBkZWYgZmFsbGJhY2tfZ2V0dmFsdWUoc2VsZiwgY29ubiwgaWRlbnQsIG9iaik6CisgICAgICAgIHJldHVybiBvYmoKKworICAgIGRlZiBmYWxsYmFja19zdHIoc2VsZiwgY29ubiwgaWRlbnQsIG9iaik6CisgICAgICAgIHJldHVybiBzdHIob2JqKQorCisgICAgZGVmIGZhbGxiYWNrX3JlcHIoc2VsZiwgY29ubiwgaWRlbnQsIG9iaik6CisgICAgICAgIHJldHVybiByZXByKG9iaikKKworICAgIGZhbGxiYWNrX21hcHBpbmcgPSB7CisgICAgICAgICdfX3N0cl9fJzpmYWxsYmFja19zdHIsCisgICAgICAgICdfX3JlcHJfXyc6ZmFsbGJhY2tfcmVwciwKKyAgICAgICAgJyNHRVRWQUxVRSc6ZmFsbGJhY2tfZ2V0dmFsdWUKKyAgICAgICAgfQorCisgICAgZGVmIGR1bW15KHNlbGYsIGMpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZGVidWdfaW5mbyhzZWxmLCBjKToKKyAgICAgICAgJycnCisgICAgICAgIFJldHVybiBzb21lIGluZm8gLS0tIHVzZWZ1bCB0byBzcG90IHByb2JsZW1zIHdpdGggcmVmY291bnRpbmcKKyAgICAgICAgJycnCisgICAgICAgIHNlbGYubXV0ZXguYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgICAgICBrZXlzID0gc2VsZi5pZF90b19vYmoua2V5cygpCisgICAgICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICAgICAgZm9yIGlkZW50IGluIGtleXM6CisgICAgICAgICAgICAgICAgaWYgaWRlbnQgIT0gJzAnOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCcgICVzOiAgICAgICByZWZjb3VudD0lc1xuICAgICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlkZW50LCBzZWxmLmlkX3RvX3JlZmNvdW50W2lkZW50XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKHNlbGYuaWRfdG9fb2JqW2lkZW50XVswXSlbOjc1XSkpCisgICAgICAgICAgICByZXR1cm4gJ1xuJy5qb2luKHJlc3VsdCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYubXV0ZXgucmVsZWFzZSgpCisKKyAgICBkZWYgbnVtYmVyX29mX29iamVjdHMoc2VsZiwgYyk6CisgICAgICAgICcnJworICAgICAgICBOdW1iZXIgb2Ygc2hhcmVkIG9iamVjdHMKKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5pZF90b19vYmopIC0gMSAgICAgICMgZG9uJ3QgY291bnQgaWRlbnQ9JzAnCisKKyAgICBkZWYgc2h1dGRvd24oc2VsZiwgYyk6CisgICAgICAgICcnJworICAgICAgICBTaHV0ZG93biB0aGlzIHByb2Nlc3MKKyAgICAgICAgJycnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1dGlsLmRlYnVnKCdtYW5hZ2VyIHJlY2VpdmVkIHNodXRkb3duIG1lc3NhZ2UnKQorICAgICAgICAgICAgICAgIGMuc2VuZCgoJyNSRVRVUk4nLCBOb25lKSkKKworICAgICAgICAgICAgICAgIGlmIHN5cy5zdGRvdXQgIT0gc3lzLl9fc3Rkb3V0X186CisgICAgICAgICAgICAgICAgICAgIHV0aWwuZGVidWcoJ3Jlc2V0dGluZyBzdGRvdXQsIHN0ZGVycicpCisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXworICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyID0gc3lzLl9fc3RkZXJyX18KKworICAgICAgICAgICAgICAgIHV0aWwuX3J1bl9maW5hbGl6ZXJzKDApCisKKyAgICAgICAgICAgICAgICBmb3IgcCBpbiBhY3RpdmVfY2hpbGRyZW4oKToKKyAgICAgICAgICAgICAgICAgICAgdXRpbC5kZWJ1ZygndGVybWluYXRpbmcgYSBjaGlsZCBwcm9jZXNzIG9mIG1hbmFnZXInKQorICAgICAgICAgICAgICAgICAgICBwLnRlcm1pbmF0ZSgpCisKKyAgICAgICAgICAgICAgICBmb3IgcCBpbiBhY3RpdmVfY2hpbGRyZW4oKToKKyAgICAgICAgICAgICAgICAgICAgdXRpbC5kZWJ1ZygndGVybWluYXRpbmcgYSBjaGlsZCBwcm9jZXNzIG9mIG1hbmFnZXInKQorICAgICAgICAgICAgICAgICAgICBwLmpvaW4oKQorCisgICAgICAgICAgICAgICAgdXRpbC5fcnVuX2ZpbmFsaXplcnMoKQorICAgICAgICAgICAgICAgIHV0aWwuaW5mbygnbWFuYWdlciBleGl0aW5nIHdpdGggZXhpdGNvZGUgMCcpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZXhpdCgwKQorCisgICAgZGVmIGNyZWF0ZShzZWxmLCBjLCB0eXBlaWQsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICAnJycKKyAgICAgICAgQ3JlYXRlIGEgbmV3IHNoYXJlZCBvYmplY3QgYW5kIHJldHVybiBpdHMgaWQKKyAgICAgICAgJycnCisgICAgICAgIHNlbGYubXV0ZXguYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNhbGxhYmxlLCBleHBvc2VkLCBtZXRob2RfdG9fdHlwZWlkLCBwcm94eXR5cGUgPSBcCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWdpc3RyeVt0eXBlaWRdCisKKyAgICAgICAgICAgIGlmIGNhbGxhYmxlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGxlbihhcmdzKSA9PSAxIGFuZCBub3Qga3dkcworICAgICAgICAgICAgICAgIG9iaiA9IGFyZ3NbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2JqID0gY2FsbGFibGUoKmFyZ3MsICoqa3dkcykKKworICAgICAgICAgICAgaWYgZXhwb3NlZCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGV4cG9zZWQgPSBwdWJsaWNfbWV0aG9kcyhvYmopCisgICAgICAgICAgICBpZiBtZXRob2RfdG9fdHlwZWlkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGFzc2VydCB0eXBlKG1ldGhvZF90b190eXBlaWQpIGlzIGRpY3QKKyAgICAgICAgICAgICAgICBleHBvc2VkID0gbGlzdChleHBvc2VkKSArIGxpc3QobWV0aG9kX3RvX3R5cGVpZCkKKworICAgICAgICAgICAgaWRlbnQgPSAnJXgnICUgaWQob2JqKSAgIyBjb252ZXJ0IHRvIHN0cmluZyBiZWNhdXNlIHhtbHJwY2xpYgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmx5IGhhcyAzMiBiaXQgc2lnbmVkIGludGVnZXJzCisgICAgICAgICAgICB1dGlsLmRlYnVnKCclciBjYWxsYWJsZSByZXR1cm5lZCBvYmplY3Qgd2l0aCBpZCAlcicsIHR5cGVpZCwgaWRlbnQpCisKKyAgICAgICAgICAgIHNlbGYuaWRfdG9fb2JqW2lkZW50XSA9IChvYmosIHNldChleHBvc2VkKSwgbWV0aG9kX3RvX3R5cGVpZCkKKyAgICAgICAgICAgIGlmIGlkZW50IG5vdCBpbiBzZWxmLmlkX3RvX3JlZmNvdW50OgorICAgICAgICAgICAgICAgIHNlbGYuaWRfdG9fcmVmY291bnRbaWRlbnRdID0gMAorICAgICAgICAgICAgIyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBpbW1lZGlhdGVseSwgdG8gYXZvaWQKKyAgICAgICAgICAgICMgdGhpcyBvYmplY3QgYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQgYmVmb3JlIGEgUHJveHkKKyAgICAgICAgICAgICMgb2JqZWN0IGZvciBpdCBjYW4gYmUgY3JlYXRlZC4gIFRoZSBjYWxsZXIgb2YgY3JlYXRlKCkKKyAgICAgICAgICAgICMgaXMgcmVzcG9uc2libGUgZm9yIGRvaW5nIGEgZGVjcmVmIG9uY2UgdGhlIFByb3h5IG9iamVjdAorICAgICAgICAgICAgIyBoYXMgYmVlbiBjcmVhdGVkLgorICAgICAgICAgICAgc2VsZi5pbmNyZWYoYywgaWRlbnQpCisgICAgICAgICAgICByZXR1cm4gaWRlbnQsIHR1cGxlKGV4cG9zZWQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLm11dGV4LnJlbGVhc2UoKQorCisgICAgZGVmIGdldF9tZXRob2RzKHNlbGYsIGMsIHRva2VuKToKKyAgICAgICAgJycnCisgICAgICAgIFJldHVybiB0aGUgbWV0aG9kcyBvZiB0aGUgc2hhcmVkIG9iamVjdCBpbmRpY2F0ZWQgYnkgdG9rZW4KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiB0dXBsZShzZWxmLmlkX3RvX29ialt0b2tlbi5pZF1bMV0pCisKKyAgICBkZWYgYWNjZXB0X2Nvbm5lY3Rpb24oc2VsZiwgYywgbmFtZSk6CisgICAgICAgICcnJworICAgICAgICBTcGF3biBhIG5ldyB0aHJlYWQgdG8gc2VydmUgdGhpcyBjb25uZWN0aW9uCisgICAgICAgICcnJworICAgICAgICB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lID0gbmFtZQorICAgICAgICBjLnNlbmQoKCcjUkVUVVJOJywgTm9uZSkpCisgICAgICAgIHNlbGYuc2VydmVfY2xpZW50KGMpCisKKyAgICBkZWYgaW5jcmVmKHNlbGYsIGMsIGlkZW50KToKKyAgICAgICAgc2VsZi5tdXRleC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5pZF90b19yZWZjb3VudFtpZGVudF0gKz0gMQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5tdXRleC5yZWxlYXNlKCkKKworICAgIGRlZiBkZWNyZWYoc2VsZiwgYywgaWRlbnQpOgorICAgICAgICBzZWxmLm11dGV4LmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhc3NlcnQgc2VsZi5pZF90b19yZWZjb3VudFtpZGVudF0gPj0gMQorICAgICAgICAgICAgc2VsZi5pZF90b19yZWZjb3VudFtpZGVudF0gLT0gMQorICAgICAgICAgICAgaWYgc2VsZi5pZF90b19yZWZjb3VudFtpZGVudF0gPT0gMDoKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5pZF90b19vYmpbaWRlbnRdLCBzZWxmLmlkX3RvX3JlZmNvdW50W2lkZW50XQorICAgICAgICAgICAgICAgIHV0aWwuZGVidWcoJ2Rpc3Bvc2luZyBvZiBvYmogd2l0aCBpZCAlcicsIGlkZW50KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5tdXRleC5yZWxlYXNlKCkKKworIworIyBDbGFzcyB0byByZXByZXNlbnQgc3RhdGUgb2YgYSBtYW5hZ2VyCisjCisKK2NsYXNzIFN0YXRlKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWyd2YWx1ZSddCisgICAgSU5JVElBTCA9IDAKKyAgICBTVEFSVEVEID0gMQorICAgIFNIVVRET1dOID0gMgorCisjCisjIE1hcHBpbmcgZnJvbSBzZXJpYWxpemVyIG5hbWUgdG8gTGlzdGVuZXIgYW5kIENsaWVudCB0eXBlcworIworCitsaXN0ZW5lcl9jbGllbnQgPSB7CisgICAgJ3BpY2tsZScgOiAoY29ubmVjdGlvbi5MaXN0ZW5lciwgY29ubmVjdGlvbi5DbGllbnQpLAorICAgICd4bWxycGNsaWInIDogKGNvbm5lY3Rpb24uWG1sTGlzdGVuZXIsIGNvbm5lY3Rpb24uWG1sQ2xpZW50KQorICAgIH0KKworIworIyBEZWZpbml0aW9uIG9mIEJhc2VNYW5hZ2VyCisjCisKK2NsYXNzIEJhc2VNYW5hZ2VyKG9iamVjdCk6CisgICAgJycnCisgICAgQmFzZSBjbGFzcyBmb3IgbWFuYWdlcnMKKyAgICAnJycKKyAgICBfcmVnaXN0cnkgPSB7fQorICAgIF9TZXJ2ZXIgPSBTZXJ2ZXIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzPU5vbmUsIGF1dGhrZXk9Tm9uZSwgc2VyaWFsaXplcj0ncGlja2xlJyk6CisgICAgICAgIGlmIGF1dGhrZXkgaXMgTm9uZToKKyAgICAgICAgICAgIGF1dGhrZXkgPSBjdXJyZW50X3Byb2Nlc3MoKS5hdXRoa2V5CisgICAgICAgIHNlbGYuX2FkZHJlc3MgPSBhZGRyZXNzICAgICAjIFhYWCBub3QgZmluYWwgYWRkcmVzcyBpZiBlZyAoJycsIDApCisgICAgICAgIHNlbGYuX2F1dGhrZXkgPSBBdXRoZW50aWNhdGlvblN0cmluZyhhdXRoa2V5KQorICAgICAgICBzZWxmLl9zdGF0ZSA9IFN0YXRlKCkKKyAgICAgICAgc2VsZi5fc3RhdGUudmFsdWUgPSBTdGF0ZS5JTklUSUFMCisgICAgICAgIHNlbGYuX3NlcmlhbGl6ZXIgPSBzZXJpYWxpemVyCisgICAgICAgIHNlbGYuX0xpc3RlbmVyLCBzZWxmLl9DbGllbnQgPSBsaXN0ZW5lcl9jbGllbnRbc2VyaWFsaXplcl0KKworICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gdHlwZShzZWxmKS5mcm9tX2FkZHJlc3MsIFwKKyAgICAgICAgICAgICAgIChzZWxmLl9hZGRyZXNzLCBzZWxmLl9hdXRoa2V5LCBzZWxmLl9zZXJpYWxpemVyKQorCisgICAgZGVmIGdldF9zZXJ2ZXIoc2VsZik6CisgICAgICAgICcnJworICAgICAgICBSZXR1cm4gc2VydmVyIG9iamVjdCB3aXRoIHNlcnZlX2ZvcmV2ZXIoKSBtZXRob2QgYW5kIGFkZHJlc3MgYXR0cmlidXRlCisgICAgICAgICcnJworICAgICAgICBhc3NlcnQgc2VsZi5fc3RhdGUudmFsdWUgPT0gU3RhdGUuSU5JVElBTAorICAgICAgICByZXR1cm4gU2VydmVyKHNlbGYuX3JlZ2lzdHJ5LCBzZWxmLl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2F1dGhrZXksIHNlbGYuX3NlcmlhbGl6ZXIpCisKKyAgICBkZWYgY29ubmVjdChzZWxmKToKKyAgICAgICAgJycnCisgICAgICAgIENvbm5lY3QgbWFuYWdlciBvYmplY3QgdG8gdGhlIHNlcnZlciBwcm9jZXNzCisgICAgICAgICcnJworICAgICAgICBMaXN0ZW5lciwgQ2xpZW50ID0gbGlzdGVuZXJfY2xpZW50W3NlbGYuX3NlcmlhbGl6ZXJdCisgICAgICAgIGNvbm4gPSBDbGllbnQoc2VsZi5fYWRkcmVzcywgYXV0aGtleT1zZWxmLl9hdXRoa2V5KQorICAgICAgICBkaXNwYXRjaChjb25uLCBOb25lLCAnZHVtbXknKQorICAgICAgICBzZWxmLl9zdGF0ZS52YWx1ZSA9IFN0YXRlLlNUQVJURUQKKworICAgIGRlZiBzdGFydChzZWxmLCBpbml0aWFsaXplcj1Ob25lLCBpbml0YXJncz0oKSk6CisgICAgICAgICcnJworICAgICAgICBTcGF3biBhIHNlcnZlciBwcm9jZXNzIGZvciB0aGlzIG1hbmFnZXIgb2JqZWN0CisgICAgICAgICcnJworICAgICAgICBhc3NlcnQgc2VsZi5fc3RhdGUudmFsdWUgPT0gU3RhdGUuSU5JVElBTAorCisgICAgICAgIGlmIGluaXRpYWxpemVyIGlzIG5vdCBOb25lIGFuZCBub3QgaGFzYXR0cihpbml0aWFsaXplciwgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2luaXRpYWxpemVyIG11c3QgYmUgYSBjYWxsYWJsZScpCisKKyAgICAgICAgIyBwaXBlIG92ZXIgd2hpY2ggd2Ugd2lsbCByZXRyaWV2ZSBhZGRyZXNzIG9mIHNlcnZlcgorICAgICAgICByZWFkZXIsIHdyaXRlciA9IGNvbm5lY3Rpb24uUGlwZShkdXBsZXg9RmFsc2UpCisKKyAgICAgICAgIyBzcGF3biBwcm9jZXNzIHdoaWNoIHJ1bnMgYSBzZXJ2ZXIKKyAgICAgICAgc2VsZi5fcHJvY2VzcyA9IFByb2Nlc3MoCisgICAgICAgICAgICB0YXJnZXQ9dHlwZShzZWxmKS5fcnVuX3NlcnZlciwKKyAgICAgICAgICAgIGFyZ3M9KHNlbGYuX3JlZ2lzdHJ5LCBzZWxmLl9hZGRyZXNzLCBzZWxmLl9hdXRoa2V5LAorICAgICAgICAgICAgICAgICAgc2VsZi5fc2VyaWFsaXplciwgd3JpdGVyLCBpbml0aWFsaXplciwgaW5pdGFyZ3MpLAorICAgICAgICAgICAgKQorICAgICAgICBpZGVudCA9ICc6Jy5qb2luKHN0cihpKSBmb3IgaSBpbiBzZWxmLl9wcm9jZXNzLl9pZGVudGl0eSkKKyAgICAgICAgc2VsZi5fcHJvY2Vzcy5uYW1lID0gdHlwZShzZWxmKS5fX25hbWVfXyAgKyAnLScgKyBpZGVudAorICAgICAgICBzZWxmLl9wcm9jZXNzLnN0YXJ0KCkKKworICAgICAgICAjIGdldCBhZGRyZXNzIG9mIHNlcnZlcgorICAgICAgICB3cml0ZXIuY2xvc2UoKQorICAgICAgICBzZWxmLl9hZGRyZXNzID0gcmVhZGVyLnJlY3YoKQorICAgICAgICByZWFkZXIuY2xvc2UoKQorCisgICAgICAgICMgcmVnaXN0ZXIgYSBmaW5hbGl6ZXIKKyAgICAgICAgc2VsZi5fc3RhdGUudmFsdWUgPSBTdGF0ZS5TVEFSVEVECisgICAgICAgIHNlbGYuc2h1dGRvd24gPSB1dGlsLkZpbmFsaXplKAorICAgICAgICAgICAgc2VsZiwgdHlwZShzZWxmKS5fZmluYWxpemVfbWFuYWdlciwKKyAgICAgICAgICAgIGFyZ3M9KHNlbGYuX3Byb2Nlc3MsIHNlbGYuX2FkZHJlc3MsIHNlbGYuX2F1dGhrZXksCisgICAgICAgICAgICAgICAgICBzZWxmLl9zdGF0ZSwgc2VsZi5fQ2xpZW50KSwKKyAgICAgICAgICAgIGV4aXRwcmlvcml0eT0wCisgICAgICAgICAgICApCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3J1bl9zZXJ2ZXIoY2xzLCByZWdpc3RyeSwgYWRkcmVzcywgYXV0aGtleSwgc2VyaWFsaXplciwgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplcj1Ob25lLCBpbml0YXJncz0oKSk6CisgICAgICAgICcnJworICAgICAgICBDcmVhdGUgYSBzZXJ2ZXIsIHJlcG9ydCBpdHMgYWRkcmVzcyBhbmQgcnVuIGl0CisgICAgICAgICcnJworICAgICAgICBpZiBpbml0aWFsaXplciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGluaXRpYWxpemVyKCppbml0YXJncykKKworICAgICAgICAjIGNyZWF0ZSBzZXJ2ZXIKKyAgICAgICAgc2VydmVyID0gY2xzLl9TZXJ2ZXIocmVnaXN0cnksIGFkZHJlc3MsIGF1dGhrZXksIHNlcmlhbGl6ZXIpCisKKyAgICAgICAgIyBpbmZvcm0gcGFyZW50IHByb2Nlc3Mgb2YgdGhlIHNlcnZlcidzIGFkZHJlc3MKKyAgICAgICAgd3JpdGVyLnNlbmQoc2VydmVyLmFkZHJlc3MpCisgICAgICAgIHdyaXRlci5jbG9zZSgpCisKKyAgICAgICAgIyBydW4gdGhlIG1hbmFnZXIKKyAgICAgICAgdXRpbC5pbmZvKCdtYW5hZ2VyIHNlcnZpbmcgYXQgJXInLCBzZXJ2ZXIuYWRkcmVzcykKKyAgICAgICAgc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgdHlwZWlkLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgJycnCisgICAgICAgIENyZWF0ZSBhIG5ldyBzaGFyZWQgb2JqZWN0OyByZXR1cm4gdGhlIHRva2VuIGFuZCBleHBvc2VkIHR1cGxlCisgICAgICAgICcnJworICAgICAgICBhc3NlcnQgc2VsZi5fc3RhdGUudmFsdWUgPT0gU3RhdGUuU1RBUlRFRCwgJ3NlcnZlciBub3QgeWV0IHN0YXJ0ZWQnCisgICAgICAgIGNvbm4gPSBzZWxmLl9DbGllbnQoc2VsZi5fYWRkcmVzcywgYXV0aGtleT1zZWxmLl9hdXRoa2V5KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZCwgZXhwb3NlZCA9IGRpc3BhdGNoKGNvbm4sIE5vbmUsICdjcmVhdGUnLCAodHlwZWlkLCkrYXJncywga3dkcykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICByZXR1cm4gVG9rZW4odHlwZWlkLCBzZWxmLl9hZGRyZXNzLCBpZCksIGV4cG9zZWQKKworICAgIGRlZiBqb2luKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICcnJworICAgICAgICBKb2luIHRoZSBtYW5hZ2VyIHByb2Nlc3MgKGlmIGl0IGhhcyBiZWVuIHNwYXduZWQpCisgICAgICAgICcnJworICAgICAgICBzZWxmLl9wcm9jZXNzLmpvaW4odGltZW91dCkKKworICAgIGRlZiBfZGVidWdfaW5mbyhzZWxmKToKKyAgICAgICAgJycnCisgICAgICAgIFJldHVybiBzb21lIGluZm8gYWJvdXQgdGhlIHNlcnZlcnMgc2hhcmVkIG9iamVjdHMgYW5kIGNvbm5lY3Rpb25zCisgICAgICAgICcnJworICAgICAgICBjb25uID0gc2VsZi5fQ2xpZW50KHNlbGYuX2FkZHJlc3MsIGF1dGhrZXk9c2VsZi5fYXV0aGtleSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoKGNvbm4sIE5vbmUsICdkZWJ1Z19pbmZvJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgZGVmIF9udW1iZXJfb2Zfb2JqZWN0cyhzZWxmKToKKyAgICAgICAgJycnCisgICAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIHNoYXJlZCBvYmplY3RzCisgICAgICAgICcnJworICAgICAgICBjb25uID0gc2VsZi5fQ2xpZW50KHNlbGYuX2FkZHJlc3MsIGF1dGhrZXk9c2VsZi5fYXV0aGtleSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoKGNvbm4sIE5vbmUsICdudW1iZXJfb2Zfb2JqZWN0cycpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBjb25uLmNsb3NlKCkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6CisgICAgICAgIHNlbGYuc2h1dGRvd24oKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfZmluYWxpemVfbWFuYWdlcihwcm9jZXNzLCBhZGRyZXNzLCBhdXRoa2V5LCBzdGF0ZSwgX0NsaWVudCk6CisgICAgICAgICcnJworICAgICAgICBTaHV0ZG93biB0aGUgbWFuYWdlciBwcm9jZXNzOyB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgYSBmaW5hbGl6ZXIKKyAgICAgICAgJycnCisgICAgICAgIGlmIHByb2Nlc3MuaXNfYWxpdmUoKToKKyAgICAgICAgICAgIHV0aWwuaW5mbygnc2VuZGluZyBzaHV0ZG93biBtZXNzYWdlIHRvIG1hbmFnZXInKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbm4gPSBfQ2xpZW50KGFkZHJlc3MsIGF1dGhrZXk9YXV0aGtleSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoKGNvbm4sIE5vbmUsICdzaHV0ZG93bicpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgcHJvY2Vzcy5qb2luKHRpbWVvdXQ9MC4yKQorICAgICAgICAgICAgaWYgcHJvY2Vzcy5pc19hbGl2ZSgpOgorICAgICAgICAgICAgICAgIHV0aWwuaW5mbygnbWFuYWdlciBzdGlsbCBhbGl2ZScpCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihwcm9jZXNzLCAndGVybWluYXRlJyk6CisgICAgICAgICAgICAgICAgICAgIHV0aWwuaW5mbygndHJ5aW5nIHRvIGB0ZXJtaW5hdGUoKWAgbWFuYWdlciBwcm9jZXNzJykKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy50ZXJtaW5hdGUoKQorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmpvaW4odGltZW91dD0wLjEpCisgICAgICAgICAgICAgICAgICAgIGlmIHByb2Nlc3MuaXNfYWxpdmUoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuaW5mbygnbWFuYWdlciBzdGlsbCBhbGl2ZSBhZnRlciB0ZXJtaW5hdGUnKQorCisgICAgICAgIHN0YXRlLnZhbHVlID0gU3RhdGUuU0hVVERPV04KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIEJhc2VQcm94eS5fYWRkcmVzc190b19sb2NhbFthZGRyZXNzXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBhZGRyZXNzID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IHNlbGYuX2FkZHJlc3MpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgcmVnaXN0ZXIoY2xzLCB0eXBlaWQsIGNhbGxhYmxlPU5vbmUsIHByb3h5dHlwZT1Ob25lLCBleHBvc2VkPU5vbmUsCisgICAgICAgICAgICAgICAgIG1ldGhvZF90b190eXBlaWQ9Tm9uZSwgY3JlYXRlX21ldGhvZD1UcnVlKToKKyAgICAgICAgJycnCisgICAgICAgIFJlZ2lzdGVyIGEgdHlwZWlkIHdpdGggdGhlIG1hbmFnZXIgdHlwZQorICAgICAgICAnJycKKyAgICAgICAgaWYgJ19yZWdpc3RyeScgbm90IGluIGNscy5fX2RpY3RfXzoKKyAgICAgICAgICAgIGNscy5fcmVnaXN0cnkgPSBjbHMuX3JlZ2lzdHJ5LmNvcHkoKQorCisgICAgICAgIGlmIHByb3h5dHlwZSBpcyBOb25lOgorICAgICAgICAgICAgcHJveHl0eXBlID0gQXV0b1Byb3h5CisKKyAgICAgICAgZXhwb3NlZCA9IGV4cG9zZWQgb3IgZ2V0YXR0cihwcm94eXR5cGUsICdfZXhwb3NlZF8nLCBOb25lKQorCisgICAgICAgIG1ldGhvZF90b190eXBlaWQgPSBtZXRob2RfdG9fdHlwZWlkIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIocHJveHl0eXBlLCAnX21ldGhvZF90b190eXBlaWRfJywgTm9uZSkKKworICAgICAgICBpZiBtZXRob2RfdG9fdHlwZWlkOgorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gbWV0aG9kX3RvX3R5cGVpZC5pdGVtcygpOgorICAgICAgICAgICAgICAgIGFzc2VydCB0eXBlKGtleSkgaXMgc3RyLCAnJXIgaXMgbm90IGEgc3RyaW5nJyAlIGtleQorICAgICAgICAgICAgICAgIGFzc2VydCB0eXBlKHZhbHVlKSBpcyBzdHIsICclciBpcyBub3QgYSBzdHJpbmcnICUgdmFsdWUKKworICAgICAgICBjbHMuX3JlZ2lzdHJ5W3R5cGVpZF0gPSAoCisgICAgICAgICAgICBjYWxsYWJsZSwgZXhwb3NlZCwgbWV0aG9kX3RvX3R5cGVpZCwgcHJveHl0eXBlCisgICAgICAgICAgICApCisKKyAgICAgICAgaWYgY3JlYXRlX21ldGhvZDoKKyAgICAgICAgICAgIGRlZiB0ZW1wKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICAgICAgICAgIHV0aWwuZGVidWcoJ3JlcXVlc3RpbmcgY3JlYXRpb24gb2YgYSBzaGFyZWQgJXIgb2JqZWN0JywgdHlwZWlkKQorICAgICAgICAgICAgICAgIHRva2VuLCBleHAgPSBzZWxmLl9jcmVhdGUodHlwZWlkLCAqYXJncywgKiprd2RzKQorICAgICAgICAgICAgICAgIHByb3h5ID0gcHJveHl0eXBlKAorICAgICAgICAgICAgICAgICAgICB0b2tlbiwgc2VsZi5fc2VyaWFsaXplciwgbWFuYWdlcj1zZWxmLAorICAgICAgICAgICAgICAgICAgICBhdXRoa2V5PXNlbGYuX2F1dGhrZXksIGV4cG9zZWQ9ZXhwCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBjb25uID0gc2VsZi5fQ2xpZW50KHRva2VuLmFkZHJlc3MsIGF1dGhrZXk9c2VsZi5fYXV0aGtleSkKKyAgICAgICAgICAgICAgICBkaXNwYXRjaChjb25uLCBOb25lLCAnZGVjcmVmJywgKHRva2VuLmlkLCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5CisgICAgICAgICAgICB0ZW1wLl9fbmFtZV9fID0gdHlwZWlkCisgICAgICAgICAgICBzZXRhdHRyKGNscywgdHlwZWlkLCB0ZW1wKQorCisjCisjIFN1YmNsYXNzIG9mIHNldCB3aGljaCBnZXQgY2xlYXJlZCBhZnRlciBhIGZvcmsKKyMKKworY2xhc3MgUHJvY2Vzc0xvY2FsU2V0KHNldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICB1dGlsLnJlZ2lzdGVyX2FmdGVyX2Zvcmsoc2VsZiwgbGFtYmRhIG9iajogb2JqLmNsZWFyKCkpCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHJldHVybiB0eXBlKHNlbGYpLCAoKQorCisjCisjIERlZmluaXRpb24gb2YgQmFzZVByb3h5CisjCisKK2NsYXNzIEJhc2VQcm94eShvYmplY3QpOgorICAgICcnJworICAgIEEgYmFzZSBmb3IgcHJveGllcyBvZiBzaGFyZWQgb2JqZWN0cworICAgICcnJworICAgIF9hZGRyZXNzX3RvX2xvY2FsID0ge30KKyAgICBfbXV0ZXggPSB1dGlsLkZvcmtBd2FyZVRocmVhZExvY2soKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRva2VuLCBzZXJpYWxpemVyLCBtYW5hZ2VyPU5vbmUsCisgICAgICAgICAgICAgICAgIGF1dGhrZXk9Tm9uZSwgZXhwb3NlZD1Ob25lLCBpbmNyZWY9VHJ1ZSk6CisgICAgICAgIEJhc2VQcm94eS5fbXV0ZXguYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRsc19pZHNldCA9IEJhc2VQcm94eS5fYWRkcmVzc190b19sb2NhbC5nZXQodG9rZW4uYWRkcmVzcywgTm9uZSkKKyAgICAgICAgICAgIGlmIHRsc19pZHNldCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHRsc19pZHNldCA9IHV0aWwuRm9ya0F3YXJlTG9jYWwoKSwgUHJvY2Vzc0xvY2FsU2V0KCkKKyAgICAgICAgICAgICAgICBCYXNlUHJveHkuX2FkZHJlc3NfdG9fbG9jYWxbdG9rZW4uYWRkcmVzc10gPSB0bHNfaWRzZXQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIEJhc2VQcm94eS5fbXV0ZXgucmVsZWFzZSgpCisKKyAgICAgICAgIyBzZWxmLl90bHMgaXMgdXNlZCB0byByZWNvcmQgdGhlIGNvbm5lY3Rpb24gdXNlZCBieSB0aGlzCisgICAgICAgICMgdGhyZWFkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1hbmFnZXIgYXQgdG9rZW4uYWRkcmVzcworICAgICAgICBzZWxmLl90bHMgPSB0bHNfaWRzZXRbMF0KKworICAgICAgICAjIHNlbGYuX2lkc2V0IGlzIHVzZWQgdG8gcmVjb3JkIHRoZSBpZGVudGl0aWVzIG9mIGFsbCBzaGFyZWQKKyAgICAgICAgIyBvYmplY3RzIGZvciB3aGljaCB0aGUgY3VycmVudCBwcm9jZXNzIG93bnMgcmVmZXJlbmNlcyBhbmQKKyAgICAgICAgIyB3aGljaCBhcmUgaW4gdGhlIG1hbmFnZXIgYXQgdG9rZW4uYWRkcmVzcworICAgICAgICBzZWxmLl9pZHNldCA9IHRsc19pZHNldFsxXQorCisgICAgICAgIHNlbGYuX3Rva2VuID0gdG9rZW4KKyAgICAgICAgc2VsZi5faWQgPSBzZWxmLl90b2tlbi5pZAorICAgICAgICBzZWxmLl9tYW5hZ2VyID0gbWFuYWdlcgorICAgICAgICBzZWxmLl9zZXJpYWxpemVyID0gc2VyaWFsaXplcgorICAgICAgICBzZWxmLl9DbGllbnQgPSBsaXN0ZW5lcl9jbGllbnRbc2VyaWFsaXplcl1bMV0KKworICAgICAgICBpZiBhdXRoa2V5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fYXV0aGtleSA9IEF1dGhlbnRpY2F0aW9uU3RyaW5nKGF1dGhrZXkpCisgICAgICAgIGVsaWYgc2VsZi5fbWFuYWdlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2F1dGhrZXkgPSBzZWxmLl9tYW5hZ2VyLl9hdXRoa2V5CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9hdXRoa2V5ID0gY3VycmVudF9wcm9jZXNzKCkuYXV0aGtleQorCisgICAgICAgIGlmIGluY3JlZjoKKyAgICAgICAgICAgIHNlbGYuX2luY3JlZigpCisKKyAgICAgICAgdXRpbC5yZWdpc3Rlcl9hZnRlcl9mb3JrKHNlbGYsIEJhc2VQcm94eS5fYWZ0ZXJfZm9yaykKKworICAgIGRlZiBfY29ubmVjdChzZWxmKToKKyAgICAgICAgdXRpbC5kZWJ1ZygnbWFraW5nIGNvbm5lY3Rpb24gdG8gbWFuYWdlcicpCisgICAgICAgIG5hbWUgPSBjdXJyZW50X3Byb2Nlc3MoKS5uYW1lCisgICAgICAgIGlmIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUgIT0gJ01haW5UaHJlYWQnOgorICAgICAgICAgICAgbmFtZSArPSAnfCcgKyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lCisgICAgICAgIGNvbm4gPSBzZWxmLl9DbGllbnQoc2VsZi5fdG9rZW4uYWRkcmVzcywgYXV0aGtleT1zZWxmLl9hdXRoa2V5KQorICAgICAgICBkaXNwYXRjaChjb25uLCBOb25lLCAnYWNjZXB0X2Nvbm5lY3Rpb24nLCAobmFtZSwpKQorICAgICAgICBzZWxmLl90bHMuY29ubmVjdGlvbiA9IGNvbm4KKworICAgIGRlZiBfY2FsbG1ldGhvZChzZWxmLCBtZXRob2RuYW1lLCBhcmdzPSgpLCBrd2RzPXt9KToKKyAgICAgICAgJycnCisgICAgICAgIFRyeSB0byBjYWxsIGEgbWV0aG9kIG9mIHRoZSByZWZlcnJlbnQgYW5kIHJldHVybiBhIGNvcHkgb2YgdGhlIHJlc3VsdAorICAgICAgICAnJycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29ubiA9IHNlbGYuX3Rscy5jb25uZWN0aW9uCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHV0aWwuZGVidWcoJ3RocmVhZCAlciBkb2VzIG5vdCBvd24gYSBjb25uZWN0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSkKKyAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3QoKQorICAgICAgICAgICAgY29ubiA9IHNlbGYuX3Rscy5jb25uZWN0aW9uCisKKyAgICAgICAgY29ubi5zZW5kKChzZWxmLl9pZCwgbWV0aG9kbmFtZSwgYXJncywga3dkcykpCisgICAgICAgIGtpbmQsIHJlc3VsdCA9IGNvbm4ucmVjdigpCisKKyAgICAgICAgaWYga2luZCA9PSAnI1JFVFVSTic6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIGVsaWYga2luZCA9PSAnI1BST1hZJzoKKyAgICAgICAgICAgIGV4cG9zZWQsIHRva2VuID0gcmVzdWx0CisgICAgICAgICAgICBwcm94eXR5cGUgPSBzZWxmLl9tYW5hZ2VyLl9yZWdpc3RyeVt0b2tlbi50eXBlaWRdWy0xXQorICAgICAgICAgICAgcHJveHkgPSBwcm94eXR5cGUoCisgICAgICAgICAgICAgICAgdG9rZW4sIHNlbGYuX3NlcmlhbGl6ZXIsIG1hbmFnZXI9c2VsZi5fbWFuYWdlciwKKyAgICAgICAgICAgICAgICBhdXRoa2V5PXNlbGYuX2F1dGhrZXksIGV4cG9zZWQ9ZXhwb3NlZAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGNvbm4gPSBzZWxmLl9DbGllbnQodG9rZW4uYWRkcmVzcywgYXV0aGtleT1zZWxmLl9hdXRoa2V5KQorICAgICAgICAgICAgZGlzcGF0Y2goY29ubiwgTm9uZSwgJ2RlY3JlZicsICh0b2tlbi5pZCwpKQorICAgICAgICAgICAgcmV0dXJuIHByb3h5CisgICAgICAgIHJhaXNlIGNvbnZlcnRfdG9fZXJyb3Ioa2luZCwgcmVzdWx0KQorCisgICAgZGVmIF9nZXR2YWx1ZShzZWxmKToKKyAgICAgICAgJycnCisgICAgICAgIEdldCBhIGNvcHkgb2YgdGhlIHZhbHVlIG9mIHRoZSByZWZlcmVudAorICAgICAgICAnJycKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJyNHRVRWQUxVRScpCisKKyAgICBkZWYgX2luY3JlZihzZWxmKToKKyAgICAgICAgY29ubiA9IHNlbGYuX0NsaWVudChzZWxmLl90b2tlbi5hZGRyZXNzLCBhdXRoa2V5PXNlbGYuX2F1dGhrZXkpCisgICAgICAgIGRpc3BhdGNoKGNvbm4sIE5vbmUsICdpbmNyZWYnLCAoc2VsZi5faWQsKSkKKyAgICAgICAgdXRpbC5kZWJ1ZygnSU5DUkVGICVyJywgc2VsZi5fdG9rZW4uaWQpCisKKyAgICAgICAgc2VsZi5faWRzZXQuYWRkKHNlbGYuX2lkKQorCisgICAgICAgIHN0YXRlID0gc2VsZi5fbWFuYWdlciBhbmQgc2VsZi5fbWFuYWdlci5fc3RhdGUKKworICAgICAgICBzZWxmLl9jbG9zZSA9IHV0aWwuRmluYWxpemUoCisgICAgICAgICAgICBzZWxmLCBCYXNlUHJveHkuX2RlY3JlZiwKKyAgICAgICAgICAgIGFyZ3M9KHNlbGYuX3Rva2VuLCBzZWxmLl9hdXRoa2V5LCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX3Rscywgc2VsZi5faWRzZXQsIHNlbGYuX0NsaWVudCksCisgICAgICAgICAgICBleGl0cHJpb3JpdHk9MTAKKyAgICAgICAgICAgICkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2RlY3JlZih0b2tlbiwgYXV0aGtleSwgc3RhdGUsIHRscywgaWRzZXQsIF9DbGllbnQpOgorICAgICAgICBpZHNldC5kaXNjYXJkKHRva2VuLmlkKQorCisgICAgICAgICMgY2hlY2sgd2hldGhlciBtYW5hZ2VyIGlzIHN0aWxsIGFsaXZlCisgICAgICAgIGlmIHN0YXRlIGlzIE5vbmUgb3Igc3RhdGUudmFsdWUgPT0gU3RhdGUuU1RBUlRFRDoKKyAgICAgICAgICAgICMgdGVsbCBtYW5hZ2VyIHRoaXMgcHJvY2VzcyBubyBsb25nZXIgY2FyZXMgYWJvdXQgcmVmZXJlbnQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1dGlsLmRlYnVnKCdERUNSRUYgJXInLCB0b2tlbi5pZCkKKyAgICAgICAgICAgICAgICBjb25uID0gX0NsaWVudCh0b2tlbi5hZGRyZXNzLCBhdXRoa2V5PWF1dGhrZXkpCisgICAgICAgICAgICAgICAgZGlzcGF0Y2goY29ubiwgTm9uZSwgJ2RlY3JlZicsICh0b2tlbi5pZCwpKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICB1dGlsLmRlYnVnKCcuLi4gZGVjcmVmIGZhaWxlZCAlcycsIGUpCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHV0aWwuZGVidWcoJ0RFQ1JFRiAlciAtLSBtYW5hZ2VyIGFscmVhZHkgc2h1dGRvd24nLCB0b2tlbi5pZCkKKworICAgICAgICAjIGNoZWNrIHdoZXRoZXIgd2UgY2FuIGNsb3NlIHRoaXMgdGhyZWFkJ3MgY29ubmVjdGlvbiBiZWNhdXNlCisgICAgICAgICMgdGhlIHByb2Nlc3Mgb3ducyBubyBtb3JlIHJlZmVyZW5jZXMgdG8gb2JqZWN0cyBmb3IgdGhpcyBtYW5hZ2VyCisgICAgICAgIGlmIG5vdCBpZHNldCBhbmQgaGFzYXR0cih0bHMsICdjb25uZWN0aW9uJyk6CisgICAgICAgICAgICB1dGlsLmRlYnVnKCd0aHJlYWQgJXIgaGFzIG5vIG1vcmUgcHJveGllcyBzbyBjbG9zaW5nIGNvbm4nLAorICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lKQorICAgICAgICAgICAgdGxzLmNvbm5lY3Rpb24uY2xvc2UoKQorICAgICAgICAgICAgZGVsIHRscy5jb25uZWN0aW9uCisKKyAgICBkZWYgX2FmdGVyX2Zvcmsoc2VsZik6CisgICAgICAgIHNlbGYuX21hbmFnZXIgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2luY3JlZigpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAjIHRoZSBwcm94eSBtYXkganVzdCBiZSBmb3IgYSBtYW5hZ2VyIHdoaWNoIGhhcyBzaHV0ZG93bgorICAgICAgICAgICAgdXRpbC5pbmZvKCdpbmNyZWYgZmFpbGVkOiAlcycgJSBlKQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIGt3ZHMgPSB7fQorICAgICAgICBpZiBQb3Blbi50aHJlYWRfaXNfc3Bhd25pbmcoKToKKyAgICAgICAgICAgIGt3ZHNbJ2F1dGhrZXknXSA9IHNlbGYuX2F1dGhrZXkKKworICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdfaXNhdXRvJywgRmFsc2UpOgorICAgICAgICAgICAga3dkc1snZXhwb3NlZCddID0gc2VsZi5fZXhwb3NlZF8KKyAgICAgICAgICAgIHJldHVybiAoUmVidWlsZFByb3h5LAorICAgICAgICAgICAgICAgICAgICAoQXV0b1Byb3h5LCBzZWxmLl90b2tlbiwgc2VsZi5fc2VyaWFsaXplciwga3dkcykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKFJlYnVpbGRQcm94eSwKKyAgICAgICAgICAgICAgICAgICAgKHR5cGUoc2VsZiksIHNlbGYuX3Rva2VuLCBzZWxmLl9zZXJpYWxpemVyLCBrd2RzKSkKKworICAgIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbyk6CisgICAgICAgIHJldHVybiBzZWxmLl9nZXR2YWx1ZSgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPCVzIG9iamVjdCwgdHlwZWlkICVyIGF0ICVzPicgJSBcCisgICAgICAgICAgICAgICAodHlwZShzZWxmKS5fX25hbWVfXywgc2VsZi5fdG9rZW4udHlwZWlkLCAnMHgleCcgJSBpZChzZWxmKSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJuIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWZlcmVudCAob3IgYSBmYWxsLWJhY2sgaWYgdGhhdCBmYWlscykKKyAgICAgICAgJycnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCdfX3JlcHJfXycpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICByZXR1cm4gcmVwcihzZWxmKVs6LTFdICsgIjsgJ19fc3RyX18oKScgZmFpbGVkPiIKKworIworIyBGdW5jdGlvbiB1c2VkIGZvciB1bnBpY2tsaW5nCisjCisKK2RlZiBSZWJ1aWxkUHJveHkoZnVuYywgdG9rZW4sIHNlcmlhbGl6ZXIsIGt3ZHMpOgorICAgICcnJworICAgIEZ1bmN0aW9uIHVzZWQgZm9yIHVucGlja2xpbmcgcHJveHkgb2JqZWN0cy4KKworICAgIElmIHBvc3NpYmxlIHRoZSBzaGFyZWQgb2JqZWN0IGlzIHJldHVybmVkLCBvciBvdGhlcndpc2UgYSBwcm94eSBmb3IgaXQuCisgICAgJycnCisgICAgc2VydmVyID0gZ2V0YXR0cihjdXJyZW50X3Byb2Nlc3MoKSwgJ19tYW5hZ2VyX3NlcnZlcicsIE5vbmUpCisKKyAgICBpZiBzZXJ2ZXIgYW5kIHNlcnZlci5hZGRyZXNzID09IHRva2VuLmFkZHJlc3M6CisgICAgICAgIHJldHVybiBzZXJ2ZXIuaWRfdG9fb2JqW3Rva2VuLmlkXVswXQorICAgIGVsc2U6CisgICAgICAgIGluY3JlZiA9ICgKKyAgICAgICAgICAgIGt3ZHMucG9wKCdpbmNyZWYnLCBUcnVlKSBhbmQKKyAgICAgICAgICAgIG5vdCBnZXRhdHRyKGN1cnJlbnRfcHJvY2VzcygpLCAnX2luaGVyaXRpbmcnLCBGYWxzZSkKKyAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGZ1bmModG9rZW4sIHNlcmlhbGl6ZXIsIGluY3JlZj1pbmNyZWYsICoqa3dkcykKKworIworIyBGdW5jdGlvbnMgdG8gY3JlYXRlIHByb3hpZXMgYW5kIHByb3h5IHR5cGVzCisjCisKK2RlZiBNYWtlUHJveHlUeXBlKG5hbWUsIGV4cG9zZWQsIF9jYWNoZT17fSk6CisgICAgJycnCisgICAgUmV0dXJuIGFuIHByb3h5IHR5cGUgd2hvc2UgbWV0aG9kcyBhcmUgZ2l2ZW4gYnkgYGV4cG9zZWRgCisgICAgJycnCisgICAgZXhwb3NlZCA9IHR1cGxlKGV4cG9zZWQpCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gX2NhY2hlWyhuYW1lLCBleHBvc2VkKV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHBhc3MKKworICAgIGRpYyA9IHt9CisKKyAgICBmb3IgbWV0aCBpbiBleHBvc2VkOgorICAgICAgICBleGVjICcnJ2RlZiAlcyhzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJXIsIGFyZ3MsIGt3ZHMpJycnICUgKG1ldGgsIG1ldGgpIGluIGRpYworCisgICAgUHJveHlUeXBlID0gdHlwZShuYW1lLCAoQmFzZVByb3h5LCksIGRpYykKKyAgICBQcm94eVR5cGUuX2V4cG9zZWRfID0gZXhwb3NlZAorICAgIF9jYWNoZVsobmFtZSwgZXhwb3NlZCldID0gUHJveHlUeXBlCisgICAgcmV0dXJuIFByb3h5VHlwZQorCisKK2RlZiBBdXRvUHJveHkodG9rZW4sIHNlcmlhbGl6ZXIsIG1hbmFnZXI9Tm9uZSwgYXV0aGtleT1Ob25lLAorICAgICAgICAgICAgICBleHBvc2VkPU5vbmUsIGluY3JlZj1UcnVlKToKKyAgICAnJycKKyAgICBSZXR1cm4gYW4gYXV0by1wcm94eSBmb3IgYHRva2VuYAorICAgICcnJworICAgIF9DbGllbnQgPSBsaXN0ZW5lcl9jbGllbnRbc2VyaWFsaXplcl1bMV0KKworICAgIGlmIGV4cG9zZWQgaXMgTm9uZToKKyAgICAgICAgY29ubiA9IF9DbGllbnQodG9rZW4uYWRkcmVzcywgYXV0aGtleT1hdXRoa2V5KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBleHBvc2VkID0gZGlzcGF0Y2goY29ubiwgTm9uZSwgJ2dldF9tZXRob2RzJywgKHRva2VuLCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBjb25uLmNsb3NlKCkKKworICAgIGlmIGF1dGhrZXkgaXMgTm9uZSBhbmQgbWFuYWdlciBpcyBub3QgTm9uZToKKyAgICAgICAgYXV0aGtleSA9IG1hbmFnZXIuX2F1dGhrZXkKKyAgICBpZiBhdXRoa2V5IGlzIE5vbmU6CisgICAgICAgIGF1dGhrZXkgPSBjdXJyZW50X3Byb2Nlc3MoKS5hdXRoa2V5CisKKyAgICBQcm94eVR5cGUgPSBNYWtlUHJveHlUeXBlKCdBdXRvUHJveHlbJXNdJyAlIHRva2VuLnR5cGVpZCwgZXhwb3NlZCkKKyAgICBwcm94eSA9IFByb3h5VHlwZSh0b2tlbiwgc2VyaWFsaXplciwgbWFuYWdlcj1tYW5hZ2VyLCBhdXRoa2V5PWF1dGhrZXksCisgICAgICAgICAgICAgICAgICAgICAgaW5jcmVmPWluY3JlZikKKyAgICBwcm94eS5faXNhdXRvID0gVHJ1ZQorICAgIHJldHVybiBwcm94eQorCisjCisjIFR5cGVzL2NhbGxhYmxlcyB3aGljaCB3ZSB3aWxsIHJlZ2lzdGVyIHdpdGggU3luY01hbmFnZXIKKyMKKworY2xhc3MgTmFtZXNwYWNlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dkcyk6CisgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGt3ZHMpCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBpdGVtcyA9IHNlbGYuX19kaWN0X18uaXRlbXMoKQorICAgICAgICB0ZW1wID0gW10KKyAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGl0ZW1zOgorICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpOgorICAgICAgICAgICAgICAgIHRlbXAuYXBwZW5kKCclcz0lcicgJSAobmFtZSwgdmFsdWUpKQorICAgICAgICB0ZW1wLnNvcnQoKQorICAgICAgICByZXR1cm4gJ05hbWVzcGFjZSglcyknICUgc3RyLmpvaW4oJywgJywgdGVtcCkKKworY2xhc3MgVmFsdWUob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZWNvZGUsIHZhbHVlLCBsb2NrPVRydWUpOgorICAgICAgICBzZWxmLl90eXBlY29kZSA9IHR5cGVjb2RlCisgICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWUKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUKKyAgICBkZWYgc2V0KHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICclcyglciwgJXIpJyUodHlwZShzZWxmKS5fX25hbWVfXywgc2VsZi5fdHlwZWNvZGUsIHNlbGYuX3ZhbHVlKQorICAgIHZhbHVlID0gcHJvcGVydHkoZ2V0LCBzZXQpCisKK2RlZiBBcnJheSh0eXBlY29kZSwgc2VxdWVuY2UsIGxvY2s9VHJ1ZSk6CisgICAgcmV0dXJuIGFycmF5LmFycmF5KHR5cGVjb2RlLCBzZXF1ZW5jZSkKKworIworIyBQcm94eSB0eXBlcyB1c2VkIGJ5IFN5bmNNYW5hZ2VyCisjCisKK2NsYXNzIEl0ZXJhdG9yUHJveHkoQmFzZVByb3h5KToKKyAgICAjIFhYWCByZW1vdmUgbWV0aG9kcyBmb3IgUHkzLjAgYW5kIFB5Mi42CisgICAgX2V4cG9zZWRfID0gKCdfX25leHRfXycsICduZXh0JywgJ3NlbmQnLCAndGhyb3cnLCAnY2xvc2UnKQorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgX19uZXh0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnX19uZXh0X18nLCBhcmdzKQorICAgIGRlZiBuZXh0KHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ25leHQnLCBhcmdzKQorICAgIGRlZiBzZW5kKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ3NlbmQnLCBhcmdzKQorICAgIGRlZiB0aHJvdyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCd0aHJvdycsIGFyZ3MpCisgICAgZGVmIGNsb3NlKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ2Nsb3NlJywgYXJncykKKworCitjbGFzcyBBY3F1aXJlclByb3h5KEJhc2VQcm94eSk6CisgICAgX2V4cG9zZWRfID0gKCdhY3F1aXJlJywgJ3JlbGVhc2UnKQorICAgIGRlZiBhY3F1aXJlKHNlbGYsIGJsb2NraW5nPVRydWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnYWNxdWlyZScsIChibG9ja2luZywpKQorICAgIGRlZiByZWxlYXNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgncmVsZWFzZScpCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ2FjcXVpcmUnKQorICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbCwgZXhjX3RiKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ3JlbGVhc2UnKQorCisKK2NsYXNzIENvbmRpdGlvblByb3h5KEFjcXVpcmVyUHJveHkpOgorICAgICMgWFhYIHdpbGwgQ29uZGl0aW9uLm5vdGZ5QWxsKCkgbmFtZSBiZSBhdmFpbGFibGUgaW4gUHkzLjA/CisgICAgX2V4cG9zZWRfID0gKCdhY3F1aXJlJywgJ3JlbGVhc2UnLCAnd2FpdCcsICdub3RpZnknLCAnbm90aWZ5X2FsbCcpCisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ3dhaXQnLCAodGltZW91dCwpKQorICAgIGRlZiBub3RpZnkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCdub3RpZnknKQorICAgIGRlZiBub3RpZnlfYWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnbm90aWZ5X2FsbCcpCisKK2NsYXNzIEV2ZW50UHJveHkoQmFzZVByb3h5KToKKyAgICBfZXhwb3NlZF8gPSAoJ2lzX3NldCcsICdzZXQnLCAnY2xlYXInLCAnd2FpdCcpCisgICAgZGVmIGlzX3NldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ2lzX3NldCcpCisgICAgZGVmIHNldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ3NldCcpCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnY2xlYXInKQorICAgIGRlZiB3YWl0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCd3YWl0JywgKHRpbWVvdXQsKSkKKworY2xhc3MgTmFtZXNwYWNlUHJveHkoQmFzZVByb3h5KToKKyAgICBfZXhwb3NlZF8gPSAoJ19fZ2V0YXR0cmlidXRlX18nLCAnX19zZXRhdHRyX18nLCAnX19kZWxhdHRyX18nKQorICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBrZXlbMF0gPT0gJ18nOgorICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIGtleSkKKyAgICAgICAgY2FsbG1ldGhvZCA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdfY2FsbG1ldGhvZCcpCisgICAgICAgIHJldHVybiBjYWxsbWV0aG9kKCdfX2dldGF0dHJpYnV0ZV9fJywgKGtleSwpKQorICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgaWYga2V5WzBdID09ICdfJzoKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QuX19zZXRhdHRyX18oc2VsZiwga2V5LCB2YWx1ZSkKKyAgICAgICAgY2FsbG1ldGhvZCA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdfY2FsbG1ldGhvZCcpCisgICAgICAgIHJldHVybiBjYWxsbWV0aG9kKCdfX3NldGF0dHJfXycsIChrZXksIHZhbHVlKSkKKyAgICBkZWYgX19kZWxhdHRyX18oc2VsZiwga2V5KToKKyAgICAgICAgaWYga2V5WzBdID09ICdfJzoKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QuX19kZWxhdHRyX18oc2VsZiwga2V5KQorICAgICAgICBjYWxsbWV0aG9kID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ19jYWxsbWV0aG9kJykKKyAgICAgICAgcmV0dXJuIGNhbGxtZXRob2QoJ19fZGVsYXR0cl9fJywgKGtleSwpKQorCisKK2NsYXNzIFZhbHVlUHJveHkoQmFzZVByb3h5KToKKyAgICBfZXhwb3NlZF8gPSAoJ2dldCcsICdzZXQnKQorICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCdnZXQnKQorICAgIGRlZiBzZXQoc2VsZiwgdmFsdWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnc2V0JywgKHZhbHVlLCkpCisgICAgdmFsdWUgPSBwcm9wZXJ0eShnZXQsIHNldCkKKworCitCYXNlTGlzdFByb3h5ID0gTWFrZVByb3h5VHlwZSgnQmFzZUxpc3RQcm94eScsICgKKyAgICAnX19hZGRfXycsICdfX2NvbnRhaW5zX18nLCAnX19kZWxpdGVtX18nLCAnX19kZWxzbGljZV9fJywKKyAgICAnX19nZXRpdGVtX18nLCAnX19nZXRzbGljZV9fJywgJ19fbGVuX18nLCAnX19tdWxfXycsCisgICAgJ19fcmV2ZXJzZWRfXycsICdfX3JtdWxfXycsICdfX3NldGl0ZW1fXycsICdfX3NldHNsaWNlX18nLAorICAgICdhcHBlbmQnLCAnY291bnQnLCAnZXh0ZW5kJywgJ2luZGV4JywgJ2luc2VydCcsICdwb3AnLCAncmVtb3ZlJywKKyAgICAncmV2ZXJzZScsICdzb3J0JywgJ19faW11bF9fJworICAgICkpICAgICAgICAgICAgICAgICAgIyBYWFggX19nZXRzbGljZV9fIGFuZCBfX3NldHNsaWNlX18gdW5uZWVkZWQgaW4gUHkzLjAKK2NsYXNzIExpc3RQcm94eShCYXNlTGlzdFByb3h5KToKKyAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLl9jYWxsbWV0aG9kKCdleHRlbmQnLCAodmFsdWUsKSkKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgX19pbXVsX18oc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLl9jYWxsbWV0aG9kKCdfX2ltdWxfXycsICh2YWx1ZSwpKQorICAgICAgICByZXR1cm4gc2VsZgorCisKK0RpY3RQcm94eSA9IE1ha2VQcm94eVR5cGUoJ0RpY3RQcm94eScsICgKKyAgICAnX19jb250YWluc19fJywgJ19fZGVsaXRlbV9fJywgJ19fZ2V0aXRlbV9fJywgJ19fbGVuX18nLAorICAgICdfX3NldGl0ZW1fXycsICdjbGVhcicsICdjb3B5JywgJ2dldCcsICdoYXNfa2V5JywgJ2l0ZW1zJywKKyAgICAna2V5cycsICdwb3AnLCAncG9waXRlbScsICdzZXRkZWZhdWx0JywgJ3VwZGF0ZScsICd2YWx1ZXMnCisgICAgKSkKKworCitBcnJheVByb3h5ID0gTWFrZVByb3h5VHlwZSgnQXJyYXlQcm94eScsICgKKyAgICAnX19sZW5fXycsICdfX2dldGl0ZW1fXycsICdfX3NldGl0ZW1fXycsICdfX2dldHNsaWNlX18nLCAnX19zZXRzbGljZV9fJworICAgICkpICAgICAgICAgICAgICAgICAgIyBYWFggX19nZXRzbGljZV9fIGFuZCBfX3NldHNsaWNlX18gdW5uZWVkZWQgaW4gUHkzLjAKKworCitQb29sUHJveHkgPSBNYWtlUHJveHlUeXBlKCdQb29sUHJveHknLCAoCisgICAgJ2FwcGx5JywgJ2FwcGx5X2FzeW5jJywgJ2Nsb3NlJywgJ2ltYXAnLCAnaW1hcF91bm9yZGVyZWQnLCAnam9pbicsCisgICAgJ21hcCcsICdtYXBfYXN5bmMnLCAndGVybWluYXRlJworICAgICkpCitQb29sUHJveHkuX21ldGhvZF90b190eXBlaWRfID0geworICAgICdhcHBseV9hc3luYyc6ICdBc3luY1Jlc3VsdCcsCisgICAgJ21hcF9hc3luYyc6ICdBc3luY1Jlc3VsdCcsCisgICAgJ2ltYXAnOiAnSXRlcmF0b3InLAorICAgICdpbWFwX3Vub3JkZXJlZCc6ICdJdGVyYXRvcicKKyAgICB9CisKKyMKKyMgRGVmaW5pdGlvbiBvZiBTeW5jTWFuYWdlcgorIworCitjbGFzcyBTeW5jTWFuYWdlcihCYXNlTWFuYWdlcik6CisgICAgJycnCisgICAgU3ViY2xhc3Mgb2YgYEJhc2VNYW5hZ2VyYCB3aGljaCBzdXBwb3J0cyBhIG51bWJlciBvZiBzaGFyZWQgb2JqZWN0IHR5cGVzLgorCisgICAgVGhlIHR5cGVzIHJlZ2lzdGVyZWQgYXJlIHRob3NlIGludGVuZGVkIGZvciB0aGUgc3luY2hyb25pemF0aW9uCisgICAgb2YgdGhyZWFkcywgcGx1cyBgZGljdGAsIGBsaXN0YCBhbmQgYE5hbWVzcGFjZWAuCisKKyAgICBUaGUgYG11bHRpcHJvY2Vzc2luZy5NYW5hZ2VyKClgIGZ1bmN0aW9uIGNyZWF0ZXMgc3RhcnRlZCBpbnN0YW5jZXMgb2YKKyAgICB0aGlzIGNsYXNzLgorICAgICcnJworCitTeW5jTWFuYWdlci5yZWdpc3RlcignUXVldWUnLCBRdWV1ZS5RdWV1ZSkKK1N5bmNNYW5hZ2VyLnJlZ2lzdGVyKCdKb2luYWJsZVF1ZXVlJywgUXVldWUuUXVldWUpCitTeW5jTWFuYWdlci5yZWdpc3RlcignRXZlbnQnLCB0aHJlYWRpbmcuRXZlbnQsIEV2ZW50UHJveHkpCitTeW5jTWFuYWdlci5yZWdpc3RlcignTG9jaycsIHRocmVhZGluZy5Mb2NrLCBBY3F1aXJlclByb3h5KQorU3luY01hbmFnZXIucmVnaXN0ZXIoJ1JMb2NrJywgdGhyZWFkaW5nLlJMb2NrLCBBY3F1aXJlclByb3h5KQorU3luY01hbmFnZXIucmVnaXN0ZXIoJ1NlbWFwaG9yZScsIHRocmVhZGluZy5TZW1hcGhvcmUsIEFjcXVpcmVyUHJveHkpCitTeW5jTWFuYWdlci5yZWdpc3RlcignQm91bmRlZFNlbWFwaG9yZScsIHRocmVhZGluZy5Cb3VuZGVkU2VtYXBob3JlLAorICAgICAgICAgICAgICAgICAgICAgQWNxdWlyZXJQcm94eSkKK1N5bmNNYW5hZ2VyLnJlZ2lzdGVyKCdDb25kaXRpb24nLCB0aHJlYWRpbmcuQ29uZGl0aW9uLCBDb25kaXRpb25Qcm94eSkKK1N5bmNNYW5hZ2VyLnJlZ2lzdGVyKCdQb29sJywgUG9vbCwgUG9vbFByb3h5KQorU3luY01hbmFnZXIucmVnaXN0ZXIoJ2xpc3QnLCBsaXN0LCBMaXN0UHJveHkpCitTeW5jTWFuYWdlci5yZWdpc3RlcignZGljdCcsIGRpY3QsIERpY3RQcm94eSkKK1N5bmNNYW5hZ2VyLnJlZ2lzdGVyKCdWYWx1ZScsIFZhbHVlLCBWYWx1ZVByb3h5KQorU3luY01hbmFnZXIucmVnaXN0ZXIoJ0FycmF5JywgQXJyYXksIEFycmF5UHJveHkpCitTeW5jTWFuYWdlci5yZWdpc3RlcignTmFtZXNwYWNlJywgTmFtZXNwYWNlLCBOYW1lc3BhY2VQcm94eSkKKworIyB0eXBlcyByZXR1cm5lZCBieSBtZXRob2RzIG9mIFBvb2xQcm94eQorU3luY01hbmFnZXIucmVnaXN0ZXIoJ0l0ZXJhdG9yJywgcHJveHl0eXBlPUl0ZXJhdG9yUHJveHksIGNyZWF0ZV9tZXRob2Q9RmFsc2UpCitTeW5jTWFuYWdlci5yZWdpc3RlcignQXN5bmNSZXN1bHQnLCBjcmVhdGVfbWV0aG9kPUZhbHNlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvbWFuYWdlcnMucHljIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvbWFuYWdlcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZjQ0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvbWFuYWdlcnMucHlvIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvbWFuYWdlcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWRhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weSBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3Bvb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxODYwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3Bvb2wucHkKQEAgLTAsMCArMSw3MzEgQEAKKyMKKyMgTW9kdWxlIHByb3ZpZGluZyB0aGUgYFBvb2xgIGNsYXNzIGZvciBtYW5hZ2luZyBhIHByb2Nlc3MgcG9vbAorIworIyBtdWx0aXByb2Nlc3NpbmcvcG9vbC5weQorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgUiBPdWRrZXJrCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyMgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCitfX2FsbF9fID0gWydQb29sJ10KKworIworIyBJbXBvcnRzCisjCisKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCBRdWV1ZQoraW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgdGltZQorCitmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgUHJvY2VzcywgY3B1X2NvdW50LCBUaW1lb3V0RXJyb3IKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLnV0aWwgaW1wb3J0IEZpbmFsaXplLCBkZWJ1ZworCisjCisjIENvbnN0YW50cyByZXByZXNlbnRpbmcgdGhlIHN0YXRlIG9mIGEgcG9vbAorIworCitSVU4gPSAwCitDTE9TRSA9IDEKK1RFUk1JTkFURSA9IDIKKworIworIyBNaXNjZWxsYW5lb3VzCisjCisKK2pvYl9jb3VudGVyID0gaXRlcnRvb2xzLmNvdW50KCkKKworZGVmIG1hcHN0YXIoYXJncyk6CisgICAgcmV0dXJuIG1hcCgqYXJncykKKworIworIyBDb2RlIHJ1biBieSB3b3JrZXIgcHJvY2Vzc2VzCisjCisKK2NsYXNzIE1heWJlRW5jb2RpbmdFcnJvcihFeGNlcHRpb24pOgorICAgICIiIldyYXBzIHBvc3NpYmxlIHVucGlja2xlYWJsZSBlcnJvcnMsIHNvIHRoZXkgY2FuIGJlCisgICAgc2FmZWx5IHNlbnQgdGhyb3VnaCB0aGUgc29ja2V0LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4YywgdmFsdWUpOgorICAgICAgICBzZWxmLmV4YyA9IHJlcHIoZXhjKQorICAgICAgICBzZWxmLnZhbHVlID0gcmVwcih2YWx1ZSkKKyAgICAgICAgc3VwZXIoTWF5YmVFbmNvZGluZ0Vycm9yLCBzZWxmKS5fX2luaXRfXyhzZWxmLmV4Yywgc2VsZi52YWx1ZSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkVycm9yIHNlbmRpbmcgcmVzdWx0OiAnJXMnLiBSZWFzb246ICclcyciICUgKHNlbGYudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5leGMpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPE1heWJlRW5jb2RpbmdFcnJvcjogJXM+IiAlIHN0cihzZWxmKQorCisKK2RlZiB3b3JrZXIoaW5xdWV1ZSwgb3V0cXVldWUsIGluaXRpYWxpemVyPU5vbmUsIGluaXRhcmdzPSgpLCBtYXh0YXNrcz1Ob25lKToKKyAgICBhc3NlcnQgbWF4dGFza3MgaXMgTm9uZSBvciAodHlwZShtYXh0YXNrcykgPT0gaW50IGFuZCBtYXh0YXNrcyA+IDApCisgICAgcHV0ID0gb3V0cXVldWUucHV0CisgICAgZ2V0ID0gaW5xdWV1ZS5nZXQKKyAgICBpZiBoYXNhdHRyKGlucXVldWUsICdfd3JpdGVyJyk6CisgICAgICAgIGlucXVldWUuX3dyaXRlci5jbG9zZSgpCisgICAgICAgIG91dHF1ZXVlLl9yZWFkZXIuY2xvc2UoKQorCisgICAgaWYgaW5pdGlhbGl6ZXIgaXMgbm90IE5vbmU6CisgICAgICAgIGluaXRpYWxpemVyKCppbml0YXJncykKKworICAgIGNvbXBsZXRlZCA9IDAKKyAgICB3aGlsZSBtYXh0YXNrcyBpcyBOb25lIG9yIChtYXh0YXNrcyBhbmQgY29tcGxldGVkIDwgbWF4dGFza3MpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXNrID0gZ2V0KCkKKyAgICAgICAgZXhjZXB0IChFT0ZFcnJvciwgSU9FcnJvcik6CisgICAgICAgICAgICBkZWJ1Zygnd29ya2VyIGdvdCBFT0ZFcnJvciBvciBJT0Vycm9yIC0tIGV4aXRpbmcnKQorICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiB0YXNrIGlzIE5vbmU6CisgICAgICAgICAgICBkZWJ1Zygnd29ya2VyIGdvdCBzZW50aW5lbCAtLSBleGl0aW5nJykKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgam9iLCBpLCBmdW5jLCBhcmdzLCBrd2RzID0gdGFzaworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSAoVHJ1ZSwgZnVuYygqYXJncywgKiprd2RzKSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHJlc3VsdCA9IChGYWxzZSwgZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHV0KChqb2IsIGksIHJlc3VsdCkpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHdyYXBwZWQgPSBNYXliZUVuY29kaW5nRXJyb3IoZSwgcmVzdWx0WzFdKQorICAgICAgICAgICAgZGVidWcoIlBvc3NpYmxlIGVuY29kaW5nIGVycm9yIHdoaWxlIHNlbmRpbmcgcmVzdWx0OiAlcyIgJSAoCisgICAgICAgICAgICAgICAgd3JhcHBlZCkpCisgICAgICAgICAgICBwdXQoKGpvYiwgaSwgKEZhbHNlLCB3cmFwcGVkKSkpCisgICAgICAgIGNvbXBsZXRlZCArPSAxCisgICAgZGVidWcoJ3dvcmtlciBleGl0aW5nIGFmdGVyICVkIHRhc2tzJyAlIGNvbXBsZXRlZCkKKworIworIyBDbGFzcyByZXByZXNlbnRpbmcgYSBwcm9jZXNzIHBvb2wKKyMKKworY2xhc3MgUG9vbChvYmplY3QpOgorICAgICcnJworICAgIENsYXNzIHdoaWNoIHN1cHBvcnRzIGFuIGFzeW5jIHZlcnNpb24gb2YgdGhlIGBhcHBseSgpYCBidWlsdGluCisgICAgJycnCisgICAgUHJvY2VzcyA9IFByb2Nlc3MKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzZXM9Tm9uZSwgaW5pdGlhbGl6ZXI9Tm9uZSwgaW5pdGFyZ3M9KCksCisgICAgICAgICAgICAgICAgIG1heHRhc2tzcGVyY2hpbGQ9Tm9uZSk6CisgICAgICAgIHNlbGYuX3NldHVwX3F1ZXVlcygpCisgICAgICAgIHNlbGYuX3Rhc2txdWV1ZSA9IFF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi5fY2FjaGUgPSB7fQorICAgICAgICBzZWxmLl9zdGF0ZSA9IFJVTgorICAgICAgICBzZWxmLl9tYXh0YXNrc3BlcmNoaWxkID0gbWF4dGFza3NwZXJjaGlsZAorICAgICAgICBzZWxmLl9pbml0aWFsaXplciA9IGluaXRpYWxpemVyCisgICAgICAgIHNlbGYuX2luaXRhcmdzID0gaW5pdGFyZ3MKKworICAgICAgICBpZiBwcm9jZXNzZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwcm9jZXNzZXMgPSBjcHVfY291bnQoKQorICAgICAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAgICAgICAgcHJvY2Vzc2VzID0gMQorICAgICAgICBpZiBwcm9jZXNzZXMgPCAxOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTnVtYmVyIG9mIHByb2Nlc3NlcyBtdXN0IGJlIGF0IGxlYXN0IDEiKQorCisgICAgICAgIGlmIGluaXRpYWxpemVyIGlzIG5vdCBOb25lIGFuZCBub3QgaGFzYXR0cihpbml0aWFsaXplciwgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2luaXRpYWxpemVyIG11c3QgYmUgYSBjYWxsYWJsZScpCisKKyAgICAgICAgc2VsZi5fcHJvY2Vzc2VzID0gcHJvY2Vzc2VzCisgICAgICAgIHNlbGYuX3Bvb2wgPSBbXQorICAgICAgICBzZWxmLl9yZXBvcHVsYXRlX3Bvb2woKQorCisgICAgICAgIHNlbGYuX3dvcmtlcl9oYW5kbGVyID0gdGhyZWFkaW5nLlRocmVhZCgKKyAgICAgICAgICAgIHRhcmdldD1Qb29sLl9oYW5kbGVfd29ya2VycywKKyAgICAgICAgICAgIGFyZ3M9KHNlbGYsICkKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5fd29ya2VyX2hhbmRsZXIuZGFlbW9uID0gVHJ1ZQorICAgICAgICBzZWxmLl93b3JrZXJfaGFuZGxlci5fc3RhdGUgPSBSVU4KKyAgICAgICAgc2VsZi5fd29ya2VyX2hhbmRsZXIuc3RhcnQoKQorCisKKyAgICAgICAgc2VsZi5fdGFza19oYW5kbGVyID0gdGhyZWFkaW5nLlRocmVhZCgKKyAgICAgICAgICAgIHRhcmdldD1Qb29sLl9oYW5kbGVfdGFza3MsCisgICAgICAgICAgICBhcmdzPShzZWxmLl90YXNrcXVldWUsIHNlbGYuX3F1aWNrX3B1dCwgc2VsZi5fb3V0cXVldWUsIHNlbGYuX3Bvb2wpCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuX3Rhc2tfaGFuZGxlci5kYWVtb24gPSBUcnVlCisgICAgICAgIHNlbGYuX3Rhc2tfaGFuZGxlci5fc3RhdGUgPSBSVU4KKyAgICAgICAgc2VsZi5fdGFza19oYW5kbGVyLnN0YXJ0KCkKKworICAgICAgICBzZWxmLl9yZXN1bHRfaGFuZGxlciA9IHRocmVhZGluZy5UaHJlYWQoCisgICAgICAgICAgICB0YXJnZXQ9UG9vbC5faGFuZGxlX3Jlc3VsdHMsCisgICAgICAgICAgICBhcmdzPShzZWxmLl9vdXRxdWV1ZSwgc2VsZi5fcXVpY2tfZ2V0LCBzZWxmLl9jYWNoZSkKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5fcmVzdWx0X2hhbmRsZXIuZGFlbW9uID0gVHJ1ZQorICAgICAgICBzZWxmLl9yZXN1bHRfaGFuZGxlci5fc3RhdGUgPSBSVU4KKyAgICAgICAgc2VsZi5fcmVzdWx0X2hhbmRsZXIuc3RhcnQoKQorCisgICAgICAgIHNlbGYuX3Rlcm1pbmF0ZSA9IEZpbmFsaXplKAorICAgICAgICAgICAgc2VsZiwgc2VsZi5fdGVybWluYXRlX3Bvb2wsCisgICAgICAgICAgICBhcmdzPShzZWxmLl90YXNrcXVldWUsIHNlbGYuX2lucXVldWUsIHNlbGYuX291dHF1ZXVlLCBzZWxmLl9wb29sLAorICAgICAgICAgICAgICAgICAgc2VsZi5fd29ya2VyX2hhbmRsZXIsIHNlbGYuX3Rhc2tfaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX3Jlc3VsdF9oYW5kbGVyLCBzZWxmLl9jYWNoZSksCisgICAgICAgICAgICBleGl0cHJpb3JpdHk9MTUKKyAgICAgICAgICAgICkKKworICAgIGRlZiBfam9pbl9leGl0ZWRfd29ya2VycyhzZWxmKToKKyAgICAgICAgIiIiQ2xlYW51cCBhZnRlciBhbnkgd29ya2VyIHByb2Nlc3NlcyB3aGljaCBoYXZlIGV4aXRlZCBkdWUgdG8gcmVhY2hpbmcKKyAgICAgICAgdGhlaXIgc3BlY2lmaWVkIGxpZmV0aW1lLiAgUmV0dXJucyBUcnVlIGlmIGFueSB3b3JrZXJzIHdlcmUgY2xlYW5lZCB1cC4KKyAgICAgICAgIiIiCisgICAgICAgIGNsZWFuZWQgPSBGYWxzZQorICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5fcG9vbCkpKToKKyAgICAgICAgICAgIHdvcmtlciA9IHNlbGYuX3Bvb2xbaV0KKyAgICAgICAgICAgIGlmIHdvcmtlci5leGl0Y29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIHdvcmtlciBleGl0ZWQKKyAgICAgICAgICAgICAgICBkZWJ1ZygnY2xlYW5pbmcgdXAgd29ya2VyICVkJyAlIGkpCisgICAgICAgICAgICAgICAgd29ya2VyLmpvaW4oKQorICAgICAgICAgICAgICAgIGNsZWFuZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgZGVsIHNlbGYuX3Bvb2xbaV0KKyAgICAgICAgcmV0dXJuIGNsZWFuZWQKKworICAgIGRlZiBfcmVwb3B1bGF0ZV9wb29sKHNlbGYpOgorICAgICAgICAiIiJCcmluZyB0aGUgbnVtYmVyIG9mIHBvb2wgcHJvY2Vzc2VzIHVwIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyLAorICAgICAgICBmb3IgdXNlIGFmdGVyIHJlYXBpbmcgd29ya2VycyB3aGljaCBoYXZlIGV4aXRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuX3Byb2Nlc3NlcyAtIGxlbihzZWxmLl9wb29sKSk6CisgICAgICAgICAgICB3ID0gc2VsZi5Qcm9jZXNzKHRhcmdldD13b3JrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHNlbGYuX2lucXVldWUsIHNlbGYuX291dHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbml0aWFsaXplciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5pdGFyZ3MsIHNlbGYuX21heHRhc2tzcGVyY2hpbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5fcG9vbC5hcHBlbmQodykKKyAgICAgICAgICAgIHcubmFtZSA9IHcubmFtZS5yZXBsYWNlKCdQcm9jZXNzJywgJ1Bvb2xXb3JrZXInKQorICAgICAgICAgICAgdy5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICB3LnN0YXJ0KCkKKyAgICAgICAgICAgIGRlYnVnKCdhZGRlZCB3b3JrZXInKQorCisgICAgZGVmIF9tYWludGFpbl9wb29sKHNlbGYpOgorICAgICAgICAiIiJDbGVhbiB1cCBhbnkgZXhpdGVkIHdvcmtlcnMgYW5kIHN0YXJ0IHJlcGxhY2VtZW50cyBmb3IgdGhlbS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX2pvaW5fZXhpdGVkX3dvcmtlcnMoKToKKyAgICAgICAgICAgIHNlbGYuX3JlcG9wdWxhdGVfcG9vbCgpCisKKyAgICBkZWYgX3NldHVwX3F1ZXVlcyhzZWxmKToKKyAgICAgICAgZnJvbSAucXVldWVzIGltcG9ydCBTaW1wbGVRdWV1ZQorICAgICAgICBzZWxmLl9pbnF1ZXVlID0gU2ltcGxlUXVldWUoKQorICAgICAgICBzZWxmLl9vdXRxdWV1ZSA9IFNpbXBsZVF1ZXVlKCkKKyAgICAgICAgc2VsZi5fcXVpY2tfcHV0ID0gc2VsZi5faW5xdWV1ZS5fd3JpdGVyLnNlbmQKKyAgICAgICAgc2VsZi5fcXVpY2tfZ2V0ID0gc2VsZi5fb3V0cXVldWUuX3JlYWRlci5yZWN2CisKKyAgICBkZWYgYXBwbHkoc2VsZiwgZnVuYywgYXJncz0oKSwga3dkcz17fSk6CisgICAgICAgICcnJworICAgICAgICBFcXVpdmFsZW50IG9mIGBhcHBseSgpYCBidWlsdGluCisgICAgICAgICcnJworICAgICAgICBhc3NlcnQgc2VsZi5fc3RhdGUgPT0gUlVOCisgICAgICAgIHJldHVybiBzZWxmLmFwcGx5X2FzeW5jKGZ1bmMsIGFyZ3MsIGt3ZHMpLmdldCgpCisKKyAgICBkZWYgbWFwKHNlbGYsIGZ1bmMsIGl0ZXJhYmxlLCBjaHVua3NpemU9Tm9uZSk6CisgICAgICAgICcnJworICAgICAgICBFcXVpdmFsZW50IG9mIGBtYXAoKWAgYnVpbHRpbgorICAgICAgICAnJycKKyAgICAgICAgYXNzZXJ0IHNlbGYuX3N0YXRlID09IFJVTgorICAgICAgICByZXR1cm4gc2VsZi5tYXBfYXN5bmMoZnVuYywgaXRlcmFibGUsIGNodW5rc2l6ZSkuZ2V0KCkKKworICAgIGRlZiBpbWFwKHNlbGYsIGZ1bmMsIGl0ZXJhYmxlLCBjaHVua3NpemU9MSk6CisgICAgICAgICcnJworICAgICAgICBFcXVpdmFsZW50IG9mIGBpdGVydG9vbHMuaW1hcCgpYCAtLSBjYW4gYmUgTVVDSCBzbG93ZXIgdGhhbiBgUG9vbC5tYXAoKWAKKyAgICAgICAgJycnCisgICAgICAgIGFzc2VydCBzZWxmLl9zdGF0ZSA9PSBSVU4KKyAgICAgICAgaWYgY2h1bmtzaXplID09IDE6CisgICAgICAgICAgICByZXN1bHQgPSBJTWFwSXRlcmF0b3Ioc2VsZi5fY2FjaGUpCisgICAgICAgICAgICBzZWxmLl90YXNrcXVldWUucHV0KCgoKHJlc3VsdC5fam9iLCBpLCBmdW5jLCAoeCwpLCB7fSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSwgeCBpbiBlbnVtZXJhdGUoaXRlcmFibGUpKSwgcmVzdWx0Ll9zZXRfbGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydCBjaHVua3NpemUgPiAxCisgICAgICAgICAgICB0YXNrX2JhdGNoZXMgPSBQb29sLl9nZXRfdGFza3MoZnVuYywgaXRlcmFibGUsIGNodW5rc2l6ZSkKKyAgICAgICAgICAgIHJlc3VsdCA9IElNYXBJdGVyYXRvcihzZWxmLl9jYWNoZSkKKyAgICAgICAgICAgIHNlbGYuX3Rhc2txdWV1ZS5wdXQoKCgocmVzdWx0Ll9qb2IsIGksIG1hcHN0YXIsICh4LCksIHt9KQorICAgICAgICAgICAgICAgICAgICAgZm9yIGksIHggaW4gZW51bWVyYXRlKHRhc2tfYmF0Y2hlcykpLCByZXN1bHQuX3NldF9sZW5ndGgpKQorICAgICAgICAgICAgcmV0dXJuIChpdGVtIGZvciBjaHVuayBpbiByZXN1bHQgZm9yIGl0ZW0gaW4gY2h1bmspCisKKyAgICBkZWYgaW1hcF91bm9yZGVyZWQoc2VsZiwgZnVuYywgaXRlcmFibGUsIGNodW5rc2l6ZT0xKToKKyAgICAgICAgJycnCisgICAgICAgIExpa2UgYGltYXAoKWAgbWV0aG9kIGJ1dCBvcmRlcmluZyBvZiByZXN1bHRzIGlzIGFyYml0cmFyeQorICAgICAgICAnJycKKyAgICAgICAgYXNzZXJ0IHNlbGYuX3N0YXRlID09IFJVTgorICAgICAgICBpZiBjaHVua3NpemUgPT0gMToKKyAgICAgICAgICAgIHJlc3VsdCA9IElNYXBVbm9yZGVyZWRJdGVyYXRvcihzZWxmLl9jYWNoZSkKKyAgICAgICAgICAgIHNlbGYuX3Rhc2txdWV1ZS5wdXQoKCgocmVzdWx0Ll9qb2IsIGksIGZ1bmMsICh4LCksIHt9KQorICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpLCB4IGluIGVudW1lcmF0ZShpdGVyYWJsZSkpLCByZXN1bHQuX3NldF9sZW5ndGgpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IGNodW5rc2l6ZSA+IDEKKyAgICAgICAgICAgIHRhc2tfYmF0Y2hlcyA9IFBvb2wuX2dldF90YXNrcyhmdW5jLCBpdGVyYWJsZSwgY2h1bmtzaXplKQorICAgICAgICAgICAgcmVzdWx0ID0gSU1hcFVub3JkZXJlZEl0ZXJhdG9yKHNlbGYuX2NhY2hlKQorICAgICAgICAgICAgc2VsZi5fdGFza3F1ZXVlLnB1dCgoKChyZXN1bHQuX2pvYiwgaSwgbWFwc3RhciwgKHgsKSwge30pCisgICAgICAgICAgICAgICAgICAgICBmb3IgaSwgeCBpbiBlbnVtZXJhdGUodGFza19iYXRjaGVzKSksIHJlc3VsdC5fc2V0X2xlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gKGl0ZW0gZm9yIGNodW5rIGluIHJlc3VsdCBmb3IgaXRlbSBpbiBjaHVuaykKKworICAgIGRlZiBhcHBseV9hc3luYyhzZWxmLCBmdW5jLCBhcmdzPSgpLCBrd2RzPXt9LCBjYWxsYmFjaz1Ob25lKToKKyAgICAgICAgJycnCisgICAgICAgIEFzeW5jaHJvbm91cyBlcXVpdmFsZW50IG9mIGBhcHBseSgpYCBidWlsdGluCisgICAgICAgICcnJworICAgICAgICBhc3NlcnQgc2VsZi5fc3RhdGUgPT0gUlVOCisgICAgICAgIHJlc3VsdCA9IEFwcGx5UmVzdWx0KHNlbGYuX2NhY2hlLCBjYWxsYmFjaykKKyAgICAgICAgc2VsZi5fdGFza3F1ZXVlLnB1dCgoWyhyZXN1bHQuX2pvYiwgTm9uZSwgZnVuYywgYXJncywga3dkcyldLCBOb25lKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIG1hcF9hc3luYyhzZWxmLCBmdW5jLCBpdGVyYWJsZSwgY2h1bmtzaXplPU5vbmUsIGNhbGxiYWNrPU5vbmUpOgorICAgICAgICAnJycKKyAgICAgICAgQXN5bmNocm9ub3VzIGVxdWl2YWxlbnQgb2YgYG1hcCgpYCBidWlsdGluCisgICAgICAgICcnJworICAgICAgICBhc3NlcnQgc2VsZi5fc3RhdGUgPT0gUlVOCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKGl0ZXJhYmxlLCAnX19sZW5fXycpOgorICAgICAgICAgICAgaXRlcmFibGUgPSBsaXN0KGl0ZXJhYmxlKQorCisgICAgICAgIGlmIGNodW5rc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgY2h1bmtzaXplLCBleHRyYSA9IGRpdm1vZChsZW4oaXRlcmFibGUpLCBsZW4oc2VsZi5fcG9vbCkgKiA0KQorICAgICAgICAgICAgaWYgZXh0cmE6CisgICAgICAgICAgICAgICAgY2h1bmtzaXplICs9IDEKKyAgICAgICAgaWYgbGVuKGl0ZXJhYmxlKSA9PSAwOgorICAgICAgICAgICAgY2h1bmtzaXplID0gMAorCisgICAgICAgIHRhc2tfYmF0Y2hlcyA9IFBvb2wuX2dldF90YXNrcyhmdW5jLCBpdGVyYWJsZSwgY2h1bmtzaXplKQorICAgICAgICByZXN1bHQgPSBNYXBSZXN1bHQoc2VsZi5fY2FjaGUsIGNodW5rc2l6ZSwgbGVuKGl0ZXJhYmxlKSwgY2FsbGJhY2spCisgICAgICAgIHNlbGYuX3Rhc2txdWV1ZS5wdXQoKCgocmVzdWx0Ll9qb2IsIGksIG1hcHN0YXIsICh4LCksIHt9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGksIHggaW4gZW51bWVyYXRlKHRhc2tfYmF0Y2hlcykpLCBOb25lKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaGFuZGxlX3dvcmtlcnMocG9vbCk6CisgICAgICAgIHRocmVhZCA9IHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpCisKKyAgICAgICAgIyBLZWVwIG1haW50YWluaW5nIHdvcmtlcnMgdW50aWwgdGhlIGNhY2hlIGdldHMgZHJhaW5lZCwgdW5sZXNzIHRoZSBwb29sCisgICAgICAgICMgaXMgdGVybWluYXRlZC4KKyAgICAgICAgd2hpbGUgdGhyZWFkLl9zdGF0ZSA9PSBSVU4gb3IgKHBvb2wuX2NhY2hlIGFuZCB0aHJlYWQuX3N0YXRlICE9IFRFUk1JTkFURSk6CisgICAgICAgICAgICBwb29sLl9tYWludGFpbl9wb29sKCkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICAjIHNlbmQgc2VudGluZWwgdG8gc3RvcCB3b3JrZXJzCisgICAgICAgIHBvb2wuX3Rhc2txdWV1ZS5wdXQoTm9uZSkKKyAgICAgICAgZGVidWcoJ3dvcmtlciBoYW5kbGVyIGV4aXRpbmcnKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaGFuZGxlX3Rhc2tzKHRhc2txdWV1ZSwgcHV0LCBvdXRxdWV1ZSwgcG9vbCk6CisgICAgICAgIHRocmVhZCA9IHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpCisKKyAgICAgICAgZm9yIHRhc2tzZXEsIHNldF9sZW5ndGggaW4gaXRlcih0YXNrcXVldWUuZ2V0LCBOb25lKToKKyAgICAgICAgICAgIGkgPSAtMQorICAgICAgICAgICAgZm9yIGksIHRhc2sgaW4gZW51bWVyYXRlKHRhc2tzZXEpOgorICAgICAgICAgICAgICAgIGlmIHRocmVhZC5fc3RhdGU6CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKCd0YXNrIGhhbmRsZXIgZm91bmQgdGhyZWFkLl9zdGF0ZSAhPSBSVU4nKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcHV0KHRhc2spCisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKCdjb3VsZCBub3QgcHV0IHRhc2sgb24gcXVldWUnKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZXRfbGVuZ3RoOgorICAgICAgICAgICAgICAgICAgICBkZWJ1ZygnZG9pbmcgc2V0X2xlbmd0aCgpJykKKyAgICAgICAgICAgICAgICAgICAgc2V0X2xlbmd0aChpKzEpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZWJ1ZygndGFzayBoYW5kbGVyIGdvdCBzZW50aW5lbCcpCisKKworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHRlbGwgcmVzdWx0IGhhbmRsZXIgdG8gZmluaXNoIHdoZW4gY2FjaGUgaXMgZW1wdHkKKyAgICAgICAgICAgIGRlYnVnKCd0YXNrIGhhbmRsZXIgc2VuZGluZyBzZW50aW5lbCB0byByZXN1bHQgaGFuZGxlcicpCisgICAgICAgICAgICBvdXRxdWV1ZS5wdXQoTm9uZSkKKworICAgICAgICAgICAgIyB0ZWxsIHdvcmtlcnMgdGhlcmUgaXMgbm8gbW9yZSB3b3JrCisgICAgICAgICAgICBkZWJ1ZygndGFzayBoYW5kbGVyIHNlbmRpbmcgc2VudGluZWwgdG8gd29ya2VycycpCisgICAgICAgICAgICBmb3IgcCBpbiBwb29sOgorICAgICAgICAgICAgICAgIHB1dChOb25lKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIGRlYnVnKCd0YXNrIGhhbmRsZXIgZ290IElPRXJyb3Igd2hlbiBzZW5kaW5nIHNlbnRpbmVscycpCisKKyAgICAgICAgZGVidWcoJ3Rhc2sgaGFuZGxlciBleGl0aW5nJykKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2hhbmRsZV9yZXN1bHRzKG91dHF1ZXVlLCBnZXQsIGNhY2hlKToKKyAgICAgICAgdGhyZWFkID0gdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkKKworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhc2sgPSBnZXQoKQorICAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBFT0ZFcnJvcik6CisgICAgICAgICAgICAgICAgZGVidWcoJ3Jlc3VsdCBoYW5kbGVyIGdvdCBFT0ZFcnJvci9JT0Vycm9yIC0tIGV4aXRpbmcnKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBpZiB0aHJlYWQuX3N0YXRlOgorICAgICAgICAgICAgICAgIGFzc2VydCB0aHJlYWQuX3N0YXRlID09IFRFUk1JTkFURQorICAgICAgICAgICAgICAgIGRlYnVnKCdyZXN1bHQgaGFuZGxlciBmb3VuZCB0aHJlYWQuX3N0YXRlPVRFUk1JTkFURScpCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgaWYgdGFzayBpcyBOb25lOgorICAgICAgICAgICAgICAgIGRlYnVnKCdyZXN1bHQgaGFuZGxlciBnb3Qgc2VudGluZWwnKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGpvYiwgaSwgb2JqID0gdGFzaworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNhY2hlW2pvYl0uX3NldChpLCBvYmopCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHdoaWxlIGNhY2hlIGFuZCB0aHJlYWQuX3N0YXRlICE9IFRFUk1JTkFURToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YXNrID0gZ2V0KCkKKyAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgRU9GRXJyb3IpOgorICAgICAgICAgICAgICAgIGRlYnVnKCdyZXN1bHQgaGFuZGxlciBnb3QgRU9GRXJyb3IvSU9FcnJvciAtLSBleGl0aW5nJykKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgaWYgdGFzayBpcyBOb25lOgorICAgICAgICAgICAgICAgIGRlYnVnKCdyZXN1bHQgaGFuZGxlciBpZ25vcmluZyBleHRyYSBzZW50aW5lbCcpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGpvYiwgaSwgb2JqID0gdGFzaworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNhY2hlW2pvYl0uX3NldChpLCBvYmopCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIGhhc2F0dHIob3V0cXVldWUsICdfcmVhZGVyJyk6CisgICAgICAgICAgICBkZWJ1ZygnZW5zdXJpbmcgdGhhdCBvdXRxdWV1ZSBpcyBub3QgZnVsbCcpCisgICAgICAgICAgICAjIElmIHdlIGRvbid0IG1ha2Ugcm9vbSBhdmFpbGFibGUgaW4gb3V0cXVldWUgdGhlbgorICAgICAgICAgICAgIyBhdHRlbXB0cyB0byBhZGQgdGhlIHNlbnRpbmVsIChOb25lKSB0byBvdXRxdWV1ZSBtYXkKKyAgICAgICAgICAgICMgYmxvY2suICBUaGVyZSBpcyBndWFyYW50ZWVkIHRvIGJlIG5vIG1vcmUgdGhhbiAyIHNlbnRpbmVscy4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBvdXRxdWV1ZS5fcmVhZGVyLnBvbGwoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGdldCgpCisgICAgICAgICAgICBleGNlcHQgKElPRXJyb3IsIEVPRkVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVidWcoJ3Jlc3VsdCBoYW5kbGVyIGV4aXRpbmc6IGxlbihjYWNoZSk9JXMsIHRocmVhZC5fc3RhdGU9JXMnLAorICAgICAgICAgICAgICBsZW4oY2FjaGUpLCB0aHJlYWQuX3N0YXRlKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfZ2V0X3Rhc2tzKGZ1bmMsIGl0LCBzaXplKToKKyAgICAgICAgaXQgPSBpdGVyKGl0KQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgeCA9IHR1cGxlKGl0ZXJ0b29scy5pc2xpY2UoaXQsIHNpemUpKQorICAgICAgICAgICAgaWYgbm90IHg6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICB5aWVsZCAoZnVuYywgeCkKKworICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAgICAgICAncG9vbCBvYmplY3RzIGNhbm5vdCBiZSBwYXNzZWQgYmV0d2VlbiBwcm9jZXNzZXMgb3IgcGlja2xlZCcKKyAgICAgICAgICAgICAgKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBkZWJ1ZygnY2xvc2luZyBwb29sJykKKyAgICAgICAgaWYgc2VsZi5fc3RhdGUgPT0gUlVOOgorICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSBDTE9TRQorICAgICAgICAgICAgc2VsZi5fd29ya2VyX2hhbmRsZXIuX3N0YXRlID0gQ0xPU0UKKworICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIGRlYnVnKCd0ZXJtaW5hdGluZyBwb29sJykKKyAgICAgICAgc2VsZi5fc3RhdGUgPSBURVJNSU5BVEUKKyAgICAgICAgc2VsZi5fd29ya2VyX2hhbmRsZXIuX3N0YXRlID0gVEVSTUlOQVRFCisgICAgICAgIHNlbGYuX3Rlcm1pbmF0ZSgpCisKKyAgICBkZWYgam9pbihzZWxmKToKKyAgICAgICAgZGVidWcoJ2pvaW5pbmcgcG9vbCcpCisgICAgICAgIGFzc2VydCBzZWxmLl9zdGF0ZSBpbiAoQ0xPU0UsIFRFUk1JTkFURSkKKyAgICAgICAgc2VsZi5fd29ya2VyX2hhbmRsZXIuam9pbigpCisgICAgICAgIHNlbGYuX3Rhc2tfaGFuZGxlci5qb2luKCkKKyAgICAgICAgc2VsZi5fcmVzdWx0X2hhbmRsZXIuam9pbigpCisgICAgICAgIGZvciBwIGluIHNlbGYuX3Bvb2w6CisgICAgICAgICAgICBwLmpvaW4oKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaGVscF9zdHVmZl9maW5pc2goaW5xdWV1ZSwgdGFza19oYW5kbGVyLCBzaXplKToKKyAgICAgICAgIyB0YXNrX2hhbmRsZXIgbWF5IGJlIGJsb2NrZWQgdHJ5aW5nIHRvIHB1dCBpdGVtcyBvbiBpbnF1ZXVlCisgICAgICAgIGRlYnVnKCdyZW1vdmluZyB0YXNrcyBmcm9tIGlucXVldWUgdW50aWwgdGFzayBoYW5kbGVyIGZpbmlzaGVkJykKKyAgICAgICAgaW5xdWV1ZS5fcmxvY2suYWNxdWlyZSgpCisgICAgICAgIHdoaWxlIHRhc2tfaGFuZGxlci5pc19hbGl2ZSgpIGFuZCBpbnF1ZXVlLl9yZWFkZXIucG9sbCgpOgorICAgICAgICAgICAgaW5xdWV1ZS5fcmVhZGVyLnJlY3YoKQorICAgICAgICAgICAgdGltZS5zbGVlcCgwKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF90ZXJtaW5hdGVfcG9vbChjbHMsIHRhc2txdWV1ZSwgaW5xdWV1ZSwgb3V0cXVldWUsIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJfaGFuZGxlciwgdGFza19oYW5kbGVyLCByZXN1bHRfaGFuZGxlciwgY2FjaGUpOgorICAgICAgICAjIHRoaXMgaXMgZ3VhcmFudGVlZCB0byBvbmx5IGJlIGNhbGxlZCBvbmNlCisgICAgICAgIGRlYnVnKCdmaW5hbGl6aW5nIHBvb2wnKQorCisgICAgICAgIHdvcmtlcl9oYW5kbGVyLl9zdGF0ZSA9IFRFUk1JTkFURQorICAgICAgICB0YXNrX2hhbmRsZXIuX3N0YXRlID0gVEVSTUlOQVRFCisKKyAgICAgICAgZGVidWcoJ2hlbHBpbmcgdGFzayBoYW5kbGVyL3dvcmtlcnMgdG8gZmluaXNoJykKKyAgICAgICAgY2xzLl9oZWxwX3N0dWZmX2ZpbmlzaChpbnF1ZXVlLCB0YXNrX2hhbmRsZXIsIGxlbihwb29sKSkKKworICAgICAgICBhc3NlcnQgcmVzdWx0X2hhbmRsZXIuaXNfYWxpdmUoKSBvciBsZW4oY2FjaGUpID09IDAKKworICAgICAgICByZXN1bHRfaGFuZGxlci5fc3RhdGUgPSBURVJNSU5BVEUKKyAgICAgICAgb3V0cXVldWUucHV0KE5vbmUpICAgICAgICAgICAgICAgICAgIyBzZW50aW5lbAorCisgICAgICAgICMgV2UgbXVzdCB3YWl0IGZvciB0aGUgd29ya2VyIGhhbmRsZXIgdG8gZXhpdCBiZWZvcmUgdGVybWluYXRpbmcKKyAgICAgICAgIyB3b3JrZXJzIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB3b3JrZXJzIHRvIGJlIHJlc3RhcnRlZCBiZWhpbmQgb3VyIGJhY2suCisgICAgICAgIGRlYnVnKCdqb2luaW5nIHdvcmtlciBoYW5kbGVyJykKKyAgICAgICAgaWYgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkgaXMgbm90IHdvcmtlcl9oYW5kbGVyOgorICAgICAgICAgICAgd29ya2VyX2hhbmRsZXIuam9pbigxZTEwMCkKKworICAgICAgICAjIFRlcm1pbmF0ZSB3b3JrZXJzIHdoaWNoIGhhdmVuJ3QgYWxyZWFkeSBmaW5pc2hlZC4KKyAgICAgICAgaWYgcG9vbCBhbmQgaGFzYXR0cihwb29sWzBdLCAndGVybWluYXRlJyk6CisgICAgICAgICAgICBkZWJ1ZygndGVybWluYXRpbmcgd29ya2VycycpCisgICAgICAgICAgICBmb3IgcCBpbiBwb29sOgorICAgICAgICAgICAgICAgIGlmIHAuZXhpdGNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcC50ZXJtaW5hdGUoKQorCisgICAgICAgIGRlYnVnKCdqb2luaW5nIHRhc2sgaGFuZGxlcicpCisgICAgICAgIGlmIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpIGlzIG5vdCB0YXNrX2hhbmRsZXI6CisgICAgICAgICAgICB0YXNrX2hhbmRsZXIuam9pbigxZTEwMCkKKworICAgICAgICBkZWJ1Zygnam9pbmluZyByZXN1bHQgaGFuZGxlcicpCisgICAgICAgIGlmIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpIGlzIG5vdCByZXN1bHRfaGFuZGxlcjoKKyAgICAgICAgICAgIHJlc3VsdF9oYW5kbGVyLmpvaW4oMWUxMDApCisKKyAgICAgICAgaWYgcG9vbCBhbmQgaGFzYXR0cihwb29sWzBdLCAndGVybWluYXRlJyk6CisgICAgICAgICAgICBkZWJ1Zygnam9pbmluZyBwb29sIHdvcmtlcnMnKQorICAgICAgICAgICAgZm9yIHAgaW4gcG9vbDoKKyAgICAgICAgICAgICAgICBpZiBwLmlzX2FsaXZlKCk6CisgICAgICAgICAgICAgICAgICAgICMgd29ya2VyIGhhcyBub3QgeWV0IGV4aXRlZAorICAgICAgICAgICAgICAgICAgICBkZWJ1ZygnY2xlYW5pbmcgdXAgd29ya2VyICVkJyAlIHAucGlkKQorICAgICAgICAgICAgICAgICAgICBwLmpvaW4oKQorCisjCisjIENsYXNzIHdob3NlIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgYnkgYFBvb2wuYXBwbHlfYXN5bmMoKWAKKyMKKworY2xhc3MgQXBwbHlSZXN1bHQob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWNoZSwgY2FsbGJhY2spOgorICAgICAgICBzZWxmLl9jb25kID0gdGhyZWFkaW5nLkNvbmRpdGlvbih0aHJlYWRpbmcuTG9jaygpKQorICAgICAgICBzZWxmLl9qb2IgPSBqb2JfY291bnRlci5uZXh0KCkKKyAgICAgICAgc2VsZi5fY2FjaGUgPSBjYWNoZQorICAgICAgICBzZWxmLl9yZWFkeSA9IEZhbHNlCisgICAgICAgIHNlbGYuX2NhbGxiYWNrID0gY2FsbGJhY2sKKyAgICAgICAgY2FjaGVbc2VsZi5fam9iXSA9IHNlbGYKKworICAgIGRlZiByZWFkeShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWR5CisKKyAgICBkZWYgc3VjY2Vzc2Z1bChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuX3JlYWR5CisgICAgICAgIHJldHVybiBzZWxmLl9zdWNjZXNzCisKKyAgICBkZWYgd2FpdChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICBzZWxmLl9jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fcmVhZHk6CisgICAgICAgICAgICAgICAgc2VsZi5fY29uZC53YWl0KHRpbWVvdXQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb25kLnJlbGVhc2UoKQorCisgICAgZGVmIGdldChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICBzZWxmLndhaXQodGltZW91dCkKKyAgICAgICAgaWYgbm90IHNlbGYuX3JlYWR5OgorICAgICAgICAgICAgcmFpc2UgVGltZW91dEVycm9yCisgICAgICAgIGlmIHNlbGYuX3N1Y2Nlc3M6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuX3ZhbHVlCisKKyAgICBkZWYgX3NldChzZWxmLCBpLCBvYmopOgorICAgICAgICBzZWxmLl9zdWNjZXNzLCBzZWxmLl92YWx1ZSA9IG9iagorICAgICAgICBpZiBzZWxmLl9jYWxsYmFjayBhbmQgc2VsZi5fc3VjY2VzczoKKyAgICAgICAgICAgIHNlbGYuX2NhbGxiYWNrKHNlbGYuX3ZhbHVlKQorICAgICAgICBzZWxmLl9jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9yZWFkeSA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuX2NvbmQubm90aWZ5KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NvbmQucmVsZWFzZSgpCisgICAgICAgIGRlbCBzZWxmLl9jYWNoZVtzZWxmLl9qb2JdCisKK0FzeW5jUmVzdWx0ID0gQXBwbHlSZXN1bHQgICAgICAgIyBjcmVhdGUgYWxpYXMgLS0gc2VlICMxNzgwNQorCisjCisjIENsYXNzIHdob3NlIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgYnkgYFBvb2wubWFwX2FzeW5jKClgCisjCisKK2NsYXNzIE1hcFJlc3VsdChBcHBseVJlc3VsdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FjaGUsIGNodW5rc2l6ZSwgbGVuZ3RoLCBjYWxsYmFjayk6CisgICAgICAgIEFwcGx5UmVzdWx0Ll9faW5pdF9fKHNlbGYsIGNhY2hlLCBjYWxsYmFjaykKKyAgICAgICAgc2VsZi5fc3VjY2VzcyA9IFRydWUKKyAgICAgICAgc2VsZi5fdmFsdWUgPSBbTm9uZV0gKiBsZW5ndGgKKyAgICAgICAgc2VsZi5fY2h1bmtzaXplID0gY2h1bmtzaXplCisgICAgICAgIGlmIGNodW5rc2l6ZSA8PSAwOgorICAgICAgICAgICAgc2VsZi5fbnVtYmVyX2xlZnQgPSAwCisgICAgICAgICAgICBzZWxmLl9yZWFkeSA9IFRydWUKKyAgICAgICAgICAgIGRlbCBjYWNoZVtzZWxmLl9qb2JdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9udW1iZXJfbGVmdCA9IGxlbmd0aC8vY2h1bmtzaXplICsgYm9vbChsZW5ndGggJSBjaHVua3NpemUpCisKKyAgICBkZWYgX3NldChzZWxmLCBpLCBzdWNjZXNzX3Jlc3VsdCk6CisgICAgICAgIHN1Y2Nlc3MsIHJlc3VsdCA9IHN1Y2Nlc3NfcmVzdWx0CisgICAgICAgIGlmIHN1Y2Nlc3M6CisgICAgICAgICAgICBzZWxmLl92YWx1ZVtpKnNlbGYuX2NodW5rc2l6ZTooaSsxKSpzZWxmLl9jaHVua3NpemVdID0gcmVzdWx0CisgICAgICAgICAgICBzZWxmLl9udW1iZXJfbGVmdCAtPSAxCisgICAgICAgICAgICBpZiBzZWxmLl9udW1iZXJfbGVmdCA9PSAwOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jYWxsYmFjayhzZWxmLl92YWx1ZSkKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fY2FjaGVbc2VsZi5fam9iXQorICAgICAgICAgICAgICAgIHNlbGYuX2NvbmQuYWNxdWlyZSgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkeSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29uZC5ub3RpZnkoKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbmQucmVsZWFzZSgpCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3N1Y2Nlc3MgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSByZXN1bHQKKyAgICAgICAgICAgIGRlbCBzZWxmLl9jYWNoZVtzZWxmLl9qb2JdCisgICAgICAgICAgICBzZWxmLl9jb25kLmFjcXVpcmUoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3JlYWR5ID0gVHJ1ZQorICAgICAgICAgICAgICAgIHNlbGYuX2NvbmQubm90aWZ5KCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2VsZi5fY29uZC5yZWxlYXNlKCkKKworIworIyBDbGFzcyB3aG9zZSBpbnN0YW5jZXMgYXJlIHJldHVybmVkIGJ5IGBQb29sLmltYXAoKWAKKyMKKworY2xhc3MgSU1hcEl0ZXJhdG9yKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FjaGUpOgorICAgICAgICBzZWxmLl9jb25kID0gdGhyZWFkaW5nLkNvbmRpdGlvbih0aHJlYWRpbmcuTG9jaygpKQorICAgICAgICBzZWxmLl9qb2IgPSBqb2JfY291bnRlci5uZXh0KCkKKyAgICAgICAgc2VsZi5fY2FjaGUgPSBjYWNoZQorICAgICAgICBzZWxmLl9pdGVtcyA9IGNvbGxlY3Rpb25zLmRlcXVlKCkKKyAgICAgICAgc2VsZi5faW5kZXggPSAwCisgICAgICAgIHNlbGYuX2xlbmd0aCA9IE5vbmUKKyAgICAgICAgc2VsZi5fdW5zb3J0ZWQgPSB7fQorICAgICAgICBjYWNoZVtzZWxmLl9qb2JdID0gc2VsZgorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgc2VsZi5fY29uZC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGl0ZW0gPSBzZWxmLl9pdGVtcy5wb3BsZWZ0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2luZGV4ID09IHNlbGYuX2xlbmd0aDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbmQud2FpdCh0aW1lb3V0KQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IHNlbGYuX2l0ZW1zLnBvcGxlZnQoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9pbmRleCA9PSBzZWxmLl9sZW5ndGg6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRpbWVvdXRFcnJvcgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY29uZC5yZWxlYXNlKCkKKworICAgICAgICBzdWNjZXNzLCB2YWx1ZSA9IGl0ZW0KKyAgICAgICAgaWYgc3VjY2VzczoKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICByYWlzZSB2YWx1ZQorCisgICAgX19uZXh0X18gPSBuZXh0ICAgICAgICAgICAgICAgICAgICAjIFhYWAorCisgICAgZGVmIF9zZXQoc2VsZiwgaSwgb2JqKToKKyAgICAgICAgc2VsZi5fY29uZC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5faW5kZXggPT0gaToKKyAgICAgICAgICAgICAgICBzZWxmLl9pdGVtcy5hcHBlbmQob2JqKQorICAgICAgICAgICAgICAgIHNlbGYuX2luZGV4ICs9IDEKKyAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLl9pbmRleCBpbiBzZWxmLl91bnNvcnRlZDoKKyAgICAgICAgICAgICAgICAgICAgb2JqID0gc2VsZi5fdW5zb3J0ZWQucG9wKHNlbGYuX2luZGV4KQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pdGVtcy5hcHBlbmQob2JqKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbmRleCArPSAxCisgICAgICAgICAgICAgICAgc2VsZi5fY29uZC5ub3RpZnkoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl91bnNvcnRlZFtpXSA9IG9iagorCisgICAgICAgICAgICBpZiBzZWxmLl9pbmRleCA9PSBzZWxmLl9sZW5ndGg6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2NhY2hlW3NlbGYuX2pvYl0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NvbmQucmVsZWFzZSgpCisKKyAgICBkZWYgX3NldF9sZW5ndGgoc2VsZiwgbGVuZ3RoKToKKyAgICAgICAgc2VsZi5fY29uZC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fbGVuZ3RoID0gbGVuZ3RoCisgICAgICAgICAgICBpZiBzZWxmLl9pbmRleCA9PSBzZWxmLl9sZW5ndGg6CisgICAgICAgICAgICAgICAgc2VsZi5fY29uZC5ub3RpZnkoKQorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9jYWNoZVtzZWxmLl9qb2JdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb25kLnJlbGVhc2UoKQorCisjCisjIENsYXNzIHdob3NlIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgYnkgYFBvb2wuaW1hcF91bm9yZGVyZWQoKWAKKyMKKworY2xhc3MgSU1hcFVub3JkZXJlZEl0ZXJhdG9yKElNYXBJdGVyYXRvcik6CisKKyAgICBkZWYgX3NldChzZWxmLCBpLCBvYmopOgorICAgICAgICBzZWxmLl9jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9pdGVtcy5hcHBlbmQob2JqKQorICAgICAgICAgICAgc2VsZi5faW5kZXggKz0gMQorICAgICAgICAgICAgc2VsZi5fY29uZC5ub3RpZnkoKQorICAgICAgICAgICAgaWYgc2VsZi5faW5kZXggPT0gc2VsZi5fbGVuZ3RoOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9jYWNoZVtzZWxmLl9qb2JdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb25kLnJlbGVhc2UoKQorCisjCisjCisjCisKK2NsYXNzIFRocmVhZFBvb2woUG9vbCk6CisKKyAgICBmcm9tIC5kdW1teSBpbXBvcnQgUHJvY2VzcworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3Nlcz1Ob25lLCBpbml0aWFsaXplcj1Ob25lLCBpbml0YXJncz0oKSk6CisgICAgICAgIFBvb2wuX19pbml0X18oc2VsZiwgcHJvY2Vzc2VzLCBpbml0aWFsaXplciwgaW5pdGFyZ3MpCisKKyAgICBkZWYgX3NldHVwX3F1ZXVlcyhzZWxmKToKKyAgICAgICAgc2VsZi5faW5xdWV1ZSA9IFF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi5fb3V0cXVldWUgPSBRdWV1ZS5RdWV1ZSgpCisgICAgICAgIHNlbGYuX3F1aWNrX3B1dCA9IHNlbGYuX2lucXVldWUucHV0CisgICAgICAgIHNlbGYuX3F1aWNrX2dldCA9IHNlbGYuX291dHF1ZXVlLmdldAorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaGVscF9zdHVmZl9maW5pc2goaW5xdWV1ZSwgdGFza19oYW5kbGVyLCBzaXplKToKKyAgICAgICAgIyBwdXQgc2VudGluZWxzIGF0IGhlYWQgb2YgaW5xdWV1ZSB0byBtYWtlIHdvcmtlcnMgZmluaXNoCisgICAgICAgIGlucXVldWUubm90X2VtcHR5LmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbnF1ZXVlLnF1ZXVlLmNsZWFyKCkKKyAgICAgICAgICAgIGlucXVldWUucXVldWUuZXh0ZW5kKFtOb25lXSAqIHNpemUpCisgICAgICAgICAgICBpbnF1ZXVlLm5vdF9lbXB0eS5ub3RpZnlfYWxsKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlucXVldWUubm90X2VtcHR5LnJlbGVhc2UoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weWMgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9wb29sLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjhjNmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weW8gYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9wb29sLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQyZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcHJvY2Vzcy5weSBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3Byb2Nlc3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyZWEwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3Byb2Nlc3MucHkKQEAgLTAsMCArMSwzMjMgQEAKKyMKKyMgTW9kdWxlIHByb3ZpZGluZyB0aGUgYFByb2Nlc3NgIGNsYXNzIHdoaWNoIGVtdWxhdGVzIGB0aHJlYWRpbmcuVGhyZWFkYAorIworIyBtdWx0aXByb2Nlc3NpbmcvcHJvY2Vzcy5weQorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgUiBPdWRrZXJrCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyMgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCitfX2FsbF9fID0gWydQcm9jZXNzJywgJ2N1cnJlbnRfcHJvY2VzcycsICdhY3RpdmVfY2hpbGRyZW4nXQorCisjCisjIEltcG9ydHMKKyMKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgaXRlcnRvb2xzCisKKyMKKyMKKyMKKwordHJ5OgorICAgIE9SSUdJTkFMX0RJUiA9IG9zLnBhdGguYWJzcGF0aChvcy5nZXRjd2QoKSkKK2V4Y2VwdCBPU0Vycm9yOgorICAgIE9SSUdJTkFMX0RJUiA9IE5vbmUKKworIworIyBQdWJsaWMgZnVuY3Rpb25zCisjCisKK2RlZiBjdXJyZW50X3Byb2Nlc3MoKToKKyAgICAnJycKKyAgICBSZXR1cm4gcHJvY2VzcyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHByb2Nlc3MKKyAgICAnJycKKyAgICByZXR1cm4gX2N1cnJlbnRfcHJvY2VzcworCitkZWYgYWN0aXZlX2NoaWxkcmVuKCk6CisgICAgJycnCisgICAgUmV0dXJuIGxpc3Qgb2YgcHJvY2VzcyBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gbGl2ZSBjaGlsZCBwcm9jZXNzZXMKKyAgICAnJycKKyAgICBfY2xlYW51cCgpCisgICAgcmV0dXJuIGxpc3QoX2N1cnJlbnRfcHJvY2Vzcy5fY2hpbGRyZW4pCisKKyMKKyMKKyMKKworZGVmIF9jbGVhbnVwKCk6CisgICAgIyBjaGVjayBmb3IgcHJvY2Vzc2VzIHdoaWNoIGhhdmUgZmluaXNoZWQKKyAgICBmb3IgcCBpbiBsaXN0KF9jdXJyZW50X3Byb2Nlc3MuX2NoaWxkcmVuKToKKyAgICAgICAgaWYgcC5fcG9wZW4ucG9sbCgpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgX2N1cnJlbnRfcHJvY2Vzcy5fY2hpbGRyZW4uZGlzY2FyZChwKQorCisjCisjIFRoZSBgUHJvY2Vzc2AgY2xhc3MKKyMKKworY2xhc3MgUHJvY2VzcyhvYmplY3QpOgorICAgICcnJworICAgIFByb2Nlc3Mgb2JqZWN0cyByZXByZXNlbnQgYWN0aXZpdHkgdGhhdCBpcyBydW4gaW4gYSBzZXBhcmF0ZSBwcm9jZXNzCisKKyAgICBUaGUgY2xhc3MgaXMgYW5hbGFnb3VzIHRvIGB0aHJlYWRpbmcuVGhyZWFkYAorICAgICcnJworICAgIF9Qb3BlbiA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncm91cD1Ob25lLCB0YXJnZXQ9Tm9uZSwgbmFtZT1Ob25lLCBhcmdzPSgpLCBrd2FyZ3M9e30pOgorICAgICAgICBhc3NlcnQgZ3JvdXAgaXMgTm9uZSwgJ2dyb3VwIGFyZ3VtZW50IG11c3QgYmUgTm9uZSBmb3Igbm93JworICAgICAgICBjb3VudCA9IF9jdXJyZW50X3Byb2Nlc3MuX2NvdW50ZXIubmV4dCgpCisgICAgICAgIHNlbGYuX2lkZW50aXR5ID0gX2N1cnJlbnRfcHJvY2Vzcy5faWRlbnRpdHkgKyAoY291bnQsKQorICAgICAgICBzZWxmLl9hdXRoa2V5ID0gX2N1cnJlbnRfcHJvY2Vzcy5fYXV0aGtleQorICAgICAgICBzZWxmLl9kYWVtb25pYyA9IF9jdXJyZW50X3Byb2Nlc3MuX2RhZW1vbmljCisgICAgICAgIHNlbGYuX3RlbXBkaXIgPSBfY3VycmVudF9wcm9jZXNzLl90ZW1wZGlyCisgICAgICAgIHNlbGYuX3BhcmVudF9waWQgPSBvcy5nZXRwaWQoKQorICAgICAgICBzZWxmLl9wb3BlbiA9IE5vbmUKKyAgICAgICAgc2VsZi5fdGFyZ2V0ID0gdGFyZ2V0CisgICAgICAgIHNlbGYuX2FyZ3MgPSB0dXBsZShhcmdzKQorICAgICAgICBzZWxmLl9rd2FyZ3MgPSBkaWN0KGt3YXJncykKKyAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUgb3IgdHlwZShzZWxmKS5fX25hbWVfXyArICctJyArIFwKKyAgICAgICAgICAgICAgICAgICAgICc6Jy5qb2luKHN0cihpKSBmb3IgaSBpbiBzZWxmLl9pZGVudGl0eSkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICcnJworICAgICAgICBNZXRob2QgdG8gYmUgcnVuIGluIHN1Yi1wcm9jZXNzOyBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBzdWItY2xhc3MKKyAgICAgICAgJycnCisgICAgICAgIGlmIHNlbGYuX3RhcmdldDoKKyAgICAgICAgICAgIHNlbGYuX3RhcmdldCgqc2VsZi5fYXJncywgKipzZWxmLl9rd2FyZ3MpCisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgICcnJworICAgICAgICBTdGFydCBjaGlsZCBwcm9jZXNzCisgICAgICAgICcnJworICAgICAgICBhc3NlcnQgc2VsZi5fcG9wZW4gaXMgTm9uZSwgJ2Nhbm5vdCBzdGFydCBhIHByb2Nlc3MgdHdpY2UnCisgICAgICAgIGFzc2VydCBzZWxmLl9wYXJlbnRfcGlkID09IG9zLmdldHBpZCgpLCBcCisgICAgICAgICAgICAgICAnY2FuIG9ubHkgc3RhcnQgYSBwcm9jZXNzIG9iamVjdCBjcmVhdGVkIGJ5IGN1cnJlbnQgcHJvY2VzcycKKyAgICAgICAgYXNzZXJ0IG5vdCBfY3VycmVudF9wcm9jZXNzLl9kYWVtb25pYywgXAorICAgICAgICAgICAgICAgJ2RhZW1vbmljIHByb2Nlc3NlcyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBjaGlsZHJlbicKKyAgICAgICAgX2NsZWFudXAoKQorICAgICAgICBpZiBzZWxmLl9Qb3BlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFBvcGVuID0gc2VsZi5fUG9wZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZyb20gLmZvcmtpbmcgaW1wb3J0IFBvcGVuCisgICAgICAgIHNlbGYuX3BvcGVuID0gUG9wZW4oc2VsZikKKyAgICAgICAgX2N1cnJlbnRfcHJvY2Vzcy5fY2hpbGRyZW4uYWRkKHNlbGYpCisKKyAgICBkZWYgdGVybWluYXRlKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgVGVybWluYXRlIHByb2Nlc3M7IHNlbmRzIFNJR1RFUk0gc2lnbmFsIG9yIHVzZXMgVGVybWluYXRlUHJvY2VzcygpCisgICAgICAgICcnJworICAgICAgICBzZWxmLl9wb3Blbi50ZXJtaW5hdGUoKQorCisgICAgZGVmIGpvaW4oc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgJycnCisgICAgICAgIFdhaXQgdW50aWwgY2hpbGQgcHJvY2VzcyB0ZXJtaW5hdGVzCisgICAgICAgICcnJworICAgICAgICBhc3NlcnQgc2VsZi5fcGFyZW50X3BpZCA9PSBvcy5nZXRwaWQoKSwgJ2NhbiBvbmx5IGpvaW4gYSBjaGlsZCBwcm9jZXNzJworICAgICAgICBhc3NlcnQgc2VsZi5fcG9wZW4gaXMgbm90IE5vbmUsICdjYW4gb25seSBqb2luIGEgc3RhcnRlZCBwcm9jZXNzJworICAgICAgICByZXMgPSBzZWxmLl9wb3Blbi53YWl0KHRpbWVvdXQpCisgICAgICAgIGlmIHJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIF9jdXJyZW50X3Byb2Nlc3MuX2NoaWxkcmVuLmRpc2NhcmQoc2VsZikKKworICAgIGRlZiBpc19hbGl2ZShzZWxmKToKKyAgICAgICAgJycnCisgICAgICAgIFJldHVybiB3aGV0aGVyIHByb2Nlc3MgaXMgYWxpdmUKKyAgICAgICAgJycnCisgICAgICAgIGlmIHNlbGYgaXMgX2N1cnJlbnRfcHJvY2VzczoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGFzc2VydCBzZWxmLl9wYXJlbnRfcGlkID09IG9zLmdldHBpZCgpLCAnY2FuIG9ubHkgdGVzdCBhIGNoaWxkIHByb2Nlc3MnCisgICAgICAgIGlmIHNlbGYuX3BvcGVuIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgc2VsZi5fcG9wZW4ucG9sbCgpCisgICAgICAgIHJldHVybiBzZWxmLl9wb3Blbi5yZXR1cm5jb2RlIGlzIE5vbmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZQorCisgICAgQG5hbWUuc2V0dGVyCisgICAgZGVmIG5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5hbWUsIGJhc2VzdHJpbmcpLCAnbmFtZSBtdXN0IGJlIGEgc3RyaW5nJworICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRhZW1vbihzZWxmKToKKyAgICAgICAgJycnCisgICAgICAgIFJldHVybiB3aGV0aGVyIHByb2Nlc3MgaXMgYSBkYWVtb24KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiBzZWxmLl9kYWVtb25pYworCisgICAgQGRhZW1vbi5zZXR0ZXIKKyAgICBkZWYgZGFlbW9uKHNlbGYsIGRhZW1vbmljKToKKyAgICAgICAgJycnCisgICAgICAgIFNldCB3aGV0aGVyIHByb2Nlc3MgaXMgYSBkYWVtb24KKyAgICAgICAgJycnCisgICAgICAgIGFzc2VydCBzZWxmLl9wb3BlbiBpcyBOb25lLCAncHJvY2VzcyBoYXMgYWxyZWFkeSBzdGFydGVkJworICAgICAgICBzZWxmLl9kYWVtb25pYyA9IGRhZW1vbmljCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgYXV0aGtleShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F1dGhrZXkKKworICAgIEBhdXRoa2V5LnNldHRlcgorICAgIGRlZiBhdXRoa2V5KHNlbGYsIGF1dGhrZXkpOgorICAgICAgICAnJycKKyAgICAgICAgU2V0IGF1dGhvcml6YXRpb24ga2V5IG9mIHByb2Nlc3MKKyAgICAgICAgJycnCisgICAgICAgIHNlbGYuX2F1dGhrZXkgPSBBdXRoZW50aWNhdGlvblN0cmluZyhhdXRoa2V5KQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGV4aXRjb2RlKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJuIGV4aXQgY29kZSBvZiBwcm9jZXNzIG9yIGBOb25lYCBpZiBpdCBoYXMgeWV0IHRvIHN0b3AKKyAgICAgICAgJycnCisgICAgICAgIGlmIHNlbGYuX3BvcGVuIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcG9wZW4KKyAgICAgICAgcmV0dXJuIHNlbGYuX3BvcGVuLnBvbGwoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGlkZW50KHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJuIGlkZW50aWZpZXIgKFBJRCkgb2YgcHJvY2VzcyBvciBgTm9uZWAgaWYgaXQgaGFzIHlldCB0byBzdGFydAorICAgICAgICAnJycKKyAgICAgICAgaWYgc2VsZiBpcyBfY3VycmVudF9wcm9jZXNzOgorICAgICAgICAgICAgcmV0dXJuIG9zLmdldHBpZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcG9wZW4gYW5kIHNlbGYuX3BvcGVuLnBpZAorCisgICAgcGlkID0gaWRlbnQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZiBpcyBfY3VycmVudF9wcm9jZXNzOgorICAgICAgICAgICAgc3RhdHVzID0gJ3N0YXJ0ZWQnCisgICAgICAgIGVsaWYgc2VsZi5fcGFyZW50X3BpZCAhPSBvcy5nZXRwaWQoKToKKyAgICAgICAgICAgIHN0YXR1cyA9ICd1bmtub3duJworICAgICAgICBlbGlmIHNlbGYuX3BvcGVuIGlzIE5vbmU6CisgICAgICAgICAgICBzdGF0dXMgPSAnaW5pdGlhbCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuX3BvcGVuLnBvbGwoKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzZWxmLmV4aXRjb2RlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdzdGFydGVkJworCisgICAgICAgIGlmIHR5cGUoc3RhdHVzKSBpcyBpbnQ6CisgICAgICAgICAgICBpZiBzdGF0dXMgPT0gMDoKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAnc3RvcHBlZCcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gJ3N0b3BwZWRbJXNdJyAlIF9leGl0Y29kZV90b19uYW1lLmdldChzdGF0dXMsIHN0YXR1cykKKworICAgICAgICByZXR1cm4gJzwlcyglcywgJXMlcyk+JyAlICh0eXBlKHNlbGYpLl9fbmFtZV9fLCBzZWxmLl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIHNlbGYuX2RhZW1vbmljIGFuZCAnIGRhZW1vbicgb3IgJycpCisKKyAgICAjIworCisgICAgZGVmIF9ib290c3RyYXAoc2VsZik6CisgICAgICAgIGZyb20gLiBpbXBvcnQgdXRpbAorICAgICAgICBnbG9iYWwgX2N1cnJlbnRfcHJvY2VzcworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2NoaWxkcmVuID0gc2V0KCkKKyAgICAgICAgICAgIHNlbGYuX2NvdW50ZXIgPSBpdGVydG9vbHMuY291bnQoMSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMuc3RkaW4uY2xvc2UoKQorICAgICAgICAgICAgICAgIHN5cy5zdGRpbiA9IG9wZW4ob3MuZGV2bnVsbCkKKyAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgX2N1cnJlbnRfcHJvY2VzcyA9IHNlbGYKKyAgICAgICAgICAgIHV0aWwuX2ZpbmFsaXplcl9yZWdpc3RyeS5jbGVhcigpCisgICAgICAgICAgICB1dGlsLl9ydW5fYWZ0ZXJfZm9ya2VycygpCisgICAgICAgICAgICB1dGlsLmluZm8oJ2NoaWxkIHByb2Nlc3MgY2FsbGluZyBzZWxmLnJ1bigpJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bigpCisgICAgICAgICAgICAgICAgZXhpdGNvZGUgPSAwCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHV0aWwuX2V4aXRfZnVuY3Rpb24oKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCwgZToKKyAgICAgICAgICAgIGlmIG5vdCBlLmFyZ3M6CisgICAgICAgICAgICAgICAgZXhpdGNvZGUgPSAxCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZS5hcmdzWzBdLCBpbnQpOgorICAgICAgICAgICAgICAgIGV4aXRjb2RlID0gZS5hcmdzWzBdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoc3RyKGUuYXJnc1swXSkgKyAnXG4nKQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQorICAgICAgICAgICAgICAgIGV4aXRjb2RlID0gMCBpZiBpc2luc3RhbmNlKGUuYXJnc1swXSwgc3RyKSBlbHNlIDEKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZXhpdGNvZGUgPSAxCisgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdQcm9jZXNzICVzOlxuJyAlIHNlbGYubmFtZSkKKyAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisKKyAgICAgICAgdXRpbC5pbmZvKCdwcm9jZXNzIGV4aXRpbmcgd2l0aCBleGl0Y29kZSAlZCcgJSBleGl0Y29kZSkKKyAgICAgICAgcmV0dXJuIGV4aXRjb2RlCisKKyMKKyMgV2Ugc3ViY2xhc3MgYnl0ZXMgdG8gYXZvaWQgYWNjaWRlbnRhbCB0cmFuc21pc3Npb24gb2YgYXV0aCBrZXlzIG92ZXIgbmV0d29yaworIworCitjbGFzcyBBdXRoZW50aWNhdGlvblN0cmluZyhieXRlcyk6CisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIGZyb20gLmZvcmtpbmcgaW1wb3J0IFBvcGVuCisgICAgICAgIGlmIG5vdCBQb3Blbi50aHJlYWRfaXNfc3Bhd25pbmcoKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAgICAgICAnUGlja2xpbmcgYW4gQXV0aGVudGljYXRpb25TdHJpbmcgb2JqZWN0IGlzICcKKyAgICAgICAgICAgICAgICAnZGlzYWxsb3dlZCBmb3Igc2VjdXJpdHkgcmVhc29ucycKKyAgICAgICAgICAgICAgICApCisgICAgICAgIHJldHVybiBBdXRoZW50aWNhdGlvblN0cmluZywgKGJ5dGVzKHNlbGYpLCkKKworIworIyBDcmVhdGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbWFpbiBwcm9jZXNzCisjCisKK2NsYXNzIF9NYWluUHJvY2VzcyhQcm9jZXNzKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5faWRlbnRpdHkgPSAoKQorICAgICAgICBzZWxmLl9kYWVtb25pYyA9IEZhbHNlCisgICAgICAgIHNlbGYuX25hbWUgPSAnTWFpblByb2Nlc3MnCisgICAgICAgIHNlbGYuX3BhcmVudF9waWQgPSBOb25lCisgICAgICAgIHNlbGYuX3BvcGVuID0gTm9uZQorICAgICAgICBzZWxmLl9jb3VudGVyID0gaXRlcnRvb2xzLmNvdW50KDEpCisgICAgICAgIHNlbGYuX2NoaWxkcmVuID0gc2V0KCkKKyAgICAgICAgc2VsZi5fYXV0aGtleSA9IEF1dGhlbnRpY2F0aW9uU3RyaW5nKG9zLnVyYW5kb20oMzIpKQorICAgICAgICBzZWxmLl90ZW1wZGlyID0gTm9uZQorCitfY3VycmVudF9wcm9jZXNzID0gX01haW5Qcm9jZXNzKCkKK2RlbCBfTWFpblByb2Nlc3MKKworIworIyBHaXZlIG5hbWVzIHRvIHNvbWUgcmV0dXJuIGNvZGVzCisjCisKK19leGl0Y29kZV90b19uYW1lID0ge30KKworZm9yIG5hbWUsIHNpZ251bSBpbiBzaWduYWwuX19kaWN0X18uaXRlbXMoKToKKyAgICBpZiBuYW1lWzozXT09J1NJRycgYW5kICdfJyBub3QgaW4gbmFtZToKKyAgICAgICAgX2V4aXRjb2RlX3RvX25hbWVbLXNpZ251bV0gPSBuYW1lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9wcm9jZXNzLnB5YyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3Byb2Nlc3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNjY0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9wcm9jZXNzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9wcm9jZXNzLnB5byBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3Byb2Nlc3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OWExYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9wcm9jZXNzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9xdWV1ZXMucHkgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9xdWV1ZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzYzdlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3F1ZXVlcy5weQpAQCAtMCwwICsxLDM5MyBAQAorIworIyBNb2R1bGUgaW1wbGVtZW50aW5nIHF1ZXVlcworIworIyBtdWx0aXByb2Nlc3NpbmcvcXVldWVzLnB5CisjCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4LCBSIE91ZGtlcmsKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZQorIyAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisKK19fYWxsX18gPSBbJ1F1ZXVlJywgJ1NpbXBsZVF1ZXVlJywgJ0pvaW5hYmxlUXVldWUnXQorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IHRpbWUKK2ltcG9ydCBhdGV4aXQKK2ltcG9ydCB3ZWFrcmVmCisKK2Zyb20gUXVldWUgaW1wb3J0IEVtcHR5LCBGdWxsCitpbXBvcnQgX211bHRpcHJvY2Vzc2luZworZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0IFBpcGUKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLnN5bmNocm9uaXplIGltcG9ydCBMb2NrLCBCb3VuZGVkU2VtYXBob3JlLCBTZW1hcGhvcmUsIENvbmRpdGlvbgorZnJvbSBtdWx0aXByb2Nlc3NpbmcudXRpbCBpbXBvcnQgZGVidWcsIGluZm8sIEZpbmFsaXplLCByZWdpc3Rlcl9hZnRlcl9mb3JrCitmcm9tIG11bHRpcHJvY2Vzc2luZy5mb3JraW5nIGltcG9ydCBhc3NlcnRfc3Bhd25pbmcKKworIworIyBRdWV1ZSB0eXBlIHVzaW5nIGEgcGlwZSwgYnVmZmVyIGFuZCB0aHJlYWQKKyMKKworY2xhc3MgUXVldWUob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXhzaXplPTApOgorICAgICAgICBpZiBtYXhzaXplIDw9IDA6CisgICAgICAgICAgICBtYXhzaXplID0gX211bHRpcHJvY2Vzc2luZy5TZW1Mb2NrLlNFTV9WQUxVRV9NQVgKKyAgICAgICAgc2VsZi5fbWF4c2l6ZSA9IG1heHNpemUKKyAgICAgICAgc2VsZi5fcmVhZGVyLCBzZWxmLl93cml0ZXIgPSBQaXBlKGR1cGxleD1GYWxzZSkKKyAgICAgICAgc2VsZi5fcmxvY2sgPSBMb2NrKCkKKyAgICAgICAgc2VsZi5fb3BpZCA9IG9zLmdldHBpZCgpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgc2VsZi5fd2xvY2sgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl93bG9jayA9IExvY2soKQorICAgICAgICBzZWxmLl9zZW0gPSBCb3VuZGVkU2VtYXBob3JlKG1heHNpemUpCisKKyAgICAgICAgc2VsZi5fYWZ0ZXJfZm9yaygpCisKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6CisgICAgICAgICAgICByZWdpc3Rlcl9hZnRlcl9mb3JrKHNlbGYsIFF1ZXVlLl9hZnRlcl9mb3JrKQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgYXNzZXJ0X3NwYXduaW5nKHNlbGYpCisgICAgICAgIHJldHVybiAoc2VsZi5fbWF4c2l6ZSwgc2VsZi5fcmVhZGVyLCBzZWxmLl93cml0ZXIsCisgICAgICAgICAgICAgICAgc2VsZi5fcmxvY2ssIHNlbGYuX3dsb2NrLCBzZWxmLl9zZW0sIHNlbGYuX29waWQpCisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgKHNlbGYuX21heHNpemUsIHNlbGYuX3JlYWRlciwgc2VsZi5fd3JpdGVyLAorICAgICAgICAgc2VsZi5fcmxvY2ssIHNlbGYuX3dsb2NrLCBzZWxmLl9zZW0sIHNlbGYuX29waWQpID0gc3RhdGUKKyAgICAgICAgc2VsZi5fYWZ0ZXJfZm9yaygpCisKKyAgICBkZWYgX2FmdGVyX2Zvcmsoc2VsZik6CisgICAgICAgIGRlYnVnKCdRdWV1ZS5fYWZ0ZXJfZm9yaygpJykKKyAgICAgICAgc2VsZi5fbm90ZW1wdHkgPSB0aHJlYWRpbmcuQ29uZGl0aW9uKHRocmVhZGluZy5Mb2NrKCkpCisgICAgICAgIHNlbGYuX2J1ZmZlciA9IGNvbGxlY3Rpb25zLmRlcXVlKCkKKyAgICAgICAgc2VsZi5fdGhyZWFkID0gTm9uZQorICAgICAgICBzZWxmLl9qb2ludGhyZWFkID0gTm9uZQorICAgICAgICBzZWxmLl9qb2luY2FuY2VsbGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5fY2xvc2VkID0gRmFsc2UKKyAgICAgICAgc2VsZi5fY2xvc2UgPSBOb25lCisgICAgICAgIHNlbGYuX3NlbmQgPSBzZWxmLl93cml0ZXIuc2VuZAorICAgICAgICBzZWxmLl9yZWN2ID0gc2VsZi5fcmVhZGVyLnJlY3YKKyAgICAgICAgc2VsZi5fcG9sbCA9IHNlbGYuX3JlYWRlci5wb2xsCisKKyAgICBkZWYgcHV0KHNlbGYsIG9iaiwgYmxvY2s9VHJ1ZSwgdGltZW91dD1Ob25lKToKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLl9jbG9zZWQKKyAgICAgICAgaWYgbm90IHNlbGYuX3NlbS5hY3F1aXJlKGJsb2NrLCB0aW1lb3V0KToKKyAgICAgICAgICAgIHJhaXNlIEZ1bGwKKworICAgICAgICBzZWxmLl9ub3RlbXB0eS5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fdGhyZWFkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5fc3RhcnRfdGhyZWFkKCkKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlci5hcHBlbmQob2JqKQorICAgICAgICAgICAgc2VsZi5fbm90ZW1wdHkubm90aWZ5KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX25vdGVtcHR5LnJlbGVhc2UoKQorCisgICAgZGVmIGdldChzZWxmLCBibG9jaz1UcnVlLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICBpZiBibG9jayBhbmQgdGltZW91dCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fcmxvY2suYWNxdWlyZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzID0gc2VsZi5fcmVjdigpCisgICAgICAgICAgICAgICAgc2VsZi5fc2VtLnJlbGVhc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiByZXMKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2VsZi5fcmxvY2sucmVsZWFzZSgpCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGJsb2NrOgorICAgICAgICAgICAgICAgIGRlYWRsaW5lID0gdGltZS50aW1lKCkgKyB0aW1lb3V0CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fcmxvY2suYWNxdWlyZShibG9jaywgdGltZW91dCk6CisgICAgICAgICAgICAgICAgcmFpc2UgRW1wdHkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBibG9jazoKKyAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IGRlYWRsaW5lIC0gdGltZS50aW1lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGltZW91dCA8IDAgb3Igbm90IHNlbGYuX3BvbGwodGltZW91dCk6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFbXB0eQorICAgICAgICAgICAgICAgIGVsaWYgbm90IHNlbGYuX3BvbGwoKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRW1wdHkKKyAgICAgICAgICAgICAgICByZXMgPSBzZWxmLl9yZWN2KCkKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW0ucmVsZWFzZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcworICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLl9ybG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBxc2l6ZShzZWxmKToKKyAgICAgICAgIyBSYWlzZXMgTm90SW1wbGVtZW50ZWRFcnJvciBvbiBNYWMgT1NYIGJlY2F1c2Ugb2YgYnJva2VuIHNlbV9nZXR2YWx1ZSgpCisgICAgICAgIHJldHVybiBzZWxmLl9tYXhzaXplIC0gc2VsZi5fc2VtLl9zZW1sb2NrLl9nZXRfdmFsdWUoKQorCisgICAgZGVmIGVtcHR5KHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYuX3BvbGwoKQorCisgICAgZGVmIGZ1bGwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zZW0uX3NlbWxvY2suX2lzX3plcm8oKQorCisgICAgZGVmIGdldF9ub3dhaXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmdldChGYWxzZSkKKworICAgIGRlZiBwdXRfbm93YWl0KHNlbGYsIG9iaik6CisgICAgICAgIHJldHVybiBzZWxmLnB1dChvYmosIEZhbHNlKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9jbG9zZWQgPSBUcnVlCisgICAgICAgIHNlbGYuX3JlYWRlci5jbG9zZSgpCisgICAgICAgIGlmIHNlbGYuX2Nsb3NlOgorICAgICAgICAgICAgc2VsZi5fY2xvc2UoKQorCisgICAgZGVmIGpvaW5fdGhyZWFkKHNlbGYpOgorICAgICAgICBkZWJ1ZygnUXVldWUuam9pbl90aHJlYWQoKScpCisgICAgICAgIGFzc2VydCBzZWxmLl9jbG9zZWQKKyAgICAgICAgaWYgc2VsZi5fam9pbnRocmVhZDoKKyAgICAgICAgICAgIHNlbGYuX2pvaW50aHJlYWQoKQorCisgICAgZGVmIGNhbmNlbF9qb2luX3RocmVhZChzZWxmKToKKyAgICAgICAgZGVidWcoJ1F1ZXVlLmNhbmNlbF9qb2luX3RocmVhZCgpJykKKyAgICAgICAgc2VsZi5fam9pbmNhbmNlbGxlZCA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fam9pbnRocmVhZC5jYW5jZWwoKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgX3N0YXJ0X3RocmVhZChzZWxmKToKKyAgICAgICAgZGVidWcoJ1F1ZXVlLl9zdGFydF90aHJlYWQoKScpCisKKyAgICAgICAgIyBTdGFydCB0aHJlYWQgd2hpY2ggdHJhbnNmZXJzIGRhdGEgZnJvbSBidWZmZXIgdG8gcGlwZQorICAgICAgICBzZWxmLl9idWZmZXIuY2xlYXIoKQorICAgICAgICBzZWxmLl90aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKAorICAgICAgICAgICAgdGFyZ2V0PVF1ZXVlLl9mZWVkLAorICAgICAgICAgICAgYXJncz0oc2VsZi5fYnVmZmVyLCBzZWxmLl9ub3RlbXB0eSwgc2VsZi5fc2VuZCwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX3dsb2NrLCBzZWxmLl93cml0ZXIuY2xvc2UpLAorICAgICAgICAgICAgbmFtZT0nUXVldWVGZWVkZXJUaHJlYWQnCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuX3RocmVhZC5kYWVtb24gPSBUcnVlCisKKyAgICAgICAgZGVidWcoJ2RvaW5nIHNlbGYuX3RocmVhZC5zdGFydCgpJykKKyAgICAgICAgc2VsZi5fdGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgZGVidWcoJy4uLiBkb25lIHNlbGYuX3RocmVhZC5zdGFydCgpJykKKworICAgICAgICAjIE9uIHByb2Nlc3MgZXhpdCB3ZSB3aWxsIHdhaXQgZm9yIGRhdGEgdG8gYmUgZmx1c2hlZCB0byBwaXBlLgorICAgICAgICBpZiBub3Qgc2VsZi5fam9pbmNhbmNlbGxlZDoKKyAgICAgICAgICAgIHNlbGYuX2pvaW50aHJlYWQgPSBGaW5hbGl6ZSgKKyAgICAgICAgICAgICAgICBzZWxmLl90aHJlYWQsIFF1ZXVlLl9maW5hbGl6ZV9qb2luLAorICAgICAgICAgICAgICAgIFt3ZWFrcmVmLnJlZihzZWxmLl90aHJlYWQpXSwKKyAgICAgICAgICAgICAgICBleGl0cHJpb3JpdHk9LTUKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgIyBTZW5kIHNlbnRpbmVsIHRvIHRoZSB0aHJlYWQgcXVldWUgb2JqZWN0IHdoZW4gZ2FyYmFnZSBjb2xsZWN0ZWQKKyAgICAgICAgc2VsZi5fY2xvc2UgPSBGaW5hbGl6ZSgKKyAgICAgICAgICAgIHNlbGYsIFF1ZXVlLl9maW5hbGl6ZV9jbG9zZSwKKyAgICAgICAgICAgIFtzZWxmLl9idWZmZXIsIHNlbGYuX25vdGVtcHR5XSwKKyAgICAgICAgICAgIGV4aXRwcmlvcml0eT0xMAorICAgICAgICAgICAgKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfZmluYWxpemVfam9pbih0d3IpOgorICAgICAgICBkZWJ1Zygnam9pbmluZyBxdWV1ZSB0aHJlYWQnKQorICAgICAgICB0aHJlYWQgPSB0d3IoKQorICAgICAgICBpZiB0aHJlYWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0aHJlYWQuam9pbigpCisgICAgICAgICAgICBkZWJ1ZygnLi4uIHF1ZXVlIHRocmVhZCBqb2luZWQnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVidWcoJy4uLiBxdWV1ZSB0aHJlYWQgYWxyZWFkeSBkZWFkJykKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2ZpbmFsaXplX2Nsb3NlKGJ1ZmZlciwgbm90ZW1wdHkpOgorICAgICAgICBkZWJ1ZygndGVsbGluZyBxdWV1ZSB0aHJlYWQgdG8gcXVpdCcpCisgICAgICAgIG5vdGVtcHR5LmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKF9zZW50aW5lbCkKKyAgICAgICAgICAgIG5vdGVtcHR5Lm5vdGlmeSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBub3RlbXB0eS5yZWxlYXNlKCkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX2ZlZWQoYnVmZmVyLCBub3RlbXB0eSwgc2VuZCwgd3JpdGVsb2NrLCBjbG9zZSk6CisgICAgICAgIGRlYnVnKCdzdGFydGluZyB0aHJlYWQgdG8gZmVlZCBkYXRhIHRvIHBpcGUnKQorICAgICAgICBmcm9tIC51dGlsIGltcG9ydCBpc19leGl0aW5nCisKKyAgICAgICAgbmFjcXVpcmUgPSBub3RlbXB0eS5hY3F1aXJlCisgICAgICAgIG5yZWxlYXNlID0gbm90ZW1wdHkucmVsZWFzZQorICAgICAgICBud2FpdCA9IG5vdGVtcHR5LndhaXQKKyAgICAgICAgYnBvcGxlZnQgPSBidWZmZXIucG9wbGVmdAorICAgICAgICBzZW50aW5lbCA9IF9zZW50aW5lbAorICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIHdhY3F1aXJlID0gd3JpdGVsb2NrLmFjcXVpcmUKKyAgICAgICAgICAgIHdyZWxlYXNlID0gd3JpdGVsb2NrLnJlbGVhc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdhY3F1aXJlID0gTm9uZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgbmFjcXVpcmUoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGJ1ZmZlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG53YWl0KCkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBucmVsZWFzZSgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgb2JqID0gYnBvcGxlZnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb2JqIGlzIHNlbnRpbmVsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKCdmZWVkZXIgdGhyZWFkIGdvdCBzZW50aW5lbCAtLSBleGl0aW5nJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdhY3F1aXJlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZChvYmopCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhY3F1aXJlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmQob2JqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyZWxlYXNlKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgIyBTaW5jZSB0aGlzIHJ1bnMgaW4gYSBkYWVtb24gdGhyZWFkIHRoZSByZXNvdXJjZXMgaXQgdXNlcworICAgICAgICAgICAgIyBtYXkgYmUgYmVjb21lIHVudXNhYmxlIHdoaWxlIHRoZSBwcm9jZXNzIGlzIGNsZWFuaW5nIHVwLgorICAgICAgICAgICAgIyBXZSBpZ25vcmUgZXJyb3JzIHdoaWNoIGhhcHBlbiBhZnRlciB0aGUgcHJvY2VzcyBoYXMKKyAgICAgICAgICAgICMgc3RhcnRlZCB0byBjbGVhbnVwLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGlzX2V4aXRpbmcoKToKKyAgICAgICAgICAgICAgICAgICAgaW5mbygnZXJyb3IgaW4gcXVldWUgdGhyZWFkOiAlcycsIGUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworCitfc2VudGluZWwgPSBvYmplY3QoKQorCisjCisjIEEgcXVldWUgdHlwZSB3aGljaCBhbHNvIHN1cHBvcnRzIGpvaW4oKSBhbmQgdGFza19kb25lKCkgbWV0aG9kcworIworIyBOb3RlIHRoYXQgaWYgeW91IGRvIG5vdCBjYWxsIHRhc2tfZG9uZSgpIGZvciBlYWNoIGZpbmlzaGVkIHRhc2sgdGhlbgorIyBldmVudHVhbGx5IHRoZSBjb3VudGVyJ3Mgc2VtYXBob3JlIG1heSBvdmVyZmxvdyBjYXVzaW5nIEJhZCBUaGluZ3MKKyMgdG8gaGFwcGVuLgorIworCitjbGFzcyBKb2luYWJsZVF1ZXVlKFF1ZXVlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXhzaXplPTApOgorICAgICAgICBRdWV1ZS5fX2luaXRfXyhzZWxmLCBtYXhzaXplKQorICAgICAgICBzZWxmLl91bmZpbmlzaGVkX3Rhc2tzID0gU2VtYXBob3JlKDApCisgICAgICAgIHNlbGYuX2NvbmQgPSBDb25kaXRpb24oKQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFF1ZXVlLl9fZ2V0c3RhdGVfXyhzZWxmKSArIChzZWxmLl9jb25kLCBzZWxmLl91bmZpbmlzaGVkX3Rhc2tzKQorCisgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgIFF1ZXVlLl9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZVs6LTJdKQorICAgICAgICBzZWxmLl9jb25kLCBzZWxmLl91bmZpbmlzaGVkX3Rhc2tzID0gc3RhdGVbLTI6XQorCisgICAgZGVmIHB1dChzZWxmLCBvYmosIGJsb2NrPVRydWUsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIGFzc2VydCBub3Qgc2VsZi5fY2xvc2VkCisgICAgICAgIGlmIG5vdCBzZWxmLl9zZW0uYWNxdWlyZShibG9jaywgdGltZW91dCk6CisgICAgICAgICAgICByYWlzZSBGdWxsCisKKyAgICAgICAgc2VsZi5fbm90ZW1wdHkuYWNxdWlyZSgpCisgICAgICAgIHNlbGYuX2NvbmQuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX3RocmVhZCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuX3N0YXJ0X3RocmVhZCgpCisgICAgICAgICAgICBzZWxmLl9idWZmZXIuYXBwZW5kKG9iaikKKyAgICAgICAgICAgIHNlbGYuX3VuZmluaXNoZWRfdGFza3MucmVsZWFzZSgpCisgICAgICAgICAgICBzZWxmLl9ub3RlbXB0eS5ub3RpZnkoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY29uZC5yZWxlYXNlKCkKKyAgICAgICAgICAgIHNlbGYuX25vdGVtcHR5LnJlbGVhc2UoKQorCisgICAgZGVmIHRhc2tfZG9uZShzZWxmKToKKyAgICAgICAgc2VsZi5fY29uZC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3VuZmluaXNoZWRfdGFza3MuYWNxdWlyZShGYWxzZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndGFza19kb25lKCkgY2FsbGVkIHRvbyBtYW55IHRpbWVzJykKKyAgICAgICAgICAgIGlmIHNlbGYuX3VuZmluaXNoZWRfdGFza3MuX3NlbWxvY2suX2lzX3plcm8oKToKKyAgICAgICAgICAgICAgICBzZWxmLl9jb25kLm5vdGlmeV9hbGwoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY29uZC5yZWxlYXNlKCkKKworICAgIGRlZiBqb2luKHNlbGYpOgorICAgICAgICBzZWxmLl9jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fdW5maW5pc2hlZF90YXNrcy5fc2VtbG9jay5faXNfemVybygpOgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbmQud2FpdCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb25kLnJlbGVhc2UoKQorCisjCisjIFNpbXBsaWZpZWQgUXVldWUgdHlwZSAtLSByZWFsbHkganVzdCBhIGxvY2tlZCBwaXBlCisjCisKK2NsYXNzIFNpbXBsZVF1ZXVlKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3JlYWRlciwgc2VsZi5fd3JpdGVyID0gUGlwZShkdXBsZXg9RmFsc2UpCisgICAgICAgIHNlbGYuX3Jsb2NrID0gTG9jaygpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgc2VsZi5fd2xvY2sgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl93bG9jayA9IExvY2soKQorICAgICAgICBzZWxmLl9tYWtlX21ldGhvZHMoKQorCisgICAgZGVmIGVtcHR5KHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYuX3JlYWRlci5wb2xsKCkKKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgIGFzc2VydF9zcGF3bmluZyhzZWxmKQorICAgICAgICByZXR1cm4gKHNlbGYuX3JlYWRlciwgc2VsZi5fd3JpdGVyLCBzZWxmLl9ybG9jaywgc2VsZi5fd2xvY2spCisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgKHNlbGYuX3JlYWRlciwgc2VsZi5fd3JpdGVyLCBzZWxmLl9ybG9jaywgc2VsZi5fd2xvY2spID0gc3RhdGUKKyAgICAgICAgc2VsZi5fbWFrZV9tZXRob2RzKCkKKworICAgIGRlZiBfbWFrZV9tZXRob2RzKHNlbGYpOgorICAgICAgICByZWN2ID0gc2VsZi5fcmVhZGVyLnJlY3YKKyAgICAgICAgcmFjcXVpcmUsIHJyZWxlYXNlID0gc2VsZi5fcmxvY2suYWNxdWlyZSwgc2VsZi5fcmxvY2sucmVsZWFzZQorICAgICAgICBkZWYgZ2V0KCk6CisgICAgICAgICAgICByYWNxdWlyZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlY3YoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBycmVsZWFzZSgpCisgICAgICAgIHNlbGYuZ2V0ID0gZ2V0CisKKyAgICAgICAgaWYgc2VsZi5fd2xvY2sgaXMgTm9uZToKKyAgICAgICAgICAgICMgd3JpdGVzIHRvIGEgbWVzc2FnZSBvcmllbnRlZCB3aW4zMiBwaXBlIGFyZSBhdG9taWMKKyAgICAgICAgICAgIHNlbGYucHV0ID0gc2VsZi5fd3JpdGVyLnNlbmQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbmQgPSBzZWxmLl93cml0ZXIuc2VuZAorICAgICAgICAgICAgd2FjcXVpcmUsIHdyZWxlYXNlID0gc2VsZi5fd2xvY2suYWNxdWlyZSwgc2VsZi5fd2xvY2sucmVsZWFzZQorICAgICAgICAgICAgZGVmIHB1dChvYmopOgorICAgICAgICAgICAgICAgIHdhY3F1aXJlKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZW5kKG9iaikKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICB3cmVsZWFzZSgpCisgICAgICAgICAgICBzZWxmLnB1dCA9IHB1dApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcXVldWVzLnB5YyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3F1ZXVlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlNGVlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3F1ZXVlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcXVldWVzLnB5byBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3F1ZXVlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI5YmMzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3F1ZXVlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcmVkdWN0aW9uLnB5IGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcmVkdWN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWU1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9yZWR1Y3Rpb24ucHkKQEAgLTAsMCArMSwyMTUgQEAKKyMKKyMgTW9kdWxlIHRvIGFsbG93IGNvbm5lY3Rpb24gYW5kIHNvY2tldCBvYmplY3RzIHRvIGJlIHRyYW5zZmVycmVkCisjIGJldHdlZW4gcHJvY2Vzc2VzCisjCisjIG11bHRpcHJvY2Vzc2luZy9yZWR1Y3Rpb24ucHkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDgsIFIgT3Vka2VyaworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlCisjICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKworX19hbGxfXyA9IFtdCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHNvY2tldAoraW1wb3J0IHRocmVhZGluZworCitpbXBvcnQgX211bHRpcHJvY2Vzc2luZworZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0IGN1cnJlbnRfcHJvY2VzcworZnJvbSBtdWx0aXByb2Nlc3NpbmcuZm9ya2luZyBpbXBvcnQgUG9wZW4sIGR1cGxpY2F0ZSwgY2xvc2UsIEZvcmtpbmdQaWNrbGVyCitmcm9tIG11bHRpcHJvY2Vzc2luZy51dGlsIGltcG9ydCByZWdpc3Rlcl9hZnRlcl9mb3JrLCBkZWJ1Zywgc3ViX2RlYnVnCitmcm9tIG11bHRpcHJvY2Vzc2luZy5jb25uZWN0aW9uIGltcG9ydCBDbGllbnQsIExpc3RlbmVyCisKKworIworIworIworCitpZiBub3Qoc3lzLnBsYXRmb3JtID09ICd3aW4zMicgb3IgaGFzYXR0cihfbXVsdGlwcm9jZXNzaW5nLCAncmVjdmZkJykpOgorICAgIHJhaXNlIEltcG9ydEVycm9yKCdwaWNrbGluZyBvZiBjb25uZWN0aW9ucyBub3Qgc3VwcG9ydGVkJykKKworIworIyBQbGF0Zm9ybSBzcGVjaWZpYyBkZWZpbml0aW9ucworIworCitpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICBpbXBvcnQgX3N1YnByb2Nlc3MKKyAgICBmcm9tIF9tdWx0aXByb2Nlc3NpbmcgaW1wb3J0IHdpbjMyCisKKyAgICBkZWYgc2VuZF9oYW5kbGUoY29ubiwgaGFuZGxlLCBkZXN0aW5hdGlvbl9waWQpOgorICAgICAgICBwcm9jZXNzX2hhbmRsZSA9IHdpbjMyLk9wZW5Qcm9jZXNzKAorICAgICAgICAgICAgd2luMzIuUFJPQ0VTU19BTExfQUNDRVNTLCBGYWxzZSwgZGVzdGluYXRpb25fcGlkCisgICAgICAgICAgICApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5ld19oYW5kbGUgPSBkdXBsaWNhdGUoaGFuZGxlLCBwcm9jZXNzX2hhbmRsZSkKKyAgICAgICAgICAgIGNvbm4uc2VuZChuZXdfaGFuZGxlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgY2xvc2UocHJvY2Vzc19oYW5kbGUpCisKKyAgICBkZWYgcmVjdl9oYW5kbGUoY29ubik6CisgICAgICAgIHJldHVybiBjb25uLnJlY3YoKQorCitlbHNlOgorICAgIGRlZiBzZW5kX2hhbmRsZShjb25uLCBoYW5kbGUsIGRlc3RpbmF0aW9uX3BpZCk6CisgICAgICAgIF9tdWx0aXByb2Nlc3Npbmcuc2VuZGZkKGNvbm4uZmlsZW5vKCksIGhhbmRsZSkKKworICAgIGRlZiByZWN2X2hhbmRsZShjb25uKToKKyAgICAgICAgcmV0dXJuIF9tdWx0aXByb2Nlc3NpbmcucmVjdmZkKGNvbm4uZmlsZW5vKCkpCisKKyMKKyMgU3VwcG9ydCBmb3IgYSBwZXItcHJvY2VzcyBzZXJ2ZXIgdGhyZWFkIHdoaWNoIGNhY2hlcyBwaWNrbGVkIGhhbmRsZXMKKyMKKworX2NhY2hlID0gc2V0KCkKKworZGVmIF9yZXNldChvYmopOgorICAgIGdsb2JhbCBfbG9jaywgX2xpc3RlbmVyLCBfY2FjaGUKKyAgICBmb3IgaCBpbiBfY2FjaGU6CisgICAgICAgIGNsb3NlKGgpCisgICAgX2NhY2hlLmNsZWFyKCkKKyAgICBfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKyAgICBfbGlzdGVuZXIgPSBOb25lCisKK19yZXNldChOb25lKQorcmVnaXN0ZXJfYWZ0ZXJfZm9yayhfcmVzZXQsIF9yZXNldCkKKworZGVmIF9nZXRfbGlzdGVuZXIoKToKKyAgICBnbG9iYWwgX2xpc3RlbmVyCisKKyAgICBpZiBfbGlzdGVuZXIgaXMgTm9uZToKKyAgICAgICAgX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIF9saXN0ZW5lciBpcyBOb25lOgorICAgICAgICAgICAgICAgIGRlYnVnKCdzdGFydGluZyBsaXN0ZW5lciBhbmQgdGhyZWFkIGZvciBzZW5kaW5nIGhhbmRsZXMnKQorICAgICAgICAgICAgICAgIF9saXN0ZW5lciA9IExpc3RlbmVyKGF1dGhrZXk9Y3VycmVudF9wcm9jZXNzKCkuYXV0aGtleSkKKyAgICAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3NlcnZlKQorICAgICAgICAgICAgICAgIHQuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX2xvY2sucmVsZWFzZSgpCisKKyAgICByZXR1cm4gX2xpc3RlbmVyCisKK2RlZiBfc2VydmUoKToKKyAgICBmcm9tIC51dGlsIGltcG9ydCBpc19leGl0aW5nLCBzdWJfd2FybmluZworCisgICAgd2hpbGUgMToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29ubiA9IF9saXN0ZW5lci5hY2NlcHQoKQorICAgICAgICAgICAgaGFuZGxlX3dhbnRlZCwgZGVzdGluYXRpb25fcGlkID0gY29ubi5yZWN2KCkKKyAgICAgICAgICAgIF9jYWNoZS5yZW1vdmUoaGFuZGxlX3dhbnRlZCkKKyAgICAgICAgICAgIHNlbmRfaGFuZGxlKGNvbm4sIGhhbmRsZV93YW50ZWQsIGRlc3RpbmF0aW9uX3BpZCkKKyAgICAgICAgICAgIGNsb3NlKGhhbmRsZV93YW50ZWQpCisgICAgICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaWYgbm90IGlzX2V4aXRpbmcoKToKKyAgICAgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgICAgICAgICAgc3ViX3dhcm5pbmcoCisgICAgICAgICAgICAgICAgICAgICd0aHJlYWQgZm9yIHNoYXJpbmcgaGFuZGxlcyByYWlzZWQgZXhjZXB0aW9uIDpcbicgKworICAgICAgICAgICAgICAgICAgICAnLScqNzkgKyAnXG4nICsgdHJhY2ViYWNrLmZvcm1hdF9leGMoKSArICctJyo3OQorICAgICAgICAgICAgICAgICAgICApCisKKyMKKyMgRnVuY3Rpb25zIHRvIGJlIHVzZWQgZm9yIHBpY2tsaW5nL3VucGlja2xpbmcgb2JqZWN0cyB3aXRoIGhhbmRsZXMKKyMKKworZGVmIHJlZHVjZV9oYW5kbGUoaGFuZGxlKToKKyAgICBpZiBQb3Blbi50aHJlYWRfaXNfc3Bhd25pbmcoKToKKyAgICAgICAgcmV0dXJuIChOb25lLCBQb3Blbi5kdXBsaWNhdGVfZm9yX2NoaWxkKGhhbmRsZSksIFRydWUpCisgICAgZHVwX2hhbmRsZSA9IGR1cGxpY2F0ZShoYW5kbGUpCisgICAgX2NhY2hlLmFkZChkdXBfaGFuZGxlKQorICAgIHN1Yl9kZWJ1ZygncmVkdWNpbmcgaGFuZGxlICVkJywgaGFuZGxlKQorICAgIHJldHVybiAoX2dldF9saXN0ZW5lcigpLmFkZHJlc3MsIGR1cF9oYW5kbGUsIEZhbHNlKQorCitkZWYgcmVidWlsZF9oYW5kbGUocGlja2xlZF9kYXRhKToKKyAgICBhZGRyZXNzLCBoYW5kbGUsIGluaGVyaXRlZCA9IHBpY2tsZWRfZGF0YQorICAgIGlmIGluaGVyaXRlZDoKKyAgICAgICAgcmV0dXJuIGhhbmRsZQorICAgIHN1Yl9kZWJ1ZygncmVidWlsZGluZyBoYW5kbGUgJWQnLCBoYW5kbGUpCisgICAgY29ubiA9IENsaWVudChhZGRyZXNzLCBhdXRoa2V5PWN1cnJlbnRfcHJvY2VzcygpLmF1dGhrZXkpCisgICAgY29ubi5zZW5kKChoYW5kbGUsIG9zLmdldHBpZCgpKSkKKyAgICBuZXdfaGFuZGxlID0gcmVjdl9oYW5kbGUoY29ubikKKyAgICBjb25uLmNsb3NlKCkKKyAgICByZXR1cm4gbmV3X2hhbmRsZQorCisjCisjIFJlZ2lzdGVyIGBfbXVsdGlwcm9jZXNzaW5nLkNvbm5lY3Rpb25gIHdpdGggYEZvcmtpbmdQaWNrbGVyYAorIworCitkZWYgcmVkdWNlX2Nvbm5lY3Rpb24oY29ubik6CisgICAgcmggPSByZWR1Y2VfaGFuZGxlKGNvbm4uZmlsZW5vKCkpCisgICAgcmV0dXJuIHJlYnVpbGRfY29ubmVjdGlvbiwgKHJoLCBjb25uLnJlYWRhYmxlLCBjb25uLndyaXRhYmxlKQorCitkZWYgcmVidWlsZF9jb25uZWN0aW9uKHJlZHVjZWRfaGFuZGxlLCByZWFkYWJsZSwgd3JpdGFibGUpOgorICAgIGhhbmRsZSA9IHJlYnVpbGRfaGFuZGxlKHJlZHVjZWRfaGFuZGxlKQorICAgIHJldHVybiBfbXVsdGlwcm9jZXNzaW5nLkNvbm5lY3Rpb24oCisgICAgICAgIGhhbmRsZSwgcmVhZGFibGU9cmVhZGFibGUsIHdyaXRhYmxlPXdyaXRhYmxlCisgICAgICAgICkKKworRm9ya2luZ1BpY2tsZXIucmVnaXN0ZXIoX211bHRpcHJvY2Vzc2luZy5Db25uZWN0aW9uLCByZWR1Y2VfY29ubmVjdGlvbikKKworIworIyBSZWdpc3RlciBgc29ja2V0LnNvY2tldGAgd2l0aCBgRm9ya2luZ1BpY2tsZXJgCisjCisKK2RlZiBmcm9tZmQoZmQsIGZhbWlseSwgdHlwZV8sIHByb3RvPTApOgorICAgIHMgPSBzb2NrZXQuZnJvbWZkKGZkLCBmYW1pbHksIHR5cGVfLCBwcm90bykKKyAgICBpZiBzLl9fY2xhc3NfXyBpcyBub3Qgc29ja2V0LnNvY2tldDoKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoX3NvY2s9cykKKyAgICByZXR1cm4gcworCitkZWYgcmVkdWNlX3NvY2tldChzKToKKyAgICByZWR1Y2VkX2hhbmRsZSA9IHJlZHVjZV9oYW5kbGUocy5maWxlbm8oKSkKKyAgICByZXR1cm4gcmVidWlsZF9zb2NrZXQsIChyZWR1Y2VkX2hhbmRsZSwgcy5mYW1pbHksIHMudHlwZSwgcy5wcm90bykKKworZGVmIHJlYnVpbGRfc29ja2V0KHJlZHVjZWRfaGFuZGxlLCBmYW1pbHksIHR5cGVfLCBwcm90byk6CisgICAgZmQgPSByZWJ1aWxkX2hhbmRsZShyZWR1Y2VkX2hhbmRsZSkKKyAgICBfc29jayA9IGZyb21mZChmZCwgZmFtaWx5LCB0eXBlXywgcHJvdG8pCisgICAgY2xvc2UoZmQpCisgICAgcmV0dXJuIF9zb2NrCisKK0ZvcmtpbmdQaWNrbGVyLnJlZ2lzdGVyKHNvY2tldC5zb2NrZXQsIHJlZHVjZV9zb2NrZXQpCisKKyMKKyMgUmVnaXN0ZXIgYF9tdWx0aXByb2Nlc3NpbmcuUGlwZUNvbm5lY3Rpb25gIHdpdGggYEZvcmtpbmdQaWNrbGVyYAorIworCitpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKworICAgIGRlZiByZWR1Y2VfcGlwZV9jb25uZWN0aW9uKGNvbm4pOgorICAgICAgICByaCA9IHJlZHVjZV9oYW5kbGUoY29ubi5maWxlbm8oKSkKKyAgICAgICAgcmV0dXJuIHJlYnVpbGRfcGlwZV9jb25uZWN0aW9uLCAocmgsIGNvbm4ucmVhZGFibGUsIGNvbm4ud3JpdGFibGUpCisKKyAgICBkZWYgcmVidWlsZF9waXBlX2Nvbm5lY3Rpb24ocmVkdWNlZF9oYW5kbGUsIHJlYWRhYmxlLCB3cml0YWJsZSk6CisgICAgICAgIGhhbmRsZSA9IHJlYnVpbGRfaGFuZGxlKHJlZHVjZWRfaGFuZGxlKQorICAgICAgICByZXR1cm4gX211bHRpcHJvY2Vzc2luZy5QaXBlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGhhbmRsZSwgcmVhZGFibGU9cmVhZGFibGUsIHdyaXRhYmxlPXdyaXRhYmxlCisgICAgICAgICAgICApCisKKyAgICBGb3JraW5nUGlja2xlci5yZWdpc3RlcihfbXVsdGlwcm9jZXNzaW5nLlBpcGVDb25uZWN0aW9uLCByZWR1Y2VfcGlwZV9jb25uZWN0aW9uKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcmVkdWN0aW9uLnB5YyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3JlZHVjdGlvbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxZDg5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3JlZHVjdGlvbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcmVkdWN0aW9uLnB5byBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3JlZHVjdGlvbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMxZDg5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3JlZHVjdGlvbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3Npbmcvc2hhcmVkY3R5cGVzLnB5IGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3Npbmcvc2hhcmVkY3R5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjA0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zaGFyZWRjdHlwZXMucHkKQEAgLTAsMCArMSwyNjYgQEAKKyMKKyMgTW9kdWxlIHdoaWNoIHN1cHBvcnRzIGFsbG9jYXRpb24gb2YgY3R5cGVzIG9iamVjdHMgZnJvbSBzaGFyZWQgbWVtb3J5CisjCisjIG11bHRpcHJvY2Vzc2luZy9zaGFyZWRjdHlwZXMucHkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDgsIFIgT3Vka2VyaworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlCisjICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKworaW1wb3J0IHN5cworaW1wb3J0IGN0eXBlcworaW1wb3J0IHdlYWtyZWYKKworZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0IGhlYXAsIFJMb2NrCitmcm9tIG11bHRpcHJvY2Vzc2luZy5mb3JraW5nIGltcG9ydCBhc3NlcnRfc3Bhd25pbmcsIEZvcmtpbmdQaWNrbGVyCisKK19fYWxsX18gPSBbJ1Jhd1ZhbHVlJywgJ1Jhd0FycmF5JywgJ1ZhbHVlJywgJ0FycmF5JywgJ2NvcHknLCAnc3luY2hyb25pemVkJ10KKworIworIworIworCit0eXBlY29kZV90b190eXBlID0geworICAgICdjJzogY3R5cGVzLmNfY2hhciwgICd1JzogY3R5cGVzLmNfd2NoYXIsCisgICAgJ2InOiBjdHlwZXMuY19ieXRlLCAgJ0InOiBjdHlwZXMuY191Ynl0ZSwKKyAgICAnaCc6IGN0eXBlcy5jX3Nob3J0LCAnSCc6IGN0eXBlcy5jX3VzaG9ydCwKKyAgICAnaSc6IGN0eXBlcy5jX2ludCwgICAnSSc6IGN0eXBlcy5jX3VpbnQsCisgICAgJ2wnOiBjdHlwZXMuY19sb25nLCAgJ0wnOiBjdHlwZXMuY191bG9uZywKKyAgICAnZic6IGN0eXBlcy5jX2Zsb2F0LCAnZCc6IGN0eXBlcy5jX2RvdWJsZQorICAgIH0KKworIworIworIworCitkZWYgX25ld192YWx1ZSh0eXBlXyk6CisgICAgc2l6ZSA9IGN0eXBlcy5zaXplb2YodHlwZV8pCisgICAgd3JhcHBlciA9IGhlYXAuQnVmZmVyV3JhcHBlcihzaXplKQorICAgIHJldHVybiByZWJ1aWxkX2N0eXBlKHR5cGVfLCB3cmFwcGVyLCBOb25lKQorCitkZWYgUmF3VmFsdWUodHlwZWNvZGVfb3JfdHlwZSwgKmFyZ3MpOgorICAgICcnJworICAgIFJldHVybnMgYSBjdHlwZXMgb2JqZWN0IGFsbG9jYXRlZCBmcm9tIHNoYXJlZCBtZW1vcnkKKyAgICAnJycKKyAgICB0eXBlXyA9IHR5cGVjb2RlX3RvX3R5cGUuZ2V0KHR5cGVjb2RlX29yX3R5cGUsIHR5cGVjb2RlX29yX3R5cGUpCisgICAgb2JqID0gX25ld192YWx1ZSh0eXBlXykKKyAgICBjdHlwZXMubWVtc2V0KGN0eXBlcy5hZGRyZXNzb2Yob2JqKSwgMCwgY3R5cGVzLnNpemVvZihvYmopKQorICAgIG9iai5fX2luaXRfXygqYXJncykKKyAgICByZXR1cm4gb2JqCisKK2RlZiBSYXdBcnJheSh0eXBlY29kZV9vcl90eXBlLCBzaXplX29yX2luaXRpYWxpemVyKToKKyAgICAnJycKKyAgICBSZXR1cm5zIGEgY3R5cGVzIGFycmF5IGFsbG9jYXRlZCBmcm9tIHNoYXJlZCBtZW1vcnkKKyAgICAnJycKKyAgICB0eXBlXyA9IHR5cGVjb2RlX3RvX3R5cGUuZ2V0KHR5cGVjb2RlX29yX3R5cGUsIHR5cGVjb2RlX29yX3R5cGUpCisgICAgaWYgaXNpbnN0YW5jZShzaXplX29yX2luaXRpYWxpemVyLCAoaW50LCBsb25nKSk6CisgICAgICAgIHR5cGVfID0gdHlwZV8gKiBzaXplX29yX2luaXRpYWxpemVyCisgICAgICAgIG9iaiA9IF9uZXdfdmFsdWUodHlwZV8pCisgICAgICAgIGN0eXBlcy5tZW1zZXQoY3R5cGVzLmFkZHJlc3NvZihvYmopLCAwLCBjdHlwZXMuc2l6ZW9mKG9iaikpCisgICAgICAgIHJldHVybiBvYmoKKyAgICBlbHNlOgorICAgICAgICB0eXBlXyA9IHR5cGVfICogbGVuKHNpemVfb3JfaW5pdGlhbGl6ZXIpCisgICAgICAgIHJlc3VsdCA9IF9uZXdfdmFsdWUodHlwZV8pCisgICAgICAgIHJlc3VsdC5fX2luaXRfXygqc2l6ZV9vcl9pbml0aWFsaXplcikKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgVmFsdWUodHlwZWNvZGVfb3JfdHlwZSwgKmFyZ3MsICoqa3dkcyk6CisgICAgJycnCisgICAgUmV0dXJuIGEgc3luY2hyb25pemF0aW9uIHdyYXBwZXIgZm9yIGEgVmFsdWUKKyAgICAnJycKKyAgICBsb2NrID0ga3dkcy5wb3AoJ2xvY2snLCBOb25lKQorICAgIGlmIGt3ZHM6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3VucmVjb2duaXplZCBrZXl3b3JkIGFyZ3VtZW50KHMpOiAlcycgJSBrd2RzLmtleXMoKSkKKyAgICBvYmogPSBSYXdWYWx1ZSh0eXBlY29kZV9vcl90eXBlLCAqYXJncykKKyAgICBpZiBsb2NrIGlzIEZhbHNlOgorICAgICAgICByZXR1cm4gb2JqCisgICAgaWYgbG9jayBpbiAoVHJ1ZSwgTm9uZSk6CisgICAgICAgIGxvY2sgPSBSTG9jaygpCisgICAgaWYgbm90IGhhc2F0dHIobG9jaywgJ2FjcXVpcmUnKToKKyAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIiclcicgaGFzIG5vIG1ldGhvZCAnYWNxdWlyZSciICUgbG9jaykKKyAgICByZXR1cm4gc3luY2hyb25pemVkKG9iaiwgbG9jaykKKworZGVmIEFycmF5KHR5cGVjb2RlX29yX3R5cGUsIHNpemVfb3JfaW5pdGlhbGl6ZXIsICoqa3dkcyk6CisgICAgJycnCisgICAgUmV0dXJuIGEgc3luY2hyb25pemF0aW9uIHdyYXBwZXIgZm9yIGEgUmF3QXJyYXkKKyAgICAnJycKKyAgICBsb2NrID0ga3dkcy5wb3AoJ2xvY2snLCBOb25lKQorICAgIGlmIGt3ZHM6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3VucmVjb2duaXplZCBrZXl3b3JkIGFyZ3VtZW50KHMpOiAlcycgJSBrd2RzLmtleXMoKSkKKyAgICBvYmogPSBSYXdBcnJheSh0eXBlY29kZV9vcl90eXBlLCBzaXplX29yX2luaXRpYWxpemVyKQorICAgIGlmIGxvY2sgaXMgRmFsc2U6CisgICAgICAgIHJldHVybiBvYmoKKyAgICBpZiBsb2NrIGluIChUcnVlLCBOb25lKToKKyAgICAgICAgbG9jayA9IFJMb2NrKCkKKyAgICBpZiBub3QgaGFzYXR0cihsb2NrLCAnYWNxdWlyZScpOgorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiJyVyJyBoYXMgbm8gbWV0aG9kICdhY3F1aXJlJyIgJSBsb2NrKQorICAgIHJldHVybiBzeW5jaHJvbml6ZWQob2JqLCBsb2NrKQorCitkZWYgY29weShvYmopOgorICAgIG5ld19vYmogPSBfbmV3X3ZhbHVlKHR5cGUob2JqKSkKKyAgICBjdHlwZXMucG9pbnRlcihuZXdfb2JqKVswXSA9IG9iagorICAgIHJldHVybiBuZXdfb2JqCisKK2RlZiBzeW5jaHJvbml6ZWQob2JqLCBsb2NrPU5vbmUpOgorICAgIGFzc2VydCBub3QgaXNpbnN0YW5jZShvYmosIFN5bmNocm9uaXplZEJhc2UpLCAnb2JqZWN0IGFscmVhZHkgc3luY2hyb25pemVkJworCisgICAgaWYgaXNpbnN0YW5jZShvYmosIGN0eXBlcy5fU2ltcGxlQ0RhdGEpOgorICAgICAgICByZXR1cm4gU3luY2hyb25pemVkKG9iaiwgbG9jaykKKyAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBjdHlwZXMuQXJyYXkpOgorICAgICAgICBpZiBvYmouX3R5cGVfIGlzIGN0eXBlcy5jX2NoYXI6CisgICAgICAgICAgICByZXR1cm4gU3luY2hyb25pemVkU3RyaW5nKG9iaiwgbG9jaykKKyAgICAgICAgcmV0dXJuIFN5bmNocm9uaXplZEFycmF5KG9iaiwgbG9jaykKKyAgICBlbHNlOgorICAgICAgICBjbHMgPSB0eXBlKG9iaikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2NscyA9IGNsYXNzX2NhY2hlW2Nsc10KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgbmFtZXMgPSBbZmllbGRbMF0gZm9yIGZpZWxkIGluIGNscy5fZmllbGRzX10KKyAgICAgICAgICAgIGQgPSBkaWN0KChuYW1lLCBtYWtlX3Byb3BlcnR5KG5hbWUpKSBmb3IgbmFtZSBpbiBuYW1lcykKKyAgICAgICAgICAgIGNsYXNzbmFtZSA9ICdTeW5jaHJvbml6ZWQnICsgY2xzLl9fbmFtZV9fCisgICAgICAgICAgICBzY2xzID0gY2xhc3NfY2FjaGVbY2xzXSA9IHR5cGUoY2xhc3NuYW1lLCAoU3luY2hyb25pemVkQmFzZSwpLCBkKQorICAgICAgICByZXR1cm4gc2NscyhvYmosIGxvY2spCisKKyMKKyMgRnVuY3Rpb25zIGZvciBwaWNrbGluZy91bnBpY2tsaW5nCisjCisKK2RlZiByZWR1Y2VfY3R5cGUob2JqKToKKyAgICBhc3NlcnRfc3Bhd25pbmcob2JqKQorICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBjdHlwZXMuQXJyYXkpOgorICAgICAgICByZXR1cm4gcmVidWlsZF9jdHlwZSwgKG9iai5fdHlwZV8sIG9iai5fd3JhcHBlciwgb2JqLl9sZW5ndGhfKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiByZWJ1aWxkX2N0eXBlLCAodHlwZShvYmopLCBvYmouX3dyYXBwZXIsIE5vbmUpCisKK2RlZiByZWJ1aWxkX2N0eXBlKHR5cGVfLCB3cmFwcGVyLCBsZW5ndGgpOgorICAgIGlmIGxlbmd0aCBpcyBub3QgTm9uZToKKyAgICAgICAgdHlwZV8gPSB0eXBlXyAqIGxlbmd0aAorICAgIEZvcmtpbmdQaWNrbGVyLnJlZ2lzdGVyKHR5cGVfLCByZWR1Y2VfY3R5cGUpCisgICAgb2JqID0gdHlwZV8uZnJvbV9hZGRyZXNzKHdyYXBwZXIuZ2V0X2FkZHJlc3MoKSkKKyAgICBvYmouX3dyYXBwZXIgPSB3cmFwcGVyCisgICAgcmV0dXJuIG9iagorCisjCisjIEZ1bmN0aW9uIHRvIGNyZWF0ZSBwcm9wZXJ0aWVzCisjCisKK2RlZiBtYWtlX3Byb3BlcnR5KG5hbWUpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHByb3BfY2FjaGVbbmFtZV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIGQgPSB7fQorICAgICAgICBleGVjIHRlbXBsYXRlICUgKChuYW1lLCkqNykgaW4gZAorICAgICAgICBwcm9wX2NhY2hlW25hbWVdID0gZFtuYW1lXQorICAgICAgICByZXR1cm4gZFtuYW1lXQorCit0ZW1wbGF0ZSA9ICcnJworZGVmIGdldCVzKHNlbGYpOgorICAgIHNlbGYuYWNxdWlyZSgpCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gc2VsZi5fb2JqLiVzCisgICAgZmluYWxseToKKyAgICAgICAgc2VsZi5yZWxlYXNlKCkKK2RlZiBzZXQlcyhzZWxmLCB2YWx1ZSk6CisgICAgc2VsZi5hY3F1aXJlKCkKKyAgICB0cnk6CisgICAgICAgIHNlbGYuX29iai4lcyA9IHZhbHVlCisgICAgZmluYWxseToKKyAgICAgICAgc2VsZi5yZWxlYXNlKCkKKyVzID0gcHJvcGVydHkoZ2V0JXMsIHNldCVzKQorJycnCisKK3Byb3BfY2FjaGUgPSB7fQorY2xhc3NfY2FjaGUgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKKworIworIyBTeW5jaHJvbml6ZWQgd3JhcHBlcnMKKyMKKworY2xhc3MgU3luY2hyb25pemVkQmFzZShvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iaiwgbG9jaz1Ob25lKToKKyAgICAgICAgc2VsZi5fb2JqID0gb2JqCisgICAgICAgIHNlbGYuX2xvY2sgPSBsb2NrIG9yIFJMb2NrKCkKKyAgICAgICAgc2VsZi5hY3F1aXJlID0gc2VsZi5fbG9jay5hY3F1aXJlCisgICAgICAgIHNlbGYucmVsZWFzZSA9IHNlbGYuX2xvY2sucmVsZWFzZQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIGFzc2VydF9zcGF3bmluZyhzZWxmKQorICAgICAgICByZXR1cm4gc3luY2hyb25pemVkLCAoc2VsZi5fb2JqLCBzZWxmLl9sb2NrKQorCisgICAgZGVmIGdldF9vYmooc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9vYmoKKworICAgIGRlZiBnZXRfbG9jayhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xvY2sKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8JXMgd3JhcHBlciBmb3IgJXM+JyAlICh0eXBlKHNlbGYpLl9fbmFtZV9fLCBzZWxmLl9vYmopCisKKworY2xhc3MgU3luY2hyb25pemVkKFN5bmNocm9uaXplZEJhc2UpOgorICAgIHZhbHVlID0gbWFrZV9wcm9wZXJ0eSgndmFsdWUnKQorCisKK2NsYXNzIFN5bmNocm9uaXplZEFycmF5KFN5bmNocm9uaXplZEJhc2UpOgorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fb2JqKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICBzZWxmLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fb2JqW2ldCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGksIHZhbHVlKToKKyAgICAgICAgc2VsZi5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fb2JqW2ldID0gdmFsdWUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCisKKyAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIHN0YXJ0LCBzdG9wKToKKyAgICAgICAgc2VsZi5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29ialtzdGFydDpzdG9wXQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZWxlYXNlKCkKKworICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgc3RhcnQsIHN0b3AsIHZhbHVlcyk6CisgICAgICAgIHNlbGYuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX29ialtzdGFydDpzdG9wXSA9IHZhbHVlcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZWxlYXNlKCkKKworCitjbGFzcyBTeW5jaHJvbml6ZWRTdHJpbmcoU3luY2hyb25pemVkQXJyYXkpOgorICAgIHZhbHVlID0gbWFrZV9wcm9wZXJ0eSgndmFsdWUnKQorICAgIHJhdyA9IG1ha2VfcHJvcGVydHkoJ3JhdycpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zaGFyZWRjdHlwZXMucHljIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3Npbmcvc2hhcmVkY3R5cGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmZkYTcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3Npbmcvc2hhcmVkY3R5cGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zaGFyZWRjdHlwZXMucHlvIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3Npbmcvc2hhcmVkY3R5cGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODBkNGQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3Npbmcvc2hhcmVkY3R5cGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zeW5jaHJvbml6ZS5weSBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3N5bmNocm9uaXplLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMDc3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zeW5jaHJvbml6ZS5weQpAQCAtMCwwICsxLDM0NCBAQAorIworIyBNb2R1bGUgaW1wbGVtZW50aW5nIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzCisjCisjIG11bHRpcHJvY2Vzc2luZy9zeW5jaHJvbml6ZS5weQorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgUiBPdWRrZXJrCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyMgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCitfX2FsbF9fID0gWworICAgICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywgJ0NvbmRpdGlvbicsICdFdmVudCcKKyAgICBdCisKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitmcm9tIHRpbWUgaW1wb3J0IHRpbWUgYXMgX3RpbWUsIHNsZWVwIGFzIF9zbGVlcAorCitpbXBvcnQgX211bHRpcHJvY2Vzc2luZworZnJvbSBtdWx0aXByb2Nlc3NpbmcucHJvY2VzcyBpbXBvcnQgY3VycmVudF9wcm9jZXNzCitmcm9tIG11bHRpcHJvY2Vzc2luZy51dGlsIGltcG9ydCBGaW5hbGl6ZSwgcmVnaXN0ZXJfYWZ0ZXJfZm9yaywgZGVidWcKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLmZvcmtpbmcgaW1wb3J0IGFzc2VydF9zcGF3bmluZywgUG9wZW4KKworIyBUcnkgdG8gaW1wb3J0IHRoZSBtcC5zeW5jaHJvbml6ZSBtb2R1bGUgY2xlYW5seSwgaWYgaXQgZmFpbHMKKyMgcmFpc2UgSW1wb3J0RXJyb3IgZm9yIHBsYXRmb3JtcyBsYWNraW5nIGEgd29ya2luZyBzZW1fb3BlbiBpbXBsZW1lbnRhdGlvbi4KKyMgU2VlIGlzc3VlIDM3NzAKK3RyeToKKyAgICBmcm9tIF9tdWx0aXByb2Nlc3NpbmcgaW1wb3J0IFNlbUxvY2sKK2V4Y2VwdCAoSW1wb3J0RXJyb3IpOgorICAgIHJhaXNlIEltcG9ydEVycm9yKCJUaGlzIHBsYXRmb3JtIGxhY2tzIGEgZnVuY3Rpb25pbmcgc2VtX29wZW4iICsKKyAgICAgICAgICAgICAgICAgICAgICAiIGltcGxlbWVudGF0aW9uLCB0aGVyZWZvcmUsIHRoZSByZXF1aXJlZCIgKworICAgICAgICAgICAgICAgICAgICAgICIgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMgbmVlZGVkIHdpbGwgbm90IiArCisgICAgICAgICAgICAgICAgICAgICAgIiBmdW5jdGlvbiwgc2VlIGlzc3VlIDM3NzAuIikKKworIworIyBDb25zdGFudHMKKyMKKworUkVDVVJTSVZFX01VVEVYLCBTRU1BUEhPUkUgPSByYW5nZSgyKQorU0VNX1ZBTFVFX01BWCA9IF9tdWx0aXByb2Nlc3NpbmcuU2VtTG9jay5TRU1fVkFMVUVfTUFYCisKKyMKKyMgQmFzZSBjbGFzcyBmb3Igc2VtYXBob3JlcyBhbmQgbXV0ZXhlczsgd3JhcHMgYF9tdWx0aXByb2Nlc3NpbmcuU2VtTG9ja2AKKyMKKworY2xhc3MgU2VtTG9jayhvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGtpbmQsIHZhbHVlLCBtYXh2YWx1ZSk6CisgICAgICAgIHNsID0gc2VsZi5fc2VtbG9jayA9IF9tdWx0aXByb2Nlc3NpbmcuU2VtTG9jayhraW5kLCB2YWx1ZSwgbWF4dmFsdWUpCisgICAgICAgIGRlYnVnKCdjcmVhdGVkIHNlbWxvY2sgd2l0aCBoYW5kbGUgJXMnICUgc2wuaGFuZGxlKQorICAgICAgICBzZWxmLl9tYWtlX21ldGhvZHMoKQorCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnd2luMzInOgorICAgICAgICAgICAgZGVmIF9hZnRlcl9mb3JrKG9iaik6CisgICAgICAgICAgICAgICAgb2JqLl9zZW1sb2NrLl9hZnRlcl9mb3JrKCkKKyAgICAgICAgICAgIHJlZ2lzdGVyX2FmdGVyX2Zvcmsoc2VsZiwgX2FmdGVyX2ZvcmspCisKKyAgICBkZWYgX21ha2VfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgc2VsZi5hY3F1aXJlID0gc2VsZi5fc2VtbG9jay5hY3F1aXJlCisgICAgICAgIHNlbGYucmVsZWFzZSA9IHNlbGYuX3NlbWxvY2sucmVsZWFzZQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NlbWxvY2suX19lbnRlcl9fKCkKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9zZW1sb2NrLl9fZXhpdF9fKCphcmdzKQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgYXNzZXJ0X3NwYXduaW5nKHNlbGYpCisgICAgICAgIHNsID0gc2VsZi5fc2VtbG9jaworICAgICAgICByZXR1cm4gKFBvcGVuLmR1cGxpY2F0ZV9mb3JfY2hpbGQoc2wuaGFuZGxlKSwgc2wua2luZCwgc2wubWF4dmFsdWUpCisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgc2VsZi5fc2VtbG9jayA9IF9tdWx0aXByb2Nlc3NpbmcuU2VtTG9jay5fcmVidWlsZCgqc3RhdGUpCisgICAgICAgIGRlYnVnKCdyZWNyZWF0ZWQgYmxvY2tlciB3aXRoIGhhbmRsZSAlcicgJSBzdGF0ZVswXSkKKyAgICAgICAgc2VsZi5fbWFrZV9tZXRob2RzKCkKKworIworIyBTZW1hcGhvcmUKKyMKKworY2xhc3MgU2VtYXBob3JlKFNlbUxvY2spOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlPTEpOgorICAgICAgICBTZW1Mb2NrLl9faW5pdF9fKHNlbGYsIFNFTUFQSE9SRSwgdmFsdWUsIFNFTV9WQUxVRV9NQVgpCisKKyAgICBkZWYgZ2V0X3ZhbHVlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc2VtbG9jay5fZ2V0X3ZhbHVlKCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9zZW1sb2NrLl9nZXRfdmFsdWUoKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgdmFsdWUgPSAndW5rbm93bicKKyAgICAgICAgcmV0dXJuICc8U2VtYXBob3JlKHZhbHVlPSVzKT4nICUgdmFsdWUKKworIworIyBCb3VuZGVkIHNlbWFwaG9yZQorIworCitjbGFzcyBCb3VuZGVkU2VtYXBob3JlKFNlbWFwaG9yZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9MSk6CisgICAgICAgIFNlbUxvY2suX19pbml0X18oc2VsZiwgU0VNQVBIT1JFLCB2YWx1ZSwgdmFsdWUpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fc2VtbG9jay5fZ2V0X3ZhbHVlKCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHZhbHVlID0gJ3Vua25vd24nCisgICAgICAgIHJldHVybiAnPEJvdW5kZWRTZW1hcGhvcmUodmFsdWU9JXMsIG1heHZhbHVlPSVzKT4nICUgXAorICAgICAgICAgICAgICAgKHZhbHVlLCBzZWxmLl9zZW1sb2NrLm1heHZhbHVlKQorCisjCisjIE5vbi1yZWN1cnNpdmUgbG9jaworIworCitjbGFzcyBMb2NrKFNlbUxvY2spOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBTZW1Mb2NrLl9faW5pdF9fKHNlbGYsIFNFTUFQSE9SRSwgMSwgMSkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fc2VtbG9jay5faXNfbWluZSgpOgorICAgICAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50X3Byb2Nlc3MoKS5uYW1lCisgICAgICAgICAgICAgICAgaWYgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSAhPSAnTWFpblRocmVhZCc6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgKz0gJ3wnICsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZQorICAgICAgICAgICAgZWxpZiBzZWxmLl9zZW1sb2NrLl9nZXRfdmFsdWUoKSA9PSAxOgorICAgICAgICAgICAgICAgIG5hbWUgPSAnTm9uZScKKyAgICAgICAgICAgIGVsaWYgc2VsZi5fc2VtbG9jay5fY291bnQoKSA+IDA6CisgICAgICAgICAgICAgICAgbmFtZSA9ICdTb21lT3RoZXJUaHJlYWQnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWUgPSAnU29tZU90aGVyUHJvY2VzcycKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIG5hbWUgPSAndW5rbm93bicKKyAgICAgICAgcmV0dXJuICc8TG9jayhvd25lcj0lcyk+JyAlIG5hbWUKKworIworIyBSZWN1cnNpdmUgbG9jaworIworCitjbGFzcyBSTG9jayhTZW1Mb2NrKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgU2VtTG9jay5fX2luaXRfXyhzZWxmLCBSRUNVUlNJVkVfTVVURVgsIDEsIDEpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX3NlbWxvY2suX2lzX21pbmUoKToKKyAgICAgICAgICAgICAgICBuYW1lID0gY3VycmVudF9wcm9jZXNzKCkubmFtZQorICAgICAgICAgICAgICAgIGlmIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUgIT0gJ01haW5UaHJlYWQnOgorICAgICAgICAgICAgICAgICAgICBuYW1lICs9ICd8JyArIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUKKyAgICAgICAgICAgICAgICBjb3VudCA9IHNlbGYuX3NlbWxvY2suX2NvdW50KCkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5fc2VtbG9jay5fZ2V0X3ZhbHVlKCkgPT0gMToKKyAgICAgICAgICAgICAgICBuYW1lLCBjb3VudCA9ICdOb25lJywgMAorICAgICAgICAgICAgZWxpZiBzZWxmLl9zZW1sb2NrLl9jb3VudCgpID4gMDoKKyAgICAgICAgICAgICAgICBuYW1lLCBjb3VudCA9ICdTb21lT3RoZXJUaHJlYWQnLCAnbm9uemVybycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmFtZSwgY291bnQgPSAnU29tZU90aGVyUHJvY2VzcycsICdub256ZXJvJworICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgbmFtZSwgY291bnQgPSAndW5rbm93bicsICd1bmtub3duJworICAgICAgICByZXR1cm4gJzxSTG9jayglcywgJXMpPicgJSAobmFtZSwgY291bnQpCisKKyMKKyMgQ29uZGl0aW9uIHZhcmlhYmxlCisjCisKK2NsYXNzIENvbmRpdGlvbihvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2s9Tm9uZSk6CisgICAgICAgIHNlbGYuX2xvY2sgPSBsb2NrIG9yIFJMb2NrKCkKKyAgICAgICAgc2VsZi5fc2xlZXBpbmdfY291bnQgPSBTZW1hcGhvcmUoMCkKKyAgICAgICAgc2VsZi5fd29rZW5fY291bnQgPSBTZW1hcGhvcmUoMCkKKyAgICAgICAgc2VsZi5fd2FpdF9zZW1hcGhvcmUgPSBTZW1hcGhvcmUoMCkKKyAgICAgICAgc2VsZi5fbWFrZV9tZXRob2RzKCkKKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgIGFzc2VydF9zcGF3bmluZyhzZWxmKQorICAgICAgICByZXR1cm4gKHNlbGYuX2xvY2ssIHNlbGYuX3NsZWVwaW5nX2NvdW50LAorICAgICAgICAgICAgICAgIHNlbGYuX3dva2VuX2NvdW50LCBzZWxmLl93YWl0X3NlbWFwaG9yZSkKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAoc2VsZi5fbG9jaywgc2VsZi5fc2xlZXBpbmdfY291bnQsCisgICAgICAgICBzZWxmLl93b2tlbl9jb3VudCwgc2VsZi5fd2FpdF9zZW1hcGhvcmUpID0gc3RhdGUKKyAgICAgICAgc2VsZi5fbWFrZV9tZXRob2RzKCkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9sb2NrLl9fZW50ZXJfXygpCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fbG9jay5fX2V4aXRfXygqYXJncykKKworICAgIGRlZiBfbWFrZV9tZXRob2RzKHNlbGYpOgorICAgICAgICBzZWxmLmFjcXVpcmUgPSBzZWxmLl9sb2NrLmFjcXVpcmUKKyAgICAgICAgc2VsZi5yZWxlYXNlID0gc2VsZi5fbG9jay5yZWxlYXNlCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG51bV93YWl0ZXJzID0gKHNlbGYuX3NsZWVwaW5nX2NvdW50Ll9zZW1sb2NrLl9nZXRfdmFsdWUoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl93b2tlbl9jb3VudC5fc2VtbG9jay5fZ2V0X3ZhbHVlKCkpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBudW1fd2FpdGVycyA9ICd1bmtvd24nCisgICAgICAgIHJldHVybiAnPENvbmRpdGlvbiglcywgJXMpPicgJSAoc2VsZi5fbG9jaywgbnVtX3dhaXRlcnMpCisKKyAgICBkZWYgd2FpdChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICBhc3NlcnQgc2VsZi5fbG9jay5fc2VtbG9jay5faXNfbWluZSgpLCBcCisgICAgICAgICAgICAgICAnbXVzdCBhY3F1aXJlKCkgY29uZGl0aW9uIGJlZm9yZSB1c2luZyB3YWl0KCknCisKKyAgICAgICAgIyBpbmRpY2F0ZSB0aGF0IHRoaXMgdGhyZWFkIGlzIGdvaW5nIHRvIHNsZWVwCisgICAgICAgIHNlbGYuX3NsZWVwaW5nX2NvdW50LnJlbGVhc2UoKQorCisgICAgICAgICMgcmVsZWFzZSBsb2NrCisgICAgICAgIGNvdW50ID0gc2VsZi5fbG9jay5fc2VtbG9jay5fY291bnQoKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoY291bnQpOgorICAgICAgICAgICAgc2VsZi5fbG9jay5yZWxlYXNlKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHdhaXQgZm9yIG5vdGlmaWNhdGlvbiBvciB0aW1lb3V0CisgICAgICAgICAgICBzZWxmLl93YWl0X3NlbWFwaG9yZS5hY3F1aXJlKFRydWUsIHRpbWVvdXQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAjIGluZGljYXRlIHRoYXQgdGhpcyB0aHJlYWQgaGFzIHdva2VuCisgICAgICAgICAgICBzZWxmLl93b2tlbl9jb3VudC5yZWxlYXNlKCkKKworICAgICAgICAgICAgIyByZWFjcXVpcmUgbG9jaworICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGNvdW50KToKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorCisgICAgZGVmIG5vdGlmeShzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2xvY2suX3NlbWxvY2suX2lzX21pbmUoKSwgJ2xvY2sgaXMgbm90IG93bmVkJworICAgICAgICBhc3NlcnQgbm90IHNlbGYuX3dhaXRfc2VtYXBob3JlLmFjcXVpcmUoRmFsc2UpCisKKyAgICAgICAgIyB0byB0YWtlIGFjY291bnQgb2YgdGltZW91dHMgc2luY2UgbGFzdCBub3RpZnkoKSB3ZSBzdWJ0cmFjdAorICAgICAgICAjIHdva2VuX2NvdW50IGZyb20gc2xlZXBpbmdfY291bnQgYW5kIHJlemVybyB3b2tlbl9jb3VudAorICAgICAgICB3aGlsZSBzZWxmLl93b2tlbl9jb3VudC5hY3F1aXJlKEZhbHNlKToKKyAgICAgICAgICAgIHJlcyA9IHNlbGYuX3NsZWVwaW5nX2NvdW50LmFjcXVpcmUoRmFsc2UpCisgICAgICAgICAgICBhc3NlcnQgcmVzCisKKyAgICAgICAgaWYgc2VsZi5fc2xlZXBpbmdfY291bnQuYWNxdWlyZShGYWxzZSk6ICMgdHJ5IGdyYWJiaW5nIGEgc2xlZXBlcgorICAgICAgICAgICAgc2VsZi5fd2FpdF9zZW1hcGhvcmUucmVsZWFzZSgpICAgICAgIyB3YWtlIHVwIG9uZSBzbGVlcGVyCisgICAgICAgICAgICBzZWxmLl93b2tlbl9jb3VudC5hY3F1aXJlKCkgICAgICAgICAjIHdhaXQgZm9yIHRoZSBzbGVlcGVyIHRvIHdha2UKKworICAgICAgICAgICAgIyByZXplcm8gX3dhaXRfc2VtYXBob3JlIGluIGNhc2UgYSB0aW1lb3V0IGp1c3QgaGFwcGVuZWQKKyAgICAgICAgICAgIHNlbGYuX3dhaXRfc2VtYXBob3JlLmFjcXVpcmUoRmFsc2UpCisKKyAgICBkZWYgbm90aWZ5X2FsbChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2xvY2suX3NlbWxvY2suX2lzX21pbmUoKSwgJ2xvY2sgaXMgbm90IG93bmVkJworICAgICAgICBhc3NlcnQgbm90IHNlbGYuX3dhaXRfc2VtYXBob3JlLmFjcXVpcmUoRmFsc2UpCisKKyAgICAgICAgIyB0byB0YWtlIGFjY291bnQgb2YgdGltZW91dHMgc2luY2UgbGFzdCBub3RpZnkqKCkgd2Ugc3VidHJhY3QKKyAgICAgICAgIyB3b2tlbl9jb3VudCBmcm9tIHNsZWVwaW5nX2NvdW50IGFuZCByZXplcm8gd29rZW5fY291bnQKKyAgICAgICAgd2hpbGUgc2VsZi5fd29rZW5fY291bnQuYWNxdWlyZShGYWxzZSk6CisgICAgICAgICAgICByZXMgPSBzZWxmLl9zbGVlcGluZ19jb3VudC5hY3F1aXJlKEZhbHNlKQorICAgICAgICAgICAgYXNzZXJ0IHJlcworCisgICAgICAgIHNsZWVwZXJzID0gMAorICAgICAgICB3aGlsZSBzZWxmLl9zbGVlcGluZ19jb3VudC5hY3F1aXJlKEZhbHNlKToKKyAgICAgICAgICAgIHNlbGYuX3dhaXRfc2VtYXBob3JlLnJlbGVhc2UoKSAgICAgICAgIyB3YWtlIHVwIG9uZSBzbGVlcGVyCisgICAgICAgICAgICBzbGVlcGVycyArPSAxCisKKyAgICAgICAgaWYgc2xlZXBlcnM6CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2xlZXBlcnMpOgorICAgICAgICAgICAgICAgIHNlbGYuX3dva2VuX2NvdW50LmFjcXVpcmUoKSAgICAgICAjIHdhaXQgZm9yIGEgc2xlZXBlciB0byB3YWtlCisKKyAgICAgICAgICAgICMgcmV6ZXJvIHdhaXRfc2VtYXBob3JlIGluIGNhc2Ugc29tZSB0aW1lb3V0cyBqdXN0IGhhcHBlbmVkCisgICAgICAgICAgICB3aGlsZSBzZWxmLl93YWl0X3NlbWFwaG9yZS5hY3F1aXJlKEZhbHNlKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyMKKyMgRXZlbnQKKyMKKworY2xhc3MgRXZlbnQob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fY29uZCA9IENvbmRpdGlvbihMb2NrKCkpCisgICAgICAgIHNlbGYuX2ZsYWcgPSBTZW1hcGhvcmUoMCkKKworICAgIGRlZiBpc19zZXQoc2VsZik6CisgICAgICAgIHNlbGYuX2NvbmQuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX2ZsYWcuYWNxdWlyZShGYWxzZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fZmxhZy5yZWxlYXNlKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb25kLnJlbGVhc2UoKQorCisgICAgZGVmIHNldChzZWxmKToKKyAgICAgICAgc2VsZi5fY29uZC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fZmxhZy5hY3F1aXJlKEZhbHNlKQorICAgICAgICAgICAgc2VsZi5fZmxhZy5yZWxlYXNlKCkKKyAgICAgICAgICAgIHNlbGYuX2NvbmQubm90aWZ5X2FsbCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb25kLnJlbGVhc2UoKQorCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLl9jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9mbGFnLmFjcXVpcmUoRmFsc2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb25kLnJlbGVhc2UoKQorCisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgc2VsZi5fY29uZC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fZmxhZy5hY3F1aXJlKEZhbHNlKToKKyAgICAgICAgICAgICAgICBzZWxmLl9mbGFnLnJlbGVhc2UoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9jb25kLndhaXQodGltZW91dCkKKworICAgICAgICAgICAgaWYgc2VsZi5fZmxhZy5hY3F1aXJlKEZhbHNlKToKKyAgICAgICAgICAgICAgICBzZWxmLl9mbGFnLnJlbGVhc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NvbmQucmVsZWFzZSgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zeW5jaHJvbml6ZS5weWMgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zeW5jaHJvbml6ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkN2ZmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3N5bmNocm9uaXplLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zeW5jaHJvbml6ZS5weW8gYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zeW5jaHJvbml6ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiODNhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3N5bmNocm9uaXplLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy91dGlsLnB5IGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWIzZDJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvdXRpbC5weQpAQCAtMCwwICsxLDM0NCBAQAorIworIyBNb2R1bGUgcHJvdmlkaW5nIHZhcmlvdXMgZmFjaWxpdGllcyB0byBvdGhlciBwYXJ0cyBvZiB0aGUgcGFja2FnZQorIworIyBtdWx0aXByb2Nlc3NpbmcvdXRpbC5weQorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgUiBPdWRrZXJrCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyMgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCitpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgd2Vha3JlZgoraW1wb3J0IGF0ZXhpdAoraW1wb3J0IHRocmVhZGluZyAgICAgICAgIyB3ZSB3YW50IHRocmVhZGluZyB0byBpbnN0YWxsIGl0J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2xlYW51cCBmdW5jdGlvbiBiZWZvcmUgbXVsdGlwcm9jZXNzaW5nIGRvZXMKK2Zyb20gc3VicHJvY2VzcyBpbXBvcnQgX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncworCitmcm9tIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzIGltcG9ydCBjdXJyZW50X3Byb2Nlc3MsIGFjdGl2ZV9jaGlsZHJlbgorCitfX2FsbF9fID0gWworICAgICdzdWJfZGVidWcnLCAnZGVidWcnLCAnaW5mbycsICdzdWJfd2FybmluZycsICdnZXRfbG9nZ2VyJywKKyAgICAnbG9nX3RvX3N0ZGVycicsICdnZXRfdGVtcF9kaXInLCAncmVnaXN0ZXJfYWZ0ZXJfZm9yaycsCisgICAgJ2lzX2V4aXRpbmcnLCAnRmluYWxpemUnLCAnRm9ya0F3YXJlVGhyZWFkTG9jaycsICdGb3JrQXdhcmVMb2NhbCcsCisgICAgJ1NVQkRFQlVHJywgJ1NVQldBUk5JTkcnLAorICAgIF0KKworIworIyBMb2dnaW5nCisjCisKK05PVFNFVCA9IDAKK1NVQkRFQlVHID0gNQorREVCVUcgPSAxMAorSU5GTyA9IDIwCitTVUJXQVJOSU5HID0gMjUKKworTE9HR0VSX05BTUUgPSAnbXVsdGlwcm9jZXNzaW5nJworREVGQVVMVF9MT0dHSU5HX0ZPUk1BVCA9ICdbJShsZXZlbG5hbWUpcy8lKHByb2Nlc3NOYW1lKXNdICUobWVzc2FnZSlzJworCitfbG9nZ2VyID0gTm9uZQorX2xvZ190b19zdGRlcnIgPSBGYWxzZQorCitkZWYgc3ViX2RlYnVnKG1zZywgKmFyZ3MpOgorICAgIGlmIF9sb2dnZXI6CisgICAgICAgIF9sb2dnZXIubG9nKFNVQkRFQlVHLCBtc2csICphcmdzKQorCitkZWYgZGVidWcobXNnLCAqYXJncyk6CisgICAgaWYgX2xvZ2dlcjoKKyAgICAgICAgX2xvZ2dlci5sb2coREVCVUcsIG1zZywgKmFyZ3MpCisKK2RlZiBpbmZvKG1zZywgKmFyZ3MpOgorICAgIGlmIF9sb2dnZXI6CisgICAgICAgIF9sb2dnZXIubG9nKElORk8sIG1zZywgKmFyZ3MpCisKK2RlZiBzdWJfd2FybmluZyhtc2csICphcmdzKToKKyAgICBpZiBfbG9nZ2VyOgorICAgICAgICBfbG9nZ2VyLmxvZyhTVUJXQVJOSU5HLCBtc2csICphcmdzKQorCitkZWYgZ2V0X2xvZ2dlcigpOgorICAgICcnJworICAgIFJldHVybnMgbG9nZ2VyIHVzZWQgYnkgbXVsdGlwcm9jZXNzaW5nCisgICAgJycnCisgICAgZ2xvYmFsIF9sb2dnZXIKKyAgICBpbXBvcnQgbG9nZ2luZywgYXRleGl0CisKKyAgICBsb2dnaW5nLl9hY3F1aXJlTG9jaygpCisgICAgdHJ5OgorICAgICAgICBpZiBub3QgX2xvZ2dlcjoKKworICAgICAgICAgICAgX2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKExPR0dFUl9OQU1FKQorICAgICAgICAgICAgX2xvZ2dlci5wcm9wYWdhdGUgPSAwCisgICAgICAgICAgICBsb2dnaW5nLmFkZExldmVsTmFtZShTVUJERUJVRywgJ1NVQkRFQlVHJykKKyAgICAgICAgICAgIGxvZ2dpbmcuYWRkTGV2ZWxOYW1lKFNVQldBUk5JTkcsICdTVUJXQVJOSU5HJykKKworICAgICAgICAgICAgIyBYWFggbXVsdGlwcm9jZXNzaW5nIHNob3VsZCBjbGVhbnVwIGJlZm9yZSBsb2dnaW5nCisgICAgICAgICAgICBpZiBoYXNhdHRyKGF0ZXhpdCwgJ3VucmVnaXN0ZXInKToKKyAgICAgICAgICAgICAgICBhdGV4aXQudW5yZWdpc3RlcihfZXhpdF9mdW5jdGlvbikKKyAgICAgICAgICAgICAgICBhdGV4aXQucmVnaXN0ZXIoX2V4aXRfZnVuY3Rpb24pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGF0ZXhpdC5fZXhpdGhhbmRsZXJzLnJlbW92ZSgoX2V4aXRfZnVuY3Rpb24sICgpLCB7fSkpCisgICAgICAgICAgICAgICAgYXRleGl0Ll9leGl0aGFuZGxlcnMuYXBwZW5kKChfZXhpdF9mdW5jdGlvbiwgKCksIHt9KSkKKworICAgIGZpbmFsbHk6CisgICAgICAgIGxvZ2dpbmcuX3JlbGVhc2VMb2NrKCkKKworICAgIHJldHVybiBfbG9nZ2VyCisKK2RlZiBsb2dfdG9fc3RkZXJyKGxldmVsPU5vbmUpOgorICAgICcnJworICAgIFR1cm4gb24gbG9nZ2luZyBhbmQgYWRkIGEgaGFuZGxlciB3aGljaCBwcmludHMgdG8gc3RkZXJyCisgICAgJycnCisgICAgZ2xvYmFsIF9sb2dfdG9fc3RkZXJyCisgICAgaW1wb3J0IGxvZ2dpbmcKKworICAgIGxvZ2dlciA9IGdldF9sb2dnZXIoKQorICAgIGZvcm1hdHRlciA9IGxvZ2dpbmcuRm9ybWF0dGVyKERFRkFVTFRfTE9HR0lOR19GT1JNQVQpCisgICAgaGFuZGxlciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCisgICAgaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKQorICAgIGxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXIpCisKKyAgICBpZiBsZXZlbDoKKyAgICAgICAgbG9nZ2VyLnNldExldmVsKGxldmVsKQorICAgIF9sb2dfdG9fc3RkZXJyID0gVHJ1ZQorICAgIHJldHVybiBfbG9nZ2VyCisKKyMKKyMgRnVuY3Rpb24gcmV0dXJuaW5nIGEgdGVtcCBkaXJlY3Rvcnkgd2hpY2ggd2lsbCBiZSByZW1vdmVkIG9uIGV4aXQKKyMKKworZGVmIGdldF90ZW1wX2RpcigpOgorICAgICMgZ2V0IG5hbWUgb2YgYSB0ZW1wIGRpcmVjdG9yeSB3aGljaCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cAorICAgIGlmIGN1cnJlbnRfcHJvY2VzcygpLl90ZW1wZGlyIGlzIE5vbmU6CisgICAgICAgIGltcG9ydCBzaHV0aWwsIHRlbXBmaWxlCisgICAgICAgIHRlbXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0ncHltcC0nKQorICAgICAgICBpbmZvKCdjcmVhdGVkIHRlbXAgZGlyZWN0b3J5ICVzJywgdGVtcGRpcikKKyAgICAgICAgRmluYWxpemUoTm9uZSwgc2h1dGlsLnJtdHJlZSwgYXJncz1bdGVtcGRpcl0sIGV4aXRwcmlvcml0eT0tMTAwKQorICAgICAgICBjdXJyZW50X3Byb2Nlc3MoKS5fdGVtcGRpciA9IHRlbXBkaXIKKyAgICByZXR1cm4gY3VycmVudF9wcm9jZXNzKCkuX3RlbXBkaXIKKworIworIyBTdXBwb3J0IGZvciByZWluaXRpYWxpemF0aW9uIG9mIG9iamVjdHMgd2hlbiBib290c3RyYXBwaW5nIGEgY2hpbGQgcHJvY2VzcworIworCitfYWZ0ZXJmb3JrX3JlZ2lzdHJ5ID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKK19hZnRlcmZvcmtfY291bnRlciA9IGl0ZXJ0b29scy5jb3VudCgpCisKK2RlZiBfcnVuX2FmdGVyX2ZvcmtlcnMoKToKKyAgICBpdGVtcyA9IGxpc3QoX2FmdGVyZm9ya19yZWdpc3RyeS5pdGVtcygpKQorICAgIGl0ZW1zLnNvcnQoKQorICAgIGZvciAoaW5kZXgsIGlkZW50LCBmdW5jKSwgb2JqIGluIGl0ZW1zOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmdW5jKG9iaikKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIGluZm8oJ2FmdGVyIGZvcmtlciByYWlzZWQgZXhjZXB0aW9uICVzJywgZSkKKworZGVmIHJlZ2lzdGVyX2FmdGVyX2Zvcmsob2JqLCBmdW5jKToKKyAgICBfYWZ0ZXJmb3JrX3JlZ2lzdHJ5WyhfYWZ0ZXJmb3JrX2NvdW50ZXIubmV4dCgpLCBpZChvYmopLCBmdW5jKV0gPSBvYmoKKworIworIyBGaW5hbGl6YXRpb24gdXNpbmcgd2Vha3JlZnMKKyMKKworX2ZpbmFsaXplcl9yZWdpc3RyeSA9IHt9CitfZmluYWxpemVyX2NvdW50ZXIgPSBpdGVydG9vbHMuY291bnQoKQorCisKK2NsYXNzIEZpbmFsaXplKG9iamVjdCk6CisgICAgJycnCisgICAgQ2xhc3Mgd2hpY2ggc3VwcG9ydHMgb2JqZWN0IGZpbmFsaXphdGlvbiB1c2luZyB3ZWFrcmVmcworICAgICcnJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYmosIGNhbGxiYWNrLCBhcmdzPSgpLCBrd2FyZ3M9Tm9uZSwgZXhpdHByaW9yaXR5PU5vbmUpOgorICAgICAgICBhc3NlcnQgZXhpdHByaW9yaXR5IGlzIE5vbmUgb3IgdHlwZShleGl0cHJpb3JpdHkpIGlzIGludAorCisgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3dlYWtyZWYgPSB3ZWFrcmVmLnJlZihvYmosIHNlbGYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnQgZXhpdHByaW9yaXR5IGlzIG5vdCBOb25lCisKKyAgICAgICAgc2VsZi5fY2FsbGJhY2sgPSBjYWxsYmFjaworICAgICAgICBzZWxmLl9hcmdzID0gYXJncworICAgICAgICBzZWxmLl9rd2FyZ3MgPSBrd2FyZ3Mgb3Ige30KKyAgICAgICAgc2VsZi5fa2V5ID0gKGV4aXRwcmlvcml0eSwgX2ZpbmFsaXplcl9jb3VudGVyLm5leHQoKSkKKworICAgICAgICBfZmluYWxpemVyX3JlZ2lzdHJ5W3NlbGYuX2tleV0gPSBzZWxmCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgd3I9Tm9uZSk6CisgICAgICAgICcnJworICAgICAgICBSdW4gdGhlIGNhbGxiYWNrIHVubGVzcyBpdCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBvciBjYW5jZWxsZWQKKyAgICAgICAgJycnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBfZmluYWxpemVyX3JlZ2lzdHJ5W3NlbGYuX2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc3ViX2RlYnVnKCdmaW5hbGl6ZXIgbm8gbG9uZ2VyIHJlZ2lzdGVyZWQnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3ViX2RlYnVnKCdmaW5hbGl6ZXIgY2FsbGluZyAlcyB3aXRoIGFyZ3MgJXMgYW5kIGt3YXJncyAlcycsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jYWxsYmFjaywgc2VsZi5fYXJncywgc2VsZi5fa3dhcmdzKQorICAgICAgICAgICAgcmVzID0gc2VsZi5fY2FsbGJhY2soKnNlbGYuX2FyZ3MsICoqc2VsZi5fa3dhcmdzKQorICAgICAgICAgICAgc2VsZi5fd2Vha3JlZiA9IHNlbGYuX2NhbGxiYWNrID0gc2VsZi5fYXJncyA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9rd2FyZ3MgPSBzZWxmLl9rZXkgPSBOb25lCisgICAgICAgICAgICByZXR1cm4gcmVzCisKKyAgICBkZWYgY2FuY2VsKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgQ2FuY2VsIGZpbmFsaXphdGlvbiBvZiB0aGUgb2JqZWN0CisgICAgICAgICcnJworICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgX2ZpbmFsaXplcl9yZWdpc3RyeVtzZWxmLl9rZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3dlYWtyZWYgPSBzZWxmLl9jYWxsYmFjayA9IHNlbGYuX2FyZ3MgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fa3dhcmdzID0gc2VsZi5fa2V5ID0gTm9uZQorCisgICAgZGVmIHN0aWxsX2FjdGl2ZShzZWxmKToKKyAgICAgICAgJycnCisgICAgICAgIFJldHVybiB3aGV0aGVyIHRoaXMgZmluYWxpemVyIGlzIHN0aWxsIHdhaXRpbmcgdG8gaW52b2tlIGNhbGxiYWNrCisgICAgICAgICcnJworICAgICAgICByZXR1cm4gc2VsZi5fa2V5IGluIF9maW5hbGl6ZXJfcmVnaXN0cnkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2JqID0gc2VsZi5fd2Vha3JlZigpCisgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgICAgICBvYmogPSBOb25lCisKKyAgICAgICAgaWYgb2JqIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gJzxGaW5hbGl6ZSBvYmplY3QsIGRlYWQ+JworCisgICAgICAgIHggPSAnPEZpbmFsaXplIG9iamVjdCwgY2FsbGJhY2s9JXMnICUgXAorICAgICAgICAgICAgZ2V0YXR0cihzZWxmLl9jYWxsYmFjaywgJ19fbmFtZV9fJywgc2VsZi5fY2FsbGJhY2spCisgICAgICAgIGlmIHNlbGYuX2FyZ3M6CisgICAgICAgICAgICB4ICs9ICcsIGFyZ3M9JyArIHN0cihzZWxmLl9hcmdzKQorICAgICAgICBpZiBzZWxmLl9rd2FyZ3M6CisgICAgICAgICAgICB4ICs9ICcsIGt3YXJncz0nICsgc3RyKHNlbGYuX2t3YXJncykKKyAgICAgICAgaWYgc2VsZi5fa2V5WzBdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgeCArPSAnLCBleGl0cHJvcml0eT0nICsgc3RyKHNlbGYuX2tleVswXSkKKyAgICAgICAgcmV0dXJuIHggKyAnPicKKworCitkZWYgX3J1bl9maW5hbGl6ZXJzKG1pbnByaW9yaXR5PU5vbmUpOgorICAgICcnJworICAgIFJ1biBhbGwgZmluYWxpemVycyB3aG9zZSBleGl0IHByaW9yaXR5IGlzIG5vdCBOb25lIGFuZCBhdCBsZWFzdCBtaW5wcmlvcml0eQorCisgICAgRmluYWxpemVycyB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkgYXJlIGNhbGxlZCBmaXJzdDsgZmluYWxpemVycyB3aXRoCisgICAgdGhlIHNhbWUgcHJpb3JpdHkgd2lsbCBiZSBjYWxsZWQgaW4gcmV2ZXJzZSBvcmRlciBvZiBjcmVhdGlvbi4KKyAgICAnJycKKyAgICBpZiBfZmluYWxpemVyX3JlZ2lzdHJ5IGlzIE5vbmU6CisgICAgICAgICMgVGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGFmdGVyIHRoaXMgbW9kdWxlJ3MgZ2xvYmFscyBhcmUKKyAgICAgICAgIyBkZXN0cm95ZWQuICBTZWUgdGhlIF9leGl0X2Z1bmN0aW9uIGZ1bmN0aW9uIGluIHRoaXMgbW9kdWxlIGZvciBtb3JlCisgICAgICAgICMgbm90ZXMuCisgICAgICAgIHJldHVybgorCisgICAgaWYgbWlucHJpb3JpdHkgaXMgTm9uZToKKyAgICAgICAgZiA9IGxhbWJkYSBwIDogcFswXVswXSBpcyBub3QgTm9uZQorICAgIGVsc2U6CisgICAgICAgIGYgPSBsYW1iZGEgcCA6IHBbMF1bMF0gaXMgbm90IE5vbmUgYW5kIHBbMF1bMF0gPj0gbWlucHJpb3JpdHkKKworICAgIGl0ZW1zID0gW3ggZm9yIHggaW4gX2ZpbmFsaXplcl9yZWdpc3RyeS5pdGVtcygpIGlmIGYoeCldCisgICAgaXRlbXMuc29ydChyZXZlcnNlPVRydWUpCisKKyAgICBmb3Iga2V5LCBmaW5hbGl6ZXIgaW4gaXRlbXM6CisgICAgICAgIHN1Yl9kZWJ1ZygnY2FsbGluZyAlcycsIGZpbmFsaXplcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmluYWxpemVyKCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorCisgICAgaWYgbWlucHJpb3JpdHkgaXMgTm9uZToKKyAgICAgICAgX2ZpbmFsaXplcl9yZWdpc3RyeS5jbGVhcigpCisKKyMKKyMgQ2xlYW4gdXAgb24gZXhpdAorIworCitkZWYgaXNfZXhpdGluZygpOgorICAgICcnJworICAgIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2VzcyBpcyBzaHV0dGluZyBkb3duCisgICAgJycnCisgICAgcmV0dXJuIF9leGl0aW5nIG9yIF9leGl0aW5nIGlzIE5vbmUKKworX2V4aXRpbmcgPSBGYWxzZQorCitkZWYgX2V4aXRfZnVuY3Rpb24oaW5mbz1pbmZvLCBkZWJ1Zz1kZWJ1ZywgX3J1bl9maW5hbGl6ZXJzPV9ydW5fZmluYWxpemVycywKKyAgICAgICAgICAgICAgICAgICBhY3RpdmVfY2hpbGRyZW49YWN0aXZlX2NoaWxkcmVuLAorICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfcHJvY2Vzcz1jdXJyZW50X3Byb2Nlc3MpOgorICAgICMgTkI6IHdlIGhvbGQgb24gdG8gcmVmZXJlbmNlcyB0byBmdW5jdGlvbnMgaW4gdGhlIGFyZ2xpc3QgZHVlIHRvIHRoZQorICAgICMgc2l0dWF0aW9uIGRlc2NyaWJlZCBiZWxvdywgd2hlcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhpcworICAgICMgbW9kdWxlJ3MgZ2xvYmFscyBhcmUgZGVzdHJveWVkLgorCisgICAgZ2xvYmFsIF9leGl0aW5nCisKKyAgICBpbmZvKCdwcm9jZXNzIHNodXR0aW5nIGRvd24nKQorICAgIGRlYnVnKCdydW5uaW5nIGFsbCAiYXRleGl0IiBmaW5hbGl6ZXJzIHdpdGggcHJpb3JpdHkgPj0gMCcpCisgICAgX3J1bl9maW5hbGl6ZXJzKDApCisKKyAgICBpZiBjdXJyZW50X3Byb2Nlc3MoKSBpcyBub3QgTm9uZToKKyAgICAgICAgIyBOQjogd2UgY2hlY2sgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBOb25lIGhlcmUgYmVjYXVzZSBpZgorICAgICAgICAjIGl0J3MgTm9uZSwgYW55IGNhbGwgdG8gYGBhY3RpdmVfY2hpbGRyZW4oKWBgIHdpbGwgdGhyb3cgYW4KKyAgICAgICAgIyBBdHRyaWJ1dGVFcnJvciAoYWN0aXZlX2NoaWxkcmVuIHdpbmRzIHVwIHRyeWluZyB0byBnZXQKKyAgICAgICAgIyBhdHRyaWJ1dGVzIGZyb20gdXRpbC5fY3VycmVudF9wcm9jZXNzKS4gIFRoaXMgaGFwcGVucyBpbiBhCisgICAgICAgICMgdmFyaWV0eSBvZiBzaHV0ZG93biBjaXJjdW1zdGFuY2VzIHRoYXQgYXJlIG5vdCB3ZWxsLXVuZGVyc3Rvb2QKKyAgICAgICAgIyBiZWNhdXNlIG1vZHVsZS1zY29wZSB2YXJpYWJsZXMgYXJlIG5vdCBhcHBhcmVudGx5IHN1cHBvc2VkIHRvCisgICAgICAgICMgYmUgZGVzdHJveWVkIHVudGlsIGFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgSG93ZXZlciwKKyAgICAgICAgIyB0aGV5IGFyZSBpbmRlZWQgZGVzdHJveWVkIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gIFNlZQorICAgICAgICAjIGlzc3VlcyA5Nzc1IGFuZCAxNTg4MS4gIEFsc28gcmVsYXRlZDogNDEwNiwgOTIwNSwgYW5kIDkyMDcuCisKKyAgICAgICAgZm9yIHAgaW4gYWN0aXZlX2NoaWxkcmVuKCk6CisgICAgICAgICAgICBpZiBwLl9kYWVtb25pYzoKKyAgICAgICAgICAgICAgICBpbmZvKCdjYWxsaW5nIHRlcm1pbmF0ZSgpIGZvciBkYWVtb24gJXMnLCBwLm5hbWUpCisgICAgICAgICAgICAgICAgcC5fcG9wZW4udGVybWluYXRlKCkKKworICAgICAgICBmb3IgcCBpbiBhY3RpdmVfY2hpbGRyZW4oKToKKyAgICAgICAgICAgIGluZm8oJ2NhbGxpbmcgam9pbigpIGZvciBwcm9jZXNzICVzJywgcC5uYW1lKQorICAgICAgICAgICAgcC5qb2luKCkKKworICAgIGRlYnVnKCdydW5uaW5nIHRoZSByZW1haW5pbmcgImF0ZXhpdCIgZmluYWxpemVycycpCisgICAgX3J1bl9maW5hbGl6ZXJzKCkKKworYXRleGl0LnJlZ2lzdGVyKF9leGl0X2Z1bmN0aW9uKQorCisjCisjIFNvbWUgZm9yayBhd2FyZSB0eXBlcworIworCitjbGFzcyBGb3JrQXdhcmVUaHJlYWRMb2NrKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9yZXNldCgpCisgICAgICAgIHJlZ2lzdGVyX2FmdGVyX2Zvcmsoc2VsZiwgRm9ya0F3YXJlVGhyZWFkTG9jay5fcmVzZXQpCisKKyAgICBkZWYgX3Jlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLl9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICAgICAgICBzZWxmLmFjcXVpcmUgPSBzZWxmLl9sb2NrLmFjcXVpcmUKKyAgICAgICAgc2VsZi5yZWxlYXNlID0gc2VsZi5fbG9jay5yZWxlYXNlCisKK2NsYXNzIEZvcmtBd2FyZUxvY2FsKHRocmVhZGluZy5sb2NhbCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICByZWdpc3Rlcl9hZnRlcl9mb3JrKHNlbGYsIGxhbWJkYSBvYmogOiBvYmouX19kaWN0X18uY2xlYXIoKSkKKyAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHR5cGUoc2VsZiksICgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYWFiMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy91dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy91dGlsLnB5byBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOWY0OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy91dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211dGV4LnB5IGIvbGliL3B5dGhvbjIuNy9tdXRleC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGFjYmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdXRleC5weQpAQCAtMCwwICsxLDU1IEBACisiIiJNdXR1YWwgZXhjbHVzaW9uIC0tIGZvciB1c2Ugd2l0aCBtb2R1bGUgc2NoZWQKKworQSBtdXRleCBoYXMgdHdvIHBpZWNlcyBvZiBzdGF0ZSAtLSBhICdsb2NrZWQnIGJpdCBhbmQgYSBxdWV1ZS4KK1doZW4gdGhlIG11dGV4IGlzIG5vdCBsb2NrZWQsIHRoZSBxdWV1ZSBpcyBlbXB0eS4KK090aGVyd2lzZSwgdGhlIHF1ZXVlIGNvbnRhaW5zIDAgb3IgbW9yZSAoZnVuY3Rpb24sIGFyZ3VtZW50KSBwYWlycworcmVwcmVzZW50aW5nIGZ1bmN0aW9ucyAob3IgbWV0aG9kcykgd2FpdGluZyB0byBhY3F1aXJlIHRoZSBsb2NrLgorV2hlbiB0aGUgbXV0ZXggaXMgdW5sb2NrZWQgd2hpbGUgdGhlIHF1ZXVlIGlzIG5vdCBlbXB0eSwKK3RoZSBmaXJzdCBxdWV1ZSBlbnRyeSBpcyByZW1vdmVkIGFuZCBpdHMgZnVuY3Rpb24oYXJndW1lbnQpIHBhaXIgY2FsbGVkLAoraW1wbHlpbmcgaXQgbm93IGhhcyB0aGUgbG9jay4KKworT2YgY291cnNlLCBubyBtdWx0aS10aHJlYWRpbmcgaXMgaW1wbGllZCAtLSBoZW5jZSB0aGUgZnVubnkgaW50ZXJmYWNlCitmb3IgbG9jaywgd2hlcmUgYSBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZSB0aGUgbG9jayBpcyBhcXVpcmVkLgorIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSBtdXRleCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCisKK2NsYXNzIG11dGV4OgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IG11dGV4IC0tIGluaXRpYWxseSB1bmxvY2tlZC4iIiIKKyAgICAgICAgc2VsZi5sb2NrZWQgPSBGYWxzZQorICAgICAgICBzZWxmLnF1ZXVlID0gZGVxdWUoKQorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhlIGxvY2tlZCBiaXQgb2YgdGhlIG11dGV4LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5sb2NrZWQKKworICAgIGRlZiB0ZXN0YW5kc2V0KHNlbGYpOgorICAgICAgICAiIiJBdG9taWMgdGVzdC1hbmQtc2V0IC0tIGdyYWIgdGhlIGxvY2sgaWYgaXQgaXMgbm90IHNldCwKKyAgICAgICAgcmV0dXJuIFRydWUgaWYgaXQgc3VjY2VlZGVkLiIiIgorICAgICAgICBpZiBub3Qgc2VsZi5sb2NrZWQ6CisgICAgICAgICAgICBzZWxmLmxvY2tlZCA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBsb2NrKHNlbGYsIGZ1bmN0aW9uLCBhcmd1bWVudCk6CisgICAgICAgICIiIkxvY2sgYSBtdXRleCwgY2FsbCB0aGUgZnVuY3Rpb24gd2l0aCBzdXBwbGllZCBhcmd1bWVudAorICAgICAgICB3aGVuIGl0IGlzIGFjcXVpcmVkLiAgSWYgdGhlIG11dGV4IGlzIGFscmVhZHkgbG9ja2VkLCBwbGFjZQorICAgICAgICBmdW5jdGlvbiBhbmQgYXJndW1lbnQgaW4gdGhlIHF1ZXVlLiIiIgorICAgICAgICBpZiBzZWxmLnRlc3RhbmRzZXQoKToKKyAgICAgICAgICAgIGZ1bmN0aW9uKGFyZ3VtZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5xdWV1ZS5hcHBlbmQoKGZ1bmN0aW9uLCBhcmd1bWVudCkpCisKKyAgICBkZWYgdW5sb2NrKHNlbGYpOgorICAgICAgICAiIiJVbmxvY2sgYSBtdXRleC4gIElmIHRoZSBxdWV1ZSBpcyBub3QgZW1wdHksIGNhbGwgdGhlIG5leHQKKyAgICAgICAgZnVuY3Rpb24gd2l0aCBpdHMgYXJndW1lbnQuIiIiCisgICAgICAgIGlmIHNlbGYucXVldWU6CisgICAgICAgICAgICBmdW5jdGlvbiwgYXJndW1lbnQgPSBzZWxmLnF1ZXVlLnBvcGxlZnQoKQorICAgICAgICAgICAgZnVuY3Rpb24oYXJndW1lbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxvY2tlZCA9IEZhbHNlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211dGV4LnB5YyBiL2xpYi9weXRob24yLjcvbXV0ZXgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYzc0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211dGV4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211dGV4LnB5byBiL2xpYi9weXRob24yLjcvbXV0ZXgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYzc0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211dGV4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L25ldHJjLnB5IGIvbGliL3B5dGhvbjIuNy9uZXRyYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmQzN2UzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9uZXRyYy5weQpAQCAtMCwwICsxLDEyMiBAQAorIiIiQW4gb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZSB0byAubmV0cmMgZmlsZXMuIiIiCisKKyMgTW9kdWxlIGFuZCBkb2N1bWVudGF0aW9uIGJ5IEVyaWMgUy4gUmF5bW9uZCwgMjEgRGVjIDE5OTgKKworaW1wb3J0IG9zLCBzaGxleAorCitfX2FsbF9fID0gWyJuZXRyYyIsICJOZXRyY1BhcnNlRXJyb3IiXQorCisKK2NsYXNzIE5ldHJjUGFyc2VFcnJvcihFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgb24gc3ludGF4IGVycm9ycyBpbiB0aGUgLm5ldHJjIGZpbGUuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgZmlsZW5hbWU9Tm9uZSwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKyAgICAgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1zZykKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzICglcywgbGluZSAlcykiICUgKHNlbGYubXNnLCBzZWxmLmZpbGVuYW1lLCBzZWxmLmxpbmVubykKKworCitjbGFzcyBuZXRyYzoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZT1Ob25lKToKKyAgICAgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MuZW52aXJvblsnSE9NRSddLCAiLm5ldHJjIikKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJDb3VsZCBub3QgZmluZCAubmV0cmM6ICRIT01FIGlzIG5vdCBzZXQiKQorICAgICAgICBzZWxmLmhvc3RzID0ge30KKyAgICAgICAgc2VsZi5tYWNyb3MgPSB7fQorICAgICAgICB3aXRoIG9wZW4oZmlsZSkgYXMgZnA6CisgICAgICAgICAgICBzZWxmLl9wYXJzZShmaWxlLCBmcCkKKworICAgIGRlZiBfcGFyc2Uoc2VsZiwgZmlsZSwgZnApOgorICAgICAgICBsZXhlciA9IHNobGV4LnNobGV4KGZwKQorICAgICAgICBsZXhlci53b3JkY2hhcnMgKz0gciIiIiEiIyQlJicoKSorLC0uLzo7PD0+P0BbXF1eX2B7fH1+IiIiCisgICAgICAgIGxleGVyLmNvbW1lbnRlcnMgPSBsZXhlci5jb21tZW50ZXJzLnJlcGxhY2UoJyMnLCAnJykKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICMgTG9vayBmb3IgYSBtYWNoaW5lLCBkZWZhdWx0LCBvciBtYWNkZWYgdG9wLWxldmVsIGtleXdvcmQKKyAgICAgICAgICAgIHRvcGxldmVsID0gdHQgPSBsZXhlci5nZXRfdG9rZW4oKQorICAgICAgICAgICAgaWYgbm90IHR0OgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIHR0WzBdID09ICcjJzoKKyAgICAgICAgICAgICAgICAjIHNlZWsgdG8gYmVnaW5uaW5nIG9mIGNvbW1lbnQsIGluIGNhc2UgcmVhZGluZyB0aGUgdG9rZW4gcHV0CisgICAgICAgICAgICAgICAgIyB1cyBvbiBhIG5ldyBsaW5lLCBhbmQgdGhlbiBza2lwIHRoZSByZXN0IG9mIHRoZSBsaW5lLgorICAgICAgICAgICAgICAgIHBvcyA9IGxlbih0dCkgKyAxCisgICAgICAgICAgICAgICAgbGV4ZXIuaW5zdHJlYW0uc2VlaygtcG9zLCAxKQorICAgICAgICAgICAgICAgIGxleGVyLmluc3RyZWFtLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiB0dCA9PSAnbWFjaGluZSc6CisgICAgICAgICAgICAgICAgZW50cnluYW1lID0gbGV4ZXIuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgIGVsaWYgdHQgPT0gJ2RlZmF1bHQnOgorICAgICAgICAgICAgICAgIGVudHJ5bmFtZSA9ICdkZWZhdWx0JworICAgICAgICAgICAgZWxpZiB0dCA9PSAnbWFjZGVmJzogICAgICAgICAgICAgICAgIyBKdXN0IHNraXAgdG8gZW5kIG9mIG1hY2RlZnMKKyAgICAgICAgICAgICAgICBlbnRyeW5hbWUgPSBsZXhlci5nZXRfdG9rZW4oKQorICAgICAgICAgICAgICAgIHNlbGYubWFjcm9zW2VudHJ5bmFtZV0gPSBbXQorICAgICAgICAgICAgICAgIGxleGVyLndoaXRlc3BhY2UgPSAnIFx0JworICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsZXhlci5pbnN0cmVhbS5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lIG9yIGxpbmUgPT0gJ1wwMTInOgorICAgICAgICAgICAgICAgICAgICAgICAgbGV4ZXIud2hpdGVzcGFjZSA9ICcgXHRcclxuJworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tYWNyb3NbZW50cnluYW1lXS5hcHBlbmQobGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBOZXRyY1BhcnNlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJiYWQgdG9wbGV2ZWwgdG9rZW4gJXIiICUgdHQsIGZpbGUsIGxleGVyLmxpbmVubykKKworICAgICAgICAgICAgIyBXZSdyZSBsb29raW5nIGF0IHN0YXJ0IG9mIGFuIGVudHJ5IGZvciBhIG5hbWVkIG1hY2hpbmUgb3IgZGVmYXVsdC4KKyAgICAgICAgICAgIGxvZ2luID0gJycKKyAgICAgICAgICAgIGFjY291bnQgPSBwYXNzd29yZCA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuaG9zdHNbZW50cnluYW1lXSA9IHt9CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHR0ID0gbGV4ZXIuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgICAgICBpZiAodHQuc3RhcnRzd2l0aCgnIycpIG9yCisgICAgICAgICAgICAgICAgICAgIHR0IGluIHsnJywgJ21hY2hpbmUnLCAnZGVmYXVsdCcsICdtYWNkZWYnfSk6CisgICAgICAgICAgICAgICAgICAgIGlmIHBhc3N3b3JkOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ob3N0c1tlbnRyeW5hbWVdID0gKGxvZ2luLCBhY2NvdW50LCBwYXNzd29yZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxleGVyLnB1c2hfdG9rZW4odHQpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTmV0cmNQYXJzZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWxmb3JtZWQgJXMgZW50cnkgJXMgdGVybWluYXRlZCBieSAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh0b3BsZXZlbCwgZW50cnluYW1lLCByZXByKHR0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgbGV4ZXIubGluZW5vKQorICAgICAgICAgICAgICAgIGVsaWYgdHQgPT0gJ2xvZ2luJyBvciB0dCA9PSAndXNlcic6CisgICAgICAgICAgICAgICAgICAgIGxvZ2luID0gbGV4ZXIuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgICAgICBlbGlmIHR0ID09ICdhY2NvdW50JzoKKyAgICAgICAgICAgICAgICAgICAgYWNjb3VudCA9IGxleGVyLmdldF90b2tlbigpCisgICAgICAgICAgICAgICAgZWxpZiB0dCA9PSAncGFzc3dvcmQnOgorICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCA9IGxleGVyLmdldF90b2tlbigpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTmV0cmNQYXJzZUVycm9yKCJiYWQgZm9sbG93ZXIgdG9rZW4gJXIiICUgdHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBsZXhlci5saW5lbm8pCisKKyAgICBkZWYgYXV0aGVudGljYXRvcnMoc2VsZiwgaG9zdCk6CisgICAgICAgICIiIlJldHVybiBhICh1c2VyLCBhY2NvdW50LCBwYXNzd29yZCkgdHVwbGUgZm9yIGdpdmVuIGhvc3QuIiIiCisgICAgICAgIGlmIGhvc3QgaW4gc2VsZi5ob3N0czoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmhvc3RzW2hvc3RdCisgICAgICAgIGVsaWYgJ2RlZmF1bHQnIGluIHNlbGYuaG9zdHM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5ob3N0c1snZGVmYXVsdCddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAiIiJEdW1wIHRoZSBjbGFzcyBkYXRhIGluIHRoZSBmb3JtYXQgb2YgYSAubmV0cmMgZmlsZS4iIiIKKyAgICAgICAgcmVwID0gIiIKKyAgICAgICAgZm9yIGhvc3QgaW4gc2VsZi5ob3N0cy5rZXlzKCk6CisgICAgICAgICAgICBhdHRycyA9IHNlbGYuaG9zdHNbaG9zdF0KKyAgICAgICAgICAgIHJlcCA9IHJlcCArICJtYWNoaW5lICIrIGhvc3QgKyAiXG5cdGxvZ2luICIgKyByZXByKGF0dHJzWzBdKSArICJcbiIKKyAgICAgICAgICAgIGlmIGF0dHJzWzFdOgorICAgICAgICAgICAgICAgIHJlcCA9IHJlcCArICJhY2NvdW50ICIgKyByZXByKGF0dHJzWzFdKQorICAgICAgICAgICAgcmVwID0gcmVwICsgIlx0cGFzc3dvcmQgIiArIHJlcHIoYXR0cnNbMl0pICsgIlxuIgorICAgICAgICBmb3IgbWFjcm8gaW4gc2VsZi5tYWNyb3Mua2V5cygpOgorICAgICAgICAgICAgcmVwID0gcmVwICsgIm1hY2RlZiAiICsgbWFjcm8gKyAiXG4iCisgICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLm1hY3Jvc1ttYWNyb106CisgICAgICAgICAgICAgICAgcmVwID0gcmVwICsgbGluZQorICAgICAgICAgICAgcmVwID0gcmVwICsgIlxuIgorICAgICAgICByZXR1cm4gcmVwCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcHJpbnQgbmV0cmMoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9uZXRyYy5weWMgYi9saWIvcHl0aG9uMi43L25ldHJjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmE1MGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9uZXRyYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9uZXRyYy5weW8gYi9saWIvcHl0aG9uMi43L25ldHJjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmE1MGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9uZXRyYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9uZXcucHkgYi9saWIvcHl0aG9uMi43L25ldy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTZlNjMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9uZXcucHkKQEAgLTAsMCArMSwxNyBAQAorIiIiQ3JlYXRlIG5ldyBvYmplY3RzIG9mIHZhcmlvdXMgdHlwZXMuICBEZXByZWNhdGVkLgorCitUaGlzIG1vZHVsZSBpcyBubyBsb25nZXIgcmVxdWlyZWQgZXhjZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorT2JqZWN0cyBvZiBtb3N0IHR5cGVzIGNhbiBub3cgYmUgY3JlYXRlZCBieSBjYWxsaW5nIHRoZSB0eXBlIG9iamVjdC4KKyIiIgorZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJUaGUgJ25ldycgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMDsgdXNlIHRoZSAndHlwZXMnICIKKyAgICAgICAgICAgICJtb2R1bGUgaW5zdGVhZC4iLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworZnJvbSB0eXBlcyBpbXBvcnQgQ2xhc3NUeXBlIGFzIGNsYXNzb2JqCitmcm9tIHR5cGVzIGltcG9ydCBGdW5jdGlvblR5cGUgYXMgZnVuY3Rpb24KK2Zyb20gdHlwZXMgaW1wb3J0IEluc3RhbmNlVHlwZSBhcyBpbnN0YW5jZQorZnJvbSB0eXBlcyBpbXBvcnQgTWV0aG9kVHlwZSBhcyBpbnN0YW5jZW1ldGhvZAorZnJvbSB0eXBlcyBpbXBvcnQgTW9kdWxlVHlwZSBhcyBtb2R1bGUKKworZnJvbSB0eXBlcyBpbXBvcnQgQ29kZVR5cGUgYXMgY29kZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9uZXcucHljIGIvbGliL3B5dGhvbjIuNy9uZXcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZGIyY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L25ldy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9uZXcucHlvIGIvbGliL3B5dGhvbjIuNy9uZXcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZGIyY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L25ldy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ubnRwbGliLnB5IGIvbGliL3B5dGhvbjIuNy9ubnRwbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzgyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L25udHBsaWIucHkKQEAgLTAsMCArMSw2MjcgQEAKKyIiIkFuIE5OVFAgY2xpZW50IGNsYXNzIGJhc2VkIG9uIFJGQyA5Nzc6IE5ldHdvcmsgTmV3cyBUcmFuc2ZlciBQcm90b2NvbC4KKworRXhhbXBsZToKKworPj4+IGZyb20gbm50cGxpYiBpbXBvcnQgTk5UUAorPj4+IHMgPSBOTlRQKCduZXdzJykKKz4+PiByZXNwLCBjb3VudCwgZmlyc3QsIGxhc3QsIG5hbWUgPSBzLmdyb3VwKCdjb21wLmxhbmcucHl0aG9uJykKKz4+PiBwcmludCAnR3JvdXAnLCBuYW1lLCAnaGFzJywgY291bnQsICdhcnRpY2xlcywgcmFuZ2UnLCBmaXJzdCwgJ3RvJywgbGFzdAorR3JvdXAgY29tcC5sYW5nLnB5dGhvbiBoYXMgNTEgYXJ0aWNsZXMsIHJhbmdlIDU3NzAgdG8gNTgyMQorPj4+IHJlc3AsIHN1YnMgPSBzLnhoZHIoJ3N1YmplY3QnLCBmaXJzdCArICctJyArIGxhc3QpCis+Pj4gcmVzcCA9IHMucXVpdCgpCis+Pj4KKworSGVyZSAncmVzcCcgaXMgdGhlIHNlcnZlciByZXNwb25zZSBsaW5lLgorRXJyb3IgcmVzcG9uc2VzIGFyZSB0dXJuZWQgaW50byBleGNlcHRpb25zLgorCitUbyBwb3N0IGFuIGFydGljbGUgZnJvbSBhIGZpbGU6Cis+Pj4gZiA9IG9wZW4oZmlsZW5hbWUsICdyJykgIyBmaWxlIGNvbnRhaW5pbmcgYXJ0aWNsZSwgaW5jbHVkaW5nIGhlYWRlcgorPj4+IHJlc3AgPSBzLnBvc3QoZikKKz4+PgorCitGb3IgZGVzY3JpcHRpb25zIG9mIGFsbCBtZXRob2RzLCByZWFkIHRoZSBjb21tZW50cyBpbiB0aGUgY29kZSBiZWxvdy4KK05vdGUgdGhhdCBhbGwgYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWVzIHJlcHJlc2VudGluZyBhcnRpY2xlIG51bWJlcnMKK2FyZSBzdHJpbmdzLCBub3QgbnVtYmVycywgc2luY2UgdGhleSBhcmUgcmFyZWx5IHVzZWQgZm9yIGNhbGN1bGF0aW9ucy4KKyIiIgorCisjIFJGQyA5NzcgYnkgQnJpYW4gS2FudG9yIGFuZCBQaGlsIExhcHNsZXkuCisjIHhvdmVyLCB4Z3RpdGxlLCB4cGF0aCwgZGF0ZSBtZXRob2RzIGJ5IEtldmFuIEhleWRvbgorCisKKyMgSW1wb3J0cworaW1wb3J0IHJlCitpbXBvcnQgc29ja2V0CisKK19fYWxsX18gPSBbIk5OVFAiLCJOTlRQUmVwbHlFcnJvciIsIk5OVFBUZW1wb3JhcnlFcnJvciIsCisgICAgICAgICAgICJOTlRQUGVybWFuZW50RXJyb3IiLCJOTlRQUHJvdG9jb2xFcnJvciIsIk5OVFBEYXRhRXJyb3IiLAorICAgICAgICAgICAiZXJyb3JfcmVwbHkiLCJlcnJvcl90ZW1wIiwiZXJyb3JfcGVybSIsImVycm9yX3Byb3RvIiwKKyAgICAgICAgICAgImVycm9yX2RhdGEiLF0KKworIyBFeGNlcHRpb25zIHJhaXNlZCB3aGVuIGFuIGVycm9yIG9yIGludmFsaWQgcmVzcG9uc2UgaXMgcmVjZWl2ZWQKK2NsYXNzIE5OVFBFcnJvcihFeGNlcHRpb24pOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGFsbCBubnRwbGliIGV4Y2VwdGlvbnMiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucmVzcG9uc2UgPSBhcmdzWzBdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgc2VsZi5yZXNwb25zZSA9ICdObyByZXNwb25zZSBnaXZlbicKKworY2xhc3MgTk5UUFJlcGx5RXJyb3IoTk5UUEVycm9yKToKKyAgICAiIiJVbmV4cGVjdGVkIFsxMjNdeHggcmVwbHkiIiIKKyAgICBwYXNzCisKK2NsYXNzIE5OVFBUZW1wb3JhcnlFcnJvcihOTlRQRXJyb3IpOgorICAgICIiIjR4eCBlcnJvcnMiIiIKKyAgICBwYXNzCisKK2NsYXNzIE5OVFBQZXJtYW5lbnRFcnJvcihOTlRQRXJyb3IpOgorICAgICIiIjV4eCBlcnJvcnMiIiIKKyAgICBwYXNzCisKK2NsYXNzIE5OVFBQcm90b2NvbEVycm9yKE5OVFBFcnJvcik6CisgICAgIiIiUmVzcG9uc2UgZG9lcyBub3QgYmVnaW4gd2l0aCBbMS01XSIiIgorICAgIHBhc3MKKworY2xhc3MgTk5UUERhdGFFcnJvcihOTlRQRXJyb3IpOgorICAgICIiIkVycm9yIGluIHJlc3BvbnNlIGRhdGEiIiIKKyAgICBwYXNzCisKKyMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CitlcnJvcl9yZXBseSA9IE5OVFBSZXBseUVycm9yCitlcnJvcl90ZW1wID0gTk5UUFRlbXBvcmFyeUVycm9yCitlcnJvcl9wZXJtID0gTk5UUFBlcm1hbmVudEVycm9yCitlcnJvcl9wcm90byA9IE5OVFBQcm90b2NvbEVycm9yCitlcnJvcl9kYXRhID0gTk5UUERhdGFFcnJvcgorCisKKworIyBTdGFuZGFyZCBwb3J0IHVzZWQgYnkgTk5UUCBzZXJ2ZXJzCitOTlRQX1BPUlQgPSAxMTkKKworCisjIFJlc3BvbnNlIG51bWJlcnMgdGhhdCBhcmUgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCB0ZXh0IChlLmcuIGFydGljbGUpCitMT05HUkVTUCA9IFsnMTAwJywgJzIxNScsICcyMjAnLCAnMjIxJywgJzIyMicsICcyMjQnLCAnMjMwJywgJzIzMScsICcyODInXQorCisKKyMgTGluZSB0ZXJtaW5hdG9ycyAod2UgYWx3YXlzIG91dHB1dCBDUkxGLCBidXQgYWNjZXB0IGFueSBvZiBDUkxGLCBDUiwgTEYpCitDUkxGID0gJ1xyXG4nCisKKworCisjIFRoZSBjbGFzcyBpdHNlbGYKK2NsYXNzIE5OVFA6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQ9Tk5UUF9QT1JULCB1c2VyPU5vbmUsIHBhc3N3b3JkPU5vbmUsCisgICAgICAgICAgICAgICAgIHJlYWRlcm1vZGU9Tm9uZSwgdXNlbmV0cmM9VHJ1ZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYW4gaW5zdGFuY2UuICBBcmd1bWVudHM6CisgICAgICAgIC0gaG9zdDogaG9zdG5hbWUgdG8gY29ubmVjdCB0bworICAgICAgICAtIHBvcnQ6IHBvcnQgdG8gY29ubmVjdCB0byAoZGVmYXVsdCB0aGUgc3RhbmRhcmQgTk5UUCBwb3J0KQorICAgICAgICAtIHVzZXI6IHVzZXJuYW1lIHRvIGF1dGhlbnRpY2F0ZSB3aXRoCisgICAgICAgIC0gcGFzc3dvcmQ6IHBhc3N3b3JkIHRvIHVzZSB3aXRoIHVzZXJuYW1lCisgICAgICAgIC0gcmVhZGVybW9kZTogaWYgdHJ1ZSwgc2VuZCAnbW9kZSByZWFkZXInIGNvbW1hbmQgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW5nLgorCisgICAgICAgIHJlYWRlcm1vZGUgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSBpZiB5b3UgYXJlIGNvbm5lY3RpbmcgdG8gYW4KKyAgICAgICAgTk5UUCBzZXJ2ZXIgb24gdGhlIGxvY2FsIG1hY2hpbmUgYW5kIGludGVuZCB0byBjYWxsCisgICAgICAgIHJlYWRlci1zcGVjaWZpYyBjb21tYW5kcywgc3VjaCBhcyBgZ3JvdXAnLiAgSWYgeW91IGdldAorICAgICAgICB1bmV4cGVjdGVkIE5OVFBQZXJtYW5lbnRFcnJvcnMsIHlvdSBtaWdodCBuZWVkIHRvIHNldAorICAgICAgICByZWFkZXJtb2RlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoaG9zdCwgcG9ydCkpCisgICAgICAgIHNlbGYuZmlsZSA9IHNlbGYuc29jay5tYWtlZmlsZSgncmInKQorICAgICAgICBzZWxmLmRlYnVnZ2luZyA9IDAKKyAgICAgICAgc2VsZi53ZWxjb21lID0gc2VsZi5nZXRyZXNwKCkKKworICAgICAgICAjICdtb2RlIHJlYWRlcicgaXMgc29tZXRpbWVzIG5lY2Vzc2FyeSB0byBlbmFibGUgJ3JlYWRlcicgbW9kZS4KKyAgICAgICAgIyBIb3dldmVyLCB0aGUgb3JkZXIgaW4gd2hpY2ggJ21vZGUgcmVhZGVyJyBhbmQgJ2F1dGhpbmZvJyBuZWVkIHRvCisgICAgICAgICMgYXJyaXZlIGRpZmZlcnMgYmV0d2VlbiBzb21lIE5OVFAgc2VydmVycy4gVHJ5IHRvIHNlbmQKKyAgICAgICAgIyAnbW9kZSByZWFkZXInLCBhbmQgaWYgaXQgZmFpbHMgd2l0aCBhbiBhdXRob3JpemF0aW9uIGZhaWxlZAorICAgICAgICAjIGVycm9yLCB0cnkgYWdhaW4gYWZ0ZXIgc2VuZGluZyBhdXRoaW5mby4KKyAgICAgICAgcmVhZGVybW9kZV9hZnRlcmF1dGggPSAwCisgICAgICAgIGlmIHJlYWRlcm1vZGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi53ZWxjb21lID0gc2VsZi5zaG9ydGNtZCgnbW9kZSByZWFkZXInKQorICAgICAgICAgICAgZXhjZXB0IE5OVFBQZXJtYW5lbnRFcnJvcjoKKyAgICAgICAgICAgICAgICAjIGVycm9yIDUwMCwgcHJvYmFibHkgJ25vdCBpbXBsZW1lbnRlZCcKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgTk5UUFRlbXBvcmFyeUVycm9yLCBlOgorICAgICAgICAgICAgICAgIGlmIHVzZXIgYW5kIGUucmVzcG9uc2VbOjNdID09ICc0ODAnOgorICAgICAgICAgICAgICAgICAgICAjIE5lZWQgYXV0aG9yaXphdGlvbiBiZWZvcmUgJ21vZGUgcmVhZGVyJworICAgICAgICAgICAgICAgICAgICByZWFkZXJtb2RlX2FmdGVyYXV0aCA9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAjIElmIG5vIGxvZ2luL3Bhc3N3b3JkIHdhcyBzcGVjaWZpZWQsIHRyeSB0byBnZXQgdGhlbSBmcm9tIH4vLm5ldHJjCisgICAgICAgICMgUHJlc3VtZSB0aGF0IGlmIC5uZXRjIGhhcyBhbiBlbnRyeSwgTk5SUCBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgdXNlbmV0cmMgYW5kIG5vdCB1c2VyOgorICAgICAgICAgICAgICAgIGltcG9ydCBuZXRyYworICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gbmV0cmMubmV0cmMoKQorICAgICAgICAgICAgICAgIGF1dGggPSBjcmVkZW50aWFscy5hdXRoZW50aWNhdG9ycyhob3N0KQorICAgICAgICAgICAgICAgIGlmIGF1dGg6CisgICAgICAgICAgICAgICAgICAgIHVzZXIgPSBhdXRoWzBdCisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkID0gYXV0aFsyXQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBQZXJmb3JtIE5OUlAgYXV0aGVudGljYXRpb24gaWYgbmVlZGVkLgorICAgICAgICBpZiB1c2VyOgorICAgICAgICAgICAgcmVzcCA9IHNlbGYuc2hvcnRjbWQoJ2F1dGhpbmZvIHVzZXIgJyt1c2VyKQorICAgICAgICAgICAgaWYgcmVzcFs6M10gPT0gJzM4MSc6CisgICAgICAgICAgICAgICAgaWYgbm90IHBhc3N3b3JkOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBOTlRQUmVwbHlFcnJvcihyZXNwKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlc3AgPSBzZWxmLnNob3J0Y21kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhdXRoaW5mbyBwYXNzICcrcGFzc3dvcmQpCisgICAgICAgICAgICAgICAgICAgIGlmIHJlc3BbOjNdICE9ICcyODEnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgTk5UUFBlcm1hbmVudEVycm9yKHJlc3ApCisgICAgICAgICAgICBpZiByZWFkZXJtb2RlX2FmdGVyYXV0aDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud2VsY29tZSA9IHNlbGYuc2hvcnRjbWQoJ21vZGUgcmVhZGVyJykKKyAgICAgICAgICAgICAgICBleGNlcHQgTk5UUFBlcm1hbmVudEVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIGVycm9yIDUwMCwgcHJvYmFibHkgJ25vdCBpbXBsZW1lbnRlZCcKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisKKyAgICAjIEdldCB0aGUgd2VsY29tZSBtZXNzYWdlIGZyb20gdGhlIHNlcnZlcgorICAgICMgKHRoaXMgaXMgcmVhZCBhbmQgc3F1aXJyZWxlZCBhd2F5IGJ5IF9faW5pdF9fKCkpLgorICAgICMgSWYgdGhlIHJlc3BvbnNlIGNvZGUgaXMgMjAwLCBwb3N0aW5nIGlzIGFsbG93ZWQ7CisgICAgIyBpZiBpdCAyMDEsIHBvc3RpbmcgaXMgbm90IGFsbG93ZWQKKworICAgIGRlZiBnZXR3ZWxjb21lKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIHdlbGNvbWUgbWVzc2FnZSBmcm9tIHRoZSBzZXJ2ZXIKKyAgICAgICAgKHRoaXMgaXMgcmVhZCBhbmQgc3F1aXJyZWxlZCBhd2F5IGJ5IF9faW5pdF9fKCkpLgorICAgICAgICBJZiB0aGUgcmVzcG9uc2UgY29kZSBpcyAyMDAsIHBvc3RpbmcgaXMgYWxsb3dlZDsKKyAgICAgICAgaWYgaXQgMjAxLCBwb3N0aW5nIGlzIG5vdCBhbGxvd2VkLiIiIgorCisgICAgICAgIGlmIHNlbGYuZGVidWdnaW5nOiBwcmludCAnKndlbGNvbWUqJywgcmVwcihzZWxmLndlbGNvbWUpCisgICAgICAgIHJldHVybiBzZWxmLndlbGNvbWUKKworICAgIGRlZiBzZXRfZGVidWdsZXZlbChzZWxmLCBsZXZlbCk6CisgICAgICAgICIiIlNldCB0aGUgZGVidWdnaW5nIGxldmVsLiAgQXJndW1lbnQgJ2xldmVsJyBtZWFuczoKKyAgICAgICAgMDogbm8gZGVidWdnaW5nIG91dHB1dCAoZGVmYXVsdCkKKyAgICAgICAgMTogcHJpbnQgY29tbWFuZHMgYW5kIHJlc3BvbnNlcyBidXQgbm90IGJvZHkgdGV4dCBldGMuCisgICAgICAgIDI6IGFsc28gcHJpbnQgcmF3IGxpbmVzIHJlYWQgYW5kIHNlbnQgYmVmb3JlIHN0cmlwcGluZyBDUi9MRiIiIgorCisgICAgICAgIHNlbGYuZGVidWdnaW5nID0gbGV2ZWwKKyAgICBkZWJ1ZyA9IHNldF9kZWJ1Z2xldmVsCisKKyAgICBkZWYgcHV0bGluZShzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHNlbmQgb25lIGxpbmUgdG8gdGhlIHNlcnZlciwgYXBwZW5kaW5nIENSTEYuIiIiCisgICAgICAgIGxpbmUgPSBsaW5lICsgQ1JMRgorICAgICAgICBpZiBzZWxmLmRlYnVnZ2luZyA+IDE6IHByaW50ICcqcHV0KicsIHJlcHIobGluZSkKKyAgICAgICAgc2VsZi5zb2NrLnNlbmRhbGwobGluZSkKKworICAgIGRlZiBwdXRjbWQoc2VsZiwgbGluZSk6CisgICAgICAgICIiIkludGVybmFsOiBzZW5kIG9uZSBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgKHRocm91Z2ggcHV0bGluZSgpKS4iIiIKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2dpbmc6IHByaW50ICcqY21kKicsIHJlcHIobGluZSkKKyAgICAgICAgc2VsZi5wdXRsaW5lKGxpbmUpCisKKyAgICBkZWYgZ2V0bGluZShzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHJldHVybiBvbmUgbGluZSBmcm9tIHRoZSBzZXJ2ZXIsIHN0cmlwcGluZyBDUkxGLgorICAgICAgICBSYWlzZSBFT0ZFcnJvciBpZiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuIiIiCisgICAgICAgIGxpbmUgPSBzZWxmLmZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBzZWxmLmRlYnVnZ2luZyA+IDE6CisgICAgICAgICAgICBwcmludCAnKmdldConLCByZXByKGxpbmUpCisgICAgICAgIGlmIG5vdCBsaW5lOiByYWlzZSBFT0ZFcnJvcgorICAgICAgICBpZiBsaW5lWy0yOl0gPT0gQ1JMRjogbGluZSA9IGxpbmVbOi0yXQorICAgICAgICBlbGlmIGxpbmVbLTE6XSBpbiBDUkxGOiBsaW5lID0gbGluZVs6LTFdCisgICAgICAgIHJldHVybiBsaW5lCisKKyAgICBkZWYgZ2V0cmVzcChzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IGdldCBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4KKyAgICAgICAgUmFpc2UgdmFyaW91cyBlcnJvcnMgaWYgdGhlIHJlc3BvbnNlIGluZGljYXRlcyBhbiBlcnJvci4iIiIKKyAgICAgICAgcmVzcCA9IHNlbGYuZ2V0bGluZSgpCisgICAgICAgIGlmIHNlbGYuZGVidWdnaW5nOiBwcmludCAnKnJlc3AqJywgcmVwcihyZXNwKQorICAgICAgICBjID0gcmVzcFs6MV0KKyAgICAgICAgaWYgYyA9PSAnNCc6CisgICAgICAgICAgICByYWlzZSBOTlRQVGVtcG9yYXJ5RXJyb3IocmVzcCkKKyAgICAgICAgaWYgYyA9PSAnNSc6CisgICAgICAgICAgICByYWlzZSBOTlRQUGVybWFuZW50RXJyb3IocmVzcCkKKyAgICAgICAgaWYgYyBub3QgaW4gJzEyMyc6CisgICAgICAgICAgICByYWlzZSBOTlRQUHJvdG9jb2xFcnJvcihyZXNwKQorICAgICAgICByZXR1cm4gcmVzcAorCisgICAgZGVmIGdldGxvbmdyZXNwKHNlbGYsIGZpbGU9Tm9uZSk6CisgICAgICAgICIiIkludGVybmFsOiBnZXQgYSByZXNwb25zZSBwbHVzIGZvbGxvd2luZyB0ZXh0IGZyb20gdGhlIHNlcnZlci4KKyAgICAgICAgUmFpc2UgdmFyaW91cyBlcnJvcnMgaWYgdGhlIHJlc3BvbnNlIGluZGljYXRlcyBhbiBlcnJvci4iIiIKKworICAgICAgICBvcGVuZWRGaWxlID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIElmIGEgc3RyaW5nIHdhcyBwYXNzZWQgdGhlbiBvcGVuIGEgZmlsZSB3aXRoIHRoYXQgbmFtZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlLCBzdHIpOgorICAgICAgICAgICAgICAgIG9wZW5lZEZpbGUgPSBmaWxlID0gb3BlbihmaWxlLCAidyIpCisKKyAgICAgICAgICAgIHJlc3AgPSBzZWxmLmdldHJlc3AoKQorICAgICAgICAgICAgaWYgcmVzcFs6M10gbm90IGluIExPTkdSRVNQOgorICAgICAgICAgICAgICAgIHJhaXNlIE5OVFBSZXBseUVycm9yKHJlc3ApCisgICAgICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuZ2V0bGluZSgpCisgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnLic6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgbGluZVs6Ml0gPT0gJy4uJzoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMTpdCisgICAgICAgICAgICAgICAgaWYgZmlsZToKKyAgICAgICAgICAgICAgICAgICAgZmlsZS53cml0ZShsaW5lICsgIlxuIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChsaW5lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgIyBJZiB0aGlzIG1ldGhvZCBjcmVhdGVkIHRoZSBmaWxlLCB0aGVuIGl0IG11c3QgY2xvc2UgaXQKKyAgICAgICAgICAgIGlmIG9wZW5lZEZpbGU6CisgICAgICAgICAgICAgICAgb3BlbmVkRmlsZS5jbG9zZSgpCisKKyAgICAgICAgcmV0dXJuIHJlc3AsIGxpc3QKKworICAgIGRlZiBzaG9ydGNtZChzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHNlbmQgYSBjb21tYW5kIGFuZCBnZXQgdGhlIHJlc3BvbnNlLiIiIgorICAgICAgICBzZWxmLnB1dGNtZChsaW5lKQorICAgICAgICByZXR1cm4gc2VsZi5nZXRyZXNwKCkKKworICAgIGRlZiBsb25nY21kKHNlbGYsIGxpbmUsIGZpbGU9Tm9uZSk6CisgICAgICAgICIiIkludGVybmFsOiBzZW5kIGEgY29tbWFuZCBhbmQgZ2V0IHRoZSByZXNwb25zZSBwbHVzIGZvbGxvd2luZyB0ZXh0LiIiIgorICAgICAgICBzZWxmLnB1dGNtZChsaW5lKQorICAgICAgICByZXR1cm4gc2VsZi5nZXRsb25ncmVzcChmaWxlKQorCisgICAgZGVmIG5ld2dyb3VwcyhzZWxmLCBkYXRlLCB0aW1lLCBmaWxlPU5vbmUpOgorICAgICAgICAiIiJQcm9jZXNzIGEgTkVXR1JPVVBTIGNvbW1hbmQuICBBcmd1bWVudHM6CisgICAgICAgIC0gZGF0ZTogc3RyaW5nICd5eW1tZGQnIGluZGljYXRpbmcgdGhlIGRhdGUKKyAgICAgICAgLSB0aW1lOiBzdHJpbmcgJ2hobW1zcycgaW5kaWNhdGluZyB0aGUgdGltZQorICAgICAgICBSZXR1cm46CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgLSBsaXN0OiBsaXN0IG9mIG5ld3Nncm91cCBuYW1lcyIiIgorCisgICAgICAgIHJldHVybiBzZWxmLmxvbmdjbWQoJ05FV0dST1VQUyAnICsgZGF0ZSArICcgJyArIHRpbWUsIGZpbGUpCisKKyAgICBkZWYgbmV3bmV3cyhzZWxmLCBncm91cCwgZGF0ZSwgdGltZSwgZmlsZT1Ob25lKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIE5FV05FV1MgY29tbWFuZC4gIEFyZ3VtZW50czoKKyAgICAgICAgLSBncm91cDogZ3JvdXAgbmFtZSBvciAnKicKKyAgICAgICAgLSBkYXRlOiBzdHJpbmcgJ3l5bW1kZCcgaW5kaWNhdGluZyB0aGUgZGF0ZQorICAgICAgICAtIHRpbWU6IHN0cmluZyAnaGhtbXNzJyBpbmRpY2F0aW5nIHRoZSB0aW1lCisgICAgICAgIFJldHVybjoKKyAgICAgICAgLSByZXNwOiBzZXJ2ZXIgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bAorICAgICAgICAtIGxpc3Q6IGxpc3Qgb2YgbWVzc2FnZSBpZHMiIiIKKworICAgICAgICBjbWQgPSAnTkVXTkVXUyAnICsgZ3JvdXAgKyAnICcgKyBkYXRlICsgJyAnICsgdGltZQorICAgICAgICByZXR1cm4gc2VsZi5sb25nY21kKGNtZCwgZmlsZSkKKworICAgIGRlZiBsaXN0KHNlbGYsIGZpbGU9Tm9uZSk6CisgICAgICAgICIiIlByb2Nlc3MgYSBMSVNUIGNvbW1hbmQuICBSZXR1cm46CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgLSBsaXN0OiBsaXN0IG9mIChncm91cCwgbGFzdCwgZmlyc3QsIGZsYWcpIChzdHJpbmdzKSIiIgorCisgICAgICAgIHJlc3AsIGxpc3QgPSBzZWxmLmxvbmdjbWQoJ0xJU1QnLCBmaWxlKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obGlzdCkpOgorICAgICAgICAgICAgIyBQYXJzZSBsaW5lcyBpbnRvICJncm91cCBsYXN0IGZpcnN0IGZsYWciCisgICAgICAgICAgICBsaXN0W2ldID0gdHVwbGUobGlzdFtpXS5zcGxpdCgpKQorICAgICAgICByZXR1cm4gcmVzcCwgbGlzdAorCisgICAgZGVmIGRlc2NyaXB0aW9uKHNlbGYsIGdyb3VwKToKKworICAgICAgICAiIiJHZXQgYSBkZXNjcmlwdGlvbiBmb3IgYSBzaW5nbGUgZ3JvdXAuICBJZiBtb3JlIHRoYW4gb25lCisgICAgICAgIGdyb3VwIG1hdGNoZXMgKCdncm91cCcgaXMgYSBwYXR0ZXJuKSwgcmV0dXJuIHRoZSBmaXJzdC4gIElmIG5vCisgICAgICAgIGdyb3VwIG1hdGNoZXMsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcuCisKKyAgICAgICAgVGhpcyBlbGlkZXMgdGhlIHJlc3BvbnNlIGNvZGUgZnJvbSB0aGUgc2VydmVyLCBzaW5jZSBpdCBjYW4KKyAgICAgICAgb25seSBiZSAnMjE1JyBvciAnMjg1JyAoZm9yIHhndGl0bGUpIGFueXdheS4gIElmIHRoZSByZXNwb25zZQorICAgICAgICBjb2RlIGlzIG5lZWRlZCwgdXNlIHRoZSAnZGVzY3JpcHRpb25zJyBtZXRob2QuCisKKyAgICAgICAgTk9URTogVGhpcyBuZWl0aGVyIGNoZWNrcyBmb3IgYSB3aWxkY2FyZCBpbiAnZ3JvdXAnIG5vciBkb2VzCisgICAgICAgIGl0IGNoZWNrIHdoZXRoZXIgdGhlIGdyb3VwIGFjdHVhbGx5IGV4aXN0cy4iIiIKKworICAgICAgICByZXNwLCBsaW5lcyA9IHNlbGYuZGVzY3JpcHRpb25zKGdyb3VwKQorICAgICAgICBpZiBsZW4obGluZXMpID09IDA6CisgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBsaW5lc1swXVsxXQorCisgICAgZGVmIGRlc2NyaXB0aW9ucyhzZWxmLCBncm91cF9wYXR0ZXJuKToKKyAgICAgICAgIiIiR2V0IGRlc2NyaXB0aW9ucyBmb3IgYSByYW5nZSBvZiBncm91cHMuIiIiCisgICAgICAgIGxpbmVfcGF0ID0gcmUuY29tcGlsZSgiXig/UDxncm91cD5bXiBcdF0rKVsgXHRdKyguKikkIikKKyAgICAgICAgIyBUcnkgdGhlIG1vcmUgc3RkIChhY2MuIHRvIFJGQzI5ODApIExJU1QgTkVXU0dST1VQUyBmaXJzdAorICAgICAgICByZXNwLCByYXdfbGluZXMgPSBzZWxmLmxvbmdjbWQoJ0xJU1QgTkVXU0dST1VQUyAnICsgZ3JvdXBfcGF0dGVybikKKyAgICAgICAgaWYgcmVzcFs6M10gIT0gIjIxNSI6CisgICAgICAgICAgICAjIE5vdyB0aGUgZGVwcmVjYXRlZCBYR1RJVExFLiAgVGhpcyBlaXRoZXIgcmFpc2VzIGFuIGVycm9yCisgICAgICAgICAgICAjIG9yIHN1Y2NlZWRzIHdpdGggdGhlIHNhbWUgb3V0cHV0IHN0cnVjdHVyZSBhcyBMSVNUCisgICAgICAgICAgICAjIE5FV1NHUk9VUFMuCisgICAgICAgICAgICByZXNwLCByYXdfbGluZXMgPSBzZWxmLmxvbmdjbWQoJ1hHVElUTEUgJyArIGdyb3VwX3BhdHRlcm4pCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgZm9yIHJhd19saW5lIGluIHJhd19saW5lczoKKyAgICAgICAgICAgIG1hdGNoID0gbGluZV9wYXQuc2VhcmNoKHJhd19saW5lLnN0cmlwKCkpCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQobWF0Y2guZ3JvdXAoMSwgMikpCisgICAgICAgIHJldHVybiByZXNwLCBsaW5lcworCisgICAgZGVmIGdyb3VwKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJQcm9jZXNzIGEgR1JPVVAgY29tbWFuZC4gIEFyZ3VtZW50OgorICAgICAgICAtIGdyb3VwOiB0aGUgZ3JvdXAgbmFtZQorICAgICAgICBSZXR1cm5zOgorICAgICAgICAtIHJlc3A6IHNlcnZlciByZXNwb25zZSBpZiBzdWNjZXNzZnVsCisgICAgICAgIC0gY291bnQ6IG51bWJlciBvZiBhcnRpY2xlcyAoc3RyaW5nKQorICAgICAgICAtIGZpcnN0OiBmaXJzdCBhcnRpY2xlIG51bWJlciAoc3RyaW5nKQorICAgICAgICAtIGxhc3Q6IGxhc3QgYXJ0aWNsZSBudW1iZXIgKHN0cmluZykKKyAgICAgICAgLSBuYW1lOiB0aGUgZ3JvdXAgbmFtZSIiIgorCisgICAgICAgIHJlc3AgPSBzZWxmLnNob3J0Y21kKCdHUk9VUCAnICsgbmFtZSkKKyAgICAgICAgaWYgcmVzcFs6M10gIT0gJzIxMSc6CisgICAgICAgICAgICByYWlzZSBOTlRQUmVwbHlFcnJvcihyZXNwKQorICAgICAgICB3b3JkcyA9IHJlc3Auc3BsaXQoKQorICAgICAgICBjb3VudCA9IGZpcnN0ID0gbGFzdCA9IDAKKyAgICAgICAgbiA9IGxlbih3b3JkcykKKyAgICAgICAgaWYgbiA+IDE6CisgICAgICAgICAgICBjb3VudCA9IHdvcmRzWzFdCisgICAgICAgICAgICBpZiBuID4gMjoKKyAgICAgICAgICAgICAgICBmaXJzdCA9IHdvcmRzWzJdCisgICAgICAgICAgICAgICAgaWYgbiA+IDM6CisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSB3b3Jkc1szXQorICAgICAgICAgICAgICAgICAgICBpZiBuID4gNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB3b3Jkc1s0XS5sb3dlcigpCisgICAgICAgIHJldHVybiByZXNwLCBjb3VudCwgZmlyc3QsIGxhc3QsIG5hbWUKKworICAgIGRlZiBoZWxwKHNlbGYsIGZpbGU9Tm9uZSk6CisgICAgICAgICIiIlByb2Nlc3MgYSBIRUxQIGNvbW1hbmQuICBSZXR1cm5zOgorICAgICAgICAtIHJlc3A6IHNlcnZlciByZXNwb25zZSBpZiBzdWNjZXNzZnVsCisgICAgICAgIC0gbGlzdDogbGlzdCBvZiBzdHJpbmdzIiIiCisKKyAgICAgICAgcmV0dXJuIHNlbGYubG9uZ2NtZCgnSEVMUCcsZmlsZSkKKworICAgIGRlZiBzdGF0cGFyc2Uoc2VsZiwgcmVzcCk6CisgICAgICAgICIiIkludGVybmFsOiBwYXJzZSB0aGUgcmVzcG9uc2Ugb2YgYSBTVEFULCBORVhUIG9yIExBU1QgY29tbWFuZC4iIiIKKyAgICAgICAgaWYgcmVzcFs6Ml0gIT0gJzIyJzoKKyAgICAgICAgICAgIHJhaXNlIE5OVFBSZXBseUVycm9yKHJlc3ApCisgICAgICAgIHdvcmRzID0gcmVzcC5zcGxpdCgpCisgICAgICAgIG5yID0gMAorICAgICAgICBpZCA9ICcnCisgICAgICAgIG4gPSBsZW4od29yZHMpCisgICAgICAgIGlmIG4gPiAxOgorICAgICAgICAgICAgbnIgPSB3b3Jkc1sxXQorICAgICAgICAgICAgaWYgbiA+IDI6CisgICAgICAgICAgICAgICAgaWQgPSB3b3Jkc1syXQorICAgICAgICByZXR1cm4gcmVzcCwgbnIsIGlkCisKKyAgICBkZWYgc3RhdGNtZChzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHByb2Nlc3MgYSBTVEFULCBORVhUIG9yIExBU1QgY29tbWFuZC4iIiIKKyAgICAgICAgcmVzcCA9IHNlbGYuc2hvcnRjbWQobGluZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RhdHBhcnNlKHJlc3ApCisKKyAgICBkZWYgc3RhdChzZWxmLCBpZCk6CisgICAgICAgICIiIlByb2Nlc3MgYSBTVEFUIGNvbW1hbmQuICBBcmd1bWVudDoKKyAgICAgICAgLSBpZDogYXJ0aWNsZSBudW1iZXIgb3IgbWVzc2FnZSBpZAorICAgICAgICBSZXR1cm5zOgorICAgICAgICAtIHJlc3A6IHNlcnZlciByZXNwb25zZSBpZiBzdWNjZXNzZnVsCisgICAgICAgIC0gbnI6ICAgdGhlIGFydGljbGUgbnVtYmVyCisgICAgICAgIC0gaWQ6ICAgdGhlIG1lc3NhZ2UgaWQiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5zdGF0Y21kKCdTVEFUICcgKyBpZCkKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAiIiJQcm9jZXNzIGEgTkVYVCBjb21tYW5kLiAgTm8gYXJndW1lbnRzLiAgUmV0dXJuIGFzIGZvciBTVEFULiIiIgorICAgICAgICByZXR1cm4gc2VsZi5zdGF0Y21kKCdORVhUJykKKworICAgIGRlZiBsYXN0KHNlbGYpOgorICAgICAgICAiIiJQcm9jZXNzIGEgTEFTVCBjb21tYW5kLiAgTm8gYXJndW1lbnRzLiAgUmV0dXJuIGFzIGZvciBTVEFULiIiIgorICAgICAgICByZXR1cm4gc2VsZi5zdGF0Y21kKCdMQVNUJykKKworICAgIGRlZiBhcnRjbWQoc2VsZiwgbGluZSwgZmlsZT1Ob25lKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHByb2Nlc3MgYSBIRUFELCBCT0RZIG9yIEFSVElDTEUgY29tbWFuZC4iIiIKKyAgICAgICAgcmVzcCwgbGlzdCA9IHNlbGYubG9uZ2NtZChsaW5lLCBmaWxlKQorICAgICAgICByZXNwLCBuciwgaWQgPSBzZWxmLnN0YXRwYXJzZShyZXNwKQorICAgICAgICByZXR1cm4gcmVzcCwgbnIsIGlkLCBsaXN0CisKKyAgICBkZWYgaGVhZChzZWxmLCBpZCk6CisgICAgICAgICIiIlByb2Nlc3MgYSBIRUFEIGNvbW1hbmQuICBBcmd1bWVudDoKKyAgICAgICAgLSBpZDogYXJ0aWNsZSBudW1iZXIgb3IgbWVzc2FnZSBpZAorICAgICAgICBSZXR1cm5zOgorICAgICAgICAtIHJlc3A6IHNlcnZlciByZXNwb25zZSBpZiBzdWNjZXNzZnVsCisgICAgICAgIC0gbnI6IGFydGljbGUgbnVtYmVyCisgICAgICAgIC0gaWQ6IG1lc3NhZ2UgaWQKKyAgICAgICAgLSBsaXN0OiB0aGUgbGluZXMgb2YgdGhlIGFydGljbGUncyBoZWFkZXIiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5hcnRjbWQoJ0hFQUQgJyArIGlkKQorCisgICAgZGVmIGJvZHkoc2VsZiwgaWQsIGZpbGU9Tm9uZSk6CisgICAgICAgICIiIlByb2Nlc3MgYSBCT0RZIGNvbW1hbmQuICBBcmd1bWVudDoKKyAgICAgICAgLSBpZDogYXJ0aWNsZSBudW1iZXIgb3IgbWVzc2FnZSBpZAorICAgICAgICAtIGZpbGU6IEZpbGVuYW1lIHN0cmluZyBvciBmaWxlIG9iamVjdCB0byBzdG9yZSB0aGUgYXJ0aWNsZSBpbgorICAgICAgICBSZXR1cm5zOgorICAgICAgICAtIHJlc3A6IHNlcnZlciByZXNwb25zZSBpZiBzdWNjZXNzZnVsCisgICAgICAgIC0gbnI6IGFydGljbGUgbnVtYmVyCisgICAgICAgIC0gaWQ6IG1lc3NhZ2UgaWQKKyAgICAgICAgLSBsaXN0OiB0aGUgbGluZXMgb2YgdGhlIGFydGljbGUncyBib2R5IG9yIGFuIGVtcHR5IGxpc3QKKyAgICAgICAgICAgICAgICBpZiBmaWxlIHdhcyB1c2VkIiIiCisKKyAgICAgICAgcmV0dXJuIHNlbGYuYXJ0Y21kKCdCT0RZICcgKyBpZCwgZmlsZSkKKworICAgIGRlZiBhcnRpY2xlKHNlbGYsIGlkKToKKyAgICAgICAgIiIiUHJvY2VzcyBhbiBBUlRJQ0xFIGNvbW1hbmQuICBBcmd1bWVudDoKKyAgICAgICAgLSBpZDogYXJ0aWNsZSBudW1iZXIgb3IgbWVzc2FnZSBpZAorICAgICAgICBSZXR1cm5zOgorICAgICAgICAtIHJlc3A6IHNlcnZlciByZXNwb25zZSBpZiBzdWNjZXNzZnVsCisgICAgICAgIC0gbnI6IGFydGljbGUgbnVtYmVyCisgICAgICAgIC0gaWQ6IG1lc3NhZ2UgaWQKKyAgICAgICAgLSBsaXN0OiB0aGUgbGluZXMgb2YgdGhlIGFydGljbGUiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5hcnRjbWQoJ0FSVElDTEUgJyArIGlkKQorCisgICAgZGVmIHNsYXZlKHNlbGYpOgorICAgICAgICAiIiJQcm9jZXNzIGEgU0xBVkUgY29tbWFuZC4gIFJldHVybnM6CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5zaG9ydGNtZCgnU0xBVkUnKQorCisgICAgZGVmIHhoZHIoc2VsZiwgaGRyLCBzdHIsIGZpbGU9Tm9uZSk6CisgICAgICAgICIiIlByb2Nlc3MgYW4gWEhEUiBjb21tYW5kIChvcHRpb25hbCBzZXJ2ZXIgZXh0ZW5zaW9uKS4gIEFyZ3VtZW50czoKKyAgICAgICAgLSBoZHI6IHRoZSBoZWFkZXIgdHlwZSAoZS5nLiAnc3ViamVjdCcpCisgICAgICAgIC0gc3RyOiBhbiBhcnRpY2xlIG5yLCBhIG1lc3NhZ2UgaWQsIG9yIGEgcmFuZ2UgbnIxLW5yMgorICAgICAgICBSZXR1cm5zOgorICAgICAgICAtIHJlc3A6IHNlcnZlciByZXNwb25zZSBpZiBzdWNjZXNzZnVsCisgICAgICAgIC0gbGlzdDogbGlzdCBvZiAobnIsIHZhbHVlKSBzdHJpbmdzIiIiCisKKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZSgnXihbMC05XSspID8oLiopXG4/JykKKyAgICAgICAgcmVzcCwgbGluZXMgPSBzZWxmLmxvbmdjbWQoJ1hIRFIgJyArIGhkciArICcgJyArIHN0ciwgZmlsZSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSk6CisgICAgICAgICAgICBsaW5lID0gbGluZXNbaV0KKyAgICAgICAgICAgIG0gPSBwYXQubWF0Y2gobGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgbGluZXNbaV0gPSBtLmdyb3VwKDEsIDIpCisgICAgICAgIHJldHVybiByZXNwLCBsaW5lcworCisgICAgZGVmIHhvdmVyKHNlbGYsIHN0YXJ0LCBlbmQsIGZpbGU9Tm9uZSk6CisgICAgICAgICIiIlByb2Nlc3MgYW4gWE9WRVIgY29tbWFuZCAob3B0aW9uYWwgc2VydmVyIGV4dGVuc2lvbikgQXJndW1lbnRzOgorICAgICAgICAtIHN0YXJ0OiBzdGFydCBvZiByYW5nZQorICAgICAgICAtIGVuZDogZW5kIG9mIHJhbmdlCisgICAgICAgIFJldHVybnM6CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgLSBsaXN0OiBsaXN0IG9mIChhcnQtbnIsIHN1YmplY3QsIHBvc3RlciwgZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZCwgcmVmZXJlbmNlcywgc2l6ZSwgbGluZXMpIiIiCisKKyAgICAgICAgcmVzcCwgbGluZXMgPSBzZWxmLmxvbmdjbWQoJ1hPVkVSICcgKyBzdGFydCArICctJyArIGVuZCwgZmlsZSkKKyAgICAgICAgeG92ZXJfbGluZXMgPSBbXQorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIGVsZW0gPSBsaW5lLnNwbGl0KCJcdCIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeG92ZXJfbGluZXMuYXBwZW5kKChlbGVtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1bNV0uc3BsaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1bNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtWzddKSkKKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIE5OVFBEYXRhRXJyb3IobGluZSkKKyAgICAgICAgcmV0dXJuIHJlc3AseG92ZXJfbGluZXMKKworICAgIGRlZiB4Z3RpdGxlKHNlbGYsIGdyb3VwLCBmaWxlPU5vbmUpOgorICAgICAgICAiIiJQcm9jZXNzIGFuIFhHVElUTEUgY29tbWFuZCAob3B0aW9uYWwgc2VydmVyIGV4dGVuc2lvbikgQXJndW1lbnRzOgorICAgICAgICAtIGdyb3VwOiBncm91cCBuYW1lIHdpbGRjYXJkIChpLmUuIG5ld3MuKikKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgLSByZXNwOiBzZXJ2ZXIgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bAorICAgICAgICAtIGxpc3Q6IGxpc3Qgb2YgKG5hbWUsdGl0bGUpIHN0cmluZ3MiIiIKKworICAgICAgICBsaW5lX3BhdCA9IHJlLmNvbXBpbGUoIl4oW14gXHRdKylbIFx0XSsoLiopJCIpCisgICAgICAgIHJlc3AsIHJhd19saW5lcyA9IHNlbGYubG9uZ2NtZCgnWEdUSVRMRSAnICsgZ3JvdXAsIGZpbGUpCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgZm9yIHJhd19saW5lIGluIHJhd19saW5lczoKKyAgICAgICAgICAgIG1hdGNoID0gbGluZV9wYXQuc2VhcmNoKHJhd19saW5lLnN0cmlwKCkpCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQobWF0Y2guZ3JvdXAoMSwgMikpCisgICAgICAgIHJldHVybiByZXNwLCBsaW5lcworCisgICAgZGVmIHhwYXRoKHNlbGYsaWQpOgorICAgICAgICAiIiJQcm9jZXNzIGFuIFhQQVRIIGNvbW1hbmQgKG9wdGlvbmFsIHNlcnZlciBleHRlbnNpb24pIEFyZ3VtZW50czoKKyAgICAgICAgLSBpZDogTWVzc2FnZSBpZCBvZiBhcnRpY2xlCisgICAgICAgIFJldHVybnM6CisgICAgICAgIHJlc3A6IHNlcnZlciByZXNwb25zZSBpZiBzdWNjZXNzZnVsCisgICAgICAgIHBhdGg6IGRpcmVjdG9yeSBwYXRoIHRvIGFydGljbGUiIiIKKworICAgICAgICByZXNwID0gc2VsZi5zaG9ydGNtZCgiWFBBVEggIiArIGlkKQorICAgICAgICBpZiByZXNwWzozXSAhPSAnMjIzJzoKKyAgICAgICAgICAgIHJhaXNlIE5OVFBSZXBseUVycm9yKHJlc3ApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFtyZXNwX251bSwgcGF0aF0gPSByZXNwLnNwbGl0KCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBOTlRQUmVwbHlFcnJvcihyZXNwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHJlc3AsIHBhdGgKKworICAgIGRlZiBkYXRlIChzZWxmKToKKyAgICAgICAgIiIiUHJvY2VzcyB0aGUgREFURSBjb21tYW5kLiBBcmd1bWVudHM6CisgICAgICAgIE5vbmUKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgZGF0ZTogRGF0ZSBzdWl0YWJsZSBmb3IgbmV3bmV3cy9uZXdncm91cHMgY29tbWFuZHMgZXRjLgorICAgICAgICB0aW1lOiBUaW1lIHN1aXRhYmxlIGZvciBuZXduZXdzL25ld2dyb3VwcyBjb21tYW5kcyBldGMuIiIiCisKKyAgICAgICAgcmVzcCA9IHNlbGYuc2hvcnRjbWQoIkRBVEUiKQorICAgICAgICBpZiByZXNwWzozXSAhPSAnMTExJzoKKyAgICAgICAgICAgIHJhaXNlIE5OVFBSZXBseUVycm9yKHJlc3ApCisgICAgICAgIGVsZW0gPSByZXNwLnNwbGl0KCkKKyAgICAgICAgaWYgbGVuKGVsZW0pICE9IDI6CisgICAgICAgICAgICByYWlzZSBOTlRQRGF0YUVycm9yKHJlc3ApCisgICAgICAgIGRhdGUgPSBlbGVtWzFdWzI6OF0KKyAgICAgICAgdGltZSA9IGVsZW1bMV1bLTY6XQorICAgICAgICBpZiBsZW4oZGF0ZSkgIT0gNiBvciBsZW4odGltZSkgIT0gNjoKKyAgICAgICAgICAgIHJhaXNlIE5OVFBEYXRhRXJyb3IocmVzcCkKKyAgICAgICAgcmV0dXJuIHJlc3AsIGRhdGUsIHRpbWUKKworCisgICAgZGVmIHBvc3Qoc2VsZiwgZik6CisgICAgICAgICIiIlByb2Nlc3MgYSBQT1NUIGNvbW1hbmQuICBBcmd1bWVudHM6CisgICAgICAgIC0gZjogZmlsZSBjb250YWluaW5nIHRoZSBhcnRpY2xlCisgICAgICAgIFJldHVybnM6CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwiIiIKKworICAgICAgICByZXNwID0gc2VsZi5zaG9ydGNtZCgnUE9TVCcpCisgICAgICAgICMgUmFpc2VzIGVycm9yXz8/PyBpZiBwb3N0aW5nIGlzIG5vdCBhbGxvd2VkCisgICAgICAgIGlmIHJlc3BbMF0gIT0gJzMnOgorICAgICAgICAgICAgcmFpc2UgTk5UUFJlcGx5RXJyb3IocmVzcCkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lWy0xXSA9PSAnXG4nOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgICAgIGlmIGxpbmVbOjFdID09ICcuJzoKKyAgICAgICAgICAgICAgICBsaW5lID0gJy4nICsgbGluZQorICAgICAgICAgICAgc2VsZi5wdXRsaW5lKGxpbmUpCisgICAgICAgIHNlbGYucHV0bGluZSgnLicpCisgICAgICAgIHJldHVybiBzZWxmLmdldHJlc3AoKQorCisgICAgZGVmIGloYXZlKHNlbGYsIGlkLCBmKToKKyAgICAgICAgIiIiUHJvY2VzcyBhbiBJSEFWRSBjb21tYW5kLiAgQXJndW1lbnRzOgorICAgICAgICAtIGlkOiBtZXNzYWdlLWlkIG9mIHRoZSBhcnRpY2xlCisgICAgICAgIC0gZjogIGZpbGUgY29udGFpbmluZyB0aGUgYXJ0aWNsZQorICAgICAgICBSZXR1cm5zOgorICAgICAgICAtIHJlc3A6IHNlcnZlciByZXNwb25zZSBpZiBzdWNjZXNzZnVsCisgICAgICAgIE5vdGUgdGhhdCBpZiB0aGUgc2VydmVyIHJlZnVzZXMgdGhlIGFydGljbGUgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4iIiIKKworICAgICAgICByZXNwID0gc2VsZi5zaG9ydGNtZCgnSUhBVkUgJyArIGlkKQorICAgICAgICAjIFJhaXNlcyBlcnJvcl8/Pz8gaWYgdGhlIHNlcnZlciBhbHJlYWR5IGhhcyBpdAorICAgICAgICBpZiByZXNwWzBdICE9ICczJzoKKyAgICAgICAgICAgIHJhaXNlIE5OVFBSZXBseUVycm9yKHJlc3ApCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbGluZVstMV0gPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCisgICAgICAgICAgICBpZiBsaW5lWzoxXSA9PSAnLic6CisgICAgICAgICAgICAgICAgbGluZSA9ICcuJyArIGxpbmUKKyAgICAgICAgICAgIHNlbGYucHV0bGluZShsaW5lKQorICAgICAgICBzZWxmLnB1dGxpbmUoJy4nKQorICAgICAgICByZXR1cm4gc2VsZi5nZXRyZXNwKCkKKworICAgIGRlZiBxdWl0KHNlbGYpOgorICAgICAgICAiIiJQcm9jZXNzIGEgUVVJVCBjb21tYW5kIGFuZCBjbG9zZSB0aGUgc29ja2V0LiAgUmV0dXJuczoKKyAgICAgICAgLSByZXNwOiBzZXJ2ZXIgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bCIiIgorCisgICAgICAgIHJlc3AgPSBzZWxmLnNob3J0Y21kKCdRVUlUJykKKyAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKyAgICAgICAgZGVsIHNlbGYuZmlsZSwgc2VsZi5zb2NrCisgICAgICAgIHJldHVybiByZXNwCisKKworIyBUZXN0IHJldHJpZXZhbCB3aGVuIHJ1biBhcyBhIHNjcmlwdC4KKyMgQXNzdW1wdGlvbjogaWYgdGhlcmUncyBhIGxvY2FsIG5ld3Mgc2VydmVyLCBpdCdzIGNhbGxlZCAnbmV3cycuCisjIEFzc3VtcHRpb246IGlmIHVzZXIgcXVlcmllcyBhIHJlbW90ZSBuZXdzIHNlcnZlciwgaXQncyBuYW1lZAorIyBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgTk5UUFNFUlZFUiAodXNlZCBieSBzbHJuIGFuZCBraW4pCisjIGFuZCB3ZSB3YW50IHJlYWRlcm1vZGUgb2ZmLgoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgb3MKKyAgICBuZXdzaG9zdCA9ICduZXdzJyBhbmQgb3MuZW52aXJvblsiTk5UUFNFUlZFUiJdCisgICAgaWYgbmV3c2hvc3QuZmluZCgnLicpID09IC0xOgorICAgICAgICBtb2RlID0gJ3JlYWRlcm1vZGUnCisgICAgZWxzZToKKyAgICAgICAgbW9kZSA9IE5vbmUKKyAgICBzID0gTk5UUChuZXdzaG9zdCwgcmVhZGVybW9kZT1tb2RlKQorICAgIHJlc3AsIGNvdW50LCBmaXJzdCwgbGFzdCwgbmFtZSA9IHMuZ3JvdXAoJ2NvbXAubGFuZy5weXRob24nKQorICAgIHByaW50IHJlc3AKKyAgICBwcmludCAnR3JvdXAnLCBuYW1lLCAnaGFzJywgY291bnQsICdhcnRpY2xlcywgcmFuZ2UnLCBmaXJzdCwgJ3RvJywgbGFzdAorICAgIHJlc3AsIHN1YnMgPSBzLnhoZHIoJ3N1YmplY3QnLCBmaXJzdCArICctJyArIGxhc3QpCisgICAgcHJpbnQgcmVzcAorICAgIGZvciBpdGVtIGluIHN1YnM6CisgICAgICAgIHByaW50ICIlN3MgJXMiICUgaXRlbQorICAgIHJlc3AgPSBzLnF1aXQoKQorICAgIHByaW50IHJlc3AKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbm50cGxpYi5weWMgYi9saWIvcHl0aG9uMi43L25udHBsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOGJhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L25udHBsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbm50cGxpYi5weW8gYi9saWIvcHl0aG9uMi43L25udHBsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOGJhNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L25udHBsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbnRwYXRoLnB5IGIvbGliL3B5dGhvbjIuNy9udHBhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4ZjQyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbnRwYXRoLnB5CkBAIC0wLDAgKzEsNTMzIEBACisjIE1vZHVsZSAnbnRwYXRoJyAtLSBjb21tb24gb3BlcmF0aW9ucyBvbiBXaW5OVC9XaW45NSBwYXRobmFtZXMKKyIiIkNvbW1vbiBwYXRobmFtZSBtYW5pcHVsYXRpb25zLCBXaW5kb3dzTlQvOTUgdmVyc2lvbi4KKworSW5zdGVhZCBvZiBpbXBvcnRpbmcgdGhpcyBtb2R1bGUgZGlyZWN0bHksIGltcG9ydCBvcyBhbmQgcmVmZXIgdG8gdGhpcworbW9kdWxlIGFzIG9zLnBhdGguCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc3RhdAoraW1wb3J0IGdlbmVyaWNwYXRoCitpbXBvcnQgd2FybmluZ3MKKworZnJvbSBnZW5lcmljcGF0aCBpbXBvcnQgKgorCitfX2FsbF9fID0gWyJub3JtY2FzZSIsImlzYWJzIiwiam9pbiIsInNwbGl0ZHJpdmUiLCJzcGxpdCIsInNwbGl0ZXh0IiwKKyAgICAgICAgICAgImJhc2VuYW1lIiwiZGlybmFtZSIsImNvbW1vbnByZWZpeCIsImdldHNpemUiLCJnZXRtdGltZSIsCisgICAgICAgICAgICJnZXRhdGltZSIsImdldGN0aW1lIiwgImlzbGluayIsImV4aXN0cyIsImxleGlzdHMiLCJpc2RpciIsImlzZmlsZSIsCisgICAgICAgICAgICJpc21vdW50Iiwid2FsayIsImV4cGFuZHVzZXIiLCJleHBhbmR2YXJzIiwibm9ybXBhdGgiLCJhYnNwYXRoIiwKKyAgICAgICAgICAgInNwbGl0dW5jIiwiY3VyZGlyIiwicGFyZGlyIiwic2VwIiwicGF0aHNlcCIsImRlZnBhdGgiLCJhbHRzZXAiLAorICAgICAgICAgICAiZXh0c2VwIiwiZGV2bnVsbCIsInJlYWxwYXRoIiwic3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMiLCJyZWxwYXRoIl0KKworIyBzdHJpbmdzIHJlcHJlc2VudGluZyB2YXJpb3VzIHBhdGgtcmVsYXRlZCBiaXRzIGFuZCBwaWVjZXMKK2N1cmRpciA9ICcuJworcGFyZGlyID0gJy4uJworZXh0c2VwID0gJy4nCitzZXAgPSAnXFwnCitwYXRoc2VwID0gJzsnCithbHRzZXAgPSAnLycKK2RlZnBhdGggPSAnLjtDOlxcYmluJworaWYgJ2NlJyBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CisgICAgZGVmcGF0aCA9ICdcXFdpbmRvd3MnCitlbGlmICdvczInIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lczoKKyAgICAjIE9TLzIgdy8gVkFDUFAKKyAgICBhbHRzZXAgPSAnLycKK2Rldm51bGwgPSAnbnVsJworCisjIE5vcm1hbGl6ZSB0aGUgY2FzZSBvZiBhIHBhdGhuYW1lIGFuZCBtYXAgc2xhc2hlcyB0byBiYWNrc2xhc2hlcy4KKyMgT3RoZXIgbm9ybWFsaXphdGlvbnMgKHN1Y2ggYXMgb3B0aW1pemluZyAnLi4vJyBhd2F5KSBhcmUgbm90IGRvbmUKKyMgKHRoaXMgaXMgZG9uZSBieSBub3JtcGF0aCkuCisKK2RlZiBub3JtY2FzZShzKToKKyAgICAiIiJOb3JtYWxpemUgY2FzZSBvZiBwYXRobmFtZS4KKworICAgIE1ha2VzIGFsbCBjaGFyYWN0ZXJzIGxvd2VyY2FzZSBhbmQgYWxsIHNsYXNoZXMgaW50byBiYWNrc2xhc2hlcy4iIiIKKyAgICByZXR1cm4gcy5yZXBsYWNlKCIvIiwgIlxcIikubG93ZXIoKQorCisKKyMgUmV0dXJuIHdoZXRoZXIgYSBwYXRoIGlzIGFic29sdXRlLgorIyBUcml2aWFsIGluIFBvc2l4LCBoYXJkZXIgb24gdGhlIE1hYyBvciBNUy1ET1MuCisjIEZvciBET1MgaXQgaXMgYWJzb2x1dGUgaWYgaXQgc3RhcnRzIHdpdGggYSBzbGFzaCBvciBiYWNrc2xhc2ggKGN1cnJlbnQKKyMgdm9sdW1lKSwgb3IgaWYgYSBwYXRobmFtZSBhZnRlciB0aGUgdm9sdW1lIGxldHRlciBhbmQgY29sb24gLyBVTkMgcmVzb3VyY2UKKyMgc3RhcnRzIHdpdGggYSBzbGFzaCBvciBiYWNrc2xhc2guCisKK2RlZiBpc2FicyhzKToKKyAgICAiIiJUZXN0IHdoZXRoZXIgYSBwYXRoIGlzIGFic29sdXRlIiIiCisgICAgcyA9IHNwbGl0ZHJpdmUocylbMV0KKyAgICByZXR1cm4gcyAhPSAnJyBhbmQgc1s6MV0gaW4gJy9cXCcKKworCisjIEpvaW4gdHdvIChvciBtb3JlKSBwYXRocy4KKworZGVmIGpvaW4oYSwgKnApOgorICAgICIiIkpvaW4gdHdvIG9yIG1vcmUgcGF0aG5hbWUgY29tcG9uZW50cywgaW5zZXJ0aW5nICJcXCIgYXMgbmVlZGVkLgorICAgIElmIGFueSBjb21wb25lbnQgaXMgYW4gYWJzb2x1dGUgcGF0aCwgYWxsIHByZXZpb3VzIHBhdGggY29tcG9uZW50cworICAgIHdpbGwgYmUgZGlzY2FyZGVkLiIiIgorICAgIHBhdGggPSBhCisgICAgZm9yIGIgaW4gcDoKKyAgICAgICAgYl93aW5zID0gMCAgIyBzZXQgdG8gMSBpZmYgYiBtYWtlcyBwYXRoIGlycmVsZXZhbnQKKyAgICAgICAgaWYgcGF0aCA9PSAiIjoKKyAgICAgICAgICAgIGJfd2lucyA9IDEKKworICAgICAgICBlbGlmIGlzYWJzKGIpOgorICAgICAgICAgICAgIyBUaGlzIHByb2JhYmx5IHdpcGVzIG91dCBwYXRoIHNvIGZhci4gIEhvd2V2ZXIsIGl0J3MgbW9yZQorICAgICAgICAgICAgIyBjb21wbGljYXRlZCBpZiBwYXRoIGJlZ2lucyB3aXRoIGEgZHJpdmUgbGV0dGVyOgorICAgICAgICAgICAgIyAgICAgMS4gam9pbignYzonLCAnL2EnKSA9PSAnYzovYScKKyAgICAgICAgICAgICMgICAgIDIuIGpvaW4oJ2M6LycsICcvYScpID09ICdjOi9hJworICAgICAgICAgICAgIyBCdXQKKyAgICAgICAgICAgICMgICAgIDMuIGpvaW4oJ2M6L2EnLCAnL2InKSA9PSAnL2InCisgICAgICAgICAgICAjICAgICA0LiBqb2luKCdjOicsICdkOi8nKSA9ICdkOi8nCisgICAgICAgICAgICAjICAgICA1LiBqb2luKCdjOi8nLCAnZDovJykgPSAnZDovJworICAgICAgICAgICAgaWYgcGF0aFsxOjJdICE9ICI6IiBvciBiWzE6Ml0gPT0gIjoiOgorICAgICAgICAgICAgICAgICMgUGF0aCBkb2Vzbid0IHN0YXJ0IHdpdGggYSBkcml2ZSBsZXR0ZXIsIG9yIGNhc2VzIDQgYW5kIDUuCisgICAgICAgICAgICAgICAgYl93aW5zID0gMQorCisgICAgICAgICAgICAjIEVsc2UgcGF0aCBoYXMgYSBkcml2ZSBsZXR0ZXIsIGFuZCBiIGRvZXNuJ3QgYnV0IGlzIGFic29sdXRlLgorICAgICAgICAgICAgZWxpZiBsZW4ocGF0aCkgPiAzIG9yIChsZW4ocGF0aCkgPT0gMyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFstMV0gbm90IGluICIvXFwiKToKKyAgICAgICAgICAgICAgICAjIGNhc2UgMworICAgICAgICAgICAgICAgIGJfd2lucyA9IDEKKworICAgICAgICBpZiBiX3dpbnM6CisgICAgICAgICAgICBwYXRoID0gYgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBKb2luLCBhbmQgZW5zdXJlIHRoZXJlJ3MgYSBzZXBhcmF0b3IuCisgICAgICAgICAgICBhc3NlcnQgbGVuKHBhdGgpID4gMAorICAgICAgICAgICAgaWYgcGF0aFstMV0gaW4gIi9cXCI6CisgICAgICAgICAgICAgICAgaWYgYiBhbmQgYlswXSBpbiAiL1xcIjoKKyAgICAgICAgICAgICAgICAgICAgcGF0aCArPSBiWzE6XQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBhdGggKz0gYgorICAgICAgICAgICAgZWxpZiBwYXRoWy0xXSA9PSAiOiI6CisgICAgICAgICAgICAgICAgcGF0aCArPSBiCisgICAgICAgICAgICBlbGlmIGI6CisgICAgICAgICAgICAgICAgaWYgYlswXSBpbiAiL1xcIjoKKyAgICAgICAgICAgICAgICAgICAgcGF0aCArPSBiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcGF0aCArPSAiXFwiICsgYgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHBhdGggaXMgbm90IGVtcHR5IGFuZCBkb2VzIG5vdCBlbmQgd2l0aCBhIGJhY2tzbGFzaCwKKyAgICAgICAgICAgICAgICAjIGJ1dCBiIGlzIGVtcHR5OyBzaW5jZSwgZS5nLiwgc3BsaXQoJ2EvJykgcHJvZHVjZXMKKyAgICAgICAgICAgICAgICAjICgnYScsICcnKSwgaXQncyBiZXN0IGlmIGpvaW4oKSBhZGRzIGEgYmFja3NsYXNoIGluCisgICAgICAgICAgICAgICAgIyB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgcGF0aCArPSAnXFwnCisKKyAgICByZXR1cm4gcGF0aAorCisKKyMgU3BsaXQgYSBwYXRoIGluIGEgZHJpdmUgc3BlY2lmaWNhdGlvbiAoYSBkcml2ZSBsZXR0ZXIgZm9sbG93ZWQgYnkgYQorIyBjb2xvbikgYW5kIHRoZSBwYXRoIHNwZWNpZmljYXRpb24uCisjIEl0IGlzIGFsd2F5cyB0cnVlIHRoYXQgZHJpdmVzcGVjICsgcGF0aHNwZWMgPT0gcAorZGVmIHNwbGl0ZHJpdmUocCk6CisgICAgIiIiU3BsaXQgYSBwYXRobmFtZSBpbnRvIGRyaXZlIGFuZCBwYXRoIHNwZWNpZmllcnMuIFJldHVybnMgYSAyLXR1cGxlCisiKGRyaXZlLHBhdGgpIjsgIGVpdGhlciBwYXJ0IG1heSBiZSBlbXB0eSIiIgorICAgIGlmIHBbMToyXSA9PSAnOic6CisgICAgICAgIHJldHVybiBwWzA6Ml0sIHBbMjpdCisgICAgcmV0dXJuICcnLCBwCisKKworIyBQYXJzZSBVTkMgcGF0aHMKK2RlZiBzcGxpdHVuYyhwKToKKyAgICAiIiJTcGxpdCBhIHBhdGhuYW1lIGludG8gVU5DIG1vdW50IHBvaW50IGFuZCByZWxhdGl2ZSBwYXRoIHNwZWNpZmllcnMuCisKKyAgICBSZXR1cm4gYSAyLXR1cGxlICh1bmMsIHJlc3QpOyBlaXRoZXIgcGFydCBtYXkgYmUgZW1wdHkuCisgICAgSWYgdW5jIGlzIG5vdCBlbXB0eSwgaXQgaGFzIHRoZSBmb3JtICcvL2hvc3QvbW91bnQnIChvciBzaW1pbGFyCisgICAgdXNpbmcgYmFja3NsYXNoZXMpLiAgdW5jK3Jlc3QgaXMgYWx3YXlzIHRoZSBpbnB1dCBwYXRoLgorICAgIFBhdGhzIGNvbnRhaW5pbmcgZHJpdmUgbGV0dGVycyBuZXZlciBoYXZlIGFuIFVOQyBwYXJ0LgorICAgICIiIgorICAgIGlmIHBbMToyXSA9PSAnOic6CisgICAgICAgIHJldHVybiAnJywgcCAjIERyaXZlIGxldHRlciBwcmVzZW50CisgICAgZmlyc3RUd28gPSBwWzA6Ml0KKyAgICBpZiBmaXJzdFR3byA9PSAnLy8nIG9yIGZpcnN0VHdvID09ICdcXFxcJzoKKyAgICAgICAgIyBpcyBhIFVOQyBwYXRoOgorICAgICAgICAjIHZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2IGVxdWl2YWxlbnQgdG8gZHJpdmUgbGV0dGVyCisgICAgICAgICMgXFxtYWNoaW5lXG1vdW50cG9pbnRcZGlyZWN0b3JpZXMuLi4KKyAgICAgICAgIyAgICAgICAgICAgZGlyZWN0b3J5IF5eXl5eXl5eXl5eXl5eXgorICAgICAgICBub3JtcCA9IG5vcm1jYXNlKHApCisgICAgICAgIGluZGV4ID0gbm9ybXAuZmluZCgnXFwnLCAyKQorICAgICAgICBpZiBpbmRleCA9PSAtMToKKyAgICAgICAgICAgICMjcmFpc2UgUnVudGltZUVycm9yLCAnaWxsZWdhbCBVTkMgcGF0aDogIicgKyBwICsgJyInCisgICAgICAgICAgICByZXR1cm4gKCIiLCBwKQorICAgICAgICBpbmRleCA9IG5vcm1wLmZpbmQoJ1xcJywgaW5kZXggKyAxKQorICAgICAgICBpZiBpbmRleCA9PSAtMToKKyAgICAgICAgICAgIGluZGV4ID0gbGVuKHApCisgICAgICAgIHJldHVybiBwWzppbmRleF0sIHBbaW5kZXg6XQorICAgIHJldHVybiAnJywgcAorCisKKyMgU3BsaXQgYSBwYXRoIGluIGhlYWQgKGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGxhc3QgJy8nKSBhbmQgdGFpbCAodGhlCisjIHJlc3QpLiAgQWZ0ZXIgdGhlIHRyYWlsaW5nICcvJyBpcyBzdHJpcHBlZCwgdGhlIGludmFyaWFudAorIyBqb2luKGhlYWQsIHRhaWwpID09IHAgaG9sZHMuCisjIFRoZSByZXN1bHRpbmcgaGVhZCB3b24ndCBlbmQgaW4gJy8nIHVubGVzcyBpdCBpcyB0aGUgcm9vdC4KKworZGVmIHNwbGl0KHApOgorICAgICIiIlNwbGl0IGEgcGF0aG5hbWUuCisKKyAgICBSZXR1cm4gdHVwbGUgKGhlYWQsIHRhaWwpIHdoZXJlIHRhaWwgaXMgZXZlcnl0aGluZyBhZnRlciB0aGUgZmluYWwgc2xhc2guCisgICAgRWl0aGVyIHBhcnQgbWF5IGJlIGVtcHR5LiIiIgorCisgICAgZCwgcCA9IHNwbGl0ZHJpdmUocCkKKyAgICAjIHNldCBpIHRvIGluZGV4IGJleW9uZCBwJ3MgbGFzdCBzbGFzaAorICAgIGkgPSBsZW4ocCkKKyAgICB3aGlsZSBpIGFuZCBwW2ktMV0gbm90IGluICcvXFwnOgorICAgICAgICBpID0gaSAtIDEKKyAgICBoZWFkLCB0YWlsID0gcFs6aV0sIHBbaTpdICAjIG5vdyB0YWlsIGhhcyBubyBzbGFzaGVzCisgICAgIyByZW1vdmUgdHJhaWxpbmcgc2xhc2hlcyBmcm9tIGhlYWQsIHVubGVzcyBpdCdzIGFsbCBzbGFzaGVzCisgICAgaGVhZDIgPSBoZWFkCisgICAgd2hpbGUgaGVhZDIgYW5kIGhlYWQyWy0xXSBpbiAnL1xcJzoKKyAgICAgICAgaGVhZDIgPSBoZWFkMls6LTFdCisgICAgaGVhZCA9IGhlYWQyIG9yIGhlYWQKKyAgICByZXR1cm4gZCArIGhlYWQsIHRhaWwKKworCisjIFNwbGl0IGEgcGF0aCBpbiByb290IGFuZCBleHRlbnNpb24uCisjIFRoZSBleHRlbnNpb24gaXMgZXZlcnl0aGluZyBzdGFydGluZyBhdCB0aGUgbGFzdCBkb3QgaW4gdGhlIGxhc3QKKyMgcGF0aG5hbWUgY29tcG9uZW50OyB0aGUgcm9vdCBpcyBldmVyeXRoaW5nIGJlZm9yZSB0aGF0LgorIyBJdCBpcyBhbHdheXMgdHJ1ZSB0aGF0IHJvb3QgKyBleHQgPT0gcC4KKworZGVmIHNwbGl0ZXh0KHApOgorICAgIHJldHVybiBnZW5lcmljcGF0aC5fc3BsaXRleHQocCwgc2VwLCBhbHRzZXAsIGV4dHNlcCkKK3NwbGl0ZXh0Ll9fZG9jX18gPSBnZW5lcmljcGF0aC5fc3BsaXRleHQuX19kb2NfXworCisKKyMgUmV0dXJuIHRoZSB0YWlsIChiYXNlbmFtZSkgcGFydCBvZiBhIHBhdGguCisKK2RlZiBiYXNlbmFtZShwKToKKyAgICAiIiJSZXR1cm5zIHRoZSBmaW5hbCBjb21wb25lbnQgb2YgYSBwYXRobmFtZSIiIgorICAgIHJldHVybiBzcGxpdChwKVsxXQorCisKKyMgUmV0dXJuIHRoZSBoZWFkIChkaXJuYW1lKSBwYXJ0IG9mIGEgcGF0aC4KKworZGVmIGRpcm5hbWUocCk6CisgICAgIiIiUmV0dXJucyB0aGUgZGlyZWN0b3J5IGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lIiIiCisgICAgcmV0dXJuIHNwbGl0KHApWzBdCisKKyMgSXMgYSBwYXRoIGEgc3ltYm9saWMgbGluaz8KKyMgVGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2Ugb24gc3lzdGVtcyB3aGVyZSBwb3NpeC5sc3RhdCBkb2Vzbid0IGV4aXN0LgorCitkZWYgaXNsaW5rKHBhdGgpOgorICAgICIiIlRlc3QgZm9yIHN5bWJvbGljIGxpbmsuCisgICAgT24gV2luZG93c05ULzk1IGFuZCBPUy8yIGFsd2F5cyByZXR1cm5zIGZhbHNlCisgICAgIiIiCisgICAgcmV0dXJuIEZhbHNlCisKKyMgYWxpYXMgZXhpc3RzIHRvIGxleGlzdHMKK2xleGlzdHMgPSBleGlzdHMKKworIyBJcyBhIHBhdGggYSBtb3VudCBwb2ludD8gIEVpdGhlciBhIHJvb3QgKHdpdGggb3Igd2l0aG91dCBkcml2ZSBsZXR0ZXIpCisjIG9yIGFuIFVOQyBwYXRoIHdpdGggYXQgbW9zdCBhIC8gb3IgXCBhZnRlciB0aGUgbW91bnQgcG9pbnQuCisKK2RlZiBpc21vdW50KHBhdGgpOgorICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggaXMgYSBtb3VudCBwb2ludCAoZGVmaW5lZCBhcyByb290IG9mIGRyaXZlKSIiIgorICAgIHVuYywgcmVzdCA9IHNwbGl0dW5jKHBhdGgpCisgICAgaWYgdW5jOgorICAgICAgICByZXR1cm4gcmVzdCBpbiAoIiIsICIvIiwgIlxcIikKKyAgICBwID0gc3BsaXRkcml2ZShwYXRoKVsxXQorICAgIHJldHVybiBsZW4ocCkgPT0gMSBhbmQgcFswXSBpbiAnL1xcJworCisKKyMgRGlyZWN0b3J5IHRyZWUgd2Fsay4KKyMgRm9yIGVhY2ggZGlyZWN0b3J5IHVuZGVyIHRvcCAoaW5jbHVkaW5nIHRvcCBpdHNlbGYsIGJ1dCBleGNsdWRpbmcKKyMgJy4nIGFuZCAnLi4nKSwgZnVuYyhhcmcsIGRpcm5hbWUsIGZpbGVuYW1lcykgaXMgY2FsbGVkLCB3aGVyZQorIyBkaXJuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgYW5kIGZpbGVuYW1lcyBpcyB0aGUgbGlzdAorIyBvZiBmaWxlcyAoYW5kIHN1YmRpcmVjdG9yaWVzIGV0Yy4pIGluIHRoZSBkaXJlY3RvcnkuCisjIFRoZSBmdW5jIG1heSBtb2RpZnkgdGhlIGZpbGVuYW1lcyBsaXN0LCB0byBpbXBsZW1lbnQgYSBmaWx0ZXIsCisjIG9yIHRvIGltcG9zZSBhIGRpZmZlcmVudCBvcmRlciBvZiB2aXNpdGluZy4KKworZGVmIHdhbGsodG9wLCBmdW5jLCBhcmcpOgorICAgICIiIkRpcmVjdG9yeSB0cmVlIHdhbGsgd2l0aCBjYWxsYmFjayBmdW5jdGlvbi4KKworICAgIEZvciBlYWNoIGRpcmVjdG9yeSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUgcm9vdGVkIGF0IHRvcCAoaW5jbHVkaW5nIHRvcAorICAgIGl0c2VsZiwgYnV0IGV4Y2x1ZGluZyAnLicgYW5kICcuLicpLCBjYWxsIGZ1bmMoYXJnLCBkaXJuYW1lLCBmbmFtZXMpLgorICAgIGRpcm5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSwgYW5kIGZuYW1lcyBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mCisgICAgdGhlIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyBpbiBkaXJuYW1lIChleGNsdWRpbmcgJy4nIGFuZCAnLi4nKS4gIGZ1bmMKKyAgICBtYXkgbW9kaWZ5IHRoZSBmbmFtZXMgbGlzdCBpbi1wbGFjZSAoZS5nLiB2aWEgZGVsIG9yIHNsaWNlIGFzc2lnbm1lbnQpLAorICAgIGFuZCB3YWxrIHdpbGwgb25seSByZWN1cnNlIGludG8gdGhlIHN1YmRpcmVjdG9yaWVzIHdob3NlIG5hbWVzIHJlbWFpbiBpbgorICAgIGZuYW1lczsgdGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYSBmaWx0ZXIsIG9yIHRvIGltcG9zZSBhIHNwZWNpZmljCisgICAgb3JkZXIgb2YgdmlzaXRpbmcuICBObyBzZW1hbnRpY3MgYXJlIGRlZmluZWQgZm9yLCBvciByZXF1aXJlZCBvZiwgYXJnLAorICAgIGJleW9uZCB0aGF0IGFyZyBpcyBhbHdheXMgcGFzc2VkIHRvIGZ1bmMuICBJdCBjYW4gYmUgdXNlZCwgZS5nLiwgdG8gcGFzcworICAgIGEgZmlsZW5hbWUgcGF0dGVybiwgb3IgYSBtdXRhYmxlIG9iamVjdCBkZXNpZ25lZCB0byBhY2N1bXVsYXRlCisgICAgc3RhdGlzdGljcy4gIFBhc3NpbmcgTm9uZSBmb3IgYXJnIGlzIGNvbW1vbi4iIiIKKyAgICB3YXJuaW5ncy53YXJucHkzaygiSW4gMy54LCBvcy5wYXRoLndhbGsgaXMgcmVtb3ZlZCBpbiBmYXZvciBvZiBvcy53YWxrLiIsCisgICAgICAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorICAgIHRyeToKKyAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHRvcCkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIHJldHVybgorICAgIGZ1bmMoYXJnLCB0b3AsIG5hbWVzKQorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBuYW1lID0gam9pbih0b3AsIG5hbWUpCisgICAgICAgIGlmIGlzZGlyKG5hbWUpOgorICAgICAgICAgICAgd2FsayhuYW1lLCBmdW5jLCBhcmcpCisKKworIyBFeHBhbmQgcGF0aHMgYmVnaW5uaW5nIHdpdGggJ34nIG9yICd+dXNlcicuCisjICd+JyBtZWFucyAkSE9NRTsgJ351c2VyJyBtZWFucyB0aGF0IHVzZXIncyBob21lIGRpcmVjdG9yeS4KKyMgSWYgdGhlIHBhdGggZG9lc24ndCBiZWdpbiB3aXRoICd+Jywgb3IgaWYgdGhlIHVzZXIgb3IgJEhPTUUgaXMgdW5rbm93biwKKyMgdGhlIHBhdGggaXMgcmV0dXJuZWQgdW5jaGFuZ2VkIChsZWF2aW5nIGVycm9yIHJlcG9ydGluZyB0byB3aGF0ZXZlcgorIyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgZXhwYW5kZWQgcGF0aCBhcyBhcmd1bWVudCkuCisjIFNlZSBhbHNvIG1vZHVsZSAnZ2xvYicgZm9yIGV4cGFuc2lvbiBvZiAqLCA/IGFuZCBbLi4uXSBpbiBwYXRobmFtZXMuCisjIChBIGZ1bmN0aW9uIHNob3VsZCBhbHNvIGJlIGRlZmluZWQgdG8gZG8gZnVsbCAqc2gtc3R5bGUgZW52aXJvbm1lbnQKKyMgdmFyaWFibGUgZXhwYW5zaW9uLikKKworZGVmIGV4cGFuZHVzZXIocGF0aCk6CisgICAgIiIiRXhwYW5kIH4gYW5kIH51c2VyIGNvbnN0cnVjdHMuCisKKyAgICBJZiB1c2VyIG9yICRIT01FIGlzIHVua25vd24sIGRvIG5vdGhpbmcuIiIiCisgICAgaWYgcGF0aFs6MV0gIT0gJ34nOgorICAgICAgICByZXR1cm4gcGF0aAorICAgIGksIG4gPSAxLCBsZW4ocGF0aCkKKyAgICB3aGlsZSBpIDwgbiBhbmQgcGF0aFtpXSBub3QgaW4gJy9cXCc6CisgICAgICAgIGkgPSBpICsgMQorCisgICAgaWYgJ0hPTUUnIGluIG9zLmVudmlyb246CisgICAgICAgIHVzZXJob21lID0gb3MuZW52aXJvblsnSE9NRSddCisgICAgZWxpZiAnVVNFUlBST0ZJTEUnIGluIG9zLmVudmlyb246CisgICAgICAgIHVzZXJob21lID0gb3MuZW52aXJvblsnVVNFUlBST0ZJTEUnXQorICAgIGVsaWYgbm90ICdIT01FUEFUSCcgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgcmV0dXJuIHBhdGgKKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkcml2ZSA9IG9zLmVudmlyb25bJ0hPTUVEUklWRSddCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGRyaXZlID0gJycKKyAgICAgICAgdXNlcmhvbWUgPSBqb2luKGRyaXZlLCBvcy5lbnZpcm9uWydIT01FUEFUSCddKQorCisgICAgaWYgaSAhPSAxOiAjfnVzZXIKKyAgICAgICAgdXNlcmhvbWUgPSBqb2luKGRpcm5hbWUodXNlcmhvbWUpLCBwYXRoWzE6aV0pCisKKyAgICByZXR1cm4gdXNlcmhvbWUgKyBwYXRoW2k6XQorCisKKyMgRXhwYW5kIHBhdGhzIGNvbnRhaW5pbmcgc2hlbGwgdmFyaWFibGUgc3Vic3RpdHV0aW9ucy4KKyMgVGhlIGZvbGxvd2luZyBydWxlcyBhcHBseToKKyMgICAgICAgLSBubyBleHBhbnNpb24gd2l0aGluIHNpbmdsZSBxdW90ZXMKKyMgICAgICAgLSAnJCQnIGlzIHRyYW5zbGF0ZWQgaW50byAnJCcKKyMgICAgICAgLSAnJSUnIGlzIHRyYW5zbGF0ZWQgaW50byAnJScgaWYgJyUlJyBhcmUgbm90IHNlZW4gaW4gJXZhcjElJXZhcjIlCisjICAgICAgIC0gJHt2YXJuYW1lfSBpcyBhY2NlcHRlZC4KKyMgICAgICAgLSAkdmFybmFtZSBpcyBhY2NlcHRlZC4KKyMgICAgICAgLSAldmFybmFtZSUgaXMgYWNjZXB0ZWQuCisjICAgICAgIC0gdmFybmFtZXMgY2FuIGJlIG1hZGUgb3V0IG9mIGxldHRlcnMsIGRpZ2l0cyBhbmQgdGhlIGNoYXJhY3RlcnMgJ18tJworIyAgICAgICAgICh0aG91Z2ggaXMgbm90IHZlcmlmaWVkIGluIHRoZSAke3Zhcm5hbWV9IGFuZCAldmFybmFtZSUgY2FzZXMpCisjIFhYWCBXaXRoIENPTU1BTkQuQ09NIHlvdSBjYW4gdXNlIGFueSBjaGFyYWN0ZXJzIGluIGEgdmFyaWFibGUgbmFtZSwKKyMgWFhYIGV4Y2VwdCAnXnw8Pj0nLgorCitkZWYgZXhwYW5kdmFycyhwYXRoKToKKyAgICAiIiJFeHBhbmQgc2hlbGwgdmFyaWFibGVzIG9mIHRoZSBmb3JtcyAkdmFyLCAke3Zhcn0gYW5kICV2YXIlLgorCisgICAgVW5rbm93biB2YXJpYWJsZXMgYXJlIGxlZnQgdW5jaGFuZ2VkLiIiIgorICAgIGlmICckJyBub3QgaW4gcGF0aCBhbmQgJyUnIG5vdCBpbiBwYXRoOgorICAgICAgICByZXR1cm4gcGF0aAorICAgIGltcG9ydCBzdHJpbmcKKyAgICB2YXJjaGFycyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICdfLScKKyAgICByZXMgPSAnJworICAgIGluZGV4ID0gMAorICAgIHBhdGhsZW4gPSBsZW4ocGF0aCkKKyAgICB3aGlsZSBpbmRleCA8IHBhdGhsZW46CisgICAgICAgIGMgPSBwYXRoW2luZGV4XQorICAgICAgICBpZiBjID09ICdcJyc6ICAgIyBubyBleHBhbnNpb24gd2l0aGluIHNpbmdsZSBxdW90ZXMKKyAgICAgICAgICAgIHBhdGggPSBwYXRoW2luZGV4ICsgMTpdCisgICAgICAgICAgICBwYXRobGVuID0gbGVuKHBhdGgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4KCdcJycpCisgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgJ1wnJyArIHBhdGhbOmluZGV4ICsgMV0KKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArIHBhdGgKKyAgICAgICAgICAgICAgICBpbmRleCA9IHBhdGhsZW4gLSAxCisgICAgICAgIGVsaWYgYyA9PSAnJSc6ICAjIHZhcmlhYmxlIG9yICclJworICAgICAgICAgICAgaWYgcGF0aFtpbmRleCArIDE6aW5kZXggKyAyXSA9PSAnJSc6CisgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgYworICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoW2luZGV4KzE6XQorICAgICAgICAgICAgICAgIHBhdGhsZW4gPSBsZW4ocGF0aCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcGF0aC5pbmRleCgnJScpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArICclJyArIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwYXRobGVuIC0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHZhciA9IHBhdGhbOmluZGV4XQorICAgICAgICAgICAgICAgICAgICBpZiB2YXIgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArIG9zLmVudmlyb25bdmFyXQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgJyUnICsgdmFyICsgJyUnCisgICAgICAgIGVsaWYgYyA9PSAnJCc6ICAjIHZhcmlhYmxlIG9yICckJCcKKyAgICAgICAgICAgIGlmIHBhdGhbaW5kZXggKyAxOmluZGV4ICsgMl0gPT0gJyQnOgorICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArIGMKKyAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMQorICAgICAgICAgICAgZWxpZiBwYXRoW2luZGV4ICsgMTppbmRleCArIDJdID09ICd7JzoKKyAgICAgICAgICAgICAgICBwYXRoID0gcGF0aFtpbmRleCsyOl0KKyAgICAgICAgICAgICAgICBwYXRobGVuID0gbGVuKHBhdGgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHBhdGguaW5kZXgoJ30nKQorICAgICAgICAgICAgICAgICAgICB2YXIgPSBwYXRoWzppbmRleF0KKyAgICAgICAgICAgICAgICAgICAgaWYgdmFyIGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMgKyBvcy5lbnZpcm9uW3Zhcl0KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArICckeycgKyB2YXIgKyAnfScKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgJyR7JyArIHBhdGgKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwYXRobGVuIC0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YXIgPSAnJworICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCisgICAgICAgICAgICAgICAgYyA9IHBhdGhbaW5kZXg6aW5kZXggKyAxXQorICAgICAgICAgICAgICAgIHdoaWxlIGMgIT0gJycgYW5kIGMgaW4gdmFyY2hhcnM6CisgICAgICAgICAgICAgICAgICAgIHZhciA9IHZhciArIGMKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIDEKKyAgICAgICAgICAgICAgICAgICAgYyA9IHBhdGhbaW5kZXg6aW5kZXggKyAxXQorICAgICAgICAgICAgICAgIGlmIHZhciBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMgKyBvcy5lbnZpcm9uW3Zhcl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMgKyAnJCcgKyB2YXIKKyAgICAgICAgICAgICAgICBpZiBjICE9ICcnOgorICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4IC0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzID0gcmVzICsgYworICAgICAgICBpbmRleCA9IGluZGV4ICsgMQorICAgIHJldHVybiByZXMKKworCisjIE5vcm1hbGl6ZSBhIHBhdGgsIGUuZy4gQS8vQiwgQS8uL0IgYW5kIEEvZm9vLy4uL0IgYWxsIGJlY29tZSBBXEIuCisjIFByZXZpb3VzbHksIHRoaXMgZnVuY3Rpb24gYWxzbyB0cnVuY2F0ZWQgcGF0aG5hbWVzIHRvIDgrMyBmb3JtYXQsCisjIGJ1dCBhcyB0aGlzIG1vZHVsZSBpcyBjYWxsZWQgIm50cGF0aCIsIHRoYXQncyBvYnZpb3VzbHkgd3JvbmchCisKK2RlZiBub3JtcGF0aChwYXRoKToKKyAgICAiIiJOb3JtYWxpemUgcGF0aCwgZWxpbWluYXRpbmcgZG91YmxlIHNsYXNoZXMsIGV0Yy4iIiIKKyAgICAjIFByZXNlcnZlIHVuaWNvZGUgKGlmIHBhdGggaXMgdW5pY29kZSkKKyAgICBiYWNrc2xhc2gsIGRvdCA9ICh1J1xcJywgdScuJykgaWYgaXNpbnN0YW5jZShwYXRoLCB1bmljb2RlKSBlbHNlICgnXFwnLCAnLicpCisgICAgaWYgcGF0aC5zdGFydHN3aXRoKCgnXFxcXC5cXCcsICdcXFxcP1xcJykpOgorICAgICAgICAjIGluIHRoZSBjYXNlIG9mIHBhdGhzIHdpdGggdGhlc2UgcHJlZml4ZXM6CisgICAgICAgICMgXFwuXCAtPiBkZXZpY2UgbmFtZXMKKyAgICAgICAgIyBcXD9cIC0+IGxpdGVyYWwgcGF0aHMKKyAgICAgICAgIyBkbyBub3QgZG8gYW55IG5vcm1hbGl6YXRpb24sIGJ1dCByZXR1cm4gdGhlIHBhdGggdW5jaGFuZ2VkCisgICAgICAgIHJldHVybiBwYXRoCisgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgiLyIsICJcXCIpCisgICAgcHJlZml4LCBwYXRoID0gc3BsaXRkcml2ZShwYXRoKQorICAgICMgV2UgbmVlZCB0byBiZSBjYXJlZnVsIGhlcmUuIElmIHRoZSBwcmVmaXggaXMgZW1wdHksIGFuZCB0aGUgcGF0aCBzdGFydHMKKyAgICAjIHdpdGggYSBiYWNrc2xhc2gsIGl0IGNvdWxkIGVpdGhlciBiZSBhbiBhYnNvbHV0ZSBwYXRoIG9uIHRoZSBjdXJyZW50CisgICAgIyBkcml2ZSAoXGRpcjFcZGlyMlxmaWxlKSBvciBhIFVOQyBmaWxlbmFtZSAoXFxzZXJ2ZXJcbW91bnRcZGlyMVxmaWxlKS4gSXQKKyAgICAjIGlzIHRoZXJlZm9yZSBpbXBlcmF0aXZlIE5PVCB0byBjb2xsYXBzZSBtdWx0aXBsZSBiYWNrc2xhc2hlcyBibGluZGx5IGluCisgICAgIyB0aGF0IGNhc2UuCisgICAgIyBUaGUgY29kZSBiZWxvdyBwcmVzZXJ2ZXMgbXVsdGlwbGUgYmFja3NsYXNoZXMgd2hlbiB0aGVyZSBpcyBubyBkcml2ZQorICAgICMgbGV0dGVyLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGludmFsaWQgZmlsZW5hbWUgXFxcYVxiIGlzIHByZXNlcnZlZAorICAgICMgdW5jaGFuZ2VkLCB3aGVyZSBhXFxcYiBpcyBub3JtYWxpc2VkIHRvIGFcYi4gSXQncyBub3QgY2xlYXIgdGhhdCB0aGVyZQorICAgICMgaXMgYW55IGJldHRlciBiZWhhdmlvdXIgZm9yIHN1Y2ggZWRnZSBjYXNlcy4KKyAgICBpZiBwcmVmaXggPT0gJyc6CisgICAgICAgICMgTm8gZHJpdmUgbGV0dGVyIC0gcHJlc2VydmUgaW5pdGlhbCBiYWNrc2xhc2hlcworICAgICAgICB3aGlsZSBwYXRoWzoxXSA9PSAiXFwiOgorICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4ICsgYmFja3NsYXNoCisgICAgICAgICAgICBwYXRoID0gcGF0aFsxOl0KKyAgICBlbHNlOgorICAgICAgICAjIFdlIGhhdmUgYSBkcml2ZSBsZXR0ZXIgLSBjb2xsYXBzZSBpbml0aWFsIGJhY2tzbGFzaGVzCisgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCgiXFwiKToKKyAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeCArIGJhY2tzbGFzaAorICAgICAgICAgICAgcGF0aCA9IHBhdGgubHN0cmlwKCJcXCIpCisgICAgY29tcHMgPSBwYXRoLnNwbGl0KCJcXCIpCisgICAgaSA9IDAKKyAgICB3aGlsZSBpIDwgbGVuKGNvbXBzKToKKyAgICAgICAgaWYgY29tcHNbaV0gaW4gKCcuJywgJycpOgorICAgICAgICAgICAgZGVsIGNvbXBzW2ldCisgICAgICAgIGVsaWYgY29tcHNbaV0gPT0gJy4uJzoKKyAgICAgICAgICAgIGlmIGkgPiAwIGFuZCBjb21wc1tpLTFdICE9ICcuLic6CisgICAgICAgICAgICAgICAgZGVsIGNvbXBzW2ktMTppKzFdCisgICAgICAgICAgICAgICAgaSAtPSAxCisgICAgICAgICAgICBlbGlmIGkgPT0gMCBhbmQgcHJlZml4LmVuZHN3aXRoKCJcXCIpOgorICAgICAgICAgICAgICAgIGRlbCBjb21wc1tpXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGkgKz0gMQorICAgICMgSWYgdGhlIHBhdGggaXMgbm93IGVtcHR5LCBzdWJzdGl0dXRlICcuJworICAgIGlmIG5vdCBwcmVmaXggYW5kIG5vdCBjb21wczoKKyAgICAgICAgY29tcHMuYXBwZW5kKGRvdCkKKyAgICByZXR1cm4gcHJlZml4ICsgYmFja3NsYXNoLmpvaW4oY29tcHMpCisKKworIyBSZXR1cm4gYW4gYWJzb2x1dGUgcGF0aC4KK3RyeToKKyAgICBmcm9tIG50IGltcG9ydCBfZ2V0ZnVsbHBhdGhuYW1lCisKK2V4Y2VwdCBJbXBvcnRFcnJvcjogIyBub3QgcnVubmluZyBvbiBXaW5kb3dzIC0gbW9jayB1cCBzb21ldGhpbmcgc2Vuc2libGUKKyAgICBkZWYgYWJzcGF0aChwYXRoKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBhYnNvbHV0ZSB2ZXJzaW9uIG9mIGEgcGF0aC4iIiIKKyAgICAgICAgaWYgbm90IGlzYWJzKHBhdGgpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXRoLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICBjd2QgPSBvcy5nZXRjd2R1KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgICAgIHBhdGggPSBqb2luKGN3ZCwgcGF0aCkKKyAgICAgICAgcmV0dXJuIG5vcm1wYXRoKHBhdGgpCisKK2Vsc2U6ICAjIHVzZSBuYXRpdmUgV2luZG93cyBtZXRob2Qgb24gV2luZG93cworICAgIGRlZiBhYnNwYXRoKHBhdGgpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGFic29sdXRlIHZlcnNpb24gb2YgYSBwYXRoLiIiIgorCisgICAgICAgIGlmIHBhdGg6ICMgRW1wdHkgcGF0aCBtdXN0IHJldHVybiBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhdGggPSBfZ2V0ZnVsbHBhdGhuYW1lKHBhdGgpCisgICAgICAgICAgICBleGNlcHQgV2luZG93c0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MgIyBCYWQgcGF0aCAtIHJldHVybiB1bmNoYW5nZWQuCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShwYXRoLCB1bmljb2RlKToKKyAgICAgICAgICAgIHBhdGggPSBvcy5nZXRjd2R1KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBvcy5nZXRjd2QoKQorICAgICAgICByZXR1cm4gbm9ybXBhdGgocGF0aCkKKworIyByZWFscGF0aCBpcyBhIG5vLW9wIG9uIHN5c3RlbXMgd2l0aG91dCBpc2xpbmsgc3VwcG9ydAorcmVhbHBhdGggPSBhYnNwYXRoCisjIFdpbjl4IGZhbWlseSBhbmQgZWFybGllciBoYXZlIG5vIFVuaWNvZGUgZmlsZW5hbWUgc3VwcG9ydC4KK3N1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzID0gKGhhc2F0dHIoc3lzLCAiZ2V0d2luZG93c3ZlcnNpb24iKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5nZXR3aW5kb3dzdmVyc2lvbigpWzNdID49IDIpCisKK2RlZiBfYWJzcGF0aF9zcGxpdChwYXRoKToKKyAgICBhYnMgPSBhYnNwYXRoKG5vcm1wYXRoKHBhdGgpKQorICAgIHByZWZpeCwgcmVzdCA9IHNwbGl0dW5jKGFicykKKyAgICBpc191bmMgPSBib29sKHByZWZpeCkKKyAgICBpZiBub3QgaXNfdW5jOgorICAgICAgICBwcmVmaXgsIHJlc3QgPSBzcGxpdGRyaXZlKGFicykKKyAgICByZXR1cm4gaXNfdW5jLCBwcmVmaXgsIFt4IGZvciB4IGluIHJlc3Quc3BsaXQoc2VwKSBpZiB4XQorCitkZWYgcmVscGF0aChwYXRoLCBzdGFydD1jdXJkaXIpOgorICAgICIiIlJldHVybiBhIHJlbGF0aXZlIHZlcnNpb24gb2YgYSBwYXRoIiIiCisKKyAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm8gcGF0aCBzcGVjaWZpZWQiKQorCisgICAgc3RhcnRfaXNfdW5jLCBzdGFydF9wcmVmaXgsIHN0YXJ0X2xpc3QgPSBfYWJzcGF0aF9zcGxpdChzdGFydCkKKyAgICBwYXRoX2lzX3VuYywgcGF0aF9wcmVmaXgsIHBhdGhfbGlzdCA9IF9hYnNwYXRoX3NwbGl0KHBhdGgpCisKKyAgICBpZiBwYXRoX2lzX3VuYyBeIHN0YXJ0X2lzX3VuYzoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IG1peCBVTkMgYW5kIG5vbi1VTkMgcGF0aHMgKCVzIGFuZCAlcykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChwYXRoLCBzdGFydCkpCisgICAgaWYgcGF0aF9wcmVmaXgubG93ZXIoKSAhPSBzdGFydF9wcmVmaXgubG93ZXIoKToKKyAgICAgICAgaWYgcGF0aF9pc191bmM6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwYXRoIGlzIG9uIFVOQyByb290ICVzLCBzdGFydCBvbiBVTkMgcm9vdCAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHBhdGhfcHJlZml4LCBzdGFydF9wcmVmaXgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicGF0aCBpcyBvbiBkcml2ZSAlcywgc3RhcnQgb24gZHJpdmUgJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChwYXRoX3ByZWZpeCwgc3RhcnRfcHJlZml4KSkKKyAgICAjIFdvcmsgb3V0IGhvdyBtdWNoIG9mIHRoZSBmaWxlcGF0aCBpcyBzaGFyZWQgYnkgc3RhcnQgYW5kIHBhdGguCisgICAgaSA9IDAKKyAgICBmb3IgZTEsIGUyIGluIHppcChzdGFydF9saXN0LCBwYXRoX2xpc3QpOgorICAgICAgICBpZiBlMS5sb3dlcigpICE9IGUyLmxvd2VyKCk6CisgICAgICAgICAgICBicmVhaworICAgICAgICBpICs9IDEKKworICAgIHJlbF9saXN0ID0gW3BhcmRpcl0gKiAobGVuKHN0YXJ0X2xpc3QpLWkpICsgcGF0aF9saXN0W2k6XQorICAgIGlmIG5vdCByZWxfbGlzdDoKKyAgICAgICAgcmV0dXJuIGN1cmRpcgorICAgIHJldHVybiBqb2luKCpyZWxfbGlzdCkKKwordHJ5OgorICAgICMgVGhlIGdlbmVyaWNwYXRoLmlzZGlyIGltcGxlbWVudGF0aW9uIHVzZXMgb3Muc3RhdCBhbmQgY2hlY2tzIHRoZSBtb2RlCisgICAgIyBhdHRyaWJ1dGUgdG8gdGVsbCB3aGV0aGVyIG9yIG5vdCB0aGUgcGF0aCBpcyBhIGRpcmVjdG9yeS4KKyAgICAjIFRoaXMgaXMgb3ZlcmtpbGwgb24gV2luZG93cyAtIGp1c3QgcGFzcyB0aGUgcGF0aCB0byBHZXRGaWxlQXR0cmlidXRlcworICAgICMgYW5kIGNoZWNrIHRoZSBhdHRyaWJ1dGUgZnJvbSB0aGVyZS4KKyAgICBmcm9tIG50IGltcG9ydCBfaXNkaXIgYXMgaXNkaXIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIFVzZSBnZW5lcmljcGF0aC5pc2RpciBhcyBpbXBvcnRlZCBhYm92ZS4KKyAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L250cGF0aC5weWMgYi9saWIvcHl0aG9uMi43L250cGF0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmY2E2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbnRwYXRoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L250cGF0aC5weW8gYi9saWIvcHl0aG9uMi43L250cGF0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkYzAwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbnRwYXRoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L250dXJsMnBhdGgucHkgYi9saWIvcHl0aG9uMi43L250dXJsMnBhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlYTI3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbnR1cmwycGF0aC5weQpAQCAtMCwwICsxLDY2IEBACisiIiJDb252ZXJ0IGEgTlQgcGF0aG5hbWUgdG8gYSBmaWxlIFVSTCBhbmQgdmljZSB2ZXJzYS4iIiIKKworZGVmIHVybDJwYXRobmFtZSh1cmwpOgorICAgICIiIk9TLXNwZWNpZmljIGNvbnZlcnNpb24gZnJvbSBhIHJlbGF0aXZlIFVSTCBvZiB0aGUgJ2ZpbGUnIHNjaGVtZQorICAgIHRvIGEgZmlsZSBzeXN0ZW0gcGF0aDsgbm90IHJlY29tbWVuZGVkIGZvciBnZW5lcmFsIHVzZS4iIiIKKyAgICAjIGUuZy4KKyAgICAjIC8vL0N8L2Zvby9iYXIvc3BhbS5mb28KKyAgICAjIGJlY29tZXMKKyAgICAjIEM6XGZvb1xiYXJcc3BhbS5mb28KKyAgICBpbXBvcnQgc3RyaW5nLCB1cmxsaWIKKyAgICAjIFdpbmRvd3MgaXRzZWxmIHVzZXMgIjoiIGV2ZW4gaW4gVVJMcy4KKyAgICB1cmwgPSB1cmwucmVwbGFjZSgnOicsICd8JykKKyAgICBpZiBub3QgJ3wnIGluIHVybDoKKyAgICAgICAgIyBObyBkcml2ZSBzcGVjaWZpZXIsIGp1c3QgY29udmVydCBzbGFzaGVzCisgICAgICAgIGlmIHVybFs6NF0gPT0gJy8vLy8nOgorICAgICAgICAgICAgIyBwYXRoIGlzIHNvbWV0aGluZyBsaWtlIC8vLy9ob3N0L3BhdGgvb24vcmVtb3RlL2hvc3QKKyAgICAgICAgICAgICMgY29udmVydCB0aGlzIHRvIFxcaG9zdFxwYXRoXG9uXHJlbW90ZVxob3N0CisgICAgICAgICAgICAjIChub3RpY2UgaGFsdmluZyBvZiBzbGFzaGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgcGF0aCkKKyAgICAgICAgICAgIHVybCA9IHVybFsyOl0KKyAgICAgICAgY29tcG9uZW50cyA9IHVybC5zcGxpdCgnLycpCisgICAgICAgICMgbWFrZSBzdXJlIG5vdCB0byBjb252ZXJ0IHF1b3RlZCBzbGFzaGVzIDotKQorICAgICAgICByZXR1cm4gdXJsbGliLnVucXVvdGUoJ1xcJy5qb2luKGNvbXBvbmVudHMpKQorICAgIGNvbXAgPSB1cmwuc3BsaXQoJ3wnKQorICAgIGlmIGxlbihjb21wKSAhPSAyIG9yIGNvbXBbMF1bLTFdIG5vdCBpbiBzdHJpbmcuYXNjaWlfbGV0dGVyczoKKyAgICAgICAgZXJyb3IgPSAnQmFkIFVSTDogJyArIHVybAorICAgICAgICByYWlzZSBJT0Vycm9yLCBlcnJvcgorICAgIGRyaXZlID0gY29tcFswXVstMV0udXBwZXIoKQorICAgIHBhdGggPSBkcml2ZSArICc6JworICAgIGNvbXBvbmVudHMgPSBjb21wWzFdLnNwbGl0KCcvJykKKyAgICBmb3IgY29tcCBpbiBjb21wb25lbnRzOgorICAgICAgICBpZiBjb21wOgorICAgICAgICAgICAgcGF0aCA9IHBhdGggKyAnXFwnICsgdXJsbGliLnVucXVvdGUoY29tcCkKKyAgICAjIElzc3VlICMxMTQ3NDogdXJsIGxpa2UgJy9DfC8nIHNob3VsZCBjb252ZXJ0IGludG8gJ0M6XFwnCisgICAgaWYgcGF0aC5lbmRzd2l0aCgnOicpIGFuZCB1cmwuZW5kc3dpdGgoJy8nKToKKyAgICAgICAgcGF0aCArPSAnXFwnCisgICAgcmV0dXJuIHBhdGgKKworZGVmIHBhdGhuYW1lMnVybChwKToKKyAgICAiIiJPUy1zcGVjaWZpYyBjb252ZXJzaW9uIGZyb20gYSBmaWxlIHN5c3RlbSBwYXRoIHRvIGEgcmVsYXRpdmUgVVJMCisgICAgb2YgdGhlICdmaWxlJyBzY2hlbWU7IG5vdCByZWNvbW1lbmRlZCBmb3IgZ2VuZXJhbCB1c2UuIiIiCisgICAgIyBlLmcuCisgICAgIyBDOlxmb29cYmFyXHNwYW0uZm9vCisgICAgIyBiZWNvbWVzCisgICAgIyAvLy9DfC9mb28vYmFyL3NwYW0uZm9vCisgICAgaW1wb3J0IHVybGxpYgorICAgIGlmIG5vdCAnOicgaW4gcDoKKyAgICAgICAgIyBObyBkcml2ZSBzcGVjaWZpZXIsIGp1c3QgY29udmVydCBzbGFzaGVzIGFuZCBxdW90ZSB0aGUgbmFtZQorICAgICAgICBpZiBwWzoyXSA9PSAnXFxcXCc6CisgICAgICAgICMgcGF0aCBpcyBzb21ldGhpbmcgbGlrZSBcXGhvc3RccGF0aFxvblxyZW1vdGVcaG9zdAorICAgICAgICAjIGNvbnZlcnQgdGhpcyB0byAvLy8vaG9zdC9wYXRoL29uL3JlbW90ZS9ob3N0CisgICAgICAgICMgKG5vdGljZSBkb3VibGluZyBvZiBzbGFzaGVzIGF0IHRoZSBzdGFydCBvZiB0aGUgcGF0aCkKKyAgICAgICAgICAgIHAgPSAnXFxcXCcgKyBwCisgICAgICAgIGNvbXBvbmVudHMgPSBwLnNwbGl0KCdcXCcpCisgICAgICAgIHJldHVybiB1cmxsaWIucXVvdGUoJy8nLmpvaW4oY29tcG9uZW50cykpCisgICAgY29tcCA9IHAuc3BsaXQoJzonKQorICAgIGlmIGxlbihjb21wKSAhPSAyIG9yIGxlbihjb21wWzBdKSA+IDE6CisgICAgICAgIGVycm9yID0gJ0JhZCBwYXRoOiAnICsgcAorICAgICAgICByYWlzZSBJT0Vycm9yLCBlcnJvcgorCisgICAgZHJpdmUgPSB1cmxsaWIucXVvdGUoY29tcFswXS51cHBlcigpKQorICAgIGNvbXBvbmVudHMgPSBjb21wWzFdLnNwbGl0KCdcXCcpCisgICAgcGF0aCA9ICcvLy8nICsgZHJpdmUgKyAnOicKKyAgICBmb3IgY29tcCBpbiBjb21wb25lbnRzOgorICAgICAgICBpZiBjb21wOgorICAgICAgICAgICAgcGF0aCA9IHBhdGggKyAnLycgKyB1cmxsaWIucXVvdGUoY29tcCkKKyAgICByZXR1cm4gcGF0aApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9udHVybDJwYXRoLnB5YyBiL2xpYi9weXRob24yLjcvbnR1cmwycGF0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwMDdjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbnR1cmwycGF0aC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9udHVybDJwYXRoLnB5byBiL2xpYi9weXRob24yLjcvbnR1cmwycGF0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwMDdjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbnR1cmwycGF0aC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9udW1iZXJzLnB5IGIvbGliL3B5dGhvbjIuNy9udW1iZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzZkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L251bWJlcnMucHkKQEAgLTAsMCArMSwzOTEgQEAKKyMgQ29weXJpZ2h0IDIwMDcgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChBQkNzKSBmb3IgbnVtYmVycywgYWNjb3JkaW5nIHRvIFBFUCAzMTQxLgorCitUT0RPOiBGaWxsIG91dCBtb3JlIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb24gdGhlIG9wZXJhdG9ycy4iIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgorZnJvbSBhYmMgaW1wb3J0IEFCQ01ldGEsIGFic3RyYWN0bWV0aG9kLCBhYnN0cmFjdHByb3BlcnR5CisKK19fYWxsX18gPSBbIk51bWJlciIsICJDb21wbGV4IiwgIlJlYWwiLCAiUmF0aW9uYWwiLCAiSW50ZWdyYWwiXQorCitjbGFzcyBOdW1iZXIob2JqZWN0KToKKyAgICAiIiJBbGwgbnVtYmVycyBpbmhlcml0IGZyb20gdGhpcyBjbGFzcy4KKworICAgIElmIHlvdSBqdXN0IHdhbnQgdG8gY2hlY2sgaWYgYW4gYXJndW1lbnQgeCBpcyBhIG51bWJlciwgd2l0aG91dAorICAgIGNhcmluZyB3aGF0IGtpbmQsIHVzZSBpc2luc3RhbmNlKHgsIE51bWJlcikuCisgICAgIiIiCisgICAgX19tZXRhY2xhc3NfXyA9IEFCQ01ldGEKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgIyBDb25jcmV0ZSBudW1lcmljIHR5cGVzIG11c3QgcHJvdmlkZSB0aGVpciBvd24gaGFzaCBpbXBsZW1lbnRhdGlvbgorICAgIF9faGFzaF9fID0gTm9uZQorCisKKyMjIE5vdGVzIG9uIERlY2ltYWwKKyMjIC0tLS0tLS0tLS0tLS0tLS0KKyMjIERlY2ltYWwgaGFzIGFsbCBvZiB0aGUgbWV0aG9kcyBzcGVjaWZpZWQgYnkgdGhlIFJlYWwgYWJjLCBidXQgaXQgc2hvdWxkCisjIyBub3QgYmUgcmVnaXN0ZXJlZCBhcyBhIFJlYWwgYmVjYXVzZSBkZWNpbWFscyBkbyBub3QgaW50ZXJvcGVyYXRlIHdpdGgKKyMjIGJpbmFyeSBmbG9hdHMgKGkuZS4gIERlY2ltYWwoJzMuMTQnKSArIDIuNzE4MjggaXMgdW5kZWZpbmVkKS4gIEJ1dCwKKyMjIGFic3RyYWN0IHJlYWxzIGFyZSBleHBlY3RlZCB0byBpbnRlcm9wZXJhdGUgKGkuZS4gUjEgKyBSMiBzaG91bGQgYmUKKyMjIGV4cGVjdGVkIHRvIHdvcmsgaWYgUjEgYW5kIFIyIGFyZSBib3RoIFJlYWxzKS4KKworY2xhc3MgQ29tcGxleChOdW1iZXIpOgorICAgICIiIkNvbXBsZXggZGVmaW5lcyB0aGUgb3BlcmF0aW9ucyB0aGF0IHdvcmsgb24gdGhlIGJ1aWx0aW4gY29tcGxleCB0eXBlLgorCisgICAgSW4gc2hvcnQsIHRob3NlIGFyZTogYSBjb252ZXJzaW9uIHRvIGNvbXBsZXgsIC5yZWFsLCAuaW1hZywgKywgLSwKKyAgICAqLCAvLCBhYnMoKSwgLmNvbmp1Z2F0ZSwgPT0sIGFuZCAhPS4KKworICAgIElmIGl0IGlzIGdpdmVuIGhldGVyb2dlbm91cyBhcmd1bWVudHMsIGFuZCBkb2Vzbid0IGhhdmUgc3BlY2lhbAorICAgIGtub3dsZWRnZSBhYm91dCB0aGVtLCBpdCBzaG91bGQgZmFsbCBiYWNrIHRvIHRoZSBidWlsdGluIGNvbXBsZXgKKyAgICB0eXBlIGFzIGRlc2NyaWJlZCBiZWxvdy4KKyAgICAiIiIKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19jb21wbGV4X18oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGJ1aWx0aW4gY29tcGxleCBpbnN0YW5jZS4gQ2FsbGVkIGZvciBjb21wbGV4KHNlbGYpLiIiIgorCisgICAgIyBXaWxsIGJlIF9fYm9vbF9fIGluIDMuMC4KKyAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICIiIlRydWUgaWYgc2VsZiAhPSAwLiBDYWxsZWQgZm9yIGJvb2woc2VsZikuIiIiCisgICAgICAgIHJldHVybiBzZWxmICE9IDAKKworICAgIEBhYnN0cmFjdHByb3BlcnR5CisgICAgZGVmIHJlYWwoc2VsZik6CisgICAgICAgICIiIlJldHJpZXZlIHRoZSByZWFsIGNvbXBvbmVudCBvZiB0aGlzIG51bWJlci4KKworICAgICAgICBUaGlzIHNob3VsZCBzdWJjbGFzcyBSZWFsLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0cHJvcGVydHkKKyAgICBkZWYgaW1hZyhzZWxmKToKKyAgICAgICAgIiIiUmV0cmlldmUgdGhlIGltYWdpbmFyeSBjb21wb25lbnQgb2YgdGhpcyBudW1iZXIuCisKKyAgICAgICAgVGhpcyBzaG91bGQgc3ViY2xhc3MgUmVhbC4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIic2VsZiArIG90aGVyIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIm90aGVyICsgc2VsZiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19uZWdfXyhzZWxmKToKKyAgICAgICAgIiIiLXNlbGYiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcG9zX18oc2VsZik6CisgICAgICAgICIiIitzZWxmIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIic2VsZiAtIG90aGVyIiIiCisgICAgICAgIHJldHVybiBzZWxmICsgLW90aGVyCisKKyAgICBkZWYgX19yc3ViX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJvdGhlciAtIHNlbGYiIiIKKyAgICAgICAgcmV0dXJuIC1zZWxmICsgb3RoZXIKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX211bF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIic2VsZiAqIG90aGVyIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3JtdWxfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIm90aGVyICogc2VsZiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19kaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiInNlbGYgLyBvdGhlciB3aXRob3V0IF9fZnV0dXJlX18gZGl2aXNpb24KKworICAgICAgICBNYXkgcHJvbW90ZSB0byBmbG9hdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3JkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIm90aGVyIC8gc2VsZiB3aXRob3V0IF9fZnV0dXJlX18gZGl2aXNpb24iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIic2VsZiAvIG90aGVyIHdpdGggX19mdXR1cmVfXyBkaXZpc2lvbi4KKworICAgICAgICBTaG91bGQgcHJvbW90ZSB0byBmbG9hdCB3aGVuIG5lY2Vzc2FyeS4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJvdGhlciAvIHNlbGYgd2l0aCBfX2Z1dHVyZV9fIGRpdmlzaW9uIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3Bvd19fKHNlbGYsIGV4cG9uZW50KToKKyAgICAgICAgIiIic2VsZioqZXhwb25lbnQ7IHNob3VsZCBwcm9tb3RlIHRvIGZsb2F0IG9yIGNvbXBsZXggd2hlbiBuZWNlc3NhcnkuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3Jwb3dfXyhzZWxmLCBiYXNlKToKKyAgICAgICAgIiIiYmFzZSAqKiBzZWxmIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2Fic19fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBSZWFsIGRpc3RhbmNlIGZyb20gMC4gQ2FsbGVkIGZvciBhYnMoc2VsZikuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBjb25qdWdhdGUoc2VsZik6CisgICAgICAgICIiIih4K3kqaSkuY29uanVnYXRlKCkgcmV0dXJucyAoeC15KmkpLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIic2VsZiA9PSBvdGhlciIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIic2VsZiAhPSBvdGhlciIiIgorICAgICAgICAjIFRoZSBkZWZhdWx0IF9fbmVfXyBkb2Vzbid0IG5lZ2F0ZSBfX2VxX18gdW50aWwgMy4wLgorICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCitDb21wbGV4LnJlZ2lzdGVyKGNvbXBsZXgpCisKKworY2xhc3MgUmVhbChDb21wbGV4KToKKyAgICAiIiJUbyBDb21wbGV4LCBSZWFsIGFkZHMgdGhlIG9wZXJhdGlvbnMgdGhhdCB3b3JrIG9uIHJlYWwgbnVtYmVycy4KKworICAgIEluIHNob3J0LCB0aG9zZSBhcmU6IGEgY29udmVyc2lvbiB0byBmbG9hdCwgdHJ1bmMoKSwgZGl2bW9kLAorICAgICUsIDwsIDw9LCA+LCBhbmQgPj0uCisKKyAgICBSZWFsIGFsc28gcHJvdmlkZXMgZGVmYXVsdHMgZm9yIHRoZSBkZXJpdmVkIG9wZXJhdGlvbnMuCisgICAgIiIiCisKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgIiIiQW55IFJlYWwgY2FuIGJlIGNvbnZlcnRlZCB0byBhIG5hdGl2ZSBmbG9hdCBvYmplY3QuCisKKyAgICAgICAgQ2FsbGVkIGZvciBmbG9hdChzZWxmKS4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fdHJ1bmNfXyhzZWxmKToKKyAgICAgICAgIiIidHJ1bmMoc2VsZik6IFRydW5jYXRlcyBzZWxmIHRvIGFuIEludGVncmFsLgorCisgICAgICAgIFJldHVybnMgYW4gSW50ZWdyYWwgaSBzdWNoIHRoYXQ6CisgICAgICAgICAgKiBpPjAgaWZmIHNlbGY+MDsKKyAgICAgICAgICAqIGFicyhpKSA8PSBhYnMoc2VsZik7CisgICAgICAgICAgKiBmb3IgYW55IEludGVncmFsIGogc2F0aXNmeWluZyB0aGUgZmlyc3QgdHdvIGNvbmRpdGlvbnMsCisgICAgICAgICAgICBhYnMoaSkgPj0gYWJzKGopIFtpLmUuIGkgaGFzICJtYXhpbWFsIiBhYnMgYW1vbmcgdGhvc2VdLgorICAgICAgICBpLmUuICJ0cnVuY2F0ZSB0b3dhcmRzIDAiLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIF9fZGl2bW9kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJkaXZtb2Qoc2VsZiwgb3RoZXIpOiBUaGUgcGFpciAoc2VsZiAvLyBvdGhlciwgc2VsZiAlIG90aGVyKS4KKworICAgICAgICBTb21ldGltZXMgdGhpcyBjYW4gYmUgY29tcHV0ZWQgZmFzdGVyIHRoYW4gdGhlIHBhaXIgb2YKKyAgICAgICAgb3BlcmF0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAoc2VsZiAvLyBvdGhlciwgc2VsZiAlIG90aGVyKQorCisgICAgZGVmIF9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiZGl2bW9kKG90aGVyLCBzZWxmKTogVGhlIHBhaXIgKHNlbGYgLy8gb3RoZXIsIHNlbGYgJSBvdGhlcikuCisKKyAgICAgICAgU29tZXRpbWVzIHRoaXMgY2FuIGJlIGNvbXB1dGVkIGZhc3RlciB0aGFuIHRoZSBwYWlyIG9mCisgICAgICAgIG9wZXJhdGlvbnMuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gKG90aGVyIC8vIHNlbGYsIG90aGVyICUgc2VsZikKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJzZWxmIC8vIG90aGVyOiBUaGUgZmxvb3IoKSBvZiBzZWxmL290aGVyLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIm90aGVyIC8vIHNlbGY6IFRoZSBmbG9vcigpIG9mIG90aGVyL3NlbGYuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX21vZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIic2VsZiAlIG90aGVyIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3Jtb2RfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIm90aGVyICUgc2VsZiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIic2VsZiA8IG90aGVyCisKKyAgICAgICAgPCBvbiBSZWFscyBkZWZpbmVzIGEgdG90YWwgb3JkZXJpbmcsIGV4Y2VwdCBwZXJoYXBzIGZvciBOYU4uIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJzZWxmIDw9IG90aGVyIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgICMgQ29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIENvbXBsZXggYWJzdHJhY3QgbWV0aG9kcy4KKyAgICBkZWYgX19jb21wbGV4X18oc2VsZik6CisgICAgICAgICIiImNvbXBsZXgoc2VsZikgPT0gY29tcGxleChmbG9hdChzZWxmKSwgMCkiIiIKKyAgICAgICAgcmV0dXJuIGNvbXBsZXgoZmxvYXQoc2VsZikpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcmVhbChzZWxmKToKKyAgICAgICAgIiIiUmVhbCBudW1iZXJzIGFyZSB0aGVpciByZWFsIGNvbXBvbmVudC4iIiIKKyAgICAgICAgcmV0dXJuICtzZWxmCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgaW1hZyhzZWxmKToKKyAgICAgICAgIiIiUmVhbCBudW1iZXJzIGhhdmUgbm8gaW1hZ2luYXJ5IGNvbXBvbmVudC4iIiIKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBjb25qdWdhdGUoc2VsZik6CisgICAgICAgICIiIkNvbmp1Z2F0ZSBpcyBhIG5vLW9wIGZvciBSZWFscy4iIiIKKyAgICAgICAgcmV0dXJuICtzZWxmCisKK1JlYWwucmVnaXN0ZXIoZmxvYXQpCisKKworY2xhc3MgUmF0aW9uYWwoUmVhbCk6CisgICAgIiIiLm51bWVyYXRvciBhbmQgLmRlbm9taW5hdG9yIHNob3VsZCBiZSBpbiBsb3dlc3QgdGVybXMuIiIiCisKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgQGFic3RyYWN0cHJvcGVydHkKKyAgICBkZWYgbnVtZXJhdG9yKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3Rwcm9wZXJ0eQorICAgIGRlZiBkZW5vbWluYXRvcihzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgIyBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBSZWFsJ3MgY29udmVyc2lvbiB0byBmbG9hdC4KKyAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAiIiJmbG9hdChzZWxmKSA9IHNlbGYubnVtZXJhdG9yIC8gc2VsZi5kZW5vbWluYXRvcgorCisgICAgICAgIEl0J3MgaW1wb3J0YW50IHRoYXQgdGhpcyBjb252ZXJzaW9uIHVzZSB0aGUgaW50ZWdlcidzICJ0cnVlIgorICAgICAgICBkaXZpc2lvbiByYXRoZXIgdGhhbiBjYXN0aW5nIG9uZSBzaWRlIHRvIGZsb2F0IGJlZm9yZSBkaXZpZGluZworICAgICAgICBzbyB0aGF0IHJhdGlvcyBvZiBodWdlIGludGVnZXJzIGNvbnZlcnQgd2l0aG91dCBvdmVyZmxvd2luZy4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYubnVtZXJhdG9yIC8gc2VsZi5kZW5vbWluYXRvcgorCisKK2NsYXNzIEludGVncmFsKFJhdGlvbmFsKToKKyAgICAiIiJJbnRlZ3JhbCBhZGRzIGEgY29udmVyc2lvbiB0byBsb25nIGFuZCB0aGUgYml0LXN0cmluZyBvcGVyYXRpb25zLiIiIgorCisgICAgX19zbG90c19fID0gKCkKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2xvbmdfXyhzZWxmKToKKyAgICAgICAgIiIibG9uZyhzZWxmKSIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICAiIiJDYWxsZWQgd2hlbmV2ZXIgYW4gaW5kZXggaXMgbmVlZGVkLCBzdWNoIGFzIGluIHNsaWNpbmciIiIKKyAgICAgICAgcmV0dXJuIGxvbmcoc2VsZikKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3Bvd19fKHNlbGYsIGV4cG9uZW50LCBtb2R1bHVzPU5vbmUpOgorICAgICAgICAiIiJzZWxmICoqIGV4cG9uZW50ICUgbW9kdWx1cywgYnV0IG1heWJlIGZhc3Rlci4KKworICAgICAgICBBY2NlcHQgdGhlIG1vZHVsdXMgYXJndW1lbnQgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCB0aGUKKyAgICAgICAgMy1hcmd1bWVudCB2ZXJzaW9uIG9mIHBvdygpLiBSYWlzZSBhIFR5cGVFcnJvciBpZiBleHBvbmVudCA8IDAKKyAgICAgICAgb3IgYW55IGFyZ3VtZW50IGlzbid0IEludGVncmFsLiBPdGhlcndpc2UsIGp1c3QgaW1wbGVtZW50IHRoZQorICAgICAgICAyLWFyZ3VtZW50IHZlcnNpb24gZGVzY3JpYmVkIGluIENvbXBsZXguCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19sc2hpZnRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiInNlbGYgPDwgb3RoZXIiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcmxzaGlmdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIib3RoZXIgPDwgc2VsZiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19yc2hpZnRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiInNlbGYgPj4gb3RoZXIiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcnJzaGlmdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIib3RoZXIgPj4gc2VsZiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiInNlbGYgJiBvdGhlciIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19yYW5kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJvdGhlciAmIHNlbGYiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9feG9yX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJzZWxmIF4gb3RoZXIiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcnhvcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIib3RoZXIgXiBzZWxmIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX29yX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJzZWxmIHwgb3RoZXIiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcm9yX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJvdGhlciB8IHNlbGYiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9faW52ZXJ0X18oc2VsZik6CisgICAgICAgICIiIn5zZWxmIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgICMgQ29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIFJhdGlvbmFsIGFuZCBSZWFsIGFic3RyYWN0IG1ldGhvZHMuCisgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgIiIiZmxvYXQoc2VsZikgPT0gZmxvYXQobG9uZyhzZWxmKSkiIiIKKyAgICAgICAgcmV0dXJuIGZsb2F0KGxvbmcoc2VsZikpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbnVtZXJhdG9yKHNlbGYpOgorICAgICAgICAiIiJJbnRlZ2VycyBhcmUgdGhlaXIgb3duIG51bWVyYXRvcnMuIiIiCisgICAgICAgIHJldHVybiArc2VsZgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRlbm9taW5hdG9yKHNlbGYpOgorICAgICAgICAiIiJJbnRlZ2VycyBoYXZlIGEgZGVub21pbmF0b3Igb2YgMS4iIiIKKyAgICAgICAgcmV0dXJuIDEKKworSW50ZWdyYWwucmVnaXN0ZXIoaW50KQorSW50ZWdyYWwucmVnaXN0ZXIobG9uZykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbnVtYmVycy5weWMgYi9saWIvcHl0aG9uMi43L251bWJlcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MjU5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L251bWJlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbnVtYmVycy5weW8gYi9saWIvcHl0aG9uMi43L251bWJlcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MjU5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L251bWJlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvb3Bjb2RlLnB5IGIvbGliL3B5dGhvbjIuNy9vcGNvZGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwMzM2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvb3Bjb2RlLnB5CkBAIC0wLDAgKzEsMTkyIEBACisKKyIiIgorb3Bjb2RlIG1vZHVsZSAtIHBvdGVudGlhbGx5IHNoYXJlZCBiZXR3ZWVuIGRpcyBhbmQgb3RoZXIgbW9kdWxlcyB3aGljaAorb3BlcmF0ZSBvbiBieXRlY29kZXMgKGUuZy4gcGVlcGhvbGUgb3B0aW1pemVycykuCisiIiIKKworX19hbGxfXyA9IFsiY21wX29wIiwgImhhc2NvbnN0IiwgImhhc25hbWUiLCAiaGFzanJlbCIsICJoYXNqYWJzIiwKKyAgICAgICAgICAgImhhc2xvY2FsIiwgImhhc2NvbXBhcmUiLCAiaGFzZnJlZSIsICJvcG5hbWUiLCAib3BtYXAiLAorICAgICAgICAgICAiSEFWRV9BUkdVTUVOVCIsICJFWFRFTkRFRF9BUkciXQorCitjbXBfb3AgPSAoJzwnLCAnPD0nLCAnPT0nLCAnIT0nLCAnPicsICc+PScsICdpbicsICdub3QgaW4nLCAnaXMnLAorICAgICAgICAnaXMgbm90JywgJ2V4Y2VwdGlvbiBtYXRjaCcsICdCQUQnKQorCitoYXNjb25zdCA9IFtdCitoYXNuYW1lID0gW10KK2hhc2pyZWwgPSBbXQoraGFzamFicyA9IFtdCitoYXNsb2NhbCA9IFtdCitoYXNjb21wYXJlID0gW10KK2hhc2ZyZWUgPSBbXQorCitvcG1hcCA9IHt9CitvcG5hbWUgPSBbJyddICogMjU2Citmb3Igb3AgaW4gcmFuZ2UoMjU2KTogb3BuYW1lW29wXSA9ICc8JXI+JyAlIChvcCwpCitkZWwgb3AKKworZGVmIGRlZl9vcChuYW1lLCBvcCk6CisgICAgb3BuYW1lW29wXSA9IG5hbWUKKyAgICBvcG1hcFtuYW1lXSA9IG9wCisKK2RlZiBuYW1lX29wKG5hbWUsIG9wKToKKyAgICBkZWZfb3AobmFtZSwgb3ApCisgICAgaGFzbmFtZS5hcHBlbmQob3ApCisKK2RlZiBqcmVsX29wKG5hbWUsIG9wKToKKyAgICBkZWZfb3AobmFtZSwgb3ApCisgICAgaGFzanJlbC5hcHBlbmQob3ApCisKK2RlZiBqYWJzX29wKG5hbWUsIG9wKToKKyAgICBkZWZfb3AobmFtZSwgb3ApCisgICAgaGFzamFicy5hcHBlbmQob3ApCisKKyMgSW5zdHJ1Y3Rpb24gb3Bjb2RlcyBmb3IgY29tcGlsZWQgY29kZQorIyBCbGFuayBsaW5lcyBjb3JyZXNwb25kIHRvIGF2YWlsYWJsZSBvcGNvZGVzCisKK2RlZl9vcCgnU1RPUF9DT0RFJywgMCkKK2RlZl9vcCgnUE9QX1RPUCcsIDEpCitkZWZfb3AoJ1JPVF9UV08nLCAyKQorZGVmX29wKCdST1RfVEhSRUUnLCAzKQorZGVmX29wKCdEVVBfVE9QJywgNCkKK2RlZl9vcCgnUk9UX0ZPVVInLCA1KQorCitkZWZfb3AoJ05PUCcsIDkpCitkZWZfb3AoJ1VOQVJZX1BPU0lUSVZFJywgMTApCitkZWZfb3AoJ1VOQVJZX05FR0FUSVZFJywgMTEpCitkZWZfb3AoJ1VOQVJZX05PVCcsIDEyKQorZGVmX29wKCdVTkFSWV9DT05WRVJUJywgMTMpCisKK2RlZl9vcCgnVU5BUllfSU5WRVJUJywgMTUpCisKK2RlZl9vcCgnQklOQVJZX1BPV0VSJywgMTkpCitkZWZfb3AoJ0JJTkFSWV9NVUxUSVBMWScsIDIwKQorZGVmX29wKCdCSU5BUllfRElWSURFJywgMjEpCitkZWZfb3AoJ0JJTkFSWV9NT0RVTE8nLCAyMikKK2RlZl9vcCgnQklOQVJZX0FERCcsIDIzKQorZGVmX29wKCdCSU5BUllfU1VCVFJBQ1QnLCAyNCkKK2RlZl9vcCgnQklOQVJZX1NVQlNDUicsIDI1KQorZGVmX29wKCdCSU5BUllfRkxPT1JfRElWSURFJywgMjYpCitkZWZfb3AoJ0JJTkFSWV9UUlVFX0RJVklERScsIDI3KQorZGVmX29wKCdJTlBMQUNFX0ZMT09SX0RJVklERScsIDI4KQorZGVmX29wKCdJTlBMQUNFX1RSVUVfRElWSURFJywgMjkpCitkZWZfb3AoJ1NMSUNFKzAnLCAzMCkKK2RlZl9vcCgnU0xJQ0UrMScsIDMxKQorZGVmX29wKCdTTElDRSsyJywgMzIpCitkZWZfb3AoJ1NMSUNFKzMnLCAzMykKKworZGVmX29wKCdTVE9SRV9TTElDRSswJywgNDApCitkZWZfb3AoJ1NUT1JFX1NMSUNFKzEnLCA0MSkKK2RlZl9vcCgnU1RPUkVfU0xJQ0UrMicsIDQyKQorZGVmX29wKCdTVE9SRV9TTElDRSszJywgNDMpCisKK2RlZl9vcCgnREVMRVRFX1NMSUNFKzAnLCA1MCkKK2RlZl9vcCgnREVMRVRFX1NMSUNFKzEnLCA1MSkKK2RlZl9vcCgnREVMRVRFX1NMSUNFKzInLCA1MikKK2RlZl9vcCgnREVMRVRFX1NMSUNFKzMnLCA1MykKKworZGVmX29wKCdTVE9SRV9NQVAnLCA1NCkKK2RlZl9vcCgnSU5QTEFDRV9BREQnLCA1NSkKK2RlZl9vcCgnSU5QTEFDRV9TVUJUUkFDVCcsIDU2KQorZGVmX29wKCdJTlBMQUNFX01VTFRJUExZJywgNTcpCitkZWZfb3AoJ0lOUExBQ0VfRElWSURFJywgNTgpCitkZWZfb3AoJ0lOUExBQ0VfTU9EVUxPJywgNTkpCitkZWZfb3AoJ1NUT1JFX1NVQlNDUicsIDYwKQorZGVmX29wKCdERUxFVEVfU1VCU0NSJywgNjEpCitkZWZfb3AoJ0JJTkFSWV9MU0hJRlQnLCA2MikKK2RlZl9vcCgnQklOQVJZX1JTSElGVCcsIDYzKQorZGVmX29wKCdCSU5BUllfQU5EJywgNjQpCitkZWZfb3AoJ0JJTkFSWV9YT1InLCA2NSkKK2RlZl9vcCgnQklOQVJZX09SJywgNjYpCitkZWZfb3AoJ0lOUExBQ0VfUE9XRVInLCA2NykKK2RlZl9vcCgnR0VUX0lURVInLCA2OCkKKworZGVmX29wKCdQUklOVF9FWFBSJywgNzApCitkZWZfb3AoJ1BSSU5UX0lURU0nLCA3MSkKK2RlZl9vcCgnUFJJTlRfTkVXTElORScsIDcyKQorZGVmX29wKCdQUklOVF9JVEVNX1RPJywgNzMpCitkZWZfb3AoJ1BSSU5UX05FV0xJTkVfVE8nLCA3NCkKK2RlZl9vcCgnSU5QTEFDRV9MU0hJRlQnLCA3NSkKK2RlZl9vcCgnSU5QTEFDRV9SU0hJRlQnLCA3NikKK2RlZl9vcCgnSU5QTEFDRV9BTkQnLCA3NykKK2RlZl9vcCgnSU5QTEFDRV9YT1InLCA3OCkKK2RlZl9vcCgnSU5QTEFDRV9PUicsIDc5KQorZGVmX29wKCdCUkVBS19MT09QJywgODApCitkZWZfb3AoJ1dJVEhfQ0xFQU5VUCcsIDgxKQorZGVmX29wKCdMT0FEX0xPQ0FMUycsIDgyKQorZGVmX29wKCdSRVRVUk5fVkFMVUUnLCA4MykKK2RlZl9vcCgnSU1QT1JUX1NUQVInLCA4NCkKK2RlZl9vcCgnRVhFQ19TVE1UJywgODUpCitkZWZfb3AoJ1lJRUxEX1ZBTFVFJywgODYpCitkZWZfb3AoJ1BPUF9CTE9DSycsIDg3KQorZGVmX29wKCdFTkRfRklOQUxMWScsIDg4KQorZGVmX29wKCdCVUlMRF9DTEFTUycsIDg5KQorCitIQVZFX0FSR1VNRU5UID0gOTAgICAgICAgICAgICAgICMgT3Bjb2RlcyBmcm9tIGhlcmUgaGF2ZSBhbiBhcmd1bWVudDoKKworbmFtZV9vcCgnU1RPUkVfTkFNRScsIDkwKSAgICAgICAjIEluZGV4IGluIG5hbWUgbGlzdAorbmFtZV9vcCgnREVMRVRFX05BTUUnLCA5MSkgICAgICAjICIiCitkZWZfb3AoJ1VOUEFDS19TRVFVRU5DRScsIDkyKSAgICMgTnVtYmVyIG9mIHR1cGxlIGl0ZW1zCitqcmVsX29wKCdGT1JfSVRFUicsIDkzKQorZGVmX29wKCdMSVNUX0FQUEVORCcsIDk0KQorbmFtZV9vcCgnU1RPUkVfQVRUUicsIDk1KSAgICAgICAjIEluZGV4IGluIG5hbWUgbGlzdAorbmFtZV9vcCgnREVMRVRFX0FUVFInLCA5NikgICAgICAjICIiCituYW1lX29wKCdTVE9SRV9HTE9CQUwnLCA5NykgICAgICMgIiIKK25hbWVfb3AoJ0RFTEVURV9HTE9CQUwnLCA5OCkgICAgIyAiIgorZGVmX29wKCdEVVBfVE9QWCcsIDk5KSAgICAgICAgICAjIG51bWJlciBvZiBpdGVtcyB0byBkdXBsaWNhdGUKK2RlZl9vcCgnTE9BRF9DT05TVCcsIDEwMCkgICAgICAgIyBJbmRleCBpbiBjb25zdCBsaXN0CitoYXNjb25zdC5hcHBlbmQoMTAwKQorbmFtZV9vcCgnTE9BRF9OQU1FJywgMTAxKSAgICAgICAjIEluZGV4IGluIG5hbWUgbGlzdAorZGVmX29wKCdCVUlMRF9UVVBMRScsIDEwMikgICAgICAjIE51bWJlciBvZiB0dXBsZSBpdGVtcworZGVmX29wKCdCVUlMRF9MSVNUJywgMTAzKSAgICAgICAjIE51bWJlciBvZiBsaXN0IGl0ZW1zCitkZWZfb3AoJ0JVSUxEX1NFVCcsIDEwNCkgICAgICAgICMgTnVtYmVyIG9mIHNldCBpdGVtcworZGVmX29wKCdCVUlMRF9NQVAnLCAxMDUpICAgICAgICAjIE51bWJlciBvZiBkaWN0IGVudHJpZXMgKHVwdG8gMjU1KQorbmFtZV9vcCgnTE9BRF9BVFRSJywgMTA2KSAgICAgICAjIEluZGV4IGluIG5hbWUgbGlzdAorZGVmX29wKCdDT01QQVJFX09QJywgMTA3KSAgICAgICAjIENvbXBhcmlzb24gb3BlcmF0b3IKK2hhc2NvbXBhcmUuYXBwZW5kKDEwNykKK25hbWVfb3AoJ0lNUE9SVF9OQU1FJywgMTA4KSAgICAgIyBJbmRleCBpbiBuYW1lIGxpc3QKK25hbWVfb3AoJ0lNUE9SVF9GUk9NJywgMTA5KSAgICAgIyBJbmRleCBpbiBuYW1lIGxpc3QKK2pyZWxfb3AoJ0pVTVBfRk9SV0FSRCcsIDExMCkgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gc2tpcAoramFic19vcCgnSlVNUF9JRl9GQUxTRV9PUl9QT1AnLCAxMTEpICMgVGFyZ2V0IGJ5dGUgb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIGNvZGUKK2phYnNfb3AoJ0pVTVBfSUZfVFJVRV9PUl9QT1AnLCAxMTIpICAjICIiCitqYWJzX29wKCdKVU1QX0FCU09MVVRFJywgMTEzKSAgICAgICAgIyAiIgoramFic19vcCgnUE9QX0pVTVBfSUZfRkFMU0UnLCAxMTQpICAgICMgIiIKK2phYnNfb3AoJ1BPUF9KVU1QX0lGX1RSVUUnLCAxMTUpICAgICAjICIiCisKK25hbWVfb3AoJ0xPQURfR0xPQkFMJywgMTE2KSAgICAgIyBJbmRleCBpbiBuYW1lIGxpc3QKKworamFic19vcCgnQ09OVElOVUVfTE9PUCcsIDExOSkgICAjIFRhcmdldCBhZGRyZXNzCitqcmVsX29wKCdTRVRVUF9MT09QJywgMTIwKSAgICAgICMgRGlzdGFuY2UgdG8gdGFyZ2V0IGFkZHJlc3MKK2pyZWxfb3AoJ1NFVFVQX0VYQ0VQVCcsIDEyMSkgICAgIyAiIgoranJlbF9vcCgnU0VUVVBfRklOQUxMWScsIDEyMikgICAjICIiCisKK2RlZl9vcCgnTE9BRF9GQVNUJywgMTI0KSAgICAgICAgIyBMb2NhbCB2YXJpYWJsZSBudW1iZXIKK2hhc2xvY2FsLmFwcGVuZCgxMjQpCitkZWZfb3AoJ1NUT1JFX0ZBU1QnLCAxMjUpICAgICAgICMgTG9jYWwgdmFyaWFibGUgbnVtYmVyCitoYXNsb2NhbC5hcHBlbmQoMTI1KQorZGVmX29wKCdERUxFVEVfRkFTVCcsIDEyNikgICAgICAjIExvY2FsIHZhcmlhYmxlIG51bWJlcgoraGFzbG9jYWwuYXBwZW5kKDEyNikKKworZGVmX29wKCdSQUlTRV9WQVJBUkdTJywgMTMwKSAgICAjIE51bWJlciBvZiByYWlzZSBhcmd1bWVudHMgKDEsIDIsIG9yIDMpCitkZWZfb3AoJ0NBTExfRlVOQ1RJT04nLCAxMzEpICAgICMgI2FyZ3MgKyAoI2t3YXJncyA8PCA4KQorZGVmX29wKCdNQUtFX0ZVTkNUSU9OJywgMTMyKSAgICAjIE51bWJlciBvZiBhcmdzIHdpdGggZGVmYXVsdCB2YWx1ZXMKK2RlZl9vcCgnQlVJTERfU0xJQ0UnLCAxMzMpICAgICAgIyBOdW1iZXIgb2YgaXRlbXMKK2RlZl9vcCgnTUFLRV9DTE9TVVJFJywgMTM0KQorZGVmX29wKCdMT0FEX0NMT1NVUkUnLCAxMzUpCitoYXNmcmVlLmFwcGVuZCgxMzUpCitkZWZfb3AoJ0xPQURfREVSRUYnLCAxMzYpCitoYXNmcmVlLmFwcGVuZCgxMzYpCitkZWZfb3AoJ1NUT1JFX0RFUkVGJywgMTM3KQoraGFzZnJlZS5hcHBlbmQoMTM3KQorCitkZWZfb3AoJ0NBTExfRlVOQ1RJT05fVkFSJywgMTQwKSAgICAgIyAjYXJncyArICgja3dhcmdzIDw8IDgpCitkZWZfb3AoJ0NBTExfRlVOQ1RJT05fS1cnLCAxNDEpICAgICAgIyAjYXJncyArICgja3dhcmdzIDw8IDgpCitkZWZfb3AoJ0NBTExfRlVOQ1RJT05fVkFSX0tXJywgMTQyKSAgIyAjYXJncyArICgja3dhcmdzIDw8IDgpCisKK2pyZWxfb3AoJ1NFVFVQX1dJVEgnLCAxNDMpCisKK2RlZl9vcCgnRVhURU5ERURfQVJHJywgMTQ1KQorRVhURU5ERURfQVJHID0gMTQ1CitkZWZfb3AoJ1NFVF9BREQnLCAxNDYpCitkZWZfb3AoJ01BUF9BREQnLCAxNDcpCisKK2RlbCBkZWZfb3AsIG5hbWVfb3AsIGpyZWxfb3AsIGphYnNfb3AKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvb3Bjb2RlLnB5YyBiL2xpYi9weXRob24yLjcvb3Bjb2RlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRiN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9vcGNvZGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvb3Bjb2RlLnB5byBiL2xpYi9weXRob24yLjcvb3Bjb2RlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRiN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9vcGNvZGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvb3B0cGFyc2UucHkgYi9saWIvcHl0aG9uMi43L29wdHBhcnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMWEyYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L29wdHBhcnNlLnB5CkBAIC0wLDAgKzEsMTcwMyBAQAorIiIiQSBwb3dlcmZ1bCwgZXh0ZW5zaWJsZSwgYW5kIGVhc3ktdG8tdXNlIG9wdGlvbiBwYXJzZXIuCisKK0J5IEdyZWcgV2FyZCA8Z3dhcmRAcHl0aG9uLm5ldD4KKworT3JpZ2luYWxseSBkaXN0cmlidXRlZCBhcyBPcHRpay4KKworRm9yIHN1cHBvcnQsIHVzZSB0aGUgb3B0aWstdXNlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0IG1haWxpbmcgbGlzdAorKGh0dHA6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vb3B0aWstdXNlcnMpLgorCitTaW1wbGUgdXNhZ2UgZXhhbXBsZToKKworICAgZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCisKKyAgIHBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICBwYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1maWxlIiwgZGVzdD0iZmlsZW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgaGVscD0id3JpdGUgcmVwb3J0IHRvIEZJTEUiLCBtZXRhdmFyPSJGSUxFIikKKyAgIHBhcnNlci5hZGRfb3B0aW9uKCItcSIsICItLXF1aWV0IiwKKyAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJ2ZXJib3NlIiwgZGVmYXVsdD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgaGVscD0iZG9uJ3QgcHJpbnQgc3RhdHVzIG1lc3NhZ2VzIHRvIHN0ZG91dCIpCisKKyAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyIiIgorCitfX3ZlcnNpb25fXyA9ICIxLjUuMyIKKworX19hbGxfXyA9IFsnT3B0aW9uJywKKyAgICAgICAgICAgJ21ha2Vfb3B0aW9uJywKKyAgICAgICAgICAgJ1NVUFBSRVNTX0hFTFAnLAorICAgICAgICAgICAnU1VQUFJFU1NfVVNBR0UnLAorICAgICAgICAgICAnVmFsdWVzJywKKyAgICAgICAgICAgJ09wdGlvbkNvbnRhaW5lcicsCisgICAgICAgICAgICdPcHRpb25Hcm91cCcsCisgICAgICAgICAgICdPcHRpb25QYXJzZXInLAorICAgICAgICAgICAnSGVscEZvcm1hdHRlcicsCisgICAgICAgICAgICdJbmRlbnRlZEhlbHBGb3JtYXR0ZXInLAorICAgICAgICAgICAnVGl0bGVkSGVscEZvcm1hdHRlcicsCisgICAgICAgICAgICdPcHRQYXJzZUVycm9yJywKKyAgICAgICAgICAgJ09wdGlvbkVycm9yJywKKyAgICAgICAgICAgJ09wdGlvbkNvbmZsaWN0RXJyb3InLAorICAgICAgICAgICAnT3B0aW9uVmFsdWVFcnJvcicsCisgICAgICAgICAgICdCYWRPcHRpb25FcnJvciddCisKK19fY29weXJpZ2h0X18gPSAiIiIKK0NvcHlyaWdodCAoYykgMjAwMS0yMDA2IEdyZWdvcnkgUC4gV2FyZC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCitDb3B5cmlnaHQgKGMpIDIwMDItMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorbWV0OgorCisgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisKKyAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUworSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECitUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUgorQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCitFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKK1BST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKK1NPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorIiIiCisKK2ltcG9ydCBzeXMsIG9zCitpbXBvcnQgdHlwZXMKK2ltcG9ydCB0ZXh0d3JhcAorCitkZWYgX3JlcHIoc2VsZik6CisgICAgcmV0dXJuICI8JXMgYXQgMHgleDogJXM+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgaWQoc2VsZiksIHNlbGYpCisKKworIyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBmcm9tOgorIyAgIElkOiBvcHRpb25fcGFyc2VyLnB5IDUyNyAyMDA2LTA3LTIzIDE1OjIxOjMwWiBncmVnCisjICAgSWQ6IG9wdGlvbi5weSA1MjIgMjAwNi0wNi0xMSAxNjoyMjowM1ogZ3dhcmQKKyMgICBJZDogaGVscC5weSA1MjcgMjAwNi0wNy0yMyAxNToyMTozMFogZ3JlZworIyAgIElkOiBlcnJvcnMucHkgNTA5IDIwMDYtMDQtMjAgMDA6NTg6MjRaIGd3YXJkCisKK3RyeToKKyAgICBmcm9tIGdldHRleHQgaW1wb3J0IGdldHRleHQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBkZWYgZ2V0dGV4dChtZXNzYWdlKToKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UKK18gPSBnZXR0ZXh0CisKKworY2xhc3MgT3B0UGFyc2VFcnJvciAoRXhjZXB0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbXNnKToKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5tc2cKKworCitjbGFzcyBPcHRpb25FcnJvciAoT3B0UGFyc2VFcnJvcik6CisgICAgIiIiCisgICAgUmFpc2VkIGlmIGFuIE9wdGlvbiBpbnN0YW5jZSBpcyBjcmVhdGVkIHdpdGggaW52YWxpZCBvcgorICAgIGluY29uc2lzdGVudCBhcmd1bWVudHMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbXNnLCBvcHRpb24pOgorICAgICAgICBzZWxmLm1zZyA9IG1zZworICAgICAgICBzZWxmLm9wdGlvbl9pZCA9IHN0cihvcHRpb24pCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5vcHRpb25faWQ6CisgICAgICAgICAgICByZXR1cm4gIm9wdGlvbiAlczogJXMiICUgKHNlbGYub3B0aW9uX2lkLCBzZWxmLm1zZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm1zZworCitjbGFzcyBPcHRpb25Db25mbGljdEVycm9yIChPcHRpb25FcnJvcik6CisgICAgIiIiCisgICAgUmFpc2VkIGlmIGNvbmZsaWN0aW5nIG9wdGlvbnMgYXJlIGFkZGVkIHRvIGFuIE9wdGlvblBhcnNlci4KKyAgICAiIiIKKworY2xhc3MgT3B0aW9uVmFsdWVFcnJvciAoT3B0UGFyc2VFcnJvcik6CisgICAgIiIiCisgICAgUmFpc2VkIGlmIGFuIGludmFsaWQgb3B0aW9uIHZhbHVlIGlzIGVuY291bnRlcmVkIG9uIHRoZSBjb21tYW5kCisgICAgbGluZS4KKyAgICAiIiIKKworY2xhc3MgQmFkT3B0aW9uRXJyb3IgKE9wdFBhcnNlRXJyb3IpOgorICAgICIiIgorICAgIFJhaXNlZCBpZiBhbiBpbnZhbGlkIG9wdGlvbiBpcyBzZWVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdF9zdHIpOgorICAgICAgICBzZWxmLm9wdF9zdHIgPSBvcHRfc3RyCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIF8oIm5vIHN1Y2ggb3B0aW9uOiAlcyIpICUgc2VsZi5vcHRfc3RyCisKK2NsYXNzIEFtYmlndW91c09wdGlvbkVycm9yIChCYWRPcHRpb25FcnJvcik6CisgICAgIiIiCisgICAgUmFpc2VkIGlmIGFuIGFtYmlndW91cyBvcHRpb24gaXMgc2VlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRfc3RyLCBwb3NzaWJpbGl0aWVzKToKKyAgICAgICAgQmFkT3B0aW9uRXJyb3IuX19pbml0X18oc2VsZiwgb3B0X3N0cikKKyAgICAgICAgc2VsZi5wb3NzaWJpbGl0aWVzID0gcG9zc2liaWxpdGllcworCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAoXygiYW1iaWd1b3VzIG9wdGlvbjogJXMgKCVzPykiKQorICAgICAgICAgICAgICAgICUgKHNlbGYub3B0X3N0ciwgIiwgIi5qb2luKHNlbGYucG9zc2liaWxpdGllcykpKQorCisKK2NsYXNzIEhlbHBGb3JtYXR0ZXI6CisKKyAgICAiIiIKKyAgICBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBmb3JtYXR0aW5nIG9wdGlvbiBoZWxwLiAgT3B0aW9uUGFyc2VyCisgICAgaW5zdGFuY2VzIHNob3VsZCB1c2Ugb25lIG9mIHRoZSBIZWxwRm9ybWF0dGVyIHN1YmNsYXNzZXMgZm9yCisgICAgZm9ybWF0dGluZyBoZWxwOyBieSBkZWZhdWx0IEluZGVudGVkSGVscEZvcm1hdHRlciBpcyB1c2VkLgorCisgICAgSW5zdGFuY2UgYXR0cmlidXRlczoKKyAgICAgIHBhcnNlciA6IE9wdGlvblBhcnNlcgorICAgICAgICB0aGUgY29udHJvbGxpbmcgT3B0aW9uUGFyc2VyIGluc3RhbmNlCisgICAgICBpbmRlbnRfaW5jcmVtZW50IDogaW50CisgICAgICAgIHRoZSBudW1iZXIgb2YgY29sdW1ucyB0byBpbmRlbnQgcGVyIG5lc3RpbmcgbGV2ZWwKKyAgICAgIG1heF9oZWxwX3Bvc2l0aW9uIDogaW50CisgICAgICAgIHRoZSBtYXhpbXVtIHN0YXJ0aW5nIGNvbHVtbiBmb3Igb3B0aW9uIGhlbHAgdGV4dAorICAgICAgaGVscF9wb3NpdGlvbiA6IGludAorICAgICAgICB0aGUgY2FsY3VsYXRlZCBzdGFydGluZyBjb2x1bW4gZm9yIG9wdGlvbiBoZWxwIHRleHQ7CisgICAgICAgIGluaXRpYWxseSB0aGUgc2FtZSBhcyB0aGUgbWF4aW11bQorICAgICAgd2lkdGggOiBpbnQKKyAgICAgICAgdG90YWwgbnVtYmVyIG9mIGNvbHVtbnMgZm9yIG91dHB1dCAocGFzcyBOb25lIHRvIGNvbnN0cnVjdG9yIGZvcgorICAgICAgICB0aGlzIHZhbHVlIHRvIGJlIHRha2VuIGZyb20gdGhlICRDT0xVTU5TIGVudmlyb25tZW50IHZhcmlhYmxlKQorICAgICAgbGV2ZWwgOiBpbnQKKyAgICAgICAgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbAorICAgICAgY3VycmVudF9pbmRlbnQgOiBpbnQKKyAgICAgICAgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbCAoaW4gY29sdW1ucykKKyAgICAgIGhlbHBfd2lkdGggOiBpbnQKKyAgICAgICAgbnVtYmVyIG9mIGNvbHVtbnMgYXZhaWxhYmxlIGZvciBvcHRpb24gaGVscCB0ZXh0IChjYWxjdWxhdGVkKQorICAgICAgZGVmYXVsdF90YWcgOiBzdHIKKyAgICAgICAgdGV4dCB0byByZXBsYWNlIHdpdGggZWFjaCBvcHRpb24ncyBkZWZhdWx0IHZhbHVlLCAiJWRlZmF1bHQiCisgICAgICAgIGJ5IGRlZmF1bHQuICBTZXQgdG8gZmFsc2UgdmFsdWUgdG8gZGlzYWJsZSBkZWZhdWx0IHZhbHVlIGV4cGFuc2lvbi4KKyAgICAgIG9wdGlvbl9zdHJpbmdzIDogeyBPcHRpb24gOiBzdHIgfQorICAgICAgICBtYXBzIE9wdGlvbiBpbnN0YW5jZXMgdG8gdGhlIHNuaXBwZXQgb2YgaGVscCB0ZXh0IGV4cGxhaW5pbmcKKyAgICAgICAgdGhlIHN5bnRheCBvZiB0aGF0IG9wdGlvbiwgZS5nLiAiLWgsIC0taGVscCIgb3IKKyAgICAgICAgIi1mRklMRSwgLS1maWxlPUZJTEUiCisgICAgICBfc2hvcnRfb3B0X2ZtdCA6IHN0cgorICAgICAgICBmb3JtYXQgc3RyaW5nIGNvbnRyb2xsaW5nIGhvdyBzaG9ydCBvcHRpb25zIHdpdGggdmFsdWVzIGFyZQorICAgICAgICBwcmludGVkIGluIGhlbHAgdGV4dC4gIE11c3QgYmUgZWl0aGVyICIlcyVzIiAoIi1mRklMRSIpIG9yCisgICAgICAgICIlcyAlcyIgKCItZiBGSUxFIiksIGJlY2F1c2UgdGhvc2UgYXJlIHRoZSB0d28gc3ludGF4ZXMgdGhhdAorICAgICAgICBPcHRpayBzdXBwb3J0cy4KKyAgICAgIF9sb25nX29wdF9mbXQgOiBzdHIKKyAgICAgICAgc2ltaWxhciBidXQgZm9yIGxvbmcgb3B0aW9uczsgbXVzdCBiZSBlaXRoZXIgIiVzICVzIiAoIi0tZmlsZSBGSUxFIikKKyAgICAgICAgb3IgIiVzPSVzIiAoIi0tZmlsZT1GSUxFIikuCisgICAgIiIiCisKKyAgICBOT19ERUZBVUxUX1ZBTFVFID0gIm5vbmUiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgaW5kZW50X2luY3JlbWVudCwKKyAgICAgICAgICAgICAgICAgbWF4X2hlbHBfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICBzaG9ydF9maXJzdCk6CisgICAgICAgIHNlbGYucGFyc2VyID0gTm9uZQorICAgICAgICBzZWxmLmluZGVudF9pbmNyZW1lbnQgPSBpbmRlbnRfaW5jcmVtZW50CisgICAgICAgIHNlbGYuaGVscF9wb3NpdGlvbiA9IHNlbGYubWF4X2hlbHBfcG9zaXRpb24gPSBtYXhfaGVscF9wb3NpdGlvbgorICAgICAgICBpZiB3aWR0aCBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpZHRoID0gaW50KG9zLmVudmlyb25bJ0NPTFVNTlMnXSkKKyAgICAgICAgICAgIGV4Y2VwdCAoS2V5RXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIHdpZHRoID0gODAKKyAgICAgICAgICAgIHdpZHRoIC09IDIKKyAgICAgICAgc2VsZi53aWR0aCA9IHdpZHRoCisgICAgICAgIHNlbGYuY3VycmVudF9pbmRlbnQgPSAwCisgICAgICAgIHNlbGYubGV2ZWwgPSAwCisgICAgICAgIHNlbGYuaGVscF93aWR0aCA9IE5vbmUgICAgICAgICAgIyBjb21wdXRlZCBsYXRlcgorICAgICAgICBzZWxmLnNob3J0X2ZpcnN0ID0gc2hvcnRfZmlyc3QKKyAgICAgICAgc2VsZi5kZWZhdWx0X3RhZyA9ICIlZGVmYXVsdCIKKyAgICAgICAgc2VsZi5vcHRpb25fc3RyaW5ncyA9IHt9CisgICAgICAgIHNlbGYuX3Nob3J0X29wdF9mbXQgPSAiJXMgJXMiCisgICAgICAgIHNlbGYuX2xvbmdfb3B0X2ZtdCA9ICIlcz0lcyIKKworICAgIGRlZiBzZXRfcGFyc2VyKHNlbGYsIHBhcnNlcik6CisgICAgICAgIHNlbGYucGFyc2VyID0gcGFyc2VyCisKKyAgICBkZWYgc2V0X3Nob3J0X29wdF9kZWxpbWl0ZXIoc2VsZiwgZGVsaW0pOgorICAgICAgICBpZiBkZWxpbSBub3QgaW4gKCIiLCAiICIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBtZXRhdmFyIGRlbGltaXRlciBmb3Igc2hvcnQgb3B0aW9uczogJXIiICUgZGVsaW0pCisgICAgICAgIHNlbGYuX3Nob3J0X29wdF9mbXQgPSAiJXMiICsgZGVsaW0gKyAiJXMiCisKKyAgICBkZWYgc2V0X2xvbmdfb3B0X2RlbGltaXRlcihzZWxmLCBkZWxpbSk6CisgICAgICAgIGlmIGRlbGltIG5vdCBpbiAoIj0iLCAiICIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBtZXRhdmFyIGRlbGltaXRlciBmb3IgbG9uZyBvcHRpb25zOiAlciIgJSBkZWxpbSkKKyAgICAgICAgc2VsZi5fbG9uZ19vcHRfZm10ID0gIiVzIiArIGRlbGltICsgIiVzIgorCisgICAgZGVmIGluZGVudChzZWxmKToKKyAgICAgICAgc2VsZi5jdXJyZW50X2luZGVudCArPSBzZWxmLmluZGVudF9pbmNyZW1lbnQKKyAgICAgICAgc2VsZi5sZXZlbCArPSAxCisKKyAgICBkZWYgZGVkZW50KHNlbGYpOgorICAgICAgICBzZWxmLmN1cnJlbnRfaW5kZW50IC09IHNlbGYuaW5kZW50X2luY3JlbWVudAorICAgICAgICBhc3NlcnQgc2VsZi5jdXJyZW50X2luZGVudCA+PSAwLCAiSW5kZW50IGRlY3JlYXNlZCBiZWxvdyAwLiIKKyAgICAgICAgc2VsZi5sZXZlbCAtPSAxCisKKyAgICBkZWYgZm9ybWF0X3VzYWdlKHNlbGYsIHVzYWdlKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQiCisKKyAgICBkZWYgZm9ybWF0X2hlYWRpbmcoc2VsZiwgaGVhZGluZyk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICJzdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IgorCisgICAgZGVmIF9mb3JtYXRfdGV4dChzZWxmLCB0ZXh0KToKKyAgICAgICAgIiIiCisgICAgICAgIEZvcm1hdCBhIHBhcmFncmFwaCBvZiBmcmVlLWZvcm0gdGV4dCBmb3IgaW5jbHVzaW9uIGluIHRoZQorICAgICAgICBoZWxwIG91dHB1dCBhdCB0aGUgY3VycmVudCBpbmRlbnRhdGlvbiBsZXZlbC4KKyAgICAgICAgIiIiCisgICAgICAgIHRleHRfd2lkdGggPSBzZWxmLndpZHRoIC0gc2VsZi5jdXJyZW50X2luZGVudAorICAgICAgICBpbmRlbnQgPSAiICIqc2VsZi5jdXJyZW50X2luZGVudAorICAgICAgICByZXR1cm4gdGV4dHdyYXAuZmlsbCh0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD1pbmRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNlcXVlbnRfaW5kZW50PWluZGVudCkKKworICAgIGRlZiBmb3JtYXRfZGVzY3JpcHRpb24oc2VsZiwgZGVzY3JpcHRpb24pOgorICAgICAgICBpZiBkZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9mb3JtYXRfdGV4dChkZXNjcmlwdGlvbikgKyAiXG4iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIiIKKworICAgIGRlZiBmb3JtYXRfZXBpbG9nKHNlbGYsIGVwaWxvZyk6CisgICAgICAgIGlmIGVwaWxvZzoKKyAgICAgICAgICAgIHJldHVybiAiXG4iICsgc2VsZi5fZm9ybWF0X3RleHQoZXBpbG9nKSArICJcbiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiIgorCisKKyAgICBkZWYgZXhwYW5kX2RlZmF1bHQoc2VsZiwgb3B0aW9uKToKKyAgICAgICAgaWYgc2VsZi5wYXJzZXIgaXMgTm9uZSBvciBub3Qgc2VsZi5kZWZhdWx0X3RhZzoKKyAgICAgICAgICAgIHJldHVybiBvcHRpb24uaGVscAorCisgICAgICAgIGRlZmF1bHRfdmFsdWUgPSBzZWxmLnBhcnNlci5kZWZhdWx0cy5nZXQob3B0aW9uLmRlc3QpCisgICAgICAgIGlmIGRlZmF1bHRfdmFsdWUgaXMgTk9fREVGQVVMVCBvciBkZWZhdWx0X3ZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlID0gc2VsZi5OT19ERUZBVUxUX1ZBTFVFCisKKyAgICAgICAgcmV0dXJuIG9wdGlvbi5oZWxwLnJlcGxhY2Uoc2VsZi5kZWZhdWx0X3RhZywgc3RyKGRlZmF1bHRfdmFsdWUpKQorCisgICAgZGVmIGZvcm1hdF9vcHRpb24oc2VsZiwgb3B0aW9uKToKKyAgICAgICAgIyBUaGUgaGVscCBmb3IgZWFjaCBvcHRpb24gY29uc2lzdHMgb2YgdHdvIHBhcnRzOgorICAgICAgICAjICAgKiB0aGUgb3B0IHN0cmluZ3MgYW5kIG1ldGF2YXJzCisgICAgICAgICMgICAgIGVnLiAoIi14Iiwgb3IgIi1mRklMRU5BTUUsIC0tZmlsZT1GSUxFTkFNRSIpCisgICAgICAgICMgICAqIHRoZSB1c2VyLXN1cHBsaWVkIGhlbHAgc3RyaW5nCisgICAgICAgICMgICAgIGVnLiAoInR1cm4gb24gZXhwZXJ0IG1vZGUiLCAicmVhZCBkYXRhIGZyb20gRklMRU5BTUUiKQorICAgICAgICAjCisgICAgICAgICMgSWYgcG9zc2libGUsIHdlIHdyaXRlIGJvdGggb2YgdGhlc2Ugb24gdGhlIHNhbWUgbGluZToKKyAgICAgICAgIyAgIC14ICAgICAgdHVybiBvbiBleHBlcnQgbW9kZQorICAgICAgICAjCisgICAgICAgICMgQnV0IGlmIHRoZSBvcHQgc3RyaW5nIGxpc3QgaXMgdG9vIGxvbmcsIHdlIHB1dCB0aGUgaGVscAorICAgICAgICAjIHN0cmluZyBvbiBhIHNlY29uZCBsaW5lLCBpbmRlbnRlZCB0byB0aGUgc2FtZSBjb2x1bW4gaXQgd291bGQKKyAgICAgICAgIyBzdGFydCBpbiBpZiBpdCBmaXQgb24gdGhlIGZpcnN0IGxpbmUuCisgICAgICAgICMgICAtZkZJTEVOQU1FLCAtLWZpbGU9RklMRU5BTUUKKyAgICAgICAgIyAgICAgICAgICAgcmVhZCBkYXRhIGZyb20gRklMRU5BTUUKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgb3B0cyA9IHNlbGYub3B0aW9uX3N0cmluZ3Nbb3B0aW9uXQorICAgICAgICBvcHRfd2lkdGggPSBzZWxmLmhlbHBfcG9zaXRpb24gLSBzZWxmLmN1cnJlbnRfaW5kZW50IC0gMgorICAgICAgICBpZiBsZW4ob3B0cykgPiBvcHRfd2lkdGg6CisgICAgICAgICAgICBvcHRzID0gIiUqcyVzXG4iICUgKHNlbGYuY3VycmVudF9pbmRlbnQsICIiLCBvcHRzKQorICAgICAgICAgICAgaW5kZW50X2ZpcnN0ID0gc2VsZi5oZWxwX3Bvc2l0aW9uCisgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAjIHN0YXJ0IGhlbHAgb24gc2FtZSBsaW5lIGFzIG9wdHMKKyAgICAgICAgICAgIG9wdHMgPSAiJSpzJS0qcyAgIiAlIChzZWxmLmN1cnJlbnRfaW5kZW50LCAiIiwgb3B0X3dpZHRoLCBvcHRzKQorICAgICAgICAgICAgaW5kZW50X2ZpcnN0ID0gMAorICAgICAgICByZXN1bHQuYXBwZW5kKG9wdHMpCisgICAgICAgIGlmIG9wdGlvbi5oZWxwOgorICAgICAgICAgICAgaGVscF90ZXh0ID0gc2VsZi5leHBhbmRfZGVmYXVsdChvcHRpb24pCisgICAgICAgICAgICBoZWxwX2xpbmVzID0gdGV4dHdyYXAud3JhcChoZWxwX3RleHQsIHNlbGYuaGVscF93aWR0aCkKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiUqcyVzXG4iICUgKGluZGVudF9maXJzdCwgIiIsIGhlbHBfbGluZXNbMF0pKQorICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChbIiUqcyVzXG4iICUgKHNlbGYuaGVscF9wb3NpdGlvbiwgIiIsIGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBoZWxwX2xpbmVzWzE6XV0pCisgICAgICAgIGVsaWYgb3B0c1stMV0gIT0gIlxuIjoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIikKKyAgICAgICAgcmV0dXJuICIiLmpvaW4ocmVzdWx0KQorCisgICAgZGVmIHN0b3JlX29wdGlvbl9zdHJpbmdzKHNlbGYsIHBhcnNlcik6CisgICAgICAgIHNlbGYuaW5kZW50KCkKKyAgICAgICAgbWF4X2xlbiA9IDAKKyAgICAgICAgZm9yIG9wdCBpbiBwYXJzZXIub3B0aW9uX2xpc3Q6CisgICAgICAgICAgICBzdHJpbmdzID0gc2VsZi5mb3JtYXRfb3B0aW9uX3N0cmluZ3Mob3B0KQorICAgICAgICAgICAgc2VsZi5vcHRpb25fc3RyaW5nc1tvcHRdID0gc3RyaW5ncworICAgICAgICAgICAgbWF4X2xlbiA9IG1heChtYXhfbGVuLCBsZW4oc3RyaW5ncykgKyBzZWxmLmN1cnJlbnRfaW5kZW50KQorICAgICAgICBzZWxmLmluZGVudCgpCisgICAgICAgIGZvciBncm91cCBpbiBwYXJzZXIub3B0aW9uX2dyb3VwczoKKyAgICAgICAgICAgIGZvciBvcHQgaW4gZ3JvdXAub3B0aW9uX2xpc3Q6CisgICAgICAgICAgICAgICAgc3RyaW5ncyA9IHNlbGYuZm9ybWF0X29wdGlvbl9zdHJpbmdzKG9wdCkKKyAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbl9zdHJpbmdzW29wdF0gPSBzdHJpbmdzCisgICAgICAgICAgICAgICAgbWF4X2xlbiA9IG1heChtYXhfbGVuLCBsZW4oc3RyaW5ncykgKyBzZWxmLmN1cnJlbnRfaW5kZW50KQorICAgICAgICBzZWxmLmRlZGVudCgpCisgICAgICAgIHNlbGYuZGVkZW50KCkKKyAgICAgICAgc2VsZi5oZWxwX3Bvc2l0aW9uID0gbWluKG1heF9sZW4gKyAyLCBzZWxmLm1heF9oZWxwX3Bvc2l0aW9uKQorICAgICAgICBzZWxmLmhlbHBfd2lkdGggPSBzZWxmLndpZHRoIC0gc2VsZi5oZWxwX3Bvc2l0aW9uCisKKyAgICBkZWYgZm9ybWF0X29wdGlvbl9zdHJpbmdzKHNlbGYsIG9wdGlvbik6CisgICAgICAgICIiIlJldHVybiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG9wdGlvbiBzdHJpbmdzICYgbWV0YXZhcmlhYmxlcy4iIiIKKyAgICAgICAgaWYgb3B0aW9uLnRha2VzX3ZhbHVlKCk6CisgICAgICAgICAgICBtZXRhdmFyID0gb3B0aW9uLm1ldGF2YXIgb3Igb3B0aW9uLmRlc3QudXBwZXIoKQorICAgICAgICAgICAgc2hvcnRfb3B0cyA9IFtzZWxmLl9zaG9ydF9vcHRfZm10ICUgKHNvcHQsIG1ldGF2YXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzb3B0IGluIG9wdGlvbi5fc2hvcnRfb3B0c10KKyAgICAgICAgICAgIGxvbmdfb3B0cyA9IFtzZWxmLl9sb25nX29wdF9mbXQgJSAobG9wdCwgbWV0YXZhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbG9wdCBpbiBvcHRpb24uX2xvbmdfb3B0c10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNob3J0X29wdHMgPSBvcHRpb24uX3Nob3J0X29wdHMKKyAgICAgICAgICAgIGxvbmdfb3B0cyA9IG9wdGlvbi5fbG9uZ19vcHRzCisKKyAgICAgICAgaWYgc2VsZi5zaG9ydF9maXJzdDoKKyAgICAgICAgICAgIG9wdHMgPSBzaG9ydF9vcHRzICsgbG9uZ19vcHRzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcHRzID0gbG9uZ19vcHRzICsgc2hvcnRfb3B0cworCisgICAgICAgIHJldHVybiAiLCAiLmpvaW4ob3B0cykKKworY2xhc3MgSW5kZW50ZWRIZWxwRm9ybWF0dGVyIChIZWxwRm9ybWF0dGVyKToKKyAgICAiIiJGb3JtYXQgaGVscCB3aXRoIGluZGVudGVkIHNlY3Rpb24gYm9kaWVzLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIGluZGVudF9pbmNyZW1lbnQ9MiwKKyAgICAgICAgICAgICAgICAgbWF4X2hlbHBfcG9zaXRpb249MjQsCisgICAgICAgICAgICAgICAgIHdpZHRoPU5vbmUsCisgICAgICAgICAgICAgICAgIHNob3J0X2ZpcnN0PTEpOgorICAgICAgICBIZWxwRm9ybWF0dGVyLl9faW5pdF9fKAorICAgICAgICAgICAgc2VsZiwgaW5kZW50X2luY3JlbWVudCwgbWF4X2hlbHBfcG9zaXRpb24sIHdpZHRoLCBzaG9ydF9maXJzdCkKKworICAgIGRlZiBmb3JtYXRfdXNhZ2Uoc2VsZiwgdXNhZ2UpOgorICAgICAgICByZXR1cm4gXygiVXNhZ2U6ICVzXG4iKSAlIHVzYWdlCisKKyAgICBkZWYgZm9ybWF0X2hlYWRpbmcoc2VsZiwgaGVhZGluZyk6CisgICAgICAgIHJldHVybiAiJSpzJXM6XG4iICUgKHNlbGYuY3VycmVudF9pbmRlbnQsICIiLCBoZWFkaW5nKQorCisKK2NsYXNzIFRpdGxlZEhlbHBGb3JtYXR0ZXIgKEhlbHBGb3JtYXR0ZXIpOgorICAgICIiIkZvcm1hdCBoZWxwIHdpdGggdW5kZXJsaW5lZCBzZWN0aW9uIGhlYWRlcnMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgaW5kZW50X2luY3JlbWVudD0wLAorICAgICAgICAgICAgICAgICBtYXhfaGVscF9wb3NpdGlvbj0yNCwKKyAgICAgICAgICAgICAgICAgd2lkdGg9Tm9uZSwKKyAgICAgICAgICAgICAgICAgc2hvcnRfZmlyc3Q9MCk6CisgICAgICAgIEhlbHBGb3JtYXR0ZXIuX19pbml0X18gKAorICAgICAgICAgICAgc2VsZiwgaW5kZW50X2luY3JlbWVudCwgbWF4X2hlbHBfcG9zaXRpb24sIHdpZHRoLCBzaG9ydF9maXJzdCkKKworICAgIGRlZiBmb3JtYXRfdXNhZ2Uoc2VsZiwgdXNhZ2UpOgorICAgICAgICByZXR1cm4gIiVzICAlc1xuIiAlIChzZWxmLmZvcm1hdF9oZWFkaW5nKF8oIlVzYWdlIikpLCB1c2FnZSkKKworICAgIGRlZiBmb3JtYXRfaGVhZGluZyhzZWxmLCBoZWFkaW5nKToKKyAgICAgICAgcmV0dXJuICIlc1xuJXNcbiIgJSAoaGVhZGluZywgIj0tIltzZWxmLmxldmVsXSAqIGxlbihoZWFkaW5nKSkKKworCitkZWYgX3BhcnNlX251bSh2YWwsIHR5cGUpOgorICAgIGlmIHZhbFs6Ml0ubG93ZXIoKSA9PSAiMHgiOiAgICAgICAgICMgaGV4YWRlY2ltYWwKKyAgICAgICAgcmFkaXggPSAxNgorICAgIGVsaWYgdmFsWzoyXS5sb3dlcigpID09ICIwYiI6ICAgICAgICMgYmluYXJ5CisgICAgICAgIHJhZGl4ID0gMgorICAgICAgICB2YWwgPSB2YWxbMjpdIG9yICIwIiAgICAgICAgICAgICMgaGF2ZSB0byByZW1vdmUgIjBiIiBwcmVmaXgKKyAgICBlbGlmIHZhbFs6MV0gPT0gIjAiOiAgICAgICAgICAgICAgICAjIG9jdGFsCisgICAgICAgIHJhZGl4ID0gOAorICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVjaW1hbAorICAgICAgICByYWRpeCA9IDEwCisKKyAgICByZXR1cm4gdHlwZSh2YWwsIHJhZGl4KQorCitkZWYgX3BhcnNlX2ludCh2YWwpOgorICAgIHJldHVybiBfcGFyc2VfbnVtKHZhbCwgaW50KQorCitkZWYgX3BhcnNlX2xvbmcodmFsKToKKyAgICByZXR1cm4gX3BhcnNlX251bSh2YWwsIGxvbmcpCisKK19idWlsdGluX2N2dCA9IHsgImludCIgOiAoX3BhcnNlX2ludCwgXygiaW50ZWdlciIpKSwKKyAgICAgICAgICAgICAgICAgImxvbmciIDogKF9wYXJzZV9sb25nLCBfKCJsb25nIGludGVnZXIiKSksCisgICAgICAgICAgICAgICAgICJmbG9hdCIgOiAoZmxvYXQsIF8oImZsb2F0aW5nLXBvaW50IikpLAorICAgICAgICAgICAgICAgICAiY29tcGxleCIgOiAoY29tcGxleCwgXygiY29tcGxleCIpKSB9CisKK2RlZiBjaGVja19idWlsdGluKG9wdGlvbiwgb3B0LCB2YWx1ZSk6CisgICAgKGN2dCwgd2hhdCkgPSBfYnVpbHRpbl9jdnRbb3B0aW9uLnR5cGVdCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gY3Z0KHZhbHVlKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICByYWlzZSBPcHRpb25WYWx1ZUVycm9yKAorICAgICAgICAgICAgXygib3B0aW9uICVzOiBpbnZhbGlkICVzIHZhbHVlOiAlciIpICUgKG9wdCwgd2hhdCwgdmFsdWUpKQorCitkZWYgY2hlY2tfY2hvaWNlKG9wdGlvbiwgb3B0LCB2YWx1ZSk6CisgICAgaWYgdmFsdWUgaW4gb3B0aW9uLmNob2ljZXM6CisgICAgICAgIHJldHVybiB2YWx1ZQorICAgIGVsc2U6CisgICAgICAgIGNob2ljZXMgPSAiLCAiLmpvaW4obWFwKHJlcHIsIG9wdGlvbi5jaG9pY2VzKSkKKyAgICAgICAgcmFpc2UgT3B0aW9uVmFsdWVFcnJvcigKKyAgICAgICAgICAgIF8oIm9wdGlvbiAlczogaW52YWxpZCBjaG9pY2U6ICVyIChjaG9vc2UgZnJvbSAlcykiKQorICAgICAgICAgICAgJSAob3B0LCB2YWx1ZSwgY2hvaWNlcykpCisKKyMgTm90IHN1cHBseWluZyBhIGRlZmF1bHQgaXMgZGlmZmVyZW50IGZyb20gYSBkZWZhdWx0IG9mIE5vbmUsCisjIHNvIHdlIG5lZWQgYW4gZXhwbGljaXQgIm5vdCBzdXBwbGllZCIgdmFsdWUuCitOT19ERUZBVUxUID0gKCJOTyIsICJERUZBVUxUIikKKworCitjbGFzcyBPcHRpb246CisgICAgIiIiCisgICAgSW5zdGFuY2UgYXR0cmlidXRlczoKKyAgICAgIF9zaG9ydF9vcHRzIDogW3N0cmluZ10KKyAgICAgIF9sb25nX29wdHMgOiBbc3RyaW5nXQorCisgICAgICBhY3Rpb24gOiBzdHJpbmcKKyAgICAgIHR5cGUgOiBzdHJpbmcKKyAgICAgIGRlc3QgOiBzdHJpbmcKKyAgICAgIGRlZmF1bHQgOiBhbnkKKyAgICAgIG5hcmdzIDogaW50CisgICAgICBjb25zdCA6IGFueQorICAgICAgY2hvaWNlcyA6IFtzdHJpbmddCisgICAgICBjYWxsYmFjayA6IGZ1bmN0aW9uCisgICAgICBjYWxsYmFja19hcmdzIDogKGFueSopCisgICAgICBjYWxsYmFja19rd2FyZ3MgOiB7IHN0cmluZyA6IGFueSB9CisgICAgICBoZWxwIDogc3RyaW5nCisgICAgICBtZXRhdmFyIDogc3RyaW5nCisgICAgIiIiCisKKyAgICAjIFRoZSBsaXN0IG9mIGluc3RhbmNlIGF0dHJpYnV0ZXMgdGhhdCBtYXkgYmUgc2V0IHRocm91Z2gKKyAgICAjIGtleXdvcmQgYXJncyB0byB0aGUgY29uc3RydWN0b3IuCisgICAgQVRUUlMgPSBbJ2FjdGlvbicsCisgICAgICAgICAgICAgJ3R5cGUnLAorICAgICAgICAgICAgICdkZXN0JywKKyAgICAgICAgICAgICAnZGVmYXVsdCcsCisgICAgICAgICAgICAgJ25hcmdzJywKKyAgICAgICAgICAgICAnY29uc3QnLAorICAgICAgICAgICAgICdjaG9pY2VzJywKKyAgICAgICAgICAgICAnY2FsbGJhY2snLAorICAgICAgICAgICAgICdjYWxsYmFja19hcmdzJywKKyAgICAgICAgICAgICAnY2FsbGJhY2tfa3dhcmdzJywKKyAgICAgICAgICAgICAnaGVscCcsCisgICAgICAgICAgICAgJ21ldGF2YXInXQorCisgICAgIyBUaGUgc2V0IG9mIGFjdGlvbnMgYWxsb3dlZCBieSBvcHRpb24gcGFyc2Vycy4gIEV4cGxpY2l0bHkgbGlzdGVkCisgICAgIyBoZXJlIHNvIHRoZSBjb25zdHJ1Y3RvciBjYW4gdmFsaWRhdGUgaXRzIGFyZ3VtZW50cy4KKyAgICBBQ1RJT05TID0gKCJzdG9yZSIsCisgICAgICAgICAgICAgICAic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgInN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgInN0b3JlX2ZhbHNlIiwKKyAgICAgICAgICAgICAgICJhcHBlbmQiLAorICAgICAgICAgICAgICAgImFwcGVuZF9jb25zdCIsCisgICAgICAgICAgICAgICAiY291bnQiLAorICAgICAgICAgICAgICAgImNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICJoZWxwIiwKKyAgICAgICAgICAgICAgICJ2ZXJzaW9uIikKKworICAgICMgVGhlIHNldCBvZiBhY3Rpb25zIHRoYXQgaW52b2x2ZSBzdG9yaW5nIGEgdmFsdWUgc29tZXdoZXJlOworICAgICMgYWxzbyBsaXN0ZWQganVzdCBmb3IgY29uc3RydWN0b3IgYXJndW1lbnQgdmFsaWRhdGlvbi4gIChJZgorICAgICMgdGhlIGFjdGlvbiBpcyBvbmUgb2YgdGhlc2UsIHRoZXJlIG11c3QgYmUgYSBkZXN0aW5hdGlvbi4pCisgICAgU1RPUkVfQUNUSU9OUyA9ICgic3RvcmUiLAorICAgICAgICAgICAgICAgICAgICAgInN0b3JlX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICJzdG9yZV9mYWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAiYXBwZW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICJhcHBlbmRfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgImNvdW50IikKKworICAgICMgVGhlIHNldCBvZiBhY3Rpb25zIGZvciB3aGljaCBpdCBtYWtlcyBzZW5zZSB0byBzdXBwbHkgYSB2YWx1ZQorICAgICMgdHlwZSwgaWUuIHdoaWNoIG1heSBjb25zdW1lIGFuIGFyZ3VtZW50IGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKyAgICBUWVBFRF9BQ1RJT05TID0gKCJzdG9yZSIsCisgICAgICAgICAgICAgICAgICAgICAiYXBwZW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayIpCisKKyAgICAjIFRoZSBzZXQgb2YgYWN0aW9ucyB3aGljaCAqcmVxdWlyZSogYSB2YWx1ZSB0eXBlLCBpZS4gdGhhdAorICAgICMgYWx3YXlzIGNvbnN1bWUgYW4gYXJndW1lbnQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICAgIEFMV0FZU19UWVBFRF9BQ1RJT05TID0gKCJzdG9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGVuZCIpCisKKyAgICAjIFRoZSBzZXQgb2YgYWN0aW9ucyB3aGljaCB0YWtlIGEgJ2NvbnN0JyBhdHRyaWJ1dGUuCisgICAgQ09OU1RfQUNUSU9OUyA9ICgic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgImFwcGVuZF9jb25zdCIpCisKKyAgICAjIFRoZSBzZXQgb2Yga25vd24gdHlwZXMgZm9yIG9wdGlvbiBwYXJzZXJzLiAgQWdhaW4sIGxpc3RlZCBoZXJlIGZvcgorICAgICMgY29uc3RydWN0b3IgYXJndW1lbnQgdmFsaWRhdGlvbi4KKyAgICBUWVBFUyA9ICgic3RyaW5nIiwgImludCIsICJsb25nIiwgImZsb2F0IiwgImNvbXBsZXgiLCAiY2hvaWNlIikKKworICAgICMgRGljdGlvbmFyeSBvZiBhcmd1bWVudCBjaGVja2luZyBmdW5jdGlvbnMsIHdoaWNoIGNvbnZlcnQgYW5kCisgICAgIyB2YWxpZGF0ZSBvcHRpb24gYXJndW1lbnRzIGFjY29yZGluZyB0byB0aGUgb3B0aW9uIHR5cGUuCisgICAgIworICAgICMgU2lnbmF0dXJlIG9mIGNoZWNraW5nIGZ1bmN0aW9ucyBpczoKKyAgICAjICAgY2hlY2sob3B0aW9uIDogT3B0aW9uLCBvcHQgOiBzdHJpbmcsIHZhbHVlIDogc3RyaW5nKSAtPiBhbnkKKyAgICAjIHdoZXJlCisgICAgIyAgIG9wdGlvbiBpcyB0aGUgT3B0aW9uIGluc3RhbmNlIGNhbGxpbmcgdGhlIGNoZWNrZXIKKyAgICAjICAgb3B0IGlzIHRoZSBhY3R1YWwgb3B0aW9uIHNlZW4gb24gdGhlIGNvbW1hbmQtbGluZQorICAgICMgICAgIChlZy4gIi1hIiwgIi0tZmlsZSIpCisgICAgIyAgIHZhbHVlIGlzIHRoZSBvcHRpb24gYXJndW1lbnQgc2VlbiBvbiB0aGUgY29tbWFuZC1saW5lCisgICAgIworICAgICMgVGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgaW4gdGhlIGFwcHJvcHJpYXRlIFB5dGhvbiB0eXBlCisgICAgIyBmb3Igb3B0aW9uLnR5cGUgLS0gZWcuIGFuIGludGVnZXIgaWYgb3B0aW9uLnR5cGUgPT0gImludCIuCisgICAgIworICAgICMgSWYgbm8gY2hlY2tlciBpcyBkZWZpbmVkIGZvciBhIHR5cGUsIGFyZ3VtZW50cyB3aWxsIGJlCisgICAgIyB1bmNoZWNrZWQgYW5kIHJlbWFpbiBzdHJpbmdzLgorICAgIFRZUEVfQ0hFQ0tFUiA9IHsgImludCIgICAgOiBjaGVja19idWlsdGluLAorICAgICAgICAgICAgICAgICAgICAgImxvbmciICAgOiBjaGVja19idWlsdGluLAorICAgICAgICAgICAgICAgICAgICAgImZsb2F0IiAgOiBjaGVja19idWlsdGluLAorICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXgiOiBjaGVja19idWlsdGluLAorICAgICAgICAgICAgICAgICAgICAgImNob2ljZSIgOiBjaGVja19jaG9pY2UsCisgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAjIENIRUNLX01FVEhPRFMgaXMgYSBsaXN0IG9mIHVuYm91bmQgbWV0aG9kIG9iamVjdHM7IHRoZXkgYXJlIGNhbGxlZAorICAgICMgYnkgdGhlIGNvbnN0cnVjdG9yLCBpbiBvcmRlciwgYWZ0ZXIgYWxsIGF0dHJpYnV0ZXMgYXJlCisgICAgIyBpbml0aWFsaXplZC4gIFRoZSBsaXN0IGlzIGNyZWF0ZWQgYW5kIGZpbGxlZCBpbiBsYXRlciwgYWZ0ZXIgYWxsCisgICAgIyB0aGUgbWV0aG9kcyBhcmUgYWN0dWFsbHkgZGVmaW5lZC4gIChJIGp1c3QgcHV0IGl0IGhlcmUgYmVjYXVzZSBJCisgICAgIyBsaWtlIHRvIGRlZmluZSBhbmQgZG9jdW1lbnQgYWxsIGNsYXNzIGF0dHJpYnV0ZXMgaW4gdGhlIHNhbWUKKyAgICAjIHBsYWNlLikgIFN1YmNsYXNzZXMgdGhhdCBhZGQgYW5vdGhlciBfY2hlY2tfKigpIG1ldGhvZCBzaG91bGQKKyAgICAjIGRlZmluZSB0aGVpciBvd24gQ0hFQ0tfTUVUSE9EUyBsaXN0IHRoYXQgYWRkcyB0aGVpciBjaGVjayBtZXRob2QKKyAgICAjIHRvIHRob3NlIGZyb20gdGhpcyBjbGFzcy4KKyAgICBDSEVDS19NRVRIT0RTID0gTm9uZQorCisKKyAgICAjIC0tIENvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICpvcHRzLCAqKmF0dHJzKToKKyAgICAgICAgIyBTZXQgX3Nob3J0X29wdHMsIF9sb25nX29wdHMgYXR0cnMgZnJvbSAnb3B0cycgdHVwbGUuCisgICAgICAgICMgSGF2ZSB0byBiZSBzZXQgbm93LCBpbiBjYXNlIG5vIG9wdGlvbiBzdHJpbmdzIGFyZSBzdXBwbGllZC4KKyAgICAgICAgc2VsZi5fc2hvcnRfb3B0cyA9IFtdCisgICAgICAgIHNlbGYuX2xvbmdfb3B0cyA9IFtdCisgICAgICAgIG9wdHMgPSBzZWxmLl9jaGVja19vcHRfc3RyaW5ncyhvcHRzKQorICAgICAgICBzZWxmLl9zZXRfb3B0X3N0cmluZ3Mob3B0cykKKworICAgICAgICAjIFNldCBhbGwgb3RoZXIgYXR0cnMgKGFjdGlvbiwgdHlwZSwgZXRjLikgZnJvbSAnYXR0cnMnIGRpY3QKKyAgICAgICAgc2VsZi5fc2V0X2F0dHJzKGF0dHJzKQorCisgICAgICAgICMgQ2hlY2sgYWxsIHRoZSBhdHRyaWJ1dGVzIHdlIGp1c3Qgc2V0LiAgVGhlcmUgYXJlIGxvdHMgb2YKKyAgICAgICAgIyBjb21wbGljYXRlZCBpbnRlcmRlcGVuZGVuY2llcywgYnV0IGx1Y2tpbHkgdGhleSBjYW4gYmUgZmFybWVkCisgICAgICAgICMgb3V0IHRvIHRoZSBfY2hlY2tfKigpIG1ldGhvZHMgbGlzdGVkIGluIENIRUNLX01FVEhPRFMgLS0gd2hpY2gKKyAgICAgICAgIyBjb3VsZCBiZSBoYW5keSBmb3Igc3ViY2xhc3NlcyEgIFRoZSBvbmUgdGhpbmcgdGhlc2UgYWxsIHNoYXJlCisgICAgICAgICMgaXMgdGhhdCB0aGV5IHJhaXNlIE9wdGlvbkVycm9yIGlmIHRoZXkgZGlzY292ZXIgYSBwcm9ibGVtLgorICAgICAgICBmb3IgY2hlY2tlciBpbiBzZWxmLkNIRUNLX01FVEhPRFM6CisgICAgICAgICAgICBjaGVja2VyKHNlbGYpCisKKyAgICBkZWYgX2NoZWNrX29wdF9zdHJpbmdzKHNlbGYsIG9wdHMpOgorICAgICAgICAjIEZpbHRlciBvdXQgTm9uZSBiZWNhdXNlIGVhcmx5IHZlcnNpb25zIG9mIE9wdGlrIGhhZCBleGFjdGx5CisgICAgICAgICMgb25lIHNob3J0IG9wdGlvbiBhbmQgb25lIGxvbmcgb3B0aW9uLCBlaXRoZXIgb2Ygd2hpY2gKKyAgICAgICAgIyBjb3VsZCBiZSBOb25lLgorICAgICAgICBvcHRzID0gZmlsdGVyKE5vbmUsIG9wdHMpCisgICAgICAgIGlmIG5vdCBvcHRzOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJhdCBsZWFzdCBvbmUgb3B0aW9uIHN0cmluZyBtdXN0IGJlIHN1cHBsaWVkIikKKyAgICAgICAgcmV0dXJuIG9wdHMKKworICAgIGRlZiBfc2V0X29wdF9zdHJpbmdzKHNlbGYsIG9wdHMpOgorICAgICAgICBmb3Igb3B0IGluIG9wdHM6CisgICAgICAgICAgICBpZiBsZW4ob3B0KSA8IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG9wdGlvbiBzdHJpbmcgJXI6ICIKKyAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgYXQgbGVhc3QgdHdvIGNoYXJhY3RlcnMgbG9uZyIgJSBvcHQsIHNlbGYpCisgICAgICAgICAgICBlbGlmIGxlbihvcHQpID09IDI6CisgICAgICAgICAgICAgICAgaWYgbm90IChvcHRbMF0gPT0gIi0iIGFuZCBvcHRbMV0gIT0gIi0iKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBzaG9ydCBvcHRpb24gc3RyaW5nICVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBvZiB0aGUgZm9ybSAteCwgKHggYW55IG5vbi1kYXNoIGNoYXIpIiAlIG9wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5fc2hvcnRfb3B0cy5hcHBlbmQob3B0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBub3QgKG9wdFswOjJdID09ICItLSIgYW5kIG9wdFsyXSAhPSAiLSIpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGxvbmcgb3B0aW9uIHN0cmluZyAlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgIm11c3Qgc3RhcnQgd2l0aCAtLSwgZm9sbG93ZWQgYnkgbm9uLWRhc2giICUgb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLl9sb25nX29wdHMuYXBwZW5kKG9wdCkKKworICAgIGRlZiBfc2V0X2F0dHJzKHNlbGYsIGF0dHJzKToKKyAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5BVFRSUzoKKyAgICAgICAgICAgIGlmIGF0dHIgaW4gYXR0cnM6CisgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCBhdHRyc1thdHRyXSkKKyAgICAgICAgICAgICAgICBkZWwgYXR0cnNbYXR0cl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgYXR0ciA9PSAnZGVmYXVsdCc6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgTk9fREVGQVVMVCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIE5vbmUpCisgICAgICAgIGlmIGF0dHJzOgorICAgICAgICAgICAgYXR0cnMgPSBhdHRycy5rZXlzKCkKKyAgICAgICAgICAgIGF0dHJzLnNvcnQoKQorICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgImludmFsaWQga2V5d29yZCBhcmd1bWVudHM6ICVzIiAlICIsICIuam9pbihhdHRycyksCisgICAgICAgICAgICAgICAgc2VsZikKKworCisgICAgIyAtLSBDb25zdHJ1Y3RvciB2YWxpZGF0aW9uIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBfY2hlY2tfYWN0aW9uKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmFjdGlvbiBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5hY3Rpb24gPSAic3RvcmUiCisgICAgICAgIGVsaWYgc2VsZi5hY3Rpb24gbm90IGluIHNlbGYuQUNUSU9OUzoKKyAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKCJpbnZhbGlkIGFjdGlvbjogJXIiICUgc2VsZi5hY3Rpb24sIHNlbGYpCisKKyAgICBkZWYgX2NoZWNrX3R5cGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYudHlwZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5hY3Rpb24gaW4gc2VsZi5BTFdBWVNfVFlQRURfQUNUSU9OUzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNob2ljZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICMgVGhlICJjaG9pY2VzIiBhdHRyaWJ1dGUgaW1wbGllcyAiY2hvaWNlIiB0eXBlLgorICAgICAgICAgICAgICAgICAgICBzZWxmLnR5cGUgPSAiY2hvaWNlIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgTm8gdHlwZSBnaXZlbj8gICJzdHJpbmciIGlzIHRoZSBtb3N0IHNlbnNpYmxlIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZSA9ICJzdHJpbmciCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEFsbG93IHR5cGUgb2JqZWN0cyBvciBidWlsdGluIHR5cGUgY29udmVyc2lvbiBmdW5jdGlvbnMKKyAgICAgICAgICAgICMgKGludCwgc3RyLCBldGMuKSBhcyBhbiBhbHRlcm5hdGl2ZSB0byB0aGVpciBuYW1lcy4gIChUaGUKKyAgICAgICAgICAgICMgY29tcGxpY2F0ZWQgY2hlY2sgb2YgX19idWlsdGluX18gaXMgb25seSBuZWNlc3NhcnkgZm9yCisgICAgICAgICAgICAjIFB5dGhvbiAyLjEgYW5kIGVhcmxpZXIsIGFuZCBpcyBzaG9ydC1jaXJjdWl0ZWQgYnkgdGhlCisgICAgICAgICAgICAjIGZpcnN0IGNoZWNrIG9uIG1vZGVybiBQeXRob25zLikKKyAgICAgICAgICAgIGltcG9ydCBfX2J1aWx0aW5fXworICAgICAgICAgICAgaWYgKCB0eXBlKHNlbGYudHlwZSkgaXMgdHlwZXMuVHlwZVR5cGUgb3IKKyAgICAgICAgICAgICAgICAgKGhhc2F0dHIoc2VsZi50eXBlLCAiX19uYW1lX18iKSBhbmQKKyAgICAgICAgICAgICAgICAgIGdldGF0dHIoX19idWlsdGluX18sIHNlbGYudHlwZS5fX25hbWVfXywgTm9uZSkgaXMgc2VsZi50eXBlKSApOgorICAgICAgICAgICAgICAgIHNlbGYudHlwZSA9IHNlbGYudHlwZS5fX25hbWVfXworCisgICAgICAgICAgICBpZiBzZWxmLnR5cGUgPT0gInN0ciI6CisgICAgICAgICAgICAgICAgc2VsZi50eXBlID0gInN0cmluZyIKKworICAgICAgICAgICAgaWYgc2VsZi50eXBlIG5vdCBpbiBzZWxmLlRZUEVTOgorICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKCJpbnZhbGlkIG9wdGlvbiB0eXBlOiAlciIgJSBzZWxmLnR5cGUsIHNlbGYpCisgICAgICAgICAgICBpZiBzZWxmLmFjdGlvbiBub3QgaW4gc2VsZi5UWVBFRF9BQ1RJT05TOgorICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAibXVzdCBub3Qgc3VwcGx5IGEgdHlwZSBmb3IgYWN0aW9uICVyIiAlIHNlbGYuYWN0aW9uLCBzZWxmKQorCisgICAgZGVmIF9jaGVja19jaG9pY2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYudHlwZSA9PSAiY2hvaWNlIjoKKyAgICAgICAgICAgIGlmIHNlbGYuY2hvaWNlcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAibXVzdCBzdXBwbHkgYSBsaXN0IG9mIGNob2ljZXMgZm9yIHR5cGUgJ2Nob2ljZSciLCBzZWxmKQorICAgICAgICAgICAgZWxpZiB0eXBlKHNlbGYuY2hvaWNlcykgbm90IGluICh0eXBlcy5UdXBsZVR5cGUsIHR5cGVzLkxpc3RUeXBlKToKKyAgICAgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImNob2ljZXMgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyAoJyVzJyBzdXBwbGllZCkiCisgICAgICAgICAgICAgICAgICAgICUgc3RyKHR5cGUoc2VsZi5jaG9pY2VzKSkuc3BsaXQoIiciKVsxXSwgc2VsZikKKyAgICAgICAgZWxpZiBzZWxmLmNob2ljZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAibXVzdCBub3Qgc3VwcGx5IGNob2ljZXMgZm9yIHR5cGUgJXIiICUgc2VsZi50eXBlLCBzZWxmKQorCisgICAgZGVmIF9jaGVja19kZXN0KHNlbGYpOgorICAgICAgICAjIE5vIGRlc3RpbmF0aW9uIGdpdmVuLCBhbmQgd2UgbmVlZCBvbmUgZm9yIHRoaXMgYWN0aW9uLiAgVGhlCisgICAgICAgICMgc2VsZi50eXBlIGNoZWNrIGlzIGZvciBjYWxsYmFja3MgdGhhdCB0YWtlIGEgdmFsdWUuCisgICAgICAgIHRha2VzX3ZhbHVlID0gKHNlbGYuYWN0aW9uIGluIHNlbGYuU1RPUkVfQUNUSU9OUyBvcgorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnR5cGUgaXMgbm90IE5vbmUpCisgICAgICAgIGlmIHNlbGYuZGVzdCBpcyBOb25lIGFuZCB0YWtlc192YWx1ZToKKworICAgICAgICAgICAgIyBHbGVhbiBhIGRlc3RpbmF0aW9uIGZyb20gdGhlIGZpcnN0IGxvbmcgb3B0aW9uIHN0cmluZywKKyAgICAgICAgICAgICMgb3IgZnJvbSB0aGUgZmlyc3Qgc2hvcnQgb3B0aW9uIHN0cmluZyBpZiBubyBsb25nIG9wdGlvbnMuCisgICAgICAgICAgICBpZiBzZWxmLl9sb25nX29wdHM6CisgICAgICAgICAgICAgICAgIyBlZy4gIi0tZm9vLWJhciIgLT4gImZvb19iYXIiCisgICAgICAgICAgICAgICAgc2VsZi5kZXN0ID0gc2VsZi5fbG9uZ19vcHRzWzBdWzI6XS5yZXBsYWNlKCctJywgJ18nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmRlc3QgPSBzZWxmLl9zaG9ydF9vcHRzWzBdWzFdCisKKyAgICBkZWYgX2NoZWNrX2NvbnN0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmFjdGlvbiBub3QgaW4gc2VsZi5DT05TVF9BQ1RJT05TIGFuZCBzZWxmLmNvbnN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIidjb25zdCcgbXVzdCBub3QgYmUgc3VwcGxpZWQgZm9yIGFjdGlvbiAlciIgJSBzZWxmLmFjdGlvbiwKKyAgICAgICAgICAgICAgICBzZWxmKQorCisgICAgZGVmIF9jaGVja19uYXJncyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5hY3Rpb24gaW4gc2VsZi5UWVBFRF9BQ1RJT05TOgorICAgICAgICAgICAgaWYgc2VsZi5uYXJncyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYubmFyZ3MgPSAxCisgICAgICAgIGVsaWYgc2VsZi5uYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICInbmFyZ3MnIG11c3Qgbm90IGJlIHN1cHBsaWVkIGZvciBhY3Rpb24gJXIiICUgc2VsZi5hY3Rpb24sCisgICAgICAgICAgICAgICAgc2VsZikKKworICAgIGRlZiBfY2hlY2tfY2FsbGJhY2soc2VsZik6CisgICAgICAgIGlmIHNlbGYuYWN0aW9uID09ICJjYWxsYmFjayI6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLmNhbGxiYWNrLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImNhbGxiYWNrIG5vdCBjYWxsYWJsZTogJXIiICUgc2VsZi5jYWxsYmFjaywgc2VsZikKKyAgICAgICAgICAgIGlmIChzZWxmLmNhbGxiYWNrX2FyZ3MgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgdHlwZShzZWxmLmNhbGxiYWNrX2FyZ3MpIGlzIG5vdCB0eXBlcy5UdXBsZVR5cGUpOgorICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2tfYXJncywgaWYgc3VwcGxpZWQsIG11c3QgYmUgYSB0dXBsZTogbm90ICVyIgorICAgICAgICAgICAgICAgICAgICAlIHNlbGYuY2FsbGJhY2tfYXJncywgc2VsZikKKyAgICAgICAgICAgIGlmIChzZWxmLmNhbGxiYWNrX2t3YXJncyBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICB0eXBlKHNlbGYuY2FsbGJhY2tfa3dhcmdzKSBpcyBub3QgdHlwZXMuRGljdFR5cGUpOgorICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2tfa3dhcmdzLCBpZiBzdXBwbGllZCwgbXVzdCBiZSBhIGRpY3Q6IG5vdCAlciIKKyAgICAgICAgICAgICAgICAgICAgJSBzZWxmLmNhbGxiYWNrX2t3YXJncywgc2VsZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuY2FsbGJhY2sgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayBzdXBwbGllZCAoJXIpIGZvciBub24tY2FsbGJhY2sgb3B0aW9uIgorICAgICAgICAgICAgICAgICAgICAlIHNlbGYuY2FsbGJhY2ssIHNlbGYpCisgICAgICAgICAgICBpZiBzZWxmLmNhbGxiYWNrX2FyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJjYWxsYmFja19hcmdzIHN1cHBsaWVkIGZvciBub24tY2FsbGJhY2sgb3B0aW9uIiwgc2VsZikKKyAgICAgICAgICAgIGlmIHNlbGYuY2FsbGJhY2tfa3dhcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2tfa3dhcmdzIHN1cHBsaWVkIGZvciBub24tY2FsbGJhY2sgb3B0aW9uIiwgc2VsZikKKworCisgICAgQ0hFQ0tfTUVUSE9EUyA9IFtfY2hlY2tfYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgX2NoZWNrX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBfY2hlY2tfY2hvaWNlLAorICAgICAgICAgICAgICAgICAgICAgX2NoZWNrX2Rlc3QsCisgICAgICAgICAgICAgICAgICAgICBfY2hlY2tfY29uc3QsCisgICAgICAgICAgICAgICAgICAgICBfY2hlY2tfbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICBfY2hlY2tfY2FsbGJhY2tdCisKKworICAgICMgLS0gTWlzY2VsbGFuZW91cyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIvIi5qb2luKHNlbGYuX3Nob3J0X29wdHMgKyBzZWxmLl9sb25nX29wdHMpCisKKyAgICBfX3JlcHJfXyA9IF9yZXByCisKKyAgICBkZWYgdGFrZXNfdmFsdWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGUgaXMgbm90IE5vbmUKKworICAgIGRlZiBnZXRfb3B0X3N0cmluZyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fbG9uZ19vcHRzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xvbmdfb3B0c1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3J0X29wdHNbMF0KKworCisgICAgIyAtLSBQcm9jZXNzaW5nIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBjaGVja192YWx1ZShzZWxmLCBvcHQsIHZhbHVlKToKKyAgICAgICAgY2hlY2tlciA9IHNlbGYuVFlQRV9DSEVDS0VSLmdldChzZWxmLnR5cGUpCisgICAgICAgIGlmIGNoZWNrZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGNoZWNrZXIoc2VsZiwgb3B0LCB2YWx1ZSkKKworICAgIGRlZiBjb252ZXJ0X3ZhbHVlKHNlbGYsIG9wdCwgdmFsdWUpOgorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYubmFyZ3MgPT0gMToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jaGVja192YWx1ZShvcHQsIHZhbHVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gdHVwbGUoW3NlbGYuY2hlY2tfdmFsdWUob3B0LCB2KSBmb3IgdiBpbiB2YWx1ZV0pCisKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBvcHQsIHZhbHVlLCB2YWx1ZXMsIHBhcnNlcik6CisKKyAgICAgICAgIyBGaXJzdCwgY29udmVydCB0aGUgdmFsdWUocykgdG8gdGhlIHJpZ2h0IHR5cGUuICBIb3dsIGlmIGFueQorICAgICAgICAjIHZhbHVlKHMpIGFyZSBib2d1cy4KKyAgICAgICAgdmFsdWUgPSBzZWxmLmNvbnZlcnRfdmFsdWUob3B0LCB2YWx1ZSkKKworICAgICAgICAjIEFuZCB0aGVuIHRha2Ugd2hhdGV2ZXIgYWN0aW9uIGlzIGV4cGVjdGVkIG9mIHVzLgorICAgICAgICAjIFRoaXMgaXMgYSBzZXBhcmF0ZSBtZXRob2QgdG8gbWFrZSBsaWZlIGVhc2llciBmb3IKKyAgICAgICAgIyBzdWJjbGFzc2VzIHRvIGFkZCBuZXcgYWN0aW9ucy4KKyAgICAgICAgcmV0dXJuIHNlbGYudGFrZV9hY3Rpb24oCisgICAgICAgICAgICBzZWxmLmFjdGlvbiwgc2VsZi5kZXN0LCBvcHQsIHZhbHVlLCB2YWx1ZXMsIHBhcnNlcikKKworICAgIGRlZiB0YWtlX2FjdGlvbihzZWxmLCBhY3Rpb24sIGRlc3QsIG9wdCwgdmFsdWUsIHZhbHVlcywgcGFyc2VyKToKKyAgICAgICAgaWYgYWN0aW9uID09ICJzdG9yZSI6CisgICAgICAgICAgICBzZXRhdHRyKHZhbHVlcywgZGVzdCwgdmFsdWUpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJzdG9yZV9jb25zdCI6CisgICAgICAgICAgICBzZXRhdHRyKHZhbHVlcywgZGVzdCwgc2VsZi5jb25zdCkKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gInN0b3JlX3RydWUiOgorICAgICAgICAgICAgc2V0YXR0cih2YWx1ZXMsIGRlc3QsIFRydWUpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJzdG9yZV9mYWxzZSI6CisgICAgICAgICAgICBzZXRhdHRyKHZhbHVlcywgZGVzdCwgRmFsc2UpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJhcHBlbmQiOgorICAgICAgICAgICAgdmFsdWVzLmVuc3VyZV92YWx1ZShkZXN0LCBbXSkuYXBwZW5kKHZhbHVlKQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAiYXBwZW5kX2NvbnN0IjoKKyAgICAgICAgICAgIHZhbHVlcy5lbnN1cmVfdmFsdWUoZGVzdCwgW10pLmFwcGVuZChzZWxmLmNvbnN0KQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAiY291bnQiOgorICAgICAgICAgICAgc2V0YXR0cih2YWx1ZXMsIGRlc3QsIHZhbHVlcy5lbnN1cmVfdmFsdWUoZGVzdCwgMCkgKyAxKQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAiY2FsbGJhY2siOgorICAgICAgICAgICAgYXJncyA9IHNlbGYuY2FsbGJhY2tfYXJncyBvciAoKQorICAgICAgICAgICAga3dhcmdzID0gc2VsZi5jYWxsYmFja19rd2FyZ3Mgb3Ige30KKyAgICAgICAgICAgIHNlbGYuY2FsbGJhY2soc2VsZiwgb3B0LCB2YWx1ZSwgcGFyc2VyLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJoZWxwIjoKKyAgICAgICAgICAgIHBhcnNlci5wcmludF9oZWxwKCkKKyAgICAgICAgICAgIHBhcnNlci5leGl0KCkKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gInZlcnNpb24iOgorICAgICAgICAgICAgcGFyc2VyLnByaW50X3ZlcnNpb24oKQorICAgICAgICAgICAgcGFyc2VyLmV4aXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biBhY3Rpb24gJXIiICUgc2VsZi5hY3Rpb24pCisKKyAgICAgICAgcmV0dXJuIDEKKworIyBjbGFzcyBPcHRpb24KKworCitTVVBQUkVTU19IRUxQID0gIlNVUFBSRVNTIisiSEVMUCIKK1NVUFBSRVNTX1VTQUdFID0gIlNVUFBSRVNTIisiVVNBR0UiCisKK3RyeToKKyAgICBiYXNlc3RyaW5nCitleGNlcHQgTmFtZUVycm9yOgorICAgIGRlZiBpc2Jhc2VzdHJpbmcoeCk6CisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKHgsICh0eXBlcy5TdHJpbmdUeXBlLCB0eXBlcy5Vbmljb2RlVHlwZSkpCitlbHNlOgorICAgIGRlZiBpc2Jhc2VzdHJpbmcoeCk6CisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKHgsIGJhc2VzdHJpbmcpCisKK2NsYXNzIFZhbHVlczoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWZhdWx0cz1Ob25lKToKKyAgICAgICAgaWYgZGVmYXVsdHM6CisgICAgICAgICAgICBmb3IgKGF0dHIsIHZhbCkgaW4gZGVmYXVsdHMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYuX19kaWN0X18pCisKKyAgICBfX3JlcHJfXyA9IF9yZXByCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFZhbHVlcyk6CisgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuX19kaWN0X18sIG90aGVyLl9fZGljdF9fKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR5cGVzLkRpY3RUeXBlKToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5fX2RpY3RfXywgb3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gLTEKKworICAgIGRlZiBfdXBkYXRlX2NhcmVmdWwoc2VsZiwgZGljdCk6CisgICAgICAgICIiIgorICAgICAgICBVcGRhdGUgdGhlIG9wdGlvbiB2YWx1ZXMgZnJvbSBhbiBhcmJpdHJhcnkgZGljdGlvbmFyeSwgYnV0IG9ubHkKKyAgICAgICAgdXNlIGtleXMgZnJvbSBkaWN0IHRoYXQgYWxyZWFkeSBoYXZlIGEgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUKKyAgICAgICAgaW4gc2VsZi4gIEFueSBrZXlzIGluIGRpY3Qgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlCisgICAgICAgIGFyZSBzaWxlbnRseSBpZ25vcmVkLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGF0dHIgaW4gZGlyKHNlbGYpOgorICAgICAgICAgICAgaWYgYXR0ciBpbiBkaWN0OgorICAgICAgICAgICAgICAgIGR2YWwgPSBkaWN0W2F0dHJdCisgICAgICAgICAgICAgICAgaWYgZHZhbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCBkdmFsKQorCisgICAgZGVmIF91cGRhdGVfbG9vc2Uoc2VsZiwgZGljdCk6CisgICAgICAgICIiIgorICAgICAgICBVcGRhdGUgdGhlIG9wdGlvbiB2YWx1ZXMgZnJvbSBhbiBhcmJpdHJhcnkgZGljdGlvbmFyeSwKKyAgICAgICAgdXNpbmcgYWxsIGtleXMgZnJvbSB0aGUgZGljdGlvbmFyeSByZWdhcmRsZXNzIG9mIHdoZXRoZXIKKyAgICAgICAgdGhleSBoYXZlIGEgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgaW4gc2VsZiBvciBub3QuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShkaWN0KQorCisgICAgZGVmIF91cGRhdGUoc2VsZiwgZGljdCwgbW9kZSk6CisgICAgICAgIGlmIG1vZGUgPT0gImNhcmVmdWwiOgorICAgICAgICAgICAgc2VsZi5fdXBkYXRlX2NhcmVmdWwoZGljdCkKKyAgICAgICAgZWxpZiBtb2RlID09ICJsb29zZSI6CisgICAgICAgICAgICBzZWxmLl91cGRhdGVfbG9vc2UoZGljdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJpbnZhbGlkIHVwZGF0ZSBtb2RlOiAlciIgJSBtb2RlCisKKyAgICBkZWYgcmVhZF9tb2R1bGUoc2VsZiwgbW9kbmFtZSwgbW9kZT0iY2FyZWZ1bCIpOgorICAgICAgICBfX2ltcG9ydF9fKG1vZG5hbWUpCisgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW21vZG5hbWVdCisgICAgICAgIHNlbGYuX3VwZGF0ZSh2YXJzKG1vZCksIG1vZGUpCisKKyAgICBkZWYgcmVhZF9maWxlKHNlbGYsIGZpbGVuYW1lLCBtb2RlPSJjYXJlZnVsIik6CisgICAgICAgIHZhcnMgPSB7fQorICAgICAgICBleGVjZmlsZShmaWxlbmFtZSwgdmFycykKKyAgICAgICAgc2VsZi5fdXBkYXRlKHZhcnMsIG1vZGUpCisKKyAgICBkZWYgZW5zdXJlX3ZhbHVlKHNlbGYsIGF0dHIsIHZhbHVlKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgYXR0cikgb3IgZ2V0YXR0cihzZWxmLCBhdHRyKSBpcyBOb25lOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWx1ZSkKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgYXR0cikKKworCitjbGFzcyBPcHRpb25Db250YWluZXI6CisKKyAgICAiIiIKKyAgICBBYnN0cmFjdCBiYXNlIGNsYXNzLgorCisgICAgQ2xhc3MgYXR0cmlidXRlczoKKyAgICAgIHN0YW5kYXJkX29wdGlvbl9saXN0IDogW09wdGlvbl0KKyAgICAgICAgbGlzdCBvZiBzdGFuZGFyZCBvcHRpb25zIHRoYXQgd2lsbCBiZSBhY2NlcHRlZCBieSBhbGwgaW5zdGFuY2VzCisgICAgICAgIG9mIHRoaXMgcGFyc2VyIGNsYXNzIChpbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMpLgorCisgICAgSW5zdGFuY2UgYXR0cmlidXRlczoKKyAgICAgIG9wdGlvbl9saXN0IDogW09wdGlvbl0KKyAgICAgICAgdGhlIGxpc3Qgb2YgT3B0aW9uIG9iamVjdHMgY29udGFpbmVkIGJ5IHRoaXMgT3B0aW9uQ29udGFpbmVyCisgICAgICBfc2hvcnRfb3B0IDogeyBzdHJpbmcgOiBPcHRpb24gfQorICAgICAgICBkaWN0aW9uYXJ5IG1hcHBpbmcgc2hvcnQgb3B0aW9uIHN0cmluZ3MsIGVnLiAiLWYiIG9yICItWCIsCisgICAgICAgIHRvIHRoZSBPcHRpb24gaW5zdGFuY2VzIHRoYXQgaW1wbGVtZW50IHRoZW0uICBJZiBhbiBPcHRpb24KKyAgICAgICAgaGFzIG11bHRpcGxlIHNob3J0IG9wdGlvbiBzdHJpbmdzLCBpdCB3aWxsIGFwcGVhcnMgaW4gdGhpcworICAgICAgICBkaWN0aW9uYXJ5IG11bHRpcGxlIHRpbWVzLiBbMV0KKyAgICAgIF9sb25nX29wdCA6IHsgc3RyaW5nIDogT3B0aW9uIH0KKyAgICAgICAgZGljdGlvbmFyeSBtYXBwaW5nIGxvbmcgb3B0aW9uIHN0cmluZ3MsIGVnLiAiLS1maWxlIiBvcgorICAgICAgICAiLS1leGNsdWRlIiwgdG8gdGhlIE9wdGlvbiBpbnN0YW5jZXMgdGhhdCBpbXBsZW1lbnQgdGhlbS4KKyAgICAgICAgQWdhaW4sIGEgZ2l2ZW4gT3B0aW9uIGNhbiBvY2N1ciBtdWx0aXBsZSB0aW1lcyBpbiB0aGlzCisgICAgICAgIGRpY3Rpb25hcnkuIFsxXQorICAgICAgZGVmYXVsdHMgOiB7IHN0cmluZyA6IGFueSB9CisgICAgICAgIGRpY3Rpb25hcnkgbWFwcGluZyBvcHRpb24gZGVzdGluYXRpb24gbmFtZXMgdG8gZGVmYXVsdAorICAgICAgICB2YWx1ZXMgZm9yIGVhY2ggZGVzdGluYXRpb24gWzFdCisKKyAgICBbMV0gVGhlc2UgbWFwcGluZ3MgYXJlIGNvbW1vbiB0byAoc2hhcmVkIGJ5KSBhbGwgY29tcG9uZW50cyBvZiB0aGUKKyAgICAgICAgY29udHJvbGxpbmcgT3B0aW9uUGFyc2VyLCB3aGVyZSB0aGV5IGFyZSBpbml0aWFsbHkgY3JlYXRlZC4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbl9jbGFzcywgY29uZmxpY3RfaGFuZGxlciwgZGVzY3JpcHRpb24pOgorICAgICAgICAjIEluaXRpYWxpemUgdGhlIG9wdGlvbiBsaXN0IGFuZCByZWxhdGVkIGRhdGEgc3RydWN0dXJlcy4KKyAgICAgICAgIyBUaGlzIG1ldGhvZCBtdXN0IGJlIHByb3ZpZGVkIGJ5IHN1YmNsYXNzZXMsIGFuZCBpdCBtdXN0CisgICAgICAgICMgaW5pdGlhbGl6ZSBhdCBsZWFzdCB0aGUgZm9sbG93aW5nIGluc3RhbmNlIGF0dHJpYnV0ZXM6CisgICAgICAgICMgb3B0aW9uX2xpc3QsIF9zaG9ydF9vcHQsIF9sb25nX29wdCwgZGVmYXVsdHMuCisgICAgICAgIHNlbGYuX2NyZWF0ZV9vcHRpb25fbGlzdCgpCisKKyAgICAgICAgc2VsZi5vcHRpb25fY2xhc3MgPSBvcHRpb25fY2xhc3MKKyAgICAgICAgc2VsZi5zZXRfY29uZmxpY3RfaGFuZGxlcihjb25mbGljdF9oYW5kbGVyKQorICAgICAgICBzZWxmLnNldF9kZXNjcmlwdGlvbihkZXNjcmlwdGlvbikKKworICAgIGRlZiBfY3JlYXRlX29wdGlvbl9tYXBwaW5ncyhzZWxmKToKKyAgICAgICAgIyBGb3IgdXNlIGJ5IE9wdGlvblBhcnNlciBjb25zdHJ1Y3RvciAtLSBjcmVhdGUgdGhlIG1hc3RlcgorICAgICAgICAjIG9wdGlvbiBtYXBwaW5ncyB1c2VkIGJ5IHRoaXMgT3B0aW9uUGFyc2VyIGFuZCBhbGwKKyAgICAgICAgIyBPcHRpb25Hcm91cHMgdGhhdCBpdCBvd25zLgorICAgICAgICBzZWxmLl9zaG9ydF9vcHQgPSB7fSAgICAgICAgICAgICMgc2luZ2xlIGxldHRlciAtPiBPcHRpb24gaW5zdGFuY2UKKyAgICAgICAgc2VsZi5fbG9uZ19vcHQgPSB7fSAgICAgICAgICAgICAjIGxvbmcgb3B0aW9uIC0+IE9wdGlvbiBpbnN0YW5jZQorICAgICAgICBzZWxmLmRlZmF1bHRzID0ge30gICAgICAgICAgICAgICMgbWFwcyBvcHRpb24gZGVzdCAtPiBkZWZhdWx0IHZhbHVlCisKKworICAgIGRlZiBfc2hhcmVfb3B0aW9uX21hcHBpbmdzKHNlbGYsIHBhcnNlcik6CisgICAgICAgICMgRm9yIHVzZSBieSBPcHRpb25Hcm91cCBjb25zdHJ1Y3RvciAtLSB1c2Ugc2hhcmVkIG9wdGlvbgorICAgICAgICAjIG1hcHBpbmdzIGZyb20gdGhlIE9wdGlvblBhcnNlciB0aGF0IG93bnMgdGhpcyBPcHRpb25Hcm91cC4KKyAgICAgICAgc2VsZi5fc2hvcnRfb3B0ID0gcGFyc2VyLl9zaG9ydF9vcHQKKyAgICAgICAgc2VsZi5fbG9uZ19vcHQgPSBwYXJzZXIuX2xvbmdfb3B0CisgICAgICAgIHNlbGYuZGVmYXVsdHMgPSBwYXJzZXIuZGVmYXVsdHMKKworICAgIGRlZiBzZXRfY29uZmxpY3RfaGFuZGxlcihzZWxmLCBoYW5kbGVyKToKKyAgICAgICAgaWYgaGFuZGxlciBub3QgaW4gKCJlcnJvciIsICJyZXNvbHZlIik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiaW52YWxpZCBjb25mbGljdF9yZXNvbHV0aW9uIHZhbHVlICVyIiAlIGhhbmRsZXIKKyAgICAgICAgc2VsZi5jb25mbGljdF9oYW5kbGVyID0gaGFuZGxlcgorCisgICAgZGVmIHNldF9kZXNjcmlwdGlvbihzZWxmLCBkZXNjcmlwdGlvbik6CisgICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbgorCisgICAgZGVmIGdldF9kZXNjcmlwdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGVzY3JpcHRpb24KKworCisgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgICIiInNlZSBPcHRpb25QYXJzZXIuZGVzdHJveSgpLiIiIgorICAgICAgICBkZWwgc2VsZi5fc2hvcnRfb3B0CisgICAgICAgIGRlbCBzZWxmLl9sb25nX29wdAorICAgICAgICBkZWwgc2VsZi5kZWZhdWx0cworCisKKyAgICAjIC0tIE9wdGlvbi1hZGRpbmcgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIF9jaGVja19jb25mbGljdChzZWxmLCBvcHRpb24pOgorICAgICAgICBjb25mbGljdF9vcHRzID0gW10KKyAgICAgICAgZm9yIG9wdCBpbiBvcHRpb24uX3Nob3J0X29wdHM6CisgICAgICAgICAgICBpZiBvcHQgaW4gc2VsZi5fc2hvcnRfb3B0OgorICAgICAgICAgICAgICAgIGNvbmZsaWN0X29wdHMuYXBwZW5kKChvcHQsIHNlbGYuX3Nob3J0X29wdFtvcHRdKSkKKyAgICAgICAgZm9yIG9wdCBpbiBvcHRpb24uX2xvbmdfb3B0czoKKyAgICAgICAgICAgIGlmIG9wdCBpbiBzZWxmLl9sb25nX29wdDoKKyAgICAgICAgICAgICAgICBjb25mbGljdF9vcHRzLmFwcGVuZCgob3B0LCBzZWxmLl9sb25nX29wdFtvcHRdKSkKKworICAgICAgICBpZiBjb25mbGljdF9vcHRzOgorICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuY29uZmxpY3RfaGFuZGxlcgorICAgICAgICAgICAgaWYgaGFuZGxlciA9PSAiZXJyb3IiOgorICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbkNvbmZsaWN0RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJjb25mbGljdGluZyBvcHRpb24gc3RyaW5nKHMpOiAlcyIKKyAgICAgICAgICAgICAgICAgICAgJSAiLCAiLmpvaW4oW2NvWzBdIGZvciBjbyBpbiBjb25mbGljdF9vcHRzXSksCisgICAgICAgICAgICAgICAgICAgIG9wdGlvbikKKyAgICAgICAgICAgIGVsaWYgaGFuZGxlciA9PSAicmVzb2x2ZSI6CisgICAgICAgICAgICAgICAgZm9yIChvcHQsIGNfb3B0aW9uKSBpbiBjb25mbGljdF9vcHRzOgorICAgICAgICAgICAgICAgICAgICBpZiBvcHQuc3RhcnRzd2l0aCgiLS0iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNfb3B0aW9uLl9sb25nX29wdHMucmVtb3ZlKG9wdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9sb25nX29wdFtvcHRdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjX29wdGlvbi5fc2hvcnRfb3B0cy5yZW1vdmUob3B0KQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuX3Nob3J0X29wdFtvcHRdCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCAoY19vcHRpb24uX3Nob3J0X29wdHMgb3IgY19vcHRpb24uX2xvbmdfb3B0cyk6CisgICAgICAgICAgICAgICAgICAgICAgICBjX29wdGlvbi5jb250YWluZXIub3B0aW9uX2xpc3QucmVtb3ZlKGNfb3B0aW9uKQorCisgICAgZGVmIGFkZF9vcHRpb24oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiYWRkX29wdGlvbihPcHRpb24pCisgICAgICAgICAgIGFkZF9vcHRpb24ob3B0X3N0ciwgLi4uLCBrd2FyZz12YWwsIC4uLikKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHR5cGUoYXJnc1swXSkgaW4gdHlwZXMuU3RyaW5nVHlwZXM6CisgICAgICAgICAgICBvcHRpb24gPSBzZWxmLm9wdGlvbl9jbGFzcygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDEgYW5kIG5vdCBrd2FyZ3M6CisgICAgICAgICAgICBvcHRpb24gPSBhcmdzWzBdCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvcHRpb24sIE9wdGlvbik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAibm90IGFuIE9wdGlvbiBpbnN0YW5jZTogJXIiICUgb3B0aW9uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJpbnZhbGlkIGFyZ3VtZW50cyIKKworICAgICAgICBzZWxmLl9jaGVja19jb25mbGljdChvcHRpb24pCisKKyAgICAgICAgc2VsZi5vcHRpb25fbGlzdC5hcHBlbmQob3B0aW9uKQorICAgICAgICBvcHRpb24uY29udGFpbmVyID0gc2VsZgorICAgICAgICBmb3Igb3B0IGluIG9wdGlvbi5fc2hvcnRfb3B0czoKKyAgICAgICAgICAgIHNlbGYuX3Nob3J0X29wdFtvcHRdID0gb3B0aW9uCisgICAgICAgIGZvciBvcHQgaW4gb3B0aW9uLl9sb25nX29wdHM6CisgICAgICAgICAgICBzZWxmLl9sb25nX29wdFtvcHRdID0gb3B0aW9uCisKKyAgICAgICAgaWYgb3B0aW9uLmRlc3QgaXMgbm90IE5vbmU6ICAgICAjIG9wdGlvbiBoYXMgYSBkZXN0LCB3ZSBuZWVkIGEgZGVmYXVsdAorICAgICAgICAgICAgaWYgb3B0aW9uLmRlZmF1bHQgaXMgbm90IE5PX0RFRkFVTFQ6CisgICAgICAgICAgICAgICAgc2VsZi5kZWZhdWx0c1tvcHRpb24uZGVzdF0gPSBvcHRpb24uZGVmYXVsdAorICAgICAgICAgICAgZWxpZiBvcHRpb24uZGVzdCBub3QgaW4gc2VsZi5kZWZhdWx0czoKKyAgICAgICAgICAgICAgICBzZWxmLmRlZmF1bHRzW29wdGlvbi5kZXN0XSA9IE5vbmUKKworICAgICAgICByZXR1cm4gb3B0aW9uCisKKyAgICBkZWYgYWRkX29wdGlvbnMoc2VsZiwgb3B0aW9uX2xpc3QpOgorICAgICAgICBmb3Igb3B0aW9uIGluIG9wdGlvbl9saXN0OgorICAgICAgICAgICAgc2VsZi5hZGRfb3B0aW9uKG9wdGlvbikKKworICAgICMgLS0gT3B0aW9uIHF1ZXJ5L3JlbW92YWwgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZ2V0X29wdGlvbihzZWxmLCBvcHRfc3RyKToKKyAgICAgICAgcmV0dXJuIChzZWxmLl9zaG9ydF9vcHQuZ2V0KG9wdF9zdHIpIG9yCisgICAgICAgICAgICAgICAgc2VsZi5fbG9uZ19vcHQuZ2V0KG9wdF9zdHIpKQorCisgICAgZGVmIGhhc19vcHRpb24oc2VsZiwgb3B0X3N0cik6CisgICAgICAgIHJldHVybiAob3B0X3N0ciBpbiBzZWxmLl9zaG9ydF9vcHQgb3IKKyAgICAgICAgICAgICAgICBvcHRfc3RyIGluIHNlbGYuX2xvbmdfb3B0KQorCisgICAgZGVmIHJlbW92ZV9vcHRpb24oc2VsZiwgb3B0X3N0cik6CisgICAgICAgIG9wdGlvbiA9IHNlbGYuX3Nob3J0X29wdC5nZXQob3B0X3N0cikKKyAgICAgICAgaWYgb3B0aW9uIGlzIE5vbmU6CisgICAgICAgICAgICBvcHRpb24gPSBzZWxmLl9sb25nX29wdC5nZXQob3B0X3N0cikKKyAgICAgICAgaWYgb3B0aW9uIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJubyBzdWNoIG9wdGlvbiAlciIgJSBvcHRfc3RyKQorCisgICAgICAgIGZvciBvcHQgaW4gb3B0aW9uLl9zaG9ydF9vcHRzOgorICAgICAgICAgICAgZGVsIHNlbGYuX3Nob3J0X29wdFtvcHRdCisgICAgICAgIGZvciBvcHQgaW4gb3B0aW9uLl9sb25nX29wdHM6CisgICAgICAgICAgICBkZWwgc2VsZi5fbG9uZ19vcHRbb3B0XQorICAgICAgICBvcHRpb24uY29udGFpbmVyLm9wdGlvbl9saXN0LnJlbW92ZShvcHRpb24pCisKKworICAgICMgLS0gSGVscC1mb3JtYXR0aW5nIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZm9ybWF0X29wdGlvbl9oZWxwKHNlbGYsIGZvcm1hdHRlcik6CisgICAgICAgIGlmIG5vdCBzZWxmLm9wdGlvbl9saXN0OgorICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciBvcHRpb24gaW4gc2VsZi5vcHRpb25fbGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCBvcHRpb24uaGVscCBpcyBTVVBQUkVTU19IRUxQOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZm9ybWF0dGVyLmZvcm1hdF9vcHRpb24ob3B0aW9uKSkKKyAgICAgICAgcmV0dXJuICIiLmpvaW4ocmVzdWx0KQorCisgICAgZGVmIGZvcm1hdF9kZXNjcmlwdGlvbihzZWxmLCBmb3JtYXR0ZXIpOgorICAgICAgICByZXR1cm4gZm9ybWF0dGVyLmZvcm1hdF9kZXNjcmlwdGlvbihzZWxmLmdldF9kZXNjcmlwdGlvbigpKQorCisgICAgZGVmIGZvcm1hdF9oZWxwKHNlbGYsIGZvcm1hdHRlcik6CisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGlmIHNlbGYuZGVzY3JpcHRpb246CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHNlbGYuZm9ybWF0X2Rlc2NyaXB0aW9uKGZvcm1hdHRlcikpCisgICAgICAgIGlmIHNlbGYub3B0aW9uX2xpc3Q6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHNlbGYuZm9ybWF0X29wdGlvbl9oZWxwKGZvcm1hdHRlcikpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4ocmVzdWx0KQorCisKK2NsYXNzIE9wdGlvbkdyb3VwIChPcHRpb25Db250YWluZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgdGl0bGUsIGRlc2NyaXB0aW9uPU5vbmUpOgorICAgICAgICBzZWxmLnBhcnNlciA9IHBhcnNlcgorICAgICAgICBPcHRpb25Db250YWluZXIuX19pbml0X18oCisgICAgICAgICAgICBzZWxmLCBwYXJzZXIub3B0aW9uX2NsYXNzLCBwYXJzZXIuY29uZmxpY3RfaGFuZGxlciwgZGVzY3JpcHRpb24pCisgICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZQorCisgICAgZGVmIF9jcmVhdGVfb3B0aW9uX2xpc3Qoc2VsZik6CisgICAgICAgIHNlbGYub3B0aW9uX2xpc3QgPSBbXQorICAgICAgICBzZWxmLl9zaGFyZV9vcHRpb25fbWFwcGluZ3Moc2VsZi5wYXJzZXIpCisKKyAgICBkZWYgc2V0X3RpdGxlKHNlbGYsIHRpdGxlKToKKyAgICAgICAgc2VsZi50aXRsZSA9IHRpdGxlCisKKyAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgIiIic2VlIE9wdGlvblBhcnNlci5kZXN0cm95KCkuIiIiCisgICAgICAgIE9wdGlvbkNvbnRhaW5lci5kZXN0cm95KHNlbGYpCisgICAgICAgIGRlbCBzZWxmLm9wdGlvbl9saXN0CisKKyAgICAjIC0tIEhlbHAtZm9ybWF0dGluZyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGZvcm1hdF9oZWxwKHNlbGYsIGZvcm1hdHRlcik6CisgICAgICAgIHJlc3VsdCA9IGZvcm1hdHRlci5mb3JtYXRfaGVhZGluZyhzZWxmLnRpdGxlKQorICAgICAgICBmb3JtYXR0ZXIuaW5kZW50KCkKKyAgICAgICAgcmVzdWx0ICs9IE9wdGlvbkNvbnRhaW5lci5mb3JtYXRfaGVscChzZWxmLCBmb3JtYXR0ZXIpCisgICAgICAgIGZvcm1hdHRlci5kZWRlbnQoKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKworY2xhc3MgT3B0aW9uUGFyc2VyIChPcHRpb25Db250YWluZXIpOgorCisgICAgIiIiCisgICAgQ2xhc3MgYXR0cmlidXRlczoKKyAgICAgIHN0YW5kYXJkX29wdGlvbl9saXN0IDogW09wdGlvbl0KKyAgICAgICAgbGlzdCBvZiBzdGFuZGFyZCBvcHRpb25zIHRoYXQgd2lsbCBiZSBhY2NlcHRlZCBieSBhbGwgaW5zdGFuY2VzCisgICAgICAgIG9mIHRoaXMgcGFyc2VyIGNsYXNzIChpbnRlbmRlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMpLgorCisgICAgSW5zdGFuY2UgYXR0cmlidXRlczoKKyAgICAgIHVzYWdlIDogc3RyaW5nCisgICAgICAgIGEgdXNhZ2Ugc3RyaW5nIGZvciB5b3VyIHByb2dyYW0uICBCZWZvcmUgaXQgaXMgZGlzcGxheWVkCisgICAgICAgIHRvIHRoZSB1c2VyLCAiJXByb2ciIHdpbGwgYmUgZXhwYW5kZWQgdG8gdGhlIG5hbWUgb2YKKyAgICAgICAgeW91ciBwcm9ncmFtIChzZWxmLnByb2cgb3Igb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkpLgorICAgICAgcHJvZyA6IHN0cmluZworICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwcm9ncmFtICh0byBvdmVycmlkZQorICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKSkuCisgICAgICBkZXNjcmlwdGlvbiA6IHN0cmluZworICAgICAgICBBIHBhcmFncmFwaCBvZiB0ZXh0IGdpdmluZyBhIGJyaWVmIG92ZXJ2aWV3IG9mIHlvdXIgcHJvZ3JhbS4KKyAgICAgICAgb3B0cGFyc2UgcmVmb3JtYXRzIHRoaXMgcGFyYWdyYXBoIHRvIGZpdCB0aGUgY3VycmVudCB0ZXJtaW5hbAorICAgICAgICB3aWR0aCBhbmQgcHJpbnRzIGl0IHdoZW4gdGhlIHVzZXIgcmVxdWVzdHMgaGVscCAoYWZ0ZXIgdXNhZ2UsCisgICAgICAgIGJ1dCBiZWZvcmUgdGhlIGxpc3Qgb2Ygb3B0aW9ucykuCisgICAgICBlcGlsb2cgOiBzdHJpbmcKKyAgICAgICAgcGFyYWdyYXBoIG9mIGhlbHAgdGV4dCB0byBwcmludCBhZnRlciBvcHRpb24gaGVscAorCisgICAgICBvcHRpb25fZ3JvdXBzIDogW09wdGlvbkdyb3VwXQorICAgICAgICBsaXN0IG9mIG9wdGlvbiBncm91cHMgaW4gdGhpcyBwYXJzZXIgKG9wdGlvbiBncm91cHMgYXJlCisgICAgICAgIGlycmVsZXZhbnQgZm9yIHBhcnNpbmcgdGhlIGNvbW1hbmQtbGluZSwgYnV0IHZlcnkgdXNlZnVsCisgICAgICAgIGZvciBnZW5lcmF0aW5nIGhlbHApCisKKyAgICAgIGFsbG93X2ludGVyc3BlcnNlZF9hcmdzIDogYm9vbCA9IHRydWUKKyAgICAgICAgaWYgdHJ1ZSwgcG9zaXRpb25hbCBhcmd1bWVudHMgbWF5IGJlIGludGVyc3BlcnNlZCB3aXRoIG9wdGlvbnMuCisgICAgICAgIEFzc3VtaW5nIC1hIGFuZCAtYiBlYWNoIHRha2UgYSBzaW5nbGUgYXJndW1lbnQsIHRoZSBjb21tYW5kLWxpbmUKKyAgICAgICAgICAtYWJsYWggZm9vIGJhciAtYmJvbyBiYXoKKyAgICAgICAgd2lsbCBiZSBpbnRlcnByZXRlZCB0aGUgc2FtZSBhcworICAgICAgICAgIC1hYmxhaCAtYmJvbyAtLSBmb28gYmFyIGJhegorICAgICAgICBJZiB0aGlzIGZsYWcgd2VyZSBmYWxzZSwgdGhhdCBjb21tYW5kIGxpbmUgd291bGQgYmUgaW50ZXJwcmV0ZWQgYXMKKyAgICAgICAgICAtYWJsYWggLS0gZm9vIGJhciAtYmJvbyBiYXoKKyAgICAgICAgLS0gaWUuIHdlIHN0b3AgcHJvY2Vzc2luZyBvcHRpb25zIGFzIHNvb24gYXMgd2Ugc2VlIHRoZSBmaXJzdAorICAgICAgICBub24tb3B0aW9uIGFyZ3VtZW50LiAgKFRoaXMgaXMgdGhlIHRyYWRpdGlvbiBmb2xsb3dlZCBieQorICAgICAgICBQeXRob24ncyBnZXRvcHQgbW9kdWxlLCBQZXJsJ3MgR2V0b3B0OjpTdGQsIGFuZCBvdGhlciBhcmd1bWVudC0KKyAgICAgICAgcGFyc2luZyBsaWJyYXJpZXMsIGJ1dCBpdCBpcyBnZW5lcmFsbHkgYW5ub3lpbmcgdG8gdXNlcnMuKQorCisgICAgICBwcm9jZXNzX2RlZmF1bHRfdmFsdWVzIDogYm9vbCA9IHRydWUKKyAgICAgICAgaWYgdHJ1ZSwgb3B0aW9uIGRlZmF1bHQgdmFsdWVzIGFyZSBwcm9jZXNzZWQgc2ltaWxhcmx5IHRvIG9wdGlvbgorICAgICAgICB2YWx1ZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lOiB0aGF0IGlzLCB0aGV5IGFyZSBwYXNzZWQgdG8gdGhlCisgICAgICAgIHR5cGUtY2hlY2tpbmcgZnVuY3Rpb24gZm9yIHRoZSBvcHRpb24ncyB0eXBlIChhcyBsb25nIGFzIHRoZQorICAgICAgICBkZWZhdWx0IHZhbHVlIGlzIGEgc3RyaW5nKS4gIChUaGlzIHJlYWxseSBvbmx5IG1hdHRlcnMgaWYgeW91CisgICAgICAgIGhhdmUgZGVmaW5lZCBjdXN0b20gdHlwZXM7IHNlZSBTRiBidWcgIzk1NTg4OS4pICBTZXQgaXQgdG8gZmFsc2UKKyAgICAgICAgdG8gcmVzdG9yZSB0aGUgYmVoYXZpb3VyIG9mIE9wdGlrIDEuNC4xIGFuZCBlYXJsaWVyLgorCisgICAgICByYXJncyA6IFtzdHJpbmddCisgICAgICAgIHRoZSBhcmd1bWVudCBsaXN0IGN1cnJlbnRseSBiZWluZyBwYXJzZWQuICBPbmx5IHNldCB3aGVuCisgICAgICAgIHBhcnNlX2FyZ3MoKSBpcyBhY3RpdmUsIGFuZCBjb250aW51YWxseSB0cmltbWVkIGRvd24gYXMKKyAgICAgICAgd2UgY29uc3VtZSBhcmd1bWVudHMuICBNYWlubHkgdGhlcmUgZm9yIHRoZSBiZW5lZml0IG9mCisgICAgICAgIGNhbGxiYWNrIG9wdGlvbnMuCisgICAgICBsYXJncyA6IFtzdHJpbmddCisgICAgICAgIHRoZSBsaXN0IG9mIGxlZnRvdmVyIGFyZ3VtZW50cyB0aGF0IHdlIGhhdmUgc2tpcHBlZCB3aGlsZQorICAgICAgICBwYXJzaW5nIG9wdGlvbnMuICBJZiBhbGxvd19pbnRlcnNwZXJzZWRfYXJncyBpcyBmYWxzZSwgdGhpcworICAgICAgICBsaXN0IGlzIGFsd2F5cyBlbXB0eS4KKyAgICAgIHZhbHVlcyA6IFZhbHVlcworICAgICAgICB0aGUgc2V0IG9mIG9wdGlvbiB2YWx1ZXMgY3VycmVudGx5IGJlaW5nIGFjY3VtdWxhdGVkLiAgT25seQorICAgICAgICBzZXQgd2hlbiBwYXJzZV9hcmdzKCkgaXMgYWN0aXZlLiAgQWxzbyBtYWlubHkgZm9yIGNhbGxiYWNrcy4KKworICAgIEJlY2F1c2Ugb2YgdGhlICdyYXJncycsICdsYXJncycsIGFuZCAndmFsdWVzJyBhdHRyaWJ1dGVzLAorICAgIE9wdGlvblBhcnNlciBpcyBub3QgdGhyZWFkLXNhZmUuICBJZiwgZm9yIHNvbWUgcGVydmVyc2UgcmVhc29uLCB5b3UKKyAgICBuZWVkIHRvIHBhcnNlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgc2ltdWx0YW5lb3VzbHkgaW4gZGlmZmVyZW50CisgICAgdGhyZWFkcywgdXNlIGRpZmZlcmVudCBPcHRpb25QYXJzZXIgaW5zdGFuY2VzLgorCisgICAgIiIiCisKKyAgICBzdGFuZGFyZF9vcHRpb25fbGlzdCA9IFtdCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgdXNhZ2U9Tm9uZSwKKyAgICAgICAgICAgICAgICAgb3B0aW9uX2xpc3Q9Tm9uZSwKKyAgICAgICAgICAgICAgICAgb3B0aW9uX2NsYXNzPU9wdGlvbiwKKyAgICAgICAgICAgICAgICAgdmVyc2lvbj1Ob25lLAorICAgICAgICAgICAgICAgICBjb25mbGljdF9oYW5kbGVyPSJlcnJvciIsCisgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPU5vbmUsCisgICAgICAgICAgICAgICAgIGZvcm1hdHRlcj1Ob25lLAorICAgICAgICAgICAgICAgICBhZGRfaGVscF9vcHRpb249VHJ1ZSwKKyAgICAgICAgICAgICAgICAgcHJvZz1Ob25lLAorICAgICAgICAgICAgICAgICBlcGlsb2c9Tm9uZSk6CisgICAgICAgIE9wdGlvbkNvbnRhaW5lci5fX2luaXRfXygKKyAgICAgICAgICAgIHNlbGYsIG9wdGlvbl9jbGFzcywgY29uZmxpY3RfaGFuZGxlciwgZGVzY3JpcHRpb24pCisgICAgICAgIHNlbGYuc2V0X3VzYWdlKHVzYWdlKQorICAgICAgICBzZWxmLnByb2cgPSBwcm9nCisgICAgICAgIHNlbGYudmVyc2lvbiA9IHZlcnNpb24KKyAgICAgICAgc2VsZi5hbGxvd19pbnRlcnNwZXJzZWRfYXJncyA9IFRydWUKKyAgICAgICAgc2VsZi5wcm9jZXNzX2RlZmF1bHRfdmFsdWVzID0gVHJ1ZQorICAgICAgICBpZiBmb3JtYXR0ZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGZvcm1hdHRlciA9IEluZGVudGVkSGVscEZvcm1hdHRlcigpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyID0gZm9ybWF0dGVyCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnNldF9wYXJzZXIoc2VsZikKKyAgICAgICAgc2VsZi5lcGlsb2cgPSBlcGlsb2cKKworICAgICAgICAjIFBvcHVsYXRlIHRoZSBvcHRpb24gbGlzdDsgaW5pdGlhbCBzb3VyY2VzIGFyZSB0aGUKKyAgICAgICAgIyBzdGFuZGFyZF9vcHRpb25fbGlzdCBjbGFzcyBhdHRyaWJ1dGUsIHRoZSAnb3B0aW9uX2xpc3QnCisgICAgICAgICMgYXJndW1lbnQsIGFuZCAoaWYgYXBwbGljYWJsZSkgdGhlIF9hZGRfdmVyc2lvbl9vcHRpb24oKSBhbmQKKyAgICAgICAgIyBfYWRkX2hlbHBfb3B0aW9uKCkgbWV0aG9kcy4KKyAgICAgICAgc2VsZi5fcG9wdWxhdGVfb3B0aW9uX2xpc3Qob3B0aW9uX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9oZWxwPWFkZF9oZWxwX29wdGlvbikKKworICAgICAgICBzZWxmLl9pbml0X3BhcnNpbmdfc3RhdGUoKQorCisKKyAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIERlY2xhcmUgdGhhdCB5b3UgYXJlIGRvbmUgd2l0aCB0aGlzIE9wdGlvblBhcnNlci4gIFRoaXMgY2xlYW5zIHVwCisgICAgICAgIHJlZmVyZW5jZSBjeWNsZXMgc28gdGhlIE9wdGlvblBhcnNlciAoYW5kIGFsbCBvYmplY3RzIHJlZmVyZW5jZWQgYnkKKyAgICAgICAgaXQpIGNhbiBiZSBnYXJiYWdlLWNvbGxlY3RlZCBwcm9tcHRseS4gIEFmdGVyIGNhbGxpbmcgZGVzdHJveSgpLCB0aGUKKyAgICAgICAgT3B0aW9uUGFyc2VyIGlzIHVudXNhYmxlLgorICAgICAgICAiIiIKKyAgICAgICAgT3B0aW9uQ29udGFpbmVyLmRlc3Ryb3koc2VsZikKKyAgICAgICAgZm9yIGdyb3VwIGluIHNlbGYub3B0aW9uX2dyb3VwczoKKyAgICAgICAgICAgIGdyb3VwLmRlc3Ryb3koKQorICAgICAgICBkZWwgc2VsZi5vcHRpb25fbGlzdAorICAgICAgICBkZWwgc2VsZi5vcHRpb25fZ3JvdXBzCisgICAgICAgIGRlbCBzZWxmLmZvcm1hdHRlcgorCisKKyAgICAjIC0tIFByaXZhdGUgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgKHVzZWQgYnkgb3VyIG9yIE9wdGlvbkNvbnRhaW5lcidzIGNvbnN0cnVjdG9yKQorCisgICAgZGVmIF9jcmVhdGVfb3B0aW9uX2xpc3Qoc2VsZik6CisgICAgICAgIHNlbGYub3B0aW9uX2xpc3QgPSBbXQorICAgICAgICBzZWxmLm9wdGlvbl9ncm91cHMgPSBbXQorICAgICAgICBzZWxmLl9jcmVhdGVfb3B0aW9uX21hcHBpbmdzKCkKKworICAgIGRlZiBfYWRkX2hlbHBfb3B0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFkZF9vcHRpb24oIi1oIiwgIi0taGVscCIsCisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249ImhlbHAiLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD1fKCJzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0IikpCisKKyAgICBkZWYgX2FkZF92ZXJzaW9uX29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hZGRfb3B0aW9uKCItLXZlcnNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJ2ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Xygic2hvdyBwcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQiKSkKKworICAgIGRlZiBfcG9wdWxhdGVfb3B0aW9uX2xpc3Qoc2VsZiwgb3B0aW9uX2xpc3QsIGFkZF9oZWxwPVRydWUpOgorICAgICAgICBpZiBzZWxmLnN0YW5kYXJkX29wdGlvbl9saXN0OgorICAgICAgICAgICAgc2VsZi5hZGRfb3B0aW9ucyhzZWxmLnN0YW5kYXJkX29wdGlvbl9saXN0KQorICAgICAgICBpZiBvcHRpb25fbGlzdDoKKyAgICAgICAgICAgIHNlbGYuYWRkX29wdGlvbnMob3B0aW9uX2xpc3QpCisgICAgICAgIGlmIHNlbGYudmVyc2lvbjoKKyAgICAgICAgICAgIHNlbGYuX2FkZF92ZXJzaW9uX29wdGlvbigpCisgICAgICAgIGlmIGFkZF9oZWxwOgorICAgICAgICAgICAgc2VsZi5fYWRkX2hlbHBfb3B0aW9uKCkKKworICAgIGRlZiBfaW5pdF9wYXJzaW5nX3N0YXRlKHNlbGYpOgorICAgICAgICAjIFRoZXNlIGFyZSBzZXQgaW4gcGFyc2VfYXJncygpIGZvciB0aGUgY29udmVuaWVuY2Ugb2YgY2FsbGJhY2tzLgorICAgICAgICBzZWxmLnJhcmdzID0gTm9uZQorICAgICAgICBzZWxmLmxhcmdzID0gTm9uZQorICAgICAgICBzZWxmLnZhbHVlcyA9IE5vbmUKKworCisgICAgIyAtLSBTaW1wbGUgbW9kaWZpZXIgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBzZXRfdXNhZ2Uoc2VsZiwgdXNhZ2UpOgorICAgICAgICBpZiB1c2FnZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi51c2FnZSA9IF8oIiVwcm9nIFtvcHRpb25zXSIpCisgICAgICAgIGVsaWYgdXNhZ2UgaXMgU1VQUFJFU1NfVVNBR0U6CisgICAgICAgICAgICBzZWxmLnVzYWdlID0gTm9uZQorICAgICAgICAjIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIE9wdGlrIDEuMyBhbmQgZWFybGllci4KKyAgICAgICAgZWxpZiB1c2FnZS5sb3dlcigpLnN0YXJ0c3dpdGgoInVzYWdlOiAiKToKKyAgICAgICAgICAgIHNlbGYudXNhZ2UgPSB1c2FnZVs3Ol0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudXNhZ2UgPSB1c2FnZQorCisgICAgZGVmIGVuYWJsZV9pbnRlcnNwZXJzZWRfYXJncyhzZWxmKToKKyAgICAgICAgIiIiU2V0IHBhcnNpbmcgdG8gbm90IHN0b3Agb24gdGhlIGZpcnN0IG5vbi1vcHRpb24sIGFsbG93aW5nCisgICAgICAgIGludGVyc3BlcnNpbmcgc3dpdGNoZXMgd2l0aCBjb21tYW5kIGFyZ3VtZW50cy4gVGhpcyBpcyB0aGUKKyAgICAgICAgZGVmYXVsdCBiZWhhdmlvci4gU2VlIGFsc28gZGlzYWJsZV9pbnRlcnNwZXJzZWRfYXJncygpIGFuZCB0aGUKKyAgICAgICAgY2xhc3MgZG9jdW1lbnRhdGlvbiBkZXNjcmlwdGlvbiBvZiB0aGUgYXR0cmlidXRlCisgICAgICAgIGFsbG93X2ludGVyc3BlcnNlZF9hcmdzLiIiIgorICAgICAgICBzZWxmLmFsbG93X2ludGVyc3BlcnNlZF9hcmdzID0gVHJ1ZQorCisgICAgZGVmIGRpc2FibGVfaW50ZXJzcGVyc2VkX2FyZ3Moc2VsZik6CisgICAgICAgICIiIlNldCBwYXJzaW5nIHRvIHN0b3Agb24gdGhlIGZpcnN0IG5vbi1vcHRpb24uIFVzZSB0aGlzIGlmCisgICAgICAgIHlvdSBoYXZlIGEgY29tbWFuZCBwcm9jZXNzb3Igd2hpY2ggcnVucyBhbm90aGVyIGNvbW1hbmQgdGhhdAorICAgICAgICBoYXMgb3B0aW9ucyBvZiBpdHMgb3duIGFuZCB5b3Ugd2FudCB0byBtYWtlIHN1cmUgdGhlc2Ugb3B0aW9ucworICAgICAgICBkb24ndCBnZXQgY29uZnVzZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFsbG93X2ludGVyc3BlcnNlZF9hcmdzID0gRmFsc2UKKworICAgIGRlZiBzZXRfcHJvY2Vzc19kZWZhdWx0X3ZhbHVlcyhzZWxmLCBwcm9jZXNzKToKKyAgICAgICAgc2VsZi5wcm9jZXNzX2RlZmF1bHRfdmFsdWVzID0gcHJvY2VzcworCisgICAgZGVmIHNldF9kZWZhdWx0KHNlbGYsIGRlc3QsIHZhbHVlKToKKyAgICAgICAgc2VsZi5kZWZhdWx0c1tkZXN0XSA9IHZhbHVlCisKKyAgICBkZWYgc2V0X2RlZmF1bHRzKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5kZWZhdWx0cy51cGRhdGUoa3dhcmdzKQorCisgICAgZGVmIF9nZXRfYWxsX29wdGlvbnMoc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBzZWxmLm9wdGlvbl9saXN0WzpdCisgICAgICAgIGZvciBncm91cCBpbiBzZWxmLm9wdGlvbl9ncm91cHM6CisgICAgICAgICAgICBvcHRpb25zLmV4dGVuZChncm91cC5vcHRpb25fbGlzdCkKKyAgICAgICAgcmV0dXJuIG9wdGlvbnMKKworICAgIGRlZiBnZXRfZGVmYXVsdF92YWx1ZXMoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnByb2Nlc3NfZGVmYXVsdF92YWx1ZXM6CisgICAgICAgICAgICAjIE9sZCwgcHJlLU9wdGlrIDEuNSBiZWhhdmlvdXIuCisgICAgICAgICAgICByZXR1cm4gVmFsdWVzKHNlbGYuZGVmYXVsdHMpCisKKyAgICAgICAgZGVmYXVsdHMgPSBzZWxmLmRlZmF1bHRzLmNvcHkoKQorICAgICAgICBmb3Igb3B0aW9uIGluIHNlbGYuX2dldF9hbGxfb3B0aW9ucygpOgorICAgICAgICAgICAgZGVmYXVsdCA9IGRlZmF1bHRzLmdldChvcHRpb24uZGVzdCkKKyAgICAgICAgICAgIGlmIGlzYmFzZXN0cmluZyhkZWZhdWx0KToKKyAgICAgICAgICAgICAgICBvcHRfc3RyID0gb3B0aW9uLmdldF9vcHRfc3RyaW5nKCkKKyAgICAgICAgICAgICAgICBkZWZhdWx0c1tvcHRpb24uZGVzdF0gPSBvcHRpb24uY2hlY2tfdmFsdWUob3B0X3N0ciwgZGVmYXVsdCkKKworICAgICAgICByZXR1cm4gVmFsdWVzKGRlZmF1bHRzKQorCisKKyAgICAjIC0tIE9wdGlvbkdyb3VwIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGFkZF9vcHRpb25fZ3JvdXAoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIyBYWFggbG90cyBvZiBvdmVybGFwIHdpdGggT3B0aW9uQ29udGFpbmVyLmFkZF9vcHRpb24oKQorICAgICAgICBpZiB0eXBlKGFyZ3NbMF0pIGlzIHR5cGVzLlN0cmluZ1R5cGU6CisgICAgICAgICAgICBncm91cCA9IE9wdGlvbkdyb3VwKHNlbGYsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMSBhbmQgbm90IGt3YXJnczoKKyAgICAgICAgICAgIGdyb3VwID0gYXJnc1swXQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZ3JvdXAsIE9wdGlvbkdyb3VwKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJub3QgYW4gT3B0aW9uR3JvdXAgaW5zdGFuY2U6ICVyIiAlIGdyb3VwCisgICAgICAgICAgICBpZiBncm91cC5wYXJzZXIgaXMgbm90IHNlbGY6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImludmFsaWQgT3B0aW9uR3JvdXAgKHdyb25nIHBhcnNlcikiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJpbnZhbGlkIGFyZ3VtZW50cyIKKworICAgICAgICBzZWxmLm9wdGlvbl9ncm91cHMuYXBwZW5kKGdyb3VwKQorICAgICAgICByZXR1cm4gZ3JvdXAKKworICAgIGRlZiBnZXRfb3B0aW9uX2dyb3VwKHNlbGYsIG9wdF9zdHIpOgorICAgICAgICBvcHRpb24gPSAoc2VsZi5fc2hvcnRfb3B0LmdldChvcHRfc3RyKSBvcgorICAgICAgICAgICAgICAgICAgc2VsZi5fbG9uZ19vcHQuZ2V0KG9wdF9zdHIpKQorICAgICAgICBpZiBvcHRpb24gYW5kIG9wdGlvbi5jb250YWluZXIgaXMgbm90IHNlbGY6CisgICAgICAgICAgICByZXR1cm4gb3B0aW9uLmNvbnRhaW5lcgorICAgICAgICByZXR1cm4gTm9uZQorCisKKyAgICAjIC0tIE9wdGlvbi1wYXJzaW5nIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIF9nZXRfYXJncyhzZWxmLCBhcmdzKToKKyAgICAgICAgaWYgYXJncyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHN5cy5hcmd2WzE6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGFyZ3NbOl0gICAgICAgICAgICAgICMgZG9uJ3QgbW9kaWZ5IGNhbGxlcidzIGxpc3QKKworICAgIGRlZiBwYXJzZV9hcmdzKHNlbGYsIGFyZ3M9Tm9uZSwgdmFsdWVzPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgcGFyc2VfYXJncyhhcmdzIDogW3N0cmluZ10gPSBzeXMuYXJndlsxOl0sCisgICAgICAgICAgICAgICAgICAgdmFsdWVzIDogVmFsdWVzID0gTm9uZSkKKyAgICAgICAgLT4gKHZhbHVlcyA6IFZhbHVlcywgYXJncyA6IFtzdHJpbmddKQorCisgICAgICAgIFBhcnNlIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3VuZCBpbiAnYXJncycgKGRlZmF1bHQ6CisgICAgICAgIHN5cy5hcmd2WzE6XSkuICBBbnkgZXJyb3JzIHJlc3VsdCBpbiBhIGNhbGwgdG8gJ2Vycm9yKCknLCB3aGljaAorICAgICAgICBieSBkZWZhdWx0IHByaW50cyB0aGUgdXNhZ2UgbWVzc2FnZSB0byBzdGRlcnIgYW5kIGNhbGxzCisgICAgICAgIHN5cy5leGl0KCkgd2l0aCBhbiBlcnJvciBtZXNzYWdlLiAgT24gc3VjY2VzcyByZXR1cm5zIGEgcGFpcgorICAgICAgICAodmFsdWVzLCBhcmdzKSB3aGVyZSAndmFsdWVzJyBpcyBhbiBWYWx1ZXMgaW5zdGFuY2UgKHdpdGggYWxsCisgICAgICAgIHlvdXIgb3B0aW9uIHZhbHVlcykgYW5kICdhcmdzJyBpcyB0aGUgbGlzdCBvZiBhcmd1bWVudHMgbGVmdAorICAgICAgICBvdmVyIGFmdGVyIHBhcnNpbmcgb3B0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIHJhcmdzID0gc2VsZi5fZ2V0X2FyZ3MoYXJncykKKyAgICAgICAgaWYgdmFsdWVzIGlzIE5vbmU6CisgICAgICAgICAgICB2YWx1ZXMgPSBzZWxmLmdldF9kZWZhdWx0X3ZhbHVlcygpCisKKyAgICAgICAgIyBTdG9yZSB0aGUgaGFsdmVzIG9mIHRoZSBhcmd1bWVudCBsaXN0IGFzIGF0dHJpYnV0ZXMgZm9yIHRoZQorICAgICAgICAjIGNvbnZlbmllbmNlIG9mIGNhbGxiYWNrczoKKyAgICAgICAgIyAgIHJhcmdzCisgICAgICAgICMgICAgIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kLWxpbmUgKHRoZSAiciIgc3RhbmRzIGZvcgorICAgICAgICAjICAgICAicmVtYWluaW5nIiBvciAicmlnaHQtaGFuZCIpCisgICAgICAgICMgICBsYXJncworICAgICAgICAjICAgICB0aGUgbGVmdG92ZXIgYXJndW1lbnRzIC0tIGllLiB3aGF0J3MgbGVmdCBhZnRlciByZW1vdmluZworICAgICAgICAjICAgICBvcHRpb25zIGFuZCB0aGVpciBhcmd1bWVudHMgKHRoZSAibCIgc3RhbmRzIGZvciAibGVmdG92ZXIiCisgICAgICAgICMgICAgIG9yICJsZWZ0LWhhbmQiKQorICAgICAgICBzZWxmLnJhcmdzID0gcmFyZ3MKKyAgICAgICAgc2VsZi5sYXJncyA9IGxhcmdzID0gW10KKyAgICAgICAgc2VsZi52YWx1ZXMgPSB2YWx1ZXMKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzdG9wID0gc2VsZi5fcHJvY2Vzc19hcmdzKGxhcmdzLCByYXJncywgdmFsdWVzKQorICAgICAgICBleGNlcHQgKEJhZE9wdGlvbkVycm9yLCBPcHRpb25WYWx1ZUVycm9yKSwgZXJyOgorICAgICAgICAgICAgc2VsZi5lcnJvcihzdHIoZXJyKSkKKworICAgICAgICBhcmdzID0gbGFyZ3MgKyByYXJncworICAgICAgICByZXR1cm4gc2VsZi5jaGVja192YWx1ZXModmFsdWVzLCBhcmdzKQorCisgICAgZGVmIGNoZWNrX3ZhbHVlcyhzZWxmLCB2YWx1ZXMsIGFyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgY2hlY2tfdmFsdWVzKHZhbHVlcyA6IFZhbHVlcywgYXJncyA6IFtzdHJpbmddKQorICAgICAgICAtPiAodmFsdWVzIDogVmFsdWVzLCBhcmdzIDogW3N0cmluZ10pCisKKyAgICAgICAgQ2hlY2sgdGhhdCB0aGUgc3VwcGxpZWQgb3B0aW9uIHZhbHVlcyBhbmQgbGVmdG92ZXIgYXJndW1lbnRzIGFyZQorICAgICAgICB2YWxpZC4gIFJldHVybnMgdGhlIG9wdGlvbiB2YWx1ZXMgYW5kIGxlZnRvdmVyIGFyZ3VtZW50cworICAgICAgICAocG9zc2libHkgYWRqdXN0ZWQsIHBvc3NpYmx5IGNvbXBsZXRlbHkgbmV3IC0tIHdoYXRldmVyIHlvdQorICAgICAgICBsaWtlKS4gIERlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCByZXR1cm5zIHRoZSBwYXNzZWQtaW4KKyAgICAgICAgdmFsdWVzOyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZSBhcyBkZXNpcmVkLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICh2YWx1ZXMsIGFyZ3MpCisKKyAgICBkZWYgX3Byb2Nlc3NfYXJncyhzZWxmLCBsYXJncywgcmFyZ3MsIHZhbHVlcyk6CisgICAgICAgICIiIl9wcm9jZXNzX2FyZ3MobGFyZ3MgOiBbc3RyaW5nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByYXJncyA6IFtzdHJpbmddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA6IFZhbHVlcykKKworICAgICAgICBQcm9jZXNzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYW5kIHBvcHVsYXRlICd2YWx1ZXMnLCBjb25zdW1pbmcKKyAgICAgICAgb3B0aW9ucyBhbmQgYXJndW1lbnRzIGZyb20gJ3JhcmdzJy4gIElmICdhbGxvd19pbnRlcnNwZXJzZWRfYXJncycgaXMKKyAgICAgICAgZmFsc2UsIHN0b3AgYXQgdGhlIGZpcnN0IG5vbi1vcHRpb24gYXJndW1lbnQuICBJZiB0cnVlLCBhY2N1bXVsYXRlIGFueQorICAgICAgICBpbnRlcnNwZXJzZWQgbm9uLW9wdGlvbiBhcmd1bWVudHMgaW4gJ2xhcmdzJy4KKyAgICAgICAgIiIiCisgICAgICAgIHdoaWxlIHJhcmdzOgorICAgICAgICAgICAgYXJnID0gcmFyZ3NbMF0KKyAgICAgICAgICAgICMgV2UgaGFuZGxlIGJhcmUgIi0tIiBleHBsaWNpdGx5LCBhbmQgYmFyZSAiLSIgaXMgaGFuZGxlZCBieSB0aGUKKyAgICAgICAgICAgICMgc3RhbmRhcmQgYXJnIGhhbmRsZXIgc2luY2UgdGhlIHNob3J0IGFyZyBjYXNlIGVuc3VyZXMgdGhhdCB0aGUKKyAgICAgICAgICAgICMgbGVuIG9mIHRoZSBvcHQgc3RyaW5nIGlzIGdyZWF0ZXIgdGhhbiAxLgorICAgICAgICAgICAgaWYgYXJnID09ICItLSI6CisgICAgICAgICAgICAgICAgZGVsIHJhcmdzWzBdCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbGlmIGFyZ1swOjJdID09ICItLSI6CisgICAgICAgICAgICAgICAgIyBwcm9jZXNzIGEgc2luZ2xlIGxvbmcgb3B0aW9uIChwb3NzaWJseSB3aXRoIHZhbHVlKHMpKQorICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3NfbG9uZ19vcHQocmFyZ3MsIHZhbHVlcykKKyAgICAgICAgICAgIGVsaWYgYXJnWzoxXSA9PSAiLSIgYW5kIGxlbihhcmcpID4gMToKKyAgICAgICAgICAgICAgICAjIHByb2Nlc3MgYSBjbHVzdGVyIG9mIHNob3J0IG9wdGlvbnMgKHBvc3NpYmx5IHdpdGgKKyAgICAgICAgICAgICAgICAjIHZhbHVlKHMpIGZvciB0aGUgbGFzdCBvbmUgb25seSkKKyAgICAgICAgICAgICAgICBzZWxmLl9wcm9jZXNzX3Nob3J0X29wdHMocmFyZ3MsIHZhbHVlcykKKyAgICAgICAgICAgIGVsaWYgc2VsZi5hbGxvd19pbnRlcnNwZXJzZWRfYXJnczoKKyAgICAgICAgICAgICAgICBsYXJncy5hcHBlbmQoYXJnKQorICAgICAgICAgICAgICAgIGRlbCByYXJnc1swXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAjIHN0b3Agbm93LCBsZWF2ZSB0aGlzIGFyZyBpbiByYXJncworCisgICAgICAgICMgU2F5IHRoaXMgaXMgdGhlIG9yaWdpbmFsIGFyZ3VtZW50IGxpc3Q6CisgICAgICAgICMgW2FyZzAsIGFyZzEsIC4uLiwgYXJnKGktMSksIGFyZyhpKSwgYXJnKGkrMSksIC4uLiwgYXJnKE4tMSldCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorICAgICAgICAjICh3ZSBhcmUgYWJvdXQgdG8gcHJvY2VzcyBhcmcoaSkpLgorICAgICAgICAjCisgICAgICAgICMgVGhlbiByYXJncyBpcyBbYXJnKGkpLCAuLi4sIGFyZyhOLTEpXSBhbmQgbGFyZ3MgaXMgYSAqc3Vic2V0KiBvZgorICAgICAgICAjIFthcmcwLCAuLi4sIGFyZyhpLTEpXSAoYW55IG9wdGlvbnMgYW5kIHRoZWlyIGFyZ3VtZW50cyB3aWxsIGhhdmUKKyAgICAgICAgIyBiZWVuIHJlbW92ZWQgZnJvbSBsYXJncykuCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgd2hpbGUgbG9vcCB3aWxsIHVzdWFsbHkgY29uc3VtZSAxIG9yIG1vcmUgYXJndW1lbnRzIHBlciBwYXNzLgorICAgICAgICAjIElmIGl0IGNvbnN1bWVzIDEgKGVnLiBhcmcgaXMgYW4gb3B0aW9uIHRoYXQgdGFrZXMgbm8gYXJndW1lbnRzKSwKKyAgICAgICAgIyB0aGVuIGFmdGVyIF9wcm9jZXNzX2FyZygpIGlzIGRvbmUgdGhlIHNpdHVhdGlvbiBpczoKKyAgICAgICAgIworICAgICAgICAjICAgbGFyZ3MgPSBzdWJzZXQgb2YgW2FyZzAsIC4uLiwgYXJnKGkpXQorICAgICAgICAjICAgcmFyZ3MgPSBbYXJnKGkrMSksIC4uLiwgYXJnKE4tMSldCisgICAgICAgICMKKyAgICAgICAgIyBJZiBhbGxvd19pbnRlcnNwZXJzZWRfYXJncyBpcyBmYWxzZSwgbGFyZ3Mgd2lsbCBhbHdheXMgYmUKKyAgICAgICAgIyAqZW1wdHkqIC0tIHN0aWxsIGEgc3Vic2V0IG9mIFthcmcwLCAuLi4sIGFyZyhpLTEpXSwgYnV0CisgICAgICAgICMgbm90IGEgdmVyeSBpbnRlcmVzdGluZyBzdWJzZXQhCisKKyAgICBkZWYgX21hdGNoX2xvbmdfb3B0KHNlbGYsIG9wdCk6CisgICAgICAgICIiIl9tYXRjaF9sb25nX29wdChvcHQgOiBzdHJpbmcpIC0+IHN0cmluZworCisgICAgICAgIERldGVybWluZSB3aGljaCBsb25nIG9wdGlvbiBzdHJpbmcgJ29wdCcgbWF0Y2hlcywgaWUuIHdoaWNoIG9uZQorICAgICAgICBpdCBpcyBhbiB1bmFtYmlndW91cyBhYmJyZXZhdGlvbiBmb3IuICBSYWlzZXMgQmFkT3B0aW9uRXJyb3IgaWYKKyAgICAgICAgJ29wdCcgZG9lc24ndCB1bmFtYmlndW91c2x5IG1hdGNoIGFueSBsb25nIG9wdGlvbiBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gX21hdGNoX2FiYnJldihvcHQsIHNlbGYuX2xvbmdfb3B0KQorCisgICAgZGVmIF9wcm9jZXNzX2xvbmdfb3B0KHNlbGYsIHJhcmdzLCB2YWx1ZXMpOgorICAgICAgICBhcmcgPSByYXJncy5wb3AoMCkKKworICAgICAgICAjIFZhbHVlIGV4cGxpY2l0bHkgYXR0YWNoZWQgdG8gYXJnPyAgUHJldGVuZCBpdCdzIHRoZSBuZXh0CisgICAgICAgICMgYXJndW1lbnQuCisgICAgICAgIGlmICI9IiBpbiBhcmc6CisgICAgICAgICAgICAob3B0LCBuZXh0X2FyZykgPSBhcmcuc3BsaXQoIj0iLCAxKQorICAgICAgICAgICAgcmFyZ3MuaW5zZXJ0KDAsIG5leHRfYXJnKQorICAgICAgICAgICAgaGFkX2V4cGxpY2l0X3ZhbHVlID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3B0ID0gYXJnCisgICAgICAgICAgICBoYWRfZXhwbGljaXRfdmFsdWUgPSBGYWxzZQorCisgICAgICAgIG9wdCA9IHNlbGYuX21hdGNoX2xvbmdfb3B0KG9wdCkKKyAgICAgICAgb3B0aW9uID0gc2VsZi5fbG9uZ19vcHRbb3B0XQorICAgICAgICBpZiBvcHRpb24udGFrZXNfdmFsdWUoKToKKyAgICAgICAgICAgIG5hcmdzID0gb3B0aW9uLm5hcmdzCisgICAgICAgICAgICBpZiBsZW4ocmFyZ3MpIDwgbmFyZ3M6CisgICAgICAgICAgICAgICAgaWYgbmFyZ3MgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcihfKCIlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiKSAlIG9wdCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKF8oIiVzIG9wdGlvbiByZXF1aXJlcyAlZCBhcmd1bWVudHMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKG9wdCwgbmFyZ3MpKQorICAgICAgICAgICAgZWxpZiBuYXJncyA9PSAxOgorICAgICAgICAgICAgICAgIHZhbHVlID0gcmFyZ3MucG9wKDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdHVwbGUocmFyZ3NbMDpuYXJnc10pCisgICAgICAgICAgICAgICAgZGVsIHJhcmdzWzA6bmFyZ3NdCisKKyAgICAgICAgZWxpZiBoYWRfZXhwbGljaXRfdmFsdWU6CisgICAgICAgICAgICBzZWxmLmVycm9yKF8oIiVzIG9wdGlvbiBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKSAlIG9wdCkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsdWUgPSBOb25lCisKKyAgICAgICAgb3B0aW9uLnByb2Nlc3Mob3B0LCB2YWx1ZSwgdmFsdWVzLCBzZWxmKQorCisgICAgZGVmIF9wcm9jZXNzX3Nob3J0X29wdHMoc2VsZiwgcmFyZ3MsIHZhbHVlcyk6CisgICAgICAgIGFyZyA9IHJhcmdzLnBvcCgwKQorICAgICAgICBzdG9wID0gRmFsc2UKKyAgICAgICAgaSA9IDEKKyAgICAgICAgZm9yIGNoIGluIGFyZ1sxOl06CisgICAgICAgICAgICBvcHQgPSAiLSIgKyBjaAorICAgICAgICAgICAgb3B0aW9uID0gc2VsZi5fc2hvcnRfb3B0LmdldChvcHQpCisgICAgICAgICAgICBpICs9IDEgICAgICAgICAgICAgICAgICAgICAgIyB3ZSBoYXZlIGNvbnN1bWVkIGEgY2hhcmFjdGVyCisKKyAgICAgICAgICAgIGlmIG5vdCBvcHRpb246CisgICAgICAgICAgICAgICAgcmFpc2UgQmFkT3B0aW9uRXJyb3Iob3B0KQorICAgICAgICAgICAgaWYgb3B0aW9uLnRha2VzX3ZhbHVlKCk6CisgICAgICAgICAgICAgICAgIyBBbnkgY2hhcmFjdGVycyBsZWZ0IGluIGFyZz8gIFByZXRlbmQgdGhleSdyZSB0aGUKKyAgICAgICAgICAgICAgICAjIG5leHQgYXJnLCBhbmQgc3RvcCBjb25zdW1pbmcgY2hhcmFjdGVycyBvZiBhcmcuCisgICAgICAgICAgICAgICAgaWYgaSA8IGxlbihhcmcpOgorICAgICAgICAgICAgICAgICAgICByYXJncy5pbnNlcnQoMCwgYXJnW2k6XSkKKyAgICAgICAgICAgICAgICAgICAgc3RvcCA9IFRydWUKKworICAgICAgICAgICAgICAgIG5hcmdzID0gb3B0aW9uLm5hcmdzCisgICAgICAgICAgICAgICAgaWYgbGVuKHJhcmdzKSA8IG5hcmdzOgorICAgICAgICAgICAgICAgICAgICBpZiBuYXJncyA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcihfKCIlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiKSAlIG9wdCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoXygiJXMgb3B0aW9uIHJlcXVpcmVzICVkIGFyZ3VtZW50cyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKG9wdCwgbmFyZ3MpKQorICAgICAgICAgICAgICAgIGVsaWYgbmFyZ3MgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByYXJncy5wb3AoMCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHR1cGxlKHJhcmdzWzA6bmFyZ3NdKQorICAgICAgICAgICAgICAgICAgICBkZWwgcmFyZ3NbMDpuYXJnc10KKworICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uIGRvZXNuJ3QgdGFrZSBhIHZhbHVlCisgICAgICAgICAgICAgICAgdmFsdWUgPSBOb25lCisKKyAgICAgICAgICAgIG9wdGlvbi5wcm9jZXNzKG9wdCwgdmFsdWUsIHZhbHVlcywgc2VsZikKKworICAgICAgICAgICAgaWYgc3RvcDoKKyAgICAgICAgICAgICAgICBicmVhaworCisKKyAgICAjIC0tIEZlZWRiYWNrIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGdldF9wcm9nX25hbWUoc2VsZik6CisgICAgICAgIGlmIHNlbGYucHJvZyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wcm9nCisKKyAgICBkZWYgZXhwYW5kX3Byb2dfbmFtZShzZWxmLCBzKToKKyAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgiJXByb2ciLCBzZWxmLmdldF9wcm9nX25hbWUoKSkKKworICAgIGRlZiBnZXRfZGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cGFuZF9wcm9nX25hbWUoc2VsZi5kZXNjcmlwdGlvbikKKworICAgIGRlZiBleGl0KHNlbGYsIHN0YXR1cz0wLCBtc2c9Tm9uZSk6CisgICAgICAgIGlmIG1zZzoKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnKQorICAgICAgICBzeXMuZXhpdChzdGF0dXMpCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgbXNnKToKKyAgICAgICAgIiIiZXJyb3IobXNnIDogc3RyaW5nKQorCisgICAgICAgIFByaW50IGEgdXNhZ2UgbWVzc2FnZSBpbmNvcnBvcmF0aW5nICdtc2cnIHRvIHN0ZGVyciBhbmQgZXhpdC4KKyAgICAgICAgSWYgeW91IG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcywgaXQgc2hvdWxkIG5vdCByZXR1cm4gLS0gaXQKKyAgICAgICAgc2hvdWxkIGVpdGhlciBleGl0IG9yIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucHJpbnRfdXNhZ2Uoc3lzLnN0ZGVycikKKyAgICAgICAgc2VsZi5leGl0KDIsICIlczogZXJyb3I6ICVzXG4iICUgKHNlbGYuZ2V0X3Byb2dfbmFtZSgpLCBtc2cpKQorCisgICAgZGVmIGdldF91c2FnZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi51c2FnZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZvcm1hdHRlci5mb3JtYXRfdXNhZ2UoCisgICAgICAgICAgICAgICAgc2VsZi5leHBhbmRfcHJvZ19uYW1lKHNlbGYudXNhZ2UpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICIiCisKKyAgICBkZWYgcHJpbnRfdXNhZ2Uoc2VsZiwgZmlsZT1Ob25lKToKKyAgICAgICAgIiIicHJpbnRfdXNhZ2UoZmlsZSA6IGZpbGUgPSBzdGRvdXQpCisKKyAgICAgICAgUHJpbnQgdGhlIHVzYWdlIG1lc3NhZ2UgZm9yIHRoZSBjdXJyZW50IHByb2dyYW0gKHNlbGYudXNhZ2UpIHRvCisgICAgICAgICdmaWxlJyAoZGVmYXVsdCBzdGRvdXQpLiAgQW55IG9jY3VycmVuY2Ugb2YgdGhlIHN0cmluZyAiJXByb2ciIGluCisgICAgICAgIHNlbGYudXNhZ2UgaXMgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBwcm9ncmFtCisgICAgICAgIChiYXNlbmFtZSBvZiBzeXMuYXJndlswXSkuICBEb2VzIG5vdGhpbmcgaWYgc2VsZi51c2FnZSBpcyBlbXB0eQorICAgICAgICBvciBub3QgZGVmaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYudXNhZ2U6CisgICAgICAgICAgICBwcmludCA+PmZpbGUsIHNlbGYuZ2V0X3VzYWdlKCkKKworICAgIGRlZiBnZXRfdmVyc2lvbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi52ZXJzaW9uOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXhwYW5kX3Byb2dfbmFtZShzZWxmLnZlcnNpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIiIKKworICAgIGRlZiBwcmludF92ZXJzaW9uKHNlbGYsIGZpbGU9Tm9uZSk6CisgICAgICAgICIiInByaW50X3ZlcnNpb24oZmlsZSA6IGZpbGUgPSBzdGRvdXQpCisKKyAgICAgICAgUHJpbnQgdGhlIHZlcnNpb24gbWVzc2FnZSBmb3IgdGhpcyBwcm9ncmFtIChzZWxmLnZlcnNpb24pIHRvCisgICAgICAgICdmaWxlJyAoZGVmYXVsdCBzdGRvdXQpLiAgQXMgd2l0aCBwcmludF91c2FnZSgpLCBhbnkgb2NjdXJyZW5jZQorICAgICAgICBvZiAiJXByb2ciIGluIHNlbGYudmVyc2lvbiBpcyByZXBsYWNlZCBieSB0aGUgY3VycmVudCBwcm9ncmFtJ3MKKyAgICAgICAgbmFtZS4gIERvZXMgbm90aGluZyBpZiBzZWxmLnZlcnNpb24gaXMgZW1wdHkgb3IgdW5kZWZpbmVkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi52ZXJzaW9uOgorICAgICAgICAgICAgcHJpbnQgPj5maWxlLCBzZWxmLmdldF92ZXJzaW9uKCkKKworICAgIGRlZiBmb3JtYXRfb3B0aW9uX2hlbHAoc2VsZiwgZm9ybWF0dGVyPU5vbmUpOgorICAgICAgICBpZiBmb3JtYXR0ZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGZvcm1hdHRlciA9IHNlbGYuZm9ybWF0dGVyCisgICAgICAgIGZvcm1hdHRlci5zdG9yZV9vcHRpb25fc3RyaW5ncyhzZWxmKQorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICByZXN1bHQuYXBwZW5kKGZvcm1hdHRlci5mb3JtYXRfaGVhZGluZyhfKCJPcHRpb25zIikpKQorICAgICAgICBmb3JtYXR0ZXIuaW5kZW50KCkKKyAgICAgICAgaWYgc2VsZi5vcHRpb25fbGlzdDoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoT3B0aW9uQ29udGFpbmVyLmZvcm1hdF9vcHRpb25faGVscChzZWxmLCBmb3JtYXR0ZXIpKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKQorICAgICAgICBmb3IgZ3JvdXAgaW4gc2VsZi5vcHRpb25fZ3JvdXBzOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChncm91cC5mb3JtYXRfaGVscChmb3JtYXR0ZXIpKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKQorICAgICAgICBmb3JtYXR0ZXIuZGVkZW50KCkKKyAgICAgICAgIyBEcm9wIHRoZSBsYXN0ICJcbiIsIG9yIHRoZSBoZWFkZXIgaWYgbm8gb3B0aW9ucyBvciBvcHRpb24gZ3JvdXBzOgorICAgICAgICByZXR1cm4gIiIuam9pbihyZXN1bHRbOi0xXSkKKworICAgIGRlZiBmb3JtYXRfZXBpbG9nKHNlbGYsIGZvcm1hdHRlcik6CisgICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0X2VwaWxvZyhzZWxmLmVwaWxvZykKKworICAgIGRlZiBmb3JtYXRfaGVscChzZWxmLCBmb3JtYXR0ZXI9Tm9uZSk6CisgICAgICAgIGlmIGZvcm1hdHRlciBpcyBOb25lOgorICAgICAgICAgICAgZm9ybWF0dGVyID0gc2VsZi5mb3JtYXR0ZXIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgaWYgc2VsZi51c2FnZToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VsZi5nZXRfdXNhZ2UoKSArICJcbiIpCisgICAgICAgIGlmIHNlbGYuZGVzY3JpcHRpb246CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHNlbGYuZm9ybWF0X2Rlc2NyaXB0aW9uKGZvcm1hdHRlcikgKyAiXG4iKQorICAgICAgICByZXN1bHQuYXBwZW5kKHNlbGYuZm9ybWF0X29wdGlvbl9oZWxwKGZvcm1hdHRlcikpCisgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VsZi5mb3JtYXRfZXBpbG9nKGZvcm1hdHRlcikpCisgICAgICAgIHJldHVybiAiIi5qb2luKHJlc3VsdCkKKworICAgICMgdXNlZCBieSB0ZXN0IHN1aXRlCisgICAgZGVmIF9nZXRfZW5jb2Rpbmcoc2VsZiwgZmlsZSk6CisgICAgICAgIGVuY29kaW5nID0gZ2V0YXR0cihmaWxlLCAiZW5jb2RpbmciLCBOb25lKQorICAgICAgICBpZiBub3QgZW5jb2Rpbmc6CisgICAgICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQorICAgICAgICByZXR1cm4gZW5jb2RpbmcKKworICAgIGRlZiBwcmludF9oZWxwKHNlbGYsIGZpbGU9Tm9uZSk6CisgICAgICAgICIiInByaW50X2hlbHAoZmlsZSA6IGZpbGUgPSBzdGRvdXQpCisKKyAgICAgICAgUHJpbnQgYW4gZXh0ZW5kZWQgaGVscCBtZXNzYWdlLCBsaXN0aW5nIGFsbCBvcHRpb25zIGFuZCBhbnkKKyAgICAgICAgaGVscCB0ZXh0IHByb3ZpZGVkIHdpdGggdGhlbSwgdG8gJ2ZpbGUnIChkZWZhdWx0IHN0ZG91dCkuCisgICAgICAgICIiIgorICAgICAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgICAgICBmaWxlID0gc3lzLnN0ZG91dAorICAgICAgICBlbmNvZGluZyA9IHNlbGYuX2dldF9lbmNvZGluZyhmaWxlKQorICAgICAgICBmaWxlLndyaXRlKHNlbGYuZm9ybWF0X2hlbHAoKS5lbmNvZGUoZW5jb2RpbmcsICJyZXBsYWNlIikpCisKKyMgY2xhc3MgT3B0aW9uUGFyc2VyCisKKworZGVmIF9tYXRjaF9hYmJyZXYocywgd29yZG1hcCk6CisgICAgIiIiX21hdGNoX2FiYnJldihzIDogc3RyaW5nLCB3b3JkbWFwIDoge3N0cmluZyA6IE9wdGlvbn0pIC0+IHN0cmluZworCisgICAgUmV0dXJuIHRoZSBzdHJpbmcga2V5IGluICd3b3JkbWFwJyBmb3Igd2hpY2ggJ3MnIGlzIGFuIHVuYW1iaWd1b3VzCisgICAgYWJicmV2aWF0aW9uLiAgSWYgJ3MnIGlzIGZvdW5kIHRvIGJlIGFtYmlndW91cyBvciBkb2Vzbid0IG1hdGNoIGFueSBvZgorICAgICd3b3JkcycsIHJhaXNlIEJhZE9wdGlvbkVycm9yLgorICAgICIiIgorICAgICMgSXMgdGhlcmUgYW4gZXhhY3QgbWF0Y2g/CisgICAgaWYgcyBpbiB3b3JkbWFwOgorICAgICAgICByZXR1cm4gcworICAgIGVsc2U6CisgICAgICAgICMgSXNvbGF0ZSBhbGwgd29yZHMgd2l0aCBzIGFzIGEgcHJlZml4LgorICAgICAgICBwb3NzaWJpbGl0aWVzID0gW3dvcmQgZm9yIHdvcmQgaW4gd29yZG1hcC5rZXlzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiB3b3JkLnN0YXJ0c3dpdGgocyldCisgICAgICAgICMgTm8gZXhhY3QgbWF0Y2gsIHNvIHRoZXJlIGhhZCBiZXR0ZXIgYmUganVzdCBvbmUgcG9zc2liaWxpdHkuCisgICAgICAgIGlmIGxlbihwb3NzaWJpbGl0aWVzKSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIHBvc3NpYmlsaXRpZXNbMF0KKyAgICAgICAgZWxpZiBub3QgcG9zc2liaWxpdGllczoKKyAgICAgICAgICAgIHJhaXNlIEJhZE9wdGlvbkVycm9yKHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE1vcmUgdGhhbiBvbmUgcG9zc2libGUgY29tcGxldGlvbjogYW1iaWd1b3VzIHByZWZpeC4KKyAgICAgICAgICAgIHBvc3NpYmlsaXRpZXMuc29ydCgpCisgICAgICAgICAgICByYWlzZSBBbWJpZ3VvdXNPcHRpb25FcnJvcihzLCBwb3NzaWJpbGl0aWVzKQorCisKKyMgU29tZSBkYXksIHRoZXJlIG1pZ2h0IGJlIG1hbnkgT3B0aW9uIGNsYXNzZXMuICBBcyBvZiBPcHRpayAxLjMsIHRoZQorIyBwcmVmZXJyZWQgd2F5IHRvIGluc3RhbnRpYXRlIE9wdGlvbnMgaXMgaW5kaXJlY3RseSwgdmlhIG1ha2Vfb3B0aW9uKCksCisjIHdoaWNoIHdpbGwgYmVjb21lIGEgZmFjdG9yeSBmdW5jdGlvbiB3aGVuIHRoZXJlIGFyZSBtYW55IE9wdGlvbgorIyBjbGFzc2VzLgorbWFrZV9vcHRpb24gPSBPcHRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvb3B0cGFyc2UucHljIGIvbGliL3B5dGhvbjIuNy9vcHRwYXJzZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU3NTVlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvb3B0cGFyc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvb3B0cGFyc2UucHlvIGIvbGliL3B5dGhvbjIuNy9vcHRwYXJzZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4Y2RmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvb3B0cGFyc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvb3MucHkgYi9saWIvcHl0aG9uMi43L29zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTk4ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L29zLnB5CkBAIC0wLDAgKzEsNzQwIEBACityIiIiT1Mgcm91dGluZXMgZm9yIE1hYywgTlQsIG9yIFBvc2l4IGRlcGVuZGluZyBvbiB3aGF0IHN5c3RlbSB3ZSdyZSBvbi4KKworVGhpcyBleHBvcnRzOgorICAtIGFsbCBmdW5jdGlvbnMgZnJvbSBwb3NpeCwgbnQsIG9zMiwgb3IgY2UsIGUuZy4gdW5saW5rLCBzdGF0LCBldGMuCisgIC0gb3MucGF0aCBpcyBvbmUgb2YgdGhlIG1vZHVsZXMgcG9zaXhwYXRoLCBvciBudHBhdGgKKyAgLSBvcy5uYW1lIGlzICdwb3NpeCcsICdudCcsICdvczInLCAnY2UnIG9yICdyaXNjb3MnCisgIC0gb3MuY3VyZGlyIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBkaXJlY3RvcnkgKCcuJyBvciAnOicpCisgIC0gb3MucGFyZGlyIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcGFyZW50IGRpcmVjdG9yeSAoJy4uJyBvciAnOjonKQorICAtIG9zLnNlcCBpcyB0aGUgKG9yIGEgbW9zdCBjb21tb24pIHBhdGhuYW1lIHNlcGFyYXRvciAoJy8nIG9yICc6JyBvciAnXFwnKQorICAtIG9zLmV4dHNlcCBpcyB0aGUgZXh0ZW5zaW9uIHNlcGFyYXRvciAoJy4nIG9yICcvJykKKyAgLSBvcy5hbHRzZXAgaXMgdGhlIGFsdGVybmF0ZSBwYXRobmFtZSBzZXBhcmF0b3IgKE5vbmUgb3IgJy8nKQorICAtIG9zLnBhdGhzZXAgaXMgdGhlIGNvbXBvbmVudCBzZXBhcmF0b3IgdXNlZCBpbiAkUEFUSCBldGMKKyAgLSBvcy5saW5lc2VwIGlzIHRoZSBsaW5lIHNlcGFyYXRvciBpbiB0ZXh0IGZpbGVzICgnXHInIG9yICdcbicgb3IgJ1xyXG4nKQorICAtIG9zLmRlZnBhdGggaXMgdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGggZm9yIGV4ZWN1dGFibGVzCisgIC0gb3MuZGV2bnVsbCBpcyB0aGUgZmlsZSBwYXRoIG9mIHRoZSBudWxsIGRldmljZSAoJy9kZXYvbnVsbCcsIGV0Yy4pCisKK1Byb2dyYW1zIHRoYXQgaW1wb3J0IGFuZCB1c2UgJ29zJyBzdGFuZCBhIGJldHRlciBjaGFuY2Ugb2YgYmVpbmcKK3BvcnRhYmxlIGJldHdlZW4gZGlmZmVyZW50IHBsYXRmb3Jtcy4gIE9mIGNvdXJzZSwgdGhleSBtdXN0IHRoZW4KK29ubHkgdXNlIGZ1bmN0aW9ucyB0aGF0IGFyZSBkZWZpbmVkIGJ5IGFsbCBwbGF0Zm9ybXMgKGUuZy4sIHVubGluaworYW5kIG9wZW5kaXIpLCBhbmQgbGVhdmUgYWxsIHBhdGhuYW1lIG1hbmlwdWxhdGlvbiB0byBvcy5wYXRoCisoZS5nLiwgc3BsaXQgYW5kIGpvaW4pLgorIiIiCisKKyMnCisKK2ltcG9ydCBzeXMsIGVycm5vCisKK19uYW1lcyA9IHN5cy5idWlsdGluX21vZHVsZV9uYW1lcworCisjIE5vdGU6ICBtb3JlIG5hbWVzIGFyZSBhZGRlZCB0byBfX2FsbF9fIGxhdGVyLgorX19hbGxfXyA9IFsiYWx0c2VwIiwgImN1cmRpciIsICJwYXJkaXIiLCAic2VwIiwgImV4dHNlcCIsICJwYXRoc2VwIiwgImxpbmVzZXAiLAorICAgICAgICAgICAiZGVmcGF0aCIsICJuYW1lIiwgInBhdGgiLCAiZGV2bnVsbCIsCisgICAgICAgICAgICJTRUVLX1NFVCIsICJTRUVLX0NVUiIsICJTRUVLX0VORCJdCisKK2RlZiBfZ2V0X2V4cG9ydHNfbGlzdChtb2R1bGUpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGxpc3QobW9kdWxlLl9fYWxsX18pCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICByZXR1cm4gW24gZm9yIG4gaW4gZGlyKG1vZHVsZSkgaWYgblswXSAhPSAnXyddCisKK2lmICdwb3NpeCcgaW4gX25hbWVzOgorICAgIG5hbWUgPSAncG9zaXgnCisgICAgbGluZXNlcCA9ICdcbicKKyAgICBmcm9tIHBvc2l4IGltcG9ydCAqCisgICAgdHJ5OgorICAgICAgICBmcm9tIHBvc2l4IGltcG9ydCBfZXhpdAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGltcG9ydCBwb3NpeHBhdGggYXMgcGF0aAorCisgICAgaW1wb3J0IHBvc2l4CisgICAgX19hbGxfXy5leHRlbmQoX2dldF9leHBvcnRzX2xpc3QocG9zaXgpKQorICAgIGRlbCBwb3NpeAorCitlbGlmICdudCcgaW4gX25hbWVzOgorICAgIG5hbWUgPSAnbnQnCisgICAgbGluZXNlcCA9ICdcclxuJworICAgIGZyb20gbnQgaW1wb3J0ICoKKyAgICB0cnk6CisgICAgICAgIGZyb20gbnQgaW1wb3J0IF9leGl0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisgICAgaW1wb3J0IG50cGF0aCBhcyBwYXRoCisKKyAgICBpbXBvcnQgbnQKKyAgICBfX2FsbF9fLmV4dGVuZChfZ2V0X2V4cG9ydHNfbGlzdChudCkpCisgICAgZGVsIG50CisKK2VsaWYgJ29zMicgaW4gX25hbWVzOgorICAgIG5hbWUgPSAnb3MyJworICAgIGxpbmVzZXAgPSAnXHJcbicKKyAgICBmcm9tIG9zMiBpbXBvcnQgKgorICAgIHRyeToKKyAgICAgICAgZnJvbSBvczIgaW1wb3J0IF9leGl0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisgICAgaWYgc3lzLnZlcnNpb24uZmluZCgnRU1YIEdDQycpID09IC0xOgorICAgICAgICBpbXBvcnQgbnRwYXRoIGFzIHBhdGgKKyAgICBlbHNlOgorICAgICAgICBpbXBvcnQgb3MyZW14cGF0aCBhcyBwYXRoCisgICAgICAgIGZyb20gX2VteF9saW5rIGltcG9ydCBsaW5rCisKKyAgICBpbXBvcnQgb3MyCisgICAgX19hbGxfXy5leHRlbmQoX2dldF9leHBvcnRzX2xpc3Qob3MyKSkKKyAgICBkZWwgb3MyCisKK2VsaWYgJ2NlJyBpbiBfbmFtZXM6CisgICAgbmFtZSA9ICdjZScKKyAgICBsaW5lc2VwID0gJ1xyXG4nCisgICAgZnJvbSBjZSBpbXBvcnQgKgorICAgIHRyeToKKyAgICAgICAgZnJvbSBjZSBpbXBvcnQgX2V4aXQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICAjIFdlIGNhbiB1c2UgdGhlIHN0YW5kYXJkIFdpbmRvd3MgcGF0aC4KKyAgICBpbXBvcnQgbnRwYXRoIGFzIHBhdGgKKworICAgIGltcG9ydCBjZQorICAgIF9fYWxsX18uZXh0ZW5kKF9nZXRfZXhwb3J0c19saXN0KGNlKSkKKyAgICBkZWwgY2UKKworZWxpZiAncmlzY29zJyBpbiBfbmFtZXM6CisgICAgbmFtZSA9ICdyaXNjb3MnCisgICAgbGluZXNlcCA9ICdcbicKKyAgICBmcm9tIHJpc2NvcyBpbXBvcnQgKgorICAgIHRyeToKKyAgICAgICAgZnJvbSByaXNjb3MgaW1wb3J0IF9leGl0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisgICAgaW1wb3J0IHJpc2Nvc3BhdGggYXMgcGF0aAorCisgICAgaW1wb3J0IHJpc2NvcworICAgIF9fYWxsX18uZXh0ZW5kKF9nZXRfZXhwb3J0c19saXN0KHJpc2NvcykpCisgICAgZGVsIHJpc2NvcworCitlbHNlOgorICAgIHJhaXNlIEltcG9ydEVycm9yLCAnbm8gb3Mgc3BlY2lmaWMgbW9kdWxlIGZvdW5kJworCitzeXMubW9kdWxlc1snb3MucGF0aCddID0gcGF0aAorZnJvbSBvcy5wYXRoIGltcG9ydCAoY3VyZGlyLCBwYXJkaXIsIHNlcCwgcGF0aHNlcCwgZGVmcGF0aCwgZXh0c2VwLCBhbHRzZXAsCisgICAgZGV2bnVsbCkKKworZGVsIF9uYW1lcworCisjIFB5dGhvbiB1c2VzIGZpeGVkIHZhbHVlcyBmb3IgdGhlIFNFRUtfIGNvbnN0YW50czsgdGhleSBhcmUgbWFwcGVkCisjIHRvIG5hdGl2ZSBjb25zdGFudHMgaWYgbmVjZXNzYXJ5IGluIHBvc2l4bW9kdWxlLmMKK1NFRUtfU0VUID0gMAorU0VFS19DVVIgPSAxCitTRUVLX0VORCA9IDIKKworIycKKworIyBTdXBlciBkaXJlY3RvcnkgdXRpbGl0aWVzLgorIyAoSW5zcGlyZWQgYnkgRXJpYyBSYXltb25kOyB0aGUgZG9jIHN0cmluZ3MgYXJlIG1vc3RseSBoaXMpCisKK2RlZiBtYWtlZGlycyhuYW1lLCBtb2RlPTA3NzcpOgorICAgICIiIm1ha2VkaXJzKHBhdGggWywgbW9kZT0wNzc3XSkKKworICAgIFN1cGVyLW1rZGlyOyBjcmVhdGUgYSBsZWFmIGRpcmVjdG9yeSBhbmQgYWxsIGludGVybWVkaWF0ZSBvbmVzLgorICAgIFdvcmtzIGxpa2UgbWtkaXIsIGV4Y2VwdCB0aGF0IGFueSBpbnRlcm1lZGlhdGUgcGF0aCBzZWdtZW50IChub3QKKyAgICBqdXN0IHRoZSByaWdodG1vc3QpIHdpbGwgYmUgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBleGlzdC4gIFRoaXMgaXMKKyAgICByZWN1cnNpdmUuCisKKyAgICAiIiIKKyAgICBoZWFkLCB0YWlsID0gcGF0aC5zcGxpdChuYW1lKQorICAgIGlmIG5vdCB0YWlsOgorICAgICAgICBoZWFkLCB0YWlsID0gcGF0aC5zcGxpdChoZWFkKQorICAgIGlmIGhlYWQgYW5kIHRhaWwgYW5kIG5vdCBwYXRoLmV4aXN0cyhoZWFkKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFrZWRpcnMoaGVhZCwgbW9kZSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICAjIGJlIGhhcHB5IGlmIHNvbWVvbmUgYWxyZWFkeSBjcmVhdGVkIHRoZSBwYXRoCisgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBpZiB0YWlsID09IGN1cmRpcjogICAgICAgICAgICMgeHh4L25ld2Rpci8uIGV4aXN0cyBpZiB4eHgvbmV3ZGlyIGV4aXN0cworICAgICAgICAgICAgcmV0dXJuCisgICAgbWtkaXIobmFtZSwgbW9kZSkKKworZGVmIHJlbW92ZWRpcnMobmFtZSk6CisgICAgIiIicmVtb3ZlZGlycyhwYXRoKQorCisgICAgU3VwZXItcm1kaXI7IHJlbW92ZSBhIGxlYWYgZGlyZWN0b3J5IGFuZCBhbGwgZW1wdHkgaW50ZXJtZWRpYXRlCisgICAgb25lcy4gIFdvcmtzIGxpa2Ugcm1kaXIgZXhjZXB0IHRoYXQsIGlmIHRoZSBsZWFmIGRpcmVjdG9yeSBpcworICAgIHN1Y2Nlc3NmdWxseSByZW1vdmVkLCBkaXJlY3RvcmllcyBjb3JyZXNwb25kaW5nIHRvIHJpZ2h0bW9zdCBwYXRoCisgICAgc2VnbWVudHMgd2lsbCBiZSBwcnVuZWQgYXdheSB1bnRpbCBlaXRoZXIgdGhlIHdob2xlIHBhdGggaXMKKyAgICBjb25zdW1lZCBvciBhbiBlcnJvciBvY2N1cnMuICBFcnJvcnMgZHVyaW5nIHRoaXMgbGF0dGVyIHBoYXNlIGFyZQorICAgIGlnbm9yZWQgLS0gdGhleSBnZW5lcmFsbHkgbWVhbiB0aGF0IGEgZGlyZWN0b3J5IHdhcyBub3QgZW1wdHkuCisKKyAgICAiIiIKKyAgICBybWRpcihuYW1lKQorICAgIGhlYWQsIHRhaWwgPSBwYXRoLnNwbGl0KG5hbWUpCisgICAgaWYgbm90IHRhaWw6CisgICAgICAgIGhlYWQsIHRhaWwgPSBwYXRoLnNwbGl0KGhlYWQpCisgICAgd2hpbGUgaGVhZCBhbmQgdGFpbDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcm1kaXIoaGVhZCkKKyAgICAgICAgZXhjZXB0IGVycm9yOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaGVhZCwgdGFpbCA9IHBhdGguc3BsaXQoaGVhZCkKKworZGVmIHJlbmFtZXMob2xkLCBuZXcpOgorICAgICIiInJlbmFtZXMob2xkLCBuZXcpCisKKyAgICBTdXBlci1yZW5hbWU7IGNyZWF0ZSBkaXJlY3RvcmllcyBhcyBuZWNlc3NhcnkgYW5kIGRlbGV0ZSBhbnkgbGVmdAorICAgIGVtcHR5LiAgV29ya3MgbGlrZSByZW5hbWUsIGV4Y2VwdCBjcmVhdGlvbiBvZiBhbnkgaW50ZXJtZWRpYXRlCisgICAgZGlyZWN0b3JpZXMgbmVlZGVkIHRvIG1ha2UgdGhlIG5ldyBwYXRobmFtZSBnb29kIGlzIGF0dGVtcHRlZAorICAgIGZpcnN0LiAgQWZ0ZXIgdGhlIHJlbmFtZSwgZGlyZWN0b3JpZXMgY29ycmVzcG9uZGluZyB0byByaWdodG1vc3QKKyAgICBwYXRoIHNlZ21lbnRzIG9mIHRoZSBvbGQgbmFtZSB3aWxsIGJlIHBydW5lZCB3YXkgdW50aWwgZWl0aGVyIHRoZQorICAgIHdob2xlIHBhdGggaXMgY29uc3VtZWQgb3IgYSBub25lbXB0eSBkaXJlY3RvcnkgaXMgZm91bmQuCisKKyAgICBOb3RlOiB0aGlzIGZ1bmN0aW9uIGNhbiBmYWlsIHdpdGggdGhlIG5ldyBkaXJlY3Rvcnkgc3RydWN0dXJlIG1hZGUKKyAgICBpZiB5b3UgbGFjayBwZXJtaXNzaW9ucyBuZWVkZWQgdG8gdW5saW5rIHRoZSBsZWFmIGRpcmVjdG9yeSBvcgorICAgIGZpbGUuCisKKyAgICAiIiIKKyAgICBoZWFkLCB0YWlsID0gcGF0aC5zcGxpdChuZXcpCisgICAgaWYgaGVhZCBhbmQgdGFpbCBhbmQgbm90IHBhdGguZXhpc3RzKGhlYWQpOgorICAgICAgICBtYWtlZGlycyhoZWFkKQorICAgIHJlbmFtZShvbGQsIG5ldykKKyAgICBoZWFkLCB0YWlsID0gcGF0aC5zcGxpdChvbGQpCisgICAgaWYgaGVhZCBhbmQgdGFpbDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVtb3ZlZGlycyhoZWFkKQorICAgICAgICBleGNlcHQgZXJyb3I6CisgICAgICAgICAgICBwYXNzCisKK19fYWxsX18uZXh0ZW5kKFsibWFrZWRpcnMiLCAicmVtb3ZlZGlycyIsICJyZW5hbWVzIl0pCisKK2RlZiB3YWxrKHRvcCwgdG9wZG93bj1UcnVlLCBvbmVycm9yPU5vbmUsIGZvbGxvd2xpbmtzPUZhbHNlKToKKyAgICAiIiJEaXJlY3RvcnkgdHJlZSBnZW5lcmF0b3IuCisKKyAgICBGb3IgZWFjaCBkaXJlY3RvcnkgaW4gdGhlIGRpcmVjdG9yeSB0cmVlIHJvb3RlZCBhdCB0b3AgKGluY2x1ZGluZyB0b3AKKyAgICBpdHNlbGYsIGJ1dCBleGNsdWRpbmcgJy4nIGFuZCAnLi4nKSwgeWllbGRzIGEgMy10dXBsZQorCisgICAgICAgIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMKKworICAgIGRpcnBhdGggaXMgYSBzdHJpbmcsIHRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkuICBkaXJuYW1lcyBpcyBhIGxpc3Qgb2YKKyAgICB0aGUgbmFtZXMgb2YgdGhlIHN1YmRpcmVjdG9yaWVzIGluIGRpcnBhdGggKGV4Y2x1ZGluZyAnLicgYW5kICcuLicpLgorICAgIGZpbGVuYW1lcyBpcyBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIHRoZSBub24tZGlyZWN0b3J5IGZpbGVzIGluIGRpcnBhdGguCisgICAgTm90ZSB0aGF0IHRoZSBuYW1lcyBpbiB0aGUgbGlzdHMgYXJlIGp1c3QgbmFtZXMsIHdpdGggbm8gcGF0aCBjb21wb25lbnRzLgorICAgIFRvIGdldCBhIGZ1bGwgcGF0aCAod2hpY2ggYmVnaW5zIHdpdGggdG9wKSB0byBhIGZpbGUgb3IgZGlyZWN0b3J5IGluCisgICAgZGlycGF0aCwgZG8gb3MucGF0aC5qb2luKGRpcnBhdGgsIG5hbWUpLgorCisgICAgSWYgb3B0aW9uYWwgYXJnICd0b3Bkb3duJyBpcyB0cnVlIG9yIG5vdCBzcGVjaWZpZWQsIHRoZSB0cmlwbGUgZm9yIGEKKyAgICBkaXJlY3RvcnkgaXMgZ2VuZXJhdGVkIGJlZm9yZSB0aGUgdHJpcGxlcyBmb3IgYW55IG9mIGl0cyBzdWJkaXJlY3RvcmllcworICAgIChkaXJlY3RvcmllcyBhcmUgZ2VuZXJhdGVkIHRvcCBkb3duKS4gIElmIHRvcGRvd24gaXMgZmFsc2UsIHRoZSB0cmlwbGUKKyAgICBmb3IgYSBkaXJlY3RvcnkgaXMgZ2VuZXJhdGVkIGFmdGVyIHRoZSB0cmlwbGVzIGZvciBhbGwgb2YgaXRzCisgICAgc3ViZGlyZWN0b3JpZXMgKGRpcmVjdG9yaWVzIGFyZSBnZW5lcmF0ZWQgYm90dG9tIHVwKS4KKworICAgIFdoZW4gdG9wZG93biBpcyB0cnVlLCB0aGUgY2FsbGVyIGNhbiBtb2RpZnkgdGhlIGRpcm5hbWVzIGxpc3QgaW4tcGxhY2UKKyAgICAoZS5nLiwgdmlhIGRlbCBvciBzbGljZSBhc3NpZ25tZW50KSwgYW5kIHdhbGsgd2lsbCBvbmx5IHJlY3Vyc2UgaW50byB0aGUKKyAgICBzdWJkaXJlY3RvcmllcyB3aG9zZSBuYW1lcyByZW1haW4gaW4gZGlybmFtZXM7IHRoaXMgY2FuIGJlIHVzZWQgdG8gcHJ1bmUKKyAgICB0aGUgc2VhcmNoLCBvciB0byBpbXBvc2UgYSBzcGVjaWZpYyBvcmRlciBvZiB2aXNpdGluZy4gIE1vZGlmeWluZworICAgIGRpcm5hbWVzIHdoZW4gdG9wZG93biBpcyBmYWxzZSBpcyBpbmVmZmVjdGl2ZSwgc2luY2UgdGhlIGRpcmVjdG9yaWVzIGluCisgICAgZGlybmFtZXMgaGF2ZSBhbHJlYWR5IGJlZW4gZ2VuZXJhdGVkIGJ5IHRoZSB0aW1lIGRpcm5hbWVzIGl0c2VsZiBpcworICAgIGdlbmVyYXRlZC4KKworICAgIEJ5IGRlZmF1bHQgZXJyb3JzIGZyb20gdGhlIG9zLmxpc3RkaXIoKSBjYWxsIGFyZSBpZ25vcmVkLiAgSWYKKyAgICBvcHRpb25hbCBhcmcgJ29uZXJyb3InIGlzIHNwZWNpZmllZCwgaXQgc2hvdWxkIGJlIGEgZnVuY3Rpb247IGl0CisgICAgd2lsbCBiZSBjYWxsZWQgd2l0aCBvbmUgYXJndW1lbnQsIGFuIG9zLmVycm9yIGluc3RhbmNlLiAgSXQgY2FuCisgICAgcmVwb3J0IHRoZSBlcnJvciB0byBjb250aW51ZSB3aXRoIHRoZSB3YWxrLCBvciByYWlzZSB0aGUgZXhjZXB0aW9uCisgICAgdG8gYWJvcnQgdGhlIHdhbGsuICBOb3RlIHRoYXQgdGhlIGZpbGVuYW1lIGlzIGF2YWlsYWJsZSBhcyB0aGUKKyAgICBmaWxlbmFtZSBhdHRyaWJ1dGUgb2YgdGhlIGV4Y2VwdGlvbiBvYmplY3QuCisKKyAgICBCeSBkZWZhdWx0LCBvcy53YWxrIGRvZXMgbm90IGZvbGxvdyBzeW1ib2xpYyBsaW5rcyB0byBzdWJkaXJlY3RvcmllcyBvbgorICAgIHN5c3RlbXMgdGhhdCBzdXBwb3J0IHRoZW0uICBJbiBvcmRlciB0byBnZXQgdGhpcyBmdW5jdGlvbmFsaXR5LCBzZXQgdGhlCisgICAgb3B0aW9uYWwgYXJndW1lbnQgJ2ZvbGxvd2xpbmtzJyB0byB0cnVlLgorCisgICAgQ2F1dGlvbjogIGlmIHlvdSBwYXNzIGEgcmVsYXRpdmUgcGF0aG5hbWUgZm9yIHRvcCwgZG9uJ3QgY2hhbmdlIHRoZQorICAgIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgYmV0d2VlbiByZXN1bXB0aW9ucyBvZiB3YWxrLiAgd2FsayBuZXZlcgorICAgIGNoYW5nZXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgYXNzdW1lcyB0aGF0IHRoZSBjbGllbnQgZG9lc24ndAorICAgIGVpdGhlci4KKworICAgIEV4YW1wbGU6CisKKyAgICBpbXBvcnQgb3MKKyAgICBmcm9tIG9zLnBhdGggaW1wb3J0IGpvaW4sIGdldHNpemUKKyAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsaygncHl0aG9uL0xpYi9lbWFpbCcpOgorICAgICAgICBwcmludCByb290LCAiY29uc3VtZXMiLAorICAgICAgICBwcmludCBzdW0oW2dldHNpemUoam9pbihyb290LCBuYW1lKSkgZm9yIG5hbWUgaW4gZmlsZXNdKSwKKyAgICAgICAgcHJpbnQgImJ5dGVzIGluIiwgbGVuKGZpbGVzKSwgIm5vbi1kaXJlY3RvcnkgZmlsZXMiCisgICAgICAgIGlmICdDVlMnIGluIGRpcnM6CisgICAgICAgICAgICBkaXJzLnJlbW92ZSgnQ1ZTJykgICMgZG9uJ3QgdmlzaXQgQ1ZTIGRpcmVjdG9yaWVzCisgICAgIiIiCisKKyAgICBpc2xpbmssIGpvaW4sIGlzZGlyID0gcGF0aC5pc2xpbmssIHBhdGguam9pbiwgcGF0aC5pc2RpcgorCisgICAgIyBXZSBtYXkgbm90IGhhdmUgcmVhZCBwZXJtaXNzaW9uIGZvciB0b3AsIGluIHdoaWNoIGNhc2Ugd2UgY2FuJ3QKKyAgICAjIGdldCBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoZSBkaXJlY3RvcnkgY29udGFpbnMuICBvcy5wYXRoLndhbGsKKyAgICAjIGFsd2F5cyBzdXBwcmVzc2VkIHRoZSBleGNlcHRpb24gdGhlbiwgcmF0aGVyIHRoYW4gYmxvdyB1cCBmb3IgYQorICAgICMgbWlub3IgcmVhc29uIHdoZW4gKHNheSkgYSB0aG91c2FuZCByZWFkYWJsZSBkaXJlY3RvcmllcyBhcmUgc3RpbGwKKyAgICAjIGxlZnQgdG8gdmlzaXQuICBUaGF0IGxvZ2ljIGlzIGNvcGllZCBoZXJlLgorICAgIHRyeToKKyAgICAgICAgIyBOb3RlIHRoYXQgbGlzdGRpciBhbmQgZXJyb3IgYXJlIGdsb2JhbHMgaW4gdGhpcyBtb2R1bGUgZHVlCisgICAgICAgICMgdG8gZWFybGllciBpbXBvcnQtKi4KKyAgICAgICAgbmFtZXMgPSBsaXN0ZGlyKHRvcCkKKyAgICBleGNlcHQgZXJyb3IsIGVycjoKKyAgICAgICAgaWYgb25lcnJvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9uZXJyb3IoZXJyKQorICAgICAgICByZXR1cm4KKworICAgIGRpcnMsIG5vbmRpcnMgPSBbXSwgW10KKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgaWYgaXNkaXIoam9pbih0b3AsIG5hbWUpKToKKyAgICAgICAgICAgIGRpcnMuYXBwZW5kKG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBub25kaXJzLmFwcGVuZChuYW1lKQorCisgICAgaWYgdG9wZG93bjoKKyAgICAgICAgeWllbGQgdG9wLCBkaXJzLCBub25kaXJzCisgICAgZm9yIG5hbWUgaW4gZGlyczoKKyAgICAgICAgbmV3X3BhdGggPSBqb2luKHRvcCwgbmFtZSkKKyAgICAgICAgaWYgZm9sbG93bGlua3Mgb3Igbm90IGlzbGluayhuZXdfcGF0aCk6CisgICAgICAgICAgICBmb3IgeCBpbiB3YWxrKG5ld19wYXRoLCB0b3Bkb3duLCBvbmVycm9yLCBmb2xsb3dsaW5rcyk6CisgICAgICAgICAgICAgICAgeWllbGQgeAorICAgIGlmIG5vdCB0b3Bkb3duOgorICAgICAgICB5aWVsZCB0b3AsIGRpcnMsIG5vbmRpcnMKKworX19hbGxfXy5hcHBlbmQoIndhbGsiKQorCisjIE1ha2Ugc3VyZSBvcy5lbnZpcm9uIGV4aXN0cywgYXQgbGVhc3QKK3RyeToKKyAgICBlbnZpcm9uCitleGNlcHQgTmFtZUVycm9yOgorICAgIGVudmlyb24gPSB7fQorCitkZWYgZXhlY2woZmlsZSwgKmFyZ3MpOgorICAgICIiImV4ZWNsKGZpbGUsICphcmdzKQorCisgICAgRXhlY3V0ZSB0aGUgZXhlY3V0YWJsZSBmaWxlIHdpdGggYXJndW1lbnQgbGlzdCBhcmdzLCByZXBsYWNpbmcgdGhlCisgICAgY3VycmVudCBwcm9jZXNzLiAiIiIKKyAgICBleGVjdihmaWxlLCBhcmdzKQorCitkZWYgZXhlY2xlKGZpbGUsICphcmdzKToKKyAgICAiIiJleGVjbGUoZmlsZSwgKmFyZ3MsIGVudikKKworICAgIEV4ZWN1dGUgdGhlIGV4ZWN1dGFibGUgZmlsZSB3aXRoIGFyZ3VtZW50IGxpc3QgYXJncyBhbmQKKyAgICBlbnZpcm9ubWVudCBlbnYsIHJlcGxhY2luZyB0aGUgY3VycmVudCBwcm9jZXNzLiAiIiIKKyAgICBlbnYgPSBhcmdzWy0xXQorICAgIGV4ZWN2ZShmaWxlLCBhcmdzWzotMV0sIGVudikKKworZGVmIGV4ZWNscChmaWxlLCAqYXJncyk6CisgICAgIiIiZXhlY2xwKGZpbGUsICphcmdzKQorCisgICAgRXhlY3V0ZSB0aGUgZXhlY3V0YWJsZSBmaWxlICh3aGljaCBpcyBzZWFyY2hlZCBmb3IgYWxvbmcgJFBBVEgpCisgICAgd2l0aCBhcmd1bWVudCBsaXN0IGFyZ3MsIHJlcGxhY2luZyB0aGUgY3VycmVudCBwcm9jZXNzLiAiIiIKKyAgICBleGVjdnAoZmlsZSwgYXJncykKKworZGVmIGV4ZWNscGUoZmlsZSwgKmFyZ3MpOgorICAgICIiImV4ZWNscGUoZmlsZSwgKmFyZ3MsIGVudikKKworICAgIEV4ZWN1dGUgdGhlIGV4ZWN1dGFibGUgZmlsZSAod2hpY2ggaXMgc2VhcmNoZWQgZm9yIGFsb25nICRQQVRIKQorICAgIHdpdGggYXJndW1lbnQgbGlzdCBhcmdzIGFuZCBlbnZpcm9ubWVudCBlbnYsIHJlcGxhY2luZyB0aGUgY3VycmVudAorICAgIHByb2Nlc3MuICIiIgorICAgIGVudiA9IGFyZ3NbLTFdCisgICAgZXhlY3ZwZShmaWxlLCBhcmdzWzotMV0sIGVudikKKworZGVmIGV4ZWN2cChmaWxlLCBhcmdzKToKKyAgICAiIiJleGVjdnAoZmlsZSwgYXJncykKKworICAgIEV4ZWN1dGUgdGhlIGV4ZWN1dGFibGUgZmlsZSAod2hpY2ggaXMgc2VhcmNoZWQgZm9yIGFsb25nICRQQVRIKQorICAgIHdpdGggYXJndW1lbnQgbGlzdCBhcmdzLCByZXBsYWNpbmcgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAgICBhcmdzIG1heSBiZSBhIGxpc3Qgb3IgdHVwbGUgb2Ygc3RyaW5ncy4gIiIiCisgICAgX2V4ZWN2cGUoZmlsZSwgYXJncykKKworZGVmIGV4ZWN2cGUoZmlsZSwgYXJncywgZW52KToKKyAgICAiIiJleGVjdnBlKGZpbGUsIGFyZ3MsIGVudikKKworICAgIEV4ZWN1dGUgdGhlIGV4ZWN1dGFibGUgZmlsZSAod2hpY2ggaXMgc2VhcmNoZWQgZm9yIGFsb25nICRQQVRIKQorICAgIHdpdGggYXJndW1lbnQgbGlzdCBhcmdzIGFuZCBlbnZpcm9ubWVudCBlbnYgLCByZXBsYWNpbmcgdGhlCisgICAgY3VycmVudCBwcm9jZXNzLgorICAgIGFyZ3MgbWF5IGJlIGEgbGlzdCBvciB0dXBsZSBvZiBzdHJpbmdzLiAiIiIKKyAgICBfZXhlY3ZwZShmaWxlLCBhcmdzLCBlbnYpCisKK19fYWxsX18uZXh0ZW5kKFsiZXhlY2wiLCJleGVjbGUiLCJleGVjbHAiLCJleGVjbHBlIiwiZXhlY3ZwIiwiZXhlY3ZwZSJdKQorCitkZWYgX2V4ZWN2cGUoZmlsZSwgYXJncywgZW52PU5vbmUpOgorICAgIGlmIGVudiBpcyBub3QgTm9uZToKKyAgICAgICAgZnVuYyA9IGV4ZWN2ZQorICAgICAgICBhcmdyZXN0ID0gKGFyZ3MsIGVudikKKyAgICBlbHNlOgorICAgICAgICBmdW5jID0gZXhlY3YKKyAgICAgICAgYXJncmVzdCA9IChhcmdzLCkKKyAgICAgICAgZW52ID0gZW52aXJvbgorCisgICAgaGVhZCwgdGFpbCA9IHBhdGguc3BsaXQoZmlsZSkKKyAgICBpZiBoZWFkOgorICAgICAgICBmdW5jKGZpbGUsICphcmdyZXN0KQorICAgICAgICByZXR1cm4KKyAgICBpZiAnUEFUSCcgaW4gZW52OgorICAgICAgICBlbnZwYXRoID0gZW52WydQQVRIJ10KKyAgICBlbHNlOgorICAgICAgICBlbnZwYXRoID0gZGVmcGF0aAorICAgIFBBVEggPSBlbnZwYXRoLnNwbGl0KHBhdGhzZXApCisgICAgc2F2ZWRfZXhjID0gTm9uZQorICAgIHNhdmVkX3RiID0gTm9uZQorICAgIGZvciBkaXIgaW4gUEFUSDoKKyAgICAgICAgZnVsbG5hbWUgPSBwYXRoLmpvaW4oZGlyLCBmaWxlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmdW5jKGZ1bGxuYW1lLCAqYXJncmVzdCkKKyAgICAgICAgZXhjZXB0IGVycm9yLCBlOgorICAgICAgICAgICAgdGIgPSBzeXMuZXhjX2luZm8oKVsyXQorICAgICAgICAgICAgaWYgKGUuZXJybm8gIT0gZXJybm8uRU5PRU5UIGFuZCBlLmVycm5vICE9IGVycm5vLkVOT1RESVIKKyAgICAgICAgICAgICAgICBhbmQgc2F2ZWRfZXhjIGlzIE5vbmUpOgorICAgICAgICAgICAgICAgIHNhdmVkX2V4YyA9IGUKKyAgICAgICAgICAgICAgICBzYXZlZF90YiA9IHRiCisgICAgaWYgc2F2ZWRfZXhjOgorICAgICAgICByYWlzZSBlcnJvciwgc2F2ZWRfZXhjLCBzYXZlZF90YgorICAgIHJhaXNlIGVycm9yLCBlLCB0YgorCisjIENoYW5nZSBlbnZpcm9uIHRvIGF1dG9tYXRpY2FsbHkgY2FsbCBwdXRlbnYoKSBpZiBpdCBleGlzdHMKK3RyeToKKyAgICAjIFRoaXMgd2lsbCBmYWlsIGlmIHRoZXJlJ3Mgbm8gcHV0ZW52CisgICAgcHV0ZW52CitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgaW1wb3J0IFVzZXJEaWN0CisKKyAgICAjIEZha2UgdW5zZXRlbnYoKSBmb3IgV2luZG93cworICAgICMgbm90IHN1cmUgYWJvdXQgb3MyIGhlcmUgYnV0CisgICAgIyBJJ20gZ3Vlc3NpbmcgdGhleSBhcmUgdGhlIHNhbWUuCisKKyAgICBpZiBuYW1lIGluICgnb3MyJywgJ250Jyk6CisgICAgICAgIGRlZiB1bnNldGVudihrZXkpOgorICAgICAgICAgICAgcHV0ZW52KGtleSwgIiIpCisKKyAgICBpZiBuYW1lID09ICJyaXNjb3MiOgorICAgICAgICAjIE9uIFJJU0MgT1MsIGFsbCBlbnYgYWNjZXNzIGdvZXMgdGhyb3VnaCBnZXRlbnYgYW5kIHB1dGVudgorICAgICAgICBmcm9tIHJpc2Nvc2Vudmlyb24gaW1wb3J0IF9FbnZpcm9uCisgICAgZWxpZiBuYW1lIGluICgnb3MyJywgJ250Jyk6ICAjIFdoZXJlIEVudiBWYXIgTmFtZXMgTXVzdCBCZSBVUFBFUkNBU0UKKyAgICAgICAgIyBCdXQgd2Ugc3RvcmUgdGhlbSBhcyB1cHBlciBjYXNlCisgICAgICAgIGNsYXNzIF9FbnZpcm9uKFVzZXJEaWN0Lkl0ZXJhYmxlVXNlckRpY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVudmlyb24pOgorICAgICAgICAgICAgICAgIFVzZXJEaWN0LlVzZXJEaWN0Ll9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuZGF0YQorICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIGVudmlyb24uaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgZGF0YVtrLnVwcGVyKCldID0gdgorICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgaXRlbSk6CisgICAgICAgICAgICAgICAgcHV0ZW52KGtleSwgaXRlbSkKKyAgICAgICAgICAgICAgICBzZWxmLmRhdGFba2V5LnVwcGVyKCldID0gaXRlbQorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtrZXkudXBwZXIoKV0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1bnNldGVudgorICAgICAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuZGF0YVtrZXkudXBwZXIoKV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgICAgIHVuc2V0ZW52KGtleSkKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuZGF0YVtrZXkudXBwZXIoKV0KKyAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5kYXRhLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0ZW52KGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLmRhdGFba2V5XQorICAgICAgICAgICAgICAgIGRlZiBwb3Aoc2VsZiwga2V5LCAqYXJncyk6CisgICAgICAgICAgICAgICAgICAgIHVuc2V0ZW52KGtleSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5wb3Aoa2V5LnVwcGVyKCksICphcmdzKQorICAgICAgICAgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4ga2V5LnVwcGVyKCkgaW4gc2VsZi5kYXRhCisgICAgICAgICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGtleS51cHBlcigpIGluIHNlbGYuZGF0YQorICAgICAgICAgICAgZGVmIGdldChzZWxmLCBrZXksIGZhaWxvYmo9Tm9uZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5nZXQoa2V5LnVwcGVyKCksIGZhaWxvYmopCisgICAgICAgICAgICBkZWYgdXBkYXRlKHNlbGYsIGRpY3Q9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIGlmIGRpY3Q6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBkaWN0LmtleXMoKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAjIExpc3Qgb2YgKGtleSwgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBkaWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZba10gPSB2CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGdvdCBrZXlzCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNhbm5vdCB1c2UgaXRlbXMoKSwgc2luY2UgbWFwcGluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbWF5IG5vdCBoYXZlIHRoZW0uCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBrZXlzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZba10gPSBkaWN0W2tdCisgICAgICAgICAgICAgICAgaWYga3dhcmdzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZShrd2FyZ3MpCisgICAgICAgICAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZGljdChzZWxmKQorCisgICAgZWxzZTogICMgV2hlcmUgRW52IFZhciBOYW1lcyBDYW4gQmUgTWl4ZWQgQ2FzZQorICAgICAgICBjbGFzcyBfRW52aXJvbihVc2VyRGljdC5JdGVyYWJsZVVzZXJEaWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnZpcm9uKToKKyAgICAgICAgICAgICAgICBVc2VyRGljdC5Vc2VyRGljdC5fX2luaXRfXyhzZWxmKQorICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGVudmlyb24KKyAgICAgICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIGl0ZW0pOgorICAgICAgICAgICAgICAgIHB1dGVudihrZXksIGl0ZW0pCisgICAgICAgICAgICAgICAgc2VsZi5kYXRhW2tleV0gPSBpdGVtCisgICAgICAgICAgICBkZWYgdXBkYXRlKHNlbGYsICBkaWN0PU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICBpZiBkaWN0OgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXlzID0gZGljdC5rZXlzKCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBMaXN0IG9mIChrZXksIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gZGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmW2tdID0gdgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBnb3Qga2V5cworICAgICAgICAgICAgICAgICAgICAgICAgIyBjYW5ub3QgdXNlIGl0ZW1zKCksIHNpbmNlIG1hcHBpbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAjIG1heSBub3QgaGF2ZSB0aGVtLgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGsgaW4ga2V5czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmW2tdID0gZGljdFtrXQorICAgICAgICAgICAgICAgIGlmIGt3YXJnczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGUoa3dhcmdzKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVuc2V0ZW52CisgICAgICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgICAgIHVuc2V0ZW52KGtleSkKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuZGF0YVtrZXldCisgICAgICAgICAgICAgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuZGF0YS5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgICAgICB1bnNldGVudihrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5kYXRhW2tleV0KKyAgICAgICAgICAgICAgICBkZWYgcG9wKHNlbGYsIGtleSwgKmFyZ3MpOgorICAgICAgICAgICAgICAgICAgICB1bnNldGVudihrZXkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRhdGEucG9wKGtleSwgKmFyZ3MpCisgICAgICAgICAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZGljdChzZWxmKQorCisKKyAgICBlbnZpcm9uID0gX0Vudmlyb24oZW52aXJvbikKKworZGVmIGdldGVudihrZXksIGRlZmF1bHQ9Tm9uZSk6CisgICAgIiIiR2V0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlLCByZXR1cm4gTm9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgIFRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgY2FuIHNwZWNpZnkgYW4gYWx0ZXJuYXRlIGRlZmF1bHQuIiIiCisgICAgcmV0dXJuIGVudmlyb24uZ2V0KGtleSwgZGVmYXVsdCkKK19fYWxsX18uYXBwZW5kKCJnZXRlbnYiKQorCitkZWYgX2V4aXN0cyhuYW1lKToKKyAgICByZXR1cm4gbmFtZSBpbiBnbG9iYWxzKCkKKworIyBTdXBwbHkgc3Bhd24qKCkgKHByb2JhYmx5IG9ubHkgZm9yIFVuaXgpCitpZiBfZXhpc3RzKCJmb3JrIikgYW5kIG5vdCBfZXhpc3RzKCJzcGF3bnYiKSBhbmQgX2V4aXN0cygiZXhlY3YiKToKKworICAgIFBfV0FJVCA9IDAKKyAgICBQX05PV0FJVCA9IFBfTk9XQUlUTyA9IDEKKworICAgICMgWFhYIFNob3VsZCB3ZSBzdXBwb3J0IFBfREVUQUNIPyAgSSBzdXBwb3NlIGl0IGNvdWxkIGZvcmsoKSoqMgorICAgICMgYW5kIGNsb3NlIHRoZSBzdGQgSS9PIHN0cmVhbXMuICBBbHNvLCBQX09WRVJMQVkgaXMgdGhlIHNhbWUKKyAgICAjIGFzIGV4ZWN2KigpPworCisgICAgZGVmIF9zcGF3bnZlZihtb2RlLCBmaWxlLCBhcmdzLCBlbnYsIGZ1bmMpOgorICAgICAgICAjIEludGVybmFsIGhlbHBlcjsgZnVuYyBpcyB0aGUgZXhlYyooKSBmdW5jdGlvbiB0byB1c2UKKyAgICAgICAgcGlkID0gZm9yaygpCisgICAgICAgIGlmIG5vdCBwaWQ6CisgICAgICAgICAgICAjIENoaWxkCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgZW52IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMoZmlsZSwgYXJncykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmdW5jKGZpbGUsIGFyZ3MsIGVudikKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBfZXhpdCgxMjcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFBhcmVudAorICAgICAgICAgICAgaWYgbW9kZSA9PSBQX05PV0FJVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gcGlkICMgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciB3YWl0aW5nIQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB3cGlkLCBzdHMgPSB3YWl0cGlkKHBpZCwgMCkKKyAgICAgICAgICAgICAgICBpZiBXSUZTVE9QUEVEKHN0cyk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxpZiBXSUZTSUdOQUxFRChzdHMpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLVdURVJNU0lHKHN0cykKKyAgICAgICAgICAgICAgICBlbGlmIFdJRkVYSVRFRChzdHMpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0VYSVRTVEFUVVMoc3RzKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiTm90IHN0b3BwZWQsIHNpZ25hbGVkIG9yIGV4aXRlZD8/PyIKKworICAgIGRlZiBzcGF3bnYobW9kZSwgZmlsZSwgYXJncyk6CisgICAgICAgICIiInNwYXdudihtb2RlLCBmaWxlLCBhcmdzKSAtPiBpbnRlZ2VyCisKK0V4ZWN1dGUgZmlsZSB3aXRoIGFyZ3VtZW50cyBmcm9tIGFyZ3MgaW4gYSBzdWJwcm9jZXNzLgorSWYgbW9kZSA9PSBQX05PV0FJVCByZXR1cm4gdGhlIHBpZCBvZiB0aGUgcHJvY2Vzcy4KK0lmIG1vZGUgPT0gUF9XQUlUIHJldHVybiB0aGUgcHJvY2VzcydzIGV4aXQgY29kZSBpZiBpdCBleGl0cyBub3JtYWxseTsKK290aGVyd2lzZSByZXR1cm4gLVNJRywgd2hlcmUgU0lHIGlzIHRoZSBzaWduYWwgdGhhdCBraWxsZWQgaXQuICIiIgorICAgICAgICByZXR1cm4gX3NwYXdudmVmKG1vZGUsIGZpbGUsIGFyZ3MsIE5vbmUsIGV4ZWN2KQorCisgICAgZGVmIHNwYXdudmUobW9kZSwgZmlsZSwgYXJncywgZW52KToKKyAgICAgICAgIiIic3Bhd252ZShtb2RlLCBmaWxlLCBhcmdzLCBlbnYpIC0+IGludGVnZXIKKworRXhlY3V0ZSBmaWxlIHdpdGggYXJndW1lbnRzIGZyb20gYXJncyBpbiBhIHN1YnByb2Nlc3Mgd2l0aCB0aGUKK3NwZWNpZmllZCBlbnZpcm9ubWVudC4KK0lmIG1vZGUgPT0gUF9OT1dBSVQgcmV0dXJuIHRoZSBwaWQgb2YgdGhlIHByb2Nlc3MuCitJZiBtb2RlID09IFBfV0FJVCByZXR1cm4gdGhlIHByb2Nlc3MncyBleGl0IGNvZGUgaWYgaXQgZXhpdHMgbm9ybWFsbHk7CitvdGhlcndpc2UgcmV0dXJuIC1TSUcsIHdoZXJlIFNJRyBpcyB0aGUgc2lnbmFsIHRoYXQga2lsbGVkIGl0LiAiIiIKKyAgICAgICAgcmV0dXJuIF9zcGF3bnZlZihtb2RlLCBmaWxlLCBhcmdzLCBlbnYsIGV4ZWN2ZSkKKworICAgICMgTm90ZTogc3Bhd252cFtlXSBpcyd0IGN1cnJlbnRseSBzdXBwb3J0ZWQgb24gV2luZG93cworCisgICAgZGVmIHNwYXdudnAobW9kZSwgZmlsZSwgYXJncyk6CisgICAgICAgICIiInNwYXdudnAobW9kZSwgZmlsZSwgYXJncykgLT4gaW50ZWdlcgorCitFeGVjdXRlIGZpbGUgKHdoaWNoIGlzIGxvb2tlZCBmb3IgYWxvbmcgJFBBVEgpIHdpdGggYXJndW1lbnRzIGZyb20KK2FyZ3MgaW4gYSBzdWJwcm9jZXNzLgorSWYgbW9kZSA9PSBQX05PV0FJVCByZXR1cm4gdGhlIHBpZCBvZiB0aGUgcHJvY2Vzcy4KK0lmIG1vZGUgPT0gUF9XQUlUIHJldHVybiB0aGUgcHJvY2VzcydzIGV4aXQgY29kZSBpZiBpdCBleGl0cyBub3JtYWxseTsKK290aGVyd2lzZSByZXR1cm4gLVNJRywgd2hlcmUgU0lHIGlzIHRoZSBzaWduYWwgdGhhdCBraWxsZWQgaXQuICIiIgorICAgICAgICByZXR1cm4gX3NwYXdudmVmKG1vZGUsIGZpbGUsIGFyZ3MsIE5vbmUsIGV4ZWN2cCkKKworICAgIGRlZiBzcGF3bnZwZShtb2RlLCBmaWxlLCBhcmdzLCBlbnYpOgorICAgICAgICAiIiJzcGF3bnZwZShtb2RlLCBmaWxlLCBhcmdzLCBlbnYpIC0+IGludGVnZXIKKworRXhlY3V0ZSBmaWxlICh3aGljaCBpcyBsb29rZWQgZm9yIGFsb25nICRQQVRIKSB3aXRoIGFyZ3VtZW50cyBmcm9tCithcmdzIGluIGEgc3VicHJvY2VzcyB3aXRoIHRoZSBzdXBwbGllZCBlbnZpcm9ubWVudC4KK0lmIG1vZGUgPT0gUF9OT1dBSVQgcmV0dXJuIHRoZSBwaWQgb2YgdGhlIHByb2Nlc3MuCitJZiBtb2RlID09IFBfV0FJVCByZXR1cm4gdGhlIHByb2Nlc3MncyBleGl0IGNvZGUgaWYgaXQgZXhpdHMgbm9ybWFsbHk7CitvdGhlcndpc2UgcmV0dXJuIC1TSUcsIHdoZXJlIFNJRyBpcyB0aGUgc2lnbmFsIHRoYXQga2lsbGVkIGl0LiAiIiIKKyAgICAgICAgcmV0dXJuIF9zcGF3bnZlZihtb2RlLCBmaWxlLCBhcmdzLCBlbnYsIGV4ZWN2cGUpCisKK2lmIF9leGlzdHMoInNwYXdudiIpOgorICAgICMgVGhlc2UgYXJlbid0IHN1cHBsaWVkIGJ5IHRoZSBiYXNpYyBXaW5kb3dzIGNvZGUKKyAgICAjIGJ1dCBjYW4gYmUgZWFzaWx5IGltcGxlbWVudGVkIGluIFB5dGhvbgorCisgICAgZGVmIHNwYXdubChtb2RlLCBmaWxlLCAqYXJncyk6CisgICAgICAgICIiInNwYXdubChtb2RlLCBmaWxlLCAqYXJncykgLT4gaW50ZWdlcgorCitFeGVjdXRlIGZpbGUgd2l0aCBhcmd1bWVudHMgZnJvbSBhcmdzIGluIGEgc3VicHJvY2Vzcy4KK0lmIG1vZGUgPT0gUF9OT1dBSVQgcmV0dXJuIHRoZSBwaWQgb2YgdGhlIHByb2Nlc3MuCitJZiBtb2RlID09IFBfV0FJVCByZXR1cm4gdGhlIHByb2Nlc3MncyBleGl0IGNvZGUgaWYgaXQgZXhpdHMgbm9ybWFsbHk7CitvdGhlcndpc2UgcmV0dXJuIC1TSUcsIHdoZXJlIFNJRyBpcyB0aGUgc2lnbmFsIHRoYXQga2lsbGVkIGl0LiAiIiIKKyAgICAgICAgcmV0dXJuIHNwYXdudihtb2RlLCBmaWxlLCBhcmdzKQorCisgICAgZGVmIHNwYXdubGUobW9kZSwgZmlsZSwgKmFyZ3MpOgorICAgICAgICAiIiJzcGF3bmxlKG1vZGUsIGZpbGUsICphcmdzLCBlbnYpIC0+IGludGVnZXIKKworRXhlY3V0ZSBmaWxlIHdpdGggYXJndW1lbnRzIGZyb20gYXJncyBpbiBhIHN1YnByb2Nlc3Mgd2l0aCB0aGUKK3N1cHBsaWVkIGVudmlyb25tZW50LgorSWYgbW9kZSA9PSBQX05PV0FJVCByZXR1cm4gdGhlIHBpZCBvZiB0aGUgcHJvY2Vzcy4KK0lmIG1vZGUgPT0gUF9XQUlUIHJldHVybiB0aGUgcHJvY2VzcydzIGV4aXQgY29kZSBpZiBpdCBleGl0cyBub3JtYWxseTsKK290aGVyd2lzZSByZXR1cm4gLVNJRywgd2hlcmUgU0lHIGlzIHRoZSBzaWduYWwgdGhhdCBraWxsZWQgaXQuICIiIgorICAgICAgICBlbnYgPSBhcmdzWy0xXQorICAgICAgICByZXR1cm4gc3Bhd252ZShtb2RlLCBmaWxlLCBhcmdzWzotMV0sIGVudikKKworCisgICAgX19hbGxfXy5leHRlbmQoWyJzcGF3bnYiLCAic3Bhd252ZSIsICJzcGF3bmwiLCAic3Bhd25sZSIsXSkKKworCitpZiBfZXhpc3RzKCJzcGF3bnZwIik6CisgICAgIyBBdCB0aGUgbW9tZW50LCBXaW5kb3dzIGRvZXNuJ3QgaW1wbGVtZW50IHNwYXdudnBbZV0sCisgICAgIyBzbyBpdCB3b24ndCBoYXZlIHNwYXdubHBbZV0gZWl0aGVyLgorICAgIGRlZiBzcGF3bmxwKG1vZGUsIGZpbGUsICphcmdzKToKKyAgICAgICAgIiIic3Bhd25scChtb2RlLCBmaWxlLCAqYXJncykgLT4gaW50ZWdlcgorCitFeGVjdXRlIGZpbGUgKHdoaWNoIGlzIGxvb2tlZCBmb3IgYWxvbmcgJFBBVEgpIHdpdGggYXJndW1lbnRzIGZyb20KK2FyZ3MgaW4gYSBzdWJwcm9jZXNzIHdpdGggdGhlIHN1cHBsaWVkIGVudmlyb25tZW50LgorSWYgbW9kZSA9PSBQX05PV0FJVCByZXR1cm4gdGhlIHBpZCBvZiB0aGUgcHJvY2Vzcy4KK0lmIG1vZGUgPT0gUF9XQUlUIHJldHVybiB0aGUgcHJvY2VzcydzIGV4aXQgY29kZSBpZiBpdCBleGl0cyBub3JtYWxseTsKK290aGVyd2lzZSByZXR1cm4gLVNJRywgd2hlcmUgU0lHIGlzIHRoZSBzaWduYWwgdGhhdCBraWxsZWQgaXQuICIiIgorICAgICAgICByZXR1cm4gc3Bhd252cChtb2RlLCBmaWxlLCBhcmdzKQorCisgICAgZGVmIHNwYXdubHBlKG1vZGUsIGZpbGUsICphcmdzKToKKyAgICAgICAgIiIic3Bhd25scGUobW9kZSwgZmlsZSwgKmFyZ3MsIGVudikgLT4gaW50ZWdlcgorCitFeGVjdXRlIGZpbGUgKHdoaWNoIGlzIGxvb2tlZCBmb3IgYWxvbmcgJFBBVEgpIHdpdGggYXJndW1lbnRzIGZyb20KK2FyZ3MgaW4gYSBzdWJwcm9jZXNzIHdpdGggdGhlIHN1cHBsaWVkIGVudmlyb25tZW50LgorSWYgbW9kZSA9PSBQX05PV0FJVCByZXR1cm4gdGhlIHBpZCBvZiB0aGUgcHJvY2Vzcy4KK0lmIG1vZGUgPT0gUF9XQUlUIHJldHVybiB0aGUgcHJvY2VzcydzIGV4aXQgY29kZSBpZiBpdCBleGl0cyBub3JtYWxseTsKK290aGVyd2lzZSByZXR1cm4gLVNJRywgd2hlcmUgU0lHIGlzIHRoZSBzaWduYWwgdGhhdCBraWxsZWQgaXQuICIiIgorICAgICAgICBlbnYgPSBhcmdzWy0xXQorICAgICAgICByZXR1cm4gc3Bhd252cGUobW9kZSwgZmlsZSwgYXJnc1s6LTFdLCBlbnYpCisKKworICAgIF9fYWxsX18uZXh0ZW5kKFsic3Bhd252cCIsICJzcGF3bnZwZSIsICJzcGF3bmxwIiwgInNwYXdubHBlIixdKQorCisKKyMgU3VwcGx5IHBvcGVuMiBldGMuIChmb3IgVW5peCkKK2lmIF9leGlzdHMoImZvcmsiKToKKyAgICBpZiBub3QgX2V4aXN0cygicG9wZW4yIik6CisgICAgICAgIGRlZiBwb3BlbjIoY21kLCBtb2RlPSJ0IiwgYnVmc2l6ZT0tMSk6CisgICAgICAgICAgICAiIiJFeGVjdXRlIHRoZSBzaGVsbCBjb21tYW5kICdjbWQnIGluIGEgc3ViLXByb2Nlc3MuICBPbiBVTklYLCAnY21kJworICAgICAgICAgICAgbWF5IGJlIGEgc2VxdWVuY2UsIGluIHdoaWNoIGNhc2UgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIGRpcmVjdGx5IHRvCisgICAgICAgICAgICB0aGUgcHJvZ3JhbSB3aXRob3V0IHNoZWxsIGludGVydmVudGlvbiAoYXMgd2l0aCBvcy5zcGF3bnYoKSkuICBJZiAnY21kJworICAgICAgICAgICAgaXMgYSBzdHJpbmcgaXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHNoZWxsIChhcyB3aXRoIG9zLnN5c3RlbSgpKS4gSWYKKyAgICAgICAgICAgICdidWZzaXplJyBpcyBzcGVjaWZpZWQsIGl0IHNldHMgdGhlIGJ1ZmZlciBzaXplIGZvciB0aGUgSS9PIHBpcGVzLiAgVGhlCisgICAgICAgICAgICBmaWxlIG9iamVjdHMgKGNoaWxkX3N0ZGluLCBjaGlsZF9zdGRvdXQpIGFyZSByZXR1cm5lZC4iIiIKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgbXNnID0gIm9zLnBvcGVuMiBpcyBkZXByZWNhdGVkLiAgVXNlIHRoZSBzdWJwcm9jZXNzIG1vZHVsZS4iCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisKKyAgICAgICAgICAgIGltcG9ydCBzdWJwcm9jZXNzCisgICAgICAgICAgICBQSVBFID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHNoZWxsPWlzaW5zdGFuY2UoY21kLCBiYXNlc3RyaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemU9YnVmc2l6ZSwgc3RkaW49UElQRSwgc3Rkb3V0PVBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV9mZHM9VHJ1ZSkKKyAgICAgICAgICAgIHJldHVybiBwLnN0ZGluLCBwLnN0ZG91dAorICAgICAgICBfX2FsbF9fLmFwcGVuZCgicG9wZW4yIikKKworICAgIGlmIG5vdCBfZXhpc3RzKCJwb3BlbjMiKToKKyAgICAgICAgZGVmIHBvcGVuMyhjbWQsIG1vZGU9InQiLCBidWZzaXplPS0xKToKKyAgICAgICAgICAgICIiIkV4ZWN1dGUgdGhlIHNoZWxsIGNvbW1hbmQgJ2NtZCcgaW4gYSBzdWItcHJvY2Vzcy4gIE9uIFVOSVgsICdjbWQnCisgICAgICAgICAgICBtYXkgYmUgYSBzZXF1ZW5jZSwgaW4gd2hpY2ggY2FzZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8KKyAgICAgICAgICAgIHRoZSBwcm9ncmFtIHdpdGhvdXQgc2hlbGwgaW50ZXJ2ZW50aW9uIChhcyB3aXRoIG9zLnNwYXdudigpKS4gIElmICdjbWQnCisgICAgICAgICAgICBpcyBhIHN0cmluZyBpdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc2hlbGwgKGFzIHdpdGggb3Muc3lzdGVtKCkpLiBJZgorICAgICAgICAgICAgJ2J1ZnNpemUnIGlzIHNwZWNpZmllZCwgaXQgc2V0cyB0aGUgYnVmZmVyIHNpemUgZm9yIHRoZSBJL08gcGlwZXMuICBUaGUKKyAgICAgICAgICAgIGZpbGUgb2JqZWN0cyAoY2hpbGRfc3RkaW4sIGNoaWxkX3N0ZG91dCwgY2hpbGRfc3RkZXJyKSBhcmUgcmV0dXJuZWQuIiIiCisgICAgICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgIG1zZyA9ICJvcy5wb3BlbjMgaXMgZGVwcmVjYXRlZC4gIFVzZSB0aGUgc3VicHJvY2VzcyBtb2R1bGUuIgorICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorCisgICAgICAgICAgICBpbXBvcnQgc3VicHJvY2VzcworICAgICAgICAgICAgUElQRSA9IHN1YnByb2Nlc3MuUElQRQorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzaGVsbD1pc2luc3RhbmNlKGNtZCwgYmFzZXN0cmluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplPWJ1ZnNpemUsIHN0ZGluPVBJUEUsIHN0ZG91dD1QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPVBJUEUsIGNsb3NlX2Zkcz1UcnVlKQorICAgICAgICAgICAgcmV0dXJuIHAuc3RkaW4sIHAuc3Rkb3V0LCBwLnN0ZGVycgorICAgICAgICBfX2FsbF9fLmFwcGVuZCgicG9wZW4zIikKKworICAgIGlmIG5vdCBfZXhpc3RzKCJwb3BlbjQiKToKKyAgICAgICAgZGVmIHBvcGVuNChjbWQsIG1vZGU9InQiLCBidWZzaXplPS0xKToKKyAgICAgICAgICAgICIiIkV4ZWN1dGUgdGhlIHNoZWxsIGNvbW1hbmQgJ2NtZCcgaW4gYSBzdWItcHJvY2Vzcy4gIE9uIFVOSVgsICdjbWQnCisgICAgICAgICAgICBtYXkgYmUgYSBzZXF1ZW5jZSwgaW4gd2hpY2ggY2FzZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8KKyAgICAgICAgICAgIHRoZSBwcm9ncmFtIHdpdGhvdXQgc2hlbGwgaW50ZXJ2ZW50aW9uIChhcyB3aXRoIG9zLnNwYXdudigpKS4gIElmICdjbWQnCisgICAgICAgICAgICBpcyBhIHN0cmluZyBpdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc2hlbGwgKGFzIHdpdGggb3Muc3lzdGVtKCkpLiBJZgorICAgICAgICAgICAgJ2J1ZnNpemUnIGlzIHNwZWNpZmllZCwgaXQgc2V0cyB0aGUgYnVmZmVyIHNpemUgZm9yIHRoZSBJL08gcGlwZXMuICBUaGUKKyAgICAgICAgICAgIGZpbGUgb2JqZWN0cyAoY2hpbGRfc3RkaW4sIGNoaWxkX3N0ZG91dF9zdGRlcnIpIGFyZSByZXR1cm5lZC4iIiIKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgbXNnID0gIm9zLnBvcGVuNCBpcyBkZXByZWNhdGVkLiAgVXNlIHRoZSBzdWJwcm9jZXNzIG1vZHVsZS4iCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisKKyAgICAgICAgICAgIGltcG9ydCBzdWJwcm9jZXNzCisgICAgICAgICAgICBQSVBFID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHNoZWxsPWlzaW5zdGFuY2UoY21kLCBiYXNlc3RyaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemU9YnVmc2l6ZSwgc3RkaW49UElQRSwgc3Rkb3V0PVBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsIGNsb3NlX2Zkcz1UcnVlKQorICAgICAgICAgICAgcmV0dXJuIHAuc3RkaW4sIHAuc3Rkb3V0CisgICAgICAgIF9fYWxsX18uYXBwZW5kKCJwb3BlbjQiKQorCitpbXBvcnQgY29weV9yZWcgYXMgX2NvcHlfcmVnCisKK2RlZiBfbWFrZV9zdGF0X3Jlc3VsdCh0dXAsIGRpY3QpOgorICAgIHJldHVybiBzdGF0X3Jlc3VsdCh0dXAsIGRpY3QpCisKK2RlZiBfcGlja2xlX3N0YXRfcmVzdWx0KHNyKToKKyAgICAodHlwZSwgYXJncykgPSBzci5fX3JlZHVjZV9fKCkKKyAgICByZXR1cm4gKF9tYWtlX3N0YXRfcmVzdWx0LCBhcmdzKQorCit0cnk6CisgICAgX2NvcHlfcmVnLnBpY2tsZShzdGF0X3Jlc3VsdCwgX3BpY2tsZV9zdGF0X3Jlc3VsdCwgX21ha2Vfc3RhdF9yZXN1bHQpCitleGNlcHQgTmFtZUVycm9yOiAjIHN0YXRfcmVzdWx0IG1heSBub3QgZXhpc3QKKyAgICBwYXNzCisKK2RlZiBfbWFrZV9zdGF0dmZzX3Jlc3VsdCh0dXAsIGRpY3QpOgorICAgIHJldHVybiBzdGF0dmZzX3Jlc3VsdCh0dXAsIGRpY3QpCisKK2RlZiBfcGlja2xlX3N0YXR2ZnNfcmVzdWx0KHNyKToKKyAgICAodHlwZSwgYXJncykgPSBzci5fX3JlZHVjZV9fKCkKKyAgICByZXR1cm4gKF9tYWtlX3N0YXR2ZnNfcmVzdWx0LCBhcmdzKQorCit0cnk6CisgICAgX2NvcHlfcmVnLnBpY2tsZShzdGF0dmZzX3Jlc3VsdCwgX3BpY2tsZV9zdGF0dmZzX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgIF9tYWtlX3N0YXR2ZnNfcmVzdWx0KQorZXhjZXB0IE5hbWVFcnJvcjogIyBzdGF0dmZzX3Jlc3VsdCBtYXkgbm90IGV4aXN0CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9vcy5weWMgYi9saWIvcHl0aG9uMi43L29zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzE0MjRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9vcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9vcy5weW8gYi9saWIvcHl0aG9uMi43L29zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzE0MjRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9vcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9vczJlbXhwYXRoLnB5IGIvbGliL3B5dGhvbjIuNy9vczJlbXhwYXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZWQ1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L29zMmVteHBhdGgucHkKQEAgLTAsMCArMSwxNTkgQEAKKyMgTW9kdWxlICdvczJlbXhwYXRoJyAtLSBjb21tb24gb3BlcmF0aW9ucyBvbiBPUy8yIHBhdGhuYW1lcworIiIiQ29tbW9uIHBhdGhuYW1lIG1hbmlwdWxhdGlvbnMsIE9TLzIgRU1YIHZlcnNpb24uCisKK0luc3RlYWQgb2YgaW1wb3J0aW5nIHRoaXMgbW9kdWxlIGRpcmVjdGx5LCBpbXBvcnQgb3MgYW5kIHJlZmVyIHRvIHRoaXMKK21vZHVsZSBhcyBvcy5wYXRoLgorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN0YXQKK2Zyb20gZ2VuZXJpY3BhdGggaW1wb3J0ICoKK2Zyb20gbnRwYXRoIGltcG9ydCAoZXhwYW5kdXNlciwgZXhwYW5kdmFycywgaXNhYnMsIGlzbGluaywgc3BsaXRkcml2ZSwKKyAgICAgICAgICAgICAgICAgICAgc3BsaXRleHQsIHNwbGl0LCB3YWxrKQorCitfX2FsbF9fID0gWyJub3JtY2FzZSIsImlzYWJzIiwiam9pbiIsInNwbGl0ZHJpdmUiLCJzcGxpdCIsInNwbGl0ZXh0IiwKKyAgICAgICAgICAgImJhc2VuYW1lIiwiZGlybmFtZSIsImNvbW1vbnByZWZpeCIsImdldHNpemUiLCJnZXRtdGltZSIsCisgICAgICAgICAgICJnZXRhdGltZSIsImdldGN0aW1lIiwgImlzbGluayIsImV4aXN0cyIsImxleGlzdHMiLCJpc2RpciIsImlzZmlsZSIsCisgICAgICAgICAgICJpc21vdW50Iiwid2FsayIsImV4cGFuZHVzZXIiLCJleHBhbmR2YXJzIiwibm9ybXBhdGgiLCJhYnNwYXRoIiwKKyAgICAgICAgICAgInNwbGl0dW5jIiwiY3VyZGlyIiwicGFyZGlyIiwic2VwIiwicGF0aHNlcCIsImRlZnBhdGgiLCJhbHRzZXAiLAorICAgICAgICAgICAiZXh0c2VwIiwiZGV2bnVsbCIsInJlYWxwYXRoIiwic3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMiXQorCisjIHN0cmluZ3MgcmVwcmVzZW50aW5nIHZhcmlvdXMgcGF0aC1yZWxhdGVkIGJpdHMgYW5kIHBpZWNlcworY3VyZGlyID0gJy4nCitwYXJkaXIgPSAnLi4nCitleHRzZXAgPSAnLicKK3NlcCA9ICcvJworYWx0c2VwID0gJ1xcJworcGF0aHNlcCA9ICc7JworZGVmcGF0aCA9ICcuO0M6XFxiaW4nCitkZXZudWxsID0gJ251bCcKKworIyBOb3JtYWxpemUgdGhlIGNhc2Ugb2YgYSBwYXRobmFtZSBhbmQgbWFwIHNsYXNoZXMgdG8gYmFja3NsYXNoZXMuCisjIE90aGVyIG5vcm1hbGl6YXRpb25zIChzdWNoIGFzIG9wdGltaXppbmcgJy4uLycgYXdheSkgYXJlIG5vdCBkb25lCisjICh0aGlzIGlzIGRvbmUgYnkgbm9ybXBhdGgpLgorCitkZWYgbm9ybWNhc2Uocyk6CisgICAgIiIiTm9ybWFsaXplIGNhc2Ugb2YgcGF0aG5hbWUuCisKKyAgICBNYWtlcyBhbGwgY2hhcmFjdGVycyBsb3dlcmNhc2UgYW5kIGFsbCBhbHRzZXBzIGludG8gc2Vwcy4iIiIKKyAgICByZXR1cm4gcy5yZXBsYWNlKCdcXCcsICcvJykubG93ZXIoKQorCisKKyMgSm9pbiB0d28gKG9yIG1vcmUpIHBhdGhzLgorCitkZWYgam9pbihhLCAqcCk6CisgICAgIiIiSm9pbiB0d28gb3IgbW9yZSBwYXRobmFtZSBjb21wb25lbnRzLCBpbnNlcnRpbmcgc2VwIGFzIG5lZWRlZCIiIgorICAgIHBhdGggPSBhCisgICAgZm9yIGIgaW4gcDoKKyAgICAgICAgaWYgaXNhYnMoYik6CisgICAgICAgICAgICBwYXRoID0gYgorICAgICAgICBlbGlmIHBhdGggPT0gJycgb3IgcGF0aFstMTpdIGluICcvXFw6JzoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoICsgYgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aCA9IHBhdGggKyAnLycgKyBiCisgICAgcmV0dXJuIHBhdGgKKworCisjIFBhcnNlIFVOQyBwYXRocworZGVmIHNwbGl0dW5jKHApOgorICAgICIiIlNwbGl0IGEgcGF0aG5hbWUgaW50byBVTkMgbW91bnQgcG9pbnQgYW5kIHJlbGF0aXZlIHBhdGggc3BlY2lmaWVycy4KKworICAgIFJldHVybiBhIDItdHVwbGUgKHVuYywgcmVzdCk7IGVpdGhlciBwYXJ0IG1heSBiZSBlbXB0eS4KKyAgICBJZiB1bmMgaXMgbm90IGVtcHR5LCBpdCBoYXMgdGhlIGZvcm0gJy8vaG9zdC9tb3VudCcgKG9yIHNpbWlsYXIKKyAgICB1c2luZyBiYWNrc2xhc2hlcykuICB1bmMrcmVzdCBpcyBhbHdheXMgdGhlIGlucHV0IHBhdGguCisgICAgUGF0aHMgY29udGFpbmluZyBkcml2ZSBsZXR0ZXJzIG5ldmVyIGhhdmUgYW4gVU5DIHBhcnQuCisgICAgIiIiCisgICAgaWYgcFsxOjJdID09ICc6JzoKKyAgICAgICAgcmV0dXJuICcnLCBwICMgRHJpdmUgbGV0dGVyIHByZXNlbnQKKyAgICBmaXJzdFR3byA9IHBbMDoyXQorICAgIGlmIGZpcnN0VHdvID09ICcvJyAqIDIgb3IgZmlyc3RUd28gPT0gJ1xcJyAqIDI6CisgICAgICAgICMgaXMgYSBVTkMgcGF0aDoKKyAgICAgICAgIyB2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2diBlcXVpdmFsZW50IHRvIGRyaXZlIGxldHRlcgorICAgICAgICAjIFxcbWFjaGluZVxtb3VudHBvaW50XGRpcmVjdG9yaWVzLi4uCisgICAgICAgICMgICAgICAgICAgIGRpcmVjdG9yeSBeXl5eXl5eXl5eXl5eXl4KKyAgICAgICAgbm9ybXAgPSBub3JtY2FzZShwKQorICAgICAgICBpbmRleCA9IG5vcm1wLmZpbmQoJy8nLCAyKQorICAgICAgICBpZiBpbmRleCA9PSAtMToKKyAgICAgICAgICAgICMjcmFpc2UgUnVudGltZUVycm9yLCAnaWxsZWdhbCBVTkMgcGF0aDogIicgKyBwICsgJyInCisgICAgICAgICAgICByZXR1cm4gKCIiLCBwKQorICAgICAgICBpbmRleCA9IG5vcm1wLmZpbmQoJy8nLCBpbmRleCArIDEpCisgICAgICAgIGlmIGluZGV4ID09IC0xOgorICAgICAgICAgICAgaW5kZXggPSBsZW4ocCkKKyAgICAgICAgcmV0dXJuIHBbOmluZGV4XSwgcFtpbmRleDpdCisgICAgcmV0dXJuICcnLCBwCisKKworIyBSZXR1cm4gdGhlIHRhaWwgKGJhc2VuYW1lKSBwYXJ0IG9mIGEgcGF0aC4KKworZGVmIGJhc2VuYW1lKHApOgorICAgICIiIlJldHVybnMgdGhlIGZpbmFsIGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lIiIiCisgICAgcmV0dXJuIHNwbGl0KHApWzFdCisKKworIyBSZXR1cm4gdGhlIGhlYWQgKGRpcm5hbWUpIHBhcnQgb2YgYSBwYXRoLgorCitkZWYgZGlybmFtZShwKToKKyAgICAiIiJSZXR1cm5zIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IG9mIGEgcGF0aG5hbWUiIiIKKyAgICByZXR1cm4gc3BsaXQocClbMF0KKworCisjIGFsaWFzIGV4aXN0cyB0byBsZXhpc3RzCitsZXhpc3RzID0gZXhpc3RzCisKKworIyBJcyBhIHBhdGggYSBkaXJlY3Rvcnk/CisKKyMgSXMgYSBwYXRoIGEgbW91bnQgcG9pbnQ/ICBFaXRoZXIgYSByb290ICh3aXRoIG9yIHdpdGhvdXQgZHJpdmUgbGV0dGVyKQorIyBvciBhbiBVTkMgcGF0aCB3aXRoIGF0IG1vc3QgYSAvIG9yIFwgYWZ0ZXIgdGhlIG1vdW50IHBvaW50LgorCitkZWYgaXNtb3VudChwYXRoKToKKyAgICAiIiJUZXN0IHdoZXRoZXIgYSBwYXRoIGlzIGEgbW91bnQgcG9pbnQgKGRlZmluZWQgYXMgcm9vdCBvZiBkcml2ZSkiIiIKKyAgICB1bmMsIHJlc3QgPSBzcGxpdHVuYyhwYXRoKQorICAgIGlmIHVuYzoKKyAgICAgICAgcmV0dXJuIHJlc3QgaW4gKCIiLCAiLyIsICJcXCIpCisgICAgcCA9IHNwbGl0ZHJpdmUocGF0aClbMV0KKyAgICByZXR1cm4gbGVuKHApID09IDEgYW5kIHBbMF0gaW4gJy9cXCcKKworCisjIE5vcm1hbGl6ZSBhIHBhdGgsIGUuZy4gQS8vQiwgQS8uL0IgYW5kIEEvZm9vLy4uL0IgYWxsIGJlY29tZSBBL0IuCisKK2RlZiBub3JtcGF0aChwYXRoKToKKyAgICAiIiJOb3JtYWxpemUgcGF0aCwgZWxpbWluYXRpbmcgZG91YmxlIHNsYXNoZXMsIGV0Yy4iIiIKKyAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCdcXCcsICcvJykKKyAgICBwcmVmaXgsIHBhdGggPSBzcGxpdGRyaXZlKHBhdGgpCisgICAgd2hpbGUgcGF0aFs6MV0gPT0gJy8nOgorICAgICAgICBwcmVmaXggPSBwcmVmaXggKyAnLycKKyAgICAgICAgcGF0aCA9IHBhdGhbMTpdCisgICAgY29tcHMgPSBwYXRoLnNwbGl0KCcvJykKKyAgICBpID0gMAorICAgIHdoaWxlIGkgPCBsZW4oY29tcHMpOgorICAgICAgICBpZiBjb21wc1tpXSA9PSAnLic6CisgICAgICAgICAgICBkZWwgY29tcHNbaV0KKyAgICAgICAgZWxpZiBjb21wc1tpXSA9PSAnLi4nIGFuZCBpID4gMCBhbmQgY29tcHNbaS0xXSBub3QgaW4gKCcnLCAnLi4nKToKKyAgICAgICAgICAgIGRlbCBjb21wc1tpLTE6aSsxXQorICAgICAgICAgICAgaSA9IGkgLSAxCisgICAgICAgIGVsaWYgY29tcHNbaV0gPT0gJycgYW5kIGkgPiAwIGFuZCBjb21wc1tpLTFdICE9ICcnOgorICAgICAgICAgICAgZGVsIGNvbXBzW2ldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpID0gaSArIDEKKyAgICAjIElmIHRoZSBwYXRoIGlzIG5vdyBlbXB0eSwgc3Vic3RpdHV0ZSAnLicKKyAgICBpZiBub3QgcHJlZml4IGFuZCBub3QgY29tcHM6CisgICAgICAgIGNvbXBzLmFwcGVuZCgnLicpCisgICAgcmV0dXJuIHByZWZpeCArICcvJy5qb2luKGNvbXBzKQorCisKKyMgUmV0dXJuIGFuIGFic29sdXRlIHBhdGguCitkZWYgYWJzcGF0aChwYXRoKToKKyAgICAiIiJSZXR1cm4gdGhlIGFic29sdXRlIHZlcnNpb24gb2YgYSBwYXRoIiIiCisgICAgaWYgbm90IGlzYWJzKHBhdGgpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHVuaWNvZGUpOgorICAgICAgICAgICAgY3dkID0gb3MuZ2V0Y3dkdSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICBwYXRoID0gam9pbihjd2QsIHBhdGgpCisgICAgcmV0dXJuIG5vcm1wYXRoKHBhdGgpCisKKyMgcmVhbHBhdGggaXMgYSBuby1vcCBvbiBzeXN0ZW1zIHdpdGhvdXQgaXNsaW5rIHN1cHBvcnQKK3JlYWxwYXRoID0gYWJzcGF0aAorCitzdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lcyA9IEZhbHNlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L29zMmVteHBhdGgucHljIGIvbGliL3B5dGhvbjIuNy9vczJlbXhwYXRoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWUwOTgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9vczJlbXhwYXRoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L29zMmVteHBhdGgucHlvIGIvbGliL3B5dGhvbjIuNy9vczJlbXhwYXRoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWUwOTgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9vczJlbXhwYXRoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BkYi5kb2MgYi9saWIvcHl0aG9uMi43L3BkYi5kb2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1YmUyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGRiLmRvYwpAQCAtMCwwICsxLDIwMiBAQAorVGhlIFB5dGhvbiBEZWJ1Z2dlciBQZGIKKz09PT09PT09PT09PT09PT09PT09PT09CisKK1RvIHVzZSB0aGUgZGVidWdnZXIgaW4gaXRzIHNpbXBsZXN0IGZvcm06CisKKyAgICAgICAgPj4+IGltcG9ydCBwZGIKKyAgICAgICAgPj4+IHBkYi5ydW4oJzxhIHN0YXRlbWVudD4nKQorCitUaGUgZGVidWdnZXIncyBwcm9tcHQgaXMgJyhQZGIpICcuICBUaGlzIHdpbGwgc3RvcCBpbiB0aGUgZmlyc3QKK2Z1bmN0aW9uIGNhbGwgaW4gPGEgc3RhdGVtZW50Pi4KKworQWx0ZXJuYXRpdmVseSwgaWYgYSBzdGF0ZW1lbnQgdGVybWluYXRlZCB3aXRoIGFuIHVuaGFuZGxlZCBleGNlcHRpb24sCit5b3UgY2FuIHVzZSBwZGIncyBwb3N0LW1vcnRlbSBmYWNpbGl0eSB0byBpbnNwZWN0IHRoZSBjb250ZW50cyBvZiB0aGUKK3RyYWNlYmFjazoKKworICAgICAgICA+Pj4gPGEgc3RhdGVtZW50PgorICAgICAgICA8ZXhjZXB0aW9uIHRyYWNlYmFjaz4KKyAgICAgICAgPj4+IGltcG9ydCBwZGIKKyAgICAgICAgPj4+IHBkYi5wbSgpCisKK1RoZSBjb21tYW5kcyByZWNvZ25pemVkIGJ5IHRoZSBkZWJ1Z2dlciBhcmUgbGlzdGVkIGluIHRoZSBuZXh0CitzZWN0aW9uLiAgTW9zdCBjYW4gYmUgYWJicmV2aWF0ZWQgYXMgaW5kaWNhdGVkOyBlLmcuLCBoKGVscCkgbWVhbnMKK3RoYXQgJ2hlbHAnIGNhbiBiZSB0eXBlZCBhcyAnaCcgb3IgJ2hlbHAnIChidXQgbm90IGFzICdoZScgb3IgJ2hlbCcsCitub3IgYXMgJ0gnIG9yICdIZWxwJyBvciAnSEVMUCcpLiAgT3B0aW9uYWwgYXJndW1lbnRzIGFyZSBlbmNsb3NlZCBpbgorc3F1YXJlIGJyYWNrZXRzLgorCitBIGJsYW5rIGxpbmUgcmVwZWF0cyB0aGUgcHJldmlvdXMgY29tbWFuZCBsaXRlcmFsbHksIGV4Y2VwdCBmb3IKKydsaXN0Jywgd2hlcmUgaXQgbGlzdHMgdGhlIG5leHQgMTEgbGluZXMuCisKK0NvbW1hbmRzIHRoYXQgdGhlIGRlYnVnZ2VyIGRvZXNuJ3QgcmVjb2duaXplIGFyZSBhc3N1bWVkIHRvIGJlIFB5dGhvbgorc3RhdGVtZW50cyBhbmQgYXJlIGV4ZWN1dGVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9ncmFtIGJlaW5nCitkZWJ1Z2dlZC4gIFB5dGhvbiBzdGF0ZW1lbnRzIGNhbiBhbHNvIGJlIHByZWZpeGVkIHdpdGggYW4gZXhjbGFtYXRpb24KK3BvaW50ICgnIScpLiAgVGhpcyBpcyBhIHBvd2VyZnVsIHdheSB0byBpbnNwZWN0IHRoZSBwcm9ncmFtIGJlaW5nCitkZWJ1Z2dlZDsgaXQgaXMgZXZlbiBwb3NzaWJsZSB0byBjaGFuZ2UgdmFyaWFibGVzLiAgV2hlbiBhbiBleGNlcHRpb24KK29jY3VycyBpbiBzdWNoIGEgc3RhdGVtZW50LCB0aGUgZXhjZXB0aW9uIG5hbWUgaXMgcHJpbnRlZCBidXQgdGhlCitkZWJ1Z2dlcidzIHN0YXRlIGlzIG5vdCBjaGFuZ2VkLgorCitUaGUgZGVidWdnZXIgc3VwcG9ydHMgYWxpYXNlcywgd2hpY2ggY2FuIHNhdmUgdHlwaW5nLiAgQW5kIGFsaWFzZXMgY2FuCitoYXZlIHBhcmFtZXRlcnMgKHNlZSB0aGUgYWxpYXMgaGVscCBlbnRyeSkgd2hpY2ggYWxsb3dzIG9uZSBhIGNlcnRhaW4KK2xldmVsIG9mIGFkYXB0YWJpbGl0eSB0byB0aGUgY29udGV4dCB1bmRlciBleGFtaW5hdGlvbi4KKworTXVsdGlwbGUgY29tbWFuZHMgbWF5IGJlIGVudGVyZWQgb24gYSBzaW5nbGUgbGluZSwgc2VwYXJhdGVkIGJ5IHRoZQorcGFpciAnOzsnLiAgTm8gaW50ZWxsaWdlbmNlIGlzIGFwcGxpZWQgdG8gc2VwYXJhdGluZyB0aGUgY29tbWFuZHM7IHRoZQoraW5wdXQgaXMgc3BsaXQgYXQgdGhlIGZpcnN0ICc7OycsIGV2ZW4gaWYgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiBhCitxdW90ZWQgc3RyaW5nLgorCitJZiBhIGZpbGUgIi5wZGJyYyIgZXhpc3RzIGluIHlvdXIgaG9tZSBkaXJlY3Rvcnkgb3IgaW4gdGhlIGN1cnJlbnQKK2RpcmVjdG9yeSwgaXQgaXMgcmVhZCBpbiBhbmQgZXhlY3V0ZWQgYXMgaWYgaXQgaGFkIGJlZW4gdHlwZWQgYXQgdGhlCitkZWJ1Z2dlciBwcm9tcHQuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGFsaWFzZXMuICBJZiBib3RoCitmaWxlcyBleGlzdCwgdGhlIG9uZSBpbiB0aGUgaG9tZSBkaXJlY3RvcnkgaXMgcmVhZCBmaXJzdCBhbmQgYWxpYXNlcworZGVmaW5lZCB0aGVyZSBjYW4gYmUgb3ZlcnJpZGVuIGJ5IHRoZSBsb2NhbCBmaWxlLgorCitBc2lkZSBmcm9tIGFsaWFzZXMsIHRoZSBkZWJ1Z2dlciBpcyBub3QgZGlyZWN0bHkgcHJvZ3JhbW1hYmxlOyBidXQgaXQKK2lzIGltcGxlbWVudGVkIGFzIGEgY2xhc3MgZnJvbSB3aGljaCB5b3UgY2FuIGRlcml2ZSB5b3VyIG93biBkZWJ1Z2dlcgorY2xhc3MsIHdoaWNoIHlvdSBjYW4gbWFrZSBhcyBmYW5jeSBhcyB5b3UgbGlrZS4KKworCitEZWJ1Z2dlciBjb21tYW5kcworPT09PT09PT09PT09PT09PT0KKworaChlbHApCisgICAgICAgIFdpdGhvdXQgYXJndW1lbnQsIHByaW50IHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjb21tYW5kcy4gIFdpdGgKKyAgICAgICAgYSBjb21tYW5kIG5hbWUgYXMgYXJndW1lbnQsIHByaW50IGhlbHAgYWJvdXQgdGhhdCBjb21tYW5kCisgICAgICAgICh0aGlzIGlzIGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQpLgorCit3KGhlcmUpCisgICAgICAgIFByaW50IGEgc3RhY2sgdHJhY2UsIHdpdGggdGhlIG1vc3QgcmVjZW50IGZyYW1lIGF0IHRoZSBib3R0b20uCisgICAgICAgIEFuIGFycm93IGluZGljYXRlcyB0aGUgImN1cnJlbnQgZnJhbWUiLCB3aGljaCBkZXRlcm1pbmVzIHRoZQorICAgICAgICBjb250ZXh0IG9mIG1vc3QgY29tbWFuZHMuCisKK2Qob3duKQorICAgICAgICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lIG9uZSBsZXZlbCBkb3duIGluIHRoZSBzdGFjayB0cmFjZQorICAgICAgICAodG8gYSBuZXdlciBmcmFtZSkuCisKK3UocCkKKyAgICAgICAgTW92ZSB0aGUgY3VycmVudCBmcmFtZSBvbmUgbGV2ZWwgdXAgaW4gdGhlIHN0YWNrIHRyYWNlCisgICAgICAgICh0byBhbiBvbGRlciBmcmFtZSkuCisKK2IocmVhaykgWyAoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXSBdCisgICAgICAgIFdpdGggYSBmaWxlbmFtZTpsaW5lIG51bWJlciBhcmd1bWVudCwgc2V0IGEgYnJlYWsgdGhlcmUuICBJZgorICAgICAgICBmaWxlbmFtZSBpcyBvbWl0dGVkLCB1c2UgdGhlIGN1cnJlbnQgZmlsZS4gIFdpdGggYSBmdW5jdGlvbgorICAgICAgICBuYW1lLCBzZXQgYSBicmVhayBhdCB0aGUgZmlyc3QgZXhlY3V0YWJsZSBsaW5lIG9mIHRoYXQKKyAgICAgICAgZnVuY3Rpb24uICBXaXRob3V0IGFyZ3VtZW50LCBsaXN0IGFsbCBicmVha3MuICBFYWNoIGJyZWFrcG9pbnQKKyAgICAgICAgaXMgYXNzaWduZWQgYSBudW1iZXIgdG8gd2hpY2ggYWxsIHRoZSBvdGhlciBicmVha3BvaW50CisgICAgICAgIGNvbW1hbmRzIHJlZmVyLgorCisgICAgICAgIFRoZSBjb25kaXRpb24gYXJndW1lbnQsIGlmIHByZXNlbnQsIGlzIGEgc3RyaW5nIHdoaWNoIG11c3QKKyAgICAgICAgZXZhbHVhdGUgdG8gdHJ1ZSBpbiBvcmRlciBmb3IgdGhlIGJyZWFrcG9pbnQgdG8gYmUgaG9ub3JlZC4KKwordGJyZWFrIFsgKFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssIGNvbmRpdGlvbl0gXQorICAgICAgICBUZW1wb3JhcnkgYnJlYWtwb2ludCwgd2hpY2ggaXMgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IHdoZW4gaXQKKyAgICAgICAgaXMgZmlyc3QgaGl0LiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgYnJlYWsuCisKK2NsKGVhcikgW2JwbnVtYmVyIFticG51bWJlciAuLi5dIF0KKyAgICAgICAgV2l0aCBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGJyZWFrcG9pbnQgbnVtYmVycywgY2xlYXIgdGhvc2UKKyAgICAgICAgYnJlYWtwb2ludHMuICBXaXRob3V0IGFyZ3VtZW50LCBjbGVhciBhbGwgYnJlYWtzIChidXQgZmlyc3QKKyAgICAgICAgYXNrIGNvbmZpcm1hdGlvbikuCisKK2Rpc2FibGUgYnBudW1iZXIgW2JwbnVtYmVyIC4uLl0KKyAgICAgICAgRGlzYWJsZXMgdGhlIGJyZWFrcG9pbnRzIGdpdmVuIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YKKyAgICAgICAgYnJlYWtwb2ludCBudW1iZXJzLiAgRGlzYWJsaW5nIGEgYnJlYWtwb2ludCBtZWFucyBpdCBjYW5ub3QKKyAgICAgICAgY2F1c2UgdGhlIHByb2dyYW0gdG8gc3RvcCBleGVjdXRpb24sIGJ1dCB1bmxpa2UgY2xlYXJpbmcgYQorICAgICAgICBicmVha3BvaW50LCBpdCByZW1haW5zIGluIHRoZSBsaXN0IG9mIGJyZWFrcG9pbnRzIGFuZCBjYW4gYmUKKyAgICAgICAgKHJlLSllbmFibGVkLgorCitlbmFibGUgYnBudW1iZXIgW2JwbnVtYmVyIC4uLl0KKyAgICAgICAgRW5hYmxlcyB0aGUgYnJlYWtwb2ludHMgc3BlY2lmaWVkLgorCitpZ25vcmUgYnBudW1iZXIgY291bnQKKyAgICAgICAgU2V0cyB0aGUgaWdub3JlIGNvdW50IGZvciB0aGUgZ2l2ZW4gYnJlYWtwb2ludCBudW1iZXIuICBJZgorICAgICAgICBjb3VudCBpcyBvbWl0dGVkLCB0aGUgaWdub3JlIGNvdW50IGlzIHNldCB0byAwLiAgQSBicmVha3BvaW50CisgICAgICAgIGJlY29tZXMgYWN0aXZlIHdoZW4gdGhlIGlnbm9yZSBjb3VudCBpcyB6ZXJvLiAgV2hlbiBub24temVybywKKyAgICAgICAgdGhlIGNvdW50IGlzIGRlY3JlbWVudGVkIGVhY2ggdGltZSB0aGUgYnJlYWtwb2ludCBpcyByZWFjaGVkCisgICAgICAgIGFuZCB0aGUgYnJlYWtwb2ludCBpcyBub3QgZGlzYWJsZWQgYW5kIGFueSBhc3NvY2lhdGVkCisgICAgICAgIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4KKworY29uZGl0aW9uIGJwbnVtYmVyIGNvbmRpdGlvbgorICAgICAgICBjb25kaXRpb24gaXMgYW4gZXhwcmVzc2lvbiB3aGljaCBtdXN0IGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlCisgICAgICAgIHRoZSBicmVha3BvaW50IGlzIGhvbm9yZWQuICBJZiBjb25kaXRpb24gaXMgYWJzZW50LCBhbnkKKyAgICAgICAgZXhpc3RpbmcgY29uZGl0aW9uIGlzIHJlbW92ZWQ7IGkuZS4sIHRoZSBicmVha3BvaW50IGlzIG1hZGUKKyAgICAgICAgdW5jb25kaXRpb25hbC4KKworcyh0ZXApCisgICAgICAgIEV4ZWN1dGUgdGhlIGN1cnJlbnQgbGluZSwgc3RvcCBhdCB0aGUgZmlyc3QgcG9zc2libGUgb2NjYXNpb24KKyAgICAgICAgKGVpdGhlciBpbiBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9yIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uKS4KKworbihleHQpCisgICAgICAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uCisgICAgICAgIGlzIHJlYWNoZWQgb3IgaXQgcmV0dXJucy4KKwordW50KGlsKQorICAgICAgICBDb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIGxpbmUgd2l0aCBhIG51bWJlciBncmVhdGVyIHRoYW4gdGhlIAorICAgICAgICBjdXJyZW50IG9uZSBpcyByZWFjaGVkIG9yIHVudGlsIHRoZSBjdXJyZW50IGZyYW1lIHJldHVybnMuCisKK3IoZXR1cm4pCisgICAgICAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY3VycmVudCBmdW5jdGlvbiByZXR1cm5zLgorCitydW4gW2FyZ3MuLi5dCisgICAgICAgIFJlc3RhcnQgdGhlIGRlYnVnZ2VkIHB5dGhvbiBwcm9ncmFtLiBJZiBhIHN0cmluZyBpcyBzdXBwbGllZCBpdCBpcworICAgICAgICBzcGxpdHRlZCB3aXRoICJzaGxleCIsIGFuZCB0aGUgcmVzdWx0IGlzIHVzZWQgYXMgdGhlIG5ldyBzeXMuYXJndi4KKyAgICAgICAgSGlzdG9yeSwgYnJlYWtwb2ludHMsIGFjdGlvbnMgYW5kIGRlYnVnZ2VyIG9wdGlvbnMgYXJlIHByZXNlcnZlZC4KKyAgICAgICAgInJlc3RhcnQiIGlzIGFuIGFsaWFzIGZvciAicnVuIi4KKworYyhvbnQoaW51ZSkpCisgICAgICAgIENvbnRpbnVlIGV4ZWN1dGlvbiwgb25seSBzdG9wIHdoZW4gYSBicmVha3BvaW50IGlzIGVuY291bnRlcmVkLgorCitsKGlzdCkgW2ZpcnN0IFssbGFzdF1dCisgICAgICAgIExpc3Qgc291cmNlIGNvZGUgZm9yIHRoZSBjdXJyZW50IGZpbGUuCisgICAgICAgIFdpdGhvdXQgYXJndW1lbnRzLCBsaXN0IDExIGxpbmVzIGFyb3VuZCB0aGUgY3VycmVudCBsaW5lCisgICAgICAgIG9yIGNvbnRpbnVlIHRoZSBwcmV2aW91cyBsaXN0aW5nLgorICAgICAgICBXaXRoIG9uZSBhcmd1bWVudCwgbGlzdCAxMSBsaW5lcyBzdGFydGluZyBhdCB0aGF0IGxpbmUuCisgICAgICAgIFdpdGggdHdvIGFyZ3VtZW50cywgbGlzdCB0aGUgZ2l2ZW4gcmFuZ2U7CisgICAgICAgIGlmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHRoZSBmaXJzdCwgaXQgaXMgYSBjb3VudC4KKworYShyZ3MpCisgICAgICAgIFByaW50IHRoZSBhcmd1bWVudCBsaXN0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorCitwIGV4cHJlc3Npb24KKyAgICAgICAgUHJpbnQgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLgorCisoISkgc3RhdGVtZW50CisgICAgICAgIEV4ZWN1dGUgdGhlIChvbmUtbGluZSkgc3RhdGVtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50CisgICAgICAgIHN0YWNrIGZyYW1lLiAgVGhlIGV4Y2xhbWF0aW9uIHBvaW50IGNhbiBiZSBvbWl0dGVkIHVubGVzcyB0aGUKKyAgICAgICAgZmlyc3Qgd29yZCBvZiB0aGUgc3RhdGVtZW50IHJlc2VtYmxlcyBhIGRlYnVnZ2VyIGNvbW1hbmQuICBUbworICAgICAgICBhc3NpZ24gdG8gYSBnbG9iYWwgdmFyaWFibGUgeW91IG11c3QgYWx3YXlzIHByZWZpeCB0aGUgY29tbWFuZAorICAgICAgICB3aXRoIGEgJ2dsb2JhbCcgY29tbWFuZCwgZS5nLjoKKyAgICAgICAgKFBkYikgZ2xvYmFsIGxpc3Rfb3B0aW9uczsgbGlzdF9vcHRpb25zID0gWyctbCddCisgICAgICAgIChQZGIpCisKKword2hhdGlzIGFyZworICAgICAgICAgUHJpbnRzIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudC4KKworYWxpYXMgW25hbWUgW2NvbW1hbmRdXQorICAgICAgICBDcmVhdGVzIGFuIGFsaWFzIGNhbGxlZCAnbmFtZScgdGhhdCBleGVjdXRlcyAnY29tbWFuZCcuICBUaGUKKyAgICAgICAgY29tbWFuZCBtdXN0ICpub3QqIGJlIGVuY2xvc2VkIGluIHF1b3Rlcy4gIFJlcGxhY2VhYmxlCisgICAgICAgIHBhcmFtZXRlcnMgY2FuIGJlIGluZGljYXRlZCBieSAlMSwgJTIsIGFuZCBzbyBvbiwgd2hpbGUgJSogaXMKKyAgICAgICAgcmVwbGFjZWQgYnkgYWxsIHRoZSBwYXJhbWV0ZXJzLiAgSWYgbm8gY29tbWFuZCBpcyBnaXZlbiwgdGhlCisgICAgICAgIGN1cnJlbnQgYWxpYXMgZm9yIG5hbWUgaXMgc2hvd24uIElmIG5vIG5hbWUgaXMgZ2l2ZW4sIGFsbAorICAgICAgICBhbGlhc2VzIGFyZSBsaXN0ZWQuCisKKyAgICAgICAgQWxpYXNlcyBtYXkgYmUgbmVzdGVkIGFuZCBjYW4gY29udGFpbiBhbnl0aGluZyB0aGF0IGNhbiBiZQorICAgICAgICBsZWdhbGx5IHR5cGVkIGF0IHRoZSBwZGIgcHJvbXB0LiAgTm90ZSEgIFlvdSAqY2FuKiBvdmVycmlkZQorICAgICAgICBpbnRlcm5hbCBwZGIgY29tbWFuZHMgd2l0aCBhbGlhc2VzISAgVGhvc2UgaW50ZXJuYWwgY29tbWFuZHMKKyAgICAgICAgYXJlIHRoZW4gaGlkZGVuIHVudGlsIHRoZSBhbGlhcyBpcyByZW1vdmVkLiAgQWxpYXNpbmcgaXMKKyAgICAgICAgcmVjdXJzaXZlbHkgYXBwbGllZCB0byB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgY29tbWFuZCBsaW5lOyBhbGwKKyAgICAgICAgb3RoZXIgd29yZHMgaW4gdGhlIGxpbmUgYXJlIGxlZnQgYWxvbmUuCisKKyAgICAgICAgQXMgYW4gZXhhbXBsZSwgaGVyZSBhcmUgdHdvIHVzZWZ1bCBhbGlhc2VzIChlc3BlY2lhbGx5IHdoZW4KKyAgICAgICAgcGxhY2VkIGluIHRoZSAucGRicmMgZmlsZSk6CisKKyAgICAgICAgI1ByaW50IGluc3RhbmNlIHZhcmlhYmxlcyAodXNhZ2UgInBpIGNsYXNzSW5zdCIpCisgICAgICAgIGFsaWFzIHBpIGZvciBrIGluICUxLl9fZGljdF9fLmtleXMoKTogcHJpbnQgIiUxLiIsaywiPSIsJTEuX19kaWN0X19ba10KKyAgICAgICAgI1ByaW50IGluc3RhbmNlIHZhcmlhYmxlcyBpbiBzZWxmCisgICAgICAgIGFsaWFzIHBzIHBpIHNlbGYKKyAgICAgICAgICAgICAgICAKK3VuYWxpYXMgbmFtZQorICAgICAgICBEZWxldGVzIHRoZSBzcGVjaWZpZWQgYWxpYXMuCisKK3EodWl0KQorICAgICAgICBRdWl0IGZyb20gdGhlIGRlYnVnZ2VyLgorICAgICAgICBUaGUgcHJvZ3JhbSBiZWluZyBleGVjdXRlZCBpcyBhYm9ydGVkLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wZGIucHkgYi9saWIvcHl0aG9uMi43L3BkYi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NDY4ZDNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wZGIucHkKQEAgLTAsMCArMSwxMzM4IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIkEgUHl0aG9uIGRlYnVnZ2VyLiIiIgorCisjIChTZWUgcGRiLmRvYyBmb3IgZG9jdW1lbnRhdGlvbi4pCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBsaW5lY2FjaGUKK2ltcG9ydCBjbWQKK2ltcG9ydCBiZGIKK2Zyb20gcmVwciBpbXBvcnQgUmVwcgoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBwcHJpbnQKK2ltcG9ydCB0cmFjZWJhY2sKKworCitjbGFzcyBSZXN0YXJ0KEV4Y2VwdGlvbik6CisgICAgIiIiQ2F1c2VzIGEgZGVidWdnZXIgdG8gYmUgcmVzdGFydGVkIGZvciB0aGUgZGVidWdnZWQgcHl0aG9uIHByb2dyYW0uIiIiCisgICAgcGFzcworCisjIENyZWF0ZSBhIGN1c3RvbSBzYWZlIFJlcHIgaW5zdGFuY2UgYW5kIGluY3JlYXNlIGl0cyBtYXhzdHJpbmcuCisjIFRoZSBkZWZhdWx0IG9mIDMwIHRydW5jYXRlcyBlcnJvciBtZXNzYWdlcyB0b28gZWFzaWx5LgorX3JlcHIgPSBSZXByKCkKK19yZXByLm1heHN0cmluZyA9IDIwMAorX3NhZmVyZXByID0gX3JlcHIucmVwcgorCitfX2FsbF9fID0gWyJydW4iLCAicG0iLCAiUGRiIiwgInJ1bmV2YWwiLCAicnVuY3R4IiwgInJ1bmNhbGwiLCAic2V0X3RyYWNlIiwKKyAgICAgICAgICAgInBvc3RfbW9ydGVtIiwgImhlbHAiXQorCitkZWYgZmluZF9mdW5jdGlvbihmdW5jbmFtZSwgZmlsZW5hbWUpOgorICAgIGNyZSA9IHJlLmNvbXBpbGUocidkZWZccyslc1xzKlsoXScgJSByZS5lc2NhcGUoZnVuY25hbWUpKQorICAgIHRyeToKKyAgICAgICAgZnAgPSBvcGVuKGZpbGVuYW1lKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorICAgICMgY29uc3VtZXIgb2YgdGhpcyBpbmZvIGV4cGVjdHMgdGhlIGZpcnN0IGxpbmUgdG8gYmUgMQorICAgIGxpbmVubyA9IDEKKyAgICBhbnN3ZXIgPSBOb25lCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGNyZS5tYXRjaChsaW5lKToKKyAgICAgICAgICAgIGFuc3dlciA9IGZ1bmNuYW1lLCBmaWxlbmFtZSwgbGluZW5vCisgICAgICAgICAgICBicmVhaworICAgICAgICBsaW5lbm8gPSBsaW5lbm8gKyAxCisgICAgZnAuY2xvc2UoKQorICAgIHJldHVybiBhbnN3ZXIKKworCisjIEludGVyYWN0aW9uIHByb21wdCBsaW5lIHdpbGwgc2VwYXJhdGUgZmlsZSBhbmQgY2FsbCBpbmZvIGZyb20gY29kZQorIyB0ZXh0IHVzaW5nIHZhbHVlIG9mIGxpbmVfcHJlZml4IHN0cmluZy4gIEEgbmV3bGluZSBhbmQgYXJyb3cgbWF5CisjIGJlIHRvIHlvdXIgbGlraW5nLiAgWW91IGNhbiBzZXQgaXQgb25jZSBwZGIgaXMgaW1wb3J0ZWQgdXNpbmcgdGhlCisjIGNvbW1hbmQgInBkYi5saW5lX3ByZWZpeCA9ICdcbiUgJyIuCisjIGxpbmVfcHJlZml4ID0gJzogJyAgICAjIFVzZSB0aGlzIHRvIGdldCB0aGUgb2xkIHNpdHVhdGlvbiBiYWNrCitsaW5lX3ByZWZpeCA9ICdcbi0+ICcgICAjIFByb2JhYmx5IGEgYmV0dGVyIGRlZmF1bHQKKworY2xhc3MgUGRiKGJkYi5CZGIsIGNtZC5DbWQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbXBsZXRla2V5PSd0YWInLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc2tpcD1Ob25lKToKKyAgICAgICAgYmRiLkJkYi5fX2luaXRfXyhzZWxmLCBza2lwPXNraXApCisgICAgICAgIGNtZC5DbWQuX19pbml0X18oc2VsZiwgY29tcGxldGVrZXksIHN0ZGluLCBzdGRvdXQpCisgICAgICAgIGlmIHN0ZG91dDoKKyAgICAgICAgICAgIHNlbGYudXNlX3Jhd2lucHV0ID0gMAorICAgICAgICBzZWxmLnByb21wdCA9ICcoUGRiKSAnCisgICAgICAgIHNlbGYuYWxpYXNlcyA9IHt9CisgICAgICAgIHNlbGYubWFpbnB5ZmlsZSA9ICcnCisgICAgICAgIHNlbGYuX3dhaXRfZm9yX21haW5weWZpbGUgPSAwCisgICAgICAgICMgVHJ5IHRvIGxvYWQgcmVhZGxpbmUgaWYgaXQgZXhpc3RzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCByZWFkbGluZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBSZWFkICRIT01FLy5wZGJyYyBhbmQgLi8ucGRicmMKKyAgICAgICAgc2VsZi5yY0xpbmVzID0gW10KKyAgICAgICAgaWYgJ0hPTUUnIGluIG9zLmVudmlyb246CisgICAgICAgICAgICBlbnZIb21lID0gb3MuZW52aXJvblsnSE9NRSddCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmNGaWxlID0gb3Blbihvcy5wYXRoLmpvaW4oZW52SG9tZSwgIi5wZGJyYyIpKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiByY0ZpbGUucmVhZGxpbmVzKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmNMaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgICAgICAgICByY0ZpbGUuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByY0ZpbGUgPSBvcGVuKCIucGRicmMiKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHJjRmlsZS5yZWFkbGluZXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLnJjTGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICByY0ZpbGUuY2xvc2UoKQorCisgICAgICAgIHNlbGYuY29tbWFuZHMgPSB7fSAjIGFzc29jaWF0ZXMgYSBjb21tYW5kIGxpc3QgdG8gYnJlYWtwb2ludCBudW1iZXJzCisgICAgICAgIHNlbGYuY29tbWFuZHNfZG9wcm9tcHQgPSB7fSAjIGZvciBlYWNoIGJwIG51bSwgdGVsbHMgaWYgdGhlIHByb21wdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtdXN0IGJlIGRpc3AuIGFmdGVyIGV4ZWNpbmcgdGhlIGNtZCBsaXN0CisgICAgICAgIHNlbGYuY29tbWFuZHNfc2lsZW50ID0ge30gIyBmb3IgZWFjaCBicCBudW0sIHRlbGxzIGlmIHRoZSBzdGFjayB0cmFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbXVzdCBiZSBkaXNwLiBhZnRlciBleGVjaW5nIHRoZSBjbWQgbGlzdAorICAgICAgICBzZWxmLmNvbW1hbmRzX2RlZmluaW5nID0gRmFsc2UgIyBUcnVlIHdoaWxlIGluIHRoZSBwcm9jZXNzIG9mIGRlZmluaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGEgY29tbWFuZCBsaXN0CisgICAgICAgIHNlbGYuY29tbWFuZHNfYm51bSA9IE5vbmUgIyBUaGUgYnJlYWtwb2ludCBudW1iZXIgZm9yIHdoaWNoIHdlIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVmaW5pbmcgYSBsaXN0CisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGJkYi5CZGIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5mb3JnZXQoKQorCisgICAgZGVmIGZvcmdldChzZWxmKToKKyAgICAgICAgc2VsZi5saW5lbm8gPSBOb25lCisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorICAgICAgICBzZWxmLmN1cmluZGV4ID0gMAorICAgICAgICBzZWxmLmN1cmZyYW1lID0gTm9uZQorCisgICAgZGVmIHNldHVwKHNlbGYsIGYsIHQpOgorICAgICAgICBzZWxmLmZvcmdldCgpCisgICAgICAgIHNlbGYuc3RhY2ssIHNlbGYuY3VyaW5kZXggPSBzZWxmLmdldF9zdGFjayhmLCB0KQorICAgICAgICBzZWxmLmN1cmZyYW1lID0gc2VsZi5zdGFja1tzZWxmLmN1cmluZGV4XVswXQorICAgICAgICAjIFRoZSBmX2xvY2FscyBkaWN0aW9uYXJ5IGlzIHVwZGF0ZWQgZnJvbSB0aGUgYWN0dWFsIGZyYW1lCisgICAgICAgICMgbG9jYWxzIHdoZW5ldmVyIHRoZSAuZl9sb2NhbHMgYWNjZXNzb3IgaXMgY2FsbGVkLCBzbyB3ZQorICAgICAgICAjIGNhY2hlIGl0IGhlcmUgdG8gZW5zdXJlIHRoYXQgbW9kaWZpY2F0aW9ucyBhcmUgbm90IG92ZXJ3cml0dGVuLgorICAgICAgICBzZWxmLmN1cmZyYW1lX2xvY2FscyA9IHNlbGYuY3VyZnJhbWUuZl9sb2NhbHMKKyAgICAgICAgc2VsZi5leGVjUmNMaW5lcygpCisKKyAgICAjIENhbiBiZSBleGVjdXRlZCBlYXJsaWVyIHRoYW4gJ3NldHVwJyBpZiBkZXNpcmVkCisgICAgZGVmIGV4ZWNSY0xpbmVzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnJjTGluZXM6CisgICAgICAgICAgICAjIE1ha2UgbG9jYWwgY29weSBiZWNhdXNlIG9mIHJlY3Vyc2lvbgorICAgICAgICAgICAgcmNMaW5lcyA9IHNlbGYucmNMaW5lcworICAgICAgICAgICAgIyBleGVjdXRlZCBvbmx5IG9uY2UKKyAgICAgICAgICAgIHNlbGYucmNMaW5lcyA9IFtdCisgICAgICAgICAgICBmb3IgbGluZSBpbiByY0xpbmVzOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgICAgICAgICBpZiBsZW4obGluZSkgPiAwIGFuZCBsaW5lWzBdICE9ICcjJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5vbmVjbWQobGluZSkKKworICAgICMgT3ZlcnJpZGUgQmRiIG1ldGhvZHMKKworICAgIGRlZiB1c2VyX2NhbGwoc2VsZiwgZnJhbWUsIGFyZ3VtZW50X2xpc3QpOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyB0aGUgcmVtb3RlIHBvc3NpYmlsaXR5CisgICAgICAgIHRoYXQgd2UgZXZlciBuZWVkIHRvIHN0b3AgaW4gdGhpcyBmdW5jdGlvbi4iIiIKKyAgICAgICAgaWYgc2VsZi5fd2FpdF9mb3JfbWFpbnB5ZmlsZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnN0b3BfaGVyZShmcmFtZSk6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnLS1DYWxsLS0nCisgICAgICAgICAgICBzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBOb25lKQorCisgICAgZGVmIHVzZXJfbGluZShzZWxmLCBmcmFtZSk6CisgICAgICAgICIiIlRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2Ugc3RvcCBvciBicmVhayBhdCB0aGlzIGxpbmUuIiIiCisgICAgICAgIGlmIHNlbGYuX3dhaXRfZm9yX21haW5weWZpbGU6CisgICAgICAgICAgICBpZiAoc2VsZi5tYWlucHlmaWxlICE9IHNlbGYuY2Fub25pYyhmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgb3IgZnJhbWUuZl9saW5lbm88PSAwKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuX3dhaXRfZm9yX21haW5weWZpbGUgPSAwCisgICAgICAgIGlmIHNlbGYuYnBfY29tbWFuZHMoZnJhbWUpOgorICAgICAgICAgICAgc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgTm9uZSkKKworICAgIGRlZiBicF9jb21tYW5kcyhzZWxmLGZyYW1lKToKKyAgICAgICAgIiIiQ2FsbCBldmVyeSBjb21tYW5kIHRoYXQgd2FzIHNldCBmb3IgdGhlIGN1cnJlbnQgYWN0aXZlIGJyZWFrcG9pbnQKKyAgICAgICAgKGlmIHRoZXJlIGlzIG9uZSkuCisKKyAgICAgICAgUmV0dXJucyBUcnVlIGlmIHRoZSBub3JtYWwgaW50ZXJhY3Rpb24gZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQsCisgICAgICAgIEZhbHNlIG90aGVyd2lzZS4iIiIKKyAgICAgICAgIyBzZWxmLmN1cnJlbnRicCBpcyBzZXQgaW4gYmRiIGluIEJkYi5icmVha19oZXJlIGlmIGEgYnJlYWtwb2ludCB3YXMgaGl0CisgICAgICAgIGlmIGdldGF0dHIoc2VsZiwgImN1cnJlbnRicCIsIEZhbHNlKSBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50YnAgaW4gc2VsZi5jb21tYW5kczoKKyAgICAgICAgICAgIGN1cnJlbnRicCA9IHNlbGYuY3VycmVudGJwCisgICAgICAgICAgICBzZWxmLmN1cnJlbnRicCA9IDAKKyAgICAgICAgICAgIGxhc3RjbWRfYmFjayA9IHNlbGYubGFzdGNtZAorICAgICAgICAgICAgc2VsZi5zZXR1cChmcmFtZSwgTm9uZSkKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuY29tbWFuZHNbY3VycmVudGJwXToKKyAgICAgICAgICAgICAgICBzZWxmLm9uZWNtZChsaW5lKQorICAgICAgICAgICAgc2VsZi5sYXN0Y21kID0gbGFzdGNtZF9iYWNrCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jb21tYW5kc19zaWxlbnRbY3VycmVudGJwXToKKyAgICAgICAgICAgICAgICBzZWxmLnByaW50X3N0YWNrX2VudHJ5KHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleF0pCisgICAgICAgICAgICBpZiBzZWxmLmNvbW1hbmRzX2RvcHJvbXB0W2N1cnJlbnRicF06CisgICAgICAgICAgICAgICAgc2VsZi5jbWRsb29wKCkKKyAgICAgICAgICAgIHNlbGYuZm9yZ2V0KCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIHVzZXJfcmV0dXJuKHNlbGYsIGZyYW1lLCByZXR1cm5fdmFsdWUpOgorICAgICAgICAiIiJUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcmV0dXJuIHRyYXAgaXMgc2V0IGhlcmUuIiIiCisgICAgICAgIGlmIHNlbGYuX3dhaXRfZm9yX21haW5weWZpbGU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZnJhbWUuZl9sb2NhbHNbJ19fcmV0dXJuX18nXSA9IHJldHVybl92YWx1ZQorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnLS1SZXR1cm4tLScKKyAgICAgICAgc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgTm9uZSkKKworICAgIGRlZiB1c2VyX2V4Y2VwdGlvbihzZWxmLCBmcmFtZSwgZXhjX2luZm8pOgorICAgICAgICAiIiJUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpZiBhbiBleGNlcHRpb24gb2NjdXJzLAorICAgICAgICBidXQgb25seSBpZiB3ZSBhcmUgdG8gc3RvcCBhdCBvciBqdXN0IGJlbG93IHRoaXMgbGV2ZWwuIiIiCisgICAgICAgIGlmIHNlbGYuX3dhaXRfZm9yX21haW5weWZpbGU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RyYWNlYmFjayA9IGV4Y19pbmZvCisgICAgICAgIGZyYW1lLmZfbG9jYWxzWydfX2V4Y2VwdGlvbl9fJ10gPSBleGNfdHlwZSwgZXhjX3ZhbHVlCisgICAgICAgIGlmIHR5cGUoZXhjX3R5cGUpID09IHR5cGUoJycpOgorICAgICAgICAgICAgZXhjX3R5cGVfbmFtZSA9IGV4Y190eXBlCisgICAgICAgIGVsc2U6IGV4Y190eXBlX25hbWUgPSBleGNfdHlwZS5fX25hbWVfXworICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCBleGNfdHlwZV9uYW1lICsgJzonLCBfc2FmZXJlcHIoZXhjX3ZhbHVlKQorICAgICAgICBzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBleGNfdHJhY2ViYWNrKQorCisgICAgIyBHZW5lcmFsIGludGVyYWN0aW9uIGZ1bmN0aW9uCisKKyAgICBkZWYgaW50ZXJhY3Rpb24oc2VsZiwgZnJhbWUsIHRyYWNlYmFjayk6CisgICAgICAgIHNlbGYuc2V0dXAoZnJhbWUsIHRyYWNlYmFjaykKKyAgICAgICAgc2VsZi5wcmludF9zdGFja19lbnRyeShzZWxmLnN0YWNrW3NlbGYuY3VyaW5kZXhdKQorICAgICAgICBzZWxmLmNtZGxvb3AoKQorICAgICAgICBzZWxmLmZvcmdldCgpCisKKyAgICBkZWYgZGlzcGxheWhvb2soc2VsZiwgb2JqKToKKyAgICAgICAgIiIiQ3VzdG9tIGRpc3BsYXlob29rIGZvciB0aGUgZXhlYyBpbiBkZWZhdWx0KCksIHdoaWNoIHByZXZlbnRzCisgICAgICAgIGFzc2lnbm1lbnQgb2YgdGhlIF8gdmFyaWFibGUgaW4gdGhlIGJ1aWx0aW5zLgorICAgICAgICAiIiIKKyAgICAgICAgIyByZXByb2R1Y2UgdGhlIGJlaGF2aW9yIG9mIHRoZSBzdGFuZGFyZCBkaXNwbGF5aG9vaywgbm90IHByaW50aW5nIE5vbmUKKyAgICAgICAgaWYgb2JqIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQgcmVwcihvYmopCisKKyAgICBkZWYgZGVmYXVsdChzZWxmLCBsaW5lKToKKyAgICAgICAgaWYgbGluZVs6MV0gPT0gJyEnOiBsaW5lID0gbGluZVsxOl0KKyAgICAgICAgbG9jYWxzID0gc2VsZi5jdXJmcmFtZV9sb2NhbHMKKyAgICAgICAgZ2xvYmFscyA9IHNlbGYuY3VyZnJhbWUuZl9nbG9iYWxzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGxpbmUgKyAnXG4nLCAnPHN0ZGluPicsICdzaW5nbGUnKQorICAgICAgICAgICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICBzYXZlX3N0ZGluID0gc3lzLnN0ZGluCisgICAgICAgICAgICBzYXZlX2Rpc3BsYXlob29rID0gc3lzLmRpc3BsYXlob29rCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGluID0gc2VsZi5zdGRpbgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLnN0ZG91dAorICAgICAgICAgICAgICAgIHN5cy5kaXNwbGF5aG9vayA9IHNlbGYuZGlzcGxheWhvb2sKKyAgICAgICAgICAgICAgICBleGVjIGNvZGUgaW4gZ2xvYmFscywgbG9jYWxzCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlX3N0ZG91dAorICAgICAgICAgICAgICAgIHN5cy5zdGRpbiA9IHNhdmVfc3RkaW4KKyAgICAgICAgICAgICAgICBzeXMuZGlzcGxheWhvb2sgPSBzYXZlX2Rpc3BsYXlob29rCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHQsIHYgPSBzeXMuZXhjX2luZm8oKVs6Ml0KKyAgICAgICAgICAgIGlmIHR5cGUodCkgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICAgICAgZXhjX3R5cGVfbmFtZSA9IHQKKyAgICAgICAgICAgIGVsc2U6IGV4Y190eXBlX25hbWUgPSB0Ll9fbmFtZV9fCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqJywgZXhjX3R5cGVfbmFtZSArICc6JywgdgorCisgICAgZGVmIHByZWNtZChzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiSGFuZGxlIGFsaWFzIGV4cGFuc2lvbiBhbmQgJzs7JyBzZXBhcmF0b3IuIiIiCisgICAgICAgIGlmIG5vdCBsaW5lLnN0cmlwKCk6CisgICAgICAgICAgICByZXR1cm4gbGluZQorICAgICAgICBhcmdzID0gbGluZS5zcGxpdCgpCisgICAgICAgIHdoaWxlIGFyZ3NbMF0gaW4gc2VsZi5hbGlhc2VzOgorICAgICAgICAgICAgbGluZSA9IHNlbGYuYWxpYXNlc1thcmdzWzBdXQorICAgICAgICAgICAgaWkgPSAxCisgICAgICAgICAgICBmb3IgdG1wQXJnIGluIGFyZ3NbMTpdOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoIiUiICsgc3RyKGlpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wQXJnKQorICAgICAgICAgICAgICAgIGlpID0gaWkgKyAxCisgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCIlKiIsICcgJy5qb2luKGFyZ3NbMTpdKSkKKyAgICAgICAgICAgIGFyZ3MgPSBsaW5lLnNwbGl0KCkKKyAgICAgICAgIyBzcGxpdCBpbnRvICc7Oycgc2VwYXJhdGVkIGNvbW1hbmRzCisgICAgICAgICMgdW5sZXNzIGl0J3MgYW4gYWxpYXMgY29tbWFuZAorICAgICAgICBpZiBhcmdzWzBdICE9ICdhbGlhcyc6CisgICAgICAgICAgICBtYXJrZXIgPSBsaW5lLmZpbmQoJzs7JykKKyAgICAgICAgICAgIGlmIG1hcmtlciA+PSAwOgorICAgICAgICAgICAgICAgICMgcXVldWUgdXAgZXZlcnl0aGluZyBhZnRlciBtYXJrZXIKKyAgICAgICAgICAgICAgICBuZXh0ID0gbGluZVttYXJrZXIrMjpdLmxzdHJpcCgpCisgICAgICAgICAgICAgICAgc2VsZi5jbWRxdWV1ZS5hcHBlbmQobmV4dCkKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6bWFya2VyXS5yc3RyaXAoKQorICAgICAgICByZXR1cm4gbGluZQorCisgICAgZGVmIG9uZWNtZChzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiSW50ZXJwcmV0IHRoZSBhcmd1bWVudCBhcyB0aG91Z2ggaXQgaGFkIGJlZW4gdHlwZWQgaW4gcmVzcG9uc2UKKyAgICAgICAgdG8gdGhlIHByb21wdC4KKworICAgICAgICBDaGVja3Mgd2hldGhlciB0aGlzIGxpbmUgaXMgdHlwZWQgYXQgdGhlIG5vcm1hbCBwcm9tcHQgb3IgaW4KKyAgICAgICAgYSBicmVha3BvaW50IGNvbW1hbmQgbGlzdCBkZWZpbml0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuY29tbWFuZHNfZGVmaW5pbmc6CisgICAgICAgICAgICByZXR1cm4gY21kLkNtZC5vbmVjbWQoc2VsZiwgbGluZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZV9jb21tYW5kX2RlZihsaW5lKQorCisgICAgZGVmIGhhbmRsZV9jb21tYW5kX2RlZihzZWxmLGxpbmUpOgorICAgICAgICAiIiJIYW5kbGVzIG9uZSBjb21tYW5kIGxpbmUgZHVyaW5nIGNvbW1hbmQgbGlzdCBkZWZpbml0aW9uLiIiIgorICAgICAgICBjbWQsIGFyZywgbGluZSA9IHNlbGYucGFyc2VsaW5lKGxpbmUpCisgICAgICAgIGlmIG5vdCBjbWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgY21kID09ICdzaWxlbnQnOgorICAgICAgICAgICAgc2VsZi5jb21tYW5kc19zaWxlbnRbc2VsZi5jb21tYW5kc19ibnVtXSA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiAjIGNvbnRpbnVlIHRvIGhhbmRsZSBvdGhlciBjbWQgZGVmIGluIHRoZSBjbWQgbGlzdAorICAgICAgICBlbGlmIGNtZCA9PSAnZW5kJzoKKyAgICAgICAgICAgIHNlbGYuY21kcXVldWUgPSBbXQorICAgICAgICAgICAgcmV0dXJuIDEgIyBlbmQgb2YgY21kIGxpc3QKKyAgICAgICAgY21kbGlzdCA9IHNlbGYuY29tbWFuZHNbc2VsZi5jb21tYW5kc19ibnVtXQorICAgICAgICBpZiBhcmc6CisgICAgICAgICAgICBjbWRsaXN0LmFwcGVuZChjbWQrJyAnK2FyZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZGxpc3QuYXBwZW5kKGNtZCkKKyAgICAgICAgIyBEZXRlcm1pbmUgaWYgd2UgbXVzdCBzdG9wCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKHNlbGYsICdkb18nICsgY21kKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBmdW5jID0gc2VsZi5kZWZhdWx0CisgICAgICAgICMgb25lIG9mIHRoZSByZXN1bWluZyBjb21tYW5kcworICAgICAgICBpZiBmdW5jLmZ1bmNfbmFtZSBpbiBzZWxmLmNvbW1hbmRzX3Jlc3VtaW5nOgorICAgICAgICAgICAgc2VsZi5jb21tYW5kc19kb3Byb21wdFtzZWxmLmNvbW1hbmRzX2JudW1dID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuY21kcXVldWUgPSBbXQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgcmV0dXJuCisKKyAgICAjIENvbW1hbmQgZGVmaW5pdGlvbnMsIGNhbGxlZCBieSBjbWRsb29wKCkKKyAgICAjIFRoZSBhcmd1bWVudCBpcyB0aGUgcmVtYWluaW5nIHN0cmluZyBvbiB0aGUgY29tbWFuZCBsaW5lCisgICAgIyBSZXR1cm4gdHJ1ZSB0byBleGl0IGZyb20gdGhlIGNvbW1hbmQgbG9vcAorCisgICAgZG9faCA9IGNtZC5DbWQuZG9faGVscAorCisgICAgZGVmIGRvX2NvbW1hbmRzKHNlbGYsIGFyZyk6CisgICAgICAgICIiIkRlZmluZXMgYSBsaXN0IG9mIGNvbW1hbmRzIGFzc29jaWF0ZWQgdG8gYSBicmVha3BvaW50LgorCisgICAgICAgIFRob3NlIGNvbW1hbmRzIHdpbGwgYmUgZXhlY3V0ZWQgd2hlbmV2ZXIgdGhlIGJyZWFrcG9pbnQgY2F1c2VzCisgICAgICAgIHRoZSBwcm9ncmFtIHRvIHN0b3AgZXhlY3V0aW9uLiIiIgorICAgICAgICBpZiBub3QgYXJnOgorICAgICAgICAgICAgYm51bSA9IGxlbihiZGIuQnJlYWtwb2ludC5icGJ5bnVtYmVyKS0xCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYm51bSA9IGludChhcmcpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIlVzYWdlIDogY29tbWFuZHMgW2JudW1dXG4gICAgICAgIC4uLiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiAgICAgICAgZW5kIgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmNvbW1hbmRzX2JudW0gPSBibnVtCisgICAgICAgIHNlbGYuY29tbWFuZHNbYm51bV0gPSBbXQorICAgICAgICBzZWxmLmNvbW1hbmRzX2RvcHJvbXB0W2JudW1dID0gVHJ1ZQorICAgICAgICBzZWxmLmNvbW1hbmRzX3NpbGVudFtibnVtXSA9IEZhbHNlCisgICAgICAgIHByb21wdF9iYWNrID0gc2VsZi5wcm9tcHQKKyAgICAgICAgc2VsZi5wcm9tcHQgPSAnKGNvbSkgJworICAgICAgICBzZWxmLmNvbW1hbmRzX2RlZmluaW5nID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNtZGxvb3AoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jb21tYW5kc19kZWZpbmluZyA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLnByb21wdCA9IHByb21wdF9iYWNrCisKKyAgICBkZWYgZG9fYnJlYWsoc2VsZiwgYXJnLCB0ZW1wb3JhcnkgPSAwKToKKyAgICAgICAgIyBicmVhayBbIChbZmlsZW5hbWU6XWxpbmVubyB8IGZ1bmN0aW9uKSBbLCAiY29uZGl0aW9uIl0gXQorICAgICAgICBpZiBub3QgYXJnOgorICAgICAgICAgICAgaWYgc2VsZi5icmVha3M6ICAjIFRoZXJlJ3MgYXQgbGVhc3Qgb25lCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIk51bSBUeXBlICAgICAgICAgRGlzcCBFbmIgICBXaGVyZSIKKyAgICAgICAgICAgICAgICBmb3IgYnAgaW4gYmRiLkJyZWFrcG9pbnQuYnBieW51bWJlcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgYnA6CisgICAgICAgICAgICAgICAgICAgICAgICBicC5icHByaW50KHNlbGYuc3Rkb3V0KQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgcGFyc2UgYXJndW1lbnRzOyBjb21tYSBoYXMgbG93ZXN0IHByZWNlZGVuY2UKKyAgICAgICAgIyBhbmQgY2Fubm90IG9jY3VyIGluIGZpbGVuYW1lCisgICAgICAgIGZpbGVuYW1lID0gTm9uZQorICAgICAgICBsaW5lbm8gPSBOb25lCisgICAgICAgIGNvbmQgPSBOb25lCisgICAgICAgIGNvbW1hID0gYXJnLmZpbmQoJywnKQorICAgICAgICBpZiBjb21tYSA+IDA6CisgICAgICAgICAgICAjIHBhcnNlIHN0dWZmIGFmdGVyIGNvbW1hOiAiY29uZGl0aW9uIgorICAgICAgICAgICAgY29uZCA9IGFyZ1tjb21tYSsxOl0ubHN0cmlwKCkKKyAgICAgICAgICAgIGFyZyA9IGFyZ1s6Y29tbWFdLnJzdHJpcCgpCisgICAgICAgICMgcGFyc2Ugc3R1ZmYgYmVmb3JlIGNvbW1hOiBbZmlsZW5hbWU6XWxpbmVubyB8IGZ1bmN0aW9uCisgICAgICAgIGNvbG9uID0gYXJnLnJmaW5kKCc6JykKKyAgICAgICAgZnVuY25hbWUgPSBOb25lCisgICAgICAgIGlmIGNvbG9uID49IDA6CisgICAgICAgICAgICBmaWxlbmFtZSA9IGFyZ1s6Y29sb25dLnJzdHJpcCgpCisgICAgICAgICAgICBmID0gc2VsZi5sb29rdXBtb2R1bGUoZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBub3QgZjoKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqICcsIHJlcHIoZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICdub3QgZm91bmQgZnJvbSBzeXMucGF0aCcKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmCisgICAgICAgICAgICBhcmcgPSBhcmdbY29sb24rMTpdLmxzdHJpcCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGluZW5vID0gaW50KGFyZykKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKiBCYWQgbGluZW5vOicsIGFyZworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBubyBjb2xvbjsgY2FuIGJlIGxpbmVubyBvciBmdW5jdGlvbgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxpbmVubyA9IGludChhcmcpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBldmFsKGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJmcmFtZS5mX2dsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyZnJhbWVfbG9jYWxzKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgZnVuYyA9IGFyZworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihmdW5jLCAnaW1fZnVuYycpOgorICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyA9IGZ1bmMuaW1fZnVuYworICAgICAgICAgICAgICAgICAgICBjb2RlID0gZnVuYy5mdW5jX2NvZGUKKyAgICAgICAgICAgICAgICAgICAgI3VzZSBjb19uYW1lIHRvIGlkZW50aWZ5IHRoZSBia3B0IChmdW5jdGlvbiBuYW1lcworICAgICAgICAgICAgICAgICAgICAjY291bGQgYmUgYWxpYXNlZCwgYnV0IGNvX25hbWUgaXMgaW52YXJpYW50KQorICAgICAgICAgICAgICAgICAgICBmdW5jbmFtZSA9IGNvZGUuY29fbmFtZQorICAgICAgICAgICAgICAgICAgICBsaW5lbm8gPSBjb2RlLmNvX2ZpcnN0bGluZW5vCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gY29kZS5jb19maWxlbmFtZQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgIyBsYXN0IHRoaW5nIHRvIHRyeQorICAgICAgICAgICAgICAgICAgICAob2ssIGZpbGVuYW1lLCBsbikgPSBzZWxmLmxpbmVpbmZvKGFyZykKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKiBUaGUgc3BlY2lmaWVkIG9iamVjdCcsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCByZXByKGFyZyksCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnaXMgbm90IGEgZnVuY3Rpb24nCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnb3Igd2FzIG5vdCBmb3VuZCBhbG9uZyBzeXMucGF0aC4nCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgZnVuY25hbWUgPSBvayAjIG9rIGNvbnRhaW5zIGEgZnVuY3Rpb24gbmFtZQorICAgICAgICAgICAgICAgICAgICBsaW5lbm8gPSBpbnQobG4pCisgICAgICAgIGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5kZWZhdWx0RmlsZSgpCisgICAgICAgICMgQ2hlY2sgZm9yIHJlYXNvbmFibGUgYnJlYWtwb2ludAorICAgICAgICBsaW5lID0gc2VsZi5jaGVja2xpbmUoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICMgbm93IHNldCB0aGUgYnJlYWsgcG9pbnQKKyAgICAgICAgICAgIGVyciA9IHNlbGYuc2V0X2JyZWFrKGZpbGVuYW1lLCBsaW5lLCB0ZW1wb3JhcnksIGNvbmQsIGZ1bmNuYW1lKQorICAgICAgICAgICAgaWYgZXJyOiBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqJywgZXJyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJwID0gc2VsZi5nZXRfYnJlYWtzKGZpbGVuYW1lLCBsaW5lKVstMV0KKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiQnJlYWtwb2ludCAlZCBhdCAlczolZCIgJSAoYnAubnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicC5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicC5saW5lKQorCisgICAgIyBUbyBiZSBvdmVycmlkZGVuIGluIGRlcml2ZWQgZGVidWdnZXJzCisgICAgZGVmIGRlZmF1bHRGaWxlKHNlbGYpOgorICAgICAgICAiIiJQcm9kdWNlIGEgcmVhc29uYWJsZSBkZWZhdWx0LiIiIgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY3VyZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgIGlmIGZpbGVuYW1lID09ICc8c3RyaW5nPicgYW5kIHNlbGYubWFpbnB5ZmlsZToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5tYWlucHlmaWxlCisgICAgICAgIHJldHVybiBmaWxlbmFtZQorCisgICAgZG9fYiA9IGRvX2JyZWFrCisKKyAgICBkZWYgZG9fdGJyZWFrKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuZG9fYnJlYWsoYXJnLCAxKQorCisgICAgZGVmIGxpbmVpbmZvKHNlbGYsIGlkZW50aWZpZXIpOgorICAgICAgICBmYWlsZWQgPSAoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgIyBJbnB1dCBpcyBpZGVudGlmaWVyLCBtYXkgYmUgaW4gc2luZ2xlIHF1b3RlcworICAgICAgICBpZHN0cmluZyA9IGlkZW50aWZpZXIuc3BsaXQoIiciKQorICAgICAgICBpZiBsZW4oaWRzdHJpbmcpID09IDE6CisgICAgICAgICAgICAjIG5vdCBpbiBzaW5nbGUgcXVvdGVzCisgICAgICAgICAgICBpZCA9IGlkc3RyaW5nWzBdLnN0cmlwKCkKKyAgICAgICAgZWxpZiBsZW4oaWRzdHJpbmcpID09IDM6CisgICAgICAgICAgICAjIHF1b3RlZAorICAgICAgICAgICAgaWQgPSBpZHN0cmluZ1sxXS5zdHJpcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZmFpbGVkCisgICAgICAgIGlmIGlkID09ICcnOiByZXR1cm4gZmFpbGVkCisgICAgICAgIHBhcnRzID0gaWQuc3BsaXQoJy4nKQorICAgICAgICAjIFByb3RlY3Rpb24gZm9yIGRlcml2ZWQgZGVidWdnZXJzCisgICAgICAgIGlmIHBhcnRzWzBdID09ICdzZWxmJzoKKyAgICAgICAgICAgIGRlbCBwYXJ0c1swXQorICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWlsZWQKKyAgICAgICAgIyBCZXN0IGZpcnN0IGd1ZXNzIGF0IGZpbGUgdG8gbG9vayBhdAorICAgICAgICBmbmFtZSA9IHNlbGYuZGVmYXVsdEZpbGUoKQorICAgICAgICBpZiBsZW4ocGFydHMpID09IDE6CisgICAgICAgICAgICBpdGVtID0gcGFydHNbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgTW9yZSB0aGFuIG9uZSBwYXJ0LgorICAgICAgICAgICAgIyBGaXJzdCBpcyBtb2R1bGUsIHNlY29uZCBpcyBtZXRob2QvY2xhc3MKKyAgICAgICAgICAgIGYgPSBzZWxmLmxvb2t1cG1vZHVsZShwYXJ0c1swXSkKKyAgICAgICAgICAgIGlmIGY6CisgICAgICAgICAgICAgICAgZm5hbWUgPSBmCisgICAgICAgICAgICBpdGVtID0gcGFydHNbMV0KKyAgICAgICAgYW5zd2VyID0gZmluZF9mdW5jdGlvbihpdGVtLCBmbmFtZSkKKyAgICAgICAgcmV0dXJuIGFuc3dlciBvciBmYWlsZWQKKworICAgIGRlZiBjaGVja2xpbmUoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgICAgICIiIkNoZWNrIHdoZXRoZXIgc3BlY2lmaWVkIGxpbmUgc2VlbXMgdG8gYmUgZXhlY3V0YWJsZS4KKworICAgICAgICBSZXR1cm4gYGxpbmVub2AgaWYgaXQgaXMsIDAgaWYgbm90IChlLmcuIGEgZG9jc3RyaW5nLCBjb21tZW50LCBibGFuaworICAgICAgICBsaW5lIG9yIEVPRikuIFdhcm5pbmc6IHRlc3RpbmcgaXMgbm90IGNvbXByZWhlbnNpdmUuCisgICAgICAgICIiIgorICAgICAgICAjIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsYWJsZSBiZWZvcmUgc3RhcnRpbmcgZGVidWdnaW5nLCBzbyBkZWZhdWx0CisgICAgICAgICMgdG8gIm5vIGdsb2JhbHMiIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgZnJhbWUKKyAgICAgICAgZ2xvYnMgPSBzZWxmLmN1cmZyYW1lLmZfZ2xvYmFscyBpZiBoYXNhdHRyKHNlbGYsICdjdXJmcmFtZScpIGVsc2UgTm9uZQorICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubywgZ2xvYnMpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ0VuZCBvZiBmaWxlJworICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAjIERvbid0IGFsbG93IHNldHRpbmcgYnJlYWtwb2ludCBhdCBhIGJsYW5rIGxpbmUKKyAgICAgICAgaWYgKG5vdCBsaW5lIG9yIChsaW5lWzBdID09ICcjJykgb3IKKyAgICAgICAgICAgICAobGluZVs6M10gPT0gJyIiIicpIG9yIGxpbmVbOjNdID09ICInJyciKToKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKiogQmxhbmsgb3IgY29tbWVudCcKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiBsaW5lbm8KKworICAgIGRlZiBkb19lbmFibGUoc2VsZiwgYXJnKToKKyAgICAgICAgYXJncyA9IGFyZy5zcGxpdCgpCisgICAgICAgIGZvciBpIGluIGFyZ3M6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaSA9IGludChpKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ0JyZWFrcG9pbnQgaW5kZXggJXIgaXMgbm90IGEgbnVtYmVyJyAlIGkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBub3QgKDAgPD0gaSA8IGxlbihiZGIuQnJlYWtwb2ludC5icGJ5bnVtYmVyKSk6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ05vIGJyZWFrcG9pbnQgbnVtYmVyZWQnLCBpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgYnAgPSBiZGIuQnJlYWtwb2ludC5icGJ5bnVtYmVyW2ldCisgICAgICAgICAgICBpZiBicDoKKyAgICAgICAgICAgICAgICBicC5lbmFibGUoKQorCisgICAgZGVmIGRvX2Rpc2FibGUoc2VsZiwgYXJnKToKKyAgICAgICAgYXJncyA9IGFyZy5zcGxpdCgpCisgICAgICAgIGZvciBpIGluIGFyZ3M6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaSA9IGludChpKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ0JyZWFrcG9pbnQgaW5kZXggJXIgaXMgbm90IGEgbnVtYmVyJyAlIGkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBub3QgKDAgPD0gaSA8IGxlbihiZGIuQnJlYWtwb2ludC5icGJ5bnVtYmVyKSk6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ05vIGJyZWFrcG9pbnQgbnVtYmVyZWQnLCBpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgYnAgPSBiZGIuQnJlYWtwb2ludC5icGJ5bnVtYmVyW2ldCisgICAgICAgICAgICBpZiBicDoKKyAgICAgICAgICAgICAgICBicC5kaXNhYmxlKCkKKworICAgIGRlZiBkb19jb25kaXRpb24oc2VsZiwgYXJnKToKKyAgICAgICAgIyBhcmcgaXMgYnJlYWtwb2ludCBudW1iZXIgYW5kIGNvbmRpdGlvbgorICAgICAgICBhcmdzID0gYXJnLnNwbGl0KCcgJywgMSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnBudW0gPSBpbnQoYXJnc1swXS5zdHJpcCgpKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICMgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsIFwKKyAgICAgICAgICAgICAgICAnQnJlYWtwb2ludCBpbmRleCAlciBpcyBub3QgYSBudW1iZXInICUgYXJnc1swXQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbmQgPSBhcmdzWzFdCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGNvbmQgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJwID0gYmRiLkJyZWFrcG9pbnQuYnBieW51bWJlclticG51bV0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnQnJlYWtwb2ludCBpbmRleCAlciBpcyBub3QgdmFsaWQnICUgYXJnc1swXQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGJwOgorICAgICAgICAgICAgYnAuY29uZCA9IGNvbmQKKyAgICAgICAgICAgIGlmIG5vdCBjb25kOgorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICdCcmVha3BvaW50JywgYnBudW0sCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ2lzIG5vdyB1bmNvbmRpdGlvbmFsLicKKworICAgIGRlZiBkb19pZ25vcmUoc2VsZixhcmcpOgorICAgICAgICAiIiJhcmcgaXMgYnAgbnVtYmVyIGZvbGxvd2VkIGJ5IGlnbm9yZSBjb3VudC4iIiIKKyAgICAgICAgYXJncyA9IGFyZy5zcGxpdCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJwbnVtID0gaW50KGFyZ3NbMF0uc3RyaXAoKSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAjIHNvbWV0aGluZyB3ZW50IHdyb25nCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCBcCisgICAgICAgICAgICAgICAgJ0JyZWFrcG9pbnQgaW5kZXggJXIgaXMgbm90IGEgbnVtYmVyJyAlIGFyZ3NbMF0KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb3VudCA9IGludChhcmdzWzFdLnN0cmlwKCkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICB0cnk6CisgICAgICAgICAgICBicCA9IGJkYi5CcmVha3BvaW50LmJwYnludW1iZXJbYnBudW1dCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ0JyZWFrcG9pbnQgaW5kZXggJXIgaXMgbm90IHZhbGlkJyAlIGFyZ3NbMF0KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBicDoKKyAgICAgICAgICAgIGJwLmlnbm9yZSA9IGNvdW50CisgICAgICAgICAgICBpZiBjb3VudCA+IDA6CisgICAgICAgICAgICAgICAgcmVwbHkgPSAnV2lsbCBpZ25vcmUgbmV4dCAnCisgICAgICAgICAgICAgICAgaWYgY291bnQgPiAxOgorICAgICAgICAgICAgICAgICAgICByZXBseSA9IHJlcGx5ICsgJyVkIGNyb3NzaW5ncycgJSBjb3VudAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gcmVwbHkgKyAnMSBjcm9zc2luZycKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCByZXBseSArICcgb2YgYnJlYWtwb2ludCAlZC4nICUgYnBudW0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ1dpbGwgc3RvcCBuZXh0IHRpbWUgYnJlYWtwb2ludCcsCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgYnBudW0sICdpcyByZWFjaGVkLicKKworICAgIGRlZiBkb19jbGVhcihzZWxmLCBhcmcpOgorICAgICAgICAiIiJUaHJlZSBwb3NzaWJpbGl0aWVzLCB0cmllZCBpbiB0aGlzIG9yZGVyOgorICAgICAgICBjbGVhciAtPiBjbGVhciBhbGwgYnJlYWtzLCBhc2sgZm9yIGNvbmZpcm1hdGlvbgorICAgICAgICBjbGVhciBmaWxlOmxpbmVubyAtPiBjbGVhciBhbGwgYnJlYWtzIGF0IGZpbGU6bGluZW5vCisgICAgICAgIGNsZWFyIGJwbm8gYnBubyAuLi4gLT4gY2xlYXIgYnJlYWtwb2ludHMgYnkgbnVtYmVyIiIiCisgICAgICAgIGlmIG5vdCBhcmc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVwbHkgPSByYXdfaW5wdXQoJ0NsZWFyIGFsbCBicmVha3M/ICcpCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgcmVwbHkgPSAnbm8nCisgICAgICAgICAgICByZXBseSA9IHJlcGx5LnN0cmlwKCkubG93ZXIoKQorICAgICAgICAgICAgaWYgcmVwbHkgaW4gKCd5JywgJ3llcycpOgorICAgICAgICAgICAgICAgIHNlbGYuY2xlYXJfYWxsX2JyZWFrcygpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgJzonIGluIGFyZzoKKyAgICAgICAgICAgICMgTWFrZSBzdXJlIGl0IHdvcmtzIGZvciAiY2xlYXIgQzpcZm9vXGJhci5weToxMiIKKyAgICAgICAgICAgIGkgPSBhcmcucmZpbmQoJzonKQorICAgICAgICAgICAgZmlsZW5hbWUgPSBhcmdbOmldCisgICAgICAgICAgICBhcmcgPSBhcmdbaSsxOl0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsaW5lbm8gPSBpbnQoYXJnKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgZXJyID0gIkludmFsaWQgbGluZSBudW1iZXIgKCVzKSIgJSBhcmcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXJyID0gc2VsZi5jbGVhcl9icmVhayhmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgaWYgZXJyOiBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqJywgZXJyCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbnVtYmVybGlzdCA9IGFyZy5zcGxpdCgpCisgICAgICAgIGZvciBpIGluIG51bWJlcmxpc3Q6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaSA9IGludChpKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ0JyZWFrcG9pbnQgaW5kZXggJXIgaXMgbm90IGEgbnVtYmVyJyAlIGkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBub3QgKDAgPD0gaSA8IGxlbihiZGIuQnJlYWtwb2ludC5icGJ5bnVtYmVyKSk6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ05vIGJyZWFrcG9pbnQgbnVtYmVyZWQnLCBpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVyciA9IHNlbGYuY2xlYXJfYnBieW51bWJlcihpKQorICAgICAgICAgICAgaWYgZXJyOgorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKionLCBlcnIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ0RlbGV0ZWQgYnJlYWtwb2ludCcsIGkKKyAgICBkb19jbCA9IGRvX2NsZWFyICMgJ2MnIGlzIGFscmVhZHkgYW4gYWJicmV2aWF0aW9uIGZvciAnY29udGludWUnCisKKyAgICBkZWYgZG9fd2hlcmUoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wcmludF9zdGFja190cmFjZSgpCisgICAgZG9fdyA9IGRvX3doZXJlCisgICAgZG9fYnQgPSBkb193aGVyZQorCisgICAgZGVmIGRvX3VwKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIHNlbGYuY3VyaW5kZXggPT0gMDoKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKiogT2xkZXN0IGZyYW1lJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jdXJpbmRleCA9IHNlbGYuY3VyaW5kZXggLSAxCisgICAgICAgICAgICBzZWxmLmN1cmZyYW1lID0gc2VsZi5zdGFja1tzZWxmLmN1cmluZGV4XVswXQorICAgICAgICAgICAgc2VsZi5jdXJmcmFtZV9sb2NhbHMgPSBzZWxmLmN1cmZyYW1lLmZfbG9jYWxzCisgICAgICAgICAgICBzZWxmLnByaW50X3N0YWNrX2VudHJ5KHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleF0pCisgICAgICAgICAgICBzZWxmLmxpbmVubyA9IE5vbmUKKyAgICBkb191ID0gZG9fdXAKKworICAgIGRlZiBkb19kb3duKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIHNlbGYuY3VyaW5kZXggKyAxID09IGxlbihzZWxmLnN0YWNrKToKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKiogTmV3ZXN0IGZyYW1lJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jdXJpbmRleCA9IHNlbGYuY3VyaW5kZXggKyAxCisgICAgICAgICAgICBzZWxmLmN1cmZyYW1lID0gc2VsZi5zdGFja1tzZWxmLmN1cmluZGV4XVswXQorICAgICAgICAgICAgc2VsZi5jdXJmcmFtZV9sb2NhbHMgPSBzZWxmLmN1cmZyYW1lLmZfbG9jYWxzCisgICAgICAgICAgICBzZWxmLnByaW50X3N0YWNrX2VudHJ5KHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleF0pCisgICAgICAgICAgICBzZWxmLmxpbmVubyA9IE5vbmUKKyAgICBkb19kID0gZG9fZG93bgorCisgICAgZGVmIGRvX3VudGlsKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuc2V0X3VudGlsKHNlbGYuY3VyZnJhbWUpCisgICAgICAgIHJldHVybiAxCisgICAgZG9fdW50ID0gZG9fdW50aWwKKworICAgIGRlZiBkb19zdGVwKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuc2V0X3N0ZXAoKQorICAgICAgICByZXR1cm4gMQorICAgIGRvX3MgPSBkb19zdGVwCisKKyAgICBkZWYgZG9fbmV4dChzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnNldF9uZXh0KHNlbGYuY3VyZnJhbWUpCisgICAgICAgIHJldHVybiAxCisgICAgZG9fbiA9IGRvX25leHQKKworICAgIGRlZiBkb19ydW4oc2VsZiwgYXJnKToKKyAgICAgICAgIiIiUmVzdGFydCBwcm9ncmFtIGJ5IHJhaXNpbmcgYW4gZXhjZXB0aW9uIHRvIGJlIGNhdWdodCBpbiB0aGUgbWFpbgorICAgICAgICBkZWJ1Z2dlciBsb29wLiAgSWYgYXJndW1lbnRzIHdlcmUgZ2l2ZW4sIHNldCB0aGVtIGluIHN5cy5hcmd2LiIiIgorICAgICAgICBpZiBhcmc6CisgICAgICAgICAgICBpbXBvcnQgc2hsZXgKKyAgICAgICAgICAgIGFyZ3YwID0gc3lzLmFyZ3ZbMDoxXQorICAgICAgICAgICAgc3lzLmFyZ3YgPSBzaGxleC5zcGxpdChhcmcpCisgICAgICAgICAgICBzeXMuYXJndls6MF0gPSBhcmd2MAorICAgICAgICByYWlzZSBSZXN0YXJ0CisKKyAgICBkb19yZXN0YXJ0ID0gZG9fcnVuCisKKyAgICBkZWYgZG9fcmV0dXJuKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuc2V0X3JldHVybihzZWxmLmN1cmZyYW1lKQorICAgICAgICByZXR1cm4gMQorICAgIGRvX3IgPSBkb19yZXR1cm4KKworICAgIGRlZiBkb19jb250aW51ZShzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnNldF9jb250aW51ZSgpCisgICAgICAgIHJldHVybiAxCisgICAgZG9fYyA9IGRvX2NvbnQgPSBkb19jb250aW51ZQorCisgICAgZGVmIGRvX2p1bXAoc2VsZiwgYXJnKToKKyAgICAgICAgaWYgc2VsZi5jdXJpbmRleCArIDEgIT0gbGVuKHNlbGYuc3RhY2spOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIioqKiBZb3UgY2FuIG9ubHkganVtcCB3aXRoaW4gdGhlIGJvdHRvbSBmcmFtZSIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBhcmcgPSBpbnQoYXJnKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIqKiogVGhlICdqdW1wJyBjb21tYW5kIHJlcXVpcmVzIGEgbGluZSBudW1iZXIuIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgRG8gdGhlIGp1bXAsIGZpeCB1cCBvdXIgY29weSBvZiB0aGUgc3RhY2ssIGFuZCBkaXNwbGF5IHRoZQorICAgICAgICAgICAgICAgICMgbmV3IHBvc2l0aW9uCisgICAgICAgICAgICAgICAgc2VsZi5jdXJmcmFtZS5mX2xpbmVubyA9IGFyZworICAgICAgICAgICAgICAgIHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleF0gPSBzZWxmLnN0YWNrW3NlbGYuY3VyaW5kZXhdWzBdLCBhcmcKKyAgICAgICAgICAgICAgICBzZWxmLnByaW50X3N0YWNrX2VudHJ5KHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleF0pCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqIEp1bXAgZmFpbGVkOicsIGUKKyAgICBkb19qID0gZG9fanVtcAorCisgICAgZGVmIGRvX2RlYnVnKHNlbGYsIGFyZyk6CisgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorICAgICAgICBnbG9iYWxzID0gc2VsZi5jdXJmcmFtZS5mX2dsb2JhbHMKKyAgICAgICAgbG9jYWxzID0gc2VsZi5jdXJmcmFtZV9sb2NhbHMKKyAgICAgICAgcCA9IFBkYihzZWxmLmNvbXBsZXRla2V5LCBzZWxmLnN0ZGluLCBzZWxmLnN0ZG91dCkKKyAgICAgICAgcC5wcm9tcHQgPSAiKCVzKSAiICUgc2VsZi5wcm9tcHQuc3RyaXAoKQorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiRU5URVJJTkcgUkVDVVJTSVZFIERFQlVHR0VSIgorICAgICAgICBzeXMuY2FsbF90cmFjaW5nKHAucnVuLCAoYXJnLCBnbG9iYWxzLCBsb2NhbHMpKQorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiTEVBVklORyBSRUNVUlNJVkUgREVCVUdHRVIiCisgICAgICAgIHN5cy5zZXR0cmFjZShzZWxmLnRyYWNlX2Rpc3BhdGNoKQorICAgICAgICBzZWxmLmxhc3RjbWQgPSBwLmxhc3RjbWQKKworICAgIGRlZiBkb19xdWl0KHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuX3VzZXJfcmVxdWVzdGVkX3F1aXQgPSAxCisgICAgICAgIHNlbGYuc2V0X3F1aXQoKQorICAgICAgICByZXR1cm4gMQorCisgICAgZG9fcSA9IGRvX3F1aXQKKyAgICBkb19leGl0ID0gZG9fcXVpdAorCisgICAgZGVmIGRvX0VPRihzZWxmLCBhcmcpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0CisgICAgICAgIHNlbGYuX3VzZXJfcmVxdWVzdGVkX3F1aXQgPSAxCisgICAgICAgIHNlbGYuc2V0X3F1aXQoKQorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIGRvX2FyZ3Moc2VsZiwgYXJnKToKKyAgICAgICAgY28gPSBzZWxmLmN1cmZyYW1lLmZfY29kZQorICAgICAgICBkaWN0ID0gc2VsZi5jdXJmcmFtZV9sb2NhbHMKKyAgICAgICAgbiA9IGNvLmNvX2FyZ2NvdW50CisgICAgICAgIGlmIGNvLmNvX2ZsYWdzICYgNDogbiA9IG4rMQorICAgICAgICBpZiBjby5jb19mbGFncyAmIDg6IG4gPSBuKzEKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CisgICAgICAgICAgICBuYW1lID0gY28uY29fdmFybmFtZXNbaV0KKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsIG5hbWUsICc9JywKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gZGljdDogcHJpbnQgPj5zZWxmLnN0ZG91dCwgZGljdFtuYW1lXQorICAgICAgICAgICAgZWxzZTogcHJpbnQgPj5zZWxmLnN0ZG91dCwgIioqKiB1bmRlZmluZWQgKioqIgorICAgIGRvX2EgPSBkb19hcmdzCisKKyAgICBkZWYgZG9fcmV0dmFsKHNlbGYsIGFyZyk6CisgICAgICAgIGlmICdfX3JldHVybl9fJyBpbiBzZWxmLmN1cmZyYW1lX2xvY2FsczoKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsIHNlbGYuY3VyZnJhbWVfbG9jYWxzWydfX3JldHVybl9fJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKiogTm90IHlldCByZXR1cm5lZCEnCisgICAgZG9fcnYgPSBkb19yZXR2YWwKKworICAgIGRlZiBfZ2V0dmFsKHNlbGYsIGFyZyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBldmFsKGFyZywgc2VsZi5jdXJmcmFtZS5mX2dsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1cmZyYW1lX2xvY2FscykKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdCwgdiA9IHN5cy5leGNfaW5mbygpWzoyXQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0LCBzdHIpOgorICAgICAgICAgICAgICAgIGV4Y190eXBlX25hbWUgPSB0CisgICAgICAgICAgICBlbHNlOiBleGNfdHlwZV9uYW1lID0gdC5fX25hbWVfXworICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKicsIGV4Y190eXBlX25hbWUgKyAnOicsIHJlcHIodikKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgZG9fcChzZWxmLCBhcmcpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCByZXByKHNlbGYuX2dldHZhbChhcmcpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgZG9fcHAoc2VsZiwgYXJnKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHByaW50LnBwcmludChzZWxmLl9nZXR2YWwoYXJnKSwgc2VsZi5zdGRvdXQpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBkb19saXN0KHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYubGFzdGNtZCA9ICdsaXN0JworICAgICAgICBsYXN0ID0gTm9uZQorICAgICAgICBpZiBhcmc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeCA9IGV2YWwoYXJnLCB7fSwge30pCisgICAgICAgICAgICAgICAgaWYgdHlwZSh4KSA9PSB0eXBlKCgpKToKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QsIGxhc3QgPSB4CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gaW50KGZpcnN0KQorICAgICAgICAgICAgICAgICAgICBsYXN0ID0gaW50KGxhc3QpCisgICAgICAgICAgICAgICAgICAgIGlmIGxhc3QgPCBmaXJzdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQXNzdW1lIGl0J3MgYSBjb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGZpcnN0ICsgbGFzdAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gbWF4KDEsIGludCh4KSAtIDUpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKiBFcnJvciBpbiBhcmd1bWVudDonLCByZXByKGFyZykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiBzZWxmLmxpbmVubyBpcyBOb25lOgorICAgICAgICAgICAgZmlyc3QgPSBtYXgoMSwgc2VsZi5jdXJmcmFtZS5mX2xpbmVubyAtIDUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaXJzdCA9IHNlbGYubGluZW5vICsgMQorICAgICAgICBpZiBsYXN0IGlzIE5vbmU6CisgICAgICAgICAgICBsYXN0ID0gZmlyc3QgKyAxMAorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY3VyZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgIGJyZWFrbGlzdCA9IHNlbGYuZ2V0X2ZpbGVfYnJlYWtzKGZpbGVuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbGluZW5vIGluIHJhbmdlKGZpcnN0LCBsYXN0KzEpOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1cmZyYW1lLmZfZ2xvYmFscykKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ1tFT0ZdJworICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHMgPSByZXByKGxpbmVubykucmp1c3QoMykKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHMpIDwgNDogcyA9IHMgKyAnICcKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZW5vIGluIGJyZWFrbGlzdDogcyA9IHMgKyAnQicKKyAgICAgICAgICAgICAgICAgICAgZWxzZTogcyA9IHMgKyAnICcKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZW5vID09IHNlbGYuY3VyZnJhbWUuZl9saW5lbm86CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gcyArICctPicKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgcyArICdcdCcgKyBsaW5lLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBwYXNzCisgICAgZG9fbCA9IGRvX2xpc3QKKworICAgIGRlZiBkb193aGF0aXMoc2VsZiwgYXJnKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBldmFsKGFyZywgc2VsZi5jdXJmcmFtZS5mX2dsb2JhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJmcmFtZV9sb2NhbHMpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHQsIHYgPSBzeXMuZXhjX2luZm8oKVs6Ml0KKyAgICAgICAgICAgIGlmIHR5cGUodCkgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICAgICAgZXhjX3R5cGVfbmFtZSA9IHQKKyAgICAgICAgICAgIGVsc2U6IGV4Y190eXBlX25hbWUgPSB0Ll9fbmFtZV9fCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqJywgZXhjX3R5cGVfbmFtZSArICc6JywgcmVwcih2KQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGNvZGUgPSBOb25lCisgICAgICAgICMgSXMgaXQgYSBmdW5jdGlvbj8KKyAgICAgICAgdHJ5OiBjb2RlID0gdmFsdWUuZnVuY19jb2RlCisgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICBpZiBjb2RlOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ0Z1bmN0aW9uJywgY29kZS5jb19uYW1lCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBJcyBpdCBhbiBpbnN0YW5jZSBtZXRob2Q/CisgICAgICAgIHRyeTogY29kZSA9IHZhbHVlLmltX2Z1bmMuZnVuY19jb2RlCisgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICBpZiBjb2RlOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ01ldGhvZCcsIGNvZGUuY29fbmFtZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgTm9uZSBvZiB0aGUgYWJvdmUuLi4KKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgdHlwZSh2YWx1ZSkKKworICAgIGRlZiBkb19hbGlhcyhzZWxmLCBhcmcpOgorICAgICAgICBhcmdzID0gYXJnLnNwbGl0KCkKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDA6CisgICAgICAgICAgICBrZXlzID0gc2VsZi5hbGlhc2VzLmtleXMoKQorICAgICAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgICAgIGZvciBhbGlhcyBpbiBrZXlzOgorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIlcyA9ICVzIiAlIChhbGlhcywgc2VsZi5hbGlhc2VzW2FsaWFzXSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBhcmdzWzBdIGluIHNlbGYuYWxpYXNlcyBhbmQgbGVuKGFyZ3MpID09IDE6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiJXMgPSAlcyIgJSAoYXJnc1swXSwgc2VsZi5hbGlhc2VzW2FyZ3NbMF1dKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hbGlhc2VzW2FyZ3NbMF1dID0gJyAnLmpvaW4oYXJnc1sxOl0pCisKKyAgICBkZWYgZG9fdW5hbGlhcyhzZWxmLCBhcmcpOgorICAgICAgICBhcmdzID0gYXJnLnNwbGl0KCkKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDA6IHJldHVybgorICAgICAgICBpZiBhcmdzWzBdIGluIHNlbGYuYWxpYXNlczoKKyAgICAgICAgICAgIGRlbCBzZWxmLmFsaWFzZXNbYXJnc1swXV0KKworICAgICNsaXN0IG9mIGFsbCB0aGUgY29tbWFuZHMgbWFraW5nIHRoZSBwcm9ncmFtIHJlc3VtZSBleGVjdXRpb24uCisgICAgY29tbWFuZHNfcmVzdW1pbmcgPSBbJ2RvX2NvbnRpbnVlJywgJ2RvX3N0ZXAnLCAnZG9fbmV4dCcsICdkb19yZXR1cm4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICdkb19xdWl0JywgJ2RvX2p1bXAnXQorCisgICAgIyBQcmludCBhIHRyYWNlYmFjayBzdGFydGluZyBhdCB0aGUgdG9wIHN0YWNrIGZyYW1lLgorICAgICMgVGhlIG1vc3QgcmVjZW50bHkgZW50ZXJlZCBmcmFtZSBpcyBwcmludGVkIGxhc3Q7CisgICAgIyB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIGRieCBhbmQgZ2RiLCBidXQgY29uc2lzdGVudCB3aXRoCisgICAgIyB0aGUgUHl0aG9uIGludGVycHJldGVyJ3Mgc3RhY2sgdHJhY2UuCisgICAgIyBJdCBpcyBhbHNvIGNvbnNpc3RlbnQgd2l0aCB0aGUgdXAvZG93biBjb21tYW5kcyAod2hpY2ggYXJlCisgICAgIyBjb21wYXRpYmxlIHdpdGggZGJ4IGFuZCBnZGI6IHVwIG1vdmVzIHRvd2FyZHMgJ21haW4oKScKKyAgICAjIGFuZCBkb3duIG1vdmVzIHRvd2FyZHMgdGhlIG1vc3QgcmVjZW50IHN0YWNrIGZyYW1lKS4KKworICAgIGRlZiBwcmludF9zdGFja190cmFjZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGZyYW1lX2xpbmVubyBpbiBzZWxmLnN0YWNrOgorICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfc3RhY2tfZW50cnkoZnJhbWVfbGluZW5vKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgcHJpbnRfc3RhY2tfZW50cnkoc2VsZiwgZnJhbWVfbGluZW5vLCBwcm9tcHRfcHJlZml4PWxpbmVfcHJlZml4KToKKyAgICAgICAgZnJhbWUsIGxpbmVubyA9IGZyYW1lX2xpbmVubworICAgICAgICBpZiBmcmFtZSBpcyBzZWxmLmN1cmZyYW1lOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJz4nLAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyAnLAorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCBzZWxmLmZvcm1hdF9zdGFja19lbnRyeShmcmFtZV9saW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdF9wcmVmaXgpCisKKworICAgICMgSGVscCBtZXRob2RzIChkZXJpdmVkIGZyb20gcGRiLmRvYykKKworICAgIGRlZiBoZWxwX2hlbHAoc2VsZik6CisgICAgICAgIHNlbGYuaGVscF9oKCkKKworICAgIGRlZiBoZWxwX2goc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImgoZWxwKQorV2l0aG91dCBhcmd1bWVudCwgcHJpbnQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLgorV2l0aCBhIGNvbW1hbmQgbmFtZSBhcyBhcmd1bWVudCwgcHJpbnQgaGVscCBhYm91dCB0aGF0IGNvbW1hbmQKKyJoZWxwIHBkYiIgcGlwZXMgdGhlIGZ1bGwgZG9jdW1lbnRhdGlvbiBmaWxlIHRvIHRoZSAkUEFHRVIKKyJoZWxwIGV4ZWMiIGdpdmVzIGhlbHAgb24gdGhlICEgY29tbWFuZCIiIgorCisgICAgZGVmIGhlbHBfd2hlcmUoc2VsZik6CisgICAgICAgIHNlbGYuaGVscF93KCkKKworICAgIGRlZiBoZWxwX3coc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiIncoaGVyZSkKK1ByaW50IGEgc3RhY2sgdHJhY2UsIHdpdGggdGhlIG1vc3QgcmVjZW50IGZyYW1lIGF0IHRoZSBib3R0b20uCitBbiBhcnJvdyBpbmRpY2F0ZXMgdGhlICJjdXJyZW50IGZyYW1lIiwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUKK2NvbnRleHQgb2YgbW9zdCBjb21tYW5kcy4gICdidCcgaXMgYW4gYWxpYXMgZm9yIHRoaXMgY29tbWFuZC4iIiIKKworICAgIGhlbHBfYnQgPSBoZWxwX3cKKworICAgIGRlZiBoZWxwX2Rvd24oc2VsZik6CisgICAgICAgIHNlbGYuaGVscF9kKCkKKworICAgIGRlZiBoZWxwX2Qoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImQob3duKQorTW92ZSB0aGUgY3VycmVudCBmcmFtZSBvbmUgbGV2ZWwgZG93biBpbiB0aGUgc3RhY2sgdHJhY2UKKyh0byBhIG5ld2VyIGZyYW1lKS4iIiIKKworICAgIGRlZiBoZWxwX3VwKHNlbGYpOgorICAgICAgICBzZWxmLmhlbHBfdSgpCisKKyAgICBkZWYgaGVscF91KHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJ1KHApCitNb3ZlIHRoZSBjdXJyZW50IGZyYW1lIG9uZSBsZXZlbCB1cCBpbiB0aGUgc3RhY2sgdHJhY2UKKyh0byBhbiBvbGRlciBmcmFtZSkuIiIiCisKKyAgICBkZWYgaGVscF9icmVhayhzZWxmKToKKyAgICAgICAgc2VsZi5oZWxwX2IoKQorCisgICAgZGVmIGhlbHBfYihzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiYihyZWFrKSAoW2ZpbGU6XWxpbmVubyB8IGZ1bmN0aW9uKSBbLCBjb25kaXRpb25dCitXaXRoIGEgbGluZSBudW1iZXIgYXJndW1lbnQsIHNldCBhIGJyZWFrIHRoZXJlIGluIHRoZSBjdXJyZW50CitmaWxlLiAgV2l0aCBhIGZ1bmN0aW9uIG5hbWUsIHNldCBhIGJyZWFrIGF0IGZpcnN0IGV4ZWN1dGFibGUgbGluZQorb2YgdGhhdCBmdW5jdGlvbi4gIFdpdGhvdXQgYXJndW1lbnQsIGxpc3QgYWxsIGJyZWFrcy4gIElmIGEgc2Vjb25kCithcmd1bWVudCBpcyBwcmVzZW50LCBpdCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIGFuIGV4cHJlc3Npb24KK3doaWNoIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUgdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC4KKworVGhlIGxpbmUgbnVtYmVyIG1heSBiZSBwcmVmaXhlZCB3aXRoIGEgZmlsZW5hbWUgYW5kIGEgY29sb24sCit0byBzcGVjaWZ5IGEgYnJlYWtwb2ludCBpbiBhbm90aGVyIGZpbGUgKHByb2JhYmx5IG9uZSB0aGF0CitoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0KS4gIFRoZSBmaWxlIGlzIHNlYXJjaGVkIGZvciBvbiBzeXMucGF0aDsKK3RoZSAucHkgc3VmZml4IG1heSBiZSBvbWl0dGVkLiIiIgorCisgICAgZGVmIGhlbHBfY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYuaGVscF9jbCgpCisKKyAgICBkZWYgaGVscF9jbChzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgImNsKGVhcikgZmlsZW5hbWU6bGluZW5vIgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJjbChlYXIpIFticG51bWJlciBbYnBudW1iZXIuLi5dXQorV2l0aCBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGJyZWFrcG9pbnQgbnVtYmVycywgY2xlYXIKK3Rob3NlIGJyZWFrcG9pbnRzLiAgV2l0aG91dCBhcmd1bWVudCwgY2xlYXIgYWxsIGJyZWFrcyAoYnV0CitmaXJzdCBhc2sgY29uZmlybWF0aW9uKS4gIFdpdGggYSBmaWxlbmFtZTpsaW5lbm8gYXJndW1lbnQsCitjbGVhciBhbGwgYnJlYWtzIGF0IHRoYXQgbGluZSBpbiB0aGF0IGZpbGUuCisKK05vdGUgdGhhdCB0aGUgYXJndW1lbnQgaXMgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgdmVyc2lvbnMgb2YKK3RoZSBkZWJ1Z2dlciAoaW4gcHl0aG9uIGRpc3RyaWJ1dGlvbnMgMS41LjEgYW5kIGJlZm9yZSkgd2hlcmUKK2EgbGluZW51bWJlciB3YXMgdXNlZCBpbnN0ZWFkIG9mIGVpdGhlciBmaWxlbmFtZTpsaW5lbm8gb3IKK2JyZWFrcG9pbnQgbnVtYmVycy4iIiIKKworICAgIGRlZiBoZWxwX3RicmVhayhzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIidGJyZWFrICBzYW1lIGFyZ3VtZW50cyBhcyBicmVhaywgYnV0IGJyZWFrcG9pbnQKK2lzIHJlbW92ZWQgd2hlbiBmaXJzdCBoaXQuIiIiCisKKyAgICBkZWYgaGVscF9lbmFibGUoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImVuYWJsZSBicG51bWJlciBbYnBudW1iZXIgLi4uXQorRW5hYmxlcyB0aGUgYnJlYWtwb2ludHMgZ2l2ZW4gYXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZgorYnAgbnVtYmVycy4iIiIKKworICAgIGRlZiBoZWxwX2Rpc2FibGUoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImRpc2FibGUgYnBudW1iZXIgW2JwbnVtYmVyIC4uLl0KK0Rpc2FibGVzIHRoZSBicmVha3BvaW50cyBnaXZlbiBhcyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mCiticCBudW1iZXJzLiIiIgorCisgICAgZGVmIGhlbHBfaWdub3JlKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJpZ25vcmUgYnBudW1iZXIgY291bnQKK1NldHMgdGhlIGlnbm9yZSBjb3VudCBmb3IgdGhlIGdpdmVuIGJyZWFrcG9pbnQgbnVtYmVyLiAgQSBicmVha3BvaW50CitiZWNvbWVzIGFjdGl2ZSB3aGVuIHRoZSBpZ25vcmUgY291bnQgaXMgemVyby4gIFdoZW4gbm9uLXplcm8sIHRoZQorY291bnQgaXMgZGVjcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBicmVha3BvaW50IGlzIHJlYWNoZWQgYW5kIHRoZQorYnJlYWtwb2ludCBpcyBub3QgZGlzYWJsZWQgYW5kIGFueSBhc3NvY2lhdGVkIGNvbmRpdGlvbiBldmFsdWF0ZXMKK3RvIHRydWUuIiIiCisKKyAgICBkZWYgaGVscF9jb25kaXRpb24oc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImNvbmRpdGlvbiBicG51bWJlciBzdHJfY29uZGl0aW9uCitzdHJfY29uZGl0aW9uIGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgYW4gZXhwcmVzc2lvbiB3aGljaAorbXVzdCBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgYnJlYWtwb2ludCBpcyBob25vcmVkLgorSWYgc3RyX2NvbmRpdGlvbiBpcyBhYnNlbnQsIGFueSBleGlzdGluZyBjb25kaXRpb24gaXMgcmVtb3ZlZDsKK2kuZS4sIHRoZSBicmVha3BvaW50IGlzIG1hZGUgdW5jb25kaXRpb25hbC4iIiIKKworICAgIGRlZiBoZWxwX3N0ZXAoc2VsZik6CisgICAgICAgIHNlbGYuaGVscF9zKCkKKworICAgIGRlZiBoZWxwX3Moc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiInModGVwKQorRXhlY3V0ZSB0aGUgY3VycmVudCBsaW5lLCBzdG9wIGF0IHRoZSBmaXJzdCBwb3NzaWJsZSBvY2Nhc2lvbgorKGVpdGhlciBpbiBhIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIG9yIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uKS4iIiIKKworICAgIGRlZiBoZWxwX3VudGlsKHNlbGYpOgorICAgICAgICBzZWxmLmhlbHBfdW50KCkKKworICAgIGRlZiBoZWxwX3VudChzZWxmKToKKyAgICAgICAgcHJpbnQgIiIidW50KGlsKQorQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBsaW5lIHdpdGggYSBudW1iZXIgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50CitvbmUgaXMgcmVhY2hlZCBvciB1bnRpbCB0aGUgY3VycmVudCBmcmFtZSByZXR1cm5zIiIiCisKKyAgICBkZWYgaGVscF9uZXh0KHNlbGYpOgorICAgICAgICBzZWxmLmhlbHBfbigpCisKKyAgICBkZWYgaGVscF9uKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJuKGV4dCkKK0NvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbmV4dCBsaW5lIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uCitpcyByZWFjaGVkIG9yIGl0IHJldHVybnMuIiIiCisKKyAgICBkZWYgaGVscF9yZXR1cm4oc2VsZik6CisgICAgICAgIHNlbGYuaGVscF9yKCkKKworICAgIGRlZiBoZWxwX3Ioc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiInIoZXR1cm4pCitDb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIGN1cnJlbnQgZnVuY3Rpb24gcmV0dXJucy4iIiIKKworICAgIGRlZiBoZWxwX2NvbnRpbnVlKHNlbGYpOgorICAgICAgICBzZWxmLmhlbHBfYygpCisKKyAgICBkZWYgaGVscF9jb250KHNlbGYpOgorICAgICAgICBzZWxmLmhlbHBfYygpCisKKyAgICBkZWYgaGVscF9jKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJjKG9udChpbnVlKSkKK0NvbnRpbnVlIGV4ZWN1dGlvbiwgb25seSBzdG9wIHdoZW4gYSBicmVha3BvaW50IGlzIGVuY291bnRlcmVkLiIiIgorCisgICAgZGVmIGhlbHBfanVtcChzZWxmKToKKyAgICAgICAgc2VsZi5oZWxwX2ooKQorCisgICAgZGVmIGhlbHBfaihzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiaih1bXApIGxpbmVubworU2V0IHRoZSBuZXh0IGxpbmUgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkLiIiIgorCisgICAgZGVmIGhlbHBfZGVidWcoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImRlYnVnIGNvZGUKK0VudGVyIGEgcmVjdXJzaXZlIGRlYnVnZ2VyIHRoYXQgc3RlcHMgdGhyb3VnaCB0aGUgY29kZSBhcmd1bWVudAorKHdoaWNoIGlzIGFuIGFyYml0cmFyeSBleHByZXNzaW9uIG9yIHN0YXRlbWVudCB0byBiZSBleGVjdXRlZAoraW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQpLiIiIgorCisgICAgZGVmIGhlbHBfbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5oZWxwX2woKQorCisgICAgZGVmIGhlbHBfbChzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIibChpc3QpIFtmaXJzdCBbLGxhc3RdXQorTGlzdCBzb3VyY2UgY29kZSBmb3IgdGhlIGN1cnJlbnQgZmlsZS4KK1dpdGhvdXQgYXJndW1lbnRzLCBsaXN0IDExIGxpbmVzIGFyb3VuZCB0aGUgY3VycmVudCBsaW5lCitvciBjb250aW51ZSB0aGUgcHJldmlvdXMgbGlzdGluZy4KK1dpdGggb25lIGFyZ3VtZW50LCBsaXN0IDExIGxpbmVzIHN0YXJ0aW5nIGF0IHRoYXQgbGluZS4KK1dpdGggdHdvIGFyZ3VtZW50cywgbGlzdCB0aGUgZ2l2ZW4gcmFuZ2U7CitpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiB0aGUgZmlyc3QsIGl0IGlzIGEgY291bnQuIiIiCisKKyAgICBkZWYgaGVscF9hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmhlbHBfYSgpCisKKyAgICBkZWYgaGVscF9hKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJhKHJncykKK1ByaW50IHRoZSBhcmd1bWVudHMgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uIiIiCisKKyAgICBkZWYgaGVscF9wKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJwIGV4cHJlc3Npb24KK1ByaW50IHRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4iIiIKKworICAgIGRlZiBoZWxwX3BwKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJwcCBleHByZXNzaW9uCitQcmV0dHktcHJpbnQgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiIiIgorCisgICAgZGVmIGhlbHBfZXhlYyhzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiKCEpIHN0YXRlbWVudAorRXhlY3V0ZSB0aGUgKG9uZS1saW5lKSBzdGF0ZW1lbnQgaW4gdGhlIGNvbnRleHQgb2YKK3RoZSBjdXJyZW50IHN0YWNrIGZyYW1lLgorVGhlIGV4Y2xhbWF0aW9uIHBvaW50IGNhbiBiZSBvbWl0dGVkIHVubGVzcyB0aGUgZmlyc3Qgd29yZAorb2YgdGhlIHN0YXRlbWVudCByZXNlbWJsZXMgYSBkZWJ1Z2dlciBjb21tYW5kLgorVG8gYXNzaWduIHRvIGEgZ2xvYmFsIHZhcmlhYmxlIHlvdSBtdXN0IGFsd2F5cyBwcmVmaXggdGhlCitjb21tYW5kIHdpdGggYSAnZ2xvYmFsJyBjb21tYW5kLCBlLmcuOgorKFBkYikgZ2xvYmFsIGxpc3Rfb3B0aW9uczsgbGlzdF9vcHRpb25zID0gWyctbCddCisoUGRiKSIiIgorCisgICAgZGVmIGhlbHBfcnVuKHNlbGYpOgorICAgICAgICBwcmludCAiIiJydW4gW2FyZ3MuLi5dCitSZXN0YXJ0IHRoZSBkZWJ1Z2dlZCBweXRob24gcHJvZ3JhbS4gSWYgYSBzdHJpbmcgaXMgc3VwcGxpZWQsIGl0IGlzCitzcGxpdHRlZCB3aXRoICJzaGxleCIgYW5kIHRoZSByZXN1bHQgaXMgdXNlZCBhcyB0aGUgbmV3IHN5cy5hcmd2LgorSGlzdG9yeSwgYnJlYWtwb2ludHMsIGFjdGlvbnMgYW5kIGRlYnVnZ2VyIG9wdGlvbnMgYXJlIHByZXNlcnZlZC4KKyJyZXN0YXJ0IiBpcyBhbiBhbGlhcyBmb3IgInJ1biIuIiIiCisKKyAgICBoZWxwX3Jlc3RhcnQgPSBoZWxwX3J1bgorCisgICAgZGVmIGhlbHBfcXVpdChzZWxmKToKKyAgICAgICAgc2VsZi5oZWxwX3EoKQorCisgICAgZGVmIGhlbHBfcShzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIicSh1aXQpIG9yIGV4aXQgLSBRdWl0IGZyb20gdGhlIGRlYnVnZ2VyLgorVGhlIHByb2dyYW0gYmVpbmcgZXhlY3V0ZWQgaXMgYWJvcnRlZC4iIiIKKworICAgIGhlbHBfZXhpdCA9IGhlbHBfcQorCisgICAgZGVmIGhlbHBfd2hhdGlzKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJ3aGF0aXMgYXJnCitQcmludHMgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50LiIiIgorCisgICAgZGVmIGhlbHBfRU9GKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJFT0YKK0hhbmRsZXMgdGhlIHJlY2VpcHQgb2YgRU9GIGFzIGEgY29tbWFuZC4iIiIKKworICAgIGRlZiBoZWxwX2FsaWFzKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJhbGlhcyBbbmFtZSBbY29tbWFuZCBbcGFyYW1ldGVyIHBhcmFtZXRlciAuLi5dXV0KK0NyZWF0ZXMgYW4gYWxpYXMgY2FsbGVkICduYW1lJyB0aGUgZXhlY3V0ZXMgJ2NvbW1hbmQnLiAgVGhlIGNvbW1hbmQKK211c3QgKm5vdCogYmUgZW5jbG9zZWQgaW4gcXVvdGVzLiAgUmVwbGFjZWFibGUgcGFyYW1ldGVycyBhcmUKK2luZGljYXRlZCBieSAlMSwgJTIsIGFuZCBzbyBvbiwgd2hpbGUgJSogaXMgcmVwbGFjZWQgYnkgYWxsIHRoZQorcGFyYW1ldGVycy4gIElmIG5vIGNvbW1hbmQgaXMgZ2l2ZW4sIHRoZSBjdXJyZW50IGFsaWFzIGZvciBuYW1lCitpcyBzaG93bi4gSWYgbm8gbmFtZSBpcyBnaXZlbiwgYWxsIGFsaWFzZXMgYXJlIGxpc3RlZC4KKworQWxpYXNlcyBtYXkgYmUgbmVzdGVkIGFuZCBjYW4gY29udGFpbiBhbnl0aGluZyB0aGF0IGNhbiBiZQorbGVnYWxseSB0eXBlZCBhdCB0aGUgcGRiIHByb21wdC4gIE5vdGUhICBZb3UgKmNhbiogb3ZlcnJpZGUKK2ludGVybmFsIHBkYiBjb21tYW5kcyB3aXRoIGFsaWFzZXMhICBUaG9zZSBpbnRlcm5hbCBjb21tYW5kcworYXJlIHRoZW4gaGlkZGVuIHVudGlsIHRoZSBhbGlhcyBpcyByZW1vdmVkLiAgQWxpYXNpbmcgaXMgcmVjdXJzaXZlbHkKK2FwcGxpZWQgdG8gdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGNvbW1hbmQgbGluZTsgYWxsIG90aGVyIHdvcmRzCitpbiB0aGUgbGluZSBhcmUgbGVmdCBhbG9uZS4KKworU29tZSB1c2VmdWwgYWxpYXNlcyAoZXNwZWNpYWxseSB3aGVuIHBsYWNlZCBpbiB0aGUgLnBkYnJjIGZpbGUpIGFyZToKKworI1ByaW50IGluc3RhbmNlIHZhcmlhYmxlcyAodXNhZ2UgInBpIGNsYXNzSW5zdCIpCithbGlhcyBwaSBmb3IgayBpbiAlMS5fX2RpY3RfXy5rZXlzKCk6IHByaW50ICIlMS4iLGssIj0iLCUxLl9fZGljdF9fW2tdCisKKyNQcmludCBpbnN0YW5jZSB2YXJpYWJsZXMgaW4gc2VsZgorYWxpYXMgcHMgcGkgc2VsZgorIiIiCisKKyAgICBkZWYgaGVscF91bmFsaWFzKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJ1bmFsaWFzIG5hbWUKK0RlbGV0ZXMgdGhlIHNwZWNpZmllZCBhbGlhcy4iIiIKKworICAgIGRlZiBoZWxwX2NvbW1hbmRzKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJjb21tYW5kcyBbYnBudW1iZXJdCisoY29tKSAuLi4KKyhjb20pIGVuZAorKFBkYikKKworU3BlY2lmeSBhIGxpc3Qgb2YgY29tbWFuZHMgZm9yIGJyZWFrcG9pbnQgbnVtYmVyIGJwbnVtYmVyLiAgVGhlCitjb21tYW5kcyB0aGVtc2VsdmVzIGFwcGVhciBvbiB0aGUgZm9sbG93aW5nIGxpbmVzLiAgVHlwZSBhIGxpbmUKK2NvbnRhaW5pbmcganVzdCAnZW5kJyB0byB0ZXJtaW5hdGUgdGhlIGNvbW1hbmRzLgorCitUbyByZW1vdmUgYWxsIGNvbW1hbmRzIGZyb20gYSBicmVha3BvaW50LCB0eXBlIGNvbW1hbmRzIGFuZAorZm9sbG93IGl0IGltbWVkaWF0ZWx5IHdpdGggIGVuZDsgdGhhdCBpcywgZ2l2ZSBubyBjb21tYW5kcy4KKworV2l0aCBubyBicG51bWJlciBhcmd1bWVudCwgY29tbWFuZHMgcmVmZXJzIHRvIHRoZSBsYXN0CiticmVha3BvaW50IHNldC4KKworWW91IGNhbiB1c2UgYnJlYWtwb2ludCBjb21tYW5kcyB0byBzdGFydCB5b3VyIHByb2dyYW0gdXAgYWdhaW4uCitTaW1wbHkgdXNlIHRoZSBjb250aW51ZSBjb21tYW5kLCBvciBzdGVwLCBvciBhbnkgb3RoZXIKK2NvbW1hbmQgdGhhdCByZXN1bWVzIGV4ZWN1dGlvbi4KKworU3BlY2lmeWluZyBhbnkgY29tbWFuZCByZXN1bWluZyBleGVjdXRpb24gKGN1cnJlbnRseSBjb250aW51ZSwKK3N0ZXAsIG5leHQsIHJldHVybiwganVtcCwgcXVpdCBhbmQgdGhlaXIgYWJicmV2aWF0aW9ucykgdGVybWluYXRlcwordGhlIGNvbW1hbmQgbGlzdCAoYXMgaWYgdGhhdCBjb21tYW5kIHdhcyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBlbmQpLgorVGhpcyBpcyBiZWNhdXNlIGFueSB0aW1lIHlvdSByZXN1bWUgZXhlY3V0aW9uCisoZXZlbiB3aXRoIGEgc2ltcGxlIG5leHQgb3Igc3RlcCksIHlvdSBtYXkgZW5jb3VudGVyCithbm90aGVyIGJyZWFrcG9pbnQtLXdoaWNoIGNvdWxkIGhhdmUgaXRzIG93biBjb21tYW5kIGxpc3QsIGxlYWRpbmcgdG8KK2FtYmlndWl0aWVzIGFib3V0IHdoaWNoIGxpc3QgdG8gZXhlY3V0ZS4KKworICAgSWYgeW91IHVzZSB0aGUgJ3NpbGVudCcgY29tbWFuZCBpbiB0aGUgY29tbWFuZCBsaXN0LCB0aGUKK3VzdWFsIG1lc3NhZ2UgYWJvdXQgc3RvcHBpbmcgYXQgYSBicmVha3BvaW50IGlzIG5vdCBwcmludGVkLiAgVGhpcyBtYXkKK2JlIGRlc2lyYWJsZSBmb3IgYnJlYWtwb2ludHMgdGhhdCBhcmUgdG8gcHJpbnQgYSBzcGVjaWZpYyBtZXNzYWdlIGFuZAordGhlbiBjb250aW51ZS4gIElmIG5vbmUgb2YgdGhlIG90aGVyIGNvbW1hbmRzIHByaW50IGFueXRoaW5nLCB5b3UKK3NlZSBubyBzaWduIHRoYXQgdGhlIGJyZWFrcG9pbnQgd2FzIHJlYWNoZWQuCisiIiIKKworICAgIGRlZiBoZWxwX3BkYihzZWxmKToKKyAgICAgICAgaGVscCgpCisKKyAgICBkZWYgbG9va3VwbW9kdWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiSGVscGVyIGZ1bmN0aW9uIGZvciBicmVhay9jbGVhciBwYXJzaW5nIC0tIG1heSBiZSBvdmVycmlkZGVuLgorCisgICAgICAgIGxvb2t1cG1vZHVsZSgpIHRyYW5zbGF0ZXMgKHBvc3NpYmx5IGluY29tcGxldGUpIGZpbGUgb3IgbW9kdWxlIG5hbWUKKyAgICAgICAgaW50byBhbiBhYnNvbHV0ZSBmaWxlIG5hbWUuCisgICAgICAgICIiIgorICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKGZpbGVuYW1lKSBhbmQgIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQorICAgICAgICBmID0gb3MucGF0aC5qb2luKHN5cy5wYXRoWzBdLCBmaWxlbmFtZSkKKyAgICAgICAgaWYgIG9zLnBhdGguZXhpc3RzKGYpIGFuZCBzZWxmLmNhbm9uaWMoZikgPT0gc2VsZi5tYWlucHlmaWxlOgorICAgICAgICAgICAgcmV0dXJuIGYKKyAgICAgICAgcm9vdCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKKyAgICAgICAgaWYgZXh0ID09ICcnOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZSArICcucHknCisgICAgICAgIGlmIG9zLnBhdGguaXNhYnMoZmlsZW5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisgICAgICAgIGZvciBkaXJuYW1lIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgd2hpbGUgb3MucGF0aC5pc2xpbmsoZGlybmFtZSk6CisgICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLnJlYWRsaW5rKGRpcm5hbWUpCisgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZ1bGxuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVsbG5hbWUKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfcnVuc2NyaXB0KHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIyBUaGUgc2NyaXB0IGhhcyB0byBydW4gaW4gX19tYWluX18gbmFtZXNwYWNlIChvciBpbXBvcnRzIGZyb20KKyAgICAgICAgIyBfX21haW5fXyB3aWxsIGJyZWFrKS4KKyAgICAgICAgIworICAgICAgICAjIFNvIHdlIGNsZWFyIHVwIHRoZSBfX21haW5fXyBhbmQgc2V0IHNldmVyYWwgc3BlY2lhbCB2YXJpYWJsZXMKKyAgICAgICAgIyAodGhpcyBnZXRzIHJpZCBvZiBwZGIncyBnbG9iYWxzIGFuZCBjbGVhbnMgb2xkIHZhcmlhYmxlcyBvbiByZXN0YXJ0cykuCisgICAgICAgIGltcG9ydCBfX21haW5fXworICAgICAgICBfX21haW5fXy5fX2RpY3RfXy5jbGVhcigpCisgICAgICAgIF9fbWFpbl9fLl9fZGljdF9fLnVwZGF0ZSh7Il9fbmFtZV9fIiAgICA6ICJfX21haW5fXyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fZmlsZV9fIiAgICA6IGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2J1aWx0aW5zX18iOiBfX2J1aWx0aW5zX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorCisgICAgICAgICMgV2hlbiBiZGIgc2V0cyB0cmFjaW5nLCBhIG51bWJlciBvZiBjYWxsIGFuZCBsaW5lIGV2ZW50cyBoYXBwZW5zCisgICAgICAgICMgQkVGT1JFIGRlYnVnZ2VyIGV2ZW4gcmVhY2hlcyB1c2VyJ3MgY29kZSAoYW5kIHRoZSBleGFjdCBzZXF1ZW5jZSBvZgorICAgICAgICAjIGV2ZW50cyBkZXBlbmRzIG9uIHB5dGhvbiB2ZXJzaW9uKS4gU28gd2UgdGFrZSBzcGVjaWFsIG1lYXN1cmVzIHRvCisgICAgICAgICMgYXZvaWQgc3RvcHBpbmcgYmVmb3JlIHdlIHJlYWNoIHRoZSBtYWluIHNjcmlwdCAoc2VlIHVzZXJfbGluZSBhbmQKKyAgICAgICAgIyB1c2VyX2NhbGwgZm9yIGRldGFpbHMpLgorICAgICAgICBzZWxmLl93YWl0X2Zvcl9tYWlucHlmaWxlID0gMQorICAgICAgICBzZWxmLm1haW5weWZpbGUgPSBzZWxmLmNhbm9uaWMoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuX3VzZXJfcmVxdWVzdGVkX3F1aXQgPSAwCisgICAgICAgIHN0YXRlbWVudCA9ICdleGVjZmlsZSglciknICUgZmlsZW5hbWUKKyAgICAgICAgc2VsZi5ydW4oc3RhdGVtZW50KQorCisjIFNpbXBsaWZpZWQgaW50ZXJmYWNlCisKK2RlZiBydW4oc3RhdGVtZW50LCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKToKKyAgICBQZGIoKS5ydW4oc3RhdGVtZW50LCBnbG9iYWxzLCBsb2NhbHMpCisKK2RlZiBydW5ldmFsKGV4cHJlc3Npb24sIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpOgorICAgIHJldHVybiBQZGIoKS5ydW5ldmFsKGV4cHJlc3Npb24sIGdsb2JhbHMsIGxvY2FscykKKworZGVmIHJ1bmN0eChzdGF0ZW1lbnQsIGdsb2JhbHMsIGxvY2Fscyk6CisgICAgIyBCL1cgY29tcGF0aWJpbGl0eQorICAgIHJ1bihzdGF0ZW1lbnQsIGdsb2JhbHMsIGxvY2FscykKKworZGVmIHJ1bmNhbGwoKmFyZ3MsICoqa3dkcyk6CisgICAgcmV0dXJuIFBkYigpLnJ1bmNhbGwoKmFyZ3MsICoqa3dkcykKKworZGVmIHNldF90cmFjZSgpOgorICAgIFBkYigpLnNldF90cmFjZShzeXMuX2dldGZyYW1lKCkuZl9iYWNrKQorCisjIFBvc3QtTW9ydGVtIGludGVyZmFjZQorCitkZWYgcG9zdF9tb3J0ZW0odD1Ob25lKToKKyAgICAjIGhhbmRsaW5nIHRoZSBkZWZhdWx0CisgICAgaWYgdCBpcyBOb25lOgorICAgICAgICAjIHN5cy5leGNfaW5mbygpIHJldHVybnMgKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spIGlmIGFuIGV4Y2VwdGlvbiBpcworICAgICAgICAjIGJlaW5nIGhhbmRsZWQsIG90aGVyd2lzZSBpdCByZXR1cm5zIE5vbmUKKyAgICAgICAgdCA9IHN5cy5leGNfaW5mbygpWzJdCisgICAgICAgIGlmIHQgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkEgdmFsaWQgdHJhY2ViYWNrIG11c3QgYmUgcGFzc2VkIGlmIG5vICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbiBpcyBiZWluZyBoYW5kbGVkIikKKworICAgIHAgPSBQZGIoKQorICAgIHAucmVzZXQoKQorICAgIHAuaW50ZXJhY3Rpb24oTm9uZSwgdCkKKworZGVmIHBtKCk6CisgICAgcG9zdF9tb3J0ZW0oc3lzLmxhc3RfdHJhY2ViYWNrKQorCisKKyMgTWFpbiBwcm9ncmFtIGZvciB0ZXN0aW5nCisKK1RFU1RDTUQgPSAnaW1wb3J0IHg7IHgubWFpbigpJworCitkZWYgdGVzdCgpOgorICAgIHJ1bihURVNUQ01EKQorCisjIHByaW50IGhlbHAKK2RlZiBoZWxwKCk6CisgICAgZm9yIGRpcm5hbWUgaW4gc3lzLnBhdGg6CisgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGRpcm5hbWUsICdwZGIuZG9jJykKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZnVsbG5hbWUpOgorICAgICAgICAgICAgc3RzID0gb3Muc3lzdGVtKCcke1BBR0VSLW1vcmV9ICcrZnVsbG5hbWUpCisgICAgICAgICAgICBpZiBzdHM6IHByaW50ICcqKiogUGFnZXIgZXhpdCBzdGF0dXM6Jywgc3RzCisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIHByaW50ICdTb3JyeSwgY2FuXCd0IGZpbmQgdGhlIGhlbHAgZmlsZSAicGRiLmRvYyInLAorICAgICAgICBwcmludCAnYWxvbmcgdGhlIFB5dGhvbiBzZWFyY2ggcGF0aCcKKworZGVmIG1haW4oKToKKyAgICBpZiBub3Qgc3lzLmFyZ3ZbMTpdIG9yIHN5cy5hcmd2WzFdIGluICgiLS1oZWxwIiwgIi1oIik6CisgICAgICAgIHByaW50ICJ1c2FnZTogcGRiLnB5IHNjcmlwdGZpbGUgW2FyZ10gLi4uIgorICAgICAgICBzeXMuZXhpdCgyKQorCisgICAgbWFpbnB5ZmlsZSA9ICBzeXMuYXJndlsxXSAgICAgIyBHZXQgc2NyaXB0IGZpbGVuYW1lCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG1haW5weWZpbGUpOgorICAgICAgICBwcmludCAnRXJyb3I6JywgbWFpbnB5ZmlsZSwgJ2RvZXMgbm90IGV4aXN0JworICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgZGVsIHN5cy5hcmd2WzBdICAgICAgICAgIyBIaWRlICJwZGIucHkiIGZyb20gYXJndW1lbnQgbGlzdAorCisgICAgIyBSZXBsYWNlIHBkYidzIGRpciB3aXRoIHNjcmlwdCdzIGRpciBpbiBmcm9udCBvZiBtb2R1bGUgc2VhcmNoIHBhdGguCisgICAgc3lzLnBhdGhbMF0gPSBvcy5wYXRoLmRpcm5hbWUobWFpbnB5ZmlsZSkKKworICAgICMgTm90ZSBvbiBzYXZpbmcvcmVzdG9yaW5nIHN5cy5hcmd2OiBpdCdzIGEgZ29vZCBpZGVhIHdoZW4gc3lzLmFyZ3Ygd2FzCisgICAgIyBtb2RpZmllZCBieSB0aGUgc2NyaXB0IGJlaW5nIGRlYnVnZ2VkLiBJdCdzIGEgYmFkIGlkZWEgd2hlbiBpdCB3YXMKKyAgICAjIGNoYW5nZWQgYnkgdGhlIHVzZXIgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiBUaGVyZSBpcyBhICJyZXN0YXJ0IiBjb21tYW5kCisgICAgIyB3aGljaCBhbGxvd3MgZXhwbGljaXQgc3BlY2lmaWNhdGlvbiBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICAgIHBkYiA9IFBkYigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGRiLl9ydW5zY3JpcHQobWFpbnB5ZmlsZSkKKyAgICAgICAgICAgIGlmIHBkYi5fdXNlcl9yZXF1ZXN0ZWRfcXVpdDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcHJpbnQgIlRoZSBwcm9ncmFtIGZpbmlzaGVkIGFuZCB3aWxsIGJlIHJlc3RhcnRlZCIKKyAgICAgICAgZXhjZXB0IFJlc3RhcnQ6CisgICAgICAgICAgICBwcmludCAiUmVzdGFydGluZyIsIG1haW5weWZpbGUsICJ3aXRoIGFyZ3VtZW50czoiCisgICAgICAgICAgICBwcmludCAiXHQiICsgIiAiLmpvaW4oc3lzLmFyZ3ZbMTpdKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgICMgSW4gbW9zdCBjYXNlcyBTeXN0ZW1FeGl0IGRvZXMgbm90IHdhcnJhbnQgYSBwb3N0LW1vcnRlbSBzZXNzaW9uLgorICAgICAgICAgICAgcHJpbnQgIlRoZSBwcm9ncmFtIGV4aXRlZCB2aWEgc3lzLmV4aXQoKS4gRXhpdCBzdGF0dXM6ICIsCisgICAgICAgICAgICBwcmludCBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgICAgIHByaW50ICJVbmNhdWdodCBleGNlcHRpb24uIEVudGVyaW5nIHBvc3QgbW9ydGVtIGRlYnVnZ2luZyIKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICdjb250JyBvciAnc3RlcCcgd2lsbCByZXN0YXJ0IHRoZSBwcm9ncmFtIgorICAgICAgICAgICAgdCA9IHN5cy5leGNfaW5mbygpWzJdCisgICAgICAgICAgICBwZGIuaW50ZXJhY3Rpb24oTm9uZSwgdCkKKyAgICAgICAgICAgIHByaW50ICJQb3N0IG1vcnRlbSBkZWJ1Z2dlciBmaW5pc2hlZC4gVGhlICIgKyBtYWlucHlmaWxlICsgXAorICAgICAgICAgICAgICAgICAgIiB3aWxsIGJlIHJlc3RhcnRlZCIKKworCisjIFdoZW4gaW52b2tlZCBhcyBtYWluIHByb2dyYW0sIGludm9rZSB0aGUgZGVidWdnZXIgb24gYSBzY3JpcHQKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHBkYgorICAgIHBkYi5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGRiLnB5YyBiL2xpYi9weXRob24yLjcvcGRiLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2E0YjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wZGIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGRiLnB5byBiL2xpYi9weXRob24yLjcvcGRiLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2E0YjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wZGIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGlja2xlLnB5IGIvbGliL3B5dGhvbjIuNy9waWNrbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4ZTg1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGlja2xlLnB5CkBAIC0wLDAgKzEsMTM5MSBAQAorIiIiQ3JlYXRlIHBvcnRhYmxlIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb25zIG9mIFB5dGhvbiBvYmplY3RzLgorCitTZWUgbW9kdWxlIGNQaWNrbGUgZm9yIGEgKG11Y2gpIGZhc3RlciBpbXBsZW1lbnRhdGlvbi4KK1NlZSBtb2R1bGUgY29weV9yZWcgZm9yIGEgbWVjaGFuaXNtIGZvciByZWdpc3RlcmluZyBjdXN0b20gcGlja2xlcnMuCitTZWUgbW9kdWxlIHBpY2tsZXRvb2xzIHNvdXJjZSBmb3IgZXh0ZW5zaXZlIGNvbW1lbnRzLgorCitDbGFzc2VzOgorCisgICAgUGlja2xlcgorICAgIFVucGlja2xlcgorCitGdW5jdGlvbnM6CisKKyAgICBkdW1wKG9iamVjdCwgZmlsZSkKKyAgICBkdW1wcyhvYmplY3QpIC0+IHN0cmluZworICAgIGxvYWQoZmlsZSkgLT4gb2JqZWN0CisgICAgbG9hZHMoc3RyaW5nKSAtPiBvYmplY3QKKworTWlzYyB2YXJpYWJsZXM6CisKKyAgICBfX3ZlcnNpb25fXworICAgIGZvcm1hdF92ZXJzaW9uCisgICAgY29tcGF0aWJsZV9mb3JtYXRzCisKKyIiIgorCitfX3ZlcnNpb25fXyA9ICIkUmV2aXNpb246IDcyMjIzICQiICAgICAgICMgQ29kZSB2ZXJzaW9uCisKK2Zyb20gdHlwZXMgaW1wb3J0ICoKK2Zyb20gY29weV9yZWcgaW1wb3J0IGRpc3BhdGNoX3RhYmxlCitmcm9tIGNvcHlfcmVnIGltcG9ydCBfZXh0ZW5zaW9uX3JlZ2lzdHJ5LCBfaW52ZXJ0ZWRfcmVnaXN0cnksIF9leHRlbnNpb25fY2FjaGUKK2ltcG9ydCBtYXJzaGFsCitpbXBvcnQgc3lzCitpbXBvcnQgc3RydWN0CitpbXBvcnQgcmUKKworX19hbGxfXyA9IFsiUGlja2xlRXJyb3IiLCAiUGlja2xpbmdFcnJvciIsICJVbnBpY2tsaW5nRXJyb3IiLCAiUGlja2xlciIsCisgICAgICAgICAgICJVbnBpY2tsZXIiLCAiZHVtcCIsICJkdW1wcyIsICJsb2FkIiwgImxvYWRzIl0KKworIyBUaGVzZSBhcmUgcHVyZWx5IGluZm9ybWF0aW9uYWw7IG5vIGNvZGUgdXNlcyB0aGVzZS4KK2Zvcm1hdF92ZXJzaW9uID0gIjIuMCIgICAgICAgICAgICAgICAgICAjIEZpbGUgZm9ybWF0IHZlcnNpb24gd2Ugd3JpdGUKK2NvbXBhdGlibGVfZm9ybWF0cyA9IFsiMS4wIiwgICAgICAgICAgICAjIE9yaWdpbmFsIHByb3RvY29sIDAKKyAgICAgICAgICAgICAgICAgICAgICAiMS4xIiwgICAgICAgICAgICAjIFByb3RvY29sIDAgd2l0aCBJTlNUIGFkZGVkCisgICAgICAgICAgICAgICAgICAgICAgIjEuMiIsICAgICAgICAgICAgIyBPcmlnaW5hbCBwcm90b2NvbCAxCisgICAgICAgICAgICAgICAgICAgICAgIjEuMyIsICAgICAgICAgICAgIyBQcm90b2NvbCAxIHdpdGggQklORkxPQVQgYWRkZWQKKyAgICAgICAgICAgICAgICAgICAgICAiMi4wIiwgICAgICAgICAgICAjIFByb3RvY29sIDIKKyAgICAgICAgICAgICAgICAgICAgICBdICAgICAgICAgICAgICAgICAjIE9sZCBmb3JtYXQgdmVyc2lvbnMgd2UgY2FuIHJlYWQKKworIyBLZWVwIGluIHN5bmNoIHdpdGggY1BpY2tsZS4gIFRoaXMgaXMgdGhlIGhpZ2hlc3QgcHJvdG9jb2wgbnVtYmVyIHdlCisjIGtub3cgaG93IHRvIHJlYWQuCitISUdIRVNUX1BST1RPQ09MID0gMgorCisjIFdoeSB1c2Ugc3RydWN0LnBhY2soKSBmb3IgcGlja2xpbmcgYnV0IG1hcnNoYWwubG9hZHMoKSBmb3IKKyMgdW5waWNrbGluZz8gIHN0cnVjdC5wYWNrKCkgaXMgNDAlIGZhc3RlciB0aGFuIG1hcnNoYWwuZHVtcHMoKSwgYnV0CisjIG1hcnNoYWwubG9hZHMoKSBpcyB0d2ljZSBhcyBmYXN0IGFzIHN0cnVjdC51bnBhY2soKSEKK21sb2FkcyA9IG1hcnNoYWwubG9hZHMKKworY2xhc3MgUGlja2xlRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJBIGNvbW1vbiBiYXNlIGNsYXNzIGZvciB0aGUgb3RoZXIgcGlja2xpbmcgZXhjZXB0aW9ucy4iIiIKKyAgICBwYXNzCisKK2NsYXNzIFBpY2tsaW5nRXJyb3IoUGlja2xlRXJyb3IpOgorICAgICIiIlRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIGFuIHVucGlja2xhYmxlIG9iamVjdCBpcyBwYXNzZWQgdG8gdGhlCisgICAgZHVtcCgpIG1ldGhvZC4KKworICAgICIiIgorICAgIHBhc3MKKworY2xhc3MgVW5waWNrbGluZ0Vycm9yKFBpY2tsZUVycm9yKToKKyAgICAiIiJUaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0gdW5waWNrbGluZyBhbiBvYmplY3QsCisgICAgc3VjaCBhcyBhIHNlY3VyaXR5IHZpb2xhdGlvbi4KKworICAgIE5vdGUgdGhhdCBvdGhlciBleGNlcHRpb25zIG1heSBhbHNvIGJlIHJhaXNlZCBkdXJpbmcgdW5waWNrbGluZywgaW5jbHVkaW5nCisgICAgKGJ1dCBub3QgbmVjZXNzYXJpbHkgbGltaXRlZCB0bykgQXR0cmlidXRlRXJyb3IsIEVPRkVycm9yLCBJbXBvcnRFcnJvciwKKyAgICBhbmQgSW5kZXhFcnJvci4KKworICAgICIiIgorICAgIHBhc3MKKworIyBBbiBpbnN0YW5jZSBvZiBfU3RvcCBpcyByYWlzZWQgYnkgVW5waWNrbGVyLmxvYWRfc3RvcCgpIGluIHJlc3BvbnNlIHRvCisjIHRoZSBTVE9QIG9wY29kZSwgcGFzc2luZyB0aGUgb2JqZWN0IHRoYXQgaXMgdGhlIHJlc3VsdCBvZiB1bnBpY2tsaW5nLgorY2xhc3MgX1N0b3AoRXhjZXB0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKworIyBKeXRob24gaGFzIFB5U3RyaW5nTWFwOyBpdCdzIGEgZGljdCBzdWJjbGFzcyB3aXRoIHN0cmluZyBrZXlzCit0cnk6CisgICAgZnJvbSBvcmcucHl0aG9uLmNvcmUgaW1wb3J0IFB5U3RyaW5nTWFwCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgUHlTdHJpbmdNYXAgPSBOb25lCisKKyMgVW5pY29kZVR5cGUgbWF5IG9yIG1heSBub3QgYmUgZXhwb3J0ZWQgKG5vcm1hbGx5IGltcG9ydGVkIGZyb20gdHlwZXMpCit0cnk6CisgICAgVW5pY29kZVR5cGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgVW5pY29kZVR5cGUgPSBOb25lCisKKyMgUGlja2xlIG9wY29kZXMuICBTZWUgcGlja2xldG9vbHMucHkgZm9yIGV4dGVuc2l2ZSBkb2NzLiAgVGhlIGxpc3RpbmcKKyMgaGVyZSBpcyBpbiBraW5kLW9mIGFscGhhYmV0aWNhbCBvcmRlciBvZiAxLWNoYXJhY3RlciBwaWNrbGUgY29kZS4KKyMgcGlja2xldG9vbHMgZ3JvdXBzIHRoZW0gYnkgcHVycG9zZS4KKworTUFSSyAgICAgICAgICAgID0gJygnICAgIyBwdXNoIHNwZWNpYWwgbWFya29iamVjdCBvbiBzdGFjaworU1RPUCAgICAgICAgICAgID0gJy4nICAgIyBldmVyeSBwaWNrbGUgZW5kcyB3aXRoIFNUT1AKK1BPUCAgICAgICAgICAgICA9ICcwJyAgICMgZGlzY2FyZCB0b3Btb3N0IHN0YWNrIGl0ZW0KK1BPUF9NQVJLICAgICAgICA9ICcxJyAgICMgZGlzY2FyZCBzdGFjayB0b3AgdGhyb3VnaCB0b3Btb3N0IG1hcmtvYmplY3QKK0RVUCAgICAgICAgICAgICA9ICcyJyAgICMgZHVwbGljYXRlIHRvcCBzdGFjayBpdGVtCitGTE9BVCAgICAgICAgICAgPSAnRicgICAjIHB1c2ggZmxvYXQgb2JqZWN0OyBkZWNpbWFsIHN0cmluZyBhcmd1bWVudAorSU5UICAgICAgICAgICAgID0gJ0knICAgIyBwdXNoIGludGVnZXIgb3IgYm9vbDsgZGVjaW1hbCBzdHJpbmcgYXJndW1lbnQKK0JJTklOVCAgICAgICAgICA9ICdKJyAgICMgcHVzaCBmb3VyLWJ5dGUgc2lnbmVkIGludAorQklOSU5UMSAgICAgICAgID0gJ0snICAgIyBwdXNoIDEtYnl0ZSB1bnNpZ25lZCBpbnQKK0xPTkcgICAgICAgICAgICA9ICdMJyAgICMgcHVzaCBsb25nOyBkZWNpbWFsIHN0cmluZyBhcmd1bWVudAorQklOSU5UMiAgICAgICAgID0gJ00nICAgIyBwdXNoIDItYnl0ZSB1bnNpZ25lZCBpbnQKK05PTkUgICAgICAgICAgICA9ICdOJyAgICMgcHVzaCBOb25lCitQRVJTSUQgICAgICAgICAgPSAnUCcgICAjIHB1c2ggcGVyc2lzdGVudCBvYmplY3Q7IGlkIGlzIHRha2VuIGZyb20gc3RyaW5nIGFyZworQklOUEVSU0lEICAgICAgID0gJ1EnICAgIyAgIiAgICAgICAiICAgICAgICAgIiAgOyAgIiAgIiAgICIgICAgICIgIHN0YWNrCitSRURVQ0UgICAgICAgICAgPSAnUicgICAjIGFwcGx5IGNhbGxhYmxlIHRvIGFyZ3R1cGxlLCBib3RoIG9uIHN0YWNrCitTVFJJTkcgICAgICAgICAgPSAnUycgICAjIHB1c2ggc3RyaW5nOyBOTC10ZXJtaW5hdGVkIHN0cmluZyBhcmd1bWVudAorQklOU1RSSU5HICAgICAgID0gJ1QnICAgIyBwdXNoIHN0cmluZzsgY291bnRlZCBiaW5hcnkgc3RyaW5nIGFyZ3VtZW50CitTSE9SVF9CSU5TVFJJTkcgPSAnVScgICAjICAiICAgICAiICAgOyAgICAiICAgICAgIiAgICAgICAiICAgICAgIiA8IDI1NiBieXRlcworVU5JQ09ERSAgICAgICAgID0gJ1YnICAgIyBwdXNoIFVuaWNvZGUgc3RyaW5nOyByYXctdW5pY29kZS1lc2NhcGVkJ2QgYXJndW1lbnQKK0JJTlVOSUNPREUgICAgICA9ICdYJyAgICMgICAiICAgICAiICAgICAgICIgIDsgY291bnRlZCBVVEYtOCBzdHJpbmcgYXJndW1lbnQKK0FQUEVORCAgICAgICAgICA9ICdhJyAgICMgYXBwZW5kIHN0YWNrIHRvcCB0byBsaXN0IGJlbG93IGl0CitCVUlMRCAgICAgICAgICAgPSAnYicgICAjIGNhbGwgX19zZXRzdGF0ZV9fIG9yIF9fZGljdF9fLnVwZGF0ZSgpCitHTE9CQUwgICAgICAgICAgPSAnYycgICAjIHB1c2ggc2VsZi5maW5kX2NsYXNzKG1vZG5hbWUsIG5hbWUpOyAyIHN0cmluZyBhcmdzCitESUNUICAgICAgICAgICAgPSAnZCcgICAjIGJ1aWxkIGEgZGljdCBmcm9tIHN0YWNrIGl0ZW1zCitFTVBUWV9ESUNUICAgICAgPSAnfScgICAjIHB1c2ggZW1wdHkgZGljdAorQVBQRU5EUyAgICAgICAgID0gJ2UnICAgIyBleHRlbmQgbGlzdCBvbiBzdGFjayBieSB0b3Btb3N0IHN0YWNrIHNsaWNlCitHRVQgICAgICAgICAgICAgPSAnZycgICAjIHB1c2ggaXRlbSBmcm9tIG1lbW8gb24gc3RhY2s7IGluZGV4IGlzIHN0cmluZyBhcmcKK0JJTkdFVCAgICAgICAgICA9ICdoJyAgICMgICAiICAgICIgICAgIiAgICAiICAgIiAgICIgIDsgICAiICAgICIgMS1ieXRlIGFyZworSU5TVCAgICAgICAgICAgID0gJ2knICAgIyBidWlsZCAmIHB1c2ggY2xhc3MgaW5zdGFuY2UKK0xPTkdfQklOR0VUICAgICA9ICdqJyAgICMgcHVzaCBpdGVtIGZyb20gbWVtbyBvbiBzdGFjazsgaW5kZXggaXMgNC1ieXRlIGFyZworTElTVCAgICAgICAgICAgID0gJ2wnICAgIyBidWlsZCBsaXN0IGZyb20gdG9wbW9zdCBzdGFjayBpdGVtcworRU1QVFlfTElTVCAgICAgID0gJ10nICAgIyBwdXNoIGVtcHR5IGxpc3QKK09CSiAgICAgICAgICAgICA9ICdvJyAgICMgYnVpbGQgJiBwdXNoIGNsYXNzIGluc3RhbmNlCitQVVQgICAgICAgICAgICAgPSAncCcgICAjIHN0b3JlIHN0YWNrIHRvcCBpbiBtZW1vOyBpbmRleCBpcyBzdHJpbmcgYXJnCitCSU5QVVQgICAgICAgICAgPSAncScgICAjICAgIiAgICAgIiAgICAiICAgIiAgICIgOyAgICIgICAgIiAxLWJ5dGUgYXJnCitMT05HX0JJTlBVVCAgICAgPSAncicgICAjICAgIiAgICAgIiAgICAiICAgIiAgICIgOyAgICIgICAgIiA0LWJ5dGUgYXJnCitTRVRJVEVNICAgICAgICAgPSAncycgICAjIGFkZCBrZXkrdmFsdWUgcGFpciB0byBkaWN0CitUVVBMRSAgICAgICAgICAgPSAndCcgICAjIGJ1aWxkIHR1cGxlIGZyb20gdG9wbW9zdCBzdGFjayBpdGVtcworRU1QVFlfVFVQTEUgICAgID0gJyknICAgIyBwdXNoIGVtcHR5IHR1cGxlCitTRVRJVEVNUyAgICAgICAgPSAndScgICAjIG1vZGlmeSBkaWN0IGJ5IGFkZGluZyB0b3Btb3N0IGtleSt2YWx1ZSBwYWlycworQklORkxPQVQgICAgICAgID0gJ0cnICAgIyBwdXNoIGZsb2F0OyBhcmcgaXMgOC1ieXRlIGZsb2F0IGVuY29kaW5nCisKK1RSVUUgICAgICAgICAgICA9ICdJMDFcbicgICMgbm90IGFuIG9wY29kZTsgc2VlIElOVCBkb2NzIGluIHBpY2tsZXRvb2xzLnB5CitGQUxTRSAgICAgICAgICAgPSAnSTAwXG4nICAjIG5vdCBhbiBvcGNvZGU7IHNlZSBJTlQgZG9jcyBpbiBwaWNrbGV0b29scy5weQorCisjIFByb3RvY29sIDIKKworUFJPVE8gICAgICAgICAgID0gJ1x4ODAnICAjIGlkZW50aWZ5IHBpY2tsZSBwcm90b2NvbAorTkVXT0JKICAgICAgICAgID0gJ1x4ODEnICAjIGJ1aWxkIG9iamVjdCBieSBhcHBseWluZyBjbHMuX19uZXdfXyB0byBhcmd0dXBsZQorRVhUMSAgICAgICAgICAgID0gJ1x4ODInICAjIHB1c2ggb2JqZWN0IGZyb20gZXh0ZW5zaW9uIHJlZ2lzdHJ5OyAxLWJ5dGUgaW5kZXgKK0VYVDIgICAgICAgICAgICA9ICdceDgzJyAgIyBkaXR0bywgYnV0IDItYnl0ZSBpbmRleAorRVhUNCAgICAgICAgICAgID0gJ1x4ODQnICAjIGRpdHRvLCBidXQgNC1ieXRlIGluZGV4CitUVVBMRTEgICAgICAgICAgPSAnXHg4NScgICMgYnVpbGQgMS10dXBsZSBmcm9tIHN0YWNrIHRvcAorVFVQTEUyICAgICAgICAgID0gJ1x4ODYnICAjIGJ1aWxkIDItdHVwbGUgZnJvbSB0d28gdG9wbW9zdCBzdGFjayBpdGVtcworVFVQTEUzICAgICAgICAgID0gJ1x4ODcnICAjIGJ1aWxkIDMtdHVwbGUgZnJvbSB0aHJlZSB0b3Btb3N0IHN0YWNrIGl0ZW1zCitORVdUUlVFICAgICAgICAgPSAnXHg4OCcgICMgcHVzaCBUcnVlCitORVdGQUxTRSAgICAgICAgPSAnXHg4OScgICMgcHVzaCBGYWxzZQorTE9ORzEgICAgICAgICAgID0gJ1x4OGEnICAjIHB1c2ggbG9uZyBmcm9tIDwgMjU2IGJ5dGVzCitMT05HNCAgICAgICAgICAgPSAnXHg4YicgICMgcHVzaCByZWFsbHkgYmlnIGxvbmcKKworX3R1cGxlc2l6ZTJjb2RlID0gW0VNUFRZX1RVUExFLCBUVVBMRTEsIFRVUExFMiwgVFVQTEUzXQorCisKK19fYWxsX18uZXh0ZW5kKFt4IGZvciB4IGluIGRpcigpIGlmIHJlLm1hdGNoKCJbQS1aXVtBLVowLTlfXSskIix4KV0pCitkZWwgeAorCisKKyMgUGlja2xpbmcgbWFjaGluZXJ5CisKK2NsYXNzIFBpY2tsZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgcHJvdG9jb2w9Tm9uZSk6CisgICAgICAgICIiIlRoaXMgdGFrZXMgYSBmaWxlLWxpa2Ugb2JqZWN0IGZvciB3cml0aW5nIGEgcGlja2xlIGRhdGEgc3RyZWFtLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBwcm90b2NvbCBhcmd1bWVudCB0ZWxscyB0aGUgcGlja2xlciB0byB1c2UgdGhlCisgICAgICAgIGdpdmVuIHByb3RvY29sOyBzdXBwb3J0ZWQgcHJvdG9jb2xzIGFyZSAwLCAxLCAyLiAgVGhlIGRlZmF1bHQKKyAgICAgICAgcHJvdG9jb2wgaXMgMCwgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUuICAoUHJvdG9jb2wgMCBpcyB0aGUKKyAgICAgICAgb25seSBwcm90b2NvbCB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIGEgZmlsZSBvcGVuZWQgaW4gdGV4dAorICAgICAgICBtb2RlIGFuZCByZWFkIGJhY2sgc3VjY2Vzc2Z1bGx5LiAgV2hlbiB1c2luZyBhIHByb3RvY29sIGhpZ2hlcgorICAgICAgICB0aGFuIDAsIG1ha2Ugc3VyZSB0aGUgZmlsZSBpcyBvcGVuZWQgaW4gYmluYXJ5IG1vZGUsIGJvdGggd2hlbgorICAgICAgICBwaWNrbGluZyBhbmQgdW5waWNrbGluZy4pCisKKyAgICAgICAgUHJvdG9jb2wgMSBpcyBtb3JlIGVmZmljaWVudCB0aGFuIHByb3RvY29sIDA7IHByb3RvY29sIDIgaXMKKyAgICAgICAgbW9yZSBlZmZpY2llbnQgdGhhbiBwcm90b2NvbCAxLgorCisgICAgICAgIFNwZWNpZnlpbmcgYSBuZWdhdGl2ZSBwcm90b2NvbCB2ZXJzaW9uIHNlbGVjdHMgdGhlIGhpZ2hlc3QKKyAgICAgICAgcHJvdG9jb2wgdmVyc2lvbiBzdXBwb3J0ZWQuICBUaGUgaGlnaGVyIHRoZSBwcm90b2NvbCB1c2VkLCB0aGUKKyAgICAgICAgbW9yZSByZWNlbnQgdGhlIHZlcnNpb24gb2YgUHl0aG9uIG5lZWRlZCB0byByZWFkIHRoZSBwaWNrbGUKKyAgICAgICAgcHJvZHVjZWQuCisKKyAgICAgICAgVGhlIGZpbGUgcGFyYW1ldGVyIG11c3QgaGF2ZSBhIHdyaXRlKCkgbWV0aG9kIHRoYXQgYWNjZXB0cyBhIHNpbmdsZQorICAgICAgICBzdHJpbmcgYXJndW1lbnQuICBJdCBjYW4gdGh1cyBiZSBhbiBvcGVuIGZpbGUgb2JqZWN0LCBhIFN0cmluZ0lPCisgICAgICAgIG9iamVjdCwgb3IgYW55IG90aGVyIGN1c3RvbSBvYmplY3QgdGhhdCBtZWV0cyB0aGlzIGludGVyZmFjZS4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgcHJvdG9jb2wgaXMgTm9uZToKKyAgICAgICAgICAgIHByb3RvY29sID0gMAorICAgICAgICBpZiBwcm90b2NvbCA8IDA6CisgICAgICAgICAgICBwcm90b2NvbCA9IEhJR0hFU1RfUFJPVE9DT0wKKyAgICAgICAgZWxpZiBub3QgMCA8PSBwcm90b2NvbCA8PSBISUdIRVNUX1BST1RPQ09MOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicGlja2xlIHByb3RvY29sIG11c3QgYmUgPD0gJWQiICUgSElHSEVTVF9QUk9UT0NPTCkKKyAgICAgICAgc2VsZi53cml0ZSA9IGZpbGUud3JpdGUKKyAgICAgICAgc2VsZi5tZW1vID0ge30KKyAgICAgICAgc2VsZi5wcm90byA9IGludChwcm90b2NvbCkKKyAgICAgICAgc2VsZi5iaW4gPSBwcm90b2NvbCA+PSAxCisgICAgICAgIHNlbGYuZmFzdCA9IDAKKworICAgIGRlZiBjbGVhcl9tZW1vKHNlbGYpOgorICAgICAgICAiIiJDbGVhcnMgdGhlIHBpY2tsZXIncyAibWVtbyIuCisKKyAgICAgICAgVGhlIG1lbW8gaXMgdGhlIGRhdGEgc3RydWN0dXJlIHRoYXQgcmVtZW1iZXJzIHdoaWNoIG9iamVjdHMgdGhlCisgICAgICAgIHBpY2tsZXIgaGFzIGFscmVhZHkgc2Vlbiwgc28gdGhhdCBzaGFyZWQgb3IgcmVjdXJzaXZlIG9iamVjdHMgYXJlCisgICAgICAgIHBpY2tsZWQgYnkgcmVmZXJlbmNlIGFuZCBub3QgYnkgdmFsdWUuICBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgd2hlbgorICAgICAgICByZS11c2luZyBwaWNrbGVycy4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5tZW1vLmNsZWFyKCkKKworICAgIGRlZiBkdW1wKHNlbGYsIG9iaik6CisgICAgICAgICIiIldyaXRlIGEgcGlja2xlZCByZXByZXNlbnRhdGlvbiBvZiBvYmogdG8gdGhlIG9wZW4gZmlsZS4iIiIKKyAgICAgICAgaWYgc2VsZi5wcm90byA+PSAyOgorICAgICAgICAgICAgc2VsZi53cml0ZShQUk9UTyArIGNocihzZWxmLnByb3RvKSkKKyAgICAgICAgc2VsZi5zYXZlKG9iaikKKyAgICAgICAgc2VsZi53cml0ZShTVE9QKQorCisgICAgZGVmIG1lbW9pemUoc2VsZiwgb2JqKToKKyAgICAgICAgIiIiU3RvcmUgYW4gb2JqZWN0IGluIHRoZSBtZW1vLiIiIgorCisgICAgICAgICMgVGhlIFBpY2tsZXIgbWVtbyBpcyBhIGRpY3Rpb25hcnkgbWFwcGluZyBvYmplY3QgaWRzIHRvIDItdHVwbGVzCisgICAgICAgICMgdGhhdCBjb250YWluIHRoZSBVbnBpY2tsZXIgbWVtbyBrZXkgYW5kIHRoZSBvYmplY3QgYmVpbmcgbWVtb2l6ZWQuCisgICAgICAgICMgVGhlIG1lbW8ga2V5IGlzIHdyaXR0ZW4gdG8gdGhlIHBpY2tsZSBhbmQgd2lsbCBiZWNvbWUKKyAgICAgICAgIyB0aGUga2V5IGluIHRoZSBVbnBpY2tsZXIncyBtZW1vLiAgVGhlIG9iamVjdCBpcyBzdG9yZWQgaW4gdGhlCisgICAgICAgICMgUGlja2xlciBtZW1vIHNvIHRoYXQgdHJhbnNpZW50IG9iamVjdHMgYXJlIGtlcHQgYWxpdmUgZHVyaW5nCisgICAgICAgICMgcGlja2xpbmcuCisKKyAgICAgICAgIyBUaGUgdXNlIG9mIHRoZSBVbnBpY2tsZXIgbWVtbyBsZW5ndGggYXMgdGhlIG1lbW8ga2V5IGlzIGp1c3QgYQorICAgICAgICAjIGNvbnZlbnRpb24uICBUaGUgb25seSByZXF1aXJlbWVudCBpcyB0aGF0IHRoZSBtZW1vIHZhbHVlcyBiZSB1bmlxdWUuCisgICAgICAgICMgQnV0IHRoZXJlIGFwcGVhcnMgbm8gYWR2YW50YWdlIHRvIGFueSBvdGhlciBzY2hlbWUsIGFuZCB0aGlzCisgICAgICAgICMgc2NoZW1lIGFsbG93cyB0aGUgVW5waWNrbGVyIG1lbW8gdG8gYmUgaW1wbGVtZW50ZWQgYXMgYSBwbGFpbiAoYnV0CisgICAgICAgICMgZ3Jvd2FibGUpIGFycmF5LCBpbmRleGVkIGJ5IG1lbW8ga2V5LgorICAgICAgICBpZiBzZWxmLmZhc3Q6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYXNzZXJ0IGlkKG9iaikgbm90IGluIHNlbGYubWVtbworICAgICAgICBtZW1vX2xlbiA9IGxlbihzZWxmLm1lbW8pCisgICAgICAgIHNlbGYud3JpdGUoc2VsZi5wdXQobWVtb19sZW4pKQorICAgICAgICBzZWxmLm1lbW9baWQob2JqKV0gPSBtZW1vX2xlbiwgb2JqCisKKyAgICAjIFJldHVybiBhIFBVVCAoQklOUFVULCBMT05HX0JJTlBVVCkgb3Bjb2RlIHN0cmluZywgd2l0aCBhcmd1bWVudCBpLgorICAgIGRlZiBwdXQoc2VsZiwgaSwgcGFjaz1zdHJ1Y3QucGFjayk6CisgICAgICAgIGlmIHNlbGYuYmluOgorICAgICAgICAgICAgaWYgaSA8IDI1NjoKKyAgICAgICAgICAgICAgICByZXR1cm4gQklOUFVUICsgY2hyKGkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBMT05HX0JJTlBVVCArIHBhY2soIjxpIiwgaSkKKworICAgICAgICByZXR1cm4gUFVUICsgcmVwcihpKSArICdcbicKKworICAgICMgUmV0dXJuIGEgR0VUIChCSU5HRVQsIExPTkdfQklOR0VUKSBvcGNvZGUgc3RyaW5nLCB3aXRoIGFyZ3VtZW50IGkuCisgICAgZGVmIGdldChzZWxmLCBpLCBwYWNrPXN0cnVjdC5wYWNrKToKKyAgICAgICAgaWYgc2VsZi5iaW46CisgICAgICAgICAgICBpZiBpIDwgMjU2OgorICAgICAgICAgICAgICAgIHJldHVybiBCSU5HRVQgKyBjaHIoaSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIExPTkdfQklOR0VUICsgcGFjaygiPGkiLCBpKQorCisgICAgICAgIHJldHVybiBHRVQgKyByZXByKGkpICsgJ1xuJworCisgICAgZGVmIHNhdmUoc2VsZiwgb2JqKToKKyAgICAgICAgIyBDaGVjayBmb3IgcGVyc2lzdGVudCBpZCAoZGVmaW5lZCBieSBhIHN1YmNsYXNzKQorICAgICAgICBwaWQgPSBzZWxmLnBlcnNpc3RlbnRfaWQob2JqKQorICAgICAgICBpZiBwaWQ6CisgICAgICAgICAgICBzZWxmLnNhdmVfcGVycyhwaWQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIENoZWNrIHRoZSBtZW1vCisgICAgICAgIHggPSBzZWxmLm1lbW8uZ2V0KGlkKG9iaikpCisgICAgICAgIGlmIHg6CisgICAgICAgICAgICBzZWxmLndyaXRlKHNlbGYuZ2V0KHhbMF0pKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBDaGVjayB0aGUgdHlwZSBkaXNwYXRjaCB0YWJsZQorICAgICAgICB0ID0gdHlwZShvYmopCisgICAgICAgIGYgPSBzZWxmLmRpc3BhdGNoLmdldCh0KQorICAgICAgICBpZiBmOgorICAgICAgICAgICAgZihzZWxmLCBvYmopICMgQ2FsbCB1bmJvdW5kIG1ldGhvZCB3aXRoIGV4cGxpY2l0IHNlbGYKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgQ2hlY2sgY29weV9yZWcuZGlzcGF0Y2hfdGFibGUKKyAgICAgICAgcmVkdWNlID0gZGlzcGF0Y2hfdGFibGUuZ2V0KHQpCisgICAgICAgIGlmIHJlZHVjZToKKyAgICAgICAgICAgIHJ2ID0gcmVkdWNlKG9iaikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIGEgY2xhc3Mgd2l0aCBhIGN1c3RvbSBtZXRhY2xhc3M7IHRyZWF0IGFzIHJlZ3VsYXIgY2xhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpc3NjID0gaXNzdWJjbGFzcyh0LCBUeXBlVHlwZSkKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6ICMgdCBpcyBub3QgYSBjbGFzcyAob2xkIEJvb3N0OyBzZWUgU0YgIzUwMjA4NSkKKyAgICAgICAgICAgICAgICBpc3NjID0gMAorICAgICAgICAgICAgaWYgaXNzYzoKKyAgICAgICAgICAgICAgICBzZWxmLnNhdmVfZ2xvYmFsKG9iaikKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgIyBDaGVjayBmb3IgYSBfX3JlZHVjZV9leF9fIG1ldGhvZCwgZmFsbCBiYWNrIHRvIF9fcmVkdWNlX18KKyAgICAgICAgICAgIHJlZHVjZSA9IGdldGF0dHIob2JqLCAiX19yZWR1Y2VfZXhfXyIsIE5vbmUpCisgICAgICAgICAgICBpZiByZWR1Y2U6CisgICAgICAgICAgICAgICAgcnYgPSByZWR1Y2Uoc2VsZi5wcm90bykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVkdWNlID0gZ2V0YXR0cihvYmosICJfX3JlZHVjZV9fIiwgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiByZWR1Y2U6CisgICAgICAgICAgICAgICAgICAgIHJ2ID0gcmVkdWNlKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBQaWNrbGluZ0Vycm9yKCJDYW4ndCBwaWNrbGUgJXIgb2JqZWN0OiAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0Ll9fbmFtZV9fLCBvYmopKQorCisgICAgICAgICMgQ2hlY2sgZm9yIHN0cmluZyByZXR1cm5lZCBieSByZWR1Y2UoKSwgbWVhbmluZyAic2F2ZSBhcyBnbG9iYWwiCisgICAgICAgIGlmIHR5cGUocnYpIGlzIFN0cmluZ1R5cGU6CisgICAgICAgICAgICBzZWxmLnNhdmVfZ2xvYmFsKG9iaiwgcnYpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIEFzc2VydCB0aGF0IHJlZHVjZSgpIHJldHVybmVkIGEgdHVwbGUKKyAgICAgICAgaWYgdHlwZShydikgaXMgbm90IFR1cGxlVHlwZToKKyAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoIiVzIG11c3QgcmV0dXJuIHN0cmluZyBvciB0dXBsZSIgJSByZWR1Y2UpCisKKyAgICAgICAgIyBBc3NlcnQgdGhhdCBpdCByZXR1cm5lZCBhbiBhcHByb3ByaWF0ZWx5IHNpemVkIHR1cGxlCisgICAgICAgIGwgPSBsZW4ocnYpCisgICAgICAgIGlmIG5vdCAoMiA8PSBsIDw9IDUpOgorICAgICAgICAgICAgcmFpc2UgUGlja2xpbmdFcnJvcigiVHVwbGUgcmV0dXJuZWQgYnkgJXMgbXVzdCBoYXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR3byB0byBmaXZlIGVsZW1lbnRzIiAlIHJlZHVjZSkKKworICAgICAgICAjIFNhdmUgdGhlIHJlZHVjZSgpIG91dHB1dCBhbmQgZmluYWxseSBtZW1vaXplIHRoZSBvYmplY3QKKyAgICAgICAgc2VsZi5zYXZlX3JlZHVjZShvYmo9b2JqLCAqcnYpCisKKyAgICBkZWYgcGVyc2lzdGVudF9pZChzZWxmLCBvYmopOgorICAgICAgICAjIFRoaXMgZXhpc3RzIHNvIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIGl0CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgc2F2ZV9wZXJzKHNlbGYsIHBpZCk6CisgICAgICAgICMgU2F2ZSBhIHBlcnNpc3RlbnQgaWQgcmVmZXJlbmNlCisgICAgICAgIGlmIHNlbGYuYmluOgorICAgICAgICAgICAgc2VsZi5zYXZlKHBpZCkKKyAgICAgICAgICAgIHNlbGYud3JpdGUoQklOUEVSU0lEKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZShQRVJTSUQgKyBzdHIocGlkKSArICdcbicpCisKKyAgICBkZWYgc2F2ZV9yZWR1Y2Uoc2VsZiwgZnVuYywgYXJncywgc3RhdGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgbGlzdGl0ZW1zPU5vbmUsIGRpY3RpdGVtcz1Ob25lLCBvYmo9Tm9uZSk6CisgICAgICAgICMgVGhpcyBBUEkgaXMgY2FsbGVkIGJ5IHNvbWUgc3ViY2xhc3NlcworCisgICAgICAgICMgQXNzZXJ0IHRoYXQgYXJncyBpcyBhIHR1cGxlIG9yIE5vbmUKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYXJncywgVHVwbGVUeXBlKToKKyAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoImFyZ3MgZnJvbSByZWR1Y2UoKSBzaG91bGQgYmUgYSB0dXBsZSIpCisKKyAgICAgICAgIyBBc3NlcnQgdGhhdCBmdW5jIGlzIGNhbGxhYmxlCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKGZ1bmMsICdfX2NhbGxfXycpOgorICAgICAgICAgICAgcmFpc2UgUGlja2xpbmdFcnJvcigiZnVuYyBmcm9tIHJlZHVjZSBzaG91bGQgYmUgY2FsbGFibGUiKQorCisgICAgICAgIHNhdmUgPSBzZWxmLnNhdmUKKyAgICAgICAgd3JpdGUgPSBzZWxmLndyaXRlCisKKyAgICAgICAgIyBQcm90b2NvbCAyIHNwZWNpYWwgY2FzZTogaWYgZnVuYydzIG5hbWUgaXMgX19uZXdvYmpfXywgdXNlIE5FV09CSgorICAgICAgICBpZiBzZWxmLnByb3RvID49IDIgYW5kIGdldGF0dHIoZnVuYywgIl9fbmFtZV9fIiwgIiIpID09ICJfX25ld29ial9fIjoKKyAgICAgICAgICAgICMgQSBfX3JlZHVjZV9fIGltcGxlbWVudGF0aW9uIGNhbiBkaXJlY3QgcHJvdG9jb2wgMiB0bworICAgICAgICAgICAgIyB1c2UgdGhlIG1vcmUgZWZmaWNpZW50IE5FV09CSiBvcGNvZGUsIHdoaWxlIHN0aWxsCisgICAgICAgICAgICAjIGFsbG93aW5nIHByb3RvY29sIDAgYW5kIDEgdG8gd29yayBub3JtYWxseS4gIEZvciB0aGlzIHRvCisgICAgICAgICAgICAjIHdvcmssIHRoZSBmdW5jdGlvbiByZXR1cm5lZCBieSBfX3JlZHVjZV9fIHNob3VsZCBiZQorICAgICAgICAgICAgIyBjYWxsZWQgX19uZXdvYmpfXywgYW5kIGl0cyBmaXJzdCBhcmd1bWVudCBzaG91bGQgYmUgYQorICAgICAgICAgICAgIyBuZXctc3R5bGUgY2xhc3MuICBUaGUgaW1wbGVtZW50YXRpb24gZm9yIF9fbmV3b2JqX18KKyAgICAgICAgICAgICMgc2hvdWxkIGJlIGFzIGZvbGxvd3MsIGFsdGhvdWdoIHBpY2tsZSBoYXMgbm8gd2F5IHRvCisgICAgICAgICAgICAjIHZlcmlmeSB0aGlzOgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBkZWYgX19uZXdvYmpfXyhjbHMsICphcmdzKToKKyAgICAgICAgICAgICMgICAgIHJldHVybiBjbHMuX19uZXdfXyhjbHMsICphcmdzKQorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBQcm90b2NvbHMgMCBhbmQgMSB3aWxsIHBpY2tsZSBhIHJlZmVyZW5jZSB0byBfX25ld29ial9fLAorICAgICAgICAgICAgIyB3aGlsZSBwcm90b2NvbCAyIChhbmQgYWJvdmUpIHdpbGwgcGlja2xlIGEgcmVmZXJlbmNlIHRvCisgICAgICAgICAgICAjIGNscywgdGhlIHJlbWFpbmluZyBhcmdzIHR1cGxlLCBhbmQgdGhlIE5FV09CSiBjb2RlLAorICAgICAgICAgICAgIyB3aGljaCBjYWxscyBjbHMuX19uZXdfXyhjbHMsICphcmdzKSBhdCB1bnBpY2tsaW5nIHRpbWUKKyAgICAgICAgICAgICMgKHNlZSBsb2FkX25ld29iaiBiZWxvdykuICBJZiBfX3JlZHVjZV9fIHJldHVybnMgYQorICAgICAgICAgICAgIyB0aHJlZS10dXBsZSwgdGhlIHN0YXRlIGZyb20gdGhlIHRoaXJkIHR1cGxlIGl0ZW0gd2lsbCBiZQorICAgICAgICAgICAgIyBwaWNrbGVkIHJlZ2FyZGxlc3Mgb2YgdGhlIHByb3RvY29sLCBjYWxsaW5nIF9fc2V0c3RhdGVfXworICAgICAgICAgICAgIyBhdCB1bnBpY2tsaW5nIHRpbWUgKHNlZSBsb2FkX2J1aWxkIGJlbG93KS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgTm90ZSB0aGF0IG5vIHN0YW5kYXJkIF9fbmV3b2JqX18gaW1wbGVtZW50YXRpb24gZXhpc3RzOworICAgICAgICAgICAgIyB5b3UgaGF2ZSB0byBwcm92aWRlIHlvdXIgb3duLiAgVGhpcyBpcyB0byBlbmZvcmNlCisgICAgICAgICAgICAjIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi4yIChwaWNrbGVzIHdyaXR0ZW4gdXNpbmcKKyAgICAgICAgICAgICMgcHJvdG9jb2wgMCBvciAxIGluIFB5dGhvbiAyLjMgc2hvdWxkIGJlIHVucGlja2xhYmxlIGJ5CisgICAgICAgICAgICAjIFB5dGhvbiAyLjIpLgorICAgICAgICAgICAgY2xzID0gYXJnc1swXQorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoY2xzLCAiX19uZXdfXyIpOgorICAgICAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJhcmdzWzBdIGZyb20gX19uZXdvYmpfXyBhcmdzIGhhcyBubyBfX25ld19fIikKKyAgICAgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZSBhbmQgY2xzIGlzIG5vdCBvYmouX19jbGFzc19fOgorICAgICAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJhcmdzWzBdIGZyb20gX19uZXdvYmpfXyBhcmdzIGhhcyB0aGUgd3JvbmcgY2xhc3MiKQorICAgICAgICAgICAgYXJncyA9IGFyZ3NbMTpdCisgICAgICAgICAgICBzYXZlKGNscykKKyAgICAgICAgICAgIHNhdmUoYXJncykKKyAgICAgICAgICAgIHdyaXRlKE5FV09CSikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNhdmUoZnVuYykKKyAgICAgICAgICAgIHNhdmUoYXJncykKKyAgICAgICAgICAgIHdyaXRlKFJFRFVDRSkKKworICAgICAgICBpZiBvYmogaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLm1lbW9pemUob2JqKQorCisgICAgICAgICMgTW9yZSBuZXcgc3BlY2lhbCBjYXNlcyAodGhhdCB3b3JrIHdpdGggb2xkZXIgcHJvdG9jb2xzIGFzCisgICAgICAgICMgd2VsbCk6IHdoZW4gX19yZWR1Y2VfXyByZXR1cm5zIGEgdHVwbGUgd2l0aCA0IG9yIDUgaXRlbXMsCisgICAgICAgICMgdGhlIDR0aCBhbmQgNXRoIGl0ZW0gc2hvdWxkIGJlIGl0ZXJhdG9ycyB0aGF0IHByb3ZpZGUgbGlzdAorICAgICAgICAjIGl0ZW1zIGFuZCBkaWN0IGl0ZW1zIChhcyAoa2V5LCB2YWx1ZSkgdHVwbGVzKSwgb3IgTm9uZS4KKworICAgICAgICBpZiBsaXN0aXRlbXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9iYXRjaF9hcHBlbmRzKGxpc3RpdGVtcykKKworICAgICAgICBpZiBkaWN0aXRlbXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9iYXRjaF9zZXRpdGVtcyhkaWN0aXRlbXMpCisKKyAgICAgICAgaWYgc3RhdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzYXZlKHN0YXRlKQorICAgICAgICAgICAgd3JpdGUoQlVJTEQpCisKKyAgICAjIE1ldGhvZHMgYmVsb3cgdGhpcyBwb2ludCBhcmUgZGlzcGF0Y2hlZCB0aHJvdWdoIHRoZSBkaXNwYXRjaCB0YWJsZQorCisgICAgZGlzcGF0Y2ggPSB7fQorCisgICAgZGVmIHNhdmVfbm9uZShzZWxmLCBvYmopOgorICAgICAgICBzZWxmLndyaXRlKE5PTkUpCisgICAgZGlzcGF0Y2hbTm9uZVR5cGVdID0gc2F2ZV9ub25lCisKKyAgICBkZWYgc2F2ZV9ib29sKHNlbGYsIG9iaik6CisgICAgICAgIGlmIHNlbGYucHJvdG8gPj0gMjoKKyAgICAgICAgICAgIHNlbGYud3JpdGUob2JqIGFuZCBORVdUUlVFIG9yIE5FV0ZBTFNFKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZShvYmogYW5kIFRSVUUgb3IgRkFMU0UpCisgICAgZGlzcGF0Y2hbYm9vbF0gPSBzYXZlX2Jvb2wKKworICAgIGRlZiBzYXZlX2ludChzZWxmLCBvYmosIHBhY2s9c3RydWN0LnBhY2spOgorICAgICAgICBpZiBzZWxmLmJpbjoKKyAgICAgICAgICAgICMgSWYgdGhlIGludCBpcyBzbWFsbCBlbm91Z2ggdG8gZml0IGluIGEgc2lnbmVkIDQtYnl0ZSAyJ3MtY29tcAorICAgICAgICAgICAgIyBmb3JtYXQsIHdlIGNhbiBzdG9yZSBpdCBtb3JlIGVmZmljaWVudGx5IHRoYW4gdGhlIGdlbmVyYWwKKyAgICAgICAgICAgICMgY2FzZS4KKyAgICAgICAgICAgICMgRmlyc3Qgb25lLSBhbmQgdHdvLWJ5dGUgdW5zaWduZWQgaW50czoKKyAgICAgICAgICAgIGlmIG9iaiA+PSAwOgorICAgICAgICAgICAgICAgIGlmIG9iaiA8PSAweGZmOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKEJJTklOVDEgKyBjaHIob2JqKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgaWYgb2JqIDw9IDB4ZmZmZjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiJWMlYyVjIiAlIChCSU5JTlQyLCBvYmomMHhmZiwgb2JqPj44KSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAjIE5leHQgY2hlY2sgZm9yIDQtYnl0ZSBzaWduZWQgaW50czoKKyAgICAgICAgICAgIGhpZ2hfYml0cyA9IG9iaiA+PiAzMSAgIyBub3RlIHRoYXQgUHl0aG9uIHNoaWZ0IHNpZ24tZXh0ZW5kcworICAgICAgICAgICAgaWYgaGlnaF9iaXRzID09IDAgb3IgaGlnaF9iaXRzID09IC0xOgorICAgICAgICAgICAgICAgICMgQWxsIGhpZ2ggYml0cyBhcmUgY29waWVzIG9mIGJpdCAyKiozMSwgc28gdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgIyBmaXRzIGluIGEgNC1ieXRlIHNpZ25lZCBpbnQuCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZShCSU5JTlQgKyBwYWNrKCI8aSIsIG9iaikpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgVGV4dCBwaWNrbGUsIG9yIGludCB0b28gYmlnIHRvIGZpdCBpbiBzaWduZWQgNC1ieXRlIGZvcm1hdC4KKyAgICAgICAgc2VsZi53cml0ZShJTlQgKyByZXByKG9iaikgKyAnXG4nKQorICAgIGRpc3BhdGNoW0ludFR5cGVdID0gc2F2ZV9pbnQKKworICAgIGRlZiBzYXZlX2xvbmcoc2VsZiwgb2JqLCBwYWNrPXN0cnVjdC5wYWNrKToKKyAgICAgICAgaWYgc2VsZi5wcm90byA+PSAyOgorICAgICAgICAgICAgYnl0ZXMgPSBlbmNvZGVfbG9uZyhvYmopCisgICAgICAgICAgICBuID0gbGVuKGJ5dGVzKQorICAgICAgICAgICAgaWYgbiA8IDI1NjoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKExPTkcxICsgY2hyKG4pICsgYnl0ZXMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoTE9ORzQgKyBwYWNrKCI8aSIsIG4pICsgYnl0ZXMpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi53cml0ZShMT05HICsgcmVwcihvYmopICsgJ1xuJykKKyAgICBkaXNwYXRjaFtMb25nVHlwZV0gPSBzYXZlX2xvbmcKKworICAgIGRlZiBzYXZlX2Zsb2F0KHNlbGYsIG9iaiwgcGFjaz1zdHJ1Y3QucGFjayk6CisgICAgICAgIGlmIHNlbGYuYmluOgorICAgICAgICAgICAgc2VsZi53cml0ZShCSU5GTE9BVCArIHBhY2soJz5kJywgb2JqKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoRkxPQVQgKyByZXByKG9iaikgKyAnXG4nKQorICAgIGRpc3BhdGNoW0Zsb2F0VHlwZV0gPSBzYXZlX2Zsb2F0CisKKyAgICBkZWYgc2F2ZV9zdHJpbmcoc2VsZiwgb2JqLCBwYWNrPXN0cnVjdC5wYWNrKToKKyAgICAgICAgaWYgc2VsZi5iaW46CisgICAgICAgICAgICBuID0gbGVuKG9iaikKKyAgICAgICAgICAgIGlmIG4gPCAyNTY6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZShTSE9SVF9CSU5TVFJJTkcgKyBjaHIobikgKyBvYmopCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoQklOU1RSSU5HICsgcGFjaygiPGkiLCBuKSArIG9iaikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGUoU1RSSU5HICsgcmVwcihvYmopICsgJ1xuJykKKyAgICAgICAgc2VsZi5tZW1vaXplKG9iaikKKyAgICBkaXNwYXRjaFtTdHJpbmdUeXBlXSA9IHNhdmVfc3RyaW5nCisKKyAgICBkZWYgc2F2ZV91bmljb2RlKHNlbGYsIG9iaiwgcGFjaz1zdHJ1Y3QucGFjayk6CisgICAgICAgIGlmIHNlbGYuYmluOgorICAgICAgICAgICAgZW5jb2RpbmcgPSBvYmouZW5jb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBuID0gbGVuKGVuY29kaW5nKQorICAgICAgICAgICAgc2VsZi53cml0ZShCSU5VTklDT0RFICsgcGFjaygiPGkiLCBuKSArIGVuY29kaW5nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2JqID0gb2JqLnJlcGxhY2UoIlxcIiwgIlxcdTAwNWMiKQorICAgICAgICAgICAgb2JqID0gb2JqLnJlcGxhY2UoIlxuIiwgIlxcdTAwMGEiKQorICAgICAgICAgICAgc2VsZi53cml0ZShVTklDT0RFICsgb2JqLmVuY29kZSgncmF3LXVuaWNvZGUtZXNjYXBlJykgKyAnXG4nKQorICAgICAgICBzZWxmLm1lbW9pemUob2JqKQorICAgIGRpc3BhdGNoW1VuaWNvZGVUeXBlXSA9IHNhdmVfdW5pY29kZQorCisgICAgaWYgU3RyaW5nVHlwZSBpcyBVbmljb2RlVHlwZToKKyAgICAgICAgIyBUaGlzIGlzIHRydWUgZm9yIEp5dGhvbgorICAgICAgICBkZWYgc2F2ZV9zdHJpbmcoc2VsZiwgb2JqLCBwYWNrPXN0cnVjdC5wYWNrKToKKyAgICAgICAgICAgIHVuaWNvZGUgPSBvYmouaXN1bmljb2RlKCkKKworICAgICAgICAgICAgaWYgc2VsZi5iaW46CisgICAgICAgICAgICAgICAgaWYgdW5pY29kZToKKyAgICAgICAgICAgICAgICAgICAgb2JqID0gb2JqLmVuY29kZSgidXRmLTgiKQorICAgICAgICAgICAgICAgIGwgPSBsZW4ob2JqKQorICAgICAgICAgICAgICAgIGlmIGwgPCAyNTYgYW5kIG5vdCB1bmljb2RlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKFNIT1JUX0JJTlNUUklORyArIGNocihsKSArIG9iaikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzID0gcGFjaygiPGkiLCBsKQorICAgICAgICAgICAgICAgICAgICBpZiB1bmljb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZShCSU5VTklDT0RFICsgcyArIG9iaikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoQklOU1RSSU5HICsgcyArIG9iaikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgdW5pY29kZToKKyAgICAgICAgICAgICAgICAgICAgb2JqID0gb2JqLnJlcGxhY2UoIlxcIiwgIlxcdTAwNWMiKQorICAgICAgICAgICAgICAgICAgICBvYmogPSBvYmoucmVwbGFjZSgiXG4iLCAiXFx1MDAwYSIpCisgICAgICAgICAgICAgICAgICAgIG9iaiA9IG9iai5lbmNvZGUoJ3Jhdy11bmljb2RlLWVzY2FwZScpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoVU5JQ09ERSArIG9iaiArICdcbicpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZShTVFJJTkcgKyByZXByKG9iaikgKyAnXG4nKQorICAgICAgICAgICAgc2VsZi5tZW1vaXplKG9iaikKKyAgICAgICAgZGlzcGF0Y2hbU3RyaW5nVHlwZV0gPSBzYXZlX3N0cmluZworCisgICAgZGVmIHNhdmVfdHVwbGUoc2VsZiwgb2JqKToKKyAgICAgICAgd3JpdGUgPSBzZWxmLndyaXRlCisgICAgICAgIHByb3RvID0gc2VsZi5wcm90bworCisgICAgICAgIG4gPSBsZW4ob2JqKQorICAgICAgICBpZiBuID09IDA6CisgICAgICAgICAgICBpZiBwcm90bzoKKyAgICAgICAgICAgICAgICB3cml0ZShFTVBUWV9UVVBMRSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd3JpdGUoTUFSSyArIFRVUExFKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2F2ZSA9IHNlbGYuc2F2ZQorICAgICAgICBtZW1vID0gc2VsZi5tZW1vCisgICAgICAgIGlmIG4gPD0gMyBhbmQgcHJvdG8gPj0gMjoKKyAgICAgICAgICAgIGZvciBlbGVtZW50IGluIG9iajoKKyAgICAgICAgICAgICAgICBzYXZlKGVsZW1lbnQpCisgICAgICAgICAgICAjIFN1YnRsZS4gIFNhbWUgYXMgaW4gdGhlIGJpZyBjb21tZW50IGJlbG93LgorICAgICAgICAgICAgaWYgaWQob2JqKSBpbiBtZW1vOgorICAgICAgICAgICAgICAgIGdldCA9IHNlbGYuZ2V0KG1lbW9baWQob2JqKV1bMF0pCisgICAgICAgICAgICAgICAgd3JpdGUoUE9QICogbiArIGdldCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd3JpdGUoX3R1cGxlc2l6ZTJjb2RlW25dKQorICAgICAgICAgICAgICAgIHNlbGYubWVtb2l6ZShvYmopCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIHByb3RvIDAgb3IgcHJvdG8gMSBhbmQgdHVwbGUgaXNuJ3QgZW1wdHksIG9yIHByb3RvID4gMSBhbmQgdHVwbGUKKyAgICAgICAgIyBoYXMgbW9yZSB0aGFuIDMgZWxlbWVudHMuCisgICAgICAgIHdyaXRlKE1BUkspCisgICAgICAgIGZvciBlbGVtZW50IGluIG9iajoKKyAgICAgICAgICAgIHNhdmUoZWxlbWVudCkKKworICAgICAgICBpZiBpZChvYmopIGluIG1lbW86CisgICAgICAgICAgICAjIFN1YnRsZS4gIGQgd2FzIG5vdCBpbiBtZW1vIHdoZW4gd2UgZW50ZXJlZCBzYXZlX3R1cGxlKCksIHNvCisgICAgICAgICAgICAjIHRoZSBwcm9jZXNzIG9mIHNhdmluZyB0aGUgdHVwbGUncyBlbGVtZW50cyBtdXN0IGhhdmUgc2F2ZWQKKyAgICAgICAgICAgICMgdGhlIHR1cGxlIGl0c2VsZjogIHRoZSB0dXBsZSBpcyByZWN1cnNpdmUuICBUaGUgcHJvcGVyIGFjdGlvbgorICAgICAgICAgICAgIyBub3cgaXMgdG8gdGhyb3cgYXdheSBldmVyeXRoaW5nIHdlIHB1dCBvbiB0aGUgc3RhY2ssIGFuZAorICAgICAgICAgICAgIyBzaW1wbHkgR0VUIHRoZSB0dXBsZSAoaXQncyBhbHJlYWR5IGNvbnN0cnVjdGVkKS4gIFRoaXMgY2hlY2sKKyAgICAgICAgICAgICMgY291bGQgaGF2ZSBiZWVuIGRvbmUgaW4gdGhlICJmb3IgZWxlbWVudCIgbG9vcCBpbnN0ZWFkLCBidXQKKyAgICAgICAgICAgICMgcmVjdXJzaXZlIHR1cGxlcyBhcmUgYSByYXJlIHRoaW5nLgorICAgICAgICAgICAgZ2V0ID0gc2VsZi5nZXQobWVtb1tpZChvYmopXVswXSkKKyAgICAgICAgICAgIGlmIHByb3RvOgorICAgICAgICAgICAgICAgIHdyaXRlKFBPUF9NQVJLICsgZ2V0KQorICAgICAgICAgICAgZWxzZTogICAjIHByb3RvIDAgLS0gUE9QX01BUksgbm90IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIHdyaXRlKFBPUCAqIChuKzEpICsgZ2V0KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBObyByZWN1cnNpb24uCisgICAgICAgIHNlbGYud3JpdGUoVFVQTEUpCisgICAgICAgIHNlbGYubWVtb2l6ZShvYmopCisKKyAgICBkaXNwYXRjaFtUdXBsZVR5cGVdID0gc2F2ZV90dXBsZQorCisgICAgIyBzYXZlX2VtcHR5X3R1cGxlKCkgaXNuJ3QgdXNlZCBieSBhbnl0aGluZyBpbiBQeXRob24gMi4zLiAgSG93ZXZlciwgSQorICAgICMgZm91bmQgYSBQaWNrbGVyIHN1YmNsYXNzIGluIFpvcGUzIHRoYXQgY2FsbHMgaXQsIHNvIGl0J3Mgbm90IGhhcm1sZXNzCisgICAgIyB0byByZW1vdmUgaXQuCisgICAgZGVmIHNhdmVfZW1wdHlfdHVwbGUoc2VsZiwgb2JqKToKKyAgICAgICAgc2VsZi53cml0ZShFTVBUWV9UVVBMRSkKKworICAgIGRlZiBzYXZlX2xpc3Qoc2VsZiwgb2JqKToKKyAgICAgICAgd3JpdGUgPSBzZWxmLndyaXRlCisKKyAgICAgICAgaWYgc2VsZi5iaW46CisgICAgICAgICAgICB3cml0ZShFTVBUWV9MSVNUKQorICAgICAgICBlbHNlOiAgICMgcHJvdG8gMCAtLSBjYW4ndCB1c2UgRU1QVFlfTElTVAorICAgICAgICAgICAgd3JpdGUoTUFSSyArIExJU1QpCisKKyAgICAgICAgc2VsZi5tZW1vaXplKG9iaikKKyAgICAgICAgc2VsZi5fYmF0Y2hfYXBwZW5kcyhpdGVyKG9iaikpCisKKyAgICBkaXNwYXRjaFtMaXN0VHlwZV0gPSBzYXZlX2xpc3QKKworICAgICMgS2VlcCBpbiBzeW5jaCB3aXRoIGNQaWNrbGUncyBCQVRDSFNJWkUuICBOb3RoaW5nIHdpbGwgYnJlYWsgaWYgaXQgZ2V0cworICAgICMgb3V0IG9mIHN5bmNoLCB0aG91Z2guCisgICAgX0JBVENIU0laRSA9IDEwMDAKKworICAgIGRlZiBfYmF0Y2hfYXBwZW5kcyhzZWxmLCBpdGVtcyk6CisgICAgICAgICMgSGVscGVyIHRvIGJhdGNoIHVwIEFQUEVORFMgc2VxdWVuY2VzCisgICAgICAgIHNhdmUgPSBzZWxmLnNhdmUKKyAgICAgICAgd3JpdGUgPSBzZWxmLndyaXRlCisKKyAgICAgICAgaWYgbm90IHNlbGYuYmluOgorICAgICAgICAgICAgZm9yIHggaW4gaXRlbXM6CisgICAgICAgICAgICAgICAgc2F2ZSh4KQorICAgICAgICAgICAgICAgIHdyaXRlKEFQUEVORCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHIgPSB4cmFuZ2Uoc2VsZi5fQkFUQ0hTSVpFKQorICAgICAgICB3aGlsZSBpdGVtcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRtcCA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgeCA9IGl0ZW1zLm5leHQoKQorICAgICAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKHgpCisgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgIGl0ZW1zID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgbiA9IGxlbih0bXApCisgICAgICAgICAgICBpZiBuID4gMToKKyAgICAgICAgICAgICAgICB3cml0ZShNQVJLKQorICAgICAgICAgICAgICAgIGZvciB4IGluIHRtcDoKKyAgICAgICAgICAgICAgICAgICAgc2F2ZSh4KQorICAgICAgICAgICAgICAgIHdyaXRlKEFQUEVORFMpCisgICAgICAgICAgICBlbGlmIG46CisgICAgICAgICAgICAgICAgc2F2ZSh0bXBbMF0pCisgICAgICAgICAgICAgICAgd3JpdGUoQVBQRU5EKQorICAgICAgICAgICAgIyBlbHNlIHRtcCBpcyBlbXB0eSwgYW5kIHdlJ3JlIGRvbmUKKworICAgIGRlZiBzYXZlX2RpY3Qoc2VsZiwgb2JqKToKKyAgICAgICAgd3JpdGUgPSBzZWxmLndyaXRlCisKKyAgICAgICAgaWYgc2VsZi5iaW46CisgICAgICAgICAgICB3cml0ZShFTVBUWV9ESUNUKQorICAgICAgICBlbHNlOiAgICMgcHJvdG8gMCAtLSBjYW4ndCB1c2UgRU1QVFlfRElDVAorICAgICAgICAgICAgd3JpdGUoTUFSSyArIERJQ1QpCisKKyAgICAgICAgc2VsZi5tZW1vaXplKG9iaikKKyAgICAgICAgc2VsZi5fYmF0Y2hfc2V0aXRlbXMob2JqLml0ZXJpdGVtcygpKQorCisgICAgZGlzcGF0Y2hbRGljdGlvbmFyeVR5cGVdID0gc2F2ZV9kaWN0CisgICAgaWYgbm90IFB5U3RyaW5nTWFwIGlzIE5vbmU6CisgICAgICAgIGRpc3BhdGNoW1B5U3RyaW5nTWFwXSA9IHNhdmVfZGljdAorCisgICAgZGVmIF9iYXRjaF9zZXRpdGVtcyhzZWxmLCBpdGVtcyk6CisgICAgICAgICMgSGVscGVyIHRvIGJhdGNoIHVwIFNFVElURU1TIHNlcXVlbmNlczsgcHJvdG8gPj0gMSBvbmx5CisgICAgICAgIHNhdmUgPSBzZWxmLnNhdmUKKyAgICAgICAgd3JpdGUgPSBzZWxmLndyaXRlCisKKyAgICAgICAgaWYgbm90IHNlbGYuYmluOgorICAgICAgICAgICAgZm9yIGssIHYgaW4gaXRlbXM6CisgICAgICAgICAgICAgICAgc2F2ZShrKQorICAgICAgICAgICAgICAgIHNhdmUodikKKyAgICAgICAgICAgICAgICB3cml0ZShTRVRJVEVNKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgciA9IHhyYW5nZShzZWxmLl9CQVRDSFNJWkUpCisgICAgICAgIHdoaWxlIGl0ZW1zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdG1wID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHI6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKGl0ZW1zLm5leHQoKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBuID0gbGVuKHRtcCkKKyAgICAgICAgICAgIGlmIG4gPiAxOgorICAgICAgICAgICAgICAgIHdyaXRlKE1BUkspCisgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gdG1wOgorICAgICAgICAgICAgICAgICAgICBzYXZlKGspCisgICAgICAgICAgICAgICAgICAgIHNhdmUodikKKyAgICAgICAgICAgICAgICB3cml0ZShTRVRJVEVNUykKKyAgICAgICAgICAgIGVsaWYgbjoKKyAgICAgICAgICAgICAgICBrLCB2ID0gdG1wWzBdCisgICAgICAgICAgICAgICAgc2F2ZShrKQorICAgICAgICAgICAgICAgIHNhdmUodikKKyAgICAgICAgICAgICAgICB3cml0ZShTRVRJVEVNKQorICAgICAgICAgICAgIyBlbHNlIHRtcCBpcyBlbXB0eSwgYW5kIHdlJ3JlIGRvbmUKKworICAgIGRlZiBzYXZlX2luc3Qoc2VsZiwgb2JqKToKKyAgICAgICAgY2xzID0gb2JqLl9fY2xhc3NfXworCisgICAgICAgIG1lbW8gID0gc2VsZi5tZW1vCisgICAgICAgIHdyaXRlID0gc2VsZi53cml0ZQorICAgICAgICBzYXZlICA9IHNlbGYuc2F2ZQorCisgICAgICAgIGlmIGhhc2F0dHIob2JqLCAnX19nZXRpbml0YXJnc19fJyk6CisgICAgICAgICAgICBhcmdzID0gb2JqLl9fZ2V0aW5pdGFyZ3NfXygpCisgICAgICAgICAgICBsZW4oYXJncykgIyBYWFggQXNzZXJ0IGl0J3MgYSBzZXF1ZW5jZQorICAgICAgICAgICAgX2tlZXBfYWxpdmUoYXJncywgbWVtbykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZ3MgPSAoKQorCisgICAgICAgIHdyaXRlKE1BUkspCisKKyAgICAgICAgaWYgc2VsZi5iaW46CisgICAgICAgICAgICBzYXZlKGNscykKKyAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgICAgICBzYXZlKGFyZykKKyAgICAgICAgICAgIHdyaXRlKE9CSikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgICAgICBzYXZlKGFyZykKKyAgICAgICAgICAgIHdyaXRlKElOU1QgKyBjbHMuX19tb2R1bGVfXyArICdcbicgKyBjbHMuX19uYW1lX18gKyAnXG4nKQorCisgICAgICAgIHNlbGYubWVtb2l6ZShvYmopCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZ2V0c3RhdGUgPSBvYmouX19nZXRzdGF0ZV9fCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHN0dWZmID0gb2JqLl9fZGljdF9fCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdHVmZiA9IGdldHN0YXRlKCkKKyAgICAgICAgICAgIF9rZWVwX2FsaXZlKHN0dWZmLCBtZW1vKQorICAgICAgICBzYXZlKHN0dWZmKQorICAgICAgICB3cml0ZShCVUlMRCkKKworICAgIGRpc3BhdGNoW0luc3RhbmNlVHlwZV0gPSBzYXZlX2luc3QKKworICAgIGRlZiBzYXZlX2dsb2JhbChzZWxmLCBvYmosIG5hbWU9Tm9uZSwgcGFjaz1zdHJ1Y3QucGFjayk6CisgICAgICAgIHdyaXRlID0gc2VsZi53cml0ZQorICAgICAgICBtZW1vID0gc2VsZi5tZW1vCisKKyAgICAgICAgaWYgbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgbmFtZSA9IG9iai5fX25hbWVfXworCisgICAgICAgIG1vZHVsZSA9IGdldGF0dHIob2JqLCAiX19tb2R1bGVfXyIsIE5vbmUpCisgICAgICAgIGlmIG1vZHVsZSBpcyBOb25lOgorICAgICAgICAgICAgbW9kdWxlID0gd2hpY2htb2R1bGUob2JqLCBuYW1lKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9faW1wb3J0X18obW9kdWxlKQorICAgICAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbbW9kdWxlXQorICAgICAgICAgICAga2xhc3MgPSBnZXRhdHRyKG1vZCwgbmFtZSkKKyAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgS2V5RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoCisgICAgICAgICAgICAgICAgIkNhbid0IHBpY2tsZSAlcjogaXQncyBub3QgZm91bmQgYXMgJXMuJXMiICUKKyAgICAgICAgICAgICAgICAob2JqLCBtb2R1bGUsIG5hbWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYga2xhc3MgaXMgbm90IG9iajoKKyAgICAgICAgICAgICAgICByYWlzZSBQaWNrbGluZ0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgcGlja2xlICVyOiBpdCdzIG5vdCB0aGUgc2FtZSBvYmplY3QgYXMgJXMuJXMiICUKKyAgICAgICAgICAgICAgICAgICAgKG9iaiwgbW9kdWxlLCBuYW1lKSkKKworICAgICAgICBpZiBzZWxmLnByb3RvID49IDI6CisgICAgICAgICAgICBjb2RlID0gX2V4dGVuc2lvbl9yZWdpc3RyeS5nZXQoKG1vZHVsZSwgbmFtZSkpCisgICAgICAgICAgICBpZiBjb2RlOgorICAgICAgICAgICAgICAgIGFzc2VydCBjb2RlID4gMAorICAgICAgICAgICAgICAgIGlmIGNvZGUgPD0gMHhmZjoKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoRVhUMSArIGNocihjb2RlKSkKKyAgICAgICAgICAgICAgICBlbGlmIGNvZGUgPD0gMHhmZmZmOgorICAgICAgICAgICAgICAgICAgICB3cml0ZSgiJWMlYyVjIiAlIChFWFQyLCBjb2RlJjB4ZmYsIGNvZGU+PjgpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlKEVYVDQgKyBwYWNrKCI8aSIsIGNvZGUpKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHdyaXRlKEdMT0JBTCArIG1vZHVsZSArICdcbicgKyBuYW1lICsgJ1xuJykKKyAgICAgICAgc2VsZi5tZW1vaXplKG9iaikKKworICAgIGRpc3BhdGNoW0NsYXNzVHlwZV0gPSBzYXZlX2dsb2JhbAorICAgIGRpc3BhdGNoW0Z1bmN0aW9uVHlwZV0gPSBzYXZlX2dsb2JhbAorICAgIGRpc3BhdGNoW0J1aWx0aW5GdW5jdGlvblR5cGVdID0gc2F2ZV9nbG9iYWwKKyAgICBkaXNwYXRjaFtUeXBlVHlwZV0gPSBzYXZlX2dsb2JhbAorCisjIFBpY2tsaW5nIGhlbHBlcnMKKworZGVmIF9rZWVwX2FsaXZlKHgsIG1lbW8pOgorICAgICIiIktlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgeCBpbiB0aGUgbWVtby4KKworICAgIEJlY2F1c2Ugd2UgcmVtZW1iZXIgb2JqZWN0cyBieSB0aGVpciBpZCwgd2UgaGF2ZQorICAgIHRvIGFzc3VyZSB0aGF0IHBvc3NpYmx5IHRlbXBvcmFyeSBvYmplY3RzIGFyZSBrZXB0CisgICAgYWxpdmUgYnkgcmVmZXJlbmNpbmcgdGhlbS4KKyAgICBXZSBzdG9yZSBhIHJlZmVyZW5jZSBhdCB0aGUgaWQgb2YgdGhlIG1lbW8sIHdoaWNoIHNob3VsZAorICAgIG5vcm1hbGx5IG5vdCBiZSB1c2VkIHVubGVzcyBzb21lb25lIHRyaWVzIHRvIGRlZXBjb3B5CisgICAgdGhlIG1lbW8gaXRzZWxmLi4uCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBtZW1vW2lkKG1lbW8pXS5hcHBlbmQoeCkKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICMgYWhhLCB0aGlzIGlzIHRoZSBmaXJzdCBvbmUgOi0pCisgICAgICAgIG1lbW9baWQobWVtbyldPVt4XQorCisKKyMgQSBjYWNoZSBmb3Igd2hpY2htb2R1bGUoKSwgbWFwcGluZyBhIGZ1bmN0aW9uIG9iamVjdCB0byB0aGUgbmFtZSBvZgorIyB0aGUgbW9kdWxlIGluIHdoaWNoIHRoZSBmdW5jdGlvbiB3YXMgZm91bmQuCisKK2NsYXNzbWFwID0ge30gIyBjYWxsZWQgY2xhc3NtYXAgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisKK2RlZiB3aGljaG1vZHVsZShmdW5jLCBmdW5jbmFtZSk6CisgICAgIiIiRmlndXJlIG91dCB0aGUgbW9kdWxlIGluIHdoaWNoIGEgZnVuY3Rpb24gb2NjdXJzLgorCisgICAgU2VhcmNoIHN5cy5tb2R1bGVzIGZvciB0aGUgbW9kdWxlLgorICAgIENhY2hlIGluIGNsYXNzbWFwLgorICAgIFJldHVybiBhIG1vZHVsZSBuYW1lLgorICAgIElmIHRoZSBmdW5jdGlvbiBjYW5ub3QgYmUgZm91bmQsIHJldHVybiAiX19tYWluX18iLgorICAgICIiIgorICAgICMgUHl0aG9uIGZ1bmN0aW9ucyBzaG91bGQgYWx3YXlzIGdldCBhbiBfX21vZHVsZV9fIGZyb20gdGhlaXIgZ2xvYmFscy4KKyAgICBtb2QgPSBnZXRhdHRyKGZ1bmMsICJfX21vZHVsZV9fIiwgTm9uZSkKKyAgICBpZiBtb2QgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBtb2QKKyAgICBpZiBmdW5jIGluIGNsYXNzbWFwOgorICAgICAgICByZXR1cm4gY2xhc3NtYXBbZnVuY10KKworICAgIGZvciBuYW1lLCBtb2R1bGUgaW4gc3lzLm1vZHVsZXMuaXRlbXMoKToKKyAgICAgICAgaWYgbW9kdWxlIGlzIE5vbmU6CisgICAgICAgICAgICBjb250aW51ZSAjIHNraXAgZHVtbXkgcGFja2FnZSBlbnRyaWVzCisgICAgICAgIGlmIG5hbWUgIT0gJ19fbWFpbl9fJyBhbmQgZ2V0YXR0cihtb2R1bGUsIGZ1bmNuYW1lLCBOb25lKSBpcyBmdW5jOgorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICBuYW1lID0gJ19fbWFpbl9fJworICAgIGNsYXNzbWFwW2Z1bmNdID0gbmFtZQorICAgIHJldHVybiBuYW1lCisKKworIyBVbnBpY2tsaW5nIG1hY2hpbmVyeQorCitjbGFzcyBVbnBpY2tsZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSk6CisgICAgICAgICIiIlRoaXMgdGFrZXMgYSBmaWxlLWxpa2Ugb2JqZWN0IGZvciByZWFkaW5nIGEgcGlja2xlIGRhdGEgc3RyZWFtLgorCisgICAgICAgIFRoZSBwcm90b2NvbCB2ZXJzaW9uIG9mIHRoZSBwaWNrbGUgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSwgc28gbm8KKyAgICAgICAgcHJvdG8gYXJndW1lbnQgaXMgbmVlZGVkLgorCisgICAgICAgIFRoZSBmaWxlLWxpa2Ugb2JqZWN0IG11c3QgaGF2ZSB0d28gbWV0aG9kcywgYSByZWFkKCkgbWV0aG9kIHRoYXQKKyAgICAgICAgdGFrZXMgYW4gaW50ZWdlciBhcmd1bWVudCwgYW5kIGEgcmVhZGxpbmUoKSBtZXRob2QgdGhhdCByZXF1aXJlcyBubworICAgICAgICBhcmd1bWVudHMuICBCb3RoIG1ldGhvZHMgc2hvdWxkIHJldHVybiBhIHN0cmluZy4gIFRodXMgZmlsZS1saWtlCisgICAgICAgIG9iamVjdCBjYW4gYmUgYSBmaWxlIG9iamVjdCBvcGVuZWQgZm9yIHJlYWRpbmcsIGEgU3RyaW5nSU8gb2JqZWN0LAorICAgICAgICBvciBhbnkgb3RoZXIgY3VzdG9tIG9iamVjdCB0aGF0IG1lZXRzIHRoaXMgaW50ZXJmYWNlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5yZWFkbGluZSA9IGZpbGUucmVhZGxpbmUKKyAgICAgICAgc2VsZi5yZWFkID0gZmlsZS5yZWFkCisgICAgICAgIHNlbGYubWVtbyA9IHt9CisKKyAgICBkZWYgbG9hZChzZWxmKToKKyAgICAgICAgIiIiUmVhZCBhIHBpY2tsZWQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIGZyb20gdGhlIG9wZW4gZmlsZS4KKworICAgICAgICBSZXR1cm4gdGhlIHJlY29uc3RpdHV0ZWQgb2JqZWN0IGhpZXJhcmNoeSBzcGVjaWZpZWQgaW4gdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm1hcmsgPSBvYmplY3QoKSAjIGFueSBuZXcgdW5pcXVlIG9iamVjdAorICAgICAgICBzZWxmLnN0YWNrID0gW10KKyAgICAgICAgc2VsZi5hcHBlbmQgPSBzZWxmLnN0YWNrLmFwcGVuZAorICAgICAgICByZWFkID0gc2VsZi5yZWFkCisgICAgICAgIGRpc3BhdGNoID0gc2VsZi5kaXNwYXRjaAorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGtleSA9IHJlYWQoMSkKKyAgICAgICAgICAgICAgICBkaXNwYXRjaFtrZXldKHNlbGYpCisgICAgICAgIGV4Y2VwdCBfU3RvcCwgc3RvcGluc3Q6CisgICAgICAgICAgICByZXR1cm4gc3RvcGluc3QudmFsdWUKKworICAgICMgUmV0dXJuIGxhcmdlc3QgaW5kZXggayBzdWNoIHRoYXQgc2VsZi5zdGFja1trXSBpcyBzZWxmLm1hcmsuCisgICAgIyBJZiB0aGUgc3RhY2sgZG9lc24ndCBjb250YWluIGEgbWFyaywgZXZlbnR1YWxseSByYWlzZXMgSW5kZXhFcnJvci4KKyAgICAjIFRoaXMgY291bGQgYmUgc3BlZCBieSBtYWludGFpbmluZyBhbm90aGVyIHN0YWNrLCBvZiBpbmRpY2VzIGF0IHdoaWNoCisgICAgIyB0aGUgbWFyayBhcHBlYXJzLiAgRm9yIHRoYXQgbWF0dGVyLCB0aGUgbGF0dGVyIHN0YWNrIHdvdWxkIHN1ZmZpY2UsCisgICAgIyBhbmQgd2Ugd291bGRuJ3QgbmVlZCB0byBwdXNoIG1hcmsgb2JqZWN0cyBvbiBzZWxmLnN0YWNrIGF0IGFsbC4KKyAgICAjIERvaW5nIHNvIGlzIHByb2JhYmx5IGEgZ29vZCB0aGluZywgdGhvdWdoLCBzaW5jZSBpZiB0aGUgcGlja2xlIGlzCisgICAgIyBjb3JydXB0IChvciBob3N0aWxlKSB3ZSBtYXkgZ2V0IGEgY2x1ZSBmcm9tIGZpbmRpbmcgc2VsZi5tYXJrIGVtYmVkZGVkCisgICAgIyBpbiB1bnBpY2tsZWQgb2JqZWN0cy4KKyAgICBkZWYgbWFya2VyKHNlbGYpOgorICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKKyAgICAgICAgbWFyayA9IHNlbGYubWFyaworICAgICAgICBrID0gbGVuKHN0YWNrKS0xCisgICAgICAgIHdoaWxlIHN0YWNrW2tdIGlzIG5vdCBtYXJrOiBrID0gay0xCisgICAgICAgIHJldHVybiBrCisKKyAgICBkaXNwYXRjaCA9IHt9CisKKyAgICBkZWYgbG9hZF9lb2Yoc2VsZik6CisgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgZGlzcGF0Y2hbJyddID0gbG9hZF9lb2YKKworICAgIGRlZiBsb2FkX3Byb3RvKHNlbGYpOgorICAgICAgICBwcm90byA9IG9yZChzZWxmLnJlYWQoMSkpCisgICAgICAgIGlmIG5vdCAwIDw9IHByb3RvIDw9IDI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidW5zdXBwb3J0ZWQgcGlja2xlIHByb3RvY29sOiAlZCIgJSBwcm90bworICAgIGRpc3BhdGNoW1BST1RPXSA9IGxvYWRfcHJvdG8KKworICAgIGRlZiBsb2FkX3BlcnNpZChzZWxmKToKKyAgICAgICAgcGlkID0gc2VsZi5yZWFkbGluZSgpWzotMV0KKyAgICAgICAgc2VsZi5hcHBlbmQoc2VsZi5wZXJzaXN0ZW50X2xvYWQocGlkKSkKKyAgICBkaXNwYXRjaFtQRVJTSURdID0gbG9hZF9wZXJzaWQKKworICAgIGRlZiBsb2FkX2JpbnBlcnNpZChzZWxmKToKKyAgICAgICAgcGlkID0gc2VsZi5zdGFjay5wb3AoKQorICAgICAgICBzZWxmLmFwcGVuZChzZWxmLnBlcnNpc3RlbnRfbG9hZChwaWQpKQorICAgIGRpc3BhdGNoW0JJTlBFUlNJRF0gPSBsb2FkX2JpbnBlcnNpZAorCisgICAgZGVmIGxvYWRfbm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5hcHBlbmQoTm9uZSkKKyAgICBkaXNwYXRjaFtOT05FXSA9IGxvYWRfbm9uZQorCisgICAgZGVmIGxvYWRfZmFsc2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXBwZW5kKEZhbHNlKQorICAgIGRpc3BhdGNoW05FV0ZBTFNFXSA9IGxvYWRfZmFsc2UKKworICAgIGRlZiBsb2FkX3RydWUoc2VsZik6CisgICAgICAgIHNlbGYuYXBwZW5kKFRydWUpCisgICAgZGlzcGF0Y2hbTkVXVFJVRV0gPSBsb2FkX3RydWUKKworICAgIGRlZiBsb2FkX2ludChzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICBpZiBkYXRhID09IEZBTFNFWzE6XToKKyAgICAgICAgICAgIHZhbCA9IEZhbHNlCisgICAgICAgIGVsaWYgZGF0YSA9PSBUUlVFWzE6XToKKyAgICAgICAgICAgIHZhbCA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWwgPSBpbnQoZGF0YSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHZhbCA9IGxvbmcoZGF0YSkKKyAgICAgICAgc2VsZi5hcHBlbmQodmFsKQorICAgIGRpc3BhdGNoW0lOVF0gPSBsb2FkX2ludAorCisgICAgZGVmIGxvYWRfYmluaW50KHNlbGYpOgorICAgICAgICBzZWxmLmFwcGVuZChtbG9hZHMoJ2knICsgc2VsZi5yZWFkKDQpKSkKKyAgICBkaXNwYXRjaFtCSU5JTlRdID0gbG9hZF9iaW5pbnQKKworICAgIGRlZiBsb2FkX2JpbmludDEoc2VsZik6CisgICAgICAgIHNlbGYuYXBwZW5kKG9yZChzZWxmLnJlYWQoMSkpKQorICAgIGRpc3BhdGNoW0JJTklOVDFdID0gbG9hZF9iaW5pbnQxCisKKyAgICBkZWYgbG9hZF9iaW5pbnQyKHNlbGYpOgorICAgICAgICBzZWxmLmFwcGVuZChtbG9hZHMoJ2knICsgc2VsZi5yZWFkKDIpICsgJ1wwMDBcMDAwJykpCisgICAgZGlzcGF0Y2hbQklOSU5UMl0gPSBsb2FkX2JpbmludDIKKworICAgIGRlZiBsb2FkX2xvbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXBwZW5kKGxvbmcoc2VsZi5yZWFkbGluZSgpWzotMV0sIDApKQorICAgIGRpc3BhdGNoW0xPTkddID0gbG9hZF9sb25nCisKKyAgICBkZWYgbG9hZF9sb25nMShzZWxmKToKKyAgICAgICAgbiA9IG9yZChzZWxmLnJlYWQoMSkpCisgICAgICAgIGJ5dGVzID0gc2VsZi5yZWFkKG4pCisgICAgICAgIHNlbGYuYXBwZW5kKGRlY29kZV9sb25nKGJ5dGVzKSkKKyAgICBkaXNwYXRjaFtMT05HMV0gPSBsb2FkX2xvbmcxCisKKyAgICBkZWYgbG9hZF9sb25nNChzZWxmKToKKyAgICAgICAgbiA9IG1sb2FkcygnaScgKyBzZWxmLnJlYWQoNCkpCisgICAgICAgIGJ5dGVzID0gc2VsZi5yZWFkKG4pCisgICAgICAgIHNlbGYuYXBwZW5kKGRlY29kZV9sb25nKGJ5dGVzKSkKKyAgICBkaXNwYXRjaFtMT05HNF0gPSBsb2FkX2xvbmc0CisKKyAgICBkZWYgbG9hZF9mbG9hdChzZWxmKToKKyAgICAgICAgc2VsZi5hcHBlbmQoZmxvYXQoc2VsZi5yZWFkbGluZSgpWzotMV0pKQorICAgIGRpc3BhdGNoW0ZMT0FUXSA9IGxvYWRfZmxvYXQKKworICAgIGRlZiBsb2FkX2JpbmZsb2F0KHNlbGYsIHVucGFjaz1zdHJ1Y3QudW5wYWNrKToKKyAgICAgICAgc2VsZi5hcHBlbmQodW5wYWNrKCc+ZCcsIHNlbGYucmVhZCg4KSlbMF0pCisgICAgZGlzcGF0Y2hbQklORkxPQVRdID0gbG9hZF9iaW5mbG9hdAorCisgICAgZGVmIGxvYWRfc3RyaW5nKHNlbGYpOgorICAgICAgICByZXAgPSBzZWxmLnJlYWRsaW5lKClbOi0xXQorICAgICAgICBmb3IgcSBpbiAiXCInIjogIyBkb3VibGUgb3Igc2luZ2xlIHF1b3RlCisgICAgICAgICAgICBpZiByZXAuc3RhcnRzd2l0aChxKToKKyAgICAgICAgICAgICAgICBpZiBsZW4ocmVwKSA8IDIgb3Igbm90IHJlcC5lbmRzd2l0aChxKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImluc2VjdXJlIHN0cmluZyBwaWNrbGUiCisgICAgICAgICAgICAgICAgcmVwID0gcmVwW2xlbihxKTotbGVuKHEpXQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiaW5zZWN1cmUgc3RyaW5nIHBpY2tsZSIKKyAgICAgICAgc2VsZi5hcHBlbmQocmVwLmRlY29kZSgic3RyaW5nLWVzY2FwZSIpKQorICAgIGRpc3BhdGNoW1NUUklOR10gPSBsb2FkX3N0cmluZworCisgICAgZGVmIGxvYWRfYmluc3RyaW5nKHNlbGYpOgorICAgICAgICBsZW4gPSBtbG9hZHMoJ2knICsgc2VsZi5yZWFkKDQpKQorICAgICAgICBzZWxmLmFwcGVuZChzZWxmLnJlYWQobGVuKSkKKyAgICBkaXNwYXRjaFtCSU5TVFJJTkddID0gbG9hZF9iaW5zdHJpbmcKKworICAgIGRlZiBsb2FkX3VuaWNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXBwZW5kKHVuaWNvZGUoc2VsZi5yZWFkbGluZSgpWzotMV0sJ3Jhdy11bmljb2RlLWVzY2FwZScpKQorICAgIGRpc3BhdGNoW1VOSUNPREVdID0gbG9hZF91bmljb2RlCisKKyAgICBkZWYgbG9hZF9iaW51bmljb2RlKHNlbGYpOgorICAgICAgICBsZW4gPSBtbG9hZHMoJ2knICsgc2VsZi5yZWFkKDQpKQorICAgICAgICBzZWxmLmFwcGVuZCh1bmljb2RlKHNlbGYucmVhZChsZW4pLCd1dGYtOCcpKQorICAgIGRpc3BhdGNoW0JJTlVOSUNPREVdID0gbG9hZF9iaW51bmljb2RlCisKKyAgICBkZWYgbG9hZF9zaG9ydF9iaW5zdHJpbmcoc2VsZik6CisgICAgICAgIGxlbiA9IG9yZChzZWxmLnJlYWQoMSkpCisgICAgICAgIHNlbGYuYXBwZW5kKHNlbGYucmVhZChsZW4pKQorICAgIGRpc3BhdGNoW1NIT1JUX0JJTlNUUklOR10gPSBsb2FkX3Nob3J0X2JpbnN0cmluZworCisgICAgZGVmIGxvYWRfdHVwbGUoc2VsZik6CisgICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCisgICAgICAgIHNlbGYuc3RhY2tbazpdID0gW3R1cGxlKHNlbGYuc3RhY2tbaysxOl0pXQorICAgIGRpc3BhdGNoW1RVUExFXSA9IGxvYWRfdHVwbGUKKworICAgIGRlZiBsb2FkX2VtcHR5X3R1cGxlKHNlbGYpOgorICAgICAgICBzZWxmLnN0YWNrLmFwcGVuZCgoKSkKKyAgICBkaXNwYXRjaFtFTVBUWV9UVVBMRV0gPSBsb2FkX2VtcHR5X3R1cGxlCisKKyAgICBkZWYgbG9hZF90dXBsZTEoc2VsZik6CisgICAgICAgIHNlbGYuc3RhY2tbLTFdID0gKHNlbGYuc3RhY2tbLTFdLCkKKyAgICBkaXNwYXRjaFtUVVBMRTFdID0gbG9hZF90dXBsZTEKKworICAgIGRlZiBsb2FkX3R1cGxlMihzZWxmKToKKyAgICAgICAgc2VsZi5zdGFja1stMjpdID0gWyhzZWxmLnN0YWNrWy0yXSwgc2VsZi5zdGFja1stMV0pXQorICAgIGRpc3BhdGNoW1RVUExFMl0gPSBsb2FkX3R1cGxlMgorCisgICAgZGVmIGxvYWRfdHVwbGUzKHNlbGYpOgorICAgICAgICBzZWxmLnN0YWNrWy0zOl0gPSBbKHNlbGYuc3RhY2tbLTNdLCBzZWxmLnN0YWNrWy0yXSwgc2VsZi5zdGFja1stMV0pXQorICAgIGRpc3BhdGNoW1RVUExFM10gPSBsb2FkX3R1cGxlMworCisgICAgZGVmIGxvYWRfZW1wdHlfbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5zdGFjay5hcHBlbmQoW10pCisgICAgZGlzcGF0Y2hbRU1QVFlfTElTVF0gPSBsb2FkX2VtcHR5X2xpc3QKKworICAgIGRlZiBsb2FkX2VtcHR5X2RpY3Rpb25hcnkoc2VsZik6CisgICAgICAgIHNlbGYuc3RhY2suYXBwZW5kKHt9KQorICAgIGRpc3BhdGNoW0VNUFRZX0RJQ1RdID0gbG9hZF9lbXB0eV9kaWN0aW9uYXJ5CisKKyAgICBkZWYgbG9hZF9saXN0KHNlbGYpOgorICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQorICAgICAgICBzZWxmLnN0YWNrW2s6XSA9IFtzZWxmLnN0YWNrW2srMTpdXQorICAgIGRpc3BhdGNoW0xJU1RdID0gbG9hZF9saXN0CisKKyAgICBkZWYgbG9hZF9kaWN0KHNlbGYpOgorICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQorICAgICAgICBkID0ge30KKyAgICAgICAgaXRlbXMgPSBzZWxmLnN0YWNrW2srMTpdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihpdGVtcyksIDIpOgorICAgICAgICAgICAga2V5ID0gaXRlbXNbaV0KKyAgICAgICAgICAgIHZhbHVlID0gaXRlbXNbaSsxXQorICAgICAgICAgICAgZFtrZXldID0gdmFsdWUKKyAgICAgICAgc2VsZi5zdGFja1trOl0gPSBbZF0KKyAgICBkaXNwYXRjaFtESUNUXSA9IGxvYWRfZGljdAorCisgICAgIyBJTlNUIGFuZCBPQkogZGlmZmVyIG9ubHkgaW4gaG93IHRoZXkgZ2V0IGEgY2xhc3Mgb2JqZWN0LiAgSXQncyBub3QKKyAgICAjIG9ubHkgc2Vuc2libGUgdG8gZG8gdGhlIHJlc3QgaW4gYSBjb21tb24gcm91dGluZSwgdGhlIHR3byByb3V0aW5lcworICAgICMgcHJldmlvdXNseSBkaXZlcmdlZCBhbmQgZ3JldyBkaWZmZXJlbnQgYnVncy4KKyAgICAjIGtsYXNzIGlzIHRoZSBjbGFzcyB0byBpbnN0YW50aWF0ZSwgYW5kIGsgcG9pbnRzIHRvIHRoZSB0b3Btb3N0IG1hcmsKKyAgICAjIG9iamVjdCwgZm9sbG93aW5nIHdoaWNoIGFyZSB0aGUgYXJndW1lbnRzIGZvciBrbGFzcy5fX2luaXRfXy4KKyAgICBkZWYgX2luc3RhbnRpYXRlKHNlbGYsIGtsYXNzLCBrKToKKyAgICAgICAgYXJncyA9IHR1cGxlKHNlbGYuc3RhY2tbaysxOl0pCisgICAgICAgIGRlbCBzZWxmLnN0YWNrW2s6XQorICAgICAgICBpbnN0YW50aWF0ZWQgPSAwCisgICAgICAgIGlmIChub3QgYXJncyBhbmQKKyAgICAgICAgICAgICAgICB0eXBlKGtsYXNzKSBpcyBDbGFzc1R5cGUgYW5kCisgICAgICAgICAgICAgICAgbm90IGhhc2F0dHIoa2xhc3MsICJfX2dldGluaXRhcmdzX18iKSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBfRW1wdHlDbGFzcygpCisgICAgICAgICAgICAgICAgdmFsdWUuX19jbGFzc19fID0ga2xhc3MKKyAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZWQgPSAxCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgICMgSW4gcmVzdHJpY3RlZCBleGVjdXRpb24sIGFzc2lnbm1lbnQgdG8gaW5zdC5fX2NsYXNzX18gaXMKKyAgICAgICAgICAgICAgICAjIHByb2hpYml0ZWQKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIG5vdCBpbnN0YW50aWF0ZWQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBrbGFzcygqYXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJpbiBjb25zdHJ1Y3RvciBmb3IgJXM6ICVzIiAlICgKKyAgICAgICAgICAgICAgICAgICAga2xhc3MuX19uYW1lX18sIHN0cihlcnIpKSwgc3lzLmV4Y19pbmZvKClbMl0KKyAgICAgICAgc2VsZi5hcHBlbmQodmFsdWUpCisKKyAgICBkZWYgbG9hZF9pbnN0KHNlbGYpOgorICAgICAgICBtb2R1bGUgPSBzZWxmLnJlYWRsaW5lKClbOi0xXQorICAgICAgICBuYW1lID0gc2VsZi5yZWFkbGluZSgpWzotMV0KKyAgICAgICAga2xhc3MgPSBzZWxmLmZpbmRfY2xhc3MobW9kdWxlLCBuYW1lKQorICAgICAgICBzZWxmLl9pbnN0YW50aWF0ZShrbGFzcywgc2VsZi5tYXJrZXIoKSkKKyAgICBkaXNwYXRjaFtJTlNUXSA9IGxvYWRfaW5zdAorCisgICAgZGVmIGxvYWRfb2JqKHNlbGYpOgorICAgICAgICAjIFN0YWNrIGlzIC4uLiBtYXJrb2JqZWN0IGNsYXNzb2JqZWN0IGFyZzEgYXJnMiAuLi4KKyAgICAgICAgayA9IHNlbGYubWFya2VyKCkKKyAgICAgICAga2xhc3MgPSBzZWxmLnN0YWNrLnBvcChrKzEpCisgICAgICAgIHNlbGYuX2luc3RhbnRpYXRlKGtsYXNzLCBrKQorICAgIGRpc3BhdGNoW09CSl0gPSBsb2FkX29iagorCisgICAgZGVmIGxvYWRfbmV3b2JqKHNlbGYpOgorICAgICAgICBhcmdzID0gc2VsZi5zdGFjay5wb3AoKQorICAgICAgICBjbHMgPSBzZWxmLnN0YWNrWy0xXQorICAgICAgICBvYmogPSBjbHMuX19uZXdfXyhjbHMsICphcmdzKQorICAgICAgICBzZWxmLnN0YWNrWy0xXSA9IG9iagorICAgIGRpc3BhdGNoW05FV09CSl0gPSBsb2FkX25ld29iagorCisgICAgZGVmIGxvYWRfZ2xvYmFsKHNlbGYpOgorICAgICAgICBtb2R1bGUgPSBzZWxmLnJlYWRsaW5lKClbOi0xXQorICAgICAgICBuYW1lID0gc2VsZi5yZWFkbGluZSgpWzotMV0KKyAgICAgICAga2xhc3MgPSBzZWxmLmZpbmRfY2xhc3MobW9kdWxlLCBuYW1lKQorICAgICAgICBzZWxmLmFwcGVuZChrbGFzcykKKyAgICBkaXNwYXRjaFtHTE9CQUxdID0gbG9hZF9nbG9iYWwKKworICAgIGRlZiBsb2FkX2V4dDEoc2VsZik6CisgICAgICAgIGNvZGUgPSBvcmQoc2VsZi5yZWFkKDEpKQorICAgICAgICBzZWxmLmdldF9leHRlbnNpb24oY29kZSkKKyAgICBkaXNwYXRjaFtFWFQxXSA9IGxvYWRfZXh0MQorCisgICAgZGVmIGxvYWRfZXh0MihzZWxmKToKKyAgICAgICAgY29kZSA9IG1sb2FkcygnaScgKyBzZWxmLnJlYWQoMikgKyAnXDAwMFwwMDAnKQorICAgICAgICBzZWxmLmdldF9leHRlbnNpb24oY29kZSkKKyAgICBkaXNwYXRjaFtFWFQyXSA9IGxvYWRfZXh0MgorCisgICAgZGVmIGxvYWRfZXh0NChzZWxmKToKKyAgICAgICAgY29kZSA9IG1sb2FkcygnaScgKyBzZWxmLnJlYWQoNCkpCisgICAgICAgIHNlbGYuZ2V0X2V4dGVuc2lvbihjb2RlKQorICAgIGRpc3BhdGNoW0VYVDRdID0gbG9hZF9leHQ0CisKKyAgICBkZWYgZ2V0X2V4dGVuc2lvbihzZWxmLCBjb2RlKToKKyAgICAgICAgbmlsID0gW10KKyAgICAgICAgb2JqID0gX2V4dGVuc2lvbl9jYWNoZS5nZXQoY29kZSwgbmlsKQorICAgICAgICBpZiBvYmogaXMgbm90IG5pbDoKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kKG9iaikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBrZXkgPSBfaW52ZXJ0ZWRfcmVnaXN0cnkuZ2V0KGNvZGUpCisgICAgICAgIGlmIG5vdCBrZXk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bnJlZ2lzdGVyZWQgZXh0ZW5zaW9uIGNvZGUgJWQiICUgY29kZSkKKyAgICAgICAgb2JqID0gc2VsZi5maW5kX2NsYXNzKCprZXkpCisgICAgICAgIF9leHRlbnNpb25fY2FjaGVbY29kZV0gPSBvYmoKKyAgICAgICAgc2VsZi5hcHBlbmQob2JqKQorCisgICAgZGVmIGZpbmRfY2xhc3Moc2VsZiwgbW9kdWxlLCBuYW1lKToKKyAgICAgICAgIyBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzCisgICAgICAgIF9faW1wb3J0X18obW9kdWxlKQorICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1ttb2R1bGVdCisgICAgICAgIGtsYXNzID0gZ2V0YXR0cihtb2QsIG5hbWUpCisgICAgICAgIHJldHVybiBrbGFzcworCisgICAgZGVmIGxvYWRfcmVkdWNlKHNlbGYpOgorICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKKyAgICAgICAgYXJncyA9IHN0YWNrLnBvcCgpCisgICAgICAgIGZ1bmMgPSBzdGFja1stMV0KKyAgICAgICAgdmFsdWUgPSBmdW5jKCphcmdzKQorICAgICAgICBzdGFja1stMV0gPSB2YWx1ZQorICAgIGRpc3BhdGNoW1JFRFVDRV0gPSBsb2FkX3JlZHVjZQorCisgICAgZGVmIGxvYWRfcG9wKHNlbGYpOgorICAgICAgICBkZWwgc2VsZi5zdGFja1stMV0KKyAgICBkaXNwYXRjaFtQT1BdID0gbG9hZF9wb3AKKworICAgIGRlZiBsb2FkX3BvcF9tYXJrKHNlbGYpOgorICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQorICAgICAgICBkZWwgc2VsZi5zdGFja1trOl0KKyAgICBkaXNwYXRjaFtQT1BfTUFSS10gPSBsb2FkX3BvcF9tYXJrCisKKyAgICBkZWYgbG9hZF9kdXAoc2VsZik6CisgICAgICAgIHNlbGYuYXBwZW5kKHNlbGYuc3RhY2tbLTFdKQorICAgIGRpc3BhdGNoW0RVUF0gPSBsb2FkX2R1cAorCisgICAgZGVmIGxvYWRfZ2V0KHNlbGYpOgorICAgICAgICBzZWxmLmFwcGVuZChzZWxmLm1lbW9bc2VsZi5yZWFkbGluZSgpWzotMV1dKQorICAgIGRpc3BhdGNoW0dFVF0gPSBsb2FkX2dldAorCisgICAgZGVmIGxvYWRfYmluZ2V0KHNlbGYpOgorICAgICAgICBpID0gb3JkKHNlbGYucmVhZCgxKSkKKyAgICAgICAgc2VsZi5hcHBlbmQoc2VsZi5tZW1vW3JlcHIoaSldKQorICAgIGRpc3BhdGNoW0JJTkdFVF0gPSBsb2FkX2JpbmdldAorCisgICAgZGVmIGxvYWRfbG9uZ19iaW5nZXQoc2VsZik6CisgICAgICAgIGkgPSBtbG9hZHMoJ2knICsgc2VsZi5yZWFkKDQpKQorICAgICAgICBzZWxmLmFwcGVuZChzZWxmLm1lbW9bcmVwcihpKV0pCisgICAgZGlzcGF0Y2hbTE9OR19CSU5HRVRdID0gbG9hZF9sb25nX2JpbmdldAorCisgICAgZGVmIGxvYWRfcHV0KHNlbGYpOgorICAgICAgICBzZWxmLm1lbW9bc2VsZi5yZWFkbGluZSgpWzotMV1dID0gc2VsZi5zdGFja1stMV0KKyAgICBkaXNwYXRjaFtQVVRdID0gbG9hZF9wdXQKKworICAgIGRlZiBsb2FkX2JpbnB1dChzZWxmKToKKyAgICAgICAgaSA9IG9yZChzZWxmLnJlYWQoMSkpCisgICAgICAgIHNlbGYubWVtb1tyZXByKGkpXSA9IHNlbGYuc3RhY2tbLTFdCisgICAgZGlzcGF0Y2hbQklOUFVUXSA9IGxvYWRfYmlucHV0CisKKyAgICBkZWYgbG9hZF9sb25nX2JpbnB1dChzZWxmKToKKyAgICAgICAgaSA9IG1sb2FkcygnaScgKyBzZWxmLnJlYWQoNCkpCisgICAgICAgIHNlbGYubWVtb1tyZXByKGkpXSA9IHNlbGYuc3RhY2tbLTFdCisgICAgZGlzcGF0Y2hbTE9OR19CSU5QVVRdID0gbG9hZF9sb25nX2JpbnB1dAorCisgICAgZGVmIGxvYWRfYXBwZW5kKHNlbGYpOgorICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKKyAgICAgICAgdmFsdWUgPSBzdGFjay5wb3AoKQorICAgICAgICBsaXN0ID0gc3RhY2tbLTFdCisgICAgICAgIGxpc3QuYXBwZW5kKHZhbHVlKQorICAgIGRpc3BhdGNoW0FQUEVORF0gPSBsb2FkX2FwcGVuZAorCisgICAgZGVmIGxvYWRfYXBwZW5kcyhzZWxmKToKKyAgICAgICAgc3RhY2sgPSBzZWxmLnN0YWNrCisgICAgICAgIG1hcmsgPSBzZWxmLm1hcmtlcigpCisgICAgICAgIGxpc3QgPSBzdGFja1ttYXJrIC0gMV0KKyAgICAgICAgbGlzdC5leHRlbmQoc3RhY2tbbWFyayArIDE6XSkKKyAgICAgICAgZGVsIHN0YWNrW21hcms6XQorICAgIGRpc3BhdGNoW0FQUEVORFNdID0gbG9hZF9hcHBlbmRzCisKKyAgICBkZWYgbG9hZF9zZXRpdGVtKHNlbGYpOgorICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKKyAgICAgICAgdmFsdWUgPSBzdGFjay5wb3AoKQorICAgICAgICBrZXkgPSBzdGFjay5wb3AoKQorICAgICAgICBkaWN0ID0gc3RhY2tbLTFdCisgICAgICAgIGRpY3Rba2V5XSA9IHZhbHVlCisgICAgZGlzcGF0Y2hbU0VUSVRFTV0gPSBsb2FkX3NldGl0ZW0KKworICAgIGRlZiBsb2FkX3NldGl0ZW1zKHNlbGYpOgorICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKKyAgICAgICAgbWFyayA9IHNlbGYubWFya2VyKCkKKyAgICAgICAgZGljdCA9IHN0YWNrW21hcmsgLSAxXQorICAgICAgICBmb3IgaSBpbiByYW5nZShtYXJrICsgMSwgbGVuKHN0YWNrKSwgMik6CisgICAgICAgICAgICBkaWN0W3N0YWNrW2ldXSA9IHN0YWNrW2kgKyAxXQorCisgICAgICAgIGRlbCBzdGFja1ttYXJrOl0KKyAgICBkaXNwYXRjaFtTRVRJVEVNU10gPSBsb2FkX3NldGl0ZW1zCisKKyAgICBkZWYgbG9hZF9idWlsZChzZWxmKToKKyAgICAgICAgc3RhY2sgPSBzZWxmLnN0YWNrCisgICAgICAgIHN0YXRlID0gc3RhY2sucG9wKCkKKyAgICAgICAgaW5zdCA9IHN0YWNrWy0xXQorICAgICAgICBzZXRzdGF0ZSA9IGdldGF0dHIoaW5zdCwgIl9fc2V0c3RhdGVfXyIsIE5vbmUpCisgICAgICAgIGlmIHNldHN0YXRlOgorICAgICAgICAgICAgc2V0c3RhdGUoc3RhdGUpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2xvdHN0YXRlID0gTm9uZQorICAgICAgICBpZiBpc2luc3RhbmNlKHN0YXRlLCB0dXBsZSkgYW5kIGxlbihzdGF0ZSkgPT0gMjoKKyAgICAgICAgICAgIHN0YXRlLCBzbG90c3RhdGUgPSBzdGF0ZQorICAgICAgICBpZiBzdGF0ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkID0gaW5zdC5fX2RpY3RfXworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gc3RhdGUuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBkW2ludGVybihrKV0gPSB2CisgICAgICAgICAgICAgICAgIyBrZXlzIGluIHN0YXRlIGRvbid0IGhhdmUgdG8gYmUgc3RyaW5ncworICAgICAgICAgICAgICAgICMgZG9uJ3QgYmxvdyB1cCwgYnV0IGRvbid0IGdvIG91dCBvZiBvdXIgd2F5CisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgZC51cGRhdGUoc3RhdGUpCisKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgIyBYWFggSW4gcmVzdHJpY3RlZCBleGVjdXRpb24sIHRoZSBpbnN0YW5jZSdzIF9fZGljdF9fCisgICAgICAgICAgICAgICAgIyBpcyBub3QgYWNjZXNzaWJsZS4gIFVzZSB0aGUgb2xkIHdheSBvZiB1bnBpY2tsaW5nCisgICAgICAgICAgICAgICAgIyB0aGUgaW5zdGFuY2UgdmFyaWFibGVzLiAgVGhpcyBpcyBhIHNlbWFudGljCisgICAgICAgICAgICAgICAgIyBkaWZmZXJlbmNlIHdoZW4gdW5waWNrbGluZyBpbiByZXN0cmljdGVkCisgICAgICAgICAgICAgICAgIyB2cy4gdW5yZXN0cmljdGVkIG1vZGVzLgorICAgICAgICAgICAgICAgICMgTm90ZSwgaG93ZXZlciwgdGhhdCBjUGlja2xlIGhhcyBuZXZlciB0cmllZCB0byBkbyB0aGUKKyAgICAgICAgICAgICAgICAjIC51cGRhdGUoKSBidXNpbmVzcywgYW5kIGFsd2F5cyB1c2VzCisgICAgICAgICAgICAgICAgIyAgICAgUHlPYmplY3RfU2V0SXRlbShpbnN0Ll9fZGljdF9fLCBrZXksIHZhbHVlKSBpbiBhCisgICAgICAgICAgICAgICAgIyBsb29wIG92ZXIgc3RhdGUuaXRlbXMoKS4KKyAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBzdGF0ZS5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGluc3QsIGssIHYpCisgICAgICAgIGlmIHNsb3RzdGF0ZToKKyAgICAgICAgICAgIGZvciBrLCB2IGluIHNsb3RzdGF0ZS5pdGVtcygpOgorICAgICAgICAgICAgICAgIHNldGF0dHIoaW5zdCwgaywgdikKKyAgICBkaXNwYXRjaFtCVUlMRF0gPSBsb2FkX2J1aWxkCisKKyAgICBkZWYgbG9hZF9tYXJrKHNlbGYpOgorICAgICAgICBzZWxmLmFwcGVuZChzZWxmLm1hcmspCisgICAgZGlzcGF0Y2hbTUFSS10gPSBsb2FkX21hcmsKKworICAgIGRlZiBsb2FkX3N0b3Aoc2VsZik6CisgICAgICAgIHZhbHVlID0gc2VsZi5zdGFjay5wb3AoKQorICAgICAgICByYWlzZSBfU3RvcCh2YWx1ZSkKKyAgICBkaXNwYXRjaFtTVE9QXSA9IGxvYWRfc3RvcAorCisjIEhlbHBlciBjbGFzcyBmb3IgbG9hZF9pbnN0L2xvYWRfb2JqCisKK2NsYXNzIF9FbXB0eUNsYXNzOgorICAgIHBhc3MKKworIyBFbmNvZGUvZGVjb2RlIGxvbmdzIGluIGxpbmVhciB0aW1lLgorCitpbXBvcnQgYmluYXNjaWkgYXMgX2JpbmFzY2lpCisKK2RlZiBlbmNvZGVfbG9uZyh4KToKKyAgICByIiIiRW5jb2RlIGEgbG9uZyB0byBhIHR3bydzIGNvbXBsZW1lbnQgbGl0dGxlLWVuZGlhbiBiaW5hcnkgc3RyaW5nLgorICAgIE5vdGUgdGhhdCAwTCBpcyBhIHNwZWNpYWwgY2FzZSwgcmV0dXJuaW5nIGFuIGVtcHR5IHN0cmluZywgdG8gc2F2ZSBhCisgICAgYnl0ZSBpbiB0aGUgTE9ORzEgcGlja2xpbmcgY29udGV4dC4KKworICAgID4+PiBlbmNvZGVfbG9uZygwTCkKKyAgICAnJworICAgID4+PiBlbmNvZGVfbG9uZygyNTVMKQorICAgICdceGZmXHgwMCcKKyAgICA+Pj4gZW5jb2RlX2xvbmcoMzI3NjdMKQorICAgICdceGZmXHg3ZicKKyAgICA+Pj4gZW5jb2RlX2xvbmcoLTI1NkwpCisgICAgJ1x4MDBceGZmJworICAgID4+PiBlbmNvZGVfbG9uZygtMzI3NjhMKQorICAgICdceDAwXHg4MCcKKyAgICA+Pj4gZW5jb2RlX2xvbmcoLTEyOEwpCisgICAgJ1x4ODAnCisgICAgPj4+IGVuY29kZV9sb25nKDEyN0wpCisgICAgJ1x4N2YnCisgICAgPj4+CisgICAgIiIiCisKKyAgICBpZiB4ID09IDA6CisgICAgICAgIHJldHVybiAnJworICAgIGlmIHggPiAwOgorICAgICAgICBhc2hleCA9IGhleCh4KQorICAgICAgICBhc3NlcnQgYXNoZXguc3RhcnRzd2l0aCgiMHgiKQorICAgICAgICBuanVua2NoYXJzID0gMiArIGFzaGV4LmVuZHN3aXRoKCdMJykKKyAgICAgICAgbmliYmxlcyA9IGxlbihhc2hleCkgLSBuanVua2NoYXJzCisgICAgICAgIGlmIG5pYmJsZXMgJiAxOgorICAgICAgICAgICAgIyBuZWVkIGFuIGV2ZW4gIyBvZiBuaWJibGVzIGZvciB1bmhleGxpZnkKKyAgICAgICAgICAgIGFzaGV4ID0gIjB4MCIgKyBhc2hleFsyOl0KKyAgICAgICAgZWxpZiBpbnQoYXNoZXhbMl0sIDE2KSA+PSA4OgorICAgICAgICAgICAgIyAibG9va3MgbmVnYXRpdmUiLCBzbyBuZWVkIGEgYnl0ZSBvZiBzaWduIGJpdHMKKyAgICAgICAgICAgIGFzaGV4ID0gIjB4MDAiICsgYXNoZXhbMjpdCisgICAgZWxzZToKKyAgICAgICAgIyBCdWlsZCB0aGUgMjU2J3MtY29tcGxlbWVudDogICgxTCA8PCBuYnl0ZXMpICsgeC4gIFRoZSB0cmljayBpcworICAgICAgICAjIHRvIGZpbmQgdGhlIG51bWJlciBvZiBieXRlcyBpbiBsaW5lYXIgdGltZSAoYWx0aG91Z2ggdGhhdCBzaG91bGQKKyAgICAgICAgIyByZWFsbHkgYmUgYSBjb25zdGFudC10aW1lIHRhc2spLgorICAgICAgICBhc2hleCA9IGhleCgteCkKKyAgICAgICAgYXNzZXJ0IGFzaGV4LnN0YXJ0c3dpdGgoIjB4IikKKyAgICAgICAgbmp1bmtjaGFycyA9IDIgKyBhc2hleC5lbmRzd2l0aCgnTCcpCisgICAgICAgIG5pYmJsZXMgPSBsZW4oYXNoZXgpIC0gbmp1bmtjaGFycworICAgICAgICBpZiBuaWJibGVzICYgMToKKyAgICAgICAgICAgICMgRXh0ZW5kIHRvIGEgZnVsbCBieXRlLgorICAgICAgICAgICAgbmliYmxlcyArPSAxCisgICAgICAgIG5iaXRzID0gbmliYmxlcyAqIDQKKyAgICAgICAgeCArPSAxTCA8PCBuYml0cworICAgICAgICBhc3NlcnQgeCA+IDAKKyAgICAgICAgYXNoZXggPSBoZXgoeCkKKyAgICAgICAgbmp1bmtjaGFycyA9IDIgKyBhc2hleC5lbmRzd2l0aCgnTCcpCisgICAgICAgIG5ld25pYmJsZXMgPSBsZW4oYXNoZXgpIC0gbmp1bmtjaGFycworICAgICAgICBpZiBuZXduaWJibGVzIDwgbmliYmxlczoKKyAgICAgICAgICAgIGFzaGV4ID0gIjB4IiArICIwIiAqIChuaWJibGVzIC0gbmV3bmliYmxlcykgKyBhc2hleFsyOl0KKyAgICAgICAgaWYgaW50KGFzaGV4WzJdLCAxNikgPCA4OgorICAgICAgICAgICAgIyAibG9va3MgcG9zaXRpdmUiLCBzbyBuZWVkIGEgYnl0ZSBvZiBzaWduIGJpdHMKKyAgICAgICAgICAgIGFzaGV4ID0gIjB4ZmYiICsgYXNoZXhbMjpdCisKKyAgICBpZiBhc2hleC5lbmRzd2l0aCgnTCcpOgorICAgICAgICBhc2hleCA9IGFzaGV4WzI6LTFdCisgICAgZWxzZToKKyAgICAgICAgYXNoZXggPSBhc2hleFsyOl0KKyAgICBhc3NlcnQgbGVuKGFzaGV4KSAmIDEgPT0gMCwgKHgsIGFzaGV4KQorICAgIGJpbmFyeSA9IF9iaW5hc2NpaS51bmhleGxpZnkoYXNoZXgpCisgICAgcmV0dXJuIGJpbmFyeVs6Oi0xXQorCitkZWYgZGVjb2RlX2xvbmcoZGF0YSk6CisgICAgciIiIkRlY29kZSBhIGxvbmcgZnJvbSBhIHR3bydzIGNvbXBsZW1lbnQgbGl0dGxlLWVuZGlhbiBiaW5hcnkgc3RyaW5nLgorCisgICAgPj4+IGRlY29kZV9sb25nKCcnKQorICAgIDBMCisgICAgPj4+IGRlY29kZV9sb25nKCJceGZmXHgwMCIpCisgICAgMjU1TAorICAgID4+PiBkZWNvZGVfbG9uZygiXHhmZlx4N2YiKQorICAgIDMyNzY3TAorICAgID4+PiBkZWNvZGVfbG9uZygiXHgwMFx4ZmYiKQorICAgIC0yNTZMCisgICAgPj4+IGRlY29kZV9sb25nKCJceDAwXHg4MCIpCisgICAgLTMyNzY4TAorICAgID4+PiBkZWNvZGVfbG9uZygiXHg4MCIpCisgICAgLTEyOEwKKyAgICA+Pj4gZGVjb2RlX2xvbmcoIlx4N2YiKQorICAgIDEyN0wKKyAgICAiIiIKKworICAgIG5ieXRlcyA9IGxlbihkYXRhKQorICAgIGlmIG5ieXRlcyA9PSAwOgorICAgICAgICByZXR1cm4gMEwKKyAgICBhc2hleCA9IF9iaW5hc2NpaS5oZXhsaWZ5KGRhdGFbOjotMV0pCisgICAgbiA9IGxvbmcoYXNoZXgsIDE2KSAjIHF1YWRyYXRpYyB0aW1lIGJlZm9yZSBQeXRob24gMi4zOyBsaW5lYXIgbm93CisgICAgaWYgZGF0YVstMV0gPj0gJ1x4ODAnOgorICAgICAgICBuIC09IDFMIDw8IChuYnl0ZXMgKiA4KQorICAgIHJldHVybiBuCisKKyMgU2hvcnRoYW5kcworCit0cnk6CisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworZGVmIGR1bXAob2JqLCBmaWxlLCBwcm90b2NvbD1Ob25lKToKKyAgICBQaWNrbGVyKGZpbGUsIHByb3RvY29sKS5kdW1wKG9iaikKKworZGVmIGR1bXBzKG9iaiwgcHJvdG9jb2w9Tm9uZSk6CisgICAgZmlsZSA9IFN0cmluZ0lPKCkKKyAgICBQaWNrbGVyKGZpbGUsIHByb3RvY29sKS5kdW1wKG9iaikKKyAgICByZXR1cm4gZmlsZS5nZXR2YWx1ZSgpCisKK2RlZiBsb2FkKGZpbGUpOgorICAgIHJldHVybiBVbnBpY2tsZXIoZmlsZSkubG9hZCgpCisKK2RlZiBsb2FkcyhzdHIpOgorICAgIGZpbGUgPSBTdHJpbmdJTyhzdHIpCisgICAgcmV0dXJuIFVucGlja2xlcihmaWxlKS5sb2FkKCkKKworIyBEb2N0ZXN0CisKK2RlZiBfdGVzdCgpOgorICAgIGltcG9ydCBkb2N0ZXN0CisgICAgcmV0dXJuIGRvY3Rlc3QudGVzdG1vZCgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9waWNrbGUucHljIGIvbGliL3B5dGhvbjIuNy9waWNrbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMmU2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BpY2tsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9waWNrbGUucHlvIGIvbGliL3B5dGhvbjIuNy9waWNrbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMWMyZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BpY2tsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9waWNrbGV0b29scy5weSBiL2xpYi9weXRob24yLjcvcGlja2xldG9vbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcxNzcyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGlja2xldG9vbHMucHkKQEAgLTAsMCArMSwyMjc0IEBACisnJyciRXhlY3V0YWJsZSBkb2N1bWVudGF0aW9uIiBmb3IgdGhlIHBpY2tsZSBtb2R1bGUuCisKK0V4dGVuc2l2ZSBjb21tZW50cyBhYm91dCB0aGUgcGlja2xlIHByb3RvY29scyBhbmQgcGlja2xlLW1hY2hpbmUgb3Bjb2RlcworY2FuIGJlIGZvdW5kIGhlcmUuICBTb21lIGZ1bmN0aW9ucyBtZWFudCBmb3IgZXh0ZXJuYWwgdXNlOgorCitnZW5vcHMocGlja2xlKQorICAgR2VuZXJhdGUgYWxsIHRoZSBvcGNvZGVzIGluIGEgcGlja2xlLCBhcyAob3Bjb2RlLCBhcmcsIHBvc2l0aW9uKSB0cmlwbGVzLgorCitkaXMocGlja2xlLCBvdXQ9Tm9uZSwgbWVtbz1Ob25lLCBpbmRlbnRsZXZlbD00KQorICAgUHJpbnQgYSBzeW1ib2xpYyBkaXNhc3NlbWJseSBvZiBhIHBpY2tsZS4KKycnJworCitfX2FsbF9fID0gWydkaXMnLCAnZ2Vub3BzJywgJ29wdGltaXplJ10KKworIyBPdGhlciBpZGVhczoKKyMKKyMgLSBBIHBpY2tsZSB2ZXJpZmllcjogIHJlYWQgYSBwaWNrbGUgYW5kIGNoZWNrIGl0IGV4aGF1c3RpdmVseSBmb3IKKyMgICB3ZWxsLWZvcm1lZG5lc3MuICBkaXMoKSBkb2VzIGEgbG90IG9mIHRoaXMgYWxyZWFkeS4KKyMKKyMgLSBBIHByb3RvY29sIGlkZW50aWZpZXI6ICBleGFtaW5lIGEgcGlja2xlIGFuZCByZXR1cm4gaXRzIHByb3RvY29sIG51bWJlcgorIyAgICg9PSB0aGUgaGlnaGVzdCAucHJvdG8gYXR0ciB2YWx1ZSBhbW9uZyBhbGwgdGhlIG9wY29kZXMgaW4gdGhlIHBpY2tsZSkuCisjICAgZGlzKCkgYWxyZWFkeSBwcmludHMgdGhpcyBpbmZvIGF0IHRoZSBlbmQuCisjCisjIC0gQSBwaWNrbGUgb3B0aW1pemVyOiAgZm9yIGV4YW1wbGUsIHR1cGxlLWJ1aWxkaW5nIGNvZGUgaXMgc29tZXRpbWVzIG1vcmUKKyMgICBlbGFib3JhdGUgdGhhbiBuZWNlc3NhcnksIGNhdGVyaW5nIGZvciB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgdHVwbGUKKyMgICBpcyByZWN1cnNpdmUuICBPciBsb3RzIG9mIHRpbWVzIGEgUFVUIGlzIGdlbmVyYXRlZCB0aGF0J3MgbmV2ZXIgYWNjZXNzZWQKKyMgICBieSBhIGxhdGVyIEdFVC4KKworCisiIiIKKyJBIHBpY2tsZSIgaXMgYSBwcm9ncmFtIGZvciBhIHZpcnR1YWwgcGlja2xlIG1hY2hpbmUgKFBNLCBidXQgbW9yZSBhY2N1cmF0ZWx5CitjYWxsZWQgYW4gdW5waWNrbGluZyBtYWNoaW5lKS4gIEl0J3MgYSBzZXF1ZW5jZSBvZiBvcGNvZGVzLCBpbnRlcnByZXRlZCBieSB0aGUKK1BNLCBidWlsZGluZyBhbiBhcmJpdHJhcmlseSBjb21wbGV4IFB5dGhvbiBvYmplY3QuCisKK0ZvciB0aGUgbW9zdCBwYXJ0LCB0aGUgUE0gaXMgdmVyeSBzaW1wbGU6ICB0aGVyZSBhcmUgbm8gbG9vcGluZywgdGVzdGluZywgb3IKK2NvbmRpdGlvbmFsIGluc3RydWN0aW9ucywgbm8gYXJpdGhtZXRpYyBhbmQgbm8gZnVuY3Rpb24gY2FsbHMuICBPcGNvZGVzIGFyZQorZXhlY3V0ZWQgb25jZSBlYWNoLCBmcm9tIGZpcnN0IHRvIGxhc3QsIHVudGlsIGEgU1RPUCBvcGNvZGUgaXMgcmVhY2hlZC4KKworVGhlIFBNIGhhcyB0d28gZGF0YSBhcmVhcywgInRoZSBzdGFjayIgYW5kICJ0aGUgbWVtbyIuCisKK01hbnkgb3Bjb2RlcyBwdXNoIFB5dGhvbiBvYmplY3RzIG9udG8gdGhlIHN0YWNrOyBlLmcuLCBJTlQgcHVzaGVzIGEgUHl0aG9uCitpbnRlZ2VyIG9iamVjdCBvbiB0aGUgc3RhY2ssIHdob3NlIHZhbHVlIGlzIGdvdHRlbiBmcm9tIGEgZGVjaW1hbCBzdHJpbmcKK2xpdGVyYWwgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBJTlQgb3Bjb2RlIGluIHRoZSBwaWNrbGUgYnl0ZXN0cmVhbS4gIE90aGVyCitvcGNvZGVzIHRha2UgUHl0aG9uIG9iamVjdHMgb2ZmIHRoZSBzdGFjay4gIFRoZSByZXN1bHQgb2YgdW5waWNrbGluZyBpcword2hhdGV2ZXIgb2JqZWN0IGlzIGxlZnQgb24gdGhlIHN0YWNrIHdoZW4gdGhlIGZpbmFsIFNUT1Agb3Bjb2RlIGlzIGV4ZWN1dGVkLgorCitUaGUgbWVtbyBpcyBzaW1wbHkgYW4gYXJyYXkgb2Ygb2JqZWN0cywgb3IgaXQgY2FuIGJlIGltcGxlbWVudGVkIGFzIGEgZGljdAorbWFwcGluZyBsaXR0bGUgaW50ZWdlcnMgdG8gb2JqZWN0cy4gIFRoZSBtZW1vIHNlcnZlcyBhcyB0aGUgUE0ncyAibG9uZyB0ZXJtCittZW1vcnkiLCBhbmQgdGhlIGxpdHRsZSBpbnRlZ2VycyBpbmRleGluZyB0aGUgbWVtbyBhcmUgYWtpbiB0byB2YXJpYWJsZQorbmFtZXMuICBTb21lIG9wY29kZXMgcG9wIGEgc3RhY2sgb2JqZWN0IGludG8gdGhlIG1lbW8gYXQgYSBnaXZlbiBpbmRleCwKK2FuZCBvdGhlcnMgcHVzaCBhIG1lbW8gb2JqZWN0IGF0IGEgZ2l2ZW4gaW5kZXggb250byB0aGUgc3RhY2sgYWdhaW4uCisKK0F0IGhlYXJ0LCB0aGF0J3MgYWxsIHRoZSBQTSBoYXMuICBTdWJ0bGV0aWVzIGFyaXNlIGZvciB0aGVzZSByZWFzb25zOgorCisrIE9iamVjdCBpZGVudGl0eS4gIE9iamVjdHMgY2FuIGJlIGFyYml0cmFyaWx5IGNvbXBsZXgsIGFuZCBzdWJvYmplY3RzCisgIG1heSBiZSBzaGFyZWQgKGZvciBleGFtcGxlLCB0aGUgbGlzdCBbYSwgYV0gcmVmZXJzIHRvIHRoZSBzYW1lIG9iamVjdCBhCisgIHR3aWNlKS4gIEl0IGNhbiBiZSB2aXRhbCB0aGF0IHVucGlja2xpbmcgcmVjcmVhdGUgYW4gaXNvbW9ycGhpYyBvYmplY3QKKyAgZ3JhcGgsIGZhaXRoZnVsbHkgcmVwcm9kdWNpbmcgc2hhcmluZy4KKworKyBSZWN1cnNpdmUgb2JqZWN0cy4gIEZvciBleGFtcGxlLCBhZnRlciAiTCA9IFtdOyBMLmFwcGVuZChMKSIsIEwgaXMgYQorICBsaXN0LCBhbmQgTFswXSBpcyB0aGUgc2FtZSBsaXN0LiAgVGhpcyBpcyByZWxhdGVkIHRvIHRoZSBvYmplY3QgaWRlbnRpdHkKKyAgcG9pbnQsIGFuZCBzb21lIHNlcXVlbmNlcyBvZiBwaWNrbGUgb3Bjb2RlcyBhcmUgc3VidGxlIGluIG9yZGVyIHRvCisgIGdldCB0aGUgcmlnaHQgcmVzdWx0IGluIGFsbCBjYXNlcy4KKworKyBUaGluZ3MgcGlja2xlIGRvZXNuJ3Qga25vdyBldmVyeXRoaW5nIGFib3V0LiAgRXhhbXBsZXMgb2YgdGhpbmdzIHBpY2tsZQorICBkb2VzIGtub3cgZXZlcnl0aGluZyBhYm91dCBhcmUgUHl0aG9uJ3MgYnVpbHRpbiBzY2FsYXIgYW5kIGNvbnRhaW5lcgorICB0eXBlcywgbGlrZSBpbnRzIGFuZCB0dXBsZXMuICBUaGV5IGdlbmVyYWxseSBoYXZlIG9wY29kZXMgZGVkaWNhdGVkIHRvCisgIHRoZW0uICBGb3IgdGhpbmdzIGxpa2UgbW9kdWxlIHJlZmVyZW5jZXMgYW5kIGluc3RhbmNlcyBvZiB1c2VyLWRlZmluZWQKKyAgY2xhc3NlcywgcGlja2xlJ3Mga25vd2xlZGdlIGlzIGxpbWl0ZWQuICBIaXN0b3JpY2FsbHksIG1hbnkgZW5oYW5jZW1lbnRzCisgIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBwaWNrbGUgcHJvdG9jb2wgaW4gb3JkZXIgdG8gZG8gYSBiZXR0ZXIgKGZhc3RlciwKKyAgYW5kL29yIG1vcmUgY29tcGFjdCkgam9iIG9uIHRob3NlLgorCisrIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIG1pY3JvLW9wdGltaXphdGlvbi4gIEFzIGV4cGxhaW5lZCBiZWxvdywKKyAgcGlja2xlIG9wY29kZXMgbmV2ZXIgZ28gYXdheSwgbm90IGV2ZW4gd2hlbiBiZXR0ZXIgd2F5cyB0byBkbyBhIHRoaW5nCisgIGdldCBpbnZlbnRlZC4gIFRoZSByZXBlcnRvaXJlIG9mIHRoZSBQTSBqdXN0IGtlZXBzIGdyb3dpbmcgb3ZlciB0aW1lLgorICBGb3IgZXhhbXBsZSwgcHJvdG9jb2wgMCBoYWQgdHdvIG9wY29kZXMgZm9yIGJ1aWxkaW5nIFB5dGhvbiBpbnRlZ2VycyAoSU5UCisgIGFuZCBMT05HKSwgcHJvdG9jb2wgMSBhZGRlZCB0aHJlZSBtb3JlIGZvciBtb3JlLWVmZmljaWVudCBwaWNrbGluZyBvZiBzaG9ydAorICBpbnRlZ2VycywgYW5kIHByb3RvY29sIDIgYWRkZWQgdHdvIG1vcmUgZm9yIG1vcmUtZWZmaWNpZW50IHBpY2tsaW5nIG9mCisgIGxvbmcgaW50ZWdlcnMgKGJlZm9yZSBwcm90b2NvbCAyLCB0aGUgb25seSB3YXlzIHRvIHBpY2tsZSBhIFB5dGhvbiBsb25nCisgIHRvb2sgdGltZSBxdWFkcmF0aWMgaW4gdGhlIG51bWJlciBvZiBkaWdpdHMsIGZvciBib3RoIHBpY2tsaW5nIGFuZAorICB1bnBpY2tsaW5nKS4gICJPcGNvZGUgYmxvYXQiIGlzbid0IHNvIG11Y2ggYSBzdWJ0bGV0eSBhcyBhIHNvdXJjZSBvZgorICB3ZWFyeWluZyBjb21wbGljYXRpb24uCisKKworUGlja2xlIHByb3RvY29sczoKKworRm9yIGNvbXBhdGliaWxpdHksIHRoZSBtZWFuaW5nIG9mIGEgcGlja2xlIG9wY29kZSBuZXZlciBjaGFuZ2VzLiAgSW5zdGVhZCBuZXcKK3BpY2tsZSBvcGNvZGVzIGdldCBhZGRlZCwgYW5kIGVhY2ggdmVyc2lvbidzIHVucGlja2xlciBjYW4gaGFuZGxlIGFsbCB0aGUKK3BpY2tsZSBvcGNvZGVzIGluIGFsbCBwcm90b2NvbCB2ZXJzaW9ucyB0byBkYXRlLiAgU28gb2xkIHBpY2tsZXMgY29udGludWUgdG8KK2JlIHJlYWRhYmxlIGZvcmV2ZXIuICBUaGUgcGlja2xlciBjYW4gZ2VuZXJhbGx5IGJlIHRvbGQgdG8gcmVzdHJpY3QgaXRzZWxmIHRvCit0aGUgc3Vic2V0IG9mIG9wY29kZXMgYXZhaWxhYmxlIHVuZGVyIHByZXZpb3VzIHByb3RvY29sIHZlcnNpb25zIHRvbywgc28gdGhhdAordXNlcnMgY2FuIGNyZWF0ZSBwaWNrbGVzIHVuZGVyIHRoZSBjdXJyZW50IHZlcnNpb24gcmVhZGFibGUgYnkgb2xkZXIKK3ZlcnNpb25zLiAgSG93ZXZlciwgYSBwaWNrbGUgZG9lcyBub3QgY29udGFpbiBpdHMgdmVyc2lvbiBudW1iZXIgZW1iZWRkZWQKK3dpdGhpbiBpdC4gIElmIGFuIG9sZGVyIHVucGlja2xlciB0cmllcyB0byByZWFkIGEgcGlja2xlIHVzaW5nIGEgbGF0ZXIKK3Byb3RvY29sLCB0aGUgcmVzdWx0IGlzIG1vc3QgbGlrZWx5IGFuIGV4Y2VwdGlvbiBkdWUgdG8gc2VlaW5nIGFuIHVua25vd24gKGluCit0aGUgb2xkZXIgdW5waWNrbGVyKSBvcGNvZGUuCisKK1RoZSBvcmlnaW5hbCBwaWNrbGUgdXNlZCB3aGF0J3Mgbm93IGNhbGxlZCAicHJvdG9jb2wgMCIsIGFuZCB3aGF0IHdhcyBjYWxsZWQKKyJ0ZXh0IG1vZGUiIGJlZm9yZSBQeXRob24gMi4zLiAgVGhlIGVudGlyZSBwaWNrbGUgYnl0ZXN0cmVhbSBpcyBtYWRlIHVwIG9mCitwcmludGFibGUgNy1iaXQgQVNDSUkgY2hhcmFjdGVycywgcGx1cyB0aGUgbmV3bGluZSBjaGFyYWN0ZXIsIGluIHByb3RvY29sIDAuCitUaGF0J3Mgd2h5IGl0IHdhcyBjYWxsZWQgdGV4dCBtb2RlLiAgUHJvdG9jb2wgMCBpcyBzbWFsbCBhbmQgZWxlZ2FudCwgYnV0Citzb21ldGltZXMgcGFpbmZ1bGx5IGluZWZmaWNpZW50LgorCitUaGUgc2Vjb25kIG1ham9yIHNldCBvZiBhZGRpdGlvbnMgaXMgbm93IGNhbGxlZCAicHJvdG9jb2wgMSIsIGFuZCB3YXMgY2FsbGVkCisiYmluYXJ5IG1vZGUiIGJlZm9yZSBQeXRob24gMi4zLiAgVGhpcyBhZGRlZCBtYW55IG9wY29kZXMgd2l0aCBhcmd1bWVudHMKK2NvbnNpc3Rpbmcgb2YgYXJiaXRyYXJ5IGJ5dGVzLCBpbmNsdWRpbmcgTlVMIGJ5dGVzIGFuZCB1bnByaW50YWJsZSAiaGlnaCBiaXQiCitieXRlcy4gIEJpbmFyeSBtb2RlIHBpY2tsZXMgY2FuIGJlIHN1YnN0YW50aWFsbHkgc21hbGxlciB0aGFuIGVxdWl2YWxlbnQKK3RleHQgbW9kZSBwaWNrbGVzLCBhbmQgc29tZXRpbWVzIGZhc3RlciB0b287IGUuZy4sIEJJTklOVCByZXByZXNlbnRzIGEgNC1ieXRlCitpbnQgYXMgNCBieXRlcyBmb2xsb3dpbmcgdGhlIG9wY29kZSwgd2hpY2ggaXMgY2hlYXBlciB0byB1bnBpY2tsZSB0aGFuIHRoZQorKHBlcmhhcHMpIDExLWNoYXJhY3RlciBkZWNpbWFsIHN0cmluZyBhdHRhY2hlZCB0byBJTlQuICBQcm90b2NvbCAxIGFsc28gYWRkZWQKK2EgbnVtYmVyIG9mIG9wY29kZXMgdGhhdCBvcGVyYXRlIG9uIG1hbnkgc3RhY2sgZWxlbWVudHMgYXQgb25jZSAobGlrZSBBUFBFTkRTCithbmQgU0VUSVRFTVMpLCBhbmQgInNob3J0Y3V0IiBvcGNvZGVzIChsaWtlIEVNUFRZX0RJQ1QgYW5kIEVNUFRZX1RVUExFKS4KKworVGhlIHRoaXJkIG1ham9yIHNldCBvZiBhZGRpdGlvbnMgY2FtZSBpbiBQeXRob24gMi4zLCBhbmQgaXMgY2FsbGVkICJwcm90b2NvbAorMiIuICBUaGlzIGFkZGVkOgorCistIEEgYmV0dGVyIHdheSB0byBwaWNrbGUgaW5zdGFuY2VzIG9mIG5ldy1zdHlsZSBjbGFzc2VzIChORVdPQkopLgorCistIEEgd2F5IGZvciBhIHBpY2tsZSB0byBpZGVudGlmeSBpdHMgcHJvdG9jb2wgKFBST1RPKS4KKworLSBUaW1lLSBhbmQgc3BhY2UtIGVmZmljaWVudCBwaWNrbGluZyBvZiBsb25nIGludHMgKExPTkd7MSw0fSkuCisKKy0gU2hvcnRjdXRzIGZvciBzbWFsbCB0dXBsZXMgKFRVUExFezEsMiwzfX0uCisKKy0gRGVkaWNhdGVkIG9wY29kZXMgZm9yIGJvb2xzIChORVdUUlVFLCBORVdGQUxTRSkuCisKKy0gVGhlICJleHRlbnNpb24gcmVnaXN0cnkiLCBhIHZlY3RvciBvZiBwb3B1bGFyIG9iamVjdHMgdGhhdCBjYW4gYmUgcHVzaGVkCisgIGVmZmljaWVudGx5IGJ5IGluZGV4IChFWFR7MSwyLDR9KS4gIFRoaXMgaXMgYWtpbiB0byB0aGUgbWVtbyBhbmQgR0VULCBidXQKKyAgdGhlIHJlZ2lzdHJ5IGNvbnRlbnRzIGFyZSBwcmVkZWZpbmVkICh0aGVyZSdzIG5vdGhpbmcgYWtpbiB0byB0aGUgbWVtbydzCisgIFBVVCkuCisKK0Fub3RoZXIgaW5kZXBlbmRlbnQgY2hhbmdlIHdpdGggUHl0aG9uIDIuMyBpcyB0aGUgYWJhbmRvbm1lbnQgb2YgYW55CitwcmV0ZW5zZSB0aGF0IGl0IG1pZ2h0IGJlIHNhZmUgdG8gbG9hZCBwaWNrbGVzIHJlY2VpdmVkIGZyb20gdW50cnVzdGVkCitwYXJ0aWVzIC0tIG5vIHN1ZmZpY2llbnQgc2VjdXJpdHkgYW5hbHlzaXMgaGFzIGJlZW4gZG9uZSB0byBndWFyYW50ZWUKK3RoaXMgYW5kIHRoZXJlIGlzbid0IGEgdXNlIGNhc2UgdGhhdCB3YXJyYW50cyB0aGUgZXhwZW5zZSBvZiBzdWNoIGFuCithbmFseXNpcy4KKworVG8gdGhpcyBlbmQsIGFsbCB0ZXN0cyBmb3IgX19zYWZlX2Zvcl91bnBpY2tsaW5nX18gb3IgZm9yCitjb3B5X3JlZy5zYWZlX2NvbnN0cnVjdG9ycyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSB1bnBpY2tsaW5nIGNvZGUuCitSZWZlcmVuY2VzIHRvIHRoZXNlIHZhcmlhYmxlcyBpbiB0aGUgZGVzY3JpcHRpb25zIGJlbG93IGFyZSB0byBiZSBzZWVuCithcyBkZXNjcmliaW5nIHVucGlja2xpbmcgaW4gUHl0aG9uIDIuMiBhbmQgYmVmb3JlLgorIiIiCisKKyMgTWV0YS1ydWxlOiAgRGVzY3JpcHRpb25zIGFyZSBzdG9yZWQgaW4gaW5zdGFuY2VzIG9mIGRlc2NyaXB0b3Igb2JqZWN0cywKKyMgd2l0aCBwbGFpbiBjb25zdHJ1Y3RvcnMuICBObyBtZXRhLWxhbmd1YWdlIGlzIGRlZmluZWQgZnJvbSB3aGljaAorIyBkZXNjcmlwdG9ycyBjb3VsZCBiZSBjb25zdHJ1Y3RlZC4gIElmIHlvdSB3YW50LCBlLmcuLCBYTUwsIHdyaXRlIGEgbGl0dGxlCisjIHByb2dyYW0gdG8gZ2VuZXJhdGUgWE1MIGZyb20gdGhlIG9iamVjdHMuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTb21lIHBpY2tsZSBvcGNvZGVzIGhhdmUgYW4gYXJndW1lbnQsIGZvbGxvd2luZyB0aGUgb3Bjb2RlIGluIHRoZQorIyBieXRlc3RyZWFtLiAgQW4gYXJndW1lbnQgaXMgb2YgYSBzcGVjaWZpYyB0eXBlLCBkZXNjcmliZWQgYnkgYW4gaW5zdGFuY2UKKyMgb2YgQXJndW1lbnREZXNjcmlwdG9yLiAgVGhlc2UgYXJlIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGFyZ3VtZW50cyB0YWtlbgorIyBvZmYgdGhlIHN0YWNrIC0tIEFyZ3VtZW50RGVzY3JpcHRvciBhcHBsaWVzIG9ubHkgdG8gYXJndW1lbnRzIGVtYmVkZGVkIGluCisjIHRoZSBvcGNvZGUgc3RyZWFtLCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgYW4gb3Bjb2RlLgorCisjIFJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBieSBhbiBhcmd1bWVudCBkZWxpbWl0ZWQgYnkgdGhlCisjIG5leHQgbmV3bGluZSBjaGFyYWN0ZXIuCitVUF9UT19ORVdMSU5FID0gLTEKKworIyBSZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgYnkgYSB0d28tYXJndW1lbnQgb3Bjb2RlIHdoZXJlCisjIHRoZSBmaXJzdCBhcmd1bWVudCBnaXZlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzZWNvbmQgYXJndW1lbnQuCitUQUtFTl9GUk9NX0FSR1VNRU5UMSA9IC0yICAgIyBudW0gYnl0ZXMgaXMgMS1ieXRlIHVuc2lnbmVkIGludAorVEFLRU5fRlJPTV9BUkdVTUVOVDQgPSAtMyAgICMgbnVtIGJ5dGVzIGlzIDQtYnl0ZSBzaWduZWQgbGl0dGxlLWVuZGlhbiBpbnQKKworY2xhc3MgQXJndW1lbnREZXNjcmlwdG9yKG9iamVjdCk6CisgICAgX19zbG90c19fID0gKAorICAgICAgICAjIG5hbWUgb2YgZGVzY3JpcHRvciByZWNvcmQsIGFsc28gYSBtb2R1bGUgZ2xvYmFsIG5hbWU7IGEgc3RyaW5nCisgICAgICAgICduYW1lJywKKworICAgICAgICAjIGxlbmd0aCBvZiBhcmd1bWVudCwgaW4gYnl0ZXM7IGFuIGludDsgVVBfVE9fTkVXTElORSBhbmQKKyAgICAgICAgIyBUQUtFTl9GUk9NX0FSR1VNRU5UezEsNH0gYXJlIG5lZ2F0aXZlIHZhbHVlcyBmb3IgdmFyaWFibGUtbGVuZ3RoCisgICAgICAgICMgY2FzZXMKKyAgICAgICAgJ24nLAorCisgICAgICAgICMgYSBmdW5jdGlvbiB0YWtpbmcgYSBmaWxlLWxpa2Ugb2JqZWN0LCByZWFkaW5nIHRoaXMga2luZCBvZiBhcmd1bWVudAorICAgICAgICAjIGZyb20gdGhlIG9iamVjdCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwgYWR2YW5jaW5nIHRoZSBjdXJyZW50CisgICAgICAgICMgcG9zaXRpb24gYnkgbiBieXRlcywgYW5kIHJldHVybmluZyB0aGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50CisgICAgICAgICdyZWFkZXInLAorCisgICAgICAgICMgaHVtYW4tcmVhZGFibGUgZG9jcyBmb3IgdGhpcyBhcmcgZGVzY3JpcHRvcjsgYSBzdHJpbmcKKyAgICAgICAgJ2RvYycsCisgICAgKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG4sIHJlYWRlciwgZG9jKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmFtZSwgc3RyKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobiwgaW50KSBhbmQgKG4gPj0gMCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiBpbiAoVVBfVE9fTkVXTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBS0VOX0ZST01fQVJHVU1FTlQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFLRU5fRlJPTV9BUkdVTUVOVDQpKQorICAgICAgICBzZWxmLm4gPSBuCisKKyAgICAgICAgc2VsZi5yZWFkZXIgPSByZWFkZXIKKworICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkb2MsIHN0cikKKyAgICAgICAgc2VsZi5kb2MgPSBkb2MKKworZnJvbSBzdHJ1Y3QgaW1wb3J0IHVucGFjayBhcyBfdW5wYWNrCisKK2RlZiByZWFkX3VpbnQxKGYpOgorICAgIHIiIiIKKyAgICA+Pj4gaW1wb3J0IFN0cmluZ0lPCisgICAgPj4+IHJlYWRfdWludDEoU3RyaW5nSU8uU3RyaW5nSU8oJ1x4ZmYnKSkKKyAgICAyNTUKKyAgICAiIiIKKworICAgIGRhdGEgPSBmLnJlYWQoMSkKKyAgICBpZiBkYXRhOgorICAgICAgICByZXR1cm4gb3JkKGRhdGEpCisgICAgcmFpc2UgVmFsdWVFcnJvcigibm90IGVub3VnaCBkYXRhIGluIHN0cmVhbSB0byByZWFkIHVpbnQxIikKKwordWludDEgPSBBcmd1bWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICBuYW1lPSd1aW50MScsCisgICAgICAgICAgICBuPTEsCisgICAgICAgICAgICByZWFkZXI9cmVhZF91aW50MSwKKyAgICAgICAgICAgIGRvYz0iT25lLWJ5dGUgdW5zaWduZWQgaW50ZWdlci4iKQorCisKK2RlZiByZWFkX3VpbnQyKGYpOgorICAgIHIiIiIKKyAgICA+Pj4gaW1wb3J0IFN0cmluZ0lPCisgICAgPj4+IHJlYWRfdWludDIoU3RyaW5nSU8uU3RyaW5nSU8oJ1x4ZmZceDAwJykpCisgICAgMjU1CisgICAgPj4+IHJlYWRfdWludDIoU3RyaW5nSU8uU3RyaW5nSU8oJ1x4ZmZceGZmJykpCisgICAgNjU1MzUKKyAgICAiIiIKKworICAgIGRhdGEgPSBmLnJlYWQoMikKKyAgICBpZiBsZW4oZGF0YSkgPT0gMjoKKyAgICAgICAgcmV0dXJuIF91bnBhY2soIjxIIiwgZGF0YSlbMF0KKyAgICByYWlzZSBWYWx1ZUVycm9yKCJub3QgZW5vdWdoIGRhdGEgaW4gc3RyZWFtIHRvIHJlYWQgdWludDIiKQorCit1aW50MiA9IEFyZ3VtZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgIG5hbWU9J3VpbnQyJywKKyAgICAgICAgICAgIG49MiwKKyAgICAgICAgICAgIHJlYWRlcj1yZWFkX3VpbnQyLAorICAgICAgICAgICAgZG9jPSJUd28tYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyLCBsaXR0bGUtZW5kaWFuLiIpCisKKworZGVmIHJlYWRfaW50NChmKToKKyAgICByIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworICAgID4+PiByZWFkX2ludDQoU3RyaW5nSU8uU3RyaW5nSU8oJ1x4ZmZceDAwXHgwMFx4MDAnKSkKKyAgICAyNTUKKyAgICA+Pj4gcmVhZF9pbnQ0KFN0cmluZ0lPLlN0cmluZ0lPKCdceDAwXHgwMFx4MDBceDgwJykpID09IC0oMioqMzEpCisgICAgVHJ1ZQorICAgICIiIgorCisgICAgZGF0YSA9IGYucmVhZCg0KQorICAgIGlmIGxlbihkYXRhKSA9PSA0OgorICAgICAgICByZXR1cm4gX3VucGFjaygiPGkiLCBkYXRhKVswXQorICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vdCBlbm91Z2ggZGF0YSBpbiBzdHJlYW0gdG8gcmVhZCBpbnQ0IikKKworaW50NCA9IEFyZ3VtZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgbmFtZT0naW50NCcsCisgICAgICAgICAgIG49NCwKKyAgICAgICAgICAgcmVhZGVyPXJlYWRfaW50NCwKKyAgICAgICAgICAgZG9jPSJGb3VyLWJ5dGUgc2lnbmVkIGludGVnZXIsIGxpdHRsZS1lbmRpYW4sIDIncyBjb21wbGVtZW50LiIpCisKKworZGVmIHJlYWRfc3RyaW5nbmwoZiwgZGVjb2RlPVRydWUsIHN0cmlwcXVvdGVzPVRydWUpOgorICAgIHIiIiIKKyAgICA+Pj4gaW1wb3J0IFN0cmluZ0lPCisgICAgPj4+IHJlYWRfc3RyaW5nbmwoU3RyaW5nSU8uU3RyaW5nSU8oIidhYmNkJ1xuZWZnXG4iKSkKKyAgICAnYWJjZCcKKworICAgID4+PiByZWFkX3N0cmluZ25sKFN0cmluZ0lPLlN0cmluZ0lPKCJcbiIpKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4KKyAgICBWYWx1ZUVycm9yOiBubyBzdHJpbmcgcXVvdGVzIGFyb3VuZCAnJworCisgICAgPj4+IHJlYWRfc3RyaW5nbmwoU3RyaW5nSU8uU3RyaW5nSU8oIlxuIiksIHN0cmlwcXVvdGVzPUZhbHNlKQorICAgICcnCisKKyAgICA+Pj4gcmVhZF9zdHJpbmdubChTdHJpbmdJTy5TdHJpbmdJTygiJydcbiIpKQorICAgICcnCisKKyAgICA+Pj4gcmVhZF9zdHJpbmdubChTdHJpbmdJTy5TdHJpbmdJTygnImFiY2QiJykpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLgorICAgIFZhbHVlRXJyb3I6IG5vIG5ld2xpbmUgZm91bmQgd2hlbiB0cnlpbmcgdG8gcmVhZCBzdHJpbmdubAorCisgICAgRW1iZWRkZWQgZXNjYXBlcyBhcmUgdW5kb25lIGluIHRoZSByZXN1bHQuCisgICAgPj4+IHJlYWRfc3RyaW5nbmwoU3RyaW5nSU8uU3RyaW5nSU8ociInYVxuXFxiXHgwMGNcdGQnIiArICJcbidlJyIpKQorICAgICdhXG5cXGJceDAwY1x0ZCcKKyAgICAiIiIKKworICAgIGRhdGEgPSBmLnJlYWRsaW5lKCkKKyAgICBpZiBub3QgZGF0YS5lbmRzd2l0aCgnXG4nKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm8gbmV3bGluZSBmb3VuZCB3aGVuIHRyeWluZyB0byByZWFkIHN0cmluZ25sIikKKyAgICBkYXRhID0gZGF0YVs6LTFdICAgICMgbG9zZSB0aGUgbmV3bGluZQorCisgICAgaWYgc3RyaXBxdW90ZXM6CisgICAgICAgIGZvciBxIGluICInXCIiOgorICAgICAgICAgICAgaWYgZGF0YS5zdGFydHN3aXRoKHEpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhLmVuZHN3aXRoKHEpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdHJpbnEgcXVvdGUgJXIgbm90IGZvdW5kIGF0IGJvdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmRzIG9mICVyIiAlIChxLCBkYXRhKSkKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVsxOi0xXQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJubyBzdHJpbmcgcXVvdGVzIGFyb3VuZCAlciIgJSBkYXRhKQorCisgICAgIyBJJ20gbm90IHN1cmUgd2hlbiAnc3RyaW5nX2VzY2FwZScgd2FzIGFkZGVkIHRvIHRoZSBzdGQgY29kZWNzOyBpdCdzCisgICAgIyBjcmF6eSBub3QgdG8gdXNlIGl0IGlmIGl0J3MgdGhlcmUuCisgICAgaWYgZGVjb2RlOgorICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoJ3N0cmluZ19lc2NhcGUnKQorICAgIHJldHVybiBkYXRhCisKK3N0cmluZ25sID0gQXJndW1lbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgbmFtZT0nc3RyaW5nbmwnLAorICAgICAgICAgICAgICAgbj1VUF9UT19ORVdMSU5FLAorICAgICAgICAgICAgICAgcmVhZGVyPXJlYWRfc3RyaW5nbmwsCisgICAgICAgICAgICAgICBkb2M9IiIiQSBuZXdsaW5lLXRlcm1pbmF0ZWQgc3RyaW5nLgorCisgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIHJlcHItc3R5bGUgc3RyaW5nLCB3aXRoIGVtYmVkZGVkIGVzY2FwZXMsIGFuZAorICAgICAgICAgICAgICAgICAgIGJyYWNrZXRpbmcgcXVvdGVzLgorICAgICAgICAgICAgICAgICAgICIiIikKKworZGVmIHJlYWRfc3RyaW5nbmxfbm9lc2NhcGUoZik6CisgICAgcmV0dXJuIHJlYWRfc3RyaW5nbmwoZiwgZGVjb2RlPUZhbHNlLCBzdHJpcHF1b3Rlcz1GYWxzZSkKKworc3RyaW5nbmxfbm9lc2NhcGUgPSBBcmd1bWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSdzdHJpbmdubF9ub2VzY2FwZScsCisgICAgICAgICAgICAgICAgICAgICAgICBuPVVQX1RPX05FV0xJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXI9cmVhZF9zdHJpbmdubF9ub2VzY2FwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvYz0iIiJBIG5ld2xpbmUtdGVybWluYXRlZCBzdHJpbmcuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBzdHItc3R5bGUgc3RyaW5nLCB3aXRob3V0IGVtYmVkZGVkIGVzY2FwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBvciBicmFja2V0aW5nIHF1b3Rlcy4gIEl0IHNob3VsZCBjb25zaXN0IHNvbGVseSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAiIiIpCisKK2RlZiByZWFkX3N0cmluZ25sX25vZXNjYXBlX3BhaXIoZik6CisgICAgciIiIgorICAgID4+PiBpbXBvcnQgU3RyaW5nSU8KKyAgICA+Pj4gcmVhZF9zdHJpbmdubF9ub2VzY2FwZV9wYWlyKFN0cmluZ0lPLlN0cmluZ0lPKCJRdWV1ZVxuRW1wdHlcbmp1bmsiKSkKKyAgICAnUXVldWUgRW1wdHknCisgICAgIiIiCisKKyAgICByZXR1cm4gIiVzICVzIiAlIChyZWFkX3N0cmluZ25sX25vZXNjYXBlKGYpLCByZWFkX3N0cmluZ25sX25vZXNjYXBlKGYpKQorCitzdHJpbmdubF9ub2VzY2FwZV9wYWlyID0gQXJndW1lbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSdzdHJpbmdubF9ub2VzY2FwZV9wYWlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbj1VUF9UT19ORVdMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXI9cmVhZF9zdHJpbmdubF9ub2VzY2FwZV9wYWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2M9IiIiQSBwYWlyIG9mIG5ld2xpbmUtdGVybWluYXRlZCBzdHJpbmdzLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZXNlIGFyZSBzdHItc3R5bGUgc3RyaW5ncywgd2l0aG91dCBlbWJlZGRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVzLCBvciBicmFja2V0aW5nIHF1b3Rlcy4gIFRoZXkgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNpc3Qgc29sZWx5IG9mIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgcGFpciBpcyByZXR1cm5lZCBhcyBhIHNpbmdsZSBzdHJpbmcsIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBzaW5nbGUgYmxhbmsgc2VwYXJhdGluZyB0aGUgdHdvIHN0cmluZ3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIikKKworZGVmIHJlYWRfc3RyaW5nNChmKToKKyAgICByIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworICAgID4+PiByZWFkX3N0cmluZzQoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDBceDAwXHgwMFx4MDBhYmMiKSkKKyAgICAnJworICAgID4+PiByZWFkX3N0cmluZzQoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDNceDAwXHgwMFx4MDBhYmNkZWYiKSkKKyAgICAnYWJjJworICAgID4+PiByZWFkX3N0cmluZzQoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDBceDAwXHgwMFx4MDNhYmNkZWYiKSkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uCisgICAgVmFsdWVFcnJvcjogZXhwZWN0ZWQgNTAzMzE2NDggYnl0ZXMgaW4gYSBzdHJpbmc0LCBidXQgb25seSA2IHJlbWFpbgorICAgICIiIgorCisgICAgbiA9IHJlYWRfaW50NChmKQorICAgIGlmIG4gPCAwOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdHJpbmc0IGJ5dGUgY291bnQgPCAwOiAlZCIgJSBuKQorICAgIGRhdGEgPSBmLnJlYWQobikKKyAgICBpZiBsZW4oZGF0YSkgPT0gbjoKKyAgICAgICAgcmV0dXJuIGRhdGEKKyAgICByYWlzZSBWYWx1ZUVycm9yKCJleHBlY3RlZCAlZCBieXRlcyBpbiBhIHN0cmluZzQsIGJ1dCBvbmx5ICVkIHJlbWFpbiIgJQorICAgICAgICAgICAgICAgICAgICAgKG4sIGxlbihkYXRhKSkpCisKK3N0cmluZzQgPSBBcmd1bWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgIG5hbWU9InN0cmluZzQiLAorICAgICAgICAgICAgICBuPVRBS0VOX0ZST01fQVJHVU1FTlQ0LAorICAgICAgICAgICAgICByZWFkZXI9cmVhZF9zdHJpbmc0LAorICAgICAgICAgICAgICBkb2M9IiIiQSBjb3VudGVkIHN0cmluZy4KKworICAgICAgICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYSA0LWJ5dGUgbGl0dGxlLWVuZGlhbiBzaWduZWQgaW50IGdpdmluZworICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJpbmcsIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzCisgICAgICAgICAgICAgIHRoYXQgbWFueSBieXRlcy4KKyAgICAgICAgICAgICAgIiIiKQorCisKK2RlZiByZWFkX3N0cmluZzEoZik6CisgICAgciIiIgorICAgID4+PiBpbXBvcnQgU3RyaW5nSU8KKyAgICA+Pj4gcmVhZF9zdHJpbmcxKFN0cmluZ0lPLlN0cmluZ0lPKCJceDAwIikpCisgICAgJycKKyAgICA+Pj4gcmVhZF9zdHJpbmcxKFN0cmluZ0lPLlN0cmluZ0lPKCJceDAzYWJjZGVmIikpCisgICAgJ2FiYycKKyAgICAiIiIKKworICAgIG4gPSByZWFkX3VpbnQxKGYpCisgICAgYXNzZXJ0IG4gPj0gMAorICAgIGRhdGEgPSBmLnJlYWQobikKKyAgICBpZiBsZW4oZGF0YSkgPT0gbjoKKyAgICAgICAgcmV0dXJuIGRhdGEKKyAgICByYWlzZSBWYWx1ZUVycm9yKCJleHBlY3RlZCAlZCBieXRlcyBpbiBhIHN0cmluZzEsIGJ1dCBvbmx5ICVkIHJlbWFpbiIgJQorICAgICAgICAgICAgICAgICAgICAgKG4sIGxlbihkYXRhKSkpCisKK3N0cmluZzEgPSBBcmd1bWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgIG5hbWU9InN0cmluZzEiLAorICAgICAgICAgICAgICBuPVRBS0VOX0ZST01fQVJHVU1FTlQxLAorICAgICAgICAgICAgICByZWFkZXI9cmVhZF9zdHJpbmcxLAorICAgICAgICAgICAgICBkb2M9IiIiQSBjb3VudGVkIHN0cmluZy4KKworICAgICAgICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYSAxLWJ5dGUgdW5zaWduZWQgaW50IGdpdmluZyB0aGUgbnVtYmVyCisgICAgICAgICAgICAgIG9mIGJ5dGVzIGluIHRoZSBzdHJpbmcsIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoYXQgbWFueQorICAgICAgICAgICAgICBieXRlcy4KKyAgICAgICAgICAgICAgIiIiKQorCisKK2RlZiByZWFkX3VuaWNvZGVzdHJpbmdubChmKToKKyAgICByIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworICAgID4+PiByZWFkX3VuaWNvZGVzdHJpbmdubChTdHJpbmdJTy5TdHJpbmdJTygiYWJjXHVhYmNkXG5qdW5rIikpCisgICAgdSdhYmNcdWFiY2QnCisgICAgIiIiCisKKyAgICBkYXRhID0gZi5yZWFkbGluZSgpCisgICAgaWYgbm90IGRhdGEuZW5kc3dpdGgoJ1xuJyk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vIG5ld2xpbmUgZm91bmQgd2hlbiB0cnlpbmcgdG8gcmVhZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInVuaWNvZGVzdHJpbmdubCIpCisgICAgZGF0YSA9IGRhdGFbOi0xXSAgICAjIGxvc2UgdGhlIG5ld2xpbmUKKyAgICByZXR1cm4gdW5pY29kZShkYXRhLCAncmF3LXVuaWNvZGUtZXNjYXBlJykKKwordW5pY29kZXN0cmluZ25sID0gQXJndW1lbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J3VuaWNvZGVzdHJpbmdubCcsCisgICAgICAgICAgICAgICAgICAgICAgbj1VUF9UT19ORVdMSU5FLAorICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcj1yZWFkX3VuaWNvZGVzdHJpbmdubCwKKyAgICAgICAgICAgICAgICAgICAgICBkb2M9IiIiQSBuZXdsaW5lLXRlcm1pbmF0ZWQgVW5pY29kZSBzdHJpbmcuCisKKyAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHJhdy11bmljb2RlLWVzY2FwZSBlbmNvZGVkLCBzbyBjb25zaXN0cyBvZgorICAgICAgICAgICAgICAgICAgICAgIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzLCBhbmQgbWF5IGNvbnRhaW4gZW1iZWRkZWQKKyAgICAgICAgICAgICAgICAgICAgICBlc2NhcGUgc2VxdWVuY2VzLgorICAgICAgICAgICAgICAgICAgICAgICIiIikKKworZGVmIHJlYWRfdW5pY29kZXN0cmluZzQoZik6CisgICAgciIiIgorICAgID4+PiBpbXBvcnQgU3RyaW5nSU8KKyAgICA+Pj4gcyA9IHUnYWJjZFx1YWJjZCcKKyAgICA+Pj4gZW5jID0gcy5lbmNvZGUoJ3V0Zi04JykKKyAgICA+Pj4gZW5jCisgICAgJ2FiY2RceGVhXHhhZlx4OGQnCisgICAgPj4+IG4gPSBjaHIobGVuKGVuYykpICsgY2hyKDApICogMyAgIyBsaXR0bGUtZW5kaWFuIDQtYnl0ZSBsZW5ndGgKKyAgICA+Pj4gdCA9IHJlYWRfdW5pY29kZXN0cmluZzQoU3RyaW5nSU8uU3RyaW5nSU8obiArIGVuYyArICdqdW5rJykpCisgICAgPj4+IHMgPT0gdAorICAgIFRydWUKKworICAgID4+PiByZWFkX3VuaWNvZGVzdHJpbmc0KFN0cmluZ0lPLlN0cmluZ0lPKG4gKyBlbmNbOi0xXSkpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLgorICAgIFZhbHVlRXJyb3I6IGV4cGVjdGVkIDcgYnl0ZXMgaW4gYSB1bmljb2Rlc3RyaW5nNCwgYnV0IG9ubHkgNiByZW1haW4KKyAgICAiIiIKKworICAgIG4gPSByZWFkX2ludDQoZikKKyAgICBpZiBuIDwgMDoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5pY29kZXN0cmluZzQgYnl0ZSBjb3VudCA8IDA6ICVkIiAlIG4pCisgICAgZGF0YSA9IGYucmVhZChuKQorICAgIGlmIGxlbihkYXRhKSA9PSBuOgorICAgICAgICByZXR1cm4gdW5pY29kZShkYXRhLCAndXRmLTgnKQorICAgIHJhaXNlIFZhbHVlRXJyb3IoImV4cGVjdGVkICVkIGJ5dGVzIGluIGEgdW5pY29kZXN0cmluZzQsIGJ1dCBvbmx5ICVkICIKKyAgICAgICAgICAgICAgICAgICAgICJyZW1haW4iICUgKG4sIGxlbihkYXRhKSkpCisKK3VuaWNvZGVzdHJpbmc0ID0gQXJndW1lbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICBuYW1lPSJ1bmljb2Rlc3RyaW5nNCIsCisgICAgICAgICAgICAgICAgICAgIG49VEFLRU5fRlJPTV9BUkdVTUVOVDQsCisgICAgICAgICAgICAgICAgICAgIHJlYWRlcj1yZWFkX3VuaWNvZGVzdHJpbmc0LAorICAgICAgICAgICAgICAgICAgICBkb2M9IiIiQSBjb3VudGVkIFVuaWNvZGUgc3RyaW5nLgorCisgICAgICAgICAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIDQtYnl0ZSBsaXR0bGUtZW5kaWFuIHNpZ25lZCBpbnQKKyAgICAgICAgICAgICAgICAgICAgZ2l2aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHN0cmluZywgYW5kIHRoZSBzZWNvbmQKKyAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQtLSB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgdGhlIFVuaWNvZGUgc3RyaW5nIC0tCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoYXQgbWFueSBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgIiIiKQorCisKK2RlZiByZWFkX2RlY2ltYWxubF9zaG9ydChmKToKKyAgICByIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworICAgID4+PiByZWFkX2RlY2ltYWxubF9zaG9ydChTdHJpbmdJTy5TdHJpbmdJTygiMTIzNFxuNTYiKSkKKyAgICAxMjM0CisKKyAgICA+Pj4gcmVhZF9kZWNpbWFsbmxfc2hvcnQoU3RyaW5nSU8uU3RyaW5nSU8oIjEyMzRMXG41NiIpKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4KKyAgICBWYWx1ZUVycm9yOiB0cmFpbGluZyAnTCcgbm90IGFsbG93ZWQgaW4gJzEyMzRMJworICAgICIiIgorCisgICAgcyA9IHJlYWRfc3RyaW5nbmwoZiwgZGVjb2RlPUZhbHNlLCBzdHJpcHF1b3Rlcz1GYWxzZSkKKyAgICBpZiBzLmVuZHN3aXRoKCJMIik6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInRyYWlsaW5nICdMJyBub3QgYWxsb3dlZCBpbiAlciIgJSBzKQorCisgICAgIyBJdCdzIG5vdCBuZWNlc3NhcmlseSB0cnVlIHRoYXQgdGhlIHJlc3VsdCBmaXRzIGluIGEgUHl0aG9uIHNob3J0IGludDoKKyAgICAjIHRoZSBwaWNrbGUgbWF5IGhhdmUgYmVlbiB3cml0dGVuIG9uIGEgNjQtYml0IGJveC4gIFRoZXJlJ3MgYWxzbyBhIGhhY2sKKyAgICAjIGZvciBUcnVlIGFuZCBGYWxzZSBoZXJlLgorICAgIGlmIHMgPT0gIjAwIjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZWxpZiBzID09ICIwMSI6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBpbnQocykKKyAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgcmV0dXJuIGxvbmcocykKKworZGVmIHJlYWRfZGVjaW1hbG5sX2xvbmcoZik6CisgICAgciIiIgorICAgID4+PiBpbXBvcnQgU3RyaW5nSU8KKworICAgID4+PiByZWFkX2RlY2ltYWxubF9sb25nKFN0cmluZ0lPLlN0cmluZ0lPKCIxMjM0XG41NiIpKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4KKyAgICBWYWx1ZUVycm9yOiB0cmFpbGluZyAnTCcgcmVxdWlyZWQgaW4gJzEyMzQnCisKKyAgICBTb21lZGF5IHRoZSB0cmFpbGluZyAnTCcgd2lsbCBwcm9iYWJseSBnbyBhd2F5IGZyb20gdGhpcyBvdXRwdXQuCisKKyAgICA+Pj4gcmVhZF9kZWNpbWFsbmxfbG9uZyhTdHJpbmdJTy5TdHJpbmdJTygiMTIzNExcbjU2IikpCisgICAgMTIzNEwKKworICAgID4+PiByZWFkX2RlY2ltYWxubF9sb25nKFN0cmluZ0lPLlN0cmluZ0lPKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzRMXG42IikpCisgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0TAorICAgICIiIgorCisgICAgcyA9IHJlYWRfc3RyaW5nbmwoZiwgZGVjb2RlPUZhbHNlLCBzdHJpcHF1b3Rlcz1GYWxzZSkKKyAgICBpZiBub3Qgcy5lbmRzd2l0aCgiTCIpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ0cmFpbGluZyAnTCcgcmVxdWlyZWQgaW4gJXIiICUgcykKKyAgICByZXR1cm4gbG9uZyhzKQorCisKK2RlY2ltYWxubF9zaG9ydCA9IEFyZ3VtZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lPSdkZWNpbWFsbmxfc2hvcnQnLAorICAgICAgICAgICAgICAgICAgICAgIG49VVBfVE9fTkVXTElORSwKKyAgICAgICAgICAgICAgICAgICAgICByZWFkZXI9cmVhZF9kZWNpbWFsbmxfc2hvcnQsCisgICAgICAgICAgICAgICAgICAgICAgZG9jPSIiIkEgbmV3bGluZS10ZXJtaW5hdGVkIGRlY2ltYWwgaW50ZWdlciBsaXRlcmFsLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbmV2ZXIgaGFzIGEgdHJhaWxpbmcgJ0wnLCBhbmQgdGhlIGludGVnZXIgZml0CisgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGEgc2hvcnQgUHl0aG9uIGludCBvbiB0aGUgYm94IHdoZXJlIHRoZSBwaWNrbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHdyaXR0ZW4gLS0gYnV0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIGl0IHdpbGwgZml0CisgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGEgc2hvcnQgUHl0aG9uIGludCBvbiB0aGUgYm94IHdoZXJlIHRoZSBwaWNrbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcmVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiKQorCitkZWNpbWFsbmxfbG9uZyA9IEFyZ3VtZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICAgICAgIG5hbWU9J2RlY2ltYWxubF9sb25nJywKKyAgICAgICAgICAgICAgICAgICAgIG49VVBfVE9fTkVXTElORSwKKyAgICAgICAgICAgICAgICAgICAgIHJlYWRlcj1yZWFkX2RlY2ltYWxubF9sb25nLAorICAgICAgICAgICAgICAgICAgICAgZG9jPSIiIkEgbmV3bGluZS10ZXJtaW5hdGVkIGRlY2ltYWwgaW50ZWdlciBsaXRlcmFsLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBoYXMgYSB0cmFpbGluZyAnTCcsIGFuZCBjYW4gcmVwcmVzZW50IGludGVnZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgb2YgYW55IHNpemUuCisgICAgICAgICAgICAgICAgICAgICAgICAgIiIiKQorCisKK2RlZiByZWFkX2Zsb2F0bmwoZik6CisgICAgciIiIgorICAgID4+PiBpbXBvcnQgU3RyaW5nSU8KKyAgICA+Pj4gcmVhZF9mbG9hdG5sKFN0cmluZ0lPLlN0cmluZ0lPKCItMS4yNVxuNiIpKQorICAgIC0xLjI1CisgICAgIiIiCisgICAgcyA9IHJlYWRfc3RyaW5nbmwoZiwgZGVjb2RlPUZhbHNlLCBzdHJpcHF1b3Rlcz1GYWxzZSkKKyAgICByZXR1cm4gZmxvYXQocykKKworZmxvYXRubCA9IEFyZ3VtZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgbmFtZT0nZmxvYXRubCcsCisgICAgICAgICAgICAgIG49VVBfVE9fTkVXTElORSwKKyAgICAgICAgICAgICAgcmVhZGVyPXJlYWRfZmxvYXRubCwKKyAgICAgICAgICAgICAgZG9jPSIiIkEgbmV3bGluZS10ZXJtaW5hdGVkIGRlY2ltYWwgZmxvYXRpbmcgbGl0ZXJhbC4KKworICAgICAgICAgICAgICBJbiBnZW5lcmFsIHRoaXMgcmVxdWlyZXMgMTcgc2lnbmlmaWNhbnQgZGlnaXRzIGZvciByb3VuZHRyaXAKKyAgICAgICAgICAgICAgaWRlbnRpdHksIGFuZCBwaWNrbGluZyB0aGVuIHVucGlja2xpbmcgaW5maW5pdGllcywgTmFOcywgYW5kCisgICAgICAgICAgICAgIG1pbnVzIHplcm8gZG9lc24ndCB3b3JrIGFjcm9zcyBib3hlcywgb3Igb24gc29tZSBib3hlcyBldmVuCisgICAgICAgICAgICAgIG9uIGl0c2VsZiAoZS5nLiwgV2luZG93cyBjYW4ndCByZWFkIHRoZSBzdHJpbmdzIGl0IHByb2R1Y2VzCisgICAgICAgICAgICAgIGZvciBpbmZpbml0aWVzIG9yIE5hTnMpLgorICAgICAgICAgICAgICAiIiIpCisKK2RlZiByZWFkX2Zsb2F0OChmKToKKyAgICByIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTywgc3RydWN0CisgICAgPj4+IHJhdyA9IHN0cnVjdC5wYWNrKCI+ZCIsIC0xLjI1KQorICAgID4+PiByYXcKKyAgICAnXHhiZlx4ZjRceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCisgICAgPj4+IHJlYWRfZmxvYXQ4KFN0cmluZ0lPLlN0cmluZ0lPKHJhdyArICJcbiIpKQorICAgIC0xLjI1CisgICAgIiIiCisKKyAgICBkYXRhID0gZi5yZWFkKDgpCisgICAgaWYgbGVuKGRhdGEpID09IDg6CisgICAgICAgIHJldHVybiBfdW5wYWNrKCI+ZCIsIGRhdGEpWzBdCisgICAgcmFpc2UgVmFsdWVFcnJvcigibm90IGVub3VnaCBkYXRhIGluIHN0cmVhbSB0byByZWFkIGZsb2F0OCIpCisKKworZmxvYXQ4ID0gQXJndW1lbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgIG5hbWU9J2Zsb2F0OCcsCisgICAgICAgICAgICAgbj04LAorICAgICAgICAgICAgIHJlYWRlcj1yZWFkX2Zsb2F0OCwKKyAgICAgICAgICAgICBkb2M9IiIiQW4gOC1ieXRlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBhIGZsb2F0LCBiaWctZW5kaWFuLgorCisgICAgICAgICAgICAgVGhlIGZvcm1hdCBpcyB1bmlxdWUgdG8gUHl0aG9uLCBhbmQgc2hhcmVkIHdpdGggdGhlIHN0cnVjdAorICAgICAgICAgICAgIG1vZHVsZSAoZm9ybWF0IHN0cmluZyAnPmQnKSAiaW4gdGhlb3J5IiAodGhlIHN0cnVjdCBhbmQgY1BpY2tsZQorICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyBkb24ndCBzaGFyZSB0aGUgY29kZSAtLSB0aGV5IHNob3VsZCkuICBJdCdzCisgICAgICAgICAgICAgc3Ryb25nbHkgcmVsYXRlZCB0byB0aGUgSUVFRS03NTQgZG91YmxlIGZvcm1hdCwgYW5kLCBpbiBub3JtYWwKKyAgICAgICAgICAgICBjYXNlcywgaXMgaW4gZmFjdCBpZGVudGljYWwgdG8gdGhlIGJpZy1lbmRpYW4gNzU0IGRvdWJsZSBmb3JtYXQuCisgICAgICAgICAgICAgT24gb3RoZXIgYm94ZXMgdGhlIGR5bmFtaWMgcmFuZ2UgaXMgbGltaXRlZCB0byB0aGF0IG9mIGEgNzU0CisgICAgICAgICAgICAgZG91YmxlLCBhbmQgImFkZCBhIGhhbGYgYW5kIGNob3AiIHJvdW5kaW5nIGlzIHVzZWQgdG8gcmVkdWNlCisgICAgICAgICAgICAgdGhlIHByZWNpc2lvbiB0byA1MyBiaXRzLiAgSG93ZXZlciwgZXZlbiBvbiBhIDc1NCBib3gsCisgICAgICAgICAgICAgaW5maW5pdGllcywgTmFOcywgYW5kIG1pbnVzIHplcm8gbWF5IG5vdCBiZSBoYW5kbGVkIGNvcnJlY3RseQorICAgICAgICAgICAgIChtYXkgbm90IHN1cnZpdmUgcm91bmR0cmlwIHBpY2tsaW5nIGludGFjdCkuCisgICAgICAgICAgICAgIiIiKQorCisjIFByb3RvY29sIDIgZm9ybWF0cworCitmcm9tIHBpY2tsZSBpbXBvcnQgZGVjb2RlX2xvbmcKKworZGVmIHJlYWRfbG9uZzEoZik6CisgICAgciIiIgorICAgID4+PiBpbXBvcnQgU3RyaW5nSU8KKyAgICA+Pj4gcmVhZF9sb25nMShTdHJpbmdJTy5TdHJpbmdJTygiXHgwMCIpKQorICAgIDBMCisgICAgPj4+IHJlYWRfbG9uZzEoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDJceGZmXHgwMCIpKQorICAgIDI1NUwKKyAgICA+Pj4gcmVhZF9sb25nMShTdHJpbmdJTy5TdHJpbmdJTygiXHgwMlx4ZmZceDdmIikpCisgICAgMzI3NjdMCisgICAgPj4+IHJlYWRfbG9uZzEoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDJceDAwXHhmZiIpKQorICAgIC0yNTZMCisgICAgPj4+IHJlYWRfbG9uZzEoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDJceDAwXHg4MCIpKQorICAgIC0zMjc2OEwKKyAgICAiIiIKKworICAgIG4gPSByZWFkX3VpbnQxKGYpCisgICAgZGF0YSA9IGYucmVhZChuKQorICAgIGlmIGxlbihkYXRhKSAhPSBuOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJub3QgZW5vdWdoIGRhdGEgaW4gc3RyZWFtIHRvIHJlYWQgbG9uZzEiKQorICAgIHJldHVybiBkZWNvZGVfbG9uZyhkYXRhKQorCitsb25nMSA9IEFyZ3VtZW50RGVzY3JpcHRvcigKKyAgICBuYW1lPSJsb25nMSIsCisgICAgbj1UQUtFTl9GUk9NX0FSR1VNRU5UMSwKKyAgICByZWFkZXI9cmVhZF9sb25nMSwKKyAgICBkb2M9IiIiQSBiaW5hcnkgbG9uZywgbGl0dGxlLWVuZGlhbiwgdXNpbmcgMS1ieXRlIHNpemUuCisKKyAgICBUaGlzIGZpcnN0IHJlYWRzIG9uZSBieXRlIGFzIGFuIHVuc2lnbmVkIHNpemUsIHRoZW4gcmVhZHMgdGhhdAorICAgIG1hbnkgYnl0ZXMgYW5kIGludGVycHJldHMgdGhlbSBhcyBhIGxpdHRsZS1lbmRpYW4gMidzLWNvbXBsZW1lbnQgbG9uZy4KKyAgICBJZiB0aGUgc2l6ZSBpcyAwLCB0aGF0J3MgdGFrZW4gYXMgYSBzaG9ydGN1dCBmb3IgdGhlIGxvbmcgMEwuCisgICAgIiIiKQorCitkZWYgcmVhZF9sb25nNChmKToKKyAgICByIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworICAgID4+PiByZWFkX2xvbmc0KFN0cmluZ0lPLlN0cmluZ0lPKCJceDAyXHgwMFx4MDBceDAwXHhmZlx4MDAiKSkKKyAgICAyNTVMCisgICAgPj4+IHJlYWRfbG9uZzQoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDJceDAwXHgwMFx4MDBceGZmXHg3ZiIpKQorICAgIDMyNzY3TAorICAgID4+PiByZWFkX2xvbmc0KFN0cmluZ0lPLlN0cmluZ0lPKCJceDAyXHgwMFx4MDBceDAwXHgwMFx4ZmYiKSkKKyAgICAtMjU2TAorICAgID4+PiByZWFkX2xvbmc0KFN0cmluZ0lPLlN0cmluZ0lPKCJceDAyXHgwMFx4MDBceDAwXHgwMFx4ODAiKSkKKyAgICAtMzI3NjhMCisgICAgPj4+IHJlYWRfbG9uZzEoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDBceDAwXHgwMFx4MDAiKSkKKyAgICAwTAorICAgICIiIgorCisgICAgbiA9IHJlYWRfaW50NChmKQorICAgIGlmIG4gPCAwOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJsb25nNCBieXRlIGNvdW50IDwgMDogJWQiICUgbikKKyAgICBkYXRhID0gZi5yZWFkKG4pCisgICAgaWYgbGVuKGRhdGEpICE9IG46CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vdCBlbm91Z2ggZGF0YSBpbiBzdHJlYW0gdG8gcmVhZCBsb25nNCIpCisgICAgcmV0dXJuIGRlY29kZV9sb25nKGRhdGEpCisKK2xvbmc0ID0gQXJndW1lbnREZXNjcmlwdG9yKAorICAgIG5hbWU9Imxvbmc0IiwKKyAgICBuPVRBS0VOX0ZST01fQVJHVU1FTlQ0LAorICAgIHJlYWRlcj1yZWFkX2xvbmc0LAorICAgIGRvYz0iIiJBIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBhIGxvbmcsIGxpdHRsZS1lbmRpYW4uCisKKyAgICBUaGlzIGZpcnN0IHJlYWRzIGZvdXIgYnl0ZXMgYXMgYSBzaWduZWQgc2l6ZSAoYnV0IHJlcXVpcmVzIHRoZQorICAgIHNpemUgdG8gYmUgPj0gMCksIHRoZW4gcmVhZHMgdGhhdCBtYW55IGJ5dGVzIGFuZCBpbnRlcnByZXRzIHRoZW0KKyAgICBhcyBhIGxpdHRsZS1lbmRpYW4gMidzLWNvbXBsZW1lbnQgbG9uZy4gIElmIHRoZSBzaXplIGlzIDAsIHRoYXQncyB0YWtlbgorICAgIGFzIGEgc2hvcnRjdXQgZm9yIHRoZSBsb25nIDBMLCBhbHRob3VnaCBMT05HMSBzaG91bGQgcmVhbGx5IGJlIHVzZWQKKyAgICB0aGVuIGluc3RlYWQgKGFuZCBpbiBhbnkgY2FzZSB3aGVyZSAjIG9mIGJ5dGVzIDwgMjU2KS4KKyAgICAiIiIpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE9iamVjdCBkZXNjcmlwdG9ycy4gIFRoZSBzdGFjayB1c2VkIGJ5IHRoZSBwaWNrbGUgbWFjaGluZSBob2xkcyBvYmplY3RzLAorIyBhbmQgaW4gdGhlIHN0YWNrX2JlZm9yZSBhbmQgc3RhY2tfYWZ0ZXIgYXR0cmlidXRlcyBvZiBPcGNvZGVJbmZvCisjIGRlc2NyaXB0b3JzIHdlIG5lZWQgbmFtZXMgdG8gZGVzY3JpYmUgdGhlIHZhcmlvdXMgdHlwZXMgb2Ygb2JqZWN0cyB0aGF0IGNhbgorIyBhcHBlYXIgb24gdGhlIHN0YWNrLgorCitjbGFzcyBTdGFja09iamVjdChvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9ICgKKyAgICAgICAgIyBuYW1lIG9mIGRlc2NyaXB0b3IgcmVjb3JkLCBmb3IgaW5mbyBvbmx5CisgICAgICAgICduYW1lJywKKworICAgICAgICAjIHR5cGUgb2Ygb2JqZWN0LCBvciB0dXBsZSBvZiB0eXBlIG9iamVjdHMgKG1lYW5pbmcgdGhlIG9iamVjdCBjYW4KKyAgICAgICAgIyBiZSBvZiBhbnkgdHlwZSBpbiB0aGUgdHVwbGUpCisgICAgICAgICdvYnR5cGUnLAorCisgICAgICAgICMgaHVtYW4tcmVhZGFibGUgZG9jcyBmb3IgdGhpcyBraW5kIG9mIHN0YWNrIG9iamVjdDsgYSBzdHJpbmcKKyAgICAgICAgJ2RvYycsCisgICAgKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG9idHlwZSwgZG9jKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmFtZSwgc3RyKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob2J0eXBlLCB0eXBlKSBvciBpc2luc3RhbmNlKG9idHlwZSwgdHVwbGUpCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2J0eXBlLCB0dXBsZSk6CisgICAgICAgICAgICBmb3IgY29udGFpbmVkIGluIG9idHlwZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShjb250YWluZWQsIHR5cGUpCisgICAgICAgIHNlbGYub2J0eXBlID0gb2J0eXBlCisKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZG9jLCBzdHIpCisgICAgICAgIHNlbGYuZG9jID0gZG9jCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKKworCitweWludCA9IFN0YWNrT2JqZWN0KAorICAgICAgICAgICAgbmFtZT0naW50JywKKyAgICAgICAgICAgIG9idHlwZT1pbnQsCisgICAgICAgICAgICBkb2M9IkEgc2hvcnQgKGFzIG9wcG9zZWQgdG8gbG9uZykgUHl0aG9uIGludGVnZXIgb2JqZWN0LiIpCisKK3B5bG9uZyA9IFN0YWNrT2JqZWN0KAorICAgICAgICAgICAgIG5hbWU9J2xvbmcnLAorICAgICAgICAgICAgIG9idHlwZT1sb25nLAorICAgICAgICAgICAgIGRvYz0iQSBsb25nIChhcyBvcHBvc2VkIHRvIHNob3J0KSBQeXRob24gaW50ZWdlciBvYmplY3QuIikKKworcHlpbnRlZ2VyX29yX2Jvb2wgPSBTdGFja09iamVjdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J2ludF9vcl9ib29sJywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9idHlwZT0oaW50LCBsb25nLCBib29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvYz0iQSBQeXRob24gaW50ZWdlciBvYmplY3QgKHNob3J0IG9yIGxvbmcpLCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgUHl0aG9uIGJvb2wuIikKKworcHlib29sID0gU3RhY2tPYmplY3QoCisgICAgICAgICAgICAgbmFtZT0nYm9vbCcsCisgICAgICAgICAgICAgb2J0eXBlPShib29sLCksCisgICAgICAgICAgICAgZG9jPSJBIFB5dGhvbiBib29sIG9iamVjdC4iKQorCitweWZsb2F0ID0gU3RhY2tPYmplY3QoCisgICAgICAgICAgICAgIG5hbWU9J2Zsb2F0JywKKyAgICAgICAgICAgICAgb2J0eXBlPWZsb2F0LAorICAgICAgICAgICAgICBkb2M9IkEgUHl0aG9uIGZsb2F0IG9iamVjdC4iKQorCitweXN0cmluZyA9IFN0YWNrT2JqZWN0KAorICAgICAgICAgICAgICAgbmFtZT0nc3RyJywKKyAgICAgICAgICAgICAgIG9idHlwZT1zdHIsCisgICAgICAgICAgICAgICBkb2M9IkEgUHl0aG9uIHN0cmluZyBvYmplY3QuIikKKworcHl1bmljb2RlID0gU3RhY2tPYmplY3QoCisgICAgICAgICAgICAgICAgbmFtZT0ndW5pY29kZScsCisgICAgICAgICAgICAgICAgb2J0eXBlPXVuaWNvZGUsCisgICAgICAgICAgICAgICAgZG9jPSJBIFB5dGhvbiBVbmljb2RlIHN0cmluZyBvYmplY3QuIikKKworcHlub25lID0gU3RhY2tPYmplY3QoCisgICAgICAgICAgICAgbmFtZT0iTm9uZSIsCisgICAgICAgICAgICAgb2J0eXBlPXR5cGUoTm9uZSksCisgICAgICAgICAgICAgZG9jPSJUaGUgUHl0aG9uIE5vbmUgb2JqZWN0LiIpCisKK3B5dHVwbGUgPSBTdGFja09iamVjdCgKKyAgICAgICAgICAgICAgbmFtZT0idHVwbGUiLAorICAgICAgICAgICAgICBvYnR5cGU9dHVwbGUsCisgICAgICAgICAgICAgIGRvYz0iQSBQeXRob24gdHVwbGUgb2JqZWN0LiIpCisKK3B5bGlzdCA9IFN0YWNrT2JqZWN0KAorICAgICAgICAgICAgIG5hbWU9Imxpc3QiLAorICAgICAgICAgICAgIG9idHlwZT1saXN0LAorICAgICAgICAgICAgIGRvYz0iQSBQeXRob24gbGlzdCBvYmplY3QuIikKKworcHlkaWN0ID0gU3RhY2tPYmplY3QoCisgICAgICAgICAgICAgbmFtZT0iZGljdCIsCisgICAgICAgICAgICAgb2J0eXBlPWRpY3QsCisgICAgICAgICAgICAgZG9jPSJBIFB5dGhvbiBkaWN0IG9iamVjdC4iKQorCithbnlvYmplY3QgPSBTdGFja09iamVjdCgKKyAgICAgICAgICAgICAgICBuYW1lPSdhbnknLAorICAgICAgICAgICAgICAgIG9idHlwZT1vYmplY3QsCisgICAgICAgICAgICAgICAgZG9jPSJBbnkga2luZCBvZiBvYmplY3Qgd2hhdHNvZXZlci4iKQorCittYXJrb2JqZWN0ID0gU3RhY2tPYmplY3QoCisgICAgICAgICAgICAgICAgIG5hbWU9Im1hcmsiLAorICAgICAgICAgICAgICAgICBvYnR5cGU9U3RhY2tPYmplY3QsCisgICAgICAgICAgICAgICAgIGRvYz0iIiInVGhlIG1hcmsnIGlzIGEgdW5pcXVlIG9iamVjdC4KKworICAgICAgICAgICAgICAgICBPcGNvZGVzIHRoYXQgb3BlcmF0ZSBvbiBhIHZhcmlhYmxlIG51bWJlciBvZiBvYmplY3RzCisgICAgICAgICAgICAgICAgIGdlbmVyYWxseSBkb24ndCBlbWJlZCB0aGUgY291bnQgb2Ygb2JqZWN0cyBpbiB0aGUgb3Bjb2RlLAorICAgICAgICAgICAgICAgICBvciBwdWxsIGl0IG9mZiB0aGUgc3RhY2suICBJbnN0ZWFkIHRoZSBNQVJLIG9wY29kZSBpcyB1c2VkCisgICAgICAgICAgICAgICAgIHRvIHB1c2ggYSBzcGVjaWFsIG1hcmtlciBvYmplY3Qgb24gdGhlIHN0YWNrLCBhbmQgdGhlbgorICAgICAgICAgICAgICAgICBzb21lIG90aGVyIG9wY29kZXMgZ3JhYiBhbGwgdGhlIG9iamVjdHMgZnJvbSB0aGUgdG9wIG9mCisgICAgICAgICAgICAgICAgIHRoZSBzdGFjayBkb3duIHRvIChidXQgbm90IGluY2x1ZGluZykgdGhlIHRvcG1vc3QgbWFya2VyCisgICAgICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgIiIiKQorCitzdGFja3NsaWNlID0gU3RhY2tPYmplY3QoCisgICAgICAgICAgICAgICAgIG5hbWU9InN0YWNrc2xpY2UiLAorICAgICAgICAgICAgICAgICBvYnR5cGU9U3RhY2tPYmplY3QsCisgICAgICAgICAgICAgICAgIGRvYz0iIiJBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgY29udGlndW91cyBzbGljZSBvZiB0aGUgc3RhY2suCisKKyAgICAgICAgICAgICAgICAgVGhpcyBpcyB1c2VkIGluIGNvbmp1Y3Rpb24gd2l0aCBtYXJrb2JqZWN0LCB0byByZXByZXNlbnQgYWxsCisgICAgICAgICAgICAgICAgIG9mIHRoZSBzdGFjayBmb2xsb3dpbmcgdGhlIHRvcG1vc3QgbWFya29iamVjdC4gIEZvciBleGFtcGxlLAorICAgICAgICAgICAgICAgICB0aGUgUE9QX01BUksgb3Bjb2RlIGNoYW5nZXMgdGhlIHN0YWNrIGZyb20KKworICAgICAgICAgICAgICAgICAgICAgWy4uLiwgbWFya29iamVjdCwgc3RhY2tzbGljZV0KKyAgICAgICAgICAgICAgICAgdG8KKyAgICAgICAgICAgICAgICAgICAgIFsuLi5dCisKKyAgICAgICAgICAgICAgICAgTm8gbWF0dGVyIGhvdyBtYW55IG9iamVjdCBhcmUgb24gdGhlIHN0YWNrIGFmdGVyIHRoZSB0b3Btb3N0CisgICAgICAgICAgICAgICAgIG1hcmtvYmplY3QsIFBPUF9NQVJLIGdldHMgcmlkIG9mIGFsbCBvZiB0aGVtIChpbmNsdWRpbmcgdGhlCisgICAgICAgICAgICAgICAgIHRvcG1vc3QgbWFya29iamVjdCB0b28pLgorICAgICAgICAgICAgICAgICAiIiIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBEZXNjcmlwdG9ycyBmb3IgcGlja2xlIG9wY29kZXMuCisKK2NsYXNzIE9wY29kZUluZm8ob2JqZWN0KToKKworICAgIF9fc2xvdHNfXyA9ICgKKyAgICAgICAgIyBzeW1ib2xpYyBuYW1lIG9mIG9wY29kZTsgYSBzdHJpbmcKKyAgICAgICAgJ25hbWUnLAorCisgICAgICAgICMgdGhlIGNvZGUgdXNlZCBpbiBhIGJ5dGVzdHJlYW0gdG8gcmVwcmVzZW50IHRoZSBvcGNvZGU7IGEKKyAgICAgICAgIyBvbmUtY2hhcmFjdGVyIHN0cmluZworICAgICAgICAnY29kZScsCisKKyAgICAgICAgIyBJZiB0aGUgb3Bjb2RlIGhhcyBhbiBhcmd1bWVudCBlbWJlZGRlZCBpbiB0aGUgYnl0ZSBzdHJpbmcsIGFuCisgICAgICAgICMgaW5zdGFuY2Ugb2YgQXJndW1lbnREZXNjcmlwdG9yIHNwZWNpZnlpbmcgaXRzIHR5cGUuICBOb3RlIHRoYXQKKyAgICAgICAgIyBhcmcucmVhZGVyKHMpIGNhbiBiZSB1c2VkIHRvIHJlYWQgYW5kIGRlY29kZSB0aGUgYXJndW1lbnQgZnJvbQorICAgICAgICAjIHRoZSBieXRlc3RyZWFtIHMsIGFuZCBhcmcuZG9jIGRvY3VtZW50cyB0aGUgZm9ybWF0IG9mIHRoZSByYXcKKyAgICAgICAgIyBhcmd1bWVudCBieXRlcy4gIElmIHRoZSBvcGNvZGUgZG9lc24ndCBoYXZlIGFuIGFyZ3VtZW50IGVtYmVkZGVkCisgICAgICAgICMgaW4gdGhlIGJ5dGVzdHJlYW0sIGFyZyBzaG91bGQgYmUgTm9uZS4KKyAgICAgICAgJ2FyZycsCisKKyAgICAgICAgIyB3aGF0IHRoZSBzdGFjayBsb29rcyBsaWtlIGJlZm9yZSB0aGlzIG9wY29kZSBydW5zOyBhIGxpc3QKKyAgICAgICAgJ3N0YWNrX2JlZm9yZScsCisKKyAgICAgICAgIyB3aGF0IHRoZSBzdGFjayBsb29rcyBsaWtlIGFmdGVyIHRoaXMgb3Bjb2RlIHJ1bnM7IGEgbGlzdAorICAgICAgICAnc3RhY2tfYWZ0ZXInLAorCisgICAgICAgICMgdGhlIHByb3RvY29sIG51bWJlciBpbiB3aGljaCB0aGlzIG9wY29kZSB3YXMgaW50cm9kdWNlZDsgYW4gaW50CisgICAgICAgICdwcm90bycsCisKKyAgICAgICAgIyBodW1hbi1yZWFkYWJsZSBkb2NzIGZvciB0aGlzIG9wY29kZTsgYSBzdHJpbmcKKyAgICAgICAgJ2RvYycsCisgICAgKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGNvZGUsIGFyZywKKyAgICAgICAgICAgICAgICAgc3RhY2tfYmVmb3JlLCBzdGFja19hZnRlciwgcHJvdG8sIGRvYyk6CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5hbWUsIHN0cikKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGNvZGUsIHN0cikKKyAgICAgICAgYXNzZXJ0IGxlbihjb2RlKSA9PSAxCisgICAgICAgIHNlbGYuY29kZSA9IGNvZGUKKworICAgICAgICBhc3NlcnQgYXJnIGlzIE5vbmUgb3IgaXNpbnN0YW5jZShhcmcsIEFyZ3VtZW50RGVzY3JpcHRvcikKKyAgICAgICAgc2VsZi5hcmcgPSBhcmcKKworICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShzdGFja19iZWZvcmUsIGxpc3QpCisgICAgICAgIGZvciB4IGluIHN0YWNrX2JlZm9yZToKKyAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIFN0YWNrT2JqZWN0KQorICAgICAgICBzZWxmLnN0YWNrX2JlZm9yZSA9IHN0YWNrX2JlZm9yZQorCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHN0YWNrX2FmdGVyLCBsaXN0KQorICAgICAgICBmb3IgeCBpbiBzdGFja19hZnRlcjoKKyAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHgsIFN0YWNrT2JqZWN0KQorICAgICAgICBzZWxmLnN0YWNrX2FmdGVyID0gc3RhY2tfYWZ0ZXIKKworICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShwcm90bywgaW50KSBhbmQgMCA8PSBwcm90byA8PSAyCisgICAgICAgIHNlbGYucHJvdG8gPSBwcm90bworCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGRvYywgc3RyKQorICAgICAgICBzZWxmLmRvYyA9IGRvYworCitJID0gT3Bjb2RlSW5mbworb3Bjb2RlcyA9IFsKKworICAgICMgV2F5cyB0byBzcGVsbCBpbnRlZ2Vycy4KKworICAgIEkobmFtZT0nSU5UJywKKyAgICAgIGNvZGU9J0knLAorICAgICAgYXJnPWRlY2ltYWxubF9zaG9ydCwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweWludGVnZXJfb3JfYm9vbF0sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSIiIlB1c2ggYW4gaW50ZWdlciBvciBib29sLgorCisgICAgICBUaGUgYXJndW1lbnQgaXMgYSBuZXdsaW5lLXRlcm1pbmF0ZWQgZGVjaW1hbCBsaXRlcmFsIHN0cmluZy4KKworICAgICAgVGhlIGludGVudCBtYXkgaGF2ZSBiZWVuIHRoYXQgdGhpcyBhbHdheXMgZml0IGluIGEgc2hvcnQgUHl0aG9uIGludCwKKyAgICAgIGJ1dCBJTlQgY2FuIGJlIGdlbmVyYXRlZCBpbiBwaWNrbGVzIHdyaXR0ZW4gb24gYSA2NC1iaXQgYm94IHRoYXQKKyAgICAgIHJlcXVpcmUgYSBQeXRob24gbG9uZyBvbiBhIDMyLWJpdCBib3guICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMKKyAgICAgIGFuZCBMT05HIHRoZW4gaXMgdGhhdCBJTlQgc2tpcHMgYSB0cmFpbGluZyAnTCcsIGFuZCBwcm9kdWNlcyBhIHNob3J0CisgICAgICBpbnQgd2hlbmV2ZXIgcG9zc2libGUuCisKKyAgICAgIEFub3RoZXIgZGlmZmVyZW5jZSBpcyBkdWUgdG8gdGhhdCwgd2hlbiBib29sIHdhcyBpbnRyb2R1Y2VkIGFzIGEKKyAgICAgIGRpc3RpbmN0IHR5cGUgaW4gMi4zLCBidWlsdGluIG5hbWVzIFRydWUgYW5kIEZhbHNlIHdlcmUgYWxzbyBhZGRlZCB0bworICAgICAgMi4yLjIsIG1hcHBpbmcgdG8gaW50cyAxIGFuZCAwLiAgRm9yIGNvbXBhdGliaWxpdHkgaW4gYm90aCBkaXJlY3Rpb25zLAorICAgICAgVHJ1ZSBnZXRzIHBpY2tsZWQgYXMgSU5UICsgIkkwMVxcbiIsIGFuZCBGYWxzZSBhcyBJTlQgKyAiSTAwXFxuIi4KKyAgICAgIExlYWRpbmcgemVyb2VzIGFyZSBuZXZlciBwcm9kdWNlZCBmb3IgYSBnZW51aW5lIGludGVnZXIuICBUaGUgMi4zCisgICAgICAoYW5kIGxhdGVyKSB1bnBpY2tsZXJzIHNwZWNpYWwtY2FzZSB0aGVzZSBhbmQgcmV0dXJuIGJvb2wgaW5zdGVhZDsKKyAgICAgIGVhcmxpZXIgdW5waWNrbGVycyBpZ25vcmUgdGhlIGxlYWRpbmcgIjAiIGFuZCByZXR1cm4gdGhlIGludC4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J0JJTklOVCcsCisgICAgICBjb2RlPSdKJywKKyAgICAgIGFyZz1pbnQ0LAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5aW50XSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IiIiUHVzaCBhIGZvdXItYnl0ZSBzaWduZWQgaW50ZWdlci4KKworICAgICAgVGhpcyBoYW5kbGVzIHRoZSBmdWxsIHJhbmdlIG9mIFB5dGhvbiAoc2hvcnQpIGludGVnZXJzIG9uIGEgMzItYml0CisgICAgICBib3gsIGRpcmVjdGx5IGFzIGJpbmFyeSBieXRlcyAoMSBmb3IgdGhlIG9wY29kZSBhbmQgNCBmb3IgdGhlIGludGVnZXIpLgorICAgICAgSWYgdGhlIGludGVnZXIgaXMgbm9uLW5lZ2F0aXZlIGFuZCBmaXRzIGluIDEgb3IgMiBieXRlcywgcGlja2xpbmcgdmlhCisgICAgICBCSU5JTlQxIG9yIEJJTklOVDIgc2F2ZXMgc3BhY2UuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdCSU5JTlQxJywKKyAgICAgIGNvZGU9J0snLAorICAgICAgYXJnPXVpbnQxLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5aW50XSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IiIiUHVzaCBhIG9uZS1ieXRlIHVuc2lnbmVkIGludGVnZXIuCisKKyAgICAgIFRoaXMgaXMgYSBzcGFjZSBvcHRpbWl6YXRpb24gZm9yIHBpY2tsaW5nIHZlcnkgc21hbGwgbm9uLW5lZ2F0aXZlIGludHMsCisgICAgICBpbiByYW5nZSgyNTYpLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nQklOSU5UMicsCisgICAgICBjb2RlPSdNJywKKyAgICAgIGFyZz11aW50MiwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweWludF0sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSIiIlB1c2ggYSB0d28tYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyLgorCisgICAgICBUaGlzIGlzIGEgc3BhY2Ugb3B0aW1pemF0aW9uIGZvciBwaWNrbGluZyBzbWFsbCBwb3NpdGl2ZSBpbnRzLCBpbgorICAgICAgcmFuZ2UoMjU2LCAyKioxNikuICBJbnRlZ2VycyBpbiByYW5nZSgyNTYpIGNhbiBhbHNvIGJlIHBpY2tsZWQgdmlhCisgICAgICBCSU5JTlQyLCBidXQgQklOSU5UMSBpbnN0ZWFkIHNhdmVzIGEgYnl0ZS4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J0xPTkcnLAorICAgICAgY29kZT0nTCcsCisgICAgICBhcmc9ZGVjaW1hbG5sX2xvbmcsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHlsb25nXSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiUHVzaCBhIGxvbmcgaW50ZWdlci4KKworICAgICAgVGhlIHNhbWUgYXMgSU5ULCBleGNlcHQgdGhhdCB0aGUgbGl0ZXJhbCBlbmRzIHdpdGggJ0wnLCBhbmQgYWx3YXlzCisgICAgICB1bnBpY2tsZXMgdG8gYSBQeXRob24gbG9uZy4gIFRoZXJlIGRvZXNuJ3Qgc2VlbSBhIHJlYWwgcHVycG9zZSB0byB0aGUKKyAgICAgIHRyYWlsaW5nICdMJy4KKworICAgICAgTm90ZSB0aGF0IExPTkcgdGFrZXMgdGltZSBxdWFkcmF0aWMgaW4gdGhlIG51bWJlciBvZiBkaWdpdHMgd2hlbgorICAgICAgdW5waWNrbGluZyAodGhpcyBpcyBzaW1wbHkgZHVlIHRvIHRoZSBuYXR1cmUgb2YgZGVjaW1hbC0+YmluYXJ5CisgICAgICBjb252ZXJzaW9uKS4gIFByb3RvIDIgYWRkZWQgbGluZWFyLXRpbWUgKGluIEM7IHN0aWxsIHF1YWRyYXRpYy10aW1lCisgICAgICBpbiBQeXRob24pIExPTkcxIGFuZCBMT05HNCBvcGNvZGVzLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0iTE9ORzEiLAorICAgICAgY29kZT0nXHg4YScsCisgICAgICBhcmc9bG9uZzEsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHlsb25nXSwKKyAgICAgIHByb3RvPTIsCisgICAgICBkb2M9IiIiTG9uZyBpbnRlZ2VyIHVzaW5nIG9uZS1ieXRlIGxlbmd0aC4KKworICAgICAgQSBtb3JlIGVmZmljaWVudCBlbmNvZGluZyBvZiBhIFB5dGhvbiBsb25nOyB0aGUgbG9uZzEgZW5jb2RpbmcKKyAgICAgIHNheXMgaXQgYWxsLiIiIiksCisKKyAgICBJKG5hbWU9IkxPTkc0IiwKKyAgICAgIGNvZGU9J1x4OGInLAorICAgICAgYXJnPWxvbmc0LAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5bG9uZ10sCisgICAgICBwcm90bz0yLAorICAgICAgZG9jPSIiIkxvbmcgaW50ZWdlciB1c2luZyBmb3VuZC1ieXRlIGxlbmd0aC4KKworICAgICAgQSBtb3JlIGVmZmljaWVudCBlbmNvZGluZyBvZiBhIFB5dGhvbiBsb25nOyB0aGUgbG9uZzQgZW5jb2RpbmcKKyAgICAgIHNheXMgaXQgYWxsLiIiIiksCisKKyAgICAjIFdheXMgdG8gc3BlbGwgc3RyaW5ncyAoOC1iaXQsIG5vdCBVbmljb2RlKS4KKworICAgIEkobmFtZT0nU1RSSU5HJywKKyAgICAgIGNvZGU9J1MnLAorICAgICAgYXJnPXN0cmluZ25sLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5c3RyaW5nXSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiUHVzaCBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0LgorCisgICAgICBUaGUgYXJndW1lbnQgaXMgYSByZXByLXN0eWxlIHN0cmluZywgd2l0aCBicmFja2V0aW5nIHF1b3RlIGNoYXJhY3RlcnMsCisgICAgICBhbmQgcGVyaGFwcyBlbWJlZGRlZCBlc2NhcGVzLiAgVGhlIGFyZ3VtZW50IGV4dGVuZHMgdW50aWwgdGhlIG5leHQKKyAgICAgIG5ld2xpbmUgY2hhcmFjdGVyLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nQklOU1RSSU5HJywKKyAgICAgIGNvZGU9J1QnLAorICAgICAgYXJnPXN0cmluZzQsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHlzdHJpbmddLAorICAgICAgcHJvdG89MSwKKyAgICAgIGRvYz0iIiJQdXNoIGEgUHl0aG9uIHN0cmluZyBvYmplY3QuCisKKyAgICAgIFRoZXJlIGFyZSB0d28gYXJndW1lbnRzOiAgdGhlIGZpcnN0IGlzIGEgNC1ieXRlIGxpdHRsZS1lbmRpYW4gc2lnbmVkIGludAorICAgICAgZ2l2aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHN0cmluZywgYW5kIHRoZSBzZWNvbmQgaXMgdGhhdCBtYW55CisgICAgICBieXRlcywgd2hpY2ggYXJlIHRha2VuIGxpdGVyYWxseSBhcyB0aGUgc3RyaW5nIGNvbnRlbnQuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdTSE9SVF9CSU5TVFJJTkcnLAorICAgICAgY29kZT0nVScsCisgICAgICBhcmc9c3RyaW5nMSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweXN0cmluZ10sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSIiIlB1c2ggYSBQeXRob24gc3RyaW5nIG9iamVjdC4KKworICAgICAgVGhlcmUgYXJlIHR3byBhcmd1bWVudHM6ICB0aGUgZmlyc3QgaXMgYSAxLWJ5dGUgdW5zaWduZWQgaW50IGdpdmluZworICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgc3RyaW5nLCBhbmQgdGhlIHNlY29uZCBpcyB0aGF0IG1hbnkgYnl0ZXMsCisgICAgICB3aGljaCBhcmUgdGFrZW4gbGl0ZXJhbGx5IGFzIHRoZSBzdHJpbmcgY29udGVudC4KKyAgICAgICIiIiksCisKKyAgICAjIFdheXMgdG8gc3BlbGwgTm9uZS4KKworICAgIEkobmFtZT0nTk9ORScsCisgICAgICBjb2RlPSdOJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5bm9uZV0sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSJQdXNoIE5vbmUgb24gdGhlIHN0YWNrLiIpLAorCisgICAgIyBXYXlzIHRvIHNwZWxsIGJvb2xzLCBzdGFydGluZyB3aXRoIHByb3RvIDIuICBTZWUgSU5UIGZvciBob3cgdGhpcyB3YXMKKyAgICAjIGRvbmUgYmVmb3JlIHByb3RvIDIuCisKKyAgICBJKG5hbWU9J05FV1RSVUUnLAorICAgICAgY29kZT0nXHg4OCcsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweWJvb2xdLAorICAgICAgcHJvdG89MiwKKyAgICAgIGRvYz0iIiJUcnVlLgorCisgICAgICBQdXNoIFRydWUgb250byB0aGUgc3RhY2suIiIiKSwKKworICAgIEkobmFtZT0nTkVXRkFMU0UnLAorICAgICAgY29kZT0nXHg4OScsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweWJvb2xdLAorICAgICAgcHJvdG89MiwKKyAgICAgIGRvYz0iIiJUcnVlLgorCisgICAgICBQdXNoIEZhbHNlIG9udG8gdGhlIHN0YWNrLiIiIiksCisKKyAgICAjIFdheXMgdG8gc3BlbGwgVW5pY29kZSBzdHJpbmdzLgorCisgICAgSShuYW1lPSdVTklDT0RFJywKKyAgICAgIGNvZGU9J1YnLAorICAgICAgYXJnPXVuaWNvZGVzdHJpbmdubCwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweXVuaWNvZGVdLAorICAgICAgcHJvdG89MCwgICMgdGhpcyBtYXkgYmUgcHVyZS10ZXh0LCBidXQgaXQncyBhIGxhdGVyIGFkZGl0aW9uCisgICAgICBkb2M9IiIiUHVzaCBhIFB5dGhvbiBVbmljb2RlIHN0cmluZyBvYmplY3QuCisKKyAgICAgIFRoZSBhcmd1bWVudCBpcyBhIHJhdy11bmljb2RlLWVzY2FwZSBlbmNvZGluZyBvZiBhIFVuaWNvZGUgc3RyaW5nLAorICAgICAgYW5kIHNvIG1heSBjb250YWluIGVtYmVkZGVkIGVzY2FwZSBzZXF1ZW5jZXMuICBUaGUgYXJndW1lbnQgZXh0ZW5kcworICAgICAgdW50aWwgdGhlIG5leHQgbmV3bGluZSBjaGFyYWN0ZXIuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdCSU5VTklDT0RFJywKKyAgICAgIGNvZGU9J1gnLAorICAgICAgYXJnPXVuaWNvZGVzdHJpbmc0LAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5dW5pY29kZV0sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSIiIlB1c2ggYSBQeXRob24gVW5pY29kZSBzdHJpbmcgb2JqZWN0LgorCisgICAgICBUaGVyZSBhcmUgdHdvIGFyZ3VtZW50czogIHRoZSBmaXJzdCBpcyBhIDQtYnl0ZSBsaXR0bGUtZW5kaWFuIHNpZ25lZCBpbnQKKyAgICAgIGdpdmluZyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJpbmcuICBUaGUgc2Vjb25kIGlzIHRoYXQgbWFueQorICAgICAgYnl0ZXMsIGFuZCBpcyB0aGUgVVRGLTggZW5jb2Rpbmcgb2YgdGhlIFVuaWNvZGUgc3RyaW5nLgorICAgICAgIiIiKSwKKworICAgICMgV2F5cyB0byBzcGVsbCBmbG9hdHMuCisKKyAgICBJKG5hbWU9J0ZMT0FUJywKKyAgICAgIGNvZGU9J0YnLAorICAgICAgYXJnPWZsb2F0bmwsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHlmbG9hdF0sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSIiIk5ld2xpbmUtdGVybWluYXRlZCBkZWNpbWFsIGZsb2F0IGxpdGVyYWwuCisKKyAgICAgIFRoZSBhcmd1bWVudCBpcyByZXByKGFfZmxvYXQpLCBhbmQgaW4gZ2VuZXJhbCByZXF1aXJlcyAxNyBzaWduaWZpY2FudAorICAgICAgZGlnaXRzIGZvciByb3VuZHRyaXAgY29udmVyc2lvbiB0byBiZSBhbiBpZGVudGl0eSAodGhpcyBpcyBzbyBmb3IKKyAgICAgIElFRUUtNzU0IGRvdWJsZSBwcmVjaXNpb24gdmFsdWVzLCB3aGljaCBpcyB3aGF0IFB5dGhvbiBmbG9hdCBtYXBzIHRvCisgICAgICBvbiBtb3N0IGJveGVzKS4KKworICAgICAgSW4gZ2VuZXJhbCwgRkxPQVQgY2Fubm90IGJlIHVzZWQgdG8gdHJhbnNwb3J0IGluZmluaXRpZXMsIE5hTnMsIG9yCisgICAgICBtaW51cyB6ZXJvIGFjcm9zcyBib3hlcyAob3IgZXZlbiBvbiBhIHNpbmdsZSBib3gsIGlmIHRoZSBwbGF0Zm9ybSBDCisgICAgICBsaWJyYXJ5IGNhbid0IHJlYWQgdGhlIHN0cmluZ3MgaXQgcHJvZHVjZXMgZm9yIHN1Y2ggdGhpbmdzIC0tIFdpbmRvd3MKKyAgICAgIGlzIGxpa2UgdGhhdCksIGJ1dCBtYXkgZG8gbGVzcyBkYW1hZ2UgdGhhbiBCSU5GTE9BVCBvbiBib3hlcyB3aXRoCisgICAgICBncmVhdGVyIHByZWNpc2lvbiBvciBkeW5hbWljIHJhbmdlIHRoYW4gSUVFRS03NTQgZG91YmxlLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nQklORkxPQVQnLAorICAgICAgY29kZT0nRycsCisgICAgICBhcmc9ZmxvYXQ4LAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5ZmxvYXRdLAorICAgICAgcHJvdG89MSwKKyAgICAgIGRvYz0iIiJGbG9hdCBzdG9yZWQgaW4gYmluYXJ5IGZvcm0sIHdpdGggOCBieXRlcyBvZiBkYXRhLgorCisgICAgICBUaGlzIGdlbmVyYWxseSByZXF1aXJlcyBsZXNzIHRoYW4gaGFsZiB0aGUgc3BhY2Ugb2YgRkxPQVQgZW5jb2RpbmcuCisgICAgICBJbiBnZW5lcmFsLCBCSU5GTE9BVCBjYW5ub3QgYmUgdXNlZCB0byB0cmFuc3BvcnQgaW5maW5pdGllcywgTmFOcywgb3IKKyAgICAgIG1pbnVzIHplcm8sIHJhaXNlcyBhbiBleGNlcHRpb24gaWYgdGhlIGV4cG9uZW50IGV4Y2VlZHMgdGhlIHJhbmdlIG9mCisgICAgICBhbiBJRUVFLTc1NCBkb3VibGUsIGFuZCByZXRhaW5zIG5vIG1vcmUgdGhhbiA1MyBiaXRzIG9mIHByZWNpc2lvbiAoaWYKKyAgICAgIHRoZXJlIGFyZSBtb3JlIHRoYW4gdGhhdCwgImFkZCBhIGhhbGYgYW5kIGNob3AiIHJvdW5kaW5nIGlzIHVzZWQgdG8KKyAgICAgIGN1dCBpdCBiYWNrIHRvIDUzIHNpZ25pZmljYW50IGJpdHMpLgorICAgICAgIiIiKSwKKworICAgICMgV2F5cyB0byBidWlsZCBsaXN0cy4KKworICAgIEkobmFtZT0nRU1QVFlfTElTVCcsCisgICAgICBjb2RlPSddJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5bGlzdF0sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSJQdXNoIGFuIGVtcHR5IGxpc3QuIiksCisKKyAgICBJKG5hbWU9J0FQUEVORCcsCisgICAgICBjb2RlPSdhJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVtweWxpc3QsIGFueW9iamVjdF0sCisgICAgICBzdGFja19hZnRlcj1bcHlsaXN0XSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiQXBwZW5kIGFuIG9iamVjdCB0byBhIGxpc3QuCisKKyAgICAgIFN0YWNrIGJlZm9yZTogIC4uLiBweWxpc3QgYW55b2JqZWN0CisgICAgICBTdGFjayBhZnRlcjogICAuLi4gcHlsaXN0K1thbnlvYmplY3RdCisKKyAgICAgIGFsdGhvdWdoIHB5bGlzdCBpcyByZWFsbHkgZXh0ZW5kZWQgaW4tcGxhY2UuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdBUFBFTkRTJywKKyAgICAgIGNvZGU9J2UnLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W3B5bGlzdCwgbWFya29iamVjdCwgc3RhY2tzbGljZV0sCisgICAgICBzdGFja19hZnRlcj1bcHlsaXN0XSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IiIiRXh0ZW5kIGEgbGlzdCBieSBhIHNsaWNlIG9mIHN0YWNrIG9iamVjdHMuCisKKyAgICAgIFN0YWNrIGJlZm9yZTogIC4uLiBweWxpc3QgbWFya29iamVjdCBzdGFja3NsaWNlCisgICAgICBTdGFjayBhZnRlcjogICAuLi4gcHlsaXN0K3N0YWNrc2xpY2UKKworICAgICAgYWx0aG91Z2ggcHlsaXN0IGlzIHJlYWxseSBleHRlbmRlZCBpbi1wbGFjZS4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J0xJU1QnLAorICAgICAgY29kZT0nbCcsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bbWFya29iamVjdCwgc3RhY2tzbGljZV0sCisgICAgICBzdGFja19hZnRlcj1bcHlsaXN0XSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiQnVpbGQgYSBsaXN0IG91dCBvZiB0aGUgdG9wbW9zdCBzdGFjayBzbGljZSwgYWZ0ZXIgbWFya29iamVjdC4KKworICAgICAgQWxsIHRoZSBzdGFjayBlbnRyaWVzIGZvbGxvd2luZyB0aGUgdG9wbW9zdCBtYXJrb2JqZWN0IGFyZSBwbGFjZWQgaW50bworICAgICAgYSBzaW5nbGUgUHl0aG9uIGxpc3QsIHdoaWNoIHNpbmdsZSBsaXN0IG9iamVjdCByZXBsYWNlcyBhbGwgb2YgdGhlCisgICAgICBzdGFjayBmcm9tIHRoZSB0b3Btb3N0IG1hcmtvYmplY3Qgb253YXJkLiAgRm9yIGV4YW1wbGUsCisKKyAgICAgIFN0YWNrIGJlZm9yZTogLi4uIG1hcmtvYmplY3QgMSAyIDMgJ2FiYycKKyAgICAgIFN0YWNrIGFmdGVyOiAgLi4uIFsxLCAyLCAzLCAnYWJjJ10KKyAgICAgICIiIiksCisKKyAgICAjIFdheXMgdG8gYnVpbGQgdHVwbGVzLgorCisgICAgSShuYW1lPSdFTVBUWV9UVVBMRScsCisgICAgICBjb2RlPScpJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5dHVwbGVdLAorICAgICAgcHJvdG89MSwKKyAgICAgIGRvYz0iUHVzaCBhbiBlbXB0eSB0dXBsZS4iKSwKKworICAgIEkobmFtZT0nVFVQTEUnLAorICAgICAgY29kZT0ndCcsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bbWFya29iamVjdCwgc3RhY2tzbGljZV0sCisgICAgICBzdGFja19hZnRlcj1bcHl0dXBsZV0sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSIiIkJ1aWxkIGEgdHVwbGUgb3V0IG9mIHRoZSB0b3Btb3N0IHN0YWNrIHNsaWNlLCBhZnRlciBtYXJrb2JqZWN0LgorCisgICAgICBBbGwgdGhlIHN0YWNrIGVudHJpZXMgZm9sbG93aW5nIHRoZSB0b3Btb3N0IG1hcmtvYmplY3QgYXJlIHBsYWNlZCBpbnRvCisgICAgICBhIHNpbmdsZSBQeXRob24gdHVwbGUsIHdoaWNoIHNpbmdsZSB0dXBsZSBvYmplY3QgcmVwbGFjZXMgYWxsIG9mIHRoZQorICAgICAgc3RhY2sgZnJvbSB0aGUgdG9wbW9zdCBtYXJrb2JqZWN0IG9ud2FyZC4gIEZvciBleGFtcGxlLAorCisgICAgICBTdGFjayBiZWZvcmU6IC4uLiBtYXJrb2JqZWN0IDEgMiAzICdhYmMnCisgICAgICBTdGFjayBhZnRlcjogIC4uLiAoMSwgMiwgMywgJ2FiYycpCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdUVVBMRTEnLAorICAgICAgY29kZT0nXHg4NScsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bYW55b2JqZWN0XSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweXR1cGxlXSwKKyAgICAgIHByb3RvPTIsCisgICAgICBkb2M9IiIiQnVpbGQgYSBvbmUtdHVwbGUgb3V0IG9mIHRoZSB0b3Btb3N0IGl0ZW0gb24gdGhlIHN0YWNrLgorCisgICAgICBUaGlzIGNvZGUgcG9wcyBvbmUgdmFsdWUgb2ZmIHRoZSBzdGFjayBhbmQgcHVzaGVzIGEgdHVwbGUgb2YKKyAgICAgIGxlbmd0aCAxIHdob3NlIG9uZSBpdGVtIGlzIHRoYXQgdmFsdWUgYmFjayBvbnRvIGl0LiAgSW4gb3RoZXIKKyAgICAgIHdvcmRzOgorCisgICAgICAgICAgc3RhY2tbLTFdID0gdHVwbGUoc3RhY2tbLTE6XSkKKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J1RVUExFMicsCisgICAgICBjb2RlPSdceDg2JywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVthbnlvYmplY3QsIGFueW9iamVjdF0sCisgICAgICBzdGFja19hZnRlcj1bcHl0dXBsZV0sCisgICAgICBwcm90bz0yLAorICAgICAgZG9jPSIiIkJ1aWxkIGEgdHdvLXR1cGxlIG91dCBvZiB0aGUgdG9wIHR3byBpdGVtcyBvbiB0aGUgc3RhY2suCisKKyAgICAgIFRoaXMgY29kZSBwb3BzIHR3byB2YWx1ZXMgb2ZmIHRoZSBzdGFjayBhbmQgcHVzaGVzIGEgdHVwbGUgb2YKKyAgICAgIGxlbmd0aCAyIHdob3NlIGl0ZW1zIGFyZSB0aG9zZSB2YWx1ZXMgYmFjayBvbnRvIGl0LiAgSW4gb3RoZXIKKyAgICAgIHdvcmRzOgorCisgICAgICAgICAgc3RhY2tbLTI6XSA9IFt0dXBsZShzdGFja1stMjpdKV0KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J1RVUExFMycsCisgICAgICBjb2RlPSdceDg3JywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVthbnlvYmplY3QsIGFueW9iamVjdCwgYW55b2JqZWN0XSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweXR1cGxlXSwKKyAgICAgIHByb3RvPTIsCisgICAgICBkb2M9IiIiQnVpbGQgYSB0aHJlZS10dXBsZSBvdXQgb2YgdGhlIHRvcCB0aHJlZSBpdGVtcyBvbiB0aGUgc3RhY2suCisKKyAgICAgIFRoaXMgY29kZSBwb3BzIHRocmVlIHZhbHVlcyBvZmYgdGhlIHN0YWNrIGFuZCBwdXNoZXMgYSB0dXBsZSBvZgorICAgICAgbGVuZ3RoIDMgd2hvc2UgaXRlbXMgYXJlIHRob3NlIHZhbHVlcyBiYWNrIG9udG8gaXQuICBJbiBvdGhlcgorICAgICAgd29yZHM6CisKKyAgICAgICAgICBzdGFja1stMzpdID0gW3R1cGxlKHN0YWNrWy0zOl0pXQorICAgICAgIiIiKSwKKworICAgICMgV2F5cyB0byBidWlsZCBkaWN0cy4KKworICAgIEkobmFtZT0nRU1QVFlfRElDVCcsCisgICAgICBjb2RlPSd9JywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5ZGljdF0sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSJQdXNoIGFuIGVtcHR5IGRpY3QuIiksCisKKyAgICBJKG5hbWU9J0RJQ1QnLAorICAgICAgY29kZT0nZCcsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bbWFya29iamVjdCwgc3RhY2tzbGljZV0sCisgICAgICBzdGFja19hZnRlcj1bcHlkaWN0XSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiQnVpbGQgYSBkaWN0IG91dCBvZiB0aGUgdG9wbW9zdCBzdGFjayBzbGljZSwgYWZ0ZXIgbWFya29iamVjdC4KKworICAgICAgQWxsIHRoZSBzdGFjayBlbnRyaWVzIGZvbGxvd2luZyB0aGUgdG9wbW9zdCBtYXJrb2JqZWN0IGFyZSBwbGFjZWQgaW50bworICAgICAgYSBzaW5nbGUgUHl0aG9uIGRpY3QsIHdoaWNoIHNpbmdsZSBkaWN0IG9iamVjdCByZXBsYWNlcyBhbGwgb2YgdGhlCisgICAgICBzdGFjayBmcm9tIHRoZSB0b3Btb3N0IG1hcmtvYmplY3Qgb253YXJkLiAgVGhlIHN0YWNrIHNsaWNlIGFsdGVybmF0ZXMKKyAgICAgIGtleSwgdmFsdWUsIGtleSwgdmFsdWUsIC4uLi4gIEZvciBleGFtcGxlLAorCisgICAgICBTdGFjayBiZWZvcmU6IC4uLiBtYXJrb2JqZWN0IDEgMiAzICdhYmMnCisgICAgICBTdGFjayBhZnRlcjogIC4uLiB7MTogMiwgMzogJ2FiYyd9CisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdTRVRJVEVNJywKKyAgICAgIGNvZGU9J3MnLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W3B5ZGljdCwgYW55b2JqZWN0LCBhbnlvYmplY3RdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5ZGljdF0sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSIiIkFkZCBhIGtleSt2YWx1ZSBwYWlyIHRvIGFuIGV4aXN0aW5nIGRpY3QuCisKKyAgICAgIFN0YWNrIGJlZm9yZTogIC4uLiBweWRpY3Qga2V5IHZhbHVlCisgICAgICBTdGFjayBhZnRlcjogICAuLi4gcHlkaWN0CisKKyAgICAgIHdoZXJlIHB5ZGljdCBoYXMgYmVlbiBtb2RpZmllZCB2aWEgcHlkaWN0W2tleV0gPSB2YWx1ZS4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J1NFVElURU1TJywKKyAgICAgIGNvZGU9J3UnLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W3B5ZGljdCwgbWFya29iamVjdCwgc3RhY2tzbGljZV0sCisgICAgICBzdGFja19hZnRlcj1bcHlkaWN0XSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IiIiQWRkIGFuIGFyYml0cmFyeSBudW1iZXIgb2Yga2V5K3ZhbHVlIHBhaXJzIHRvIGFuIGV4aXN0aW5nIGRpY3QuCisKKyAgICAgIFRoZSBzbGljZSBvZiB0aGUgc3RhY2sgZm9sbG93aW5nIHRoZSB0b3Btb3N0IG1hcmtvYmplY3QgaXMgdGFrZW4gYXMKKyAgICAgIGFuIGFsdGVybmF0aW5nIHNlcXVlbmNlIG9mIGtleXMgYW5kIHZhbHVlcywgYWRkZWQgdG8gdGhlIGRpY3QKKyAgICAgIGltbWVkaWF0ZWx5IHVuZGVyIHRoZSB0b3Btb3N0IG1hcmtvYmplY3QuICBFdmVyeXRoaW5nIGF0IGFuZCBhZnRlciB0aGUKKyAgICAgIHRvcG1vc3QgbWFya29iamVjdCBpcyBwb3BwZWQsIGxlYXZpbmcgdGhlIG11dGF0ZWQgZGljdCBhdCB0aGUgdG9wCisgICAgICBvZiB0aGUgc3RhY2suCisKKyAgICAgIFN0YWNrIGJlZm9yZTogIC4uLiBweWRpY3QgbWFya29iamVjdCBrZXlfMSB2YWx1ZV8xIC4uLiBrZXlfbiB2YWx1ZV9uCisgICAgICBTdGFjayBhZnRlcjogICAuLi4gcHlkaWN0CisKKyAgICAgIHdoZXJlIHB5ZGljdCBoYXMgYmVlbiBtb2RpZmllZCB2aWEgcHlkaWN0W2tleV9pXSA9IHZhbHVlX2kgZm9yIGkgaW4KKyAgICAgIDEsIDIsIC4uLiwgbiwgYW5kIGluIHRoYXQgb3JkZXIuCisgICAgICAiIiIpLAorCisgICAgIyBTdGFjayBtYW5pcHVsYXRpb24uCisKKyAgICBJKG5hbWU9J1BPUCcsCisgICAgICBjb2RlPScwJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVthbnlvYmplY3RdLAorICAgICAgc3RhY2tfYWZ0ZXI9W10sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSJEaXNjYXJkIHRoZSB0b3Agc3RhY2sgaXRlbSwgc2hyaW5raW5nIHRoZSBzdGFjayBieSBvbmUgaXRlbS4iKSwKKworICAgIEkobmFtZT0nRFVQJywKKyAgICAgIGNvZGU9JzInLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W2FueW9iamVjdF0sCisgICAgICBzdGFja19hZnRlcj1bYW55b2JqZWN0LCBhbnlvYmplY3RdLAorICAgICAgcHJvdG89MCwKKyAgICAgIGRvYz0iUHVzaCB0aGUgdG9wIHN0YWNrIGl0ZW0gb250byB0aGUgc3RhY2sgYWdhaW4sIGR1cGxpY2F0aW5nIGl0LiIpLAorCisgICAgSShuYW1lPSdNQVJLJywKKyAgICAgIGNvZGU9JygnLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bbWFya29iamVjdF0sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSIiIlB1c2ggbWFya29iamVjdCBvbnRvIHRoZSBzdGFjay4KKworICAgICAgbWFya29iamVjdCBpcyBhIHVuaXF1ZSBvYmplY3QsIHVzZWQgYnkgb3RoZXIgb3Bjb2RlcyB0byBpZGVudGlmeSBhCisgICAgICByZWdpb24gb2YgdGhlIHN0YWNrIGNvbnRhaW5pbmcgYSB2YXJpYWJsZSBudW1iZXIgb2Ygb2JqZWN0cyBmb3IgdGhlbQorICAgICAgdG8gd29yayBvbi4gIFNlZSBtYXJrb2JqZWN0LmRvYyBmb3IgbW9yZSBkZXRhaWwuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdQT1BfTUFSSycsCisgICAgICBjb2RlPScxJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVttYXJrb2JqZWN0LCBzdGFja3NsaWNlXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtdLAorICAgICAgcHJvdG89MSwKKyAgICAgIGRvYz0iIiJQb3AgYWxsIHRoZSBzdGFjayBvYmplY3RzIGF0IGFuZCBhYm92ZSB0aGUgdG9wbW9zdCBtYXJrb2JqZWN0LgorCisgICAgICBXaGVuIGFuIG9wY29kZSB1c2luZyBhIHZhcmlhYmxlIG51bWJlciBvZiBzdGFjayBvYmplY3RzIGlzIGRvbmUsCisgICAgICBQT1BfTUFSSyBpcyB1c2VkIHRvIHJlbW92ZSB0aG9zZSBvYmplY3RzLCBhbmQgdG8gcmVtb3ZlIHRoZSBtYXJrb2JqZWN0CisgICAgICB0aGF0IGRlbGltaXRlZCB0aGVpciBzdGFydGluZyBwb3NpdGlvbiBvbiB0aGUgc3RhY2suCisgICAgICAiIiIpLAorCisgICAgIyBNZW1vIG1hbmlwdWxhdGlvbi4gIFRoZXJlIGFyZSByZWFsbHkgb25seSB0d28gb3BlcmF0aW9ucyAoZ2V0IGFuZCBwdXQpLAorICAgICMgZWFjaCBpbiBhbGwtdGV4dCwgInNob3J0IGJpbmFyeSIsIGFuZCAibG9uZyBiaW5hcnkiIGZsYXZvcnMuCisKKyAgICBJKG5hbWU9J0dFVCcsCisgICAgICBjb2RlPSdnJywKKyAgICAgIGFyZz1kZWNpbWFsbmxfc2hvcnQsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bYW55b2JqZWN0XSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiUmVhZCBhbiBvYmplY3QgZnJvbSB0aGUgbWVtbyBhbmQgcHVzaCBpdCBvbiB0aGUgc3RhY2suCisKKyAgICAgIFRoZSBpbmRleCBvZiB0aGUgbWVtbyBvYmplY3QgdG8gcHVzaCBpcyBnaXZlbiBieSB0aGUgbmV3bGluZS10ZXJtaW5hdGVkCisgICAgICBkZWNpbWFsIHN0cmluZyBmb2xsb3dpbmcuICBCSU5HRVQgYW5kIExPTkdfQklOR0VUIGFyZSBzcGFjZS1vcHRpbWl6ZWQKKyAgICAgIHZlcnNpb25zLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nQklOR0VUJywKKyAgICAgIGNvZGU9J2gnLAorICAgICAgYXJnPXVpbnQxLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W2FueW9iamVjdF0sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSIiIlJlYWQgYW4gb2JqZWN0IGZyb20gdGhlIG1lbW8gYW5kIHB1c2ggaXQgb24gdGhlIHN0YWNrLgorCisgICAgICBUaGUgaW5kZXggb2YgdGhlIG1lbW8gb2JqZWN0IHRvIHB1c2ggaXMgZ2l2ZW4gYnkgdGhlIDEtYnl0ZSB1bnNpZ25lZAorICAgICAgaW50ZWdlciBmb2xsb3dpbmcuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdMT05HX0JJTkdFVCcsCisgICAgICBjb2RlPSdqJywKKyAgICAgIGFyZz1pbnQ0LAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W2FueW9iamVjdF0sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSIiIlJlYWQgYW4gb2JqZWN0IGZyb20gdGhlIG1lbW8gYW5kIHB1c2ggaXQgb24gdGhlIHN0YWNrLgorCisgICAgICBUaGUgaW5kZXggb2YgdGhlIG1lbW8gb2JqZWN0IHRvIHB1c2ggaXMgZ2l2ZW4gYnkgdGhlIDQtYnl0ZSBzaWduZWQKKyAgICAgIGxpdHRsZS1lbmRpYW4gaW50ZWdlciBmb2xsb3dpbmcuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdQVVQnLAorICAgICAgY29kZT0ncCcsCisgICAgICBhcmc9ZGVjaW1hbG5sX3Nob3J0LAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W10sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSIiIlN0b3JlIHRoZSBzdGFjayB0b3AgaW50byB0aGUgbWVtby4gIFRoZSBzdGFjayBpcyBub3QgcG9wcGVkLgorCisgICAgICBUaGUgaW5kZXggb2YgdGhlIG1lbW8gbG9jYXRpb24gdG8gd3JpdGUgaW50byBpcyBnaXZlbiBieSB0aGUgbmV3bGluZS0KKyAgICAgIHRlcm1pbmF0ZWQgZGVjaW1hbCBzdHJpbmcgZm9sbG93aW5nLiAgQklOUFVUIGFuZCBMT05HX0JJTlBVVCBhcmUKKyAgICAgIHNwYWNlLW9wdGltaXplZCB2ZXJzaW9ucy4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J0JJTlBVVCcsCisgICAgICBjb2RlPSdxJywKKyAgICAgIGFyZz11aW50MSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtdLAorICAgICAgcHJvdG89MSwKKyAgICAgIGRvYz0iIiJTdG9yZSB0aGUgc3RhY2sgdG9wIGludG8gdGhlIG1lbW8uICBUaGUgc3RhY2sgaXMgbm90IHBvcHBlZC4KKworICAgICAgVGhlIGluZGV4IG9mIHRoZSBtZW1vIGxvY2F0aW9uIHRvIHdyaXRlIGludG8gaXMgZ2l2ZW4gYnkgdGhlIDEtYnl0ZQorICAgICAgdW5zaWduZWQgaW50ZWdlciBmb2xsb3dpbmcuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdMT05HX0JJTlBVVCcsCisgICAgICBjb2RlPSdyJywKKyAgICAgIGFyZz1pbnQ0LAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W10sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSIiIlN0b3JlIHRoZSBzdGFjayB0b3AgaW50byB0aGUgbWVtby4gIFRoZSBzdGFjayBpcyBub3QgcG9wcGVkLgorCisgICAgICBUaGUgaW5kZXggb2YgdGhlIG1lbW8gbG9jYXRpb24gdG8gd3JpdGUgaW50byBpcyBnaXZlbiBieSB0aGUgNC1ieXRlCisgICAgICBzaWduZWQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyIGZvbGxvd2luZy4KKyAgICAgICIiIiksCisKKyAgICAjIEFjY2VzcyB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IChwcmVkZWZpbmVkIG9iamVjdHMpLiAgQWtpbiB0byB0aGUgR0VUCisgICAgIyBmYW1pbHkuCisKKyAgICBJKG5hbWU9J0VYVDEnLAorICAgICAgY29kZT0nXHg4MicsCisgICAgICBhcmc9dWludDEsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bYW55b2JqZWN0XSwKKyAgICAgIHByb3RvPTIsCisgICAgICBkb2M9IiIiRXh0ZW5zaW9uIGNvZGUuCisKKyAgICAgIFRoaXMgY29kZSBhbmQgdGhlIHNpbWlsYXIgRVhUMiBhbmQgRVhUNCBhbGxvdyB1c2luZyBhIHJlZ2lzdHJ5CisgICAgICBvZiBwb3B1bGFyIG9iamVjdHMgdGhhdCBhcmUgcGlja2xlZCBieSBuYW1lLCB0eXBpY2FsbHkgY2xhc3Nlcy4KKyAgICAgIEl0IGlzIGVudmlzaW9uZWQgdGhhdCB0aHJvdWdoIGEgZ2xvYmFsIG5lZ290aWF0aW9uIGFuZAorICAgICAgcmVnaXN0cmF0aW9uIHByb2Nlc3MsIHRoaXJkIHBhcnRpZXMgY2FuIHNldCB1cCBhIG1hcHBpbmcgYmV0d2VlbgorICAgICAgaW50cyBhbmQgb2JqZWN0IG5hbWVzLgorCisgICAgICBJbiBvcmRlciB0byBndWFyYW50ZWUgcGlja2xlIGludGVyY2hhbmdlYWJpbGl0eSwgdGhlIGV4dGVuc2lvbgorICAgICAgY29kZSByZWdpc3RyeSBvdWdodCB0byBiZSBnbG9iYWwsIGFsdGhvdWdoIGEgcmFuZ2Ugb2YgY29kZXMgbWF5CisgICAgICBiZSByZXNlcnZlZCBmb3IgcHJpdmF0ZSB1c2UuCisKKyAgICAgIEVYVDEgaGFzIGEgMS1ieXRlIGludGVnZXIgYXJndW1lbnQuICBUaGlzIGlzIHVzZWQgdG8gaW5kZXggaW50byB0aGUKKyAgICAgIGV4dGVuc2lvbiByZWdpc3RyeSwgYW5kIHRoZSBvYmplY3QgYXQgdGhhdCBpbmRleCBpcyBwdXNoZWQgb24gdGhlIHN0YWNrLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nRVhUMicsCisgICAgICBjb2RlPSdceDgzJywKKyAgICAgIGFyZz11aW50MiwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVthbnlvYmplY3RdLAorICAgICAgcHJvdG89MiwKKyAgICAgIGRvYz0iIiJFeHRlbnNpb24gY29kZS4KKworICAgICAgU2VlIEVYVDEuICBFWFQyIGhhcyBhIHR3by1ieXRlIGludGVnZXIgYXJndW1lbnQuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdFWFQ0JywKKyAgICAgIGNvZGU9J1x4ODQnLAorICAgICAgYXJnPWludDQsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bYW55b2JqZWN0XSwKKyAgICAgIHByb3RvPTIsCisgICAgICBkb2M9IiIiRXh0ZW5zaW9uIGNvZGUuCisKKyAgICAgIFNlZSBFWFQxLiAgRVhUNCBoYXMgYSBmb3VyLWJ5dGUgaW50ZWdlciBhcmd1bWVudC4KKyAgICAgICIiIiksCisKKyAgICAjIFB1c2ggYSBjbGFzcyBvYmplY3QsIG9yIG1vZHVsZSBmdW5jdGlvbiwgb24gdGhlIHN0YWNrLCB2aWEgaXRzIG1vZHVsZQorICAgICMgYW5kIG5hbWUuCisKKyAgICBJKG5hbWU9J0dMT0JBTCcsCisgICAgICBjb2RlPSdjJywKKyAgICAgIGFyZz1zdHJpbmdubF9ub2VzY2FwZV9wYWlyLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W2FueW9iamVjdF0sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSIiIlB1c2ggYSBnbG9iYWwgb2JqZWN0IChtb2R1bGUuYXR0cikgb24gdGhlIHN0YWNrLgorCisgICAgICBUd28gbmV3bGluZS10ZXJtaW5hdGVkIHN0cmluZ3MgZm9sbG93IHRoZSBHTE9CQUwgb3Bjb2RlLiAgVGhlIGZpcnN0IGlzCisgICAgICB0YWtlbiBhcyBhIG1vZHVsZSBuYW1lLCBhbmQgdGhlIHNlY29uZCBhcyBhIGNsYXNzIG5hbWUuICBUaGUgY2xhc3MKKyAgICAgIG9iamVjdCBtb2R1bGUuY2xhc3MgaXMgcHVzaGVkIG9uIHRoZSBzdGFjay4gIE1vcmUgYWNjdXJhdGVseSwgdGhlCisgICAgICBvYmplY3QgcmV0dXJuZWQgYnkgc2VsZi5maW5kX2NsYXNzKG1vZHVsZSwgY2xhc3MpIGlzIHB1c2hlZCBvbiB0aGUKKyAgICAgIHN0YWNrLCBzbyB1bnBpY2tsaW5nIHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgZm9ybSBvZiBsb29rdXAuCisgICAgICAiIiIpLAorCisgICAgIyBXYXlzIHRvIGJ1aWxkIG9iamVjdHMgb2YgY2xhc3NlcyBwaWNrbGUgZG9lc24ndCBrbm93IGFib3V0IGRpcmVjdGx5CisgICAgIyAodXNlci1kZWZpbmVkIGNsYXNzZXMpLiAgSSBkZXNwYWlyIG9mIGRvY3VtZW50aW5nIHRoaXMgYWNjdXJhdGVseQorICAgICMgYW5kIGNvbXByZWhlbnNpYmx5IC0tIHlvdSByZWFsbHkgaGF2ZSB0byByZWFkIHRoZSBwaWNrbGUgY29kZSB0bworICAgICMgZmluZCBhbGwgdGhlIHNwZWNpYWwgY2FzZXMuCisKKyAgICBJKG5hbWU9J1JFRFVDRScsCisgICAgICBjb2RlPSdSJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVthbnlvYmplY3QsIGFueW9iamVjdF0sCisgICAgICBzdGFja19hZnRlcj1bYW55b2JqZWN0XSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiUHVzaCBhbiBvYmplY3QgYnVpbHQgZnJvbSBhIGNhbGxhYmxlIGFuZCBhbiBhcmd1bWVudCB0dXBsZS4KKworICAgICAgVGhlIG9wY29kZSBpcyBuYW1lZCB0byByZW1pbmQgb2YgdGhlIF9fcmVkdWNlX18oKSBtZXRob2QuCisKKyAgICAgIFN0YWNrIGJlZm9yZTogLi4uIGNhbGxhYmxlIHB5dHVwbGUKKyAgICAgIFN0YWNrIGFmdGVyOiAgLi4uIGNhbGxhYmxlKCpweXR1cGxlKQorCisgICAgICBUaGUgY2FsbGFibGUgYW5kIHRoZSBhcmd1bWVudCB0dXBsZSBhcmUgdGhlIGZpcnN0IHR3byBpdGVtcyByZXR1cm5lZAorICAgICAgYnkgYSBfX3JlZHVjZV9fIG1ldGhvZC4gIEFwcGx5aW5nIHRoZSBjYWxsYWJsZSB0byB0aGUgYXJndHVwbGUgaXMKKyAgICAgIHN1cHBvc2VkIHRvIHJlcHJvZHVjZSB0aGUgb3JpZ2luYWwgb2JqZWN0LCBvciBhdCBsZWFzdCBnZXQgaXQgc3RhcnRlZC4KKyAgICAgIElmIHRoZSBfX3JlZHVjZV9fIG1ldGhvZCByZXR1cm5zIGEgMy10dXBsZSwgdGhlIGxhc3QgY29tcG9uZW50IGlzIGFuCisgICAgICBhcmd1bWVudCB0byBiZSBwYXNzZWQgdG8gdGhlIG9iamVjdCdzIF9fc2V0c3RhdGVfXywgYW5kIHRoZW4gdGhlIFJFRFVDRQorICAgICAgb3Bjb2RlIGlzIGZvbGxvd2VkIGJ5IGNvZGUgdG8gY3JlYXRlIHNldHN0YXRlJ3MgYXJndW1lbnQsIGFuZCB0aGVuIGEKKyAgICAgIEJVSUxEIG9wY29kZSB0byBhcHBseSAgX19zZXRzdGF0ZV9fIHRvIHRoYXQgYXJndW1lbnQuCisKKyAgICAgIElmIHR5cGUoY2FsbGFibGUpIGlzIG5vdCBDbGFzc1R5cGUsIFJFRFVDRSBjb21wbGFpbnMgdW5sZXNzIHRoZQorICAgICAgY2FsbGFibGUgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBjb3B5X3JlZyBtb2R1bGUncworICAgICAgc2FmZV9jb25zdHJ1Y3RvcnMgZGljdCwgb3IgdGhlIGNhbGxhYmxlIGhhcyBhIG1hZ2ljCisgICAgICAnX19zYWZlX2Zvcl91bnBpY2tsaW5nX18nIGF0dHJpYnV0ZSB3aXRoIGEgdHJ1ZSB2YWx1ZS4gIEknbSBub3Qgc3VyZQorICAgICAgd2h5IGl0IGRvZXMgdGhpcywgYnV0IEkndmUgc3VyZSBzZWVuIHRoaXMgY29tcGxhaW50IG9mdGVuIGVub3VnaCB3aGVuCisgICAgICBJIGRpZG4ndCB3YW50IHRvIDx3aW5rPi4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J0JVSUxEJywKKyAgICAgIGNvZGU9J2InLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W2FueW9iamVjdCwgYW55b2JqZWN0XSwKKyAgICAgIHN0YWNrX2FmdGVyPVthbnlvYmplY3RdLAorICAgICAgcHJvdG89MCwKKyAgICAgIGRvYz0iIiJGaW5pc2ggYnVpbGRpbmcgYW4gb2JqZWN0LCB2aWEgX19zZXRzdGF0ZV9fIG9yIGRpY3QgdXBkYXRlLgorCisgICAgICBTdGFjayBiZWZvcmU6IC4uLiBhbnlvYmplY3QgYXJndW1lbnQKKyAgICAgIFN0YWNrIGFmdGVyOiAgLi4uIGFueW9iamVjdAorCisgICAgICB3aGVyZSBhbnlvYmplY3QgbWF5IGhhdmUgYmVlbiBtdXRhdGVkLCBhcyBmb2xsb3dzOgorCisgICAgICBJZiB0aGUgb2JqZWN0IGhhcyBhIF9fc2V0c3RhdGVfXyBtZXRob2QsCisKKyAgICAgICAgICBhbnlvYmplY3QuX19zZXRzdGF0ZV9fKGFyZ3VtZW50KQorCisgICAgICBpcyBjYWxsZWQuCisKKyAgICAgIEVsc2UgdGhlIGFyZ3VtZW50IG11c3QgYmUgYSBkaWN0LCB0aGUgb2JqZWN0IG11c3QgaGF2ZSBhIF9fZGljdF9fLCBhbmQKKyAgICAgIHRoZSBvYmplY3QgaXMgdXBkYXRlZCB2aWEKKworICAgICAgICAgIGFueW9iamVjdC5fX2RpY3RfXy51cGRhdGUoYXJndW1lbnQpCisKKyAgICAgIFRoaXMgbWF5IHJhaXNlIFJ1bnRpbWVFcnJvciBpbiByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlICh3aGljaAorICAgICAgZGlzYWxsb3dzIGFjY2VzcyB0byBfX2RpY3RfXyBkaXJlY3RseSk7IGluIHRoYXQgY2FzZSwgdGhlIG9iamVjdAorICAgICAgaXMgdXBkYXRlZCBpbnN0ZWFkIHZpYQorCisgICAgICAgICAgZm9yIGssIHYgaW4gYXJndW1lbnQuaXRlbXMoKToKKyAgICAgICAgICAgICAgYW55b2JqZWN0W2tdID0gdgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nSU5TVCcsCisgICAgICBjb2RlPSdpJywKKyAgICAgIGFyZz1zdHJpbmdubF9ub2VzY2FwZV9wYWlyLAorICAgICAgc3RhY2tfYmVmb3JlPVttYXJrb2JqZWN0LCBzdGFja3NsaWNlXSwKKyAgICAgIHN0YWNrX2FmdGVyPVthbnlvYmplY3RdLAorICAgICAgcHJvdG89MCwKKyAgICAgIGRvYz0iIiJCdWlsZCBhIGNsYXNzIGluc3RhbmNlLgorCisgICAgICBUaGlzIGlzIHRoZSBwcm90b2NvbCAwIHZlcnNpb24gb2YgcHJvdG9jb2wgMSdzIE9CSiBvcGNvZGUuCisgICAgICBJTlNUIGlzIGZvbGxvd2VkIGJ5IHR3byBuZXdsaW5lLXRlcm1pbmF0ZWQgc3RyaW5ncywgZ2l2aW5nIGEKKyAgICAgIG1vZHVsZSBhbmQgY2xhc3MgbmFtZSwganVzdCBhcyBmb3IgdGhlIEdMT0JBTCBvcGNvZGUgKGFuZCBzZWUKKyAgICAgIEdMT0JBTCBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoYXQpLiAgc2VsZi5maW5kX2NsYXNzKG1vZHVsZSwgbmFtZSkKKyAgICAgIGlzIHVzZWQgdG8gZ2V0IGEgY2xhc3Mgb2JqZWN0LgorCisgICAgICBJbiBhZGRpdGlvbiwgYWxsIHRoZSBvYmplY3RzIG9uIHRoZSBzdGFjayBmb2xsb3dpbmcgdGhlIHRvcG1vc3QKKyAgICAgIG1hcmtvYmplY3QgYXJlIGdhdGhlcmVkIGludG8gYSB0dXBsZSBhbmQgcG9wcGVkIChhbG9uZyB3aXRoIHRoZQorICAgICAgdG9wbW9zdCBtYXJrb2JqZWN0KSwganVzdCBhcyBmb3IgdGhlIFRVUExFIG9wY29kZS4KKworICAgICAgTm93IGl0IGdldHMgY29tcGxpY2F0ZWQuICBJZiBhbGwgb2YgdGhlc2UgYXJlIHRydWU6CisKKyAgICAgICAgKyBUaGUgYXJndHVwbGUgaXMgZW1wdHkgKG1hcmtvYmplY3Qgd2FzIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCisgICAgICAgICAgYXQgdGhlIHN0YXJ0KS4KKworICAgICAgICArIEl0J3MgYW4gb2xkLXN0eWxlIGNsYXNzIG9iamVjdCAodGhlIHR5cGUgb2YgdGhlIGNsYXNzIG9iamVjdCBpcworICAgICAgICAgIENsYXNzVHlwZSkuCisKKyAgICAgICAgKyBUaGUgY2xhc3Mgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSBfX2dldGluaXRhcmdzX18gYXR0cmlidXRlLgorCisgICAgICB0aGVuIHdlIHdhbnQgdG8gY3JlYXRlIGFuIG9sZC1zdHlsZSBjbGFzcyBpbnN0YW5jZSB3aXRob3V0IGludm9raW5nCisgICAgICBpdHMgX19pbml0X18oKSBtZXRob2QgKHBpY2tsZSBoYXMgd2FmZmxlZCBvbiB0aGlzIG92ZXIgdGhlIHllYXJzOyBub3QKKyAgICAgIGNhbGxpbmcgX19pbml0X18oKSBpcyBjdXJyZW50IHdpc2RvbSkuICBJbiB0aGlzIGNhc2UsIGFuIGluc3RhbmNlIG9mCisgICAgICBhbiBvbGQtc3R5bGUgZHVtbXkgY2xhc3MgaXMgY3JlYXRlZCwgYW5kIHRoZW4gd2UgdHJ5IHRvIHJlYmluZCBpdHMKKyAgICAgIF9fY2xhc3NfXyBhdHRyaWJ1dGUgdG8gdGhlIGRlc2lyZWQgY2xhc3Mgb2JqZWN0LiAgSWYgdGhpcyBzdWNjZWVkcywKKyAgICAgIHRoZSBuZXcgaW5zdGFuY2Ugb2JqZWN0IGlzIHB1c2hlZCBvbiB0aGUgc3RhY2ssIGFuZCB3ZSdyZSBkb25lLiAgSW4KKyAgICAgIHJlc3RyaWN0ZWQgZXhlY3V0aW9uIG1vZGUgaXQgY2FuIGZhaWwgKGFzc2lnbm1lbnQgdG8gX19jbGFzc19fIGlzCisgICAgICBkaXNhbGxvd2VkKSwgYW5kIEknbSBub3QgcmVhbGx5IHN1cmUgd2hhdCBoYXBwZW5zIHRoZW4gLS0gaXQgbG9va3MKKyAgICAgIGxpa2UgdGhlIGNvZGUgZW5kcyB1cCBjYWxsaW5nIHRoZSBjbGFzcyBvYmplY3QncyBfX2luaXRfXyBhbnl3YXksCisgICAgICB2aWEgZmFsbGluZyBpbnRvIHRoZSBuZXh0IGNhc2UuCisKKyAgICAgIEVsc2UgKHRoZSBhcmd0dXBsZSBpcyBub3QgZW1wdHksIGl0J3Mgbm90IGFuIG9sZC1zdHlsZSBjbGFzcyBvYmplY3QsCisgICAgICBvciB0aGUgY2xhc3Mgb2JqZWN0IGRvZXMgaGF2ZSBhIF9fZ2V0aW5pdGFyZ3NfXyBhdHRyaWJ1dGUpLCB0aGUgY29kZQorICAgICAgZmlyc3QgaW5zaXN0cyB0aGF0IHRoZSBjbGFzcyBvYmplY3QgaGF2ZSBhIF9fc2FmZV9mb3JfdW5waWNrbGluZ19fCisgICAgICBhdHRyaWJ1dGUuICBVbmxpa2UgYXMgZm9yIHRoZSBfX3NhZmVfZm9yX3VucGlja2xpbmdfXyBjaGVjayBpbiBSRURVQ0UsCisgICAgICBpdCBkb2Vzbid0IG1hdHRlciB3aGV0aGVyIHRoaXMgYXR0cmlidXRlIGhhcyBhIHRydWUgb3IgZmFsc2UgdmFsdWUsIGl0CisgICAgICBvbmx5IG1hdHRlcnMgd2hldGhlciBpdCBleGlzdHMgKFhYWCB0aGlzIGlzIGEgYnVnOyBjUGlja2xlCisgICAgICByZXF1aXJlcyB0aGUgYXR0cmlidXRlIHRvIGJlIHRydWUpLiAgSWYgX19zYWZlX2Zvcl91bnBpY2tsaW5nX18KKyAgICAgIGRvZXNuJ3QgZXhpc3QsIFVucGlja2xpbmdFcnJvciBpcyByYWlzZWQuCisKKyAgICAgIEVsc2UgKHRoZSBjbGFzcyBvYmplY3QgZG9lcyBoYXZlIGEgX19zYWZlX2Zvcl91bnBpY2tsaW5nX18gYXR0ciksCisgICAgICB0aGUgY2xhc3Mgb2JqZWN0IG9idGFpbmVkIGZyb20gSU5TVCdzIGFyZ3VtZW50cyBpcyBhcHBsaWVkIHRvIHRoZQorICAgICAgYXJndHVwbGUgb2J0YWluZWQgZnJvbSB0aGUgc3RhY2ssIGFuZCB0aGUgcmVzdWx0aW5nIGluc3RhbmNlIG9iamVjdAorICAgICAgaXMgcHVzaGVkIG9uIHRoZSBzdGFjay4KKworICAgICAgTk9URTogIGNoZWNrcyBmb3IgX19zYWZlX2Zvcl91bnBpY2tsaW5nX18gd2VudCBhd2F5IGluIFB5dGhvbiAyLjMuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdPQkonLAorICAgICAgY29kZT0nbycsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bbWFya29iamVjdCwgYW55b2JqZWN0LCBzdGFja3NsaWNlXSwKKyAgICAgIHN0YWNrX2FmdGVyPVthbnlvYmplY3RdLAorICAgICAgcHJvdG89MSwKKyAgICAgIGRvYz0iIiJCdWlsZCBhIGNsYXNzIGluc3RhbmNlLgorCisgICAgICBUaGlzIGlzIHRoZSBwcm90b2NvbCAxIHZlcnNpb24gb2YgcHJvdG9jb2wgMCdzIElOU1Qgb3Bjb2RlLCBhbmQgaXMKKyAgICAgIHZlcnkgbXVjaCBsaWtlIGl0LiAgVGhlIG1ham9yIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgY2xhc3Mgb2JqZWN0CisgICAgICBpcyB0YWtlbiBvZmYgdGhlIHN0YWNrLCBhbGxvd2luZyBpdCB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbWVtbworICAgICAgcmVwZWF0ZWRseSBpZiBzZXZlcmFsIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBjbGFzcyBhcmUgY3JlYXRlZC4gIFRoaXMKKyAgICAgIGNhbiBiZSBtdWNoIG1vcmUgZWZmaWNpZW50IChpbiBib3RoIHRpbWUgYW5kIHNwYWNlKSB0aGFuIHJlcGVhdGVkbHkKKyAgICAgIGVtYmVkZGluZyB0aGUgbW9kdWxlIGFuZCBjbGFzcyBuYW1lcyBpbiBJTlNUIG9wY29kZXMuCisKKyAgICAgIFVubGlrZSBJTlNULCBPQkogdGFrZXMgbm8gYXJndW1lbnRzIGZyb20gdGhlIG9wY29kZSBzdHJlYW0uICBJbnN0ZWFkCisgICAgICB0aGUgY2xhc3Mgb2JqZWN0IGlzIHRha2VuIG9mZiB0aGUgc3RhY2ssIGltbWVkaWF0ZWx5IGFib3ZlIHRoZQorICAgICAgdG9wbW9zdCBtYXJrb2JqZWN0OgorCisgICAgICBTdGFjayBiZWZvcmU6IC4uLiBtYXJrb2JqZWN0IGNsYXNzb2JqZWN0IHN0YWNrc2xpY2UKKyAgICAgIFN0YWNrIGFmdGVyOiAgLi4uIG5ld19pbnN0YW5jZV9vYmplY3QKKworICAgICAgQXMgZm9yIElOU1QsIHRoZSByZW1haW5kZXIgb2YgdGhlIHN0YWNrIGFib3ZlIHRoZSBtYXJrb2JqZWN0IGlzCisgICAgICBnYXRoZXJlZCBpbnRvIGFuIGFyZ3VtZW50IHR1cGxlLCBhbmQgdGhlbiB0aGUgbG9naWMgc2VlbXMgaWRlbnRpY2FsLAorICAgICAgZXhjZXB0IHRoYXQgbm8gX19zYWZlX2Zvcl91bnBpY2tsaW5nX18gY2hlY2sgaXMgZG9uZSAoWFhYIHRoaXMgaXMKKyAgICAgIGEgYnVnOyBjUGlja2xlIGRvZXMgdGVzdCBfX3NhZmVfZm9yX3VucGlja2xpbmdfXykuICBTZWUgSU5TVCBmb3IKKyAgICAgIHRoZSBnb3J5IGRldGFpbHMuCisKKyAgICAgIE5PVEU6ICBJbiBQeXRob24gMi4zLCBJTlNUIGFuZCBPQkogYXJlIGlkZW50aWNhbCBleGNlcHQgZm9yIGhvdyB0aGV5CisgICAgICBnZXQgdGhlIGNsYXNzIG9iamVjdC4gIFRoYXQgd2FzIGFsd2F5cyB0aGUgaW50ZW50OyB0aGUgaW1wbGVtZW50YXRpb25zCisgICAgICBoYWQgZGl2ZXJnZWQgZm9yIGFjY2lkZW50YWwgcmVhc29ucy4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J05FV09CSicsCisgICAgICBjb2RlPSdceDgxJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVthbnlvYmplY3QsIGFueW9iamVjdF0sCisgICAgICBzdGFja19hZnRlcj1bYW55b2JqZWN0XSwKKyAgICAgIHByb3RvPTIsCisgICAgICBkb2M9IiIiQnVpbGQgYW4gb2JqZWN0IGluc3RhbmNlLgorCisgICAgICBUaGUgc3RhY2sgYmVmb3JlIHNob3VsZCBiZSB0aG91Z2h0IG9mIGFzIGNvbnRhaW5pbmcgYSBjbGFzcworICAgICAgb2JqZWN0IGZvbGxvd2VkIGJ5IGFuIGFyZ3VtZW50IHR1cGxlICh0aGUgdHVwbGUgYmVpbmcgdGhlIHN0YWNrCisgICAgICB0b3ApLiAgQ2FsbCB0aGVzZSBjbHMgYW5kIGFyZ3MuICBUaGV5IGFyZSBwb3BwZWQgb2ZmIHRoZSBzdGFjaywKKyAgICAgIGFuZCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgY2xzLl9fbmV3X18oY2xzLCAqYXJncykgaXMgcHVzaGVkIGJhY2sKKyAgICAgIG9udG8gdGhlIHN0YWNrLgorICAgICAgIiIiKSwKKworICAgICMgTWFjaGluZSBjb250cm9sLgorCisgICAgSShuYW1lPSdQUk9UTycsCisgICAgICBjb2RlPSdceDgwJywKKyAgICAgIGFyZz11aW50MSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtdLAorICAgICAgcHJvdG89MiwKKyAgICAgIGRvYz0iIiJQcm90b2NvbCB2ZXJzaW9uIGluZGljYXRvci4KKworICAgICAgRm9yIHByb3RvY29sIDIgYW5kIGFib3ZlLCBhIHBpY2tsZSBtdXN0IHN0YXJ0IHdpdGggdGhpcyBvcGNvZGUuCisgICAgICBUaGUgYXJndW1lbnQgaXMgdGhlIHByb3RvY29sIHZlcnNpb24sIGFuIGludCBpbiByYW5nZSgyLCAyNTYpLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nU1RPUCcsCisgICAgICBjb2RlPScuJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVthbnlvYmplY3RdLAorICAgICAgc3RhY2tfYWZ0ZXI9W10sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSIiIlN0b3AgdGhlIHVucGlja2xpbmcgbWFjaGluZS4KKworICAgICAgRXZlcnkgcGlja2xlIGVuZHMgd2l0aCB0aGlzIG9wY29kZS4gIFRoZSBvYmplY3QgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKKyAgICAgIGlzIHBvcHBlZCwgYW5kIHRoYXQncyB0aGUgcmVzdWx0IG9mIHVucGlja2xpbmcuICBUaGUgc3RhY2sgc2hvdWxkIGJlCisgICAgICBlbXB0eSB0aGVuLgorICAgICAgIiIiKSwKKworICAgICMgV2F5cyB0byBkZWFsIHdpdGggcGVyc2lzdGVudCBJRHMuCisKKyAgICBJKG5hbWU9J1BFUlNJRCcsCisgICAgICBjb2RlPSdQJywKKyAgICAgIGFyZz1zdHJpbmdubF9ub2VzY2FwZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVthbnlvYmplY3RdLAorICAgICAgcHJvdG89MCwKKyAgICAgIGRvYz0iIiJQdXNoIGFuIG9iamVjdCBpZGVudGlmaWVkIGJ5IGEgcGVyc2lzdGVudCBJRC4KKworICAgICAgVGhlIHBpY2tsZSBtb2R1bGUgZG9lc24ndCBkZWZpbmUgd2hhdCBhIHBlcnNpc3RlbnQgSUQgbWVhbnMuICBQRVJTSUQncworICAgICAgYXJndW1lbnQgaXMgYSBuZXdsaW5lLXRlcm1pbmF0ZWQgc3RyLXN0eWxlIChubyBlbWJlZGRlZCBlc2NhcGVzLCBubworICAgICAgYnJhY2tldGluZyBxdW90ZSBjaGFyYWN0ZXJzKSBzdHJpbmcsIHdoaWNoICppcyogInRoZSBwZXJzaXN0ZW50IElEIi4KKyAgICAgIFRoZSB1bnBpY2tsZXIgcGFzc2VzIHRoaXMgc3RyaW5nIHRvIHNlbGYucGVyc2lzdGVudF9sb2FkKCkuICBXaGF0ZXZlcgorICAgICAgb2JqZWN0IHRoYXQgcmV0dXJucyBpcyBwdXNoZWQgb24gdGhlIHN0YWNrLiAgVGhlcmUgaXMgbm8gaW1wbGVtZW50YXRpb24KKyAgICAgIG9mIHBlcnNpc3RlbnRfbG9hZCgpIGluIFB5dGhvbidzIHVucGlja2xlcjogIGl0IG11c3QgYmUgc3VwcGxpZWQgYnkgYW4KKyAgICAgIHVucGlja2xlciBzdWJjbGFzcy4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J0JJTlBFUlNJRCcsCisgICAgICBjb2RlPSdRJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVthbnlvYmplY3RdLAorICAgICAgc3RhY2tfYWZ0ZXI9W2FueW9iamVjdF0sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSIiIlB1c2ggYW4gb2JqZWN0IGlkZW50aWZpZWQgYnkgYSBwZXJzaXN0ZW50IElELgorCisgICAgICBMaWtlIFBFUlNJRCwgZXhjZXB0IHRoZSBwZXJzaXN0ZW50IElEIGlzIHBvcHBlZCBvZmYgdGhlIHN0YWNrIChpbnN0ZWFkCisgICAgICBvZiBiZWluZyBhIHN0cmluZyBlbWJlZGRlZCBpbiB0aGUgb3Bjb2RlIGJ5dGVzdHJlYW0pLiAgVGhlIHBlcnNpc3RlbnQKKyAgICAgIElEIGlzIHBhc3NlZCB0byBzZWxmLnBlcnNpc3RlbnRfbG9hZCgpLCBhbmQgd2hhdGV2ZXIgb2JqZWN0IHRoYXQKKyAgICAgIHJldHVybnMgaXMgcHVzaGVkIG9uIHRoZSBzdGFjay4gIFNlZSBQRVJTSUQgZm9yIG1vcmUgZGV0YWlsLgorICAgICAgIiIiKSwKK10KK2RlbCBJCisKKyMgVmVyaWZ5IHVuaXF1ZW5lc3Mgb2YgLm5hbWUgYW5kIC5jb2RlIG1lbWJlcnMuCituYW1lMmkgPSB7fQorY29kZTJpID0ge30KKworZm9yIGksIGQgaW4gZW51bWVyYXRlKG9wY29kZXMpOgorICAgIGlmIGQubmFtZSBpbiBuYW1lMmk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInJlcGVhdGVkIG5hbWUgJXIgYXQgaW5kaWNlcyAlZCBhbmQgJWQiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZC5uYW1lLCBuYW1lMmlbZC5uYW1lXSwgaSkpCisgICAgaWYgZC5jb2RlIGluIGNvZGUyaToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVwZWF0ZWQgY29kZSAlciBhdCBpbmRpY2VzICVkIGFuZCAlZCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChkLmNvZGUsIGNvZGUyaVtkLmNvZGVdLCBpKSkKKworICAgIG5hbWUyaVtkLm5hbWVdID0gaQorICAgIGNvZGUyaVtkLmNvZGVdID0gaQorCitkZWwgbmFtZTJpLCBjb2RlMmksIGksIGQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJ1aWxkIGEgY29kZTJvcCBkaWN0LCBtYXBwaW5nIG9wY29kZSBjaGFyYWN0ZXJzIHRvIE9wY29kZUluZm8gcmVjb3Jkcy4KKyMgQWxzbyBlbnN1cmUgd2UndmUgZ290IHRoZSBzYW1lIHN0dWZmIGFzIHBpY2tsZS5weSwgYWx0aG91Z2ggdGhlCisjIGludHJvc3BlY3Rpb24gaGVyZSBpcyBkaWNleS4KKworY29kZTJvcCA9IHt9Citmb3IgZCBpbiBvcGNvZGVzOgorICAgIGNvZGUyb3BbZC5jb2RlXSA9IGQKK2RlbCBkCisKK2RlZiBhc3N1cmVfcGlja2xlX2NvbnNpc3RlbmN5KHZlcmJvc2U9RmFsc2UpOgorICAgIGltcG9ydCBwaWNrbGUsIHJlCisKKyAgICBjb3B5ID0gY29kZTJvcC5jb3B5KCkKKyAgICBmb3IgbmFtZSBpbiBwaWNrbGUuX19hbGxfXzoKKyAgICAgICAgaWYgbm90IHJlLm1hdGNoKCJbQS1aXVtBLVowLTlfXSskIiwgbmFtZSk6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJza2lwcGluZyAlcjogaXQgZG9lc24ndCBsb29rIGxpa2UgYW4gb3Bjb2RlIG5hbWUiICUgbmFtZQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcGlja2xlY29kZSA9IGdldGF0dHIocGlja2xlLCBuYW1lKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShwaWNrbGVjb2RlLCBzdHIpIG9yIGxlbihwaWNrbGVjb2RlKSAhPSAxOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAoInNraXBwaW5nICVyOiB2YWx1ZSAlciBkb2Vzbid0IGxvb2sgbGlrZSBhIHBpY2tsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJjb2RlIiAlIChuYW1lLCBwaWNrbGVjb2RlKSkKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHBpY2tsZWNvZGUgaW4gY29weToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgImNoZWNraW5nIG5hbWUgJXIgdy8gY29kZSAlciBmb3IgY29uc2lzdGVuY3kiICUgKAorICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHBpY2tsZWNvZGUpCisgICAgICAgICAgICBkID0gY29weVtwaWNrbGVjb2RlXQorICAgICAgICAgICAgaWYgZC5uYW1lICE9IG5hbWU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZm9yIHBpY2tsZSBjb2RlICVyLCBwaWNrbGUucHkgdXNlcyBuYW1lICVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgd2UncmUgdXNpbmcgbmFtZSAlciIgJSAocGlja2xlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5uYW1lKSkKKyAgICAgICAgICAgICMgRm9yZ2V0IHRoaXMgb25lLiAgQW55IGxlZnQgb3ZlciBpbiBjb3B5IGF0IHRoZSBlbmQgYXJlIGEgcHJvYmxlbQorICAgICAgICAgICAgIyBvZiBhIGRpZmZlcmVudCBraW5kLgorICAgICAgICAgICAgZGVsIGNvcHlbcGlja2xlY29kZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInBpY2tsZS5weSBhcHBlYXJzIHRvIGhhdmUgYSBwaWNrbGUgb3Bjb2RlIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmFtZSAlciBhbmQgY29kZSAlciwgYnV0IHdlIGRvbid0IiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCBwaWNrbGVjb2RlKSkKKyAgICBpZiBjb3B5OgorICAgICAgICBtc2cgPSBbIndlIGFwcGVhciB0byBoYXZlIHBpY2tsZSBvcGNvZGVzIHRoYXQgcGlja2xlLnB5IGRvZXNuJ3QgaGF2ZToiXQorICAgICAgICBmb3IgY29kZSwgZCBpbiBjb3B5Lml0ZW1zKCk6CisgICAgICAgICAgICBtc2cuYXBwZW5kKCIgICAgbmFtZSAlciB3aXRoIGNvZGUgJXIiICUgKGQubmFtZSwgY29kZSkpCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlxuIi5qb2luKG1zZykpCisKK2Fzc3VyZV9waWNrbGVfY29uc2lzdGVuY3koKQorZGVsIGFzc3VyZV9waWNrbGVfY29uc2lzdGVuY3kKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEEgcGlja2xlIG9wY29kZSBnZW5lcmF0b3IuCisKK2RlZiBnZW5vcHMocGlja2xlKToKKyAgICAiIiJHZW5lcmF0ZSBhbGwgdGhlIG9wY29kZXMgaW4gYSBwaWNrbGUuCisKKyAgICAncGlja2xlJyBpcyBhIGZpbGUtbGlrZSBvYmplY3QsIG9yIHN0cmluZywgY29udGFpbmluZyB0aGUgcGlja2xlLgorCisgICAgRWFjaCBvcGNvZGUgaW4gdGhlIHBpY2tsZSBpcyBnZW5lcmF0ZWQsIGZyb20gdGhlIGN1cnJlbnQgcGlja2xlIHBvc2l0aW9uLAorICAgIHN0b3BwaW5nIGFmdGVyIGEgU1RPUCBvcGNvZGUgaXMgZGVsaXZlcmVkLiAgQSB0cmlwbGUgaXMgZ2VuZXJhdGVkIGZvcgorICAgIGVhY2ggb3Bjb2RlOgorCisgICAgICAgIG9wY29kZSwgYXJnLCBwb3MKKworICAgIG9wY29kZSBpcyBhbiBPcGNvZGVJbmZvIHJlY29yZCwgZGVzY3JpYmluZyB0aGUgY3VycmVudCBvcGNvZGUuCisKKyAgICBJZiB0aGUgb3Bjb2RlIGhhcyBhbiBhcmd1bWVudCBlbWJlZGRlZCBpbiB0aGUgcGlja2xlLCBhcmcgaXMgaXRzIGRlY29kZWQKKyAgICB2YWx1ZSwgYXMgYSBQeXRob24gb2JqZWN0LiAgSWYgdGhlIG9wY29kZSBkb2Vzbid0IGhhdmUgYW4gYXJndW1lbnQsIGFyZworICAgIGlzIE5vbmUuCisKKyAgICBJZiB0aGUgcGlja2xlIGhhcyBhIHRlbGwoKSBtZXRob2QsIHBvcyB3YXMgdGhlIHZhbHVlIG9mIHBpY2tsZS50ZWxsKCkKKyAgICBiZWZvcmUgcmVhZGluZyB0aGUgY3VycmVudCBvcGNvZGUuICBJZiB0aGUgcGlja2xlIGlzIGEgc3RyaW5nIG9iamVjdCwKKyAgICBpdCdzIHdyYXBwZWQgaW4gYSBTdHJpbmdJTyBvYmplY3QsIGFuZCB0aGUgbGF0dGVyJ3MgdGVsbCgpIHJlc3VsdCBpcworICAgIHVzZWQuICBFbHNlICh0aGUgcGlja2xlIGRvZXNuJ3QgaGF2ZSBhIHRlbGwoKSwgYW5kIGl0J3Mgbm90IG9idmlvdXMgaG93CisgICAgdG8gcXVlcnkgaXRzIGN1cnJlbnQgcG9zaXRpb24pIHBvcyBpcyBOb25lLgorICAgICIiIgorCisgICAgaW1wb3J0IGNTdHJpbmdJTyBhcyBTdHJpbmdJTworCisgICAgaWYgaXNpbnN0YW5jZShwaWNrbGUsIHN0cik6CisgICAgICAgIHBpY2tsZSA9IFN0cmluZ0lPLlN0cmluZ0lPKHBpY2tsZSkKKworICAgIGlmIGhhc2F0dHIocGlja2xlLCAidGVsbCIpOgorICAgICAgICBnZXRwb3MgPSBwaWNrbGUudGVsbAorICAgIGVsc2U6CisgICAgICAgIGdldHBvcyA9IGxhbWJkYTogTm9uZQorCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgcG9zID0gZ2V0cG9zKCkKKyAgICAgICAgY29kZSA9IHBpY2tsZS5yZWFkKDEpCisgICAgICAgIG9wY29kZSA9IGNvZGUyb3AuZ2V0KGNvZGUpCisgICAgICAgIGlmIG9wY29kZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgY29kZSA9PSAiIjoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwaWNrbGUgZXhoYXVzdGVkIGJlZm9yZSBzZWVpbmcgU1RPUCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImF0IHBvc2l0aW9uICVzLCBvcGNvZGUgJXIgdW5rbm93biIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgaXMgTm9uZSBhbmQgIjx1bmtub3duPiIgb3IgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSkpCisgICAgICAgIGlmIG9wY29kZS5hcmcgaXMgTm9uZToKKyAgICAgICAgICAgIGFyZyA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZyA9IG9wY29kZS5hcmcucmVhZGVyKHBpY2tsZSkKKyAgICAgICAgeWllbGQgb3Bjb2RlLCBhcmcsIHBvcworICAgICAgICBpZiBjb2RlID09ICcuJzoKKyAgICAgICAgICAgIGFzc2VydCBvcGNvZGUubmFtZSA9PSAnU1RPUCcKKyAgICAgICAgICAgIGJyZWFrCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBIHBpY2tsZSBvcHRpbWl6ZXIuCisKK2RlZiBvcHRpbWl6ZShwKToKKyAgICAnT3B0aW1pemUgYSBwaWNrbGUgc3RyaW5nIGJ5IHJlbW92aW5nIHVudXNlZCBQVVQgb3Bjb2RlcycKKyAgICBnZXRzID0gc2V0KCkgICAgICAgICAgICAjIHNldCBvZiBhcmdzIHVzZWQgYnkgYSBHRVQgb3Bjb2RlCisgICAgcHV0cyA9IFtdICAgICAgICAgICAgICAgIyAoYXJnLCBzdGFydHBvcywgc3RvcHBvcykgZm9yIHRoZSBQVVQgb3Bjb2RlcworICAgIHByZXZwb3MgPSBOb25lICAgICAgICAgICMgc2V0IHRvIHBvcyBpZiBwcmV2aW91cyBvcGNvZGUgd2FzIGEgUFVUCisgICAgZm9yIG9wY29kZSwgYXJnLCBwb3MgaW4gZ2Vub3BzKHApOgorICAgICAgICBpZiBwcmV2cG9zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHV0cy5hcHBlbmQoKHByZXZhcmcsIHByZXZwb3MsIHBvcykpCisgICAgICAgICAgICBwcmV2cG9zID0gTm9uZQorICAgICAgICBpZiAnUFVUJyBpbiBvcGNvZGUubmFtZToKKyAgICAgICAgICAgIHByZXZhcmcsIHByZXZwb3MgPSBhcmcsIHBvcworICAgICAgICBlbGlmICdHRVQnIGluIG9wY29kZS5uYW1lOgorICAgICAgICAgICAgZ2V0cy5hZGQoYXJnKQorCisgICAgIyBDb3B5IHRoZSBwaWNrbGUgc3RyaW5nIGV4Y2VwdCBmb3IgUFVUUyB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBHRVQKKyAgICBzID0gW10KKyAgICBpID0gMAorICAgIGZvciBhcmcsIHN0YXJ0LCBzdG9wIGluIHB1dHM6CisgICAgICAgIGogPSBzdG9wIGlmIChhcmcgaW4gZ2V0cykgZWxzZSBzdGFydAorICAgICAgICBzLmFwcGVuZChwW2k6al0pCisgICAgICAgIGkgPSBzdG9wCisgICAgcy5hcHBlbmQocFtpOl0pCisgICAgcmV0dXJuICcnLmpvaW4ocykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEEgc3ltYm9saWMgcGlja2xlIGRpc2Fzc2VtYmxlci4KKworZGVmIGRpcyhwaWNrbGUsIG91dD1Ob25lLCBtZW1vPU5vbmUsIGluZGVudGxldmVsPTQpOgorICAgICIiIlByb2R1Y2UgYSBzeW1ib2xpYyBkaXNhc3NlbWJseSBvZiBhIHBpY2tsZS4KKworICAgICdwaWNrbGUnIGlzIGEgZmlsZS1saWtlIG9iamVjdCwgb3Igc3RyaW5nLCBjb250YWluaW5nIGEgKGF0IGxlYXN0IG9uZSkKKyAgICBwaWNrbGUuICBUaGUgcGlja2xlIGlzIGRpc2Fzc2VtYmxlZCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLCB0aHJvdWdoCisgICAgdGhlIGZpcnN0IFNUT1Agb3Bjb2RlIGVuY291bnRlcmVkLgorCisgICAgT3B0aW9uYWwgYXJnICdvdXQnIGlzIGEgZmlsZS1saWtlIG9iamVjdCB0byB3aGljaCB0aGUgZGlzYXNzZW1ibHkgaXMKKyAgICBwcmludGVkLiAgSXQgZGVmYXVsdHMgdG8gc3lzLnN0ZG91dC4KKworICAgIE9wdGlvbmFsIGFyZyAnbWVtbycgaXMgYSBQeXRob24gZGljdCwgdXNlZCBhcyB0aGUgcGlja2xlJ3MgbWVtby4gIEl0CisgICAgbWF5IGJlIG11dGF0ZWQgYnkgZGlzKCksIGlmIHRoZSBwaWNrbGUgY29udGFpbnMgUFVUIG9yIEJJTlBVVCBvcGNvZGVzLgorICAgIFBhc3NpbmcgdGhlIHNhbWUgbWVtbyBvYmplY3QgdG8gYW5vdGhlciBkaXMoKSBjYWxsIHRoZW4gYWxsb3dzIGRpc2Fzc2VtYmx5CisgICAgdG8gcHJvY2VlZCBhY3Jvc3MgbXVsdGlwbGUgcGlja2xlcyB0aGF0IHdlcmUgYWxsIGNyZWF0ZWQgYnkgdGhlIHNhbWUKKyAgICBwaWNrbGVyIHdpdGggdGhlIHNhbWUgbWVtby4gIE9yZGluYXJpbHkgeW91IGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhpcy4KKworICAgIE9wdGlvbmFsIGFyZyBpbmRlbnRsZXZlbCBpcyB0aGUgbnVtYmVyIG9mIGJsYW5rcyBieSB3aGljaCB0byBpbmRlbnQKKyAgICBhIG5ldyBNQVJLIGxldmVsLiAgSXQgZGVmYXVsdHMgdG8gNC4KKworICAgIEluIGFkZGl0aW9uIHRvIHByaW50aW5nIHRoZSBkaXNhc3NlbWJseSwgc29tZSBzYW5pdHkgY2hlY2tzIGFyZSBtYWRlOgorCisgICAgKyBBbGwgZW1iZWRkZWQgb3Bjb2RlIGFyZ3VtZW50cyAibWFrZSBzZW5zZSIuCisKKyAgICArIEV4cGxpY2l0IGFuZCBpbXBsaWNpdCBwb3Agb3BlcmF0aW9ucyBoYXZlIGVub3VnaCBpdGVtcyBvbiB0aGUgc3RhY2suCisKKyAgICArIFdoZW4gYW4gb3Bjb2RlIGltcGxpY2l0bHkgcmVmZXJzIHRvIGEgbWFya29iamVjdCwgYSBtYXJrb2JqZWN0IGlzCisgICAgICBhY3R1YWxseSBvbiB0aGUgc3RhY2suCisKKyAgICArIEEgbWVtbyBlbnRyeSBpc24ndCByZWZlcmVuY2VkIGJlZm9yZSBpdCdzIGRlZmluZWQuCisKKyAgICArIFRoZSBtYXJrb2JqZWN0IGlzbid0IHN0b3JlZCBpbiB0aGUgbWVtby4KKworICAgICsgQSBtZW1vIGVudHJ5IGlzbid0IHJlZGVmaW5lZC4KKyAgICAiIiIKKworICAgICMgTW9zdCBvZiB0aGUgaGFpciBoZXJlIGlzIGZvciBzYW5pdHkgY2hlY2tzLCBidXQgbW9zdCBvZiBpdCBpcyBuZWVkZWQKKyAgICAjIGFueXdheSB0byBkZXRlY3Qgd2hlbiBhIHByb3RvY29sIDAgUE9QIHRha2VzIGEgTUFSSyBvZmYgdGhlIHN0YWNrCisgICAgIyAod2hpY2ggaW4gdHVybiBpcyBuZWVkZWQgdG8gaW5kZW50IE1BUksgYmxvY2tzIGNvcnJlY3RseSkuCisKKyAgICBzdGFjayA9IFtdICAgICAgICAgICMgY3J1ZGUgZW11bGF0aW9uIG9mIHVucGlja2xlciBzdGFjaworICAgIGlmIG1lbW8gaXMgTm9uZToKKyAgICAgICAgbWVtbyA9IHt9ICAgICAgICMgY3J1ZGUgZW11bGF0aW9uIG9mIHVucGlja2VyIG1lbW8KKyAgICBtYXhwcm90byA9IC0xICAgICAgICMgbWF4IHByb3RvY29sIG51bWJlciBzZWVuCisgICAgbWFya3N0YWNrID0gW10gICAgICAjIGJ5dGVjb2RlIHBvc2l0aW9ucyBvZiBNQVJLIG9wY29kZXMKKyAgICBpbmRlbnRjaHVuayA9ICcgJyAqIGluZGVudGxldmVsCisgICAgZXJyb3Jtc2cgPSBOb25lCisgICAgZm9yIG9wY29kZSwgYXJnLCBwb3MgaW4gZ2Vub3BzKHBpY2tsZSk6CisgICAgICAgIGlmIHBvcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByaW50ID4+IG91dCwgIiU1ZDoiICUgcG9zLAorCisgICAgICAgIGxpbmUgPSAiJS00cyAlcyVzIiAlIChyZXByKG9wY29kZS5jb2RlKVsxOi0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudGNodW5rICogbGVuKG1hcmtzdGFjayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUubmFtZSkKKworICAgICAgICBtYXhwcm90byA9IG1heChtYXhwcm90bywgb3Bjb2RlLnByb3RvKQorICAgICAgICBiZWZvcmUgPSBvcGNvZGUuc3RhY2tfYmVmb3JlICAgICMgZG9uJ3QgbXV0YXRlCisgICAgICAgIGFmdGVyID0gb3Bjb2RlLnN0YWNrX2FmdGVyICAgICAgIyBkb24ndCBtdXRhdGUKKyAgICAgICAgbnVtdG9wb3AgPSBsZW4oYmVmb3JlKQorCisgICAgICAgICMgU2VlIHdoZXRoZXIgYSBNQVJLIHNob3VsZCBiZSBwb3BwZWQuCisgICAgICAgIG1hcmttc2cgPSBOb25lCisgICAgICAgIGlmIG1hcmtvYmplY3QgaW4gYmVmb3JlIG9yIChvcGNvZGUubmFtZSA9PSAiUE9QIiBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tbLTFdIGlzIG1hcmtvYmplY3QpOgorICAgICAgICAgICAgYXNzZXJ0IG1hcmtvYmplY3Qgbm90IGluIGFmdGVyCisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgaWYgbWFya29iamVjdCBpbiBiZWZvcmU6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBiZWZvcmVbLTFdIGlzIHN0YWNrc2xpY2UKKyAgICAgICAgICAgIGlmIG1hcmtzdGFjazoKKyAgICAgICAgICAgICAgICBtYXJrcG9zID0gbWFya3N0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgaWYgbWFya3BvcyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBtYXJrbXNnID0gIihNQVJLIGF0IHVua25vd24gb3Bjb2RlIG9mZnNldCkiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbWFya21zZyA9ICIoTUFSSyBhdCAlZCkiICUgbWFya3BvcworICAgICAgICAgICAgICAgICMgUG9wIGV2ZXJ5dGhpbmcgYXQgYW5kIGFmdGVyIHRoZSB0b3Btb3N0IG1hcmtvYmplY3QuCisgICAgICAgICAgICAgICAgd2hpbGUgc3RhY2tbLTFdIGlzIG5vdCBtYXJrb2JqZWN0OgorICAgICAgICAgICAgICAgICAgICBzdGFjay5wb3AoKQorICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgIyBTdG9wIGxhdGVyIGNvZGUgZnJvbSBwb3BwaW5nIHRvbyBtdWNoLgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbnVtdG9wb3AgPSBiZWZvcmUuaW5kZXgobWFya29iamVjdCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG9wY29kZS5uYW1lID09ICJQT1AiCisgICAgICAgICAgICAgICAgICAgIG51bXRvcG9wID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlcnJvcm1zZyA9IG1hcmttc2cgPSAibm8gTUFSSyBleGlzdHMgb24gc3RhY2siCisKKyAgICAgICAgIyBDaGVjayBmb3IgY29ycmVjdCBtZW1vIHVzYWdlLgorICAgICAgICBpZiBvcGNvZGUubmFtZSBpbiAoIlBVVCIsICJCSU5QVVQiLCAiTE9OR19CSU5QVVQiKToKKyAgICAgICAgICAgIGFzc2VydCBhcmcgaXMgbm90IE5vbmUKKyAgICAgICAgICAgIGlmIGFyZyBpbiBtZW1vOgorICAgICAgICAgICAgICAgIGVycm9ybXNnID0gIm1lbW8ga2V5ICVyIGFscmVhZHkgZGVmaW5lZCIgJSBhcmcKKyAgICAgICAgICAgIGVsaWYgbm90IHN0YWNrOgorICAgICAgICAgICAgICAgIGVycm9ybXNnID0gInN0YWNrIGlzIGVtcHR5IC0tIGNhbid0IHN0b3JlIGludG8gbWVtbyIKKyAgICAgICAgICAgIGVsaWYgc3RhY2tbLTFdIGlzIG1hcmtvYmplY3Q6CisgICAgICAgICAgICAgICAgZXJyb3Jtc2cgPSAiY2FuJ3Qgc3RvcmUgbWFya29iamVjdCBpbiB0aGUgbWVtbyIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbWVtb1thcmddID0gc3RhY2tbLTFdCisKKyAgICAgICAgZWxpZiBvcGNvZGUubmFtZSBpbiAoIkdFVCIsICJCSU5HRVQiLCAiTE9OR19CSU5HRVQiKToKKyAgICAgICAgICAgIGlmIGFyZyBpbiBtZW1vOgorICAgICAgICAgICAgICAgIGFzc2VydCBsZW4oYWZ0ZXIpID09IDEKKyAgICAgICAgICAgICAgICBhZnRlciA9IFttZW1vW2FyZ11dICAgICAjIGZvciBiZXR0ZXIgc3RhY2sgZW11bGF0aW9uCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVycm9ybXNnID0gIm1lbW8ga2V5ICVyIGhhcyBuZXZlciBiZWVuIHN0b3JlZCBpbnRvIiAlIGFyZworCisgICAgICAgIGlmIGFyZyBpcyBub3QgTm9uZSBvciBtYXJrbXNnOgorICAgICAgICAgICAgIyBtYWtlIGEgbWlsZCBlZmZvcnQgdG8gYWxpZ24gYXJndW1lbnRzCisgICAgICAgICAgICBsaW5lICs9ICcgJyAqICgxMCAtIGxlbihvcGNvZGUubmFtZSkpCisgICAgICAgICAgICBpZiBhcmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbGluZSArPSAnICcgKyByZXByKGFyZykKKyAgICAgICAgICAgIGlmIG1hcmttc2c6CisgICAgICAgICAgICAgICAgbGluZSArPSAnICcgKyBtYXJrbXNnCisgICAgICAgIHByaW50ID4+IG91dCwgbGluZQorCisgICAgICAgIGlmIGVycm9ybXNnOgorICAgICAgICAgICAgIyBOb3RlIHRoYXQgd2UgZGVsYXllZCBjb21wbGFpbmluZyB1bnRpbCB0aGUgb2ZmZW5kaW5nIG9wY29kZQorICAgICAgICAgICAgIyB3YXMgcHJpbnRlZC4KKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJyb3Jtc2cpCisKKyAgICAgICAgIyBFbXVsYXRlIHRoZSBzdGFjayBlZmZlY3RzLgorICAgICAgICBpZiBsZW4oc3RhY2spIDwgbnVtdG9wb3A6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ0cmllcyB0byBwb3AgJWQgaXRlbXMgZnJvbSBzdGFjayB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgJWQgaXRlbXMiICUgKG51bXRvcG9wLCBsZW4oc3RhY2spKSkKKyAgICAgICAgaWYgbnVtdG9wb3A6CisgICAgICAgICAgICBkZWwgc3RhY2tbLW51bXRvcG9wOl0KKyAgICAgICAgaWYgbWFya29iamVjdCBpbiBhZnRlcjoKKyAgICAgICAgICAgIGFzc2VydCBtYXJrb2JqZWN0IG5vdCBpbiBiZWZvcmUKKyAgICAgICAgICAgIG1hcmtzdGFjay5hcHBlbmQocG9zKQorCisgICAgICAgIHN0YWNrLmV4dGVuZChhZnRlcikKKworICAgIHByaW50ID4+IG91dCwgImhpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IiwgbWF4cHJvdG8KKyAgICBpZiBzdGFjazoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3RhY2sgbm90IGVtcHR5IGFmdGVyIFNUT1A6ICVyIiAlIHN0YWNrKQorCisjIEZvciB1c2UgaW4gdGhlIGRvY3Rlc3QsIHNpbXBseSBhcyBhbiBleGFtcGxlIG9mIGEgY2xhc3MgdG8gcGlja2xlLgorY2xhc3MgX0V4YW1wbGU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisKK19kaXNfdGVzdCA9IHIiIiIKKz4+PiBpbXBvcnQgcGlja2xlCis+Pj4geCA9IFsxLCAyLCAoMywgNCksIHsnYWJjJzogdSJkZWYifV0KKz4+PiBwa2wgPSBwaWNrbGUuZHVtcHMoeCwgMCkKKz4+PiBkaXMocGtsKQorICAgIDA6ICggICAgTUFSSworICAgIDE6IGwgICAgICAgIExJU1QgICAgICAgKE1BUksgYXQgMCkKKyAgICAyOiBwICAgIFBVVCAgICAgICAgMAorICAgIDU6IEkgICAgSU5UICAgICAgICAxCisgICAgODogYSAgICBBUFBFTkQKKyAgICA5OiBJICAgIElOVCAgICAgICAgMgorICAgMTI6IGEgICAgQVBQRU5ECisgICAxMzogKCAgICBNQVJLCisgICAxNDogSSAgICAgICAgSU5UICAgICAgICAzCisgICAxNzogSSAgICAgICAgSU5UICAgICAgICA0CisgICAyMDogdCAgICAgICAgVFVQTEUgICAgICAoTUFSSyBhdCAxMykKKyAgIDIxOiBwICAgIFBVVCAgICAgICAgMQorICAgMjQ6IGEgICAgQVBQRU5ECisgICAyNTogKCAgICBNQVJLCisgICAyNjogZCAgICAgICAgRElDVCAgICAgICAoTUFSSyBhdCAyNSkKKyAgIDI3OiBwICAgIFBVVCAgICAgICAgMgorICAgMzA6IFMgICAgU1RSSU5HICAgICAnYWJjJworICAgMzc6IHAgICAgUFVUICAgICAgICAzCisgICA0MDogViAgICBVTklDT0RFICAgIHUnZGVmJworICAgNDU6IHAgICAgUFVUICAgICAgICA0CisgICA0ODogcyAgICBTRVRJVEVNCisgICA0OTogYSAgICBBUFBFTkQKKyAgIDUwOiAuICAgIFNUT1AKK2hpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDAKKworVHJ5IGFnYWluIHdpdGggYSAiYmluYXJ5IiBwaWNrbGUuCisKKz4+PiBwa2wgPSBwaWNrbGUuZHVtcHMoeCwgMSkKKz4+PiBkaXMocGtsKQorICAgIDA6IF0gICAgRU1QVFlfTElTVAorICAgIDE6IHEgICAgQklOUFVUICAgICAwCisgICAgMzogKCAgICBNQVJLCisgICAgNDogSyAgICAgICAgQklOSU5UMSAgICAxCisgICAgNjogSyAgICAgICAgQklOSU5UMSAgICAyCisgICAgODogKCAgICAgICAgTUFSSworICAgIDk6IEsgICAgICAgICAgICBCSU5JTlQxICAgIDMKKyAgIDExOiBLICAgICAgICAgICAgQklOSU5UMSAgICA0CisgICAxMzogdCAgICAgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgOCkKKyAgIDE0OiBxICAgICAgICBCSU5QVVQgICAgIDEKKyAgIDE2OiB9ICAgICAgICBFTVBUWV9ESUNUCisgICAxNzogcSAgICAgICAgQklOUFVUICAgICAyCisgICAxOTogVSAgICAgICAgU0hPUlRfQklOU1RSSU5HICdhYmMnCisgICAyNDogcSAgICAgICAgQklOUFVUICAgICAzCisgICAyNjogWCAgICAgICAgQklOVU5JQ09ERSB1J2RlZicKKyAgIDM0OiBxICAgICAgICBCSU5QVVQgICAgIDQKKyAgIDM2OiBzICAgICAgICBTRVRJVEVNCisgICAzNzogZSAgICAgICAgQVBQRU5EUyAgICAoTUFSSyBhdCAzKQorICAgMzg6IC4gICAgU1RPUAoraGlnaGVzdCBwcm90b2NvbCBhbW9uZyBvcGNvZGVzID0gMQorCitFeGVyY2lzZSB0aGUgSU5TVC9PQkovQlVJTEQgZmFtaWx5LgorCis+Pj4gaW1wb3J0IHBpY2tsZXRvb2xzCis+Pj4gZGlzKHBpY2tsZS5kdW1wcyhwaWNrbGV0b29scy5kaXMsIDApKQorICAgIDA6IGMgICAgR0xPQkFMICAgICAncGlja2xldG9vbHMgZGlzJworICAgMTc6IHAgICAgUFVUICAgICAgICAwCisgICAyMDogLiAgICBTVE9QCitoaWdoZXN0IHByb3RvY29sIGFtb25nIG9wY29kZXMgPSAwCisKKz4+PiBmcm9tIHBpY2tsZXRvb2xzIGltcG9ydCBfRXhhbXBsZQorPj4+IHggPSBbX0V4YW1wbGUoNDIpXSAqIDIKKz4+PiBkaXMocGlja2xlLmR1bXBzKHgsIDApKQorICAgIDA6ICggICAgTUFSSworICAgIDE6IGwgICAgICAgIExJU1QgICAgICAgKE1BUksgYXQgMCkKKyAgICAyOiBwICAgIFBVVCAgICAgICAgMAorICAgIDU6ICggICAgTUFSSworICAgIDY6IGkgICAgICAgIElOU1QgICAgICAgJ3BpY2tsZXRvb2xzIF9FeGFtcGxlJyAoTUFSSyBhdCA1KQorICAgMjg6IHAgICAgUFVUICAgICAgICAxCisgICAzMTogKCAgICBNQVJLCisgICAzMjogZCAgICAgICAgRElDVCAgICAgICAoTUFSSyBhdCAzMSkKKyAgIDMzOiBwICAgIFBVVCAgICAgICAgMgorICAgMzY6IFMgICAgU1RSSU5HICAgICAndmFsdWUnCisgICA0NTogcCAgICBQVVQgICAgICAgIDMKKyAgIDQ4OiBJICAgIElOVCAgICAgICAgNDIKKyAgIDUyOiBzICAgIFNFVElURU0KKyAgIDUzOiBiICAgIEJVSUxECisgICA1NDogYSAgICBBUFBFTkQKKyAgIDU1OiBnICAgIEdFVCAgICAgICAgMQorICAgNTg6IGEgICAgQVBQRU5ECisgICA1OTogLiAgICBTVE9QCitoaWdoZXN0IHByb3RvY29sIGFtb25nIG9wY29kZXMgPSAwCisKKz4+PiBkaXMocGlja2xlLmR1bXBzKHgsIDEpKQorICAgIDA6IF0gICAgRU1QVFlfTElTVAorICAgIDE6IHEgICAgQklOUFVUICAgICAwCisgICAgMzogKCAgICBNQVJLCisgICAgNDogKCAgICAgICAgTUFSSworICAgIDU6IGMgICAgICAgICAgICBHTE9CQUwgICAgICdwaWNrbGV0b29scyBfRXhhbXBsZScKKyAgIDI3OiBxICAgICAgICAgICAgQklOUFVUICAgICAxCisgICAyOTogbyAgICAgICAgICAgIE9CSiAgICAgICAgKE1BUksgYXQgNCkKKyAgIDMwOiBxICAgICAgICBCSU5QVVQgICAgIDIKKyAgIDMyOiB9ICAgICAgICBFTVBUWV9ESUNUCisgICAzMzogcSAgICAgICAgQklOUFVUICAgICAzCisgICAzNTogVSAgICAgICAgU0hPUlRfQklOU1RSSU5HICd2YWx1ZScKKyAgIDQyOiBxICAgICAgICBCSU5QVVQgICAgIDQKKyAgIDQ0OiBLICAgICAgICBCSU5JTlQxICAgIDQyCisgICA0NjogcyAgICAgICAgU0VUSVRFTQorICAgNDc6IGIgICAgICAgIEJVSUxECisgICA0ODogaCAgICAgICAgQklOR0VUICAgICAyCisgICA1MDogZSAgICAgICAgQVBQRU5EUyAgICAoTUFSSyBhdCAzKQorICAgNTE6IC4gICAgU1RPUAoraGlnaGVzdCBwcm90b2NvbCBhbW9uZyBvcGNvZGVzID0gMQorCitUcnkgInRoZSBjYW5vbmljYWwiIHJlY3Vyc2l2ZS1vYmplY3QgdGVzdC4KKworPj4+IEwgPSBbXQorPj4+IFQgPSBMLAorPj4+IEwuYXBwZW5kKFQpCis+Pj4gTFswXSBpcyBUCitUcnVlCis+Pj4gVFswXSBpcyBMCitUcnVlCis+Pj4gTFswXVswXSBpcyBMCitUcnVlCis+Pj4gVFswXVswXSBpcyBUCitUcnVlCis+Pj4gZGlzKHBpY2tsZS5kdW1wcyhMLCAwKSkKKyAgICAwOiAoICAgIE1BUksKKyAgICAxOiBsICAgICAgICBMSVNUICAgICAgIChNQVJLIGF0IDApCisgICAgMjogcCAgICBQVVQgICAgICAgIDAKKyAgICA1OiAoICAgIE1BUksKKyAgICA2OiBnICAgICAgICBHRVQgICAgICAgIDAKKyAgICA5OiB0ICAgICAgICBUVVBMRSAgICAgIChNQVJLIGF0IDUpCisgICAxMDogcCAgICBQVVQgICAgICAgIDEKKyAgIDEzOiBhICAgIEFQUEVORAorICAgMTQ6IC4gICAgU1RPUAoraGlnaGVzdCBwcm90b2NvbCBhbW9uZyBvcGNvZGVzID0gMAorCis+Pj4gZGlzKHBpY2tsZS5kdW1wcyhMLCAxKSkKKyAgICAwOiBdICAgIEVNUFRZX0xJU1QKKyAgICAxOiBxICAgIEJJTlBVVCAgICAgMAorICAgIDM6ICggICAgTUFSSworICAgIDQ6IGggICAgICAgIEJJTkdFVCAgICAgMAorICAgIDY6IHQgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgMykKKyAgICA3OiBxICAgIEJJTlBVVCAgICAgMQorICAgIDk6IGEgICAgQVBQRU5ECisgICAxMDogLiAgICBTVE9QCitoaWdoZXN0IHByb3RvY29sIGFtb25nIG9wY29kZXMgPSAxCisKK05vdGUgdGhhdCwgaW4gdGhlIHByb3RvY29sIDAgcGlja2xlIG9mIHRoZSByZWN1cnNpdmUgdHVwbGUsIHRoZSBkaXNhc3NlbWJsZXIKK2hhcyB0byBlbXVsYXRlIHRoZSBzdGFjayBpbiBvcmRlciB0byByZWFsaXplIHRoYXQgdGhlIFBPUCBvcGNvZGUgYXQgMTYgZ2V0cworcmlkIG9mIHRoZSBNQVJLIGF0IDAuCisKKz4+PiBkaXMocGlja2xlLmR1bXBzKFQsIDApKQorICAgIDA6ICggICAgTUFSSworICAgIDE6ICggICAgICAgIE1BUksKKyAgICAyOiBsICAgICAgICAgICAgTElTVCAgICAgICAoTUFSSyBhdCAxKQorICAgIDM6IHAgICAgICAgIFBVVCAgICAgICAgMAorICAgIDY6ICggICAgICAgIE1BUksKKyAgICA3OiBnICAgICAgICAgICAgR0VUICAgICAgICAwCisgICAxMDogdCAgICAgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgNikKKyAgIDExOiBwICAgICAgICBQVVQgICAgICAgIDEKKyAgIDE0OiBhICAgICAgICBBUFBFTkQKKyAgIDE1OiAwICAgICAgICBQT1AKKyAgIDE2OiAwICAgICAgICBQT1AgICAgICAgIChNQVJLIGF0IDApCisgICAxNzogZyAgICBHRVQgICAgICAgIDEKKyAgIDIwOiAuICAgIFNUT1AKK2hpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDAKKworPj4+IGRpcyhwaWNrbGUuZHVtcHMoVCwgMSkpCisgICAgMDogKCAgICBNQVJLCisgICAgMTogXSAgICAgICAgRU1QVFlfTElTVAorICAgIDI6IHEgICAgICAgIEJJTlBVVCAgICAgMAorICAgIDQ6ICggICAgICAgIE1BUksKKyAgICA1OiBoICAgICAgICAgICAgQklOR0VUICAgICAwCisgICAgNzogdCAgICAgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgNCkKKyAgICA4OiBxICAgICAgICBCSU5QVVQgICAgIDEKKyAgIDEwOiBhICAgICAgICBBUFBFTkQKKyAgIDExOiAxICAgICAgICBQT1BfTUFSSyAgIChNQVJLIGF0IDApCisgICAxMjogaCAgICBCSU5HRVQgICAgIDEKKyAgIDE0OiAuICAgIFNUT1AKK2hpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDEKKworVHJ5IHByb3RvY29sIDIuCisKKz4+PiBkaXMocGlja2xlLmR1bXBzKEwsIDIpKQorICAgIDA6IFx4ODAgUFJPVE8gICAgICAyCisgICAgMjogXSAgICBFTVBUWV9MSVNUCisgICAgMzogcSAgICBCSU5QVVQgICAgIDAKKyAgICA1OiBoICAgIEJJTkdFVCAgICAgMAorICAgIDc6IFx4ODUgVFVQTEUxCisgICAgODogcSAgICBCSU5QVVQgICAgIDEKKyAgIDEwOiBhICAgIEFQUEVORAorICAgMTE6IC4gICAgU1RPUAoraGlnaGVzdCBwcm90b2NvbCBhbW9uZyBvcGNvZGVzID0gMgorCis+Pj4gZGlzKHBpY2tsZS5kdW1wcyhULCAyKSkKKyAgICAwOiBceDgwIFBST1RPICAgICAgMgorICAgIDI6IF0gICAgRU1QVFlfTElTVAorICAgIDM6IHEgICAgQklOUFVUICAgICAwCisgICAgNTogaCAgICBCSU5HRVQgICAgIDAKKyAgICA3OiBceDg1IFRVUExFMQorICAgIDg6IHEgICAgQklOUFVUICAgICAxCisgICAxMDogYSAgICBBUFBFTkQKKyAgIDExOiAwICAgIFBPUAorICAgMTI6IGggICAgQklOR0VUICAgICAxCisgICAxNDogLiAgICBTVE9QCitoaWdoZXN0IHByb3RvY29sIGFtb25nIG9wY29kZXMgPSAyCisiIiIKKworX21lbW9fdGVzdCA9IHIiIiIKKz4+PiBpbXBvcnQgcGlja2xlCis+Pj4gZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKz4+PiBmID0gU3RyaW5nSU8oKQorPj4+IHAgPSBwaWNrbGUuUGlja2xlcihmLCAyKQorPj4+IHggPSBbMSwgMiwgM10KKz4+PiBwLmR1bXAoeCkKKz4+PiBwLmR1bXAoeCkKKz4+PiBmLnNlZWsoMCkKKz4+PiBtZW1vID0ge30KKz4+PiBkaXMoZiwgbWVtbz1tZW1vKQorICAgIDA6IFx4ODAgUFJPVE8gICAgICAyCisgICAgMjogXSAgICBFTVBUWV9MSVNUCisgICAgMzogcSAgICBCSU5QVVQgICAgIDAKKyAgICA1OiAoICAgIE1BUksKKyAgICA2OiBLICAgICAgICBCSU5JTlQxICAgIDEKKyAgICA4OiBLICAgICAgICBCSU5JTlQxICAgIDIKKyAgIDEwOiBLICAgICAgICBCSU5JTlQxICAgIDMKKyAgIDEyOiBlICAgICAgICBBUFBFTkRTICAgIChNQVJLIGF0IDUpCisgICAxMzogLiAgICBTVE9QCitoaWdoZXN0IHByb3RvY29sIGFtb25nIG9wY29kZXMgPSAyCis+Pj4gZGlzKGYsIG1lbW89bWVtbykKKyAgIDE0OiBceDgwIFBST1RPICAgICAgMgorICAgMTY6IGggICAgQklOR0VUICAgICAwCisgICAxODogLiAgICBTVE9QCitoaWdoZXN0IHByb3RvY29sIGFtb25nIG9wY29kZXMgPSAyCisiIiIKKworX190ZXN0X18gPSB7J2Rpc2Fzc2VtYmxlcl90ZXN0JzogX2Rpc190ZXN0LAorICAgICAgICAgICAgJ2Rpc2Fzc2VtYmxlcl9tZW1vX3Rlc3QnOiBfbWVtb190ZXN0LAorICAgICAgICAgICB9CisKK2RlZiBfdGVzdCgpOgorICAgIGltcG9ydCBkb2N0ZXN0CisgICAgcmV0dXJuIGRvY3Rlc3QudGVzdG1vZCgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9waWNrbGV0b29scy5weWMgYi9saWIvcHl0aG9uMi43L3BpY2tsZXRvb2xzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGI1MWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9waWNrbGV0b29scy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9waWNrbGV0b29scy5weW8gYi9saWIvcHl0aG9uMi43L3BpY2tsZXRvb2xzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTkxNGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9waWNrbGV0b29scy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9waXBlcy5weSBiL2xpYi9weXRob24yLjcvcGlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3NTBmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGlwZXMucHkKQEAgLTAsMCArMSwyNzggQEAKKyIiIkNvbnZlcnNpb24gcGlwZWxpbmUgdGVtcGxhdGVzLgorCitUaGUgcHJvYmxlbToKKy0tLS0tLS0tLS0tLQorCitTdXBwb3NlIHlvdSBoYXZlIHNvbWUgZGF0YSB0aGF0IHlvdSB3YW50IHRvIGNvbnZlcnQgdG8gYW5vdGhlciBmb3JtYXQsCitzdWNoIGFzIGZyb20gR0lGIGltYWdlIGZvcm1hdCB0byBQUE0gaW1hZ2UgZm9ybWF0LiAgTWF5YmUgdGhlCitjb252ZXJzaW9uIGludm9sdmVzIHNldmVyYWwgc3RlcHMgKGUuZy4gcGlwaW5nIGl0IHRocm91Z2ggY29tcHJlc3Mgb3IKK3V1ZW5jb2RlKS4gIFNvbWUgb2YgdGhlIGNvbnZlcnNpb24gc3RlcHMgbWF5IHJlcXVpcmUgdGhhdCB0aGVpciBpbnB1dAoraXMgYSBkaXNrIGZpbGUsIG90aGVycyBtYXkgYmUgYWJsZSB0byByZWFkIHN0YW5kYXJkIGlucHV0OyBzaW1pbGFyIGZvcgordGhlaXIgb3V0cHV0LiAgVGhlIGlucHV0IHRvIHRoZSBlbnRpcmUgY29udmVyc2lvbiBtYXkgYWxzbyBiZSByZWFkCitmcm9tIGEgZGlzayBmaWxlIG9yIGZyb20gYW4gb3BlbiBmaWxlLCBhbmQgc2ltaWxhciBmb3IgaXRzIG91dHB1dC4KKworVGhlIG1vZHVsZSBsZXRzIHlvdSBjb25zdHJ1Y3QgYSBwaXBlbGluZSB0ZW1wbGF0ZSBieSBzdGlja2luZyBvbmUgb3IKK21vcmUgY29udmVyc2lvbiBzdGVwcyB0b2dldGhlci4gIEl0IHdpbGwgdGFrZSBjYXJlIG9mIGNyZWF0aW5nIGFuZAorcmVtb3ZpbmcgdGVtcG9yYXJ5IGZpbGVzIGlmIHRoZXkgYXJlIG5lY2Vzc2FyeSB0byBob2xkIGludGVybWVkaWF0ZQorZGF0YS4gIFlvdSBjYW4gdGhlbiB1c2UgdGhlIHRlbXBsYXRlIHRvIGRvIGNvbnZlcnNpb25zIGZyb20gbWFueQorZGlmZmVyZW50IHNvdXJjZXMgdG8gbWFueSBkaWZmZXJlbnQgZGVzdGluYXRpb25zLiAgVGhlIHRlbXBvcmFyeQorZmlsZSBuYW1lcyB1c2VkIGFyZSBkaWZmZXJlbnQgZWFjaCB0aW1lIHRoZSB0ZW1wbGF0ZSBpcyB1c2VkLgorCitUaGUgdGVtcGxhdGVzIGFyZSBvYmplY3RzIHNvIHlvdSBjYW4gY3JlYXRlIHRlbXBsYXRlcyBmb3IgbWFueQorZGlmZmVyZW50IGNvbnZlcnNpb24gc3RlcHMgYW5kIHN0b3JlIHRoZW0gaW4gYSBkaWN0aW9uYXJ5LCBmb3IKK2luc3RhbmNlLgorCisKK0RpcmVjdGlvbnM6CistLS0tLS0tLS0tLQorCitUbyBjcmVhdGUgYSB0ZW1wbGF0ZToKKyAgICB0ID0gVGVtcGxhdGUoKQorCitUbyBhZGQgYSBjb252ZXJzaW9uIHN0ZXAgdG8gYSB0ZW1wbGF0ZToKKyAgIHQuYXBwZW5kKGNvbW1hbmQsIGtpbmQpCit3aGVyZSBraW5kIGlzIGEgc3RyaW5nIG9mIHR3byBjaGFyYWN0ZXJzOiB0aGUgZmlyc3QgaXMgJy0nIGlmIHRoZQorY29tbWFuZCByZWFkcyBpdHMgc3RhbmRhcmQgaW5wdXQgb3IgJ2YnIGlmIGl0IHJlcXVpcmVzIGEgZmlsZTsgdGhlCitzZWNvbmQgbGlrZXdpc2UgZm9yIHRoZSBvdXRwdXQuIFRoZSBjb21tYW5kIG11c3QgYmUgdmFsaWQgL2Jpbi9zaAorc3ludGF4LiAgSWYgaW5wdXQgb3Igb3V0cHV0IGZpbGVzIGFyZSByZXF1aXJlZCwgdGhleSBhcmUgcGFzc2VkIGFzCiskSU4gYW5kICRPVVQ7IG90aGVyd2lzZSwgaXQgbXVzdCBiZSAgcG9zc2libGUgdG8gdXNlIHRoZSBjb21tYW5kIGluCithIHBpcGVsaW5lLgorCitUbyBhZGQgYSBjb252ZXJzaW9uIHN0ZXAgYXQgdGhlIGJlZ2lubmluZzoKKyAgIHQucHJlcGVuZChjb21tYW5kLCBraW5kKQorCitUbyBjb252ZXJ0IGEgZmlsZSB0byBhbm90aGVyIGZpbGUgdXNpbmcgYSB0ZW1wbGF0ZToKKyAgc3RzID0gdC5jb3B5KGluZmlsZSwgb3V0ZmlsZSkKK0lmIGluZmlsZSBvciBvdXRmaWxlIGFyZSB0aGUgZW1wdHkgc3RyaW5nLCBzdGFuZGFyZCBpbnB1dCBpcyByZWFkIG9yCitzdGFuZGFyZCBvdXRwdXQgaXMgd3JpdHRlbiwgcmVzcGVjdGl2ZWx5LiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUKK2V4aXQgc3RhdHVzIG9mIHRoZSBjb252ZXJzaW9uIHBpcGVsaW5lLgorCitUbyBvcGVuIGEgZmlsZSBmb3IgcmVhZGluZyBvciB3cml0aW5nIHRocm91Z2ggYSBjb252ZXJzaW9uIHBpcGVsaW5lOgorICAgZnAgPSB0Lm9wZW4oZmlsZSwgbW9kZSkKK3doZXJlIG1vZGUgaXMgJ3InIHRvIHJlYWQgdGhlIGZpbGUsIG9yICd3JyB0byB3cml0ZSBpdCAtLSBqdXN0IGxpa2UKK2ZvciB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gb3BlbigpIG9yIGZvciBvcy5wb3BlbigpLgorCitUbyBjcmVhdGUgYSBuZXcgdGVtcGxhdGUgb2JqZWN0IGluaXRpYWxpemVkIHRvIGEgZ2l2ZW4gb25lOgorICAgdDIgPSB0LmNsb25lKCkKKyIiIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICcKKworCitpbXBvcnQgcmUKK2ltcG9ydCBvcworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc3RyaW5nCisKK19fYWxsX18gPSBbIlRlbXBsYXRlIl0KKworIyBDb252ZXJzaW9uIHN0ZXAga2luZHMKKworRklMRUlOX0ZJTEVPVVQgPSAnZmYnICAgICAgICAgICAgICAgICAgICMgTXVzdCByZWFkICYgd3JpdGUgcmVhbCBmaWxlcworU1RESU5fRklMRU9VVCAgPSAnLWYnICAgICAgICAgICAgICAgICAgICMgTXVzdCB3cml0ZSBhIHJlYWwgZmlsZQorRklMRUlOX1NURE9VVCAgPSAnZi0nICAgICAgICAgICAgICAgICAgICMgTXVzdCByZWFkIGEgcmVhbCBmaWxlCitTVERJTl9TVERPVVQgICA9ICctLScgICAgICAgICAgICAgICAgICAgIyBOb3JtYWwgcGlwZWxpbmUgZWxlbWVudAorU09VUkNFICAgICAgICAgPSAnLi0nICAgICAgICAgICAgICAgICAgICMgTXVzdCBiZSBmaXJzdCwgd3JpdGVzIHN0ZG91dAorU0lOSyAgICAgICAgICAgPSAnLS4nICAgICAgICAgICAgICAgICAgICMgTXVzdCBiZSBsYXN0LCByZWFkcyBzdGRpbgorCitzdGVwa2luZHMgPSBbRklMRUlOX0ZJTEVPVVQsIFNURElOX0ZJTEVPVVQsIEZJTEVJTl9TVERPVVQsIFNURElOX1NURE9VVCwgXAorICAgICAgICAgICAgIFNPVVJDRSwgU0lOS10KKworCitjbGFzcyBUZW1wbGF0ZToKKyAgICAiIiJDbGFzcyByZXByZXNlbnRpbmcgYSBwaXBlbGluZSB0ZW1wbGF0ZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIiIiVGVtcGxhdGUoKSByZXR1cm5zIGEgZnJlc2ggcGlwZWxpbmUgdGVtcGxhdGUuIiIiCisgICAgICAgIHNlbGYuZGVidWdnaW5nID0gMAorICAgICAgICBzZWxmLnJlc2V0KCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIidC5fX3JlcHJfXygpIGltcGxlbWVudHMgcmVwcih0KS4iIiIKKyAgICAgICAgcmV0dXJuICc8VGVtcGxhdGUgaW5zdGFuY2UsIHN0ZXBzPSVyPicgJSAoc2VsZi5zdGVwcywpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgICIiInQucmVzZXQoKSByZXN0b3JlcyBhIHBpcGVsaW5lIHRlbXBsYXRlIHRvIGl0cyBpbml0aWFsIHN0YXRlLiIiIgorICAgICAgICBzZWxmLnN0ZXBzID0gW10KKworICAgIGRlZiBjbG9uZShzZWxmKToKKyAgICAgICAgIiIidC5jbG9uZSgpIHJldHVybnMgYSBuZXcgcGlwZWxpbmUgdGVtcGxhdGUgd2l0aCBpZGVudGljYWwKKyAgICAgICAgaW5pdGlhbCBzdGF0ZSBhcyB0aGUgY3VycmVudCBvbmUuIiIiCisgICAgICAgIHQgPSBUZW1wbGF0ZSgpCisgICAgICAgIHQuc3RlcHMgPSBzZWxmLnN0ZXBzWzpdCisgICAgICAgIHQuZGVidWdnaW5nID0gc2VsZi5kZWJ1Z2dpbmcKKyAgICAgICAgcmV0dXJuIHQKKworICAgIGRlZiBkZWJ1ZyhzZWxmLCBmbGFnKToKKyAgICAgICAgIiIidC5kZWJ1ZyhmbGFnKSB0dXJucyBkZWJ1Z2dpbmcgb24gb3Igb2ZmLiIiIgorICAgICAgICBzZWxmLmRlYnVnZ2luZyA9IGZsYWcKKworICAgIGRlZiBhcHBlbmQoc2VsZiwgY21kLCBraW5kKToKKyAgICAgICAgIiIidC5hcHBlbmQoY21kLCBraW5kKSBhZGRzIGEgbmV3IHN0ZXAgYXQgdGhlIGVuZC4iIiIKKyAgICAgICAgaWYgdHlwZShjbWQpIGlzIG5vdCB0eXBlKCcnKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlLmFwcGVuZDogY21kIG11c3QgYmUgYSBzdHJpbmcnCisgICAgICAgIGlmIGtpbmQgbm90IGluIHN0ZXBraW5kczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICdUZW1wbGF0ZS5hcHBlbmQ6IGJhZCBraW5kICVyJyAlIChraW5kLCkKKyAgICAgICAgaWYga2luZCA9PSBTT1VSQ0U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAnVGVtcGxhdGUuYXBwZW5kOiBTT1VSQ0UgY2FuIG9ubHkgYmUgcHJlcGVuZGVkJworICAgICAgICBpZiBzZWxmLnN0ZXBzIGFuZCBzZWxmLnN0ZXBzWy0xXVsxXSA9PSBTSU5LOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlLmFwcGVuZDogYWxyZWFkeSBlbmRzIHdpdGggU0lOSycKKyAgICAgICAgaWYga2luZFswXSA9PSAnZicgYW5kIG5vdCByZS5zZWFyY2gocidcJElOXGInLCBjbWQpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlLmFwcGVuZDogbWlzc2luZyAkSU4gaW4gY21kJworICAgICAgICBpZiBraW5kWzFdID09ICdmJyBhbmQgbm90IHJlLnNlYXJjaChyJ1wkT1VUXGInLCBjbWQpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlLmFwcGVuZDogbWlzc2luZyAkT1VUIGluIGNtZCcKKyAgICAgICAgc2VsZi5zdGVwcy5hcHBlbmQoKGNtZCwga2luZCkpCisKKyAgICBkZWYgcHJlcGVuZChzZWxmLCBjbWQsIGtpbmQpOgorICAgICAgICAiIiJ0LnByZXBlbmQoY21kLCBraW5kKSBhZGRzIGEgbmV3IHN0ZXAgYXQgdGhlIGZyb250LiIiIgorICAgICAgICBpZiB0eXBlKGNtZCkgaXMgbm90IHR5cGUoJycpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAnVGVtcGxhdGUucHJlcGVuZDogY21kIG11c3QgYmUgYSBzdHJpbmcnCisgICAgICAgIGlmIGtpbmQgbm90IGluIHN0ZXBraW5kczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICdUZW1wbGF0ZS5wcmVwZW5kOiBiYWQga2luZCAlcicgJSAoa2luZCwpCisgICAgICAgIGlmIGtpbmQgPT0gU0lOSzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICdUZW1wbGF0ZS5wcmVwZW5kOiBTSU5LIGNhbiBvbmx5IGJlIGFwcGVuZGVkJworICAgICAgICBpZiBzZWxmLnN0ZXBzIGFuZCBzZWxmLnN0ZXBzWzBdWzFdID09IFNPVVJDRToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICdUZW1wbGF0ZS5wcmVwZW5kOiBhbHJlYWR5IGJlZ2lucyB3aXRoIFNPVVJDRScKKyAgICAgICAgaWYga2luZFswXSA9PSAnZicgYW5kIG5vdCByZS5zZWFyY2gocidcJElOXGInLCBjbWQpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlLnByZXBlbmQ6IG1pc3NpbmcgJElOIGluIGNtZCcKKyAgICAgICAgaWYga2luZFsxXSA9PSAnZicgYW5kIG5vdCByZS5zZWFyY2gocidcJE9VVFxiJywgY21kKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICdUZW1wbGF0ZS5wcmVwZW5kOiBtaXNzaW5nICRPVVQgaW4gY21kJworICAgICAgICBzZWxmLnN0ZXBzLmluc2VydCgwLCAoY21kLCBraW5kKSkKKworICAgIGRlZiBvcGVuKHNlbGYsIGZpbGUsIHJ3KToKKyAgICAgICAgIiIidC5vcGVuKGZpbGUsIHJ3KSByZXR1cm5zIGEgcGlwZSBvciBmaWxlIG9iamVjdCBvcGVuIGZvcgorICAgICAgICByZWFkaW5nIG9yIHdyaXRpbmc7IHRoZSBmaWxlIGlzIHRoZSBvdGhlciBlbmQgb2YgdGhlIHBpcGVsaW5lLiIiIgorICAgICAgICBpZiBydyA9PSAncic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGVuX3IoZmlsZSkKKyAgICAgICAgaWYgcncgPT0gJ3cnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYub3Blbl93KGZpbGUpCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgJ1RlbXBsYXRlLm9wZW46IHJ3IG11c3QgYmUgXCdyXCcgb3IgXCd3XCcsIG5vdCAlcicgJSAocncsKQorCisgICAgZGVmIG9wZW5fcihzZWxmLCBmaWxlKToKKyAgICAgICAgIiIidC5vcGVuX3IoZmlsZSkgYW5kIHQub3Blbl93KGZpbGUpIGltcGxlbWVudAorICAgICAgICB0Lm9wZW4oZmlsZSwgJ3InKSBhbmQgdC5vcGVuKGZpbGUsICd3JykgcmVzcGVjdGl2ZWx5LiIiIgorICAgICAgICBpZiBub3Qgc2VsZi5zdGVwczoKKyAgICAgICAgICAgIHJldHVybiBvcGVuKGZpbGUsICdyJykKKyAgICAgICAgaWYgc2VsZi5zdGVwc1stMV1bMV0gPT0gU0lOSzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICdUZW1wbGF0ZS5vcGVuX3I6IHBpcGVsaW5lIGVuZHMgd2lkdGggU0lOSycKKyAgICAgICAgY21kID0gc2VsZi5tYWtlcGlwZWxpbmUoZmlsZSwgJycpCisgICAgICAgIHJldHVybiBvcy5wb3BlbihjbWQsICdyJykKKworICAgIGRlZiBvcGVuX3coc2VsZiwgZmlsZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLnN0ZXBzOgorICAgICAgICAgICAgcmV0dXJuIG9wZW4oZmlsZSwgJ3cnKQorICAgICAgICBpZiBzZWxmLnN0ZXBzWzBdWzFdID09IFNPVVJDRToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICdUZW1wbGF0ZS5vcGVuX3c6IHBpcGVsaW5lIGJlZ2lucyB3aXRoIFNPVVJDRScKKyAgICAgICAgY21kID0gc2VsZi5tYWtlcGlwZWxpbmUoJycsIGZpbGUpCisgICAgICAgIHJldHVybiBvcy5wb3BlbihjbWQsICd3JykKKworICAgIGRlZiBjb3B5KHNlbGYsIGluZmlsZSwgb3V0ZmlsZSk6CisgICAgICAgIHJldHVybiBvcy5zeXN0ZW0oc2VsZi5tYWtlcGlwZWxpbmUoaW5maWxlLCBvdXRmaWxlKSkKKworICAgIGRlZiBtYWtlcGlwZWxpbmUoc2VsZiwgaW5maWxlLCBvdXRmaWxlKToKKyAgICAgICAgY21kID0gbWFrZXBpcGVsaW5lKGluZmlsZSwgc2VsZi5zdGVwcywgb3V0ZmlsZSkKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2dpbmc6CisgICAgICAgICAgICBwcmludCBjbWQKKyAgICAgICAgICAgIGNtZCA9ICdzZXQgLXg7ICcgKyBjbWQKKyAgICAgICAgcmV0dXJuIGNtZAorCisKK2RlZiBtYWtlcGlwZWxpbmUoaW5maWxlLCBzdGVwcywgb3V0ZmlsZSk6CisgICAgIyBCdWlsZCBhIGxpc3Qgd2l0aCBmb3IgZWFjaCBjb21tYW5kOgorICAgICMgW2lucHV0IGZpbGVuYW1lIG9yICcnLCBjb21tYW5kIHN0cmluZywga2luZCwgb3V0cHV0IGZpbGVuYW1lIG9yICcnXQorCisgICAgbGlzdCA9IFtdCisgICAgZm9yIGNtZCwga2luZCBpbiBzdGVwczoKKyAgICAgICAgbGlzdC5hcHBlbmQoWycnLCBjbWQsIGtpbmQsICcnXSkKKyAgICAjCisgICAgIyBNYWtlIHN1cmUgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHN0ZXAKKyAgICAjCisgICAgaWYgbm90IGxpc3Q6CisgICAgICAgIGxpc3QuYXBwZW5kKFsnJywgJ2NhdCcsICctLScsICcnXSkKKyAgICAjCisgICAgIyBUYWtlIGNhcmUgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZW5kcworICAgICMKKyAgICBbY21kLCBraW5kXSA9IGxpc3RbMF1bMTozXQorICAgIGlmIGtpbmRbMF0gPT0gJ2YnIGFuZCBub3QgaW5maWxlOgorICAgICAgICBsaXN0Lmluc2VydCgwLCBbJycsICdjYXQnLCAnLS0nLCAnJ10pCisgICAgbGlzdFswXVswXSA9IGluZmlsZQorICAgICMKKyAgICBbY21kLCBraW5kXSA9IGxpc3RbLTFdWzE6M10KKyAgICBpZiBraW5kWzFdID09ICdmJyBhbmQgbm90IG91dGZpbGU6CisgICAgICAgIGxpc3QuYXBwZW5kKFsnJywgJ2NhdCcsICctLScsICcnXSkKKyAgICBsaXN0Wy0xXVstMV0gPSBvdXRmaWxlCisgICAgIworICAgICMgSW52ZW50IHRlbXBvcmFyeSBmaWxlcyB0byBjb25uZWN0IHN0YWdlcyB0aGF0IG5lZWQgZmlsZXMKKyAgICAjCisgICAgZ2FyYmFnZSA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKGxpc3QpKToKKyAgICAgICAgbGtpbmQgPSBsaXN0W2ktMV1bMl0KKyAgICAgICAgcmtpbmQgPSBsaXN0W2ldWzJdCisgICAgICAgIGlmIGxraW5kWzFdID09ICdmJyBvciBya2luZFswXSA9PSAnZic6CisgICAgICAgICAgICAoZmQsIHRlbXApID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgICAgIGdhcmJhZ2UuYXBwZW5kKHRlbXApCisgICAgICAgICAgICBsaXN0W2ktMV1bLTFdID0gbGlzdFtpXVswXSA9IHRlbXAKKyAgICAjCisgICAgZm9yIGl0ZW0gaW4gbGlzdDoKKyAgICAgICAgW2luZiwgY21kLCBraW5kLCBvdXRmXSA9IGl0ZW0KKyAgICAgICAgaWYga2luZFsxXSA9PSAnZic6CisgICAgICAgICAgICBjbWQgPSAnT1VUPScgKyBxdW90ZShvdXRmKSArICc7ICcgKyBjbWQKKyAgICAgICAgaWYga2luZFswXSA9PSAnZic6CisgICAgICAgICAgICBjbWQgPSAnSU49JyArIHF1b3RlKGluZikgKyAnOyAnICsgY21kCisgICAgICAgIGlmIGtpbmRbMF0gPT0gJy0nIGFuZCBpbmY6CisgICAgICAgICAgICBjbWQgPSBjbWQgKyAnIDwnICsgcXVvdGUoaW5mKQorICAgICAgICBpZiBraW5kWzFdID09ICctJyBhbmQgb3V0ZjoKKyAgICAgICAgICAgIGNtZCA9IGNtZCArICcgPicgKyBxdW90ZShvdXRmKQorICAgICAgICBpdGVtWzFdID0gY21kCisgICAgIworICAgIGNtZGxpc3QgPSBsaXN0WzBdWzFdCisgICAgZm9yIGl0ZW0gaW4gbGlzdFsxOl06CisgICAgICAgIFtjbWQsIGtpbmRdID0gaXRlbVsxOjNdCisgICAgICAgIGlmIGl0ZW1bMF0gPT0gJyc6CisgICAgICAgICAgICBpZiAnZicgaW4ga2luZDoKKyAgICAgICAgICAgICAgICBjbWQgPSAneyAnICsgY21kICsgJzsgfScKKyAgICAgICAgICAgIGNtZGxpc3QgPSBjbWRsaXN0ICsgJyB8XG4nICsgY21kCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbWRsaXN0ID0gY21kbGlzdCArICdcbicgKyBjbWQKKyAgICAjCisgICAgaWYgZ2FyYmFnZToKKyAgICAgICAgcm1jbWQgPSAncm0gLWYnCisgICAgICAgIGZvciBmaWxlIGluIGdhcmJhZ2U6CisgICAgICAgICAgICBybWNtZCA9IHJtY21kICsgJyAnICsgcXVvdGUoZmlsZSkKKyAgICAgICAgdHJhcGNtZCA9ICd0cmFwICcgKyBxdW90ZShybWNtZCArICc7IGV4aXQnKSArICcgMSAyIDMgMTMgMTQgMTUnCisgICAgICAgIGNtZGxpc3QgPSB0cmFwY21kICsgJ1xuJyArIGNtZGxpc3QgKyAnXG4nICsgcm1jbWQKKyAgICAjCisgICAgcmV0dXJuIGNtZGxpc3QKKworCisjIFJlbGlhYmx5IHF1b3RlIGEgc3RyaW5nIGFzIGEgc2luZ2xlIGFyZ3VtZW50IGZvciAvYmluL3NoCisKKyMgU2FmZSB1bnF1b3RlZAorX3NhZmVjaGFycyA9IGZyb3plbnNldChzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAnQCVfLSs9OiwuLycpCisKK2RlZiBxdW90ZShmaWxlKToKKyAgICAiIiJSZXR1cm4gYSBzaGVsbC1lc2NhcGVkIHZlcnNpb24gb2YgdGhlIGZpbGUgc3RyaW5nLiIiIgorICAgIGZvciBjIGluIGZpbGU6CisgICAgICAgIGlmIGMgbm90IGluIF9zYWZlY2hhcnM6CisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIGlmIG5vdCBmaWxlOgorICAgICAgICAgICAgcmV0dXJuICInJyIKKyAgICAgICAgcmV0dXJuIGZpbGUKKyAgICAjIHVzZSBzaW5nbGUgcXVvdGVzLCBhbmQgcHV0IHNpbmdsZSBxdW90ZXMgaW50byBkb3VibGUgcXVvdGVzCisgICAgIyB0aGUgc3RyaW5nICQnYiBpcyB0aGVuIHF1b3RlZCBhcyAnJCciJyInYicKKyAgICByZXR1cm4gIiciICsgZmlsZS5yZXBsYWNlKCInIiwgIidcIidcIiciKSArICInIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9waXBlcy5weWMgYi9saWIvcHl0aG9uMi43L3BpcGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmIxMzYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9waXBlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9waXBlcy5weW8gYi9saWIvcHl0aG9uMi43L3BpcGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmIxMzYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9waXBlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wa2d1dGlsLnB5IGIvbGliL3B5dGhvbjIuNy9wa2d1dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDcyZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BrZ3V0aWwucHkKQEAgLTAsMCArMSw1OTEgQEAKKyIiIlV0aWxpdGllcyB0byBzdXBwb3J0IHBhY2thZ2VzLiIiIgorCisjIE5PVEU6IFRoaXMgbW9kdWxlIG11c3QgcmVtYWluIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBhcyBpdCBpcyBzaGFyZWQKKyMgYnkgc2V0dXB0b29scyBmb3IgZGlzdHJpYnV0aW9uIHdpdGggUHl0aG9uIDIuMyBhbmQgdXAuCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGltcAoraW1wb3J0IG9zLnBhdGgKK2Zyb20gdHlwZXMgaW1wb3J0IE1vZHVsZVR5cGUKKworX19hbGxfXyA9IFsKKyAgICAnZ2V0X2ltcG9ydGVyJywgJ2l0ZXJfaW1wb3J0ZXJzJywgJ2dldF9sb2FkZXInLCAnZmluZF9sb2FkZXInLAorICAgICd3YWxrX3BhY2thZ2VzJywgJ2l0ZXJfbW9kdWxlcycsICdnZXRfZGF0YScsCisgICAgJ0ltcEltcG9ydGVyJywgJ0ltcExvYWRlcicsICdyZWFkX2NvZGUnLCAnZXh0ZW5kX3BhdGgnLAorXQorCitkZWYgcmVhZF9jb2RlKHN0cmVhbSk6CisgICAgIyBUaGlzIGhlbHBlciBpcyBuZWVkZWQgaW4gb3JkZXIgZm9yIHRoZSBQRVAgMzAyIGVtdWxhdGlvbiB0bworICAgICMgY29ycmVjdGx5IGhhbmRsZSBjb21waWxlZCBmaWxlcworICAgIGltcG9ydCBtYXJzaGFsCisKKyAgICBtYWdpYyA9IHN0cmVhbS5yZWFkKDQpCisgICAgaWYgbWFnaWMgIT0gaW1wLmdldF9tYWdpYygpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgc3RyZWFtLnJlYWQoNCkgIyBTa2lwIHRpbWVzdGFtcAorICAgIHJldHVybiBtYXJzaGFsLmxvYWQoc3RyZWFtKQorCisKK2RlZiBzaW1wbGVnZW5lcmljKGZ1bmMpOgorICAgICIiIk1ha2UgYSB0cml2aWFsIHNpbmdsZS1kaXNwYXRjaCBnZW5lcmljIGZ1bmN0aW9uIiIiCisgICAgcmVnaXN0cnkgPSB7fQorICAgIGRlZiB3cmFwcGVyKCphcmdzLCAqKmt3KToKKyAgICAgICAgb2IgPSBhcmdzWzBdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNscyA9IG9iLl9fY2xhc3NfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBjbHMgPSB0eXBlKG9iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtcm8gPSBjbHMuX19tcm9fXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xhc3MgY2xzKGNscywgb2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIG1ybyA9IGNscy5fX21yb19fWzE6XQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBtcm8gPSBvYmplY3QsICAgIyBtdXN0IGJlIGFuIEV4dGVuc2lvbkNsYXNzIG9yIHNvbWUgc3VjaCAgOigKKyAgICAgICAgZm9yIHQgaW4gbXJvOgorICAgICAgICAgICAgaWYgdCBpbiByZWdpc3RyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVnaXN0cnlbdF0oKmFyZ3MsICoqa3cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprdykKKyAgICB0cnk6CisgICAgICAgIHdyYXBwZXIuX19uYW1lX18gPSBmdW5jLl9fbmFtZV9fCisgICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgcGFzcyAgICAjIFB5dGhvbiAyLjMgZG9lc24ndCBhbGxvdyBmdW5jdGlvbnMgdG8gYmUgcmVuYW1lZAorCisgICAgZGVmIHJlZ2lzdGVyKHR5cCwgZnVuYz1Ob25lKToKKyAgICAgICAgaWYgZnVuYyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSBmOiByZWdpc3Rlcih0eXAsIGYpCisgICAgICAgIHJlZ2lzdHJ5W3R5cF0gPSBmdW5jCisgICAgICAgIHJldHVybiBmdW5jCisKKyAgICB3cmFwcGVyLl9fZGljdF9fID0gZnVuYy5fX2RpY3RfXworICAgIHdyYXBwZXIuX19kb2NfXyA9IGZ1bmMuX19kb2NfXworICAgIHdyYXBwZXIucmVnaXN0ZXIgPSByZWdpc3RlcgorICAgIHJldHVybiB3cmFwcGVyCisKKworZGVmIHdhbGtfcGFja2FnZXMocGF0aD1Ob25lLCBwcmVmaXg9JycsIG9uZXJyb3I9Tm9uZSk6CisgICAgIiIiWWllbGRzIChtb2R1bGVfbG9hZGVyLCBuYW1lLCBpc3BrZykgZm9yIGFsbCBtb2R1bGVzIHJlY3Vyc2l2ZWx5CisgICAgb24gcGF0aCwgb3IsIGlmIHBhdGggaXMgTm9uZSwgYWxsIGFjY2Vzc2libGUgbW9kdWxlcy4KKworICAgICdwYXRoJyBzaG91bGQgYmUgZWl0aGVyIE5vbmUgb3IgYSBsaXN0IG9mIHBhdGhzIHRvIGxvb2sgZm9yCisgICAgbW9kdWxlcyBpbi4KKworICAgICdwcmVmaXgnIGlzIGEgc3RyaW5nIHRvIG91dHB1dCBvbiB0aGUgZnJvbnQgb2YgZXZlcnkgbW9kdWxlIG5hbWUKKyAgICBvbiBvdXRwdXQuCisKKyAgICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtdXN0IGltcG9ydCBhbGwgKnBhY2thZ2VzKiAoTk9UIGFsbAorICAgIG1vZHVsZXMhKSBvbiB0aGUgZ2l2ZW4gcGF0aCwgaW4gb3JkZXIgdG8gYWNjZXNzIHRoZSBfX3BhdGhfXworICAgIGF0dHJpYnV0ZSB0byBmaW5kIHN1Ym1vZHVsZXMuCisKKyAgICAnb25lcnJvcicgaXMgYSBmdW5jdGlvbiB3aGljaCBnZXRzIGNhbGxlZCB3aXRoIG9uZSBhcmd1bWVudCAodGhlCisgICAgbmFtZSBvZiB0aGUgcGFja2FnZSB3aGljaCB3YXMgYmVpbmcgaW1wb3J0ZWQpIGlmIGFueSBleGNlcHRpb24KKyAgICBvY2N1cnMgd2hpbGUgdHJ5aW5nIHRvIGltcG9ydCBhIHBhY2thZ2UuICBJZiBubyBvbmVycm9yIGZ1bmN0aW9uIGlzCisgICAgc3VwcGxpZWQsIEltcG9ydEVycm9ycyBhcmUgY2F1Z2h0IGFuZCBpZ25vcmVkLCB3aGlsZSBhbGwgb3RoZXIKKyAgICBleGNlcHRpb25zIGFyZSBwcm9wYWdhdGVkLCB0ZXJtaW5hdGluZyB0aGUgc2VhcmNoLgorCisgICAgRXhhbXBsZXM6CisKKyAgICAjIGxpc3QgYWxsIG1vZHVsZXMgcHl0aG9uIGNhbiBhY2Nlc3MKKyAgICB3YWxrX3BhY2thZ2VzKCkKKworICAgICMgbGlzdCBhbGwgc3VibW9kdWxlcyBvZiBjdHlwZXMKKyAgICB3YWxrX3BhY2thZ2VzKGN0eXBlcy5fX3BhdGhfXywgY3R5cGVzLl9fbmFtZV9fKycuJykKKyAgICAiIiIKKworICAgIGRlZiBzZWVuKHAsIG09e30pOgorICAgICAgICBpZiBwIGluIG06CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBtW3BdID0gVHJ1ZQorCisgICAgZm9yIGltcG9ydGVyLCBuYW1lLCBpc3BrZyBpbiBpdGVyX21vZHVsZXMocGF0aCwgcHJlZml4KToKKyAgICAgICAgeWllbGQgaW1wb3J0ZXIsIG5hbWUsIGlzcGtnCisKKyAgICAgICAgaWYgaXNwa2c6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX19pbXBvcnRfXyhuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIGlmIG9uZXJyb3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG9uZXJyb3IobmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgaWYgb25lcnJvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgb25lcnJvcihuYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhdGggPSBnZXRhdHRyKHN5cy5tb2R1bGVzW25hbWVdLCAnX19wYXRoX18nLCBOb25lKSBvciBbXQorCisgICAgICAgICAgICAgICAgIyBkb24ndCB0cmF2ZXJzZSBwYXRoIGl0ZW1zIHdlJ3ZlIHNlZW4gYmVmb3JlCisgICAgICAgICAgICAgICAgcGF0aCA9IFtwIGZvciBwIGluIHBhdGggaWYgbm90IHNlZW4ocCldCisKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB3YWxrX3BhY2thZ2VzKHBhdGgsIG5hbWUrJy4nLCBvbmVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgaXRlbQorCisKK2RlZiBpdGVyX21vZHVsZXMocGF0aD1Ob25lLCBwcmVmaXg9JycpOgorICAgICIiIllpZWxkcyAobW9kdWxlX2xvYWRlciwgbmFtZSwgaXNwa2cpIGZvciBhbGwgc3VibW9kdWxlcyBvbiBwYXRoLAorICAgIG9yLCBpZiBwYXRoIGlzIE5vbmUsIGFsbCB0b3AtbGV2ZWwgbW9kdWxlcyBvbiBzeXMucGF0aC4KKworICAgICdwYXRoJyBzaG91bGQgYmUgZWl0aGVyIE5vbmUgb3IgYSBsaXN0IG9mIHBhdGhzIHRvIGxvb2sgZm9yCisgICAgbW9kdWxlcyBpbi4KKworICAgICdwcmVmaXgnIGlzIGEgc3RyaW5nIHRvIG91dHB1dCBvbiB0aGUgZnJvbnQgb2YgZXZlcnkgbW9kdWxlIG5hbWUKKyAgICBvbiBvdXRwdXQuCisgICAgIiIiCisKKyAgICBpZiBwYXRoIGlzIE5vbmU6CisgICAgICAgIGltcG9ydGVycyA9IGl0ZXJfaW1wb3J0ZXJzKCkKKyAgICBlbHNlOgorICAgICAgICBpbXBvcnRlcnMgPSBtYXAoZ2V0X2ltcG9ydGVyLCBwYXRoKQorCisgICAgeWllbGRlZCA9IHt9CisgICAgZm9yIGkgaW4gaW1wb3J0ZXJzOgorICAgICAgICBmb3IgbmFtZSwgaXNwa2cgaW4gaXRlcl9pbXBvcnRlcl9tb2R1bGVzKGksIHByZWZpeCk6CisgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiB5aWVsZGVkOgorICAgICAgICAgICAgICAgIHlpZWxkZWRbbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgeWllbGQgaSwgbmFtZSwgaXNwa2cKKworCisjQHNpbXBsZWdlbmVyaWMKK2RlZiBpdGVyX2ltcG9ydGVyX21vZHVsZXMoaW1wb3J0ZXIsIHByZWZpeD0nJyk6CisgICAgaWYgbm90IGhhc2F0dHIoaW1wb3J0ZXIsICdpdGVyX21vZHVsZXMnKToKKyAgICAgICAgcmV0dXJuIFtdCisgICAgcmV0dXJuIGltcG9ydGVyLml0ZXJfbW9kdWxlcyhwcmVmaXgpCisKK2l0ZXJfaW1wb3J0ZXJfbW9kdWxlcyA9IHNpbXBsZWdlbmVyaWMoaXRlcl9pbXBvcnRlcl9tb2R1bGVzKQorCisKK2NsYXNzIEltcEltcG9ydGVyOgorICAgICIiIlBFUCAzMDIgSW1wb3J0ZXIgdGhhdCB3cmFwcyBQeXRob24ncyAiY2xhc3NpYyIgaW1wb3J0IGFsZ29yaXRobQorCisgICAgSW1wSW1wb3J0ZXIoZGlybmFtZSkgcHJvZHVjZXMgYSBQRVAgMzAyIGltcG9ydGVyIHRoYXQgc2VhcmNoZXMgdGhhdAorICAgIGRpcmVjdG9yeS4gIEltcEltcG9ydGVyKE5vbmUpIHByb2R1Y2VzIGEgUEVQIDMwMiBpbXBvcnRlciB0aGF0IHNlYXJjaGVzCisgICAgdGhlIGN1cnJlbnQgc3lzLnBhdGgsIHBsdXMgYW55IG1vZHVsZXMgdGhhdCBhcmUgZnJvemVuIG9yIGJ1aWx0LWluLgorCisgICAgTm90ZSB0aGF0IEltcEltcG9ydGVyIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IGJlaW5nIHVzZWQgYnkgcGxhY2VtZW50CisgICAgb24gc3lzLm1ldGFfcGF0aC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPU5vbmUpOgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisKKyAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CisgICAgICAgICMgTm90ZTogd2UgaWdub3JlICdwYXRoJyBhcmd1bWVudCBzaW5jZSBpdCBpcyBvbmx5IHVzZWQgdmlhIG1ldGFfcGF0aAorICAgICAgICBzdWJuYW1lID0gZnVsbG5hbWUuc3BsaXQoIi4iKVstMV0KKyAgICAgICAgaWYgc3VibmFtZSAhPSBmdWxsbmFtZSBhbmQgc2VsZi5wYXRoIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBzZWxmLnBhdGggaXMgTm9uZToKKyAgICAgICAgICAgIHBhdGggPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gW29zLnBhdGgucmVhbHBhdGgoc2VsZi5wYXRoKV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSwgZmlsZW5hbWUsIGV0YyA9IGltcC5maW5kX21vZHVsZShzdWJuYW1lLCBwYXRoKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gSW1wTG9hZGVyKGZ1bGxuYW1lLCBmaWxlLCBmaWxlbmFtZSwgZXRjKQorCisgICAgZGVmIGl0ZXJfbW9kdWxlcyhzZWxmLCBwcmVmaXg9JycpOgorICAgICAgICBpZiBzZWxmLnBhdGggaXMgTm9uZSBvciBub3Qgb3MucGF0aC5pc2RpcihzZWxmLnBhdGgpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgeWllbGRlZCA9IHt9CisgICAgICAgIGltcG9ydCBpbnNwZWN0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGVuYW1lcyA9IG9zLmxpc3RkaXIoc2VsZi5wYXRoKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICMgaWdub3JlIHVucmVhZGFibGUgZGlyZWN0b3JpZXMgbGlrZSBpbXBvcnQgZG9lcworICAgICAgICAgICAgZmlsZW5hbWVzID0gW10KKyAgICAgICAgZmlsZW5hbWVzLnNvcnQoKSAgIyBoYW5kbGUgcGFja2FnZXMgYmVmb3JlIHNhbWUtbmFtZWQgbW9kdWxlcworCisgICAgICAgIGZvciBmbiBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICBtb2RuYW1lID0gaW5zcGVjdC5nZXRtb2R1bGVuYW1lKGZuKQorICAgICAgICAgICAgaWYgbW9kbmFtZT09J19faW5pdF9fJyBvciBtb2RuYW1lIGluIHlpZWxkZWQ6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsIGZuKQorICAgICAgICAgICAgaXNwa2cgPSBGYWxzZQorCisgICAgICAgICAgICBpZiBub3QgbW9kbmFtZSBhbmQgb3MucGF0aC5pc2RpcihwYXRoKSBhbmQgJy4nIG5vdCBpbiBmbjoKKyAgICAgICAgICAgICAgICBtb2RuYW1lID0gZm4KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRpcmNvbnRlbnRzID0gb3MubGlzdGRpcihwYXRoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSB1bnJlYWRhYmxlIGRpcmVjdG9yaWVzIGxpa2UgaW1wb3J0IGRvZXMKKyAgICAgICAgICAgICAgICAgICAgZGlyY29udGVudHMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBmbiBpbiBkaXJjb250ZW50czoKKyAgICAgICAgICAgICAgICAgICAgc3VibmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShmbikKKyAgICAgICAgICAgICAgICAgICAgaWYgc3VibmFtZT09J19faW5pdF9fJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzcGtnID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIG5vdCBhIHBhY2thZ2UKKworICAgICAgICAgICAgaWYgbW9kbmFtZSBhbmQgJy4nIG5vdCBpbiBtb2RuYW1lOgorICAgICAgICAgICAgICAgIHlpZWxkZWRbbW9kbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgeWllbGQgcHJlZml4ICsgbW9kbmFtZSwgaXNwa2cKKworCitjbGFzcyBJbXBMb2FkZXI6CisgICAgIiIiUEVQIDMwMiBMb2FkZXIgdGhhdCB3cmFwcyBQeXRob24ncyAiY2xhc3NpYyIgaW1wb3J0IGFsZ29yaXRobQorICAgICIiIgorICAgIGNvZGUgPSBzb3VyY2UgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnVsbG5hbWUsIGZpbGUsIGZpbGVuYW1lLCBldGMpOgorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmZ1bGxuYW1lID0gZnVsbG5hbWUKKyAgICAgICAgc2VsZi5ldGMgPSBldGMKKworICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgIHNlbGYuX3Jlb3BlbigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1vZCA9IGltcC5sb2FkX21vZHVsZShmdWxsbmFtZSwgc2VsZi5maWxlLCBzZWxmLmZpbGVuYW1lLCBzZWxmLmV0YykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHNlbGYuZmlsZToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQorICAgICAgICAjIE5vdGU6IHdlIGRvbid0IHNldCBfX2xvYWRlcl9fIGJlY2F1c2Ugd2Ugd2FudCB0aGUgbW9kdWxlIHRvIGxvb2sKKyAgICAgICAgIyBub3JtYWw7IGkuZS4gdGhpcyBpcyBqdXN0IGEgd3JhcHBlciBmb3Igc3RhbmRhcmQgaW1wb3J0IG1hY2hpbmVyeQorICAgICAgICByZXR1cm4gbW9kCisKKyAgICBkZWYgZ2V0X2RhdGEoc2VsZiwgcGF0aG5hbWUpOgorICAgICAgICByZXR1cm4gb3BlbihwYXRobmFtZSwgInJiIikucmVhZCgpCisKKyAgICBkZWYgX3Jlb3BlbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5maWxlIGFuZCBzZWxmLmZpbGUuY2xvc2VkOgorICAgICAgICAgICAgbW9kX3R5cGUgPSBzZWxmLmV0Y1syXQorICAgICAgICAgICAgaWYgbW9kX3R5cGU9PWltcC5QWV9TT1VSQ0U6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlID0gb3BlbihzZWxmLmZpbGVuYW1lLCAnclUnKQorICAgICAgICAgICAgZWxpZiBtb2RfdHlwZSBpbiAoaW1wLlBZX0NPTVBJTEVELCBpbXAuQ19FWFRFTlNJT04pOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZSA9IG9wZW4oc2VsZi5maWxlbmFtZSwgJ3JiJykKKworICAgIGRlZiBfZml4X25hbWUoc2VsZiwgZnVsbG5hbWUpOgorICAgICAgICBpZiBmdWxsbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmZ1bGxuYW1lCisgICAgICAgIGVsaWYgZnVsbG5hbWUgIT0gc2VsZi5mdWxsbmFtZToKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJMb2FkZXIgZm9yIG1vZHVsZSAlcyBjYW5ub3QgaGFuZGxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgJXMiICUgKHNlbGYuZnVsbG5hbWUsIGZ1bGxuYW1lKSkKKyAgICAgICAgcmV0dXJuIGZ1bGxuYW1lCisKKyAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5fZml4X25hbWUoZnVsbG5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLmV0Y1syXT09aW1wLlBLR19ESVJFQ1RPUlkKKworICAgIGRlZiBnZXRfY29kZShzZWxmLCBmdWxsbmFtZT1Ob25lKToKKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLl9maXhfbmFtZShmdWxsbmFtZSkKKyAgICAgICAgaWYgc2VsZi5jb2RlIGlzIE5vbmU6CisgICAgICAgICAgICBtb2RfdHlwZSA9IHNlbGYuZXRjWzJdCisgICAgICAgICAgICBpZiBtb2RfdHlwZT09aW1wLlBZX1NPVVJDRToKKyAgICAgICAgICAgICAgICBzb3VyY2UgPSBzZWxmLmdldF9zb3VyY2UoZnVsbG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5jb2RlID0gY29tcGlsZShzb3VyY2UsIHNlbGYuZmlsZW5hbWUsICdleGVjJykKKyAgICAgICAgICAgIGVsaWYgbW9kX3R5cGU9PWltcC5QWV9DT01QSUxFRDoKKyAgICAgICAgICAgICAgICBzZWxmLl9yZW9wZW4oKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb2RlID0gcmVhZF9jb2RlKHNlbGYuZmlsZSkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQorICAgICAgICAgICAgZWxpZiBtb2RfdHlwZT09aW1wLlBLR19ESVJFQ1RPUlk6CisgICAgICAgICAgICAgICAgc2VsZi5jb2RlID0gc2VsZi5fZ2V0X2RlbGVnYXRlKCkuZ2V0X2NvZGUoKQorICAgICAgICByZXR1cm4gc2VsZi5jb2RlCisKKyAgICBkZWYgZ2V0X3NvdXJjZShzZWxmLCBmdWxsbmFtZT1Ob25lKToKKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLl9maXhfbmFtZShmdWxsbmFtZSkKKyAgICAgICAgaWYgc2VsZi5zb3VyY2UgaXMgTm9uZToKKyAgICAgICAgICAgIG1vZF90eXBlID0gc2VsZi5ldGNbMl0KKyAgICAgICAgICAgIGlmIG1vZF90eXBlPT1pbXAuUFlfU09VUkNFOgorICAgICAgICAgICAgICAgIHNlbGYuX3Jlb3BlbigpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZSA9IHNlbGYuZmlsZS5yZWFkKCkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQorICAgICAgICAgICAgZWxpZiBtb2RfdHlwZT09aW1wLlBZX0NPTVBJTEVEOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZmlsZW5hbWVbOi0xXSk6CisgICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuZmlsZW5hbWVbOi0xXSwgJ3JVJykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3VyY2UgPSBmLnJlYWQoKQorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGVsaWYgbW9kX3R5cGU9PWltcC5QS0dfRElSRUNUT1JZOgorICAgICAgICAgICAgICAgIHNlbGYuc291cmNlID0gc2VsZi5fZ2V0X2RlbGVnYXRlKCkuZ2V0X3NvdXJjZSgpCisgICAgICAgIHJldHVybiBzZWxmLnNvdXJjZQorCisKKyAgICBkZWYgX2dldF9kZWxlZ2F0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIEltcEltcG9ydGVyKHNlbGYuZmlsZW5hbWUpLmZpbmRfbW9kdWxlKCdfX2luaXRfXycpCisKKyAgICBkZWYgZ2V0X2ZpbGVuYW1lKHNlbGYsIGZ1bGxuYW1lPU5vbmUpOgorICAgICAgICBmdWxsbmFtZSA9IHNlbGYuX2ZpeF9uYW1lKGZ1bGxuYW1lKQorICAgICAgICBtb2RfdHlwZSA9IHNlbGYuZXRjWzJdCisgICAgICAgIGlmIHNlbGYuZXRjWzJdPT1pbXAuUEtHX0RJUkVDVE9SWToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfZGVsZWdhdGUoKS5nZXRfZmlsZW5hbWUoKQorICAgICAgICBlbGlmIHNlbGYuZXRjWzJdIGluIChpbXAuUFlfU09VUkNFLCBpbXAuUFlfQ09NUElMRUQsIGltcC5DX0VYVEVOU0lPTik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZQorICAgICAgICByZXR1cm4gTm9uZQorCisKK3RyeToKKyAgICBpbXBvcnQgemlwaW1wb3J0CisgICAgZnJvbSB6aXBpbXBvcnQgaW1wb3J0IHppcGltcG9ydGVyCisKKyAgICBkZWYgaXRlcl96aXBpbXBvcnRfbW9kdWxlcyhpbXBvcnRlciwgcHJlZml4PScnKToKKyAgICAgICAgZGlybGlzdCA9IHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZVtpbXBvcnRlci5hcmNoaXZlXS5rZXlzKCkKKyAgICAgICAgZGlybGlzdC5zb3J0KCkKKyAgICAgICAgX3ByZWZpeCA9IGltcG9ydGVyLnByZWZpeAorICAgICAgICBwbGVuID0gbGVuKF9wcmVmaXgpCisgICAgICAgIHlpZWxkZWQgPSB7fQorICAgICAgICBpbXBvcnQgaW5zcGVjdAorICAgICAgICBmb3IgZm4gaW4gZGlybGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCBmbi5zdGFydHN3aXRoKF9wcmVmaXgpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGZuID0gZm5bcGxlbjpdLnNwbGl0KG9zLnNlcCkKKworICAgICAgICAgICAgaWYgbGVuKGZuKT09MiBhbmQgZm5bMV0uc3RhcnRzd2l0aCgnX19pbml0X18ucHknKToKKyAgICAgICAgICAgICAgICBpZiBmblswXSBub3QgaW4geWllbGRlZDoKKyAgICAgICAgICAgICAgICAgICAgeWllbGRlZFtmblswXV0gPSAxCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGZuWzBdLCBUcnVlCisKKyAgICAgICAgICAgIGlmIGxlbihmbikhPTE6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgbW9kbmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShmblswXSkKKyAgICAgICAgICAgIGlmIG1vZG5hbWU9PSdfX2luaXRfXyc6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgbW9kbmFtZSBhbmQgJy4nIG5vdCBpbiBtb2RuYW1lIGFuZCBtb2RuYW1lIG5vdCBpbiB5aWVsZGVkOgorICAgICAgICAgICAgICAgIHlpZWxkZWRbbW9kbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgeWllbGQgcHJlZml4ICsgbW9kbmFtZSwgRmFsc2UKKworICAgIGl0ZXJfaW1wb3J0ZXJfbW9kdWxlcy5yZWdpc3Rlcih6aXBpbXBvcnRlciwgaXRlcl96aXBpbXBvcnRfbW9kdWxlcykKKworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKKworCitkZWYgZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSk6CisgICAgIiIiUmV0cmlldmUgYSBQRVAgMzAyIGltcG9ydGVyIGZvciB0aGUgZ2l2ZW4gcGF0aCBpdGVtCisKKyAgICBUaGUgcmV0dXJuZWQgaW1wb3J0ZXIgaXMgY2FjaGVkIGluIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlCisgICAgaWYgaXQgd2FzIG5ld2x5IGNyZWF0ZWQgYnkgYSBwYXRoIGhvb2suCisKKyAgICBJZiB0aGVyZSBpcyBubyBpbXBvcnRlciwgYSB3cmFwcGVyIGFyb3VuZCB0aGUgYmFzaWMgaW1wb3J0CisgICAgbWFjaGluZXJ5IGlzIHJldHVybmVkLiBUaGlzIHdyYXBwZXIgaXMgbmV2ZXIgaW5zZXJ0ZWQgaW50bworICAgIHRoZSBpbXBvcnRlciBjYWNoZSAoTm9uZSBpcyBpbnNlcnRlZCBpbnN0ZWFkKS4KKworICAgIFRoZSBjYWNoZSAob3IgcGFydCBvZiBpdCkgY2FuIGJlIGNsZWFyZWQgbWFudWFsbHkgaWYgYQorICAgIHJlc2NhbiBvZiBzeXMucGF0aF9ob29rcyBpcyBuZWNlc3NhcnkuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBpbXBvcnRlciA9IHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlW3BhdGhfaXRlbV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIGZvciBwYXRoX2hvb2sgaW4gc3lzLnBhdGhfaG9va3M6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0ZXIgPSBwYXRoX2hvb2socGF0aF9pdGVtKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW1wb3J0ZXIgPSBOb25lCisgICAgICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLnNldGRlZmF1bHQocGF0aF9pdGVtLCBpbXBvcnRlcikKKworICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydGVyID0gSW1wSW1wb3J0ZXIocGF0aF9pdGVtKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpbXBvcnRlciA9IE5vbmUKKyAgICByZXR1cm4gaW1wb3J0ZXIKKworCitkZWYgaXRlcl9pbXBvcnRlcnMoZnVsbG5hbWU9IiIpOgorICAgICIiIllpZWxkIFBFUCAzMDIgaW1wb3J0ZXJzIGZvciB0aGUgZ2l2ZW4gbW9kdWxlIG5hbWUKKworICAgIElmIGZ1bGxuYW1lIGNvbnRhaW5zIGEgJy4nLCB0aGUgaW1wb3J0ZXJzIHdpbGwgYmUgZm9yIHRoZSBwYWNrYWdlCisgICAgY29udGFpbmluZyBmdWxsbmFtZSwgb3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBpbXBvcnRlcnMgZm9yIHN5cy5tZXRhX3BhdGgsCisgICAgc3lzLnBhdGgsIGFuZCBQeXRob24ncyAiY2xhc3NpYyIgaW1wb3J0IG1hY2hpbmVyeSwgaW4gdGhhdCBvcmRlci4gIElmCisgICAgdGhlIG5hbWVkIG1vZHVsZSBpcyBpbiBhIHBhY2thZ2UsIHRoYXQgcGFja2FnZSBpcyBpbXBvcnRlZCBhcyBhIHNpZGUKKyAgICBlZmZlY3Qgb2YgaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4KKworICAgIE5vbiBQRVAgMzAyIG1lY2hhbmlzbXMgKGUuZy4gdGhlIFdpbmRvd3MgcmVnaXN0cnkpIHVzZWQgYnkgdGhlCisgICAgc3RhbmRhcmQgaW1wb3J0IG1hY2hpbmVyeSB0byBmaW5kIGZpbGVzIGluIGFsdGVybmF0aXZlIGxvY2F0aW9ucworICAgIGFyZSBwYXJ0aWFsbHkgc3VwcG9ydGVkLCBidXQgYXJlIHNlYXJjaGVkIEFGVEVSIHN5cy5wYXRoLiBOb3JtYWxseSwKKyAgICB0aGVzZSBsb2NhdGlvbnMgYXJlIHNlYXJjaGVkIEJFRk9SRSBzeXMucGF0aCwgcHJldmVudGluZyBzeXMucGF0aAorICAgIGVudHJpZXMgZnJvbSBzaGFkb3dpbmcgdGhlbS4KKworICAgIEZvciB0aGlzIHRvIGNhdXNlIGEgdmlzaWJsZSBkaWZmZXJlbmNlIGluIGJlaGF2aW91ciwgdGhlcmUgbXVzdAorICAgIGJlIGEgbW9kdWxlIG9yIHBhY2thZ2UgbmFtZSB0aGF0IGlzIGFjY2Vzc2libGUgdmlhIGJvdGggc3lzLnBhdGgKKyAgICBhbmQgb25lIG9mIHRoZSBub24gUEVQIDMwMiBmaWxlIHN5c3RlbSBtZWNoYW5pc21zLiBJbiB0aGlzIGNhc2UsCisgICAgdGhlIGVtdWxhdGlvbiB3aWxsIGZpbmQgdGhlIGZvcm1lciB2ZXJzaW9uLCB3aGlsZSB0aGUgYnVpbHRpbgorICAgIGltcG9ydCBtZWNoYW5pc20gd2lsbCBmaW5kIHRoZSBsYXR0ZXIuCisKKyAgICBJdGVtcyBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIGNhbiBiZSBhZmZlY3RlZCBieSB0aGlzIGRpc2NyZXBhbmN5OgorICAgICAgICBpbXAuQ19FWFRFTlNJT04sIGltcC5QWV9TT1VSQ0UsIGltcC5QWV9DT01QSUxFRCwgaW1wLlBLR19ESVJFQ1RPUlkKKyAgICAiIiIKKyAgICBpZiBmdWxsbmFtZS5zdGFydHN3aXRoKCcuJyk6CisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJSZWxhdGl2ZSBtb2R1bGUgbmFtZXMgbm90IHN1cHBvcnRlZCIpCisgICAgaWYgJy4nIGluIGZ1bGxuYW1lOgorICAgICAgICAjIEdldCB0aGUgY29udGFpbmluZyBwYWNrYWdlJ3MgX19wYXRoX18KKyAgICAgICAgcGtnID0gJy4nLmpvaW4oZnVsbG5hbWUuc3BsaXQoJy4nKVs6LTFdKQorICAgICAgICBpZiBwa2cgbm90IGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgX19pbXBvcnRfXyhwa2cpCisgICAgICAgIHBhdGggPSBnZXRhdHRyKHN5cy5tb2R1bGVzW3BrZ10sICdfX3BhdGhfXycsIE5vbmUpIG9yIFtdCisgICAgZWxzZToKKyAgICAgICAgZm9yIGltcG9ydGVyIGluIHN5cy5tZXRhX3BhdGg6CisgICAgICAgICAgICB5aWVsZCBpbXBvcnRlcgorICAgICAgICBwYXRoID0gc3lzLnBhdGgKKyAgICBmb3IgaXRlbSBpbiBwYXRoOgorICAgICAgICB5aWVsZCBnZXRfaW1wb3J0ZXIoaXRlbSkKKyAgICBpZiAnLicgbm90IGluIGZ1bGxuYW1lOgorICAgICAgICB5aWVsZCBJbXBJbXBvcnRlcigpCisKK2RlZiBnZXRfbG9hZGVyKG1vZHVsZV9vcl9uYW1lKToKKyAgICAiIiJHZXQgYSBQRVAgMzAyICJsb2FkZXIiIG9iamVjdCBmb3IgbW9kdWxlX29yX25hbWUKKworICAgIElmIHRoZSBtb2R1bGUgb3IgcGFja2FnZSBpcyBhY2Nlc3NpYmxlIHZpYSB0aGUgbm9ybWFsIGltcG9ydAorICAgIG1lY2hhbmlzbSwgYSB3cmFwcGVyIGFyb3VuZCB0aGUgcmVsZXZhbnQgcGFydCBvZiB0aGF0IG1hY2hpbmVyeQorICAgIGlzIHJldHVybmVkLiAgUmV0dXJucyBOb25lIGlmIHRoZSBtb2R1bGUgY2Fubm90IGJlIGZvdW5kIG9yIGltcG9ydGVkLgorICAgIElmIHRoZSBuYW1lZCBtb2R1bGUgaXMgbm90IGFscmVhZHkgaW1wb3J0ZWQsIGl0cyBjb250YWluaW5nIHBhY2thZ2UKKyAgICAoaWYgYW55KSBpcyBpbXBvcnRlZCwgaW4gb3JkZXIgdG8gZXN0YWJsaXNoIHRoZSBwYWNrYWdlIF9fcGF0aF9fLgorCisgICAgVGhpcyBmdW5jdGlvbiB1c2VzIGl0ZXJfaW1wb3J0ZXJzKCksIGFuZCBpcyB0aHVzIHN1YmplY3QgdG8gdGhlIHNhbWUKKyAgICBsaW1pdGF0aW9ucyByZWdhcmRpbmcgcGxhdGZvcm0tc3BlY2lmaWMgc3BlY2lhbCBpbXBvcnQgbG9jYXRpb25zIHN1Y2gKKyAgICBhcyB0aGUgV2luZG93cyByZWdpc3RyeS4KKyAgICAiIiIKKyAgICBpZiBtb2R1bGVfb3JfbmFtZSBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgbW9kdWxlX29yX25hbWUgPSBzeXMubW9kdWxlc1ttb2R1bGVfb3JfbmFtZV0KKyAgICBpZiBpc2luc3RhbmNlKG1vZHVsZV9vcl9uYW1lLCBNb2R1bGVUeXBlKToKKyAgICAgICAgbW9kdWxlID0gbW9kdWxlX29yX25hbWUKKyAgICAgICAgbG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKKyAgICAgICAgaWYgbG9hZGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGxvYWRlcgorICAgICAgICBmdWxsbmFtZSA9IG1vZHVsZS5fX25hbWVfXworICAgIGVsc2U6CisgICAgICAgIGZ1bGxuYW1lID0gbW9kdWxlX29yX25hbWUKKyAgICByZXR1cm4gZmluZF9sb2FkZXIoZnVsbG5hbWUpCisKK2RlZiBmaW5kX2xvYWRlcihmdWxsbmFtZSk6CisgICAgIiIiRmluZCBhIFBFUCAzMDIgImxvYWRlciIgb2JqZWN0IGZvciBmdWxsbmFtZQorCisgICAgSWYgZnVsbG5hbWUgY29udGFpbnMgZG90cywgcGF0aCBtdXN0IGJlIHRoZSBjb250YWluaW5nIHBhY2thZ2UncyBfX3BhdGhfXy4KKyAgICBSZXR1cm5zIE5vbmUgaWYgdGhlIG1vZHVsZSBjYW5ub3QgYmUgZm91bmQgb3IgaW1wb3J0ZWQuIFRoaXMgZnVuY3Rpb24gdXNlcworICAgIGl0ZXJfaW1wb3J0ZXJzKCksIGFuZCBpcyB0aHVzIHN1YmplY3QgdG8gdGhlIHNhbWUgbGltaXRhdGlvbnMgcmVnYXJkaW5nCisgICAgcGxhdGZvcm0tc3BlY2lmaWMgc3BlY2lhbCBpbXBvcnQgbG9jYXRpb25zIHN1Y2ggYXMgdGhlIFdpbmRvd3MgcmVnaXN0cnkuCisgICAgIiIiCisgICAgZm9yIGltcG9ydGVyIGluIGl0ZXJfaW1wb3J0ZXJzKGZ1bGxuYW1lKToKKyAgICAgICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUoZnVsbG5hbWUpCisgICAgICAgIGlmIGxvYWRlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBsb2FkZXIKKworICAgIHJldHVybiBOb25lCisKKworZGVmIGV4dGVuZF9wYXRoKHBhdGgsIG5hbWUpOgorICAgICIiIkV4dGVuZCBhIHBhY2thZ2UncyBwYXRoLgorCisgICAgSW50ZW5kZWQgdXNlIGlzIHRvIHBsYWNlIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBhIHBhY2thZ2UncyBfX2luaXRfXy5weToKKworICAgICAgICBmcm9tIHBrZ3V0aWwgaW1wb3J0IGV4dGVuZF9wYXRoCisgICAgICAgIF9fcGF0aF9fID0gZXh0ZW5kX3BhdGgoX19wYXRoX18sIF9fbmFtZV9fKQorCisgICAgVGhpcyB3aWxsIGFkZCB0byB0aGUgcGFja2FnZSdzIF9fcGF0aF9fIGFsbCBzdWJkaXJlY3RvcmllcyBvZgorICAgIGRpcmVjdG9yaWVzIG9uIHN5cy5wYXRoIG5hbWVkIGFmdGVyIHRoZSBwYWNrYWdlLiAgVGhpcyBpcyB1c2VmdWwKKyAgICBpZiBvbmUgd2FudHMgdG8gZGlzdHJpYnV0ZSBkaWZmZXJlbnQgcGFydHMgb2YgYSBzaW5nbGUgbG9naWNhbAorICAgIHBhY2thZ2UgYXMgbXVsdGlwbGUgZGlyZWN0b3JpZXMuCisKKyAgICBJdCBhbHNvIGxvb2tzIGZvciAqLnBrZyBmaWxlcyBiZWdpbm5pbmcgd2hlcmUgKiBtYXRjaGVzIHRoZSBuYW1lCisgICAgYXJndW1lbnQuICBUaGlzIGZlYXR1cmUgaXMgc2ltaWxhciB0byAqLnB0aCBmaWxlcyAoc2VlIHNpdGUucHkpLAorICAgIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3Qgc3BlY2lhbC1jYXNlIGxpbmVzIHN0YXJ0aW5nIHdpdGggJ2ltcG9ydCcuCisgICAgQSAqLnBrZyBmaWxlIGlzIHRydXN0ZWQgYXQgZmFjZSB2YWx1ZTogYXBhcnQgZnJvbSBjaGVja2luZyBmb3IKKyAgICBkdXBsaWNhdGVzLCBhbGwgZW50cmllcyBmb3VuZCBpbiBhICoucGtnIGZpbGUgYXJlIGFkZGVkIHRvIHRoZQorICAgIHBhdGgsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBleGlzdCB0aGUgZmlsZXN5c3RlbS4gIChUaGlzCisgICAgaXMgYSBmZWF0dXJlLikKKworICAgIElmIHRoZSBpbnB1dCBwYXRoIGlzIG5vdCBhIGxpc3QgKGFzIGlzIHRoZSBjYXNlIGZvciBmcm96ZW4KKyAgICBwYWNrYWdlcykgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLiAgVGhlIGlucHV0IHBhdGggaXMgbm90CisgICAgbW9kaWZpZWQ7IGFuIGV4dGVuZGVkIGNvcHkgaXMgcmV0dXJuZWQuICBJdGVtcyBhcmUgb25seSBhcHBlbmRlZAorICAgIHRvIHRoZSBjb3B5IGF0IHRoZSBlbmQuCisKKyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgc3lzLnBhdGggaXMgYSBzZXF1ZW5jZS4gIEl0ZW1zIG9mIHN5cy5wYXRoIHRoYXQKKyAgICBhcmUgbm90ICh1bmljb2RlIG9yIDgtYml0KSBzdHJpbmdzIHJlZmVycmluZyB0byBleGlzdGluZworICAgIGRpcmVjdG9yaWVzIGFyZSBpZ25vcmVkLiAgVW5pY29kZSBpdGVtcyBvZiBzeXMucGF0aCB0aGF0IGNhdXNlCisgICAgZXJyb3JzIHdoZW4gdXNlZCBhcyBmaWxlbmFtZXMgbWF5IGNhdXNlIHRoaXMgZnVuY3Rpb24gdG8gcmFpc2UgYW4KKyAgICBleGNlcHRpb24gKGluIGxpbmUgd2l0aCBvcy5wYXRoLmlzZGlyKCkgYmVoYXZpb3IpLgorICAgICIiIgorCisgICAgaWYgbm90IGlzaW5zdGFuY2UocGF0aCwgbGlzdCk6CisgICAgICAgICMgVGhpcyBjb3VsZCBoYXBwZW4gZS5nLiB3aGVuIHRoaXMgaXMgY2FsbGVkIGZyb20gaW5zaWRlIGEKKyAgICAgICAgIyBmcm96ZW4gcGFja2FnZS4gIFJldHVybiB0aGUgcGF0aCB1bmNoYW5nZWQgaW4gdGhhdCBjYXNlLgorICAgICAgICByZXR1cm4gcGF0aAorCisgICAgcG5hbWUgPSBvcy5wYXRoLmpvaW4oKm5hbWUuc3BsaXQoJy4nKSkgIyBSZWNvbnN0aXR1dGUgYXMgcmVsYXRpdmUgcGF0aAorICAgICMgSnVzdCBpbiBjYXNlIG9zLmV4dHNlcCAhPSAnLicKKyAgICBzbmFtZSA9IG9zLmV4dHNlcC5qb2luKG5hbWUuc3BsaXQoJy4nKSkKKyAgICBzbmFtZV9wa2cgPSBzbmFtZSArIG9zLmV4dHNlcCArICJwa2ciCisgICAgaW5pdF9weSA9ICJfX2luaXRfXyIgKyBvcy5leHRzZXAgKyAicHkiCisKKyAgICBwYXRoID0gcGF0aFs6XSAjIFN0YXJ0IHdpdGggYSBjb3B5IG9mIHRoZSBleGlzdGluZyBwYXRoCisKKyAgICBmb3IgZGlyIGluIHN5cy5wYXRoOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkaXIsIGJhc2VzdHJpbmcpIG9yIG5vdCBvcy5wYXRoLmlzZGlyKGRpcik6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBzdWJkaXIgPSBvcy5wYXRoLmpvaW4oZGlyLCBwbmFtZSkKKyAgICAgICAgIyBYWFggVGhpcyBtYXkgc3RpbGwgYWRkIGR1cGxpY2F0ZSBlbnRyaWVzIHRvIHBhdGggb24KKyAgICAgICAgIyBjYXNlLWluc2Vuc2l0aXZlIGZpbGVzeXN0ZW1zCisgICAgICAgIGluaXRmaWxlID0gb3MucGF0aC5qb2luKHN1YmRpciwgaW5pdF9weSkKKyAgICAgICAgaWYgc3ViZGlyIG5vdCBpbiBwYXRoIGFuZCBvcy5wYXRoLmlzZmlsZShpbml0ZmlsZSk6CisgICAgICAgICAgICBwYXRoLmFwcGVuZChzdWJkaXIpCisgICAgICAgICMgWFhYIElzIHRoaXMgdGhlIHJpZ2h0IHRoaW5nIGZvciBzdWJwYWNrYWdlcyBsaWtlIHpvcGUuYXBwPworICAgICAgICAjIEl0IGxvb2tzIGZvciBhIGZpbGUgbmFtZWQgInpvcGUuYXBwLnBrZyIKKyAgICAgICAgcGtnZmlsZSA9IG9zLnBhdGguam9pbihkaXIsIHNuYW1lX3BrZykKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGtnZmlsZSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4ocGtnZmlsZSkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2FuJ3Qgb3BlbiAlczogJXNcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBrZ2ZpbGUsIG1zZykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgnXG4nKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGluZSBvciBsaW5lLnN0YXJ0c3dpdGgoJyMnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKGxpbmUpICMgRG9uJ3QgY2hlY2sgZm9yIGV4aXN0ZW5jZSEKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIHJldHVybiBwYXRoCisKK2RlZiBnZXRfZGF0YShwYWNrYWdlLCByZXNvdXJjZSk6CisgICAgIiIiR2V0IGEgcmVzb3VyY2UgZnJvbSBhIHBhY2thZ2UuCisKKyAgICBUaGlzIGlzIGEgd3JhcHBlciByb3VuZCB0aGUgUEVQIDMwMiBsb2FkZXIgZ2V0X2RhdGEgQVBJLiBUaGUgcGFja2FnZQorICAgIGFyZ3VtZW50IHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIHBhY2thZ2UsIGluIHN0YW5kYXJkIG1vZHVsZSBmb3JtYXQKKyAgICAoZm9vLmJhcikuIFRoZSByZXNvdXJjZSBhcmd1bWVudCBzaG91bGQgYmUgaW4gdGhlIGZvcm0gb2YgYSByZWxhdGl2ZQorICAgIGZpbGVuYW1lLCB1c2luZyAnLycgYXMgdGhlIHBhdGggc2VwYXJhdG9yLiBUaGUgcGFyZW50IGRpcmVjdG9yeSBuYW1lICcuLicKKyAgICBpcyBub3QgYWxsb3dlZCwgYW5kIG5vciBpcyBhIHJvb3RlZCBuYW1lIChzdGFydGluZyB3aXRoIGEgJy8nKS4KKworICAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgYmluYXJ5IHN0cmluZywgd2hpY2ggaXMgdGhlIGNvbnRlbnRzIG9mIHRoZQorICAgIHNwZWNpZmllZCByZXNvdXJjZS4KKworICAgIEZvciBwYWNrYWdlcyBsb2NhdGVkIGluIHRoZSBmaWxlc3lzdGVtLCB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBpbXBvcnRlZCwKKyAgICB0aGlzIGlzIHRoZSByb3VnaCBlcXVpdmFsZW50IG9mCisKKyAgICAgICAgZCA9IG9zLnBhdGguZGlybmFtZShzeXMubW9kdWxlc1twYWNrYWdlXS5fX2ZpbGVfXykKKyAgICAgICAgZGF0YSA9IG9wZW4ob3MucGF0aC5qb2luKGQsIHJlc291cmNlKSwgJ3JiJykucmVhZCgpCisKKyAgICBJZiB0aGUgcGFja2FnZSBjYW5ub3QgYmUgbG9jYXRlZCBvciBsb2FkZWQsIG9yIGl0IHVzZXMgYSBQRVAgMzAyIGxvYWRlcgorICAgIHdoaWNoIGRvZXMgbm90IHN1cHBvcnQgZ2V0X2RhdGEoKSwgdGhlbiBOb25lIGlzIHJldHVybmVkLgorICAgICIiIgorCisgICAgbG9hZGVyID0gZ2V0X2xvYWRlcihwYWNrYWdlKQorICAgIGlmIGxvYWRlciBpcyBOb25lIG9yIG5vdCBoYXNhdHRyKGxvYWRlciwgJ2dldF9kYXRhJyk6CisgICAgICAgIHJldHVybiBOb25lCisgICAgbW9kID0gc3lzLm1vZHVsZXMuZ2V0KHBhY2thZ2UpIG9yIGxvYWRlci5sb2FkX21vZHVsZShwYWNrYWdlKQorICAgIGlmIG1vZCBpcyBOb25lIG9yIG5vdCBoYXNhdHRyKG1vZCwgJ19fZmlsZV9fJyk6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIE1vZGlmeSB0aGUgcmVzb3VyY2UgbmFtZSB0byBiZSBjb21wYXRpYmxlIHdpdGggdGhlIGxvYWRlci5nZXRfZGF0YQorICAgICMgc2lnbmF0dXJlIC0gYW4gb3MucGF0aCBmb3JtYXQgImZpbGVuYW1lIiBzdGFydGluZyB3aXRoIHRoZSBkaXJuYW1lIG9mCisgICAgIyB0aGUgcGFja2FnZSdzIF9fZmlsZV9fCisgICAgcGFydHMgPSByZXNvdXJjZS5zcGxpdCgnLycpCisgICAgcGFydHMuaW5zZXJ0KDAsIG9zLnBhdGguZGlybmFtZShtb2QuX19maWxlX18pKQorICAgIHJlc291cmNlX25hbWUgPSBvcy5wYXRoLmpvaW4oKnBhcnRzKQorICAgIHJldHVybiBsb2FkZXIuZ2V0X2RhdGEocmVzb3VyY2VfbmFtZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGtndXRpbC5weWMgYi9saWIvcHl0aG9uMi43L3BrZ3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjUwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BrZ3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGtndXRpbC5weW8gYi9saWIvcHl0aG9uMi43L3BrZ3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjUwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BrZ3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1kYXJ3aW4vSU4ucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtZGFyd2luL0lOLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNzQwODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtZGFyd2luL0lOLnB5CkBAIC0wLDAgKzEsMzU3IEBACisjIEdlbmVyYXRlZCBieSBoMnB5IGZyb20gL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaAorCisjIEluY2x1ZGVkIGZyb20gc3lzL2FwcGxlYXBpb3B0cy5oCitJUFBST1RPX0lQID0gMAorSVBQUk9UT19IT1BPUFRTID0gMAorSVBQUk9UT19JQ01QID0gMQorSVBQUk9UT19JR01QID0gMgorSVBQUk9UT19HR1AgPSAzCitJUFBST1RPX0lQVjQgPSA0CitJUFBST1RPX0lQSVAgPSBJUFBST1RPX0lQVjQKK0lQUFJPVE9fVENQID0gNgorSVBQUk9UT19TVCA9IDcKK0lQUFJPVE9fRUdQID0gOAorSVBQUk9UT19QSUdQID0gOQorSVBQUk9UT19SQ0NNT04gPSAxMAorSVBQUk9UT19OVlBJSSA9IDExCitJUFBST1RPX1BVUCA9IDEyCitJUFBST1RPX0FSR1VTID0gMTMKK0lQUFJPVE9fRU1DT04gPSAxNAorSVBQUk9UT19YTkVUID0gMTUKK0lQUFJPVE9fQ0hBT1MgPSAxNgorSVBQUk9UT19VRFAgPSAxNworSVBQUk9UT19NVVggPSAxOAorSVBQUk9UT19NRUFTID0gMTkKK0lQUFJPVE9fSE1QID0gMjAKK0lQUFJPVE9fUFJNID0gMjEKK0lQUFJPVE9fSURQID0gMjIKK0lQUFJPVE9fVFJVTksxID0gMjMKK0lQUFJPVE9fVFJVTksyID0gMjQKK0lQUFJPVE9fTEVBRjEgPSAyNQorSVBQUk9UT19MRUFGMiA9IDI2CitJUFBST1RPX1JEUCA9IDI3CitJUFBST1RPX0lSVFAgPSAyOAorSVBQUk9UT19UUCA9IDI5CitJUFBST1RPX0JMVCA9IDMwCitJUFBST1RPX05TUCA9IDMxCitJUFBST1RPX0lOUCA9IDMyCitJUFBST1RPX1NFUCA9IDMzCitJUFBST1RPXzNQQyA9IDM0CitJUFBST1RPX0lEUFIgPSAzNQorSVBQUk9UT19YVFAgPSAzNgorSVBQUk9UT19ERFAgPSAzNworSVBQUk9UT19DTVRQID0gMzgKK0lQUFJPVE9fVFBYWCA9IDM5CitJUFBST1RPX0lMID0gNDAKK0lQUFJPVE9fSVBWNiA9IDQxCitJUFBST1RPX1NEUlAgPSA0MgorSVBQUk9UT19ST1VUSU5HID0gNDMKK0lQUFJPVE9fRlJBR01FTlQgPSA0NAorSVBQUk9UT19JRFJQID0gNDUKK0lQUFJPVE9fUlNWUCA9IDQ2CitJUFBST1RPX0dSRSA9IDQ3CitJUFBST1RPX01IUlAgPSA0OAorSVBQUk9UT19CSEEgPSA0OQorSVBQUk9UT19FU1AgPSA1MAorSVBQUk9UT19BSCA9IDUxCitJUFBST1RPX0lOTFNQID0gNTIKK0lQUFJPVE9fU1dJUEUgPSA1MworSVBQUk9UT19OSFJQID0gNTQKK0lQUFJPVE9fSUNNUFY2ID0gNTgKK0lQUFJPVE9fTk9ORSA9IDU5CitJUFBST1RPX0RTVE9QVFMgPSA2MAorSVBQUk9UT19BSElQID0gNjEKK0lQUFJPVE9fQ0ZUUCA9IDYyCitJUFBST1RPX0hFTExPID0gNjMKK0lQUFJPVE9fU0FURVhQQUsgPSA2NAorSVBQUk9UT19LUllQVE9MQU4gPSA2NQorSVBQUk9UT19SVkQgPSA2NgorSVBQUk9UT19JUFBDID0gNjcKK0lQUFJPVE9fQURGUyA9IDY4CitJUFBST1RPX1NBVE1PTiA9IDY5CitJUFBST1RPX1ZJU0EgPSA3MAorSVBQUk9UT19JUENWID0gNzEKK0lQUFJPVE9fQ1BOWCA9IDcyCitJUFBST1RPX0NQSEIgPSA3MworSVBQUk9UT19XU04gPSA3NAorSVBQUk9UT19QVlAgPSA3NQorSVBQUk9UT19CUlNBVE1PTiA9IDc2CitJUFBST1RPX05EID0gNzcKK0lQUFJPVE9fV0JNT04gPSA3OAorSVBQUk9UT19XQkVYUEFLID0gNzkKK0lQUFJPVE9fRU9OID0gODAKK0lQUFJPVE9fVk1UUCA9IDgxCitJUFBST1RPX1NWTVRQID0gODIKK0lQUFJPVE9fVklORVMgPSA4MworSVBQUk9UT19UVFAgPSA4NAorSVBQUk9UT19JR1AgPSA4NQorSVBQUk9UT19ER1AgPSA4NgorSVBQUk9UT19UQ0YgPSA4NworSVBQUk9UT19JR1JQID0gODgKK0lQUFJPVE9fT1NQRklHUCA9IDg5CitJUFBST1RPX1NSUEMgPSA5MAorSVBQUk9UT19MQVJQID0gOTEKK0lQUFJPVE9fTVRQID0gOTIKK0lQUFJPVE9fQVgyNSA9IDkzCitJUFBST1RPX0lQRUlQID0gOTQKK0lQUFJPVE9fTUlDUCA9IDk1CitJUFBST1RPX1NDQ1NQID0gOTYKK0lQUFJPVE9fRVRIRVJJUCA9IDk3CitJUFBST1RPX0VOQ0FQID0gOTgKK0lQUFJPVE9fQVBFUyA9IDk5CitJUFBST1RPX0dNVFAgPSAxMDAKK0lQUFJPVE9fSVBDT01QID0gMTA4CitJUFBST1RPX1BJTSA9IDEwMworSVBQUk9UT19QR00gPSAxMTMKK0lQUFJPVE9fRElWRVJUID0gMjU0CitJUFBST1RPX1JBVyA9IDI1NQorSVBQUk9UT19NQVggPSAyNTYKK0lQUFJPVE9fRE9ORSA9IDI1NworSVBQT1JUX1JFU0VSVkVEID0gMTAyNAorSVBQT1JUX1VTRVJSRVNFUlZFRCA9IDUwMDAKK0lQUE9SVF9ISUZJUlNUQVVUTyA9IDQ5MTUyCitJUFBPUlRfSElMQVNUQVVUTyA9IDY1NTM1CitJUFBPUlRfUkVTRVJWRURTVEFSVCA9IDYwMAorZGVmIElOX0NMQVNTQShpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiAweDgwMDAwMDAwKSA9PSAwKQorCitJTl9DTEFTU0FfTkVUID0gMHhmZjAwMDAwMAorSU5fQ0xBU1NBX05TSElGVCA9IDI0CitJTl9DTEFTU0FfSE9TVCA9IDB4MDBmZmZmZmYKK0lOX0NMQVNTQV9NQVggPSAxMjgKK2RlZiBJTl9DTEFTU0IoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhjMDAwMDAwMCkgPT0gMHg4MDAwMDAwMCkKKworSU5fQ0xBU1NCX05FVCA9IDB4ZmZmZjAwMDAKK0lOX0NMQVNTQl9OU0hJRlQgPSAxNgorSU5fQ0xBU1NCX0hPU1QgPSAweDAwMDBmZmZmCitJTl9DTEFTU0JfTUFYID0gNjU1MzYKK2RlZiBJTl9DTEFTU0MoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhlMDAwMDAwMCkgPT0gMHhjMDAwMDAwMCkKKworSU5fQ0xBU1NDX05FVCA9IDB4ZmZmZmZmMDAKK0lOX0NMQVNTQ19OU0hJRlQgPSA4CitJTl9DTEFTU0NfSE9TVCA9IDB4MDAwMDAwZmYKK2RlZiBJTl9DTEFTU0QoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhmMDAwMDAwMCkgPT0gMHhlMDAwMDAwMCkKKworSU5fQ0xBU1NEX05FVCA9IDB4ZjAwMDAwMDAKK0lOX0NMQVNTRF9OU0hJRlQgPSAyOAorSU5fQ0xBU1NEX0hPU1QgPSAweDBmZmZmZmZmCitkZWYgSU5fTVVMVElDQVNUKGkpOiByZXR1cm4gSU5fQ0xBU1NEKGkpCisKK2RlZiBJTl9FWFBFUklNRU5UQUwoaSk6IHJldHVybiAoKCh1X2ludDMyX3QpKGkpICYgMHhmMDAwMDAwMCkgPT0gMHhmMDAwMDAwMCkKKworZGVmIElOX0JBRENMQVNTKGkpOiByZXR1cm4gKCgodV9pbnQzMl90KShpKSAmIDB4ZjAwMDAwMDApID09IDB4ZjAwMDAwMDApCisKK0lOQUREUl9OT05FID0gMHhmZmZmZmZmZgorZGVmIElOX0xJTktMT0NBTChpKTogcmV0dXJuICgoKHVfaW50MzJfdCkoaSkgJiBJTl9DTEFTU0JfTkVUKSA9PSBJTl9MSU5LTE9DQUxORVROVU0pCisKK0lOX0xPT1BCQUNLTkVUID0gMTI3CitJTkVUX0FERFJTVFJMRU4gPSAxNgorSVBfT1BUSU9OUyA9IDEKK0lQX0hEUklOQ0wgPSAyCitJUF9UT1MgPSAzCitJUF9UVEwgPSA0CitJUF9SRUNWT1BUUyA9IDUKK0lQX1JFQ1ZSRVRPUFRTID0gNgorSVBfUkVDVkRTVEFERFIgPSA3CitJUF9SRVRPUFRTID0gOAorSVBfTVVMVElDQVNUX0lGID0gOQorSVBfTVVMVElDQVNUX1RUTCA9IDEwCitJUF9NVUxUSUNBU1RfTE9PUCA9IDExCitJUF9BRERfTUVNQkVSU0hJUCA9IDEyCitJUF9EUk9QX01FTUJFUlNISVAgPSAxMworSVBfTVVMVElDQVNUX1ZJRiA9IDE0CitJUF9SU1ZQX09OID0gMTUKK0lQX1JTVlBfT0ZGID0gMTYKK0lQX1JTVlBfVklGX09OID0gMTcKK0lQX1JTVlBfVklGX09GRiA9IDE4CitJUF9QT1JUUkFOR0UgPSAxOQorSVBfUkVDVklGID0gMjAKK0lQX0lQU0VDX1BPTElDWSA9IDIxCitJUF9GQUlUSCA9IDIyCitJUF9TVFJJUEhEUiA9IDIzCitJUF9GV19BREQgPSA0MAorSVBfRldfREVMID0gNDEKK0lQX0ZXX0ZMVVNIID0gNDIKK0lQX0ZXX1pFUk8gPSA0MworSVBfRldfR0VUID0gNDQKK0lQX0ZXX1JFU0VUTE9HID0gNDUKK0lQX09MRF9GV19BREQgPSA1MAorSVBfT0xEX0ZXX0RFTCA9IDUxCitJUF9PTERfRldfRkxVU0ggPSA1MgorSVBfT0xEX0ZXX1pFUk8gPSA1MworSVBfT0xEX0ZXX0dFVCA9IDU0CitJUF9OQVRfX1hYWCA9IDU1CitJUF9PTERfRldfUkVTRVRMT0cgPSA1NgorSVBfRFVNTVlORVRfQ09ORklHVVJFID0gNjAKK0lQX0RVTU1ZTkVUX0RFTCA9IDYxCitJUF9EVU1NWU5FVF9GTFVTSCA9IDYyCitJUF9EVU1NWU5FVF9HRVQgPSA2NAorSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMID0gMQorSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCA9IDEKK0lQX01BWF9NRU1CRVJTSElQUyA9IDIwCitJUF9QT1JUUkFOR0VfREVGQVVMVCA9IDAKK0lQX1BPUlRSQU5HRV9ISUdIID0gMQorSVBfUE9SVFJBTkdFX0xPVyA9IDIKK0lQUFJPVE9fTUFYSUQgPSAoSVBQUk9UT19BSCArIDEpCitJUENUTF9GT1JXQVJESU5HID0gMQorSVBDVExfU0VORFJFRElSRUNUUyA9IDIKK0lQQ1RMX0RFRlRUTCA9IDMKK0lQQ1RMX0RFRk1UVSA9IDQKK0lQQ1RMX1JURVhQSVJFID0gNQorSVBDVExfUlRNSU5FWFBJUkUgPSA2CitJUENUTF9SVE1BWENBQ0hFID0gNworSVBDVExfU09VUkNFUk9VVEUgPSA4CitJUENUTF9ESVJFQ1RFREJST0FEQ0FTVCA9IDkKK0lQQ1RMX0lOVFJRTUFYTEVOID0gMTAKK0lQQ1RMX0lOVFJRRFJPUFMgPSAxMQorSVBDVExfU1RBVFMgPSAxMgorSVBDVExfQUNDRVBUU09VUkNFUk9VVEUgPSAxMworSVBDVExfRkFTVEZPUldBUkRJTkcgPSAxNAorSVBDVExfS0VFUEZBSVRIID0gMTUKK0lQQ1RMX0dJRl9UVEwgPSAxNgorSVBDVExfTUFYSUQgPSAxNworCisjIEluY2x1ZGVkIGZyb20gbmV0aW5ldDYvaW42LmgKK19fS0FNRV9WRVJTSU9OID0gIjIwMDEwNTI4L2FwcGxlLWRhcndpbiIKK0lQVjZQT1JUX1JFU0VSVkVEID0gMTAyNAorSVBWNlBPUlRfQU5PTk1JTiA9IDQ5MTUyCitJUFY2UE9SVF9BTk9OTUFYID0gNjU1MzUKK0lQVjZQT1JUX1JFU0VSVkVETUlOID0gNjAwCitJUFY2UE9SVF9SRVNFUlZFRE1BWCA9IChJUFY2UE9SVF9SRVNFUlZFRC0xKQorSU5FVDZfQUREUlNUUkxFTiA9IDQ2CitJUFY2X0FERFJfSU5UMzJfT05FID0gMQorSVBWNl9BRERSX0lOVDMyX1RXTyA9IDIKK0lQVjZfQUREUl9JTlQzMl9NTkwgPSAweGZmMDEwMDAwCitJUFY2X0FERFJfSU5UMzJfTUxMID0gMHhmZjAyMDAwMAorSVBWNl9BRERSX0lOVDMyX1NNUCA9IDB4MDAwMGZmZmYKK0lQVjZfQUREUl9JTlQxNl9VTEwgPSAweGZlODAKK0lQVjZfQUREUl9JTlQxNl9VU0wgPSAweGZlYzAKK0lQVjZfQUREUl9JTlQxNl9NTEwgPSAweGZmMDIKK0lQVjZfQUREUl9JTlQzMl9PTkUgPSAweDAxMDAwMDAwCitJUFY2X0FERFJfSU5UMzJfVFdPID0gMHgwMjAwMDAwMAorSVBWNl9BRERSX0lOVDMyX01OTCA9IDB4MDAwMDAxZmYKK0lQVjZfQUREUl9JTlQzMl9NTEwgPSAweDAwMDAwMmZmCitJUFY2X0FERFJfSU5UMzJfU01QID0gMHhmZmZmMDAwMAorSVBWNl9BRERSX0lOVDE2X1VMTCA9IDB4ODBmZQorSVBWNl9BRERSX0lOVDE2X1VTTCA9IDB4YzBmZQorSVBWNl9BRERSX0lOVDE2X01MTCA9IDB4MDJmZgorZGVmIElONl9JU19BRERSX1VOU1BFQ0lGSUVEKGEpOiByZXR1cm4gXAorCitkZWYgSU42X0lTX0FERFJfTE9PUEJBQ0soYSk6IHJldHVybiBcCisKK2RlZiBJTjZfSVNfQUREUl9WNENPTVBBVChhKTogcmV0dXJuIFwKKworZGVmIElONl9JU19BRERSX1Y0TUFQUEVEKGEpOiByZXR1cm4gXAorCitJUFY2X0FERFJfU0NPUEVfTk9ERUxPQ0FMID0gMHgwMQorSVBWNl9BRERSX1NDT1BFX0xJTktMT0NBTCA9IDB4MDIKK0lQVjZfQUREUl9TQ09QRV9TSVRFTE9DQUwgPSAweDA1CitJUFY2X0FERFJfU0NPUEVfT1JHTE9DQUwgPSAweDA4CitJUFY2X0FERFJfU0NPUEVfR0xPQkFMID0gMHgwZQorX19JUFY2X0FERFJfU0NPUEVfTk9ERUxPQ0FMID0gMHgwMQorX19JUFY2X0FERFJfU0NPUEVfTElOS0xPQ0FMID0gMHgwMgorX19JUFY2X0FERFJfU0NPUEVfU0lURUxPQ0FMID0gMHgwNQorX19JUFY2X0FERFJfU0NPUEVfT1JHTE9DQUwgPSAweDA4CitfX0lQVjZfQUREUl9TQ09QRV9HTE9CQUwgPSAweDBlCitkZWYgSU42X0lTX0FERFJfTElOS0xPQ0FMKGEpOiByZXR1cm4gXAorCitkZWYgSU42X0lTX0FERFJfU0lURUxPQ0FMKGEpOiByZXR1cm4gXAorCitkZWYgSU42X0lTX0FERFJfTUNfTk9ERUxPQ0FMKGEpOiByZXR1cm4gXAorCitkZWYgSU42X0lTX0FERFJfTUNfTElOS0xPQ0FMKGEpOiByZXR1cm4gXAorCitkZWYgSU42X0lTX0FERFJfTUNfU0lURUxPQ0FMKGEpOiByZXR1cm4gXAorCitkZWYgSU42X0lTX0FERFJfTUNfT1JHTE9DQUwoYSk6IHJldHVybiBcCisKK2RlZiBJTjZfSVNfQUREUl9NQ19HTE9CQUwoYSk6IHJldHVybiBcCisKK2RlZiBJTjZfSVNfQUREUl9NQ19OT0RFTE9DQUwoYSk6IHJldHVybiBcCisKK2RlZiBJTjZfSVNfQUREUl9NQ19MSU5LTE9DQUwoYSk6IHJldHVybiBcCisKK2RlZiBJTjZfSVNfQUREUl9NQ19TSVRFTE9DQUwoYSk6IHJldHVybiBcCisKK2RlZiBJTjZfSVNfQUREUl9NQ19PUkdMT0NBTChhKTogcmV0dXJuIFwKKworZGVmIElONl9JU19BRERSX01DX0dMT0JBTChhKTogcmV0dXJuIFwKKworZGVmIElONl9JU19TQ09QRV9MSU5LTE9DQUwoYSk6IHJldHVybiBcCisKK2RlZiBJRkE2X0lTX0RFUFJFQ0FURUQoYSk6IHJldHVybiBcCisKK2RlZiBJRkE2X0lTX0lOVkFMSUQoYSk6IHJldHVybiBcCisKK0lQVjZfT1BUSU9OUyA9IDEKK0lQVjZfUkVDVk9QVFMgPSA1CitJUFY2X1JFQ1ZSRVRPUFRTID0gNgorSVBWNl9SRUNWRFNUQUREUiA9IDcKK0lQVjZfUkVUT1BUUyA9IDgKK0lQVjZfU09DS09QVF9SRVNFUlZFRDEgPSAzCitJUFY2X1VOSUNBU1RfSE9QUyA9IDQKK0lQVjZfTVVMVElDQVNUX0lGID0gOQorSVBWNl9NVUxUSUNBU1RfSE9QUyA9IDEwCitJUFY2X01VTFRJQ0FTVF9MT09QID0gMTEKK0lQVjZfSk9JTl9HUk9VUCA9IDEyCitJUFY2X0xFQVZFX0dST1VQID0gMTMKK0lQVjZfUE9SVFJBTkdFID0gMTQKK0lDTVA2X0ZJTFRFUiA9IDE4CitJUFY2X1BLVElORk8gPSAxOQorSVBWNl9IT1BMSU1JVCA9IDIwCitJUFY2X05FWFRIT1AgPSAyMQorSVBWNl9IT1BPUFRTID0gMjIKK0lQVjZfRFNUT1BUUyA9IDIzCitJUFY2X1JUSERSID0gMjQKK0lQVjZfUEtUT1BUSU9OUyA9IDI1CitJUFY2X0NIRUNLU1VNID0gMjYKK0lQVjZfVjZPTkxZID0gMjcKK0lQVjZfQklORFY2T05MWSA9IElQVjZfVjZPTkxZCitJUFY2X0lQU0VDX1BPTElDWSA9IDI4CitJUFY2X0ZBSVRIID0gMjkKK0lQVjZfRldfQUREID0gMzAKK0lQVjZfRldfREVMID0gMzEKK0lQVjZfRldfRkxVU0ggPSAzMgorSVBWNl9GV19aRVJPID0gMzMKK0lQVjZfRldfR0VUID0gMzQKK0lQVjZfUlRIRFJfTE9PU0UgPSAwCitJUFY2X1JUSERSX1NUUklDVCA9IDEKK0lQVjZfUlRIRFJfVFlQRV8wID0gMAorSVBWNl9ERUZBVUxUX01VTFRJQ0FTVF9IT1BTID0gMQorSVBWNl9ERUZBVUxUX01VTFRJQ0FTVF9MT09QID0gMQorSVBWNl9QT1JUUkFOR0VfREVGQVVMVCA9IDAKK0lQVjZfUE9SVFJBTkdFX0hJR0ggPSAxCitJUFY2X1BPUlRSQU5HRV9MT1cgPSAyCitJUFY2UFJPVE9fTUFYSUQgPSAoSVBQUk9UT19QSU0gKyAxKQorSVBWNkNUTF9GT1JXQVJESU5HID0gMQorSVBWNkNUTF9TRU5EUkVESVJFQ1RTID0gMgorSVBWNkNUTF9ERUZITElNID0gMworSVBWNkNUTF9ERUZNVFUgPSA0CitJUFY2Q1RMX0ZPUldTUkNSVCA9IDUKK0lQVjZDVExfU1RBVFMgPSA2CitJUFY2Q1RMX01SVFNUQVRTID0gNworSVBWNkNUTF9NUlRQUk9UTyA9IDgKK0lQVjZDVExfTUFYRlJBR1BBQ0tFVFMgPSA5CitJUFY2Q1RMX1NPVVJDRUNIRUNLID0gMTAKK0lQVjZDVExfU09VUkNFQ0hFQ0tfTE9HSU5UID0gMTEKK0lQVjZDVExfQUNDRVBUX1JUQURWID0gMTIKK0lQVjZDVExfS0VFUEZBSVRIID0gMTMKK0lQVjZDVExfTE9HX0lOVEVSVkFMID0gMTQKK0lQVjZDVExfSERSTkVTVExJTUlUID0gMTUKK0lQVjZDVExfREFEX0NPVU5UID0gMTYKK0lQVjZDVExfQVVUT19GTE9XTEFCRUwgPSAxNworSVBWNkNUTF9ERUZNQ0FTVEhMSU0gPSAxOAorSVBWNkNUTF9HSUZfSExJTSA9IDE5CitJUFY2Q1RMX0tBTUVfVkVSU0lPTiA9IDIwCitJUFY2Q1RMX1VTRV9ERVBSRUNBVEVEID0gMjEKK0lQVjZDVExfUlJfUFJVTkUgPSAyMgorSVBWNkNUTF9NQVBQRURfQUREUiA9IDIzCitJUFY2Q1RMX1Y2T05MWSA9IDI0CitJUFY2Q1RMX1JURVhQSVJFID0gMjUKK0lQVjZDVExfUlRNSU5FWFBJUkUgPSAyNgorSVBWNkNUTF9SVE1BWENBQ0hFID0gMjcKK0lQVjZDVExfVVNFVEVNUEFERFIgPSAzMgorSVBWNkNUTF9URU1QUExUSU1FID0gMzMKK0lQVjZDVExfVEVNUFZMVElNRSA9IDM0CitJUFY2Q1RMX0FVVE9fTElOS0xPQ0FMID0gMzUKK0lQVjZDVExfUklQNlNUQVRTID0gMzYKK0lQVjZDVExfTUFYSUQgPSAzNwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LWRhcndpbi9JTi5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtZGFyd2luL0lOLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTUzMTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LWRhcndpbi9JTi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LWRhcndpbi9JTi5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtZGFyd2luL0lOLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTUzMTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LWRhcndpbi9JTi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LWRhcndpbi9yZWdlbiBiL2xpYi9weXRob24yLjcvcGxhdC1kYXJ3aW4vcmVnZW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTIwY2RjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1kYXJ3aW4vcmVnZW4KQEAgLTAsMCArMSwzIEBACisjISAvYmluL3NoCitzZXQgLXYKK3B5dGhvbiRFWEUgLi4vLi4vVG9vbHMvc2NyaXB0cy9oMnB5LnB5IC1pICcodV9sb25nKScgL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9BdWRpb19tYWMucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0F1ZGlvX21hYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGYyYTFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9BdWRpb19tYWMucHkKQEAgLTAsMCArMSwxMjQgQEAKK1FTSVpFID0gMTAwMDAwCitlcnJvcj0nQXVkaW9fbWFjLmVycm9yJworCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIFBsYXlfQXVkaW9fbWFjIG1vZHVsZSBpcyByZW1vdmVkLiIsIHN0YWNrbGV2ZWw9MikKKworY2xhc3MgUGxheV9BdWRpb19tYWM6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcXNpemU9UVNJWkUpOgorICAgICAgICBzZWxmLl9jaGFuID0gTm9uZQorICAgICAgICBzZWxmLl9xc2l6ZSA9IHFzaXplCisgICAgICAgIHNlbGYuX291dHJhdGUgPSAyMjI1NAorICAgICAgICBzZWxmLl9zYW1wd2lkdGggPSAxCisgICAgICAgIHNlbGYuX25jaGFubmVscyA9IDEKKyAgICAgICAgc2VsZi5fZ2MgPSBbXQorICAgICAgICBzZWxmLl91c2VyY2FsbGJhY2sgPSBOb25lCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zdG9wKCkKKyAgICAgICAgc2VsZi5fdXNlcmNhbGxiYWNrID0gTm9uZQorCisgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIHdoaWxlIHNlbGYuZ2V0ZmlsbGVkKCk6CisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAgICAgc2VsZi5fY2hhbiA9IE5vbmUKKyAgICAgICAgc2VsZi5fZ2MgPSBbXQorCisgICAgZGVmIHN0b3Aoc2VsZiwgcXVpZXROb3cgPSAxKToKKyAgICAgICAgIyNjaGFuID0gc2VsZi5fY2hhbgorICAgICAgICBzZWxmLl9jaGFuID0gTm9uZQorICAgICAgICAjI2NoYW4uU25kRGlzcG9zZUNoYW5uZWwoMSkKKyAgICAgICAgc2VsZi5fZ2MgPSBbXQorCisgICAgZGVmIHNldG91dHJhdGUoc2VsZiwgb3V0cmF0ZSk6CisgICAgICAgIHNlbGYuX291dHJhdGUgPSBvdXRyYXRlCisKKyAgICBkZWYgc2V0c2FtcHdpZHRoKHNlbGYsIHNhbXB3aWR0aCk6CisgICAgICAgIHNlbGYuX3NhbXB3aWR0aCA9IHNhbXB3aWR0aAorCisgICAgZGVmIHNldG5jaGFubmVscyhzZWxmLCBuY2hhbm5lbHMpOgorICAgICAgICBzZWxmLl9uY2hhbm5lbHMgPSBuY2hhbm5lbHMKKworICAgIGRlZiB3cml0ZWZyYW1lcyhzZWxmLCBkYXRhKToKKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgZnJvbSBDYXJib24uU291bmQgaW1wb3J0IGJ1ZmZlckNtZCwgY2FsbEJhY2tDbWQsIGV4dFNICisgICAgICAgIGltcG9ydCBzdHJ1Y3QKKyAgICAgICAgaW1wb3J0IE1hY09TCisgICAgICAgIGlmIG5vdCBzZWxmLl9jaGFuOgorICAgICAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IFNuZAorICAgICAgICAgICAgc2VsZi5fY2hhbiA9IFNuZC5TbmROZXdDaGFubmVsKDUsIDAsIHNlbGYuX2NhbGxiYWNrKQorICAgICAgICBuZnJhbWVzID0gbGVuKGRhdGEpIC8gc2VsZi5fbmNoYW5uZWxzIC8gc2VsZi5fc2FtcHdpZHRoCisgICAgICAgIGlmIGxlbihkYXRhKSAhPSBuZnJhbWVzICogc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fc2FtcHdpZHRoOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsICdkYXRhIGlzIG5vdCBhIHdob2xlIG51bWJlciBvZiBmcmFtZXMnCisgICAgICAgIHdoaWxlIHNlbGYuX2djIGFuZCBcCisgICAgICAgICAgICAgIHNlbGYuZ2V0ZmlsbGVkKCkgKyBuZnJhbWVzID4gXAorICAgICAgICAgICAgICAgIHNlbGYuX3FzaXplIC8gc2VsZi5fbmNoYW5uZWxzIC8gc2VsZi5fc2FtcHdpZHRoOgorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgIGlmIHNlbGYuX3NhbXB3aWR0aCA9PSAxOgorICAgICAgICAgICAgaW1wb3J0IGF1ZGlvb3AKKyAgICAgICAgICAgIGRhdGEgPSBhdWRpb29wLmFkZChkYXRhLCAnXHg4MCcqbGVuKGRhdGEpLCAxKQorICAgICAgICBoMSA9IHN0cnVjdC5wYWNrKCdsbEhobGxiYmwnLAorICAgICAgICAgICAgaWQoZGF0YSkrTWFjT1Muc3RyaW5nX2lkX3RvX2J1ZmZlciwKKyAgICAgICAgICAgIHNlbGYuX25jaGFubmVscywKKyAgICAgICAgICAgIHNlbGYuX291dHJhdGUsIDAsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIGV4dFNILAorICAgICAgICAgICAgNjAsCisgICAgICAgICAgICBuZnJhbWVzKQorICAgICAgICBoMiA9IDIyKidcMCcKKyAgICAgICAgaDMgPSBzdHJ1Y3QucGFjaygnaGhsbGwnLAorICAgICAgICAgICAgc2VsZi5fc2FtcHdpZHRoKjgsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwKQorICAgICAgICBoZWFkZXIgPSBoMStoMitoMworICAgICAgICBzZWxmLl9nYy5hcHBlbmQoKGhlYWRlciwgZGF0YSkpCisgICAgICAgIHNlbGYuX2NoYW4uU25kRG9Db21tYW5kKChidWZmZXJDbWQsIDAsIGhlYWRlciksIDApCisgICAgICAgIHNlbGYuX2NoYW4uU25kRG9Db21tYW5kKChjYWxsQmFja0NtZCwgMCwgMCksIDApCisKKyAgICBkZWYgX2NhbGxiYWNrKHNlbGYsICphcmdzKToKKyAgICAgICAgZGVsIHNlbGYuX2djWzBdCisgICAgICAgIGlmIHNlbGYuX3VzZXJjYWxsYmFjazoKKyAgICAgICAgICAgIHNlbGYuX3VzZXJjYWxsYmFjaygpCisKKyAgICBkZWYgc2V0Y2FsbGJhY2soc2VsZiwgY2FsbGJhY2spOgorICAgICAgICBzZWxmLl91c2VyY2FsbGJhY2sgPSBjYWxsYmFjaworCisgICAgZGVmIGdldGZpbGxlZChzZWxmKToKKyAgICAgICAgZmlsbGVkID0gMAorICAgICAgICBmb3IgaGVhZGVyLCBkYXRhIGluIHNlbGYuX2djOgorICAgICAgICAgICAgZmlsbGVkID0gZmlsbGVkICsgbGVuKGRhdGEpCisgICAgICAgIHJldHVybiBmaWxsZWQgLyBzZWxmLl9uY2hhbm5lbHMgLyBzZWxmLl9zYW1wd2lkdGgKKworICAgIGRlZiBnZXRmaWxsYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLl9xc2l6ZSAvIHNlbGYuX25jaGFubmVscyAvIHNlbGYuX3NhbXB3aWR0aCkgLSBzZWxmLmdldGZpbGxlZCgpCisKKyAgICBkZWYgdWxhdzJsaW4oc2VsZiwgZGF0YSk6CisgICAgICAgIGltcG9ydCBhdWRpb29wCisgICAgICAgIHJldHVybiBhdWRpb29wLnVsYXcybGluKGRhdGEsIDIpCisKK2RlZiB0ZXN0KCk6CisgICAgaW1wb3J0IGFpZmMKKyAgICBpbXBvcnQgRWFzeURpYWxvZ3MKKyAgICBmbiA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKG1lc3NhZ2U9IlNlbGVjdCBhbiBBSUZGIHNvdW5kZmlsZSIsIHR5cGVMaXN0PSgiQUlGRiIsKSkKKyAgICBpZiBub3QgZm46IHJldHVybgorICAgIGFmID0gYWlmYy5vcGVuKGZuLCAncicpCisgICAgcHJpbnQgYWYuZ2V0cGFyYW1zKCkKKyAgICBwID0gUGxheV9BdWRpb19tYWMoKQorICAgIHAuc2V0b3V0cmF0ZShhZi5nZXRmcmFtZXJhdGUoKSkKKyAgICBwLnNldHNhbXB3aWR0aChhZi5nZXRzYW1wd2lkdGgoKSkKKyAgICBwLnNldG5jaGFubmVscyhhZi5nZXRuY2hhbm5lbHMoKSkKKyAgICBCVUZTSVogPSAxMDAwMAorICAgIHdoaWxlIDE6CisgICAgICAgIGRhdGEgPSBhZi5yZWFkZnJhbWVzKEJVRlNJWikKKyAgICAgICAgaWYgbm90IGRhdGE6IGJyZWFrCisgICAgICAgIHAud3JpdGVmcmFtZXMoZGF0YSkKKyAgICAgICAgcHJpbnQgJ3dyb3RlJywgbGVuKGRhdGEpLCAnc3BhY2UnLCBwLmdldGZpbGxhYmxlKCkKKyAgICBwLndhaXQoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9BdWRpb19tYWMucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9BdWRpb19tYWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NWFhMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0F1ZGlvX21hYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9BdWRpb19tYWMucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9BdWRpb19tYWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NWFhMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0F1ZGlvX21hYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQUUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BRS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQ2MDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQUUucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfQUUgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FFLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FFLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDM5NzY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQUUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FFLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FFLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDM5NzY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQUUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FILnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQUgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcwMWU3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FILnB5CkBAIC0wLDAgKzEgQEAKK2Zyb20gX0FIIGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BSC5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BSC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxMTY4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FILnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BSC5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BSC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIxMTY4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FILnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BbGlhcy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FsaWFzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNjEyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BbGlhcy5weQpAQCAtMCwwICsxIEBACitmcm9tIF9BbGlhcyBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQWxpYXMucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQWxpYXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNzJlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BbGlhcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQWxpYXMucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQWxpYXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNzJlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BbGlhcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQWxpYXNlcy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FsaWFzZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVlMWExZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FsaWFzZXMucHkKQEAgLTAsMCArMSwxOCBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnQWxpYXNlcy5oJworCitkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4Cit0cnVlID0gVHJ1ZQorZmFsc2UgPSBGYWxzZQorckFsaWFzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhbGlzJykKK2tBUk1Nb3VudFZvbCA9IDB4MDAwMDAwMDEKK2tBUk1Ob1VJID0gMHgwMDAwMDAwMgora0FSTU11bHRWb2xzID0gMHgwMDAwMDAwOAora0FSTVNlYXJjaCA9IDB4MDAwMDAxMDAKK2tBUk1TZWFyY2hNb3JlID0gMHgwMDAwMDIwMAora0FSTVNlYXJjaFJlbEZpcnN0ID0gMHgwMDAwMDQwMAorYXNpWm9uZU5hbWUgPSAtMworYXNpU2VydmVyTmFtZSA9IC0yCithc2lWb2x1bWVOYW1lID0gLTEKK2FzaUFsaWFzTmFtZSA9IDAKK2FzaVBhcmVudE5hbWUgPSAxCitrUmVzb2x2ZUFsaWFzRmlsZU5vVUkgPSAweDAwMDAwMDAxCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BbGlhc2VzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FsaWFzZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmRkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BbGlhc2VzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BbGlhc2VzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FsaWFzZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmRkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BbGlhc2VzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHAucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwZDQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FwcC5weQpAQCAtMCwwICsxIEBACitmcm9tIF9BcHAgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FwcC5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZGYyYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FwcC5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZGYyYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FwcGVhcmFuY2UucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBlYXJhbmNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OWM2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBlYXJhbmNlLnB5CkBAIC0wLDAgKzEsNjQ4IEBACisjIEdlbmVyYXRlZCBmcm9tICdBcHBlYXJhbmNlLmgnCisKK2RlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHgKK2tBcHBlYXJhbmNlRXZlbnRDbGFzcyA9IEZPVVJfQ0hBUl9DT0RFKCdhcHByJykKK2tBRUFwcGVhcmFuY2VDaGFuZ2VkID0gRk9VUl9DSEFSX0NPREUoJ3RobWUnKQora0FFU3lzdGVtRm9udENoYW5nZWQgPSBGT1VSX0NIQVJfQ09ERSgnc3lzZicpCitrQUVTbWFsbFN5c3RlbUZvbnRDaGFuZ2VkID0gRk9VUl9DSEFSX0NPREUoJ3NzZm4nKQora0FFVmlld3NGb250Q2hhbmdlZCA9IEZPVVJfQ0hBUl9DT0RFKCd2Zm50JykKK2tUaGVtZURhdGFGaWxlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0aG1lJykKK2tUaGVtZVBsYXRpbnVtRmlsZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncGx0bicpCitrVGhlbWVDdXN0b21UaGVtZXNGaWxlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzY2VuJykKK2tUaGVtZVNvdW5kVHJhY2tGaWxlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0c25kJykKK2tUaGVtZUJydXNoRGlhbG9nQmFja2dyb3VuZEFjdGl2ZSA9IDEKK2tUaGVtZUJydXNoRGlhbG9nQmFja2dyb3VuZEluYWN0aXZlID0gMgora1RoZW1lQnJ1c2hBbGVydEJhY2tncm91bmRBY3RpdmUgPSAzCitrVGhlbWVCcnVzaEFsZXJ0QmFja2dyb3VuZEluYWN0aXZlID0gNAora1RoZW1lQnJ1c2hNb2RlbGVzc0RpYWxvZ0JhY2tncm91bmRBY3RpdmUgPSA1CitrVGhlbWVCcnVzaE1vZGVsZXNzRGlhbG9nQmFja2dyb3VuZEluYWN0aXZlID0gNgora1RoZW1lQnJ1c2hVdGlsaXR5V2luZG93QmFja2dyb3VuZEFjdGl2ZSA9IDcKK2tUaGVtZUJydXNoVXRpbGl0eVdpbmRvd0JhY2tncm91bmRJbmFjdGl2ZSA9IDgKK2tUaGVtZUJydXNoTGlzdFZpZXdTb3J0Q29sdW1uQmFja2dyb3VuZCA9IDkKK2tUaGVtZUJydXNoTGlzdFZpZXdCYWNrZ3JvdW5kID0gMTAKK2tUaGVtZUJydXNoSWNvbkxhYmVsQmFja2dyb3VuZCA9IDExCitrVGhlbWVCcnVzaExpc3RWaWV3U2VwYXJhdG9yID0gMTIKK2tUaGVtZUJydXNoQ2hhc2luZ0Fycm93cyA9IDEzCitrVGhlbWVCcnVzaERyYWdIaWxpdGUgPSAxNAora1RoZW1lQnJ1c2hEb2N1bWVudFdpbmRvd0JhY2tncm91bmQgPSAxNQora1RoZW1lQnJ1c2hGaW5kZXJXaW5kb3dCYWNrZ3JvdW5kID0gMTYKK2tUaGVtZUJydXNoU2Nyb2xsQmFyRGVsaW1pdGVyQWN0aXZlID0gMTcKK2tUaGVtZUJydXNoU2Nyb2xsQmFyRGVsaW1pdGVySW5hY3RpdmUgPSAxOAora1RoZW1lQnJ1c2hGb2N1c0hpZ2hsaWdodCA9IDE5CitrVGhlbWVCcnVzaFBvcHVwQXJyb3dBY3RpdmUgPSAyMAora1RoZW1lQnJ1c2hQb3B1cEFycm93UHJlc3NlZCA9IDIxCitrVGhlbWVCcnVzaFBvcHVwQXJyb3dJbmFjdGl2ZSA9IDIyCitrVGhlbWVCcnVzaEFwcGxlR3VpZGVDb2FjaG1hcmsgPSAyMwora1RoZW1lQnJ1c2hJY29uTGFiZWxCYWNrZ3JvdW5kU2VsZWN0ZWQgPSAyNAora1RoZW1lQnJ1c2hTdGF0aWNBcmVhRmlsbCA9IDI1CitrVGhlbWVCcnVzaEFjdGl2ZUFyZWFGaWxsID0gMjYKK2tUaGVtZUJydXNoQnV0dG9uRnJhbWVBY3RpdmUgPSAyNwora1RoZW1lQnJ1c2hCdXR0b25GcmFtZUluYWN0aXZlID0gMjgKK2tUaGVtZUJydXNoQnV0dG9uRmFjZUFjdGl2ZSA9IDI5CitrVGhlbWVCcnVzaEJ1dHRvbkZhY2VJbmFjdGl2ZSA9IDMwCitrVGhlbWVCcnVzaEJ1dHRvbkZhY2VQcmVzc2VkID0gMzEKK2tUaGVtZUJydXNoQnV0dG9uQWN0aXZlRGFya1NoYWRvdyA9IDMyCitrVGhlbWVCcnVzaEJ1dHRvbkFjdGl2ZURhcmtIaWdobGlnaHQgPSAzMwora1RoZW1lQnJ1c2hCdXR0b25BY3RpdmVMaWdodFNoYWRvdyA9IDM0CitrVGhlbWVCcnVzaEJ1dHRvbkFjdGl2ZUxpZ2h0SGlnaGxpZ2h0ID0gMzUKK2tUaGVtZUJydXNoQnV0dG9uSW5hY3RpdmVEYXJrU2hhZG93ID0gMzYKK2tUaGVtZUJydXNoQnV0dG9uSW5hY3RpdmVEYXJrSGlnaGxpZ2h0ID0gMzcKK2tUaGVtZUJydXNoQnV0dG9uSW5hY3RpdmVMaWdodFNoYWRvdyA9IDM4CitrVGhlbWVCcnVzaEJ1dHRvbkluYWN0aXZlTGlnaHRIaWdobGlnaHQgPSAzOQora1RoZW1lQnJ1c2hCdXR0b25QcmVzc2VkRGFya1NoYWRvdyA9IDQwCitrVGhlbWVCcnVzaEJ1dHRvblByZXNzZWREYXJrSGlnaGxpZ2h0ID0gNDEKK2tUaGVtZUJydXNoQnV0dG9uUHJlc3NlZExpZ2h0U2hhZG93ID0gNDIKK2tUaGVtZUJydXNoQnV0dG9uUHJlc3NlZExpZ2h0SGlnaGxpZ2h0ID0gNDMKK2tUaGVtZUJydXNoQmV2ZWxBY3RpdmVMaWdodCA9IDQ0CitrVGhlbWVCcnVzaEJldmVsQWN0aXZlRGFyayA9IDQ1CitrVGhlbWVCcnVzaEJldmVsSW5hY3RpdmVMaWdodCA9IDQ2CitrVGhlbWVCcnVzaEJldmVsSW5hY3RpdmVEYXJrID0gNDcKK2tUaGVtZUJydXNoTm90aWZpY2F0aW9uV2luZG93QmFja2dyb3VuZCA9IDQ4CitrVGhlbWVCcnVzaE1vdmFibGVNb2RhbEJhY2tncm91bmQgPSA0OQora1RoZW1lQnJ1c2hTaGVldEJhY2tncm91bmRPcGFxdWUgPSA1MAora1RoZW1lQnJ1c2hEcmF3ZXJCYWNrZ3JvdW5kID0gNTEKK2tUaGVtZUJydXNoVG9vbGJhckJhY2tncm91bmQgPSA1Mgora1RoZW1lQnJ1c2hTaGVldEJhY2tncm91bmRUcmFuc3BhcmVudCA9IDUzCitrVGhlbWVCcnVzaE1lbnVCYWNrZ3JvdW5kID0gNTQKK2tUaGVtZUJydXNoTWVudUJhY2tncm91bmRTZWxlY3RlZCA9IDU1CitrVGhlbWVCcnVzaFNoZWV0QmFja2dyb3VuZCA9IGtUaGVtZUJydXNoU2hlZXRCYWNrZ3JvdW5kT3BhcXVlCitrVGhlbWVCcnVzaEJsYWNrID0gLTEKK2tUaGVtZUJydXNoV2hpdGUgPSAtMgora1RoZW1lQnJ1c2hQcmltYXJ5SGlnaGxpZ2h0Q29sb3IgPSAtMwora1RoZW1lQnJ1c2hTZWNvbmRhcnlIaWdobGlnaHRDb2xvciA9IC00CitrVGhlbWVUZXh0Q29sb3JEaWFsb2dBY3RpdmUgPSAxCitrVGhlbWVUZXh0Q29sb3JEaWFsb2dJbmFjdGl2ZSA9IDIKK2tUaGVtZVRleHRDb2xvckFsZXJ0QWN0aXZlID0gMwora1RoZW1lVGV4dENvbG9yQWxlcnRJbmFjdGl2ZSA9IDQKK2tUaGVtZVRleHRDb2xvck1vZGVsZXNzRGlhbG9nQWN0aXZlID0gNQora1RoZW1lVGV4dENvbG9yTW9kZWxlc3NEaWFsb2dJbmFjdGl2ZSA9IDYKK2tUaGVtZVRleHRDb2xvcldpbmRvd0hlYWRlckFjdGl2ZSA9IDcKK2tUaGVtZVRleHRDb2xvcldpbmRvd0hlYWRlckluYWN0aXZlID0gOAora1RoZW1lVGV4dENvbG9yUGxhY2FyZEFjdGl2ZSA9IDkKK2tUaGVtZVRleHRDb2xvclBsYWNhcmRJbmFjdGl2ZSA9IDEwCitrVGhlbWVUZXh0Q29sb3JQbGFjYXJkUHJlc3NlZCA9IDExCitrVGhlbWVUZXh0Q29sb3JQdXNoQnV0dG9uQWN0aXZlID0gMTIKK2tUaGVtZVRleHRDb2xvclB1c2hCdXR0b25JbmFjdGl2ZSA9IDEzCitrVGhlbWVUZXh0Q29sb3JQdXNoQnV0dG9uUHJlc3NlZCA9IDE0CitrVGhlbWVUZXh0Q29sb3JCZXZlbEJ1dHRvbkFjdGl2ZSA9IDE1CitrVGhlbWVUZXh0Q29sb3JCZXZlbEJ1dHRvbkluYWN0aXZlID0gMTYKK2tUaGVtZVRleHRDb2xvckJldmVsQnV0dG9uUHJlc3NlZCA9IDE3CitrVGhlbWVUZXh0Q29sb3JQb3B1cEJ1dHRvbkFjdGl2ZSA9IDE4CitrVGhlbWVUZXh0Q29sb3JQb3B1cEJ1dHRvbkluYWN0aXZlID0gMTkKK2tUaGVtZVRleHRDb2xvclBvcHVwQnV0dG9uUHJlc3NlZCA9IDIwCitrVGhlbWVUZXh0Q29sb3JJY29uTGFiZWwgPSAyMQora1RoZW1lVGV4dENvbG9yTGlzdFZpZXcgPSAyMgora1RoZW1lVGV4dENvbG9yRG9jdW1lbnRXaW5kb3dUaXRsZUFjdGl2ZSA9IDIzCitrVGhlbWVUZXh0Q29sb3JEb2N1bWVudFdpbmRvd1RpdGxlSW5hY3RpdmUgPSAyNAora1RoZW1lVGV4dENvbG9yTW92YWJsZU1vZGFsV2luZG93VGl0bGVBY3RpdmUgPSAyNQora1RoZW1lVGV4dENvbG9yTW92YWJsZU1vZGFsV2luZG93VGl0bGVJbmFjdGl2ZSA9IDI2CitrVGhlbWVUZXh0Q29sb3JVdGlsaXR5V2luZG93VGl0bGVBY3RpdmUgPSAyNwora1RoZW1lVGV4dENvbG9yVXRpbGl0eVdpbmRvd1RpdGxlSW5hY3RpdmUgPSAyOAora1RoZW1lVGV4dENvbG9yUG9wdXBXaW5kb3dUaXRsZUFjdGl2ZSA9IDI5CitrVGhlbWVUZXh0Q29sb3JQb3B1cFdpbmRvd1RpdGxlSW5hY3RpdmUgPSAzMAora1RoZW1lVGV4dENvbG9yUm9vdE1lbnVBY3RpdmUgPSAzMQora1RoZW1lVGV4dENvbG9yUm9vdE1lbnVTZWxlY3RlZCA9IDMyCitrVGhlbWVUZXh0Q29sb3JSb290TWVudURpc2FibGVkID0gMzMKK2tUaGVtZVRleHRDb2xvck1lbnVJdGVtQWN0aXZlID0gMzQKK2tUaGVtZVRleHRDb2xvck1lbnVJdGVtU2VsZWN0ZWQgPSAzNQora1RoZW1lVGV4dENvbG9yTWVudUl0ZW1EaXNhYmxlZCA9IDM2CitrVGhlbWVUZXh0Q29sb3JQb3B1cExhYmVsQWN0aXZlID0gMzcKK2tUaGVtZVRleHRDb2xvclBvcHVwTGFiZWxJbmFjdGl2ZSA9IDM4CitrVGhlbWVUZXh0Q29sb3JUYWJGcm9udEFjdGl2ZSA9IDM5CitrVGhlbWVUZXh0Q29sb3JUYWJOb25Gcm9udEFjdGl2ZSA9IDQwCitrVGhlbWVUZXh0Q29sb3JUYWJOb25Gcm9udFByZXNzZWQgPSA0MQora1RoZW1lVGV4dENvbG9yVGFiRnJvbnRJbmFjdGl2ZSA9IDQyCitrVGhlbWVUZXh0Q29sb3JUYWJOb25Gcm9udEluYWN0aXZlID0gNDMKK2tUaGVtZVRleHRDb2xvckljb25MYWJlbFNlbGVjdGVkID0gNDQKK2tUaGVtZVRleHRDb2xvckJldmVsQnV0dG9uU3RpY2t5QWN0aXZlID0gNDUKK2tUaGVtZVRleHRDb2xvckJldmVsQnV0dG9uU3RpY2t5SW5hY3RpdmUgPSA0Ngora1RoZW1lVGV4dENvbG9yTm90aWZpY2F0aW9uID0gNDcKK2tUaGVtZVRleHRDb2xvckJsYWNrID0gLTEKK2tUaGVtZVRleHRDb2xvcldoaXRlID0gLTIKK2tUaGVtZVN0YXRlSW5hY3RpdmUgPSAwCitrVGhlbWVTdGF0ZUFjdGl2ZSA9IDEKK2tUaGVtZVN0YXRlUHJlc3NlZCA9IDIKK2tUaGVtZVN0YXRlUm9sbG92ZXIgPSA2CitrVGhlbWVTdGF0ZVVuYXZhaWxhYmxlID0gNwora1RoZW1lU3RhdGVVbmF2YWlsYWJsZUluYWN0aXZlID0gOAora1RoZW1lU3RhdGVEaXNhYmxlZCA9IDAKK2tUaGVtZVN0YXRlUHJlc3NlZFVwID0gMgora1RoZW1lU3RhdGVQcmVzc2VkRG93biA9IDMKK2tUaGVtZUFycm93Q3Vyc29yID0gMAora1RoZW1lQ29weUFycm93Q3Vyc29yID0gMQora1RoZW1lQWxpYXNBcnJvd0N1cnNvciA9IDIKK2tUaGVtZUNvbnRleHR1YWxNZW51QXJyb3dDdXJzb3IgPSAzCitrVGhlbWVJQmVhbUN1cnNvciA9IDQKK2tUaGVtZUNyb3NzQ3Vyc29yID0gNQora1RoZW1lUGx1c0N1cnNvciA9IDYKK2tUaGVtZVdhdGNoQ3Vyc29yID0gNwora1RoZW1lQ2xvc2VkSGFuZEN1cnNvciA9IDgKK2tUaGVtZU9wZW5IYW5kQ3Vyc29yID0gOQora1RoZW1lUG9pbnRpbmdIYW5kQ3Vyc29yID0gMTAKK2tUaGVtZUNvdW50aW5nVXBIYW5kQ3Vyc29yID0gMTEKK2tUaGVtZUNvdW50aW5nRG93bkhhbmRDdXJzb3IgPSAxMgora1RoZW1lQ291bnRpbmdVcEFuZERvd25IYW5kQ3Vyc29yID0gMTMKK2tUaGVtZVNwaW5uaW5nQ3Vyc29yID0gMTQKK2tUaGVtZVJlc2l6ZUxlZnRDdXJzb3IgPSAxNQora1RoZW1lUmVzaXplUmlnaHRDdXJzb3IgPSAxNgora1RoZW1lUmVzaXplTGVmdFJpZ2h0Q3Vyc29yID0gMTcKK2tUaGVtZU1lbnVCYXJOb3JtYWwgPSAwCitrVGhlbWVNZW51QmFyU2VsZWN0ZWQgPSAxCitrVGhlbWVNZW51U3F1YXJlTWVudUJhciA9ICgxIDw8IDApCitrVGhlbWVNZW51QWN0aXZlID0gMAora1RoZW1lTWVudVNlbGVjdGVkID0gMQora1RoZW1lTWVudURpc2FibGVkID0gMwora1RoZW1lTWVudVR5cGVQdWxsRG93biA9IDAKK2tUaGVtZU1lbnVUeXBlUG9wVXAgPSAxCitrVGhlbWVNZW51VHlwZUhpZXJhcmNoaWNhbCA9IDIKK2tUaGVtZU1lbnVUeXBlSW5hY3RpdmUgPSAweDAxMDAKK2tUaGVtZU1lbnVJdGVtUGxhaW4gPSAwCitrVGhlbWVNZW51SXRlbUhpZXJhcmNoaWNhbCA9IDEKK2tUaGVtZU1lbnVJdGVtU2Nyb2xsVXBBcnJvdyA9IDIKK2tUaGVtZU1lbnVJdGVtU2Nyb2xsRG93bkFycm93ID0gMwora1RoZW1lTWVudUl0ZW1BdFRvcCA9IDB4MDEwMAora1RoZW1lTWVudUl0ZW1BdEJvdHRvbSA9IDB4MDIwMAora1RoZW1lTWVudUl0ZW1IaWVyQmFja2dyb3VuZCA9IDB4MDQwMAora1RoZW1lTWVudUl0ZW1Qb3BVcEJhY2tncm91bmQgPSAweDA4MDAKK2tUaGVtZU1lbnVJdGVtSGFzSWNvbiA9IDB4ODAwMAora1RoZW1lTWVudUl0ZW1Ob0JhY2tncm91bmQgPSAweDQwMDAKK2tUaGVtZUJhY2tncm91bmRUYWJQYW5lID0gMQora1RoZW1lQmFja2dyb3VuZFBsYWNhcmQgPSAyCitrVGhlbWVCYWNrZ3JvdW5kV2luZG93SGVhZGVyID0gMwora1RoZW1lQmFja2dyb3VuZExpc3RWaWV3V2luZG93SGVhZGVyID0gNAora1RoZW1lQmFja2dyb3VuZFNlY29uZGFyeUdyb3VwQm94ID0gNQora1RoZW1lTmFtZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCduYW1lJykKK2tUaGVtZVZhcmlhbnROYW1lVGFnID0gRk9VUl9DSEFSX0NPREUoJ3Zhcm4nKQora1RoZW1lVmFyaWFudEJhc2VUaW50VGFnID0gRk9VUl9DSEFSX0NPREUoJ3RpbnQnKQora1RoZW1lSGlnaGxpZ2h0Q29sb3JUYWcgPSBGT1VSX0NIQVJfQ09ERSgnaGNvbCcpCitrVGhlbWVTY3JvbGxCYXJBcnJvd1N0eWxlVGFnID0gRk9VUl9DSEFSX0NPREUoJ3NiYXInKQora1RoZW1lU2Nyb2xsQmFyVGh1bWJTdHlsZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdzYnRoJykKK2tUaGVtZVNvdW5kc0VuYWJsZWRUYWcgPSBGT1VSX0NIQVJfQ09ERSgnc25kcycpCitrVGhlbWVEYmxDbGlja0NvbGxhcHNlVGFnID0gRk9VUl9DSEFSX0NPREUoJ2NvbGwnKQora1RoZW1lQXBwZWFyYW5jZUZpbGVOYW1lVGFnID0gRk9VUl9DSEFSX0NPREUoJ3RobWUnKQora1RoZW1lU3lzdGVtRm9udFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdsZ3NmJykKK2tUaGVtZVNtYWxsU3lzdGVtRm9udFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdzbXNmJykKK2tUaGVtZVZpZXdzRm9udFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCd2Zm50JykKK2tUaGVtZVZpZXdzRm9udFNpemVUYWcgPSBGT1VSX0NIQVJfQ09ERSgndmZzeicpCitrVGhlbWVEZXNrdG9wUGF0dGVybk5hbWVUYWcgPSBGT1VSX0NIQVJfQ09ERSgncGF0bicpCitrVGhlbWVEZXNrdG9wUGF0dGVyblRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdwYXR0JykKK2tUaGVtZURlc2t0b3BQaWN0dXJlTmFtZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdkcG5tJykKK2tUaGVtZURlc2t0b3BQaWN0dXJlQWxpYXNUYWcgPSBGT1VSX0NIQVJfQ09ERSgnZHBhbCcpCitrVGhlbWVEZXNrdG9wUGljdHVyZUFsaWdubWVudFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdkcGFuJykKK2tUaGVtZUhpZ2hsaWdodENvbG9yTmFtZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdoY25tJykKK2tUaGVtZUV4YW1wbGVQaWN0dXJlSURUYWcgPSBGT1VSX0NIQVJfQ09ERSgnZXBpYycpCitrVGhlbWVTb3VuZFRyYWNrTmFtZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdzbmR0JykKK2tUaGVtZVNvdW5kTWFza1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdzbXNrJykKK2tUaGVtZVVzZXJEZWZpbmVkVGFnID0gRk9VUl9DSEFSX0NPREUoJ3VzZXInKQora1RoZW1lU21vb3RoRm9udEVuYWJsZWRUYWcgPSBGT1VSX0NIQVJfQ09ERSgnc21vbycpCitrVGhlbWVTbW9vdGhGb250TWluU2l6ZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdzbW9zJykKK2tUaWxlZE9uU2NyZWVuID0gMQora0NlbnRlck9uU2NyZWVuID0gMgora0ZpdFRvU2NyZWVuID0gMwora0ZpbGxTY3JlZW4gPSA0CitrVXNlQmVzdEd1ZXNzID0gNQora1RoZW1lQ2hlY2tCb3hDbGFzc2ljWCA9IDAKK2tUaGVtZUNoZWNrQm94Q2hlY2tNYXJrID0gMQora1RoZW1lU2Nyb2xsQmFyQXJyb3dzU2luZ2xlID0gMAora1RoZW1lU2Nyb2xsQmFyQXJyb3dzTG93ZXJSaWdodCA9IDEKK2tUaGVtZVNjcm9sbEJhclRodW1iTm9ybWFsID0gMAora1RoZW1lU2Nyb2xsQmFyVGh1bWJQcm9wb3J0aW9uYWwgPSAxCitrVGhlbWVTeXN0ZW1Gb250ID0gMAora1RoZW1lU21hbGxTeXN0ZW1Gb250ID0gMQora1RoZW1lU21hbGxFbXBoYXNpemVkU3lzdGVtRm9udCA9IDIKK2tUaGVtZVZpZXdzRm9udCA9IDMKK2tUaGVtZUVtcGhhc2l6ZWRTeXN0ZW1Gb250ID0gNAora1RoZW1lQXBwbGljYXRpb25Gb250ID0gNQora1RoZW1lTGFiZWxGb250ID0gNgora1RoZW1lTWVudVRpdGxlRm9udCA9IDEwMAora1RoZW1lTWVudUl0ZW1Gb250ID0gMTAxCitrVGhlbWVNZW51SXRlbU1hcmtGb250ID0gMTAyCitrVGhlbWVNZW51SXRlbUNtZEtleUZvbnQgPSAxMDMKK2tUaGVtZVdpbmRvd1RpdGxlRm9udCA9IDEwNAora1RoZW1lUHVzaEJ1dHRvbkZvbnQgPSAxMDUKK2tUaGVtZVV0aWxpdHlXaW5kb3dUaXRsZUZvbnQgPSAxMDYKK2tUaGVtZUFsZXJ0SGVhZGVyRm9udCA9IDEwNwora1RoZW1lQ3VycmVudFBvcnRGb250ID0gMjAwCitrVGhlbWVUYWJOb25Gcm9udCA9IDAKK2tUaGVtZVRhYk5vbkZyb250UHJlc3NlZCA9IDEKK2tUaGVtZVRhYk5vbkZyb250SW5hY3RpdmUgPSAyCitrVGhlbWVUYWJGcm9udCA9IDMKK2tUaGVtZVRhYkZyb250SW5hY3RpdmUgPSA0CitrVGhlbWVUYWJOb25Gcm9udFVuYXZhaWxhYmxlID0gNQora1RoZW1lVGFiRnJvbnRVbmF2YWlsYWJsZSA9IDYKK2tUaGVtZVRhYk5vcnRoID0gMAora1RoZW1lVGFiU291dGggPSAxCitrVGhlbWVUYWJFYXN0ID0gMgora1RoZW1lVGFiV2VzdCA9IDMKK2tUaGVtZVNtYWxsVGFiSGVpZ2h0ID0gMTYKK2tUaGVtZUxhcmdlVGFiSGVpZ2h0ID0gMjEKK2tUaGVtZVRhYlBhbmVPdmVybGFwID0gMwora1RoZW1lU21hbGxUYWJIZWlnaHRNYXggPSAxOQora1RoZW1lTGFyZ2VUYWJIZWlnaHRNYXggPSAyNAora1RoZW1lTWVkaXVtU2Nyb2xsQmFyID0gMAora1RoZW1lU21hbGxTY3JvbGxCYXIgPSAxCitrVGhlbWVNZWRpdW1TbGlkZXIgPSAyCitrVGhlbWVNZWRpdW1Qcm9ncmVzc0JhciA9IDMKK2tUaGVtZU1lZGl1bUluZGV0ZXJtaW5hdGVCYXIgPSA0CitrVGhlbWVSZWxldmFuY2VCYXIgPSA1CitrVGhlbWVTbWFsbFNsaWRlciA9IDYKK2tUaGVtZUxhcmdlUHJvZ3Jlc3NCYXIgPSA3CitrVGhlbWVMYXJnZUluZGV0ZXJtaW5hdGVCYXIgPSA4CitrVGhlbWVUcmFja0FjdGl2ZSA9IDAKK2tUaGVtZVRyYWNrRGlzYWJsZWQgPSAxCitrVGhlbWVUcmFja05vdGhpbmdUb1Njcm9sbCA9IDIKK2tUaGVtZVRyYWNrSW5hY3RpdmUgPSAzCitrVGhlbWVMZWZ0T3V0c2lkZUFycm93UHJlc3NlZCA9IDB4MDEKK2tUaGVtZUxlZnRJbnNpZGVBcnJvd1ByZXNzZWQgPSAweDAyCitrVGhlbWVMZWZ0VHJhY2tQcmVzc2VkID0gMHgwNAora1RoZW1lVGh1bWJQcmVzc2VkID0gMHgwOAora1RoZW1lUmlnaHRUcmFja1ByZXNzZWQgPSAweDEwCitrVGhlbWVSaWdodEluc2lkZUFycm93UHJlc3NlZCA9IDB4MjAKK2tUaGVtZVJpZ2h0T3V0c2lkZUFycm93UHJlc3NlZCA9IDB4NDAKK2tUaGVtZVRvcE91dHNpZGVBcnJvd1ByZXNzZWQgPSBrVGhlbWVMZWZ0T3V0c2lkZUFycm93UHJlc3NlZAora1RoZW1lVG9wSW5zaWRlQXJyb3dQcmVzc2VkID0ga1RoZW1lTGVmdEluc2lkZUFycm93UHJlc3NlZAora1RoZW1lVG9wVHJhY2tQcmVzc2VkID0ga1RoZW1lTGVmdFRyYWNrUHJlc3NlZAora1RoZW1lQm90dG9tVHJhY2tQcmVzc2VkID0ga1RoZW1lUmlnaHRUcmFja1ByZXNzZWQKK2tUaGVtZUJvdHRvbUluc2lkZUFycm93UHJlc3NlZCA9IGtUaGVtZVJpZ2h0SW5zaWRlQXJyb3dQcmVzc2VkCitrVGhlbWVCb3R0b21PdXRzaWRlQXJyb3dQcmVzc2VkID0ga1RoZW1lUmlnaHRPdXRzaWRlQXJyb3dQcmVzc2VkCitrVGhlbWVUaHVtYlBsYWluID0gMAora1RoZW1lVGh1bWJVcHdhcmQgPSAxCitrVGhlbWVUaHVtYkRvd253YXJkID0gMgora1RoZW1lVHJhY2tIb3Jpem9udGFsID0gKDEgPDwgMCkKK2tUaGVtZVRyYWNrUmlnaHRUb0xlZnQgPSAoMSA8PCAxKQora1RoZW1lVHJhY2tTaG93VGh1bWIgPSAoMSA8PCAyKQora1RoZW1lVHJhY2tUaHVtYlJnbklzTm90R2hvc3QgPSAoMSA8PCAzKQora1RoZW1lVHJhY2tOb1Njcm9sbEJhckFycm93cyA9ICgxIDw8IDQpCitrVGhlbWVXaW5kb3dIYXNHcm93ID0gKDEgPDwgMCkKK2tUaGVtZVdpbmRvd0hhc0hvcml6b250YWxab29tID0gKDEgPDwgMykKK2tUaGVtZVdpbmRvd0hhc1ZlcnRpY2FsWm9vbSA9ICgxIDw8IDQpCitrVGhlbWVXaW5kb3dIYXNGdWxsWm9vbSA9IGtUaGVtZVdpbmRvd0hhc0hvcml6b250YWxab29tICsga1RoZW1lV2luZG93SGFzVmVydGljYWxab29tCitrVGhlbWVXaW5kb3dIYXNDbG9zZUJveCA9ICgxIDw8IDUpCitrVGhlbWVXaW5kb3dIYXNDb2xsYXBzZUJveCA9ICgxIDw8IDYpCitrVGhlbWVXaW5kb3dIYXNUaXRsZVRleHQgPSAoMSA8PCA3KQora1RoZW1lV2luZG93SXNDb2xsYXBzZWQgPSAoMSA8PCA4KQora1RoZW1lV2luZG93SGFzRGlydHkgPSAoMSA8PCA5KQora1RoZW1lRG9jdW1lbnRXaW5kb3cgPSAwCitrVGhlbWVEaWFsb2dXaW5kb3cgPSAxCitrVGhlbWVNb3ZhYmxlRGlhbG9nV2luZG93ID0gMgora1RoZW1lQWxlcnRXaW5kb3cgPSAzCitrVGhlbWVNb3ZhYmxlQWxlcnRXaW5kb3cgPSA0CitrVGhlbWVQbGFpbkRpYWxvZ1dpbmRvdyA9IDUKK2tUaGVtZVNoYWRvd0RpYWxvZ1dpbmRvdyA9IDYKK2tUaGVtZVBvcHVwV2luZG93ID0gNwora1RoZW1lVXRpbGl0eVdpbmRvdyA9IDgKK2tUaGVtZVV0aWxpdHlTaWRlV2luZG93ID0gOQora1RoZW1lU2hlZXRXaW5kb3cgPSAxMAora1RoZW1lRHJhd2VyV2luZG93ID0gMTEKK2tUaGVtZVdpZGdldENsb3NlQm94ID0gMAora1RoZW1lV2lkZ2V0Wm9vbUJveCA9IDEKK2tUaGVtZVdpZGdldENvbGxhcHNlQm94ID0gMgora1RoZW1lV2lkZ2V0RGlydHlDbG9zZUJveCA9IDYKK2tUaGVtZUFycm93TGVmdCA9IDAKK2tUaGVtZUFycm93RG93biA9IDEKK2tUaGVtZUFycm93UmlnaHQgPSAyCitrVGhlbWVBcnJvd1VwID0gMwora1RoZW1lQXJyb3czcHQgPSAwCitrVGhlbWVBcnJvdzVwdCA9IDEKK2tUaGVtZUFycm93N3B0ID0gMgora1RoZW1lQXJyb3c5cHQgPSAzCitrVGhlbWVHcm93TGVmdCA9ICgxIDw8IDApCitrVGhlbWVHcm93UmlnaHQgPSAoMSA8PCAxKQora1RoZW1lR3Jvd1VwID0gKDEgPDwgMikKK2tUaGVtZUdyb3dEb3duID0gKDEgPDwgMykKK2tUaGVtZVB1c2hCdXR0b24gPSAwCitrVGhlbWVDaGVja0JveCA9IDEKK2tUaGVtZVJhZGlvQnV0dG9uID0gMgora1RoZW1lQmV2ZWxCdXR0b24gPSAzCitrVGhlbWVBcnJvd0J1dHRvbiA9IDQKK2tUaGVtZVBvcHVwQnV0dG9uID0gNQora1RoZW1lRGlzY2xvc3VyZUJ1dHRvbiA9IDYKK2tUaGVtZUluY0RlY0J1dHRvbiA9IDcKK2tUaGVtZVNtYWxsQmV2ZWxCdXR0b24gPSA4CitrVGhlbWVNZWRpdW1CZXZlbEJ1dHRvbiA9IDMKK2tUaGVtZUxhcmdlQmV2ZWxCdXR0b24gPSA5CitrVGhlbWVMaXN0SGVhZGVyQnV0dG9uID0gMTAKK2tUaGVtZVJvdW5kQnV0dG9uID0gMTEKK2tUaGVtZUxhcmdlUm91bmRCdXR0b24gPSAxMgora1RoZW1lU21hbGxDaGVja0JveCA9IDEzCitrVGhlbWVTbWFsbFJhZGlvQnV0dG9uID0gMTQKK2tUaGVtZVJvdW5kZWRCZXZlbEJ1dHRvbiA9IDE1CitrVGhlbWVOb3JtYWxDaGVja0JveCA9IGtUaGVtZUNoZWNrQm94CitrVGhlbWVOb3JtYWxSYWRpb0J1dHRvbiA9IGtUaGVtZVJhZGlvQnV0dG9uCitrVGhlbWVCdXR0b25PZmYgPSAwCitrVGhlbWVCdXR0b25PbiA9IDEKK2tUaGVtZUJ1dHRvbk1peGVkID0gMgora1RoZW1lRGlzY2xvc3VyZVJpZ2h0ID0gMAora1RoZW1lRGlzY2xvc3VyZURvd24gPSAxCitrVGhlbWVEaXNjbG9zdXJlTGVmdCA9IDIKK2tUaGVtZUFkb3JubWVudE5vbmUgPSAwCitrVGhlbWVBZG9ybm1lbnREZWZhdWx0ID0gKDEgPDwgMCkKK2tUaGVtZUFkb3JubWVudEZvY3VzID0gKDEgPDwgMikKK2tUaGVtZUFkb3JubWVudFJpZ2h0VG9MZWZ0ID0gKDEgPDwgNCkKK2tUaGVtZUFkb3JubWVudERyYXdJbmRpY2F0b3JPbmx5ID0gKDEgPDwgNSkKK2tUaGVtZUFkb3JubWVudEhlYWRlckJ1dHRvbkxlZnROZWlnaGJvclNlbGVjdGVkID0gKDEgPDwgNikKK2tUaGVtZUFkb3JubWVudEhlYWRlckJ1dHRvblJpZ2h0TmVpZ2hib3JTZWxlY3RlZCA9ICgxIDw8IDcpCitrVGhlbWVBZG9ybm1lbnRIZWFkZXJCdXR0b25Tb3J0VXAgPSAoMSA8PCA4KQora1RoZW1lQWRvcm5tZW50SGVhZGVyTWVudUJ1dHRvbiA9ICgxIDw8IDkpCitrVGhlbWVBZG9ybm1lbnRIZWFkZXJCdXR0b25Ob1NoYWRvdyA9ICgxIDw8IDEwKQora1RoZW1lQWRvcm5tZW50SGVhZGVyQnV0dG9uU2hhZG93T25seSA9ICgxIDw8IDExKQora1RoZW1lQWRvcm5tZW50Tm9TaGFkb3cgPSBrVGhlbWVBZG9ybm1lbnRIZWFkZXJCdXR0b25Ob1NoYWRvdwora1RoZW1lQWRvcm5tZW50U2hhZG93T25seSA9IGtUaGVtZUFkb3JubWVudEhlYWRlckJ1dHRvblNoYWRvd09ubHkKK2tUaGVtZUFkb3JubWVudEFycm93TGVmdEFycm93ID0gKDEgPDwgNikKK2tUaGVtZUFkb3JubWVudEFycm93RG93bkFycm93ID0gKDEgPDwgNykKK2tUaGVtZUFkb3JubWVudEFycm93RG91YmxlQXJyb3cgPSAoMSA8PCA4KQora1RoZW1lQWRvcm5tZW50QXJyb3dVcEFycm93ID0gKDEgPDwgOSkKK2tUaGVtZU5vU291bmRzID0gMAora1RoZW1lV2luZG93U291bmRzTWFzayA9ICgxIDw8IDApCitrVGhlbWVNZW51U291bmRzTWFzayA9ICgxIDw8IDEpCitrVGhlbWVDb250cm9sU291bmRzTWFzayA9ICgxIDw8IDIpCitrVGhlbWVGaW5kZXJTb3VuZHNNYXNrID0gKDEgPDwgMykKK2tUaGVtZURyYWdTb3VuZE5vbmUgPSAwCitrVGhlbWVEcmFnU291bmRNb3ZlV2luZG93ID0gRk9VUl9DSEFSX0NPREUoJ3dtb3YnKQora1RoZW1lRHJhZ1NvdW5kR3Jvd1dpbmRvdyA9IEZPVVJfQ0hBUl9DT0RFKCd3Z3JvJykKK2tUaGVtZURyYWdTb3VuZE1vdmVVdGlsV2luZG93ID0gRk9VUl9DSEFSX0NPREUoJ3Vtb3YnKQora1RoZW1lRHJhZ1NvdW5kR3Jvd1V0aWxXaW5kb3cgPSBGT1VSX0NIQVJfQ09ERSgndWdybycpCitrVGhlbWVEcmFnU291bmRNb3ZlRGlhbG9nID0gRk9VUl9DSEFSX0NPREUoJ2Rtb3YnKQora1RoZW1lRHJhZ1NvdW5kTW92ZUFsZXJ0ID0gRk9VUl9DSEFSX0NPREUoJ2Ftb3YnKQora1RoZW1lRHJhZ1NvdW5kTW92ZUljb24gPSBGT1VSX0NIQVJfQ09ERSgnaW1vdicpCitrVGhlbWVEcmFnU291bmRTbGlkZXJUaHVtYiA9IEZPVVJfQ0hBUl9DT0RFKCdzbHRoJykKK2tUaGVtZURyYWdTb3VuZFNsaWRlckdob3N0ID0gRk9VUl9DSEFSX0NPREUoJ3NsZ2gnKQora1RoZW1lRHJhZ1NvdW5kU2Nyb2xsQmFyVGh1bWIgPSBGT1VSX0NIQVJfQ09ERSgnc2J0aCcpCitrVGhlbWVEcmFnU291bmRTY3JvbGxCYXJHaG9zdCA9IEZPVVJfQ0hBUl9DT0RFKCdzYmdoJykKK2tUaGVtZURyYWdTb3VuZFNjcm9sbEJhckFycm93RGVjcmVhc2luZyA9IEZPVVJfQ0hBUl9DT0RFKCdzYmFkJykKK2tUaGVtZURyYWdTb3VuZFNjcm9sbEJhckFycm93SW5jcmVhc2luZyA9IEZPVVJfQ0hBUl9DT0RFKCdzYmFpJykKK2tUaGVtZURyYWdTb3VuZERyYWdnaW5nID0gRk9VUl9DSEFSX0NPREUoJ2RyYWcnKQora1RoZW1lU291bmROb25lID0gMAora1RoZW1lU291bmRNZW51T3BlbiA9IEZPVVJfQ0hBUl9DT0RFKCdtbnVvJykKK2tUaGVtZVNvdW5kTWVudUNsb3NlID0gRk9VUl9DSEFSX0NPREUoJ21udWMnKQora1RoZW1lU291bmRNZW51SXRlbUhpbGl0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdtbnVpJykKK2tUaGVtZVNvdW5kTWVudUl0ZW1SZWxlYXNlID0gRk9VUl9DSEFSX0NPREUoJ21udXMnKQora1RoZW1lU291bmRXaW5kb3dDbG9zZVByZXNzID0gRk9VUl9DSEFSX0NPREUoJ3djbHAnKQora1RoZW1lU291bmRXaW5kb3dDbG9zZUVudGVyID0gRk9VUl9DSEFSX0NPREUoJ3djbGUnKQora1RoZW1lU291bmRXaW5kb3dDbG9zZUV4aXQgPSBGT1VSX0NIQVJfQ09ERSgnd2NseCcpCitrVGhlbWVTb3VuZFdpbmRvd0Nsb3NlUmVsZWFzZSA9IEZPVVJfQ0hBUl9DT0RFKCd3Y2xyJykKK2tUaGVtZVNvdW5kV2luZG93Wm9vbVByZXNzID0gRk9VUl9DSEFSX0NPREUoJ3d6bXAnKQora1RoZW1lU291bmRXaW5kb3dab29tRW50ZXIgPSBGT1VSX0NIQVJfQ09ERSgnd3ptZScpCitrVGhlbWVTb3VuZFdpbmRvd1pvb21FeGl0ID0gRk9VUl9DSEFSX0NPREUoJ3d6bXgnKQora1RoZW1lU291bmRXaW5kb3dab29tUmVsZWFzZSA9IEZPVVJfQ0hBUl9DT0RFKCd3em1yJykKK2tUaGVtZVNvdW5kV2luZG93Q29sbGFwc2VQcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCd3Y29wJykKK2tUaGVtZVNvdW5kV2luZG93Q29sbGFwc2VFbnRlciA9IEZPVVJfQ0hBUl9DT0RFKCd3Y29lJykKK2tUaGVtZVNvdW5kV2luZG93Q29sbGFwc2VFeGl0ID0gRk9VUl9DSEFSX0NPREUoJ3djb3gnKQora1RoZW1lU291bmRXaW5kb3dDb2xsYXBzZVJlbGVhc2UgPSBGT1VSX0NIQVJfQ09ERSgnd2NvcicpCitrVGhlbWVTb3VuZFdpbmRvd0RyYWdCb3VuZGFyeSA9IEZPVVJfQ0hBUl9DT0RFKCd3ZGJkJykKK2tUaGVtZVNvdW5kVXRpbFdpbkNsb3NlUHJlc3MgPSBGT1VSX0NIQVJfQ09ERSgndWNscCcpCitrVGhlbWVTb3VuZFV0aWxXaW5DbG9zZUVudGVyID0gRk9VUl9DSEFSX0NPREUoJ3VjbGUnKQora1RoZW1lU291bmRVdGlsV2luQ2xvc2VFeGl0ID0gRk9VUl9DSEFSX0NPREUoJ3VjbHgnKQora1RoZW1lU291bmRVdGlsV2luQ2xvc2VSZWxlYXNlID0gRk9VUl9DSEFSX0NPREUoJ3VjbHInKQora1RoZW1lU291bmRVdGlsV2luWm9vbVByZXNzID0gRk9VUl9DSEFSX0NPREUoJ3V6bXAnKQora1RoZW1lU291bmRVdGlsV2luWm9vbUVudGVyID0gRk9VUl9DSEFSX0NPREUoJ3V6bWUnKQora1RoZW1lU291bmRVdGlsV2luWm9vbUV4aXQgPSBGT1VSX0NIQVJfQ09ERSgndXpteCcpCitrVGhlbWVTb3VuZFV0aWxXaW5ab29tUmVsZWFzZSA9IEZPVVJfQ0hBUl9DT0RFKCd1em1yJykKK2tUaGVtZVNvdW5kVXRpbFdpbkNvbGxhcHNlUHJlc3MgPSBGT1VSX0NIQVJfQ09ERSgndWNvcCcpCitrVGhlbWVTb3VuZFV0aWxXaW5Db2xsYXBzZUVudGVyID0gRk9VUl9DSEFSX0NPREUoJ3Vjb2UnKQora1RoZW1lU291bmRVdGlsV2luQ29sbGFwc2VFeGl0ID0gRk9VUl9DSEFSX0NPREUoJ3Vjb3gnKQora1RoZW1lU291bmRVdGlsV2luQ29sbGFwc2VSZWxlYXNlID0gRk9VUl9DSEFSX0NPREUoJ3Vjb3InKQora1RoZW1lU291bmRVdGlsV2luRHJhZ0JvdW5kYXJ5ID0gRk9VUl9DSEFSX0NPREUoJ3VkYmQnKQora1RoZW1lU291bmRXaW5kb3dPcGVuID0gRk9VUl9DSEFSX0NPREUoJ3dvcG4nKQora1RoZW1lU291bmRXaW5kb3dDbG9zZSA9IEZPVVJfQ0hBUl9DT0RFKCd3Y2xzJykKK2tUaGVtZVNvdW5kV2luZG93Wm9vbUluID0gRk9VUl9DSEFSX0NPREUoJ3d6bWknKQora1RoZW1lU291bmRXaW5kb3dab29tT3V0ID0gRk9VUl9DSEFSX0NPREUoJ3d6bW8nKQora1RoZW1lU291bmRXaW5kb3dDb2xsYXBzZVVwID0gRk9VUl9DSEFSX0NPREUoJ3djb2wnKQora1RoZW1lU291bmRXaW5kb3dDb2xsYXBzZURvd24gPSBGT1VSX0NIQVJfQ09ERSgnd2V4cCcpCitrVGhlbWVTb3VuZFdpbmRvd0FjdGl2YXRlID0gRk9VUl9DSEFSX0NPREUoJ3dhY3QnKQora1RoZW1lU291bmRVdGlsV2luZG93T3BlbiA9IEZPVVJfQ0hBUl9DT0RFKCd1b3BuJykKK2tUaGVtZVNvdW5kVXRpbFdpbmRvd0Nsb3NlID0gRk9VUl9DSEFSX0NPREUoJ3VjbHMnKQora1RoZW1lU291bmRVdGlsV2luZG93Wm9vbUluID0gRk9VUl9DSEFSX0NPREUoJ3V6bWknKQora1RoZW1lU291bmRVdGlsV2luZG93Wm9vbU91dCA9IEZPVVJfQ0hBUl9DT0RFKCd1em1vJykKK2tUaGVtZVNvdW5kVXRpbFdpbmRvd0NvbGxhcHNlVXAgPSBGT1VSX0NIQVJfQ09ERSgndWNvbCcpCitrVGhlbWVTb3VuZFV0aWxXaW5kb3dDb2xsYXBzZURvd24gPSBGT1VSX0NIQVJfQ09ERSgndWV4cCcpCitrVGhlbWVTb3VuZFV0aWxXaW5kb3dBY3RpdmF0ZSA9IEZPVVJfQ0hBUl9DT0RFKCd1YWN0JykKK2tUaGVtZVNvdW5kRGlhbG9nT3BlbiA9IEZPVVJfQ0hBUl9DT0RFKCdkb3BuJykKK2tUaGVtZVNvdW5kRGlhbG9nQ2xvc2UgPSBGT1VSX0NIQVJfQ09ERSgnZGxnYycpCitrVGhlbWVTb3VuZEFsZXJ0T3BlbiA9IEZPVVJfQ0hBUl9DT0RFKCdhb3BuJykKK2tUaGVtZVNvdW5kQWxlcnRDbG9zZSA9IEZPVVJfQ0hBUl9DT0RFKCdhbHRjJykKK2tUaGVtZVNvdW5kUG9wdXBXaW5kb3dPcGVuID0gRk9VUl9DSEFSX0NPREUoJ3B3b3AnKQora1RoZW1lU291bmRQb3B1cFdpbmRvd0Nsb3NlID0gRk9VUl9DSEFSX0NPREUoJ3B3Y2wnKQora1RoZW1lU291bmRCdXR0b25QcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdidG5wJykKK2tUaGVtZVNvdW5kQnV0dG9uRW50ZXIgPSBGT1VSX0NIQVJfQ09ERSgnYnRuZScpCitrVGhlbWVTb3VuZEJ1dHRvbkV4aXQgPSBGT1VSX0NIQVJfQ09ERSgnYnRueCcpCitrVGhlbWVTb3VuZEJ1dHRvblJlbGVhc2UgPSBGT1VSX0NIQVJfQ09ERSgnYnRucicpCitrVGhlbWVTb3VuZERlZmF1bHRCdXR0b25QcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdkYnRwJykKK2tUaGVtZVNvdW5kRGVmYXVsdEJ1dHRvbkVudGVyID0gRk9VUl9DSEFSX0NPREUoJ2RidGUnKQora1RoZW1lU291bmREZWZhdWx0QnV0dG9uRXhpdCA9IEZPVVJfQ0hBUl9DT0RFKCdkYnR4JykKK2tUaGVtZVNvdW5kRGVmYXVsdEJ1dHRvblJlbGVhc2UgPSBGT1VSX0NIQVJfQ09ERSgnZGJ0cicpCitrVGhlbWVTb3VuZENhbmNlbEJ1dHRvblByZXNzID0gRk9VUl9DSEFSX0NPREUoJ2NidHAnKQora1RoZW1lU291bmRDYW5jZWxCdXR0b25FbnRlciA9IEZPVVJfQ0hBUl9DT0RFKCdjYnRlJykKK2tUaGVtZVNvdW5kQ2FuY2VsQnV0dG9uRXhpdCA9IEZPVVJfQ0hBUl9DT0RFKCdjYnR4JykKK2tUaGVtZVNvdW5kQ2FuY2VsQnV0dG9uUmVsZWFzZSA9IEZPVVJfQ0hBUl9DT0RFKCdjYnRyJykKK2tUaGVtZVNvdW5kQ2hlY2tib3hQcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdjaGtwJykKK2tUaGVtZVNvdW5kQ2hlY2tib3hFbnRlciA9IEZPVVJfQ0hBUl9DT0RFKCdjaGtlJykKK2tUaGVtZVNvdW5kQ2hlY2tib3hFeGl0ID0gRk9VUl9DSEFSX0NPREUoJ2Noa3gnKQora1RoZW1lU291bmRDaGVja2JveFJlbGVhc2UgPSBGT1VSX0NIQVJfQ09ERSgnY2hrcicpCitrVGhlbWVTb3VuZFJhZGlvUHJlc3MgPSBGT1VSX0NIQVJfQ09ERSgncmFkcCcpCitrVGhlbWVTb3VuZFJhZGlvRW50ZXIgPSBGT1VSX0NIQVJfQ09ERSgncmFkZScpCitrVGhlbWVTb3VuZFJhZGlvRXhpdCA9IEZPVVJfQ0hBUl9DT0RFKCdyYWR4JykKK2tUaGVtZVNvdW5kUmFkaW9SZWxlYXNlID0gRk9VUl9DSEFSX0NPREUoJ3JhZHInKQora1RoZW1lU291bmRTY3JvbGxBcnJvd1ByZXNzID0gRk9VUl9DSEFSX0NPREUoJ3NiYXAnKQora1RoZW1lU291bmRTY3JvbGxBcnJvd0VudGVyID0gRk9VUl9DSEFSX0NPREUoJ3NiYWUnKQora1RoZW1lU291bmRTY3JvbGxBcnJvd0V4aXQgPSBGT1VSX0NIQVJfQ09ERSgnc2JheCcpCitrVGhlbWVTb3VuZFNjcm9sbEFycm93UmVsZWFzZSA9IEZPVVJfQ0hBUl9DT0RFKCdzYmFyJykKK2tUaGVtZVNvdW5kU2Nyb2xsRW5kT2ZUcmFjayA9IEZPVVJfQ0hBUl9DT0RFKCdzYnRlJykKK2tUaGVtZVNvdW5kU2Nyb2xsVHJhY2tQcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdzYnRwJykKK2tUaGVtZVNvdW5kU2xpZGVyRW5kT2ZUcmFjayA9IEZPVVJfQ0hBUl9DT0RFKCdzbHRlJykKK2tUaGVtZVNvdW5kU2xpZGVyVHJhY2tQcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdzbHRwJykKK2tUaGVtZVNvdW5kQmFsbG9vbk9wZW4gPSBGT1VSX0NIQVJfQ09ERSgnYmxubycpCitrVGhlbWVTb3VuZEJhbGxvb25DbG9zZSA9IEZPVVJfQ0hBUl9DT0RFKCdibG5jJykKK2tUaGVtZVNvdW5kQmV2ZWxQcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdiZXZwJykKK2tUaGVtZVNvdW5kQmV2ZWxFbnRlciA9IEZPVVJfQ0hBUl9DT0RFKCdiZXZlJykKK2tUaGVtZVNvdW5kQmV2ZWxFeGl0ID0gRk9VUl9DSEFSX0NPREUoJ2JldngnKQora1RoZW1lU291bmRCZXZlbFJlbGVhc2UgPSBGT1VSX0NIQVJfQ09ERSgnYmV2cicpCitrVGhlbWVTb3VuZExpdHRsZUFycm93VXBQcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdsYXVwJykKK2tUaGVtZVNvdW5kTGl0dGxlQXJyb3dEblByZXNzID0gRk9VUl9DSEFSX0NPREUoJ2xhZHAnKQora1RoZW1lU291bmRMaXR0bGVBcnJvd0VudGVyID0gRk9VUl9DSEFSX0NPREUoJ2xhcmUnKQora1RoZW1lU291bmRMaXR0bGVBcnJvd0V4aXQgPSBGT1VSX0NIQVJfQ09ERSgnbGFyeCcpCitrVGhlbWVTb3VuZExpdHRsZUFycm93VXBSZWxlYXNlID0gRk9VUl9DSEFSX0NPREUoJ2xhdXInKQora1RoZW1lU291bmRMaXR0bGVBcnJvd0RuUmVsZWFzZSA9IEZPVVJfQ0hBUl9DT0RFKCdsYWRyJykKK2tUaGVtZVNvdW5kUG9wdXBQcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdwb3BwJykKK2tUaGVtZVNvdW5kUG9wdXBFbnRlciA9IEZPVVJfQ0hBUl9DT0RFKCdwb3BlJykKK2tUaGVtZVNvdW5kUG9wdXBFeGl0ID0gRk9VUl9DSEFSX0NPREUoJ3BvcHgnKQora1RoZW1lU291bmRQb3B1cFJlbGVhc2UgPSBGT1VSX0NIQVJfQ09ERSgncG9wcicpCitrVGhlbWVTb3VuZERpc2Nsb3N1cmVQcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdkc2NwJykKK2tUaGVtZVNvdW5kRGlzY2xvc3VyZUVudGVyID0gRk9VUl9DSEFSX0NPREUoJ2RzY2UnKQora1RoZW1lU291bmREaXNjbG9zdXJlRXhpdCA9IEZPVVJfQ0hBUl9DT0RFKCdkc2N4JykKK2tUaGVtZVNvdW5kRGlzY2xvc3VyZVJlbGVhc2UgPSBGT1VSX0NIQVJfQ09ERSgnZHNjcicpCitrVGhlbWVTb3VuZFRhYlByZXNzZWQgPSBGT1VSX0NIQVJfQ09ERSgndGFicCcpCitrVGhlbWVTb3VuZFRhYkVudGVyID0gRk9VUl9DSEFSX0NPREUoJ3RhYmUnKQora1RoZW1lU291bmRUYWJFeGl0ID0gRk9VUl9DSEFSX0NPREUoJ3RhYngnKQora1RoZW1lU291bmRUYWJSZWxlYXNlID0gRk9VUl9DSEFSX0NPREUoJ3RhYnInKQora1RoZW1lU291bmREcmFnVGFyZ2V0SGlsaXRlID0gRk9VUl9DSEFSX0NPREUoJ2R0aGknKQora1RoZW1lU291bmREcmFnVGFyZ2V0VW5oaWxpdGUgPSBGT1VSX0NIQVJfQ09ERSgnZHR1aCcpCitrVGhlbWVTb3VuZERyYWdUYXJnZXREcm9wID0gRk9VUl9DSEFSX0NPREUoJ2R0ZHInKQora1RoZW1lU291bmRFbXB0eVRyYXNoID0gRk9VUl9DSEFSX0NPREUoJ2Z0cnMnKQora1RoZW1lU291bmRTZWxlY3RJdGVtID0gRk9VUl9DSEFSX0NPREUoJ2ZzZWwnKQora1RoZW1lU291bmROZXdJdGVtID0gRk9VUl9DSEFSX0NPREUoJ2ZuZXcnKQora1RoZW1lU291bmRSZWNlaXZlRHJvcCA9IEZPVVJfQ0hBUl9DT0RFKCdmZHJwJykKK2tUaGVtZVNvdW5kQ29weURvbmUgPSBGT1VSX0NIQVJfQ09ERSgnZmNwZCcpCitrVGhlbWVTb3VuZFJlc29sdmVBbGlhcyA9IEZPVVJfQ0hBUl9DT0RFKCdmcmFsJykKK2tUaGVtZVNvdW5kTGF1bmNoQXBwID0gRk9VUl9DSEFSX0NPREUoJ2ZsYXAnKQora1RoZW1lU291bmREaXNrSW5zZXJ0ID0gRk9VUl9DSEFSX0NPREUoJ2Rza2knKQora1RoZW1lU291bmREaXNrRWplY3QgPSBGT1VSX0NIQVJfQ09ERSgnZHNrZScpCitrVGhlbWVTb3VuZEZpbmRlckRyYWdPbkljb24gPSBGT1VSX0NIQVJfQ09ERSgnZmRvbicpCitrVGhlbWVTb3VuZEZpbmRlckRyYWdPZmZJY29uID0gRk9VUl9DSEFSX0NPREUoJ2Zkb2YnKQora1RoZW1lUG9wdXBUYWJOb3JtYWxQb3NpdGlvbiA9IDAKK2tUaGVtZVBvcHVwVGFiQ2VudGVyT25XaW5kb3cgPSAxCitrVGhlbWVQb3B1cFRhYkNlbnRlck9uT2Zmc2V0ID0gMgora1RoZW1lTWV0cmljU2Nyb2xsQmFyV2lkdGggPSAwCitrVGhlbWVNZXRyaWNTbWFsbFNjcm9sbEJhcldpZHRoID0gMQora1RoZW1lTWV0cmljQ2hlY2tCb3hIZWlnaHQgPSAyCitrVGhlbWVNZXRyaWNSYWRpb0J1dHRvbkhlaWdodCA9IDMKK2tUaGVtZU1ldHJpY0VkaXRUZXh0V2hpdGVzcGFjZSA9IDQKK2tUaGVtZU1ldHJpY0VkaXRUZXh0RnJhbWVPdXRzZXQgPSA1CitrVGhlbWVNZXRyaWNMaXN0Qm94RnJhbWVPdXRzZXQgPSA2CitrVGhlbWVNZXRyaWNGb2N1c1JlY3RPdXRzZXQgPSA3CitrVGhlbWVNZXRyaWNJbWFnZVdlbGxUaGlja25lc3MgPSA4CitrVGhlbWVNZXRyaWNTY3JvbGxCYXJPdmVybGFwID0gOQora1RoZW1lTWV0cmljTGFyZ2VUYWJIZWlnaHQgPSAxMAora1RoZW1lTWV0cmljTGFyZ2VUYWJDYXBzV2lkdGggPSAxMQora1RoZW1lTWV0cmljVGFiRnJhbWVPdmVybGFwID0gMTIKK2tUaGVtZU1ldHJpY1RhYkluZGVudE9yU3R5bGUgPSAxMwora1RoZW1lTWV0cmljVGFiT3ZlcmxhcCA9IDE0CitrVGhlbWVNZXRyaWNTbWFsbFRhYkhlaWdodCA9IDE1CitrVGhlbWVNZXRyaWNTbWFsbFRhYkNhcHNXaWR0aCA9IDE2CitrVGhlbWVNZXRyaWNEaXNjbG9zdXJlQnV0dG9uSGVpZ2h0ID0gMTcKK2tUaGVtZU1ldHJpY1JvdW5kQnV0dG9uU2l6ZSA9IDE4CitrVGhlbWVNZXRyaWNQdXNoQnV0dG9uSGVpZ2h0ID0gMTkKK2tUaGVtZU1ldHJpY0xpc3RIZWFkZXJIZWlnaHQgPSAyMAora1RoZW1lTWV0cmljU21hbGxDaGVja0JveEhlaWdodCA9IDIxCitrVGhlbWVNZXRyaWNEaXNjbG9zdXJlQnV0dG9uV2lkdGggPSAyMgora1RoZW1lTWV0cmljU21hbGxEaXNjbG9zdXJlQnV0dG9uSGVpZ2h0ID0gMjMKK2tUaGVtZU1ldHJpY1NtYWxsRGlzY2xvc3VyZUJ1dHRvbldpZHRoID0gMjQKK2tUaGVtZU1ldHJpY0Rpc2Nsb3N1cmVUcmlhbmdsZUhlaWdodCA9IDI1CitrVGhlbWVNZXRyaWNEaXNjbG9zdXJlVHJpYW5nbGVXaWR0aCA9IDI2CitrVGhlbWVNZXRyaWNMaXR0bGVBcnJvd3NIZWlnaHQgPSAyNwora1RoZW1lTWV0cmljTGl0dGxlQXJyb3dzV2lkdGggPSAyOAora1RoZW1lTWV0cmljUGFuZVNwbGl0dGVySGVpZ2h0ID0gMjkKK2tUaGVtZU1ldHJpY1BvcHVwQnV0dG9uSGVpZ2h0ID0gMzAKK2tUaGVtZU1ldHJpY1NtYWxsUG9wdXBCdXR0b25IZWlnaHQgPSAzMQora1RoZW1lTWV0cmljTGFyZ2VQcm9ncmVzc0JhclRoaWNrbmVzcyA9IDMyCitrVGhlbWVNZXRyaWNQdWxsRG93bkhlaWdodCA9IDMzCitrVGhlbWVNZXRyaWNTbWFsbFB1bGxEb3duSGVpZ2h0ID0gMzQKK2tUaGVtZU1ldHJpY1NtYWxsUHVzaEJ1dHRvbkhlaWdodCA9IDM1CitrVGhlbWVNZXRyaWNTbWFsbFJhZGlvQnV0dG9uSGVpZ2h0ID0gMzYKK2tUaGVtZU1ldHJpY1JlbGV2YW5jZUluZGljYXRvckhlaWdodCA9IDM3CitrVGhlbWVNZXRyaWNSZXNpemVDb250cm9sSGVpZ2h0ID0gMzgKK2tUaGVtZU1ldHJpY1NtYWxsUmVzaXplQ29udHJvbEhlaWdodCA9IDM5CitrVGhlbWVNZXRyaWNMYXJnZVJvdW5kQnV0dG9uU2l6ZSA9IDQwCitrVGhlbWVNZXRyaWNIU2xpZGVySGVpZ2h0ID0gNDEKK2tUaGVtZU1ldHJpY0hTbGlkZXJUaWNrSGVpZ2h0ID0gNDIKK2tUaGVtZU1ldHJpY1NtYWxsSFNsaWRlckhlaWdodCA9IDQzCitrVGhlbWVNZXRyaWNTbWFsbEhTbGlkZXJUaWNrSGVpZ2h0ID0gNDQKK2tUaGVtZU1ldHJpY1ZTbGlkZXJXaWR0aCA9IDQ1CitrVGhlbWVNZXRyaWNWU2xpZGVyVGlja1dpZHRoID0gNDYKK2tUaGVtZU1ldHJpY1NtYWxsVlNsaWRlcldpZHRoID0gNDcKK2tUaGVtZU1ldHJpY1NtYWxsVlNsaWRlclRpY2tXaWR0aCA9IDQ4CitrVGhlbWVNZXRyaWNUaXRsZUJhckNvbnRyb2xzSGVpZ2h0ID0gNDkKK2tUaGVtZU1ldHJpY0NoZWNrQm94V2lkdGggPSA1MAora1RoZW1lTWV0cmljU21hbGxDaGVja0JveFdpZHRoID0gNTEKK2tUaGVtZU1ldHJpY1JhZGlvQnV0dG9uV2lkdGggPSA1Mgora1RoZW1lTWV0cmljU21hbGxSYWRpb0J1dHRvbldpZHRoID0gNTMKK2tUaGVtZU1ldHJpY1NtYWxsSFNsaWRlck1pblRodW1iV2lkdGggPSA1NAora1RoZW1lTWV0cmljU21hbGxWU2xpZGVyTWluVGh1bWJIZWlnaHQgPSA1NQora1RoZW1lTWV0cmljU21hbGxIU2xpZGVyVGlja09mZnNldCA9IDU2CitrVGhlbWVNZXRyaWNTbWFsbFZTbGlkZXJUaWNrT2Zmc2V0ID0gNTcKK2tUaGVtZU1ldHJpY05vcm1hbFByb2dyZXNzQmFyVGhpY2tuZXNzID0gNTgKK2tUaGVtZU1ldHJpY1Byb2dyZXNzQmFyU2hhZG93T3V0c2V0ID0gNTkKK2tUaGVtZU1ldHJpY1NtYWxsUHJvZ3Jlc3NCYXJTaGFkb3dPdXRzZXQgPSA2MAora1RoZW1lTWV0cmljUHJpbWFyeUdyb3VwQm94Q29udGVudEluc2V0ID0gNjEKK2tUaGVtZU1ldHJpY1NlY29uZGFyeUdyb3VwQm94Q29udGVudEluc2V0ID0gNjIKK2tUaGVtZU1ldHJpY01lbnVNYXJrQ29sdW1uV2lkdGggPSA2Mwora1RoZW1lTWV0cmljTWVudUV4Y2x1ZGVkTWFya0NvbHVtbldpZHRoID0gNjQKK2tUaGVtZU1ldHJpY01lbnVNYXJrSW5kZW50ID0gNjUKK2tUaGVtZU1ldHJpY01lbnVUZXh0TGVhZGluZ0VkZ2VNYXJnaW4gPSA2Ngora1RoZW1lTWV0cmljTWVudVRleHRUcmFpbGluZ0VkZ2VNYXJnaW4gPSA2Nwora1RoZW1lTWV0cmljTWVudUluZGVudFdpZHRoID0gNjgKK2tUaGVtZU1ldHJpY01lbnVJY29uVHJhaWxpbmdFZGdlTWFyZ2luID0gNjkKKyMgYXBwZWFyYW5jZUJhZEJydXNoSW5kZXhFcnIgPSB0aGVtZUludmFsaWRCcnVzaEVycgorIyBhcHBlYXJhbmNlUHJvY2Vzc1JlZ2lzdGVyZWRFcnIgPSB0aGVtZVByb2Nlc3NSZWdpc3RlcmVkRXJyCisjIGFwcGVhcmFuY2VQcm9jZXNzTm90UmVnaXN0ZXJlZEVyciA9IHRoZW1lUHJvY2Vzc05vdFJlZ2lzdGVyZWRFcnIKKyMgYXBwZWFyYW5jZUJhZFRleHRDb2xvckluZGV4RXJyID0gdGhlbWVCYWRUZXh0Q29sb3JFcnIKKyMgYXBwZWFyYW5jZVRoZW1lSGFzTm9BY2NlbnRzID0gdGhlbWVIYXNOb0FjY2VudHNFcnIKKyMgYXBwZWFyYW5jZUJhZEN1cnNvckluZGV4RXJyID0gdGhlbWVCYWRDdXJzb3JJbmRleEVycgora1RoZW1lQWN0aXZlRGlhbG9nQmFja2dyb3VuZEJydXNoID0ga1RoZW1lQnJ1c2hEaWFsb2dCYWNrZ3JvdW5kQWN0aXZlCitrVGhlbWVJbmFjdGl2ZURpYWxvZ0JhY2tncm91bmRCcnVzaCA9IGtUaGVtZUJydXNoRGlhbG9nQmFja2dyb3VuZEluYWN0aXZlCitrVGhlbWVBY3RpdmVBbGVydEJhY2tncm91bmRCcnVzaCA9IGtUaGVtZUJydXNoQWxlcnRCYWNrZ3JvdW5kQWN0aXZlCitrVGhlbWVJbmFjdGl2ZUFsZXJ0QmFja2dyb3VuZEJydXNoID0ga1RoZW1lQnJ1c2hBbGVydEJhY2tncm91bmRJbmFjdGl2ZQora1RoZW1lQWN0aXZlTW9kZWxlc3NEaWFsb2dCYWNrZ3JvdW5kQnJ1c2ggPSBrVGhlbWVCcnVzaE1vZGVsZXNzRGlhbG9nQmFja2dyb3VuZEFjdGl2ZQora1RoZW1lSW5hY3RpdmVNb2RlbGVzc0RpYWxvZ0JhY2tncm91bmRCcnVzaCA9IGtUaGVtZUJydXNoTW9kZWxlc3NEaWFsb2dCYWNrZ3JvdW5kSW5hY3RpdmUKK2tUaGVtZUFjdGl2ZVV0aWxpdHlXaW5kb3dCYWNrZ3JvdW5kQnJ1c2ggPSBrVGhlbWVCcnVzaFV0aWxpdHlXaW5kb3dCYWNrZ3JvdW5kQWN0aXZlCitrVGhlbWVJbmFjdGl2ZVV0aWxpdHlXaW5kb3dCYWNrZ3JvdW5kQnJ1c2ggPSBrVGhlbWVCcnVzaFV0aWxpdHlXaW5kb3dCYWNrZ3JvdW5kSW5hY3RpdmUKK2tUaGVtZUxpc3RWaWV3U29ydENvbHVtbkJhY2tncm91bmRCcnVzaCA9IGtUaGVtZUJydXNoTGlzdFZpZXdTb3J0Q29sdW1uQmFja2dyb3VuZAora1RoZW1lTGlzdFZpZXdCYWNrZ3JvdW5kQnJ1c2ggPSBrVGhlbWVCcnVzaExpc3RWaWV3QmFja2dyb3VuZAora1RoZW1lSWNvbkxhYmVsQmFja2dyb3VuZEJydXNoID0ga1RoZW1lQnJ1c2hJY29uTGFiZWxCYWNrZ3JvdW5kCitrVGhlbWVMaXN0Vmlld1NlcGFyYXRvckJydXNoID0ga1RoZW1lQnJ1c2hMaXN0Vmlld1NlcGFyYXRvcgora1RoZW1lQ2hhc2luZ0Fycm93c0JydXNoID0ga1RoZW1lQnJ1c2hDaGFzaW5nQXJyb3dzCitrVGhlbWVEcmFnSGlsaXRlQnJ1c2ggPSBrVGhlbWVCcnVzaERyYWdIaWxpdGUKK2tUaGVtZURvY3VtZW50V2luZG93QmFja2dyb3VuZEJydXNoID0ga1RoZW1lQnJ1c2hEb2N1bWVudFdpbmRvd0JhY2tncm91bmQKK2tUaGVtZUZpbmRlcldpbmRvd0JhY2tncm91bmRCcnVzaCA9IGtUaGVtZUJydXNoRmluZGVyV2luZG93QmFja2dyb3VuZAora1RoZW1lQWN0aXZlU2Nyb2xsQmFyRGVsaW1pdGVyQnJ1c2ggPSBrVGhlbWVCcnVzaFNjcm9sbEJhckRlbGltaXRlckFjdGl2ZQora1RoZW1lSW5hY3RpdmVTY3JvbGxCYXJEZWxpbWl0ZXJCcnVzaCA9IGtUaGVtZUJydXNoU2Nyb2xsQmFyRGVsaW1pdGVySW5hY3RpdmUKK2tUaGVtZUZvY3VzSGlnaGxpZ2h0QnJ1c2ggPSBrVGhlbWVCcnVzaEZvY3VzSGlnaGxpZ2h0CitrVGhlbWVBY3RpdmVQb3B1cEFycm93QnJ1c2ggPSBrVGhlbWVCcnVzaFBvcHVwQXJyb3dBY3RpdmUKK2tUaGVtZVByZXNzZWRQb3B1cEFycm93QnJ1c2ggPSBrVGhlbWVCcnVzaFBvcHVwQXJyb3dQcmVzc2VkCitrVGhlbWVJbmFjdGl2ZVBvcHVwQXJyb3dCcnVzaCA9IGtUaGVtZUJydXNoUG9wdXBBcnJvd0luYWN0aXZlCitrVGhlbWVBcHBsZUd1aWRlQ29hY2htYXJrQnJ1c2ggPSBrVGhlbWVCcnVzaEFwcGxlR3VpZGVDb2FjaG1hcmsKK2tUaGVtZUFjdGl2ZURpYWxvZ1RleHRDb2xvciA9IGtUaGVtZVRleHRDb2xvckRpYWxvZ0FjdGl2ZQora1RoZW1lSW5hY3RpdmVEaWFsb2dUZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JEaWFsb2dJbmFjdGl2ZQora1RoZW1lQWN0aXZlQWxlcnRUZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JBbGVydEFjdGl2ZQora1RoZW1lSW5hY3RpdmVBbGVydFRleHRDb2xvciA9IGtUaGVtZVRleHRDb2xvckFsZXJ0SW5hY3RpdmUKK2tUaGVtZUFjdGl2ZU1vZGVsZXNzRGlhbG9nVGV4dENvbG9yID0ga1RoZW1lVGV4dENvbG9yTW9kZWxlc3NEaWFsb2dBY3RpdmUKK2tUaGVtZUluYWN0aXZlTW9kZWxlc3NEaWFsb2dUZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JNb2RlbGVzc0RpYWxvZ0luYWN0aXZlCitrVGhlbWVBY3RpdmVXaW5kb3dIZWFkZXJUZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JXaW5kb3dIZWFkZXJBY3RpdmUKK2tUaGVtZUluYWN0aXZlV2luZG93SGVhZGVyVGV4dENvbG9yID0ga1RoZW1lVGV4dENvbG9yV2luZG93SGVhZGVySW5hY3RpdmUKK2tUaGVtZUFjdGl2ZVBsYWNhcmRUZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JQbGFjYXJkQWN0aXZlCitrVGhlbWVJbmFjdGl2ZVBsYWNhcmRUZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JQbGFjYXJkSW5hY3RpdmUKK2tUaGVtZVByZXNzZWRQbGFjYXJkVGV4dENvbG9yID0ga1RoZW1lVGV4dENvbG9yUGxhY2FyZFByZXNzZWQKK2tUaGVtZUFjdGl2ZVB1c2hCdXR0b25UZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JQdXNoQnV0dG9uQWN0aXZlCitrVGhlbWVJbmFjdGl2ZVB1c2hCdXR0b25UZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JQdXNoQnV0dG9uSW5hY3RpdmUKK2tUaGVtZVByZXNzZWRQdXNoQnV0dG9uVGV4dENvbG9yID0ga1RoZW1lVGV4dENvbG9yUHVzaEJ1dHRvblByZXNzZWQKK2tUaGVtZUFjdGl2ZUJldmVsQnV0dG9uVGV4dENvbG9yID0ga1RoZW1lVGV4dENvbG9yQmV2ZWxCdXR0b25BY3RpdmUKK2tUaGVtZUluYWN0aXZlQmV2ZWxCdXR0b25UZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JCZXZlbEJ1dHRvbkluYWN0aXZlCitrVGhlbWVQcmVzc2VkQmV2ZWxCdXR0b25UZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JCZXZlbEJ1dHRvblByZXNzZWQKK2tUaGVtZUFjdGl2ZVBvcHVwQnV0dG9uVGV4dENvbG9yID0ga1RoZW1lVGV4dENvbG9yUG9wdXBCdXR0b25BY3RpdmUKK2tUaGVtZUluYWN0aXZlUG9wdXBCdXR0b25UZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JQb3B1cEJ1dHRvbkluYWN0aXZlCitrVGhlbWVQcmVzc2VkUG9wdXBCdXR0b25UZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JQb3B1cEJ1dHRvblByZXNzZWQKK2tUaGVtZUljb25MYWJlbFRleHRDb2xvciA9IGtUaGVtZVRleHRDb2xvckljb25MYWJlbAora1RoZW1lTGlzdFZpZXdUZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JMaXN0Vmlldwora1RoZW1lQWN0aXZlRG9jdW1lbnRXaW5kb3dUaXRsZVRleHRDb2xvciA9IGtUaGVtZVRleHRDb2xvckRvY3VtZW50V2luZG93VGl0bGVBY3RpdmUKK2tUaGVtZUluYWN0aXZlRG9jdW1lbnRXaW5kb3dUaXRsZVRleHRDb2xvciA9IGtUaGVtZVRleHRDb2xvckRvY3VtZW50V2luZG93VGl0bGVJbmFjdGl2ZQora1RoZW1lQWN0aXZlTW92YWJsZU1vZGFsV2luZG93VGl0bGVUZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JNb3ZhYmxlTW9kYWxXaW5kb3dUaXRsZUFjdGl2ZQora1RoZW1lSW5hY3RpdmVNb3ZhYmxlTW9kYWxXaW5kb3dUaXRsZVRleHRDb2xvciA9IGtUaGVtZVRleHRDb2xvck1vdmFibGVNb2RhbFdpbmRvd1RpdGxlSW5hY3RpdmUKK2tUaGVtZUFjdGl2ZVV0aWxpdHlXaW5kb3dUaXRsZVRleHRDb2xvciA9IGtUaGVtZVRleHRDb2xvclV0aWxpdHlXaW5kb3dUaXRsZUFjdGl2ZQora1RoZW1lSW5hY3RpdmVVdGlsaXR5V2luZG93VGl0bGVUZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JVdGlsaXR5V2luZG93VGl0bGVJbmFjdGl2ZQora1RoZW1lQWN0aXZlUG9wdXBXaW5kb3dUaXRsZUNvbG9yID0ga1RoZW1lVGV4dENvbG9yUG9wdXBXaW5kb3dUaXRsZUFjdGl2ZQora1RoZW1lSW5hY3RpdmVQb3B1cFdpbmRvd1RpdGxlQ29sb3IgPSBrVGhlbWVUZXh0Q29sb3JQb3B1cFdpbmRvd1RpdGxlSW5hY3RpdmUKK2tUaGVtZUFjdGl2ZVJvb3RNZW51VGV4dENvbG9yID0ga1RoZW1lVGV4dENvbG9yUm9vdE1lbnVBY3RpdmUKK2tUaGVtZVNlbGVjdGVkUm9vdE1lbnVUZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JSb290TWVudVNlbGVjdGVkCitrVGhlbWVEaXNhYmxlZFJvb3RNZW51VGV4dENvbG9yID0ga1RoZW1lVGV4dENvbG9yUm9vdE1lbnVEaXNhYmxlZAora1RoZW1lQWN0aXZlTWVudUl0ZW1UZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JNZW51SXRlbUFjdGl2ZQora1RoZW1lU2VsZWN0ZWRNZW51SXRlbVRleHRDb2xvciA9IGtUaGVtZVRleHRDb2xvck1lbnVJdGVtU2VsZWN0ZWQKK2tUaGVtZURpc2FibGVkTWVudUl0ZW1UZXh0Q29sb3IgPSBrVGhlbWVUZXh0Q29sb3JNZW51SXRlbURpc2FibGVkCitrVGhlbWVBY3RpdmVQb3B1cExhYmVsVGV4dENvbG9yID0ga1RoZW1lVGV4dENvbG9yUG9wdXBMYWJlbEFjdGl2ZQora1RoZW1lSW5hY3RpdmVQb3B1cExhYmVsVGV4dENvbG9yID0ga1RoZW1lVGV4dENvbG9yUG9wdXBMYWJlbEluYWN0aXZlCitrQUVUaGVtZVN3aXRjaCA9IGtBRUFwcGVhcmFuY2VDaGFuZ2VkCitrVGhlbWVOb0Fkb3JubWVudCA9IGtUaGVtZUFkb3JubWVudE5vbmUKK2tUaGVtZURlZmF1bHRBZG9ybm1lbnQgPSBrVGhlbWVBZG9ybm1lbnREZWZhdWx0CitrVGhlbWVGb2N1c0Fkb3JubWVudCA9IGtUaGVtZUFkb3JubWVudEZvY3VzCitrVGhlbWVSaWdodFRvTGVmdEFkb3JubWVudCA9IGtUaGVtZUFkb3JubWVudFJpZ2h0VG9MZWZ0CitrVGhlbWVEcmF3SW5kaWNhdG9yT25seSA9IGtUaGVtZUFkb3JubWVudERyYXdJbmRpY2F0b3JPbmx5CitrVGhlbWVCcnVzaFBhc3NpdmVBcmVhRmlsbCA9IGtUaGVtZUJydXNoU3RhdGljQXJlYUZpbGwKK2tUaGVtZU1ldHJpY0NoZWNrQm94R2x5cGhIZWlnaHQgPSBrVGhlbWVNZXRyaWNDaGVja0JveEhlaWdodAora1RoZW1lTWV0cmljUmFkaW9CdXR0b25HbHlwaEhlaWdodCA9IGtUaGVtZU1ldHJpY1JhZGlvQnV0dG9uSGVpZ2h0CitrVGhlbWVNZXRyaWNEaXNjbG9zdXJlQnV0dG9uU2l6ZSA9IGtUaGVtZU1ldHJpY0Rpc2Nsb3N1cmVCdXR0b25IZWlnaHQKK2tUaGVtZU1ldHJpY0Jlc3RMaXN0SGVhZGVySGVpZ2h0ID0ga1RoZW1lTWV0cmljTGlzdEhlYWRlckhlaWdodAora1RoZW1lTWV0cmljU21hbGxQcm9ncmVzc0JhclRoaWNrbmVzcyA9IGtUaGVtZU1ldHJpY05vcm1hbFByb2dyZXNzQmFyVGhpY2tuZXNzCitrVGhlbWVNZXRyaWNQcm9ncmVzc0JhclRoaWNrbmVzcyA9IGtUaGVtZU1ldHJpY0xhcmdlUHJvZ3Jlc3NCYXJUaGlja25lc3MKK2tUaGVtZVNjcm9sbEJhciA9IGtUaGVtZU1lZGl1bVNjcm9sbEJhcgora1RoZW1lU2xpZGVyID0ga1RoZW1lTWVkaXVtU2xpZGVyCitrVGhlbWVQcm9ncmVzc0JhciA9IGtUaGVtZU1lZGl1bVByb2dyZXNzQmFyCitrVGhlbWVJbmRldGVybWluYXRlQmFyID0ga1RoZW1lTWVkaXVtSW5kZXRlcm1pbmF0ZUJhcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQXBwZWFyYW5jZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBlYXJhbmNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2UyNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQXBwZWFyYW5jZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQXBwZWFyYW5jZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBlYXJhbmNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2UyNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQXBwZWFyYW5jZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQXBwbGVFdmVudHMucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBsZUV2ZW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGQ3ZGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQXBwbGVFdmVudHMucHkKQEAgLTAsMCArMSw5NjEgQEAKKyMgR2VuZXJhdGVkIGZyb20gJ0FFRGF0YU1vZGVsLmgnCisKK2RlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHgKK3R5cGVBcHBsaWNhdGlvbkJ1bmRsZUlEID0gRk9VUl9DSEFSX0NPREUoJ2J1bmQnKQordHlwZUJvb2xlYW4gPSBGT1VSX0NIQVJfQ09ERSgnYm9vbCcpCit0eXBlQ2hhciA9IEZPVVJfQ0hBUl9DT0RFKCdURVhUJykKK3R5cGVTSW50MTYgPSBGT1VSX0NIQVJfQ09ERSgnc2hvcicpCit0eXBlU0ludDMyID0gRk9VUl9DSEFSX0NPREUoJ2xvbmcnKQordHlwZVVJbnQzMiA9IEZPVVJfQ0hBUl9DT0RFKCdtYWduJykKK3R5cGVTSW50NjQgPSBGT1VSX0NIQVJfQ09ERSgnY29tcCcpCit0eXBlSUVFRTMyQml0RmxvYXRpbmdQb2ludCA9IEZPVVJfQ0hBUl9DT0RFKCdzaW5nJykKK3R5cGVJRUVFNjRCaXRGbG9hdGluZ1BvaW50ID0gRk9VUl9DSEFSX0NPREUoJ2RvdWInKQordHlwZTEyOEJpdEZsb2F0aW5nUG9pbnQgPSBGT1VSX0NIQVJfQ09ERSgnbGRibCcpCit0eXBlRGVjaW1hbFN0cnVjdCA9IEZPVVJfQ0hBUl9DT0RFKCdkZWNtJykKK3R5cGVTTUludCA9IHR5cGVTSW50MTYKK3R5cGVTaG9ydEludGVnZXIgPSB0eXBlU0ludDE2Cit0eXBlSW50ZWdlciA9IHR5cGVTSW50MzIKK3R5cGVMb25nSW50ZWdlciA9IHR5cGVTSW50MzIKK3R5cGVNYWduaXR1ZGUgPSB0eXBlVUludDMyCit0eXBlQ29tcCA9IHR5cGVTSW50NjQKK3R5cGVTTUZsb2F0ID0gdHlwZUlFRUUzMkJpdEZsb2F0aW5nUG9pbnQKK3R5cGVTaG9ydEZsb2F0ID0gdHlwZUlFRUUzMkJpdEZsb2F0aW5nUG9pbnQKK3R5cGVGbG9hdCA9IHR5cGVJRUVFNjRCaXRGbG9hdGluZ1BvaW50Cit0eXBlTG9uZ0Zsb2F0ID0gdHlwZUlFRUU2NEJpdEZsb2F0aW5nUG9pbnQKK3R5cGVFeHRlbmRlZCA9IEZPVVJfQ0hBUl9DT0RFKCdleHRlJykKK3R5cGVBRUxpc3QgPSBGT1VSX0NIQVJfQ09ERSgnbGlzdCcpCit0eXBlQUVSZWNvcmQgPSBGT1VSX0NIQVJfQ09ERSgncmVjbycpCit0eXBlQXBwbGVFdmVudCA9IEZPVVJfQ0hBUl9DT0RFKCdhZXZ0JykKK3R5cGVFdmVudFJlY29yZCA9IEZPVVJfQ0hBUl9DT0RFKCdldnJjJykKK3R5cGVUcnVlID0gRk9VUl9DSEFSX0NPREUoJ3RydWUnKQordHlwZUZhbHNlID0gRk9VUl9DSEFSX0NPREUoJ2ZhbHMnKQordHlwZUFsaWFzID0gRk9VUl9DSEFSX0NPREUoJ2FsaXMnKQordHlwZUVudW1lcmF0ZWQgPSBGT1VSX0NIQVJfQ09ERSgnZW51bScpCit0eXBlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0eXBlJykKK3R5cGVBcHBQYXJhbWV0ZXJzID0gRk9VUl9DSEFSX0NPREUoJ2FwcGEnKQordHlwZVByb3BlcnR5ID0gRk9VUl9DSEFSX0NPREUoJ3Byb3AnKQordHlwZUZTUyA9IEZPVVJfQ0hBUl9DT0RFKCdmc3MgJykKK3R5cGVGU1JlZiA9IEZPVVJfQ0hBUl9DT0RFKCdmc3JmJykKK3R5cGVGaWxlVVJMID0gRk9VUl9DSEFSX0NPREUoJ2Z1cmwnKQordHlwZUtleXdvcmQgPSBGT1VSX0NIQVJfQ09ERSgna2V5dycpCit0eXBlU2VjdGlvbkggPSBGT1VSX0NIQVJfQ09ERSgnc2VjdCcpCit0eXBlV2lsZENhcmQgPSBGT1VSX0NIQVJfQ09ERSgnKioqKicpCit0eXBlQXBwbFNpZ25hdHVyZSA9IEZPVVJfQ0hBUl9DT0RFKCdzaWduJykKK3R5cGVRRFJlY3RhbmdsZSA9IEZPVVJfQ0hBUl9DT0RFKCdxZHJ0JykKK3R5cGVGaXhlZCA9IEZPVVJfQ0hBUl9DT0RFKCdmaXhkJykKK3R5cGVQcm9jZXNzU2VyaWFsTnVtYmVyID0gRk9VUl9DSEFSX0NPREUoJ3BzbiAnKQordHlwZUFwcGxpY2F0aW9uVVJMID0gRk9VUl9DSEFSX0NPREUoJ2FwcmwnKQordHlwZU51bGwgPSBGT1VSX0NIQVJfQ09ERSgnbnVsbCcpCit0eXBlU2Vzc2lvbklEID0gRk9VUl9DSEFSX0NPREUoJ3NzaWQnKQordHlwZVRhcmdldElEID0gRk9VUl9DSEFSX0NPREUoJ3RhcmcnKQordHlwZURpc3BhdGNoZXJJRCA9IEZPVVJfQ0hBUl9DT0RFKCdkc3B0JykKK2tleVRyYW5zYWN0aW9uSURBdHRyID0gRk9VUl9DSEFSX0NPREUoJ3RyYW4nKQora2V5UmV0dXJuSURBdHRyID0gRk9VUl9DSEFSX0NPREUoJ3J0aWQnKQora2V5RXZlbnRDbGFzc0F0dHIgPSBGT1VSX0NIQVJfQ09ERSgnZXZjbCcpCitrZXlFdmVudElEQXR0ciA9IEZPVVJfQ0hBUl9DT0RFKCdldmlkJykKK2tleUFkZHJlc3NBdHRyID0gRk9VUl9DSEFSX0NPREUoJ2FkZHInKQora2V5T3B0aW9uYWxLZXl3b3JkQXR0ciA9IEZPVVJfQ0hBUl9DT0RFKCdvcHRrJykKK2tleVRpbWVvdXRBdHRyID0gRk9VUl9DSEFSX0NPREUoJ3RpbW8nKQora2V5SW50ZXJhY3RMZXZlbEF0dHIgPSBGT1VSX0NIQVJfQ09ERSgnaW50ZScpCitrZXlFdmVudFNvdXJjZUF0dHIgPSBGT1VSX0NIQVJfQ09ERSgnZXNyYycpCitrZXlNaXNzZWRLZXl3b3JkQXR0ciA9IEZPVVJfQ0hBUl9DT0RFKCdtaXNzJykKK2tleU9yaWdpbmFsQWRkcmVzc0F0dHIgPSBGT1VSX0NIQVJfQ09ERSgnZnJvbScpCitrZXlBY2NlcHRUaW1lb3V0QXR0ciA9IEZPVVJfQ0hBUl9DT0RFKCdhY3RtJykKK2tBRURlc2NMaXN0RmFjdG9yTm9uZSA9IDAKK2tBRURlc2NMaXN0RmFjdG9yVHlwZSA9IDQKK2tBRURlc2NMaXN0RmFjdG9yVHlwZUFuZFNpemUgPSA4CitrQXV0b0dlbmVyYXRlUmV0dXJuSUQgPSAtMQora0FueVRyYW5zYWN0aW9uSUQgPSAwCitrQUVEYXRhQXJyYXkgPSAwCitrQUVQYWNrZWRBcnJheSA9IDEKK2tBRURlc2NBcnJheSA9IDMKK2tBRUtleURlc2NBcnJheSA9IDQKK2tBRUhhbmRsZUFycmF5ID0gMgora0FFTm9ybWFsUHJpb3JpdHkgPSAweDAwMDAwMDAwCitrQUVIaWdoUHJpb3JpdHkgPSAweDAwMDAwMDAxCitrQUVOb1JlcGx5ID0gMHgwMDAwMDAwMQora0FFUXVldWVSZXBseSA9IDB4MDAwMDAwMDIKK2tBRVdhaXRSZXBseSA9IDB4MDAwMDAwMDMKK2tBRURvbnRSZWNvbm5lY3QgPSAweDAwMDAwMDgwCitrQUVXYW50UmVjZWlwdCA9IDB4MDAwMDAyMDAKK2tBRU5ldmVySW50ZXJhY3QgPSAweDAwMDAwMDEwCitrQUVDYW5JbnRlcmFjdCA9IDB4MDAwMDAwMjAKK2tBRUFsd2F5c0ludGVyYWN0ID0gMHgwMDAwMDAzMAora0FFQ2FuU3dpdGNoTGF5ZXIgPSAweDAwMDAwMDQwCitrQUVEb250UmVjb3JkID0gMHgwMDAwMTAwMAora0FFRG9udEV4ZWN1dGUgPSAweDAwMDAyMDAwCitrQUVQcm9jZXNzTm9uUmVwbHlFdmVudHMgPSAweDAwMDA4MDAwCitrQUVEZWZhdWx0VGltZW91dCA9IC0xCitrTm9UaW1lT3V0ID0gLTIKK2tBRUludGVyYWN0V2l0aFNlbGYgPSAwCitrQUVJbnRlcmFjdFdpdGhMb2NhbCA9IDEKK2tBRUludGVyYWN0V2l0aEFsbCA9IDIKK2tBRURvTm90SWdub3JlSGFuZGxlciA9IDB4MDAwMDAwMDAKK2tBRUlnbm9yZUFwcFBoYWNIYW5kbGVyID0gMHgwMDAwMDAwMQora0FFSWdub3JlQXBwRXZlbnRIYW5kbGVyID0gMHgwMDAwMDAwMgora0FFSWdub3JlU3lzUGhhY0hhbmRsZXIgPSAweDAwMDAwMDA0CitrQUVJZ25vcmVTeXNFdmVudEhhbmRsZXIgPSAweDAwMDAwMDA4CitrQUVJbmdvcmVCdWlsdEluRXZlbnRIYW5kbGVyID0gMHgwMDAwMDAxMAorIyBrQUVEb250RGlzcG9zZU9uUmVzdW1lID0gKGxvbmcpMHg4MDAwMDAwMAora0FFTm9EaXNwYXRjaCA9IDAKKyMga0FFVXNlU3RhbmRhcmREaXNwYXRjaCA9IChsb25nKTB4RkZGRkZGRkYKK2tleURpcmVjdE9iamVjdCA9IEZPVVJfQ0hBUl9DT0RFKCctLS0tJykKK2tleUVycm9yTnVtYmVyID0gRk9VUl9DSEFSX0NPREUoJ2Vycm4nKQora2V5RXJyb3JTdHJpbmcgPSBGT1VSX0NIQVJfQ09ERSgnZXJycycpCitrZXlQcm9jZXNzU2VyaWFsTnVtYmVyID0gRk9VUl9DSEFSX0NPREUoJ3BzbiAnKQora2V5UHJlRGlzcGF0Y2ggPSBGT1VSX0NIQVJfQ09ERSgncGhhYycpCitrZXlTZWxlY3RQcm9jID0gRk9VUl9DSEFSX0NPREUoJ3NlbGgnKQora2V5QUVSZWNvcmRlckNvdW50ID0gRk9VUl9DSEFSX0NPREUoJ3JlY3InKQora2V5QUVWZXJzaW9uID0gRk9VUl9DSEFSX0NPREUoJ3ZlcnMnKQora0NvcmVFdmVudENsYXNzID0gRk9VUl9DSEFSX0NPREUoJ2FldnQnKQora0FFT3BlbkFwcGxpY2F0aW9uID0gRk9VUl9DSEFSX0NPREUoJ29hcHAnKQora0FFT3BlbkRvY3VtZW50cyA9IEZPVVJfQ0hBUl9DT0RFKCdvZG9jJykKK2tBRVByaW50RG9jdW1lbnRzID0gRk9VUl9DSEFSX0NPREUoJ3Bkb2MnKQora0FFUXVpdEFwcGxpY2F0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3F1aXQnKQora0FFQW5zd2VyID0gRk9VUl9DSEFSX0NPREUoJ2Fuc3InKQora0FFQXBwbGljYXRpb25EaWVkID0gRk9VUl9DSEFSX0NPREUoJ29iaXQnKQora0FFU2hvd1ByZWZlcmVuY2VzID0gRk9VUl9DSEFSX0NPREUoJ3ByZWYnKQora0FFU3RhcnRSZWNvcmRpbmcgPSBGT1VSX0NIQVJfQ09ERSgncmVjYScpCitrQUVTdG9wUmVjb3JkaW5nID0gRk9VUl9DSEFSX0NPREUoJ3JlY2MnKQora0FFTm90aWZ5U3RhcnRSZWNvcmRpbmcgPSBGT1VSX0NIQVJfQ09ERSgncmVjMScpCitrQUVOb3RpZnlTdG9wUmVjb3JkaW5nID0gRk9VUl9DSEFSX0NPREUoJ3JlYzAnKQora0FFTm90aWZ5UmVjb3JkaW5nID0gRk9VUl9DSEFSX0NPREUoJ3JlY3InKQora0FFVW5rbm93blNvdXJjZSA9IDAKK2tBRURpcmVjdENhbGwgPSAxCitrQUVTYW1lUHJvY2VzcyA9IDIKK2tBRUxvY2FsUHJvY2VzcyA9IDMKK2tBRVJlbW90ZVByb2Nlc3MgPSA0CitjQUVMaXN0ID0gRk9VUl9DSEFSX0NPREUoJ2xpc3QnKQorY0FwcGxpY2F0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2NhcHAnKQorY0FyYyA9IEZPVVJfQ0hBUl9DT0RFKCdjYXJjJykKK2NCb29sZWFuID0gRk9VUl9DSEFSX0NPREUoJ2Jvb2wnKQorY0NlbGwgPSBGT1VSX0NIQVJfQ09ERSgnY2NlbCcpCitjQ2hhciA9IEZPVVJfQ0hBUl9DT0RFKCdjaGEgJykKK2NDb2xvclRhYmxlID0gRk9VUl9DSEFSX0NPREUoJ2NscnQnKQorY0NvbHVtbiA9IEZPVVJfQ0hBUl9DT0RFKCdjY29sJykKK2NEb2N1bWVudCA9IEZPVVJfQ0hBUl9DT0RFKCdkb2N1JykKK2NEcmF3aW5nQXJlYSA9IEZPVVJfQ0hBUl9DT0RFKCdjZHJ3JykKK2NFbnVtZXJhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdlbnVtJykKK2NGaWxlID0gRk9VUl9DSEFSX0NPREUoJ2ZpbGUnKQorY0ZpeGVkID0gRk9VUl9DSEFSX0NPREUoJ2ZpeGQnKQorY0ZpeGVkUG9pbnQgPSBGT1VSX0NIQVJfQ09ERSgnZnBudCcpCitjRml4ZWRSZWN0YW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgnZnJjdCcpCitjR3JhcGhpY0xpbmUgPSBGT1VSX0NIQVJfQ09ERSgnZ2xpbicpCitjR3JhcGhpY09iamVjdCA9IEZPVVJfQ0hBUl9DT0RFKCdjZ29iJykKK2NHcmFwaGljU2hhcGUgPSBGT1VSX0NIQVJfQ09ERSgnY2dzaCcpCitjR3JhcGhpY1RleHQgPSBGT1VSX0NIQVJfQ09ERSgnY2d0eCcpCitjR3JvdXBlZEdyYXBoaWMgPSBGT1VSX0NIQVJfQ09ERSgnY3BpYycpCitjSW5zZXJ0aW9uTG9jID0gRk9VUl9DSEFSX0NPREUoJ2luc2wnKQorY0luc2VydGlvblBvaW50ID0gRk9VUl9DSEFSX0NPREUoJ2NpbnMnKQorY0ludGxUZXh0ID0gRk9VUl9DSEFSX0NPREUoJ2l0eHQnKQorY0ludGxXcml0aW5nQ29kZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbnRsJykKK2NJdGVtID0gRk9VUl9DSEFSX0NPREUoJ2NpdG0nKQorY0xpbmUgPSBGT1VSX0NIQVJfQ09ERSgnY2xpbicpCitjTG9uZ0RhdGVUaW1lID0gRk9VUl9DSEFSX0NPREUoJ2xkdCAnKQorY0xvbmdGaXhlZCA9IEZPVVJfQ0hBUl9DT0RFKCdsZnhkJykKK2NMb25nRml4ZWRQb2ludCA9IEZPVVJfQ0hBUl9DT0RFKCdsZnB0JykKK2NMb25nRml4ZWRSZWN0YW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgnbGZyYycpCitjTG9uZ0ludGVnZXIgPSBGT1VSX0NIQVJfQ09ERSgnbG9uZycpCitjTG9uZ1BvaW50ID0gRk9VUl9DSEFSX0NPREUoJ2xwbnQnKQorY0xvbmdSZWN0YW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgnbHJjdCcpCitjTWFjaGluZUxvYyA9IEZPVVJfQ0hBUl9DT0RFKCdtTG9jJykKK2NNZW51ID0gRk9VUl9DSEFSX0NPREUoJ2NtbnUnKQorY01lbnVJdGVtID0gRk9VUl9DSEFSX0NPREUoJ2NtZW4nKQorY09iamVjdCA9IEZPVVJfQ0hBUl9DT0RFKCdjb2JqJykKK2NPYmplY3RTcGVjaWZpZXIgPSBGT1VSX0NIQVJfQ09ERSgnb2JqICcpCitjT3BlbmFibGVPYmplY3QgPSBGT1VSX0NIQVJfQ09ERSgnY29vYicpCitjT3ZhbCA9IEZPVVJfQ0hBUl9DT0RFKCdjb3ZsJykKK2NQYXJhZ3JhcGggPSBGT1VSX0NIQVJfQ09ERSgnY3BhcicpCitjUElDVCA9IEZPVVJfQ0hBUl9DT0RFKCdQSUNUJykKK2NQaXhlbCA9IEZPVVJfQ0hBUl9DT0RFKCdjcHhsJykKK2NQaXhlbE1hcCA9IEZPVVJfQ0hBUl9DT0RFKCdjcGl4JykKK2NQb2x5Z29uID0gRk9VUl9DSEFSX0NPREUoJ2NwZ24nKQorY1Byb3BlcnR5ID0gRk9VUl9DSEFSX0NPREUoJ3Byb3AnKQorY1FEUG9pbnQgPSBGT1VSX0NIQVJfQ09ERSgnUURwdCcpCitjUURSZWN0YW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgncWRydCcpCitjUmVjdGFuZ2xlID0gRk9VUl9DSEFSX0NPREUoJ2NyZWMnKQorY1JHQkNvbG9yID0gRk9VUl9DSEFSX0NPREUoJ2NSR0InKQorY1JvdGF0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3Ryb3QnKQorY1JvdW5kZWRSZWN0YW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgnY3JyYycpCitjUm93ID0gRk9VUl9DSEFSX0NPREUoJ2Nyb3cnKQorY1NlbGVjdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdjc2VsJykKK2NTaG9ydEludGVnZXIgPSBGT1VSX0NIQVJfQ09ERSgnc2hvcicpCitjVGFibGUgPSBGT1VSX0NIQVJfQ09ERSgnY3RibCcpCitjVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdjdHh0JykKK2NUZXh0RmxvdyA9IEZPVVJfQ0hBUl9DT0RFKCdjZmxvJykKK2NUZXh0U3R5bGVzID0gRk9VUl9DSEFSX0NPREUoJ3RzdHknKQorY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgndHlwZScpCitjVmVyc2lvbiA9IEZPVVJfQ0hBUl9DT0RFKCd2ZXJzJykKK2NXaW5kb3cgPSBGT1VSX0NIQVJfQ09ERSgnY3dpbicpCitjV29yZCA9IEZPVVJfQ0hBUl9DT0RFKCdjd29yJykKK2VudW1BcnJvd3MgPSBGT1VSX0NIQVJfQ09ERSgnYXJybycpCitlbnVtSnVzdGlmaWNhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdqdXN0JykKK2VudW1LZXlGb3JtID0gRk9VUl9DSEFSX0NPREUoJ2tmcm0nKQorZW51bVBvc2l0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3Bvc2knKQorZW51bVByb3RlY3Rpb24gPSBGT1VSX0NIQVJfQ09ERSgncHJ0bicpCitlbnVtUXVhbGl0eSA9IEZPVVJfQ0hBUl9DT0RFKCdxdWFsJykKK2VudW1TYXZlT3B0aW9ucyA9IEZPVVJfQ0hBUl9DT0RFKCdzYXZvJykKK2VudW1TdHlsZSA9IEZPVVJfQ0hBUl9DT0RFKCdzdHlsJykKK2VudW1UcmFuc2Zlck1vZGUgPSBGT1VSX0NIQVJfQ09ERSgndHJhbicpCitmb3JtVW5pcXVlSUQgPSBGT1VSX0NIQVJfQ09ERSgnSUQgICcpCitrQUVBYm91dCA9IEZPVVJfQ0hBUl9DT0RFKCdhYm91JykKK2tBRUFmdGVyID0gRk9VUl9DSEFSX0NPREUoJ2FmdGUnKQora0FFQWxpYXNTZWxlY3Rpb24gPSBGT1VSX0NIQVJfQ09ERSgnc2FsaScpCitrQUVBbGxDYXBzID0gRk9VUl9DSEFSX0NPREUoJ2FsY3AnKQora0FFQXJyb3dBdEVuZCA9IEZPVVJfQ0hBUl9DT0RFKCdhcmVuJykKK2tBRUFycm93QXRTdGFydCA9IEZPVVJfQ0hBUl9DT0RFKCdhcnN0JykKK2tBRUFycm93Qm90aEVuZHMgPSBGT1VSX0NIQVJfQ09ERSgnYXJibycpCitrQUVBc2sgPSBGT1VSX0NIQVJfQ09ERSgnYXNrICcpCitrQUVCZWZvcmUgPSBGT1VSX0NIQVJfQ09ERSgnYmVmbycpCitrQUVCZWdpbm5pbmcgPSBGT1VSX0NIQVJfQ09ERSgnYmduZycpCitrQUVCZWdpbnNXaXRoID0gRk9VUl9DSEFSX0NPREUoJ2Jnd3QnKQora0FFQmVnaW5UcmFuc2FjdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdiZWdpJykKK2tBRUJvbGQgPSBGT1VSX0NIQVJfQ09ERSgnYm9sZCcpCitrQUVDYXNlU2Vuc0VxdWFscyA9IEZPVVJfQ0hBUl9DT0RFKCdjc2VxJykKK2tBRUNlbnRlcmVkID0gRk9VUl9DSEFSX0NPREUoJ2NlbnQnKQora0FFQ2hhbmdlVmlldyA9IEZPVVJfQ0hBUl9DT0RFKCd2aWV3JykKK2tBRUNsb25lID0gRk9VUl9DSEFSX0NPREUoJ2Nsb24nKQora0FFQ2xvc2UgPSBGT1VSX0NIQVJfQ09ERSgnY2xvcycpCitrQUVDb25kZW5zZWQgPSBGT1VSX0NIQVJfQ09ERSgnY29uZCcpCitrQUVDb250YWlucyA9IEZPVVJfQ0hBUl9DT0RFKCdjb250JykKK2tBRUNvcHkgPSBGT1VSX0NIQVJfQ09ERSgnY29weScpCitrQUVDb3JlU3VpdGUgPSBGT1VSX0NIQVJfQ09ERSgnY29yZScpCitrQUVDb3VudEVsZW1lbnRzID0gRk9VUl9DSEFSX0NPREUoJ2NudGUnKQora0FFQ3JlYXRlRWxlbWVudCA9IEZPVVJfQ0hBUl9DT0RFKCdjcmVsJykKK2tBRUNyZWF0ZVB1Ymxpc2hlciA9IEZPVVJfQ0hBUl9DT0RFKCdjcHViJykKK2tBRUN1dCA9IEZPVVJfQ0hBUl9DT0RFKCdjdXQgJykKK2tBRURlbGV0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdkZWxvJykKK2tBRURvT2JqZWN0c0V4aXN0ID0gRk9VUl9DSEFSX0NPREUoJ2RvZXgnKQora0FFRG9TY3JpcHQgPSBGT1VSX0NIQVJfQ09ERSgnZG9zYycpCitrQUVEcmFnID0gRk9VUl9DSEFSX0NPREUoJ2RyYWcnKQora0FFRHVwbGljYXRlU2VsZWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3NkdXAnKQora0FFRWRpdEdyYXBoaWMgPSBGT1VSX0NIQVJfQ09ERSgnZWRpdCcpCitrQUVFbXB0eVRyYXNoID0gRk9VUl9DSEFSX0NPREUoJ2VtcHQnKQora0FFRW5kID0gRk9VUl9DSEFSX0NPREUoJ2VuZCAnKQora0FFRW5kc1dpdGggPSBGT1VSX0NIQVJfQ09ERSgnZW5kcycpCitrQUVFbmRUcmFuc2FjdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdlbmR0JykKK2tBRUVxdWFscyA9IEZPVVJfQ0hBUl9DT0RFKCc9ICAgJykKK2tBRUV4cGFuZGVkID0gRk9VUl9DSEFSX0NPREUoJ3BleHAnKQora0FFRmFzdCA9IEZPVVJfQ0hBUl9DT0RFKCdmYXN0JykKK2tBRUZpbmRlckV2ZW50cyA9IEZPVVJfQ0hBUl9DT0RFKCdGTkRSJykKK2tBRUZvcm11bGFQcm90ZWN0ID0gRk9VUl9DSEFSX0NPREUoJ2Zwcm8nKQora0FFRnVsbHlKdXN0aWZpZWQgPSBGT1VSX0NIQVJfQ09ERSgnZnVsbCcpCitrQUVHZXRDbGFzc0luZm8gPSBGT1VSX0NIQVJfQ09ERSgncW9iaicpCitrQUVHZXREYXRhID0gRk9VUl9DSEFSX0NPREUoJ2dldGQnKQora0FFR2V0RGF0YVNpemUgPSBGT1VSX0NIQVJfQ09ERSgnZHNpeicpCitrQUVHZXRFdmVudEluZm8gPSBGT1VSX0NIQVJfQ09ERSgnZ3RlaScpCitrQUVHZXRJbmZvU2VsZWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3NpbmYnKQora0FFR2V0UHJpdmlsZWdlU2VsZWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3NwcnYnKQora0FFR2V0U3VpdGVJbmZvID0gRk9VUl9DSEFSX0NPREUoJ2d0c2knKQora0FFR3JlYXRlclRoYW4gPSBGT1VSX0NIQVJfQ09ERSgnPiAgICcpCitrQUVHcmVhdGVyVGhhbkVxdWFscyA9IEZPVVJfQ0hBUl9DT0RFKCc+PSAgJykKK2tBRUdyb3cgPSBGT1VSX0NIQVJfQ09ERSgnZ3JvdycpCitrQUVIaWRkZW4gPSBGT1VSX0NIQVJfQ09ERSgnaGlkbicpCitrQUVIaVF1YWxpdHkgPSBGT1VSX0NIQVJfQ09ERSgnaGlxdScpCitrQUVJbWFnZUdyYXBoaWMgPSBGT1VSX0NIQVJfQ09ERSgnaW1ncicpCitrQUVJc1VuaWZvcm0gPSBGT1VSX0NIQVJfQ09ERSgnaXN1bicpCitrQUVJdGFsaWMgPSBGT1VSX0NIQVJfQ09ERSgnaXRhbCcpCitrQUVMZWZ0SnVzdGlmaWVkID0gRk9VUl9DSEFSX0NPREUoJ2xlZnQnKQora0FFTGVzc1RoYW4gPSBGT1VSX0NIQVJfQ09ERSgnPCAgICcpCitrQUVMZXNzVGhhbkVxdWFscyA9IEZPVVJfQ0hBUl9DT0RFKCc8PSAgJykKK2tBRUxvd2VyY2FzZSA9IEZPVVJfQ0hBUl9DT0RFKCdsb3djJykKK2tBRU1ha2VPYmplY3RzVmlzaWJsZSA9IEZPVVJfQ0hBUl9DT0RFKCdtdmlzJykKK2tBRU1pc2NTdGFuZGFyZHMgPSBGT1VSX0NIQVJfQ09ERSgnbWlzYycpCitrQUVNb2RpZmlhYmxlID0gRk9VUl9DSEFSX0NPREUoJ21vZGYnKQora0FFTW92ZSA9IEZPVVJfQ0hBUl9DT0RFKCdtb3ZlJykKK2tBRU5vID0gRk9VUl9DSEFSX0NPREUoJ25vICAnKQora0FFTm9BcnJvdyA9IEZPVVJfQ0hBUl9DT0RFKCdhcm5vJykKK2tBRU5vbm1vZGlmaWFibGUgPSBGT1VSX0NIQVJfQ09ERSgnbm1vZCcpCitrQUVPcGVuID0gRk9VUl9DSEFSX0NPREUoJ29kb2MnKQora0FFT3BlblNlbGVjdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzb3BlJykKK2tBRU91dGxpbmUgPSBGT1VSX0NIQVJfQ09ERSgnb3V0bCcpCitrQUVQYWdlU2V0dXAgPSBGT1VSX0NIQVJfQ09ERSgncGdzdScpCitrQUVQYXN0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdwYXN0JykKK2tBRVBsYWluID0gRk9VUl9DSEFSX0NPREUoJ3BsYW4nKQora0FFUHJpbnQgPSBGT1VSX0NIQVJfQ09ERSgncGRvYycpCitrQUVQcmludFNlbGVjdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzcHJpJykKK2tBRVByaW50V2luZG93ID0gRk9VUl9DSEFSX0NPREUoJ3B3aW4nKQora0FFUHV0QXdheVNlbGVjdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzcHV0JykKK2tBRVFEQWRkT3ZlciA9IEZPVVJfQ0hBUl9DT0RFKCdhZGRvJykKK2tBRVFEQWRkUGluID0gRk9VUl9DSEFSX0NPREUoJ2FkZHAnKQora0FFUURBZE1heCA9IEZPVVJfQ0hBUl9DT0RFKCdhZG14JykKK2tBRVFEQWRNaW4gPSBGT1VSX0NIQVJfQ09ERSgnYWRtbicpCitrQUVRREJpYyA9IEZPVVJfQ0hBUl9DT0RFKCdiaWMgJykKK2tBRVFEQmxlbmQgPSBGT1VSX0NIQVJfQ09ERSgnYmxuZCcpCitrQUVRRENvcHkgPSBGT1VSX0NIQVJfQ09ERSgnY3B5ICcpCitrQUVRRE5vdEJpYyA9IEZPVVJfQ0hBUl9DT0RFKCduYmljJykKK2tBRVFETm90Q29weSA9IEZPVVJfQ0hBUl9DT0RFKCduY3B5JykKK2tBRVFETm90T3IgPSBGT1VSX0NIQVJfQ09ERSgnbnRvcicpCitrQUVRRE5vdFhvciA9IEZPVVJfQ0hBUl9DT0RFKCdueG9yJykKK2tBRVFET3IgPSBGT1VSX0NIQVJfQ09ERSgnb3IgICcpCitrQUVRRFN1Yk92ZXIgPSBGT1VSX0NIQVJfQ09ERSgnc3VibycpCitrQUVRRFN1YlBpbiA9IEZPVVJfQ0hBUl9DT0RFKCdzdWJwJykKK2tBRVFEU3VwcGxlbWVudGFsU3VpdGUgPSBGT1VSX0NIQVJfQ09ERSgncWRzcCcpCitrQUVRRFhvciA9IEZPVVJfQ0hBUl9DT0RFKCd4b3IgJykKK2tBRVF1aWNrZHJhd1N1aXRlID0gRk9VUl9DSEFSX0NPREUoJ3FkcncnKQora0FFUXVpdEFsbCA9IEZPVVJfQ0hBUl9DT0RFKCdxdWlhJykKK2tBRVJlZG8gPSBGT1VSX0NIQVJfQ09ERSgncmVkbycpCitrQUVSZWd1bGFyID0gRk9VUl9DSEFSX0NPREUoJ3JlZ2wnKQora0FFUmVvcGVuQXBwbGljYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgncmFwcCcpCitrQUVSZXBsYWNlID0gRk9VUl9DSEFSX0NPREUoJ3JwbGMnKQora0FFUmVxdWlyZWRTdWl0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdyZXFkJykKK2tBRVJlc3RhcnQgPSBGT1VSX0NIQVJfQ09ERSgncmVzdCcpCitrQUVSZXZlYWxTZWxlY3Rpb24gPSBGT1VSX0NIQVJfQ09ERSgnc3JldicpCitrQUVSZXZlcnQgPSBGT1VSX0NIQVJfQ09ERSgncnZydCcpCitrQUVSaWdodEp1c3RpZmllZCA9IEZPVVJfQ0hBUl9DT0RFKCdyZ2h0JykKK2tBRVNhdmUgPSBGT1VSX0NIQVJfQ09ERSgnc2F2ZScpCitrQUVTZWxlY3QgPSBGT1VSX0NIQVJfQ09ERSgnc2xjdCcpCitrQUVTZXREYXRhID0gRk9VUl9DSEFSX0NPREUoJ3NldGQnKQora0FFU2V0UG9zaXRpb24gPSBGT1VSX0NIQVJfQ09ERSgncG9zbicpCitrQUVTaGFkb3cgPSBGT1VSX0NIQVJfQ09ERSgnc2hhZCcpCitrQUVTaG93Q2xpcGJvYXJkID0gRk9VUl9DSEFSX0NPREUoJ3NoY2wnKQora0FFU2h1dERvd24gPSBGT1VSX0NIQVJfQ09ERSgnc2h1dCcpCitrQUVTbGVlcCA9IEZPVVJfQ0hBUl9DT0RFKCdzbGVwJykKK2tBRVNtYWxsQ2FwcyA9IEZPVVJfQ0hBUl9DT0RFKCdzbWNwJykKK2tBRVNwZWNpYWxDbGFzc1Byb3BlcnRpZXMgPSBGT1VSX0NIQVJfQ09ERSgnY0AjIScpCitrQUVTdHJpa2V0aHJvdWdoID0gRk9VUl9DSEFSX0NPREUoJ3N0cmsnKQora0FFU3Vic2NyaXB0ID0gRk9VUl9DSEFSX0NPREUoJ3Nic2MnKQora0FFU3VwZXJzY3JpcHQgPSBGT1VSX0NIQVJfQ09ERSgnc3BzYycpCitrQUVUYWJsZVN1aXRlID0gRk9VUl9DSEFSX0NPREUoJ3RibHMnKQora0FFVGV4dFN1aXRlID0gRk9VUl9DSEFSX0NPREUoJ1RFWFQnKQora0FFVHJhbnNhY3Rpb25UZXJtaW5hdGVkID0gRk9VUl9DSEFSX0NPREUoJ3R0cm0nKQora0FFVW5kZXJsaW5lID0gRk9VUl9DSEFSX0NPREUoJ3VuZGwnKQora0FFVW5kbyA9IEZPVVJfQ0hBUl9DT0RFKCd1bmRvJykKK2tBRVdob2xlV29yZEVxdWFscyA9IEZPVVJfQ0hBUl9DT0RFKCd3d2VxJykKK2tBRVllcyA9IEZPVVJfQ0hBUl9DT0RFKCd5ZXMgJykKK2tBRVpvb20gPSBGT1VSX0NIQVJfQ09ERSgnem9vbScpCitrQUVNb3VzZUNsYXNzID0gRk9VUl9DSEFSX0NPREUoJ21vdXMnKQora0FFRG93biA9IEZPVVJfQ0hBUl9DT0RFKCdkb3duJykKK2tBRVVwID0gRk9VUl9DSEFSX0NPREUoJ3VwICAnKQora0FFTW92ZWQgPSBGT1VSX0NIQVJfQ09ERSgnbW92ZScpCitrQUVTdG9wcGVkTW92aW5nID0gRk9VUl9DSEFSX0NPREUoJ3N0b3AnKQora0FFV2luZG93Q2xhc3MgPSBGT1VSX0NIQVJfQ09ERSgnd2luZCcpCitrQUVVcGRhdGUgPSBGT1VSX0NIQVJfQ09ERSgndXBkdCcpCitrQUVBY3RpdmF0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdhY3R2JykKK2tBRURlYWN0aXZhdGUgPSBGT1VSX0NIQVJfQ09ERSgnZGFjdCcpCitrQUVDb21tYW5kQ2xhc3MgPSBGT1VSX0NIQVJfQ09ERSgnY21uZCcpCitrQUVLZXlDbGFzcyA9IEZPVVJfQ0hBUl9DT0RFKCdrZXljJykKK2tBRVJhd0tleSA9IEZPVVJfQ0hBUl9DT0RFKCdya2V5JykKK2tBRVZpcnR1YWxLZXkgPSBGT1VSX0NIQVJfQ09ERSgna2V5YycpCitrQUVOYXZpZ2F0aW9uS2V5ID0gRk9VUl9DSEFSX0NPREUoJ25hdmUnKQora0FFQXV0b0Rvd24gPSBGT1VSX0NIQVJfQ09ERSgnYXV0bycpCitrQUVBcHBsaWNhdGlvbkNsYXNzID0gRk9VUl9DSEFSX0NPREUoJ2FwcGwnKQora0FFU3VzcGVuZCA9IEZPVVJfQ0hBUl9DT0RFKCdzdXNwJykKK2tBRVJlc3VtZSA9IEZPVVJfQ0hBUl9DT0RFKCdyc21lJykKK2tBRURpc2tFdmVudCA9IEZPVVJfQ0hBUl9DT0RFKCdkaXNrJykKK2tBRU51bGxFdmVudCA9IEZPVVJfQ0hBUl9DT0RFKCdudWxsJykKK2tBRVdha2VVcEV2ZW50ID0gRk9VUl9DSEFSX0NPREUoJ3dha2UnKQora0FFU2NyYXBFdmVudCA9IEZPVVJfQ0hBUl9DT0RFKCdzY3JwJykKK2tBRUhpZ2hMZXZlbCA9IEZPVVJfQ0hBUl9DT0RFKCdoaWdoJykKK2tleUFFQW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgna2FuZycpCitrZXlBRUFyY0FuZ2xlID0gRk9VUl9DSEFSX0NPREUoJ3BhcmMnKQora2V5QUVCYXNlQWRkciA9IEZPVVJfQ0hBUl9DT0RFKCdiYWRkJykKK2tleUFFQmVzdFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncGJzdCcpCitrZXlBRUJnbmRDb2xvciA9IEZPVVJfQ0hBUl9DT0RFKCdrYmNsJykKK2tleUFFQmduZFBhdHRlcm4gPSBGT1VSX0NIQVJfQ09ERSgna2JwdCcpCitrZXlBRUJvdW5kcyA9IEZPVVJfQ0hBUl9DT0RFKCdwYm5kJykKK2tleUFFQ2VsbExpc3QgPSBGT1VSX0NIQVJfQ09ERSgna2NsdCcpCitrZXlBRUNsYXNzSUQgPSBGT1VSX0NIQVJfQ09ERSgnY2xJRCcpCitrZXlBRUNvbG9yID0gRk9VUl9DSEFSX0NPREUoJ2NvbHInKQora2V5QUVDb2xvclRhYmxlID0gRk9VUl9DSEFSX0NPREUoJ2NsdGInKQora2V5QUVDdXJ2ZUhlaWdodCA9IEZPVVJfQ0hBUl9DT0RFKCdrY2hkJykKK2tleUFFQ3VydmVXaWR0aCA9IEZPVVJfQ0hBUl9DT0RFKCdrY3dkJykKK2tleUFFRGFzaFN0eWxlID0gRk9VUl9DSEFSX0NPREUoJ3Bkc3QnKQora2V5QUVEYXRhID0gRk9VUl9DSEFSX0NPREUoJ2RhdGEnKQora2V5QUVEZWZhdWx0VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkZWZ0JykKK2tleUFFRGVmaW5pdGlvblJlY3QgPSBGT1VSX0NIQVJfQ09ERSgncGRydCcpCitrZXlBRURlc2NUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2RzdHAnKQora2V5QUVEZXN0aW5hdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdkZXN0JykKK2tleUFFRG9BbnRpQWxpYXMgPSBGT1VSX0NIQVJfQ09ERSgnYW50YScpCitrZXlBRURvRGl0aGVyZWQgPSBGT1VSX0NIQVJfQ09ERSgnZ2RpdCcpCitrZXlBRURvUm90YXRlID0gRk9VUl9DSEFSX0NPREUoJ2tkcnQnKQora2V5QUVEb1NjYWxlID0gRk9VUl9DSEFSX0NPREUoJ2tzY2EnKQora2V5QUVEb1RyYW5zbGF0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdrdHJhJykKK2tleUFFRWRpdGlvbkZpbGVMb2MgPSBGT1VSX0NIQVJfQ09ERSgnZWxvYycpCitrZXlBRUVsZW1lbnRzID0gRk9VUl9DSEFSX0NPREUoJ2VsbXMnKQora2V5QUVFbmRQb2ludCA9IEZPVVJfQ0hBUl9DT0RFKCdwZW5kJykKK2tleUFFRXZlbnRDbGFzcyA9IEZPVVJfQ0hBUl9DT0RFKCdldmNsJykKK2tleUFFRXZlbnRJRCA9IEZPVVJfQ0hBUl9DT0RFKCdldnRpJykKK2tleUFFRmlsZSA9IEZPVVJfQ0hBUl9DT0RFKCdrZmlsJykKK2tleUFFRmlsZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmx0cCcpCitrZXlBRUZpbGxDb2xvciA9IEZPVVJfQ0hBUl9DT0RFKCdmbGNsJykKK2tleUFFRmlsbFBhdHRlcm4gPSBGT1VSX0NIQVJfQ09ERSgnZmxwdCcpCitrZXlBRUZsaXBIb3Jpem9udGFsID0gRk9VUl9DSEFSX0NPREUoJ2tmaG8nKQora2V5QUVGbGlwVmVydGljYWwgPSBGT1VSX0NIQVJfQ09ERSgna2Z2dCcpCitrZXlBRUZvbnQgPSBGT1VSX0NIQVJfQ09ERSgnZm9udCcpCitrZXlBRUZvcm11bGEgPSBGT1VSX0NIQVJfQ09ERSgncGZvcicpCitrZXlBRUdyYXBoaWNPYmplY3RzID0gRk9VUl9DSEFSX0NPREUoJ2dvYnMnKQora2V5QUVJRCA9IEZPVVJfQ0hBUl9DT0RFKCdJRCAgJykKK2tleUFFSW1hZ2VRdWFsaXR5ID0gRk9VUl9DSEFSX0NPREUoJ2dxdWEnKQora2V5QUVJbnNlcnRIZXJlID0gRk9VUl9DSEFSX0NPREUoJ2luc2gnKQora2V5QUVLZXlGb3JtcyA9IEZPVVJfQ0hBUl9DT0RFKCdrZXlmJykKK2tleUFFS2V5d29yZCA9IEZPVVJfQ0hBUl9DT0RFKCdreXdkJykKK2tleUFFTGV2ZWwgPSBGT1VSX0NIQVJfQ09ERSgnbGV2bCcpCitrZXlBRUxpbmVBcnJvdyA9IEZPVVJfQ0hBUl9DT0RFKCdhcnJvJykKK2tleUFFTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCdwbmFtJykKK2tleUFFTmV3RWxlbWVudExvYyA9IEZPVVJfQ0hBUl9DT0RFKCdwbmVsJykKK2tleUFFT2JqZWN0ID0gRk9VUl9DSEFSX0NPREUoJ2tvYmonKQora2V5QUVPYmplY3RDbGFzcyA9IEZPVVJfQ0hBUl9DT0RFKCdrb2NsJykKK2tleUFFT2ZmU3R5bGVzID0gRk9VUl9DSEFSX0NPREUoJ29mc3QnKQora2V5QUVPblN0eWxlcyA9IEZPVVJfQ0hBUl9DT0RFKCdvbnN0JykKK2tleUFFUGFyYW1ldGVycyA9IEZPVVJfQ0hBUl9DT0RFKCdwcm1zJykKK2tleUFFUGFyYW1GbGFncyA9IEZPVVJfQ0hBUl9DT0RFKCdwbWZnJykKK2tleUFFUGVuQ29sb3IgPSBGT1VSX0NIQVJfQ09ERSgncHBjbCcpCitrZXlBRVBlblBhdHRlcm4gPSBGT1VSX0NIQVJfQ09ERSgncHBwYScpCitrZXlBRVBlbldpZHRoID0gRk9VUl9DSEFSX0NPREUoJ3Bwd2QnKQora2V5QUVQaXhlbERlcHRoID0gRk9VUl9DSEFSX0NPREUoJ3BkcHQnKQora2V5QUVQaXhNYXBNaW51cyA9IEZPVVJfQ0hBUl9DT0RFKCdrcG1tJykKK2tleUFFUE1UYWJsZSA9IEZPVVJfQ0hBUl9DT0RFKCdrcG10JykKK2tleUFFUG9pbnRMaXN0ID0gRk9VUl9DSEFSX0NPREUoJ3B0bHQnKQora2V5QUVQb2ludFNpemUgPSBGT1VSX0NIQVJfQ09ERSgncHRzeicpCitrZXlBRVBvc2l0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2twb3MnKQora2V5QUVQcm9wRGF0YSA9IEZPVVJfQ0hBUl9DT0RFKCdwcmR0JykKK2tleUFFUHJvcGVydGllcyA9IEZPVVJfQ0hBUl9DT0RFKCdxcHJvJykKK2tleUFFUHJvcGVydHkgPSBGT1VSX0NIQVJfQ09ERSgna3BycCcpCitrZXlBRVByb3BGbGFncyA9IEZPVVJfQ0hBUl9DT0RFKCdwcmZnJykKK2tleUFFUHJvcElEID0gRk9VUl9DSEFSX0NPREUoJ3Byb3AnKQora2V5QUVQcm90ZWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3Bwcm8nKQora2V5QUVSZW5kZXJBcyA9IEZPVVJfQ0hBUl9DT0RFKCdrcmVuJykKK2tleUFFUmVxdWVzdGVkVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdydHlwJykKK2tleUFFUmVzdWx0ID0gRk9VUl9DSEFSX0NPREUoJy0tLS0nKQora2V5QUVSZXN1bHRJbmZvID0gRk9VUl9DSEFSX0NPREUoJ3JzaW4nKQora2V5QUVSb3RhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdwcm90JykKK2tleUFFUm90UG9pbnQgPSBGT1VSX0NIQVJfQ09ERSgna3J0cCcpCitrZXlBRVJvd0xpc3QgPSBGT1VSX0NIQVJfQ09ERSgna3JscycpCitrZXlBRVNhdmVPcHRpb25zID0gRk9VUl9DSEFSX0NPREUoJ3Nhdm8nKQora2V5QUVTY2FsZSA9IEZPVVJfQ0hBUl9DT0RFKCdwc2NsJykKK2tleUFFU2NyaXB0VGFnID0gRk9VUl9DSEFSX0NPREUoJ3BzY3QnKQora2V5QUVTaG93V2hlcmUgPSBGT1VSX0NIQVJfQ09ERSgnc2hvdycpCitrZXlBRVN0YXJ0QW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgncGFuZycpCitrZXlBRVN0YXJ0UG9pbnQgPSBGT1VSX0NIQVJfQ09ERSgncHN0cCcpCitrZXlBRVN0eWxlcyA9IEZPVVJfQ0hBUl9DT0RFKCdrc3R5JykKK2tleUFFU3VpdGVJRCA9IEZPVVJfQ0hBUl9DT0RFKCdzdWl0JykKK2tleUFFVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdrdHh0JykKK2tleUFFVGV4dENvbG9yID0gRk9VUl9DSEFSX0NPREUoJ3B0eGMnKQora2V5QUVUZXh0Rm9udCA9IEZPVVJfQ0hBUl9DT0RFKCdwdHhmJykKK2tleUFFVGV4dFBvaW50U2l6ZSA9IEZPVVJfQ0hBUl9DT0RFKCdwdHBzJykKK2tleUFFVGV4dFN0eWxlcyA9IEZPVVJfQ0hBUl9DT0RFKCd0eHN0JykKK2tleUFFVGV4dExpbmVIZWlnaHQgPSBGT1VSX0NIQVJfQ09ERSgna3RsaCcpCitrZXlBRVRleHRMaW5lQXNjZW50ID0gRk9VUl9DSEFSX0NPREUoJ2t0YXMnKQora2V5QUVUaGVUZXh0ID0gRk9VUl9DSEFSX0NPREUoJ3RodHgnKQora2V5QUVUcmFuc2Zlck1vZGUgPSBGT1VSX0NIQVJfQ09ERSgncHB0bScpCitrZXlBRVRyYW5zbGF0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3B0cnMnKQora2V5QUVUcnlBc1N0cnVjdEdyYWYgPSBGT1VSX0NIQVJfQ09ERSgndG9vZycpCitrZXlBRVVuaWZvcm1TdHlsZXMgPSBGT1VSX0NIQVJfQ09ERSgndXN0bCcpCitrZXlBRVVwZGF0ZU9uID0gRk9VUl9DSEFSX0NPREUoJ3B1cGQnKQora2V5QUVVc2VyVGVybSA9IEZPVVJfQ0hBUl9DT0RFKCd1dHJtJykKK2tleUFFV2luZG93ID0gRk9VUl9DSEFSX0NPREUoJ3duZHcnKQora2V5QUVXcml0aW5nQ29kZSA9IEZPVVJfQ0hBUl9DT0RFKCd3cmNkJykKK2tleU1pc2NlbGxhbmVvdXMgPSBGT1VSX0NIQVJfQ09ERSgnZm1zYycpCitrZXlTZWxlY3Rpb24gPSBGT1VSX0NIQVJfQ09ERSgnZnNlbCcpCitrZXlXaW5kb3cgPSBGT1VSX0NIQVJfQ09ERSgna3duZCcpCitrZXlXaGVuID0gRk9VUl9DSEFSX0NPREUoJ3doZW4nKQora2V5V2hlcmUgPSBGT1VSX0NIQVJfQ09ERSgnd2hlcicpCitrZXlNb2RpZmllcnMgPSBGT1VSX0NIQVJfQ09ERSgnbW9kcycpCitrZXlLZXkgPSBGT1VSX0NIQVJfQ09ERSgna2V5ICcpCitrZXlLZXlDb2RlID0gRk9VUl9DSEFSX0NPREUoJ2NvZGUnKQora2V5S2V5Ym9hcmQgPSBGT1VSX0NIQVJfQ09ERSgna2V5YicpCitrZXlEcml2ZU51bWJlciA9IEZPVVJfQ0hBUl9DT0RFKCdkcnYjJykKK2tleUVycm9yQ29kZSA9IEZPVVJfQ0hBUl9DT0RFKCdlcnIjJykKK2tleUhpZ2hMZXZlbENsYXNzID0gRk9VUl9DSEFSX0NPREUoJ2hjbHMnKQora2V5SGlnaExldmVsSUQgPSBGT1VSX0NIQVJfQ09ERSgnaGlkICcpCitwQXJjQW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgncGFyYycpCitwQmFja2dyb3VuZENvbG9yID0gRk9VUl9DSEFSX0NPREUoJ3BiY2wnKQorcEJhY2tncm91bmRQYXR0ZXJuID0gRk9VUl9DSEFSX0NPREUoJ3BicHQnKQorcEJlc3RUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3Bic3QnKQorcEJvdW5kcyA9IEZPVVJfQ0hBUl9DT0RFKCdwYm5kJykKK3BDbGFzcyA9IEZPVVJfQ0hBUl9DT0RFKCdwY2xzJykKK3BDbGlwYm9hcmQgPSBGT1VSX0NIQVJfQ09ERSgncGNsaScpCitwQ29sb3IgPSBGT1VSX0NIQVJfQ09ERSgnY29scicpCitwQ29sb3JUYWJsZSA9IEZPVVJfQ0hBUl9DT0RFKCdjbHRiJykKK3BDb250ZW50cyA9IEZPVVJfQ0hBUl9DT0RFKCdwY250JykKK3BDb3JuZXJDdXJ2ZUhlaWdodCA9IEZPVVJfQ0hBUl9DT0RFKCdwY2hkJykKK3BDb3JuZXJDdXJ2ZVdpZHRoID0gRk9VUl9DSEFSX0NPREUoJ3Bjd2QnKQorcERhc2hTdHlsZSA9IEZPVVJfQ0hBUl9DT0RFKCdwZHN0JykKK3BEZWZhdWx0VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkZWZ0JykKK3BEZWZpbml0aW9uUmVjdCA9IEZPVVJfQ0hBUl9DT0RFKCdwZHJ0JykKK3BFbmFibGVkID0gRk9VUl9DSEFSX0NPREUoJ2VuYmwnKQorcEVuZFBvaW50ID0gRk9VUl9DSEFSX0NPREUoJ3BlbmQnKQorcEZpbGxDb2xvciA9IEZPVVJfQ0hBUl9DT0RFKCdmbGNsJykKK3BGaWxsUGF0dGVybiA9IEZPVVJfQ0hBUl9DT0RFKCdmbHB0JykKK3BGb250ID0gRk9VUl9DSEFSX0NPREUoJ2ZvbnQnKQorcEZvcm11bGEgPSBGT1VSX0NIQVJfQ09ERSgncGZvcicpCitwR3JhcGhpY09iamVjdHMgPSBGT1VSX0NIQVJfQ09ERSgnZ29icycpCitwSGFzQ2xvc2VCb3ggPSBGT1VSX0NIQVJfQ09ERSgnaGNsYicpCitwSGFzVGl0bGVCYXIgPSBGT1VSX0NIQVJfQ09ERSgncHRpdCcpCitwSUQgPSBGT1VSX0NIQVJfQ09ERSgnSUQgICcpCitwSW5kZXggPSBGT1VSX0NIQVJfQ09ERSgncGlkeCcpCitwSW5zZXJ0aW9uTG9jID0gRk9VUl9DSEFSX0NPREUoJ3BpbnMnKQorcElzRmxvYXRpbmcgPSBGT1VSX0NIQVJfQ09ERSgnaXNmbCcpCitwSXNGcm9udFByb2Nlc3MgPSBGT1VSX0NIQVJfQ09ERSgncGlzZicpCitwSXNNb2RhbCA9IEZPVVJfQ0hBUl9DT0RFKCdwbW9kJykKK3BJc01vZGlmaWVkID0gRk9VUl9DSEFSX0NPREUoJ2ltb2QnKQorcElzUmVzaXphYmxlID0gRk9VUl9DSEFSX0NPREUoJ3Byc3onKQorcElzU3RhdGlvbmVyeVBhZCA9IEZPVVJfQ0hBUl9DT0RFKCdwc3BkJykKK3BJc1pvb21hYmxlID0gRk9VUl9DSEFSX0NPREUoJ2lzem0nKQorcElzWm9vbWVkID0gRk9VUl9DSEFSX0NPREUoJ3B6dW0nKQorcEl0ZW1OdW1iZXIgPSBGT1VSX0NIQVJfQ09ERSgnaXRtbicpCitwSnVzdGlmaWNhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdwanN0JykKK3BMaW5lQXJyb3cgPSBGT1VSX0NIQVJfQ09ERSgnYXJybycpCitwTWVudUlEID0gRk9VUl9DSEFSX0NPREUoJ21uaWQnKQorcE5hbWUgPSBGT1VSX0NIQVJfQ09ERSgncG5hbScpCitwTmV3RWxlbWVudExvYyA9IEZPVVJfQ0hBUl9DT0RFKCdwbmVsJykKK3BQZW5Db2xvciA9IEZPVVJfQ0hBUl9DT0RFKCdwcGNsJykKK3BQZW5QYXR0ZXJuID0gRk9VUl9DSEFSX0NPREUoJ3BwcGEnKQorcFBlbldpZHRoID0gRk9VUl9DSEFSX0NPREUoJ3Bwd2QnKQorcFBpeGVsRGVwdGggPSBGT1VSX0NIQVJfQ09ERSgncGRwdCcpCitwUG9pbnRMaXN0ID0gRk9VUl9DSEFSX0NPREUoJ3B0bHQnKQorcFBvaW50U2l6ZSA9IEZPVVJfQ0hBUl9DT0RFKCdwdHN6JykKK3BQcm90ZWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3Bwcm8nKQorcFJvdGF0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3Byb3QnKQorcFNjYWxlID0gRk9VUl9DSEFSX0NPREUoJ3BzY2wnKQorcFNjcmlwdCA9IEZPVVJfQ0hBUl9DT0RFKCdzY3B0JykKK3BTY3JpcHRUYWcgPSBGT1VSX0NIQVJfQ09ERSgncHNjdCcpCitwU2VsZWN0ZWQgPSBGT1VSX0NIQVJfQ09ERSgnc2VsYycpCitwU2VsZWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3NlbGUnKQorcFN0YXJ0QW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgncGFuZycpCitwU3RhcnRQb2ludCA9IEZPVVJfQ0hBUl9DT0RFKCdwc3RwJykKK3BUZXh0Q29sb3IgPSBGT1VSX0NIQVJfQ09ERSgncHR4YycpCitwVGV4dEZvbnQgPSBGT1VSX0NIQVJfQ09ERSgncHR4ZicpCitwVGV4dEl0ZW1EZWxpbWl0ZXJzID0gRk9VUl9DSEFSX0NPREUoJ3R4ZGwnKQorcFRleHRQb2ludFNpemUgPSBGT1VSX0NIQVJfQ09ERSgncHRwcycpCitwVGV4dFN0eWxlcyA9IEZPVVJfQ0hBUl9DT0RFKCd0eHN0JykKK3BUcmFuc2Zlck1vZGUgPSBGT1VSX0NIQVJfQ09ERSgncHB0bScpCitwVHJhbnNsYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgncHRycycpCitwVW5pZm9ybVN0eWxlcyA9IEZPVVJfQ0hBUl9DT0RFKCd1c3RsJykKK3BVcGRhdGVPbiA9IEZPVVJfQ0hBUl9DT0RFKCdwdXBkJykKK3BVc2VyU2VsZWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3B1c2wnKQorcFZlcnNpb24gPSBGT1VSX0NIQVJfQ09ERSgndmVycycpCitwVmlzaWJsZSA9IEZPVVJfQ0hBUl9DT0RFKCdwdmlzJykKK3R5cGVBRVRleHQgPSBGT1VSX0NIQVJfQ09ERSgndFRYVCcpCit0eXBlQXJjID0gRk9VUl9DSEFSX0NPREUoJ2NhcmMnKQordHlwZUJlc3QgPSBGT1VSX0NIQVJfQ09ERSgnYmVzdCcpCit0eXBlQ2VsbCA9IEZPVVJfQ0hBUl9DT0RFKCdjY2VsJykKK3R5cGVDbGFzc0luZm8gPSBGT1VSX0NIQVJfQ09ERSgnZ2NsaScpCit0eXBlQ29sb3JUYWJsZSA9IEZPVVJfQ0hBUl9DT0RFKCdjbHJ0JykKK3R5cGVDb2x1bW4gPSBGT1VSX0NIQVJfQ09ERSgnY2NvbCcpCit0eXBlRGFzaFN0eWxlID0gRk9VUl9DSEFSX0NPREUoJ3RkYXMnKQordHlwZURhdGEgPSBGT1VSX0NIQVJfQ09ERSgndGR0YScpCit0eXBlRHJhd2luZ0FyZWEgPSBGT1VSX0NIQVJfQ09ERSgnY2RydycpCit0eXBlRWxlbUluZm8gPSBGT1VSX0NIQVJfQ09ERSgnZWxpbicpCit0eXBlRW51bWVyYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnZW51bScpCit0eXBlRVBTID0gRk9VUl9DSEFSX0NPREUoJ0VQUyAnKQordHlwZUV2ZW50SW5mbyA9IEZPVVJfQ0hBUl9DT0RFKCdldmluJykKK3R5cGVGaW5kZXJXaW5kb3cgPSBGT1VSX0NIQVJfQ09ERSgnZndpbicpCit0eXBlRml4ZWRQb2ludCA9IEZPVVJfQ0hBUl9DT0RFKCdmcG50JykKK3R5cGVGaXhlZFJlY3RhbmdsZSA9IEZPVVJfQ0hBUl9DT0RFKCdmcmN0JykKK3R5cGVHcmFwaGljTGluZSA9IEZPVVJfQ0hBUl9DT0RFKCdnbGluJykKK3R5cGVHcmFwaGljVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdjZ3R4JykKK3R5cGVHcm91cGVkR3JhcGhpYyA9IEZPVVJfQ0hBUl9DT0RFKCdjcGljJykKK3R5cGVJbnNlcnRpb25Mb2MgPSBGT1VSX0NIQVJfQ09ERSgnaW5zbCcpCit0eXBlSW50bFRleHQgPSBGT1VSX0NIQVJfQ09ERSgnaXR4dCcpCit0eXBlSW50bFdyaXRpbmdDb2RlID0gRk9VUl9DSEFSX0NPREUoJ2ludGwnKQordHlwZUxvbmdEYXRlVGltZSA9IEZPVVJfQ0hBUl9DT0RFKCdsZHQgJykKK3R5cGVMb25nRml4ZWQgPSBGT1VSX0NIQVJfQ09ERSgnbGZ4ZCcpCit0eXBlTG9uZ0ZpeGVkUG9pbnQgPSBGT1VSX0NIQVJfQ09ERSgnbGZwdCcpCit0eXBlTG9uZ0ZpeGVkUmVjdGFuZ2xlID0gRk9VUl9DSEFSX0NPREUoJ2xmcmMnKQordHlwZUxvbmdQb2ludCA9IEZPVVJfQ0hBUl9DT0RFKCdscG50JykKK3R5cGVMb25nUmVjdGFuZ2xlID0gRk9VUl9DSEFSX0NPREUoJ2xyY3QnKQordHlwZU1hY2hpbmVMb2MgPSBGT1VSX0NIQVJfQ09ERSgnbUxvYycpCit0eXBlT3ZhbCA9IEZPVVJfQ0hBUl9DT0RFKCdjb3ZsJykKK3R5cGVQYXJhbUluZm8gPSBGT1VSX0NIQVJfQ09ERSgncG1pbicpCit0eXBlUGljdCA9IEZPVVJfQ0hBUl9DT0RFKCdQSUNUJykKK3R5cGVQaXhlbE1hcCA9IEZPVVJfQ0hBUl9DT0RFKCdjcGl4JykKK3R5cGVQaXhNYXBNaW51cyA9IEZPVVJfQ0hBUl9DT0RFKCd0cG1tJykKK3R5cGVQb2x5Z29uID0gRk9VUl9DSEFSX0NPREUoJ2NwZ24nKQordHlwZVByb3BJbmZvID0gRk9VUl9DSEFSX0NPREUoJ3BpbmYnKQordHlwZVB0ciA9IEZPVVJfQ0hBUl9DT0RFKCdwdHIgJykKK3R5cGVRRFBvaW50ID0gRk9VUl9DSEFSX0NPREUoJ1FEcHQnKQordHlwZVFEUmVnaW9uID0gRk9VUl9DSEFSX0NPREUoJ1FyZ24nKQordHlwZVJlY3RhbmdsZSA9IEZPVVJfQ0hBUl9DT0RFKCdjcmVjJykKK3R5cGVSR0IxNiA9IEZPVVJfQ0hBUl9DT0RFKCd0cjE2JykKK3R5cGVSR0I5NiA9IEZPVVJfQ0hBUl9DT0RFKCd0cjk2JykKK3R5cGVSR0JDb2xvciA9IEZPVVJfQ0hBUl9DT0RFKCdjUkdCJykKK3R5cGVSb3RhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCd0cm90JykKK3R5cGVSb3VuZGVkUmVjdGFuZ2xlID0gRk9VUl9DSEFSX0NPREUoJ2NycmMnKQordHlwZVJvdyA9IEZPVVJfQ0hBUl9DT0RFKCdjcm93JykKK3R5cGVTY3JhcFN0eWxlcyA9IEZPVVJfQ0hBUl9DT0RFKCdzdHlsJykKK3R5cGVTY3JpcHQgPSBGT1VSX0NIQVJfQ09ERSgnc2NwdCcpCit0eXBlU3R5bGVkVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdTVFhUJykKK3R5cGVTdWl0ZUluZm8gPSBGT1VSX0NIQVJfQ09ERSgnc3VpbicpCit0eXBlVGFibGUgPSBGT1VSX0NIQVJfQ09ERSgnY3RibCcpCit0eXBlVGV4dFN0eWxlcyA9IEZPVVJfQ0hBUl9DT0RFKCd0c3R5JykKK3R5cGVUSUZGID0gRk9VUl9DSEFSX0NPREUoJ1RJRkYnKQordHlwZVZlcnNpb24gPSBGT1VSX0NIQVJfQ09ERSgndmVycycpCitrQUVNZW51Q2xhc3MgPSBGT1VSX0NIQVJfQ09ERSgnbWVudScpCitrQUVNZW51U2VsZWN0ID0gRk9VUl9DSEFSX0NPREUoJ21oaXQnKQora0FFTW91c2VEb3duID0gRk9VUl9DSEFSX0NPREUoJ21kd24nKQora0FFTW91c2VEb3duSW5CYWNrID0gRk9VUl9DSEFSX0NPREUoJ21kYmsnKQora0FFS2V5RG93biA9IEZPVVJfQ0hBUl9DT0RFKCdrZHduJykKK2tBRVJlc2l6ZWQgPSBGT1VSX0NIQVJfQ09ERSgncnNpeicpCitrQUVQcm9taXNlID0gRk9VUl9DSEFSX0NPREUoJ3Byb20nKQora2V5TWVudUlEID0gRk9VUl9DSEFSX0NPREUoJ21pZCAnKQora2V5TWVudUl0ZW0gPSBGT1VSX0NIQVJfQ09ERSgnbWl0bScpCitrZXlDbG9zZUFsbFdpbmRvd3MgPSBGT1VSX0NIQVJfQ09ERSgnY2F3ICcpCitrZXlPcmlnaW5hbEJvdW5kcyA9IEZPVVJfQ0hBUl9DT0RFKCdvYm5kJykKK2tleU5ld0JvdW5kcyA9IEZPVVJfQ0hBUl9DT0RFKCduYm5kJykKK2tleUxvY2FsV2hlcmUgPSBGT1VSX0NIQVJfQ09ERSgnbHdocicpCit0eXBlSElNZW51ID0gRk9VUl9DSEFSX0NPREUoJ21vYmonKQordHlwZUhJV2luZG93ID0gRk9VUl9DSEFSX0NPREUoJ3dvYmonKQora0J5U21hbGxJY29uID0gMAora0J5SWNvblZpZXcgPSAxCitrQnlOYW1lVmlldyA9IDIKK2tCeURhdGVWaWV3ID0gMwora0J5U2l6ZVZpZXcgPSA0CitrQnlLaW5kVmlldyA9IDUKK2tCeUNvbW1lbnRWaWV3ID0gNgora0J5TGFiZWxWaWV3ID0gNwora0J5VmVyc2lvblZpZXcgPSA4CitrQUVJbmZvID0gMTEKK2tBRU1haW4gPSAwCitrQUVTaGFyaW5nID0gMTMKK2tBRVpvb21JbiA9IDcKK2tBRVpvb21PdXQgPSA4CitrVGV4dFNlcnZpY2VDbGFzcyA9IEZPVVJfQ0hBUl9DT0RFKCd0c3ZjJykKK2tVcGRhdGVBY3RpdmVJbnB1dEFyZWEgPSBGT1VSX0NIQVJfQ09ERSgndXBkdCcpCitrU2hvd0hpZGVJbnB1dFdpbmRvdyA9IEZPVVJfQ0hBUl9DT0RFKCdzaGl3JykKK2tQb3MyT2Zmc2V0ID0gRk9VUl9DSEFSX0NPREUoJ3Ayc3QnKQora09mZnNldDJQb3MgPSBGT1VSX0NIQVJfQ09ERSgnc3QycCcpCitrVW5pY29kZU5vdEZyb21JbnB1dE1ldGhvZCA9IEZPVVJfQ0hBUl9DT0RFKCd1bmltJykKK2tHZXRTZWxlY3RlZFRleHQgPSBGT1VSX0NIQVJfQ09ERSgnZ3R4dCcpCitrZXlBRVRTTURvY3VtZW50UmVmY29uID0gRk9VUl9DSEFSX0NPREUoJ3JlZmMnKQora2V5QUVTZXJ2ZXJJbnN0YW5jZSA9IEZPVVJfQ0hBUl9DT0RFKCdzcnZpJykKK2tleUFFVGhlRGF0YSA9IEZPVVJfQ0hBUl9DT0RFKCdrZGF0JykKK2tleUFFRml4TGVuZ3RoID0gRk9VUl9DSEFSX0NPREUoJ2ZpeGwnKQora2V5QUVVcGRhdGVSYW5nZSA9IEZPVVJfQ0hBUl9DT0RFKCd1ZG5nJykKK2tleUFFQ3VycmVudFBvaW50ID0gRk9VUl9DSEFSX0NPREUoJ2Nwb3MnKQora2V5QUVCdWZmZXJTaXplID0gRk9VUl9DSEFSX0NPREUoJ2J1ZmYnKQora2V5QUVNb3ZlVmlldyA9IEZPVVJfQ0hBUl9DT0RFKCdtdnZ3JykKK2tleUFFTmV4dEJvZHkgPSBGT1VSX0NIQVJfQ09ERSgnbnhiZCcpCitrZXlBRVRTTVNjcmlwdFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdzY2xnJykKK2tleUFFVFNNVGV4dEZvbnQgPSBGT1VSX0NIQVJfQ09ERSgna3R4ZicpCitrZXlBRVRTTVRleHRGTUZvbnQgPSBGT1VSX0NIQVJfQ09ERSgna3R4bScpCitrZXlBRVRTTVRleHRQb2ludFNpemUgPSBGT1VSX0NIQVJfQ09ERSgna3RwcycpCitrZXlBRVRTTUV2ZW50UmVjb3JkID0gRk9VUl9DSEFSX0NPREUoJ3RldnQnKQora2V5QUVUU01FdmVudFJlZiA9IEZPVVJfQ0hBUl9DT0RFKCd0ZXZyJykKK2tleUFFVGV4dFNlcnZpY2VFbmNvZGluZyA9IEZPVVJfQ0hBUl9DT0RFKCd0c2VuJykKK2tleUFFVGV4dFNlcnZpY2VNYWNFbmNvZGluZyA9IEZPVVJfQ0hBUl9DT0RFKCd0bWVuJykKK3R5cGVUZXh0UmFuZ2UgPSBGT1VSX0NIQVJfQ09ERSgndHhybicpCit0eXBlQ29tcG9uZW50SW5zdGFuY2UgPSBGT1VSX0NIQVJfQ09ERSgnY21waScpCit0eXBlT2Zmc2V0QXJyYXkgPSBGT1VSX0NIQVJfQ09ERSgnb2ZheScpCit0eXBlVGV4dFJhbmdlQXJyYXkgPSBGT1VSX0NIQVJfQ09ERSgndHJheScpCit0eXBlTG93TGV2ZWxFdmVudFJlY29yZCA9IEZPVVJfQ0hBUl9DT0RFKCdldnRyJykKK3R5cGVFdmVudFJlZiA9IEZPVVJfQ0hBUl9DT0RFKCdldnJmJykKK3R5cGVUZXh0ID0gdHlwZUNoYXIKK2tUU01PdXRzaWRlT2ZCb2R5ID0gMQora1RTTUluc2lkZU9mQm9keSA9IDIKK2tUU01JbnNpZGVPZkFjdGl2ZUlucHV0QXJlYSA9IDMKK2tOZXh0Qm9keSA9IDEKK2tQcmV2aW91c0JvZHkgPSAyCitrQ2FyZXRQb3NpdGlvbiA9IDEKK2tSYXdUZXh0ID0gMgora1NlbGVjdGVkUmF3VGV4dCA9IDMKK2tDb252ZXJ0ZWRUZXh0ID0gNAora1NlbGVjdGVkQ29udmVydGVkVGV4dCA9IDUKK2tCbG9ja0ZpbGxUZXh0ID0gNgora091dGxpbmVUZXh0ID0gNwora1NlbGVjdGVkVGV4dCA9IDgKK2tleUFFSGlsaXRlUmFuZ2UgPSBGT1VSX0NIQVJfQ09ERSgnaHJuZycpCitrZXlBRVBpblJhbmdlID0gRk9VUl9DSEFSX0NPREUoJ3BucmcnKQora2V5QUVDbGF1c2VPZmZzZXRzID0gRk9VUl9DSEFSX0NPREUoJ2NsYXUnKQora2V5QUVPZmZzZXQgPSBGT1VSX0NIQVJfQ09ERSgnb2ZzdCcpCitrZXlBRVBvaW50ID0gRk9VUl9DSEFSX0NPREUoJ2dwb3MnKQora2V5QUVMZWZ0U2lkZSA9IEZPVVJfQ0hBUl9DT0RFKCdrbGVmJykKK2tleUFFUmVnaW9uQ2xhc3MgPSBGT1VSX0NIQVJfQ09ERSgncmduYycpCitrZXlBRURyYWdnaW5nID0gRk9VUl9DSEFSX0NPREUoJ2Jvb2wnKQora2V5QUVMZWFkaW5nRWRnZSA9IGtleUFFTGVmdFNpZGUKK3R5cGVVbmljb2RlVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCd1dHh0JykKK3R5cGVTdHlsZWRVbmljb2RlVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdzdXR4JykKK3R5cGVFbmNvZGVkU3RyaW5nID0gRk9VUl9DSEFSX0NPREUoJ2VuY3MnKQordHlwZUNTdHJpbmcgPSBGT1VSX0NIQVJfQ09ERSgnY3N0cicpCit0eXBlUFN0cmluZyA9IEZPVVJfQ0hBUl9DT0RFKCdwc3RyJykKK3R5cGVNZXRlcnMgPSBGT1VSX0NIQVJfQ09ERSgnbWV0cicpCit0eXBlSW5jaGVzID0gRk9VUl9DSEFSX0NPREUoJ2luY2gnKQordHlwZUZlZXQgPSBGT1VSX0NIQVJfQ09ERSgnZmVldCcpCit0eXBlWWFyZHMgPSBGT1VSX0NIQVJfQ09ERSgneWFyZCcpCit0eXBlTWlsZXMgPSBGT1VSX0NIQVJfQ09ERSgnbWlsZScpCit0eXBlS2lsb21ldGVycyA9IEZPVVJfQ0hBUl9DT0RFKCdrbXRyJykKK3R5cGVDZW50aW1ldGVycyA9IEZPVVJfQ0hBUl9DT0RFKCdjbXRyJykKK3R5cGVTcXVhcmVNZXRlcnMgPSBGT1VSX0NIQVJfQ09ERSgnc3FybScpCit0eXBlU3F1YXJlRmVldCA9IEZPVVJfQ0hBUl9DT0RFKCdzcWZ0JykKK3R5cGVTcXVhcmVZYXJkcyA9IEZPVVJfQ0hBUl9DT0RFKCdzcXlkJykKK3R5cGVTcXVhcmVNaWxlcyA9IEZPVVJfQ0hBUl9DT0RFKCdzcW1pJykKK3R5cGVTcXVhcmVLaWxvbWV0ZXJzID0gRk9VUl9DSEFSX0NPREUoJ3Nxa20nKQordHlwZUxpdGVycyA9IEZPVVJfQ0hBUl9DT0RFKCdsaXRyJykKK3R5cGVRdWFydHMgPSBGT1VSX0NIQVJfQ09ERSgncXJ0cycpCit0eXBlR2FsbG9ucyA9IEZPVVJfQ0hBUl9DT0RFKCdnYWxuJykKK3R5cGVDdWJpY01ldGVycyA9IEZPVVJfQ0hBUl9DT0RFKCdjbWV0JykKK3R5cGVDdWJpY0ZlZXQgPSBGT1VSX0NIQVJfQ09ERSgnY2ZldCcpCit0eXBlQ3ViaWNJbmNoZXMgPSBGT1VSX0NIQVJfQ09ERSgnY3VpbicpCit0eXBlQ3ViaWNDZW50aW1ldGVyID0gRk9VUl9DSEFSX0NPREUoJ2NjbXQnKQordHlwZUN1YmljWWFyZHMgPSBGT1VSX0NIQVJfQ09ERSgnY3lyZCcpCit0eXBlS2lsb2dyYW1zID0gRk9VUl9DSEFSX0NPREUoJ2tncm0nKQordHlwZUdyYW1zID0gRk9VUl9DSEFSX0NPREUoJ2dyYW0nKQordHlwZU91bmNlcyA9IEZPVVJfQ0hBUl9DT0RFKCdvenMgJykKK3R5cGVQb3VuZHMgPSBGT1VSX0NIQVJfQ09ERSgnbGJzICcpCit0eXBlRGVncmVlc0MgPSBGT1VSX0NIQVJfQ09ERSgnZGVnYycpCit0eXBlRGVncmVlc0YgPSBGT1VSX0NIQVJfQ09ERSgnZGVnZicpCit0eXBlRGVncmVlc0sgPSBGT1VSX0NIQVJfQ09ERSgnZGVnaycpCitrRkFTZXJ2ZXJBcHAgPSBGT1VSX0NIQVJfQ09ERSgnc3NydicpCitrRG9Gb2xkZXJBY3Rpb25FdmVudCA9IEZPVVJfQ0hBUl9DT0RFKCdmb2xhJykKK2tGb2xkZXJBY3Rpb25Db2RlID0gRk9VUl9DSEFSX0NPREUoJ2FjdG4nKQora0ZvbGRlck9wZW5lZEV2ZW50ID0gRk9VUl9DSEFSX0NPREUoJ2ZvcG4nKQora0ZvbGRlckNsb3NlZEV2ZW50ID0gRk9VUl9DSEFSX0NPREUoJ2ZjbG8nKQora0ZvbGRlcldpbmRvd01vdmVkRXZlbnQgPSBGT1VSX0NIQVJfQ09ERSgnZnNpeicpCitrRm9sZGVySXRlbXNBZGRlZEV2ZW50ID0gRk9VUl9DSEFSX0NPREUoJ2ZnZXQnKQora0ZvbGRlckl0ZW1zUmVtb3ZlZEV2ZW50ID0gRk9VUl9DSEFSX0NPREUoJ2Zsb3MnKQora0l0ZW1MaXN0ID0gRk9VUl9DSEFSX0NPREUoJ2Zsc3QnKQora05ld1NpemVQYXJhbWV0ZXIgPSBGT1VSX0NIQVJfQ09ERSgnZm5zeicpCitrRkFTdWl0ZUNvZGUgPSBGT1VSX0NIQVJfQ09ERSgnZmFjbycpCitrRkFBdHRhY2hDb21tYW5kID0gRk9VUl9DSEFSX0NPREUoJ2F0ZmEnKQora0ZBUmVtb3ZlQ29tbWFuZCA9IEZPVVJfQ0hBUl9DT0RFKCdybWZhJykKK2tGQUVkaXRDb21tYW5kID0gRk9VUl9DSEFSX0NPREUoJ2VkZmEnKQora0ZBRmlsZVBhcmFtID0gRk9VUl9DSEFSX0NPREUoJ2ZhYWwnKQora0ZBSW5kZXhQYXJhbSA9IEZPVVJfQ0hBUl9DT0RFKCdpbmR4JykKK2tBRUludGVybmV0U3VpdGUgPSBGT1VSX0NIQVJfQ09ERSgnZ3VybCcpCitrQUVJU1dlYlN0YXJTdWl0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdXV1dceGJkJykKK2tBRUlTR2V0VVJMID0gRk9VUl9DSEFSX0NPREUoJ2d1cmwnKQorS0FFSVNIYW5kbGVDR0kgPSBGT1VSX0NIQVJfQ09ERSgnc2RvYycpCitjVVJMID0gRk9VUl9DSEFSX0NPREUoJ3VybCAnKQorY0ludGVybmV0QWRkcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdJUEFEJykKK2NIVE1MID0gRk9VUl9DSEFSX0NPREUoJ2h0bWwnKQorY0ZUUEl0ZW0gPSBGT1VSX0NIQVJfQ09ERSgnZnRwICcpCitrQUVJU0hUVFBTZWFyY2hBcmdzID0gRk9VUl9DSEFSX0NPREUoJ2tmb3InKQora0FFSVNQb3N0QXJncyA9IEZPVVJfQ0hBUl9DT0RFKCdwb3N0JykKK2tBRUlTTWV0aG9kID0gRk9VUl9DSEFSX0NPREUoJ21ldGgnKQora0FFSVNDbGllbnRBZGRyZXNzID0gRk9VUl9DSEFSX0NPREUoJ2FkZHInKQora0FFSVNVc2VyTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCd1c2VyJykKK2tBRUlTUGFzc3dvcmQgPSBGT1VSX0NIQVJfQ09ERSgncGFzcycpCitrQUVJU0Zyb21Vc2VyID0gRk9VUl9DSEFSX0NPREUoJ2ZybXUnKQora0FFSVNTZXJ2ZXJOYW1lID0gRk9VUl9DSEFSX0NPREUoJ3N2bm0nKQora0FFSVNTZXJ2ZXJQb3J0ID0gRk9VUl9DSEFSX0NPREUoJ3N2cHQnKQora0FFSVNTY3JpcHROYW1lID0gRk9VUl9DSEFSX0NPREUoJ3Njbm0nKQora0FFSVNDb250ZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjdHlwJykKK2tBRUlTUmVmZXJyZXIgPSBGT1VSX0NIQVJfQ09ERSgncmVmcicpCitrQUVJU1VzZXJBZ2VudCA9IEZPVVJfQ0hBUl9DT0RFKCdBZ250JykKK2tBRUlTQWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ0thY3QnKQora0FFSVNBY3Rpb25QYXRoID0gRk9VUl9DSEFSX0NPREUoJ0thcHQnKQora0FFSVNDbGllbnRJUCA9IEZPVVJfQ0hBUl9DT0RFKCdLY2lwJykKK2tBRUlTRnVsbFJlcXVlc3QgPSBGT1VSX0NIQVJfQ09ERSgnS2ZycScpCitwU2NoZW1lID0gRk9VUl9DSEFSX0NPREUoJ3B1c2MnKQorcEhvc3QgPSBGT1VSX0NIQVJfQ09ERSgnSE9TVCcpCitwUGF0aCA9IEZPVVJfQ0hBUl9DT0RFKCdGVFBjJykKK3BVc2VyTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCdSQXVuJykKK3BVc2VyUGFzc3dvcmQgPSBGT1VSX0NIQVJfQ09ERSgnUkFwdycpCitwRE5TRm9ybSA9IEZPVVJfQ0hBUl9DT0RFKCdwRE5TJykKK3BVUkwgPSBGT1VSX0NIQVJfQ09ERSgncFVSTCcpCitwVGV4dEVuY29kaW5nID0gRk9VUl9DSEFSX0NPREUoJ3B0eGUnKQorcEZUUEtpbmQgPSBGT1VSX0NIQVJfQ09ERSgna2luZCcpCitlU2NoZW1lID0gRk9VUl9DSEFSX0NPREUoJ2VzY2gnKQorZXVybEhUVFAgPSBGT1VSX0NIQVJfQ09ERSgnaHR0cCcpCitldXJsSFRUUFMgPSBGT1VSX0NIQVJfQ09ERSgnaHRwcycpCitldXJsRlRQID0gRk9VUl9DSEFSX0NPREUoJ2Z0cCAnKQorZXVybE1haWwgPSBGT1VSX0NIQVJfQ09ERSgnbWFpbCcpCitldXJsRmlsZSA9IEZPVVJfQ0hBUl9DT0RFKCdmaWxlJykKK2V1cmxHb3BoZXIgPSBGT1VSX0NIQVJfQ09ERSgnZ3BocicpCitldXJsVGVsbmV0ID0gRk9VUl9DSEFSX0NPREUoJ3RsbnQnKQorZXVybE5ld3MgPSBGT1VSX0NIQVJfQ09ERSgnbmV3cycpCitldXJsU05ld3MgPSBGT1VSX0NIQVJfQ09ERSgnc253cycpCitldXJsTk5UUCA9IEZPVVJfQ0hBUl9DT0RFKCdubnRwJykKK2V1cmxNZXNzYWdlID0gRk9VUl9DSEFSX0NPREUoJ21lc3MnKQorZXVybE1haWxib3ggPSBGT1VSX0NIQVJfQ09ERSgnbWJveCcpCitldXJsTXVsdGkgPSBGT1VSX0NIQVJfQ09ERSgnbXVsdCcpCitldXJsTGF1bmNoID0gRk9VUl9DSEFSX0NPREUoJ2xhdW4nKQorZXVybEFGUCA9IEZPVVJfQ0hBUl9DT0RFKCdhZnAgJykKK2V1cmxBVCA9IEZPVVJfQ0hBUl9DT0RFKCdhdCAgJykKK2V1cmxFUFBDID0gRk9VUl9DSEFSX0NPREUoJ2VwcGMnKQorZXVybFJUU1AgPSBGT1VSX0NIQVJfQ09ERSgncnRzcCcpCitldXJsSU1BUCA9IEZPVVJfQ0hBUl9DT0RFKCdpbWFwJykKK2V1cmxORlMgPSBGT1VSX0NIQVJfQ09ERSgndW5mcycpCitldXJsUE9QID0gRk9VUl9DSEFSX0NPREUoJ3Vwb3AnKQorZXVybExEQVAgPSBGT1VSX0NIQVJfQ09ERSgndWxkcCcpCitldXJsVW5rbm93biA9IEZPVVJfQ0hBUl9DT0RFKCd1cmw/JykKK2tDb25uU3VpdGUgPSBGT1VSX0NIQVJfQ09ERSgnbWFjYycpCitjRGV2U3BlYyA9IEZPVVJfQ0hBUl9DT0RFKCdjZGV2JykKK2NBZGRyZXNzU3BlYyA9IEZPVVJfQ0hBUl9DT0RFKCdjYWRyJykKK2NBREJBZGRyZXNzID0gRk9VUl9DSEFSX0NPREUoJ2NhZGInKQorY0FwcGxlVGFsa0FkZHJlc3MgPSBGT1VSX0NIQVJfQ09ERSgnY2F0ICcpCitjQnVzQWRkcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdjYnVzJykKK2NFdGhlcm5ldEFkZHJlc3MgPSBGT1VSX0NIQVJfQ09ERSgnY2VuICcpCitjRmlyZVdpcmVBZGRyZXNzID0gRk9VUl9DSEFSX0NPREUoJ2NmdyAnKQorY0lQQWRkcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdjaXAgJykKK2NMb2NhbFRhbGtBZGRyZXNzID0gRk9VUl9DSEFSX0NPREUoJ2NsdCAnKQorY1NDU0lBZGRyZXNzID0gRk9VUl9DSEFSX0NPREUoJ2NzY3MnKQorY1Rva2VuUmluZ0FkZHJlc3MgPSBGT1VSX0NIQVJfQ09ERSgnY3RvaycpCitjVVNCQWRkcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdjdXNiJykKK3BEZXZpY2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3BkdnQnKQorcERldmljZUFkZHJlc3MgPSBGT1VSX0NIQVJfQ09ERSgncGR2YScpCitwQ29uZHVpdCA9IEZPVVJfQ0hBUl9DT0RFKCdwY29uJykKK3BQcm90b2NvbCA9IEZPVVJfQ0hBUl9DT0RFKCdwcHJ0JykKK3BBVE1hY2hpbmUgPSBGT1VSX0NIQVJfQ09ERSgncGF0bScpCitwQVRab25lID0gRk9VUl9DSEFSX0NPREUoJ3BhdHonKQorcEFUVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdwYXR0JykKK3BEb3R0ZWREZWNpbWFsID0gRk9VUl9DSEFSX0NPREUoJ3BpcGQnKQorcEROUyA9IEZPVVJfQ0hBUl9DT0RFKCdwZG5zJykKK3BQb3J0ID0gRk9VUl9DSEFSX0NPREUoJ3Bwb3InKQorcE5ldHdvcmsgPSBGT1VSX0NIQVJfQ09ERSgncG5ldCcpCitwTm9kZSA9IEZPVVJfQ0hBUl9DT0RFKCdwbm9kJykKK3BTb2NrZXQgPSBGT1VSX0NIQVJfQ09ERSgncHNvYycpCitwU0NTSUJ1cyA9IEZPVVJfQ0hBUl9DT0RFKCdwc2NiJykKK3BTQ1NJTFVOID0gRk9VUl9DSEFSX0NPREUoJ3BzbHUnKQorZURldmljZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZWR2dCcpCitlQWRkcmVzc1NwZWMgPSBGT1VSX0NIQVJfQ09ERSgnZWFkcycpCitlQ29uZHVpdCA9IEZPVVJfQ0hBUl9DT0RFKCdlY29uJykKK2VQcm90b2NvbCA9IEZPVVJfQ0hBUl9DT0RFKCdlcHJvJykKK2VBREIgPSBGT1VSX0NIQVJfQ09ERSgnZWFkYicpCitlQW5hbG9nQXVkaW8gPSBGT1VSX0NIQVJfQ09ERSgnZXBhdScpCitlQXBwbGVUYWxrID0gRk9VUl9DSEFSX0NPREUoJ2VwYXQnKQorZUF1ZGlvTGluZUluID0gRk9VUl9DSEFSX0NPREUoJ2VjYWknKQorZUF1ZGlvTGluZU91dCA9IEZPVVJfQ0hBUl9DT0RFKCdlY2FsJykKK2VBdWRpb091dCA9IEZPVVJfQ0hBUl9DT0RFKCdlY2FvJykKK2VCdXMgPSBGT1VSX0NIQVJfQ09ERSgnZWJ1cycpCitlQ0RST00gPSBGT1VSX0NIQVJfQ09ERSgnZWNkICcpCitlQ29tbVNsb3QgPSBGT1VSX0NIQVJfQ09ERSgnZWNjbScpCitlRGlnaXRhbEF1ZGlvID0gRk9VUl9DSEFSX0NPREUoJ2VwZGEnKQorZURpc3BsYXkgPSBGT1VSX0NIQVJfQ09ERSgnZWRkcycpCitlRFZEID0gRk9VUl9DSEFSX0NPREUoJ2VkdmQnKQorZUV0aGVybmV0ID0gRk9VUl9DSEFSX0NPREUoJ2VjZW4nKQorZUZpcmVXaXJlID0gRk9VUl9DSEFSX0NPREUoJ2VjZncnKQorZUZsb3BweSA9IEZPVVJfQ0hBUl9DT0RFKCdlZmQgJykKK2VIRCA9IEZPVVJfQ0hBUl9DT0RFKCdlaGQgJykKK2VJbmZyYXJlZCA9IEZPVVJfQ0hBUl9DT0RFKCdlY2lyJykKK2VJUCA9IEZPVVJfQ0hBUl9DT0RFKCdlcGlwJykKK2VJckRBID0gRk9VUl9DSEFSX0NPREUoJ2VwaXInKQorZUlSVGFsayA9IEZPVVJfQ0hBUl9DT0RFKCdlcGl0JykKK2VLZXlib2FyZCA9IEZPVVJfQ0hBUl9DT0RFKCdla2JkJykKK2VMQ0QgPSBGT1VSX0NIQVJfQ09ERSgnZWRsYycpCitlTG9jYWxUYWxrID0gRk9VUl9DSEFSX0NPREUoJ2VjbHQnKQorZU1hY0lQID0gRk9VUl9DSEFSX0NPREUoJ2VwbWknKQorZU1hY1ZpZGVvID0gRk9VUl9DSEFSX0NPREUoJ2VwbXYnKQorZU1pY3JvcGhvbmUgPSBGT1VSX0NIQVJfQ09ERSgnZWNtaScpCitlTW9kZW1Qb3J0ID0gRk9VUl9DSEFSX0NPREUoJ2VjbXAnKQorZU1vZGVtUHJpbnRlclBvcnQgPSBGT1VSX0NIQVJfQ09ERSgnZW1wcCcpCitlTW9kZW0gPSBGT1VSX0NIQVJfQ09ERSgnZWRtbScpCitlTW9uaXRvck91dCA9IEZPVVJfQ0hBUl9DT0RFKCdlY21uJykKK2VNb3VzZSA9IEZPVVJfQ0hBUl9DT0RFKCdlbW91JykKK2VOdUJ1c0NhcmQgPSBGT1VSX0NIQVJfQ09ERSgnZWRuYicpCitlTnVCdXMgPSBGT1VSX0NIQVJfQ09ERSgnZW51YicpCitlUENjYXJkID0gRk9VUl9DSEFSX0NPREUoJ2VjcGMnKQorZVBDSWJ1cyA9IEZPVVJfQ0hBUl9DT0RFKCdlY3BpJykKK2VQQ0ljYXJkID0gRk9VUl9DSEFSX0NPREUoJ2VkcGknKQorZVBEU3Nsb3QgPSBGT1VSX0NIQVJfQ09ERSgnZWNwZCcpCitlUERTY2FyZCA9IEZPVVJfQ0hBUl9DT0RFKCdlcGRzJykKK2VQb2ludGluZ0RldmljZSA9IEZPVVJfQ0hBUl9DT0RFKCdlZHBkJykKK2VQb3N0U2NyaXB0ID0gRk9VUl9DSEFSX0NPREUoJ2VwcHMnKQorZVBQUCA9IEZPVVJfQ0hBUl9DT0RFKCdlcHBwJykKK2VQcmludGVyUG9ydCA9IEZPVVJfQ0hBUl9DT0RFKCdlY3BwJykKK2VQcmludGVyID0gRk9VUl9DSEFSX0NPREUoJ2VkcHInKQorZVN2aWRlbyA9IEZPVVJfQ0hBUl9DT0RFKCdlcHN2JykKK2VTQ1NJID0gRk9VUl9DSEFSX0NPREUoJ2Vjc2MnKQorZVNlcmlhbCA9IEZPVVJfQ0hBUl9DT0RFKCdlcHNyJykKK2VTcGVha2VycyA9IEZPVVJfQ0hBUl9DT0RFKCdlZHNwJykKK2VTdG9yYWdlRGV2aWNlID0gRk9VUl9DSEFSX0NPREUoJ2Vkc3QnKQorZVNWR0EgPSBGT1VSX0NIQVJfQ09ERSgnZXBzZycpCitlVG9rZW5SaW5nID0gRk9VUl9DSEFSX0NPREUoJ2V0b2snKQorZVRyYWNrYmFsbCA9IEZPVVJfQ0hBUl9DT0RFKCdldHJrJykKK2VUcmFja3BhZCA9IEZPVVJfQ0hBUl9DT0RFKCdlZHRwJykKK2VVU0IgPSBGT1VSX0NIQVJfQ09ERSgnZWN1cycpCitlVmlkZW9JbiA9IEZPVVJfQ0hBUl9DT0RFKCdlY3ZpJykKK2VWaWRlb01vbml0b3IgPSBGT1VSX0NIQVJfQ09ERSgnZWR2bScpCitlVmlkZW9PdXQgPSBGT1VSX0NIQVJfQ09ERSgnZWN2bycpCitjS2V5c3Ryb2tlID0gRk9VUl9DSEFSX0NPREUoJ2twcnMnKQorcEtleXN0cm9rZUtleSA9IEZPVVJfQ0hBUl9DT0RFKCdrTXNnJykKK3BNb2RpZmllcnMgPSBGT1VSX0NIQVJfQ09ERSgna01vZCcpCitwS2V5S2luZCA9IEZPVVJfQ0hBUl9DT0RFKCdra25kJykKK2VNb2RpZmllcnMgPSBGT1VSX0NIQVJfQ09ERSgnZU1kcycpCitlT3B0aW9uRG93biA9IEZPVVJfQ0hBUl9DT0RFKCdLb3B0JykKK2VDb21tYW5kRG93biA9IEZPVVJfQ0hBUl9DT0RFKCdLY21kJykKK2VDb250cm9sRG93biA9IEZPVVJfQ0hBUl9DT0RFKCdLY3RsJykKK2VTaGlmdERvd24gPSBGT1VSX0NIQVJfQ09ERSgnS3NmdCcpCitlQ2Fwc0xvY2tEb3duID0gRk9VUl9DSEFSX0NPREUoJ0tjbGsnKQorZUtleUtpbmQgPSBGT1VSX0NIQVJfQ09ERSgnZWtzdCcpCitlRXNjYXBlS2V5ID0gMHg2QjczMzUwMAorZURlbGV0ZUtleSA9IDB4NkI3MzMzMDAKK2VUYWJLZXkgPSAweDZCNzMzMDAwCitlUmV0dXJuS2V5ID0gMHg2QjczMjQwMAorZUNsZWFyS2V5ID0gMHg2QjczNDcwMAorZUVudGVyS2V5ID0gMHg2QjczNEMwMAorZVVwQXJyb3dLZXkgPSAweDZCNzM3RTAwCitlRG93bkFycm93S2V5ID0gMHg2QjczN0QwMAorZUxlZnRBcnJvd0tleSA9IDB4NkI3MzdCMDAKK2VSaWdodEFycm93S2V5ID0gMHg2QjczN0MwMAorZUhlbHBLZXkgPSAweDZCNzM3MjAwCitlSG9tZUtleSA9IDB4NkI3MzczMDAKK2VQYWdlVXBLZXkgPSAweDZCNzM3NDAwCitlUGFnZURvd25LZXkgPSAweDZCNzM3OTAwCitlRm9yd2FyZERlbEtleSA9IDB4NkI3Mzc1MDAKK2VFbmRLZXkgPSAweDZCNzM3NzAwCitlRjFLZXkgPSAweDZCNzM3QTAwCitlRjJLZXkgPSAweDZCNzM3ODAwCitlRjNLZXkgPSAweDZCNzM2MzAwCitlRjRLZXkgPSAweDZCNzM3NjAwCitlRjVLZXkgPSAweDZCNzM2MDAwCitlRjZLZXkgPSAweDZCNzM2MTAwCitlRjdLZXkgPSAweDZCNzM2MjAwCitlRjhLZXkgPSAweDZCNzM2NDAwCitlRjlLZXkgPSAweDZCNzM2NTAwCitlRjEwS2V5ID0gMHg2QjczNkQwMAorZUYxMUtleSA9IDB4NkI3MzY3MDAKK2VGMTJLZXkgPSAweDZCNzM2RjAwCitlRjEzS2V5ID0gMHg2QjczNjkwMAorZUYxNEtleSA9IDB4NkI3MzZCMDAKK2VGMTVLZXkgPSAweDZCNzM3MTAwCitrQUVBTkQgPSBGT1VSX0NIQVJfQ09ERSgnQU5EICcpCitrQUVPUiA9IEZPVVJfQ0hBUl9DT0RFKCdPUiAgJykKK2tBRU5PVCA9IEZPVVJfQ0hBUl9DT0RFKCdOT1QgJykKK2tBRUZpcnN0ID0gRk9VUl9DSEFSX0NPREUoJ2ZpcnMnKQora0FFTGFzdCA9IEZPVVJfQ0hBUl9DT0RFKCdsYXN0JykKK2tBRU1pZGRsZSA9IEZPVVJfQ0hBUl9DT0RFKCdtaWRkJykKK2tBRUFueSA9IEZPVVJfQ0hBUl9DT0RFKCdhbnkgJykKK2tBRUFsbCA9IEZPVVJfQ0hBUl9DT0RFKCdhbGwgJykKK2tBRU5leHQgPSBGT1VSX0NIQVJfQ09ERSgnbmV4dCcpCitrQUVQcmV2aW91cyA9IEZPVVJfQ0hBUl9DT0RFKCdwcmV2JykKK2tleUFFQ29tcE9wZXJhdG9yID0gRk9VUl9DSEFSX0NPREUoJ3JlbG8nKQora2V5QUVMb2dpY2FsVGVybXMgPSBGT1VSX0NIQVJfQ09ERSgndGVybScpCitrZXlBRUxvZ2ljYWxPcGVyYXRvciA9IEZPVVJfQ0hBUl9DT0RFKCdsb2djJykKK2tleUFFT2JqZWN0MSA9IEZPVVJfQ0hBUl9DT0RFKCdvYmoxJykKK2tleUFFT2JqZWN0MiA9IEZPVVJfQ0hBUl9DT0RFKCdvYmoyJykKK2tleUFFRGVzaXJlZENsYXNzID0gRk9VUl9DSEFSX0NPREUoJ3dhbnQnKQora2V5QUVDb250YWluZXIgPSBGT1VSX0NIQVJfQ09ERSgnZnJvbScpCitrZXlBRUtleUZvcm0gPSBGT1VSX0NIQVJfQ09ERSgnZm9ybScpCitrZXlBRUtleURhdGEgPSBGT1VSX0NIQVJfQ09ERSgnc2VsZCcpCitrZXlBRVJhbmdlU3RhcnQgPSBGT1VSX0NIQVJfQ09ERSgnc3RhcicpCitrZXlBRVJhbmdlU3RvcCA9IEZPVVJfQ0hBUl9DT0RFKCdzdG9wJykKK2tleURpc3Bvc2VUb2tlblByb2MgPSBGT1VSX0NIQVJfQ09ERSgneHRvaycpCitrZXlBRUNvbXBhcmVQcm9jID0gRk9VUl9DSEFSX0NPREUoJ2NtcHInKQora2V5QUVDb3VudFByb2MgPSBGT1VSX0NIQVJfQ09ERSgnY29udCcpCitrZXlBRU1hcmtUb2tlblByb2MgPSBGT1VSX0NIQVJfQ09ERSgnbWtpZCcpCitrZXlBRU1hcmtQcm9jID0gRk9VUl9DSEFSX0NPREUoJ21hcmsnKQora2V5QUVBZGp1c3RNYXJrc1Byb2MgPSBGT1VSX0NIQVJfQ09ERSgnYWRqbScpCitrZXlBRUdldEVyckRlc2NQcm9jID0gRk9VUl9DSEFSX0NPREUoJ2luZGMnKQorZm9ybUFic29sdXRlUG9zaXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnaW5keCcpCitmb3JtUmVsYXRpdmVQb3NpdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdyZWxlJykKK2Zvcm1UZXN0ID0gRk9VUl9DSEFSX0NPREUoJ3Rlc3QnKQorZm9ybVJhbmdlID0gRk9VUl9DSEFSX0NPREUoJ3JhbmcnKQorZm9ybVByb3BlcnR5SUQgPSBGT1VSX0NIQVJfQ09ERSgncHJvcCcpCitmb3JtTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCduYW1lJykKK3R5cGVPYmplY3RTcGVjaWZpZXIgPSBGT1VSX0NIQVJfQ09ERSgnb2JqICcpCit0eXBlT2JqZWN0QmVpbmdFeGFtaW5lZCA9IEZPVVJfQ0hBUl9DT0RFKCdleG1uJykKK3R5cGVDdXJyZW50Q29udGFpbmVyID0gRk9VUl9DSEFSX0NPREUoJ2NjbnQnKQordHlwZVRva2VuID0gRk9VUl9DSEFSX0NPREUoJ3Rva2UnKQordHlwZVJlbGF0aXZlRGVzY3JpcHRvciA9IEZPVVJfQ0hBUl9DT0RFKCdyZWwgJykKK3R5cGVBYnNvbHV0ZU9yZGluYWwgPSBGT1VSX0NIQVJfQ09ERSgnYWJzbycpCit0eXBlSW5kZXhEZXNjcmlwdG9yID0gRk9VUl9DSEFSX0NPREUoJ2luZGUnKQordHlwZVJhbmdlRGVzY3JpcHRvciA9IEZPVVJfQ0hBUl9DT0RFKCdyYW5nJykKK3R5cGVMb2dpY2FsRGVzY3JpcHRvciA9IEZPVVJfQ0hBUl9DT0RFKCdsb2dpJykKK3R5cGVDb21wRGVzY3JpcHRvciA9IEZPVVJfQ0hBUl9DT0RFKCdjbXBkJykKK3R5cGVPU0xUb2tlbkxpc3QgPSBGT1VSX0NIQVJfQ09ERSgnb3N0bCcpCitrQUVJRG9NaW5pbXVtID0gMHgwMDAwCitrQUVJRG9XaG9zZSA9IDB4MDAwMQora0FFSURvTWFya2luZyA9IDB4MDAwNAora0FFUGFzc1N1YkRlc2NzID0gMHgwMDA4CitrQUVSZXNvbHZlTmVzdGVkTGlzdHMgPSAweDAwMTAKK2tBRUhhbmRsZVNpbXBsZVJhbmdlcyA9IDB4MDAyMAora0FFVXNlUmVsYXRpdmVJdGVyYXRvcnMgPSAweDAwNDAKK3R5cGVXaG9zZURlc2NyaXB0b3IgPSBGT1VSX0NIQVJfQ09ERSgnd2hvcycpCitmb3JtV2hvc2UgPSBGT1VSX0NIQVJfQ09ERSgnd2hvcycpCit0eXBlV2hvc2VSYW5nZSA9IEZPVVJfQ0hBUl9DT0RFKCd3cm5nJykKK2tleUFFV2hvc2VSYW5nZVN0YXJ0ID0gRk9VUl9DSEFSX0NPREUoJ3dzdHInKQora2V5QUVXaG9zZVJhbmdlU3RvcCA9IEZPVVJfQ0hBUl9DT0RFKCd3c3RwJykKK2tleUFFSW5kZXggPSBGT1VSX0NIQVJfQ09ERSgna2lkeCcpCitrZXlBRVRlc3QgPSBGT1VSX0NIQVJfQ09ERSgna3RzdCcpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBsZUV2ZW50cy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBsZUV2ZW50cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiYTM0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FwcGxlRXZlbnRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBsZUV2ZW50cy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBsZUV2ZW50cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRiYTM0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FwcGxlRXZlbnRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBsZUhlbHAucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBsZUhlbHAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5NmQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0FwcGxlSGVscC5weQpAQCAtMCwwICsxLDYgQEAKKyMgR2VuZXJhdGVkIGZyb20gJ0FwcGxlSGVscC5oJworCitrQUhJbnRlcm5hbEVyciA9IC0xMDc5MAora0FISW50ZXJuZXRDb25maWdQcmVmRXJyID0gLTEwNzkxCitrQUhUT0NUeXBlVXNlciA9IDAKK2tBSFRPQ1R5cGVEZXZlbG9wZXIgPSAxCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBsZUhlbHAucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQXBwbGVIZWxwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjUxNmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQXBwbGVIZWxwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9BcHBsZUhlbHAucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQXBwbGVIZWxwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjUxNmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQXBwbGVIZWxwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DRi5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NGLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNzg0YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DRi5weQpAQCAtMCwwICsxIEBACitmcm9tIF9DRiBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ0YucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ0YucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YjQzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DRi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ0YucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ0YucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YjQzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DRi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ0cucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DRy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmY1NzcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ0cucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfQ0cgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NHLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NHLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUwZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ0cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NHLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NHLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWUwZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ0cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NhcmJvbkV2ZW50cy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NhcmJvbkV2ZW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTdlZTVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ2FyYm9uRXZlbnRzLnB5CkBAIC0wLDAgKzEsNDUxIEBACisjIEdlbmVyYXRlZCBmcm9tICdDYXJib25FdmVudHMuaCcKKworZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAorZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAorZmFsc2UgPSAwCit0cnVlID0gMQora2V5QUVFdmVudENsYXNzID0gRk9VUl9DSEFSX0NPREUoJ2V2Y2wnKQora2V5QUVFdmVudElEID0gRk9VUl9DSEFSX0NPREUoJ2V2dGknKQorZXZlbnRBbHJlYWR5UG9zdGVkRXJyID0gLTk4NjAKK2V2ZW50VGFyZ2V0QnVzeUVyciA9IC05ODYxCitldmVudENsYXNzSW52YWxpZEVyciA9IC05ODYyCitldmVudENsYXNzSW5jb3JyZWN0RXJyID0gLTk4NjQKK2V2ZW50SGFuZGxlckFscmVhZHlJbnN0YWxsZWRFcnIgPSAtOTg2NgorZXZlbnRJbnRlcm5hbEVyciA9IC05ODY4CitldmVudEtpbmRJbmNvcnJlY3RFcnIgPSAtOTg2OQorZXZlbnRQYXJhbWV0ZXJOb3RGb3VuZEVyciA9IC05ODcwCitldmVudE5vdEhhbmRsZWRFcnIgPSAtOTg3NAorZXZlbnRMb29wVGltZWRPdXRFcnIgPSAtOTg3NQorZXZlbnRMb29wUXVpdEVyciA9IC05ODc2CitldmVudE5vdEluUXVldWVFcnIgPSAtOTg3NworZXZlbnRIb3RLZXlFeGlzdHNFcnIgPSAtOTg3OAorZXZlbnRIb3RLZXlJbnZhbGlkRXJyID0gLTk4NzkKK2tFdmVudFByaW9yaXR5TG93ID0gMAora0V2ZW50UHJpb3JpdHlTdGFuZGFyZCA9IDEKK2tFdmVudFByaW9yaXR5SGlnaCA9IDIKK2tFdmVudExlYXZlSW5RdWV1ZSA9IGZhbHNlCitrRXZlbnRSZW1vdmVGcm9tUXVldWUgPSB0cnVlCitrVHJhY2tNb3VzZUxvY2F0aW9uT3B0aW9uRG9udENvbnN1bWVNb3VzZVVwID0gKDEgPDwgMCkKK2tNb3VzZVRyYWNraW5nTW91c2VEb3duID0gMQora01vdXNlVHJhY2tpbmdNb3VzZVVwID0gMgora01vdXNlVHJhY2tpbmdNb3VzZUV4aXRlZCA9IDMKK2tNb3VzZVRyYWNraW5nTW91c2VFbnRlcmVkID0gNAora01vdXNlVHJhY2tpbmdNb3VzZURyYWdnZWQgPSA1CitrTW91c2VUcmFja2luZ0tleU1vZGlmaWVyc0NoYW5nZWQgPSA2CitrTW91c2VUcmFja2luZ1VzZXJDYW5jZWxsZWQgPSA3CitrTW91c2VUcmFja2luZ1RpbWVkT3V0ID0gOAora01vdXNlVHJhY2tpbmdNb3VzZU1vdmVkID0gOQora0V2ZW50QXR0cmlidXRlTm9uZSA9IDAKK2tFdmVudEF0dHJpYnV0ZVVzZXJFdmVudCA9ICgxIDw8IDApCitrRXZlbnRDbGFzc01vdXNlID0gRk9VUl9DSEFSX0NPREUoJ21vdXMnKQora0V2ZW50Q2xhc3NLZXlib2FyZCA9IEZPVVJfQ0hBUl9DT0RFKCdrZXliJykKK2tFdmVudENsYXNzVGV4dElucHV0ID0gRk9VUl9DSEFSX0NPREUoJ3RleHQnKQora0V2ZW50Q2xhc3NBcHBsaWNhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdhcHBsJykKK2tFdmVudENsYXNzQXBwbGVFdmVudCA9IEZPVVJfQ0hBUl9DT0RFKCdlcHBjJykKK2tFdmVudENsYXNzTWVudSA9IEZPVVJfQ0hBUl9DT0RFKCdtZW51JykKK2tFdmVudENsYXNzV2luZG93ID0gRk9VUl9DSEFSX0NPREUoJ3dpbmQnKQora0V2ZW50Q2xhc3NDb250cm9sID0gRk9VUl9DSEFSX0NPREUoJ2NudGwnKQora0V2ZW50Q2xhc3NDb21tYW5kID0gRk9VUl9DSEFSX0NPREUoJ2NtZHMnKQora0V2ZW50Q2xhc3NUYWJsZXQgPSBGT1VSX0NIQVJfQ09ERSgndGJsdCcpCitrRXZlbnRDbGFzc1ZvbHVtZSA9IEZPVVJfQ0hBUl9DT0RFKCd2b2wgJykKK2tFdmVudENsYXNzQXBwZWFyYW5jZSA9IEZPVVJfQ0hBUl9DT0RFKCdhcHBtJykKK2tFdmVudENsYXNzU2VydmljZSA9IEZPVVJfQ0hBUl9DT0RFKCdzZXJ2JykKK2tFdmVudE1vdXNlRG93biA9IDEKK2tFdmVudE1vdXNlVXAgPSAyCitrRXZlbnRNb3VzZU1vdmVkID0gNQora0V2ZW50TW91c2VEcmFnZ2VkID0gNgora0V2ZW50TW91c2VXaGVlbE1vdmVkID0gMTAKK2tFdmVudE1vdXNlQnV0dG9uUHJpbWFyeSA9IDEKK2tFdmVudE1vdXNlQnV0dG9uU2Vjb25kYXJ5ID0gMgora0V2ZW50TW91c2VCdXR0b25UZXJ0aWFyeSA9IDMKK2tFdmVudE1vdXNlV2hlZWxBeGlzWCA9IDAKK2tFdmVudE1vdXNlV2hlZWxBeGlzWSA9IDEKK2tFdmVudFRleHRJbnB1dFVwZGF0ZUFjdGl2ZUlucHV0QXJlYSA9IDEKK2tFdmVudFRleHRJbnB1dFVuaWNvZGVGb3JLZXlFdmVudCA9IDIKK2tFdmVudFRleHRJbnB1dE9mZnNldFRvUG9zID0gMwora0V2ZW50VGV4dElucHV0UG9zVG9PZmZzZXQgPSA0CitrRXZlbnRUZXh0SW5wdXRTaG93SGlkZUJvdHRvbVdpbmRvdyA9IDUKK2tFdmVudFRleHRJbnB1dEdldFNlbGVjdGVkVGV4dCA9IDYKK2tFdmVudFJhd0tleURvd24gPSAxCitrRXZlbnRSYXdLZXlSZXBlYXQgPSAyCitrRXZlbnRSYXdLZXlVcCA9IDMKK2tFdmVudFJhd0tleU1vZGlmaWVyc0NoYW5nZWQgPSA0CitrRXZlbnRIb3RLZXlQcmVzc2VkID0gNQora0V2ZW50SG90S2V5UmVsZWFzZWQgPSA2CitrRXZlbnRLZXlNb2RpZmllck51bUxvY2tCaXQgPSAxNgora0V2ZW50S2V5TW9kaWZpZXJGbkJpdCA9IDE3CitrRXZlbnRLZXlNb2RpZmllck51bUxvY2tNYXNrID0gMUwgPDwga0V2ZW50S2V5TW9kaWZpZXJOdW1Mb2NrQml0CitrRXZlbnRLZXlNb2RpZmllckZuTWFzayA9IDFMIDw8IGtFdmVudEtleU1vZGlmaWVyRm5CaXQKK2tFdmVudEFwcEFjdGl2YXRlZCA9IDEKK2tFdmVudEFwcERlYWN0aXZhdGVkID0gMgora0V2ZW50QXBwUXVpdCA9IDMKK2tFdmVudEFwcExhdW5jaE5vdGlmaWNhdGlvbiA9IDQKK2tFdmVudEFwcExhdW5jaGVkID0gNQora0V2ZW50QXBwVGVybWluYXRlZCA9IDYKK2tFdmVudEFwcEZyb250U3dpdGNoZWQgPSA3CitrRXZlbnRBcHBHZXREb2NrVGlsZU1lbnUgPSAyMAora0V2ZW50QXBwbGVFdmVudCA9IDEKK2tFdmVudFdpbmRvd1VwZGF0ZSA9IDEKK2tFdmVudFdpbmRvd0RyYXdDb250ZW50ID0gMgora0V2ZW50V2luZG93QWN0aXZhdGVkID0gNQora0V2ZW50V2luZG93RGVhY3RpdmF0ZWQgPSA2CitrRXZlbnRXaW5kb3dHZXRDbGlja0FjdGl2YXRpb24gPSA3CitrRXZlbnRXaW5kb3dTaG93aW5nID0gMjIKK2tFdmVudFdpbmRvd0hpZGluZyA9IDIzCitrRXZlbnRXaW5kb3dTaG93biA9IDI0CitrRXZlbnRXaW5kb3dIaWRkZW4gPSAyNQora0V2ZW50V2luZG93Q29sbGFwc2luZyA9IDg2CitrRXZlbnRXaW5kb3dDb2xsYXBzZWQgPSA2Nwora0V2ZW50V2luZG93RXhwYW5kaW5nID0gODcKK2tFdmVudFdpbmRvd0V4cGFuZGVkID0gNzAKK2tFdmVudFdpbmRvd1pvb21lZCA9IDc2CitrRXZlbnRXaW5kb3dCb3VuZHNDaGFuZ2luZyA9IDI2CitrRXZlbnRXaW5kb3dCb3VuZHNDaGFuZ2VkID0gMjcKK2tFdmVudFdpbmRvd1Jlc2l6ZVN0YXJ0ZWQgPSAyOAora0V2ZW50V2luZG93UmVzaXplQ29tcGxldGVkID0gMjkKK2tFdmVudFdpbmRvd0RyYWdTdGFydGVkID0gMzAKK2tFdmVudFdpbmRvd0RyYWdDb21wbGV0ZWQgPSAzMQora0V2ZW50V2luZG93Q2xvc2VkID0gNzMKK2tXaW5kb3dCb3VuZHNDaGFuZ2VVc2VyRHJhZyA9ICgxIDw8IDApCitrV2luZG93Qm91bmRzQ2hhbmdlVXNlclJlc2l6ZSA9ICgxIDw8IDEpCitrV2luZG93Qm91bmRzQ2hhbmdlU2l6ZUNoYW5nZWQgPSAoMSA8PCAyKQora1dpbmRvd0JvdW5kc0NoYW5nZU9yaWdpbkNoYW5nZWQgPSAoMSA8PCAzKQora1dpbmRvd0JvdW5kc0NoYW5nZVpvb20gPSAoMSA8PCA0KQora0V2ZW50V2luZG93Q2xpY2tEcmFnUmduID0gMzIKK2tFdmVudFdpbmRvd0NsaWNrUmVzaXplUmduID0gMzMKK2tFdmVudFdpbmRvd0NsaWNrQ29sbGFwc2VSZ24gPSAzNAora0V2ZW50V2luZG93Q2xpY2tDbG9zZVJnbiA9IDM1CitrRXZlbnRXaW5kb3dDbGlja1pvb21SZ24gPSAzNgora0V2ZW50V2luZG93Q2xpY2tDb250ZW50UmduID0gMzcKK2tFdmVudFdpbmRvd0NsaWNrUHJveHlJY29uUmduID0gMzgKK2tFdmVudFdpbmRvd0NsaWNrVG9vbGJhckJ1dHRvblJnbiA9IDQxCitrRXZlbnRXaW5kb3dDbGlja1N0cnVjdHVyZVJnbiA9IDQyCitrRXZlbnRXaW5kb3dDdXJzb3JDaGFuZ2UgPSA0MAora0V2ZW50V2luZG93Q29sbGFwc2UgPSA2Ngora0V2ZW50V2luZG93Q29sbGFwc2VBbGwgPSA2OAora0V2ZW50V2luZG93RXhwYW5kID0gNjkKK2tFdmVudFdpbmRvd0V4cGFuZEFsbCA9IDcxCitrRXZlbnRXaW5kb3dDbG9zZSA9IDcyCitrRXZlbnRXaW5kb3dDbG9zZUFsbCA9IDc0CitrRXZlbnRXaW5kb3dab29tID0gNzUKK2tFdmVudFdpbmRvd1pvb21BbGwgPSA3Nwora0V2ZW50V2luZG93Q29udGV4dHVhbE1lbnVTZWxlY3QgPSA3OAora0V2ZW50V2luZG93UGF0aFNlbGVjdCA9IDc5CitrRXZlbnRXaW5kb3dHZXRJZGVhbFNpemUgPSA4MAora0V2ZW50V2luZG93R2V0TWluaW11bVNpemUgPSA4MQora0V2ZW50V2luZG93R2V0TWF4aW11bVNpemUgPSA4Mgora0V2ZW50V2luZG93Q29uc3RyYWluID0gODMKK2tFdmVudFdpbmRvd0hhbmRsZUNvbnRlbnRDbGljayA9IDg1CitrRXZlbnRXaW5kb3dQcm94eUJlZ2luRHJhZyA9IDEyOAora0V2ZW50V2luZG93UHJveHlFbmREcmFnID0gMTI5CitrRXZlbnRXaW5kb3dUb29sYmFyU3dpdGNoTW9kZSA9IDE1MAora0RvY2tDaGFuZ2VkVXNlciA9IDEKK2tEb2NrQ2hhbmdlZE9yaWVudGF0aW9uID0gMgora0RvY2tDaGFuZ2VkQXV0b2hpZGUgPSAzCitrRG9ja0NoYW5nZWREaXNwbGF5ID0gNAora0RvY2tDaGFuZ2VkSXRlbXMgPSA1CitrRG9ja0NoYW5nZWRVbmtub3duID0gNgora0V2ZW50V2luZG93Rm9jdXNBY3F1aXJlZCA9IDIwMAora0V2ZW50V2luZG93Rm9jdXNSZWxpbnF1aXNoID0gMjAxCitrRXZlbnRXaW5kb3dEcmF3RnJhbWUgPSAxMDAwCitrRXZlbnRXaW5kb3dEcmF3UGFydCA9IDEwMDEKK2tFdmVudFdpbmRvd0dldFJlZ2lvbiA9IDEwMDIKK2tFdmVudFdpbmRvd0hpdFRlc3QgPSAxMDAzCitrRXZlbnRXaW5kb3dJbml0ID0gMTAwNAora0V2ZW50V2luZG93RGlzcG9zZSA9IDEwMDUKK2tFdmVudFdpbmRvd0RyYWdIaWxpdGUgPSAxMDA2CitrRXZlbnRXaW5kb3dNb2RpZmllZCA9IDEwMDcKK2tFdmVudFdpbmRvd1NldHVwUHJveHlEcmFnSW1hZ2UgPSAxMDA4CitrRXZlbnRXaW5kb3dTdGF0ZUNoYW5nZWQgPSAxMDA5CitrRXZlbnRXaW5kb3dNZWFzdXJlVGl0bGUgPSAxMDEwCitrRXZlbnRXaW5kb3dEcmF3R3Jvd0JveCA9IDEwMTEKK2tFdmVudFdpbmRvd0dldEdyb3dJbWFnZVJlZ2lvbiA9IDEwMTIKK2tFdmVudFdpbmRvd1BhaW50ID0gMTAxMwora0V2ZW50TWVudUJlZ2luVHJhY2tpbmcgPSAxCitrRXZlbnRNZW51RW5kVHJhY2tpbmcgPSAyCitrRXZlbnRNZW51Q2hhbmdlVHJhY2tpbmdNb2RlID0gMwora0V2ZW50TWVudU9wZW5pbmcgPSA0CitrRXZlbnRNZW51Q2xvc2VkID0gNQora0V2ZW50TWVudVRhcmdldEl0ZW0gPSA2CitrRXZlbnRNZW51TWF0Y2hLZXkgPSA3CitrRXZlbnRNZW51RW5hYmxlSXRlbXMgPSA4CitrRXZlbnRNZW51UG9wdWxhdGUgPSA5CitrRXZlbnRNZW51TWVhc3VyZUl0ZW1XaWR0aCA9IDEwMAora0V2ZW50TWVudU1lYXN1cmVJdGVtSGVpZ2h0ID0gMTAxCitrRXZlbnRNZW51RHJhd0l0ZW0gPSAxMDIKK2tFdmVudE1lbnVEcmF3SXRlbUNvbnRlbnQgPSAxMDMKK2tFdmVudE1lbnVEaXNwb3NlID0gMTAwMQora01lbnVDb250ZXh0TWVudUJhciA9IDEgPDwgMAora01lbnVDb250ZXh0UHVsbERvd24gPSAxIDw8IDgKK2tNZW51Q29udGV4dFBvcFVwID0gMSA8PCA5CitrTWVudUNvbnRleHRTdWJtZW51ID0gMSA8PCAxMAora01lbnVDb250ZXh0TWVudUJhclRyYWNraW5nID0gMSA8PCAxNgora01lbnVDb250ZXh0UG9wVXBUcmFja2luZyA9IDEgPDwgMTcKK2tNZW51Q29udGV4dEtleU1hdGNoaW5nID0gMSA8PCAxOAora01lbnVDb250ZXh0TWVudUVuYWJsaW5nID0gMSA8PCAxOQora01lbnVDb250ZXh0Q29tbWFuZElEU2VhcmNoID0gMSA8PCAyMAora0V2ZW50UHJvY2Vzc0NvbW1hbmQgPSAxCitrRXZlbnRDb21tYW5kUHJvY2VzcyA9IDEKK2tFdmVudENvbW1hbmRVcGRhdGVTdGF0dXMgPSAyCitrSElDb21tYW5kT0sgPSBGT1VSX0NIQVJfQ09ERSgnb2sgICcpCitrSElDb21tYW5kQ2FuY2VsID0gRk9VUl9DSEFSX0NPREUoJ25vdCEnKQora0hJQ29tbWFuZFF1aXQgPSBGT1VSX0NIQVJfQ09ERSgncXVpdCcpCitrSElDb21tYW5kVW5kbyA9IEZPVVJfQ0hBUl9DT0RFKCd1bmRvJykKK2tISUNvbW1hbmRSZWRvID0gRk9VUl9DSEFSX0NPREUoJ3JlZG8nKQora0hJQ29tbWFuZEN1dCA9IEZPVVJfQ0hBUl9DT0RFKCdjdXQgJykKK2tISUNvbW1hbmRDb3B5ID0gRk9VUl9DSEFSX0NPREUoJ2NvcHknKQora0hJQ29tbWFuZFBhc3RlID0gRk9VUl9DSEFSX0NPREUoJ3Bhc3QnKQora0hJQ29tbWFuZENsZWFyID0gRk9VUl9DSEFSX0NPREUoJ2NsZWEnKQora0hJQ29tbWFuZFNlbGVjdEFsbCA9IEZPVVJfQ0hBUl9DT0RFKCdzYWxsJykKK2tISUNvbW1hbmRIaWRlID0gRk9VUl9DSEFSX0NPREUoJ2hpZGUnKQora0hJQ29tbWFuZEhpZGVPdGhlcnMgPSBGT1VSX0NIQVJfQ09ERSgnaGlkbycpCitrSElDb21tYW5kU2hvd0FsbCA9IEZPVVJfQ0hBUl9DT0RFKCdzaGFsJykKK2tISUNvbW1hbmRQcmVmZXJlbmNlcyA9IEZPVVJfQ0hBUl9DT0RFKCdwcmVmJykKK2tISUNvbW1hbmRab29tV2luZG93ID0gRk9VUl9DSEFSX0NPREUoJ3pvb20nKQora0hJQ29tbWFuZE1pbmltaXplV2luZG93ID0gRk9VUl9DSEFSX0NPREUoJ21pbmknKQora0hJQ29tbWFuZE1pbmltaXplQWxsID0gRk9VUl9DSEFSX0NPREUoJ21pbmEnKQora0hJQ29tbWFuZE1heGltaXplV2luZG93ID0gRk9VUl9DSEFSX0NPREUoJ21heGknKQora0hJQ29tbWFuZE1heGltaXplQWxsID0gRk9VUl9DSEFSX0NPREUoJ21heGEnKQora0hJQ29tbWFuZEFycmFuZ2VJbkZyb250ID0gRk9VUl9DSEFSX0NPREUoJ2ZybnQnKQora0hJQ29tbWFuZEJyaW5nQWxsVG9Gcm9udCA9IEZPVVJfQ0hBUl9DT0RFKCdiZnJ0JykKK2tISUNvbW1hbmRXaW5kb3dMaXN0U2VwYXJhdG9yID0gRk9VUl9DSEFSX0NPREUoJ3dsZHYnKQora0hJQ29tbWFuZFdpbmRvd0xpc3RUZXJtaW5hdG9yID0gRk9VUl9DSEFSX0NPREUoJ3dsc3QnKQora0hJQ29tbWFuZFNlbGVjdFdpbmRvdyA9IEZPVVJfQ0hBUl9DT0RFKCdzd2luJykKK2tISUNvbW1hbmRBYm91dCA9IEZPVVJfQ0hBUl9DT0RFKCdhYm91JykKK2tISUNvbW1hbmROZXcgPSBGT1VSX0NIQVJfQ09ERSgnbmV3ICcpCitrSElDb21tYW5kT3BlbiA9IEZPVVJfQ0hBUl9DT0RFKCdvcGVuJykKK2tISUNvbW1hbmRDbG9zZSA9IEZPVVJfQ0hBUl9DT0RFKCdjbG9zJykKK2tISUNvbW1hbmRTYXZlID0gRk9VUl9DSEFSX0NPREUoJ3NhdmUnKQora0hJQ29tbWFuZFNhdmVBcyA9IEZPVVJfQ0hBUl9DT0RFKCdzdmFzJykKK2tISUNvbW1hbmRSZXZlcnQgPSBGT1VSX0NIQVJfQ09ERSgncnZydCcpCitrSElDb21tYW5kUHJpbnQgPSBGT1VSX0NIQVJfQ09ERSgncHJudCcpCitrSElDb21tYW5kUGFnZVNldHVwID0gRk9VUl9DSEFSX0NPREUoJ3BhZ2UnKQora0hJQ29tbWFuZEFwcEhlbHAgPSBGT1VSX0NIQVJfQ09ERSgnYWhscCcpCitrSElDb21tYW5kRnJvbU1lbnUgPSAoMUwgPDwgMCkKK2tISUNvbW1hbmRGcm9tQ29udHJvbCA9ICgxTCA8PCAxKQora0hJQ29tbWFuZEZyb21XaW5kb3cgPSAoMUwgPDwgMikKK2tFdmVudENvbnRyb2xJbml0aWFsaXplID0gMTAwMAora0V2ZW50Q29udHJvbERpc3Bvc2UgPSAxMDAxCitrRXZlbnRDb250cm9sR2V0T3B0aW1hbEJvdW5kcyA9IDEwMDMKK2tFdmVudENvbnRyb2xEZWZJbml0aWFsaXplID0ga0V2ZW50Q29udHJvbEluaXRpYWxpemUKK2tFdmVudENvbnRyb2xEZWZEaXNwb3NlID0ga0V2ZW50Q29udHJvbERpc3Bvc2UKK2tFdmVudENvbnRyb2xIaXQgPSAxCitrRXZlbnRDb250cm9sU2ltdWxhdGVIaXQgPSAyCitrRXZlbnRDb250cm9sSGl0VGVzdCA9IDMKK2tFdmVudENvbnRyb2xEcmF3ID0gNAora0V2ZW50Q29udHJvbEFwcGx5QmFja2dyb3VuZCA9IDUKK2tFdmVudENvbnRyb2xBcHBseVRleHRDb2xvciA9IDYKK2tFdmVudENvbnRyb2xTZXRGb2N1c1BhcnQgPSA3CitrRXZlbnRDb250cm9sR2V0Rm9jdXNQYXJ0ID0gOAora0V2ZW50Q29udHJvbEFjdGl2YXRlID0gOQora0V2ZW50Q29udHJvbERlYWN0aXZhdGUgPSAxMAora0V2ZW50Q29udHJvbFNldEN1cnNvciA9IDExCitrRXZlbnRDb250cm9sQ29udGV4dHVhbE1lbnVDbGljayA9IDEyCitrRXZlbnRDb250cm9sQ2xpY2sgPSAxMwora0V2ZW50Q29udHJvbFRyYWNrID0gNTEKK2tFdmVudENvbnRyb2xHZXRTY3JvbGxUb0hlcmVTdGFydFBvaW50ID0gNTIKK2tFdmVudENvbnRyb2xHZXRJbmRpY2F0b3JEcmFnQ29uc3RyYWludCA9IDUzCitrRXZlbnRDb250cm9sSW5kaWNhdG9yTW92ZWQgPSA1NAora0V2ZW50Q29udHJvbEdob3N0aW5nRmluaXNoZWQgPSA1NQora0V2ZW50Q29udHJvbEdldEFjdGlvblByb2NQYXJ0ID0gNTYKK2tFdmVudENvbnRyb2xHZXRQYXJ0UmVnaW9uID0gMTAxCitrRXZlbnRDb250cm9sR2V0UGFydEJvdW5kcyA9IDEwMgora0V2ZW50Q29udHJvbFNldERhdGEgPSAxMDMKK2tFdmVudENvbnRyb2xHZXREYXRhID0gMTA0CitrRXZlbnRDb250cm9sVmFsdWVGaWVsZENoYW5nZWQgPSAxNTEKK2tFdmVudENvbnRyb2xBZGRlZFN1YkNvbnRyb2wgPSAxNTIKK2tFdmVudENvbnRyb2xSZW1vdmluZ1N1YkNvbnRyb2wgPSAxNTMKK2tFdmVudENvbnRyb2xCb3VuZHNDaGFuZ2VkID0gMTU0CitrRXZlbnRDb250cm9sT3duaW5nV2luZG93Q2hhbmdlZCA9IDE1OQora0V2ZW50Q29udHJvbEFyYml0cmFyeU1lc3NhZ2UgPSAyMDEKK2tDb250cm9sQm91bmRzQ2hhbmdlU2l6ZUNoYW5nZWQgPSAoMSA8PCAyKQora0NvbnRyb2xCb3VuZHNDaGFuZ2VQb3NpdGlvbkNoYW5nZWQgPSAoMSA8PCAzKQora0V2ZW50VGFibGV0UG9pbnQgPSAxCitrRXZlbnRUYWJsZXRQcm94aW1pdHkgPSAyCitrRXZlbnRUYWJsZXRQb2ludGVyID0gMQora0V2ZW50Vm9sdW1lTW91bnRlZCA9IDEKK2tFdmVudFZvbHVtZVVubW91bnRlZCA9IDIKK3R5cGVGU1ZvbHVtZVJlZk51bSA9IEZPVVJfQ0hBUl9DT0RFKCd2b2xuJykKK2tFdmVudEFwcGVhcmFuY2VTY3JvbGxCYXJWYXJpYW50Q2hhbmdlZCA9IDEKK2tFdmVudFNlcnZpY2VDb3B5ID0gMQora0V2ZW50U2VydmljZVBhc3RlID0gMgora0V2ZW50U2VydmljZUdldFR5cGVzID0gMwora0V2ZW50U2VydmljZVBlcmZvcm0gPSA0CitrRXZlbnRQYXJhbURpcmVjdE9iamVjdCA9IEZPVVJfQ0hBUl9DT0RFKCctLS0tJykKK2tFdmVudFBhcmFtUG9zdFRhcmdldCA9IEZPVVJfQ0hBUl9DT0RFKCdwdHJnJykKK3R5cGVFdmVudFRhcmdldFJlZiA9IEZPVVJfQ0hBUl9DT0RFKCdldHJnJykKK2tFdmVudFBhcmFtV2luZG93UmVmID0gRk9VUl9DSEFSX0NPREUoJ3dpbmQnKQora0V2ZW50UGFyYW1HcmFmUG9ydCA9IEZPVVJfQ0hBUl9DT0RFKCdncmFmJykKK2tFdmVudFBhcmFtRHJhZ1JlZiA9IEZPVVJfQ0hBUl9DT0RFKCdkcmFnJykKK2tFdmVudFBhcmFtTWVudVJlZiA9IEZPVVJfQ0hBUl9DT0RFKCdtZW51JykKK2tFdmVudFBhcmFtRXZlbnRSZWYgPSBGT1VSX0NIQVJfQ09ERSgnZXZudCcpCitrRXZlbnRQYXJhbUNvbnRyb2xSZWYgPSBGT1VSX0NIQVJfQ09ERSgnY3RybCcpCitrRXZlbnRQYXJhbVJnbkhhbmRsZSA9IEZPVVJfQ0hBUl9DT0RFKCdyZ25oJykKK2tFdmVudFBhcmFtRW5hYmxlZCA9IEZPVVJfQ0hBUl9DT0RFKCdlbmFiJykKK2tFdmVudFBhcmFtRGltZW5zaW9ucyA9IEZPVVJfQ0hBUl9DT0RFKCdkaW1zJykKK2tFdmVudFBhcmFtQXZhaWxhYmxlQm91bmRzID0gRk9VUl9DSEFSX0NPREUoJ2F2bGInKQora0V2ZW50UGFyYW1BRUV2ZW50SUQgPSBrZXlBRUV2ZW50SUQKK2tFdmVudFBhcmFtQUVFdmVudENsYXNzID0ga2V5QUVFdmVudENsYXNzCitrRXZlbnRQYXJhbUNHQ29udGV4dFJlZiA9IEZPVVJfQ0hBUl9DT0RFKCdjbnR4JykKK2tFdmVudFBhcmFtRGV2aWNlRGVwdGggPSBGT1VSX0NIQVJfQ09ERSgnZGV2ZCcpCitrRXZlbnRQYXJhbURldmljZUNvbG9yID0gRk9VUl9DSEFSX0NPREUoJ2RldmMnKQordHlwZVdpbmRvd1JlZiA9IEZPVVJfQ0hBUl9DT0RFKCd3aW5kJykKK3R5cGVHcmFmUHRyID0gRk9VUl9DSEFSX0NPREUoJ2dyYWYnKQordHlwZUdXb3JsZFB0ciA9IEZPVVJfQ0hBUl9DT0RFKCdnd2xkJykKK3R5cGVEcmFnUmVmID0gRk9VUl9DSEFSX0NPREUoJ2RyYWcnKQordHlwZU1lbnVSZWYgPSBGT1VSX0NIQVJfQ09ERSgnbWVudScpCit0eXBlQ29udHJvbFJlZiA9IEZPVVJfQ0hBUl9DT0RFKCdjdHJsJykKK3R5cGVDb2xsZWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2NsdG4nKQordHlwZVFEUmduSGFuZGxlID0gRk9VUl9DSEFSX0NPREUoJ3JnbmgnKQordHlwZU9TU3RhdHVzID0gRk9VUl9DSEFSX0NPREUoJ29zc3QnKQordHlwZUNGU3RyaW5nUmVmID0gRk9VUl9DSEFSX0NPREUoJ2Nmc3QnKQordHlwZUNGSW5kZXggPSBGT1VSX0NIQVJfQ09ERSgnY2ZpeCcpCit0eXBlQ0ZUeXBlUmVmID0gRk9VUl9DSEFSX0NPREUoJ2NmdHknKQordHlwZUNHQ29udGV4dFJlZiA9IEZPVVJfQ0hBUl9DT0RFKCdjbnR4JykKK3R5cGVISVBvaW50ID0gRk9VUl9DSEFSX0NPREUoJ2hpcHQnKQordHlwZUhJU2l6ZSA9IEZPVVJfQ0hBUl9DT0RFKCdoaXN6JykKK3R5cGVISVJlY3QgPSBGT1VSX0NIQVJfQ09ERSgnaGlyYycpCitrRXZlbnRQYXJhbU1vdXNlTG9jYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnbWxvYycpCitrRXZlbnRQYXJhbU1vdXNlQnV0dG9uID0gRk9VUl9DSEFSX0NPREUoJ21idG4nKQora0V2ZW50UGFyYW1DbGlja0NvdW50ID0gRk9VUl9DSEFSX0NPREUoJ2NjbnQnKQora0V2ZW50UGFyYW1Nb3VzZVdoZWVsQXhpcyA9IEZPVVJfQ0hBUl9DT0RFKCdtd2F4JykKK2tFdmVudFBhcmFtTW91c2VXaGVlbERlbHRhID0gRk9VUl9DSEFSX0NPREUoJ213ZGwnKQora0V2ZW50UGFyYW1Nb3VzZURlbHRhID0gRk9VUl9DSEFSX0NPREUoJ21kdGEnKQora0V2ZW50UGFyYW1Nb3VzZUNob3JkID0gRk9VUl9DSEFSX0NPREUoJ2Nob3InKQora0V2ZW50UGFyYW1UYWJsZXRFdmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndGJsdCcpCit0eXBlTW91c2VCdXR0b24gPSBGT1VSX0NIQVJfQ09ERSgnbWJ0bicpCit0eXBlTW91c2VXaGVlbEF4aXMgPSBGT1VSX0NIQVJfQ09ERSgnbXdheCcpCitrRXZlbnRQYXJhbUtleUNvZGUgPSBGT1VSX0NIQVJfQ09ERSgna2NvZCcpCitrRXZlbnRQYXJhbUtleU1hY0NoYXJDb2RlcyA9IEZPVVJfQ0hBUl9DT0RFKCdrY2hyJykKK2tFdmVudFBhcmFtS2V5TW9kaWZpZXJzID0gRk9VUl9DSEFSX0NPREUoJ2ttb2QnKQora0V2ZW50UGFyYW1LZXlVbmljb2RlcyA9IEZPVVJfQ0hBUl9DT0RFKCdrdW5pJykKK2tFdmVudFBhcmFtS2V5Ym9hcmRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2tiZHQnKQordHlwZUV2ZW50SG90S2V5SUQgPSBGT1VSX0NIQVJfQ09ERSgnaGtpZCcpCitrRXZlbnRQYXJhbVRleHRJbnB1dFNlbmRSZWZDb24gPSBGT1VSX0NIQVJfQ09ERSgndHNyYycpCitrRXZlbnRQYXJhbVRleHRJbnB1dFNlbmRDb21wb25lbnRJbnN0YW5jZSA9IEZPVVJfQ0hBUl9DT0RFKCd0c2NpJykKK2tFdmVudFBhcmFtVGV4dElucHV0U2VuZFNMUmVjID0gRk9VUl9DSEFSX0NPREUoJ3Rzc2wnKQora0V2ZW50UGFyYW1UZXh0SW5wdXRSZXBseVNMUmVjID0gRk9VUl9DSEFSX0NPREUoJ3Ryc2wnKQora0V2ZW50UGFyYW1UZXh0SW5wdXRTZW5kVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCd0c3R4JykKK2tFdmVudFBhcmFtVGV4dElucHV0UmVwbHlUZXh0ID0gRk9VUl9DSEFSX0NPREUoJ3RydHgnKQora0V2ZW50UGFyYW1UZXh0SW5wdXRTZW5kVXBkYXRlUm5nID0gRk9VUl9DSEFSX0NPREUoJ3RzdXAnKQora0V2ZW50UGFyYW1UZXh0SW5wdXRTZW5kSGlsaXRlUm5nID0gRk9VUl9DSEFSX0NPREUoJ3RzaGknKQora0V2ZW50UGFyYW1UZXh0SW5wdXRTZW5kQ2xhdXNlUm5nID0gRk9VUl9DSEFSX0NPREUoJ3RzY2wnKQora0V2ZW50UGFyYW1UZXh0SW5wdXRTZW5kUGluUm5nID0gRk9VUl9DSEFSX0NPREUoJ3RzcG4nKQora0V2ZW50UGFyYW1UZXh0SW5wdXRTZW5kRml4TGVuID0gRk9VUl9DSEFSX0NPREUoJ3RzZngnKQora0V2ZW50UGFyYW1UZXh0SW5wdXRTZW5kTGVhZGluZ0VkZ2UgPSBGT1VSX0NIQVJfQ09ERSgndHNsZScpCitrRXZlbnRQYXJhbVRleHRJbnB1dFJlcGx5TGVhZGluZ0VkZ2UgPSBGT1VSX0NIQVJfQ09ERSgndHJsZScpCitrRXZlbnRQYXJhbVRleHRJbnB1dFNlbmRUZXh0T2Zmc2V0ID0gRk9VUl9DSEFSX0NPREUoJ3RzdG8nKQora0V2ZW50UGFyYW1UZXh0SW5wdXRSZXBseVRleHRPZmZzZXQgPSBGT1VSX0NIQVJfQ09ERSgndHJ0bycpCitrRXZlbnRQYXJhbVRleHRJbnB1dFJlcGx5UmVnaW9uQ2xhc3MgPSBGT1VSX0NIQVJfQ09ERSgndHJyZycpCitrRXZlbnRQYXJhbVRleHRJbnB1dFNlbmRDdXJyZW50UG9pbnQgPSBGT1VSX0NIQVJfQ09ERSgndHNjcCcpCitrRXZlbnRQYXJhbVRleHRJbnB1dFNlbmREcmFnZ2luZ01vZGUgPSBGT1VSX0NIQVJfQ09ERSgndHNkbScpCitrRXZlbnRQYXJhbVRleHRJbnB1dFJlcGx5UG9pbnQgPSBGT1VSX0NIQVJfQ09ERSgndHJwdCcpCitrRXZlbnRQYXJhbVRleHRJbnB1dFJlcGx5Rm9udCA9IEZPVVJfQ0hBUl9DT0RFKCd0cmZ0JykKK2tFdmVudFBhcmFtVGV4dElucHV0UmVwbHlGTUZvbnQgPSBGT1VSX0NIQVJfQ09ERSgndHJmbScpCitrRXZlbnRQYXJhbVRleHRJbnB1dFJlcGx5UG9pbnRTaXplID0gRk9VUl9DSEFSX0NPREUoJ3RycHonKQora0V2ZW50UGFyYW1UZXh0SW5wdXRSZXBseUxpbmVIZWlnaHQgPSBGT1VSX0NIQVJfQ09ERSgndHJsaCcpCitrRXZlbnRQYXJhbVRleHRJbnB1dFJlcGx5TGluZUFzY2VudCA9IEZPVVJfQ0hBUl9DT0RFKCd0cmxhJykKK2tFdmVudFBhcmFtVGV4dElucHV0UmVwbHlUZXh0QW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgndHJ0YScpCitrRXZlbnRQYXJhbVRleHRJbnB1dFNlbmRTaG93SGlkZSA9IEZPVVJfQ0hBUl9DT0RFKCd0c3NoJykKK2tFdmVudFBhcmFtVGV4dElucHV0UmVwbHlTaG93SGlkZSA9IEZPVVJfQ0hBUl9DT0RFKCd0cnNoJykKK2tFdmVudFBhcmFtVGV4dElucHV0U2VuZEtleWJvYXJkRXZlbnQgPSBGT1VSX0NIQVJfQ09ERSgndHNrZScpCitrRXZlbnRQYXJhbVRleHRJbnB1dFNlbmRUZXh0U2VydmljZUVuY29kaW5nID0gRk9VUl9DSEFSX0NPREUoJ3Rzc2UnKQora0V2ZW50UGFyYW1UZXh0SW5wdXRTZW5kVGV4dFNlcnZpY2VNYWNFbmNvZGluZyA9IEZPVVJfQ0hBUl9DT0RFKCd0c3NtJykKK2tFdmVudFBhcmFtSElDb21tYW5kID0gRk9VUl9DSEFSX0NPREUoJ2hjbWQnKQordHlwZUhJQ29tbWFuZCA9IEZPVVJfQ0hBUl9DT0RFKCdoY21kJykKK2tFdmVudFBhcmFtV2luZG93RmVhdHVyZXMgPSBGT1VSX0NIQVJfQ09ERSgnd2Z0cicpCitrRXZlbnRQYXJhbVdpbmRvd0RlZlBhcnQgPSBGT1VSX0NIQVJfQ09ERSgnd2RwYycpCitrRXZlbnRQYXJhbUN1cnJlbnRCb3VuZHMgPSBGT1VSX0NIQVJfQ09ERSgnY3JjdCcpCitrRXZlbnRQYXJhbU9yaWdpbmFsQm91bmRzID0gRk9VUl9DSEFSX0NPREUoJ29yY3QnKQora0V2ZW50UGFyYW1QcmV2aW91c0JvdW5kcyA9IEZPVVJfQ0hBUl9DT0RFKCdwcmN0JykKK2tFdmVudFBhcmFtQ2xpY2tBY3RpdmF0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2NsYWMnKQora0V2ZW50UGFyYW1XaW5kb3dSZWdpb25Db2RlID0gRk9VUl9DSEFSX0NPREUoJ3dzaHAnKQora0V2ZW50UGFyYW1XaW5kb3dEcmFnSGlsaXRlRmxhZyA9IEZPVVJfQ0hBUl9DT0RFKCd3ZGhmJykKK2tFdmVudFBhcmFtV2luZG93TW9kaWZpZWRGbGFnID0gRk9VUl9DSEFSX0NPREUoJ3dtZmYnKQora0V2ZW50UGFyYW1XaW5kb3dQcm94eUdXb3JsZFB0ciA9IEZPVVJfQ0hBUl9DT0RFKCd3cGd3JykKK2tFdmVudFBhcmFtV2luZG93UHJveHlJbWFnZVJnbiA9IEZPVVJfQ0hBUl9DT0RFKCd3cGlyJykKK2tFdmVudFBhcmFtV2luZG93UHJveHlPdXRsaW5lUmduID0gRk9VUl9DSEFSX0NPREUoJ3dwb3InKQora0V2ZW50UGFyYW1XaW5kb3dTdGF0ZUNoYW5nZWRGbGFncyA9IEZPVVJfQ0hBUl9DT0RFKCd3c2NmJykKK2tFdmVudFBhcmFtV2luZG93VGl0bGVGdWxsV2lkdGggPSBGT1VSX0NIQVJfQ09ERSgnd3RmdycpCitrRXZlbnRQYXJhbVdpbmRvd1RpdGxlVGV4dFdpZHRoID0gRk9VUl9DSEFSX0NPREUoJ3d0dHcnKQora0V2ZW50UGFyYW1XaW5kb3dHcm93UmVjdCA9IEZPVVJfQ0hBUl9DT0RFKCdncmN0JykKK2tFdmVudFBhcmFtQXR0cmlidXRlcyA9IEZPVVJfQ0hBUl9DT0RFKCdhdHRyJykKK2tFdmVudFBhcmFtRG9ja0NoYW5nZWRSZWFzb24gPSBGT1VSX0NIQVJfQ09ERSgnZGNycycpCitrRXZlbnRQYXJhbVByZXZpb3VzRG9ja1JlY3QgPSBGT1VSX0NIQVJfQ09ERSgncGRyYycpCitrRXZlbnRQYXJhbUN1cnJlbnREb2NrUmVjdCA9IEZPVVJfQ0hBUl9DT0RFKCdjZHJjJykKK3R5cGVXaW5kb3dSZWdpb25Db2RlID0gRk9VUl9DSEFSX0NPREUoJ3dzaHAnKQordHlwZVdpbmRvd0RlZlBhcnRDb2RlID0gRk9VUl9DSEFSX0NPREUoJ3dkcHQnKQordHlwZUNsaWNrQWN0aXZhdGlvblJlc3VsdCA9IEZPVVJfQ0hBUl9DT0RFKCdjbGFjJykKK2tFdmVudFBhcmFtQ29udHJvbFBhcnQgPSBGT1VSX0NIQVJfQ09ERSgnY3BydCcpCitrRXZlbnRQYXJhbUluaXRDb2xsZWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2ljb2wnKQora0V2ZW50UGFyYW1Db250cm9sTWVzc2FnZSA9IEZPVVJfQ0hBUl9DT0RFKCdjbXNnJykKK2tFdmVudFBhcmFtQ29udHJvbFBhcmFtID0gRk9VUl9DSEFSX0NPREUoJ2Nwcm0nKQora0V2ZW50UGFyYW1Db250cm9sUmVzdWx0ID0gRk9VUl9DSEFSX0NPREUoJ2Nyc2wnKQora0V2ZW50UGFyYW1Db250cm9sUmVnaW9uID0gRk9VUl9DSEFSX0NPREUoJ2NyZ24nKQora0V2ZW50UGFyYW1Db250cm9sQWN0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2NhdXAnKQora0V2ZW50UGFyYW1Db250cm9sSW5kaWNhdG9yRHJhZ0NvbnN0cmFpbnQgPSBGT1VSX0NIQVJfQ09ERSgnY2lkYycpCitrRXZlbnRQYXJhbUNvbnRyb2xJbmRpY2F0b3JSZWdpb24gPSBGT1VSX0NIQVJfQ09ERSgnY2lybicpCitrRXZlbnRQYXJhbUNvbnRyb2xJc0dob3N0aW5nID0gRk9VUl9DSEFSX0NPREUoJ2Nnc3QnKQora0V2ZW50UGFyYW1Db250cm9sSW5kaWNhdG9yT2Zmc2V0ID0gRk9VUl9DSEFSX0NPREUoJ2Npb2YnKQora0V2ZW50UGFyYW1Db250cm9sQ2xpY2tBY3RpdmF0aW9uUmVzdWx0ID0gRk9VUl9DSEFSX0NPREUoJ2NjYXInKQora0V2ZW50UGFyYW1Db250cm9sU3ViQ29udHJvbCA9IEZPVVJfQ0hBUl9DT0RFKCdjc3ViJykKK2tFdmVudFBhcmFtQ29udHJvbE9wdGltYWxCb3VuZHMgPSBGT1VSX0NIQVJfQ09ERSgnY29ibicpCitrRXZlbnRQYXJhbUNvbnRyb2xPcHRpbWFsQmFzZWxpbmVPZmZzZXQgPSBGT1VSX0NIQVJfQ09ERSgnY29ibycpCitrRXZlbnRQYXJhbUNvbnRyb2xEYXRhVGFnID0gRk9VUl9DSEFSX0NPREUoJ2NkdGcnKQora0V2ZW50UGFyYW1Db250cm9sRGF0YUJ1ZmZlciA9IEZPVVJfQ0hBUl9DT0RFKCdjZGJmJykKK2tFdmVudFBhcmFtQ29udHJvbERhdGFCdWZmZXJTaXplID0gRk9VUl9DSEFSX0NPREUoJ2NkYnMnKQora0V2ZW50UGFyYW1Db250cm9sRHJhd0RlcHRoID0gRk9VUl9DSEFSX0NPREUoJ2NkZHAnKQora0V2ZW50UGFyYW1Db250cm9sRHJhd0luQ29sb3IgPSBGT1VSX0NIQVJfQ09ERSgnY2RpYycpCitrRXZlbnRQYXJhbUNvbnRyb2xGZWF0dXJlcyA9IEZPVVJfQ0hBUl9DT0RFKCdjZnRyJykKK2tFdmVudFBhcmFtQ29udHJvbFBhcnRCb3VuZHMgPSBGT1VSX0NIQVJfQ09ERSgnY3BiZCcpCitrRXZlbnRQYXJhbUNvbnRyb2xPcmlnaW5hbE93bmluZ1dpbmRvdyA9IEZPVVJfQ0hBUl9DT0RFKCdjb293JykKK2tFdmVudFBhcmFtQ29udHJvbEN1cnJlbnRPd25pbmdXaW5kb3cgPSBGT1VSX0NIQVJfQ09ERSgnY2NvdycpCit0eXBlQ29udHJvbEFjdGlvblVQUCA9IEZPVVJfQ0hBUl9DT0RFKCdjYXVwJykKK3R5cGVJbmRpY2F0b3JEcmFnQ29uc3RyYWludCA9IEZPVVJfQ0hBUl9DT0RFKCdjaWRjJykKK3R5cGVDb250cm9sUGFydENvZGUgPSBGT1VSX0NIQVJfQ09ERSgnY3BydCcpCitrRXZlbnRQYXJhbUN1cnJlbnRNZW51VHJhY2tpbmdNb2RlID0gRk9VUl9DSEFSX0NPREUoJ2NtdG0nKQora0V2ZW50UGFyYW1OZXdNZW51VHJhY2tpbmdNb2RlID0gRk9VUl9DSEFSX0NPREUoJ25tdG0nKQora0V2ZW50UGFyYW1NZW51Rmlyc3RPcGVuID0gRk9VUl9DSEFSX0NPREUoJzFzdG8nKQora0V2ZW50UGFyYW1NZW51SXRlbUluZGV4ID0gRk9VUl9DSEFSX0NPREUoJ2l0ZW0nKQora0V2ZW50UGFyYW1NZW51Q29tbWFuZCA9IEZPVVJfQ0hBUl9DT0RFKCdtY21kJykKK2tFdmVudFBhcmFtRW5hYmxlTWVudUZvcktleUV2ZW50ID0gRk9VUl9DSEFSX0NPREUoJ2ZvcmsnKQora0V2ZW50UGFyYW1NZW51RXZlbnRPcHRpb25zID0gRk9VUl9DSEFSX0NPREUoJ21lb3AnKQora0V2ZW50UGFyYW1NZW51Q29udGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdtY3R4JykKK2tFdmVudFBhcmFtTWVudUl0ZW1Cb3VuZHMgPSBGT1VSX0NIQVJfQ09ERSgnbWl0YicpCitrRXZlbnRQYXJhbU1lbnVNYXJrQm91bmRzID0gRk9VUl9DSEFSX0NPREUoJ21ta2InKQora0V2ZW50UGFyYW1NZW51SWNvbkJvdW5kcyA9IEZPVVJfQ0hBUl9DT0RFKCdtaWNiJykKK2tFdmVudFBhcmFtTWVudVRleHRCb3VuZHMgPSBGT1VSX0NIQVJfQ09ERSgnbXR4YicpCitrRXZlbnRQYXJhbU1lbnVUZXh0QmFzZWxpbmUgPSBGT1VSX0NIQVJfQ09ERSgnbXRibCcpCitrRXZlbnRQYXJhbU1lbnVDb21tYW5kS2V5Qm91bmRzID0gRk9VUl9DSEFSX0NPREUoJ21jbWInKQora0V2ZW50UGFyYW1NZW51VmlydHVhbFRvcCA9IEZPVVJfQ0hBUl9DT0RFKCdtdnJ0JykKK2tFdmVudFBhcmFtTWVudVZpcnR1YWxCb3R0b20gPSBGT1VSX0NIQVJfQ09ERSgnbXZyYicpCitrRXZlbnRQYXJhbU1lbnVEcmF3U3RhdGUgPSBGT1VSX0NIQVJfQ09ERSgnbWRycycpCitrRXZlbnRQYXJhbU1lbnVJdGVtVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtaXRwJykKK2tFdmVudFBhcmFtTWVudUl0ZW1XaWR0aCA9IEZPVVJfQ0hBUl9DT0RFKCdtaXR3JykKK2tFdmVudFBhcmFtTWVudUl0ZW1IZWlnaHQgPSBGT1VSX0NIQVJfQ09ERSgnbWl0aCcpCit0eXBlTWVudUl0ZW1JbmRleCA9IEZPVVJfQ0hBUl9DT0RFKCdtaWR4JykKK3R5cGVNZW51Q29tbWFuZCA9IEZPVVJfQ0hBUl9DT0RFKCdtY21kJykKK3R5cGVNZW51VHJhY2tpbmdNb2RlID0gRk9VUl9DSEFSX0NPREUoJ210bWQnKQordHlwZU1lbnVFdmVudE9wdGlvbnMgPSBGT1VSX0NIQVJfQ09ERSgnbWVvcCcpCit0eXBlVGhlbWVNZW51U3RhdGUgPSBGT1VSX0NIQVJfQ09ERSgndG1ucycpCit0eXBlVGhlbWVNZW51SXRlbVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndG1pdCcpCitrRXZlbnRQYXJhbVByb2Nlc3NJRCA9IEZPVVJfQ0hBUl9DT0RFKCdwc24gJykKK2tFdmVudFBhcmFtTGF1bmNoUmVmQ29uID0gRk9VUl9DSEFSX0NPREUoJ2xyZWYnKQora0V2ZW50UGFyYW1MYXVuY2hFcnIgPSBGT1VSX0NIQVJfQ09ERSgnZXJyICcpCitrRXZlbnRQYXJhbVRhYmxldFBvaW50UmVjID0gRk9VUl9DSEFSX0NPREUoJ3RicmMnKQora0V2ZW50UGFyYW1UYWJsZXRQcm94aW1pdHlSZWMgPSBGT1VSX0NIQVJfQ09ERSgndGJweCcpCit0eXBlVGFibGV0UG9pbnRSZWMgPSBGT1VSX0NIQVJfQ09ERSgndGJyYycpCit0eXBlVGFibGV0UHJveGltaXR5UmVjID0gRk9VUl9DSEFSX0NPREUoJ3RicHgnKQora0V2ZW50UGFyYW1UYWJsZXRQb2ludGVyUmVjID0gRk9VUl9DSEFSX0NPREUoJ3RicmMnKQordHlwZVRhYmxldFBvaW50ZXJSZWMgPSBGT1VSX0NIQVJfQ09ERSgndGJyYycpCitrRXZlbnRQYXJhbU5ld1Njcm9sbEJhclZhcmlhbnQgPSBGT1VSX0NIQVJfQ09ERSgnbnNidicpCitrRXZlbnRQYXJhbVNjcmFwUmVmID0gRk9VUl9DSEFSX0NPREUoJ3NjcnAnKQora0V2ZW50UGFyYW1TZXJ2aWNlQ29weVR5cGVzID0gRk9VUl9DSEFSX0NPREUoJ3N2c2QnKQora0V2ZW50UGFyYW1TZXJ2aWNlUGFzdGVUeXBlcyA9IEZPVVJfQ0hBUl9DT0RFKCdzdnB0JykKK2tFdmVudFBhcmFtU2VydmljZU1lc3NhZ2VOYW1lID0gRk9VUl9DSEFSX0NPREUoJ3N2bWcnKQora0V2ZW50UGFyYW1TZXJ2aWNlVXNlckRhdGEgPSBGT1VSX0NIQVJfQ09ERSgnc3Z1ZCcpCit0eXBlU2NyYXBSZWYgPSBGT1VSX0NIQVJfQ09ERSgnc2NycCcpCit0eXBlQ0ZNdXRhYmxlQXJyYXlSZWYgPSBGT1VSX0NIQVJfQ09ERSgnY2ZtYScpCisjIHNIYW5kbGVyID0gTmV3RXZlbnRIYW5kbGVyVVBQKCB4ICkKK2tNb3VzZVRyYWNraW5nTW91c2VQcmVzc2VkID0ga01vdXNlVHJhY2tpbmdNb3VzZURvd24KK2tNb3VzZVRyYWNraW5nTW91c2VSZWxlYXNlZCA9IGtNb3VzZVRyYWNraW5nTW91c2VVcApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ2FyYm9uRXZlbnRzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NhcmJvbkV2ZW50cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjMTcyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NhcmJvbkV2ZW50cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ2FyYm9uRXZlbnRzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NhcmJvbkV2ZW50cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjMTcyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NhcmJvbkV2ZW50cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ2FyYm9uRXZ0LnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ2FyYm9uRXZ0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTc3OTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DYXJib25FdnQucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfQ2FyYm9uRXZ0IGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DYXJib25FdnQucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ2FyYm9uRXZ0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDU4OWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ2FyYm9uRXZ0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DYXJib25FdnQucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ2FyYm9uRXZ0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDU4OWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ2FyYm9uRXZ0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DbS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOGJjMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DbS5weQpAQCAtMCwwICsxIEBACitmcm9tIF9DbSBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ20ucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ20ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTJiYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DbS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ20ucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ20ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNTJiYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DbS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29tcG9uZW50cy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvbXBvbmVudHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1NzRjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvbXBvbmVudHMucHkKQEAgLTAsMCArMSw2MiBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnQ29tcG9uZW50cy5oJworCitkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4CitrQXBwbGVNYW51ZmFjdHVyZXIgPSBGT1VSX0NIQVJfQ09ERSgnYXBwbCcpCitrQ29tcG9uZW50UmVzb3VyY2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RobmcnKQora0NvbXBvbmVudEFsaWFzUmVzb3VyY2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RoZ2EnKQora0FueUNvbXBvbmVudFR5cGUgPSAwCitrQW55Q29tcG9uZW50U3ViVHlwZSA9IDAKK2tBbnlDb21wb25lbnRNYW51ZmFjdHVyZXIgPSAwCitrQW55Q29tcG9uZW50RmxhZ3NNYXNrID0gMAorY21wSXNNaXNzaW5nID0gMUwgPDwgMjkKK2NtcFdhbnRzUmVnaXN0ZXJNZXNzYWdlID0gMUwgPDwgMzEKK2tDb21wb25lbnRPcGVuU2VsZWN0ID0gLTEKK2tDb21wb25lbnRDbG9zZVNlbGVjdCA9IC0yCitrQ29tcG9uZW50Q2FuRG9TZWxlY3QgPSAtMwora0NvbXBvbmVudFZlcnNpb25TZWxlY3QgPSAtNAora0NvbXBvbmVudFJlZ2lzdGVyU2VsZWN0ID0gLTUKK2tDb21wb25lbnRUYXJnZXRTZWxlY3QgPSAtNgora0NvbXBvbmVudFVucmVnaXN0ZXJTZWxlY3QgPSAtNwora0NvbXBvbmVudEdldE1QV29ya0Z1bmN0aW9uU2VsZWN0ID0gLTgKK2tDb21wb25lbnRFeGVjdXRlV2lyZWRBY3Rpb25TZWxlY3QgPSAtOQora0NvbXBvbmVudEdldFB1YmxpY1Jlc291cmNlU2VsZWN0ID0gLTEwCitjb21wb25lbnREb0F1dG9WZXJzaW9uID0gKDEgPDwgMCkKK2NvbXBvbmVudFdhbnRzVW5yZWdpc3RlciA9ICgxIDw8IDEpCitjb21wb25lbnRBdXRvVmVyc2lvbkluY2x1ZGVGbGFncyA9ICgxIDw8IDIpCitjb21wb25lbnRIYXNNdWx0aXBsZVBsYXRmb3JtcyA9ICgxIDw8IDMpCitjb21wb25lbnRMb2FkUmVzaWRlbnQgPSAoMSA8PCA0KQorZGVmYXVsdENvbXBvbmVudElkZW50aWNhbCA9IDAKK2RlZmF1bHRDb21wb25lbnRBbnlGbGFncyA9IDEKK2RlZmF1bHRDb21wb25lbnRBbnlNYW51ZmFjdHVyZXIgPSAyCitkZWZhdWx0Q29tcG9uZW50QW55U3ViVHlwZSA9IDQKK2RlZmF1bHRDb21wb25lbnRBbnlGbGFnc0FueU1hbnVmYWN0dXJlciA9IChkZWZhdWx0Q29tcG9uZW50QW55RmxhZ3MgKyBkZWZhdWx0Q29tcG9uZW50QW55TWFudWZhY3R1cmVyKQorZGVmYXVsdENvbXBvbmVudEFueUZsYWdzQW55TWFudWZhY3R1cmVyQW55U3ViVHlwZSA9IChkZWZhdWx0Q29tcG9uZW50QW55RmxhZ3MgKyBkZWZhdWx0Q29tcG9uZW50QW55TWFudWZhY3R1cmVyICsgZGVmYXVsdENvbXBvbmVudEFueVN1YlR5cGUpCityZWdpc3RlckNvbXBvbmVudEdsb2JhbCA9IDEKK3JlZ2lzdGVyQ29tcG9uZW50Tm9EdXBsaWNhdGVzID0gMgorcmVnaXN0ZXJDb21wb25lbnRBZnRlckV4aXN0aW5nID0gNAorcmVnaXN0ZXJDb21wb25lbnRBbGlhc2VzT25seSA9IDgKK3BsYXRmb3JtNjhrID0gMQorcGxhdGZvcm1Qb3dlclBDID0gMgorcGxhdGZvcm1JbnRlcnByZXRlZCA9IDMKK3BsYXRmb3JtV2luMzIgPSA0CitwbGF0Zm9ybVBvd2VyUENOYXRpdmVFbnRyeVBvaW50ID0gNQorbXBXb3JrRmxhZ0RvV29yayA9ICgxIDw8IDApCittcFdvcmtGbGFnRG9Db21wbGV0aW9uID0gKDEgPDwgMSkKK21wV29ya0ZsYWdDb3B5V29ya0Jsb2NrID0gKDEgPDwgMikKK21wV29ya0ZsYWdEb250QmxvY2sgPSAoMSA8PCAzKQorbXBXb3JrRmxhZ0dldFByb2Nlc3NvckNvdW50ID0gKDEgPDwgNCkKK21wV29ya0ZsYWdHZXRJc1J1bm5pbmcgPSAoMSA8PCA2KQorY21wQWxpYXNOb0ZsYWdzID0gMAorY21wQWxpYXNPbmx5VGhpc0ZpbGUgPSAxCit1cHBDb21wb25lbnRGdW5jdGlvbkltcGxlbWVudGVkUHJvY0luZm8gPSAweDAwMDAwMkYwCit1cHBHZXRDb21wb25lbnRWZXJzaW9uUHJvY0luZm8gPSAweDAwMDAwMEYwCit1cHBDb21wb25lbnRTZXRUYXJnZXRQcm9jSW5mbyA9IDB4MDAwMDAzRjAKK3VwcENhbGxDb21wb25lbnRPcGVuUHJvY0luZm8gPSAweDAwMDAwM0YwCit1cHBDYWxsQ29tcG9uZW50Q2xvc2VQcm9jSW5mbyA9IDB4MDAwMDAzRjAKK3VwcENhbGxDb21wb25lbnRDYW5Eb1Byb2NJbmZvID0gMHgwMDAwMDJGMAordXBwQ2FsbENvbXBvbmVudFZlcnNpb25Qcm9jSW5mbyA9IDB4MDAwMDAwRjAKK3VwcENhbGxDb21wb25lbnRSZWdpc3RlclByb2NJbmZvID0gMHgwMDAwMDBGMAordXBwQ2FsbENvbXBvbmVudFRhcmdldFByb2NJbmZvID0gMHgwMDAwMDNGMAordXBwQ2FsbENvbXBvbmVudFVucmVnaXN0ZXJQcm9jSW5mbyA9IDB4MDAwMDAwRjAKK3VwcENhbGxDb21wb25lbnRHZXRNUFdvcmtGdW5jdGlvblByb2NJbmZvID0gMHgwMDAwMEZGMAordXBwQ2FsbENvbXBvbmVudEdldFB1YmxpY1Jlc291cmNlUHJvY0luZm8gPSAweDAwMDAzQkYwCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Db21wb25lbnRzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvbXBvbmVudHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTBjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Db21wb25lbnRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Db21wb25lbnRzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvbXBvbmVudHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTBjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Db21wb25lbnRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Db250cm9sQWNjZXNzb3IucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Db250cm9sQWNjZXNzb3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5ODkyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvbnRyb2xBY2Nlc3Nvci5weQpAQCAtMCwwICsxLDU2IEBACisjIEFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgY29udHJvbCBwcm9wZXJ0aWVzCisKK2Zyb20gQ29udHJvbHMgaW1wb3J0ICoKK2ltcG9ydCBzdHJ1Y3QKKworIyBUaGVzZSBuZWVkbid0IGdvIHRocm91Z2ggdGhpcyBtb2R1bGUsIGJ1dCBhcmUgaGVyZSBmb3IgY29tcGxldGVuZXNzCitkZWYgU2V0Q29udHJvbERhdGFfSGFuZGxlKGNvbnRyb2wsIHBhcnQsIHNlbGVjdG9yLCBkYXRhKToKKyAgICBjb250cm9sLlNldENvbnRyb2xEYXRhX0hhbmRsZShwYXJ0LCBzZWxlY3RvciwgZGF0YSkKKworZGVmIEdldENvbnRyb2xEYXRhX0hhbmRsZShjb250cm9sLCBwYXJ0LCBzZWxlY3Rvcik6CisgICAgcmV0dXJuIGNvbnRyb2wuR2V0Q29udHJvbERhdGFfSGFuZGxlKHBhcnQsIHNlbGVjdG9yKQorCitfYWNjZXNzZGljdCA9IHsKKyAgICBrQ29udHJvbFBvcHVwQnV0dG9uTWVudUhhbmRsZVRhZzogKFNldENvbnRyb2xEYXRhX0hhbmRsZSwgR2V0Q29udHJvbERhdGFfSGFuZGxlKSwKK30KKworX2NvZGluZ2RpY3QgPSB7CisgICAga0NvbnRyb2xQdXNoQnV0dG9uRGVmYXVsdFRhZyA6ICgiYiIsIE5vbmUsIE5vbmUpLAorCisgICAga0NvbnRyb2xFZGl0VGV4dFRleHRUYWc6IChOb25lLCBOb25lLCBOb25lKSwKKyAgICBrQ29udHJvbEVkaXRUZXh0UGFzc3dvcmRUYWc6IChOb25lLCBOb25lLCBOb25lKSwKKworICAgIGtDb250cm9sUG9wdXBCdXR0b25NZW51SURUYWc6ICgiaCIsIE5vbmUsIE5vbmUpLAorCisgICAga0NvbnRyb2xMaXN0Qm94RG91YmxlQ2xpY2tUYWc6ICgiYiIsIE5vbmUsIE5vbmUpLAorfQorCitkZWYgU2V0Q29udHJvbERhdGEoY29udHJvbCwgcGFydCwgc2VsZWN0b3IsIGRhdGEpOgorICAgIGlmIF9hY2Nlc3NkaWN0Lmhhc19rZXkoc2VsZWN0b3IpOgorICAgICAgICBzZXRmdW5jLCBnZXRmdW5jID0gX2FjY2Vzc2RpY3Rbc2VsZWN0b3JdCisgICAgICAgIHNldGZ1bmMoY29udHJvbCwgcGFydCwgc2VsZWN0b3IsIGRhdGEpCisgICAgICAgIHJldHVybgorICAgIGlmIG5vdCBfY29kaW5nZGljdC5oYXNfa2V5KHNlbGVjdG9yKToKKyAgICAgICAgcmFpc2UgS2V5RXJyb3IsICgnVW5rbm93biBjb250cm9sIHNlbGVjdG9yJywgc2VsZWN0b3IpCisgICAgc3RydWN0Zm10LCBjb2RlciwgZGVjb2RlciA9IF9jb2RpbmdkaWN0W3NlbGVjdG9yXQorICAgIGlmIGNvZGVyOgorICAgICAgICBkYXRhID0gY29kZXIoZGF0YSkKKyAgICBpZiBzdHJ1Y3RmbXQ6CisgICAgICAgIGRhdGEgPSBzdHJ1Y3QucGFjayhzdHJ1Y3RmbXQsIGRhdGEpCisgICAgY29udHJvbC5TZXRDb250cm9sRGF0YShwYXJ0LCBzZWxlY3RvciwgZGF0YSkKKworZGVmIEdldENvbnRyb2xEYXRhKGNvbnRyb2wsIHBhcnQsIHNlbGVjdG9yKToKKyAgICBpZiBfYWNjZXNzZGljdC5oYXNfa2V5KHNlbGVjdG9yKToKKyAgICAgICAgc2V0ZnVuYywgZ2V0ZnVuYyA9IF9hY2Nlc3NkaWN0W3NlbGVjdG9yXQorICAgICAgICByZXR1cm4gZ2V0ZnVuYyhjb250cm9sLCBwYXJ0LCBzZWxlY3RvciwgZGF0YSkKKyAgICBpZiBub3QgX2NvZGluZ2RpY3QuaGFzX2tleShzZWxlY3Rvcik6CisgICAgICAgIHJhaXNlIEtleUVycm9yLCAoJ1Vua25vd24gY29udHJvbCBzZWxlY3RvcicsIHNlbGVjdG9yKQorICAgIHN0cnVjdGZtdCwgY29kZXIsIGRlY29kZXIgPSBfY29kaW5nZGljdFtzZWxlY3Rvcl0KKyAgICBkYXRhID0gY29udHJvbC5HZXRDb250cm9sRGF0YShwYXJ0LCBzZWxlY3RvcikKKyAgICBpZiBzdHJ1Y3RmbXQ6CisgICAgICAgIGRhdGEgPSBzdHJ1Y3QudW5wYWNrKHN0cnVjdGZtdCwgZGF0YSkKKyAgICBpZiBkZWNvZGVyOgorICAgICAgICBkYXRhID0gZGVjb2RlcihkYXRhKQorICAgIGlmIHR5cGUoZGF0YSkgPT0gdHlwZSgoKSkgYW5kIGxlbihkYXRhKSA9PSAxOgorICAgICAgICBkYXRhID0gZGF0YVswXQorICAgIHJldHVybiBkYXRhCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Db250cm9sQWNjZXNzb3IucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29udHJvbEFjY2Vzc29yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODUxYjFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29udHJvbEFjY2Vzc29yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Db250cm9sQWNjZXNzb3IucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29udHJvbEFjY2Vzc29yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODUxYjFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29udHJvbEFjY2Vzc29yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Db250cm9scy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvbnRyb2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWQ4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Db250cm9scy5weQpAQCAtMCwwICsxLDY2OCBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnQ29udHJvbHMuaCcKKworZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAorZnJvbSBDYXJib24uVGV4dEVkaXQgaW1wb3J0ICoKK2Zyb20gQ2FyYm9uLlF1aWNrRHJhdyBpbXBvcnQgKgorZnJvbSBDYXJib24uRHJhZ2NvbnN0IGltcG9ydCAqCitmcm9tIENhcmJvbi5DYXJib25FdmVudHMgaW1wb3J0ICoKK2Zyb20gQ2FyYm9uLkFwcGVhcmFuY2UgaW1wb3J0ICoKK2tEYXRhQnJvd3Nlckl0ZW1BbnlTdGF0ZSA9IC0xCitrQ29udHJvbEJldmVsQnV0dG9uQ2VudGVyUG9wdXBHbHlwaFRhZyA9IC0xCitrRGF0YUJyb3dzZXJDbGllbnRQcm9wZXJ0eUZsYWdzTWFzayA9IDB4RkYwMDAwMDAKKwora0NvbnRyb2xEZWZQcm9jVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdDREVGJykKK2tDb250cm9sVGVtcGxhdGVSZXNvdXJjZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnQ05UTCcpCitrQ29udHJvbENvbG9yVGFibGVSZXNvdXJjZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY2N0YicpCitrQ29udHJvbERlZlByb2NSZXNvdXJjZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnQ0RFRicpCitjb250cm9sTm90aWZ5Tm90aGluZyA9IEZPVVJfQ0hBUl9DT0RFKCduYWRhJykKK2NvbnRyb2xOb3RpZnlDbGljayA9IEZPVVJfQ0hBUl9DT0RFKCdjbGlrJykKK2NvbnRyb2xOb3RpZnlGb2N1cyA9IEZPVVJfQ0hBUl9DT0RFKCdmb2N1JykKK2NvbnRyb2xOb3RpZnlLZXkgPSBGT1VSX0NIQVJfQ09ERSgna2V5ICcpCitrQ29udHJvbENhbkF1dG9JbnZhbGlkYXRlID0gMUwgPDwgMAorc3RhdGljVGV4dFByb2MgPSAyNTYKK2VkaXRUZXh0UHJvYyA9IDI3MgoraWNvblByb2MgPSAyODgKK3VzZXJJdGVtUHJvYyA9IDMwNAorcGljdEl0ZW1Qcm9jID0gMzIwCitjRnJhbWVDb2xvciA9IDAKK2NCb2R5Q29sb3IgPSAxCitjVGV4dENvbG9yID0gMgorY1RodW1iQ29sb3IgPSAzCitrTnVtYmVyQ3RsQ1RhYkVudHJpZXMgPSA0CitrQ29udHJvbE5vVmFyaWFudCA9IDAKK2tDb250cm9sVXNlc093bmluZ1dpbmRvd3NGb250VmFyaWFudCA9IDEgPDwgMwora0NvbnRyb2xOb1BhcnQgPSAwCitrQ29udHJvbEluZGljYXRvclBhcnQgPSAxMjkKK2tDb250cm9sRGlzYWJsZWRQYXJ0ID0gMjU0CitrQ29udHJvbEluYWN0aXZlUGFydCA9IDI1NQora0NvbnRyb2xFbnRpcmVDb250cm9sID0gMAora0NvbnRyb2xTdHJ1Y3R1cmVNZXRhUGFydCA9IC0xCitrQ29udHJvbENvbnRlbnRNZXRhUGFydCA9IC0yCitrQ29udHJvbEZvY3VzTm9QYXJ0ID0gMAora0NvbnRyb2xGb2N1c05leHRQYXJ0ID0gLTEKK2tDb250cm9sRm9jdXNQcmV2UGFydCA9IC0yCitrQ29udHJvbENvbGxlY3Rpb25UYWdCb3VuZHMgPSBGT1VSX0NIQVJfQ09ERSgnYm91bicpCitrQ29udHJvbENvbGxlY3Rpb25UYWdWYWx1ZSA9IEZPVVJfQ0hBUl9DT0RFKCd2YWx1JykKK2tDb250cm9sQ29sbGVjdGlvblRhZ01pbmltdW0gPSBGT1VSX0NIQVJfQ09ERSgnbWluICcpCitrQ29udHJvbENvbGxlY3Rpb25UYWdNYXhpbXVtID0gRk9VUl9DSEFSX0NPREUoJ21heCAnKQora0NvbnRyb2xDb2xsZWN0aW9uVGFnVmlld1NpemUgPSBGT1VSX0NIQVJfQ09ERSgndmlldycpCitrQ29udHJvbENvbGxlY3Rpb25UYWdWaXNpYmlsaXR5ID0gRk9VUl9DSEFSX0NPREUoJ3Zpc2knKQora0NvbnRyb2xDb2xsZWN0aW9uVGFnUmVmQ29uID0gRk9VUl9DSEFSX0NPREUoJ3JlZmMnKQora0NvbnRyb2xDb2xsZWN0aW9uVGFnVGl0bGUgPSBGT1VSX0NIQVJfQ09ERSgndGl0bCcpCitrQ29udHJvbENvbGxlY3Rpb25UYWdVbmljb2RlVGl0bGUgPSBGT1VSX0NIQVJfQ09ERSgndXR0bCcpCitrQ29udHJvbENvbGxlY3Rpb25UYWdJRFNpZ25hdHVyZSA9IEZPVVJfQ0hBUl9DT0RFKCdpZHNpJykKK2tDb250cm9sQ29sbGVjdGlvblRhZ0lESUQgPSBGT1VSX0NIQVJfQ09ERSgnaWRpZCcpCitrQ29udHJvbENvbGxlY3Rpb25UYWdDb21tYW5kID0gRk9VUl9DSEFSX0NPREUoJ2NtZCAnKQora0NvbnRyb2xDb2xsZWN0aW9uVGFnVmFyQ29kZSA9IEZPVVJfQ0hBUl9DT0RFKCd2YXJjJykKK2tDb250cm9sQ29udGVudFRleHRPbmx5ID0gMAora0NvbnRyb2xOb0NvbnRlbnQgPSAwCitrQ29udHJvbENvbnRlbnRJY29uU3VpdGVSZXMgPSAxCitrQ29udHJvbENvbnRlbnRDSWNvblJlcyA9IDIKK2tDb250cm9sQ29udGVudFBpY3RSZXMgPSAzCitrQ29udHJvbENvbnRlbnRJQ09OUmVzID0gNAora0NvbnRyb2xDb250ZW50SWNvblN1aXRlSGFuZGxlID0gMTI5CitrQ29udHJvbENvbnRlbnRDSWNvbkhhbmRsZSA9IDEzMAora0NvbnRyb2xDb250ZW50UGljdEhhbmRsZSA9IDEzMQora0NvbnRyb2xDb250ZW50SWNvblJlZiA9IDEzMgora0NvbnRyb2xDb250ZW50SUNPTiA9IDEzMwora0NvbnRyb2xLZXlTY3JpcHRCZWhhdmlvckFsbG93QW55U2NyaXB0ID0gRk9VUl9DSEFSX0NPREUoJ2FueSAnKQora0NvbnRyb2xLZXlTY3JpcHRCZWhhdmlvclByZWZlcnNSb21hbiA9IEZPVVJfQ0hBUl9DT0RFKCdwcm1uJykKK2tDb250cm9sS2V5U2NyaXB0QmVoYXZpb3JSZXF1aXJlc1JvbWFuID0gRk9VUl9DSEFSX0NPREUoJ3JybW4nKQora0NvbnRyb2xGb250QmlnU3lzdGVtRm9udCA9IC0xCitrQ29udHJvbEZvbnRTbWFsbFN5c3RlbUZvbnQgPSAtMgora0NvbnRyb2xGb250U21hbGxCb2xkU3lzdGVtRm9udCA9IC0zCitrQ29udHJvbEZvbnRWaWV3U3lzdGVtRm9udCA9IC00CitrQ29udHJvbFVzZUZvbnRNYXNrID0gMHgwMDAxCitrQ29udHJvbFVzZUZhY2VNYXNrID0gMHgwMDAyCitrQ29udHJvbFVzZVNpemVNYXNrID0gMHgwMDA0CitrQ29udHJvbFVzZUZvcmVDb2xvck1hc2sgPSAweDAwMDgKK2tDb250cm9sVXNlQmFja0NvbG9yTWFzayA9IDB4MDAxMAora0NvbnRyb2xVc2VNb2RlTWFzayA9IDB4MDAyMAora0NvbnRyb2xVc2VKdXN0TWFzayA9IDB4MDA0MAora0NvbnRyb2xVc2VBbGxNYXNrID0gMHgwMEZGCitrQ29udHJvbEFkZEZvbnRTaXplTWFzayA9IDB4MDEwMAora0NvbnRyb2xBZGRUb01ldGFGb250TWFzayA9IDB4MDIwMAora0NvbnRyb2xVc2VUaGVtZUZvbnRJRE1hc2sgPSAweDAwODAKK2tEb05vdEFjdGl2YXRlQW5kSWdub3JlQ2xpY2sgPSAwCitrRG9Ob3RBY3RpdmF0ZUFuZEhhbmRsZUNsaWNrID0gMQora0FjdGl2YXRlQW5kSWdub3JlQ2xpY2sgPSAyCitrQWN0aXZhdGVBbmRIYW5kbGVDbGljayA9IDMKK2tDb250cm9sRm9udFN0eWxlVGFnID0gRk9VUl9DSEFSX0NPREUoJ2ZvbnQnKQora0NvbnRyb2xLZXlGaWx0ZXJUYWcgPSBGT1VSX0NIQVJfQ09ERSgnZmx0cicpCitrQ29udHJvbEtpbmRUYWcgPSBGT1VSX0NIQVJfQ09ERSgna2luZCcpCitrQ29udHJvbFNpemVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnc2l6ZScpCitrQ29udHJvbFN1cHBvcnRzR2hvc3RpbmcgPSAxIDw8IDAKK2tDb250cm9sU3VwcG9ydHNFbWJlZGRpbmcgPSAxIDw8IDEKK2tDb250cm9sU3VwcG9ydHNGb2N1cyA9IDEgPDwgMgora0NvbnRyb2xXYW50c0lkbGUgPSAxIDw8IDMKK2tDb250cm9sV2FudHNBY3RpdmF0ZSA9IDEgPDwgNAora0NvbnRyb2xIYW5kbGVzVHJhY2tpbmcgPSAxIDw8IDUKK2tDb250cm9sU3VwcG9ydHNEYXRhQWNjZXNzID0gMSA8PCA2CitrQ29udHJvbEhhc1NwZWNpYWxCYWNrZ3JvdW5kID0gMSA8PCA3CitrQ29udHJvbEdldHNGb2N1c09uQ2xpY2sgPSAxIDw8IDgKK2tDb250cm9sU3VwcG9ydHNDYWxjQmVzdFJlY3QgPSAxIDw8IDkKK2tDb250cm9sU3VwcG9ydHNMaXZlRmVlZGJhY2sgPSAxIDw8IDEwCitrQ29udHJvbEhhc1JhZGlvQmVoYXZpb3IgPSAxIDw8IDExCitrQ29udHJvbFN1cHBvcnRzRHJhZ0FuZERyb3AgPSAxIDw8IDEyCitrQ29udHJvbEF1dG9Ub2dnbGVzID0gMSA8PCAxNAora0NvbnRyb2xTdXBwb3J0c0dldFJlZ2lvbiA9IDEgPDwgMTcKK2tDb250cm9sU3VwcG9ydHNGbGF0dGVuaW5nID0gMSA8PCAxOQora0NvbnRyb2xTdXBwb3J0c1NldEN1cnNvciA9IDEgPDwgMjAKK2tDb250cm9sU3VwcG9ydHNDb250ZXh0dWFsTWVudXMgPSAxIDw8IDIxCitrQ29udHJvbFN1cHBvcnRzQ2xpY2tBY3RpdmF0aW9uID0gMSA8PCAyMgora0NvbnRyb2xJZGxlc1dpdGhUaW1lciA9IDEgPDwgMjMKK2RyYXdDbnRsID0gMAordGVzdENudGwgPSAxCitjYWxjQ1JnbnMgPSAyCitpbml0Q250bCA9IDMKK2Rpc3BDbnRsID0gNAorcG9zQ250bCA9IDUKK3RodW1iQ250bCA9IDYKK2RyYWdDbnRsID0gNworYXV0b1RyYWNrID0gOAorY2FsY0NudGxSZ24gPSAxMAorY2FsY1RodW1iUmduID0gMTEKK2RyYXdUaHVtYk91dGxpbmUgPSAxMgora0NvbnRyb2xNc2dEcmF3R2hvc3QgPSAxMwora0NvbnRyb2xNc2dDYWxjQmVzdFJlY3QgPSAxNAora0NvbnRyb2xNc2dIYW5kbGVUcmFja2luZyA9IDE1CitrQ29udHJvbE1zZ0ZvY3VzID0gMTYKK2tDb250cm9sTXNnS2V5RG93biA9IDE3CitrQ29udHJvbE1zZ0lkbGUgPSAxOAora0NvbnRyb2xNc2dHZXRGZWF0dXJlcyA9IDE5CitrQ29udHJvbE1zZ1NldERhdGEgPSAyMAora0NvbnRyb2xNc2dHZXREYXRhID0gMjEKK2tDb250cm9sTXNnQWN0aXZhdGUgPSAyMgora0NvbnRyb2xNc2dTZXRVcEJhY2tncm91bmQgPSAyMwora0NvbnRyb2xNc2dDYWxjVmFsdWVGcm9tUG9zID0gMjYKK2tDb250cm9sTXNnVGVzdE5ld01zZ1N1cHBvcnQgPSAyNwora0NvbnRyb2xNc2dTdWJWYWx1ZUNoYW5nZWQgPSAyNQora0NvbnRyb2xNc2dTdWJDb250cm9sQWRkZWQgPSAyOAora0NvbnRyb2xNc2dTdWJDb250cm9sUmVtb3ZlZCA9IDI5CitrQ29udHJvbE1zZ0FwcGx5VGV4dENvbG9yID0gMzAKK2tDb250cm9sTXNnR2V0UmVnaW9uID0gMzEKK2tDb250cm9sTXNnRmxhdHRlbiA9IDMyCitrQ29udHJvbE1zZ1NldEN1cnNvciA9IDMzCitrQ29udHJvbE1zZ0RyYWdFbnRlciA9IDM4CitrQ29udHJvbE1zZ0RyYWdMZWF2ZSA9IDM5CitrQ29udHJvbE1zZ0RyYWdXaXRoaW4gPSA0MAora0NvbnRyb2xNc2dEcmFnUmVjZWl2ZSA9IDQxCitrQ29udHJvbE1zZ0Rpc3BsYXlEZWJ1Z0luZm8gPSA0Ngora0NvbnRyb2xNc2dDb250ZXh0dWFsTWVudUNsaWNrID0gNDcKK2tDb250cm9sTXNnR2V0Q2xpY2tBY3RpdmF0aW9uID0gNDgKK2tDb250cm9sU2l6ZU5vcm1hbCA9IDAKK2tDb250cm9sU2l6ZVNtYWxsID0gMQora0NvbnRyb2xTaXplTGFyZ2UgPSAyCitrQ29udHJvbFNpemVBdXRvID0gMHhGRkZGCitrRHJhd0NvbnRyb2xFbnRpcmVDb250cm9sID0gMAora0RyYXdDb250cm9sSW5kaWNhdG9yT25seSA9IDEyOQora0RyYWdDb250cm9sRW50aXJlQ29udHJvbCA9IDAKK2tEcmFnQ29udHJvbEluZGljYXRvciA9IDEKK2tDb250cm9sU3VwcG9ydHNOZXdNZXNzYWdlcyA9IEZPVVJfQ0hBUl9DT0RFKCcgb2sgJykKK2tDb250cm9sS2V5RmlsdGVyQmxvY2tLZXkgPSAwCitrQ29udHJvbEtleUZpbHRlclBhc3NLZXkgPSAxCitub0NvbnN0cmFpbnQgPSBrTm9Db25zdHJhaW50CitoQXhpc09ubHkgPSAxCit2QXhpc09ubHkgPSAyCitrQ29udHJvbERlZlByb2NQdHIgPSAwCitrQ29udHJvbERlZk9iamVjdENsYXNzID0gMQora0NvbnRyb2xLaW5kU2lnbmF0dXJlQXBwbGUgPSBGT1VSX0NIQVJfQ09ERSgnYXBwbCcpCitrQ29udHJvbFByb3BlcnR5UGVyc2lzdGVudCA9IDB4MDAwMDAwMDEKK2tEcmFnVHJhY2tpbmdFbnRlckNvbnRyb2wgPSAyCitrRHJhZ1RyYWNraW5nSW5Db250cm9sID0gMwora0RyYWdUcmFja2luZ0xlYXZlQ29udHJvbCA9IDQKK3VzZVdGb250ID0ga0NvbnRyb2xVc2VzT3duaW5nV2luZG93c0ZvbnRWYXJpYW50CitpblRodW1iID0ga0NvbnRyb2xJbmRpY2F0b3JQYXJ0CitrTm9IaWxpdGVDb250cm9sUGFydCA9IGtDb250cm9sTm9QYXJ0CitrSW5JbmRpY2F0b3JDb250cm9sUGFydCA9IGtDb250cm9sSW5kaWNhdG9yUGFydAora1Jlc2VydmVkQ29udHJvbFBhcnQgPSBrQ29udHJvbERpc2FibGVkUGFydAora0NvbnRyb2xJbmFjdGl2ZUNvbnRyb2xQYXJ0ID0ga0NvbnRyb2xJbmFjdGl2ZVBhcnQKK2tDb250cm9sVGFiTGlzdFJlc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgndGFiIycpCitrQ29udHJvbExpc3REZXNjUmVzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdsZGVzJykKK2tDb250cm9sQ2hlY2tCb3hVbmNoZWNrZWRWYWx1ZSA9IDAKK2tDb250cm9sQ2hlY2tCb3hDaGVja2VkVmFsdWUgPSAxCitrQ29udHJvbENoZWNrQm94TWl4ZWRWYWx1ZSA9IDIKK2tDb250cm9sUmFkaW9CdXR0b25VbmNoZWNrZWRWYWx1ZSA9IDAKK2tDb250cm9sUmFkaW9CdXR0b25DaGVja2VkVmFsdWUgPSAxCitrQ29udHJvbFJhZGlvQnV0dG9uTWl4ZWRWYWx1ZSA9IDIKK3BvcHVwRml4ZWRXaWR0aCA9IDEgPDwgMAorcG9wdXBWYXJpYWJsZVdpZHRoID0gMSA8PCAxCitwb3B1cFVzZUFkZFJlc01lbnUgPSAxIDw8IDIKK3BvcHVwVXNlV0ZvbnQgPSAxIDw8IDMKK3BvcHVwVGl0bGVCb2xkID0gMSA8PCA4Citwb3B1cFRpdGxlSXRhbGljID0gMSA8PCA5Citwb3B1cFRpdGxlVW5kZXJsaW5lID0gMSA8PCAxMAorcG9wdXBUaXRsZU91dGxpbmUgPSAxIDw8IDExCitwb3B1cFRpdGxlU2hhZG93ID0gMSA8PCAxMgorcG9wdXBUaXRsZUNvbmRlbnNlID0gMSA8PCAxMworcG9wdXBUaXRsZUV4dGVuZCA9IDEgPDwgMTQKK3BvcHVwVGl0bGVOb1N0eWxlID0gMSA8PCAxNQorcG9wdXBUaXRsZUxlZnRKdXN0ID0gMHgwMDAwMDAwMAorcG9wdXBUaXRsZUNlbnRlckp1c3QgPSAweDAwMDAwMDAxCitwb3B1cFRpdGxlUmlnaHRKdXN0ID0gMHgwMDAwMDBGRgorcHVzaEJ1dFByb2MgPSAwCitjaGVja0JveFByb2MgPSAxCityYWRpb0J1dFByb2MgPSAyCitzY3JvbGxCYXJQcm9jID0gMTYKK3BvcHVwTWVudVByb2MgPSAxMDA4CitrQ29udHJvbExhYmVsUGFydCA9IDEKK2tDb250cm9sTWVudVBhcnQgPSAyCitrQ29udHJvbFRyaWFuZ2xlUGFydCA9IDQKK2tDb250cm9sRWRpdFRleHRQYXJ0ID0gNQora0NvbnRyb2xQaWN0dXJlUGFydCA9IDYKK2tDb250cm9sSWNvblBhcnQgPSA3CitrQ29udHJvbENsb2NrUGFydCA9IDgKK2tDb250cm9sTGlzdEJveFBhcnQgPSAyNAora0NvbnRyb2xMaXN0Qm94RG91YmxlQ2xpY2tQYXJ0ID0gMjUKK2tDb250cm9sSW1hZ2VXZWxsUGFydCA9IDI2CitrQ29udHJvbFJhZGlvR3JvdXBQYXJ0ID0gMjcKK2tDb250cm9sQnV0dG9uUGFydCA9IDEwCitrQ29udHJvbENoZWNrQm94UGFydCA9IDExCitrQ29udHJvbFJhZGlvQnV0dG9uUGFydCA9IDExCitrQ29udHJvbFVwQnV0dG9uUGFydCA9IDIwCitrQ29udHJvbERvd25CdXR0b25QYXJ0ID0gMjEKK2tDb250cm9sUGFnZVVwUGFydCA9IDIyCitrQ29udHJvbFBhZ2VEb3duUGFydCA9IDIzCitrQ29udHJvbENsb2NrSG91ckRheVBhcnQgPSA5CitrQ29udHJvbENsb2NrTWludXRlTW9udGhQYXJ0ID0gMTAKK2tDb250cm9sQ2xvY2tTZWNvbmRZZWFyUGFydCA9IDExCitrQ29udHJvbENsb2NrQU1QTVBhcnQgPSAxMgora0NvbnRyb2xEYXRhQnJvd3NlclBhcnQgPSAyNAora0NvbnRyb2xEYXRhQnJvd3NlckRyYWdnZWRQYXJ0ID0gMjUKK2tDb250cm9sQmV2ZWxCdXR0b25TbWFsbEJldmVsUHJvYyA9IDMyCitrQ29udHJvbEJldmVsQnV0dG9uTm9ybWFsQmV2ZWxQcm9jID0gMzMKK2tDb250cm9sQmV2ZWxCdXR0b25MYXJnZUJldmVsUHJvYyA9IDM0CitrQ29udHJvbEJldmVsQnV0dG9uU21hbGxCZXZlbFZhcmlhbnQgPSAwCitrQ29udHJvbEJldmVsQnV0dG9uTm9ybWFsQmV2ZWxWYXJpYW50ID0gKDEgPDwgMCkKK2tDb250cm9sQmV2ZWxCdXR0b25MYXJnZUJldmVsVmFyaWFudCA9ICgxIDw8IDEpCitrQ29udHJvbEJldmVsQnV0dG9uTWVudU9uUmlnaHRWYXJpYW50ID0gKDEgPDwgMikKK2tDb250cm9sQmV2ZWxCdXR0b25TbWFsbEJldmVsID0gMAora0NvbnRyb2xCZXZlbEJ1dHRvbk5vcm1hbEJldmVsID0gMQora0NvbnRyb2xCZXZlbEJ1dHRvbkxhcmdlQmV2ZWwgPSAyCitrQ29udHJvbEJlaGF2aW9yUHVzaGJ1dHRvbiA9IDAKK2tDb250cm9sQmVoYXZpb3JUb2dnbGVzID0gMHgwMTAwCitrQ29udHJvbEJlaGF2aW9yU3RpY2t5ID0gMHgwMjAwCitrQ29udHJvbEJlaGF2aW9yU2luZ2xlVmFsdWVNZW51ID0gMAora0NvbnRyb2xCZWhhdmlvck11bHRpVmFsdWVNZW51ID0gMHg0MDAwCitrQ29udHJvbEJlaGF2aW9yT2Zmc2V0Q29udGVudHMgPSAweDgwMDAKK2tDb250cm9sQmVoYXZpb3JDb21tYW5kTWVudSA9IDB4MjAwMAora0NvbnRyb2xCZXZlbEJ1dHRvbk1lbnVPbkJvdHRvbSA9IDAKK2tDb250cm9sQmV2ZWxCdXR0b25NZW51T25SaWdodCA9ICgxIDw8IDIpCitrQ29udHJvbEtpbmRCZXZlbEJ1dHRvbiA9IEZPVVJfQ0hBUl9DT0RFKCdiZXZsJykKK2tDb250cm9sQmV2ZWxCdXR0b25BbGlnblN5c0RpcmVjdGlvbiA9IC0xCitrQ29udHJvbEJldmVsQnV0dG9uQWxpZ25DZW50ZXIgPSAwCitrQ29udHJvbEJldmVsQnV0dG9uQWxpZ25MZWZ0ID0gMQora0NvbnRyb2xCZXZlbEJ1dHRvbkFsaWduUmlnaHQgPSAyCitrQ29udHJvbEJldmVsQnV0dG9uQWxpZ25Ub3AgPSAzCitrQ29udHJvbEJldmVsQnV0dG9uQWxpZ25Cb3R0b20gPSA0CitrQ29udHJvbEJldmVsQnV0dG9uQWxpZ25Ub3BMZWZ0ID0gNQora0NvbnRyb2xCZXZlbEJ1dHRvbkFsaWduQm90dG9tTGVmdCA9IDYKK2tDb250cm9sQmV2ZWxCdXR0b25BbGlnblRvcFJpZ2h0ID0gNwora0NvbnRyb2xCZXZlbEJ1dHRvbkFsaWduQm90dG9tUmlnaHQgPSA4CitrQ29udHJvbEJldmVsQnV0dG9uQWxpZ25UZXh0U3lzRGlyZWN0aW9uID0gdGVGbHVzaERlZmF1bHQKK2tDb250cm9sQmV2ZWxCdXR0b25BbGlnblRleHRDZW50ZXIgPSB0ZUNlbnRlcgora0NvbnRyb2xCZXZlbEJ1dHRvbkFsaWduVGV4dEZsdXNoUmlnaHQgPSB0ZUZsdXNoUmlnaHQKK2tDb250cm9sQmV2ZWxCdXR0b25BbGlnblRleHRGbHVzaExlZnQgPSB0ZUZsdXNoTGVmdAora0NvbnRyb2xCZXZlbEJ1dHRvblBsYWNlU3lzRGlyZWN0aW9uID0gLTEKK2tDb250cm9sQmV2ZWxCdXR0b25QbGFjZU5vcm1hbGx5ID0gMAora0NvbnRyb2xCZXZlbEJ1dHRvblBsYWNlVG9SaWdodE9mR3JhcGhpYyA9IDEKK2tDb250cm9sQmV2ZWxCdXR0b25QbGFjZVRvTGVmdE9mR3JhcGhpYyA9IDIKK2tDb250cm9sQmV2ZWxCdXR0b25QbGFjZUJlbG93R3JhcGhpYyA9IDMKK2tDb250cm9sQmV2ZWxCdXR0b25QbGFjZUFib3ZlR3JhcGhpYyA9IDQKK2tDb250cm9sQmV2ZWxCdXR0b25Db250ZW50VGFnID0gRk9VUl9DSEFSX0NPREUoJ2NvbnQnKQora0NvbnRyb2xCZXZlbEJ1dHRvblRyYW5zZm9ybVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCd0cmFuJykKK2tDb250cm9sQmV2ZWxCdXR0b25UZXh0QWxpZ25UYWcgPSBGT1VSX0NIQVJfQ09ERSgndGFsaScpCitrQ29udHJvbEJldmVsQnV0dG9uVGV4dE9mZnNldFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCd0b2ZmJykKK2tDb250cm9sQmV2ZWxCdXR0b25HcmFwaGljQWxpZ25UYWcgPSBGT1VSX0NIQVJfQ09ERSgnZ2FsaScpCitrQ29udHJvbEJldmVsQnV0dG9uR3JhcGhpY09mZnNldFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdnb2ZmJykKK2tDb250cm9sQmV2ZWxCdXR0b25UZXh0UGxhY2VUYWcgPSBGT1VSX0NIQVJfQ09ERSgndHBsYycpCitrQ29udHJvbEJldmVsQnV0dG9uTWVudVZhbHVlVGFnID0gRk9VUl9DSEFSX0NPREUoJ212YWwnKQora0NvbnRyb2xCZXZlbEJ1dHRvbk1lbnVIYW5kbGVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnbWhuZCcpCitrQ29udHJvbEJldmVsQnV0dG9uTWVudVJlZlRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdtaG5kJykKKyMga0NvbnRyb2xCZXZlbEJ1dHRvbkNlbnRlclBvcHVwR2x5cGhUYWcgPSBGT1VSX0NIQVJfQ09ERSgncGdsYycpCitrQ29udHJvbEJldmVsQnV0dG9uTGFzdE1lbnVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnbG1udScpCitrQ29udHJvbEJldmVsQnV0dG9uTWVudURlbGF5VGFnID0gRk9VUl9DSEFSX0NPREUoJ21kbHknKQora0NvbnRyb2xCZXZlbEJ1dHRvblNjYWxlSWNvblRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdzY2FsJykKK2tDb250cm9sQmV2ZWxCdXR0b25Pd25lZE1lbnVSZWZUYWcgPSBGT1VSX0NIQVJfQ09ERSgnb21yZicpCitrQ29udHJvbEJldmVsQnV0dG9uS2luZFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdiZWJrJykKK2tDb250cm9sU2xpZGVyUHJvYyA9IDQ4CitrQ29udHJvbFNsaWRlckxpdmVGZWVkYmFjayA9ICgxIDw8IDApCitrQ29udHJvbFNsaWRlckhhc1RpY2tNYXJrcyA9ICgxIDw8IDEpCitrQ29udHJvbFNsaWRlclJldmVyc2VEaXJlY3Rpb24gPSAoMSA8PCAyKQora0NvbnRyb2xTbGlkZXJOb25EaXJlY3Rpb25hbCA9ICgxIDw8IDMpCitrQ29udHJvbFNsaWRlclBvaW50c0Rvd25PclJpZ2h0ID0gMAora0NvbnRyb2xTbGlkZXJQb2ludHNVcE9yTGVmdCA9IDEKK2tDb250cm9sU2xpZGVyRG9lc05vdFBvaW50ID0gMgora0NvbnRyb2xLaW5kU2xpZGVyID0gRk9VUl9DSEFSX0NPREUoJ3NsZHInKQora0NvbnRyb2xUcmlhbmdsZVByb2MgPSA2NAora0NvbnRyb2xUcmlhbmdsZUxlZnRGYWNpbmdQcm9jID0gNjUKK2tDb250cm9sVHJpYW5nbGVBdXRvVG9nZ2xlUHJvYyA9IDY2CitrQ29udHJvbFRyaWFuZ2xlTGVmdEZhY2luZ0F1dG9Ub2dnbGVQcm9jID0gNjcKK2tDb250cm9sRGlzY2xvc3VyZVRyaWFuZ2xlUG9pbnREZWZhdWx0ID0gMAora0NvbnRyb2xEaXNjbG9zdXJlVHJpYW5nbGVQb2ludFJpZ2h0ID0gMQora0NvbnRyb2xEaXNjbG9zdXJlVHJpYW5nbGVQb2ludExlZnQgPSAyCitrQ29udHJvbEtpbmREaXNjbG9zdXJlVHJpYW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgnZGlzdCcpCitrQ29udHJvbFRyaWFuZ2xlTGFzdFZhbHVlVGFnID0gRk9VUl9DSEFSX0NPREUoJ2xhc3QnKQora0NvbnRyb2xQcm9ncmVzc0JhclByb2MgPSA4MAora0NvbnRyb2xSZWxldmFuY2VCYXJQcm9jID0gODEKK2tDb250cm9sS2luZFByb2dyZXNzQmFyID0gRk9VUl9DSEFSX0NPREUoJ3ByZ2InKQora0NvbnRyb2xLaW5kUmVsZXZhbmNlQmFyID0gRk9VUl9DSEFSX0NPREUoJ3JlbGInKQora0NvbnRyb2xQcm9ncmVzc0JhckluZGV0ZXJtaW5hdGVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnaW5kZScpCitrQ29udHJvbFByb2dyZXNzQmFyQW5pbWF0aW5nVGFnID0gRk9VUl9DSEFSX0NPREUoJ2FuaW0nKQora0NvbnRyb2xMaXR0bGVBcnJvd3NQcm9jID0gOTYKK2tDb250cm9sS2luZExpdHRsZUFycm93cyA9IEZPVVJfQ0hBUl9DT0RFKCdsYXJyJykKK2tDb250cm9sQ2hhc2luZ0Fycm93c1Byb2MgPSAxMTIKK2tDb250cm9sS2luZENoYXNpbmdBcnJvd3MgPSBGT1VSX0NIQVJfQ09ERSgnY2FycicpCitrQ29udHJvbENoYXNpbmdBcnJvd3NBbmltYXRpbmdUYWcgPSBGT1VSX0NIQVJfQ09ERSgnYW5pbScpCitrQ29udHJvbFRhYkxhcmdlUHJvYyA9IDEyOAora0NvbnRyb2xUYWJTbWFsbFByb2MgPSAxMjkKK2tDb250cm9sVGFiTGFyZ2VOb3J0aFByb2MgPSAxMjgKK2tDb250cm9sVGFiU21hbGxOb3J0aFByb2MgPSAxMjkKK2tDb250cm9sVGFiTGFyZ2VTb3V0aFByb2MgPSAxMzAKK2tDb250cm9sVGFiU21hbGxTb3V0aFByb2MgPSAxMzEKK2tDb250cm9sVGFiTGFyZ2VFYXN0UHJvYyA9IDEzMgora0NvbnRyb2xUYWJTbWFsbEVhc3RQcm9jID0gMTMzCitrQ29udHJvbFRhYkxhcmdlV2VzdFByb2MgPSAxMzQKK2tDb250cm9sVGFiU21hbGxXZXN0UHJvYyA9IDEzNQora0NvbnRyb2xUYWJEaXJlY3Rpb25Ob3J0aCA9IDAKK2tDb250cm9sVGFiRGlyZWN0aW9uU291dGggPSAxCitrQ29udHJvbFRhYkRpcmVjdGlvbkVhc3QgPSAyCitrQ29udHJvbFRhYkRpcmVjdGlvbldlc3QgPSAzCitrQ29udHJvbFRhYlNpemVMYXJnZSA9IGtDb250cm9sU2l6ZU5vcm1hbAora0NvbnRyb2xUYWJTaXplU21hbGwgPSBrQ29udHJvbFNpemVTbWFsbAora0NvbnRyb2xLaW5kVGFicyA9IEZPVVJfQ0hBUl9DT0RFKCd0YWJzJykKK2tDb250cm9sVGFiQ29udGVudFJlY3RUYWcgPSBGT1VSX0NIQVJfQ09ERSgncmVjdCcpCitrQ29udHJvbFRhYkVuYWJsZWRGbGFnVGFnID0gRk9VUl9DSEFSX0NPREUoJ2VuYWInKQora0NvbnRyb2xUYWJGb250U3R5bGVUYWcgPSBrQ29udHJvbEZvbnRTdHlsZVRhZwora0NvbnRyb2xUYWJJbmZvVGFnID0gRk9VUl9DSEFSX0NPREUoJ3RhYmknKQora0NvbnRyb2xUYWJJbWFnZUNvbnRlbnRUYWcgPSBGT1VSX0NIQVJfQ09ERSgnY29udCcpCitrQ29udHJvbFRhYkluZm9WZXJzaW9uWmVybyA9IDAKK2tDb250cm9sVGFiSW5mb1ZlcnNpb25PbmUgPSAxCitrQ29udHJvbFNlcGFyYXRvckxpbmVQcm9jID0gMTQ0CitrQ29udHJvbEtpbmRTZXBhcmF0b3IgPSBGT1VSX0NIQVJfQ09ERSgnc2VwYScpCitrQ29udHJvbEdyb3VwQm94VGV4dFRpdGxlUHJvYyA9IDE2MAora0NvbnRyb2xHcm91cEJveENoZWNrQm94UHJvYyA9IDE2MQora0NvbnRyb2xHcm91cEJveFBvcHVwQnV0dG9uUHJvYyA9IDE2Mgora0NvbnRyb2xHcm91cEJveFNlY29uZGFyeVRleHRUaXRsZVByb2MgPSAxNjQKK2tDb250cm9sR3JvdXBCb3hTZWNvbmRhcnlDaGVja0JveFByb2MgPSAxNjUKK2tDb250cm9sR3JvdXBCb3hTZWNvbmRhcnlQb3B1cEJ1dHRvblByb2MgPSAxNjYKK2tDb250cm9sS2luZEdyb3VwQm94ID0gRk9VUl9DSEFSX0NPREUoJ2dycGInKQora0NvbnRyb2xLaW5kQ2hlY2tHcm91cEJveCA9IEZPVVJfQ0hBUl9DT0RFKCdjZ3JwJykKK2tDb250cm9sS2luZFBvcHVwR3JvdXBCb3ggPSBGT1VSX0NIQVJfQ09ERSgncGdycCcpCitrQ29udHJvbEdyb3VwQm94TWVudUhhbmRsZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdtaGFuJykKK2tDb250cm9sR3JvdXBCb3hNZW51UmVmVGFnID0gRk9VUl9DSEFSX0NPREUoJ21oYW4nKQora0NvbnRyb2xHcm91cEJveEZvbnRTdHlsZVRhZyA9IGtDb250cm9sRm9udFN0eWxlVGFnCitrQ29udHJvbEdyb3VwQm94VGl0bGVSZWN0VGFnID0gRk9VUl9DSEFSX0NPREUoJ3RyZWMnKQora0NvbnRyb2xJbWFnZVdlbGxQcm9jID0gMTc2CitrQ29udHJvbEtpbmRJbWFnZVdlbGwgPSBGT1VSX0NIQVJfQ09ERSgnd2VsbCcpCitrQ29udHJvbEltYWdlV2VsbENvbnRlbnRUYWcgPSBGT1VSX0NIQVJfQ09ERSgnY29udCcpCitrQ29udHJvbEltYWdlV2VsbFRyYW5zZm9ybVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCd0cmFuJykKK2tDb250cm9sSW1hZ2VXZWxsSXNEcmFnRGVzdGluYXRpb25UYWcgPSBGT1VSX0NIQVJfQ09ERSgnZHJhZycpCitrQ29udHJvbFBvcHVwQXJyb3dFYXN0UHJvYyA9IDE5Mgora0NvbnRyb2xQb3B1cEFycm93V2VzdFByb2MgPSAxOTMKK2tDb250cm9sUG9wdXBBcnJvd05vcnRoUHJvYyA9IDE5NAora0NvbnRyb2xQb3B1cEFycm93U291dGhQcm9jID0gMTk1CitrQ29udHJvbFBvcHVwQXJyb3dTbWFsbEVhc3RQcm9jID0gMTk2CitrQ29udHJvbFBvcHVwQXJyb3dTbWFsbFdlc3RQcm9jID0gMTk3CitrQ29udHJvbFBvcHVwQXJyb3dTbWFsbE5vcnRoUHJvYyA9IDE5OAora0NvbnRyb2xQb3B1cEFycm93U21hbGxTb3V0aFByb2MgPSAxOTkKK2tDb250cm9sUG9wdXBBcnJvd09yaWVudGF0aW9uRWFzdCA9IDAKK2tDb250cm9sUG9wdXBBcnJvd09yaWVudGF0aW9uV2VzdCA9IDEKK2tDb250cm9sUG9wdXBBcnJvd09yaWVudGF0aW9uTm9ydGggPSAyCitrQ29udHJvbFBvcHVwQXJyb3dPcmllbnRhdGlvblNvdXRoID0gMwora0NvbnRyb2xQb3B1cEFycm93U2l6ZU5vcm1hbCA9IDAKK2tDb250cm9sUG9wdXBBcnJvd1NpemVTbWFsbCA9IDEKK2tDb250cm9sS2luZFBvcHVwQXJyb3cgPSBGT1VSX0NIQVJfQ09ERSgncGFycicpCitrQ29udHJvbFBsYWNhcmRQcm9jID0gMjI0CitrQ29udHJvbEtpbmRQbGFjYXJkID0gRk9VUl9DSEFSX0NPREUoJ3BsYWMnKQora0NvbnRyb2xDbG9ja1RpbWVQcm9jID0gMjQwCitrQ29udHJvbENsb2NrVGltZVNlY29uZHNQcm9jID0gMjQxCitrQ29udHJvbENsb2NrRGF0ZVByb2MgPSAyNDIKK2tDb250cm9sQ2xvY2tNb250aFllYXJQcm9jID0gMjQzCitrQ29udHJvbENsb2NrVHlwZUhvdXJNaW51dGUgPSAwCitrQ29udHJvbENsb2NrVHlwZUhvdXJNaW51dGVTZWNvbmQgPSAxCitrQ29udHJvbENsb2NrVHlwZU1vbnRoRGF5WWVhciA9IDIKK2tDb250cm9sQ2xvY2tUeXBlTW9udGhZZWFyID0gMwora0NvbnRyb2xDbG9ja0ZsYWdTdGFuZGFyZCA9IDAKK2tDb250cm9sQ2xvY2tOb0ZsYWdzID0gMAora0NvbnRyb2xDbG9ja0ZsYWdEaXNwbGF5T25seSA9IDEKK2tDb250cm9sQ2xvY2tJc0Rpc3BsYXlPbmx5ID0gMQora0NvbnRyb2xDbG9ja0ZsYWdMaXZlID0gMgora0NvbnRyb2xDbG9ja0lzTGl2ZSA9IDIKK2tDb250cm9sS2luZENsb2NrID0gRk9VUl9DSEFSX0NPREUoJ2NsY2snKQora0NvbnRyb2xDbG9ja0xvbmdEYXRlVGFnID0gRk9VUl9DSEFSX0NPREUoJ2RhdGUnKQora0NvbnRyb2xDbG9ja0ZvbnRTdHlsZVRhZyA9IGtDb250cm9sRm9udFN0eWxlVGFnCitrQ29udHJvbENsb2NrQW5pbWF0aW5nVGFnID0gRk9VUl9DSEFSX0NPREUoJ2FuaW0nKQora0NvbnRyb2xVc2VyUGFuZVByb2MgPSAyNTYKK2tDb250cm9sS2luZFVzZXJQYW5lID0gRk9VUl9DSEFSX0NPREUoJ3VwYW4nKQora0NvbnRyb2xVc2VySXRlbURyYXdQcm9jVGFnID0gRk9VUl9DSEFSX0NPREUoJ3VpZHAnKQora0NvbnRyb2xVc2VyUGFuZURyYXdQcm9jVGFnID0gRk9VUl9DSEFSX0NPREUoJ2RyYXcnKQora0NvbnRyb2xVc2VyUGFuZUhpdFRlc3RQcm9jVGFnID0gRk9VUl9DSEFSX0NPREUoJ2hpdHQnKQora0NvbnRyb2xVc2VyUGFuZVRyYWNraW5nUHJvY1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCd0cmFrJykKK2tDb250cm9sVXNlclBhbmVJZGxlUHJvY1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdpZGxlJykKK2tDb250cm9sVXNlclBhbmVLZXlEb3duUHJvY1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdrZXlkJykKK2tDb250cm9sVXNlclBhbmVBY3RpdmF0ZVByb2NUYWcgPSBGT1VSX0NIQVJfQ09ERSgnYWN0aScpCitrQ29udHJvbFVzZXJQYW5lRm9jdXNQcm9jVGFnID0gRk9VUl9DSEFSX0NPREUoJ2ZvY2knKQora0NvbnRyb2xVc2VyUGFuZUJhY2tncm91bmRQcm9jVGFnID0gRk9VUl9DSEFSX0NPREUoJ2JhY2snKQora0NvbnRyb2xFZGl0VGV4dFByb2MgPSAyNzIKK2tDb250cm9sRWRpdFRleHRQYXNzd29yZFByb2MgPSAyNzQKK2tDb250cm9sRWRpdFRleHRJbmxpbmVJbnB1dFByb2MgPSAyNzYKK2tDb250cm9sS2luZEVkaXRUZXh0ID0gRk9VUl9DSEFSX0NPREUoJ2V0eHQnKQora0NvbnRyb2xFZGl0VGV4dFN0eWxlVGFnID0ga0NvbnRyb2xGb250U3R5bGVUYWcKK2tDb250cm9sRWRpdFRleHRUZXh0VGFnID0gRk9VUl9DSEFSX0NPREUoJ3RleHQnKQora0NvbnRyb2xFZGl0VGV4dFRFSGFuZGxlVGFnID0gRk9VUl9DSEFSX0NPREUoJ3RoYW4nKQora0NvbnRyb2xFZGl0VGV4dEtleUZpbHRlclRhZyA9IGtDb250cm9sS2V5RmlsdGVyVGFnCitrQ29udHJvbEVkaXRUZXh0U2VsZWN0aW9uVGFnID0gRk9VUl9DSEFSX0NPREUoJ3NlbGUnKQora0NvbnRyb2xFZGl0VGV4dFBhc3N3b3JkVGFnID0gRk9VUl9DSEFSX0NPREUoJ3Bhc3MnKQora0NvbnRyb2xFZGl0VGV4dEtleVNjcmlwdEJlaGF2aW9yVGFnID0gRk9VUl9DSEFSX0NPREUoJ2tzY3InKQora0NvbnRyb2xFZGl0VGV4dExvY2tlZFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdsb2NrJykKK2tDb250cm9sRWRpdFRleHRGaXhlZFRleHRUYWcgPSBGT1VSX0NIQVJfQ09ERSgnZnR4dCcpCitrQ29udHJvbEVkaXRUZXh0VmFsaWRhdGlvblByb2NUYWcgPSBGT1VSX0NIQVJfQ09ERSgndmFsaScpCitrQ29udHJvbEVkaXRUZXh0SW5saW5lUHJlVXBkYXRlUHJvY1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdwcnVwJykKK2tDb250cm9sRWRpdFRleHRJbmxpbmVQb3N0VXBkYXRlUHJvY1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdwb3VwJykKK2tDb250cm9sRWRpdFRleHRDRlN0cmluZ1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdjZnN0JykKK2tDb250cm9sRWRpdFRleHRQYXNzd29yZENGU3RyaW5nVGFnID0gRk9VUl9DSEFSX0NPREUoJ3B3Y2YnKQora0NvbnRyb2xTdGF0aWNUZXh0UHJvYyA9IDI4OAora0NvbnRyb2xLaW5kU3RhdGljVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdzdHh0JykKK2tDb250cm9sU3RhdGljVGV4dFN0eWxlVGFnID0ga0NvbnRyb2xGb250U3R5bGVUYWcKK2tDb250cm9sU3RhdGljVGV4dFRleHRUYWcgPSBGT1VSX0NIQVJfQ09ERSgndGV4dCcpCitrQ29udHJvbFN0YXRpY1RleHRUZXh0SGVpZ2h0VGFnID0gRk9VUl9DSEFSX0NPREUoJ3RoZWknKQora0NvbnRyb2xTdGF0aWNUZXh0VHJ1bmNUYWcgPSBGT1VSX0NIQVJfQ09ERSgndHJ1bicpCitrQ29udHJvbFN0YXRpY1RleHRDRlN0cmluZ1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdjZnN0JykKK2tDb250cm9sUGljdHVyZVByb2MgPSAzMDQKK2tDb250cm9sUGljdHVyZU5vVHJhY2tQcm9jID0gMzA1CitrQ29udHJvbEtpbmRQaWN0dXJlID0gRk9VUl9DSEFSX0NPREUoJ3BpY3QnKQora0NvbnRyb2xQaWN0dXJlSGFuZGxlVGFnID0gRk9VUl9DSEFSX0NPREUoJ3BpY2gnKQora0NvbnRyb2xJY29uUHJvYyA9IDMyMAora0NvbnRyb2xJY29uTm9UcmFja1Byb2MgPSAzMjEKK2tDb250cm9sSWNvblN1aXRlUHJvYyA9IDMyMgora0NvbnRyb2xJY29uU3VpdGVOb1RyYWNrUHJvYyA9IDMyMwora0NvbnRyb2xJY29uUmVmUHJvYyA9IDMyNAora0NvbnRyb2xJY29uUmVmTm9UcmFja1Byb2MgPSAzMjUKK2tDb250cm9sS2luZEljb24gPSBGT1VSX0NIQVJfQ09ERSgnaWNvbicpCitrQ29udHJvbEljb25UcmFuc2Zvcm1UYWcgPSBGT1VSX0NIQVJfQ09ERSgndHJmbScpCitrQ29udHJvbEljb25BbGlnbm1lbnRUYWcgPSBGT1VSX0NIQVJfQ09ERSgnYWxnbicpCitrQ29udHJvbEljb25SZXNvdXJjZUlEVGFnID0gRk9VUl9DSEFSX0NPREUoJ2lyZXMnKQora0NvbnRyb2xJY29uQ29udGVudFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdjb250JykKK2tDb250cm9sV2luZG93SGVhZGVyUHJvYyA9IDMzNgora0NvbnRyb2xXaW5kb3dMaXN0Vmlld0hlYWRlclByb2MgPSAzMzcKK2tDb250cm9sS2luZFdpbmRvd0hlYWRlciA9IEZPVVJfQ0hBUl9DT0RFKCd3aGVkJykKK2tDb250cm9sTGlzdEJveFByb2MgPSAzNTIKK2tDb250cm9sTGlzdEJveEF1dG9TaXplUHJvYyA9IDM1Mwora0NvbnRyb2xLaW5kTGlzdEJveCA9IEZPVVJfQ0hBUl9DT0RFKCdsYm94JykKK2tDb250cm9sTGlzdEJveExpc3RIYW5kbGVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnbGhhbicpCitrQ29udHJvbExpc3RCb3hLZXlGaWx0ZXJUYWcgPSBrQ29udHJvbEtleUZpbHRlclRhZwora0NvbnRyb2xMaXN0Qm94Rm9udFN0eWxlVGFnID0ga0NvbnRyb2xGb250U3R5bGVUYWcKK2tDb250cm9sTGlzdEJveERvdWJsZUNsaWNrVGFnID0gRk9VUl9DSEFSX0NPREUoJ2RibGMnKQora0NvbnRyb2xMaXN0Qm94TERFRlRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdsZGVmJykKK2tDb250cm9sUHVzaEJ1dHRvblByb2MgPSAzNjgKK2tDb250cm9sQ2hlY2tCb3hQcm9jID0gMzY5CitrQ29udHJvbFJhZGlvQnV0dG9uUHJvYyA9IDM3MAora0NvbnRyb2xQdXNoQnV0TGVmdEljb25Qcm9jID0gMzc0CitrQ29udHJvbFB1c2hCdXRSaWdodEljb25Qcm9jID0gMzc1CitrQ29udHJvbENoZWNrQm94QXV0b1RvZ2dsZVByb2MgPSAzNzEKK2tDb250cm9sUmFkaW9CdXR0b25BdXRvVG9nZ2xlUHJvYyA9IDM3Mgora0NvbnRyb2xQdXNoQnV0dG9uSWNvbk9uTGVmdCA9IDYKK2tDb250cm9sUHVzaEJ1dHRvbkljb25PblJpZ2h0ID0gNwora0NvbnRyb2xLaW5kUHVzaEJ1dHRvbiA9IEZPVVJfQ0hBUl9DT0RFKCdwdXNoJykKK2tDb250cm9sS2luZFB1c2hJY29uQnV0dG9uID0gRk9VUl9DSEFSX0NPREUoJ3BpY24nKQora0NvbnRyb2xLaW5kUmFkaW9CdXR0b24gPSBGT1VSX0NIQVJfQ09ERSgncmRpbycpCitrQ29udHJvbEtpbmRDaGVja0JveCA9IEZPVVJfQ0hBUl9DT0RFKCdjYm94JykKK2tDb250cm9sUHVzaEJ1dHRvbkRlZmF1bHRUYWcgPSBGT1VSX0NIQVJfQ09ERSgnZGZsdCcpCitrQ29udHJvbFB1c2hCdXR0b25DYW5jZWxUYWcgPSBGT1VSX0NIQVJfQ09ERSgnY25jbCcpCitrQ29udHJvbFNjcm9sbEJhclByb2MgPSAzODQKK2tDb250cm9sU2Nyb2xsQmFyTGl2ZVByb2MgPSAzODYKK2tDb250cm9sS2luZFNjcm9sbEJhciA9IEZPVVJfQ0hBUl9DT0RFKCdzYmFyJykKK2tDb250cm9sU2Nyb2xsQmFyU2hvd3NBcnJvd3NUYWcgPSBGT1VSX0NIQVJfQ09ERSgnYXJybycpCitrQ29udHJvbFBvcHVwQnV0dG9uUHJvYyA9IDQwMAora0NvbnRyb2xQb3B1cEZpeGVkV2lkdGhWYXJpYW50ID0gMSA8PCAwCitrQ29udHJvbFBvcHVwVmFyaWFibGVXaWR0aFZhcmlhbnQgPSAxIDw8IDEKK2tDb250cm9sUG9wdXBVc2VBZGRSZXNNZW51VmFyaWFudCA9IDEgPDwgMgora0NvbnRyb2xQb3B1cFVzZVdGb250VmFyaWFudCA9IGtDb250cm9sVXNlc093bmluZ1dpbmRvd3NGb250VmFyaWFudAora0NvbnRyb2xLaW5kUG9wdXBCdXR0b24gPSBGT1VSX0NIQVJfQ09ERSgncG9wYicpCitrQ29udHJvbFBvcHVwQnV0dG9uTWVudUhhbmRsZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdtaGFuJykKK2tDb250cm9sUG9wdXBCdXR0b25NZW51UmVmVGFnID0gRk9VUl9DSEFSX0NPREUoJ21oYW4nKQora0NvbnRyb2xQb3B1cEJ1dHRvbk1lbnVJRFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdtbmlkJykKK2tDb250cm9sUG9wdXBCdXR0b25FeHRyYUhlaWdodFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdleGh0JykKK2tDb250cm9sUG9wdXBCdXR0b25Pd25lZE1lbnVSZWZUYWcgPSBGT1VSX0NIQVJfQ09ERSgnb21yZicpCitrQ29udHJvbFBvcHVwQnV0dG9uQ2hlY2tDdXJyZW50VGFnID0gRk9VUl9DSEFSX0NPREUoJ2NoY2snKQora0NvbnRyb2xSYWRpb0dyb3VwUHJvYyA9IDQxNgora0NvbnRyb2xLaW5kUmFkaW9Hcm91cCA9IEZPVVJfQ0hBUl9DT0RFKCdyZ3JwJykKK2tDb250cm9sU2Nyb2xsVGV4dEJveFByb2MgPSA0MzIKK2tDb250cm9sU2Nyb2xsVGV4dEJveEF1dG9TY3JvbGxQcm9jID0gNDMzCitrQ29udHJvbEtpbmRTY3JvbGxpbmdUZXh0Qm94ID0gRk9VUl9DSEFSX0NPREUoJ3N0YngnKQora0NvbnRyb2xTY3JvbGxUZXh0Qm94RGVsYXlCZWZvcmVBdXRvU2Nyb2xsVGFnID0gRk9VUl9DSEFSX0NPREUoJ3N0ZGwnKQora0NvbnRyb2xTY3JvbGxUZXh0Qm94RGVsYXlCZXR3ZWVuQXV0b1Njcm9sbFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdzY2RsJykKK2tDb250cm9sU2Nyb2xsVGV4dEJveEF1dG9TY3JvbGxBbW91bnRUYWcgPSBGT1VSX0NIQVJfQ09ERSgnc2FtdCcpCitrQ29udHJvbFNjcm9sbFRleHRCb3hDb250ZW50c1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCd0cmVzJykKK2tDb250cm9sU2Nyb2xsVGV4dEJveEFuaW1hdGluZ1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdhbmltJykKK2tDb250cm9sS2luZERpc2Nsb3N1cmVCdXR0b24gPSBGT1VSX0NIQVJfQ09ERSgnZGlzYicpCitrQ29udHJvbERpc2Nsb3N1cmVCdXR0b25DbG9zZWQgPSAwCitrQ29udHJvbERpc2Nsb3N1cmVCdXR0b25EaXNjbG9zZWQgPSAxCitrQ29udHJvbFJvdW5kQnV0dG9uTm9ybWFsU2l6ZSA9IGtDb250cm9sU2l6ZU5vcm1hbAora0NvbnRyb2xSb3VuZEJ1dHRvbkxhcmdlU2l6ZSA9IGtDb250cm9sU2l6ZUxhcmdlCitrQ29udHJvbFJvdW5kQnV0dG9uQ29udGVudFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdjb250JykKK2tDb250cm9sUm91bmRCdXR0b25TaXplVGFnID0ga0NvbnRyb2xTaXplVGFnCitrQ29udHJvbEtpbmRSb3VuZEJ1dHRvbiA9IEZPVVJfQ0hBUl9DT0RFKCdybmRiJykKK2tDb250cm9sS2luZERhdGFCcm93c2VyID0gRk9VUl9DSEFSX0NPREUoJ2RhdGInKQorZXJyRGF0YUJyb3dzZXJOb3RDb25maWd1cmVkID0gLTQ5NzAKK2VyckRhdGFCcm93c2VySXRlbU5vdEZvdW5kID0gLTQ5NzEKK2VyckRhdGFCcm93c2VySXRlbU5vdEFkZGVkID0gLTQ5NzUKK2VyckRhdGFCcm93c2VyUHJvcGVydHlOb3RGb3VuZCA9IC00OTcyCitlcnJEYXRhQnJvd3NlckludmFsaWRQcm9wZXJ0eVBhcnQgPSAtNDk3MworZXJyRGF0YUJyb3dzZXJJbnZhbGlkUHJvcGVydHlEYXRhID0gLTQ5NzQKK2VyckRhdGFCcm93c2VyUHJvcGVydHlOb3RTdXBwb3J0ZWQgPSAtNDk3OQora0NvbnRyb2xEYXRhQnJvd3NlckluY2x1ZGVzRnJhbWVBbmRGb2N1c1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdicmRyJykKK2tDb250cm9sRGF0YUJyb3dzZXJLZXlGaWx0ZXJUYWcgPSBrQ29udHJvbEVkaXRUZXh0S2V5RmlsdGVyVGFnCitrQ29udHJvbERhdGFCcm93c2VyRWRpdFRleHRLZXlGaWx0ZXJUYWcgPSBrQ29udHJvbERhdGFCcm93c2VyS2V5RmlsdGVyVGFnCitrQ29udHJvbERhdGFCcm93c2VyRWRpdFRleHRWYWxpZGF0aW9uUHJvY1RhZyA9IGtDb250cm9sRWRpdFRleHRWYWxpZGF0aW9uUHJvY1RhZwora0RhdGFCcm93c2VyTm9WaWV3ID0gMHgzRjNGM0YzRgora0RhdGFCcm93c2VyTGlzdFZpZXcgPSBGT1VSX0NIQVJfQ09ERSgnbHN0dicpCitrRGF0YUJyb3dzZXJDb2x1bW5WaWV3ID0gRk9VUl9DSEFSX0NPREUoJ2NsbXYnKQora0RhdGFCcm93c2VyRHJhZ1NlbGVjdCA9IDEgPDwgMAora0RhdGFCcm93c2VyU2VsZWN0T25seU9uZSA9IDEgPDwgMQora0RhdGFCcm93c2VyUmVzZXRTZWxlY3Rpb24gPSAxIDw8IDIKK2tEYXRhQnJvd3NlckNtZFRvZ2dsZXNTZWxlY3Rpb24gPSAxIDw8IDMKK2tEYXRhQnJvd3Nlck5vRGlzam9pbnRTZWxlY3Rpb24gPSAxIDw8IDQKK2tEYXRhQnJvd3NlckFsd2F5c0V4dGVuZFNlbGVjdGlvbiA9IDEgPDwgNQora0RhdGFCcm93c2VyTmV2ZXJFbXB0eVNlbGVjdGlvblNldCA9IDEgPDwgNgora0RhdGFCcm93c2VyT3JkZXJVbmRlZmluZWQgPSAwCitrRGF0YUJyb3dzZXJPcmRlckluY3JlYXNpbmcgPSAxCitrRGF0YUJyb3dzZXJPcmRlckRlY3JlYXNpbmcgPSAyCitrRGF0YUJyb3dzZXJOb0l0ZW0gPSAwTAora0RhdGFCcm93c2VySXRlbU5vU3RhdGUgPSAwCisjIGtEYXRhQnJvd3Nlckl0ZW1BbnlTdGF0ZSA9ICh1bnNpZ25lZCBsb25nKSgtMSkKK2tEYXRhQnJvd3Nlckl0ZW1Jc1NlbGVjdGVkID0gMSA8PCAwCitrRGF0YUJyb3dzZXJDb250YWluZXJJc09wZW4gPSAxIDw8IDEKK2tEYXRhQnJvd3Nlckl0ZW1Jc0RyYWdUYXJnZXQgPSAxIDw8IDIKK2tEYXRhQnJvd3NlclJldmVhbE9ubHkgPSAwCitrRGF0YUJyb3dzZXJSZXZlYWxBbmRDZW50ZXJJblZpZXcgPSAxIDw8IDAKK2tEYXRhQnJvd3NlclJldmVhbFdpdGhvdXRTZWxlY3RpbmcgPSAxIDw8IDEKK2tEYXRhQnJvd3Nlckl0ZW1zQWRkID0gMAora0RhdGFCcm93c2VySXRlbXNBc3NpZ24gPSAxCitrRGF0YUJyb3dzZXJJdGVtc1RvZ2dsZSA9IDIKK2tEYXRhQnJvd3Nlckl0ZW1zUmVtb3ZlID0gMwora0RhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yVXAgPSAwCitrRGF0YUJyb3dzZXJTZWxlY3Rpb25BbmNob3JEb3duID0gMQora0RhdGFCcm93c2VyU2VsZWN0aW9uQW5jaG9yTGVmdCA9IDIKK2tEYXRhQnJvd3NlclNlbGVjdGlvbkFuY2hvclJpZ2h0ID0gMwora0RhdGFCcm93c2VyRWRpdE1zZ1VuZG8gPSBrSElDb21tYW5kVW5kbwora0RhdGFCcm93c2VyRWRpdE1zZ1JlZG8gPSBrSElDb21tYW5kUmVkbwora0RhdGFCcm93c2VyRWRpdE1zZ0N1dCA9IGtISUNvbW1hbmRDdXQKK2tEYXRhQnJvd3NlckVkaXRNc2dDb3B5ID0ga0hJQ29tbWFuZENvcHkKK2tEYXRhQnJvd3NlckVkaXRNc2dQYXN0ZSA9IGtISUNvbW1hbmRQYXN0ZQora0RhdGFCcm93c2VyRWRpdE1zZ0NsZWFyID0ga0hJQ29tbWFuZENsZWFyCitrRGF0YUJyb3dzZXJFZGl0TXNnU2VsZWN0QWxsID0ga0hJQ29tbWFuZFNlbGVjdEFsbAora0RhdGFCcm93c2VySXRlbUFkZGVkID0gMQora0RhdGFCcm93c2VySXRlbVJlbW92ZWQgPSAyCitrRGF0YUJyb3dzZXJFZGl0U3RhcnRlZCA9IDMKK2tEYXRhQnJvd3NlckVkaXRTdG9wcGVkID0gNAora0RhdGFCcm93c2VySXRlbVNlbGVjdGVkID0gNQora0RhdGFCcm93c2VySXRlbURlc2VsZWN0ZWQgPSA2CitrRGF0YUJyb3dzZXJJdGVtRG91YmxlQ2xpY2tlZCA9IDcKK2tEYXRhQnJvd3NlckNvbnRhaW5lck9wZW5lZCA9IDgKK2tEYXRhQnJvd3NlckNvbnRhaW5lckNsb3NpbmcgPSA5CitrRGF0YUJyb3dzZXJDb250YWluZXJDbG9zZWQgPSAxMAora0RhdGFCcm93c2VyQ29udGFpbmVyU29ydGluZyA9IDExCitrRGF0YUJyb3dzZXJDb250YWluZXJTb3J0ZWQgPSAxMgora0RhdGFCcm93c2VyVXNlclRvZ2dsZWRDb250YWluZXIgPSAxNgora0RhdGFCcm93c2VyVGFyZ2V0Q2hhbmdlZCA9IDE1CitrRGF0YUJyb3dzZXJVc2VyU3RhdGVDaGFuZ2VkID0gMTMKK2tEYXRhQnJvd3NlclNlbGVjdGlvblNldENoYW5nZWQgPSAxNAora0RhdGFCcm93c2VySXRlbU5vUHJvcGVydHkgPSAwTAora0RhdGFCcm93c2VySXRlbUlzQWN0aXZlUHJvcGVydHkgPSAxTAora0RhdGFCcm93c2VySXRlbUlzU2VsZWN0YWJsZVByb3BlcnR5ID0gMkwKK2tEYXRhQnJvd3Nlckl0ZW1Jc0VkaXRhYmxlUHJvcGVydHkgPSAzTAora0RhdGFCcm93c2VySXRlbUlzQ29udGFpbmVyUHJvcGVydHkgPSA0TAora0RhdGFCcm93c2VyQ29udGFpbmVySXNPcGVuYWJsZVByb3BlcnR5ID0gNUwKK2tEYXRhQnJvd3NlckNvbnRhaW5lcklzQ2xvc2FibGVQcm9wZXJ0eSA9IDZMCitrRGF0YUJyb3dzZXJDb250YWluZXJJc1NvcnRhYmxlUHJvcGVydHkgPSA3TAora0RhdGFCcm93c2VySXRlbVNlbGZJZGVudGl0eVByb3BlcnR5ID0gOEwKK2tEYXRhQnJvd3NlckNvbnRhaW5lckFsaWFzSURQcm9wZXJ0eSA9IDlMCitrRGF0YUJyb3dzZXJDb2x1bW5WaWV3UHJldmlld1Byb3BlcnR5ID0gMTBMCitrRGF0YUJyb3dzZXJJdGVtUGFyZW50Q29udGFpbmVyUHJvcGVydHkgPSAxMUwKK2tEYXRhQnJvd3NlckN1c3RvbVR5cGUgPSAweDNGM0YzRjNGCitrRGF0YUJyb3dzZXJJY29uVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpY25yJykKK2tEYXRhQnJvd3NlclRleHRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RleHQnKQora0RhdGFCcm93c2VyRGF0ZVRpbWVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2RhdGUnKQora0RhdGFCcm93c2VyU2xpZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzbGRyJykKK2tEYXRhQnJvd3NlckNoZWNrYm94VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjaGJ4JykKK2tEYXRhQnJvd3NlclByb2dyZXNzQmFyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdwcm9nJykKK2tEYXRhQnJvd3NlclJlbGV2YW5jZVJhbmtUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3JhbmsnKQora0RhdGFCcm93c2VyUG9wdXBNZW51VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtZW51JykKK2tEYXRhQnJvd3Nlckljb25BbmRUZXh0VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0aWNuJykKK2tEYXRhQnJvd3NlclByb3BlcnR5RW5jbG9zaW5nUGFydCA9IDBMCitrRGF0YUJyb3dzZXJQcm9wZXJ0eUNvbnRlbnRQYXJ0ID0gRk9VUl9DSEFSX0NPREUoJy0tLS0nKQora0RhdGFCcm93c2VyUHJvcGVydHlEaXNjbG9zdXJlUGFydCA9IEZPVVJfQ0hBUl9DT0RFKCdkaXNjJykKK2tEYXRhQnJvd3NlclByb3BlcnR5VGV4dFBhcnQgPSBrRGF0YUJyb3dzZXJUZXh0VHlwZQora0RhdGFCcm93c2VyUHJvcGVydHlJY29uUGFydCA9IGtEYXRhQnJvd3Nlckljb25UeXBlCitrRGF0YUJyb3dzZXJQcm9wZXJ0eVNsaWRlclBhcnQgPSBrRGF0YUJyb3dzZXJTbGlkZXJUeXBlCitrRGF0YUJyb3dzZXJQcm9wZXJ0eUNoZWNrYm94UGFydCA9IGtEYXRhQnJvd3NlckNoZWNrYm94VHlwZQora0RhdGFCcm93c2VyUHJvcGVydHlQcm9ncmVzc0JhclBhcnQgPSBrRGF0YUJyb3dzZXJQcm9ncmVzc0JhclR5cGUKK2tEYXRhQnJvd3NlclByb3BlcnR5UmVsZXZhbmNlUmFua1BhcnQgPSBrRGF0YUJyb3dzZXJSZWxldmFuY2VSYW5rVHlwZQora0RhdGFCcm93c2VyVW5pdmVyc2FsUHJvcGVydHlGbGFnc01hc2sgPSAweEZGCitrRGF0YUJyb3dzZXJQcm9wZXJ0eUlzTXV0YWJsZSA9IDEgPDwgMAora0RhdGFCcm93c2VyRGVmYXVsdFByb3BlcnR5RmxhZ3MgPSAwIDw8IDAKK2tEYXRhQnJvd3NlclVuaXZlcnNhbFByb3BlcnR5RmxhZ3MgPSBrRGF0YUJyb3dzZXJVbml2ZXJzYWxQcm9wZXJ0eUZsYWdzTWFzawora0RhdGFCcm93c2VyUHJvcGVydHlJc0VkaXRhYmxlID0ga0RhdGFCcm93c2VyUHJvcGVydHlJc011dGFibGUKK2tEYXRhQnJvd3NlclByb3BlcnR5RmxhZ3NPZmZzZXQgPSA4CitrRGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzTWFzayA9IDB4RkYgPDwga0RhdGFCcm93c2VyUHJvcGVydHlGbGFnc09mZnNldAora0RhdGFCcm93c2VyQ2hlY2tib3hUcmlTdGF0ZSA9IDEgPDwga0RhdGFCcm93c2VyUHJvcGVydHlGbGFnc09mZnNldAora0RhdGFCcm93c2VyRGF0ZVRpbWVSZWxhdGl2ZSA9IDEgPDwgKGtEYXRhQnJvd3NlclByb3BlcnR5RmxhZ3NPZmZzZXQpCitrRGF0YUJyb3dzZXJEYXRlVGltZURhdGVPbmx5ID0gMSA8PCAoa0RhdGFCcm93c2VyUHJvcGVydHlGbGFnc09mZnNldCArIDEpCitrRGF0YUJyb3dzZXJEYXRlVGltZVRpbWVPbmx5ID0gMSA8PCAoa0RhdGFCcm93c2VyUHJvcGVydHlGbGFnc09mZnNldCArIDIpCitrRGF0YUJyb3dzZXJEYXRlVGltZVNlY29uZHNUb28gPSAxIDw8IChrRGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzT2Zmc2V0ICsgMykKK2tEYXRhQnJvd3NlclNsaWRlclBsYWluVGh1bWIgPSBrVGhlbWVUaHVtYlBsYWluIDw8IGtEYXRhQnJvd3NlclByb3BlcnR5RmxhZ3NPZmZzZXQKK2tEYXRhQnJvd3NlclNsaWRlclVwd2FyZFRodW1iID0ga1RoZW1lVGh1bWJVcHdhcmQgPDwga0RhdGFCcm93c2VyUHJvcGVydHlGbGFnc09mZnNldAora0RhdGFCcm93c2VyU2xpZGVyRG93bndhcmRUaHVtYiA9IGtUaGVtZVRodW1iRG93bndhcmQgPDwga0RhdGFCcm93c2VyUHJvcGVydHlGbGFnc09mZnNldAora0RhdGFCcm93c2VyRG9Ob3RUcnVuY2F0ZVRleHQgPSAzIDw8IGtEYXRhQnJvd3NlclByb3BlcnR5RmxhZ3NPZmZzZXQKK2tEYXRhQnJvd3NlclRydW5jYXRlVGV4dEF0RW5kID0gMiA8PCBrRGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzT2Zmc2V0CitrRGF0YUJyb3dzZXJUcnVuY2F0ZVRleHRNaWRkbGUgPSAwIDw8IGtEYXRhQnJvd3NlclByb3BlcnR5RmxhZ3NPZmZzZXQKK2tEYXRhQnJvd3NlclRydW5jYXRlVGV4dEF0U3RhcnQgPSAxIDw8IGtEYXRhQnJvd3NlclByb3BlcnR5RmxhZ3NPZmZzZXQKK2tEYXRhQnJvd3NlclByb3BlcnR5TW9kaWZpY2F0aW9uRmxhZ3MgPSBrRGF0YUJyb3dzZXJQcm9wZXJ0eUZsYWdzTWFzawora0RhdGFCcm93c2VyUmVsYXRpdmVEYXRlVGltZSA9IGtEYXRhQnJvd3NlckRhdGVUaW1lUmVsYXRpdmUKK2tEYXRhQnJvd3NlclZpZXdTcGVjaWZpY0ZsYWdzT2Zmc2V0ID0gMTYKK2tEYXRhQnJvd3NlclZpZXdTcGVjaWZpY0ZsYWdzTWFzayA9IDB4RkYgPDwga0RhdGFCcm93c2VyVmlld1NwZWNpZmljRmxhZ3NPZmZzZXQKK2tEYXRhQnJvd3NlclZpZXdTcGVjaWZpY1Byb3BlcnR5RmxhZ3MgPSBrRGF0YUJyb3dzZXJWaWV3U3BlY2lmaWNGbGFnc01hc2sKK2tEYXRhQnJvd3NlckNsaWVudFByb3BlcnR5RmxhZ3NPZmZzZXQgPSAyNAorIyBrRGF0YUJyb3dzZXJDbGllbnRQcm9wZXJ0eUZsYWdzTWFzayA9ICh1bnNpZ25lZCBsb25nKSgweEZGIDw8IGtEYXRhQnJvd3NlckNsaWVudFByb3BlcnR5RmxhZ3NPZmZzZXQpCitrRGF0YUJyb3dzZXJMYXRlc3RDYWxsYmFja3MgPSAwCitrRGF0YUJyb3dzZXJDb250ZW50SGl0ID0gMQora0RhdGFCcm93c2VyTm90aGluZ0hpdCA9IDAKK2tEYXRhQnJvd3NlclN0b3BUcmFja2luZyA9IC0xCitrRGF0YUJyb3dzZXJMYXRlc3RDdXN0b21DYWxsYmFja3MgPSAwCitrRGF0YUJyb3dzZXJUYWJsZVZpZXdNaW5pbWFsSGlsaXRlID0gMAora0RhdGFCcm93c2VyVGFibGVWaWV3RmlsbEhpbGl0ZSA9IDEKK2tEYXRhQnJvd3NlclRhYmxlVmlld1NlbGVjdGlvbkNvbHVtbiA9IDEgPDwga0RhdGFCcm93c2VyVmlld1NwZWNpZmljRmxhZ3NPZmZzZXQKK2tEYXRhQnJvd3NlclRhYmxlVmlld0xhc3RDb2x1bW4gPSAtMQora0RhdGFCcm93c2VyTGlzdFZpZXdNb3ZhYmxlQ29sdW1uID0gMSA8PCAoa0RhdGFCcm93c2VyVmlld1NwZWNpZmljRmxhZ3NPZmZzZXQgKyAxKQora0RhdGFCcm93c2VyTGlzdFZpZXdTb3J0YWJsZUNvbHVtbiA9IDEgPDwgKGtEYXRhQnJvd3NlclZpZXdTcGVjaWZpY0ZsYWdzT2Zmc2V0ICsgMikKK2tEYXRhQnJvd3Nlckxpc3RWaWV3U2VsZWN0aW9uQ29sdW1uID0ga0RhdGFCcm93c2VyVGFibGVWaWV3U2VsZWN0aW9uQ29sdW1uCitrRGF0YUJyb3dzZXJMaXN0Vmlld0RlZmF1bHRDb2x1bW5GbGFncyA9IGtEYXRhQnJvd3Nlckxpc3RWaWV3TW92YWJsZUNvbHVtbiArIGtEYXRhQnJvd3Nlckxpc3RWaWV3U29ydGFibGVDb2x1bW4KK2tEYXRhQnJvd3Nlckxpc3RWaWV3TGF0ZXN0SGVhZGVyRGVzYyA9IDAKK2tEYXRhQnJvd3Nlckxpc3RWaWV3QXBwZW5kQ29sdW1uID0ga0RhdGFCcm93c2VyVGFibGVWaWV3TGFzdENvbHVtbgora0NvbnRyb2xFZGl0VW5pY29kZVRleHRQb3N0VXBkYXRlUHJvY1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCd1cHVwJykKK2tDb250cm9sRWRpdFVuaWNvZGVUZXh0UHJvYyA9IDkxMgora0NvbnRyb2xFZGl0VW5pY29kZVRleHRQYXNzd29yZFByb2MgPSA5MTQKK2tDb250cm9sS2luZEVkaXRVbmljb2RlVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdldXR4JykKK2tDb250cm9sQ2hlY2tib3hVbmNoZWNrZWRWYWx1ZSA9IGtDb250cm9sQ2hlY2tCb3hVbmNoZWNrZWRWYWx1ZQora0NvbnRyb2xDaGVja2JveENoZWNrZWRWYWx1ZSA9IGtDb250cm9sQ2hlY2tCb3hDaGVja2VkVmFsdWUKK2tDb250cm9sQ2hlY2tib3hNaXhlZFZhbHVlID0ga0NvbnRyb2xDaGVja0JveE1peGVkVmFsdWUKK2luTGFiZWwgPSBrQ29udHJvbExhYmVsUGFydAoraW5NZW51ID0ga0NvbnRyb2xNZW51UGFydAoraW5UcmlhbmdsZSA9IGtDb250cm9sVHJpYW5nbGVQYXJ0CitpbkJ1dHRvbiA9IGtDb250cm9sQnV0dG9uUGFydAoraW5DaGVja0JveCA9IGtDb250cm9sQ2hlY2tCb3hQYXJ0CitpblVwQnV0dG9uID0ga0NvbnRyb2xVcEJ1dHRvblBhcnQKK2luRG93bkJ1dHRvbiA9IGtDb250cm9sRG93bkJ1dHRvblBhcnQKK2luUGFnZVVwID0ga0NvbnRyb2xQYWdlVXBQYXJ0CitpblBhZ2VEb3duID0ga0NvbnRyb2xQYWdlRG93blBhcnQKK2tJbkxhYmVsQ29udHJvbFBhcnQgPSBrQ29udHJvbExhYmVsUGFydAora0luTWVudUNvbnRyb2xQYXJ0ID0ga0NvbnRyb2xNZW51UGFydAora0luVHJpYW5nbGVDb250cm9sUGFydCA9IGtDb250cm9sVHJpYW5nbGVQYXJ0CitrSW5CdXR0b25Db250cm9sUGFydCA9IGtDb250cm9sQnV0dG9uUGFydAora0luQ2hlY2tCb3hDb250cm9sUGFydCA9IGtDb250cm9sQ2hlY2tCb3hQYXJ0CitrSW5VcEJ1dHRvbkNvbnRyb2xQYXJ0ID0ga0NvbnRyb2xVcEJ1dHRvblBhcnQKK2tJbkRvd25CdXR0b25Db250cm9sUGFydCA9IGtDb250cm9sRG93bkJ1dHRvblBhcnQKK2tJblBhZ2VVcENvbnRyb2xQYXJ0ID0ga0NvbnRyb2xQYWdlVXBQYXJ0CitrSW5QYWdlRG93bkNvbnRyb2xQYXJ0ID0ga0NvbnRyb2xQYWdlRG93blBhcnQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvbnRyb2xzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvbnRyb2xzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmY0NzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29udHJvbHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvbnRyb2xzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvbnRyb2xzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmY0NzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29udHJvbHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvcmVGb3VuZGF0aW9uLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29yZUZvdW5kYXRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5Yzg5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvcmVGb3VuZGF0aW9uLnB5CkBAIC0wLDAgKzEsMjggQEAKKyMgR2VuZXJhdGVkIGZyb20gJ0NGQmFzZS5oJworCitkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4CitrQ0ZDb21wYXJlTGVzc1RoYW4gPSAtMQora0NGQ29tcGFyZUVxdWFsVG8gPSAwCitrQ0ZDb21wYXJlR3JlYXRlclRoYW4gPSAxCitrQ0ZOb3RGb3VuZCA9IC0xCitrQ0ZQcm9wZXJ0eUxpc3RJbW11dGFibGUgPSAwCitrQ0ZQcm9wZXJ0eUxpc3RNdXRhYmxlQ29udGFpbmVycyA9IDEKK2tDRlByb3BlcnR5TGlzdE11dGFibGVDb250YWluZXJzQW5kTGVhdmVzID0gMgorIyBrQ0ZTdHJpbmdFbmNvZGluZ0ludmFsaWRJZCA9IChsb25nKTB4RkZGRkZGRkYKK2tDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4gPSAwCitrQ0ZTdHJpbmdFbmNvZGluZ1dpbmRvd3NMYXRpbjEgPSAweDA1MDAKK2tDRlN0cmluZ0VuY29kaW5nSVNPTGF0aW4xID0gMHgwMjAxCitrQ0ZTdHJpbmdFbmNvZGluZ05leHRTdGVwTGF0aW4gPSAweDBCMDEKK2tDRlN0cmluZ0VuY29kaW5nQVNDSUkgPSAweDA2MDAKK2tDRlN0cmluZ0VuY29kaW5nVW5pY29kZSA9IDB4MDEwMAora0NGU3RyaW5nRW5jb2RpbmdVVEY4ID0gMHgwODAwMDEwMAora0NGU3RyaW5nRW5jb2RpbmdOb25Mb3NzeUFTQ0lJID0gMHgwQkZGCitrQ0ZDb21wYXJlQ2FzZUluc2Vuc2l0aXZlID0gMQora0NGQ29tcGFyZUJhY2t3YXJkcyA9IDQKK2tDRkNvbXBhcmVBbmNob3JlZCA9IDgKK2tDRkNvbXBhcmVOb25saXRlcmFsID0gMTYKK2tDRkNvbXBhcmVMb2NhbGl6ZWQgPSAzMgora0NGQ29tcGFyZU51bWVyaWNhbGx5ID0gNjQKK2tDRlVSTFBPU0lYUGF0aFN0eWxlID0gMAora0NGVVJMSEZTUGF0aFN0eWxlID0gMQora0NGVVJMV2luZG93c1BhdGhTdHlsZSA9IDIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvcmVGb3VuZGF0aW9uLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvcmVGb3VuZGF0aW9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGE3YjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29yZUZvdW5kYXRpb24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvcmVGb3VuZGF0aW9uLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvcmVGb3VuZGF0aW9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGE3YjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29yZUZvdW5kYXRpb24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvcmVHcmFwaGljcy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0NvcmVHcmFwaGljcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGNiMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29yZUdyYXBoaWNzLnB5CkBAIC0wLDAgKzEsMjggQEAKKyMgR2VuZXJhdGVkIGZyb20gJ0NHQ29udGV4dC5oJworCitkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4CitrQ0dMaW5lSm9pbk1pdGVyID0gMAora0NHTGluZUpvaW5Sb3VuZCA9IDEKK2tDR0xpbmVKb2luQmV2ZWwgPSAyCitrQ0dMaW5lQ2FwQnV0dCA9IDAKK2tDR0xpbmVDYXBSb3VuZCA9IDEKK2tDR0xpbmVDYXBTcXVhcmUgPSAyCitrQ0dQYXRoRmlsbCA9IDAKK2tDR1BhdGhFT0ZpbGwgPSAxCitrQ0dQYXRoU3Ryb2tlID0gMgora0NHUGF0aEZpbGxTdHJva2UgPSAzCitrQ0dQYXRoRU9GaWxsU3Ryb2tlID0gNAora0NHVGV4dEZpbGwgPSAwCitrQ0dUZXh0U3Ryb2tlID0gMQora0NHVGV4dEZpbGxTdHJva2UgPSAyCitrQ0dUZXh0SW52aXNpYmxlID0gMwora0NHVGV4dEZpbGxDbGlwID0gNAora0NHVGV4dFN0cm9rZUNsaXAgPSA1CitrQ0dUZXh0RmlsbFN0cm9rZUNsaXAgPSA2CitrQ0dUZXh0Q2xpcCA9IDcKK2tDR0VuY29kaW5nRm9udFNwZWNpZmljID0gMAora0NHRW5jb2RpbmdNYWNSb21hbiA9IDEKK2tDR0ludGVycG9sYXRpb25EZWZhdWx0ID0gMAora0NHSW50ZXJwb2xhdGlvbk5vbmUgPSAxCitrQ0dJbnRlcnBvbGF0aW9uTG93ID0gMgora0NHSW50ZXJwb2xhdGlvbkhpZ2ggPSAzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Db3JlR3JhcGhpY3MucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29yZUdyYXBoaWNzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTBkOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29yZUdyYXBoaWNzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Db3JlR3JhcGhpY3MucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29yZUdyYXBoaWNzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTBkOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vQ29yZUdyYXBoaWNzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DdGwucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DdGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkYzNlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0N0bC5weQpAQCAtMCwwICsxIEBACitmcm9tIF9DdGwgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0N0bC5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DdGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDViODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DdGwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0N0bC5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DdGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNDViODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9DdGwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RpYWxvZ3MucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9EaWFsb2dzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NDZkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9EaWFsb2dzLnB5CkBAIC0wLDAgKzEsNzkgQEAKKyMgR2VuZXJhdGVkIGZyb20gJ0RpYWxvZ3MuaCcKKworZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAora0NvbnRyb2xEaWFsb2dJdGVtID0gNAora0J1dHRvbkRpYWxvZ0l0ZW0gPSBrQ29udHJvbERpYWxvZ0l0ZW0gfCAwCitrQ2hlY2tCb3hEaWFsb2dJdGVtID0ga0NvbnRyb2xEaWFsb2dJdGVtIHwgMQora1JhZGlvQnV0dG9uRGlhbG9nSXRlbSA9IGtDb250cm9sRGlhbG9nSXRlbSB8IDIKK2tSZXNvdXJjZUNvbnRyb2xEaWFsb2dJdGVtID0ga0NvbnRyb2xEaWFsb2dJdGVtIHwgMwora1N0YXRpY1RleHREaWFsb2dJdGVtID0gOAora0VkaXRUZXh0RGlhbG9nSXRlbSA9IDE2CitrSWNvbkRpYWxvZ0l0ZW0gPSAzMgora1BpY3R1cmVEaWFsb2dJdGVtID0gNjQKK2tVc2VyRGlhbG9nSXRlbSA9IDAKK2tIZWxwRGlhbG9nSXRlbSA9IDEKK2tJdGVtRGlzYWJsZUJpdCA9IDEyOAorY3RybEl0ZW0gPSA0CitidG5DdHJsID0gMAorY2hrQ3RybCA9IDEKK3JhZEN0cmwgPSAyCityZXNDdHJsID0gMworc3RhdFRleHQgPSA4CitlZGl0VGV4dCA9IDE2CitpY29uSXRlbSA9IDMyCitwaWNJdGVtID0gNjQKK3VzZXJJdGVtID0gMAoraXRlbURpc2FibGUgPSAxMjgKK2tTdGRPa0l0ZW1JbmRleCA9IDEKK2tTdGRDYW5jZWxJdGVtSW5kZXggPSAyCitvayA9IGtTdGRPa0l0ZW1JbmRleAorY2FuY2VsID0ga1N0ZENhbmNlbEl0ZW1JbmRleAora1N0b3BJY29uID0gMAora05vdGVJY29uID0gMQora0NhdXRpb25JY29uID0gMgorc3RvcEljb24gPSBrU3RvcEljb24KK25vdGVJY29uID0ga05vdGVJY29uCitjYXV0aW9uSWNvbiA9IGtDYXV0aW9uSWNvbgora09rSXRlbUluZGV4ID0gMQora0NhbmNlbEl0ZW1JbmRleCA9IDIKK292ZXJsYXlESVRMID0gMAorYXBwZW5kRElUTFJpZ2h0ID0gMQorYXBwZW5kRElUTEJvdHRvbSA9IDIKK2tBbGVydFN0b3BBbGVydCA9IDAKK2tBbGVydE5vdGVBbGVydCA9IDEKK2tBbGVydENhdXRpb25BbGVydCA9IDIKK2tBbGVydFBsYWluQWxlcnQgPSAzCitrQWxlcnREZWZhdWx0T0tUZXh0ID0gLTEKK2tBbGVydERlZmF1bHRDYW5jZWxUZXh0ID0gLTEKK2tBbGVydERlZmF1bHRPdGhlclRleHQgPSAtMQora0FsZXJ0U3RkQWxlcnRPS0J1dHRvbiA9IDEKK2tBbGVydFN0ZEFsZXJ0Q2FuY2VsQnV0dG9uID0gMgora0FsZXJ0U3RkQWxlcnRPdGhlckJ1dHRvbiA9IDMKK2tBbGVydFN0ZEFsZXJ0SGVscEJ1dHRvbiA9IDQKK2tEaWFsb2dGbGFnc1VzZVRoZW1lQmFja2dyb3VuZCA9ICgxIDw8IDApCitrRGlhbG9nRmxhZ3NVc2VDb250cm9sSGllcmFyY2h5ID0gKDEgPDwgMSkKK2tEaWFsb2dGbGFnc0hhbmRsZU1vdmFibGVNb2RhbCA9ICgxIDw8IDIpCitrRGlhbG9nRmxhZ3NVc2VUaGVtZUNvbnRyb2xzID0gKDEgPDwgMykKK2tBbGVydEZsYWdzVXNlVGhlbWVCYWNrZ3JvdW5kID0gKDEgPDwgMCkKK2tBbGVydEZsYWdzVXNlQ29udHJvbEhpZXJhcmNoeSA9ICgxIDw8IDEpCitrQWxlcnRGbGFnc0FsZXJ0SXNNb3ZhYmxlID0gKDEgPDwgMikKK2tBbGVydEZsYWdzVXNlVGhlbWVDb250cm9scyA9ICgxIDw8IDMpCitrRGlhbG9nRm9udE5vRm9udFN0eWxlID0gMAora0RpYWxvZ0ZvbnRVc2VGb250TWFzayA9IDB4MDAwMQora0RpYWxvZ0ZvbnRVc2VGYWNlTWFzayA9IDB4MDAwMgora0RpYWxvZ0ZvbnRVc2VTaXplTWFzayA9IDB4MDAwNAora0RpYWxvZ0ZvbnRVc2VGb3JlQ29sb3JNYXNrID0gMHgwMDA4CitrRGlhbG9nRm9udFVzZUJhY2tDb2xvck1hc2sgPSAweDAwMTAKK2tEaWFsb2dGb250VXNlTW9kZU1hc2sgPSAweDAwMjAKK2tEaWFsb2dGb250VXNlSnVzdE1hc2sgPSAweDAwNDAKK2tEaWFsb2dGb250VXNlQWxsTWFzayA9IDB4MDBGRgora0RpYWxvZ0ZvbnRBZGRGb250U2l6ZU1hc2sgPSAweDAxMDAKK2tEaWFsb2dGb250VXNlRm9udE5hbWVNYXNrID0gMHgwMjAwCitrRGlhbG9nRm9udEFkZFRvTWV0YUZvbnRNYXNrID0gMHgwNDAwCitrRGlhbG9nRm9udFVzZVRoZW1lRm9udElETWFzayA9IDB4MDA4MAora0hJQ29tbWFuZE90aGVyID0gRk9VUl9DSEFSX0NPREUoJ290aHInKQora1N0ZENGU3RyaW5nQWxlcnRWZXJzaW9uT25lID0gMQora1N0ZEFsZXJ0RG9Ob3REaXNwb3NlU2hlZXQgPSAxIDw8IDAKK2tTdGRBbGVydERvTm90QW5pbWF0ZU9uRGVmYXVsdCA9IDEgPDwgMQora1N0ZEFsZXJ0RG9Ob3RBbmltYXRlT25DYW5jZWwgPSAxIDw8IDIKK2tTdGRBbGVydERvTm90QW5pbWF0ZU9uT3RoZXIgPSAxIDw8IDMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RpYWxvZ3MucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRGlhbG9ncy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzYWUwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RpYWxvZ3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RpYWxvZ3MucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRGlhbG9ncy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzYWUwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RpYWxvZ3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RsZy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RsZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjIyZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRGxnLnB5CkBAIC0wLDAgKzEgQEAKK2Zyb20gX0RsZyBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRGxnLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RsZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5OWIxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RsZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRGxnLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RsZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU5OWIxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RsZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRHJhZy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RyYWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzNDlkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0RyYWcucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfRHJhZyBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRHJhZy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9EcmFnLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmFiZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRHJhZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRHJhZy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9EcmFnLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmFiZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRHJhZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRHJhZ2NvbnN0LnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRHJhZ2NvbnN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZTEyYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9EcmFnY29uc3QucHkKQEAgLTAsMCArMSw4NiBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnRHJhZy5oJworCitkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4Citmcm9tIENhcmJvbi5UZXh0RWRpdCBpbXBvcnQgKgorZnJvbSBDYXJib24uUXVpY2tEcmF3IGltcG9ydCAqCitma0RyYWdBY3Rpb25BbGwgPSAtMQorCisKK2tEcmFnSGFzTGVmdFNlbmRlcldpbmRvdyAgICAgICAgPSAoMSA8PCAwKQora0RyYWdJbnNpZGVTZW5kZXJBcHBsaWNhdGlvbiA9ICgxIDw8IDEpCitrRHJhZ0luc2lkZVNlbmRlcldpbmRvdyAgICAgICAgID0gKDEgPDwgMikKK2tEcmFnUmVnaW9uQW5kSW1hZ2UgICAgICAgICAgICAgICAgICAgICA9ICgxIDw8IDQpCitmbGF2b3JTZW5kZXJPbmx5ICAgICAgICAgICAgICAgICAgICAgICAgPSAoMSA8PCAwKQorZmxhdm9yU2VuZGVyVHJhbnNsYXRlZCAgICAgICAgICA9ICgxIDw8IDEpCitmbGF2b3JOb3RTYXZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoMSA8PCAyKQorZmxhdm9yU3lzdGVtVHJhbnNsYXRlZCAgICAgICAgICA9ICgxIDw8IDgpCitrRHJhZ0hhc0xlZnRTZW5kZXJXaW5kb3cgPSAoMUwgPDwgMCkKK2tEcmFnSW5zaWRlU2VuZGVyQXBwbGljYXRpb24gPSAoMUwgPDwgMSkKK2tEcmFnSW5zaWRlU2VuZGVyV2luZG93ID0gKDFMIDw8IDIpCitrRHJhZ0JlaGF2aW9yTm9uZSA9IDAKK2tEcmFnQmVoYXZpb3Jab29tQmFja0FuaW1hdGlvbiA9ICgxTCA8PCAwKQora0RyYWdSZWdpb25BbmRJbWFnZSA9ICgxTCA8PCA0KQora0RyYWdTdGFuZGFyZFRyYW5zbHVjZW5jeSA9IDBMCitrRHJhZ0RhcmtUcmFuc2x1Y2VuY3kgPSAxTAora0RyYWdEYXJrZXJUcmFuc2x1Y2VuY3kgPSAyTAora0RyYWdPcGFxdWVUcmFuc2x1Y2VuY3kgPSAzTAora0RyYWdSZWdpb25CZWdpbiA9IDEKK2tEcmFnUmVnaW9uRHJhdyA9IDIKK2tEcmFnUmVnaW9uSGlkZSA9IDMKK2tEcmFnUmVnaW9uSWRsZSA9IDQKK2tEcmFnUmVnaW9uRW5kID0gNQora1pvb21Ob0FjY2VsZXJhdGlvbiA9IDAKK2tab29tQWNjZWxlcmF0ZSA9IDEKK2tab29tRGVjZWxlcmF0ZSA9IDIKK2ZsYXZvclNlbmRlck9ubHkgPSAoMSA8PCAwKQorZmxhdm9yU2VuZGVyVHJhbnNsYXRlZCA9ICgxIDw8IDEpCitmbGF2b3JOb3RTYXZlZCA9ICgxIDw8IDIpCitmbGF2b3JTeXN0ZW1UcmFuc2xhdGVkID0gKDEgPDwgOCkKK2ZsYXZvckRhdGFQcm9taXNlZCA9ICgxIDw8IDkpCitrRHJhZ0ZsYXZvclR5cGVIRlMgPSBGT1VSX0NIQVJfQ09ERSgnaGZzICcpCitrRHJhZ0ZsYXZvclR5cGVQcm9taXNlSEZTID0gRk9VUl9DSEFSX0NPREUoJ3BoZnMnKQorZmxhdm9yVHlwZUhGUyA9IGtEcmFnRmxhdm9yVHlwZUhGUworZmxhdm9yVHlwZVByb21pc2VIRlMgPSBrRHJhZ0ZsYXZvclR5cGVQcm9taXNlSEZTCitrRHJhZ1Byb21pc2VkRmxhdm9yRmluZEZpbGUgPSBGT1VSX0NIQVJfQ09ERSgncldtMScpCitrRHJhZ1Byb21pc2VkRmxhdm9yID0gRk9VUl9DSEFSX0NPREUoJ2Zzc1AnKQora0RyYWdQc2V1ZG9DcmVhdG9yVm9sdW1lT3JEaXJlY3RvcnkgPSBGT1VSX0NIQVJfQ09ERSgnTUFDUycpCitrRHJhZ1BzZXVkb0ZpbGVUeXBlVm9sdW1lID0gRk9VUl9DSEFSX0NPREUoJ2Rpc2snKQora0RyYWdQc2V1ZG9GaWxlVHlwZURpcmVjdG9yeSA9IEZPVVJfQ0hBUl9DT0RFKCdmb2xkJykKK2ZsYXZvclR5cGVEaXJlY3RvcnkgPSBGT1VSX0NIQVJfQ09ERSgnZGlyeScpCitrRmxhdm9yVHlwZUNsaXBwaW5nTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCdjbG5tJykKK2tGbGF2b3JUeXBlQ2xpcHBpbmdGaWxlbmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCdjbGZuJykKK2tGbGF2b3JUeXBlRHJhZ1RvVHJhc2hPbmx5ID0gRk9VUl9DSEFSX0NPREUoJ2ZkdHQnKQora0ZsYXZvclR5cGVGaW5kZXJOb1RyYWNraW5nQmVoYXZpb3IgPSBGT1VSX0NIQVJfQ09ERSgnZm50YicpCitrRHJhZ1RyYWNraW5nRW50ZXJIYW5kbGVyID0gMQora0RyYWdUcmFja2luZ0VudGVyV2luZG93ID0gMgora0RyYWdUcmFja2luZ0luV2luZG93ID0gMwora0RyYWdUcmFja2luZ0xlYXZlV2luZG93ID0gNAora0RyYWdUcmFja2luZ0xlYXZlSGFuZGxlciA9IDUKK2tEcmFnQWN0aW9uTm90aGluZyA9IDBMCitrRHJhZ0FjdGlvbkNvcHkgPSAxTAora0RyYWdBY3Rpb25BbGlhcyA9ICgxTCA8PCAxKQora0RyYWdBY3Rpb25HZW5lcmljID0gKDFMIDw8IDIpCitrRHJhZ0FjdGlvblByaXZhdGUgPSAoMUwgPDwgMykKK2tEcmFnQWN0aW9uTW92ZSA9ICgxTCA8PCA0KQora0RyYWdBY3Rpb25EZWxldGUgPSAoMUwgPDwgNSkKKyMga0RyYWdBY3Rpb25BbGwgPSAobG9uZykweEZGRkZGRkZGCitkcmFnSGFzTGVmdFNlbmRlcldpbmRvdyA9IGtEcmFnSGFzTGVmdFNlbmRlcldpbmRvdworZHJhZ0luc2lkZVNlbmRlckFwcGxpY2F0aW9uID0ga0RyYWdJbnNpZGVTZW5kZXJBcHBsaWNhdGlvbgorZHJhZ0luc2lkZVNlbmRlcldpbmRvdyA9IGtEcmFnSW5zaWRlU2VuZGVyV2luZG93CitkcmFnVHJhY2tpbmdFbnRlckhhbmRsZXIgPSBrRHJhZ1RyYWNraW5nRW50ZXJIYW5kbGVyCitkcmFnVHJhY2tpbmdFbnRlcldpbmRvdyA9IGtEcmFnVHJhY2tpbmdFbnRlcldpbmRvdworZHJhZ1RyYWNraW5nSW5XaW5kb3cgPSBrRHJhZ1RyYWNraW5nSW5XaW5kb3cKK2RyYWdUcmFja2luZ0xlYXZlV2luZG93ID0ga0RyYWdUcmFja2luZ0xlYXZlV2luZG93CitkcmFnVHJhY2tpbmdMZWF2ZUhhbmRsZXIgPSBrRHJhZ1RyYWNraW5nTGVhdmVIYW5kbGVyCitkcmFnUmVnaW9uQmVnaW4gPSBrRHJhZ1JlZ2lvbkJlZ2luCitkcmFnUmVnaW9uRHJhdyA9IGtEcmFnUmVnaW9uRHJhdworZHJhZ1JlZ2lvbkhpZGUgPSBrRHJhZ1JlZ2lvbkhpZGUKK2RyYWdSZWdpb25JZGxlID0ga0RyYWdSZWdpb25JZGxlCitkcmFnUmVnaW9uRW5kID0ga0RyYWdSZWdpb25FbmQKK3pvb21Ob0FjY2VsZXJhdGlvbiA9IGtab29tTm9BY2NlbGVyYXRpb24KK3pvb21BY2NlbGVyYXRlID0ga1pvb21BY2NlbGVyYXRlCit6b29tRGVjZWxlcmF0ZSA9IGtab29tRGVjZWxlcmF0ZQora0RyYWdTdGFuZGFyZEltYWdlID0ga0RyYWdTdGFuZGFyZFRyYW5zbHVjZW5jeQora0RyYWdEYXJrSW1hZ2UgPSBrRHJhZ0RhcmtUcmFuc2x1Y2VuY3kKK2tEcmFnRGFya2VySW1hZ2UgPSBrRHJhZ0RhcmtlclRyYW5zbHVjZW5jeQora0RyYWdPcGFxdWVJbWFnZSA9IGtEcmFnT3BhcXVlVHJhbnNsdWNlbmN5CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9EcmFnY29uc3QucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRHJhZ2NvbnN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2U5MDA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRHJhZ2NvbnN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9EcmFnY29uc3QucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRHJhZ2NvbnN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2U5MDA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRHJhZ2NvbnN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9FdmVudHMucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9FdmVudHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY5ZjRmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0V2ZW50cy5weQpAQCAtMCwwICsxLDEwMiBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnRXZlbnRzLmgnCisKK251bGxFdmVudCA9IDAKK21vdXNlRG93biA9IDEKK21vdXNlVXAgPSAyCitrZXlEb3duID0gMwora2V5VXAgPSA0CithdXRvS2V5ID0gNQordXBkYXRlRXZ0ID0gNgorZGlza0V2dCA9IDcKK2FjdGl2YXRlRXZ0ID0gOAorb3NFdnQgPSAxNQora0hpZ2hMZXZlbEV2ZW50ID0gMjMKK21Eb3duTWFzayA9IDEgPDwgbW91c2VEb3duCittVXBNYXNrID0gMSA8PCBtb3VzZVVwCitrZXlEb3duTWFzayA9IDEgPDwga2V5RG93bgora2V5VXBNYXNrID0gMSA8PCBrZXlVcAorYXV0b0tleU1hc2sgPSAxIDw8IGF1dG9LZXkKK3VwZGF0ZU1hc2sgPSAxIDw8IHVwZGF0ZUV2dAorZGlza01hc2sgPSAxIDw8IGRpc2tFdnQKK2FjdGl2TWFzayA9IDEgPDwgYWN0aXZhdGVFdnQKK2hpZ2hMZXZlbEV2ZW50TWFzayA9IDB4MDQwMAorb3NNYXNrID0gMSA8PCBvc0V2dAorZXZlcnlFdmVudCA9IDB4RkZGRgorY2hhckNvZGVNYXNrID0gMHgwMDAwMDBGRgora2V5Q29kZU1hc2sgPSAweDAwMDBGRjAwCithZGJBZGRyTWFzayA9IDB4MDBGRjAwMDAKKyMgb3NFdnRNZXNzYWdlTWFzayA9ICh1bnNpZ25lZCBsb25nKTB4RkYwMDAwMDAKK21vdXNlTW92ZWRNZXNzYWdlID0gMHgwMEZBCitzdXNwZW5kUmVzdW1lTWVzc2FnZSA9IDB4MDAwMQorcmVzdW1lRmxhZyA9IDEKK2NvbnZlcnRDbGlwYm9hcmRGbGFnID0gMgorYWN0aXZlRmxhZ0JpdCA9IDAKK2J0blN0YXRlQml0ID0gNworY21kS2V5Qml0ID0gOAorc2hpZnRLZXlCaXQgPSA5CithbHBoYUxvY2tCaXQgPSAxMAorb3B0aW9uS2V5Qml0ID0gMTEKK2NvbnRyb2xLZXlCaXQgPSAxMgorcmlnaHRTaGlmdEtleUJpdCA9IDEzCityaWdodE9wdGlvbktleUJpdCA9IDE0CityaWdodENvbnRyb2xLZXlCaXQgPSAxNQorYWN0aXZlRmxhZyA9IDEgPDwgYWN0aXZlRmxhZ0JpdAorYnRuU3RhdGUgPSAxIDw8IGJ0blN0YXRlQml0CitjbWRLZXkgPSAxIDw8IGNtZEtleUJpdAorc2hpZnRLZXkgPSAxIDw8IHNoaWZ0S2V5Qml0CithbHBoYUxvY2sgPSAxIDw8IGFscGhhTG9ja0JpdAorb3B0aW9uS2V5ID0gMSA8PCBvcHRpb25LZXlCaXQKK2NvbnRyb2xLZXkgPSAxIDw8IGNvbnRyb2xLZXlCaXQKK3JpZ2h0U2hpZnRLZXkgPSAxIDw8IHJpZ2h0U2hpZnRLZXlCaXQKK3JpZ2h0T3B0aW9uS2V5ID0gMSA8PCByaWdodE9wdGlvbktleUJpdAorcmlnaHRDb250cm9sS2V5ID0gMSA8PCByaWdodENvbnRyb2xLZXlCaXQKK2tOdWxsQ2hhckNvZGUgPSAwCitrSG9tZUNoYXJDb2RlID0gMQora0VudGVyQ2hhckNvZGUgPSAzCitrRW5kQ2hhckNvZGUgPSA0CitrSGVscENoYXJDb2RlID0gNQora0JlbGxDaGFyQ29kZSA9IDcKK2tCYWNrc3BhY2VDaGFyQ29kZSA9IDgKK2tUYWJDaGFyQ29kZSA9IDkKK2tMaW5lRmVlZENoYXJDb2RlID0gMTAKK2tWZXJ0aWNhbFRhYkNoYXJDb2RlID0gMTEKK2tQYWdlVXBDaGFyQ29kZSA9IDExCitrRm9ybUZlZWRDaGFyQ29kZSA9IDEyCitrUGFnZURvd25DaGFyQ29kZSA9IDEyCitrUmV0dXJuQ2hhckNvZGUgPSAxMwora0Z1bmN0aW9uS2V5Q2hhckNvZGUgPSAxNgora0NvbW1hbmRDaGFyQ29kZSA9IDE3CitrQ2hlY2tDaGFyQ29kZSA9IDE4CitrRGlhbW9uZENoYXJDb2RlID0gMTkKK2tBcHBsZUxvZ29DaGFyQ29kZSA9IDIwCitrRXNjYXBlQ2hhckNvZGUgPSAyNwora0NsZWFyQ2hhckNvZGUgPSAyNwora0xlZnRBcnJvd0NoYXJDb2RlID0gMjgKK2tSaWdodEFycm93Q2hhckNvZGUgPSAyOQora1VwQXJyb3dDaGFyQ29kZSA9IDMwCitrRG93bkFycm93Q2hhckNvZGUgPSAzMQora1NwYWNlQ2hhckNvZGUgPSAzMgora0RlbGV0ZUNoYXJDb2RlID0gMTI3CitrQnVsbGV0Q2hhckNvZGUgPSAxNjUKK2tOb25CcmVha2luZ1NwYWNlQ2hhckNvZGUgPSAyMDIKK2tTaGlmdFVuaWNvZGUgPSAweDIxRTcKK2tDb250cm9sVW5pY29kZSA9IDB4MjMwMwora09wdGlvblVuaWNvZGUgPSAweDIzMjUKK2tDb21tYW5kVW5pY29kZSA9IDB4MjMxOAora1BlbmNpbFVuaWNvZGUgPSAweDI3MEUKK2tDaGVja1VuaWNvZGUgPSAweDI3MTMKK2tEaWFtb25kVW5pY29kZSA9IDB4MjVDNgora0J1bGxldFVuaWNvZGUgPSAweDIwMjIKK2tBcHBsZUxvZ29Vbmljb2RlID0gMHhGOEZGCituZXR3b3JrRXZ0ID0gMTAKK2RyaXZlckV2dCA9IDExCithcHAxRXZ0ID0gMTIKK2FwcDJFdnQgPSAxMworYXBwM0V2dCA9IDE0CithcHA0RXZ0ID0gMTUKK25ldHdvcmtNYXNrID0gMHgwNDAwCitkcml2ZXJNYXNrID0gMHgwODAwCithcHAxTWFzayA9IDB4MTAwMAorYXBwMk1hc2sgPSAweDIwMDAKK2FwcDNNYXNrID0gMHg0MDAwCithcHA0TWFzayA9IDB4ODAwMApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRXZlbnRzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0V2ZW50cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0MmIxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0V2ZW50cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRXZlbnRzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0V2ZW50cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0MmIxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0V2ZW50cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRXZ0LnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRXZ0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNWZmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9FdnQucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfRXZ0IGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9FdnQucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRXZ0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU2ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRXZ0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9FdnQucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRXZ0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWU2ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRXZ0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9GaWxlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGMyODU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRmlsZS5weQpAQCAtMCwwICsxIEBACitmcm9tIF9GaWxlIGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9GaWxlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjRiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9GaWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9GaWxlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjRiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9GaWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9GaWxlcy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZpbGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OGJiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9GaWxlcy5weQpAQCAtMCwwICsxLDQyNiBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnRmlsZXMuaCcKKworZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAordHJ1ZSA9IFRydWUKK2ZhbHNlID0gRmFsc2UKK2ZzQ3VyUGVybSA9IDB4MDAKK2ZzUmRQZXJtID0gMHgwMQorZnNXclBlcm0gPSAweDAyCitmc1JkV3JQZXJtID0gMHgwMworZnNSZFdyU2hQZXJtID0gMHgwNAorZnNSZERlbnlQZXJtID0gMHgxMAorZnNXckRlbnlQZXJtID0gMHgyMAorZnNSdFBhcklEID0gMQorZnNSdERpcklEID0gMgorZnNBdE1hcmsgPSAwCitmc0Zyb21TdGFydCA9IDEKK2ZzRnJvbUxFT0YgPSAyCitmc0Zyb21NYXJrID0gMworcGxlYXNlQ2FjaGVCaXQgPSA0CitwbGVhc2VDYWNoZU1hc2sgPSAweDAwMTAKK25vQ2FjaGVCaXQgPSA1Citub0NhY2hlTWFzayA9IDB4MDAyMAorcmRWZXJpZnlCaXQgPSA2CityZFZlcmlmeU1hc2sgPSAweDAwNDAKK3JkVmVyaWZ5ID0gNjQKK2ZvcmNlUmVhZEJpdCA9IDYKK2ZvcmNlUmVhZE1hc2sgPSAweDAwNDAKK25ld0xpbmVCaXQgPSA3CituZXdMaW5lTWFzayA9IDB4MDA4MAorbmV3TGluZUNoYXJNYXNrID0gMHhGRjAwCitmc1NCUGFydGlhbE5hbWUgPSAxCitmc1NCRnVsbE5hbWUgPSAyCitmc1NCRmxBdHRyaWIgPSA0Citmc1NCRmxGbmRySW5mbyA9IDgKK2ZzU0JGbExnTGVuID0gMzIKK2ZzU0JGbFB5TGVuID0gNjQKK2ZzU0JGbFJMZ0xlbiA9IDEyOAorZnNTQkZsUlB5TGVuID0gMjU2Citmc1NCRmxDckRhdCA9IDUxMgorZnNTQkZsTWREYXQgPSAxMDI0Citmc1NCRmxCa0RhdCA9IDIwNDgKK2ZzU0JGbFhGbmRySW5mbyA9IDQwOTYKK2ZzU0JGbFBhcklEID0gODE5MgorZnNTQk5lZ2F0ZSA9IDE2Mzg0Citmc1NCRHJVc3JXZHMgPSA4Citmc1NCRHJObUZscyA9IDE2Citmc1NCRHJDckRhdCA9IDUxMgorZnNTQkRyTWREYXQgPSAxMDI0Citmc1NCRHJCa0RhdCA9IDIwNDgKK2ZzU0JEckZuZHJJbmZvID0gNDA5NgorZnNTQkRyUGFySUQgPSA4MTkyCitmc1NCUGFydGlhbE5hbWVCaXQgPSAwCitmc1NCRnVsbE5hbWVCaXQgPSAxCitmc1NCRmxBdHRyaWJCaXQgPSAyCitmc1NCRmxGbmRySW5mb0JpdCA9IDMKK2ZzU0JGbExnTGVuQml0ID0gNQorZnNTQkZsUHlMZW5CaXQgPSA2Citmc1NCRmxSTGdMZW5CaXQgPSA3Citmc1NCRmxSUHlMZW5CaXQgPSA4Citmc1NCRmxDckRhdEJpdCA9IDkKK2ZzU0JGbE1kRGF0Qml0ID0gMTAKK2ZzU0JGbEJrRGF0Qml0ID0gMTEKK2ZzU0JGbFhGbmRySW5mb0JpdCA9IDEyCitmc1NCRmxQYXJJREJpdCA9IDEzCitmc1NCTmVnYXRlQml0ID0gMTQKK2ZzU0JEclVzcldkc0JpdCA9IDMKK2ZzU0JEck5tRmxzQml0ID0gNAorZnNTQkRyQ3JEYXRCaXQgPSA5Citmc1NCRHJNZERhdEJpdCA9IDEwCitmc1NCRHJCa0RhdEJpdCA9IDExCitmc1NCRHJGbmRySW5mb0JpdCA9IDEyCitmc1NCRHJQYXJJREJpdCA9IDEzCitiTGltaXRGQ0JzID0gMzEKK2JMb2NhbFdMaXN0ID0gMzAKK2JOb01pbmlGbmRyID0gMjkKK2JOb1ZORWRpdCA9IDI4CitiTm9MY2xTeW5jID0gMjcKK2JUcnNoT2ZmTGluZSA9IDI2CitiTm9Td2l0Y2hUbyA9IDI1CitiRG9udFNoYXJlSXQgPSAyMQorYk5vRGVza0l0ZW1zID0gMjAKK2JOb0Jvb3RCbGtzID0gMTkKK2JBY2Nlc3NDbnRsID0gMTgKK2JOb1N5c0RpciA9IDE3CitiSGFzRXh0RlNWb2wgPSAxNgorYkhhc09wZW5EZW55ID0gMTUKK2JIYXNDb3B5RmlsZSA9IDE0CitiSGFzTW92ZVJlbmFtZSA9IDEzCitiSGFzRGVza3RvcE1nciA9IDEyCitiSGFzU2hvcnROYW1lID0gMTEKK2JIYXNGb2xkZXJMb2NrID0gMTAKK2JIYXNQZXJzb25hbEFjY2Vzc1ByaXZpbGVnZXMgPSA5CitiSGFzVXNlckdyb3VwTGlzdCA9IDgKK2JIYXNDYXRTZWFyY2ggPSA3CitiSGFzRmlsZUlEcyA9IDYKK2JIYXNCVHJlZU1nciA9IDUKK2JIYXNCbGFua0FjY2Vzc1ByaXZpbGVnZXMgPSA0CitiU3VwcG9ydHNBc3luY1JlcXVlc3RzID0gMworYlN1cHBvcnRzVHJhc2hWb2x1bWVDYWNoZSA9IDIKK2JJc0VqZWN0YWJsZSA9IDAKK2JTdXBwb3J0c0hGU1BsdXNBUElzID0gMQorYlN1cHBvcnRzRlNDYXRhbG9nU2VhcmNoID0gMgorYlN1cHBvcnRzRlNFeGNoYW5nZU9iamVjdHMgPSAzCitiU3VwcG9ydHMyVEJGaWxlcyA9IDQKK2JTdXBwb3J0c0xvbmdOYW1lcyA9IDUKK2JTdXBwb3J0c011bHRpU2NyaXB0TmFtZXMgPSA2CitiU3VwcG9ydHNOYW1lZEZvcmtzID0gNworYlN1cHBvcnRzU3VidHJlZUl0ZXJhdG9ycyA9IDgKK2JMMlBDYW5NYXBGaWxlQmxvY2tzID0gOQorYlBhcmVudE1vZERhdGVDaGFuZ2VzID0gMTAKK2JBbmNlc3Rvck1vZERhdGVDaGFuZ2VzID0gMTEKK2JTdXBwb3J0c1N5bWJvbGljTGlua3MgPSAxMworYklzQXV0b01vdW50ZWQgPSAxNAorYkFsbG93Q0RpRGF0YUhhbmRsZXIgPSAxNwora0xhcmdlSWNvbiA9IDEKK2tMYXJnZTRCaXRJY29uID0gMgora0xhcmdlOEJpdEljb24gPSAzCitrU21hbGxJY29uID0gNAora1NtYWxsNEJpdEljb24gPSA1CitrU21hbGw4Qml0SWNvbiA9IDYKK2tpY25zSWNvbkZhbWlseSA9IDIzOQora0xhcmdlSWNvblNpemUgPSAyNTYKK2tMYXJnZTRCaXRJY29uU2l6ZSA9IDUxMgora0xhcmdlOEJpdEljb25TaXplID0gMTAyNAora1NtYWxsSWNvblNpemUgPSA2NAora1NtYWxsNEJpdEljb25TaXplID0gMTI4CitrU21hbGw4Qml0SWNvblNpemUgPSAyNTYKK2tXaWRlUG9zT2Zmc2V0Qml0ID0gOAora1VzZVdpZGVQb3NpdGlvbmluZyA9ICgxIDw8IGtXaWRlUG9zT2Zmc2V0Qml0KQora01heGltdW1CbG9ja3NJbjRHQiA9IDB4MDA3RkZGRkYKK2ZzVW5peFByaXYgPSAxCitrTm9Vc2VyQXV0aGVudGljYXRpb24gPSAxCitrUGFzc3dvcmQgPSAyCitrRW5jcnlwdFBhc3N3b3JkID0gMwora1R3b1dheUVuY3J5cHRQYXNzd29yZCA9IDYKK2tPd25lcklEMk5hbWUgPSAxCitrR3JvdXBJRDJOYW1lID0gMgora093bmVyTmFtZTJJRCA9IDMKK2tHcm91cE5hbWUySUQgPSA0CitrUmV0dXJuTmV4dFVzZXIgPSAxCitrUmV0dXJuTmV4dEdyb3VwID0gMgora1JldHVybk5leHRVRyA9IDMKK2tWQ0JGbGFnc0lkbGVGbHVzaEJpdCA9IDMKK2tWQ0JGbGFnc0lkbGVGbHVzaE1hc2sgPSAweDAwMDgKK2tWQ0JGbGFnc0hGU1BsdXNBUElzQml0ID0gNAora1ZDQkZsYWdzSEZTUGx1c0FQSXNNYXNrID0gMHgwMDEwCitrVkNCRmxhZ3NIYXJkd2FyZUdvbmVCaXQgPSA1CitrVkNCRmxhZ3NIYXJkd2FyZUdvbmVNYXNrID0gMHgwMDIwCitrVkNCRmxhZ3NWb2x1bWVEaXJ0eUJpdCA9IDE1CitrVkNCRmxhZ3NWb2x1bWVEaXJ0eU1hc2sgPSAweDgwMDAKK2tpb1ZBdHJiRGVmYXVsdFZvbHVtZUJpdCA9IDUKK2tpb1ZBdHJiRGVmYXVsdFZvbHVtZU1hc2sgPSAweDAwMjAKK2tpb1ZBdHJiRmlsZXNPcGVuQml0ID0gNgora2lvVkF0cmJGaWxlc09wZW5NYXNrID0gMHgwMDQwCitraW9WQXRyYkhhcmR3YXJlTG9ja2VkQml0ID0gNwora2lvVkF0cmJIYXJkd2FyZUxvY2tlZE1hc2sgPSAweDAwODAKK2tpb1ZBdHJiU29mdHdhcmVMb2NrZWRCaXQgPSAxNQora2lvVkF0cmJTb2Z0d2FyZUxvY2tlZE1hc2sgPSAweDgwMDAKK2tpb0ZsQXR0cmliTG9ja2VkQml0ID0gMAora2lvRmxBdHRyaWJMb2NrZWRNYXNrID0gMHgwMQora2lvRmxBdHRyaWJSZXNPcGVuQml0ID0gMgora2lvRmxBdHRyaWJSZXNPcGVuTWFzayA9IDB4MDQKK2tpb0ZsQXR0cmliRGF0YU9wZW5CaXQgPSAzCitraW9GbEF0dHJpYkRhdGFPcGVuTWFzayA9IDB4MDgKK2tpb0ZsQXR0cmliRGlyQml0ID0gNAora2lvRmxBdHRyaWJEaXJNYXNrID0gMHgxMAoraW9EaXJGbGcgPSA0Citpb0Rpck1hc2sgPSAweDEwCitraW9GbEF0dHJpYkNvcHlQcm90Qml0ID0gNgora2lvRmxBdHRyaWJDb3B5UHJvdE1hc2sgPSAweDQwCitraW9GbEF0dHJpYkZpbGVPcGVuQml0ID0gNwora2lvRmxBdHRyaWJGaWxlT3Blbk1hc2sgPSAweDgwCitraW9GbEF0dHJpYkluU2hhcmVkQml0ID0gMgora2lvRmxBdHRyaWJJblNoYXJlZE1hc2sgPSAweDA0CitraW9GbEF0dHJpYk1vdW50ZWRCaXQgPSAzCitraW9GbEF0dHJpYk1vdW50ZWRNYXNrID0gMHgwOAora2lvRmxBdHRyaWJTaGFyZVBvaW50Qml0ID0gNQora2lvRmxBdHRyaWJTaGFyZVBvaW50TWFzayA9IDB4MjAKK2tpb0ZDQldyaXRlQml0ID0gOAora2lvRkNCV3JpdGVNYXNrID0gMHgwMTAwCitraW9GQ0JSZXNvdXJjZUJpdCA9IDkKK2tpb0ZDQlJlc291cmNlTWFzayA9IDB4MDIwMAora2lvRkNCV3JpdGVMb2NrZWRCaXQgPSAxMAora2lvRkNCV3JpdGVMb2NrZWRNYXNrID0gMHgwNDAwCitraW9GQ0JMYXJnZUZpbGVCaXQgPSAxMQora2lvRkNCTGFyZ2VGaWxlTWFzayA9IDB4MDgwMAora2lvRkNCU2hhcmVkV3JpdGVCaXQgPSAxMgora2lvRkNCU2hhcmVkV3JpdGVNYXNrID0gMHgxMDAwCitraW9GQ0JGaWxlTG9ja2VkQml0ID0gMTMKK2tpb0ZDQkZpbGVMb2NrZWRNYXNrID0gMHgyMDAwCitraW9GQ0JPd25DbHVtcEJpdCA9IDE0CitraW9GQ0JPd25DbHVtcE1hc2sgPSAweDQwMDAKK2tpb0ZDQk1vZGlmaWVkQml0ID0gMTUKK2tpb0ZDQk1vZGlmaWVkTWFzayA9IDB4ODAwMAora2lvQUNVc2VyTm9TZWVGb2xkZXJCaXQgPSAwCitraW9BQ1VzZXJOb1NlZUZvbGRlck1hc2sgPSAweDAxCitraW9BQ1VzZXJOb1NlZUZpbGVzQml0ID0gMQora2lvQUNVc2VyTm9TZWVGaWxlc01hc2sgPSAweDAyCitraW9BQ1VzZXJOb01ha2VDaGFuZ2VzQml0ID0gMgora2lvQUNVc2VyTm9NYWtlQ2hhbmdlc01hc2sgPSAweDA0CitraW9BQ1VzZXJOb3RPd25lckJpdCA9IDcKK2tpb0FDVXNlck5vdE93bmVyTWFzayA9IDB4ODAKK2tpb0FDQWNjZXNzT3duZXJCaXQgPSAzMQorIyBraW9BQ0FjY2Vzc093bmVyTWFzayA9IChsb25nKTB4ODAwMDAwMDAKK2tpb0FDQWNjZXNzQmxhbmtBY2Nlc3NCaXQgPSAyOAora2lvQUNBY2Nlc3NCbGFua0FjY2Vzc01hc2sgPSAweDEwMDAwMDAwCitraW9BQ0FjY2Vzc1VzZXJXcml0ZUJpdCA9IDI2CitraW9BQ0FjY2Vzc1VzZXJXcml0ZU1hc2sgPSAweDA0MDAwMDAwCitraW9BQ0FjY2Vzc1VzZXJSZWFkQml0ID0gMjUKK2tpb0FDQWNjZXNzVXNlclJlYWRNYXNrID0gMHgwMjAwMDAwMAora2lvQUNBY2Nlc3NVc2VyU2VhcmNoQml0ID0gMjQKK2tpb0FDQWNjZXNzVXNlclNlYXJjaE1hc2sgPSAweDAxMDAwMDAwCitraW9BQ0FjY2Vzc0V2ZXJ5b25lV3JpdGVCaXQgPSAxOAora2lvQUNBY2Nlc3NFdmVyeW9uZVdyaXRlTWFzayA9IDB4MDAwNDAwMDAKK2tpb0FDQWNjZXNzRXZlcnlvbmVSZWFkQml0ID0gMTcKK2tpb0FDQWNjZXNzRXZlcnlvbmVSZWFkTWFzayA9IDB4MDAwMjAwMDAKK2tpb0FDQWNjZXNzRXZlcnlvbmVTZWFyY2hCaXQgPSAxNgora2lvQUNBY2Nlc3NFdmVyeW9uZVNlYXJjaE1hc2sgPSAweDAwMDEwMDAwCitraW9BQ0FjY2Vzc0dyb3VwV3JpdGVCaXQgPSAxMAora2lvQUNBY2Nlc3NHcm91cFdyaXRlTWFzayA9IDB4MDAwMDA0MDAKK2tpb0FDQWNjZXNzR3JvdXBSZWFkQml0ID0gOQora2lvQUNBY2Nlc3NHcm91cFJlYWRNYXNrID0gMHgwMDAwMDIwMAora2lvQUNBY2Nlc3NHcm91cFNlYXJjaEJpdCA9IDgKK2tpb0FDQWNjZXNzR3JvdXBTZWFyY2hNYXNrID0gMHgwMDAwMDEwMAora2lvQUNBY2Nlc3NPd25lcldyaXRlQml0ID0gMgora2lvQUNBY2Nlc3NPd25lcldyaXRlTWFzayA9IDB4MDAwMDAwMDQKK2tpb0FDQWNjZXNzT3duZXJSZWFkQml0ID0gMQora2lvQUNBY2Nlc3NPd25lclJlYWRNYXNrID0gMHgwMDAwMDAwMgora2lvQUNBY2Nlc3NPd25lclNlYXJjaEJpdCA9IDAKK2tpb0FDQWNjZXNzT3duZXJTZWFyY2hNYXNrID0gMHgwMDAwMDAwMQora2Z1bGxQcml2aWxlZ2VzID0gMHgwMDA3MDAwNwora293bmVyUHJpdmlsZWdlcyA9IDB4MDAwMDAwMDcKK2tub1VzZXIgPSAwCitrYWRtaW5pc3RyYXRvclVzZXIgPSAxCitrbm9Hcm91cCA9IDAKK0FwcGxlU2hhcmVNZWRpYVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYWZwbScpCit2b2xNb3VudE5vTG9naW5Nc2dGbGFnQml0ID0gMAordm9sTW91bnROb0xvZ2luTXNnRmxhZ01hc2sgPSAweDAwMDEKK3ZvbE1vdW50RXh0ZW5kZWRGbGFnc0JpdCA9IDcKK3ZvbE1vdW50RXh0ZW5kZWRGbGFnc01hc2sgPSAweDAwODAKK3ZvbE1vdW50SW50ZXJhY3RCaXQgPSAxNQordm9sTW91bnRJbnRlcmFjdE1hc2sgPSAweDgwMDAKK3ZvbE1vdW50Q2hhbmdlZEJpdCA9IDE0Cit2b2xNb3VudENoYW5nZWRNYXNrID0gMHg0MDAwCit2b2xNb3VudEZTUmVzZXJ2ZWRNYXNrID0gMHgwMEZGCit2b2xNb3VudFN5c1Jlc2VydmVkTWFzayA9IDB4RkYwMAora0FGUEV4dGVuZGVkRmxhZ3NBbHRlcm5hdGVBZGRyZXNzTWFzayA9IDEKK2tBRlBUYWdUeXBlSVAgPSAweDAxCitrQUZQVGFnVHlwZUlQUG9ydCA9IDB4MDIKK2tBRlBUYWdUeXBlRERQID0gMHgwMwora0FGUFRhZ1R5cGVETlMgPSAweDA0CitrQUZQVGFnTGVuZ3RoSVAgPSAweDA2CitrQUZQVGFnTGVuZ3RoSVBQb3J0ID0gMHgwOAora0FGUFRhZ0xlbmd0aEREUCA9IDB4MDYKK2tGU0ludmFsaWRWb2x1bWVSZWZOdW0gPSAwCitrRlNDYXRJbmZvTm9uZSA9IDB4MDAwMDAwMDAKK2tGU0NhdEluZm9UZXh0RW5jb2RpbmcgPSAweDAwMDAwMDAxCitrRlNDYXRJbmZvTm9kZUZsYWdzID0gMHgwMDAwMDAwMgora0ZTQ2F0SW5mb1ZvbHVtZSA9IDB4MDAwMDAwMDQKK2tGU0NhdEluZm9QYXJlbnREaXJJRCA9IDB4MDAwMDAwMDgKK2tGU0NhdEluZm9Ob2RlSUQgPSAweDAwMDAwMDEwCitrRlNDYXRJbmZvQ3JlYXRlRGF0ZSA9IDB4MDAwMDAwMjAKK2tGU0NhdEluZm9Db250ZW50TW9kID0gMHgwMDAwMDA0MAora0ZTQ2F0SW5mb0F0dHJNb2QgPSAweDAwMDAwMDgwCitrRlNDYXRJbmZvQWNjZXNzRGF0ZSA9IDB4MDAwMDAxMDAKK2tGU0NhdEluZm9CYWNrdXBEYXRlID0gMHgwMDAwMDIwMAora0ZTQ2F0SW5mb1Blcm1pc3Npb25zID0gMHgwMDAwMDQwMAora0ZTQ2F0SW5mb0ZpbmRlckluZm8gPSAweDAwMDAwODAwCitrRlNDYXRJbmZvRmluZGVyWEluZm8gPSAweDAwMDAxMDAwCitrRlNDYXRJbmZvVmFsZW5jZSA9IDB4MDAwMDIwMDAKK2tGU0NhdEluZm9EYXRhU2l6ZXMgPSAweDAwMDA0MDAwCitrRlNDYXRJbmZvUnNyY1NpemVzID0gMHgwMDAwODAwMAora0ZTQ2F0SW5mb1NoYXJpbmdGbGFncyA9IDB4MDAwMTAwMDAKK2tGU0NhdEluZm9Vc2VyUHJpdnMgPSAweDAwMDIwMDAwCitrRlNDYXRJbmZvVXNlckFjY2VzcyA9IDB4MDAwODAwMDAKK2tGU0NhdEluZm9BbGxEYXRlcyA9IDB4MDAwMDAzRTAKK2tGU0NhdEluZm9HZXR0YWJsZUluZm8gPSAweDAwMDNGRkZGCitrRlNDYXRJbmZvU2V0dGFibGVJbmZvID0gMHgwMDAwMUZFMworIyBrRlNDYXRJbmZvUmVzZXJ2ZWQgPSAobG9uZykweEZGRkMwMDAwCitrRlNOb2RlTG9ja2VkQml0ID0gMAora0ZTTm9kZUxvY2tlZE1hc2sgPSAweDAwMDEKK2tGU05vZGVSZXNPcGVuQml0ID0gMgora0ZTTm9kZVJlc09wZW5NYXNrID0gMHgwMDA0CitrRlNOb2RlRGF0YU9wZW5CaXQgPSAzCitrRlNOb2RlRGF0YU9wZW5NYXNrID0gMHgwMDA4CitrRlNOb2RlSXNEaXJlY3RvcnlCaXQgPSA0CitrRlNOb2RlSXNEaXJlY3RvcnlNYXNrID0gMHgwMDEwCitrRlNOb2RlQ29weVByb3RlY3RCaXQgPSA2CitrRlNOb2RlQ29weVByb3RlY3RNYXNrID0gMHgwMDQwCitrRlNOb2RlRm9ya09wZW5CaXQgPSA3CitrRlNOb2RlRm9ya09wZW5NYXNrID0gMHgwMDgwCitrRlNOb2RlSW5TaGFyZWRCaXQgPSAyCitrRlNOb2RlSW5TaGFyZWRNYXNrID0gMHgwMDA0CitrRlNOb2RlSXNNb3VudGVkQml0ID0gMwora0ZTTm9kZUlzTW91bnRlZE1hc2sgPSAweDAwMDgKK2tGU05vZGVJc1NoYXJlUG9pbnRCaXQgPSA1CitrRlNOb2RlSXNTaGFyZVBvaW50TWFzayA9IDB4MDAyMAora0ZTSXRlcmF0ZUZsYXQgPSAwCitrRlNJdGVyYXRlU3VidHJlZSA9IDEKK2tGU0l0ZXJhdGVEZWxldGUgPSAyCisjIGtGU0l0ZXJhdGVSZXNlcnZlZCA9IChsb25nKTB4RkZGRkZGRkMKK2ZzU0JOb2RlSUQgPSAweDAwMDA4MDAwCitmc1NCQXR0cmlidXRlTW9kRGF0ZSA9IDB4MDAwMTAwMDAKK2ZzU0JBY2Nlc3NEYXRlID0gMHgwMDAyMDAwMAorZnNTQlBlcm1pc3Npb25zID0gMHgwMDA0MDAwMAorZnNTQk5vZGVJREJpdCA9IDE1Citmc1NCQXR0cmlidXRlTW9kRGF0ZUJpdCA9IDE2Citmc1NCQWNjZXNzRGF0ZUJpdCA9IDE3Citmc1NCUGVybWlzc2lvbnNCaXQgPSAxOAora0ZTQWxsb2NEZWZhdWx0RmxhZ3MgPSAweDAwMDAKK2tGU0FsbG9jQWxsT3JOb3RoaW5nTWFzayA9IDB4MDAwMQora0ZTQWxsb2NDb250aWd1b3VzTWFzayA9IDB4MDAwMgora0ZTQWxsb2NOb1JvdW5kVXBNYXNrID0gMHgwMDA0CitrRlNBbGxvY1Jlc2VydmVkTWFzayA9IDB4RkZGOAora0ZTVm9sSW5mb05vbmUgPSAweDAwMDAKK2tGU1ZvbEluZm9DcmVhdGVEYXRlID0gMHgwMDAxCitrRlNWb2xJbmZvTW9kRGF0ZSA9IDB4MDAwMgora0ZTVm9sSW5mb0JhY2t1cERhdGUgPSAweDAwMDQKK2tGU1ZvbEluZm9DaGVja2VkRGF0ZSA9IDB4MDAwOAora0ZTVm9sSW5mb0ZpbGVDb3VudCA9IDB4MDAxMAora0ZTVm9sSW5mb0RpckNvdW50ID0gMHgwMDIwCitrRlNWb2xJbmZvU2l6ZXMgPSAweDAwNDAKK2tGU1ZvbEluZm9CbG9ja3MgPSAweDAwODAKK2tGU1ZvbEluZm9OZXh0QWxsb2MgPSAweDAxMDAKK2tGU1ZvbEluZm9Sc3JjQ2x1bXAgPSAweDAyMDAKK2tGU1ZvbEluZm9EYXRhQ2x1bXAgPSAweDA0MDAKK2tGU1ZvbEluZm9OZXh0SUQgPSAweDA4MDAKK2tGU1ZvbEluZm9GaW5kZXJJbmZvID0gMHgxMDAwCitrRlNWb2xJbmZvRmxhZ3MgPSAweDIwMDAKK2tGU1ZvbEluZm9GU0luZm8gPSAweDQwMDAKK2tGU1ZvbEluZm9Ecml2ZUluZm8gPSAweDgwMDAKK2tGU1ZvbEluZm9HZXR0YWJsZUluZm8gPSAweEZGRkYKK2tGU1ZvbEluZm9TZXR0YWJsZUluZm8gPSAweDMwMDQKK2tGU1ZvbEZsYWdEZWZhdWx0Vm9sdW1lQml0ID0gNQora0ZTVm9sRmxhZ0RlZmF1bHRWb2x1bWVNYXNrID0gMHgwMDIwCitrRlNWb2xGbGFnRmlsZXNPcGVuQml0ID0gNgora0ZTVm9sRmxhZ0ZpbGVzT3Blbk1hc2sgPSAweDAwNDAKK2tGU1ZvbEZsYWdIYXJkd2FyZUxvY2tlZEJpdCA9IDcKK2tGU1ZvbEZsYWdIYXJkd2FyZUxvY2tlZE1hc2sgPSAweDAwODAKK2tGU1ZvbEZsYWdTb2Z0d2FyZUxvY2tlZEJpdCA9IDE1CitrRlNWb2xGbGFnU29mdHdhcmVMb2NrZWRNYXNrID0gMHg4MDAwCitrRk5EaXJlY3RvcnlNb2RpZmllZE1lc3NhZ2UgPSAxCitrRk5Ob0ltcGxpY2l0QWxsU3Vic2NyaXB0aW9uID0gKDEgPDwgMCkKK3JBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYWxpcycpCitrQVJNTW91bnRWb2wgPSAweDAwMDAwMDAxCitrQVJNTm9VSSA9IDB4MDAwMDAwMDIKK2tBUk1NdWx0Vm9scyA9IDB4MDAwMDAwMDgKK2tBUk1TZWFyY2ggPSAweDAwMDAwMTAwCitrQVJNU2VhcmNoTW9yZSA9IDB4MDAwMDAyMDAKK2tBUk1TZWFyY2hSZWxGaXJzdCA9IDB4MDAwMDA0MDAKK2FzaVpvbmVOYW1lID0gLTMKK2FzaVNlcnZlck5hbWUgPSAtMgorYXNpVm9sdW1lTmFtZSA9IC0xCithc2lBbGlhc05hbWUgPSAwCithc2lQYXJlbnROYW1lID0gMQora1Jlc29sdmVBbGlhc0ZpbGVOb1VJID0gMHgwMDAwMDAwMQora0NsaXBwaW5nQ3JlYXRvciA9IEZPVVJfQ0hBUl9DT0RFKCdkcmFnJykKK2tDbGlwcGluZ1BpY3R1cmVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2NscHAnKQora0NsaXBwaW5nVGV4dFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY2xwdCcpCitrQ2xpcHBpbmdTb3VuZFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY2xwcycpCitrQ2xpcHBpbmdVbmtub3duVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjbHB1JykKK2tJbnRlcm5ldExvY2F0aW9uQ3JlYXRvciA9IEZPVVJfQ0hBUl9DT0RFKCdkcmFnJykKK2tJbnRlcm5ldExvY2F0aW9uSFRUUCA9IEZPVVJfQ0hBUl9DT0RFKCdpbGh0JykKK2tJbnRlcm5ldExvY2F0aW9uRlRQID0gRk9VUl9DSEFSX0NPREUoJ2lsZnQnKQora0ludGVybmV0TG9jYXRpb25GaWxlID0gRk9VUl9DSEFSX0NPREUoJ2lsZmknKQora0ludGVybmV0TG9jYXRpb25NYWlsID0gRk9VUl9DSEFSX0NPREUoJ2lsbWEnKQora0ludGVybmV0TG9jYXRpb25OTlRQID0gRk9VUl9DSEFSX0NPREUoJ2lsbncnKQora0ludGVybmV0TG9jYXRpb25BRlAgPSBGT1VSX0NIQVJfQ09ERSgnaWxhZicpCitrSW50ZXJuZXRMb2NhdGlvbkFwcGxlVGFsayA9IEZPVVJfQ0hBUl9DT0RFKCdpbGF0JykKK2tJbnRlcm5ldExvY2F0aW9uTlNMID0gRk9VUl9DSEFSX0NPREUoJ2lsbnMnKQora0ludGVybmV0TG9jYXRpb25HZW5lcmljID0gRk9VUl9DSEFSX0NPREUoJ2lsZ2UnKQora0N1c3RvbUljb25SZXNvdXJjZSA9IC0xNjQ1NQora0N1c3RvbUJhZGdlUmVzb3VyY2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2JhZGcnKQora0N1c3RvbUJhZGdlUmVzb3VyY2VJRCA9IGtDdXN0b21JY29uUmVzb3VyY2UKK2tDdXN0b21CYWRnZVJlc291cmNlVmVyc2lvbiA9IDAKKyMga1N5c3RlbUZvbGRlclR5cGUgPSAnbWFjcycuCitrUm91dGluZ1Jlc291cmNlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdyb3V0JykKK2tSb3V0aW5nUmVzb3VyY2VJRCA9IDAKK2tDb250YWluZXJGb2xkZXJBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmRycCcpCitrQ29udGFpbmVyVHJhc2hBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgndHJzaCcpCitrQ29udGFpbmVySGFyZERpc2tBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnaGRzaycpCitrQ29udGFpbmVyRmxvcHB5QWxpYXNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ZscHknKQora0NvbnRhaW5lclNlcnZlckFsaWFzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzcnZyJykKK2tBcHBsaWNhdGlvbkFsaWFzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhZHJwJykKK2tDb250YWluZXJBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZHJvcCcpCitrRGVza3RvcFByaW50ZXJBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZHRwYScpCitrQ29udGFpbmVyQ0RST01BbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY2RkcicpCitrQXBwbGljYXRpb25DUEFsaWFzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhY2RwJykKK2tBcHBsaWNhdGlvbkRBQWxpYXNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2FkZHAnKQora1BhY2thZ2VBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZnBrYScpCitrQXBwUGFja2FnZUFsaWFzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdmYXBhJykKK2tTeXN0ZW1Gb2xkZXJBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmFzeScpCitrQXBwbGVNZW51Rm9sZGVyQWxpYXNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ZhYW0nKQora1N0YXJ0dXBGb2xkZXJBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmFzdCcpCitrUHJpbnRNb25pdG9yRG9jc0ZvbGRlckFsaWFzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdmYXBuJykKK2tQcmVmZXJlbmNlc0ZvbGRlckFsaWFzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdmYXBmJykKK2tDb250cm9sUGFuZWxGb2xkZXJBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmFjdCcpCitrRXh0ZW5zaW9uRm9sZGVyQWxpYXNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ZhZXgnKQora0V4cG9ydGVkRm9sZGVyQWxpYXNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ZhZXQnKQora0Ryb3BGb2xkZXJBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmFkcicpCitrU2hhcmVkRm9sZGVyQWxpYXNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Zhc2gnKQora01vdW50ZWRGb2xkZXJBbGlhc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmFtbicpCitrSXNPbkRlc2sgPSAweDAwMDEKK2tDb2xvciA9IDB4MDAwRQora0lzU2hhcmVkID0gMHgwMDQwCitrSGFzTm9JTklUcyA9IDB4MDA4MAora0hhc0JlZW5Jbml0ZWQgPSAweDAxMDAKK2tIYXNDdXN0b21JY29uID0gMHgwNDAwCitrSXNTdGF0aW9uZXJ5ID0gMHgwODAwCitrTmFtZUxvY2tlZCA9IDB4MTAwMAora0hhc0J1bmRsZSA9IDB4MjAwMAora0lzSW52aXNpYmxlID0gMHg0MDAwCitrSXNBbGlhcyA9IDB4ODAwMAorZk9uRGVzayA9IGtJc09uRGVzaworZkhhc0J1bmRsZSA9IGtIYXNCdW5kbGUKK2ZJbnZpc2libGUgPSBrSXNJbnZpc2libGUKK2ZUcmFzaCA9IC0zCitmRGVza3RvcCA9IC0yCitmRGlzayA9IDAKK2tJc1N0YXRpb25hcnkgPSBrSXNTdGF0aW9uZXJ5CitrRXh0ZW5kZWRGbGFnc0FyZUludmFsaWQgPSAweDgwMDAKK2tFeHRlbmRlZEZsYWdIYXNDdXN0b21CYWRnZSA9IDB4MDEwMAora0V4dGVuZGVkRmxhZ0hhc1JvdXRpbmdJbmZvID0gMHgwMDA0CitrRmlyc3RNYWdpY0J1c3lGaWxldHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdienkgJykKK2tMYXN0TWFnaWNCdXN5RmlsZXR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYnp5PycpCitrTWFnaWNCdXN5Q3JlYXRpb25EYXRlID0gMHg0RjNBRkRCMApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRmlsZXMucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRmlsZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMWNjODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9GaWxlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRmlsZXMucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRmlsZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMWNjODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9GaWxlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm0ucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9GbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQyZmRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm0ucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfRm0gaW1wb3J0ICoKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZtLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZtLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmZiMzliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm0ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZtLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZtLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmZiMzliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm0ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlci5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGU0OTAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm9sZGVyLnB5CkBAIC0wLDAgKzEgQEAKK2Zyb20gX0ZvbGRlciBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm9sZGVyLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5ODJiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm9sZGVyLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5ODJiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm9sZGVycy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJjZjE1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlcnMucHkKQEAgLTAsMCArMSwxOTAgQEAKKyMgR2VuZXJhdGVkIGZyb20gJ0ZvbGRlcnMuaCcKKworZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAordHJ1ZSA9IFRydWUKK2ZhbHNlID0gRmFsc2UKK2tPblN5c3RlbURpc2sgPSAtMzI3NjhMCitrT25BcHByb3ByaWF0ZURpc2sgPSAtMzI3NjcKK2tTeXN0ZW1Eb21haW4gPSAtMzI3NjYKK2tMb2NhbERvbWFpbiA9IC0zMjc2NQora05ldHdvcmtEb21haW4gPSAtMzI3NjQKK2tVc2VyRG9tYWluID0gLTMyNzYzCitrQ2xhc3NpY0RvbWFpbiA9IC0zMjc2Mgora0NyZWF0ZUZvbGRlciA9IHRydWUKK2tEb250Q3JlYXRlRm9sZGVyID0gZmFsc2UKK2tTeXN0ZW1Gb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ21hY3MnKQora0Rlc2t0b3BGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Rlc2snKQora1N5c3RlbURlc2t0b3BGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3Nkc2snKQora1RyYXNoRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0cnNoJykKK2tTeXN0ZW1UcmFzaEZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3RycycpCitrV2hlcmVUb0VtcHR5VHJhc2hGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2VtcHQnKQora1ByaW50TW9uaXRvckRvY3NGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3BybnQnKQora1N0YXJ0dXBGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3N0cnQnKQora1NodXRkb3duRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzaGRmJykKK2tBcHBsZU1lbnVGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2FtbnUnKQora0NvbnRyb2xQYW5lbEZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY3RybCcpCitrU3lzdGVtQ29udHJvbFBhbmVsRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzY3RsJykKK2tFeHRlbnNpb25Gb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2V4dG4nKQora0ZvbnRzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdmb250JykKK2tQcmVmZXJlbmNlc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncHJlZicpCitrU3lzdGVtUHJlZmVyZW5jZXNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NwcmYnKQora1RlbXBvcmFyeUZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndGVtcCcpCitrRXh0ZW5zaW9uRGlzYWJsZWRGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2V4dEQnKQora0NvbnRyb2xQYW5lbERpc2FibGVkRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjdHJEJykKK2tTeXN0ZW1FeHRlbnNpb25EaXNhYmxlZEZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbWFjRCcpCitrU3RhcnR1cEl0ZW1zRGlzYWJsZWRGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3N0ckQnKQora1NodXRkb3duSXRlbXNEaXNhYmxlZEZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc2hkRCcpCitrQXBwbGljYXRpb25zRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhcHBzJykKK2tEb2N1bWVudHNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2RvY3MnKQora1ZvbHVtZVJvb3RGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3Jvb3QnKQora0NoZXdhYmxlSXRlbXNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ZsbnQnKQora0FwcGxpY2F0aW9uU3VwcG9ydEZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYXN1cCcpCitrVGV4dEVuY29kaW5nc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnXHhjNHRleCcpCitrU3RhdGlvbmVyeUZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnb2RzdCcpCitrT3BlbkRvY0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnb2RvZCcpCitrT3BlbkRvY1NoZWxsUGx1Z0luc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnb2RzcCcpCitrRWRpdG9yc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnb2RlZCcpCitrT3BlbkRvY0VkaXRvcnNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ1x4YzRvZGYnKQora09wZW5Eb2NMaWJyYXJpZXNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ29kbGInKQora0dlbkVkaXRvcnNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ1x4YzRlZGknKQora0hlbHBGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ1x4YzRobHAnKQora0ludGVybmV0UGx1Z0luRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdceGM0bmV0JykKK2tNb2RlbVNjcmlwdHNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ1x4YzRtb2QnKQora1ByaW50ZXJEZXNjcmlwdGlvbkZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncHBkZicpCitrUHJpbnRlckRyaXZlckZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnXHhjNHByZCcpCitrU2NyaXB0aW5nQWRkaXRpb25zRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdceGM0c2NyJykKK2tTaGFyZWRMaWJyYXJpZXNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ1x4YzRsaWInKQora1ZvaWNlc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZnZvYycpCitrQ29udHJvbFN0cmlwTW9kdWxlc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc2RldicpCitrQXNzaXN0YW50c0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYXN0XHhjNCcpCitrVXRpbGl0aWVzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd1dGlceGM0JykKK2tBcHBsZUV4dHJhc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYWV4XHhjNCcpCitrQ29udGV4dHVhbE1lbnVJdGVtc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY21udScpCitrTWFjT1NSZWFkTWVzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtb3JceGM0JykKK2tBTE1Nb2R1bGVzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd3YWxrJykKK2tBTE1QcmVmZXJlbmNlc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndHJpcCcpCitrQUxNTG9jYXRpb25zRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdmYWxsJykKK2tDb2xvclN5bmNQcm9maWxlc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncHJvZicpCitrVGhlbWVzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0aG1lJykKK2tGYXZvcml0ZXNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ZhdnMnKQora0ludGVybmV0Rm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbnRceGM0JykKK2tBcHBlYXJhbmNlRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhcHByJykKK2tTb3VuZFNldHNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NuZHMnKQora0Rlc2t0b3BQaWN0dXJlc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZHRwXHhjNCcpCitrSW50ZXJuZXRTZWFyY2hTaXRlc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnaXNzZicpCitrRmluZFN1cHBvcnRGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ZuZHMnKQora0ZpbmRCeUNvbnRlbnRGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ZiY2YnKQora0luc3RhbGxlckxvZ3NGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2lsZ2YnKQora1NjcmlwdHNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3Njclx4YzQnKQora0ZvbGRlckFjdGlvbnNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Zhc2YnKQora0xhdW5jaGVySXRlbXNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2xhdW4nKQora1JlY2VudEFwcGxpY2F0aW9uc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncmFwcCcpCitrUmVjZW50RG9jdW1lbnRzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdyZG9jJykKK2tSZWNlbnRTZXJ2ZXJzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdyc3ZyJykKK2tTcGVha2FibGVJdGVtc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3BraScpCitrS2V5Y2hhaW5Gb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2tjaG4nKQora1F1aWNrVGltZUV4dGVuc2lvbnNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3F0ZXgnKQora0Rpc3BsYXlFeHRlbnNpb25zRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkc3BsJykKK2tNdWx0aXByb2Nlc3NpbmdGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ21weGYnKQora1ByaW50aW5nUGx1Z0luc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncHBsZycpCitrRG9tYWluVG9wTGV2ZWxGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2R0b3AnKQora0RvbWFpbkxpYnJhcnlGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2RsaWInKQora0NvbG9yU3luY0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3luYycpCitrQ29sb3JTeW5jQ01NRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjY21tJykKK2tDb2xvclN5bmNTY3JpcHRpbmdGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2NzY3InKQora1ByaW50ZXJzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbXByJykKK2tTcGVlY2hGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NwY2gnKQora0NhcmJvbkxpYnJhcnlGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2NhcmInKQora0RvY3VtZW50YXRpb25Gb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2luZm8nKQora0RldmVsb3BlckRvY3NGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Rkb2MnKQora0RldmVsb3BlckhlbHBGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2RldmgnKQora0lTU0Rvd25sb2Fkc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnaXNzZCcpCitrVXNlclNwZWNpZmljVG1wRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd1dG1wJykKK2tDYWNoZWREYXRhRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjYWNoJykKK2tGcmFtZXdvcmtzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdmcmFtJykKK2tQcml2YXRlRnJhbWV3b3Jrc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncGZybScpCitrQ2xhc3NpY0Rlc2t0b3BGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3Nkc2snKQora0RldmVsb3BlckZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZGV2ZicpCitrU3lzdGVtU291bmRzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzc25kJykKK2tDb21wb25lbnRzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjbXBkJykKK2tRdWlja1RpbWVDb21wb25lbnRzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd3Y21wJykKK2tDb3JlU2VydmljZXNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2NzcnYnKQora1BpY3R1cmVEb2N1bWVudHNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3Bkb2MnKQora01vdmllRG9jdW1lbnRzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtZG9jJykKK2tNdXNpY0RvY3VtZW50c0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnXHhiNWRvYycpCitrSW50ZXJuZXRTaXRlc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc2l0ZScpCitrUHVibGljRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdwdWJiJykKK2tBdWRpb1N1cHBvcnRGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2FkaW8nKQora0F1ZGlvU291bmRzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhc25kJykKK2tBdWRpb1NvdW5kQmFua3NGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2JhbmsnKQora0F1ZGlvQWxlcnRTb3VuZHNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2FscnQnKQora0F1ZGlvUGx1Z0luc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYXBsZycpCitrQXVkaW9Db21wb25lbnRzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhY21wJykKK2tLZXJuZWxFeHRlbnNpb25zRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdrZXh0JykKK2tEaXJlY3RvcnlTZXJ2aWNlc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZHNydicpCitrRGlyZWN0b3J5U2VydmljZXNQbHVnSW5zRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkcGxnJykKK2tJbnN0YWxsZXJSZWNlaXB0c0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncmNwdCcpCitrRmlsZVN5c3RlbVN1cHBvcnRGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ZzeXMnKQora0FwcGxlU2hhcmVTdXBwb3J0Rm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzaGFyJykKK2tBcHBsZVNoYXJlQXV0aGVudGljYXRpb25Gb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2F1dGgnKQora01JRElEcml2ZXJzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtaWRpJykKK2tMb2NhbGVzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdceGM0bG9jJykKK2tGaW5kQnlDb250ZW50UGx1Z2luc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmJjcCcpCitrVXNlcnNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3VzcnMnKQora0N1cnJlbnRVc2VyRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjdXNyJykKK2tDdXJyZW50VXNlclJlbW90ZUZvbGRlckxvY2F0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3J1c2YnKQora0N1cnJlbnRVc2VyUmVtb3RlRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdydXNyJykKK2tTaGFyZWRVc2VyRGF0YUZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc2RhdCcpCitrVm9sdW1lU2V0dGluZ3NGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3ZzZmQnKQora0FwcGxlc2hhcmVBdXRvbW91bnRTZXJ2ZXJBbGlhc2VzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzcnZceGM0JykKK2tQcmVNYWNPUzkxQXBwbGljYXRpb25zRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdceDhjcHBzJykKK2tQcmVNYWNPUzkxSW5zdGFsbGVyTG9nc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnXHg5NGxnZicpCitrUHJlTWFjT1M5MUFzc2lzdGFudHNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ1x4OGNzdFx4YzQnKQora1ByZU1hY09TOTFVdGlsaXRpZXNGb2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ1x4OWZ0aVx4YzQnKQora1ByZU1hY09TOTFBcHBsZUV4dHJhc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnXHg4Y2V4XHhjNCcpCitrUHJlTWFjT1M5MU1hY09TUmVhZE1lc0ZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnXHhiNW9yXHhjNCcpCitrUHJlTWFjT1M5MUludGVybmV0Rm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdceDk0bnRceGM0JykKK2tQcmVNYWNPUzkxQXV0b21vdW50ZWRTZXJ2ZXJzRm9sZGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdceGE3cnZceGM0JykKK2tQcmVNYWNPUzkxU3RhdGlvbmVyeUZvbGRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnXHhiZmRzdCcpCitrQ3JlYXRlRm9sZGVyQXRCb290ID0gMHgwMDAwMDAwMgora0NyZWF0ZUZvbGRlckF0Qm9vdEJpdCA9IDEKK2tGb2xkZXJDcmVhdGVkSW52aXNpYmxlID0gMHgwMDAwMDAwNAora0ZvbGRlckNyZWF0ZWRJbnZpc2libGVCaXQgPSAyCitrRm9sZGVyQ3JlYXRlZE5hbWVMb2NrZWQgPSAweDAwMDAwMDA4CitrRm9sZGVyQ3JlYXRlZE5hbWVMb2NrZWRCaXQgPSAzCitrRm9sZGVyQ3JlYXRlZEFkbWluUHJpdnMgPSAweDAwMDAwMDEwCitrRm9sZGVyQ3JlYXRlZEFkbWluUHJpdnNCaXQgPSA0CitrRm9sZGVySW5Vc2VyRm9sZGVyID0gMHgwMDAwMDAyMAora0ZvbGRlckluVXNlckZvbGRlckJpdCA9IDUKK2tGb2xkZXJUcmFja2VkQnlBbGlhcyA9IDB4MDAwMDAwNDAKK2tGb2xkZXJUcmFja2VkQnlBbGlhc0JpdCA9IDYKK2tGb2xkZXJJblJlbW90ZVVzZXJGb2xkZXJJZkF2YWlsYWJsZSA9IDB4MDAwMDAwODAKK2tGb2xkZXJJblJlbW90ZVVzZXJGb2xkZXJJZkF2YWlsYWJsZUJpdCA9IDcKK2tGb2xkZXJOZXZlck1hdGNoZWRJbklkZW50aWZ5Rm9sZGVyID0gMHgwMDAwMDEwMAora0ZvbGRlck5ldmVyTWF0Y2hlZEluSWRlbnRpZnlGb2xkZXJCaXQgPSA4CitrRm9sZGVyTXVzdFN0YXlPblNhbWVWb2x1bWUgPSAweDAwMDAwMjAwCitrRm9sZGVyTXVzdFN0YXlPblNhbWVWb2x1bWVCaXQgPSA5CitrRm9sZGVyTWFuYWdlckZvbGRlckluTWFjT1M5Rm9sZGVySWZNYWNPU1hJc0luc3RhbGxlZE1hc2sgPSAweDAwMDAwNDAwCitrRm9sZGVyTWFuYWdlckZvbGRlckluTWFjT1M5Rm9sZGVySWZNYWNPU1hJc0luc3RhbGxlZEJpdCA9IDEwCitrRm9sZGVySW5Mb2NhbE9yUmVtb3RlVXNlckZvbGRlciA9IGtGb2xkZXJJblVzZXJGb2xkZXIgfCBrRm9sZGVySW5SZW1vdGVVc2VyRm9sZGVySWZBdmFpbGFibGUKK2tSZWxhdGl2ZUZvbGRlciA9IEZPVVJfQ0hBUl9DT0RFKCdyZWxmJykKK2tTcGVjaWFsRm9sZGVyID0gRk9VUl9DSEFSX0NPREUoJ3NwY2YnKQora0JsZXNzZWRGb2xkZXIgPSBGT1VSX0NIQVJfQ09ERSgnYmxzZicpCitrUm9vdEZvbGRlciA9IEZPVVJfQ0hBUl9DT0RFKCdyb3RmJykKK2tDdXJyZW50VXNlckZvbGRlckxvY2F0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2N1c2YnKQora0ZpbmRGb2xkZXJSZWRpcmVjdGlvbkZsYWdVc2VEaXN0aW5jdFVzZXJGb2xkZXJzQml0ID0gMAora0ZpbmRGb2xkZXJSZWRpcmVjdGlvbkZsYWdVc2VHaXZlblZSZWZBbmREaXJJREFzVXNlckZvbGRlckJpdCA9IDEKK2tGaW5kRm9sZGVyUmVkaXJlY3Rpb25GbGFnc1VzZUdpdmVuVlJlZk51bUFuZERpcklEQXNSZW1vdGVVc2VyRm9sZGVyQml0ID0gMgora0ZvbGRlck1hbmFnZXJVc2VyUmVkaXJlY3Rpb25HbG9iYWxzQ3VycmVudFZlcnNpb24gPSAxCitrRmluZEZvbGRlckV4dGVuZGVkRmxhZ3NEb05vdEZvbGxvd0FsaWFzZXNCaXQgPSAwCitrRmluZEZvbGRlckV4dGVuZGVkRmxhZ3NEb05vdFVzZVVzZXJGb2xkZXJCaXQgPSAxCitrRmluZEZvbGRlckV4dGVuZGVkRmxhZ3NVc2VPdGhlclVzZXJSZWNvcmQgPSAweDAxMDAwMDAwCitrRm9sZGVyTWFuYWdlck5vdGlmaWNhdGlvbk1lc3NhZ2VVc2VyTG9nSW4gPSBGT1VSX0NIQVJfQ09ERSgnbG9nKycpCitrRm9sZGVyTWFuYWdlck5vdGlmaWNhdGlvbk1lc3NhZ2VQcmVVc2VyTG9nSW4gPSBGT1VSX0NIQVJfQ09ERSgnbG9naicpCitrRm9sZGVyTWFuYWdlck5vdGlmaWNhdGlvbk1lc3NhZ2VVc2VyTG9nT3V0ID0gRk9VUl9DSEFSX0NPREUoJ2xvZy0nKQora0ZvbGRlck1hbmFnZXJOb3RpZmljYXRpb25NZXNzYWdlUG9zdFVzZXJMb2dPdXQgPSBGT1VSX0NIQVJfQ09ERSgnbG9ncCcpCitrRm9sZGVyTWFuYWdlck5vdGlmaWNhdGlvbkRpc2NhcmRDYWNoZWREYXRhID0gRk9VUl9DSEFSX0NPREUoJ2RjaGUnKQora0ZvbGRlck1hbmFnZXJOb3RpZmljYXRpb25NZXNzYWdlTG9naW5TdGFydHVwID0gRk9VUl9DSEFSX0NPREUoJ3N0dXAnKQora0RvTm90UmVtb3ZlV2hlbkN1cnJlbnRBcHBsaWNhdGlvblF1aXRzQml0ID0gMAora0RvTm90UmVtb3ZlV2hlQ3VycmVudEFwcGxpY2F0aW9uUXVpdHNCaXQgPSBrRG9Ob3RSZW1vdmVXaGVuQ3VycmVudEFwcGxpY2F0aW9uUXVpdHNCaXQKK2tTdG9wSWZBbnlOb3RpZmljYXRpb25Qcm9jUmV0dXJuc0Vycm9yQml0ID0gMzEKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlcnMucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm9sZGVycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExNjdlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlcnMucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm9sZGVycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExNjdlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbGRlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbnRzLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm9udHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlN2U3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ZvbnRzLnB5CkBAIC0wLDAgKzEsNTkgQEAKKyMgR2VuZXJhdGVkIGZyb20gJ0ZvbnRzLmgnCisKK2RlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHgKK2tOaWxPcHRpb25zID0gMAorc3lzdGVtRm9udCA9IDAKK2FwcGxGb250ID0gMQora0ZNRGVmYXVsdE9wdGlvbnMgPSBrTmlsT3B0aW9ucwora0ZNRGVmYXVsdEFjdGl2YXRpb25Db250ZXh0ID0ga0ZNRGVmYXVsdE9wdGlvbnMKK2tGTUdsb2JhbEFjdGl2YXRpb25Db250ZXh0ID0gMHgwMDAwMDAwMQora0ZNTG9jYWxBY3RpdmF0aW9uQ29udGV4dCA9IGtGTURlZmF1bHRBY3RpdmF0aW9uQ29udGV4dAora0ZNRGVmYXVsdEl0ZXJhdGlvblNjb3BlID0ga0ZNRGVmYXVsdE9wdGlvbnMKK2tGTUdsb2JhbEl0ZXJhdGlvblNjb3BlID0gMHgwMDAwMDAwMQora0ZNTG9jYWxJdGVyYXRpb25TY29wZSA9IGtGTURlZmF1bHRJdGVyYXRpb25TY29wZQora1BsYXRmb3JtRGVmYXVsdEd1aUZvbnRJRCA9IGFwcGxGb250CitrUGxhdGZvcm1EZWZhdWx0R3VpRm9udElEID0gLTEKK2NvbW1hbmRNYXJrID0gMTcKK2NoZWNrTWFyayA9IDE4CitkaWFtb25kTWFyayA9IDE5CithcHBsZU1hcmsgPSAyMAorcHJvcEZvbnQgPSAzNjg2NEwKK3BycEZudEggPSAzNjg2NUwKK3BycEZudFcgPSAzNjg2NkwKK3BycEZudEhXID0gMzY4NjdMCitmaXhlZEZvbnQgPSA0NTA1NkwKK2Z4ZEZudEggPSA0NTA1N0wKK2Z4ZEZudFcgPSA0NTA1OEwKK2Z4ZEZudEhXID0gNDUwNTlMCitmb250V2lkID0gNDQyMDhMCitrRk1Vc2VHbG9iYWxTY29wZU9wdGlvbiA9IDB4MDAwMDAwMDEKK2tGb250SUROZXdZb3JrID0gMgora0ZvbnRJREdlbmV2YSA9IDMKK2tGb250SURNb25hY28gPSA0CitrRm9udElEVmVuaWNlID0gNQora0ZvbnRJRExvbmRvbiA9IDYKK2tGb250SURBdGhlbnMgPSA3CitrRm9udElEU2FuRnJhbmNpc2NvID0gOAora0ZvbnRJRFRvcm9udG8gPSA5CitrRm9udElEQ2Fpcm8gPSAxMQora0ZvbnRJRExvc0FuZ2VsZXMgPSAxMgora0ZvbnRJRFRpbWVzID0gMjAKK2tGb250SURIZWx2ZXRpY2EgPSAyMQora0ZvbnRJRENvdXJpZXIgPSAyMgora0ZvbnRJRFN5bWJvbCA9IDIzCitrRm9udElETW9iaWxlID0gMjQKK25ld1lvcmsgPSBrRm9udElETmV3WW9yaworZ2VuZXZhID0ga0ZvbnRJREdlbmV2YQorbW9uYWNvID0ga0ZvbnRJRE1vbmFjbwordmVuaWNlID0ga0ZvbnRJRFZlbmljZQorbG9uZG9uID0ga0ZvbnRJRExvbmRvbgorYXRoZW5zID0ga0ZvbnRJREF0aGVucworc2FuRnJhbiA9IGtGb250SURTYW5GcmFuY2lzY28KK3Rvcm9udG8gPSBrRm9udElEVG9yb250bworY2Fpcm8gPSBrRm9udElEQ2Fpcm8KK2xvc0FuZ2VsZXMgPSBrRm9udElETG9zQW5nZWxlcwordGltZXMgPSBrRm9udElEVGltZXMKK2hlbHZldGljYSA9IGtGb250SURIZWx2ZXRpY2EKK2NvdXJpZXIgPSBrRm9udElEQ291cmllcgorc3ltYm9sID0ga0ZvbnRJRFN5bWJvbAorbW9iaWxlID0ga0ZvbnRJRE1vYmlsZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm9udHMucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm9udHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZTM2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Gb250cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm9udHMucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vRm9udHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZTM2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9Gb250cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSGVscC5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0hlbHAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjYTBkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0hlbHAucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfSGVscCBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSGVscC5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9IZWxwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjAzYjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSGVscC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSGVscC5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9IZWxwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjAzYjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSGVscC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSUJDYXJib24ucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9JQkNhcmJvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGYwZTc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSUJDYXJib24ucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfSUJDYXJib24gaW1wb3J0ICoKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0lCQ2FyYm9uLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0lCQ2FyYm9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2JhNDhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSUJDYXJib24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0lCQ2FyYm9uLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0lCQ2FyYm9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2JhNDhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSUJDYXJib24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0lCQ2FyYm9uUnVudGltZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0lCQ2FyYm9uUnVudGltZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njc4MDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSUJDYXJib25SdW50aW1lLnB5CkBAIC0wLDAgKzEsNSBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnSUJDYXJib25SdW50aW1lLmgnCisKK2tJQkNhcmJvblJ1bnRpbWVDYW50RmluZE5pYkZpbGUgPSAtMTA5NjAKK2tJQkNhcmJvblJ1bnRpbWVPYmplY3ROb3RPZlJlcXVlc3RlZFR5cGUgPSAtMTA5NjEKK2tJQkNhcmJvblJ1bnRpbWVDYW50RmluZE9iamVjdCA9IC0xMDk2MgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSUJDYXJib25SdW50aW1lLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0lCQ2FyYm9uUnVudGltZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5ODg2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0lCQ2FyYm9uUnVudGltZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSUJDYXJib25SdW50aW1lLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0lCQ2FyYm9uUnVudGltZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5ODg2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0lCQ2FyYm9uUnVudGltZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSWNuLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSWNuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDEzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9JY24ucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfSWNuIGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9JY24ucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSWNuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGZlODJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSWNuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9JY24ucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSWNuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGZlODJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSWNuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9JY29ucy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0ljb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZGFlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9JY29ucy5weQpAQCAtMCwwICsxLDM4MSBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnSWNvbnMuaCcKKworZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAorZnJvbSBDYXJib24uRmlsZXMgaW1wb3J0ICoKK2tHZW5lcmljRG9jdW1lbnRJY29uUmVzb3VyY2UgPSAtNDAwMAora0dlbmVyaWNTdGF0aW9uZXJ5SWNvblJlc291cmNlID0gLTM5ODUKK2tHZW5lcmljRWRpdGlvbkZpbGVJY29uUmVzb3VyY2UgPSAtMzk4OQora0dlbmVyaWNBcHBsaWNhdGlvbkljb25SZXNvdXJjZSA9IC0zOTk2CitrR2VuZXJpY0Rlc2tBY2Nlc3NvcnlJY29uUmVzb3VyY2UgPSAtMzk5MQora0dlbmVyaWNGb2xkZXJJY29uUmVzb3VyY2UgPSAtMzk5OQora1ByaXZhdGVGb2xkZXJJY29uUmVzb3VyY2UgPSAtMzk5NAora0Zsb3BweUljb25SZXNvdXJjZSA9IC0zOTk4CitrVHJhc2hJY29uUmVzb3VyY2UgPSAtMzk5Mwora0dlbmVyaWNSQU1EaXNrSWNvblJlc291cmNlID0gLTM5ODgKK2tHZW5lcmljQ0RST01JY29uUmVzb3VyY2UgPSAtMzk4Nwora0Rlc2t0b3BJY29uUmVzb3VyY2UgPSAtMzk5Mgora09wZW5Gb2xkZXJJY29uUmVzb3VyY2UgPSAtMzk5Nwora0dlbmVyaWNIYXJkRGlza0ljb25SZXNvdXJjZSA9IC0zOTk1CitrR2VuZXJpY0ZpbGVTZXJ2ZXJJY29uUmVzb3VyY2UgPSAtMzk3Mgora0dlbmVyaWNTdWl0Y2FzZUljb25SZXNvdXJjZSA9IC0zOTcwCitrR2VuZXJpY01vdmVyT2JqZWN0SWNvblJlc291cmNlID0gLTM5NjkKK2tHZW5lcmljUHJlZmVyZW5jZXNJY29uUmVzb3VyY2UgPSAtMzk3MQora0dlbmVyaWNRdWVyeURvY3VtZW50SWNvblJlc291cmNlID0gLTE2NTA2CitrR2VuZXJpY0V4dGVuc2lvbkljb25SZXNvdXJjZSA9IC0xNjQxNQora1N5c3RlbUZvbGRlckljb25SZXNvdXJjZSA9IC0zOTgzCitrSGVscEljb25SZXNvdXJjZSA9IC0yMDI3MQora0FwcGxlTWVudUZvbGRlckljb25SZXNvdXJjZSA9IC0zOTgyCitnZW5lcmljRG9jdW1lbnRJY29uUmVzb3VyY2UgPSBrR2VuZXJpY0RvY3VtZW50SWNvblJlc291cmNlCitnZW5lcmljU3RhdGlvbmVyeUljb25SZXNvdXJjZSA9IGtHZW5lcmljU3RhdGlvbmVyeUljb25SZXNvdXJjZQorZ2VuZXJpY0VkaXRpb25GaWxlSWNvblJlc291cmNlID0ga0dlbmVyaWNFZGl0aW9uRmlsZUljb25SZXNvdXJjZQorZ2VuZXJpY0FwcGxpY2F0aW9uSWNvblJlc291cmNlID0ga0dlbmVyaWNBcHBsaWNhdGlvbkljb25SZXNvdXJjZQorZ2VuZXJpY0Rlc2tBY2Nlc3NvcnlJY29uUmVzb3VyY2UgPSBrR2VuZXJpY0Rlc2tBY2Nlc3NvcnlJY29uUmVzb3VyY2UKK2dlbmVyaWNGb2xkZXJJY29uUmVzb3VyY2UgPSBrR2VuZXJpY0ZvbGRlckljb25SZXNvdXJjZQorcHJpdmF0ZUZvbGRlckljb25SZXNvdXJjZSA9IGtQcml2YXRlRm9sZGVySWNvblJlc291cmNlCitmbG9wcHlJY29uUmVzb3VyY2UgPSBrRmxvcHB5SWNvblJlc291cmNlCit0cmFzaEljb25SZXNvdXJjZSA9IGtUcmFzaEljb25SZXNvdXJjZQorZ2VuZXJpY1JBTURpc2tJY29uUmVzb3VyY2UgPSBrR2VuZXJpY1JBTURpc2tJY29uUmVzb3VyY2UKK2dlbmVyaWNDRFJPTUljb25SZXNvdXJjZSA9IGtHZW5lcmljQ0RST01JY29uUmVzb3VyY2UKK2Rlc2t0b3BJY29uUmVzb3VyY2UgPSBrRGVza3RvcEljb25SZXNvdXJjZQorb3BlbkZvbGRlckljb25SZXNvdXJjZSA9IGtPcGVuRm9sZGVySWNvblJlc291cmNlCitnZW5lcmljSGFyZERpc2tJY29uUmVzb3VyY2UgPSBrR2VuZXJpY0hhcmREaXNrSWNvblJlc291cmNlCitnZW5lcmljRmlsZVNlcnZlckljb25SZXNvdXJjZSA9IGtHZW5lcmljRmlsZVNlcnZlckljb25SZXNvdXJjZQorZ2VuZXJpY1N1aXRjYXNlSWNvblJlc291cmNlID0ga0dlbmVyaWNTdWl0Y2FzZUljb25SZXNvdXJjZQorZ2VuZXJpY01vdmVyT2JqZWN0SWNvblJlc291cmNlID0ga0dlbmVyaWNNb3Zlck9iamVjdEljb25SZXNvdXJjZQorZ2VuZXJpY1ByZWZlcmVuY2VzSWNvblJlc291cmNlID0ga0dlbmVyaWNQcmVmZXJlbmNlc0ljb25SZXNvdXJjZQorZ2VuZXJpY1F1ZXJ5RG9jdW1lbnRJY29uUmVzb3VyY2UgPSBrR2VuZXJpY1F1ZXJ5RG9jdW1lbnRJY29uUmVzb3VyY2UKK2dlbmVyaWNFeHRlbnNpb25JY29uUmVzb3VyY2UgPSBrR2VuZXJpY0V4dGVuc2lvbkljb25SZXNvdXJjZQorc3lzdGVtRm9sZGVySWNvblJlc291cmNlID0ga1N5c3RlbUZvbGRlckljb25SZXNvdXJjZQorYXBwbGVNZW51Rm9sZGVySWNvblJlc291cmNlID0ga0FwcGxlTWVudUZvbGRlckljb25SZXNvdXJjZQora1N0YXJ0dXBGb2xkZXJJY29uUmVzb3VyY2UgPSAtMzk4MQora093bmVkRm9sZGVySWNvblJlc291cmNlID0gLTM5ODAKK2tEcm9wRm9sZGVySWNvblJlc291cmNlID0gLTM5NzkKK2tTaGFyZWRGb2xkZXJJY29uUmVzb3VyY2UgPSAtMzk3OAora01vdW50ZWRGb2xkZXJJY29uUmVzb3VyY2UgPSAtMzk3Nwora0NvbnRyb2xQYW5lbEZvbGRlckljb25SZXNvdXJjZSA9IC0zOTc2CitrUHJpbnRNb25pdG9yRm9sZGVySWNvblJlc291cmNlID0gLTM5NzUKK2tQcmVmZXJlbmNlc0ZvbGRlckljb25SZXNvdXJjZSA9IC0zOTc0CitrRXh0ZW5zaW9uc0ZvbGRlckljb25SZXNvdXJjZSA9IC0zOTczCitrRm9udHNGb2xkZXJJY29uUmVzb3VyY2UgPSAtMzk2OAora0Z1bGxUcmFzaEljb25SZXNvdXJjZSA9IC0zOTg0CitzdGFydHVwRm9sZGVySWNvblJlc291cmNlID0ga1N0YXJ0dXBGb2xkZXJJY29uUmVzb3VyY2UKK293bmVkRm9sZGVySWNvblJlc291cmNlID0ga093bmVkRm9sZGVySWNvblJlc291cmNlCitkcm9wRm9sZGVySWNvblJlc291cmNlID0ga0Ryb3BGb2xkZXJJY29uUmVzb3VyY2UKK3NoYXJlZEZvbGRlckljb25SZXNvdXJjZSA9IGtTaGFyZWRGb2xkZXJJY29uUmVzb3VyY2UKK21vdW50ZWRGb2xkZXJJY29uUmVzb3VyY2UgPSBrTW91bnRlZEZvbGRlckljb25SZXNvdXJjZQorY29udHJvbFBhbmVsRm9sZGVySWNvblJlc291cmNlID0ga0NvbnRyb2xQYW5lbEZvbGRlckljb25SZXNvdXJjZQorcHJpbnRNb25pdG9yRm9sZGVySWNvblJlc291cmNlID0ga1ByaW50TW9uaXRvckZvbGRlckljb25SZXNvdXJjZQorcHJlZmVyZW5jZXNGb2xkZXJJY29uUmVzb3VyY2UgPSBrUHJlZmVyZW5jZXNGb2xkZXJJY29uUmVzb3VyY2UKK2V4dGVuc2lvbnNGb2xkZXJJY29uUmVzb3VyY2UgPSBrRXh0ZW5zaW9uc0ZvbGRlckljb25SZXNvdXJjZQorZm9udHNGb2xkZXJJY29uUmVzb3VyY2UgPSBrRm9udHNGb2xkZXJJY29uUmVzb3VyY2UKK2Z1bGxUcmFzaEljb25SZXNvdXJjZSA9IGtGdWxsVHJhc2hJY29uUmVzb3VyY2UKK2tUaHVtYm5haWwzMkJpdERhdGEgPSBGT1VSX0NIQVJfQ09ERSgnaXQzMicpCitrVGh1bWJuYWlsOEJpdE1hc2sgPSBGT1VSX0NIQVJfQ09ERSgndDhtaycpCitrSHVnZTFCaXRNYXNrID0gRk9VUl9DSEFSX0NPREUoJ2ljaCMnKQora0h1Z2U0Qml0RGF0YSA9IEZPVVJfQ0hBUl9DT0RFKCdpY2g0JykKK2tIdWdlOEJpdERhdGEgPSBGT1VSX0NIQVJfQ09ERSgnaWNoOCcpCitrSHVnZTMyQml0RGF0YSA9IEZPVVJfQ0hBUl9DT0RFKCdpaDMyJykKK2tIdWdlOEJpdE1hc2sgPSBGT1VSX0NIQVJfQ09ERSgnaDhtaycpCitrTGFyZ2UxQml0TWFzayA9IEZPVVJfQ0hBUl9DT0RFKCdJQ04jJykKK2tMYXJnZTRCaXREYXRhID0gRk9VUl9DSEFSX0NPREUoJ2ljbDQnKQora0xhcmdlOEJpdERhdGEgPSBGT1VSX0NIQVJfQ09ERSgnaWNsOCcpCitrTGFyZ2UzMkJpdERhdGEgPSBGT1VSX0NIQVJfQ09ERSgnaWwzMicpCitrTGFyZ2U4Qml0TWFzayA9IEZPVVJfQ0hBUl9DT0RFKCdsOG1rJykKK2tTbWFsbDFCaXRNYXNrID0gRk9VUl9DSEFSX0NPREUoJ2ljcyMnKQora1NtYWxsNEJpdERhdGEgPSBGT1VSX0NIQVJfQ09ERSgnaWNzNCcpCitrU21hbGw4Qml0RGF0YSA9IEZPVVJfQ0hBUl9DT0RFKCdpY3M4JykKK2tTbWFsbDMyQml0RGF0YSA9IEZPVVJfQ0hBUl9DT0RFKCdpczMyJykKK2tTbWFsbDhCaXRNYXNrID0gRk9VUl9DSEFSX0NPREUoJ3M4bWsnKQora01pbmkxQml0TWFzayA9IEZPVVJfQ0hBUl9DT0RFKCdpY20jJykKK2tNaW5pNEJpdERhdGEgPSBGT1VSX0NIQVJfQ09ERSgnaWNtNCcpCitrTWluaThCaXREYXRhID0gRk9VUl9DSEFSX0NPREUoJ2ljbTgnKQora1RpbGVJY29uVmFyaWFudCA9IEZPVVJfQ0hBUl9DT0RFKCd0aWxlJykKK2tSb2xsb3Zlckljb25WYXJpYW50ID0gRk9VUl9DSEFSX0NPREUoJ292ZXInKQora0Ryb3BJY29uVmFyaWFudCA9IEZPVVJfQ0hBUl9DT0RFKCdkcm9wJykKK2tPcGVuSWNvblZhcmlhbnQgPSBGT1VSX0NIQVJfQ09ERSgnb3BlbicpCitrT3BlbkRyb3BJY29uVmFyaWFudCA9IEZPVVJfQ0hBUl9DT0RFKCdvZHJwJykKK2xhcmdlMUJpdE1hc2sgPSBrTGFyZ2UxQml0TWFzaworbGFyZ2U0Qml0RGF0YSA9IGtMYXJnZTRCaXREYXRhCitsYXJnZThCaXREYXRhID0ga0xhcmdlOEJpdERhdGEKK3NtYWxsMUJpdE1hc2sgPSBrU21hbGwxQml0TWFzaworc21hbGw0Qml0RGF0YSA9IGtTbWFsbDRCaXREYXRhCitzbWFsbDhCaXREYXRhID0ga1NtYWxsOEJpdERhdGEKK21pbmkxQml0TWFzayA9IGtNaW5pMUJpdE1hc2sKK21pbmk0Qml0RGF0YSA9IGtNaW5pNEJpdERhdGEKK21pbmk4Qml0RGF0YSA9IGtNaW5pOEJpdERhdGEKK2tBbGlnbk5vbmUgPSAweDAwCitrQWxpZ25WZXJ0aWNhbENlbnRlciA9IDB4MDEKK2tBbGlnblRvcCA9IDB4MDIKK2tBbGlnbkJvdHRvbSA9IDB4MDMKK2tBbGlnbkhvcml6b250YWxDZW50ZXIgPSAweDA0CitrQWxpZ25BYnNvbHV0ZUNlbnRlciA9IGtBbGlnblZlcnRpY2FsQ2VudGVyIHwga0FsaWduSG9yaXpvbnRhbENlbnRlcgora0FsaWduQ2VudGVyVG9wID0ga0FsaWduVG9wIHwga0FsaWduSG9yaXpvbnRhbENlbnRlcgora0FsaWduQ2VudGVyQm90dG9tID0ga0FsaWduQm90dG9tIHwga0FsaWduSG9yaXpvbnRhbENlbnRlcgora0FsaWduTGVmdCA9IDB4MDgKK2tBbGlnbkNlbnRlckxlZnQgPSBrQWxpZ25WZXJ0aWNhbENlbnRlciB8IGtBbGlnbkxlZnQKK2tBbGlnblRvcExlZnQgPSBrQWxpZ25Ub3AgfCBrQWxpZ25MZWZ0CitrQWxpZ25Cb3R0b21MZWZ0ID0ga0FsaWduQm90dG9tIHwga0FsaWduTGVmdAora0FsaWduUmlnaHQgPSAweDBDCitrQWxpZ25DZW50ZXJSaWdodCA9IGtBbGlnblZlcnRpY2FsQ2VudGVyIHwga0FsaWduUmlnaHQKK2tBbGlnblRvcFJpZ2h0ID0ga0FsaWduVG9wIHwga0FsaWduUmlnaHQKK2tBbGlnbkJvdHRvbVJpZ2h0ID0ga0FsaWduQm90dG9tIHwga0FsaWduUmlnaHQKK2F0Tm9uZSA9IGtBbGlnbk5vbmUKK2F0VmVydGljYWxDZW50ZXIgPSBrQWxpZ25WZXJ0aWNhbENlbnRlcgorYXRUb3AgPSBrQWxpZ25Ub3AKK2F0Qm90dG9tID0ga0FsaWduQm90dG9tCithdEhvcml6b250YWxDZW50ZXIgPSBrQWxpZ25Ib3Jpem9udGFsQ2VudGVyCithdEFic29sdXRlQ2VudGVyID0ga0FsaWduQWJzb2x1dGVDZW50ZXIKK2F0Q2VudGVyVG9wID0ga0FsaWduQ2VudGVyVG9wCithdENlbnRlckJvdHRvbSA9IGtBbGlnbkNlbnRlckJvdHRvbQorYXRMZWZ0ID0ga0FsaWduTGVmdAorYXRDZW50ZXJMZWZ0ID0ga0FsaWduQ2VudGVyTGVmdAorYXRUb3BMZWZ0ID0ga0FsaWduVG9wTGVmdAorYXRCb3R0b21MZWZ0ID0ga0FsaWduQm90dG9tTGVmdAorYXRSaWdodCA9IGtBbGlnblJpZ2h0CithdENlbnRlclJpZ2h0ID0ga0FsaWduQ2VudGVyUmlnaHQKK2F0VG9wUmlnaHQgPSBrQWxpZ25Ub3BSaWdodAorYXRCb3R0b21SaWdodCA9IGtBbGlnbkJvdHRvbVJpZ2h0CitrVHJhbnNmb3JtTm9uZSA9IDB4MDAKK2tUcmFuc2Zvcm1EaXNhYmxlZCA9IDB4MDEKK2tUcmFuc2Zvcm1PZmZsaW5lID0gMHgwMgora1RyYW5zZm9ybU9wZW4gPSAweDAzCitrVHJhbnNmb3JtTGFiZWwxID0gMHgwMTAwCitrVHJhbnNmb3JtTGFiZWwyID0gMHgwMjAwCitrVHJhbnNmb3JtTGFiZWwzID0gMHgwMzAwCitrVHJhbnNmb3JtTGFiZWw0ID0gMHgwNDAwCitrVHJhbnNmb3JtTGFiZWw1ID0gMHgwNTAwCitrVHJhbnNmb3JtTGFiZWw2ID0gMHgwNjAwCitrVHJhbnNmb3JtTGFiZWw3ID0gMHgwNzAwCitrVHJhbnNmb3JtU2VsZWN0ZWQgPSAweDQwMDAKK2tUcmFuc2Zvcm1TZWxlY3RlZERpc2FibGVkID0ga1RyYW5zZm9ybVNlbGVjdGVkIHwga1RyYW5zZm9ybURpc2FibGVkCitrVHJhbnNmb3JtU2VsZWN0ZWRPZmZsaW5lID0ga1RyYW5zZm9ybVNlbGVjdGVkIHwga1RyYW5zZm9ybU9mZmxpbmUKK2tUcmFuc2Zvcm1TZWxlY3RlZE9wZW4gPSBrVHJhbnNmb3JtU2VsZWN0ZWQgfCBrVHJhbnNmb3JtT3BlbgordHROb25lID0ga1RyYW5zZm9ybU5vbmUKK3R0RGlzYWJsZWQgPSBrVHJhbnNmb3JtRGlzYWJsZWQKK3R0T2ZmbGluZSA9IGtUcmFuc2Zvcm1PZmZsaW5lCit0dE9wZW4gPSBrVHJhbnNmb3JtT3BlbgordHRMYWJlbDEgPSBrVHJhbnNmb3JtTGFiZWwxCit0dExhYmVsMiA9IGtUcmFuc2Zvcm1MYWJlbDIKK3R0TGFiZWwzID0ga1RyYW5zZm9ybUxhYmVsMwordHRMYWJlbDQgPSBrVHJhbnNmb3JtTGFiZWw0Cit0dExhYmVsNSA9IGtUcmFuc2Zvcm1MYWJlbDUKK3R0TGFiZWw2ID0ga1RyYW5zZm9ybUxhYmVsNgordHRMYWJlbDcgPSBrVHJhbnNmb3JtTGFiZWw3Cit0dFNlbGVjdGVkID0ga1RyYW5zZm9ybVNlbGVjdGVkCit0dFNlbGVjdGVkRGlzYWJsZWQgPSBrVHJhbnNmb3JtU2VsZWN0ZWREaXNhYmxlZAordHRTZWxlY3RlZE9mZmxpbmUgPSBrVHJhbnNmb3JtU2VsZWN0ZWRPZmZsaW5lCit0dFNlbGVjdGVkT3BlbiA9IGtUcmFuc2Zvcm1TZWxlY3RlZE9wZW4KK2tTZWxlY3RvckxhcmdlMUJpdCA9IDB4MDAwMDAwMDEKK2tTZWxlY3RvckxhcmdlNEJpdCA9IDB4MDAwMDAwMDIKK2tTZWxlY3RvckxhcmdlOEJpdCA9IDB4MDAwMDAwMDQKK2tTZWxlY3RvckxhcmdlMzJCaXQgPSAweDAwMDAwMDA4CitrU2VsZWN0b3JMYXJnZThCaXRNYXNrID0gMHgwMDAwMDAxMAora1NlbGVjdG9yU21hbGwxQml0ID0gMHgwMDAwMDEwMAora1NlbGVjdG9yU21hbGw0Qml0ID0gMHgwMDAwMDIwMAora1NlbGVjdG9yU21hbGw4Qml0ID0gMHgwMDAwMDQwMAora1NlbGVjdG9yU21hbGwzMkJpdCA9IDB4MDAwMDA4MDAKK2tTZWxlY3RvclNtYWxsOEJpdE1hc2sgPSAweDAwMDAxMDAwCitrU2VsZWN0b3JNaW5pMUJpdCA9IDB4MDAwMTAwMDAKK2tTZWxlY3Rvck1pbmk0Qml0ID0gMHgwMDAyMDAwMAora1NlbGVjdG9yTWluaThCaXQgPSAweDAwMDQwMDAwCitrU2VsZWN0b3JIdWdlMUJpdCA9IDB4MDEwMDAwMDAKK2tTZWxlY3Rvckh1Z2U0Qml0ID0gMHgwMjAwMDAwMAora1NlbGVjdG9ySHVnZThCaXQgPSAweDA0MDAwMDAwCitrU2VsZWN0b3JIdWdlMzJCaXQgPSAweDA4MDAwMDAwCitrU2VsZWN0b3JIdWdlOEJpdE1hc2sgPSAweDEwMDAwMDAwCitrU2VsZWN0b3JBbGxMYXJnZURhdGEgPSAweDAwMDAwMEZGCitrU2VsZWN0b3JBbGxTbWFsbERhdGEgPSAweDAwMDBGRjAwCitrU2VsZWN0b3JBbGxNaW5pRGF0YSA9IDB4MDBGRjAwMDAKKyMga1NlbGVjdG9yQWxsSHVnZURhdGEgPSAobG9uZykweEZGMDAwMDAwCitrU2VsZWN0b3JBbGwxQml0RGF0YSA9IGtTZWxlY3RvckxhcmdlMUJpdCB8IGtTZWxlY3RvclNtYWxsMUJpdCB8IGtTZWxlY3Rvck1pbmkxQml0IHwga1NlbGVjdG9ySHVnZTFCaXQKK2tTZWxlY3RvckFsbDRCaXREYXRhID0ga1NlbGVjdG9yTGFyZ2U0Qml0IHwga1NlbGVjdG9yU21hbGw0Qml0IHwga1NlbGVjdG9yTWluaTRCaXQgfCBrU2VsZWN0b3JIdWdlNEJpdAora1NlbGVjdG9yQWxsOEJpdERhdGEgPSBrU2VsZWN0b3JMYXJnZThCaXQgfCBrU2VsZWN0b3JTbWFsbDhCaXQgfCBrU2VsZWN0b3JNaW5pOEJpdCB8IGtTZWxlY3Rvckh1Z2U4Qml0CitrU2VsZWN0b3JBbGwzMkJpdERhdGEgPSBrU2VsZWN0b3JMYXJnZTMyQml0IHwga1NlbGVjdG9yU21hbGwzMkJpdCB8IGtTZWxlY3Rvckh1Z2UzMkJpdAorIyBrU2VsZWN0b3JBbGxBdmFpbGFibGVEYXRhID0gKGxvbmcpMHhGRkZGRkZGRgorc3ZMYXJnZTFCaXQgPSBrU2VsZWN0b3JMYXJnZTFCaXQKK3N2TGFyZ2U0Qml0ID0ga1NlbGVjdG9yTGFyZ2U0Qml0CitzdkxhcmdlOEJpdCA9IGtTZWxlY3RvckxhcmdlOEJpdAorc3ZTbWFsbDFCaXQgPSBrU2VsZWN0b3JTbWFsbDFCaXQKK3N2U21hbGw0Qml0ID0ga1NlbGVjdG9yU21hbGw0Qml0CitzdlNtYWxsOEJpdCA9IGtTZWxlY3RvclNtYWxsOEJpdAorc3ZNaW5pMUJpdCA9IGtTZWxlY3Rvck1pbmkxQml0Citzdk1pbmk0Qml0ID0ga1NlbGVjdG9yTWluaTRCaXQKK3N2TWluaThCaXQgPSBrU2VsZWN0b3JNaW5pOEJpdAorc3ZBbGxMYXJnZURhdGEgPSBrU2VsZWN0b3JBbGxMYXJnZURhdGEKK3N2QWxsU21hbGxEYXRhID0ga1NlbGVjdG9yQWxsU21hbGxEYXRhCitzdkFsbE1pbmlEYXRhID0ga1NlbGVjdG9yQWxsTWluaURhdGEKK3N2QWxsMUJpdERhdGEgPSBrU2VsZWN0b3JBbGwxQml0RGF0YQorc3ZBbGw0Qml0RGF0YSA9IGtTZWxlY3RvckFsbDRCaXREYXRhCitzdkFsbDhCaXREYXRhID0ga1NlbGVjdG9yQWxsOEJpdERhdGEKKyMgc3ZBbGxBdmFpbGFibGVEYXRhID0ga1NlbGVjdG9yQWxsQXZhaWxhYmxlRGF0YQora1N5c3RlbUljb25zQ3JlYXRvciA9IEZPVVJfQ0hBUl9DT0RFKCdtYWNzJykKKyMgZXJyID0gR2V0SWNvblJlZihrT25TeXN0ZW1EaXNrCitrQ2xpcGJvYXJkSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdDTElQJykKK2tDbGlwcGluZ1Vua25vd25UeXBlSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdjbHB1JykKK2tDbGlwcGluZ1BpY3R1cmVUeXBlSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdjbHBwJykKK2tDbGlwcGluZ1RleHRUeXBlSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdjbHB0JykKK2tDbGlwcGluZ1NvdW5kVHlwZUljb24gPSBGT1VSX0NIQVJfQ09ERSgnY2xwcycpCitrRGVza3RvcEljb24gPSBGT1VSX0NIQVJfQ09ERSgnZGVzaycpCitrRmluZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdGTkRSJykKK2tGb250U3VpdGNhc2VJY29uID0gRk9VUl9DSEFSX0NPREUoJ0ZGSUwnKQora0Z1bGxUcmFzaEljb24gPSBGT1VSX0NIQVJfQ09ERSgnZnRyaCcpCitrR2VuZXJpY0FwcGxpY2F0aW9uSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdBUFBMJykKK2tHZW5lcmljQ0RST01JY29uID0gRk9VUl9DSEFSX0NPREUoJ2NkZHInKQora0dlbmVyaWNDb250cm9sUGFuZWxJY29uID0gRk9VUl9DSEFSX0NPREUoJ0FQUEMnKQora0dlbmVyaWNDb250cm9sU3RyaXBNb2R1bGVJY29uID0gRk9VUl9DSEFSX0NPREUoJ3NkZXYnKQora0dlbmVyaWNDb21wb25lbnRJY29uID0gRk9VUl9DSEFSX0NPREUoJ3RobmcnKQora0dlbmVyaWNEZXNrQWNjZXNzb3J5SWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdBUFBEJykKK2tHZW5lcmljRG9jdW1lbnRJY29uID0gRk9VUl9DSEFSX0NPREUoJ2RvY3UnKQora0dlbmVyaWNFZGl0aW9uRmlsZUljb24gPSBGT1VSX0NIQVJfQ09ERSgnZWR0ZicpCitrR2VuZXJpY0V4dGVuc2lvbkljb24gPSBGT1VSX0NIQVJfQ09ERSgnSU5JVCcpCitrR2VuZXJpY0ZpbGVTZXJ2ZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ3NydnInKQora0dlbmVyaWNGb250SWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdmZmlsJykKK2tHZW5lcmljRm9udFNjYWxlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnc2NscicpCitrR2VuZXJpY0Zsb3BweUljb24gPSBGT1VSX0NIQVJfQ09ERSgnZmxweScpCitrR2VuZXJpY0hhcmREaXNrSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdoZHNrJykKK2tHZW5lcmljSURpc2tJY29uID0gRk9VUl9DSEFSX0NPREUoJ2lkc2snKQora0dlbmVyaWNSZW1vdmFibGVNZWRpYUljb24gPSBGT1VSX0NIQVJfQ09ERSgncm1vdicpCitrR2VuZXJpY01vdmVyT2JqZWN0SWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdtb3ZyJykKK2tHZW5lcmljUENDYXJkSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdwY21jJykKK2tHZW5lcmljUHJlZmVyZW5jZXNJY29uID0gRk9VUl9DSEFSX0NPREUoJ3ByZWYnKQora0dlbmVyaWNRdWVyeURvY3VtZW50SWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdxZXJ5JykKK2tHZW5lcmljUkFNRGlza0ljb24gPSBGT1VSX0NIQVJfQ09ERSgncmFtZCcpCitrR2VuZXJpY1NoYXJlZExpYmFyeUljb24gPSBGT1VSX0NIQVJfQ09ERSgnc2hsYicpCitrR2VuZXJpY1N0YXRpb25lcnlJY29uID0gRk9VUl9DSEFSX0NPREUoJ3Nkb2MnKQora0dlbmVyaWNTdWl0Y2FzZUljb24gPSBGT1VSX0NIQVJfQ09ERSgnc3VpdCcpCitrR2VuZXJpY1VSTEljb24gPSBGT1VSX0NIQVJfQ09ERSgnZ3VybCcpCitrR2VuZXJpY1dPUk1JY29uID0gRk9VUl9DSEFSX0NPREUoJ3dvcm0nKQora0ludGVybmF0aW9uYWxSZXNvdXJjZXNJY29uID0gRk9VUl9DSEFSX0NPREUoJ2lmaWwnKQora0tleWJvYXJkTGF5b3V0SWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdrZmlsJykKK2tTb3VuZEZpbGVJY29uID0gRk9VUl9DSEFSX0NPREUoJ3NmaWwnKQora1N5c3RlbVN1aXRjYXNlSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCd6c3lzJykKK2tUcmFzaEljb24gPSBGT1VSX0NIQVJfQ09ERSgndHJzaCcpCitrVHJ1ZVR5cGVGb250SWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCd0ZmlsJykKK2tUcnVlVHlwZUZsYXRGb250SWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzZm50JykKK2tUcnVlVHlwZU11bHRpRmxhdEZvbnRJY29uID0gRk9VUl9DSEFSX0NPREUoJ3R0Y2YnKQora1VzZXJJRGlza0ljb24gPSBGT1VSX0NIQVJfQ09ERSgndWRzaycpCitrSW50ZXJuYXRpb25SZXNvdXJjZXNJY29uID0ga0ludGVybmF0aW9uYWxSZXNvdXJjZXNJY29uCitrSW50ZXJuZXRMb2NhdGlvbkhUVFBJY29uID0gRk9VUl9DSEFSX0NPREUoJ2lsaHQnKQora0ludGVybmV0TG9jYXRpb25GVFBJY29uID0gRk9VUl9DSEFSX0NPREUoJ2lsZnQnKQora0ludGVybmV0TG9jYXRpb25BcHBsZVNoYXJlSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdpbGFmJykKK2tJbnRlcm5ldExvY2F0aW9uQXBwbGVUYWxrWm9uZUljb24gPSBGT1VSX0NIQVJfQ09ERSgnaWxhdCcpCitrSW50ZXJuZXRMb2NhdGlvbkZpbGVJY29uID0gRk9VUl9DSEFSX0NPREUoJ2lsZmknKQora0ludGVybmV0TG9jYXRpb25NYWlsSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdpbG1hJykKK2tJbnRlcm5ldExvY2F0aW9uTmV3c0ljb24gPSBGT1VSX0NIQVJfQ09ERSgnaWxudycpCitrSW50ZXJuZXRMb2NhdGlvbk5TTE5laWdoYm9yaG9vZEljb24gPSBGT1VSX0NIQVJfQ09ERSgnaWxucycpCitrSW50ZXJuZXRMb2NhdGlvbkdlbmVyaWNJY29uID0gRk9VUl9DSEFSX0NPREUoJ2lsZ2UnKQora0dlbmVyaWNGb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ2ZsZHInKQora0Ryb3BGb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ2Rib3gnKQora01vdW50ZWRGb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ21udGQnKQora09wZW5Gb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ29mbGQnKQora093bmVkRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdvd25kJykKK2tQcml2YXRlRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdwcnZmJykKK2tTaGFyZWRGb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ3NoZmwnKQora1NoYXJpbmdQcml2c05vdEFwcGxpY2FibGVJY29uID0gRk9VUl9DSEFSX0NPREUoJ3NobmEnKQora1NoYXJpbmdQcml2c1JlYWRPbmx5SWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzaHJvJykKK2tTaGFyaW5nUHJpdnNSZWFkV3JpdGVJY29uID0gRk9VUl9DSEFSX0NPREUoJ3NocncnKQora1NoYXJpbmdQcml2c1Vua25vd25JY29uID0gRk9VUl9DSEFSX0NPREUoJ3NodWsnKQora1NoYXJpbmdQcml2c1dyaXRhYmxlSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCd3cml0JykKK2tVc2VyRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCd1ZmxkJykKK2tXb3JrZ3JvdXBGb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ3dmbGQnKQora0d1ZXN0VXNlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnZ3VzcicpCitrVXNlckljb24gPSBGT1VSX0NIQVJfQ09ERSgndXNlcicpCitrT3duZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ3N1c3InKQora0dyb3VwSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdncnVwJykKK2tBcHBlYXJhbmNlRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdhcHByJykKK2tBcHBsZUV4dHJhc0ZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnYWV4XHhjNCcpCitrQXBwbGVNZW51Rm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdhbW51JykKK2tBcHBsaWNhdGlvbnNGb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ2FwcHMnKQora0FwcGxpY2F0aW9uU3VwcG9ydEZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnYXN1cCcpCitrQXNzaXN0YW50c0ZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnYXN0XHhjNCcpCitrQ29sb3JTeW5jRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdwcm9mJykKK2tDb250ZXh0dWFsTWVudUl0ZW1zRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdjbW51JykKK2tDb250cm9sUGFuZWxEaXNhYmxlZEZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnY3RyRCcpCitrQ29udHJvbFBhbmVsRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdjdHJsJykKK2tDb250cm9sU3RyaXBNb2R1bGVzRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzZHZceGM0JykKK2tEb2N1bWVudHNGb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ2RvY3MnKQora0V4dGVuc2lvbnNEaXNhYmxlZEZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnZXh0RCcpCitrRXh0ZW5zaW9uc0ZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnZXh0bicpCitrRmF2b3JpdGVzRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdmYXZzJykKK2tGb250c0ZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnZm9udCcpCitrSGVscEZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnXHhjNGhscCcpCitrSW50ZXJuZXRGb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ2ludFx4YzQnKQora0ludGVybmV0UGx1Z0luRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdceGM0bmV0JykKK2tJbnRlcm5ldFNlYXJjaFNpdGVzRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdpc3NmJykKK2tMb2NhbGVzRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdceGM0bG9jJykKK2tNYWNPU1JlYWRNZUZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnbW9yXHhjNCcpCitrUHVibGljRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdwdWJmJykKK2tQcmVmZXJlbmNlc0ZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgncHJmXHhjNCcpCitrUHJpbnRlckRlc2NyaXB0aW9uRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdwcGRmJykKK2tQcmludGVyRHJpdmVyRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdceGM0cHJkJykKK2tQcmludE1vbml0b3JGb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ3BybnQnKQora1JlY2VudEFwcGxpY2F0aW9uc0ZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgncmFwcCcpCitrUmVjZW50RG9jdW1lbnRzRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdyZG9jJykKK2tSZWNlbnRTZXJ2ZXJzRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdyc3J2JykKK2tTY3JpcHRpbmdBZGRpdGlvbnNGb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ1x4YzRzY3InKQora1NoYXJlZExpYnJhcmllc0ZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnXHhjNGxpYicpCitrU2NyaXB0c0ZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnc2NyXHhjNCcpCitrU2h1dGRvd25JdGVtc0Rpc2FibGVkRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzaGREJykKK2tTaHV0ZG93bkl0ZW1zRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzaGRmJykKK2tTcGVha2FibGVJdGVtc0ZvbGRlciA9IEZPVVJfQ0hBUl9DT0RFKCdzcGtpJykKK2tTdGFydHVwSXRlbXNEaXNhYmxlZEZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnc3RyRCcpCitrU3RhcnR1cEl0ZW1zRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzdHJ0JykKK2tTeXN0ZW1FeHRlbnNpb25EaXNhYmxlZEZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnbWFjRCcpCitrU3lzdGVtRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdtYWNzJykKK2tUZXh0RW5jb2RpbmdzRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdceGM0dGV4JykKK2tVc2Vyc0ZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgndXNyXHhjNCcpCitrVXRpbGl0aWVzRm9sZGVySWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCd1dGlceGM0JykKK2tWb2ljZXNGb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ2Z2b2MnKQora1N5c3RlbUZvbGRlclhJY29uID0gRk9VUl9DSEFSX0NPREUoJ21hY3gnKQora0FwcGxlU2NyaXB0QmFkZ2VJY29uID0gRk9VUl9DSEFSX0NPREUoJ3NjcnAnKQora0xvY2tlZEJhZGdlSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdsYmRnJykKK2tNb3VudGVkQmFkZ2VJY29uID0gRk9VUl9DSEFSX0NPREUoJ21iZGcnKQora1NoYXJlZEJhZGdlSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzYmRnJykKK2tBbGlhc0JhZGdlSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdhYmRnJykKK2tBbGVydENhdXRpb25CYWRnZUljb24gPSBGT1VSX0NIQVJfQ09ERSgnY2JkZycpCitrQWxlcnROb3RlSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdub3RlJykKK2tBbGVydENhdXRpb25JY29uID0gRk9VUl9DSEFSX0NPREUoJ2NhdXQnKQora0FsZXJ0U3RvcEljb24gPSBGT1VSX0NIQVJfQ09ERSgnc3RvcCcpCitrQXBwbGVUYWxrSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdhdGxrJykKK2tBcHBsZVRhbGtab25lSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdhdHpuJykKK2tBRlBTZXJ2ZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ2FmcHMnKQora0ZUUFNlcnZlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnZnRwcycpCitrSFRUUFNlcnZlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnaHRwcycpCitrR2VuZXJpY05ldHdvcmtJY29uID0gRk9VUl9DSEFSX0NPREUoJ2duZXQnKQora0lQRmlsZVNlcnZlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnaXNydicpCitrVG9vbGJhckN1c3RvbWl6ZUljb24gPSBGT1VSX0NIQVJfQ09ERSgndGN1cycpCitrVG9vbGJhckRlbGV0ZUljb24gPSBGT1VSX0NIQVJfQ09ERSgndGRlbCcpCitrVG9vbGJhckZhdm9yaXRlc0ljb24gPSBGT1VSX0NIQVJfQ09ERSgndGZhdicpCitrVG9vbGJhckhvbWVJY29uID0gRk9VUl9DSEFSX0NPREUoJ3Rob20nKQora0FwcGxlTG9nb0ljb24gPSBGT1VSX0NIQVJfQ09ERSgnY2FwbCcpCitrQXBwbGVNZW51SWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzYXBsJykKK2tCYWNrd2FyZEFycm93SWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdiYXJvJykKK2tGYXZvcml0ZUl0ZW1zSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdmYXZyJykKK2tGb3J3YXJkQXJyb3dJY29uID0gRk9VUl9DSEFSX0NPREUoJ2Zhcm8nKQora0dyaWRJY29uID0gRk9VUl9DSEFSX0NPREUoJ2dyaWQnKQora0hlbHBJY29uID0gRk9VUl9DSEFSX0NPREUoJ2hlbHAnKQora0tlZXBBcnJhbmdlZEljb24gPSBGT1VSX0NIQVJfQ09ERSgnYXJuZycpCitrTG9ja2VkSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdsb2NrJykKK2tOb0ZpbGVzSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCduZmlsJykKK2tOb0ZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgnbmZsZCcpCitrTm9Xcml0ZUljb24gPSBGT1VSX0NIQVJfQ09ERSgnbndydCcpCitrUHJvdGVjdGVkQXBwbGljYXRpb25Gb2xkZXJJY29uID0gRk9VUl9DSEFSX0NPREUoJ3BhcHAnKQora1Byb3RlY3RlZFN5c3RlbUZvbGRlckljb24gPSBGT1VSX0NIQVJfQ09ERSgncHN5cycpCitrUmVjZW50SXRlbXNJY29uID0gRk9VUl9DSEFSX0NPREUoJ3JjbnQnKQora1Nob3J0Y3V0SWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdzaHJ0JykKK2tTb3J0QXNjZW5kaW5nSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdhc25kJykKK2tTb3J0RGVzY2VuZGluZ0ljb24gPSBGT1VSX0NIQVJfQ09ERSgnZHNuZCcpCitrVW5sb2NrZWRJY29uID0gRk9VUl9DSEFSX0NPREUoJ3VsY2snKQora0Nvbm5lY3RUb0ljb24gPSBGT1VSX0NIQVJfQ09ERSgnY25jdCcpCitrR2VuZXJpY1dpbmRvd0ljb24gPSBGT1VSX0NIQVJfQ09ERSgnZ3dpbicpCitrUXVlc3Rpb25NYXJrSWNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdxdWVzJykKK2tEZWxldGVBbGlhc0ljb24gPSBGT1VSX0NIQVJfQ09ERSgnZGFsaScpCitrRWplY3RNZWRpYUljb24gPSBGT1VSX0NIQVJfQ09ERSgnZWplYycpCitrQnVybmluZ0ljb24gPSBGT1VSX0NIQVJfQ09ERSgnYnVybicpCitrUmlnaHRDb250YWluZXJBcnJvd0ljb24gPSBGT1VSX0NIQVJfQ09ERSgncmNhcicpCitrSWNvblNlcnZpY2VzTm9ybWFsVXNhZ2VGbGFnID0gMAora0ljb25TZXJ2aWNlc0NhdGFsb2dJbmZvTWFzayA9IChrRlNDYXRJbmZvTm9kZUlEIHwga0ZTQ2F0SW5mb1BhcmVudERpcklEIHwga0ZTQ2F0SW5mb1ZvbHVtZSB8IGtGU0NhdEluZm9Ob2RlRmxhZ3MgfCBrRlNDYXRJbmZvRmluZGVySW5mbyB8IGtGU0NhdEluZm9GaW5kZXJYSW5mbyB8IGtGU0NhdEluZm9Vc2VyQWNjZXNzKQora1Bsb3RJY29uUmVmTm9ybWFsRmxhZ3MgPSAwTAora1Bsb3RJY29uUmVmTm9JbWFnZSA9ICgxIDw8IDEpCitrUGxvdEljb25SZWZOb01hc2sgPSAoMSA8PCAyKQora0ljb25GYW1pbHlUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ljbnMnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSWNvbnMucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSWNvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNDk1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9JY29ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSWNvbnMucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vSWNvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNDk1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9JY29ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGF1bmNoLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGF1bmNoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTNmOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9MYXVuY2gucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfTGF1bmNoIGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9MYXVuY2gucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGF1bmNoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzRkMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGF1bmNoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9MYXVuY2gucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGF1bmNoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzRkMjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGF1bmNoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9MYXVuY2hTZXJ2aWNlcy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xhdW5jaFNlcnZpY2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZmY0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9MYXVuY2hTZXJ2aWNlcy5weQpAQCAtMCwwICsxLDc0IEBACisjIEdlbmVyYXRlZCBmcm9tICdMYXVuY2hTZXJ2aWNlcy5oJworCitkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4Citmcm9tIENhcmJvbi5GaWxlcyBpbXBvcnQgKgora0xTUmVxdWVzdEFsbEluZm8gPSAtMQora0xTUm9sZXNBbGwgPSAtMQora0xTVW5rbm93blR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnXDBcMFwwXDAnKQora0xTVW5rbm93bkNyZWF0b3IgPSBGT1VSX0NIQVJfQ09ERSgnXDBcMFwwXDAnKQora0xTSW52YWxpZEV4dGVuc2lvbkluZGV4ID0gLTEKK2tMU1Vua25vd25FcnIgPSAtMTA4MTAKK2tMU05vdEFuQXBwbGljYXRpb25FcnIgPSAtMTA4MTEKK2tMU05vdEluaXRpYWxpemVkRXJyID0gLTEwODEyCitrTFNEYXRhVW5hdmFpbGFibGVFcnIgPSAtMTA4MTMKK2tMU0FwcGxpY2F0aW9uTm90Rm91bmRFcnIgPSAtMTA4MTQKK2tMU1Vua25vd25UeXBlRXJyID0gLTEwODE1CitrTFNEYXRhVG9vT2xkRXJyID0gLTEwODE2CitrTFNEYXRhRXJyID0gLTEwODE3CitrTFNMYXVuY2hJblByb2dyZXNzRXJyID0gLTEwODE4CitrTFNOb3RSZWdpc3RlcmVkRXJyID0gLTEwODE5CitrTFNBcHBEb2VzTm90Q2xhaW1UeXBlRXJyID0gLTEwODIwCitrTFNBcHBEb2VzTm90U3VwcG9ydFNjaGVtZVdhcm5pbmcgPSAtMTA4MjEKK2tMU1NlcnZlckNvbW11bmljYXRpb25FcnIgPSAtMTA4MjIKK2tMU0Nhbm5vdFNldEluZm9FcnIgPSAtMTA4MjMKK2tMU0luaXRpYWxpemVEZWZhdWx0cyA9IDB4MDAwMDAwMDEKK2tMU01pbkNhdEluZm9CaXRtYXAgPSAoa0ZTQ2F0SW5mb05vZGVGbGFncyB8IGtGU0NhdEluZm9QYXJlbnREaXJJRCB8IGtGU0NhdEluZm9GaW5kZXJJbmZvIHwga0ZTQ2F0SW5mb0ZpbmRlclhJbmZvKQorIyBrTFNJbnZhbGlkRXh0ZW5zaW9uSW5kZXggPSAodW5zaWduZWQgbG9uZykweEZGRkZGRkZGCitrTFNSZXF1ZXN0RXh0ZW5zaW9uID0gMHgwMDAwMDAwMQora0xTUmVxdWVzdFR5cGVDcmVhdG9yID0gMHgwMDAwMDAwMgora0xTUmVxdWVzdEJhc2ljRmxhZ3NPbmx5ID0gMHgwMDAwMDAwNAora0xTUmVxdWVzdEFwcFR5cGVGbGFncyA9IDB4MDAwMDAwMDgKK2tMU1JlcXVlc3RBbGxGbGFncyA9IDB4MDAwMDAwMTAKK2tMU1JlcXVlc3RJY29uQW5kS2luZCA9IDB4MDAwMDAwMjAKK2tMU1JlcXVlc3RFeHRlbnNpb25GbGFnc09ubHkgPSAweDAwMDAwMDQwCisjIGtMU1JlcXVlc3RBbGxJbmZvID0gKHVuc2lnbmVkIGxvbmcpMHhGRkZGRkZGRgora0xTSXRlbUluZm9Jc1BsYWluRmlsZSA9IDB4MDAwMDAwMDEKK2tMU0l0ZW1JbmZvSXNQYWNrYWdlID0gMHgwMDAwMDAwMgora0xTSXRlbUluZm9Jc0FwcGxpY2F0aW9uID0gMHgwMDAwMDAwNAora0xTSXRlbUluZm9Jc0NvbnRhaW5lciA9IDB4MDAwMDAwMDgKK2tMU0l0ZW1JbmZvSXNBbGlhc0ZpbGUgPSAweDAwMDAwMDEwCitrTFNJdGVtSW5mb0lzU3ltbGluayA9IDB4MDAwMDAwMjAKK2tMU0l0ZW1JbmZvSXNJbnZpc2libGUgPSAweDAwMDAwMDQwCitrTFNJdGVtSW5mb0lzTmF0aXZlQXBwID0gMHgwMDAwMDA4MAora0xTSXRlbUluZm9Jc0NsYXNzaWNBcHAgPSAweDAwMDAwMTAwCitrTFNJdGVtSW5mb0FwcFByZWZlcnNOYXRpdmUgPSAweDAwMDAwMjAwCitrTFNJdGVtSW5mb0FwcFByZWZlcnNDbGFzc2ljID0gMHgwMDAwMDQwMAora0xTSXRlbUluZm9BcHBJc1NjcmlwdGFibGUgPSAweDAwMDAwODAwCitrTFNJdGVtSW5mb0lzVm9sdW1lID0gMHgwMDAwMTAwMAora0xTSXRlbUluZm9FeHRlbnNpb25Jc0hpZGRlbiA9IDB4MDAxMDAwMDAKK2tMU1JvbGVzTm9uZSA9IDB4MDAwMDAwMDEKK2tMU1JvbGVzVmlld2VyID0gMHgwMDAwMDAwMgora0xTUm9sZXNFZGl0b3IgPSAweDAwMDAwMDA0CisjIGtMU1JvbGVzQWxsID0gKHVuc2lnbmVkIGxvbmcpMHhGRkZGRkZGRgora0xTVW5rbm93bktpbmRJRCA9IDAKKyMga0xTVW5rbm93blR5cGUgPSAwCisjIGtMU1Vua25vd25DcmVhdG9yID0gMAora0xTQWNjZXB0RGVmYXVsdCA9IDB4MDAwMDAwMDEKK2tMU0FjY2VwdEFsbG93TG9naW5VSSA9IDB4MDAwMDAwMDIKK2tMU0xhdW5jaERlZmF1bHRzID0gMHgwMDAwMDAwMQora0xTTGF1bmNoQW5kUHJpbnQgPSAweDAwMDAwMDAyCitrTFNMYXVuY2hSZXNlcnZlZDIgPSAweDAwMDAwMDA0CitrTFNMYXVuY2hSZXNlcnZlZDMgPSAweDAwMDAwMDA4CitrTFNMYXVuY2hSZXNlcnZlZDQgPSAweDAwMDAwMDEwCitrTFNMYXVuY2hSZXNlcnZlZDUgPSAweDAwMDAwMDIwCitrTFNMYXVuY2hSZXNlcnZlZDYgPSAweDAwMDAwMDQwCitrTFNMYXVuY2hJbmhpYml0QkdPbmx5ID0gMHgwMDAwMDA4MAora0xTTGF1bmNoRG9udEFkZFRvUmVjZW50cyA9IDB4MDAwMDAxMDAKK2tMU0xhdW5jaERvbnRTd2l0Y2ggPSAweDAwMDAwMjAwCitrTFNMYXVuY2hOb1BhcmFtcyA9IDB4MDAwMDA4MDAKK2tMU0xhdW5jaEFzeW5jID0gMHgwMDAxMDAwMAora0xTTGF1bmNoU3RhcnRDbGFzc2ljID0gMHgwMDAyMDAwMAora0xTTGF1bmNoSW5DbGFzc2ljID0gMHgwMDA0MDAwMAora0xTTGF1bmNoTmV3SW5zdGFuY2UgPSAweDAwMDgwMDAwCitrTFNMYXVuY2hBbmRIaWRlID0gMHgwMDEwMDAwMAora0xTTGF1bmNoQW5kSGlkZU90aGVycyA9IDB4MDAyMDAwMDAKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xhdW5jaFNlcnZpY2VzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xhdW5jaFNlcnZpY2VzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWJhNDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGF1bmNoU2VydmljZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xhdW5jaFNlcnZpY2VzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xhdW5jaFNlcnZpY2VzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWJhNDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGF1bmNoU2VydmljZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xpc3QucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9MaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZDZlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9MaXN0LnB5CkBAIC0wLDAgKzEgQEAKK2Zyb20gX0xpc3QgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xpc3QucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGlzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5ZDVmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xpc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xpc3QucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGlzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU5ZDVmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xpc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xpc3RzLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGlzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzMjk0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xpc3RzLnB5CkBAIC0wLDAgKzEsMzUgQEAKKyMgR2VuZXJhdGVkIGZyb20gJ0xpc3RzLmgnCisKK2RlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHgKK2xpc3ROb3RpZnlOb3RoaW5nID0gRk9VUl9DSEFSX0NPREUoJ25hZGEnKQorbGlzdE5vdGlmeUNsaWNrID0gRk9VUl9DSEFSX0NPREUoJ2NsaWsnKQorbGlzdE5vdGlmeURvdWJsZUNsaWNrID0gRk9VUl9DSEFSX0NPREUoJ2RibGMnKQorbGlzdE5vdGlmeVByZUNsaWNrID0gRk9VUl9DSEFSX0NPREUoJ3BjbGsnKQorbERyYXdpbmdNb2RlT2ZmQml0ID0gMworbERvVkF1dG9zY3JvbGxCaXQgPSAxCitsRG9IQXV0b3Njcm9sbEJpdCA9IDAKK2xEcmF3aW5nTW9kZU9mZiA9IDgKK2xEb1ZBdXRvc2Nyb2xsID0gMgorbERvSEF1dG9zY3JvbGwgPSAxCitsT25seU9uZUJpdCA9IDcKK2xFeHRlbmREcmFnQml0ID0gNgorbE5vRGlzam9pbnRCaXQgPSA1CitsTm9FeHRlbmRCaXQgPSA0CitsTm9SZWN0Qml0ID0gMworbFVzZVNlbnNlQml0ID0gMgorbE5vTmlsSGlsaXRlQml0ID0gMQorbE9ubHlPbmUgPSAtMTI4CitsRXh0ZW5kRHJhZyA9IDY0CitsTm9EaXNqb2ludCA9IDMyCitsTm9FeHRlbmQgPSAxNgorbE5vUmVjdCA9IDgKK2xVc2VTZW5zZSA9IDQKK2xOb05pbEhpbGl0ZSA9IDIKK2xJbml0TXNnID0gMAorbERyYXdNc2cgPSAxCitsSGlsaXRlTXNnID0gMgorbENsb3NlTXNnID0gMwora0xpc3REZWZQcm9jUHRyID0gMAora0xpc3REZWZVc2VyUHJvY1R5cGUgPSBrTGlzdERlZlByb2NQdHIKK2tMaXN0RGVmU3RhbmRhcmRUZXh0VHlwZSA9IDEKK2tMaXN0RGVmU3RhbmRhcmRJY29uVHlwZSA9IDIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xpc3RzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xpc3RzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdjZWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGlzdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xpc3RzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL0xpc3RzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdjZWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTGlzdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01hY0hlbHAucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NYWNIZWxwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Yjk5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NYWNIZWxwLnB5CkBAIC0wLDAgKzEsNTggQEAKKyMgR2VuZXJhdGVkIGZyb20gJ01hY0hlbHAuaCcKKworZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAora01hY0hlbHBWZXJzaW9uID0gMHgwMDAzCitrSE1TdXBwbHlDb250ZW50ID0gMAora0hNRGlzcG9zZUNvbnRlbnQgPSAxCitrSE1Ob0NvbnRlbnQgPSBGT1VSX0NIQVJfQ09ERSgnbm9uZScpCitrSE1DRlN0cmluZ0NvbnRlbnQgPSBGT1VSX0NIQVJfQ09ERSgnY2ZzdCcpCitrSE1QYXNjYWxTdHJDb250ZW50ID0gRk9VUl9DSEFSX0NPREUoJ3BzdHInKQora0hNU3RyaW5nUmVzQ29udGVudCA9IEZPVVJfQ0hBUl9DT0RFKCdzdHIjJykKK2tITVRFSGFuZGxlQ29udGVudCA9IEZPVVJfQ0hBUl9DT0RFKCd0eHRoJykKK2tITVRleHRSZXNDb250ZW50ID0gRk9VUl9DSEFSX0NPREUoJ3RleHQnKQora0hNU3RyUmVzQ29udGVudCA9IEZPVVJfQ0hBUl9DT0RFKCdzdHIgJykKK2tITURlZmF1bHRTaWRlID0gMAora0hNT3V0c2lkZVRvcFNjcmlwdEFsaWduZWQgPSAxCitrSE1PdXRzaWRlTGVmdENlbnRlckFsaWduZWQgPSAyCitrSE1PdXRzaWRlQm90dG9tU2NyaXB0QWxpZ25lZCA9IDMKK2tITU91dHNpZGVSaWdodENlbnRlckFsaWduZWQgPSA0CitrSE1PdXRzaWRlVG9wTGVmdEFsaWduZWQgPSA1CitrSE1PdXRzaWRlVG9wUmlnaHRBbGlnbmVkID0gNgora0hNT3V0c2lkZUxlZnRUb3BBbGlnbmVkID0gNwora0hNT3V0c2lkZUxlZnRCb3R0b21BbGlnbmVkID0gOAora0hNT3V0c2lkZUJvdHRvbUxlZnRBbGlnbmVkID0gOQora0hNT3V0c2lkZUJvdHRvbVJpZ2h0QWxpZ25lZCA9IDEwCitrSE1PdXRzaWRlUmlnaHRUb3BBbGlnbmVkID0gMTEKK2tITU91dHNpZGVSaWdodEJvdHRvbUFsaWduZWQgPSAxMgora0hNT3V0c2lkZVRvcENlbnRlckFsaWduZWQgPSAxMwora0hNT3V0c2lkZUJvdHRvbUNlbnRlckFsaWduZWQgPSAxNAora0hNSW5zaWRlUmlnaHRDZW50ZXJBbGlnbmVkID0gMTUKK2tITUluc2lkZUxlZnRDZW50ZXJBbGlnbmVkID0gMTYKK2tITUluc2lkZUJvdHRvbUNlbnRlckFsaWduZWQgPSAxNwora0hNSW5zaWRlVG9wQ2VudGVyQWxpZ25lZCA9IDE4CitrSE1JbnNpZGVUb3BMZWZ0Q29ybmVyID0gMTkKK2tITUluc2lkZVRvcFJpZ2h0Q29ybmVyID0gMjAKK2tITUluc2lkZUJvdHRvbUxlZnRDb3JuZXIgPSAyMQora0hNSW5zaWRlQm90dG9tUmlnaHRDb3JuZXIgPSAyMgora0hNQWJzb2x1dGVDZW50ZXJBbGlnbmVkID0gMjMKK2tITVRvcFNpZGUgPSBrSE1PdXRzaWRlVG9wU2NyaXB0QWxpZ25lZAora0hNTGVmdFNpZGUgPSBrSE1PdXRzaWRlTGVmdENlbnRlckFsaWduZWQKK2tITUJvdHRvbVNpZGUgPSBrSE1PdXRzaWRlQm90dG9tU2NyaXB0QWxpZ25lZAora0hNUmlnaHRTaWRlID0ga0hNT3V0c2lkZVJpZ2h0Q2VudGVyQWxpZ25lZAora0hNVG9wTGVmdENvcm5lciA9IGtITU91dHNpZGVUb3BMZWZ0QWxpZ25lZAora0hNVG9wUmlnaHRDb3JuZXIgPSBrSE1PdXRzaWRlVG9wUmlnaHRBbGlnbmVkCitrSE1MZWZ0VG9wQ29ybmVyID0ga0hNT3V0c2lkZUxlZnRUb3BBbGlnbmVkCitrSE1MZWZ0Qm90dG9tQ29ybmVyID0ga0hNT3V0c2lkZUxlZnRCb3R0b21BbGlnbmVkCitrSE1Cb3R0b21MZWZ0Q29ybmVyID0ga0hNT3V0c2lkZUJvdHRvbUxlZnRBbGlnbmVkCitrSE1Cb3R0b21SaWdodENvcm5lciA9IGtITU91dHNpZGVCb3R0b21SaWdodEFsaWduZWQKK2tITVJpZ2h0VG9wQ29ybmVyID0ga0hNT3V0c2lkZVJpZ2h0VG9wQWxpZ25lZAora0hNUmlnaHRCb3R0b21Db3JuZXIgPSBrSE1PdXRzaWRlUmlnaHRCb3R0b21BbGlnbmVkCitrSE1Db250ZW50UHJvdmlkZWQgPSAwCitrSE1Db250ZW50Tm90UHJvdmlkZWQgPSAxCitrSE1Db250ZW50Tm90UHJvdmlkZWREb250UHJvcGFnYXRlID0gMgora0hNTWluaW11bUNvbnRlbnRJbmRleCA9IDAKK2tITU1heGltdW1Db250ZW50SW5kZXggPSAxCitlcnJITUlsbGVnYWxDb250ZW50Rm9yTWluaW11bVN0YXRlID0gLTEwOTgwCitlcnJITUlsbGVnYWxDb250ZW50Rm9yTWF4aW11bVN0YXRlID0gLTEwOTgxCitrSE1JbGxlZ2FsQ29udGVudEZvck1pbmltdW1TdGF0ZSA9IGVyckhNSWxsZWdhbENvbnRlbnRGb3JNaW5pbXVtU3RhdGUKK2tIZWxwVGFnRXZlbnRIYW5kbGVyVGFnID0gRk9VUl9DSEFSX0NPREUoJ2hldnQnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWFjSGVscC5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NYWNIZWxwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTZjOWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWFjSGVscC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWFjSGVscC5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NYWNIZWxwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTZjOWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWFjSGVscC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWFjVGV4dEVkaXRvci5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01hY1RleHRFZGl0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwOWQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01hY1RleHRFZGl0b3IucHkKQEAgLTAsMCArMSwyMjYgQEAKKyMgR2VuZXJhdGVkIGZyb20gJ01hY1RleHRFZGl0b3IuaCcKKworCitkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4CitmYWxzZSA9IDAKK3RydWUgPSAxCitrVFhOQ2xlYXJUaGlzQ29udHJvbCA9IDB4RkZGRkZGRkYKK2tUWE5DbGVhclRoZXNlRm9udEZlYXR1cmVzID0gMHg4MDAwMDAwMAora1RYTkRvbnRDYXJlVHlwZVNpemUgPSAweEZGRkZGRkZGCitrVFhORGVjcmVtZW50VHlwZVNpemUgPSAweDgwMDAwMDAwCitrVFhOVXNlQ3VycmVudFNlbGVjdGlvbiA9IDB4RkZGRkZGRkYKK2tUWE5TdGFydE9mZnNldCA9IDAKK2tUWE5FbmRPZmZzZXQgPSAweDdGRkZGRkZGCitNb3ZpZUZpbGVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ21vb3YnKQora1RYTlVzZUVuY29kaW5nV29yZFJ1bGVzTWFzayA9IDB4ODAwMDAwMDAKK2tUWE5Gb250U2l6ZUF0dHJpYnV0ZVNpemUgPSA0Citub3JtYWwgPSAwCitrVFhOV2lsbERlZmF1bHRUb0FUU1VJQml0ID0gMAora1RYTldpbGxEZWZhdWx0VG9DYXJib25FdmVudEJpdCA9IDEKK2tUWE5XaWxsRGVmYXVsdFRvQVRTVUlNYXNrID0gMUwgPDwga1RYTldpbGxEZWZhdWx0VG9BVFNVSUJpdAora1RYTldpbGxEZWZhdWx0VG9DYXJib25FdmVudE1hc2sgPSAxTCA8PCBrVFhOV2lsbERlZmF1bHRUb0NhcmJvbkV2ZW50Qml0CitrVFhOV2FudE1vdmllc0JpdCA9IDAKK2tUWE5XYW50U291bmRCaXQgPSAxCitrVFhOV2FudEdyYXBoaWNzQml0ID0gMgora1RYTkFsd2F5c1VzZVF1aWNrRHJhd1RleHRCaXQgPSAzCitrVFhOVXNlVGVtcG9yYXJ5TWVtb3J5Qml0ID0gNAora1RYTldhbnRNb3ZpZXNNYXNrID0gMUwgPDwga1RYTldhbnRNb3ZpZXNCaXQKK2tUWE5XYW50U291bmRNYXNrID0gMUwgPDwga1RYTldhbnRTb3VuZEJpdAora1RYTldhbnRHcmFwaGljc01hc2sgPSAxTCA8PCBrVFhOV2FudEdyYXBoaWNzQml0CitrVFhOQWx3YXlzVXNlUXVpY2tEcmF3VGV4dE1hc2sgPSAxTCA8PCBrVFhOQWx3YXlzVXNlUXVpY2tEcmF3VGV4dEJpdAora1RYTlVzZVRlbXBvcmFyeU1lbW9yeU1hc2sgPSAxTCA8PCBrVFhOVXNlVGVtcG9yYXJ5TWVtb3J5Qml0CitrVFhORHJhd0dyb3dJY29uQml0ID0gMAora1RYTlNob3dXaW5kb3dCaXQgPSAxCitrVFhOV2FudEhTY3JvbGxCYXJCaXQgPSAyCitrVFhOV2FudFZTY3JvbGxCYXJCaXQgPSAzCitrVFhOTm9UU01FdmVyQml0ID0gNAora1RYTlJlYWRPbmx5Qml0ID0gNQora1RYTk5vS2V5Ym9hcmRTeW5jQml0ID0gNgora1RYTk5vU2VsZWN0aW9uQml0ID0gNwora1RYTlNhdmVTdHlsZXNBc1NUWUxSZXNvdXJjZUJpdCA9IDgKK2tPdXRwdXRUZXh0SW5Vbmljb2RlRW5jb2RpbmdCaXQgPSA5CitrVFhORG9Ob3RJbnN0YWxsRHJhZ1Byb2NzQml0ID0gMTAKK2tUWE5BbHdheXNXcmFwQXRWaWV3RWRnZUJpdCA9IDExCitrVFhORG9udERyYXdDYXJldFdoZW5JbmFjdGl2ZUJpdCA9IDEyCitrVFhORG9udERyYXdTZWxlY3Rpb25XaGVuSW5hY3RpdmVCaXQgPSAxMwora1RYTlNpbmdsZUxpbmVPbmx5Qml0ID0gMTQKK2tUWE5EaXNhYmxlRHJhZ0FuZERyb3BCaXQgPSAxNQora1RYTlVzZVFEZm9ySW1hZ2luZ0JpdCA9IDE2CitrVFhORHJhd0dyb3dJY29uTWFzayA9IDFMIDw8IGtUWE5EcmF3R3Jvd0ljb25CaXQKK2tUWE5TaG93V2luZG93TWFzayA9IDFMIDw8IGtUWE5TaG93V2luZG93Qml0CitrVFhOV2FudEhTY3JvbGxCYXJNYXNrID0gMUwgPDwga1RYTldhbnRIU2Nyb2xsQmFyQml0CitrVFhOV2FudFZTY3JvbGxCYXJNYXNrID0gMUwgPDwga1RYTldhbnRWU2Nyb2xsQmFyQml0CitrVFhOTm9UU01FdmVyTWFzayA9IDFMIDw8IGtUWE5Ob1RTTUV2ZXJCaXQKK2tUWE5SZWFkT25seU1hc2sgPSAxTCA8PCBrVFhOUmVhZE9ubHlCaXQKK2tUWE5Ob0tleWJvYXJkU3luY01hc2sgPSAxTCA8PCBrVFhOTm9LZXlib2FyZFN5bmNCaXQKK2tUWE5Ob1NlbGVjdGlvbk1hc2sgPSAxTCA8PCBrVFhOTm9TZWxlY3Rpb25CaXQKK2tUWE5TYXZlU3R5bGVzQXNTVFlMUmVzb3VyY2VNYXNrID0gMUwgPDwga1RYTlNhdmVTdHlsZXNBc1NUWUxSZXNvdXJjZUJpdAora091dHB1dFRleHRJblVuaWNvZGVFbmNvZGluZ01hc2sgPSAxTCA8PCBrT3V0cHV0VGV4dEluVW5pY29kZUVuY29kaW5nQml0CitrVFhORG9Ob3RJbnN0YWxsRHJhZ1Byb2NzTWFzayA9IDFMIDw8IGtUWE5Eb05vdEluc3RhbGxEcmFnUHJvY3NCaXQKK2tUWE5BbHdheXNXcmFwQXRWaWV3RWRnZU1hc2sgPSAxTCA8PCBrVFhOQWx3YXlzV3JhcEF0Vmlld0VkZ2VCaXQKK2tUWE5Eb250RHJhd0NhcmV0V2hlbkluYWN0aXZlTWFzayA9IDFMIDw8IGtUWE5Eb250RHJhd0NhcmV0V2hlbkluYWN0aXZlQml0CitrVFhORG9udERyYXdTZWxlY3Rpb25XaGVuSW5hY3RpdmVNYXNrID0gMUwgPDwga1RYTkRvbnREcmF3U2VsZWN0aW9uV2hlbkluYWN0aXZlQml0CitrVFhOU2luZ2xlTGluZU9ubHlNYXNrID0gMUwgPDwga1RYTlNpbmdsZUxpbmVPbmx5Qml0CitrVFhORGlzYWJsZURyYWdBbmREcm9wTWFzayA9IDFMIDw8IGtUWE5EaXNhYmxlRHJhZ0FuZERyb3BCaXQKK2tUWE5Vc2VRRGZvckltYWdpbmdNYXNrID0gMUwgPDwga1RYTlVzZVFEZm9ySW1hZ2luZ0JpdAora1RYTlNldEZsdXNobmVzc0JpdCA9IDAKK2tUWE5TZXRKdXN0aWZpY2F0aW9uQml0ID0gMQora1RYTlVzZUZvbnRGYWxsQmFja0JpdCA9IDIKK2tUWE5Sb3RhdGVUZXh0Qml0ID0gMwora1RYTlVzZVZlcnRpY2FsVGV4dEJpdCA9IDQKK2tUWE5Eb250VXBkYXRlQm94UmVjdEJpdCA9IDUKK2tUWE5Eb250RHJhd1RleHRCaXQgPSA2CitrVFhOVXNlQ0dDb250ZXh0UmVmQml0ID0gNwora1RYTkltYWdlV2l0aFFEQml0ID0gOAora1RYTkRvbnRXcmFwVGV4dEJpdCA9IDkKK2tUWE5TZXRGbHVzaG5lc3NNYXNrID0gMUwgPDwga1RYTlNldEZsdXNobmVzc0JpdAora1RYTlNldEp1c3RpZmljYXRpb25NYXNrID0gMUwgPDwga1RYTlNldEp1c3RpZmljYXRpb25CaXQKK2tUWE5Vc2VGb250RmFsbEJhY2tNYXNrID0gMUwgPDwga1RYTlVzZUZvbnRGYWxsQmFja0JpdAora1RYTlJvdGF0ZVRleHRNYXNrID0gMUwgPDwga1RYTlJvdGF0ZVRleHRCaXQKK2tUWE5Vc2VWZXJ0aWNhbFRleHRNYXNrID0gMUwgPDwga1RYTlVzZVZlcnRpY2FsVGV4dEJpdAora1RYTkRvbnRVcGRhdGVCb3hSZWN0TWFzayA9IDFMIDw8IGtUWE5Eb250VXBkYXRlQm94UmVjdEJpdAora1RYTkRvbnREcmF3VGV4dE1hc2sgPSAxTCA8PCBrVFhORG9udERyYXdUZXh0Qml0CitrVFhOVXNlQ0dDb250ZXh0UmVmTWFzayA9IDFMIDw8IGtUWE5Vc2VDR0NvbnRleHRSZWZCaXQKK2tUWE5JbWFnZVdpdGhRRE1hc2sgPSAxTCA8PCBrVFhOSW1hZ2VXaXRoUURCaXQKK2tUWE5Eb250V3JhcFRleHRNYXNrID0gMUwgPDwga1RYTkRvbnRXcmFwVGV4dEJpdAora1RYTkZvbnRDb250aW51b3VzQml0ID0gMAora1RYTlNpemVDb250aW51b3VzQml0ID0gMQora1RYTlN0eWxlQ29udGludW91c0JpdCA9IDIKK2tUWE5Db2xvckNvbnRpbnVvdXNCaXQgPSAzCitrVFhORm9udENvbnRpbnVvdXNNYXNrID0gMUwgPDwga1RYTkZvbnRDb250aW51b3VzQml0CitrVFhOU2l6ZUNvbnRpbnVvdXNNYXNrID0gMUwgPDwga1RYTlNpemVDb250aW51b3VzQml0CitrVFhOU3R5bGVDb250aW51b3VzTWFzayA9IDFMIDw8IGtUWE5TdHlsZUNvbnRpbnVvdXNCaXQKK2tUWE5Db2xvckNvbnRpbnVvdXNNYXNrID0gMUwgPDwga1RYTkNvbG9yQ29udGludW91c0JpdAora1RYTklnbm9yZUNhc2VCaXQgPSAwCitrVFhORW50aXJlV29yZEJpdCA9IDEKK2tUWE5Vc2VFbmNvZGluZ1dvcmRSdWxlc0JpdCA9IDMxCitrVFhOSWdub3JlQ2FzZU1hc2sgPSAxTCA8PCBrVFhOSWdub3JlQ2FzZUJpdAora1RYTkVudGlyZVdvcmRNYXNrID0gMUwgPDwga1RYTkVudGlyZVdvcmRCaXQKKyMga1RYTlVzZUVuY29kaW5nV29yZFJ1bGVzTWFzayA9ICh1bnNpZ25lZCBsb25nKSgxTCA8PCBrVFhOVXNlRW5jb2RpbmdXb3JkUnVsZXNCaXQpCitrVFhOVGV4dGVuc2lvbkZpbGUgPSBGT1VSX0NIQVJfQ09ERSgndHh0bicpCitrVFhOVGV4dEZpbGUgPSBGT1VSX0NIQVJfQ09ERSgnVEVYVCcpCitrVFhOUGljdHVyZUZpbGUgPSBGT1VSX0NIQVJfQ09ERSgnUElDVCcpCitrVFhOTW92aWVGaWxlID0gRk9VUl9DSEFSX0NPREUoJ01vb1YnKQora1RYTlNvdW5kRmlsZSA9IEZPVVJfQ0hBUl9DT0RFKCdzZmlsJykKK2tUWE5BSUZGRmlsZSA9IEZPVVJfQ0hBUl9DT0RFKCdBSUZGJykKK2tUWE5Vbmljb2RlVGV4dEZpbGUgPSBGT1VSX0NIQVJfQ09ERSgndXR4dCcpCitrVFhOVGV4dEVkaXRTdHlsZUZyYW1lVHlwZSA9IDEKK2tUWE5QYWdlRnJhbWVUeXBlID0gMgora1RYTk11bHRpcGxlRnJhbWVUeXBlID0gMwora1RYTlRleHREYXRhID0gRk9VUl9DSEFSX0NPREUoJ1RFWFQnKQora1RYTlBpY3R1cmVEYXRhID0gRk9VUl9DSEFSX0NPREUoJ1BJQ1QnKQora1RYTk1vdmllRGF0YSA9IEZPVVJfQ0hBUl9DT0RFKCdtb292JykKK2tUWE5Tb3VuZERhdGEgPSBGT1VSX0NIQVJfQ09ERSgnc25kICcpCitrVFhOVW5pY29kZVRleHREYXRhID0gRk9VUl9DSEFSX0NPREUoJ3V0eHQnKQora1RYTkxpbmVEaXJlY3Rpb25UYWcgPSBGT1VSX0NIQVJfQ09ERSgnbG5kcicpCitrVFhOSnVzdGlmaWNhdGlvblRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdqdXN0JykKK2tUWE5JT1ByaXZpbGVnZXNUYWcgPSBGT1VSX0NIQVJfQ09ERSgnaW9wdicpCitrVFhOU2VsZWN0aW9uU3RhdGVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnc2xzdCcpCitrVFhOSW5saW5lU3RhdGVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnaW5zdCcpCitrVFhOV29yZFdyYXBTdGF0ZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCd3d3JzJykKK2tUWE5LZXlib2FyZFN5bmNTdGF0ZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdrYnN5JykKK2tUWE5BdXRvSW5kZW50U3RhdGVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnYXVpbicpCitrVFhOVGFiU2V0dGluZ3NUYWcgPSBGT1VSX0NIQVJfQ09ERSgndGFicycpCitrVFhOUmVmQ29uVGFnID0gRk9VUl9DSEFSX0NPREUoJ3JmY24nKQora1RYTk1hcmdpbnNUYWcgPSBGT1VSX0NIQVJfQ09ERSgnbWFyZycpCitrVFhORmxhdHRlbk1vdmllc1RhZyA9IEZPVVJfQ0hBUl9DT0RFKCdmbGF0JykKK2tUWE5Eb0ZvbnRTdWJzdGl0dXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnZlN1YicpCitrVFhOTm9Vc2VySU9UYWcgPSBGT1VSX0NIQVJfQ09ERSgnbnVpbycpCitrVFhOVXNlQ2FyYm9uRXZlbnRzID0gRk9VUl9DSEFSX0NPREUoJ2NiY2InKQora1RYTkRyYXdDYXJldFdoZW5JbmFjdGl2ZVRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdkY3J0JykKK2tUWE5EcmF3U2VsZWN0aW9uV2hlbkluYWN0aXZlVGFnID0gRk9VUl9DSEFSX0NPREUoJ2RzbG4nKQora1RYTkRpc2FibGVEcmFnQW5kRHJvcFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdkcmFnJykKK2tUWE5UeXBpbmdBY3Rpb24gPSAwCitrVFhOQ3V0QWN0aW9uID0gMQora1RYTlBhc3RlQWN0aW9uID0gMgora1RYTkNsZWFyQWN0aW9uID0gMwora1RYTkNoYW5nZUZvbnRBY3Rpb24gPSA0CitrVFhOQ2hhbmdlRm9udENvbG9yQWN0aW9uID0gNQora1RYTkNoYW5nZUZvbnRTaXplQWN0aW9uID0gNgora1RYTkNoYW5nZVN0eWxlQWN0aW9uID0gNwora1RYTkFsaWduTGVmdEFjdGlvbiA9IDgKK2tUWE5BbGlnbkNlbnRlckFjdGlvbiA9IDkKK2tUWE5BbGlnblJpZ2h0QWN0aW9uID0gMTAKK2tUWE5Ecm9wQWN0aW9uID0gMTEKK2tUWE5Nb3ZlQWN0aW9uID0gMTIKK2tUWE5Gb250RmVhdHVyZUFjdGlvbiA9IDEzCitrVFhORm9udFZhcmlhdGlvbkFjdGlvbiA9IDE0CitrVFhOVW5kb0xhc3RBY3Rpb24gPSAxMDI0CisjIGtUWE5DbGVhclRoaXNDb250cm9sID0gKGxvbmcpMHhGRkZGRkZGRgorIyBrVFhOQ2xlYXJUaGVzZUZvbnRGZWF0dXJlcyA9IChsb25nKTB4ODAwMDAwMDAKK2tUWE5SZWFkV3JpdGUgPSBmYWxzZQora1RYTlJlYWRPbmx5ID0gdHJ1ZQora1RYTlNlbGVjdGlvbk9uID0gdHJ1ZQora1RYTlNlbGVjdGlvbk9mZiA9IGZhbHNlCitrVFhOVXNlSW5saW5lID0gZmFsc2UKK2tUWE5Vc2VCb3R0b21saW5lID0gdHJ1ZQora1RYTkF1dG9XcmFwID0gZmFsc2UKK2tUWE5Ob0F1dG9XcmFwID0gdHJ1ZQora1RYTlN5bmNLZXlib2FyZCA9IGZhbHNlCitrVFhOTm9TeW5jS2V5Ym9hcmQgPSB0cnVlCitrVFhOQXV0b0luZGVudE9mZiA9IGZhbHNlCitrVFhOQXV0b0luZGVudE9uID0gdHJ1ZQora1RYTkRvbnREcmF3Q2FyZXRXaGVuSW5hY3RpdmUgPSBmYWxzZQora1RYTkRyYXdDYXJldFdoZW5JbmFjdGl2ZSA9IHRydWUKK2tUWE5Eb250RHJhd1NlbGVjdGlvbldoZW5JbmFjdGl2ZSA9IGZhbHNlCitrVFhORHJhd1NlbGVjdGlvbldoZW5JbmFjdGl2ZSA9IHRydWUKK2tUWE5FbmFibGVEcmFnQW5kRHJvcCA9IGZhbHNlCitrVFhORGlzYWJsZURyYWdBbmREcm9wID0gdHJ1ZQora1RYTlJpZ2h0VGFiID0gLTEKK2tUWE5MZWZ0VGFiID0gMAora1RYTkNlbnRlclRhYiA9IDEKK2tUWE5MZWZ0VG9SaWdodCA9IDAKK2tUWE5SaWdodFRvTGVmdCA9IDEKK2tUWE5GbHVzaERlZmF1bHQgPSAwCitrVFhORmx1c2hMZWZ0ID0gMQora1RYTkZsdXNoUmlnaHQgPSAyCitrVFhOQ2VudGVyID0gNAora1RYTkZ1bGxKdXN0ID0gOAora1RYTkZvcmNlRnVsbEp1c3QgPSAxNgora1Njcm9sbEJhcnNBbHdheXNBY3RpdmUgPSB0cnVlCitrU2Nyb2xsQmFyc1N5bmNXaXRoRm9jdXMgPSBmYWxzZQorIyBrVFhORG9udENhcmVUeXBlU2l6ZSA9IChsb25nKTB4RkZGRkZGRkYKK2tUWE5Eb250Q2FyZVR5cGVTdHlsZSA9IDB4RkYKK2tUWE5JbmNyZW1lbnRUeXBlU2l6ZSA9IDB4MDAwMDAwMDEKKyMga1RYTkRlY3JlbWVudFR5cGVTaXplID0gKGxvbmcpMHg4MDAwMDAwMAora1RYTlVzZVNjcmlwdERlZmF1bHRWYWx1ZSA9IC0xCitrVFhOTm9Gb250VmFyaWF0aW9ucyA9IDB4N0ZGRgorIyBrVFhOVXNlQ3VycmVudFNlbGVjdGlvbiA9ICh1bnNpZ25lZCBsb25nKTB4RkZGRkZGRkYKKyMga1RYTlN0YXJ0T2Zmc2V0ID0gMAorIyBrVFhORW5kT2Zmc2V0ID0gMHg3RkZGRkZGRgora1RYTlNpbmdsZVN0eWxlUGVyVGV4dERvY3VtZW50UmVzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdNUFNSJykKK2tUWE5NdWx0aXBsZVN0eWxlc1BlclRleHREb2N1bWVudFJlc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3R5bCcpCitrVFhOU2hvd1N0YXJ0ID0gZmFsc2UKK2tUWE5TaG93RW5kID0gdHJ1ZQora1RYTkRlZmF1bHRGb250TmFtZSA9IDAKK2tUWE5EZWZhdWx0Rm9udFNpemUgPSAweDAwMEMwMDAwCitrVFhORGVmYXVsdEZvbnRTdHlsZSA9IG5vcm1hbAora1RYTlFERm9udE5hbWVBdHRyaWJ1dGUgPSBGT1VSX0NIQVJfQ09ERSgnZm50bicpCitrVFhOUURGb250RmFtaWx5SURBdHRyaWJ1dGUgPSBGT1VSX0NIQVJfQ09ERSgnZm9udCcpCitrVFhOUURGb250U2l6ZUF0dHJpYnV0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdzaXplJykKK2tUWE5RREZvbnRTdHlsZUF0dHJpYnV0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdmYWNlJykKK2tUWE5RREZvbnRDb2xvckF0dHJpYnV0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdrbG9yJykKK2tUWE5UZXh0RW5jb2RpbmdBdHRyaWJ1dGUgPSBGT1VSX0NIQVJfQ09ERSgnZW5jZCcpCitrVFhOQVRTVUlGb250RmVhdHVyZXNBdHRyaWJ1dGUgPSBGT1VSX0NIQVJfQ09ERSgnYXRmZScpCitrVFhOQVRTVUlGb250VmFyaWF0aW9uc0F0dHJpYnV0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdhdHZhJykKKyMga1RYTlFERm9udE5hbWVBdHRyaWJ1dGVTaXplID0gc2l6ZW9mKFN0cjI1NSkKKyMga1RYTlFERm9udEZhbWlseUlEQXR0cmlidXRlU2l6ZSA9IHNpemVvZihTSW50MTYpCisjIGtUWE5RREZvbnRTaXplQXR0cmlidXRlU2l6ZSA9IHNpemVvZihTSW50MTYpCisjIGtUWE5RREZvbnRTdHlsZUF0dHJpYnV0ZVNpemUgPSBzaXplb2YoU3R5bGUpCisjIGtUWE5RREZvbnRDb2xvckF0dHJpYnV0ZVNpemUgPSBzaXplb2YoUkdCQ29sb3IpCisjIGtUWE5UZXh0RW5jb2RpbmdBdHRyaWJ1dGVTaXplID0gc2l6ZW9mKFRleHRFbmNvZGluZykKKyMga1RYTkZvbnRTaXplQXR0cmlidXRlU2l6ZSA9IHNpemVvZihGaXhlZCkKK2tUWE5TeXN0ZW1EZWZhdWx0RW5jb2RpbmcgPSAwCitrVFhOTWFjT1NFbmNvZGluZyA9IDEKK2tUWE5Vbmljb2RlRW5jb2RpbmcgPSAyCitrVFhOQmFja2dyb3VuZFR5cGVSR0IgPSAxCitrVFhOVGV4dElucHV0Q291bnRCaXQgPSAwCitrVFhOUnVuQ291bnRCaXQgPSAxCitrVFhOVGV4dElucHV0Q291bnRNYXNrID0gMUwgPDwga1RYTlRleHRJbnB1dENvdW50Qml0CitrVFhOUnVuQ291bnRNYXNrID0gMUwgPDwga1RYTlJ1bkNvdW50Qml0CitrVFhOQWxsQ291bnRNYXNrID0ga1RYTlRleHRJbnB1dENvdW50TWFzayB8IGtUWE5SdW5Db3VudE1hc2sKK2tUWE5Ob0FwcGxlRXZlbnRIYW5kbGVyc0JpdCA9IDAKK2tUWE5SZXN0YXJ0QXBwbGVFdmVudEhhbmRsZXJzQml0ID0gMQora1RYTk5vQXBwbGVFdmVudEhhbmRsZXJzTWFzayA9IDEgPDwga1RYTk5vQXBwbGVFdmVudEhhbmRsZXJzQml0CitrVFhOUmVzdGFydEFwcGxlRXZlbnRIYW5kbGVyc01hc2sgPSAxIDw8IGtUWE5SZXN0YXJ0QXBwbGVFdmVudEhhbmRsZXJzQml0CisjIHN0YXR1cyA9IFRYTkluaXRUZXh0ZW5zaW9uKCAmZGVmYXVsdHMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01hY1RleHRFZGl0b3IucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWFjVGV4dEVkaXRvci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3Y2JjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01hY1RleHRFZGl0b3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01hY1RleHRFZGl0b3IucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWFjVGV4dEVkaXRvci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3Y2JjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01hY1RleHRFZGl0b3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01lZGlhRGVzY3IucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZWRpYURlc2NyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzFkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZWRpYURlc2NyLnB5CkBAIC0wLDAgKzEsOTcgQEAKKyMgUGFyc2Vycy9nZW5lcmF0b3JzIGZvciBRdWlja1RpbWUgbWVkaWEgZGVzY3JpcHRpb25zCitpbXBvcnQgc3RydWN0CisKK0Vycm9yID0gJ01lZGlhRGVzY3IuRXJyb3InCisKK2NsYXNzIF9NZWRpYURlc2NyaXB0aW9uQ29kZWM6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRydW5jLCBzaXplLCBuYW1lcywgZm10KToKKyAgICAgICAgc2VsZi50cnVuYyA9IHRydW5jCisgICAgICAgIHNlbGYuc2l6ZSA9IHNpemUKKyAgICAgICAgc2VsZi5uYW1lcyA9IG5hbWVzCisgICAgICAgIHNlbGYuZm10ID0gZm10CisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBzZWxmLnRydW5jOgorICAgICAgICAgICAgZGF0YSA9IGRhdGFbOnNlbGYuc2l6ZV0KKyAgICAgICAgdmFsdWVzID0gc3RydWN0LnVucGFjayhzZWxmLmZtdCwgZGF0YSkKKyAgICAgICAgaWYgbGVuKHZhbHVlcykgIT0gbGVuKHNlbGYubmFtZXMpOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICgnRm9ybWF0IGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBudW1iZXIgb2YgbmFtZXMnKQorICAgICAgICBydiA9IHt9CisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbih2YWx1ZXMpKToKKyAgICAgICAgICAgIG5hbWUgPSBzZWxmLm5hbWVzW2ldCisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpXQorICAgICAgICAgICAgaWYgdHlwZShuYW1lKSA9PSB0eXBlKCgpKToKKyAgICAgICAgICAgICAgICBuYW1lLCBjb2QsIGRlYyA9IG5hbWUKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGRlYyh2YWx1ZSkKKyAgICAgICAgICAgIHJ2W25hbWVdID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGRpY3QpOgorICAgICAgICBsaXN0ID0gW3NlbGYuZm10XQorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLm5hbWVzOgorICAgICAgICAgICAgaWYgdHlwZShuYW1lKSA9PSB0eXBlKCgpKToKKyAgICAgICAgICAgICAgICBuYW1lLCBjb2QsIGRlYyA9IG5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29kID0gZGVjID0gTm9uZQorICAgICAgICAgICAgdmFsdWUgPSBkaWN0W25hbWVdCisgICAgICAgICAgICBpZiBjb2Q6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBjb2QodmFsdWUpCisgICAgICAgICAgICBsaXN0LmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgcnYgPSBzdHJ1Y3QucGFjaygqbGlzdCkKKyAgICAgICAgcmV0dXJuIHJ2CisKKyMgSGVscGVyIGZ1bmN0aW9ucworZGVmIF90b2ZpeGVkKGZsb2F0KToKKyAgICBoaSA9IGludChmbG9hdCkKKyAgICBsbyA9IGludChmbG9hdCoweDEwMDAwKSAmIDB4ZmZmZgorICAgIHJldHVybiAoaGk8PDE2KXxsbworCitkZWYgX2Zyb21maXhlZChmaXhlZCk6CisgICAgaGkgPSAoZml4ZWQgPj4gMTYpICYgMHhmZmZmCisgICAgbG8gPSAoZml4ZWQgJiAweGZmZmYpCisgICAgcmV0dXJuIGhpICsgKGxvIC8gZmxvYXQoMHgxMDAwMCkpCisKK2RlZiBfdG9zdHIzMShzdHIpOgorICAgIHJldHVybiBjaHIobGVuKHN0cikpICsgc3RyICsgJ1wwJyooMzEtbGVuKHN0cikpCisKK2RlZiBfZnJvbXN0cjMxKHN0cjMxKToKKyAgICByZXR1cm4gc3RyMzFbMToxK29yZChzdHIzMVswXSldCisKK1NhbXBsZURlc2NyaXB0aW9uID0gX01lZGlhRGVzY3JpcHRpb25Db2RlYygKKyAgICAgICAgMSwgICAgICAjIE1heSBiZSBsb25nZXIsIHRydW5jYXRlCisgICAgICAgIDE2LCAgICAgIyBzaXplCisgICAgICAgICgnZGVzY1NpemUnLCAnZGF0YUZvcm1hdCcsICdyZXN2ZDEnLCAncmVzdmQyJywgJ2RhdGFSZWZJbmRleCcpLCAjIEF0dHJpYnV0ZXMKKyAgICAgICAgImw0c2xoaCIgICAgICAgICMgRm9ybWF0CispCisKK1NvdW5kRGVzY3JpcHRpb24gPSBfTWVkaWFEZXNjcmlwdGlvbkNvZGVjKAorICAgICAgICAxLAorICAgICAgICAzNiwKKyAgICAgICAgKCdkZXNjU2l6ZScsICdkYXRhRm9ybWF0JywgJ3Jlc3ZkMScsICdyZXN2ZDInLCAnZGF0YVJlZkluZGV4JywKKyAgICAgICAgJ3ZlcnNpb24nLCAncmV2bGV2ZWwnLCAndmVuZG9yJywgJ251bUNoYW5uZWxzJywgJ3NhbXBsZVNpemUnLAorICAgICAgICAnY29tcHJlc3Npb25JRCcsICdwYWNrZXRTaXplJywgKCdzYW1wbGVSYXRlJywgX3RvZml4ZWQsIF9mcm9tZml4ZWQpKSwKKyAgICAgICAgImw0c2xoaGhoNHNoaGhobCIgICAgICAgIyBGb3JtYXQKKykKKworU291bmREZXNjcmlwdGlvblYxID0gX01lZGlhRGVzY3JpcHRpb25Db2RlYygKKyAgICAgICAgMSwKKyAgICAgICAgNTIsCisgICAgICAgICgnZGVzY1NpemUnLCAnZGF0YUZvcm1hdCcsICdyZXN2ZDEnLCAncmVzdmQyJywgJ2RhdGFSZWZJbmRleCcsCisgICAgICAgICd2ZXJzaW9uJywgJ3JldmxldmVsJywgJ3ZlbmRvcicsICdudW1DaGFubmVscycsICdzYW1wbGVTaXplJywKKyAgICAgICAgJ2NvbXByZXNzaW9uSUQnLCAncGFja2V0U2l6ZScsICgnc2FtcGxlUmF0ZScsIF90b2ZpeGVkLCBfZnJvbWZpeGVkKSwgJ3NhbXBsZXNQZXJQYWNrZXQnLAorICAgICAgICAnYnl0ZXNQZXJQYWNrZXQnLCAnYnl0ZXNQZXJGcmFtZScsICdieXRlc1BlclNhbXBsZScpLAorICAgICAgICAibDRzbGhoaGg0c2hoaGhsbGxsbCIgICAjIEZvcm1hdAorKQorCitJbWFnZURlc2NyaXB0aW9uID0gX01lZGlhRGVzY3JpcHRpb25Db2RlYygKKyAgICAgICAgMSwgICAgICAjIE1heSBiZSBsb25nZXIsIHRydW5jYXRlCisgICAgICAgIDg2LCAgICAgIyBzaXplCisgICAgICAgICgnaWRTaXplJywgJ2NUeXBlJywgJ3Jlc3ZkMScsICdyZXN2ZDInLCAnZGF0YVJlZkluZGV4JywgJ3ZlcnNpb24nLAorICAgICAgICAgJ3JldmlzaW9uTGV2ZWwnLCAndmVuZG9yJywgJ3RlbXBvcmFsUXVhbGl0eScsICdzcGF0aWFsUXVhbGl0eScsCisgICAgICAgICAnd2lkdGgnLCAnaGVpZ2h0JywgKCdoUmVzJywgX3RvZml4ZWQsIF9mcm9tZml4ZWQpLCAoJ3ZSZXMnLCBfdG9maXhlZCwgX2Zyb21maXhlZCksCisgICAgICAgICdkYXRhU2l6ZScsICdmcmFtZUNvdW50JywgKCduYW1lJywgX3Rvc3RyMzEsIF9mcm9tc3RyMzEpLAorICAgICAgICAgJ2RlcHRoJywgJ2NsdXRJRCcpLAorICAgICAgICAnbDRzbGhoaGg0c2xsaGhsbGxoMzJzaGgnLAorKQorCisjIFhYWFggT3RoZXJzLCBsaWtlIFRleHREZXNjcmlwdGlvbiBhbmQgc3VjaCwgcmVtYWluIHRvIGJlIGRvbmUuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZWRpYURlc2NyLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01lZGlhRGVzY3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYWRjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZWRpYURlc2NyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZWRpYURlc2NyLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01lZGlhRGVzY3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYWRjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZWRpYURlc2NyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZW51LnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWVudS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzVjYjlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWVudS5weQpAQCAtMCwwICsxIEBACitmcm9tIF9NZW51IGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZW51LnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01lbnUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODgyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZW51LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZW51LnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01lbnUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODgyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZW51LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZW51cy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01lbnVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYWZmYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZW51cy5weQpAQCAtMCwwICsxLDE2OSBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnTWVudXMuaCcKKworZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAorbm9NYXJrID0gMAora01lbnVEcmF3TXNnID0gMAora01lbnVTaXplTXNnID0gMgora01lbnVQb3BVcE1zZyA9IDMKK2tNZW51Q2FsY0l0ZW1Nc2cgPSA1CitrTWVudVRoZW1lU2F2dnlNc2cgPSA3CittRHJhd01zZyA9IDAKK21TaXplTXNnID0gMgorbVBvcFVwTXNnID0gMworbUNhbGNJdGVtTXNnID0gNQorbUNob29zZU1zZyA9IDEKK21EcmF3SXRlbU1zZyA9IDQKK2tNZW51Q2hvb3NlTXNnID0gMQora01lbnVEcmF3SXRlbU1zZyA9IDQKK2tUaGVtZVNhdnZ5TWVudVJlc3BvbnNlID0gMHg3NDczCitrTWVudUluaXRNc2cgPSA4CitrTWVudURpc3Bvc2VNc2cgPSA5CitrTWVudUZpbmRJdGVtTXNnID0gMTAKK2tNZW51SGlsaXRlSXRlbU1zZyA9IDExCitrTWVudURyYXdJdGVtc01zZyA9IDEyCit0ZXh0TWVudVByb2MgPSAwCitoTWVudUNtZCA9IDI3CitoaWVyTWVudSA9IC0xCitrSW5zZXJ0SGllcmFyY2hpY2FsTWVudSA9IC0xCittY3RBbGxJdGVtcyA9IC05OAorbWN0TGFzdElESW5kaWMgPSAtOTkKK2tNZW51U3RkTWVudVByb2MgPSA2Mwora01lbnVTdGRNZW51QmFyUHJvYyA9IDYzCitrTWVudU5vTW9kaWZpZXJzID0gMAora01lbnVTaGlmdE1vZGlmaWVyID0gKDEgPDwgMCkKK2tNZW51T3B0aW9uTW9kaWZpZXIgPSAoMSA8PCAxKQora01lbnVDb250cm9sTW9kaWZpZXIgPSAoMSA8PCAyKQora01lbnVOb0NvbW1hbmRNb2RpZmllciA9ICgxIDw8IDMpCitrTWVudU5vSWNvbiA9IDAKK2tNZW51SWNvblR5cGUgPSAxCitrTWVudVNocmlua0ljb25UeXBlID0gMgora01lbnVTbWFsbEljb25UeXBlID0gMwora01lbnVDb2xvckljb25UeXBlID0gNAora01lbnVJY29uU3VpdGVUeXBlID0gNQora01lbnVJY29uUmVmVHlwZSA9IDYKK2tNZW51Q0dJbWFnZVJlZlR5cGUgPSA3CitrTWVudVN5c3RlbUljb25TZWxlY3RvclR5cGUgPSA4CitrTWVudUljb25SZXNvdXJjZVR5cGUgPSA5CitrTWVudU51bGxHbHlwaCA9IDB4MDAKK2tNZW51VGFiUmlnaHRHbHlwaCA9IDB4MDIKK2tNZW51VGFiTGVmdEdseXBoID0gMHgwMwora01lbnVFbnRlckdseXBoID0gMHgwNAora01lbnVTaGlmdEdseXBoID0gMHgwNQora01lbnVDb250cm9sR2x5cGggPSAweDA2CitrTWVudU9wdGlvbkdseXBoID0gMHgwNwora01lbnVTcGFjZUdseXBoID0gMHgwOQora01lbnVEZWxldGVSaWdodEdseXBoID0gMHgwQQora01lbnVSZXR1cm5HbHlwaCA9IDB4MEIKK2tNZW51UmV0dXJuUjJMR2x5cGggPSAweDBDCitrTWVudU5vbm1hcmtpbmdSZXR1cm5HbHlwaCA9IDB4MEQKK2tNZW51UGVuY2lsR2x5cGggPSAweDBGCitrTWVudURvd253YXJkQXJyb3dEYXNoZWRHbHlwaCA9IDB4MTAKK2tNZW51Q29tbWFuZEdseXBoID0gMHgxMQora01lbnVDaGVja21hcmtHbHlwaCA9IDB4MTIKK2tNZW51RGlhbW9uZEdseXBoID0gMHgxMwora01lbnVBcHBsZUxvZ29GaWxsZWRHbHlwaCA9IDB4MTQKK2tNZW51UGFyYWdyYXBoS29yZWFuR2x5cGggPSAweDE1CitrTWVudURlbGV0ZUxlZnRHbHlwaCA9IDB4MTcKK2tNZW51TGVmdEFycm93RGFzaGVkR2x5cGggPSAweDE4CitrTWVudVVwQXJyb3dEYXNoZWRHbHlwaCA9IDB4MTkKK2tNZW51UmlnaHRBcnJvd0Rhc2hlZEdseXBoID0gMHgxQQora01lbnVFc2NhcGVHbHlwaCA9IDB4MUIKK2tNZW51Q2xlYXJHbHlwaCA9IDB4MUMKK2tNZW51TGVmdERvdWJsZVF1b3Rlc0phcGFuZXNlR2x5cGggPSAweDFECitrTWVudVJpZ2h0RG91YmxlUXVvdGVzSmFwYW5lc2VHbHlwaCA9IDB4MUUKK2tNZW51VHJhZGVtYXJrSmFwYW5lc2VHbHlwaCA9IDB4MUYKK2tNZW51QmxhbmtHbHlwaCA9IDB4NjEKK2tNZW51UGFnZVVwR2x5cGggPSAweDYyCitrTWVudUNhcHNMb2NrR2x5cGggPSAweDYzCitrTWVudUxlZnRBcnJvd0dseXBoID0gMHg2NAora01lbnVSaWdodEFycm93R2x5cGggPSAweDY1CitrTWVudU5vcnRod2VzdEFycm93R2x5cGggPSAweDY2CitrTWVudUhlbHBHbHlwaCA9IDB4NjcKK2tNZW51VXBBcnJvd0dseXBoID0gMHg2OAora01lbnVTb3V0aGVhc3RBcnJvd0dseXBoID0gMHg2OQora01lbnVEb3duQXJyb3dHbHlwaCA9IDB4NkEKK2tNZW51UGFnZURvd25HbHlwaCA9IDB4NkIKK2tNZW51QXBwbGVMb2dvT3V0bGluZUdseXBoID0gMHg2Qwora01lbnVDb250ZXh0dWFsTWVudUdseXBoID0gMHg2RAora01lbnVQb3dlckdseXBoID0gMHg2RQora01lbnVGMUdseXBoID0gMHg2Rgora01lbnVGMkdseXBoID0gMHg3MAora01lbnVGM0dseXBoID0gMHg3MQora01lbnVGNEdseXBoID0gMHg3Mgora01lbnVGNUdseXBoID0gMHg3Mwora01lbnVGNkdseXBoID0gMHg3NAora01lbnVGN0dseXBoID0gMHg3NQora01lbnVGOEdseXBoID0gMHg3Ngora01lbnVGOUdseXBoID0gMHg3Nwora01lbnVGMTBHbHlwaCA9IDB4NzgKK2tNZW51RjExR2x5cGggPSAweDc5CitrTWVudUYxMkdseXBoID0gMHg3QQora01lbnVGMTNHbHlwaCA9IDB4ODcKK2tNZW51RjE0R2x5cGggPSAweDg4CitrTWVudUYxNUdseXBoID0gMHg4OQora01lbnVDb250cm9sSVNPR2x5cGggPSAweDhBCitrTWVudUF0dHJFeGNsdWRlc01hcmtDb2x1bW4gPSAoMSA8PCAwKQora01lbnVBdHRyQXV0b0Rpc2FibGUgPSAoMSA8PCAyKQora01lbnVBdHRyVXNlUGVuY2lsR2x5cGggPSAoMSA8PCAzKQora01lbnVBdHRySGlkZGVuID0gKDEgPDwgNCkKK2tNZW51SXRlbUF0dHJEaXNhYmxlZCA9ICgxIDw8IDApCitrTWVudUl0ZW1BdHRySWNvbkRpc2FibGVkID0gKDEgPDwgMSkKK2tNZW51SXRlbUF0dHJTdWJtZW51UGFyZW50Q2hvb3NhYmxlID0gKDEgPDwgMikKK2tNZW51SXRlbUF0dHJEeW5hbWljID0gKDEgPDwgMykKK2tNZW51SXRlbUF0dHJOb3RQcmV2aW91c0FsdGVybmF0ZSA9ICgxIDw8IDQpCitrTWVudUl0ZW1BdHRySGlkZGVuID0gKDEgPDwgNSkKK2tNZW51SXRlbUF0dHJTZXBhcmF0b3IgPSAoMSA8PCA2KQora01lbnVJdGVtQXR0clNlY3Rpb25IZWFkZXIgPSAoMSA8PCA3KQora01lbnVJdGVtQXR0cklnbm9yZU1ldGEgPSAoMSA8PCA4KQora01lbnVJdGVtQXR0ckF1dG9SZXBlYXQgPSAoMSA8PCA5KQora01lbnVJdGVtQXR0clVzZVZpcnR1YWxLZXkgPSAoMSA8PCAxMCkKK2tNZW51SXRlbUF0dHJDdXN0b21EcmF3ID0gKDEgPDwgMTEpCitrTWVudUl0ZW1BdHRySW5jbHVkZUluQ21kS2V5TWF0Y2hpbmcgPSAoMSA8PCAxMikKK2tNZW51VHJhY2tpbmdNb2RlTW91c2UgPSAxCitrTWVudVRyYWNraW5nTW9kZUtleWJvYXJkID0gMgora01lbnVFdmVudEluY2x1ZGVEaXNhYmxlZEl0ZW1zID0gMHgwMDAxCitrTWVudUV2ZW50UXVlcnlPbmx5ID0gMHgwMDAyCitrTWVudUV2ZW50RG9udENoZWNrU3VibWVudXMgPSAweDAwMDQKK2tNZW51SXRlbURhdGFUZXh0ID0gKDEgPDwgMCkKK2tNZW51SXRlbURhdGFNYXJrID0gKDEgPDwgMSkKK2tNZW51SXRlbURhdGFDbWRLZXkgPSAoMSA8PCAyKQora01lbnVJdGVtRGF0YUNtZEtleUdseXBoID0gKDEgPDwgMykKK2tNZW51SXRlbURhdGFDbWRLZXlNb2RpZmllcnMgPSAoMSA8PCA0KQora01lbnVJdGVtRGF0YVN0eWxlID0gKDEgPDwgNSkKK2tNZW51SXRlbURhdGFFbmFibGVkID0gKDEgPDwgNikKK2tNZW51SXRlbURhdGFJY29uRW5hYmxlZCA9ICgxIDw8IDcpCitrTWVudUl0ZW1EYXRhSWNvbklEID0gKDEgPDwgOCkKK2tNZW51SXRlbURhdGFJY29uSGFuZGxlID0gKDEgPDwgOSkKK2tNZW51SXRlbURhdGFDb21tYW5kSUQgPSAoMSA8PCAxMCkKK2tNZW51SXRlbURhdGFUZXh0RW5jb2RpbmcgPSAoMSA8PCAxMSkKK2tNZW51SXRlbURhdGFTdWJtZW51SUQgPSAoMSA8PCAxMikKK2tNZW51SXRlbURhdGFTdWJtZW51SGFuZGxlID0gKDEgPDwgMTMpCitrTWVudUl0ZW1EYXRhRm9udElEID0gKDEgPDwgMTQpCitrTWVudUl0ZW1EYXRhUmVmY29uID0gKDEgPDwgMTUpCitrTWVudUl0ZW1EYXRhQXR0cmlidXRlcyA9ICgxIDw8IDE2KQora01lbnVJdGVtRGF0YUNGU3RyaW5nID0gKDEgPDwgMTcpCitrTWVudUl0ZW1EYXRhUHJvcGVydGllcyA9ICgxIDw8IDE4KQora01lbnVJdGVtRGF0YUluZGVudCA9ICgxIDw8IDE5KQora01lbnVJdGVtRGF0YUNtZFZpcnR1YWxLZXkgPSAoMSA8PCAyMCkKK2tNZW51SXRlbURhdGFBbGxEYXRhVmVyc2lvbk9uZSA9IDB4MDAwRkZGRkYKK2tNZW51SXRlbURhdGFBbGxEYXRhVmVyc2lvblR3byA9IGtNZW51SXRlbURhdGFBbGxEYXRhVmVyc2lvbk9uZSB8IGtNZW51SXRlbURhdGFDbWRWaXJ0dWFsS2V5CitrTWVudURlZlByb2NQdHIgPSAwCitrTWVudVByb3BlcnR5UGVyc2lzdGVudCA9IDB4MDAwMDAwMDEKK2tIaWVyYXJjaGljYWxGb250TWVudU9wdGlvbiA9IDB4MDAwMDAwMDEKK2dlc3RhbHRDb250ZXh0dWFsTWVudUF0dHIgPSBGT1VSX0NIQVJfQ09ERSgnY21udScpCitnZXN0YWx0Q29udGV4dHVhbE1lbnVVbnVzZWRCaXQgPSAwCitnZXN0YWx0Q29udGV4dHVhbE1lbnVUcmFwQXZhaWxhYmxlID0gMQorZ2VzdGFsdENvbnRleHR1YWxNZW51SGFzQXR0cmlidXRlQW5kTW9kaWZpZXJLZXlzID0gMgorZ2VzdGFsdENvbnRleHR1YWxNZW51SGFzVW5pY29kZVN1cHBvcnQgPSAzCitrQ01IZWxwSXRlbU5vSGVscCA9IDAKK2tDTUhlbHBJdGVtQXBwbGVHdWlkZSA9IDEKK2tDTUhlbHBJdGVtT3RoZXJIZWxwID0gMgora0NNSGVscEl0ZW1SZW1vdmVIZWxwID0gMwora0NNTm90aGluZ1NlbGVjdGVkID0gMAora0NNTWVudUl0ZW1TZWxlY3RlZCA9IDEKK2tDTVNob3dIZWxwU2VsZWN0ZWQgPSAzCitrZXlDb250ZXh0dWFsTWVudU5hbWUgPSBGT1VSX0NIQVJfQ09ERSgncG5hbScpCitrZXlDb250ZXh0dWFsTWVudUNvbW1hbmRJRCA9IEZPVVJfQ0hBUl9DT0RFKCdjbWNkJykKK2tleUNvbnRleHR1YWxNZW51U3VibWVudSA9IEZPVVJfQ0hBUl9DT0RFKCdjbXNiJykKK2tleUNvbnRleHR1YWxNZW51QXR0cmlidXRlcyA9IEZPVVJfQ0hBUl9DT0RFKCdjbWF0JykKK2tleUNvbnRleHR1YWxNZW51TW9kaWZpZXJzID0gRk9VUl9DSEFSX0NPREUoJ2NtbWQnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWVudXMucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWVudXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZmI2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZW51cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWVudXMucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWVudXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZmI2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NZW51cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWx0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01sdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxZmJjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL01sdGUucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfTWx0ZSBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWx0ZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NbHRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDQ3NTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWx0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWx0ZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9NbHRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDQ3NTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vTWx0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vT1NBLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vT1NBLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNjczMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9PU0EucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfT1NBIGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9PU0EucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vT1NBLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDc0MmRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vT1NBLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9PU0EucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vT1NBLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDc0MmRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vT1NBLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9PU0Fjb25zdC5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL09TQWNvbnN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjRjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9PU0Fjb25zdC5weQpAQCAtMCwwICsxLDEzMyBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnT1NBLmgnCisKK2RlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHgKK2Zyb20gQ2FyYm9uLkFwcGxlRXZlbnRzIGltcG9ydCAqCitrQUVVc2VTdGFuZGFyZERpc3BhdGNoID0gLTEKK2tPU0FDb21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ29zYSAnKQora09TQUdlbmVyaWNTY3JpcHRpbmdDb21wb25lbnRTdWJ0eXBlID0gRk9VUl9DSEFSX0NPREUoJ3NjcHQnKQora09TQUZpbGVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ29zYXMnKQora09TQVN1aXRlID0gRk9VUl9DSEFSX0NPREUoJ2FzY3InKQora09TQVJlY29yZGVkVGV4dCA9IEZPVVJfQ0hBUl9DT0RFKCdyZWNkJykKK2tPU0FTY3JpcHRJc01vZGlmaWVkID0gRk9VUl9DSEFSX0NPREUoJ21vZGknKQora09TQVNjcmlwdElzVHlwZUNvbXBpbGVkU2NyaXB0ID0gRk9VUl9DSEFSX0NPREUoJ2NzY3InKQora09TQVNjcmlwdElzVHlwZVNjcmlwdFZhbHVlID0gRk9VUl9DSEFSX0NPREUoJ3ZhbHUnKQora09TQVNjcmlwdElzVHlwZVNjcmlwdENvbnRleHQgPSBGT1VSX0NIQVJfQ09ERSgnY250eCcpCitrT1NBU2NyaXB0QmVzdFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYmVzdCcpCitrT1NBQ2FuR2V0U291cmNlID0gRk9VUl9DSEFSX0NPREUoJ2dzcmMnKQordHlwZU9TQURpYWxlY3RJbmZvID0gRk9VUl9DSEFSX0NPREUoJ2RpZm8nKQora2V5T1NBRGlhbGVjdE5hbWUgPSBGT1VSX0NIQVJfQ09ERSgnZG5hbScpCitrZXlPU0FEaWFsZWN0Q29kZSA9IEZPVVJfQ0hBUl9DT0RFKCdkY29kJykKK2tleU9TQURpYWxlY3RMYW5nQ29kZSA9IEZPVVJfQ0hBUl9DT0RFKCdkbGNkJykKK2tleU9TQURpYWxlY3RTY3JpcHRDb2RlID0gRk9VUl9DSEFSX0NPREUoJ2RzY2QnKQora09TQU51bGxTY3JpcHQgPSAwTAora09TQU51bGxNb2RlID0gMAora09TQU1vZGVOdWxsID0gMAora09TQVN1cHBvcnRzQ29tcGlsaW5nID0gMHgwMDAyCitrT1NBU3VwcG9ydHNHZXRTb3VyY2UgPSAweDAwMDQKK2tPU0FTdXBwb3J0c0FFQ29lcmNpb24gPSAweDAwMDgKK2tPU0FTdXBwb3J0c0FFU2VuZGluZyA9IDB4MDAxMAora09TQVN1cHBvcnRzUmVjb3JkaW5nID0gMHgwMDIwCitrT1NBU3VwcG9ydHNDb252ZW5pZW5jZSA9IDB4MDA0MAora09TQVN1cHBvcnRzRGlhbGVjdHMgPSAweDAwODAKK2tPU0FTdXBwb3J0c0V2ZW50SGFuZGxpbmcgPSAweDAxMDAKK2tPU0FTZWxlY3RMb2FkID0gMHgwMDAxCitrT1NBU2VsZWN0U3RvcmUgPSAweDAwMDIKK2tPU0FTZWxlY3RFeGVjdXRlID0gMHgwMDAzCitrT1NBU2VsZWN0RGlzcGxheSA9IDB4MDAwNAora09TQVNlbGVjdFNjcmlwdEVycm9yID0gMHgwMDA1CitrT1NBU2VsZWN0RGlzcG9zZSA9IDB4MDAwNgora09TQVNlbGVjdFNldFNjcmlwdEluZm8gPSAweDAwMDcKK2tPU0FTZWxlY3RHZXRTY3JpcHRJbmZvID0gMHgwMDA4CitrT1NBU2VsZWN0U2V0QWN0aXZlUHJvYyA9IDB4MDAwOQora09TQVNlbGVjdEdldEFjdGl2ZVByb2MgPSAweDAwMEEKK2tPU0FTZWxlY3RTY3JpcHRpbmdDb21wb25lbnROYW1lID0gMHgwMTAyCitrT1NBU2VsZWN0Q29tcGlsZSA9IDB4MDEwMwora09TQVNlbGVjdENvcHlJRCA9IDB4MDEwNAora09TQVNlbGVjdENvcHlTY3JpcHQgPSAweDAxMDUKK2tPU0FTZWxlY3RHZXRTb3VyY2UgPSAweDAyMDEKK2tPU0FTZWxlY3RDb2VyY2VGcm9tRGVzYyA9IDB4MDMwMQora09TQVNlbGVjdENvZXJjZVRvRGVzYyA9IDB4MDMwMgora09TQVNlbGVjdFNldFNlbmRQcm9jID0gMHgwNDAxCitrT1NBU2VsZWN0R2V0U2VuZFByb2MgPSAweDA0MDIKK2tPU0FTZWxlY3RTZXRDcmVhdGVQcm9jID0gMHgwNDAzCitrT1NBU2VsZWN0R2V0Q3JlYXRlUHJvYyA9IDB4MDQwNAora09TQVNlbGVjdFNldERlZmF1bHRUYXJnZXQgPSAweDA0MDUKK2tPU0FTZWxlY3RTdGFydFJlY29yZGluZyA9IDB4MDUwMQora09TQVNlbGVjdFN0b3BSZWNvcmRpbmcgPSAweDA1MDIKK2tPU0FTZWxlY3RMb2FkRXhlY3V0ZSA9IDB4MDYwMQora09TQVNlbGVjdENvbXBpbGVFeGVjdXRlID0gMHgwNjAyCitrT1NBU2VsZWN0RG9TY3JpcHQgPSAweDA2MDMKK2tPU0FTZWxlY3RTZXRDdXJyZW50RGlhbGVjdCA9IDB4MDcwMQora09TQVNlbGVjdEdldEN1cnJlbnREaWFsZWN0ID0gMHgwNzAyCitrT1NBU2VsZWN0QXZhaWxhYmxlRGlhbGVjdHMgPSAweDA3MDMKK2tPU0FTZWxlY3RHZXREaWFsZWN0SW5mbyA9IDB4MDcwNAora09TQVNlbGVjdEF2YWlsYWJsZURpYWxlY3RDb2RlTGlzdCA9IDB4MDcwNQora09TQVNlbGVjdFNldFJlc3VtZURpc3BhdGNoUHJvYyA9IDB4MDgwMQora09TQVNlbGVjdEdldFJlc3VtZURpc3BhdGNoUHJvYyA9IDB4MDgwMgora09TQVNlbGVjdEV4ZWN1dGVFdmVudCA9IDB4MDgwMwora09TQVNlbGVjdERvRXZlbnQgPSAweDA4MDQKK2tPU0FTZWxlY3RNYWtlQ29udGV4dCA9IDB4MDgwNQora09TQURlYnVnZ2VyQ3JlYXRlU2Vzc2lvbiA9IDB4MDkwMQora09TQURlYnVnZ2VyR2V0U2Vzc2lvblN0YXRlID0gMHgwOTAyCitrT1NBRGVidWdnZXJTZXNzaW9uU3RlcCA9IDB4MDkwMwora09TQURlYnVnZ2VyRGlzcG9zZVNlc3Npb24gPSAweDA5MDQKK2tPU0FEZWJ1Z2dlckdldFN0YXRlbWVudFJhbmdlcyA9IDB4MDkwNQora09TQURlYnVnZ2VyR2V0QnJlYWtwb2ludCA9IDB4MDkxMAora09TQURlYnVnZ2VyU2V0QnJlYWtwb2ludCA9IDB4MDkxMQora09TQURlYnVnZ2VyR2V0RGVmYXVsdEJyZWFrcG9pbnQgPSAweDA5MTIKK2tPU0FEZWJ1Z2dlckdldEN1cnJlbnRDYWxsRnJhbWUgPSAweDA5MDYKK2tPU0FEZWJ1Z2dlckdldENhbGxGcmFtZVN0YXRlID0gMHgwOTA3CitrT1NBRGVidWdnZXJHZXRWYXJpYWJsZSA9IDB4MDkwOAora09TQURlYnVnZ2VyU2V0VmFyaWFibGUgPSAweDA5MDkKK2tPU0FEZWJ1Z2dlckdldFByZXZpb3VzQ2FsbEZyYW1lID0gMHgwOTBBCitrT1NBRGVidWdnZXJEaXNwb3NlQ2FsbEZyYW1lID0gMHgwOTBCCitrT1NBRGVidWdnZXJDb3VudFZhcmlhYmxlcyA9IDB4MDkwQwora09TQVNlbGVjdENvbXBvbmVudFNwZWNpZmljU3RhcnQgPSAweDEwMDEKK2tPU0FNb2RlUHJldmVudEdldFNvdXJjZSA9IDB4MDAwMDAwMDEKK2tPU0FNb2RlTmV2ZXJJbnRlcmFjdCA9IGtBRU5ldmVySW50ZXJhY3QKK2tPU0FNb2RlQ2FuSW50ZXJhY3QgPSBrQUVDYW5JbnRlcmFjdAora09TQU1vZGVBbHdheXNJbnRlcmFjdCA9IGtBRUFsd2F5c0ludGVyYWN0CitrT1NBTW9kZURvbnRSZWNvbm5lY3QgPSBrQUVEb250UmVjb25uZWN0CitrT1NBTW9kZUNhbnRTd2l0Y2hMYXllciA9IDB4MDAwMDAwNDAKK2tPU0FNb2RlRG9SZWNvcmQgPSAweDAwMDAxMDAwCitrT1NBTW9kZUNvbXBpbGVJbnRvQ29udGV4dCA9IDB4MDAwMDAwMDIKK2tPU0FNb2RlQXVnbWVudENvbnRleHQgPSAweDAwMDAwMDA0CitrT1NBTW9kZURpc3BsYXlGb3JIdW1hbnMgPSAweDAwMDAwMDA4CitrT1NBTW9kZURvbnRTdG9yZVBhcmVudCA9IDB4MDAwMTAwMDAKK2tPU0FNb2RlRGlzcGF0Y2hUb0RpcmVjdE9iamVjdCA9IDB4MDAwMjAwMDAKK2tPU0FNb2RlRG9udEdldERhdGFGb3JBcmd1bWVudHMgPSAweDAwMDQwMDAwCitrT1NBU2NyaXB0UmVzb3VyY2VUeXBlID0ga09TQUdlbmVyaWNTY3JpcHRpbmdDb21wb25lbnRTdWJ0eXBlCit0eXBlT1NBR2VuZXJpY1N0b3JhZ2UgPSBrT1NBU2NyaXB0UmVzb3VyY2VUeXBlCitrT1NBRXJyb3JOdW1iZXIgPSBrZXlFcnJvck51bWJlcgora09TQUVycm9yTWVzc2FnZSA9IGtleUVycm9yU3RyaW5nCitrT1NBRXJyb3JCcmllZk1lc3NhZ2UgPSBGT1VSX0NIQVJfQ09ERSgnZXJyYicpCitrT1NBRXJyb3JBcHAgPSBGT1VSX0NIQVJfQ09ERSgnZXJhcCcpCitrT1NBRXJyb3JQYXJ0aWFsUmVzdWx0ID0gRk9VUl9DSEFSX0NPREUoJ3B0bHInKQora09TQUVycm9yT2ZmZW5kaW5nT2JqZWN0ID0gRk9VUl9DSEFSX0NPREUoJ2Vyb2InKQora09TQUVycm9yRXhwZWN0ZWRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2VycnQnKQora09TQUVycm9yUmFuZ2UgPSBGT1VSX0NIQVJfQ09ERSgnZXJuZycpCit0eXBlT1NBRXJyb3JSYW5nZSA9IEZPVVJfQ0hBUl9DT0RFKCdlcm5nJykKK2tleU9TQVNvdXJjZVN0YXJ0ID0gRk9VUl9DSEFSX0NPREUoJ3NyY3MnKQora2V5T1NBU291cmNlRW5kID0gRk9VUl9DSEFSX0NPREUoJ3NyY2UnKQora09TQVVzZVN0YW5kYXJkRGlzcGF0Y2ggPSBrQUVVc2VTdGFuZGFyZERpc3BhdGNoCitrT1NBTm9EaXNwYXRjaCA9IGtBRU5vRGlzcGF0Y2gKK2tPU0FEb250VXNlUGhhYyA9IDB4MDAwMQorZU5vdFN0YXJ0ZWQgPSAwCitlUnVubmFibGUgPSAxCitlUnVubmluZyA9IDIKK2VTdG9wcGVkID0gMworZVRlcm1pbmF0ZWQgPSA0CitlU3RlcE92ZXIgPSAwCitlU3RlcEluID0gMQorZVN0ZXBPdXQgPSAyCitlUnVuID0gMworZUxvY2FsID0gMAorZUdsb2JhbCA9IDEKK2VQcm9wZXJ0aWVzID0gMgora2V5UHJvZ3JhbVN0YXRlID0gRk9VUl9DSEFSX0NPREUoJ2RzcHMnKQordHlwZVN0YXRlbWVudFJhbmdlID0gRk9VUl9DSEFSX0NPREUoJ3NybmcnKQora2V5UHJvY2VkdXJlTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCdkZm5tJykKK2tleVN0YXRlbWVudFJhbmdlID0gRk9VUl9DSEFSX0NPREUoJ2Rmc3InKQora2V5TG9jYWxzTmFtZXMgPSBGT1VSX0NIQVJfQ09ERSgnZGZsbicpCitrZXlHbG9iYWxzTmFtZXMgPSBGT1VSX0NIQVJfQ09ERSgnZGZnbicpCitrZXlQYXJhbXNOYW1lcyA9IEZPVVJfQ0hBUl9DT0RFKCdkZnBuJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL09TQWNvbnN0LnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL09TQWNvbnN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjYyNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vT1NBY29uc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL09TQWNvbnN0LnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL09TQWNvbnN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjYyNzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vT1NBY29uc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1FET2Zmc2NyZWVuLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUURPZmZzY3JlZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmNTU3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1FET2Zmc2NyZWVuLnB5CkBAIC0wLDAgKzEsNDcgQEAKKyMgR2VuZXJhdGVkIGZyb20gJ1FET2Zmc2NyZWVuLmgnCisKK2RlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHgKK3BpeFB1cmdlQml0ID0gMAorbm9OZXdEZXZpY2VCaXQgPSAxCit1c2VUZW1wTWVtQml0ID0gMgora2VlcExvY2FsQml0ID0gMwordXNlRGlzdGFudEhkd3JNZW1CaXQgPSA0Cit1c2VMb2NhbEhkd3JNZW1CaXQgPSA1CitwaXhlbHNQdXJnZWFibGVCaXQgPSA2CitwaXhlbHNMb2NrZWRCaXQgPSA3CittYXBQaXhCaXQgPSAxNgorbmV3RGVwdGhCaXQgPSAxNworYWxpZ25QaXhCaXQgPSAxOAorbmV3Um93Qnl0ZXNCaXQgPSAxOQorcmVhbGxvY1BpeEJpdCA9IDIwCitjbGlwUGl4Qml0ID0gMjgKK3N0cmV0Y2hQaXhCaXQgPSAyOQorZGl0aGVyUGl4Qml0ID0gMzAKK2d3RmxhZ0VyckJpdCA9IDMxCitwaXhQdXJnZSA9IDFMIDw8IHBpeFB1cmdlQml0Citub05ld0RldmljZSA9IDFMIDw8IG5vTmV3RGV2aWNlQml0Cit1c2VUZW1wTWVtID0gMUwgPDwgdXNlVGVtcE1lbUJpdAora2VlcExvY2FsID0gMUwgPDwga2VlcExvY2FsQml0Cit1c2VEaXN0YW50SGR3ck1lbSA9IDFMIDw8IHVzZURpc3RhbnRIZHdyTWVtQml0Cit1c2VMb2NhbEhkd3JNZW0gPSAxTCA8PCB1c2VMb2NhbEhkd3JNZW1CaXQKK3BpeGVsc1B1cmdlYWJsZSA9IDFMIDw8IHBpeGVsc1B1cmdlYWJsZUJpdAorcGl4ZWxzTG9ja2VkID0gMUwgPDwgcGl4ZWxzTG9ja2VkQml0CitrQWxsb2NEaXJlY3REcmF3U3VyZmFjZSA9IDFMIDw8IDE0CittYXBQaXggPSAxTCA8PCBtYXBQaXhCaXQKK25ld0RlcHRoID0gMUwgPDwgbmV3RGVwdGhCaXQKK2FsaWduUGl4ID0gMUwgPDwgYWxpZ25QaXhCaXQKK25ld1Jvd0J5dGVzID0gMUwgPDwgbmV3Um93Qnl0ZXNCaXQKK3JlYWxsb2NQaXggPSAxTCA8PCByZWFsbG9jUGl4Qml0CitjbGlwUGl4ID0gMUwgPDwgY2xpcFBpeEJpdAorc3RyZXRjaFBpeCA9IDFMIDw8IHN0cmV0Y2hQaXhCaXQKK2RpdGhlclBpeCA9IDFMIDw8IGRpdGhlclBpeEJpdAorZ3dGbGFnRXJyID0gMUwgPDwgZ3dGbGFnRXJyQml0CitkZXZpY2VJc0luZGlyZWN0ID0gKDFMIDw8IDApCitkZXZpY2VOZWVkc0xvY2sgPSAoMUwgPDwgMSkKK2RldmljZUlzU3RhdGljID0gKDFMIDw8IDIpCitkZXZpY2VJc0V4dGVybmFsQnVmZmVyID0gKDFMIDw8IDMpCitkZXZpY2VJc0REU3VyZmFjZSA9ICgxTCA8PCA0KQorZGV2aWNlSXNEQ0lTdXJmYWNlID0gKDFMIDw8IDUpCitkZXZpY2VJc0dESVN1cmZhY2UgPSAoMUwgPDwgNikKK2RldmljZUlzQVNjcmVlbiA9ICgxTCA8PCA3KQorZGV2aWNlSXNPdmVybGF5U3VyZmFjZSA9ICgxTCA8PCA4KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUURPZmZzY3JlZW4ucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUURPZmZzY3JlZW4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjczN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RRE9mZnNjcmVlbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUURPZmZzY3JlZW4ucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUURPZmZzY3JlZW4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjczN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RRE9mZnNjcmVlbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUWQucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjdmZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUWQucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfUWQgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1FkLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1FkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzM1NTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1FkLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1FkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzM1NTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1Fkb2Zmcy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1Fkb2Zmcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGEzZDJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUWRvZmZzLnB5CkBAIC0wLDAgKzEgQEAKK2Zyb20gX1Fkb2ZmcyBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUWRvZmZzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1Fkb2Zmcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzMjJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1Fkb2Zmcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUWRvZmZzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1Fkb2Zmcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzMjJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1Fkb2Zmcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUXQucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTBhOTJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUXQucHkKQEAgLTAsMCArMSw1IEBACitmcm9tIF9RdCBpbXBvcnQgKgordHJ5OgorICAgIF8gPSBBZGRGaWxlUHJldmlldworZXhjZXB0OgorICAgIHJhaXNlIEltcG9ydEVycm9yLCAiT2xkICgyLjMpIF9RdC5zbyBtb2R1bGUgbG9hZGVkIGluIHN0ZWFkIG9mIG5ldyAoMi40KSBfUXQuc28iCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdC5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiOGYxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1F0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdC5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiOGYxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1F0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdWlja0RyYXcucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdWlja0RyYXcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjMmY5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1F1aWNrRHJhdy5weQpAQCAtMCwwICsxLDIxOCBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnUXVpY2tEcmF3LmgnCisKKworZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geAorbm9ybWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwCitib2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEKK2l0YWxpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMgordW5kZXJsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA0CitvdXRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDgKK3NoYWRvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxMAorY29uZGVuc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIwCitleHRlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDAKK2ludmFsQ29sUmVxID0gLTEKK3NyY0NvcHkgPSAwCitzcmNPciA9IDEKK3NyY1hvciA9IDIKK3NyY0JpYyA9IDMKK25vdFNyY0NvcHkgPSA0Citub3RTcmNPciA9IDUKK25vdFNyY1hvciA9IDYKK25vdFNyY0JpYyA9IDcKK3BhdENvcHkgPSA4CitwYXRPciA9IDkKK3BhdFhvciA9IDEwCitwYXRCaWMgPSAxMQorbm90UGF0Q29weSA9IDEyCitub3RQYXRPciA9IDEzCitub3RQYXRYb3IgPSAxNAorbm90UGF0QmljID0gMTUKK2dyYXlpc2hUZXh0T3IgPSA0OQoraGlsaXRldHJhbnNmZXJtb2RlID0gNTAKK2hpbGl0ZSA9IDUwCitibGVuZCA9IDMyCithZGRQaW4gPSAzMworYWRkT3ZlciA9IDM0CitzdWJQaW4gPSAzNQorYWRkTWF4ID0gMzcKK2FkTWF4ID0gMzcKK3N1Yk92ZXIgPSAzOAorYWRNaW4gPSAzOQorZGl0aGVyQ29weSA9IDY0Cit0cmFuc3BhcmVudCA9IDM2CitpdGFsaWNCaXQgPSAxCit1bGluZUJpdCA9IDIKK291dGxpbmVCaXQgPSAzCitzaGFkb3dCaXQgPSA0Citjb25kZW5zZUJpdCA9IDUKK2V4dGVuZEJpdCA9IDYKK25vcm1hbEJpdCA9IDAKK2ludmVyc2VCaXQgPSAxCityZWRCaXQgPSA0CitncmVlbkJpdCA9IDMKK2JsdWVCaXQgPSAyCitjeWFuQml0ID0gOAorbWFnZW50YUJpdCA9IDcKK3llbGxvd0JpdCA9IDYKK2JsYWNrQml0ID0gNQorYmxhY2tDb2xvciA9IDMzCit3aGl0ZUNvbG9yID0gMzAKK3JlZENvbG9yID0gMjA1CitncmVlbkNvbG9yID0gMzQxCitibHVlQ29sb3IgPSA0MDkKK2N5YW5Db2xvciA9IDI3MworbWFnZW50YUNvbG9yID0gMTM3Cit5ZWxsb3dDb2xvciA9IDY5CitwaWNMUGFyZW4gPSAwCitwaWNSUGFyZW4gPSAxCitjbHV0VHlwZSA9IDAKK2ZpeGVkVHlwZSA9IDEKK2RpcmVjdFR5cGUgPSAyCitnZERldlR5cGUgPSAwCitpbnRlcmxhY2VkRGV2aWNlID0gMgoraHdNaXJyb3JlZERldmljZSA9IDQKK3JvdW5kZWREZXZpY2UgPSA1CitoYXNBdXhNZW51QmFyID0gNgorYnVyc3REZXZpY2UgPSA3CitleHQzMkRldmljZSA9IDgKK3JhbUluaXQgPSAxMAorbWFpblNjcmVlbiA9IDExCithbGxJbml0ID0gMTIKK3NjcmVlbkRldmljZSA9IDEzCitub0RyaXZlciA9IDE0CitzY3JlZW5BY3RpdmUgPSAxNQoraGlsaXRlQml0ID0gNworcEhpbGl0ZUJpdCA9IDAKK2RlZlFEQ29sb3JzID0gMTI3CitSR0JEaXJlY3QgPSAxNgorYmFzZUFkZHIzMiA9IDQKK3N5c1BhdExpc3RJRCA9IDAKK2lCZWFtQ3Vyc29yID0gMQorY3Jvc3NDdXJzb3IgPSAyCitwbHVzQ3Vyc29yID0gMword2F0Y2hDdXJzb3IgPSA0CitrUURHcmFmVmVyYkZyYW1lID0gMAora1FER3JhZlZlcmJQYWludCA9IDEKK2tRREdyYWZWZXJiRXJhc2UgPSAyCitrUURHcmFmVmVyYkludmVydCA9IDMKK2tRREdyYWZWZXJiRmlsbCA9IDQKK2ZyYW1lID0ga1FER3JhZlZlcmJGcmFtZQorcGFpbnQgPSBrUURHcmFmVmVyYlBhaW50CitlcmFzZSA9IGtRREdyYWZWZXJiRXJhc2UKK2ludmVydCA9IGtRREdyYWZWZXJiSW52ZXJ0CitmaWxsID0ga1FER3JhZlZlcmJGaWxsCitjaHVua3kgPSAwCitjaHVua3lQbGFuYXIgPSAxCitwbGFuYXIgPSAyCitzaW5nbGVEZXZpY2VzQml0ID0gMAorZG9udE1hdGNoU2VlZHNCaXQgPSAxCithbGxEZXZpY2VzQml0ID0gMgorc2luZ2xlRGV2aWNlcyA9IDEgPDwgc2luZ2xlRGV2aWNlc0JpdAorZG9udE1hdGNoU2VlZHMgPSAxIDw8IGRvbnRNYXRjaFNlZWRzQml0CithbGxEZXZpY2VzID0gMSA8PCBhbGxEZXZpY2VzQml0CitrUHJpbnRlckZvbnRTdGF0dXMgPSAwCitrUHJpbnRlclNjYWxpbmdTdGF0dXMgPSAxCitrTm9Db25zdHJhaW50ID0gMAora1ZlcnRpY2FsQ29uc3RyYWludCA9IDEKK2tIb3Jpem9udGFsQ29uc3RyYWludCA9IDIKK2sxTW9ub2Nocm9tZVBpeGVsRm9ybWF0ID0gMHgwMDAwMDAwMQorazJJbmRleGVkUGl4ZWxGb3JtYXQgPSAweDAwMDAwMDAyCitrNEluZGV4ZWRQaXhlbEZvcm1hdCA9IDB4MDAwMDAwMDQKK2s4SW5kZXhlZFBpeGVsRm9ybWF0ID0gMHgwMDAwMDAwOAorazE2QkU1NTVQaXhlbEZvcm1hdCA9IDB4MDAwMDAwMTAKK2syNFJHQlBpeGVsRm9ybWF0ID0gMHgwMDAwMDAxOAorazMyQVJHQlBpeGVsRm9ybWF0ID0gMHgwMDAwMDAyMAorazFJbmRleGVkR3JheVBpeGVsRm9ybWF0ID0gMHgwMDAwMDAyMQorazJJbmRleGVkR3JheVBpeGVsRm9ybWF0ID0gMHgwMDAwMDAyMgorazRJbmRleGVkR3JheVBpeGVsRm9ybWF0ID0gMHgwMDAwMDAyNAorazhJbmRleGVkR3JheVBpeGVsRm9ybWF0ID0gMHgwMDAwMDAyOAorazE2TEU1NTVQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdMNTU1JykKK2sxNkxFNTU1MVBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJzU1NTEnKQorazE2QkU1NjVQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdCNTY1JykKK2sxNkxFNTY1UGl4ZWxGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnTDU2NScpCitrMjRCR1JQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCcyNEJHJykKK2szMkJHUkFQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdCR1JBJykKK2szMkFCR1JQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdBQkdSJykKK2szMlJHQkFQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdSR0JBJykKK2tZVVZTUGl4ZWxGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgneXV2cycpCitrWVVWVVBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ3l1dnUnKQora1lWVTlQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdZVlU5JykKK2tZVVY0MTFQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdZNDExJykKK2tZVllVNDIyUGl4ZWxGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnWVZZVScpCitrVVlWWTQyMlBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ1VZVlknKQora1lVVjIxMVBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ1kyMTEnKQorazJ2dXlQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCcydnV5JykKK2tDdXJzb3JJbWFnZU1ham9yVmVyc2lvbiA9IDB4MDAwMQora0N1cnNvckltYWdlTWlub3JWZXJzaW9uID0gMHgwMDAwCitrUURQYXJzZVJlZ2lvbkZyb21Ub3AgPSAoMSA8PCAwKQora1FEUGFyc2VSZWdpb25Gcm9tQm90dG9tID0gKDEgPDwgMSkKK2tRRFBhcnNlUmVnaW9uRnJvbUxlZnQgPSAoMSA8PCAyKQora1FEUGFyc2VSZWdpb25Gcm9tUmlnaHQgPSAoMSA8PCAzKQora1FEUGFyc2VSZWdpb25Gcm9tVG9wTGVmdCA9IGtRRFBhcnNlUmVnaW9uRnJvbVRvcCB8IGtRRFBhcnNlUmVnaW9uRnJvbUxlZnQKK2tRRFBhcnNlUmVnaW9uRnJvbUJvdHRvbVJpZ2h0ID0ga1FEUGFyc2VSZWdpb25Gcm9tQm90dG9tIHwga1FEUGFyc2VSZWdpb25Gcm9tUmlnaHQKK2tRRFJlZ2lvblRvUmVjdHNNc2dJbml0ID0gMQora1FEUmVnaW9uVG9SZWN0c01zZ1BhcnNlID0gMgora1FEUmVnaW9uVG9SZWN0c01zZ1Rlcm1pbmF0ZSA9IDMKK2NvbG9yWG9yWEZlciA9IDUyCitub2lzZVhGZXIgPSA1MworY3VzdG9tWEZlciA9IDU0CitrWEZlcjFQaXhlbEF0QVRpbWUgPSAweDAwMDAwMDAxCitrWEZlckNvbnZlcnRQaXhlbFRvUkdCMzIgPSAweDAwMDAwMDAyCitrQ3Vyc29yQ29tcG9uZW50c1ZlcnNpb24gPSAweDAwMDEwMDAxCitrQ3Vyc29yQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjdXJzJykKK2N1cnNvckRvZXNBbmltYXRlID0gMUwgPDwgMAorY3Vyc29yRG9lc0hhcmR3YXJlID0gMUwgPDwgMQorY3Vyc29yRG9lc1VucmVhZGFibGVTY3JlZW5CaXRzID0gMUwgPDwgMgora1JlbmRlckN1cnNvckluSGFyZHdhcmUgPSAxTCA8PCAwCitrUmVuZGVyQ3Vyc29ySW5Tb2Z0d2FyZSA9IDFMIDw8IDEKK2tDdXJzb3JDb21wb25lbnRJbml0ID0gMHgwMDAxCitrQ3Vyc29yQ29tcG9uZW50R2V0SW5mbyA9IDB4MDAwMgora0N1cnNvckNvbXBvbmVudFNldE91dHB1dE1vZGUgPSAweDAwMDMKK2tDdXJzb3JDb21wb25lbnRTZXREYXRhID0gMHgwMDA0CitrQ3Vyc29yQ29tcG9uZW50UmVjb25maWd1cmUgPSAweDAwMDUKK2tDdXJzb3JDb21wb25lbnREcmF3ID0gMHgwMDA2CitrQ3Vyc29yQ29tcG9uZW50RXJhc2UgPSAweDAwMDcKK2tDdXJzb3JDb21wb25lbnRNb3ZlID0gMHgwMDA4CitrQ3Vyc29yQ29tcG9uZW50QW5pbWF0ZSA9IDB4MDAwOQora0N1cnNvckNvbXBvbmVudExhc3RSZXNlcnZlZCA9IDB4MDA1MAorIyBHZW5lcmF0ZWQgZnJvbSAnUXVpY2tEcmF3VGV4dC5oJworCisKK2RlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHgKK25vcm1hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMAorYm9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxCitpdGFsaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDIKK3VuZGVybGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNAorb3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSA4CitzaGFkb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTAKK2NvbmRlbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyMAorZXh0ZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQwCitsZWZ0Q2FyZXQgPSAwCityaWdodENhcmV0ID0gLTEKK2tIaWxpdGUgPSAxCitzbUxlZnRDYXJldCA9IDAKK3NtUmlnaHRDYXJldCA9IC0xCitzbUhpbGl0ZSA9IDEKK29ubHlTdHlsZVJ1biA9IDAKK2xlZnRTdHlsZVJ1biA9IDEKK3JpZ2h0U3R5bGVSdW4gPSAyCittaWRkbGVTdHlsZVJ1biA9IDMKK3NtT25seVN0eWxlUnVuID0gMAorc21MZWZ0U3R5bGVSdW4gPSAxCitzbVJpZ2h0U3R5bGVSdW4gPSAyCitzbU1pZGRsZVN0eWxlUnVuID0gMwordHJ1bmNFbmQgPSAwCit0cnVuY01pZGRsZSA9IDB4NDAwMAorc21UcnVuY0VuZCA9IDAKK3NtVHJ1bmNNaWRkbGUgPSAweDQwMDAKK25vdFRydW5jYXRlZCA9IDAKK3RydW5jYXRlZCA9IDEKK3RydW5jRXJyID0gLTEKK3NtTm90VHJ1bmNhdGVkID0gMAorc21UcnVuY2F0ZWQgPSAxCitzbVRydW5jRXJyID0gLTEKK3NtQnJlYWtXb3JkID0gMAorc21CcmVha0NoYXIgPSAxCitzbUJyZWFrT3ZlcmZsb3cgPSAyCit0ZkFudGlBbGlhcyA9IDEgPDwgMAordGZVbmljb2RlID0gMSA8PCAxCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdWlja0RyYXcucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUXVpY2tEcmF3LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzhmYzEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUXVpY2tEcmF3LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdWlja0RyYXcucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUXVpY2tEcmF3LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzhmYzEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUXVpY2tEcmF3LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdWlja1RpbWUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdWlja1RpbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiYTU4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1F1aWNrVGltZS5weQpAQCAtMCwwICsxLDM0NjggQEAKKyMgR2VuZXJhdGVkIGZyb20gJ01vdmllcy5oJworCitkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4Cit4bWxJZGVudGlmaWVyVW5yZWNvZ25pemVkID0gLTEKK2tDb250cm9sbGVyTWluaW11bSA9IC0weGY3NzcKK25vdEltcGxlbWVudGVkTXVzaWNPU0VyciAgICAgID0gLTIwNzEKK2NhbnRTZW5kVG9TeW50aGVzaXplck9TRXJyICAgID0gLTIwNzIKK2NhbnRSZWNlaXZlRnJvbVN5bnRoZXNpemVyT1NFcnIgPSAtMjA3MworaWxsZWdhbFZvaWNlQWxsb2NhdGlvbk9TRXJyICAgPSAtMjA3NAoraWxsZWdhbFBhcnRPU0VyciAgICAgICAgICAgICAgPSAtMjA3NQoraWxsZWdhbENoYW5uZWxPU0VyciAgICAgICAgICAgPSAtMjA3NgoraWxsZWdhbEtub2JPU0VyciAgICAgICAgICAgICAgPSAtMjA3NworaWxsZWdhbEtub2JWYWx1ZU9TRXJyICAgICAgICAgPSAtMjA3OAoraWxsZWdhbEluc3RydW1lbnRPU0VyciAgICAgICAgPSAtMjA3OQoraWxsZWdhbENvbnRyb2xsZXJPU0VyciAgICAgICAgPSAtMjA4MAorbWlkaU1hbmFnZXJBYnNlbnRPU0VyciAgICAgICAgPSAtMjA4MQorc3ludGhlc2l6ZXJOb3RSZXNwb25kaW5nT1NFcnIgPSAtMjA4Mgorc3ludGhlc2l6ZXJPU0VyciAgICAgICAgICAgICAgPSAtMjA4MworaWxsZWdhbE5vdGVDaGFubmVsT1NFcnIgICAgICAgPSAtMjA4NAorbm90ZUNoYW5uZWxOb3RBbGxvY2F0ZWRPU0VyciAgPSAtMjA4NQordHVuZVBsYXllckZ1bGxPU0VyciAgICAgICAgICAgPSAtMjA4NgordHVuZVBhcnNlT1NFcnIgICAgICAgICAgICAgICAgPSAtMjA4NworTW92aWVGaWxlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdNb29WJykKK01vdmllU2NyYXBUeXBlID0gRk9VUl9DSEFSX0NPREUoJ21vb3YnKQorTW92aWVSZXNvdXJjZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbW9vdicpCitNb3ZpZUZvcndhcmRQb2ludGVyUmVzb3VyY2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ZvcmUnKQorTW92aWVCYWNrd2FyZFBvaW50ZXJSZXNvdXJjZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYmFjaycpCitNb3ZpZVJlc291cmNlQXRvbVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbW9vdicpCitNb3ZpZURhdGFBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtZGF0JykKK0ZyZWVBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdmcmVlJykKK1NraXBBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdza2lwJykKK1dpZGVBdG9tUGxhY2Vob2xkZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3dpZGUnKQorTWVkaWFIYW5kbGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtaGxyJykKK0RhdGFIYW5kbGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkaGxyJykKK1ZpZGVvTWVkaWFUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3ZpZGUnKQorU291bmRNZWRpYVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc291bicpCitUZXh0TWVkaWFUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RleHQnKQorQmFzZU1lZGlhVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdnbnJjJykKK01QRUdNZWRpYVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnTVBFRycpCitNdXNpY01lZGlhVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtdXNpJykKK1RpbWVDb2RlTWVkaWFUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RtY2QnKQorU3ByaXRlTWVkaWFUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NwcnQnKQorRmxhc2hNZWRpYVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmxzaCcpCitNb3ZpZU1lZGlhVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtb292JykKK1R3ZWVuTWVkaWFUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3R3ZW4nKQorVGhyZWVEZWVNZWRpYVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncWQzZCcpCitTa2luTWVkaWFUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NraW4nKQorSGFuZGxlRGF0YUhhbmRsZXJTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2huZGwnKQorUG9pbnRlckRhdGFIYW5kbGVyU3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdwdHIgJykKK051bGxEYXRhSGFuZGxlclN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbnVsbCcpCitSZXNvdXJjZURhdGFIYW5kbGVyU3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdyc3JjJykKK1VSTERhdGFIYW5kbGVyU3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd1cmwgJykKK1dpcmVkQWN0aW9uSGFuZGxlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnd2lyZScpCitWaXN1YWxNZWRpYUNoYXJhY3RlcmlzdGljID0gRk9VUl9DSEFSX0NPREUoJ2V5ZXMnKQorQXVkaW9NZWRpYUNoYXJhY3RlcmlzdGljID0gRk9VUl9DSEFSX0NPREUoJ2VhcnMnKQora0NoYXJhY3RlcmlzdGljQ2FuU2VuZFZpZGVvID0gRk9VUl9DSEFSX0NPREUoJ3ZzbmQnKQora0NoYXJhY3RlcmlzdGljUHJvdmlkZXNBY3Rpb25zID0gRk9VUl9DSEFSX0NPREUoJ2FjdG4nKQora0NoYXJhY3RlcmlzdGljTm9uTGluZWFyID0gRk9VUl9DSEFSX0NPREUoJ25vbmwnKQora0NoYXJhY3RlcmlzdGljQ2FuU3RlcCA9IEZPVVJfQ0hBUl9DT0RFKCdzdGVwJykKK2tDaGFyYWN0ZXJpc3RpY0hhc05vRHVyYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnbm90aScpCitrQ2hhcmFjdGVyaXN0aWNIYXNTa2luRGF0YSA9IEZPVVJfQ0hBUl9DT0RFKCdza2luJykKK2tDaGFyYWN0ZXJpc3RpY1Byb3ZpZGVzS2V5Rm9jdXMgPSBGT1VSX0NIQVJfQ09ERSgna2V5ZicpCitrVXNlckRhdGFNb3ZpZUNvbnRyb2xsZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2N0eXAnKQora1VzZXJEYXRhTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCduYW1lJykKK2tVc2VyRGF0YVRleHRBbGJ1bSA9IEZPVVJfQ0hBUl9DT0RFKCdceGE5YWxiJykKK2tVc2VyRGF0YVRleHRBcnRpc3QgPSBGT1VSX0NIQVJfQ09ERSgnXHhhOUFSVCcpCitrVXNlckRhdGFUZXh0QXV0aG9yID0gRk9VUl9DSEFSX0NPREUoJ1x4YTlhdXQnKQora1VzZXJEYXRhVGV4dENoYXB0ZXIgPSBGT1VSX0NIQVJfQ09ERSgnXHhhOWNocCcpCitrVXNlckRhdGFUZXh0Q29tbWVudCA9IEZPVVJfQ0hBUl9DT0RFKCdceGE5Y210JykKK2tVc2VyRGF0YVRleHRDb21wb3NlciA9IEZPVVJfQ0hBUl9DT0RFKCdceGE5Y29tJykKK2tVc2VyRGF0YVRleHRDb3B5cmlnaHQgPSBGT1VSX0NIQVJfQ09ERSgnXHhhOWNweScpCitrVXNlckRhdGFUZXh0Q3JlYXRpb25EYXRlID0gRk9VUl9DSEFSX0NPREUoJ1x4YTlkYXknKQora1VzZXJEYXRhVGV4dERlc2NyaXB0aW9uID0gRk9VUl9DSEFSX0NPREUoJ1x4YTlkZXMnKQora1VzZXJEYXRhVGV4dERpcmVjdG9yID0gRk9VUl9DSEFSX0NPREUoJ1x4YTlkaXInKQora1VzZXJEYXRhVGV4dERpc2NsYWltZXIgPSBGT1VSX0NIQVJfQ09ERSgnXHhhOWRpcycpCitrVXNlckRhdGFUZXh0RW5jb2RlZEJ5ID0gRk9VUl9DSEFSX0NPREUoJ1x4YTllbmMnKQora1VzZXJEYXRhVGV4dEZ1bGxOYW1lID0gRk9VUl9DSEFSX0NPREUoJ1x4YTluYW0nKQora1VzZXJEYXRhVGV4dEdlbnJlID0gRk9VUl9DSEFSX0NPREUoJ1x4YTlnZW4nKQora1VzZXJEYXRhVGV4dEhvc3RDb21wdXRlciA9IEZPVVJfQ0hBUl9DT0RFKCdceGE5aHN0JykKK2tVc2VyRGF0YVRleHRJbmZvcm1hdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdceGE5aW5mJykKK2tVc2VyRGF0YVRleHRLZXl3b3JkcyA9IEZPVVJfQ0hBUl9DT0RFKCdceGE5a2V5JykKK2tVc2VyRGF0YVRleHRNYWtlID0gRk9VUl9DSEFSX0NPREUoJ1x4YTltYWsnKQora1VzZXJEYXRhVGV4dE1vZGVsID0gRk9VUl9DSEFSX0NPREUoJ1x4YTltb2QnKQora1VzZXJEYXRhVGV4dE9yaWdpbmFsQXJ0aXN0ID0gRk9VUl9DSEFSX0NPREUoJ1x4YTlvcGUnKQora1VzZXJEYXRhVGV4dE9yaWdpbmFsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ1x4YTlmbXQnKQora1VzZXJEYXRhVGV4dE9yaWdpbmFsU291cmNlID0gRk9VUl9DSEFSX0NPREUoJ1x4YTlzcmMnKQora1VzZXJEYXRhVGV4dFBlcmZvcm1lcnMgPSBGT1VSX0NIQVJfQ09ERSgnXHhhOXByZicpCitrVXNlckRhdGFUZXh0UHJvZHVjZXIgPSBGT1VSX0NIQVJfQ09ERSgnXHhhOXByZCcpCitrVXNlckRhdGFUZXh0UHJvZHVjdCA9IEZPVVJfQ0hBUl9DT0RFKCdceGE5UFJEJykKK2tVc2VyRGF0YVRleHRTb2Z0d2FyZSA9IEZPVVJfQ0hBUl9DT0RFKCdceGE5c3dyJykKK2tVc2VyRGF0YVRleHRTcGVjaWFsUGxheWJhY2tSZXF1aXJlbWVudHMgPSBGT1VSX0NIQVJfQ09ERSgnXHhhOXJlcScpCitrVXNlckRhdGFUZXh0VHJhY2sgPSBGT1VSX0NIQVJfQ09ERSgnXHhhOXRyaycpCitrVXNlckRhdGFUZXh0V2FybmluZyA9IEZPVVJfQ0hBUl9DT0RFKCdceGE5d3JuJykKK2tVc2VyRGF0YVRleHRXcml0ZXIgPSBGT1VSX0NIQVJfQ09ERSgnXHhhOXdydCcpCitrVXNlckRhdGFUZXh0VVJMTGluayA9IEZPVVJfQ0hBUl9DT0RFKCdceGE5dXJsJykKK2tVc2VyRGF0YVRleHRFZGl0RGF0ZTEgPSBGT1VSX0NIQVJfQ09ERSgnXHhhOWVkMScpCitrVXNlckRhdGFVbmljb2RlQml0ID0gMUwgPDwgNworRG9UaGVSaWdodFRoaW5nID0gMAora1FUTmV0d29ya1N0YXR1c05vTmV0d29yayA9IC0yCitrUVROZXR3b3JrU3RhdHVzVW5jZXJ0YWluID0gLTEKK2tRVE5ldHdvcmtTdGF0dXNOb3RDb25uZWN0ZWQgPSAwCitrUVROZXR3b3JrU3RhdHVzQ29ubmVjdGVkID0gMQora011c2ljRmxhZ0RvbnRQbGF5MlNvZnQgPSAxTCA8PCAwCitrTXVzaWNGbGFnRG9udFNsYXZlVG9Nb3ZpZSA9IDFMIDw8IDEKK2RmRG9udERpc3BsYXkgPSAxIDw8IDAKK2RmRG9udEF1dG9TY2FsZSA9IDEgPDwgMQorZGZDbGlwVG9UZXh0Qm94ID0gMSA8PCAyCitkZlVzZU1vdmllQkdDb2xvciA9IDEgPDwgMworZGZTaHJpbmtUZXh0Qm94VG9GaXQgPSAxIDw8IDQKK2RmU2Nyb2xsSW4gPSAxIDw8IDUKK2RmU2Nyb2xsT3V0ID0gMSA8PCA2CitkZkhvcml6U2Nyb2xsID0gMSA8PCA3CitkZlJldmVyc2VTY3JvbGwgPSAxIDw8IDgKK2RmQ29udGludW91c1Njcm9sbCA9IDEgPDwgOQorZGZGbG93SG9yaXogPSAxIDw8IDEwCitkZkNvbnRpbnVvdXNLYXJhb2tlID0gMSA8PCAxMQorZGZEcm9wU2hhZG93ID0gMSA8PCAxMgorZGZBbnRpQWxpYXMgPSAxIDw8IDEzCitkZktleWVkVGV4dCA9IDEgPDwgMTQKK2RmSW52ZXJzZUhpbGl0ZSA9IDEgPDwgMTUKK2RmVGV4dENvbG9ySGlsaXRlID0gMSA8PCAxNgorc2VhcmNoVGV4dERvbnRHb1RvRm91bmRUaW1lID0gMUwgPDwgMTYKK3NlYXJjaFRleHREb250SGlsaXRlRm91bmRUZXh0ID0gMUwgPDwgMTcKK3NlYXJjaFRleHRPbmVUcmFja09ubHkgPSAxTCA8PCAxOAorc2VhcmNoVGV4dEVuYWJsZWRUcmFja3NPbmx5ID0gMUwgPDwgMTkKK2tUZXh0VGV4dEhhbmRsZSA9IDEKK2tUZXh0VGV4dFB0ciA9IDIKK2tUZXh0VEVTdHlsZSA9IDMKK2tUZXh0U2VsZWN0aW9uID0gNAora1RleHRCYWNrQ29sb3IgPSA1CitrVGV4dEZvcmVDb2xvciA9IDYKK2tUZXh0RmFjZSA9IDcKK2tUZXh0Rm9udCA9IDgKK2tUZXh0U2l6ZSA9IDkKK2tUZXh0QWxpZ25tZW50ID0gMTAKK2tUZXh0SGlsaXRlID0gMTEKK2tUZXh0RHJvcFNoYWRvdyA9IDEyCitrVGV4dERpc3BsYXlGbGFncyA9IDEzCitrVGV4dFNjcm9sbCA9IDE0CitrVGV4dFJlbGF0aXZlU2Nyb2xsID0gMTUKK2tUZXh0SHlwZXJUZXh0RmFjZSA9IDE2CitrVGV4dEh5cGVyVGV4dENvbG9yID0gMTcKK2tUZXh0S2V5RW50cnkgPSAxOAora1RleHRNb3VzZURvd24gPSAxOQora1RleHRUZXh0Qm94ID0gMjAKK2tUZXh0RWRpdFN0YXRlID0gMjEKK2tUZXh0TGVuZ3RoID0gMjIKK2szRE1lZGlhUmVuZGVyZXJFbnRyeSA9IEZPVVJfQ0hBUl9DT0RFKCdyZW5kJykKK2szRE1lZGlhUmVuZGVyZXJOYW1lID0gRk9VUl9DSEFSX0NPREUoJ25hbWUnKQorazNETWVkaWFSZW5kZXJlckNvZGUgPSBGT1VSX0NIQVJfQ09ERSgncmNvZCcpCittb3ZpZVByb2dyZXNzT3BlbiA9IDAKK21vdmllUHJvZ3Jlc3NVcGRhdGVQZXJjZW50ID0gMQorbW92aWVQcm9ncmVzc0Nsb3NlID0gMgorcHJvZ3Jlc3NPcEZsYXR0ZW4gPSAxCitwcm9ncmVzc09wSW5zZXJ0VHJhY2tTZWdtZW50ID0gMgorcHJvZ3Jlc3NPcEluc2VydE1vdmllU2VnbWVudCA9IDMKK3Byb2dyZXNzT3BQYXN0ZSA9IDQKK3Byb2dyZXNzT3BBZGRNb3ZpZVNlbGVjdGlvbiA9IDUKK3Byb2dyZXNzT3BDb3B5ID0gNgorcHJvZ3Jlc3NPcEN1dCA9IDcKK3Byb2dyZXNzT3BMb2FkTW92aWVJbnRvUmFtID0gOAorcHJvZ3Jlc3NPcExvYWRUcmFja0ludG9SYW0gPSA5Citwcm9ncmVzc09wTG9hZE1lZGlhSW50b1JhbSA9IDEwCitwcm9ncmVzc09wSW1wb3J0TW92aWUgPSAxMQorcHJvZ3Jlc3NPcEV4cG9ydE1vdmllID0gMTIKK21lZGlhUXVhbGl0eURyYWZ0ID0gMHgwMDAwCittZWRpYVF1YWxpdHlOb3JtYWwgPSAweDAwNDAKK21lZGlhUXVhbGl0eUJldHRlciA9IDB4MDA4MAorbWVkaWFRdWFsaXR5QmVzdCA9IDB4MDBDMAora1FURXZlbnRQYXlsb2FkSXNRVExpc3QgPSAxTCA8PCAwCitrQWN0aW9uTW92aWVTZXRWb2x1bWUgPSAxMDI0CitrQWN0aW9uTW92aWVTZXRSYXRlID0gMTAyNQora0FjdGlvbk1vdmllU2V0TG9vcGluZ0ZsYWdzID0gMTAyNgora0FjdGlvbk1vdmllR29Ub1RpbWUgPSAxMDI3CitrQWN0aW9uTW92aWVHb1RvVGltZUJ5TmFtZSA9IDEwMjgKK2tBY3Rpb25Nb3ZpZUdvVG9CZWdpbm5pbmcgPSAxMDI5CitrQWN0aW9uTW92aWVHb1RvRW5kID0gMTAzMAora0FjdGlvbk1vdmllU3RlcEZvcndhcmQgPSAxMDMxCitrQWN0aW9uTW92aWVTdGVwQmFja3dhcmQgPSAxMDMyCitrQWN0aW9uTW92aWVTZXRTZWxlY3Rpb24gPSAxMDMzCitrQWN0aW9uTW92aWVTZXRTZWxlY3Rpb25CeU5hbWUgPSAxMDM0CitrQWN0aW9uTW92aWVQbGF5U2VsZWN0aW9uID0gMTAzNQora0FjdGlvbk1vdmllU2V0TGFuZ3VhZ2UgPSAxMDM2CitrQWN0aW9uTW92aWVDaGFuZ2VkID0gMTAzNwora0FjdGlvbk1vdmllUmVzdGFydEF0VGltZSA9IDEwMzgKK2tBY3Rpb25Nb3ZpZUdvdG9OZXh0Q2hhcHRlciA9IDEwMzkKK2tBY3Rpb25Nb3ZpZUdvdG9QcmV2aW91c0NoYXB0ZXIgPSAxMDQwCitrQWN0aW9uTW92aWVHb3RvRmlyc3RDaGFwdGVyID0gMTA0MQora0FjdGlvbk1vdmllR290b0xhc3RDaGFwdGVyID0gMTA0Mgora0FjdGlvbk1vdmllR290b0NoYXB0ZXJCeUluZGV4ID0gMTA0Mwora0FjdGlvbk1vdmllU2V0U2NhbGUgPSAxMDQ0CitrQWN0aW9uVHJhY2tTZXRWb2x1bWUgPSAyMDQ4CitrQWN0aW9uVHJhY2tTZXRCYWxhbmNlID0gMjA0OQora0FjdGlvblRyYWNrU2V0RW5hYmxlZCA9IDIwNTAKK2tBY3Rpb25UcmFja1NldE1hdHJpeCA9IDIwNTEKK2tBY3Rpb25UcmFja1NldExheWVyID0gMjA1Mgora0FjdGlvblRyYWNrU2V0Q2xpcCA9IDIwNTMKK2tBY3Rpb25UcmFja1NldEN1cnNvciA9IDIwNTQKK2tBY3Rpb25UcmFja1NldEdyYXBoaWNzTW9kZSA9IDIwNTUKK2tBY3Rpb25UcmFja1NldElkbGVGcmVxdWVuY3kgPSAyMDU2CitrQWN0aW9uVHJhY2tTZXRCYXNzVHJlYmxlID0gMjA1Nwora0FjdGlvblNwcml0ZVNldE1hdHJpeCA9IDMwNzIKK2tBY3Rpb25TcHJpdGVTZXRJbWFnZUluZGV4ID0gMzA3Mwora0FjdGlvblNwcml0ZVNldFZpc2libGUgPSAzMDc0CitrQWN0aW9uU3ByaXRlU2V0TGF5ZXIgPSAzMDc1CitrQWN0aW9uU3ByaXRlU2V0R3JhcGhpY3NNb2RlID0gMzA3Ngora0FjdGlvblNwcml0ZVBhc3NNb3VzZVRvQ29kZWMgPSAzMDc4CitrQWN0aW9uU3ByaXRlQ2xpY2tPbkNvZGVjID0gMzA3OQora0FjdGlvblNwcml0ZVRyYW5zbGF0ZSA9IDMwODAKK2tBY3Rpb25TcHJpdGVTY2FsZSA9IDMwODEKK2tBY3Rpb25TcHJpdGVSb3RhdGUgPSAzMDgyCitrQWN0aW9uU3ByaXRlU3RyZXRjaCA9IDMwODMKK2tBY3Rpb25TcHJpdGVTZXRDYW5CZUhpdFRlc3RlZCA9IDMwOTQKK2tBY3Rpb25RVFZSU2V0UGFuQW5nbGUgPSA0MDk2CitrQWN0aW9uUVRWUlNldFRpbHRBbmdsZSA9IDQwOTcKK2tBY3Rpb25RVFZSU2V0RmllbGRPZlZpZXcgPSA0MDk4CitrQWN0aW9uUVRWUlNob3dEZWZhdWx0VmlldyA9IDQwOTkKK2tBY3Rpb25RVFZSR29Ub05vZGVJRCA9IDQxMDAKK2tBY3Rpb25RVFZSRW5hYmxlSG90U3BvdCA9IDQxMDEKK2tBY3Rpb25RVFZSU2hvd0hvdFNwb3RzID0gNDEwMgora0FjdGlvblFUVlJUcmFuc2xhdGVPYmplY3QgPSA0MTAzCitrQWN0aW9uUVRWUlNldFZpZXdTdGF0ZSA9IDQxMDkKK2tBY3Rpb25NdXNpY1BsYXlOb3RlID0gNTEyMAora0FjdGlvbk11c2ljU2V0Q29udHJvbGxlciA9IDUxMjEKK2tBY3Rpb25DYXNlID0gNjE0NAora0FjdGlvbldoaWxlID0gNjE0NQora0FjdGlvbkdvVG9VUkwgPSA2MTQ2CitrQWN0aW9uU2VuZFFURXZlbnRUb1Nwcml0ZSA9IDYxNDcKK2tBY3Rpb25EZWJ1Z1N0ciA9IDYxNDgKK2tBY3Rpb25QdXNoQ3VycmVudFRpbWUgPSA2MTQ5CitrQWN0aW9uUHVzaEN1cnJlbnRUaW1lV2l0aExhYmVsID0gNjE1MAora0FjdGlvblBvcEFuZEdvdG9Ub3BUaW1lID0gNjE1MQora0FjdGlvblBvcEFuZEdvdG9MYWJlbGVkVGltZSA9IDYxNTIKK2tBY3Rpb25TdGF0dXNTdHJpbmcgPSA2MTUzCitrQWN0aW9uU2VuZFFURXZlbnRUb1RyYWNrT2JqZWN0ID0gNjE1NAora0FjdGlvbkFkZENoYW5uZWxTdWJzY3JpcHRpb24gPSA2MTU1CitrQWN0aW9uUmVtb3ZlQ2hhbm5lbFN1YnNjcmlwdGlvbiA9IDYxNTYKK2tBY3Rpb25PcGVuQ3VzdG9tQWN0aW9uSGFuZGxlciA9IDYxNTcKK2tBY3Rpb25Eb1NjcmlwdCA9IDYxNTgKK2tBY3Rpb25Eb0NvbXByZXNzZWRBY3Rpb25zID0gNjE1OQora0FjdGlvblNlbmRBcHBNZXNzYWdlID0gNjE2MAora0FjdGlvbkxvYWRDb21wb25lbnQgPSA2MTYxCitrQWN0aW9uU2V0Rm9jdXMgPSA2MTYyCitrQWN0aW9uRG9udFBhc3NLZXlFdmVudCA9IDYxNjMKK2tBY3Rpb25TZXRSYW5kb21TZWVkID0gNjE2NAora0FjdGlvblNwcml0ZVRyYWNrU2V0VmFyaWFibGUgPSA3MTY4CitrQWN0aW9uU3ByaXRlVHJhY2tOZXdTcHJpdGUgPSA3MTY5CitrQWN0aW9uU3ByaXRlVHJhY2tEaXNwb3NlU3ByaXRlID0gNzE3MAora0FjdGlvblNwcml0ZVRyYWNrU2V0VmFyaWFibGVUb1N0cmluZyA9IDcxNzEKK2tBY3Rpb25TcHJpdGVUcmFja0NvbmNhdFZhcmlhYmxlcyA9IDcxNzIKK2tBY3Rpb25TcHJpdGVUcmFja1NldFZhcmlhYmxlVG9Nb3ZpZVVSTCA9IDcxNzMKK2tBY3Rpb25TcHJpdGVUcmFja1NldFZhcmlhYmxlVG9Nb3ZpZUJhc2VVUkwgPSA3MTc0CitrQWN0aW9uU3ByaXRlVHJhY2tTZXRBbGxTcHJpdGVzSGl0VGVzdGluZ01vZGUgPSA3MTgxCitrQWN0aW9uU3ByaXRlVHJhY2tOZXdJbWFnZSA9IDcxODIKK2tBY3Rpb25TcHJpdGVUcmFja0Rpc3Bvc2VJbWFnZSA9IDcxODMKK2tBY3Rpb25BcHBsaWNhdGlvbk51bWJlckFuZFN0cmluZyA9IDgxOTIKK2tBY3Rpb25RRDNETmFtZWRPYmplY3RUcmFuc2xhdGVUbyA9IDkyMTYKK2tBY3Rpb25RRDNETmFtZWRPYmplY3RTY2FsZVRvID0gOTIxNwora0FjdGlvblFEM0ROYW1lZE9iamVjdFJvdGF0ZVRvID0gOTIxOAora0FjdGlvbkZsYXNoVHJhY2tTZXRQYW4gPSAxMDI0MAora0FjdGlvbkZsYXNoVHJhY2tTZXRab29tID0gMTAyNDEKK2tBY3Rpb25GbGFzaFRyYWNrU2V0Wm9vbVJlY3QgPSAxMDI0Mgora0FjdGlvbkZsYXNoVHJhY2tHb3RvRnJhbWVOdW1iZXIgPSAxMDI0Mwora0FjdGlvbkZsYXNoVHJhY2tHb3RvRnJhbWVMYWJlbCA9IDEwMjQ0CitrQWN0aW9uRmxhc2hUcmFja1NldEZsYXNoVmFyaWFibGUgPSAxMDI0NQora0FjdGlvbkZsYXNoVHJhY2tEb0J1dHRvbkFjdGlvbnMgPSAxMDI0Ngora0FjdGlvbk1vdmllVHJhY2tBZGRDaGlsZE1vdmllID0gMTEyNjQKK2tBY3Rpb25Nb3ZpZVRyYWNrTG9hZENoaWxkTW92aWUgPSAxMTI2NQora0FjdGlvbk1vdmllVHJhY2tMb2FkQ2hpbGRNb3ZpZVdpdGhRVExpc3RQYXJhbXMgPSAxMTI2Ngora0FjdGlvblRleHRUcmFja1Bhc3RlVGV4dCA9IDEyMjg4CitrQWN0aW9uVGV4dFRyYWNrU2V0VGV4dEJveCA9IDEyMjkxCitrQWN0aW9uVGV4dFRyYWNrU2V0VGV4dFN0eWxlID0gMTIyOTIKK2tBY3Rpb25UZXh0VHJhY2tTZXRTZWxlY3Rpb24gPSAxMjI5Mwora0FjdGlvblRleHRUcmFja1NldEJhY2tncm91bmRDb2xvciA9IDEyMjk0CitrQWN0aW9uVGV4dFRyYWNrU2V0Rm9yZWdyb3VuZENvbG9yID0gMTIyOTUKK2tBY3Rpb25UZXh0VHJhY2tTZXRGYWNlID0gMTIyOTYKK2tBY3Rpb25UZXh0VHJhY2tTZXRGb250ID0gMTIyOTcKK2tBY3Rpb25UZXh0VHJhY2tTZXRTaXplID0gMTIyOTgKK2tBY3Rpb25UZXh0VHJhY2tTZXRBbGlnbm1lbnQgPSAxMjI5OQora0FjdGlvblRleHRUcmFja1NldEhpbGl0ZSA9IDEyMzAwCitrQWN0aW9uVGV4dFRyYWNrU2V0RHJvcFNoYWRvdyA9IDEyMzAxCitrQWN0aW9uVGV4dFRyYWNrU2V0RGlzcGxheUZsYWdzID0gMTIzMDIKK2tBY3Rpb25UZXh0VHJhY2tTZXRTY3JvbGwgPSAxMjMwMwora0FjdGlvblRleHRUcmFja1JlbGF0aXZlU2Nyb2xsID0gMTIzMDQKK2tBY3Rpb25UZXh0VHJhY2tGaW5kVGV4dCA9IDEyMzA1CitrQWN0aW9uVGV4dFRyYWNrU2V0SHlwZXJUZXh0RmFjZSA9IDEyMzA2CitrQWN0aW9uVGV4dFRyYWNrU2V0SHlwZXJUZXh0Q29sb3IgPSAxMjMwNwora0FjdGlvblRleHRUcmFja0tleUVudHJ5ID0gMTIzMDgKK2tBY3Rpb25UZXh0VHJhY2tNb3VzZURvd24gPSAxMjMwOQora0FjdGlvblRleHRUcmFja1NldEVkaXRhYmxlID0gMTIzMTAKK2tBY3Rpb25MaXN0QWRkRWxlbWVudCA9IDEzMzEyCitrQWN0aW9uTGlzdFJlbW92ZUVsZW1lbnRzID0gMTMzMTMKK2tBY3Rpb25MaXN0U2V0RWxlbWVudFZhbHVlID0gMTMzMTQKK2tBY3Rpb25MaXN0UGFzdGVGcm9tWE1MID0gMTMzMTUKK2tBY3Rpb25MaXN0U2V0TWF0Y2hpbmdGcm9tWE1MID0gMTMzMTYKK2tBY3Rpb25MaXN0U2V0RnJvbVVSTCA9IDEzMzE3CitrQWN0aW9uTGlzdEV4Y2hhbmdlTGlzdHMgPSAxMzMxOAora0FjdGlvbkxpc3RTZXJ2ZXJRdWVyeSA9IDEzMzE5CitrT3BlcmFuZEV4cHJlc3Npb24gPSAxCitrT3BlcmFuZENvbnN0YW50ID0gMgora09wZXJhbmRTdWJzY3JpYmVkVG9DaGFubmVsID0gMwora09wZXJhbmRVbmlxdWVDdXN0b21BY3Rpb25IYW5kbGVySUQgPSA0CitrT3BlcmFuZEN1c3RvbUFjdGlvbkhhbmRsZXJJRElzT3BlbiA9IDUKK2tPcGVyYW5kQ29ubmVjdGlvblNwZWVkID0gNgora09wZXJhbmRHTVREYXkgPSA3CitrT3BlcmFuZEdNVE1vbnRoID0gOAora09wZXJhbmRHTVRZZWFyID0gOQora09wZXJhbmRHTVRIb3VycyA9IDEwCitrT3BlcmFuZEdNVE1pbnV0ZXMgPSAxMQora09wZXJhbmRHTVRTZWNvbmRzID0gMTIKK2tPcGVyYW5kTG9jYWxEYXkgPSAxMwora09wZXJhbmRMb2NhbE1vbnRoID0gMTQKK2tPcGVyYW5kTG9jYWxZZWFyID0gMTUKK2tPcGVyYW5kTG9jYWxIb3VycyA9IDE2CitrT3BlcmFuZExvY2FsTWludXRlcyA9IDE3CitrT3BlcmFuZExvY2FsU2Vjb25kcyA9IDE4CitrT3BlcmFuZFJlZ2lzdGVyZWRGb3JRdWlja1RpbWVQcm8gPSAxOQora09wZXJhbmRQbGF0Zm9ybVJ1bm5pbmdPbiA9IDIwCitrT3BlcmFuZFF1aWNrVGltZVZlcnNpb24gPSAyMQora09wZXJhbmRDb21wb25lbnRWZXJzaW9uID0gMjIKK2tPcGVyYW5kT3JpZ2luYWxIYW5kbGVyUmVmY29uID0gMjMKK2tPcGVyYW5kVGlja3MgPSAyNAora09wZXJhbmRNYXhMb2FkZWRUaW1lSW5Nb3ZpZSA9IDI1CitrT3BlcmFuZEV2ZW50UGFyYW1ldGVyID0gMjYKK2tPcGVyYW5kRnJlZU1lbW9yeSA9IDI3CitrT3BlcmFuZE5ldHdvcmtTdGF0dXMgPSAyOAora09wZXJhbmRRdWlja1RpbWVWZXJzaW9uUmVnaXN0ZXJlZCA9IDI5CitrT3BlcmFuZFN5c3RlbVZlcnNpb24gPSAzMAora09wZXJhbmRNb3ZpZVZvbHVtZSA9IDEwMjQKK2tPcGVyYW5kTW92aWVSYXRlID0gMTAyNQora09wZXJhbmRNb3ZpZUlzTG9vcGluZyA9IDEwMjYKK2tPcGVyYW5kTW92aWVMb29wSXNQYWxpbmRyb21lID0gMTAyNwora09wZXJhbmRNb3ZpZVRpbWUgPSAxMDI4CitrT3BlcmFuZE1vdmllRHVyYXRpb24gPSAxMDI5CitrT3BlcmFuZE1vdmllVGltZVNjYWxlID0gMTAzMAora09wZXJhbmRNb3ZpZVdpZHRoID0gMTAzMQora09wZXJhbmRNb3ZpZUhlaWdodCA9IDEwMzIKK2tPcGVyYW5kTW92aWVMb2FkU3RhdGUgPSAxMDMzCitrT3BlcmFuZE1vdmllVHJhY2tDb3VudCA9IDEwMzQKK2tPcGVyYW5kTW92aWVJc0FjdGl2ZSA9IDEwMzUKK2tPcGVyYW5kTW92aWVOYW1lID0gMTAzNgora09wZXJhbmRNb3ZpZUlEID0gMTAzNwora09wZXJhbmRNb3ZpZUNoYXB0ZXJDb3VudCA9IDEwMzgKK2tPcGVyYW5kTW92aWVDaGFwdGVySW5kZXggPSAxMDM5CitrT3BlcmFuZE1vdmllQ2hhcHRlck5hbWUgPSAxMDQwCitrT3BlcmFuZE1vdmllQ2hhcHRlck5hbWVCeUluZGV4ID0gMTA0MQora09wZXJhbmRNb3ZpZUNoYXB0ZXJJbmRleEJ5TmFtZSA9IDEwNDIKK2tPcGVyYW5kTW92aWVBbm5vdGF0aW9uID0gMTA0Mwora09wZXJhbmRNb3ZpZUNvbm5lY3Rpb25GbGFncyA9IDEwNDQKK2tPcGVyYW5kTW92aWVDb25uZWN0aW9uU3RyaW5nID0gMTA0NQora09wZXJhbmRUcmFja1ZvbHVtZSA9IDIwNDgKK2tPcGVyYW5kVHJhY2tCYWxhbmNlID0gMjA0OQora09wZXJhbmRUcmFja0VuYWJsZWQgPSAyMDUwCitrT3BlcmFuZFRyYWNrTGF5ZXIgPSAyMDUxCitrT3BlcmFuZFRyYWNrV2lkdGggPSAyMDUyCitrT3BlcmFuZFRyYWNrSGVpZ2h0ID0gMjA1Mwora09wZXJhbmRUcmFja0R1cmF0aW9uID0gMjA1NAora09wZXJhbmRUcmFja05hbWUgPSAyMDU1CitrT3BlcmFuZFRyYWNrSUQgPSAyMDU2CitrT3BlcmFuZFRyYWNrSWRsZUZyZXF1ZW5jeSA9IDIwNTcKK2tPcGVyYW5kVHJhY2tCYXNzID0gMjA1OAora09wZXJhbmRUcmFja1RyZWJsZSA9IDIwNTkKK2tPcGVyYW5kU3ByaXRlQm91bmRzTGVmdCA9IDMwNzIKK2tPcGVyYW5kU3ByaXRlQm91bmRzVG9wID0gMzA3Mwora09wZXJhbmRTcHJpdGVCb3VuZHNSaWdodCA9IDMwNzQKK2tPcGVyYW5kU3ByaXRlQm91bmRzQm90dG9tID0gMzA3NQora09wZXJhbmRTcHJpdGVJbWFnZUluZGV4ID0gMzA3Ngora09wZXJhbmRTcHJpdGVWaXNpYmxlID0gMzA3Nwora09wZXJhbmRTcHJpdGVMYXllciA9IDMwNzgKK2tPcGVyYW5kU3ByaXRlVHJhY2tWYXJpYWJsZSA9IDMwNzkKK2tPcGVyYW5kU3ByaXRlVHJhY2tOdW1TcHJpdGVzID0gMzA4MAora09wZXJhbmRTcHJpdGVUcmFja051bUltYWdlcyA9IDMwODEKK2tPcGVyYW5kU3ByaXRlSUQgPSAzMDgyCitrT3BlcmFuZFNwcml0ZUluZGV4ID0gMzA4Mwora09wZXJhbmRTcHJpdGVGaXJzdENvcm5lclggPSAzMDg0CitrT3BlcmFuZFNwcml0ZUZpcnN0Q29ybmVyWSA9IDMwODUKK2tPcGVyYW5kU3ByaXRlU2Vjb25kQ29ybmVyWCA9IDMwODYKK2tPcGVyYW5kU3ByaXRlU2Vjb25kQ29ybmVyWSA9IDMwODcKK2tPcGVyYW5kU3ByaXRlVGhpcmRDb3JuZXJYID0gMzA4OAora09wZXJhbmRTcHJpdGVUaGlyZENvcm5lclkgPSAzMDg5CitrT3BlcmFuZFNwcml0ZUZvdXJ0aENvcm5lclggPSAzMDkwCitrT3BlcmFuZFNwcml0ZUZvdXJ0aENvcm5lclkgPSAzMDkxCitrT3BlcmFuZFNwcml0ZUltYWdlUmVnaXN0cmF0aW9uUG9pbnRYID0gMzA5Mgora09wZXJhbmRTcHJpdGVJbWFnZVJlZ2lzdHJhdGlvblBvaW50WSA9IDMwOTMKK2tPcGVyYW5kU3ByaXRlVHJhY2tTcHJpdGVJREF0UG9pbnQgPSAzMDk0CitrT3BlcmFuZFNwcml0ZU5hbWUgPSAzMDk1CitrT3BlcmFuZFNwcml0ZUNhbkJlSGl0VGVzdGVkID0gMzEwNQora09wZXJhbmRTcHJpdGVUcmFja0FsbFNwcml0ZXNIaXRUZXN0aW5nTW9kZSA9IDMxMDYKK2tPcGVyYW5kU3ByaXRlVHJhY2tJbWFnZUlEQnlJbmRleCA9IDMxMDcKK2tPcGVyYW5kU3ByaXRlVHJhY2tJbWFnZUluZGV4QnlJRCA9IDMxMDgKK2tPcGVyYW5kUVRWUlBhbkFuZ2xlID0gNDA5Ngora09wZXJhbmRRVFZSVGlsdEFuZ2xlID0gNDA5Nwora09wZXJhbmRRVFZSRmllbGRPZlZpZXcgPSA0MDk4CitrT3BlcmFuZFFUVlJOb2RlSUQgPSA0MDk5CitrT3BlcmFuZFFUVlJIb3RTcG90c1Zpc2libGUgPSA0MTAwCitrT3BlcmFuZFFUVlJWaWV3Q2VudGVySCA9IDQxMDEKK2tPcGVyYW5kUVRWUlZpZXdDZW50ZXJWID0gNDEwMgora09wZXJhbmRRVFZSVmlld1N0YXRlQ291bnQgPSA0MTAzCitrT3BlcmFuZFFUVlJWaWV3U3RhdGUgPSA0MTA0CitrT3BlcmFuZE1vdXNlTG9jYWxITG9jID0gNTEyMAora09wZXJhbmRNb3VzZUxvY2FsVkxvYyA9IDUxMjEKK2tPcGVyYW5kS2V5SXNEb3duID0gNTEyMgora09wZXJhbmRSYW5kb20gPSA1MTIzCitrT3BlcmFuZENhbkhhdmVGb2N1cyA9IDUxMjQKK2tPcGVyYW5kSGFzRm9jdXMgPSA1MTI1CitrT3BlcmFuZFRleHRUcmFja0VkaXRhYmxlID0gNjE0NAora09wZXJhbmRUZXh0VHJhY2tDb3B5VGV4dCA9IDYxNDUKK2tPcGVyYW5kVGV4dFRyYWNrU3RhcnRTZWxlY3Rpb24gPSA2MTQ2CitrT3BlcmFuZFRleHRUcmFja0VuZFNlbGVjdGlvbiA9IDYxNDcKK2tPcGVyYW5kVGV4dFRyYWNrVGV4dEJveExlZnQgPSA2MTQ4CitrT3BlcmFuZFRleHRUcmFja1RleHRCb3hUb3AgPSA2MTQ5CitrT3BlcmFuZFRleHRUcmFja1RleHRCb3hSaWdodCA9IDYxNTAKK2tPcGVyYW5kVGV4dFRyYWNrVGV4dEJveEJvdHRvbSA9IDYxNTEKK2tPcGVyYW5kVGV4dFRyYWNrVGV4dExlbmd0aCA9IDYxNTIKK2tPcGVyYW5kTGlzdENvdW50RWxlbWVudHMgPSA3MTY4CitrT3BlcmFuZExpc3RHZXRFbGVtZW50UGF0aEJ5SW5kZXggPSA3MTY5CitrT3BlcmFuZExpc3RHZXRFbGVtZW50VmFsdWUgPSA3MTcwCitrT3BlcmFuZExpc3RDb3B5VG9YTUwgPSA3MTcxCitrT3BlcmFuZFNpbiA9IDgxOTIKK2tPcGVyYW5kQ29zID0gODE5Mwora09wZXJhbmRUYW4gPSA4MTk0CitrT3BlcmFuZEFUYW4gPSA4MTk1CitrT3BlcmFuZEFUYW4yID0gODE5Ngora09wZXJhbmREZWdyZWVzVG9SYWRpYW5zID0gODE5Nwora09wZXJhbmRSYWRpYW5zVG9EZWdyZWVzID0gODE5OAora09wZXJhbmRTcXVhcmVSb290ID0gODE5OQora09wZXJhbmRFeHBvbmVudCA9IDgyMDAKK2tPcGVyYW5kTG9nID0gODIwMQora09wZXJhbmRGbGFzaFRyYWNrVmFyaWFibGUgPSA5MjE2CitrT3BlcmFuZFN0cmluZ0xlbmd0aCA9IDEwMjQwCitrT3BlcmFuZFN0cmluZ0NvbXBhcmUgPSAxMDI0MQora09wZXJhbmRTdHJpbmdTdWJTdHJpbmcgPSAxMDI0Mgora09wZXJhbmRTdHJpbmdDb25jYXQgPSAxMDI0Mwora0ZpcnN0TW92aWVBY3Rpb24gPSBrQWN0aW9uTW92aWVTZXRWb2x1bWUKK2tMYXN0TW92aWVBY3Rpb24gPSBrQWN0aW9uTW92aWVTZXRTY2FsZQora0ZpcnN0VHJhY2tBY3Rpb24gPSBrQWN0aW9uVHJhY2tTZXRWb2x1bWUKK2tMYXN0VHJhY2tBY3Rpb24gPSBrQWN0aW9uVHJhY2tTZXRCYXNzVHJlYmxlCitrRmlyc3RTcHJpdGVBY3Rpb24gPSBrQWN0aW9uU3ByaXRlU2V0TWF0cml4CitrTGFzdFNwcml0ZUFjdGlvbiA9IGtBY3Rpb25TcHJpdGVTZXRDYW5CZUhpdFRlc3RlZAora0ZpcnN0UVRWUkFjdGlvbiA9IGtBY3Rpb25RVFZSU2V0UGFuQW5nbGUKK2tMYXN0UVRWUkFjdGlvbiA9IGtBY3Rpb25RVFZSU2V0Vmlld1N0YXRlCitrRmlyc3RNdXNpY0FjdGlvbiA9IGtBY3Rpb25NdXNpY1BsYXlOb3RlCitrTGFzdE11c2ljQWN0aW9uID0ga0FjdGlvbk11c2ljU2V0Q29udHJvbGxlcgora0ZpcnN0U3lzdGVtQWN0aW9uID0ga0FjdGlvbkNhc2UKK2tMYXN0U3lzdGVtQWN0aW9uID0ga0FjdGlvblNldFJhbmRvbVNlZWQKK2tGaXJzdFNwcml0ZVRyYWNrQWN0aW9uID0ga0FjdGlvblNwcml0ZVRyYWNrU2V0VmFyaWFibGUKK2tMYXN0U3ByaXRlVHJhY2tBY3Rpb24gPSBrQWN0aW9uU3ByaXRlVHJhY2tEaXNwb3NlSW1hZ2UKK2tGaXJzdEFwcGxpY2F0aW9uQWN0aW9uID0ga0FjdGlvbkFwcGxpY2F0aW9uTnVtYmVyQW5kU3RyaW5nCitrTGFzdEFwcGxpY2F0aW9uQWN0aW9uID0ga0FjdGlvbkFwcGxpY2F0aW9uTnVtYmVyQW5kU3RyaW5nCitrRmlyc3RRRDNETmFtZWRPYmplY3RBY3Rpb24gPSBrQWN0aW9uUUQzRE5hbWVkT2JqZWN0VHJhbnNsYXRlVG8KK2tMYXN0UUQzRE5hbWVkT2JqZWN0QWN0aW9uID0ga0FjdGlvblFEM0ROYW1lZE9iamVjdFJvdGF0ZVRvCitrRmlyc3RGbGFzaFRyYWNrQWN0aW9uID0ga0FjdGlvbkZsYXNoVHJhY2tTZXRQYW4KK2tMYXN0Rmxhc2hUcmFja0FjdGlvbiA9IGtBY3Rpb25GbGFzaFRyYWNrRG9CdXR0b25BY3Rpb25zCitrRmlyc3RNb3ZpZVRyYWNrQWN0aW9uID0ga0FjdGlvbk1vdmllVHJhY2tBZGRDaGlsZE1vdmllCitrTGFzdE1vdmllVHJhY2tBY3Rpb24gPSBrQWN0aW9uTW92aWVUcmFja0xvYWRDaGlsZE1vdmllV2l0aFFUTGlzdFBhcmFtcwora0ZpcnN0VGV4dFRyYWNrQWN0aW9uID0ga0FjdGlvblRleHRUcmFja1Bhc3RlVGV4dAora0xhc3RUZXh0VHJhY2tBY3Rpb24gPSBrQWN0aW9uVGV4dFRyYWNrU2V0RWRpdGFibGUKK2tGaXJzdE11bHRpVGFyZ2V0QWN0aW9uID0ga0FjdGlvbkxpc3RBZGRFbGVtZW50CitrTGFzdE11bHRpVGFyZ2V0QWN0aW9uID0ga0FjdGlvbkxpc3RTZXJ2ZXJRdWVyeQora0ZpcnN0QWN0aW9uID0ga0ZpcnN0TW92aWVBY3Rpb24KK2tMYXN0QWN0aW9uID0ga0xhc3RNdWx0aVRhcmdldEFjdGlvbgora1RhcmdldE1vdmllID0gRk9VUl9DSEFSX0NPREUoJ21vb3YnKQora1RhcmdldE1vdmllTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCdtb25hJykKK2tUYXJnZXRNb3ZpZUlEID0gRk9VUl9DSEFSX0NPREUoJ21vaWQnKQora1RhcmdldFJvb3RNb3ZpZSA9IEZPVVJfQ0hBUl9DT0RFKCdtb3JvJykKK2tUYXJnZXRQYXJlbnRNb3ZpZSA9IEZPVVJfQ0hBUl9DT0RFKCdtb3BhJykKK2tUYXJnZXRDaGlsZE1vdmllVHJhY2tOYW1lID0gRk9VUl9DSEFSX0NPREUoJ21vdG4nKQora1RhcmdldENoaWxkTW92aWVUcmFja0lEID0gRk9VUl9DSEFSX0NPREUoJ21vdGknKQora1RhcmdldENoaWxkTW92aWVUcmFja0luZGV4ID0gRk9VUl9DSEFSX0NPREUoJ21vdHgnKQora1RhcmdldENoaWxkTW92aWVNb3ZpZU5hbWUgPSBGT1VSX0NIQVJfQ09ERSgnbW9tbicpCitrVGFyZ2V0Q2hpbGRNb3ZpZU1vdmllSUQgPSBGT1VSX0NIQVJfQ09ERSgnbW9taScpCitrVGFyZ2V0VHJhY2tOYW1lID0gRk9VUl9DSEFSX0NPREUoJ3RybmEnKQora1RhcmdldFRyYWNrSUQgPSBGT1VSX0NIQVJfQ09ERSgndHJpZCcpCitrVGFyZ2V0VHJhY2tUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RydHknKQora1RhcmdldFRyYWNrSW5kZXggPSBGT1VSX0NIQVJfQ09ERSgndHJpbicpCitrVGFyZ2V0U3ByaXRlTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCdzcG5hJykKK2tUYXJnZXRTcHJpdGVJRCA9IEZPVVJfQ0hBUl9DT0RFKCdzcGlkJykKK2tUYXJnZXRTcHJpdGVJbmRleCA9IEZPVVJfQ0hBUl9DT0RFKCdzcGluJykKK2tUYXJnZXRRRDNETmFtZWRPYmplY3ROYW1lID0gRk9VUl9DSEFSX0NPREUoJ25hbmEnKQora1RhcmdldEN1cnJlbnRRVEV2ZW50UGFyYW1zID0gRk9VUl9DSEFSX0NPREUoJ2V2cGEnKQora1FURXZlbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2V2bnQnKQora0FjdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdhY3RuJykKK2tXaGljaEFjdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCd3aGljJykKK2tBY3Rpb25QYXJhbWV0ZXIgPSBGT1VSX0NIQVJfQ09ERSgncGFybScpCitrQWN0aW9uVGFyZ2V0ID0gRk9VUl9DSEFSX0NPREUoJ3RhcmcnKQora0FjdGlvbkZsYWdzID0gRk9VUl9DSEFSX0NPREUoJ2ZsYWcnKQora0FjdGlvblBhcmFtZXRlck1pblZhbHVlID0gRk9VUl9DSEFSX0NPREUoJ21pbnYnKQora0FjdGlvblBhcmFtZXRlck1heFZhbHVlID0gRk9VUl9DSEFSX0NPREUoJ21heHYnKQora0FjdGlvbkxpc3RBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdsaXN0JykKK2tFeHByZXNzaW9uQ29udGFpbmVyQXRvbVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZXhwcicpCitrQ29uZGl0aW9uYWxBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0ZXN0JykKK2tPcGVyYXRvckF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ29wZXInKQora09wZXJhbmRBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdvcHJuJykKK2tDb21tZW50QXRvbVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnd2h5ICcpCitrQ3VzdG9tQWN0aW9uSGFuZGxlciA9IEZPVVJfQ0hBUl9DT0RFKCdjdXN0JykKK2tDdXN0b21IYW5kbGVySUQgPSBGT1VSX0NIQVJfQ09ERSgnaWQgICcpCitrQ3VzdG9tSGFuZGxlckRlc2MgPSBGT1VSX0NIQVJfQ09ERSgnZGVzYycpCitrUVRFdmVudFJlY29yZEF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2VyZWMnKQora1FURXZlbnRNb3VzZUNsaWNrID0gRk9VUl9DSEFSX0NPREUoJ2NsaWsnKQora1FURXZlbnRNb3VzZUNsaWNrRW5kID0gRk9VUl9DSEFSX0NPREUoJ2NlbmQnKQora1FURXZlbnRNb3VzZUNsaWNrRW5kVHJpZ2dlckJ1dHRvbiA9IEZPVVJfQ0hBUl9DT0RFKCd0cmlnJykKK2tRVEV2ZW50TW91c2VFbnRlciA9IEZPVVJfQ0hBUl9DT0RFKCdlbnRyJykKK2tRVEV2ZW50TW91c2VFeGl0ID0gRk9VUl9DSEFSX0NPREUoJ2V4aXQnKQora1FURXZlbnRNb3VzZU1vdmVkID0gRk9VUl9DSEFSX0NPREUoJ21vdmUnKQora1FURXZlbnRGcmFtZUxvYWRlZCA9IEZPVVJfQ0hBUl9DT0RFKCdmcmFtJykKK2tRVEV2ZW50SWRsZSA9IEZPVVJfQ0hBUl9DT0RFKCdpZGxlJykKK2tRVEV2ZW50S2V5ID0gRk9VUl9DSEFSX0NPREUoJ2tleSAnKQora1FURXZlbnRNb3ZpZUxvYWRlZCA9IEZPVVJfQ0hBUl9DT0RFKCdsb2FkJykKK2tRVEV2ZW50UmVxdWVzdFRvTW9kaWZ5TW92aWUgPSBGT1VSX0NIQVJfQ09ERSgncmVxbScpCitrUVRFdmVudExpc3RSZWNlaXZlZCA9IEZPVVJfQ0hBUl9DT0RFKCdsaXN0JykKK2tRVEV2ZW50S2V5VXAgPSBGT1VSX0NIQVJfQ09ERSgna2V5VScpCitrQWN0aW9uRmxhZ0FjdGlvbklzRGVsdGEgPSAxTCA8PCAxCitrQWN0aW9uRmxhZ1BhcmFtZXRlcldyYXBzQXJvdW5kID0gMUwgPDwgMgora0FjdGlvbkZsYWdBY3Rpb25Jc1RvZ2dsZSA9IDFMIDw8IDMKK2tTdGF0dXNTdHJpbmdJc1VSTExpbmsgPSAxTCA8PCAxCitrU3RhdHVzU3RyaW5nSXNTdHJlYW1pbmdTdGF0dXMgPSAxTCA8PCAyCitrU3RhdHVzSGFzQ29kZU51bWJlciA9IDFMIDw8IDMKK2tTdGF0dXNJc0Vycm9yID0gMUwgPDwgNAora1NjcmlwdElzVW5rbm93blR5cGUgPSAxTCA8PCAwCitrU2NyaXB0SXNKYXZhU2NyaXB0ID0gMUwgPDwgMQora1NjcmlwdElzTGluZ29FdmVudCA9IDFMIDw8IDIKK2tTY3JpcHRJc1ZCRXZlbnQgPSAxTCA8PCAzCitrU2NyaXB0SXNQcm9qZWN0b3JDb21tYW5kID0gMUwgPDwgNAora1NjcmlwdElzQXBwbGVTY3JpcHQgPSAxTCA8PCA1CitrUVRSZWdpc3RyYXRpb25EaWFsb2dUaW1lT3V0RmxhZyA9IDEgPDwgMAora1FUUmVnaXN0cmF0aW9uRGlhbG9nU2hvd0RpYWxvZyA9IDEgPDwgMQora1FUUmVnaXN0cmF0aW9uRGlhbG9nRm9yY2VEaWFsb2cgPSAxIDw8IDIKK2tPcGVyYXRvckFkZCA9IEZPVVJfQ0hBUl9DT0RFKCdhZGQgJykKK2tPcGVyYXRvclN1YnRyYWN0ID0gRk9VUl9DSEFSX0NPREUoJ3N1YiAnKQora09wZXJhdG9yTXVsdGlwbHkgPSBGT1VSX0NIQVJfQ09ERSgnbXVsdCcpCitrT3BlcmF0b3JEaXZpZGUgPSBGT1VSX0NIQVJfQ09ERSgnZGl2ICcpCitrT3BlcmF0b3JPciA9IEZPVVJfQ0hBUl9DT0RFKCdvciAgJykKK2tPcGVyYXRvckFuZCA9IEZPVVJfQ0hBUl9DT0RFKCdhbmQgJykKK2tPcGVyYXRvck5vdCA9IEZPVVJfQ0hBUl9DT0RFKCdub3QgJykKK2tPcGVyYXRvckxlc3NUaGFuID0gRk9VUl9DSEFSX0NPREUoJzwgICAnKQora09wZXJhdG9yTGVzc1RoYW5FcXVhbFRvID0gRk9VUl9DSEFSX0NPREUoJzw9ICAnKQora09wZXJhdG9yRXF1YWxUbyA9IEZPVVJfQ0hBUl9DT0RFKCc9ICAgJykKK2tPcGVyYXRvck5vdEVxdWFsVG8gPSBGT1VSX0NIQVJfQ09ERSgnIT0gICcpCitrT3BlcmF0b3JHcmVhdGVyVGhhbiA9IEZPVVJfQ0hBUl9DT0RFKCc+ICAgJykKK2tPcGVyYXRvckdyZWF0ZXJUaGFuRXF1YWxUbyA9IEZPVVJfQ0hBUl9DT0RFKCc+PSAgJykKK2tPcGVyYXRvck1vZHVsbyA9IEZPVVJfQ0hBUl9DT0RFKCdtb2QgJykKK2tPcGVyYXRvckludGVnZXJEaXZpZGUgPSBGT1VSX0NIQVJfQ09ERSgnaWRpdicpCitrT3BlcmF0b3JBYnNvbHV0ZVZhbHVlID0gRk9VUl9DSEFSX0NPREUoJ2FicyAnKQora09wZXJhdG9yTmVnYXRlID0gRk9VUl9DSEFSX0NPREUoJ25lZyAnKQora1BsYXRmb3JtTWFjaW50b3NoID0gMQora1BsYXRmb3JtV2luZG93cyA9IDIKK2tTeXN0ZW1Jc1dpbmRvd3M5eCA9IDB4MDAwMTAwMDAKK2tTeXN0ZW1Jc1dpbmRvd3NOVCA9IDB4MDAwMjAwMDAKK2tNZWRpYVByb3BlcnR5Tm9uTGluZWFyQXRvbVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbm9ubCcpCitrTWVkaWFQcm9wZXJ0eUhhc0FjdGlvbnMgPSAxMDUKK2xvb3BUaW1lQmFzZSA9IDEKK3BhbGluZHJvbWVMb29wVGltZUJhc2UgPSAyCittYWludGFpblRpbWVCYXNlWmVybyA9IDQKK3RyaWdnZXJUaW1lRndkID0gMHgwMDAxCit0cmlnZ2VyVGltZUJ3ZCA9IDB4MDAwMgordHJpZ2dlclRpbWVFaXRoZXIgPSAweDAwMDMKK3RyaWdnZXJSYXRlTFQgPSAweDAwMDQKK3RyaWdnZXJSYXRlR1QgPSAweDAwMDgKK3RyaWdnZXJSYXRlRXF1YWwgPSAweDAwMTAKK3RyaWdnZXJSYXRlTFRFID0gdHJpZ2dlclJhdGVMVCB8IHRyaWdnZXJSYXRlRXF1YWwKK3RyaWdnZXJSYXRlR1RFID0gdHJpZ2dlclJhdGVHVCB8IHRyaWdnZXJSYXRlRXF1YWwKK3RyaWdnZXJSYXRlTm90RXF1YWwgPSB0cmlnZ2VyUmF0ZUdUIHwgdHJpZ2dlclJhdGVFcXVhbCB8IHRyaWdnZXJSYXRlTFQKK3RyaWdnZXJSYXRlQ2hhbmdlID0gMAordHJpZ2dlckF0U3RhcnQgPSAweDAwMDEKK3RyaWdnZXJBdFN0b3AgPSAweDAwMDIKK3RpbWVCYXNlQmVmb3JlU3RhcnRUaW1lID0gMQordGltZUJhc2VBZnRlclN0b3BUaW1lID0gMgorY2FsbEJhY2tBdFRpbWUgPSAxCitjYWxsQmFja0F0UmF0ZSA9IDIKK2NhbGxCYWNrQXRUaW1lSnVtcCA9IDMKK2NhbGxCYWNrQXRFeHRyZW1lcyA9IDQKK2NhbGxCYWNrQXRUaW1lQmFzZURpc3Bvc2VkID0gNQorY2FsbEJhY2tBdEludGVycnVwdCA9IDB4ODAwMAorY2FsbEJhY2tBdERlZmVycmVkVGFzayA9IDB4NDAwMAorcXRjYk5lZWRzUmF0ZUNoYW5nZXMgPSAxCitxdGNiTmVlZHNUaW1lQ2hhbmdlcyA9IDIKK3F0Y2JOZWVkc1N0YXJ0U3RvcENoYW5nZXMgPSA0CitrZWVwSW5SYW0gPSAxIDw8IDAKK3Vua2VlcEluUmFtID0gMSA8PCAxCitmbHVzaEZyb21SYW0gPSAxIDw8IDIKK2xvYWRGb3J3YXJkVHJhY2tFZGl0cyA9IDEgPDwgMworbG9hZEJhY2t3YXJkVHJhY2tFZGl0cyA9IDEgPDwgNAorbmV3TW92aWVBY3RpdmUgPSAxIDw8IDAKK25ld01vdmllRG9udFJlc29sdmVEYXRhUmVmcyA9IDEgPDwgMQorbmV3TW92aWVEb250QXNrVW5yZXNvbHZlZERhdGFSZWZzID0gMSA8PCAyCituZXdNb3ZpZURvbnRBdXRvQWx0ZXJuYXRlcyA9IDEgPDwgMworbmV3TW92aWVEb250VXBkYXRlRm9yZUJhY2tQb2ludGVycyA9IDEgPDwgNAorbmV3TW92aWVEb250QXV0b1VwZGF0ZUNsb2NrID0gMSA8PCA1CituZXdNb3ZpZUFzeW5jT0sgPSAxIDw8IDgKK25ld01vdmllSWRsZUltcG9ydE9LID0gMSA8PCAxMAorbmV3TW92aWVEb250SW50ZXJhY3RXaXRoVXNlciA9IDEgPDwgMTEKK3RyYWNrVXNhZ2VJbk1vdmllID0gMSA8PCAxCit0cmFja1VzYWdlSW5QcmV2aWV3ID0gMSA8PCAyCit0cmFja1VzYWdlSW5Qb3N0ZXIgPSAxIDw8IDMKK21lZGlhU2FtcGxlTm90U3luYyA9IDEgPDwgMAorbWVkaWFTYW1wbGVTaGFkb3dTeW5jID0gMSA8PCAxCitwYXN0ZUluUGFyYWxsZWwgPSAxIDw8IDAKK3Nob3dVc2VyU2V0dGluZ3NEaWFsb2cgPSAxIDw8IDEKK21vdmllVG9GaWxlT25seUV4cG9ydCA9IDEgPDwgMgorbW92aWVGaWxlU3BlY1ZhbGlkID0gMSA8PCAzCituZXh0VGltZU1lZGlhU2FtcGxlID0gMSA8PCAwCituZXh0VGltZU1lZGlhRWRpdCA9IDEgPDwgMQorbmV4dFRpbWVUcmFja0VkaXQgPSAxIDw8IDIKK25leHRUaW1lU3luY1NhbXBsZSA9IDEgPDwgMworbmV4dFRpbWVTdGVwID0gMSA8PCA0CituZXh0VGltZUVkZ2VPSyA9IDEgPDwgMTQKK25leHRUaW1lSWdub3JlQWN0aXZlU2VnbWVudCA9IDEgPDwgMTUKK2NyZWF0ZU1vdmllRmlsZURlbGV0ZUN1ckZpbGUgPSAxTCA8PCAzMQorY3JlYXRlTW92aWVGaWxlRG9udENyZWF0ZU1vdmllID0gMUwgPDwgMzAKK2NyZWF0ZU1vdmllRmlsZURvbnRPcGVuRmlsZSA9IDFMIDw8IDI5CitjcmVhdGVNb3ZpZUZpbGVEb250Q3JlYXRlUmVzRmlsZSA9IDFMIDw8IDI4CitmbGF0dGVuQWRkTW92aWVUb0RhdGFGb3JrID0gMUwgPDwgMAorZmxhdHRlbkFjdGl2ZVRyYWNrc09ubHkgPSAxTCA8PCAyCitmbGF0dGVuRG9udEludGVybGVhdmVGbGF0dGVuID0gMUwgPDwgMworZmxhdHRlbkZTU3BlY1B0cklzRGF0YVJlZlJlY29yZFB0ciA9IDFMIDw8IDQKK2ZsYXR0ZW5Db21wcmVzc01vdmllUmVzb3VyY2UgPSAxTCA8PCA1CitmbGF0dGVuRm9yY2VNb3ZpZVJlc291cmNlQmVmb3JlTW92aWVEYXRhID0gMUwgPDwgNgorbW92aWVJbkRhdGFGb3JrUmVzSUQgPSAtMQorbWNUb3BMZWZ0TW92aWUgPSAxIDw8IDAKK21jU2NhbGVNb3ZpZVRvRml0ID0gMSA8PCAxCittY1dpdGhCYWRnZSA9IDEgPDwgMgorbWNOb3RWaXNpYmxlID0gMSA8PCAzCittY1dpdGhGcmFtZSA9IDEgPDwgNAorbW92aWVTY3JhcERvbnRaZXJvU2NyYXAgPSAxIDw8IDAKK21vdmllU2NyYXBPbmx5UHV0TW92aWUgPSAxIDw8IDEKK2RhdGFSZWZTZWxmUmVmZXJlbmNlID0gMSA8PCAwCitkYXRhUmVmV2FzTm90UmVzb2x2ZWQgPSAxIDw8IDEKK2tNb3ZpZUFuY2hvckRhdGFSZWZJc0RlZmF1bHQgPSAxIDw8IDAKK2hpbnRzU2NydWJNb2RlID0gMSA8PCAwCitoaW50c0xvb3AgPSAxIDw8IDEKK2hpbnRzRG9udFB1cmdlID0gMSA8PCAyCitoaW50c1VzZVNjcmVlbkJ1ZmZlciA9IDEgPDwgNQoraGludHNBbGxvd0ludGVybGFjZSA9IDEgPDwgNgoraGludHNVc2VTb3VuZEludGVycCA9IDEgPDwgNworaGludHNIaWdoUXVhbGl0eSA9IDEgPDwgOAoraGludHNQYWxpbmRyb21lID0gMSA8PCA5CitoaW50c0luYWN0aXZlID0gMSA8PCAxMQoraGludHNPZmZzY3JlZW4gPSAxIDw8IDEyCitoaW50c0RvbnREcmF3ID0gMSA8PCAxMworaGludHNBbGxvd0JsYWNrbGluaW5nID0gMSA8PCAxNAoraGludHNEb250VXNlVmlkZW9PdmVybGF5U3VyZmFjZSA9IDEgPDwgMTYKK2hpbnRzSWdub3JlQmFuZHdpZHRoUmVzdHJpY3Rpb25zID0gMSA8PCAxNworaGludHNQbGF5aW5nRXZlcnlGcmFtZSA9IDEgPDwgMTgKK2hpbnRzQWxsb3dEeW5hbWljUmVzaXplID0gMSA8PCAxOQoraGludHNTaW5nbGVGaWVsZCA9IDEgPDwgMjAKK2hpbnRzTm9SZW5kZXJpbmdUaW1lT3V0ID0gMSA8PCAyMQoraGludHNGbHVzaFZpZGVvSW5zdGVhZE9mRGlydHlpbmcgPSAxIDw8IDIyCitoaW50c0VuYWJsZVN1YlBpeGVsUG9zaXRpb25pbmcgPSAxTCA8PCAyMworbWVkaWFIYW5kbGVyRmxhZ0Jhc2VDbGllbnQgPSAxCittb3ZpZVRyYWNrTWVkaWFUeXBlID0gMSA8PCAwCittb3ZpZVRyYWNrQ2hhcmFjdGVyaXN0aWMgPSAxIDw8IDEKK21vdmllVHJhY2tFbmFibGVkT25seSA9IDEgPDwgMgora01vdmllQ29udHJvbE9wdGlvbkhpZGVDb250cm9sbGVyID0gKDFMIDw8IDApCitrTW92aWVDb250cm9sT3B0aW9uTG9jYXRlVG9wTGVmdCA9ICgxTCA8PCAxKQora01vdmllQ29udHJvbE9wdGlvbkVuYWJsZUVkaXRpbmcgPSAoMUwgPDwgMikKK2tNb3ZpZUNvbnRyb2xPcHRpb25IYW5kbGVFZGl0aW5nSEkgPSAoMUwgPDwgMykKK2tNb3ZpZUNvbnRyb2xPcHRpb25TZXRLZXlzRW5hYmxlZCA9ICgxTCA8PCA0KQora01vdmllQ29udHJvbE9wdGlvbk1hbnVhbGx5SWRsZWQgPSAoMUwgPDwgNSkKK2tNb3ZpZUNvbnRyb2xEYXRhTW92aWVDb250cm9sbGVyID0gRk9VUl9DSEFSX0NPREUoJ21jICAnKQora01vdmllQ29udHJvbERhdGFNb3ZpZSA9IEZPVVJfQ0hBUl9DT0RFKCdtb292JykKK2tNb3ZpZUNvbnRyb2xEYXRhTWFudWFsSWRsaW5nID0gRk9VUl9DSEFSX0NPREUoJ21hbnUnKQorbW92aWVEcmF3aW5nQ2FsbFdoZW5DaGFuZ2VkID0gMAorbW92aWVEcmF3aW5nQ2FsbEFsd2F5cyA9IDEKK2tRVENsb25lU2hhcmVTYW1wbGVzID0gMSA8PCAwCitrUVRDbG9uZURvbnRDb3B5RWRpdHMgPSAxIDw8IDEKK2tHZXRNb3ZpZUltcG9ydGVyVmFsaWRhdGVUb0ZpbmQgPSAxTCA8PCAwCitrR2V0TW92aWVJbXBvcnRlckFsbG93TmV3RmlsZSA9IDFMIDw8IDEKK2tHZXRNb3ZpZUltcG9ydGVyRG9udENvbnNpZGVyR3JhcGhpY3NJbXBvcnRlcnMgPSAxTCA8PCAyCitrR2V0TW92aWVJbXBvcnRlckRvbnRDb25zaWRlckZpbGVPbmx5SW1wb3J0ZXJzID0gMUwgPDwgNgora0dldE1vdmllSW1wb3J0ZXJBdXRvSW1wb3J0T25seSA9IDFMIDw8IDEwCitrUVRHZXRNSU1FVHlwZUluZm9Jc1F1aWNrVGltZU1vdmllVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtb292JykKK2tRVEdldE1JTUVUeXBlSW5mb0lzVW5oZWxwZnVsVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkdW1iJykKK2tRVENvcHlVc2VyRGF0YVJlcGxhY2UgPSBGT1VSX0NIQVJfQ09ERSgncnBsYycpCitrUVRDb3B5VXNlckRhdGFNZXJnZSA9IEZPVVJfQ0hBUl9DT0RFKCdtZXJnJykKK2tNb3ZpZUxvYWRTdGF0ZUVycm9yID0gLTFMCitrTW92aWVMb2FkU3RhdGVMb2FkaW5nID0gMTAwMAora01vdmllTG9hZFN0YXRlTG9hZGVkID0gMjAwMAora01vdmllTG9hZFN0YXRlUGxheWFibGUgPSAxMDAwMAora01vdmllTG9hZFN0YXRlUGxheXRocm91Z2hPSyA9IDIwMDAwCitrTW92aWVMb2FkU3RhdGVDb21wbGV0ZSA9IDEwMDAwMEwKK2tRVERvbnRVc2VEYXRhVG9GaW5kSW1wb3J0ZXIgPSAxTCA8PCAwCitrUVREb250TG9va0Zvck1vdmllSW1wb3J0ZXJJZkdyYXBoaWNzSW1wb3J0ZXJGb3VuZCA9IDFMIDw8IDEKK2tRVEFsbG93T3BlbmluZ1N0aWxsSW1hZ2VzQXNNb3ZpZXMgPSAxTCA8PCAyCitrUVRBbGxvd0ltcG9ydGVyc1RoYXRXb3VsZENyZWF0ZU5ld0ZpbGUgPSAxTCA8PCAzCitrUVRBbGxvd0FnZ3Jlc3NpdmVJbXBvcnRlcnMgPSAxTCA8PCA0CitwcmVsb2FkQWx3YXlzID0gMUwgPDwgMAorcHJlbG9hZE9ubHlJZkVuYWJsZWQgPSAxTCA8PCAxCitmdWxsU2NyZWVuSGlkZUN1cnNvciA9IDFMIDw8IDAKK2Z1bGxTY3JlZW5BbGxvd0V2ZW50cyA9IDFMIDw8IDEKK2Z1bGxTY3JlZW5Eb250Q2hhbmdlTWVudUJhciA9IDFMIDw8IDIKK2Z1bGxTY3JlZW5QcmVmbGlnaHRTaXplID0gMUwgPDwgMworbW92aWVFeGVjdXRlV2lyZWRBY3Rpb25Eb250RXhlY3V0ZSA9IDFMIDw8IDAKK2tSZWZDb25OYXZpZ2F0aW9uTmV4dCA9IDAKK2tSZWZDb25OYXZpZ2F0aW9uUHJldmlvdXMgPSAxCitrUmVmQ29uUHJvcGVydHlDYW5IYXZlRm9jdXMgPSAxCitrUmVmQ29uUHJvcGVydHlIYXNGb2N1cyA9IDIKK2tUcmFja0ZvY3VzQ2FuRWRpdEZsYWcgPSBGT1VSX0NIQVJfQ09ERSgna2VkdCcpCitrVHJhY2tEZWZhdWx0Rm9jdXNGbGFncyA9IEZPVVJfQ0hBUl9DT0RFKCdrZm9jJykKK2tUcmFja0ZvY3VzRGVmYXVsdFJlZmNvbiA9IEZPVVJfQ0hBUl9DT0RFKCdrcmVmJykKK2tUcmFja0ZvY3VzT24gPSAxCitrVHJhY2tIYW5kbGVzVGFicyA9IDIKK2tGbGFzaFRyYWNrUHJvcGVydHlBY2NlcHRBbGxDbGlja3MgPSBGT1VSX0NIQVJfQ09ERSgnY2xpaycpCitrQmFja2dyb3VuZFNwcml0ZUxheWVyTnVtID0gMzI3NjcKK2tTcHJpdGVQcm9wZXJ0eU1hdHJpeCA9IDEKK2tTcHJpdGVQcm9wZXJ0eUltYWdlRGVzY3JpcHRpb24gPSAyCitrU3ByaXRlUHJvcGVydHlJbWFnZURhdGFQdHIgPSAzCitrU3ByaXRlUHJvcGVydHlWaXNpYmxlID0gNAora1Nwcml0ZVByb3BlcnR5TGF5ZXIgPSA1CitrU3ByaXRlUHJvcGVydHlHcmFwaGljc01vZGUgPSA2CitrU3ByaXRlUHJvcGVydHlJbWFnZURhdGFTaXplID0gNwora1Nwcml0ZVByb3BlcnR5QWN0aW9uSGFuZGxpbmdTcHJpdGVJRCA9IDgKK2tTcHJpdGVQcm9wZXJ0eUNhbkJlSGl0VGVzdGVkID0gOQora1Nwcml0ZVByb3BlcnR5SW1hZ2VJbmRleCA9IDEwMAora1Nwcml0ZVRyYWNrUHJvcGVydHlCYWNrZ3JvdW5kQ29sb3IgPSAxMDEKK2tTcHJpdGVUcmFja1Byb3BlcnR5T2Zmc2NyZWVuQml0RGVwdGggPSAxMDIKK2tTcHJpdGVUcmFja1Byb3BlcnR5U2FtcGxlRm9ybWF0ID0gMTAzCitrU3ByaXRlVHJhY2tQcm9wZXJ0eVNjYWxlU3ByaXRlc1RvU2NhbGVXb3JsZCA9IDEwNAora1Nwcml0ZVRyYWNrUHJvcGVydHlIYXNBY3Rpb25zID0gMTA1CitrU3ByaXRlVHJhY2tQcm9wZXJ0eVZpc2libGUgPSAxMDYKK2tTcHJpdGVUcmFja1Byb3BlcnR5UVRJZGxlRXZlbnRzRnJlcXVlbmN5ID0gMTA3CitrU3ByaXRlVHJhY2tQcm9wZXJ0eUFsbFNwcml0ZXNIaXRUZXN0aW5nTW9kZSA9IDEwOAora1Nwcml0ZVRyYWNrUHJvcGVydHlQcmVmZXJyZWREZXB0aEludGVycHJldGF0aW9uTW9kZSA9IDEwOQora1Nwcml0ZUltYWdlUHJvcGVydHlSZWdpc3RyYXRpb25Qb2ludCA9IDEwMDAKK2tTcHJpdGVJbWFnZVByb3BlcnR5R3JvdXBJRCA9IDEwMDEKK2tTcHJpdGVUcmFja1ByZWZlcnJlZERlcHRoQ29tcGF0aWJpbGl0eU1vZGUgPSAwCitrU3ByaXRlVHJhY2tQcmVmZXJyZWREZXB0aE1vZGVybk1vZGUgPSAxCitrU3ByaXRlSGl0VGVzdFVzZVNwcml0ZXNPd25Qcm9wZXJ0aWVzTW9kZSA9IDAKK2tTcHJpdGVIaXRUZXN0VHJlYXRBbGxTcHJpdGVzQXNIaXRUZXN0YWJsZU1vZGUgPSAxCitrU3ByaXRlSGl0VGVzdFRyZWF0QWxsU3ByaXRlc0FzTm90SGl0VGVzdGFibGVNb2RlID0gMgora05vUVRJZGxlRXZlbnRzID0gLTEKK2tHZXRTcHJpdGVXb3JsZEludmFsaWRSZWdpb25BbmRMZWF2ZUludGFjdCA9IC0xTAora0dldFNwcml0ZVdvcmxkSW52YWxpZFJlZ2lvbkFuZFRoZW5TZXRFbXB0eSA9IC0yTAora09ubHlEcmF3VG9TcHJpdGVXb3JsZCA9IDFMIDw8IDAKK2tTcHJpdGVXb3JsZFByZWZsaWdodCA9IDFMIDw8IDEKK2tTcHJpdGVXb3JsZERpZERyYXcgPSAxTCA8PCAwCitrU3ByaXRlV29ybGROZWVkc1RvRHJhdyA9IDFMIDw8IDEKK2tLZXlGcmFtZUFuZFNpbmdsZU92ZXJyaWRlID0gMUwgPDwgMQora0tleUZyYW1lQW5kQWxsT3ZlcnJpZGVzID0gMUwgPDwgMgora1NjYWxlU3ByaXRlc1RvU2NhbGVXb3JsZCA9IDFMIDw8IDEKK2tTcHJpdGVXb3JsZEhpZ2hRdWFsaXR5ID0gMUwgPDwgMgora1Nwcml0ZVdvcmxkRG9udEF1dG9JbnZhbGlkYXRlID0gMUwgPDwgMwora1Nwcml0ZVdvcmxkSW52aXNpYmxlID0gMUwgPDwgNAora1Nwcml0ZVdvcmxkRGlydHlJbnN0ZWFkT2ZGbHVzaCA9IDFMIDw8IDUKK2tQYXJlbnRBdG9tSXNDb250YWluZXIgPSAwCitrVHdlZW5SZWNvcmROb0ZsYWdzID0gMAora1R3ZWVuUmVjb3JkSXNBdEludGVycnVwdFRpbWUgPSAweDAwMDAwMDAxCitrRWZmZWN0TmFtZUF0b20gPSBGT1VSX0NIQVJfQ09ERSgnbmFtZScpCitrRWZmZWN0VHlwZUF0b20gPSBGT1VSX0NIQVJfQ09ERSgndHlwZScpCitrRWZmZWN0TWFudWZhY3R1cmVyQXRvbSA9IEZPVVJfQ0hBUl9DT0RFKCdtYW51JykKK3BkQWN0aW9uQ29uZmlybURpYWxvZyA9IDEKK3BkQWN0aW9uU2V0QXBwbGVNZW51ID0gMgorcGRBY3Rpb25TZXRFZGl0TWVudSA9IDMKK3BkQWN0aW9uR2V0RGlhbG9nVmFsdWVzID0gNAorcGRBY3Rpb25TZXRQcmV2aWV3VXNlckl0ZW0gPSA1CitwZEFjdGlvblNldFByZXZpZXdQaWN0dXJlID0gNgorcGRBY3Rpb25TZXRDb2xvclBpY2tlckV2ZW50UHJvYyA9IDcKK3BkQWN0aW9uU2V0RGlhbG9nVGl0bGUgPSA4CitwZEFjdGlvbkdldFN1YlBhbmVsTWVudSA9IDkKK3BkQWN0aW9uQWN0aXZhdGVTdWJQYW5lbCA9IDEwCitwZEFjdGlvbkNvbmR1Y3RTdG9wQWxlcnQgPSAxMQorcGRBY3Rpb25Nb2RlbGVzc0NhbGxiYWNrID0gMTIKK3BkQWN0aW9uRmV0Y2hQcmV2aWV3ID0gMTMKK3BkQWN0aW9uU2V0RGlhbG9nU2V0dGluZ3MgPSAxNAorcGRBY3Rpb25HZXREaWFsb2dTZXR0aW5ncyA9IDE1CitwZEFjdGlvbkdldE5leHRTYW1wbGUgPSAxNgorcGRBY3Rpb25HZXRQcmV2aW91c1NhbXBsZSA9IDE3CitwZEFjdGlvbkNvbXBhY3RTYW1wbGUgPSAxOAorcGRBY3Rpb25TZXRFZGl0Q2FsbG91dCA9IDE5CitwZEFjdGlvblNldFNhbXBsZVRpbWUgPSAyMAorcGRBY3Rpb25Eb0VkaXRDb21tYW5kID0gMjEKK3BkQWN0aW9uR2V0U3ViUGFuZWxNZW51VmFsdWUgPSAyMgorcGRBY3Rpb25DdXN0b21OZXdDb250cm9sID0gMjMKK3BkQWN0aW9uQ3VzdG9tRGlzcG9zZUNvbnRyb2wgPSAyNAorcGRBY3Rpb25DdXN0b21Qb3NpdGlvbkNvbnRyb2wgPSAyNQorcGRBY3Rpb25DdXN0b21TaG93SGlkZUNvbnRyb2wgPSAyNgorcGRBY3Rpb25DdXN0b21IYW5kbGVFdmVudCA9IDI3CitwZEFjdGlvbkN1c3RvbVNldEZvY3VzID0gMjgKK3BkQWN0aW9uQ3VzdG9tU2V0RWRpdE1lbnUgPSAyOQorcGRBY3Rpb25DdXN0b21TZXRQcmV2aWV3UGljdHVyZSA9IDMwCitwZEFjdGlvbkN1c3RvbVNldEVkaXRDYWxsb3V0ID0gMzEKK3BkQWN0aW9uQ3VzdG9tR2V0RW5hYmxlVmFsdWUgPSAzMgorcGRBY3Rpb25DdXN0b21TZXRTYW1wbGVUaW1lID0gMzMKK3BkQWN0aW9uQ3VzdG9tR2V0VmFsdWUgPSAzNAorcGRBY3Rpb25DdXN0b21Eb0VkaXRDb21tYW5kID0gMzUKK3BkU2FtcGxlVGltZURpc3BsYXlPcHRpb25zTm9uZSA9IDB4MDAwMDAwMDAKK3BkQWN0aW9uRm9jdXNPZmYgPSAwCitwZEFjdGlvbkZvY3VzRmlyc3QgPSAxCitwZEFjdGlvbkZvY3VzTGFzdCA9IDIKK3BkQWN0aW9uRm9jdXNGb3J3YXJkID0gMworcGRBY3Rpb25Gb2N1c0JhY2t3YXJkID0gNAorZWxPcHRpb25zSW5jbHVkZU5vbmVJbkxpc3QgPSAweDAwMDAwMDAxCitwZE9wdGlvbnNDb2xsZWN0T25lVmFsdWUgPSAweDAwMDAwMDAxCitwZE9wdGlvbnNBbGxvd09wdGlvbmFsSW50ZXJwb2xhdGlvbnMgPSAweDAwMDAwMDAyCitwZE9wdGlvbnNNb2RhbERpYWxvZ0JveCA9IDB4MDAwMDAwMDQKK3BkT3B0aW9uc0VkaXRDdXJyZW50RWZmZWN0T25seSA9IDB4MDAwMDAwMDgKK3BkT3B0aW9uc0hpZGVQcmV2aWV3ID0gMHgwMDAwMDAxMAorZWZmZWN0SXNSZWFsdGltZSA9IDAKK2tBY2Nlc3NLZXlBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhY2t5JykKK2tBY2Nlc3NLZXlTeXN0ZW1GbGFnID0gMUwgPDwgMAorQ29ubmVjdGlvblNwZWVkUHJlZnNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2NzcGQnKQorQmFuZHdpZHRoTWFuYWdlbWVudFByZWZzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdid21nJykKK2tRVElkbGVQcmlvcml0eSA9IDEwCitrUVROb25SZWFsVGltZVByaW9yaXR5ID0gMjAKK2tRVFJlYWxUaW1lU2hhcmVkUHJpb3JpdHkgPSAyNQora1FUUmVhbFRpbWVQcmlvcml0eSA9IDMwCitrUVRCYW5kd2lkdGhOb3RpZnlOZWVkVG9TdG9wID0gMUwgPDwgMAora1FUQmFuZHdpZHRoTm90aWZ5R29vZFRvR28gPSAxTCA8PCAxCitrUVRCYW5kd2lkdGhDaGFuZ2VSZXF1ZXN0ID0gMUwgPDwgMgora1FUQmFuZHdpZHRoUXVldWVSZXF1ZXN0ID0gMUwgPDwgMwora1FUQmFuZHdpZHRoU2NoZWR1bGVkUmVxdWVzdCA9IDFMIDw8IDQKK2tRVEJhbmR3aWR0aFZvbHVudGFyeVJlbGVhc2UgPSAxTCA8PCA1CitrSVRleHRSZW1vdmVFdmVyeXRoaW5nQnV0ID0gMCA8PCAxCitrSVRleHRSZW1vdmVMZWF2ZVN1Z2dlc3RlZEFsdGVybmF0ZSA9IDEgPDwgMQora0lUZXh0QXRvbVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnaXR4dCcpCitrSVRleHRTdHJpbmdBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0ZXh0JykKK2tRVFBhcnNlVGV4dEhSRUZUZXh0ID0gRk9VUl9DSEFSX0NPREUoJ3RleHQnKQora1FUUGFyc2VUZXh0SFJFRkJhc2VVUkwgPSBGT1VSX0NIQVJfQ09ERSgnYnVybCcpCitrUVRQYXJzZVRleHRIUkVGQ2xpY2tQb2ludCA9IEZPVVJfQ0hBUl9DT0RFKCdjbGlrJykKK2tRVFBhcnNlVGV4dEhSRUZVc2VBbHREZWxpbSA9IEZPVVJfQ0hBUl9DT0RFKCdhbHRkJykKK2tRVFBhcnNlVGV4dEhSRUZEZWxpbWl0ZXIgPSBGT1VSX0NIQVJfQ09ERSgnZGVsbScpCitrUVRQYXJzZVRleHRIUkVGUmVjb21wb3NlSFJFRiA9IEZPVVJfQ0hBUl9DT0RFKCdyaHJmJykKK2tRVFBhcnNlVGV4dEhSRUZVUkwgPSBGT1VSX0NIQVJfQ09ERSgndXJsICcpCitrUVRQYXJzZVRleHRIUkVGVGFyZ2V0ID0gRk9VUl9DSEFSX0NPREUoJ3RhcmcnKQora1FUUGFyc2VUZXh0SFJFRkNoYXB0ZXIgPSBGT1VSX0NIQVJfQ09ERSgnY2hhcCcpCitrUVRQYXJzZVRleHRIUkVGSXNBdXRvSFJFRiA9IEZPVVJfQ0hBUl9DT0RFKCdhdXRvJykKK2tRVFBhcnNlVGV4dEhSRUZJc1NlcnZlck1hcCA9IEZPVVJfQ0hBUl9DT0RFKCdzbWFwJykKK2tRVFBhcnNlVGV4dEhSRUZIUkVGID0gRk9VUl9DSEFSX0NPREUoJ2hyZWYnKQora1FUUGFyc2VUZXh0SFJFRkVNQkVEQXJncyA9IEZPVVJfQ0hBUl9DT0RFKCdtYmVkJykKK2tUcmFja1JlZmVyZW5jZUNoYXB0ZXJMaXN0ID0gRk9VUl9DSEFSX0NPREUoJ2NoYXAnKQora1RyYWNrUmVmZXJlbmNlVGltZUNvZGUgPSBGT1VSX0NIQVJfQ09ERSgndG1jZCcpCitrVHJhY2tSZWZlcmVuY2VNb2RpZmllciA9IEZPVVJfQ0hBUl9DT0RFKCdzc3JjJykKK2tUcmFja01vZGlmaWVySW5wdXQgPSAweDY5NkUKK2tUcmFja01vZGlmaWVyVHlwZSA9IDB4NzQ3OQora1RyYWNrTW9kaWZpZXJSZWZlcmVuY2UgPSBGT1VSX0NIQVJfQ09ERSgnc3NyYycpCitrVHJhY2tNb2RpZmllck9iamVjdElEID0gRk9VUl9DSEFSX0NPREUoJ29iaWQnKQora1RyYWNrTW9kaWZpZXJJbnB1dE5hbWUgPSBGT1VSX0NIQVJfQ09ERSgnbmFtZScpCitrSW5wdXRNYXBTdWJJbnB1dElEID0gRk9VUl9DSEFSX0NPREUoJ3N1YmknKQora1RyYWNrTW9kaWZpZXJUeXBlTWF0cml4ID0gMQora1RyYWNrTW9kaWZpZXJUeXBlQ2xpcCA9IDIKK2tUcmFja01vZGlmaWVyVHlwZUdyYXBoaWNzTW9kZSA9IDUKK2tUcmFja01vZGlmaWVyVHlwZVZvbHVtZSA9IDMKK2tUcmFja01vZGlmaWVyVHlwZUJhbGFuY2UgPSA0CitrVHJhY2tNb2RpZmllclR5cGVJbWFnZSA9IEZPVVJfQ0hBUl9DT0RFKCd2aWRlJykKK2tUcmFja01vZGlmaWVyT2JqZWN0TWF0cml4ID0gNgora1RyYWNrTW9kaWZpZXJPYmplY3RHcmFwaGljc01vZGUgPSA3CitrVHJhY2tNb2RpZmllclR5cGUzZDR4NE1hdHJpeCA9IDgKK2tUcmFja01vZGlmaWVyQ2FtZXJhRGF0YSA9IDkKK2tUcmFja01vZGlmaWVyU291bmRMb2NhbGl6YXRpb25EYXRhID0gMTAKK2tUcmFja01vZGlmaWVyT2JqZWN0SW1hZ2VJbmRleCA9IDExCitrVHJhY2tNb2RpZmllck9iamVjdExheWVyID0gMTIKK2tUcmFja01vZGlmaWVyT2JqZWN0VmlzaWJsZSA9IDEzCitrVHJhY2tNb2RpZmllckFuZ2xlQXNwZWN0Q2FtZXJhID0gMTQKK2tUcmFja01vZGlmaWVyUGFuQW5nbGUgPSBGT1VSX0NIQVJfQ09ERSgncGFuICcpCitrVHJhY2tNb2RpZmllclRpbHRBbmdsZSA9IEZPVVJfQ0hBUl9DT0RFKCd0aWx0JykKK2tUcmFja01vZGlmaWVyVmVydGljYWxGaWVsZE9mVmlld0FuZ2xlID0gRk9VUl9DSEFSX0NPREUoJ2ZvdiAnKQora1RyYWNrTW9kaWZpZXJPYmplY3RRVEV2ZW50U2VuZCA9IEZPVVJfQ0hBUl9DT0RFKCdldm50JykKK2tUcmFja01vZGlmaWVyT2JqZWN0Q2FuQmVIaXRUZXN0ZWQgPSAxNQora1R3ZWVuVHlwZVNob3J0ID0gMQora1R3ZWVuVHlwZUxvbmcgPSAyCitrVHdlZW5UeXBlRml4ZWQgPSAzCitrVHdlZW5UeXBlUG9pbnQgPSA0CitrVHdlZW5UeXBlUURSZWN0ID0gNQora1R3ZWVuVHlwZVFEUmVnaW9uID0gNgora1R3ZWVuVHlwZU1hdHJpeCA9IDcKK2tUd2VlblR5cGVSR0JDb2xvciA9IDgKK2tUd2VlblR5cGVHcmFwaGljc01vZGVXaXRoUkdCQ29sb3IgPSA5CitrVHdlZW5UeXBlUVRGbG9hdFNpbmdsZSA9IDEwCitrVHdlZW5UeXBlUVRGbG9hdERvdWJsZSA9IDExCitrVHdlZW5UeXBlRml4ZWRQb2ludCA9IDEyCitrVHdlZW5UeXBlM2RTY2FsZSA9IEZPVVJfQ0hBUl9DT0RFKCczc2NhJykKK2tUd2VlblR5cGUzZFRyYW5zbGF0ZSA9IEZPVVJfQ0hBUl9DT0RFKCczdHJhJykKK2tUd2VlblR5cGUzZFJvdGF0ZSA9IEZPVVJfQ0hBUl9DT0RFKCczcm90JykKK2tUd2VlblR5cGUzZFJvdGF0ZUFib3V0UG9pbnQgPSBGT1VSX0NIQVJfQ09ERSgnM3JhcCcpCitrVHdlZW5UeXBlM2RSb3RhdGVBYm91dEF4aXMgPSBGT1VSX0NIQVJfQ09ERSgnM3JheCcpCitrVHdlZW5UeXBlM2RSb3RhdGVBYm91dFZlY3RvciA9IEZPVVJfQ0hBUl9DT0RFKCczcnZjJykKK2tUd2VlblR5cGUzZFF1YXRlcm5pb24gPSBGT1VSX0NIQVJfQ09ERSgnM3F1YScpCitrVHdlZW5UeXBlM2RNYXRyaXggPSBGT1VSX0NIQVJfQ09ERSgnM21hdCcpCitrVHdlZW5UeXBlM2RDYW1lcmFEYXRhID0gRk9VUl9DSEFSX0NPREUoJzNjYW0nKQora1R3ZWVuVHlwZTNkQW5nbGVBc3BlY3RDYW1lcmFEYXRhID0gRk9VUl9DSEFSX0NPREUoJzNjYWEnKQora1R3ZWVuVHlwZTNkU291bmRMb2NhbGl6YXRpb25EYXRhID0gRk9VUl9DSEFSX0NPREUoJzNzbGMnKQora1R3ZWVuVHlwZVBhdGhUb01hdHJpeFRyYW5zbGF0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2d4bXQnKQora1R3ZWVuVHlwZVBhdGhUb01hdHJpeFJvdGF0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2d4cHInKQora1R3ZWVuVHlwZVBhdGhUb01hdHJpeFRyYW5zbGF0aW9uQW5kUm90YXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnZ3htcicpCitrVHdlZW5UeXBlUGF0aFRvRml4ZWRQb2ludCA9IEZPVVJfQ0hBUl9DT0RFKCdneGZwJykKK2tUd2VlblR5cGVQYXRoWHRvWSA9IEZPVVJfQ0hBUl9DT0RFKCdneHh5JykKK2tUd2VlblR5cGVQYXRoWXRvWCA9IEZPVVJfQ0hBUl9DT0RFKCdneHl4JykKK2tUd2VlblR5cGVBdG9tTGlzdCA9IEZPVVJfQ0hBUl9DT0RFKCdhdG9tJykKK2tUd2VlblR5cGVQb2x5Z29uID0gRk9VUl9DSEFSX0NPREUoJ3BvbHknKQora1R3ZWVuVHlwZU11bHRpTWF0cml4ID0gRk9VUl9DSEFSX0NPREUoJ211bG0nKQora1R3ZWVuVHlwZVNwaW4gPSBGT1VSX0NIQVJfQ09ERSgnc3BpbicpCitrVHdlZW5UeXBlM2RNYXRyaXhOb25MaW5lYXIgPSBGT1VSX0NIQVJfQ09ERSgnM25scicpCitrVHdlZW5UeXBlM2RWUk9iamVjdCA9IEZPVVJfQ0hBUl9DT0RFKCczdnJvJykKK2tUd2VlbkVudHJ5ID0gRk9VUl9DSEFSX0NPREUoJ3R3ZW4nKQora1R3ZWVuRGF0YSA9IEZPVVJfQ0hBUl9DT0RFKCdkYXRhJykKK2tUd2VlblR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndHdudCcpCitrVHdlZW5TdGFydE9mZnNldCA9IEZPVVJfQ0hBUl9DT0RFKCd0d3N0JykKK2tUd2VlbkR1cmF0aW9uID0gRk9VUl9DSEFSX0NPREUoJ3R3ZHUnKQora1R3ZWVuRmxhZ3MgPSBGT1VSX0NIQVJfQ09ERSgnZmxhZycpCitrVHdlZW5PdXRwdXRNaW4gPSBGT1VSX0NIQVJfQ09ERSgnb21pbicpCitrVHdlZW5PdXRwdXRNYXggPSBGT1VSX0NIQVJfQ09ERSgnb21heCcpCitrVHdlZW5TZXF1ZW5jZUVsZW1lbnQgPSBGT1VSX0NIQVJfQ09ERSgnc2VxZScpCitrVHdlZW4zZEluaXRpYWxDb25kaXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnaWNuZCcpCitrVHdlZW5JbnRlcnBvbGF0aW9uSUQgPSBGT1VSX0NIQVJfQ09ERSgnaW50cicpCitrVHdlZW5SZWdpb25EYXRhID0gRk9VUl9DSEFSX0NPREUoJ3FkcmcnKQora1R3ZWVuUGljdHVyZURhdGEgPSBGT1VSX0NIQVJfQ09ERSgnUElDVCcpCitrTGlzdEVsZW1lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3R5cGUnKQora0xpc3RFbGVtZW50RGF0YVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZGF0eScpCitrTmFtZUF0b20gPSBGT1VSX0NIQVJfQ09ERSgnbmFtZScpCitrSW5pdGlhbFJvdGF0aW9uQXRvbSA9IEZPVVJfQ0hBUl9DT0RFKCdpbnJvJykKK2tOb25MaW5lYXJUd2VlbkhlYWRlciA9IEZPVVJfQ0hBUl9DT0RFKCdubHRoJykKK2tUd2VlblJldHVybkRlbHRhID0gMUwgPDwgMAora1FUUmVzdHJpY3Rpb25DbGFzc1NhdmUgPSBGT1VSX0NIQVJfQ09ERSgnc2F2ZScpCitrUVRSZXN0cmljdGlvblNhdmVEb250QWRkTW92aWVSZXNvdXJjZSA9ICgxTCA8PCAwKQora1FUUmVzdHJpY3Rpb25TYXZlRG9udEZsYXR0ZW4gPSAoMUwgPDwgMSkKK2tRVFJlc3RyaWN0aW9uU2F2ZURvbnRFeHBvcnQgPSAoMUwgPDwgMikKK2tRVFJlc3RyaWN0aW9uU2F2ZURvbnRFeHRyYWN0ID0gKDFMIDw8IDMpCitrUVRSZXN0cmljdGlvbkNsYXNzRWRpdCA9IEZPVVJfQ0hBUl9DT0RFKCdlZGl0JykKK2tRVFJlc3RyaWN0aW9uRWRpdERvbnRDb3B5ID0gKDFMIDw8IDApCitrUVRSZXN0cmljdGlvbkVkaXREb250Q3V0ID0gKDFMIDw8IDEpCitrUVRSZXN0cmljdGlvbkVkaXREb250UGFzdGUgPSAoMUwgPDwgMikKK2tRVFJlc3RyaWN0aW9uRWRpdERvbnRDbGVhciA9ICgxTCA8PCAzKQora1FUUmVzdHJpY3Rpb25FZGl0RG9udE1vZGlmeSA9ICgxTCA8PCA0KQora1FUUmVzdHJpY3Rpb25FZGl0RG9udEV4dHJhY3QgPSAoMUwgPDwgNSkKK3ZpZGVvRmxhZ0RvbnRMZWFuQWhlYWQgPSAxTCA8PCAwCit0eHRQcm9jRGVmYXVsdERpc3BsYXkgPSAwCit0eHRQcm9jRG9udERpc3BsYXkgPSAxCit0eHRQcm9jRG9EaXNwbGF5ID0gMgorZmluZFRleHRFZGdlT0sgPSAxIDw8IDAKK2ZpbmRUZXh0Q2FzZVNlbnNpdGl2ZSA9IDEgPDwgMQorZmluZFRleHRSZXZlcnNlU2VhcmNoID0gMSA8PCAyCitmaW5kVGV4dFdyYXBBcm91bmQgPSAxIDw8IDMKK2ZpbmRUZXh0VXNlT2Zmc2V0ID0gMSA8PCA0Citkcm9wU2hhZG93T2Zmc2V0VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkcnBvJykKK2Ryb3BTaGFkb3dUcmFuc2x1Y2VuY3lUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2RycHQnKQorc3ByaXRlSGl0VGVzdEJvdW5kcyA9IDFMIDw8IDAKK3Nwcml0ZUhpdFRlc3RJbWFnZSA9IDFMIDw8IDEKK3Nwcml0ZUhpdFRlc3RJbnZpc2libGVTcHJpdGVzID0gMUwgPDwgMgorc3ByaXRlSGl0VGVzdElzQ2xpY2sgPSAxTCA8PCAzCitzcHJpdGVIaXRUZXN0TG9jSW5EaXNwbGF5Q29vcmRpbmF0ZXMgPSAxTCA8PCA0CitzcHJpdGVIaXRUZXN0VHJlYXRBbGxTcHJpdGVzQXNIaXRUZXN0YWJsZSA9IDFMIDw8IDUKK2tTcHJpdGVBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzcHJ0JykKK2tTcHJpdGVJbWFnZXNDb250YWluZXJBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbWN0JykKK2tTcHJpdGVJbWFnZUF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ltYWcnKQora1Nwcml0ZUltYWdlRGF0YUF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ltZGEnKQora1Nwcml0ZUltYWdlRGF0YVJlZkF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ltcmUnKQora1Nwcml0ZUltYWdlRGF0YVJlZlR5cGVBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbXJ0JykKK2tTcHJpdGVJbWFnZUdyb3VwSURBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbWdyJykKK2tTcHJpdGVJbWFnZVJlZ2lzdHJhdGlvbkF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ltcmcnKQora1Nwcml0ZUltYWdlRGVmYXVsdEltYWdlSW5kZXhBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkZWZpJykKK2tTcHJpdGVTaGFyZWREYXRhQXRvbVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZGZsdCcpCitrU3ByaXRlTmFtZUF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ25hbWUnKQora1Nwcml0ZUltYWdlTmFtZUF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ25hbWUnKQora1Nwcml0ZVVzZXNJbWFnZUlEc0F0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ3VzZXMnKQora1Nwcml0ZUJlaGF2aW9yc0F0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2JlaGEnKQora1Nwcml0ZUltYWdlQmVoYXZpb3JBdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbWFnJykKK2tTcHJpdGVDdXJzb3JCZWhhdmlvckF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Nyc3InKQora1Nwcml0ZVN0YXR1c1N0cmluZ3NCZWhhdmlvckF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NzdHInKQora1Nwcml0ZVZhcmlhYmxlc0NvbnRhaW5lckF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ3ZhcnMnKQora1Nwcml0ZVN0cmluZ1ZhcmlhYmxlQXRvbVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3RydicpCitrU3ByaXRlRmxvYXRpbmdQb2ludFZhcmlhYmxlQXRvbVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmxvdicpCitrTW92aWVNZWRpYURhdGFSZWZlcmVuY2UgPSBGT1VSX0NIQVJfQ09ERSgnbW1kcicpCitrTW92aWVNZWRpYURlZmF1bHREYXRhUmVmZXJlbmNlSUQgPSBGT1VSX0NIQVJfQ09ERSgnZGRyaScpCitrTW92aWVNZWRpYVNsYXZlVGltZSA9IEZPVVJfQ0hBUl9DT0RFKCdzbHRpJykKK2tNb3ZpZU1lZGlhU2xhdmVBdWRpbyA9IEZPVVJfQ0hBUl9DT0RFKCdzbGF1JykKK2tNb3ZpZU1lZGlhU2xhdmVHcmFwaGljc01vZGUgPSBGT1VSX0NIQVJfQ09ERSgnc2xncicpCitrTW92aWVNZWRpYUF1dG9QbGF5ID0gRk9VUl9DSEFSX0NPREUoJ3BsYXknKQora01vdmllTWVkaWFMb29wID0gRk9VUl9DSEFSX0NPREUoJ2xvb3AnKQora01vdmllTWVkaWFVc2VNSU1FVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtaW1lJykKK2tNb3ZpZU1lZGlhVGl0bGUgPSBGT1VSX0NIQVJfQ09ERSgndGl0bCcpCitrTW92aWVNZWRpYUFsdFRleHQgPSBGT1VSX0NIQVJfQ09ERSgnYWx0dCcpCitrTW92aWVNZWRpYUNsaXBCZWdpbiA9IEZPVVJfQ0hBUl9DT0RFKCdjbHBiJykKK2tNb3ZpZU1lZGlhQ2xpcER1cmF0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2NscGQnKQora01vdmllTWVkaWFSZWdpb25BdG9tID0gRk9VUl9DSEFSX0NPREUoJ3JlZ2knKQora01vdmllTWVkaWFTbGF2ZVRyYWNrRHVyYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnc2x0cicpCitrTW92aWVNZWRpYUVuYWJsZUZyYW1lU3RlcHBpbmcgPSBGT1VSX0NIQVJfQ09ERSgnZW5mcycpCitrTW92aWVNZWRpYUJhY2tncm91bmRDb2xvciA9IEZPVVJfQ0hBUl9DT0RFKCdia2NsJykKK2tNb3ZpZU1lZGlhUHJlcm9sbFRpbWUgPSBGT1VSX0NIQVJfQ09ERSgncHJlcicpCitrTW92aWVNZWRpYUZpdE5vbmUgPSAwCitrTW92aWVNZWRpYUZpdFNjcm9sbCA9IEZPVVJfQ0hBUl9DT0RFKCdzY3JvJykKK2tNb3ZpZU1lZGlhRml0Q2xpcElmTmVjZXNzYXJ5ID0gRk9VUl9DSEFSX0NPREUoJ2hpZGQnKQora01vdmllTWVkaWFGaXRGaWxsID0gRk9VUl9DSEFSX0NPREUoJ2ZpbGwnKQora01vdmllTWVkaWFGaXRNZWV0ID0gRk9VUl9DSEFSX0NPREUoJ21lZXQnKQora01vdmllTWVkaWFGaXRTbGljZSA9IEZPVVJfQ0hBUl9DT0RFKCdzbGljJykKK2tNb3ZpZU1lZGlhU3BhdGlhbEFkanVzdG1lbnQgPSBGT1VSX0NIQVJfQ09ERSgnZml0ICcpCitrTW92aWVNZWRpYVJlY3RhbmdsZUF0b20gPSBGT1VSX0NIQVJfQ09ERSgncmVjdCcpCitrTW92aWVNZWRpYVRvcCA9IEZPVVJfQ0hBUl9DT0RFKCd0b3AgJykKK2tNb3ZpZU1lZGlhTGVmdCA9IEZPVVJfQ0hBUl9DT0RFKCdsZWZ0JykKK2tNb3ZpZU1lZGlhV2lkdGggPSBGT1VSX0NIQVJfQ09ERSgnd2QgICcpCitrTW92aWVNZWRpYUhlaWdodCA9IEZPVVJfQ0hBUl9DT0RFKCdodCAgJykKK2tNb3ZpZVByb3BlcnR5RHVyYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnZHVyYScpCitrTW92aWVQcm9wZXJ0eVRpbWVTY2FsZSA9IEZPVVJfQ0hBUl9DT0RFKCd0aW1zJykKK2tNb3ZpZVByb3BlcnR5VGltZSA9IEZPVVJfQ0hBUl9DT0RFKCd0aW12JykKK2tNb3ZpZVByb3BlcnR5TmF0dXJhbEJvdW5kcyA9IEZPVVJfQ0hBUl9DT0RFKCduYXRiJykKK2tNb3ZpZVByb3BlcnR5TWF0cml4ID0gRk9VUl9DSEFSX0NPREUoJ210cngnKQora01vdmllUHJvcGVydHlUcmFja0xpc3QgPSBGT1VSX0NIQVJfQ09ERSgndGxzdCcpCitrVHJhY2tQcm9wZXJ0eU1lZGlhVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtdHlwJykKK2tUcmFja1Byb3BlcnR5SW5zdGFudGlhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdpbnN0JykKK01vdmllQ29udHJvbGxlckNvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncGxheScpCitrTW92aWVDb250cm9sbGVyUVRWUkZsYWcgPSAxIDw8IDAKK2tNb3ZpZUNvbnRyb2xsZXJEb250RGlzcGxheVRvVXNlciA9IDEgPDwgMQorbWNBY3Rpb25JZGxlID0gMQorbWNBY3Rpb25EcmF3ID0gMgorbWNBY3Rpb25BY3RpdmF0ZSA9IDMKK21jQWN0aW9uRGVhY3RpdmF0ZSA9IDQKK21jQWN0aW9uTW91c2VEb3duID0gNQorbWNBY3Rpb25LZXkgPSA2CittY0FjdGlvblBsYXkgPSA4CittY0FjdGlvbkdvVG9UaW1lID0gMTIKK21jQWN0aW9uU2V0Vm9sdW1lID0gMTQKK21jQWN0aW9uR2V0Vm9sdW1lID0gMTUKK21jQWN0aW9uU3RlcCA9IDE4CittY0FjdGlvblNldExvb3BpbmcgPSAyMQorbWNBY3Rpb25HZXRMb29waW5nID0gMjIKK21jQWN0aW9uU2V0TG9vcElzUGFsaW5kcm9tZSA9IDIzCittY0FjdGlvbkdldExvb3BJc1BhbGluZHJvbWUgPSAyNAorbWNBY3Rpb25TZXRHcm93Qm94Qm91bmRzID0gMjUKK21jQWN0aW9uQ29udHJvbGxlclNpemVDaGFuZ2VkID0gMjYKK21jQWN0aW9uU2V0U2VsZWN0aW9uQmVnaW4gPSAyOQorbWNBY3Rpb25TZXRTZWxlY3Rpb25EdXJhdGlvbiA9IDMwCittY0FjdGlvblNldEtleXNFbmFibGVkID0gMzIKK21jQWN0aW9uR2V0S2V5c0VuYWJsZWQgPSAzMworbWNBY3Rpb25TZXRQbGF5U2VsZWN0aW9uID0gMzQKK21jQWN0aW9uR2V0UGxheVNlbGVjdGlvbiA9IDM1CittY0FjdGlvblNldFVzZUJhZGdlID0gMzYKK21jQWN0aW9uR2V0VXNlQmFkZ2UgPSAzNworbWNBY3Rpb25TZXRGbGFncyA9IDM4CittY0FjdGlvbkdldEZsYWdzID0gMzkKK21jQWN0aW9uU2V0UGxheUV2ZXJ5RnJhbWUgPSA0MAorbWNBY3Rpb25HZXRQbGF5RXZlcnlGcmFtZSA9IDQxCittY0FjdGlvbkdldFBsYXlSYXRlID0gNDIKK21jQWN0aW9uU2hvd0JhbGxvb24gPSA0MworbWNBY3Rpb25CYWRnZUNsaWNrID0gNDQKK21jQWN0aW9uTW92aWVDbGljayA9IDQ1CittY0FjdGlvblN1c3BlbmQgPSA0NgorbWNBY3Rpb25SZXN1bWUgPSA0NworbWNBY3Rpb25TZXRDb250cm9sbGVyS2V5c0VuYWJsZWQgPSA0OAorbWNBY3Rpb25HZXRUaW1lU2xpZGVyUmVjdCA9IDQ5CittY0FjdGlvbk1vdmllRWRpdGVkID0gNTAKK21jQWN0aW9uR2V0RHJhZ0VuYWJsZWQgPSA1MQorbWNBY3Rpb25TZXREcmFnRW5hYmxlZCA9IDUyCittY0FjdGlvbkdldFNlbGVjdGlvbkJlZ2luID0gNTMKK21jQWN0aW9uR2V0U2VsZWN0aW9uRHVyYXRpb24gPSA1NAorbWNBY3Rpb25QcmVyb2xsQW5kUGxheSA9IDU1CittY0FjdGlvbkdldEN1cnNvclNldHRpbmdFbmFibGVkID0gNTYKK21jQWN0aW9uU2V0Q3Vyc29yU2V0dGluZ0VuYWJsZWQgPSA1NworbWNBY3Rpb25TZXRDb2xvclRhYmxlID0gNTgKK21jQWN0aW9uTGlua1RvVVJMID0gNTkKK21jQWN0aW9uQ3VzdG9tQnV0dG9uQ2xpY2sgPSA2MAorbWNBY3Rpb25Gb3JjZVRpbWVUYWJsZVVwZGF0ZSA9IDYxCittY0FjdGlvblNldENvbnRyb2xsZXJUaW1lTGltaXRzID0gNjIKK21jQWN0aW9uRXhlY3V0ZUFsbEFjdGlvbnNGb3JRVEV2ZW50ID0gNjMKK21jQWN0aW9uRXhlY3V0ZU9uZUFjdGlvbkZvclFURXZlbnQgPSA2NAorbWNBY3Rpb25BZGp1c3RDdXJzb3IgPSA2NQorbWNBY3Rpb25Vc2VUcmFja0ZvclRpbWVUYWJsZSA9IDY2CittY0FjdGlvbkNsaWNrQW5kSG9sZFBvaW50ID0gNjcKK21jQWN0aW9uU2hvd01lc3NhZ2VTdHJpbmcgPSA2OAorbWNBY3Rpb25TaG93U3RhdHVzU3RyaW5nID0gNjkKK21jQWN0aW9uR2V0RXh0ZXJuYWxNb3ZpZSA9IDcwCittY0FjdGlvbkdldENoYXB0ZXJUaW1lID0gNzEKK21jQWN0aW9uUGVyZm9ybUFjdGlvbkxpc3QgPSA3MgorbWNBY3Rpb25FdmFsdWF0ZUV4cHJlc3Npb24gPSA3MworbWNBY3Rpb25GZXRjaFBhcmFtZXRlckFzID0gNzQKK21jQWN0aW9uR2V0Q3Vyc29yQnlJRCA9IDc1CittY0FjdGlvbkdldE5leHRVUkwgPSA3NgorbWNBY3Rpb25Nb3ZpZUNoYW5nZWQgPSA3NworbWNBY3Rpb25Eb1NjcmlwdCA9IDc4CittY0FjdGlvblJlc3RhcnRBdFRpbWUgPSA3OQorbWNBY3Rpb25HZXRJbmRDaGFwdGVyID0gODAKK21jQWN0aW9uTGlua1RvVVJMRXh0ZW5kZWQgPSA4MQorbWNBY3Rpb25TZXRWb2x1bWVTdGVwID0gODIKK21jQWN0aW9uQXV0b1BsYXkgPSA4MworbWNBY3Rpb25QYXVzZVRvQnVmZmVyID0gODQKK21jQWN0aW9uQXBwTWVzc2FnZVJlY2VpdmVkID0gODUKK21jQWN0aW9uRXZhbHVhdGVFeHByZXNzaW9uV2l0aFR5cGUgPSA4OQorbWNBY3Rpb25HZXRNb3ZpZU5hbWUgPSA5MAorbWNBY3Rpb25HZXRNb3ZpZUlEID0gOTEKK21jQWN0aW9uR2V0TW92aWVBY3RpdmUgPSA5MgorbWNGbGFnU3VwcHJlc3NNb3ZpZUZyYW1lID0gMSA8PCAwCittY0ZsYWdTdXBwcmVzc1N0ZXBCdXR0b25zID0gMSA8PCAxCittY0ZsYWdTdXBwcmVzc1NwZWFrZXJCdXR0b24gPSAxIDw8IDIKK21jRmxhZ3NVc2VXaW5kb3dQYWxldHRlID0gMSA8PCAzCittY0ZsYWdzRG9udEludmFsaWRhdGUgPSAxIDw8IDQKK21jRmxhZ3NVc2VDdXN0b21CdXR0b24gPSAxIDw8IDUKK21jUG9zaXRpb25Eb250SW52YWxpZGF0ZSA9IDEgPDwgNQora01DSUVFbmFibGVkQnV0dG9uUGljdHVyZSA9IDEKK2tNQ0lFRGlzYWJsZWRCdXR0b25QaWN0dXJlID0gMgora01DSUVEZXByZXNzZWRCdXR0b25QaWN0dXJlID0gMwora01DSUVFbmFibGVkU2l6ZUJveFBpY3R1cmUgPSA0CitrTUNJRURpc2FibGVkU2l6ZUJveFBpY3R1cmUgPSA1CitrTUNJRUVuYWJsZWRVbmF2YWlsYWJsZUJ1dHRvblBpY3R1cmUgPSA2CitrTUNJRURpc2FibGVkVW5hdmFpbGFibGVCdXR0b25QaWN0dXJlID0gNwora01DSUVTb3VuZFNsaWRlciA9IDEyOAora01DSUVTb3VuZFRodW1iID0gMTI5CitrTUNJRUNvbG9yVGFibGUgPSAyNTYKK2tNQ0lFSXNGbGF0QXBwZWFyYW5jZSA9IDI1Nwora01DSUVEb0J1dHRvbkljb25zRHJvcE9uRGVwcmVzcyA9IDI1OAorbWNJbmZvVW5kb0F2YWlsYWJsZSA9IDEgPDwgMAorbWNJbmZvQ3V0QXZhaWxhYmxlID0gMSA8PCAxCittY0luZm9Db3B5QXZhaWxhYmxlID0gMSA8PCAyCittY0luZm9QYXN0ZUF2YWlsYWJsZSA9IDEgPDwgMworbWNJbmZvQ2xlYXJBdmFpbGFibGUgPSAxIDw8IDQKK21jSW5mb0hhc1NvdW5kID0gMSA8PCA1CittY0luZm9Jc1BsYXlpbmcgPSAxIDw8IDYKK21jSW5mb0lzTG9vcGluZyA9IDEgPDwgNworbWNJbmZvSXNJblBhbGluZHJvbWUgPSAxIDw8IDgKK21jSW5mb0VkaXRpbmdFbmFibGVkID0gMSA8PCA5CittY0luZm9Nb3ZpZUlzSW50ZXJhY3RpdmUgPSAxIDw8IDEwCittY01lbnVVbmRvID0gMQorbWNNZW51Q3V0ID0gMworbWNNZW51Q29weSA9IDQKK21jTWVudVBhc3RlID0gNQorbWNNZW51Q2xlYXIgPSA2CitrUVRBcHBNZXNzYWdlU29mdHdhcmVDaGFuZ2VkID0gMQora1FUQXBwTWVzc2FnZVdpbmRvd0Nsb3NlUmVxdWVzdGVkID0gMwora1FUQXBwTWVzc2FnZUV4aXRGdWxsU2NyZWVuUmVxdWVzdGVkID0gNAora1FUQXBwTWVzc2FnZURpc3BsYXlDaGFubmVscyA9IDUKK2tRVEFwcE1lc3NhZ2VFbnRlckZ1bGxTY3JlZW5SZXF1ZXN0ZWQgPSA2CitrRmV0Y2hBc0Jvb2xlYW5QdHIgPSAxCitrRmV0Y2hBc1Nob3J0UHRyID0gMgora0ZldGNoQXNMb25nUHRyID0gMwora0ZldGNoQXNNYXRyaXhSZWNvcmRQdHIgPSA0CitrRmV0Y2hBc01vZGlmaWVyVHJhY2tHcmFwaGljc01vZGVSZWNvcmQgPSA1CitrRmV0Y2hBc0hhbmRsZSA9IDYKK2tGZXRjaEFzU3RyMjU1ID0gNwora0ZldGNoQXNGbG9hdFB0ciA9IDgKK2tGZXRjaEFzUG9pbnRQdHIgPSA5CitrRmV0Y2hBc05ld0F0b21Db250YWluZXIgPSAxMAora0ZldGNoQXNRVEV2ZW50UmVjb3JkUHRyID0gMTEKK2tGZXRjaEFzRml4ZWRQdHIgPSAxMgora0ZldGNoQXNTZXRDb250cm9sbGVyVmFsdWVQdHIgPSAxMwora0ZldGNoQXNSZ25IYW5kbGUgPSAxNAora0ZldGNoQXNDb21wb25lbnREZXNjcmlwdGlvblB0ciA9IDE1CitrRmV0Y2hBc0NTdHJpbmcgPSAxNgora1FUQ3Vyc29yT3BlbkhhbmQgPSAtMTkxODMKK2tRVEN1cnNvckNsb3NlZEhhbmQgPSAtMTkxODIKK2tRVEN1cnNvclBvaW50aW5nSGFuZCA9IC0xOTE4MQora1FUQ3Vyc29yUmlnaHRBcnJvdyA9IC0xOTE4MAora1FUQ3Vyc29yTGVmdEFycm93ID0gLTE5MTc5CitrUVRDdXJzb3JEb3duQXJyb3cgPSAtMTkxNzgKK2tRVEN1cnNvclVwQXJyb3cgPSAtMTkxNzcKK2tRVEN1cnNvcklCZWFtID0gLTE5MTc2CitrQ29udHJvbGxlclVuZGVyc3RhbmRzSWRsZU1hbmFnZXJzID0gMSA8PCAwCitrVmlkZW9NZWRpYVJlc2V0U3RhdGlzdGljc1NlbGVjdCA9IDB4MDEwNQora1ZpZGVvTWVkaWFHZXRTdGF0aXN0aWNzU2VsZWN0ID0gMHgwMTA2CitrVmlkZW9NZWRpYUdldFN0YWxsQ291bnRTZWxlY3QgPSAweDAxMEUKK2tWaWRlb01lZGlhU2V0Q29kZWNQYXJhbWV0ZXJTZWxlY3QgPSAweDAxMEYKK2tWaWRlb01lZGlhR2V0Q29kZWNQYXJhbWV0ZXJTZWxlY3QgPSAweDAxMTAKK2tUZXh0TWVkaWFTZXRUZXh0UHJvY1NlbGVjdCA9IDB4MDEwMQora1RleHRNZWRpYUFkZFRleHRTYW1wbGVTZWxlY3QgPSAweDAxMDIKK2tUZXh0TWVkaWFBZGRURVNhbXBsZVNlbGVjdCA9IDB4MDEwMwora1RleHRNZWRpYUFkZEhpbGl0ZVNhbXBsZVNlbGVjdCA9IDB4MDEwNAora1RleHRNZWRpYURyYXdSYXdTZWxlY3QgPSAweDAxMDkKK2tUZXh0TWVkaWFTZXRUZXh0UHJvcGVydHlTZWxlY3QgPSAweDAxMEEKK2tUZXh0TWVkaWFSYXdTZXR1cFNlbGVjdCA9IDB4MDEwQgora1RleHRNZWRpYVJhd0lkbGVTZWxlY3QgPSAweDAxMEMKK2tUZXh0TWVkaWFHZXRUZXh0UHJvcGVydHlTZWxlY3QgPSAweDAxMEQKK2tUZXh0TWVkaWFGaW5kTmV4dFRleHRTZWxlY3QgPSAweDAxMDUKK2tUZXh0TWVkaWFIaWxpdGVUZXh0U2FtcGxlU2VsZWN0ID0gMHgwMTA2CitrVGV4dE1lZGlhU2V0VGV4dFNhbXBsZURhdGFTZWxlY3QgPSAweDAxMDcKK2tTcHJpdGVNZWRpYVNldFByb3BlcnR5U2VsZWN0ID0gMHgwMTAxCitrU3ByaXRlTWVkaWFHZXRQcm9wZXJ0eVNlbGVjdCA9IDB4MDEwMgora1Nwcml0ZU1lZGlhSGl0VGVzdFNwcml0ZXNTZWxlY3QgPSAweDAxMDMKK2tTcHJpdGVNZWRpYUNvdW50U3ByaXRlc1NlbGVjdCA9IDB4MDEwNAora1Nwcml0ZU1lZGlhQ291bnRJbWFnZXNTZWxlY3QgPSAweDAxMDUKK2tTcHJpdGVNZWRpYUdldEluZEltYWdlRGVzY3JpcHRpb25TZWxlY3QgPSAweDAxMDYKK2tTcHJpdGVNZWRpYUdldERpc3BsYXllZFNhbXBsZU51bWJlclNlbGVjdCA9IDB4MDEwNwora1Nwcml0ZU1lZGlhR2V0U3ByaXRlTmFtZVNlbGVjdCA9IDB4MDEwOAora1Nwcml0ZU1lZGlhR2V0SW1hZ2VOYW1lU2VsZWN0ID0gMHgwMTA5CitrU3ByaXRlTWVkaWFTZXRTcHJpdGVQcm9wZXJ0eVNlbGVjdCA9IDB4MDEwQQora1Nwcml0ZU1lZGlhR2V0U3ByaXRlUHJvcGVydHlTZWxlY3QgPSAweDAxMEIKK2tTcHJpdGVNZWRpYUhpdFRlc3RBbGxTcHJpdGVzU2VsZWN0ID0gMHgwMTBDCitrU3ByaXRlTWVkaWFIaXRUZXN0T25lU3ByaXRlU2VsZWN0ID0gMHgwMTBECitrU3ByaXRlTWVkaWFTcHJpdGVJbmRleFRvSURTZWxlY3QgPSAweDAxMEUKK2tTcHJpdGVNZWRpYVNwcml0ZUlEVG9JbmRleFNlbGVjdCA9IDB4MDEwRgora1Nwcml0ZU1lZGlhR2V0U3ByaXRlQWN0aW9uc0ZvclFURXZlbnRTZWxlY3QgPSAweDAxMTAKK2tTcHJpdGVNZWRpYVNldEFjdGlvblZhcmlhYmxlU2VsZWN0ID0gMHgwMTExCitrU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZVNlbGVjdCA9IDB4MDExMgora1Nwcml0ZU1lZGlhR2V0SW5kSW1hZ2VQcm9wZXJ0eVNlbGVjdCA9IDB4MDExMwora1Nwcml0ZU1lZGlhTmV3U3ByaXRlU2VsZWN0ID0gMHgwMTE0CitrU3ByaXRlTWVkaWFEaXNwb3NlU3ByaXRlU2VsZWN0ID0gMHgwMTE1CitrU3ByaXRlTWVkaWFTZXRBY3Rpb25WYXJpYWJsZVRvU3RyaW5nU2VsZWN0ID0gMHgwMTE2CitrU3ByaXRlTWVkaWFHZXRBY3Rpb25WYXJpYWJsZUFzU3RyaW5nU2VsZWN0ID0gMHgwMTE3CitrU3ByaXRlTWVkaWFOZXdJbWFnZVNlbGVjdCA9IDB4MDExQgora1Nwcml0ZU1lZGlhRGlzcG9zZUltYWdlU2VsZWN0ID0gMHgwMTFDCitrU3ByaXRlTWVkaWFJbWFnZUluZGV4VG9JRFNlbGVjdCA9IDB4MDExRAora1Nwcml0ZU1lZGlhSW1hZ2VJRFRvSW5kZXhTZWxlY3QgPSAweDAxMUUKK2tGbGFzaE1lZGlhU2V0UGFuU2VsZWN0ID0gMHgwMTAxCitrRmxhc2hNZWRpYVNldFpvb21TZWxlY3QgPSAweDAxMDIKK2tGbGFzaE1lZGlhU2V0Wm9vbVJlY3RTZWxlY3QgPSAweDAxMDMKK2tGbGFzaE1lZGlhR2V0UmVmQ29uQm91bmRzU2VsZWN0ID0gMHgwMTA0CitrRmxhc2hNZWRpYUdldFJlZkNvbklEU2VsZWN0ID0gMHgwMTA1CitrRmxhc2hNZWRpYUlEVG9SZWZDb25TZWxlY3QgPSAweDAxMDYKK2tGbGFzaE1lZGlhR2V0RGlzcGxheWVkRnJhbWVOdW1iZXJTZWxlY3QgPSAweDAxMDcKK2tGbGFzaE1lZGlhRnJhbWVOdW1iZXJUb01vdmllVGltZVNlbGVjdCA9IDB4MDEwOAora0ZsYXNoTWVkaWFGcmFtZUxhYmVsVG9Nb3ZpZVRpbWVTZWxlY3QgPSAweDAxMDkKK2tGbGFzaE1lZGlhR2V0Rmxhc2hWYXJpYWJsZVNlbGVjdCA9IDB4MDEwQQora0ZsYXNoTWVkaWFTZXRGbGFzaFZhcmlhYmxlU2VsZWN0ID0gMHgwMTBCCitrRmxhc2hNZWRpYURvQnV0dG9uQWN0aW9uc1NlbGVjdCA9IDB4MDEwQwora0ZsYXNoTWVkaWFHZXRTdXBwb3J0ZWRTd2ZWZXJzaW9uU2VsZWN0ID0gMHgwMTBECitrTW92aWVNZWRpYUdldENoaWxkRG9NQ0FjdGlvbkNhbGxiYWNrU2VsZWN0ID0gMHgwMTAyCitrTW92aWVNZWRpYUdldERvTUNBY3Rpb25DYWxsYmFja1NlbGVjdCA9IDB4MDEwMwora01vdmllTWVkaWFHZXRDdXJyZW50TW92aWVQcm9wZXJ0eVNlbGVjdCA9IDB4MDEwNAora01vdmllTWVkaWFHZXRDdXJyZW50VHJhY2tQcm9wZXJ0eVNlbGVjdCA9IDB4MDEwNQora01vdmllTWVkaWFHZXRDaGlsZE1vdmllRGF0YVJlZmVyZW5jZVNlbGVjdCA9IDB4MDEwNgora01vdmllTWVkaWFTZXRDaGlsZE1vdmllRGF0YVJlZmVyZW5jZVNlbGVjdCA9IDB4MDEwNwora01vdmllTWVkaWFMb2FkQ2hpbGRNb3ZpZUZyb21EYXRhUmVmZXJlbmNlU2VsZWN0ID0gMHgwMTA4CitrTWVkaWEzREdldE5hbWVkT2JqZWN0TGlzdFNlbGVjdCA9IDB4MDEwMQora01lZGlhM0RHZXRSZW5kZXJlckxpc3RTZWxlY3QgPSAweDAxMDIKK2tNZWRpYTNER2V0Q3VycmVudEdyb3VwU2VsZWN0ID0gMHgwMTAzCitrTWVkaWEzRFRyYW5zbGF0ZU5hbWVkT2JqZWN0VG9TZWxlY3QgPSAweDAxMDQKK2tNZWRpYTNEU2NhbGVOYW1lZE9iamVjdFRvU2VsZWN0ID0gMHgwMTA1CitrTWVkaWEzRFJvdGF0ZU5hbWVkT2JqZWN0VG9TZWxlY3QgPSAweDAxMDYKK2tNZWRpYTNEU2V0Q2FtZXJhRGF0YVNlbGVjdCA9IDB4MDEwNwora01lZGlhM0RHZXRDYW1lcmFEYXRhU2VsZWN0ID0gMHgwMTA4CitrTWVkaWEzRFNldENhbWVyYUFuZ2xlQXNwZWN0U2VsZWN0ID0gMHgwMTA5CitrTWVkaWEzREdldENhbWVyYUFuZ2xlQXNwZWN0U2VsZWN0ID0gMHgwMTBBCitrTWVkaWEzRFNldENhbWVyYVJhbmdlU2VsZWN0ID0gMHgwMTBECitrTWVkaWEzREdldENhbWVyYVJhbmdlU2VsZWN0ID0gMHgwMTBFCitrTWVkaWEzREdldFZpZXdPYmplY3RTZWxlY3QgPSAweDAxMEYKK2tNQ1NldE1vdmllU2VsZWN0ID0gMHgwMDAyCitrTUNHZXRJbmRNb3ZpZVNlbGVjdCA9IDB4MDAwNQora01DUmVtb3ZlQWxsTW92aWVzU2VsZWN0ID0gMHgwMDA2CitrTUNSZW1vdmVBTW92aWVTZWxlY3QgPSAweDAwMDMKK2tNQ1JlbW92ZU1vdmllU2VsZWN0ID0gMHgwMDA2CitrTUNJc1BsYXllckV2ZW50U2VsZWN0ID0gMHgwMDA3CitrTUNTZXRBY3Rpb25GaWx0ZXJTZWxlY3QgPSAweDAwMDgKK2tNQ0RvQWN0aW9uU2VsZWN0ID0gMHgwMDA5CitrTUNTZXRDb250cm9sbGVyQXR0YWNoZWRTZWxlY3QgPSAweDAwMEEKK2tNQ0lzQ29udHJvbGxlckF0dGFjaGVkU2VsZWN0ID0gMHgwMDBCCitrTUNTZXRDb250cm9sbGVyUG9ydFNlbGVjdCA9IDB4MDAwQwora01DR2V0Q29udHJvbGxlclBvcnRTZWxlY3QgPSAweDAwMEQKK2tNQ1NldFZpc2libGVTZWxlY3QgPSAweDAwMEUKK2tNQ0dldFZpc2libGVTZWxlY3QgPSAweDAwMEYKK2tNQ0dldENvbnRyb2xsZXJCb3VuZHNSZWN0U2VsZWN0ID0gMHgwMDEwCitrTUNTZXRDb250cm9sbGVyQm91bmRzUmVjdFNlbGVjdCA9IDB4MDAxMQora01DR2V0Q29udHJvbGxlckJvdW5kc1JnblNlbGVjdCA9IDB4MDAxMgora01DR2V0V2luZG93UmduU2VsZWN0ID0gMHgwMDEzCitrTUNNb3ZpZUNoYW5nZWRTZWxlY3QgPSAweDAwMTQKK2tNQ1NldER1cmF0aW9uU2VsZWN0ID0gMHgwMDE1CitrTUNHZXRDdXJyZW50VGltZVNlbGVjdCA9IDB4MDAxNgora01DTmV3QXR0YWNoZWRDb250cm9sbGVyU2VsZWN0ID0gMHgwMDE3CitrTUNEcmF3U2VsZWN0ID0gMHgwMDE4CitrTUNBY3RpdmF0ZVNlbGVjdCA9IDB4MDAxOQora01DSWRsZVNlbGVjdCA9IDB4MDAxQQora01DS2V5U2VsZWN0ID0gMHgwMDFCCitrTUNDbGlja1NlbGVjdCA9IDB4MDAxQwora01DRW5hYmxlRWRpdGluZ1NlbGVjdCA9IDB4MDAxRAora01DSXNFZGl0aW5nRW5hYmxlZFNlbGVjdCA9IDB4MDAxRQora01DQ29weVNlbGVjdCA9IDB4MDAxRgora01DQ3V0U2VsZWN0ID0gMHgwMDIwCitrTUNQYXN0ZVNlbGVjdCA9IDB4MDAyMQora01DQ2xlYXJTZWxlY3QgPSAweDAwMjIKK2tNQ1VuZG9TZWxlY3QgPSAweDAwMjMKK2tNQ1Bvc2l0aW9uQ29udHJvbGxlclNlbGVjdCA9IDB4MDAyNAora01DR2V0Q29udHJvbGxlckluZm9TZWxlY3QgPSAweDAwMjUKK2tNQ1NldENsaXBTZWxlY3QgPSAweDAwMjgKK2tNQ0dldENsaXBTZWxlY3QgPSAweDAwMjkKK2tNQ0RyYXdCYWRnZVNlbGVjdCA9IDB4MDAyQQora01DU2V0VXBFZGl0TWVudVNlbGVjdCA9IDB4MDAyQgora01DR2V0TWVudVN0cmluZ1NlbGVjdCA9IDB4MDAyQwora01DU2V0QWN0aW9uRmlsdGVyV2l0aFJlZkNvblNlbGVjdCA9IDB4MDAyRAora01DUHRJbkNvbnRyb2xsZXJTZWxlY3QgPSAweDAwMkUKK2tNQ0ludmFsaWRhdGVTZWxlY3QgPSAweDAwMkYKK2tNQ0FkanVzdEN1cnNvclNlbGVjdCA9IDB4MDAzMAora01DR2V0SW50ZXJmYWNlRWxlbWVudFNlbGVjdCA9IDB4MDAzMQora01DR2V0RG9BY3Rpb25zUHJvY1NlbGVjdCA9IDB4MDAzMgora01DQWRkTW92aWVTZWdtZW50U2VsZWN0ID0gMHgwMDMzCitrTUNUcmltTW92aWVTZWdtZW50U2VsZWN0ID0gMHgwMDM0CitrTUNTZXRJZGxlTWFuYWdlclNlbGVjdCA9IDB4MDAzNQora01DU2V0Q29udHJvbGxlckNhcGFiaWxpdGllc1NlbGVjdCA9IDB4MDAzNgora011c2ljTWVkaWFHZXRJbmRleGVkVHVuZVBsYXllclNlbGVjdCA9IDB4MDEwMQora1Jhd0NvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdyYXcgJykKK2tDaW5lcGFrQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2N2aWQnKQora0dyYXBoaWNzQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NtYyAnKQora0FuaW1hdGlvbkNvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdybGUgJykKK2tWaWRlb0NvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdycHphJykKK2tDb21wb25lbnRWaWRlb0NvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd5dXYyJykKK2tKUEVHQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2pwZWcnKQora01vdGlvbkpQRUdBQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ21qcGEnKQora01vdGlvbkpQRUdCQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ21qcGInKQora1NHSUNvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCcuU0dJJykKK2tQbGFuYXJSR0JDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnOEJQUycpCitrTWFjUGFpbnRDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnUE5URycpCitrR0lGQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2dpZiAnKQora1Bob3RvQ0RDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgna3BjZCcpCitrUXVpY2tEcmF3R1hDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgncWRneCcpCitrQVZSSlBFR0NvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhdnIgJykKK2tPcGVuRE1MSlBFR0NvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkbWIxJykKK2tCTVBDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnV1JMRScpCitrV2luZG93c1Jhd0NvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdXUkFXJykKK2tWZWN0b3JDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgncGF0aCcpCitrUXVpY2tEcmF3Q29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3FkcncnKQora1dhdGVyUmlwcGxlQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3JpcGwnKQora0ZpcmVDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZmlyZScpCitrQ2xvdWRDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY2xvdScpCitrSDI2MUNvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdoMjYxJykKK2tIMjYzQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2gyNjMnKQora0RWQ05UU0NDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZHZjICcpCitrRFZDUEFMQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2R2Y3AnKQora0RWQ1Byb1BBTENvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkdnBwJykKK2tCYXNlQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Jhc2UnKQora0ZMQ0NvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdmbGljJykKK2tUYXJnYUNvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0Z2EgJykKK2tQTkdDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgncG5nICcpCitrVElGRkNvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0aWZmJykKK2tDb21wb25lbnRWaWRlb1NpZ25lZCA9IEZPVVJfQ0hBUl9DT0RFKCd5dXZ1JykKK2tDb21wb25lbnRWaWRlb1Vuc2lnbmVkID0gRk9VUl9DSEFSX0NPREUoJ3l1dnMnKQora0NNWUtDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY215aycpCitrTWljcm9zb2Z0VmlkZW8xQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ21zdmMnKQora1NvcmVuc29uQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ1NWUTEnKQora1NvcmVuc29uM0NvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdTVlEzJykKK2tJbmRlbzRDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnSVY0MScpCitrTVBFRzRWaXN1YWxDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbXA0dicpCitrNjRBUkdCQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2I2NGEnKQorazQ4UkdCQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2I0OHInKQorazMyQWxwaGFHcmF5Q29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2IzMmEnKQorazE2R3JheUNvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdiMTZnJykKK2tNcGVnWVVWNDIwQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ215dXYnKQora1lVVjQyMENvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd5NDIwJykKK2tTb3JlbnNvbllVVjlDb2RlY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3l2OScpCitrNDIyWXBDYkNyOENvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCcydnV5JykKK2s0NDRZcENiQ3I4Q29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3YzMDgnKQorazQ0NDRZcENiQ3JBOENvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd2NDA4JykKK2s0MjJZcENiQ3IxNkNvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd2MjE2JykKK2s0MjJZcENiQ3IxMENvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd2MjEwJykKK2s0NDRZcENiQ3IxMENvZGVjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd2NDEwJykKK2s0NDQ0WXBDYkNyQThSQ29kZWNUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3I0MDgnKQora0JsdXJJbWFnZUZpbHRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYmx1cicpCitrU2hhcnBlbkltYWdlRmlsdGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzaHJwJykKK2tFZGdlRGV0ZWN0SW1hZ2VGaWx0ZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2VkZ2UnKQora0VtYm9zc0ltYWdlRmlsdGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdlbWJzJykKK2tDb252b2x2ZUltYWdlRmlsdGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdnZW5rJykKK2tBbHBoYUdhaW5JbWFnZUZpbHRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZ2FpbicpCitrUkdCQ29sb3JCYWxhbmNlSW1hZ2VGaWx0ZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3JnYmInKQora0hTTENvbG9yQmFsYW5jZUltYWdlRmlsdGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdoc2xiJykKK2tDb2xvclN5bmNJbWFnZUZpbHRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3luYycpCitrRmlsbU5vaXNlSW1hZ2VGaWx0ZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2ZtbnMnKQora1NvbGFyaXplSW1hZ2VGaWx0ZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NvbHInKQora0NvbG9yVGludEltYWdlRmlsdGVyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0aW50JykKK2tMZW5zRmxhcmVJbWFnZUZpbHRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbGVucycpCitrQnJpZ2h0bmVzc0NvbnRyYXN0SW1hZ2VGaWx0ZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2JyY28nKQora0FscGhhQ29tcG9zaXRvclRyYW5zaXRpb25UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2JsbmQnKQora0Nyb3NzRmFkZVRyYW5zaXRpb25UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2RzbHYnKQora0NoYW5uZWxDb21wb3NpdGVFZmZlY3RUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2NoYW4nKQora0Nocm9tYUtleVRyYW5zaXRpb25UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2NrZXknKQora0ltcGxvZGVUcmFuc2l0aW9uVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtcGxvJykKK2tFeHBsb2RlVHJhbnNpdGlvblR5cGUgPSBGT1VSX0NIQVJfQ09ERSgneHBsbycpCitrR3JhZGllbnRUcmFuc2l0aW9uVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtYXR0JykKK2tQdXNoVHJhbnNpdGlvblR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncHVzaCcpCitrU2xpZGVUcmFuc2l0aW9uVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzbGlkJykKK2tXaXBlVHJhbnNpdGlvblR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc21wdCcpCitrSXJpc1RyYW5zaXRpb25UeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NtcDInKQora1JhZGlhbFRyYW5zaXRpb25UeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NtcDMnKQora01hdHJpeFRyYW5zaXRpb25UeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NtcDQnKQora1pvb21UcmFuc2l0aW9uVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd6b29tJykKK2tUcmF2ZWxsaW5nTWF0dGVFZmZlY3RUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RyYXYnKQora0NNWUtQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdjbXlrJykKK2s2NEFSR0JQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdiNjRhJykKK2s0OFJHQlBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ2I0OHInKQorazMyQWxwaGFHcmF5UGl4ZWxGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnYjMyYScpCitrMTZHcmF5UGl4ZWxGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnYjE2ZycpCitrNDIyWXBDYkNyOFBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJzJ2dXknKQorazQ0NDRZcENiQ3JBOFBpeGVsRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ3Y0MDgnKQorazQ0NDRZcENiQ3JBOFJQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdyNDA4JykKK2tZVVY0MjBQaXhlbEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCd5NDIwJykKK2NvZGVjSW5mb0RvZXMxID0gKDFMIDw8IDApCitjb2RlY0luZm9Eb2VzMiA9ICgxTCA8PCAxKQorY29kZWNJbmZvRG9lczQgPSAoMUwgPDwgMikKK2NvZGVjSW5mb0RvZXM4ID0gKDFMIDw8IDMpCitjb2RlY0luZm9Eb2VzMTYgPSAoMUwgPDwgNCkKK2NvZGVjSW5mb0RvZXMzMiA9ICgxTCA8PCA1KQorY29kZWNJbmZvRG9lc0RpdGhlciA9ICgxTCA8PCA2KQorY29kZWNJbmZvRG9lc1N0cmV0Y2ggPSAoMUwgPDwgNykKK2NvZGVjSW5mb0RvZXNTaHJpbmsgPSAoMUwgPDwgOCkKK2NvZGVjSW5mb0RvZXNNYXNrID0gKDFMIDw8IDkpCitjb2RlY0luZm9Eb2VzVGVtcG9yYWwgPSAoMUwgPDwgMTApCitjb2RlY0luZm9Eb2VzRG91YmxlID0gKDFMIDw8IDExKQorY29kZWNJbmZvRG9lc1F1YWQgPSAoMUwgPDwgMTIpCitjb2RlY0luZm9Eb2VzSGFsZiA9ICgxTCA8PCAxMykKK2NvZGVjSW5mb0RvZXNRdWFydGVyID0gKDFMIDw8IDE0KQorY29kZWNJbmZvRG9lc1JvdGF0ZSA9ICgxTCA8PCAxNSkKK2NvZGVjSW5mb0RvZXNIb3JpekZsaXAgPSAoMUwgPDwgMTYpCitjb2RlY0luZm9Eb2VzVmVydEZsaXAgPSAoMUwgPDwgMTcpCitjb2RlY0luZm9IYXNFZmZlY3RQYXJhbWV0ZXJMaXN0ID0gKDFMIDw8IDE4KQorY29kZWNJbmZvRG9lc0JsZW5kID0gKDFMIDw8IDE5KQorY29kZWNJbmZvRG9lc1dhcnAgPSAoMUwgPDwgMjApCitjb2RlY0luZm9Eb2VzUmVjb21wcmVzcyA9ICgxTCA8PCAyMSkKK2NvZGVjSW5mb0RvZXNTcG9vbCA9ICgxTCA8PCAyMikKK2NvZGVjSW5mb0RvZXNSYXRlQ29uc3RyYWluID0gKDFMIDw8IDIzKQorY29kZWNJbmZvRGVwdGgxID0gKDFMIDw8IDApCitjb2RlY0luZm9EZXB0aDIgPSAoMUwgPDwgMSkKK2NvZGVjSW5mb0RlcHRoNCA9ICgxTCA8PCAyKQorY29kZWNJbmZvRGVwdGg4ID0gKDFMIDw8IDMpCitjb2RlY0luZm9EZXB0aDE2ID0gKDFMIDw8IDQpCitjb2RlY0luZm9EZXB0aDMyID0gKDFMIDw8IDUpCitjb2RlY0luZm9EZXB0aDI0ID0gKDFMIDw8IDYpCitjb2RlY0luZm9EZXB0aDMzID0gKDFMIDw8IDcpCitjb2RlY0luZm9EZXB0aDM0ID0gKDFMIDw8IDgpCitjb2RlY0luZm9EZXB0aDM2ID0gKDFMIDw8IDkpCitjb2RlY0luZm9EZXB0aDQwID0gKDFMIDw8IDEwKQorY29kZWNJbmZvU3RvcmVzQ2x1dCA9ICgxTCA8PCAxMSkKK2NvZGVjSW5mb0RvZXNMb3NzbGVzcyA9ICgxTCA8PCAxMikKK2NvZGVjSW5mb1NlcXVlbmNlU2Vuc2l0aXZlID0gKDFMIDw8IDEzKQorY29kZWNGbGFnVXNlSW1hZ2VCdWZmZXIgPSAoMUwgPDwgMCkKK2NvZGVjRmxhZ1VzZVNjcmVlbkJ1ZmZlciA9ICgxTCA8PCAxKQorY29kZWNGbGFnVXBkYXRlUHJldmlvdXMgPSAoMUwgPDwgMikKK2NvZGVjRmxhZ05vU2NyZWVuVXBkYXRlID0gKDFMIDw8IDMpCitjb2RlY0ZsYWdXYXNDb21wcmVzc2VkID0gKDFMIDw8IDQpCitjb2RlY0ZsYWdEb250T2Zmc2NyZWVuID0gKDFMIDw8IDUpCitjb2RlY0ZsYWdVcGRhdGVQcmV2aW91c0NvbXAgPSAoMUwgPDwgNikKK2NvZGVjRmxhZ0ZvcmNlS2V5RnJhbWUgPSAoMUwgPDwgNykKK2NvZGVjRmxhZ09ubHlTY3JlZW5VcGRhdGUgPSAoMUwgPDwgOCkKK2NvZGVjRmxhZ0xpdmVHcmFiID0gKDFMIDw8IDkpCitjb2RlY0ZsYWdEaWZmRnJhbWUgPSAoMUwgPDwgOSkKK2NvZGVjRmxhZ0RvbnRVc2VOZXdJbWFnZUJ1ZmZlciA9ICgxTCA8PCAxMCkKK2NvZGVjRmxhZ0ludGVybGFjZVVwZGF0ZSA9ICgxTCA8PCAxMSkKK2NvZGVjRmxhZ0NhdGNoVXBEaWZmID0gKDFMIDw8IDEyKQorY29kZWNGbGFnU3VwcG9ydERpc2FibGUgPSAoMUwgPDwgMTMpCitjb2RlY0ZsYWdSZWVuYWJsZSA9ICgxTCA8PCAxNCkKK2NvZGVjRmxhZ091dFVwZGF0ZU9uTmV4dElkbGUgPSAoMUwgPDwgOSkKK2NvZGVjRmxhZ091dFVwZGF0ZU9uRGF0YVNvdXJjZUNoYW5nZSA9ICgxTCA8PCAxMCkKK2NvZGVjRmxhZ1NlcXVlbmNlU2Vuc2l0aXZlID0gKDFMIDw8IDExKQorY29kZWNGbGFnT3V0VXBkYXRlT25UaW1lQ2hhbmdlID0gKDFMIDw8IDEyKQorY29kZWNGbGFnSW1hZ2VCdWZmZXJOb3RTb3VyY2VJbWFnZSA9ICgxTCA8PCAxMykKK2NvZGVjRmxhZ1VzZWROZXdJbWFnZUJ1ZmZlciA9ICgxTCA8PCAxNCkKK2NvZGVjRmxhZ1VzZWRJbWFnZUJ1ZmZlciA9ICgxTCA8PCAxNSkKK2NvZGVjTWluaW11bURhdGFTaXplID0gMzI3NjhMCitjb21wcmVzc29yQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbWNvJykKK2RlY29tcHJlc3NvckNvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnaW1kYycpCitjb2RlY0xvc3NsZXNzUXVhbGl0eSA9IDB4MDAwMDA0MDAKK2NvZGVjTWF4UXVhbGl0eSA9IDB4MDAwMDAzRkYKK2NvZGVjTWluUXVhbGl0eSA9IDB4MDAwMDAwMDAKK2NvZGVjTG93UXVhbGl0eSA9IDB4MDAwMDAxMDAKK2NvZGVjTm9ybWFsUXVhbGl0eSA9IDB4MDAwMDAyMDAKK2NvZGVjSGlnaFF1YWxpdHkgPSAweDAwMDAwMzAwCitjb2RlY0xvY2tCaXRzU2hpZWxkQ3Vyc29yID0gKDEgPDwgMCkKK2NvZGVjQ29tcGxldGlvblNvdXJjZSA9ICgxIDw8IDApCitjb2RlY0NvbXBsZXRpb25EZXN0ID0gKDEgPDwgMSkKK2NvZGVjQ29tcGxldGlvbkRvbnRVbnNoaWVsZCA9ICgxIDw8IDIpCitjb2RlY0NvbXBsZXRpb25XZW50T2Zmc2NyZWVuID0gKDEgPDwgMykKK2NvZGVjQ29tcGxldGlvblVubG9ja0JpdHMgPSAoMSA8PCA0KQorY29kZWNDb21wbGV0aW9uRm9yY2VDaGFpbkZsdXNoID0gKDEgPDwgNSkKK2NvZGVjQ29tcGxldGlvbkRyb3BwZWQgPSAoMSA8PCA2KQorY29kZWNQcm9ncmVzc09wZW4gPSAwCitjb2RlY1Byb2dyZXNzVXBkYXRlUGVyY2VudCA9IDEKK2NvZGVjUHJvZ3Jlc3NDbG9zZSA9IDIKK2RlZmF1bHREaXRoZXIgPSAwCitmb3JjZURpdGhlciA9IDEKK3N1cHByZXNzRGl0aGVyID0gMgordXNlQ29sb3JNYXRjaGluZyA9IDQKK2NhbGxTdGRCaXRzID0gMQorY2FsbE9sZEJpdHMgPSAyCitub0RlZmF1bHRPcGNvZGVzID0gNAorZ3JhcGhpY3NNb2RlU3RyYWlnaHRBbHBoYSA9IDI1NgorZ3JhcGhpY3NNb2RlUHJlV2hpdGVBbHBoYSA9IDI1NworZ3JhcGhpY3NNb2RlUHJlQmxhY2tBbHBoYSA9IDI1OAorZ3JhcGhpY3NNb2RlQ29tcG9zaXRpb24gPSAyNTkKK2dyYXBoaWNzTW9kZVN0cmFpZ2h0QWxwaGFCbGVuZCA9IDI2MAorZ3JhcGhpY3NNb2RlUHJlTXVsQ29sb3JBbHBoYSA9IDI2MQorZXZlbkZpZWxkMVRvRXZlbkZpZWxkT3V0ID0gMSA8PCAwCitldmVuRmllbGQxVG9PZGRGaWVsZE91dCA9IDEgPDwgMQorb2RkRmllbGQxVG9FdmVuRmllbGRPdXQgPSAxIDw8IDIKK29kZEZpZWxkMVRvT2RkRmllbGRPdXQgPSAxIDw8IDMKK2V2ZW5GaWVsZDJUb0V2ZW5GaWVsZE91dCA9IDEgPDwgNAorZXZlbkZpZWxkMlRvT2RkRmllbGRPdXQgPSAxIDw8IDUKK29kZEZpZWxkMlRvRXZlbkZpZWxkT3V0ID0gMSA8PCA2CitvZGRGaWVsZDJUb09kZEZpZWxkT3V0ID0gMSA8PCA3CitpY21GcmFtZVRpbWVIYXNWaXJ0dWFsU3RhcnRUaW1lQW5kRHVyYXRpb24gPSAxIDw8IDAKK2NvZGVjRFNlcXVlbmNlRGlzYWJsZU92ZXJsYXlTdXJmYWNlID0gKDFMIDw8IDUpCitjb2RlY0RTZXF1ZW5jZVNpbmdsZUZpZWxkID0gKDFMIDw8IDYpCitjb2RlY0RTZXF1ZW5jZUJpZGlyZWN0aW9uYWxQcmVkaWN0aW9uID0gKDFMIDw8IDcpCitjb2RlY0RTZXF1ZW5jZUZsdXNoSW5zdGVhZE9mRGlydHlpbmcgPSAoMUwgPDwgOCkKK2NvZGVjRFNlcXVlbmNlRW5hYmxlU3ViUGl4ZWxQb3NpdGlvbmluZyA9ICgxTCA8PCA5KQora0lDTVNlcXVlbmNlVGFza1dlaWdodCA9IEZPVVJfQ0hBUl9DT0RFKCd0d2VpJykKK2tJQ01TZXF1ZW5jZVRhc2tOYW1lID0gRk9VUl9DSEFSX0NPREUoJ3RuYW0nKQora0lDTVNlcXVlbmNlVXNlclByZWZlcnJlZENvZGVjcyA9IEZPVVJfQ0hBUl9DT0RFKCdwdW50JykKK2tJbWFnZURlc2NyaXB0aW9uU2FtcGxlRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ2lkZm0nKQora0ltYWdlRGVzY3JpcHRpb25DbGFzc2ljQXRvbUZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdhdG9tJykKK2tJbWFnZURlc2NyaXB0aW9uUVRBdG9tRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ3F0YXQnKQora0ltYWdlRGVzY3JpcHRpb25FZmZlY3REYXRhRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ2Z4YXQnKQora0ltYWdlRGVzY3JpcHRpb25Qcml2YXRlRGF0YUZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdwcml2JykKK2tJbWFnZURlc2NyaXB0aW9uQWx0ZXJuYXRlQ29kZWMgPSBGT1VSX0NIQVJfQ09ERSgnc3VicycpCitrSW1hZ2VEZXNjcmlwdGlvbkNvbG9yU3BhY2UgPSBGT1VSX0NIQVJfQ09ERSgnY3NwYycpCitzZnBJdGVtUHJldmlld0FyZWFVc2VyID0gMTEKK3NmcEl0ZW1QcmV2aWV3U3RhdGljVGV4dCA9IDEyCitzZnBJdGVtUHJldmlld0RpdmlkZXJVc2VyID0gMTMKK3NmcEl0ZW1DcmVhdGVQcmV2aWV3QnV0dG9uID0gMTQKK3NmcEl0ZW1TaG93UHJldmlld0J1dHRvbiA9IDE1CitrSUNNUGl4ZWxGb3JtYXRJc1BsYW5hck1hc2sgPSAweDBGCitrSUNNUGl4ZWxGb3JtYXRJc0luZGV4ZWQgPSAoMUwgPDwgNCkKK2tJQ01QaXhlbEZvcm1hdElzU3VwcG9ydGVkQnlRRCA9ICgxTCA8PCA1KQora0lDTVBpeGVsRm9ybWF0SXNNb25vY2hyb21lID0gKDFMIDw8IDYpCitrSUNNUGl4ZWxGb3JtYXRIYXNBbHBoYUNoYW5uZWwgPSAoMUwgPDwgNykKK2tJQ01HZXRDaGFpblVsdGltYXRlUGFyZW50ID0gMAora0lDTUdldENoYWluUGFyZW50ID0gMQora0lDTUdldENoYWluQ2hpbGQgPSAyCitrSUNNR2V0Q2hhaW5VbHRpbWF0ZUNoaWxkID0gMwora0RvbnRVc2VWYWxpZGF0ZVRvRmluZEdyYXBoaWNzSW1wb3J0ZXIgPSAxTCA8PCAwCitrSUNNVGVtcFRoZW5BcHBNZW1vcnkgPSAxTCA8PCAxMgora0lDTUFwcFRoZW5UZW1wTWVtb3J5ID0gMUwgPDwgMTMKK2tRVFVzZVBsYXRmb3JtRGVmYXVsdEdhbW1hTGV2ZWwgPSAwCitrUVRVc2VTb3VyY2VHYW1tYUxldmVsID0gLTFMCitrUVRDQ0lSNjAxVmlkZW9HYW1tYUxldmVsID0gMHgwMDAyMzMzMworaWRlbnRpdHlNYXRyaXhUeXBlID0gMHgwMAordHJhbnNsYXRlTWF0cml4VHlwZSA9IDB4MDEKK3NjYWxlTWF0cml4VHlwZSA9IDB4MDIKK3NjYWxlVHJhbnNsYXRlTWF0cml4VHlwZSA9IDB4MDMKK2xpbmVhck1hdHJpeFR5cGUgPSAweDA0CitsaW5lYXJUcmFuc2xhdGVNYXRyaXhUeXBlID0gMHgwNQorcGVyc3BlY3RpdmVNYXRyaXhUeXBlID0gMHgwNgorR3JhcGhpY3NJbXBvcnRlckNvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZ3JpcCcpCitncmFwaGljc0ltcG9ydGVyVXNlc0ltYWdlRGVjb21wcmVzc29yID0gMUwgPDwgMjMKK3F1aWNrVGltZUltYWdlRmlsZUltYWdlRGVzY3JpcHRpb25BdG9tID0gRk9VUl9DSEFSX0NPREUoJ2lkc2MnKQorcXVpY2tUaW1lSW1hZ2VGaWxlSW1hZ2VEYXRhQXRvbSA9IEZPVVJfQ0hBUl9DT0RFKCdpZGF0JykKK3F1aWNrVGltZUltYWdlRmlsZU1ldGFEYXRhQXRvbSA9IEZPVVJfQ0hBUl9DT0RFKCdtZXRhJykKK3F1aWNrVGltZUltYWdlRmlsZUNvbG9yU3luY1Byb2ZpbGVBdG9tID0gRk9VUl9DSEFSX0NPREUoJ2lpY2MnKQorZ3JhcGhpY3NJbXBvcnRlckRyYXdzQWxsUGl4ZWxzID0gMAorZ3JhcGhpY3NJbXBvcnRlckRvZXNudERyYXdBbGxQaXhlbHMgPSAxCitncmFwaGljc0ltcG9ydGVyRG9udEtub3dJZkRyYXdBbGxQaXhlbHMgPSAyCitrR3JhcGhpY3NJbXBvcnRlckRvbnREb0dhbW1hQ29ycmVjdGlvbiA9IDFMIDw8IDAKK2tHcmFwaGljc0ltcG9ydGVyVHJ1c3RSZXNvbHV0aW9uRnJvbUZpbGUgPSAxTCA8PCAxCitrR3JhcGhpY3NJbXBvcnRlckVuYWJsZVN1YlBpeGVsUG9zaXRpb25pbmcgPSAxTCA8PCAyCitrR3JhcGhpY3NFeHBvcnRHcm91cCA9IEZPVVJfQ0hBUl9DT0RFKCdleHBvJykKK2tHcmFwaGljc0V4cG9ydEZpbGVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Z0eXAnKQora0dyYXBoaWNzRXhwb3J0TUlNRVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbWltZScpCitrR3JhcGhpY3NFeHBvcnRFeHRlbnNpb24gPSBGT1VSX0NIQVJfQ09ERSgnZXh0ICcpCitrR3JhcGhpY3NFeHBvcnREZXNjcmlwdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdkZXNjJykKK2tRVFBob3Rvc2hvcExheWVyTW9kZSA9IEZPVVJfQ0hBUl9DT0RFKCdsbW9kJykKK2tRVFBob3Rvc2hvcExheWVyT3BhY2l0eSA9IEZPVVJfQ0hBUl9DT0RFKCdsb3BhJykKK2tRVFBob3Rvc2hvcExheWVyQ2xpcHBpbmcgPSBGT1VSX0NIQVJfQ09ERSgnbGNscCcpCitrUVRQaG90b3Nob3BMYXllckZsYWdzID0gRk9VUl9DSEFSX0NPREUoJ2xmbGcnKQora1FUUGhvdG9zaG9wTGF5ZXJOYW1lID0gRk9VUl9DSEFSX0NPREUoJ1x4YTlsbm0nKQora1FUUGhvdG9zaG9wTGF5ZXJVbmljb2RlTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCdsdW5pJykKK2tRVEluZGV4ZWRJbWFnZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbnRoPycpCitrUVRJbmRleGVkSW1hZ2VJc1RodW1ibmFpbCA9IEZPVVJfQ0hBUl9DT0RFKCduPXRoJykKK2tRVEluZGV4ZWRJbWFnZUlzTGF5ZXIgPSBGT1VSX0NIQVJfQ09ERSgnbj1seScpCitrUVRJbmRleGVkSW1hZ2VJc1BhZ2UgPSBGT1VSX0NIQVJfQ09ERSgnbj1wZycpCitrUVRJbmRleGVkSW1hZ2VJc011bHRpUmVzb2x1dGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCduPXJzJykKK2tRVFRJRkZVc2VyRGF0YVByZWZpeCA9IDB4NzQ2OTAwMDAKK2tRVFRJRkZFeGlmVXNlckRhdGFQcmVmaXggPSAweDY1NzgwMDAwCitrUVRUSUZGRXhpZkdQU1VzZXJEYXRhUHJlZml4ID0gMHg2NzcwMDAwMAora1FUQWxwaGFNb2RlID0gRk9VUl9DSEFSX0NPREUoJ2FsbW8nKQora1FUQWxwaGFNb2RlUHJlTXVsQ29sb3IgPSBGT1VSX0NIQVJfQ09ERSgnYWxtcCcpCitrVXNlckRhdGFJUFRDID0gRk9VUl9DSEFSX0NPREUoJ2lwdGMnKQora1FUVElGRlVzZXJEYXRhT3JpZW50YXRpb24gPSAweDc0NjkwMTEyCitrUVRUSUZGVXNlckRhdGFUcmFuc2ZlckZ1bmN0aW9uID0gMHg3NDY5MDEyRAora1FUVElGRlVzZXJEYXRhV2hpdGVQb2ludCA9IDB4NzQ2OTAxM0UKK2tRVFRJRkZVc2VyRGF0YVByaW1hcnlDaHJvbWF0aWNpdGllcyA9IDB4NzQ2OTAxM0YKK2tRVFRJRkZVc2VyRGF0YVRyYW5zZmVyUmFuZ2UgPSAweDc0NjkwMTU2CitrUVRUSUZGVXNlckRhdGFZQ2JDclBvc2l0aW9uaW5nID0gMHg3NDY5MDIxMwora1FUVElGRlVzZXJEYXRhUmVmZXJlbmNlQmxhY2tXaGl0ZSA9IDB4NzQ2OTAyMTQKK2tRVFRJRkZVc2VyRGF0YU1vZGVsUGl4ZWxTY2FsZSA9IDB4NzQ2OTgzMEUKK2tRVFRJRkZVc2VyRGF0YU1vZGVsVHJhbnNmb3JtYXRpb24gPSAweDc0Njk4NUQ4CitrUVRUSUZGVXNlckRhdGFNb2RlbFRpZXBvaW50ID0gMHg3NDY5ODQ4Mgora1FUVElGRlVzZXJEYXRhR2VvS2V5RGlyZWN0b3J5ID0gMHg3NDY5ODdBRgora1FUVElGRlVzZXJEYXRhR2VvRG91YmxlUGFyYW1zID0gMHg3NDY5ODdCMAora1FUVElGRlVzZXJEYXRhR2VvQXNjaWlQYXJhbXMgPSAweDc0Njk4N0IxCitrUVRUSUZGVXNlckRhdGFJbnRlcmdyYXBoTWF0cml4ID0gMHg3NDY5ODQ4MAora1FURXhpZlVzZXJEYXRhRXhpZlZlcnNpb24gPSAweDY1Nzg5MDAwCitrUVRFeGlmVXNlckRhdGFGbGFzaFBpeFZlcnNpb24gPSAweDY1NzhBMDAwCitrUVRFeGlmVXNlckRhdGFDb2xvclNwYWNlID0gMHg2NTc4QTAwMQora1FURXhpZlVzZXJEYXRhQ29tcG9uZW50c0NvbmZpZ3VyYXRpb24gPSAweDY1Nzg5MTAxCitrUVRFeGlmVXNlckRhdGFDb21wcmVzc2VkQml0c1BlclBpeGVsID0gMHg2NTc4OTEwMgora1FURXhpZlVzZXJEYXRhUGl4ZWxYRGltZW5zaW9uID0gMHg2NTc4QTAwMgora1FURXhpZlVzZXJEYXRhUGl4ZWxZRGltZW5zaW9uID0gMHg2NTc4QTAwMwora1FURXhpZlVzZXJEYXRhTWFrZXJOb3RlID0gMHg2NTc4OTI3Qwora1FURXhpZlVzZXJEYXRhVXNlckNvbW1lbnQgPSAweDY1Nzg5MjhDCitrUVRFeGlmVXNlckRhdGFSZWxhdGVkU291bmRGaWxlID0gMHg2NTc4QTAwNAora1FURXhpZlVzZXJEYXRhRGF0ZVRpbWVPcmlnaW5hbCA9IDB4NjU3ODkwMDMKK2tRVEV4aWZVc2VyRGF0YURhdGVUaW1lRGlnaXRpemVkID0gMHg2NTc4OTAwNAora1FURXhpZlVzZXJEYXRhU3ViU2VjVGltZSA9IDB4NjU3ODkyOTAKK2tRVEV4aWZVc2VyRGF0YVN1YlNlY1RpbWVPcmlnaW5hbCA9IDB4NjU3ODkyOTEKK2tRVEV4aWZVc2VyRGF0YVN1YlNlY1RpbWVEaWdpdGl6ZWQgPSAweDY1Nzg5MjkyCitrUVRFeGlmVXNlckRhdGFFeHBvc3VyZVRpbWUgPSAweDY1Nzg4MjlBCitrUVRFeGlmVXNlckRhdGFGTnVtYmVyID0gMHg2NTc4ODI5RAora1FURXhpZlVzZXJEYXRhRXhwb3N1cmVQcm9ncmFtID0gMHg2NTc4ODgyMgora1FURXhpZlVzZXJEYXRhU3BlY3RyYWxTZW5zaXRpdml0eSA9IDB4NjU3ODg4MjQKK2tRVEV4aWZVc2VyRGF0YUlTT1NwZWVkUmF0aW5ncyA9IDB4NjU3ODg4MjcKK2tRVEV4aWZVc2VyRGF0YVNodXR0ZXJTcGVlZFZhbHVlID0gMHg2NTc4OTIwMQora1FURXhpZlVzZXJEYXRhQXBlcnR1cmVWYWx1ZSA9IDB4NjU3ODkyMDIKK2tRVEV4aWZVc2VyRGF0YUJyaWdodG5lc3NWYWx1ZSA9IDB4NjU3ODkyMDMKK2tRVEV4aWZVc2VyRGF0YUV4cG9zdXJlQmlhc1ZhbHVlID0gMHg2NTc4OTIwNAora1FURXhpZlVzZXJEYXRhTWF4QXBlcnR1cmVWYWx1ZSA9IDB4NjU3ODkyMDUKK2tRVEV4aWZVc2VyRGF0YVN1YmplY3REaXN0YW5jZSA9IDB4NjU3ODkyMDYKK2tRVEV4aWZVc2VyRGF0YU1ldGVyaW5nTW9kZSA9IDB4NjU3ODkyMDcKK2tRVEV4aWZVc2VyRGF0YUxpZ2h0U291cmNlID0gMHg2NTc4OTIwOAora1FURXhpZlVzZXJEYXRhRmxhc2ggPSAweDY1Nzg5MjA5CitrUVRFeGlmVXNlckRhdGFGb2NhbExlbmd0aCA9IDB4NjU3ODkyMEEKK2tRVEV4aWZVc2VyRGF0YUZsYXNoRW5lcmd5ID0gMHg2NTc4QTIwQgora1FURXhpZlVzZXJEYXRhRm9jYWxQbGFuZVhSZXNvbHV0aW9uID0gMHg2NTc4QTIwRQora1FURXhpZlVzZXJEYXRhRm9jYWxQbGFuZVlSZXNvbHV0aW9uID0gMHg2NTc4QTIwRgora1FURXhpZlVzZXJEYXRhRm9jYWxQbGFuZVJlc29sdXRpb25Vbml0ID0gMHg2NTc4QTIxMAora1FURXhpZlVzZXJEYXRhU3ViamVjdExvY2F0aW9uID0gMHg2NTc4QTIxNAora1FURXhpZlVzZXJEYXRhRXhwb3N1cmVJbmRleCA9IDB4NjU3OEEyMTUKK2tRVEV4aWZVc2VyRGF0YVNlbnNpbmdNZXRob2QgPSAweDY1NzhBMjE3CitrUVRFeGlmVXNlckRhdGFGaWxlU291cmNlID0gMHg2NTc4QTMwMAora1FURXhpZlVzZXJEYXRhU2NlbmVUeXBlID0gMHg2NTc4QTMwMQora1FURXhpZlVzZXJEYXRhR1BTVmVyc2lvbklEID0gMHgwNjc3MDAwMAora1FURXhpZlVzZXJEYXRhR1BTTGF0aXR1ZGVSZWYgPSAweDA2NzcwMDAxCitrUVRFeGlmVXNlckRhdGFHUFNMYXRpdHVkZSA9IDB4MDY3NzAwMDIKK2tRVEV4aWZVc2VyRGF0YUdQU0xvbmdpdHVkZVJlZiA9IDB4MDY3NzAwMDMKK2tRVEV4aWZVc2VyRGF0YUdQU0xvbmdpdHVkZSA9IDB4MDY3NzAwMDQKK2tRVEV4aWZVc2VyRGF0YUdQU0FsdGl0dWRlUmVmID0gMHgwNjc3MDAwNQora1FURXhpZlVzZXJEYXRhR1BTQWx0aXR1ZGUgPSAweDA2NzcwMDA2CitrUVRFeGlmVXNlckRhdGFHUFNUaW1lU3RhbXAgPSAweDA2NzcwMDA3CitrUVRFeGlmVXNlckRhdGFHUFNTYXRlbGxpdGVzID0gMHgwNjc3MDAwOAora1FURXhpZlVzZXJEYXRhR1BTU3RhdHVzID0gMHgwNjc3MDAwOQora1FURXhpZlVzZXJEYXRhR1BTTWVhc3VyZU1vZGUgPSAweDA2NzcwMDBBCitrUVRFeGlmVXNlckRhdGFHUFNET1AgPSAweDA2NzcwMDBCCitrUVRFeGlmVXNlckRhdGFHUFNTcGVlZFJlZiA9IDB4MDY3NzAwMEMKK2tRVEV4aWZVc2VyRGF0YUdQU1NwZWVkID0gMHgwNjc3MDAwRAora1FURXhpZlVzZXJEYXRhR1BTVHJhY2tSZWYgPSAweDA2NzcwMDBFCitrUVRFeGlmVXNlckRhdGFHUFNUcmFjayA9IDB4MDY3NzAwMEYKK2tRVEV4aWZVc2VyRGF0YUdQU0ltZ0RpcmVjdGlvblJlZiA9IDB4MDY3NzAwMTAKK2tRVEV4aWZVc2VyRGF0YUdQU0ltZ0RpcmVjdGlvbiA9IDB4MDY3NzAwMTEKK2tRVEV4aWZVc2VyRGF0YUdQU01hcERhdHVtID0gMHgwNjc3MDAxMgora1FURXhpZlVzZXJEYXRhR1BTRGVzdExhdGl0dWRlUmVmID0gMHgwNjc3MDAxMwora1FURXhpZlVzZXJEYXRhR1BTRGVzdExhdGl0dWRlID0gMHgwNjc3MDAxNAora1FURXhpZlVzZXJEYXRhR1BTRGVzdExvbmdpdHVkZVJlZiA9IDB4MDY3NzAwMTUKK2tRVEV4aWZVc2VyRGF0YUdQU0Rlc3RMb25naXR1ZGUgPSAweDA2NzcwMDE2CitrUVRFeGlmVXNlckRhdGFHUFNEZXN0QmVhcmluZ1JlZiA9IDB4MDY3NzAwMTcKK2tRVEV4aWZVc2VyRGF0YUdQU0Rlc3RCZWFyaW5nID0gMHgwNjc3MDAxOAora1FURXhpZlVzZXJEYXRhR1BTRGVzdERpc3RhbmNlUmVmID0gMHgwNjc3MDAxOQora1FURXhpZlVzZXJEYXRhR1BTRGVzdERpc3RhbmNlID0gMHgwNjc3MDAxQQorR3JhcGhpY3NFeHBvcnRlckNvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZ3JleCcpCitrQmFzZUdyYXBoaWNzRXhwb3J0ZXJTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Jhc2UnKQorZ3JhcGhpY3NFeHBvcnRlcklzQmFzZUV4cG9ydGVyID0gMUwgPDwgMAorZ3JhcGhpY3NFeHBvcnRlckNhblRyYW5zY29kZSA9IDFMIDw8IDEKK2dyYXBoaWNzRXhwb3J0ZXJVc2VzSW1hZ2VDb21wcmVzc29yID0gMUwgPDwgMgora1FUUmVzb2x1dGlvblNldHRpbmdzID0gRk9VUl9DSEFSX0NPREUoJ3Jlc28nKQora1FUVGFyZ2V0RGF0YVNpemUgPSBGT1VSX0NIQVJfQ09ERSgnZGFzeicpCitrUVREb250UmVjb21wcmVzcyA9IEZPVVJfQ0hBUl9DT0RFKCdkbnRyJykKK2tRVEludGVybGFjZVN0eWxlID0gRk9VUl9DSEFSX0NPREUoJ2lsYWMnKQora1FUQ29sb3JTeW5jUHJvZmlsZSA9IEZPVVJfQ0hBUl9DT0RFKCdpY2NwJykKK2tRVFRodW1ibmFpbFNldHRpbmdzID0gRk9VUl9DSEFSX0NPREUoJ3RodW0nKQora1FURW5hYmxlRXhpZiA9IEZPVVJfQ0hBUl9DT0RFKCdleGlmJykKK2tRVE1ldGFEYXRhID0gRk9VUl9DSEFSX0NPREUoJ21ldGEnKQora1FUVElGRkNvbXByZXNzaW9uTWV0aG9kID0gRk9VUl9DSEFSX0NPREUoJ3RpZmMnKQora1FUVElGRkNvbXByZXNzaW9uX05vbmUgPSAxCitrUVRUSUZGQ29tcHJlc3Npb25fUGFja0JpdHMgPSAzMjc3M0wKK2tRVFRJRkZMaXR0bGVFbmRpYW4gPSBGT1VSX0NIQVJfQ09ERSgndGlmZScpCitrUVRQTkdGaWx0ZXJQcmVmZXJlbmNlID0gRk9VUl9DSEFSX0NPREUoJ3BuZ2YnKQora1FUUE5HRmlsdGVyQmVzdEZvckNvbG9yVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdiZmx0JykKK2tRVFBOR0ZpbHRlck5vbmUgPSAwCitrUVRQTkdGaWx0ZXJTdWIgPSAxCitrUVRQTkdGaWx0ZXJVcCA9IDIKK2tRVFBOR0ZpbHRlckF2ZXJhZ2UgPSAzCitrUVRQTkdGaWx0ZXJQYWV0aCA9IDQKK2tRVFBOR0ZpbHRlckFkYXB0aXZlUGVyUm93ID0gRk9VUl9DSEFSX0NPREUoJ2FmbHQnKQora1FUUE5HSW50ZXJsYWNlU3R5bGUgPSBGT1VSX0NIQVJfQ09ERSgnaWxhYycpCitrUVRQTkdJbnRlcmxhY2VOb25lID0gMAora1FUUE5HSW50ZXJsYWNlQWRhbTcgPSAxCitJbWFnZVRyYW5zY29kZXJlckNvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnaW10YycpCitrR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlU2VsZWN0ID0gMHgwMDAxCitrR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlU2VsZWN0ID0gMHgwMDAyCitrR3JhcGhpY3NJbXBvcnRTZXREYXRhRmlsZVNlbGVjdCA9IDB4MDAwMwora0dyYXBoaWNzSW1wb3J0R2V0RGF0YUZpbGVTZWxlY3QgPSAweDAwMDQKK2tHcmFwaGljc0ltcG9ydFNldERhdGFIYW5kbGVTZWxlY3QgPSAweDAwMDUKK2tHcmFwaGljc0ltcG9ydEdldERhdGFIYW5kbGVTZWxlY3QgPSAweDAwMDYKK2tHcmFwaGljc0ltcG9ydEdldEltYWdlRGVzY3JpcHRpb25TZWxlY3QgPSAweDAwMDcKK2tHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplU2VsZWN0ID0gMHgwMDA4CitrR3JhcGhpY3NJbXBvcnRSZWFkRGF0YVNlbGVjdCA9IDB4MDAwOQora0dyYXBoaWNzSW1wb3J0U2V0Q2xpcFNlbGVjdCA9IDB4MDAwQQora0dyYXBoaWNzSW1wb3J0R2V0Q2xpcFNlbGVjdCA9IDB4MDAwQgora0dyYXBoaWNzSW1wb3J0U2V0U291cmNlUmVjdFNlbGVjdCA9IDB4MDAwQwora0dyYXBoaWNzSW1wb3J0R2V0U291cmNlUmVjdFNlbGVjdCA9IDB4MDAwRAora0dyYXBoaWNzSW1wb3J0R2V0TmF0dXJhbEJvdW5kc1NlbGVjdCA9IDB4MDAwRQora0dyYXBoaWNzSW1wb3J0RHJhd1NlbGVjdCA9IDB4MDAwRgora0dyYXBoaWNzSW1wb3J0U2V0R1dvcmxkU2VsZWN0ID0gMHgwMDEwCitrR3JhcGhpY3NJbXBvcnRHZXRHV29ybGRTZWxlY3QgPSAweDAwMTEKK2tHcmFwaGljc0ltcG9ydFNldE1hdHJpeFNlbGVjdCA9IDB4MDAxMgora0dyYXBoaWNzSW1wb3J0R2V0TWF0cml4U2VsZWN0ID0gMHgwMDEzCitrR3JhcGhpY3NJbXBvcnRTZXRCb3VuZHNSZWN0U2VsZWN0ID0gMHgwMDE0CitrR3JhcGhpY3NJbXBvcnRHZXRCb3VuZHNSZWN0U2VsZWN0ID0gMHgwMDE1CitrR3JhcGhpY3NJbXBvcnRTYXZlQXNQaWN0dXJlU2VsZWN0ID0gMHgwMDE2CitrR3JhcGhpY3NJbXBvcnRTZXRHcmFwaGljc01vZGVTZWxlY3QgPSAweDAwMTcKK2tHcmFwaGljc0ltcG9ydEdldEdyYXBoaWNzTW9kZVNlbGVjdCA9IDB4MDAxOAora0dyYXBoaWNzSW1wb3J0U2V0UXVhbGl0eVNlbGVjdCA9IDB4MDAxOQora0dyYXBoaWNzSW1wb3J0R2V0UXVhbGl0eVNlbGVjdCA9IDB4MDAxQQora0dyYXBoaWNzSW1wb3J0U2F2ZUFzUXVpY2tUaW1lSW1hZ2VGaWxlU2VsZWN0ID0gMHgwMDFCCitrR3JhcGhpY3NJbXBvcnRTZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXRTZWxlY3QgPSAweDAwMUMKK2tHcmFwaGljc0ltcG9ydEdldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdFNlbGVjdCA9IDB4MDAxRAora0dyYXBoaWNzSW1wb3J0R2V0QWxpYXNlZERhdGFSZWZlcmVuY2VTZWxlY3QgPSAweDAwMUUKK2tHcmFwaGljc0ltcG9ydFZhbGlkYXRlU2VsZWN0ID0gMHgwMDFGCitrR3JhcGhpY3NJbXBvcnRHZXRNZXRhRGF0YVNlbGVjdCA9IDB4MDAyMAora0dyYXBoaWNzSW1wb3J0R2V0TUlNRVR5cGVMaXN0U2VsZWN0ID0gMHgwMDIxCitrR3JhcGhpY3NJbXBvcnREb2VzRHJhd0FsbFBpeGVsc1NlbGVjdCA9IDB4MDAyMgora0dyYXBoaWNzSW1wb3J0R2V0QXNQaWN0dXJlU2VsZWN0ID0gMHgwMDIzCitrR3JhcGhpY3NJbXBvcnRFeHBvcnRJbWFnZUZpbGVTZWxlY3QgPSAweDAwMjQKK2tHcmFwaGljc0ltcG9ydEdldEV4cG9ydEltYWdlVHlwZUxpc3RTZWxlY3QgPSAweDAwMjUKK2tHcmFwaGljc0ltcG9ydERvRXhwb3J0SW1hZ2VGaWxlRGlhbG9nU2VsZWN0ID0gMHgwMDI2CitrR3JhcGhpY3NJbXBvcnRHZXRFeHBvcnRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lclNlbGVjdCA9IDB4MDAyNwora0dyYXBoaWNzSW1wb3J0U2V0RXhwb3J0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lclNlbGVjdCA9IDB4MDAyOAora0dyYXBoaWNzSW1wb3J0U2V0UHJvZ3Jlc3NQcm9jU2VsZWN0ID0gMHgwMDI5CitrR3JhcGhpY3NJbXBvcnRHZXRQcm9ncmVzc1Byb2NTZWxlY3QgPSAweDAwMkEKK2tHcmFwaGljc0ltcG9ydEdldEltYWdlQ291bnRTZWxlY3QgPSAweDAwMkIKK2tHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhTZWxlY3QgPSAweDAwMkMKK2tHcmFwaGljc0ltcG9ydEdldEltYWdlSW5kZXhTZWxlY3QgPSAweDAwMkQKK2tHcmFwaGljc0ltcG9ydEdldERhdGFPZmZzZXRBbmRTaXplNjRTZWxlY3QgPSAweDAwMkUKK2tHcmFwaGljc0ltcG9ydFJlYWREYXRhNjRTZWxlY3QgPSAweDAwMkYKK2tHcmFwaGljc0ltcG9ydFNldERhdGFSZWZlcmVuY2VPZmZzZXRBbmRMaW1pdDY0U2VsZWN0ID0gMHgwMDMwCitrR3JhcGhpY3NJbXBvcnRHZXREYXRhUmVmZXJlbmNlT2Zmc2V0QW5kTGltaXQ2NFNlbGVjdCA9IDB4MDAzMQora0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdE1hdHJpeFNlbGVjdCA9IDB4MDAzMgora0dyYXBoaWNzSW1wb3J0R2V0RGVmYXVsdENsaXBTZWxlY3QgPSAweDAwMzMKK2tHcmFwaGljc0ltcG9ydEdldERlZmF1bHRHcmFwaGljc01vZGVTZWxlY3QgPSAweDAwMzQKK2tHcmFwaGljc0ltcG9ydEdldERlZmF1bHRTb3VyY2VSZWN0U2VsZWN0ID0gMHgwMDM1CitrR3JhcGhpY3NJbXBvcnRHZXRDb2xvclN5bmNQcm9maWxlU2VsZWN0ID0gMHgwMDM2CitrR3JhcGhpY3NJbXBvcnRTZXREZXN0UmVjdFNlbGVjdCA9IDB4MDAzNwora0dyYXBoaWNzSW1wb3J0R2V0RGVzdFJlY3RTZWxlY3QgPSAweDAwMzgKK2tHcmFwaGljc0ltcG9ydFNldEZsYWdzU2VsZWN0ID0gMHgwMDM5CitrR3JhcGhpY3NJbXBvcnRHZXRGbGFnc1NlbGVjdCA9IDB4MDAzQQora0dyYXBoaWNzSW1wb3J0R2V0QmFzZURhdGFPZmZzZXRBbmRTaXplNjRTZWxlY3QgPSAweDAwM0QKK2tHcmFwaGljc0ltcG9ydFNldEltYWdlSW5kZXhUb1RodW1ibmFpbFNlbGVjdCA9IDB4MDAzRQora0dyYXBoaWNzRXhwb3J0RG9FeHBvcnRTZWxlY3QgPSAweDAwMDEKK2tHcmFwaGljc0V4cG9ydENhblRyYW5zY29kZVNlbGVjdCA9IDB4MDAwMgora0dyYXBoaWNzRXhwb3J0RG9UcmFuc2NvZGVTZWxlY3QgPSAweDAwMDMKK2tHcmFwaGljc0V4cG9ydENhblVzZUNvbXByZXNzb3JTZWxlY3QgPSAweDAwMDQKK2tHcmFwaGljc0V4cG9ydERvVXNlQ29tcHJlc3NvclNlbGVjdCA9IDB4MDAwNQora0dyYXBoaWNzRXhwb3J0RG9TdGFuZGFsb25lRXhwb3J0U2VsZWN0ID0gMHgwMDA2CitrR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZVR5cGVBbmRDcmVhdG9yU2VsZWN0ID0gMHgwMDA3CitrR3JhcGhpY3NFeHBvcnRHZXREZWZhdWx0RmlsZU5hbWVFeHRlbnNpb25TZWxlY3QgPSAweDAwMDgKK2tHcmFwaGljc0V4cG9ydEdldE1JTUVUeXBlTGlzdFNlbGVjdCA9IDB4MDAwOQora0dyYXBoaWNzRXhwb3J0UmVxdWVzdFNldHRpbmdzU2VsZWN0ID0gMHgwMDBCCitrR3JhcGhpY3NFeHBvcnRTZXRTZXR0aW5nc0Zyb21BdG9tQ29udGFpbmVyU2VsZWN0ID0gMHgwMDBDCitrR3JhcGhpY3NFeHBvcnRHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lclNlbGVjdCA9IDB4MDAwRAora0dyYXBoaWNzRXhwb3J0R2V0U2V0dGluZ3NBc1RleHRTZWxlY3QgPSAweDAwMEUKK2tHcmFwaGljc0V4cG9ydFNldERvbnRSZWNvbXByZXNzU2VsZWN0ID0gMHgwMDBGCitrR3JhcGhpY3NFeHBvcnRHZXREb250UmVjb21wcmVzc1NlbGVjdCA9IDB4MDAxMAora0dyYXBoaWNzRXhwb3J0U2V0SW50ZXJsYWNlU3R5bGVTZWxlY3QgPSAweDAwMTEKK2tHcmFwaGljc0V4cG9ydEdldEludGVybGFjZVN0eWxlU2VsZWN0ID0gMHgwMDEyCitrR3JhcGhpY3NFeHBvcnRTZXRNZXRhRGF0YVNlbGVjdCA9IDB4MDAxMwora0dyYXBoaWNzRXhwb3J0R2V0TWV0YURhdGFTZWxlY3QgPSAweDAwMTQKK2tHcmFwaGljc0V4cG9ydFNldFRhcmdldERhdGFTaXplU2VsZWN0ID0gMHgwMDE1CitrR3JhcGhpY3NFeHBvcnRHZXRUYXJnZXREYXRhU2l6ZVNlbGVjdCA9IDB4MDAxNgora0dyYXBoaWNzRXhwb3J0U2V0Q29tcHJlc3Npb25NZXRob2RTZWxlY3QgPSAweDAwMTcKK2tHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uTWV0aG9kU2VsZWN0ID0gMHgwMDE4CitrR3JhcGhpY3NFeHBvcnRTZXRDb21wcmVzc2lvblF1YWxpdHlTZWxlY3QgPSAweDAwMTkKK2tHcmFwaGljc0V4cG9ydEdldENvbXByZXNzaW9uUXVhbGl0eVNlbGVjdCA9IDB4MDAxQQora0dyYXBoaWNzRXhwb3J0U2V0UmVzb2x1dGlvblNlbGVjdCA9IDB4MDAxQgora0dyYXBoaWNzRXhwb3J0R2V0UmVzb2x1dGlvblNlbGVjdCA9IDB4MDAxQwora0dyYXBoaWNzRXhwb3J0U2V0RGVwdGhTZWxlY3QgPSAweDAwMUQKK2tHcmFwaGljc0V4cG9ydEdldERlcHRoU2VsZWN0ID0gMHgwMDFFCitrR3JhcGhpY3NFeHBvcnRTZXRDb2xvclN5bmNQcm9maWxlU2VsZWN0ID0gMHgwMDIxCitrR3JhcGhpY3NFeHBvcnRHZXRDb2xvclN5bmNQcm9maWxlU2VsZWN0ID0gMHgwMDIyCitrR3JhcGhpY3NFeHBvcnRTZXRQcm9ncmVzc1Byb2NTZWxlY3QgPSAweDAwMjMKK2tHcmFwaGljc0V4cG9ydEdldFByb2dyZXNzUHJvY1NlbGVjdCA9IDB4MDAyNAora0dyYXBoaWNzRXhwb3J0U2V0SW5wdXREYXRhUmVmZXJlbmNlU2VsZWN0ID0gMHgwMDI1CitrR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFSZWZlcmVuY2VTZWxlY3QgPSAweDAwMjYKK2tHcmFwaGljc0V4cG9ydFNldElucHV0RmlsZVNlbGVjdCA9IDB4MDAyNwora0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRGaWxlU2VsZWN0ID0gMHgwMDI4CitrR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEhhbmRsZVNlbGVjdCA9IDB4MDAyOQora0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRIYW5kbGVTZWxlY3QgPSAweDAwMkEKK2tHcmFwaGljc0V4cG9ydFNldElucHV0UHRyU2VsZWN0ID0gMHgwMDJCCitrR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFB0clNlbGVjdCA9IDB4MDAyQwora0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRHcmFwaGljc0ltcG9ydGVyU2VsZWN0ID0gMHgwMDJECitrR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEdyYXBoaWNzSW1wb3J0ZXJTZWxlY3QgPSAweDAwMkUKK2tHcmFwaGljc0V4cG9ydFNldElucHV0UGljdHVyZVNlbGVjdCA9IDB4MDAyRgora0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRQaWN0dXJlU2VsZWN0ID0gMHgwMDMwCitrR3JhcGhpY3NFeHBvcnRTZXRJbnB1dEdXb3JsZFNlbGVjdCA9IDB4MDAzMQora0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRHV29ybGRTZWxlY3QgPSAweDAwMzIKK2tHcmFwaGljc0V4cG9ydFNldElucHV0UGl4bWFwU2VsZWN0ID0gMHgwMDMzCitrR3JhcGhpY3NFeHBvcnRHZXRJbnB1dFBpeG1hcFNlbGVjdCA9IDB4MDAzNAora0dyYXBoaWNzRXhwb3J0U2V0SW5wdXRPZmZzZXRBbmRMaW1pdFNlbGVjdCA9IDB4MDAzNQora0dyYXBoaWNzRXhwb3J0R2V0SW5wdXRPZmZzZXRBbmRMaW1pdFNlbGVjdCA9IDB4MDAzNgora0dyYXBoaWNzRXhwb3J0TWF5RXhwb3J0ZXJSZWFkSW5wdXREYXRhU2VsZWN0ID0gMHgwMDM3CitrR3JhcGhpY3NFeHBvcnRHZXRJbnB1dERhdGFTaXplU2VsZWN0ID0gMHgwMDM4CitrR3JhcGhpY3NFeHBvcnRSZWFkSW5wdXREYXRhU2VsZWN0ID0gMHgwMDM5CitrR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVzY3JpcHRpb25TZWxlY3QgPSAweDAwM0EKK2tHcmFwaGljc0V4cG9ydEdldElucHV0SW1hZ2VEaW1lbnNpb25zU2VsZWN0ID0gMHgwMDNCCitrR3JhcGhpY3NFeHBvcnRHZXRJbnB1dEltYWdlRGVwdGhTZWxlY3QgPSAweDAwM0MKK2tHcmFwaGljc0V4cG9ydERyYXdJbnB1dEltYWdlU2VsZWN0ID0gMHgwMDNECitrR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXREYXRhUmVmZXJlbmNlU2VsZWN0ID0gMHgwMDNFCitrR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXREYXRhUmVmZXJlbmNlU2VsZWN0ID0gMHgwMDNGCitrR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRGaWxlU2VsZWN0ID0gMHgwMDQwCitrR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlU2VsZWN0ID0gMHgwMDQxCitrR3JhcGhpY3NFeHBvcnRTZXRPdXRwdXRIYW5kbGVTZWxlY3QgPSAweDAwNDIKK2tHcmFwaGljc0V4cG9ydEdldE91dHB1dEhhbmRsZVNlbGVjdCA9IDB4MDA0Mwora0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZVNlbGVjdCA9IDB4MDA0NAora0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0T2Zmc2V0QW5kTWF4U2l6ZVNlbGVjdCA9IDB4MDA0NQora0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0RmlsZVR5cGVBbmRDcmVhdG9yU2VsZWN0ID0gMHgwMDQ2CitrR3JhcGhpY3NFeHBvcnRHZXRPdXRwdXRGaWxlVHlwZUFuZENyZWF0b3JTZWxlY3QgPSAweDAwNDcKK2tHcmFwaGljc0V4cG9ydFdyaXRlT3V0cHV0RGF0YVNlbGVjdCA9IDB4MDA0OAora0dyYXBoaWNzRXhwb3J0U2V0T3V0cHV0TWFya1NlbGVjdCA9IDB4MDA0OQora0dyYXBoaWNzRXhwb3J0R2V0T3V0cHV0TWFya1NlbGVjdCA9IDB4MDA0QQora0dyYXBoaWNzRXhwb3J0UmVhZE91dHB1dERhdGFTZWxlY3QgPSAweDAwNEIKK2tHcmFwaGljc0V4cG9ydFNldFRodW1ibmFpbEVuYWJsZWRTZWxlY3QgPSAweDAwNEMKK2tHcmFwaGljc0V4cG9ydEdldFRodW1ibmFpbEVuYWJsZWRTZWxlY3QgPSAweDAwNEQKK2tHcmFwaGljc0V4cG9ydFNldEV4aWZFbmFibGVkU2VsZWN0ID0gMHgwMDRFCitrR3JhcGhpY3NFeHBvcnRHZXRFeGlmRW5hYmxlZFNlbGVjdCA9IDB4MDA0Rgora0ltYWdlVHJhbnNjb2RlckJlZ2luU2VxdWVuY2VTZWxlY3QgPSAweDAwMDEKK2tJbWFnZVRyYW5zY29kZXJDb252ZXJ0U2VsZWN0ID0gMHgwMDAyCitrSW1hZ2VUcmFuc2NvZGVyRGlzcG9zZURhdGFTZWxlY3QgPSAweDAwMDMKK2tJbWFnZVRyYW5zY29kZXJFbmRTZXF1ZW5jZVNlbGVjdCA9IDB4MDAwNAorY2xvY2tDb21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Nsb2snKQorc3lzdGVtVGlja0Nsb2NrID0gRk9VUl9DSEFSX0NPREUoJ3RpY2snKQorc3lzdGVtU2Vjb25kQ2xvY2sgPSBGT1VSX0NIQVJfQ09ERSgnc2VjbycpCitzeXN0ZW1NaWxsaXNlY29uZENsb2NrID0gRk9VUl9DSEFSX0NPREUoJ21pbGwnKQorc3lzdGVtTWljcm9zZWNvbmRDbG9jayA9IEZPVVJfQ0hBUl9DT0RFKCdtaWNyJykKK2tDbG9ja1JhdGVJc0xpbmVhciA9IDEKK2tDbG9ja0ltcGxlbWVudHNDYWxsQmFja3MgPSAyCitrQ2xvY2tDYW5IYW5kbGVJbnRlcm1pdHRlbnRTb3VuZCA9IDQKK1N0YW5kYXJkQ29tcHJlc3Npb25UeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NjZGknKQorU3RhbmRhcmRDb21wcmVzc2lvblN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnaW1hZycpCitTdGFuZGFyZENvbXByZXNzaW9uU3ViVHlwZVNvdW5kID0gRk9VUl9DSEFSX0NPREUoJ3NvdW4nKQorc2NMaXN0RXZlcnlDb2RlYyA9IDFMIDw8IDEKK3NjQWxsb3daZXJvRnJhbWVSYXRlID0gMUwgPDwgMgorc2NBbGxvd1plcm9LZXlGcmFtZVJhdGUgPSAxTCA8PCAzCitzY1Nob3dCZXN0RGVwdGggPSAxTCA8PCA0CitzY1VzZU1vdmFibGVNb2RhbCA9IDFMIDw8IDUKK3NjRGlzYWJsZUZyYW1lUmF0ZUl0ZW0gPSAxTCA8PCA2CitzY1Nob3dEYXRhUmF0ZUFzS2lsb2JpdHMgPSAxTCA8PCA3CitzY1ByZWZlckNyb3BwaW5nID0gMSA8PCAwCitzY1ByZWZlclNjYWxpbmcgPSAxIDw8IDEKK3NjUHJlZmVyU2NhbGluZ0FuZENyb3BwaW5nID0gc2NQcmVmZXJTY2FsaW5nIHwgc2NQcmVmZXJDcm9wcGluZworc2NEb250RGV0ZXJtaW5lU2V0dGluZ3NGcm9tVGVzdEltYWdlID0gMSA8PCAyCitzY1Rlc3RJbWFnZVdpZHRoID0gODAKK3NjVGVzdEltYWdlSGVpZ2h0ID0gODAKK3NjT0tJdGVtID0gMQorc2NDYW5jZWxJdGVtID0gMgorc2NDdXN0b21JdGVtID0gMworc2NVc2VyQ2FuY2VsbGVkID0gMQorc2NQb3NpdGlvblJlY3QgPSAyCitzY1Bvc2l0aW9uRGlhbG9nID0gMworc2NTZXRUZXN0SW1hZ2VQaWN0SGFuZGxlID0gNAorc2NTZXRUZXN0SW1hZ2VQaWN0RmlsZSA9IDUKK3NjU2V0VGVzdEltYWdlUGl4TWFwID0gNgorc2NHZXRCZXN0RGV2aWNlUmVjdCA9IDcKK3NjUmVxdWVzdEltYWdlU2V0dGluZ3MgPSAxMAorc2NDb21wcmVzc0ltYWdlID0gMTEKK3NjQ29tcHJlc3NQaWN0dXJlID0gMTIKK3NjQ29tcHJlc3NQaWN0dXJlRmlsZSA9IDEzCitzY1JlcXVlc3RTZXF1ZW5jZVNldHRpbmdzID0gMTQKK3NjQ29tcHJlc3NTZXF1ZW5jZUJlZ2luID0gMTUKK3NjQ29tcHJlc3NTZXF1ZW5jZUZyYW1lID0gMTYKK3NjQ29tcHJlc3NTZXF1ZW5jZUVuZCA9IDE3CitzY0RlZmF1bHRQaWN0SGFuZGxlU2V0dGluZ3MgPSAxOAorc2NEZWZhdWx0UGljdEZpbGVTZXR0aW5ncyA9IDE5CitzY0RlZmF1bHRQaXhNYXBTZXR0aW5ncyA9IDIwCitzY0dldEluZm8gPSAyMQorc2NTZXRJbmZvID0gMjIKK3NjTmV3R1dvcmxkID0gMjMKK3NjU3BhdGlhbFNldHRpbmdzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzcHRsJykKK3NjVGVtcG9yYWxTZXR0aW5nc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgndHBybCcpCitzY0RhdGFSYXRlU2V0dGluZ3NUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2RyYXQnKQorc2NDb2xvclRhYmxlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjbHV0JykKK3NjUHJvZ3Jlc3NQcm9jVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdwcm9nJykKK3NjRXh0ZW5kZWRQcm9jc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgneHByYycpCitzY1ByZWZlcmVuY2VGbGFnc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgncHJlZicpCitzY1NldHRpbmdzU3RhdGVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NzdGEnKQorc2NTZXF1ZW5jZUlEVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzZXF1JykKK3NjV2luZG93UG9zaXRpb25UeXBlID0gRk9VUl9DSEFSX0NPREUoJ3duZHcnKQorc2NDb2RlY0ZsYWdzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjZmxnJykKK3NjQ29kZWNTZXR0aW5nc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY2RlYycpCitzY0ZvcmNlS2V5VmFsdWVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2tzaW0nKQorc2NTb3VuZFNhbXBsZVJhdGVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NzcnQnKQorc2NTb3VuZFNhbXBsZVNpemVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3Nzc3MnKQorc2NTb3VuZENoYW5uZWxDb3VudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3NjYycpCitzY1NvdW5kQ29tcHJlc3Npb25UeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NzY3QnKQorc2NDb21wcmVzc2lvbkxpc3RUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2N0eWwnKQorc2NDb2RlY01hbnVmYWN0dXJlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY21mcicpCitzY1NvdW5kVkJSQ29tcHJlc3Npb25PSyA9IEZPVVJfQ0hBUl9DT0RFKCdjdmJyJykKK3NjU291bmRJbnB1dFNhbXBsZVJhdGVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NzaXInKQorc2NTb3VuZFNhbXBsZVJhdGVDaGFuZ2VPSyA9IEZPVVJfQ0hBUl9DT0RFKCdyY29rJykKK3NjQXZhaWxhYmxlQ29tcHJlc3Npb25MaXN0VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhdmFpJykKK3NjR2V0Q29tcHJlc3Npb24gPSAxCitzY1Nob3dNb3Rpb25TZXR0aW5ncyA9IDFMIDw8IDAKK3NjU2V0dGluZ3NDaGFuZ2VkSXRlbSA9IC0xCitzY0NvbXByZXNzRmxhZ0lnbm9yZUlkZW50aWNhbEZyYW1lcyA9IDEKK2tRVFNldHRpbmdzVmlkZW8gPSBGT1VSX0NIQVJfQ09ERSgndmlkZScpCitrUVRTZXR0aW5nc1NvdW5kID0gRk9VUl9DSEFSX0NPREUoJ3NvdW4nKQora1FUU2V0dGluZ3NDb21wb25lbnRWZXJzaW9uID0gRk9VUl9DSEFSX0NPREUoJ3ZlcnMnKQorVHdlZW5Db21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3R3ZW4nKQorVENTb3VyY2VSZWZOYW1lVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCduYW1lJykKK3RjRHJvcEZyYW1lID0gMSA8PCAwCit0YzI0SG91ck1heCA9IDEgPDwgMQordGNOZWdUaW1lc09LID0gMSA8PCAyCit0Y0NvdW50ZXIgPSAxIDw8IDMKK3RjdE5lZ0ZsYWcgPSAweDgwCit0Y2RmU2hvd1RpbWVDb2RlID0gMSA8PCAwCitNb3ZpZUltcG9ydFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZWF0ICcpCitNb3ZpZUV4cG9ydFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3BpdCcpCitjYW5Nb3ZpZUltcG9ydEhhbmRsZXMgPSAxIDw8IDAKK2Nhbk1vdmllSW1wb3J0RmlsZXMgPSAxIDw8IDEKK2hhc01vdmllSW1wb3J0VXNlckludGVyZmFjZSA9IDEgPDwgMgorY2FuTW92aWVFeHBvcnRIYW5kbGVzID0gMSA8PCAzCitjYW5Nb3ZpZUV4cG9ydEZpbGVzID0gMSA8PCA0CitoYXNNb3ZpZUV4cG9ydFVzZXJJbnRlcmZhY2UgPSAxIDw8IDUKK21vdmllSW1wb3J0ZXJJc1hNTEJhc2VkID0gMSA8PCA1Citkb250QXV0b0ZpbGVNb3ZpZUltcG9ydCA9IDEgPDwgNgorY2FuTW92aWVFeHBvcnRBdXhEYXRhSGFuZGxlID0gMSA8PCA3CitjYW5Nb3ZpZUltcG9ydFZhbGlkYXRlSGFuZGxlcyA9IDEgPDwgOAorY2FuTW92aWVJbXBvcnRWYWxpZGF0ZUZpbGUgPSAxIDw8IDkKK2RvbnRSZWdpc3RlcldpdGhFYXN5T3BlbiA9IDEgPDwgMTAKK2Nhbk1vdmllSW1wb3J0SW5QbGFjZSA9IDEgPDwgMTEKK21vdmllSW1wb3J0U3ViVHlwZUlzRmlsZUV4dGVuc2lvbiA9IDEgPDwgMTIKK2Nhbk1vdmllSW1wb3J0UGFydGlhbCA9IDEgPDwgMTMKK2hhc01vdmllSW1wb3J0TUlNRUxpc3QgPSAxIDw8IDE0CitjYW5Nb3ZpZUltcG9ydEF2b2lkQmxvY2tpbmcgPSAxIDw8IDE1CitjYW5Nb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzID0gMSA8PCAxNQorY2FuTW92aWVFeHBvcnRWYWxpZGF0ZU1vdmllID0gMUwgPDwgMTYKK21vdmllSW1wb3J0TXVzdEdldERlc3RpbmF0aW9uTWVkaWFUeXBlID0gMUwgPDwgMTYKK21vdmllRXhwb3J0TmVlZHNSZXNvdXJjZUZvcmsgPSAxTCA8PCAxNworY2FuTW92aWVJbXBvcnREYXRhUmVmZXJlbmNlcyA9IDFMIDw8IDE4Cittb3ZpZUV4cG9ydE11c3RHZXRTb3VyY2VNZWRpYVR5cGUgPSAxTCA8PCAxOQorY2FuTW92aWVJbXBvcnRXaXRoSWRsZSA9IDFMIDw8IDIwCitjYW5Nb3ZpZUltcG9ydFZhbGlkYXRlRGF0YVJlZmVyZW5jZXMgPSAxTCA8PCAyMQorcmVzZXJ2ZWRGb3JVc2VCeUdyYXBoaWNzSW1wb3J0ZXJzID0gMUwgPDwgMjMKK21vdmllSW1wb3J0Q3JlYXRlVHJhY2sgPSAxCittb3ZpZUltcG9ydEluUGFyYWxsZWwgPSAyCittb3ZpZUltcG9ydE11c3RVc2VUcmFjayA9IDQKK21vdmllSW1wb3J0V2l0aElkbGUgPSAxNgorbW92aWVJbXBvcnRSZXN1bHRVc2VkTXVsdGlwbGVUcmFja3MgPSA4Cittb3ZpZUltcG9ydFJlc3VsdE5lZWRJZGxlcyA9IDMyCittb3ZpZUltcG9ydFJlc3VsdENvbXBsZXRlID0gNjQKK2tNb3ZpZUV4cG9ydFRleHRPbmx5ID0gMAora01vdmllRXhwb3J0QWJzb2x1dGVUaW1lID0gMQora01vdmllRXhwb3J0UmVsYXRpdmVUaW1lID0gMgora01JRElJbXBvcnRTaWxlbmNlQmVmb3JlID0gMSA8PCAwCitrTUlESUltcG9ydFNpbGVuY2VBZnRlciA9IDEgPDwgMQora01JRElJbXBvcnQyMFBsYXlhYmxlID0gMSA8PCAyCitrTUlESUltcG9ydFdhbnRMeXJpY3MgPSAxIDw8IDMKK2tRVE1lZGlhQ29uZmlnUmVzb3VyY2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ21jZmcnKQora1FUTWVkaWFDb25maWdSZXNvdXJjZVZlcnNpb24gPSAyCitrUVRNZWRpYUdyb3VwUmVzb3VyY2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ21ncnAnKQora1FUTWVkaWFHcm91cFJlc291cmNlVmVyc2lvbiA9IDEKK2tRVEJyb3dzZXJJbmZvUmVzb3VyY2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Jyd3MnKQora1FUQnJvd3NlckluZm9SZXNvdXJjZVZlcnNpb24gPSAxCitrUVRNZWRpYU1JTUVJbmZvSGFzQ2hhbmdlZCA9ICgxTCA8PCAxKQora1FUTWVkaWFGaWxlSW5mb0hhc0NoYW5nZWQgPSAoMUwgPDwgMikKK2tRVE1lZGlhQ29uZmlnQ2FuVXNlQXBwID0gKDFMIDw8IDE4KQora1FUTWVkaWFDb25maWdDYW5Vc2VQbHVnaW4gPSAoMUwgPDwgMTkpCitrUVRNZWRpYUNvbmZpZ1VOVVNFRCA9ICgxTCA8PCAyMCkKK2tRVE1lZGlhQ29uZmlnQmluYXJ5RmlsZSA9ICgxTCA8PCAyMykKK2tRVE1lZGlhQ29uZmlnVGV4dEZpbGUgPSAwCitrUVRNZWRpYUNvbmZpZ01hY2ludG9zaEZpbGUgPSAoMUwgPDwgMjQpCitrUVRNZWRpYUNvbmZpZ0Fzc29jaWF0ZUJ5RGVmYXVsdCA9ICgxTCA8PCAyNykKK2tRVE1lZGlhQ29uZmlnVXNlQXBwQnlEZWZhdWx0ID0gKDFMIDw8IDI4KQora1FUTWVkaWFDb25maWdVc2VQbHVnaW5CeURlZmF1bHQgPSAoMUwgPDwgMjkpCitrUVRNZWRpYUNvbmZpZ0RlZmF1bHRzTWFzayA9IChrUVRNZWRpYUNvbmZpZ1VzZUFwcEJ5RGVmYXVsdCB8IGtRVE1lZGlhQ29uZmlnVXNlUGx1Z2luQnlEZWZhdWx0KQora1FUTWVkaWFDb25maWdEZWZhdWx0c1NoaWZ0ID0gMTIKK2tRVE1lZGlhQ29uZmlnSGFzRmlsZUhhc1FUQXRvbXMgPSAoMUwgPDwgMzApCitrUVRNZWRpYUNvbmZpZ1N0cmVhbUdyb3VwSUQgPSBGT1VSX0NIQVJfQ09ERSgnc3RybScpCitrUVRNZWRpYUNvbmZpZ0ludGVyYWN0aXZlR3JvdXBJRCA9IEZPVVJfQ0hBUl9DT0RFKCdpbnRyJykKK2tRVE1lZGlhQ29uZmlnVmlkZW9Hcm91cElEID0gRk9VUl9DSEFSX0NPREUoJ2V5ZXMnKQora1FUTWVkaWFDb25maWdBdWRpb0dyb3VwSUQgPSBGT1VSX0NIQVJfQ09ERSgnZWFycycpCitrUVRNZWRpYUNvbmZpZ01QRUdHcm91cElEID0gRk9VUl9DSEFSX0NPREUoJ21wZWcnKQora1FUTWVkaWFDb25maWdNUDNHcm91cElEID0gRk9VUl9DSEFSX0NPREUoJ21wMyAnKQora1FUTWVkaWFDb25maWdJbWFnZUdyb3VwSUQgPSBGT1VSX0NIQVJfQ09ERSgnb2dsZScpCitrUVRNZWRpYUNvbmZpZ01pc2NHcm91cElEID0gRk9VUl9DSEFSX0NPREUoJ21pc2MnKQora1FUTWVkaWFJbmZvTmV0R3JvdXAgPSBGT1VSX0NIQVJfQ09ERSgnbmV0ICcpCitrUVRNZWRpYUluZm9XaW5Hcm91cCA9IEZPVVJfQ0hBUl9DT0RFKCd3aW4gJykKK2tRVE1lZGlhSW5mb01hY0dyb3VwID0gRk9VUl9DSEFSX0NPREUoJ21hYyAnKQora1FUTWVkaWFJbmZvTWlzY0dyb3VwID0gMHgzRjNGM0YzRgora01pbWVJbmZvTWltZVR5cGVUYWcgPSBGT1VSX0NIQVJfQ09ERSgnbWltZScpCitrTWltZUluZm9GaWxlRXh0ZW5zaW9uVGFnID0gRk9VUl9DSEFSX0NPREUoJ2V4dCAnKQora01pbWVJbmZvRGVzY3JpcHRpb25UYWcgPSBGT1VSX0NIQVJfQ09ERSgnZGVzYycpCitrTWltZUluZm9Hcm91cFRhZyA9IEZPVVJfQ0hBUl9DT0RFKCdncm9wJykKK2tNaW1lSW5mb0RvTm90T3ZlcnJpZGVFeGlzdGluZ0ZpbGVUeXBlQXNzb2NpYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnbm9mYScpCitrUVRGaWxlVHlwZUFJRkYgPSBGT1VSX0NIQVJfQ09ERSgnQUlGRicpCitrUVRGaWxlVHlwZUFJRkMgPSBGT1VSX0NIQVJfQ09ERSgnQUlGQycpCitrUVRGaWxlVHlwZURWQyA9IEZPVVJfQ0hBUl9DT0RFKCdkdmMhJykKK2tRVEZpbGVUeXBlTUlESSA9IEZPVVJfQ0hBUl9DT0RFKCdNaWRpJykKK2tRVEZpbGVUeXBlUGljdHVyZSA9IEZPVVJfQ0hBUl9DT0RFKCdQSUNUJykKK2tRVEZpbGVUeXBlTW92aWUgPSBGT1VSX0NIQVJfQ09ERSgnTW9vVicpCitrUVRGaWxlVHlwZVRleHQgPSBGT1VSX0NIQVJfQ09ERSgnVEVYVCcpCitrUVRGaWxlVHlwZVdhdmUgPSBGT1VSX0NIQVJfQ09ERSgnV0FWRScpCitrUVRGaWxlVHlwZVN5c3RlbVNldmVuU291bmQgPSBGT1VSX0NIQVJfQ09ERSgnc2ZpbCcpCitrUVRGaWxlVHlwZU11TGF3ID0gRk9VUl9DSEFSX0NPREUoJ1VMQVcnKQora1FURmlsZVR5cGVBVkkgPSBGT1VSX0NIQVJfQ09ERSgnVmZXICcpCitrUVRGaWxlVHlwZVNvdW5kRGVzaWduZXJJSSA9IEZPVVJfQ0hBUl9DT0RFKCdTZDJmJykKK2tRVEZpbGVUeXBlQXVkaW9DRFRyYWNrID0gRk9VUl9DSEFSX0NPREUoJ3RyYWsnKQora1FURmlsZVR5cGVQSUNTID0gRk9VUl9DSEFSX0NPREUoJ1BJQ1MnKQora1FURmlsZVR5cGVHSUYgPSBGT1VSX0NIQVJfQ09ERSgnR0lGZicpCitrUVRGaWxlVHlwZVBORyA9IEZPVVJfQ0hBUl9DT0RFKCdQTkdmJykKK2tRVEZpbGVUeXBlVElGRiA9IEZPVVJfQ0hBUl9DT0RFKCdUSUZGJykKK2tRVEZpbGVUeXBlUGhvdG9TaG9wID0gRk9VUl9DSEFSX0NPREUoJzhCUFMnKQora1FURmlsZVR5cGVTR0lJbWFnZSA9IEZPVVJfQ0hBUl9DT0RFKCcuU0dJJykKK2tRVEZpbGVUeXBlQk1QID0gRk9VUl9DSEFSX0NPREUoJ0JNUGYnKQora1FURmlsZVR5cGVKUEVHID0gRk9VUl9DSEFSX0NPREUoJ0pQRUcnKQora1FURmlsZVR5cGVKRklGID0gRk9VUl9DSEFSX0NPREUoJ0pQRUcnKQora1FURmlsZVR5cGVNYWNQYWludCA9IEZPVVJfQ0hBUl9DT0RFKCdQTlRHJykKK2tRVEZpbGVUeXBlVGFyZ2FJbWFnZSA9IEZPVVJfQ0hBUl9DT0RFKCdUUElDJykKK2tRVEZpbGVUeXBlUXVpY2tEcmF3R1hQaWN0dXJlID0gRk9VUl9DSEFSX0NPREUoJ3FkZ3gnKQora1FURmlsZVR5cGVRdWlja1RpbWVJbWFnZSA9IEZPVVJfQ0hBUl9DT0RFKCdxdGlmJykKK2tRVEZpbGVUeXBlM0RNRiA9IEZPVVJfQ0hBUl9DT0RFKCczRE1GJykKK2tRVEZpbGVUeXBlRkxDID0gRk9VUl9DSEFSX0NPREUoJ0ZMQyAnKQora1FURmlsZVR5cGVGbGFzaCA9IEZPVVJfQ0hBUl9DT0RFKCdTV0ZMJykKK2tRVEZpbGVUeXBlRmxhc2hQaXggPSBGT1VSX0NIQVJfQ09ERSgnRlBpeCcpCitrUVRGaWxlVHlwZU1QNCA9IEZPVVJfQ0hBUl9DT0RFKCdtcGc0JykKK2tRVFNldHRpbmdzRFZFeHBvcnROVFNDID0gRk9VUl9DSEFSX0NPREUoJ2R2Y3YnKQora1FUU2V0dGluZ3NEVkV4cG9ydExvY2tlZEF1ZGlvID0gRk9VUl9DSEFSX0NPREUoJ2xvY2snKQora1FUU2V0dGluZ3NFZmZlY3QgPSBGT1VSX0NIQVJfQ09ERSgnZWZmZScpCitrUVRTZXR0aW5nc0dyYXBoaWNzRmlsZUltcG9ydFNlcXVlbmNlID0gRk9VUl9DSEFSX0NPREUoJ3NlcXUnKQora1FUU2V0dGluZ3NHcmFwaGljc0ZpbGVJbXBvcnRTZXF1ZW5jZUVuYWJsZWQgPSBGT1VSX0NIQVJfQ09ERSgnZW5hYicpCitrUVRTZXR0aW5nc01vdmllRXhwb3J0RW5hYmxlVmlkZW8gPSBGT1VSX0NIQVJfQ09ERSgnZW52aScpCitrUVRTZXR0aW5nc01vdmllRXhwb3J0RW5hYmxlU291bmQgPSBGT1VSX0NIQVJfQ09ERSgnZW5zbycpCitrUVRTZXR0aW5nc01vdmllRXhwb3J0U2F2ZU9wdGlvbnMgPSBGT1VSX0NIQVJfQ09ERSgnc2F2ZScpCitrUVRTZXR0aW5nc01vdmllRXhwb3J0U2F2ZUZvckludGVybmV0ID0gRk9VUl9DSEFSX0NPREUoJ2Zhc3QnKQora1FUU2V0dGluZ3NNb3ZpZUV4cG9ydFNhdmVDb21wcmVzc2VkTW92aWUgPSBGT1VSX0NIQVJfQ09ERSgnY21wbScpCitrUVRTZXR0aW5nc01JREkgPSBGT1VSX0NIQVJfQ09ERSgnTUlESScpCitrUVRTZXR0aW5nc01JRElTZXR0aW5nRmxhZ3MgPSBGT1VSX0NIQVJfQ09ERSgnc3R0ZycpCitrUVRTZXR0aW5nc1RleHQgPSBGT1VSX0NIQVJfQ09ERSgndGV4dCcpCitrUVRTZXR0aW5nc1RleHREZXNjcmlwdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdkZXNjJykKK2tRVFNldHRpbmdzVGV4dFNpemUgPSBGT1VSX0NIQVJfQ09ERSgnc2l6ZScpCitrUVRTZXR0aW5nc1RleHRTZXR0aW5nRmxhZ3MgPSBGT1VSX0NIQVJfQ09ERSgnc3R0ZycpCitrUVRTZXR0aW5nc1RleHRUaW1lRnJhY3Rpb24gPSBGT1VSX0NIQVJfQ09ERSgndGltZicpCitrUVRTZXR0aW5nc1RpbWUgPSBGT1VSX0NIQVJfQ09ERSgndGltZScpCitrUVRTZXR0aW5nc1RpbWVEdXJhdGlvbiA9IEZPVVJfQ0hBUl9DT0RFKCdkdXJhJykKK2tRVFNldHRpbmdzQXVkaW9DRFRyYWNrID0gRk9VUl9DSEFSX0NPREUoJ3RyYWsnKQora1FUU2V0dGluZ3NBdWRpb0NEVHJhY2tSYXRlU2hpZnQgPSBGT1VSX0NIQVJfQ09ERSgncnNoZicpCitrUVRTZXR0aW5nc0RWRXhwb3J0RFZGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnZHZjZicpCitrUVRQcmVzZXRzTGlzdFJlc291cmNlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzdGcjJykKK2tRVFByZXNldHNQbGF0Zm9ybUxpc3RSZXNvdXJjZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc3RncCcpCitrUVRQcmVzZXRJbmZvSXNEaXZpZGVyID0gMQora1FUTW92aWVFeHBvcnRTb3VyY2VJbmZvUmVzb3VyY2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NyYyMnKQora1FUTW92aWVFeHBvcnRTb3VyY2VJbmZvSXNNZWRpYVR5cGUgPSAxTCA8PCAwCitrUVRNb3ZpZUV4cG9ydFNvdXJjZUluZm9Jc01lZGlhQ2hhcmFjdGVyaXN0aWMgPSAxTCA8PCAxCitrUVRNb3ZpZUV4cG9ydFNvdXJjZUluZm9Jc1NvdXJjZVR5cGUgPSAxTCA8PCAyCittb3ZpZUV4cG9ydFVzZUNvbmZpZ3VyZWRTZXR0aW5ncyA9IEZPVVJfQ0hBUl9DT0RFKCd1Y2ZnJykKK21vdmllRXhwb3J0V2lkdGggPSBGT1VSX0NIQVJfQ09ERSgnd2R0aCcpCittb3ZpZUV4cG9ydEhlaWdodCA9IEZPVVJfQ0hBUl9DT0RFKCdoZWd0JykKK21vdmllRXhwb3J0RHVyYXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnZHVyYScpCittb3ZpZUV4cG9ydFZpZGVvRmlsdGVyID0gRk9VUl9DSEFSX0NPREUoJ2lmbHQnKQorbW92aWVFeHBvcnRUaW1lU2NhbGUgPSBGT1VSX0NIQVJfQ09ERSgndG1zYycpCitrUVRCcm93c2VySW5mb0NhblVzZVN5c3RlbUZvbGRlclBsdWdpbiA9ICgxTCA8PCAwKQora1FUUHJlRmxpZ2h0T3BlbkNvbXBvbmVudCA9ICgxTCA8PCAxKQorcG5vdENvbXBvbmVudFdhbnRzRXZlbnRzID0gMQorcG5vdENvbXBvbmVudE5lZWRzTm9DYWNoZSA9IDIKK1Nob3dGaWxlUHJldmlld0NvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncG5vdCcpCitDcmVhdGVGaWxlUHJldmlld0NvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncG1haycpCitEYXRhQ29tcHJlc3NvckNvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZGNvbScpCitEYXRhRGVjb21wcmVzc29yQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdkZGVjJykKK0FwcGxlRGF0YUNvbXByZXNzb3JTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2FkZWMnKQoremxpYkRhdGFDb21wcmVzc29yU3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd6bGliJykKK2tEYXRhSENhblJlYWQgPSAxTCA8PCAwCitrRGF0YUhTcGVjaWFsUmVhZCA9IDFMIDw8IDEKK2tEYXRhSFNwZWNpYWxSZWFkRmlsZSA9IDFMIDw8IDIKK2tEYXRhSENhbldyaXRlID0gMUwgPDwgMwora0RhdGFIU3BlY2lhbFdyaXRlID0gMSA8PCA0CitrRGF0YUhTcGVjaWFsV3JpdGVGaWxlID0gMSA8PCA1CitrRGF0YUhDYW5TdHJlYW1pbmdXcml0ZSA9IDEgPDwgNgora0RhdGFITXVzdENoZWNrRGF0YVJlZiA9IDEgPDwgNwora0RhdGFSZWZFeHRlbnNpb25DaG9rZVNwZWVkID0gRk9VUl9DSEFSX0NPREUoJ2Nob2snKQora0RhdGFSZWZFeHRlbnNpb25GaWxlTmFtZSA9IEZPVVJfQ0hBUl9DT0RFKCdmbmFtJykKK2tEYXRhUmVmRXh0ZW5zaW9uTUlNRVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbWltZScpCitrRGF0YVJlZkV4dGVuc2lvbk1hY09TRmlsZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZnR5cCcpCitrRGF0YVJlZkV4dGVuc2lvbkluaXRpYWxpemF0aW9uRGF0YSA9IEZPVVJfQ0hBUl9DT0RFKCdkYXRhJykKK2tEYXRhUmVmRXh0ZW5zaW9uUXVpY2tUaW1lTWVkaWFUeXBlID0gRk9VUl9DSEFSX0NPREUoJ210eXAnKQora0RhdGFIQ2hva2VUb01vdmllRGF0YVJhdGUgPSAxIDw8IDAKK2tEYXRhSENob2tlVG9QYXJhbSA9IDEgPDwgMQora0RhdGFIRXh0ZW5kZWRTY2hlZHVsZSA9IEZPVVJfQ0hBUl9DT0RFKCd4dG5kJykKK2tEYXRhSEluZm9GbGFnTmV2ZXJTdHJlYW1zID0gMSA8PCAwCitrRGF0YUhJbmZvRmxhZ0NhblVwZGF0ZURhdGFSZWZzID0gMSA8PCAxCitrRGF0YUhJbmZvRmxhZ05lZWRzTmV0d29ya0JhbmR3aWR0aCA9IDEgPDwgMgora0RhdGFIRmlsZVR5cGVNYWNPU0ZpbGVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2Z0eXAnKQora0RhdGFIRmlsZVR5cGVFeHRlbnNpb24gPSBGT1VSX0NIQVJfQ09ERSgnZmV4dCcpCitrRGF0YUhGaWxlVHlwZU1JTUUgPSBGT1VSX0NIQVJfQ09ERSgnbWltZScpCitrRGF0YUhDcmVhdGVGaWxlQnV0RG9udENyZWF0ZVJlc0ZpbGUgPSAoMUwgPDwgMCkKK2tEYXRhSE1vdmllVXNhZ2VEb0FwcGVuZE1EQVQgPSAxTCA8PCAwCitrRGF0YUhUZW1wVXNlU2FtZURpcmVjdG9yeSA9IDFMIDw8IDAKK2tEYXRhSFRlbXBVc2VTYW1lVm9sdW1lID0gMUwgPDwgMQora0RhdGFIVGVtcENyZWF0ZUZpbGUgPSAxTCA8PCAyCitrRGF0YUhUZW1wT3BlbkZpbGUgPSAxTCA8PCAzCitrRGF0YUhHZXREYXRhUmF0ZUluZmluaXRlUmF0ZSA9IDB4N0ZGRkZGRkYKK2tEYXRhSFNldFRpbWVIaW50c1NraXBCYW5kd2lkdGhSZXF1ZXN0ID0gMSA8PCAwCit2aWRlb0RpZ2l0aXplckNvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndmRpZycpCit2ZGlnSW50ZXJmYWNlUmV2ID0gMgorbnRzY0luID0gMAorY3VycmVudEluID0gMAorcGFsSW4gPSAxCitzZWNhbUluID0gMgorbnRzY1JlYWxseUluID0gMworY29tcG9zaXRlSW4gPSAwCitzVmlkZW9JbiA9IDEKK3JnYkNvbXBvbmVudEluID0gMgorcmdiQ29tcG9uZW50U3luY0luID0gMworeXV2Q29tcG9uZW50SW4gPSA0Cit5dXZDb21wb25lbnRTeW5jSW4gPSA1Cit0dlR1bmVySW4gPSA2CitzZGlJbiA9IDcKK3ZkUGxheVRocnVPZmYgPSAwCit2ZFBsYXlUaHJ1T24gPSAxCit2ZERpZ2l0aXplckJXID0gMAordmREaWdpdGl6ZXJSR0IgPSAxCit2ZEJyb2FkY2FzdE1vZGUgPSAwCit2ZFZUUk1vZGUgPSAxCit2ZFVzZUFueUZpZWxkID0gMAordmRVc2VPZGRGaWVsZCA9IDEKK3ZkVXNlRXZlbkZpZWxkID0gMgordmRUeXBlQmFzaWMgPSAwCit2ZFR5cGVBbHBoYSA9IDEKK3ZkVHlwZU1hc2sgPSAyCit2ZFR5cGVLZXkgPSAzCitkaWdpSW5Eb2VzTlRTQyA9IDFMIDw8IDAKK2RpZ2lJbkRvZXNQQUwgPSAxTCA8PCAxCitkaWdpSW5Eb2VzU0VDQU0gPSAxTCA8PCAyCitkaWdpSW5Eb2VzR2VuTG9jayA9IDFMIDw8IDcKK2RpZ2lJbkRvZXNDb21wb3NpdGUgPSAxTCA8PCA4CitkaWdpSW5Eb2VzU1ZpZGVvID0gMUwgPDwgOQorZGlnaUluRG9lc0NvbXBvbmVudCA9IDFMIDw8IDEwCitkaWdpSW5WVFJfQnJvYWRjYXN0ID0gMUwgPDwgMTEKK2RpZ2lJbkRvZXNDb2xvciA9IDFMIDw8IDEyCitkaWdpSW5Eb2VzQlcgPSAxTCA8PCAxMworZGlnaUluU2lnbmFsTG9jayA9IDFMIDw8IDMxCitkaWdpT3V0RG9lczEgPSAxTCA8PCAwCitkaWdpT3V0RG9lczIgPSAxTCA8PCAxCitkaWdpT3V0RG9lczQgPSAxTCA8PCAyCitkaWdpT3V0RG9lczggPSAxTCA8PCAzCitkaWdpT3V0RG9lczE2ID0gMUwgPDwgNAorZGlnaU91dERvZXMzMiA9IDFMIDw8IDUKK2RpZ2lPdXREb2VzRGl0aGVyID0gMUwgPDwgNgorZGlnaU91dERvZXNTdHJldGNoID0gMUwgPDwgNworZGlnaU91dERvZXNTaHJpbmsgPSAxTCA8PCA4CitkaWdpT3V0RG9lc01hc2sgPSAxTCA8PCA5CitkaWdpT3V0RG9lc0RvdWJsZSA9IDFMIDw8IDExCitkaWdpT3V0RG9lc1F1YWQgPSAxTCA8PCAxMgorZGlnaU91dERvZXNRdWFydGVyID0gMUwgPDwgMTMKK2RpZ2lPdXREb2VzU2l4dGVlbnRoID0gMUwgPDwgMTQKK2RpZ2lPdXREb2VzUm90YXRlID0gMUwgPDwgMTUKK2RpZ2lPdXREb2VzSG9yaXpGbGlwID0gMUwgPDwgMTYKK2RpZ2lPdXREb2VzVmVydEZsaXAgPSAxTCA8PCAxNworZGlnaU91dERvZXNTa2V3ID0gMUwgPDwgMTgKK2RpZ2lPdXREb2VzQmxlbmQgPSAxTCA8PCAxOQorZGlnaU91dERvZXNXYXJwID0gMUwgPDwgMjAKK2RpZ2lPdXREb2VzSFdfRE1BID0gMUwgPDwgMjEKK2RpZ2lPdXREb2VzSFdQbGF5VGhydSA9IDFMIDw8IDIyCitkaWdpT3V0RG9lc0lMVVQgPSAxTCA8PCAyMworZGlnaU91dERvZXNLZXlDb2xvciA9IDFMIDw8IDI0CitkaWdpT3V0RG9lc0FzeW5jR3JhYnMgPSAxTCA8PCAyNQorZGlnaU91dERvZXNVbnJlYWRhYmxlU2NyZWVuQml0cyA9IDFMIDw8IDI2CitkaWdpT3V0RG9lc0NvbXByZXNzID0gMUwgPDwgMjcKK2RpZ2lPdXREb2VzQ29tcHJlc3NPbmx5ID0gMUwgPDwgMjgKK2RpZ2lPdXREb2VzUGxheVRocnVEdXJpbmdDb21wcmVzcyA9IDFMIDw8IDI5CitkaWdpT3V0RG9lc0NvbXByZXNzUGFydGlhbGx5VmlzaWJsZSA9IDFMIDw8IDMwCitkaWdpT3V0RG9lc05vdE5lZWRDb3B5T2ZDb21wcmVzc0RhdGEgPSAxTCA8PCAzMQorZG1hRGVwdGgxID0gMQorZG1hRGVwdGgyID0gMgorZG1hRGVwdGg0ID0gNAorZG1hRGVwdGg4ID0gOAorZG1hRGVwdGgxNiA9IDE2CitkbWFEZXB0aDMyID0gMzIKK2RtYURlcHRoMkdyYXkgPSA2NAorZG1hRGVwdGg0R3JheSA9IDEyOAorZG1hRGVwdGg4R3JheSA9IDI1Ngora1ZESUdDb250cm9sbGVkRnJhbWVSYXRlID0gLTEKK3ZkRGV2aWNlRmxhZ1Nob3dJbnB1dHNBc0RldmljZXMgPSAoMSA8PCAwKQordmREZXZpY2VGbGFnSGlkZURldmljZSA9ICgxIDw8IDEpCit2ZEZsYWdDYXB0dXJlU3RhcnRpbmcgPSAoMSA8PCAwKQordmRGbGFnQ2FwdHVyZVN0b3BwaW5nID0gKDEgPDwgMSkKK3ZkRmxhZ0NhcHR1cmVJc0ZvclByZXZpZXcgPSAoMSA8PCAyKQordmRGbGFnQ2FwdHVyZUlzRm9yUmVjb3JkID0gKDEgPDwgMykKK3ZkRmxhZ0NhcHR1cmVMb3dMYXRlbmN5ID0gKDEgPDwgNCkKK3ZkRmxhZ0NhcHR1cmVBbHdheXNVc2VUaW1lQmFzZSA9ICgxIDw8IDUpCit2ZEZsYWdDYXB0dXJlU2V0U2V0dGluZ3NCZWdpbiA9ICgxIDw8IDYpCit2ZEZsYWdDYXB0dXJlU2V0U2V0dGluZ3NFbmQgPSAoMSA8PCA3KQoreG1sUGFyc2VDb21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3BhcnMnKQoreG1sUGFyc2VDb21wb25lbnRTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3htbCAnKQoreG1sSWRlbnRpZmllckludmFsaWQgPSAwCisjIHhtbElkZW50aWZpZXJVbnJlY29nbml6ZWQgPSAobG9uZykweEZGRkZGRkZGCit4bWxDb250ZW50VHlwZUludmFsaWQgPSAwCit4bWxDb250ZW50VHlwZUVsZW1lbnQgPSAxCit4bWxDb250ZW50VHlwZUNoYXJEYXRhID0gMgorZWxlbWVudEZsYWdBbHdheXNTZWxmQ29udGFpbmVkID0gMUwgPDwgMAorZWxlbWVudEZsYWdQcmVzZXJ2ZVdoaXRlU3BhY2UgPSAxTCA8PCAxCit4bWxQYXJzZUZsYWdBbGxvd1VwcGVyY2FzZSA9IDFMIDw8IDAKK3htbFBhcnNlRmxhZ0FsbG93VW5xdW90ZWRBdHRyaWJ1dGVWYWx1ZXMgPSAxTCA8PCAxCit4bWxQYXJzZUZsYWdFdmVudFBhcnNlT25seSA9IDFMIDw8IDIKK2F0dHJpYnV0ZVZhbHVlS2luZENoYXJTdHJpbmcgPSAwCithdHRyaWJ1dGVWYWx1ZUtpbmRJbnRlZ2VyID0gMUwgPDwgMAorYXR0cmlidXRlVmFsdWVLaW5kUGVyY2VudCA9IDFMIDw8IDEKK2F0dHJpYnV0ZVZhbHVlS2luZEJvb2xlYW4gPSAxTCA8PCAyCithdHRyaWJ1dGVWYWx1ZUtpbmRPbk9mZiA9IDFMIDw8IDMKK2F0dHJpYnV0ZVZhbHVlS2luZENvbG9yID0gMUwgPDwgNAorYXR0cmlidXRlVmFsdWVLaW5kRW51bSA9IDFMIDw8IDUKK2F0dHJpYnV0ZVZhbHVlS2luZENhc2VTZW5zRW51bSA9IDFMIDw8IDYKK01BWF9BVFRSSUJVVEVfVkFMVUVfS0lORCA9IGF0dHJpYnV0ZVZhbHVlS2luZENhc2VTZW5zRW51bQorbmFtZVNwYWNlSUROb25lID0gMAorZWxlbWVudF94bWwgPSAxCithdHRyX3NyYyA9IDEKK1NlcUdyYWJDb21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2JhcmcnKQorU2VxR3JhYkNoYW5uZWxUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NnY2gnKQorU2VxR3JhYlBhbmVsVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzZ3BuJykKK1NlcUdyYWJDb21wcmVzc2lvblBhbmVsVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjbXByJykKK1NlcUdyYWJTb3VyY2VQYW5lbFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc291cicpCitzZXFHcmFiVG9EaXNrID0gMQorc2VxR3JhYlRvTWVtb3J5ID0gMgorc2VxR3JhYkRvbnRVc2VUZW1wTWVtb3J5ID0gNAorc2VxR3JhYkFwcGVuZFRvRmlsZSA9IDgKK3NlcUdyYWJEb250QWRkTW92aWVSZXNvdXJjZSA9IDE2CitzZXFHcmFiRG9udE1ha2VNb3ZpZSA9IDMyCitzZXFHcmFiUHJlRXh0ZW5kRmlsZSA9IDY0CitzZXFHcmFiRGF0YVByb2NJc0ludGVycnVwdFNhZmUgPSAxMjgKK3NlcUdyYWJEYXRhUHJvY0RvZXNPdmVybGFwcGluZ1JlYWRzID0gMjU2CitzZXFHcmFiUmVjb3JkID0gMQorc2VxR3JhYlByZXZpZXcgPSAyCitzZXFHcmFiUGxheUR1cmluZ1JlY29yZCA9IDQKK3NlcUdyYWJMb3dMYXRlbmN5Q2FwdHVyZSA9IDgKK3NlcUdyYWJBbHdheXNVc2VUaW1lQmFzZSA9IDE2CitzZXFHcmFiSGFzQm91bmRzID0gMQorc2VxR3JhYkhhc1ZvbHVtZSA9IDIKK3NlcUdyYWJIYXNEaXNjcmV0ZVNhbXBsZXMgPSA0CitzZXFHcmFiRG9Ob3RCdWZmZXJpemVEYXRhID0gOAorc2VxR3JhYkNhbk1vdmVXaW5kb3dXaGlsZVJlY29yZGluZyA9IDE2CitncmFiUGljdE9mZlNjcmVlbiA9IDEKK2dyYWJQaWN0SWdub3JlQ2xpcCA9IDIKK2dyYWJQaWN0Q3VycmVudEltYWdlID0gNAorc2dGbGFnQ29udHJvbGxlZEdyYWIgPSAoMSA8PCAwKQorc2dGbGFnQWxsb3dOb25SR0JQaXhNYXBzID0gKDEgPDwgMSkKK3NnRGV2aWNlSW5wdXROYW1lRmxhZ0lucHV0VW5hdmFpbGFibGUgPSAoMSA8PCAwKQorc2dEZXZpY2VOYW1lRmxhZ0RldmljZVVuYXZhaWxhYmxlID0gKDEgPDwgMCkKK3NnRGV2aWNlTmFtZUZsYWdTaG93SW5wdXRzQXNEZXZpY2VzID0gKDEgPDwgMSkKK3NnRGV2aWNlTGlzdFdpdGhJY29ucyA9ICgxIDw8IDApCitzZ0RldmljZUxpc3REb250Q2hlY2tBdmFpbGFiaWxpdHkgPSAoMSA8PCAxKQorc2dEZXZpY2VMaXN0SW5jbHVkZUlucHV0cyA9ICgxIDw8IDIpCitzZXFHcmFiV3JpdGVBcHBlbmQgPSAwCitzZXFHcmFiV3JpdGVSZXNlcnZlID0gMQorc2VxR3JhYldyaXRlRmlsbCA9IDIKK3NlcUdyYWJVbnBhdXNlID0gMAorc2VxR3JhYlBhdXNlID0gMQorc2VxR3JhYlBhdXNlRm9yTWVudSA9IDMKK2NoYW5uZWxGbGFnRG9udE9wZW5SZXNGaWxlID0gMgorY2hhbm5lbEZsYWdIYXNEZXBlbmRlbmN5ID0gNAorc2dQYW5lbEZsYWdGb3JQYW5lbCA9IDEKK3NlcUdyYWJTZXR0aW5nc1ByZXZpZXdPbmx5ID0gMQorY2hhbm5lbFBsYXlOb3JtYWwgPSAwCitjaGFubmVsUGxheUZhc3QgPSAxCitjaGFubmVsUGxheUhpZ2hRdWFsaXR5ID0gMgorY2hhbm5lbFBsYXlBbGxEYXRhID0gNAorc2dTZXRTZXR0aW5nc0JlZ2luID0gKDEgPDwgMCkKK3NnU2V0U2V0dGluZ3NFbmQgPSAoMSA8PCAxKQora1NHU21hbGxlc3RESVRMU2l6ZSA9IC0xCitrU0dMYXJnZXN0RElUTFNpemUgPSAtMgorc2dDaGFubmVsQXRvbSA9IEZPVVJfQ0hBUl9DT0RFKCdjaGFuJykKK3NnQ2hhbm5lbFNldHRpbmdzQXRvbSA9IEZPVVJfQ0hBUl9DT0RFKCdjdG9tJykKK3NnQ2hhbm5lbERlc2NyaXB0aW9uID0gRk9VUl9DSEFSX0NPREUoJ2Nkc2MnKQorc2dDaGFubmVsU2V0dGluZ3MgPSBGT1VSX0NIQVJfQ09ERSgnY3NldCcpCitzZ0RldmljZU5hbWVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ25hbWUnKQorc2dEZXZpY2VEaXNwbGF5TmFtZVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZG5hbScpCitzZ0RldmljZVVJRFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZHVpZCcpCitzZ0lucHV0VUlEVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpdWlkJykKK3NnVXNhZ2VUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3VzZSAnKQorc2dQbGF5RmxhZ3NUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3BseWYnKQorc2dDbGlwVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjbGlwJykKK3NnTWF0cml4VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtdHJ4JykKK3NnVm9sdW1lVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd2b2x1JykKK3NnUGFuZWxTZXR0aW5nc0F0b20gPSBGT1VSX0NIQVJfQ09ERSgncHRvbScpCitzZ1BhbmVsRGVzY3JpcHRpb24gPSBGT1VSX0NIQVJfQ09ERSgncGRzYycpCitzZ1BhbmVsU2V0dGluZ3MgPSBGT1VSX0NIQVJfQ09ERSgncHNldCcpCitzZ2NTb3VuZENvbXByZXNzaW9uVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzY21wJykKK3NnY1NvdW5kQ29kZWNTZXR0aW5nc1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY2RlYycpCitzZ2NTb3VuZFNhbXBsZVJhdGVUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NyYXQnKQorc2djU291bmRDaGFubmVsQ291bnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NjaG4nKQorc2djU291bmRTYW1wbGVTaXplVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzc2l6JykKK3NnY1NvdW5kSW5wdXRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NpbnAnKQorc2djU291bmRHYWluVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdnYWluJykKK3NnY1ZpZGVvSHVlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdodWUgJykKK3NnY1ZpZGVvU2F0dXJhdGlvblR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc2F0cicpCitzZ2NWaWRlb0NvbnRyYXN0VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0cnN0JykKK3NnY1ZpZGVvU2hhcnBuZXNzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzaHJwJykKK3NnY1ZpZGVvQnJpZ3RuZXNzVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdicml0JykKK3NnY1ZpZGVvQmxhY2tMZXZlbFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYmxrbCcpCitzZ2NWaWRlb1doaXRlTGV2ZWxUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3dodGwnKQorc2djVmlkZW9JbnB1dFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndmlucCcpCitzZ2NWaWRlb0Zvcm1hdFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndnN0ZCcpCitzZ2NWaWRlb0ZpbHRlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndmZsdCcpCitzZ2NWaWRlb1JlY3RUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3ZyY3QnKQorc2djVmlkZW9EaWdpdGl6ZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3ZkaWcnKQorUVRWaWRlb091dHB1dENvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndm91dCcpCitRVFZpZGVvT3V0cHV0Q29tcG9uZW50QmFzZVN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYmFzZScpCitrUVRWaWRlb091dHB1dERvbnREaXNwbGF5VG9Vc2VyID0gMUwgPDwgMAora1FUVk9EaXNwbGF5TW9kZUl0ZW0gPSBGT1VSX0NIQVJfQ09ERSgncWRtaScpCitrUVRWT0RpbWVuc2lvbnMgPSBGT1VSX0NIQVJfQ09ERSgnZGltbicpCitrUVRWT1Jlc29sdXRpb24gPSBGT1VSX0NIQVJfQ09ERSgncmVzbCcpCitrUVRWT1JlZnJlc2hSYXRlID0gRk9VUl9DSEFSX0NPREUoJ3JlZnInKQora1FUVk9QaXhlbFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncGl4bCcpCitrUVRWT05hbWUgPSBGT1VSX0NIQVJfQ09ERSgnbmFtZScpCitrUVRWT0RlY29tcHJlc3NvcnMgPSBGT1VSX0NIQVJfQ09ERSgnZGVjbycpCitrUVRWT0RlY29tcHJlc3NvclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZGV0eScpCitrUVRWT0RlY29tcHJlc3NvckNvbnRpbnVvdXMgPSBGT1VSX0NIQVJfQ09ERSgnY29udCcpCitrUVRWT0RlY29tcHJlc3NvckNvbXBvbmVudCA9IEZPVVJfQ0hBUl9DT0RFKCdjbXB0JykKK2tDbG9ja0dldFRpbWVTZWxlY3QgPSAweDAwMDEKK2tDbG9ja05ld0NhbGxCYWNrU2VsZWN0ID0gMHgwMDAyCitrQ2xvY2tEaXNwb3NlQ2FsbEJhY2tTZWxlY3QgPSAweDAwMDMKK2tDbG9ja0NhbGxNZVdoZW5TZWxlY3QgPSAweDAwMDQKK2tDbG9ja0NhbmNlbENhbGxCYWNrU2VsZWN0ID0gMHgwMDA1CitrQ2xvY2tSYXRlQ2hhbmdlZFNlbGVjdCA9IDB4MDAwNgora0Nsb2NrVGltZUNoYW5nZWRTZWxlY3QgPSAweDAwMDcKK2tDbG9ja1NldFRpbWVCYXNlU2VsZWN0ID0gMHgwMDA4CitrQ2xvY2tTdGFydFN0b3BDaGFuZ2VkU2VsZWN0ID0gMHgwMDA5CitrQ2xvY2tHZXRSYXRlU2VsZWN0ID0gMHgwMDBBCitrU0NHZXRDb21wcmVzc2lvbkV4dGVuZGVkU2VsZWN0ID0gMHgwMDAxCitrU0NQb3NpdGlvblJlY3RTZWxlY3QgPSAweDAwMDIKK2tTQ1Bvc2l0aW9uRGlhbG9nU2VsZWN0ID0gMHgwMDAzCitrU0NTZXRUZXN0SW1hZ2VQaWN0SGFuZGxlU2VsZWN0ID0gMHgwMDA0CitrU0NTZXRUZXN0SW1hZ2VQaWN0RmlsZVNlbGVjdCA9IDB4MDAwNQora1NDU2V0VGVzdEltYWdlUGl4TWFwU2VsZWN0ID0gMHgwMDA2CitrU0NHZXRCZXN0RGV2aWNlUmVjdFNlbGVjdCA9IDB4MDAwNwora1NDUmVxdWVzdEltYWdlU2V0dGluZ3NTZWxlY3QgPSAweDAwMEEKK2tTQ0NvbXByZXNzSW1hZ2VTZWxlY3QgPSAweDAwMEIKK2tTQ0NvbXByZXNzUGljdHVyZVNlbGVjdCA9IDB4MDAwQwora1NDQ29tcHJlc3NQaWN0dXJlRmlsZVNlbGVjdCA9IDB4MDAwRAora1NDUmVxdWVzdFNlcXVlbmNlU2V0dGluZ3NTZWxlY3QgPSAweDAwMEUKK2tTQ0NvbXByZXNzU2VxdWVuY2VCZWdpblNlbGVjdCA9IDB4MDAwRgora1NDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lU2VsZWN0ID0gMHgwMDEwCitrU0NDb21wcmVzc1NlcXVlbmNlRW5kU2VsZWN0ID0gMHgwMDExCitrU0NEZWZhdWx0UGljdEhhbmRsZVNldHRpbmdzU2VsZWN0ID0gMHgwMDEyCitrU0NEZWZhdWx0UGljdEZpbGVTZXR0aW5nc1NlbGVjdCA9IDB4MDAxMwora1NDRGVmYXVsdFBpeE1hcFNldHRpbmdzU2VsZWN0ID0gMHgwMDE0CitrU0NHZXRJbmZvU2VsZWN0ID0gMHgwMDE1CitrU0NTZXRJbmZvU2VsZWN0ID0gMHgwMDE2CitrU0NOZXdHV29ybGRTZWxlY3QgPSAweDAwMTcKK2tTQ1NldENvbXByZXNzRmxhZ3NTZWxlY3QgPSAweDAwMTgKK2tTQ0dldENvbXByZXNzRmxhZ3NTZWxlY3QgPSAweDAwMTkKK2tTQ0dldFNldHRpbmdzQXNUZXh0U2VsZWN0ID0gMHgwMDFBCitrU0NHZXRTZXR0aW5nc0FzQXRvbUNvbnRhaW5lclNlbGVjdCA9IDB4MDAxQgora1NDU2V0U2V0dGluZ3NGcm9tQXRvbUNvbnRhaW5lclNlbGVjdCA9IDB4MDAxQwora1NDQ29tcHJlc3NTZXF1ZW5jZUZyYW1lQXN5bmNTZWxlY3QgPSAweDAwMUQKK2tTQ0FzeW5jSWRsZVNlbGVjdCA9IDB4MDAxRQora1R3ZWVuZXJJbml0aWFsaXplU2VsZWN0ID0gMHgwMDAxCitrVHdlZW5lckRvVHdlZW5TZWxlY3QgPSAweDAwMDIKK2tUd2VlbmVyUmVzZXRTZWxlY3QgPSAweDAwMDMKK2tUQ0dldEN1cnJlbnRUaW1lQ29kZVNlbGVjdCA9IDB4MDEwMQora1RDR2V0VGltZUNvZGVBdFRpbWVTZWxlY3QgPSAweDAxMDIKK2tUQ1RpbWVDb2RlVG9TdHJpbmdTZWxlY3QgPSAweDAxMDMKK2tUQ1RpbWVDb2RlVG9GcmFtZU51bWJlclNlbGVjdCA9IDB4MDEwNAora1RDRnJhbWVOdW1iZXJUb1RpbWVDb2RlU2VsZWN0ID0gMHgwMTA1CitrVENHZXRTb3VyY2VSZWZTZWxlY3QgPSAweDAxMDYKK2tUQ1NldFNvdXJjZVJlZlNlbGVjdCA9IDB4MDEwNwora1RDU2V0VGltZUNvZGVGbGFnc1NlbGVjdCA9IDB4MDEwOAora1RDR2V0VGltZUNvZGVGbGFnc1NlbGVjdCA9IDB4MDEwOQora1RDU2V0RGlzcGxheU9wdGlvbnNTZWxlY3QgPSAweDAxMEEKK2tUQ0dldERpc3BsYXlPcHRpb25zU2VsZWN0ID0gMHgwMTBCCitrTW92aWVJbXBvcnRIYW5kbGVTZWxlY3QgPSAweDAwMDEKK2tNb3ZpZUltcG9ydEZpbGVTZWxlY3QgPSAweDAwMDIKK2tNb3ZpZUltcG9ydFNldFNhbXBsZUR1cmF0aW9uU2VsZWN0ID0gMHgwMDAzCitrTW92aWVJbXBvcnRTZXRTYW1wbGVEZXNjcmlwdGlvblNlbGVjdCA9IDB4MDAwNAora01vdmllSW1wb3J0U2V0TWVkaWFGaWxlU2VsZWN0ID0gMHgwMDA1CitrTW92aWVJbXBvcnRTZXREaW1lbnNpb25zU2VsZWN0ID0gMHgwMDA2CitrTW92aWVJbXBvcnRTZXRDaHVua1NpemVTZWxlY3QgPSAweDAwMDcKK2tNb3ZpZUltcG9ydFNldFByb2dyZXNzUHJvY1NlbGVjdCA9IDB4MDAwOAora01vdmllSW1wb3J0U2V0QXV4aWxpYXJ5RGF0YVNlbGVjdCA9IDB4MDAwOQora01vdmllSW1wb3J0U2V0RnJvbVNjcmFwU2VsZWN0ID0gMHgwMDBBCitrTW92aWVJbXBvcnREb1VzZXJEaWFsb2dTZWxlY3QgPSAweDAwMEIKK2tNb3ZpZUltcG9ydFNldER1cmF0aW9uU2VsZWN0ID0gMHgwMDBDCitrTW92aWVJbXBvcnRHZXRBdXhpbGlhcnlEYXRhVHlwZVNlbGVjdCA9IDB4MDAwRAora01vdmllSW1wb3J0VmFsaWRhdGVTZWxlY3QgPSAweDAwMEUKK2tNb3ZpZUltcG9ydEdldEZpbGVUeXBlU2VsZWN0ID0gMHgwMDBGCitrTW92aWVJbXBvcnREYXRhUmVmU2VsZWN0ID0gMHgwMDEwCitrTW92aWVJbXBvcnRHZXRTYW1wbGVEZXNjcmlwdGlvblNlbGVjdCA9IDB4MDAxMQora01vdmllSW1wb3J0R2V0TUlNRVR5cGVMaXN0U2VsZWN0ID0gMHgwMDEyCitrTW92aWVJbXBvcnRTZXRPZmZzZXRBbmRMaW1pdFNlbGVjdCA9IDB4MDAxMwora01vdmllSW1wb3J0R2V0U2V0dGluZ3NBc0F0b21Db250YWluZXJTZWxlY3QgPSAweDAwMTQKK2tNb3ZpZUltcG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXJTZWxlY3QgPSAweDAwMTUKK2tNb3ZpZUltcG9ydFNldE9mZnNldEFuZExpbWl0NjRTZWxlY3QgPSAweDAwMTYKK2tNb3ZpZUltcG9ydElkbGVTZWxlY3QgPSAweDAwMTcKK2tNb3ZpZUltcG9ydFZhbGlkYXRlRGF0YVJlZlNlbGVjdCA9IDB4MDAxOAora01vdmllSW1wb3J0R2V0TG9hZFN0YXRlU2VsZWN0ID0gMHgwMDE5CitrTW92aWVJbXBvcnRHZXRNYXhMb2FkZWRUaW1lU2VsZWN0ID0gMHgwMDFBCitrTW92aWVJbXBvcnRFc3RpbWF0ZUNvbXBsZXRpb25UaW1lU2VsZWN0ID0gMHgwMDFCCitrTW92aWVJbXBvcnRTZXREb250QmxvY2tTZWxlY3QgPSAweDAwMUMKK2tNb3ZpZUltcG9ydEdldERvbnRCbG9ja1NlbGVjdCA9IDB4MDAxRAora01vdmllSW1wb3J0U2V0SWRsZU1hbmFnZXJTZWxlY3QgPSAweDAwMUUKK2tNb3ZpZUltcG9ydFNldE5ld01vdmllRmxhZ3NTZWxlY3QgPSAweDAwMUYKK2tNb3ZpZUltcG9ydEdldERlc3RpbmF0aW9uTWVkaWFUeXBlU2VsZWN0ID0gMHgwMDIwCitrTW92aWVFeHBvcnRUb0hhbmRsZVNlbGVjdCA9IDB4MDA4MAora01vdmllRXhwb3J0VG9GaWxlU2VsZWN0ID0gMHgwMDgxCitrTW92aWVFeHBvcnRHZXRBdXhpbGlhcnlEYXRhU2VsZWN0ID0gMHgwMDgzCitrTW92aWVFeHBvcnRTZXRQcm9ncmVzc1Byb2NTZWxlY3QgPSAweDAwODQKK2tNb3ZpZUV4cG9ydFNldFNhbXBsZURlc2NyaXB0aW9uU2VsZWN0ID0gMHgwMDg1CitrTW92aWVFeHBvcnREb1VzZXJEaWFsb2dTZWxlY3QgPSAweDAwODYKK2tNb3ZpZUV4cG9ydEdldENyZWF0b3JUeXBlU2VsZWN0ID0gMHgwMDg3CitrTW92aWVFeHBvcnRUb0RhdGFSZWZTZWxlY3QgPSAweDAwODgKK2tNb3ZpZUV4cG9ydEZyb21Qcm9jZWR1cmVzVG9EYXRhUmVmU2VsZWN0ID0gMHgwMDg5CitrTW92aWVFeHBvcnRBZGREYXRhU291cmNlU2VsZWN0ID0gMHgwMDhBCitrTW92aWVFeHBvcnRWYWxpZGF0ZVNlbGVjdCA9IDB4MDA4Qgora01vdmllRXhwb3J0R2V0U2V0dGluZ3NBc0F0b21Db250YWluZXJTZWxlY3QgPSAweDAwOEMKK2tNb3ZpZUV4cG9ydFNldFNldHRpbmdzRnJvbUF0b21Db250YWluZXJTZWxlY3QgPSAweDAwOEQKK2tNb3ZpZUV4cG9ydEdldEZpbGVOYW1lRXh0ZW5zaW9uU2VsZWN0ID0gMHgwMDhFCitrTW92aWVFeHBvcnRHZXRTaG9ydEZpbGVUeXBlU3RyaW5nU2VsZWN0ID0gMHgwMDhGCitrTW92aWVFeHBvcnRHZXRTb3VyY2VNZWRpYVR5cGVTZWxlY3QgPSAweDAwOTAKK2tNb3ZpZUV4cG9ydFNldEdldE1vdmllUHJvcGVydHlQcm9jU2VsZWN0ID0gMHgwMDkxCitrVGV4dEV4cG9ydEdldERpc3BsYXlEYXRhU2VsZWN0ID0gMHgwMTAwCitrVGV4dEV4cG9ydEdldFRpbWVGcmFjdGlvblNlbGVjdCA9IDB4MDEwMQora1RleHRFeHBvcnRTZXRUaW1lRnJhY3Rpb25TZWxlY3QgPSAweDAxMDIKK2tUZXh0RXhwb3J0R2V0U2V0dGluZ3NTZWxlY3QgPSAweDAxMDMKK2tUZXh0RXhwb3J0U2V0U2V0dGluZ3NTZWxlY3QgPSAweDAxMDQKK2tNSURJSW1wb3J0R2V0U2V0dGluZ3NTZWxlY3QgPSAweDAxMDAKK2tNSURJSW1wb3J0U2V0U2V0dGluZ3NTZWxlY3QgPSAweDAxMDEKK2tNb3ZpZUV4cG9ydE5ld0dldERhdGFBbmRQcm9wZXJ0aWVzUHJvY3NTZWxlY3QgPSAweDAxMDAKK2tNb3ZpZUV4cG9ydERpc3Bvc2VHZXREYXRhQW5kUHJvcGVydGllc1Byb2NzU2VsZWN0ID0gMHgwMTAxCitrR3JhcGhpY3NJbWFnZUltcG9ydFNldFNlcXVlbmNlRW5hYmxlZFNlbGVjdCA9IDB4MDEwMAora0dyYXBoaWNzSW1hZ2VJbXBvcnRHZXRTZXF1ZW5jZUVuYWJsZWRTZWxlY3QgPSAweDAxMDEKK2tQcmV2aWV3U2hvd0RhdGFTZWxlY3QgPSAweDAwMDEKK2tQcmV2aWV3TWFrZVByZXZpZXdTZWxlY3QgPSAweDAwMDIKK2tQcmV2aWV3TWFrZVByZXZpZXdSZWZlcmVuY2VTZWxlY3QgPSAweDAwMDMKK2tQcmV2aWV3RXZlbnRTZWxlY3QgPSAweDAwMDQKK2tEYXRhQ29kZWNEZWNvbXByZXNzU2VsZWN0ID0gMHgwMDAxCitrRGF0YUNvZGVjR2V0Q29tcHJlc3NCdWZmZXJTaXplU2VsZWN0ID0gMHgwMDAyCitrRGF0YUNvZGVjQ29tcHJlc3NTZWxlY3QgPSAweDAwMDMKK2tEYXRhQ29kZWNCZWdpbkludGVycnVwdFNhZmVTZWxlY3QgPSAweDAwMDQKK2tEYXRhQ29kZWNFbmRJbnRlcnJ1cHRTYWZlU2VsZWN0ID0gMHgwMDA1CitrRGF0YUNvZGVjRGVjb21wcmVzc1BhcnRpYWxTZWxlY3QgPSAweDAwMDYKK2tEYXRhQ29kZWNDb21wcmVzc1BhcnRpYWxTZWxlY3QgPSAweDAwMDcKK2tEYXRhSEdldERhdGFTZWxlY3QgPSAweDAwMDIKK2tEYXRhSFB1dERhdGFTZWxlY3QgPSAweDAwMDMKK2tEYXRhSEZsdXNoRGF0YVNlbGVjdCA9IDB4MDAwNAora0RhdGFIT3BlbkZvcldyaXRlU2VsZWN0ID0gMHgwMDA1CitrRGF0YUhDbG9zZUZvcldyaXRlU2VsZWN0ID0gMHgwMDA2CitrRGF0YUhPcGVuRm9yUmVhZFNlbGVjdCA9IDB4MDAwOAora0RhdGFIQ2xvc2VGb3JSZWFkU2VsZWN0ID0gMHgwMDA5CitrRGF0YUhTZXREYXRhUmVmU2VsZWN0ID0gMHgwMDBBCitrRGF0YUhHZXREYXRhUmVmU2VsZWN0ID0gMHgwMDBCCitrRGF0YUhDb21wYXJlRGF0YVJlZlNlbGVjdCA9IDB4MDAwQwora0RhdGFIVGFza1NlbGVjdCA9IDB4MDAwRAora0RhdGFIU2NoZWR1bGVEYXRhU2VsZWN0ID0gMHgwMDBFCitrRGF0YUhGaW5pc2hEYXRhU2VsZWN0ID0gMHgwMDBGCitrRGF0YUhGbHVzaENhY2hlU2VsZWN0ID0gMHgwMDEwCitrRGF0YUhSZXNvbHZlRGF0YVJlZlNlbGVjdCA9IDB4MDAxMQora0RhdGFIR2V0RmlsZVNpemVTZWxlY3QgPSAweDAwMTIKK2tEYXRhSENhblVzZURhdGFSZWZTZWxlY3QgPSAweDAwMTMKK2tEYXRhSEdldFZvbHVtZUxpc3RTZWxlY3QgPSAweDAwMTQKK2tEYXRhSFdyaXRlU2VsZWN0ID0gMHgwMDE1CitrRGF0YUhQcmVleHRlbmRTZWxlY3QgPSAweDAwMTYKK2tEYXRhSFNldEZpbGVTaXplU2VsZWN0ID0gMHgwMDE3CitrRGF0YUhHZXRGcmVlU3BhY2VTZWxlY3QgPSAweDAwMTgKK2tEYXRhSENyZWF0ZUZpbGVTZWxlY3QgPSAweDAwMTkKK2tEYXRhSEdldFByZWZlcnJlZEJsb2NrU2l6ZVNlbGVjdCA9IDB4MDAxQQora0RhdGFIR2V0RGV2aWNlSW5kZXhTZWxlY3QgPSAweDAwMUIKK2tEYXRhSElzU3RyZWFtaW5nRGF0YUhhbmRsZXJTZWxlY3QgPSAweDAwMUMKK2tEYXRhSEdldERhdGFJbkJ1ZmZlclNlbGVjdCA9IDB4MDAxRAora0RhdGFIR2V0U2NoZWR1bGVBaGVhZFRpbWVTZWxlY3QgPSAweDAwMUUKK2tEYXRhSFNldENhY2hlU2l6ZUxpbWl0U2VsZWN0ID0gMHgwMDFGCitrRGF0YUhHZXRDYWNoZVNpemVMaW1pdFNlbGVjdCA9IDB4MDAyMAora0RhdGFIR2V0TW92aWVTZWxlY3QgPSAweDAwMjEKK2tEYXRhSEFkZE1vdmllU2VsZWN0ID0gMHgwMDIyCitrRGF0YUhVcGRhdGVNb3ZpZVNlbGVjdCA9IDB4MDAyMwora0RhdGFIRG9lc0J1ZmZlclNlbGVjdCA9IDB4MDAyNAora0RhdGFIR2V0RmlsZU5hbWVTZWxlY3QgPSAweDAwMjUKK2tEYXRhSEdldEF2YWlsYWJsZUZpbGVTaXplU2VsZWN0ID0gMHgwMDI2CitrRGF0YUhHZXRNYWNPU0ZpbGVUeXBlU2VsZWN0ID0gMHgwMDI3CitrRGF0YUhHZXRNSU1FVHlwZVNlbGVjdCA9IDB4MDAyOAora0RhdGFIU2V0RGF0YVJlZldpdGhBbmNob3JTZWxlY3QgPSAweDAwMjkKK2tEYXRhSEdldERhdGFSZWZXaXRoQW5jaG9yU2VsZWN0ID0gMHgwMDJBCitrRGF0YUhTZXRNYWNPU0ZpbGVUeXBlU2VsZWN0ID0gMHgwMDJCCitrRGF0YUhTZXRUaW1lQmFzZVNlbGVjdCA9IDB4MDAyQwora0RhdGFIR2V0SW5mb0ZsYWdzU2VsZWN0ID0gMHgwMDJECitrRGF0YUhTY2hlZHVsZURhdGE2NFNlbGVjdCA9IDB4MDAyRQora0RhdGFIV3JpdGU2NFNlbGVjdCA9IDB4MDAyRgora0RhdGFIR2V0RmlsZVNpemU2NFNlbGVjdCA9IDB4MDAzMAora0RhdGFIUHJlZXh0ZW5kNjRTZWxlY3QgPSAweDAwMzEKK2tEYXRhSFNldEZpbGVTaXplNjRTZWxlY3QgPSAweDAwMzIKK2tEYXRhSEdldEZyZWVTcGFjZTY0U2VsZWN0ID0gMHgwMDMzCitrRGF0YUhBcHBlbmQ2NFNlbGVjdCA9IDB4MDAzNAora0RhdGFIUmVhZEFzeW5jU2VsZWN0ID0gMHgwMDM1CitrRGF0YUhQb2xsUmVhZFNlbGVjdCA9IDB4MDAzNgora0RhdGFIR2V0RGF0YUF2YWlsYWJpbGl0eVNlbGVjdCA9IDB4MDAzNwora0RhdGFIR2V0RmlsZVNpemVBc3luY1NlbGVjdCA9IDB4MDAzQQora0RhdGFIR2V0RGF0YVJlZkFzVHlwZVNlbGVjdCA9IDB4MDAzQgora0RhdGFIU2V0RGF0YVJlZkV4dGVuc2lvblNlbGVjdCA9IDB4MDAzQwora0RhdGFIR2V0RGF0YVJlZkV4dGVuc2lvblNlbGVjdCA9IDB4MDAzRAora0RhdGFIR2V0TW92aWVXaXRoRmxhZ3NTZWxlY3QgPSAweDAwM0UKK2tEYXRhSEdldEZpbGVUeXBlT3JkZXJpbmdTZWxlY3QgPSAweDAwNDAKK2tEYXRhSENyZWF0ZUZpbGVXaXRoRmxhZ3NTZWxlY3QgPSAweDAwNDEKK2tEYXRhSEdldE1JTUVUeXBlQXN5bmNTZWxlY3QgPSAweDAwNDIKK2tEYXRhSEdldEluZm9TZWxlY3QgPSAweDAwNDMKK2tEYXRhSFNldElkbGVNYW5hZ2VyU2VsZWN0ID0gMHgwMDQ0CitrRGF0YUhEZWxldGVGaWxlU2VsZWN0ID0gMHgwMDQ1CitrRGF0YUhTZXRNb3ZpZVVzYWdlRmxhZ3NTZWxlY3QgPSAweDAwNDYKK2tEYXRhSFVzZVRlbXBvcmFyeURhdGFSZWZTZWxlY3QgPSAweDAwNDcKK2tEYXRhSEdldFRlbXBvcmFyeURhdGFSZWZDYXBhYmlsaXRpZXNTZWxlY3QgPSAweDAwNDgKK2tEYXRhSFJlbmFtZUZpbGVTZWxlY3QgPSAweDAwNDkKK2tEYXRhSFBsYXliYWNrSGludHNTZWxlY3QgPSAweDAxMDMKK2tEYXRhSFBsYXliYWNrSGludHM2NFNlbGVjdCA9IDB4MDEwRQora0RhdGFIR2V0RGF0YVJhdGVTZWxlY3QgPSAweDAxMTAKK2tEYXRhSFNldFRpbWVIaW50c1NlbGVjdCA9IDB4MDExMQora1ZER2V0TWF4U3JjUmVjdFNlbGVjdCA9IDB4MDAwMQora1ZER2V0QWN0aXZlU3JjUmVjdFNlbGVjdCA9IDB4MDAwMgora1ZEU2V0RGlnaXRpemVyUmVjdFNlbGVjdCA9IDB4MDAwMwora1ZER2V0RGlnaXRpemVyUmVjdFNlbGVjdCA9IDB4MDAwNAora1ZER2V0VkJsYW5rUmVjdFNlbGVjdCA9IDB4MDAwNQora1ZER2V0TWFza1BpeE1hcFNlbGVjdCA9IDB4MDAwNgora1ZER2V0UGxheVRocnVEZXN0aW5hdGlvblNlbGVjdCA9IDB4MDAwOAora1ZEVXNlVGhpc0NMVVRTZWxlY3QgPSAweDAwMDkKK2tWRFNldElucHV0R2FtbWFWYWx1ZVNlbGVjdCA9IDB4MDAwQQora1ZER2V0SW5wdXRHYW1tYVZhbHVlU2VsZWN0ID0gMHgwMDBCCitrVkRTZXRCcmlnaHRuZXNzU2VsZWN0ID0gMHgwMDBDCitrVkRHZXRCcmlnaHRuZXNzU2VsZWN0ID0gMHgwMDBECitrVkRTZXRDb250cmFzdFNlbGVjdCA9IDB4MDAwRQora1ZEU2V0SHVlU2VsZWN0ID0gMHgwMDBGCitrVkRTZXRTaGFycG5lc3NTZWxlY3QgPSAweDAwMTAKK2tWRFNldFNhdHVyYXRpb25TZWxlY3QgPSAweDAwMTEKK2tWREdldENvbnRyYXN0U2VsZWN0ID0gMHgwMDEyCitrVkRHZXRIdWVTZWxlY3QgPSAweDAwMTMKK2tWREdldFNoYXJwbmVzc1NlbGVjdCA9IDB4MDAxNAora1ZER2V0U2F0dXJhdGlvblNlbGVjdCA9IDB4MDAxNQora1ZER3JhYk9uZUZyYW1lU2VsZWN0ID0gMHgwMDE2CitrVkRHZXRNYXhBdXhCdWZmZXJTZWxlY3QgPSAweDAwMTcKK2tWREdldERpZ2l0aXplckluZm9TZWxlY3QgPSAweDAwMTkKK2tWREdldEN1cnJlbnRGbGFnc1NlbGVjdCA9IDB4MDAxQQora1ZEU2V0S2V5Q29sb3JTZWxlY3QgPSAweDAwMUIKK2tWREdldEtleUNvbG9yU2VsZWN0ID0gMHgwMDFDCitrVkRBZGRLZXlDb2xvclNlbGVjdCA9IDB4MDAxRAora1ZER2V0TmV4dEtleUNvbG9yU2VsZWN0ID0gMHgwMDFFCitrVkRTZXRLZXlDb2xvclJhbmdlU2VsZWN0ID0gMHgwMDFGCitrVkRHZXRLZXlDb2xvclJhbmdlU2VsZWN0ID0gMHgwMDIwCitrVkRTZXREaWdpdGl6ZXJVc2VySW50ZXJydXB0U2VsZWN0ID0gMHgwMDIxCitrVkRTZXRJbnB1dENvbG9yU3BhY2VNb2RlU2VsZWN0ID0gMHgwMDIyCitrVkRHZXRJbnB1dENvbG9yU3BhY2VNb2RlU2VsZWN0ID0gMHgwMDIzCitrVkRTZXRDbGlwU3RhdGVTZWxlY3QgPSAweDAwMjQKK2tWREdldENsaXBTdGF0ZVNlbGVjdCA9IDB4MDAyNQora1ZEU2V0Q2xpcFJnblNlbGVjdCA9IDB4MDAyNgora1ZEQ2xlYXJDbGlwUmduU2VsZWN0ID0gMHgwMDI3CitrVkRHZXRDTFVUSW5Vc2VTZWxlY3QgPSAweDAwMjgKK2tWRFNldFBMTEZpbHRlclR5cGVTZWxlY3QgPSAweDAwMjkKK2tWREdldFBMTEZpbHRlclR5cGVTZWxlY3QgPSAweDAwMkEKK2tWREdldE1hc2thbmRWYWx1ZVNlbGVjdCA9IDB4MDAyQgora1ZEU2V0TWFzdGVyQmxlbmRMZXZlbFNlbGVjdCA9IDB4MDAyQwora1ZEU2V0UGxheVRocnVEZXN0aW5hdGlvblNlbGVjdCA9IDB4MDAyRAora1ZEU2V0UGxheVRocnVPbk9mZlNlbGVjdCA9IDB4MDAyRQora1ZEU2V0RmllbGRQcmVmZXJlbmNlU2VsZWN0ID0gMHgwMDJGCitrVkRHZXRGaWVsZFByZWZlcmVuY2VTZWxlY3QgPSAweDAwMzAKK2tWRFByZWZsaWdodERlc3RpbmF0aW9uU2VsZWN0ID0gMHgwMDMyCitrVkRQcmVmbGlnaHRHbG9iYWxSZWN0U2VsZWN0ID0gMHgwMDMzCitrVkRTZXRQbGF5VGhydUdsb2JhbFJlY3RTZWxlY3QgPSAweDAwMzQKK2tWRFNldElucHV0R2FtbWFSZWNvcmRTZWxlY3QgPSAweDAwMzUKK2tWREdldElucHV0R2FtbWFSZWNvcmRTZWxlY3QgPSAweDAwMzYKK2tWRFNldEJsYWNrTGV2ZWxWYWx1ZVNlbGVjdCA9IDB4MDAzNwora1ZER2V0QmxhY2tMZXZlbFZhbHVlU2VsZWN0ID0gMHgwMDM4CitrVkRTZXRXaGl0ZUxldmVsVmFsdWVTZWxlY3QgPSAweDAwMzkKK2tWREdldFdoaXRlTGV2ZWxWYWx1ZVNlbGVjdCA9IDB4MDAzQQora1ZER2V0VmlkZW9EZWZhdWx0c1NlbGVjdCA9IDB4MDAzQgora1ZER2V0TnVtYmVyT2ZJbnB1dHNTZWxlY3QgPSAweDAwM0MKK2tWREdldElucHV0Rm9ybWF0U2VsZWN0ID0gMHgwMDNECitrVkRTZXRJbnB1dFNlbGVjdCA9IDB4MDAzRQora1ZER2V0SW5wdXRTZWxlY3QgPSAweDAwM0YKK2tWRFNldElucHV0U3RhbmRhcmRTZWxlY3QgPSAweDAwNDAKK2tWRFNldHVwQnVmZmVyc1NlbGVjdCA9IDB4MDA0MQora1ZER3JhYk9uZUZyYW1lQXN5bmNTZWxlY3QgPSAweDAwNDIKK2tWRERvbmVTZWxlY3QgPSAweDAwNDMKK2tWRFNldENvbXByZXNzaW9uU2VsZWN0ID0gMHgwMDQ0CitrVkRDb21wcmVzc09uZUZyYW1lQXN5bmNTZWxlY3QgPSAweDAwNDUKK2tWRENvbXByZXNzRG9uZVNlbGVjdCA9IDB4MDA0Ngora1ZEUmVsZWFzZUNvbXByZXNzQnVmZmVyU2VsZWN0ID0gMHgwMDQ3CitrVkRHZXRJbWFnZURlc2NyaXB0aW9uU2VsZWN0ID0gMHgwMDQ4CitrVkRSZXNldENvbXByZXNzU2VxdWVuY2VTZWxlY3QgPSAweDAwNDkKK2tWRFNldENvbXByZXNzaW9uT25PZmZTZWxlY3QgPSAweDAwNEEKK2tWREdldENvbXByZXNzaW9uVHlwZXNTZWxlY3QgPSAweDAwNEIKK2tWRFNldFRpbWVCYXNlU2VsZWN0ID0gMHgwMDRDCitrVkRTZXRGcmFtZVJhdGVTZWxlY3QgPSAweDAwNEQKK2tWREdldERhdGFSYXRlU2VsZWN0ID0gMHgwMDRFCitrVkRHZXRTb3VuZElucHV0RHJpdmVyU2VsZWN0ID0gMHgwMDRGCitrVkRHZXRETUFEZXB0aHNTZWxlY3QgPSAweDAwNTAKK2tWREdldFByZWZlcnJlZFRpbWVTY2FsZVNlbGVjdCA9IDB4MDA1MQora1ZEUmVsZWFzZUFzeW5jQnVmZmVyc1NlbGVjdCA9IDB4MDA1Mgora1ZEU2V0RGF0YVJhdGVTZWxlY3QgPSAweDAwNTQKK2tWREdldFRpbWVDb2RlU2VsZWN0ID0gMHgwMDU1CitrVkRVc2VTYWZlQnVmZmVyc1NlbGVjdCA9IDB4MDA1Ngora1ZER2V0U291bmRJbnB1dFNvdXJjZVNlbGVjdCA9IDB4MDA1Nwora1ZER2V0Q29tcHJlc3Npb25UaW1lU2VsZWN0ID0gMHgwMDU4CitrVkRTZXRQcmVmZXJyZWRQYWNrZXRTaXplU2VsZWN0ID0gMHgwMDU5CitrVkRTZXRQcmVmZXJyZWRJbWFnZURpbWVuc2lvbnNTZWxlY3QgPSAweDAwNUEKK2tWREdldFByZWZlcnJlZEltYWdlRGltZW5zaW9uc1NlbGVjdCA9IDB4MDA1Qgora1ZER2V0SW5wdXROYW1lU2VsZWN0ID0gMHgwMDVDCitrVkRTZXREZXN0aW5hdGlvblBvcnRTZWxlY3QgPSAweDAwNUQKK2tWREdldERldmljZU5hbWVBbmRGbGFnc1NlbGVjdCA9IDB4MDA1RQora1ZEQ2FwdHVyZVN0YXRlQ2hhbmdpbmdTZWxlY3QgPSAweDAwNUYKK2tWREdldFVuaXF1ZUlEc1NlbGVjdCA9IDB4MDA2MAora1ZEU2VsZWN0VW5pcXVlSURzU2VsZWN0ID0gMHgwMDYxCitrWE1MUGFyc2VEYXRhUmVmU2VsZWN0ID0gMHgwMDAxCitrWE1MUGFyc2VGaWxlU2VsZWN0ID0gMHgwMDAyCitrWE1MUGFyc2VEaXNwb3NlWE1MRG9jU2VsZWN0ID0gMHgwMDAzCitrWE1MUGFyc2VHZXREZXRhaWxlZFBhcnNlRXJyb3JTZWxlY3QgPSAweDAwMDQKK2tYTUxQYXJzZUFkZEVsZW1lbnRTZWxlY3QgPSAweDAwMDUKK2tYTUxQYXJzZUFkZEF0dHJpYnV0ZVNlbGVjdCA9IDB4MDAwNgora1hNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzU2VsZWN0ID0gMHgwMDA3CitrWE1MUGFyc2VBZGRBdHRyaWJ1dGVBbmRWYWx1ZVNlbGVjdCA9IDB4MDAwOAora1hNTFBhcnNlQWRkTXVsdGlwbGVBdHRyaWJ1dGVzQW5kVmFsdWVzU2VsZWN0ID0gMHgwMDA5CitrWE1MUGFyc2VBZGRBdHRyaWJ1dGVWYWx1ZUtpbmRTZWxlY3QgPSAweDAwMEEKK2tYTUxQYXJzZUFkZE5hbWVTcGFjZVNlbGVjdCA9IDB4MDAwQgora1hNTFBhcnNlU2V0T2Zmc2V0QW5kTGltaXRTZWxlY3QgPSAweDAwMEMKK2tYTUxQYXJzZVNldEV2ZW50UGFyc2VSZWZDb25TZWxlY3QgPSAweDAwMEQKK2tYTUxQYXJzZVNldFN0YXJ0RG9jdW1lbnRIYW5kbGVyU2VsZWN0ID0gMHgwMDBFCitrWE1MUGFyc2VTZXRFbmREb2N1bWVudEhhbmRsZXJTZWxlY3QgPSAweDAwMEYKK2tYTUxQYXJzZVNldFN0YXJ0RWxlbWVudEhhbmRsZXJTZWxlY3QgPSAweDAwMTAKK2tYTUxQYXJzZVNldEVuZEVsZW1lbnRIYW5kbGVyU2VsZWN0ID0gMHgwMDExCitrWE1MUGFyc2VTZXRDaGFyRGF0YUhhbmRsZXJTZWxlY3QgPSAweDAwMTIKK2tYTUxQYXJzZVNldFByZXByb2Nlc3NJbnN0cnVjdGlvbkhhbmRsZXJTZWxlY3QgPSAweDAwMTMKK2tYTUxQYXJzZVNldENvbW1lbnRIYW5kbGVyU2VsZWN0ID0gMHgwMDE0CitrWE1MUGFyc2VTZXRDRGF0YUhhbmRsZXJTZWxlY3QgPSAweDAwMTUKK2tTR0luaXRpYWxpemVTZWxlY3QgPSAweDAwMDEKK2tTR1NldERhdGFPdXRwdXRTZWxlY3QgPSAweDAwMDIKK2tTR0dldERhdGFPdXRwdXRTZWxlY3QgPSAweDAwMDMKK2tTR1NldEdXb3JsZFNlbGVjdCA9IDB4MDAwNAora1NHR2V0R1dvcmxkU2VsZWN0ID0gMHgwMDA1CitrU0dOZXdDaGFubmVsU2VsZWN0ID0gMHgwMDA2CitrU0dEaXNwb3NlQ2hhbm5lbFNlbGVjdCA9IDB4MDAwNwora1NHU3RhcnRQcmV2aWV3U2VsZWN0ID0gMHgwMDEwCitrU0dTdGFydFJlY29yZFNlbGVjdCA9IDB4MDAxMQora1NHSWRsZVNlbGVjdCA9IDB4MDAxMgora1NHU3RvcFNlbGVjdCA9IDB4MDAxMwora1NHUGF1c2VTZWxlY3QgPSAweDAwMTQKK2tTR1ByZXBhcmVTZWxlY3QgPSAweDAwMTUKK2tTR1JlbGVhc2VTZWxlY3QgPSAweDAwMTYKK2tTR0dldE1vdmllU2VsZWN0ID0gMHgwMDE3CitrU0dTZXRNYXhpbXVtUmVjb3JkVGltZVNlbGVjdCA9IDB4MDAxOAora1NHR2V0TWF4aW11bVJlY29yZFRpbWVTZWxlY3QgPSAweDAwMTkKK2tTR0dldFN0b3JhZ2VTcGFjZVJlbWFpbmluZ1NlbGVjdCA9IDB4MDAxQQora1NHR2V0VGltZVJlbWFpbmluZ1NlbGVjdCA9IDB4MDAxQgora1NHR3JhYlBpY3RTZWxlY3QgPSAweDAwMUMKK2tTR0dldExhc3RNb3ZpZVJlc0lEU2VsZWN0ID0gMHgwMDFECitrU0dTZXRGbGFnc1NlbGVjdCA9IDB4MDAxRQora1NHR2V0RmxhZ3NTZWxlY3QgPSAweDAwMUYKK2tTR1NldERhdGFQcm9jU2VsZWN0ID0gMHgwMDIwCitrU0dOZXdDaGFubmVsRnJvbUNvbXBvbmVudFNlbGVjdCA9IDB4MDAyMQora1NHRGlzcG9zZURldmljZUxpc3RTZWxlY3QgPSAweDAwMjIKK2tTR0FwcGVuZERldmljZUxpc3RUb01lbnVTZWxlY3QgPSAweDAwMjMKK2tTR1NldFNldHRpbmdzU2VsZWN0ID0gMHgwMDI0CitrU0dHZXRTZXR0aW5nc1NlbGVjdCA9IDB4MDAyNQora1NHR2V0SW5kQ2hhbm5lbFNlbGVjdCA9IDB4MDAyNgora1NHVXBkYXRlU2VsZWN0ID0gMHgwMDI3CitrU0dHZXRQYXVzZVNlbGVjdCA9IDB4MDAyOAora1NHU2V0dGluZ3NEaWFsb2dTZWxlY3QgPSAweDAwMjkKK2tTR0dldEFsaWdubWVudFByb2NTZWxlY3QgPSAweDAwMkEKK2tTR1NldENoYW5uZWxTZXR0aW5nc1NlbGVjdCA9IDB4MDAyQgora1NHR2V0Q2hhbm5lbFNldHRpbmdzU2VsZWN0ID0gMHgwMDJDCitrU0dHZXRNb2RlU2VsZWN0ID0gMHgwMDJECitrU0dTZXREYXRhUmVmU2VsZWN0ID0gMHgwMDJFCitrU0dHZXREYXRhUmVmU2VsZWN0ID0gMHgwMDJGCitrU0dOZXdPdXRwdXRTZWxlY3QgPSAweDAwMzAKK2tTR0Rpc3Bvc2VPdXRwdXRTZWxlY3QgPSAweDAwMzEKK2tTR1NldE91dHB1dEZsYWdzU2VsZWN0ID0gMHgwMDMyCitrU0dTZXRDaGFubmVsT3V0cHV0U2VsZWN0ID0gMHgwMDMzCitrU0dHZXREYXRhT3V0cHV0U3RvcmFnZVNwYWNlUmVtYWluaW5nU2VsZWN0ID0gMHgwMDM0CitrU0dIYW5kbGVVcGRhdGVFdmVudFNlbGVjdCA9IDB4MDAzNQora1NHU2V0T3V0cHV0TmV4dE91dHB1dFNlbGVjdCA9IDB4MDAzNgora1NHR2V0T3V0cHV0TmV4dE91dHB1dFNlbGVjdCA9IDB4MDAzNwora1NHU2V0T3V0cHV0TWF4aW11bU9mZnNldFNlbGVjdCA9IDB4MDAzOAora1NHR2V0T3V0cHV0TWF4aW11bU9mZnNldFNlbGVjdCA9IDB4MDAzOQora1NHR2V0T3V0cHV0RGF0YVJlZmVyZW5jZVNlbGVjdCA9IDB4MDAzQQora1NHV3JpdGVFeHRlbmRlZE1vdmllRGF0YVNlbGVjdCA9IDB4MDAzQgora1NHR2V0U3RvcmFnZVNwYWNlUmVtYWluaW5nNjRTZWxlY3QgPSAweDAwM0MKK2tTR0dldERhdGFPdXRwdXRTdG9yYWdlU3BhY2VSZW1haW5pbmc2NFNlbGVjdCA9IDB4MDAzRAora1NHV3JpdGVNb3ZpZURhdGFTZWxlY3QgPSAweDAxMDAKK2tTR0FkZEZyYW1lUmVmZXJlbmNlU2VsZWN0ID0gMHgwMTAxCitrU0dHZXROZXh0RnJhbWVSZWZlcmVuY2VTZWxlY3QgPSAweDAxMDIKK2tTR0dldFRpbWVCYXNlU2VsZWN0ID0gMHgwMTAzCitrU0dTb3J0RGV2aWNlTGlzdFNlbGVjdCA9IDB4MDEwNAora1NHQWRkTW92aWVEYXRhU2VsZWN0ID0gMHgwMTA1CitrU0dDaGFuZ2VkU291cmNlU2VsZWN0ID0gMHgwMTA2CitrU0dBZGRFeHRlbmRlZEZyYW1lUmVmZXJlbmNlU2VsZWN0ID0gMHgwMTA3CitrU0dHZXROZXh0RXh0ZW5kZWRGcmFtZVJlZmVyZW5jZVNlbGVjdCA9IDB4MDEwOAora1NHQWRkRXh0ZW5kZWRNb3ZpZURhdGFTZWxlY3QgPSAweDAxMDkKK2tTR0FkZE91dHB1dERhdGFSZWZUb01lZGlhU2VsZWN0ID0gMHgwMTBBCitrU0dTZXRTZXR0aW5nc1N1bW1hcnlTZWxlY3QgPSAweDAxMEIKK2tTR1NldENoYW5uZWxVc2FnZVNlbGVjdCA9IDB4MDA4MAora1NHR2V0Q2hhbm5lbFVzYWdlU2VsZWN0ID0gMHgwMDgxCitrU0dTZXRDaGFubmVsQm91bmRzU2VsZWN0ID0gMHgwMDgyCitrU0dHZXRDaGFubmVsQm91bmRzU2VsZWN0ID0gMHgwMDgzCitrU0dTZXRDaGFubmVsVm9sdW1lU2VsZWN0ID0gMHgwMDg0CitrU0dHZXRDaGFubmVsVm9sdW1lU2VsZWN0ID0gMHgwMDg1CitrU0dHZXRDaGFubmVsSW5mb1NlbGVjdCA9IDB4MDA4Ngora1NHU2V0Q2hhbm5lbFBsYXlGbGFnc1NlbGVjdCA9IDB4MDA4Nwora1NHR2V0Q2hhbm5lbFBsYXlGbGFnc1NlbGVjdCA9IDB4MDA4OAora1NHU2V0Q2hhbm5lbE1heEZyYW1lc1NlbGVjdCA9IDB4MDA4OQora1NHR2V0Q2hhbm5lbE1heEZyYW1lc1NlbGVjdCA9IDB4MDA4QQora1NHU2V0Q2hhbm5lbFJlZkNvblNlbGVjdCA9IDB4MDA4Qgora1NHU2V0Q2hhbm5lbENsaXBTZWxlY3QgPSAweDAwOEMKK2tTR0dldENoYW5uZWxDbGlwU2VsZWN0ID0gMHgwMDhECitrU0dHZXRDaGFubmVsU2FtcGxlRGVzY3JpcHRpb25TZWxlY3QgPSAweDAwOEUKK2tTR0dldENoYW5uZWxEZXZpY2VMaXN0U2VsZWN0ID0gMHgwMDhGCitrU0dTZXRDaGFubmVsRGV2aWNlU2VsZWN0ID0gMHgwMDkwCitrU0dTZXRDaGFubmVsTWF0cml4U2VsZWN0ID0gMHgwMDkxCitrU0dHZXRDaGFubmVsTWF0cml4U2VsZWN0ID0gMHgwMDkyCitrU0dHZXRDaGFubmVsVGltZVNjYWxlU2VsZWN0ID0gMHgwMDkzCitrU0dDaGFubmVsUHV0UGljdHVyZVNlbGVjdCA9IDB4MDA5NAora1NHQ2hhbm5lbFNldFJlcXVlc3RlZERhdGFSYXRlU2VsZWN0ID0gMHgwMDk1CitrU0dDaGFubmVsR2V0UmVxdWVzdGVkRGF0YVJhdGVTZWxlY3QgPSAweDAwOTYKK2tTR0NoYW5uZWxTZXREYXRhU291cmNlTmFtZVNlbGVjdCA9IDB4MDA5Nwora1NHQ2hhbm5lbEdldERhdGFTb3VyY2VOYW1lU2VsZWN0ID0gMHgwMDk4CitrU0dDaGFubmVsU2V0Q29kZWNTZXR0aW5nc1NlbGVjdCA9IDB4MDA5OQora1NHQ2hhbm5lbEdldENvZGVjU2V0dGluZ3NTZWxlY3QgPSAweDAwOUEKK2tTR0dldENoYW5uZWxUaW1lQmFzZVNlbGVjdCA9IDB4MDA5Qgora1NHR2V0Q2hhbm5lbFJlZkNvblNlbGVjdCA9IDB4MDA5Qwora1NHR2V0Q2hhbm5lbERldmljZUFuZElucHV0TmFtZXNTZWxlY3QgPSAweDAwOUQKK2tTR1NldENoYW5uZWxEZXZpY2VJbnB1dFNlbGVjdCA9IDB4MDA5RQora1NHU2V0Q2hhbm5lbFNldHRpbmdzU3RhdGVDaGFuZ2luZ1NlbGVjdCA9IDB4MDA5Rgora1NHSW5pdENoYW5uZWxTZWxlY3QgPSAweDAxODAKK2tTR1dyaXRlU2FtcGxlc1NlbGVjdCA9IDB4MDE4MQora1NHR2V0RGF0YVJhdGVTZWxlY3QgPSAweDAxODIKK2tTR0FsaWduQ2hhbm5lbFJlY3RTZWxlY3QgPSAweDAxODMKK2tTR1BhbmVsR2V0RGl0bFNlbGVjdCA9IDB4MDIwMAora1NHUGFuZWxHZXRUaXRsZVNlbGVjdCA9IDB4MDIwMQora1NHUGFuZWxDYW5SdW5TZWxlY3QgPSAweDAyMDIKK2tTR1BhbmVsSW5zdGFsbFNlbGVjdCA9IDB4MDIwMwora1NHUGFuZWxFdmVudFNlbGVjdCA9IDB4MDIwNAora1NHUGFuZWxJdGVtU2VsZWN0ID0gMHgwMjA1CitrU0dQYW5lbFJlbW92ZVNlbGVjdCA9IDB4MDIwNgora1NHUGFuZWxTZXRHcmFiYmVyU2VsZWN0ID0gMHgwMjA3CitrU0dQYW5lbFNldFJlc0ZpbGVTZWxlY3QgPSAweDAyMDgKK2tTR1BhbmVsR2V0U2V0dGluZ3NTZWxlY3QgPSAweDAyMDkKK2tTR1BhbmVsU2V0U2V0dGluZ3NTZWxlY3QgPSAweDAyMEEKK2tTR1BhbmVsVmFsaWRhdGVJbnB1dFNlbGVjdCA9IDB4MDIwQgora1NHUGFuZWxTZXRFdmVudEZpbHRlclNlbGVjdCA9IDB4MDIwQwora1NHUGFuZWxHZXRESVRMRm9yU2l6ZVNlbGVjdCA9IDB4MDIwRAora1NHR2V0U3JjVmlkZW9Cb3VuZHNTZWxlY3QgPSAweDAxMDAKK2tTR1NldFZpZGVvUmVjdFNlbGVjdCA9IDB4MDEwMQora1NHR2V0VmlkZW9SZWN0U2VsZWN0ID0gMHgwMTAyCitrU0dHZXRWaWRlb0NvbXByZXNzb3JUeXBlU2VsZWN0ID0gMHgwMTAzCitrU0dTZXRWaWRlb0NvbXByZXNzb3JUeXBlU2VsZWN0ID0gMHgwMTA0CitrU0dTZXRWaWRlb0NvbXByZXNzb3JTZWxlY3QgPSAweDAxMDUKK2tTR0dldFZpZGVvQ29tcHJlc3NvclNlbGVjdCA9IDB4MDEwNgora1NHR2V0VmlkZW9EaWdpdGl6ZXJDb21wb25lbnRTZWxlY3QgPSAweDAxMDcKK2tTR1NldFZpZGVvRGlnaXRpemVyQ29tcG9uZW50U2VsZWN0ID0gMHgwMTA4CitrU0dWaWRlb0RpZ2l0aXplckNoYW5nZWRTZWxlY3QgPSAweDAxMDkKK2tTR1NldFZpZGVvQm90dGxlbmVja3NTZWxlY3QgPSAweDAxMEEKK2tTR0dldFZpZGVvQm90dGxlbmVja3NTZWxlY3QgPSAweDAxMEIKK2tTR0dyYWJGcmFtZVNlbGVjdCA9IDB4MDEwQwora1NHR3JhYkZyYW1lQ29tcGxldGVTZWxlY3QgPSAweDAxMEQKK2tTR0Rpc3BsYXlGcmFtZVNlbGVjdCA9IDB4MDEwRQora1NHQ29tcHJlc3NGcmFtZVNlbGVjdCA9IDB4MDEwRgora1NHQ29tcHJlc3NGcmFtZUNvbXBsZXRlU2VsZWN0ID0gMHgwMTEwCitrU0dBZGRGcmFtZVNlbGVjdCA9IDB4MDExMQora1NHVHJhbnNmZXJGcmFtZUZvckNvbXByZXNzU2VsZWN0ID0gMHgwMTEyCitrU0dTZXRDb21wcmVzc0J1ZmZlclNlbGVjdCA9IDB4MDExMwora1NHR2V0Q29tcHJlc3NCdWZmZXJTZWxlY3QgPSAweDAxMTQKK2tTR0dldEJ1ZmZlckluZm9TZWxlY3QgPSAweDAxMTUKK2tTR1NldFVzZVNjcmVlbkJ1ZmZlclNlbGVjdCA9IDB4MDExNgora1NHR2V0VXNlU2NyZWVuQnVmZmVyU2VsZWN0ID0gMHgwMTE3CitrU0dHcmFiQ29tcHJlc3NDb21wbGV0ZVNlbGVjdCA9IDB4MDExOAora1NHRGlzcGxheUNvbXByZXNzU2VsZWN0ID0gMHgwMTE5CitrU0dTZXRGcmFtZVJhdGVTZWxlY3QgPSAweDAxMUEKK2tTR0dldEZyYW1lUmF0ZVNlbGVjdCA9IDB4MDExQgora1NHU2V0UHJlZmVycmVkUGFja2V0U2l6ZVNlbGVjdCA9IDB4MDEyMQora1NHR2V0UHJlZmVycmVkUGFja2V0U2l6ZVNlbGVjdCA9IDB4MDEyMgora1NHU2V0VXNlclZpZGVvQ29tcHJlc3Nvckxpc3RTZWxlY3QgPSAweDAxMjMKK2tTR0dldFVzZXJWaWRlb0NvbXByZXNzb3JMaXN0U2VsZWN0ID0gMHgwMTI0CitrU0dTZXRTb3VuZElucHV0RHJpdmVyU2VsZWN0ID0gMHgwMTAwCitrU0dHZXRTb3VuZElucHV0RHJpdmVyU2VsZWN0ID0gMHgwMTAxCitrU0dTb3VuZElucHV0RHJpdmVyQ2hhbmdlZFNlbGVjdCA9IDB4MDEwMgora1NHU2V0U291bmRSZWNvcmRDaHVua1NpemVTZWxlY3QgPSAweDAxMDMKK2tTR0dldFNvdW5kUmVjb3JkQ2h1bmtTaXplU2VsZWN0ID0gMHgwMTA0CitrU0dTZXRTb3VuZElucHV0UmF0ZVNlbGVjdCA9IDB4MDEwNQora1NHR2V0U291bmRJbnB1dFJhdGVTZWxlY3QgPSAweDAxMDYKK2tTR1NldFNvdW5kSW5wdXRQYXJhbWV0ZXJzU2VsZWN0ID0gMHgwMTA3CitrU0dHZXRTb3VuZElucHV0UGFyYW1ldGVyc1NlbGVjdCA9IDB4MDEwOAora1NHU2V0QWRkaXRpb25hbFNvdW5kUmF0ZXNTZWxlY3QgPSAweDAxMDkKK2tTR0dldEFkZGl0aW9uYWxTb3VuZFJhdGVzU2VsZWN0ID0gMHgwMTBBCitrU0dTZXRGb250TmFtZVNlbGVjdCA9IDB4MDEwMAora1NHU2V0Rm9udFNpemVTZWxlY3QgPSAweDAxMDEKK2tTR1NldFRleHRGb3JlQ29sb3JTZWxlY3QgPSAweDAxMDIKK2tTR1NldFRleHRCYWNrQ29sb3JTZWxlY3QgPSAweDAxMDMKK2tTR1NldEp1c3RpZmljYXRpb25TZWxlY3QgPSAweDAxMDQKK2tTR0dldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWVTZWxlY3QgPSAweDAxMDUKK2tTR1NldFRleHRSZXR1cm5Ub1NwYWNlVmFsdWVTZWxlY3QgPSAweDAxMDYKK2tTR0dldEluc3RydW1lbnRTZWxlY3QgPSAweDAxMDAKK2tTR1NldEluc3RydW1lbnRTZWxlY3QgPSAweDAxMDEKK2tRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGVMaXN0U2VsZWN0ID0gMHgwMDAxCitrUVRWaWRlb091dHB1dEdldEN1cnJlbnRDbGllbnROYW1lU2VsZWN0ID0gMHgwMDAyCitrUVRWaWRlb091dHB1dFNldENsaWVudE5hbWVTZWxlY3QgPSAweDAwMDMKK2tRVFZpZGVvT3V0cHV0R2V0Q2xpZW50TmFtZVNlbGVjdCA9IDB4MDAwNAora1FUVmlkZW9PdXRwdXRCZWdpblNlbGVjdCA9IDB4MDAwNQora1FUVmlkZW9PdXRwdXRFbmRTZWxlY3QgPSAweDAwMDYKK2tRVFZpZGVvT3V0cHV0U2V0RGlzcGxheU1vZGVTZWxlY3QgPSAweDAwMDcKK2tRVFZpZGVvT3V0cHV0R2V0RGlzcGxheU1vZGVTZWxlY3QgPSAweDAwMDgKK2tRVFZpZGVvT3V0cHV0Q3VzdG9tQ29uZmlndXJlRGlzcGxheVNlbGVjdCA9IDB4MDAwOQora1FUVmlkZW9PdXRwdXRTYXZlU3RhdGVTZWxlY3QgPSAweDAwMEEKK2tRVFZpZGVvT3V0cHV0UmVzdG9yZVN0YXRlU2VsZWN0ID0gMHgwMDBCCitrUVRWaWRlb091dHB1dEdldEdXb3JsZFNlbGVjdCA9IDB4MDAwQwora1FUVmlkZW9PdXRwdXRHZXRHV29ybGRQYXJhbWV0ZXJzU2VsZWN0ID0gMHgwMDBECitrUVRWaWRlb091dHB1dEdldEluZFNvdW5kT3V0cHV0U2VsZWN0ID0gMHgwMDBFCitrUVRWaWRlb091dHB1dEdldENsb2NrU2VsZWN0ID0gMHgwMDBGCitrUVRWaWRlb091dHB1dFNldEVjaG9Qb3J0U2VsZWN0ID0gMHgwMDEwCitrUVRWaWRlb091dHB1dEdldEluZEltYWdlRGVjb21wcmVzc29yU2VsZWN0ID0gMHgwMDExCitrUVRWaWRlb091dHB1dEJhc2VTZXRFY2hvUG9ydFNlbGVjdCA9IDB4MDAxMgoraGFuZGxlckhhc1NwYXRpYWwgPSAxIDw8IDAKK2hhbmRsZXJDYW5DbGlwID0gMSA8PCAxCitoYW5kbGVyQ2FuTWF0dGUgPSAxIDw8IDIKK2hhbmRsZXJDYW5UcmFuc2Zlck1vZGUgPSAxIDw8IDMKK2hhbmRsZXJOZWVkc0J1ZmZlciA9IDEgPDwgNAoraGFuZGxlck5vSWRsZSA9IDEgPDwgNQoraGFuZGxlck5vU2NoZWR1bGVyID0gMSA8PCA2CitoYW5kbGVyV2FudHNUaW1lID0gMSA8PCA3CitoYW5kbGVyQ0dyYWZQb3J0T25seSA9IDEgPDwgOAoraGFuZGxlckNhblNlbmQgPSAxIDw8IDkKK2hhbmRsZXJDYW5IYW5kbGVDb21wbGV4TWF0cml4ID0gMSA8PCAxMAoraGFuZGxlcldhbnRzRGVzdGluYXRpb25QaXhlbHMgPSAxIDw8IDExCitoYW5kbGVyQ2FuU2VuZEltYWdlRGF0YSA9IDEgPDwgMTIKK2hhbmRsZXJDYW5QaWNTYXZlID0gMSA8PCAxMworbU11c3REcmF3ID0gMSA8PCAzCittQXRFbmQgPSAxIDw8IDQKK21QcmVmbGlnaHREcmF3ID0gMSA8PCA1CittU3luY0RyYXdpbmcgPSAxIDw8IDYKK21QcmVjb21wb3NpdGVPbmx5ID0gMSA8PCA5CittU291bmRPbmx5ID0gMSA8PCAxMAorbURvSWRsZUFjdGlvbnNCZWZvcmVEcmF3cyA9IDEgPDwgMTEKK21EaXNhYmxlSWRsZUFjdGlvbnMgPSAxIDw8IDEyCittRGlkRHJhdyA9IDEgPDwgMAorbU5lZWRzVG9EcmF3ID0gMSA8PCAyCittRHJhd0FnYWluID0gMSA8PCAzCittUGFydGlhbERyYXcgPSAxIDw8IDQKK21XYW50SWRsZUFjdGlvbnMgPSAxIDw8IDUKK2ZvcmNlVXBkYXRlUmVkcmF3ID0gMSA8PCAwCitmb3JjZVVwZGF0ZU5ld0J1ZmZlciA9IDEgPDwgMQorbUhpdFRlc3RCb3VuZHMgPSAxTCA8PCAwCittSGl0VGVzdEltYWdlID0gMUwgPDwgMQorbUhpdFRlc3RJbnZpc2libGUgPSAxTCA8PCAyCittSGl0VGVzdElzQ2xpY2sgPSAxTCA8PCAzCittT3BhcXVlID0gMUwgPDwgMAorbUludmlzaWJsZSA9IDFMIDw8IDEKK2tNZWRpYVFUSWRsZUZyZXF1ZW5jeVNlbGVjdG9yID0gRk9VUl9DSEFSX0NPREUoJ2lkZnEnKQora01lZGlhVmlkZW9QYXJhbUJyaWdodG5lc3MgPSAxCitrTWVkaWFWaWRlb1BhcmFtQ29udHJhc3QgPSAyCitrTWVkaWFWaWRlb1BhcmFtSHVlID0gMwora01lZGlhVmlkZW9QYXJhbVNoYXJwbmVzcyA9IDQKK2tNZWRpYVZpZGVvUGFyYW1TYXR1cmF0aW9uID0gNQora01lZGlhVmlkZW9QYXJhbUJsYWNrTGV2ZWwgPSA2CitrTWVkaWFWaWRlb1BhcmFtV2hpdGVMZXZlbCA9IDcKK2tNSEluZm9FbmNvZGVkRnJhbWVSYXRlID0gRk9VUl9DSEFSX0NPREUoJ29yYXQnKQora0VtcHR5UHVyZ2FibGVDaHVua3NPdmVyQWxsb3dhbmNlID0gMQora0NhbGxDb21wb25lbnRFeGVjdXRlV2lyZWRBY3Rpb25TZWxlY3QgPSAtOQora01lZGlhU2V0Q2h1bmtNYW5hZ2VtZW50RmxhZ3NTZWxlY3QgPSAweDA0MTUKK2tNZWRpYUdldENodW5rTWFuYWdlbWVudEZsYWdzU2VsZWN0ID0gMHgwNDE2CitrTWVkaWFTZXRQdXJnZWFibGVDaHVua01lbW9yeUFsbG93YW5jZVNlbGVjdCA9IDB4MDQxNwora01lZGlhR2V0UHVyZ2VhYmxlQ2h1bmtNZW1vcnlBbGxvd2FuY2VTZWxlY3QgPSAweDA0MTgKK2tNZWRpYUVtcHR5QWxsUHVyZ2VhYmxlQ2h1bmtzU2VsZWN0ID0gMHgwNDE5CitrTWVkaWFJbml0aWFsaXplU2VsZWN0ID0gMHgwNTAxCitrTWVkaWFTZXRIYW5kbGVyQ2FwYWJpbGl0aWVzU2VsZWN0ID0gMHgwNTAyCitrTWVkaWFJZGxlU2VsZWN0ID0gMHgwNTAzCitrTWVkaWFHZXRNZWRpYUluZm9TZWxlY3QgPSAweDA1MDQKK2tNZWRpYVB1dE1lZGlhSW5mb1NlbGVjdCA9IDB4MDUwNQora01lZGlhU2V0QWN0aXZlU2VsZWN0ID0gMHgwNTA2CitrTWVkaWFTZXRSYXRlU2VsZWN0ID0gMHgwNTA3CitrTWVkaWFHR2V0U3RhdHVzU2VsZWN0ID0gMHgwNTA4CitrTWVkaWFUcmFja0VkaXRlZFNlbGVjdCA9IDB4MDUwOQora01lZGlhU2V0TWVkaWFUaW1lU2NhbGVTZWxlY3QgPSAweDA1MEEKK2tNZWRpYVNldE1vdmllVGltZVNjYWxlU2VsZWN0ID0gMHgwNTBCCitrTWVkaWFTZXRHV29ybGRTZWxlY3QgPSAweDA1MEMKK2tNZWRpYVNldERpbWVuc2lvbnNTZWxlY3QgPSAweDA1MEQKK2tNZWRpYVNldENsaXBTZWxlY3QgPSAweDA1MEUKK2tNZWRpYVNldE1hdHJpeFNlbGVjdCA9IDB4MDUwRgora01lZGlhR2V0VHJhY2tPcGFxdWVTZWxlY3QgPSAweDA1MTAKK2tNZWRpYVNldEdyYXBoaWNzTW9kZVNlbGVjdCA9IDB4MDUxMQora01lZGlhR2V0R3JhcGhpY3NNb2RlU2VsZWN0ID0gMHgwNTEyCitrTWVkaWFHU2V0Vm9sdW1lU2VsZWN0ID0gMHgwNTEzCitrTWVkaWFTZXRTb3VuZEJhbGFuY2VTZWxlY3QgPSAweDA1MTQKK2tNZWRpYUdldFNvdW5kQmFsYW5jZVNlbGVjdCA9IDB4MDUxNQora01lZGlhR2V0TmV4dEJvdW5kc0NoYW5nZVNlbGVjdCA9IDB4MDUxNgora01lZGlhR2V0U3JjUmduU2VsZWN0ID0gMHgwNTE3CitrTWVkaWFQcmVyb2xsU2VsZWN0ID0gMHgwNTE4CitrTWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNoYW5nZWRTZWxlY3QgPSAweDA1MTkKK2tNZWRpYUhhc0NoYXJhY3RlcmlzdGljU2VsZWN0ID0gMHgwNTFBCitrTWVkaWFHZXRPZmZzY3JlZW5CdWZmZXJTaXplU2VsZWN0ID0gMHgwNTFCCitrTWVkaWFTZXRIaW50c1NlbGVjdCA9IDB4MDUxQwora01lZGlhR2V0TmFtZVNlbGVjdCA9IDB4MDUxRAora01lZGlhRm9yY2VVcGRhdGVTZWxlY3QgPSAweDA1MUUKK2tNZWRpYUdldERyYXdpbmdSZ25TZWxlY3QgPSAweDA1MUYKK2tNZWRpYUdTZXRBY3RpdmVTZWdtZW50U2VsZWN0ID0gMHgwNTIwCitrTWVkaWFJbnZhbGlkYXRlUmVnaW9uU2VsZWN0ID0gMHgwNTIxCitrTWVkaWFHZXROZXh0U3RlcFRpbWVTZWxlY3QgPSAweDA1MjIKK2tNZWRpYVNldE5vblByaW1hcnlTb3VyY2VEYXRhU2VsZWN0ID0gMHgwNTIzCitrTWVkaWFDaGFuZ2VkTm9uUHJpbWFyeVNvdXJjZVNlbGVjdCA9IDB4MDUyNAora01lZGlhVHJhY2tSZWZlcmVuY2VzQ2hhbmdlZFNlbGVjdCA9IDB4MDUyNQora01lZGlhR2V0U2FtcGxlRGF0YVBvaW50ZXJTZWxlY3QgPSAweDA1MjYKK2tNZWRpYVJlbGVhc2VTYW1wbGVEYXRhUG9pbnRlclNlbGVjdCA9IDB4MDUyNwora01lZGlhVHJhY2tQcm9wZXJ0eUF0b21DaGFuZ2VkU2VsZWN0ID0gMHgwNTI4CitrTWVkaWFTZXRUcmFja0lucHV0TWFwUmVmZXJlbmNlU2VsZWN0ID0gMHgwNTI5CitrTWVkaWFTZXRWaWRlb1BhcmFtU2VsZWN0ID0gMHgwNTJCCitrTWVkaWFHZXRWaWRlb1BhcmFtU2VsZWN0ID0gMHgwNTJDCitrTWVkaWFDb21wYXJlU2VsZWN0ID0gMHgwNTJECitrTWVkaWFHZXRDbG9ja1NlbGVjdCA9IDB4MDUyRQora01lZGlhU2V0U291bmRPdXRwdXRDb21wb25lbnRTZWxlY3QgPSAweDA1MkYKK2tNZWRpYUdldFNvdW5kT3V0cHV0Q29tcG9uZW50U2VsZWN0ID0gMHgwNTMwCitrTWVkaWFTZXRTb3VuZExvY2FsaXphdGlvbkRhdGFTZWxlY3QgPSAweDA1MzEKK2tNZWRpYUdldEludmFsaWRSZWdpb25TZWxlY3QgPSAweDA1M0MKK2tNZWRpYVNhbXBsZURlc2NyaXB0aW9uQjJOU2VsZWN0ID0gMHgwNTNFCitrTWVkaWFTYW1wbGVEZXNjcmlwdGlvbk4yQlNlbGVjdCA9IDB4MDUzRgora01lZGlhUXVldWVOb25QcmltYXJ5U291cmNlRGF0YVNlbGVjdCA9IDB4MDU0MAora01lZGlhRmx1c2hOb25QcmltYXJ5U291cmNlRGF0YVNlbGVjdCA9IDB4MDU0MQora01lZGlhR2V0VVJMTGlua1NlbGVjdCA9IDB4MDU0Mwora01lZGlhTWFrZU1lZGlhVGltZVRhYmxlU2VsZWN0ID0gMHgwNTQ1CitrTWVkaWFIaXRUZXN0Rm9yVGFyZ2V0UmVmQ29uU2VsZWN0ID0gMHgwNTQ2CitrTWVkaWFIaXRUZXN0VGFyZ2V0UmVmQ29uU2VsZWN0ID0gMHgwNTQ3CitrTWVkaWFHZXRBY3Rpb25zRm9yUVRFdmVudFNlbGVjdCA9IDB4MDU0OAora01lZGlhRGlzcG9zZVRhcmdldFJlZkNvblNlbGVjdCA9IDB4MDU0OQora01lZGlhVGFyZ2V0UmVmQ29uc0VxdWFsU2VsZWN0ID0gMHgwNTRBCitrTWVkaWFTZXRBY3Rpb25zQ2FsbGJhY2tTZWxlY3QgPSAweDA1NEIKK2tNZWRpYVByZVByZXJvbGxCZWdpblNlbGVjdCA9IDB4MDU0Qwora01lZGlhUHJlUHJlcm9sbENhbmNlbFNlbGVjdCA9IDB4MDU0RAora01lZGlhRW50ZXJFbXB0eUVkaXRTZWxlY3QgPSAweDA1NEYKK2tNZWRpYUN1cnJlbnRNZWRpYVF1ZXVlZERhdGFTZWxlY3QgPSAweDA1NTAKK2tNZWRpYUdldEVmZmVjdGl2ZVZvbHVtZVNlbGVjdCA9IDB4MDU1MQora01lZGlhUmVzb2x2ZVRhcmdldFJlZkNvblNlbGVjdCA9IDB4MDU1Mgora01lZGlhR2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZFNlbGVjdCA9IDB4MDU1Mwora01lZGlhU2V0U291bmRMZXZlbE1ldGVyaW5nRW5hYmxlZFNlbGVjdCA9IDB4MDU1NAora01lZGlhR2V0U291bmRMZXZlbE1ldGVySW5mb1NlbGVjdCA9IDB4MDU1NQora01lZGlhR2V0RWZmZWN0aXZlU291bmRCYWxhbmNlU2VsZWN0ID0gMHgwNTU2CitrTWVkaWFTZXRTY3JlZW5Mb2NrU2VsZWN0ID0gMHgwNTU3CitrTWVkaWFTZXREb01DQWN0aW9uQ2FsbGJhY2tTZWxlY3QgPSAweDA1NTgKK2tNZWRpYUdldEVycm9yU3RyaW5nU2VsZWN0ID0gMHgwNTU5CitrTWVkaWFHZXRTb3VuZEVxdWFsaXplckJhbmRzU2VsZWN0ID0gMHgwNTVBCitrTWVkaWFTZXRTb3VuZEVxdWFsaXplckJhbmRzU2VsZWN0ID0gMHgwNTVCCitrTWVkaWFHZXRTb3VuZEVxdWFsaXplckJhbmRMZXZlbHNTZWxlY3QgPSAweDA1NUMKK2tNZWRpYURvSWRsZUFjdGlvbnNTZWxlY3QgPSAweDA1NUQKK2tNZWRpYVNldFNvdW5kQmFzc0FuZFRyZWJsZVNlbGVjdCA9IDB4MDU1RQora01lZGlhR2V0U291bmRCYXNzQW5kVHJlYmxlU2VsZWN0ID0gMHgwNTVGCitrTWVkaWFUaW1lQmFzZUNoYW5nZWRTZWxlY3QgPSAweDA1NjAKK2tNZWRpYU1DSXNQbGF5ZXJFdmVudFNlbGVjdCA9IDB4MDU2MQora01lZGlhR2V0TWVkaWFMb2FkU3RhdGVTZWxlY3QgPSAweDA1NjIKK2tNZWRpYVZpZGVvT3V0cHV0Q2hhbmdlZFNlbGVjdCA9IDB4MDU2Mwora01lZGlhRW1wdHlTYW1wbGVDYWNoZVNlbGVjdCA9IDB4MDU2NAora01lZGlhR2V0UHVibGljSW5mb1NlbGVjdCA9IDB4MDU2NQora01lZGlhU2V0UHVibGljSW5mb1NlbGVjdCA9IDB4MDU2Ngora01lZGlhR2V0VXNlclByZWZlcnJlZENvZGVjc1NlbGVjdCA9IDB4MDU2Nwora01lZGlhU2V0VXNlclByZWZlcnJlZENvZGVjc1NlbGVjdCA9IDB4MDU2OAora01lZGlhUmVmQ29uU2V0UHJvcGVydHlTZWxlY3QgPSAweDA1NjkKK2tNZWRpYVJlZkNvbkdldFByb3BlcnR5U2VsZWN0ID0gMHgwNTZBCitrTWVkaWFOYXZpZ2F0ZVRhcmdldFJlZkNvblNlbGVjdCA9IDB4MDU2Qgora01lZGlhR0dldElkbGVNYW5hZ2VyU2VsZWN0ID0gMHgwNTZDCitrTWVkaWFHU2V0SWRsZU1hbmFnZXJTZWxlY3QgPSAweDA1NkQKK2thaVRvbmVEZXNjVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0b25lJykKK2thaU5vdGVSZXF1ZXN0SW5mb1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbnRycScpCitrYWlLbm9iTGlzdFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgna25ibCcpCitrYWlLZXlSYW5nZUluZm9UeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NpbmYnKQora2FpU2FtcGxlRGVzY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc2RzYycpCitrYWlTYW1wbGVJbmZvVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzbWluJykKK2thaVNhbXBsZURhdGFUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NkYXQnKQora2FpU2FtcGxlRGF0YVFVSURUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3F1aWQnKQora2FpSW5zdEluZm9UeXBlID0gRk9VUl9DSEFSX0NPREUoJ2lpbmYnKQora2FpUGljdFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncGljdCcpCitrYWlXcml0ZXJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ1x4YTl3cnQnKQora2FpQ29weXJpZ2h0VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdceGE5Y3B5JykKK2thaU90aGVyU3RyVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzdHIgJykKK2thaUluc3RydW1lbnRSZWZUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2lyZWYnKQora2FpSW5zdEdNUXVhbGl0eVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgncXVhbCcpCitrYWlMaWJyYXJ5SW5mb1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbGluZicpCitrYWlMaWJyYXJ5RGVzY1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbGRzYycpCitrSW5zdEtub2JNaXNzaW5nVW5rbm93biA9IDAKK2tJbnN0S25vYk1pc3NpbmdEZWZhdWx0ID0gKDEgPDwgMCkKK2tNdXNpY0xvb3BUeXBlTm9ybWFsID0gMAora011c2ljTG9vcFR5cGVQYWxpbmRyb21lID0gMQoraW5zdFNhbXBsZVByZVByb2Nlc3NGbGFnID0gMSA8PCAwCitrUVRNSURJQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtaWRpJykKK2tPTVNDb21wb25lbnRTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ09NUyAnKQora0ZNU0NvbXBvbmVudFN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnRk1TICcpCitrTUlESU1hbmFnZXJDb21wb25lbnRTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ21tZ3InKQora09TWE1JRElDb21wb25lbnRTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ29zeG0nKQora011c2ljUGFja2V0UG9ydExvc3QgPSAxCitrTXVzaWNQYWNrZXRQb3J0Rm91bmQgPSAyCitrTXVzaWNQYWNrZXRUaW1lR2FwID0gMwora0FwcGxlU3lzZXhJRCA9IDB4MTEKK2tBcHBsZVN5c2V4Q21kU2FtcGxlU2l6ZSA9IDB4MDAwMQora0FwcGxlU3lzZXhDbWRTYW1wbGVCcmVhayA9IDB4MDAwMgora0FwcGxlU3lzZXhDbWRBdG9taWNJbnN0cnVtZW50ID0gMHgwMDEwCitrQXBwbGVTeXNleENtZERldmVsb3BlciA9IDB4N0YwMAora1N5bnRoZXNpemVyQ29ubmVjdGlvbkZNUyA9IDEKK2tTeW50aGVzaXplckNvbm5lY3Rpb25NTWdyID0gMgora1N5bnRoZXNpemVyQ29ubmVjdGlvbk9NUyA9IDQKK2tTeW50aGVzaXplckNvbm5lY3Rpb25RVCA9IDgKK2tTeW50aGVzaXplckNvbm5lY3Rpb25PU1hNSURJID0gMTYKK2tTeW50aGVzaXplckNvbm5lY3Rpb25VbmF2YWlsYWJsZSA9IDI1Ngora011c2ljQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtdXNpJykKK2tJbnN0cnVtZW50Q29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbnN0JykKK2tTb2Z0U3ludGhDb21wb25lbnRTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NzICAnKQora0dNU3ludGhDb21wb25lbnRTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2dtICAnKQora1N5bnRoZXNpemVyRHluYW1pY1ZvaWNlID0gMSA8PCAwCitrU3ludGhlc2l6ZXJVc2VzTUlESVBvcnQgPSAxIDw8IDEKK2tTeW50aGVzaXplck1pY3JvdG9uZSA9IDEgPDwgMgora1N5bnRoZXNpemVySGFzU2FtcGxlcyA9IDEgPDwgMwora1N5bnRoZXNpemVyTWl4ZWREcnVtcyA9IDEgPDwgNAora1N5bnRoZXNpemVyU29mdHdhcmUgPSAxIDw8IDUKK2tTeW50aGVzaXplckhhcmR3YXJlID0gMSA8PCA2CitrU3ludGhlc2l6ZXJEeW5hbWljQ2hhbm5lbCA9IDEgPDwgNwora1N5bnRoZXNpemVySG9nc1N5c3RlbUNoYW5uZWwgPSAxIDw8IDgKK2tTeW50aGVzaXplckhhc1N5c3RlbUNoYW5uZWwgPSAxIDw8IDkKK2tTeW50aGVzaXplclNsb3dTZXRQYXJ0ID0gMSA8PCAxMAora1N5bnRoZXNpemVyT2ZmbGluZSA9IDEgPDwgMTIKK2tTeW50aGVzaXplckdNID0gMSA8PCAxNAora1N5bnRoZXNpemVyRExTID0gMSA8PCAxNQora1N5bnRoZXNpemVyU291bmRMb2NhbGl6YXRpb24gPSAxIDw8IDE2CitrQ29udHJvbGxlck1vZHVsYXRpb25XaGVlbCA9IDEKK2tDb250cm9sbGVyQnJlYXRoID0gMgora0NvbnRyb2xsZXJGb290ID0gNAora0NvbnRyb2xsZXJQb3J0YW1lbnRvVGltZSA9IDUKK2tDb250cm9sbGVyVm9sdW1lID0gNwora0NvbnRyb2xsZXJCYWxhbmNlID0gOAora0NvbnRyb2xsZXJQYW4gPSAxMAora0NvbnRyb2xsZXJFeHByZXNzaW9uID0gMTEKK2tDb250cm9sbGVyTGV2ZXIxID0gMTYKK2tDb250cm9sbGVyTGV2ZXIyID0gMTcKK2tDb250cm9sbGVyTGV2ZXIzID0gMTgKK2tDb250cm9sbGVyTGV2ZXI0ID0gMTkKK2tDb250cm9sbGVyTGV2ZXI1ID0gODAKK2tDb250cm9sbGVyTGV2ZXI2ID0gODEKK2tDb250cm9sbGVyTGV2ZXI3ID0gODIKK2tDb250cm9sbGVyTGV2ZXI4ID0gODMKK2tDb250cm9sbGVyUGl0Y2hCZW5kID0gMzIKK2tDb250cm9sbGVyQWZ0ZXJUb3VjaCA9IDMzCitrQ29udHJvbGxlclBhcnRUcmFuc3Bvc2UgPSA0MAora0NvbnRyb2xsZXJUdW5lVHJhbnNwb3NlID0gNDEKK2tDb250cm9sbGVyUGFydFZvbHVtZSA9IDQyCitrQ29udHJvbGxlclR1bmVWb2x1bWUgPSA0Mwora0NvbnRyb2xsZXJTdXN0YWluID0gNjQKK2tDb250cm9sbGVyUG9ydGFtZW50byA9IDY1CitrQ29udHJvbGxlclNvc3RlbnV0byA9IDY2CitrQ29udHJvbGxlclNvZnRQZWRhbCA9IDY3CitrQ29udHJvbGxlclJldmVyYiA9IDkxCitrQ29udHJvbGxlclRyZW1vbG8gPSA5Mgora0NvbnRyb2xsZXJDaG9ydXMgPSA5Mwora0NvbnRyb2xsZXJDZWxlc3RlID0gOTQKK2tDb250cm9sbGVyUGhhc2VyID0gOTUKK2tDb250cm9sbGVyRWRpdFBhcnQgPSAxMTMKK2tDb250cm9sbGVyTWFzdGVyVHVuZSA9IDExNAora0NvbnRyb2xsZXJNYXN0ZXJUcmFuc3Bvc2UgPSAxMTQKK2tDb250cm9sbGVyTWFzdGVyVm9sdW1lID0gMTE1CitrQ29udHJvbGxlck1hc3RlckNQVUxvYWQgPSAxMTYKK2tDb250cm9sbGVyTWFzdGVyUG9seXBob255ID0gMTE3CitrQ29udHJvbGxlck1hc3RlckZlYXR1cmVzID0gMTE4CitrUVRNU0tub2JTdGFydElEID0gMHgwMjAwMDAwMAora1FUTVNLbm9iVm9sdW1lQXR0YWNrVGltZUlEID0gMHgwMjAwMDAwMQora1FUTVNLbm9iVm9sdW1lRGVjYXlUaW1lSUQgPSAweDAyMDAwMDAyCitrUVRNU0tub2JWb2x1bWVTdXN0YWluTGV2ZWxJRCA9IDB4MDIwMDAwMDMKK2tRVE1TS25vYlZvbHVtZVJlbGVhc2UxUmF0ZUlEID0gMHgwMjAwMDAwNAora1FUTVNLbm9iVm9sdW1lRGVjYXlLZXlTY2FsaW5nSUQgPSAweDAyMDAwMDA1CitrUVRNU0tub2JWb2x1bWVSZWxlYXNlVGltZUlEID0gMHgwMjAwMDAwNgora1FUTVNLbm9iVm9sdW1lTEZPRGVsYXlJRCA9IDB4MDIwMDAwMDcKK2tRVE1TS25vYlZvbHVtZUxGT1JhbXBUaW1lSUQgPSAweDAyMDAwMDA4CitrUVRNU0tub2JWb2x1bWVMRk9QZXJpb2RJRCA9IDB4MDIwMDAwMDkKK2tRVE1TS25vYlZvbHVtZUxGT1NoYXBlSUQgPSAweDAyMDAwMDBBCitrUVRNU0tub2JWb2x1bWVMRk9EZXB0aElEID0gMHgwMjAwMDAwQgora1FUTVNLbm9iVm9sdW1lT3ZlcmFsbElEID0gMHgwMjAwMDAwQwora1FUTVNLbm9iVm9sdW1lVmVsb2NpdHkxMjdJRCA9IDB4MDIwMDAwMEQKK2tRVE1TS25vYlZvbHVtZVZlbG9jaXR5OTZJRCA9IDB4MDIwMDAwMEUKK2tRVE1TS25vYlZvbHVtZVZlbG9jaXR5NjRJRCA9IDB4MDIwMDAwMEYKK2tRVE1TS25vYlZvbHVtZVZlbG9jaXR5MzJJRCA9IDB4MDIwMDAwMTAKK2tRVE1TS25vYlZvbHVtZVZlbG9jaXR5MTZJRCA9IDB4MDIwMDAwMTEKK2tRVE1TS25vYlBpdGNoVHJhbnNwb3NlSUQgPSAweDAyMDAwMDEyCitrUVRNU0tub2JQaXRjaExGT0RlbGF5SUQgPSAweDAyMDAwMDEzCitrUVRNU0tub2JQaXRjaExGT1JhbXBUaW1lSUQgPSAweDAyMDAwMDE0CitrUVRNU0tub2JQaXRjaExGT1BlcmlvZElEID0gMHgwMjAwMDAxNQora1FUTVNLbm9iUGl0Y2hMRk9TaGFwZUlEID0gMHgwMjAwMDAxNgora1FUTVNLbm9iUGl0Y2hMRk9EZXB0aElEID0gMHgwMjAwMDAxNwora1FUTVNLbm9iUGl0Y2hMRk9RdWFudGl6ZUlEID0gMHgwMjAwMDAxOAora1FUTVNLbm9iU3RlcmVvRGVmYXVsdFBhbklEID0gMHgwMjAwMDAxOQora1FUTVNLbm9iU3RlcmVvUG9zaXRpb25LZXlTY2FsaW5nSUQgPSAweDAyMDAwMDFBCitrUVRNU0tub2JQaXRjaExGT09mZnNldElEID0gMHgwMjAwMDAxQgora1FUTVNLbm9iRXhjbHVzaW9uR3JvdXBJRCA9IDB4MDIwMDAwMUMKK2tRVE1TS25vYlN1c3RhaW5UaW1lSUQgPSAweDAyMDAwMDFECitrUVRNU0tub2JTdXN0YWluSW5maW5pdGVJRCA9IDB4MDIwMDAwMUUKK2tRVE1TS25vYlZvbHVtZUxGT1N0ZXJlb0lEID0gMHgwMjAwMDAxRgora1FUTVNLbm9iVmVsb2NpdHlMb3dJRCA9IDB4MDIwMDAwMjAKK2tRVE1TS25vYlZlbG9jaXR5SGlnaElEID0gMHgwMjAwMDAyMQora1FUTVNLbm9iVmVsb2NpdHlTZW5zaXRpdml0eUlEID0gMHgwMjAwMDAyMgora1FUTVNLbm9iUGl0Y2hTZW5zaXRpdml0eUlEID0gMHgwMjAwMDAyMwora1FUTVNLbm9iVm9sdW1lTEZPRGVwdGhGcm9tV2hlZWxJRCA9IDB4MDIwMDAwMjQKK2tRVE1TS25vYlBpdGNoTEZPRGVwdGhGcm9tV2hlZWxJRCA9IDB4MDIwMDAwMjUKK2tRVE1TS25vYlZvbHVtZUV4cE9wdGlvbnNJRCA9IDB4MDIwMDAwMjYKK2tRVE1TS25vYkVudjFBdHRhY2tUaW1lSUQgPSAweDAyMDAwMDI3CitrUVRNU0tub2JFbnYxRGVjYXlUaW1lSUQgPSAweDAyMDAwMDI4CitrUVRNU0tub2JFbnYxU3VzdGFpbkxldmVsSUQgPSAweDAyMDAwMDI5CitrUVRNU0tub2JFbnYxU3VzdGFpblRpbWVJRCA9IDB4MDIwMDAwMkEKK2tRVE1TS25vYkVudjFTdXN0YWluSW5maW5pdGVJRCA9IDB4MDIwMDAwMkIKK2tRVE1TS25vYkVudjFSZWxlYXNlVGltZUlEID0gMHgwMjAwMDAyQwora1FUTVNLbm9iRW52MUV4cE9wdGlvbnNJRCA9IDB4MDIwMDAwMkQKK2tRVE1TS25vYkVudjJBdHRhY2tUaW1lSUQgPSAweDAyMDAwMDJFCitrUVRNU0tub2JFbnYyRGVjYXlUaW1lSUQgPSAweDAyMDAwMDJGCitrUVRNU0tub2JFbnYyU3VzdGFpbkxldmVsSUQgPSAweDAyMDAwMDMwCitrUVRNU0tub2JFbnYyU3VzdGFpblRpbWVJRCA9IDB4MDIwMDAwMzEKK2tRVE1TS25vYkVudjJTdXN0YWluSW5maW5pdGVJRCA9IDB4MDIwMDAwMzIKK2tRVE1TS25vYkVudjJSZWxlYXNlVGltZUlEID0gMHgwMjAwMDAzMwora1FUTVNLbm9iRW52MkV4cE9wdGlvbnNJRCA9IDB4MDIwMDAwMzQKK2tRVE1TS25vYlBpdGNoRW52ZWxvcGVJRCA9IDB4MDIwMDAwMzUKK2tRVE1TS25vYlBpdGNoRW52ZWxvcGVEZXB0aElEID0gMHgwMjAwMDAzNgora1FUTVNLbm9iRmlsdGVyS2V5Rm9sbG93SUQgPSAweDAyMDAwMDM3CitrUVRNU0tub2JGaWx0ZXJUcmFuc3Bvc2VJRCA9IDB4MDIwMDAwMzgKK2tRVE1TS25vYkZpbHRlclFJRCA9IDB4MDIwMDAwMzkKK2tRVE1TS25vYkZpbHRlckZyZXF1ZW5jeUVudmVsb3BlSUQgPSAweDAyMDAwMDNBCitrUVRNU0tub2JGaWx0ZXJGcmVxdWVuY3lFbnZlbG9wZURlcHRoSUQgPSAweDAyMDAwMDNCCitrUVRNU0tub2JGaWx0ZXJRRW52ZWxvcGVJRCA9IDB4MDIwMDAwM0MKK2tRVE1TS25vYkZpbHRlclFFbnZlbG9wZURlcHRoSUQgPSAweDAyMDAwMDNECitrUVRNU0tub2JSZXZlcmJUaHJlc2hvbGRJRCA9IDB4MDIwMDAwM0UKK2tRVE1TS25vYlZvbHVtZUF0dGFja1ZlbFNjYWxpbmdJRCA9IDB4MDIwMDAwM0YKK2tRVE1TS25vYkxhc3RJRFBsdXMxID0gMHgwMjAwMDA0MAora0NvbnRyb2xsZXJNYXhpbXVtID0gMHgwMDAwN0ZGRgorIyBrQ29udHJvbGxlck1pbmltdW0gPSAobG9uZykweEZGRkY4MDAwCitrVm9pY2VDb3VudER5bmFtaWMgPSAtMQora0ZpcnN0R01JbnN0cnVtZW50ID0gMHgwMDAwMDAwMQora0xhc3RHTUluc3RydW1lbnQgPSAweDAwMDAwMDgwCitrRmlyc3RHU0luc3RydW1lbnQgPSAweDAwMDAwMDgxCitrTGFzdEdTSW5zdHJ1bWVudCA9IDB4MDAwMDNGRkYKK2tGaXJzdERydW1raXQgPSAweDAwMDA0MDAwCitrTGFzdERydW1raXQgPSAweDAwMDA0MDgwCitrRmlyc3RST01JbnN0cnVtZW50ID0gMHgwMDAwODAwMAora0xhc3RST01JbnN0cnVtZW50ID0gMHgwMDAwRkZGRgora0ZpcnN0VXNlckluc3RydW1lbnQgPSAweDAwMDEwMDAwCitrTGFzdFVzZXJJbnN0cnVtZW50ID0gMHgwMDAxRkZGRgora0luc3RydW1lbnRNYXRjaFN5bnRoZXNpemVyVHlwZSA9IDEKK2tJbnN0cnVtZW50TWF0Y2hTeW50aGVzaXplck5hbWUgPSAyCitrSW5zdHJ1bWVudE1hdGNoTmFtZSA9IDQKK2tJbnN0cnVtZW50TWF0Y2hOdW1iZXIgPSA4CitrSW5zdHJ1bWVudE1hdGNoR01OdW1iZXIgPSAxNgora0luc3RydW1lbnRNYXRjaEdTTnVtYmVyID0gMzIKK2tLbm9iQmFzaWMgPSA4CitrS25vYlJlYWRPbmx5ID0gMTYKK2tLbm9iSW50ZXJydXB0VW5zYWZlID0gMzIKK2tLbm9iS2V5cmFuZ2VPdmVycmlkZSA9IDY0CitrS25vYkdyb3VwU3RhcnQgPSAxMjgKK2tLbm9iRml4ZWRQb2ludDggPSAxMDI0CitrS25vYkZpeGVkUG9pbnQxNiA9IDIwNDgKK2tLbm9iVHlwZU51bWJlciA9IDAgPDwgMTIKK2tLbm9iVHlwZUdyb3VwTmFtZSA9IDEgPDwgMTIKK2tLbm9iVHlwZUJvb2xlYW4gPSAyIDw8IDEyCitrS25vYlR5cGVOb3RlID0gMyA8PCAxMgora0tub2JUeXBlUGFuID0gNCA8PCAxMgora0tub2JUeXBlSW5zdHJ1bWVudCA9IDUgPDwgMTIKK2tLbm9iVHlwZVNldHRpbmcgPSA2IDw8IDEyCitrS25vYlR5cGVNaWxsaXNlY29uZHMgPSA3IDw8IDEyCitrS25vYlR5cGVQZXJjZW50YWdlID0gOCA8PCAxMgora0tub2JUeXBlSGVydHogPSA5IDw8IDEyCitrS25vYlR5cGVCdXR0b24gPSAxMCA8PCAxMgora1Vua25vd25Lbm9iVmFsdWUgPSAweDdGRkZGRkZGCitrRGVmYXVsdEtub2JWYWx1ZSA9IDB4N0ZGRkZGRkUKK25vdEltcGxlbWVudGVkTXVzaWNFcnIgPSAoMHg4MDAwMDAwMCB8ICgweEZGRkYgJiAobm90SW1wbGVtZW50ZWRNdXNpY09TRXJyKSkpCitjYW50U2VuZFRvU3ludGhlc2l6ZXJFcnIgPSAoMHg4MDAwMDAwMCB8ICgweEZGRkYgJiAoY2FudFNlbmRUb1N5bnRoZXNpemVyT1NFcnIpKSkKK2NhbnRSZWNlaXZlRnJvbVN5bnRoZXNpemVyRXJyID0gKDB4ODAwMDAwMDAgfCAoMHhGRkZGICYgKGNhbnRSZWNlaXZlRnJvbVN5bnRoZXNpemVyT1NFcnIpKSkKK2lsbGVnYWxWb2ljZUFsbG9jYXRpb25FcnIgPSAoMHg4MDAwMDAwMCB8ICgweEZGRkYgJiAoaWxsZWdhbFZvaWNlQWxsb2NhdGlvbk9TRXJyKSkpCitpbGxlZ2FsUGFydEVyciA9ICgweDgwMDAwMDAwIHwgKDB4RkZGRiAmIChpbGxlZ2FsUGFydE9TRXJyKSkpCitpbGxlZ2FsQ2hhbm5lbEVyciA9ICgweDgwMDAwMDAwIHwgKDB4RkZGRiAmIChpbGxlZ2FsQ2hhbm5lbE9TRXJyKSkpCitpbGxlZ2FsS25vYkVyciA9ICgweDgwMDAwMDAwIHwgKDB4RkZGRiAmIChpbGxlZ2FsS25vYk9TRXJyKSkpCitpbGxlZ2FsS25vYlZhbHVlRXJyID0gKDB4ODAwMDAwMDAgfCAoMHhGRkZGICYgKGlsbGVnYWxLbm9iVmFsdWVPU0VycikpKQoraWxsZWdhbEluc3RydW1lbnRFcnIgPSAoMHg4MDAwMDAwMCB8ICgweEZGRkYgJiAoaWxsZWdhbEluc3RydW1lbnRPU0VycikpKQoraWxsZWdhbENvbnRyb2xsZXJFcnIgPSAoMHg4MDAwMDAwMCB8ICgweEZGRkYgJiAoaWxsZWdhbENvbnRyb2xsZXJPU0VycikpKQorbWlkaU1hbmFnZXJBYnNlbnRFcnIgPSAoMHg4MDAwMDAwMCB8ICgweEZGRkYgJiAobWlkaU1hbmFnZXJBYnNlbnRPU0VycikpKQorc3ludGhlc2l6ZXJOb3RSZXNwb25kaW5nRXJyID0gKDB4ODAwMDAwMDAgfCAoMHhGRkZGICYgKHN5bnRoZXNpemVyTm90UmVzcG9uZGluZ09TRXJyKSkpCitzeW50aGVzaXplckVyciA9ICgweDgwMDAwMDAwIHwgKDB4RkZGRiAmIChzeW50aGVzaXplck9TRXJyKSkpCitpbGxlZ2FsTm90ZUNoYW5uZWxFcnIgPSAoMHg4MDAwMDAwMCB8ICgweEZGRkYgJiAoaWxsZWdhbE5vdGVDaGFubmVsT1NFcnIpKSkKK25vdGVDaGFubmVsTm90QWxsb2NhdGVkRXJyID0gKDB4ODAwMDAwMDAgfCAoMHhGRkZGICYgKG5vdGVDaGFubmVsTm90QWxsb2NhdGVkT1NFcnIpKSkKK3R1bmVQbGF5ZXJGdWxsRXJyID0gKDB4ODAwMDAwMDAgfCAoMHhGRkZGICYgKHR1bmVQbGF5ZXJGdWxsT1NFcnIpKSkKK3R1bmVQYXJzZUVyciA9ICgweDgwMDAwMDAwIHwgKDB4RkZGRiAmICh0dW5lUGFyc2VPU0VycikpKQora0dldEF0b21pY0luc3ROb0V4cGFuZGVkU2FtcGxlcyA9IDEgPDwgMAora0dldEF0b21pY0luc3ROb09yaWdpbmFsU2FtcGxlcyA9IDEgPDwgMQora0dldEF0b21pY0luc3ROb1NhbXBsZXMgPSBrR2V0QXRvbWljSW5zdE5vRXhwYW5kZWRTYW1wbGVzIHwga0dldEF0b21pY0luc3ROb09yaWdpbmFsU2FtcGxlcwora0dldEF0b21pY0luc3ROb0tub2JMaXN0ID0gMSA8PCAyCitrR2V0QXRvbWljSW5zdE5vSW5zdHJ1bWVudEluZm8gPSAxIDw8IDMKK2tHZXRBdG9taWNJbnN0T3JpZ2luYWxLbm9iTGlzdCA9IDEgPDwgNAora0dldEF0b21pY0luc3RBbGxLbm9icyA9IDEgPDwgNQora1NldEF0b21pY0luc3RLZWVwT3JpZ2luYWxJbnN0cnVtZW50ID0gMSA8PCAwCitrU2V0QXRvbWljSW5zdFNoYXJlQWNyb3NzUGFydHMgPSAxIDw8IDEKK2tTZXRBdG9taWNJbnN0Q2FsbGVyVG9zc2VzID0gMSA8PCAyCitrU2V0QXRvbWljSW5zdENhbGxlckd1YXJhbnRlZXMgPSAxIDw8IDMKK2tTZXRBdG9taWNJbnN0SW50ZXJydXB0U2FmZSA9IDEgPDwgNAora1NldEF0b21pY0luc3REb250UHJlcHJvY2VzcyA9IDEgPDwgNwora0luc3RydW1lbnROYW1lc01vZGlmaWFibGUgPSAxCitrSW5zdHJ1bWVudE5hbWVzQm90aCA9IDIKK2tHZW5lcmljTXVzaWNDb21wb25lbnRTdWJ0eXBlID0gRk9VUl9DSEFSX0NPREUoJ2dlbmUnKQora0dlbmVyaWNNdXNpY0tub2IgPSAxCitrR2VuZXJpY011c2ljSW5zdHJ1bWVudEtub2IgPSAyCitrR2VuZXJpY011c2ljRHJ1bUtub2IgPSAzCitrR2VuZXJpY011c2ljR2xvYmFsQ29udHJvbGxlciA9IDQKK2tHZW5lcmljTXVzaWNSZXNGaXJzdCA9IDAKK2tHZW5lcmljTXVzaWNSZXNNaXNjU3RyaW5nTGlzdCA9IDEKK2tHZW5lcmljTXVzaWNSZXNNaXNjTG9uZ0xpc3QgPSAyCitrR2VuZXJpY011c2ljUmVzSW5zdHJ1bWVudExpc3QgPSAzCitrR2VuZXJpY011c2ljUmVzRHJ1bUxpc3QgPSA0CitrR2VuZXJpY011c2ljUmVzSW5zdHJ1bWVudEtub2JEZXNjcmlwdGlvbkxpc3QgPSA1CitrR2VuZXJpY011c2ljUmVzRHJ1bUtub2JEZXNjcmlwdGlvbkxpc3QgPSA2CitrR2VuZXJpY011c2ljUmVzS25vYkRlc2NyaXB0aW9uTGlzdCA9IDcKK2tHZW5lcmljTXVzaWNSZXNCaXRzTG9uZ0xpc3QgPSA4CitrR2VuZXJpY011c2ljUmVzTW9kaWZpYWJsZUluc3RydW1lbnRIVyA9IDkKK2tHZW5lcmljTXVzaWNSZXNHTVRyYW5zbGF0aW9uID0gMTAKK2tHZW5lcmljTXVzaWNSZXNST01JbnN0cnVtZW50RGF0YSA9IDExCitrR2VuZXJpY011c2ljUmVzQWJvdXRQSUNUID0gMTIKK2tHZW5lcmljTXVzaWNSZXNMYXN0ID0gMTMKK2tHZW5lcmljTXVzaWNNaXNjTG9uZ0ZpcnN0ID0gMAora0dlbmVyaWNNdXNpY01pc2NMb25nVm9pY2VDb3VudCA9IDEKK2tHZW5lcmljTXVzaWNNaXNjTG9uZ1BhcnRDb3VudCA9IDIKK2tHZW5lcmljTXVzaWNNaXNjTG9uZ01vZGlmaWFibGVJbnN0cnVtZW50Q291bnQgPSAzCitrR2VuZXJpY011c2ljTWlzY0xvbmdDaGFubmVsTWFzayA9IDQKK2tHZW5lcmljTXVzaWNNaXNjTG9uZ0RydW1QYXJ0Q291bnQgPSA1CitrR2VuZXJpY011c2ljTWlzY0xvbmdNb2RpZmlhYmxlRHJ1bUNvdW50ID0gNgora0dlbmVyaWNNdXNpY01pc2NMb25nRHJ1bUNoYW5uZWxNYXNrID0gNwora0dlbmVyaWNNdXNpY01pc2NMb25nT3V0cHV0Q291bnQgPSA4CitrR2VuZXJpY011c2ljTWlzY0xvbmdMYXRlbmN5ID0gOQora0dlbmVyaWNNdXNpY01pc2NMb25nRmxhZ3MgPSAxMAora0dlbmVyaWNNdXNpY01pc2NMb25nRmlyc3RHTUhXID0gMTEKK2tHZW5lcmljTXVzaWNNaXNjTG9uZ0ZpcnN0R01EcnVtSFcgPSAxMgora0dlbmVyaWNNdXNpY01pc2NMb25nRmlyc3RVc2VySFcgPSAxMwora0dlbmVyaWNNdXNpY01pc2NMb25nTGFzdCA9IDE0CitrTXVzaWNHZW5lcmljUmFuZ2UgPSAweDAxMDAKK2tNdXNpY0Rlcml2ZWRSYW5nZSA9IDB4MDIwMAora0dlbmVyaWNNdXNpY0RvTUlESSA9IDEgPDwgMAora0dlbmVyaWNNdXNpY0JhbmswID0gMSA8PCAxCitrR2VuZXJpY011c2ljQmFuazMyID0gMSA8PCAyCitrR2VuZXJpY011c2ljRXJzYXR6TUlESSA9IDEgPDwgMwora0dlbmVyaWNNdXNpY0NhbGxLbm9icyA9IDEgPDwgNAora0dlbmVyaWNNdXNpY0NhbGxQYXJ0cyA9IDEgPDwgNQora0dlbmVyaWNNdXNpY0NhbGxJbnN0cnVtZW50ID0gMSA8PCA2CitrR2VuZXJpY011c2ljQ2FsbE51bWJlciA9IDEgPDwgNwora0dlbmVyaWNNdXNpY0NhbGxST01JbnN0cnVtZW50ID0gMSA8PCA4CitrR2VuZXJpY011c2ljQWxsRGVmYXVsdHMgPSAxIDw8IDkKK2tHZXRJbnN0cnVtZW50SW5mb05vQnVpbHRJbiA9IDEgPDwgMAora0dldEluc3RydW1lbnRJbmZvTWlkaVVzZXJJbnN0ID0gMSA8PCAxCitrR2V0SW5zdHJ1bWVudEluZm9Ob0lUZXh0ID0gMSA8PCAyCitrTm90ZVJlcXVlc3ROb0dNID0gMQora05vdGVSZXF1ZXN0Tm9TeW50aFR5cGUgPSAyCitrTm90ZVJlcXVlc3RTeW50aE11c3RNYXRjaCA9IDQKK2tOb3RlUmVxdWVzdFNwZWNpZnlNSURJQ2hhbm5lbCA9IDB4ODAKK2tQaWNrRG9udE1peCA9IDEKK2tQaWNrU2FtZVN5bnRoID0gMgora1BpY2tVc2VySW5zdHMgPSA0CitrUGlja0VkaXRBbGxvd0VkaXQgPSA4CitrUGlja0VkaXRBbGxvd1BpY2sgPSAxNgora1BpY2tFZGl0U3ludGhHbG9iYWwgPSAzMgora1BpY2tFZGl0Q29udHJvbGxlcnMgPSA2NAora05vdGVBbGxvY2F0b3JDb21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ25vdGEnKQora05BRHVtbXlPbmVTZWxlY3QgPSAyOQora05BRHVtbXlUd29TZWxlY3QgPSAzMAora1R1bmVRdWV1ZURlcHRoID0gOAora1R1bmVQbGF5ZXJDb21wb25lbnRUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3R1bmUnKQora1R1bmVTdGFydE5vdyA9IDEKK2tUdW5lRG9udENsaXBOb3RlcyA9IDIKK2tUdW5lRXhjbHVkZUVkZ2VOb3RlcyA9IDQKK2tUdW5lUXVpY2tTdGFydCA9IDgKK2tUdW5lTG9vcFVudGlsID0gMTYKK2tUdW5lUGxheURpZmZlcmVuY2UgPSAzMgora1R1bmVQbGF5Q29uY3VycmVudCA9IDY0CitrVHVuZVN0YXJ0TmV3TWFzdGVyID0gMTYzODQKK2tUdW5lU3RvcEZhZGUgPSAxCitrVHVuZVN0b3BTdXN0YWluID0gMgora1R1bmVTdG9wSW5zdGFudCA9IDQKK2tUdW5lU3RvcFJlbGVhc2VDaGFubmVscyA9IDgKK2tUdW5lTWl4TXV0ZSA9IDEKK2tUdW5lTWl4U29sbyA9IDIKK2tSZXN0RXZlbnRUeXBlID0gMHgwMDAwMDAwMAora05vdGVFdmVudFR5cGUgPSAweDAwMDAwMDAxCitrQ29udHJvbEV2ZW50VHlwZSA9IDB4MDAwMDAwMDIKK2tNYXJrZXJFdmVudFR5cGUgPSAweDAwMDAwMDAzCitrVW5kZWZpbmVkMUV2ZW50VHlwZSA9IDB4MDAwMDAwMDgKK2tYTm90ZUV2ZW50VHlwZSA9IDB4MDAwMDAwMDkKK2tYQ29udHJvbEV2ZW50VHlwZSA9IDB4MDAwMDAwMEEKK2tLbm9iRXZlbnRUeXBlID0gMHgwMDAwMDAwQgora1VuZGVmaW5lZDJFdmVudFR5cGUgPSAweDAwMDAwMDBDCitrVW5kZWZpbmVkM0V2ZW50VHlwZSA9IDB4MDAwMDAwMEQKK2tVbmRlZmluZWQ0RXZlbnRUeXBlID0gMHgwMDAwMDAwRQora0dlbmVyYWxFdmVudFR5cGUgPSAweDAwMDAwMDBGCitrWEV2ZW50TGVuZ3RoQml0cyA9IDB4MDAwMDAwMDIKK2tHZW5lcmFsRXZlbnRMZW5ndGhCaXRzID0gMHgwMDAwMDAwMwora0V2ZW50TGVuID0gMUwKK2tYRXZlbnRMZW4gPSAyTAora1Jlc3RFdmVudExlbiA9IGtFdmVudExlbgora05vdGVFdmVudExlbiA9IGtFdmVudExlbgora0NvbnRyb2xFdmVudExlbiA9IGtFdmVudExlbgora01hcmtlckV2ZW50TGVuID0ga0V2ZW50TGVuCitrWE5vdGVFdmVudExlbiA9IGtYRXZlbnRMZW4KK2tYQ29udHJvbEV2ZW50TGVuID0ga1hFdmVudExlbgora0dlbmVyYWxFdmVudExlbiA9IGtYRXZlbnRMZW4KK2tFdmVudExlbmd0aEZpZWxkUG9zID0gMzAKK2tFdmVudExlbmd0aEZpZWxkV2lkdGggPSAyCitrRXZlbnRUeXBlRmllbGRQb3MgPSAyOQora0V2ZW50VHlwZUZpZWxkV2lkdGggPSAzCitrWEV2ZW50VHlwZUZpZWxkUG9zID0gMjgKK2tYRXZlbnRUeXBlRmllbGRXaWR0aCA9IDQKK2tFdmVudFBhcnRGaWVsZFBvcyA9IDI0CitrRXZlbnRQYXJ0RmllbGRXaWR0aCA9IDUKK2tYRXZlbnRQYXJ0RmllbGRQb3MgPSAxNgora1hFdmVudFBhcnRGaWVsZFdpZHRoID0gMTIKK2tSZXN0RXZlbnREdXJhdGlvbkZpZWxkUG9zID0gMAora1Jlc3RFdmVudER1cmF0aW9uRmllbGRXaWR0aCA9IDI0CitrUmVzdEV2ZW50RHVyYXRpb25NYXggPSAoKDFMIDw8IGtSZXN0RXZlbnREdXJhdGlvbkZpZWxkV2lkdGgpIC0gMSkKK2tOb3RlRXZlbnRQaXRjaEZpZWxkUG9zID0gMTgKK2tOb3RlRXZlbnRQaXRjaEZpZWxkV2lkdGggPSA2CitrTm90ZUV2ZW50UGl0Y2hPZmZzZXQgPSAzMgora05vdGVFdmVudFZvbHVtZUZpZWxkUG9zID0gMTEKK2tOb3RlRXZlbnRWb2x1bWVGaWVsZFdpZHRoID0gNwora05vdGVFdmVudFZvbHVtZU9mZnNldCA9IDAKK2tOb3RlRXZlbnREdXJhdGlvbkZpZWxkUG9zID0gMAora05vdGVFdmVudER1cmF0aW9uRmllbGRXaWR0aCA9IDExCitrTm90ZUV2ZW50RHVyYXRpb25NYXggPSAoKDFMIDw8IGtOb3RlRXZlbnREdXJhdGlvbkZpZWxkV2lkdGgpIC0gMSkKK2tYTm90ZUV2ZW50UGl0Y2hGaWVsZFBvcyA9IDAKK2tYTm90ZUV2ZW50UGl0Y2hGaWVsZFdpZHRoID0gMTYKK2tYTm90ZUV2ZW50RHVyYXRpb25GaWVsZFBvcyA9IDAKK2tYTm90ZUV2ZW50RHVyYXRpb25GaWVsZFdpZHRoID0gMjIKK2tYTm90ZUV2ZW50RHVyYXRpb25NYXggPSAoKDFMIDw8IGtYTm90ZUV2ZW50RHVyYXRpb25GaWVsZFdpZHRoKSAtIDEpCitrWE5vdGVFdmVudFZvbHVtZUZpZWxkUG9zID0gMjIKK2tYTm90ZUV2ZW50Vm9sdW1lRmllbGRXaWR0aCA9IDcKK2tDb250cm9sRXZlbnRDb250cm9sbGVyRmllbGRQb3MgPSAxNgora0NvbnRyb2xFdmVudENvbnRyb2xsZXJGaWVsZFdpZHRoID0gOAora0NvbnRyb2xFdmVudFZhbHVlRmllbGRQb3MgPSAwCitrQ29udHJvbEV2ZW50VmFsdWVGaWVsZFdpZHRoID0gMTYKK2tYQ29udHJvbEV2ZW50Q29udHJvbGxlckZpZWxkUG9zID0gMAora1hDb250cm9sRXZlbnRDb250cm9sbGVyRmllbGRXaWR0aCA9IDE2CitrWENvbnRyb2xFdmVudFZhbHVlRmllbGRQb3MgPSAwCitrWENvbnRyb2xFdmVudFZhbHVlRmllbGRXaWR0aCA9IDE2CitrS25vYkV2ZW50VmFsdWVIaWdoRmllbGRQb3MgPSAwCitrS25vYkV2ZW50VmFsdWVIaWdoRmllbGRXaWR0aCA9IDE2CitrS25vYkV2ZW50S25vYkZpZWxkUG9zID0gMTYKK2tLbm9iRXZlbnRLbm9iRmllbGRXaWR0aCA9IDE0CitrS25vYkV2ZW50VmFsdWVMb3dGaWVsZFBvcyA9IDAKK2tLbm9iRXZlbnRWYWx1ZUxvd0ZpZWxkV2lkdGggPSAxNgora01hcmtlckV2ZW50U3VidHlwZUZpZWxkUG9zID0gMTYKK2tNYXJrZXJFdmVudFN1YnR5cGVGaWVsZFdpZHRoID0gOAora01hcmtlckV2ZW50VmFsdWVGaWVsZFBvcyA9IDAKK2tNYXJrZXJFdmVudFZhbHVlRmllbGRXaWR0aCA9IDE2CitrR2VuZXJhbEV2ZW50U3VidHlwZUZpZWxkUG9zID0gMTYKK2tHZW5lcmFsRXZlbnRTdWJ0eXBlRmllbGRXaWR0aCA9IDE0CitrR2VuZXJhbEV2ZW50TGVuZ3RoRmllbGRQb3MgPSAwCitrR2VuZXJhbEV2ZW50TGVuZ3RoRmllbGRXaWR0aCA9IDE2CitrRW5kTWFya2VyVmFsdWUgPSAweDAwMDAwMDYwCitrRW5kTWFya2VyVmFsdWUgPSAweDYwMDAwMDAwCisjIF9leHQgPSBxdG1hX0VYVCgqbFAKKyMgdWxlbiA9IChfZXh0IDwgMikgPyAxIDogMgorIyB1bGVuID0gKHVuc2lnbmVkIHNob3J0KXF0bWFfRVhUKCpsUAorIyB1bGVuID0gbFBbMV0KKyMgX2V4dCA9IHF0bWFfRVhUKCpsUAorIyB1bGVuID0gKF9leHQgPCAyKSA/IDEgOiAyCisjIHVsZW4gPSAodW5zaWduZWQgc2hvcnQpcXRtYV9FWFQoKmxQCisjIHVsZW4gPSBsUFstMV0KKyMgeCA9IChrUmVzdEV2ZW50VHlwZSA8PCBrRXZlbnRUeXBlRmllbGRQb3MpICAgXAorIyB4ID0gRW5kaWFuVTMyX050b0IoeCkgKQorIyB4ID0gKGtOb3RlRXZlbnRUeXBlIDw8IGtFdmVudFR5cGVGaWVsZFBvcykgIFwKKyMgeCA9IEVuZGlhblUzMl9OdG9CKHgpICkKKyMgeCA9IChrQ29udHJvbEV2ZW50VHlwZSA8PCBrRXZlbnRUeXBlRmllbGRQb3MpICAgICAgICAgICBcCisjIHggPSBFbmRpYW5VMzJfTnRvQih4KSApCisjIHggPSAoa01hcmtlckV2ZW50VHlwZSA8PCBrRXZlbnRUeXBlRmllbGRQb3MpICAgIFwKKyMgeCA9IEVuZGlhblUzMl9OdG9CKHgpICkKKyMgdzEgPSAoa1hOb3RlRXZlbnRUeXBlIDw8IGtYRXZlbnRUeXBlRmllbGRQb3MpICAgICAgICAgICAgXAorIyB3MSA9IEVuZGlhblUzMl9OdG9CKHcxKQorIyB3MiA9IChrWEV2ZW50TGVuZ3RoQml0cyA8PCBrRXZlbnRMZW5ndGhGaWVsZFBvcykgICAgICAgIFwKKyMgdzIgPSBFbmRpYW5VMzJfTnRvQih3MikgKQorIyB3MSA9IChrWENvbnRyb2xFdmVudFR5cGUgPDwga1hFdmVudFR5cGVGaWVsZFBvcykgICAgICAgICAgICAgXAorIyB3MSA9IEVuZGlhblUzMl9OdG9CKHcxKQorIyB3MiA9IChrWEV2ZW50TGVuZ3RoQml0cyA8PCBrRXZlbnRMZW5ndGhGaWVsZFBvcykgICAgICAgICAgICAgXAorIyB3MiA9IEVuZGlhblUzMl9OdG9CKHcyKSApCisjIHcxID0gKGtLbm9iRXZlbnRUeXBlIDw8IGtYRXZlbnRUeXBlRmllbGRQb3MpICAgICAgICAgICAgICAgICBcCisjIHcxID0gRW5kaWFuVTMyX050b0IodzEpCisjIHcyID0gKGtYRXZlbnRMZW5ndGhCaXRzIDw8IGtFdmVudExlbmd0aEZpZWxkUG9zKSAgICAgICAgICAgICBcCisjIHcyID0gRW5kaWFuVTMyX050b0IodzIpICkKKyMgdzEgPSAoa0dlbmVyYWxFdmVudFR5cGUgPDwga1hFdmVudFR5cGVGaWVsZFBvcykgICAgICAgICAgICAgIFwKKyMgdzEgPSBFbmRpYW5VMzJfTnRvQih3MSkKKyMgdzIgPSAoa0dlbmVyYWxFdmVudExlbmd0aEJpdHMgPDwga0V2ZW50TGVuZ3RoRmllbGRQb3MpICAgICAgICAgIFwKKyMgdzIgPSBFbmRpYW5VMzJfTnRvQih3MikgKQora0dlbmVyYWxFdmVudE5vdGVSZXF1ZXN0ID0gMQora0dlbmVyYWxFdmVudFBhcnRLZXkgPSA0CitrR2VuZXJhbEV2ZW50VHVuZURpZmZlcmVuY2UgPSA1CitrR2VuZXJhbEV2ZW50QXRvbWljSW5zdHJ1bWVudCA9IDYKK2tHZW5lcmFsRXZlbnRLbm9iID0gNwora0dlbmVyYWxFdmVudE1JRElDaGFubmVsID0gOAora0dlbmVyYWxFdmVudFBhcnRDaGFuZ2UgPSA5CitrR2VuZXJhbEV2ZW50Tm9PcCA9IDEwCitrR2VuZXJhbEV2ZW50VXNlZE5vdGVzID0gMTEKK2tHZW5lcmFsRXZlbnRQYXJ0TWl4ID0gMTIKK2tNYXJrZXJFdmVudEVuZCA9IDAKK2tNYXJrZXJFdmVudEJlYXQgPSAxCitrTWFya2VyRXZlbnRUZW1wbyA9IDIKK2tDdXJyZW50bHlOYXRpdmVFbmRpYW4gPSAxCitrQ3VycmVudGx5Tm90TmF0aXZlRW5kaWFuID0gMgora1FUTUlESUdldE1JRElQb3J0c1NlbGVjdCA9IDB4MDAwMQora1FUTUlESVVzZVNlbmRQb3J0U2VsZWN0ID0gMHgwMDAyCitrUVRNSURJU2VuZE1JRElTZWxlY3QgPSAweDAwMDMKK2tNdXNpY0dldERlc2NyaXB0aW9uU2VsZWN0ID0gMHgwMDAxCitrTXVzaWNHZXRQYXJ0U2VsZWN0ID0gMHgwMDAyCitrTXVzaWNTZXRQYXJ0U2VsZWN0ID0gMHgwMDAzCitrTXVzaWNTZXRQYXJ0SW5zdHJ1bWVudE51bWJlclNlbGVjdCA9IDB4MDAwNAora011c2ljR2V0UGFydEluc3RydW1lbnROdW1iZXJTZWxlY3QgPSAweDAwMDUKK2tNdXNpY1N0b3JlUGFydEluc3RydW1lbnRTZWxlY3QgPSAweDAwMDYKK2tNdXNpY0dldFBhcnRBdG9taWNJbnN0cnVtZW50U2VsZWN0ID0gMHgwMDA5CitrTXVzaWNTZXRQYXJ0QXRvbWljSW5zdHJ1bWVudFNlbGVjdCA9IDB4MDAwQQora011c2ljR2V0UGFydEtub2JTZWxlY3QgPSAweDAwMTAKK2tNdXNpY1NldFBhcnRLbm9iU2VsZWN0ID0gMHgwMDExCitrTXVzaWNHZXRLbm9iU2VsZWN0ID0gMHgwMDEyCitrTXVzaWNTZXRLbm9iU2VsZWN0ID0gMHgwMDEzCitrTXVzaWNHZXRQYXJ0TmFtZVNlbGVjdCA9IDB4MDAxNAora011c2ljU2V0UGFydE5hbWVTZWxlY3QgPSAweDAwMTUKK2tNdXNpY0ZpbmRUb25lU2VsZWN0ID0gMHgwMDE2CitrTXVzaWNQbGF5Tm90ZVNlbGVjdCA9IDB4MDAxNwora011c2ljUmVzZXRQYXJ0U2VsZWN0ID0gMHgwMDE4CitrTXVzaWNTZXRQYXJ0Q29udHJvbGxlclNlbGVjdCA9IDB4MDAxOQora011c2ljR2V0UGFydENvbnRyb2xsZXJTZWxlY3QgPSAweDAwMUEKK2tNdXNpY0dldE1JRElQcm9jU2VsZWN0ID0gMHgwMDFCCitrTXVzaWNTZXRNSURJUHJvY1NlbGVjdCA9IDB4MDAxQwora011c2ljR2V0SW5zdHJ1bWVudE5hbWVzU2VsZWN0ID0gMHgwMDFECitrTXVzaWNHZXREcnVtTmFtZXNTZWxlY3QgPSAweDAwMUUKK2tNdXNpY0dldE1hc3RlclR1bmVTZWxlY3QgPSAweDAwMUYKK2tNdXNpY1NldE1hc3RlclR1bmVTZWxlY3QgPSAweDAwMjAKK2tNdXNpY0dldEluc3RydW1lbnRBYm91dEluZm9TZWxlY3QgPSAweDAwMjIKK2tNdXNpY0dldERldmljZUNvbm5lY3Rpb25TZWxlY3QgPSAweDAwMjMKK2tNdXNpY1VzZURldmljZUNvbm5lY3Rpb25TZWxlY3QgPSAweDAwMjQKK2tNdXNpY0dldEtub2JTZXR0aW5nU3RyaW5nc1NlbGVjdCA9IDB4MDAyNQora011c2ljR2V0TUlESVBvcnRzU2VsZWN0ID0gMHgwMDI2CitrTXVzaWNTZW5kTUlESVNlbGVjdCA9IDB4MDAyNwora011c2ljU3RhcnRPZmZsaW5lU2VsZWN0ID0gMHgwMDI5CitrTXVzaWNTZXRPZmZsaW5lVGltZVRvU2VsZWN0ID0gMHgwMDJBCitrTXVzaWNHZXRJbnN0cnVtZW50S25vYkRlc2NyaXB0aW9uU2VsZWN0ID0gMHgwMDJCCitrTXVzaWNHZXREcnVtS25vYkRlc2NyaXB0aW9uU2VsZWN0ID0gMHgwMDJDCitrTXVzaWNHZXRLbm9iRGVzY3JpcHRpb25TZWxlY3QgPSAweDAwMkQKK2tNdXNpY0dldEluZm9UZXh0U2VsZWN0ID0gMHgwMDJFCitrTXVzaWNHZXRJbnN0cnVtZW50SW5mb1NlbGVjdCA9IDB4MDAyRgora011c2ljVGFza1NlbGVjdCA9IDB4MDAzMQora011c2ljU2V0UGFydEluc3RydW1lbnROdW1iZXJJbnRlcnJ1cHRTYWZlU2VsZWN0ID0gMHgwMDMyCitrTXVzaWNTZXRQYXJ0U291bmRMb2NhbGl6YXRpb25TZWxlY3QgPSAweDAwMzMKK2tNdXNpY0dlbmVyaWNDb25maWd1cmVTZWxlY3QgPSAweDAxMDAKK2tNdXNpY0dlbmVyaWNHZXRQYXJ0U2VsZWN0ID0gMHgwMTAxCitrTXVzaWNHZW5lcmljR2V0S25vYkxpc3RTZWxlY3QgPSAweDAxMDIKK2tNdXNpY0dlbmVyaWNTZXRSZXNvdXJjZU51bWJlcnNTZWxlY3QgPSAweDAxMDMKK2tNdXNpY0Rlcml2ZWRNSURJU2VuZFNlbGVjdCA9IDB4MDIwMAora011c2ljRGVyaXZlZFNldEtub2JTZWxlY3QgPSAweDAyMDEKK2tNdXNpY0Rlcml2ZWRTZXRQYXJ0U2VsZWN0ID0gMHgwMjAyCitrTXVzaWNEZXJpdmVkU2V0SW5zdHJ1bWVudFNlbGVjdCA9IDB4MDIwMwora011c2ljRGVyaXZlZFNldFBhcnRJbnN0cnVtZW50TnVtYmVyU2VsZWN0ID0gMHgwMjA0CitrTXVzaWNEZXJpdmVkU2V0TUlESVNlbGVjdCA9IDB4MDIwNQora011c2ljRGVyaXZlZFN0b3JlUGFydEluc3RydW1lbnRTZWxlY3QgPSAweDAyMDYKK2tNdXNpY0Rlcml2ZWRPcGVuUmVzRmlsZVNlbGVjdCA9IDB4MDIwNwora011c2ljRGVyaXZlZENsb3NlUmVzRmlsZVNlbGVjdCA9IDB4MDIwOAora05BUmVnaXN0ZXJNdXNpY0RldmljZVNlbGVjdCA9IDB4MDAwMAora05BVW5yZWdpc3Rlck11c2ljRGV2aWNlU2VsZWN0ID0gMHgwMDAxCitrTkFHZXRSZWdpc3RlcmVkTXVzaWNEZXZpY2VTZWxlY3QgPSAweDAwMDIKK2tOQVNhdmVNdXNpY0NvbmZpZ3VyYXRpb25TZWxlY3QgPSAweDAwMDMKK2tOQU5ld05vdGVDaGFubmVsU2VsZWN0ID0gMHgwMDA0CitrTkFEaXNwb3NlTm90ZUNoYW5uZWxTZWxlY3QgPSAweDAwMDUKK2tOQUdldE5vdGVDaGFubmVsSW5mb1NlbGVjdCA9IDB4MDAwNgora05BUHJlcm9sbE5vdGVDaGFubmVsU2VsZWN0ID0gMHgwMDA3CitrTkFVbnJvbGxOb3RlQ2hhbm5lbFNlbGVjdCA9IDB4MDAwOAora05BU2V0Tm90ZUNoYW5uZWxWb2x1bWVTZWxlY3QgPSAweDAwMEIKK2tOQVJlc2V0Tm90ZUNoYW5uZWxTZWxlY3QgPSAweDAwMEMKK2tOQVBsYXlOb3RlU2VsZWN0ID0gMHgwMDBECitrTkFTZXRDb250cm9sbGVyU2VsZWN0ID0gMHgwMDBFCitrTkFTZXRLbm9iU2VsZWN0ID0gMHgwMDBGCitrTkFGaW5kTm90ZUNoYW5uZWxUb25lU2VsZWN0ID0gMHgwMDEwCitrTkFTZXRJbnN0cnVtZW50TnVtYmVyU2VsZWN0ID0gMHgwMDExCitrTkFQaWNrSW5zdHJ1bWVudFNlbGVjdCA9IDB4MDAxMgora05BUGlja0FycmFuZ2VtZW50U2VsZWN0ID0gMHgwMDEzCitrTkFTdHVmZlRvbmVEZXNjcmlwdGlvblNlbGVjdCA9IDB4MDAxQgora05BQ29weXJpZ2h0RGlhbG9nU2VsZWN0ID0gMHgwMDFDCitrTkFHZXRJbmROb3RlQ2hhbm5lbFNlbGVjdCA9IDB4MDAxRgora05BR2V0TUlESVBvcnRzU2VsZWN0ID0gMHgwMDIxCitrTkFHZXROb3RlUmVxdWVzdFNlbGVjdCA9IDB4MDAyMgora05BU2VuZE1JRElTZWxlY3QgPSAweDAwMjMKK2tOQVBpY2tFZGl0SW5zdHJ1bWVudFNlbGVjdCA9IDB4MDAyNAora05BTmV3Tm90ZUNoYW5uZWxGcm9tQXRvbWljSW5zdHJ1bWVudFNlbGVjdCA9IDB4MDAyNQora05BU2V0QXRvbWljSW5zdHJ1bWVudFNlbGVjdCA9IDB4MDAyNgora05BR2V0S25vYlNlbGVjdCA9IDB4MDAyOAora05BVGFza1NlbGVjdCA9IDB4MDAyOQora05BU2V0Tm90ZUNoYW5uZWxCYWxhbmNlU2VsZWN0ID0gMHgwMDJBCitrTkFTZXRJbnN0cnVtZW50TnVtYmVySW50ZXJydXB0U2FmZVNlbGVjdCA9IDB4MDAyQgora05BU2V0Tm90ZUNoYW5uZWxTb3VuZExvY2FsaXphdGlvblNlbGVjdCA9IDB4MDAyQwora05BR2V0Q29udHJvbGxlclNlbGVjdCA9IDB4MDAyRAora1R1bmVTZXRIZWFkZXJTZWxlY3QgPSAweDAwMDQKK2tUdW5lR2V0VGltZUJhc2VTZWxlY3QgPSAweDAwMDUKK2tUdW5lU2V0VGltZVNjYWxlU2VsZWN0ID0gMHgwMDA2CitrVHVuZUdldFRpbWVTY2FsZVNlbGVjdCA9IDB4MDAwNwora1R1bmVHZXRJbmRleGVkTm90ZUNoYW5uZWxTZWxlY3QgPSAweDAwMDgKK2tUdW5lUXVldWVTZWxlY3QgPSAweDAwMEEKK2tUdW5lSW5zdGFudFNlbGVjdCA9IDB4MDAwQgora1R1bmVHZXRTdGF0dXNTZWxlY3QgPSAweDAwMEMKK2tUdW5lU3RvcFNlbGVjdCA9IDB4MDAwRAora1R1bmVTZXRWb2x1bWVTZWxlY3QgPSAweDAwMTAKK2tUdW5lR2V0Vm9sdW1lU2VsZWN0ID0gMHgwMDExCitrVHVuZVByZXJvbGxTZWxlY3QgPSAweDAwMTIKK2tUdW5lVW5yb2xsU2VsZWN0ID0gMHgwMDEzCitrVHVuZVNldE5vdGVDaGFubmVsc1NlbGVjdCA9IDB4MDAxNAora1R1bmVTZXRQYXJ0VHJhbnNwb3NlU2VsZWN0ID0gMHgwMDE1CitrVHVuZUdldE5vdGVBbGxvY2F0b3JTZWxlY3QgPSAweDAwMTcKK2tUdW5lU2V0U29mdGVyU2VsZWN0ID0gMHgwMDE4CitrVHVuZVRhc2tTZWxlY3QgPSAweDAwMTkKK2tUdW5lU2V0QmFsYW5jZVNlbGVjdCA9IDB4MDAxQQora1R1bmVTZXRTb3VuZExvY2FsaXphdGlvblNlbGVjdCA9IDB4MDAxQgora1R1bmVTZXRIZWFkZXJXaXRoU2l6ZVNlbGVjdCA9IDB4MDAxQwora1R1bmVTZXRQYXJ0TWl4U2VsZWN0ID0gMHgwMDFECitrVHVuZUdldFBhcnRNaXhTZWxlY3QgPSAweDAwMUUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1F1aWNrVGltZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdWlja1RpbWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNWE5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdWlja1RpbWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1F1aWNrVGltZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdWlja1RpbWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNWE5OGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9RdWlja1RpbWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1Jlcy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1Jlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjQ1ZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUmVzLnB5CkBAIC0wLDAgKzEsNCBAQAordHJ5OgorICAgIGZyb20gT3ZlcnJpZGVGcm9tMjMuX1JlcyBpbXBvcnQgKgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gX1JlcyBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUmVzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1Jlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2YTM5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1Jlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUmVzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1Jlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2YTM5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1Jlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUmVzb3VyY2VzLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUmVzb3VyY2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZDg3NjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9SZXNvdXJjZXMucHkKQEAgLTAsMCArMSwyNyBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnUmVzb3VyY2VzLmgnCisKK3Jlc1N5c0hlYXAgPSA2NAorcmVzUHVyZ2VhYmxlID0gMzIKK3Jlc0xvY2tlZCA9IDE2CityZXNQcm90ZWN0ZWQgPSA4CityZXNQcmVsb2FkID0gNAorcmVzQ2hhbmdlZCA9IDIKK21hcFJlYWRPbmx5ID0gMTI4CittYXBDb21wYWN0ID0gNjQKK21hcENoYW5nZWQgPSAzMgorcmVzU3lzUmVmQml0ID0gNworcmVzU3lzSGVhcEJpdCA9IDYKK3Jlc1B1cmdlYWJsZUJpdCA9IDUKK3Jlc0xvY2tlZEJpdCA9IDQKK3Jlc1Byb3RlY3RlZEJpdCA9IDMKK3Jlc1ByZWxvYWRCaXQgPSAyCityZXNDaGFuZ2VkQml0ID0gMQorbWFwUmVhZE9ubHlCaXQgPSA3CittYXBDb21wYWN0Qml0ID0gNgorbWFwQ2hhbmdlZEJpdCA9IDUKK2tSZXNGaWxlTm90T3BlbmVkID0gLTEKK2tTeXN0ZW1SZXNGaWxlID0gMAora1JzcmNDaGFpbkJlbG93U3lzdGVtTWFwID0gMAora1JzcmNDaGFpbkJlbG93QXBwbGljYXRpb25NYXAgPSAxCitrUnNyY0NoYWluQWJvdmVBcHBsaWNhdGlvbk1hcCA9IDIKK2tSc3JjQ2hhaW5BYm92ZUFsbE1hcHMgPSA0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9SZXNvdXJjZXMucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUmVzb3VyY2VzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTExNGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUmVzb3VyY2VzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9SZXNvdXJjZXMucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUmVzb3VyY2VzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTExNGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vUmVzb3VyY2VzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TY3JhcC5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1NjcmFwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkY2JkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TY3JhcC5weQpAQCAtMCwwICsxIEBACitmcm9tIF9TY3JhcCBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU2NyYXAucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU2NyYXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OGM5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TY3JhcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU2NyYXAucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU2NyYXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OGM5NGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TY3JhcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU25kLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU25kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OWYxMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TbmQucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfU25kIGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TbmQucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU25kLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWYxNTMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU25kLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TbmQucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU25kLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWYxNTMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU25kLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TbmRpaG9va3MucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TbmRpaG9va3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNhM2QyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1NuZGlob29rcy5weQpAQCAtMCwwICsxIEBACitmcm9tIF9TbmRpaG9va3MgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1NuZGlob29rcy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TbmRpaG9va3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjdmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TbmRpaG9va3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1NuZGlob29rcy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TbmRpaG9va3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjdmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9TbmRpaG9va3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1NvdW5kLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU291bmQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU3YjJmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1NvdW5kLnB5CkBAIC0wLDAgKzEsNDAwIEBACisjIEdlbmVyYXRlZCBmcm9tICdTb3VuZC5oJworCitkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4Citzb3VuZExpc3RSc3JjID0gRk9VUl9DSEFSX0NPREUoJ3NuZCAnKQora1NpbXBsZUJlZXBJRCA9IDEKKyMgcmF0ZTQ4a2h6ID0gKGxvbmcpMHhCQjgwMDAwMAorIyByYXRlNDRraHogPSAobG9uZykweEFDNDQwMDAwCityYXRlMzJraHogPSAweDdEMDAwMDAwCityYXRlMjIwNTBoeiA9IDB4NTYyMjAwMDAKK3JhdGUyMmtoeiA9IDB4NTZFRThCQTMKK3JhdGUxNmtoeiA9IDB4M0U4MDAwMDAKK3JhdGUxMWtoeiA9IDB4MkI3NzQ1RDEKK3JhdGUxMTAyNWh6ID0gMHgyQjExMDAwMAorcmF0ZThraHogPSAweDFGNDAwMDAwCitzYW1wbGVkU3ludGggPSA1CitzcXVhcmVXYXZlU3ludGggPSAxCit3YXZlVGFibGVTeW50aCA9IDMKK01BQ0Uzc250aElEID0gMTEKK01BQ0U2c250aElEID0gMTMKK2tNaWRkbGVDID0gNjAKK2tOb1ZvbHVtZSA9IDAKK2tGdWxsVm9sdW1lID0gMHgwMTAwCitzdGRRTGVuZ3RoID0gMTI4CitkYXRhT2Zmc2V0RmxhZyA9IDB4ODAwMAora1VzZU9wdGlvbmFsT3V0cHV0RGV2aWNlID0gLTEKK25vdENvbXByZXNzZWQgPSAwCitmaXhlZENvbXByZXNzaW9uID0gLTEKK3ZhcmlhYmxlQ29tcHJlc3Npb24gPSAtMgordHdvVG9PbmUgPSAxCitlaWdodFRvVGhyZWUgPSAyCit0aHJlZVRvT25lID0gMworc2l4VG9PbmUgPSA0CitzaXhUb09uZVBhY2tldFNpemUgPSA4Cit0aHJlZVRvT25lUGFja2V0U2l6ZSA9IDE2CitzdGF0ZUJsb2NrU2l6ZSA9IDY0CitsZWZ0T3ZlckJsb2NrU2l6ZSA9IDMyCitmaXJzdFNvdW5kRm9ybWF0ID0gMHgwMDAxCitzZWNvbmRTb3VuZEZvcm1hdCA9IDB4MDAwMgorZGJCdWZmZXJSZWFkeSA9IDB4MDAwMDAwMDEKK2RiTGFzdEJ1ZmZlciA9IDB4MDAwMDAwMDQKK3N5c0JlZXBEaXNhYmxlID0gMHgwMDAwCitzeXNCZWVwRW5hYmxlID0gKDEgPDwgMCkKK3N5c0JlZXBTeW5jaHJvbm91cyA9ICgxIDw8IDEpCit1bml0VHlwZU5vU2VsZWN0aW9uID0gMHhGRkZGCit1bml0VHlwZVNlY29uZHMgPSAweDAwMDAKK3N0ZFNIID0gMHgwMAorZXh0U0ggPSAweEZGCitjbXBTSCA9IDB4RkUKK251bGxDbWQgPSAwCitxdWlldENtZCA9IDMKK2ZsdXNoQ21kID0gNAorcmVJbml0Q21kID0gNQord2FpdENtZCA9IDEwCitwYXVzZUNtZCA9IDExCityZXN1bWVDbWQgPSAxMgorY2FsbEJhY2tDbWQgPSAxMworc3luY0NtZCA9IDE0CithdmFpbGFibGVDbWQgPSAyNAordmVyc2lvbkNtZCA9IDI1Cit2b2x1bWVDbWQgPSA0NgorZ2V0Vm9sdW1lQ21kID0gNDcKK2Nsb2NrQ29tcG9uZW50Q21kID0gNTAKK2dldENsb2NrQ29tcG9uZW50Q21kID0gNTEKK3NjaGVkdWxlZFNvdW5kQ21kID0gNTIKK2xpbmtTb3VuZENvbXBvbmVudHNDbWQgPSA1Mworc291bmRDbWQgPSA4MAorYnVmZmVyQ21kID0gODEKK3JhdGVNdWx0aXBsaWVyQ21kID0gODYKK2dldFJhdGVNdWx0aXBsaWVyQ21kID0gODcKK2luaXRDbWQgPSAxCitmcmVlQ21kID0gMgordG90YWxMb2FkQ21kID0gMjYKK2xvYWRDbWQgPSAyNworZnJlcUR1cmF0aW9uQ21kID0gNDAKK3Jlc3RDbWQgPSA0MQorZnJlcUNtZCA9IDQyCithbXBDbWQgPSA0MwordGltYnJlQ21kID0gNDQKK2dldEFtcENtZCA9IDQ1Cit3YXZlVGFibGVDbWQgPSA2MAorcGhhc2VDbWQgPSA2MQorcmF0ZUNtZCA9IDgyCitjb250aW51ZUNtZCA9IDgzCitkb3VibGVCdWZmZXJDbWQgPSA4NAorZ2V0UmF0ZUNtZCA9IDg1CitzaXplQ21kID0gOTAKK2NvbnZlcnRDbWQgPSA5MQord2F2ZUluaXRDaGFubmVsTWFzayA9IDB4MDcKK3dhdmVJbml0Q2hhbm5lbDAgPSAweDA0Cit3YXZlSW5pdENoYW5uZWwxID0gMHgwNQord2F2ZUluaXRDaGFubmVsMiA9IDB4MDYKK3dhdmVJbml0Q2hhbm5lbDMgPSAweDA3Citpbml0Q2hhbjAgPSB3YXZlSW5pdENoYW5uZWwwCitpbml0Q2hhbjEgPSB3YXZlSW5pdENoYW5uZWwxCitpbml0Q2hhbjIgPSB3YXZlSW5pdENoYW5uZWwyCitpbml0Q2hhbjMgPSB3YXZlSW5pdENoYW5uZWwzCitvdXRzaWRlQ21wU0ggPSAwCitpbnNpZGVDbXBTSCA9IDEKK2FjZVN1Y2Nlc3MgPSAwCithY2VNZW1GdWxsID0gMQorYWNlTmlsQmxvY2sgPSAyCithY2VCYWRDb21wID0gMworYWNlQmFkRW5jb2RlID0gNAorYWNlQmFkRGVzdCA9IDUKK2FjZUJhZENtZCA9IDYKK2luaXRDaGFuTGVmdCA9IDB4MDAwMgoraW5pdENoYW5SaWdodCA9IDB4MDAwMworaW5pdE5vSW50ZXJwID0gMHgwMDA0Citpbml0Tm9Ecm9wID0gMHgwMDA4Citpbml0TW9ubyA9IDB4MDA4MAoraW5pdFN0ZXJlbyA9IDB4MDBDMAoraW5pdE1BQ0UzID0gMHgwMzAwCitpbml0TUFDRTYgPSAweDA0MDAKK2luaXRQYW5NYXNrID0gMHgwMDAzCitpbml0U1JhdGVNYXNrID0gMHgwMDMwCitpbml0U3RlcmVvTWFzayA9IDB4MDBDMAoraW5pdENvbXBNYXNrID0gMHhGRjAwCitzaUFjdGl2ZUNoYW5uZWxzID0gRk9VUl9DSEFSX0NPREUoJ2NoYWMnKQorc2lBY3RpdmVMZXZlbHMgPSBGT1VSX0NIQVJfQ09ERSgnbG1hYycpCitzaUFHQ09uT2ZmID0gRk9VUl9DSEFSX0NPREUoJ2FnYyAnKQorc2lBc3luYyA9IEZPVVJfQ0hBUl9DT0RFKCdhc3luJykKK3NpQVZEaXNwbGF5QmVoYXZpb3IgPSBGT1VSX0NIQVJfQ09ERSgnYXZkYicpCitzaUNoYW5uZWxBdmFpbGFibGUgPSBGT1VSX0NIQVJfQ09ERSgnY2hhdicpCitzaUNvbXByZXNzaW9uQXZhaWxhYmxlID0gRk9VUl9DSEFSX0NPREUoJ2NtYXYnKQorc2lDb21wcmVzc2lvbkNoYW5uZWxzID0gRk9VUl9DSEFSX0NPREUoJ2NwY3QnKQorc2lDb21wcmVzc2lvbkZhY3RvciA9IEZPVVJfQ0hBUl9DT0RFKCdjbWZhJykKK3NpQ29tcHJlc3Npb25IZWFkZXIgPSBGT1VSX0NIQVJfQ09ERSgnY21oZCcpCitzaUNvbXByZXNzaW9uTmFtZXMgPSBGT1VSX0NIQVJfQ09ERSgnY25hbScpCitzaUNvbXByZXNzaW9uUGFyYW1zID0gRk9VUl9DSEFSX0NPREUoJ2V2YXcnKQorc2lDb21wcmVzc2lvblNhbXBsZVJhdGUgPSBGT1VSX0NIQVJfQ09ERSgnY3BydCcpCitzaUNvbXByZXNzaW9uVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjb21wJykKK3NpQ29udGludW91cyA9IEZPVVJfQ0hBUl9DT0RFKCdjb250JykKK3NpRGVjb21wcmVzc2lvblBhcmFtcyA9IEZPVVJfQ0hBUl9DT0RFKCd3YXZlJykKK3NpRGV2aWNlQnVmZmVySW5mbyA9IEZPVVJfQ0hBUl9DT0RFKCdkYmluJykKK3NpRGV2aWNlQ29ubmVjdGVkID0gRk9VUl9DSEFSX0NPREUoJ2Rjb24nKQorc2lEZXZpY2VJY29uID0gRk9VUl9DSEFSX0NPREUoJ2ljb24nKQorc2lEZXZpY2VOYW1lID0gRk9VUl9DSEFSX0NPREUoJ25hbWUnKQorc2lFUVNwZWN0cnVtQmFuZHMgPSBGT1VSX0NIQVJfQ09ERSgnZXFzYicpCitzaUVRU3BlY3RydW1MZXZlbHMgPSBGT1VSX0NIQVJfQ09ERSgnZXFsdicpCitzaUVRU3BlY3RydW1Pbk9mZiA9IEZPVVJfQ0hBUl9DT0RFKCdlcWxvJykKK3NpRVFTcGVjdHJ1bVJlc29sdXRpb24gPSBGT1VSX0NIQVJfQ09ERSgnZXFycycpCitzaUVRVG9uZUNvbnRyb2xHYWluID0gRk9VUl9DSEFSX0NPREUoJ2VxdGcnKQorc2lFUVRvbmVDb250cm9sT25PZmYgPSBGT1VSX0NIQVJfQ09ERSgnZXF0YycpCitzaUhhcmR3YXJlQmFsYW5jZSA9IEZPVVJfQ0hBUl9DT0RFKCdoYmFsJykKK3NpSGFyZHdhcmVCYWxhbmNlU3RlcHMgPSBGT1VSX0NIQVJfQ09ERSgnaGJscycpCitzaUhhcmR3YXJlQmFzcyA9IEZPVVJfQ0hBUl9DT0RFKCdoYmFzJykKK3NpSGFyZHdhcmVCYXNzU3RlcHMgPSBGT1VSX0NIQVJfQ09ERSgnaGJzdCcpCitzaUhhcmR3YXJlQnVzeSA9IEZPVVJfQ0hBUl9DT0RFKCdod2JzJykKK3NpSGFyZHdhcmVGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnaHdmbScpCitzaUhhcmR3YXJlTXV0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdobXV0JykKK3NpSGFyZHdhcmVNdXRlTm9QcmVmcyA9IEZPVVJfQ0hBUl9DT0RFKCdobW5wJykKK3NpSGFyZHdhcmVUcmVibGUgPSBGT1VSX0NIQVJfQ09ERSgnaHRyYicpCitzaUhhcmR3YXJlVHJlYmxlU3RlcHMgPSBGT1VSX0NIQVJfQ09ERSgnaHd0cycpCitzaUhhcmR3YXJlVm9sdW1lID0gRk9VUl9DSEFSX0NPREUoJ2h2b2wnKQorc2lIYXJkd2FyZVZvbHVtZVN0ZXBzID0gRk9VUl9DSEFSX0NPREUoJ2hzdHAnKQorc2lIZWFkcGhvbmVNdXRlID0gRk9VUl9DSEFSX0NPREUoJ3BtdXQnKQorc2lIZWFkcGhvbmVWb2x1bWUgPSBGT1VSX0NIQVJfQ09ERSgncHZvbCcpCitzaUhlYWRwaG9uZVZvbHVtZVN0ZXBzID0gRk9VUl9DSEFSX0NPREUoJ2hkc3QnKQorc2lJbnB1dEF2YWlsYWJsZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbmF2JykKK3NpSW5wdXRHYWluID0gRk9VUl9DSEFSX0NPREUoJ2dhaW4nKQorc2lJbnB1dFNvdXJjZSA9IEZPVVJfQ0hBUl9DT0RFKCdzb3VyJykKK3NpSW5wdXRTb3VyY2VOYW1lcyA9IEZPVVJfQ0hBUl9DT0RFKCdzbmFtJykKK3NpTGV2ZWxNZXRlck9uT2ZmID0gRk9VUl9DSEFSX0NPREUoJ2xtZXQnKQorc2lNb2RlbUdhaW4gPSBGT1VSX0NIQVJfQ09ERSgnbWdhaScpCitzaU1vbml0b3JBdmFpbGFibGUgPSBGT1VSX0NIQVJfQ09ERSgnbW5hdicpCitzaU1vbml0b3JTb3VyY2UgPSBGT1VSX0NIQVJfQ09ERSgnbW9ucycpCitzaU51bWJlckNoYW5uZWxzID0gRk9VUl9DSEFSX0NPREUoJ2NoYW4nKQorc2lPcHRpb25zRGlhbG9nID0gRk9VUl9DSEFSX0NPREUoJ29wdGQnKQorc2lPU1R5cGVJbnB1dFNvdXJjZSA9IEZPVVJfQ0hBUl9DT0RFKCdpbnB0JykKK3NpT1NUeXBlSW5wdXRBdmFpbGFibGUgPSBGT1VSX0NIQVJfQ09ERSgnaW5hdicpCitzaU91dHB1dERldmljZU5hbWUgPSBGT1VSX0NIQVJfQ09ERSgnb25hbScpCitzaVBsYXlUaHJ1T25PZmYgPSBGT1VSX0NIQVJfQ09ERSgncGx0aCcpCitzaVBvc3RNaXhlclNvdW5kQ29tcG9uZW50ID0gRk9VUl9DSEFSX0NPREUoJ3BzbXgnKQorc2lQcmVNaXhlclNvdW5kQ29tcG9uZW50ID0gRk9VUl9DSEFSX0NPREUoJ3BybXgnKQorc2lRdWFsaXR5ID0gRk9VUl9DSEFSX0NPREUoJ3F1YWwnKQorc2lSYXRlTXVsdGlwbGllciA9IEZPVVJfQ0hBUl9DT0RFKCdybXVsJykKK3NpUmVjb3JkaW5nUXVhbGl0eSA9IEZPVVJfQ0hBUl9DT0RFKCdxdWFsJykKK3NpU2FtcGxlUmF0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdzcmF0JykKK3NpU2FtcGxlUmF0ZUF2YWlsYWJsZSA9IEZPVVJfQ0hBUl9DT0RFKCdzcmF2JykKK3NpU2FtcGxlU2l6ZSA9IEZPVVJfQ0hBUl9DT0RFKCdzc2l6JykKK3NpU2FtcGxlU2l6ZUF2YWlsYWJsZSA9IEZPVVJfQ0hBUl9DT0RFKCdzc2F2JykKK3NpU2V0dXBDREF1ZGlvID0gRk9VUl9DSEFSX0NPREUoJ3N1Y2QnKQorc2lTZXR1cE1vZGVtQXVkaW8gPSBGT1VSX0NIQVJfQ09ERSgnc3VtZCcpCitzaVNsb3BlQW5kSW50ZXJjZXB0ID0gRk9VUl9DSEFSX0NPREUoJ2ZsYXAnKQorc2lTb3VuZENsb2NrID0gRk9VUl9DSEFSX0NPREUoJ3NjbGsnKQorc2lVc2VUaGlzU291bmRDbG9jayA9IEZPVVJfQ0hBUl9DT0RFKCdzY2xjJykKK3NpU3BlYWtlck11dGUgPSBGT1VSX0NIQVJfQ09ERSgnc211dCcpCitzaVNwZWFrZXJWb2x1bWUgPSBGT1VSX0NIQVJfQ09ERSgnc3ZvbCcpCitzaVNTcENQVUxvYWRMaW1pdCA9IEZPVVJfQ0hBUl9DT0RFKCczZGxsJykKK3NpU1NwTG9jYWxpemF0aW9uID0gRk9VUl9DSEFSX0NPREUoJzNkaWYnKQorc2lTU3BTcGVha2VyU2V0dXAgPSBGT1VSX0NIQVJfQ09ERSgnM2RzdCcpCitzaVN0ZXJlb0lucHV0R2FpbiA9IEZPVVJfQ0hBUl9DT0RFKCdzZ2FpJykKK3NpU3Vid29vZmVyTXV0ZSA9IEZPVVJfQ0hBUl9DT0RFKCdibXV0JykKK3NpVGVybWluYWxUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3R0eXAnKQorc2lUd29zQ29tcGxlbWVudE9uT2ZmID0gRk9VUl9DSEFSX0NPREUoJ3R3b3MnKQorc2lWZW5kb3JQcm9kdWN0ID0gRk9VUl9DSEFSX0NPREUoJ3Zwcm8nKQorc2lWb2x1bWUgPSBGT1VSX0NIQVJfQ09ERSgndm9sdScpCitzaVZveFJlY29yZEluZm8gPSBGT1VSX0NIQVJfQ09ERSgndm94cicpCitzaVZveFN0b3BJbmZvID0gRk9VUl9DSEFSX0NPREUoJ3ZveHMnKQorc2lXaWRlU3RlcmVvID0gRk9VUl9DSEFSX0NPREUoJ3dpZGUnKQorc2lTdXBwb3J0ZWRFeHRlbmRlZEZsYWdzID0gRk9VUl9DSEFSX0NPREUoJ2V4ZmwnKQorc2lSYXRlQ29udmVydGVyUm9sbE9mZlNsb3BlID0gRk9VUl9DSEFSX0NPREUoJ3JjZGInKQorc2lPdXRwdXRMYXRlbmN5ID0gRk9VUl9DSEFSX0NPREUoJ29sdGUnKQorc2lDbG9zZURyaXZlciA9IEZPVVJfQ0hBUl9DT0RFKCdjbG9zJykKK3NpSW5pdGlhbGl6ZURyaXZlciA9IEZPVVJfQ0hBUl9DT0RFKCdpbml0JykKK3NpUGF1c2VSZWNvcmRpbmcgPSBGT1VSX0NIQVJfQ09ERSgncGF1cycpCitzaVVzZXJJbnRlcnJ1cHRQcm9jID0gRk9VUl9DSEFSX0NPREUoJ3VzZXInKQorIyBrSW52YWxpZFNvdXJjZSA9IChsb25nKTB4RkZGRkZGRkYKK2tOb1NvdXJjZSA9IEZPVVJfQ0hBUl9DT0RFKCdub25lJykKK2tDRFNvdXJjZSA9IEZPVVJfQ0hBUl9DT0RFKCdjZCAgJykKK2tFeHRNaWNTb3VyY2UgPSBGT1VSX0NIQVJfQ09ERSgnZW1pYycpCitrU291bmRJblNvdXJjZSA9IEZPVVJfQ0hBUl9DT0RFKCdzaW5qJykKK2tSQ0FJblNvdXJjZSA9IEZPVVJfQ0hBUl9DT0RFKCdpcmNhJykKK2tUVkZNVHVuZXJTb3VyY2UgPSBGT1VSX0NIQVJfQ09ERSgndHZmbScpCitrREFWSW5Tb3VyY2UgPSBGT1VSX0NIQVJfQ09ERSgnaWRhdicpCitrSW50TWljU291cmNlID0gRk9VUl9DSEFSX0NPREUoJ2ltaWMnKQora01lZGlhQmF5U291cmNlID0gRk9VUl9DSEFSX0NPREUoJ21iYXknKQora01vZGVtU291cmNlID0gRk9VUl9DSEFSX0NPREUoJ21vZG0nKQora1BDQ2FyZFNvdXJjZSA9IEZPVVJfQ0hBUl9DT0RFKCdwY20gJykKK2tab29tVmlkZW9Tb3VyY2UgPSBGT1VSX0NIQVJfQ09ERSgnenZwYycpCitrRFZEU291cmNlID0gRk9VUl9DSEFSX0NPREUoJ2R2ZGEnKQora01pY3JvcGhvbmVBcnJheSA9IEZPVVJfQ0hBUl9DT0RFKCdtaWNhJykKK2tOb1NvdW5kQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCcqKioqJykKK2tTb3VuZENvbXBvbmVudFR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc2lmdCcpCitrU291bmRDb21wb25lbnRQUENUeXBlID0gRk9VUl9DSEFSX0NPREUoJ25pZnQnKQora1JhdGU4U3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdyYXRiJykKK2tSYXRlMTZTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3JhdHcnKQora0NvbnZlcnRlclN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnY29udicpCitrU25kU291cmNlU3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzb3VyJykKK2tNaXhlclR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnbWl4cicpCitrTWl4ZXI4U3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtaXhiJykKK2tNaXhlcjE2U3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdtaXh3JykKK2tTb3VuZElucHV0RGV2aWNlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzaW5wJykKK2tXYXZlSW5TdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3dhdmknKQora1dhdmVJblNuaWZmZXJTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3dpc24nKQora1NvdW5kT3V0cHV0RGV2aWNlVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzZGV2JykKK2tDbGFzc2ljU3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdjbGFzJykKK2tBU0NTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2FzYyAnKQora0RTUFN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZHNwICcpCitrQXdhY3NTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2F3YWMnKQora0dDQXdhY3NTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2F3Z2MnKQora1NpbmdlclN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc2luZycpCitrU2luZ2VyMlN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc25nMicpCitrV2hpdFN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnd2hpdCcpCitrU291bmRCbGFzdGVyU3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdzYmxzJykKK2tXYXZlT3V0U3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd3YXZvJykKK2tXYXZlT3V0U25pZmZlclN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnd29zbicpCitrRGlyZWN0U291bmRTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ2RzbmQnKQora0RpcmVjdFNvdW5kU25pZmZlclN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZHNzbicpCitrVU5JWHNkZXZTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3VuMXgnKQora1VTQlN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgndXNiICcpCitrQmx1ZUJveFN1YlR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnYnNuZCcpCitrU291bmRDb21wcmVzc29yID0gRk9VUl9DSEFSX0NPREUoJ3Njb20nKQora1NvdW5kRGVjb21wcmVzc29yID0gRk9VUl9DSEFSX0NPREUoJ3NkZWMnKQora0F1ZGlvQ29tcG9uZW50VHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdhZGlvJykKK2tBd2Fjc1Bob25lU3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdocGhuJykKK2tBdWRpb1Zpc2lvblNwZWFrZXJTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3RlbGMnKQora0F1ZGlvVmlzaW9uSGVhZHBob25lU3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCd0ZWxoJykKK2tQaGlsaXBzRmFkZXJTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3R2YXYnKQora1NHU1RvbmVTdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NnczAnKQora1NvdW5kRWZmZWN0c1R5cGUgPSBGT1VSX0NIQVJfQ09ERSgnc25meCcpCitrRXF1YWxpemVyU3ViVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdlcWFsJykKK2tTU3BMb2NhbGl6YXRpb25TdWJUeXBlID0gRk9VUl9DSEFSX0NPREUoJ3NuZDMnKQora1NvdW5kTm90Q29tcHJlc3NlZCA9IEZPVVJfQ0hBUl9DT0RFKCdOT05FJykKK2s4Qml0T2Zmc2V0QmluYXJ5Rm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ3JhdyAnKQorazE2Qml0QmlnRW5kaWFuRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ3R3b3MnKQorazE2Qml0TGl0dGxlRW5kaWFuRm9ybWF0ID0gRk9VUl9DSEFSX0NPREUoJ3Nvd3QnKQora0Zsb2F0MzJGb3JtYXQgPSBGT1VSX0NIQVJfQ09ERSgnZmwzMicpCitrRmxvYXQ2NEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdmbDY0JykKK2syNEJpdEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdpbjI0JykKK2szMkJpdEZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdpbjMyJykKK2szMkJpdExpdHRsZUVuZGlhbkZvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCcyM25pJykKK2tNQUNFM0NvbXByZXNzaW9uID0gRk9VUl9DSEFSX0NPREUoJ01BQzMnKQora01BQ0U2Q29tcHJlc3Npb24gPSBGT1VSX0NIQVJfQ09ERSgnTUFDNicpCitrQ0RYQTRDb21wcmVzc2lvbiA9IEZPVVJfQ0hBUl9DT0RFKCdjZHg0JykKK2tDRFhBMkNvbXByZXNzaW9uID0gRk9VUl9DSEFSX0NPREUoJ2NkeDInKQora0lNQUNvbXByZXNzaW9uID0gRk9VUl9DSEFSX0NPREUoJ2ltYTQnKQora1VMYXdDb21wcmVzc2lvbiA9IEZPVVJfQ0hBUl9DT0RFKCd1bGF3JykKK2tBTGF3Q29tcHJlc3Npb24gPSBGT1VSX0NIQVJfQ09ERSgnYWxhdycpCitrTWljcm9zb2Z0QURQQ01Gb3JtYXQgPSAweDZENzMwMDAyCitrRFZJSW50ZWxJTUFGb3JtYXQgPSAweDZENzMwMDExCitrRFZBdWRpb0Zvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCdkdmNhJykKK2tRRGVzaWduQ29tcHJlc3Npb24gPSBGT1VSX0NIQVJfQ09ERSgnUURNQycpCitrUURlc2lnbjJDb21wcmVzc2lvbiA9IEZPVVJfQ0hBUl9DT0RFKCdRRE0yJykKK2tRVUFMQ09NTUNvbXByZXNzaW9uID0gRk9VUl9DSEFSX0NPREUoJ1FjbHAnKQora09mZnNldEJpbmFyeSA9IGs4Qml0T2Zmc2V0QmluYXJ5Rm9ybWF0CitrVHdvc0NvbXBsZW1lbnQgPSBrMTZCaXRCaWdFbmRpYW5Gb3JtYXQKK2tMaXR0bGVFbmRpYW5Gb3JtYXQgPSBrMTZCaXRMaXR0bGVFbmRpYW5Gb3JtYXQKK2tNUEVHTGF5ZXIzRm9ybWF0ID0gMHg2RDczMDA1NQora0Z1bGxNUEVHTGF5M0Zvcm1hdCA9IEZPVVJfQ0hBUl9DT0RFKCcubXAzJykKK2sxNkJpdE5hdGl2ZUVuZGlhbkZvcm1hdCA9IGsxNkJpdExpdHRsZUVuZGlhbkZvcm1hdAorazE2Qml0Tm9uTmF0aXZlRW5kaWFuRm9ybWF0ID0gazE2Qml0QmlnRW5kaWFuRm9ybWF0CitrMTZCaXROYXRpdmVFbmRpYW5Gb3JtYXQgPSBrMTZCaXRCaWdFbmRpYW5Gb3JtYXQKK2sxNkJpdE5vbk5hdGl2ZUVuZGlhbkZvcm1hdCA9IGsxNkJpdExpdHRsZUVuZGlhbkZvcm1hdAorazhCaXRSYXdJbiA9ICgxIDw8IDApCitrOEJpdFR3b3NJbiA9ICgxIDw8IDEpCitrMTZCaXRJbiA9ICgxIDw8IDIpCitrU3RlcmVvSW4gPSAoMSA8PCAzKQorazhCaXRSYXdPdXQgPSAoMSA8PCA4KQorazhCaXRUd29zT3V0ID0gKDEgPDwgOSkKK2sxNkJpdE91dCA9ICgxIDw8IDEwKQora1N0ZXJlb091dCA9ICgxIDw8IDExKQora1JldmVyc2UgPSAoMUwgPDwgMTYpCitrUmF0ZUNvbnZlcnQgPSAoMUwgPDwgMTcpCitrQ3JlYXRlU291bmRTb3VyY2UgPSAoMUwgPDwgMTgpCitrVk1Bd2FyZW5lc3MgPSAoMUwgPDwgMjEpCitrSGlnaFF1YWxpdHkgPSAoMUwgPDwgMjIpCitrTm9uUmVhbFRpbWUgPSAoMUwgPDwgMjMpCitrU291cmNlUGF1c2VkID0gKDEgPDwgMCkKK2tQYXNzVGhyb3VnaCA9ICgxTCA8PCAxNikKK2tOb1NvdW5kQ29tcG9uZW50Q2hhaW4gPSAoMUwgPDwgMTcpCitrTm9NaXhpbmcgPSAoMSA8PCAwKQora05vU2FtcGxlUmF0ZUNvbnZlcnNpb24gPSAoMSA8PCAxKQora05vU2FtcGxlU2l6ZUNvbnZlcnNpb24gPSAoMSA8PCAyKQora05vU2FtcGxlRm9ybWF0Q29udmVyc2lvbiA9ICgxIDw8IDMpCitrTm9DaGFubmVsQ29udmVyc2lvbiA9ICgxIDw8IDQpCitrTm9EZWNvbXByZXNzaW9uID0gKDEgPDwgNSkKK2tOb1ZvbHVtZUNvbnZlcnNpb24gPSAoMSA8PCA2KQora05vUmVhbHRpbWVQcm9jZXNzaW5nID0gKDEgPDwgNykKK2tTY2hlZHVsZWRTb3VyY2UgPSAoMSA8PCA4KQora05vbkludGVybGVhdmVkQnVmZmVyID0gKDEgPDwgOSkKK2tOb25QYWdpbmdNaXhlciA9ICgxIDw8IDEwKQora1NvdW5kQ29udmVydGVyTWl4ZXIgPSAoMSA8PCAxMSkKK2tQYWdpbmdNaXhlciA9ICgxIDw8IDEyKQora1ZNQXdhcmVNaXhlciA9ICgxIDw8IDEzKQora0V4dGVuZGVkU291bmREYXRhID0gKDEgPDwgMTQpCitrQmVzdFF1YWxpdHkgPSAoMSA8PCAwKQora0lucHV0TWFzayA9IDB4MDAwMDAwRkYKK2tPdXRwdXRNYXNrID0gMHgwMDAwRkYwMAora091dHB1dFNoaWZ0ID0gOAora0FjdGlvbk1hc2sgPSAweDAwRkYwMDAwCitrU291bmRDb21wb25lbnRCaXRzID0gMHgwMEZGRkZGRgora0F1ZGlvRm9ybWF0QXRvbVR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnZnJtYScpCitrQXVkaW9FbmRpYW5BdG9tVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdlbmRhJykKK2tBdWRpb1ZCUkF0b21UeXBlID0gRk9VUl9DSEFSX0NPREUoJ3ZicmEnKQora0F1ZGlvVGVybWluYXRvckF0b21UeXBlID0gMAora0FWRGlzcGxheUhlYWRwaG9uZVJlbW92ZSA9IDAKK2tBVkRpc3BsYXlIZWFkcGhvbmVJbnNlcnQgPSAxCitrQVZEaXNwbGF5UGxhaW5UYWxrUmVtb3ZlID0gMgora0FWRGlzcGxheVBsYWluVGFsa0luc2VydCA9IDMKK2F1ZGlvQWxsQ2hhbm5lbHMgPSAwCithdWRpb0xlZnRDaGFubmVsID0gMQorYXVkaW9SaWdodENoYW5uZWwgPSAyCithdWRpb1VubXV0ZWQgPSAwCithdWRpb011dGVkID0gMQorYXVkaW9Eb2VzTW9ubyA9ICgxTCA8PCAwKQorYXVkaW9Eb2VzU3RlcmVvID0gKDFMIDw8IDEpCithdWRpb0RvZXNJbmRlcGVuZGVudENoYW5uZWxzID0gKDFMIDw8IDIpCitzaUNEUXVhbGl0eSA9IEZPVVJfQ0hBUl9DT0RFKCdjZCAgJykKK3NpQmVzdFF1YWxpdHkgPSBGT1VSX0NIQVJfQ09ERSgnYmVzdCcpCitzaUJldHRlclF1YWxpdHkgPSBGT1VSX0NIQVJfQ09ERSgnYmV0cicpCitzaUdvb2RRdWFsaXR5ID0gRk9VUl9DSEFSX0NPREUoJ2dvb2QnKQorc2lOb25lUXVhbGl0eSA9IEZPVVJfQ0hBUl9DT0RFKCdub25lJykKK3NpRGV2aWNlSXNDb25uZWN0ZWQgPSAxCitzaURldmljZU5vdENvbm5lY3RlZCA9IDAKK3NpRG9udEtub3dJZkNvbm5lY3RlZCA9IC0xCitzaVJlYWRQZXJtaXNzaW9uID0gMAorc2lXcml0ZVBlcm1pc3Npb24gPSAxCitrU291bmRDb252ZXJ0ZXJEaWRudEZpbGxCdWZmZXIgPSAoMSA8PCAwKQora1NvdW5kQ29udmVydGVySGFzTGVmdE92ZXJEYXRhID0gKDEgPDwgMSkKK2tFeHRlbmRlZFNvdW5kU2FtcGxlQ291bnROb3RWYWxpZCA9IDFMIDw8IDAKK2tFeHRlbmRlZFNvdW5kQnVmZmVyU2l6ZVZhbGlkID0gMUwgPDwgMQora1NjaGVkdWxlZFNvdW5kRG9TY2hlZHVsZWQgPSAxIDw8IDAKK2tTY2hlZHVsZWRTb3VuZERvQ2FsbEJhY2sgPSAxIDw8IDEKK2tTY2hlZHVsZWRTb3VuZEV4dGVuZGVkSGRyID0gMSA8PCAyCitrU291bmRDb21wb25lbnRJbml0T3V0cHV0RGV2aWNlU2VsZWN0ID0gMHgwMDAxCitrU291bmRDb21wb25lbnRTZXRTb3VyY2VTZWxlY3QgPSAweDAwMDIKK2tTb3VuZENvbXBvbmVudEdldFNvdXJjZVNlbGVjdCA9IDB4MDAwMwora1NvdW5kQ29tcG9uZW50R2V0U291cmNlRGF0YVNlbGVjdCA9IDB4MDAwNAora1NvdW5kQ29tcG9uZW50U2V0T3V0cHV0U2VsZWN0ID0gMHgwMDA1CitrU291bmRDb21wb25lbnRBZGRTb3VyY2VTZWxlY3QgPSAweDAxMDEKK2tTb3VuZENvbXBvbmVudFJlbW92ZVNvdXJjZVNlbGVjdCA9IDB4MDEwMgora1NvdW5kQ29tcG9uZW50R2V0SW5mb1NlbGVjdCA9IDB4MDEwMwora1NvdW5kQ29tcG9uZW50U2V0SW5mb1NlbGVjdCA9IDB4MDEwNAora1NvdW5kQ29tcG9uZW50U3RhcnRTb3VyY2VTZWxlY3QgPSAweDAxMDUKK2tTb3VuZENvbXBvbmVudFN0b3BTb3VyY2VTZWxlY3QgPSAweDAxMDYKK2tTb3VuZENvbXBvbmVudFBhdXNlU291cmNlU2VsZWN0ID0gMHgwMTA3CitrU291bmRDb21wb25lbnRQbGF5U291cmNlQnVmZmVyU2VsZWN0ID0gMHgwMTA4CitrQXVkaW9HZXRWb2x1bWVTZWxlY3QgPSAweDAwMDAKK2tBdWRpb1NldFZvbHVtZVNlbGVjdCA9IDB4MDAwMQora0F1ZGlvR2V0TXV0ZVNlbGVjdCA9IDB4MDAwMgora0F1ZGlvU2V0TXV0ZVNlbGVjdCA9IDB4MDAwMwora0F1ZGlvU2V0VG9EZWZhdWx0c1NlbGVjdCA9IDB4MDAwNAora0F1ZGlvR2V0SW5mb1NlbGVjdCA9IDB4MDAwNQora0F1ZGlvR2V0QmFzc1NlbGVjdCA9IDB4MDAwNgora0F1ZGlvU2V0QmFzc1NlbGVjdCA9IDB4MDAwNwora0F1ZGlvR2V0VHJlYmxlU2VsZWN0ID0gMHgwMDA4CitrQXVkaW9TZXRUcmVibGVTZWxlY3QgPSAweDAwMDkKK2tBdWRpb0dldE91dHB1dERldmljZVNlbGVjdCA9IDB4MDAwQQora0F1ZGlvTXV0ZU9uRXZlbnRTZWxlY3QgPSAweDAwODEKK2tEZWxlZ2F0ZWRTb3VuZENvbXBvbmVudFNlbGVjdG9ycyA9IDB4MDEwMAora1NuZElucHV0UmVhZEFzeW5jU2VsZWN0ID0gMHgwMDAxCitrU25kSW5wdXRSZWFkU3luY1NlbGVjdCA9IDB4MDAwMgora1NuZElucHV0UGF1c2VSZWNvcmRpbmdTZWxlY3QgPSAweDAwMDMKK2tTbmRJbnB1dFJlc3VtZVJlY29yZGluZ1NlbGVjdCA9IDB4MDAwNAora1NuZElucHV0U3RvcFJlY29yZGluZ1NlbGVjdCA9IDB4MDAwNQora1NuZElucHV0R2V0U3RhdHVzU2VsZWN0ID0gMHgwMDA2CitrU25kSW5wdXRHZXREZXZpY2VJbmZvU2VsZWN0ID0gMHgwMDA3CitrU25kSW5wdXRTZXREZXZpY2VJbmZvU2VsZWN0ID0gMHgwMDA4CitrU25kSW5wdXRJbml0SGFyZHdhcmVTZWxlY3QgPSAweDAwMDkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1NvdW5kLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1NvdW5kLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDQyYmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU291bmQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1NvdW5kLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1NvdW5kLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDQyYmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vU291bmQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1RFLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vVEUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1MWQ3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1RFLnB5CkBAIC0wLDAgKzEgQEAKK2Zyb20gX1RFIGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9URS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9URS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2ZGYxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1RFLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9URS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9URS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2ZGYxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1RFLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9UZXh0RWRpdC5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1RleHRFZGl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3Njc5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9UZXh0RWRpdC5weQpAQCAtMCwwICsxLDU3IEBACisjIEdlbmVyYXRlZCBmcm9tICdUZXh0RWRpdC5oJworCit0ZUp1c3RMZWZ0ID0gMAordGVKdXN0Q2VudGVyID0gMQordGVKdXN0UmlnaHQgPSAtMQordGVGb3JjZUxlZnQgPSAtMgordGVGbHVzaERlZmF1bHQgPSAwCit0ZUNlbnRlciA9IDEKK3RlRmx1c2hSaWdodCA9IC0xCit0ZUZsdXNoTGVmdCA9IC0yCitmb250Qml0ID0gMAorZmFjZUJpdCA9IDEKK3NpemVCaXQgPSAyCitjbHJCaXQgPSAzCithZGRTaXplQml0ID0gNAordG9nZ2xlQml0ID0gNQorZG9Gb250ID0gMQorZG9GYWNlID0gMgorZG9TaXplID0gNAorZG9Db2xvciA9IDgKK2RvQWxsID0gMTUKK2FkZFNpemUgPSAxNgorZG9Ub2dnbGUgPSAzMgorRU9MSG9vayA9IDAKK0RSQVdIb29rID0gNAorV0lEVEhIb29rID0gOAorSElUVEVTVEhvb2sgPSAxMgorbldJRFRISG9vayA9IDI0CitUZXh0V2lkdGhIb29rID0gMjgKK2ludEVPTEhvb2sgPSAwCitpbnREcmF3SG9vayA9IDEKK2ludFdpZHRoSG9vayA9IDIKK2ludEhpdFRlc3RIb29rID0gMworaW50TldpZHRoSG9vayA9IDYKK2ludFRleHRXaWR0aEhvb2sgPSA3CitpbnRJbmxpbmVJbnB1dFRTTVRFUHJlVXBkYXRlSG9vayA9IDgKK2ludElubGluZUlucHV0VFNNVEVQb3N0VXBkYXRlSG9vayA9IDkKK3RlRkF1dG9TY3JvbGwgPSAwCit0ZUZUZXh0QnVmZmVyaW5nID0gMQordGVGT3V0bGluZUhpbGl0ZSA9IDIKK3RlRklubGluZUlucHV0ID0gMwordGVGVXNlV2hpdGVCYWNrZ3JvdW5kID0gNAordGVGVXNlSW5saW5lSW5wdXQgPSA1Cit0ZUZJbmxpbmVJbnB1dEF1dG9TY3JvbGwgPSA2Cit0ZUZJZGxlV2l0aEV2ZW50TG9vcFRpbWVyID0gNwordGVCaXRDbGVhciA9IDAKK3RlQml0U2V0ID0gMQordGVCaXRUZXN0ID0gLTEKK3RlV29yZFNlbGVjdCA9IDQKK3RlV29yZERyYWcgPSA4Cit0ZUZyb21GaW5kID0gMTIKK3RlRnJvbVJlY2FsID0gMTYKK3RlRmluZCA9IDAKK3RlSGlnaGxpZ2h0ID0gMQordGVEcmF3ID0gLTEKK3RlQ2FyZXQgPSAtMgordGVGVXNlVGV4dFNlcnZpY2VzID0gNApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vVGV4dEVkaXQucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vVGV4dEVkaXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjA3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9UZXh0RWRpdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vVGV4dEVkaXQucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vVGV4dEVkaXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjA3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9UZXh0RWRpdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vV2luLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vV2luLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDU3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9XaW4ucHkKQEAgLTAsMCArMSBAQAorZnJvbSBfV2luIGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9XaW4ucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vV2luLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDljMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vV2luLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9XaW4ucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vV2luLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDljMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vV2luLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9XaW5kb3dzLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vV2luZG93cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDlkNTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vV2luZG93cy5weQpAQCAtMCwwICsxLDI3OSBAQAorIyBHZW5lcmF0ZWQgZnJvbSAnTWFjV2luZG93cy5oJworCitkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4CitmYWxzZSA9IDAKK3RydWUgPSAxCitrV2luZG93Tm9Db25zdHJhaW5BdHRyaWJ1dGUgPSAweDgwMDAwMDAwCitrQWxlcnRXaW5kb3dDbGFzcyA9IDEKK2tNb3ZhYmxlQWxlcnRXaW5kb3dDbGFzcyA9IDIKK2tNb2RhbFdpbmRvd0NsYXNzID0gMwora01vdmFibGVNb2RhbFdpbmRvd0NsYXNzID0gNAora0Zsb2F0aW5nV2luZG93Q2xhc3MgPSA1CitrRG9jdW1lbnRXaW5kb3dDbGFzcyA9IDYKK2tVdGlsaXR5V2luZG93Q2xhc3MgPSA4CitrSGVscFdpbmRvd0NsYXNzID0gMTAKK2tTaGVldFdpbmRvd0NsYXNzID0gMTEKK2tUb29sYmFyV2luZG93Q2xhc3MgPSAxMgora1BsYWluV2luZG93Q2xhc3MgPSAxMwora092ZXJsYXlXaW5kb3dDbGFzcyA9IDE0CitrU2hlZXRBbGVydFdpbmRvd0NsYXNzID0gMTUKK2tBbHRQbGFpbldpbmRvd0NsYXNzID0gMTYKK2tEcmF3ZXJXaW5kb3dDbGFzcyA9IDIwCisjIGtBbGxXaW5kb3dDbGFzc2VzID0gKHVuc2lnbmVkIGxvbmcpMHhGRkZGRkZGRgora1dpbmRvd05vQXR0cmlidXRlcyA9IDBMCitrV2luZG93Q2xvc2VCb3hBdHRyaWJ1dGUgPSAoMUwgPDwgMCkKK2tXaW5kb3dIb3Jpem9udGFsWm9vbUF0dHJpYnV0ZSA9ICgxTCA8PCAxKQora1dpbmRvd1ZlcnRpY2FsWm9vbUF0dHJpYnV0ZSA9ICgxTCA8PCAyKQora1dpbmRvd0Z1bGxab29tQXR0cmlidXRlID0gKGtXaW5kb3dWZXJ0aWNhbFpvb21BdHRyaWJ1dGUgfCBrV2luZG93SG9yaXpvbnRhbFpvb21BdHRyaWJ1dGUpCitrV2luZG93Q29sbGFwc2VCb3hBdHRyaWJ1dGUgPSAoMUwgPDwgMykKK2tXaW5kb3dSZXNpemFibGVBdHRyaWJ1dGUgPSAoMUwgPDwgNCkKK2tXaW5kb3dTaWRlVGl0bGViYXJBdHRyaWJ1dGUgPSAoMUwgPDwgNSkKK2tXaW5kb3dUb29sYmFyQnV0dG9uQXR0cmlidXRlID0gKDFMIDw8IDYpCitrV2luZG93Tm9VcGRhdGVzQXR0cmlidXRlID0gKDFMIDw8IDE2KQora1dpbmRvd05vQWN0aXZhdGVzQXR0cmlidXRlID0gKDFMIDw8IDE3KQora1dpbmRvd09wYXF1ZUZvckV2ZW50c0F0dHJpYnV0ZSA9ICgxTCA8PCAxOCkKK2tXaW5kb3dOb1NoYWRvd0F0dHJpYnV0ZSA9ICgxTCA8PCAyMSkKK2tXaW5kb3dIaWRlT25TdXNwZW5kQXR0cmlidXRlID0gKDFMIDw8IDI0KQora1dpbmRvd1N0YW5kYXJkSGFuZGxlckF0dHJpYnV0ZSA9ICgxTCA8PCAyNSkKK2tXaW5kb3dIaWRlT25GdWxsU2NyZWVuQXR0cmlidXRlID0gKDFMIDw8IDI2KQora1dpbmRvd0luV2luZG93TWVudUF0dHJpYnV0ZSA9ICgxTCA8PCAyNykKK2tXaW5kb3dMaXZlUmVzaXplQXR0cmlidXRlID0gKDFMIDw8IDI4KQorIyBrV2luZG93Tm9Db25zdHJhaW5BdHRyaWJ1dGUgPSAodW5zaWduZWQgbG9uZykoKDFMIDw8IDMxKSkKK2tXaW5kb3dTdGFuZGFyZERvY3VtZW50QXR0cmlidXRlcyA9IChrV2luZG93Q2xvc2VCb3hBdHRyaWJ1dGUgfCBrV2luZG93RnVsbFpvb21BdHRyaWJ1dGUgfCBrV2luZG93Q29sbGFwc2VCb3hBdHRyaWJ1dGUgfCBrV2luZG93UmVzaXphYmxlQXR0cmlidXRlKQora1dpbmRvd1N0YW5kYXJkRmxvYXRpbmdBdHRyaWJ1dGVzID0gKGtXaW5kb3dDbG9zZUJveEF0dHJpYnV0ZSB8IGtXaW5kb3dDb2xsYXBzZUJveEF0dHJpYnV0ZSkKK2tXaW5kb3dEZWZQcm9jVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdXREVGJykKK2tTdGFuZGFyZFdpbmRvd0RlZmluaXRpb24gPSAwCitrUm91bmRXaW5kb3dEZWZpbml0aW9uID0gMQora0Zsb2F0aW5nV2luZG93RGVmaW5pdGlvbiA9IDEyNAora0RvY3VtZW50V2luZG93VmFyaWFudENvZGUgPSAwCitrTW9kYWxEaWFsb2dWYXJpYW50Q29kZSA9IDEKK2tQbGFpbkRpYWxvZ1ZhcmlhbnRDb2RlID0gMgora1NoYWRvd0RpYWxvZ1ZhcmlhbnRDb2RlID0gMwora01vdmFibGVNb2RhbERpYWxvZ1ZhcmlhbnRDb2RlID0gNQora0FsZXJ0VmFyaWFudENvZGUgPSA3CitrTW92YWJsZUFsZXJ0VmFyaWFudENvZGUgPSA5CitrU2lkZUZsb2F0ZXJWYXJpYW50Q29kZSA9IDgKK2RvY3VtZW50UHJvYyA9IDAKK2RCb3hQcm9jID0gMQorcGxhaW5EQm94ID0gMgorYWx0REJveFByb2MgPSAzCitub0dyb3dEb2NQcm9jID0gNAorbW92YWJsZURCb3hQcm9jID0gNQorem9vbURvY1Byb2MgPSA4Cit6b29tTm9Hcm93ID0gMTIKK2Zsb2F0UHJvYyA9IDE5ODUKK2Zsb2F0R3Jvd1Byb2MgPSAxOTg3CitmbG9hdFpvb21Qcm9jID0gMTk4OQorZmxvYXRab29tR3Jvd1Byb2MgPSAxOTkxCitmbG9hdFNpZGVQcm9jID0gMTk5MworZmxvYXRTaWRlR3Jvd1Byb2MgPSAxOTk1CitmbG9hdFNpZGVab29tUHJvYyA9IDE5OTcKK2Zsb2F0U2lkZVpvb21Hcm93UHJvYyA9IDE5OTkKK3JEb2NQcm9jID0gMTYKK2tXaW5kb3dEb2N1bWVudERlZlByb2NSZXNJRCA9IDY0CitrV2luZG93RGlhbG9nRGVmUHJvY1Jlc0lEID0gNjUKK2tXaW5kb3dVdGlsaXR5RGVmUHJvY1Jlc0lEID0gNjYKK2tXaW5kb3dVdGlsaXR5U2lkZVRpdGxlRGVmUHJvY1Jlc0lEID0gNjcKK2tXaW5kb3dTaGVldERlZlByb2NSZXNJRCA9IDY4CitrV2luZG93U2ltcGxlRGVmUHJvY1Jlc0lEID0gNjkKK2tXaW5kb3dTaGVldEFsZXJ0RGVmUHJvY1Jlc0lEID0gNzAKK2tXaW5kb3dEb2N1bWVudFByb2MgPSAxMDI0CitrV2luZG93R3Jvd0RvY3VtZW50UHJvYyA9IDEwMjUKK2tXaW5kb3dWZXJ0Wm9vbURvY3VtZW50UHJvYyA9IDEwMjYKK2tXaW5kb3dWZXJ0Wm9vbUdyb3dEb2N1bWVudFByb2MgPSAxMDI3CitrV2luZG93SG9yaXpab29tRG9jdW1lbnRQcm9jID0gMTAyOAora1dpbmRvd0hvcml6Wm9vbUdyb3dEb2N1bWVudFByb2MgPSAxMDI5CitrV2luZG93RnVsbFpvb21Eb2N1bWVudFByb2MgPSAxMDMwCitrV2luZG93RnVsbFpvb21Hcm93RG9jdW1lbnRQcm9jID0gMTAzMQora1dpbmRvd1BsYWluRGlhbG9nUHJvYyA9IDEwNDAKK2tXaW5kb3dTaGFkb3dEaWFsb2dQcm9jID0gMTA0MQora1dpbmRvd01vZGFsRGlhbG9nUHJvYyA9IDEwNDIKK2tXaW5kb3dNb3ZhYmxlTW9kYWxEaWFsb2dQcm9jID0gMTA0Mwora1dpbmRvd0FsZXJ0UHJvYyA9IDEwNDQKK2tXaW5kb3dNb3ZhYmxlQWxlcnRQcm9jID0gMTA0NQora1dpbmRvd01vdmFibGVNb2RhbEdyb3dQcm9jID0gMTA0Ngora1dpbmRvd0Zsb2F0UHJvYyA9IDEwNTcKK2tXaW5kb3dGbG9hdEdyb3dQcm9jID0gMTA1OQora1dpbmRvd0Zsb2F0VmVydFpvb21Qcm9jID0gMTA2MQora1dpbmRvd0Zsb2F0VmVydFpvb21Hcm93UHJvYyA9IDEwNjMKK2tXaW5kb3dGbG9hdEhvcml6Wm9vbVByb2MgPSAxMDY1CitrV2luZG93RmxvYXRIb3Jpelpvb21Hcm93UHJvYyA9IDEwNjcKK2tXaW5kb3dGbG9hdEZ1bGxab29tUHJvYyA9IDEwNjkKK2tXaW5kb3dGbG9hdEZ1bGxab29tR3Jvd1Byb2MgPSAxMDcxCitrV2luZG93RmxvYXRTaWRlUHJvYyA9IDEwNzMKK2tXaW5kb3dGbG9hdFNpZGVHcm93UHJvYyA9IDEwNzUKK2tXaW5kb3dGbG9hdFNpZGVWZXJ0Wm9vbVByb2MgPSAxMDc3CitrV2luZG93RmxvYXRTaWRlVmVydFpvb21Hcm93UHJvYyA9IDEwNzkKK2tXaW5kb3dGbG9hdFNpZGVIb3Jpelpvb21Qcm9jID0gMTA4MQora1dpbmRvd0Zsb2F0U2lkZUhvcml6Wm9vbUdyb3dQcm9jID0gMTA4Mwora1dpbmRvd0Zsb2F0U2lkZUZ1bGxab29tUHJvYyA9IDEwODUKK2tXaW5kb3dGbG9hdFNpZGVGdWxsWm9vbUdyb3dQcm9jID0gMTA4Nwora1dpbmRvd1NoZWV0UHJvYyA9IDEwODgKK2tXaW5kb3dTaGVldEFsZXJ0UHJvYyA9IDExMjAKK2tXaW5kb3dTaW1wbGVQcm9jID0gMTEwNAora1dpbmRvd1NpbXBsZUZyYW1lUHJvYyA9IDExMDUKK2tXaW5kb3dOb1Bvc2l0aW9uID0gMHgwMDAwCitrV2luZG93RGVmYXVsdFBvc2l0aW9uID0gMHgwMDAwCitrV2luZG93Q2VudGVyTWFpblNjcmVlbiA9IDB4MjgwQQora1dpbmRvd0FsZXJ0UG9zaXRpb25NYWluU2NyZWVuID0gMHgzMDBBCitrV2luZG93U3RhZ2dlck1haW5TY3JlZW4gPSAweDM4MEEKK2tXaW5kb3dDZW50ZXJQYXJlbnRXaW5kb3cgPSAweEE4MEEKK2tXaW5kb3dBbGVydFBvc2l0aW9uUGFyZW50V2luZG93ID0gMHhCMDBBCitrV2luZG93U3RhZ2dlclBhcmVudFdpbmRvdyA9IDB4QjgwQQora1dpbmRvd0NlbnRlclBhcmVudFdpbmRvd1NjcmVlbiA9IDB4NjgwQQora1dpbmRvd0FsZXJ0UG9zaXRpb25QYXJlbnRXaW5kb3dTY3JlZW4gPSAweDcwMEEKK2tXaW5kb3dTdGFnZ2VyUGFyZW50V2luZG93U2NyZWVuID0gMHg3ODBBCitrV2luZG93Q2VudGVyT25NYWluU2NyZWVuID0gMQora1dpbmRvd0NlbnRlck9uUGFyZW50V2luZG93ID0gMgora1dpbmRvd0NlbnRlck9uUGFyZW50V2luZG93U2NyZWVuID0gMwora1dpbmRvd0Nhc2NhZGVPbk1haW5TY3JlZW4gPSA0CitrV2luZG93Q2FzY2FkZU9uUGFyZW50V2luZG93ID0gNQora1dpbmRvd0Nhc2NhZGVPblBhcmVudFdpbmRvd1NjcmVlbiA9IDYKK2tXaW5kb3dDYXNjYWRlU3RhcnRBdFBhcmVudFdpbmRvd1NjcmVlbiA9IDEwCitrV2luZG93QWxlcnRQb3NpdGlvbk9uTWFpblNjcmVlbiA9IDcKK2tXaW5kb3dBbGVydFBvc2l0aW9uT25QYXJlbnRXaW5kb3cgPSA4CitrV2luZG93QWxlcnRQb3NpdGlvbk9uUGFyZW50V2luZG93U2NyZWVuID0gOQora1dpbmRvd1RpdGxlQmFyUmduID0gMAora1dpbmRvd1RpdGxlVGV4dFJnbiA9IDEKK2tXaW5kb3dDbG9zZUJveFJnbiA9IDIKK2tXaW5kb3dab29tQm94UmduID0gMwora1dpbmRvd0RyYWdSZ24gPSA1CitrV2luZG93R3Jvd1JnbiA9IDYKK2tXaW5kb3dDb2xsYXBzZUJveFJnbiA9IDcKK2tXaW5kb3dUaXRsZVByb3h5SWNvblJnbiA9IDgKK2tXaW5kb3dTdHJ1Y3R1cmVSZ24gPSAzMgora1dpbmRvd0NvbnRlbnRSZ24gPSAzMwora1dpbmRvd1VwZGF0ZVJnbiA9IDM0CitrV2luZG93T3BhcXVlUmduID0gMzUKK2tXaW5kb3dHbG9iYWxQb3J0UmduID0gNDAKK2RpYWxvZ0tpbmQgPSAyCit1c2VyS2luZCA9IDgKK2tEaWFsb2dXaW5kb3dLaW5kID0gMgora0FwcGxpY2F0aW9uV2luZG93S2luZCA9IDgKK2luRGVzayA9IDAKK2luTm9XaW5kb3cgPSAwCitpbk1lbnVCYXIgPSAxCitpblN5c1dpbmRvdyA9IDIKK2luQ29udGVudCA9IDMKK2luRHJhZyA9IDQKK2luR3JvdyA9IDUKK2luR29Bd2F5ID0gNgoraW5ab29tSW4gPSA3Citpblpvb21PdXQgPSA4CitpbkNvbGxhcHNlQm94ID0gMTEKK2luUHJveHlJY29uID0gMTIKK2luVG9vbGJhckJ1dHRvbiA9IDEzCitpblN0cnVjdHVyZSA9IDE1Cit3Tm9IaXQgPSAwCit3SW5Db250ZW50ID0gMQord0luRHJhZyA9IDIKK3dJbkdyb3cgPSAzCit3SW5Hb0F3YXkgPSA0Cit3SW5ab29tSW4gPSA1Cit3SW5ab29tT3V0ID0gNgord0luQ29sbGFwc2VCb3ggPSA5Cit3SW5Qcm94eUljb24gPSAxMAord0luVG9vbGJhckJ1dHRvbiA9IDExCit3SW5TdHJ1Y3R1cmUgPSAxMwora1dpbmRvd01zZ0RyYXcgPSAwCitrV2luZG93TXNnSGl0VGVzdCA9IDEKK2tXaW5kb3dNc2dDYWxjdWxhdGVTaGFwZSA9IDIKK2tXaW5kb3dNc2dJbml0aWFsaXplID0gMwora1dpbmRvd01zZ0NsZWFuVXAgPSA0CitrV2luZG93TXNnRHJhd0dyb3dPdXRsaW5lID0gNQora1dpbmRvd01zZ0RyYXdHcm93Qm94ID0gNgora1dpbmRvd01zZ0dldEZlYXR1cmVzID0gNwora1dpbmRvd01zZ0dldFJlZ2lvbiA9IDgKK2tXaW5kb3dNc2dEcmFnSGlsaXRlID0gOQora1dpbmRvd01zZ01vZGlmaWVkID0gMTAKK2tXaW5kb3dNc2dEcmF3SW5DdXJyZW50UG9ydCA9IDExCitrV2luZG93TXNnU2V0dXBQcm94eURyYWdJbWFnZSA9IDEyCitrV2luZG93TXNnU3RhdGVDaGFuZ2VkID0gMTMKK2tXaW5kb3dNc2dNZWFzdXJlVGl0bGUgPSAxNAora1dpbmRvd01zZ0dldEdyb3dJbWFnZVJlZ2lvbiA9IDE5Cit3RHJhdyA9IDAKK3dIaXQgPSAxCit3Q2FsY1JnbnMgPSAyCit3TmV3ID0gMword0Rpc3Bvc2UgPSA0Cit3R3JvdyA9IDUKK3dEcmF3R0ljb24gPSA2CitrV2luZG93U3RhdGVUaXRsZUNoYW5nZWQgPSAoMSA8PCAwKQora1dpbmRvd0Nhbkdyb3cgPSAoMSA8PCAwKQora1dpbmRvd0Nhblpvb20gPSAoMSA8PCAxKQora1dpbmRvd0NhbkNvbGxhcHNlID0gKDEgPDwgMikKK2tXaW5kb3dJc01vZGFsID0gKDEgPDwgMykKK2tXaW5kb3dDYW5HZXRXaW5kb3dSZWdpb24gPSAoMSA8PCA0KQora1dpbmRvd0lzQWxlcnQgPSAoMSA8PCA1KQora1dpbmRvd0hhc1RpdGxlQmFyID0gKDEgPDwgNikKK2tXaW5kb3dTdXBwb3J0c0RyYWdIaWxpdGUgPSAoMSA8PCA3KQora1dpbmRvd1N1cHBvcnRzTW9kaWZpZWRCaXQgPSAoMSA8PCA4KQora1dpbmRvd0NhbkRyYXdJbkN1cnJlbnRQb3J0ID0gKDEgPDwgOSkKK2tXaW5kb3dDYW5TZXR1cFByb3h5RHJhZ0ltYWdlID0gKDEgPDwgMTApCitrV2luZG93Q2FuTWVhc3VyZVRpdGxlID0gKDEgPDwgMTEpCitrV2luZG93V2FudHNEaXNwb3NlQXRQcm9jZXNzRGVhdGggPSAoMSA8PCAxMikKK2tXaW5kb3dTdXBwb3J0c0dldEdyb3dJbWFnZVJlZ2lvbiA9ICgxIDw8IDEzKQora1dpbmRvd0RlZlN1cHBvcnRzQ29sb3JHcmFmUG9ydCA9IDB4NDAwMDAwMDIKK2tXaW5kb3dJc09wYXF1ZSA9ICgxIDw8IDE0KQora1dpbmRvd1N1cHBvcnRzU2V0R3Jvd0ltYWdlUmVnaW9uID0gKDEgPDwgMTMpCitkZXNrUGF0SUQgPSAxNgord0NvbnRlbnRDb2xvciA9IDAKK3dGcmFtZUNvbG9yID0gMQord1RleHRDb2xvciA9IDIKK3dIaWxpdGVDb2xvciA9IDMKK3dUaXRsZUJhckNvbG9yID0gNAorIyBrTW91c2VVcE91dE9mU2xvcCA9IChsb25nKTB4ODAwMDgwMDAKK2tXaW5kb3dEZWZpbml0aW9uVmVyc2lvbk9uZSA9IDEKK2tXaW5kb3dEZWZpbml0aW9uVmVyc2lvblR3byA9IDIKK2tXaW5kb3dJc0NvbGxhcHNlZFN0YXRlID0gKDEgPDwgMEwpCitrU3RvcmVkV2luZG93U3lzdGVtVGFnID0gRk9VUl9DSEFSX0NPREUoJ2FwcGwnKQora1N0b3JlZEJhc2ljV2luZG93RGVzY3JpcHRpb25JRCA9IEZPVVJfQ0hBUl9DT0RFKCdzYmFzJykKK2tTdG9yZWRXaW5kb3dQYXNjYWxUaXRsZUlEID0gRk9VUl9DSEFSX0NPREUoJ3MyNTUnKQora1dpbmRvd0RlZlByb2NQdHIgPSAwCitrV2luZG93RGVmT2JqZWN0Q2xhc3MgPSAxCitrV2luZG93RGVmUHJvY0lEID0gMgora1dpbmRvd01vZGFsaXR5Tm9uZSA9IDAKK2tXaW5kb3dNb2RhbGl0eVN5c3RlbU1vZGFsID0gMQora1dpbmRvd01vZGFsaXR5QXBwTW9kYWwgPSAyCitrV2luZG93TW9kYWxpdHlXaW5kb3dNb2RhbCA9IDMKK2tXaW5kb3dHcm91cEF0dHJTZWxlY3RBc0xheWVyID0gMSA8PCAwCitrV2luZG93R3JvdXBBdHRyTW92ZVRvZ2V0aGVyID0gMSA8PCAxCitrV2luZG93R3JvdXBBdHRyTGF5ZXJUb2dldGhlciA9IDEgPDwgMgora1dpbmRvd0dyb3VwQXR0clNoYXJlZEFjdGl2YXRpb24gPSAxIDw8IDMKK2tXaW5kb3dHcm91cEF0dHJIaWRlT25Db2xsYXBzZSA9IDEgPDwgNAora1dpbmRvd0FjdGl2YXRpb25TY29wZU5vbmUgPSAwCitrV2luZG93QWN0aXZhdGlvblNjb3BlSW5kZXBlbmRlbnQgPSAxCitrV2luZG93QWN0aXZhdGlvblNjb3BlQWxsID0gMgora05leHRXaW5kb3dHcm91cCA9IHRydWUKK2tQcmV2aW91c1dpbmRvd0dyb3VwID0gZmFsc2UKK2tXaW5kb3dHcm91cENvbnRlbnRzUmV0dXJuV2luZG93cyA9IDEgPDwgMAora1dpbmRvd0dyb3VwQ29udGVudHNSZWN1cnNlID0gMSA8PCAxCitrV2luZG93R3JvdXBDb250ZW50c1Zpc2libGUgPSAxIDw8IDIKK2tXaW5kb3dQYWludFByb2NPcHRpb25zTm9uZSA9IDAKK2tTY3JvbGxXaW5kb3dOb09wdGlvbnMgPSAwCitrU2Nyb2xsV2luZG93SW52YWxpZGF0ZSA9ICgxTCA8PCAwKQora1Njcm9sbFdpbmRvd0VyYXNlVG9Qb3J0QmFja2dyb3VuZCA9ICgxTCA8PCAxKQora1dpbmRvd01lbnVJbmNsdWRlUm90YXRlID0gMSA8PCAwCitrV2luZG93Wm9vbVRyYW5zaXRpb25FZmZlY3QgPSAxCitrV2luZG93U2hlZXRUcmFuc2l0aW9uRWZmZWN0ID0gMgora1dpbmRvd1NsaWRlVHJhbnNpdGlvbkVmZmVjdCA9IDMKK2tXaW5kb3dTaG93VHJhbnNpdGlvbkFjdGlvbiA9IDEKK2tXaW5kb3dIaWRlVHJhbnNpdGlvbkFjdGlvbiA9IDIKK2tXaW5kb3dNb3ZlVHJhbnNpdGlvbkFjdGlvbiA9IDMKK2tXaW5kb3dSZXNpemVUcmFuc2l0aW9uQWN0aW9uID0gNAora1dpbmRvd0NvbnN0cmFpbk1heVJlc2l6ZSA9ICgxTCA8PCAwKQora1dpbmRvd0NvbnN0cmFpbk1vdmVSZWdhcmRsZXNzT2ZGaXQgPSAoMUwgPDwgMSkKK2tXaW5kb3dDb25zdHJhaW5BbGxvd1BhcnRpYWwgPSAoMUwgPDwgMikKK2tXaW5kb3dDb25zdHJhaW5DYWxjT25seSA9ICgxTCA8PCAzKQora1dpbmRvd0NvbnN0cmFpblVzZVRyYW5zaXRpb25XaW5kb3cgPSAoMUwgPDwgNCkKK2tXaW5kb3dDb25zdHJhaW5TdGFuZGFyZE9wdGlvbnMgPSBrV2luZG93Q29uc3RyYWluTW92ZVJlZ2FyZGxlc3NPZkZpdAora1dpbmRvd0xhdGVudFZpc2libGVGbG9hdGVyID0gMSA8PCAwCitrV2luZG93TGF0ZW50VmlzaWJsZVN1c3BlbmQgPSAxIDw8IDEKK2tXaW5kb3dMYXRlbnRWaXNpYmxlRnVsbFNjcmVlbiA9IDEgPDwgMgora1dpbmRvd0xhdGVudFZpc2libGVBcHBIaWRkZW4gPSAxIDw8IDMKK2tXaW5kb3dMYXRlbnRWaXNpYmxlQ29sbGFwc2VkT3duZXIgPSAxIDw8IDQKK2tXaW5kb3dMYXRlbnRWaXNpYmxlQ29sbGFwc2VkR3JvdXAgPSAxIDw8IDUKK2tXaW5kb3dQcm9wZXJ0eVBlcnNpc3RlbnQgPSAweDAwMDAwMDAxCitrV2luZG93R3JvdXBBdHRyU2VsZWN0YWJsZSA9IGtXaW5kb3dHcm91cEF0dHJTZWxlY3RBc0xheWVyCitrV2luZG93R3JvdXBBdHRyUG9zaXRpb25GaXhlZCA9IGtXaW5kb3dHcm91cEF0dHJNb3ZlVG9nZXRoZXIKK2tXaW5kb3dHcm91cEF0dHJaT3JkZXJGaXhlZCA9IGtXaW5kb3dHcm91cEF0dHJMYXllclRvZ2V0aGVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9XaW5kb3dzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1dpbmRvd3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTcwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9XaW5kb3dzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9XaW5kb3dzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL1dpbmRvd3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTcwZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9XaW5kb3dzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YTlhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0NhcmJvbi9fX2luaXRfXy5weQpAQCAtMCwwICsxLDcgQEAKKyMgRmlsdGVyIG91dCB3YXJuaW5ncyBhYm91dCBzaWduZWQvdW5zaWduZWQgY29uc3RhbnRzCitpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiIiwgRnV0dXJlV2FybmluZywgIi4qQ29udHJvbHMiKQord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIiLCBGdXR1cmVXYXJuaW5nLCAiLipNYWNUZXh0RWRpdG9yIikKKworZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJJbiAzLngsIHRoZSBDYXJib24gcGFja2FnZSBpcyByZW1vdmVkLiIsIHN0YWNrbGV2ZWw9MikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjk2NjZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvQ2FyYm9uL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjk2NjZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9DYXJib24vX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvRWFzeURpYWxvZ3MucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0Vhc3lEaWFsb2dzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyOWNmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0Vhc3lEaWFsb2dzLnB5CkBAIC0wLDAgKzEsODQxIEBACisiIiJFYXN5IHRvIHVzZSBkaWFsb2dzLgorCitNZXNzYWdlKG1zZykgLS0gZGlzcGxheSBhIG1lc3NhZ2UgYW5kIGFuIE9LIGJ1dHRvbi4KK0Fza1N0cmluZyhwcm9tcHQsIGRlZmF1bHQpIC0tIGFzayBmb3IgYSBzdHJpbmcsIGRpc3BsYXkgT0sgYW5kIENhbmNlbCBidXR0b25zLgorQXNrUGFzc3dvcmQocHJvbXB0LCBkZWZhdWx0KSAtLSBsaWtlIEFza1N0cmluZygpLCBidXQgc2hvd3MgdGV4dCBhcyBidWxsZXRzLgorQXNrWWVzTm9DYW5jZWwocXVlc3Rpb24sIGRlZmF1bHQpIC0tIGRpc3BsYXkgYSBxdWVzdGlvbiBhbmQgWWVzLCBObyBhbmQgQ2FuY2VsIGJ1dHRvbnMuCitHZXRBcmd2KG9wdGlvbmxpc3QsIGNvbW1hbmRsaXN0KSAtLSBmaWxsIGEgc3lzLmFyZ3YtbGlrZSBsaXN0IHVzaW5nIGEgZGlhbG9nCitBc2tGaWxlRm9yT3BlbiguLi4pIC0tIEFzayB0aGUgdXNlciBmb3IgYW4gZXhpc3RpbmcgZmlsZQorQXNrRmlsZUZvclNhdmUoLi4uKSAtLSBBc2sgdGhlIHVzZXIgZm9yIGFuIG91dHB1dCBmaWxlCitBc2tGb2xkZXIoLi4uKSAtLSBBc2sgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZm9sZGVyCitiYXIgPSBQcm9ncmVzcyhsYWJlbCwgbWF4dmFsdWUpIC0tIERpc3BsYXkgYSBwcm9ncmVzcyBiYXIKK2Jhci5zZXQodmFsdWUpIC0tIFNldCB2YWx1ZQorYmFyLmluYyggKmFtb3VudCApIC0tIGluY3JlbWVudCB2YWx1ZSBieSBhbW91bnQgKGRlZmF1bHQ9MSkKK2Jhci5sYWJlbCggKm5ld2xhYmVsICkgLS0gZ2V0IG9yIHNldCB0ZXh0IGxhYmVsLgorCitNb3JlIGRvY3VtZW50YXRpb24gaW4gZWFjaCBmdW5jdGlvbi4KK1RoaXMgbW9kdWxlIHVzZXMgRExPRyByZXNvdXJjZXMgMjYwIGFuZCBvbi4KK0Jhc2VkIHVwb24gU1REV0lOIGRpYWxvZ3Mgd2l0aCB0aGUgc2FtZSBuYW1lcyBhbmQgZnVuY3Rpb25zLgorIiIiCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgRWFzeURpYWxvZ3MgbW9kdWxlIGlzIHJlbW92ZWQuIiwgc3RhY2tsZXZlbD0yKQorCitmcm9tIENhcmJvbi5EbGcgaW1wb3J0IEdldE5ld0RpYWxvZywgU2V0RGlhbG9nSXRlbVRleHQsIEdldERpYWxvZ0l0ZW1UZXh0LCBNb2RhbERpYWxvZworZnJvbSBDYXJib24gaW1wb3J0IFFkCitmcm9tIENhcmJvbiBpbXBvcnQgUXVpY2tEcmF3Citmcm9tIENhcmJvbiBpbXBvcnQgRGlhbG9ncworZnJvbSBDYXJib24gaW1wb3J0IFdpbmRvd3MKK2Zyb20gQ2FyYm9uIGltcG9ydCBEbGcsV2luLEV2dCxFdmVudHMgIyBzZG03ZworZnJvbSBDYXJib24gaW1wb3J0IEN0bAorZnJvbSBDYXJib24gaW1wb3J0IENvbnRyb2xzCitmcm9tIENhcmJvbiBpbXBvcnQgTWVudQorZnJvbSBDYXJib24gaW1wb3J0IEFFCitpbXBvcnQgTmF2CitpbXBvcnQgTWFjT1MKK2ltcG9ydCBzdHJpbmcKK2Zyb20gQ2FyYm9uLkNvbnRyb2xBY2Nlc3NvciBpbXBvcnQgKiAgICAjIEFsc28gaW1wb3J0IENvbnRyb2xzIGNvbnN0YW50cworaW1wb3J0IENhcmJvbi5GaWxlCitpbXBvcnQgbWFjcmVzb3VyY2UKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitfX2FsbF9fID0gWydNZXNzYWdlJywgJ0Fza1N0cmluZycsICdBc2tQYXNzd29yZCcsICdBc2tZZXNOb0NhbmNlbCcsCisgICAgJ0dldEFyZ3YnLCAnQXNrRmlsZUZvck9wZW4nLCAnQXNrRmlsZUZvclNhdmUnLCAnQXNrRm9sZGVyJywKKyAgICAnUHJvZ3Jlc3NCYXInXQorCitfaW5pdGlhbGl6ZWQgPSAwCisKK2RlZiBfaW5pdGlhbGl6ZSgpOgorICAgIGdsb2JhbCBfaW5pdGlhbGl6ZWQKKyAgICBpZiBfaW5pdGlhbGl6ZWQ6IHJldHVybgorICAgIG1hY3Jlc291cmNlLm5lZWQoIkRMT0ciLCAyNjAsICJkaWFsb2dzLnJzcmMiLCBfX25hbWVfXykKKworZGVmIF9pbnRlcmFjdCgpOgorICAgICIiIk1ha2Ugc3VyZSB0aGUgYXBwbGljYXRpb24gaXMgaW4gdGhlIGZvcmVncm91bmQiIiIKKyAgICBBRS5BRUludGVyYWN0V2l0aFVzZXIoNTAwMDAwMDApCisKK2RlZiBjcjJsZih0ZXh0KToKKyAgICBpZiAnXHInIGluIHRleHQ6CisgICAgICAgIHRleHQgPSBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQodGV4dCwgJ1xyJyksICdcbicpCisgICAgcmV0dXJuIHRleHQKKworZGVmIGxmMmNyKHRleHQpOgorICAgIGlmICdcbicgaW4gdGV4dDoKKyAgICAgICAgdGV4dCA9IHN0cmluZy5qb2luKHN0cmluZy5zcGxpdCh0ZXh0LCAnXG4nKSwgJ1xyJykKKyAgICBpZiBsZW4odGV4dCkgPiAyNTM6CisgICAgICAgIHRleHQgPSB0ZXh0WzoyNTNdICsgJ1wzMTEnCisgICAgcmV0dXJuIHRleHQKKworZGVmIE1lc3NhZ2UobXNnLCBpZD0yNjAsIG9rPU5vbmUpOgorICAgICIiIkRpc3BsYXkgYSBNRVNTQUdFIHN0cmluZy4KKworICAgIFJldHVybiB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgT0sgYnV0dG9uIG9yIHByZXNzZXMgUmV0dXJuLgorCisgICAgVGhlIE1FU1NBR0Ugc3RyaW5nIGNhbiBiZSBhdCBtb3N0IDI1NSBjaGFyYWN0ZXJzIGxvbmcuCisgICAgIiIiCisgICAgX2luaXRpYWxpemUoKQorICAgIF9pbnRlcmFjdCgpCisgICAgZCA9IEdldE5ld0RpYWxvZyhpZCwgLTEpCisgICAgaWYgbm90IGQ6CisgICAgICAgIHByaW50ICJFYXN5RGlhbG9nczogQ2FuJ3QgZ2V0IERMT0cgcmVzb3VyY2Ugd2l0aCBpZCA9IiwgaWQsICIgKG1pc3NpbmcgcmVzb3VyY2UgZmlsZT8pIgorICAgICAgICByZXR1cm4KKyAgICBoID0gZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKDIpCisgICAgU2V0RGlhbG9nSXRlbVRleHQoaCwgbGYyY3IobXNnKSkKKyAgICBpZiBvayBpcyBub3QgTm9uZToKKyAgICAgICAgaCA9IGQuR2V0RGlhbG9nSXRlbUFzQ29udHJvbCgxKQorICAgICAgICBoLlNldENvbnRyb2xUaXRsZShvaykKKyAgICBkLlNldERpYWxvZ0RlZmF1bHRJdGVtKDEpCisgICAgZC5BdXRvU2l6ZURpYWxvZygpCisgICAgZC5HZXREaWFsb2dXaW5kb3coKS5TaG93V2luZG93KCkKKyAgICB3aGlsZSAxOgorICAgICAgICBuID0gTW9kYWxEaWFsb2coTm9uZSkKKyAgICAgICAgaWYgbiA9PSAxOgorICAgICAgICAgICAgcmV0dXJuCisKKworZGVmIEFza1N0cmluZyhwcm9tcHQsIGRlZmF1bHQgPSAiIiwgaWQ9MjYxLCBvaz1Ob25lLCBjYW5jZWw9Tm9uZSk6CisgICAgIiIiRGlzcGxheSBhIFBST01QVCBzdHJpbmcgYW5kIGEgdGV4dCBlbnRyeSBmaWVsZCB3aXRoIGEgREVGQVVMVCBzdHJpbmcuCisKKyAgICBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSB0ZXh0IGVudHJ5IGZpZWxkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZQorICAgIE9LIGJ1dHRvbiBvciBwcmVzc2VzIFJldHVybi4KKyAgICBSZXR1cm4gTm9uZSB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgQ2FuY2VsIGJ1dHRvbi4KKworICAgIElmIG9taXR0ZWQsIERFRkFVTFQgaXMgZW1wdHkuCisKKyAgICBUaGUgUFJPTVBUIGFuZCBERUZBVUxUIHN0cmluZ3MsIGFzIHdlbGwgYXMgdGhlIHJldHVybiB2YWx1ZSwKKyAgICBjYW4gYmUgYXQgbW9zdCAyNTUgY2hhcmFjdGVycyBsb25nLgorICAgICIiIgorCisgICAgX2luaXRpYWxpemUoKQorICAgIF9pbnRlcmFjdCgpCisgICAgZCA9IEdldE5ld0RpYWxvZyhpZCwgLTEpCisgICAgaWYgbm90IGQ6CisgICAgICAgIHByaW50ICJFYXN5RGlhbG9nczogQ2FuJ3QgZ2V0IERMT0cgcmVzb3VyY2Ugd2l0aCBpZCA9IiwgaWQsICIgKG1pc3NpbmcgcmVzb3VyY2UgZmlsZT8pIgorICAgICAgICByZXR1cm4KKyAgICBoID0gZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKDMpCisgICAgU2V0RGlhbG9nSXRlbVRleHQoaCwgbGYyY3IocHJvbXB0KSkKKyAgICBoID0gZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKDQpCisgICAgU2V0RGlhbG9nSXRlbVRleHQoaCwgbGYyY3IoZGVmYXVsdCkpCisgICAgZC5TZWxlY3REaWFsb2dJdGVtVGV4dCg0LCAwLCA5OTkpCisjICAgICAgIGQuU2V0RGlhbG9nSXRlbSg0LCAwLCAyNTUpCisgICAgaWYgb2sgaXMgbm90IE5vbmU6CisgICAgICAgIGggPSBkLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woMSkKKyAgICAgICAgaC5TZXRDb250cm9sVGl0bGUob2spCisgICAgaWYgY2FuY2VsIGlzIG5vdCBOb25lOgorICAgICAgICBoID0gZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKDIpCisgICAgICAgIGguU2V0Q29udHJvbFRpdGxlKGNhbmNlbCkKKyAgICBkLlNldERpYWxvZ0RlZmF1bHRJdGVtKDEpCisgICAgZC5TZXREaWFsb2dDYW5jZWxJdGVtKDIpCisgICAgZC5BdXRvU2l6ZURpYWxvZygpCisgICAgZC5HZXREaWFsb2dXaW5kb3coKS5TaG93V2luZG93KCkKKyAgICB3aGlsZSAxOgorICAgICAgICBuID0gTW9kYWxEaWFsb2coTm9uZSkKKyAgICAgICAgaWYgbiA9PSAxOgorICAgICAgICAgICAgaCA9IGQuR2V0RGlhbG9nSXRlbUFzQ29udHJvbCg0KQorICAgICAgICAgICAgcmV0dXJuIGNyMmxmKEdldERpYWxvZ0l0ZW1UZXh0KGgpKQorICAgICAgICBpZiBuID09IDI6IHJldHVybiBOb25lCisKK2RlZiBBc2tQYXNzd29yZChwcm9tcHQsICBkZWZhdWx0PScnLCBpZD0yNjQsIG9rPU5vbmUsIGNhbmNlbD1Ob25lKToKKyAgICAiIiJEaXNwbGF5IGEgUFJPTVBUIHN0cmluZyBhbmQgYSB0ZXh0IGVudHJ5IGZpZWxkIHdpdGggYSBERUZBVUxUIHN0cmluZy4KKyAgICBUaGUgc3RyaW5nIGlzIGRpc3BsYXllZCBhcyBidWxsZXRzIG9ubHkuCisKKyAgICBSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSB0ZXh0IGVudHJ5IGZpZWxkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZQorICAgIE9LIGJ1dHRvbiBvciBwcmVzc2VzIFJldHVybi4KKyAgICBSZXR1cm4gTm9uZSB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgQ2FuY2VsIGJ1dHRvbi4KKworICAgIElmIG9taXR0ZWQsIERFRkFVTFQgaXMgZW1wdHkuCisKKyAgICBUaGUgUFJPTVBUIGFuZCBERUZBVUxUIHN0cmluZ3MsIGFzIHdlbGwgYXMgdGhlIHJldHVybiB2YWx1ZSwKKyAgICBjYW4gYmUgYXQgbW9zdCAyNTUgY2hhcmFjdGVycyBsb25nLgorICAgICIiIgorICAgIF9pbml0aWFsaXplKCkKKyAgICBfaW50ZXJhY3QoKQorICAgIGQgPSBHZXROZXdEaWFsb2coaWQsIC0xKQorICAgIGlmIG5vdCBkOgorICAgICAgICBwcmludCAiRWFzeURpYWxvZ3M6IENhbid0IGdldCBETE9HIHJlc291cmNlIHdpdGggaWQgPSIsIGlkLCAiIChtaXNzaW5nIHJlc291cmNlIGZpbGU/KSIKKyAgICAgICAgcmV0dXJuCisgICAgaCA9IGQuR2V0RGlhbG9nSXRlbUFzQ29udHJvbCgzKQorICAgIFNldERpYWxvZ0l0ZW1UZXh0KGgsIGxmMmNyKHByb21wdCkpCisgICAgcHdkID0gZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKDQpCisgICAgYnVsbGV0cyA9ICdcMjQ1JypsZW4oZGVmYXVsdCkKKyMjICAgICAgU2V0Q29udHJvbERhdGEocHdkLCBrQ29udHJvbEVkaXRUZXh0UGFydCwga0NvbnRyb2xFZGl0VGV4dFRleHRUYWcsIGJ1bGxldHMpCisgICAgU2V0Q29udHJvbERhdGEocHdkLCBrQ29udHJvbEVkaXRUZXh0UGFydCwga0NvbnRyb2xFZGl0VGV4dFBhc3N3b3JkVGFnLCBkZWZhdWx0KQorICAgIGQuU2VsZWN0RGlhbG9nSXRlbVRleHQoNCwgMCwgOTk5KQorICAgIEN0bC5TZXRLZXlib2FyZEZvY3VzKGQuR2V0RGlhbG9nV2luZG93KCksIHB3ZCwga0NvbnRyb2xFZGl0VGV4dFBhcnQpCisgICAgaWYgb2sgaXMgbm90IE5vbmU6CisgICAgICAgIGggPSBkLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woMSkKKyAgICAgICAgaC5TZXRDb250cm9sVGl0bGUob2spCisgICAgaWYgY2FuY2VsIGlzIG5vdCBOb25lOgorICAgICAgICBoID0gZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKDIpCisgICAgICAgIGguU2V0Q29udHJvbFRpdGxlKGNhbmNlbCkKKyAgICBkLlNldERpYWxvZ0RlZmF1bHRJdGVtKERpYWxvZ3Mub2spCisgICAgZC5TZXREaWFsb2dDYW5jZWxJdGVtKERpYWxvZ3MuY2FuY2VsKQorICAgIGQuQXV0b1NpemVEaWFsb2coKQorICAgIGQuR2V0RGlhbG9nV2luZG93KCkuU2hvd1dpbmRvdygpCisgICAgd2hpbGUgMToKKyAgICAgICAgbiA9IE1vZGFsRGlhbG9nKE5vbmUpCisgICAgICAgIGlmIG4gPT0gMToKKyAgICAgICAgICAgIGggPSBkLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woNCkKKyAgICAgICAgICAgIHJldHVybiBjcjJsZihHZXRDb250cm9sRGF0YShwd2QsIGtDb250cm9sRWRpdFRleHRQYXJ0LCBrQ29udHJvbEVkaXRUZXh0UGFzc3dvcmRUYWcpKQorICAgICAgICBpZiBuID09IDI6IHJldHVybiBOb25lCisKK2RlZiBBc2tZZXNOb0NhbmNlbChxdWVzdGlvbiwgZGVmYXVsdCA9IDAsIHllcz1Ob25lLCBubz1Ob25lLCBjYW5jZWw9Tm9uZSwgaWQ9MjYyKToKKyAgICAiIiJEaXNwbGF5IGEgUVVFU1RJT04gc3RyaW5nIHdoaWNoIGNhbiBiZSBhbnN3ZXJlZCB3aXRoIFllcyBvciBOby4KKworICAgIFJldHVybiAxIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBZZXMgYnV0dG9uLgorICAgIFJldHVybiAwIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBObyBidXR0b24uCisgICAgUmV0dXJuIC0xIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBDYW5jZWwgYnV0dG9uLgorCisgICAgV2hlbiB0aGUgdXNlciBwcmVzc2VzIFJldHVybiwgdGhlIERFRkFVTFQgdmFsdWUgaXMgcmV0dXJuZWQuCisgICAgSWYgb21pdHRlZCwgdGhpcyBpcyAwIChObykuCisKKyAgICBUaGUgUVVFU1RJT04gc3RyaW5nIGNhbiBiZSBhdCBtb3N0IDI1NSBjaGFyYWN0ZXJzLgorICAgICIiIgorCisgICAgX2luaXRpYWxpemUoKQorICAgIF9pbnRlcmFjdCgpCisgICAgZCA9IEdldE5ld0RpYWxvZyhpZCwgLTEpCisgICAgaWYgbm90IGQ6CisgICAgICAgIHByaW50ICJFYXN5RGlhbG9nczogQ2FuJ3QgZ2V0IERMT0cgcmVzb3VyY2Ugd2l0aCBpZCA9IiwgaWQsICIgKG1pc3NpbmcgcmVzb3VyY2UgZmlsZT8pIgorICAgICAgICByZXR1cm4KKyAgICAjIEJ1dHRvbiBhc3NpZ25tZW50czoKKyAgICAjIDEgPSBkZWZhdWx0IChpbnZpc2libGUpCisgICAgIyAyID0gWWVzCisgICAgIyAzID0gTm8KKyAgICAjIDQgPSBDYW5jZWwKKyAgICAjIFRoZSBxdWVzdGlvbiBzdHJpbmcgaXMgaXRlbSA1CisgICAgaCA9IGQuR2V0RGlhbG9nSXRlbUFzQ29udHJvbCg1KQorICAgIFNldERpYWxvZ0l0ZW1UZXh0KGgsIGxmMmNyKHF1ZXN0aW9uKSkKKyAgICBpZiB5ZXMgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIHllcyA9PSAnJzoKKyAgICAgICAgICAgIGQuSGlkZURpYWxvZ0l0ZW0oMikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGggPSBkLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woMikKKyAgICAgICAgICAgIGguU2V0Q29udHJvbFRpdGxlKHllcykKKyAgICBpZiBubyBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgbm8gPT0gJyc6CisgICAgICAgICAgICBkLkhpZGVEaWFsb2dJdGVtKDMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoID0gZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKDMpCisgICAgICAgICAgICBoLlNldENvbnRyb2xUaXRsZShubykKKyAgICBpZiBjYW5jZWwgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIGNhbmNlbCA9PSAnJzoKKyAgICAgICAgICAgIGQuSGlkZURpYWxvZ0l0ZW0oNCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGggPSBkLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woNCkKKyAgICAgICAgICAgIGguU2V0Q29udHJvbFRpdGxlKGNhbmNlbCkKKyAgICBkLlNldERpYWxvZ0NhbmNlbEl0ZW0oNCkKKyAgICBpZiBkZWZhdWx0ID09IDE6CisgICAgICAgIGQuU2V0RGlhbG9nRGVmYXVsdEl0ZW0oMikKKyAgICBlbGlmIGRlZmF1bHQgPT0gMDoKKyAgICAgICAgZC5TZXREaWFsb2dEZWZhdWx0SXRlbSgzKQorICAgIGVsaWYgZGVmYXVsdCA9PSAtMToKKyAgICAgICAgZC5TZXREaWFsb2dEZWZhdWx0SXRlbSg0KQorICAgIGQuQXV0b1NpemVEaWFsb2coKQorICAgIGQuR2V0RGlhbG9nV2luZG93KCkuU2hvd1dpbmRvdygpCisgICAgd2hpbGUgMToKKyAgICAgICAgbiA9IE1vZGFsRGlhbG9nKE5vbmUpCisgICAgICAgIGlmIG4gPT0gMTogcmV0dXJuIGRlZmF1bHQKKyAgICAgICAgaWYgbiA9PSAyOiByZXR1cm4gMQorICAgICAgICBpZiBuID09IDM6IHJldHVybiAwCisgICAgICAgIGlmIG4gPT0gNDogcmV0dXJuIC0xCisKKworCisKK3NjcmVlbmJvdW5kcyA9IFFkLkdldFFER2xvYmFsc1NjcmVlbkJpdHMoKS5ib3VuZHMKK3NjcmVlbmJvdW5kcyA9IHNjcmVlbmJvdW5kc1swXSs0LCBzY3JlZW5ib3VuZHNbMV0rNCwgXAorICAgIHNjcmVlbmJvdW5kc1syXS00LCBzY3JlZW5ib3VuZHNbM10tNAorCitrQ29udHJvbFByb2dyZXNzQmFySW5kZXRlcm1pbmF0ZVRhZyA9ICdpbmRlJyAgICAjIGZyb20gQ29udHJvbHMucHkKKworCitjbGFzcyBQcm9ncmVzc0JhcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGl0bGU9IldvcmtpbmcuLi4iLCBtYXh2YWw9MCwgbGFiZWw9IiIsIGlkPTI2Myk6CisgICAgICAgIHNlbGYudyA9IE5vbmUKKyAgICAgICAgc2VsZi5kID0gTm9uZQorICAgICAgICBfaW5pdGlhbGl6ZSgpCisgICAgICAgIHNlbGYuZCA9IEdldE5ld0RpYWxvZyhpZCwgLTEpCisgICAgICAgIHNlbGYudyA9IHNlbGYuZC5HZXREaWFsb2dXaW5kb3coKQorICAgICAgICBzZWxmLmxhYmVsKGxhYmVsKQorICAgICAgICBzZWxmLnRpdGxlKHRpdGxlKQorICAgICAgICBzZWxmLnNldCgwLCBtYXh2YWwpCisgICAgICAgIHNlbGYuZC5BdXRvU2l6ZURpYWxvZygpCisgICAgICAgIHNlbGYudy5TaG93V2luZG93KCkKKyAgICAgICAgc2VsZi5kLkRyYXdEaWFsb2coKQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYudzoKKyAgICAgICAgICAgIHNlbGYudy5CcmluZ1RvRnJvbnQoKQorICAgICAgICAgICAgc2VsZi53LkhpZGVXaW5kb3coKQorICAgICAgICBkZWwgc2VsZi53CisgICAgICAgIGRlbCBzZWxmLmQKKworICAgIGRlZiB0aXRsZShzZWxmLCBuZXdzdHI9IiIpOgorICAgICAgICAiIiJ0aXRsZSh0ZXh0KSAtIFNldCB0aXRsZSBvZiBwcm9ncmVzcyB3aW5kb3ciIiIKKyAgICAgICAgc2VsZi53LkJyaW5nVG9Gcm9udCgpCisgICAgICAgIHNlbGYudy5TZXRXVGl0bGUobmV3c3RyKQorCisgICAgZGVmIGxhYmVsKHNlbGYsICpuZXdzdHIpOgorICAgICAgICAiIiJsYWJlbCh0ZXh0KSAtIFNldCB0ZXh0IGluIHByb2dyZXNzIGJveCIiIgorICAgICAgICBzZWxmLncuQnJpbmdUb0Zyb250KCkKKyAgICAgICAgaWYgbmV3c3RyOgorICAgICAgICAgICAgc2VsZi5fbGFiZWwgPSBsZjJjcihuZXdzdHJbMF0pCisgICAgICAgIHRleHRfaCA9IHNlbGYuZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKDIpCisgICAgICAgIFNldERpYWxvZ0l0ZW1UZXh0KHRleHRfaCwgc2VsZi5fbGFiZWwpCisKKyAgICBkZWYgX3VwZGF0ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIG1heHZhbCA9IHNlbGYubWF4dmFsCisgICAgICAgIGlmIG1heHZhbCA9PSAwOiAgICAgIyBhbiBpbmRldGVybWluYXRlIGJhcgorICAgICAgICAgICAgQ3RsLklkbGVDb250cm9scyhzZWxmLncpICAgICMgc3BpbiB0aGUgYmFyYmVyIHBvbGUKKyAgICAgICAgZWxzZTogICAgICAgICAgICAgICAjIGEgZGV0ZXJtaW5hdGUgYmFyCisgICAgICAgICAgICBpZiBtYXh2YWwgPiAzMjc2NzoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGludCh2YWx1ZS8obWF4dmFsLzMyNzY3LjApKQorICAgICAgICAgICAgICAgIG1heHZhbCA9IDMyNzY3CisgICAgICAgICAgICBtYXh2YWwgPSBpbnQobWF4dmFsKQorICAgICAgICAgICAgdmFsdWUgPSBpbnQodmFsdWUpCisgICAgICAgICAgICBwcm9nYmFyID0gc2VsZi5kLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woMykKKyAgICAgICAgICAgIHByb2diYXIuU2V0Q29udHJvbE1heGltdW0obWF4dmFsKQorICAgICAgICAgICAgcHJvZ2Jhci5TZXRDb250cm9sVmFsdWUodmFsdWUpICAjIHNldCB0aGUgYmFyIGxlbmd0aAorCisgICAgICAgICMgVGVzdCBmb3IgY2FuY2VsIGJ1dHRvbgorICAgICAgICByZWFkeSwgZXYgPSBFdnQuV2FpdE5leHRFdmVudCggRXZlbnRzLm1Eb3duTWFzaywgMSAgKQorICAgICAgICBpZiByZWFkeSA6CisgICAgICAgICAgICB3aGF0LG1zZyx3aGVuLHdoZXJlLG1vZCA9IGV2CisgICAgICAgICAgICBwYXJ0ID0gV2luLkZpbmRXaW5kb3cod2hlcmUpWzBdCisgICAgICAgICAgICBpZiBEbGcuSXNEaWFsb2dFdmVudChldik6CisgICAgICAgICAgICAgICAgZHMgPSBEbGcuRGlhbG9nU2VsZWN0KGV2KQorICAgICAgICAgICAgICAgIGlmIGRzWzBdIGFuZCBkc1sxXSA9PSBzZWxmLmQgYW5kIGRzWy0xXSA9PSAxOgorICAgICAgICAgICAgICAgICAgICBzZWxmLncuSGlkZVdpbmRvdygpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudyA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kID0gTm9uZQorICAgICAgICAgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdCwgZXYKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgcGFydCA9PSA0OiAgICMgaW5EcmFnCisgICAgICAgICAgICAgICAgICAgIHNlbGYudy5EcmFnV2luZG93KHdoZXJlLCBzY3JlZW5ib3VuZHMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgTWFjT1MuSGFuZGxlRXZlbnQoZXYpCisKKworICAgIGRlZiBzZXQoc2VsZiwgdmFsdWUsIG1heD1Ob25lKToKKyAgICAgICAgIiIic2V0KHZhbHVlKSAtIFNldCBwcm9ncmVzcyBiYXIgcG9zaXRpb24iIiIKKyAgICAgICAgaWYgbWF4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5tYXh2YWwgPSBtYXgKKyAgICAgICAgICAgIGJhciA9IHNlbGYuZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKDMpCisgICAgICAgICAgICBpZiBtYXggPD0gMDogICAgIyBpbmRldGVybWluYXRlIGJhcgorICAgICAgICAgICAgICAgIGJhci5TZXRDb250cm9sRGF0YSgwLGtDb250cm9sUHJvZ3Jlc3NCYXJJbmRldGVybWluYXRlVGFnLCdceDAxJykKKyAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAjIGRldGVybWluYXRlIGJhcgorICAgICAgICAgICAgICAgIGJhci5TZXRDb250cm9sRGF0YSgwLGtDb250cm9sUHJvZ3Jlc3NCYXJJbmRldGVybWluYXRlVGFnLCdceDAwJykKKyAgICAgICAgaWYgdmFsdWUgPCAwOgorICAgICAgICAgICAgdmFsdWUgPSAwCisgICAgICAgIGVsaWYgdmFsdWUgPiBzZWxmLm1heHZhbDoKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5tYXh2YWwKKyAgICAgICAgc2VsZi5jdXJ2YWwgPSB2YWx1ZQorICAgICAgICBzZWxmLl91cGRhdGUodmFsdWUpCisKKyAgICBkZWYgaW5jKHNlbGYsIG49MSk6CisgICAgICAgICIiImluYyhhbXQpIC0gSW5jcmVtZW50IHByb2dyZXNzIGJhciBwb3NpdGlvbiIiIgorICAgICAgICBzZWxmLnNldChzZWxmLmN1cnZhbCArIG4pCisKK0FSR1ZfSUQ9MjY1CitBUkdWX0lURU1fT0s9MQorQVJHVl9JVEVNX0NBTkNFTD0yCitBUkdWX09QVElPTl9HUk9VUD0zCitBUkdWX09QVElPTl9FWFBMQUlOPTQKK0FSR1ZfT1BUSU9OX1ZBTFVFPTUKK0FSR1ZfT1BUSU9OX0FERD02CitBUkdWX0NPTU1BTkRfR1JPVVA9NworQVJHVl9DT01NQU5EX0VYUExBSU49OAorQVJHVl9DT01NQU5EX0FERD05CitBUkdWX0FERF9PTERGSUxFPTEwCitBUkdWX0FERF9ORVdGSUxFPTExCitBUkdWX0FERF9GT0xERVI9MTIKK0FSR1ZfQ01ETElORV9HUk9VUD0xMworQVJHVl9DTURMSU5FX0RBVEE9MTQKKworIyNkZWYgX215TW9kYWxEaWFsb2coZCk6CisjIyAgICAgIHdoaWxlIDE6CisjIyAgICAgICAgICByZWFkeSwgZXYgPSBFdnQuV2FpdE5leHRFdmVudCgweGZmZmYsIC0xKQorIyMgICAgICAgICAgcHJpbnQgJ0RCRzogV05FJywgcmVhZHksIGV2CisjIyAgICAgICAgICBpZiByZWFkeSA6CisjIyAgICAgICAgICAgICAgd2hhdCxtc2csd2hlbix3aGVyZSxtb2QgPSBldgorIyMgICAgICAgICAgICAgIHBhcnQsIHdpbmRvdyA9IFdpbi5GaW5kV2luZG93KHdoZXJlKQorIyMgICAgICAgICAgICAgIGlmIERsZy5Jc0RpYWxvZ0V2ZW50KGV2KToKKyMjICAgICAgICAgICAgICAgICAgZGlkaXQsIGRsZ2RvbmUsIGl0ZW1kb25lID0gRGxnLkRpYWxvZ1NlbGVjdChldikKKyMjICAgICAgICAgICAgICAgICAgcHJpbnQgJ0RCRzogRGlhbG9nU2VsZWN0JywgZGlkaXQsIGRsZ2RvbmUsIGl0ZW1kb25lLCBkCisjIyAgICAgICAgICAgICAgICAgIGlmIGRpZGl0IGFuZCBkbGdkb25lID09IGQ6CisjIyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbWRvbmUKKyMjICAgICAgICAgICAgICBlbGlmIHdpbmRvdyA9PSBkLkdldERpYWxvZ1dpbmRvdygpOgorIyMgICAgICAgICAgICAgICAgICBkLkdldERpYWxvZ1dpbmRvdygpLlNlbGVjdFdpbmRvdygpCisjIyAgICAgICAgICAgICAgICAgIGlmIHBhcnQgPT0gNDogICAjIGluRHJhZworIyMgICAgICAgICAgICAgICAgICAgICAgICAgIGQuRHJhZ1dpbmRvdyh3aGVyZSwgc2NyZWVuYm91bmRzKQorIyMgICAgICAgICAgICAgICAgICBlbHNlOgorIyMgICAgICAgICAgICAgICAgICAgICAgTWFjT1MuSGFuZGxlRXZlbnQoZXYpCisjIyAgICAgICAgICAgICAgZWxzZToKKyMjICAgICAgICAgICAgICAgICAgTWFjT1MuSGFuZGxlRXZlbnQoZXYpCisjIworZGVmIF9zZXRtZW51KGNvbnRyb2wsIGl0ZW1zKToKKyAgICBtaGFuZGxlID0gY29udHJvbC5HZXRDb250cm9sRGF0YV9IYW5kbGUoQ29udHJvbHMua0NvbnRyb2xNZW51UGFydCwKKyAgICAgICAgICAgIENvbnRyb2xzLmtDb250cm9sUG9wdXBCdXR0b25NZW51SGFuZGxlVGFnKQorICAgIG1lbnUgPSBNZW51LmFzX01lbnUobWhhbmRsZSkKKyAgICBmb3IgaXRlbSBpbiBpdGVtczoKKyAgICAgICAgaWYgdHlwZShpdGVtKSA9PSB0eXBlKCgpKToKKyAgICAgICAgICAgIGxhYmVsID0gaXRlbVswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGFiZWwgPSBpdGVtCisgICAgICAgIGlmIGxhYmVsWy0xXSA9PSAnPScgb3IgbGFiZWxbLTFdID09ICc6JzoKKyAgICAgICAgICAgIGxhYmVsID0gbGFiZWxbOi0xXQorICAgICAgICBtZW51LkFwcGVuZE1lbnUobGFiZWwpCisjIyAgICAgICAgICBtaGFuZGxlLCBtaWQgPSBtZW51LmdldHBvcHVwaW5mbygpCisjIyAgICAgICAgICBjb250cm9sLlNldENvbnRyb2xEYXRhX0hhbmRsZShDb250cm9scy5rQ29udHJvbE1lbnVQYXJ0LAorIyMgICAgICAgICAgICAgICAgICBDb250cm9scy5rQ29udHJvbFBvcHVwQnV0dG9uTWVudUhhbmRsZVRhZywgbWhhbmRsZSkKKyAgICBjb250cm9sLlNldENvbnRyb2xNaW5pbXVtKDEpCisgICAgY29udHJvbC5TZXRDb250cm9sTWF4aW11bShsZW4oaXRlbXMpKzEpCisKK2RlZiBfc2VsZWN0b3B0aW9uKGQsIG9wdGlvbmxpc3QsIGlkeCk6CisgICAgaWYgaWR4IDwgMCBvciBpZHggPj0gbGVuKG9wdGlvbmxpc3QpOgorICAgICAgICBNYWNPUy5TeXNCZWVwKCkKKyAgICAgICAgcmV0dXJuCisgICAgb3B0aW9uID0gb3B0aW9ubGlzdFtpZHhdCisgICAgaWYgdHlwZShvcHRpb24pID09IHR5cGUoKCkpOgorICAgICAgICBpZiBsZW4ob3B0aW9uKSA9PSA0OgorICAgICAgICAgICAgaGVscCA9IG9wdGlvblsyXQorICAgICAgICBlbGlmIGxlbihvcHRpb24pID4gMToKKyAgICAgICAgICAgIGhlbHAgPSBvcHRpb25bLTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoZWxwID0gJycKKyAgICBlbHNlOgorICAgICAgICBoZWxwID0gJycKKyAgICBoID0gZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKEFSR1ZfT1BUSU9OX0VYUExBSU4pCisgICAgaWYgaGVscCBhbmQgbGVuKGhlbHApID4gMjUwOgorICAgICAgICBoZWxwID0gaGVscFs6MjUwXSArICcuLi4nCisgICAgRGxnLlNldERpYWxvZ0l0ZW1UZXh0KGgsIGhlbHApCisgICAgaGFzdmFsdWUgPSAwCisgICAgaWYgdHlwZShvcHRpb24pID09IHR5cGUoKCkpOgorICAgICAgICBsYWJlbCA9IG9wdGlvblswXQorICAgIGVsc2U6CisgICAgICAgIGxhYmVsID0gb3B0aW9uCisgICAgaWYgbGFiZWxbLTFdID09ICc9JyBvciBsYWJlbFstMV0gPT0gJzonOgorICAgICAgICBoYXN2YWx1ZSA9IDEKKyAgICBoID0gZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKEFSR1ZfT1BUSU9OX1ZBTFVFKQorICAgIERsZy5TZXREaWFsb2dJdGVtVGV4dChoLCAnJykKKyAgICBpZiBoYXN2YWx1ZToKKyAgICAgICAgZC5TaG93RGlhbG9nSXRlbShBUkdWX09QVElPTl9WQUxVRSkKKyAgICAgICAgZC5TZWxlY3REaWFsb2dJdGVtVGV4dChBUkdWX09QVElPTl9WQUxVRSwgMCwgMCkKKyAgICBlbHNlOgorICAgICAgICBkLkhpZGVEaWFsb2dJdGVtKEFSR1ZfT1BUSU9OX1ZBTFVFKQorCisKK2RlZiBHZXRBcmd2KG9wdGlvbmxpc3Q9Tm9uZSwgY29tbWFuZGxpc3Q9Tm9uZSwgYWRkb2xkZmlsZT0xLCBhZGRuZXdmaWxlPTEsIGFkZGZvbGRlcj0xLCBpZD1BUkdWX0lEKToKKyAgICBfaW5pdGlhbGl6ZSgpCisgICAgX2ludGVyYWN0KCkKKyAgICBkID0gR2V0TmV3RGlhbG9nKGlkLCAtMSkKKyAgICBpZiBub3QgZDoKKyAgICAgICAgcHJpbnQgIkVhc3lEaWFsb2dzOiBDYW4ndCBnZXQgRExPRyByZXNvdXJjZSB3aXRoIGlkID0iLCBpZCwgIiAobWlzc2luZyByZXNvdXJjZSBmaWxlPykiCisgICAgICAgIHJldHVybgorIyAgICAgICBoID0gZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKDMpCisjICAgICAgIFNldERpYWxvZ0l0ZW1UZXh0KGgsIGxmMmNyKHByb21wdCkpCisjICAgICAgIGggPSBkLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woNCkKKyMgICAgICAgU2V0RGlhbG9nSXRlbVRleHQoaCwgbGYyY3IoZGVmYXVsdCkpCisjICAgICAgIGQuU2VsZWN0RGlhbG9nSXRlbVRleHQoNCwgMCwgOTk5KQorIyAgICAgICBkLlNldERpYWxvZ0l0ZW0oNCwgMCwgMjU1KQorICAgIGlmIG9wdGlvbmxpc3Q6CisgICAgICAgIF9zZXRtZW51KGQuR2V0RGlhbG9nSXRlbUFzQ29udHJvbChBUkdWX09QVElPTl9HUk9VUCksIG9wdGlvbmxpc3QpCisgICAgICAgIF9zZWxlY3RvcHRpb24oZCwgb3B0aW9ubGlzdCwgMCkKKyAgICBlbHNlOgorICAgICAgICBkLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woQVJHVl9PUFRJT05fR1JPVVApLkRlYWN0aXZhdGVDb250cm9sKCkKKyAgICBpZiBjb21tYW5kbGlzdDoKKyAgICAgICAgX3NldG1lbnUoZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKEFSR1ZfQ09NTUFORF9HUk9VUCksIGNvbW1hbmRsaXN0KQorICAgICAgICBpZiB0eXBlKGNvbW1hbmRsaXN0WzBdKSA9PSB0eXBlKCgpKSBhbmQgbGVuKGNvbW1hbmRsaXN0WzBdKSA+IDE6CisgICAgICAgICAgICBoZWxwID0gY29tbWFuZGxpc3RbMF1bLTFdCisgICAgICAgICAgICBoID0gZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKEFSR1ZfQ09NTUFORF9FWFBMQUlOKQorICAgICAgICAgICAgRGxnLlNldERpYWxvZ0l0ZW1UZXh0KGgsIGhlbHApCisgICAgZWxzZToKKyAgICAgICAgZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKEFSR1ZfQ09NTUFORF9HUk9VUCkuRGVhY3RpdmF0ZUNvbnRyb2woKQorICAgIGlmIG5vdCBhZGRvbGRmaWxlOgorICAgICAgICBkLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woQVJHVl9BRERfT0xERklMRSkuRGVhY3RpdmF0ZUNvbnRyb2woKQorICAgIGlmIG5vdCBhZGRuZXdmaWxlOgorICAgICAgICBkLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woQVJHVl9BRERfTkVXRklMRSkuRGVhY3RpdmF0ZUNvbnRyb2woKQorICAgIGlmIG5vdCBhZGRmb2xkZXI6CisgICAgICAgIGQuR2V0RGlhbG9nSXRlbUFzQ29udHJvbChBUkdWX0FERF9GT0xERVIpLkRlYWN0aXZhdGVDb250cm9sKCkKKyAgICBkLlNldERpYWxvZ0RlZmF1bHRJdGVtKEFSR1ZfSVRFTV9PSykKKyAgICBkLlNldERpYWxvZ0NhbmNlbEl0ZW0oQVJHVl9JVEVNX0NBTkNFTCkKKyAgICBkLkdldERpYWxvZ1dpbmRvdygpLlNob3dXaW5kb3coKQorICAgIGQuRHJhd0RpYWxvZygpCisgICAgaWYgaGFzYXR0cihNYWNPUywgJ1NjaGVkUGFyYW1zJyk6CisgICAgICAgIGFwcHN3ID0gTWFjT1MuU2NoZWRQYXJhbXMoMSwgMCkKKyAgICB0cnk6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBzdHJpbmdzdG9hZGQgPSBbXQorICAgICAgICAgICAgbiA9IE1vZGFsRGlhbG9nKE5vbmUpCisgICAgICAgICAgICBpZiBuID09IEFSR1ZfSVRFTV9PSzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBuID09IEFSR1ZfSVRFTV9DQU5DRUw6CisgICAgICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdAorICAgICAgICAgICAgZWxpZiBuID09IEFSR1ZfT1BUSU9OX0dST1VQOgorICAgICAgICAgICAgICAgIGlkeCA9IGQuR2V0RGlhbG9nSXRlbUFzQ29udHJvbChBUkdWX09QVElPTl9HUk9VUCkuR2V0Q29udHJvbFZhbHVlKCktMQorICAgICAgICAgICAgICAgIF9zZWxlY3RvcHRpb24oZCwgb3B0aW9ubGlzdCwgaWR4KQorICAgICAgICAgICAgZWxpZiBuID09IEFSR1ZfT1BUSU9OX1ZBTFVFOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsaWYgbiA9PSBBUkdWX09QVElPTl9BREQ6CisgICAgICAgICAgICAgICAgaWR4ID0gZC5HZXREaWFsb2dJdGVtQXNDb250cm9sKEFSR1ZfT1BUSU9OX0dST1VQKS5HZXRDb250cm9sVmFsdWUoKS0xCisgICAgICAgICAgICAgICAgaWYgMCA8PSBpZHggPCBsZW4ob3B0aW9ubGlzdCk6CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IG9wdGlvbmxpc3RbaWR4XQorICAgICAgICAgICAgICAgICAgICBpZiB0eXBlKG9wdGlvbikgPT0gdHlwZSgoKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBvcHRpb25bMF0KKyAgICAgICAgICAgICAgICAgICAgaWYgb3B0aW9uWy0xXSA9PSAnPScgb3Igb3B0aW9uWy0xXSA9PSAnOic6CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSBvcHRpb25bOi0xXQorICAgICAgICAgICAgICAgICAgICAgICAgaCA9IGQuR2V0RGlhbG9nSXRlbUFzQ29udHJvbChBUkdWX09QVElPTl9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gRGxnLkdldERpYWxvZ0l0ZW1UZXh0KGgpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICcnCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihvcHRpb24pID09IDE6CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b2FkZCA9ICctJyArIG9wdGlvbgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9hZGQgPSAnLS0nICsgb3B0aW9uCisgICAgICAgICAgICAgICAgICAgIHN0cmluZ3N0b2FkZCA9IFtzdHJpbmd0b2FkZF0KKyAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzdG9hZGQuYXBwZW5kKHZhbHVlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIE1hY09TLlN5c0JlZXAoKQorICAgICAgICAgICAgZWxpZiBuID09IEFSR1ZfQ09NTUFORF9HUk9VUDoKKyAgICAgICAgICAgICAgICBpZHggPSBkLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woQVJHVl9DT01NQU5EX0dST1VQKS5HZXRDb250cm9sVmFsdWUoKS0xCisgICAgICAgICAgICAgICAgaWYgMCA8PSBpZHggPCBsZW4oY29tbWFuZGxpc3QpIGFuZCB0eXBlKGNvbW1hbmRsaXN0W2lkeF0pID09IHR5cGUoKCkpIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4oY29tbWFuZGxpc3RbaWR4XSkgPiAxOgorICAgICAgICAgICAgICAgICAgICBoZWxwID0gY29tbWFuZGxpc3RbaWR4XVstMV0KKyAgICAgICAgICAgICAgICAgICAgaCA9IGQuR2V0RGlhbG9nSXRlbUFzQ29udHJvbChBUkdWX0NPTU1BTkRfRVhQTEFJTikKKyAgICAgICAgICAgICAgICAgICAgRGxnLlNldERpYWxvZ0l0ZW1UZXh0KGgsIGhlbHApCisgICAgICAgICAgICBlbGlmIG4gPT0gQVJHVl9DT01NQU5EX0FERDoKKyAgICAgICAgICAgICAgICBpZHggPSBkLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woQVJHVl9DT01NQU5EX0dST1VQKS5HZXRDb250cm9sVmFsdWUoKS0xCisgICAgICAgICAgICAgICAgaWYgMCA8PSBpZHggPCBsZW4oY29tbWFuZGxpc3QpOgorICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZGxpc3RbaWR4XQorICAgICAgICAgICAgICAgICAgICBpZiB0eXBlKGNvbW1hbmQpID09IHR5cGUoKCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmRbMF0KKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nc3RvYWRkID0gW2NvbW1hbmRdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgTWFjT1MuU3lzQmVlcCgpCisgICAgICAgICAgICBlbGlmIG4gPT0gQVJHVl9BRERfT0xERklMRToKKyAgICAgICAgICAgICAgICBwYXRobmFtZSA9IEFza0ZpbGVGb3JPcGVuKCkKKyAgICAgICAgICAgICAgICBpZiBwYXRobmFtZToKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nc3RvYWRkID0gW3BhdGhuYW1lXQorICAgICAgICAgICAgZWxpZiBuID09IEFSR1ZfQUREX05FV0ZJTEU6CisgICAgICAgICAgICAgICAgcGF0aG5hbWUgPSBBc2tGaWxlRm9yU2F2ZSgpCisgICAgICAgICAgICAgICAgaWYgcGF0aG5hbWU6CisgICAgICAgICAgICAgICAgICAgIHN0cmluZ3N0b2FkZCA9IFtwYXRobmFtZV0KKyAgICAgICAgICAgIGVsaWYgbiA9PSBBUkdWX0FERF9GT0xERVI6CisgICAgICAgICAgICAgICAgcGF0aG5hbWUgPSBBc2tGb2xkZXIoKQorICAgICAgICAgICAgICAgIGlmIHBhdGhuYW1lOgorICAgICAgICAgICAgICAgICAgICBzdHJpbmdzdG9hZGQgPSBbcGF0aG5hbWVdCisgICAgICAgICAgICBlbGlmIG4gPT0gQVJHVl9DTURMSU5FX0RBVEE6CisgICAgICAgICAgICAgICAgcGFzcyAjIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiVW5rbm93biBkaWFsb2cgaXRlbSAlZCIlbgorCisgICAgICAgICAgICBmb3Igc3RyaW5ndG9hZGQgaW4gc3RyaW5nc3RvYWRkOgorICAgICAgICAgICAgICAgIGlmICciJyBpbiBzdHJpbmd0b2FkZCBvciAiJyIgaW4gc3RyaW5ndG9hZGQgb3IgIiAiIGluIHN0cmluZ3RvYWRkOgorICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b2FkZCA9IHJlcHIoc3RyaW5ndG9hZGQpCisgICAgICAgICAgICAgICAgaCA9IGQuR2V0RGlhbG9nSXRlbUFzQ29udHJvbChBUkdWX0NNRExJTkVfREFUQSkKKyAgICAgICAgICAgICAgICBvbGRzdHIgPSBHZXREaWFsb2dJdGVtVGV4dChoKQorICAgICAgICAgICAgICAgIGlmIG9sZHN0ciBhbmQgb2xkc3RyWy0xXSAhPSAnICc6CisgICAgICAgICAgICAgICAgICAgIG9sZHN0ciA9IG9sZHN0ciArICcgJworICAgICAgICAgICAgICAgIG9sZHN0ciA9IG9sZHN0ciArIHN0cmluZ3RvYWRkCisgICAgICAgICAgICAgICAgaWYgb2xkc3RyWy0xXSAhPSAnICc6CisgICAgICAgICAgICAgICAgICAgIG9sZHN0ciA9IG9sZHN0ciArICcgJworICAgICAgICAgICAgICAgIFNldERpYWxvZ0l0ZW1UZXh0KGgsIG9sZHN0cikKKyAgICAgICAgICAgICAgICBkLlNlbGVjdERpYWxvZ0l0ZW1UZXh0KEFSR1ZfQ01ETElORV9EQVRBLCAweDdmZmYsIDB4N2ZmZikKKyAgICAgICAgaCA9IGQuR2V0RGlhbG9nSXRlbUFzQ29udHJvbChBUkdWX0NNRExJTkVfREFUQSkKKyAgICAgICAgb2xkc3RyID0gR2V0RGlhbG9nSXRlbVRleHQoaCkKKyAgICAgICAgdG1wbGlzdCA9IHN0cmluZy5zcGxpdChvbGRzdHIpCisgICAgICAgIG5ld2xpc3QgPSBbXQorICAgICAgICB3aGlsZSB0bXBsaXN0OgorICAgICAgICAgICAgaXRlbSA9IHRtcGxpc3RbMF0KKyAgICAgICAgICAgIGRlbCB0bXBsaXN0WzBdCisgICAgICAgICAgICBpZiBpdGVtWzBdID09ICciJzoKKyAgICAgICAgICAgICAgICB3aGlsZSBpdGVtWy0xXSAhPSAnIic6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCB0bXBsaXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiVW50ZXJtaW5hdGVkIHF1b3RlZCBhcmd1bWVudCIKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW0gKyAnICcgKyB0bXBsaXN0WzBdCisgICAgICAgICAgICAgICAgICAgIGRlbCB0bXBsaXN0WzBdCisgICAgICAgICAgICAgICAgaXRlbSA9IGl0ZW1bMTotMV0KKyAgICAgICAgICAgIGlmIGl0ZW1bMF0gPT0gIiciOgorICAgICAgICAgICAgICAgIHdoaWxlIGl0ZW1bLTFdICE9ICInIjoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHRtcGxpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJVbnRlcm1pbmF0ZWQgcXVvdGVkIGFyZ3VtZW50IgorICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbSArICcgJyArIHRtcGxpc3RbMF0KKyAgICAgICAgICAgICAgICAgICAgZGVsIHRtcGxpc3RbMF0KKyAgICAgICAgICAgICAgICBpdGVtID0gaXRlbVsxOi0xXQorICAgICAgICAgICAgbmV3bGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgcmV0dXJuIG5ld2xpc3QKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnU2NoZWRQYXJhbXMnKToKKyAgICAgICAgICAgIE1hY09TLlNjaGVkUGFyYW1zKCphcHBzdykKKyAgICAgICAgZGVsIGQKKworZGVmIF9wcm9jZXNzX05hdl9hcmdzKGRmdGZsYWdzLCAqKmFyZ3MpOgorICAgIGltcG9ydCBDYXJib24uQXBwbGVFdmVudHMKKyAgICBpbXBvcnQgQ2FyYm9uLkFFCisgICAgaW1wb3J0IENhcmJvbi5GaWxlCisgICAgZm9yIGsgaW4gYXJncy5rZXlzKCk6CisgICAgICAgIGlmIGFyZ3Nba10gaXMgTm9uZToKKyAgICAgICAgICAgIGRlbCBhcmdzW2tdCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cywgYW5kIG1vZGlmeSBzb21lIGFyZ3VtZW50cworICAgIGlmICdkaWFsb2dPcHRpb25GbGFncycgbm90IGluIGFyZ3M6CisgICAgICAgIGFyZ3NbJ2RpYWxvZ09wdGlvbkZsYWdzJ10gPSBkZnRmbGFncworICAgIGlmICdkZWZhdWx0TG9jYXRpb24nIGluIGFyZ3MgYW5kIFwKKyAgICAgICAgICAgIG5vdCBpc2luc3RhbmNlKGFyZ3NbJ2RlZmF1bHRMb2NhdGlvbiddLCBDYXJib24uQUUuQUVEZXNjKToKKyAgICAgICAgZGVmYXVsdExvY2F0aW9uID0gYXJnc1snZGVmYXVsdExvY2F0aW9uJ10KKyAgICAgICAgaWYgaXNpbnN0YW5jZShkZWZhdWx0TG9jYXRpb24sIENhcmJvbi5GaWxlLkZTU3BlYyk6CisgICAgICAgICAgICBhcmdzWydkZWZhdWx0TG9jYXRpb24nXSA9IENhcmJvbi5BRS5BRUNyZWF0ZURlc2MoCisgICAgICAgICAgICAgICAgICAgIENhcmJvbi5BcHBsZUV2ZW50cy50eXBlRlNTLCBkZWZhdWx0TG9jYXRpb24uZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRlZmF1bHRMb2NhdGlvbiwgQ2FyYm9uLkZpbGUuRlNSZWYpOgorICAgICAgICAgICAgICAgIGRlZmF1bHRMb2NhdGlvbiA9IENhcmJvbi5GaWxlLkZTUmVmKGRlZmF1bHRMb2NhdGlvbikKKyAgICAgICAgICAgIGFyZ3NbJ2RlZmF1bHRMb2NhdGlvbiddID0gQ2FyYm9uLkFFLkFFQ3JlYXRlRGVzYygKKyAgICAgICAgICAgICAgICAgICAgQ2FyYm9uLkFwcGxlRXZlbnRzLnR5cGVGU1JlZiwgZGVmYXVsdExvY2F0aW9uLmRhdGEpCisgICAgaWYgJ3R5cGVMaXN0JyBpbiBhcmdzIGFuZCBub3QgaXNpbnN0YW5jZShhcmdzWyd0eXBlTGlzdCddLCBDYXJib24uUmVzLlJlc291cmNlVHlwZSk6CisgICAgICAgIHR5cGVMaXN0ID0gYXJnc1sndHlwZUxpc3QnXVs6XQorICAgICAgICAjIFdvcmthcm91bmQgZm9yIE9TWCB0eXBlbGVzcyBmaWxlczoKKyAgICAgICAgaWYgJ1RFWFQnIGluIHR5cGVMaXN0IGFuZCBub3QgJ1wwXDBcMFwwJyBpbiB0eXBlTGlzdDoKKyAgICAgICAgICAgIHR5cGVMaXN0ID0gdHlwZUxpc3QgKyAoJ1wwXDBcMFwwJywpCisgICAgICAgIGRhdGEgPSAnUHl0aCcgKyBzdHJ1Y3QucGFjaygiaGgiLCAwLCBsZW4odHlwZUxpc3QpKQorICAgICAgICBmb3IgdHlwZSBpbiB0eXBlTGlzdDoKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhK3R5cGUKKyAgICAgICAgYXJnc1sndHlwZUxpc3QnXSA9IENhcmJvbi5SZXMuSGFuZGxlKGRhdGEpCisgICAgdHB3YW50ZWQgPSBzdHIKKyAgICBpZiAnd2FudGVkJyBpbiBhcmdzOgorICAgICAgICB0cHdhbnRlZCA9IGFyZ3NbJ3dhbnRlZCddCisgICAgICAgIGRlbCBhcmdzWyd3YW50ZWQnXQorICAgIHJldHVybiBhcmdzLCB0cHdhbnRlZAorCitkZWYgX2R1bW15X05hdl9ldmVudHByb2MobXNnLCBkYXRhKToKKyAgICBwYXNzCisKK19kZWZhdWx0X05hdl9ldmVudHByb2MgPSBfZHVtbXlfTmF2X2V2ZW50cHJvYworCitkZWYgU2V0RGVmYXVsdEV2ZW50UHJvYyhwcm9jKToKKyAgICBnbG9iYWwgX2RlZmF1bHRfTmF2X2V2ZW50cHJvYworICAgIHJ2ID0gX2RlZmF1bHRfTmF2X2V2ZW50cHJvYworICAgIGlmIHByb2MgaXMgTm9uZToKKyAgICAgICAgcHJvYyA9IF9kdW1teV9OYXZfZXZlbnRwcm9jCisgICAgX2RlZmF1bHRfTmF2X2V2ZW50cHJvYyA9IHByb2MKKyAgICByZXR1cm4gcnYKKworZGVmIEFza0ZpbGVGb3JPcGVuKAorICAgICAgICBtZXNzYWdlPU5vbmUsCisgICAgICAgIHR5cGVMaXN0PU5vbmUsCisgICAgICAgICMgRnJvbSBoZXJlIG9uIHRoZSBvcmRlciBpcyBub3QgZG9jdW1lbnRlZAorICAgICAgICB2ZXJzaW9uPU5vbmUsCisgICAgICAgIGRlZmF1bHRMb2NhdGlvbj1Ob25lLAorICAgICAgICBkaWFsb2dPcHRpb25GbGFncz1Ob25lLAorICAgICAgICBsb2NhdGlvbj1Ob25lLAorICAgICAgICBjbGllbnROYW1lPU5vbmUsCisgICAgICAgIHdpbmRvd1RpdGxlPU5vbmUsCisgICAgICAgIGFjdGlvbkJ1dHRvbkxhYmVsPU5vbmUsCisgICAgICAgIGNhbmNlbEJ1dHRvbkxhYmVsPU5vbmUsCisgICAgICAgIHByZWZlcmVuY2VLZXk9Tm9uZSwKKyAgICAgICAgcG9wdXBFeHRlbnNpb249Tm9uZSwKKyAgICAgICAgZXZlbnRQcm9jPV9kdW1teV9OYXZfZXZlbnRwcm9jLAorICAgICAgICBwcmV2aWV3UHJvYz1Ob25lLAorICAgICAgICBmaWx0ZXJQcm9jPU5vbmUsCisgICAgICAgIHdhbnRlZD1Ob25lLAorICAgICAgICBtdWx0aXBsZT1Ob25lKToKKyAgICAiIiJEaXNwbGF5IGEgZGlhbG9nIGFza2luZyB0aGUgdXNlciBmb3IgYSBmaWxlIHRvIG9wZW4uCisKKyAgICB3YW50ZWQgaXMgdGhlIHJldHVybiB0eXBlIHdhbnRlZDogRlNTcGVjLCBGU1JlZiwgdW5pY29kZSBvciBzdHJpbmcgKGRlZmF1bHQpCisgICAgdGhlIG90aGVyIGFyZ3VtZW50cyBjYW4gYmUgbG9va2VkIHVwIGluIEFwcGxlJ3MgTmF2aWdhdGlvbiBTZXJ2aWNlcyBkb2N1bWVudGF0aW9uIiIiCisKKyAgICBkZWZhdWx0X2ZsYWdzID0gMHg1NiAjIE9yIDB4ZTQ/CisgICAgYXJncywgdHB3YW50ZWQgPSBfcHJvY2Vzc19OYXZfYXJncyhkZWZhdWx0X2ZsYWdzLCB2ZXJzaW9uPXZlcnNpb24sCisgICAgICAgIGRlZmF1bHRMb2NhdGlvbj1kZWZhdWx0TG9jYXRpb24sIGRpYWxvZ09wdGlvbkZsYWdzPWRpYWxvZ09wdGlvbkZsYWdzLAorICAgICAgICBsb2NhdGlvbj1sb2NhdGlvbixjbGllbnROYW1lPWNsaWVudE5hbWUsd2luZG93VGl0bGU9d2luZG93VGl0bGUsCisgICAgICAgIGFjdGlvbkJ1dHRvbkxhYmVsPWFjdGlvbkJ1dHRvbkxhYmVsLGNhbmNlbEJ1dHRvbkxhYmVsPWNhbmNlbEJ1dHRvbkxhYmVsLAorICAgICAgICBtZXNzYWdlPW1lc3NhZ2UscHJlZmVyZW5jZUtleT1wcmVmZXJlbmNlS2V5LAorICAgICAgICBwb3B1cEV4dGVuc2lvbj1wb3B1cEV4dGVuc2lvbixldmVudFByb2M9ZXZlbnRQcm9jLHByZXZpZXdQcm9jPXByZXZpZXdQcm9jLAorICAgICAgICBmaWx0ZXJQcm9jPWZpbHRlclByb2MsdHlwZUxpc3Q9dHlwZUxpc3Qsd2FudGVkPXdhbnRlZCxtdWx0aXBsZT1tdWx0aXBsZSkKKyAgICBfaW50ZXJhY3QoKQorICAgIHRyeToKKyAgICAgICAgcnIgPSBOYXYuTmF2Q2hvb3NlRmlsZShhcmdzKQorICAgICAgICBnb29kID0gMQorICAgIGV4Y2VwdCBOYXYuZXJyb3IsIGFyZzoKKyAgICAgICAgaWYgYXJnWzBdICE9IC0xMjg6ICMgdXNlckNhbmNlbGxlZEVycgorICAgICAgICAgICAgcmFpc2UgTmF2LmVycm9yLCBhcmcKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBpZiBub3QgcnIudmFsaWRSZWNvcmQgb3Igbm90IHJyLnNlbGVjdGlvbjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBpZiBpc3N1YmNsYXNzKHRwd2FudGVkLCBDYXJib24uRmlsZS5GU1JlZik6CisgICAgICAgIHJldHVybiB0cHdhbnRlZChyci5zZWxlY3Rpb25fZnNyWzBdKQorICAgIGlmIGlzc3ViY2xhc3ModHB3YW50ZWQsIENhcmJvbi5GaWxlLkZTU3BlYyk6CisgICAgICAgIHJldHVybiB0cHdhbnRlZChyci5zZWxlY3Rpb25bMF0pCisgICAgaWYgaXNzdWJjbGFzcyh0cHdhbnRlZCwgc3RyKToKKyAgICAgICAgcmV0dXJuIHRwd2FudGVkKHJyLnNlbGVjdGlvbl9mc3JbMF0uYXNfcGF0aG5hbWUoKSkKKyAgICBpZiBpc3N1YmNsYXNzKHRwd2FudGVkLCB1bmljb2RlKToKKyAgICAgICAgcmV0dXJuIHRwd2FudGVkKHJyLnNlbGVjdGlvbl9mc3JbMF0uYXNfcGF0aG5hbWUoKSwgJ3V0ZjgnKQorICAgIHJhaXNlIFR5cGVFcnJvciwgIlVua25vd24gdmFsdWUgZm9yIGFyZ3VtZW50ICd3YW50ZWQnOiAlcyIgJSByZXByKHRwd2FudGVkKQorCitkZWYgQXNrRmlsZUZvclNhdmUoCisgICAgICAgIG1lc3NhZ2U9Tm9uZSwKKyAgICAgICAgc2F2ZWRGaWxlTmFtZT1Ob25lLAorICAgICAgICAjIEZyb20gaGVyZSBvbiB0aGUgb3JkZXIgaXMgbm90IGRvY3VtZW50ZWQKKyAgICAgICAgdmVyc2lvbj1Ob25lLAorICAgICAgICBkZWZhdWx0TG9jYXRpb249Tm9uZSwKKyAgICAgICAgZGlhbG9nT3B0aW9uRmxhZ3M9Tm9uZSwKKyAgICAgICAgbG9jYXRpb249Tm9uZSwKKyAgICAgICAgY2xpZW50TmFtZT1Ob25lLAorICAgICAgICB3aW5kb3dUaXRsZT1Ob25lLAorICAgICAgICBhY3Rpb25CdXR0b25MYWJlbD1Ob25lLAorICAgICAgICBjYW5jZWxCdXR0b25MYWJlbD1Ob25lLAorICAgICAgICBwcmVmZXJlbmNlS2V5PU5vbmUsCisgICAgICAgIHBvcHVwRXh0ZW5zaW9uPU5vbmUsCisgICAgICAgIGV2ZW50UHJvYz1fZHVtbXlfTmF2X2V2ZW50cHJvYywKKyAgICAgICAgZmlsZVR5cGU9Tm9uZSwKKyAgICAgICAgZmlsZUNyZWF0b3I9Tm9uZSwKKyAgICAgICAgd2FudGVkPU5vbmUsCisgICAgICAgIG11bHRpcGxlPU5vbmUpOgorICAgICIiIkRpc3BsYXkgYSBkaWFsb2cgYXNraW5nIHRoZSB1c2VyIGZvciBhIGZpbGVuYW1lIHRvIHNhdmUgdG8uCisKKyAgICB3YW50ZWQgaXMgdGhlIHJldHVybiB0eXBlIHdhbnRlZDogRlNTcGVjLCBGU1JlZiwgdW5pY29kZSBvciBzdHJpbmcgKGRlZmF1bHQpCisgICAgdGhlIG90aGVyIGFyZ3VtZW50cyBjYW4gYmUgbG9va2VkIHVwIGluIEFwcGxlJ3MgTmF2aWdhdGlvbiBTZXJ2aWNlcyBkb2N1bWVudGF0aW9uIiIiCisKKworICAgIGRlZmF1bHRfZmxhZ3MgPSAweDA3CisgICAgYXJncywgdHB3YW50ZWQgPSBfcHJvY2Vzc19OYXZfYXJncyhkZWZhdWx0X2ZsYWdzLCB2ZXJzaW9uPXZlcnNpb24sCisgICAgICAgIGRlZmF1bHRMb2NhdGlvbj1kZWZhdWx0TG9jYXRpb24sIGRpYWxvZ09wdGlvbkZsYWdzPWRpYWxvZ09wdGlvbkZsYWdzLAorICAgICAgICBsb2NhdGlvbj1sb2NhdGlvbixjbGllbnROYW1lPWNsaWVudE5hbWUsd2luZG93VGl0bGU9d2luZG93VGl0bGUsCisgICAgICAgIGFjdGlvbkJ1dHRvbkxhYmVsPWFjdGlvbkJ1dHRvbkxhYmVsLGNhbmNlbEJ1dHRvbkxhYmVsPWNhbmNlbEJ1dHRvbkxhYmVsLAorICAgICAgICBzYXZlZEZpbGVOYW1lPXNhdmVkRmlsZU5hbWUsbWVzc2FnZT1tZXNzYWdlLHByZWZlcmVuY2VLZXk9cHJlZmVyZW5jZUtleSwKKyAgICAgICAgcG9wdXBFeHRlbnNpb249cG9wdXBFeHRlbnNpb24sZXZlbnRQcm9jPWV2ZW50UHJvYyxmaWxlVHlwZT1maWxlVHlwZSwKKyAgICAgICAgZmlsZUNyZWF0b3I9ZmlsZUNyZWF0b3Isd2FudGVkPXdhbnRlZCxtdWx0aXBsZT1tdWx0aXBsZSkKKyAgICBfaW50ZXJhY3QoKQorICAgIHRyeToKKyAgICAgICAgcnIgPSBOYXYuTmF2UHV0RmlsZShhcmdzKQorICAgICAgICBnb29kID0gMQorICAgIGV4Y2VwdCBOYXYuZXJyb3IsIGFyZzoKKyAgICAgICAgaWYgYXJnWzBdICE9IC0xMjg6ICMgdXNlckNhbmNlbGxlZEVycgorICAgICAgICAgICAgcmFpc2UgTmF2LmVycm9yLCBhcmcKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBpZiBub3QgcnIudmFsaWRSZWNvcmQgb3Igbm90IHJyLnNlbGVjdGlvbjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBpZiBpc3N1YmNsYXNzKHRwd2FudGVkLCBDYXJib24uRmlsZS5GU1JlZik6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIkNhbm5vdCBwYXNzIHdhbnRlZD1GU1JlZiB0byBBc2tGaWxlRm9yU2F2ZSIKKyAgICBpZiBpc3N1YmNsYXNzKHRwd2FudGVkLCBDYXJib24uRmlsZS5GU1NwZWMpOgorICAgICAgICByZXR1cm4gdHB3YW50ZWQocnIuc2VsZWN0aW9uWzBdKQorICAgIGlmIGlzc3ViY2xhc3ModHB3YW50ZWQsIChzdHIsIHVuaWNvZGUpKToKKyAgICAgICAgIyBUaGlzIGlzIGdyb3NzLCBhbmQgcHJvYmFibHkgaW5jb3JyZWN0IHRvbworICAgICAgICB2cmVmbnVtLCBkaXJpZCwgbmFtZSA9IHJyLnNlbGVjdGlvblswXS5hc190dXBsZSgpCisgICAgICAgIHBhcmRpcl9mc3MgPSBDYXJib24uRmlsZS5GU1NwZWMoKHZyZWZudW0sIGRpcmlkLCAnJykpCisgICAgICAgIHBhcmRpcl9mc3IgPSBDYXJib24uRmlsZS5GU1JlZihwYXJkaXJfZnNzKQorICAgICAgICBwYXJkaXJfcGF0aCA9IHBhcmRpcl9mc3IuRlNSZWZNYWtlUGF0aCgpICAjIFRoaXMgaXMgdXRmLTgKKyAgICAgICAgbmFtZV91dGY4ID0gdW5pY29kZShuYW1lLCAnbWFjcm9tYW4nKS5lbmNvZGUoJ3V0ZjgnKQorICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihwYXJkaXJfcGF0aCwgbmFtZV91dGY4KQorICAgICAgICBpZiBpc3N1YmNsYXNzKHRwd2FudGVkLCB1bmljb2RlKToKKyAgICAgICAgICAgIHJldHVybiB1bmljb2RlKGZ1bGxwYXRoLCAndXRmOCcpCisgICAgICAgIHJldHVybiB0cHdhbnRlZChmdWxscGF0aCkKKyAgICByYWlzZSBUeXBlRXJyb3IsICJVbmtub3duIHZhbHVlIGZvciBhcmd1bWVudCAnd2FudGVkJzogJXMiICUgcmVwcih0cHdhbnRlZCkKKworZGVmIEFza0ZvbGRlcigKKyAgICAgICAgbWVzc2FnZT1Ob25lLAorICAgICAgICAjIEZyb20gaGVyZSBvbiB0aGUgb3JkZXIgaXMgbm90IGRvY3VtZW50ZWQKKyAgICAgICAgdmVyc2lvbj1Ob25lLAorICAgICAgICBkZWZhdWx0TG9jYXRpb249Tm9uZSwKKyAgICAgICAgZGlhbG9nT3B0aW9uRmxhZ3M9Tm9uZSwKKyAgICAgICAgbG9jYXRpb249Tm9uZSwKKyAgICAgICAgY2xpZW50TmFtZT1Ob25lLAorICAgICAgICB3aW5kb3dUaXRsZT1Ob25lLAorICAgICAgICBhY3Rpb25CdXR0b25MYWJlbD1Ob25lLAorICAgICAgICBjYW5jZWxCdXR0b25MYWJlbD1Ob25lLAorICAgICAgICBwcmVmZXJlbmNlS2V5PU5vbmUsCisgICAgICAgIHBvcHVwRXh0ZW5zaW9uPU5vbmUsCisgICAgICAgIGV2ZW50UHJvYz1fZHVtbXlfTmF2X2V2ZW50cHJvYywKKyAgICAgICAgZmlsdGVyUHJvYz1Ob25lLAorICAgICAgICB3YW50ZWQ9Tm9uZSwKKyAgICAgICAgbXVsdGlwbGU9Tm9uZSk6CisgICAgIiIiRGlzcGxheSBhIGRpYWxvZyBhc2tpbmcgdGhlIHVzZXIgZm9yIHNlbGVjdCBhIGZvbGRlci4KKworICAgIHdhbnRlZCBpcyB0aGUgcmV0dXJuIHR5cGUgd2FudGVkOiBGU1NwZWMsIEZTUmVmLCB1bmljb2RlIG9yIHN0cmluZyAoZGVmYXVsdCkKKyAgICB0aGUgb3RoZXIgYXJndW1lbnRzIGNhbiBiZSBsb29rZWQgdXAgaW4gQXBwbGUncyBOYXZpZ2F0aW9uIFNlcnZpY2VzIGRvY3VtZW50YXRpb24iIiIKKworICAgIGRlZmF1bHRfZmxhZ3MgPSAweDE3CisgICAgYXJncywgdHB3YW50ZWQgPSBfcHJvY2Vzc19OYXZfYXJncyhkZWZhdWx0X2ZsYWdzLCB2ZXJzaW9uPXZlcnNpb24sCisgICAgICAgIGRlZmF1bHRMb2NhdGlvbj1kZWZhdWx0TG9jYXRpb24sIGRpYWxvZ09wdGlvbkZsYWdzPWRpYWxvZ09wdGlvbkZsYWdzLAorICAgICAgICBsb2NhdGlvbj1sb2NhdGlvbixjbGllbnROYW1lPWNsaWVudE5hbWUsd2luZG93VGl0bGU9d2luZG93VGl0bGUsCisgICAgICAgIGFjdGlvbkJ1dHRvbkxhYmVsPWFjdGlvbkJ1dHRvbkxhYmVsLGNhbmNlbEJ1dHRvbkxhYmVsPWNhbmNlbEJ1dHRvbkxhYmVsLAorICAgICAgICBtZXNzYWdlPW1lc3NhZ2UscHJlZmVyZW5jZUtleT1wcmVmZXJlbmNlS2V5LAorICAgICAgICBwb3B1cEV4dGVuc2lvbj1wb3B1cEV4dGVuc2lvbixldmVudFByb2M9ZXZlbnRQcm9jLGZpbHRlclByb2M9ZmlsdGVyUHJvYywKKyAgICAgICAgd2FudGVkPXdhbnRlZCxtdWx0aXBsZT1tdWx0aXBsZSkKKyAgICBfaW50ZXJhY3QoKQorICAgIHRyeToKKyAgICAgICAgcnIgPSBOYXYuTmF2Q2hvb3NlRm9sZGVyKGFyZ3MpCisgICAgICAgIGdvb2QgPSAxCisgICAgZXhjZXB0IE5hdi5lcnJvciwgYXJnOgorICAgICAgICBpZiBhcmdbMF0gIT0gLTEyODogIyB1c2VyQ2FuY2VsbGVkRXJyCisgICAgICAgICAgICByYWlzZSBOYXYuZXJyb3IsIGFyZworICAgICAgICByZXR1cm4gTm9uZQorICAgIGlmIG5vdCByci52YWxpZFJlY29yZCBvciBub3QgcnIuc2VsZWN0aW9uOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGlmIGlzc3ViY2xhc3ModHB3YW50ZWQsIENhcmJvbi5GaWxlLkZTUmVmKToKKyAgICAgICAgcmV0dXJuIHRwd2FudGVkKHJyLnNlbGVjdGlvbl9mc3JbMF0pCisgICAgaWYgaXNzdWJjbGFzcyh0cHdhbnRlZCwgQ2FyYm9uLkZpbGUuRlNTcGVjKToKKyAgICAgICAgcmV0dXJuIHRwd2FudGVkKHJyLnNlbGVjdGlvblswXSkKKyAgICBpZiBpc3N1YmNsYXNzKHRwd2FudGVkLCBzdHIpOgorICAgICAgICByZXR1cm4gdHB3YW50ZWQocnIuc2VsZWN0aW9uX2ZzclswXS5hc19wYXRobmFtZSgpKQorICAgIGlmIGlzc3ViY2xhc3ModHB3YW50ZWQsIHVuaWNvZGUpOgorICAgICAgICByZXR1cm4gdHB3YW50ZWQocnIuc2VsZWN0aW9uX2ZzclswXS5hc19wYXRobmFtZSgpLCAndXRmOCcpCisgICAgcmFpc2UgVHlwZUVycm9yLCAiVW5rbm93biB2YWx1ZSBmb3IgYXJndW1lbnQgJ3dhbnRlZCc6ICVzIiAlIHJlcHIodHB3YW50ZWQpCisKKworZGVmIHRlc3QoKToKKyAgICBpbXBvcnQgdGltZQorCisgICAgTWVzc2FnZSgiVGVzdGluZyBFYXN5RGlhbG9ncy4iKQorICAgIG9wdGlvbmxpc3QgPSAoKCd2JywgJ1ZlcmJvc2UnKSwgKCd2ZXJib3NlJywgJ1ZlcmJvc2UgYXMgbG9uZyBvcHRpb24nKSwKKyAgICAgICAgICAgICAgICAoJ2ZsYWdzPScsICdWYWx1ZWQgb3B0aW9uJyksICgnZjonLCAnU2hvcnQgdmFsdWVkIG9wdGlvbicpKQorICAgIGNvbW1hbmRsaXN0ID0gKCgnc3RhcnQnLCAnU3RhcnQgc29tZXRoaW5nJyksICgnc3RvcCcsICdTdG9wIHNvbWV0aGluZycpKQorICAgIGFyZ3YgPSBHZXRBcmd2KG9wdGlvbmxpc3Q9b3B0aW9ubGlzdCwgY29tbWFuZGxpc3Q9Y29tbWFuZGxpc3QsIGFkZG9sZGZpbGU9MCkKKyAgICBNZXNzYWdlKCJDb21tYW5kIGxpbmU6ICVzIiUnICcuam9pbihhcmd2KSkKKyAgICBmb3IgaSBpbiByYW5nZShsZW4oYXJndikpOgorICAgICAgICBwcmludCAnYXJnWyVkXSA9ICVyJyAlIChpLCBhcmd2W2ldKQorICAgIG9rID0gQXNrWWVzTm9DYW5jZWwoIkRvIHlvdSB3YW50IHRvIHByb2NlZWQ/IikKKyAgICBvayA9IEFza1llc05vQ2FuY2VsKCJEbyB5b3Ugd2FudCB0byBpZGVudGlmeT8iLCB5ZXM9IklkZW50aWZ5Iiwgbm89Ik5vIikKKyAgICBpZiBvayA+IDA6CisgICAgICAgIHMgPSBBc2tTdHJpbmcoIkVudGVyIHlvdXIgZmlyc3QgbmFtZSIsICJKb2UiKQorICAgICAgICBzMiA9IEFza1Bhc3N3b3JkKCJPa2F5ICVzLCB0ZWxsIHVzIHlvdXIgbmlja25hbWUiJXMsIHMsIGNhbmNlbD0iTm9uZSIpCisgICAgICAgIGlmIG5vdCBzMjoKKyAgICAgICAgICAgIE1lc3NhZ2UoIiVzIGhhcyBubyBzZWNyZXQgbmlja25hbWUiJXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBNZXNzYWdlKCJIZWxsbyBldmVyeWJvZHkhIVxuVGhlIHNlY3JldCBuaWNrbmFtZSBvZiAlcyBpcyAlcyEhISIlKHMsIHMyKSkKKyAgICBlbHNlOgorICAgICAgICBzID0gJ0Fub255bW91cycKKyAgICBydiA9IEFza0ZpbGVGb3JPcGVuKG1lc3NhZ2U9IkdpbW1lIGEgZmlsZSwgJXMiJXMsIHdhbnRlZD1DYXJib24uRmlsZS5GU1NwZWMpCisgICAgTWVzc2FnZSgicnY6ICVzIiVydikKKyAgICBydiA9IEFza0ZpbGVGb3JTYXZlKHdhbnRlZD1DYXJib24uRmlsZS5GU1JlZiwgc2F2ZWRGaWxlTmFtZT0iJXMudHh0IiVzKQorICAgIE1lc3NhZ2UoInJ2LmFzX3BhdGhuYW1lOiAlcyIlcnYuYXNfcGF0aG5hbWUoKSkKKyAgICBydiA9IEFza0ZvbGRlcigpCisgICAgTWVzc2FnZSgiRm9sZGVyIG5hbWU6ICVzIiVydikKKyAgICB0ZXh0ID0gKCAiV29ya2luZyBIYXJkLi4uIiwgIkhhcmRseSBXb3JraW5nLi4uIiAsCisgICAgICAgICAgICAiU28gZmFyLCBzbyBnb29kISIsICJLZWVwIG9uIHRydWNraW4nIiApCisgICAgYmFyID0gUHJvZ3Jlc3NCYXIoIlByb2dyZXNzLCBwcm9ncmVzcy4uLiIsIDAsIGxhYmVsPSJSYW1waW5nIHVwLi4uIikKKyAgICB0cnk6CisgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdTY2hlZFBhcmFtcycpOgorICAgICAgICAgICAgYXBwc3cgPSBNYWNPUy5TY2hlZFBhcmFtcygxLCAwKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjApOgorICAgICAgICAgICAgYmFyLmluYygpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDUpCisgICAgICAgIGJhci5zZXQoMCwxMDApCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgYmFyLnNldChpKQorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjA1KQorICAgICAgICAgICAgaWYgaSAlIDEwID09IDA6CisgICAgICAgICAgICAgICAgYmFyLmxhYmVsKHRleHRbKGkvMTApICUgNF0pCisgICAgICAgIGJhci5sYWJlbCgiRG9uZS4iKQorICAgICAgICB0aW1lLnNsZWVwKDEuMCkgICAgICMgZ2l2ZSdlbSBhIGNoYW5jZSB0byBzZWUgIkRvbmUuIgorICAgIGZpbmFsbHk6CisgICAgICAgIGRlbCBiYXIKKyAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ1NjaGVkUGFyYW1zJyk6CisgICAgICAgICAgICBNYWNPUy5TY2hlZFBhcmFtcygqYXBwc3cpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdHJ5OgorICAgICAgICB0ZXN0KCkKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIE1lc3NhZ2UoIk9wZXJhdGlvbiBDYW5jZWxlZC4iKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9FYXN5RGlhbG9ncy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0Vhc3lEaWFsb2dzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzUxMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9FYXN5RGlhbG9ncy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9FYXN5RGlhbG9ncy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0Vhc3lEaWFsb2dzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzUxMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9FYXN5RGlhbG9ncy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9GcmFtZVdvcmsucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL0ZyYW1lV29yay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYThhYWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9GcmFtZVdvcmsucHkKQEAgLTAsMCArMSwxMTI2IEBACisiQSBzb3J0IG9mIGFwcGxpY2F0aW9uIGZyYW1ld29yayBmb3IgdGhlIE1hYyIKKworREVCVUc9MAorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIEZyYW1lV29yayBtb2R1bGUgaXMgcmVtb3ZlZC4iLCBzdGFja2xldmVsPTIpCisKK2ltcG9ydCBNYWNPUworaW1wb3J0IHRyYWNlYmFjaworCitmcm9tIENhcmJvbi5BRSBpbXBvcnQgKgorZnJvbSBDYXJib24uQXBwbGVFdmVudHMgaW1wb3J0ICoKK2Zyb20gQ2FyYm9uLkN0bCBpbXBvcnQgKgorZnJvbSBDYXJib24uQ29udHJvbHMgaW1wb3J0ICoKK2Zyb20gQ2FyYm9uLkRsZyBpbXBvcnQgKgorZnJvbSBDYXJib24uRGlhbG9ncyBpbXBvcnQgKgorZnJvbSBDYXJib24uRXZ0IGltcG9ydCAqCitmcm9tIENhcmJvbi5FdmVudHMgaW1wb3J0ICoKK2Zyb20gQ2FyYm9uLkhlbHAgaW1wb3J0ICoKK2Zyb20gQ2FyYm9uLk1lbnUgaW1wb3J0ICoKK2Zyb20gQ2FyYm9uLk1lbnVzIGltcG9ydCAqCitmcm9tIENhcmJvbi5RZCBpbXBvcnQgKgorZnJvbSBDYXJib24uUXVpY2tEcmF3IGltcG9ydCAqCisjZnJvbSBDYXJib24uUmVzIGltcG9ydCAqCisjZnJvbSBDYXJib24uUmVzb3VyY2VzIGltcG9ydCAqCisjZnJvbSBDYXJib24uU25kIGltcG9ydCAqCisjZnJvbSBDYXJib24uU291bmQgaW1wb3J0ICoKK2Zyb20gQ2FyYm9uLldpbiBpbXBvcnQgKgorZnJvbSBDYXJib24uV2luZG93cyBpbXBvcnQgKgoraW1wb3J0IHR5cGVzCisKK2ltcG9ydCBFYXN5RGlhbG9ncworCit0cnk6CisgICAgTXlGcm9udFdpbmRvdyA9IEZyb250Tm9uRmxvYXRpbmdXaW5kb3cKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgTXlGcm9udFdpbmRvdyA9IEZyb250V2luZG93CisKK2tIaWdoTGV2ZWxFdmVudCA9IDIzICAgICMgRG9uJ3Qga25vdyB3aGF0IGhlYWRlciBmaWxlIHRoaXMgc2hvdWxkIGNvbWUgZnJvbQorU0NST0xMQkFSV0lEVEggPSAxNiAgICAgICAgICMgQWdhaW4sIG5vdCBhIGNsdWUuLi4KKworIyBUcmljayB0byBmb3Jlc3RhbGwgYSBzZXQgb2YgU0lPVVggbWVudXMgYmVpbmcgYWRkZWQgdG8gb3VyIG1lbnViYXIKK1NJT1VYX0FQUExFTUVOVV9JRD0zMjAwMAorCisKKyMgTWFwIGV2ZW50ICd3aGF0JyBmaWVsZCB0byBzdHJpbmdzCitldmVudG5hbWUgPSB7fQorZXZlbnRuYW1lWzFdID0gJ21vdXNlRG93bicKK2V2ZW50bmFtZVsyXSA9ICdtb3VzZVVwJworZXZlbnRuYW1lWzNdID0gJ2tleURvd24nCitldmVudG5hbWVbNF0gPSAna2V5VXAnCitldmVudG5hbWVbNV0gPSAnYXV0b0tleScKK2V2ZW50bmFtZVs2XSA9ICd1cGRhdGVFdnQnCitldmVudG5hbWVbN10gPSAnZGlza0V2dCcKK2V2ZW50bmFtZVs4XSA9ICdhY3RpdmF0ZUV2dCcKK2V2ZW50bmFtZVsxNV0gPSAnb3NFdnQnCitldmVudG5hbWVbMjNdID0gJ2tIaWdoTGV2ZWxFdmVudCcKKworIyBNYXAgcGFydCBjb2RlcyByZXR1cm5lZCBieSBXaGljaFdpbmRvdygpIHRvIHN0cmluZ3MKK3BhcnRuYW1lID0ge30KK3BhcnRuYW1lWzBdID0gJ2luRGVzaycKK3BhcnRuYW1lWzFdID0gJ2luTWVudUJhcicKK3BhcnRuYW1lWzJdID0gJ2luU3lzV2luZG93JworcGFydG5hbWVbM10gPSAnaW5Db250ZW50JworcGFydG5hbWVbNF0gPSAnaW5EcmFnJworcGFydG5hbWVbNV0gPSAnaW5Hcm93JworcGFydG5hbWVbNl0gPSAnaW5Hb0F3YXknCitwYXJ0bmFtZVs3XSA9ICdpblpvb21JbicKK3BhcnRuYW1lWzhdID0gJ2luWm9vbU91dCcKKworIworIyBUaGUgdXNlYWJsZSBwb3J0aW9uIG9mIHRoZSBzY3JlZW4KKyMgICAgICAgIyMgYnV0IHdoYXQgaGFwcGVucyB3aXRoIG11bHRpcGxlIHNjcmVlbnM/IGp2cgorc2NyZWVuYm91bmRzID0gR2V0UURHbG9iYWxzU2NyZWVuQml0cygpLmJvdW5kcworc2NyZWVuYm91bmRzID0gc2NyZWVuYm91bmRzWzBdKzQsIHNjcmVlbmJvdW5kc1sxXSs0LCBcCisgICAgc2NyZWVuYm91bmRzWzJdLTQsIHNjcmVlbmJvdW5kc1szXS00CisKK25leHRfd2luZG93X3ggPSAxNiAgICAgICAgICAjIGp2cgorbmV4dF93aW5kb3dfeSA9IDQ0ICAgICAgICAgICMganZyCisKK2RlZiB3aW5kb3dib3VuZHMod2lkdGgsIGhlaWdodCk6CisgICAgIlJldHVybiBzZW5zaWJsZSB3aW5kb3cgYm91bmRzIgorICAgIGdsb2JhbCBuZXh0X3dpbmRvd194LCBuZXh0X3dpbmRvd195CisgICAgciwgYiA9IG5leHRfd2luZG93X3grd2lkdGgsIG5leHRfd2luZG93X3kraGVpZ2h0CisgICAgaWYgciA+IHNjcmVlbmJvdW5kc1syXToKKyAgICAgICAgbmV4dF93aW5kb3dfeCA9IDE2CisgICAgaWYgYiA+IHNjcmVlbmJvdW5kc1szXToKKyAgICAgICAgbmV4dF93aW5kb3dfeSA9IDQ0CisgICAgbCwgdCA9IG5leHRfd2luZG93X3gsIG5leHRfd2luZG93X3kKKyAgICByLCBiID0gbmV4dF93aW5kb3dfeCt3aWR0aCwgbmV4dF93aW5kb3dfeStoZWlnaHQKKyAgICBuZXh0X3dpbmRvd194LCBuZXh0X3dpbmRvd195ID0gbmV4dF93aW5kb3dfeCArIDgsIG5leHRfd2luZG93X3kgKyAyMCAgICAjIGp2cgorICAgIHJldHVybiBsLCB0LCByLCBiCisKK193YXRjaCA9IE5vbmUKK2RlZiBzZXR3YXRjaGN1cnNvcigpOgorICAgIGdsb2JhbCBfd2F0Y2gKKworICAgIGlmIF93YXRjaCBpcyBOb25lOgorICAgICAgICBfd2F0Y2ggPSBHZXRDdXJzb3IoNCkuZGF0YQorICAgIFNldEN1cnNvcihfd2F0Y2gpCisKK2RlZiBzZXRhcnJvd2N1cnNvcigpOgorICAgIFNldEN1cnNvcihHZXRRREdsb2JhbHNBcnJvdygpKQorCitjbGFzcyBBcHBsaWNhdGlvbjoKKworICAgICJBcHBsaWNhdGlvbiBmcmFtZXdvcmsgLS0geW91ciBhcHBsaWNhdGlvbiBzaG91bGQgYmUgYSBkZXJpdmVkIGNsYXNzIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vbWVudWJhcj0wKToKKyAgICAgICAgc2VsZi5fZG9pbmdfYXN5bmNldmVudHMgPSAwCisgICAgICAgIHNlbGYucXVpdHRpbmcgPSAwCisgICAgICAgIHNlbGYubmVlZG1lbnViYXJyZWRyYXcgPSAwCisgICAgICAgIHNlbGYuX3dpbmRvd3MgPSB7fQorICAgICAgICBzZWxmLl9oZWxwbWVudSA9IE5vbmUKKyAgICAgICAgaWYgbm9tZW51YmFyOgorICAgICAgICAgICAgc2VsZi5tZW51YmFyID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5tYWtlbWVudWJhcigpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZG9pbmdfYXN5bmNldmVudHM6CisgICAgICAgICAgICBzZWxmLl9kb2luZ19hc3luY2V2ZW50cyA9IDAKKyAgICAgICAgICAgIE1hY09TLlNldEV2ZW50SGFuZGxlcigpCisKKyAgICBkZWYgbWFrZW1lbnViYXIoc2VsZik6CisgICAgICAgIHNlbGYubWVudWJhciA9IE1lbnVCYXIoc2VsZikKKyAgICAgICAgQXBwbGVNZW51KHNlbGYubWVudWJhciwgc2VsZi5nZXRhYm91dHRleHQoKSwgc2VsZi5kb19hYm91dCkKKyAgICAgICAgc2VsZi5tYWtldXNlcm1lbnVzKCkKKworICAgIGRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVtZW51ID0gbSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCisgICAgICAgIHNlbGYuX3F1aXRpdGVtID0gTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYuX3F1aXQpCisKKyAgICBkZWYgZ2V0aGVscG1lbnUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2hlbHBtZW51IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9oZWxwbWVudSA9IEhlbHBNZW51KHNlbGYubWVudWJhcikKKyAgICAgICAgcmV0dXJuIHNlbGYuX2hlbHBtZW51CisKKyAgICBkZWYgX3F1aXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLnF1aXR0aW5nID0gMQorCisgICAgZGVmIGNsZWFudXAoc2VsZik6CisgICAgICAgIGZvciB3IGluIHNlbGYuX3dpbmRvd3MudmFsdWVzKCk6CisgICAgICAgICAgICB3LmRvX2Nsb3NlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3dpbmRvd3MgPT0ge30KKworICAgIGRlZiBhcHBlbmR3aW5kb3coc2VsZiwgd2lkLCB3aW5kb3cpOgorICAgICAgICBzZWxmLl93aW5kb3dzW3dpZF0gPSB3aW5kb3cKKworICAgIGRlZiByZW1vdmV3aW5kb3coc2VsZiwgd2lkKToKKyAgICAgICAgZGVsIHNlbGYuX3dpbmRvd3Nbd2lkXQorCisgICAgZGVmIGdldGFib3V0dGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuICJBYm91dCAlcy4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgZGVmIGRvX2Fib3V0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiSGVsbG8sIHdvcmxkISIgKyAiXDAxNSglcykiICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCisKKyAgICAjIFRoZSBtYWluIGV2ZW50IGxvb3AgaXMgYnJva2VuIHVwIGluIHNldmVyYWwgc2ltcGxlIHN0ZXBzLgorICAgICMgVGhpcyBpcyBkb25lIHNvIHlvdSBjYW4gb3ZlcnJpZGUgZWFjaCBpbmRpdmlkdWFsIHBhcnQsCisgICAgIyBpZiB5b3UgaGF2ZSBhIG5lZWQgdG8gZG8gZXh0cmEgcHJvY2Vzc2luZyBpbmRlcGVuZGVudCBvZiB0aGUKKyAgICAjIGV2ZW50IHR5cGUuCisgICAgIyBOb3JtYWxseSwgaG93ZXZlciwgeW91J2QganVzdCBkZWZpbmUgaGFuZGxlcnMgZm9yIGluZGl2aWR1YWwKKyAgICAjIGV2ZW50cy4KKworICAgIHNjaGVkcGFyYW1zID0gKDAsIDApICAgICMgQnkgZGVmYXVsdCBkaXNhYmxlIFB5dGhvbidzIGV2ZW50IGhhbmRsaW5nCisgICAgZGVmYXVsdF93YWl0ID0gTm9uZSAgICAgICAgICMgQnkgZGVmYXVsdCB3ZSB3YWl0IEdldENhcmV0VGltZSBpbiBXYWl0TmV4dEV2ZW50CisKKyAgICBkZWYgbWFpbmxvb3Aoc2VsZiwgbWFzayA9IGV2ZXJ5RXZlbnQsIHdhaXQgPSBOb25lKToKKyAgICAgICAgc2VsZi5xdWl0dGluZyA9IDAKKyAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ1NjaGVkUGFyYW1zJyk6CisgICAgICAgICAgICBzYXZlcGFyYW1zID0gTWFjT1MuU2NoZWRQYXJhbXMoKnNlbGYuc2NoZWRwYXJhbXMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1aXR0aW5nOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kbzFldmVudChtYXNrLCB3YWl0KQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoQXBwbGljYXRpb24sIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgICAgICAgICAjIE5vdGU6IHRoZSByYWlzaW5nIG9mICJzZWxmIiBpcyBvbGQtZmFzaGlvbmVkIGlkaW9tIHRvCisgICAgICAgICAgICAgICAgICAgICMgZXhpdCB0aGUgbWFpbmxvb3AuIENhbGxpbmcgX3F1aXQoKSBpcyBiZXR0ZXIgZm9yIG5ldworICAgICAgICAgICAgICAgICAgICAjIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdTY2hlZFBhcmFtcycpOgorICAgICAgICAgICAgICAgIE1hY09TLlNjaGVkUGFyYW1zKCpzYXZlcGFyYW1zKQorCisgICAgZGVmIGRvcGVuZGluZ2V2ZW50cyhzZWxmLCBtYXNrID0gZXZlcnlFdmVudCk6CisgICAgICAgICIiImRvcGVuZGluZ2V2ZW50cyAtIEhhbmRsZSBhbGwgcGVuZGluZyBldmVudHMiIiIKKyAgICAgICAgd2hpbGUgc2VsZi5kbzFldmVudChtYXNrLCB3YWl0PTApOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGRvMWV2ZW50KHNlbGYsIG1hc2sgPSBldmVyeUV2ZW50LCB3YWl0ID0gTm9uZSk6CisgICAgICAgIG9rLCBldmVudCA9IHNlbGYuZ2V0ZXZlbnQobWFzaywgd2FpdCkKKyAgICAgICAgaWYgSXNEaWFsb2dFdmVudChldmVudCk6CisgICAgICAgICAgICBpZiBzZWxmLmRvX2RpYWxvZ2V2ZW50KGV2ZW50KToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgb2s6CisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGV2ZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5pZGxlKGV2ZW50KQorCisgICAgZGVmIGlkbGUoc2VsZiwgZXZlbnQpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2V0ZXZlbnQoc2VsZiwgbWFzayA9IGV2ZXJ5RXZlbnQsIHdhaXQgPSBOb25lKToKKyAgICAgICAgaWYgc2VsZi5uZWVkbWVudWJhcnJlZHJhdzoKKyAgICAgICAgICAgIERyYXdNZW51QmFyKCkKKyAgICAgICAgICAgIHNlbGYubmVlZG1lbnViYXJyZWRyYXcgPSAwCisgICAgICAgIGlmIHdhaXQgaXMgTm9uZToKKyAgICAgICAgICAgIHdhaXQgPSBzZWxmLmRlZmF1bHRfd2FpdAorICAgICAgICAgICAgaWYgd2FpdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHdhaXQgPSBHZXRDYXJldFRpbWUoKQorICAgICAgICBvaywgZXZlbnQgPSBXYWl0TmV4dEV2ZW50KG1hc2ssIHdhaXQpCisgICAgICAgIHJldHVybiBvaywgZXZlbnQKKworICAgIGRlZiBkaXNwYXRjaChzZWxmLCBldmVudCk6CisgICAgICAgICMgVGhlIGZvbGxvd2luZyBhcHBlYXJzIHRvIGJlIGRvdWJsZSB3b3JrIChhbHJlYWR5IGRvbmUgaW4gZG8xZXZlbnQpCisgICAgICAgICMgYnV0IHdlIG5lZWQgaXQgZm9yIGFzeW5jaHJvbm91cyBldmVudCBoYW5kbGluZworICAgICAgICBpZiBJc0RpYWxvZ0V2ZW50KGV2ZW50KToKKyAgICAgICAgICAgIGlmIHNlbGYuZG9fZGlhbG9nZXZlbnQoZXZlbnQpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAorICAgICAgICBpZiB3aGF0IGluIGV2ZW50bmFtZToKKyAgICAgICAgICAgIG5hbWUgPSAiZG9fIiArIGV2ZW50bmFtZVt3aGF0XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9ICJkb18lZCIgJSB3aGF0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhhbmRsZXIgPSBnZXRhdHRyKHNlbGYsIG5hbWUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGhhbmRsZXIgPSBzZWxmLmRvX3Vua25vd25ldmVudAorICAgICAgICBoYW5kbGVyKGV2ZW50KQorCisgICAgZGVmIGFzeW5jZXZlbnRzKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgIiIiYXN5bmNldmVudHMgLSBTZXQgYXN5bmNocm9ub3VzIGV2ZW50IGhhbmRsaW5nIG9uIG9yIG9mZiIiIgorICAgICAgICBpZiBNYWNPUy5ydW50aW1lbW9kZWwgPT0gJ21hY2hvJzoKKyAgICAgICAgICAgIHJhaXNlICdVbnN1cHBvcnRlZCBpbiBNYWNob1B5dGhvbicKKyAgICAgICAgb2xkID0gc2VsZi5fZG9pbmdfYXN5bmNldmVudHMKKyAgICAgICAgaWYgb2xkOgorICAgICAgICAgICAgTWFjT1MuU2V0RXZlbnRIYW5kbGVyKCkKKyAgICAgICAgICAgIE1hY09TLlNjaGVkUGFyYW1zKCpzZWxmLnNjaGVkcGFyYW1zKQorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIE1hY09TLlNldEV2ZW50SGFuZGxlcihzZWxmLmRpc3BhdGNoKQorICAgICAgICAgICAgZG9pbnQsIGR1bW15bWFzaywgYmVuaWNlLCBob3dvZnRlbiwgYmd5aWVsZCA9IFwKKyAgICAgICAgICAgICAgICAgICBzZWxmLnNjaGVkcGFyYW1zCisgICAgICAgICAgICBNYWNPUy5TY2hlZFBhcmFtcyhkb2ludCwgZXZlcnlFdmVudCwgYmVuaWNlLAorICAgICAgICAgICAgICAgICAgICAgIGhvd29mdGVuLCBiZ3lpZWxkKQorICAgICAgICBzZWxmLl9kb2luZ19hc3luY2V2ZW50cyA9IG9ub2ZmCisgICAgICAgIHJldHVybiBvbGQKKworICAgIGRlZiBkb19kaWFsb2dldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGdvdG9uZSwgZGxnLCBpdGVtID0gRGlhbG9nU2VsZWN0KGV2ZW50KQorICAgICAgICBpZiBnb3RvbmU6CisgICAgICAgICAgICB3aW5kb3cgPSBkbGcuR2V0RGlhbG9nV2luZG93KCkKKyAgICAgICAgICAgIGlmIHdpbmRvdyBpbiBzZWxmLl93aW5kb3dzOgorICAgICAgICAgICAgICAgIHNlbGYuX3dpbmRvd3Nbd2luZG93XS5kb19pdGVtaGl0KGl0ZW0sIGV2ZW50KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAnRGlhbG9nIGV2ZW50IGZvciB1bmtub3duIGRpYWxvZycKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgZG9fbW91c2VEb3duKHNlbGYsIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgcGFydGNvZGUsIHdpZCA9IEZpbmRXaW5kb3cod2hlcmUpCisKKyAgICAgICAgIworICAgICAgICAjIEZpbmQgdGhlIGNvcnJlY3QgbmFtZS4KKyAgICAgICAgIworICAgICAgICBpZiBwYXJ0Y29kZSBpbiBwYXJ0bmFtZToKKyAgICAgICAgICAgIG5hbWUgPSAiZG9fIiArIHBhcnRuYW1lW3BhcnRjb2RlXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9ICJkb18lZCIgJSBwYXJ0Y29kZQorCisgICAgICAgIGlmIHdpZCBpcyBOb25lOgorICAgICAgICAgICAgIyBObyB3aW5kb3csIG9yIGEgbm9uLXB5dGhvbiB3aW5kb3cKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBoYW5kbGVyID0gZ2V0YXR0cihzZWxmLCBuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICMgTm90IG1lbnViYXIgb3Igc29tZXRoaW5nLCBzbyBhc3N1bWUgc29tZW9uZQorICAgICAgICAgICAgICAgICMgZWxzZSdzIHdpbmRvdworICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdIYW5kbGVFdmVudCcpOgorICAgICAgICAgICAgICAgICAgICBNYWNPUy5IYW5kbGVFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiB3aWQgaW4gc2VsZi5fd2luZG93czoKKyAgICAgICAgICAgICMgSXQgaXMgYSB3aW5kb3cuIEhhbmQgb2ZmIHRvIGNvcnJlY3Qgd2luZG93LgorICAgICAgICAgICAgd2luZG93ID0gc2VsZi5fd2luZG93c1t3aWRdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IGdldGF0dHIod2luZG93LCBuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBzZWxmLmRvX3Vua25vd25wYXJ0Y29kZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBJdCBpcyBhIHB5dGhvbi10b29sYm94IHdpbmRvdywgYnV0IG5vdCBvdXJzLgorICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuZG9fdW5rbm93bndpbmRvdworICAgICAgICBoYW5kbGVyKHBhcnRjb2RlLCB3aWQsIGV2ZW50KQorCisgICAgZGVmIGRvX2luU3lzV2luZG93KHNlbGYsIHBhcnRjb2RlLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0hhbmRsZUV2ZW50Jyk6CisgICAgICAgICAgICBNYWNPUy5IYW5kbGVFdmVudChldmVudCkKKworICAgIGRlZiBkb19pbkRlc2soc2VsZiwgcGFydGNvZGUsIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnSGFuZGxlRXZlbnQnKToKKyAgICAgICAgICAgIE1hY09TLkhhbmRsZUV2ZW50KGV2ZW50KQorCisgICAgZGVmIGRvX2luTWVudUJhcihzZWxmLCBwYXJ0Y29kZSwgd2luZG93LCBldmVudCk6CisgICAgICAgIGlmIG5vdCBzZWxmLm1lbnViYXI6CisgICAgICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnSGFuZGxlRXZlbnQnKToKKyAgICAgICAgICAgICAgICBNYWNPUy5IYW5kbGVFdmVudChldmVudCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAorICAgICAgICByZXN1bHQgPSBNZW51U2VsZWN0KHdoZXJlKQorICAgICAgICBpZCA9IChyZXN1bHQ+PjE2KSAmIDB4ZmZmZiAgICAgICMgSGkgd29yZAorICAgICAgICBpZiBpZCA+PSAweDgwMDA6CisgICAgICAgICAgICBpZCA9IC02NTUzNiArIGlkCisgICAgICAgIGl0ZW0gPSByZXN1bHQgJiAweGZmZmYgICAgICAjIExvIHdvcmQKKyAgICAgICAgc2VsZi5kb19yYXdtZW51KGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KQorCisgICAgZGVmIGRvX3Jhd21lbnUoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRvX21lbnUoaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBIaWxpdGVNZW51KDApCisKKyAgICBkZWYgZG9fbWVudShzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6CisgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdPdXRwdXRTZWVuJyk6CisgICAgICAgICAgICBNYWNPUy5PdXRwdXRTZWVuKCkKKyAgICAgICAgc2VsZi5tZW51YmFyLmRpc3BhdGNoKGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KQorCisKKyAgICBkZWYgZG9fdW5rbm93bnBhcnRjb2RlKHNlbGYsIHBhcnRjb2RlLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgaWYgREVCVUc6IHByaW50ICJNb3VzZSBkb3duIGF0IGdsb2JhbDoiLCB3aGVyZQorICAgICAgICBpZiBERUJVRzogcHJpbnQgIlx0VW5rbm93biBwYXJ0IGNvZGU6IiwgcGFydGNvZGUKKyAgICAgICAgaWYgREVCVUc6IHByaW50ICJcdEV2ZW50OiIsIHNlbGYucHJpbnRldmVudChldmVudCkKKyAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0hhbmRsZUV2ZW50Jyk6CisgICAgICAgICAgICBNYWNPUy5IYW5kbGVFdmVudChldmVudCkKKworICAgIGRlZiBkb191bmtub3dud2luZG93KHNlbGYsIHBhcnRjb2RlLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgaWYgREVCVUc6IHByaW50ICdVbmtub3duIHdpbmRvdzonLCB3aW5kb3cKKyAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0hhbmRsZUV2ZW50Jyk6CisgICAgICAgICAgICBNYWNPUy5IYW5kbGVFdmVudChldmVudCkKKworICAgIGRlZiBkb19rZXlEb3duKHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi5kb19rZXkoZXZlbnQpCisKKyAgICBkZWYgZG9fYXV0b0tleShzZWxmLCBldmVudCk6CisgICAgICAgIGlmIG5vdCBldmVudFstMV0gJiBjbWRLZXk6CisgICAgICAgICAgICBzZWxmLmRvX2tleShldmVudCkKKworICAgIGRlZiBkb19rZXkoc2VsZiwgZXZlbnQpOgorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAorICAgICAgICBjID0gY2hyKG1lc3NhZ2UgJiBjaGFyQ29kZU1hc2spCisgICAgICAgIGlmIHNlbGYubWVudWJhcjoKKyAgICAgICAgICAgIHJlc3VsdCA9IE1lbnVFdmVudChldmVudCkKKyAgICAgICAgICAgIGlkID0gKHJlc3VsdD4+MTYpICYgMHhmZmZmICAgICAgIyBIaSB3b3JkCisgICAgICAgICAgICBpdGVtID0gcmVzdWx0ICYgMHhmZmZmICAgICAgIyBMbyB3b3JkCisgICAgICAgICAgICBpZiBpZDoKKyAgICAgICAgICAgICAgICBzZWxmLmRvX3Jhd21lbnUoaWQsIGl0ZW0sIE5vbmUsIGV2ZW50KQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgIyBPdGhlcndpc2Ugd2UgZmFsbC10aHJvdWdoCisgICAgICAgIGlmIG1vZGlmaWVycyAmIGNtZEtleToKKyAgICAgICAgICAgIGlmIGMgPT0gJy4nOgorICAgICAgICAgICAgICAgIHJhaXNlIHNlbGYKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYubWVudWJhcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0hhbmRsZUV2ZW50Jyk6CisgICAgICAgICAgICAgICAgICAgICAgICBNYWNPUy5IYW5kbGVFdmVudChldmVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgU2VlIHdoZXRoZXIgdGhlIGZyb250IHdpbmRvdyB3YW50cyBpdAorICAgICAgICAgICAgdyA9IE15RnJvbnRXaW5kb3coKQorICAgICAgICAgICAgaWYgdyBhbmQgdyBpbiBzZWxmLl93aW5kb3dzOgorICAgICAgICAgICAgICAgIHdpbmRvdyA9IHNlbGYuX3dpbmRvd3Nbd10KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRvX2NoYXIgPSB3aW5kb3cuZG9fY2hhcgorICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgZG9fY2hhciA9IHNlbGYuZG9fY2hhcgorICAgICAgICAgICAgICAgIGRvX2NoYXIoYywgZXZlbnQpCisgICAgICAgICAgICAjIGVsc2UgaXQgd2Fzbid0IGZvciB1cywgc2lnaC4uLgorCisgICAgZGVmIGRvX2NoYXIoc2VsZiwgYywgZXZlbnQpOgorICAgICAgICBpZiBERUJVRzogcHJpbnQgIkNoYXJhY3RlciIsIHJlcHIoYykKKworICAgIGRlZiBkb191cGRhdGVFdnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAorICAgICAgICB3aWQgPSBXaGljaFdpbmRvdyhtZXNzYWdlKQorICAgICAgICBpZiB3aWQgYW5kIHdpZCBpbiBzZWxmLl93aW5kb3dzOgorICAgICAgICAgICAgd2luZG93ID0gc2VsZi5fd2luZG93c1t3aWRdCisgICAgICAgICAgICB3aW5kb3cuZG9fcmF3dXBkYXRlKHdpZCwgZXZlbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnSGFuZGxlRXZlbnQnKToKKyAgICAgICAgICAgICAgICBNYWNPUy5IYW5kbGVFdmVudChldmVudCkKKworICAgIGRlZiBkb19hY3RpdmF0ZUV2dChzZWxmLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIHdpZCA9IFdoaWNoV2luZG93KG1lc3NhZ2UpCisgICAgICAgIGlmIHdpZCBhbmQgd2lkIGluIHNlbGYuX3dpbmRvd3M6CisgICAgICAgICAgICB3aW5kb3cgPSBzZWxmLl93aW5kb3dzW3dpZF0KKyAgICAgICAgICAgIHdpbmRvdy5kb19hY3RpdmF0ZShtb2RpZmllcnMgJiAxLCBldmVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdIYW5kbGVFdmVudCcpOgorICAgICAgICAgICAgICAgIE1hY09TLkhhbmRsZUV2ZW50KGV2ZW50KQorCisgICAgZGVmIGRvX29zRXZ0KHNlbGYsIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgd2hpY2ggPSAobWVzc2FnZSA+PiAyNCkgJiAweGZmCisgICAgICAgIGlmIHdoaWNoID09IDE6ICAjIHN1c3BlbmQvcmVzdW1lCisgICAgICAgICAgICBzZWxmLmRvX3N1c3BlbmRyZXN1bWUoZXZlbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgICAgICBwcmludCAndW5rbm93biBvc0V2dDonLAorICAgICAgICAgICAgICAgIHNlbGYucHJpbnRldmVudChldmVudCkKKworICAgIGRlZiBkb19zdXNwZW5kcmVzdW1lKHNlbGYsIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgd2lkID0gTXlGcm9udFdpbmRvdygpCisgICAgICAgIGlmIHdpZCBhbmQgd2lkIGluIHNlbGYuX3dpbmRvd3M6CisgICAgICAgICAgICB3aW5kb3cgPSBzZWxmLl93aW5kb3dzW3dpZF0KKyAgICAgICAgICAgIHdpbmRvdy5kb19hY3RpdmF0ZShtZXNzYWdlICYgMSwgZXZlbnQpCisKKyAgICBkZWYgZG9fa0hpZ2hMZXZlbEV2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBwcmludCAiSGlnaCBMZXZlbCBFdmVudDoiLAorICAgICAgICAgICAgc2VsZi5wcmludGV2ZW50KGV2ZW50KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBBRVByb2Nlc3NBcHBsZUV2ZW50KGV2ZW50KQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjcHJpbnQgIkFFUHJvY2Vzc0FwcGxlRXZlbnQgZXJyb3I6IgorICAgICAgICAgICAgI3RyYWNlYmFjay5wcmludF9leGMoKQorCisgICAgZGVmIGRvX3Vua25vd25ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgcHJpbnQgIlVuaGFuZGxlZCBldmVudDoiLAorICAgICAgICAgICAgc2VsZi5wcmludGV2ZW50KGV2ZW50KQorCisgICAgZGVmIHByaW50ZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAorICAgICAgICBuaWNld2hhdCA9IHJlcHIod2hhdCkKKyAgICAgICAgaWYgd2hhdCBpbiBldmVudG5hbWU6CisgICAgICAgICAgICBuaWNld2hhdCA9IGV2ZW50bmFtZVt3aGF0XQorICAgICAgICBwcmludCBuaWNld2hhdCwKKyAgICAgICAgaWYgd2hhdCA9PSBrSGlnaExldmVsRXZlbnQ6CisgICAgICAgICAgICBoLCB2ID0gd2hlcmUKKyAgICAgICAgICAgIHByaW50IHJlcHIob3N0eXBlY29kZShtZXNzYWdlKSksIGhleCh3aGVuKSwgcmVwcihvc3R5cGVjb2RlKGggfCAodjw8MTYpKSksCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCBoZXgobWVzc2FnZSksIGhleCh3aGVuKSwgd2hlcmUsCisgICAgICAgIHByaW50IGhleChtb2RpZmllcnMpCisKKworY2xhc3MgTWVudUJhcjoKKyAgICAiIiJSZXByZXNlbnQgYSBzZXQgb2YgbWVudXMgaW4gYSBtZW51IGJhci4KKworICAgIEludGVyZmFjZToKKworICAgIC0gKGNvbnN0cnVjdG9yKQorICAgIC0gKGRlc3RydWN0b3IpCisgICAgLSBhZGRtZW51CisgICAgLSBhZGRwb3B1cCAobm9ybWFsbHkgdXNlZCBpbnRlcm5hbGx5KQorICAgIC0gZGlzcGF0Y2ggKGNhbGxlZCBmcm9tIEFwcGxpY2F0aW9uKQorICAgICIiIgorCisgICAgbmV4dGlkID0gMSAgICAgICMgTmVjZXNzYXJpbHkgYSBjbGFzcyB2YXJpYWJsZQorCisgICAgZGVmIGdldG5leHRpZChzZWxmKToKKyAgICAgICAgaWQgPSBNZW51QmFyLm5leHRpZAorICAgICAgICBNZW51QmFyLm5leHRpZCA9IGlkKzEKKyAgICAgICAgcmV0dXJuIGlkCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50PU5vbmUpOgorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorICAgICAgICBDbGVhck1lbnVCYXIoKQorICAgICAgICBzZWxmLmJhciA9IEdldE1lbnVCYXIoKQorICAgICAgICBzZWxmLm1lbnVzID0ge30KKworICAgICMgWFhYIG5lY2Vzc2FyeT8KKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQorICAgICAgICBzZWxmLmJhciA9IE5vbmUKKyAgICAgICAgc2VsZi5tZW51cyA9IE5vbmUKKworICAgIGRlZiBhZGRtZW51KHNlbGYsIHRpdGxlLCBhZnRlciA9IDAsIGlkPU5vbmUpOgorICAgICAgICBpZiBpZCBpcyBOb25lOgorICAgICAgICAgICAgaWQgPSBzZWxmLmdldG5leHRpZCgpCisgICAgICAgIGlmIERFQlVHOiBwcmludCAnTmV3bWVudScsIHRpdGxlLCBpZCAjIFhYWFgKKyAgICAgICAgbSA9IE5ld01lbnUoaWQsIHRpdGxlKQorICAgICAgICBtLkluc2VydE1lbnUoYWZ0ZXIpCisgICAgICAgIGlmIGFmdGVyID49IDA6CisgICAgICAgICAgICBpZiBzZWxmLnBhcmVudDoKKyAgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5uZWVkbWVudWJhcnJlZHJhdyA9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgRHJhd01lbnVCYXIoKQorICAgICAgICByZXR1cm4gaWQsIG0KKworICAgIGRlZiBkZWxtZW51KHNlbGYsIGlkKToKKyAgICAgICAgaWYgREVCVUc6IHByaW50ICdEZWxtZW51JywgaWQgIyBYWFhYCisgICAgICAgIERlbGV0ZU1lbnUoaWQpCisKKyAgICBkZWYgYWRkcG9wdXAoc2VsZiwgdGl0bGUgPSAnJyk6CisgICAgICAgIHJldHVybiBzZWxmLmFkZG1lbnUodGl0bGUsIC0xKQorCisjIFVzZWxlc3M6CisjICAgICAgIGRlZiBpbnN0YWxsKHNlbGYpOgorIyAgICAgICAgICAgaWYgbm90IHNlbGYuYmFyOiByZXR1cm4KKyMgICAgICAgICAgIFNldE1lbnVCYXIoc2VsZi5iYXIpCisjICAgICAgICAgICBpZiBzZWxmLnBhcmVudDoKKyMgICAgICAgICAgICAgICBzZWxmLnBhcmVudC5uZWVkbWVudWJhcnJlZHJhdyA9IDEKKyMgICAgICAgICAgIGVsc2U6CisjICAgICAgICAgICAgICAgRHJhd01lbnVCYXIoKQorCisgICAgZGVmIGZpeG1lbnVkaW1zdGF0ZShzZWxmKToKKyAgICAgICAgZm9yIG0gaW4gc2VsZi5tZW51cy5rZXlzKCk6CisgICAgICAgICAgICBtZW51ID0gc2VsZi5tZW51c1ttXQorICAgICAgICAgICAgaWYgbWVudS5fX2NsYXNzX18gPT0gRnJhbWVXb3JrLkFwcGxlTWVudToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKG1lbnUuaXRlbXMpKToKKyAgICAgICAgICAgICAgICBsYWJlbCwgc2hvcnRjdXQsIGNhbGxiYWNrLCBraW5kID0gbWVudS5pdGVtc1tpXQorICAgICAgICAgICAgICAgIGlmIHR5cGUoY2FsbGJhY2spID09IHR5cGVzLlN0cmluZ1R5cGU6CisgICAgICAgICAgICAgICAgICAgIHdpZCA9IE15RnJvbnRXaW5kb3coKQorICAgICAgICAgICAgICAgICAgICBpZiB3aWQgYW5kIHdpZCBpbiBzZWxmLnBhcmVudC5fd2luZG93czoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyA9IHNlbGYucGFyZW50Ll93aW5kb3dzW3dpZF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIod2luZG93LCAiZG9tZW51XyIgKyBjYWxsYmFjayk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5tZW51LkVuYWJsZU1lbnVJdGVtKGkgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGYucGFyZW50LCAiZG9tZW51XyIgKyBjYWxsYmFjayk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5tZW51LkVuYWJsZU1lbnVJdGVtKGkgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51Lm1lbnUuRGlzYWJsZU1lbnVJdGVtKGkgKyAxKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGhhc2F0dHIoc2VsZi5wYXJlbnQsICJkb21lbnVfIiArIGNhbGxiYWNrKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUubWVudS5FbmFibGVNZW51SXRlbShpICsgMSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUubWVudS5EaXNhYmxlTWVudUl0ZW0oaSArIDEpCisgICAgICAgICAgICAgICAgZWxpZiBjYWxsYmFjazoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGRpc3BhdGNoKHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgaWYgaWQgaW4gc2VsZi5tZW51czoKKyAgICAgICAgICAgIHNlbGYubWVudXNbaWRdLmRpc3BhdGNoKGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgREVCVUc6IHByaW50ICJNZW51QmFyLmRpc3BhdGNoKCVkLCAlZCwgJXMsICVzKSIgJSBcCisgICAgICAgICAgICAgICAgKGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KQorCisKKyMgWFhYIE5lZWQgYSB3YXkgdG8gZ2V0IG1lbnVzIGFzIHJlc291cmNlcyBhbmQgYmluZCB0aGVtIHRvIGNhbGxiYWNrcworCitjbGFzcyBNZW51OgorICAgICJPbmUgbWVudS4iCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYmFyLCB0aXRsZSwgYWZ0ZXI9MCwgaWQ9Tm9uZSk6CisgICAgICAgIHNlbGYuYmFyID0gYmFyCisgICAgICAgIHNlbGYuaWQsIHNlbGYubWVudSA9IHNlbGYuYmFyLmFkZG1lbnUodGl0bGUsIGFmdGVyLCBpZCkKKyAgICAgICAgYmFyLm1lbnVzW3NlbGYuaWRdID0gc2VsZgorICAgICAgICBzZWxmLml0ZW1zID0gW10KKyAgICAgICAgc2VsZi5fcGFyZW50ID0gTm9uZQorCisgICAgZGVmIGRlbGV0ZShzZWxmKToKKyAgICAgICAgc2VsZi5iYXIuZGVsbWVudShzZWxmLmlkKQorICAgICAgICBkZWwgc2VsZi5iYXIubWVudXNbc2VsZi5pZF0KKyAgICAgICAgc2VsZi5tZW51LkRpc3Bvc2VNZW51KCkKKyAgICAgICAgZGVsIHNlbGYuYmFyCisgICAgICAgIGRlbCBzZWxmLml0ZW1zCisgICAgICAgIGRlbCBzZWxmLm1lbnUKKyAgICAgICAgZGVsIHNlbGYuaWQKKyAgICAgICAgZGVsIHNlbGYuX3BhcmVudAorCisgICAgZGVmIGFkZGl0ZW0oc2VsZiwgbGFiZWwsIHNob3J0Y3V0PU5vbmUsIGNhbGxiYWNrPU5vbmUsIGtpbmQ9Tm9uZSk6CisgICAgICAgIHNlbGYubWVudS5BcHBlbmRNZW51KCd4JykgICAgICAgICAgICMgYWRkIGEgZHVtbXkgc3RyaW5nCisgICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKChsYWJlbCwgc2hvcnRjdXQsIGNhbGxiYWNrLCBraW5kKSkKKyAgICAgICAgaXRlbSA9IGxlbihzZWxmLml0ZW1zKQorICAgICAgICBpZiBpc2luc3RhbmNlKGxhYmVsLCB1bmljb2RlKToKKyAgICAgICAgICAgIHNlbGYubWVudS5TZXRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoaXRlbSwgbGFiZWwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1lbnUuU2V0TWVudUl0ZW1UZXh0KGl0ZW0sIGxhYmVsKQorICAgICAgICBpZiBzaG9ydGN1dCBhbmQgdHlwZShzaG9ydGN1dCkgPT0gdHlwZSgoKSk6CisgICAgICAgICAgICBtb2RpZmllcnMsIGNoYXIgPSBzaG9ydGN1dFs6Ml0KKyAgICAgICAgICAgIHNlbGYubWVudS5TZXRJdGVtQ21kKGl0ZW0sIG9yZChjaGFyKSkKKyAgICAgICAgICAgIHNlbGYubWVudS5TZXRNZW51SXRlbU1vZGlmaWVycyhpdGVtLCBtb2RpZmllcnMpCisgICAgICAgICAgICBpZiBsZW4oc2hvcnRjdXQpID4gMjoKKyAgICAgICAgICAgICAgICBzZWxmLm1lbnUuU2V0TWVudUl0ZW1LZXlHbHlwaChpdGVtLCBzaG9ydGN1dFsyXSkKKyAgICAgICAgZWxpZiBzaG9ydGN1dDoKKyAgICAgICAgICAgIHNlbGYubWVudS5TZXRJdGVtQ21kKGl0ZW0sIG9yZChzaG9ydGN1dCkpCisgICAgICAgIHJldHVybiBpdGVtCisKKyAgICBkZWYgZGVsaXRlbShzZWxmLCBpdGVtKToKKyAgICAgICAgaWYgaXRlbSAhPSBsZW4oc2VsZi5pdGVtcyk6CisgICAgICAgICAgICByYWlzZSAnQ2FuIG9ubHkgZGVsZXRlIGxhc3QgaXRlbSBvZiBhIG1lbnUnCisgICAgICAgIHNlbGYubWVudS5EZWxldGVNZW51SXRlbShpdGVtKQorICAgICAgICBkZWwgc2VsZi5pdGVtc1tpdGVtLTFdCisKKyAgICBkZWYgYWRkY2hlY2soc2VsZiwgbGFiZWwsIHNob3J0Y3V0PU5vbmUsIGNhbGxiYWNrPU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGRpdGVtKGxhYmVsLCBzaG9ydGN1dCwgY2FsbGJhY2ssICdjaGVjaycpCisKKyAgICBkZWYgYWRkcmFkaW8oc2VsZiwgbGFiZWwsIHNob3J0Y3V0PU5vbmUsIGNhbGxiYWNrPU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5hZGRpdGVtKGxhYmVsLCBzaG9ydGN1dCwgY2FsbGJhY2ssICdyYWRpbycpCisKKyAgICBkZWYgYWRkc2VwYXJhdG9yKHNlbGYpOgorICAgICAgICBzZWxmLm1lbnUuQXBwZW5kTWVudSgnKC0nKQorICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZCgoJycsIE5vbmUsIE5vbmUsICdzZXBhcmF0b3InKSkKKworICAgIGRlZiBhZGRzdWJtZW51KHNlbGYsIGxhYmVsLCB0aXRsZT0nJyk6CisgICAgICAgIHN1YiA9IE1lbnUoc2VsZi5iYXIsIHRpdGxlLCAtMSkKKyAgICAgICAgaXRlbSA9IHNlbGYuYWRkaXRlbShsYWJlbCwgJ1x4MUInLCBOb25lLCAnc3VibWVudScpCisgICAgICAgIHNlbGYubWVudS5TZXRJdGVtTWFyayhpdGVtLCBzdWIuaWQpCisgICAgICAgIHN1Yi5fcGFyZW50ID0gc2VsZgorICAgICAgICBzdWIuX3BhcmVudF9pdGVtID0gaXRlbQorICAgICAgICByZXR1cm4gc3ViCisKKyAgICBkZWYgZGlzcGF0Y2goc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgorICAgICAgICB0aXRsZSwgc2hvcnRjdXQsIGNhbGxiYWNrLCBtdHlwZSA9IHNlbGYuaXRlbXNbaXRlbS0xXQorICAgICAgICBpZiBjYWxsYmFjazoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmJhci5wYXJlbnQgb3IgdHlwZShjYWxsYmFjaykgIT0gdHlwZXMuU3RyaW5nVHlwZToKKyAgICAgICAgICAgICAgICBtZW51aGFuZGxlciA9IGNhbGxiYWNrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgY2FsbGJhY2sgaXMgc3RyaW5nCisgICAgICAgICAgICAgICAgd2lkID0gTXlGcm9udFdpbmRvdygpCisgICAgICAgICAgICAgICAgaWYgd2lkIGFuZCB3aWQgaW4gc2VsZi5iYXIucGFyZW50Ll93aW5kb3dzOgorICAgICAgICAgICAgICAgICAgICB3aW5kb3cgPSBzZWxmLmJhci5wYXJlbnQuX3dpbmRvd3Nbd2lkXQorICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHdpbmRvdywgImRvbWVudV8iICsgY2FsbGJhY2spOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVudWhhbmRsZXIgPSBnZXRhdHRyKHdpbmRvdywgImRvbWVudV8iICsgY2FsbGJhY2spCisgICAgICAgICAgICAgICAgICAgIGVsaWYgaGFzYXR0cihzZWxmLmJhci5wYXJlbnQsICJkb21lbnVfIiArIGNhbGxiYWNrKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVoYW5kbGVyID0gZ2V0YXR0cihzZWxmLmJhci5wYXJlbnQsICJkb21lbnVfIiArIGNhbGxiYWNrKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBub3RoaW5nIHdlIGNhbiBkby4gd2Ugc2hvdWxkbid0IGhhdmUgY29tZSB0aGlzIGZhcgorICAgICAgICAgICAgICAgICAgICAgICAgIyBzaW5jZSB0aGUgbWVudSBpdGVtIHNob3VsZCBoYXZlIGJlZW4gZGlzYWJsZWQuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGVsaWYgaGFzYXR0cihzZWxmLmJhci5wYXJlbnQsICJkb21lbnVfIiArIGNhbGxiYWNrKToKKyAgICAgICAgICAgICAgICAgICAgbWVudWhhbmRsZXIgPSBnZXRhdHRyKHNlbGYuYmFyLnBhcmVudCwgImRvbWVudV8iICsgY2FsbGJhY2spCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBub3RoaW5nIHdlIGNhbiBkby4gd2Ugc2hvdWxkbid0IGhhdmUgY29tZSB0aGlzIGZhcgorICAgICAgICAgICAgICAgICAgICAjIHNpbmNlIHRoZSBtZW51IGl0ZW0gc2hvdWxkIGhhdmUgYmVlbiBkaXNhYmxlZC4uLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG1lbnVoYW5kbGVyKGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KQorCisgICAgZGVmIGVuYWJsZShzZWxmLCBvbm9mZik6CisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgc2VsZi5tZW51LkVuYWJsZU1lbnVJdGVtKDApCisgICAgICAgICAgICBpZiBzZWxmLl9wYXJlbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50Lm1lbnUuRW5hYmxlTWVudUl0ZW0oc2VsZi5fcGFyZW50X2l0ZW0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1lbnUuRGlzYWJsZU1lbnVJdGVtKDApCisgICAgICAgICAgICBpZiBzZWxmLl9wYXJlbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcGFyZW50Lm1lbnUuRGlzYWJsZU1lbnVJdGVtKHNlbGYuX3BhcmVudF9pdGVtKQorICAgICAgICBpZiBzZWxmLmJhciBhbmQgc2VsZi5iYXIucGFyZW50OgorICAgICAgICAgICAgc2VsZi5iYXIucGFyZW50Lm5lZWRtZW51YmFycmVkcmF3ID0gMQorCitjbGFzcyBQb3B1cE1lbnUoTWVudSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhcik6CisgICAgICAgIE1lbnUuX19pbml0X18oc2VsZiwgYmFyLCAnKHBvcHVwKScsIC0xKQorCisgICAgZGVmIHBvcHVwKHNlbGYsIHgsIHksIGV2ZW50LCBkZWZhdWx0PTEsIHdpbmRvdz1Ob25lKToKKyAgICAgICAgIyBOT1RFIHRoYXQgeCBhbmQgeSBhcmUgZ2xvYmFsIGNvb3JkaW5hdGVzLCBhbmQgdGhleSBzaG91bGQgcHJvYmFibHkKKyAgICAgICAgIyBiZSB0b3BsZWZ0IG9mIHRoZSBidXR0b24gdGhlIHVzZXIgY2xpY2tlZCAobm90IG1vdXNlLWNvb3JkaW5hdGVzKSwKKyAgICAgICAgIyBzbyB0aGUgcG9wdXAgbmljZWx5IG92ZXJsYXBzLgorICAgICAgICByZXBseSA9IHNlbGYubWVudS5Qb3BVcE1lbnVTZWxlY3QoeCwgeSwgZGVmYXVsdCkKKyAgICAgICAgaWYgbm90IHJlcGx5OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlkID0gKHJlcGx5ID4+IDE2KSAmIDB4ZmZmZgorICAgICAgICBpdGVtID0gcmVwbHkgJiAweGZmZmYKKyAgICAgICAgaWYgbm90IHdpbmRvdzoKKyAgICAgICAgICAgIHdpZCA9IE15RnJvbnRXaW5kb3coKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpbmRvdyA9IHNlbGYuYmFyLnBhcmVudC5fd2luZG93c1t3aWRdCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcyAjIElmIHdlIGNhbid0IGZpbmQgdGhlIHdpbmRvdyB3ZSBwYXNzIE5vbmUKKyAgICAgICAgc2VsZi5kaXNwYXRjaChpZCwgaXRlbSwgd2luZG93LCBldmVudCkKKworY2xhc3MgTWVudUl0ZW06CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lbnUsIHRpdGxlLCBzaG9ydGN1dD1Ob25lLCBjYWxsYmFjaz1Ob25lLCBraW5kPU5vbmUpOgorICAgICAgICBzZWxmLml0ZW0gPSBtZW51LmFkZGl0ZW0odGl0bGUsIHNob3J0Y3V0LCBjYWxsYmFjaykKKyAgICAgICAgc2VsZi5tZW51ID0gbWVudQorCisgICAgZGVmIGRlbGV0ZShzZWxmKToKKyAgICAgICAgc2VsZi5tZW51LmRlbGl0ZW0oc2VsZi5pdGVtKQorICAgICAgICBkZWwgc2VsZi5tZW51CisgICAgICAgIGRlbCBzZWxmLml0ZW0KKworICAgIGRlZiBjaGVjayhzZWxmLCBvbm9mZik6CisgICAgICAgIHNlbGYubWVudS5tZW51LkNoZWNrTWVudUl0ZW0oc2VsZi5pdGVtLCBvbm9mZikKKworICAgIGRlZiBlbmFibGUoc2VsZiwgb25vZmYpOgorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYubWVudS5tZW51LkVuYWJsZU1lbnVJdGVtKHNlbGYuaXRlbSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubWVudS5tZW51LkRpc2FibGVNZW51SXRlbShzZWxmLml0ZW0pCisKKyAgICBkZWYgc2V0dGV4dChzZWxmLCB0ZXh0KToKKyAgICAgICAgc2VsZi5tZW51Lm1lbnUuU2V0TWVudUl0ZW1UZXh0KHNlbGYuaXRlbSwgdGV4dCkKKworICAgIGRlZiBzZXRzdHlsZShzZWxmLCBzdHlsZSk6CisgICAgICAgIHNlbGYubWVudS5tZW51LlNldEl0ZW1TdHlsZShzZWxmLml0ZW0sIHN0eWxlKQorCisgICAgZGVmIHNldGljb24oc2VsZiwgaWNvbik6CisgICAgICAgIHNlbGYubWVudS5tZW51LlNldEl0ZW1JY29uKHNlbGYuaXRlbSwgaWNvbikKKworICAgIGRlZiBzZXRjbWQoc2VsZiwgY21kKToKKyAgICAgICAgc2VsZi5tZW51Lm1lbnUuU2V0SXRlbUNtZChzZWxmLml0ZW0sIGNtZCkKKworICAgIGRlZiBzZXRtYXJrKHNlbGYsIGNtZCk6CisgICAgICAgIHNlbGYubWVudS5tZW51LlNldEl0ZW1NYXJrKHNlbGYuaXRlbSwgY21kKQorCisKK2NsYXNzIFJhZGlvSXRlbShNZW51SXRlbSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lbnUsIHRpdGxlLCBzaG9ydGN1dD1Ob25lLCBjYWxsYmFjaz1Ob25lKToKKyAgICAgICAgTWVudUl0ZW0uX19pbml0X18oc2VsZiwgbWVudSwgdGl0bGUsIHNob3J0Y3V0LCBjYWxsYmFjaywgJ3JhZGlvJykKKworY2xhc3MgQ2hlY2tJdGVtKE1lbnVJdGVtKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWVudSwgdGl0bGUsIHNob3J0Y3V0PU5vbmUsIGNhbGxiYWNrPU5vbmUpOgorICAgICAgICBNZW51SXRlbS5fX2luaXRfXyhzZWxmLCBtZW51LCB0aXRsZSwgc2hvcnRjdXQsIGNhbGxiYWNrLCAnY2hlY2snKQorCitkZWYgU2VwYXJhdG9yKG1lbnUpOgorICAgIG1lbnUuYWRkc2VwYXJhdG9yKCkKKworZGVmIFN1Yk1lbnUobWVudSwgbGFiZWwsIHRpdGxlPScnKToKKyAgICByZXR1cm4gbWVudS5hZGRzdWJtZW51KGxhYmVsLCB0aXRsZSkKKworCitjbGFzcyBBcHBsZU1lbnUoTWVudSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYmFyLCBhYm91dHRleHQ9IkFib3V0IG1lLi4uIiwgYWJvdXRjYWxsYmFjaz1Ob25lKToKKyAgICAgICAgTWVudS5fX2luaXRfXyhzZWxmLCBiYXIsICJcMDI0IiwgaWQ9U0lPVVhfQVBQTEVNRU5VX0lEKQorICAgICAgICBpZiBNYWNPUy5ydW50aW1lbW9kZWwgPT0gJ3BwYyc6CisgICAgICAgICAgICBzZWxmLmFkZGl0ZW0oYWJvdXR0ZXh0LCBOb25lLCBhYm91dGNhbGxiYWNrKQorICAgICAgICAgICAgc2VsZi5hZGRzZXBhcmF0b3IoKQorICAgICAgICAgICAgc2VsZi5tZW51LkFwcGVuZFJlc01lbnUoJ0RSVlInKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBBZGRpdGVtKCkncyB0cmlja3MgZG8gbm90IHdvcmsgZm9yICJhcHBsZSIgbWVudSB1bmRlciBDYXJib24KKyAgICAgICAgICAgIHNlbGYubWVudS5JbnNlcnRNZW51SXRlbShhYm91dHRleHQsIDApCisgICAgICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZCgoYWJvdXR0ZXh0LCBOb25lLCBhYm91dGNhbGxiYWNrLCBOb25lKSkKKworICAgIGRlZiBkaXNwYXRjaChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6CisgICAgICAgIGlmIGl0ZW0gPT0gMToKKyAgICAgICAgICAgIE1lbnUuZGlzcGF0Y2goc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpCisgICAgICAgIGVsaWYgTWFjT1MucnVudGltZW1vZGVsID09ICdwcGMnOgorICAgICAgICAgICAgbmFtZSA9IHNlbGYubWVudS5HZXRNZW51SXRlbVRleHQoaXRlbSkKKyAgICAgICAgICAgIE9wZW5EZXNrQWNjKG5hbWUpCisKK2NsYXNzIEhlbHBNZW51KE1lbnUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBiYXIpOgorICAgICAgICAjIE5vdGUgd2UgZG9uJ3QgY2FsbCBNZW51Ll9faW5pdF9fLCB3ZSBkbyB0aGUgbmVjZXNzYXJ5IHRoaW5ncyBieSBoYW5kCisgICAgICAgIHNlbGYuYmFyID0gYmFyCisgICAgICAgIHNlbGYubWVudSwgaW5kZXggPSBITUdldEhlbHBNZW51KCkKKyAgICAgICAgc2VsZi5pZCA9IHNlbGYubWVudS5HZXRNZW51SUQoKQorICAgICAgICBiYXIubWVudXNbc2VsZi5pZF0gPSBzZWxmCisgICAgICAgICMgVGhlIG5leHQgbGluZSBjYXRlcnMgZm9yIHRoZSBlbnRyaWVzIHRoZSBzeXN0ZW0gYWxyZWFkeSBoYW5kbGVzIGZvciB1cworICAgICAgICBzZWxmLml0ZW1zID0gW05vbmVdKihpbmRleC0xKQorICAgICAgICBzZWxmLl9wYXJlbnQgPSBOb25lCisKKworY2xhc3MgV2luZG93OgorICAgICIiIkEgc2luZ2xlIHdpbmRvdyBiZWxvbmdpbmcgdG8gYW4gYXBwbGljYXRpb24iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQpOgorICAgICAgICBzZWxmLndpZCA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKworICAgIGRlZiBvcGVuKHNlbGYsIGJvdW5kcz0oNDAsIDQwLCA0MDAsIDQwMCksIHJlc2lkPU5vbmUpOgorICAgICAgICBpZiByZXNpZCAhPSBOb25lOgorICAgICAgICAgICAgc2VsZi53aWQgPSBHZXROZXdXaW5kb3cocmVzaWQsIC0xKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53aWQgPSBOZXdXaW5kb3coYm91bmRzLCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgMSwKKyAgICAgICAgICAgICAgICA4LCAtMSwgMSwgMCkgICAgIyBjaGFuZ2VkIHRvIHByb2MgaWQgOCB0byBpbmNsdWRlIHpvb20gYm94LiBqdnIKKyAgICAgICAgc2VsZi5kb19wb3N0b3BlbigpCisKKyAgICBkZWYgZG9fcG9zdG9wZW4oc2VsZik6CisgICAgICAgICIiIlRlbGwgb3VyIHBhcmVudCB3ZSBleGlzdCIiIgorICAgICAgICBzZWxmLnBhcmVudC5hcHBlbmR3aW5kb3coc2VsZi53aWQsIHNlbGYpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZG9fcG9zdGNsb3NlKCkKKworICAgIGRlZiBkb19wb3N0Y2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYucGFyZW50LnJlbW92ZXdpbmRvdyhzZWxmLndpZCkKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCisgICAgICAgIHNlbGYud2lkID0gTm9uZQorCisgICAgZGVmIFNldFBvcnQoc2VsZik6CisgICAgICAgICMgQ29udmluaWVuY2UgbWV0aG9kCisgICAgICAgIFNldFBvcnQoc2VsZi53aWQpCisKKyAgICBkZWYgR2V0V2luZG93KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi53aWQKKworICAgIGRlZiBkb19pbkRyYWcoc2VsZiwgcGFydGNvZGUsIHdpbmRvdywgZXZlbnQpOgorICAgICAgICB3aGVyZSA9IGV2ZW50WzNdCisgICAgICAgIHdpbmRvdy5EcmFnV2luZG93KHdoZXJlLCBzZWxmLmRyYWdsaW1pdCkKKworICAgIGRyYWdsaW1pdCA9IHNjcmVlbmJvdW5kcworCisgICAgZGVmIGRvX2luR29Bd2F5KHNlbGYsIHBhcnRjb2RlLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgd2hlcmUgPSBldmVudFszXQorICAgICAgICBpZiB3aW5kb3cuVHJhY2tHb0F3YXkod2hlcmUpOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgZG9faW5ab29tKHNlbGYsIHBhcnRjb2RlLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgaWYgd2luZG93LlRyYWNrQm94KHdoZXJlLCBwYXJ0Y29kZSk6CisgICAgICAgICAgICB3aW5kb3cuWm9vbVdpbmRvdyhwYXJ0Y29kZSwgMSkKKyAgICAgICAgICAgIHJlY3QgPSB3aW5kb3cuR2V0V2luZG93VXNlclN0YXRlKCkgICAgICAgICAgICAgICAgICAjIHNvIHRoYXQgem9vbSByZWFsbHkgd29ya3MuLi4ganZyCisgICAgICAgICAgICBzZWxmLmRvX3Bvc3RyZXNpemUocmVjdFsyXSAtIHJlY3RbMF0sIHJlY3RbM10gLSByZWN0WzFdLCB3aW5kb3cpICAgICMganZyCisKKyAgICBkZWYgZG9faW5ab29tSW4oc2VsZiwgcGFydGNvZGUsIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBTZXRQb3J0KHdpbmRvdykgIyAhISEKKyAgICAgICAgc2VsZi5kb19pblpvb20ocGFydGNvZGUsIHdpbmRvdywgZXZlbnQpCisKKyAgICBkZWYgZG9faW5ab29tT3V0KHNlbGYsIHBhcnRjb2RlLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgU2V0UG9ydCh3aW5kb3cpICMgISEhCisgICAgICAgIHNlbGYuZG9faW5ab29tKHBhcnRjb2RlLCB3aW5kb3csIGV2ZW50KQorCisgICAgZGVmIGRvX2luR3JvdyhzZWxmLCBwYXJ0Y29kZSwgd2luZG93LCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIHJlc3VsdCA9IHdpbmRvdy5Hcm93V2luZG93KHdoZXJlLCBzZWxmLmdyb3dsaW1pdCkKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgaGVpZ2h0ID0gKHJlc3VsdD4+MTYpICYgMHhmZmZmICAjIEhpIHdvcmQKKyAgICAgICAgICAgIHdpZHRoID0gcmVzdWx0ICYgMHhmZmZmICAgICAjIExvIHdvcmQKKyAgICAgICAgICAgIHNlbGYuZG9fcmVzaXplKHdpZHRoLCBoZWlnaHQsIHdpbmRvdykKKworICAgIGdyb3dsaW1pdCA9ICg1MCwgNTAsIHNjcmVlbmJvdW5kc1syXSAtIHNjcmVlbmJvdW5kc1swXSwgc2NyZWVuYm91bmRzWzNdIC0gc2NyZWVuYm91bmRzWzFdKSAgICAgICMganZyCisKKyAgICBkZWYgZG9fcmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6CisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJvdW5kcygpICAgICAgICAgICAjIGp2ciwgZm9yR3Jvd0ljb24KKyAgICAgICAgc2VsZi5TZXRQb3J0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICMganZyCisgICAgICAgIHNlbGYud2lkLkludmFsV2luZG93UmVjdCgociAtIFNDUk9MTEJBUldJRFRIICsgMSwgYiAtIFNDUk9MTEJBUldJRFRIICsgMSwgciwgYikpICAgICMganZyCisgICAgICAgIHdpbmRvdy5TaXplV2luZG93KHdpZHRoLCBoZWlnaHQsIDEpICAgICAgICAgIyBjaGFuZ2VkIHVwZGF0ZUZsYWcgdG8gdHJ1ZSBqdnIKKyAgICAgICAgc2VsZi5kb19wb3N0cmVzaXplKHdpZHRoLCBoZWlnaHQsIHdpbmRvdykKKworICAgIGRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6CisgICAgICAgIFNldFBvcnQod2luZG93KQorICAgICAgICBzZWxmLndpZC5JbnZhbFdpbmRvd1JlY3Qod2luZG93LkdldFdpbmRvd1BvcnQoKS5HZXRQb3J0Qm91bmRzKCkpCisKKyAgICBkZWYgZG9faW5Db250ZW50KHNlbGYsIHBhcnRjb2RlLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgIworICAgICAgICAjIElmIHdlJ3JlIG5vdCBmcm9udG1vc3QsIHNlbGVjdCBvdXJzZWx2ZXMgYW5kIHdhaXQgZm9yCisgICAgICAgICMgdGhlIGFjdGl2YXRlIGV2ZW50LgorICAgICAgICAjCisgICAgICAgIGlmIE15RnJvbnRXaW5kb3coKSAhPSB3aW5kb3c6CisgICAgICAgICAgICB3aW5kb3cuU2VsZWN0V2luZG93KCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIFdlIGFyZS4gSGFuZGxlIHRoZSBldmVudC4KKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgU2V0UG9ydCh3aW5kb3cpCisgICAgICAgIGxvY2FsID0gR2xvYmFsVG9Mb2NhbCh3aGVyZSkKKyAgICAgICAgc2VsZi5kb19jb250ZW50Y2xpY2sobG9jYWwsIG1vZGlmaWVycywgZXZlbnQpCisKKyAgICBkZWYgZG9fY29udGVudGNsaWNrKHNlbGYsIGxvY2FsLCBtb2RpZmllcnMsIGV2ZW50KToKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBwcmludCAnQ2xpY2sgaW4gY29udGVudHMgYXQgJXMsIG1vZGlmaWVycyAlcyclKGxvY2FsLCBtb2RpZmllcnMpCisKKyAgICBkZWYgZG9fcmF3dXBkYXRlKHNlbGYsIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBpZiBERUJVRzogcHJpbnQgInJhdyB1cGRhdGUgZm9yIiwgd2luZG93CisgICAgICAgIFNldFBvcnQod2luZG93KQorICAgICAgICB3aW5kb3cuQmVnaW5VcGRhdGUoKQorICAgICAgICBzZWxmLmRvX3VwZGF0ZSh3aW5kb3csIGV2ZW50KQorICAgICAgICB3aW5kb3cuRW5kVXBkYXRlKCkKKworICAgIGRlZiBkb191cGRhdGUoc2VsZiwgd2luZG93LCBldmVudCk6CisgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDgpOgorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICAgICAgICAgIEludmVydFJnbih3aW5kb3cuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKKyAgICAgICAgICAgIEZpbGxSZ24od2luZG93LkdldFdpbmRvd1BvcnQoKS52aXNSZ24sIEdldFFER2xvYmFsc0dyYXkoKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVyYXNlUmduKHdpbmRvdy5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQorCisgICAgZGVmIGRvX2FjdGl2YXRlKHNlbGYsIGFjdGl2YXRlLCBldmVudCk6CisgICAgICAgIGlmIERFQlVHOiBwcmludCAnQWN0aXZhdGUgJWQgZm9yICVzJyUoYWN0aXZhdGUsIHNlbGYud2lkKQorCitjbGFzcyBDb250cm9sc1dpbmRvdyhXaW5kb3cpOgorCisgICAgZGVmIGRvX3Jhd3VwZGF0ZShzZWxmLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgaWYgREVCVUc6IHByaW50ICJyYXcgdXBkYXRlIGZvciIsIHdpbmRvdworICAgICAgICBTZXRQb3J0KHdpbmRvdykKKyAgICAgICAgd2luZG93LkJlZ2luVXBkYXRlKCkKKyAgICAgICAgc2VsZi5kb191cGRhdGUod2luZG93LCBldmVudCkKKyAgICAgICAgI0RyYXdDb250cm9scyh3aW5kb3cpICAgICAgICAgICAgICAgICAgICMganZyCisgICAgICAgIFVwZGF0ZUNvbnRyb2xzKHdpbmRvdywgd2luZG93LkdldFdpbmRvd1BvcnQoKS52aXNSZ24pICAgIyBqdnIKKyAgICAgICAgd2luZG93LkRyYXdHcm93SWNvbigpCisgICAgICAgIHdpbmRvdy5FbmRVcGRhdGUoKQorCisgICAgZGVmIGRvX2NvbnRyb2xoaXQoc2VsZiwgd2luZG93LCBjb250cm9sLCBwY29kZSwgZXZlbnQpOgorICAgICAgICBpZiBERUJVRzogcHJpbnQgImNvbnRyb2wgaGl0IGluIiwgd2luZG93LCAib24iLCBjb250cm9sLCAiOyBwY29kZSA9IiwgcGNvZGUKKworICAgIGRlZiBkb19pbkNvbnRlbnQoc2VsZiwgcGFydGNvZGUsIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBpZiBNeUZyb250V2luZG93KCkgIT0gd2luZG93OgorICAgICAgICAgICAgd2luZG93LlNlbGVjdFdpbmRvdygpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgU2V0UG9ydCh3aW5kb3cpICAjIFhYWFggTmVlZGVkPworICAgICAgICBsb2NhbCA9IEdsb2JhbFRvTG9jYWwod2hlcmUpCisgICAgICAgIHBjb2RlLCBjb250cm9sID0gRmluZENvbnRyb2wobG9jYWwsIHdpbmRvdykKKyAgICAgICAgaWYgcGNvZGUgYW5kIGNvbnRyb2w6CisgICAgICAgICAgICBzZWxmLmRvX3Jhd2NvbnRyb2xoaXQod2luZG93LCBjb250cm9sLCBwY29kZSwgbG9jYWwsIGV2ZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgREVCVUc6IHByaW50ICJGaW5kQ29udHJvbCglcywgJXMpIC0+ICglcywgJXMpIiAlIFwKKyAgICAgICAgICAgICAgICAobG9jYWwsIHdpbmRvdywgcGNvZGUsIGNvbnRyb2wpCisgICAgICAgICAgICBzZWxmLmRvX2NvbnRlbnRjbGljayhsb2NhbCwgbW9kaWZpZXJzLCBldmVudCkKKworICAgIGRlZiBkb19yYXdjb250cm9saGl0KHNlbGYsIHdpbmRvdywgY29udHJvbCwgcGNvZGUsIGxvY2FsLCBldmVudCk6CisgICAgICAgIHBjb2RlID0gY29udHJvbC5UcmFja0NvbnRyb2wobG9jYWwpCisgICAgICAgIGlmIHBjb2RlOgorICAgICAgICAgICAgc2VsZi5kb19jb250cm9saGl0KHdpbmRvdywgY29udHJvbCwgcGNvZGUsIGV2ZW50KQorCitjbGFzcyBTY3JvbGxlZFdpbmRvdyhDb250cm9sc1dpbmRvdyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCk6CisgICAgICAgIHNlbGYuYmFyeCA9IHNlbGYuYmFyeSA9IE5vbmUKKyAgICAgICAgc2VsZi5iYXJ4X2VuYWJsZWQgPSBzZWxmLmJhcnlfZW5hYmxlZCA9IDEKKyAgICAgICAgc2VsZi5hY3RpdmF0ZWQgPSAxCisgICAgICAgIENvbnRyb2xzV2luZG93Ll9faW5pdF9fKHNlbGYsIHBhcmVudCkKKworICAgIGRlZiBzY3JvbGxiYXJzKHNlbGYsIHdhbnR4PTEsIHdhbnR5PTEpOgorICAgICAgICBTZXRQb3J0KHNlbGYud2lkKQorICAgICAgICBzZWxmLmJhcnggPSBzZWxmLmJhcnkgPSBOb25lCisgICAgICAgIHNlbGYuYmFyeF9lbmFibGVkID0gc2VsZi5iYXJ5X2VuYWJsZWQgPSAxCisgICAgICAgIHgwLCB5MCwgeDEsIHkxID0gc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCb3VuZHMoKQorICAgICAgICB2eCwgdnkgPSBzZWxmLmdldHNjcm9sbGJhcnZhbHVlcygpCisgICAgICAgIGlmIHZ4IGlzIE5vbmU6IHNlbGYuYmFyeF9lbmFibGVkLCB2eCA9IDAsIDAKKyAgICAgICAgaWYgdnkgaXMgTm9uZTogc2VsZi5iYXJ5X2VuYWJsZWQsIHZ5ID0gMCwgMAorICAgICAgICBpZiB3YW50eDoKKyAgICAgICAgICAgIHJlY3QgPSB4MC0xLCB5MS0oU0NST0xMQkFSV0lEVEgtMSksIHgxLShTQ1JPTExCQVJXSURUSC0yKSwgeTErMQorICAgICAgICAgICAgc2VsZi5iYXJ4ID0gTmV3Q29udHJvbChzZWxmLndpZCwgcmVjdCwgIiIsIDEsIHZ4LCAwLCAzMjc2NywgMTYsIDApCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5iYXJ4X2VuYWJsZWQ6IHNlbGYuYmFyeC5IaWxpdGVDb250cm9sKDI1NSkKKyMjICAgICAgICAgICAgICBzZWxmLndpZC5JbnZhbFdpbmRvd1JlY3QocmVjdCkKKyAgICAgICAgaWYgd2FudHk6CisgICAgICAgICAgICByZWN0ID0geDEtKFNDUk9MTEJBUldJRFRILTEpLCB5MC0xLCB4MSsxLCB5MS0oU0NST0xMQkFSV0lEVEgtMikKKyAgICAgICAgICAgIHNlbGYuYmFyeSA9IE5ld0NvbnRyb2woc2VsZi53aWQsIHJlY3QsICIiLCAxLCB2eSwgMCwgMzI3NjcsIDE2LCAwKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuYmFyeV9lbmFibGVkOiBzZWxmLmJhcnkuSGlsaXRlQ29udHJvbCgyNTUpCisjIyAgICAgICAgICAgICAgc2VsZi53aWQuSW52YWxXaW5kb3dSZWN0KHJlY3QpCisKKyAgICBkZWYgZG9fcG9zdGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmJhcnggPSBzZWxmLmJhcnkgPSBOb25lCisgICAgICAgIENvbnRyb2xzV2luZG93LmRvX3Bvc3RjbG9zZShzZWxmKQorCisgICAgZGVmIGRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldmVudCk6CisgICAgICAgIHNlbGYuYWN0aXZhdGVkID0gb25vZmYKKyAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICBpZiBzZWxmLmJhcnggYW5kIHNlbGYuYmFyeF9lbmFibGVkOgorICAgICAgICAgICAgICAgIHNlbGYuYmFyeC5TaG93Q29udHJvbCgpICMganZyCisgICAgICAgICAgICBpZiBzZWxmLmJhcnkgYW5kIHNlbGYuYmFyeV9lbmFibGVkOgorICAgICAgICAgICAgICAgIHNlbGYuYmFyeS5TaG93Q29udHJvbCgpICMganZyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLmJhcng6CisgICAgICAgICAgICAgICAgc2VsZi5iYXJ4LkhpZGVDb250cm9sKCkgIyBqdnI7IEFuIGluYWN0aXZlIHdpbmRvdyBzaG91bGQgaGF2ZSAqaGlkZGVuKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2Nyb2xsYmFycywgbm90IGp1c3QgZGltbWVkIChubyBtYXR0ZXIgd2hhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQkJFZGl0IGRvZXMuLi4gbG9vayBhdCB0aGUgRmluZGVyKQorICAgICAgICAgICAgaWYgc2VsZi5iYXJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYmFyeS5IaWRlQ29udHJvbCgpICMganZyCisgICAgICAgIHNlbGYud2lkLkRyYXdHcm93SWNvbigpICAgICAgICAgIyBqdnIKKworICAgIGRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6CisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJvdW5kcygpCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIGlmIHNlbGYuYmFyeDoKKyAgICAgICAgICAgIHNlbGYuYmFyeC5IaWRlQ29udHJvbCgpICAgICAjIGp2cgorICAgICAgICAgICAgc2VsZi5iYXJ4Lk1vdmVDb250cm9sKGwtMSwgYi0oU0NST0xMQkFSV0lEVEgtMSkpCisgICAgICAgICAgICBzZWxmLmJhcnguU2l6ZUNvbnRyb2woKHItbCktKFNDUk9MTEJBUldJRFRILTMpLCBTQ1JPTExCQVJXSURUSCkgIyBqdnIKKyAgICAgICAgaWYgc2VsZi5iYXJ5OgorICAgICAgICAgICAgc2VsZi5iYXJ5LkhpZGVDb250cm9sKCkgICAgICMganZyCisgICAgICAgICAgICBzZWxmLmJhcnkuTW92ZUNvbnRyb2woci0oU0NST0xMQkFSV0lEVEgtMSksIHQtMSkKKyAgICAgICAgICAgIHNlbGYuYmFyeS5TaXplQ29udHJvbChTQ1JPTExCQVJXSURUSCwgKGItdCktKFNDUk9MTEJBUldJRFRILTMpKSAjIGp2cgorICAgICAgICBpZiBzZWxmLmJhcng6CisgICAgICAgICAgICBzZWxmLmJhcnguU2hvd0NvbnRyb2woKSAgICAgIyBqdnIKKyAgICAgICAgICAgIHNlbGYud2lkLlZhbGlkV2luZG93UmVjdCgobCwgYiAtIFNDUk9MTEJBUldJRFRIICsgMSwgciAtIFNDUk9MTEJBUldJRFRIICsgMiwgYikpICAgICMganZyCisgICAgICAgIGlmIHNlbGYuYmFyeToKKyAgICAgICAgICAgIHNlbGYuYmFyeS5TaG93Q29udHJvbCgpICAgICAjIGp2cgorICAgICAgICAgICAgc2VsZi53aWQuVmFsaWRXaW5kb3dSZWN0KChyIC0gU0NST0xMQkFSV0lEVEggKyAxLCB0LCByLCBiIC0gU0NST0xMQkFSV0lEVEggKyAyKSkgICAgIyBqdnIKKyAgICAgICAgc2VsZi53aWQuSW52YWxXaW5kb3dSZWN0KChyIC0gU0NST0xMQkFSV0lEVEggKyAxLCBiIC0gU0NST0xMQkFSV0lEVEggKyAxLCByLCBiKSkgICAgIyBqdnIsIGdyb3dpY29uCisKKworICAgIGRlZiBkb19yYXdjb250cm9saGl0KHNlbGYsIHdpbmRvdywgY29udHJvbCwgcGNvZGUsIGxvY2FsLCBldmVudCk6CisgICAgICAgIGlmIGNvbnRyb2wgPT0gc2VsZi5iYXJ4OgorICAgICAgICAgICAgd2hpY2ggPSAneCcKKyAgICAgICAgZWxpZiBjb250cm9sID09IHNlbGYuYmFyeToKKyAgICAgICAgICAgIHdoaWNoID0gJ3knCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBpZiBwY29kZSBpbiAoaW5VcEJ1dHRvbiwgaW5Eb3duQnV0dG9uLCBpblBhZ2VVcCwgaW5QYWdlRG93bik6CisgICAgICAgICAgICAjIFdlIGRvIHRoZSB3b3JrIGZvciB0aGUgYnV0dG9ucyBhbmQgZ3JleSBhcmVhIGluIHRoZSB0cmFja2VyCisgICAgICAgICAgICBkdW1teSA9IGNvbnRyb2wuVHJhY2tDb250cm9sKGxvY2FsLCBzZWxmLmRvX2NvbnRyb2x0cmFjaykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgYnV0IHRoZSB0aHVtYiBpcyBoYW5kbGVkIGhlcmUKKyAgICAgICAgICAgIHBjb2RlID0gY29udHJvbC5UcmFja0NvbnRyb2wobG9jYWwpCisgICAgICAgICAgICBpZiBwY29kZSA9PSBpblRodW1iOgorICAgICAgICAgICAgICAgIHZhbHVlID0gY29udHJvbC5HZXRDb250cm9sVmFsdWUoKQorICAgICAgICAgICAgICAgIHByaW50ICdzZXRiYXJzJywgd2hpY2gsIHZhbHVlICNEQkcKKyAgICAgICAgICAgICAgICBzZWxmLnNjcm9sbGJhcl9jYWxsYmFjayh3aGljaCwgJ3NldCcsIHZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICdmdW5ueSBwYXJ0JywgcGNvZGUgI0RCRworICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIGRvX2NvbnRyb2x0cmFjayhzZWxmLCBjb250cm9sLCBwY29kZSk6CisgICAgICAgIGlmIGNvbnRyb2wgPT0gc2VsZi5iYXJ4OgorICAgICAgICAgICAgd2hpY2ggPSAneCcKKyAgICAgICAgZWxpZiBjb250cm9sID09IHNlbGYuYmFyeToKKyAgICAgICAgICAgIHdoaWNoID0gJ3knCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBwY29kZSA9PSBpblVwQnV0dG9uOgorICAgICAgICAgICAgd2hhdCA9ICctJworICAgICAgICBlbGlmIHBjb2RlID09IGluRG93bkJ1dHRvbjoKKyAgICAgICAgICAgIHdoYXQgPSAnKycKKyAgICAgICAgZWxpZiBwY29kZSA9PSBpblBhZ2VVcDoKKyAgICAgICAgICAgIHdoYXQgPSAnLS0nCisgICAgICAgIGVsaWYgcGNvZGUgPT0gaW5QYWdlRG93bjoKKyAgICAgICAgICAgIHdoYXQgPSAnKysnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5zY3JvbGxiYXJfY2FsbGJhY2sod2hpY2gsIHdoYXQsIE5vbmUpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICBkZWYgdXBkYXRlc2Nyb2xsYmFycyhzZWxmKToKKyAgICAgICAgU2V0UG9ydChzZWxmLndpZCkKKyAgICAgICAgdngsIHZ5ID0gc2VsZi5nZXRzY3JvbGxiYXJ2YWx1ZXMoKQorICAgICAgICBpZiBzZWxmLmJhcng6CisgICAgICAgICAgICBpZiB2eCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuYmFyeC5IaWxpdGVDb250cm9sKDI1NSkKKyAgICAgICAgICAgICAgICBzZWxmLmJhcnhfZW5hYmxlZCA9IDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuYmFyeF9lbmFibGVkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmJhcnhfZW5hYmxlZCA9IDEKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5hY3RpdmF0ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJhcnguSGlsaXRlQ29udHJvbCgwKQorICAgICAgICAgICAgICAgIHNlbGYuYmFyeC5TZXRDb250cm9sVmFsdWUodngpCisgICAgICAgIGlmIHNlbGYuYmFyeToKKyAgICAgICAgICAgIGlmIHZ5IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5iYXJ5LkhpbGl0ZUNvbnRyb2woMjU1KQorICAgICAgICAgICAgICAgIHNlbGYuYmFyeV9lbmFibGVkID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5iYXJ5X2VuYWJsZWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFyeV9lbmFibGVkID0gMQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmFjdGl2YXRlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFyeS5IaWxpdGVDb250cm9sKDApCisgICAgICAgICAgICAgICAgc2VsZi5iYXJ5LlNldENvbnRyb2xWYWx1ZSh2eSkKKworICAgICMgQXV4aWxpYXJ5IGZ1bmN0aW9uOiBjb252ZXJ0IHN0YW5kYXJkIHRleHQvaW1hZ2UvZXRjIGNvb3JkaW5hdGUKKyAgICAjIHRvIHNvbWV0aGluZyBwYWxhdGFibGUgYXMgZ2V0c2Nyb2xsYmFydmFsdWVzKCkgcmV0dXJuCisgICAgZGVmIHNjYWxlYmFydmFsdWUoc2VsZiwgYWJzbWluLCBhYnNtYXgsIGN1cm1pbiwgY3VybWF4KToKKyAgICAgICAgaWYgY3VybWluIDw9IGFic21pbiBhbmQgY3VybWF4ID49IGFic21heDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIGN1cm1pbiA8PSBhYnNtaW46CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBpZiBjdXJtYXggPj0gYWJzbWF4OgorICAgICAgICAgICAgcmV0dXJuIDMyNzY3CisgICAgICAgIHBlcmMgPSBmbG9hdChjdXJtaW4tYWJzbWluKS9mbG9hdChhYnNtYXgtYWJzbWluKQorICAgICAgICByZXR1cm4gaW50KHBlcmMqMzI3NjcpCisKKyAgICAjIFRvIGJlIG92ZXJyaWRkZW46CisKKyAgICBkZWYgZ2V0c2Nyb2xsYmFydmFsdWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gMCwgMAorCisgICAgZGVmIHNjcm9sbGJhcl9jYWxsYmFjayhzZWxmLCB3aGljaCwgd2hhdCwgdmFsdWUpOgorICAgICAgICBwcmludCAnc2Nyb2xsJywgd2hpY2gsIHdoYXQsIHZhbHVlCisKK2NsYXNzIERpYWxvZ1dpbmRvdyhXaW5kb3cpOgorICAgICIiIkEgbW9kZWxlc3MgZGlhbG9nIHdpbmRvdyIiIgorCisgICAgZGVmIG9wZW4oc2VsZiwgcmVzaWQpOgorICAgICAgICBzZWxmLmRsZyA9IEdldE5ld0RpYWxvZyhyZXNpZCwgLTEpCisgICAgICAgIHNlbGYud2lkID0gc2VsZi5kbGcuR2V0RGlhbG9nV2luZG93KCkKKyAgICAgICAgc2VsZi5kb19wb3N0b3BlbigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZG9fcG9zdGNsb3NlKCkKKworICAgIGRlZiBkb19wb3N0Y2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZGxnID0gTm9uZQorICAgICAgICBXaW5kb3cuZG9fcG9zdGNsb3NlKHNlbGYpCisKKyAgICBkZWYgZG9faXRlbWhpdChzZWxmLCBpdGVtLCBldmVudCk6CisgICAgICAgIHByaW50ICdEaWFsb2cgJXMsIGl0ZW0gJWQgaGl0JyUoc2VsZi5kbGcsIGl0ZW0pCisKKyAgICBkZWYgZG9fcmF3dXBkYXRlKHNlbGYsIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBwYXNzCisKK2RlZiBvc3R5cGVjb2RlKHgpOgorICAgICJDb252ZXJ0IGEgbG9uZyBpbnQgdG8gdGhlIDQtY2hhcmFjdGVyIGNvZGUgaXQgcmVhbGx5IGlzIgorICAgIHMgPSAnJworICAgIGZvciBpIGluIHJhbmdlKDQpOgorICAgICAgICB4LCBjID0gZGl2bW9kKHgsIDI1NikKKyAgICAgICAgcyA9IGNocihjKSArIHMKKyAgICByZXR1cm4gcworCisKK2NsYXNzIFRlc3RBcHAoQXBwbGljYXRpb24pOgorCisgICAgIlRoaXMgY2xhc3MgaXMgdXNlZCBieSB0aGUgdGVzdCgpIGZ1bmN0aW9uIgorCisgICAgZGVmIG1ha2V1c2VybWVudXMoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKKyAgICAgICAgc2VsZi5zYXZlaXRlbSA9IE1lbnVJdGVtKG0sICJTYXZlIiwgIlMiLCBzZWxmLnNhdmUpCisgICAgICAgIFNlcGFyYXRvcihtKQorICAgICAgICBzZWxmLm9wdGlvbnNtZW51ID0gbW0gPSBTdWJNZW51KG0sICJPcHRpb25zIikKKyAgICAgICAgc2VsZi5vcHQxID0gQ2hlY2tJdGVtKG1tLCAiQXJndW1lbnRzIiwgIkEiKQorICAgICAgICBzZWxmLm9wdDIgPSBDaGVja0l0ZW0obW0sICJCZWluZyBoaXQgb24gdGhlIGhlYWQgbGVzc29ucyIsIChrTWVudU9wdGlvbk1vZGlmaWVyLCAiQSIpKQorICAgICAgICBzZWxmLm9wdDMgPSBDaGVja0l0ZW0obW0sICJDb21wbGFpbnRzIiwgKGtNZW51T3B0aW9uTW9kaWZpZXJ8a01lbnVOb0NvbW1hbmRNb2RpZmllciwgIkEiKSkKKyAgICAgICAgU2VwYXJhdG9yKG0pCisgICAgICAgIHNlbGYuaXRlbWVoID0gTWVudUl0ZW0obSwgIkVuYWJsZSBIZWxwIiwgTm9uZSwgc2VsZi5lbmFibGVoZWxwKQorICAgICAgICBzZWxmLml0ZW1kYmcgPSBNZW51SXRlbShtLCAiRGVidWciLCBOb25lLCBzZWxmLmRlYnVnKQorICAgICAgICBTZXBhcmF0b3IobSkKKyAgICAgICAgc2VsZi5xdWl0aXRlbSA9IE1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCisKKyAgICBkZWYgc2F2ZShzZWxmLCAqYXJncyk6CisgICAgICAgIHByaW50ICJTYXZlIgorCisgICAgZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBzZWxmCisKKyAgICBkZWYgZW5hYmxlaGVscChzZWxmLCAqYXJncyk6CisgICAgICAgIGhtID0gc2VsZi5nZXRoZWxwbWVudSgpCisgICAgICAgIHNlbGYubm9oZWxwaXRlbSA9IE1lbnVJdGVtKGhtLCAiVGhlcmUgaXNuJ3QgYW55IiwgTm9uZSwgc2VsZi5ub2hlbHApCisKKyAgICBkZWYgbm9oZWxwKHNlbGYsICphcmdzKToKKyAgICAgICAgcHJpbnQgIkkgdG9sZCB5b3UgdGhlcmUgaXNuJ3QgYW55ISIKKworICAgIGRlZiBkZWJ1ZyhzZWxmLCAqYXJncyk6CisgICAgICAgIGltcG9ydCBwZGIKKyAgICAgICAgcGRiLnNldF90cmFjZSgpCisKKworZGVmIHRlc3QoKToKKyAgICAiVGVzdCBwcm9ncmFtIgorICAgIGFwcCA9IFRlc3RBcHAoKQorICAgIGFwcC5tYWlubG9vcCgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvRnJhbWVXb3JrLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvRnJhbWVXb3JrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI1ZDMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9GcmFtZVdvcmsucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvRnJhbWVXb3JrLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvRnJhbWVXb3JrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI1ZDMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9GcmFtZVdvcmsucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvTWluaUFFRnJhbWUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL01pbmlBRUZyYW1lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MTI2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL01pbmlBRUZyYW1lLnB5CkBAIC0wLDAgKzEsMjAwIEBACisiIiJNaW5pQUVGcmFtZSAtIEEgbWluaW1hbCBBcHBsZUV2ZW50IEFwcGxpY2F0aW9uIGZyYW1ld29yay4KKworVGhlcmUgYXJlIHR3byBjbGFzc2VzOgorICAgIEFFU2VydmVyIC0tIGEgbWl4aW4gY2xhc3Mgb2ZmZXJpbmcgbmljZSBBRSBoYW5kbGluZy4KKyAgICBNaW5pQXBwbGljYXRpb24gLS0gYSB2ZXJ5IG1pbmltYWwgYWx0ZXJuYXRpdmUgdG8gRnJhbWVXb3JrLnB5LAorICAgICAgICBvbmx5IHN1aXRhYmxlIGZvciB0aGUgc2ltcGxlc3Qgb2YgQXBwbGVFdmVudCBzZXJ2ZXJzLgorIiIiCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgTWluaUFFRnJhbWUgbW9kdWxlIGlzIHJlbW92ZWQuIiwgc3RhY2tsZXZlbD0yKQorCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgTWFjT1MKK2Zyb20gQ2FyYm9uIGltcG9ydCBBRQorZnJvbSBDYXJib24uQXBwbGVFdmVudHMgaW1wb3J0ICoKK2Zyb20gQ2FyYm9uIGltcG9ydCBFdnQKK2Zyb20gQ2FyYm9uLkV2ZW50cyBpbXBvcnQgKgorZnJvbSBDYXJib24gaW1wb3J0IE1lbnUKK2Zyb20gQ2FyYm9uIGltcG9ydCBXaW4KK2Zyb20gQ2FyYm9uLldpbmRvd3MgaW1wb3J0ICoKK2Zyb20gQ2FyYm9uIGltcG9ydCBRZAorCitpbXBvcnQgYWV0b29scworaW1wb3J0IEVhc3lEaWFsb2dzCisKK2tIaWdoTGV2ZWxFdmVudCA9IDIzICAgICAgICAgICAgICAgICMgTm90IGRlZmluZWQgYW55d2hlcmUgZm9yIFB5dGhvbiB5ZXQ/CisKKworY2xhc3MgTWluaUFwcGxpY2F0aW9uOgorCisgICAgIiIiQSBtaW5pbWFsIEZyYW1lV29yay5BcHBsaWNhdGlvbi1saWtlIGNsYXNzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYucXVpdHRpbmcgPSAwCisgICAgICAgICMgSW5pdGlhbGl6ZSBtZW51CisgICAgICAgIHNlbGYuYXBwbGVpZCA9IDEKKyAgICAgICAgc2VsZi5xdWl0aWQgPSAyCisgICAgICAgIE1lbnUuQ2xlYXJNZW51QmFyKCkKKyAgICAgICAgc2VsZi5hcHBsZW1lbnUgPSBhcHBsZW1lbnUgPSBNZW51Lk5ld01lbnUoc2VsZi5hcHBsZWlkLCAiXDAyNCIpCisgICAgICAgIGFwcGxlbWVudS5BcHBlbmRNZW51KCIlczsoLSIgJSBzZWxmLmdldGFib3V0bWVudXRleHQoKSkKKyAgICAgICAgaWYgTWFjT1MucnVudGltZW1vZGVsID09ICdwcGMnOgorICAgICAgICAgICAgYXBwbGVtZW51LkFwcGVuZFJlc01lbnUoJ0RSVlInKQorICAgICAgICBhcHBsZW1lbnUuSW5zZXJ0TWVudSgwKQorICAgICAgICBzZWxmLnF1aXRtZW51ID0gTWVudS5OZXdNZW51KHNlbGYucXVpdGlkLCAiRmlsZSIpCisgICAgICAgIHNlbGYucXVpdG1lbnUuQXBwZW5kTWVudSgiUXVpdCIpCisgICAgICAgIHNlbGYucXVpdG1lbnUuU2V0SXRlbUNtZCgxLCBvcmQoIlEiKSkKKyAgICAgICAgc2VsZi5xdWl0bWVudS5JbnNlcnRNZW51KDApCisgICAgICAgIE1lbnUuRHJhd01lbnVCYXIoKQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgbWFpbmxvb3Aoc2VsZiwgbWFzayA9IGV2ZXJ5RXZlbnQsIHRpbWVvdXQgPSA2MCo2MCk6CisgICAgICAgIHdoaWxlIG5vdCBzZWxmLnF1aXR0aW5nOgorICAgICAgICAgICAgc2VsZi5kb29uZWV2ZW50KG1hc2ssIHRpbWVvdXQpCisKKyAgICBkZWYgX3F1aXQoc2VsZik6CisgICAgICAgIHNlbGYucXVpdHRpbmcgPSAxCisKKyAgICBkZWYgZG9vbmVldmVudChzZWxmLCBtYXNrID0gZXZlcnlFdmVudCwgdGltZW91dCA9IDYwKjYwKToKKyAgICAgICAgZ290LCBldmVudCA9IEV2dC5XYWl0TmV4dEV2ZW50KG1hc2ssIHRpbWVvdXQpCisgICAgICAgIGlmIGdvdDoKKyAgICAgICAgICAgIHNlbGYubG93bGV2ZWxoYW5kbGVyKGV2ZW50KQorCisgICAgZGVmIGxvd2xldmVsaGFuZGxlcihzZWxmLCBldmVudCk6CisgICAgICAgIHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMgPSBldmVudAorICAgICAgICBoLCB2ID0gd2hlcmUKKyAgICAgICAgaWYgd2hhdCA9PSBrSGlnaExldmVsRXZlbnQ6CisgICAgICAgICAgICBtc2cgPSAiSGlnaCBMZXZlbCBFdmVudDogJXIgJXIiICUgKGNvZGUobWVzc2FnZSksIGNvZGUoaCB8ICh2PDwxNikpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIEFFLkFFUHJvY2Vzc0FwcGxlRXZlbnQoZXZlbnQpCisgICAgICAgICAgICBleGNlcHQgQUUuRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBwcmludCAnQUUgZXJyb3I6ICcsIGVycgorICAgICAgICAgICAgICAgIHByaW50ICdpbicsIG1zZworICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgd2hhdCA9PSBrZXlEb3duOgorICAgICAgICAgICAgYyA9IGNocihtZXNzYWdlICYgY2hhckNvZGVNYXNrKQorICAgICAgICAgICAgaWYgbW9kaWZpZXJzICYgY21kS2V5OgorICAgICAgICAgICAgICAgIGlmIGMgPT0gJy4nOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdCwgIkNvbW1hbmQtcGVyaW9kIgorICAgICAgICAgICAgICAgIGlmIGMgPT0gJ3EnOgorICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnT3V0cHV0U2VlbicpOgorICAgICAgICAgICAgICAgICAgICAgICAgTWFjT1MuT3V0cHV0U2VlbigpCisgICAgICAgICAgICAgICAgICAgIHNlbGYucXVpdHRpbmcgPSAxCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHdoYXQgPT0gbW91c2VEb3duOgorICAgICAgICAgICAgcGFydGNvZGUsIHdpbmRvdyA9IFdpbi5GaW5kV2luZG93KHdoZXJlKQorICAgICAgICAgICAgaWYgcGFydGNvZGUgPT0gaW5NZW51QmFyOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IE1lbnUuTWVudVNlbGVjdCh3aGVyZSkKKyAgICAgICAgICAgICAgICBpZCA9IChyZXN1bHQ+PjE2KSAmIDB4ZmZmZiAgICAgICMgSGkgd29yZAorICAgICAgICAgICAgICAgIGl0ZW0gPSByZXN1bHQgJiAweGZmZmYgICAgICAjIExvIHdvcmQKKyAgICAgICAgICAgICAgICBpZiBpZCA9PSBzZWxmLmFwcGxlaWQ6CisgICAgICAgICAgICAgICAgICAgIGlmIGl0ZW0gPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2Uoc2VsZi5nZXRhYm91dHRleHQoKSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBpdGVtID4gMSBhbmQgaGFzYXR0cihNZW51LCAnT3BlbkRlc2tBY2MnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzZWxmLmFwcGxlbWVudS5HZXRNZW51SXRlbVRleHQoaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lbnUuT3BlbkRlc2tBY2MobmFtZSkKKyAgICAgICAgICAgICAgICBlbGlmIGlkID09IHNlbGYucXVpdGlkIGFuZCBpdGVtID09IDE6CisgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdPdXRwdXRTZWVuJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBNYWNPUy5PdXRwdXRTZWVuKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWl0dGluZyA9IDEKKyAgICAgICAgICAgICAgICBNZW51LkhpbGl0ZU1lbnUoMCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBBbnl0aGluZyBub3QgaGFuZGxlZCBpcyBwYXNzZWQgdG8gUHl0aG9uL1NJT1VYCisgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdIYW5kbGVFdmVudCcpOgorICAgICAgICAgICAgTWFjT1MuSGFuZGxlRXZlbnQoZXZlbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiVW5oYW5kbGVkIGV2ZW50OiIsIGV2ZW50CisKKyAgICBkZWYgZ2V0YWJvdXR0ZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgIGRlZiBnZXRhYm91dG1lbnV0ZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gIkFib3V0ICVzXDMxMSIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisKK2NsYXNzIEFFU2VydmVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmFlX2hhbmRsZXJzID0ge30KKworICAgIGRlZiBpbnN0YWxsYWVoYW5kbGVyKHNlbGYsIGNsYXNzZSwgdHlwZSwgY2FsbGJhY2spOgorICAgICAgICBBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoY2xhc3NlLCB0eXBlLCBzZWxmLmNhbGxiYWNrX3dyYXBwZXIpCisgICAgICAgIHNlbGYuYWVfaGFuZGxlcnNbKGNsYXNzZSwgdHlwZSldID0gY2FsbGJhY2sKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgZm9yIGNsYXNzZSwgdHlwZSBpbiBzZWxmLmFlX2hhbmRsZXJzLmtleXMoKToKKyAgICAgICAgICAgIEFFLkFFUmVtb3ZlRXZlbnRIYW5kbGVyKGNsYXNzZSwgdHlwZSkKKworICAgIGRlZiBjYWxsYmFja193cmFwcGVyKHNlbGYsIF9yZXF1ZXN0LCBfcmVwbHkpOgorICAgICAgICBfcGFyYW1ldGVycywgX2F0dHJpYnV0ZXMgPSBhZXRvb2xzLnVucGFja2V2ZW50KF9yZXF1ZXN0KQorICAgICAgICBfY2xhc3MgPSBfYXR0cmlidXRlc1snZXZjbCddLnR5cGUKKyAgICAgICAgX3R5cGUgPSBfYXR0cmlidXRlc1snZXZpZCddLnR5cGUKKworICAgICAgICBpZiAoX2NsYXNzLCBfdHlwZSkgaW4gc2VsZi5hZV9oYW5kbGVyczoKKyAgICAgICAgICAgIF9mdW5jdGlvbiA9IHNlbGYuYWVfaGFuZGxlcnNbKF9jbGFzcywgX3R5cGUpXQorICAgICAgICBlbGlmIChfY2xhc3MsICcqKioqJykgaW4gc2VsZi5hZV9oYW5kbGVyczoKKyAgICAgICAgICAgIF9mdW5jdGlvbiA9IHNlbGYuYWVfaGFuZGxlcnNbKF9jbGFzcywgJyoqKionKV0KKyAgICAgICAgZWxpZiAoJyoqKionLCAnKioqKicpIGluIHNlbGYuYWVfaGFuZGxlcnM6CisgICAgICAgICAgICBfZnVuY3Rpb24gPSBzZWxmLmFlX2hhbmRsZXJzWygnKioqKicsICcqKioqJyldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSAnQ2Fubm90IGhhcHBlbjogQUUgY2FsbGJhY2sgd2l0aG91dCBoYW5kbGVyJywgKF9jbGFzcywgX3R5cGUpCisKKyAgICAgICAgIyBYWFhYIERvIGtleS10by1uYW1lIG1hcHBpbmcgaGVyZQorCisgICAgICAgIF9wYXJhbWV0ZXJzWydfYXR0cmlidXRlcyddID0gX2F0dHJpYnV0ZXMKKyAgICAgICAgX3BhcmFtZXRlcnNbJ19jbGFzcyddID0gX2NsYXNzCisgICAgICAgIF9wYXJhbWV0ZXJzWydfdHlwZSddID0gX3R5cGUKKyAgICAgICAgaWYgJy0tLS0nIGluIF9wYXJhbWV0ZXJzOgorICAgICAgICAgICAgX29iamVjdCA9IF9wYXJhbWV0ZXJzWyctLS0tJ10KKyAgICAgICAgICAgIGRlbCBfcGFyYW1ldGVyc1snLS0tLSddCisgICAgICAgICAgICAjIFRoZSB0cnkvZXhjZXB0IHRoYXQgdXNlZCB0byBiZSBoZXJlIGNhbiBtYXNrIHByb2dyYW1tZXIgZXJyb3JzLgorICAgICAgICAgICAgIyBMZXQgdGhlIHByb2dyYW0gY3Jhc2gsIHRoZSBwcm9ncmFtbWVyIGNhbiBhbHdheXMgYWRkIGEgKiphcmdzCisgICAgICAgICAgICAjIHRvIHRoZSBmb3JtYWwgcGFyYW1ldGVyIGxpc3QuCisgICAgICAgICAgICBydiA9IF9mdW5jdGlvbihfb2JqZWN0LCAqKl9wYXJhbWV0ZXJzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgI1NhbWUgdHJ5L2V4Y2VwdCBjb21tZW50IGFzIGFib3ZlCisgICAgICAgICAgICBydiA9IF9mdW5jdGlvbigqKl9wYXJhbWV0ZXJzKQorCisgICAgICAgIGlmIHJ2IGlzIE5vbmU6CisgICAgICAgICAgICBhZXRvb2xzLnBhY2tldmVudChfcmVwbHksIHt9KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWV0b29scy5wYWNrZXZlbnQoX3JlcGx5LCB7Jy0tLS0nOnJ2fSkKKworCitkZWYgY29kZSh4KToKKyAgICAiQ29udmVydCBhIGxvbmcgaW50IHRvIHRoZSA0LWNoYXJhY3RlciBjb2RlIGl0IHJlYWxseSBpcyIKKyAgICBzID0gJycKKyAgICBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAgICAgeCwgYyA9IGRpdm1vZCh4LCAyNTYpCisgICAgICAgIHMgPSBjaHIoYykgKyBzCisgICAgcmV0dXJuIHMKKworY2xhc3MgX1Rlc3QoQUVTZXJ2ZXIsIE1pbmlBcHBsaWNhdGlvbik6CisgICAgIiIiTWluaSB0ZXN0IGFwcGxpY2F0aW9uLCBoYW5kbGVzIHJlcXVpcmVkIGV2ZW50cyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBNaW5pQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKKyAgICAgICAgQUVTZXJ2ZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5pbnN0YWxsYWVoYW5kbGVyKCdhZXZ0JywgJ29hcHAnLCBzZWxmLm9wZW5fYXBwKQorICAgICAgICBzZWxmLmluc3RhbGxhZWhhbmRsZXIoJ2FldnQnLCAncXVpdCcsIHNlbGYucXVpdCkKKyAgICAgICAgc2VsZi5pbnN0YWxsYWVoYW5kbGVyKCcqKioqJywgJyoqKionLCBzZWxmLm90aGVyKQorICAgICAgICBzZWxmLm1haW5sb29wKCkKKworICAgIGRlZiBxdWl0KHNlbGYsICoqYXJncyk6CisgICAgICAgIHNlbGYuX3F1aXQoKQorCisgICAgZGVmIG9wZW5fYXBwKHNlbGYsICoqYXJncyk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBvdGhlcihzZWxmLCBfb2JqZWN0PU5vbmUsIF9jbGFzcz1Ob25lLCBfdHlwZT1Ob25lLCAqKmFyZ3MpOgorICAgICAgICBwcmludCAnQXBwbGVFdmVudCcsIChfY2xhc3MsIF90eXBlKSwgJ2ZvcicsIF9vYmplY3QsICdPdGhlciBhcmdzOicsIGFyZ3MKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF9UZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvTWluaUFFRnJhbWUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9NaW5pQUVGcmFtZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3ZTk3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvTWluaUFFRnJhbWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvTWluaUFFRnJhbWUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9NaW5pQUVGcmFtZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3ZTk3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvTWluaUFFRnJhbWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvUGl4TWFwV3JhcHBlci5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvUGl4TWFwV3JhcHBlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2UzMDQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9QaXhNYXBXcmFwcGVyLnB5CkBAIC0wLDAgKzEsMjE4IEBACisiIiJQaXhNYXBXcmFwcGVyIC0gZGVmaW5lcyB0aGUgUGl4TWFwV3JhcHBlciBjbGFzcywgd2hpY2ggd3JhcHMgYW4gb3BhcXVlCitRdWlja0RyYXcgUGl4TWFwIGRhdGEgc3RydWN0dXJlIGluIGEgaGFuZHkgUHl0aG9uIGNsYXNzLiAgQWxzbyBwcm92aWRlcworbWV0aG9kcyB0byBjb252ZXJ0IHRvL2Zyb20gcGl4ZWwgZGF0YSAoZnJvbSwgZS5nLiwgdGhlIGltZyBtb2R1bGUpIG9yIGEKK1B5dGhvbiBJbWFnaW5nIExpYnJhcnkgSW1hZ2Ugb2JqZWN0LgorCitKLiBTdHJvdXQgPGpvZUBzdHJvdXQubmV0PiAgRmVicnVhcnkgMTk5OSIiIgorCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgUGl4TWFwV3JhcHBlciBtb2R1bGUgaXMgcmVtb3ZlZC4iLCBzdGFja2xldmVsPTIpCisKK2Zyb20gQ2FyYm9uIGltcG9ydCBRZAorZnJvbSBDYXJib24gaW1wb3J0IFF1aWNrRHJhdworaW1wb3J0IHN0cnVjdAoraW1wb3J0IE1hY09TCitpbXBvcnQgaW1nCitpbXBvcnQgaW1nZm9ybWF0CisKKyMgUGl4TWFwIGRhdGEgc3RydWN0dXJlIGVsZW1lbnQgZm9ybWF0IChhcyB1c2VkIHdpdGggc3RydWN0KQorX3BtRWxlbUZvcm1hdCA9IHsKKyAgICAnYmFzZUFkZHInOidsJywgICAgICMgYWRkcmVzcyBvZiBwaXhlbCBkYXRhCisgICAgJ3Jvd0J5dGVzJzonSCcsICAgICAjIGJ5dGVzIHBlciByb3csIHBsdXMgMHg4MDAwCisgICAgJ2JvdW5kcyc6J2hoaGgnLCAgICAjIGNvb3JkaW5hdGVzIGltcG9zZWQgb3ZlciBwaXhlbCBkYXRhCisgICAgICAgICd0b3AnOidoJywKKyAgICAgICAgJ2xlZnQnOidoJywKKyAgICAgICAgJ2JvdHRvbSc6J2gnLAorICAgICAgICAncmlnaHQnOidoJywKKyAgICAncG1WZXJzaW9uJzonaCcsICAgICMgZmxhZ3MgZm9yIENvbG9yIFF1aWNrRHJhdworICAgICdwYWNrVHlwZSc6J2gnLCAgICAgIyBmb3JtYXQgb2YgY29tcHJlc3Npb24gYWxnb3JpdGhtCisgICAgJ3BhY2tTaXplJzonbCcsICAgICAjIHNpemUgYWZ0ZXIgY29tcHJlc3Npb24KKyAgICAnaFJlcyc6J2wnLCAgICAgICAgICMgaG9yaXpvbnRhbCBwaXhlbHMgcGVyIGluY2gKKyAgICAndlJlcyc6J2wnLCAgICAgICAgICMgdmVydGljYWwgcGl4ZWxzIHBlciBpbmNoCisgICAgJ3BpeGVsVHlwZSc6J2gnLCAgICAjIHBpeGVsIGZvcm1hdAorICAgICdwaXhlbFNpemUnOidoJywgICAgIyBiaXRzIHBlciBwaXhlbAorICAgICdjbXBDb3VudCc6J2gnLCAgICAgIyBjb2xvciBjb21wb25lbnRzIHBlciBwaXhlbAorICAgICdjbXBTaXplJzonaCcsICAgICAgIyBiaXRzIHBlciBjb21wb25lbnQKKyAgICAncGxhbmVCeXRlcyc6J2wnLCAgICMgb2Zmc2V0IGluIGJ5dGVzIHRvIG5leHQgcGxhbmUKKyAgICAncG1UYWJsZSc6J2wnLCAgICAgICMgaGFuZGxlIHRvIGNvbG9yIHRhYmxlCisgICAgJ3BtUmVzZXJ2ZWQnOidsJyAgICAjIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlCit9CisKKyMgUGl4TWFwIGRhdGEgc3RydWN0dXJlIGVsZW1lbnQgb2Zmc2V0CitfcG1FbGVtT2Zmc2V0ID0geworICAgICdiYXNlQWRkcic6MCwKKyAgICAncm93Qnl0ZXMnOjQsCisgICAgJ2JvdW5kcyc6NiwKKyAgICAgICAgJ3RvcCc6NiwKKyAgICAgICAgJ2xlZnQnOjgsCisgICAgICAgICdib3R0b20nOjEwLAorICAgICAgICAncmlnaHQnOjEyLAorICAgICdwbVZlcnNpb24nOjE0LAorICAgICdwYWNrVHlwZSc6MTYsCisgICAgJ3BhY2tTaXplJzoxOCwKKyAgICAnaFJlcyc6MjIsCisgICAgJ3ZSZXMnOjI2LAorICAgICdwaXhlbFR5cGUnOjMwLAorICAgICdwaXhlbFNpemUnOjMyLAorICAgICdjbXBDb3VudCc6MzQsCisgICAgJ2NtcFNpemUnOjM2LAorICAgICdwbGFuZUJ5dGVzJzozOCwKKyAgICAncG1UYWJsZSc6NDIsCisgICAgJ3BtUmVzZXJ2ZWQnOjQ2Cit9CisKK2NsYXNzIFBpeE1hcFdyYXBwZXI6CisgICAgIiIiUGl4TWFwV3JhcHBlciAtLSB3cmFwcyB0aGUgUUQgUGl4TWFwIG9iamVjdCBpbiBhIFB5dGhvbiBjbGFzcywKKyAgICB3aXRoIG1ldGhvZHMgdG8gZWFzaWx5IGdldC9zZXQgdmFyaW91cyBwaXhtYXAgZmllbGRzLiAgTm90ZTogVXNlIHRoZQorICAgIFBpeE1hcCgpIG1ldGhvZCB3aGVuIHBhc3NpbmcgdG8gUUQgY2FsbHMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX19kaWN0X19bJ2RhdGEnXSA9ICcnCisgICAgICAgIHNlbGYuX2hlYWRlciA9IHN0cnVjdC5wYWNrKCJsaGhoaGhoaGxsbGhoaGhsbGwiLAorICAgICAgICAgICAgaWQoc2VsZi5kYXRhKStNYWNPUy5zdHJpbmdfaWRfdG9fYnVmZmVyLAorICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgIyByb3dCeXRlcworICAgICAgICAgICAgMCwgMCwgMCwgMCwgICAgICAgICAgICAgIyBib3VuZHMKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICMgcG1WZXJzaW9uCisgICAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAjIHBhY2tUeXBlLCBwYWNrU2l6ZQorICAgICAgICAgICAgNzI8PDE2LCA3Mjw8MTYsICAgICAgICAgIyBoUmVzLCB2UmVzCisgICAgICAgICAgICBRdWlja0RyYXcuUkdCRGlyZWN0LCAgICAjIHBpeGVsVHlwZQorICAgICAgICAgICAgMTYsICAgICAgICAgICAgICAgICAgICAgIyBwaXhlbFNpemUKKyAgICAgICAgICAgIDIsIDUsICAgICAgICAgICAgICAgICAgICMgY21wQ291bnQsIGNtcFNpemUsCisgICAgICAgICAgICAwLCAwLCAwKSAgICAgICAgICAgICAgICAjIHBsYW5lQnl0ZXMsIHBtVGFibGUsIHBtUmVzZXJ2ZWQKKyAgICAgICAgc2VsZi5fX2RpY3RfX1snX3BtJ10gPSBRZC5SYXdCaXRNYXAoc2VsZi5faGVhZGVyKQorCisgICAgZGVmIF9zdHVmZihzZWxmLCBlbGVtZW50LCBieXRlcyk6CisgICAgICAgIG9mZnNldCA9IF9wbUVsZW1PZmZzZXRbZWxlbWVudF0KKyAgICAgICAgZm10ID0gX3BtRWxlbUZvcm1hdFtlbGVtZW50XQorICAgICAgICBzZWxmLl9oZWFkZXIgPSBzZWxmLl9oZWFkZXJbOm9mZnNldF0gXAorICAgICAgICAgICAgKyBzdHJ1Y3QucGFjayhmbXQsIGJ5dGVzKSBcCisgICAgICAgICAgICArIHNlbGYuX2hlYWRlcltvZmZzZXQgKyBzdHJ1Y3QuY2FsY3NpemUoZm10KTpdCisgICAgICAgIHNlbGYuX19kaWN0X19bJ19wbSddID0gTm9uZQorCisgICAgZGVmIF91bnN0dWZmKHNlbGYsIGVsZW1lbnQpOgorICAgICAgICBvZmZzZXQgPSBfcG1FbGVtT2Zmc2V0W2VsZW1lbnRdCisgICAgICAgIGZtdCA9IF9wbUVsZW1Gb3JtYXRbZWxlbWVudF0KKyAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soZm10LCBzZWxmLl9oZWFkZXJbb2Zmc2V0Om9mZnNldCtzdHJ1Y3QuY2FsY3NpemUoZm10KV0pWzBdCisKKyAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgYXR0ciwgdmFsKToKKyAgICAgICAgaWYgYXR0ciA9PSAnYmFzZUFkZHInOgorICAgICAgICAgICAgcmFpc2UgJ1VzZUVycicsICJkb24ndCBhc3NpZ24gdG8gLmJhc2VBZGRyIC0tIGFzc2lnbiB0byAuZGF0YSBpbnN0ZWFkIgorICAgICAgICBlbGlmIGF0dHIgPT0gJ2RhdGEnOgorICAgICAgICAgICAgc2VsZi5fX2RpY3RfX1snZGF0YSddID0gdmFsCisgICAgICAgICAgICBzZWxmLl9zdHVmZignYmFzZUFkZHInLCBpZChzZWxmLmRhdGEpICsgTWFjT1Muc3RyaW5nX2lkX3RvX2J1ZmZlcikKKyAgICAgICAgZWxpZiBhdHRyID09ICdyb3dCeXRlcyc6CisgICAgICAgICAgICAjIGhpZ2ggYml0IGlzIGFsd2F5cyBzZXQgZm9yIHNvbWUgb2RkIHJlYXNvbgorICAgICAgICAgICAgc2VsZi5fc3R1ZmYoJ3Jvd0J5dGVzJywgdmFsIHwgMHg4MDAwKQorICAgICAgICBlbGlmIGF0dHIgPT0gJ2JvdW5kcyc6CisgICAgICAgICAgICAjIGFzc3VtZSB2YWwgaXMgaW4gb2ZmaWNpYWwgTGVmdCwgVG9wLCBSaWdodCwgQm90dG9tIG9yZGVyIQorICAgICAgICAgICAgc2VsZi5fc3R1ZmYoJ2xlZnQnLHZhbFswXSkKKyAgICAgICAgICAgIHNlbGYuX3N0dWZmKCd0b3AnLHZhbFsxXSkKKyAgICAgICAgICAgIHNlbGYuX3N0dWZmKCdyaWdodCcsdmFsWzJdKQorICAgICAgICAgICAgc2VsZi5fc3R1ZmYoJ2JvdHRvbScsdmFsWzNdKQorICAgICAgICBlbGlmIGF0dHIgPT0gJ2hSZXMnIG9yIGF0dHIgPT0gJ3ZSZXMnOgorICAgICAgICAgICAgIyAxNi4xNiBmaXhlZCBmb3JtYXQsIHNvIGp1c3Qgc2hpZnQgMTYgYml0cworICAgICAgICAgICAgc2VsZi5fc3R1ZmYoYXR0ciwgaW50KHZhbCkgPDwgMTYpCisgICAgICAgIGVsaWYgYXR0ciBpbiBfcG1FbGVtRm9ybWF0LmtleXMoKToKKyAgICAgICAgICAgICMgYW55IG90aGVyIHBtIGF0dHJpYnV0ZSAtLSBqdXN0IHN0dWZmCisgICAgICAgICAgICBzZWxmLl9zdHVmZihhdHRyLCB2YWwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fZGljdF9fW2F0dHJdID0gdmFsCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIGlmIGF0dHIgPT0gJ3Jvd0J5dGVzJzoKKyAgICAgICAgICAgICMgaGlnaCBiaXQgaXMgYWx3YXlzIHNldCBmb3Igc29tZSBvZGQgcmVhc29uCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdW5zdHVmZigncm93Qnl0ZXMnKSAmIDB4N0ZGRgorICAgICAgICBlbGlmIGF0dHIgPT0gJ2JvdW5kcyc6CisgICAgICAgICAgICAjIHJldHVybiBib3VuZHMgaW4gb2ZmaWNpYWwgTGVmdCwgVG9wLCBSaWdodCwgQm90dG9tIG9yZGVyIQorICAgICAgICAgICAgcmV0dXJuICggXAorICAgICAgICAgICAgICAgIHNlbGYuX3Vuc3R1ZmYoJ2xlZnQnKSwKKyAgICAgICAgICAgICAgICBzZWxmLl91bnN0dWZmKCd0b3AnKSwKKyAgICAgICAgICAgICAgICBzZWxmLl91bnN0dWZmKCdyaWdodCcpLAorICAgICAgICAgICAgICAgIHNlbGYuX3Vuc3R1ZmYoJ2JvdHRvbScpICkKKyAgICAgICAgZWxpZiBhdHRyID09ICdoUmVzJyBvciBhdHRyID09ICd2UmVzJzoKKyAgICAgICAgICAgICMgMTYuMTYgZml4ZWQgZm9ybWF0LCBzbyBqdXN0IHNoaWZ0IDE2IGJpdHMKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl91bnN0dWZmKGF0dHIpID4+IDE2CisgICAgICAgIGVsaWYgYXR0ciBpbiBfcG1FbGVtRm9ybWF0LmtleXMoKToKKyAgICAgICAgICAgICMgYW55IG90aGVyIHBtIGF0dHJpYnV0ZSAtLSBqdXN0IHVuc3R1ZmYKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl91bnN0dWZmKGF0dHIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RpY3RfX1thdHRyXQorCisKKyAgICBkZWYgUGl4TWFwKHNlbGYpOgorICAgICAgICAiUmV0dXJuIGEgUXVpY2tEcmF3IFBpeE1hcCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZGF0YS4iCisgICAgICAgIGlmIG5vdCBzZWxmLl9fZGljdF9fWydfcG0nXToKKyAgICAgICAgICAgIHNlbGYuX19kaWN0X19bJ19wbSddID0gUWQuUmF3Qml0TWFwKHNlbGYuX2hlYWRlcikKKyAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X19bJ19wbSddCisKKyAgICBkZWYgYmxpdChzZWxmLCB4MT0wLHkxPTAseDI9Tm9uZSx5Mj1Ob25lLCBwb3J0PU5vbmUpOgorICAgICAgICAiIiJEcmF3IHRoaXMgcGl4bWFwIGludG8gdGhlIGdpdmVuIChkZWZhdWx0IGN1cnJlbnQpIGdyYWZwb3J0LiIiIgorICAgICAgICBzcmMgPSBzZWxmLmJvdW5kcworICAgICAgICBkZXN0ID0gW3gxLHkxLHgyLHkyXQorICAgICAgICBpZiB4MiBpcyBOb25lOgorICAgICAgICAgICAgZGVzdFsyXSA9IHgxICsgc3JjWzJdLXNyY1swXQorICAgICAgICBpZiB5MiBpcyBOb25lOgorICAgICAgICAgICAgZGVzdFszXSA9IHkxICsgc3JjWzNdLXNyY1sxXQorICAgICAgICBpZiBub3QgcG9ydDogcG9ydCA9IFFkLkdldFBvcnQoKQorICAgICAgICBRZC5Db3B5Qml0cyhzZWxmLlBpeE1hcCgpLCBwb3J0LkdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cygpLCBzcmMsIHR1cGxlKGRlc3QpLAorICAgICAgICAgICAgICAgIFF1aWNrRHJhdy5zcmNDb3B5LCBOb25lKQorCisgICAgZGVmIGZyb21zdHJpbmcoc2VsZixzLHdpZHRoLGhlaWdodCxmb3JtYXQ9aW1nZm9ybWF0Lm1hY3JnYik6CisgICAgICAgICIiIlN0dWZmIHRoaXMgcGl4bWFwIHdpdGggcmF3IHBpeGVsIGRhdGEgZnJvbSBhIHN0cmluZy4KKyAgICAgICAgU3VwcGx5IHdpZHRoLCBoZWlnaHQsIGFuZCBvbmUgb2YgdGhlIGltZ2Zvcm1hdCBzcGVjaWZpZXJzLiIiIgorICAgICAgICAjIHdlIG9ubHkgc3VwcG9ydCAxNi0gYW5kIDMyLWJpdCBtYWMgcmdiLi4uCisgICAgICAgICMgc28gY29udmVydCBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgZm9ybWF0ICE9IGltZ2Zvcm1hdC5tYWNyZ2IgYW5kIGZvcm1hdCAhPSBpbWdmb3JtYXQubWFjcmdiMTY6CisgICAgICAgICAgICAjIChMQVRFUiEpCisgICAgICAgICAgICByYWlzZSAiTm90SW1wbGVtZW50ZWRFcnJvciIsICJjb252ZXJzaW9uIHRvIG1hY3JnYiBvciBtYWNyZ2IxNiIKKyAgICAgICAgc2VsZi5kYXRhID0gcworICAgICAgICBzZWxmLmJvdW5kcyA9ICgwLDAsd2lkdGgsaGVpZ2h0KQorICAgICAgICBzZWxmLmNtcENvdW50ID0gMworICAgICAgICBzZWxmLnBpeGVsVHlwZSA9IFF1aWNrRHJhdy5SR0JEaXJlY3QKKyAgICAgICAgaWYgZm9ybWF0ID09IGltZ2Zvcm1hdC5tYWNyZ2I6CisgICAgICAgICAgICBzZWxmLnBpeGVsU2l6ZSA9IDMyCisgICAgICAgICAgICBzZWxmLmNtcFNpemUgPSA4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnBpeGVsU2l6ZSA9IDE2CisgICAgICAgICAgICBzZWxmLmNtcFNpemUgPSA1CisgICAgICAgIHNlbGYucm93Qnl0ZXMgPSB3aWR0aCpzZWxmLnBpeGVsU2l6ZS84CisKKyAgICBkZWYgdG9zdHJpbmcoc2VsZiwgZm9ybWF0PWltZ2Zvcm1hdC5tYWNyZ2IpOgorICAgICAgICAiIiJSZXR1cm4gcmF3IGRhdGEgYXMgYSBzdHJpbmcgaW4gdGhlIHNwZWNpZmllZCBmb3JtYXQuIiIiCisgICAgICAgICMgaXMgdGhlIG5hdGl2ZSBmb3JtYXQgcmVxdWVzdGVkPyAgaWYgc28sIGp1c3QgcmV0dXJuIGRhdGEKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBpbWdmb3JtYXQubWFjcmdiIGFuZCBzZWxmLnBpeGVsU2l6ZSA9PSAzMikgb3IgXAorICAgICAgICAgICAoZm9ybWF0ID09IGltZ2Zvcm1hdC5tYWNyZ2IxNiBhbmQgc2VsZi5waXhlbHNpemUgPT0gMTYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQorICAgICAgICAjIG90aGVyd2lzZSwgY29udmVydCB0byB0aGUgcmVxdWVzdGVkIGZvcm1hdAorICAgICAgICAjIChMQVRFUiEpCisgICAgICAgICAgICByYWlzZSAiTm90SW1wbGVtZW50ZWRFcnJvciIsICJkYXRhIGZvcm1hdCBjb252ZXJzaW9uIgorCisgICAgZGVmIGZyb21JbWFnZShzZWxmLGltKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSB0aGlzIFBpeE1hcCBmcm9tIGEgUElMIEltYWdlIG9iamVjdC4iIiIKKyAgICAgICAgIyBXZSBuZWVkIGRhdGEgaW4gQVJHQiBmb3JtYXQ7IFBJTCBjYW4ndCBjdXJyZW50bHkgZG8gdGhhdCwKKyAgICAgICAgIyBidXQgaXQgY2FuIGRvIFJHQkEsIHdoaWNoIHdlIGNhbiB1c2UgYnkgaW5zZXJ0aW5nIG9uZSBudWxsCisgICAgICAgICMgdXAgZnJvbnRwbSA9CisgICAgICAgIGlmIGltLm1vZGUgIT0gJ1JHQkEnOiBpbSA9IGltLmNvbnZlcnQoJ1JHQkEnKQorICAgICAgICBkYXRhID0gY2hyKDApICsgaW0udG9zdHJpbmcoKQorICAgICAgICBzZWxmLmZyb21zdHJpbmcoZGF0YSwgaW0uc2l6ZVswXSwgaW0uc2l6ZVsxXSkKKworICAgIGRlZiB0b0ltYWdlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoaXMgUGl4TWFwIGFzIGEgUElMIEltYWdlIG9iamVjdC4iIiIKKyAgICAgICAgaW1wb3J0IEltYWdlCisgICAgICAgICMgb3VyIHRvc3RyaW5nKCkgbWV0aG9kIHJldHVybnMgZGF0YSBpbiBBUkdCIGZvcm1hdCwKKyAgICAgICAgIyB3aGVyZWFzIEltYWdlIHVzZXMgUkdCQTsgYSBiaXQgb2Ygc2xpY2luZyBmaXhlcyB0aGlzLi4uCisgICAgICAgIGRhdGEgPSBzZWxmLnRvc3RyaW5nKClbMTpdICsgY2hyKDApCisgICAgICAgIGJvdW5kcyA9IHNlbGYuYm91bmRzCisgICAgICAgIHJldHVybiBJbWFnZS5mcm9tc3RyaW5nKCdSR0JBJywoYm91bmRzWzJdLWJvdW5kc1swXSxib3VuZHNbM10tYm91bmRzWzFdKSxkYXRhKQorCitkZWYgdGVzdCgpOgorICAgIGltcG9ydCBNYWNPUworICAgIGltcG9ydCBFYXN5RGlhbG9ncworICAgIGltcG9ydCBJbWFnZQorICAgIHBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbigiSW1hZ2UgRmlsZToiKQorICAgIGlmIG5vdCBwYXRoOiByZXR1cm4KKyAgICBwbSA9IFBpeE1hcFdyYXBwZXIoKQorICAgIHBtLmZyb21JbWFnZSggSW1hZ2Uub3BlbihwYXRoKSApCisgICAgcG0uYmxpdCgyMCwyMCkKKyAgICByZXR1cm4gcG0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvUGl4TWFwV3JhcHBlci5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL1BpeE1hcFdyYXBwZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNDVkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL1BpeE1hcFdyYXBwZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvUGl4TWFwV3JhcHBlci5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL1BpeE1hcFdyYXBwZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNDVkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL1BpeE1hcFdyYXBwZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYWVwYWNrLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hZXBhY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyYTM3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYWVwYWNrLnB5CkBAIC0wLDAgKzEsMzY5IEBACisiIiJUb29scyBmb3IgdXNlIGluIEFwcGxlRXZlbnQgY2xpZW50cyBhbmQgc2VydmVyczoKK2NvbnZlcnNpb24gYmV0d2VlbiBBRSB0eXBlcyBhbmQgcHl0aG9uIHR5cGVzCisKK3BhY2soeCkgY29udmVydHMgYSBQeXRob24gb2JqZWN0IHRvIGFuIEFFRGVzYyBvYmplY3QKK3VucGFjayhkZXNjKSBkb2VzIHRoZSByZXZlcnNlCitjb2VyY2UoeCwgd2FudGVkX3NhbXBsZSkgY29lcmNlcyBhIHB5dGhvbiBvYmplY3QgdG8gYW5vdGhlciBweXRob24gb2JqZWN0CisiIiIKKworIworIyBUaGlzIGNvZGUgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSBHdWlkbywgYW5kIG1vZGlmaWVkL2V4dGVuZGVkIGJ5IEphY2sKKyMgdG8gaW5jbHVkZSB0aGUgdmFyaW91cyB0eXBlcyB0aGF0IHdlcmUgbWlzc2luZy4gVGhlIHJlZmVyZW5jZSB1c2VkIGlzCisjIEFwcGxlIEV2ZW50IFJlZ2lzdHJ5LCBjaGFwdGVyIDkuCisjCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgYWVwYWNrIG1vZHVsZSBpcyByZW1vdmVkLiIsIHN0YWNrbGV2ZWw9MikKKworaW1wb3J0IHN0cnVjdAoraW1wb3J0IHR5cGVzCitmcm9tIHR5cGVzIGltcG9ydCAqCitmcm9tIENhcmJvbiBpbXBvcnQgQUUKK2Zyb20gQ2FyYm9uLkFwcGxlRXZlbnRzIGltcG9ydCAqCitpbXBvcnQgTWFjT1MKK2ltcG9ydCBDYXJib24uRmlsZQoraW1wb3J0IGFldHlwZXMKK2Zyb20gYWV0eXBlcyBpbXBvcnQgbWtlbnVtLCBPYmplY3RTcGVjaWZpZXIKKworIyBUaGVzZSBvbmVzIHNlZW0gdG8gYmUgbWlzc2luZyBmcm9tIEFwcGxlRXZlbnRzCisjICh0aGV5J3JlIGluIEFFUmVnaXN0cnkuaCkKKworI3R5cGVDb2xvclRhYmxlID0gJ2NscnQnCisjdHlwZURyYXdpbmdBcmVhID0gJ2NkcncnCisjdHlwZVBpeGVsTWFwID0gJ2NwaXgnCisjdHlwZVBpeGVsTWFwTWludXMgPSAndHBtbScKKyN0eXBlUm90YXRpb24gPSAndHJvdCcKKyN0eXBlVGV4dFN0eWxlcyA9ICd0c3R5JworI3R5cGVTdHlsZWRUZXh0ID0gJ1NUWFQnCisjdHlwZUFFVGV4dCA9ICd0VFhUJworI3R5cGVFbnVtZXJhdGlvbiA9ICdlbnVtJworCisjCisjIFNvbWUgQUUgdHlwZXMgYXJlIGltbWVkZWF0ZWx5IGNvZXJjZWQgaW50byBzb21ldGhpbmcKKyMgd2UgbGlrZSBiZXR0ZXIgKGFuZCB3aGljaCBpcyBlcXVpdmFsZW50KQorIwordW5wYWNrZXJfY29lcmNpb25zID0geworICAgIHR5cGVDb21wIDogdHlwZUZsb2F0LAorICAgIHR5cGVDb2xvclRhYmxlIDogdHlwZUFFTGlzdCwKKyAgICB0eXBlRHJhd2luZ0FyZWEgOiB0eXBlQUVSZWNvcmQsCisgICAgdHlwZUZpeGVkIDogdHlwZUZsb2F0LAorICAgIHR5cGVFeHRlbmRlZCA6IHR5cGVGbG9hdCwKKyAgICB0eXBlUGl4ZWxNYXAgOiB0eXBlQUVSZWNvcmQsCisgICAgdHlwZVJvdGF0aW9uIDogdHlwZUFFUmVjb3JkLAorICAgIHR5cGVTdHlsZWRUZXh0IDogdHlwZUFFUmVjb3JkLAorICAgIHR5cGVUZXh0U3R5bGVzIDogdHlwZUFFUmVjb3JkLAorfTsKKworIworIyBTb21lIHB5dGhvbiB0eXBlcyB3ZSBuZWVkIGluIHRoZSBwYWNrZXI6CisjCitBRURlc2NUeXBlID0gQUUuQUVEZXNjVHlwZQordHJ5OgorICAgIEZTU1R5cGUgPSBDYXJib24uRmlsZS5GU1NwZWNUeXBlCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgY2xhc3MgRlNTVHlwZToKKyAgICAgICAgcGFzcworRlNSZWZUeXBlID0gQ2FyYm9uLkZpbGUuRlNSZWZUeXBlCitBbGlhc1R5cGUgPSBDYXJib24uRmlsZS5BbGlhc1R5cGUKKworZGVmIHBhY2trZXkoYWUsIGtleSwgdmFsdWUpOgorICAgIGlmIGhhc2F0dHIoa2V5LCAnd2hpY2gnKToKKyAgICAgICAga2V5c3RyID0ga2V5LndoaWNoCisgICAgZWxpZiBoYXNhdHRyKGtleSwgJ3dhbnQnKToKKyAgICAgICAga2V5c3RyID0ga2V5LndhbnQKKyAgICBlbHNlOgorICAgICAgICBrZXlzdHIgPSBrZXkKKyAgICBhZS5BRVB1dFBhcmFtRGVzYyhrZXlzdHIsIHBhY2sodmFsdWUpKQorCitkZWYgcGFjayh4LCBmb3JjZXR5cGUgPSBOb25lKToKKyAgICAiIiJQYWNrIGEgcHl0aG9uIG9iamVjdCBpbnRvIGFuIEFFIGRlc2NyaXB0b3IiIiIKKworICAgIGlmIGZvcmNldHlwZToKKyAgICAgICAgaWYgdHlwZSh4KSBpcyBTdHJpbmdUeXBlOgorICAgICAgICAgICAgcmV0dXJuIEFFLkFFQ3JlYXRlRGVzYyhmb3JjZXR5cGUsIHgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcGFjayh4KS5BRUNvZXJjZURlc2MoZm9yY2V0eXBlKQorCisgICAgaWYgeCBpcyBOb25lOgorICAgICAgICByZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCdudWxsJywgJycpCisKKyAgICBpZiBpc2luc3RhbmNlKHgsIEFFRGVzY1R5cGUpOgorICAgICAgICByZXR1cm4geAorICAgIGlmIGlzaW5zdGFuY2UoeCwgRlNTVHlwZSk6CisgICAgICAgIHJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ2ZzcyAnLCB4LmRhdGEpCisgICAgaWYgaXNpbnN0YW5jZSh4LCBGU1JlZlR5cGUpOgorICAgICAgICByZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCdmc3JmJywgeC5kYXRhKQorICAgIGlmIGlzaW5zdGFuY2UoeCwgQWxpYXNUeXBlKToKKyAgICAgICAgcmV0dXJuIEFFLkFFQ3JlYXRlRGVzYygnYWxpcycsIHguZGF0YSkKKyAgICBpZiBpc2luc3RhbmNlKHgsIEludFR5cGUpOgorICAgICAgICByZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCdsb25nJywgc3RydWN0LnBhY2soJ2wnLCB4KSkKKyAgICBpZiBpc2luc3RhbmNlKHgsIEZsb2F0VHlwZSk6CisgICAgICAgIHJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ2RvdWInLCBzdHJ1Y3QucGFjaygnZCcsIHgpKQorICAgIGlmIGlzaW5zdGFuY2UoeCwgU3RyaW5nVHlwZSk6CisgICAgICAgIHJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ1RFWFQnLCB4KQorICAgIGlmIGlzaW5zdGFuY2UoeCwgVW5pY29kZVR5cGUpOgorICAgICAgICBkYXRhID0geC5lbmNvZGUoJ3V0ZjE2JykKKyAgICAgICAgaWYgZGF0YVs6Ml0gPT0gJ1x4ZmVceGZmJzoKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhWzI6XQorICAgICAgICByZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCd1dHh0JywgZGF0YSkKKyAgICBpZiBpc2luc3RhbmNlKHgsIExpc3RUeXBlKToKKyAgICAgICAgbGlzdCA9IEFFLkFFQ3JlYXRlTGlzdCgnJywgMCkKKyAgICAgICAgZm9yIGl0ZW0gaW4geDoKKyAgICAgICAgICAgIGxpc3QuQUVQdXREZXNjKDAsIHBhY2soaXRlbSkpCisgICAgICAgIHJldHVybiBsaXN0CisgICAgaWYgaXNpbnN0YW5jZSh4LCBEaWN0aW9uYXJ5VHlwZSk6CisgICAgICAgIHJlY29yZCA9IEFFLkFFQ3JlYXRlTGlzdCgnJywgMSkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4geC5pdGVtcygpOgorICAgICAgICAgICAgcGFja2tleShyZWNvcmQsIGtleSwgdmFsdWUpCisgICAgICAgICAgICAjcmVjb3JkLkFFUHV0UGFyYW1EZXNjKGtleSwgcGFjayh2YWx1ZSkpCisgICAgICAgIHJldHVybiByZWNvcmQKKyAgICBpZiB0eXBlKHgpID09IHR5cGVzLkNsYXNzVHlwZSBhbmQgaXNzdWJjbGFzcyh4LCBPYmplY3RTcGVjaWZpZXIpOgorICAgICAgICAjIE5vdGU6IHdlIGFyZSBnZXR0aW5nIGEgY2xhc3Mgb2JqZWN0IGhlcmUsIG5vdCBhbiBpbnN0YW5jZQorICAgICAgICByZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCd0eXBlJywgeC53YW50KQorICAgIGlmIGhhc2F0dHIoeCwgJ19fYWVwYWNrX18nKToKKyAgICAgICAgcmV0dXJuIHguX19hZXBhY2tfXygpCisgICAgaWYgaGFzYXR0cih4LCAnd2hpY2gnKToKKyAgICAgICAgcmV0dXJuIEFFLkFFQ3JlYXRlRGVzYygnVEVYVCcsIHgud2hpY2gpCisgICAgaWYgaGFzYXR0cih4LCAnd2FudCcpOgorICAgICAgICByZXR1cm4gQUUuQUVDcmVhdGVEZXNjKCdURVhUJywgeC53YW50KQorICAgIHJldHVybiBBRS5BRUNyZWF0ZURlc2MoJ1RFWFQnLCByZXByKHgpKSAjIENvcG91dAorCitkZWYgdW5wYWNrKGRlc2MsIGZvcm1vZHVsZW5hbWU9IiIpOgorICAgICIiIlVucGFjayBhbiBBRSBkZXNjcmlwdG9yIHRvIGEgcHl0aG9uIG9iamVjdCIiIgorICAgIHQgPSBkZXNjLnR5cGUKKworICAgIGlmIHQgaW4gdW5wYWNrZXJfY29lcmNpb25zOgorICAgICAgICBkZXNjID0gZGVzYy5BRUNvZXJjZURlc2ModW5wYWNrZXJfY29lcmNpb25zW3RdKQorICAgICAgICB0ID0gZGVzYy50eXBlICMgVGhpcyBpcyBhIGd1ZXNzIGJ5IEphY2suLi4uCisKKyAgICBpZiB0ID09IHR5cGVBRUxpc3Q6CisgICAgICAgIGwgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZShkZXNjLkFFQ291bnRJdGVtcygpKToKKyAgICAgICAgICAgIGtleXdvcmQsIGl0ZW0gPSBkZXNjLkFFR2V0TnRoRGVzYyhpKzEsICcqKioqJykKKyAgICAgICAgICAgIGwuYXBwZW5kKHVucGFjayhpdGVtLCBmb3Jtb2R1bGVuYW1lKSkKKyAgICAgICAgcmV0dXJuIGwKKyAgICBpZiB0ID09IHR5cGVBRVJlY29yZDoKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGZvciBpIGluIHJhbmdlKGRlc2MuQUVDb3VudEl0ZW1zKCkpOgorICAgICAgICAgICAga2V5d29yZCwgaXRlbSA9IGRlc2MuQUVHZXROdGhEZXNjKGkrMSwgJyoqKionKQorICAgICAgICAgICAgZFtrZXl3b3JkXSA9IHVucGFjayhpdGVtLCBmb3Jtb2R1bGVuYW1lKQorICAgICAgICByZXR1cm4gZAorICAgIGlmIHQgPT0gdHlwZUFFVGV4dDoKKyAgICAgICAgcmVjb3JkID0gZGVzYy5BRUNvZXJjZURlc2MoJ3JlY28nKQorICAgICAgICByZXR1cm4gbWthZXRleHQodW5wYWNrKHJlY29yZCwgZm9ybW9kdWxlbmFtZSkpCisgICAgaWYgdCA9PSB0eXBlQWxpYXM6CisgICAgICAgIHJldHVybiBDYXJib24uRmlsZS5BbGlhcyhyYXdkYXRhPWRlc2MuZGF0YSkKKyAgICAjIHR5cGVBcHBsZUV2ZW50IHJldHVybmVkIGFzIHVua25vd24KKyAgICBpZiB0ID09IHR5cGVCb29sZWFuOgorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnYicsIGRlc2MuZGF0YSlbMF0KKyAgICBpZiB0ID09IHR5cGVDaGFyOgorICAgICAgICByZXR1cm4gZGVzYy5kYXRhCisgICAgaWYgdCA9PSB0eXBlVW5pY29kZVRleHQ6CisgICAgICAgIHJldHVybiB1bmljb2RlKGRlc2MuZGF0YSwgJ3V0ZjE2JykKKyAgICAjIHR5cGVDb2xvclRhYmxlIGNvZXJjZWQgdG8gdHlwZUFFTGlzdAorICAgICMgdHlwZUNvbXAgY29lcmNlZCB0byBleHRlbmRlZAorICAgICMgdHlwZURhdGEgcmV0dXJuZWQgYXMgdW5rbm93bgorICAgICMgdHlwZURyYXdpbmdBcmVhIGNvZXJjZWQgdG8gdHlwZUFFUmVjb3JkCisgICAgaWYgdCA9PSB0eXBlRW51bWVyYXRpb246CisgICAgICAgIHJldHVybiBta2VudW0oZGVzYy5kYXRhKQorICAgICMgdHlwZUVQUyByZXR1cm5lZCBhcyB1bmtub3duCisgICAgaWYgdCA9PSB0eXBlRmFsc2U6CisgICAgICAgIHJldHVybiAwCisgICAgaWYgdCA9PSB0eXBlRmxvYXQ6CisgICAgICAgIGRhdGEgPSBkZXNjLmRhdGEKKyAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJ2QnLCBkYXRhKVswXQorICAgIGlmIHQgPT0gdHlwZUZTUzoKKyAgICAgICAgcmV0dXJuIENhcmJvbi5GaWxlLkZTU3BlYyhyYXdkYXRhPWRlc2MuZGF0YSkKKyAgICBpZiB0ID09IHR5cGVGU1JlZjoKKyAgICAgICAgcmV0dXJuIENhcmJvbi5GaWxlLkZTUmVmKHJhd2RhdGE9ZGVzYy5kYXRhKQorICAgIGlmIHQgPT0gdHlwZUluc2VydGlvbkxvYzoKKyAgICAgICAgcmVjb3JkID0gZGVzYy5BRUNvZXJjZURlc2MoJ3JlY28nKQorICAgICAgICByZXR1cm4gbWtpbnNlcnRpb25sb2ModW5wYWNrKHJlY29yZCwgZm9ybW9kdWxlbmFtZSkpCisgICAgIyB0eXBlSW50ZWdlciBlcXVhbCB0byB0eXBlTG9uZ0ludGVnZXIKKyAgICBpZiB0ID09IHR5cGVJbnRsVGV4dDoKKyAgICAgICAgc2NyaXB0LCBsYW5ndWFnZSA9IHN0cnVjdC51bnBhY2soJ2hoJywgZGVzYy5kYXRhWzo0XSkKKyAgICAgICAgcmV0dXJuIGFldHlwZXMuSW50bFRleHQoc2NyaXB0LCBsYW5ndWFnZSwgZGVzYy5kYXRhWzQ6XSkKKyAgICBpZiB0ID09IHR5cGVJbnRsV3JpdGluZ0NvZGU6CisgICAgICAgIHNjcmlwdCwgbGFuZ3VhZ2UgPSBzdHJ1Y3QudW5wYWNrKCdoaCcsIGRlc2MuZGF0YSkKKyAgICAgICAgcmV0dXJuIGFldHlwZXMuSW50bFdyaXRpbmdDb2RlKHNjcmlwdCwgbGFuZ3VhZ2UpCisgICAgaWYgdCA9PSB0eXBlS2V5d29yZDoKKyAgICAgICAgcmV0dXJuIG1ra2V5d29yZChkZXNjLmRhdGEpCisgICAgaWYgdCA9PSB0eXBlTG9uZ0ludGVnZXI6CisgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCdsJywgZGVzYy5kYXRhKVswXQorICAgIGlmIHQgPT0gdHlwZUxvbmdEYXRlVGltZToKKyAgICAgICAgYSwgYiA9IHN0cnVjdC51bnBhY2soJ2xMJywgZGVzYy5kYXRhKQorICAgICAgICByZXR1cm4gKGxvbmcoYSkgPDwgMzIpICsgYgorICAgIGlmIHQgPT0gdHlwZU51bGw6CisgICAgICAgIHJldHVybiBOb25lCisgICAgaWYgdCA9PSB0eXBlTWFnbml0dWRlOgorICAgICAgICB2ID0gc3RydWN0LnVucGFjaygnbCcsIGRlc2MuZGF0YSkKKyAgICAgICAgaWYgdiA8IDA6CisgICAgICAgICAgICB2ID0gMHgxMDAwMDAwMDBMICsgdgorICAgICAgICByZXR1cm4gdgorICAgIGlmIHQgPT0gdHlwZU9iamVjdFNwZWNpZmllcjoKKyAgICAgICAgcmVjb3JkID0gZGVzYy5BRUNvZXJjZURlc2MoJ3JlY28nKQorICAgICAgICAjIElmIHdlIGhhdmUgYmVlbiB0b2xkIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgd2UgYXJlIHVucGFja2luZyBhZWRlc2NzIGZvciwKKyAgICAgICAgIyB3ZSBjYW4gYXR0ZW1wdCB0byBjcmVhdGUgdGhlIHJpZ2h0IHR5cGUgb2YgcHl0aG9uIG9iamVjdCBmcm9tIHRoYXQgbW9kdWxlLgorICAgICAgICBpZiBmb3Jtb2R1bGVuYW1lOgorICAgICAgICAgICAgcmV0dXJuIG1rb2JqZWN0ZnJvbW1vZHVsZSh1bnBhY2socmVjb3JkLCBmb3Jtb2R1bGVuYW1lKSwgZm9ybW9kdWxlbmFtZSkKKyAgICAgICAgcmV0dXJuIG1rb2JqZWN0KHVucGFjayhyZWNvcmQsIGZvcm1vZHVsZW5hbWUpKQorICAgICMgdHlwZVBpY3QgcmV0dXJuZWQgYXMgdW5rbm93bgorICAgICMgdHlwZVBpeGVsTWFwIGNvZXJjZWQgdG8gdHlwZUFFUmVjb3JkCisgICAgIyB0eXBlUGl4ZWxNYXBNaW51cyByZXR1cm5lZCBhcyB1bmtub3duCisgICAgIyB0eXBlUHJvY2Vzc1NlcmlhbE51bWJlciByZXR1cm5lZCBhcyB1bmtub3duCisgICAgaWYgdCA9PSB0eXBlUURQb2ludDoKKyAgICAgICAgdiwgaCA9IHN0cnVjdC51bnBhY2soJ2hoJywgZGVzYy5kYXRhKQorICAgICAgICByZXR1cm4gYWV0eXBlcy5RRFBvaW50KHYsIGgpCisgICAgaWYgdCA9PSB0eXBlUURSZWN0YW5nbGU6CisgICAgICAgIHYwLCBoMCwgdjEsIGgxID0gc3RydWN0LnVucGFjaygnaGhoaCcsIGRlc2MuZGF0YSkKKyAgICAgICAgcmV0dXJuIGFldHlwZXMuUURSZWN0YW5nbGUodjAsIGgwLCB2MSwgaDEpCisgICAgaWYgdCA9PSB0eXBlUkdCQ29sb3I6CisgICAgICAgIHIsIGcsIGIgPSBzdHJ1Y3QudW5wYWNrKCdoaGgnLCBkZXNjLmRhdGEpCisgICAgICAgIHJldHVybiBhZXR5cGVzLlJHQkNvbG9yKHIsIGcsIGIpCisgICAgIyB0eXBlUm90YXRpb24gY29lcmNlZCB0byB0eXBlQUVSZWNvcmQKKyAgICAjIHR5cGVTY3JhcFN0eWxlcyByZXR1cm5lZCBhcyB1bmtub3duCisgICAgIyB0eXBlU2Vzc2lvbklEIHJldHVybmVkIGFzIHVua25vd24KKyAgICBpZiB0ID09IHR5cGVTaG9ydEZsb2F0OgorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnZicsIGRlc2MuZGF0YSlbMF0KKyAgICBpZiB0ID09IHR5cGVTaG9ydEludGVnZXI6CisgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCdoJywgZGVzYy5kYXRhKVswXQorICAgICMgdHlwZVNNRmxvYXQgaWRlbnRpY2FsIHRvIHR5cGVTaG9ydEZsb2F0CisgICAgIyB0eXBlU01JbnQgaW5kZXRpY2FsIHRvIHR5cGVTaG9ydEludAorICAgICMgdHlwZVN0eWxlZFRleHQgY29lcmNlZCB0byB0eXBlQUVSZWNvcmQKKyAgICBpZiB0ID09IHR5cGVUYXJnZXRJRDoKKyAgICAgICAgcmV0dXJuIG1rdGFyZ2V0aWQoZGVzYy5kYXRhKQorICAgICMgdHlwZVRleHRTdHlsZXMgY29lcmNlZCB0byB0eXBlQUVSZWNvcmQKKyAgICAjIHR5cGVUSUZGIHJldHVybmVkIGFzIHVua25vd24KKyAgICBpZiB0ID09IHR5cGVUcnVlOgorICAgICAgICByZXR1cm4gMQorICAgIGlmIHQgPT0gdHlwZVR5cGU6CisgICAgICAgIHJldHVybiBta3R5cGUoZGVzYy5kYXRhLCBmb3Jtb2R1bGVuYW1lKQorICAgICMKKyAgICAjIFRoZSBmb2xsb3dpbmcgYXJlIHNwZWNpYWwKKyAgICAjCisgICAgaWYgdCA9PSAncmFuZyc6CisgICAgICAgIHJlY29yZCA9IGRlc2MuQUVDb2VyY2VEZXNjKCdyZWNvJykKKyAgICAgICAgcmV0dXJuIG1rcmFuZ2UodW5wYWNrKHJlY29yZCwgZm9ybW9kdWxlbmFtZSkpCisgICAgaWYgdCA9PSAnY21wZCc6CisgICAgICAgIHJlY29yZCA9IGRlc2MuQUVDb2VyY2VEZXNjKCdyZWNvJykKKyAgICAgICAgcmV0dXJuIG1rY29tcGFyaXNvbih1bnBhY2socmVjb3JkLCBmb3Jtb2R1bGVuYW1lKSkKKyAgICBpZiB0ID09ICdsb2dpJzoKKyAgICAgICAgcmVjb3JkID0gZGVzYy5BRUNvZXJjZURlc2MoJ3JlY28nKQorICAgICAgICByZXR1cm4gbWtsb2dpY2FsKHVucGFjayhyZWNvcmQsIGZvcm1vZHVsZW5hbWUpKQorICAgIHJldHVybiBta3Vua25vd24oZGVzYy50eXBlLCBkZXNjLmRhdGEpCisKK2RlZiBjb2VyY2UoZGF0YSwgZWdkYXRhKToKKyAgICAiIiJDb2VyY2UgYSBweXRob24gb2JqZWN0IHRvIGFub3RoZXIgdHlwZSB1c2luZyB0aGUgQUUgY29lcmNlcnMiIiIKKyAgICBwZGF0YSA9IHBhY2soZGF0YSkKKyAgICBwZWdkYXRhID0gcGFjayhlZ2RhdGEpCisgICAgcGRhdGEgPSBwZGF0YS5BRUNvZXJjZURlc2MocGVnZGF0YS50eXBlKQorICAgIHJldHVybiB1bnBhY2socGRhdGEpCisKKyMKKyMgSGVscGVyIHJvdXRpbmVzIGZvciB1bnBhY2sKKyMKK2RlZiBta3RhcmdldGlkKGRhdGEpOgorICAgIHNlc3Npb25JRCA9IGdldGxvbmcoZGF0YVs6NF0pCisgICAgbmFtZSA9IG1rcHBjcG9ydHJlYyhkYXRhWzQ6NCs3Ml0pCisgICAgbG9jYXRpb24gPSBta2xvY2F0aW9ubmFtZXJlYyhkYXRhWzc2Ojc2KzM2XSkKKyAgICByY3ZyTmFtZSA9IG1rcHBjcG9ydHJlYyhkYXRhWzExMjoxMTIrNzJdKQorICAgIHJldHVybiBzZXNzaW9uSUQsIG5hbWUsIGxvY2F0aW9uLCByY3ZyTmFtZQorCitkZWYgbWtwcGNwb3J0cmVjKHJlYyk6CisgICAgbmFtZXNjcmlwdCA9IGdldHdvcmQocmVjWzoyXSkKKyAgICBuYW1lID0gZ2V0cHN0cihyZWNbMjoyKzMzXSkKKyAgICBwb3J0a2luZCA9IGdldHdvcmQocmVjWzM2OjM4XSkKKyAgICBpZiBwb3J0a2luZCA9PSAxOgorICAgICAgICBjdG9yID0gcmVjWzM4OjQyXQorICAgICAgICB0eXBlID0gcmVjWzQyOjQ2XQorICAgICAgICBpZGVudGl0eSA9IChjdG9yLCB0eXBlKQorICAgIGVsc2U6CisgICAgICAgIGlkZW50aXR5ID0gZ2V0cHN0cihyZWNbMzg6MzgrMzNdKQorICAgIHJldHVybiBuYW1lc2NyaXB0LCBuYW1lLCBwb3J0a2luZCwgaWRlbnRpdHkKKworZGVmIG1rbG9jYXRpb25uYW1lcmVjKHJlYyk6CisgICAga2luZCA9IGdldHdvcmQocmVjWzoyXSkKKyAgICBzdHVmZiA9IHJlY1syOl0KKyAgICBpZiBraW5kID09IDA6IHN0dWZmID0gTm9uZQorICAgIGlmIGtpbmQgPT0gMjogc3R1ZmYgPSBnZXRwc3RyKHN0dWZmKQorICAgIHJldHVybiBraW5kLCBzdHVmZgorCitkZWYgbWt1bmtub3duKHR5cGUsIGRhdGEpOgorICAgIHJldHVybiBhZXR5cGVzLlVua25vd24odHlwZSwgZGF0YSkKKworZGVmIGdldHBzdHIocyk6CisgICAgcmV0dXJuIHNbMToxK29yZChzWzBdKV0KKworZGVmIGdldGxvbmcocyk6CisgICAgcmV0dXJuIChvcmQoc1swXSk8PDI0KSB8IChvcmQoc1sxXSk8PDE2KSB8IChvcmQoc1syXSk8PDgpIHwgb3JkKHNbM10pCisKK2RlZiBnZXR3b3JkKHMpOgorICAgIHJldHVybiAob3JkKHNbMF0pPDw4KSB8IChvcmQoc1sxXSk8PDApCisKK2RlZiBta2tleXdvcmQoa2V5d29yZCk6CisgICAgcmV0dXJuIGFldHlwZXMuS2V5d29yZChrZXl3b3JkKQorCitkZWYgbWtyYW5nZShkaWN0KToKKyAgICByZXR1cm4gYWV0eXBlcy5SYW5nZShkaWN0WydzdGFyJ10sIGRpY3RbJ3N0b3AnXSkKKworZGVmIG1rY29tcGFyaXNvbihkaWN0KToKKyAgICByZXR1cm4gYWV0eXBlcy5Db21wYXJpc29uKGRpY3RbJ29iajEnXSwgZGljdFsncmVsbyddLmVudW0sIGRpY3RbJ29iajInXSkKKworZGVmIG1rbG9naWNhbChkaWN0KToKKyAgICByZXR1cm4gYWV0eXBlcy5Mb2dpY2FsKGRpY3RbJ2xvZ2MnXSwgZGljdFsndGVybSddKQorCitkZWYgbWtzdHlsZWR0ZXh0KGRpY3QpOgorICAgIHJldHVybiBhZXR5cGVzLlN0eWxlZFRleHQoZGljdFsna3N0eSddLCBkaWN0WydrdHh0J10pCisKK2RlZiBta2FldGV4dChkaWN0KToKKyAgICByZXR1cm4gYWV0eXBlcy5BRVRleHQoZGljdFtrZXlBRVNjcmlwdFRhZ10sIGRpY3Rba2V5QUVTdHlsZXNdLCBkaWN0W2tleUFFVGV4dF0pCisKK2RlZiBta2luc2VydGlvbmxvYyhkaWN0KToKKyAgICByZXR1cm4gYWV0eXBlcy5JbnNlcnRpb25Mb2MoZGljdFtrZXlBRU9iamVjdF0sIGRpY3Rba2V5QUVQb3NpdGlvbl0pCisKK2RlZiBta29iamVjdChkaWN0KToKKyAgICB3YW50ID0gZGljdFsnd2FudCddLnR5cGUKKyAgICBmb3JtID0gZGljdFsnZm9ybSddLmVudW0KKyAgICBzZWxkID0gZGljdFsnc2VsZCddCisgICAgZnIgICA9IGRpY3RbJ2Zyb20nXQorICAgIGlmIGZvcm0gaW4gKCduYW1lJywgJ2luZHgnLCAncmFuZycsICd0ZXN0Jyk6CisgICAgICAgIGlmIHdhbnQgPT0gJ3RleHQnOiByZXR1cm4gYWV0eXBlcy5UZXh0KHNlbGQsIGZyKQorICAgICAgICBpZiB3YW50ID09ICdjaGEgJzogcmV0dXJuIGFldHlwZXMuQ2hhcmFjdGVyKHNlbGQsIGZyKQorICAgICAgICBpZiB3YW50ID09ICdjd29yJzogcmV0dXJuIGFldHlwZXMuV29yZChzZWxkLCBmcikKKyAgICAgICAgaWYgd2FudCA9PSAnY2xpbic6IHJldHVybiBhZXR5cGVzLkxpbmUoc2VsZCwgZnIpCisgICAgICAgIGlmIHdhbnQgPT0gJ2NwYXInOiByZXR1cm4gYWV0eXBlcy5QYXJhZ3JhcGgoc2VsZCwgZnIpCisgICAgICAgIGlmIHdhbnQgPT0gJ2N3aW4nOiByZXR1cm4gYWV0eXBlcy5XaW5kb3coc2VsZCwgZnIpCisgICAgICAgIGlmIHdhbnQgPT0gJ2RvY3UnOiByZXR1cm4gYWV0eXBlcy5Eb2N1bWVudChzZWxkLCBmcikKKyAgICAgICAgaWYgd2FudCA9PSAnZmlsZSc6IHJldHVybiBhZXR5cGVzLkZpbGUoc2VsZCwgZnIpCisgICAgICAgIGlmIHdhbnQgPT0gJ2NpbnMnOiByZXR1cm4gYWV0eXBlcy5JbnNlcnRpb25Qb2ludChzZWxkLCBmcikKKyAgICBpZiB3YW50ID09ICdwcm9wJyBhbmQgZm9ybSA9PSAncHJvcCcgYW5kIGFldHlwZXMuSXNUeXBlKHNlbGQpOgorICAgICAgICByZXR1cm4gYWV0eXBlcy5Qcm9wZXJ0eShzZWxkLnR5cGUsIGZyKQorICAgIHJldHVybiBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50LCBmb3JtLCBzZWxkLCBmcikKKworIyBOb3RlIGJ5IEphY2s6IEknbSBub3QgMTAwJSBzdXJlIG9mIHRoZSBmb2xsb3dpbmcgY29kZS4gVGhpcyB3YXMKKyMgcHJvdmlkZWQgYnkgRG9ub3ZhbiBQcmVzdG9uLCBidXQgSSB3b25kZXIgd2hldGhlciB0aGUgYXNzaWdubWVudAorIyB0byBfX2NsYXNzX18gaXMgc2FmZS4gTW9yZW92ZXIsIHNob3VsZG4ndCB0aGVyZSBiZSBhIGJldHRlcgorIyBpbml0aWFsaXplciBmb3IgdGhlIGNsYXNzZXMgaW4gdGhlIHN1aXRlcz8KK2RlZiBta29iamVjdGZyb21tb2R1bGUoZGljdCwgbW9kdWxlbmFtZSk6CisgICAgaWYgdHlwZShkaWN0Wyd3YW50J10pID09IHR5cGVzLkNsYXNzVHlwZSBhbmQgaXNzdWJjbGFzcyhkaWN0Wyd3YW50J10sIE9iamVjdFNwZWNpZmllcik6CisgICAgICAgICMgVGhlIHR5cGUgaGFzIGFscmVhZHkgYmVlbiBjb252ZXJ0ZWQgdG8gUHl0aG9uLiBDb252ZXJ0IGJhY2s6LSgKKyAgICAgICAgY2xhc3N0eXBlID0gZGljdFsnd2FudCddCisgICAgICAgIGRpY3RbJ3dhbnQnXSA9IGFldHlwZXMubWt0eXBlKGNsYXNzdHlwZS53YW50KQorICAgIHdhbnQgPSBkaWN0Wyd3YW50J10udHlwZQorICAgIG1vZHVsZSA9IF9faW1wb3J0X18obW9kdWxlbmFtZSkKKyAgICBjb2RlbmFtZW1hcHBlciA9IG1vZHVsZS5fY2xhc3NkZWNsYXJhdGlvbnMKKyAgICBjbGFzc3R5cGUgPSBjb2RlbmFtZW1hcHBlci5nZXQod2FudCwgTm9uZSkKKyAgICBuZXdvYmogPSBta29iamVjdChkaWN0KQorICAgIGlmIGNsYXNzdHlwZToKKyAgICAgICAgYXNzZXJ0IGlzc3ViY2xhc3MoY2xhc3N0eXBlLCBPYmplY3RTcGVjaWZpZXIpCisgICAgICAgIG5ld29iai5fX2NsYXNzX18gPSBjbGFzc3R5cGUKKyAgICByZXR1cm4gbmV3b2JqCisKK2RlZiBta3R5cGUodHlwZWNvZGUsIG1vZHVsZW5hbWU9Tm9uZSk6CisgICAgaWYgbW9kdWxlbmFtZToKKyAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXyhtb2R1bGVuYW1lKQorICAgICAgICBjb2RlbmFtZW1hcHBlciA9IG1vZHVsZS5fY2xhc3NkZWNsYXJhdGlvbnMKKyAgICAgICAgY2xhc3N0eXBlID0gY29kZW5hbWVtYXBwZXIuZ2V0KHR5cGVjb2RlLCBOb25lKQorICAgICAgICBpZiBjbGFzc3R5cGU6CisgICAgICAgICAgICByZXR1cm4gY2xhc3N0eXBlCisgICAgcmV0dXJuIGFldHlwZXMubWt0eXBlKHR5cGVjb2RlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hZXBhY2sucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hZXBhY2sucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNGJjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FlcGFjay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hZXBhY2sucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hZXBhY2sucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjM2I2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FlcGFjay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hZXRvb2xzLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hZXRvb2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDdhMjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FldG9vbHMucHkKQEAgLTAsMCArMSwzNjMgQEAKKyIiIlRvb2xzIGZvciB1c2UgaW4gQXBwbGVFdmVudCBjbGllbnRzIGFuZCBzZXJ2ZXJzLgorCitwYWNrKHgpIGNvbnZlcnRzIGEgUHl0aG9uIG9iamVjdCB0byBhbiBBRURlc2Mgb2JqZWN0Cit1bnBhY2soZGVzYykgZG9lcyB0aGUgcmV2ZXJzZQorCitwYWNrZXZlbnQoZXZlbnQsIHBhcmFtZXRlcnMsIGF0dHJpYnV0ZXMpIHNldHMgcGFyYW1zIGFuZCBhdHRycyBpbiBhbiBBRUFwcGxlRXZlbnQgcmVjb3JkCit1bnBhY2tldmVudChldmVudCkgcmV0dXJucyB0aGUgcGFyYW1ldGVycyBhbmQgYXR0cmlidXRlcyBmcm9tIGFuIEFFQXBwbGVFdmVudCByZWNvcmQKKworUGx1cy4uLiAgTG90cyBvZiBjbGFzc2VzIGFuZCByb3V0aW5lcyB0aGF0IGhlbHAgcmVwcmVzZW50aW5nIEFFIG9iamVjdHMsCityYW5nZXMsIGNvbmRpdGlvbmFscywgbG9naWNhbHMsIGV0Yy4sIHNvIHlvdSBjYW4gd3JpdGUsIGUuZy46CisKKyAgICB4ID0gQ2hhcmFjdGVyKDEsIERvY3VtZW50KCJmb29iYXIiKSkKKworYW5kIHBhY2soeCkgd2lsbCBjcmVhdGUgYW4gQUUgb2JqZWN0IHJlZmVyZW5jZSBlcXVpdmFsZW50IHRvIEFwcGxlU2NyaXB0J3MKKworICAgIGNoYXJhY3RlciAxIG9mIGRvY3VtZW50ICJmb29iYXIiCisKK1NvbWUgb2YgdGhlIHN0dWZmIHRoYXQgYXBwZWFycyB0byBiZSBleHBvcnRlZCBmcm9tIHRoaXMgbW9kdWxlIGNvbWVzIGZyb20gb3RoZXIKK2ZpbGVzOiB0aGUgcGFjayBzdHVmZiBmcm9tIGFlcGFjaywgdGhlIG9iamVjdHMgZnJvbSBhZXR5cGVzLgorCisiIiIKKworCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIGFldG9vbHMgbW9kdWxlIGlzIHJlbW92ZWQuIiwgc3RhY2tsZXZlbD0yKQorCitmcm9tIHR5cGVzIGltcG9ydCAqCitmcm9tIENhcmJvbiBpbXBvcnQgQUUKK2Zyb20gQ2FyYm9uIGltcG9ydCBFdnQKK2Zyb20gQ2FyYm9uIGltcG9ydCBBcHBsZUV2ZW50cworaW1wb3J0IE1hY09TCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorCitmcm9tIGFldHlwZXMgaW1wb3J0ICoKK2Zyb20gYWVwYWNrIGltcG9ydCBwYWNra2V5LCBwYWNrLCB1bnBhY2ssIGNvZXJjZSwgQUVEZXNjVHlwZQorCitFcnJvciA9ICdhZXRvb2xzLkVycm9yJworCisjIEFtb3VudCBvZiB0aW1lIHRvIHdhaXQgZm9yIHByb2dyYW0gdG8gYmUgbGF1bmNoZWQKK0xBVU5DSF9NQVhfV0FJVF9USU1FPTEwCisKKyMgU3BlY2lhbCBjb2RlIHRvIHVucGFjayBhbiBBcHBsZUV2ZW50ICh3aGljaCBpcyAqbm90KiBhIGRpc2d1aXNlZCByZWNvcmQhKQorIyBOb3RlIGJ5IEphY2s6IE5vPz8hPyBJZiBJIHJlYWQgdGhlIGRvY3MgY29ycmVjdGx5IGl0ICppcyouLi4uCisKK2Fla2V5d29yZHMgPSBbCisgICAgJ3RyYW4nLAorICAgICdydGlkJywKKyAgICAnZXZjbCcsCisgICAgJ2V2aWQnLAorICAgICdhZGRyJywKKyAgICAnb3B0aycsCisgICAgJ3RpbW8nLAorICAgICdpbnRlJywgIyB0aGlzIGF0dHJpYnV0ZSBpcyByZWFkIG9ubHkgLSB3aWxsIGJlIHNldCBpbiBBRVNlbmQKKyAgICAnZXNyYycsICMgdGhpcyBhdHRyaWJ1dGUgaXMgcmVhZCBvbmx5CisgICAgJ21pc3MnLCAjIHRoaXMgYXR0cmlidXRlIGlzIHJlYWQgb25seQorICAgICdmcm9tJyAgIyBuZXcgaW4gMS4wLjEKK10KKworZGVmIG1pc3NlZChhZSk6CisgICAgdHJ5OgorICAgICAgICBkZXNjID0gYWUuQUVHZXRBdHRyaWJ1dGVEZXNjKCdtaXNzJywgJ2tleXcnKQorICAgIGV4Y2VwdCBBRS5FcnJvciwgbXNnOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiBkZXNjLmRhdGEKKworZGVmIHVucGFja2V2ZW50KGFlLCBmb3Jtb2R1bGVuYW1lPSIiKToKKyAgICBwYXJhbWV0ZXJzID0ge30KKyAgICB0cnk6CisgICAgICAgIGRpcm9iaiA9IGFlLkFFR2V0UGFyYW1EZXNjKCctLS0tJywgJyoqKionKQorICAgIGV4Y2VwdCBBRS5FcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHBhcmFtZXRlcnNbJy0tLS0nXSA9IHVucGFjayhkaXJvYmosIGZvcm1vZHVsZW5hbWUpCisgICAgICAgIGRlbCBkaXJvYmoKKyAgICAjIFdvcmthcm91bmQgZm9yIHdoYXQgSSBmZWVsIGlzIGEgYnVnIGluIE9TWCAxMC4yOiAnZXJybicgd29uJ3Qgc2hvdyB1cCBpbiBtaXNzZWQuLi4KKyAgICB0cnk6CisgICAgICAgIGRpcm9iaiA9IGFlLkFFR2V0UGFyYW1EZXNjKCdlcnJuJywgJyoqKionKQorICAgIGV4Y2VwdCBBRS5FcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHBhcmFtZXRlcnNbJ2Vycm4nXSA9IHVucGFjayhkaXJvYmosIGZvcm1vZHVsZW5hbWUpCisgICAgICAgIGRlbCBkaXJvYmoKKyAgICB3aGlsZSAxOgorICAgICAgICBrZXkgPSBtaXNzZWQoYWUpCisgICAgICAgIGlmIG5vdCBrZXk6IGJyZWFrCisgICAgICAgIHBhcmFtZXRlcnNba2V5XSA9IHVucGFjayhhZS5BRUdldFBhcmFtRGVzYyhrZXksICcqKioqJyksIGZvcm1vZHVsZW5hbWUpCisgICAgYXR0cmlidXRlcyA9IHt9CisgICAgZm9yIGtleSBpbiBhZWtleXdvcmRzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZXNjID0gYWUuQUVHZXRBdHRyaWJ1dGVEZXNjKGtleSwgJyoqKionKQorICAgICAgICBleGNlcHQgKEFFLkVycm9yLCBNYWNPUy5FcnJvciksIG1zZzoKKyAgICAgICAgICAgIGlmIG1zZ1swXSAhPSAtMTcwMSBhbmQgbXNnWzBdICE9IC0xNzA0OgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBhdHRyaWJ1dGVzW2tleV0gPSB1bnBhY2soZGVzYywgZm9ybW9kdWxlbmFtZSkKKyAgICByZXR1cm4gcGFyYW1ldGVycywgYXR0cmlidXRlcworCitkZWYgcGFja2V2ZW50KGFlLCBwYXJhbWV0ZXJzID0ge30sIGF0dHJpYnV0ZXMgPSB7fSk6CisgICAgZm9yIGtleSwgdmFsdWUgaW4gcGFyYW1ldGVycy5pdGVtcygpOgorICAgICAgICBwYWNra2V5KGFlLCBrZXksIHZhbHVlKQorICAgIGZvciBrZXksIHZhbHVlIGluIGF0dHJpYnV0ZXMuaXRlbXMoKToKKyAgICAgICAgYWUuQUVQdXRBdHRyaWJ1dGVEZXNjKGtleSwgcGFjayh2YWx1ZSkpCisKKyMKKyMgU3VwcG9ydCByb3V0aW5lIGZvciBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBTdWl0ZSBpbnRlcmZhY2VzCisjIFRoZXNlIHJvdXRpbmVzIGFyZSBhbHNvIHVzZWFibGUgZm9yIHRoZSByZXZlcnNlIGZ1bmN0aW9uLgorIworZGVmIGtleXN1YnN0KGFyZ3VtZW50cywga2V5ZGljdCk6CisgICAgIiIiUmVwbGFjZSBsb25nIG5hbWUga2V5cyBieSB0aGVpciA0LWNoYXIgY291bnRlcnBhcnRzLCBhbmQgY2hlY2siIiIKKyAgICBvayA9IGtleWRpY3QudmFsdWVzKCkKKyAgICBmb3IgayBpbiBhcmd1bWVudHMua2V5cygpOgorICAgICAgICBpZiBrIGluIGtleWRpY3Q6CisgICAgICAgICAgICB2ID0gYXJndW1lbnRzW2tdCisgICAgICAgICAgICBkZWwgYXJndW1lbnRzW2tdCisgICAgICAgICAgICBhcmd1bWVudHNba2V5ZGljdFtrXV0gPSB2CisgICAgICAgIGVsaWYgayAhPSAnLS0tLScgYW5kIGsgbm90IGluIG9rOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAnVW5rbm93biBrZXl3b3JkIGFyZ3VtZW50OiAlcyclaworCitkZWYgZW51bXN1YnN0KGFyZ3VtZW50cywga2V5LCBlZGljdCk6CisgICAgIiIiU3Vic3RpdHV0ZSBhIHNpbmdsZSBlbnVtIGtleXdvcmQgYXJndW1lbnQsIGlmIGl0IG9jY3VycyIiIgorICAgIGlmIGtleSBub3QgaW4gYXJndW1lbnRzIG9yIGVkaWN0IGlzIE5vbmU6CisgICAgICAgIHJldHVybgorICAgIHYgPSBhcmd1bWVudHNba2V5XQorICAgIG9rID0gZWRpY3QudmFsdWVzKCkKKyAgICBpZiB2IGluIGVkaWN0OgorICAgICAgICBhcmd1bWVudHNba2V5XSA9IEVudW0oZWRpY3Rbdl0pCisgICAgZWxpZiBub3QgdiBpbiBvazoKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAnVW5rbm93biBlbnVtZXJhdG9yOiAlcycldgorCitkZWYgZGVjb2RlZXJyb3IoYXJndW1lbnRzKToKKyAgICAiIiJDcmVhdGUgdGhlICdiZXN0JyBhcmd1bWVudCBmb3IgYSByYWlzZSBNYWNPUy5FcnJvciIiIgorICAgIGVycm4gPSBhcmd1bWVudHNbJ2Vycm4nXQorICAgIGVycl9hMSA9IGVycm4KKyAgICBpZiAnZXJycycgaW4gYXJndW1lbnRzOgorICAgICAgICBlcnJfYTIgPSBhcmd1bWVudHNbJ2VycnMnXQorICAgIGVsc2U6CisgICAgICAgIGVycl9hMiA9IE1hY09TLkdldEVycm9yU3RyaW5nKGVycm4pCisgICAgaWYgJ2Vyb2InIGluIGFyZ3VtZW50czoKKyAgICAgICAgZXJyX2EzID0gYXJndW1lbnRzWydlcm9iJ10KKyAgICBlbHNlOgorICAgICAgICBlcnJfYTMgPSBOb25lCisKKyAgICByZXR1cm4gKGVycl9hMSwgZXJyX2EyLCBlcnJfYTMpCisKK2NsYXNzIFRhbGtUbzoKKyAgICAiIiJBbiBBRSBjb25uZWN0aW9uIHRvIGFuIGFwcGxpY2F0aW9uIiIiCisgICAgX3NpZ25hdHVyZSA9IE5vbmUgICAjIENhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMKKyAgICBfbW9kdWxlTmFtZSA9IE5vbmUgICMgQ2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcworICAgIF9lbGVtZGljdCA9IHt9ICAgICAgIyBDYW4gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzCisgICAgX3Byb3BkaWN0ID0ge30gICAgICAjIENhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMKKworICAgIF9fZXZlbnRsb29wX2luaXRpYWxpemVkID0gMAorICAgIGRlZiBfX2Vuc3VyZV9XTUF2YWlsYWJsZShrbGFzcyk6CisgICAgICAgIGlmIGtsYXNzLl9fZXZlbnRsb29wX2luaXRpYWxpemVkOiByZXR1cm4gMQorICAgICAgICBpZiBub3QgTWFjT1MuV01BdmFpbGFibGUoKTogcmV0dXJuIDAKKyAgICAgICAgIyBXb3JrYXJvdW5kIGZvciBhIGJ1dCBpbiBNYWNPU1ggMTAuMjogd2UgbXVzdCBoYXZlIGFuIGV2ZW50CisgICAgICAgICMgbG9vcCBiZWZvcmUgd2UgY2FuIGNhbGwgQUVTZW5kLgorICAgICAgICBFdnQuV2FpdE5leHRFdmVudCgwLDApCisgICAgICAgIHJldHVybiAxCisgICAgX19lbnN1cmVfV01BdmFpbGFibGUgPSBjbGFzc21ldGhvZChfX2Vuc3VyZV9XTUF2YWlsYWJsZSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaWduYXR1cmU9Tm9uZSwgc3RhcnQ9MCwgdGltZW91dD0wKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsIHdpdGggYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLgorCisgICAgICAgIEFkZHJlc3NpbmcgdGhlIGFwcGxpY2F0aW9uIGlzIGRvbmUgYnkgc3BlY2lmeWluZyBlaXRoZXIgYQorICAgICAgICA0LWJ5dGUgc2lnbmF0dXJlLCBhbiBBRURlc2Mgb3IgYW4gb2JqZWN0IHRoYXQgd2lsbCBfX2FlcGFja19fCisgICAgICAgIHRvIGFuIEFFRGVzYy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudGFyZ2V0X3NpZ25hdHVyZSA9IE5vbmUKKyAgICAgICAgaWYgc2lnbmF0dXJlIGlzIE5vbmU6CisgICAgICAgICAgICBzaWduYXR1cmUgPSBzZWxmLl9zaWduYXR1cmUKKyAgICAgICAgaWYgdHlwZShzaWduYXR1cmUpID09IEFFRGVzY1R5cGU6CisgICAgICAgICAgICBzZWxmLnRhcmdldCA9IHNpZ25hdHVyZQorICAgICAgICBlbGlmIHR5cGUoc2lnbmF0dXJlKSA9PSBJbnN0YW5jZVR5cGUgYW5kIGhhc2F0dHIoc2lnbmF0dXJlLCAnX19hZXBhY2tfXycpOgorICAgICAgICAgICAgc2VsZi50YXJnZXQgPSBzaWduYXR1cmUuX19hZXBhY2tfXygpCisgICAgICAgIGVsaWYgdHlwZShzaWduYXR1cmUpID09IFN0cmluZ1R5cGUgYW5kIGxlbihzaWduYXR1cmUpID09IDQ6CisgICAgICAgICAgICBzZWxmLnRhcmdldCA9IEFFLkFFQ3JlYXRlRGVzYyhBcHBsZUV2ZW50cy50eXBlQXBwbFNpZ25hdHVyZSwgc2lnbmF0dXJlKQorICAgICAgICAgICAgc2VsZi50YXJnZXRfc2lnbmF0dXJlID0gc2lnbmF0dXJlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJzaWduYXR1cmUgc2hvdWxkIGJlIDQtY2hhciBzdHJpbmcgb3IgQUVEZXNjIgorICAgICAgICBzZWxmLnNlbmRfZmxhZ3MgPSBBcHBsZUV2ZW50cy5rQUVXYWl0UmVwbHkKKyAgICAgICAgc2VsZi5zZW5kX3ByaW9yaXR5ID0gQXBwbGVFdmVudHMua0FFTm9ybWFsUHJpb3JpdHkKKyAgICAgICAgaWYgdGltZW91dDoKKyAgICAgICAgICAgIHNlbGYuc2VuZF90aW1lb3V0ID0gdGltZW91dAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZW5kX3RpbWVvdXQgPSBBcHBsZUV2ZW50cy5rQUVEZWZhdWx0VGltZW91dAorICAgICAgICBpZiBzdGFydDoKKyAgICAgICAgICAgIHNlbGYuX3N0YXJ0KCkKKworICAgIGRlZiBfc3RhcnQoc2VsZik6CisgICAgICAgICIiIlN0YXJ0IHRoZSBhcHBsaWNhdGlvbiwgaWYgaXQgaXMgbm90IHJ1bm5pbmcgeWV0IiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2VuZCgnYXNjcicsICdub29wJykKKyAgICAgICAgZXhjZXB0IEFFLkVycm9yOgorICAgICAgICAgICAgX2xhdW5jaChzZWxmLnRhcmdldF9zaWduYXR1cmUpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShMQVVOQ0hfTUFYX1dBSVRfVElNRSk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmQoJ2FzY3InLCAnbm9vcCcpCisgICAgICAgICAgICAgICAgZXhjZXB0IEFFLkVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDEpCisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgICIiIkRlcHJlY2F0ZWQsIHVzZWQgX3N0YXJ0KCkiIiIKKyAgICAgICAgc2VsZi5fc3RhcnQoKQorCisgICAgZGVmIG5ld2V2ZW50KHNlbGYsIGNvZGUsIHN1YmNvZGUsIHBhcmFtZXRlcnMgPSB7fSwgYXR0cmlidXRlcyA9IHt9KToKKyAgICAgICAgIiIiQ3JlYXRlIGEgY29tcGxldGUgc3RydWN0dXJlIGZvciBhbiBhcHBsZSBldmVudCIiIgorCisgICAgICAgIGV2ZW50ID0gQUUuQUVDcmVhdGVBcHBsZUV2ZW50KGNvZGUsIHN1YmNvZGUsIHNlbGYudGFyZ2V0LAorICAgICAgICAgICAgICAgICAgQXBwbGVFdmVudHMua0F1dG9HZW5lcmF0ZVJldHVybklELCBBcHBsZUV2ZW50cy5rQW55VHJhbnNhY3Rpb25JRCkKKyAgICAgICAgcGFja2V2ZW50KGV2ZW50LCBwYXJhbWV0ZXJzLCBhdHRyaWJ1dGVzKQorICAgICAgICByZXR1cm4gZXZlbnQKKworICAgIGRlZiBzZW5kZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiJTZW5kIGEgcHJlLWNyZWF0ZWQgYXBwbGVldmVudCwgYXdhaXQgdGhlIHJlcGx5IGFuZCB1bnBhY2sgaXQiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX19lbnN1cmVfV01BdmFpbGFibGUoKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIk5vIHdpbmRvdyBtYW5hZ2VyIGFjY2VzcywgY2Fubm90IHNlbmQgQXBwbGVFdmVudCIKKyAgICAgICAgcmVwbHkgPSBldmVudC5BRVNlbmQoc2VsZi5zZW5kX2ZsYWdzLCBzZWxmLnNlbmRfcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX3RpbWVvdXQpCisgICAgICAgIHBhcmFtZXRlcnMsIGF0dHJpYnV0ZXMgPSB1bnBhY2tldmVudChyZXBseSwgc2VsZi5fbW9kdWxlTmFtZSkKKyAgICAgICAgcmV0dXJuIHJlcGx5LCBwYXJhbWV0ZXJzLCBhdHRyaWJ1dGVzCisKKyAgICBkZWYgc2VuZChzZWxmLCBjb2RlLCBzdWJjb2RlLCBwYXJhbWV0ZXJzID0ge30sIGF0dHJpYnV0ZXMgPSB7fSk6CisgICAgICAgICIiIlNlbmQgYW4gYXBwbGVldmVudCBnaXZlbiBjb2RlL3N1YmNvZGUvcGFycy9hdHRycyBhbmQgdW5wYWNrIHRoZSByZXBseSIiIgorICAgICAgICByZXR1cm4gc2VsZi5zZW5kZXZlbnQoc2VsZi5uZXdldmVudChjb2RlLCBzdWJjb2RlLCBwYXJhbWV0ZXJzLCBhdHRyaWJ1dGVzKSkKKworICAgICMKKyAgICAjIFRoZSBmb2xsb3dpbmcgZXZlbnRzIGFyZSBzb21laG93ICJzdGFuZGFyZCIgYW5kIGRvbid0IHNlZW0gdG8gYXBwZWFyIGluIGFueQorICAgICMgc3VpdGUuLi4KKyAgICAjCisgICAgZGVmIGFjdGl2YXRlKHNlbGYpOgorICAgICAgICAiIiJTZW5kICdhY3RpdmF0ZScgY29tbWFuZCIiIgorICAgICAgICBzZWxmLnNlbmQoJ21pc2MnLCAnYWN0dicpCisKKyAgICBkZWYgX2dldChzZWxmLCBfb2JqZWN0LCBhc2ZpbGU9Tm9uZSwgX2F0dHJpYnV0ZXM9e30pOgorICAgICAgICAiIiJfZ2V0OiBnZXQgZGF0YSBmcm9tIGFuIG9iamVjdAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRoZSBkYXRhCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdnZXRkJworCisgICAgICAgIF9hcmd1bWVudHMgPSB7Jy0tLS0nOl9vYmplY3R9CisgICAgICAgIGlmIGFzZmlsZToKKyAgICAgICAgICAgIF9hcmd1bWVudHNbJ3J0eXAnXSA9IG1rdHlwZShhc2ZpbGUpCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmICdlcnJuJyBpbiBfYXJndW1lbnRzOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsIGRlY29kZWVycm9yKF9hcmd1bWVudHMpCisKKyAgICAgICAgaWYgJy0tLS0nIGluIF9hcmd1bWVudHM6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgICAgICBpZiBhc2ZpbGU6CisgICAgICAgICAgICAgICAgaXRlbS5fX2NsYXNzX18gPSBhc2ZpbGUKKyAgICAgICAgICAgIHJldHVybiBpdGVtCisKKyAgICBnZXQgPSBfZ2V0CisKKyAgICBfYXJnbWFwX3NldCA9IHsKKyAgICAgICAgJ3RvJyA6ICdkYXRhJywKKyAgICB9CisKKyAgICBkZWYgX3NldChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIic2V0OiBTZXQgYW4gb2JqZWN0J3MgZGF0YS4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgZm9yIHRoZSBjb21tYW5kCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG86IFRoZSBuZXcgdmFsdWUuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ3NldGQnCisKKyAgICAgICAga2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NldCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiAnLS0tLScgaW4gX2FyZ3VtZW50czoKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIHNldCA9IF9zZXQKKworICAgICMgTWFnaWMgZ2x1ZSB0byBhbGxvdyBzdWl0ZS1nZW5lcmF0ZWQgY2xhc3NlcyB0byBmdW5jdGlvbiBzb21ld2hhdAorICAgICMgbGlrZSB0aGUgImFwcGxpY2F0aW9uIiBjbGFzcyBpbiBPU0EuCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fZWxlbWRpY3Q6CisgICAgICAgICAgICBjbHMgPSBzZWxmLl9lbGVtZGljdFtuYW1lXQorICAgICAgICAgICAgcmV0dXJuIERlbGF5ZWRDb21wb25lbnRJdGVtKGNscywgTm9uZSkKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9wcm9wZGljdDoKKyAgICAgICAgICAgIGNscyA9IHNlbGYuX3Byb3BkaWN0W25hbWVdCisgICAgICAgICAgICByZXR1cm4gY2xzKCkKKyAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKKworIyBUaW55IEZpbmRlciBjbGFzcywgZm9yIGxvY2FsIHVzZSBvbmx5CisKK2NsYXNzIF9taW5pRmluZGVyKFRhbGtUbyk6CisgICAgZGVmIG9wZW4oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIm9wZW46IE9wZW4gdGhlIHNwZWNpZmllZCBvYmplY3QocykKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGxpc3Qgb2Ygb2JqZWN0cyB0byBvcGVuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ29kb2MnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmICdlcnJuJyBpbiBfYXJndW1lbnRzOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsIGRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgJy0tLS0nIGluIF9hcmd1bWVudHM6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisjcGFzcworCitfZmluZGVyID0gX21pbmlGaW5kZXIoJ01BQ1MnKQorCitkZWYgX2xhdW5jaChhcHBmaWxlKToKKyAgICAiIiJPcGVuIGEgZmlsZSB0aHJ1IHRoZSBmaW5kZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYyIiIgorICAgIF9maW5kZXIub3BlbihfYXBwbGljYXRpb25fZmlsZSgoJ0lEICAnLCBhcHBmaWxlKSkpCisKKworY2xhc3MgX2FwcGxpY2F0aW9uX2ZpbGUoQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYXBwbGljYXRpb24gZmlsZSAtIEFuIGFwcGxpY2F0aW9uJ3MgZmlsZSBvbiBkaXNrIiIiCisgICAgd2FudCA9ICdhcHBmJworCitfYXBwbGljYXRpb25fZmlsZS5fcHJvcGRpY3QgPSB7Cit9CitfYXBwbGljYXRpb25fZmlsZS5fZWxlbWRpY3QgPSB7Cit9CisKKyMgVGVzdCBwcm9ncmFtCisjIFhYWFggU2hvdWxkIHRlc3QgbW9yZSwgcmVhbGx5Li4uCisKK2RlZiB0ZXN0KCk6CisgICAgdGFyZ2V0ID0gQUUuQUVDcmVhdGVEZXNjKCdzaWduJywgJ3F1aWwnKQorICAgIGFlID0gQUUuQUVDcmVhdGVBcHBsZUV2ZW50KCdhZXZ0JywgJ29hcHAnLCB0YXJnZXQsIC0xLCAwKQorICAgIHByaW50IHVucGFja2V2ZW50KGFlKQorICAgIHJhd19pbnB1dCgiOiIpCisgICAgYWUgPSBBRS5BRUNyZWF0ZUFwcGxlRXZlbnQoJ2NvcmUnLCAnZ2V0ZCcsIHRhcmdldCwgLTEsIDApCisgICAgb2JqID0gQ2hhcmFjdGVyKDIsIFdvcmQoMSwgRG9jdW1lbnQoMSkpKQorICAgIHByaW50IG9iagorICAgIHByaW50IHJlcHIob2JqKQorICAgIHBhY2tldmVudChhZSwgeyctLS0tJzogb2JqfSkKKyAgICBwYXJhbXMsIGF0dHJzID0gdW5wYWNrZXZlbnQoYWUpCisgICAgcHJpbnQgcGFyYW1zWyctLS0tJ10KKyAgICByYXdfaW5wdXQoIjoiKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQorICAgIHN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FldG9vbHMucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hZXRvb2xzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzI4ZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hZXRvb2xzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FldG9vbHMucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hZXRvb2xzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzI4ZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hZXRvb2xzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FldHlwZXMucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FldHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzMzE1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYWV0eXBlcy5weQpAQCAtMCwwICsxLDU3MSBAQAorIiIiYWV0eXBlcyAtIFB5dGhvbiBvYmplY3RzIHJlcHJlc2VudGluZyB2YXJpb3VzIEFFIHR5cGVzLiIiIgorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIGFldHlwZXMgbW9kdWxlIGlzIHJlbW92ZWQuIiwgc3RhY2tsZXZlbD0yKQorCitmcm9tIENhcmJvbi5BcHBsZUV2ZW50cyBpbXBvcnQgKgoraW1wb3J0IHN0cnVjdAorZnJvbSB0eXBlcyBpbXBvcnQgKgoraW1wb3J0IHN0cmluZworCisjCisjIGNvbnZvbHV0ZWQsIHNpbmNlIHRoZXJlIGFyZSBjeWNsaWMgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhpcyBmaWxlIGFuZAorIyBhZXRvb2xzX2NvbnZlcnQuCisjCitkZWYgcGFjaygqYXJncywgKiprd2FyZ3MpOgorICAgIGZyb20gYWVwYWNrIGltcG9ydCBwYWNrCisgICAgcmV0dXJuIHBhY2soICphcmdzLCAqKmt3YXJncykKKworZGVmIG5pY2Uocyk6CisgICAgIiIiJ25pY2UnIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdCIiIgorICAgIGlmIHR5cGUocykgaXMgU3RyaW5nVHlwZTogcmV0dXJuIHJlcHIocykKKyAgICBlbHNlOiByZXR1cm4gc3RyKHMpCisKK2NsYXNzIFVua25vd246CisgICAgIiIiQW4gdW5pbnRlcnByZXRlZCBBRSBvYmplY3QiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlLCBkYXRhKToKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiVW5rbm93biglciwgJXIpIiAlIChzZWxmLnR5cGUsIHNlbGYuZGF0YSkKKworICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgorICAgICAgICByZXR1cm4gcGFjayhzZWxmLmRhdGEsIHNlbGYudHlwZSkKKworY2xhc3MgRW51bToKKyAgICAiIiJBbiBBRSBlbnVtZXJhdGlvbiB2YWx1ZSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVudW0pOgorICAgICAgICBzZWxmLmVudW0gPSAiJS00LjRzIiAlIHN0cihlbnVtKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkVudW0oJXIpIiAlIChzZWxmLmVudW0sKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHJpbmcuc3RyaXAoc2VsZi5lbnVtKQorCisgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CisgICAgICAgIHJldHVybiBwYWNrKHNlbGYuZW51bSwgdHlwZUVudW1lcmF0aW9uKQorCitkZWYgSXNFbnVtKHgpOgorICAgIHJldHVybiBpc2luc3RhbmNlKHgsIEVudW0pCisKK2RlZiBta2VudW0oZW51bSk6CisgICAgaWYgSXNFbnVtKGVudW0pOiByZXR1cm4gZW51bQorICAgIHJldHVybiBFbnVtKGVudW0pCisKKyMgSmFjayBjaGFuZ2VkIHRoZSB3YXkgdGhpcyBpcyBkb25lCitjbGFzcyBJbnNlcnRpb25Mb2M6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9mLCBwb3MpOgorICAgICAgICBzZWxmLm9mID0gb2YKKyAgICAgICAgc2VsZi5wb3MgPSBwb3MKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJJbnNlcnRpb25Mb2MoJXIsICVyKSIgJSAoc2VsZi5vZiwgc2VsZi5wb3MpCisKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmVjID0geydrb2JqJzogc2VsZi5vZiwgJ2twb3MnOiBzZWxmLnBvc30KKyAgICAgICAgcmV0dXJuIHBhY2socmVjLCBmb3JjZXR5cGU9J2luc2wnKQorCisjIENvbnZlbmllbmNlIGZ1bmN0aW9ucyBmb3IgZHNwOgorZGVmIGJlZ2lubmluZyhvZik6CisgICAgcmV0dXJuIEluc2VydGlvbkxvYyhvZiwgRW51bSgnYmduZycpKQorCitkZWYgZW5kKG9mKToKKyAgICByZXR1cm4gSW5zZXJ0aW9uTG9jKG9mLCBFbnVtKCdlbmQgJykpCisKK2NsYXNzIEJvb2xlYW46CisgICAgIiIiQW4gQUUgYm9vbGVhbiB2YWx1ZSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJvb2wpOgorICAgICAgICBzZWxmLmJvb2wgPSAobm90IG5vdCBib29sKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkJvb2xlYW4oJXIpIiAlIChzZWxmLmJvb2wsKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuYm9vbDoKKyAgICAgICAgICAgIHJldHVybiAiVHJ1ZSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiRmFsc2UiCisKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2InLCBzZWxmLmJvb2wpLCAnYm9vbCcpCisKK2RlZiBJc0Jvb2xlYW4oeCk6CisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgQm9vbGVhbikKKworZGVmIG1rYm9vbGVhbihib29sKToKKyAgICBpZiBJc0Jvb2xlYW4oYm9vbCk6IHJldHVybiBib29sCisgICAgcmV0dXJuIEJvb2xlYW4oYm9vbCkKKworY2xhc3MgVHlwZToKKyAgICAiIiJBbiBBRSA0LWNoYXIgdHlwZW5hbWUgb2JqZWN0IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZSk6CisgICAgICAgIHNlbGYudHlwZSA9ICIlLTQuNHMiICUgc3RyKHR5cGUpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiVHlwZSglcikiICUgKHNlbGYudHlwZSwpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cmluZy5zdHJpcChzZWxmLnR5cGUpCisKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soc2VsZi50eXBlLCB0eXBlVHlwZSkKKworZGVmIElzVHlwZSh4KToKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBUeXBlKQorCitkZWYgbWt0eXBlKHR5cGUpOgorICAgIGlmIElzVHlwZSh0eXBlKTogcmV0dXJuIHR5cGUKKyAgICByZXR1cm4gVHlwZSh0eXBlKQorCisKK2NsYXNzIEtleXdvcmQ6CisgICAgIiIiQW4gQUUgNC1jaGFyIGtleXdvcmQgb2JqZWN0IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwga2V5d29yZCk6CisgICAgICAgIHNlbGYua2V5d29yZCA9ICIlLTQuNHMiICUgc3RyKGtleXdvcmQpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiS2V5d29yZCglcikiICUgcmVwcihzZWxmLmtleXdvcmQpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cmluZy5zdHJpcChzZWxmLmtleXdvcmQpCisKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soc2VsZi5rZXl3b3JkLCB0eXBlS2V5d29yZCkKKworZGVmIElzS2V5d29yZCh4KToKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBLZXl3b3JkKQorCitjbGFzcyBSYW5nZToKKyAgICAiIiJBbiBBRSByYW5nZSBvYmplY3QiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgc3RvcCk6CisgICAgICAgIHNlbGYuc3RhcnQgPSBzdGFydAorICAgICAgICBzZWxmLnN0b3AgPSBzdG9wCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiUmFuZ2UoJXIsICVyKSIgJSAoc2VsZi5zdGFydCwgc2VsZi5zdG9wKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiJXMgdGhydSAlcyIgJSAobmljZShzZWxmLnN0YXJ0KSwgbmljZShzZWxmLnN0b3ApKQorCisgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CisgICAgICAgIHJldHVybiBwYWNrKHsnc3Rhcic6IHNlbGYuc3RhcnQsICdzdG9wJzogc2VsZi5zdG9wfSwgJ3JhbmcnKQorCitkZWYgSXNSYW5nZSh4KToKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBSYW5nZSkKKworY2xhc3MgQ29tcGFyaXNvbjoKKyAgICAiIiJBbiBBRSBDb21wYXJpc29uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb2JqMSwgcmVsbywgb2JqMik6CisgICAgICAgIHNlbGYub2JqMSA9IG9iajEKKyAgICAgICAgc2VsZi5yZWxvID0gIiUtNC40cyIgJSBzdHIocmVsbykKKyAgICAgICAgc2VsZi5vYmoyID0gb2JqMgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkNvbXBhcmlzb24oJXIsICVyLCAlcikiICUgKHNlbGYub2JqMSwgc2VsZi5yZWxvLCBzZWxmLm9iajIpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyAlcyAlcyIgJSAobmljZShzZWxmLm9iajEpLCBzdHJpbmcuc3RyaXAoc2VsZi5yZWxvKSwgbmljZShzZWxmLm9iajIpKQorCisgICAgZGVmIF9fYWVwYWNrX18oc2VsZik6CisgICAgICAgIHJldHVybiBwYWNrKHsnb2JqMSc6IHNlbGYub2JqMSwKKyAgICAgICAgICAgICAgICAgJ3JlbG8nOiBta2VudW0oc2VsZi5yZWxvKSwKKyAgICAgICAgICAgICAgICAgJ29iajInOiBzZWxmLm9iajJ9LAorICAgICAgICAgICAgICAgICdjbXBkJykKKworZGVmIElzQ29tcGFyaXNvbih4KToKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBDb21wYXJpc29uKQorCitjbGFzcyBOQ29tcGFyaXNvbihDb21wYXJpc29uKToKKyAgICAjIFRoZSBjbGFzcyBhdHRyaWJ1dGUgJ3JlbG8nIG11c3QgYmUgc2V0IGluIGEgc3ViY2xhc3MKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYmoxLCBvYmoyKToKKyAgICAgICAgQ29tcGFyaXNvbi5fX2luaXRfXyhvYmoxLCBzZWxmLnJlbG8sIG9iajIpCisKK2NsYXNzIE9yZGluYWw6CisgICAgIiIiQW4gQUUgT3JkaW5hbCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFic28pOgorIyAgICAgICBzZWxmLm9iajEgPSBvYmoxCisgICAgICAgIHNlbGYuYWJzbyA9ICIlLTQuNHMiICUgc3RyKGFic28pCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiT3JkaW5hbCglcikiICUgKHNlbGYuYWJzbywpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyIgJSAoc3RyaW5nLnN0cmlwKHNlbGYuYWJzbykpCisKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soc2VsZi5hYnNvLCAnYWJzbycpCisKK2RlZiBJc09yZGluYWwoeCk6CisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgT3JkaW5hbCkKKworY2xhc3MgTk9yZGluYWwoT3JkaW5hbCk6CisgICAgIyBUaGUgY2xhc3MgYXR0cmlidXRlICdhYnNvJyBtdXN0IGJlIHNldCBpbiBhIHN1YmNsYXNzCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIE9yZGluYWwuX19pbml0X18oc2VsZiwgc2VsZi5hYnNvKQorCitjbGFzcyBMb2dpY2FsOgorICAgICIiIkFuIEFFIGxvZ2ljYWwgZXhwcmVzc2lvbiBvYmplY3QiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2djLCB0ZXJtKToKKyAgICAgICAgc2VsZi5sb2djID0gIiUtNC40cyIgJSBzdHIobG9nYykKKyAgICAgICAgc2VsZi50ZXJtID0gdGVybQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkxvZ2ljYWwoJXIsICVyKSIgJSAoc2VsZi5sb2djLCBzZWxmLnRlcm0pCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgdHlwZShzZWxmLnRlcm0pID09IExpc3RUeXBlIGFuZCBsZW4oc2VsZi50ZXJtKSA9PSAyOgorICAgICAgICAgICAgcmV0dXJuICIlcyAlcyAlcyIgJSAobmljZShzZWxmLnRlcm1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLnN0cmlwKHNlbGYubG9nYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWNlKHNlbGYudGVybVsxXSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIiVzKCVzKSIgJSAoc3RyaW5nLnN0cmlwKHNlbGYubG9nYyksIG5pY2Uoc2VsZi50ZXJtKSkKKworICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgorICAgICAgICByZXR1cm4gcGFjayh7J2xvZ2MnOiBta2VudW0oc2VsZi5sb2djKSwgJ3Rlcm0nOiBzZWxmLnRlcm19LCAnbG9naScpCisKK2RlZiBJc0xvZ2ljYWwoeCk6CisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgTG9naWNhbCkKKworY2xhc3MgU3R5bGVkVGV4dDoKKyAgICAiIiJBbiBBRSBvYmplY3QgcmVzcHJlc2VudGluZyB0ZXh0IGluIGEgY2VydGFpbiBzdHlsZSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0eWxlLCB0ZXh0KToKKyAgICAgICAgc2VsZi5zdHlsZSA9IHN0eWxlCisgICAgICAgIHNlbGYudGV4dCA9IHRleHQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJTdHlsZWRUZXh0KCVyLCAlcikiICUgKHNlbGYuc3R5bGUsIHNlbGYudGV4dCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXh0CisKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soeydrc3R5Jzogc2VsZi5zdHlsZSwgJ2t0eHQnOiBzZWxmLnRleHR9LCAnU1RYVCcpCisKK2RlZiBJc1N0eWxlZFRleHQoeCk6CisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgU3R5bGVkVGV4dCkKKworY2xhc3MgQUVUZXh0OgorICAgICIiIkFuIEFFIHRleHQgb2JqZWN0IHdpdGggc3R5bGUsIHNjcmlwdCBhbmQgbGFuZ3VhZ2Ugc3BlY2lmaWVkIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2NyaXB0LCBzdHlsZSwgdGV4dCk6CisgICAgICAgIHNlbGYuc2NyaXB0ID0gc2NyaXB0CisgICAgICAgIHNlbGYuc3R5bGUgPSBzdHlsZQorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQUVUZXh0KCVyLCAlciwgJXIpIiAlIChzZWxmLnNjcmlwdCwgc2VsZi5zdHlsZSwgc2VsZi50ZXh0KQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRleHQKKworICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgorICAgICAgICByZXR1cm4gcGFjayh7a2V5QUVTY3JpcHRUYWc6IHNlbGYuc2NyaXB0LCBrZXlBRVN0eWxlczogc2VsZi5zdHlsZSwKKyAgICAgICAgICAgICAgICAga2V5QUVUZXh0OiBzZWxmLnRleHR9LCB0eXBlQUVUZXh0KQorCitkZWYgSXNBRVRleHQoeCk6CisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgQUVUZXh0KQorCitjbGFzcyBJbnRsVGV4dDoKKyAgICAiIiJBIHRleHQgb2JqZWN0IHdpdGggc2NyaXB0IGFuZCBsYW5ndWFnZSBzcGVjaWZpZWQiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzY3JpcHQsIGxhbmd1YWdlLCB0ZXh0KToKKyAgICAgICAgc2VsZi5zY3JpcHQgPSBzY3JpcHQKKyAgICAgICAgc2VsZi5sYW5ndWFnZSA9IGxhbmd1YWdlCisgICAgICAgIHNlbGYudGV4dCA9IHRleHQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJJbnRsVGV4dCglciwgJXIsICVyKSIgJSAoc2VsZi5zY3JpcHQsIHNlbGYubGFuZ3VhZ2UsIHNlbGYudGV4dCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXh0CisKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2hoJywgc2VsZi5zY3JpcHQsIHNlbGYubGFuZ3VhZ2UpK3NlbGYudGV4dCwKKyAgICAgICAgICAgIHR5cGVJbnRsVGV4dCkKKworZGVmIElzSW50bFRleHQoeCk6CisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgSW50bFRleHQpCisKK2NsYXNzIEludGxXcml0aW5nQ29kZToKKyAgICAiIiJBbiBvYmplY3QgcmVwcmVzZW50aW5nIHNjcmlwdCBhbmQgbGFuZ3VhZ2UiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzY3JpcHQsIGxhbmd1YWdlKToKKyAgICAgICAgc2VsZi5zY3JpcHQgPSBzY3JpcHQKKyAgICAgICAgc2VsZi5sYW5ndWFnZSA9IGxhbmd1YWdlCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiSW50bFdyaXRpbmdDb2RlKCVyLCAlcikiICUgKHNlbGYuc2NyaXB0LCBzZWxmLmxhbmd1YWdlKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAic2NyaXB0IHN5c3RlbSAlZCwgbGFuZ3VhZ2UgJWQiJShzZWxmLnNjcmlwdCwgc2VsZi5sYW5ndWFnZSkKKworICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgorICAgICAgICByZXR1cm4gcGFjayhzdHJ1Y3QucGFjaygnaGgnLCBzZWxmLnNjcmlwdCwgc2VsZi5sYW5ndWFnZSksCisgICAgICAgICAgICB0eXBlSW50bFdyaXRpbmdDb2RlKQorCitkZWYgSXNJbnRsV3JpdGluZ0NvZGUoeCk6CisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgSW50bFdyaXRpbmdDb2RlKQorCitjbGFzcyBRRFBvaW50OgorICAgICIiIkEgcG9pbnQiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2LCBoKToKKyAgICAgICAgc2VsZi52ID0gdgorICAgICAgICBzZWxmLmggPSBoCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiUURQb2ludCglciwgJXIpIiAlIChzZWxmLnYsIHNlbGYuaCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiglZCwgJWQpIiUoc2VsZi52LCBzZWxmLmgpCisKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2hoJywgc2VsZi52LCBzZWxmLmgpLAorICAgICAgICAgICAgdHlwZVFEUG9pbnQpCisKK2RlZiBJc1FEUG9pbnQoeCk6CisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgUURQb2ludCkKKworY2xhc3MgUURSZWN0YW5nbGU6CisgICAgIiIiQSByZWN0YW5nbGUiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2MCwgaDAsIHYxLCBoMSk6CisgICAgICAgIHNlbGYudjAgPSB2MAorICAgICAgICBzZWxmLmgwID0gaDAKKyAgICAgICAgc2VsZi52MSA9IHYxCisgICAgICAgIHNlbGYuaDEgPSBoMQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlFEUmVjdGFuZ2xlKCVyLCAlciwgJXIsICVyKSIgJSAoc2VsZi52MCwgc2VsZi5oMCwgc2VsZi52MSwgc2VsZi5oMSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiglZCwgJWQpLSglZCwgJWQpIiUoc2VsZi52MCwgc2VsZi5oMCwgc2VsZi52MSwgc2VsZi5oMSkKKworICAgIGRlZiBfX2FlcGFja19fKHNlbGYpOgorICAgICAgICByZXR1cm4gcGFjayhzdHJ1Y3QucGFjaygnaGhoaCcsIHNlbGYudjAsIHNlbGYuaDAsIHNlbGYudjEsIHNlbGYuaDEpLAorICAgICAgICAgICAgdHlwZVFEUmVjdGFuZ2xlKQorCitkZWYgSXNRRFJlY3RhbmdsZSh4KToKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBRRFJlY3RhbmdsZSkKKworY2xhc3MgUkdCQ29sb3I6CisgICAgIiIiQW4gUkdCIGNvbG9yIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgciwgZywgYik6CisgICAgICAgIHNlbGYuciA9IHIKKyAgICAgICAgc2VsZi5nID0gZworICAgICAgICBzZWxmLmIgPSBiCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiUkdCQ29sb3IoJXIsICVyLCAlcikiICUgKHNlbGYuciwgc2VsZi5nLCBzZWxmLmIpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIweCV4IHJlZCwgMHgleCBncmVlbiwgMHgleCBibHVlIiUgKHNlbGYuciwgc2VsZi5nLCBzZWxmLmIpCisKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soc3RydWN0LnBhY2soJ2hoaCcsIHNlbGYuciwgc2VsZi5nLCBzZWxmLmIpLAorICAgICAgICAgICAgdHlwZVJHQkNvbG9yKQorCitkZWYgSXNSR0JDb2xvcih4KToKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBSR0JDb2xvcikKKworY2xhc3MgT2JqZWN0U3BlY2lmaWVyOgorCisgICAgIiIiQSBjbGFzcyBmb3IgY29uc3RydWN0aW5nIGFuZCBtYW5pcHVsYXRpb24gQUUgb2JqZWN0IHNwZWNpZmllcnMgaW4gcHl0aG9uLgorCisgICAgQW4gb2JqZWN0IHNwZWNpZmllciBpcyBhY3R1YWxseSBhIHJlY29yZCB3aXRoIGZvdXIgZmllbGRzOgorCisgICAga2V5IHR5cGUgICAgZGVzY3JpcHRpb24KKyAgICAtLS0gLS0tLSAgICAtLS0tLS0tLS0tLQorCisgICAgJ3dhbnQnICB0eXBlICAgIDQtY2hhciBjbGFzcyBjb2RlIG9mIHRoaW5nIHdlIHdhbnQsCisgICAgICAgICAgICBlLmcuIHdvcmQsIHBhcmFncmFwaCBvciBwcm9wZXJ0eQorCisgICAgJ2Zvcm0nICBlbnVtICAgIGhvdyB3ZSBzcGVjaWZ5IHdoaWNoICd3YW50JyB0aGluZyhzKSB3ZSB3YW50LAorICAgICAgICAgICAgZS5nLiBieSBpbmRleCwgYnkgcmFuZ2UsIGJ5IG5hbWUsIG9yIGJ5IHByb3BlcnR5IHNwZWNpZmllcgorCisgICAgJ3NlbGQnICBhbnkgd2hpY2ggdGhpbmcocykgd2Ugd2FudCwKKyAgICAgICAgICAgIGUuZy4gaXRzIGluZGV4LCBpdHMgbmFtZSwgb3IgaXRzIHByb3BlcnR5IHNwZWNpZmllcgorCisgICAgJ2Zyb20nICBvYmplY3QgIHRoZSBvYmplY3QgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLAorICAgICAgICAgICAgb3IgbnVsbCwgbWVhbmluZyBsb29rIGZvciBpdCBpbiB0aGUgYXBwbGljYXRpb24KKworICAgIE5vdGUgdGhhdCB3ZSBkb24ndCBjYWxsIHRoaXMgY2xhc3MgcGxhaW4gIk9iamVjdCIsIHNpbmNlIHRoYXQgbmFtZQorICAgIGlzIGxpa2VseSB0byBiZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3YW50LCBmb3JtLCBzZWxkLCBmciA9IE5vbmUpOgorICAgICAgICBzZWxmLndhbnQgPSB3YW50CisgICAgICAgIHNlbGYuZm9ybSA9IGZvcm0KKyAgICAgICAgc2VsZi5zZWxkID0gc2VsZAorICAgICAgICBzZWxmLmZyID0gZnIKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcyA9ICJPYmplY3RTcGVjaWZpZXIoJXIsICVyLCAlciIgJSAoc2VsZi53YW50LCBzZWxmLmZvcm0sIHNlbGYuc2VsZCkKKyAgICAgICAgaWYgc2VsZi5mcjoKKyAgICAgICAgICAgIHMgPSBzICsgIiwgJXIpIiAlIChzZWxmLmZyLCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHMgPSBzICsgIikiCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgX19hZXBhY2tfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHBhY2soeyd3YW50JzogbWt0eXBlKHNlbGYud2FudCksCisgICAgICAgICAgICAgICAgICdmb3JtJzogbWtlbnVtKHNlbGYuZm9ybSksCisgICAgICAgICAgICAgICAgICdzZWxkJzogc2VsZi5zZWxkLAorICAgICAgICAgICAgICAgICAnZnJvbSc6IHNlbGYuZnJ9LAorICAgICAgICAgICAgICAgICdvYmogJykKKworZGVmIElzT2JqZWN0U3BlY2lmaWVyKHgpOgorICAgIHJldHVybiBpc2luc3RhbmNlKHgsIE9iamVjdFNwZWNpZmllcikKKworCisjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBzaWdoLi4uCitjbGFzcyBQcm9wZXJ0eShPYmplY3RTcGVjaWZpZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdoaWNoLCBmciA9IE5vbmUsIHdhbnQ9J3Byb3AnKToKKyAgICAgICAgT2JqZWN0U3BlY2lmaWVyLl9faW5pdF9fKHNlbGYsIHdhbnQsICdwcm9wJywgbWt0eXBlKHdoaWNoKSwgZnIpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuZnI6CisgICAgICAgICAgICByZXR1cm4gIlByb3BlcnR5KCVyLCAlcikiICUgKHNlbGYuc2VsZC50eXBlLCBzZWxmLmZyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJQcm9wZXJ0eSglcikiICUgKHNlbGYuc2VsZC50eXBlLCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZyOgorICAgICAgICAgICAgcmV0dXJuICJQcm9wZXJ0eSAlcyBvZiAlcyIgJSAoc3RyKHNlbGYuc2VsZCksIHN0cihzZWxmLmZyKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiUHJvcGVydHkgJXMiICUgc3RyKHNlbGYuc2VsZCkKKworCitjbGFzcyBOUHJvcGVydHkoT2JqZWN0U3BlY2lmaWVyKToKKyAgICAjIFN1YmNsYXNzZXMgKm11c3QqIHNlbGYgYmFzZWNsYXNzIGF0dHJpYnV0ZXM6CisgICAgIyB3YW50IGlzIHRoZSB0eXBlIG9mIHRoaXMgcHJvcGVydHkKKyAgICAjIHdoaWNoIGlzIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoaXMgcHJvcGVydHkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmciA9IE5vbmUpOgorICAgICAgICAjdHJ5OgorICAgICAgICAjICAgZHVtbXkgPSBzZWxmLndhbnQKKyAgICAgICAgI2V4Y2VwdDoKKyAgICAgICAgIyAgIHNlbGYud2FudCA9ICdwcm9wJworICAgICAgICBzZWxmLndhbnQgPSAncHJvcCcKKyAgICAgICAgT2JqZWN0U3BlY2lmaWVyLl9faW5pdF9fKHNlbGYsIHNlbGYud2FudCwgJ3Byb3AnLAorICAgICAgICAgICAgICAgICAgICBta3R5cGUoc2VsZi53aGljaCksIGZyKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBydiA9ICJQcm9wZXJ0eSglciIgJSAoc2VsZi5zZWxkLnR5cGUsKQorICAgICAgICBpZiBzZWxmLmZyOgorICAgICAgICAgICAgcnYgPSBydiArICIsIGZyPSVyIiAlIChzZWxmLmZyLCkKKyAgICAgICAgaWYgc2VsZi53YW50ICE9ICdwcm9wJzoKKyAgICAgICAgICAgIHJ2ID0gcnYgKyAiLCB3YW50PSVyIiAlIChzZWxmLndhbnQsKQorICAgICAgICByZXR1cm4gcnYgKyAiKSIKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZyOgorICAgICAgICAgICAgcmV0dXJuICJQcm9wZXJ0eSAlcyBvZiAlcyIgJSAoc3RyKHNlbGYuc2VsZCksIHN0cihzZWxmLmZyKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiUHJvcGVydHkgJXMiICUgc3RyKHNlbGYuc2VsZCkKKworCitjbGFzcyBTZWxlY3RhYmxlSXRlbShPYmplY3RTcGVjaWZpZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdhbnQsIHNlbGQsIGZyID0gTm9uZSk6CisgICAgICAgIHQgPSB0eXBlKHNlbGQpCisgICAgICAgIGlmIHQgPT0gU3RyaW5nVHlwZToKKyAgICAgICAgICAgIGZvcm0gPSAnbmFtZScKKyAgICAgICAgZWxpZiBJc1JhbmdlKHNlbGQpOgorICAgICAgICAgICAgZm9ybSA9ICdyYW5nJworICAgICAgICBlbGlmIElzQ29tcGFyaXNvbihzZWxkKSBvciBJc0xvZ2ljYWwoc2VsZCk6CisgICAgICAgICAgICBmb3JtID0gJ3Rlc3QnCisgICAgICAgIGVsaWYgdCA9PSBUdXBsZVR5cGU6CisgICAgICAgICAgICAjIEJyZWFrb3V0OiBzcGVjaWZ5IGJvdGggZm9ybSBhbmQgc2VsZCBpbiBhIHR1cGxlCisgICAgICAgICAgICAjIChpZiB5b3Ugd2FudCBJRCBvciByZWxlIG9yIHNvbWVzdWNoKQorICAgICAgICAgICAgZm9ybSwgc2VsZCA9IHNlbGQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvcm0gPSAnaW5keCcKKyAgICAgICAgT2JqZWN0U3BlY2lmaWVyLl9faW5pdF9fKHNlbGYsIHdhbnQsIGZvcm0sIHNlbGQsIGZyKQorCisKK2NsYXNzIENvbXBvbmVudEl0ZW0oU2VsZWN0YWJsZUl0ZW0pOgorICAgICMgRGVyaXZlZCBjbGFzc2VzICptdXN0KiBzZXQgdGhlICpjbGFzcyBhdHRyaWJ1dGUqICd3YW50JyB0byBzb21lIGNvbnN0YW50CisgICAgIyBBbHNvLCBkaWN0aW9uYXJpZXMgX3Byb3BkaWN0IGFuZCBfZWxlbWRpY3QgbXVzdCBiZSBzZXQgdG8gbWFwIHByb3BlcnR5CisgICAgIyBhbmQgZWxlbWVudCBuYW1lcyB0byB0aGUgY29ycmVjdCBjbGFzc2VzCisKKyAgICBfcHJvcGRpY3QgPSB7fQorICAgIF9lbGVtZGljdCA9IHt9CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdoaWNoLCBmciA9IE5vbmUpOgorICAgICAgICBTZWxlY3RhYmxlSXRlbS5fX2luaXRfXyhzZWxmLCBzZWxmLndhbnQsIHdoaWNoLCBmcikKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZnI6CisgICAgICAgICAgICByZXR1cm4gIiVzKCVyKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuc2VsZCkKKyAgICAgICAgcmV0dXJuICIlcyglciwgJXIpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5zZWxkLCBzZWxmLmZyKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHNlbGQgPSBzZWxmLnNlbGQKKyAgICAgICAgaWYgdHlwZShzZWxkKSA9PSBTdHJpbmdUeXBlOgorICAgICAgICAgICAgc3MgPSByZXByKHNlbGQpCisgICAgICAgIGVsaWYgSXNSYW5nZShzZWxkKToKKyAgICAgICAgICAgIHN0YXJ0LCBzdG9wID0gc2VsZC5zdGFydCwgc2VsZC5zdG9wCisgICAgICAgICAgICBpZiB0eXBlKHN0YXJ0KSA9PSBJbnN0YW5jZVR5cGUgPT0gdHlwZShzdG9wKSBhbmQgXAorICAgICAgICAgICAgICAgc3RhcnQuX19jbGFzc19fID09IHNlbGYuX19jbGFzc19fID09IHN0b3AuX19jbGFzc19fOgorICAgICAgICAgICAgICAgIHNzID0gc3RyKHN0YXJ0LnNlbGQpICsgIiB0aHJ1ICIgKyBzdHIoc3RvcC5zZWxkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzcyA9IHN0cihzZWxkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3MgPSBzdHIoc2VsZCkKKyAgICAgICAgcyA9ICIlcyAlcyIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNzKQorICAgICAgICBpZiBzZWxmLmZyOiBzID0gcyArICIgb2YgJXMiICUgc3RyKHNlbGYuZnIpCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fZWxlbWRpY3Q6CisgICAgICAgICAgICBjbHMgPSBzZWxmLl9lbGVtZGljdFtuYW1lXQorICAgICAgICAgICAgcmV0dXJuIERlbGF5ZWRDb21wb25lbnRJdGVtKGNscywgc2VsZikKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9wcm9wZGljdDoKKyAgICAgICAgICAgIGNscyA9IHNlbGYuX3Byb3BkaWN0W25hbWVdCisgICAgICAgICAgICByZXR1cm4gY2xzKHNlbGYpCisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBuYW1lCisKKworY2xhc3MgRGVsYXllZENvbXBvbmVudEl0ZW06CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbXBjbGFzcywgZnIpOgorICAgICAgICBzZWxmLmNvbXBjbGFzcyA9IGNvbXBjbGFzcworICAgICAgICBzZWxmLmZyID0gZnIKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCB3aGljaCk6CisgICAgICAgIHJldHVybiBzZWxmLmNvbXBjbGFzcyh3aGljaCwgc2VsZi5mcikKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyg/Pz8sICVyKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuZnIpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJzZWxlY3RvciBmb3IgZWxlbWVudCAlcyBvZiAlcyIlKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHIoc2VsZi5mcikpCisKK3RlbXBsYXRlID0gIiIiCitjbGFzcyAlcyhDb21wb25lbnRJdGVtKTogd2FudCA9ICclcycKKyIiIgorCitleGVjIHRlbXBsYXRlICUgKCJUZXh0IiwgJ3RleHQnKQorZXhlYyB0ZW1wbGF0ZSAlICgiQ2hhcmFjdGVyIiwgJ2NoYSAnKQorZXhlYyB0ZW1wbGF0ZSAlICgiV29yZCIsICdjd29yJykKK2V4ZWMgdGVtcGxhdGUgJSAoIkxpbmUiLCAnY2xpbicpCitleGVjIHRlbXBsYXRlICUgKCJwYXJhZ3JhcGgiLCAnY3BhcicpCitleGVjIHRlbXBsYXRlICUgKCJXaW5kb3ciLCAnY3dpbicpCitleGVjIHRlbXBsYXRlICUgKCJEb2N1bWVudCIsICdkb2N1JykKK2V4ZWMgdGVtcGxhdGUgJSAoIkZpbGUiLCAnZmlsZScpCitleGVjIHRlbXBsYXRlICUgKCJJbnNlcnRpb25Qb2ludCIsICdjaW5zJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYWV0eXBlcy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FldHlwZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzAxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FldHlwZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYWV0eXBlcy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FldHlwZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzAxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FldHlwZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXBwbGVzaW5nbGUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOTYyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5CkBAIC0wLDAgKzEsMTQ2IEBACityIiIiUm91dGluZXMgdG8gZGVjb2RlIEFwcGxlU2luZ2xlIGZpbGVzCisiIiIKKworZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJJbiAzLngsIHRoZSBhcHBsZXNpbmdsZSBtb2R1bGUgaXMgcmVtb3ZlZC4iLCBzdGFja2xldmVsPTIpCisKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBzeXMKK3RyeToKKyAgICBpbXBvcnQgTWFjT1MKKyAgICBpbXBvcnQgQ2FyYm9uLkZpbGUKK2V4Y2VwdDoKKyAgICBjbGFzcyBNYWNPUzoKKyAgICAgICAgZGVmIG9wZW5yZihwYXRoLCBtb2RlKToKKyAgICAgICAgICAgIHJldHVybiBvcGVuKHBhdGggKyAnLnJzcmMnLCBtb2RlKQorICAgICAgICBvcGVucmYgPSBjbGFzc21ldGhvZChvcGVucmYpCisgICAgY2xhc3MgQ2FyYm9uOgorICAgICAgICBjbGFzcyBGaWxlOgorICAgICAgICAgICAgY2xhc3MgRlNTcGVjOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGNsYXNzIEZTUmVmOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGNsYXNzIEFsaWFzOgorICAgICAgICAgICAgICAgIHBhc3MKKworIyBhbGwgb2YgdGhlIGVycm9ycyBpbiB0aGlzIG1vZHVsZSBhcmUgcmVhbGx5IGVycm9ycyBpbiB0aGUgaW5wdXQKKyMgc28gSSB0aGluayBpdCBzaG91bGQgdGVzdCBwb3NpdGl2ZSBhZ2FpbnN0IFZhbHVlRXJyb3IuCitjbGFzcyBFcnJvcihWYWx1ZUVycm9yKToKKyAgICBwYXNzCisKKyMgRmlsZSBoZWFkZXIgZm9ybWF0OiBtYWdpYywgdmVyc2lvbiwgdW51c2VkLCBudW1iZXIgb2YgZW50cmllcworQVNfSEVBREVSX0ZPUk1BVD0iPkxMMTZzaCIKK0FTX0hFQURFUl9MRU5HVEg9MjYKKyMgVGhlIGZsYWcgd29yZHMgZm9yIEFwcGxlU2luZ2xlCitBU19NQUdJQz0weDAwMDUxNjAwCitBU19WRVJTSU9OPTB4MDAwMjAwMDAKKworIyBFbnRyeSBoZWFkZXIgZm9ybWF0OiBpZCwgb2Zmc2V0LCBsZW5ndGgKK0FTX0VOVFJZX0ZPUk1BVD0iPmxsbCIKK0FTX0VOVFJZX0xFTkdUSD0xMgorCisjIFRoZSBpZCB2YWx1ZXMKK0FTX0RBVEFGT1JLPTEKK0FTX1JFU09VUkNFRk9SSz0yCitBU19JR05PUkU9KDMsNCw1LDYsOCw5LDEwLDExLDEyLDEzLDE0LDE1KQorCitjbGFzcyBBcHBsZVNpbmdsZShvYmplY3QpOgorICAgIGRhdGFmb3JrID0gTm9uZQorICAgIHJlc291cmNlZm9yayA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqLCB2ZXJib3NlPUZhbHNlKToKKyAgICAgICAgaGVhZGVyID0gZmlsZW9iai5yZWFkKEFTX0hFQURFUl9MRU5HVEgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1hZ2ljLCB2ZXJzaW9uLCBpZywgbmVudHJ5ID0gc3RydWN0LnVucGFjayhBU19IRUFERVJfRk9STUFULCBoZWFkZXIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBhcmc6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgIlVucGFjayBoZWFkZXIgZXJyb3I6ICVzIiAlIChhcmcsKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ01hZ2ljOiAgIDB4JTguOHgnICUgKG1hZ2ljLCkKKyAgICAgICAgICAgIHByaW50ICdWZXJzaW9uOiAweCU4Ljh4JyAlICh2ZXJzaW9uLCkKKyAgICAgICAgICAgIHByaW50ICdFbnRyaWVzOiAlZCcgJSAobmVudHJ5LCkKKyAgICAgICAgaWYgbWFnaWMgIT0gQVNfTUFHSUM6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgIlVua25vd24gQXBwbGVTaW5nbGUgbWFnaWMgbnVtYmVyIDB4JTguOHgiICUgKG1hZ2ljLCkKKyAgICAgICAgaWYgdmVyc2lvbiAhPSBBU19WRVJTSU9OOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJVbmtub3duIEFwcGxlU2luZ2xlIHZlcnNpb24gbnVtYmVyIDB4JTguOHgiICUgKHZlcnNpb24sKQorICAgICAgICBpZiBuZW50cnkgPD0gMDoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAiQXBwbGVTaW5nbGUgZmlsZSBjb250YWlucyBubyBmb3JrcyIKKyAgICAgICAgaGVhZGVycyA9IFtmaWxlb2JqLnJlYWQoQVNfRU5UUllfTEVOR1RIKSBmb3IgaSBpbiB4cmFuZ2UobmVudHJ5KV0KKyAgICAgICAgc2VsZi5mb3JrcyA9IFtdCisgICAgICAgIGZvciBoZHIgaW4gaGVhZGVyczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN0eXBlLCBvZmZzZXQsIGxlbmd0aCA9IHN0cnVjdC51bnBhY2soQVNfRU5UUllfRk9STUFULCBoZHIpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgYXJnOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAiVW5wYWNrIGVudHJ5IGVycm9yOiAlcyIgJSAoYXJnLCkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIkZvcmsgJWQsIG9mZnNldCAlZCwgbGVuZ3RoICVkIiAlIChyZXN0eXBlLCBvZmZzZXQsIGxlbmd0aCkKKyAgICAgICAgICAgIGZpbGVvYmouc2VlayhvZmZzZXQpCisgICAgICAgICAgICBkYXRhID0gZmlsZW9iai5yZWFkKGxlbmd0aCkKKyAgICAgICAgICAgIGlmIGxlbihkYXRhKSAhPSBsZW5ndGg6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJTaG9ydCByZWFkOiBleHBlY3RlZCAlZCBieXRlcyBnb3QgJWQiICUgKGxlbmd0aCwgbGVuKGRhdGEpKQorICAgICAgICAgICAgc2VsZi5mb3Jrcy5hcHBlbmQoKHJlc3R5cGUsIGRhdGEpKQorICAgICAgICAgICAgaWYgcmVzdHlwZSA9PSBBU19EQVRBRk9SSzoKKyAgICAgICAgICAgICAgICBzZWxmLmRhdGFmb3JrID0gZGF0YQorICAgICAgICAgICAgZWxpZiByZXN0eXBlID09IEFTX1JFU09VUkNFRk9SSzoKKyAgICAgICAgICAgICAgICBzZWxmLnJlc291cmNlZm9yayA9IGRhdGEKKworICAgIGRlZiB0b2ZpbGUoc2VsZiwgcGF0aCwgcmVzb25seT1GYWxzZSk6CisgICAgICAgIG91dGZpbGUgPSBvcGVuKHBhdGgsICd3YicpCisgICAgICAgIGRhdGEgPSBGYWxzZQorICAgICAgICBpZiByZXNvbmx5OgorICAgICAgICAgICAgaWYgc2VsZi5yZXNvdXJjZWZvcmsgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgIk5vIHJlc291cmNlIGZvcmsgZm91bmQiCisgICAgICAgICAgICBmcCA9IG9wZW4ocGF0aCwgJ3diJykKKyAgICAgICAgICAgIGZwLndyaXRlKHNlbGYucmVzb3VyY2Vmb3JrKQorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBlbGlmIChzZWxmLnJlc291cmNlZm9yayBpcyBOb25lIGFuZCBzZWxmLmRhdGFmb3JrIGlzIE5vbmUpOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJObyB1c2VmdWwgZm9ya3MgZm91bmQiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLmRhdGFmb3JrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGZwID0gb3BlbihwYXRoLCAnd2InKQorICAgICAgICAgICAgICAgIGZwLndyaXRlKHNlbGYuZGF0YWZvcmspCisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAgICAgaWYgc2VsZi5yZXNvdXJjZWZvcmsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZnAgPSBNYWNPUy5vcGVucmYocGF0aCwgJyp3YicpCisgICAgICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5yZXNvdXJjZWZvcmspCisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorCitkZWYgZGVjb2RlKGluZmlsZSwgb3V0cGF0aCwgcmVzb25seT1GYWxzZSwgdmVyYm9zZT1GYWxzZSk6CisgICAgIiIiZGVjb2RlKGluZmlsZSwgb3V0cGF0aCBbLCByZXNvbmx5PUZhbHNlLCB2ZXJib3NlPUZhbHNlXSkKKworICAgIENyZWF0ZXMgYSBkZWNvZGVkIGZpbGUgZnJvbSBhbiBBcHBsZVNpbmdsZSBlbmNvZGVkIGZpbGUuCisgICAgSWYgcmVzb25seSBpcyBUcnVlLCB0aGVuIGl0IHdpbGwgY3JlYXRlIGEgcmVndWxhciBmaWxlIGF0CisgICAgb3V0cGF0aCBjb250YWluaW5nIG9ubHkgdGhlIHJlc291cmNlIGZvcmsgZnJvbSBpbmZpbGUuCisgICAgT3RoZXJ3aXNlIGl0IHdpbGwgY3JlYXRlIGFuIEFwcGxlRG91YmxlIGZpbGUgYXQgb3V0cGF0aAorICAgIHdpdGggdGhlIGRhdGEgYW5kIHJlc291cmNlIGZvcmtzIGZyb20gaW5maWxlLiAgT24gcGxhdGZvcm1zCisgICAgd2l0aG91dCB0aGUgTWFjT1MgbW9kdWxlLCBpdCB3aWxsIGNyZWF0ZSBpbnBhdGggYW5kIGlucGF0aCsnLnJzcmMnCisgICAgd2l0aCB0aGUgZGF0YSBhbmQgcmVzb3VyY2UgZm9ya3MgcmVzcGVjdGl2ZWx5LgorCisgICAgIiIiCisgICAgaWYgbm90IGhhc2F0dHIoaW5maWxlLCAncmVhZCcpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGluZmlsZSwgQ2FyYm9uLkZpbGUuQWxpYXMpOgorICAgICAgICAgICAgaW5maWxlID0gaW5maWxlLlJlc29sdmVBbGlhcygpWzBdCisKKyAgICAgICAgaWYgaGFzYXR0cihDYXJib24uRmlsZSwgIkZTU3BlYyIpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpbmZpbGUsIChDYXJib24uRmlsZS5GU1NwZWMsIENhcmJvbi5GaWxlLkZTUmVmKSk6CisgICAgICAgICAgICAgICAgaW5maWxlID0gaW5maWxlLmFzX3BhdGhuYW1lKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5maWxlLCBDYXJib24uRmlsZS5GU1JlZik6CisgICAgICAgICAgICAgICAgaW5maWxlID0gaW5maWxlLmFzX3BhdGhuYW1lKCkKKyAgICAgICAgaW5maWxlID0gb3BlbihpbmZpbGUsICdyYicpCisKKyAgICBhc2ZpbGUgPSBBcHBsZVNpbmdsZShpbmZpbGUsIHZlcmJvc2U9dmVyYm9zZSkKKyAgICBhc2ZpbGUudG9maWxlKG91dHBhdGgsIHJlc29ubHk9cmVzb25seSkKKworZGVmIF90ZXN0KCk6CisgICAgaWYgbGVuKHN5cy5hcmd2KSA8IDMgb3Igc3lzLmFyZ3ZbMV0gPT0gJy1yJyBhbmQgbGVuKHN5cy5hcmd2KSAhPSA0OgorICAgICAgICBwcmludCAnVXNhZ2U6IGFwcGxlc2luZ2xlLnB5IFstcl0gYXBwbGVzaW5nbGVmaWxlIGRlY29kZWRmaWxlJworICAgICAgICBzeXMuZXhpdCgxKQorICAgIGlmIHN5cy5hcmd2WzFdID09ICctcic6CisgICAgICAgIHJlc29ubHkgPSBUcnVlCisgICAgICAgIGRlbCBzeXMuYXJndlsxXQorICAgIGVsc2U6CisgICAgICAgIHJlc29ubHkgPSBGYWxzZQorICAgIGRlY29kZShzeXMuYXJndlsxXSwgc3lzLmFyZ3ZbMl0sIHJlc29ubHk9cmVzb25seSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXBwbGVzaW5nbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDU1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXBwbGVzaW5nbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDU1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FwcGxldHJhd21haW4ucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FwcGxldHJhd21haW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2MzQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXBwbGV0cmF3bWFpbi5weQpAQCAtMCwwICsxLDY3IEBACisjIEVtdWxhdGUgc3lzLmFyZ3YgYW5kIHJ1biBfX21haW5fXy5weSBvciBfX21haW5fXy5weWMgaW4gYW4gZW52aXJvbm1lbnQgdGhhdAorIyBpcyBhcyBjbG9zZSB0byAibm9ybWFsIiBhcyBwb3NzaWJsZS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgcHV0IGludG8gX19yYXdtYWluX18ucHljIGZvciBhcHBsZXRzIHRoYXQgbmVlZCBhcmd2CisjIGVtdWxhdGlvbiwgYnkgQnVpbGRBcHBsZXQgYW5kIGZyaWVuZHMuCisjCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgYXBwbGV0cmF3bWFpbiBtb2R1bGUgaXMgcmVtb3ZlZC4iLCBzdGFja2xldmVsPTIpCisKK2ltcG9ydCBhcmd2ZW11bGF0b3IKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IG1hcnNoYWwKKworIworIyBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBhcmd2WzBdLCBhbmQgbWFrZSBfZGlyIHBvaW50IHRvIHRoZSBSZXNvdXJjZXMKKyMgZGlyZWN0b3J5LgorIworaWYgbm90IHN5cy5hcmd2IG9yIHN5cy5hcmd2WzBdWzoxXSA9PSAnLSc6CisgICAgIyBJbnNlcnQgb3VyIChndWVzc2VkKSBuYW1lLgorICAgIF9kaXIgPSBvcy5wYXRoLnNwbGl0KHN5cy5leGVjdXRhYmxlKVswXSAjIHJlbW92ZXMgInB5dGhvbiIKKyAgICBfZGlyID0gb3MucGF0aC5zcGxpdChfZGlyKVswXSAjIFJlbW92ZXMgIk1hY09TIgorICAgIF9kaXIgPSBvcy5wYXRoLmpvaW4oX2RpciwgJ1Jlc291cmNlcycpCisgICAgc3lzLmFyZ3YuaW5zZXJ0KDAsICdfX3Jhd21haW5fXycpCitlbHNlOgorICAgIF9kaXIgPSBvcy5wYXRoLnNwbGl0KHN5cy5hcmd2WzBdKVswXQorIworIyBBZGQgdGhlIFJlc291cmNlcyBkaXJlY3RvcnkgdG8gdGhlIHBhdGguIFRoaXMgaXMgd2hlcmUgZmlsZXMgaW5zdGFsbGVkCisjIGJ5IEJ1aWxkQXBwbGV0LnB5IHdpdGggdGhlIC0tZXh0cmEgb3B0aW9uIHNob3cgdXAsIGFuZCBpZiB0aG9zZSBmaWxlcyBhcmUKKyMgbW9kdWxlcyB0aGlzIHN5cy5wYXRoIG1vZGlmaWNhdGlvbiBpcyBuZWNlc3NhcnkgdG8gYmUgYWJsZSB0byBpbXBvcnQgdGhlbS4KKyMKK3N5cy5wYXRoLmluc2VydCgwLCBfZGlyKQorIworIyBDcmVhdGUgc3lzLmFyZ3YKKyMKK2FyZ3ZlbXVsYXRvci5Bcmd2Q29sbGVjdG9yKCkubWFpbmxvb3AoKQorIworIyBGaW5kIHRoZSByZWFsIG1haW4gcHJvZ3JhbSB0byBydW4KKyMKK19fZmlsZV9fID0gb3MucGF0aC5qb2luKF9kaXIsICdfX21haW5fXy5weScpCitpZiBvcy5wYXRoLmV4aXN0cyhfX2ZpbGVfXyk6CisgICAgIworICAgICMgU2V0dXAgc29tZXRoaW5nIHJlc2VtYmxpbmcgYSBub3JtYWwgZW52aXJvbm1lbnQgYW5kIGdvLgorICAgICMKKyAgICBzeXMuYXJndlswXSA9IF9fZmlsZV9fCisgICAgZGVsIGFyZ3ZlbXVsYXRvciwgb3MsIHN5cywgX2RpcgorICAgIGV4ZWNmaWxlKF9fZmlsZV9fKQorZWxzZToKKyAgICBfX2ZpbGVfXyA9IG9zLnBhdGguam9pbihfZGlyLCAnX19tYWluX18ucHljJykKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhfX2ZpbGVfXyk6CisgICAgICAgICMKKyAgICAgICAgIyBJZiB3ZSBoYXZlIG9ubHkgYSAucHljIGZpbGUgd2UgcmVhZCB0aGUgY29kZSBvYmplY3QgZnJvbSB0aGF0CisgICAgICAgICMKKyAgICAgICAgc3lzLmFyZ3ZbMF0gPSBfX2ZpbGVfXworICAgICAgICBfZnAgPSBvcGVuKF9fZmlsZV9fLCAncmInKQorICAgICAgICBfZnAucmVhZCg4KQorICAgICAgICBfX2NvZGVfXyA9IG1hcnNoYWwubG9hZChfZnApCisgICAgICAgICMKKyAgICAgICAgIyBBZ2Fpbiwgd2UgY3JlYXRlIGFuIGFsbW9zdC1ub3JtYWwgZW52aXJvbm1lbnQgKG9ubHkgX19jb2RlX18gaXMKKyAgICAgICAgIyBmdW5ueSkgYW5kIGdvLgorICAgICAgICAjCisgICAgICAgIGRlbCBhcmd2ZW11bGF0b3IsIG9zLCBzeXMsIG1hcnNoYWwsIF9kaXIsIF9mcAorICAgICAgICBleGVjIF9fY29kZV9fCisgICAgZWxzZToKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiJXM6IG5laXRoZXIgX19tYWluX18ucHkgbm9yIF9fbWFpbl9fLnB5YyBmb3VuZFxuIiVzeXMuYXJndlswXSkKKyAgICAgICAgc3lzLmV4aXQoMSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXBwbGV0cmF3bWFpbi5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FwcGxldHJhd21haW4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzNhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FwcGxldHJhd21haW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXBwbGV0cmF3bWFpbi5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FwcGxldHJhd21haW4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzNhZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2FwcGxldHJhd21haW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXBwbGV0cnVubmVyLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hcHBsZXRydW5uZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2RmZDQxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXBwbGV0cnVubmVyLnB5CkBAIC0wLDAgKzEsMjAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBUaGlzIGZpbGUgaXMgbWVhbnQgYXMgYW4gZXhlY3V0YWJsZSBzY3JpcHQgZm9yIHJ1bm5pbmcgYXBwbGV0cy4KKyMgQnVpbGRBcHBsZXQgd2lsbCB1c2UgaXQgYXMgdGhlIG1haW4gZXhlY3V0YWJsZSBpbiB0aGUgLmFwcCBidW5kbGUgaWYKKyMgd2UgYXJlIG5vdCBydW5uaW5nIGluIGEgZnJhbWV3b3JrIGJ1aWxkLgorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIGFwcGxldHJ1bm5lciBtb2R1bGUgaXMgcmVtb3ZlZC4iLCBzdGFja2xldmVsPTIpCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZm9yIG5hbWUgaW4gWyJfX3Jhd21haW5fXy5weSIsICJfX3Jhd21haW5fXy5weWMiLCAiX19tYWluX18ucHkiLCAiX19tYWluX18ucHljIl06CisgICAgcmVhbG1haW4gPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSkpLAorICAgICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZXMiLCBuYW1lKQorICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlYWxtYWluKToKKyAgICAgICAgYnJlYWsKK2Vsc2U6CisgICAgc3lzLnN0ZGVyci53cml0ZSgiJXM6IGNhbm5vdCBmaW5kIGFwcGxldCBtYWluIHByb2dyYW1cbiIgJSBzeXMuYXJndlswXSkKKyAgICBzeXMuZXhpdCgxKQorc3lzLmFyZ3YuaW5zZXJ0KDEsIHJlYWxtYWluKQorb3MuZXhlY3ZlKHN5cy5leGVjdXRhYmxlLCBzeXMuYXJndiwgb3MuZW52aXJvbikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXBwbGV0cnVubmVyLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXBwbGV0cnVubmVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjlmZjNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hcHBsZXRydW5uZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXBwbGV0cnVubmVyLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXBwbGV0cnVubmVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjlmZjNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hcHBsZXRydW5uZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXJndmVtdWxhdG9yLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hcmd2ZW11bGF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmYzlmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXJndmVtdWxhdG9yLnB5CkBAIC0wLDAgKzEsOTIgQEAKKyIiImFyZ3ZlbXVsYXRvciAtIGNyZWF0ZSBzeXMuYXJndiBmcm9tIE9TQSBldmVudHMuIFVzZWQgYnkgYXBwbGV0cyB0aGF0Cit3YW50IHVuaXgtc3R5bGUgYXJndW1lbnRzLgorIiIiCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgYXJndmVtdWxhdG9yIG1vZHVsZSBpcyByZW1vdmVkLiIsIHN0YWNrbGV2ZWw9MikKKworaW1wb3J0IHN5cworaW1wb3J0IHRyYWNlYmFjaworZnJvbSBDYXJib24gaW1wb3J0IEFFCitmcm9tIENhcmJvbi5BcHBsZUV2ZW50cyBpbXBvcnQgKgorZnJvbSBDYXJib24gaW1wb3J0IEV2dAorZnJvbSBDYXJib24gaW1wb3J0IEZpbGUKK2Zyb20gQ2FyYm9uLkV2ZW50cyBpbXBvcnQgKgoraW1wb3J0IGFldG9vbHMKKworY2xhc3MgQXJndkNvbGxlY3RvcjoKKworICAgICIiIkEgbWluaW1hbCBGcmFtZVdvcmsuQXBwbGljYXRpb24tbGlrZSBjbGFzcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnF1aXR0aW5nID0gMAorICAgICAgICAjIFJlbW92ZSB0aGUgZnVubnkgLXBzbl94eHhfeHh4IGFyZ3VtZW50CisgICAgICAgIGlmIGxlbihzeXMuYXJndikgPiAxIGFuZCBzeXMuYXJndlsxXVs6NF0gPT0gJy1wc24nOgorICAgICAgICAgICAgZGVsIHN5cy5hcmd2WzFdCisKKyAgICAgICAgQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKGtDb3JlRXZlbnRDbGFzcywga0FFT3BlbkFwcGxpY2F0aW9uLCBzZWxmLl9fcnVuYXBwKQorICAgICAgICBBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoa0NvcmVFdmVudENsYXNzLCBrQUVPcGVuRG9jdW1lbnRzLCBzZWxmLl9fb3BlbmZpbGVzKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBBRS5BRVJlbW92ZUV2ZW50SGFuZGxlcihrQ29yZUV2ZW50Q2xhc3MsIGtBRU9wZW5BcHBsaWNhdGlvbikKKyAgICAgICAgQUUuQUVSZW1vdmVFdmVudEhhbmRsZXIoa0NvcmVFdmVudENsYXNzLCBrQUVPcGVuRG9jdW1lbnRzKQorCisgICAgZGVmIG1haW5sb29wKHNlbGYsIG1hc2sgPSBoaWdoTGV2ZWxFdmVudE1hc2ssIHRpbWVvdXQgPSAxKjYwKToKKyAgICAgICAgIyBOb3RlOiB0aGlzIGlzIG5vdCB0aGUgcmlnaHQgd2F5IHRvIHJ1biBhbiBldmVudCBsb29wIGluIE9TWCBvciBldmVuCisgICAgICAgICMgInJlY2VudCIgdmVyc2lvbnMgb2YgTWFjT1M5LiBUaGlzIGlzIGhvd2V2ZXIgY29kZSB0aGF0IGhhcyBwcm92ZW4KKyAgICAgICAgIyBpdHNlbGYuCisgICAgICAgIHN0b3B0aW1lID0gRXZ0LlRpY2tDb3VudCgpICsgdGltZW91dAorICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWl0dGluZyBhbmQgRXZ0LlRpY2tDb3VudCgpIDwgc3RvcHRpbWU6CisgICAgICAgICAgICBzZWxmLl9kb29uZWV2ZW50KG1hc2ssIHRpbWVvdXQpCisKKyAgICAgICAgaWYgbm90IHNlbGYucXVpdHRpbmc6CisgICAgICAgICAgICBwcmludCAiYXJndmVtdWxhdG9yOiB0aW1lb3V0IHdhaXRpbmcgZm9yIGFyZ3VtZW50cyIKKworICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBfZG9vbmVldmVudChzZWxmLCBtYXNrID0gaGlnaExldmVsRXZlbnRNYXNrLCB0aW1lb3V0ID0gMSo2MCk6CisgICAgICAgIGdvdCwgZXZlbnQgPSBFdnQuV2FpdE5leHRFdmVudChtYXNrLCB0aW1lb3V0KQorICAgICAgICBpZiBnb3Q6CisgICAgICAgICAgICBzZWxmLl9sb3dsZXZlbGhhbmRsZXIoZXZlbnQpCisKKyAgICBkZWYgX2xvd2xldmVsaGFuZGxlcihzZWxmLCBldmVudCk6CisgICAgICAgIHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMgPSBldmVudAorICAgICAgICBoLCB2ID0gd2hlcmUKKyAgICAgICAgaWYgd2hhdCA9PSBrSGlnaExldmVsRXZlbnQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgQUUuQUVQcm9jZXNzQXBwbGVFdmVudChldmVudCkKKyAgICAgICAgICAgIGV4Y2VwdCBBRS5FcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIG1zZyA9ICJIaWdoIExldmVsIEV2ZW50OiAlciAlciIgJSAoaGV4KG1lc3NhZ2UpLCBoZXgoaCB8ICh2PDwxNikpKQorICAgICAgICAgICAgICAgIHByaW50ICdBRSBlcnJvcjogJywgZXJyCisgICAgICAgICAgICAgICAgcHJpbnQgJ2luJywgbXNnCisgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJVbmhhbmRsZWQgZXZlbnQ6IiwgZXZlbnQKKworCisgICAgZGVmIF9xdWl0KHNlbGYpOgorICAgICAgICBzZWxmLnF1aXR0aW5nID0gMQorCisgICAgZGVmIF9fcnVuYXBwKHNlbGYsIHJlcXVlc3RldmVudCwgcmVwbHlldmVudCk6CisgICAgICAgIHNlbGYuX3F1aXQoKQorCisgICAgZGVmIF9fb3BlbmZpbGVzKHNlbGYsIHJlcXVlc3RldmVudCwgcmVwbHlldmVudCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpc3RkZXNjID0gcmVxdWVzdGV2ZW50LkFFR2V0UGFyYW1EZXNjKGtleURpcmVjdE9iamVjdCwgdHlwZUFFTGlzdCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxpc3RkZXNjLkFFQ291bnRJdGVtcygpKToKKyAgICAgICAgICAgICAgICBhbGlhc2Rlc2MgPSBsaXN0ZGVzYy5BRUdldE50aERlc2MoaSsxLCB0eXBlQWxpYXMpWzFdCisgICAgICAgICAgICAgICAgYWxpYXMgPSBGaWxlLkFsaWFzKHJhd2RhdGE9YWxpYXNkZXNjLmRhdGEpCisgICAgICAgICAgICAgICAgZnNyZWYgPSBhbGlhcy5GU1Jlc29sdmVBbGlhcyhOb25lKVswXQorICAgICAgICAgICAgICAgIHBhdGhuYW1lID0gZnNyZWYuYXNfcGF0aG5hbWUoKQorICAgICAgICAgICAgICAgIHN5cy5hcmd2LmFwcGVuZChwYXRobmFtZSkKKyAgICAgICAgZXhjZXB0ICBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBwcmludCAiYXJndmVtdWxhdG9yLnB5IHdhcm5pbmc6IGNhbid0IHVucGFjayBhbiBvcGVuIGRvY3VtZW50IGV2ZW50IgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisKKyAgICAgICAgc2VsZi5fcXVpdCgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgQXJndkNvbGxlY3RvcigpLm1haW5sb29wKCkKKyAgICBwcmludCAic3lzLmFyZ3Y9Iiwgc3lzLmFyZ3YKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXJndmVtdWxhdG9yLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXJndmVtdWxhdG9yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTAwMDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hcmd2ZW11bGF0b3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXJndmVtdWxhdG9yLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYXJndmVtdWxhdG9yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTAwMDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9hcmd2ZW11bGF0b3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYmdlbmxvY2F0aW9ucy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYmdlbmxvY2F0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGY0MTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9iZ2VubG9jYXRpb25zLnB5CkBAIC0wLDAgKzEsNTggQEAKKyMKKyMgTG9jYWwgY3VzdG9taXphdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGhlIENhcmJvbiBpbnRlcmZhY2UgbW9kdWxlcy4KKyMgRWRpdCB0aGlzIGZpbGUgdG8gcmVmbGVjdCB3aGVyZSB0aGluZ3Mgc2hvdWxkIGJlIG9uIHlvdXIgc3lzdGVtLgorIyBOb3RlIHRoYXQgcGF0aG5hbWVzIGFyZSB1bml4LXN0eWxlIGZvciBPU1ggTWFjaG9QeXRob24vdW5peC1QeXRob24sCisjIGJ1dCBtYWMtc3R5bGUgZm9yIE1hY1B5dGhvbiwgd2hldGhlciBydW5uaW5nIG9uIE9TOSBvciBPU1guCisjCisKK2ltcG9ydCBvcworCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIGJnZW5sb2NhdGlvbnMgbW9kdWxlIGlzIHJlbW92ZWQuIiwgc3RhY2tsZXZlbD0yKQorCitFcnJvciA9ICJiZ2VubG9jYXRpb25zLkVycm9yIgorIworIyBXaGVyZSBiZ2VuIGlzLiBGb3IgdW5peC1QeXRob24gYmdlbiBpc24ndCBpbnN0YWxsZWQsIHNvIHlvdSBoYXZlIHRvIHJlZmVyIHRvCisjIHRoZSBzb3VyY2UgdHJlZSBoZXJlLgorQkdFTkRJUj0iL1VzZXJzL2phY2svc3JjL3B5dGhvbi9Ub29scy9iZ2VuL2JnZW4iCisKKyMKKyMgV2hlcmUgdG8gZmluZCB0aGUgVW5pdmVyc2FsIEhlYWRlciBpbmNsdWRlIGZpbGVzLiBJZiB5b3UgaGF2ZSBDb2RlV2FycmlvcgorIyBpbnN0YWxsZWQgeW91IGNhbiB1c2UgdGhlIFVuaXZlcnNhbCBIZWFkZXJzIGZyb20gdGhlcmUsIG90aGVyd2lzZSB5b3UgY2FuCisjIGRvd25sb2FkIHRoZW0gZnJvbSB0aGUgQXBwbGUgd2Vic2l0ZS4gQmdlbiBjYW4gaGFuZGxlIGJvdGggdW5peC0gYW5kIG1hYy1zdHlsZQorIyBlbmQgb2YgbGluZXMsIHNvIGRvbid0IHdvcnJ5IGFib3V0IHRoYXQuCisjCitJTkNMVURFRElSPSIvVXNlcnMvamFjay9zcmMvVW5pdmVyc2FsL0ludGVyZmFjZXMvQ0luY2x1ZGVzIgorCisjCisjIFdoZXJlIHRvIHB1dCB0aGUgcHl0aG9uIGRlZmluaXRpb25zIGZpbGVzLiBOb3RlIHRoYXQsIG9uIHVuaXgtUHl0aG9uLAorIyBpZiB5b3Ugd2FudCB0byBjb21taXQgeW91ciBjaGFuZ2VzIHRvIHRoZSBDVlMgcmVwb3NpdG9yeSB0aGlzIHNob3VsZCByZWZlciB0bworIyB5b3VyIHNvdXJjZSBkaXJlY3RvcnksIG5vdCB5b3VyIGluc3RhbGxlZCBkaXJlY3RvcnkuCisjCitUT09MQk9YRElSPSIvVXNlcnMvamFjay9zcmMvcHl0aG9uL0xpYi9wbGF0LW1hYy9DYXJib24iCisKKyMgQ3JlYXRvciBmb3IgQyBmaWxlczoKK0NSRUFUT1I9IkNXSUUiCisKKyMgVGhlIHByZXZpb3VzIGRlZmluaXRpb25zIGNhbiBiZSBvdmVycmlkZW4gYnkgY3JlYXRpbmcgYSBtb2R1bGUKKyMgYmdlbmxvY2F0aW9uc2N1c3RvbWl6ZS5weSBhbmQgcHV0dGluZyBpdCBpbiBzaXRlLXBhY2thZ2VzIChvciBhbnl3ZXJlIGVsc2UKKyMgb24gc3lzLnBhdGgsIGFjdHVhbGx5KQordHJ5OgorICAgIGZyb20gYmdlbmxvY2F0aW9uc2N1c3RvbWl6ZSBpbXBvcnQgKgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKKworaWYgbm90IG9zLnBhdGguZXhpc3RzKEJHRU5ESVIpOgorICAgIHJhaXNlIEVycm9yLCAiUGxlYXNlIGZpeCBiZ2VubG9jYXRpb25zLnB5LCBCR0VORElSIGRvZXMgbm90IGV4aXN0OiAlcyIgJSBCR0VORElSCitpZiBub3Qgb3MucGF0aC5leGlzdHMoSU5DTFVERURJUik6CisgICAgcmFpc2UgRXJyb3IsICJQbGVhc2UgZml4IGJnZW5sb2NhdGlvbnMucHksIElOQ0xVREVESVIgZG9lcyBub3QgZXhpc3Q6ICVzIiAlIElOQ0xVREVESVIKK2lmIG5vdCBvcy5wYXRoLmV4aXN0cyhUT09MQk9YRElSKToKKyAgICByYWlzZSBFcnJvciwgIlBsZWFzZSBmaXggYmdlbmxvY2F0aW9ucy5weSwgVE9PTEJPWERJUiBkb2VzIG5vdCBleGlzdDogJXMiICUgVE9PTEJPWERJUgorCisjIFNpZ2gsIGR1ZSB0byB0aGUgd2F5IHRoZXNlIGFyZSB1c2VkIG1ha2Ugc3VyZSB0aGV5IGVuZCB3aXRoIDogb3IgLy4KK2lmIEJHRU5ESVJbLTFdICE9IG9zLnNlcDoKKyAgICBCR0VORElSID0gQkdFTkRJUiArIG9zLnNlcAoraWYgSU5DTFVERURJUlstMV0gIT0gb3Muc2VwOgorICAgIElOQ0xVREVESVIgPSBJTkNMVURFRElSICsgb3Muc2VwCitpZiBUT09MQk9YRElSWy0xXSAhPSBvcy5zZXA6CisgICAgVE9PTEJPWERJUiA9IFRPT0xCT1hESVIgKyBvcy5zZXAKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYmdlbmxvY2F0aW9ucy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2JnZW5sb2NhdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWY4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2JnZW5sb2NhdGlvbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYmdlbmxvY2F0aW9ucy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2JnZW5sb2NhdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWY4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2JnZW5sb2NhdGlvbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYnVpbGR0b29scy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYnVpbGR0b29scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmIzN2FiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9idWlsZHRvb2xzLnB5CkBAIC0wLDAgKzEsNDM1IEBACisiIiJ0b29scyBmb3IgQnVpbGRBcHBsZXQgYW5kIEJ1aWxkQXBwbGljYXRpb24iIiIKKworaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy53YXJucHkzaygidGhlIGJ1aWxkdG9vbHMgbW9kdWxlIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIHJlbW92ZWQgaW4gMy4wIiwKKyAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBpbXAKK2ltcG9ydCBtYXJzaGFsCitmcm9tIENhcmJvbiBpbXBvcnQgUmVzCitpbXBvcnQgQ2FyYm9uLkZpbGVzCitpbXBvcnQgQ2FyYm9uLkZpbGUKK2ltcG9ydCBNYWNPUworaW1wb3J0IG1hY29zdG9vbHMKK2ltcG9ydCBtYWNyZXNvdXJjZQordHJ5OgorICAgIGltcG9ydCBFYXN5RGlhbG9ncworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIEVhc3lEaWFsb2dzID0gTm9uZQoraW1wb3J0IHNodXRpbAorCisKK0J1aWxkRXJyb3IgPSAiQnVpbGRFcnJvciIKKworIyAucHljIGZpbGUgKGFuZCAnUFlDICcgcmVzb3VyY2UgbWFnaWMgbnVtYmVyKQorTUFHSUMgPSBpbXAuZ2V0X21hZ2ljKCkKKworIyBUZW1wbGF0ZSBmaWxlIChzZWFyY2hlZCBvbiBzeXMucGF0aCkKK1RFTVBMQVRFID0gIlB5dGhvbkludGVycHJldGVyIgorCisjIFNwZWNpZmljYXRpb24gb2Ygb3VyIHJlc291cmNlCitSRVNUWVBFID0gJ1BZQyAnCitSRVNOQU1FID0gJ19fbWFpbl9fJworCisjIEEgcmVzb3VyY2Ugd2l0aCB0aGlzIG5hbWUgc2V0cyB0aGUgIm93bmVyIiAoY3JlYXRvcikgb2YgdGhlIGRlc3RpbmF0aW9uCisjIEl0IHNob3VsZCBhbHNvIGhhdmUgSUQ9MC4gRWl0aGVyIG9mIHRoZXNlIGFsb25lIGlzIG5vdCBlbm91Z2guCitPV05FUk5BTUUgPSAib3duZXIgcmVzb3VyY2UiCisKKyMgRGVmYXVsdCBhcHBsZXQgY3JlYXRvciBjb2RlCitERUZBVUxUX0FQUExFVF9DUkVBVE9SPSJQeXRhIgorCisjIE9wZW5SZXNGaWxlIG1vZGUgcGFyYW1ldGVycworUkVBRCA9IDEKK1dSSVRFID0gMgorCisjIFBhcmFtZXRlciBmb3IgRlNPcGVuUmVzb3VyY2VGaWxlCitSRVNPVVJDRV9GT1JLX05BTUU9Q2FyYm9uLkZpbGUuRlNHZXRSZXNvdXJjZUZvcmtOYW1lKCkKKworZGVmIGZpbmR0ZW1wbGF0ZSh0ZW1wbGF0ZT1Ob25lKToKKyAgICAiIiJMb2NhdGUgdGhlIGFwcGxldCB0ZW1wbGF0ZSBhbG9uZyBzeXMucGF0aCIiIgorICAgIGlmIE1hY09TLnJ1bnRpbWVtb2RlbCA9PSAnbWFjaG8nOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGlmIG5vdCB0ZW1wbGF0ZToKKyAgICAgICAgdGVtcGxhdGU9VEVNUExBVEUKKyAgICBmb3IgcCBpbiBzeXMucGF0aDoKKyAgICAgICAgZmlsZSA9IG9zLnBhdGguam9pbihwLCB0ZW1wbGF0ZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSwgZDEsIGQyID0gQ2FyYm9uLkZpbGUuRlNSZXNvbHZlQWxpYXNGaWxlKGZpbGUsIDEpCisgICAgICAgICAgICBicmVhaworICAgICAgICBleGNlcHQgKENhcmJvbi5GaWxlLkVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgQnVpbGRFcnJvciwgIlRlbXBsYXRlICVyIG5vdCBmb3VuZCBvbiBzeXMucGF0aCIgJSAodGVtcGxhdGUsKQorICAgIGZpbGUgPSBmaWxlLmFzX3BhdGhuYW1lKCkKKyAgICByZXR1cm4gZmlsZQorCitkZWYgcHJvY2Vzcyh0ZW1wbGF0ZSwgZmlsZW5hbWUsIGRlc3RuYW1lLCBjb3B5X2NvZGVmcmFnbWVudD0wLAorICAgICAgICByc3JjbmFtZT1Ob25lLCBvdGhlcnM9W10sIHJhdz0wLCBwcm9ncmVzcz0iZGVmYXVsdCIsIGRlc3Ryb290PSIiKToKKworICAgIGlmIHByb2dyZXNzID09ICJkZWZhdWx0IjoKKyAgICAgICAgaWYgRWFzeURpYWxvZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIHByaW50ICJDb21waWxpbmcgJXMiJShvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXSwpCisgICAgICAgICAgICBwcm9jZXNzID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJvZ3Jlc3MgPSBFYXN5RGlhbG9ncy5Qcm9ncmVzc0JhcigiUHJvY2Vzc2luZyAlcy4uLiIlb3MucGF0aC5zcGxpdChmaWxlbmFtZSlbMV0sIDEyMCkKKyAgICAgICAgICAgIHByb2dyZXNzLmxhYmVsKCJDb21waWxpbmcuLi4iKQorICAgICAgICAgICAgcHJvZ3Jlc3MuaW5jKDApCisgICAgIyBjaGVjayBmb3IgdGhlIHNjcmlwdCBuYW1lIGJlaW5nIGxvbmdlciB0aGFuIDMyIGNoYXJzLiBUaGlzIG1heSB0cmlnZ2VyIGEgYnVnCisgICAgIyBvbiBPU1ggdGhhdCBjYW4gZGVzdHJveSB5b3VyIHNvdXJjZWZpbGUuCisgICAgaWYgJyMnIGluIG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpWzFdOgorICAgICAgICByYWlzZSBCdWlsZEVycm9yLCAiQnVpbGRBcHBsZXQgY291bGQgZGVzdHJveSB5b3VyIHNvdXJjZWZpbGUgb24gT1NYLCBwbGVhc2UgcmVuYW1lOiAlcyIgJSBmaWxlbmFtZQorICAgICMgUmVhZCB0aGUgc291cmNlIGFuZCBjb21waWxlIGl0CisgICAgIyAodGhlcmUncyBubyBwb2ludCBvdmVyd3JpdGluZyB0aGUgZGVzdGluYXRpb24gaWYgaXQgaGFzIGEgc3ludGF4IGVycm9yKQorCisgICAgZnAgPSBvcGVuKGZpbGVuYW1lLCAnclUnKQorICAgIHRleHQgPSBmcC5yZWFkKCkKKyAgICBmcC5jbG9zZSgpCisgICAgdHJ5OgorICAgICAgICBjb2RlID0gY29tcGlsZSh0ZXh0ICsgJ1xuJywgZmlsZW5hbWUsICJleGVjIikKKyAgICBleGNlcHQgU3ludGF4RXJyb3IsIGFyZzoKKyAgICAgICAgcmFpc2UgQnVpbGRFcnJvciwgIlN5bnRheCBlcnJvciBpbiBzY3JpcHQgJXM6ICVzIiAlIChmaWxlbmFtZSwgYXJnKQorICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgcmFpc2UgQnVpbGRFcnJvciwgIkVuZC1vZi1maWxlIGluIHNjcmlwdCAlcyIgJSAoZmlsZW5hbWUsKQorCisgICAgIyBTZXQgdGhlIGRlc3RpbmF0aW9uIGZpbGUgbmFtZS4gTm90ZSB0aGF0IGJhc2VuYW1lCisgICAgIyBkb2VzIGNvbnRhaW4gdGhlIHdob2xlIGZpbGVwYXRoLCBvbmx5IGEgLnB5IGlzIHN0cmlwcGVkLgorCisgICAgaWYgc3RyaW5nLmxvd2VyKGZpbGVuYW1lWy0zOl0pID09ICIucHkiOgorICAgICAgICBiYXNlbmFtZSA9IGZpbGVuYW1lWzotM10KKyAgICAgICAgaWYgTWFjT1MucnVudGltZW1vZGVsICE9ICdtYWNobycgYW5kIG5vdCBkZXN0bmFtZToKKyAgICAgICAgICAgIGRlc3RuYW1lID0gYmFzZW5hbWUKKyAgICBlbHNlOgorICAgICAgICBiYXNlbmFtZSA9IGZpbGVuYW1lCisKKyAgICBpZiBub3QgZGVzdG5hbWU6CisgICAgICAgIGlmIE1hY09TLnJ1bnRpbWVtb2RlbCA9PSAnbWFjaG8nOgorICAgICAgICAgICAgZGVzdG5hbWUgPSBiYXNlbmFtZSArICcuYXBwJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVzdG5hbWUgPSBiYXNlbmFtZSArICcuYXBwbGV0JworICAgIGlmIG5vdCByc3JjbmFtZToKKyAgICAgICAgcnNyY25hbWUgPSBiYXNlbmFtZSArICcucnNyYycKKworICAgICMgVHJ5IHJlbW92aW5nIHRoZSBvdXRwdXQgZmlsZS4gVGhpcyBmYWlscyBpbiBNYWNoTywgYnV0IGl0IHNob3VsZAorICAgICMgZG8gYW55IGhhcm0uCisgICAgdHJ5OgorICAgICAgICBvcy5yZW1vdmUoZGVzdG5hbWUpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICBwYXNzCisgICAgcHJvY2Vzc19jb21tb24odGVtcGxhdGUsIHByb2dyZXNzLCBjb2RlLCByc3JjbmFtZSwgZGVzdG5hbWUsIDAsCisgICAgICAgIGNvcHlfY29kZWZyYWdtZW50LCByYXcsIG90aGVycywgZmlsZW5hbWUsIGRlc3Ryb290KQorCisKK2RlZiB1cGRhdGUodGVtcGxhdGUsIGZpbGVuYW1lLCBvdXRwdXQpOgorICAgIGlmIE1hY09TLnJ1bnRpbWVtb2RlbCA9PSAnbWFjaG8nOgorICAgICAgICByYWlzZSBCdWlsZEVycm9yLCAiTm8gdXBkYXRpbmcgeWV0IGZvciBNYWNoTyBhcHBsZXRzIgorICAgIGlmIHByb2dyZXNzOgorICAgICAgICBpZiBFYXN5RGlhbG9ncyBpcyBOb25lOgorICAgICAgICAgICAgcHJpbnQgIlVwZGF0aW5nICVzIiUob3MucGF0aC5zcGxpdChmaWxlbmFtZSlbMV0sKQorICAgICAgICAgICAgcHJvZ3Jlc3MgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcm9ncmVzcyA9IEVhc3lEaWFsb2dzLlByb2dyZXNzQmFyKCJVcGRhdGluZyAlcy4uLiIlb3MucGF0aC5zcGxpdChmaWxlbmFtZSlbMV0sIDEyMCkKKyAgICBlbHNlOgorICAgICAgICBwcm9ncmVzcyA9IE5vbmUKKyAgICBpZiBub3Qgb3V0cHV0OgorICAgICAgICBvdXRwdXQgPSBmaWxlbmFtZSArICcgKHVwZGF0ZWQpJworCisgICAgIyBUcnkgcmVtb3ZpbmcgdGhlIG91dHB1dCBmaWxlCisgICAgdHJ5OgorICAgICAgICBvcy5yZW1vdmUob3V0cHV0KQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgcGFzcworICAgIHByb2Nlc3NfY29tbW9uKHRlbXBsYXRlLCBwcm9ncmVzcywgTm9uZSwgZmlsZW5hbWUsIG91dHB1dCwgMSwgMSkKKworCitkZWYgcHJvY2Vzc19jb21tb24odGVtcGxhdGUsIHByb2dyZXNzLCBjb2RlLCByc3JjbmFtZSwgZGVzdG5hbWUsIGlzX3VwZGF0ZSwKKyAgICAgICAgY29weV9jb2RlZnJhZ21lbnQsIHJhdz0wLCBvdGhlcnM9W10sIGZpbGVuYW1lPU5vbmUsIGRlc3Ryb290PSIiKToKKyAgICBpZiBNYWNPUy5ydW50aW1lbW9kZWwgPT0gJ21hY2hvJzoKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NfY29tbW9uX21hY2hvKHRlbXBsYXRlLCBwcm9ncmVzcywgY29kZSwgcnNyY25hbWUsIGRlc3RuYW1lLAorICAgICAgICAgICAgaXNfdXBkYXRlLCByYXcsIG90aGVycywgZmlsZW5hbWUsIGRlc3Ryb290KQorICAgIGlmIG90aGVyczoKKyAgICAgICAgcmFpc2UgQnVpbGRFcnJvciwgIkV4dHJhIGZpbGVzIG9ubHkgYWxsb3dlZCBmb3IgTWFjaG9QeXRob24gYXBwbGV0cyIKKyAgICAjIENyZWF0ZSBGU1NwZWNzIGZvciB0aGUgdmFyaW91cyBmaWxlcworICAgIHRlbXBsYXRlX2ZzciwgZDEsIGQyID0gQ2FyYm9uLkZpbGUuRlNSZXNvbHZlQWxpYXNGaWxlKHRlbXBsYXRlLCAxKQorICAgIHRlbXBsYXRlID0gdGVtcGxhdGVfZnNyLmFzX3BhdGhuYW1lKCkKKworICAgICMgQ29weSBkYXRhIChub3QgcmVzb3VyY2VzLCB5ZXQpIGZyb20gdGhlIHRlbXBsYXRlCisgICAgaWYgcHJvZ3Jlc3M6CisgICAgICAgIHByb2dyZXNzLmxhYmVsKCJDb3B5IGRhdGEgZm9yay4uLiIpCisgICAgICAgIHByb2dyZXNzLnNldCgxMCkKKworICAgIGlmIGNvcHlfY29kZWZyYWdtZW50OgorICAgICAgICB0bXBsID0gb3Blbih0ZW1wbGF0ZSwgInJiIikKKyAgICAgICAgZGVzdCA9IG9wZW4oZGVzdG5hbWUsICJ3YiIpCisgICAgICAgIGRhdGEgPSB0bXBsLnJlYWQoKQorICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgZGVzdC53cml0ZShkYXRhKQorICAgICAgICBkZXN0LmNsb3NlKCkKKyAgICAgICAgdG1wbC5jbG9zZSgpCisgICAgICAgIGRlbCBkZXN0CisgICAgICAgIGRlbCB0bXBsCisKKyAgICAjIE9wZW4gdGhlIG91dHB1dCByZXNvdXJjZSBmb3JrCisKKyAgICBpZiBwcm9ncmVzczoKKyAgICAgICAgcHJvZ3Jlc3MubGFiZWwoIkNvcHkgcmVzb3VyY2VzLi4uIikKKyAgICAgICAgcHJvZ3Jlc3Muc2V0KDIwKQorICAgIHRyeToKKyAgICAgICAgb3V0cHV0ID0gUmVzLkZTT3BlblJlc291cmNlRmlsZShkZXN0bmFtZSwgUkVTT1VSQ0VfRk9SS19OQU1FLCBXUklURSkKKyAgICBleGNlcHQgTWFjT1MuRXJyb3I6CisgICAgICAgIGRlc3RkaXIsIGRlc3RmaWxlID0gb3MucGF0aC5zcGxpdChkZXN0bmFtZSkKKyAgICAgICAgUmVzLkZTQ3JlYXRlUmVzb3VyY2VGaWxlKGRlc3RkaXIsIHVuaWNvZGUoZGVzdGZpbGUpLCBSRVNPVVJDRV9GT1JLX05BTUUpCisgICAgICAgIG91dHB1dCA9IFJlcy5GU09wZW5SZXNvdXJjZUZpbGUoZGVzdG5hbWUsIFJFU09VUkNFX0ZPUktfTkFNRSwgV1JJVEUpCisKKyAgICAjIENvcHkgdGhlIHJlc291cmNlcyBmcm9tIHRoZSB0YXJnZXQgc3BlY2lmaWMgcmVzb3VyY2UgdGVtcGxhdGUsIGlmIGFueQorICAgIHR5cGVzZm91bmQsIG93bmVydHlwZSA9IFtdLCBOb25lCisgICAgdHJ5OgorICAgICAgICBpbnB1dCA9IFJlcy5GU09wZW5SZXNvdXJjZUZpbGUocnNyY25hbWUsIFJFU09VUkNFX0ZPUktfTkFNRSwgUkVBRCkKKyAgICBleGNlcHQgKE1hY09TLkVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgcGFzcworICAgICAgICBpZiBwcm9ncmVzczoKKyAgICAgICAgICAgIHByb2dyZXNzLmluYyg1MCkKKyAgICBlbHNlOgorICAgICAgICBpZiBpc191cGRhdGU6CisgICAgICAgICAgICBza2lwX29sZGZpbGUgPSBbJ2NmcmcnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2tpcF9vbGRmaWxlID0gW10KKyAgICAgICAgdHlwZXNmb3VuZCwgb3duZXJ0eXBlID0gY29weXJlcyhpbnB1dCwgb3V0cHV0LCBza2lwX29sZGZpbGUsIDAsIHByb2dyZXNzKQorICAgICAgICBSZXMuQ2xvc2VSZXNGaWxlKGlucHV0KQorCisgICAgIyBDaGVjayB3aGljaCByZXNvdXJjZS10eXBlcyB3ZSBzaG91bGQgbm90IGNvcHkgZnJvbSB0aGUgdGVtcGxhdGUKKyAgICBza2lwdHlwZXMgPSBbXQorICAgIGlmICd2ZXJzJyBpbiB0eXBlc2ZvdW5kOiBza2lwdHlwZXMuYXBwZW5kKCd2ZXJzJykKKyAgICBpZiAnU0laRScgaW4gdHlwZXNmb3VuZDogc2tpcHR5cGVzLmFwcGVuZCgnU0laRScpCisgICAgaWYgJ0JOREwnIGluIHR5cGVzZm91bmQ6IHNraXB0eXBlcyA9IHNraXB0eXBlcyArIFsnQk5ETCcsICdGUkVGJywgJ2ljbDQnLAorICAgICAgICAgICAgJ2ljbDgnLCAnaWNzNCcsICdpY3M4JywgJ0lDTiMnLCAnaWNzIyddCisgICAgaWYgbm90IGNvcHlfY29kZWZyYWdtZW50OgorICAgICAgICBza2lwdHlwZXMuYXBwZW5kKCdjZnJnJykKKyMjICBza2lwb3duZXIgPSAob3duZXJ0eXBlICE9IE5vbmUpCisKKyAgICAjIENvcHkgdGhlIHJlc291cmNlcyBmcm9tIHRoZSB0ZW1wbGF0ZQorCisgICAgaW5wdXQgPSBSZXMuRlNPcGVuUmVzb3VyY2VGaWxlKHRlbXBsYXRlLCBSRVNPVVJDRV9GT1JLX05BTUUsIFJFQUQpCisgICAgZHVtbXksIHRtcGxvd25lciA9IGNvcHlyZXMoaW5wdXQsIG91dHB1dCwgc2tpcHR5cGVzLCAxLCBwcm9ncmVzcykKKworICAgIFJlcy5DbG9zZVJlc0ZpbGUoaW5wdXQpCisjIyAgaWYgb3duZXJ0eXBlIGlzIE5vbmU6CisjIyAgICAgIHJhaXNlIEJ1aWxkRXJyb3IsICJObyBvd25lciByZXNvdXJjZSBmb3VuZCBpbiBlaXRoZXIgcmVzb3VyY2UgZmlsZSBvciB0ZW1wbGF0ZSIKKyAgICAjIE1ha2Ugc3VyZSB3ZSdyZSBtYW5pcHVsYXRpbmcgdGhlIG91dHB1dCByZXNvdXJjZSBmaWxlIG5vdworCisgICAgUmVzLlVzZVJlc0ZpbGUob3V0cHV0KQorCisgICAgaWYgb3duZXJ0eXBlIGlzIE5vbmU6CisgICAgICAgICMgTm8gb3duZXIgcmVzb3VyY2UgaW4gdGhlIHRlbXBsYXRlLiBXZSBoYXZlIHNraXBwZWQgdGhlCisgICAgICAgICMgUHl0aG9uIG93bmVyIHJlc291cmNlLCBzbyB3ZSBoYXZlIHRvIGFkZCBvdXIgb3duLiBUaGUgcmVsZXZhbnQKKyAgICAgICAgIyBidW5kbGUgc3R1ZmYgaXMgYWxyZWFkeSBpbmNsdWRlZCBpbiB0aGUgaW50ZXJwcmV0L2FwcGxldCB0ZW1wbGF0ZS4KKyAgICAgICAgbmV3cmVzID0gUmVzLlJlc291cmNlKCdcMCcpCisgICAgICAgIG5ld3Jlcy5BZGRSZXNvdXJjZShERUZBVUxUX0FQUExFVF9DUkVBVE9SLCAwLCAiT3duZXIgcmVzb3VyY2UiKQorICAgICAgICBvd25lcnR5cGUgPSBERUZBVUxUX0FQUExFVF9DUkVBVE9SCisKKyAgICBpZiBjb2RlOgorICAgICAgICAjIERlbGV0ZSBhbnkgZXhpc3RpbmcgJ1BZQyAnIHJlc291cmNlIG5hbWVkIF9fbWFpbl9fCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzID0gUmVzLkdldDFOYW1lZFJlc291cmNlKFJFU1RZUEUsIFJFU05BTUUpCisgICAgICAgICAgICByZXMuUmVtb3ZlUmVzb3VyY2UoKQorICAgICAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgQ3JlYXRlIHRoZSByYXcgZGF0YSBmb3IgdGhlIHJlc291cmNlIGZyb20gdGhlIGNvZGUgb2JqZWN0CisgICAgICAgIGlmIHByb2dyZXNzOgorICAgICAgICAgICAgcHJvZ3Jlc3MubGFiZWwoIldyaXRlIFBZQyByZXNvdXJjZS4uLiIpCisgICAgICAgICAgICBwcm9ncmVzcy5zZXQoMTIwKQorCisgICAgICAgIGRhdGEgPSBtYXJzaGFsLmR1bXBzKGNvZGUpCisgICAgICAgIGRlbCBjb2RlCisgICAgICAgIGRhdGEgPSAoTUFHSUMgKyAnXDBcMFwwXDAnKSArIGRhdGEKKworICAgICAgICAjIENyZWF0ZSB0aGUgcmVzb3VyY2UgYW5kIHdyaXRlIGl0CisKKyAgICAgICAgaWQgPSAwCisgICAgICAgIHdoaWxlIGlkIDwgMTI4OgorICAgICAgICAgICAgaWQgPSBSZXMuVW5pcXVlMUlEKFJFU1RZUEUpCisgICAgICAgIHJlcyA9IFJlcy5SZXNvdXJjZShkYXRhKQorICAgICAgICByZXMuQWRkUmVzb3VyY2UoUkVTVFlQRSwgaWQsIFJFU05BTUUpCisgICAgICAgIGF0dHJzID0gcmVzLkdldFJlc0F0dHJzKCkKKyAgICAgICAgYXR0cnMgPSBhdHRycyB8IDB4MDQgICAgIyBzZXQgcHJlbG9hZAorICAgICAgICByZXMuU2V0UmVzQXR0cnMoYXR0cnMpCisgICAgICAgIHJlcy5Xcml0ZVJlc291cmNlKCkKKyAgICAgICAgcmVzLlJlbGVhc2VSZXNvdXJjZSgpCisKKyAgICAjIENsb3NlIHRoZSBvdXRwdXQgZmlsZQorCisgICAgUmVzLkNsb3NlUmVzRmlsZShvdXRwdXQpCisKKyAgICAjIE5vdyBzZXQgdGhlIGNyZWF0b3IsIHR5cGUgYW5kIGJ1bmRsZSBiaXQgb2YgdGhlIGRlc3RpbmF0aW9uLgorICAgICMgRG9uZSB3aXRoIEZTU3BlYydzLCBGU1JlZiBGSW5mbyBpc24ndCBnb29kIGVub3VnaCB5ZXQgKDIuM2ExKykKKyAgICBkZXN0X2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhkZXN0bmFtZSkKKyAgICBkZXN0X2ZpbmZvID0gZGVzdF9mc3MuRlNwR2V0RkluZm8oKQorICAgIGRlc3RfZmluZm8uQ3JlYXRvciA9IG93bmVydHlwZQorICAgIGRlc3RfZmluZm8uVHlwZSA9ICdBUFBMJworICAgIGRlc3RfZmluZm8uRmxhZ3MgPSBkZXN0X2ZpbmZvLkZsYWdzIHwgQ2FyYm9uLkZpbGVzLmtIYXNCdW5kbGUgfCBDYXJib24uRmlsZXMua0lzU2hhcmVkCisgICAgZGVzdF9maW5mby5GbGFncyA9IGRlc3RfZmluZm8uRmxhZ3MgJiB+Q2FyYm9uLkZpbGVzLmtIYXNCZWVuSW5pdGVkCisgICAgZGVzdF9mc3MuRlNwU2V0RkluZm8oZGVzdF9maW5mbykKKworICAgIG1hY29zdG9vbHMudG91Y2hlZChkZXN0bmFtZSkKKyAgICBpZiBwcm9ncmVzczoKKyAgICAgICAgcHJvZ3Jlc3MubGFiZWwoIkRvbmUuIikKKyAgICAgICAgcHJvZ3Jlc3MuaW5jKDApCisKK2RlZiBwcm9jZXNzX2NvbW1vbl9tYWNobyh0ZW1wbGF0ZSwgcHJvZ3Jlc3MsIGNvZGUsIHJzcmNuYW1lLCBkZXN0bmFtZSwgaXNfdXBkYXRlLAorICAgICAgICByYXc9MCwgb3RoZXJzPVtdLCBmaWxlbmFtZT1Ob25lLCBkZXN0cm9vdD0iIik6CisgICAgIyBDaGVjayB0aGF0IHdlIGhhdmUgYSBmaWxlbmFtZQorICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIEJ1aWxkRXJyb3IsICJOZWVkIHNvdXJjZSBmaWxlbmFtZSBvbiBNYWNPU1giCisgICAgIyBGaXJzdCBtYWtlIHN1cmUgdGhlIG5hbWUgZW5kcyBpbiAiLmFwcCIKKyAgICBpZiBkZXN0bmFtZVstNDpdICE9ICcuYXBwJzoKKyAgICAgICAgZGVzdG5hbWUgPSBkZXN0bmFtZSArICcuYXBwJworICAgICMgTm93IGRlZHVjZSB0aGUgc2hvcnQgbmFtZQorICAgIGRlc3RkaXIsIHNob3J0bmFtZSA9IG9zLnBhdGguc3BsaXQoZGVzdG5hbWUpCisgICAgaWYgc2hvcnRuYW1lWy00Ol0gPT0gJy5hcHAnOgorICAgICAgICAjIFN0cmlwIHRoZSAuYXBwIHN1ZmZpeAorICAgICAgICBzaG9ydG5hbWUgPSBzaG9ydG5hbWVbOi00XQorICAgICMgQW5kIGRlZHVjZSB0aGUgLnBsaXN0IGFuZCAuaWNucyBuYW1lcworICAgIHBsaXN0bmFtZSA9IE5vbmUKKyAgICBpY25zbmFtZSA9IE5vbmUKKyAgICBpZiByc3JjbmFtZSBhbmQgcnNyY25hbWVbLTU6XSA9PSAnLnJzcmMnOgorICAgICAgICB0bXAgPSByc3JjbmFtZVs6LTVdCisgICAgICAgIHBsaXN0bmFtZSA9IHRtcCArICcucGxpc3QnCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBsaXN0bmFtZSk6CisgICAgICAgICAgICBpY25zbmFtZSA9IHRtcCArICcuaWNucycKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhpY25zbmFtZSk6CisgICAgICAgICAgICAgICAgaWNuc25hbWUgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwbGlzdG5hbWUgPSBOb25lCisgICAgaWYgbm90IGljbnNuYW1lOgorICAgICAgICBkZnRfaWNuc25hbWUgPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgJ1Jlc291cmNlcy9QeXRob24uYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9QeXRob25BcHBsZXQuaWNucycpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRmdF9pY25zbmFtZSk6CisgICAgICAgICAgICBpY25zbmFtZSA9IGRmdF9pY25zbmFtZQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhyc3JjbmFtZSk6CisgICAgICAgIHJzcmNuYW1lID0gTm9uZQorICAgIGlmIHByb2dyZXNzOgorICAgICAgICBwcm9ncmVzcy5sYWJlbCgnQ3JlYXRpbmcgYnVuZGxlLi4uJykKKyAgICBpbXBvcnQgYnVuZGxlYnVpbGRlcgorICAgIGJ1aWxkZXIgPSBidW5kbGVidWlsZGVyLkFwcEJ1aWxkZXIodmVyYm9zaXR5PTApCisgICAgYnVpbGRlci5tYWlucHJvZ3JhbSA9IGZpbGVuYW1lCisgICAgYnVpbGRlci5idWlsZGRpciA9IGRlc3RkaXIKKyAgICBidWlsZGVyLm5hbWUgPSBzaG9ydG5hbWUKKyAgICBidWlsZGVyLmRlc3Ryb290ID0gZGVzdHJvb3QKKyAgICBpZiByc3JjbmFtZToKKyAgICAgICAgcmVhbHJzcmNuYW1lID0gbWFjcmVzb3VyY2UucmVzb3VyY2VfcGF0aG5hbWUocnNyY25hbWUpCisgICAgICAgIGJ1aWxkZXIuZmlsZXMuYXBwZW5kKChyZWFscnNyY25hbWUsCisgICAgICAgICAgICBvcy5wYXRoLmpvaW4oJ0NvbnRlbnRzL1Jlc291cmNlcycsIG9zLnBhdGguYmFzZW5hbWUocnNyY25hbWUpKSkpCisgICAgZm9yIG8gaW4gb3RoZXJzOgorICAgICAgICBpZiB0eXBlKG8pID09IHN0cjoKKyAgICAgICAgICAgIGJ1aWxkZXIucmVzb3VyY2VzLmFwcGVuZChvKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnVpbGRlci5maWxlcy5hcHBlbmQobykKKyAgICBpZiBwbGlzdG5hbWU6CisgICAgICAgIGltcG9ydCBwbGlzdGxpYgorICAgICAgICBidWlsZGVyLnBsaXN0ID0gcGxpc3RsaWIuUGxpc3QuZnJvbUZpbGUocGxpc3RuYW1lKQorICAgIGlmIGljbnNuYW1lOgorICAgICAgICBidWlsZGVyLmljb25maWxlID0gaWNuc25hbWUKKyAgICBpZiBub3QgcmF3OgorICAgICAgICBidWlsZGVyLmFyZ3ZfZW11bGF0aW9uID0gMQorICAgIGJ1aWxkZXIuc2V0dXAoKQorICAgIGJ1aWxkZXIuYnVpbGQoKQorICAgIGlmIHByb2dyZXNzOgorICAgICAgICBwcm9ncmVzcy5sYWJlbCgnRG9uZS4nKQorICAgICAgICBwcm9ncmVzcy5pbmMoMCkKKworIyMgIG1hY29zdG9vbHMudG91Y2hlZChkZXN0X2ZzcykKKworIyBDb3B5IHJlc291cmNlcyBiZXR3ZWVuIHR3byByZXNvdXJjZSBmaWxlIGRlc2NyaXB0b3JzLgorIyBza2lwIGEgcmVzb3VyY2UgbmFtZWQgJ19fbWFpbl9fJyBvciAoaWYgc2tpcG93bmVyIGlzIHNldCkgd2l0aCBJRCB6ZXJvLgorIyBBbHNvIHNraXAgcmVzb3VyY2VzIHdpdGggYSB0eXBlIGxpc3RlZCBpbiBza2lwdHlwZXMuCisjCitkZWYgY29weXJlcyhpbnB1dCwgb3V0cHV0LCBza2lwdHlwZXMsIHNraXBvd25lciwgcHJvZ3Jlc3M9Tm9uZSk6CisgICAgY3RvciA9IE5vbmUKKyAgICBhbGx0eXBlcyA9IFtdCisgICAgUmVzLlVzZVJlc0ZpbGUoaW5wdXQpCisgICAgbnR5cGVzID0gUmVzLkNvdW50MVR5cGVzKCkKKyAgICBwcm9ncmVzc190eXBlX2luYyA9IDUwL250eXBlcworICAgIGZvciBpdHlwZSBpbiByYW5nZSgxLCAxK250eXBlcyk6CisgICAgICAgIHR5cGUgPSBSZXMuR2V0MUluZFR5cGUoaXR5cGUpCisgICAgICAgIGlmIHR5cGUgaW4gc2tpcHR5cGVzOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYWxsdHlwZXMuYXBwZW5kKHR5cGUpCisgICAgICAgIG5yZXNvdXJjZXMgPSBSZXMuQ291bnQxUmVzb3VyY2VzKHR5cGUpCisgICAgICAgIHByb2dyZXNzX2N1cl9pbmMgPSBwcm9ncmVzc190eXBlX2luYy9ucmVzb3VyY2VzCisgICAgICAgIGZvciBpcmVzIGluIHJhbmdlKDEsIDErbnJlc291cmNlcyk6CisgICAgICAgICAgICByZXMgPSBSZXMuR2V0MUluZFJlc291cmNlKHR5cGUsIGlyZXMpCisgICAgICAgICAgICBpZCwgdHlwZSwgbmFtZSA9IHJlcy5HZXRSZXNJbmZvKCkKKyAgICAgICAgICAgIGxjbmFtZSA9IHN0cmluZy5sb3dlcihuYW1lKQorCisgICAgICAgICAgICBpZiBsY25hbWUgPT0gT1dORVJOQU1FIGFuZCBpZCA9PSAwOgorICAgICAgICAgICAgICAgIGlmIHNraXBvd25lcjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgIyBTa2lwIHRoaXMgb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY3RvciA9IHR5cGUKKyAgICAgICAgICAgIHNpemUgPSByZXMuc2l6ZQorICAgICAgICAgICAgYXR0cnMgPSByZXMuR2V0UmVzQXR0cnMoKQorICAgICAgICAgICAgaWYgcHJvZ3Jlc3M6CisgICAgICAgICAgICAgICAgcHJvZ3Jlc3MubGFiZWwoIkNvcHkgJXMgJWQgJXMiJSh0eXBlLCBpZCwgbmFtZSkpCisgICAgICAgICAgICAgICAgcHJvZ3Jlc3MuaW5jKHByb2dyZXNzX2N1cl9pbmMpCisgICAgICAgICAgICByZXMuTG9hZFJlc291cmNlKCkKKyAgICAgICAgICAgIHJlcy5EZXRhY2hSZXNvdXJjZSgpCisgICAgICAgICAgICBSZXMuVXNlUmVzRmlsZShvdXRwdXQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzMiA9IFJlcy5HZXQxUmVzb3VyY2UodHlwZSwgaWQpCisgICAgICAgICAgICBleGNlcHQgTWFjT1MuRXJyb3I6CisgICAgICAgICAgICAgICAgcmVzMiA9IE5vbmUKKyAgICAgICAgICAgIGlmIHJlczI6CisgICAgICAgICAgICAgICAgaWYgcHJvZ3Jlc3M6CisgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzLmxhYmVsKCJPdmVyd3JpdGUgJXMgJWQgJXMiJSh0eXBlLCBpZCwgbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzLmluYygwKQorICAgICAgICAgICAgICAgIHJlczIuUmVtb3ZlUmVzb3VyY2UoKQorICAgICAgICAgICAgcmVzLkFkZFJlc291cmNlKHR5cGUsIGlkLCBuYW1lKQorICAgICAgICAgICAgcmVzLldyaXRlUmVzb3VyY2UoKQorICAgICAgICAgICAgYXR0cnMgPSBhdHRycyB8IHJlcy5HZXRSZXNBdHRycygpCisgICAgICAgICAgICByZXMuU2V0UmVzQXR0cnMoYXR0cnMpCisgICAgICAgICAgICBSZXMuVXNlUmVzRmlsZShpbnB1dCkKKyAgICByZXR1cm4gYWxsdHlwZXMsIGN0b3IKKworZGVmIGNvcHlhcHB0cmVlKHNyY3RyZWUsIGRzdHRyZWUsIGV4Y2VwdGxpc3Q9W10sIHByb2dyZXNzPU5vbmUpOgorICAgIG5hbWVzID0gW10KKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhkc3R0cmVlKToKKyAgICAgICAgc2h1dGlsLnJtdHJlZShkc3R0cmVlKQorICAgIG9zLm1rZGlyKGRzdHRyZWUpCisgICAgdG9kbyA9IG9zLmxpc3RkaXIoc3JjdHJlZSkKKyAgICB3aGlsZSB0b2RvOgorICAgICAgICB0aGlzLCB0b2RvID0gdG9kb1swXSwgdG9kb1sxOl0KKyAgICAgICAgaWYgdGhpcyBpbiBleGNlcHRsaXN0OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgdGhpc3BhdGggPSBvcy5wYXRoLmpvaW4oc3JjdHJlZSwgdGhpcykKKyAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih0aGlzcGF0aCk6CisgICAgICAgICAgICB0aGlzY29udGVudCA9IG9zLmxpc3RkaXIodGhpc3BhdGgpCisgICAgICAgICAgICBmb3IgdCBpbiB0aGlzY29udGVudDoKKyAgICAgICAgICAgICAgICB0b2RvLmFwcGVuZChvcy5wYXRoLmpvaW4odGhpcywgdCkpCisgICAgICAgIG5hbWVzLmFwcGVuZCh0aGlzKQorICAgIGZvciB0aGlzIGluIG5hbWVzOgorICAgICAgICBzcmNwYXRoID0gb3MucGF0aC5qb2luKHNyY3RyZWUsIHRoaXMpCisgICAgICAgIGRzdHBhdGggPSBvcy5wYXRoLmpvaW4oZHN0dHJlZSwgdGhpcykKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzcmNwYXRoKToKKyAgICAgICAgICAgIG9zLm1rZGlyKGRzdHBhdGgpCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2xpbmsoc3JjcGF0aCk6CisgICAgICAgICAgICBlbmRwb2ludCA9IG9zLnJlYWRsaW5rKHNyY3BhdGgpCisgICAgICAgICAgICBvcy5zeW1saW5rKGVuZHBvaW50LCBkc3RwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgcHJvZ3Jlc3M6CisgICAgICAgICAgICAgICAgcHJvZ3Jlc3MubGFiZWwoJ0NvcHkgJyt0aGlzKQorICAgICAgICAgICAgICAgIHByb2dyZXNzLmluYygwKQorICAgICAgICAgICAgc2h1dGlsLmNvcHkyKHNyY3BhdGgsIGRzdHBhdGgpCisKK2RlZiB3cml0ZXB5Y2ZpbGUoY29kZW9iamVjdCwgY2ZpbGUpOgorICAgIGltcG9ydCBtYXJzaGFsCisgICAgZmMgPSBvcGVuKGNmaWxlLCAnd2InKQorICAgIGZjLndyaXRlKCdcMFwwXDBcMCcpICMgTUFHSUMgcGxhY2Vob2xkZXIsIHdyaXR0ZW4gbGF0ZXIKKyAgICBmYy53cml0ZSgnXDBcMFwwXDAnKSAjIFRpbWVzdGFwIHBsYWNlaG9sZGVyLCBub3QgbmVlZGVkCisgICAgbWFyc2hhbC5kdW1wKGNvZGVvYmplY3QsIGZjKQorICAgIGZjLmZsdXNoKCkKKyAgICBmYy5zZWVrKDAsIDApCisgICAgZmMud3JpdGUoTUFHSUMpCisgICAgZmMuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9idWlsZHRvb2xzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYnVpbGR0b29scy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1ZjFiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYnVpbGR0b29scy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9idWlsZHRvb2xzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYnVpbGR0b29scy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1ZjFiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYnVpbGR0b29scy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9idW5kbGVidWlsZGVyLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9idW5kbGVidWlsZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzMzk5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2J1bmRsZWJ1aWxkZXIucHkKQEAgLTAsMCArMSw5NDkgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiXAorYnVuZGxlYnVpbGRlci5weSAtLSBUb29scyB0byBhc3NlbWJsZSBNYWNPUyBYIChhcHBsaWNhdGlvbikgYnVuZGxlcy4KKworVGhpcyBtb2R1bGUgY29udGFpbnMgdHdvIGNsYXNzZXMgdG8gYnVpbGQgc28gY2FsbGVkICJidW5kbGVzIiBmb3IKK01hY09TIFguIEJ1bmRsZUJ1aWxkZXIgaXMgYSBnZW5lcmFsIHRvb2wsIEFwcEJ1aWxkZXIgaXMgYSBzdWJjbGFzcworc3BlY2lhbGl6ZWQgaW4gYnVpbGRpbmcgYXBwbGljYXRpb24gYnVuZGxlcy4KKworW0J1bmRsZXxBcHBdQnVpbGRlciBvYmplY3RzIGFyZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGJ1bmNoIG9mIGtleXdvcmQKK2FyZ3VtZW50cywgYW5kIGhhdmUgYSBidWlsZCgpIG1ldGhvZCB0aGF0IHdpbGwgZG8gYWxsIHRoZSB3b3JrLiBTZWUKK3RoZSBjbGFzcyBkb2Mgc3RyaW5ncyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29uc3RydWN0b3IgYXJndW1lbnRzLgorCitUaGUgbW9kdWxlIGNvbnRhaW5zIGEgbWFpbiBwcm9ncmFtIHRoYXQgY2FuIGJlIHVzZWQgaW4gdHdvIHdheXM6CisKKyAgJSBweXRob24gYnVuZGxlYnVpbGRlci5weSBbb3B0aW9uc10gYnVpbGQKKyAgJSBweXRob24gYnVpbGRhcHAucHkgW29wdGlvbnNdIGJ1aWxkCisKK1doZXJlICJidWlsZGFwcC5weSIgaXMgYSB1c2VyLXN1cHBsaWVkIHNldHVwLnB5LWxpa2Ugc2NyaXB0IGZvbGxvd2luZwordGhpcyBtb2RlbDoKKworICBmcm9tIGJ1bmRsZWJ1aWxkZXIgaW1wb3J0IGJ1aWxkYXBwCisgIGJ1aWxkYXBwKDxsb3RzLW9mLWtleXdvcmQtYXJncz4pCisKKyIiIgorCisKK19fYWxsX18gPSBbIkJ1bmRsZUJ1aWxkZXIiLCAiQnVuZGxlQnVpbGRlckVycm9yIiwgIkFwcEJ1aWxkZXIiLCAiYnVpbGRhcHAiXQorCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgYnVuZGxlYnVpbGRlciBtb2R1bGUgaXMgcmVtb3ZlZC4iLCBzdGFja2xldmVsPTIpCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcywgZXJybm8sIHNodXRpbAoraW1wb3J0IGltcCwgbWFyc2hhbAoraW1wb3J0IHJlCitmcm9tIGNvcHkgaW1wb3J0IGRlZXBjb3B5CitpbXBvcnQgZ2V0b3B0Citmcm9tIHBsaXN0bGliIGltcG9ydCBQbGlzdAorZnJvbSB0eXBlcyBpbXBvcnQgRnVuY3Rpb25UeXBlIGFzIGZ1bmN0aW9uCisKK2NsYXNzIEJ1bmRsZUJ1aWxkZXJFcnJvcihFeGNlcHRpb24pOiBwYXNzCisKKworY2xhc3MgRGVmYXVsdHM6CisKKyAgICAiIiJDbGFzcyBhdHRyaWJ1dGVzIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCBhbiB1bmRlcnNjb3JlIGFuZCBhcmUKKyAgICBub3QgZnVuY3Rpb25zIG9yIGNsYXNzbWV0aG9kcyBhcmUgKGRlZXApY29waWVkIHRvIHNlbGYuX19kaWN0X18uCisgICAgVGhpcyBhbGxvd3MgZm9yIG11dGFibGUgZGVmYXVsdCB2YWx1ZXMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICBkZWZhdWx0cyA9IHNlbGYuX2dldERlZmF1bHRzKCkKKyAgICAgICAgZGVmYXVsdHMudXBkYXRlKGt3YXJncykKKyAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoZGVmYXVsdHMpCisKKyAgICBkZWYgX2dldERlZmF1bHRzKGNscyk6CisgICAgICAgIGRlZmF1bHRzID0ge30KKyAgICAgICAgZm9yIGJhc2UgaW4gY2xzLl9fYmFzZXNfXzoKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoYmFzZSwgIl9nZXREZWZhdWx0cyIpOgorICAgICAgICAgICAgICAgIGRlZmF1bHRzLnVwZGF0ZShiYXNlLl9nZXREZWZhdWx0cygpKQorICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gY2xzLl9fZGljdF9fLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBuYW1lWzBdICE9ICJfIiBhbmQgbm90IGlzaW5zdGFuY2UodmFsdWUsCisgICAgICAgICAgICAgICAgICAgIChmdW5jdGlvbiwgY2xhc3NtZXRob2QpKToKKyAgICAgICAgICAgICAgICBkZWZhdWx0c1tuYW1lXSA9IGRlZXBjb3B5KHZhbHVlKQorICAgICAgICByZXR1cm4gZGVmYXVsdHMKKyAgICBfZ2V0RGVmYXVsdHMgPSBjbGFzc21ldGhvZChfZ2V0RGVmYXVsdHMpCisKKworY2xhc3MgQnVuZGxlQnVpbGRlcihEZWZhdWx0cyk6CisKKyAgICAiIiJCdW5kbGVCdWlsZGVyIGlzIGEgYmFyZWJvbmVzIGNsYXNzIGZvciBhc3NlbWJsaW5nIGJ1bmRsZXMuIEl0CisgICAga25vd3Mgbm90aGluZyBhYm91dCBleGVjdXRhYmxlcyBvciBpY29ucywgaXQgb25seSBjb3BpZXMgZmlsZXMKKyAgICBhbmQgY3JlYXRlcyB0aGUgUGtnSW5mbyBhbmQgSW5mby5wbGlzdCBmaWxlcy4KKyAgICAiIiIKKworICAgICMgKE5vdGUgdGhhdCBEZWZhdWx0cy5fX2luaXRfXyAoZGVlcCljb3BpZXMgdGhlc2UgdmFsdWVzIHRvCisgICAgIyBpbnN0YW5jZSB2YXJpYWJsZXMuIE11dGFibGUgZGVmYXVsdHMgYXJlIHRoZXJlZm9yZSBzYWZlLikKKworICAgICMgTmFtZSBvZiB0aGUgYnVuZGxlLCB3aXRoIG9yIHdpdGhvdXQgZXh0ZW5zaW9uLgorICAgIG5hbWUgPSBOb25lCisKKyAgICAjIFRoZSBwcm9wZXJ0eSBsaXN0ICgicGxpc3QiKQorICAgIHBsaXN0ID0gUGxpc3QoQ0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbiA9ICJFbmdsaXNoIiwKKyAgICAgICAgICAgICAgICAgIENGQnVuZGxlSW5mb0RpY3Rpb25hcnlWZXJzaW9uID0gIjYuMCIpCisKKyAgICAjIFRoZSB0eXBlIG9mIHRoZSBidW5kbGUuCisgICAgdHlwZSA9ICJCTkRMIgorICAgICMgVGhlIGNyZWF0b3IgY29kZSBvZiB0aGUgYnVuZGxlLgorICAgIGNyZWF0b3IgPSBOb25lCisKKyAgICAjIHRoZSBDRkJ1bmRsZUlkZW50aWZpZXIgKHRoaXMgaXMgdXNlZCBmb3IgdGhlIHByZWZlcmVuY2VzIGZpbGUgbmFtZSkKKyAgICBidW5kbGVfaWQgPSBOb25lCisKKyAgICAjIExpc3Qgb2YgZmlsZXMgdGhhdCBoYXZlIHRvIGJlIGNvcGllZCB0byA8YnVuZGxlPi9Db250ZW50cy9SZXNvdXJjZXMuCisgICAgcmVzb3VyY2VzID0gW10KKworICAgICMgTGlzdCBvZiAoc3JjLCBkZXN0KSB0dXBsZXM7IGRlc3Qgc2hvdWxkIGJlIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgYnVuZGxlCisgICAgIyAoZWcuICJDb250ZW50cy9SZXNvdXJjZXMvTXlTdHVmZi9Tb21lRmlsZS5leHQpLgorICAgIGZpbGVzID0gW10KKworICAgICMgTGlzdCBvZiBzaGFyZWQgbGlicmFyaWVzIChkeWxpYnMsIEZyYW1ld29ya3MpIHRvIGJ1bmRsZSB3aXRoIHRoZSBhcHAKKyAgICAjIHdpbGwgYmUgcGxhY2VkIGluIENvbnRlbnRzL0ZyYW1ld29ya3MKKyAgICBsaWJzID0gW10KKworICAgICMgRGlyZWN0b3J5IHdoZXJlIHRoZSBidW5kbGUgd2lsbCBiZSBhc3NlbWJsZWQuCisgICAgYnVpbGRkaXIgPSAiYnVpbGQiCisKKyAgICAjIE1ha2Ugc3ltbGlua3MgaW5zdGVhZCBjb3B5aW5nIGZpbGVzLiBUaGlzIGlzIGhhbmR5IGR1cmluZyBkZWJ1Z2dpbmcsIGJ1dAorICAgICMgbWFrZXMgdGhlIGJ1bmRsZSBub24tZGlzdHJpYnV0YWJsZS4KKyAgICBzeW1saW5rID0gMAorCisgICAgIyBWZXJib3NpdHkgbGV2ZWwuCisgICAgdmVyYm9zaXR5ID0gMQorCisgICAgIyBEZXN0aW5hdGlvbiByb290IGRpcmVjdG9yeQorICAgIGRlc3Ryb290ID0gIiIKKworICAgIGRlZiBzZXR1cChzZWxmKToKKyAgICAgICAgIyBYWFggcmV0aGluayBzZWxmLm5hbWUgbXVuZ2luZywgdGhpcyBpcyBicml0dGxlLgorICAgICAgICBzZWxmLm5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2VsZi5uYW1lKQorICAgICAgICBpZiBub3QgZXh0OgorICAgICAgICAgICAgZXh0ID0gIi5idW5kbGUiCisgICAgICAgIGJ1bmRsZWV4dGVuc2lvbiA9IGV4dAorICAgICAgICAjIG1pc2MgKGRlcml2ZWQpIGF0dHJpYnV0ZXMKKyAgICAgICAgc2VsZi5idW5kbGVwYXRoID0gcGF0aGpvaW4oc2VsZi5idWlsZGRpciwgc2VsZi5uYW1lICsgYnVuZGxlZXh0ZW5zaW9uKQorCisgICAgICAgIHBsaXN0ID0gc2VsZi5wbGlzdAorICAgICAgICBwbGlzdC5DRkJ1bmRsZU5hbWUgPSBzZWxmLm5hbWUKKyAgICAgICAgcGxpc3QuQ0ZCdW5kbGVQYWNrYWdlVHlwZSA9IHNlbGYudHlwZQorICAgICAgICBpZiBzZWxmLmNyZWF0b3IgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIocGxpc3QsICJDRkJ1bmRsZVNpZ25hdHVyZSIpOgorICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRvciA9IHBsaXN0LkNGQnVuZGxlU2lnbmF0dXJlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRvciA9ICI/Pz8/IgorICAgICAgICBwbGlzdC5DRkJ1bmRsZVNpZ25hdHVyZSA9IHNlbGYuY3JlYXRvcgorICAgICAgICBpZiBzZWxmLmJ1bmRsZV9pZDoKKyAgICAgICAgICAgIHBsaXN0LkNGQnVuZGxlSWRlbnRpZmllciA9IHNlbGYuYnVuZGxlX2lkCisgICAgICAgIGVsaWYgbm90IGhhc2F0dHIocGxpc3QsICJDRkJ1bmRsZUlkZW50aWZpZXIiKToKKyAgICAgICAgICAgIHBsaXN0LkNGQnVuZGxlSWRlbnRpZmllciA9IHNlbGYubmFtZQorCisgICAgZGVmIGJ1aWxkKHNlbGYpOgorICAgICAgICAiIiJCdWlsZCB0aGUgYnVuZGxlLiIiIgorICAgICAgICBidWlsZGRpciA9IHNlbGYuYnVpbGRkaXIKKyAgICAgICAgaWYgYnVpbGRkaXIgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhidWlsZGRpcik6CisgICAgICAgICAgICBvcy5ta2RpcihidWlsZGRpcikKKyAgICAgICAgc2VsZi5tZXNzYWdlKCJCdWlsZGluZyAlcyIgJSByZXByKHNlbGYuYnVuZGxlcGF0aCksIDEpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuYnVuZGxlcGF0aCk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuYnVuZGxlcGF0aCkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5idW5kbGVwYXRoICsgJ34nKToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5idW5kbGVwYXRoICsgJ34nKQorICAgICAgICBicCA9IHNlbGYuYnVuZGxlcGF0aAorCisgICAgICAgICMgQ3JlYXRlIHRoZSBhcHAgYnVuZGxlIGluIGEgdGVtcG9yYXJ5IGxvY2F0aW9uIGFuZCB0aGVuCisgICAgICAgICMgcmVuYW1lIHRoZSBjb21wbGV0ZWQgYnVuZGxlLiBUaGlzIHdheSB0aGUgRmluZGVyIHdpbGwKKyAgICAgICAgIyBuZXZlciBzZWUgYW4gaW5jb21wbGV0ZSBidW5kbGUgKHdoZXJlIGl0IG1pZ2h0IHBpY2sgdXAKKyAgICAgICAgIyBhbmQgY2FjaGUgdGhlIHdyb25nIG1ldGEgZGF0YSkKKyAgICAgICAgc2VsZi5idW5kbGVwYXRoID0gYnAgKyAnficKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MubWtkaXIoc2VsZi5idW5kbGVwYXRoKQorICAgICAgICAgICAgc2VsZi5wcmVQcm9jZXNzKCkKKyAgICAgICAgICAgIHNlbGYuX2NvcHlGaWxlcygpCisgICAgICAgICAgICBzZWxmLl9hZGRNZXRhRmlsZXMoKQorICAgICAgICAgICAgc2VsZi5wb3N0UHJvY2VzcygpCisgICAgICAgICAgICBvcy5yZW5hbWUoc2VsZi5idW5kbGVwYXRoLCBicCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuYnVuZGxlcGF0aCA9IGJwCisgICAgICAgIHNlbGYubWVzc2FnZSgiRG9uZS4iLCAxKQorCisgICAgZGVmIHByZVByb2Nlc3Moc2VsZik6CisgICAgICAgICIiIkhvb2sgZm9yIHN1YmNsYXNzZXMuIiIiCisgICAgICAgIHBhc3MKKyAgICBkZWYgcG9zdFByb2Nlc3Moc2VsZik6CisgICAgICAgICIiIkhvb2sgZm9yIHN1YmNsYXNzZXMuIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBfYWRkTWV0YUZpbGVzKHNlbGYpOgorICAgICAgICBjb250ZW50cyA9IHBhdGhqb2luKHNlbGYuYnVuZGxlcGF0aCwgIkNvbnRlbnRzIikKKyAgICAgICAgbWFrZWRpcnMoY29udGVudHMpCisgICAgICAgICMKKyAgICAgICAgIyBXcml0ZSBDb250ZW50cy9Qa2dJbmZvCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi50eXBlKSA9PSBsZW4oc2VsZi5jcmVhdG9yKSA9PSA0LCBcCisgICAgICAgICAgICAgICAgInR5cGUgYW5kIGNyZWF0b3IgbXVzdCBiZSA0LWJ5dGUgc3RyaW5ncy4iCisgICAgICAgIHBrZ2luZm8gPSBwYXRoam9pbihjb250ZW50cywgIlBrZ0luZm8iKQorICAgICAgICBmID0gb3Blbihwa2dpbmZvLCAid2IiKQorICAgICAgICBmLndyaXRlKHNlbGYudHlwZSArIHNlbGYuY3JlYXRvcikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICMKKyAgICAgICAgIyBXcml0ZSBDb250ZW50cy9JbmZvLnBsaXN0CisgICAgICAgIGluZm9wbGlzdCA9IHBhdGhqb2luKGNvbnRlbnRzLCAiSW5mby5wbGlzdCIpCisgICAgICAgIHNlbGYucGxpc3Qud3JpdGUoaW5mb3BsaXN0KQorCisgICAgZGVmIF9jb3B5RmlsZXMoc2VsZik6CisgICAgICAgIGZpbGVzID0gc2VsZi5maWxlc1s6XQorICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLnJlc291cmNlczoKKyAgICAgICAgICAgIGZpbGVzLmFwcGVuZCgocGF0aCwgcGF0aGpvaW4oIkNvbnRlbnRzIiwgIlJlc291cmNlcyIsCisgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShwYXRoKSkpKQorICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLmxpYnM6CisgICAgICAgICAgICBmaWxlcy5hcHBlbmQoKHBhdGgsIHBhdGhqb2luKCJDb250ZW50cyIsICJGcmFtZXdvcmtzIiwKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpKSkpCisgICAgICAgIGlmIHNlbGYuc3ltbGluazoKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiTWFraW5nIHN5bWJvbGljIGxpbmtzIiwgMSkKKyAgICAgICAgICAgIG1zZyA9ICJNYWtpbmcgc3ltbGluayBmcm9tIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5tZXNzYWdlKCJDb3B5aW5nIGZpbGVzIiwgMSkKKyAgICAgICAgICAgIG1zZyA9ICJDb3B5aW5nIgorICAgICAgICBmaWxlcy5zb3J0KCkKKyAgICAgICAgZm9yIHNyYywgZHN0IGluIGZpbGVzOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzcmMpOgorICAgICAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiJXMgJXMvIHRvICVzLyIgJSAobXNnLCBzcmMsIGRzdCksIDIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiJXMgJXMgdG8gJXMiICUgKG1zZywgc3JjLCBkc3QpLCAyKQorICAgICAgICAgICAgZHN0ID0gcGF0aGpvaW4oc2VsZi5idW5kbGVwYXRoLCBkc3QpCisgICAgICAgICAgICBpZiBzZWxmLnN5bWxpbms6CisgICAgICAgICAgICAgICAgc3ltbGluayhzcmMsIGRzdCwgbWtkaXJzPTEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvcHkoc3JjLCBkc3QsIG1rZGlycz0xKQorCisgICAgZGVmIG1lc3NhZ2Uoc2VsZiwgbXNnLCBsZXZlbD0wKToKKyAgICAgICAgaWYgbGV2ZWwgPD0gc2VsZi52ZXJib3NpdHk6CisgICAgICAgICAgICBpbmRlbnQgPSAiIgorICAgICAgICAgICAgaWYgbGV2ZWwgPiAxOgorICAgICAgICAgICAgICAgIGluZGVudCA9IChsZXZlbCAtIDEpICogIiAgIgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShpbmRlbnQgKyBtc2cgKyAiXG4iKQorCisgICAgZGVmIHJlcG9ydChzZWxmKToKKyAgICAgICAgIyBYWFggc29tZXRoaW5nIGRlY2VudAorICAgICAgICBwYXNzCisKKworaWYgX19kZWJ1Z19fOgorICAgIFBZQ19FWFQgPSAiLnB5YyIKK2Vsc2U6CisgICAgUFlDX0VYVCA9ICIucHlvIgorCitNQUdJQyA9IGltcC5nZXRfbWFnaWMoKQorVVNFX1pJUElNUE9SVCA9ICJ6aXBpbXBvcnQiIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lcworCisjIEZvciBzdGFuZGFsb25lIGFwcHMsIHdlIGhhdmUgb3VyIG93biBtaW5pbWFsIHNpdGUucHkuIFdlIGRvbid0IG5lZWQKKyMgYWxsIHRoZSBjcnVmdCBvZiB0aGUgcmVhbCBzaXRlLnB5LgorU0lURV9QWSA9ICIiIlwKK2ltcG9ydCBzeXMKK2lmIG5vdCAlKHNlbWlfc3RhbmRhbG9uZSlzOgorICAgIGRlbCBzeXMucGF0aFsxOl0gICMgc3lzLnBhdGhbMF0gaXMgQ29udGVudHMvUmVzb3VyY2VzLworIiIiCisKK1pJUF9BUkNISVZFID0gIk1vZHVsZXMuemlwIgorU0lURV9QWV9aSVAgPSBTSVRFX1BZICsgKCJzeXMucGF0aC5hcHBlbmQoc3lzLnBhdGhbMF0gKyAnLyVzJylcbiIgJSBaSVBfQVJDSElWRSkKKworZGVmIGdldFB5Y0RhdGEoZnVsbG5hbWUsIGNvZGUsIGlzcGtnKToKKyAgICBpZiBpc3BrZzoKKyAgICAgICAgZnVsbG5hbWUgKz0gIi5fX2luaXRfXyIKKyAgICBwYXRoID0gZnVsbG5hbWUucmVwbGFjZSgiLiIsIG9zLnNlcCkgKyBQWUNfRVhUCisgICAgcmV0dXJuIHBhdGgsIE1BR0lDICsgJ1wwXDBcMFwwJyArIG1hcnNoYWwuZHVtcHMoY29kZSkKKworIworIyBFeHRlbnNpb24gbW9kdWxlcyBjYW4ndCBiZSBpbiB0aGUgbW9kdWxlcyB6aXAgYXJjaGl2ZSwgc28gYSBwbGFjZWhvbGRlcgorIyBpcyBhZGRlZCBpbnN0ZWFkLCB0aGF0IGxvYWRzIHRoZSBleHRlbnNpb24gZnJvbSBhIHNwZWNpZmllZCBsb2NhdGlvbi4KKyMKK0VYVF9MT0FERVIgPSAiIiJcCitkZWYgX19sb2FkKCk6CisgICAgaW1wb3J0IGltcCwgc3lzLCBvcworICAgIGZvciBwIGluIHN5cy5wYXRoOgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHAsICIlKGZpbGVuYW1lKXMiKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgYXNzZXJ0IDAsICJmaWxlIG5vdCBmb3VuZDogJShmaWxlbmFtZSlzIgorICAgIG1vZCA9IGltcC5sb2FkX2R5bmFtaWMoIiUobmFtZSlzIiwgcGF0aCkKKworX19sb2FkKCkKK2RlbCBfX2xvYWQKKyIiIgorCitNQVlNSVNTX01PRFVMRVMgPSBbJ29zMicsICdudCcsICdudHBhdGgnLCAnZG9zJywgJ2Rvc3BhdGgnLAorICAgICd3aW4zMmFwaScsICdjZScsICdfd2lucmVnJywgJ250dXJsMnBhdGgnLCAnc2l0ZWN1c3RvbWl6ZScsCisgICAgJ29yZy5weXRob24uY29yZScsICdyaXNjb3MnLCAncmlzY29zZW52aXJvbicsICdyaXNjb3NwYXRoJworXQorCitTVFJJUF9FWEVDID0gIi91c3IvYmluL3N0cmlwIgorCisjCisjIFdlJ3JlIHVzaW5nIGEgc3RvY2sgaW50ZXJwcmV0ZXIgdG8gcnVuIHRoZSBhcHAsIHlldCB3ZSBuZWVkCisjIGEgd2F5IHRvIHBhc3MgdGhlIFB5dGhvbiBtYWluIHByb2dyYW0gdG8gdGhlIGludGVycHJldGVyLiBUaGUKKyMgYm9vdHN0cmFwcGluZyBzY3JpcHQgZmlyZXMgdXAgdGhlIGludGVycHJldGVyIHdpdGggdGhlIHJpZ2h0CisjIGFyZ3VtZW50cy4gb3MuZXhlY3ZlKCkgaXMgdXNlZCBhcyBPU1ggZG9lc24ndCBsaWtlIHVzIHRvCisjIHN0YXJ0IGEgcmVhbCBuZXcgcHJvY2Vzcy4gQWxzbywgdGhlIGV4ZWN1dGFibGUgbmFtZSBtdXN0IG1hdGNoCisjIHRoZSBDRkJ1bmRsZUV4ZWN1dGFibGUgdmFsdWUgaW4gdGhlIEluZm8ucGxpc3QsIHNvIHdlIGxpZQorIyBkZWxpYmVyYXRlbHkgd2l0aCBhcmd2WzBdLiBUaGUgYWN0dWFsIFB5dGhvbiBleGVjdXRhYmxlIGlzCisjIHBhc3NlZCBpbiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzbyB3ZSBjYW4gInJlcGFpciIKKyMgc3lzLmV4ZWN1dGFibGUgbGF0ZXIuCisjCitCT09UU1RSQVBfU0NSSVBUID0gIiIiXAorIyElKGhhc2hiYW5nKXMKKworaW1wb3J0IHN5cywgb3MKK2V4ZWNkaXIgPSBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pCitleGVjdXRhYmxlID0gb3MucGF0aC5qb2luKGV4ZWNkaXIsICIlKGV4ZWN1dGFibGUpcyIpCityZXNkaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGV4ZWNkaXIpLCAiUmVzb3VyY2VzIikKK2xpYmRpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoZXhlY2RpciksICJGcmFtZXdvcmtzIikKK21haW5wcm9ncmFtID0gb3MucGF0aC5qb2luKHJlc2RpciwgIiUobWFpbnByb2dyYW0pcyIpCisKK2lmICUob3B0aW1pemUpczoKKyAgICBzeXMuYXJndi5pbnNlcnQoMSwgJy1PJykKKworc3lzLmFyZ3YuaW5zZXJ0KDEsIG1haW5wcm9ncmFtKQoraWYgJShzdGFuZGFsb25lKXMgb3IgJShzZW1pX3N0YW5kYWxvbmUpczoKKyAgICBvcy5lbnZpcm9uWyJQWVRIT05QQVRIIl0gPSByZXNkaXIKKyAgICBpZiAlKHN0YW5kYWxvbmUpczoKKyAgICAgICAgb3MuZW52aXJvblsiUFlUSE9OSE9NRSJdID0gcmVzZGlyCitlbHNlOgorICAgIHB5cGF0aCA9IG9zLmdldGVudigiUFlUSE9OUEFUSCIsICIiKQorICAgIGlmIHB5cGF0aDoKKyAgICAgICAgcHlwYXRoID0gIjoiICsgcHlwYXRoCisgICAgb3MuZW52aXJvblsiUFlUSE9OUEFUSCJdID0gcmVzZGlyICsgcHlwYXRoCisKK29zLmVudmlyb25bIlBZVEhPTkVYRUNVVEFCTEUiXSA9IGV4ZWN1dGFibGUKK29zLmVudmlyb25bIkRZTERfTElCUkFSWV9QQVRIIl0gPSBsaWJkaXIKK29zLmVudmlyb25bIkRZTERfRlJBTUVXT1JLX1BBVEgiXSA9IGxpYmRpcgorb3MuZXhlY3ZlKGV4ZWN1dGFibGUsIHN5cy5hcmd2LCBvcy5lbnZpcm9uKQorIiIiCisKKworIworIyBPcHRpb25hbCB3cmFwcGVyIHRoYXQgY29udmVydHMgImRyb3BwZWQgZmlsZXMiIGludG8gc3lzLmFyZ3YgdmFsdWVzLgorIworQVJHVl9FTVVMQVRPUiA9ICIiIlwKK2ltcG9ydCBhcmd2ZW11bGF0b3IsIG9zCisKK2FyZ3ZlbXVsYXRvci5Bcmd2Q29sbGVjdG9yKCkubWFpbmxvb3AoKQorZXhlY2ZpbGUob3MucGF0aC5qb2luKG9zLnBhdGguc3BsaXQoX19maWxlX18pWzBdLCAiJShyZWFsbWFpbnByb2dyYW0pcyIpKQorIiIiCisKKyMKKyMgV2hlbiBidWlsZGluZyBhIHN0YW5kYWxvbmUgYXBwIHdpdGggUHl0aG9uLmZyYW1ld29yaywgd2UgbmVlZCB0byBjb3B5CisjIGEgc3Vic2V0IGZyb20gUHl0aG9uLmZyYW1ld29yayB0byB0aGUgYnVuZGxlLiBUaGUgZm9sbG93aW5nIGxpc3QKKyMgc3BlY2lmaWVzIGV4YWN0bHkgd2hhdCBpdGVtcyB3ZSdsbCBjb3B5LgorIworUFlUSE9ORlJBTUVXT1JLR09PRElFUyA9IFsKKyAgICAiUHl0aG9uIiwgICMgdGhlIFB5dGhvbiBjb3JlIGxpYnJhcnkKKyAgICAiUmVzb3VyY2VzL0VuZ2xpc2gubHByb2oiLAorICAgICJSZXNvdXJjZXMvSW5mby5wbGlzdCIsCitdCisKK2RlZiBpc0ZyYW1ld29yaygpOgorICAgIHJldHVybiBzeXMuZXhlY19wcmVmaXguZmluZCgiUHl0aG9uLmZyYW1ld29yayIpID4gMAorCisKK0xJQiA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAibGliIiwgInB5dGhvbiIgKyBzeXMudmVyc2lvbls6M10pCitTSVRFX1BBQ0tBR0VTID0gb3MucGF0aC5qb2luKExJQiwgInNpdGUtcGFja2FnZXMiKQorCisKK2NsYXNzIEFwcEJ1aWxkZXIoQnVuZGxlQnVpbGRlcik6CisKKyAgICB1c2VfemlwaW1wb3J0ID0gVVNFX1pJUElNUE9SVAorCisgICAgIyBPdmVycmlkZSB0eXBlIG9mIHRoZSBidW5kbGUuCisgICAgdHlwZSA9ICJBUFBMIgorCisgICAgIyBwbGF0Zm9ybSwgbmFtZSBvZiB0aGUgc3ViZm9sZGVyIG9mIENvbnRlbnRzIHRoYXQgY29udGFpbnMgdGhlIGV4ZWN1dGFibGUuCisgICAgcGxhdGZvcm0gPSAiTWFjT1MiCisKKyAgICAjIEEgUHl0aG9uIG1haW4gcHJvZ3JhbS4gSWYgdGhpcyBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIG1haW4KKyAgICAjIGV4ZWN1dGFibGUgaW4gdGhlIGJ1bmRsZSB3aWxsIGJlIGEgc21hbGwgd3JhcHBlciB0aGF0IGludm9rZXMKKyAgICAjIHRoZSBtYWluIHByb2dyYW0uIChYWFggRGlzY3VzcyB3aHkuKQorICAgIG1haW5wcm9ncmFtID0gTm9uZQorCisgICAgIyBUaGUgbWFpbiBleGVjdXRhYmxlLiBJZiBhIFB5dGhvbiBtYWluIHByb2dyYW0gaXMgc3BlY2lmaWVkCisgICAgIyB0aGUgZXhlY3V0YWJsZSB3aWxsIGJlIGNvcGllZCB0byBSZXNvdXJjZXMgYW5kIGJlIGludm9rZWQKKyAgICAjIGJ5IHRoZSB3cmFwcGVyIHByb2dyYW0gbWVudGlvbmVkIGFib3ZlLiBPdGhlcndpc2UgaXQgd2lsbAorICAgICMgc2ltcGx5IGJlIHVzZWQgYXMgdGhlIG1haW4gZXhlY3V0YWJsZS4KKyAgICBleGVjdXRhYmxlID0gTm9uZQorCisgICAgIyBUaGUgbmFtZSBvZiB0aGUgbWFpbiBuaWIsIGZvciBDb2NvYSBhcHBzLiAqTXVzdCogYmUgc3BlY2lmaWVkCisgICAgIyB3aGVuIGJ1aWxkaW5nIGEgQ29jb2EgYXBwLgorICAgIG5pYm5hbWUgPSBOb25lCisKKyAgICAjIFRoZSBuYW1lIG9mIHRoZSBpY29uIGZpbGUgdG8gYmUgY29waWVkIHRvIFJlc291cmNlcyBhbmQgdXNlZCBmb3IKKyAgICAjIHRoZSBGaW5kZXIgaWNvbi4KKyAgICBpY29uZmlsZSA9IE5vbmUKKworICAgICMgU3ltbGluayB0aGUgZXhlY3V0YWJsZSBpbnN0ZWFkIG9mIGNvcHlpbmcgaXQuCisgICAgc3ltbGlua19leGVjID0gMAorCisgICAgIyBJZiBUcnVlLCBidWlsZCBzdGFuZGFsb25lIGFwcC4KKyAgICBzdGFuZGFsb25lID0gMAorCisgICAgIyBJZiBUcnVlLCBidWlsZCBzZW1pLXN0YW5kYWxvbmUgYXBwIChvbmx5IGluY2x1ZGVzIHRoaXJkLXBhcnR5IG1vZHVsZXMpLgorICAgIHNlbWlfc3RhbmRhbG9uZSA9IDAKKworICAgICMgSWYgc2V0LCB1c2UgdGhpcyBmb3IgIyEgbGluZXMgaW4gc3RlYWQgb2Ygc3lzLmV4ZWN1dGFibGUKKyAgICBweXRob24gPSBOb25lCisKKyAgICAjIElmIFRydWUsIGFkZCBhIHJlYWwgbWFpbiBwcm9ncmFtIHRoYXQgZW11bGF0ZXMgc3lzLmFyZ3YgYmVmb3JlIGNhbGxpbmcKKyAgICAjIG1haW5wcm9ncmFtCisgICAgYXJndl9lbXVsYXRpb24gPSAwCisKKyAgICAjIFRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgb25seSB1c2VkIHdoZW4gYnVpbGRpbmcgYSBzdGFuZGFsb25lIGFwcC4KKworICAgICMgRXhjbHVkZSB0aGVzZSBtb2R1bGVzLgorICAgIGV4Y2x1ZGVNb2R1bGVzID0gW10KKworICAgICMgSW5jbHVkZSB0aGVzZSBtb2R1bGVzLgorICAgIGluY2x1ZGVNb2R1bGVzID0gW10KKworICAgICMgSW5jbHVkZSB0aGVzZSBwYWNrYWdlcy4KKyAgICBpbmNsdWRlUGFja2FnZXMgPSBbXQorCisgICAgIyBTdHJpcCBiaW5hcmllcyBmcm9tIGRlYnVnIGluZm8uCisgICAgc3RyaXAgPSAwCisKKyAgICAjIEZvdW5kIFB5dGhvbiBtb2R1bGVzOiBbKG5hbWUsIGNvZGVvYmplY3QsIGlzcGtnKSwgLi4uXQorICAgIHB5bW9kdWxlcyA9IFtdCisKKyAgICAjIE1vZHVsZXMgdGhhdCBtb2R1bGVmaW5kZXIgY291bGRuJ3QgZmluZDoKKyAgICBtaXNzaW5nTW9kdWxlcyA9IFtdCisgICAgbWF5YmVNaXNzaW5nTW9kdWxlcyA9IFtdCisKKyAgICBkZWYgc2V0dXAoc2VsZik6CisgICAgICAgIGlmICgoc2VsZi5zdGFuZGFsb25lIG9yIHNlbGYuc2VtaV9zdGFuZGFsb25lKQorICAgICAgICAgICAgYW5kIHNlbGYubWFpbnByb2dyYW0gaXMgTm9uZSk6CisgICAgICAgICAgICByYWlzZSBCdW5kbGVCdWlsZGVyRXJyb3IsICgibXVzdCBzcGVjaWZ5ICdtYWlucHJvZ3JhbScgd2hlbiAiCisgICAgICAgICAgICAgICAgICAgICJidWlsZGluZyBhIHN0YW5kYWxvbmUgYXBwbGljYXRpb24uIikKKyAgICAgICAgaWYgc2VsZi5tYWlucHJvZ3JhbSBpcyBOb25lIGFuZCBzZWxmLmV4ZWN1dGFibGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEJ1bmRsZUJ1aWxkZXJFcnJvciwgKCJtdXN0IHNwZWNpZnkgZWl0aGVyIG9yIGJvdGggb2YgIgorICAgICAgICAgICAgICAgICAgICAiJ2V4ZWN1dGFibGUnIGFuZCAnbWFpbnByb2dyYW0nIikKKworICAgICAgICBzZWxmLmV4ZWNkaXIgPSBwYXRoam9pbigiQ29udGVudHMiLCBzZWxmLnBsYXRmb3JtKQorCisgICAgICAgIGlmIHNlbGYubmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBzZWxmLm1haW5wcm9ncmFtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKHNlbGYubWFpbnByb2dyYW0pKVswXQorICAgICAgICBlbGlmIHNlbGYuZXhlY3V0YWJsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShzZWxmLmV4ZWN1dGFibGUpKVswXQorICAgICAgICBpZiBzZWxmLm5hbWVbLTQ6XSAhPSAiLmFwcCI6CisgICAgICAgICAgICBzZWxmLm5hbWUgKz0gIi5hcHAiCisKKyAgICAgICAgaWYgc2VsZi5leGVjdXRhYmxlIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5zdGFuZGFsb25lIGFuZCBub3QgaXNGcmFtZXdvcmsoKToKKyAgICAgICAgICAgICAgICBzZWxmLnN5bWxpbmtfZXhlYyA9IDEKKyAgICAgICAgICAgIGlmIHNlbGYucHl0aG9uOgorICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0YWJsZSA9IHNlbGYucHl0aG9uCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0YWJsZSA9IHN5cy5leGVjdXRhYmxlCisKKyAgICAgICAgaWYgc2VsZi5uaWJuYW1lOgorICAgICAgICAgICAgc2VsZi5wbGlzdC5OU01haW5OaWJGaWxlID0gc2VsZi5uaWJuYW1lCisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLnBsaXN0LCAiTlNQcmluY2lwYWxDbGFzcyIpOgorICAgICAgICAgICAgICAgIHNlbGYucGxpc3QuTlNQcmluY2lwYWxDbGFzcyA9ICJOU0FwcGxpY2F0aW9uIgorCisgICAgICAgIGlmIHNlbGYuc3RhbmRhbG9uZSBhbmQgaXNGcmFtZXdvcmsoKToKKyAgICAgICAgICAgIHNlbGYuYWRkUHl0aG9uRnJhbWV3b3JrKCkKKworICAgICAgICBCdW5kbGVCdWlsZGVyLnNldHVwKHNlbGYpCisKKyAgICAgICAgc2VsZi5wbGlzdC5DRkJ1bmRsZUV4ZWN1dGFibGUgPSBzZWxmLm5hbWUKKworICAgICAgICBpZiBzZWxmLnN0YW5kYWxvbmUgb3Igc2VsZi5zZW1pX3N0YW5kYWxvbmU6CisgICAgICAgICAgICBzZWxmLmZpbmREZXBlbmRlbmNpZXMoKQorCisgICAgZGVmIHByZVByb2Nlc3Moc2VsZik6CisgICAgICAgIHJlc2RpciA9ICJDb250ZW50cy9SZXNvdXJjZXMiCisgICAgICAgIGlmIHNlbGYuZXhlY3V0YWJsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYubWFpbnByb2dyYW0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBleGVjbmFtZSA9IHNlbGYubmFtZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleGVjbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc2VsZi5leGVjdXRhYmxlKQorICAgICAgICAgICAgZXhlY3BhdGggPSBwYXRoam9pbihzZWxmLmV4ZWNkaXIsIGV4ZWNuYW1lKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuc3ltbGlua19leGVjOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKChzZWxmLmRlc3Ryb290ICsgc2VsZi5leGVjdXRhYmxlLCBleGVjcGF0aCkpCisgICAgICAgICAgICBzZWxmLmV4ZWNwYXRoID0gZXhlY3BhdGgKKworICAgICAgICBpZiBzZWxmLm1haW5wcm9ncmFtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbWFpbnByb2dyYW0gPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGYubWFpbnByb2dyYW0pCisgICAgICAgICAgICBzZWxmLmZpbGVzLmFwcGVuZCgoc2VsZi5tYWlucHJvZ3JhbSwgcGF0aGpvaW4ocmVzZGlyLCBtYWlucHJvZ3JhbSkpKQorICAgICAgICAgICAgaWYgc2VsZi5hcmd2X2VtdWxhdGlvbjoKKyAgICAgICAgICAgICAgICAjIENoYW5nZSB0aGUgbWFpbiBwcm9ncmFtLCBhbmQgY3JlYXRlIHRoZSBoZWxwZXIgbWFpbiBwcm9ncmFtICh3aGljaAorICAgICAgICAgICAgICAgICMgZG9lcyBhcmd2IGNvbGxlY3Rpb24gYW5kIHRoZW4gY2FsbHMgdGhlIHJlYWwgbWFpbikuCisgICAgICAgICAgICAgICAgIyBBbHNvIHVwZGF0ZSB0aGUgaW5jbHVkZWQgbW9kdWxlcyAoaWYgd2UncmUgY3JlYXRpbmcgYSBzdGFuZGFsb25lCisgICAgICAgICAgICAgICAgIyBwcm9ncmFtKSBhbmQgdGhlIHBsaXN0CisgICAgICAgICAgICAgICAgcmVhbG1haW5wcm9ncmFtID0gbWFpbnByb2dyYW0KKyAgICAgICAgICAgICAgICBtYWlucHJvZ3JhbSA9ICdfX2FyZ3ZlbXVsYXRvcl8nICsgbWFpbnByb2dyYW0KKyAgICAgICAgICAgICAgICByZXNkaXJwYXRoID0gcGF0aGpvaW4oc2VsZi5idW5kbGVwYXRoLCByZXNkaXIpCisgICAgICAgICAgICAgICAgbWFpbnByb2dyYW1wYXRoID0gcGF0aGpvaW4ocmVzZGlycGF0aCwgbWFpbnByb2dyYW0pCisgICAgICAgICAgICAgICAgbWFrZWRpcnMocmVzZGlycGF0aCkKKyAgICAgICAgICAgICAgICBvcGVuKG1haW5wcm9ncmFtcGF0aCwgInciKS53cml0ZShBUkdWX0VNVUxBVE9SICUgbG9jYWxzKCkpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdGFuZGFsb25lIG9yIHNlbGYuc2VtaV9zdGFuZGFsb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmluY2x1ZGVNb2R1bGVzLmFwcGVuZCgiYXJndmVtdWxhdG9yIikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmNsdWRlTW9kdWxlcy5hcHBlbmQoIm9zIikKKyAgICAgICAgICAgICAgICBpZiAiQ0ZCdW5kbGVEb2N1bWVudFR5cGVzIiBub3QgaW4gc2VsZi5wbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wbGlzdFsiQ0ZCdW5kbGVEb2N1bWVudFR5cGVzIl0gPSBbCisgICAgICAgICAgICAgICAgICAgICAgICB7ICJDRkJ1bmRsZVR5cGVPU1R5cGVzIiA6IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKioqKiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXNrIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDRkJ1bmRsZVR5cGVSb2xlIjogIlZpZXdlciJ9XQorICAgICAgICAgICAgIyBXcml0ZSBib290c3RyYXAgc2NyaXB0CisgICAgICAgICAgICBleGVjdXRhYmxlID0gb3MucGF0aC5iYXNlbmFtZShzZWxmLmV4ZWN1dGFibGUpCisgICAgICAgICAgICBleGVjZGlyID0gcGF0aGpvaW4oc2VsZi5idW5kbGVwYXRoLCBzZWxmLmV4ZWNkaXIpCisgICAgICAgICAgICBib290c3RyYXBwYXRoID0gcGF0aGpvaW4oZXhlY2Rpciwgc2VsZi5uYW1lKQorICAgICAgICAgICAgbWFrZWRpcnMoZXhlY2RpcikKKyAgICAgICAgICAgIGlmIHNlbGYuc3RhbmRhbG9uZSBvciBzZWxmLnNlbWlfc3RhbmRhbG9uZToKKyAgICAgICAgICAgICAgICAjIFhYWCB3ZSdyZSBzY3Jld2VkIHdoZW4gdGhlIGVuZCB1c2VyIGhhcyBkZWxldGVkCisgICAgICAgICAgICAgICAgIyAvdXNyL2Jpbi9weXRob24KKyAgICAgICAgICAgICAgICBoYXNoYmFuZyA9ICIvdXNyL2Jpbi9weXRob24iCisgICAgICAgICAgICBlbGlmIHNlbGYucHl0aG9uOgorICAgICAgICAgICAgICAgIGhhc2hiYW5nID0gc2VsZi5weXRob24KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaGFzaGJhbmcgPSBvcy5wYXRoLnJlYWxwYXRoKHN5cy5leGVjdXRhYmxlKQorICAgICAgICAgICAgc3RhbmRhbG9uZSA9IHNlbGYuc3RhbmRhbG9uZQorICAgICAgICAgICAgc2VtaV9zdGFuZGFsb25lID0gc2VsZi5zZW1pX3N0YW5kYWxvbmUKKyAgICAgICAgICAgIG9wdGltaXplID0gc3lzLmZsYWdzLm9wdGltaXplCisgICAgICAgICAgICBvcGVuKGJvb3RzdHJhcHBhdGgsICJ3Iikud3JpdGUoQk9PVFNUUkFQX1NDUklQVCAlIGxvY2FscygpKQorICAgICAgICAgICAgb3MuY2htb2QoYm9vdHN0cmFwcGF0aCwgMDc3NSkKKworICAgICAgICBpZiBzZWxmLmljb25maWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWNvbmJhc2UgPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuaWNvbmZpbGUpCisgICAgICAgICAgICBzZWxmLnBsaXN0LkNGQnVuZGxlSWNvbkZpbGUgPSBpY29uYmFzZQorICAgICAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQoKHNlbGYuaWNvbmZpbGUsIHBhdGhqb2luKHJlc2RpciwgaWNvbmJhc2UpKSkKKworICAgIGRlZiBwb3N0UHJvY2VzcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdGFuZGFsb25lIG9yIHNlbGYuc2VtaV9zdGFuZGFsb25lOgorICAgICAgICAgICAgc2VsZi5hZGRQeXRob25Nb2R1bGVzKCkKKyAgICAgICAgaWYgc2VsZi5zdHJpcCBhbmQgbm90IHNlbGYuc3ltbGluazoKKyAgICAgICAgICAgIHNlbGYuc3RyaXBCaW5hcmllcygpCisKKyAgICAgICAgaWYgc2VsZi5zeW1saW5rX2V4ZWMgYW5kIHNlbGYuZXhlY3V0YWJsZToKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiU3ltbGlua2luZyBleGVjdXRhYmxlICVzIHRvICVzIiAlIChzZWxmLmV4ZWN1dGFibGUsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhlY3BhdGgpLCAyKQorICAgICAgICAgICAgZHN0ID0gcGF0aGpvaW4oc2VsZi5idW5kbGVwYXRoLCBzZWxmLmV4ZWNwYXRoKQorICAgICAgICAgICAgbWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKGRzdCkpCisgICAgICAgICAgICBvcy5zeW1saW5rKG9zLnBhdGguYWJzcGF0aChzZWxmLmV4ZWN1dGFibGUpLCBkc3QpCisKKyAgICAgICAgaWYgc2VsZi5taXNzaW5nTW9kdWxlcyBvciBzZWxmLm1heWJlTWlzc2luZ01vZHVsZXM6CisgICAgICAgICAgICBzZWxmLnJlcG9ydE1pc3NpbmcoKQorCisgICAgZGVmIGFkZFB5dGhvbkZyYW1ld29yayhzZWxmKToKKyAgICAgICAgIyBJZiB3ZSdyZSBidWlsZGluZyBhIHN0YW5kYWxvbmUgYXBwIHdpdGggUHl0aG9uLmZyYW1ld29yaywKKyAgICAgICAgIyBpbmNsdWRlIGEgbWluaW1hbCBzdWJzZXQgb2YgUHl0aG9uLmZyYW1ld29yaywgKnVubGVzcyoKKyAgICAgICAgIyBQeXRob24uZnJhbWV3b3JrIHdhcyBzcGVjaWZpZWQgbWFudWFsbHkgaW4gc2VsZi5saWJzLgorICAgICAgICBmb3IgbGliIGluIHNlbGYubGliczoKKyAgICAgICAgICAgIGlmIG9zLnBhdGguYmFzZW5hbWUobGliKSA9PSAiUHl0aG9uLmZyYW1ld29yayI6CisgICAgICAgICAgICAgICAgIyBhIFB5dGhvbi5mcmFtZXdvcmsgd2FzIHNwZWNpZmllZCBhcyBhIGxpYnJhcnkKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmcmFtZXdvcmtwYXRoID0gc3lzLmV4ZWNfcHJlZml4WzpzeXMuZXhlY19wcmVmaXguZmluZCgKKyAgICAgICAgICAgICJQeXRob24uZnJhbWV3b3JrIikgKyBsZW4oIlB5dGhvbi5mcmFtZXdvcmsiKV0KKworICAgICAgICB2ZXJzaW9uID0gc3lzLnZlcnNpb25bOjNdCisgICAgICAgIGZyYW1ld29ya3BhdGggPSBwYXRoam9pbihmcmFtZXdvcmtwYXRoLCAiVmVyc2lvbnMiLCB2ZXJzaW9uKQorICAgICAgICBkZXN0YmFzZSA9IHBhdGhqb2luKCJDb250ZW50cyIsICJGcmFtZXdvcmtzIiwgIlB5dGhvbi5mcmFtZXdvcmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWZXJzaW9ucyIsIHZlcnNpb24pCisgICAgICAgIGZvciBpdGVtIGluIFBZVEhPTkZSQU1FV09SS0dPT0RJRVM6CisgICAgICAgICAgICBzcmMgPSBwYXRoam9pbihmcmFtZXdvcmtwYXRoLCBpdGVtKQorICAgICAgICAgICAgZHN0ID0gcGF0aGpvaW4oZGVzdGJhc2UsIGl0ZW0pCisgICAgICAgICAgICBzZWxmLmZpbGVzLmFwcGVuZCgoc3JjLCBkc3QpKQorCisgICAgZGVmIF9nZXRTaXRlQ29kZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi51c2VfemlwaW1wb3J0OgorICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGUoU0lURV9QWSAlIHsic2VtaV9zdGFuZGFsb25lIjogc2VsZi5zZW1pX3N0YW5kYWxvbmV9LAorICAgICAgICAgICAgICAgICAgICAgIjwtYnVuZGxlYnVpbGRlci5weS0+IiwgImV4ZWMiKQorCisgICAgZGVmIGFkZFB5dGhvbk1vZHVsZXMoc2VsZik6CisgICAgICAgIHNlbGYubWVzc2FnZSgiQWRkaW5nIFB5dGhvbiBtb2R1bGVzIiwgMSkKKworICAgICAgICBpZiBzZWxmLnVzZV96aXBpbXBvcnQ6CisgICAgICAgICAgICAjIENyZWF0ZSBhIHppcCBmaWxlIGNvbnRhaW5pbmcgYWxsIG1vZHVsZXMgYXMgcHljLgorICAgICAgICAgICAgaW1wb3J0IHppcGZpbGUKKyAgICAgICAgICAgIHJlbHBhdGggPSBwYXRoam9pbigiQ29udGVudHMiLCAiUmVzb3VyY2VzIiwgWklQX0FSQ0hJVkUpCisgICAgICAgICAgICBhYnNwYXRoID0gcGF0aGpvaW4oc2VsZi5idW5kbGVwYXRoLCByZWxwYXRoKQorICAgICAgICAgICAgemYgPSB6aXBmaWxlLlppcEZpbGUoYWJzcGF0aCwgInciLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKyAgICAgICAgICAgIGZvciBuYW1lLCBjb2RlLCBpc3BrZyBpbiBzZWxmLnB5bW9kdWxlczoKKyAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIkFkZGluZyBQeXRob24gbW9kdWxlICVzIiAlIG5hbWUsIDIpCisgICAgICAgICAgICAgICAgcGF0aCwgcHljID0gZ2V0UHljRGF0YShuYW1lLCBjb2RlLCBpc3BrZykKKyAgICAgICAgICAgICAgICB6Zi53cml0ZXN0cihwYXRoLCBweWMpCisgICAgICAgICAgICB6Zi5jbG9zZSgpCisgICAgICAgICAgICAjIGFkZCBzaXRlLnB5YworICAgICAgICAgICAgc2l0ZXBhdGggPSBwYXRoam9pbihzZWxmLmJ1bmRsZXBhdGgsICJDb250ZW50cyIsICJSZXNvdXJjZXMiLAorICAgICAgICAgICAgICAgICAgICAic2l0ZSIgKyBQWUNfRVhUKQorICAgICAgICAgICAgd3JpdGVQeWMoc2VsZi5fZ2V0U2l0ZUNvZGUoKSwgc2l0ZXBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIENyZWF0ZSBpbmRpdmlkdWFsIC5weWMgZmlsZXMuCisgICAgICAgICAgICBmb3IgbmFtZSwgY29kZSwgaXNwa2cgaW4gc2VsZi5weW1vZHVsZXM6CisgICAgICAgICAgICAgICAgaWYgaXNwa2c6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgKz0gIi5fX2luaXRfXyIKKyAgICAgICAgICAgICAgICBwYXRoID0gbmFtZS5zcGxpdCgiLiIpCisgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhqb2luKCJDb250ZW50cyIsICJSZXNvdXJjZXMiLCAqcGF0aCkgKyBQWUNfRVhUCisKKyAgICAgICAgICAgICAgICBpZiBpc3BrZzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlKCJBZGRpbmcgUHl0aG9uIHBhY2thZ2UgJXMiICUgcGF0aCwgMikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIkFkZGluZyBQeXRob24gbW9kdWxlICVzIiAlIHBhdGgsIDIpCisKKyAgICAgICAgICAgICAgICBhYnNwYXRoID0gcGF0aGpvaW4oc2VsZi5idW5kbGVwYXRoLCBwYXRoKQorICAgICAgICAgICAgICAgIG1ha2VkaXJzKG9zLnBhdGguZGlybmFtZShhYnNwYXRoKSkKKyAgICAgICAgICAgICAgICB3cml0ZVB5Yyhjb2RlLCBhYnNwYXRoKQorCisgICAgZGVmIHN0cmlwQmluYXJpZXMoc2VsZik6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhTVFJJUF9FWEVDKToKKyAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiRXJyb3I6IGNhbid0IHN0cmlwIGJpbmFyaWVzOiBubyBzdHJpcCBwcm9ncmFtIGF0ICIKKyAgICAgICAgICAgICAgICAiJXMiICUgU1RSSVBfRVhFQywgMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGltcG9ydCBzdGF0CisgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIlN0cmlwcGluZyBiaW5hcmllcyIsIDEpCisgICAgICAgICAgICBkZWYgd2Fsayh0b3ApOgorICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIG9zLmxpc3RkaXIodG9wKToKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhqb2luKHRvcCwgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsocGF0aCk6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgd2FsayhwYXRoKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbW9kID0gb3Muc3RhdChwYXRoKVtzdGF0LlNUX01PREVdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgKG1vZCAmIDAxMDApOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICByZWxwYXRoID0gcGF0aFtsZW4oc2VsZi5idW5kbGVwYXRoKTpdCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIlN0cmlwcGluZyAlcyIgJSByZWxwYXRoLCAyKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5mLCBvdXRmID0gb3MucG9wZW40KCIlcyAtUyBcIiVzXCIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU1RSSVBfRVhFQywgcGF0aCkpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRmLnJlYWQoKS5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBvdXRwdXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1c3VhbGx5IG5vdCBhIHJlYWwgcHJvYmxlbSwgbGlrZSB3aGVuIHdlJ3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0cnlpbmcgdG8gc3RyaXAgYSBzY3JpcHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIlByb2JsZW0gc3RyaXBwaW5nICVzOiIgJSByZWxwYXRoLCAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVzc2FnZShvdXRwdXQsIDMpCisgICAgICAgICAgICB3YWxrKHNlbGYuYnVuZGxlcGF0aCkKKworICAgIGRlZiBmaW5kRGVwZW5kZW5jaWVzKHNlbGYpOgorICAgICAgICBzZWxmLm1lc3NhZ2UoIkZpbmRpbmcgbW9kdWxlIGRlcGVuZGVuY2llcyIsIDEpCisgICAgICAgIGltcG9ydCBtb2R1bGVmaW5kZXIKKyAgICAgICAgbWYgPSBtb2R1bGVmaW5kZXIuTW9kdWxlRmluZGVyKGV4Y2x1ZGVzPXNlbGYuZXhjbHVkZU1vZHVsZXMpCisgICAgICAgIGlmIHNlbGYudXNlX3ppcGltcG9ydDoKKyAgICAgICAgICAgICMgemlwaW1wb3J0IGltcG9ydHMgemxpYiwgbXVzdCBhZGQgaXQgbWFudWFsbHkKKyAgICAgICAgICAgIG1mLmltcG9ydF9ob29rKCJ6bGliIikKKyAgICAgICAgIyBtYW51YWxseSBhZGQgb3VyIG93biBzaXRlLnB5CisgICAgICAgIHNpdGUgPSBtZi5hZGRfbW9kdWxlKCJzaXRlIikKKyAgICAgICAgc2l0ZS5fX2NvZGVfXyA9IHNlbGYuX2dldFNpdGVDb2RlKCkKKyAgICAgICAgbWYuc2Nhbl9jb2RlKHNpdGUuX19jb2RlX18sIHNpdGUpCisKKyAgICAgICAgIyB3YXJuaW5ncy5weSBnZXRzIGltcG9ydGVkIGltcGxpY2l0bHkgZnJvbSBDCisgICAgICAgIG1mLmltcG9ydF9ob29rKCJ3YXJuaW5ncyIpCisKKyAgICAgICAgaW5jbHVkZU1vZHVsZXMgPSBzZWxmLmluY2x1ZGVNb2R1bGVzWzpdCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuaW5jbHVkZVBhY2thZ2VzOgorICAgICAgICAgICAgaW5jbHVkZU1vZHVsZXMuZXh0ZW5kKGZpbmRQYWNrYWdlQ29udGVudHMobmFtZSkua2V5cygpKQorICAgICAgICBmb3IgbmFtZSBpbiBpbmNsdWRlTW9kdWxlczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtZi5pbXBvcnRfaG9vayhuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYubWlzc2luZ01vZHVsZXMuYXBwZW5kKG5hbWUpCisKKyAgICAgICAgbWYucnVuX3NjcmlwdChzZWxmLm1haW5wcm9ncmFtKQorICAgICAgICBtb2R1bGVzID0gbWYubW9kdWxlcy5pdGVtcygpCisgICAgICAgIG1vZHVsZXMuc29ydCgpCisgICAgICAgIGZvciBuYW1lLCBtb2QgaW4gbW9kdWxlczoKKyAgICAgICAgICAgIHBhdGggPSBtb2QuX19maWxlX18KKyAgICAgICAgICAgIGlmIHBhdGggYW5kIHNlbGYuc2VtaV9zdGFuZGFsb25lOgorICAgICAgICAgICAgICAgICMgc2tpcCB0aGUgc3RhbmRhcmQgbGlicmFyeQorICAgICAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aChMSUIpIGFuZCBub3QgcGF0aC5zdGFydHN3aXRoKFNJVEVfUEFDS0FHRVMpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgcGF0aCBhbmQgbW9kLl9fY29kZV9fIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBDIGV4dGVuc2lvbgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQorICAgICAgICAgICAgICAgIHBhdGhpdGVtcyA9IG5hbWUuc3BsaXQoIi4iKVs6LTFdICsgW2ZpbGVuYW1lXQorICAgICAgICAgICAgICAgIGRzdHBhdGggPSBwYXRoam9pbigqcGF0aGl0ZW1zKQorICAgICAgICAgICAgICAgIGlmIHNlbGYudXNlX3ppcGltcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSAhPSAiemxpYiI6CisgICAgICAgICAgICAgICAgICAgICAgICAjIG5lYXRseSBwYWNrIGFsbCBleHRlbnNpb24gbW9kdWxlcyBpbiBhIHN1YmRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZXhjZXB0IHpsaWIsIHNpbmNlIGl0J3MgbmVjZXNzYXJ5IGZvciBib290c3RyYXBwaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgZHN0cGF0aCA9IHBhdGhqb2luKCJFeHRlbnNpb25Nb2R1bGVzIiwgZHN0cGF0aCkKKyAgICAgICAgICAgICAgICAgICAgIyBQeXRob24gbW9kdWxlcyBhcmUgc3RvcmVkIGluIGEgWmlwIGFyY2hpdmUsIGJ1dCBwdXQKKyAgICAgICAgICAgICAgICAgICAgIyBleHRlbnNpb25zIGluIENvbnRlbnRzL1Jlc291cmNlcy8uIEFkZCBhIHRpbnkgImxvYWRlciIKKyAgICAgICAgICAgICAgICAgICAgIyBwcm9ncmFtIGluIHRoZSBaaXAgYXJjaGl2ZS4gRHVlIHRvIFRob21hcyBIZWxsZXIuCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSA9IEVYVF9MT0FERVIgJSB7Im5hbWUiOiBuYW1lLCAiZmlsZW5hbWUiOiBkc3RwYXRofQorICAgICAgICAgICAgICAgICAgICBjb2RlID0gY29tcGlsZShzb3VyY2UsICI8ZHlubG9hZGVyIGZvciAlcz4iICUgbmFtZSwgImV4ZWMiKQorICAgICAgICAgICAgICAgICAgICBtb2QuX19jb2RlX18gPSBjb2RlCisgICAgICAgICAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQoKHBhdGgsIHBhdGhqb2luKCJDb250ZW50cyIsICJSZXNvdXJjZXMiLCBkc3RwYXRoKSkpCisgICAgICAgICAgICBpZiBtb2QuX19jb2RlX18gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaXNwa2cgPSBtb2QuX19wYXRoX18gaXMgbm90IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi51c2VfemlwaW1wb3J0IG9yIG5hbWUgIT0gInNpdGUiOgorICAgICAgICAgICAgICAgICAgICAjIE91ciBzaXRlLnB5IGlzIGRvaW5nIHRoZSBib290c3RyYXBwaW5nLCBzbyB3ZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICMgaW5jbHVkZSBhIHJlYWwgLnB5YyBmaWxlIGlmIHNlbGYudXNlX3ppcGltcG9ydCBpcyBUcnVlLgorICAgICAgICAgICAgICAgICAgICBzZWxmLnB5bW9kdWxlcy5hcHBlbmQoKG5hbWUsIG1vZC5fX2NvZGVfXywgaXNwa2cpKQorCisgICAgICAgIGlmIGhhc2F0dHIobWYsICJhbnlfbWlzc2luZ19tYXliZSIpOgorICAgICAgICAgICAgbWlzc2luZywgbWF5YmUgPSBtZi5hbnlfbWlzc2luZ19tYXliZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtaXNzaW5nID0gbWYuYW55X21pc3NpbmcoKQorICAgICAgICAgICAgbWF5YmUgPSBbXQorICAgICAgICBzZWxmLm1pc3NpbmdNb2R1bGVzLmV4dGVuZChtaXNzaW5nKQorICAgICAgICBzZWxmLm1heWJlTWlzc2luZ01vZHVsZXMuZXh0ZW5kKG1heWJlKQorCisgICAgZGVmIHJlcG9ydE1pc3Npbmcoc2VsZik6CisgICAgICAgIG1pc3NpbmcgPSBbbmFtZSBmb3IgbmFtZSBpbiBzZWxmLm1pc3NpbmdNb2R1bGVzCisgICAgICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gTUFZTUlTU19NT0RVTEVTXQorICAgICAgICBpZiBzZWxmLm1heWJlTWlzc2luZ01vZHVsZXM6CisgICAgICAgICAgICBtYXliZSA9IHNlbGYubWF5YmVNaXNzaW5nTW9kdWxlcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWF5YmUgPSBbbmFtZSBmb3IgbmFtZSBpbiBtaXNzaW5nIGlmICIuIiBpbiBuYW1lXQorICAgICAgICAgICAgbWlzc2luZyA9IFtuYW1lIGZvciBuYW1lIGluIG1pc3NpbmcgaWYgIi4iIG5vdCBpbiBuYW1lXQorICAgICAgICBtaXNzaW5nLnNvcnQoKQorICAgICAgICBtYXliZS5zb3J0KCkKKyAgICAgICAgaWYgbWF5YmU6CisgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIldhcm5pbmc6IGNvdWxkbid0IGZpbmQgdGhlIGZvbGxvd2luZyBzdWJtb2R1bGVzOiIsIDEpCisgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIiAgICAoTm90ZSB0aGF0IHRoZXNlIGNvdWxkIGJlIGZhbHNlIGFsYXJtcyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIml0J3Mgbm90IGFsd2F5cyIsIDEpCisgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIiAgICBwb3NzaWJsZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIFwiZnJvbSBwYWNrYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHN1Ym1vZHVsZVwiICIsIDEpCisgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIiAgICBhbmQgXCJmcm9tIHBhY2thZ2UgaW1wb3J0IG5hbWVcIikiLCAxKQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gbWF5YmU6CisgICAgICAgICAgICAgICAgc2VsZi5tZXNzYWdlKCIgID8gIiArIG5hbWUsIDEpCisgICAgICAgIGlmIG1pc3Npbmc6CisgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoIldhcm5pbmc6IGNvdWxkbid0IGZpbmQgdGhlIGZvbGxvd2luZyBtb2R1bGVzOiIsIDEpCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBtaXNzaW5nOgorICAgICAgICAgICAgICAgIHNlbGYubWVzc2FnZSgiICA/ICIgKyBuYW1lLCAxKQorCisgICAgZGVmIHJlcG9ydChzZWxmKToKKyAgICAgICAgIyBYWFggc29tZXRoaW5nIGRlY2VudAorICAgICAgICBpbXBvcnQgcHByaW50CisgICAgICAgIHBwcmludC5wcHJpbnQoc2VsZi5fX2RpY3RfXykKKyAgICAgICAgaWYgc2VsZi5zdGFuZGFsb25lIG9yIHNlbGYuc2VtaV9zdGFuZGFsb25lOgorICAgICAgICAgICAgc2VsZi5yZXBvcnRNaXNzaW5nKCkKKworIworIyBVdGlsaXRpZXMuCisjCisKK1NVRkZJWEVTID0gW19zdWYgZm9yIF9zdWYsIF9tb2RlLCBfdHAgaW4gaW1wLmdldF9zdWZmaXhlcygpXQoraWRlbnRpZmllclJFID0gcmUuY29tcGlsZShyIltfYS16QS16XVtfYS16QS1aMC05XSokIikKKworZGVmIGZpbmRQYWNrYWdlQ29udGVudHMobmFtZSwgc2VhcmNocGF0aD1Ob25lKToKKyAgICBoZWFkID0gbmFtZS5zcGxpdCgiLiIpWy0xXQorICAgIGlmIGlkZW50aWZpZXJSRS5tYXRjaChoZWFkKSBpcyBOb25lOgorICAgICAgICByZXR1cm4ge30KKyAgICB0cnk6CisgICAgICAgIGZwLCBwYXRoLCAoZXh0LCBtb2RlLCB0cCkgPSBpbXAuZmluZF9tb2R1bGUoaGVhZCwgc2VhcmNocGF0aCkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHJldHVybiB7fQorICAgIG1vZHVsZXMgPSB7bmFtZTogTm9uZX0KKyAgICBpZiB0cCA9PSBpbXAuUEtHX0RJUkVDVE9SWSBhbmQgcGF0aDoKKyAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKHBhdGgpCisgICAgICAgIGZvciBzdWIgaW4gZmlsZXM6CisgICAgICAgICAgICBzdWIsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc3ViKQorICAgICAgICAgICAgZnVsbG5hbWUgPSBuYW1lICsgIi4iICsgc3ViCisgICAgICAgICAgICBpZiBzdWIgIT0gIl9faW5pdF9fIiBhbmQgZnVsbG5hbWUgbm90IGluIG1vZHVsZXM6CisgICAgICAgICAgICAgICAgbW9kdWxlcy51cGRhdGUoZmluZFBhY2thZ2VDb250ZW50cyhmdWxsbmFtZSwgW3BhdGhdKSkKKyAgICByZXR1cm4gbW9kdWxlcworCitkZWYgd3JpdGVQeWMoY29kZSwgcGF0aCk6CisgICAgZiA9IG9wZW4ocGF0aCwgIndiIikKKyAgICBmLndyaXRlKE1BR0lDKQorICAgIGYud3JpdGUoIlwwIiAqIDQpICAjIGRvbid0IGJvdGhlciBhYm91dCBhIHRpbWUgc3RhbXAKKyAgICBtYXJzaGFsLmR1bXAoY29kZSwgZikKKyAgICBmLmNsb3NlKCkKKworZGVmIGNvcHkoc3JjLCBkc3QsIG1rZGlycz0wKToKKyAgICAiIiJDb3B5IGEgZmlsZSBvciBhIGRpcmVjdG9yeS4iIiIKKyAgICBpZiBta2RpcnM6CisgICAgICAgIG1ha2VkaXJzKG9zLnBhdGguZGlybmFtZShkc3QpKQorICAgIGlmIG9zLnBhdGguaXNkaXIoc3JjKToKKyAgICAgICAgc2h1dGlsLmNvcHl0cmVlKHNyYywgZHN0LCBzeW1saW5rcz0xKQorICAgIGVsc2U6CisgICAgICAgIHNodXRpbC5jb3B5MihzcmMsIGRzdCkKKworZGVmIGNvcHl0b2RpcihzcmMsIGRzdGRpcik6CisgICAgIiIiQ29weSBhIGZpbGUgb3IgYSBkaXJlY3RvcnkgdG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5LiIiIgorICAgIGRzdCA9IHBhdGhqb2luKGRzdGRpciwgb3MucGF0aC5iYXNlbmFtZShzcmMpKQorICAgIGNvcHkoc3JjLCBkc3QpCisKK2RlZiBtYWtlZGlycyhkaXIpOgorICAgICIiIk1ha2UgYWxsIGRpcmVjdG9yaWVzIGxlYWRpbmcgdXAgdG8gJ2RpcicgaW5jbHVkaW5nIHRoZSBsZWFmCisgICAgZGlyZWN0b3J5LiBEb24ndCBtb2FuIGlmIGFueSBwYXRoIGVsZW1lbnQgYWxyZWFkeSBleGlzdHMuIiIiCisgICAgdHJ5OgorICAgICAgICBvcy5tYWtlZGlycyhkaXIpCisgICAgZXhjZXB0IE9TRXJyb3IsIHdoeToKKyAgICAgICAgaWYgd2h5LmVycm5vICE9IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgIHJhaXNlCisKK2RlZiBzeW1saW5rKHNyYywgZHN0LCBta2RpcnM9MCk6CisgICAgIiIiQ29weSBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuIiIiCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNyYyk6CisgICAgICAgIHJhaXNlIElPRXJyb3IsICJObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5OiAnJXMnIiAlIHNyYworICAgIGlmIG1rZGlyczoKKyAgICAgICAgbWFrZWRpcnMob3MucGF0aC5kaXJuYW1lKGRzdCkpCisgICAgb3Muc3ltbGluayhvcy5wYXRoLmFic3BhdGgoc3JjKSwgZHN0KQorCitkZWYgcGF0aGpvaW4oKmFyZ3MpOgorICAgICIiIlNhZmUgd3JhcHBlciBmb3Igb3MucGF0aC5qb2luOiBhc3NlcnRzIHRoYXQgYWxsIGJ1dCB0aGUgZmlyc3QKKyAgICBhcmd1bWVudCBhcmUgcmVsYXRpdmUgcGF0aHMuIiIiCisgICAgZm9yIHNlZyBpbiBhcmdzWzE6XToKKyAgICAgICAgYXNzZXJ0IHNlZ1swXSAhPSAiLyIKKyAgICByZXR1cm4gb3MucGF0aC5qb2luKCphcmdzKQorCisKK2NtZGxpbmVfZG9jID0gIiIiXAorVXNhZ2U6CisgIHB5dGhvbiBidW5kbGVidWlsZGVyLnB5IFtvcHRpb25zXSBjb21tYW5kCisgIHB5dGhvbiBteWJ1aWxkc2NyaXB0LnB5IFtvcHRpb25zXSBjb21tYW5kCisKK0NvbW1hbmRzOgorICBidWlsZCAgICAgIGJ1aWxkIHRoZSBhcHBsaWNhdGlvbgorICByZXBvcnQgICAgIHByaW50IGEgcmVwb3J0CisKK09wdGlvbnM6CisgIC1iLCAtLWJ1aWxkZGlyPURJUiAgICAgdGhlIGJ1aWxkIGRpcmVjdG9yeTsgZGVmYXVsdHMgdG8gImJ1aWxkIgorICAtbiwgLS1uYW1lPU5BTUUgICAgICAgIGFwcGxpY2F0aW9uIG5hbWUKKyAgLXIsIC0tcmVzb3VyY2U9RklMRSAgICBleHRyYSBmaWxlIG9yIGZvbGRlciB0byBiZSBjb3BpZWQgdG8gUmVzb3VyY2VzCisgIC1mLCAtLWZpbGU9U1JDOkRTVCAgICAgZXh0cmEgZmlsZSBvciBmb2xkZXIgdG8gYmUgY29waWVkIGludG8gdGhlIGJ1bmRsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBEU1QgbXVzdCBiZSBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIGJ1bmRsZSByb290CisgIC1lLCAtLWV4ZWN1dGFibGU9RklMRSAgdGhlIGV4ZWN1dGFibGUgdG8gYmUgdXNlZAorICAtbSwgLS1tYWlucHJvZ3JhbT1GSUxFIHRoZSBQeXRob24gbWFpbiBwcm9ncmFtCisgIC1hLCAtLWFyZ3YgICAgICAgICAgICAgYWRkIGEgd3JhcHBlciBtYWluIHByb2dyYW0gdG8gY3JlYXRlIHN5cy5hcmd2CisgIC1wLCAtLXBsaXN0PUZJTEUgICAgICAgLnBsaXN0IGZpbGUgKGRlZmF1bHQ6IGdlbmVyYXRlIG9uZSkKKyAgICAgIC0tbmliPU5BTUUgICAgICAgICBtYWluIG5pYiBuYW1lCisgIC1jLCAtLWNyZWF0b3I9Q0NDQyAgICAgNC1jaGFyIGNyZWF0b3IgY29kZSAoZGVmYXVsdDogJz8/Pz8nKQorICAgICAgLS1pY29uZmlsZT1GSUxFICAgIGZpbGVuYW1lIG9mIHRoZSBpY29uIChhbiAuaWNucyBmaWxlKSB0byBiZSB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIEZpbmRlciBpY29uCisgICAgICAtLWJ1bmRsZS1pZD1JRCAgICAgdGhlIENGQnVuZGxlSWRlbnRpZmllciwgaW4gcmV2ZXJzZS1kbnMgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgKGVnLiBvcmcucHl0aG9uLkJ1aWxkQXBwbGV0OyB0aGlzIGlzIHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByZWZlcmVuY2VzIGZpbGUgbmFtZSkKKyAgLWwsIC0tbGluayAgICAgICAgICAgICBzeW1saW5rIGZpbGVzL2ZvbGRlciBpbnN0ZWFkIG9mIGNvcHlpbmcgdGhlbQorICAgICAgLS1saW5rLWV4ZWMgICAgICAgIHN5bWxpbmsgdGhlIGV4ZWN1dGFibGUgaW5zdGVhZCBvZiBjb3B5aW5nIGl0CisgICAgICAtLXN0YW5kYWxvbmUgICAgICAgYnVpbGQgYSBzdGFuZGFsb25lIGFwcGxpY2F0aW9uLCB3aGljaCBpcyBmdWxseQorICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVwZW5kZW50IG9mIGEgUHl0aG9uIGluc3RhbGxhdGlvbgorICAgICAgLS1zZW1pLXN0YW5kYWxvbmUgIGJ1aWxkIGEgc3RhbmRhbG9uZSBhcHBsaWNhdGlvbiwgd2hpY2ggZGVwZW5kcyBvbgorICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGluc3RhbGxlZCBQeXRob24sIHlldCBpbmNsdWRlcyBhbGwgdGhpcmQtcGFydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLgorICAgICAgLS1uby16aXBpbXBvcnQgICAgIERvIG5vdCBjb3B5IGNvZGUgaW50byBhIHppcCBmaWxlCisgICAgICAtLXB5dGhvbj1GSUxFICAgICAgUHl0aG9uIHRvIHVzZSBpbiAjISBsaW5lIGluIHN0ZWFkIG9mIGN1cnJlbnQgUHl0aG9uCisgICAgICAtLWxpYj1GSUxFICAgICAgICAgc2hhcmVkIGxpYnJhcnkgb3IgZnJhbWV3b3JrIHRvIGJlIGNvcGllZCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ1bmRsZQorICAteCwgLS1leGNsdWRlPU1PRFVMRSAgIGV4Y2x1ZGUgbW9kdWxlICh3aXRoIC0tKHNlbWktKXN0YW5kYWxvbmUpCisgIC1pLCAtLWluY2x1ZGU9TU9EVUxFICAgaW5jbHVkZSBtb2R1bGUgKHdpdGggLS0oc2VtaS0pc3RhbmRhbG9uZSkKKyAgICAgIC0tcGFja2FnZT1QQUNLQUdFICBpbmNsdWRlIGEgd2hvbGUgcGFja2FnZSAod2l0aCAtLShzZW1pLSlzdGFuZGFsb25lKQorICAgICAgLS1zdHJpcCAgICAgICAgICAgIHN0cmlwIGJpbmFyaWVzIChyZW1vdmUgZGVidWcgaW5mbykKKyAgLXYsIC0tdmVyYm9zZSAgICAgICAgICBpbmNyZWFzZSB2ZXJib3NpdHkgbGV2ZWwKKyAgLXEsIC0tcXVpZXQgICAgICAgICAgICBkZWNyZWFzZSB2ZXJib3NpdHkgbGV2ZWwKKyAgLWgsIC0taGVscCAgICAgICAgICAgICBwcmludCB0aGlzIG1lc3NhZ2UKKyIiIgorCitkZWYgdXNhZ2UobXNnPU5vbmUpOgorICAgIGlmIG1zZzoKKyAgICAgICAgcHJpbnQgbXNnCisgICAgcHJpbnQgY21kbGluZV9kb2MKKyAgICBzeXMuZXhpdCgxKQorCitkZWYgbWFpbihidWlsZGVyPU5vbmUpOgorICAgIGlmIGJ1aWxkZXIgaXMgTm9uZToKKyAgICAgICAgYnVpbGRlciA9IEFwcEJ1aWxkZXIodmVyYm9zaXR5PTEpCisKKyAgICBzaG9ydG9wdHMgPSAiYjpuOnI6ZjplOm06YzpwOmx4Omk6aHZxYSIKKyAgICBsb25nb3B0cyA9ICgiYnVpbGRkaXI9IiwgIm5hbWU9IiwgInJlc291cmNlPSIsICJmaWxlPSIsICJleGVjdXRhYmxlPSIsCisgICAgICAgICJtYWlucHJvZ3JhbT0iLCAiY3JlYXRvcj0iLCAibmliPSIsICJwbGlzdD0iLCAibGluayIsCisgICAgICAgICJsaW5rLWV4ZWMiLCAiaGVscCIsICJ2ZXJib3NlIiwgInF1aWV0IiwgImFyZ3YiLCAic3RhbmRhbG9uZSIsCisgICAgICAgICJleGNsdWRlPSIsICJpbmNsdWRlPSIsICJwYWNrYWdlPSIsICJzdHJpcCIsICJpY29uZmlsZT0iLAorICAgICAgICAibGliPSIsICJweXRob249IiwgInNlbWktc3RhbmRhbG9uZSIsICJidW5kbGUtaWQ9IiwgImRlc3Ryb290PSIKKyAgICAgICAgIm5vLXppcGltcG9ydCIKKyAgICAgICAgKQorCisgICAgdHJ5OgorICAgICAgICBvcHRpb25zLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sIHNob3J0b3B0cywgbG9uZ29wdHMpCisgICAgZXhjZXB0IGdldG9wdC5lcnJvcjoKKyAgICAgICAgdXNhZ2UoKQorCisgICAgZm9yIG9wdCwgYXJnIGluIG9wdGlvbnM6CisgICAgICAgIGlmIG9wdCBpbiAoJy1iJywgJy0tYnVpbGRkaXInKToKKyAgICAgICAgICAgIGJ1aWxkZXIuYnVpbGRkaXIgPSBhcmcKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctbicsICctLW5hbWUnKToKKyAgICAgICAgICAgIGJ1aWxkZXIubmFtZSA9IGFyZworICAgICAgICBlbGlmIG9wdCBpbiAoJy1yJywgJy0tcmVzb3VyY2UnKToKKyAgICAgICAgICAgIGJ1aWxkZXIucmVzb3VyY2VzLmFwcGVuZChvcy5wYXRoLm5vcm1wYXRoKGFyZykpCisgICAgICAgIGVsaWYgb3B0IGluICgnLWYnLCAnLS1maWxlJyk6CisgICAgICAgICAgICBzcmNkc3QgPSBhcmcuc3BsaXQoJzonKQorICAgICAgICAgICAgaWYgbGVuKHNyY2RzdCkgIT0gMjoKKyAgICAgICAgICAgICAgICB1c2FnZSgiLWYgb3IgLS1maWxlIGFyZ3VtZW50IG11c3QgYmUgdHdvIHBhdGhzLCAiCisgICAgICAgICAgICAgICAgICAgICAgInNlcGFyYXRlZCBieSBhIGNvbG9uIikKKyAgICAgICAgICAgIGJ1aWxkZXIuZmlsZXMuYXBwZW5kKHNyY2RzdCkKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctZScsICctLWV4ZWN1dGFibGUnKToKKyAgICAgICAgICAgIGJ1aWxkZXIuZXhlY3V0YWJsZSA9IGFyZworICAgICAgICBlbGlmIG9wdCBpbiAoJy1tJywgJy0tbWFpbnByb2dyYW0nKToKKyAgICAgICAgICAgIGJ1aWxkZXIubWFpbnByb2dyYW0gPSBhcmcKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctYScsICctLWFyZ3YnKToKKyAgICAgICAgICAgIGJ1aWxkZXIuYXJndl9lbXVsYXRpb24gPSAxCisgICAgICAgIGVsaWYgb3B0IGluICgnLWMnLCAnLS1jcmVhdG9yJyk6CisgICAgICAgICAgICBidWlsZGVyLmNyZWF0b3IgPSBhcmcKKyAgICAgICAgZWxpZiBvcHQgPT0gJy0tYnVuZGxlLWlkJzoKKyAgICAgICAgICAgIGJ1aWxkZXIuYnVuZGxlX2lkID0gYXJnCisgICAgICAgIGVsaWYgb3B0ID09ICctLWljb25maWxlJzoKKyAgICAgICAgICAgIGJ1aWxkZXIuaWNvbmZpbGUgPSBhcmcKKyAgICAgICAgZWxpZiBvcHQgPT0gIi0tbGliIjoKKyAgICAgICAgICAgIGJ1aWxkZXIubGlicy5hcHBlbmQob3MucGF0aC5ub3JtcGF0aChhcmcpKQorICAgICAgICBlbGlmIG9wdCA9PSAiLS1uaWIiOgorICAgICAgICAgICAgYnVpbGRlci5uaWJuYW1lID0gYXJnCisgICAgICAgIGVsaWYgb3B0IGluICgnLXAnLCAnLS1wbGlzdCcpOgorICAgICAgICAgICAgYnVpbGRlci5wbGlzdCA9IFBsaXN0LmZyb21GaWxlKGFyZykKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctbCcsICctLWxpbmsnKToKKyAgICAgICAgICAgIGJ1aWxkZXIuc3ltbGluayA9IDEKKyAgICAgICAgZWxpZiBvcHQgPT0gJy0tbGluay1leGVjJzoKKyAgICAgICAgICAgIGJ1aWxkZXIuc3ltbGlua19leGVjID0gMQorICAgICAgICBlbGlmIG9wdCBpbiAoJy1oJywgJy0taGVscCcpOgorICAgICAgICAgICAgdXNhZ2UoKQorICAgICAgICBlbGlmIG9wdCBpbiAoJy12JywgJy0tdmVyYm9zZScpOgorICAgICAgICAgICAgYnVpbGRlci52ZXJib3NpdHkgKz0gMQorICAgICAgICBlbGlmIG9wdCBpbiAoJy1xJywgJy0tcXVpZXQnKToKKyAgICAgICAgICAgIGJ1aWxkZXIudmVyYm9zaXR5IC09IDEKKyAgICAgICAgZWxpZiBvcHQgPT0gJy0tc3RhbmRhbG9uZSc6CisgICAgICAgICAgICBidWlsZGVyLnN0YW5kYWxvbmUgPSAxCisgICAgICAgIGVsaWYgb3B0ID09ICctLXNlbWktc3RhbmRhbG9uZSc6CisgICAgICAgICAgICBidWlsZGVyLnNlbWlfc3RhbmRhbG9uZSA9IDEKKyAgICAgICAgZWxpZiBvcHQgPT0gJy0tcHl0aG9uJzoKKyAgICAgICAgICAgIGJ1aWxkZXIucHl0aG9uID0gYXJnCisgICAgICAgIGVsaWYgb3B0IGluICgnLXgnLCAnLS1leGNsdWRlJyk6CisgICAgICAgICAgICBidWlsZGVyLmV4Y2x1ZGVNb2R1bGVzLmFwcGVuZChhcmcpCisgICAgICAgIGVsaWYgb3B0IGluICgnLWknLCAnLS1pbmNsdWRlJyk6CisgICAgICAgICAgICBidWlsZGVyLmluY2x1ZGVNb2R1bGVzLmFwcGVuZChhcmcpCisgICAgICAgIGVsaWYgb3B0ID09ICctLXBhY2thZ2UnOgorICAgICAgICAgICAgYnVpbGRlci5pbmNsdWRlUGFja2FnZXMuYXBwZW5kKGFyZykKKyAgICAgICAgZWxpZiBvcHQgPT0gJy0tc3RyaXAnOgorICAgICAgICAgICAgYnVpbGRlci5zdHJpcCA9IDEKKyAgICAgICAgZWxpZiBvcHQgPT0gJy0tZGVzdHJvb3QnOgorICAgICAgICAgICAgYnVpbGRlci5kZXN0cm9vdCA9IGFyZworICAgICAgICBlbGlmIG9wdCA9PSAnLS1uby16aXBpbXBvcnQnOgorICAgICAgICAgICAgYnVpbGRlci51c2VfemlwaW1wb3J0ID0gRmFsc2UKKworICAgIGlmIGxlbihhcmdzKSAhPSAxOgorICAgICAgICB1c2FnZSgiTXVzdCBzcGVjaWZ5IG9uZSBjb21tYW5kICgnYnVpbGQnLCAncmVwb3J0JyBvciAnaGVscCcpIikKKyAgICBjb21tYW5kID0gYXJnc1swXQorCisgICAgaWYgY29tbWFuZCA9PSAiYnVpbGQiOgorICAgICAgICBidWlsZGVyLnNldHVwKCkKKyAgICAgICAgYnVpbGRlci5idWlsZCgpCisgICAgZWxpZiBjb21tYW5kID09ICJyZXBvcnQiOgorICAgICAgICBidWlsZGVyLnNldHVwKCkKKyAgICAgICAgYnVpbGRlci5yZXBvcnQoKQorICAgIGVsaWYgY29tbWFuZCA9PSAiaGVscCI6CisgICAgICAgIHVzYWdlKCkKKyAgICBlbHNlOgorICAgICAgICB1c2FnZSgiVW5rbm93biBjb21tYW5kICclcyciICUgY29tbWFuZCkKKworCitkZWYgYnVpbGRhcHAoKiprd2FyZ3MpOgorICAgIGJ1aWxkZXIgPSBBcHBCdWlsZGVyKCoqa3dhcmdzKQorICAgIG1haW4oYnVpbGRlcikKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9idW5kbGVidWlsZGVyLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYnVuZGxlYnVpbGRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExNDg1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYnVuZGxlYnVpbGRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9idW5kbGVidWlsZGVyLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYnVuZGxlYnVpbGRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwMmU3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvYnVuZGxlYnVpbGRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9jZm1maWxlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9jZm1maWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MjM4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2NmbWZpbGUucHkKQEAgLTAsMCArMSwxODcgQEAKKyIiImNvZGVmcmFnbWVudHMucHkgLS0gd3JhcHBlciB0byBtb2RpZnkgY29kZSBmcmFnbWVudHMuIiIiCisKKyMgKGMpIDE5OTgsIEp1c3QgdmFuIFJvc3N1bSwgTGV0dGVycm9yCisKK19fdmVyc2lvbl9fID0gIjAuOGIzIgorX19hdXRob3JfXyA9ICJqdnIiCisKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3Mud2FybnB5M2soInRoZSBjZm1maWxlIG1vZHVsZSBpcyBkZXByZWNhdGVkIGFuZCBpcyByZW1vdmVkIGluIDMsMCIsCisgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MikKKworaW1wb3J0IENhcmJvbi5GaWxlCitpbXBvcnQgc3RydWN0Citmcm9tIENhcmJvbiBpbXBvcnQgUmVzCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworREVCVUcgPSAwCisKK2Vycm9yID0gImNmbS5lcnJvciIKKworQlVGU0laRSA9IDB4ODAwMDAKKworZGVmIG1lcmdlY2ZtZmlsZXMoc3JjbGlzdCwgZHN0LCBhcmNoaXRlY3R1cmUgPSAnZmF0Jyk6CisgICAgIiIiTWVyZ2UgYWxsIGZpbGVzIGluIHNyY2xpc3QgaW50byBhIG5ldyBmaWxlIGRzdC4KKworICAgIElmIGFyY2hpdGVjdHVyZSBpcyBnaXZlbiwgb25seSBjb2RlIGZyYWdtZW50cyBvZiB0aGF0IHR5cGUgd2lsbCBiZSB1c2VkOgorICAgICJwd3BjIiBmb3IgUFBDLCAibTY4ayIgZm9yIGNmbTY4ay4gVGhpcyBkb2VzIG5vdCB3b3JrIGZvciAiY2xhc3NpYyIKKyAgICA2OGsgY29kZSwgc2luY2UgaXQgZG9lcyBub3QgdXNlIGNvZGUgZnJhZ21lbnRzIHRvIGJlZ2luIHdpdGguCisgICAgSWYgYXJjaGl0ZWN0dXJlIGlzIE5vbmUsIGFsbCBmcmFnbWVudHMgd2lsbCBiZSB1c2VkLCBlbmFibGluZyBGQVQgYmluYXJpZXMuCisgICAgIiIiCisKKyAgICBzcmNsaXN0ID0gbGlzdChzcmNsaXN0KQorICAgIGZvciBpIGluIHJhbmdlKGxlbihzcmNsaXN0KSk6CisgICAgICAgIHNyY2xpc3RbaV0gPSBDYXJib24uRmlsZS5wYXRobmFtZShzcmNsaXN0W2ldKQorICAgIGRzdCA9IENhcmJvbi5GaWxlLnBhdGhuYW1lKGRzdCkKKworICAgIGRzdGZpbGUgPSBvcGVuKGRzdCwgIndiIikKKyAgICByZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShkc3QsIDMpCisgICAgdHJ5OgorICAgICAgICBkc3RjZnJnID0gQ2ZyZ1Jlc291cmNlKCkKKyAgICAgICAgZm9yIHNyYyBpbiBzcmNsaXN0OgorICAgICAgICAgICAgc3JjY2ZyZyA9IENmcmdSZXNvdXJjZShzcmMpCisgICAgICAgICAgICBmb3IgZnJhZyBpbiBzcmNjZnJnLmZyYWdtZW50czoKKyAgICAgICAgICAgICAgICBpZiBmcmFnLmFyY2hpdGVjdHVyZSA9PSAncHdwYycgYW5kIGFyY2hpdGVjdHVyZSA9PSAnbTY4ayc6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgZnJhZy5hcmNoaXRlY3R1cmUgPT0gJ202OGsnIGFuZCBhcmNoaXRlY3R1cmUgPT0gJ3B3cGMnOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGRzdGNmcmcuYXBwZW5kKGZyYWcpCisKKyAgICAgICAgICAgICAgICBmcmFnLmNvcHlkYXRhKGRzdGZpbGUpCisKKyAgICAgICAgY2ZyZ3JlcyA9IFJlcy5SZXNvdXJjZShkc3RjZnJnLmJ1aWxkKCkpCisgICAgICAgIFJlcy5Vc2VSZXNGaWxlKHJmKQorICAgICAgICBjZnJncmVzLkFkZFJlc291cmNlKCdjZnJnJywgMCwgIiIpCisgICAgZmluYWxseToKKyAgICAgICAgZHN0ZmlsZS5jbG9zZSgpCisgICAgICAgIHJmID0gUmVzLkNsb3NlUmVzRmlsZShyZikKKworCitjbGFzcyBDZnJnUmVzb3VyY2U6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCA9IE5vbmUpOgorICAgICAgICBzZWxmLnZlcnNpb24gPSAxCisgICAgICAgIHNlbGYuZnJhZ21lbnRzID0gW10KKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lIGFuZCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgIGN1cnJlbnRyZXNyZWYgPSBSZXMuQ3VyUmVzRmlsZSgpCisgICAgICAgICAgICByZXNyZWYgPSBSZXMuRlNwT3BlblJlc0ZpbGUocGF0aCwgMSkKKyAgICAgICAgICAgIFJlcy5Vc2VSZXNGaWxlKHJlc3JlZikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBSZXMuR2V0MVJlc291cmNlKCdjZnJnJywgMCkuZGF0YQorICAgICAgICAgICAgICAgIGV4Y2VwdCBSZXMuRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlcy5FcnJvciwgIm5vICdjZnJnJyByZXNvdXJjZSBmb3VuZCIsIHN5cy5leGNfdHJhY2ViYWNrCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIFJlcy5DbG9zZVJlc0ZpbGUocmVzcmVmKQorICAgICAgICAgICAgICAgIFJlcy5Vc2VSZXNGaWxlKGN1cnJlbnRyZXNyZWYpCisgICAgICAgICAgICBzZWxmLnBhcnNlKGRhdGEpCisgICAgICAgICAgICBpZiBzZWxmLnZlcnNpb24gIT0gMToKKyAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVua25vd24gJ2NmcmcnIHJlc291cmNlIGZvcm1hdCIKKworICAgIGRlZiBwYXJzZShzZWxmLCBkYXRhKToKKyAgICAgICAgKHJlczEsIHJlczIsIHNlbGYudmVyc2lvbiwKKyAgICAgICAgICAgIHJlczMsIHJlczQsIHJlczUsIHJlczYsCisgICAgICAgICAgICBzZWxmLm1lbWJlckNvdW50KSA9IHN0cnVjdC51bnBhY2soIjhsIiwgZGF0YVs6MzJdKQorICAgICAgICBkYXRhID0gZGF0YVszMjpdCisgICAgICAgIHdoaWxlIGRhdGE6CisgICAgICAgICAgICBmcmFnID0gRnJhZ21lbnREZXNjcmlwdG9yKHNlbGYucGF0aCwgZGF0YSkKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhW2ZyYWcubWVtYmVyU2l6ZTpdCisgICAgICAgICAgICBzZWxmLmZyYWdtZW50cy5hcHBlbmQoZnJhZykKKworICAgIGRlZiBidWlsZChzZWxmKToKKyAgICAgICAgc2VsZi5tZW1iZXJDb3VudCA9IGxlbihzZWxmLmZyYWdtZW50cykKKyAgICAgICAgZGF0YSA9IHN0cnVjdC5wYWNrKCI4bCIsIDAsIDAsIHNlbGYudmVyc2lvbiwgMCwgMCwgMCwgMCwgc2VsZi5tZW1iZXJDb3VudCkKKyAgICAgICAgZm9yIGZyYWcgaW4gc2VsZi5mcmFnbWVudHM6CisgICAgICAgICAgICBkYXRhID0gZGF0YSArIGZyYWcuYnVpbGQoKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIGFwcGVuZChzZWxmLCBmcmFnKToKKyAgICAgICAgc2VsZi5mcmFnbWVudHMuYXBwZW5kKGZyYWcpCisKKworY2xhc3MgRnJhZ21lbnREZXNjcmlwdG9yOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGRhdGEgPSBOb25lKToKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBpZiBkYXRhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5wYXJzZShkYXRhKQorCisgICAgZGVmIHBhcnNlKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFyY2hpdGVjdHVyZSA9IGRhdGFbOjRdCisgICAgICAgICggICBzZWxmLnVwZGF0ZWxldmVsLAorICAgICAgICAgICAgc2VsZi5jdXJyZW50VmVyc2lvbiwKKyAgICAgICAgICAgIHNlbGYub2xkRGVmVmVyc2lvbiwKKyAgICAgICAgICAgIHNlbGYuc3RhY2tzaXplLAorICAgICAgICAgICAgc2VsZi5hcHBsaWJkaXIsCisgICAgICAgICAgICBzZWxmLmZyYWd0eXBlLAorICAgICAgICAgICAgc2VsZi53aGVyZSwKKyAgICAgICAgICAgIHNlbGYub2Zmc2V0LAorICAgICAgICAgICAgc2VsZi5sZW5ndGgsCisgICAgICAgICAgICBzZWxmLnJlczEsIHNlbGYucmVzMiwKKyAgICAgICAgICAgIHNlbGYubWVtYmVyU2l6ZSwpID0gc3RydWN0LnVucGFjaygiNGxoQkI0bGgiLCBkYXRhWzQ6NDJdKQorICAgICAgICBwbmFtZSA9IGRhdGFbNDI6c2VsZi5tZW1iZXJTaXplXQorICAgICAgICBzZWxmLm5hbWUgPSBwbmFtZVsxOjErb3JkKHBuYW1lWzBdKV0KKworICAgIGRlZiBidWlsZChzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYuYXJjaGl0ZWN0dXJlCisgICAgICAgIGRhdGEgPSBkYXRhICsgc3RydWN0LnBhY2soIjRsaEJCNGwiLAorICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlbGV2ZWwsCisgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50VmVyc2lvbiwKKyAgICAgICAgICAgICAgICBzZWxmLm9sZERlZlZlcnNpb24sCisgICAgICAgICAgICAgICAgc2VsZi5zdGFja3NpemUsCisgICAgICAgICAgICAgICAgc2VsZi5hcHBsaWJkaXIsCisgICAgICAgICAgICAgICAgc2VsZi5mcmFndHlwZSwKKyAgICAgICAgICAgICAgICBzZWxmLndoZXJlLAorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0LAorICAgICAgICAgICAgICAgIHNlbGYubGVuZ3RoLAorICAgICAgICAgICAgICAgIHNlbGYucmVzMSwgc2VsZi5yZXMyKQorICAgICAgICBzZWxmLm1lbWJlclNpemUgPSBsZW4oZGF0YSkgKyAyICsgMSArIGxlbihzZWxmLm5hbWUpCisgICAgICAgICMgcGFkIHRvIDQgYnl0ZSBib3VuZGFyaWVzCisgICAgICAgIGlmIHNlbGYubWVtYmVyU2l6ZSAlIDQ6CisgICAgICAgICAgICBzZWxmLm1lbWJlclNpemUgPSBzZWxmLm1lbWJlclNpemUgKyA0IC0gKHNlbGYubWVtYmVyU2l6ZSAlIDQpCisgICAgICAgIGRhdGEgPSBkYXRhICsgc3RydWN0LnBhY2soImhiIiwgc2VsZi5tZW1iZXJTaXplLCBsZW4oc2VsZi5uYW1lKSkKKyAgICAgICAgZGF0YSA9IGRhdGEgKyBzZWxmLm5hbWUKKyAgICAgICAgZGF0YSA9IGRhdGEgKyAnXDAwMCcgKiAoc2VsZi5tZW1iZXJTaXplIC0gbGVuKGRhdGEpKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIGdldGZyYWdtZW50KHNlbGYpOgorICAgICAgICBpZiBzZWxmLndoZXJlICE9IDE6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgImNhbid0IHJlYWQgZnJhZ21lbnQsIHVuc3VwcG9ydGVkIGxvY2F0aW9uIgorICAgICAgICBmID0gb3BlbihzZWxmLnBhdGgsICJyYiIpCisgICAgICAgIGYuc2VlayhzZWxmLm9mZnNldCkKKyAgICAgICAgaWYgc2VsZi5sZW5ndGg6CisgICAgICAgICAgICBmcmFnID0gZi5yZWFkKHNlbGYubGVuZ3RoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnJhZyA9IGYucmVhZCgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gZnJhZworCisgICAgZGVmIGNvcHlkYXRhKHNlbGYsIG91dGZpbGUpOgorICAgICAgICBpZiBzZWxmLndoZXJlICE9IDE6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgImNhbid0IHJlYWQgZnJhZ21lbnQsIHVuc3VwcG9ydGVkIGxvY2F0aW9uIgorICAgICAgICBpbmZpbGUgPSBvcGVuKHNlbGYucGF0aCwgInJiIikKKyAgICAgICAgaWYgc2VsZi5sZW5ndGggPT0gMDoKKyAgICAgICAgICAgIGluZmlsZS5zZWVrKDAsIDIpCisgICAgICAgICAgICBzZWxmLmxlbmd0aCA9IGluZmlsZS50ZWxsKCkKKworICAgICAgICAjIFBvc2l0aW9uIGlucHV0IGZpbGUgYW5kIHJlY29yZCBuZXcgb2Zmc2V0IGZyb20gb3V0cHV0IGZpbGUKKyAgICAgICAgaW5maWxlLnNlZWsoc2VsZi5vZmZzZXQpCisKKyAgICAgICAgIyBwYWQgdG8gMTYgYnl0ZSBib3VuZGFyaWVzCisgICAgICAgIG9mZnNldCA9IG91dGZpbGUudGVsbCgpCisgICAgICAgIGlmIG9mZnNldCAlIDE2OgorICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgMTYgLSAob2Zmc2V0ICUgMTYpCisgICAgICAgIG91dGZpbGUuc2VlayhvZmZzZXQpCisgICAgICAgIHNlbGYub2Zmc2V0ID0gb2Zmc2V0CisKKyAgICAgICAgbCA9IHNlbGYubGVuZ3RoCisgICAgICAgIHdoaWxlIGw6CisgICAgICAgICAgICBpZiBsID4gQlVGU0laRToKKyAgICAgICAgICAgICAgICBvdXRmaWxlLndyaXRlKGluZmlsZS5yZWFkKEJVRlNJWkUpKQorICAgICAgICAgICAgICAgIGwgPSBsIC0gQlVGU0laRQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvdXRmaWxlLndyaXRlKGluZmlsZS5yZWFkKGwpKQorICAgICAgICAgICAgICAgIGwgPSAwCisgICAgICAgIGluZmlsZS5jbG9zZSgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2NmbWZpbGUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9jZm1maWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2M4YjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9jZm1maWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2NmbWZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9jZm1maWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2M4YjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9jZm1maWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2RpYWxvZ3MucnNyYyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvZGlhbG9ncy5yc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMDc0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2RpYWxvZ3MucnNyYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2Vycm9ycy5yc3JjIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9lcnJvcnMucnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWM0ODdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9lcnJvcnMucnNyYwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2ZpbmRlcnRvb2xzLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9maW5kZXJ0b29scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGM3NGE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9maW5kZXJ0b29scy5weQpAQCAtMCwwICsxLDgzNSBAQAorIiIiVXRpbGl0eSByb3V0aW5lcyBkZXBlbmRpbmcgb24gdGhlIGZpbmRlciwKK2EgY29tYmluYXRpb24gb2YgY29kZSBieSBKYWNrIEphbnNlbiBhbmQgZXJpa0BsZXR0ZXJyb3IuY29tLgorCitNb3N0IGV2ZW50cyBoYXZlIGJlZW4gY2FwdHVyZWQgZnJvbQorTGFzc28gQ2FwdHVyZSBBRSBhbmQgdGhhbiB0cmFuc2xhdGVkIHRvIHB5dGhvbiBjb2RlLgorCitJTVBPUlRBTlQKK05vdGUgdGhhdCB0aGUgcHJvY2Vzc2VzKCkgZnVuY3Rpb24gcmV0dXJucyBkaWZmZXJlbnQgdmFsdWVzCitkZXBlbmRpbmcgb24gdGhlIE9TIHZlcnNpb24gaXQgaXMgcnVubmluZyBvbi4gT24gTWFjT1MgOQordGhlIEZpbmRlciByZXR1cm5zIHRoZSBwcm9jZXNzICpuYW1lcyogd2hpY2ggY2FuIHRoZW4gYmUKK3VzZWQgdG8gZmluZCBvdXQgbW9yZSBhYm91dCB0aGVtLiBPbiBNYWNPUyA4LjYgYW5kIGVhcmxpZXIKK3RoZSBGaW5kZXIgcmV0dXJucyBhIGNvZGUgd2hpY2ggZG9lcyBub3Qgc2VlbSB0byB3b3JrLgorU28gYm90dG9tIGxpbmU6IHRoZSBwcm9jZXNzZXMoKSBzdHVmZiBkb2VzIG5vdCB3b3JrIG9uIDwgTWFjT1M5CisKK01vc3RseSB3cml0dGVuIGJ5IGVyaWtAbGV0dGVycm9yLmNvbQorIiIiCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgZmluZGVydG9vbHMgbW9kdWxlIGlzIHJlbW92ZWQuIiwgc3RhY2tsZXZlbD0yKQorCitpbXBvcnQgRmluZGVyCitmcm9tIENhcmJvbiBpbXBvcnQgQXBwbGVFdmVudHMKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKK2ltcG9ydCBzeXMKK2ltcG9ydCBDYXJib24uRmlsZQoraW1wb3J0IENhcmJvbi5Gb2xkZXIKK2ltcG9ydCBhZXR5cGVzCitmcm9tIHR5cGVzIGltcG9ydCAqCisKK19fdmVyc2lvbl9fID0gJzEuMScKK0Vycm9yID0gJ2ZpbmRlcnRvb2xzLkVycm9yJworCitfZmluZGVyX3RhbGtlciA9IE5vbmUKKworZGVmIF9nZXRmaW5kZXIoKToKKyAgICAiIiJyZXR1cm5zIGJhc2ljIChyZWN5Y2xhYmxlKSBGaW5kZXIgQUUgaW50ZXJmYWNlIG9iamVjdCIiIgorICAgIGdsb2JhbCBfZmluZGVyX3RhbGtlcgorICAgIGlmIG5vdCBfZmluZGVyX3RhbGtlcjoKKyAgICAgICAgX2ZpbmRlcl90YWxrZXIgPSBGaW5kZXIuRmluZGVyKCkKKyAgICBfZmluZGVyX3RhbGtlci5zZW5kX2ZsYWdzID0gKCBfZmluZGVyX3RhbGtlci5zZW5kX2ZsYWdzIHwKKyAgICAgICAgQXBwbGVFdmVudHMua0FFQ2FuSW50ZXJhY3QgfCBBcHBsZUV2ZW50cy5rQUVDYW5Td2l0Y2hMYXllcikKKyAgICByZXR1cm4gX2ZpbmRlcl90YWxrZXIKKworZGVmIGxhdW5jaChmaWxlKToKKyAgICAiIiJPcGVuIGEgZmlsZSB0aHJ1IHRoZSBmaW5kZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYyIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhmaWxlKQorICAgIHJldHVybiBmaW5kZXIub3Blbihmc3MpCisKK2RlZiBQcmludChmaWxlKToKKyAgICAiIiJQcmludCBhIGZpbGUgdGhydSB0aGUgZmluZGVyLiBTcGVjaWZ5IGZpbGUgYnkgbmFtZSBvciBmc3NwZWMiIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBmc3MgPSBDYXJib24uRmlsZS5GU1NwZWMoZmlsZSkKKyAgICByZXR1cm4gZmluZGVyLl9wcmludChmc3MpCisKK2RlZiBjb3B5KHNyYywgZHN0ZGlyKToKKyAgICAiIiJDb3B5IGEgZmlsZSB0byBhIGZvbGRlciIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGlmIHR5cGUoc3JjKSA9PSB0eXBlKFtdKToKKyAgICAgICAgc3JjX2ZzcyA9IFtdCisgICAgICAgIGZvciBzIGluIHNyYzoKKyAgICAgICAgICAgIHNyY19mc3MuYXBwZW5kKENhcmJvbi5GaWxlLkZTU3BlYyhzKSkKKyAgICBlbHNlOgorICAgICAgICBzcmNfZnNzID0gQ2FyYm9uLkZpbGUuRlNTcGVjKHNyYykKKyAgICBkc3RfZnNzID0gQ2FyYm9uLkZpbGUuRlNTcGVjKGRzdGRpcikKKyAgICByZXR1cm4gZmluZGVyLmR1cGxpY2F0ZShzcmNfZnNzLCB0bz1kc3RfZnNzKQorCitkZWYgbW92ZShzcmMsIGRzdGRpcik6CisgICAgIiIiTW92ZSBhIGZpbGUgdG8gYSBmb2xkZXIiIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBpZiB0eXBlKHNyYykgPT0gdHlwZShbXSk6CisgICAgICAgIHNyY19mc3MgPSBbXQorICAgICAgICBmb3IgcyBpbiBzcmM6CisgICAgICAgICAgICBzcmNfZnNzLmFwcGVuZChDYXJib24uRmlsZS5GU1NwZWMocykpCisgICAgZWxzZToKKyAgICAgICAgc3JjX2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhzcmMpCisgICAgZHN0X2ZzcyA9IENhcmJvbi5GaWxlLkZTU3BlYyhkc3RkaXIpCisgICAgcmV0dXJuIGZpbmRlci5tb3ZlKHNyY19mc3MsIHRvPWRzdF9mc3MpCisKK2RlZiBzbGVlcCgpOgorICAgICIiIlB1dCB0aGUgbWFjIHRvIHNsZWVwIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgZmluZGVyLnNsZWVwKCkKKworZGVmIHNodXRkb3duKCk6CisgICAgIiIiU2h1dCB0aGUgbWFjIGRvd24iIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBmaW5kZXIuc2h1dF9kb3duKCkKKworZGVmIHJlc3RhcnQoKToKKyAgICAiIiJSZXN0YXJ0IHRoZSBtYWMiIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBmaW5kZXIucmVzdGFydCgpCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgIEFkZGl0aW9uYWwgZmluZGVydG9vbHMKKyMKKworZGVmIHJldmVhbChmaWxlKToKKyAgICAiIiJSZXZlYWwgYSBmaWxlIGluIHRoZSBmaW5kZXIuIFNwZWNpZnkgZmlsZSBieSBuYW1lLCBmc3JlZiBvciBmc3NwZWMuIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgZnNyID0gQ2FyYm9uLkZpbGUuRlNSZWYoZmlsZSkKKyAgICBmaWxlX2FsaWFzID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKKyAgICByZXR1cm4gZmluZGVyLnJldmVhbChmaWxlX2FsaWFzKQorCitkZWYgc2VsZWN0KGZpbGUpOgorICAgICIiInNlbGVjdCBhIGZpbGUgaW4gdGhlIGZpbmRlci4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUsIGZzcmVmIG9yIGZzc3BlYy4iIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBmc3IgPSBDYXJib24uRmlsZS5GU1JlZihmaWxlKQorICAgIGZpbGVfYWxpYXMgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQorICAgIHJldHVybiBmaW5kZXIuc2VsZWN0KGZpbGVfYWxpYXMpCisKK2RlZiB1cGRhdGUoZmlsZSk6CisgICAgIiIiVXBkYXRlIHRoZSBkaXNwbGF5IG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0KHMpIHRvIG1hdGNoCisgICAgdGhlaXIgb24tZGlzayByZXByZXNlbnRhdGlvbi4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUsIGZzcmVmIG9yIGZzc3BlYy4iIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBmc3IgPSBDYXJib24uRmlsZS5GU1JlZihmaWxlKQorICAgIGZpbGVfYWxpYXMgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQorICAgIHJldHVybiBmaW5kZXIudXBkYXRlKGZpbGVfYWxpYXMpCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgIE1vcmUgZmluZGVydG9vbHMKKyMKKworZGVmIGNvbW1lbnQob2JqZWN0LCBjb21tZW50PU5vbmUpOgorICAgICIiImNvbW1lbnQ6IGdldCBvciBzZXQgdGhlIEZpbmRlci1jb21tZW50IG9mIHRoZSBpdGVtLCBkaXNwbGF5ZWQgaW4gdGhlICdHZXQgSW5mbycgd2luZG93LiIiIgorICAgIG9iamVjdCA9IENhcmJvbi5GaWxlLkZTUmVmKG9iamVjdCkKKyAgICBvYmplY3RfYWxpYXMgPSBvYmplY3QuRlNOZXdBbGlhc01pbmltYWwoKQorICAgIGlmIGNvbW1lbnQgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIF9nZXRjb21tZW50KG9iamVjdF9hbGlhcykKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gX3NldGNvbW1lbnQob2JqZWN0X2FsaWFzLCBjb21tZW50KQorCitkZWYgX3NldGNvbW1lbnQob2JqZWN0X2FsaWFzLCBjb21tZW50KToKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2NvbXQnKSwgZnI9YWVvYmpfMDApCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMDEKKyAgICBhcmdzWyJkYXRhIl0gPSBjb21tZW50CisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgInNldGQiLCBhcmdzLCBhdHRycykKKyAgICBpZiAnZXJybicgaW4gYXJnczoKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICBpZiAnLS0tLScgaW4gYXJnczoKKyAgICAgICAgcmV0dXJuIGFyZ3NbJy0tLS0nXQorCitkZWYgX2dldGNvbW1lbnQob2JqZWN0X2FsaWFzKToKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY29iaicpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2NvbXQnKSwgZnI9YWVvYmpfMDApCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMDEKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorICAgIGlmICdlcnJuJyBpbiBhcmdzOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIGlmICctLS0tJyBpbiBhcmdzOgorICAgICAgICByZXR1cm4gYXJnc1snLS0tLSddCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgIEdldCBpbmZvcm1hdGlvbiBhYm91dCBjdXJyZW50IHByb2Nlc3NlcyBpbiB0aGUgRmluZGVyLgorCitkZWYgcHJvY2Vzc2VzKCk6CisgICAgIiIicHJvY2Vzc2VzIHJldHVybnMgYSBsaXN0IG9mIGFsbCBhY3RpdmUgcHJvY2Vzc2VzIHJ1bm5pbmcgb24gdGhpcyBjb21wdXRlciBhbmQgdGhlaXIgY3JlYXRvcnMuIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIHByb2Nlc3NuYW1lcyA9IFtdCisgICAgcHJvY2Vzc251bWJlcnMgPSBbXQorICAgIGNyZWF0b3JzID0gW10KKyAgICBwYXJ0aXRpb25zID0gW10KKyAgICB1c2VkID0gW10KKyAgICAjIyBnZXQgdGhlIHByb2Nlc3NuYW1lcyBvciBlbHNlIHRoZSBwcm9jZXNzbnVtYmVycworICAgIGFyZ3NbJy0tLS0nXSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcmNzJyksIGZvcm09ImluZHgiLCBzZWxkPWFldHlwZXMuVW5rbm93bignYWJzbycsICJhbGwgIiksIGZyPU5vbmUpCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCdjb3JlJywgJ2dldGQnLCBhcmdzLCBhdHRycykKKyAgICBpZiAnZXJybicgaW4gYXJnczoKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICBwID0gW10KKyAgICBpZiAnLS0tLScgaW4gYXJnczoKKyAgICAgICAgcCA9ICBhcmdzWyctLS0tJ10KKyAgICAgICAgZm9yIHByb2MgaW4gcDoKKyAgICAgICAgICAgIGlmIGhhc2F0dHIocHJvYywgJ3NlbGQnKToKKyAgICAgICAgICAgICAgICAjIGl0IGhhcyBhIHJlYWwgbmFtZQorICAgICAgICAgICAgICAgIHByb2Nlc3NuYW1lcy5hcHBlbmQocHJvYy5zZWxkKQorICAgICAgICAgICAgZWxpZiBoYXNhdHRyKHByb2MsICd0eXBlJyk6CisgICAgICAgICAgICAgICAgaWYgcHJvYy50eXBlID09ICJwc24gIjoKKyAgICAgICAgICAgICAgICAgICAgIyBpdCBoYXMgYSBwcm9jZXNzIG51bWJlcgorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzbnVtYmVycy5hcHBlbmQocHJvYy5kYXRhKQorICAgICMjIGdldCB0aGUgY3JlYXRvcnMKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcmNzJyksIGZvcm09ImluZHgiLCBzZWxkPWFldHlwZXMuVW5rbm93bignYWJzbycsICJhbGwgIiksIGZyPU5vbmUpCisgICAgYXJnc1snLS0tLSddID0gIGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnZmNydCcpLCBmcj1hZW9ial8wKQorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCisgICAgaWYgJ2Vycm4nIGluIGFyZ3M6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmcpCisgICAgaWYgJy0tLS0nIGluIGFyZ3M6CisgICAgICAgIHAgPSAgYXJnc1snLS0tLSddCisgICAgICAgIGNyZWF0b3JzID0gcFs6XQorICAgICMjIGNvbmNhdGVuYXRlIGluIG9uZSBkaWN0CisgICAgcmVzdWx0ID0gW10KKyAgICBpZiBsZW4ocHJvY2Vzc25hbWVzKSA+IGxlbihwcm9jZXNzbnVtYmVycyk6CisgICAgICAgIGRhdGEgPSBwcm9jZXNzbmFtZXMKKyAgICBlbHNlOgorICAgICAgICBkYXRhID0gcHJvY2Vzc251bWJlcnMKKyAgICBmb3IgaSBpbiByYW5nZShsZW4oY3JlYXRvcnMpKToKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgoZGF0YVtpXSwgY3JlYXRvcnNbaV0pKQorICAgIHJldHVybiByZXN1bHQKKworY2xhc3MgX3Byb2Nlc3M6CisgICAgcGFzcworCitkZWYgaXNhY3RpdmVwcm9jZXNzKHByb2Nlc3NuYW1lKToKKyAgICAiIiJDaGVjayBvZiBwcm9jZXNzbmFtZSBpcyBhY3RpdmUuIE1hY09TOSIiIgorICAgIGFsbCA9IHByb2Nlc3NlcygpCisgICAgb2sgPSAwCisgICAgZm9yIG4sIGMgaW4gYWxsOgorICAgICAgICBpZiBuID09IHByb2Nlc3NuYW1lOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICByZXR1cm4gMAorCitkZWYgcHJvY2Vzc2luZm8ocHJvY2Vzc25hbWUpOgorICAgICIiIlJldHVybiBhbiBvYmplY3Qgd2l0aCBhbGwgcHJvY2VzcyBwcm9wZXJ0aWVzIGFzIGF0dHJpYnV0ZXMgZm9yIHByb2Nlc3NuYW1lLiBNYWNPUzkiIiIKKyAgICBwID0gX3Byb2Nlc3MoKQorCisgICAgaWYgcHJvY2Vzc25hbWUgPT0gIkZpbmRlciI6CisgICAgICAgIHAucGFydGl0aW9uID0gTm9uZQorICAgICAgICBwLnVzZWQgPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgcC5wYXJ0aXRpb24gPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAnYXBwdCcpCisgICAgICAgIHAudXNlZCA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdwdXNkJykKKyAgICBwLnZpc2libGUgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncHZpcycpICAgICAgICNJcyB0aGUgcHJvY2VzcycgbGF5ZXIgdmlzaWJsZT8KKyAgICBwLmZyb250bW9zdCA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdwaXNmJykgI0lzIHRoZSBwcm9jZXNzIHRoZSBmcm9udG1vc3QgcHJvY2Vzcz8KKyAgICBwLmZpbGUgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAnZmlsZScpICAgICAgICAgICN0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBwcm9jZXNzIHdhcyBsYXVuY2hlZAorICAgIHAuZmlsZXR5cGUgID0gX3Byb2Nlc3Nwcm9wZXJ0eShwcm9jZXNzbmFtZSwgJ2FzdHknKSAgICAgI3RoZSBPU1R5cGUgb2YgdGhlIGZpbGUgdHlwZSBvZiB0aGUgcHJvY2VzcworICAgIHAuY3JlYXRvcnR5cGUgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAnZmNydCcpICAgI3RoZSBPU1R5cGUgb2YgdGhlIGNyZWF0b3Igb2YgdGhlIHByb2Nlc3MgKHRoZSBzaWduYXR1cmUpCisgICAgcC5hY2NlcHRoaWdobGV2ZWwgPSBfcHJvY2Vzc3Byb3BlcnR5KHByb2Nlc3NuYW1lLCAncmV2dCcpICAgI0lzIHRoZSBwcm9jZXNzIGhpZ2gtbGV2ZWwgZXZlbnQgYXdhcmUgKGFjY2VwdHMgb3BlbiBhcHBsaWNhdGlvbiwgb3BlbiBkb2N1bWVudCwgcHJpbnQgZG9jdW1lbnQsIGFuZCBxdWl0KT8KKyAgICBwLmhhc3NjcmlwdGluZyA9IF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsICdoc2NyJykgICAgICAjRG9lcyB0aGUgcHJvY2VzcyBoYXZlIGEgc2NyaXB0aW5nIHRlcm1pbm9sb2d5LCBpLmUuLCBjYW4gaXQgYmUgc2NyaXB0ZWQ/CisgICAgcmV0dXJuIHAKKworZGVmIF9wcm9jZXNzcHJvcGVydHkocHJvY2Vzc25hbWUsIHByb3BlcnR5KToKKyAgICAiIiJyZXR1cm4gdGhlIHBhcnRpdGlvbiBzaXplIGFuZCBtZW1vcnkgdXNlZCBmb3IgcHJvY2Vzc25hbWUiIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJjcycpLCBmb3JtPSJuYW1lIiwgc2VsZD1wcm9jZXNzbmFtZSwgZnI9Tm9uZSkKKyAgICBhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZShwcm9wZXJ0eSksIGZyPWFlb2JqXzAwKQorICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKKyAgICBpZiAnZXJybicgaW4gYXJnczoKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICBpZiAnLS0tLScgaW4gYXJnczoKKyAgICAgICAgcmV0dXJuIGFyZ3NbJy0tLS0nXQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICBNZXNzIGFyb3VuZCB3aXRoIEZpbmRlciB3aW5kb3dzLgorCitkZWYgb3BlbndpbmRvdyhvYmplY3QpOgorICAgICIiIk9wZW4gYSBGaW5kZXIgd2luZG93IGZvciBvYmplY3QsIFNwZWNpZnkgb2JqZWN0IGJ5IG5hbWUgb3IgZnNzcGVjLiIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIG9iamVjdCA9IENhcmJvbi5GaWxlLkZTUmVmKG9iamVjdCkKKyAgICBvYmplY3RfYWxpYXMgPSBvYmplY3QuRlNOZXdBbGlhc01pbmltYWwoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBfY29kZSA9ICdhZXZ0JworICAgIF9zdWJjb2RlID0gJ29kb2MnCisgICAgYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKyAgICBhcmdzWyctLS0tJ10gPSBhZW9ial8wCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKF9jb2RlLCBfc3ViY29kZSwgYXJncywgYXR0cnMpCisgICAgaWYgJ2Vycm4nIGluIGFyZ3M6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisKK2RlZiBjbG9zZXdpbmRvdyhvYmplY3QpOgorICAgICIiIkNsb3NlIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyLCBTcGVjaWZ5IGJ5IHBhdGguIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgb2JqZWN0ID0gQ2FyYm9uLkZpbGUuRlNSZWYob2JqZWN0KQorICAgIG9iamVjdF9hbGlhcyA9IG9iamVjdC5GU05ld0FsaWFzTWluaW1hbCgpCisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIF9jb2RlID0gJ2NvcmUnCisgICAgX3N1YmNvZGUgPSAnY2xvcycKKyAgICBhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQorICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKKyAgICBpZiAnZXJybicgaW4gYXJnczoKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKworZGVmIGxvY2F0aW9uKG9iamVjdCwgcG9zPU5vbmUpOgorICAgICIiIlNldCB0aGUgcG9zaXRpb24gb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gcG9zPSh3LCBoKS4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjLgorICAgIElmIHBvcz1Ob25lLCBsb2NhdGlvbiB3aWxsIHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgb2JqZWN0LiIiIgorICAgIG9iamVjdCA9IENhcmJvbi5GaWxlLkZTUmVmKG9iamVjdCkKKyAgICBvYmplY3RfYWxpYXMgPSBvYmplY3QuRlNOZXdBbGlhc01pbmltYWwoKQorICAgIGlmIG5vdCBwb3M6CisgICAgICAgIHJldHVybiBfZ2V0bG9jYXRpb24ob2JqZWN0X2FsaWFzKQorICAgIHJldHVybiBfc2V0bG9jYXRpb24ob2JqZWN0X2FsaWFzLCBwb3MpCisKK2RlZiBfc2V0bG9jYXRpb24ob2JqZWN0X2FsaWFzLCAoeCwgeSkpOgorICAgICIiIl9zZXRsb2NhdGlvbjogU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgaWNvbiBmb3IgdGhlIG9iamVjdC4iIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMDAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2ZvbCcpLCBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ3Bvc24nKSwgZnI9YWVvYmpfMDApCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMDEKKyAgICBhcmdzWyJkYXRhIl0gPSBbeCwgeV0KKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAic2V0ZCIsIGFyZ3MsIGF0dHJzKQorICAgIGlmICdlcnJuJyBpbiBhcmdzOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIHJldHVybiAoeCx5KQorCitkZWYgX2dldGxvY2F0aW9uKG9iamVjdF9hbGlhcyk6CisgICAgIiIiX2dldGxvY2F0aW9uOiBnZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBpY29uIGZvciB0aGUgb2JqZWN0LiIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKyAgICBhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgncG9zbicpLCBmcj1hZW9ial8wMCkKKyAgICBhcmdzWyctLS0tJ10gPSBhZW9ial8wMQorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCisgICAgaWYgJ2Vycm4nIGluIGFyZ3M6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgJy0tLS0nIGluIGFyZ3M6CisgICAgICAgIHBvcyA9IGFyZ3NbJy0tLS0nXQorICAgICAgICByZXR1cm4gcG9zLmgsIHBvcy52CisKK2RlZiBsYWJlbChvYmplY3QsIGluZGV4PU5vbmUpOgorICAgICIiImxhYmVsOiBzZXQgb3IgZ2V0IHRoZSBsYWJlbCBvZiB0aGUgaXRlbS4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjLiIiIgorICAgIG9iamVjdCA9IENhcmJvbi5GaWxlLkZTUmVmKG9iamVjdCkKKyAgICBvYmplY3RfYWxpYXMgPSBvYmplY3QuRlNOZXdBbGlhc01pbmltYWwoKQorICAgIGlmIGluZGV4IGlzIE5vbmU6CisgICAgICAgIHJldHVybiBfZ2V0bGFiZWwob2JqZWN0X2FsaWFzKQorICAgIGlmIGluZGV4IDwgMCBvciBpbmRleCA+IDc6CisgICAgICAgIGluZGV4ID0gMAorICAgIHJldHVybiBfc2V0bGFiZWwob2JqZWN0X2FsaWFzLCBpbmRleCkKKworZGVmIF9nZXRsYWJlbChvYmplY3RfYWxpYXMpOgorICAgICIiImxhYmVsOiBHZXQgdGhlIGxhYmVsIGZvciB0aGUgb2JqZWN0LiIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksIGZvcm09ImFsaXMiLCBzZWxkPW9iamVjdF9hbGlhcywgZnI9Tm9uZSkKKyAgICBhZW9ial8wMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnbGFiaScpLCBmcj1hZW9ial8wMCkKKyAgICBhcmdzWyctLS0tJ10gPSBhZW9ial8wMQorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCisgICAgaWYgJ2Vycm4nIGluIGFyZ3M6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgJy0tLS0nIGluIGFyZ3M6CisgICAgICAgIHJldHVybiBhcmdzWyctLS0tJ10KKworZGVmIF9zZXRsYWJlbChvYmplY3RfYWxpYXMsIGluZGV4KToKKyAgICAiIiJsYWJlbDogU2V0IHRoZSBsYWJlbCBmb3IgdGhlIG9iamVjdC4iIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgX2NvZGUgPSAnY29yZScKKyAgICBfc3ViY29kZSA9ICdzZXRkJworICAgIGFlb2JqXzAgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLAorICAgICAgICAgICAgZm9ybT0iYWxpcyIsIHNlbGQ9b2JqZWN0X2FsaWFzLCBmcj1Ob25lKQorICAgIGFlb2JqXzEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLAorICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdsYWJpJyksIGZyPWFlb2JqXzApCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMQorICAgIGFyZ3NbImRhdGEiXSA9IGluZGV4CisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKF9jb2RlLCBfc3ViY29kZSwgYXJncywgYXR0cnMpCisgICAgaWYgJ2Vycm4nIGluIGFyZ3M6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgcmV0dXJuIGluZGV4CisKK2RlZiB3aW5kb3d2aWV3KGZvbGRlciwgdmlldz1Ob25lKToKKyAgICAiIiJ3aW5kb3d2aWV3OiBTZXQgdGhlIHZpZXcgb2YgdGhlIHdpbmRvdyBmb3IgdGhlIGZvbGRlci4gU3BlY2lmeSBmaWxlIGJ5IG5hbWUgb3IgZnNzcGVjLgorICAgIDAgPSBieSBpY29uIChkZWZhdWx0KQorICAgIDEgPSBieSBuYW1lCisgICAgMiA9IGJ5IGJ1dHRvbgorICAgICIiIgorICAgIGZzciA9IENhcmJvbi5GaWxlLkZTUmVmKGZvbGRlcikKKyAgICBmb2xkZXJfYWxpYXMgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQorICAgIGlmIHZpZXcgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIF9nZXR3aW5kb3d2aWV3KGZvbGRlcl9hbGlhcykKKyAgICByZXR1cm4gX3NldHdpbmRvd3ZpZXcoZm9sZGVyX2FsaWFzLCB2aWV3KQorCitkZWYgX3NldHdpbmRvd3ZpZXcoZm9sZGVyX2FsaWFzLCB2aWV3PTApOgorICAgICIiInNldCB0aGUgd2luZG93dmlldyIiIgorICAgIGF0dHJzID0ge30KKyAgICBhcmdzID0ge30KKyAgICBpZiB2aWV3ID09IDE6CisgICAgICAgIF92ID0gYWV0eXBlcy5UeXBlKCdwbmFtJykKKyAgICBlbGlmIHZpZXcgPT0gMjoKKyAgICAgICAgX3YgPSBhZXR5cGVzLlR5cGUoJ2xnYnUnKQorICAgIGVsc2U6CisgICAgICAgIF92ID0gYWV0eXBlcy5UeXBlKCdpaW1nJykKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudCA9IGFldHlwZXMuVHlwZSgnY2ZvbCcpLAorICAgICAgICAgICAgZm9ybSA9ICdhbGlzJywgc2VsZCA9IGZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKKyAgICBhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudCA9IGFldHlwZXMuVHlwZSgncHJvcCcpLAorICAgICAgICAgICAgZm9ybSA9ICdwcm9wJywgc2VsZCA9IGFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wKQorICAgIGFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50ID0gYWV0eXBlcy5UeXBlKCdwcm9wJyksCisgICAgICAgICAgICBmb3JtID0gJ3Byb3AnLCBzZWxkID0gYWV0eXBlcy5UeXBlKCdwdmV3JyksIGZyPWFlb2JqXzEpCisgICAgYWVvYmpfMyA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQgPSBhZXR5cGVzLlR5cGUoJ3Byb3AnKSwKKyAgICAgICAgICAgIGZvcm0gPSAncHJvcCcsIHNlbGQgPSBfdiwgZnI9Tm9uZSkKKyAgICBfY29kZSA9ICdjb3JlJworICAgIF9zdWJjb2RlID0gJ3NldGQnCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMgorICAgIGFyZ3NbJ2RhdGEnXSA9IGFlb2JqXzMKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKKyAgICBpZiAnZXJybicgaW4gYXJnczoKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICBpZiAnLS0tLScgaW4gYXJnczoKKyAgICAgICAgcmV0dXJuIGFyZ3NbJy0tLS0nXQorCitkZWYgX2dldHdpbmRvd3ZpZXcoZm9sZGVyX2FsaWFzKToKKyAgICAiIiJnZXQgdGhlIHdpbmRvd3ZpZXciIiIKKyAgICBhdHRycyA9IHt9CisgICAgYXJncyA9IHt9CisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIGFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwgZm9ybT0iYWxpcyIsIHNlbGQ9Zm9sZGVyX2FsaWFzLCBmcj1Ob25lKQorICAgIGFlb2JqXzAxID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdjd25kJyksIGZyPWFlb2JqXzAwKQorICAgIGFlb2JqXzAyID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwdmV3JyksIGZyPWFlb2JqXzAxKQorICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAyCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKKyAgICBpZiAnZXJybicgaW4gYXJnczoKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICB2aWV3cyA9IHsnaWltZyc6MCwgJ3BuYW0nOjEsICdsZ2J1JzoyfQorICAgIGlmICctLS0tJyBpbiBhcmdzOgorICAgICAgICByZXR1cm4gdmlld3NbYXJnc1snLS0tLSddLmVudW1dCisKK2RlZiB3aW5kb3dzaXplKGZvbGRlciwgc2l6ZT1Ob25lKToKKyAgICAiIiJTZXQgdGhlIHNpemUgb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gc2l6ZT0odywgaCksIFNwZWNpZnkgYnkgcGF0aC4KKyAgICBJZiBzaXplPU5vbmUsIHdpbmRvd3NpemUgd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgd2luZG93LgorICAgIFNwZWNpZnkgZmlsZSBieSBuYW1lIG9yIGZzc3BlYy4KKyAgICAiIiIKKyAgICBmc3IgPSBDYXJib24uRmlsZS5GU1JlZihmb2xkZXIpCisgICAgZm9sZGVyX2FsaWFzID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKKyAgICBvcGVud2luZG93KGZzcikKKyAgICBpZiBub3Qgc2l6ZToKKyAgICAgICAgcmV0dXJuIF9nZXR3aW5kb3dzaXplKGZvbGRlcl9hbGlhcykKKyAgICByZXR1cm4gX3NldHdpbmRvd3NpemUoZm9sZGVyX2FsaWFzLCBzaXplKQorCitkZWYgX3NldHdpbmRvd3NpemUoZm9sZGVyX2FsaWFzLCAodywgaCkpOgorICAgICIiIlNldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byAodywgaCkiIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgX2NvZGUgPSAnY29yZScKKyAgICBfc3ViY29kZSA9ICdzZXRkJworICAgIGFldmFyMDAgPSBbdywgaF0KKyAgICBhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwKKyAgICAgICAgICAgIGZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKKyAgICBhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKKyAgICAgICAgICAgIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wKQorICAgIGFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLAorICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwdHN6JyksIGZyPWFlb2JqXzEpCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMgorICAgIGFyZ3NbImRhdGEiXSA9IGFldmFyMDAKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoX2NvZGUsIF9zdWJjb2RlLCBhcmdzLCBhdHRycykKKyAgICBpZiAnZXJybicgaW4gYXJnczoKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICByZXR1cm4gKHcsIGgpCisKK2RlZiBfZ2V0d2luZG93c2l6ZShmb2xkZXJfYWxpYXMpOgorICAgICIiIlNldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciB0byAodywgaCkiIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYWVvYmpfMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjZm9sJyksCisgICAgICAgICAgICBmb3JtPSJhbGlzIiwgc2VsZD1mb2xkZXJfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksCisgICAgICAgICAgICBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2N3bmQnKSwgZnI9YWVvYmpfMCkKKyAgICBhZW9ial8yID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKKyAgICAgICAgICAgIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgncG9zbicpLCBmcj1hZW9ial8xKQorICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzIKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoJ2NvcmUnLCAnZ2V0ZCcsIGFyZ3MsIGF0dHJzKQorICAgIGlmICdlcnJuJyBpbiBhcmdzOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIGlmICctLS0tJyBpbiBhcmdzOgorICAgICAgICByZXR1cm4gYXJnc1snLS0tLSddCisKK2RlZiB3aW5kb3dwb3NpdGlvbihmb2xkZXIsIHBvcz1Ob25lKToKKyAgICAiIiJTZXQgdGhlIHBvc2l0aW9uIG9mIGEgRmluZGVyIHdpbmRvdyBmb3IgZm9sZGVyIHRvIHBvcz0odywgaCkuIiIiCisgICAgZnNyID0gQ2FyYm9uLkZpbGUuRlNSZWYoZm9sZGVyKQorICAgIGZvbGRlcl9hbGlhcyA9IGZzci5GU05ld0FsaWFzTWluaW1hbCgpCisgICAgb3BlbndpbmRvdyhmc3IpCisgICAgaWYgbm90IHBvczoKKyAgICAgICAgcmV0dXJuIF9nZXR3aW5kb3dwb3NpdGlvbihmb2xkZXJfYWxpYXMpCisgICAgaWYgdHlwZShwb3MpID09IEluc3RhbmNlVHlwZToKKyAgICAgICAgIyBwb3MgbWlnaHQgYmUgYSBRRFBvaW50IG9iamVjdCBhcyByZXR1cm5lZCBieSBfZ2V0d2luZG93cG9zaXRpb24KKyAgICAgICAgcG9zID0gKHBvcy5oLCBwb3MudikKKyAgICByZXR1cm4gX3NldHdpbmRvd3Bvc2l0aW9uKGZvbGRlcl9hbGlhcywgcG9zKQorCitkZWYgX3NldHdpbmRvd3Bvc2l0aW9uKGZvbGRlcl9hbGlhcywgKHgsIHkpKToKKyAgICAiIiJTZXQgdGhlIHNpemUgb2YgYSBGaW5kZXIgd2luZG93IGZvciBmb2xkZXIgdG8gKHcsIGgpLiIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwKKyAgICAgICAgICAgIGZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKKyAgICBhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKKyAgICAgICAgICAgIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wKQorICAgIGFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLAorICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwb3NuJyksIGZyPWFlb2JqXzEpCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMgorICAgIGFyZ3NbImRhdGEiXSA9IFt4LCB5XQorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdzZXRkJywgYXJncywgYXR0cnMpCisgICAgaWYgJ2Vycm4nIGluIGFyZ3M6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgJy0tLS0nIGluIGFyZ3M6CisgICAgICAgIHJldHVybiBhcmdzWyctLS0tJ10KKworZGVmIF9nZXR3aW5kb3dwb3NpdGlvbihmb2xkZXJfYWxpYXMpOgorICAgICIiIkdldCB0aGUgc2l6ZSBvZiBhIEZpbmRlciB3aW5kb3cgZm9yIGZvbGRlciwgU3BlY2lmeSBieSBwYXRoLiIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhZW9ial8wID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ2Nmb2wnKSwKKyAgICAgICAgICAgIGZvcm09ImFsaXMiLCBzZWxkPWZvbGRlcl9hbGlhcywgZnI9Tm9uZSkKKyAgICBhZW9ial8xID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwKKyAgICAgICAgICAgIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnY3duZCcpLCBmcj1hZW9ial8wKQorICAgIGFlb2JqXzIgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLAorICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdwdHN6JyksIGZyPWFlb2JqXzEpCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMgorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgnY29yZScsICdnZXRkJywgYXJncywgYXR0cnMpCisgICAgaWYgJ2Vycm4nIGluIGFyZ3M6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgJy0tLS0nIGluIGFyZ3M6CisgICAgICAgIHJldHVybiBhcmdzWyctLS0tJ10KKworZGVmIGljb24ob2JqZWN0LCBpY29uZGF0YT1Ob25lKToKKyAgICAiIiJpY29uIHNldHMgdGhlIGljb24gb2Ygb2JqZWN0LCBpZiBubyBpY29uZGF0YSBpcyBnaXZlbiwKKyAgICBpY29uIHdpbGwgcmV0dXJuIGFuIEFFIG9iamVjdCB3aXRoIGJpbmFyeSBkYXRhIGZvciB0aGUgY3VycmVudCBpY29uLgorICAgIElmIGxlZnQgdW50b3VjaGVkLCB0aGlzIGRhdGEgY2FuIGJlIHVzZWQgdG8gcGFzdGUgdGhlIGljb24gb24gYW5vdGhlciBmaWxlLgorICAgIERldmVsb3BtZW50IG9wcG9ydHVuaXR5OiBnZXQgYW5kIHNldCB0aGUgZGF0YSBhcyBQSUNULiIiIgorICAgIGZzciA9IENhcmJvbi5GaWxlLkZTUmVmKG9iamVjdCkKKyAgICBvYmplY3RfYWxpYXMgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQorICAgIGlmIGljb25kYXRhIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBfZ2V0aWNvbihvYmplY3RfYWxpYXMpCisgICAgcmV0dXJuIF9zZXRpY29uKG9iamVjdF9hbGlhcywgaWNvbmRhdGEpCisKK2RlZiBfZ2V0aWNvbihvYmplY3RfYWxpYXMpOgorICAgICIiImdldCB0aGUgaWNvbmRhdGEgZm9yIG9iamVjdC4gQmluYXJ5IGRhdGEgb2Ygc29tZSBzb3J0LiIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksCisgICAgICAgICAgICBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLAorICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdpaW1nJyksIGZyPWFlb2JqXzAwKQorICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJjb3JlIiwgImdldGQiLCBhcmdzLCBhdHRycykKKyAgICBpZiAnZXJybicgaW4gYXJnczoKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICBpZiAnLS0tLScgaW4gYXJnczoKKyAgICAgICAgcmV0dXJuIGFyZ3NbJy0tLS0nXQorCitkZWYgX3NldGljb24ob2JqZWN0X2FsaWFzLCBpY29uZGF0YSk6CisgICAgIiIic2V0IHRoZSBpY29uZGF0YSBmb3Igb2JqZWN0LCBmb3JtYXR0ZWQgYXMgcHJvZHVjZWQgYnkgX2dldGljb24oKSIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhZW9ial8wMCA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdjb2JqJyksCisgICAgICAgICAgICBmb3JtPSJhbGlzIiwgc2VsZD1vYmplY3RfYWxpYXMsIGZyPU5vbmUpCisgICAgYWVvYmpfMDEgPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLAorICAgICAgICAgICAgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCdpaW1nJyksIGZyPWFlb2JqXzAwKQorICAgIGFyZ3NbJy0tLS0nXSA9IGFlb2JqXzAxCisgICAgYXJnc1siZGF0YSJdID0gaWNvbmRhdGEKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAic2V0ZCIsIGFyZ3MsIGF0dHJzKQorICAgIGlmICdlcnJuJyBpbiBhcmdzOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIGlmICctLS0tJyBpbiBhcmdzOgorICAgICAgICByZXR1cm4gYXJnc1snLS0tLSddLmRhdGEKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgVm9sdW1lcyBhbmQgc2VydmVycy4KKworZGVmIG1vdW50dm9sdW1lKHZvbHVtZSwgc2VydmVyPU5vbmUsIHVzZXJuYW1lPU5vbmUsIHBhc3N3b3JkPU5vbmUpOgorICAgICIiIm1vdW50IGEgdm9sdW1lLCBsb2NhbCBvciBvbiBhIHNlcnZlciBvbiBBcHBsZVRhbGsuCisgICAgTm90ZTogbW91bnRpbmcgYSBBU0lQIHNlcnZlciByZXF1aXJlcyBhIGRpZmZlcmVudCBvcGVyYXRpb24uCisgICAgc2VydmVyIGlzIHRoZSBuYW1lIG9mIHRoZSBzZXJ2ZXIgd2hlcmUgdGhlIHZvbHVtZSBiZWxvbmdzCisgICAgdXNlcm5hbWUsIHBhc3N3b3JkIGJlbG9uZyB0byBhIHJlZ2lzdGVyZWQgdXNlciBvZiB0aGUgdm9sdW1lLiIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBpZiBwYXNzd29yZDoKKyAgICAgICAgYXJnc1siUEFTUyJdID0gcGFzc3dvcmQKKyAgICBpZiB1c2VybmFtZToKKyAgICAgICAgYXJnc1siVVNFUiJdID0gdXNlcm5hbWUKKyAgICBpZiBzZXJ2ZXI6CisgICAgICAgIGFyZ3NbIlNSVlIiXSA9IHNlcnZlcgorICAgIGFyZ3NbJy0tLS0nXSA9IHZvbHVtZQorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiYWV2dCIsICJtdm9sIiwgYXJncywgYXR0cnMpCisgICAgaWYgJ2Vycm4nIGluIGFyZ3M6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgJy0tLS0nIGluIGFyZ3M6CisgICAgICAgIHJldHVybiBhcmdzWyctLS0tJ10KKworZGVmIHVubW91bnR2b2x1bWUodm9sdW1lKToKKyAgICAiIiJ1bm1vdW50IGEgdm9sdW1lIHRoYXQncyBvbiB0aGUgZGVza3RvcCIiIgorICAgIHB1dGF3YXkodm9sdW1lKQorCitkZWYgcHV0YXdheShvYmplY3QpOgorICAgICIiInB1dGggdGhlIG9iamVjdCBhd2F5LCB3aGVyZWV2ZXIgaXQgY2FtZSBmcm9tLiIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgnY2RpcycpLCBmb3JtPSJuYW1lIiwgc2VsZD1vYmplY3QsIGZyPU5vbmUpCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IHRhbGtlci5zZW5kKCJmbmRyIiwgInB0d3kiLCBhcmdzLCBhdHRycykKKyAgICBpZiAnZXJybicgaW4gYXJnczoKKyAgICAgICAgcmFpc2UgRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoYXJncykKKyAgICBpZiAnLS0tLScgaW4gYXJnczoKKyAgICAgICAgcmV0dXJuIGFyZ3NbJy0tLS0nXQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICBNaXNjZWxsYW5lb3VzIGZ1bmN0aW9ucworIworCitkZWYgdm9sdW1lbGV2ZWwobGV2ZWwpOgorICAgICIiInNldCB0aGUgYXVkaW8gb3V0cHV0IGxldmVsLCBwYXJhbWV0ZXIgYmV0d2VlbiAwIChzaWxlbnQpIGFuZCA3IChmdWxsIGJsYXN0KSIiIgorICAgIGZpbmRlciA9IF9nZXRmaW5kZXIoKQorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBpZiBsZXZlbCA8IDA6CisgICAgICAgIGxldmVsID0gMAorICAgIGVsaWYgbGV2ZWwgPiA3OgorICAgICAgICBsZXZlbCA9IDcKKyAgICBhcmdzWyctLS0tJ10gPSBsZXZlbAorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiYWV2dCIsICJzdHZsIiwgYXJncywgYXR0cnMpCisgICAgaWYgJ2Vycm4nIGluIGFyZ3M6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgJy0tLS0nIGluIGFyZ3M6CisgICAgICAgIHJldHVybiBhcmdzWyctLS0tJ10KKworZGVmIE9TdmVyc2lvbigpOgorICAgICIiInJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgc3lzdGVtIHNvZnR3YXJlIiIiCisgICAgZmluZGVyID0gX2dldGZpbmRlcigpCisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIGFlb2JqXzAwID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCd2ZXIyJyksIGZyPU5vbmUpCisgICAgYXJnc1snLS0tLSddID0gYWVvYmpfMDAKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorICAgIGlmICdlcnJuJyBpbiBhcmdzOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIGlmICctLS0tJyBpbiBhcmdzOgorICAgICAgICByZXR1cm4gYXJnc1snLS0tLSddCisKK2RlZiBmaWxlc2hhcmluZygpOgorICAgICIiInJldHVybiB0aGUgY3VycmVudCBzdGF0dXMgb2YgZmlsZXNoYXJpbmcgYW5kIHdoZXRoZXIgaXQgaXMgc3RhcnRpbmcgdXAgb3Igbm90OgorICAgICAgICAtMSAgZmlsZSBzaGFyaW5nIGlzIG9mZiBhbmQgbm90IHN0YXJ0aW5nIHVwCisgICAgICAgIDAgICBmaWxlIHNoYXJpbmcgaXMgb2ZmIGFuZCBzdGFydGluZyB1cAorICAgICAgICAxICAgZmlsZSBzaGFyaW5nIGlzIG9uIiIiCisgICAgc3RhdHVzID0gLTEKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICAjIHNlZSBpZiBpdCBpcyBvbgorICAgIGFyZ3MgPSB7fQorICAgIGF0dHJzID0ge30KKyAgICBhcmdzWyctLS0tJ10gPSBhZXR5cGVzLk9iamVjdFNwZWNpZmllcih3YW50PWFldHlwZXMuVHlwZSgncHJvcCcpLCBmb3JtPSJwcm9wIiwgc2VsZD1hZXR5cGVzLlR5cGUoJ2ZzaHInKSwgZnI9Tm9uZSkKKyAgICBfcmVwbHksIGFyZ3MsIGF0dHJzID0gZmluZGVyLnNlbmQoImNvcmUiLCAiZ2V0ZCIsIGFyZ3MsIGF0dHJzKQorICAgIGlmICdlcnJuJyBpbiBhcmdzOgorICAgICAgICByYWlzZSBFcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorICAgIGlmICctLS0tJyBpbiBhcmdzOgorICAgICAgICBpZiBhcmdzWyctLS0tJ10gPT0gMDoKKyAgICAgICAgICAgIHN0YXR1cyA9IC0xCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGF0dXMgPSAxCisgICAgIyBpcyBpdCBzdGFydGluZyB1cCBwZXJjaGFuY2U/CisgICAgYXJncyA9IHt9CisgICAgYXR0cnMgPSB7fQorICAgIGFyZ3NbJy0tLS0nXSA9IGFldHlwZXMuT2JqZWN0U3BlY2lmaWVyKHdhbnQ9YWV0eXBlcy5UeXBlKCdwcm9wJyksIGZvcm09InByb3AiLCBzZWxkPWFldHlwZXMuVHlwZSgnZnN1cCcpLCBmcj1Ob25lKQorICAgIF9yZXBseSwgYXJncywgYXR0cnMgPSBmaW5kZXIuc2VuZCgiY29yZSIsICJnZXRkIiwgYXJncywgYXR0cnMpCisgICAgaWYgJ2Vycm4nIGluIGFyZ3M6CisgICAgICAgIHJhaXNlIEVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKGFyZ3MpCisgICAgaWYgJy0tLS0nIGluIGFyZ3M6CisgICAgICAgIGlmIGFyZ3NbJy0tLS0nXSA9PSAxOgorICAgICAgICAgICAgc3RhdHVzID0gMAorICAgIHJldHVybiBzdGF0dXMKKworZGVmIG1vdmV0b3RyYXNoKHBhdGgpOgorICAgICIiIm1vdmUgdGhlIG9iamVjdCB0byB0aGUgdHJhc2giIiIKKyAgICBmc3MgPSBDYXJib24uRmlsZS5GU1NwZWMocGF0aCkKKyAgICB0cmFzaGZvbGRlciA9IENhcmJvbi5Gb2xkZXIuRlNGaW5kRm9sZGVyKGZzcy5hc190dXBsZSgpWzBdLCAndHJzaCcsIDApCisgICAgbW92ZShwYXRoLCB0cmFzaGZvbGRlcikKKworZGVmIGVtcHR5dHJhc2goKToKKyAgICAiIiJlbXB0eSB0aGUgdHJhc2giIiIKKyAgICBmaW5kZXIgPSBfZ2V0ZmluZGVyKCkKKyAgICBhcmdzID0ge30KKyAgICBhdHRycyA9IHt9CisgICAgYXJnc1snLS0tLSddID0gYWV0eXBlcy5PYmplY3RTcGVjaWZpZXIod2FudD1hZXR5cGVzLlR5cGUoJ3Byb3AnKSwgZm9ybT0icHJvcCIsIHNlbGQ9YWV0eXBlcy5UeXBlKCd0cnNoJyksIGZyPU5vbmUpCisgICAgX3JlcGx5LCBhcmdzLCBhdHRycyA9IGZpbmRlci5zZW5kKCJmbmRyIiwgImVtcHQiLCBhcmdzLCBhdHRycykKKyAgICBpZiAnZXJybicgaW4gYXJnczoKKyAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihhcmdzKQorCisKK2RlZiBfdGVzdCgpOgorICAgIGltcG9ydCBFYXN5RGlhbG9ncworICAgIHByaW50ICdPcmlnaW5hbCBmaW5kZXJ0b29scyBmdW5jdGlvbmFsaXR5IHRlc3QuLi4nCisgICAgcHJpbnQgJ1Rlc3RpbmcgbGF1bmNoLi4uJworICAgIHBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4oJ0ZpbGUgdG8gbGF1bmNoOicpCisgICAgaWYgcGF0aG5hbWU6CisgICAgICAgIHJlc3VsdCA9IGxhdW5jaChwYXRobmFtZSkKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgcHJpbnQgJ1Jlc3VsdDogJywgcmVzdWx0CisgICAgICAgIHByaW50ICdQcmVzcyByZXR1cm4tJywKKyAgICAgICAgc3lzLnN0ZGluLnJlYWRsaW5lKCkKKyAgICBwcmludCAnVGVzdGluZyBwcmludC4uLicKKyAgICBwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKCdGaWxlIHRvIHByaW50OicpCisgICAgaWYgcGF0aG5hbWU6CisgICAgICAgIHJlc3VsdCA9IFByaW50KHBhdGhuYW1lKQorICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICBwcmludCAnUmVzdWx0OiAnLCByZXN1bHQKKyAgICAgICAgcHJpbnQgJ1ByZXNzIHJldHVybi0nLAorICAgICAgICBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgIHByaW50ICdUZXN0aW5nIGNvcHkuLi4nCisgICAgcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbignRmlsZSB0byBjb3B5OicpCisgICAgaWYgcGF0aG5hbWU6CisgICAgICAgIGRlc3RkaXIgPSBFYXN5RGlhbG9ncy5Bc2tGb2xkZXIoJ0Rlc3RpbmF0aW9uOicpCisgICAgICAgIGlmIGRlc3RkaXI6CisgICAgICAgICAgICByZXN1bHQgPSBjb3B5KHBhdGhuYW1lLCBkZXN0ZGlyKQorICAgICAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgICAgIHByaW50ICdSZXN1bHQ6JywgcmVzdWx0CisgICAgICAgICAgICBwcmludCAnUHJlc3MgcmV0dXJuLScsCisgICAgICAgICAgICBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgIHByaW50ICdUZXN0aW5nIG1vdmUuLi4nCisgICAgcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbignRmlsZSB0byBtb3ZlOicpCisgICAgaWYgcGF0aG5hbWU6CisgICAgICAgIGRlc3RkaXIgPSBFYXN5RGlhbG9ncy5Bc2tGb2xkZXIoJ0Rlc3RpbmF0aW9uOicpCisgICAgICAgIGlmIGRlc3RkaXI6CisgICAgICAgICAgICByZXN1bHQgPSBtb3ZlKHBhdGhuYW1lLCBkZXN0ZGlyKQorICAgICAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgICAgIHByaW50ICdSZXN1bHQ6JywgcmVzdWx0CisgICAgICAgICAgICBwcmludCAnUHJlc3MgcmV0dXJuLScsCisgICAgICAgICAgICBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgIHByaW50ICdUZXN0aW5nIHNsZWVwLi4uJworICAgIGlmIEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTbGVlcD8nKSA+IDA6CisgICAgICAgIHJlc3VsdCA9IHNsZWVwKCkKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgcHJpbnQgJ1Jlc3VsdDonLCByZXN1bHQKKyAgICAgICAgcHJpbnQgJ1ByZXNzIHJldHVybi0nLAorICAgICAgICBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgIHByaW50ICdUZXN0aW5nIHNodXRkb3duLi4uJworICAgIGlmIEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTaHV0IGRvd24/JykgPiAwOgorICAgICAgICByZXN1bHQgPSBzaHV0ZG93bigpCisgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgIHByaW50ICdSZXN1bHQ6JywgcmVzdWx0CisgICAgICAgIHByaW50ICdQcmVzcyByZXR1cm4tJywKKyAgICAgICAgc3lzLnN0ZGluLnJlYWRsaW5lKCkKKyAgICBwcmludCAnVGVzdGluZyByZXN0YXJ0Li4uJworICAgIGlmIEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdSZXN0YXJ0PycpID4gMDoKKyAgICAgICAgcmVzdWx0ID0gcmVzdGFydCgpCisgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgIHByaW50ICdSZXN1bHQ6JywgcmVzdWx0CisgICAgICAgIHByaW50ICdQcmVzcyByZXR1cm4tJywKKyAgICAgICAgc3lzLnN0ZGluLnJlYWRsaW5lKCkKKworZGVmIF90ZXN0MigpOgorICAgIHByaW50ICdcbm1vcmVmaW5kZXJ0b29scyB2ZXJzaW9uICVzXG5UZXN0cyBjb21pbmcgdXAuLi4nICVfX3ZlcnNpb25fXworICAgIGltcG9ydCBvcworICAgIGltcG9ydCByYW5kb20KKworICAgICMgbWlzY2VsbGFuZW91cworICAgIHByaW50ICdcdGZpbGVzaGFyaW5nIG9uPycsICBmaWxlc2hhcmluZygpICAgICAgICMgaXMgZmlsZSBzaGFyaW5nIG9uLCBvZmYsIHN0YXJ0aW5nIHVwPworICAgIHByaW50ICdcdE9TIHZlcnNpb24nLCAgICAgICBPU3ZlcnNpb24oKSAgICAgIyB0aGUgdmVyc2lvbiBvZiB0aGUgc3lzdGVtIHNvZnR3YXJlCisKKyAgICAjIHNldCB0aGUgc291bmR2b2x1bWUgaW4gYSBzaW1wbGUgd2F5CisgICAgcHJpbnQgJ1x0U3lzdGVtIGJlZXAgdm9sdW1lJworICAgIGZvciBpIGluIHJhbmdlKDAsIDcpOgorICAgICAgICB2b2x1bWVsZXZlbChpKQorICAgICAgICBNYWNPUy5TeXNCZWVwKCkKKworICAgICMgRmluZGVyJ3Mgd2luZG93cywgZmlsZSBsb2NhdGlvbiwgZmlsZSBhdHRyaWJ1dGVzCisgICAgb3BlbigiQGZpbmRlcnRvb2xzdGVzdCIsICJ3IikKKyAgICBmID0gIkBmaW5kZXJ0b29sc3Rlc3QiCisgICAgcmV2ZWFsKGYpICAgICAgICAgICAgICAgIyByZXZlYWwgdGhpcyBmaWxlIGluIGEgRmluZGVyIHdpbmRvdworICAgIHNlbGVjdChmKSAgICAgICAgICAgICAgICMgc2VsZWN0IHRoaXMgZmlsZQorCisgICAgYmFzZSwgZmlsZSA9IG9zLnBhdGguc3BsaXQoZikKKyAgICBjbG9zZXdpbmRvdyhiYXNlKSAgICMgY2xvc2UgdGhlIHdpbmRvdyB0aGlzIGZpbGUgaXMgaW4gIChvcGVuZWQgYnkgcmV2ZWFsKQorICAgIG9wZW53aW5kb3coYmFzZSkgICAgICAgICMgb3BlbiBpdCBhZ2FpbgorICAgIHdpbmRvd3ZpZXcoYmFzZSwgMSkgIyBzZXQgdGhlIHZpZXcgYnkgbGlzdAorCisgICAgbGFiZWwoZiwgMikgICAgICAgICAgICAgIyBzZXQgdGhlIGxhYmVsIG9mIHRoaXMgZmlsZSB0byBzb21ldGhpbmcgb3JhbmdlCisgICAgcHJpbnQgJ1x0bGFiZWwnLCBsYWJlbChmKSAgICMgZ2V0IHRoZSBsYWJlbCBvZiB0aGlzIGZpbGUKKworICAgICMgdGhlIGZpbGUgbG9jYXRpb24gb25seSB3b3JrcyBpbiBhIHdpbmRvdyB3aXRoIGljb24gdmlldyEKKyAgICBwcmludCAnUmFuZG9tIGxvY2F0aW9ucyBmb3IgYW4gaWNvbicKKyAgICB3aW5kb3d2aWV3KGJhc2UsIDApICAgICAjIHNldCB0aGUgdmlldyBieSBpY29uCisgICAgd2luZG93c2l6ZShiYXNlLCAoNjAwLCA2MDApKQorICAgIGZvciBpIGluIHJhbmdlKDUwKToKKyAgICAgICAgbG9jYXRpb24oZiwgKHJhbmRvbS5yYW5kaW50KDEwLCA1OTApLCByYW5kb20ucmFuZGludCgxMCwgNTkwKSkpCisKKyAgICB3aW5kb3dzaXplKGJhc2UsICgyMDAsIDQwMCkpCisgICAgd2luZG93dmlldyhiYXNlLCAxKSAgICAgIyBzZXQgdGhlIHZpZXcgYnkgaWNvbgorCisgICAgb3JncG9zID0gd2luZG93cG9zaXRpb24oYmFzZSkKKyAgICBwcmludCAnQW5pbWF0ZWQgd2luZG93IGxvY2F0aW9uJworICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgcG9zID0gKDEwMCtpKjEwLCAxMDAraSoxMCkKKyAgICAgICAgd2luZG93cG9zaXRpb24oYmFzZSwgcG9zKQorICAgICAgICBwcmludCAnXHR3aW5kb3cgcG9zaXRpb24nLCBwb3MKKyAgICB3aW5kb3dwb3NpdGlvbihiYXNlLCBvcmdwb3MpICAgICMgcGFyayBpdCB3aGVyZSBpdCB3YXMgYmVmb3JlCisKKyAgICBwcmludCAnUHV0IGEgY29tbWVudCBpbiBmaWxlJywgZiwgJzonCisgICAgcHJpbnQgJ1x0JywgY29tbWVudChmKSAgICAgICMgcHJpbnQgdGhlIEZpbmRlciBjb21tZW50IHRoaXMgZmlsZSBoYXMKKyAgICBzID0gJ1RoaXMgaXMgYSBjb21tZW50IG5vIG9uZSByZWFkcyEnCisgICAgY29tbWVudChmLCBzKSAgICAgICAgICAgIyBzZXQgdGhlIEZpbmRlciBjb21tZW50CisKK2RlZiBfdGVzdDMoKToKKyAgICBwcmludCAnTWFjT1M5IG9yIGJldHRlciBzcGVjaWZpYyBmdW5jdGlvbnMnCisgICAgIyBwcm9jZXNzZXMKKyAgICBwciA9IHByb2Nlc3NlcygpICAgICAgICAjIHJldHVybiBhIGxpc3Qgb2YgdHVwbGVzIHdpdGggKGFjdGl2ZV9wcm9jZXNzbmFtZSwgY3JlYXRvcmNvZGUpCisgICAgcHJpbnQgJ1JldHVybiBhIGxpc3Qgb2YgY3VycmVudCBhY3RpdmUgcHJvY2Vzc2VzOicKKyAgICBmb3IgcCBpbiBwcjoKKyAgICAgICAgcHJpbnQgJ1x0JywgcAorCisgICAgIyBnZXQgYXR0cmlidXRlcyBvZiB0aGUgZmlyc3QgcHJvY2VzcyBpbiB0aGUgbGlzdAorICAgIHByaW50ICdBdHRyaWJ1dGVzIG9mIHRoZSBmaXJzdCBwcm9jZXNzIGluIHRoZSBsaXN0OicKKyAgICBwaW5mbyA9IHByb2Nlc3NpbmZvKHByWzBdWzBdKQorICAgIHByaW50ICdcdCcsIHByWzBdWzBdCisgICAgcHJpbnQgJ1x0XHRtZW1vcnkgcGFydGl0aW9uJywgcGluZm8ucGFydGl0aW9uICAgICAgICMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gdGhpcyBwcm9jZXNzCisgICAgcHJpbnQgJ1x0XHRtZW1vcnkgdXNlZCcsIHBpbmZvLnVzZWQgICAgICAgICAjIHRoZSBtZW1vcnkgYWN0dWFsbCB1c2VkIGJ5IHRoaXMgcHJvY2VzcworICAgIHByaW50ICdcdFx0aXMgdmlzaWJsZScsIHBpbmZvLnZpc2libGUgICAgICAgICAgICMgaXMgdGhlIHByb2Nlc3MgdmlzaWJsZSB0byB0aGUgdXNlcgorICAgIHByaW50ICdcdFx0aXMgZnJvbnRtb3N0JywgcGluZm8uZnJvbnRtb3N0ICAgICAgICMgaXMgdGhlIHByb2Nlc3MgdGhlIGZyb250IG1vc3Qgb25lPworICAgIHByaW50ICdcdFx0aGFzIHNjcmlwdGluZycsIHBpbmZvLmhhc3NjcmlwdGluZyAgICAgICAjIGlzIHRoZSBwcm9jZXNzIHNjcmlwdGFibGU/CisgICAgcHJpbnQgJ1x0XHRhY2NlcHRzIGhpZ2ggbGV2ZWwgZXZlbnRzJywgIHBpbmZvLmFjY2VwdGhpZ2hsZXZlbCAgICMgZG9lcyB0aGUgcHJvY2VzcyBhY2NlcHQgaGlnaCBsZXZlbCBhcHBsZWV2ZW50cz8KKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfdGVzdCgpCisgICAgX3Rlc3QyKCkKKyAgICBfdGVzdDMoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9maW5kZXJ0b29scy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2ZpbmRlcnRvb2xzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDVkYTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9maW5kZXJ0b29scy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9maW5kZXJ0b29scy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2ZpbmRlcnRvb2xzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDVkYTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9maW5kZXJ0b29scy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9nZW5zdWl0ZW1vZHVsZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvZ2Vuc3VpdGVtb2R1bGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJhZTA4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvZ2Vuc3VpdGVtb2R1bGUucHkKQEAgLTAsMCArMSwxMjE2IEBACisiIiIKK2dlbnN1aXRlbW9kdWxlIC0gR2VuZXJhdGUgYW4gQUUgc3VpdGUgbW9kdWxlIGZyb20gYW4gYWV0ZS9hZXV0IHJlc291cmNlCisKK0Jhc2VkIG9uIGFldGUucHkuCisKK1JlYWRpbmcgYW5kIHVuZGVyc3RhbmRpbmcgdGhpcyBjb2RlIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgdG8gdGhlIHJlYWRlci4KKyIiIgorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIGdlbnN1aXRlbW9kdWxlIG1vZHVsZSBpcyByZW1vdmVkLiIsIHN0YWNrbGV2ZWw9MikKKworaW1wb3J0IE1hY09TCitpbXBvcnQgRWFzeURpYWxvZ3MKK2ltcG9ydCBvcworaW1wb3J0IHN0cmluZworaW1wb3J0IHN5cworaW1wb3J0IHR5cGVzCitpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBrZXl3b3JkCitpbXBvcnQgbWFjcmVzb3VyY2UKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgZGlzdHV0aWxzLnN5c2NvbmZpZworaW1wb3J0IE9TQVRlcm1pbm9sb2d5Citmcm9tIENhcmJvbi5SZXMgaW1wb3J0ICoKK2ltcG9ydCBDYXJib24uRm9sZGVyCitpbXBvcnQgTWFjT1MKK2ltcG9ydCBnZXRvcHQKK2ltcG9ydCBwbGlzdGxpYgorCitfTUFDX0xJQl9GT0xERVI9b3MucGF0aC5kaXJuYW1lKGFldG9vbHMuX19maWxlX18pCitERUZBVUxUX1NUQU5EQVJEX1BBQ0tBR0VGT0xERVI9b3MucGF0aC5qb2luKF9NQUNfTElCX0ZPTERFUiwgJ2xpYi1zY3JpcHRwYWNrYWdlcycpCitERUZBVUxUX1VTRVJfUEFDS0FHRUZPTERFUj1kaXN0dXRpbHMuc3lzY29uZmlnLmdldF9weXRob25fbGliKCkKKworZGVmIHVzYWdlKCk6CisgICAgc3lzLnN0ZGVyci53cml0ZSgiVXNhZ2U6ICVzIFtvcHRzXSBhcHBsaWNhdGlvbi1vci1yZXNvdXJjZS1maWxlXG4iICUgc3lzLmFyZ3ZbMF0pCisgICAgc3lzLnN0ZGVyci53cml0ZSgiIiJPcHRpb25zOgorLS1vdXRwdXQgcGtnZGlyICBQYXRobmFtZSBvZiB0aGUgb3V0cHV0IHBhY2thZ2UgKHNob3J0OiAtbykKKy0tcmVzb3VyY2UgICAgICAgUGFyc2UgcmVzb3VyY2UgZmlsZSBpbiBzdGVhZCBvZiBsYXVuY2hpbmcgYXBwbGljYXRpb24gKC1yKQorLS1iYXNlIHBhY2thZ2UgICBVc2UgYW5vdGhlciBiYXNlIHBhY2thZ2UgaW4gc3RlYWQgb2YgZGVmYXVsdCBTdGRTdWl0ZXMgKC1iKQorLS1lZGl0IG9sZD1uZXcgICBFZGl0IHN1aXRlIG5hbWVzLCB1c2UgZW1wdHkgbmV3IHRvIHNraXAgYSBzdWl0ZSAoLWUpCistLWNyZWF0b3IgY29kZSAgIFNldCBjcmVhdG9yIGNvZGUgZm9yIHBhY2thZ2UgKC1jKQorLS1kdW1wICAgICAgICAgICBEdW1wIGFldGUgcmVzb3VyY2UgdG8gc3Rkb3V0IGluIHN0ZWFkIG9mIGNyZWF0aW5nIG1vZHVsZSAoLWQpCistLXZlcmJvc2UgICAgICAgIFRlbGwgdXMgd2hhdCBoYXBwZW5zICgtdikKKyIiIikKKyAgICBzeXMuZXhpdCgxKQorCitkZWYgbWFpbigpOgorICAgIGlmIGxlbihzeXMuYXJndikgPiAxOgorICAgICAgICBTSE9SVE9QVFMgPSAicmI6bzplOmM6ZHYiCisgICAgICAgIExPTkdPUFRTID0gKCJyZXNvdXJjZSIsICJiYXNlPSIsICJvdXRwdXQ9IiwgImVkaXQ9IiwgImNyZWF0b3I9IiwgImR1bXAiLCAidmVyYm9zZSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgU0hPUlRPUFRTLCBMT05HT1BUUykKKyAgICAgICAgZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvcjoKKyAgICAgICAgICAgIHVzYWdlKCkKKworICAgICAgICBwcm9jZXNzX2Z1bmMgPSBwcm9jZXNzZmlsZQorICAgICAgICBiYXNlcGtnbmFtZSA9ICdTdGRTdWl0ZXMnCisgICAgICAgIG91dHB1dCA9IE5vbmUKKyAgICAgICAgZWRpdF9tb2RuYW1lcyA9IFtdCisgICAgICAgIGNyZWF0b3JzaWduYXR1cmUgPSBOb25lCisgICAgICAgIGR1bXAgPSBOb25lCisgICAgICAgIHZlcmJvc2UgPSBOb25lCisKKyAgICAgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgICAgIGlmIG8gaW4gKCctcicsICctLXJlc291cmNlJyk6CisgICAgICAgICAgICAgICAgcHJvY2Vzc19mdW5jID0gcHJvY2Vzc2ZpbGVfZnJvbXJlc291cmNlCisgICAgICAgICAgICBpZiBvIGluICgnLWInLCAnLS1iYXNlJyk6CisgICAgICAgICAgICAgICAgYmFzZXBrZ25hbWUgPSBhCisgICAgICAgICAgICBpZiBvIGluICgnLW8nLCAnLS1vdXRwdXQnKToKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBhCisgICAgICAgICAgICBpZiBvIGluICgnLWUnLCAnLS1lZGl0Jyk6CisgICAgICAgICAgICAgICAgc3BsaXQgPSBhLnNwbGl0KCc9JykKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3BsaXQpICE9IDI6CisgICAgICAgICAgICAgICAgICAgIHVzYWdlKCkKKyAgICAgICAgICAgICAgICBlZGl0X21vZG5hbWVzLmFwcGVuZChzcGxpdCkKKyAgICAgICAgICAgIGlmIG8gaW4gKCctYycsICctLWNyZWF0b3InKToKKyAgICAgICAgICAgICAgICBpZiBsZW4oYSkgIT0gNDoKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiY3JlYXRvciBtdXN0IGJlIDQtY2hhciBzdHJpbmdcbiIpCisgICAgICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgICAgICAgICAgY3JlYXRvcnNpZ25hdHVyZSA9IGEKKyAgICAgICAgICAgIGlmIG8gaW4gKCctZCcsICctLWR1bXAnKToKKyAgICAgICAgICAgICAgICBkdW1wID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgaWYgbyBpbiAoJy12JywgJy0tdmVyYm9zZScpOgorICAgICAgICAgICAgICAgIHZlcmJvc2UgPSBzeXMuc3RkZXJyCisKKworICAgICAgICBpZiBvdXRwdXQgYW5kIGxlbihhcmdzKSA+IDE6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIlczogY2Fubm90IHNwZWNpZnkgLS1vdXRwdXQgd2l0aCBtdWx0aXBsZSBpbnB1dHNcbiIgJSBzeXMuYXJndlswXSkKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3M6CisgICAgICAgICAgICBwcm9jZXNzX2Z1bmMoZmlsZW5hbWUsIG91dHB1dD1vdXRwdXQsIGJhc2Vwa2duYW1lPWJhc2Vwa2duYW1lLAorICAgICAgICAgICAgICAgIGVkaXRfbW9kbmFtZXM9ZWRpdF9tb2RuYW1lcywgY3JlYXRvcnNpZ25hdHVyZT1jcmVhdG9yc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgIGR1bXA9ZHVtcCwgdmVyYm9zZT12ZXJib3NlKQorICAgIGVsc2U6CisgICAgICAgIG1haW5faW50ZXJhY3RpdmUoKQorCitkZWYgbWFpbl9pbnRlcmFjdGl2ZShpbnRlcmFjdD0wLCBiYXNlcGtnbmFtZT0nU3RkU3VpdGVzJyk6CisgICAgaWYgaW50ZXJhY3Q6CisgICAgICAgICMgQXNrIGZvciBzYXZlLWZpbGVuYW1lIGZvciBlYWNoIG1vZHVsZQorICAgICAgICBlZGl0X21vZG5hbWVzID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgICMgVXNlIGRlZmF1bHQgZmlsZW5hbWVzIGZvciBlYWNoIG1vZHVsZQorICAgICAgICBlZGl0X21vZG5hbWVzID0gW10KKyAgICBhcHBzZm9sZGVyID0gQ2FyYm9uLkZvbGRlci5GU0ZpbmRGb2xkZXIoLTMyNzY1LCAnYXBwcycsIDApCisgICAgZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbigKKyAgICAgICAgbWVzc2FnZT0nU2VsZWN0IHNjcmlwdGFibGUgYXBwbGljYXRpb24nLAorICAgICAgICBkaWFsb2dPcHRpb25GbGFncz0weDEwNTYsICAgICAgICMgYWxsb3cgc2VsZWN0aW9uIG9mIC5hcHAgYnVuZGxlcworICAgICAgICBkZWZhdWx0TG9jYXRpb249YXBwc2ZvbGRlcikKKyAgICBpZiBub3QgZmlsZW5hbWU6CisgICAgICAgIHJldHVybgorICAgIGlmIG5vdCBpc19zY3JpcHRhYmxlKGZpbGVuYW1lKToKKyAgICAgICAgaWYgRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoCisgICAgICAgICAgICAgICAgIldhcm5pbmc6IGFwcGxpY2F0aW9uIGRvZXMgbm90IHNlZW0gc2NyaXB0YWJsZSIsCisgICAgICAgICAgICAgICAgeWVzPSJDb250aW51ZSIsIGRlZmF1bHQ9Miwgbm89IiIpIDw9IDA6CisgICAgICAgICAgICByZXR1cm4KKyAgICB0cnk6CisgICAgICAgIHByb2Nlc3NmaWxlKGZpbGVuYW1lLCBlZGl0X21vZG5hbWVzPWVkaXRfbW9kbmFtZXMsIGJhc2Vwa2duYW1lPWJhc2Vwa2duYW1lLAorICAgICAgICB2ZXJib3NlPXN5cy5zdGRlcnIpCisgICAgZXhjZXB0IE1hY09TLkVycm9yLCBhcmc6CisgICAgICAgIHByaW50ICJFcnJvciBnZXR0aW5nIHRlcm1pbm9sb2d5OiIsIGFyZworICAgICAgICBwcmludCAiUmV0cnksIG1hbnVhbGx5IHBhcnNpbmcgcmVzb3VyY2VzIgorICAgICAgICBwcm9jZXNzZmlsZV9mcm9tcmVzb3VyY2UoZmlsZW5hbWUsIGVkaXRfbW9kbmFtZXM9ZWRpdF9tb2RuYW1lcywKKyAgICAgICAgICAgIGJhc2Vwa2duYW1lPWJhc2Vwa2duYW1lLCB2ZXJib3NlPXN5cy5zdGRlcnIpCisKK2RlZiBpc19zY3JpcHRhYmxlKGFwcGxpY2F0aW9uKToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgYXBwbGljYXRpb24gaXMgc2NyaXB0YWJsZSIiIgorICAgIGlmIG9zLnBhdGguaXNkaXIoYXBwbGljYXRpb24pOgorICAgICAgICBwbGlzdGZpbGUgPSBvcy5wYXRoLmpvaW4oYXBwbGljYXRpb24sICdDb250ZW50cycsICdJbmZvLnBsaXN0JykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBsaXN0ZmlsZSk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcGxpc3QgPSBwbGlzdGxpYi5QbGlzdC5mcm9tRmlsZShwbGlzdGZpbGUpCisgICAgICAgIHJldHVybiBwbGlzdC5nZXQoJ05TQXBwbGVTY3JpcHRFbmFibGVkJywgRmFsc2UpCisgICAgIyBJZiBpdCBpcyBhIGZpbGUgdGVzdCBmb3IgYW4gYWV0ZS9hZXV0IHJlc291cmNlLgorICAgIGN1cnJmID0gQ3VyUmVzRmlsZSgpCisgICAgdHJ5OgorICAgICAgICByZWZubyA9IG1hY3Jlc291cmNlLm9wZW5fcGF0aG5hbWUoYXBwbGljYXRpb24pCisgICAgZXhjZXB0IE1hY09TLkVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBVc2VSZXNGaWxlKHJlZm5vKQorICAgIG5fdGVybWlub2xvZ3kgPSBDb3VudDFSZXNvdXJjZXMoJ2FldGUnKSArIENvdW50MVJlc291cmNlcygnYWV1dCcpICsgXAorICAgICAgICBDb3VudDFSZXNvdXJjZXMoJ3Njc3onKSArIENvdW50MVJlc291cmNlcygnb3NpeicpCisgICAgQ2xvc2VSZXNGaWxlKHJlZm5vKQorICAgIFVzZVJlc0ZpbGUoY3VycmYpCisgICAgcmV0dXJuIG5fdGVybWlub2xvZ3kgPiAwCisKK2RlZiBwcm9jZXNzZmlsZV9mcm9tcmVzb3VyY2UoZnVsbG5hbWUsIG91dHB1dD1Ob25lLCBiYXNlcGtnbmFtZT1Ob25lLAorICAgICAgICBlZGl0X21vZG5hbWVzPU5vbmUsIGNyZWF0b3JzaWduYXR1cmU9Tm9uZSwgZHVtcD1Ob25lLCB2ZXJib3NlPU5vbmUpOgorICAgICIiIlByb2Nlc3MgYWxsIHJlc291cmNlcyBpbiBhIHNpbmdsZSBmaWxlIiIiCisgICAgaWYgbm90IGlzX3NjcmlwdGFibGUoZnVsbG5hbWUpIGFuZCB2ZXJib3NlOgorICAgICAgICBwcmludCA+PnZlcmJvc2UsICJXYXJuaW5nOiBhcHAgZG9lcyBub3Qgc2VlbSBzY3JpcHRhYmxlOiAlcyIgJSBmdWxsbmFtZQorICAgIGN1ciA9IEN1clJlc0ZpbGUoKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ID4+dmVyYm9zZSwgIlByb2Nlc3NpbmciLCBmdWxsbmFtZQorICAgIHJmID0gbWFjcmVzb3VyY2Uub3Blbl9wYXRobmFtZShmdWxsbmFtZSkKKyAgICB0cnk6CisgICAgICAgIFVzZVJlc0ZpbGUocmYpCisgICAgICAgIHJlc291cmNlcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKENvdW50MVJlc291cmNlcygnYWV0ZScpKToKKyAgICAgICAgICAgIHJlcyA9IEdldDFJbmRSZXNvdXJjZSgnYWV0ZScsIDEraSkKKyAgICAgICAgICAgIHJlc291cmNlcy5hcHBlbmQocmVzKQorICAgICAgICBmb3IgaSBpbiByYW5nZShDb3VudDFSZXNvdXJjZXMoJ2FldXQnKSk6CisgICAgICAgICAgICByZXMgPSBHZXQxSW5kUmVzb3VyY2UoJ2FldXQnLCAxK2kpCisgICAgICAgICAgICByZXNvdXJjZXMuYXBwZW5kKHJlcykKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ID4+dmVyYm9zZSwgIlxuTElTVElORyBhZXRlK2FldXQgUkVTT1VSQ0VTIElOIiwgcmVwcihmdWxsbmFtZSkKKyAgICAgICAgYWV0ZWxpc3QgPSBbXQorICAgICAgICBmb3IgcmVzIGluIHJlc291cmNlczoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgPj52ZXJib3NlLCAiZGVjb2RpbmciLCByZXMuR2V0UmVzSW5mbygpLCAiLi4uIgorICAgICAgICAgICAgZGF0YSA9IHJlcy5kYXRhCisgICAgICAgICAgICBhZXRlID0gZGVjb2RlKGRhdGEsIHZlcmJvc2UpCisgICAgICAgICAgICBhZXRlbGlzdC5hcHBlbmQoKGFldGUsIHJlcy5HZXRSZXNJbmZvKCkpKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIHJmICE9IGN1cjoKKyAgICAgICAgICAgIENsb3NlUmVzRmlsZShyZikKKyAgICAgICAgICAgIFVzZVJlc0ZpbGUoY3VyKQorICAgICMgc3dpdGNoIGJhY2sgKG5lZWRlZCBmb3IgZGlhbG9ncyBpbiBQeXRob24pCisgICAgVXNlUmVzRmlsZShjdXIpCisgICAgaWYgZHVtcDoKKyAgICAgICAgZHVtcGFldGVsaXN0KGFldGVsaXN0LCBkdW1wKQorICAgIGNvbXBpbGVhZXRlbGlzdChhZXRlbGlzdCwgZnVsbG5hbWUsIG91dHB1dD1vdXRwdXQsCisgICAgICAgIGJhc2Vwa2duYW1lPWJhc2Vwa2duYW1lLCBlZGl0X21vZG5hbWVzPWVkaXRfbW9kbmFtZXMsCisgICAgICAgIGNyZWF0b3JzaWduYXR1cmU9Y3JlYXRvcnNpZ25hdHVyZSwgdmVyYm9zZT12ZXJib3NlKQorCitkZWYgcHJvY2Vzc2ZpbGUoZnVsbG5hbWUsIG91dHB1dD1Ob25lLCBiYXNlcGtnbmFtZT1Ob25lLAorICAgICAgICBlZGl0X21vZG5hbWVzPU5vbmUsIGNyZWF0b3JzaWduYXR1cmU9Tm9uZSwgZHVtcD1Ob25lLAorICAgICAgICB2ZXJib3NlPU5vbmUpOgorICAgICIiIkFzayBhbiBhcHBsaWNhdGlvbiBmb3IgaXRzIHRlcm1pbm9sb2d5IGFuZCBwcm9jZXNzIHRoYXQiIiIKKyAgICBpZiBub3QgaXNfc2NyaXB0YWJsZShmdWxsbmFtZSkgYW5kIHZlcmJvc2U6CisgICAgICAgIHByaW50ID4+dmVyYm9zZSwgIldhcm5pbmc6IGFwcCBkb2VzIG5vdCBzZWVtIHNjcmlwdGFibGU6ICVzIiAlIGZ1bGxuYW1lCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgPj52ZXJib3NlLCAiXG5BU0tJTkcgRk9SIGFldGUgRElDVElPTkFSWSBJTiIsIHJlcHIoZnVsbG5hbWUpCisgICAgdHJ5OgorICAgICAgICBhZWRlc2NvYmosIGxhdW5jaGVkID0gT1NBVGVybWlub2xvZ3kuR2V0QXBwVGVybWlub2xvZ3koZnVsbG5hbWUpCisgICAgZXhjZXB0IE1hY09TLkVycm9yLCBhcmc6CisgICAgICAgIGlmIGFyZ1swXSBpbiAoLTE3MDEsIC0xOTIpOiAjIGVyckFFRGVzY05vdEZvdW5kLCByZXNOb3RGb3VuZAorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCA+PnZlcmJvc2UsICJHZXRBcHBUZXJtaW5vbG9neSBmYWlsZWQgd2l0aCBlcnJBRURlc2NOb3RGb3VuZC9yZXNOb3RGb3VuZCwgdHJ5aW5nIG1hbnVhbGx5IgorICAgICAgICAgICAgYWVkYXRhLCBzaWcgPSBnZXRhcHB0ZXJtaW5vbG9neShmdWxsbmFtZSwgdmVyYm9zZT12ZXJib3NlKQorICAgICAgICAgICAgaWYgbm90IGNyZWF0b3JzaWduYXR1cmU6CisgICAgICAgICAgICAgICAgY3JlYXRvcnNpZ25hdHVyZSA9IHNpZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UKKyAgICBlbHNlOgorICAgICAgICBpZiBsYXVuY2hlZDoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgPj52ZXJib3NlLCAiTGF1bmNoZWQiLCBmdWxsbmFtZQorICAgICAgICByYXcgPSBhZXRvb2xzLnVucGFjayhhZWRlc2NvYmopCisgICAgICAgIGlmIG5vdCByYXc6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ID4+dmVyYm9zZSwgJ1VucGFjayByZXR1cm5lZCBlbXB0eSB2YWx1ZTonLCByYXcKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgcmF3WzBdLmRhdGE6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ID4+dmVyYm9zZSwgJ1VucGFjayByZXR1cm5lZCB2YWx1ZSB3aXRob3V0IGRhdGE6JywgcmF3CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYWVkYXRhID0gcmF3WzBdCisgICAgYWV0ZSA9IGRlY29kZShhZWRhdGEuZGF0YSwgdmVyYm9zZSkKKyAgICBpZiBkdW1wOgorICAgICAgICBkdW1wYWV0ZWxpc3QoW2FldGVdLCBkdW1wKQorICAgICAgICByZXR1cm4KKyAgICBjb21waWxlYWV0ZShhZXRlLCBOb25lLCBmdWxsbmFtZSwgb3V0cHV0PW91dHB1dCwgYmFzZXBrZ25hbWU9YmFzZXBrZ25hbWUsCisgICAgICAgIGNyZWF0b3JzaWduYXR1cmU9Y3JlYXRvcnNpZ25hdHVyZSwgZWRpdF9tb2RuYW1lcz1lZGl0X21vZG5hbWVzLAorICAgICAgICB2ZXJib3NlPXZlcmJvc2UpCisKK2RlZiBnZXRhcHB0ZXJtaW5vbG9neShmdWxsbmFtZSwgdmVyYm9zZT1Ob25lKToKKyAgICAiIiJHZXQgYXBwbGljYXRpb24gdGVybWlub2xvZ3kgYnkgc2VuZGluZyBhbiBBcHBsZUV2ZW50IiIiCisgICAgIyBGaXJzdCBjaGVjayB0aGF0IHdlIGFjdHVhbGx5IGNhbiBzZW5kIEFwcGxlRXZlbnRzCisgICAgaWYgbm90IE1hY09TLldNQXZhaWxhYmxlKCk6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkNhbm5vdCBzZW5kIEFwcGxlRXZlbnRzLCBubyBhY2Nlc3MgdG8gd2luZG93IG1hbmFnZXIiCisgICAgIyBOZXh0LCBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIE1hY09TIDEwLjI6IHNlbmRpbmcgZXZlbnRzIHdpbGwgaGFuZyB1bmxlc3MKKyAgICAjIHlvdSBoYXZlIGNyZWF0ZWQgYW4gZXZlbnQgbG9vcCBmaXJzdC4KKyAgICBpbXBvcnQgQ2FyYm9uLkV2dAorICAgIENhcmJvbi5FdnQuV2FpdE5leHRFdmVudCgwLDApCisgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSk6CisgICAgICAgICMgTm93IGdldCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBhcHBsaWNhdGlvbiwgaG9waW5nIGl0IGlzIGEgYnVuZGxlCisgICAgICAgIHBrZ2luZm8gPSBvcy5wYXRoLmpvaW4oZnVsbG5hbWUsICdDb250ZW50cycsICdQa2dJbmZvJykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBrZ2luZm8pOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiTm8gUGtnSW5mbyBmaWxlIGZvdW5kIgorICAgICAgICB0cF9jciA9IG9wZW4ocGtnaW5mbywgJ3JiJykucmVhZCgpCisgICAgICAgIGNyID0gdHBfY3JbNDo4XQorICAgIGVsc2U6CisgICAgICAgICMgQXNzdW1lIGl0IGlzIGEgZmlsZQorICAgICAgICBjciwgdHAgPSBNYWNPUy5HZXRDcmVhdG9yQW5kVHlwZShmdWxsbmFtZSkKKyAgICAjIExldCdzIHRhbGsgdG8gaXQgYW5kIGFzayBmb3IgaXRzIEFFVEUKKyAgICB0YWxrZXIgPSBhZXRvb2xzLlRhbGtUbyhjcikKKyAgICB0cnk6CisgICAgICAgIHRhbGtlci5fc3RhcnQoKQorICAgIGV4Y2VwdCAoTWFjT1MuRXJyb3IsIGFldG9vbHMuRXJyb3IpLCBhcmc6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCA+PnZlcmJvc2UsICdXYXJuaW5nOiBzdGFydCgpIGZhaWxlZCwgY29udGludWluZyBhbnl3YXk6JywgYXJnCisgICAgcmVwbHkgPSB0YWxrZXIuc2VuZCgiYXNjciIsICJnZHRlIikKKyAgICAjcmVwbHkyID0gdGFsa2VyLnNlbmQoImFzY3IiLCAiZ2R1dCIpCisgICAgIyBOb3cgcGljayB0aGUgYml0cyBvdXQgb2YgdGhlIHJldHVybiB0aGF0IHdlIG5lZWQuCisgICAgcmV0dXJuIHJlcGx5WzFdWyctLS0tJ10sIGNyCisKKworZGVmIGNvbXBpbGVhZXRlbGlzdChhZXRlbGlzdCwgZnVsbG5hbWUsIG91dHB1dD1Ob25lLCBiYXNlcGtnbmFtZT1Ob25lLAorICAgICAgICAgICAgZWRpdF9tb2RuYW1lcz1Ob25lLCBjcmVhdG9yc2lnbmF0dXJlPU5vbmUsIHZlcmJvc2U9Tm9uZSk6CisgICAgZm9yIGFldGUsIHJlc2luZm8gaW4gYWV0ZWxpc3Q6CisgICAgICAgIGNvbXBpbGVhZXRlKGFldGUsIHJlc2luZm8sIGZ1bGxuYW1lLCBvdXRwdXQ9b3V0cHV0LAorICAgICAgICAgICAgYmFzZXBrZ25hbWU9YmFzZXBrZ25hbWUsIGVkaXRfbW9kbmFtZXM9ZWRpdF9tb2RuYW1lcywKKyAgICAgICAgICAgIGNyZWF0b3JzaWduYXR1cmU9Y3JlYXRvcnNpZ25hdHVyZSwgdmVyYm9zZT12ZXJib3NlKQorCitkZWYgZHVtcGFldGVsaXN0KGFldGVsaXN0LCBvdXRwdXQpOgorICAgIGltcG9ydCBwcHJpbnQKKyAgICBwcHJpbnQucHByaW50KGFldGVsaXN0LCBvdXRwdXQpCisKK2RlZiBkZWNvZGUoZGF0YSwgdmVyYm9zZT1Ob25lKToKKyAgICAiIiJEZWNvZGUgYSByZXNvdXJjZSBpbnRvIGEgcHl0aG9uIGRhdGEgc3RydWN0dXJlIiIiCisgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKGRhdGEpCisgICAgYWV0ZSA9IGdlbmVyaWMoZ2V0YWV0ZSwgZikKKyAgICBhZXRlID0gc2ltcGxpZnkoYWV0ZSkKKyAgICBwcm9jZXNzZWQgPSBmLnRlbGwoKQorICAgIHVucHJvY2Vzc2VkID0gbGVuKGYucmVhZCgpKQorICAgIHRvdGFsID0gZi50ZWxsKCkKKyAgICBpZiB1bnByb2Nlc3NlZCBhbmQgdmVyYm9zZToKKyAgICAgICAgdmVyYm9zZS53cml0ZSgiJWQgcHJvY2Vzc2VkICsgJWQgdW5wcm9jZXNzZWQgPSAlZCB0b3RhbFxuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2Nlc3NlZCwgdW5wcm9jZXNzZWQsIHRvdGFsKSkKKyAgICByZXR1cm4gYWV0ZQorCitkZWYgc2ltcGxpZnkoaXRlbSk6CisgICAgIiIiUmVjdXJzaXZlbHkgcmVwbGFjZSBzaW5nbGV0b24gdHVwbGVzIGJ5IHRoZWlyIGNvbnN0aXR1ZW50IGl0ZW0iIiIKKyAgICBpZiB0eXBlKGl0ZW0pIGlzIHR5cGVzLkxpc3RUeXBlOgorICAgICAgICByZXR1cm4gbWFwKHNpbXBsaWZ5LCBpdGVtKQorICAgIGVsaWYgdHlwZShpdGVtKSA9PSB0eXBlcy5UdXBsZVR5cGUgYW5kIGxlbihpdGVtKSA9PSAyOgorICAgICAgICByZXR1cm4gc2ltcGxpZnkoaXRlbVsxXSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gaXRlbQorCisKKyMgSGVyZSBmb2xsb3dzIHRoZSBhZXRlIHJlc291cmNlIGRlY29kZXIuCisjIEl0IGlzIHByZXNlbnRlZCBib3R0b20tdXAgaW5zdGVhZCBvZiB0b3AtZG93biBiZWNhdXNlIHRoZXJlIGFyZSAgZGlyZWN0CisjIHJlZmVyZW5jZXMgdG8gdGhlIGxvd2VyLWxldmVsIHBhcnQtZGVjb2RlcnMgZnJvbSB0aGUgaGlnaC1sZXZlbCBwYXJ0LWRlY29kZXJzLgorCitkZWYgZ2V0Ynl0ZShmLCAqYXJncyk6CisgICAgYyA9IGYucmVhZCgxKQorICAgIGlmIG5vdCBjOgorICAgICAgICByYWlzZSBFT0ZFcnJvciwgJ2luIGdldGJ5dGUnICsgc3RyKGFyZ3MpCisgICAgcmV0dXJuIG9yZChjKQorCitkZWYgZ2V0d29yZChmLCAqYXJncyk6CisgICAgZ2V0YWxpZ24oZikKKyAgICBzID0gZi5yZWFkKDIpCisgICAgaWYgbGVuKHMpIDwgMjoKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IsICdpbiBnZXR3b3JkJyArIHN0cihhcmdzKQorICAgIHJldHVybiAob3JkKHNbMF0pPDw4KSB8IG9yZChzWzFdKQorCitkZWYgZ2V0bG9uZyhmLCAqYXJncyk6CisgICAgZ2V0YWxpZ24oZikKKyAgICBzID0gZi5yZWFkKDQpCisgICAgaWYgbGVuKHMpIDwgNDoKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IsICdpbiBnZXRsb25nJyArIHN0cihhcmdzKQorICAgIHJldHVybiAob3JkKHNbMF0pPDwyNCkgfCAob3JkKHNbMV0pPDwxNikgfCAob3JkKHNbMl0pPDw4KSB8IG9yZChzWzNdKQorCitkZWYgZ2V0b3N0eXBlKGYsICphcmdzKToKKyAgICBnZXRhbGlnbihmKQorICAgIHMgPSBmLnJlYWQoNCkKKyAgICBpZiBsZW4ocykgPCA0OgorICAgICAgICByYWlzZSBFT0ZFcnJvciwgJ2luIGdldG9zdHlwZScgKyBzdHIoYXJncykKKyAgICByZXR1cm4gcworCitkZWYgZ2V0cHN0cihmLCAqYXJncyk6CisgICAgYyA9IGYucmVhZCgxKQorICAgIGlmIGxlbihjKSA8IDE6CisgICAgICAgIHJhaXNlIEVPRkVycm9yLCAnaW4gZ2V0cHN0clsxXScgKyBzdHIoYXJncykKKyAgICBuYnl0ZXMgPSBvcmQoYykKKyAgICBpZiBuYnl0ZXMgPT0gMDogcmV0dXJuICcnCisgICAgcyA9IGYucmVhZChuYnl0ZXMpCisgICAgaWYgbGVuKHMpIDwgbmJ5dGVzOgorICAgICAgICByYWlzZSBFT0ZFcnJvciwgJ2luIGdldHBzdHJbMl0nICsgc3RyKGFyZ3MpCisgICAgcmV0dXJuIHMKKworZGVmIGdldGFsaWduKGYpOgorICAgIGlmIGYudGVsbCgpICYgMToKKyAgICAgICAgYyA9IGYucmVhZCgxKQorICAgICAgICAjI2lmIGMgIT0gJ1wwJzoKKyAgICAgICAgIyMgIHByaW50IGFsaWduOicsIHJlcHIoYykKKworZGVmIGdldGxpc3QoZiwgZGVzY3JpcHRpb24sIGdldGl0ZW0pOgorICAgIGNvdW50ID0gZ2V0d29yZChmKQorICAgIGxpc3QgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKGNvdW50KToKKyAgICAgICAgbGlzdC5hcHBlbmQoZ2VuZXJpYyhnZXRpdGVtLCBmKSkKKyAgICAgICAgZ2V0YWxpZ24oZikKKyAgICByZXR1cm4gbGlzdAorCitkZWYgYWx0X2dlbmVyaWMod2hhdCwgZiwgKmFyZ3MpOgorICAgIHByaW50ICJnZW5lcmljIiwgcmVwcih3aGF0KSwgYXJncworICAgIHJlcyA9IHZhZ2VuZXJpYyh3aGF0LCBmLCBhcmdzKQorICAgIHByaW50ICctPicsIHJlcHIocmVzKQorICAgIHJldHVybiByZXMKKworZGVmIGdlbmVyaWMod2hhdCwgZiwgKmFyZ3MpOgorICAgIGlmIHR5cGUod2hhdCkgPT0gdHlwZXMuRnVuY3Rpb25UeXBlOgorICAgICAgICByZXR1cm4gYXBwbHkod2hhdCwgKGYsKSArIGFyZ3MpCisgICAgaWYgdHlwZSh3aGF0KSA9PSB0eXBlcy5MaXN0VHlwZToKKyAgICAgICAgcmVjb3JkID0gW10KKyAgICAgICAgZm9yIHRoaW5nIGluIHdoYXQ6CisgICAgICAgICAgICBpdGVtID0gYXBwbHkoZ2VuZXJpYywgdGhpbmdbOjFdICsgKGYsKSArIHRoaW5nWzE6XSkKKyAgICAgICAgICAgIHJlY29yZC5hcHBlbmQoKHRoaW5nWzFdLCBpdGVtKSkKKyAgICAgICAgcmV0dXJuIHJlY29yZAorICAgIHJldHVybiAiQkFEIEdFTkVSSUMgQVJHUzogJXIiICUgKHdoYXQsKQorCitnZXRkYXRhID0gWworICAgIChnZXRvc3R5cGUsICJ0eXBlIiksCisgICAgKGdldHBzdHIsICJkZXNjcmlwdGlvbiIpLAorICAgIChnZXR3b3JkLCAiZmxhZ3MiKQorICAgIF0KK2dldGFyZ3VtZW50ID0gWworICAgIChnZXRwc3RyLCAibmFtZSIpLAorICAgIChnZXRvc3R5cGUsICJrZXl3b3JkIiksCisgICAgKGdldGRhdGEsICJ3aGF0IikKKyAgICBdCitnZXRldmVudCA9IFsKKyAgICAoZ2V0cHN0ciwgIm5hbWUiKSwKKyAgICAoZ2V0cHN0ciwgImRlc2NyaXB0aW9uIiksCisgICAgKGdldG9zdHlwZSwgInN1aXRlIGNvZGUiKSwKKyAgICAoZ2V0b3N0eXBlLCAiZXZlbnQgY29kZSIpLAorICAgIChnZXRkYXRhLCAicmV0dXJucyIpLAorICAgIChnZXRkYXRhLCAiYWNjZXB0cyIpLAorICAgIChnZXRsaXN0LCAib3B0aW9uYWwgYXJndW1lbnRzIiwgZ2V0YXJndW1lbnQpCisgICAgXQorZ2V0cHJvcGVydHkgPSBbCisgICAgKGdldHBzdHIsICJuYW1lIiksCisgICAgKGdldG9zdHlwZSwgImNvZGUiKSwKKyAgICAoZ2V0ZGF0YSwgIndoYXQiKQorICAgIF0KK2dldGVsZW1lbnQgPSBbCisgICAgKGdldG9zdHlwZSwgInR5cGUiKSwKKyAgICAoZ2V0bGlzdCwgImtleWZvcm0iLCBnZXRvc3R5cGUpCisgICAgXQorZ2V0Y2xhc3MgPSBbCisgICAgKGdldHBzdHIsICJuYW1lIiksCisgICAgKGdldG9zdHlwZSwgImNsYXNzIGNvZGUiKSwKKyAgICAoZ2V0cHN0ciwgImRlc2NyaXB0aW9uIiksCisgICAgKGdldGxpc3QsICJwcm9wZXJ0aWVzIiwgZ2V0cHJvcGVydHkpLAorICAgIChnZXRsaXN0LCAiZWxlbWVudHMiLCBnZXRlbGVtZW50KQorICAgIF0KK2dldGNvbXBhcmlzb24gPSBbCisgICAgKGdldHBzdHIsICJvcGVyYXRvciBuYW1lIiksCisgICAgKGdldG9zdHlwZSwgIm9wZXJhdG9yIElEIiksCisgICAgKGdldHBzdHIsICJvcGVyYXRvciBjb21tZW50IiksCisgICAgXQorZ2V0ZW51bWVyYXRvciA9IFsKKyAgICAoZ2V0cHN0ciwgImVudW1lcmF0b3IgbmFtZSIpLAorICAgIChnZXRvc3R5cGUsICJlbnVtZXJhdG9yIElEIiksCisgICAgKGdldHBzdHIsICJlbnVtZXJhdG9yIGNvbW1lbnQiKQorICAgIF0KK2dldGVudW1lcmF0aW9uID0gWworICAgIChnZXRvc3R5cGUsICJlbnVtZXJhdGlvbiBJRCIpLAorICAgIChnZXRsaXN0LCAiZW51bWVyYXRvciIsIGdldGVudW1lcmF0b3IpCisgICAgXQorZ2V0c3VpdGUgPSBbCisgICAgKGdldHBzdHIsICJzdWl0ZSBuYW1lIiksCisgICAgKGdldHBzdHIsICJzdWl0ZSBkZXNjcmlwdGlvbiIpLAorICAgIChnZXRvc3R5cGUsICJzdWl0ZSBJRCIpLAorICAgIChnZXR3b3JkLCAic3VpdGUgbGV2ZWwiKSwKKyAgICAoZ2V0d29yZCwgInN1aXRlIHZlcnNpb24iKSwKKyAgICAoZ2V0bGlzdCwgImV2ZW50cyIsIGdldGV2ZW50KSwKKyAgICAoZ2V0bGlzdCwgImNsYXNzZXMiLCBnZXRjbGFzcyksCisgICAgKGdldGxpc3QsICJjb21wYXJpc29ucyIsIGdldGNvbXBhcmlzb24pLAorICAgIChnZXRsaXN0LCAiZW51bWVyYXRpb25zIiwgZ2V0ZW51bWVyYXRpb24pCisgICAgXQorZ2V0YWV0ZSA9IFsKKyAgICAoZ2V0d29yZCwgIm1ham9yL21pbm9yIHZlcnNpb24gaW4gQkNEIiksCisgICAgKGdldHdvcmQsICJsYW5ndWFnZSBjb2RlIiksCisgICAgKGdldHdvcmQsICJzY3JpcHQgY29kZSIpLAorICAgIChnZXRsaXN0LCAic3VpdGVzIiwgZ2V0c3VpdGUpCisgICAgXQorCitkZWYgY29tcGlsZWFldGUoYWV0ZSwgcmVzaW5mbywgZm5hbWUsIG91dHB1dD1Ob25lLCBiYXNlcGtnbmFtZT1Ob25lLAorICAgICAgICBlZGl0X21vZG5hbWVzPU5vbmUsIGNyZWF0b3JzaWduYXR1cmU9Tm9uZSwgdmVyYm9zZT1Ob25lKToKKyAgICAiIiJHZW5lcmF0ZSBjb2RlIGZvciBhIGZ1bGwgYWV0ZSByZXNvdXJjZS4gZm5hbWUgcGFzc2VkIGZvciBkb2MgcHVycG9zZXMiIiIKKyAgICBbdmVyc2lvbiwgbGFuZ3VhZ2UsIHNjcmlwdCwgc3VpdGVzXSA9IGFldGUKKyAgICBtYWpvciwgbWlub3IgPSBkaXZtb2QodmVyc2lvbiwgMjU2KQorICAgIGlmIG5vdCBjcmVhdG9yc2lnbmF0dXJlOgorICAgICAgICBjcmVhdG9yc2lnbmF0dXJlLCBkdW1teSA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKGZuYW1lKQorICAgIHBhY2thZ2VuYW1lID0gaWRlbnRpZnkob3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGZuYW1lKSlbMF0pCisgICAgaWYgbGFuZ3VhZ2U6CisgICAgICAgIHBhY2thZ2VuYW1lID0gcGFja2FnZW5hbWUrJ19sYW5nJWQnJWxhbmd1YWdlCisgICAgaWYgc2NyaXB0OgorICAgICAgICBwYWNrYWdlbmFtZSA9IHBhY2thZ2VuYW1lKydfc2NyaXB0JWQnJXNjcmlwdAorICAgIGlmIGxlbihwYWNrYWdlbmFtZSkgPiAyNzoKKyAgICAgICAgcGFja2FnZW5hbWUgPSBwYWNrYWdlbmFtZVs6MjddCisgICAgaWYgb3V0cHV0OgorICAgICAgICAjIFhYWFggUHV0IHRoaXMgaW4gc2l0ZS1wYWNrYWdlcyBpZiBpdCBpc24ndCBhIGZ1bGwgcGF0aG5hbWU/CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvdXRwdXQpOgorICAgICAgICAgICAgb3MubWtkaXIob3V0cHV0KQorICAgICAgICBwYXRobmFtZSA9IG91dHB1dAorICAgIGVsc2U6CisgICAgICAgIHBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRm9sZGVyKG1lc3NhZ2U9J0NyZWF0ZSBhbmQgc2VsZWN0IHBhY2thZ2UgZm9sZGVyIGZvciAlcyclcGFja2FnZW5hbWUsCisgICAgICAgICAgICBkZWZhdWx0TG9jYXRpb249REVGQVVMVF9VU0VSX1BBQ0tBR0VGT0xERVIpCisgICAgICAgIG91dHB1dCA9IHBhdGhuYW1lCisgICAgaWYgbm90IHBhdGhuYW1lOgorICAgICAgICByZXR1cm4KKyAgICBwYWNrYWdlbmFtZSA9IG9zLnBhdGguc3BsaXQob3MucGF0aC5ub3JtcGF0aChwYXRobmFtZSkpWzFdCisgICAgaWYgbm90IGJhc2Vwa2duYW1lOgorICAgICAgICBiYXNlcGtnbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZvbGRlcihtZXNzYWdlPSdQYWNrYWdlIGZvbGRlciBmb3IgYmFzZSBzdWl0ZSAodXN1YWxseSBTdGRTdWl0ZXMpJywKKyAgICAgICAgICAgIGRlZmF1bHRMb2NhdGlvbj1ERUZBVUxUX1NUQU5EQVJEX1BBQ0tBR0VGT0xERVIpCisgICAgaWYgYmFzZXBrZ25hbWU6CisgICAgICAgIGRpcm5hbWUsIGJhc2Vwa2duYW1lID0gb3MucGF0aC5zcGxpdChvcy5wYXRoLm5vcm1wYXRoKGJhc2Vwa2duYW1lKSkKKyAgICAgICAgaWYgZGlybmFtZSBhbmQgbm90IGRpcm5hbWUgaW4gc3lzLnBhdGg6CisgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgZGlybmFtZSkKKyAgICAgICAgYmFzZXBhY2thZ2UgPSBfX2ltcG9ydF9fKGJhc2Vwa2duYW1lKQorICAgIGVsc2U6CisgICAgICAgIGJhc2VwYWNrYWdlID0gTm9uZQorICAgIHN1aXRlbGlzdCA9IFtdCisgICAgYWxscHJlY29tcGluZm8gPSBbXQorICAgIGFsbHN1aXRlcyA9IFtdCisgICAgZm9yIHN1aXRlIGluIHN1aXRlczoKKyAgICAgICAgY29tcGlsZXIgPSBTdWl0ZUNvbXBpbGVyKHN1aXRlLCBiYXNlcGFja2FnZSwgb3V0cHV0LCBlZGl0X21vZG5hbWVzLCB2ZXJib3NlKQorICAgICAgICBjb2RlLCBtb2RuYW1lLCBwcmVjb21waW5mbyA9IGNvbXBpbGVyLnByZWNvbXBpbGVzdWl0ZSgpCisgICAgICAgIGlmIG5vdCBjb2RlOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYWxscHJlY29tcGluZm8gPSBhbGxwcmVjb21waW5mbyArIHByZWNvbXBpbmZvCisgICAgICAgIHN1aXRlaW5mbyA9IHN1aXRlLCBwYXRobmFtZSwgbW9kbmFtZQorICAgICAgICBzdWl0ZWxpc3QuYXBwZW5kKChjb2RlLCBtb2RuYW1lKSkKKyAgICAgICAgYWxsc3VpdGVzLmFwcGVuZChjb21waWxlcikKKyAgICBmb3IgY29tcGlsZXIgaW4gYWxsc3VpdGVzOgorICAgICAgICBjb21waWxlci5jb21waWxlc3VpdGUobWFqb3IsIG1pbm9yLCBsYW5ndWFnZSwgc2NyaXB0LCBmbmFtZSwgYWxscHJlY29tcGluZm8pCisgICAgaW5pdGZpbGVuYW1lID0gb3MucGF0aC5qb2luKG91dHB1dCwgJ19faW5pdF9fLnB5JykKKyAgICBmcCA9IG9wZW4oaW5pdGZpbGVuYW1lLCAndycpCisgICAgTWFjT1MuU2V0Q3JlYXRvckFuZFR5cGUoaW5pdGZpbGVuYW1lLCAnUHl0aCcsICdURVhUJykKKyAgICBmcC53cml0ZSgnIiIiXG4nKQorICAgIGZwLndyaXRlKCJQYWNrYWdlIGdlbmVyYXRlZCBmcm9tICVzXG4iJWFzY2lpKGZuYW1lKSkKKyAgICBpZiByZXNpbmZvOgorICAgICAgICBmcC53cml0ZSgiUmVzb3VyY2UgJXMgcmVzaWQgJWQgJXNcbiIlKGFzY2lpKHJlc2luZm9bMV0pLCByZXNpbmZvWzBdLCBhc2NpaShyZXNpbmZvWzJdKSkpCisgICAgZnAud3JpdGUoJyIiIlxuJykKKyAgICBmcC53cml0ZSgnaW1wb3J0IGFldG9vbHNcbicpCisgICAgZnAud3JpdGUoJ0Vycm9yID0gYWV0b29scy5FcnJvclxuJykKKyAgICBzdWl0ZWxpc3Quc29ydCgpCisgICAgZm9yIGNvZGUsIG1vZG5hbWUgaW4gc3VpdGVsaXN0OgorICAgICAgICBmcC53cml0ZSgiaW1wb3J0ICVzXG4iICUgbW9kbmFtZSkKKyAgICBmcC53cml0ZSgiXG5cbl9jb2RlX3RvX21vZHVsZSA9IHtcbiIpCisgICAgZm9yIGNvZGUsIG1vZG5hbWUgaW4gc3VpdGVsaXN0OgorICAgICAgICBmcC53cml0ZSgiICAgICclcycgOiAlcyxcbiIlKGFzY2lpKGNvZGUpLCBtb2RuYW1lKSkKKyAgICBmcC53cml0ZSgifVxuXG4iKQorICAgIGZwLndyaXRlKCJcblxuX2NvZGVfdG9fZnVsbG5hbWUgPSB7XG4iKQorICAgIGZvciBjb2RlLCBtb2RuYW1lIGluIHN1aXRlbGlzdDoKKyAgICAgICAgZnAud3JpdGUoIiAgICAnJXMnIDogKCclcy4lcycsICclcycpLFxuIiUoYXNjaWkoY29kZSksIHBhY2thZ2VuYW1lLCBtb2RuYW1lLCBtb2RuYW1lKSkKKyAgICBmcC53cml0ZSgifVxuXG4iKQorICAgIGZvciBjb2RlLCBtb2RuYW1lIGluIHN1aXRlbGlzdDoKKyAgICAgICAgZnAud3JpdGUoImZyb20gJXMgaW1wb3J0ICpcbiIlbW9kbmFtZSkKKworICAgICMgR2VuZXJhdGUgcHJvcGVydHkgZGljdHMgYW5kIGVsZW1lbnQgZGljdHMgZm9yIGFsbCB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorICAgIGZwLndyaXRlKCJcbmRlZiBnZXRiYXNlY2xhc3Nlcyh2KTpcbiIpCisgICAgZnAud3JpdGUoIiAgICBpZiBub3QgZ2V0YXR0cih2LCAnX3Byb3BkaWN0JywgTm9uZSk6XG4iKQorICAgIGZwLndyaXRlKCIgICAgICAgIHYuX3Byb3BkaWN0ID0ge31cbiIpCisgICAgZnAud3JpdGUoIiAgICAgICAgdi5fZWxlbWRpY3QgPSB7fVxuIikKKyAgICBmcC53cml0ZSgiICAgICAgICBmb3Igc3VwZXJjbGFzc25hbWUgaW4gZ2V0YXR0cih2LCAnX3N1cGVyY2xhc3NuYW1lcycsIFtdKTpcbiIpCisgICAgZnAud3JpdGUoIiAgICAgICAgICAgIHN1cGVyY2xhc3MgPSBldmFsKHN1cGVyY2xhc3NuYW1lKVxuIikKKyAgICBmcC53cml0ZSgiICAgICAgICAgICAgZ2V0YmFzZWNsYXNzZXMoc3VwZXJjbGFzcylcbiIpCisgICAgZnAud3JpdGUoIiAgICAgICAgICAgIHYuX3Byb3BkaWN0LnVwZGF0ZShnZXRhdHRyKHN1cGVyY2xhc3MsICdfcHJvcGRpY3QnLCB7fSkpXG4iKQorICAgIGZwLndyaXRlKCIgICAgICAgICAgICB2Ll9lbGVtZGljdC51cGRhdGUoZ2V0YXR0cihzdXBlcmNsYXNzLCAnX2VsZW1kaWN0Jywge30pKVxuIikKKyAgICBmcC53cml0ZSgiICAgICAgICB2Ll9wcm9wZGljdC51cGRhdGUoZ2V0YXR0cih2LCAnX3ByaXZwcm9wZGljdCcsIHt9KSlcbiIpCisgICAgZnAud3JpdGUoIiAgICAgICAgdi5fZWxlbWRpY3QudXBkYXRlKGdldGF0dHIodiwgJ19wcml2ZWxlbWRpY3QnLCB7fSkpXG4iKQorICAgIGZwLndyaXRlKCJcbiIpCisgICAgZnAud3JpdGUoImltcG9ydCBTdGRTdWl0ZXNcbiIpCisgICAgYWxscHJlY29tcGluZm8uc29ydCgpCisgICAgaWYgYWxscHJlY29tcGluZm86CisgICAgICAgIGZwLndyaXRlKCJcbiNcbiMgU2V0IHByb3BlcnR5IGFuZCBlbGVtZW50IGRpY3Rpb25hcmllcyBub3cgdGhhdCBhbGwgY2xhc3NlcyBoYXZlIGJlZW4gZGVmaW5lZFxuI1xuIikKKyAgICAgICAgZm9yIGNvZGVuYW1lbWFwcGVyIGluIGFsbHByZWNvbXBpbmZvOgorICAgICAgICAgICAgZm9yIGssIHYgaW4gY29kZW5hbWVtYXBwZXIuZ2V0YWxsKCdjbGFzcycpOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKCJnZXRiYXNlY2xhc3NlcyglcylcbiIgJSB2KQorCisgICAgIyBHZW5lcmF0ZSBhIGNvZGUtdG8tbmFtZSBtYXBwZXIgZm9yIGFsbCBvZiB0aGUgdHlwZXMgKGNsYXNzZXMpIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisgICAgYXBwbGljYXRpb25fY2xhc3MgPSBOb25lCisgICAgaWYgYWxscHJlY29tcGluZm86CisgICAgICAgIGZwLndyaXRlKCJcbiNcbiMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZVxuI1xuIikKKyAgICAgICAgZnAud3JpdGUoIl9jbGFzc2RlY2xhcmF0aW9ucyA9IHtcbiIpCisgICAgICAgIGZvciBjb2RlbmFtZW1hcHBlciBpbiBhbGxwcmVjb21waW5mbzoKKyAgICAgICAgICAgIGZvciBrLCB2IGluIGNvZGVuYW1lbWFwcGVyLmdldGFsbCgnY2xhc3MnKToKKyAgICAgICAgICAgICAgICBmcC53cml0ZSgiICAgICVyIDogJXMsXG4iICUgKGssIHYpKQorICAgICAgICAgICAgICAgIGlmIGsgPT0gJ2NhcHAnOgorICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbl9jbGFzcyA9IHYKKyAgICAgICAgZnAud3JpdGUoIn1cbiIpCisKKworICAgIGlmIHN1aXRlbGlzdDoKKyAgICAgICAgZnAud3JpdGUoIlxuXG5jbGFzcyAlcyglc19FdmVudHMiJShwYWNrYWdlbmFtZSwgc3VpdGVsaXN0WzBdWzFdKSkKKyAgICAgICAgZm9yIGNvZGUsIG1vZG5hbWUgaW4gc3VpdGVsaXN0WzE6XToKKyAgICAgICAgICAgIGZwLndyaXRlKCIsXG4gICAgICAgICVzX0V2ZW50cyIlbW9kbmFtZSkKKyAgICAgICAgZnAud3JpdGUoIixcbiAgICAgICAgYWV0b29scy5UYWxrVG8pOlxuIikKKyAgICAgICAgZnAud3JpdGUoIiAgICBfc2lnbmF0dXJlID0gJXJcblxuIiUoY3JlYXRvcnNpZ25hdHVyZSwpKQorICAgICAgICBmcC53cml0ZSgiICAgIF9tb2R1bGVOYW1lID0gJyVzJ1xuXG4iJXBhY2thZ2VuYW1lKQorICAgICAgICBpZiBhcHBsaWNhdGlvbl9jbGFzczoKKyAgICAgICAgICAgIGZwLndyaXRlKCIgICAgX2VsZW1kaWN0ID0gJXMuX2VsZW1kaWN0XG4iICUgYXBwbGljYXRpb25fY2xhc3MpCisgICAgICAgICAgICBmcC53cml0ZSgiICAgIF9wcm9wZGljdCA9ICVzLl9wcm9wZGljdFxuIiAlIGFwcGxpY2F0aW9uX2NsYXNzKQorICAgIGZwLmNsb3NlKCkKKworY2xhc3MgU3VpdGVDb21waWxlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3VpdGUsIGJhc2VwYWNrYWdlLCBvdXRwdXQsIGVkaXRfbW9kbmFtZXMsIHZlcmJvc2UpOgorICAgICAgICBzZWxmLnN1aXRlID0gc3VpdGUKKyAgICAgICAgc2VsZi5iYXNlcGFja2FnZSA9IGJhc2VwYWNrYWdlCisgICAgICAgIHNlbGYuZWRpdF9tb2RuYW1lcyA9IGVkaXRfbW9kbmFtZXMKKyAgICAgICAgc2VsZi5vdXRwdXQgPSBvdXRwdXQKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorCisgICAgICAgICMgU2V0IGJ5IHByZWNvbXBpbGVzdWl0ZQorICAgICAgICBzZWxmLnBhdGhuYW1lID0gTm9uZQorICAgICAgICBzZWxmLm1vZG5hbWUgPSBOb25lCisKKyAgICAgICAgIyBTZXQgYnkgY29tcGlsZXN1aXRlCisgICAgICAgIHNlbGYuZnAgPSBOb25lCisgICAgICAgIHNlbGYuYmFzZW1vZHVsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5lbnVtc25lZWRlZCA9IHt9CisKKyAgICBkZWYgcHJlY29tcGlsZXN1aXRlKHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhIHNpbmdsZSBzdWl0ZSB3aXRob3V0IGdlbmVyYXRpbmcgdGhlIG91dHB1dC4gVGhpcyBzdGVwIGlzIG5lZWRlZAorICAgICAgICBzbyB3ZSBjYW4gcmVzb2x2ZSByZWN1cnNpdmUgcmVmZXJlbmNlcyBieSBzdWl0ZXMgdG8gZW51bXMvY29tcHMvZXRjIGRlY2xhcmVkCisgICAgICAgIGluIG90aGVyIHN1aXRlcyIiIgorICAgICAgICBbbmFtZSwgZGVzYywgY29kZSwgbGV2ZWwsIHZlcnNpb24sIGV2ZW50cywgY2xhc3NlcywgY29tcHMsIGVudW1zXSA9IHNlbGYuc3VpdGUKKworICAgICAgICBtb2RuYW1lID0gaWRlbnRpZnkobmFtZSkKKyAgICAgICAgaWYgbGVuKG1vZG5hbWUpID4gMjg6CisgICAgICAgICAgICBtb2RuYW1lID0gbW9kbmFtZVs6MjddCisgICAgICAgIGlmIHNlbGYuZWRpdF9tb2RuYW1lcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5wYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1B5dGhvbiBvdXRwdXQgZmlsZScsCisgICAgICAgICAgICAgICAgc2F2ZWRGaWxlTmFtZT1tb2RuYW1lKycucHknKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIG9sZCwgbmV3IGluIHNlbGYuZWRpdF9tb2RuYW1lczoKKyAgICAgICAgICAgICAgICBpZiBvbGQgPT0gbW9kbmFtZToKKyAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSA9IG5ldworICAgICAgICAgICAgaWYgbW9kbmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLnBhdGhuYW1lID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0LCBtb2RuYW1lICsgJy5weScpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucGF0aG5hbWUgPSBOb25lCisgICAgICAgIGlmIG5vdCBzZWxmLnBhdGhuYW1lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUsIE5vbmUKKworICAgICAgICBzZWxmLm1vZG5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguc3BsaXQoc2VsZi5wYXRobmFtZSlbMV0pWzBdCisKKyAgICAgICAgaWYgc2VsZi5iYXNlcGFja2FnZSBhbmQgY29kZSBpbiBzZWxmLmJhc2VwYWNrYWdlLl9jb2RlX3RvX21vZHVsZToKKyAgICAgICAgICAgICMgV2UgYXJlIGFuIGV4dGVuc2lvbiBvZiBhIGJhc2VjbGFzcyAodXN1YWxseSBhbiBhcHBsaWNhdGlvbiBleHRlbmRpbmcKKyAgICAgICAgICAgICMgU3RhbmRhcmRfU3VpdGUgb3Igc28pLiBJbXBvcnQgZXZlcnl0aGluZyBmcm9tIG91ciBiYXNlIG1vZHVsZQorICAgICAgICAgICAgYmFzZW1vZHVsZSA9IHNlbGYuYmFzZXBhY2thZ2UuX2NvZGVfdG9fbW9kdWxlW2NvZGVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlIGFyZSBub3QgYW4gZXh0ZW5zaW9uLgorICAgICAgICAgICAgYmFzZW1vZHVsZSA9IE5vbmUKKworICAgICAgICBzZWxmLmVudW1zbmVlZGVkID0ge30KKyAgICAgICAgZm9yIGV2ZW50IGluIGV2ZW50czoKKyAgICAgICAgICAgIHNlbGYuZmluZGVudW1zaW5ldmVudChldmVudCkKKworICAgICAgICBvYmpjID0gT2JqZWN0Q29tcGlsZXIoTm9uZSwgc2VsZi5tb2RuYW1lLCBiYXNlbW9kdWxlLCBpbnRlcmFjdD0oc2VsZi5lZGl0X21vZG5hbWVzIGlzIE5vbmUpLAorICAgICAgICAgICAgdmVyYm9zZT1zZWxmLnZlcmJvc2UpCisgICAgICAgIGZvciBjbHMgaW4gY2xhc3NlczoKKyAgICAgICAgICAgIG9iamMuY29tcGlsZWNsYXNzKGNscykKKyAgICAgICAgZm9yIGNscyBpbiBjbGFzc2VzOgorICAgICAgICAgICAgb2JqYy5maWxsY2xhc3Nwcm9wc2FuZGVsZW1zKGNscykKKyAgICAgICAgZm9yIGNvbXAgaW4gY29tcHM6CisgICAgICAgICAgICBvYmpjLmNvbXBpbGVjb21wYXJpc29uKGNvbXApCisgICAgICAgIGZvciBlbnVtIGluIGVudW1zOgorICAgICAgICAgICAgb2JqYy5jb21waWxlZW51bWVyYXRpb24oZW51bSkKKworICAgICAgICBmb3IgZW51bSBpbiBzZWxmLmVudW1zbmVlZGVkLmtleXMoKToKKyAgICAgICAgICAgIG9iamMuY2hlY2tmb3JlbnVtKGVudW0pCisKKyAgICAgICAgb2JqYy5kdW1waW5kZXgoKQorCisgICAgICAgIHByZWNvbXBpbmZvID0gb2JqYy5nZXRwcmVjb21waW5mbyhzZWxmLm1vZG5hbWUpCisKKyAgICAgICAgcmV0dXJuIGNvZGUsIHNlbGYubW9kbmFtZSwgcHJlY29tcGluZm8KKworICAgIGRlZiBjb21waWxlc3VpdGUoc2VsZiwgbWFqb3IsIG1pbm9yLCBsYW5ndWFnZSwgc2NyaXB0LCBmbmFtZSwgcHJlY29tcGluZm8pOgorICAgICAgICAiIiJHZW5lcmF0ZSBjb2RlIGZvciBhIHNpbmdsZSBzdWl0ZSIiIgorICAgICAgICBbbmFtZSwgZGVzYywgY29kZSwgbGV2ZWwsIHZlcnNpb24sIGV2ZW50cywgY2xhc3NlcywgY29tcHMsIGVudW1zXSA9IHNlbGYuc3VpdGUKKyAgICAgICAgIyBTb3J0IHZhcmlvdXMgbGlzdHMsIHNvIHJlLWdlbmVyYXRlZCBzb3VyY2UgaXMgZWFzaWVyIGNvbXBhcmVkCisgICAgICAgIGRlZiBjbGFzc19zb3J0ZXIoazEsIGsyKToKKyAgICAgICAgICAgICIiIlNvcnQgY2xhc3NlcyBieSBjb2RlLCBhbmQgbWFrZSBzdXJlIG1haW4gY2xhc3Mgc29ydHMgYmVmb3JlIHN5bm9ueW1zIiIiCisgICAgICAgICAgICAjIFtuYW1lLCBjb2RlLCBkZXNjLCBwcm9wZXJ0aWVzLCBlbGVtZW50c10gPSBjbHMKKyAgICAgICAgICAgIGlmIGsxWzFdIDwgazJbMV06IHJldHVybiAtMQorICAgICAgICAgICAgaWYgazFbMV0gPiBrMlsxXTogcmV0dXJuIDEKKyAgICAgICAgICAgIGlmIG5vdCBrMlszXSBvciBrMlszXVswXVsxXSA9PSAnY0AjISc6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgc3lub255bSwgdGhlIG90aGVyIG9uZSBpcyBiZXR0ZXIKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGlmIG5vdCBrMVszXSBvciBrMVszXVswXVsxXSA9PSAnY0AjISc6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgc3lub255bSwgdGhlIG90aGVyIG9uZSBpcyBiZXR0ZXIKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgICAgICBldmVudHMuc29ydCgpCisgICAgICAgIGNsYXNzZXMuc29ydChjbGFzc19zb3J0ZXIpCisgICAgICAgIGNvbXBzLnNvcnQoKQorICAgICAgICBlbnVtcy5zb3J0KCkKKworICAgICAgICBzZWxmLmZwID0gZnAgPSBvcGVuKHNlbGYucGF0aG5hbWUsICd3JykKKyAgICAgICAgTWFjT1MuU2V0Q3JlYXRvckFuZFR5cGUoc2VsZi5wYXRobmFtZSwgJ1B5dGgnLCAnVEVYVCcpCisKKyAgICAgICAgZnAud3JpdGUoJyIiIlN1aXRlICVzOiAlc1xuJyAlIChhc2NpaShuYW1lKSwgYXNjaWkoZGVzYykpKQorICAgICAgICBmcC53cml0ZSgiTGV2ZWwgJWQsIHZlcnNpb24gJWRcblxuIiAlIChsZXZlbCwgdmVyc2lvbikpCisgICAgICAgIGZwLndyaXRlKCJHZW5lcmF0ZWQgZnJvbSAlc1xuIiVhc2NpaShmbmFtZSkpCisgICAgICAgIGZwLndyaXRlKCJBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAlZC8lZCwgbGFuZ3VhZ2UgJWQsIHNjcmlwdCAlZFxuIiAlIFwKKyAgICAgICAgICAgIChtYWpvciwgbWlub3IsIGxhbmd1YWdlLCBzY3JpcHQpKQorICAgICAgICBmcC53cml0ZSgnIiIiXG5cbicpCisKKyAgICAgICAgZnAud3JpdGUoJ2ltcG9ydCBhZXRvb2xzXG4nKQorICAgICAgICBmcC53cml0ZSgnaW1wb3J0IE1hY09TXG5cbicpCisgICAgICAgIGZwLndyaXRlKCJfY29kZSA9ICVyXG5cbiIlIChjb2RlLCkpCisgICAgICAgIGlmIHNlbGYuYmFzZXBhY2thZ2UgYW5kIGNvZGUgaW4gc2VsZi5iYXNlcGFja2FnZS5fY29kZV90b19tb2R1bGU6CisgICAgICAgICAgICAjIFdlIGFyZSBhbiBleHRlbnNpb24gb2YgYSBiYXNlY2xhc3MgKHVzdWFsbHkgYW4gYXBwbGljYXRpb24gZXh0ZW5kaW5nCisgICAgICAgICAgICAjIFN0YW5kYXJkX1N1aXRlIG9yIHNvKS4gSW1wb3J0IGV2ZXJ5dGhpbmcgZnJvbSBvdXIgYmFzZSBtb2R1bGUKKyAgICAgICAgICAgIGZwLndyaXRlKCdmcm9tICVzIGltcG9ydCAqXG4nJXNlbGYuYmFzZXBhY2thZ2UuX2NvZGVfdG9fZnVsbG5hbWVbY29kZV1bMF0pCisgICAgICAgICAgICBiYXNlbW9kdWxlID0gc2VsZi5iYXNlcGFja2FnZS5fY29kZV90b19tb2R1bGVbY29kZV0KKyAgICAgICAgZWxpZiBzZWxmLmJhc2VwYWNrYWdlIGFuZCBjb2RlLmxvd2VyKCkgaW4gc2VsZi5iYXNlcGFja2FnZS5fY29kZV90b19tb2R1bGU6CisgICAgICAgICAgICAjIFRoaXMgaXMgbmVlZGVkIGJ5IENvZGVXYXJyaW9yIGFuZCBzb21lIG90aGVycy4KKyAgICAgICAgICAgIGZwLndyaXRlKCdmcm9tICVzIGltcG9ydCAqXG4nJXNlbGYuYmFzZXBhY2thZ2UuX2NvZGVfdG9fZnVsbG5hbWVbY29kZS5sb3dlcigpXVswXSkKKyAgICAgICAgICAgIGJhc2Vtb2R1bGUgPSBzZWxmLmJhc2VwYWNrYWdlLl9jb2RlX3RvX21vZHVsZVtjb2RlLmxvd2VyKCldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlIGFyZSBub3QgYW4gZXh0ZW5zaW9uLgorICAgICAgICAgICAgYmFzZW1vZHVsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5iYXNlbW9kdWxlID0gYmFzZW1vZHVsZQorICAgICAgICBzZWxmLmNvbXBpbGVjbGFzc2hlYWRlcigpCisKKyAgICAgICAgc2VsZi5lbnVtc25lZWRlZCA9IHt9CisgICAgICAgIGlmIGV2ZW50czoKKyAgICAgICAgICAgIGZvciBldmVudCBpbiBldmVudHM6CisgICAgICAgICAgICAgICAgc2VsZi5jb21waWxlZXZlbnQoZXZlbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmcC53cml0ZSgiICAgIHBhc3NcblxuIikKKworICAgICAgICBvYmpjID0gT2JqZWN0Q29tcGlsZXIoZnAsIHNlbGYubW9kbmFtZSwgYmFzZW1vZHVsZSwgcHJlY29tcGluZm8sIGludGVyYWN0PShzZWxmLmVkaXRfbW9kbmFtZXMgaXMgTm9uZSksCisgICAgICAgICAgICB2ZXJib3NlPXNlbGYudmVyYm9zZSkKKyAgICAgICAgZm9yIGNscyBpbiBjbGFzc2VzOgorICAgICAgICAgICAgb2JqYy5jb21waWxlY2xhc3MoY2xzKQorICAgICAgICBmb3IgY2xzIGluIGNsYXNzZXM6CisgICAgICAgICAgICBvYmpjLmZpbGxjbGFzc3Byb3BzYW5kZWxlbXMoY2xzKQorICAgICAgICBmb3IgY29tcCBpbiBjb21wczoKKyAgICAgICAgICAgIG9iamMuY29tcGlsZWNvbXBhcmlzb24oY29tcCkKKyAgICAgICAgZm9yIGVudW0gaW4gZW51bXM6CisgICAgICAgICAgICBvYmpjLmNvbXBpbGVlbnVtZXJhdGlvbihlbnVtKQorCisgICAgICAgIGZvciBlbnVtIGluIHNlbGYuZW51bXNuZWVkZWQua2V5cygpOgorICAgICAgICAgICAgb2JqYy5jaGVja2ZvcmVudW0oZW51bSkKKworICAgICAgICBvYmpjLmR1bXBpbmRleCgpCisKKyAgICBkZWYgY29tcGlsZWNsYXNzaGVhZGVyKHNlbGYpOgorICAgICAgICAiIiJHZW5lcmF0ZSBjbGFzcyBib2lsZXJwbGF0ZSIiIgorICAgICAgICBjbGFzc25hbWUgPSAnJXNfRXZlbnRzJyVzZWxmLm1vZG5hbWUKKyAgICAgICAgaWYgc2VsZi5iYXNlbW9kdWxlOgorICAgICAgICAgICAgbW9kc2hvcnRuYW1lID0gc3RyaW5nLnNwbGl0KHNlbGYuYmFzZW1vZHVsZS5fX25hbWVfXywgJy4nKVstMV0KKyAgICAgICAgICAgIGJhc2VjbGFzc25hbWUgPSAnJXNfRXZlbnRzJyVtb2RzaG9ydG5hbWUKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoImNsYXNzICVzKCVzKTpcblxuIiUoY2xhc3NuYW1lLCBiYXNlY2xhc3NuYW1lKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoImNsYXNzICVzOlxuXG4iJWNsYXNzbmFtZSkKKworICAgIGRlZiBjb21waWxlZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiJHZW5lcmF0ZSBjb2RlIGZvciBhIHNpbmdsZSBldmVudCIiIgorICAgICAgICBbbmFtZSwgZGVzYywgY29kZSwgc3ViY29kZSwgcmV0dXJucywgYWNjZXB0cywgYXJndW1lbnRzXSA9IGV2ZW50CisgICAgICAgIGZwID0gc2VsZi5mcAorICAgICAgICBmdW5jbmFtZSA9IGlkZW50aWZ5KG5hbWUpCisgICAgICAgICMKKyAgICAgICAgIyBnZW5lcmF0ZSBuYW1lLT5rZXl3b3JkIG1hcAorICAgICAgICAjCisgICAgICAgIGlmIGFyZ3VtZW50czoKKyAgICAgICAgICAgIGZwLndyaXRlKCIgICAgX2FyZ21hcF8lcyA9IHtcbiIlZnVuY25hbWUpCisgICAgICAgICAgICBmb3IgYSBpbiBhcmd1bWVudHM6CisgICAgICAgICAgICAgICAgZnAud3JpdGUoIiAgICAgICAgJXIgOiAlcixcbiIlKGlkZW50aWZ5KGFbMF0pLCBhWzFdKSkKKyAgICAgICAgICAgIGZwLndyaXRlKCIgICAgfVxuXG4iKQorCisgICAgICAgICMKKyAgICAgICAgIyBHZW5lcmF0ZSBmdW5jdGlvbiBoZWFkZXIKKyAgICAgICAgIworICAgICAgICBoYXNfYXJnID0gKG5vdCBpc19udWxsKGFjY2VwdHMpKQorICAgICAgICBvcHRfYXJnID0gKGhhc19hcmcgYW5kIGlzX29wdGlvbmFsKGFjY2VwdHMpKQorCisgICAgICAgIGZwLndyaXRlKCIgICAgZGVmICVzKHNlbGYsICIlZnVuY25hbWUpCisgICAgICAgIGlmIGhhc19hcmc6CisgICAgICAgICAgICBpZiBub3Qgb3B0X2FyZzoKKyAgICAgICAgICAgICAgICBmcC53cml0ZSgiX29iamVjdCwgIikgICAgICAgIyBJbmNsdWRlIGRpcmVjdCBvYmplY3QsIGlmIGl0IGhhcyBvbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZnAud3JpdGUoIl9vYmplY3Q9Tm9uZSwgIikgICMgQWxzbyBpbmNsdWRlIGlmIGl0IGlzIG9wdGlvbmFsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmcC53cml0ZSgiX25vX29iamVjdD1Ob25lLCAiKSAgICMgRm9yIGFyZ3VtZW50IGNoZWNraW5nCisgICAgICAgIGZwLndyaXRlKCJfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKTpcbiIpICAgICMgaW5jbHVkZSBhdHRyaWJ1dGUgZGljdCBhbmQgYXJncworICAgICAgICAjCisgICAgICAgICMgR2VuZXJhdGUgZG9jIHN0cmluZyAoaW1wb3J0YW50LCBzaW5jZSBpdCBtYXkgYmUgdGhlIG9ubHkKKyAgICAgICAgIyBhdmFpbGFibGUgZG9jdW1lbnRhdGlvbiwgZHVlIHRvIG91ciBuYW1lLXJlbWFwaW5nKQorICAgICAgICAjCisgICAgICAgIGZwLndyaXRlKCcgICAgICAgICIiIiVzOiAlc1xuJyUoYXNjaWkobmFtZSksIGFzY2lpKGRlc2MpKSkKKyAgICAgICAgaWYgaGFzX2FyZzoKKyAgICAgICAgICAgIGZwLndyaXRlKCIgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiAlc1xuIiVnZXRkYXRhZG9jKGFjY2VwdHMpKQorICAgICAgICBlbGlmIG9wdF9hcmc6CisgICAgICAgICAgICBmcC53cml0ZSgiICAgICAgICBPcHRpb25hbCBhcmd1bWVudDogJXNcbiIlZ2V0ZGF0YWRvYyhhY2NlcHRzKSkKKyAgICAgICAgZm9yIGFyZyBpbiBhcmd1bWVudHM6CisgICAgICAgICAgICBmcC53cml0ZSgiICAgICAgICBLZXl3b3JkIGFyZ3VtZW50ICVzOiAlc1xuIiUoaWRlbnRpZnkoYXJnWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0ZGF0YWRvYyhhcmdbMl0pKSkKKyAgICAgICAgZnAud3JpdGUoIiAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeVxuIikKKyAgICAgICAgaWYgbm90IGlzX251bGwocmV0dXJucyk6CisgICAgICAgICAgICBmcC53cml0ZSgiICAgICAgICBSZXR1cm5zOiAlc1xuIiVnZXRkYXRhZG9jKHJldHVybnMpKQorICAgICAgICBmcC53cml0ZSgnICAgICAgICAiIiJcbicpCisgICAgICAgICMKKyAgICAgICAgIyBGaWRkbGUgdGhlIGFyZ3Mgc28gZXZlcnl0aGluZyBlbmRzIHVwIGluICdhcmd1bWVudHMnIGRpY3Rpb25hcnkKKyAgICAgICAgIworICAgICAgICBmcC53cml0ZSgiICAgICAgICBfY29kZSA9ICVyXG4iJSAoY29kZSwpKQorICAgICAgICBmcC53cml0ZSgiICAgICAgICBfc3ViY29kZSA9ICVyXG5cbiIlIChzdWJjb2RlLCkpCisgICAgICAgICMKKyAgICAgICAgIyBEbyBrZXl3b3JkIG5hbWUgc3Vic3RpdHV0aW9uCisgICAgICAgICMKKyAgICAgICAgaWYgYXJndW1lbnRzOgorICAgICAgICAgICAgZnAud3JpdGUoIiAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfJXMpXG4iJWZ1bmNuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnAud3JpdGUoIiAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCdcbiIpCisgICAgICAgICMKKyAgICAgICAgIyBTdHVmZiByZXF1aXJlZCBhcmcgKGlmIHRoZXJlIGlzIG9uZSkgaW50byBhcmd1bWVudHMKKyAgICAgICAgIworICAgICAgICBpZiBoYXNfYXJnOgorICAgICAgICAgICAgZnAud3JpdGUoIiAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdFxuIikKKyAgICAgICAgZWxpZiBvcHRfYXJnOgorICAgICAgICAgICAgZnAud3JpdGUoIiAgICAgICAgaWYgX29iamVjdDpcbiIpCisgICAgICAgICAgICBmcC53cml0ZSgiICAgICAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdFxuIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZwLndyaXRlKCIgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnXG4iKQorICAgICAgICBmcC53cml0ZSgiXG4iKQorICAgICAgICAjCisgICAgICAgICMgRG8gZW51bS1uYW1lIHN1YnN0aXR1dGlvbgorICAgICAgICAjCisgICAgICAgIGZvciBhIGluIGFyZ3VtZW50czoKKyAgICAgICAgICAgIGlmIGlzX2VudW0oYVsyXSk6CisgICAgICAgICAgICAgICAga25hbWUgPSBhWzFdCisgICAgICAgICAgICAgICAgZW5hbWUgPSBhWzJdWzBdCisgICAgICAgICAgICAgICAgaWYgZW5hbWUgIT0gJyoqKionOgorICAgICAgICAgICAgICAgICAgICBmcC53cml0ZSgiICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAlciwgX0VudW1fJXMpXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgIChrbmFtZSwgaWRlbnRpZnkoZW5hbWUpKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnVtc25lZWRlZFtlbmFtZV0gPSAxCisgICAgICAgIGZwLndyaXRlKCJcbiIpCisgICAgICAgICMKKyAgICAgICAgIyBEbyB0aGUgdHJhbnNhY3Rpb24KKyAgICAgICAgIworICAgICAgICBmcC53cml0ZSgiICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSxcbiIpCisgICAgICAgIGZwLndyaXRlKCIgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpXG4iKQorICAgICAgICAjCisgICAgICAgICMgRXJyb3IgaGFuZGxpbmcKKyAgICAgICAgIworICAgICAgICBmcC53cml0ZSgiICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOlxuIikKKyAgICAgICAgZnAud3JpdGUoIiAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cylcbiIpCisgICAgICAgIGZwLndyaXRlKCIgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHRcbiIpCisgICAgICAgICMKKyAgICAgICAgIyBEZWNvZGUgcmVzdWx0CisgICAgICAgICMKKyAgICAgICAgZnAud3JpdGUoIiAgICAgICAgaWYgJy0tLS0nIGluIF9hcmd1bWVudHM6XG4iKQorICAgICAgICBpZiBpc19lbnVtKHJldHVybnMpOgorICAgICAgICAgICAgZnAud3JpdGUoIiAgICAgICAgICAgICMgWFhYWCBTaG91bGQgZG8gZW51bSByZW1hcHBpbmcgaGVyZS4uLlxuIikKKyAgICAgICAgZnAud3JpdGUoIiAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ11cbiIpCisgICAgICAgIGZwLndyaXRlKCJcbiIpCisKKyAgICBkZWYgZmluZGVudW1zaW5ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgICIiIkZpbmQgYWxsIGVudW1zIGZvciBhIHNpbmdsZSBldmVudCIiIgorICAgICAgICBbbmFtZSwgZGVzYywgY29kZSwgc3ViY29kZSwgcmV0dXJucywgYWNjZXB0cywgYXJndW1lbnRzXSA9IGV2ZW50CisgICAgICAgIGZvciBhIGluIGFyZ3VtZW50czoKKyAgICAgICAgICAgIGlmIGlzX2VudW0oYVsyXSk6CisgICAgICAgICAgICAgICAgZW5hbWUgPSBhWzJdWzBdCisgICAgICAgICAgICAgICAgaWYgZW5hbWUgIT0gJyoqKionOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVudW1zbmVlZGVkW2VuYW1lXSA9IDEKKworIworIyBUaGlzIGNsYXNzIHN0b3JlcyB0aGUgY29kZTwtPm5hbWUgdHJhbnNsYXRpb25zIGZvciBhIHNpbmdsZSBtb2R1bGUuIEl0IGlzIHVzZWQKKyMgdG8ga2VlcCB0aGUgaW5mb3JtYXRpb24gd2hpbGUgd2UncmUgY29tcGlsaW5nIHRoZSBtb2R1bGUsIGJ1dCB3ZSBhbHNvIGtlZXAgdGhlc2Ugb2JqZWN0cworIyBhcm91bmQgc28gaWYgb25lIHN1aXRlIHJlZmVycyB0bywgc2F5LCBhbiBlbnVtIGluIGFub3RoZXIgc3VpdGUgd2Uga25vdyB3aGVyZSB0bworIyBmaW5kIGl0LiBGaW5hbGx5LCBpZiB3ZSByZWFsbHkgY2FuJ3QgZmluZCBhIGNvZGUsIHRoZSB1c2VyIGNhbiBhZGQgbW9kdWxlcyBieQorIyBoYW5kLgorIworY2xhc3MgQ29kZU5hbWVNYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW50ZXJhY3Q9MSwgdmVyYm9zZT1Ob25lKToKKyAgICAgICAgc2VsZi5jb2RlMm5hbWUgPSB7CisgICAgICAgICAgICAicHJvcGVydHkiIDoge30sCisgICAgICAgICAgICAiY2xhc3MiIDoge30sCisgICAgICAgICAgICAiZW51bSIgOiB7fSwKKyAgICAgICAgICAgICJjb21wYXJpc29uIiA6IHt9LAorICAgICAgICB9CisgICAgICAgIHNlbGYubmFtZTJjb2RlID0gIHsKKyAgICAgICAgICAgICJwcm9wZXJ0eSIgOiB7fSwKKyAgICAgICAgICAgICJjbGFzcyIgOiB7fSwKKyAgICAgICAgICAgICJlbnVtIiA6IHt9LAorICAgICAgICAgICAgImNvbXBhcmlzb24iIDoge30sCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5tb2R1bGVuYW1lID0gTm9uZQorICAgICAgICBzZWxmLnN0YXJfaW1wb3J0ZWQgPSAwCisgICAgICAgIHNlbGYuY2FuX2ludGVyYWN0ID0gaW50ZXJhY3QKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorCisgICAgZGVmIGFkZG5hbWVjb2RlKHNlbGYsIHR5cGUsIG5hbWUsIGNvZGUpOgorICAgICAgICBzZWxmLm5hbWUyY29kZVt0eXBlXVtuYW1lXSA9IGNvZGUKKyAgICAgICAgaWYgY29kZSBub3QgaW4gc2VsZi5jb2RlMm5hbWVbdHlwZV06CisgICAgICAgICAgICBzZWxmLmNvZGUybmFtZVt0eXBlXVtjb2RlXSA9IG5hbWUKKworICAgIGRlZiBoYXNuYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBmb3IgZGljdCBpbiBzZWxmLm5hbWUyY29kZS52YWx1ZXMoKToKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gZGljdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBoYXNjb2RlKHNlbGYsIHR5cGUsIGNvZGUpOgorICAgICAgICByZXR1cm4gY29kZSBpbiBzZWxmLmNvZGUybmFtZVt0eXBlXQorCisgICAgZGVmIGZpbmRjb2RlbmFtZShzZWxmLCB0eXBlLCBjb2RlKToKKyAgICAgICAgaWYgbm90IHNlbGYuaGFzY29kZSh0eXBlLCBjb2RlKToKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lLCBOb25lCisgICAgICAgIG5hbWUgPSBzZWxmLmNvZGUybmFtZVt0eXBlXVtjb2RlXQorICAgICAgICBpZiBzZWxmLm1vZHVsZW5hbWUgYW5kIG5vdCBzZWxmLnN0YXJfaW1wb3J0ZWQ6CisgICAgICAgICAgICBxdWFsbmFtZSA9ICclcy4lcyclKHNlbGYubW9kdWxlbmFtZSwgbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHF1YWxuYW1lID0gbmFtZQorICAgICAgICByZXR1cm4gbmFtZSwgcXVhbG5hbWUsIHNlbGYubW9kdWxlbmFtZQorCisgICAgZGVmIGdldGFsbChzZWxmLCB0eXBlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29kZTJuYW1lW3R5cGVdLml0ZW1zKCkKKworICAgIGRlZiBhZGRtb2R1bGUoc2VsZiwgbW9kdWxlLCBuYW1lLCBzdGFyX2ltcG9ydGVkKToKKyAgICAgICAgc2VsZi5tb2R1bGVuYW1lID0gbmFtZQorICAgICAgICBzZWxmLnN0YXJfaW1wb3J0ZWQgPSBzdGFyX2ltcG9ydGVkCisgICAgICAgIGZvciBjb2RlLCBuYW1lIGluIG1vZHVsZS5fcHJvcGRlY2xhcmF0aW9ucy5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hZGRuYW1lY29kZSgncHJvcGVydHknLCBuYW1lLCBjb2RlKQorICAgICAgICBmb3IgY29kZSwgbmFtZSBpbiBtb2R1bGUuX2NsYXNzZGVjbGFyYXRpb25zLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFkZG5hbWVjb2RlKCdjbGFzcycsIG5hbWUsIGNvZGUpCisgICAgICAgIGZvciBjb2RlIGluIG1vZHVsZS5fZW51bWRlY2xhcmF0aW9ucy5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLmFkZG5hbWVjb2RlKCdlbnVtJywgJ19FbnVtXycraWRlbnRpZnkoY29kZSksIGNvZGUpCisgICAgICAgIGZvciBjb2RlLCBuYW1lIGluIG1vZHVsZS5fY29tcGRlY2xhcmF0aW9ucy5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hZGRuYW1lY29kZSgnY29tcGFyaXNvbicsIG5hbWUsIGNvZGUpCisKKyAgICBkZWYgcHJlcGFyZWZvcmV4cG9ydChzZWxmLCBuYW1lPU5vbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5tb2R1bGVuYW1lOgorICAgICAgICAgICAgc2VsZi5tb2R1bGVuYW1lID0gbmFtZQorICAgICAgICByZXR1cm4gc2VsZgorCitjbGFzcyBPYmplY3RDb21waWxlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnAsIG1vZG5hbWUsIGJhc2VzdWl0ZSwgb3RoZXJuYW1lbWFwcGVycz1Ob25lLCBpbnRlcmFjdD0xLAorICAgICAgICAgICAgdmVyYm9zZT1Ob25lKToKKyAgICAgICAgc2VsZi5mcCA9IGZwCisgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgc2VsZi5iYXNlc3VpdGUgPSBiYXNlc3VpdGUKKyAgICAgICAgc2VsZi5jYW5faW50ZXJhY3QgPSBpbnRlcmFjdAorICAgICAgICBzZWxmLm1vZHVsZW5hbWUgPSBtb2RuYW1lCisgICAgICAgIHNlbGYubmFtZW1hcHBlcnMgPSBbQ29kZU5hbWVNYXBwZXIoc2VsZi5jYW5faW50ZXJhY3QsIHNlbGYudmVyYm9zZSldCisgICAgICAgIGlmIG90aGVybmFtZW1hcHBlcnM6CisgICAgICAgICAgICBzZWxmLm90aGVybmFtZW1hcHBlcnMgPSBvdGhlcm5hbWVtYXBwZXJzWzpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm90aGVybmFtZW1hcHBlcnMgPSBbXQorICAgICAgICBpZiBiYXNlc3VpdGU6CisgICAgICAgICAgICBiYXNlbWFwcGVyID0gQ29kZU5hbWVNYXBwZXIoc2VsZi5jYW5faW50ZXJhY3QsIHNlbGYudmVyYm9zZSkKKyAgICAgICAgICAgIGJhc2VtYXBwZXIuYWRkbW9kdWxlKGJhc2VzdWl0ZSwgJycsIDEpCisgICAgICAgICAgICBzZWxmLm5hbWVtYXBwZXJzLmFwcGVuZChiYXNlbWFwcGVyKQorCisgICAgZGVmIGdldHByZWNvbXBpbmZvKHNlbGYsIG1vZG5hbWUpOgorICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgZm9yIG1hcHBlciBpbiBzZWxmLm5hbWVtYXBwZXJzOgorICAgICAgICAgICAgZW1hcHBlciA9IG1hcHBlci5wcmVwYXJlZm9yZXhwb3J0KG1vZG5hbWUpCisgICAgICAgICAgICBpZiBlbWFwcGVyOgorICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKGVtYXBwZXIpCisgICAgICAgIHJldHVybiBsaXN0CisKKyAgICBkZWYgZmluZGNvZGVuYW1lKHNlbGYsIHR5cGUsIGNvZGUpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgIyBGaXJzdCB0cnk6IGNoZWNrIHdoZXRoZXIgd2UgYWxyZWFkeSBrbm93IGFib3V0IHRoaXMgY29kZS4KKyAgICAgICAgICAgIGZvciBtYXBwZXIgaW4gc2VsZi5uYW1lbWFwcGVyczoKKyAgICAgICAgICAgICAgICBpZiBtYXBwZXIuaGFzY29kZSh0eXBlLCBjb2RlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcHBlci5maW5kY29kZW5hbWUodHlwZSwgY29kZSkKKyAgICAgICAgICAgICMgU2Vjb25kIHRyeTogbWF5YmUgb25lIG9mIHRoZSBvdGhlciBtb2R1bGVzIGtub3dzIGFib3V0IGl0LgorICAgICAgICAgICAgZm9yIG1hcHBlciBpbiBzZWxmLm90aGVybmFtZW1hcHBlcnM6CisgICAgICAgICAgICAgICAgaWYgbWFwcGVyLmhhc2NvZGUodHlwZSwgY29kZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYub3RoZXJuYW1lbWFwcGVycy5yZW1vdmUobWFwcGVyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWVtYXBwZXJzLmFwcGVuZChtYXBwZXIpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZnA6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCJpbXBvcnQgJXNcbiIlbWFwcGVyLm1vZHVsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgSWYgYWxsIHRoaXMgaGFzIGZhaWxlZCB3ZSBhc2sgdGhlIHVzZXIgZm9yIGEgZ3Vlc3Mgb24gd2hlcmUgaXQgY291bGQKKyAgICAgICAgICAgICAgICAjIGJlIGFuZCByZXRyeS4KKyAgICAgICAgICAgICAgICBpZiBzZWxmLmZwOgorICAgICAgICAgICAgICAgICAgICBtID0gc2VsZi5hc2tkZWZpbml0aW9ubW9kdWxlKHR5cGUsIGNvZGUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbSA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBub3QgbTogcmV0dXJuIE5vbmUsIE5vbmUsIE5vbmUKKyAgICAgICAgICAgICAgICBtYXBwZXIgPSBDb2RlTmFtZU1hcHBlcihzZWxmLmNhbl9pbnRlcmFjdCwgc2VsZi52ZXJib3NlKQorICAgICAgICAgICAgICAgIG1hcHBlci5hZGRtb2R1bGUobSwgbS5fX25hbWVfXywgMCkKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWVtYXBwZXJzLmFwcGVuZChtYXBwZXIpCisKKyAgICBkZWYgaGFzbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgZm9yIG1hcHBlciBpbiBzZWxmLm90aGVybmFtZW1hcHBlcnM6CisgICAgICAgICAgICBpZiBtYXBwZXIuaGFzbmFtZShuYW1lKSBhbmQgbWFwcGVyLm1vZHVsZW5hbWUgIT0gc2VsZi5tb2R1bGVuYW1lOgorICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnZlcmJvc2UsICJEdXBsaWNhdGUgUHl0aG9uIGlkZW50aWZpZXI6IiwgbmFtZSwgc2VsZi5tb2R1bGVuYW1lLCBtYXBwZXIubW9kdWxlbmFtZQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGFza2RlZmluaXRpb25tb2R1bGUoc2VsZiwgdHlwZSwgY29kZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmNhbl9pbnRlcmFjdDoKKyAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYudmVyYm9zZSwgIioqIE5vIGRlZmluaXRpb24gZm9yICVzICclcycgZm91bmQiICUgKHR5cGUsIGNvZGUpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0nV2hlcmUgaXMgJXMgJXMgZGVjbGFyZWQ/JyUodHlwZSwgY29kZSkpCisgICAgICAgIGlmIG5vdCBwYXRoOiByZXR1cm4KKyAgICAgICAgcGF0aCwgZmlsZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKKyAgICAgICAgbW9kbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoZmlsZSlbMF0KKyAgICAgICAgaWYgbm90IHBhdGggaW4gc3lzLnBhdGg6CisgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcGF0aCkKKyAgICAgICAgbSA9IF9faW1wb3J0X18obW9kbmFtZSkKKyAgICAgICAgc2VsZi5mcC53cml0ZSgiaW1wb3J0ICVzXG4iJW1vZG5hbWUpCisgICAgICAgIHJldHVybiBtCisKKyAgICBkZWYgY29tcGlsZWNsYXNzKHNlbGYsIGNscyk6CisgICAgICAgIFtuYW1lLCBjb2RlLCBkZXNjLCBwcm9wZXJ0aWVzLCBlbGVtZW50c10gPSBjbHMKKyAgICAgICAgcG5hbWUgPSBpZGVudGlmeShuYW1lKQorICAgICAgICBpZiBzZWxmLm5hbWVtYXBwZXJzWzBdLmhhc2NvZGUoJ2NsYXNzJywgY29kZSk6CisgICAgICAgICAgICAjIHBsdXJhbCBmb3JtcyBhbmQgc3VjaAorICAgICAgICAgICAgb3RoZXJuYW1lLCBkdW1teSwgZHVtbXkgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmZpbmRjb2RlbmFtZSgnY2xhc3MnLCBjb2RlKQorICAgICAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCJcbiVzID0gJXNcbiIlKHBuYW1lLCBvdGhlcm5hbWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCdcbmNsYXNzICVzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6XG4nICUgcG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnICAgICIiIiVzIC0gJXMgIiIiXG4nICUgKGFzY2lpKG5hbWUpLCBhc2NpaShkZXNjKSkpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnICAgIHdhbnQgPSAlclxuJyAlIChjb2RlLCkpCisgICAgICAgIHNlbGYubmFtZW1hcHBlcnNbMF0uYWRkbmFtZWNvZGUoJ2NsYXNzJywgcG5hbWUsIGNvZGUpCisgICAgICAgIGlzX2FwcGxpY2F0aW9uX2NsYXNzID0gKGNvZGUgPT0gJ2NhcHAnKQorICAgICAgICBwcm9wZXJ0aWVzLnNvcnQoKQorICAgICAgICBmb3IgcHJvcCBpbiBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgc2VsZi5jb21waWxlcHJvcGVydHkocHJvcCwgaXNfYXBwbGljYXRpb25fY2xhc3MpCisgICAgICAgIGVsZW1lbnRzLnNvcnQoKQorICAgICAgICBmb3IgZWxlbSBpbiBlbGVtZW50czoKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZWVsZW1lbnQoZWxlbSkKKworICAgIGRlZiBjb21waWxlcHJvcGVydHkoc2VsZiwgcHJvcCwgaXNfYXBwbGljYXRpb25fY2xhc3M9RmFsc2UpOgorICAgICAgICBbbmFtZSwgY29kZSwgd2hhdF0gPSBwcm9wCisgICAgICAgIGlmIGNvZGUgPT0gJ2NAIyEnOgorICAgICAgICAgICAgIyBTb21ldGhpbmcgc2lsbHkgd2l0aCBwbHVyYWxzLiBTa2lwIGl0LgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHBuYW1lID0gaWRlbnRpZnkobmFtZSkKKyAgICAgICAgaWYgc2VsZi5uYW1lbWFwcGVyc1swXS5oYXNjb2RlKCdwcm9wZXJ0eScsIGNvZGUpOgorICAgICAgICAgICAgIyBwbHVyYWwgZm9ybXMgYW5kIHN1Y2gKKyAgICAgICAgICAgIG90aGVybmFtZSwgZHVtbXksIGR1bW15ID0gc2VsZi5uYW1lbWFwcGVyc1swXS5maW5kY29kZW5hbWUoJ3Byb3BlcnR5JywgY29kZSkKKyAgICAgICAgICAgIGlmIHBuYW1lID09IG90aGVybmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHNlbGYuZnA6CisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiXG5fUHJvcF8lcyA9IF9Qcm9wXyVzXG4iJShwbmFtZSwgb3RoZXJuYW1lKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuZnA6CisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiY2xhc3MgX1Byb3BfJXMoYWV0b29scy5OUHJvcGVydHkpOlxuIiAlIHBuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoJyAgICAiIiIlcyAtICVzICIiIlxuJyAlIChhc2NpaShuYW1lKSwgYXNjaWkod2hhdFsxXSkpKQorICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiAgICB3aGljaCA9ICVyXG4iICUgKGNvZGUsKSkKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCIgICAgd2FudCA9ICVyXG4iICUgKHdoYXRbMF0sKSkKKyAgICAgICAgc2VsZi5uYW1lbWFwcGVyc1swXS5hZGRuYW1lY29kZSgncHJvcGVydHknLCBwbmFtZSwgY29kZSkKKyAgICAgICAgaWYgaXNfYXBwbGljYXRpb25fY2xhc3MgYW5kIHNlbGYuZnA6CisgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCIlcyA9IF9Qcm9wXyVzKClcbiIgJSAocG5hbWUsIHBuYW1lKSkKKworICAgIGRlZiBjb21waWxlZWxlbWVudChzZWxmLCBlbGVtKToKKyAgICAgICAgW2NvZGUsIGtleWZvcm1dID0gZWxlbQorICAgICAgICBpZiBzZWxmLmZwOgorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiIyAgICAgICAgZWxlbWVudCAlciBhcyAlc1xuIiAlIChjb2RlLCBrZXlmb3JtKSkKKworICAgIGRlZiBmaWxsY2xhc3Nwcm9wc2FuZGVsZW1zKHNlbGYsIGNscyk6CisgICAgICAgIFtuYW1lLCBjb2RlLCBkZXNjLCBwcm9wZXJ0aWVzLCBlbGVtZW50c10gPSBjbHMKKyAgICAgICAgY25hbWUgPSBpZGVudGlmeShuYW1lKQorICAgICAgICBpZiBzZWxmLm5hbWVtYXBwZXJzWzBdLmhhc2NvZGUoJ2NsYXNzJywgY29kZSkgYW5kIFwKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWVtYXBwZXJzWzBdLmZpbmRjb2RlbmFtZSgnY2xhc3MnLCBjb2RlKVswXSAhPSBjbmFtZToKKyAgICAgICAgICAgICMgVGhpcyBpcyBhbiBvdGhlciBuYW1lIChwbHVyYWwgb3Igc28pIGZvciBzb21ldGhpbmcgZWxzZS4gU2tpcC4KKyAgICAgICAgICAgIGlmIHNlbGYuZnAgYW5kIChlbGVtZW50cyBvciBsZW4ocHJvcGVydGllcykgPiAxIG9yIChsZW4ocHJvcGVydGllcykgPT0gMSBhbmQKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzWzBdWzFdICE9ICdjQCMhJykpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnZlcmJvc2UsICcqKiBTa2lwIG11bHRpcGxlICVzIG9mICVzIChjb2RlICVyKScgJSAoY25hbWUsIHNlbGYubmFtZW1hcHBlcnNbMF0uZmluZGNvZGVuYW1lKCdjbGFzcycsIGNvZGUpWzBdLCBjb2RlKQorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkFib3V0IHRvIHNraXAgbm9uLWVtcHR5IGNsYXNzIgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHBsaXN0ID0gW10KKyAgICAgICAgZWxpc3QgPSBbXQorICAgICAgICBzdXBlcmNsYXNzZXMgPSBbXQorICAgICAgICBmb3IgcHJvcCBpbiBwcm9wZXJ0aWVzOgorICAgICAgICAgICAgW3BuYW1lLCBwY29kZSwgd2hhdF0gPSBwcm9wCisgICAgICAgICAgICBpZiBwY29kZSA9PSAiY0AjXiI6CisgICAgICAgICAgICAgICAgc3VwZXJjbGFzc2VzLmFwcGVuZCh3aGF0KQorICAgICAgICAgICAgaWYgcGNvZGUgPT0gJ2NAIyEnOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBwbmFtZSA9IGlkZW50aWZ5KHBuYW1lKQorICAgICAgICAgICAgcGxpc3QuYXBwZW5kKHBuYW1lKQorCisgICAgICAgIHN1cGVyY2xhc3NuYW1lcyA9IFtdCisgICAgICAgIGZvciBzdXBlcmNsYXNzIGluIHN1cGVyY2xhc3NlczoKKyAgICAgICAgICAgIHN1cGVySWQsIHN1cGVyRGVzYywgZHVtbXkgPSBzdXBlcmNsYXNzCisgICAgICAgICAgICBzdXBlcmNsYXNzbmFtZSwgZnVsbHlxdWFsaWZpZWRuYW1lLCBtb2R1bGUgPSBzZWxmLmZpbmRjb2RlbmFtZSgiY2xhc3MiLCBzdXBlcklkKQorICAgICAgICAgICAgIyBJIGRvbid0IHRoaW5rIHRoaXMgaXMgY29ycmVjdDoKKyAgICAgICAgICAgIGlmIHN1cGVyY2xhc3NuYW1lID09IGNuYW1lOgorICAgICAgICAgICAgICAgIHBhc3MgIyBzdXBlcmNsYXNzbmFtZXMuYXBwZW5kKGZ1bGx5cXVhbGlmaWVkbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3VwZXJjbGFzc25hbWVzLmFwcGVuZChzdXBlcmNsYXNzbmFtZSkKKworICAgICAgICBpZiBzZWxmLmZwOgorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiJXMuX3N1cGVyY2xhc3NuYW1lcyA9ICVyXG4iJShjbmFtZSwgc3VwZXJjbGFzc25hbWVzKSkKKworICAgICAgICBmb3IgZWxlbSBpbiBlbGVtZW50czoKKyAgICAgICAgICAgIFtlY29kZSwga2V5Zm9ybV0gPSBlbGVtCisgICAgICAgICAgICBpZiBlY29kZSA9PSAnY0AjISc6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG5hbWUsIGVuYW1lLCBtb2R1bGUgPSBzZWxmLmZpbmRjb2RlbmFtZSgnY2xhc3MnLCBlY29kZSkKKyAgICAgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZnA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiMgWFhYWCAlcyBlbGVtZW50ICVyIG5vdCBmb3VuZCEhXG4iJShjbmFtZSwgZWNvZGUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbGlzdC5hcHBlbmQoKG5hbWUsIGVuYW1lKSkKKworICAgICAgICBwbGlzdC5zb3J0KCkKKyAgICAgICAgZWxpc3Quc29ydCgpCisKKyAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiVzLl9wcml2cHJvcGRpY3QgPSB7XG4iJWNuYW1lKQorICAgICAgICAgICAgZm9yIG4gaW4gcGxpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiICAgICclcycgOiBfUHJvcF8lcyxcbiIlKG4sIG4pKQorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgifVxuIikKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiVzLl9wcml2ZWxlbWRpY3QgPSB7XG4iJWNuYW1lKQorICAgICAgICAgICAgZm9yIG4sIGZ1bGxuIGluIGVsaXN0OgorICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiAgICAnJXMnIDogJXMsXG4iJShuLCBmdWxsbikpCisgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCJ9XG4iKQorCisgICAgZGVmIGNvbXBpbGVjb21wYXJpc29uKHNlbGYsIGNvbXApOgorICAgICAgICBbbmFtZSwgY29kZSwgY29tbWVudF0gPSBjb21wCisgICAgICAgIGluYW1lID0gaWRlbnRpZnkobmFtZSkKKyAgICAgICAgc2VsZi5uYW1lbWFwcGVyc1swXS5hZGRuYW1lY29kZSgnY29tcGFyaXNvbicsIGluYW1lLCBjb2RlKQorICAgICAgICBpZiBzZWxmLmZwOgorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiY2xhc3MgJXMoYWV0b29scy5OQ29tcGFyaXNvbik6XG4iICUgaW5hbWUpCisgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCcgICAgIiIiJXMgLSAlcyAiIiJcbicgJSAoYXNjaWkobmFtZSksIGFzY2lpKGNvbW1lbnQpKSkKKworICAgIGRlZiBjb21waWxlZW51bWVyYXRpb24oc2VsZiwgZW51bSk6CisgICAgICAgIFtjb2RlLCBpdGVtc10gPSBlbnVtCisgICAgICAgIG5hbWUgPSAiX0VudW1fJXMiICUgaWRlbnRpZnkoY29kZSkKKyAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiVzID0ge1xuIiAlIG5hbWUpCisgICAgICAgICAgICBmb3IgaXRlbSBpbiBpdGVtczoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBpbGVlbnVtZXJhdG9yKGl0ZW0pCisgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCJ9XG5cbiIpCisgICAgICAgIHNlbGYubmFtZW1hcHBlcnNbMF0uYWRkbmFtZWNvZGUoJ2VudW0nLCBuYW1lLCBjb2RlKQorICAgICAgICByZXR1cm4gY29kZQorCisgICAgZGVmIGNvbXBpbGVlbnVtZXJhdG9yKHNlbGYsIGl0ZW0pOgorICAgICAgICBbbmFtZSwgY29kZSwgZGVzY10gPSBpdGVtCisgICAgICAgIHNlbGYuZnAud3JpdGUoIiAgICAlciA6ICVyLFx0IyAlc1xuIiAlIChpZGVudGlmeShuYW1lKSwgY29kZSwgYXNjaWkoZGVzYykpKQorCisgICAgZGVmIGNoZWNrZm9yZW51bShzZWxmLCBlbnVtKToKKyAgICAgICAgIiIiVGhpcyBlbnVtIGNvZGUgaXMgdXNlZCBieSBhbiBldmVudC4gTWFrZSBzdXJlIGl0J3MgYXZhaWxhYmxlIiIiCisgICAgICAgIG5hbWUsIGZ1bGxuYW1lLCBtb2R1bGUgPSBzZWxmLmZpbmRjb2RlbmFtZSgnZW51bScsIGVudW0pCisgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCJfRW51bV8lcyA9IE5vbmUgIyBYWFhYIGVudW0gJXMgbm90IGZvdW5kISFcbiIlKGlkZW50aWZ5KGVudW0pLCBhc2NpaShlbnVtKSkpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbW9kdWxlOgorICAgICAgICAgICAgaWYgc2VsZi5mcDoKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKCJmcm9tICVzIGltcG9ydCAlc1xuIiUobW9kdWxlLCBuYW1lKSkKKworICAgIGRlZiBkdW1waW5kZXgoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmZwOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZnAud3JpdGUoIlxuI1xuIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlXG4jXG4iKQorCisgICAgICAgIHNlbGYuZnAud3JpdGUoIl9jbGFzc2RlY2xhcmF0aW9ucyA9IHtcbiIpCisgICAgICAgIGNsYXNzbGlzdCA9IHNlbGYubmFtZW1hcHBlcnNbMF0uZ2V0YWxsKCdjbGFzcycpCisgICAgICAgIGNsYXNzbGlzdC5zb3J0KCkKKyAgICAgICAgZm9yIGssIHYgaW4gY2xhc3NsaXN0OgorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgiICAgICVyIDogJXMsXG4iICUgKGssIHYpKQorICAgICAgICBzZWxmLmZwLndyaXRlKCJ9XG4iKQorCisgICAgICAgIHNlbGYuZnAud3JpdGUoIlxuX3Byb3BkZWNsYXJhdGlvbnMgPSB7XG4iKQorICAgICAgICBwcm9wbGlzdCA9IHNlbGYubmFtZW1hcHBlcnNbMF0uZ2V0YWxsKCdwcm9wZXJ0eScpCisgICAgICAgIHByb3BsaXN0LnNvcnQoKQorICAgICAgICBmb3IgaywgdiBpbiBwcm9wbGlzdDoKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiAgICAlciA6IF9Qcm9wXyVzLFxuIiAlIChrLCB2KSkKKyAgICAgICAgc2VsZi5mcC53cml0ZSgifVxuIikKKworICAgICAgICBzZWxmLmZwLndyaXRlKCJcbl9jb21wZGVjbGFyYXRpb25zID0ge1xuIikKKyAgICAgICAgY29tcGxpc3QgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmdldGFsbCgnY29tcGFyaXNvbicpCisgICAgICAgIGNvbXBsaXN0LnNvcnQoKQorICAgICAgICBmb3IgaywgdiBpbiBjb21wbGlzdDoKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiAgICAlciA6ICVzLFxuIiAlIChrLCB2KSkKKyAgICAgICAgc2VsZi5mcC53cml0ZSgifVxuIikKKworICAgICAgICBzZWxmLmZwLndyaXRlKCJcbl9lbnVtZGVjbGFyYXRpb25zID0ge1xuIikKKyAgICAgICAgZW51bWxpc3QgPSBzZWxmLm5hbWVtYXBwZXJzWzBdLmdldGFsbCgnZW51bScpCisgICAgICAgIGVudW1saXN0LnNvcnQoKQorICAgICAgICBmb3IgaywgdiBpbiBlbnVtbGlzdDoKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoIiAgICAlciA6ICVzLFxuIiAlIChrLCB2KSkKKyAgICAgICAgc2VsZi5mcC53cml0ZSgifVxuIikKKworZGVmIGNvbXBpbGVkYXRhKGRhdGEpOgorICAgIFt0eXBlLCBkZXNjcmlwdGlvbiwgZmxhZ3NdID0gZGF0YQorICAgIHJldHVybiAiJXIgLS0gJXIgJXMiICUgKHR5cGUsIGRlc2NyaXB0aW9uLCBjb21waWxlZGF0YWZsYWdzKGZsYWdzKSkKKworZGVmIGlzX251bGwoZGF0YSk6CisgICAgcmV0dXJuIGRhdGFbMF0gPT0gJ251bGwnCisKK2RlZiBpc19vcHRpb25hbChkYXRhKToKKyAgICByZXR1cm4gKGRhdGFbMl0gJiAweDgwMDApCisKK2RlZiBpc19lbnVtKGRhdGEpOgorICAgIHJldHVybiAoZGF0YVsyXSAmIDB4MjAwMCkKKworZGVmIGdldGRhdGFkb2MoZGF0YSk6CisgICAgW3R5cGUsIGRlc2NyLCBmbGFnc10gPSBkYXRhCisgICAgaWYgZGVzY3I6CisgICAgICAgIHJldHVybiBhc2NpaShkZXNjcikKKyAgICBpZiB0eXBlID09ICcqKioqJzoKKyAgICAgICAgcmV0dXJuICdhbnl0aGluZycKKyAgICBpZiB0eXBlID09ICdvYmogJzoKKyAgICAgICAgcmV0dXJuICdhbiBBRSBvYmplY3QgcmVmZXJlbmNlJworICAgIHJldHVybiAidW5kb2N1bWVudGVkLCB0eXBlY29kZSAlciIlKHR5cGUsKQorCitkYXRhZmxhZ2RpY3QgPSB7MTU6ICJvcHRpb25hbCIsIDE0OiAibGlzdCIsIDEzOiAiZW51bSIsIDEyOiAibXV0YWJsZSJ9CitkZWYgY29tcGlsZWRhdGFmbGFncyhmbGFncyk6CisgICAgYml0cyA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoMTYpOgorICAgICAgICBpZiBmbGFncyAmICgxPDxpKToKKyAgICAgICAgICAgIGlmIGkgaW4gZGF0YWZsYWdkaWN0LmtleXMoKToKKyAgICAgICAgICAgICAgICBiaXRzLmFwcGVuZChkYXRhZmxhZ2RpY3RbaV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJpdHMuYXBwZW5kKHJlcHIoaSkpCisgICAgcmV0dXJuICdbJXNdJyAlIHN0cmluZy5qb2luKGJpdHMpCisKK2RlZiBhc2NpaShzdHIpOgorICAgICIiIlJldHVybiBhIHN0cmluZyB3aXRoIGFsbCBub24tYXNjaWkgY2hhcmFjdGVycyBoZXgtZW5jb2RlZCIiIgorICAgIGlmIHR5cGUoc3RyKSAhPSB0eXBlKCcnKToKKyAgICAgICAgcmV0dXJuIG1hcChhc2NpaSwgc3RyKQorICAgIHJ2ID0gJycKKyAgICBmb3IgYyBpbiBzdHI6CisgICAgICAgIGlmIGMgaW4gKCdcdCcsICdcbicsICdccicpIG9yICcgJyA8PSBjIDwgY2hyKDB4N2YpOgorICAgICAgICAgICAgcnYgPSBydiArIGMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJ2ID0gcnYgKyAnXFwnICsgJ3glMDIuMngnICUgb3JkKGMpCisgICAgcmV0dXJuIHJ2CisKK2RlZiBpZGVudGlmeShzdHIpOgorICAgICIiIlR1cm4gYW55IHN0cmluZyBpbnRvIGFuIGlkZW50aWZpZXI6CisgICAgLSByZXBsYWNlIHNwYWNlIGJ5IF8KKyAgICAtIHJlcGxhY2Ugb3RoZXIgaWxsZWdhbCBjaGFycyBieSBfeHhfIChoZXggY29kZSkKKyAgICAtIGFwcGVuZCBfIGlmIHRoZSByZXN1bHQgaXMgYSBweXRob24ga2V5d29yZAorICAgICIiIgorICAgIGlmIG5vdCBzdHI6CisgICAgICAgIHJldHVybiAiZW1wdHlfYWVfbmFtZV8iCisgICAgcnYgPSAnJworICAgIG9rID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyAnXycKKyAgICBvazIgPSBvayArIHN0cmluZy5kaWdpdHMKKyAgICBmb3IgYyBpbiBzdHI6CisgICAgICAgIGlmIGMgaW4gb2s6CisgICAgICAgICAgICBydiA9IHJ2ICsgYworICAgICAgICBlbGlmIGMgPT0gJyAnOgorICAgICAgICAgICAgcnYgPSBydiArICdfJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcnYgPSBydiArICdfJTAyLjJ4Xyclb3JkKGMpCisgICAgICAgIG9rID0gb2syCisgICAgaWYga2V5d29yZC5pc2tleXdvcmQocnYpOgorICAgICAgICBydiA9IHJ2ICsgJ18nCisgICAgcmV0dXJuIHJ2CisKKyMgQ2FsbCB0aGUgbWFpbiBwcm9ncmFtCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCisgICAgc3lzLmV4aXQoMSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvZ2Vuc3VpdGVtb2R1bGUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9nZW5zdWl0ZW1vZHVsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1ODhjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvZ2Vuc3VpdGVtb2R1bGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvZ2Vuc3VpdGVtb2R1bGUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9nZW5zdWl0ZW1vZHVsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1ODhjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvZ2Vuc3VpdGVtb2R1bGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvaWMucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2ljLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMWViYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2ljLnB5CkBAIC0wLDAgKzEsMjcxIEBACisiIiJJQyB3cmFwcGVyIG1vZHVsZSwgYmFzZWQgb24gSW50ZXJuZXQgQ29uZmlnIDEuMyIiIgorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIGljIG1vZHVsZSBpcyByZW1vdmVkLiIsIHN0YWNrbGV2ZWw9MikKKworaW1wb3J0IGljZ2x1ZQoraW1wb3J0IHN0cmluZworaW1wb3J0IHN5cworaW1wb3J0IG9zCitmcm9tIENhcmJvbiBpbXBvcnQgUmVzCitpbXBvcnQgQ2FyYm9uLkZpbGUKK2ltcG9ydCBtYWNvc3Rvb2xzCisKK2Vycm9yPWljZ2x1ZS5lcnJvcgorCisjIEZyb20gaWN0eXBlcy5oOgoraWNQcmVmTm90Rm91bmRFcnIgPSAtNjY2ICAgICAgICAjIHByZWZlcmVuY2Ugbm90IGZvdW5kIChkdWghKQoraWNQZXJtRXJyID0gLTY2NyAgICAgICAgICAgICAgICAjIGNhbm5vdCBzZXQgcHJlZmVyZW5jZQoraWNQcmVmRGF0YUVyciA9IC02NjggICAgICAgICAgICAjIHByb2JsZW0gd2l0aCBwcmVmZXJlbmNlIGRhdGEKK2ljSW50ZXJuYWxFcnIgPSAtNjY5ICAgICAgICAgICAgIyBobW0sIHRoaXMgaXMgbm90IGdvb2QKK2ljVHJ1bmNhdGVkRXJyID0gLTY3MCAgICAgICAgICAgIyBtb3JlIGRhdGEgd2FzIHByZXNlbnQgdGhhbiB3YXMgcmV0dXJuZWQKK2ljTm9Nb3JlV3JpdGVyc0VyciA9IC02NzEgICAgICAgIyB5b3UgY2Fubm90IGJlZ2luIGEgd3JpdGUgc2Vzc2lvbiBiZWNhdXNlIHNvbWVvbmUgZWxzZSBpcyBhbHJlYWR5IGRvaW5nIGl0ICovCitpY05vdGhpbmdUb092ZXJyaWRlRXJyID0gLTY3MiAgICMgbm8gY29tcG9uZW50IGZvciB0aGUgb3ZlcnJpZGUgY29tcG9uZW50IHRvIGNhcHR1cmUKK2ljTm9VUkxFcnIgPSAtNjczICAgICAgICAgICAgICAgIyBubyBVUkwgZm91bmQKK2ljQ29uZmlnTm90Rm91bmRFcnIgPSAtNjc0ICAgICAgIyBubyBjb25maWd1cmF0aW9uIHdhcyBmb3VuZAoraWNDb25maWdJbmFwcHJvcHJpYXRlRXJyID0gLTY3NSAjIGluY29ycmVjdCBtYW51ZmFjdHVyZXIgY29kZQorCitJQ2F0dHJfbm9fY2hhbmdlID0gLTEKKworaWNOb1Blcm0gPSAwCitpY1JlYWRPbmx5UGVybSA9IDEKK2ljUmVhZFdyaXRlUGVybSA9IDIKKyMgRW5kIG9mIGljdHlwZXMuaAorCitjbGFzcyBJQ09wYXF1ZURhdGE6CisgICAgIiIiQW4gdW5wYXJzZWFibGUgSUMgZW50cnkiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJJQ09wYXF1ZURhdGEoJXIpIiUoc2VsZi5kYXRhLCkKKworX0lDT3BhcXVlRGF0YVR5cGU9dHlwZShJQ09wYXF1ZURhdGEoJycpKQorCitkZWYgX2RlY29kZV9kZWZhdWx0KGRhdGEsIGtleSk6CisgICAgaWYgbGVuKGRhdGEpID09IDA6CisgICAgICAgIHJldHVybiBkYXRhCisgICAgaWYgb3JkKGRhdGFbMF0pID09IGxlbihkYXRhKS0xOgorICAgICAgICAjIEFzc3VtZSBQc3RyaW5nCisgICAgICAgIHJldHVybiBkYXRhWzE6XQorICAgIHJldHVybiBJQ09wYXF1ZURhdGEoZGF0YSkKKworCitkZWYgX2RlY29kZV9tdWx0aXN0cihkYXRhLCBrZXkpOgorICAgIG51bXN0ciA9IG9yZChkYXRhWzBdKSA8PCA4IHwgb3JkKGRhdGFbMV0pCisgICAgcnYgPSBbXQorICAgIHB0ciA9IDIKKyAgICBmb3IgaSBpbiByYW5nZShudW1zdHIpOgorICAgICAgICBzdHJsZW4gPSBvcmQoZGF0YVtwdHJdKQorICAgICAgICBzdHIgPSBkYXRhW3B0cisxOnB0citzdHJsZW4rMV0KKyAgICAgICAgcnYuYXBwZW5kKHN0cikKKyAgICAgICAgcHRyID0gcHRyICsgc3RybGVuICsgMQorICAgIHJldHVybiBydgorCitkZWYgX2RlY29kZV9mb250cmVjb3JkKGRhdGEsIGtleSk6CisgICAgc2l6ZSA9IG9yZChkYXRhWzBdKSA8PCA4IHwgb3JkKGRhdGFbMV0pCisgICAgZmFjZSA9IG9yZChkYXRhWzJdKQorICAgIG5hbWVsZW4gPSBvcmQoZGF0YVs0XSkKKyAgICByZXR1cm4gc2l6ZSwgZmFjZSwgZGF0YVs1OjUrbmFtZWxlbl0KKworZGVmIF9kZWNvZGVfYm9vbGVhbihkYXRhLCBrZXkpOgorICAgIHJldHVybiBvcmQoZGF0YVswXSkKKworZGVmIF9kZWNvZGVfdGV4dChkYXRhLCBrZXkpOgorICAgIHJldHVybiBkYXRhCisKK2RlZiBfZGVjb2RlX2NoYXJzZXQoZGF0YSwga2V5KToKKyAgICByZXR1cm4gZGF0YVs6MjU2XSwgZGF0YVsyNTY6XQorCitkZWYgX2RlY29kZV9hcHBzcGVjKGRhdGEsIGtleSk6CisgICAgbmFtZWxlbiA9IG9yZChkYXRhWzRdKQorICAgIHJldHVybiBkYXRhWzA6NF0sIGRhdGFbNTo1K25hbWVsZW5dCisKK2RlZiBfY29kZV9kZWZhdWx0KGRhdGEsIGtleSk6CisgICAgcmV0dXJuIGNocihsZW4oZGF0YSkpICsgZGF0YQorCitkZWYgX2NvZGVfbXVsdGlzdHIoZGF0YSwga2V5KToKKyAgICBudW1zdHIgPSBsZW4oZGF0YSkKKyAgICBydiA9IGNocigobnVtc3RyPj44KSAmIDB4ZmYpICsgY2hyKG51bXN0ciAmIDB4ZmYpCisgICAgZm9yIGkgaW4gZGF0YToKKyAgICAgICAgcnYgPSBydiArIF9jb2RlX2RlZmF1bHQoaSkKKyAgICByZXR1cm4gcnYKKworZGVmIF9jb2RlX2ZvbnRyZWNvcmQoZGF0YSwga2V5KToKKyAgICBzaXplLCBmYWNlLCBuYW1lID0gZGF0YQorICAgIHJldHVybiBjaHIoKHNpemU+PjgpICYgMHhmZikgKyBjaHIoc2l6ZSAmIDB4ZmYpICsgY2hyKGZhY2UgJiAweGZmKSArIFwKKyAgICAgICAgY2hyKDApICsgX2NvZGVfZGVmYXVsdChuYW1lKQorCitkZWYgX2NvZGVfYm9vbGVhbihkYXRhLCBrZXkpOgorICAgIHByaW50ICdYWFhYIGJvb2xlYW46JywgcmVwcihkYXRhKQorICAgIHJldHVybiBjaHIoZGF0YSkKKworZGVmIF9jb2RlX3RleHQoZGF0YSwga2V5KToKKyAgICByZXR1cm4gZGF0YQorCitkZWYgX2NvZGVfY2hhcnNldChkYXRhLCBrZXkpOgorICAgIHJldHVybiBkYXRhWzBdICsgZGF0YVsxXQorCitkZWYgX2NvZGVfYXBwc3BlYyhkYXRhLCBrZXkpOgorICAgIHJldHVybiBkYXRhWzBdICsgX2NvZGVfZGVmYXVsdChkYXRhWzFdKQorCitfZGVjb2Rlcl90YWJsZSA9IHsKKyAgICAiQXJjaGllQWxsIiA6IChfZGVjb2RlX211bHRpc3RyICwgX2NvZGVfbXVsdGlzdHIpLAorICAgICJVTWljaEFsbCIgOiAoX2RlY29kZV9tdWx0aXN0ciAsIF9jb2RlX211bHRpc3RyKSwKKyAgICAiSW5mb01hY0FsbCIgOiAoX2RlY29kZV9tdWx0aXN0ciAsIF9jb2RlX211bHRpc3RyKSwKKyAgICAiTGlzdEZvbnQiIDogKF9kZWNvZGVfZm9udHJlY29yZCAsIF9jb2RlX2ZvbnRyZWNvcmQpLAorICAgICJTY3JlZW5Gb250IiA6IChfZGVjb2RlX2ZvbnRyZWNvcmQgLCBfY29kZV9mb250cmVjb3JkKSwKKyAgICAiUHJpbnRlckZvbnQiIDogKF9kZWNvZGVfZm9udHJlY29yZCAsIF9jb2RlX2ZvbnRyZWNvcmQpLAorIyAgICJEb3dubG9hZEZvbGRlciIgOiAoX2RlY29kZV9maWxlc3BlYyAsIF9jb2RlX2ZpbGVzcGVjKSwKKyAgICAiU2lnbmF0dXJlIjogKF9kZWNvZGVfdGV4dCAsIF9jb2RlX3RleHQpLAorICAgICJQbGFuIiA6IChfZGVjb2RlX3RleHQgLCBfY29kZV90ZXh0KSwKKyAgICAiTWFpbEhlYWRlcnMiIDogKF9kZWNvZGVfdGV4dCAsIF9jb2RlX3RleHQpLAorICAgICJOZXdzSGVhZGVycyIgOiAoX2RlY29kZV90ZXh0ICwgX2NvZGVfdGV4dCksCisjICAgIk1hcHBpbmciCisgICAgIkNoYXJhY3RlclNldCIgOiAoX2RlY29kZV9jaGFyc2V0ICwgX2NvZGVfY2hhcnNldCksCisgICAgIkhlbHBlclwyNDUiIDogKF9kZWNvZGVfYXBwc3BlYyAsIF9jb2RlX2FwcHNwZWMpLAorIyAgICJTZXJ2aWNlcyIgOiAoX2RlY29kZV9zZXJ2aWNlcywgPz8/PyksCisgICAgIk5ld01haWxGbGFzaEljb24iIDogKF9kZWNvZGVfYm9vbGVhbiAsIF9jb2RlX2Jvb2xlYW4pLAorICAgICJOZXdNYWlsRGlhbG9nIiA6IChfZGVjb2RlX2Jvb2xlYW4gLCBfY29kZV9ib29sZWFuKSwKKyAgICAiTmV3TWFpbFBsYXlTb3VuZCIgOiAoX2RlY29kZV9ib29sZWFuICwgX2NvZGVfYm9vbGVhbiksCisjICAgIldlYkJhY2tncm91bmRDb2xvciIgOiBfZGVjb2RlX2NvbG9yLAorICAgICJOb1Byb3h5RG9tYWlucyIgOiAoX2RlY29kZV9tdWx0aXN0ciAsIF9jb2RlX211bHRpc3RyKSwKKyAgICAiVXNlSFRUUFByb3h5IiA6IChfZGVjb2RlX2Jvb2xlYW4gLCBfY29kZV9ib29sZWFuKSwKKyAgICAiVXNlR29waGVyUHJveHkiOiAoX2RlY29kZV9ib29sZWFuICwgX2NvZGVfYm9vbGVhbiksCisgICAgIlVzZUZUUFByb3h5IiA6IChfZGVjb2RlX2Jvb2xlYW4gLCBfY29kZV9ib29sZWFuKSwKKyAgICAiVXNlUGFzc2l2ZUZUUCIgOiAoX2RlY29kZV9ib29sZWFuICwgX2NvZGVfYm9vbGVhbiksCit9CisKK2RlZiBfZGVjb2RlKGRhdGEsIGtleSk6CisgICAgaWYgJ1wyNDUnIGluIGtleToKKyAgICAgICAga2V5MiA9IGtleVs6c3RyaW5nLmluZGV4KGtleSwgJ1wyNDUnKSsxXQorICAgIGVsc2U6CisgICAgICAgIGtleTIgPSBrZXkKKyAgICBpZiBrZXkyIGluIF9kZWNvZGVyX3RhYmxlOgorICAgICAgICBkZWNvZGVyID0gX2RlY29kZXJfdGFibGVba2V5Ml1bMF0KKyAgICBlbHNlOgorICAgICAgICBkZWNvZGVyID0gX2RlY29kZV9kZWZhdWx0CisgICAgcmV0dXJuIGRlY29kZXIoZGF0YSwga2V5KQorCitkZWYgX2NvZGUoZGF0YSwga2V5KToKKyAgICBpZiB0eXBlKGRhdGEpID09IF9JQ09wYXF1ZURhdGFUeXBlOgorICAgICAgICByZXR1cm4gZGF0YS5kYXRhCisgICAgaWYgJ1wyNDUnIGluIGtleToKKyAgICAgICAga2V5MiA9IGtleVs6c3RyaW5nLmluZGV4KGtleSwgJ1wyNDUnKSsxXQorICAgIGVsc2U6CisgICAgICAgIGtleTIgPSBrZXkKKyAgICBpZiBrZXkyIGluIF9kZWNvZGVyX3RhYmxlOgorICAgICAgICBjb2RlciA9IF9kZWNvZGVyX3RhYmxlW2tleTJdWzFdCisgICAgZWxzZToKKyAgICAgICAgY29kZXIgPSBfY29kZV9kZWZhdWx0CisgICAgcmV0dXJuIGNvZGVyKGRhdGEsIGtleSkKKworY2xhc3MgSUM6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpZ25hdHVyZT0nUHl0aCcsIGljPU5vbmUpOgorICAgICAgICBpZiBpYzoKKyAgICAgICAgICAgIHNlbGYuaWMgPSBpYworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5pYyA9IGljZ2x1ZS5JQ1N0YXJ0KHNpZ25hdHVyZSkKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5pYywgJ0lDRmluZENvbmZpZ0ZpbGUnKToKKyAgICAgICAgICAgICAgICBzZWxmLmljLklDRmluZENvbmZpZ0ZpbGUoKQorICAgICAgICBzZWxmLmggPSBSZXMuUmVzb3VyY2UoJycpCisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgcnYgPSBbXQorICAgICAgICBzZWxmLmljLklDQmVnaW4oaWNSZWFkT25seVBlcm0pCisgICAgICAgIG51bSA9IHNlbGYuaWMuSUNDb3VudFByZWYoKQorICAgICAgICBmb3IgaSBpbiByYW5nZShudW0pOgorICAgICAgICAgICAgcnYuYXBwZW5kKHNlbGYuaWMuSUNHZXRJbmRQcmVmKGkrMSkpCisgICAgICAgIHNlbGYuaWMuSUNFbmQoKQorICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBzZWxmLl9fY29udGFpbnNfXyhrZXkpCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGR1bW15ID0gc2VsZi5pYy5JQ0ZpbmRQcmVmSGFuZGxlKGtleSwgc2VsZi5oKQorICAgICAgICBleGNlcHQgaWNnbHVlLmVycm9yOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBhdHRyID0gc2VsZi5pYy5JQ0ZpbmRQcmVmSGFuZGxlKGtleSwgc2VsZi5oKQorICAgICAgICByZXR1cm4gX2RlY29kZShzZWxmLmguZGF0YSwga2V5KQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICB2YWx1ZSA9IF9jb2RlKHZhbHVlLCBrZXkpCisgICAgICAgIHNlbGYuaWMuSUNTZXRQcmVmKGtleSwgSUNhdHRyX25vX2NoYW5nZSwgdmFsdWUpCisKKyAgICBkZWYgbGF1bmNodXJsKHNlbGYsIHVybCwgaGludD0iIik6CisgICAgICAgICMgV29yayBhcm91bmQgYSBidWcgaW4gSUNMYXVuY2hVUkw6IGZpbGU6L2ZvbyBkb2VzCisgICAgICAgICMgbm90IHdvcmsgYnV0IGZpbGU6Ly8vZm9vIGRvZXMuCisgICAgICAgIGlmIHVybFs6Nl0gPT0gJ2ZpbGU6LycgYW5kIHVybFs2XSAhPSAnLyc6CisgICAgICAgICAgICB1cmwgPSAnZmlsZTovLy8nICsgdXJsWzY6XQorICAgICAgICBzZWxmLmljLklDTGF1bmNoVVJMKGhpbnQsIHVybCwgMCwgbGVuKHVybCkpCisKKyAgICBkZWYgcGFyc2V1cmwoc2VsZiwgZGF0YSwgc3RhcnQ9Tm9uZSwgZW5kPU5vbmUsIGhpbnQ9IiIpOgorICAgICAgICBpZiBzdGFydCBpcyBOb25lOgorICAgICAgICAgICAgc2VsU3RhcnQgPSAwCisgICAgICAgICAgICBzZWxFbmQgPSBsZW4oZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbFN0YXJ0ID0gc2VsRW5kID0gc3RhcnQKKyAgICAgICAgaWYgZW5kIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsRW5kID0gZW5kCisgICAgICAgIHNlbFN0YXJ0LCBzZWxFbmQgPSBzZWxmLmljLklDUGFyc2VVUkwoaGludCwgZGF0YSwgc2VsU3RhcnQsIHNlbEVuZCwgc2VsZi5oKQorICAgICAgICByZXR1cm4gc2VsZi5oLmRhdGEsIHNlbFN0YXJ0LCBzZWxFbmQKKworICAgIGRlZiBtYXBmaWxlKHNlbGYsIGZpbGUpOgorICAgICAgICBpZiB0eXBlKGZpbGUpICE9IHR5cGUoJycpOgorICAgICAgICAgICAgZmlsZSA9IGZpbGUuYXNfdHVwbGUoKVsyXQorICAgICAgICByZXR1cm4gc2VsZi5pYy5JQ01hcEZpbGVuYW1lKGZpbGUpCisKKyAgICBkZWYgbWFwdHlwZWNyZWF0b3Ioc2VsZiwgdHlwZSwgY3JlYXRvciwgZmlsZW5hbWU9IiIpOgorICAgICAgICByZXR1cm4gc2VsZi5pYy5JQ01hcFR5cGVDcmVhdG9yKHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lKQorCisgICAgZGVmIHNldHR5cGVjcmVhdG9yKHNlbGYsIGZpbGUpOgorICAgICAgICBmaWxlID0gQ2FyYm9uLkZpbGUucGF0aG5hbWUoZmlsZSkKKyAgICAgICAgcmVjb3JkID0gc2VsZi5tYXBmaWxlKG9zLnBhdGguc3BsaXQoZmlsZSlbMV0pCisgICAgICAgIE1hY09TLlNldENyZWF0b3JBbmRUeXBlKGZpbGUsIHJlY29yZFsyXSwgcmVjb3JkWzFdKQorICAgICAgICBtYWNvc3Rvb2xzLnRvdWNoZWQoZnNzKQorCisjIENvbnZlbmllbmNlIHJvdXRpbmVzCitfZGZ0X2ljID0gTm9uZQorCitkZWYgbGF1bmNodXJsKHVybCwgaGludD0iIik6CisgICAgZ2xvYmFsIF9kZnRfaWMKKyAgICBpZiBfZGZ0X2ljIGlzIE5vbmU6IF9kZnRfaWMgPSBJQygpCisgICAgcmV0dXJuIF9kZnRfaWMubGF1bmNodXJsKHVybCwgaGludCkKKworZGVmIHBhcnNldXJsKGRhdGEsIHN0YXJ0PU5vbmUsIGVuZD1Ob25lLCBoaW50PSIiKToKKyAgICBnbG9iYWwgX2RmdF9pYworICAgIGlmIF9kZnRfaWMgaXMgTm9uZTogX2RmdF9pYyA9IElDKCkKKyAgICByZXR1cm4gX2RmdF9pYy5wYXJzZXVybChkYXRhLCBzdGFydCwgZW5kLCBoaW50KQorCitkZWYgbWFwZmlsZShmaWxlbmFtZSk6CisgICAgZ2xvYmFsIF9kZnRfaWMKKyAgICBpZiBfZGZ0X2ljIGlzIE5vbmU6IF9kZnRfaWMgPSBJQygpCisgICAgcmV0dXJuIF9kZnRfaWMubWFwZmlsZShmaWxlbmFtZSkKKworZGVmIG1hcHR5cGVjcmVhdG9yKHR5cGUsIGNyZWF0b3IsIGZpbGVuYW1lPSIiKToKKyAgICBnbG9iYWwgX2RmdF9pYworICAgIGlmIF9kZnRfaWMgaXMgTm9uZTogX2RmdF9pYyA9IElDKCkKKyAgICByZXR1cm4gX2RmdF9pYy5tYXB0eXBlY3JlYXRvcih0eXBlLCBjcmVhdG9yLCBmaWxlbmFtZSkKKworZGVmIHNldHR5cGVjcmVhdG9yKGZpbGUpOgorICAgIGdsb2JhbCBfZGZ0X2ljCisgICAgaWYgX2RmdF9pYyBpcyBOb25lOiBfZGZ0X2ljID0gSUMoKQorICAgIHJldHVybiBfZGZ0X2ljLnNldHR5cGVjcmVhdG9yKGZpbGUpCisKK2RlZiBfdGVzdCgpOgorICAgIGljID0gSUMoKQorICAgIGZvciBrIGluIGljLmtleXMoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdiA9IGljW2tdCisgICAgICAgIGV4Y2VwdCBlcnJvcjoKKyAgICAgICAgICAgIHYgPSAnPz8/PycKKyAgICAgICAgcHJpbnQgaywgJ1x0JywgdgorICAgIHN5cy5leGl0KDEpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9pYy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2ljLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTg3YzhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9pYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9pYy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2ljLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTg3YzhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9pYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9pY29wZW4ucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2ljb3Blbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDFkYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9pY29wZW4ucHkKQEAgLTAsMCArMSw2OSBAQAorIiIiaWNvcGVuIHBhdGNoCisKK09WRVJWSUVXCisKK2ljb3BlbiBwYXRjaGVzIE1hY09TIFB5dGhvbiB0byB1c2UgdGhlIEludGVybmV0IENvbmZpZyBmaWxlIG1hcHBpbmdzIHRvIHNlbGVjdAordGhlIHR5cGUgYW5kIGNyZWF0b3IgZm9yIGEgZmlsZS4KKworVmVyc2lvbiAxIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluIDMgTm92ZW1iZXIgMTk5OQorYnkgT2xpdmVyIFN0ZWVsZSAoc3RlZWxlQGNzLmJyYW5kZWlzLmVkdSkuCisKK0RFVEFJTFMKKworVGhpcyBwYXRjaCBjYXVzZXMgZmlsZXMgY3JlYXRlZCBieSBQeXRob24ncyBvcGVuKGZpbGVuYW1lLCAndycpIGNvbW1hbmQgKGFuZAorYnkgZnVuY3Rpb25zIGFuZCBzY3JpcHRzIHRoYXQgY2FsbCBpdCkgdG8gc2V0IHRoZSB0eXBlIGFuZCBjcmVhdG9yIG9mIHRoZSBmaWxlCit0byB0aGUgdHlwZSBhbmQgY3JlYXRvciBhc3NvY2lhdGVkIHdpdGggZmlsZW5hbWUncyBleHRlbnNpb24gKHRoZQorcG9ydGlvbiBvZiB0aGUgZmlsZW5hbWUgYWZ0ZXIgdGhlIGxhc3QgcGVyaW9kKSwgYWNjb3JkaW5nIHRvIEludGVybmV0IENvbmZpZy4KK1RodXMsIGEgc2NyaXB0IHRoYXQgY3JlYXRlcyBhIGZpbGUgZm9vLmh0bWwgd2lsbCBjcmVhdGUgb25lIHRoYXQgb3BlbnMgaW4gd2hhdGV2ZXIKK2Jyb3dzZXIgeW91J3ZlIHNldCB0byBoYW5kbGUgKi5odG1sIGZpbGVzLCBhbmQgc28gb24uCisKK1B5dGhvbiBJREUgdXNlcyBpdHMgb3duIGFsZ29yaXRobSB0byBzZWxlY3QgdGhlIHR5cGUgYW5kIGNyZWF0b3IgZm9yIHNhdmVkCitlZGl0b3Igd2luZG93cywgc28gdGhpcyBwYXRjaCB3b24ndCBlZmZlY3QgdGhlaXIgdHlwZXMuCisKK0FzIG9mIFN5c3RlbSA4LjYgYXQgbGVhc3QsIEludGVybmV0IENvbmZpZyBpcyBidWlsdCBpbnRvIHRoZSBzeXN0ZW0sIGFuZCB0aGUKK2ZpbGUgbWFwcGluZ3MgYXJlIGFjY2Vzc2VkIGZyb20gdGhlIEFkdmFuY2VkIHBhbmUgb2YgdGhlIEludGVybmV0IGNvbnRyb2wKK3BhbmVsLiAgVXNlciBNb2RlIChpbiB0aGUgRWRpdCBtZW51KSBuZWVkcyB0byBiZSBzZXQgdG8gQWR2YW5jZWQgaW4gb3JkZXIgdG8KK2FjY2VzcyB0aGlzIHBhbmUuCisKK0lOU1RBTExBVElPTgorCitQdXQgdGhpcyBmaWxlIGluIHlvdXIgUHl0aG9uIHBhdGgsIGFuZCBjcmVhdGUgYSBmaWxlIG5hbWVkIHtQeXRob259OnNpdGVjdXN0b21pemUucHkKK3RoYXQgY29udGFpbnM6CisgICAgICAgIGltcG9ydCBpY29wZW4KKworKElmIHtQeXRob259OnNpdGVjdXN0b21pemVyLnB5IGFscmVhZHkgZXhpc3RzLCBqdXN0IGFkZCB0aGUgJ2ltcG9ydCcgbGluZSB0byBpdC4pCisKK1RoZSBuZXh0IHRpbWUgeW91IGxhdW5jaCBQeXRob25JbnRlcnByZXRlciBvciBQeXRob24gSURFLCB0aGUgcGF0Y2ggd2lsbCB0YWtlCitlZmZlY3QuCisiIiIKKworZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJJbiAzLngsIHRoZSBpY29wZW4gbW9kdWxlIGlzIHJlbW92ZWQuIiwgc3RhY2tsZXZlbD0yKQorCitpbXBvcnQgX19idWlsdGluX18KKworX2J1aWx0aW5fb3BlbiA9IGdsb2JhbHMoKS5nZXQoJ19idWlsdGluX29wZW4nLCBfX2J1aWx0aW5fXy5vcGVuKQorCitkZWYgX29wZW5fd2l0aF90eXBlcigqYXJncyk6CisgICAgZmlsZSA9IF9idWlsdGluX29wZW4oKmFyZ3MpCisgICAgZmlsZW5hbWUgPSBhcmdzWzBdCisgICAgbW9kZSA9ICdyJworICAgIGlmIGFyZ3NbMTpdOgorICAgICAgICBtb2RlID0gYXJnc1sxXQorICAgIGlmIG1vZGVbMF0gPT0gJ3cnOgorICAgICAgICBmcm9tIGljIGltcG9ydCBlcnJvciwgc2V0dHlwZWNyZWF0b3IKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2V0dHlwZWNyZWF0b3IoZmlsZW5hbWUpCisgICAgICAgIGV4Y2VwdCBlcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICByZXR1cm4gZmlsZQorCitfX2J1aWx0aW5fXy5vcGVuID0gX29wZW5fd2l0aF90eXBlcgorCisiIiIKK29wZW4oJ3Rlc3QucHknKQorX29wZW5fd2l0aF90eXBlcigndGVzdC5weScsICd3JykKK19vcGVuX3dpdGhfdHlwZXIoJ3Rlc3QudHh0JywgJ3cnKQorX29wZW5fd2l0aF90eXBlcigndGVzdC5odG1sJywgJ3cnKQorX29wZW5fd2l0aF90eXBlcigndGVzdC5mb28nLCAndycpCisiIiIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvaWNvcGVuLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvaWNvcGVuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTM0ZDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9pY29wZW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvaWNvcGVuLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvaWNvcGVuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTM0ZDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9pY29wZW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL0NvZGVXYXJyaW9yX3N1aXRlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvQ29kZVdhcnJpb3Jfc3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiODU2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL0NvZGVXYXJyaW9yX3N1aXRlLnB5CkBAIC0wLDAgKzEsNjgyIEBACisiIiJTdWl0ZSBDb2RlV2FycmlvciBzdWl0ZTogVGVybXMgZm9yIHNjcmlwdGluZyB0aGUgQ29kZVdhcnJpb3IgSURFCitMZXZlbCAwLCB2ZXJzaW9uIDAKKworR2VuZXJhdGVkIGZyb20gL1ZvbHVtZXMvU2FwL0FwcGxpY2F0aW9ucyAoTWFjIE9TIDkpL01ldHJvd2Vya3MgQ29kZVdhcnJpb3IgNy4wL01ldHJvd2Vya3MgQ29kZVdhcnJpb3IvQ29kZVdhcnJpb3IgSURFIDQuMi41CitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdDV0lFJworCitjbGFzcyBDb2RlV2Fycmlvcl9zdWl0ZV9FdmVudHM6CisKKyAgICBfYXJnbWFwX2FkZCA9IHsKKyAgICAgICAgJ25ldycgOiAna29jbCcsCisgICAgICAgICd3aXRoX2RhdGEnIDogJ2RhdGEnLAorICAgICAgICAndG9fdGFyZ2V0cycgOiAnVFRHVCcsCisgICAgICAgICd0b19ncm91cCcgOiAnVEdSUCcsCisgICAgfQorCisgICAgZGVmIGFkZChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiYWRkOiBhZGQgZWxlbWVudHMgdG8gYSBwcm9qZWN0IG9yIHRhcmdldAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IG5ldzogdGhlIGNsYXNzIG9mIHRoZSBuZXcgZWxlbWVudCBvciBlbGVtZW50cyB0byBhZGQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoX2RhdGE6IHRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBlbGVtZW50IG9yIGVsZW1lbnRzCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG9fdGFyZ2V0czogdGhlIHRhcmdldHMgdG8gd2hpY2ggdGhlIG5ldyBlbGVtZW50IG9yIGVsZW1lbnRzIHdpbGwgYmUgYWRkZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB0b19ncm91cDogdGhlIGdyb3VwIHRvIHdoaWNoIHRoZSBuZXcgZWxlbWVudCBvciBlbGVtZW50cyB3aWxsIGJlIGFkZGVkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ0NXSUUnCisgICAgICAgIF9zdWJjb2RlID0gJ0FEREYnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfYWRkKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBidWlsZChzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJidWlsZDogYnVpbGQgYSBwcm9qZWN0IG9yIHRhcmdldCAoZXF1aXZhbGVudCBvZiB0aGUgTWFrZSBtZW51IGNvbW1hbmQpCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ0NXSUUnCisgICAgICAgIF9zdWJjb2RlID0gJ01BS0UnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIGNoZWNrKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImNoZWNrOiBjaGVjayB0aGUgc3ludGF4IG9mIGEgZmlsZSBpbiBhIHByb2plY3Qgb3IgdGFyZ2V0CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZmlsZSBvciBmaWxlcyB0byBiZSBjaGVja2VkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ0NXSUUnCisgICAgICAgIF9zdWJjb2RlID0gJ0NIRUsnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgY29tcGlsZV9maWxlKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImNvbXBpbGUgZmlsZTogY29tcGlsZSBhIGZpbGUgaW4gYSBwcm9qZWN0IG9yIHRhcmdldAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIGZpbGUgb3IgZmlsZXMgdG8gYmUgY29tcGlsZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnQ1dJRScKKyAgICAgICAgX3N1YmNvZGUgPSAnQ09NUCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBkaXNhc3NlbWJsZV9maWxlKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImRpc2Fzc2VtYmxlIGZpbGU6IGRpc2Fzc2VtYmxlIGEgZmlsZSBpbiBhIHByb2plY3Qgb3IgdGFyZ2V0CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZmlsZSBvciBmaWxlcyB0byBiZSBkaXNhc3NlbWJsZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnQ1dJRScKKyAgICAgICAgX3N1YmNvZGUgPSAnREFTTScKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfZXhwb3J0ID0geworICAgICAgICAnaW5fJyA6ICdrZmlsJywKKyAgICB9CisKKyAgICBkZWYgZXhwb3J0KHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImV4cG9ydDogRXhwb3J0IHRoZSBwcm9qZWN0IGZpbGUgYXMgYW4gWE1MIGZpbGUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBpbl86IHRoZSBYTUwgZmlsZSBpbiB3aGljaCB0byBleHBvcnQgdGhlIHByb2plY3QKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnQ1dJRScKKyAgICAgICAgX3N1YmNvZGUgPSAnRVhQVCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9leHBvcnQpCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiByZW1vdmVfb2JqZWN0X2NvZGUoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIicmVtb3ZlIG9iamVjdCBjb2RlOiByZW1vdmUgb2JqZWN0IGNvZGUgZnJvbSBhIHByb2plY3Qgb3IgdGFyZ2V0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ0NXSUUnCisgICAgICAgIF9zdWJjb2RlID0gJ1JNT0InCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIHJlbW92ZV90YXJnZXRfZmlsZXMoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInJlbW92ZSB0YXJnZXQgZmlsZXM6IHJlbW92ZSBmaWxlcyBmcm9tIGEgdGFyZ2V0CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ0NXSUUnCisgICAgICAgIF9zdWJjb2RlID0gJ1JNRkwnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgcnVuX3RhcmdldChzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJydW4gdGFyZ2V0OiBydW4gYSBwcm9qZWN0IG9yIHRhcmdldAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdDV0lFJworICAgICAgICBfc3ViY29kZSA9ICdSVU4gJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiB0b3VjaF9maWxlKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInRvdWNoIGZpbGU6IHRvdWNoIGEgZmlsZSBpbiBhIHByb2plY3Qgb3IgdGFyZ2V0IGZvciBjb21waWxhdGlvbgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIGZpbGUgb3IgZmlsZXMgdG8gYmUgdG91Y2hlZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdDV0lFJworICAgICAgICBfc3ViY29kZSA9ICdUT0NIJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIHVwZGF0ZShzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJ1cGRhdGU6IGJyaW5nIGEgcHJvamVjdCBvciB0YXJnZXQgdXAgdG8gZGF0ZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdDV0lFJworICAgICAgICBfc3ViY29kZSA9ICdVUDJEJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCitjbGFzcyBzaW5nbGVfY2xhc3NfYnJvd3NlcihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInNpbmdsZSBjbGFzcyBicm93c2VyIC0gYSBzaW5nbGUgY2xhc3MgYnJvd3NlciAiIiIKKyAgICB3YW50ID0gJzFCUlcnCitjbGFzcyBfUHJvcF9pbmhlcml0cyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaW5oZXJpdHMgLSBhbGwgcHJvcGVydGllcyBhbmQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGNsYXNzIGFyZSBpbmhlcml0ZWQgYnkgdGhpcyBjbGFzcy4gIiIiCisgICAgd2hpY2ggPSAnY0AjXicKKyAgICB3YW50ID0gJ1RYVEQnCisKK3NpbmdsZV9jbGFzc19icm93c2VycyA9IHNpbmdsZV9jbGFzc19icm93c2VyCisKK2NsYXNzIHNpbmdsZV9jbGFzc19oaWVyYXJjaHkoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJzaW5nbGUgY2xhc3MgaGllcmFyY2h5IC0gYSBzaW5nbGUgY2xhc3MgaGllcmFyY2h5IGRvY3VtZW50ICIiIgorICAgIHdhbnQgPSAnMUhJUicKKworc2luZ2xlX2NsYXNzX2hpZXJhcmNoaWVzID0gc2luZ2xlX2NsYXNzX2hpZXJhcmNoeQorCitjbGFzcyBjbGFzc19icm93c2VyKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiY2xhc3MgYnJvd3NlciAtIGEgY2xhc3MgYnJvd3NlciAiIiIKKyAgICB3YW50ID0gJ0JST1cnCisKK2NsYXNzX2Jyb3dzZXJzID0gY2xhc3NfYnJvd3NlcgorCitjbGFzcyBmaWxlX2NvbXBhcmVfZG9jdW1lbnQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJmaWxlIGNvbXBhcmUgZG9jdW1lbnQgLSBhIGZpbGUgY29tcGFyZSBkb2N1bWVudCAiIiIKKyAgICB3YW50ID0gJ0NPTVAnCisKK2ZpbGVfY29tcGFyZV9kb2N1bWVudHMgPSBmaWxlX2NvbXBhcmVfZG9jdW1lbnQKKworY2xhc3MgY2F0YWxvZ19kb2N1bWVudChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImNhdGFsb2cgZG9jdW1lbnQgLSBhIGJyb3dzZXIgY2F0YWxvZyBkb2N1bWVudCAiIiIKKyAgICB3YW50ID0gJ0NUTEcnCisKK2NhdGFsb2dfZG9jdW1lbnRzID0gY2F0YWxvZ19kb2N1bWVudAorCitjbGFzcyBlZGl0b3JfZG9jdW1lbnQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJlZGl0b3IgZG9jdW1lbnQgLSBhbiBlZGl0b3IgZG9jdW1lbnQgIiIiCisgICAgd2FudCA9ICdFRElUJworCitlZGl0b3JfZG9jdW1lbnRzID0gZWRpdG9yX2RvY3VtZW50CisKK2NsYXNzIGNsYXNzX2hpZXJhcmNoeShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImNsYXNzIGhpZXJhcmNoeSAtIGEgY2xhc3MgaGllcmFyY2h5IGRvY3VtZW50ICIiIgorICAgIHdhbnQgPSAnSElFUicKKworY2xhc3NfaGllcmFyY2hpZXMgPSBjbGFzc19oaWVyYXJjaHkKKworY2xhc3MgcHJvamVjdF9pbnNwZWN0b3IoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJwcm9qZWN0IGluc3BlY3RvciAtIHRoZSBwcm9qZWN0IGluc3BlY3RvciAiIiIKKyAgICB3YW50ID0gJ0lOU1AnCisKK3Byb2plY3RfaW5zcGVjdG9ycyA9IHByb2plY3RfaW5zcGVjdG9yCisKK2NsYXNzIG1lc3NhZ2VfZG9jdW1lbnQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJtZXNzYWdlIGRvY3VtZW50IC0gYSBtZXNzYWdlIGRvY3VtZW50ICIiIgorICAgIHdhbnQgPSAnTVNTRycKKworbWVzc2FnZV9kb2N1bWVudHMgPSBtZXNzYWdlX2RvY3VtZW50CisKK2NsYXNzIGJ1aWxkX3Byb2dyZXNzX2RvY3VtZW50KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYnVpbGQgcHJvZ3Jlc3MgZG9jdW1lbnQgLSBhIGJ1aWxkIHByb2dyZXNzIGRvY3VtZW50ICIiIgorICAgIHdhbnQgPSAnUFJHUycKKworYnVpbGRfcHJvZ3Jlc3NfZG9jdW1lbnRzID0gYnVpbGRfcHJvZ3Jlc3NfZG9jdW1lbnQKKworY2xhc3MgcHJvamVjdF9kb2N1bWVudChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInByb2plY3QgZG9jdW1lbnQgLSBhIHByb2plY3QgZG9jdW1lbnQgIiIiCisgICAgd2FudCA9ICdQUkpEJworY2xhc3MgX1Byb3BfY3VycmVudF90YXJnZXQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImN1cnJlbnQgdGFyZ2V0IC0gdGhlIGN1cnJlbnQgdGFyZ2V0ICIiIgorICAgIHdoaWNoID0gJ0NVUlQnCisgICAgd2FudCA9ICdUUkdUJworIyAgICAgICAgZWxlbWVudCAnVFJHVCcgYXMgWydpbmR4JywgJ25hbWUnLCAndGVzdCcsICdyYW5nJ10KKworcHJvamVjdF9kb2N1bWVudHMgPSBwcm9qZWN0X2RvY3VtZW50CisKK2NsYXNzIHN1YnRhcmdldChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInN1YnRhcmdldCAtIGEgdGFyZ2V0IHRoYXQgaXMgcHJlcmVxdWlzaXRlIGZvciBhbm90aGVyIHRhcmdldCAiIiIKKyAgICB3YW50ID0gJ1NCVEcnCitjbGFzcyBfUHJvcF9saW5rX2FnYWluc3Rfb3V0cHV0KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJsaW5rIGFnYWluc3Qgb3V0cHV0IC0gaXMgdGhlIG91dHB1dCBvZiB0aGlzIHN1YnRhcmdldCBsaW5rZWQgaW50byBpdHMgZGVwZW5kZW50IHRhcmdldD8gIiIiCisgICAgd2hpY2ggPSAnTE5LTycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF90YXJnZXQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInRhcmdldCAtIHRoZSB0YXJnZXQgdGhhdCBpcyBkZXBlbmRlbnQgb24gdGhpcyBzdWJ0YXJnZXQgIiIiCisgICAgd2hpY2ggPSAnVHJnVCcKKyAgICB3YW50ID0gJ1RSR1QnCisKK3N1YnRhcmdldHMgPSBzdWJ0YXJnZXQKKworY2xhc3MgdGFyZ2V0X2ZpbGUoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJ0YXJnZXQgZmlsZSAtIGEgc291cmNlIG9yIGhlYWRlciBmaWxlIGluIGEgdGFyZ2V0ICIiIgorICAgIHdhbnQgPSAnU1JDRicKK2NsYXNzIF9Qcm9wX2NvZGVfc2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY29kZSBzaXplIC0gdGhlIHNpemUgb2YgdGhlIGNvZGUgKGluIGJ5dGVzKSBwcm9kdWNlZCBieSBjb21waWxpbmcgdGhpcyBzb3VyY2UgZmlsZSAiIiIKKyAgICB3aGljaCA9ICdDU1pFJworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX2NvbXBpbGVkX2RhdGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNvbXBpbGVkIGRhdGUgLSB0aGUgZGF0ZSBhbmQgdGhpcyBzb3VyY2UgZmlsZSB3YXMgbGFzdCBjb21waWxlZCAiIiIKKyAgICB3aGljaCA9ICdDTVBEJworICAgIHdhbnQgPSAnbGR0ICcKK2NsYXNzIF9Qcm9wX2RhdGFfc2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZGF0YSBzaXplIC0gdGhlIHNpemUgb2YgdGhlIGRhdGUgKGluIGJ5dGVzKSBwcm9kdWNlZCBieSBjb21waWxpbmcgdGhpcyBzb3VyY2UgZmlsZSAiIiIKKyAgICB3aGljaCA9ICdEU1pFJworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX2RlYnVnKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJkZWJ1ZyAtIGlzIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgZm9yIHRoaXMgc291cmNlIGZpbGU/ICIiIgorICAgIHdoaWNoID0gJ0RCVUcnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfZGVwZW5kZW50cyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZGVwZW5kZW50cyAtIHRoZSBzb3VyY2UgZmlsZXMgdGhhdCBuZWVkIHRoaXMgc291cmNlIGZpbGUgaW4gb3JkZXIgdG8gYnVpbGQgIiIiCisgICAgd2hpY2ggPSAnRFBORCcKKyAgICB3YW50ID0gJ2xpc3QnCitjbGFzcyBfUHJvcF9pZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaWQgLSB0aGUgdW5pcXVlIElEIG51bWJlciBvZiB0aGUgdGFyZ2V0IGZpbGUgIiIiCisgICAgd2hpY2ggPSAnSUQgICcKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF9pbml0X2JlZm9yZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaW5pdCBiZWZvcmUgLSBpcyB0aGUgXHhkNGluaXRpYWxpemUgYmVmb3JlXHhkNSBmbGFnIHNldCBmb3IgdGhpcyBzaGFyZWQgbGlicmFyeT8gIiIiCisgICAgd2hpY2ggPSAnSU5JVCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9saW5rX2luZGV4KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJsaW5rIGluZGV4IC0gdGhlIGluZGV4IG9mIHRoZSBzb3VyY2UgZmlsZSBpbiBpdHMgdGFyZ2V0XHhkNXMgbGluayBvcmRlciAoLTEgaWYgc291cmNlIGZpbGUgaXMgbm90IGluIGxpbmsgb3JkZXIpICIiIgorICAgIHdoaWNoID0gJ0xJRFgnCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3BfbGlua2VkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJsaW5rZWQgLSBpcyB0aGUgc291cmNlIGZpbGUgaW4gdGhlIGxpbmsgb3JkZXIgb2YgaXRzIHRhcmdldD8gIiIiCisgICAgd2hpY2ggPSAnTElOSycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9sb2NhdGlvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibG9jYXRpb24gLSB0aGUgbG9jYXRpb24gb2YgdGhlIHRhcmdldCBmaWxlIG9uIGRpc2sgIiIiCisgICAgd2hpY2ggPSAnRklMRScKKyAgICB3YW50ID0gJ2ZzcyAnCitjbGFzcyBfUHJvcF9tZXJnZV9vdXRwdXQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm1lcmdlIG91dHB1dCAtIGlzIHRoaXMgc2hhcmVkIGxpYnJhcnkgbWVyZ2VkIGludG8gYW5vdGhlciBjb2RlIGZyYWdtZW50PyAiIiIKKyAgICB3aGljaCA9ICdNUkdFJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX21vZGlmaWVkX2RhdGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm1vZGlmaWVkIGRhdGUgLSB0aGUgZGF0ZSBhbmQgdGltZSB0aGlzIHNvdXJjZSBmaWxlIHdhcyBsYXN0IG1vZGlmaWVkICIiIgorICAgIHdoaWNoID0gJ01PREQnCisgICAgd2FudCA9ICdsZHQgJworY2xhc3MgX1Byb3BfcGF0aChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicGF0aCAtIHRoZSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZSBvbiBkaXNrICIiIgorICAgIHdoaWNoID0gJ1BhdGgnCisgICAgd2FudCA9ICdpdHh0JworY2xhc3MgX1Byb3BfcHJlcmVxdWlzaXRlcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicHJlcmVxdWlzaXRlcyAtIHRoZSBzb3VyY2UgZmlsZXMgbmVlZGVkIHRvIGJ1aWxkIHRoaXMgc291cmNlIGZpbGUgIiIiCisgICAgd2hpY2ggPSAnUFJFUicKKyAgICB3YW50ID0gJ2xpc3QnCitjbGFzcyBfUHJvcF90eXBlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ0eXBlIC0gdGhlIHR5cGUgb2Ygc291cmNlIGZpbGUgIiIiCisgICAgd2hpY2ggPSAnRlRZUCcKKyAgICB3YW50ID0gJ0ZUWVAnCitjbGFzcyBfUHJvcF93ZWFrX2xpbmsoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIndlYWsgbGluayAtIGlzIHRoaXMgc2hhcmVkIGxpYnJhcnkgbGlua2VkIHdlYWtseT8gIiIiCisgICAgd2hpY2ggPSAnV0VBSycKKyAgICB3YW50ID0gJ2Jvb2wnCisKK3RhcmdldF9maWxlcyA9IHRhcmdldF9maWxlCisKK2NsYXNzIHN5bWJvbF9icm93c2VyKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIic3ltYm9sIGJyb3dzZXIgLSBhIHN5bWJvbCBicm93c2VyICIiIgorICAgIHdhbnQgPSAnU1lNQicKKworc3ltYm9sX2Jyb3dzZXJzID0gc3ltYm9sX2Jyb3dzZXIKKworY2xhc3MgVG9vbFNlcnZlcl93b3Jrc2hlZXQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJUb29sU2VydmVyIHdvcmtzaGVldCAtIGEgVG9vbFNlcnZlciB3b3Jrc2hlZXQgIiIiCisgICAgd2FudCA9ICdUT09MJworCitUb29sU2VydmVyX3dvcmtzaGVldHMgPSBUb29sU2VydmVyX3dvcmtzaGVldAorCitjbGFzcyB0YXJnZXQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJ0YXJnZXQgLSBhIHRhcmdldCBpbiBhIHByb2plY3QgIiIiCisgICAgd2FudCA9ICdUUkdUJworY2xhc3MgX1Byb3BfbmFtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibmFtZSAtICAiIiIKKyAgICB3aGljaCA9ICdwbmFtJworICAgIHdhbnQgPSAnaXR4dCcKK2NsYXNzIF9Qcm9wX3Byb2plY3RfZG9jdW1lbnQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInByb2plY3QgZG9jdW1lbnQgLSB0aGUgcHJvamVjdCBkb2N1bWVudCB0aGF0IGNvbnRhaW5zIHRoaXMgdGFyZ2V0ICIiIgorICAgIHdoaWNoID0gJ1ByakQnCisgICAgd2FudCA9ICdQUkpEJworIyAgICAgICAgZWxlbWVudCAnU0JURycgYXMgWydpbmR4JywgJ3Rlc3QnLCAncmFuZyddCisjICAgICAgICBlbGVtZW50ICdTUkNGJyBhcyBbJ2luZHgnLCAndGVzdCcsICdyYW5nJ10KKwordGFyZ2V0cyA9IHRhcmdldAorCitjbGFzcyB0ZXh0X2RvY3VtZW50KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidGV4dCBkb2N1bWVudCAtIGEgZG9jdW1lbnQgdGhhdCBjb250YWlucyB0ZXh0ICIiIgorICAgIHdhbnQgPSAnVFhURCcKK2NsYXNzIF9Qcm9wX21vZGlmaWVkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJtb2RpZmllZCAtIEhhcyB0aGUgZG9jdW1lbnQgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBzYXZlPyAiIiIKKyAgICB3aGljaCA9ICdpbW9kJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3NlbGVjdGlvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic2VsZWN0aW9uIC0gdGhlIHNlbGVjdGlvbiB2aXNpYmxlIHRvIHRoZSB1c2VyICIiIgorICAgIHdoaWNoID0gJ3NlbGUnCisgICAgd2FudCA9ICdjc2VsJworIyAgICAgICAgZWxlbWVudCAnY2hhICcgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NpbnMnIGFzIFsncmVsZSddCisjICAgICAgICBlbGVtZW50ICdjbGluJyBhcyBbJ2luZHgnLCAncmFuZycsICdyZWxlJ10KKyMgICAgICAgIGVsZW1lbnQgJ2N0eHQnIGFzIFsncmFuZyddCisKK3RleHRfZG9jdW1lbnRzID0gdGV4dF9kb2N1bWVudAorc2luZ2xlX2NsYXNzX2Jyb3dzZXIuX3N1cGVyY2xhc3NuYW1lcyA9IFsndGV4dF9kb2N1bWVudCddCitzaW5nbGVfY2xhc3NfYnJvd3Nlci5fcHJpdnByb3BkaWN0ID0geworICAgICdpbmhlcml0cycgOiBfUHJvcF9pbmhlcml0cywKK30KK3NpbmdsZV9jbGFzc19icm93c2VyLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitpbXBvcnQgU3RhbmRhcmRfU3VpdGUKK3NpbmdsZV9jbGFzc19oaWVyYXJjaHkuX3N1cGVyY2xhc3NuYW1lcyA9IFsnZG9jdW1lbnQnXQorc2luZ2xlX2NsYXNzX2hpZXJhcmNoeS5fcHJpdnByb3BkaWN0ID0geworICAgICdpbmhlcml0cycgOiBfUHJvcF9pbmhlcml0cywKK30KK3NpbmdsZV9jbGFzc19oaWVyYXJjaHkuX3ByaXZlbGVtZGljdCA9IHsKK30KK2NsYXNzX2Jyb3dzZXIuX3N1cGVyY2xhc3NuYW1lcyA9IFsndGV4dF9kb2N1bWVudCddCitjbGFzc19icm93c2VyLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2luaGVyaXRzJyA6IF9Qcm9wX2luaGVyaXRzLAorfQorY2xhc3NfYnJvd3Nlci5fcHJpdmVsZW1kaWN0ID0geworfQorZmlsZV9jb21wYXJlX2RvY3VtZW50Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ3RleHRfZG9jdW1lbnQnXQorZmlsZV9jb21wYXJlX2RvY3VtZW50Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2luaGVyaXRzJyA6IF9Qcm9wX2luaGVyaXRzLAorfQorZmlsZV9jb21wYXJlX2RvY3VtZW50Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitjYXRhbG9nX2RvY3VtZW50Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ3RleHRfZG9jdW1lbnQnXQorY2F0YWxvZ19kb2N1bWVudC5fcHJpdnByb3BkaWN0ID0geworICAgICdpbmhlcml0cycgOiBfUHJvcF9pbmhlcml0cywKK30KK2NhdGFsb2dfZG9jdW1lbnQuX3ByaXZlbGVtZGljdCA9IHsKK30KK2VkaXRvcl9kb2N1bWVudC5fc3VwZXJjbGFzc25hbWVzID0gWyd0ZXh0X2RvY3VtZW50J10KK2VkaXRvcl9kb2N1bWVudC5fcHJpdnByb3BkaWN0ID0geworICAgICdpbmhlcml0cycgOiBfUHJvcF9pbmhlcml0cywKK30KK2VkaXRvcl9kb2N1bWVudC5fcHJpdmVsZW1kaWN0ID0geworfQorY2xhc3NfaGllcmFyY2h5Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ2RvY3VtZW50J10KK2NsYXNzX2hpZXJhcmNoeS5fcHJpdnByb3BkaWN0ID0geworICAgICdpbmhlcml0cycgOiBfUHJvcF9pbmhlcml0cywKK30KK2NsYXNzX2hpZXJhcmNoeS5fcHJpdmVsZW1kaWN0ID0geworfQorcHJvamVjdF9pbnNwZWN0b3IuX3N1cGVyY2xhc3NuYW1lcyA9IFsnZG9jdW1lbnQnXQorcHJvamVjdF9pbnNwZWN0b3IuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnaW5oZXJpdHMnIDogX1Byb3BfaW5oZXJpdHMsCit9Citwcm9qZWN0X2luc3BlY3Rvci5fcHJpdmVsZW1kaWN0ID0geworfQorbWVzc2FnZV9kb2N1bWVudC5fc3VwZXJjbGFzc25hbWVzID0gWyd0ZXh0X2RvY3VtZW50J10KK21lc3NhZ2VfZG9jdW1lbnQuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnaW5oZXJpdHMnIDogX1Byb3BfaW5oZXJpdHMsCit9CittZXNzYWdlX2RvY3VtZW50Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitidWlsZF9wcm9ncmVzc19kb2N1bWVudC5fc3VwZXJjbGFzc25hbWVzID0gWydkb2N1bWVudCddCitidWlsZF9wcm9ncmVzc19kb2N1bWVudC5fcHJpdnByb3BkaWN0ID0geworICAgICdpbmhlcml0cycgOiBfUHJvcF9pbmhlcml0cywKK30KK2J1aWxkX3Byb2dyZXNzX2RvY3VtZW50Ll9wcml2ZWxlbWRpY3QgPSB7Cit9Citwcm9qZWN0X2RvY3VtZW50Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ2RvY3VtZW50J10KK3Byb2plY3RfZG9jdW1lbnQuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnY3VycmVudF90YXJnZXQnIDogX1Byb3BfY3VycmVudF90YXJnZXQsCisgICAgJ2luaGVyaXRzJyA6IF9Qcm9wX2luaGVyaXRzLAorfQorcHJvamVjdF9kb2N1bWVudC5fcHJpdmVsZW1kaWN0ID0geworICAgICd0YXJnZXQnIDogdGFyZ2V0LAorfQorc3VidGFyZ2V0Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ3RhcmdldCddCitzdWJ0YXJnZXQuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnaW5oZXJpdHMnIDogX1Byb3BfaW5oZXJpdHMsCisgICAgJ2xpbmtfYWdhaW5zdF9vdXRwdXQnIDogX1Byb3BfbGlua19hZ2FpbnN0X291dHB1dCwKKyAgICAndGFyZ2V0JyA6IF9Qcm9wX3RhcmdldCwKK30KK3N1YnRhcmdldC5fcHJpdmVsZW1kaWN0ID0geworfQordGFyZ2V0X2ZpbGUuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit0YXJnZXRfZmlsZS5fcHJpdnByb3BkaWN0ID0geworICAgICdjb2RlX3NpemUnIDogX1Byb3BfY29kZV9zaXplLAorICAgICdjb21waWxlZF9kYXRlJyA6IF9Qcm9wX2NvbXBpbGVkX2RhdGUsCisgICAgJ2RhdGFfc2l6ZScgOiBfUHJvcF9kYXRhX3NpemUsCisgICAgJ2RlYnVnJyA6IF9Qcm9wX2RlYnVnLAorICAgICdkZXBlbmRlbnRzJyA6IF9Qcm9wX2RlcGVuZGVudHMsCisgICAgJ2lkJyA6IF9Qcm9wX2lkLAorICAgICdpbml0X2JlZm9yZScgOiBfUHJvcF9pbml0X2JlZm9yZSwKKyAgICAnbGlua19pbmRleCcgOiBfUHJvcF9saW5rX2luZGV4LAorICAgICdsaW5rZWQnIDogX1Byb3BfbGlua2VkLAorICAgICdsb2NhdGlvbicgOiBfUHJvcF9sb2NhdGlvbiwKKyAgICAnbWVyZ2Vfb3V0cHV0JyA6IF9Qcm9wX21lcmdlX291dHB1dCwKKyAgICAnbW9kaWZpZWRfZGF0ZScgOiBfUHJvcF9tb2RpZmllZF9kYXRlLAorICAgICdwYXRoJyA6IF9Qcm9wX3BhdGgsCisgICAgJ3ByZXJlcXVpc2l0ZXMnIDogX1Byb3BfcHJlcmVxdWlzaXRlcywKKyAgICAndHlwZScgOiBfUHJvcF90eXBlLAorICAgICd3ZWFrX2xpbmsnIDogX1Byb3Bfd2Vha19saW5rLAorfQordGFyZ2V0X2ZpbGUuX3ByaXZlbGVtZGljdCA9IHsKK30KK3N5bWJvbF9icm93c2VyLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ3RleHRfZG9jdW1lbnQnXQorc3ltYm9sX2Jyb3dzZXIuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnaW5oZXJpdHMnIDogX1Byb3BfaW5oZXJpdHMsCit9CitzeW1ib2xfYnJvd3Nlci5fcHJpdmVsZW1kaWN0ID0geworfQorVG9vbFNlcnZlcl93b3Jrc2hlZXQuX3N1cGVyY2xhc3NuYW1lcyA9IFsndGV4dF9kb2N1bWVudCddCitUb29sU2VydmVyX3dvcmtzaGVldC5fcHJpdnByb3BkaWN0ID0geworICAgICdpbmhlcml0cycgOiBfUHJvcF9pbmhlcml0cywKK30KK1Rvb2xTZXJ2ZXJfd29ya3NoZWV0Ll9wcml2ZWxlbWRpY3QgPSB7Cit9Cit0YXJnZXQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit0YXJnZXQuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorICAgICdwcm9qZWN0X2RvY3VtZW50JyA6IF9Qcm9wX3Byb2plY3RfZG9jdW1lbnQsCit9Cit0YXJnZXQuX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnc3VidGFyZ2V0JyA6IHN1YnRhcmdldCwKKyAgICAndGFyZ2V0X2ZpbGUnIDogdGFyZ2V0X2ZpbGUsCit9Cit0ZXh0X2RvY3VtZW50Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ2RvY3VtZW50J10KK3RleHRfZG9jdW1lbnQuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnaW5oZXJpdHMnIDogX1Byb3BfaW5oZXJpdHMsCisgICAgJ21vZGlmaWVkJyA6IF9Qcm9wX21vZGlmaWVkLAorICAgICdzZWxlY3Rpb24nIDogX1Byb3Bfc2VsZWN0aW9uLAorfQordGV4dF9kb2N1bWVudC5fcHJpdmVsZW1kaWN0ID0geworICAgICdjaGFyYWN0ZXInIDogU3RhbmRhcmRfU3VpdGUuY2hhcmFjdGVyLAorICAgICdpbnNlcnRpb25fcG9pbnQnIDogU3RhbmRhcmRfU3VpdGUuaW5zZXJ0aW9uX3BvaW50LAorICAgICdsaW5lJyA6IFN0YW5kYXJkX1N1aXRlLmxpbmUsCisgICAgJ3RleHQnIDogU3RhbmRhcmRfU3VpdGUudGV4dCwKK30KK19FbnVtX0RLTkQgPSB7CisgICAgJ3Byb2plY3QnIDogJ1BSSkQnLCAjIGEgcHJvamVjdCBkb2N1bWVudAorICAgICdlZGl0b3JfZG9jdW1lbnQnIDogJ0VESVQnLCAjIGFuIGVkaXRvciBkb2N1bWVudAorICAgICdtZXNzYWdlJyA6ICdNU1NHJywgIyBhIG1lc3NhZ2UgZG9jdW1lbnQKKyAgICAnZmlsZV9jb21wYXJlJyA6ICdDT01QJywgICAgIyBhIGZpbGUgY29tcGFyZSBkb2N1bWVudAorICAgICdjYXRhbG9nX2RvY3VtZW50JyA6ICdDVExHJywgICAgICAgICMgYSBicm93c2VyIGNhdGFsb2cKKyAgICAnY2xhc3NfYnJvd3NlcicgOiAnQlJPVycsICAgIyBhIGNsYXNzIGJyb3dzZXIgZG9jdW1lbnQKKyAgICAnc2luZ2xlX2NsYXNzX2Jyb3dzZXInIDogJzFCUlcnLCAgICAjIGEgc2luZ2xlIGNsYXNzIGJyb3dzZXIgZG9jdW1lbnQKKyAgICAnc3ltYm9sX2Jyb3dzZXInIDogJ1NZTUInLCAgIyBhIHN5bWJvbCBicm93c2VyIGRvY3VtZW50CisgICAgJ2NsYXNzX2hpZXJhcmNoeScgOiAnSElFUicsICMgYSBjbGFzcyBoaWVyYXJjaHkgZG9jdW1lbnQKKyAgICAnc2luZ2xlX2NsYXNzX2hpZXJhcmNoeScgOiAnMUhJUicsICAjIGEgc2luZ2xlIGNsYXNzIGhpZXJhcmNoeSBkb2N1bWVudAorICAgICdwcm9qZWN0X2luc3BlY3RvcicgOiAnSU5TUCcsICAgICAgICMgYSBwcm9qZWN0IGluc3BlY3RvcgorICAgICdUb29sU2VydmVyX3dvcmtzaGVldCcgOiAnVE9PTCcsICAgICMgdGhlIFRvb2xTZXJ2ZXIgd29ya3NoZWV0CisgICAgJ2J1aWxkX3Byb2dyZXNzX2RvY3VtZW50JyA6ICdQUkdTJywgIyB0aGUgYnVpbGQgcHJvZ3Jlc3Mgd2luZG93Cit9CisKK19FbnVtX0ZUWVAgPSB7CisgICAgJ2xpYnJhcnlfZmlsZScgOiAnTElCRicsICAgICMgYSBsaWJyYXJ5IGZpbGUKKyAgICAncHJvamVjdF9maWxlJyA6ICdQUkpGJywgICAgIyBhIHByb2plY3QgZmlsZQorICAgICdyZXNvdXJjZV9maWxlJyA6ICdSRVNGJywgICAjIGEgcmVzb3VyY2UgZmlsZQorICAgICd0ZXh0X2ZpbGUnIDogJ1RYVEYnLCAgICAgICAjIGEgdGV4dCBmaWxlCisgICAgJ3Vua25vd25fZmlsZScgOiAnVU5LTicsICAgICMgdW5rbm93biBmaWxlIHR5cGUKK30KKworX0VudW1fSW50ZSA9IHsKKyAgICAnbmV2ZXJfaW50ZXJhY3QnIDogJ2VOdnInLCAgIyBuZXZlciBhbGxvdyB1c2VyIGludGVyYWN0aW9ucworICAgICdpbnRlcmFjdF93aXRoX3NlbGYnIDogJ2VJblMnLCAgICAgICMgYWxsb3cgdXNlciBpbnRlcmFjdGlvbiBvbmx5IHdoZW4gYW4gQXBwbGVFdmVudCBpcyBzZW50IGZyb20gd2l0aGluIENvZGVXYXJyaW9yCisgICAgJ2ludGVyYWN0X3dpdGhfbG9jYWwnIDogJ2VJbkwnLCAgICAgIyBhbGxvdyB1c2VyIGludGVyYWN0aW9uIHdoZW4gQXBwbGVFdmVudHMgYXJlIHNlbnQgZnJvbSBhcHBsaWNhdGlvbnMgb24gdGhlIHNhbWUgbWFjaGluZSAoZGVmYXVsdCkKKyAgICAnaW50ZXJhY3Rfd2l0aF9hbGwnIDogJ2VJbkEnLCAgICAgICAjIGFsbG93IHVzZXIgaW50ZXJhY3Rpb24gZnJvbSBib3RoIGxvY2FsIGFuZCByZW1vdGUgQXBwbGVFdmVudHMKK30KKworX0VudW1fUEVSTSA9IHsKKyAgICAncmVhZF93cml0ZScgOiAnUmRXcicsICAgICAgIyB0aGUgZmlsZSBpcyBvcGVuIHdpdGggcmVhZC93cml0ZSBwZXJtaXNzaW9uCisgICAgJ3JlYWRfb25seScgOiAnUmVhZCcsICAgICAgICMgdGhlIGZpbGUgaXMgb3BlbiB3aXRoIHJlYWQvb25seSBwZXJtaXNzaW9uCisgICAgJ2NoZWNrZWRfb3V0X3JlYWRfd3JpdGUnIDogJ0NrUlcnLCAgIyB0aGUgZmlsZSBpcyBjaGVja2VkIG91dCB3aXRoIHJlYWQvd3JpdGUgcGVybWlzc2lvbgorICAgICdjaGVja2VkX291dF9yZWFkX29ubHknIDogJ0NrUk8nLCAgICMgdGhlIGZpbGUgaXMgY2hlY2tlZCBvdXQgd2l0aCByZWFkL29ubHkgcGVybWlzc2lvbgorICAgICdjaGVja2VkX291dF9yZWFkX21vZGlmeScgOiAnQ2tSTScsICMgdGhlIGZpbGUgaXMgY2hlY2tlZCBvdXQgd2l0aCByZWFkL21vZGlmeSBwZXJtaXNzaW9uCisgICAgJ2xvY2tlZCcgOiAnTG9jaycsICAjIHRoZSBmaWxlIGlzIGxvY2tlZCBvbiBkaXNrCisgICAgJ25vbmUnIDogJ0xOTk8nLCAgICAjIHRoZSBmaWxlIGlzIG5ldworfQorCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICcxQlJXJyA6IHNpbmdsZV9jbGFzc19icm93c2VyLAorICAgICcxSElSJyA6IHNpbmdsZV9jbGFzc19oaWVyYXJjaHksCisgICAgJ0JST1cnIDogY2xhc3NfYnJvd3NlciwKKyAgICAnQ09NUCcgOiBmaWxlX2NvbXBhcmVfZG9jdW1lbnQsCisgICAgJ0NUTEcnIDogY2F0YWxvZ19kb2N1bWVudCwKKyAgICAnRURJVCcgOiBlZGl0b3JfZG9jdW1lbnQsCisgICAgJ0hJRVInIDogY2xhc3NfaGllcmFyY2h5LAorICAgICdJTlNQJyA6IHByb2plY3RfaW5zcGVjdG9yLAorICAgICdNU1NHJyA6IG1lc3NhZ2VfZG9jdW1lbnQsCisgICAgJ1BSR1MnIDogYnVpbGRfcHJvZ3Jlc3NfZG9jdW1lbnQsCisgICAgJ1BSSkQnIDogcHJvamVjdF9kb2N1bWVudCwKKyAgICAnU0JURycgOiBzdWJ0YXJnZXQsCisgICAgJ1NSQ0YnIDogdGFyZ2V0X2ZpbGUsCisgICAgJ1NZTUInIDogc3ltYm9sX2Jyb3dzZXIsCisgICAgJ1RPT0wnIDogVG9vbFNlcnZlcl93b3Jrc2hlZXQsCisgICAgJ1RSR1QnIDogdGFyZ2V0LAorICAgICdUWFREJyA6IHRleHRfZG9jdW1lbnQsCit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworICAgICdDTVBEJyA6IF9Qcm9wX2NvbXBpbGVkX2RhdGUsCisgICAgJ0NTWkUnIDogX1Byb3BfY29kZV9zaXplLAorICAgICdDVVJUJyA6IF9Qcm9wX2N1cnJlbnRfdGFyZ2V0LAorICAgICdEQlVHJyA6IF9Qcm9wX2RlYnVnLAorICAgICdEUE5EJyA6IF9Qcm9wX2RlcGVuZGVudHMsCisgICAgJ0RTWkUnIDogX1Byb3BfZGF0YV9zaXplLAorICAgICdGSUxFJyA6IF9Qcm9wX2xvY2F0aW9uLAorICAgICdGVFlQJyA6IF9Qcm9wX3R5cGUsCisgICAgJ0lEICAnIDogX1Byb3BfaWQsCisgICAgJ0lOSVQnIDogX1Byb3BfaW5pdF9iZWZvcmUsCisgICAgJ0xJRFgnIDogX1Byb3BfbGlua19pbmRleCwKKyAgICAnTElOSycgOiBfUHJvcF9saW5rZWQsCisgICAgJ0xOS08nIDogX1Byb3BfbGlua19hZ2FpbnN0X291dHB1dCwKKyAgICAnTU9ERCcgOiBfUHJvcF9tb2RpZmllZF9kYXRlLAorICAgICdNUkdFJyA6IF9Qcm9wX21lcmdlX291dHB1dCwKKyAgICAnUFJFUicgOiBfUHJvcF9wcmVyZXF1aXNpdGVzLAorICAgICdQYXRoJyA6IF9Qcm9wX3BhdGgsCisgICAgJ1ByakQnIDogX1Byb3BfcHJvamVjdF9kb2N1bWVudCwKKyAgICAnVHJnVCcgOiBfUHJvcF90YXJnZXQsCisgICAgJ1dFQUsnIDogX1Byb3Bfd2Vha19saW5rLAorICAgICdjQCNeJyA6IF9Qcm9wX2luaGVyaXRzLAorICAgICdpbW9kJyA6IF9Qcm9wX21vZGlmaWVkLAorICAgICdwbmFtJyA6IF9Qcm9wX25hbWUsCisgICAgJ3NlbGUnIDogX1Byb3Bfc2VsZWN0aW9uLAorfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7CisgICAgJ0RLTkQnIDogX0VudW1fREtORCwKKyAgICAnRlRZUCcgOiBfRW51bV9GVFlQLAorICAgICdJbnRlJyA6IF9FbnVtX0ludGUsCisgICAgJ1BFUk0nIDogX0VudW1fUEVSTSwKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL0NvZGVXYXJyaW9yX3N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL0NvZGVXYXJyaW9yX3N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjNiZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvQ29kZVdhcnJpb3Jfc3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL0NvZGVXYXJyaW9yX3N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL0NvZGVXYXJyaW9yX3N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjNiZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvQ29kZVdhcnJpb3Jfc3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL01ldHJvd2Vya3NfU2hlbGxfU3VpdGUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9NZXRyb3dlcmtzX1NoZWxsX1N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMWY2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9NZXRyb3dlcmtzX1NoZWxsX1N1aXRlLnB5CkBAIC0wLDAgKzEsMjM3MyBAQAorIiIiU3VpdGUgTWV0cm93ZXJrcyBTaGVsbCBTdWl0ZTogRXZlbnRzIHN1cHBvcnRlZCBieSB0aGUgTWV0cm93ZXJrcyBQcm9qZWN0IFNoZWxsCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1ZvbHVtZXMvU2FwL0FwcGxpY2F0aW9ucyAoTWFjIE9TIDkpL01ldHJvd2Vya3MgQ29kZVdhcnJpb3IgNy4wL01ldHJvd2Vya3MgQ29kZVdhcnJpb3IvQ29kZVdhcnJpb3IgSURFIDQuMi41CitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdNTVBSJworCitjbGFzcyBNZXRyb3dlcmtzX1NoZWxsX1N1aXRlX0V2ZW50czoKKworICAgIF9hcmdtYXBfQWRkX0ZpbGVzID0geworICAgICAgICAnVG9fU2VnbWVudCcgOiAnU2VnbScsCisgICAgfQorCisgICAgZGVmIEFkZF9GaWxlcyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiQWRkIEZpbGVzOiBBZGQgdGhlIHNwZWNpZmllZCBmaWxlKHMpIHRvIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IExpc3Qgb2YgZmlsZXMgdG8gYWRkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgVG9fU2VnbWVudDogU2VnbWVudCBudW1iZXIgaW50byB3aGljaCB0byBhZGQgdGhlIGZpbGUocykKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBFcnJvciBjb2RlIGZvciBlYWNoIGZpbGUgYWRkZWQKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ01NUFInCisgICAgICAgIF9zdWJjb2RlID0gJ0FkZEYnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfQWRkX0ZpbGVzKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfQ2hlY2tfU3ludGF4ID0geworICAgICAgICAnRXh0ZXJuYWxFZGl0b3InIDogJ0VycnMnLAorICAgIH0KKworICAgIGRlZiBDaGVja19TeW50YXgoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkNoZWNrIFN5bnRheDogQ2hlY2sgdGhlIHN5bnRheCBvZiB0aGUgc3BlY2lmaWVkIGZpbGUocykKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IExpc3Qgb2YgZmlsZXMgdG8gY2hlY2sgdGhlIHN5bnRheCBvZgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IEV4dGVybmFsRWRpdG9yOiBTaG91bGQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIHdpbmRvdyBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IEVycm9ycyBmb3IgZWFjaCBmaWxlIHdob3NlIHN5bnRheCB3YXMgY2hlY2tlZAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnQ2hlaycKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9DaGVja19TeW50YXgpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIENsb3NlX1Byb2plY3Qoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiQ2xvc2UgUHJvamVjdDogQ2xvc2UgdGhlIGN1cnJlbnQgcHJvamVjdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdDbHNQJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfQ2xvc2VfV2luZG93ID0geworICAgICAgICAnU2F2aW5nJyA6ICdzYXZvJywKKyAgICB9CisKKyAgICBkZWYgQ2xvc2VfV2luZG93KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJDbG9zZSBXaW5kb3c6IENsb3NlIHRoZSB3aW5kb3dzIHNob3dpbmcgdGhlIHNwZWNpZmllZCBmaWxlcworICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogVGhlIGZpbGVzIHRvIGNsb3NlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgU2F2aW5nOiBXaGV0aGVyIHRvIHNhdmUgY2hhbmdlcyB0byBlYWNoIGZpbGUgYmVmb3JlIGNsb3NpbmcgaXRzIHdpbmRvdworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdDbHNXJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX0Nsb3NlX1dpbmRvdykKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdzYXZvJywgX0VudW1fc2F2bykKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfQ29tcGlsZSA9IHsKKyAgICAgICAgJ0V4dGVybmFsRWRpdG9yJyA6ICdFcnJzJywKKyAgICB9CisKKyAgICBkZWYgQ29tcGlsZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiQ29tcGlsZTogQ29tcGlsZSB0aGUgc3BlY2lmaWVkIGZpbGUocykKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IExpc3Qgb2YgZmlsZXMgdG8gY29tcGlsZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IEV4dGVybmFsRWRpdG9yOiBTaG91bGQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIHdpbmRvdyBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IEVycm9ycyBmb3IgZWFjaCBmaWxlIGNvbXBpbGVkCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdDb21wJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX0NvbXBpbGUpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9DcmVhdGVfUHJvamVjdCA9IHsKKyAgICAgICAgJ2Zyb21fc3RhdGlvbmVyeScgOiAnVG1wbCcsCisgICAgfQorCisgICAgZGVmIENyZWF0ZV9Qcm9qZWN0KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJDcmVhdGUgUHJvamVjdDogQ3JlYXRlIGEgbmV3IHByb2plY3QgZmlsZQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogTmV3IHByb2plY3QgZmlsZSBzcGVjaWZpZXIKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBmcm9tX3N0YXRpb25lcnk6IHVuZG9jdW1lbnRlZCwgdHlwZWNvZGUgJ2FsaXMnCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ01NUFInCisgICAgICAgIF9zdWJjb2RlID0gJ05ld1AnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfQ3JlYXRlX1Byb2plY3QpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIEdldF9EZWZpbml0aW9uKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJHZXQgRGVmaW5pdGlvbjogUmV0dXJucyB0aGUgbG9jYXRpb24ocykgb2YgYSBnbG9iYWxseSBzY29wZWQgZnVuY3Rpb24gb3IgZGF0YSBvYmplY3QuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB1bmRvY3VtZW50ZWQsIHR5cGVjb2RlICdURVhUJworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHVuZG9jdW1lbnRlZCwgdHlwZWNvZGUgJ0ZEZWYnCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdHRGVmJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIEdldF9PcGVuX0RvY3VtZW50cyhzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJHZXQgT3BlbiBEb2N1bWVudHM6IFJldHVybnMgdGhlIGxpc3Qgb2Ygb3BlbiBkb2N1bWVudHMKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBUaGUgbGlzdCBvZiBkb2N1bWVudHMKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ01NUFInCisgICAgICAgIF9zdWJjb2RlID0gJ0dEb2MnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9HZXRfUHJlZmVyZW5jZXMgPSB7CisgICAgICAgICdvZicgOiAnUFJlYycsCisgICAgICAgICdmcm9tX3BhbmVsJyA6ICdQTmFtJywKKyAgICB9CisKKyAgICBkZWYgR2V0X1ByZWZlcmVuY2VzKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkdldCBQcmVmZXJlbmNlczogR2V0IHRoZSBwcmVmZXJlbmNlcyBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IG9mOiBOYW1lcyBvZiByZXF1ZXN0ZWQgcHJlZmVyZW5jZXMKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBmcm9tX3BhbmVsOiBOYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHBhbmVsCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogVGhlIHJlcXVlc3RlZCBwcmVmZXJlbmNlcworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnR3JlZicKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9HZXRfUHJlZmVyZW5jZXMpCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfR2V0X1Byb2plY3RfRmlsZSA9IHsKKyAgICAgICAgJ1NlZ21lbnQnIDogJ1NlZ20nLAorICAgIH0KKworICAgIGRlZiBHZXRfUHJvamVjdF9GaWxlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJHZXQgUHJvamVjdCBGaWxlOiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgYSBmaWxlIGluIHRoZSBwcm9qZWN0IHdpbmRvdy4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IFRoZSBpbmRleCBvZiB0aGUgZmlsZSB3aXRoaW4gaXRzIHNlZ21lbnQuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgU2VnbWVudDogVGhlIHNlZ21lbnQgY29udGFpbmluZyB0aGUgZmlsZS4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB1bmRvY3VtZW50ZWQsIHR5cGVjb2RlICdTcmNGJworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnR0ZpbCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9HZXRfUHJvamVjdF9GaWxlKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBHZXRfUHJvamVjdF9TcGVjaWZpZXIoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiR2V0IFByb2plY3QgU3BlY2lmaWVyOiBSZXR1cm4gdGhlIEZpbGUgU3BlY2lmaWVyIGZvciB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogRmlsZSBTcGVjaWZpZXIgZm9yIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ01NUFInCisgICAgICAgIF9zdWJjb2RlID0gJ0dldFAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIEdldF9TZWdtZW50cyhzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJHZXQgU2VnbWVudHM6IFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiBlYWNoIHNlZ21lbnQgaW4gdGhlIHByb2plY3QuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdW5kb2N1bWVudGVkLCB0eXBlY29kZSAnU2VnICcKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ01NUFInCisgICAgICAgIF9zdWJjb2RlID0gJ0dTZWcnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIEdldF9tZW1iZXJfZnVuY3Rpb25fbmFtZXMoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkdldCBtZW1iZXIgZnVuY3Rpb24gbmFtZXM6IFJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB0aGUgbWVtYmVyIGZ1bmN0aW9ucyBvZiBhIGNsYXNzIG9iamVjdAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogbXVzdCBiZSBhIGNsYXNzIG9iamVjdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHVuZG9jdW1lbnRlZCwgdHlwZWNvZGUgJ2xpc3QnCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdNYkZOJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIEdldF9ub25zaW1wbGVfY2xhc3NlcyhzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJHZXQgbm9uc2ltcGxlIGNsYXNzZXM6IFJldHVybnMgYW4gYWxwaGFiZXRpY2FsIGxpc3Qgb2YgY2xhc3NlcyB3aXRoIG1lbWJlciBmdW5jdGlvbnMsIGJhc2VzIGNsYXNzZXMsIG9yIHN1YmNsYXNzZXMKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB1bmRvY3VtZW50ZWQsIHR5cGVjb2RlICdsaXN0JworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnTnNDbCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgR290b19GdW5jdGlvbihzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiR290byBGdW5jdGlvbjogR290byBTcGVjaWZpZWQgRnVuY3Rpb24gTmFtZQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdW5kb2N1bWVudGVkLCB0eXBlY29kZSAnVEVYVCcKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnR29GbicKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBHb3RvX0xpbmUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkdvdG8gTGluZTogR290byBTcGVjaWZpZWQgTGluZSBOdW1iZXIKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IFRoZSByZXF1ZXN0ZWQgc291cmNlIGZpbGUgbGluZSBudW1iZXIKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnR29MbicKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBJc19Jbl9Qcm9qZWN0KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJJcyBJbiBQcm9qZWN0OiBXaGV0aGVyIG9yIG5vdCB0aGUgc3BlY2lmaWVkIGZpbGUocykgaXMgaW4gdGhlIGN1cnJlbnQgcHJvamVjdAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogTGlzdCBvZiBmaWxlcyB0byBjaGVjayBmb3IgcHJvamVjdCBtZW1iZXJzaGlwCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogUmVzdWx0IGNvZGUgZm9yIGVhY2ggZmlsZQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnRkluUCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfTWFrZV9Qcm9qZWN0ID0geworICAgICAgICAnRXh0ZXJuYWxFZGl0b3InIDogJ0VycnMnLAorICAgIH0KKworICAgIGRlZiBNYWtlX1Byb2plY3Qoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiTWFrZSBQcm9qZWN0OiBNYWtlIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBFeHRlcm5hbEVkaXRvcjogU2hvdWxkIHRoZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZSB3aW5kb3cgYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlcj8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBFcnJvcnMgdGhhdCBvY2N1cnJlZCB3aGlsZSBtYWtpbmcgdGhlIHByb2plY3QKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ01NUFInCisgICAgICAgIF9zdWJjb2RlID0gJ01ha2UnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfTWFrZV9Qcm9qZWN0KQorICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgT3Blbl9icm93c2VyKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJPcGVuIGJyb3dzZXI6IERpc3BsYXkgYSBjbGFzcywgbWVtYmVyIGZ1bmN0aW9uLCBvciBkYXRhIG1lbWJlciBvYmplY3QgaW4gYSBzaW5nbGUgY2xhc3MgYnJvd3NlciB3aW5kb3cKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnQnJvdycKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfUHJlY29tcGlsZSA9IHsKKyAgICAgICAgJ1NhdmluZ19BcycgOiAnVGFyZycsCisgICAgICAgICdFeHRlcm5hbEVkaXRvcicgOiAnRXJycycsCisgICAgfQorCisgICAgZGVmIFByZWNvbXBpbGUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIlByZWNvbXBpbGU6IFByZWNvbXBpbGUgdGhlIHNwZWNpZmllZCBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gZmlsZQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogRmlsZSB0byBwcmVjb21waWxlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgU2F2aW5nX0FzOiBEZXN0aW5hdGlvbiBmaWxlIGZvciBwcmVjb21waWxlZCBoZWFkZXIKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBFeHRlcm5hbEVkaXRvcjogU2hvdWxkIHRoZSBjb250ZW50cyBvZiB0aGUgbWVzc2FnZSB3aW5kb3cgYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlcj8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBFcnJvcnMgZm9yIHRoZSBwcmVjb21waWxlZCBmaWxlCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdQcmVDJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX1ByZWNvbXBpbGUpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9QcmVwcm9jZXNzID0geworICAgICAgICAnRXh0ZXJuYWxFZGl0b3InIDogJ0VycnMnLAorICAgIH0KKworICAgIGRlZiBQcmVwcm9jZXNzKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJQcmVwcm9jZXNzOiBQcmVwcm9jZXNzZXMgdGhlIHNwZWNpZmllZCBmaWxlKHMpCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB1bmRvY3VtZW50ZWQsIHR5cGVjb2RlICdhbGlzJworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IEV4dGVybmFsRWRpdG9yOiB1bmRvY3VtZW50ZWQsIHR5cGVjb2RlICdib29sJworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IEVycm9ycyBmb3IgZWFjaCBwcmVwcm9jZXNzZWQgZmlsZQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnUHJlUCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9QcmVwcm9jZXNzKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBSZW1vdmVfQmluYXJpZXMoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiUmVtb3ZlIEJpbmFyaWVzOiBSZW1vdmUgdGhlIGJpbmFyeSBvYmplY3QgY29kZSBmcm9tIHRoZSBjdXJyZW50IHByb2plY3QKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnUmVtQicKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgUmVtb3ZlX0ZpbGVzKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJSZW1vdmUgRmlsZXM6IFJlbW92ZSB0aGUgc3BlY2lmaWVkIGZpbGUocykgZnJvbSB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBMaXN0IG9mIGZpbGVzIHRvIHJlbW92ZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IEVycm9yIGNvZGUgZm9yIGVhY2ggZmlsZSByZW1vdmVkCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdSZW1GJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIFJlc2V0X0ZpbGVfUGF0aHMoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiUmVzZXQgRmlsZSBQYXRoczogUmVzZXRzIGFjY2VzcyBwYXRocyBmb3IgYWxsIGZpbGVzIGJlbG9uZ2luZyB0byBvcGVuIHByb2plY3QuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ01NUFInCisgICAgICAgIF9zdWJjb2RlID0gJ1JlRlAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9SdW5fUHJvamVjdCA9IHsKKyAgICAgICAgJ0V4dGVybmFsRWRpdG9yJyA6ICdFcnJzJywKKyAgICAgICAgJ1NvdXJjZURlYnVnZ2VyJyA6ICdEZUJnJywKKyAgICB9CisKKyAgICBkZWYgUnVuX1Byb2plY3Qoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiUnVuIFByb2plY3Q6IFJ1biB0aGUgY3VycmVudCBwcm9qZWN0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgRXh0ZXJuYWxFZGl0b3I6IFNob3VsZCB0aGUgY29udGVudHMgb2YgdGhlIG1lc3NhZ2Ugd2luZG93IGJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXI/CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgU291cmNlRGVidWdnZXI6IFJ1biB0aGUgYXBwbGljYXRpb24gdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIHNvdXJjZS1sZXZlbCBkZWJ1Z2dlcgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IEVycm9ycyB0aGF0IG9jY3VycmVkIHdoZW4gcnVubmluZyB0aGUgcHJvamVjdAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnUnVuUCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9SdW5fUHJvamVjdCkKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIFNhdmVfRXJyb3JfV2luZG93X0FzKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJTYXZlIEVycm9yIFdpbmRvdyBBczogU2F2ZXMgdGhlIEVycm9ycyAmIFdhcm5pbmdzIHdpbmRvdyBhcyBhIHRleHQgZmlsZQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogRGVzdGluYXRpb24gZmlsZSBmb3IgU2F2ZSBNZXNzYWdlIFdpbmRvdyBBcworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdTdk1zJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIFNldF9DdXJyZW50X1RhcmdldChzZWxmLCBfb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJTZXQgQ3VycmVudCBUYXJnZXQ6IFNldCB0aGUgY3VycmVudCB0YXJnZXQgb2YgYSBwcm9qZWN0CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBOYW1lIG9mIHRhcmdldAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdTVHJnJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIFNldF9EZWZhdWx0X1Byb2plY3Qoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIlNldCBEZWZhdWx0IFByb2plY3Q6IFNldCB0aGUgZGVmYXVsdCBwcm9qZWN0CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBOYW1lIG9mIHByb2plY3QKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnU0RmUCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfU2V0X01vZGlmaWNhdGlvbl9EYXRlID0geworICAgICAgICAndG8nIDogJ01EYXQnLAorICAgIH0KKworICAgIGRlZiBTZXRfTW9kaWZpY2F0aW9uX0RhdGUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIlNldCBNb2RpZmljYXRpb24gRGF0ZTogQ2hhbmdlcyB0aGUgaW50ZXJuYWwgbW9kaWZpY2F0aW9uIGRhdGUgb2YgdGhlIHNwZWNpZmllZCBmaWxlKHMpCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBMaXN0IG9mIGZpbGVzCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG86IHVuZG9jdW1lbnRlZCwgdHlwZWNvZGUgJ2xkdCAnCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogRXJyb3IgY29kZSBmb3IgZWFjaCBtb2RpZmllZCBmaWxlCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdTTW9kJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX1NldF9Nb2RpZmljYXRpb25fRGF0ZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX1NldF9QcmVmZXJlbmNlcyA9IHsKKyAgICAgICAgJ29mX3BhbmVsJyA6ICdQTmFtJywKKyAgICAgICAgJ3RvJyA6ICdQUmVjJywKKyAgICB9CisKKyAgICBkZWYgU2V0X1ByZWZlcmVuY2VzKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIlNldCBQcmVmZXJlbmNlczogU2V0IHRoZSBwcmVmZXJlbmNlcyBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IG9mX3BhbmVsOiBOYW1lIG9mIHRoZSBwcmVmZXJlbmNlIHBhbmVsCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG86IFByZWZlcmVuY2VzIHNldHRpbmdzCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ01NUFInCisgICAgICAgIF9zdWJjb2RlID0gJ1ByZWYnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfU2V0X1ByZWZlcmVuY2VzKQorICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX1NldF9Qcm9qZWN0X0ZpbGUgPSB7CisgICAgICAgICd0bycgOiAnU3JjUycsCisgICAgfQorCisgICAgZGVmIFNldF9Qcm9qZWN0X0ZpbGUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIlNldCBQcm9qZWN0IEZpbGU6IENoYW5nZXMgdGhlIHNldHRpbmdzIGZvciBhIGdpdmVuIGZpbGUgaW4gdGhlIHByb2plY3QuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBUaGUgbmFtZSBvZiB0aGUgZmlsZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRvOiBUaGUgbmV3IHNldHRpbmdzIGZvciB0aGUgZmlsZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdTRmlsJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX1NldF9Qcm9qZWN0X0ZpbGUpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9TZXRfU2VnbWVudCA9IHsKKyAgICAgICAgJ3RvJyA6ICdTZWdtJywKKyAgICB9CisKKyAgICBkZWYgU2V0X1NlZ21lbnQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIlNldCBTZWdtZW50OiBDaGFuZ2VzIHRoZSBuYW1lIGFuZCBhdHRyaWJ1dGVzIG9mIGEgc2VnbWVudC4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IFRoZSBzZWdtZW50IHRvIGNoYW5nZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRvOiBUaGUgbmV3IG5hbWUgYW5kIGF0dHJpYnV0ZXMgZm9yIHRoZSBzZWdtZW50LgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdTU2VnJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX1NldF9TZWdtZW50KQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBUb3VjaChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiVG91Y2g6IEZvcmNlIHJlY29tcGlsYXRpb24gb2YgdGhlIHNwZWNpZmllZCBmaWxlKHMpCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBMaXN0IG9mIGZpbGVzIHRvIGNvbXBpbGUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBFcnJvciBjb2RlIGZvciBlYWNoIGZpbGUgdG91Y2hlZAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU1QUicKKyAgICAgICAgX3N1YmNvZGUgPSAnVG9jaCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfVXBkYXRlX1Byb2plY3QgPSB7CisgICAgICAgICdFeHRlcm5hbEVkaXRvcicgOiAnRXJycycsCisgICAgfQorCisgICAgZGVmIFVwZGF0ZV9Qcm9qZWN0KHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIlVwZGF0ZSBQcm9qZWN0OiBVcGRhdGUgdGhlIGN1cnJlbnQgcHJvamVjdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IEV4dGVybmFsRWRpdG9yOiBTaG91bGQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtZXNzYWdlIHdpbmRvdyBiZSByZXR1cm5lZCB0byB0aGUgY2FsbGVyPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IEVycm9ycyB0aGF0IG9jY3VycmVkIHdoaWxlIHVwZGF0aW5nIHRoZSBwcm9qZWN0CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNTVBSJworICAgICAgICBfc3ViY29kZSA9ICdVcGRQJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX1VwZGF0ZV9Qcm9qZWN0KQorICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKworY2xhc3MgQnJvd3Nlcl9Db2xvcmluZyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkJyb3dzZXIgQ29sb3JpbmcgLSBDb2xvcnMgZm9yIEJyb3dzZXIgc3ltYm9scy4gIiIiCisgICAgd2FudCA9ICdCUktXJworY2xhc3MgX1Byb3BfQnJvd3Nlcl9LZXl3b3JkcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiQnJvd3NlciBLZXl3b3JkcyAtIE1hcmsgQnJvd3NlciBzeW1ib2xzIHdpdGggY29sb3IuICIiIgorICAgIHdoaWNoID0gJ0JXMDAnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfQ2xhc3Nlc19Db2xvcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiQ2xhc3NlcyBDb2xvciAtIFRoZSBjb2xvciBmb3IgY2xhc3Nlcy4gIiIiCisgICAgd2hpY2ggPSAnQlcwMScKKyAgICB3YW50ID0gJ2NSR0InCitjbGFzcyBfUHJvcF9Db25zdGFudHNfQ29sb3IoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkNvbnN0YW50cyBDb2xvciAtIFRoZSBjb2xvciBmb3IgY29uc3RhbnRzLiAiIiIKKyAgICB3aGljaCA9ICdCVzAyJworICAgIHdhbnQgPSAnY1JHQicKK2NsYXNzIF9Qcm9wX0VudW1zX0NvbG9yKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJFbnVtcyBDb2xvciAtIFRoZSBjb2xvciBmb3IgZW51bXMuICIiIgorICAgIHdoaWNoID0gJ0JXMDMnCisgICAgd2FudCA9ICdjUkdCJworY2xhc3MgX1Byb3BfRnVuY3Rpb25zX0NvbG9yKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJGdW5jdGlvbnMgQ29sb3IgLSBTZXQgY29sb3IgZm9yIGZ1bmN0aW9ucy4gIiIiCisgICAgd2hpY2ggPSAnQlcwNCcKKyAgICB3YW50ID0gJ2NSR0InCitjbGFzcyBfUHJvcF9HbG9iYWxzX0NvbG9yKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJHbG9iYWxzIENvbG9yIC0gVGhlIGNvbG9yIGZvciBnbG9iYWxzICIiIgorICAgIHdoaWNoID0gJ0JXMDUnCisgICAgd2FudCA9ICdjUkdCJworY2xhc3MgX1Byb3BfTWFjcm9zX0NvbG9yKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJNYWNyb3MgQ29sb3IgLSBUaGUgY29sb3IgZm9yIG1hY3Jvcy4gIiIiCisgICAgd2hpY2ggPSAnQlcwNicKKyAgICB3YW50ID0gJ2NSR0InCitjbGFzcyBfUHJvcF9UZW1wbGF0ZV9Db21tYW5kc19pbl9NZW51KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJUZW1wbGF0ZSBDb21tYW5kcyBpbiBNZW51IC0gSW5jbHVkZSB0ZW1wbGF0ZSBjb21tYW5kcyBpbiBjb250ZXh0IG1lbnVzICIiIgorICAgIHdoaWNoID0gJ0JXMTAnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfVGVtcGxhdGVzX0NvbG9yKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJUZW1wbGF0ZXMgQ29sb3IgLSBTZXQgY29sb3IgZm9yIHRlbXBsYXRlcy4gIiIiCisgICAgd2hpY2ggPSAnQlcwNycKKyAgICB3YW50ID0gJ2NSR0InCitjbGFzcyBfUHJvcF9UeXBlZGVmc19Db2xvcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiVHlwZWRlZnMgQ29sb3IgLSBUaGUgY29sb3IgZm9yIHR5cGVkZWZzLiAiIiIKKyAgICB3aGljaCA9ICdCVzA4JworICAgIHdhbnQgPSAnY1JHQicKKworY2xhc3MgQnVpbGRfU2V0dGluZ3MoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJCdWlsZCBTZXR0aW5ncyAtIEJ1aWxkIFNldHRpbmdzIHByZWZlcmVuY2VzLiAiIiIKKyAgICB3YW50ID0gJ0JTVEcnCitjbGFzcyBfUHJvcF9CdWlsZF9CZWZvcmVfUnVubmluZyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiQnVpbGQgQmVmb3JlIFJ1bm5pbmcgLSBCdWlsZCB0aGUgdGFyZ2V0IGJlZm9yZSBydW5uaW5nLiAiIiIKKyAgICB3aGljaCA9ICdCWDA0JworICAgIHdhbnQgPSAnQlhicicKK2NsYXNzIF9Qcm9wX0NvbXBpbGVyX1RocmVhZF9TdGFja19TaXplKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJDb21waWxlciBUaHJlYWQgU3RhY2sgU2l6ZSAtIENvbXBpbGVyIFRocmVhZCBTdGFjayBTaXplICIiIgorICAgIHdoaWNoID0gJ0JYMDYnCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3BfQ29tcGxldGlvbl9Tb3VuZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiQ29tcGxldGlvbiBTb3VuZCAtIFBsYXkgYSBzb3VuZCB3aGVuIGZpbmlzaGVkIGEgQnJpbmcgVXAgVG8gRGF0ZSBvciBNYWtlIGNvbW1hbmQuICIiIgorICAgIHdoaWNoID0gJ0JYMDEnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfRmFpbHVyZV9Tb3VuZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiRmFpbHVyZSBTb3VuZCAtIFRoZSBzb3VuZCBDb2RlV2FycmlvciBwbGF5cyB3aGVuIGl0IGNhbm5vdCBmaW5pc2ggYSBCcmluZyBVcCBUbyBEYXRlIG9yIE1ha2UgY29tbWFuZC4gIiIiCisgICAgd2hpY2ggPSAnQlgwMycKKyAgICB3YW50ID0gJ1RFWFQnCitjbGFzcyBfUHJvcF9JbmNsdWRlX0NhY2hlX1NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkluY2x1ZGUgQ2FjaGUgU2l6ZSAtIEluY2x1ZGUgZmlsZSBjYWNoZSBzaXplLiAiIiIKKyAgICB3aGljaCA9ICdCWDA1JworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX1NhdmVfQmVmb3JlX0J1aWxkaW5nKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJTYXZlIEJlZm9yZSBCdWlsZGluZyAtIFNhdmUgb3BlbiBlZGl0b3IgZmlsZXMgYmVmb3JlIGJ1aWxkIG9wZXJhdGlvbnMgIiIiCisgICAgd2hpY2ggPSAnQlgwNycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9TdWNjZXNzX1NvdW5kKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJTdWNjZXNzIFNvdW5kIC0gVGhlIHNvdW5kIENvZGVXYXJyaW9yIHBsYXlzIHdoZW4gaXQgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVzIGEgQnJpbmcgVXAgVG8gRGF0ZSBvciBNYWtlIGNvbW1hbmQuICIiIgorICAgIHdoaWNoID0gJ0JYMDInCisgICAgd2FudCA9ICdURVhUJworCitjbGFzcyBiYXNlX2NsYXNzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYmFzZSBjbGFzcyAtIEEgYmFzZSBjbGFzcyBvciBzdXBlciBjbGFzcyBvZiBhIGNsYXNzICIiIgorICAgIHdhbnQgPSAnQnNDbCcKK2NsYXNzIF9Qcm9wX2FjY2VzcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiYWNjZXNzIC0gICIiIgorICAgIHdoaWNoID0gJ0FjY2UnCisgICAgd2FudCA9ICdBY2NlJworY2xhc3MgX1Byb3BfY2xhc3NfKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjbGFzcyAtIFRoZSBjbGFzcyBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGlzIGJhc2UgY2xhc3MgIiIiCisgICAgd2hpY2ggPSAnQ2xhcycKKyAgICB3YW50ID0gJ29iaiAnCitjbGFzcyBfUHJvcF92aXJ0dWFsKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ2aXJ0dWFsIC0gICIiIgorICAgIHdoaWNoID0gJ1ZpcnQnCisgICAgd2FudCA9ICdib29sJworCitiYXNlX2NsYXNzZXMgPSBiYXNlX2NsYXNzCisKK2NsYXNzIEN1c3RvbV9LZXl3b3JkcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkN1c3RvbSBLZXl3b3JkcyAtICAiIiIKKyAgICB3YW50ID0gJ0NVS1cnCitjbGFzcyBfUHJvcF9DdXN0b21fQ29sb3JfMShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiQ3VzdG9tIENvbG9yIDEgLSBUaGUgY29sb3IgZm9yIHRoZSBmaXJzdCBzZXQgb2YgY3VzdG9tIGtleXdvcmRzLiAiIiIKKyAgICB3aGljaCA9ICdHSDA1JworICAgIHdhbnQgPSAnY1JHQicKK2NsYXNzIF9Qcm9wX0N1c3RvbV9Db2xvcl8yKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJDdXN0b20gQ29sb3IgMiAtIFRoZSBjb2xvciBmb3IgdGhlIHNlY29uZCBzZXQgY3VzdG9tIGtleXdvcmRzLiAiIiIKKyAgICB3aGljaCA9ICdHSDA2JworICAgIHdhbnQgPSAnY1JHQicKK2NsYXNzIF9Qcm9wX0N1c3RvbV9Db2xvcl8zKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJDdXN0b20gQ29sb3IgMyAtIFRoZSBjb2xvciBmb3IgdGhlIHRoaXJkIHNldCBvZiBjdXN0b20ga2V5d29yZHMuICIiIgorICAgIHdoaWNoID0gJ0dIMDcnCisgICAgd2FudCA9ICdjUkdCJworY2xhc3MgX1Byb3BfQ3VzdG9tX0NvbG9yXzQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkN1c3RvbSBDb2xvciA0IC0gVGhlIGNvbG9yIGZvciB0aGUgZm91cnRoIHNldCBvZiBjdXN0b20ga2V5d29yZHMuICIiIgorICAgIHdoaWNoID0gJ0dIMDgnCisgICAgd2FudCA9ICdjUkdCJworCitjbGFzcyBicm93c2VyX2NhdGFsb2coYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJicm93c2VyIGNhdGFsb2cgLSBUaGUgYnJvd3NlciBzeW1ib2wgY2F0YWxvZyBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdCAiIiIKKyAgICB3YW50ID0gJ0NhdGEnCisjICAgICAgICBlbGVtZW50ICdDbGFzJyBhcyBbJ2luZHgnLCAnbmFtZSddCisKK2NsYXNzIGNsYXNzXyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImNsYXNzIC0gQSBjbGFzcywgc3RydWN0LCBvciByZWNvcmQgdHlwZSBpbiB0aGUgY3VycmVudCBwcm9qZWN0LiAiIiIKKyAgICB3YW50ID0gJ0NsYXMnCitjbGFzcyBfUHJvcF9hbGxfc3ViY2xhc3NlcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiYWxsIHN1YmNsYXNzZXMgLSB0aGUgY2xhc3NlcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGRlcml2ZWQgZnJvbSB0aGlzIGNsYXNzICIiIgorICAgIHdoaWNoID0gJ1N1YkEnCisgICAgd2FudCA9ICdDbGFzJworY2xhc3MgX1Byb3BfZGVjbGFyYXRpb25fZW5kX29mZnNldChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZGVjbGFyYXRpb24gZW5kIG9mZnNldCAtIEVuZCBvZiBjbGFzcyBkZWNsYXJhdGlvbiAiIiIKKyAgICB3aGljaCA9ICdEY0VuJworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX2RlY2xhcmF0aW9uX2ZpbGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImRlY2xhcmF0aW9uIGZpbGUgLSBTb3VyY2UgZmlsZSBjb250YWluaW5nIHRoZSBjbGFzcyBkZWNsYXJhdGlvbiAiIiIKKyAgICB3aGljaCA9ICdEY0ZsJworICAgIHdhbnQgPSAnZnNzICcKK2NsYXNzIF9Qcm9wX2RlY2xhcmF0aW9uX3N0YXJ0X29mZnNldChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZGVjbGFyYXRpb24gc3RhcnQgb2Zmc2V0IC0gU3RhcnQgb2YgY2xhc3MgZGVjbGFyYXRpb24gc291cmNlIGNvZGUgIiIiCisgICAgd2hpY2ggPSAnRGNTdCcKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF9sYW5ndWFnZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibGFuZ3VhZ2UgLSBJbXBsZW1lbnRhdGlvbiBsYW5ndWFnZSBvZiB0aGlzIGNsYXNzICIiIgorICAgIHdoaWNoID0gJ0xhbmcnCisgICAgd2FudCA9ICdMYW5nJworY2xhc3MgX1Byb3BfbmFtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibmFtZSAtICAiIiIKKyAgICB3aGljaCA9ICdwbmFtJworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX3N1YmNsYXNzZXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInN1YmNsYXNzZXMgLSB0aGUgaW1tZWRpYXRlIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyAiIiIKKyAgICB3aGljaCA9ICdTdWJDJworICAgIHdhbnQgPSAnQ2xhcycKKyMgICAgICAgIGVsZW1lbnQgJ0JzQ2wnIGFzIFsnaW5keCddCisjICAgICAgICBlbGVtZW50ICdEdE1iJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdNYkZuJyBhcyBbJ2luZHgnLCAnbmFtZSddCisKK2NsYXNzZXMgPSBjbGFzc18KKworY2xhc3MgRGVidWdnZXJfRGlzcGxheShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkRlYnVnZ2VyIERpc3BsYXkgLSBEZWJ1Z2dlciBEaXNwbGF5IHByZWZlcmVuY2VzICIiIgorICAgIHdhbnQgPSAnRGJEUycKK2NsYXNzIF9Qcm9wX0RlZmF1bHRfQXJyYXlfU2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiRGVmYXVsdCBBcnJheSBTaXplIC0gQ29udHJvbHMgd2hldGhlciBDb2RlV2FycmlvciB1c2VzIGl0cyBvd24gaW50ZWdyYXRlZCBlZGl0b3Igb3IgYW4gZXh0ZXJuYWwgYXBwbGljYXRpb24gZm9yIGVkaXRpbmcgdGV4dCBmaWxlcy4gIiIiCisgICAgd2hpY2ggPSAnRGIwOCcKKyAgICB3YW50ID0gJ3Nob3InCitjbGFzcyBfUHJvcF9TaG93X0FzX0RlY2ltYWwoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlNob3cgQXMgRGVjaW1hbCAtIFNob3cgdmFyaWFibGUgdmFsdWVzIGFzIGRlY2ltYWwgYnkgZGVmYXVsdCAiIiIKKyAgICB3aGljaCA9ICdEYjEwJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX1Nob3dfTG9jYWxzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJTaG93IExvY2FscyAtIFNob3cgbG9jYWxzIGJ5IGRlZmF1bHQgIiIiCisgICAgd2hpY2ggPSAnRGIwOScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9TaG93X1ZhcmlhYmxlX1R5cGVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJTaG93IFZhcmlhYmxlIFR5cGVzIC0gU2hvdyB2YXJpYWJsZSB0eXBlcyBieSBkZWZhdWx0LiAiIiIKKyAgICB3aGljaCA9ICdEYjAxJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX1NvcnRfQnlfTWV0aG9kKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJTb3J0IEJ5IE1ldGhvZCAtIFNvcnQgZnVuY3Rpb25zIGJ5IG1ldGhvZC4gIiIiCisgICAgd2hpY2ggPSAnRGIwMicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9UaHJlYWRzX2luX1dpbmRvdyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiVGhyZWFkcyBpbiBXaW5kb3cgLSBTaG93IHRocmVhZHMgaW4gc2VwYXJhdGUgd2luZG93cy4gIiIiCisgICAgd2hpY2ggPSAnRGIwNCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9Vc2VfUlRUSShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiVXNlIFJUVEkgLSBFbmFibGUgUnVuVGltZSBUeXBlIEluZm9ybWF0aW9uLiAiIiIKKyAgICB3aGljaCA9ICdEYjAzJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX1ZhcmlhYmxlX0NoYW5nZWRfSGlsaXRlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJWYXJpYWJsZSBDaGFuZ2VkIEhpbGl0ZSAtIFZhcmlhYmxlIGNoYW5nZWQgaGlsaXRlIGNvbG9yLiAiIiIKKyAgICB3aGljaCA9ICdEYjA3JworICAgIHdhbnQgPSAnY1JHQicKK2NsYXNzIF9Qcm9wX1ZhcmlhYmxlX0hpbnRzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJWYXJpYWJsZSBIaW50cyAtIFNob3cgdmFyaWFibGUgaGludHMuICIiIgorICAgIHdoaWNoID0gJ0RiMDUnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfV2F0Y2hwb2ludF9IaWxpdGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIldhdGNocG9pbnQgSGlsaXRlIC0gV2F0Y2hwb2ludCBoaWxpdGUgY29sb3IuICIiIgorICAgIHdoaWNoID0gJ0RiMDYnCisgICAgd2FudCA9ICdjUkdCJworCitjbGFzcyBEZWJ1Z2dlcl9HbG9iYWwoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJEZWJ1Z2dlciBHbG9iYWwgLSBEZWJ1Z2dlciBHbG9iYWwgcHJlZmVyZW5jZXMgIiIiCisgICAgd2FudCA9ICdEYkdMJworY2xhc3MgX1Byb3BfQXV0b19UYXJnZXRfTGlicmFyaWVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJBdXRvIFRhcmdldCBMaWJyYXJpZXMgLSBBdXRvbWF0aWNhbGx5IHRhcmdldCBsaWJyYXJpZXMgd2hlbiBkZWJ1Z2dpbmcgIiIiCisgICAgd2hpY2ggPSAnRGcxMScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9DYWNoZV9FZGl0ZWRfRmlsZXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkNhY2hlIEVkaXRlZCBGaWxlcyAtIENhY2hlIGVkaXQgZmlsZXMgYmV0d2VlbiBkZWJ1ZyBzZXNzaW9ucyAiIiIKKyAgICB3aGljaCA9ICdEZzEyJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX0NvbmZpcm1fS2lsbChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiQ29uZmlybSBLaWxsIC0gQ29uZmlybSB0aGUgXHhkNGtpbGxpbmdceGQ1IG9mIHRoZSBwcm9jZXNzLiAiIiIKKyAgICB3aGljaCA9ICdEZzA0JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX0RvbnRfU3RlcF9pbl9SdW50aW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJEb250IFN0ZXAgaW4gUnVudGltZSAtIERvblx4ZDV0IHN0ZXAgaW50byBydW50aW1lIGNvZGUgd2hlbiBkZWJ1Z2dpbmcuICIiIgorICAgIHdoaWNoID0gJ0RnMDcnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfRmlsZV9DYWNoZV9EdXJhdGlvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiRmlsZSBDYWNoZSBEdXJhdGlvbiAtIER1cmF0aW9uIHRvIGtlZXAgZmlsZXMgaW4gY2FjaGUgKGluIGRheXMpICIiIgorICAgIHdoaWNoID0gJ0RnMTMnCisgICAgd2FudCA9ICdzaG9yJworY2xhc3MgX1Byb3BfSWdub3JlX01vZF9EYXRlcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiSWdub3JlIE1vZCBEYXRlcyAtIElnbm9yZSBtb2RpZmljYXRpb24gZGF0ZXMgb2YgZmlsZXMuICIiIgorICAgIHdoaWNoID0gJ0RnMDEnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfTGF1bmNoX0FwcHNfb25fT3BlbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiTGF1bmNoIEFwcHMgb24gT3BlbiAtIExhdW5jaCBhcHBsaWNhdGlvbnMgb24gdGhlIG9wZW5pbmcgb2Ygc3ltIGZpbGVzLiAiIiIKKyAgICB3aGljaCA9ICdEZzAzJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX09wZW5fQWxsX0NsYXNzZXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIk9wZW4gQWxsIENsYXNzZXMgLSBPcGVuIGFsbCBKYXZhIGNsYXNzIGZpbGVzLiAiIiIKKyAgICB3aGljaCA9ICdEZzAyJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX1NlbGVjdF9TdGFja19DcmF3bChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiU2VsZWN0IFN0YWNrIENyYXdsIC0gU2VsZWN0IHRoZSBzdGFjayBjcmF3bC4gIiIiCisgICAgd2hpY2ggPSAnRGcwNicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9TdG9wX2F0X01haW4oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlN0b3AgYXQgTWFpbiAtIFN0b3AgdG8gZGVidWcgb24gdGhlIG1haW4oKSBmdW5jdGlvbi4gIiIiCisgICAgd2hpY2ggPSAnRGcwNScKKyAgICB3YW50ID0gJ2Jvb2wnCisKK2NsYXNzIERlYnVnZ2VyX1RhcmdldChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkRlYnVnZ2VyIFRhcmdldCAtIERlYnVnZ2VyIFRhcmdldCBwcmVmZXJlbmNlcyAiIiIKKyAgICB3YW50ID0gJ0RiVEcnCitjbGFzcyBfUHJvcF9DYWNoZV9zeW1ib2xpY3MoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkNhY2hlIHN5bWJvbGljcyAtIENhY2hlIHN5bWJvbGljcyBiZXR3ZWVuIHJ1bnMgd2hlbiBleGVjdXRhYmxlIGRvZXNuXHhkNXQgY2hhbmdlLCBlbHNlIHJlbGVhc2Ugc3ltYm9saWNzIGZpbGVzIGFmdGVyIGtpbGxpbmcgcHJvY2Vzcy4gIiIiCisgICAgd2hpY2ggPSAnRHQxNScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9EYXRhX1VwZGF0ZV9JbnRlcnZhbChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiRGF0YSBVcGRhdGUgSW50ZXJ2YWwgLSBIb3cgb2Z0ZW4gdG8gdXBkYXRlIHRoZSBkYXRhIHdoaWxlIHJ1bm5pbmcgKGluIHNlY29uZHMpICIiIgorICAgIHdoaWNoID0gJ0R0MDknCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3BfTG9nX1N5c3RlbV9NZXNzYWdlcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiTG9nIFN5c3RlbSBNZXNzYWdlcyAtIExvZyBhbGwgc3lzdGVtIG1lc3NhZ2VzIHdoaWxlIGRlYnVnZ2luZy4gIiIiCisgICAgd2hpY2ggPSAnRHQwMicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9SZWxvY2F0ZWRfRXhlY3V0YWJsZV9QYXRoKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJSZWxvY2F0ZWQgRXhlY3V0YWJsZSBQYXRoIC0gUGF0aCB0byBsb2NhdGlvbiBvZiByZWxvY2F0ZWQgbGlicmFyaWVzLCBjb2RlIHJlc291cmNlcyBvciByZW1vdGUgZGVidWdnaW5nIGZvbGRlciAiIiIKKyAgICB3aGljaCA9ICdEdDEwJworICAgIHdhbnQgPSAnUmxQdCcKK2NsYXNzIF9Qcm9wX1N0b3BfYXRfdGVtcF9icmVha3BvaW50KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJTdG9wIGF0IHRlbXAgYnJlYWtwb2ludCAtIFN0b3AgYXQgYSB0ZW1wIGJyZWFrcG9pbnQgb24gcHJvZ3JhbSBsYXVuY2guIFNldCBicmVha3BvaW50IHR5cGUgaW4gVGVtcCBCcmVha3BvaW50IFR5cGUgQXBwbGVFdmVudC4gIiIiCisgICAgd2hpY2ggPSAnRHQxMycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9UZW1wX0JyZWFrcG9pbnRfVHlwZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiVGVtcCBCcmVha3BvaW50IFR5cGUgLSBUeXBlIG9mIHRlbXAgYnJlYWtwb2ludCB0byBzZXQgb24gcHJvZ3JhbSBsYXVuY2guICIiIgorICAgIHdoaWNoID0gJ0R0MTYnCisgICAgd2FudCA9ICdUbXBCJworY2xhc3MgX1Byb3BfVGVtcF9icmVha3BvaW50X25hbWVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJUZW1wIGJyZWFrcG9pbnQgbmFtZXMgLSBDb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBuYW1lcyB0byBhdHRlbXB0IHRvIHN0b3AgYXQgb24gcHJvZ3JhbSBsYXVuY2guIEZpcnN0IHN5bWJvbCB0byByZXNvbHZlIGluIGxpc3QgaXMgdGhlIHRlbXAgQlAgdGhhdCB3aWxsIGJlIHNldC4gIiIiCisgICAgd2hpY2ggPSAnRHQxNCcKKyAgICB3YW50ID0gJ2N0eHQnCitjbGFzcyBfUHJvcF9VcGRhdGVfRGF0YV9XaGlsZV9SdW5uaW5nKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJVcGRhdGUgRGF0YSBXaGlsZSBSdW5uaW5nIC0gU2hvdWxkIHBhdXNlIHRvIHVwZGF0ZSBkYXRhIHdoaWxlIHJ1bm5pbmcgIiIiCisgICAgd2hpY2ggPSAnRHQwOCcKKyAgICB3YW50ID0gJ2Jvb2wnCisKK2NsYXNzIERlYnVnZ2VyX1dpbmRvd2luZyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkRlYnVnZ2VyIFdpbmRvd2luZyAtICAiIiIKKyAgICB3YW50ID0gJ0RiV04nCitjbGFzcyBfUHJvcF9EZWJ1Z2dpbmdfU3RhcnRfQWN0aW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJEZWJ1Z2dpbmcgU3RhcnQgQWN0aW9uIC0gV2hhdCBhY3Rpb24gdG8gdGFrZSB3aGVuIGRlYnVnIHNlc3Npb24gc3RhcnRzICIiIgorICAgIHdoaWNoID0gJ0R3MDEnCisgICAgd2FudCA9ICdEYlNBJworY2xhc3MgX1Byb3BfRG9fTm90aGluZ19Ub19Qcm9qZWN0cyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiRG8gTm90aGluZyBUbyBQcm9qZWN0cyAtIFN1cHByZXNzIGRlYnVnZ2luZyBzdGFydCBhY3Rpb24gZm9yIHByb2plY3Qgd2luZG93cyAiIiIKKyAgICB3aGljaCA9ICdEdzAyJworICAgIHdhbnQgPSAnYm9vbCcKKworY2xhc3MgZGF0YV9tZW1iZXIoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkYXRhIG1lbWJlciAtIEEgY2xhc3MgZGF0YSBtZW1iZXIgb3IgZmllbGQgIiIiCisgICAgd2FudCA9ICdEdE1iJworY2xhc3MgX1Byb3Bfc3RhdGljKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzdGF0aWMgLSAgIiIiCisgICAgd2hpY2ggPSAnU3RhdCcKKyAgICB3YW50ID0gJ2Jvb2wnCisKK2RhdGFfbWVtYmVycyA9IGRhdGFfbWVtYmVyCisKK2NsYXNzIEVkaXRvcihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkVkaXRvciAtICAiIiIKKyAgICB3YW50ID0gJ0VEVFInCitjbGFzcyBfUHJvcF9CYWNrZ3JvdW5kX0NvbG9yKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJCYWNrZ3JvdW5kIENvbG9yIC0gQ29sb3Igb2YgdGhlIGJhY2tncm91bmQgb2YgZWRpdG9yIHdpbmRvd3MuICIiIgorICAgIHdoaWNoID0gJ0VEMTMnCisgICAgd2FudCA9ICdjUkdCJworY2xhc3MgX1Byb3BfQmFsYW5jZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiQmFsYW5jZSAtIEZsYXNoIHRoZSBtYXRjaGluZyBvcGVuaW5nIGJyYWNrZXQgd2hlbiB5b3UgdHlwZSBhIGNsb3NpbmcgYnJhY2tldC4gIiIiCisgICAgd2hpY2ggPSAnRUQwMycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9Db250ZXh0X1BvcHVwX0RlbGF5KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJDb250ZXh0IFBvcHVwIERlbGF5IC0gVGhlIGFtb3VudCBvZiB0aW1lLCBpbiBzaXh0aWV0aHMgb2YgYSBzZWNvbmQsIGJlZm9yZSB0aGUgY29udGV4dCBwb3B1cCBpcyBkaXNwbGF5ZWQgaWYgeW91IGNsaWNrIGFuZCBob2xkIG9uIGEgYnJvd3NlciBzeW1ib2wuICIiIgorICAgIHdoaWNoID0gJ0VEMTQnCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3BfRGVmYXVsdF9UZXh0X0ZpbGVfRm9ybWF0KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJEZWZhdWx0IFRleHQgRmlsZSBGb3JtYXQgLSBEZWZhdWx0IHRleHQgZmlsZSBmb3JtYXQgKGkuZS4gd2hpY2ggdHlwZSBvZiBsaW5lIGVuZGluZ3MgdG8gdXNlKSAiIiIKKyAgICB3aGljaCA9ICdFRDE3JworICAgIHdhbnQgPSAnVHh0RicKK2NsYXNzIF9Qcm9wX0R5bmFtaWNfU2Nyb2xsKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJEeW5hbWljIFNjcm9sbCAtIERpc3BsYXkgYSB3aW5kb3dceGQ1cyBjb250ZW50cyBhcyB5b3UgbW92ZSB0aGUgc2Nyb2xsIGJveC4gIiIiCisgICAgd2hpY2ggPSAnRUQwMicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9GbGFzaF9EZWxheShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiRmxhc2ggRGVsYXkgLSBUaGUgYW1vdW50IG9mIHRpbWUsIGluIHNpeHRpZXRocyBvZiBhIHNlY29uZCwgdGhlIGVkaXRvciBoaWdobGlnaHRzIGEgbWF0Y2hpbmcgYnJhY2tldC4gIiIiCisgICAgd2hpY2ggPSAnRUQwMScKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF9MZWZ0X01hcmdpbl9MaW5lX1NlbGVjdChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiTGVmdCBNYXJnaW4gTGluZSBTZWxlY3QgLSBDbGlja2luZyBpbiB0aGUgbGVmdCBtYXJnaW4gc2VsZWN0cyBsaW5lcyAiIiIKKyAgICB3aGljaCA9ICdFRDE2JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX01haW5fVGV4dF9Db2xvcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiTWFpbiBUZXh0IENvbG9yIC0gTWFpbiwgZGVmYXVsdCwgY29sb3IgZm9yIHRleHQuICIiIgorICAgIHdoaWNoID0gJ0VEMTInCisgICAgd2FudCA9ICdjUkdCJworY2xhc3MgX1Byb3BfUmVsYXhlZF9DX1BvcHVwX1BhcnNpbmcoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlJlbGF4ZWQgQyBQb3B1cCBQYXJzaW5nIC0gUmVsYXggdGhlIGZ1bmN0aW9uIHBhcnNlciBmb3IgQyBzb3VyY2UgZmlsZXMgIiIiCisgICAgd2hpY2ggPSAnRUQxNScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9SZW1lbWJlcl9Gb250KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJSZW1lbWJlciBGb250IC0gRGlzcGxheSBhIHNvdXJjZSBmaWxlIHdpdGggaXRzIG93biBmb250IHNldHRpbmdzLiAiIiIKKyAgICB3aGljaCA9ICdFRDA4JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX1JlbWVtYmVyX1NlbGVjdGlvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiUmVtZW1iZXIgU2VsZWN0aW9uIC0gUmVzdG9yZSB0aGUgcHJldmlvdXMgc2VsZWN0aW9uIGluIGEgZmlsZSB3aGVuIHlvdSBvcGVuIGl0LiAiIiIKKyAgICB3aGljaCA9ICdFRDA5JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX1JlbWVtYmVyX1dpbmRvdyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiUmVtZW1iZXIgV2luZG93IC0gUmVzdG9yZSB0aGUgbGFzdCBzaXplIGFuZCBwb3NpdGlvbiBmb3IgYSBzb3VyY2UgZmlsZSB3aW5kb3cgd2hlbiB5b3Ugb3BlbiBpdC4gIiIiCisgICAgd2hpY2ggPSAnRUQxMCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9Tb3J0X0Z1bmN0aW9uX1BvcHVwKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJTb3J0IEZ1bmN0aW9uIFBvcHVwIC0gICIiIgorICAgIHdoaWNoID0gJ0VEMDYnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfVXNlX0RyYWdfXzI2X19Ecm9wX0VkaXRpbmcoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlVzZSBEcmFnICYgRHJvcCBFZGl0aW5nIC0gVXNlIERyYWcgJiBEcm9wIHRleHQgZWRpdGluZy4gIiIiCisgICAgd2hpY2ggPSAnRUQwNCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9Vc2VfTXVsdGlwbGVfVW5kbyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiVXNlIE11bHRpcGxlIFVuZG8gLSAgIiIiCisgICAgd2hpY2ggPSAnRUQwNycKKyAgICB3YW50ID0gJ2Jvb2wnCisKK2NsYXNzIEVudmlyb25tZW50X1ZhcmlhYmxlKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiRW52aXJvbm1lbnQgVmFyaWFibGUgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgaG9zdCBPUyAiIiIKKyAgICB3YW50ID0gJ0VudlYnCitjbGFzcyBfUHJvcF92YWx1ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidmFsdWUgLSBWYWx1ZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgIiIiCisgICAgd2hpY2ggPSAnVmFsdScKKyAgICB3YW50ID0gJ1RFWFQnCisKK2NsYXNzIEVycm9yX0luZm9ybWF0aW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiRXJyb3IgSW5mb3JtYXRpb24gLSBEZXNjcmliZXMgYSBzaW5nbGUgZXJyb3Igb3Igd2FybmluZyBmcm9tIHRoZSBjb21waWxlciBvciB0aGUgbGlua2VyLiAiIiIKKyAgICB3YW50ID0gJ0Vyck0nCitjbGFzcyBfUHJvcF9kaXNrX2ZpbGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImRpc2sgZmlsZSAtIFRoZSBmaWxlIHdoZXJlIHRoZSBlcnJvciBvY2N1cnJlZC4gIE1heSBub3QgYmUgcmV0dXJuZWQgZm9yIGNlcnRhaW4ga2luZHMgb2YgZXJyb3JzIChlZywgbGluayBlcnJvcnMpLiAiIiIKKyAgICB3aGljaCA9ICdmaWxlJworICAgIHdhbnQgPSAnZnNzICcKK2NsYXNzIF9Qcm9wX2xpbmVOdW1iZXIoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImxpbmVOdW1iZXIgLSBUaGUgbGluZSBpbiB0aGUgZmlsZSB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuICBNYXkgbm90IGJlIHJldHVybmVkIGZvciBjZXJ0YWluIGtpbmRzIG9mIGVycm9ycyAoZWcsIGxpbmsgZXJyb3JzKS4gIiIiCisgICAgd2hpY2ggPSAnRXJyTCcKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF9tZXNzYWdlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJtZXNzYWdlIC0gVGhlIGVycm9yIG9yIHdhcm5pbmcgbWVzc2FnZS4gIiIiCisgICAgd2hpY2ggPSAnRXJyUycKKyAgICB3YW50ID0gJ1RFWFQnCitjbGFzcyBfUHJvcF9tZXNzYWdlS2luZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibWVzc2FnZUtpbmQgLSBUaGUgdHlwZSBvZiBlcnJvciBvciB3YXJuaW5nLiAiIiIKKyAgICB3aGljaCA9ICdFcnJUJworICAgIHdhbnQgPSAnRXJyVCcKKworY2xhc3MgRnVuY3Rpb25fSW5mb3JtYXRpb24oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJGdW5jdGlvbiBJbmZvcm1hdGlvbiAtIERlc2NyaWJlcyB0aGUgbG9jYXRpb24gb2YgYW55IGZ1bmN0aW9uIG9yIGdsb2JhbCBkYXRhIGRlZmluaXRpb24gd2l0aGluIHRoZSBjdXJyZW50IHByb2plY3QuICIiIgorICAgIHdhbnQgPSAnRkRlZicKKworY2xhc3MgRmlsZV9NYXBwaW5ncyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkZpbGUgTWFwcGluZ3MgLSBNYXBwaW5ncyBvZiBleHRlbnNpb25zICYgZmlsZSB0eXBlcyB0byBjb21waWxlcnMgIiIiCisgICAgd2FudCA9ICdGTE1QJworY2xhc3MgX1Byb3BfTWFwcGluZ3MoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIk1hcHBpbmdzIC0gICIiIgorICAgIHdoaWNoID0gJ0ZNcHMnCisgICAgd2FudCA9ICdGTWFwJworCitjbGFzcyBGaWxlX01hcHBpbmcoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJGaWxlIE1hcHBpbmcgLSAgIiIiCisgICAgd2FudCA9ICdGTWFwJworY2xhc3MgX1Byb3BfQ29tcGlsZXIoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkNvbXBpbGVyIC0gICIiIgorICAgIHdoaWNoID0gJ1RBMDcnCisgICAgd2FudCA9ICdURVhUJworY2xhc3MgX1Byb3BfRXh0ZW5zaW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJFeHRlbnNpb24gLSAgIiIiCisgICAgd2hpY2ggPSAnVEEwMicKKyAgICB3YW50ID0gJ1RFWFQnCitjbGFzcyBfUHJvcF9GaWxlX1R5cGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkZpbGUgVHlwZSAtICAiIiIKKyAgICB3aGljaCA9ICdQUjA0JworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX0lnbm9yZWRfYnlfTWFrZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiSWdub3JlZCBieSBNYWtlIC0gICIiIgorICAgIHdoaWNoID0gJ1RBMDYnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfTGF1bmNoYWJsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiTGF1bmNoYWJsZSAtICAiIiIKKyAgICB3aGljaCA9ICdUQTA1JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX1ByZWNvbXBpbGVkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJQcmVjb21waWxlZCAtICAiIiIKKyAgICB3aGljaCA9ICdUQTAzJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX1Jlc291cmNlX0ZpbGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlJlc291cmNlIEZpbGUgLSAgIiIiCisgICAgd2hpY2ggPSAnVEEwNCcKKyAgICB3YW50ID0gJ2Jvb2wnCisKK2NsYXNzIEdsb2JhbF9Tb3VyY2VfVHJlZXMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJHbG9iYWwgU291cmNlIFRyZWVzIC0gR2xvYmFsbHktZGVmaW5lZCBzb3VyY2UgdHJlZSByb290cyAiIiIKKyAgICB3YW50ID0gJ0dTVHMnCitjbGFzcyBfUHJvcF9Tb3VyY2VfVHJlZXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlNvdXJjZSBUcmVlcyAtIExpc3Qgb2Ygc291cmNlIHRyZWUgcm9vdHMgIiIiCisgICAgd2hpY2ggPSAnU1QwMScKKyAgICB3YW50ID0gJ1NyY1QnCisKK2NsYXNzIEV4dHJhcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkV4dHJhcyAtICAiIiIKKyAgICB3YW50ID0gJ0dYVFInCitjbGFzcyBfUHJvcF9BdXRvbWF0aWNfVG9vbGJhcl9IZWxwKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJBdXRvbWF0aWMgVG9vbGJhciBIZWxwIC0gQXV0b21hdGljYWxseSBzaG93IGJhbGxvb24gaGVscCBpbiB0b29sYmFyIGFmdGVyIGRlbGF5ICIiIgorICAgIHdoaWNoID0gJ0VYMTknCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfRXh0ZXJuYWxfUmVmZXJlbmNlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJFeHRlcm5hbCBSZWZlcmVuY2UgLSBXaGljaCBvbi1saW5lIGZ1bmN0aW9uIHJlZmVyZW5jZSB0byB1c2UuICIiIgorICAgIHdoaWNoID0gJ0VYMDgnCisgICAgd2FudCA9ICdSZWZQJworY2xhc3MgX1Byb3BfRnVsbF9TY3JlZW5fWm9vbShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiRnVsbCBTY3JlZW4gWm9vbSAtIFpvb20gd2luZG93cyB0byB0aGUgZnVsbCBzY3JlZW4gd2lkdGguICIiIgorICAgIHdoaWNoID0gJ0VYMDcnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfUmVjZW50X0VkaXRvcl9Db3VudChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiUmVjZW50IEVkaXRvciBDb3VudCAtIE1heGltdW0gbnVtYmVyIG9mIGVkaXRvciBkb2N1bWVudHMgdG8gc2hvdyBpbiB0aGUgXHhkMk9wZW4gUmVjZW50XHhkMyBtZW51ICIiIgorICAgIHdoaWNoID0gJ0VYMTYnCisgICAgd2FudCA9ICdzaG9yJworY2xhc3MgX1Byb3BfUmVjZW50X1Byb2plY3RfQ291bnQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlJlY2VudCBQcm9qZWN0IENvdW50IC0gTWF4aW11bSBudW1iZXIgb2YgcHJvamVjdCBkb2N1bWVudHMgdG8gc2hvdyBpbiB0aGUgXHhkMk9wZW4gUmVjZW50XHhkMyBtZW51ICIiIgorICAgIHdoaWNoID0gJ0VYMTcnCisgICAgd2FudCA9ICdzaG9yJworY2xhc3MgX1Byb3BfVXNlX0VkaXRvcl9FeHRlbnNpb25zKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJVc2UgRWRpdG9yIEV4dGVuc2lvbnMgLSBDb250cm9scyB0aGUgdXNlIG9mIHRoZSBFZGl0b3IgRXh0ZW5zaW9ucyBtZW51ICIiIgorICAgIHdoaWNoID0gJ0VYMTAnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfVXNlX0V4dGVybmFsX0VkaXRvcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiVXNlIEV4dGVybmFsIEVkaXRvciAtIENvbnRyb2xzIHdoZXRoZXIgQ29kZVdhcnJpb3IgdXNlcyBpdHMgb3duIGludGVncmF0ZWQgZWRpdG9yIG9yIGFuIGV4dGVybmFsIGFwcGxpY2F0aW9uIGZvciBlZGl0aW5nIHRleHQgZmlsZXMuICIiIgorICAgIHdoaWNoID0gJ0VYMTEnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfVXNlX1NjcmlwdF9NZW51KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJVc2UgU2NyaXB0IE1lbnUgLSBDb250cm9scyB0aGUgdXNlIG9mIHRoZSBBcHBsZVNjcmlwdCBtZW51ICIiIgorICAgIHdoaWNoID0gJ0VYMTInCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfVXNlX1Rvb2xTZXJ2ZXJfTWVudShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiVXNlIFRvb2xTZXJ2ZXIgTWVudSAtIENvbnRyb2xzIHRoZSB1c2Ugb2YgdGhlIFRvb2xTZXJ2ZXIgbWVudSAiIiIKKyAgICB3aGljaCA9ICdFWDE4JworICAgIHdhbnQgPSAnYm9vbCcKKworY2xhc3MgQnVpbGRfRXh0cmFzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiQnVpbGQgRXh0cmFzIC0gICIiIgorICAgIHdhbnQgPSAnTFhUUicKK2NsYXNzIF9Qcm9wX0Jyb3dzZXJfQWN0aXZlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJCcm93c2VyIEFjdGl2ZSAtIEFsbG93IHRoZSBjb2xsZWN0aW9uIG9mIGJyb3dzZXIgaW5mb3JtYXRpb24uICIiIgorICAgIHdoaWNoID0gJ0VYMDknCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfQ2FjaGVfU3VicHJvamVjdF9EYXRhKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJDYWNoZSBTdWJwcm9qZWN0IERhdGEgLSAgIiIiCisgICAgd2hpY2ggPSAnRVgzMScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9EdW1wX0Jyb3dzZXJfSW5mbyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiRHVtcCBCcm93c2VyIEluZm8gLSAgIiIiCisgICAgd2hpY2ggPSAnRVgzMCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9Nb2RpZmljYXRpb25fRGF0ZV9DYWNoaW5nKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJNb2RpZmljYXRpb24gRGF0ZSBDYWNoaW5nIC0gICIiIgorICAgIHdoaWNoID0gJ0VYMDQnCisgICAgd2FudCA9ICdib29sJworCitjbGFzcyBtZW1iZXJfZnVuY3Rpb24oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJtZW1iZXIgZnVuY3Rpb24gLSBBIGNsYXNzIG1lbWJlciBmdW5jdGlvbiBvciBtZXRob2QuICIiIgorICAgIHdhbnQgPSAnTWJGbicKK2NsYXNzIF9Qcm9wX2ltcGxlbWVudGF0aW9uX2VuZF9vZmZzZXQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImltcGxlbWVudGF0aW9uIGVuZCBvZmZzZXQgLSBlbmQgb2YgbWVtYmVyIGZ1bmN0aW9uIGRlZmluaXRpb24gIiIiCisgICAgd2hpY2ggPSAnRGZFbicKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF9pbXBsZW1lbnRhdGlvbl9maWxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJpbXBsZW1lbnRhdGlvbiBmaWxlIC0gU291cmNlIGZpbGUgY29udGFpbmluZyB0aGUgbWVtYmVyIGZ1bmN0aW9uIGRlZmluaXRpb24gIiIiCisgICAgd2hpY2ggPSAnRGZGbCcKKyAgICB3YW50ID0gJ2ZzcyAnCitjbGFzcyBfUHJvcF9pbXBsZW1lbnRhdGlvbl9zdGFydF9vZmZzZXQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImltcGxlbWVudGF0aW9uIHN0YXJ0IG9mZnNldCAtIHN0YXJ0IG9mIG1lbWJlciBmdW5jdGlvbiBkZWZpbml0aW9uIHNvdXJjZSBjb2RlICIiIgorICAgIHdoaWNoID0gJ0RmU3QnCisgICAgd2FudCA9ICdsb25nJworCittZW1iZXJfZnVuY3Rpb25zID0gbWVtYmVyX2Z1bmN0aW9uCisKK2NsYXNzIEFjY2Vzc19QYXRocyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkFjY2VzcyBQYXRocyAtIENvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiBhIHByb2plY3RceGQ1cyBhY2Nlc3MgKHNlYXJjaCkgcGF0aHMuICIiIgorICAgIHdhbnQgPSAnUEFUSCcKK2NsYXNzIF9Qcm9wX0Fsd2F5c19GdWxsX1NlYXJjaChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiQWx3YXlzIEZ1bGwgU2VhcmNoIC0gVG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHNlYXJjaCBmb3Igc3lzdGVtIGluY2x1ZGVzIGxpa2UgaXQgc2VhcmNoZXMgZm9yIHVzZXIgaW5jbHVkZXMuICIiIgorICAgIHdoaWNoID0gJ1BBMDInCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfQ29udmVydF9QYXRocyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiQ29udmVydCBQYXRocyAtIEVuYWJsZXMgY29udmVyc2lvbiBvZiBET1MgJiBVbml4LXN0eWxlIHJlbGF0aXZlIHBhdGhzIHdoZW4gc2VhcmNoaW5nIGZvciBmaWxlcy4gIiIiCisgICAgd2hpY2ggPSAnUEEwNCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9SZXF1aXJlX0ZyYW1ld29ya19JbmNsdWRlcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiUmVxdWlyZSBGcmFtZXdvcmsgSW5jbHVkZXMgLSBDYXVzZXMgdGhlIElERSB0byBvbmx5IGxvb2sgaW4gdGhlIGZyYW1ld29yayBhY2Nlc3MgcGF0aHMgaWYgYSBNYWMgT1MgWCBmcmFtZXdvcmsgc3R5bGUgaW5jbHVkZSAoaS5lLiA8Q2FyYm9uL0NhcmJvbi5oPiApIGlzIHVzZWQuICIiIgorICAgIHdoaWNoID0gJ1BBMDUnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfU3lzdGVtX1BhdGhzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJTeXN0ZW0gUGF0aHMgLSBUbyBhZGQgYW4gYWNjZXNzIHBhdGggZm9yIHRoZSBpbmNsdWRlIGZpbGVzLiAoTm90IHN1cHBvcnRlZCBpbiBQYXNjYWwpICIiIgorICAgIHdoaWNoID0gJ1BBMDMnCisgICAgd2FudCA9ICdQSW5mJworY2xhc3MgX1Byb3BfVXNlcl9QYXRocyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiVXNlciBQYXRocyAtIFRvIGFkZCBhbiBhY2Nlc3MgcGF0aCBmb3IgdGhlIHNvdXJjZSBmaWxlcy4gIiIiCisgICAgd2hpY2ggPSAnUEEwMScKKyAgICB3YW50ID0gJ1BJbmYnCisKK2NsYXNzIFBhdGhfSW5mb3JtYXRpb24oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJQYXRoIEluZm9ybWF0aW9uIC0gQ29udGFpbnMgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIHRoYXQgZGVzY3JpYmUgYW4gYWNjZXNzIHBhdGguICIiIgorICAgIHdhbnQgPSAnUEluZicKK2NsYXNzIF9Qcm9wX2Zvcm1hdChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZm9ybWF0IC0gRm9ybWF0IG9mIHRoZSBhICIiIgorICAgIHdoaWNoID0gJ0ZybXQnCisgICAgd2FudCA9ICdQdGhGJworY2xhc3MgX1Byb3BfZnJhbWV3b3JrKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmcmFtZXdvcmsgLSBJcyB0aGUgcGF0aCBhIE1hYyBPUyBYIGZyYW1ld29yayBzdHlsZSBwYXRoPyAgKFRoaXMgZmxhZyBpcyByZWFkYWJsZSBidXQgbm90IHdyaXRlYWJsZSBmcm9tIEFwcGxlU2NyaXB0LikgIiIiCisgICAgd2hpY2ggPSAnRnJtdycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9ob3N0X2ZsYWdzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJob3N0IGZsYWdzIC0gQml0IGZpZWxkcyBlbmFibGluZyB0aGUgYWNjZXNzIHBhdGggZm9yIGVhY2ggaG9zdCBPUyAoMSA9IE1hYyBPUywgMiA9IFdpbmRvd3MpICIiIgorICAgIHdoaWNoID0gJ0hzdEYnCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3Bfb3JpZ2luKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJvcmlnaW4gLSAgIiIiCisgICAgd2hpY2ggPSAnT3JpZycKKyAgICB3YW50ID0gJ1BQcm0nCitjbGFzcyBfUHJvcF9yZWN1cnNpdmUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInJlY3Vyc2l2ZSAtIFdpbGwgdGhlIHBhdGggYmUgc2VhcmNoZWQgcmVjdXJzaXZlbHk/ICAoRGVmYXVsdCBpcyB0cnVlKSAiIiIKKyAgICB3aGljaCA9ICdSZWN1JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3Jvb3QoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInJvb3QgLSBOYW1lIG9mIHRoZSByb290IG9mIHRoZSByZWxhdGl2ZSBwYXRoLiBQcmUtZGVmaW5lZCB2YWx1ZXMgYXJlIFx4ZDJBYnNvbHV0ZVx4ZDMsIFx4ZDJQcm9qZWN0XHhkMywgXHhkMkNvZGVXYXJyaW9yXHhkMywgYW5kICBceGQyU3lzdGVtXHhkMy4gQW55dGhpbmcgZWxzZSBpcyBhIHVzZXItZGVmaW5lZCByb290LiAiIiIKKyAgICB3aGljaCA9ICdSb290JworICAgIHdhbnQgPSAnVEVYVCcKKworY2xhc3MgUGx1Z2luX1NldHRpbmdzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiUGx1Z2luIFNldHRpbmdzIC0gU2V0dGluZ3MgZm9yIHBsdWdpbiB0b29scyAiIiIKKyAgICB3YW50ID0gJ1BTVEcnCitjbGFzcyBfUHJvcF9EaXNhYmxlX1RoaXJkX1BhcnR5X0NPTV9QbHVnaW5zKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJEaXNhYmxlIFRoaXJkIFBhcnR5IENPTSBQbHVnaW5zIC0gRGlzYWJsZSBDT00gcGx1Z2lucyBmcm9tIHRoaXJkIHBhcnRpZXMgIiIiCisgICAgd2hpY2ggPSAnUFgwMicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9QbHVnaW5fRGlhZ25vc3RpY3NfTGV2ZWwoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlBsdWdpbiBEaWFnbm9zdGljcyBMZXZlbCAtIFBsdWdpbiBEaWFnbm9zdGljcyBMZXZlbCBpcyBmb3IgdGhvc2Ugd2hvIGFyZSBkZXZlbG9waW5nIHBsdWdpbnMgZm9yIHRoZSBJREUgYW5kIG5lZWQgdG8gZGVidWcgdGhlbS4gIiIiCisgICAgd2hpY2ggPSAnUFgwMScKKyAgICB3YW50ID0gJ1BYZGcnCisKK2NsYXNzIFJ1bnRpbWVfU2V0dGluZ3MoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJSdW50aW1lIFNldHRpbmdzIC0gUnVudGltZSBzZXR0aW5ncyAiIiIKKyAgICB3YW50ID0gJ1JTVEcnCitjbGFzcyBfUHJvcF9Db21tYW5kX0xpbmVfQXJndW1lbnRzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJDb21tYW5kIExpbmUgQXJndW1lbnRzIC0gRXh0cmEgY29tbWFuZCBsaW5lIGFyZ3MgdG8gcGFzcyB0byBleGVjdXRhYmxlICIiIgorICAgIHdoaWNoID0gJ1JTMDInCisgICAgd2FudCA9ICdURVhUJworY2xhc3MgX1Byb3BfRW52aXJvbm1lbnRfVmFyaWFibGVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJFbnZpcm9ubWVudCBWYXJpYWJsZXMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gdXNlIHdoZW4gcnVubmluZyB0aGUgZXhlY3V0YWJsZSAiIiIKKyAgICB3aGljaCA9ICdSUzA0JworICAgIHdhbnQgPSAnRW52VicKK2NsYXNzIF9Qcm9wX0hvc3RfQXBwbGljYXRpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkhvc3QgQXBwbGljYXRpb24gLSBIb3N0IGFwcGxpY2F0aW9uIGZvciBydW5uaW5nL2RlYnVnZ2luZyBsaWJyYXJpZXMgYW5kIGNvZGUgcmVzb3VyY2VzICIiIgorICAgIHdoaWNoID0gJ1JTMDEnCisgICAgd2FudCA9ICdSbFB0JworY2xhc3MgX1Byb3BfV29ya2luZ19EaXJlY3RvcnkoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIldvcmtpbmcgRGlyZWN0b3J5IC0gV29ya2luZyBkaXJlY3RvcnkgdG8gdXNlIHdoZW4gcnVubmluZyB0aGUgZXhlY3V0YWJsZSAiIiIKKyAgICB3aGljaCA9ICdSUzAzJworICAgIHdhbnQgPSAnVEVYVCcKKworY2xhc3MgUmVsYXRpdmVfUGF0aChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIlJlbGF0aXZlIFBhdGggLSBSZWxhdGl2ZSBwYXRoIGZyb20gc29tZSByb290ICIiIgorICAgIHdhbnQgPSAnUmxQdCcKKworY2xhc3MgU2hpZWxkZWRfRm9sZGVyKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiU2hpZWxkZWQgRm9sZGVyIC0gICIiIgorICAgIHdhbnQgPSAnU0ZpdCcKK2NsYXNzIF9Qcm9wX0V4cHJlc3Npb25fVG9fTWF0Y2goYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkV4cHJlc3Npb24gVG8gTWF0Y2ggLSBSZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggZGVzY3JpYmVzIGZvbGRlcnMgdG8gc2tpcCAiIiIKKyAgICB3aGljaCA9ICdTRjAxJworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX1NraXBfRmluZF9BbmRfQ29tcGFyZV9PcGVyYXRpb25zKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJTa2lwIEZpbmQgQW5kIENvbXBhcmUgT3BlcmF0aW9ucyAtIE1hdGNoaW5nIGZvbGRlcnMgd2lsbCBiZSBza2lwcGVkIGR1cmluZyBmaW5kIGFuZCBjb21wYXJlIG9wZXJhdGlvbnMgIiIiCisgICAgd2hpY2ggPSAnU0YwMycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9Ta2lwX1Byb2plY3RfT3BlcmF0aW9ucyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiU2tpcCBQcm9qZWN0IE9wZXJhdGlvbnMgLSBNYXRjaGluZyBmb2xkZXJzIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgcHJvamVjdCBvcGVyYXRpb25zICIiIgorICAgIHdoaWNoID0gJ1NGMDInCisgICAgd2FudCA9ICdib29sJworCitjbGFzcyBTaGllbGRlZF9Gb2xkZXJzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiU2hpZWxkZWQgRm9sZGVycyAtIEZvbGRlcnMgc2tpcHBlZCB3aGVuIHBlcmZvcm1pbmcgcHJvamVjdCBhbmQgZmluZC1hbmQtY29tcGFyZSBvcGVyYXRpb25zICIiIgorICAgIHdhbnQgPSAnU0hGTCcKK2NsYXNzIF9Qcm9wX1NoaWVsZGVkX0l0ZW1zKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJTaGllbGRlZCBJdGVtcyAtICAiIiIKKyAgICB3aGljaCA9ICdTRmlzJworICAgIHdhbnQgPSAnU0ZpdCcKKworY2xhc3MgU3ludGF4X0NvbG9yaW5nKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiU3ludGF4IENvbG9yaW5nIC0gICIiIgorICAgIHdhbnQgPSAnU05UWCcKK2NsYXNzIF9Qcm9wX0NvbW1lbnRfQ29sb3IoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkNvbW1lbnQgQ29sb3IgLSBUaGUgY29sb3IgZm9yIGNvbW1lbnRzLiAiIiIKKyAgICB3aGljaCA9ICdHSDAyJworICAgIHdhbnQgPSAnY1JHQicKK2NsYXNzIF9Qcm9wX0tleXdvcmRfQ29sb3IoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIktleXdvcmQgQ29sb3IgLSBUaGUgY29sb3IgZm9yIGxhbmd1YWdlIGtleXdvcmRzLiAiIiIKKyAgICB3aGljaCA9ICdHSDAzJworICAgIHdhbnQgPSAnY1JHQicKK2NsYXNzIF9Qcm9wX1N0cmluZ19Db2xvcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiU3RyaW5nIENvbG9yIC0gVGhlIGNvbG9yIGZvciBzdHJpbmdzLiAiIiIKKyAgICB3aGljaCA9ICdHSDA0JworICAgIHdhbnQgPSAnY1JHQicKK2NsYXNzIF9Qcm9wX1N5bnRheF9Db2xvcmluZyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiU3ludGF4IENvbG9yaW5nIC0gTWFyayBrZXl3b3JkcyBhbmQgY29tbWVudHMgd2l0aCBjb2xvci4gIiIiCisgICAgd2hpY2ggPSAnR0gwMScKKyAgICB3YW50ID0gJ2Jvb2wnCisKK2NsYXNzIFNlZ21lbnQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJTZWdtZW50IC0gQSBzZWdtZW50IG9yIGdyb3VwIGluIHRoZSBwcm9qZWN0ICIiIgorICAgIHdhbnQgPSAnU2VnICcKK2NsYXNzIF9Qcm9wX2ZpbGVjb3VudChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZmlsZWNvdW50IC0gICIiIgorICAgIHdoaWNoID0gJ051bUYnCisgICAgd2FudCA9ICdzaG9yJworY2xhc3MgX1Byb3Bfc2VnXzJkX2xvY2tlZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic2VnLWxvY2tlZCAtIElzIHRoZSBzZWdtZW50IGxvY2tlZCA/IFs2OEsgb25seV0gIiIiCisgICAgd2hpY2ggPSAnUExjaycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9zZWdfMmRfcHJlbG9hZGVkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzZWctcHJlbG9hZGVkIC0gSXMgdGhlIHNlZ21lbnQgcHJlbG9hZGVkID8gWzY4SyBvbmx5XSAiIiIKKyAgICB3aGljaCA9ICdQcmVsJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3NlZ18yZF9wcm90ZWN0ZWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNlZy1wcm90ZWN0ZWQgLSBJcyB0aGUgc2VnbWVudCBwcm90ZWN0ZWQgPyBbNjhLIG9ubHldICIiIgorICAgIHdoaWNoID0gJ1Byb3QnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3Bfc2VnXzJkX3B1cmdlYWJsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic2VnLXB1cmdlYWJsZSAtIElzIHRoZSBzZWdtZW50IHB1cmdlYWJsZSA/IFs2OEsgb25seV0gIiIiCisgICAgd2hpY2ggPSAnUHVyZycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9zZWdfMmRfc3lzdGVtX2hlYXAoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNlZy1zeXN0ZW0gaGVhcCAtIElzIHRoZSBzZWdtZW50IGxvYWRlZCBpbnRvIHRoZSBzeXN0ZW0gaGVhcCA/IFs2OEsgb25seV0gIiIiCisgICAgd2hpY2ggPSAnU3lzSCcKKyAgICB3YW50ID0gJ2Jvb2wnCisKK2NsYXNzIFByb2plY3RGaWxlKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiUHJvamVjdEZpbGUgLSBBIGZpbGUgY29udGFpbmVkIGluIGEgcHJvamVjdCAiIiIKKyAgICB3YW50ID0gJ1NyY0YnCitjbGFzcyBfUHJvcF9jb2Rlc2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY29kZXNpemUgLSBUaGUgc2l6ZSBvZiB0aGlzIGZpbGVceGQ1cyBjb2RlLiAiIiIKKyAgICB3aGljaCA9ICdDU2l6JworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX2RhdGFzaXplKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJkYXRhc2l6ZSAtIFRoZSBzaXplIG9mIHRoaXMgZmlsZVx4ZDVzIGRhdGEuICIiIgorICAgIHdoaWNoID0gJ0RTaXonCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3BfZmlsZXR5cGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZpbGV0eXBlIC0gV2hhdCBraW5kIG9mIGZpbGUgaXMgdGhpcyA/ICIiIgorICAgIHdoaWNoID0gJ1NyY1QnCisgICAgd2FudCA9ICdTcmNUJworY2xhc3MgX1Byb3BfaW5jbHVkZXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImluY2x1ZGVzIC0gICIiIgorICAgIHdoaWNoID0gJ0luY0YnCisgICAgd2FudCA9ICdmc3MgJworY2xhc3MgX1Byb3BfaW5pdGlhbGl6ZV9iZWZvcmUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImluaXRpYWxpemUgYmVmb3JlIC0gSW5pdGlhbGl6ZSB0aGUgc2hhcmVkIGxpYnJhcnkgYmVmb3JlIHRoZSBtYWluIGFwcGxpY2F0aW9uLiAiIiIKKyAgICB3aGljaCA9ICdCZm9yJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3N5bWJvbHMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInN5bWJvbHMgLSBBcmUgZGVidWdnaW5nIHN5bWJvbHMgZ2VuZXJhdGVkIGZvciB0aGlzIGZpbGUgPyAiIiIKKyAgICB3aGljaCA9ICdTeW1HJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3VwX3RvX2RhdGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInVwIHRvIGRhdGUgLSBIYXMgdGhlIGZpbGUgYmVlbiBjb21waWxlZCBzaW5jZSBpdHMgbGFzdCBtb2RpZmljYXRpb24gPyAiIiIKKyAgICB3aGljaCA9ICdVcFREJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3dlYWtfbGluayhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIid2VhayBsaW5rIC0gSXMgdGhpcyBmaWxlIGltcG9ydGVkIHdlYWtseSBpbnRvIHRoZSBwcm9qZWN0ID8gW1Bvd2VyUEMgb25seV0gIiIiCisgICAgd2hpY2ggPSAnV2VhaycKKyAgICB3YW50ID0gJ2Jvb2wnCisKK2NsYXNzIFNvdXJjZV9UcmVlKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiU291cmNlIFRyZWUgLSBVc2VyLWRlZmluZWQgc291cmNlIHRyZWUgcm9vdCAiIiIKKyAgICB3YW50ID0gJ1NyY1QnCitjbGFzcyBfUHJvcF9wYXRoKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwYXRoIC0gcGF0aCBmb3IgdGhlIHVzZXItZGVmaW5lZCBzb3VyY2UgdHJlZSByb290ICIiIgorICAgIHdoaWNoID0gJ1BhdGgnCisgICAgd2FudCA9ICdURVhUJworY2xhc3MgX1Byb3BfcGF0aF9raW5kKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwYXRoIGtpbmQgLSBraW5kIG9mIHBhdGggIiIiCisgICAgd2hpY2ggPSAnS2luZCcKKyAgICB3YW50ID0gJ1NUS2QnCisKK2NsYXNzIFRhcmdldF9TZXR0aW5ncyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIlRhcmdldCBTZXR0aW5ncyAtIENvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBvZiBhIHByb2plY3RceGQ1cyB0YXJnZXQuICIiIgorICAgIHdhbnQgPSAnVEFSRycKK2NsYXNzIF9Qcm9wX0xpbmtlcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiTGlua2VyIC0gVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbGlua2VyLiAiIiIKKyAgICB3aGljaCA9ICdUQTAxJworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX091dHB1dF9EaXJlY3RvcnlfTG9jYXRpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIk91dHB1dCBEaXJlY3RvcnkgTG9jYXRpb24gLSBMb2NhdGlvbiBvZiBvdXRwdXQgZGlyZWN0b3J5ICIiIgorICAgIHdoaWNoID0gJ1RBMTYnCisgICAgd2FudCA9ICdSbFB0JworY2xhc3MgX1Byb3BfT3V0cHV0X0RpcmVjdG9yeV9PcmlnaW4oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIk91dHB1dCBEaXJlY3RvcnkgT3JpZ2luIC0gT3JpZ2luIG9mIHBhdGggdG8gb3V0cHV0IGRpcmVjdG9yeS4gVXNhZ2Ugb2YgdGhpcyBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIFx4ZDJPdXRwdXQgRGlyZWN0b3J5IExvY2F0aW9uXHhkMyBwcm9wZXJ0eSBpbnN0ZWFkLiAiIiIKKyAgICB3aGljaCA9ICdUQTEyJworICAgIHdhbnQgPSAnUFBybScKK2NsYXNzIF9Qcm9wX091dHB1dF9EaXJlY3RvcnlfUGF0aChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiT3V0cHV0IERpcmVjdG9yeSBQYXRoIC0gUGF0aCB0byBvdXRwdXQgZGlyZWN0b3J5LiBVc2FnZSBvZiB0aGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgXHhkMk91dHB1dCBEaXJlY3RvcnkgTG9jYXRpb25ceGQzIHByb3BlcnR5IGluc3RlYWQuICIiIgorICAgIHdoaWNoID0gJ1RBMTEnCisgICAgd2FudCA9ICdURVhUJworY2xhc3MgX1Byb3BfUG9zdF9MaW5rZXIoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlBvc3QgTGlua2VyIC0gICIiIgorICAgIHdoaWNoID0gJ1RBMDknCisgICAgd2FudCA9ICdURVhUJworY2xhc3MgX1Byb3BfUHJlX0xpbmtlcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiUHJlIExpbmtlciAtICAiIiIKKyAgICB3aGljaCA9ICdUQTEzJworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX1RhcmdldF9OYW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJUYXJnZXQgTmFtZSAtICAiIiIKKyAgICB3aGljaCA9ICdUQTEwJworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX1VzZV9SZWxhdGl2ZV9QYXRocyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiVXNlIFJlbGF0aXZlIFBhdGhzIC0gU2F2ZSBwcm9qZWN0IGVudHJpZXMgdXNpbmcgcmVsYXRpdmUgcGF0aHMgIiIiCisgICAgd2hpY2ggPSAnVEExNScKKyAgICB3YW50ID0gJ2Jvb2wnCisKK2NsYXNzIFRhcmdldF9Tb3VyY2VfVHJlZXMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJUYXJnZXQgU291cmNlIFRyZWVzIC0gVGFyZ2V0LXNwZWNpZmljIHVzZXItZGVmaW5lZCBzb3VyY2UgdHJlZSByb290cyAiIiIKKyAgICB3YW50ID0gJ1RTVHMnCisKK2NsYXNzIFZDU19TZXR1cChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIlZDUyBTZXR1cCAtIFRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtIHByZWZlcmVuY2VzLiAiIiIKKyAgICB3YW50ID0gJ1ZDU3MnCitjbGFzcyBfUHJvcF9BbHdheXNfUHJvbXB0KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJBbHdheXMgUHJvbXB0IC0gQWx3YXlzIHNob3cgbG9naW4gZGlhbG9nICIiIgorICAgIHdoaWNoID0gJ1ZDMDcnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfQXV0b19Db25uZWN0KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJBdXRvIENvbm5lY3QgLSBBdXRvbWF0aWNhbGx5IGNvbm5lY3QgdG8gZGF0YWJhc2Ugd2hlbiBzdGFydGluZy4gIiIiCisgICAgd2hpY2ggPSAnVkMwNScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9Db25uZWN0aW9uX01ldGhvZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiQ29ubmVjdGlvbiBNZXRob2QgLSBOYW1lIG9mIFZlcnNpb24gQ29udHJvbCBTeXN0ZW0gdG8gdXNlLiAiIiIKKyAgICB3aGljaCA9ICdWQzAyJworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX0RhdGFiYXNlX1BhdGgoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkRhdGFiYXNlIFBhdGggLSBQYXRoIHRvIHRoZSBWQ1MgZGF0YWJhc2UuICIiIgorICAgIHdoaWNoID0gJ1ZDMDknCisgICAgd2FudCA9ICdSbFB0JworY2xhc3MgX1Byb3BfTG9jYWxfUGF0aChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiTG9jYWwgUGF0aCAtIFBhdGggdG8gdGhlIGxvY2FsIHJvb3QgIiIiCisgICAgd2hpY2ggPSAnVkMxMCcKKyAgICB3YW50ID0gJ1JsUHQnCitjbGFzcyBfUHJvcF9Nb3VudF9Wb2x1bWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIk1vdW50IFZvbHVtZSAtIEF0dGVtcHQgdG8gbW91bnQgdGhlIGRhdGFiYXNlIHZvbHVtZSBpZiBpdCBpc24ndCBhdmFpbGFibGUuICIiIgorICAgIHdoaWNoID0gJ1ZDMDgnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfUGFzc3dvcmQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlBhc3N3b3JkIC0gVGhlIHBhc3N3b3JkIGZvciB0aGUgVkNTLiAiIiIKKyAgICB3aGljaCA9ICdWQzA0JworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX1N0b3JlX1Bhc3N3b3JkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJTdG9yZSBQYXNzd29yZCAtIFN0b3JlIHRoZSBwYXNzd29yZC4gIiIiCisgICAgd2hpY2ggPSAnVkMwNicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9Vc2VfR2xvYmFsX1NldHRpbmdzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJVc2UgR2xvYmFsIFNldHRpbmdzIC0gVXNlIHRoZSBnbG9iYWwgVkNTIHNldHRpbmdzIGJ5IGRlZmF1bHQgIiIiCisgICAgd2hpY2ggPSAnVkMxMScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9Vc2VybmFtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiVXNlcm5hbWUgLSBUaGUgdXNlciBuYW1lIGZvciB0aGUgVkNTLiAiIiIKKyAgICB3aGljaCA9ICdWQzAzJworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX1ZDU19BY3RpdmUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlZDUyBBY3RpdmUgLSBVc2UgVmVyc2lvbiBDb250cm9sICIiIgorICAgIHdoaWNoID0gJ1ZDMDEnCisgICAgd2FudCA9ICdib29sJworCitjbGFzcyBGb250KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiRm9udCAtICAiIiIKKyAgICB3YW50ID0gJ21GTlQnCitjbGFzcyBfUHJvcF9BdXRvX0luZGVudChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiQXV0byBJbmRlbnQgLSBJbmRlbnQgbmV3IGxpbmVzIGF1dG9tYXRpY2FsbHkuICIiIgorICAgIHdoaWNoID0gJ0ZOMDEnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfVGFiX0luZGVudHNfU2VsZWN0aW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJUYWIgSW5kZW50cyBTZWxlY3Rpb24gLSBUYWIgaW5kZW50cyBzZWxlY3Rpb24gd2hlbiBtdWx0aXBsZSBsaW5lcyBhcmUgc2VsZWN0ZWQgIiIiCisgICAgd2hpY2ggPSAnRk4wMycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9UYWJfSW5zZXJ0c19TcGFjZXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlRhYiBJbnNlcnRzIFNwYWNlcyAtIEluc2VydCBzcGFjZXMgaW5zdGVhZCBvZiB0YWIgY2hhcmFjdGVyICIiIgorICAgIHdoaWNoID0gJ0ZOMDQnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfVGFiX1NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlRhYiBTaXplIC0gICIiIgorICAgIHdoaWNoID0gJ0ZOMDInCisgICAgd2FudCA9ICdzaG9yJworY2xhc3MgX1Byb3BfVGV4dF9Gb250KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJUZXh0IEZvbnQgLSBUaGUgZm9udCB1c2VkIGluIGVkaXRpbmcgd2luZG93cy4gIiIiCisgICAgd2hpY2ggPSAncHR4ZicKKyAgICB3YW50ID0gJ1RFWFQnCitjbGFzcyBfUHJvcF9UZXh0X1NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlRleHQgU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSB0ZXh0IGluIGFuIGVkaXRpbmcgd2luZG93LiAiIiIKKyAgICB3aGljaCA9ICdwdHBzJworICAgIHdhbnQgPSAnc2hvcicKK0Jyb3dzZXJfQ29sb3JpbmcuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitCcm93c2VyX0NvbG9yaW5nLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ0Jyb3dzZXJfS2V5d29yZHMnIDogX1Byb3BfQnJvd3Nlcl9LZXl3b3JkcywKKyAgICAnQ2xhc3Nlc19Db2xvcicgOiBfUHJvcF9DbGFzc2VzX0NvbG9yLAorICAgICdDb25zdGFudHNfQ29sb3InIDogX1Byb3BfQ29uc3RhbnRzX0NvbG9yLAorICAgICdFbnVtc19Db2xvcicgOiBfUHJvcF9FbnVtc19Db2xvciwKKyAgICAnRnVuY3Rpb25zX0NvbG9yJyA6IF9Qcm9wX0Z1bmN0aW9uc19Db2xvciwKKyAgICAnR2xvYmFsc19Db2xvcicgOiBfUHJvcF9HbG9iYWxzX0NvbG9yLAorICAgICdNYWNyb3NfQ29sb3InIDogX1Byb3BfTWFjcm9zX0NvbG9yLAorICAgICdUZW1wbGF0ZV9Db21tYW5kc19pbl9NZW51JyA6IF9Qcm9wX1RlbXBsYXRlX0NvbW1hbmRzX2luX01lbnUsCisgICAgJ1RlbXBsYXRlc19Db2xvcicgOiBfUHJvcF9UZW1wbGF0ZXNfQ29sb3IsCisgICAgJ1R5cGVkZWZzX0NvbG9yJyA6IF9Qcm9wX1R5cGVkZWZzX0NvbG9yLAorfQorQnJvd3Nlcl9Db2xvcmluZy5fcHJpdmVsZW1kaWN0ID0geworfQorQnVpbGRfU2V0dGluZ3MuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitCdWlsZF9TZXR0aW5ncy5fcHJpdnByb3BkaWN0ID0geworICAgICdCdWlsZF9CZWZvcmVfUnVubmluZycgOiBfUHJvcF9CdWlsZF9CZWZvcmVfUnVubmluZywKKyAgICAnQ29tcGlsZXJfVGhyZWFkX1N0YWNrX1NpemUnIDogX1Byb3BfQ29tcGlsZXJfVGhyZWFkX1N0YWNrX1NpemUsCisgICAgJ0NvbXBsZXRpb25fU291bmQnIDogX1Byb3BfQ29tcGxldGlvbl9Tb3VuZCwKKyAgICAnRmFpbHVyZV9Tb3VuZCcgOiBfUHJvcF9GYWlsdXJlX1NvdW5kLAorICAgICdJbmNsdWRlX0NhY2hlX1NpemUnIDogX1Byb3BfSW5jbHVkZV9DYWNoZV9TaXplLAorICAgICdTYXZlX0JlZm9yZV9CdWlsZGluZycgOiBfUHJvcF9TYXZlX0JlZm9yZV9CdWlsZGluZywKKyAgICAnU3VjY2Vzc19Tb3VuZCcgOiBfUHJvcF9TdWNjZXNzX1NvdW5kLAorfQorQnVpbGRfU2V0dGluZ3MuX3ByaXZlbGVtZGljdCA9IHsKK30KK2Jhc2VfY2xhc3MuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitiYXNlX2NsYXNzLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2FjY2VzcycgOiBfUHJvcF9hY2Nlc3MsCisgICAgJ2NsYXNzXycgOiBfUHJvcF9jbGFzc18sCisgICAgJ3ZpcnR1YWwnIDogX1Byb3BfdmlydHVhbCwKK30KK2Jhc2VfY2xhc3MuX3ByaXZlbGVtZGljdCA9IHsKK30KK0N1c3RvbV9LZXl3b3Jkcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK0N1c3RvbV9LZXl3b3Jkcy5fcHJpdnByb3BkaWN0ID0geworICAgICdDdXN0b21fQ29sb3JfMScgOiBfUHJvcF9DdXN0b21fQ29sb3JfMSwKKyAgICAnQ3VzdG9tX0NvbG9yXzInIDogX1Byb3BfQ3VzdG9tX0NvbG9yXzIsCisgICAgJ0N1c3RvbV9Db2xvcl8zJyA6IF9Qcm9wX0N1c3RvbV9Db2xvcl8zLAorICAgICdDdXN0b21fQ29sb3JfNCcgOiBfUHJvcF9DdXN0b21fQ29sb3JfNCwKK30KK0N1c3RvbV9LZXl3b3Jkcy5fcHJpdmVsZW1kaWN0ID0geworfQorYnJvd3Nlcl9jYXRhbG9nLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorYnJvd3Nlcl9jYXRhbG9nLl9wcml2cHJvcGRpY3QgPSB7Cit9Citicm93c2VyX2NhdGFsb2cuX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnY2xhc3NfJyA6IGNsYXNzXywKK30KK2NsYXNzXy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2NsYXNzXy5fcHJpdnByb3BkaWN0ID0geworICAgICdhbGxfc3ViY2xhc3NlcycgOiBfUHJvcF9hbGxfc3ViY2xhc3NlcywKKyAgICAnZGVjbGFyYXRpb25fZW5kX29mZnNldCcgOiBfUHJvcF9kZWNsYXJhdGlvbl9lbmRfb2Zmc2V0LAorICAgICdkZWNsYXJhdGlvbl9maWxlJyA6IF9Qcm9wX2RlY2xhcmF0aW9uX2ZpbGUsCisgICAgJ2RlY2xhcmF0aW9uX3N0YXJ0X29mZnNldCcgOiBfUHJvcF9kZWNsYXJhdGlvbl9zdGFydF9vZmZzZXQsCisgICAgJ2xhbmd1YWdlJyA6IF9Qcm9wX2xhbmd1YWdlLAorICAgICduYW1lJyA6IF9Qcm9wX25hbWUsCisgICAgJ3N1YmNsYXNzZXMnIDogX1Byb3Bfc3ViY2xhc3NlcywKK30KK2NsYXNzXy5fcHJpdmVsZW1kaWN0ID0geworICAgICdiYXNlX2NsYXNzJyA6IGJhc2VfY2xhc3MsCisgICAgJ2RhdGFfbWVtYmVyJyA6IGRhdGFfbWVtYmVyLAorICAgICdtZW1iZXJfZnVuY3Rpb24nIDogbWVtYmVyX2Z1bmN0aW9uLAorfQorRGVidWdnZXJfRGlzcGxheS5fc3VwZXJjbGFzc25hbWVzID0gW10KK0RlYnVnZ2VyX0Rpc3BsYXkuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnRGVmYXVsdF9BcnJheV9TaXplJyA6IF9Qcm9wX0RlZmF1bHRfQXJyYXlfU2l6ZSwKKyAgICAnU2hvd19Bc19EZWNpbWFsJyA6IF9Qcm9wX1Nob3dfQXNfRGVjaW1hbCwKKyAgICAnU2hvd19Mb2NhbHMnIDogX1Byb3BfU2hvd19Mb2NhbHMsCisgICAgJ1Nob3dfVmFyaWFibGVfVHlwZXMnIDogX1Byb3BfU2hvd19WYXJpYWJsZV9UeXBlcywKKyAgICAnU29ydF9CeV9NZXRob2QnIDogX1Byb3BfU29ydF9CeV9NZXRob2QsCisgICAgJ1RocmVhZHNfaW5fV2luZG93JyA6IF9Qcm9wX1RocmVhZHNfaW5fV2luZG93LAorICAgICdVc2VfUlRUSScgOiBfUHJvcF9Vc2VfUlRUSSwKKyAgICAnVmFyaWFibGVfQ2hhbmdlZF9IaWxpdGUnIDogX1Byb3BfVmFyaWFibGVfQ2hhbmdlZF9IaWxpdGUsCisgICAgJ1ZhcmlhYmxlX0hpbnRzJyA6IF9Qcm9wX1ZhcmlhYmxlX0hpbnRzLAorICAgICdXYXRjaHBvaW50X0hpbGl0ZScgOiBfUHJvcF9XYXRjaHBvaW50X0hpbGl0ZSwKK30KK0RlYnVnZ2VyX0Rpc3BsYXkuX3ByaXZlbGVtZGljdCA9IHsKK30KK0RlYnVnZ2VyX0dsb2JhbC5fc3VwZXJjbGFzc25hbWVzID0gW10KK0RlYnVnZ2VyX0dsb2JhbC5fcHJpdnByb3BkaWN0ID0geworICAgICdBdXRvX1RhcmdldF9MaWJyYXJpZXMnIDogX1Byb3BfQXV0b19UYXJnZXRfTGlicmFyaWVzLAorICAgICdDYWNoZV9FZGl0ZWRfRmlsZXMnIDogX1Byb3BfQ2FjaGVfRWRpdGVkX0ZpbGVzLAorICAgICdDb25maXJtX0tpbGwnIDogX1Byb3BfQ29uZmlybV9LaWxsLAorICAgICdEb250X1N0ZXBfaW5fUnVudGltZScgOiBfUHJvcF9Eb250X1N0ZXBfaW5fUnVudGltZSwKKyAgICAnRmlsZV9DYWNoZV9EdXJhdGlvbicgOiBfUHJvcF9GaWxlX0NhY2hlX0R1cmF0aW9uLAorICAgICdJZ25vcmVfTW9kX0RhdGVzJyA6IF9Qcm9wX0lnbm9yZV9Nb2RfRGF0ZXMsCisgICAgJ0xhdW5jaF9BcHBzX29uX09wZW4nIDogX1Byb3BfTGF1bmNoX0FwcHNfb25fT3BlbiwKKyAgICAnT3Blbl9BbGxfQ2xhc3NlcycgOiBfUHJvcF9PcGVuX0FsbF9DbGFzc2VzLAorICAgICdTZWxlY3RfU3RhY2tfQ3Jhd2wnIDogX1Byb3BfU2VsZWN0X1N0YWNrX0NyYXdsLAorICAgICdTdG9wX2F0X01haW4nIDogX1Byb3BfU3RvcF9hdF9NYWluLAorfQorRGVidWdnZXJfR2xvYmFsLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitEZWJ1Z2dlcl9UYXJnZXQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitEZWJ1Z2dlcl9UYXJnZXQuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnQXV0b19UYXJnZXRfTGlicmFyaWVzJyA6IF9Qcm9wX0F1dG9fVGFyZ2V0X0xpYnJhcmllcywKKyAgICAnQ2FjaGVfc3ltYm9saWNzJyA6IF9Qcm9wX0NhY2hlX3N5bWJvbGljcywKKyAgICAnRGF0YV9VcGRhdGVfSW50ZXJ2YWwnIDogX1Byb3BfRGF0YV9VcGRhdGVfSW50ZXJ2YWwsCisgICAgJ0xvZ19TeXN0ZW1fTWVzc2FnZXMnIDogX1Byb3BfTG9nX1N5c3RlbV9NZXNzYWdlcywKKyAgICAnUmVsb2NhdGVkX0V4ZWN1dGFibGVfUGF0aCcgOiBfUHJvcF9SZWxvY2F0ZWRfRXhlY3V0YWJsZV9QYXRoLAorICAgICdTdG9wX2F0X3RlbXBfYnJlYWtwb2ludCcgOiBfUHJvcF9TdG9wX2F0X3RlbXBfYnJlYWtwb2ludCwKKyAgICAnVGVtcF9CcmVha3BvaW50X1R5cGUnIDogX1Byb3BfVGVtcF9CcmVha3BvaW50X1R5cGUsCisgICAgJ1RlbXBfYnJlYWtwb2ludF9uYW1lcycgOiBfUHJvcF9UZW1wX2JyZWFrcG9pbnRfbmFtZXMsCisgICAgJ1VwZGF0ZV9EYXRhX1doaWxlX1J1bm5pbmcnIDogX1Byb3BfVXBkYXRlX0RhdGFfV2hpbGVfUnVubmluZywKK30KK0RlYnVnZ2VyX1RhcmdldC5fcHJpdmVsZW1kaWN0ID0geworfQorRGVidWdnZXJfV2luZG93aW5nLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorRGVidWdnZXJfV2luZG93aW5nLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ0RlYnVnZ2luZ19TdGFydF9BY3Rpb24nIDogX1Byb3BfRGVidWdnaW5nX1N0YXJ0X0FjdGlvbiwKKyAgICAnRG9fTm90aGluZ19Ub19Qcm9qZWN0cycgOiBfUHJvcF9Eb19Ob3RoaW5nX1RvX1Byb2plY3RzLAorfQorRGVidWdnZXJfV2luZG93aW5nLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitkYXRhX21lbWJlci5fc3VwZXJjbGFzc25hbWVzID0gW10KK2RhdGFfbWVtYmVyLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2FjY2VzcycgOiBfUHJvcF9hY2Nlc3MsCisgICAgJ2RlY2xhcmF0aW9uX2VuZF9vZmZzZXQnIDogX1Byb3BfZGVjbGFyYXRpb25fZW5kX29mZnNldCwKKyAgICAnZGVjbGFyYXRpb25fc3RhcnRfb2Zmc2V0JyA6IF9Qcm9wX2RlY2xhcmF0aW9uX3N0YXJ0X29mZnNldCwKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorICAgICdzdGF0aWMnIDogX1Byb3Bfc3RhdGljLAorfQorZGF0YV9tZW1iZXIuX3ByaXZlbGVtZGljdCA9IHsKK30KK0VkaXRvci5fc3VwZXJjbGFzc25hbWVzID0gW10KK0VkaXRvci5fcHJpdnByb3BkaWN0ID0geworICAgICdCYWNrZ3JvdW5kX0NvbG9yJyA6IF9Qcm9wX0JhY2tncm91bmRfQ29sb3IsCisgICAgJ0JhbGFuY2UnIDogX1Byb3BfQmFsYW5jZSwKKyAgICAnQ29udGV4dF9Qb3B1cF9EZWxheScgOiBfUHJvcF9Db250ZXh0X1BvcHVwX0RlbGF5LAorICAgICdEZWZhdWx0X1RleHRfRmlsZV9Gb3JtYXQnIDogX1Byb3BfRGVmYXVsdF9UZXh0X0ZpbGVfRm9ybWF0LAorICAgICdEeW5hbWljX1Njcm9sbCcgOiBfUHJvcF9EeW5hbWljX1Njcm9sbCwKKyAgICAnRmxhc2hfRGVsYXknIDogX1Byb3BfRmxhc2hfRGVsYXksCisgICAgJ0xlZnRfTWFyZ2luX0xpbmVfU2VsZWN0JyA6IF9Qcm9wX0xlZnRfTWFyZ2luX0xpbmVfU2VsZWN0LAorICAgICdNYWluX1RleHRfQ29sb3InIDogX1Byb3BfTWFpbl9UZXh0X0NvbG9yLAorICAgICdSZWxheGVkX0NfUG9wdXBfUGFyc2luZycgOiBfUHJvcF9SZWxheGVkX0NfUG9wdXBfUGFyc2luZywKKyAgICAnUmVtZW1iZXJfRm9udCcgOiBfUHJvcF9SZW1lbWJlcl9Gb250LAorICAgICdSZW1lbWJlcl9TZWxlY3Rpb24nIDogX1Byb3BfUmVtZW1iZXJfU2VsZWN0aW9uLAorICAgICdSZW1lbWJlcl9XaW5kb3cnIDogX1Byb3BfUmVtZW1iZXJfV2luZG93LAorICAgICdTb3J0X0Z1bmN0aW9uX1BvcHVwJyA6IF9Qcm9wX1NvcnRfRnVuY3Rpb25fUG9wdXAsCisgICAgJ1VzZV9EcmFnX18yNl9fRHJvcF9FZGl0aW5nJyA6IF9Qcm9wX1VzZV9EcmFnX18yNl9fRHJvcF9FZGl0aW5nLAorICAgICdVc2VfTXVsdGlwbGVfVW5kbycgOiBfUHJvcF9Vc2VfTXVsdGlwbGVfVW5kbywKK30KK0VkaXRvci5fcHJpdmVsZW1kaWN0ID0geworfQorRW52aXJvbm1lbnRfVmFyaWFibGUuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitFbnZpcm9ubWVudF9WYXJpYWJsZS5fcHJpdnByb3BkaWN0ID0geworICAgICduYW1lJyA6IF9Qcm9wX25hbWUsCisgICAgJ3ZhbHVlJyA6IF9Qcm9wX3ZhbHVlLAorfQorRW52aXJvbm1lbnRfVmFyaWFibGUuX3ByaXZlbGVtZGljdCA9IHsKK30KK0Vycm9yX0luZm9ybWF0aW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorRXJyb3JfSW5mb3JtYXRpb24uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnZGlza19maWxlJyA6IF9Qcm9wX2Rpc2tfZmlsZSwKKyAgICAnbGluZU51bWJlcicgOiBfUHJvcF9saW5lTnVtYmVyLAorICAgICdtZXNzYWdlJyA6IF9Qcm9wX21lc3NhZ2UsCisgICAgJ21lc3NhZ2VLaW5kJyA6IF9Qcm9wX21lc3NhZ2VLaW5kLAorfQorRXJyb3JfSW5mb3JtYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKK30KK0Z1bmN0aW9uX0luZm9ybWF0aW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorRnVuY3Rpb25fSW5mb3JtYXRpb24uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnZGlza19maWxlJyA6IF9Qcm9wX2Rpc2tfZmlsZSwKKyAgICAnbGluZU51bWJlcicgOiBfUHJvcF9saW5lTnVtYmVyLAorfQorRnVuY3Rpb25fSW5mb3JtYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKK30KK0ZpbGVfTWFwcGluZ3MuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitGaWxlX01hcHBpbmdzLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ01hcHBpbmdzJyA6IF9Qcm9wX01hcHBpbmdzLAorfQorRmlsZV9NYXBwaW5ncy5fcHJpdmVsZW1kaWN0ID0geworfQorRmlsZV9NYXBwaW5nLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorRmlsZV9NYXBwaW5nLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ0NvbXBpbGVyJyA6IF9Qcm9wX0NvbXBpbGVyLAorICAgICdFeHRlbnNpb24nIDogX1Byb3BfRXh0ZW5zaW9uLAorICAgICdGaWxlX1R5cGUnIDogX1Byb3BfRmlsZV9UeXBlLAorICAgICdJZ25vcmVkX2J5X01ha2UnIDogX1Byb3BfSWdub3JlZF9ieV9NYWtlLAorICAgICdMYXVuY2hhYmxlJyA6IF9Qcm9wX0xhdW5jaGFibGUsCisgICAgJ1ByZWNvbXBpbGVkJyA6IF9Qcm9wX1ByZWNvbXBpbGVkLAorICAgICdSZXNvdXJjZV9GaWxlJyA6IF9Qcm9wX1Jlc291cmNlX0ZpbGUsCit9CitGaWxlX01hcHBpbmcuX3ByaXZlbGVtZGljdCA9IHsKK30KK0dsb2JhbF9Tb3VyY2VfVHJlZXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitHbG9iYWxfU291cmNlX1RyZWVzLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ1NvdXJjZV9UcmVlcycgOiBfUHJvcF9Tb3VyY2VfVHJlZXMsCit9CitHbG9iYWxfU291cmNlX1RyZWVzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitFeHRyYXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitFeHRyYXMuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnQXV0b21hdGljX1Rvb2xiYXJfSGVscCcgOiBfUHJvcF9BdXRvbWF0aWNfVG9vbGJhcl9IZWxwLAorICAgICdFeHRlcm5hbF9SZWZlcmVuY2UnIDogX1Byb3BfRXh0ZXJuYWxfUmVmZXJlbmNlLAorICAgICdGdWxsX1NjcmVlbl9ab29tJyA6IF9Qcm9wX0Z1bGxfU2NyZWVuX1pvb20sCisgICAgJ1JlY2VudF9FZGl0b3JfQ291bnQnIDogX1Byb3BfUmVjZW50X0VkaXRvcl9Db3VudCwKKyAgICAnUmVjZW50X1Byb2plY3RfQ291bnQnIDogX1Byb3BfUmVjZW50X1Byb2plY3RfQ291bnQsCisgICAgJ1VzZV9FZGl0b3JfRXh0ZW5zaW9ucycgOiBfUHJvcF9Vc2VfRWRpdG9yX0V4dGVuc2lvbnMsCisgICAgJ1VzZV9FeHRlcm5hbF9FZGl0b3InIDogX1Byb3BfVXNlX0V4dGVybmFsX0VkaXRvciwKKyAgICAnVXNlX1NjcmlwdF9NZW51JyA6IF9Qcm9wX1VzZV9TY3JpcHRfTWVudSwKKyAgICAnVXNlX1Rvb2xTZXJ2ZXJfTWVudScgOiBfUHJvcF9Vc2VfVG9vbFNlcnZlcl9NZW51LAorfQorRXh0cmFzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitCdWlsZF9FeHRyYXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitCdWlsZF9FeHRyYXMuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnQnJvd3Nlcl9BY3RpdmUnIDogX1Byb3BfQnJvd3Nlcl9BY3RpdmUsCisgICAgJ0NhY2hlX1N1YnByb2plY3RfRGF0YScgOiBfUHJvcF9DYWNoZV9TdWJwcm9qZWN0X0RhdGEsCisgICAgJ0R1bXBfQnJvd3Nlcl9JbmZvJyA6IF9Qcm9wX0R1bXBfQnJvd3Nlcl9JbmZvLAorICAgICdNb2RpZmljYXRpb25fRGF0ZV9DYWNoaW5nJyA6IF9Qcm9wX01vZGlmaWNhdGlvbl9EYXRlX0NhY2hpbmcsCit9CitCdWlsZF9FeHRyYXMuX3ByaXZlbGVtZGljdCA9IHsKK30KK21lbWJlcl9mdW5jdGlvbi5fc3VwZXJjbGFzc25hbWVzID0gW10KK21lbWJlcl9mdW5jdGlvbi5fcHJpdnByb3BkaWN0ID0geworICAgICdhY2Nlc3MnIDogX1Byb3BfYWNjZXNzLAorICAgICdkZWNsYXJhdGlvbl9lbmRfb2Zmc2V0JyA6IF9Qcm9wX2RlY2xhcmF0aW9uX2VuZF9vZmZzZXQsCisgICAgJ2RlY2xhcmF0aW9uX2ZpbGUnIDogX1Byb3BfZGVjbGFyYXRpb25fZmlsZSwKKyAgICAnZGVjbGFyYXRpb25fc3RhcnRfb2Zmc2V0JyA6IF9Qcm9wX2RlY2xhcmF0aW9uX3N0YXJ0X29mZnNldCwKKyAgICAnaW1wbGVtZW50YXRpb25fZW5kX29mZnNldCcgOiBfUHJvcF9pbXBsZW1lbnRhdGlvbl9lbmRfb2Zmc2V0LAorICAgICdpbXBsZW1lbnRhdGlvbl9maWxlJyA6IF9Qcm9wX2ltcGxlbWVudGF0aW9uX2ZpbGUsCisgICAgJ2ltcGxlbWVudGF0aW9uX3N0YXJ0X29mZnNldCcgOiBfUHJvcF9pbXBsZW1lbnRhdGlvbl9zdGFydF9vZmZzZXQsCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAnc3RhdGljJyA6IF9Qcm9wX3N0YXRpYywKKyAgICAndmlydHVhbCcgOiBfUHJvcF92aXJ0dWFsLAorfQorbWVtYmVyX2Z1bmN0aW9uLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitBY2Nlc3NfUGF0aHMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitBY2Nlc3NfUGF0aHMuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnQWx3YXlzX0Z1bGxfU2VhcmNoJyA6IF9Qcm9wX0Fsd2F5c19GdWxsX1NlYXJjaCwKKyAgICAnQ29udmVydF9QYXRocycgOiBfUHJvcF9Db252ZXJ0X1BhdGhzLAorICAgICdSZXF1aXJlX0ZyYW1ld29ya19JbmNsdWRlcycgOiBfUHJvcF9SZXF1aXJlX0ZyYW1ld29ya19JbmNsdWRlcywKKyAgICAnU3lzdGVtX1BhdGhzJyA6IF9Qcm9wX1N5c3RlbV9QYXRocywKKyAgICAnVXNlcl9QYXRocycgOiBfUHJvcF9Vc2VyX1BhdGhzLAorfQorQWNjZXNzX1BhdGhzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitQYXRoX0luZm9ybWF0aW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorUGF0aF9JbmZvcm1hdGlvbi5fcHJpdnByb3BkaWN0ID0geworICAgICdmb3JtYXQnIDogX1Byb3BfZm9ybWF0LAorICAgICdmcmFtZXdvcmsnIDogX1Byb3BfZnJhbWV3b3JrLAorICAgICdob3N0X2ZsYWdzJyA6IF9Qcm9wX2hvc3RfZmxhZ3MsCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAnb3JpZ2luJyA6IF9Qcm9wX29yaWdpbiwKKyAgICAncmVjdXJzaXZlJyA6IF9Qcm9wX3JlY3Vyc2l2ZSwKKyAgICAncm9vdCcgOiBfUHJvcF9yb290LAorfQorUGF0aF9JbmZvcm1hdGlvbi5fcHJpdmVsZW1kaWN0ID0geworfQorUGx1Z2luX1NldHRpbmdzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorUGx1Z2luX1NldHRpbmdzLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ0Rpc2FibGVfVGhpcmRfUGFydHlfQ09NX1BsdWdpbnMnIDogX1Byb3BfRGlzYWJsZV9UaGlyZF9QYXJ0eV9DT01fUGx1Z2lucywKKyAgICAnUGx1Z2luX0RpYWdub3N0aWNzX0xldmVsJyA6IF9Qcm9wX1BsdWdpbl9EaWFnbm9zdGljc19MZXZlbCwKK30KK1BsdWdpbl9TZXR0aW5ncy5fcHJpdmVsZW1kaWN0ID0geworfQorUnVudGltZV9TZXR0aW5ncy5fc3VwZXJjbGFzc25hbWVzID0gW10KK1J1bnRpbWVfU2V0dGluZ3MuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnQ29tbWFuZF9MaW5lX0FyZ3VtZW50cycgOiBfUHJvcF9Db21tYW5kX0xpbmVfQXJndW1lbnRzLAorICAgICdFbnZpcm9ubWVudF9WYXJpYWJsZXMnIDogX1Byb3BfRW52aXJvbm1lbnRfVmFyaWFibGVzLAorICAgICdIb3N0X0FwcGxpY2F0aW9uJyA6IF9Qcm9wX0hvc3RfQXBwbGljYXRpb24sCisgICAgJ1dvcmtpbmdfRGlyZWN0b3J5JyA6IF9Qcm9wX1dvcmtpbmdfRGlyZWN0b3J5LAorfQorUnVudGltZV9TZXR0aW5ncy5fcHJpdmVsZW1kaWN0ID0geworfQorUmVsYXRpdmVfUGF0aC5fc3VwZXJjbGFzc25hbWVzID0gW10KK1JlbGF0aXZlX1BhdGguX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnZm9ybWF0JyA6IF9Qcm9wX2Zvcm1hdCwKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorICAgICdvcmlnaW4nIDogX1Byb3Bfb3JpZ2luLAorICAgICdyb290JyA6IF9Qcm9wX3Jvb3QsCit9CitSZWxhdGl2ZV9QYXRoLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitTaGllbGRlZF9Gb2xkZXIuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitTaGllbGRlZF9Gb2xkZXIuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnRXhwcmVzc2lvbl9Ub19NYXRjaCcgOiBfUHJvcF9FeHByZXNzaW9uX1RvX01hdGNoLAorICAgICdTa2lwX0ZpbmRfQW5kX0NvbXBhcmVfT3BlcmF0aW9ucycgOiBfUHJvcF9Ta2lwX0ZpbmRfQW5kX0NvbXBhcmVfT3BlcmF0aW9ucywKKyAgICAnU2tpcF9Qcm9qZWN0X09wZXJhdGlvbnMnIDogX1Byb3BfU2tpcF9Qcm9qZWN0X09wZXJhdGlvbnMsCit9CitTaGllbGRlZF9Gb2xkZXIuX3ByaXZlbGVtZGljdCA9IHsKK30KK1NoaWVsZGVkX0ZvbGRlcnMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitTaGllbGRlZF9Gb2xkZXJzLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ1NoaWVsZGVkX0l0ZW1zJyA6IF9Qcm9wX1NoaWVsZGVkX0l0ZW1zLAorfQorU2hpZWxkZWRfRm9sZGVycy5fcHJpdmVsZW1kaWN0ID0geworfQorU3ludGF4X0NvbG9yaW5nLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorU3ludGF4X0NvbG9yaW5nLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ0NvbW1lbnRfQ29sb3InIDogX1Byb3BfQ29tbWVudF9Db2xvciwKKyAgICAnQ3VzdG9tX0NvbG9yXzEnIDogX1Byb3BfQ3VzdG9tX0NvbG9yXzEsCisgICAgJ0N1c3RvbV9Db2xvcl8yJyA6IF9Qcm9wX0N1c3RvbV9Db2xvcl8yLAorICAgICdDdXN0b21fQ29sb3JfMycgOiBfUHJvcF9DdXN0b21fQ29sb3JfMywKKyAgICAnQ3VzdG9tX0NvbG9yXzQnIDogX1Byb3BfQ3VzdG9tX0NvbG9yXzQsCisgICAgJ0tleXdvcmRfQ29sb3InIDogX1Byb3BfS2V5d29yZF9Db2xvciwKKyAgICAnU3RyaW5nX0NvbG9yJyA6IF9Qcm9wX1N0cmluZ19Db2xvciwKKyAgICAnU3ludGF4X0NvbG9yaW5nJyA6IF9Qcm9wX1N5bnRheF9Db2xvcmluZywKK30KK1N5bnRheF9Db2xvcmluZy5fcHJpdmVsZW1kaWN0ID0geworfQorU2VnbWVudC5fc3VwZXJjbGFzc25hbWVzID0gW10KK1NlZ21lbnQuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnZmlsZWNvdW50JyA6IF9Qcm9wX2ZpbGVjb3VudCwKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorICAgICdzZWdfMmRfbG9ja2VkJyA6IF9Qcm9wX3NlZ18yZF9sb2NrZWQsCisgICAgJ3NlZ18yZF9wcmVsb2FkZWQnIDogX1Byb3Bfc2VnXzJkX3ByZWxvYWRlZCwKKyAgICAnc2VnXzJkX3Byb3RlY3RlZCcgOiBfUHJvcF9zZWdfMmRfcHJvdGVjdGVkLAorICAgICdzZWdfMmRfcHVyZ2VhYmxlJyA6IF9Qcm9wX3NlZ18yZF9wdXJnZWFibGUsCisgICAgJ3NlZ18yZF9zeXN0ZW1faGVhcCcgOiBfUHJvcF9zZWdfMmRfc3lzdGVtX2hlYXAsCit9CitTZWdtZW50Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitQcm9qZWN0RmlsZS5fc3VwZXJjbGFzc25hbWVzID0gW10KK1Byb2plY3RGaWxlLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2NvZGVzaXplJyA6IF9Qcm9wX2NvZGVzaXplLAorICAgICdkYXRhc2l6ZScgOiBfUHJvcF9kYXRhc2l6ZSwKKyAgICAnZGlza19maWxlJyA6IF9Qcm9wX2Rpc2tfZmlsZSwKKyAgICAnZmlsZXR5cGUnIDogX1Byb3BfZmlsZXR5cGUsCisgICAgJ2luY2x1ZGVzJyA6IF9Qcm9wX2luY2x1ZGVzLAorICAgICdpbml0aWFsaXplX2JlZm9yZScgOiBfUHJvcF9pbml0aWFsaXplX2JlZm9yZSwKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorICAgICdzeW1ib2xzJyA6IF9Qcm9wX3N5bWJvbHMsCisgICAgJ3VwX3RvX2RhdGUnIDogX1Byb3BfdXBfdG9fZGF0ZSwKKyAgICAnd2Vha19saW5rJyA6IF9Qcm9wX3dlYWtfbGluaywKK30KK1Byb2plY3RGaWxlLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitTb3VyY2VfVHJlZS5fc3VwZXJjbGFzc25hbWVzID0gW10KK1NvdXJjZV9UcmVlLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2Zvcm1hdCcgOiBfUHJvcF9mb3JtYXQsCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAncGF0aCcgOiBfUHJvcF9wYXRoLAorICAgICdwYXRoX2tpbmQnIDogX1Byb3BfcGF0aF9raW5kLAorfQorU291cmNlX1RyZWUuX3ByaXZlbGVtZGljdCA9IHsKK30KK1RhcmdldF9TZXR0aW5ncy5fc3VwZXJjbGFzc25hbWVzID0gW10KK1RhcmdldF9TZXR0aW5ncy5fcHJpdnByb3BkaWN0ID0geworICAgICdMaW5rZXInIDogX1Byb3BfTGlua2VyLAorICAgICdPdXRwdXRfRGlyZWN0b3J5X0xvY2F0aW9uJyA6IF9Qcm9wX091dHB1dF9EaXJlY3RvcnlfTG9jYXRpb24sCisgICAgJ091dHB1dF9EaXJlY3RvcnlfT3JpZ2luJyA6IF9Qcm9wX091dHB1dF9EaXJlY3RvcnlfT3JpZ2luLAorICAgICdPdXRwdXRfRGlyZWN0b3J5X1BhdGgnIDogX1Byb3BfT3V0cHV0X0RpcmVjdG9yeV9QYXRoLAorICAgICdQb3N0X0xpbmtlcicgOiBfUHJvcF9Qb3N0X0xpbmtlciwKKyAgICAnUHJlX0xpbmtlcicgOiBfUHJvcF9QcmVfTGlua2VyLAorICAgICdUYXJnZXRfTmFtZScgOiBfUHJvcF9UYXJnZXRfTmFtZSwKKyAgICAnVXNlX1JlbGF0aXZlX1BhdGhzJyA6IF9Qcm9wX1VzZV9SZWxhdGl2ZV9QYXRocywKK30KK1RhcmdldF9TZXR0aW5ncy5fcHJpdmVsZW1kaWN0ID0geworfQorVGFyZ2V0X1NvdXJjZV9UcmVlcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK1RhcmdldF9Tb3VyY2VfVHJlZXMuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnU291cmNlX1RyZWVzJyA6IF9Qcm9wX1NvdXJjZV9UcmVlcywKK30KK1RhcmdldF9Tb3VyY2VfVHJlZXMuX3ByaXZlbGVtZGljdCA9IHsKK30KK1ZDU19TZXR1cC5fc3VwZXJjbGFzc25hbWVzID0gW10KK1ZDU19TZXR1cC5fcHJpdnByb3BkaWN0ID0geworICAgICdBbHdheXNfUHJvbXB0JyA6IF9Qcm9wX0Fsd2F5c19Qcm9tcHQsCisgICAgJ0F1dG9fQ29ubmVjdCcgOiBfUHJvcF9BdXRvX0Nvbm5lY3QsCisgICAgJ0Nvbm5lY3Rpb25fTWV0aG9kJyA6IF9Qcm9wX0Nvbm5lY3Rpb25fTWV0aG9kLAorICAgICdEYXRhYmFzZV9QYXRoJyA6IF9Qcm9wX0RhdGFiYXNlX1BhdGgsCisgICAgJ0xvY2FsX1BhdGgnIDogX1Byb3BfTG9jYWxfUGF0aCwKKyAgICAnTW91bnRfVm9sdW1lJyA6IF9Qcm9wX01vdW50X1ZvbHVtZSwKKyAgICAnUGFzc3dvcmQnIDogX1Byb3BfUGFzc3dvcmQsCisgICAgJ1N0b3JlX1Bhc3N3b3JkJyA6IF9Qcm9wX1N0b3JlX1Bhc3N3b3JkLAorICAgICdVc2VfR2xvYmFsX1NldHRpbmdzJyA6IF9Qcm9wX1VzZV9HbG9iYWxfU2V0dGluZ3MsCisgICAgJ1VzZXJuYW1lJyA6IF9Qcm9wX1VzZXJuYW1lLAorICAgICdWQ1NfQWN0aXZlJyA6IF9Qcm9wX1ZDU19BY3RpdmUsCit9CitWQ1NfU2V0dXAuX3ByaXZlbGVtZGljdCA9IHsKK30KK0ZvbnQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitGb250Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ0F1dG9fSW5kZW50JyA6IF9Qcm9wX0F1dG9fSW5kZW50LAorICAgICdUYWJfSW5kZW50c19TZWxlY3Rpb24nIDogX1Byb3BfVGFiX0luZGVudHNfU2VsZWN0aW9uLAorICAgICdUYWJfSW5zZXJ0c19TcGFjZXMnIDogX1Byb3BfVGFiX0luc2VydHNfU3BhY2VzLAorICAgICdUYWJfU2l6ZScgOiBfUHJvcF9UYWJfU2l6ZSwKKyAgICAnVGV4dF9Gb250JyA6IF9Qcm9wX1RleHRfRm9udCwKKyAgICAnVGV4dF9TaXplJyA6IF9Qcm9wX1RleHRfU2l6ZSwKK30KK0ZvbnQuX3ByaXZlbGVtZGljdCA9IHsKK30KK19FbnVtX0FjY2UgPSB7CisgICAgJ3B1YmxpYycgOiAnUHVibCcsICAjCisgICAgJ3Byb3RlY3RlZCcgOiAnUHJvdCcsICAgICAgICMKKyAgICAncHJpdmF0ZScgOiAnUHJpdicsICMKK30KKworX0VudW1fQlhiciA9IHsKKyAgICAnQWx3YXlzX0J1aWxkJyA6ICdCWGIxJywgICAgIyBBbHdheXMgYnVpbGQgdGhlIHRhcmdldCBiZWZvcmUgcnVubmluZy4KKyAgICAnQXNrX0J1aWxkJyA6ICdCWGIyJywgICAgICAgIyBBc2sgYmVmb3JlIGJ1aWxkaW5nIHRoZSB0YXJnZXQgd2hlbiBydW5uaW5nLgorICAgICdOZXZlcl9CdWlsZCcgOiAnQlhiMycsICAgICAjIE5ldmVyIGJlZm9yZSBidWlsZGluZyB0aGUgdGFyZ2V0IGJlZm9yZSBydW5uaW5nLgorfQorCitfRW51bV9EYlNBID0geworICAgICdOb19BY3Rpb24nIDogJ0RTQTEnLCAgICAgICAjIERvblx4ZDV0IGRvIGFueXRoaW5nIHRvIG5vbi1kZWJ1ZyB3aW5kb3dzCisgICAgJ0hpZGVfV2luZG93cycgOiAnRFNBMicsICAgICMgSGlkZSBub24tZGVidWdnaW5nIHdpbmRvd3MKKyAgICAnQ29sbGFwc2VfV2luZG93cycgOiAnRFNBMycsICAgICAgICAjIENvbGxhcHNlIG5vbi1kZWJ1Z2dpbmcgd2luZG93cworICAgICdDbG9zZV9XaW5kb3dzJyA6ICdEU0E0JywgICAjIENsb3NlIG5vbi1kZWJ1Z2dpbmcgd2luZG93cworfQorCitfRW51bV9EZ0JMID0geworICAgICdBbHdheXMnIDogJ0RnQjAnLCAgIyBBbHdheXMgYnVpbGQgYmVmb3JlIGRlYnVnZ2luZy4KKyAgICAnTmV2ZXInIDogJ0RnQjEnLCAgICMgTmV2ZXIgYnVpbGQgYmVmb3JlIGRlYnVnZ2luZy4KKyAgICAnQXNrJyA6ICdEZ0IyJywgICAgICMgQXNrIGFib3V0IGJ1aWxkaW5nIGJlZm9yZSBkZWJ1Z2dpbmcuCit9CisKK19FbnVtX0VyclQgPSB7CisgICAgJ2luZm9ybWF0aW9uJyA6ICdFckluJywgICAgICMKKyAgICAnY29tcGlsZXJfd2FybmluZycgOiAnRXJDVycsICAgICAgICAjCisgICAgJ2NvbXBpbGVyX2Vycm9yJyA6ICdFckNFJywgICMKKyAgICAnZGVmaW5pdGlvbicgOiAnRXJEZicsICAgICAgIworICAgICdsaW5rZXJfd2FybmluZycgOiAnRXJMVycsICAjCisgICAgJ2xpbmtlcl9lcnJvcicgOiAnRXJMRScsICAgICMKKyAgICAnZmluZF9yZXN1bHQnIDogJ0VyRm4nLCAgICAgIworICAgICdnZW5lcmljX2Vycm9yJyA6ICdFckduJywgICAjCit9CisKK19FbnVtX0ludGUgPSB7CisgICAgJ25ldmVyX2ludGVyYWN0JyA6ICdlTnZyJywgICMgTmV2ZXIgYWxsb3cgdXNlciBpbnRlcmFjdGlvbnMKKyAgICAnaW50ZXJhY3Rfd2l0aF9zZWxmJyA6ICdlSW5TJywgICAgICAjIEFsbG93IHVzZXIgaW50ZXJhY3Rpb24gb25seSB3aGVuIGFuIEFwcGxlRXZlbnQgaXMgc2VudCBmcm9tIHdpdGhpbiBDb2RlV2FycmlvcgorICAgICdpbnRlcmFjdF93aXRoX2xvY2FsJyA6ICdlSW5MJywgICAgICMgQWxsb3cgdXNlciBpbnRlcmFjdGlvbiB3aGVuIEFwcGxlRXZlbnRzIGFyZSBzZW50IGZyb20gYXBwbGljYXRpb25zIG9uIHRoZSBzYW1lIG1hY2hpbmUgKGRlZmF1bHQpCisgICAgJ2ludGVyYWN0X3dpdGhfYWxsJyA6ICdlSW5BJywgICAgICAgIyBBbGxvdyB1c2VyIGludGVyYWN0aW9uIGZyb20gYm90aCBsb2NhbCBhbmQgcmVtb3RlIEFwcGxlRXZlbnRzCit9CisKK19FbnVtX0xhbmcgPSB7CisgICAgJ0MnIDogJ0xDICAnLCAgICAgICAjCisgICAgJ0NfMmJfXzJiXycgOiAnTEMrKycsICAgICAgICMKKyAgICAnUGFzY2FsJyA6ICdMUCAgJywgICMKKyAgICAnT2JqZWN0X1Bhc2NhbCcgOiAnTFArKycsICAgIworICAgICdKYXZhJyA6ICdMSmF2JywgICAgIworICAgICdBc3NlbWJsZXInIDogJ0xBc20nLCAgICAgICAjCisgICAgJ1Vua25vd24nIDogJ0w/ICAnLCAjCit9CisKK19FbnVtX1BQcm0gPSB7CisgICAgJ2Fic29sdXRlJyA6ICdBYnNvJywgICAgICAgICMgQW4gYWJzb2x1dGUgcGF0aCBuYW1lLCBpbmNsdWRpbmcgdm9sdW1lIG5hbWUuCisgICAgJ3Byb2plY3RfcmVsYXRpdmUnIDogJ1BSZWwnLCAgICAgICAgIyBBIHBhdGggcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcHJvamVjdFx4ZDVzIGZvbGRlci4KKyAgICAnc2hlbGxfcmVsYXRpdmUnIDogJ1NSZWwnLCAgIyBBIHBhdGggcmVsYXRpdmUgdG8gdGhlIENvZGVXYXJyaW9yXHhhYSBmb2xkZXIuCisgICAgJ3N5c3RlbV9yZWxhdGl2ZScgOiAnWVJlbCcsICMgQSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzeXN0ZW0gZm9sZGVyCisgICAgJ3Jvb3RfcmVsYXRpdmUnIDogJ1JSZWwnLCAgICMKK30KKworX0VudW1fUFhkZyA9IHsKKyAgICAnRGlhZ25vc2VfTm9uZScgOiAnUFhkMScsICAgIyBObyBQbHVnaW4gRGlhZ25vc3RpY3MuCisgICAgJ0RpYWdub3NlX0Vycm9ycycgOiAnUFhkMicsICMgUGx1Z2luIERpYWdub3N0aWNzIGZvciBlcnJvcnMgb25seS4KKyAgICAnRGlhZ25vc2VfQWxsJyA6ICdQWGQzJywgICAgIyBQbHVnaW4gRGlhZ25vc3RpY3MgZm9yIGV2ZXJ5dGhpbmcuCit9CisKK19FbnVtX1B0aEYgPSB7CisgICAgJ0dlbmVyaWNfUGF0aCcgOiAnUEZHbicsICAgICMKKyAgICAnTWFjT1NfUGF0aCcgOiAnUEZNYycsICAgICAgIyBNYWNPUyBwYXRoIHVzaW5nIGNvbG9uIGFzIHNlcGFyYXRvcgorICAgICdXaW5kb3dzX1BhdGgnIDogJ1BGV24nLCAgICAjIFdpbmRvd3MgcGF0aCB1c2luZyBiYWNrc2xhc2ggYXMgc2VwYXJhdG9yCisgICAgJ1VuaXhfUGF0aCcgOiAnUEZVeCcsICAgICAgICMgVW5peCBwYXRoIHVzaW5nIHNsYXNoIGFzIHNlcGFyYXRvcgorfQorCitfRW51bV9SZWZQID0geworICAgICdUaGlua19SZWZlcmVuY2UnIDogJ0RhblInLCAjCisgICAgJ1F1aWNrVmlldycgOiAnQUxUVicsICAgICAgICMKK30KKworX0VudW1fU1RLZCA9IHsKKyAgICAnQWJzb2x1dGVfUGF0aCcgOiAnU1RLMCcsICAgIyBUaGUgXHhkMnBhdGhceGQzIHByb3BlcnR5IGlzIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzb3VyY2UgdHJlZS4KKyAgICAnUmVnaXN0cnlfS2V5JyA6ICdTVEsxJywgICAgIyBUaGUgXHhkMnBhdGhceGQzIHByb3BlcnR5IGlzIHRoZSBuYW1lIG9mIGEgcmVnaXN0cnkga2V5IHRoYXQgY29udGFpbnMgdGhlIHBhdGggdG8gdGhlIHJvb3QuCisgICAgJ0Vudmlyb25tZW50X1ZhcmlhYmxlJyA6ICdTVEsyJywgICAgIyBUaGUgXHhkMnBhdGhceGQzIHByb3BlcnR5IGlzIHRoZSBuYW1lIG9mIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgY29udGFpbnMgdGhlIHBhdGggdG8gdGhlIHJvb3QuCit9CisKK19FbnVtX1NyY1QgPSB7CisgICAgJ3NvdXJjZScgOiAnRlR4dCcsICAjIEEgc291cmNlIGZpbGUgKC5jLCAuY3AsIC5wLCBldGMpLgorICAgICd1bmtub3duJyA6ICdGVW5rJywgIyBBbiB1bmtub3duIGZpbGUgdHlwZS4KK30KKworX0VudW1fVG1wQiA9IHsKKyAgICAnVXNlcl9TcGVjaWZpZWQnIDogJ1VzcnMnLCAgIyBVc2UgdXNlciBzcGVjaWZpZWQgc3ltYm9scyB3aGVuIHNldHRpbmcgdGVtcG9yYXJ5IGJyZWFrcG9pbnRzIG9uIHByb2dyYW0gbGF1bmNoLgorICAgICdEZWZhdWx0JyA6ICdEZmx0JywgIyBVc2Ugc3lzdGVtIGRlZmF1bHQgc3ltYm9scyB3aGVuIHNldHRpbmcgdGVtcG9yYXJ5IGJyZWFrcG9pbnRzIG9uIHByb2dyYW0gbGF1bmNoLgorfQorCitfRW51bV9UeHRGID0geworICAgICdNYWNPUycgOiAnVHhGMCcsICAgIyBNYWNPUyB0ZXh0IGZvcm1hdAorICAgICdET1MnIDogJ1R4RjEnLCAgICAgIyBET1MgdGV4dCBmb3JtYXQKKyAgICAnVW5peCcgOiAnVHhGMicsICAgICMgVW5peCB0ZXh0IGZvcm1hdAorfQorCitfRW51bV9zYXZvID0geworICAgICd5ZXMnIDogJ3llcyAnLCAgICAgIyBTYXZlIGNoYW5nZXMKKyAgICAnbm8nIDogJ25vICAnLCAgICAgICMgRG8gbm90IHNhdmUgY2hhbmdlcworICAgICdhc2snIDogJ2FzayAnLCAgICAgIyBBc2sgdGhlIHVzZXIgd2hldGhlciB0byBzYXZlCit9CisKKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ0JSS1cnIDogQnJvd3Nlcl9Db2xvcmluZywKKyAgICAnQlNURycgOiBCdWlsZF9TZXR0aW5ncywKKyAgICAnQnNDbCcgOiBiYXNlX2NsYXNzLAorICAgICdDVUtXJyA6IEN1c3RvbV9LZXl3b3JkcywKKyAgICAnQ2F0YScgOiBicm93c2VyX2NhdGFsb2csCisgICAgJ0NsYXMnIDogY2xhc3NfLAorICAgICdEYkRTJyA6IERlYnVnZ2VyX0Rpc3BsYXksCisgICAgJ0RiR0wnIDogRGVidWdnZXJfR2xvYmFsLAorICAgICdEYlRHJyA6IERlYnVnZ2VyX1RhcmdldCwKKyAgICAnRGJXTicgOiBEZWJ1Z2dlcl9XaW5kb3dpbmcsCisgICAgJ0R0TWInIDogZGF0YV9tZW1iZXIsCisgICAgJ0VEVFInIDogRWRpdG9yLAorICAgICdFbnZWJyA6IEVudmlyb25tZW50X1ZhcmlhYmxlLAorICAgICdFcnJNJyA6IEVycm9yX0luZm9ybWF0aW9uLAorICAgICdGRGVmJyA6IEZ1bmN0aW9uX0luZm9ybWF0aW9uLAorICAgICdGTE1QJyA6IEZpbGVfTWFwcGluZ3MsCisgICAgJ0ZNYXAnIDogRmlsZV9NYXBwaW5nLAorICAgICdHU1RzJyA6IEdsb2JhbF9Tb3VyY2VfVHJlZXMsCisgICAgJ0dYVFInIDogRXh0cmFzLAorICAgICdMWFRSJyA6IEJ1aWxkX0V4dHJhcywKKyAgICAnTWJGbicgOiBtZW1iZXJfZnVuY3Rpb24sCisgICAgJ1BBVEgnIDogQWNjZXNzX1BhdGhzLAorICAgICdQSW5mJyA6IFBhdGhfSW5mb3JtYXRpb24sCisgICAgJ1BTVEcnIDogUGx1Z2luX1NldHRpbmdzLAorICAgICdSU1RHJyA6IFJ1bnRpbWVfU2V0dGluZ3MsCisgICAgJ1JsUHQnIDogUmVsYXRpdmVfUGF0aCwKKyAgICAnU0ZpdCcgOiBTaGllbGRlZF9Gb2xkZXIsCisgICAgJ1NIRkwnIDogU2hpZWxkZWRfRm9sZGVycywKKyAgICAnU05UWCcgOiBTeW50YXhfQ29sb3JpbmcsCisgICAgJ1NlZyAnIDogU2VnbWVudCwKKyAgICAnU3JjRicgOiBQcm9qZWN0RmlsZSwKKyAgICAnU3JjVCcgOiBTb3VyY2VfVHJlZSwKKyAgICAnVEFSRycgOiBUYXJnZXRfU2V0dGluZ3MsCisgICAgJ1RTVHMnIDogVGFyZ2V0X1NvdXJjZV9UcmVlcywKKyAgICAnVkNTcycgOiBWQ1NfU2V0dXAsCisgICAgJ21GTlQnIDogRm9udCwKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7CisgICAgJ0FjY2UnIDogX1Byb3BfYWNjZXNzLAorICAgICdCVzAwJyA6IF9Qcm9wX0Jyb3dzZXJfS2V5d29yZHMsCisgICAgJ0JXMDEnIDogX1Byb3BfQ2xhc3Nlc19Db2xvciwKKyAgICAnQlcwMicgOiBfUHJvcF9Db25zdGFudHNfQ29sb3IsCisgICAgJ0JXMDMnIDogX1Byb3BfRW51bXNfQ29sb3IsCisgICAgJ0JXMDQnIDogX1Byb3BfRnVuY3Rpb25zX0NvbG9yLAorICAgICdCVzA1JyA6IF9Qcm9wX0dsb2JhbHNfQ29sb3IsCisgICAgJ0JXMDYnIDogX1Byb3BfTWFjcm9zX0NvbG9yLAorICAgICdCVzA3JyA6IF9Qcm9wX1RlbXBsYXRlc19Db2xvciwKKyAgICAnQlcwOCcgOiBfUHJvcF9UeXBlZGVmc19Db2xvciwKKyAgICAnQlcxMCcgOiBfUHJvcF9UZW1wbGF0ZV9Db21tYW5kc19pbl9NZW51LAorICAgICdCWDAxJyA6IF9Qcm9wX0NvbXBsZXRpb25fU291bmQsCisgICAgJ0JYMDInIDogX1Byb3BfU3VjY2Vzc19Tb3VuZCwKKyAgICAnQlgwMycgOiBfUHJvcF9GYWlsdXJlX1NvdW5kLAorICAgICdCWDA0JyA6IF9Qcm9wX0J1aWxkX0JlZm9yZV9SdW5uaW5nLAorICAgICdCWDA1JyA6IF9Qcm9wX0luY2x1ZGVfQ2FjaGVfU2l6ZSwKKyAgICAnQlgwNicgOiBfUHJvcF9Db21waWxlcl9UaHJlYWRfU3RhY2tfU2l6ZSwKKyAgICAnQlgwNycgOiBfUHJvcF9TYXZlX0JlZm9yZV9CdWlsZGluZywKKyAgICAnQmZvcicgOiBfUHJvcF9pbml0aWFsaXplX2JlZm9yZSwKKyAgICAnQ1NpeicgOiBfUHJvcF9jb2Rlc2l6ZSwKKyAgICAnQ2xhcycgOiBfUHJvcF9jbGFzc18sCisgICAgJ0RTaXonIDogX1Byb3BfZGF0YXNpemUsCisgICAgJ0RiMDEnIDogX1Byb3BfU2hvd19WYXJpYWJsZV9UeXBlcywKKyAgICAnRGIwMicgOiBfUHJvcF9Tb3J0X0J5X01ldGhvZCwKKyAgICAnRGIwMycgOiBfUHJvcF9Vc2VfUlRUSSwKKyAgICAnRGIwNCcgOiBfUHJvcF9UaHJlYWRzX2luX1dpbmRvdywKKyAgICAnRGIwNScgOiBfUHJvcF9WYXJpYWJsZV9IaW50cywKKyAgICAnRGIwNicgOiBfUHJvcF9XYXRjaHBvaW50X0hpbGl0ZSwKKyAgICAnRGIwNycgOiBfUHJvcF9WYXJpYWJsZV9DaGFuZ2VkX0hpbGl0ZSwKKyAgICAnRGIwOCcgOiBfUHJvcF9EZWZhdWx0X0FycmF5X1NpemUsCisgICAgJ0RiMDknIDogX1Byb3BfU2hvd19Mb2NhbHMsCisgICAgJ0RiMTAnIDogX1Byb3BfU2hvd19Bc19EZWNpbWFsLAorICAgICdEY0VuJyA6IF9Qcm9wX2RlY2xhcmF0aW9uX2VuZF9vZmZzZXQsCisgICAgJ0RjRmwnIDogX1Byb3BfZGVjbGFyYXRpb25fZmlsZSwKKyAgICAnRGNTdCcgOiBfUHJvcF9kZWNsYXJhdGlvbl9zdGFydF9vZmZzZXQsCisgICAgJ0RmRW4nIDogX1Byb3BfaW1wbGVtZW50YXRpb25fZW5kX29mZnNldCwKKyAgICAnRGZGbCcgOiBfUHJvcF9pbXBsZW1lbnRhdGlvbl9maWxlLAorICAgICdEZlN0JyA6IF9Qcm9wX2ltcGxlbWVudGF0aW9uX3N0YXJ0X29mZnNldCwKKyAgICAnRGcwMScgOiBfUHJvcF9JZ25vcmVfTW9kX0RhdGVzLAorICAgICdEZzAyJyA6IF9Qcm9wX09wZW5fQWxsX0NsYXNzZXMsCisgICAgJ0RnMDMnIDogX1Byb3BfTGF1bmNoX0FwcHNfb25fT3BlbiwKKyAgICAnRGcwNCcgOiBfUHJvcF9Db25maXJtX0tpbGwsCisgICAgJ0RnMDUnIDogX1Byb3BfU3RvcF9hdF9NYWluLAorICAgICdEZzA2JyA6IF9Qcm9wX1NlbGVjdF9TdGFja19DcmF3bCwKKyAgICAnRGcwNycgOiBfUHJvcF9Eb250X1N0ZXBfaW5fUnVudGltZSwKKyAgICAnRGcxMScgOiBfUHJvcF9BdXRvX1RhcmdldF9MaWJyYXJpZXMsCisgICAgJ0RnMTInIDogX1Byb3BfQ2FjaGVfRWRpdGVkX0ZpbGVzLAorICAgICdEZzEzJyA6IF9Qcm9wX0ZpbGVfQ2FjaGVfRHVyYXRpb24sCisgICAgJ0R0MDInIDogX1Byb3BfTG9nX1N5c3RlbV9NZXNzYWdlcywKKyAgICAnRHQwOCcgOiBfUHJvcF9VcGRhdGVfRGF0YV9XaGlsZV9SdW5uaW5nLAorICAgICdEdDA5JyA6IF9Qcm9wX0RhdGFfVXBkYXRlX0ludGVydmFsLAorICAgICdEdDEwJyA6IF9Qcm9wX1JlbG9jYXRlZF9FeGVjdXRhYmxlX1BhdGgsCisgICAgJ0R0MTMnIDogX1Byb3BfU3RvcF9hdF90ZW1wX2JyZWFrcG9pbnQsCisgICAgJ0R0MTQnIDogX1Byb3BfVGVtcF9icmVha3BvaW50X25hbWVzLAorICAgICdEdDE1JyA6IF9Qcm9wX0NhY2hlX3N5bWJvbGljcywKKyAgICAnRHQxNicgOiBfUHJvcF9UZW1wX0JyZWFrcG9pbnRfVHlwZSwKKyAgICAnRHcwMScgOiBfUHJvcF9EZWJ1Z2dpbmdfU3RhcnRfQWN0aW9uLAorICAgICdEdzAyJyA6IF9Qcm9wX0RvX05vdGhpbmdfVG9fUHJvamVjdHMsCisgICAgJ0VEMDEnIDogX1Byb3BfRmxhc2hfRGVsYXksCisgICAgJ0VEMDInIDogX1Byb3BfRHluYW1pY19TY3JvbGwsCisgICAgJ0VEMDMnIDogX1Byb3BfQmFsYW5jZSwKKyAgICAnRUQwNCcgOiBfUHJvcF9Vc2VfRHJhZ19fMjZfX0Ryb3BfRWRpdGluZywKKyAgICAnRUQwNicgOiBfUHJvcF9Tb3J0X0Z1bmN0aW9uX1BvcHVwLAorICAgICdFRDA3JyA6IF9Qcm9wX1VzZV9NdWx0aXBsZV9VbmRvLAorICAgICdFRDA4JyA6IF9Qcm9wX1JlbWVtYmVyX0ZvbnQsCisgICAgJ0VEMDknIDogX1Byb3BfUmVtZW1iZXJfU2VsZWN0aW9uLAorICAgICdFRDEwJyA6IF9Qcm9wX1JlbWVtYmVyX1dpbmRvdywKKyAgICAnRUQxMicgOiBfUHJvcF9NYWluX1RleHRfQ29sb3IsCisgICAgJ0VEMTMnIDogX1Byb3BfQmFja2dyb3VuZF9Db2xvciwKKyAgICAnRUQxNCcgOiBfUHJvcF9Db250ZXh0X1BvcHVwX0RlbGF5LAorICAgICdFRDE1JyA6IF9Qcm9wX1JlbGF4ZWRfQ19Qb3B1cF9QYXJzaW5nLAorICAgICdFRDE2JyA6IF9Qcm9wX0xlZnRfTWFyZ2luX0xpbmVfU2VsZWN0LAorICAgICdFRDE3JyA6IF9Qcm9wX0RlZmF1bHRfVGV4dF9GaWxlX0Zvcm1hdCwKKyAgICAnRVgwNCcgOiBfUHJvcF9Nb2RpZmljYXRpb25fRGF0ZV9DYWNoaW5nLAorICAgICdFWDA3JyA6IF9Qcm9wX0Z1bGxfU2NyZWVuX1pvb20sCisgICAgJ0VYMDgnIDogX1Byb3BfRXh0ZXJuYWxfUmVmZXJlbmNlLAorICAgICdFWDA5JyA6IF9Qcm9wX0Jyb3dzZXJfQWN0aXZlLAorICAgICdFWDEwJyA6IF9Qcm9wX1VzZV9FZGl0b3JfRXh0ZW5zaW9ucywKKyAgICAnRVgxMScgOiBfUHJvcF9Vc2VfRXh0ZXJuYWxfRWRpdG9yLAorICAgICdFWDEyJyA6IF9Qcm9wX1VzZV9TY3JpcHRfTWVudSwKKyAgICAnRVgxNicgOiBfUHJvcF9SZWNlbnRfRWRpdG9yX0NvdW50LAorICAgICdFWDE3JyA6IF9Qcm9wX1JlY2VudF9Qcm9qZWN0X0NvdW50LAorICAgICdFWDE4JyA6IF9Qcm9wX1VzZV9Ub29sU2VydmVyX01lbnUsCisgICAgJ0VYMTknIDogX1Byb3BfQXV0b21hdGljX1Rvb2xiYXJfSGVscCwKKyAgICAnRVgzMCcgOiBfUHJvcF9EdW1wX0Jyb3dzZXJfSW5mbywKKyAgICAnRVgzMScgOiBfUHJvcF9DYWNoZV9TdWJwcm9qZWN0X0RhdGEsCisgICAgJ0VyckwnIDogX1Byb3BfbGluZU51bWJlciwKKyAgICAnRXJyUycgOiBfUHJvcF9tZXNzYWdlLAorICAgICdFcnJUJyA6IF9Qcm9wX21lc3NhZ2VLaW5kLAorICAgICdGTXBzJyA6IF9Qcm9wX01hcHBpbmdzLAorICAgICdGTjAxJyA6IF9Qcm9wX0F1dG9fSW5kZW50LAorICAgICdGTjAyJyA6IF9Qcm9wX1RhYl9TaXplLAorICAgICdGTjAzJyA6IF9Qcm9wX1RhYl9JbmRlbnRzX1NlbGVjdGlvbiwKKyAgICAnRk4wNCcgOiBfUHJvcF9UYWJfSW5zZXJ0c19TcGFjZXMsCisgICAgJ0ZybXQnIDogX1Byb3BfZm9ybWF0LAorICAgICdGcm13JyA6IF9Qcm9wX2ZyYW1ld29yaywKKyAgICAnR0gwMScgOiBfUHJvcF9TeW50YXhfQ29sb3JpbmcsCisgICAgJ0dIMDInIDogX1Byb3BfQ29tbWVudF9Db2xvciwKKyAgICAnR0gwMycgOiBfUHJvcF9LZXl3b3JkX0NvbG9yLAorICAgICdHSDA0JyA6IF9Qcm9wX1N0cmluZ19Db2xvciwKKyAgICAnR0gwNScgOiBfUHJvcF9DdXN0b21fQ29sb3JfMSwKKyAgICAnR0gwNicgOiBfUHJvcF9DdXN0b21fQ29sb3JfMiwKKyAgICAnR0gwNycgOiBfUHJvcF9DdXN0b21fQ29sb3JfMywKKyAgICAnR0gwOCcgOiBfUHJvcF9DdXN0b21fQ29sb3JfNCwKKyAgICAnSHN0RicgOiBfUHJvcF9ob3N0X2ZsYWdzLAorICAgICdJbmNGJyA6IF9Qcm9wX2luY2x1ZGVzLAorICAgICdLaW5kJyA6IF9Qcm9wX3BhdGhfa2luZCwKKyAgICAnTGFuZycgOiBfUHJvcF9sYW5ndWFnZSwKKyAgICAnTnVtRicgOiBfUHJvcF9maWxlY291bnQsCisgICAgJ09yaWcnIDogX1Byb3Bfb3JpZ2luLAorICAgICdQQTAxJyA6IF9Qcm9wX1VzZXJfUGF0aHMsCisgICAgJ1BBMDInIDogX1Byb3BfQWx3YXlzX0Z1bGxfU2VhcmNoLAorICAgICdQQTAzJyA6IF9Qcm9wX1N5c3RlbV9QYXRocywKKyAgICAnUEEwNCcgOiBfUHJvcF9Db252ZXJ0X1BhdGhzLAorICAgICdQQTA1JyA6IF9Qcm9wX1JlcXVpcmVfRnJhbWV3b3JrX0luY2x1ZGVzLAorICAgICdQTGNrJyA6IF9Qcm9wX3NlZ18yZF9sb2NrZWQsCisgICAgJ1BSMDQnIDogX1Byb3BfRmlsZV9UeXBlLAorICAgICdQWDAxJyA6IF9Qcm9wX1BsdWdpbl9EaWFnbm9zdGljc19MZXZlbCwKKyAgICAnUFgwMicgOiBfUHJvcF9EaXNhYmxlX1RoaXJkX1BhcnR5X0NPTV9QbHVnaW5zLAorICAgICdQYXRoJyA6IF9Qcm9wX3BhdGgsCisgICAgJ1ByZWwnIDogX1Byb3Bfc2VnXzJkX3ByZWxvYWRlZCwKKyAgICAnUHJvdCcgOiBfUHJvcF9zZWdfMmRfcHJvdGVjdGVkLAorICAgICdQdXJnJyA6IF9Qcm9wX3NlZ18yZF9wdXJnZWFibGUsCisgICAgJ1JTMDEnIDogX1Byb3BfSG9zdF9BcHBsaWNhdGlvbiwKKyAgICAnUlMwMicgOiBfUHJvcF9Db21tYW5kX0xpbmVfQXJndW1lbnRzLAorICAgICdSUzAzJyA6IF9Qcm9wX1dvcmtpbmdfRGlyZWN0b3J5LAorICAgICdSUzA0JyA6IF9Qcm9wX0Vudmlyb25tZW50X1ZhcmlhYmxlcywKKyAgICAnUmVjdScgOiBfUHJvcF9yZWN1cnNpdmUsCisgICAgJ1Jvb3QnIDogX1Byb3Bfcm9vdCwKKyAgICAnU0YwMScgOiBfUHJvcF9FeHByZXNzaW9uX1RvX01hdGNoLAorICAgICdTRjAyJyA6IF9Qcm9wX1NraXBfUHJvamVjdF9PcGVyYXRpb25zLAorICAgICdTRjAzJyA6IF9Qcm9wX1NraXBfRmluZF9BbmRfQ29tcGFyZV9PcGVyYXRpb25zLAorICAgICdTRmlzJyA6IF9Qcm9wX1NoaWVsZGVkX0l0ZW1zLAorICAgICdTVDAxJyA6IF9Qcm9wX1NvdXJjZV9UcmVlcywKKyAgICAnU3JjVCcgOiBfUHJvcF9maWxldHlwZSwKKyAgICAnU3RhdCcgOiBfUHJvcF9zdGF0aWMsCisgICAgJ1N1YkEnIDogX1Byb3BfYWxsX3N1YmNsYXNzZXMsCisgICAgJ1N1YkMnIDogX1Byb3Bfc3ViY2xhc3NlcywKKyAgICAnU3ltRycgOiBfUHJvcF9zeW1ib2xzLAorICAgICdTeXNIJyA6IF9Qcm9wX3NlZ18yZF9zeXN0ZW1faGVhcCwKKyAgICAnVEEwMScgOiBfUHJvcF9MaW5rZXIsCisgICAgJ1RBMDInIDogX1Byb3BfRXh0ZW5zaW9uLAorICAgICdUQTAzJyA6IF9Qcm9wX1ByZWNvbXBpbGVkLAorICAgICdUQTA0JyA6IF9Qcm9wX1Jlc291cmNlX0ZpbGUsCisgICAgJ1RBMDUnIDogX1Byb3BfTGF1bmNoYWJsZSwKKyAgICAnVEEwNicgOiBfUHJvcF9JZ25vcmVkX2J5X01ha2UsCisgICAgJ1RBMDcnIDogX1Byb3BfQ29tcGlsZXIsCisgICAgJ1RBMDknIDogX1Byb3BfUG9zdF9MaW5rZXIsCisgICAgJ1RBMTAnIDogX1Byb3BfVGFyZ2V0X05hbWUsCisgICAgJ1RBMTEnIDogX1Byb3BfT3V0cHV0X0RpcmVjdG9yeV9QYXRoLAorICAgICdUQTEyJyA6IF9Qcm9wX091dHB1dF9EaXJlY3RvcnlfT3JpZ2luLAorICAgICdUQTEzJyA6IF9Qcm9wX1ByZV9MaW5rZXIsCisgICAgJ1RBMTUnIDogX1Byb3BfVXNlX1JlbGF0aXZlX1BhdGhzLAorICAgICdUQTE2JyA6IF9Qcm9wX091dHB1dF9EaXJlY3RvcnlfTG9jYXRpb24sCisgICAgJ1VwVEQnIDogX1Byb3BfdXBfdG9fZGF0ZSwKKyAgICAnVkMwMScgOiBfUHJvcF9WQ1NfQWN0aXZlLAorICAgICdWQzAyJyA6IF9Qcm9wX0Nvbm5lY3Rpb25fTWV0aG9kLAorICAgICdWQzAzJyA6IF9Qcm9wX1VzZXJuYW1lLAorICAgICdWQzA0JyA6IF9Qcm9wX1Bhc3N3b3JkLAorICAgICdWQzA1JyA6IF9Qcm9wX0F1dG9fQ29ubmVjdCwKKyAgICAnVkMwNicgOiBfUHJvcF9TdG9yZV9QYXNzd29yZCwKKyAgICAnVkMwNycgOiBfUHJvcF9BbHdheXNfUHJvbXB0LAorICAgICdWQzA4JyA6IF9Qcm9wX01vdW50X1ZvbHVtZSwKKyAgICAnVkMwOScgOiBfUHJvcF9EYXRhYmFzZV9QYXRoLAorICAgICdWQzEwJyA6IF9Qcm9wX0xvY2FsX1BhdGgsCisgICAgJ1ZDMTEnIDogX1Byb3BfVXNlX0dsb2JhbF9TZXR0aW5ncywKKyAgICAnVmFsdScgOiBfUHJvcF92YWx1ZSwKKyAgICAnVmlydCcgOiBfUHJvcF92aXJ0dWFsLAorICAgICdXZWFrJyA6IF9Qcm9wX3dlYWtfbGluaywKKyAgICAnZmlsZScgOiBfUHJvcF9kaXNrX2ZpbGUsCisgICAgJ3BuYW0nIDogX1Byb3BfbmFtZSwKKyAgICAncHRwcycgOiBfUHJvcF9UZXh0X1NpemUsCisgICAgJ3B0eGYnIDogX1Byb3BfVGV4dF9Gb250LAorfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7CisgICAgJ0FjY2UnIDogX0VudW1fQWNjZSwKKyAgICAnQlhicicgOiBfRW51bV9CWGJyLAorICAgICdEYlNBJyA6IF9FbnVtX0RiU0EsCisgICAgJ0RnQkwnIDogX0VudW1fRGdCTCwKKyAgICAnRXJyVCcgOiBfRW51bV9FcnJULAorICAgICdJbnRlJyA6IF9FbnVtX0ludGUsCisgICAgJ0xhbmcnIDogX0VudW1fTGFuZywKKyAgICAnUFBybScgOiBfRW51bV9QUHJtLAorICAgICdQWGRnJyA6IF9FbnVtX1BYZGcsCisgICAgJ1B0aEYnIDogX0VudW1fUHRoRiwKKyAgICAnUmVmUCcgOiBfRW51bV9SZWZQLAorICAgICdTVEtkJyA6IF9FbnVtX1NUS2QsCisgICAgJ1NyY1QnIDogX0VudW1fU3JjVCwKKyAgICAnVG1wQicgOiBfRW51bV9UbXBCLAorICAgICdUeHRGJyA6IF9FbnVtX1R4dEYsCisgICAgJ3Nhdm8nIDogX0VudW1fc2F2bywKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL01ldHJvd2Vya3NfU2hlbGxfU3VpdGUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvTWV0cm93ZXJrc19TaGVsbF9TdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0MjRkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL01ldHJvd2Vya3NfU2hlbGxfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL01ldHJvd2Vya3NfU2hlbGxfU3VpdGUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvTWV0cm93ZXJrc19TaGVsbF9TdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0MjRkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL01ldHJvd2Vya3NfU2hlbGxfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL1JlcXVpcmVkLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvUmVxdWlyZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA3NDllOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL1JlcXVpcmVkLnB5CkBAIC0wLDAgKzEsNjIgQEAKKyIiIlN1aXRlIFJlcXVpcmVkOiBUZXJtcyB0aGF0IGV2ZXJ5IGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwb3J0CitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1ZvbHVtZXMvU2FwL0FwcGxpY2F0aW9ucyAoTWFjIE9TIDkpL01ldHJvd2Vya3MgQ29kZVdhcnJpb3IgNy4wL01ldHJvd2Vya3MgQ29kZVdhcnJpb3IvQ29kZVdhcnJpb3IgSURFIDQuMi41CitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdyZXFkJworCitmcm9tIFN0ZFN1aXRlcy5SZXF1aXJlZF9TdWl0ZSBpbXBvcnQgKgorY2xhc3MgUmVxdWlyZWRfRXZlbnRzKFJlcXVpcmVkX1N1aXRlX0V2ZW50cyk6CisKKyAgICBfYXJnbWFwX29wZW4gPSB7CisgICAgICAgICdjb252ZXJ0aW5nJyA6ICdDb252JywKKyAgICB9CisKKyAgICBkZWYgb3BlbihzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIib3BlbjogT3BlbiB0aGUgc3BlY2lmaWVkIG9iamVjdChzKQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogbGlzdCBvZiBvYmplY3RzIHRvIG9wZW4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBjb252ZXJ0aW5nOiBXaGV0aGVyIHRvIGNvbnZlcnQgcHJvamVjdCB0byBsYXRlc3QgdmVyc2lvbiAoeWVzL25vOyBkZWZhdWx0IGlzIGFzaykuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ29kb2MnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfb3BlbikKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdDb252JywgX0VudW1fQ29udikKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworX0VudW1fQ29udiA9IHsKKyAgICAneWVzJyA6ICd5ZXMgJywgICAgICMgQ29udmVydCB0aGUgcHJvamVjdCBpZiBuZWNlc3Nhcnkgb24gb3BlbgorICAgICdubycgOiAnbm8gICcsICAgICAgIyBEbyBub3QgY29udmVydCB0aGUgcHJvamVjdCBpZiBuZWVkZWQgb24gb3BlbgorfQorCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworICAgICdDb252JyA6IF9FbnVtX0NvbnYsCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9SZXF1aXJlZC5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9SZXF1aXJlZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjOWFkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL1JlcXVpcmVkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9SZXF1aXJlZC5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9SZXF1aXJlZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjOWFkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL1JlcXVpcmVkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9TdGFuZGFyZF9TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL1N0YW5kYXJkX1N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MzI0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9TdGFuZGFyZF9TdWl0ZS5weQpAQCAtMCwwICsxLDQwOCBAQAorIiIiU3VpdGUgU3RhbmRhcmQgU3VpdGU6IENvbW1vbiB0ZXJtcyBmb3IgbW9zdCBhcHBsaWNhdGlvbnMKK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvVm9sdW1lcy9TYXAvQXBwbGljYXRpb25zIChNYWMgT1MgOSkvTWV0cm93ZXJrcyBDb2RlV2FycmlvciA3LjAvTWV0cm93ZXJrcyBDb2RlV2Fycmlvci9Db2RlV2FycmlvciBJREUgNC4yLjUKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ0NvUmUnCisKK2Zyb20gU3RkU3VpdGVzLlN0YW5kYXJkX1N1aXRlIGltcG9ydCAqCitjbGFzcyBTdGFuZGFyZF9TdWl0ZV9FdmVudHMoU3RhbmRhcmRfU3VpdGVfRXZlbnRzKToKKworICAgIF9hcmdtYXBfY2xvc2UgPSB7CisgICAgICAgICdzYXZpbmcnIDogJ3Nhdm8nLAorICAgICAgICAnc2F2aW5nX2luJyA6ICdrZmlsJywKKyAgICB9CisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImNsb3NlOiBjbG9zZSBhbiBvYmplY3QKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgdG8gY2xvc2UKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzYXZpbmc6IHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCBjaGFuZ2VzIHNob3VsZCBiZSBzYXZlZCBiZWZvcmUgY2xvc2luZworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHNhdmluZ19pbjogdGhlIGZpbGUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgb2JqZWN0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2Nsb3MnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY2xvc2UpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnc2F2bycsIF9FbnVtX3Nhdm8pCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX2NvdW50ID0geworICAgICAgICAnZWFjaCcgOiAna29jbCcsCisgICAgfQorCisgICAgZGVmIGNvdW50KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJjb3VudDogcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSBwYXJ0aWN1bGFyIGNsYXNzIHdpdGhpbiBhbiBvYmplY3QKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3Qgd2hvc2UgZWxlbWVudHMgYXJlIHRvIGJlIGNvdW50ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBlYWNoOiB0aGUgY2xhc3Mgb2YgdGhlIGVsZW1lbnRzIHRvIGJlIGNvdW50ZWQuIEtleXdvcmQgJ2VhY2gnIGlzIG9wdGlvbmFsIGluIEFwcGxlU2NyaXB0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdGhlIG51bWJlciBvZiBlbGVtZW50cworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnY250ZScKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9jb3VudCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX2dldCA9IHsKKyAgICAgICAgJ2FzJyA6ICdydHlwJywKKyAgICB9CisKKyAgICBkZWYgZ2V0KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJnZXQ6IGdldCB0aGUgZGF0YSBmb3IgYW4gb2JqZWN0CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IHdob3NlIGRhdGEgaXMgdG8gYmUgcmV0dXJuZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBhczogdGhlIGRlc2lyZWQgdHlwZXMgZm9yIHRoZSBkYXRhLCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogVGhlIGRhdGEgZnJvbSB0aGUgb2JqZWN0CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdnZXRkJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2dldCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX21ha2UgPSB7CisgICAgICAgICduZXcnIDogJ2tvY2wnLAorICAgICAgICAnYXMnIDogJ3J0eXAnLAorICAgICAgICAnYXQnIDogJ2luc2gnLAorICAgICAgICAnd2l0aF9kYXRhJyA6ICdkYXRhJywKKyAgICAgICAgJ3dpdGhfcHJvcGVydGllcycgOiAncHJkdCcsCisgICAgfQorCisgICAgZGVmIG1ha2Uoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIibWFrZTogbWFrZSBhIG5ldyBlbGVtZW50CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgbmV3OiB0aGUgY2xhc3Mgb2YgdGhlIG5ldyBlbGVtZW50XHhkMWtleXdvcmQgJ25ldycgaXMgb3B0aW9uYWwgaW4gQXBwbGVTY3JpcHQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBhczogdGhlIGRlc2lyZWQgdHlwZXMgZm9yIHRoZSBkYXRhLCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgYXQ6IHRoZSBsb2NhdGlvbiBhdCB3aGljaCB0byBpbnNlcnQgdGhlIGVsZW1lbnQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoX2RhdGE6IHRoZSBpbml0aWFsIGRhdGEgZm9yIHRoZSBlbGVtZW50CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgd2l0aF9wcm9wZXJ0aWVzOiB0aGUgaW5pdGlhbCB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBlbGVtZW50CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdG8gdGhlIG5ldyBvYmplY3QocykKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2NyZWwnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfbWFrZSkKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIHNlbGVjdChzZWxmLCBfb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzZWxlY3Q6IHNlbGVjdCB0aGUgc3BlY2lmaWVkIG9iamVjdAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCB0byBzZWxlY3QKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnbWlzYycKKyAgICAgICAgX3N1YmNvZGUgPSAnc2xjdCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfc2V0ID0geworICAgICAgICAndG8nIDogJ2RhdGEnLAorICAgIH0KKworICAgIGRlZiBzZXQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNldDogc2V0IGFuIG9iamVjdCdzIGRhdGEKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgdG8gY2hhbmdlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG86IHRoZSBuZXcgdmFsdWUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnc2V0ZCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZXQpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisKK2NsYXNzIGFwcGxpY2F0aW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYXBwbGljYXRpb24gLSBhbiBhcHBsaWNhdGlvbiBwcm9ncmFtICIiIgorICAgIHdhbnQgPSAnY2FwcCcKK2NsYXNzIF9Qcm9wX3VzZXJfaW50ZXJhY3Rpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInVzZXIgaW50ZXJhY3Rpb24gLSB1c2VyIGludGVyYWN0aW9uIGxldmVsICIiIgorICAgIHdoaWNoID0gJ2ludGUnCisgICAgd2FudCA9ICdJbnRlJwordXNlcl9pbnRlcmFjdGlvbiA9IF9Qcm9wX3VzZXJfaW50ZXJhY3Rpb24oKQorIyAgICAgICAgZWxlbWVudCAnY3dpbicgYXMgWydpbmR4JywgJ25hbWUnLCAncmFuZyddCisjICAgICAgICBlbGVtZW50ICdkb2N1JyBhcyBbJ2luZHgnLCAnbmFtZScsICdyYW5nJ10KKworY2xhc3MgY2hhcmFjdGVyKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiY2hhcmFjdGVyIC0gYSBjaGFyYWN0ZXIgIiIiCisgICAgd2FudCA9ICdjaGEgJworY2xhc3MgX1Byb3BfbGVuZ3RoKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJsZW5ndGggLSBsZW5ndGggaW4gY2hhcmFjdGVycyBvZiB0aGlzIG9iamVjdCAiIiIKKyAgICB3aGljaCA9ICdwTGVuJworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX29mZnNldChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIib2Zmc2V0IC0gb2Zmc2V0IG9mIGEgdGV4dCBvYmplY3QgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudCAoZmlyc3QgY2hhciBoYXMgb2Zmc2V0IDEpICIiIgorICAgIHdoaWNoID0gJ3BPZmYnCisgICAgd2FudCA9ICdsb25nJworCitjbGFzcyBpbnNlcnRpb25fcG9pbnQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJpbnNlcnRpb24gcG9pbnQgLSBBbiBpbnNlcnRpb24gbG9jYXRpb24gYmV0d2VlbiB0d28gb2JqZWN0cyAiIiIKKyAgICB3YW50ID0gJ2NpbnMnCisKK2NsYXNzIGxpbmUoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJsaW5lIC0gbGluZXMgb2YgdGV4dCAiIiIKKyAgICB3YW50ID0gJ2NsaW4nCitjbGFzcyBfUHJvcF9pbmRleChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaW5kZXggLSBpbmRleCBvZiBhIGxpbmUgb2JqZWN0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQgKGZpcnN0IGxpbmUgaGFzIGluZGV4IDEpICIiIgorICAgIHdoaWNoID0gJ3BpZHgnCisgICAgd2FudCA9ICdsb25nJworIyAgICAgICAgZWxlbWVudCAnY2hhICcgYXMgWydpbmR4JywgJ3JhbmcnLCAncmVsZSddCisKK2xpbmVzID0gbGluZQorCitjbGFzcyBzZWxlY3Rpb25fMmRfb2JqZWN0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIic2VsZWN0aW9uLW9iamVjdCAtIHRoZSBzZWxlY3Rpb24gdmlzaWJsZSB0byB0aGUgdXNlciAiIiIKKyAgICB3YW50ID0gJ2NzZWwnCitjbGFzcyBfUHJvcF9jb250ZW50cyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY29udGVudHMgLSB0aGUgY29udGVudHMgb2YgdGhlIHNlbGVjdGlvbiAiIiIKKyAgICB3aGljaCA9ICdwY250JworICAgIHdhbnQgPSAndHlwZScKKyMgICAgICAgIGVsZW1lbnQgJ2NoYSAnIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjbGluJyBhcyBbJ2luZHgnLCAncmFuZycsICdyZWxlJ10KKyMgICAgICAgIGVsZW1lbnQgJ2N0eHQnIGFzIFsncmFuZyddCisKK2NsYXNzIHRleHQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJ0ZXh0IC0gVGV4dCAiIiIKKyAgICB3YW50ID0gJ2N0eHQnCisjICAgICAgICBlbGVtZW50ICdjaGEgJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJ10KKyMgICAgICAgIGVsZW1lbnQgJ2NpbnMnIGFzIFsncmVsZSddCisjICAgICAgICBlbGVtZW50ICdjbGluJyBhcyBbJ2luZHgnLCAncmFuZycsICdyZWxlJ10KKyMgICAgICAgIGVsZW1lbnQgJ2N0eHQnIGFzIFsncmFuZyddCisKK2NsYXNzIHdpbmRvdyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIndpbmRvdyAtIEEgd2luZG93ICIiIgorICAgIHdhbnQgPSAnY3dpbicKK2NsYXNzIF9Qcm9wX2JvdW5kcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiYm91bmRzIC0gdGhlIGJvdW5kYXJ5IHJlY3RhbmdsZSBmb3IgdGhlIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdwYm5kJworICAgIHdhbnQgPSAncWRydCcKK2NsYXNzIF9Qcm9wX2RvY3VtZW50KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJkb2N1bWVudCAtIHRoZSBkb2N1bWVudCB0aGF0IG93bnMgdGhpcyB3aW5kb3cgIiIiCisgICAgd2hpY2ggPSAnZG9jdScKKyAgICB3YW50ID0gJ2RvY3UnCitjbGFzcyBfUHJvcF9uYW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJuYW1lIC0gdGhlIHRpdGxlIG9mIHRoZSB3aW5kb3cgIiIiCisgICAgd2hpY2ggPSAncG5hbScKKyAgICB3YW50ID0gJ2l0eHQnCitjbGFzcyBfUHJvcF9wb3NpdGlvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicG9zaXRpb24gLSB1cHBlciBsZWZ0IGNvb3JkaW5hdGVzIG9mIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdwcG9zJworICAgIHdhbnQgPSAnUURwdCcKK2NsYXNzIF9Qcm9wX3Zpc2libGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInZpc2libGUgLSBpcyB0aGUgd2luZG93IHZpc2libGU/ICIiIgorICAgIHdoaWNoID0gJ3B2aXMnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3Bfem9vbWVkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ6b29tZWQgLSBJcyB0aGUgd2luZG93IHpvb21lZD8gIiIiCisgICAgd2hpY2ggPSAncHp1bScKKyAgICB3YW50ID0gJ2Jvb2wnCisKK3dpbmRvd3MgPSB3aW5kb3cKKworY2xhc3MgZG9jdW1lbnQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkb2N1bWVudCAtIGEgZG9jdW1lbnQgIiIiCisgICAgd2FudCA9ICdkb2N1JworY2xhc3MgX1Byb3BfZmlsZV9wZXJtaXNzaW9ucyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZmlsZSBwZXJtaXNzaW9ucyAtIHRoZSBmaWxlIHBlcm1pc3Npb25zIGZvciB0aGUgZG9jdW1lbnQgIiIiCisgICAgd2hpY2ggPSAnUEVSTScKKyAgICB3YW50ID0gJ1BFUk0nCitjbGFzcyBfUHJvcF9raW5kKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJraW5kIC0gdGhlIGtpbmQgb2YgZG9jdW1lbnQgIiIiCisgICAgd2hpY2ggPSAnREtORCcKKyAgICB3YW50ID0gJ0RLTkQnCitjbGFzcyBfUHJvcF9sb2NhdGlvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibG9jYXRpb24gLSB0aGUgZmlsZSBvZiB0aGUgZG9jdW1lbnQgIiIiCisgICAgd2hpY2ggPSAnRklMRScKKyAgICB3YW50ID0gJ2ZzcyAnCitjbGFzcyBfUHJvcF93aW5kb3coYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIndpbmRvdyAtIHRoZSB3aW5kb3cgb2YgdGhlIGRvY3VtZW50LiAiIiIKKyAgICB3aGljaCA9ICdjd2luJworICAgIHdhbnQgPSAnY3dpbicKKworZG9jdW1lbnRzID0gZG9jdW1lbnQKKworY2xhc3MgZmlsZXMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJmaWxlcyAtIEV2ZXJ5IGZpbGUgIiIiCisgICAgd2FudCA9ICdmaWxlJworCitmaWxlID0gZmlsZXMKK2FwcGxpY2F0aW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorYXBwbGljYXRpb24uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAndXNlcl9pbnRlcmFjdGlvbicgOiBfUHJvcF91c2VyX2ludGVyYWN0aW9uLAorfQorYXBwbGljYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnZG9jdW1lbnQnIDogZG9jdW1lbnQsCisgICAgJ3dpbmRvdycgOiB3aW5kb3csCit9CitjaGFyYWN0ZXIuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitjaGFyYWN0ZXIuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnbGVuZ3RoJyA6IF9Qcm9wX2xlbmd0aCwKKyAgICAnb2Zmc2V0JyA6IF9Qcm9wX29mZnNldCwKK30KK2NoYXJhY3Rlci5fcHJpdmVsZW1kaWN0ID0geworfQoraW5zZXJ0aW9uX3BvaW50Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQoraW5zZXJ0aW9uX3BvaW50Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2xlbmd0aCcgOiBfUHJvcF9sZW5ndGgsCisgICAgJ29mZnNldCcgOiBfUHJvcF9vZmZzZXQsCit9CitpbnNlcnRpb25fcG9pbnQuX3ByaXZlbGVtZGljdCA9IHsKK30KK2xpbmUuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitsaW5lLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2luZGV4JyA6IF9Qcm9wX2luZGV4LAorICAgICdsZW5ndGgnIDogX1Byb3BfbGVuZ3RoLAorICAgICdvZmZzZXQnIDogX1Byb3Bfb2Zmc2V0LAorfQorbGluZS5fcHJpdmVsZW1kaWN0ID0geworICAgICdjaGFyYWN0ZXInIDogY2hhcmFjdGVyLAorfQorc2VsZWN0aW9uXzJkX29iamVjdC5fc3VwZXJjbGFzc25hbWVzID0gW10KK3NlbGVjdGlvbl8yZF9vYmplY3QuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnY29udGVudHMnIDogX1Byb3BfY29udGVudHMsCisgICAgJ2xlbmd0aCcgOiBfUHJvcF9sZW5ndGgsCisgICAgJ29mZnNldCcgOiBfUHJvcF9vZmZzZXQsCit9CitzZWxlY3Rpb25fMmRfb2JqZWN0Ll9wcml2ZWxlbWRpY3QgPSB7CisgICAgJ2NoYXJhY3RlcicgOiBjaGFyYWN0ZXIsCisgICAgJ2xpbmUnIDogbGluZSwKKyAgICAndGV4dCcgOiB0ZXh0LAorfQordGV4dC5fc3VwZXJjbGFzc25hbWVzID0gW10KK3RleHQuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnbGVuZ3RoJyA6IF9Qcm9wX2xlbmd0aCwKKyAgICAnb2Zmc2V0JyA6IF9Qcm9wX29mZnNldCwKK30KK3RleHQuX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnY2hhcmFjdGVyJyA6IGNoYXJhY3RlciwKKyAgICAnaW5zZXJ0aW9uX3BvaW50JyA6IGluc2VydGlvbl9wb2ludCwKKyAgICAnbGluZScgOiBsaW5lLAorICAgICd0ZXh0JyA6IHRleHQsCit9Cit3aW5kb3cuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit3aW5kb3cuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnYm91bmRzJyA6IF9Qcm9wX2JvdW5kcywKKyAgICAnZG9jdW1lbnQnIDogX1Byb3BfZG9jdW1lbnQsCisgICAgJ2luZGV4JyA6IF9Qcm9wX2luZGV4LAorICAgICduYW1lJyA6IF9Qcm9wX25hbWUsCisgICAgJ3Bvc2l0aW9uJyA6IF9Qcm9wX3Bvc2l0aW9uLAorICAgICd2aXNpYmxlJyA6IF9Qcm9wX3Zpc2libGUsCisgICAgJ3pvb21lZCcgOiBfUHJvcF96b29tZWQsCit9Cit3aW5kb3cuX3ByaXZlbGVtZGljdCA9IHsKK30KK2RvY3VtZW50Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorZG9jdW1lbnQuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnZmlsZV9wZXJtaXNzaW9ucycgOiBfUHJvcF9maWxlX3Blcm1pc3Npb25zLAorICAgICdpbmRleCcgOiBfUHJvcF9pbmRleCwKKyAgICAna2luZCcgOiBfUHJvcF9raW5kLAorICAgICdsb2NhdGlvbicgOiBfUHJvcF9sb2NhdGlvbiwKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorICAgICd3aW5kb3cnIDogX1Byb3Bfd2luZG93LAorfQorZG9jdW1lbnQuX3ByaXZlbGVtZGljdCA9IHsKK30KK2ZpbGVzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorZmlsZXMuX3ByaXZwcm9wZGljdCA9IHsKK30KK2ZpbGVzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdjYXBwJyA6IGFwcGxpY2F0aW9uLAorICAgICdjaGEgJyA6IGNoYXJhY3RlciwKKyAgICAnY2lucycgOiBpbnNlcnRpb25fcG9pbnQsCisgICAgJ2NsaW4nIDogbGluZSwKKyAgICAnY3NlbCcgOiBzZWxlY3Rpb25fMmRfb2JqZWN0LAorICAgICdjdHh0JyA6IHRleHQsCisgICAgJ2N3aW4nIDogd2luZG93LAorICAgICdkb2N1JyA6IGRvY3VtZW50LAorICAgICdmaWxlJyA6IGZpbGVzLAorfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKKyAgICAnREtORCcgOiBfUHJvcF9raW5kLAorICAgICdGSUxFJyA6IF9Qcm9wX2xvY2F0aW9uLAorICAgICdQRVJNJyA6IF9Qcm9wX2ZpbGVfcGVybWlzc2lvbnMsCisgICAgJ2N3aW4nIDogX1Byb3Bfd2luZG93LAorICAgICdkb2N1JyA6IF9Qcm9wX2RvY3VtZW50LAorICAgICdpbnRlJyA6IF9Qcm9wX3VzZXJfaW50ZXJhY3Rpb24sCisgICAgJ3BMZW4nIDogX1Byb3BfbGVuZ3RoLAorICAgICdwT2ZmJyA6IF9Qcm9wX29mZnNldCwKKyAgICAncGJuZCcgOiBfUHJvcF9ib3VuZHMsCisgICAgJ3BjbnQnIDogX1Byb3BfY29udGVudHMsCisgICAgJ3BpZHgnIDogX1Byb3BfaW5kZXgsCisgICAgJ3BuYW0nIDogX1Byb3BfbmFtZSwKKyAgICAncHBvcycgOiBfUHJvcF9wb3NpdGlvbiwKKyAgICAncHZpcycgOiBfUHJvcF92aXNpYmxlLAorICAgICdwenVtJyA6IF9Qcm9wX3pvb21lZCwKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvU3RhbmRhcmRfU3VpdGUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvU3RhbmRhcmRfU3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDk3ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9TdGFuZGFyZF9TdWl0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvU3RhbmRhcmRfU3VpdGUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvU3RhbmRhcmRfU3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDk3ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9TdGFuZGFyZF9TdWl0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGUzMzUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvQ29kZVdhcnJpb3IvX19pbml0X18ucHkKQEAgLTAsMCArMSwxOTMgQEAKKyIiIgorUGFja2FnZSBnZW5lcmF0ZWQgZnJvbSAvVm9sdW1lcy9TYXAvQXBwbGljYXRpb25zIChNYWMgT1MgOSkvTWV0cm93ZXJrcyBDb2RlV2FycmlvciA3LjAvTWV0cm93ZXJrcyBDb2RlV2Fycmlvci9Db2RlV2FycmlvciBJREUgNC4yLjUKKyIiIgorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIENvZGVXYXJyaW9yIHBhY2thZ2UgaXMgcmVtb3ZlZC4iLCBzdGFja2xldmVsPTIpCisKK2ltcG9ydCBhZXRvb2xzCitFcnJvciA9IGFldG9vbHMuRXJyb3IKK2ltcG9ydCBDb2RlV2Fycmlvcl9zdWl0ZQoraW1wb3J0IFN0YW5kYXJkX1N1aXRlCitpbXBvcnQgTWV0cm93ZXJrc19TaGVsbF9TdWl0ZQoraW1wb3J0IFJlcXVpcmVkCisKKworX2NvZGVfdG9fbW9kdWxlID0geworICAgICdDV0lFJyA6IENvZGVXYXJyaW9yX3N1aXRlLAorICAgICdDb1JlJyA6IFN0YW5kYXJkX1N1aXRlLAorICAgICdNTVBSJyA6IE1ldHJvd2Vya3NfU2hlbGxfU3VpdGUsCisgICAgJ3JlcWQnIDogUmVxdWlyZWQsCit9CisKKworCitfY29kZV90b19mdWxsbmFtZSA9IHsKKyAgICAnQ1dJRScgOiAoJ0NvZGVXYXJyaW9yLkNvZGVXYXJyaW9yX3N1aXRlJywgJ0NvZGVXYXJyaW9yX3N1aXRlJyksCisgICAgJ0NvUmUnIDogKCdDb2RlV2Fycmlvci5TdGFuZGFyZF9TdWl0ZScsICdTdGFuZGFyZF9TdWl0ZScpLAorICAgICdNTVBSJyA6ICgnQ29kZVdhcnJpb3IuTWV0cm93ZXJrc19TaGVsbF9TdWl0ZScsICdNZXRyb3dlcmtzX1NoZWxsX1N1aXRlJyksCisgICAgJ3JlcWQnIDogKCdDb2RlV2Fycmlvci5SZXF1aXJlZCcsICdSZXF1aXJlZCcpLAorfQorCitmcm9tIENvZGVXYXJyaW9yX3N1aXRlIGltcG9ydCAqCitmcm9tIFN0YW5kYXJkX1N1aXRlIGltcG9ydCAqCitmcm9tIE1ldHJvd2Vya3NfU2hlbGxfU3VpdGUgaW1wb3J0ICoKK2Zyb20gUmVxdWlyZWQgaW1wb3J0ICoKKworZGVmIGdldGJhc2VjbGFzc2VzKHYpOgorICAgIGlmIG5vdCBnZXRhdHRyKHYsICdfcHJvcGRpY3QnLCBOb25lKToKKyAgICAgICAgdi5fcHJvcGRpY3QgPSB7fQorICAgICAgICB2Ll9lbGVtZGljdCA9IHt9CisgICAgICAgIGZvciBzdXBlcmNsYXNzbmFtZSBpbiBnZXRhdHRyKHYsICdfc3VwZXJjbGFzc25hbWVzJywgW10pOgorICAgICAgICAgICAgc3VwZXJjbGFzcyA9IGV2YWwoc3VwZXJjbGFzc25hbWUpCisgICAgICAgICAgICBnZXRiYXNlY2xhc3NlcyhzdXBlcmNsYXNzKQorICAgICAgICAgICAgdi5fcHJvcGRpY3QudXBkYXRlKGdldGF0dHIoc3VwZXJjbGFzcywgJ19wcm9wZGljdCcsIHt9KSkKKyAgICAgICAgICAgIHYuX2VsZW1kaWN0LnVwZGF0ZShnZXRhdHRyKHN1cGVyY2xhc3MsICdfZWxlbWRpY3QnLCB7fSkpCisgICAgICAgIHYuX3Byb3BkaWN0LnVwZGF0ZShnZXRhdHRyKHYsICdfcHJpdnByb3BkaWN0Jywge30pKQorICAgICAgICB2Ll9lbGVtZGljdC51cGRhdGUoZ2V0YXR0cih2LCAnX3ByaXZlbGVtZGljdCcsIHt9KSkKKworaW1wb3J0IFN0ZFN1aXRlcworCisjCisjIFNldCBwcm9wZXJ0eSBhbmQgZWxlbWVudCBkaWN0aW9uYXJpZXMgbm93IHRoYXQgYWxsIGNsYXNzZXMgaGF2ZSBiZWVuIGRlZmluZWQKKyMKK2dldGJhc2VjbGFzc2VzKGNoYXJhY3RlcikKK2dldGJhc2VjbGFzc2VzKHNlbGVjdGlvbl8yZF9vYmplY3QpCitnZXRiYXNlY2xhc3NlcyhhcHBsaWNhdGlvbikKK2dldGJhc2VjbGFzc2VzKGRvY3VtZW50KQorZ2V0YmFzZWNsYXNzZXModGV4dCkKK2dldGJhc2VjbGFzc2VzKHdpbmRvdykKK2dldGJhc2VjbGFzc2VzKGZpbGUpCitnZXRiYXNlY2xhc3NlcyhsaW5lKQorZ2V0YmFzZWNsYXNzZXMoaW5zZXJ0aW9uX3BvaW50KQorZ2V0YmFzZWNsYXNzZXMoc2luZ2xlX2NsYXNzX2Jyb3dzZXIpCitnZXRiYXNlY2xhc3Nlcyhwcm9qZWN0X2RvY3VtZW50KQorZ2V0YmFzZWNsYXNzZXMoc3ltYm9sX2Jyb3dzZXIpCitnZXRiYXNlY2xhc3NlcyhlZGl0b3JfZG9jdW1lbnQpCitnZXRiYXNlY2xhc3NlcyhmaWxlX2NvbXBhcmVfZG9jdW1lbnQpCitnZXRiYXNlY2xhc3NlcyhjbGFzc19icm93c2VyKQorZ2V0YmFzZWNsYXNzZXMoc3VidGFyZ2V0KQorZ2V0YmFzZWNsYXNzZXMobWVzc2FnZV9kb2N1bWVudCkKK2dldGJhc2VjbGFzc2VzKHByb2plY3RfaW5zcGVjdG9yKQorZ2V0YmFzZWNsYXNzZXModGV4dF9kb2N1bWVudCkKK2dldGJhc2VjbGFzc2VzKGNhdGFsb2dfZG9jdW1lbnQpCitnZXRiYXNlY2xhc3NlcyhjbGFzc19oaWVyYXJjaHkpCitnZXRiYXNlY2xhc3Nlcyh0YXJnZXQpCitnZXRiYXNlY2xhc3NlcyhidWlsZF9wcm9ncmVzc19kb2N1bWVudCkKK2dldGJhc2VjbGFzc2VzKHRhcmdldF9maWxlKQorZ2V0YmFzZWNsYXNzZXMoVG9vbFNlcnZlcl93b3Jrc2hlZXQpCitnZXRiYXNlY2xhc3NlcyhzaW5nbGVfY2xhc3NfaGllcmFyY2h5KQorZ2V0YmFzZWNsYXNzZXMoRmlsZV9NYXBwaW5nKQorZ2V0YmFzZWNsYXNzZXMoYnJvd3Nlcl9jYXRhbG9nKQorZ2V0YmFzZWNsYXNzZXMoQnVpbGRfU2V0dGluZ3MpCitnZXRiYXNlY2xhc3NlcyhQcm9qZWN0RmlsZSkKK2dldGJhc2VjbGFzc2VzKFZDU19TZXR1cCkKK2dldGJhc2VjbGFzc2VzKGRhdGFfbWVtYmVyKQorZ2V0YmFzZWNsYXNzZXMoU2hpZWxkZWRfRm9sZGVyKQorZ2V0YmFzZWNsYXNzZXMoQ3VzdG9tX0tleXdvcmRzKQorZ2V0YmFzZWNsYXNzZXMoUGF0aF9JbmZvcm1hdGlvbikKK2dldGJhc2VjbGFzc2VzKFNlZ21lbnQpCitnZXRiYXNlY2xhc3NlcyhTb3VyY2VfVHJlZSkKK2dldGJhc2VjbGFzc2VzKEFjY2Vzc19QYXRocykKK2dldGJhc2VjbGFzc2VzKERlYnVnZ2VyX1dpbmRvd2luZykKK2dldGJhc2VjbGFzc2VzKFJlbGF0aXZlX1BhdGgpCitnZXRiYXNlY2xhc3NlcyhFbnZpcm9ubWVudF9WYXJpYWJsZSkKK2dldGJhc2VjbGFzc2VzKGJhc2VfY2xhc3MpCitnZXRiYXNlY2xhc3NlcyhEZWJ1Z2dlcl9EaXNwbGF5KQorZ2V0YmFzZWNsYXNzZXMoQnVpbGRfRXh0cmFzKQorZ2V0YmFzZWNsYXNzZXMoRXJyb3JfSW5mb3JtYXRpb24pCitnZXRiYXNlY2xhc3NlcyhFZGl0b3IpCitnZXRiYXNlY2xhc3NlcyhTaGllbGRlZF9Gb2xkZXJzKQorZ2V0YmFzZWNsYXNzZXMoRXh0cmFzKQorZ2V0YmFzZWNsYXNzZXMoRmlsZV9NYXBwaW5ncykKK2dldGJhc2VjbGFzc2VzKEZ1bmN0aW9uX0luZm9ybWF0aW9uKQorZ2V0YmFzZWNsYXNzZXMoRGVidWdnZXJfVGFyZ2V0KQorZ2V0YmFzZWNsYXNzZXMoU3ludGF4X0NvbG9yaW5nKQorZ2V0YmFzZWNsYXNzZXMoY2xhc3NfKQorZ2V0YmFzZWNsYXNzZXMoR2xvYmFsX1NvdXJjZV9UcmVlcykKK2dldGJhc2VjbGFzc2VzKFRhcmdldF9TZXR0aW5ncykKK2dldGJhc2VjbGFzc2VzKERlYnVnZ2VyX0dsb2JhbCkKK2dldGJhc2VjbGFzc2VzKG1lbWJlcl9mdW5jdGlvbikKK2dldGJhc2VjbGFzc2VzKFJ1bnRpbWVfU2V0dGluZ3MpCitnZXRiYXNlY2xhc3NlcyhQbHVnaW5fU2V0dGluZ3MpCitnZXRiYXNlY2xhc3NlcyhCcm93c2VyX0NvbG9yaW5nKQorZ2V0YmFzZWNsYXNzZXMoRm9udCkKK2dldGJhc2VjbGFzc2VzKFRhcmdldF9Tb3VyY2VfVHJlZXMpCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdjaGEgJyA6IGNoYXJhY3RlciwKKyAgICAnY3NlbCcgOiBzZWxlY3Rpb25fMmRfb2JqZWN0LAorICAgICdjYXBwJyA6IGFwcGxpY2F0aW9uLAorICAgICdkb2N1JyA6IGRvY3VtZW50LAorICAgICdjdHh0JyA6IHRleHQsCisgICAgJ2N3aW4nIDogd2luZG93LAorICAgICdmaWxlJyA6IGZpbGUsCisgICAgJ2NsaW4nIDogbGluZSwKKyAgICAnY2lucycgOiBpbnNlcnRpb25fcG9pbnQsCisgICAgJzFCUlcnIDogc2luZ2xlX2NsYXNzX2Jyb3dzZXIsCisgICAgJ1BSSkQnIDogcHJvamVjdF9kb2N1bWVudCwKKyAgICAnU1lNQicgOiBzeW1ib2xfYnJvd3NlciwKKyAgICAnRURJVCcgOiBlZGl0b3JfZG9jdW1lbnQsCisgICAgJ0NPTVAnIDogZmlsZV9jb21wYXJlX2RvY3VtZW50LAorICAgICdCUk9XJyA6IGNsYXNzX2Jyb3dzZXIsCisgICAgJ1NCVEcnIDogc3VidGFyZ2V0LAorICAgICdNU1NHJyA6IG1lc3NhZ2VfZG9jdW1lbnQsCisgICAgJ0lOU1AnIDogcHJvamVjdF9pbnNwZWN0b3IsCisgICAgJ1RYVEQnIDogdGV4dF9kb2N1bWVudCwKKyAgICAnQ1RMRycgOiBjYXRhbG9nX2RvY3VtZW50LAorICAgICdISUVSJyA6IGNsYXNzX2hpZXJhcmNoeSwKKyAgICAnVFJHVCcgOiB0YXJnZXQsCisgICAgJ1BSR1MnIDogYnVpbGRfcHJvZ3Jlc3NfZG9jdW1lbnQsCisgICAgJ1NSQ0YnIDogdGFyZ2V0X2ZpbGUsCisgICAgJ1RPT0wnIDogVG9vbFNlcnZlcl93b3Jrc2hlZXQsCisgICAgJzFISVInIDogc2luZ2xlX2NsYXNzX2hpZXJhcmNoeSwKKyAgICAnRk1hcCcgOiBGaWxlX01hcHBpbmcsCisgICAgJ0NhdGEnIDogYnJvd3Nlcl9jYXRhbG9nLAorICAgICdCU1RHJyA6IEJ1aWxkX1NldHRpbmdzLAorICAgICdTcmNGJyA6IFByb2plY3RGaWxlLAorICAgICdWQ1NzJyA6IFZDU19TZXR1cCwKKyAgICAnRHRNYicgOiBkYXRhX21lbWJlciwKKyAgICAnU0ZpdCcgOiBTaGllbGRlZF9Gb2xkZXIsCisgICAgJ0NVS1cnIDogQ3VzdG9tX0tleXdvcmRzLAorICAgICdQSW5mJyA6IFBhdGhfSW5mb3JtYXRpb24sCisgICAgJ1NlZyAnIDogU2VnbWVudCwKKyAgICAnU3JjVCcgOiBTb3VyY2VfVHJlZSwKKyAgICAnUEFUSCcgOiBBY2Nlc3NfUGF0aHMsCisgICAgJ0RiV04nIDogRGVidWdnZXJfV2luZG93aW5nLAorICAgICdSbFB0JyA6IFJlbGF0aXZlX1BhdGgsCisgICAgJ0VudlYnIDogRW52aXJvbm1lbnRfVmFyaWFibGUsCisgICAgJ0JzQ2wnIDogYmFzZV9jbGFzcywKKyAgICAnRGJEUycgOiBEZWJ1Z2dlcl9EaXNwbGF5LAorICAgICdMWFRSJyA6IEJ1aWxkX0V4dHJhcywKKyAgICAnRXJyTScgOiBFcnJvcl9JbmZvcm1hdGlvbiwKKyAgICAnRURUUicgOiBFZGl0b3IsCisgICAgJ1NIRkwnIDogU2hpZWxkZWRfRm9sZGVycywKKyAgICAnR1hUUicgOiBFeHRyYXMsCisgICAgJ0ZMTVAnIDogRmlsZV9NYXBwaW5ncywKKyAgICAnRkRlZicgOiBGdW5jdGlvbl9JbmZvcm1hdGlvbiwKKyAgICAnRGJURycgOiBEZWJ1Z2dlcl9UYXJnZXQsCisgICAgJ1NOVFgnIDogU3ludGF4X0NvbG9yaW5nLAorICAgICdDbGFzJyA6IGNsYXNzXywKKyAgICAnR1NUcycgOiBHbG9iYWxfU291cmNlX1RyZWVzLAorICAgICdUQVJHJyA6IFRhcmdldF9TZXR0aW5ncywKKyAgICAnRGJHTCcgOiBEZWJ1Z2dlcl9HbG9iYWwsCisgICAgJ01iRm4nIDogbWVtYmVyX2Z1bmN0aW9uLAorICAgICdSU1RHJyA6IFJ1bnRpbWVfU2V0dGluZ3MsCisgICAgJ1BTVEcnIDogUGx1Z2luX1NldHRpbmdzLAorICAgICdCUktXJyA6IEJyb3dzZXJfQ29sb3JpbmcsCisgICAgJ21GTlQnIDogRm9udCwKKyAgICAnVFNUcycgOiBUYXJnZXRfU291cmNlX1RyZWVzLAorfQorCisKK2NsYXNzIENvZGVXYXJyaW9yKENvZGVXYXJyaW9yX3N1aXRlX0V2ZW50cywKKyAgICAgICAgU3RhbmRhcmRfU3VpdGVfRXZlbnRzLAorICAgICAgICBNZXRyb3dlcmtzX1NoZWxsX1N1aXRlX0V2ZW50cywKKyAgICAgICAgUmVxdWlyZWRfRXZlbnRzLAorICAgICAgICBhZXRvb2xzLlRhbGtUbyk6CisgICAgX3NpZ25hdHVyZSA9ICdDV0lFJworCisgICAgX21vZHVsZU5hbWUgPSAnQ29kZVdhcnJpb3InCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlZjMxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9Db2RlV2Fycmlvci9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlZjMxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9NaWNyb3NvZnRfSW50ZXJuZXRfRXhwbG9yZXIucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9NaWNyb3NvZnRfSW50ZXJuZXRfRXhwbG9yZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlOWU3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL01pY3Jvc29mdF9JbnRlcm5ldF9FeHBsb3Jlci5weQpAQCAtMCwwICsxLDk2IEBACisiIiJTdWl0ZSBNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIgU3VpdGU6IEV2ZW50cyBkZWZpbmVkIGJ5IEludGVybmV0IEV4cGxvcmVyCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL0FwcGxpY2F0aW9ucy9JbnRlcm5ldCBFeHBsb3Jlci5hcHAKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ01TSUUnCisKK2NsYXNzIE1pY3Jvc29mdF9JbnRlcm5ldF9FeHBsb3Jlcl9FdmVudHM6CisKKyAgICBkZWYgR2V0U291cmNlKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkdldFNvdXJjZTogR2V0IHRoZSBIVE1MIHNvdXJjZSBvZiBhIGJyb3dzZXIgd2luZG93CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBXaW5kb3cgSWRlbnRpZmllciBvZiB3aW5kb3cgZnJvbSB3aGljaCB0byBnZXQgdGhlIHNvdXJjZS4gTm8gdmFsdWUgbWVhbnMgZ2V0IHRoZSBzb3VyY2UgZnJvbSB0aGUgZnJvbnRtb3N0IHdpbmRvdy4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB1bmRvY3VtZW50ZWQsIHR5cGVjb2RlICdURVhUJworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTVNJRScKKyAgICAgICAgX3N1YmNvZGUgPSAnU09SQycKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBQcmludEJyb3dzZXJXaW5kb3coc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiUHJpbnRCcm93c2VyV2luZG93OiBQcmludCBjb250ZW50cyBvZiBicm93c2VyIHdpbmRvdyAoSFRNTCkKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IFdpbmRvdyBJZGVudGlmaWVyIG9mIHRoZSB3aW5kb3cgdG8gcHJpbnQuIE5vIHZhbHVlIG1lYW5zIHByaW50IHRoZSBmcm9udG1vc3QgYnJvd3NlciB3aW5kb3cuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ21pc2MnCisgICAgICAgIF9zdWJjb2RlID0gJ3BXTkQnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX2RvX3NjcmlwdCA9IHsKKyAgICAgICAgJ3dpbmRvdycgOiAnV0lORCcsCisgICAgfQorCisgICAgZGVmIGRvX3NjcmlwdChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiZG8gc2NyaXB0OiBFeGVjdXRlIHNjcmlwdCBjb21tYW5kcworICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogSmF2YVNjcmlwdCB0ZXh0IHRvIGV4ZWN1dGUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aW5kb3c6IG9wdGlvbmFsIFdpbmRvdyBJZGVudGlmaWVyIChhcyBzdXBwbGllZCBieSB0aGUgTGlzdFdpbmRvd3MgZXZlbnQpIHNwZWNpZnlpbmcgY29udGV4dCBpbiB3aGljaCB0byBleGVjdXRlIHRoZSBzY3JpcHQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBSZXR1cm4gdmFsdWUKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ21pc2MnCisgICAgICAgIF9zdWJjb2RlID0gJ2Rvc2MnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfZG9fc2NyaXB0KQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL01pY3Jvc29mdF9JbnRlcm5ldF9FeHBsb3Jlci5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9NaWNyb3NvZnRfSW50ZXJuZXRfRXhwbG9yZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMmJmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9NaWNyb3NvZnRfSW50ZXJuZXRfRXhwbG9yZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL01pY3Jvc29mdF9JbnRlcm5ldF9FeHBsb3Jlci5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9NaWNyb3NvZnRfSW50ZXJuZXRfRXhwbG9yZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMmJmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9NaWNyb3NvZnRfSW50ZXJuZXRfRXhwbG9yZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL05ldHNjYXBlX1N1aXRlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvTmV0c2NhcGVfU3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3NGU3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL05ldHNjYXBlX1N1aXRlLnB5CkBAIC0wLDAgKzEsNDkgQEAKKyIiIlN1aXRlIE5ldHNjYXBlIFN1aXRlOiBFdmVudHMgZGVmaW5lZCBieSBOZXRzY2FwZQorTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9BcHBsaWNhdGlvbnMvSW50ZXJuZXQgRXhwbG9yZXIuYXBwCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdNT1NTJworCitjbGFzcyBOZXRzY2FwZV9TdWl0ZV9FdmVudHM6CisKKyAgICBkZWYgT3Blbl9ib29rbWFyayhzZWxmLCBfb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJPcGVuIGJvb2ttYXJrOiBPcGVucyBhIGJvb2ttYXJrIGZpbGUKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IElmIG5vdCBhdmFpbGFibGUsIHJlbG9hZHMgdGhlIGN1cnJlbnQgYm9va21hcmsgZmlsZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNT1NTJworICAgICAgICBfc3ViY29kZSA9ICdib29rJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvTmV0c2NhcGVfU3VpdGUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvTmV0c2NhcGVfU3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTk2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9OZXRzY2FwZV9TdWl0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvTmV0c2NhcGVfU3VpdGUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvTmV0c2NhcGVfU3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYTk2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9OZXRzY2FwZV9TdWl0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvUmVxdWlyZWRfU3VpdGUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9SZXF1aXJlZF9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI1NDFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvUmVxdWlyZWRfU3VpdGUucHkKQEAgLTAsMCArMSwxMDggQEAKKyIiIlN1aXRlIFJlcXVpcmVkIFN1aXRlOiBFdmVudHMgdGhhdCBldmVyeSBhcHBsaWNhdGlvbiBzaG91bGQgc3VwcG9ydAorTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9BcHBsaWNhdGlvbnMvSW50ZXJuZXQgRXhwbG9yZXIuYXBwCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdyZXFkJworCitmcm9tIFN0ZFN1aXRlcy5SZXF1aXJlZF9TdWl0ZSBpbXBvcnQgKgorY2xhc3MgUmVxdWlyZWRfU3VpdGVfRXZlbnRzKFJlcXVpcmVkX1N1aXRlX0V2ZW50cyk6CisKKyAgICBkZWYgb3BlbihzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIib3BlbjogT3BlbiBkb2N1bWVudHMKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHVuZG9jdW1lbnRlZCwgdHlwZWNvZGUgJ2FsaXMnCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ29kb2MnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgcHJpbnRfKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJwcmludDogUHJpbnQgZG9jdW1lbnRzCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB1bmRvY3VtZW50ZWQsIHR5cGVjb2RlICdhbGlzJworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhZXZ0JworICAgICAgICBfc3ViY29kZSA9ICdwZG9jJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIHF1aXQoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIicXVpdDogUXVpdCBhcHBsaWNhdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhZXZ0JworICAgICAgICBfc3ViY29kZSA9ICdxdWl0JworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBydW4oc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIicnVuOgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhZXZ0JworICAgICAgICBfc3ViY29kZSA9ICdvYXBwJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1JlcXVpcmVkX1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1JlcXVpcmVkX1N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODUwOGYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvUmVxdWlyZWRfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1JlcXVpcmVkX1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1JlcXVpcmVkX1N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODUwOGYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvUmVxdWlyZWRfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1N0YW5kYXJkX1N1aXRlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvU3RhbmRhcmRfU3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhZDk4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1N0YW5kYXJkX1N1aXRlLnB5CkBAIC0wLDAgKzEsNzIgQEAKKyIiIlN1aXRlIFN0YW5kYXJkIFN1aXRlOiBDb21tb24gdGVybXMgZm9yIG1vc3QgYXBwbGljYXRpb25zCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL0FwcGxpY2F0aW9ucy9JbnRlcm5ldCBFeHBsb3Jlci5hcHAKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJyoqKionCisKK2NsYXNzIFN0YW5kYXJkX1N1aXRlX0V2ZW50czoKKworICAgIF9hcmdtYXBfZ2V0ID0geworICAgICAgICAnYXMnIDogJ3J0eXAnLAorICAgIH0KKworICAgIGRlZiBnZXQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImdldDoKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBhczogdW5kb2N1bWVudGVkLCB0eXBlY29kZSAndHlwZScKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhbnl0aGluZworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnZ2V0ZCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9nZXQpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisKK2NsYXNzIGFwcGxpY2F0aW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYXBwbGljYXRpb24gLSBBbiBhcHBsaWNhdGlvbiBwcm9ncmFtICIiIgorICAgIHdhbnQgPSAnY2FwcCcKK2NsYXNzIF9Qcm9wX3NlbGVjdGVkX3RleHQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNlbGVjdGVkIHRleHQgLSB0aGUgc2VsZWN0ZWQgdGV4dCAiIiIKKyAgICB3aGljaCA9ICdzdHh0JworICAgIHdhbnQgPSAnVEVYVCcKK3NlbGVjdGVkX3RleHQgPSBfUHJvcF9zZWxlY3RlZF90ZXh0KCkKK2FwcGxpY2F0aW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorYXBwbGljYXRpb24uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnc2VsZWN0ZWRfdGV4dCcgOiBfUHJvcF9zZWxlY3RlZF90ZXh0LAorfQorYXBwbGljYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKK30KKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2NhcHAnIDogYXBwbGljYXRpb24sCit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworICAgICdzdHh0JyA6IF9Qcm9wX3NlbGVjdGVkX3RleHQsCit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1N0YW5kYXJkX1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1N0YW5kYXJkX1N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzk4MmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvU3RhbmRhcmRfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1N0YW5kYXJkX1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1N0YW5kYXJkX1N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzk4MmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvU3RhbmRhcmRfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1VSTF9TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1VSTF9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjM0NTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvVVJMX1N1aXRlLnB5CkBAIC0wLDAgKzEsNTQgQEAKKyIiIlN1aXRlIFVSTCBTdWl0ZTogU3RhbmRhcmQgc3VpdGUgZm9yIFVuaWZvcm0gUmVzb3VyY2UgTG9jYXRvcnMKK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvQXBwbGljYXRpb25zL0ludGVybmV0IEV4cGxvcmVyLmFwcAorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMS8wLCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAnR1VSTCcKKworY2xhc3MgVVJMX1N1aXRlX0V2ZW50czoKKworICAgIF9hcmdtYXBfR2V0VVJMID0geworICAgICAgICAndG8nIDogJ2Rlc3QnLAorICAgIH0KKworICAgIGRlZiBHZXRVUkwoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkdldFVSTDogT3BlbiB0aGUgVVJMIChhbmQgb3B0aW9uYWxseSBzYXZlIGl0IHRvIGRpc2spCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBVUkwgdG8gb3BlbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRvOiBGaWxlIGludG8gd2hpY2ggdG8gc2F2ZSByZXNvdXJjZSBsb2NhdGVkIGF0IFVSTC4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnR1VSTCcKKyAgICAgICAgX3N1YmNvZGUgPSAnR1VSTCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9HZXRVUkwpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvVVJMX1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1VSTF9TdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2ZWM0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1VSTF9TdWl0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvVVJMX1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1VSTF9TdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2ZWM0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1VSTF9TdWl0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvV2ViX0Jyb3dzZXJfU3VpdGUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9FeHBsb3Jlci9XZWJfQnJvd3Nlcl9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODc1MjZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvV2ViX0Jyb3dzZXJfU3VpdGUucHkKQEAgLTAsMCArMSwyMjYgQEAKKyIiIlN1aXRlIFdlYiBCcm93c2VyIFN1aXRlOiBDbGFzcyBvZiBldmVudHMgc3VwcG9ydGVkIGJ5IFdlYiBCcm93c2VyIGFwcGxpY2F0aW9ucworTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9BcHBsaWNhdGlvbnMvSW50ZXJuZXQgRXhwbG9yZXIuYXBwCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdXV1chJworCitjbGFzcyBXZWJfQnJvd3Nlcl9TdWl0ZV9FdmVudHM6CisKKyAgICBkZWYgQWN0aXZhdGUoc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiQWN0aXZhdGU6IEFjdGl2YXRlIEludGVybmV0IEV4cGxvcmVyIGFuZCBvcHRpb25hbGx5IHNlbGVjdCB3aW5kb3cgZGVzaWduYXRlZCBieSBXaW5kb3cgSWRlbnRpZmllci4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IFdpbmRvdyBJZGVudGlmaWVyCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogV2luZG93IElkZW50aWZpZXIgb2Ygd2luZG93IHRvIGFjdGl2YXRlCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdXV1chJworICAgICAgICBfc3ViY29kZSA9ICdBQ1RWJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIENsb3NlQWxsV2luZG93cyhzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJDbG9zZUFsbFdpbmRvd3M6IENsb3NlcyBhbGwgd2luZG93cworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IFN1Y2Nlc3MKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1dXVyEnCisgICAgICAgIF9zdWJjb2RlID0gJ0NMU0EnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9DbG9zZVdpbmRvdyA9IHsKKyAgICAgICAgJ0lEJyA6ICdXSU5EJywKKyAgICAgICAgJ1RpdGxlJyA6ICdUSVRMJywKKyAgICB9CisKKyAgICBkZWYgQ2xvc2VXaW5kb3coc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiQ2xvc2VXaW5kb3c6IENsb3NlIHRoZSB3aW5kb3cgc3BlY2lmaWVkIGJ5IGVpdGhlciBXaW5kb3cgSWRlbnRpZmllciBvciBUaXRsZS4gSWYgbm8gcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgY2xvc2UgdGhlIHRvcCB3aW5kb3cuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgSUQ6IElEIG9mIHRoZSB3aW5kb3cgdG8gY2xvc2UuIChDYW4gdXNlIC0xIGZvciB0b3Agd2luZG93KQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IFRpdGxlOiBUaXRsZSBvZiB0aGUgd2luZG93IHRvIGNsb3NlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogU3VjY2VzcworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnV1dXIScKKyAgICAgICAgX3N1YmNvZGUgPSAnQ0xPUycKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9DbG9zZVdpbmRvdykKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIEdldFdpbmRvd0luZm8oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkdldFdpbmRvd0luZm86IFJldHVybnMgYSB3aW5kb3cgaW5mbyByZWNvcmQgKFVSTC9UaXRsZSkgZm9yIHRoZSBzcGVjaWZpZWQgd2luZG93LgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogV2luZG93IElkZW50aWZpZXIgb2YgdGhlIHdpbmRvdworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdXV1chJworICAgICAgICBfc3ViY29kZSA9ICdXTkZPJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIExpc3RXaW5kb3dzKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkxpc3RXaW5kb3dzOiBSZXR1cm5zIGxpc3Qgb2YgV2luZG93IElkZW50aWZpZXJzIGZvciBhbGwgb3BlbiB3aW5kb3dzLgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHVuZG9jdW1lbnRlZCwgdHlwZWNvZGUgJ2xpc3QnCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdXV1chJworICAgICAgICBfc3ViY29kZSA9ICdMU1RXJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfT3BlblVSTCA9IHsKKyAgICAgICAgJ3RvJyA6ICdJTlRPJywKKyAgICAgICAgJ3RvV2luZG93JyA6ICdXSU5EJywKKyAgICAgICAgJ0ZsYWdzJyA6ICdGTEdTJywKKyAgICAgICAgJ0Zvcm1EYXRhJyA6ICdQT1NUJywKKyAgICAgICAgJ01JTUVfVHlwZScgOiAnTUlNRScsCisgICAgfQorCisgICAgZGVmIE9wZW5VUkwoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIk9wZW5VUkw6IFJldHJpZXZlcyBVUkwgb2ZmIHRoZSBXZWIuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBGdWxseS1xdWFsaWZpZWQgVVJMCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG86IFRhcmdldCBmaWxlIGZvciBzYXZpbmcgZG93bmxvYWRlZCBkYXRhCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG9XaW5kb3c6IFRhcmdldCB3aW5kb3cgZm9yIHJlc291cmNlIGF0IFVSTCAoLTEgZm9yIHRvcCB3aW5kb3csIDAgZm9yIG5ldyB3aW5kb3cpCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgRmxhZ3M6IFZhbGlkIEZsYWdzIHNldHRpbmdzIGFyZTogMS1JZ25vcmUgdGhlIGRvY3VtZW50IGNhY2hlOyAyLUlnbm9yZSB0aGUgaW1hZ2UgY2FjaGU7IDQtT3BlcmF0ZSBpbiBiYWNrZ3JvdW5kIG1vZGUuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgRm9ybURhdGE6IGRhdGEgdG8gcG9zdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IE1JTUVfVHlwZTogTUlNRSB0eXBlIG9mIGRhdGEgYmVpbmcgcG9zdGVkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1dXVyEnCisgICAgICAgIF9zdWJjb2RlID0gJ09VUkwnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfT3BlblVSTCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX1BhcnNlQW5jaG9yID0geworICAgICAgICAnd2l0aFVSTCcgOiAnUkVMQScsCisgICAgfQorCisgICAgZGVmIFBhcnNlQW5jaG9yKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJQYXJzZUFuY2hvcjogQ29tYmluZXMgYSBiYXNlIFVSTCBhbmQgYSByZWxhdGl2ZSBVUkwgdG8gcHJvZHVjZSBhIGZ1bGx5LXF1YWxpZmllZCBVUkwKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IEJhc2UgVVJMCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgd2l0aFVSTDogUmVsYXRpdmUgVVJMIHRoYXQgaXMgY29tYmluZWQgd2l0aCB0aGUgQmFzZSBVUkwgKGluIHRoZSBkaXJlY3Qgb2JqZWN0KSB0byBwcm9kdWNlIGEgZnVsbHktcXVhbGlmaWVkIFVSTC4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBGdWxseS1xdWFsaWZpZWQgVVJMCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdXV1chJworICAgICAgICBfc3ViY29kZSA9ICdQUlNBJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX1BhcnNlQW5jaG9yKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfU2hvd0ZpbGUgPSB7CisgICAgICAgICdNSU1FX1R5cGUnIDogJ01JTUUnLAorICAgICAgICAnV2luZG93X0lkZW50aWZpZXInIDogJ1dJTkQnLAorICAgICAgICAnVVJMJyA6ICdVUkwgJywKKyAgICB9CisKKyAgICBkZWYgU2hvd0ZpbGUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIlNob3dGaWxlOiBGaWxlU3BlYyBjb250YWluaW5nIGRhdGEgb2Ygc3BlY2lmaWVkIE1JTUUgdHlwZSB0byBiZSByZW5kZXJlZCBpbiB3aW5kb3cgc3BlY2lmaWVkIGJ5IFdpbmRvdyBJZGVudGlmaWVyLgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogVGhlIGZpbGUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBNSU1FX1R5cGU6IE1JTUUgdHlwZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IFdpbmRvd19JZGVudGlmaWVyOiBJZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgd2luZG93IGZvciB0aGUgVVJMLiAoQ2FuIHVzZSAtMSBmb3IgdG9wIHdpbmRvdykKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBVUkw6IFVSTCB0aGF0IGFsbG93cyB0aGlzIGRvY3VtZW50IHRvIGJlIHJlbG9hZGVkLgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdXV1chJworICAgICAgICBfc3ViY29kZSA9ICdTSFdGJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX1Nob3dGaWxlKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1dlYl9Ccm93c2VyX1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1dlYl9Ccm93c2VyX1N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODc1OThiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvV2ViX0Jyb3dzZXJfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1dlYl9Ccm93c2VyX1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL1dlYl9Ccm93c2VyX1N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODc1OThiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvV2ViX0Jyb3dzZXJfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3YmMwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsODQgQEAKKyIiIgorUGFja2FnZSBnZW5lcmF0ZWQgZnJvbSAvQXBwbGljYXRpb25zL0ludGVybmV0IEV4cGxvcmVyLmFwcAorIiIiCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgRXhwbG9yZXIgbW9kdWxlIGlzIHJlbW92ZWQuIiwgc3RhY2tsZXZlbD0yKQorCitpbXBvcnQgYWV0b29scworRXJyb3IgPSBhZXRvb2xzLkVycm9yCitpbXBvcnQgU3RhbmRhcmRfU3VpdGUKK2ltcG9ydCBVUkxfU3VpdGUKK2ltcG9ydCBOZXRzY2FwZV9TdWl0ZQoraW1wb3J0IE1pY3Jvc29mdF9JbnRlcm5ldF9FeHBsb3JlcgoraW1wb3J0IFdlYl9Ccm93c2VyX1N1aXRlCitpbXBvcnQgUmVxdWlyZWRfU3VpdGUKKworCitfY29kZV90b19tb2R1bGUgPSB7CisgICAgJyoqKionIDogU3RhbmRhcmRfU3VpdGUsCisgICAgJ0dVUkwnIDogVVJMX1N1aXRlLAorICAgICdNT1NTJyA6IE5ldHNjYXBlX1N1aXRlLAorICAgICdNU0lFJyA6IE1pY3Jvc29mdF9JbnRlcm5ldF9FeHBsb3JlciwKKyAgICAnV1dXIScgOiBXZWJfQnJvd3Nlcl9TdWl0ZSwKKyAgICAncmVxZCcgOiBSZXF1aXJlZF9TdWl0ZSwKK30KKworCisKK19jb2RlX3RvX2Z1bGxuYW1lID0geworICAgICcqKioqJyA6ICgnRXhwbG9yZXIuU3RhbmRhcmRfU3VpdGUnLCAnU3RhbmRhcmRfU3VpdGUnKSwKKyAgICAnR1VSTCcgOiAoJ0V4cGxvcmVyLlVSTF9TdWl0ZScsICdVUkxfU3VpdGUnKSwKKyAgICAnTU9TUycgOiAoJ0V4cGxvcmVyLk5ldHNjYXBlX1N1aXRlJywgJ05ldHNjYXBlX1N1aXRlJyksCisgICAgJ01TSUUnIDogKCdFeHBsb3Jlci5NaWNyb3NvZnRfSW50ZXJuZXRfRXhwbG9yZXInLCAnTWljcm9zb2Z0X0ludGVybmV0X0V4cGxvcmVyJyksCisgICAgJ1dXVyEnIDogKCdFeHBsb3Jlci5XZWJfQnJvd3Nlcl9TdWl0ZScsICdXZWJfQnJvd3Nlcl9TdWl0ZScpLAorICAgICdyZXFkJyA6ICgnRXhwbG9yZXIuUmVxdWlyZWRfU3VpdGUnLCAnUmVxdWlyZWRfU3VpdGUnKSwKK30KKworZnJvbSBTdGFuZGFyZF9TdWl0ZSBpbXBvcnQgKgorZnJvbSBVUkxfU3VpdGUgaW1wb3J0ICoKK2Zyb20gTmV0c2NhcGVfU3VpdGUgaW1wb3J0ICoKK2Zyb20gTWljcm9zb2Z0X0ludGVybmV0X0V4cGxvcmVyIGltcG9ydCAqCitmcm9tIFdlYl9Ccm93c2VyX1N1aXRlIGltcG9ydCAqCitmcm9tIFJlcXVpcmVkX1N1aXRlIGltcG9ydCAqCisKK2RlZiBnZXRiYXNlY2xhc3Nlcyh2KToKKyAgICBpZiBub3QgZ2V0YXR0cih2LCAnX3Byb3BkaWN0JywgTm9uZSk6CisgICAgICAgIHYuX3Byb3BkaWN0ID0ge30KKyAgICAgICAgdi5fZWxlbWRpY3QgPSB7fQorICAgICAgICBmb3Igc3VwZXJjbGFzc25hbWUgaW4gZ2V0YXR0cih2LCAnX3N1cGVyY2xhc3NuYW1lcycsIFtdKToKKyAgICAgICAgICAgIHN1cGVyY2xhc3MgPSBldmFsKHN1cGVyY2xhc3NuYW1lKQorICAgICAgICAgICAgZ2V0YmFzZWNsYXNzZXMoc3VwZXJjbGFzcykKKyAgICAgICAgICAgIHYuX3Byb3BkaWN0LnVwZGF0ZShnZXRhdHRyKHN1cGVyY2xhc3MsICdfcHJvcGRpY3QnLCB7fSkpCisgICAgICAgICAgICB2Ll9lbGVtZGljdC51cGRhdGUoZ2V0YXR0cihzdXBlcmNsYXNzLCAnX2VsZW1kaWN0Jywge30pKQorICAgICAgICB2Ll9wcm9wZGljdC51cGRhdGUoZ2V0YXR0cih2LCAnX3ByaXZwcm9wZGljdCcsIHt9KSkKKyAgICAgICAgdi5fZWxlbWRpY3QudXBkYXRlKGdldGF0dHIodiwgJ19wcml2ZWxlbWRpY3QnLCB7fSkpCisKK2ltcG9ydCBTdGRTdWl0ZXMKKworIworIyBTZXQgcHJvcGVydHkgYW5kIGVsZW1lbnQgZGljdGlvbmFyaWVzIG5vdyB0aGF0IGFsbCBjbGFzc2VzIGhhdmUgYmVlbiBkZWZpbmVkCisjCitnZXRiYXNlY2xhc3NlcyhhcHBsaWNhdGlvbikKKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2NhcHAnIDogYXBwbGljYXRpb24sCit9CisKKworY2xhc3MgRXhwbG9yZXIoU3RhbmRhcmRfU3VpdGVfRXZlbnRzLAorICAgICAgICBVUkxfU3VpdGVfRXZlbnRzLAorICAgICAgICBOZXRzY2FwZV9TdWl0ZV9FdmVudHMsCisgICAgICAgIE1pY3Jvc29mdF9JbnRlcm5ldF9FeHBsb3Jlcl9FdmVudHMsCisgICAgICAgIFdlYl9Ccm93c2VyX1N1aXRlX0V2ZW50cywKKyAgICAgICAgUmVxdWlyZWRfU3VpdGVfRXZlbnRzLAorICAgICAgICBhZXRvb2xzLlRhbGtUbyk6CisgICAgX3NpZ25hdHVyZSA9ICdNU0lFJworCisgICAgX21vZHVsZU5hbWUgPSAnRXhwbG9yZXInCisKKyAgICBfZWxlbWRpY3QgPSBhcHBsaWNhdGlvbi5fZWxlbWRpY3QKKyAgICBfcHJvcGRpY3QgPSBhcHBsaWNhdGlvbi5fcHJvcGRpY3QKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjU0MzgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0V4cGxvcmVyL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjU0MzgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9Db250YWluZXJzX2FuZF9mb2xkZXJzLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0NvbnRhaW5lcnNfYW5kX2ZvbGRlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5NWVmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9Db250YWluZXJzX2FuZF9mb2xkZXJzLnB5CkBAIC0wLDAgKzEsMjc5IEBACisiIiJTdWl0ZSBDb250YWluZXJzIGFuZCBmb2xkZXJzOiBDbGFzc2VzIHRoYXQgY2FuIGNvbnRhaW4gb3RoZXIgZmlsZSBzeXN0ZW0gaXRlbXMKK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL0ZpbmRlci5hcHAKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDAvMTQ0LCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAnZm5kcicKKworY2xhc3MgQ29udGFpbmVyc19hbmRfZm9sZGVyc19FdmVudHM6CisKKyAgICBwYXNzCisKKworY2xhc3MgZGlzayhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImRpc2sgLSBBIGRpc2sgIiIiCisgICAgd2FudCA9ICdjZGlzJworY2xhc3MgX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiPEluaGVyaXRhbmNlPiAtIGluaGVyaXRzIHNvbWUgb2YgaXRzIHByb3BlcnRpZXMgZnJvbSB0aGUgY29udGFpbmVyIGNsYXNzICIiIgorICAgIHdoaWNoID0gJ2NAI14nCisgICAgd2FudCA9ICdjdG5yJworY2xhc3MgX1Byb3BfY2FwYWNpdHkoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNhcGFjaXR5IC0gdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyAoZnJlZSBvciB1c2VkKSBvbiB0aGUgZGlzayAiIiIKKyAgICB3aGljaCA9ICdjYXBhJworICAgIHdhbnQgPSAnY29tcCcKK2NsYXNzIF9Qcm9wX2VqZWN0YWJsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZWplY3RhYmxlIC0gQ2FuIHRoZSBtZWRpYSBiZSBlamVjdGVkIChmbG9wcGllcywgQ0QncywgYW5kIHNvIG9uKT8gIiIiCisgICAgd2hpY2ggPSAnaXNlaicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9mb3JtYXQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZvcm1hdCAtIHRoZSBmaWxlc3lzdGVtIGZvcm1hdCBvZiB0aGlzIGRpc2sgIiIiCisgICAgd2hpY2ggPSAnZGZtdCcKKyAgICB3YW50ID0gJ2VkZm0nCitjbGFzcyBfUHJvcF9mcmVlX3NwYWNlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmcmVlIHNwYWNlIC0gdGhlIG51bWJlciBvZiBmcmVlIGJ5dGVzIGxlZnQgb24gdGhlIGRpc2sgIiIiCisgICAgd2hpY2ggPSAnZnJzcCcKKyAgICB3YW50ID0gJ2NvbXAnCitjbGFzcyBfUHJvcF9pZ25vcmVfcHJpdmlsZWdlcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaWdub3JlIHByaXZpbGVnZXMgLSBJZ25vcmUgcGVybWlzc2lvbnMgb24gdGhpcyBkaXNrPyAiIiIKKyAgICB3aGljaCA9ICdpZ3ByJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2xvY2FsX3ZvbHVtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibG9jYWwgdm9sdW1lIC0gSXMgdGhlIG1lZGlhIGEgbG9jYWwgdm9sdW1lIChhcyBvcHBvc2VkIHRvIGEgZmlsZSBzZXJ2ZXIpPyAiIiIKKyAgICB3aGljaCA9ICdpc3J2JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3N0YXJ0dXAoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInN0YXJ0dXAgLSBJcyB0aGlzIGRpc2sgdGhlIGJvb3QgZGlzaz8gIiIiCisgICAgd2hpY2ggPSAnaXN0ZCcKKyAgICB3YW50ID0gJ2Jvb2wnCisjICAgICAgICBlbGVtZW50ICdhbGlhJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdhcHBmJyBhcyBbJ2luZHgnLCAnbmFtZScsICdJRCAgJ10KKyMgICAgICAgIGVsZW1lbnQgJ2Nmb2wnIGFzIFsnaW5keCcsICduYW1lJywgJ0lEICAnXQorIyAgICAgICAgZWxlbWVudCAnY2xwZicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnY29iaicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnY3RucicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnZG9jZicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnZmlsZScgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnaW5sZicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAncGFjaycgYXMgWydpbmR4JywgJ25hbWUnXQorCitkaXNrcyA9IGRpc2sKKworY2xhc3MgZGVza3RvcF8yZF9vYmplY3QoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkZXNrdG9wLW9iamVjdCAtIERlc2t0b3Atb2JqZWN0IGlzIHRoZSBjbGFzcyBvZiB0aGUgXHhkMmRlc2t0b3BceGQzIG9iamVjdCAiIiIKKyAgICB3YW50ID0gJ2Nkc2snCisjICAgICAgICBlbGVtZW50ICdhbGlhJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdhcHBmJyBhcyBbJ2luZHgnLCAnbmFtZScsICdJRCAgJ10KKyMgICAgICAgIGVsZW1lbnQgJ2NkaXMnIGFzIFsnaW5keCcsICduYW1lJ10KKyMgICAgICAgIGVsZW1lbnQgJ2Nmb2wnIGFzIFsnaW5keCcsICduYW1lJywgJ0lEICAnXQorIyAgICAgICAgZWxlbWVudCAnY2xwZicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnY29iaicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnY3RucicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnZG9jZicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnZmlsZScgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnaW5sZicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAncGFjaycgYXMgWydpbmR4JywgJ25hbWUnXQorCitjbGFzcyBmb2xkZXIoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJmb2xkZXIgLSBBIGZvbGRlciAiIiIKKyAgICB3YW50ID0gJ2Nmb2wnCisjICAgICAgICBlbGVtZW50ICdhbGlhJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdhcHBmJyBhcyBbJ2luZHgnLCAnbmFtZScsICdJRCAgJ10KKyMgICAgICAgIGVsZW1lbnQgJ2Nmb2wnIGFzIFsnaW5keCcsICduYW1lJywgJ0lEICAnXQorIyAgICAgICAgZWxlbWVudCAnY2xwZicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnY29iaicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnY3RucicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnZG9jZicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnZmlsZScgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAnaW5sZicgYXMgWydpbmR4JywgJ25hbWUnXQorIyAgICAgICAgZWxlbWVudCAncGFjaycgYXMgWydpbmR4JywgJ25hbWUnXQorCitmb2xkZXJzID0gZm9sZGVyCisKK2NsYXNzIGNvbnRhaW5lcihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImNvbnRhaW5lciAtIEFuIGl0ZW0gdGhhdCBjb250YWlucyBvdGhlciBpdGVtcyAiIiIKKyAgICB3YW50ID0gJ2N0bnInCitjbGFzcyBfUHJvcF9jb21wbGV0ZWx5X2V4cGFuZGVkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjb21wbGV0ZWx5IGV4cGFuZGVkIC0gKE5PVCBBVkFJTEFCTEUgWUVUKSBBcmUgdGhlIGNvbnRhaW5lciBhbmQgYWxsIG9mIGl0cyBjaGlsZHJlbiBvcGVuZWQgYXMgb3V0bGluZXM/IChjYW4gb25seSBiZSBzZXQgZm9yIGNvbnRhaW5lcnMgdmlld2VkIGFzIGxpc3RzKSAiIiIKKyAgICB3aGljaCA9ICdwZXhjJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2NvbnRhaW5lcl93aW5kb3coYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNvbnRhaW5lciB3aW5kb3cgLSB0aGUgY29udGFpbmVyIHdpbmRvdyBmb3IgdGhpcyBmb2xkZXIgIiIiCisgICAgd2hpY2ggPSAnY3duZCcKKyAgICB3YW50ID0gJ29iaiAnCitjbGFzcyBfUHJvcF9lbnRpcmVfY29udGVudHMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImVudGlyZSBjb250ZW50cyAtIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lciwgaW5jbHVkaW5nIHRoZSBjb250ZW50cyBvZiBpdHMgY2hpbGRyZW4gIiIiCisgICAgd2hpY2ggPSAnZWN0cycKKyAgICB3YW50ID0gJ29iaiAnCitjbGFzcyBfUHJvcF9leHBhbmRhYmxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJleHBhbmRhYmxlIC0gKE5PVCBBVkFJTEFCTEUgWUVUKSBJcyB0aGUgY29udGFpbmVyIGNhcGFibGUgb2YgYmVpbmcgZXhwYW5kZWQgYXMgYW4gb3V0bGluZT8gIiIiCisgICAgd2hpY2ggPSAncGV4YScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9leHBhbmRlZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZXhwYW5kZWQgLSAoTk9UIEFWQUlMQUJMRSBZRVQpIElzIHRoZSBjb250YWluZXIgb3BlbmVkIGFzIGFuIG91dGxpbmU/IChjYW4gb25seSBiZSBzZXQgZm9yIGNvbnRhaW5lcnMgdmlld2VkIGFzIGxpc3RzKSAiIiIKKyAgICB3aGljaCA9ICdwZXhwJworICAgIHdhbnQgPSAnYm9vbCcKKyMgICAgICAgIGVsZW1lbnQgJ2FsaWEnIGFzIFsnaW5keCcsICduYW1lJ10KKyMgICAgICAgIGVsZW1lbnQgJ2FwcGYnIGFzIFsnaW5keCcsICduYW1lJywgJ0lEICAnXQorIyAgICAgICAgZWxlbWVudCAnY2ZvbCcgYXMgWydpbmR4JywgJ25hbWUnLCAnSUQgICddCisjICAgICAgICBlbGVtZW50ICdjbHBmJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdjb2JqJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdjdG5yJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdkb2NmJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdmaWxlJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdpbmxmJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdwYWNrJyBhcyBbJ2luZHgnLCAnbmFtZSddCisKK2NvbnRhaW5lcnMgPSBjb250YWluZXIKKworY2xhc3MgdHJhc2hfMmRfb2JqZWN0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidHJhc2gtb2JqZWN0IC0gVHJhc2gtb2JqZWN0IGlzIHRoZSBjbGFzcyBvZiB0aGUgXHhkMnRyYXNoXHhkMyBvYmplY3QgIiIiCisgICAgd2FudCA9ICdjdHJzJworY2xhc3MgX1Byb3Bfd2FybnNfYmVmb3JlX2VtcHR5aW5nKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ3YXJucyBiZWZvcmUgZW1wdHlpbmcgLSBEaXNwbGF5IGEgZGlhbG9nIHdoZW4gZW1wdHlpbmcgdGhlIHRyYXNoPyAiIiIKKyAgICB3aGljaCA9ICd3YXJuJworICAgIHdhbnQgPSAnYm9vbCcKKyMgICAgICAgIGVsZW1lbnQgJ2FsaWEnIGFzIFsnaW5keCcsICduYW1lJ10KKyMgICAgICAgIGVsZW1lbnQgJ2FwcGYnIGFzIFsnaW5keCcsICduYW1lJywgJ0lEICAnXQorIyAgICAgICAgZWxlbWVudCAnY2ZvbCcgYXMgWydpbmR4JywgJ25hbWUnLCAnSUQgICddCisjICAgICAgICBlbGVtZW50ICdjbHBmJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdjb2JqJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdjdG5yJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdkb2NmJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdmaWxlJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdpbmxmJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdwYWNrJyBhcyBbJ2luZHgnLCAnbmFtZSddCitkaXNrLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2NvbnRhaW5lciddCitpbXBvcnQgRmlsZXMKK2ltcG9ydCBGaW5kZXJfaXRlbXMKK2Rpc2suX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdjYXBhY2l0eScgOiBfUHJvcF9jYXBhY2l0eSwKKyAgICAnZWplY3RhYmxlJyA6IF9Qcm9wX2VqZWN0YWJsZSwKKyAgICAnZm9ybWF0JyA6IF9Qcm9wX2Zvcm1hdCwKKyAgICAnZnJlZV9zcGFjZScgOiBfUHJvcF9mcmVlX3NwYWNlLAorICAgICdpZ25vcmVfcHJpdmlsZWdlcycgOiBfUHJvcF9pZ25vcmVfcHJpdmlsZWdlcywKKyAgICAnbG9jYWxfdm9sdW1lJyA6IF9Qcm9wX2xvY2FsX3ZvbHVtZSwKKyAgICAnc3RhcnR1cCcgOiBfUHJvcF9zdGFydHVwLAorfQorZGlzay5fcHJpdmVsZW1kaWN0ID0geworICAgICdhbGlhc19maWxlJyA6IEZpbGVzLmFsaWFzX2ZpbGUsCisgICAgJ2FwcGxpY2F0aW9uX2ZpbGUnIDogRmlsZXMuYXBwbGljYXRpb25fZmlsZSwKKyAgICAnY2xpcHBpbmcnIDogRmlsZXMuY2xpcHBpbmcsCisgICAgJ2NvbnRhaW5lcicgOiBjb250YWluZXIsCisgICAgJ2RvY3VtZW50X2ZpbGUnIDogRmlsZXMuZG9jdW1lbnRfZmlsZSwKKyAgICAnZmlsZScgOiBGaWxlcy5maWxlLAorICAgICdmb2xkZXInIDogZm9sZGVyLAorICAgICdpbnRlcm5ldF9sb2NhdGlvbl9maWxlJyA6IEZpbGVzLmludGVybmV0X2xvY2F0aW9uX2ZpbGUsCisgICAgJ2l0ZW0nIDogRmluZGVyX2l0ZW1zLml0ZW0sCisgICAgJ3BhY2thZ2UnIDogRmlsZXMucGFja2FnZSwKK30KK2Rlc2t0b3BfMmRfb2JqZWN0Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ2NvbnRhaW5lciddCitkZXNrdG9wXzJkX29iamVjdC5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCit9CitkZXNrdG9wXzJkX29iamVjdC5fcHJpdmVsZW1kaWN0ID0geworICAgICdhbGlhc19maWxlJyA6IEZpbGVzLmFsaWFzX2ZpbGUsCisgICAgJ2FwcGxpY2F0aW9uX2ZpbGUnIDogRmlsZXMuYXBwbGljYXRpb25fZmlsZSwKKyAgICAnY2xpcHBpbmcnIDogRmlsZXMuY2xpcHBpbmcsCisgICAgJ2NvbnRhaW5lcicgOiBjb250YWluZXIsCisgICAgJ2Rpc2snIDogZGlzaywKKyAgICAnZG9jdW1lbnRfZmlsZScgOiBGaWxlcy5kb2N1bWVudF9maWxlLAorICAgICdmaWxlJyA6IEZpbGVzLmZpbGUsCisgICAgJ2ZvbGRlcicgOiBmb2xkZXIsCisgICAgJ2ludGVybmV0X2xvY2F0aW9uX2ZpbGUnIDogRmlsZXMuaW50ZXJuZXRfbG9jYXRpb25fZmlsZSwKKyAgICAnaXRlbScgOiBGaW5kZXJfaXRlbXMuaXRlbSwKKyAgICAncGFja2FnZScgOiBGaWxlcy5wYWNrYWdlLAorfQorZm9sZGVyLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2NvbnRhaW5lciddCitmb2xkZXIuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorfQorZm9sZGVyLl9wcml2ZWxlbWRpY3QgPSB7CisgICAgJ2FsaWFzX2ZpbGUnIDogRmlsZXMuYWxpYXNfZmlsZSwKKyAgICAnYXBwbGljYXRpb25fZmlsZScgOiBGaWxlcy5hcHBsaWNhdGlvbl9maWxlLAorICAgICdjbGlwcGluZycgOiBGaWxlcy5jbGlwcGluZywKKyAgICAnY29udGFpbmVyJyA6IGNvbnRhaW5lciwKKyAgICAnZG9jdW1lbnRfZmlsZScgOiBGaWxlcy5kb2N1bWVudF9maWxlLAorICAgICdmaWxlJyA6IEZpbGVzLmZpbGUsCisgICAgJ2ZvbGRlcicgOiBmb2xkZXIsCisgICAgJ2ludGVybmV0X2xvY2F0aW9uX2ZpbGUnIDogRmlsZXMuaW50ZXJuZXRfbG9jYXRpb25fZmlsZSwKKyAgICAnaXRlbScgOiBGaW5kZXJfaXRlbXMuaXRlbSwKKyAgICAncGFja2FnZScgOiBGaWxlcy5wYWNrYWdlLAorfQorY29udGFpbmVyLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2l0ZW0nXQorY29udGFpbmVyLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnY29tcGxldGVseV9leHBhbmRlZCcgOiBfUHJvcF9jb21wbGV0ZWx5X2V4cGFuZGVkLAorICAgICdjb250YWluZXJfd2luZG93JyA6IF9Qcm9wX2NvbnRhaW5lcl93aW5kb3csCisgICAgJ2VudGlyZV9jb250ZW50cycgOiBfUHJvcF9lbnRpcmVfY29udGVudHMsCisgICAgJ2V4cGFuZGFibGUnIDogX1Byb3BfZXhwYW5kYWJsZSwKKyAgICAnZXhwYW5kZWQnIDogX1Byb3BfZXhwYW5kZWQsCit9Citjb250YWluZXIuX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnYWxpYXNfZmlsZScgOiBGaWxlcy5hbGlhc19maWxlLAorICAgICdhcHBsaWNhdGlvbl9maWxlJyA6IEZpbGVzLmFwcGxpY2F0aW9uX2ZpbGUsCisgICAgJ2NsaXBwaW5nJyA6IEZpbGVzLmNsaXBwaW5nLAorICAgICdjb250YWluZXInIDogY29udGFpbmVyLAorICAgICdkb2N1bWVudF9maWxlJyA6IEZpbGVzLmRvY3VtZW50X2ZpbGUsCisgICAgJ2ZpbGUnIDogRmlsZXMuZmlsZSwKKyAgICAnZm9sZGVyJyA6IGZvbGRlciwKKyAgICAnaW50ZXJuZXRfbG9jYXRpb25fZmlsZScgOiBGaWxlcy5pbnRlcm5ldF9sb2NhdGlvbl9maWxlLAorICAgICdpdGVtJyA6IEZpbmRlcl9pdGVtcy5pdGVtLAorICAgICdwYWNrYWdlJyA6IEZpbGVzLnBhY2thZ2UsCit9Cit0cmFzaF8yZF9vYmplY3QuX3N1cGVyY2xhc3NuYW1lcyA9IFsnY29udGFpbmVyJ10KK3RyYXNoXzJkX29iamVjdC5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ3dhcm5zX2JlZm9yZV9lbXB0eWluZycgOiBfUHJvcF93YXJuc19iZWZvcmVfZW1wdHlpbmcsCit9Cit0cmFzaF8yZF9vYmplY3QuX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnYWxpYXNfZmlsZScgOiBGaWxlcy5hbGlhc19maWxlLAorICAgICdhcHBsaWNhdGlvbl9maWxlJyA6IEZpbGVzLmFwcGxpY2F0aW9uX2ZpbGUsCisgICAgJ2NsaXBwaW5nJyA6IEZpbGVzLmNsaXBwaW5nLAorICAgICdjb250YWluZXInIDogY29udGFpbmVyLAorICAgICdkb2N1bWVudF9maWxlJyA6IEZpbGVzLmRvY3VtZW50X2ZpbGUsCisgICAgJ2ZpbGUnIDogRmlsZXMuZmlsZSwKKyAgICAnZm9sZGVyJyA6IGZvbGRlciwKKyAgICAnaW50ZXJuZXRfbG9jYXRpb25fZmlsZScgOiBGaWxlcy5pbnRlcm5ldF9sb2NhdGlvbl9maWxlLAorICAgICdpdGVtJyA6IEZpbmRlcl9pdGVtcy5pdGVtLAorICAgICdwYWNrYWdlJyA6IEZpbGVzLnBhY2thZ2UsCit9CisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdjZGlzJyA6IGRpc2ssCisgICAgJ2Nkc2snIDogZGVza3RvcF8yZF9vYmplY3QsCisgICAgJ2Nmb2wnIDogZm9sZGVyLAorICAgICdjdG5yJyA6IGNvbnRhaW5lciwKKyAgICAnY3RycycgOiB0cmFzaF8yZF9vYmplY3QsCit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworICAgICdjQCNeJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2NhcGEnIDogX1Byb3BfY2FwYWNpdHksCisgICAgJ2N3bmQnIDogX1Byb3BfY29udGFpbmVyX3dpbmRvdywKKyAgICAnZGZtdCcgOiBfUHJvcF9mb3JtYXQsCisgICAgJ2VjdHMnIDogX1Byb3BfZW50aXJlX2NvbnRlbnRzLAorICAgICdmcnNwJyA6IF9Qcm9wX2ZyZWVfc3BhY2UsCisgICAgJ2lncHInIDogX1Byb3BfaWdub3JlX3ByaXZpbGVnZXMsCisgICAgJ2lzZWonIDogX1Byb3BfZWplY3RhYmxlLAorICAgICdpc3J2JyA6IF9Qcm9wX2xvY2FsX3ZvbHVtZSwKKyAgICAnaXN0ZCcgOiBfUHJvcF9zdGFydHVwLAorICAgICdwZXhhJyA6IF9Qcm9wX2V4cGFuZGFibGUsCisgICAgJ3BleGMnIDogX1Byb3BfY29tcGxldGVseV9leHBhbmRlZCwKKyAgICAncGV4cCcgOiBfUHJvcF9leHBhbmRlZCwKKyAgICAnd2FybicgOiBfUHJvcF93YXJuc19iZWZvcmVfZW1wdHlpbmcsCit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9Db250YWluZXJzX2FuZF9mb2xkZXJzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9Db250YWluZXJzX2FuZF9mb2xkZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YxZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0NvbnRhaW5lcnNfYW5kX2ZvbGRlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9Db250YWluZXJzX2FuZF9mb2xkZXJzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9Db250YWluZXJzX2FuZF9mb2xkZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YxZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0NvbnRhaW5lcnNfYW5kX2ZvbGRlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9FbnVtZXJhdGlvbnMucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRW51bWVyYXRpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1OGQ3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRW51bWVyYXRpb25zLnB5CkBAIC0wLDAgKzEsMTQ1IEBACisiIiJTdWl0ZSBFbnVtZXJhdGlvbnM6IEVudW1lcmF0aW9ucyBmb3IgdGhlIEZpbmRlcgorTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvRmluZGVyLmFwcAorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMC8xNDQsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICd0cG5tJworCitmcm9tIFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlIGltcG9ydCAqCitjbGFzcyBFbnVtZXJhdGlvbnNfRXZlbnRzKFR5cGVfTmFtZXNfU3VpdGVfRXZlbnRzKToKKworICAgIHBhc3MKKworX0VudW1fZWFyciA9IHsKKyAgICAnbm90X2FycmFuZ2VkJyA6ICduYXJyJywgICAgIworICAgICdzbmFwX3RvX2dyaWQnIDogJ2dyZGEnLCAgICAjCisgICAgJ2FycmFuZ2VkX2J5X25hbWUnIDogJ25hbWEnLCAgICAgICAgIworICAgICdhcnJhbmdlZF9ieV9tb2RpZmljYXRpb25fZGF0ZScgOiAnbWR0YScsICAgIworICAgICdhcnJhbmdlZF9ieV9jcmVhdGlvbl9kYXRlJyA6ICdjZHRhJywgICAgICAgIworICAgICdhcnJhbmdlZF9ieV9zaXplJyA6ICdzaXphJywgICAgICAgICMKKyAgICAnYXJyYW5nZWRfYnlfa2luZCcgOiAna2luYScsICAgICAgICAjCisgICAgJ2FycmFuZ2VkX2J5X2xhYmVsJyA6ICdsYWJhJywgICAgICAgIworfQorCitfRW51bV9lY3Z3ID0geworICAgICdpY29uX3ZpZXcnIDogJ2ljbnYnLCAgICAgICAjCisgICAgJ2xpc3RfdmlldycgOiAnbHN2dycsICAgICAgICMKKyAgICAnY29sdW1uX3ZpZXcnIDogJ2NsdncnLCAgICAgIworfQorCitfRW51bV9lZGZtID0geworICAgICdNYWNfT1NfZm9ybWF0JyA6ICdkZmhmJywgICAjCisgICAgJ01hY19PU19FeHRlbmRlZF9mb3JtYXQnIDogJ2RmaCsnLCAgIworICAgICdVRlNfZm9ybWF0JyA6ICdkZnVmJywgICAgICAjCisgICAgJ05GU19mb3JtYXQnIDogJ2RmbmYnLCAgICAgICMKKyAgICAnYXVkaW9fZm9ybWF0JyA6ICdkZmF1JywgICAgIworICAgICdQcm9ET1NfZm9ybWF0JyA6ICdkZnByJywgICAjCisgICAgJ01TXzJkX0RPU19mb3JtYXQnIDogJ2RmbXMnLCAgICAgICAgIworICAgICdJU09fOTY2MF9mb3JtYXQnIDogJ2RmOTYnLCAjCisgICAgJ0hpZ2hfU2llcnJhX2Zvcm1hdCcgOiAnZGZocycsICAgICAgIworICAgICdRdWlja1Rha2VfZm9ybWF0JyA6ICdkZnF0JywgICAgICAgICMKKyAgICAnQXBwbGVfUGhvdG9fZm9ybWF0JyA6ICdkZnBoJywgICAgICAjCisgICAgJ0FwcGxlU2hhcmVfZm9ybWF0JyA6ICdkZmFzJywgICAgICAgIworICAgICdVREZfZm9ybWF0JyA6ICdkZnVkJywgICAgICAjCisgICAgJ1dlYkRBVl9mb3JtYXQnIDogJ2Rmd2QnLCAgICMKKyAgICAnRlRQX2Zvcm1hdCcgOiAnZGZmdCcsICAgICAgIworICAgICdQYWNrZXRfMmRfd3JpdHRlbl9VREZfZm9ybWF0JyA6ICdkZnB1JywgICAgIworICAgICd1bmtub3duX2Zvcm1hdCcgOiAnZGY/PycsICAjCit9CisKK19FbnVtX2Vsc3YgPSB7CisgICAgJ25hbWVfY29sdW1uJyA6ICdlbHNuJywgICAgICMKKyAgICAnbW9kaWZpY2F0aW9uX2RhdGVfY29sdW1uJyA6ICdlbHNtJywgICAgICAgICMKKyAgICAnY3JlYXRpb25fZGF0ZV9jb2x1bW4nIDogJ2Vsc2MnLCAgICAjCisgICAgJ3NpemVfY29sdW1uJyA6ICdlbHNzJywgICAgICMKKyAgICAna2luZF9jb2x1bW4nIDogJ2Vsc2snLCAgICAgIworICAgICdsYWJlbF9jb2x1bW4nIDogJ2Vsc2wnLCAgICAjCisgICAgJ3ZlcnNpb25fY29sdW1uJyA6ICdlbHN2JywgICMKKyAgICAnY29tbWVudF9jb2x1bW4nIDogJ2Vsc0MnLCAgIworfQorCitfRW51bV9pcG5sID0geworICAgICdHZW5lcmFsX0luZm9ybWF0aW9uX3BhbmVsJyA6ICdncG5sJywgICAgICAgIworICAgICdTaGFyaW5nX3BhbmVsJyA6ICdzcG5sJywgICAjCisgICAgJ01lbW9yeV9wYW5lbCcgOiAnbXBubCcsICAgICMKKyAgICAnUHJldmlld19wYW5lbCcgOiAndnBubCcsICAgIworICAgICdBcHBsaWNhdGlvbl9wYW5lbCcgOiAnYXBubCcsICAgICAgICMKKyAgICAnTGFuZ3VhZ2VzX3BhbmVsJyA6ICdwa2xnJywgIworICAgICdQbHVnaW5zX3BhbmVsJyA6ICdwa3BnJywgICAjCisgICAgJ05hbWVfXzI2X19FeHRlbnNpb25fcGFuZWwnIDogJ25wbmwnLCAgICAgICAjCisgICAgJ0NvbW1lbnRzX3BhbmVsJyA6ICdjcG5sJywgICMKKyAgICAnQ29udGVudF9JbmRleF9wYW5lbCcgOiAnY2lubCcsICAgICAjCit9CisKK19FbnVtX2lzaXogPSB7CisgICAgJ21pbmknIDogJ21paWMnLCAgICAjCisgICAgJ3NtYWxsJyA6ICdzbWljJywgICAjCisgICAgJ2xhcmdlJyA6ICdsZ2ljJywgICAjCit9CisKK19FbnVtX2x2aWMgPSB7CisgICAgJ3NtYWxsX2ljb24nIDogJ3NtaWMnLCAgICAgICMKKyAgICAnbGFyZ2VfaWNvbicgOiAnbGdpYycsICAgICAgIworfQorCitfRW51bV9wcml2ID0geworICAgICdyZWFkX29ubHknIDogJ3JlYWQnLCAgICAgICAjCisgICAgJ3JlYWRfd3JpdGUnIDogJ3Jkd3InLCAgICAgICMKKyAgICAnd3JpdGVfb25seScgOiAnd3JpdCcsICAgICAgIworICAgICdub25lJyA6ICdub25lJywgICAgIworfQorCitfRW51bV9zb2RyID0geworICAgICdub3JtYWwnIDogJ3Nucm0nLCAgIworICAgICdyZXZlcnNlZCcgOiAnc3J2cycsICAgICAgICAjCit9CisKK19FbnVtX3Z3YnkgPSB7CisgICAgJ2NvbmZsaWN0cycgOiAnY2ZsYycsICAgICAgICMKKyAgICAnZXhpc3RpbmdfaXRlbXMnIDogJ2V4c2knLCAgIworICAgICdzbWFsbF9pY29uJyA6ICdzbWljJywgICAgICAjCisgICAgJ2ljb24nIDogJ2lpbWcnLCAgICAjCisgICAgJ25hbWUnIDogJ3BuYW0nLCAgICAjCisgICAgJ21vZGlmaWNhdGlvbl9kYXRlJyA6ICdhc21vJywgICAgICAgIworICAgICdzaXplJyA6ICdwdHN6JywgICAgIworICAgICdraW5kJyA6ICdraW5kJywgICAgIworICAgICdjb21tZW50JyA6ICdjb210JywgIworICAgICdsYWJlbCcgOiAnbGFiaScsICAgIworICAgICd2ZXJzaW9uJyA6ICd2ZXJzJywgIworICAgICdjcmVhdGlvbl9kYXRlJyA6ICdhc2NkJywgICAjCisgICAgJ3NtYWxsX2J1dHRvbicgOiAnc21idScsICAgICMKKyAgICAnbGFyZ2VfYnV0dG9uJyA6ICdsZ2J1JywgICAgIworICAgICdncmlkJyA6ICdncmlkJywgICAgIworICAgICdhbGwnIDogJ2t5YWwnLCAgICAgIworfQorCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworICAgICdlYXJyJyA6IF9FbnVtX2VhcnIsCisgICAgJ2VjdncnIDogX0VudW1fZWN2dywKKyAgICAnZWRmbScgOiBfRW51bV9lZGZtLAorICAgICdlbHN2JyA6IF9FbnVtX2Vsc3YsCisgICAgJ2lwbmwnIDogX0VudW1faXBubCwKKyAgICAnaXNpeicgOiBfRW51bV9pc2l6LAorICAgICdsdmljJyA6IF9FbnVtX2x2aWMsCisgICAgJ3ByaXYnIDogX0VudW1fcHJpdiwKKyAgICAnc29kcicgOiBfRW51bV9zb2RyLAorICAgICd2d2J5JyA6IF9FbnVtX3Z3YnksCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRW51bWVyYXRpb25zLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9FbnVtZXJhdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNWQ4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRW51bWVyYXRpb25zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRW51bWVyYXRpb25zLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9FbnVtZXJhdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNWQ4ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRW51bWVyYXRpb25zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRmlsZXMucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRmlsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRiZTFiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9GaWxlcy5weQpAQCAtMCwwICsxLDIxMiBAQAorIiIiU3VpdGUgRmlsZXM6IENsYXNzZXMgcmVwcmVzZW50aW5nIGZpbGVzCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9GaW5kZXIuYXBwCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAwLzE0NCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ2ZuZHInCisKK2NsYXNzIEZpbGVzX0V2ZW50czoKKworICAgIHBhc3MKKworCitjbGFzcyBhbGlhc19maWxlKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYWxpYXMgZmlsZSAtIEFuIGFsaWFzIGZpbGUgKGNyZWF0ZWQgd2l0aCBceGQyTWFrZSBBbGlhc1x4ZDMpICIiIgorICAgIHdhbnQgPSAnYWxpYScKK2NsYXNzIF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIjxJbmhlcml0YW5jZT4gLSBpbmhlcml0cyBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzIGZyb20gdGhlIGZpbGUgY2xhc3MgIiIiCisgICAgd2hpY2ggPSAnY0AjXicKKyAgICB3YW50ID0gJ2ZpbGUnCitjbGFzcyBfUHJvcF9vcmlnaW5hbF9pdGVtKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJvcmlnaW5hbCBpdGVtIC0gdGhlIG9yaWdpbmFsIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUgYWxpYXMgIiIiCisgICAgd2hpY2ggPSAnb3JpZycKKyAgICB3YW50ID0gJ29iaiAnCisKK2FsaWFzX2ZpbGVzID0gYWxpYXNfZmlsZQorCitjbGFzcyBhcHBsaWNhdGlvbl9maWxlKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYXBwbGljYXRpb24gZmlsZSAtIEFuIGFwcGxpY2F0aW9uJ3MgZmlsZSBvbiBkaXNrICIiIgorICAgIHdhbnQgPSAnYXBwZicKK2NsYXNzIF9Qcm9wX2FjY2VwdHNfaGlnaF9sZXZlbF9ldmVudHMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImFjY2VwdHMgaGlnaCBsZXZlbCBldmVudHMgLSBJcyB0aGUgYXBwbGljYXRpb24gaGlnaC1sZXZlbCBldmVudCBhd2FyZT8gKE9CU09MRVRFOiBhbHdheXMgcmV0dXJucyB0cnVlKSAiIiIKKyAgICB3aGljaCA9ICdpc2FiJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2hhc19zY3JpcHRpbmdfdGVybWlub2xvZ3koYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImhhcyBzY3JpcHRpbmcgdGVybWlub2xvZ3kgLSBEb2VzIHRoZSBwcm9jZXNzIGhhdmUgYSBzY3JpcHRpbmcgdGVybWlub2xvZ3ksIGkuZS4sIGNhbiBpdCBiZSBzY3JpcHRlZD8gIiIiCisgICAgd2hpY2ggPSAnaHNjcicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9taW5pbXVtX3NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm1pbmltdW0gc2l6ZSAtIHRoZSBzbWFsbGVzdCBtZW1vcnkgc2l6ZSB3aXRoIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBjYW4gYmUgbGF1bmNoZWQgIiIiCisgICAgd2hpY2ggPSAnbXBydCcKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF9vcGVuc19pbl9DbGFzc2ljKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJvcGVucyBpbiBDbGFzc2ljIC0gU2hvdWxkIHRoZSBhcHBsaWNhdGlvbiBsYXVuY2ggaW4gdGhlIENsYXNzaWMgZW52aXJvbm1lbnQ/ICIiIgorICAgIHdoaWNoID0gJ0Nsc2MnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfcHJlZmVycmVkX3NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInByZWZlcnJlZCBzaXplIC0gdGhlIG1lbW9yeSBzaXplIHdpdGggd2hpY2ggdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgbGF1bmNoZWQgIiIiCisgICAgd2hpY2ggPSAnYXBwdCcKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF9zdWdnZXN0ZWRfc2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic3VnZ2VzdGVkIHNpemUgLSB0aGUgbWVtb3J5IHNpemUgd2l0aCB3aGljaCB0aGUgZGV2ZWxvcGVyIHJlY29tbWVuZHMgdGhlIGFwcGxpY2F0aW9uIGJlIGxhdW5jaGVkICIiIgorICAgIHdoaWNoID0gJ3NwcnQnCisgICAgd2FudCA9ICdsb25nJworCithcHBsaWNhdGlvbl9maWxlcyA9IGFwcGxpY2F0aW9uX2ZpbGUKKworY2xhc3MgY2xpcHBpbmcoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJjbGlwcGluZyAtIEEgY2xpcHBpbmcgIiIiCisgICAgd2FudCA9ICdjbHBmJworY2xhc3MgX1Byb3BfY2xpcHBpbmdfd2luZG93KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjbGlwcGluZyB3aW5kb3cgLSAoTk9UIEFWQUlMQUJMRSBZRVQpIHRoZSBjbGlwcGluZyB3aW5kb3cgZm9yIHRoaXMgY2xpcHBpbmcgIiIiCisgICAgd2hpY2ggPSAnbHduZCcKKyAgICB3YW50ID0gJ29iaiAnCisKK2NsaXBwaW5ncyA9IGNsaXBwaW5nCisKK2NsYXNzIGRvY3VtZW50X2ZpbGUoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkb2N1bWVudCBmaWxlIC0gQSBkb2N1bWVudCBmaWxlICIiIgorICAgIHdhbnQgPSAnZG9jZicKKworZG9jdW1lbnRfZmlsZXMgPSBkb2N1bWVudF9maWxlCisKK2NsYXNzIGZpbGUoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJmaWxlIC0gQSBmaWxlICIiIgorICAgIHdhbnQgPSAnZmlsZScKK2NsYXNzIF9Qcm9wX2NyZWF0b3JfdHlwZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY3JlYXRvciB0eXBlIC0gdGhlIE9TVHlwZSBpZGVudGlmeWluZyB0aGUgYXBwbGljYXRpb24gdGhhdCBjcmVhdGVkIHRoZSBpdGVtICIiIgorICAgIHdoaWNoID0gJ2ZjcnQnCisgICAgd2FudCA9ICd0eXBlJworY2xhc3MgX1Byb3BfZmlsZV90eXBlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmaWxlIHR5cGUgLSB0aGUgT1NUeXBlIGlkZW50aWZ5aW5nIHRoZSB0eXBlIG9mIGRhdGEgY29udGFpbmVkIGluIHRoZSBpdGVtICIiIgorICAgIHdoaWNoID0gJ2FzdHknCisgICAgd2FudCA9ICd0eXBlJworY2xhc3MgX1Byb3BfcHJvZHVjdF92ZXJzaW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwcm9kdWN0IHZlcnNpb24gLSB0aGUgdmVyc2lvbiBvZiB0aGUgcHJvZHVjdCAodmlzaWJsZSBhdCB0aGUgdG9wIG9mIHRoZSBceGQyR2V0IEluZm9ceGQzIHdpbmRvdykgIiIiCisgICAgd2hpY2ggPSAndmVyMicKKyAgICB3YW50ID0gJ3V0eHQnCitjbGFzcyBfUHJvcF9zdGF0aW9uZXJ5KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzdGF0aW9uZXJ5IC0gSXMgdGhlIGZpbGUgYSBzdGF0aW9uZXJ5IHBhZD8gIiIiCisgICAgd2hpY2ggPSAncHNwZCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF92ZXJzaW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ2ZXJzaW9uIC0gdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKHZpc2libGUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgXHhkMkdldCBJbmZvXHhkMyB3aW5kb3cpICIiIgorICAgIHdoaWNoID0gJ3ZlcnMnCisgICAgd2FudCA9ICd1dHh0JworCitmaWxlcyA9IGZpbGUKKworY2xhc3MgaW50ZXJuZXRfbG9jYXRpb25fZmlsZShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImludGVybmV0IGxvY2F0aW9uIGZpbGUgLSBBbiBmaWxlIGNvbnRhaW5pbmcgYW4gaW50ZXJuZXQgbG9jYXRpb24gIiIiCisgICAgd2FudCA9ICdpbmxmJworY2xhc3MgX1Byb3BfbG9jYXRpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImxvY2F0aW9uIC0gdGhlIGludGVybmV0IGxvY2F0aW9uICIiIgorICAgIHdoaWNoID0gJ2lsb2MnCisgICAgd2FudCA9ICd1dHh0JworCitpbnRlcm5ldF9sb2NhdGlvbl9maWxlcyA9IGludGVybmV0X2xvY2F0aW9uX2ZpbGUKKworY2xhc3MgcGFja2FnZShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInBhY2thZ2UgLSBBIHBhY2thZ2UgIiIiCisgICAgd2FudCA9ICdwYWNrJworCitwYWNrYWdlcyA9IHBhY2thZ2UKK2FsaWFzX2ZpbGUuX3N1cGVyY2xhc3NuYW1lcyA9IFsnZmlsZSddCithbGlhc19maWxlLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnb3JpZ2luYWxfaXRlbScgOiBfUHJvcF9vcmlnaW5hbF9pdGVtLAorfQorYWxpYXNfZmlsZS5fcHJpdmVsZW1kaWN0ID0geworfQorYXBwbGljYXRpb25fZmlsZS5fc3VwZXJjbGFzc25hbWVzID0gWydmaWxlJ10KK2FwcGxpY2F0aW9uX2ZpbGUuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdhY2NlcHRzX2hpZ2hfbGV2ZWxfZXZlbnRzJyA6IF9Qcm9wX2FjY2VwdHNfaGlnaF9sZXZlbF9ldmVudHMsCisgICAgJ2hhc19zY3JpcHRpbmdfdGVybWlub2xvZ3knIDogX1Byb3BfaGFzX3NjcmlwdGluZ190ZXJtaW5vbG9neSwKKyAgICAnbWluaW11bV9zaXplJyA6IF9Qcm9wX21pbmltdW1fc2l6ZSwKKyAgICAnb3BlbnNfaW5fQ2xhc3NpYycgOiBfUHJvcF9vcGVuc19pbl9DbGFzc2ljLAorICAgICdwcmVmZXJyZWRfc2l6ZScgOiBfUHJvcF9wcmVmZXJyZWRfc2l6ZSwKKyAgICAnc3VnZ2VzdGVkX3NpemUnIDogX1Byb3Bfc3VnZ2VzdGVkX3NpemUsCit9CithcHBsaWNhdGlvbl9maWxlLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitjbGlwcGluZy5fc3VwZXJjbGFzc25hbWVzID0gWydmaWxlJ10KK2NsaXBwaW5nLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnY2xpcHBpbmdfd2luZG93JyA6IF9Qcm9wX2NsaXBwaW5nX3dpbmRvdywKK30KK2NsaXBwaW5nLl9wcml2ZWxlbWRpY3QgPSB7Cit9Citkb2N1bWVudF9maWxlLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2ZpbGUnXQorZG9jdW1lbnRfZmlsZS5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCit9Citkb2N1bWVudF9maWxlLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitpbXBvcnQgRmluZGVyX2l0ZW1zCitmaWxlLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2l0ZW0nXQorZmlsZS5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2NyZWF0b3JfdHlwZScgOiBfUHJvcF9jcmVhdG9yX3R5cGUsCisgICAgJ2ZpbGVfdHlwZScgOiBfUHJvcF9maWxlX3R5cGUsCisgICAgJ3Byb2R1Y3RfdmVyc2lvbicgOiBfUHJvcF9wcm9kdWN0X3ZlcnNpb24sCisgICAgJ3N0YXRpb25lcnknIDogX1Byb3Bfc3RhdGlvbmVyeSwKKyAgICAndmVyc2lvbicgOiBfUHJvcF92ZXJzaW9uLAorfQorZmlsZS5fcHJpdmVsZW1kaWN0ID0geworfQoraW50ZXJuZXRfbG9jYXRpb25fZmlsZS5fc3VwZXJjbGFzc25hbWVzID0gWydmaWxlJ10KK2ludGVybmV0X2xvY2F0aW9uX2ZpbGUuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdsb2NhdGlvbicgOiBfUHJvcF9sb2NhdGlvbiwKK30KK2ludGVybmV0X2xvY2F0aW9uX2ZpbGUuX3ByaXZlbGVtZGljdCA9IHsKK30KK3BhY2thZ2UuX3N1cGVyY2xhc3NuYW1lcyA9IFsnaXRlbSddCitwYWNrYWdlLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKK30KK3BhY2thZ2UuX3ByaXZlbGVtZGljdCA9IHsKK30KKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2FsaWEnIDogYWxpYXNfZmlsZSwKKyAgICAnYXBwZicgOiBhcHBsaWNhdGlvbl9maWxlLAorICAgICdjbHBmJyA6IGNsaXBwaW5nLAorICAgICdkb2NmJyA6IGRvY3VtZW50X2ZpbGUsCisgICAgJ2ZpbGUnIDogZmlsZSwKKyAgICAnaW5sZicgOiBpbnRlcm5ldF9sb2NhdGlvbl9maWxlLAorICAgICdwYWNrJyA6IHBhY2thZ2UsCit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworICAgICdDbHNjJyA6IF9Qcm9wX29wZW5zX2luX0NsYXNzaWMsCisgICAgJ2FwcHQnIDogX1Byb3BfcHJlZmVycmVkX3NpemUsCisgICAgJ2FzdHknIDogX1Byb3BfZmlsZV90eXBlLAorICAgICdjQCNeJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2ZjcnQnIDogX1Byb3BfY3JlYXRvcl90eXBlLAorICAgICdoc2NyJyA6IF9Qcm9wX2hhc19zY3JpcHRpbmdfdGVybWlub2xvZ3ksCisgICAgJ2lsb2MnIDogX1Byb3BfbG9jYXRpb24sCisgICAgJ2lzYWInIDogX1Byb3BfYWNjZXB0c19oaWdoX2xldmVsX2V2ZW50cywKKyAgICAnbHduZCcgOiBfUHJvcF9jbGlwcGluZ193aW5kb3csCisgICAgJ21wcnQnIDogX1Byb3BfbWluaW11bV9zaXplLAorICAgICdvcmlnJyA6IF9Qcm9wX29yaWdpbmFsX2l0ZW0sCisgICAgJ3BzcGQnIDogX1Byb3Bfc3RhdGlvbmVyeSwKKyAgICAnc3BydCcgOiBfUHJvcF9zdWdnZXN0ZWRfc2l6ZSwKKyAgICAndmVyMicgOiBfUHJvcF9wcm9kdWN0X3ZlcnNpb24sCisgICAgJ3ZlcnMnIDogX1Byb3BfdmVyc2lvbiwKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbGVzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9GaWxlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkOWVjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9GaWxlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbGVzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9GaWxlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkOWVjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9GaWxlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbmRlcl9CYXNpY3MucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRmluZGVyX0Jhc2ljcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTM5MjhjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbmRlcl9CYXNpY3MucHkKQEAgLTAsMCArMSwyMDcgQEAKKyIiIlN1aXRlIEZpbmRlciBCYXNpY3M6IENvbW1vbmx5LXVzZWQgRmluZGVyIGNvbW1hbmRzIGFuZCBvYmplY3QgY2xhc3NlcworTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvRmluZGVyLmFwcAorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMC8xNDQsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdmbmRyJworCitjbGFzcyBGaW5kZXJfQmFzaWNzX0V2ZW50czoKKworICAgIGRlZiBjb3B5KHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImNvcHk6IChOT1QgQVZBSUxBQkxFIFlFVCkgQ29weSB0aGUgc2VsZWN0ZWQgaXRlbXMgdG8gdGhlIGNsaXBib2FyZCAodGhlIEZpbmRlciBtdXN0IGJlIHRoZSBmcm9udCBhcHBsaWNhdGlvbikKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnbWlzYycKKyAgICAgICAgX3N1YmNvZGUgPSAnY29weScKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX3NvcnQgPSB7CisgICAgICAgICdieScgOiAnYnkgICcsCisgICAgfQorCisgICAgZGVmIHNvcnQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNvcnQ6IChOT1QgQVZBSUxBQkxFIFlFVCkgUmV0dXJuIHRoZSBzcGVjaWZpZWQgb2JqZWN0KHMpIGluIGEgc29ydGVkIGxpc3QKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGEgbGlzdCBvZiBmaW5kZXIgb2JqZWN0cyB0byBzb3J0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgYnk6IHRoZSBwcm9wZXJ0eSB0byBzb3J0IHRoZSBpdGVtcyBieSAobmFtZSwgaW5kZXgsIGRhdGUsIGV0Yy4pCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdGhlIHNvcnRlZCBpdGVtcyBpbiB0aGVpciBuZXcgb3JkZXIKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ0RBVEEnCisgICAgICAgIF9zdWJjb2RlID0gJ1NPUlQnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc29ydCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKworY2xhc3MgYXBwbGljYXRpb24oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJhcHBsaWNhdGlvbiAtIFRoZSBGaW5kZXIgIiIiCisgICAgd2FudCA9ICdjYXBwJworY2xhc3MgX1Byb3BfRmluZGVyX3ByZWZlcmVuY2VzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJGaW5kZXIgcHJlZmVyZW5jZXMgLSAoTk9UIEFWQUlMQUJMRSBZRVQpIFZhcmlvdXMgcHJlZmVyZW5jZXMgdGhhdCBhcHBseSB0byB0aGUgRmluZGVyIGFzIGEgd2hvbGUgIiIiCisgICAgd2hpY2ggPSAncGZycCcKKyAgICB3YW50ID0gJ2NwcmYnCitGaW5kZXJfcHJlZmVyZW5jZXMgPSBfUHJvcF9GaW5kZXJfcHJlZmVyZW5jZXMoKQorY2xhc3MgX1Byb3BfY2xpcGJvYXJkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjbGlwYm9hcmQgLSAoTk9UIEFWQUlMQUJMRSBZRVQpIHRoZSBGaW5kZXJceGQ1cyBjbGlwYm9hcmQgd2luZG93ICIiIgorICAgIHdoaWNoID0gJ3BjbGknCisgICAgd2FudCA9ICdvYmogJworY2xpcGJvYXJkID0gX1Byb3BfY2xpcGJvYXJkKCkKK2NsYXNzIF9Qcm9wX2Rlc2t0b3AoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImRlc2t0b3AgLSB0aGUgZGVza3RvcCAiIiIKKyAgICB3aGljaCA9ICdkZXNrJworICAgIHdhbnQgPSAnY2RzaycKK2Rlc2t0b3AgPSBfUHJvcF9kZXNrdG9wKCkKK2NsYXNzIF9Qcm9wX2Zyb250bW9zdChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZnJvbnRtb3N0IC0gSXMgdGhlIEZpbmRlciB0aGUgZnJvbnRtb3N0IHByb2Nlc3M/ICIiIgorICAgIHdoaWNoID0gJ3Bpc2YnCisgICAgd2FudCA9ICdib29sJworZnJvbnRtb3N0ID0gX1Byb3BfZnJvbnRtb3N0KCkKK2NsYXNzIF9Qcm9wX2hvbWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImhvbWUgLSB0aGUgaG9tZSBkaXJlY3RvcnkgIiIiCisgICAgd2hpY2ggPSAnaG9tZScKKyAgICB3YW50ID0gJ2Nmb2wnCitob21lID0gX1Byb3BfaG9tZSgpCitjbGFzcyBfUHJvcF9pbnNlcnRpb25fbG9jYXRpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImluc2VydGlvbiBsb2NhdGlvbiAtIHRoZSBjb250YWluZXIgaW4gd2hpY2ggYSBuZXcgZm9sZGVyIHdvdWxkIGFwcGVhciBpZiBceGQyTmV3IEZvbGRlclx4ZDMgd2FzIHNlbGVjdGVkICIiIgorICAgIHdoaWNoID0gJ3BpbnMnCisgICAgd2FudCA9ICdvYmogJworaW5zZXJ0aW9uX2xvY2F0aW9uID0gX1Byb3BfaW5zZXJ0aW9uX2xvY2F0aW9uKCkKK2NsYXNzIF9Qcm9wX25hbWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm5hbWUgLSB0aGUgRmluZGVyXHhkNXMgbmFtZSAiIiIKKyAgICB3aGljaCA9ICdwbmFtJworICAgIHdhbnQgPSAnaXR4dCcKK25hbWUgPSBfUHJvcF9uYW1lKCkKK2NsYXNzIF9Qcm9wX3Byb2R1Y3RfdmVyc2lvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicHJvZHVjdCB2ZXJzaW9uIC0gdGhlIHZlcnNpb24gb2YgdGhlIFN5c3RlbSBzb2Z0d2FyZSBydW5uaW5nIG9uIHRoaXMgY29tcHV0ZXIgIiIiCisgICAgd2hpY2ggPSAndmVyMicKKyAgICB3YW50ID0gJ3V0eHQnCitwcm9kdWN0X3ZlcnNpb24gPSBfUHJvcF9wcm9kdWN0X3ZlcnNpb24oKQorY2xhc3MgX1Byb3Bfc2VsZWN0aW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzZWxlY3Rpb24gLSB0aGUgc2VsZWN0aW9uIGluIHRoZSBmcm9udG1vc3QgRmluZGVyIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdzZWxlJworICAgIHdhbnQgPSAnb2JqICcKK3NlbGVjdGlvbiA9IF9Qcm9wX3NlbGVjdGlvbigpCitjbGFzcyBfUHJvcF9zdGFydHVwX2Rpc2soYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInN0YXJ0dXAgZGlzayAtIHRoZSBzdGFydHVwIGRpc2sgIiIiCisgICAgd2hpY2ggPSAnc2RzaycKKyAgICB3YW50ID0gJ2NkaXMnCitzdGFydHVwX2Rpc2sgPSBfUHJvcF9zdGFydHVwX2Rpc2soKQorY2xhc3MgX1Byb3BfdHJhc2goYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInRyYXNoIC0gdGhlIHRyYXNoICIiIgorICAgIHdoaWNoID0gJ3Ryc2gnCisgICAgd2FudCA9ICdjdHJzJwordHJhc2ggPSBfUHJvcF90cmFzaCgpCitjbGFzcyBfUHJvcF92ZXJzaW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ2ZXJzaW9uIC0gdGhlIHZlcnNpb24gb2YgdGhlIEZpbmRlciAiIiIKKyAgICB3aGljaCA9ICd2ZXJzJworICAgIHdhbnQgPSAndXR4dCcKK3ZlcnNpb24gPSBfUHJvcF92ZXJzaW9uKCkKK2NsYXNzIF9Qcm9wX3Zpc2libGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInZpc2libGUgLSBJcyB0aGUgRmluZGVyXHhkNXMgbGF5ZXIgdmlzaWJsZT8gIiIiCisgICAgd2hpY2ggPSAncHZpcycKKyAgICB3YW50ID0gJ2Jvb2wnCit2aXNpYmxlID0gX1Byb3BfdmlzaWJsZSgpCisjICAgICAgICBlbGVtZW50ICdhbGlhJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdhcHBmJyBhcyBbJ2luZHgnLCAnbmFtZScsICdJRCAgJ10KKyMgICAgICAgIGVsZW1lbnQgJ2Jyb3cnIGFzIFsnaW5keCcsICdJRCAgJ10KKyMgICAgICAgIGVsZW1lbnQgJ2NkaXMnIGFzIFsnaW5keCcsICduYW1lJywgJ0lEICAnXQorIyAgICAgICAgZWxlbWVudCAnY2ZvbCcgYXMgWydpbmR4JywgJ25hbWUnLCAnSUQgICddCisjICAgICAgICBlbGVtZW50ICdjbHBmJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdjb2JqJyBhcyBbJ2luZHgnLCAncmVsZScsICduYW1lJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjdG5yJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdjd2luJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdkb2NmJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdmaWxlJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdpbmxmJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdsd25kJyBhcyBbJ2luZHgnLCAnbmFtZSddCisjICAgICAgICBlbGVtZW50ICdwYWNrJyBhcyBbJ2luZHgnLCAnbmFtZSddCithcHBsaWNhdGlvbi5fc3VwZXJjbGFzc25hbWVzID0gW10KK2ltcG9ydCBGaWxlcworaW1wb3J0IFdpbmRvd19jbGFzc2VzCitpbXBvcnQgQ29udGFpbmVyc19hbmRfZm9sZGVycworaW1wb3J0IEZpbmRlcl9pdGVtcworYXBwbGljYXRpb24uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnRmluZGVyX3ByZWZlcmVuY2VzJyA6IF9Qcm9wX0ZpbmRlcl9wcmVmZXJlbmNlcywKKyAgICAnY2xpcGJvYXJkJyA6IF9Qcm9wX2NsaXBib2FyZCwKKyAgICAnZGVza3RvcCcgOiBfUHJvcF9kZXNrdG9wLAorICAgICdmcm9udG1vc3QnIDogX1Byb3BfZnJvbnRtb3N0LAorICAgICdob21lJyA6IF9Qcm9wX2hvbWUsCisgICAgJ2luc2VydGlvbl9sb2NhdGlvbicgOiBfUHJvcF9pbnNlcnRpb25fbG9jYXRpb24sCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAncHJvZHVjdF92ZXJzaW9uJyA6IF9Qcm9wX3Byb2R1Y3RfdmVyc2lvbiwKKyAgICAnc2VsZWN0aW9uJyA6IF9Qcm9wX3NlbGVjdGlvbiwKKyAgICAnc3RhcnR1cF9kaXNrJyA6IF9Qcm9wX3N0YXJ0dXBfZGlzaywKKyAgICAndHJhc2gnIDogX1Byb3BfdHJhc2gsCisgICAgJ3ZlcnNpb24nIDogX1Byb3BfdmVyc2lvbiwKKyAgICAndmlzaWJsZScgOiBfUHJvcF92aXNpYmxlLAorfQorYXBwbGljYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnRmluZGVyX3dpbmRvdycgOiBXaW5kb3dfY2xhc3Nlcy5GaW5kZXJfd2luZG93LAorICAgICdhbGlhc19maWxlJyA6IEZpbGVzLmFsaWFzX2ZpbGUsCisgICAgJ2FwcGxpY2F0aW9uX2ZpbGUnIDogRmlsZXMuYXBwbGljYXRpb25fZmlsZSwKKyAgICAnY2xpcHBpbmcnIDogRmlsZXMuY2xpcHBpbmcsCisgICAgJ2NsaXBwaW5nX3dpbmRvdycgOiBXaW5kb3dfY2xhc3Nlcy5jbGlwcGluZ193aW5kb3csCisgICAgJ2NvbnRhaW5lcicgOiBDb250YWluZXJzX2FuZF9mb2xkZXJzLmNvbnRhaW5lciwKKyAgICAnZGlzaycgOiBDb250YWluZXJzX2FuZF9mb2xkZXJzLmRpc2ssCisgICAgJ2RvY3VtZW50X2ZpbGUnIDogRmlsZXMuZG9jdW1lbnRfZmlsZSwKKyAgICAnZmlsZScgOiBGaWxlcy5maWxlLAorICAgICdmb2xkZXInIDogQ29udGFpbmVyc19hbmRfZm9sZGVycy5mb2xkZXIsCisgICAgJ2ludGVybmV0X2xvY2F0aW9uX2ZpbGUnIDogRmlsZXMuaW50ZXJuZXRfbG9jYXRpb25fZmlsZSwKKyAgICAnaXRlbScgOiBGaW5kZXJfaXRlbXMuaXRlbSwKKyAgICAncGFja2FnZScgOiBGaWxlcy5wYWNrYWdlLAorICAgICd3aW5kb3cnIDogV2luZG93X2NsYXNzZXMud2luZG93LAorfQorCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKKyAgICAnY2FwcCcgOiBhcHBsaWNhdGlvbiwKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2Rlc2snIDogX1Byb3BfZGVza3RvcCwKKyAgICAnaG9tZScgOiBfUHJvcF9ob21lLAorICAgICdwY2xpJyA6IF9Qcm9wX2NsaXBib2FyZCwKKyAgICAncGZycCcgOiBfUHJvcF9GaW5kZXJfcHJlZmVyZW5jZXMsCisgICAgJ3BpbnMnIDogX1Byb3BfaW5zZXJ0aW9uX2xvY2F0aW9uLAorICAgICdwaXNmJyA6IF9Qcm9wX2Zyb250bW9zdCwKKyAgICAncG5hbScgOiBfUHJvcF9uYW1lLAorICAgICdwdmlzJyA6IF9Qcm9wX3Zpc2libGUsCisgICAgJ3Nkc2snIDogX1Byb3Bfc3RhcnR1cF9kaXNrLAorICAgICdzZWxlJyA6IF9Qcm9wX3NlbGVjdGlvbiwKKyAgICAndHJzaCcgOiBfUHJvcF90cmFzaCwKKyAgICAndmVyMicgOiBfUHJvcF9wcm9kdWN0X3ZlcnNpb24sCisgICAgJ3ZlcnMnIDogX1Byb3BfdmVyc2lvbiwKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbmRlcl9CYXNpY3MucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbmRlcl9CYXNpY3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNWMzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRmluZGVyX0Jhc2ljcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbmRlcl9CYXNpY3MucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbmRlcl9CYXNpY3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNWMzMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRmluZGVyX0Jhc2ljcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbmRlcl9pdGVtcy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9GaW5kZXJfaXRlbXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyMGVhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9GaW5kZXJfaXRlbXMucHkKQEAgLTAsMCArMSwzNTUgQEAKKyIiIlN1aXRlIEZpbmRlciBpdGVtczogQ29tbWFuZHMgdXNlZCB3aXRoIGZpbGUgc3lzdGVtIGl0ZW1zLCBhbmQgYmFzaWMgaXRlbSBkZWZpbml0aW9uCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9GaW5kZXIuYXBwCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAwLzE0NCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ2ZuZHInCisKK2NsYXNzIEZpbmRlcl9pdGVtc19FdmVudHM6CisKKyAgICBkZWYgYWRkX3RvX2Zhdm9yaXRlcyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiYWRkIHRvIGZhdm9yaXRlczogKE5PVCBBVkFJTEFCTEUgWUVUKSBBZGQgdGhlIGl0ZW1zIHRvIHRoZSB1c2VyXHhkNXMgRmF2b3JpdGVzCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgaXRlbXMgdG8gYWRkIHRvIHRoZSBjb2xsZWN0aW9uIG9mIEZhdm9yaXRlcworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdmbmRyJworICAgICAgICBfc3ViY29kZSA9ICdmZmF2JworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9jbGVhbl91cCA9IHsKKyAgICAgICAgJ2J5JyA6ICdieSAgJywKKyAgICB9CisKKyAgICBkZWYgY2xlYW5fdXAoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImNsZWFuIHVwOiAoTk9UIEFWQUlMQUJMRSBZRVQpIEFycmFuZ2UgaXRlbXMgaW4gd2luZG93IG5pY2VseSAob25seSBhcHBsaWVzIHRvIG9wZW4gd2luZG93cyBpbiBpY29uIHZpZXcgdGhhdCBhcmUgbm90IGtlcHQgYXJyYW5nZWQpCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgd2luZG93IHRvIGNsZWFuIHVwCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgYnk6IHRoZSBvcmRlciBpbiB3aGljaCB0byBjbGVhbiB1cCB0aGUgb2JqZWN0cyAobmFtZSwgaW5kZXgsIGRhdGUsIGV0Yy4pCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2ZuZHInCisgICAgICAgIF9zdWJjb2RlID0gJ2ZjbHUnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY2xlYW5fdXApCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIGVqZWN0KHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImVqZWN0OiBFamVjdCB0aGUgc3BlY2lmaWVkIGRpc2socykKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBkaXNrKHMpIHRvIGVqZWN0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2ZuZHInCisgICAgICAgIF9zdWJjb2RlID0gJ2VqY3QnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgZW1wdHkoc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiZW1wdHk6IEVtcHR5IHRoZSB0cmFzaAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogXHhkMmVtcHR5XHhkMyBhbmQgXHhkMmVtcHR5IHRyYXNoXHhkMyBib3RoIGRvIHRoZSBzYW1lIHRoaW5nCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2ZuZHInCisgICAgICAgIF9zdWJjb2RlID0gJ2VtcHQnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgZXJhc2Uoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImVyYXNlOiAoTk9UIEFWQUlMQUJMRSkgRXJhc2UgdGhlIHNwZWNpZmllZCBkaXNrKHMpCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgaXRlbXMgdG8gZXJhc2UKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnZm5kcicKKyAgICAgICAgX3N1YmNvZGUgPSAnZmVyYScKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiByZXZlYWwoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInJldmVhbDogQnJpbmcgdGhlIHNwZWNpZmllZCBvYmplY3QocykgaW50byB2aWV3CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IHRvIGJlIG1hZGUgdmlzaWJsZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdtaXNjJworICAgICAgICBfc3ViY29kZSA9ICdtdmlzJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF91cGRhdGUgPSB7CisgICAgICAgICduZWNlc3NpdHknIDogJ25lYz8nLAorICAgICAgICAncmVnaXN0ZXJpbmdfYXBwbGljYXRpb25zJyA6ICdyZWc/JywKKyAgICB9CisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJ1cGRhdGU6IFVwZGF0ZSB0aGUgZGlzcGxheSBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdChzKSB0byBtYXRjaCB0aGVpciBvbi1kaXNrIHJlcHJlc2VudGF0aW9uCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgaXRlbSB0byB1cGRhdGUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBuZWNlc3NpdHk6IG9ubHkgdXBkYXRlIGlmIG5lY2Vzc2FyeSAoaS5lLiBhIGZpbmRlciB3aW5kb3cgaXMgb3BlbikuICBkZWZhdWx0IGlzIGZhbHNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgcmVnaXN0ZXJpbmdfYXBwbGljYXRpb25zOiByZWdpc3RlciBhcHBsaWNhdGlvbnMuIGRlZmF1bHQgaXMgdHJ1ZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdmbmRyJworICAgICAgICBfc3ViY29kZSA9ICdmdXBkJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3VwZGF0ZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKworY2xhc3MgaXRlbShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIml0ZW0gLSBBbiBpdGVtICIiIgorICAgIHdhbnQgPSAnY29iaicKK2NsYXNzIF9Qcm9wX2JvdW5kcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiYm91bmRzIC0gdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgaXRlbSAoY2FuIG9ubHkgYmUgc2V0IGZvciBhbiBpdGVtIGluIGEgd2luZG93IHZpZXdlZCBhcyBpY29ucyBvciBidXR0b25zKSAiIiIKKyAgICB3aGljaCA9ICdwYm5kJworICAgIHdhbnQgPSAncWRydCcKK2NsYXNzIF9Qcm9wX2NvbW1lbnQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNvbW1lbnQgLSB0aGUgY29tbWVudCBvZiB0aGUgaXRlbSwgZGlzcGxheWVkIGluIHRoZSBceGQyR2V0IEluZm9ceGQzIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdjb210JworICAgIHdhbnQgPSAndXR4dCcKK2NsYXNzIF9Qcm9wX2NvbnRhaW5lcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY29udGFpbmVyIC0gdGhlIGNvbnRhaW5lciBvZiB0aGUgaXRlbSAiIiIKKyAgICB3aGljaCA9ICdjdG5yJworICAgIHdhbnQgPSAnb2JqICcKK2NsYXNzIF9Qcm9wX2NyZWF0aW9uX2RhdGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNyZWF0aW9uIGRhdGUgLSB0aGUgZGF0ZSBvbiB3aGljaCB0aGUgaXRlbSB3YXMgY3JlYXRlZCAiIiIKKyAgICB3aGljaCA9ICdhc2NkJworICAgIHdhbnQgPSAnbGR0ICcKK2NsYXNzIF9Qcm9wX2Rlc2NyaXB0aW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJkZXNjcmlwdGlvbiAtIGEgZGVzY3JpcHRpb24gb2YgdGhlIGl0ZW0gIiIiCisgICAgd2hpY2ggPSAnZHNjcicKKyAgICB3YW50ID0gJ3V0eHQnCitjbGFzcyBfUHJvcF9kaXNrKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJkaXNrIC0gdGhlIGRpc2sgb24gd2hpY2ggdGhlIGl0ZW0gaXMgc3RvcmVkICIiIgorICAgIHdoaWNoID0gJ2NkaXMnCisgICAgd2FudCA9ICdvYmogJworY2xhc3MgX1Byb3BfZGlzcGxheWVkX25hbWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImRpc3BsYXllZCBuYW1lIC0gdGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSBpdGVtICIiIgorICAgIHdoaWNoID0gJ2RuYW0nCisgICAgd2FudCA9ICd1dHh0JworY2xhc3MgX1Byb3BfZXZlcnlvbmVzX3ByaXZpbGVnZXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImV2ZXJ5b25lcyBwcml2aWxlZ2VzIC0gICIiIgorICAgIHdoaWNoID0gJ2dzdHAnCisgICAgd2FudCA9ICdwcml2JworY2xhc3MgX1Byb3BfZXh0ZW5zaW9uX2hpZGRlbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZXh0ZW5zaW9uIGhpZGRlbiAtIElzIHRoZSBpdGVtJ3MgZXh0ZW5zaW9uIGhpZGRlbiBmcm9tIHRoZSB1c2VyPyAiIiIKKyAgICB3aGljaCA9ICdoaWR4JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2dyb3VwKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJncm91cCAtIHRoZSB1c2VyIG9yIGdyb3VwIHRoYXQgaGFzIHNwZWNpYWwgYWNjZXNzIHRvIHRoZSBjb250YWluZXIgIiIiCisgICAgd2hpY2ggPSAnc2dycCcKKyAgICB3YW50ID0gJ3V0eHQnCitjbGFzcyBfUHJvcF9ncm91cF9wcml2aWxlZ2VzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJncm91cCBwcml2aWxlZ2VzIC0gICIiIgorICAgIHdoaWNoID0gJ2dwcHInCisgICAgd2FudCA9ICdwcml2JworY2xhc3MgX1Byb3BfaWNvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaWNvbiAtIHRoZSBpY29uIGJpdG1hcCBvZiB0aGUgaXRlbSAiIiIKKyAgICB3aGljaCA9ICdpaW1nJworICAgIHdhbnQgPSAnaWZhbScKK2NsYXNzIF9Qcm9wX2luZGV4KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJpbmRleCAtIHRoZSBpbmRleCBpbiB0aGUgZnJvbnQtdG8tYmFjayBvcmRlcmluZyB3aXRoaW4gaXRzIGNvbnRhaW5lciAiIiIKKyAgICB3aGljaCA9ICdwaWR4JworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX2luZm9ybWF0aW9uX3dpbmRvdyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaW5mb3JtYXRpb24gd2luZG93IC0gdGhlIGluZm9ybWF0aW9uIHdpbmRvdyBmb3IgdGhlIGl0ZW0gIiIiCisgICAgd2hpY2ggPSAnaXduZCcKKyAgICB3YW50ID0gJ29iaiAnCitjbGFzcyBfUHJvcF9raW5kKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJraW5kIC0gdGhlIGtpbmQgb2YgdGhlIGl0ZW0gIiIiCisgICAgd2hpY2ggPSAna2luZCcKKyAgICB3YW50ID0gJ3V0eHQnCitjbGFzcyBfUHJvcF9sYWJlbF9pbmRleChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibGFiZWwgaW5kZXggLSB0aGUgbGFiZWwgb2YgdGhlIGl0ZW0gIiIiCisgICAgd2hpY2ggPSAnbGFiaScKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF9sb2NrZWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImxvY2tlZCAtIElzIHRoZSBmaWxlIGxvY2tlZD8gIiIiCisgICAgd2hpY2ggPSAnYXNsaycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9tb2RpZmljYXRpb25fZGF0ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibW9kaWZpY2F0aW9uIGRhdGUgLSB0aGUgZGF0ZSBvbiB3aGljaCB0aGUgaXRlbSB3YXMgbGFzdCBtb2RpZmllZCAiIiIKKyAgICB3aGljaCA9ICdhc21vJworICAgIHdhbnQgPSAnbGR0ICcKK2NsYXNzIF9Qcm9wX25hbWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgaXRlbSAiIiIKKyAgICB3aGljaCA9ICdwbmFtJworICAgIHdhbnQgPSAndXR4dCcKK2NsYXNzIF9Qcm9wX25hbWVfZXh0ZW5zaW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJuYW1lIGV4dGVuc2lvbiAtIHRoZSBuYW1lIGV4dGVuc2lvbiBvZiB0aGUgaXRlbSAoc3VjaCBhcyBceGQydHh0XHhkMykgIiIiCisgICAgd2hpY2ggPSAnbm14dCcKKyAgICB3YW50ID0gJ3V0eHQnCitjbGFzcyBfUHJvcF9vd25lcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIib3duZXIgLSB0aGUgdXNlciB0aGF0IG93bnMgdGhlIGNvbnRhaW5lciAiIiIKKyAgICB3aGljaCA9ICdzb3duJworICAgIHdhbnQgPSAndXR4dCcKK2NsYXNzIF9Qcm9wX293bmVyX3ByaXZpbGVnZXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm93bmVyIHByaXZpbGVnZXMgLSAgIiIiCisgICAgd2hpY2ggPSAnb3ducicKKyAgICB3YW50ID0gJ3ByaXYnCitjbGFzcyBfUHJvcF9waHlzaWNhbF9zaXplKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwaHlzaWNhbCBzaXplIC0gdGhlIGFjdHVhbCBzcGFjZSB1c2VkIGJ5IHRoZSBpdGVtIG9uIGRpc2sgIiIiCisgICAgd2hpY2ggPSAncGh5cycKKyAgICB3YW50ID0gJ2NvbXAnCitjbGFzcyBfUHJvcF9wb3NpdGlvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicG9zaXRpb24gLSB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gd2l0aGluIGl0cyBwYXJlbnQgd2luZG93IChjYW4gb25seSBiZSBzZXQgZm9yIGFuIGl0ZW0gaW4gYSB3aW5kb3cgdmlld2VkIGFzIGljb25zIG9yIGJ1dHRvbnMpICIiIgorICAgIHdoaWNoID0gJ3Bvc24nCisgICAgd2FudCA9ICdRRHB0JworY2xhc3MgX1Byb3BfcHJvcGVydGllcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicHJvcGVydGllcyAtIGV2ZXJ5IHByb3BlcnR5IG9mIGFuIGl0ZW0gIiIiCisgICAgd2hpY2ggPSAncEFMTCcKKyAgICB3YW50ID0gJ3JlY28nCitjbGFzcyBfUHJvcF9zaXplKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzaXplIC0gdGhlIGxvZ2ljYWwgc2l6ZSBvZiB0aGUgaXRlbSAiIiIKKyAgICB3aGljaCA9ICdwdHN6JworICAgIHdhbnQgPSAnY29tcCcKK2NsYXNzIF9Qcm9wX3VybChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidXJsIC0gdGhlIHVybCBvZiB0aGUgaXRlbSAiIiIKKyAgICB3aGljaCA9ICdwVVJMJworICAgIHdhbnQgPSAndXR4dCcKKworaXRlbXMgPSBpdGVtCitpdGVtLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQoraXRlbS5fcHJpdnByb3BkaWN0ID0geworICAgICdib3VuZHMnIDogX1Byb3BfYm91bmRzLAorICAgICdjb21tZW50JyA6IF9Qcm9wX2NvbW1lbnQsCisgICAgJ2NvbnRhaW5lcicgOiBfUHJvcF9jb250YWluZXIsCisgICAgJ2NyZWF0aW9uX2RhdGUnIDogX1Byb3BfY3JlYXRpb25fZGF0ZSwKKyAgICAnZGVzY3JpcHRpb24nIDogX1Byb3BfZGVzY3JpcHRpb24sCisgICAgJ2Rpc2snIDogX1Byb3BfZGlzaywKKyAgICAnZGlzcGxheWVkX25hbWUnIDogX1Byb3BfZGlzcGxheWVkX25hbWUsCisgICAgJ2V2ZXJ5b25lc19wcml2aWxlZ2VzJyA6IF9Qcm9wX2V2ZXJ5b25lc19wcml2aWxlZ2VzLAorICAgICdleHRlbnNpb25faGlkZGVuJyA6IF9Qcm9wX2V4dGVuc2lvbl9oaWRkZW4sCisgICAgJ2dyb3VwJyA6IF9Qcm9wX2dyb3VwLAorICAgICdncm91cF9wcml2aWxlZ2VzJyA6IF9Qcm9wX2dyb3VwX3ByaXZpbGVnZXMsCisgICAgJ2ljb24nIDogX1Byb3BfaWNvbiwKKyAgICAnaW5kZXgnIDogX1Byb3BfaW5kZXgsCisgICAgJ2luZm9ybWF0aW9uX3dpbmRvdycgOiBfUHJvcF9pbmZvcm1hdGlvbl93aW5kb3csCisgICAgJ2tpbmQnIDogX1Byb3Bfa2luZCwKKyAgICAnbGFiZWxfaW5kZXgnIDogX1Byb3BfbGFiZWxfaW5kZXgsCisgICAgJ2xvY2tlZCcgOiBfUHJvcF9sb2NrZWQsCisgICAgJ21vZGlmaWNhdGlvbl9kYXRlJyA6IF9Qcm9wX21vZGlmaWNhdGlvbl9kYXRlLAorICAgICduYW1lJyA6IF9Qcm9wX25hbWUsCisgICAgJ25hbWVfZXh0ZW5zaW9uJyA6IF9Qcm9wX25hbWVfZXh0ZW5zaW9uLAorICAgICdvd25lcicgOiBfUHJvcF9vd25lciwKKyAgICAnb3duZXJfcHJpdmlsZWdlcycgOiBfUHJvcF9vd25lcl9wcml2aWxlZ2VzLAorICAgICdwaHlzaWNhbF9zaXplJyA6IF9Qcm9wX3BoeXNpY2FsX3NpemUsCisgICAgJ3Bvc2l0aW9uJyA6IF9Qcm9wX3Bvc2l0aW9uLAorICAgICdwcm9wZXJ0aWVzJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCisgICAgJ3NpemUnIDogX1Byb3Bfc2l6ZSwKKyAgICAndXJsJyA6IF9Qcm9wX3VybCwKK30KK2l0ZW0uX3ByaXZlbGVtZGljdCA9IHsKK30KKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2NvYmonIDogaXRlbSwKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2FzY2QnIDogX1Byb3BfY3JlYXRpb25fZGF0ZSwKKyAgICAnYXNsaycgOiBfUHJvcF9sb2NrZWQsCisgICAgJ2FzbW8nIDogX1Byb3BfbW9kaWZpY2F0aW9uX2RhdGUsCisgICAgJ2NkaXMnIDogX1Byb3BfZGlzaywKKyAgICAnY29tdCcgOiBfUHJvcF9jb21tZW50LAorICAgICdjdG5yJyA6IF9Qcm9wX2NvbnRhaW5lciwKKyAgICAnZG5hbScgOiBfUHJvcF9kaXNwbGF5ZWRfbmFtZSwKKyAgICAnZHNjcicgOiBfUHJvcF9kZXNjcmlwdGlvbiwKKyAgICAnZ3BwcicgOiBfUHJvcF9ncm91cF9wcml2aWxlZ2VzLAorICAgICdnc3RwJyA6IF9Qcm9wX2V2ZXJ5b25lc19wcml2aWxlZ2VzLAorICAgICdoaWR4JyA6IF9Qcm9wX2V4dGVuc2lvbl9oaWRkZW4sCisgICAgJ2lpbWcnIDogX1Byb3BfaWNvbiwKKyAgICAnaXduZCcgOiBfUHJvcF9pbmZvcm1hdGlvbl93aW5kb3csCisgICAgJ2tpbmQnIDogX1Byb3Bfa2luZCwKKyAgICAnbGFiaScgOiBfUHJvcF9sYWJlbF9pbmRleCwKKyAgICAnbm14dCcgOiBfUHJvcF9uYW1lX2V4dGVuc2lvbiwKKyAgICAnb3ducicgOiBfUHJvcF9vd25lcl9wcml2aWxlZ2VzLAorICAgICdwQUxMJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCisgICAgJ3BVUkwnIDogX1Byb3BfdXJsLAorICAgICdwYm5kJyA6IF9Qcm9wX2JvdW5kcywKKyAgICAncGh5cycgOiBfUHJvcF9waHlzaWNhbF9zaXplLAorICAgICdwaWR4JyA6IF9Qcm9wX2luZGV4LAorICAgICdwbmFtJyA6IF9Qcm9wX25hbWUsCisgICAgJ3Bvc24nIDogX1Byb3BfcG9zaXRpb24sCisgICAgJ3B0c3onIDogX1Byb3Bfc2l6ZSwKKyAgICAnc2dycCcgOiBfUHJvcF9ncm91cCwKKyAgICAnc293bicgOiBfUHJvcF9vd25lciwKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbmRlcl9pdGVtcy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRmluZGVyX2l0ZW1zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTYxMzYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbmRlcl9pdGVtcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbmRlcl9pdGVtcy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvRmluZGVyX2l0ZW1zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTYxMzYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0ZpbmRlcl9pdGVtcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0xlZ2FjeV9zdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9MZWdhY3lfc3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3ZmRmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9MZWdhY3lfc3VpdGUucHkKQEAgLTAsMCArMSwyMjQgQEAKKyIiIlN1aXRlIExlZ2FjeSBzdWl0ZTogT3BlcmF0aW9ucyBmb3JtZXJseSBoYW5kbGVkIGJ5IHRoZSBGaW5kZXIsIGJ1dCBub3cgYXV0b21hdGljYWxseSBkZWxlZ2F0ZWQgdG8gb3RoZXIgYXBwbGljYXRpb25zCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9GaW5kZXIuYXBwCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAwLzE0NCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ2ZsZWcnCisKK2NsYXNzIExlZ2FjeV9zdWl0ZV9FdmVudHM6CisKKyAgICBkZWYgcmVzdGFydChzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJyZXN0YXJ0OiBSZXN0YXJ0IHRoZSBjb21wdXRlcgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdmbmRyJworICAgICAgICBfc3ViY29kZSA9ICdyZXN0JworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBzaHV0X2Rvd24oc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIic2h1dCBkb3duOiBTaHV0IERvd24gdGhlIGNvbXB1dGVyCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2ZuZHInCisgICAgICAgIF9zdWJjb2RlID0gJ3NodXQnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIHNsZWVwKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNsZWVwOiBQdXQgdGhlIGNvbXB1dGVyIHRvIHNsZWVwCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2ZuZHInCisgICAgICAgIF9zdWJjb2RlID0gJ3NsZXAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisKK2NsYXNzIGFwcGxpY2F0aW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYXBwbGljYXRpb24gLSBUaGUgRmluZGVyICIiIgorICAgIHdhbnQgPSAnY2FwcCcKK2NsYXNzIF9Qcm9wX2Rlc2t0b3BfcGljdHVyZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZGVza3RvcCBwaWN0dXJlIC0gdGhlIGRlc2t0b3AgcGljdHVyZSBvZiB0aGUgbWFpbiBtb25pdG9yICIiIgorICAgIHdoaWNoID0gJ2RwaWMnCisgICAgd2FudCA9ICdmaWxlJworZGVza3RvcF9waWN0dXJlID0gX1Byb3BfZGVza3RvcF9waWN0dXJlKCkKKworY2xhc3MgYXBwbGljYXRpb25fcHJvY2VzcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImFwcGxpY2F0aW9uIHByb2Nlc3MgLSBBIHByb2Nlc3MgbGF1bmNoZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmaWxlICIiIgorICAgIHdhbnQgPSAncGNhcCcKK2NsYXNzIF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIjxJbmhlcml0YW5jZT4gLSBpbmhlcml0cyBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzIGZyb20gdGhlIHByb2Nlc3MgY2xhc3MgIiIiCisgICAgd2hpY2ggPSAnY0AjXicKKyAgICB3YW50ID0gJ3ByY3MnCitjbGFzcyBfUHJvcF9hcHBsaWNhdGlvbl9maWxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJhcHBsaWNhdGlvbiBmaWxlIC0gdGhlIGFwcGxpY2F0aW9uIGZpbGUgZnJvbSB3aGljaCB0aGlzIHByb2Nlc3Mgd2FzIGxhdW5jaGVkICIiIgorICAgIHdoaWNoID0gJ2FwcGYnCisgICAgd2FudCA9ICdhcHBmJworCithcHBsaWNhdGlvbl9wcm9jZXNzZXMgPSBhcHBsaWNhdGlvbl9wcm9jZXNzCisKK2NsYXNzIGRlc2tfYWNjZXNzb3J5X3Byb2Nlc3MoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkZXNrIGFjY2Vzc29yeSBwcm9jZXNzIC0gQSBwcm9jZXNzIGxhdW5jaGVkIGZyb20gYSBkZXNrIGFjY2Vzc29yeSBmaWxlICIiIgorICAgIHdhbnQgPSAncGNkYScKK2NsYXNzIF9Qcm9wX2Rlc2tfYWNjZXNzb3J5X2ZpbGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImRlc2sgYWNjZXNzb3J5IGZpbGUgLSB0aGUgZGVzayBhY2Nlc3NvcnkgZmlsZSBmcm9tIHdoaWNoIHRoaXMgcHJvY2VzcyB3YXMgbGF1bmNoZWQgIiIiCisgICAgd2hpY2ggPSAnZGFmaScKKyAgICB3YW50ID0gJ29iaiAnCisKK2Rlc2tfYWNjZXNzb3J5X3Byb2Nlc3NlcyA9IGRlc2tfYWNjZXNzb3J5X3Byb2Nlc3MKKworY2xhc3MgcHJvY2VzcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInByb2Nlc3MgLSBBIHByb2Nlc3MgcnVubmluZyBvbiB0aGlzIGNvbXB1dGVyICIiIgorICAgIHdhbnQgPSAncHJjcycKK2NsYXNzIF9Qcm9wX2FjY2VwdHNfaGlnaF9sZXZlbF9ldmVudHMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImFjY2VwdHMgaGlnaCBsZXZlbCBldmVudHMgLSBJcyB0aGUgcHJvY2VzcyBoaWdoLWxldmVsIGV2ZW50IGF3YXJlIChhY2NlcHRzIG9wZW4gYXBwbGljYXRpb24sIG9wZW4gZG9jdW1lbnQsIHByaW50IGRvY3VtZW50LCBhbmQgcXVpdCk/ICIiIgorICAgIHdoaWNoID0gJ2lzYWInCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfYWNjZXB0c19yZW1vdGVfZXZlbnRzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJhY2NlcHRzIHJlbW90ZSBldmVudHMgLSBEb2VzIHRoZSBwcm9jZXNzIGFjY2VwdCByZW1vdGUgZXZlbnRzPyAiIiIKKyAgICB3aGljaCA9ICdyZXZ0JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2NyZWF0b3JfdHlwZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY3JlYXRvciB0eXBlIC0gdGhlIE9TVHlwZSBvZiB0aGUgY3JlYXRvciBvZiB0aGUgcHJvY2VzcyAodGhlIHNpZ25hdHVyZSkgIiIiCisgICAgd2hpY2ggPSAnZmNydCcKKyAgICB3YW50ID0gJ3R5cGUnCitjbGFzcyBfUHJvcF9maWxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmaWxlIC0gdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgcHJvY2VzcyB3YXMgbGF1bmNoZWQgIiIiCisgICAgd2hpY2ggPSAnZmlsZScKKyAgICB3YW50ID0gJ29iaiAnCitjbGFzcyBfUHJvcF9maWxlX3R5cGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZpbGUgdHlwZSAtIHRoZSBPU1R5cGUgb2YgdGhlIGZpbGUgdHlwZSBvZiB0aGUgcHJvY2VzcyAiIiIKKyAgICB3aGljaCA9ICdhc3R5JworICAgIHdhbnQgPSAndHlwZScKK2NsYXNzIF9Qcm9wX2Zyb250bW9zdChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZnJvbnRtb3N0IC0gSXMgdGhlIHByb2Nlc3MgdGhlIGZyb250bW9zdCBwcm9jZXNzPyAiIiIKKyAgICB3aGljaCA9ICdwaXNmJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2hhc19zY3JpcHRpbmdfdGVybWlub2xvZ3koYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImhhcyBzY3JpcHRpbmcgdGVybWlub2xvZ3kgLSBEb2VzIHRoZSBwcm9jZXNzIGhhdmUgYSBzY3JpcHRpbmcgdGVybWlub2xvZ3ksIGkuZS4sIGNhbiBpdCBiZSBzY3JpcHRlZD8gIiIiCisgICAgd2hpY2ggPSAnaHNjcicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9uYW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIHByb2Nlc3MgIiIiCisgICAgd2hpY2ggPSAncG5hbScKKyAgICB3YW50ID0gJ2l0eHQnCitjbGFzcyBfUHJvcF9wYXJ0aXRpb25fc3BhY2VfdXNlZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicGFydGl0aW9uIHNwYWNlIHVzZWQgLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSB1c2VkIGluIHRoZSBwcm9jZXNzJyBwYXJ0aXRpb24gIiIiCisgICAgd2hpY2ggPSAncHVzZCcKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF90b3RhbF9wYXJ0aXRpb25fc2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidG90YWwgcGFydGl0aW9uIHNpemUgLSB0aGUgc2l6ZSBvZiB0aGUgcGFydGl0aW9uIHdpdGggd2hpY2ggdGhlIHByb2Nlc3Mgd2FzIGxhdW5jaGVkICIiIgorICAgIHdoaWNoID0gJ2FwcHQnCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3BfdmlzaWJsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidmlzaWJsZSAtIElzIHRoZSBwcm9jZXNzJyBsYXllciB2aXNpYmxlPyAiIiIKKyAgICB3aGljaCA9ICdwdmlzJworICAgIHdhbnQgPSAnYm9vbCcKKworcHJvY2Vzc2VzID0gcHJvY2VzcworYXBwbGljYXRpb24uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCithcHBsaWNhdGlvbi5fcHJpdnByb3BkaWN0ID0geworICAgICdkZXNrdG9wX3BpY3R1cmUnIDogX1Byb3BfZGVza3RvcF9waWN0dXJlLAorfQorYXBwbGljYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKK30KK2FwcGxpY2F0aW9uX3Byb2Nlc3MuX3N1cGVyY2xhc3NuYW1lcyA9IFsncHJvY2VzcyddCithcHBsaWNhdGlvbl9wcm9jZXNzLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnYXBwbGljYXRpb25fZmlsZScgOiBfUHJvcF9hcHBsaWNhdGlvbl9maWxlLAorfQorYXBwbGljYXRpb25fcHJvY2Vzcy5fcHJpdmVsZW1kaWN0ID0geworfQorZGVza19hY2Nlc3NvcnlfcHJvY2Vzcy5fc3VwZXJjbGFzc25hbWVzID0gWydwcm9jZXNzJ10KK2Rlc2tfYWNjZXNzb3J5X3Byb2Nlc3MuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdkZXNrX2FjY2Vzc29yeV9maWxlJyA6IF9Qcm9wX2Rlc2tfYWNjZXNzb3J5X2ZpbGUsCit9CitkZXNrX2FjY2Vzc29yeV9wcm9jZXNzLl9wcml2ZWxlbWRpY3QgPSB7Cit9Citwcm9jZXNzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorcHJvY2Vzcy5fcHJpdnByb3BkaWN0ID0geworICAgICdhY2NlcHRzX2hpZ2hfbGV2ZWxfZXZlbnRzJyA6IF9Qcm9wX2FjY2VwdHNfaGlnaF9sZXZlbF9ldmVudHMsCisgICAgJ2FjY2VwdHNfcmVtb3RlX2V2ZW50cycgOiBfUHJvcF9hY2NlcHRzX3JlbW90ZV9ldmVudHMsCisgICAgJ2NyZWF0b3JfdHlwZScgOiBfUHJvcF9jcmVhdG9yX3R5cGUsCisgICAgJ2ZpbGUnIDogX1Byb3BfZmlsZSwKKyAgICAnZmlsZV90eXBlJyA6IF9Qcm9wX2ZpbGVfdHlwZSwKKyAgICAnZnJvbnRtb3N0JyA6IF9Qcm9wX2Zyb250bW9zdCwKKyAgICAnaGFzX3NjcmlwdGluZ190ZXJtaW5vbG9neScgOiBfUHJvcF9oYXNfc2NyaXB0aW5nX3Rlcm1pbm9sb2d5LAorICAgICduYW1lJyA6IF9Qcm9wX25hbWUsCisgICAgJ3BhcnRpdGlvbl9zcGFjZV91c2VkJyA6IF9Qcm9wX3BhcnRpdGlvbl9zcGFjZV91c2VkLAorICAgICd0b3RhbF9wYXJ0aXRpb25fc2l6ZScgOiBfUHJvcF90b3RhbF9wYXJ0aXRpb25fc2l6ZSwKKyAgICAndmlzaWJsZScgOiBfUHJvcF92aXNpYmxlLAorfQorcHJvY2Vzcy5fcHJpdmVsZW1kaWN0ID0geworfQorCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKKyAgICAnY2FwcCcgOiBhcHBsaWNhdGlvbiwKKyAgICAncGNhcCcgOiBhcHBsaWNhdGlvbl9wcm9jZXNzLAorICAgICdwY2RhJyA6IGRlc2tfYWNjZXNzb3J5X3Byb2Nlc3MsCisgICAgJ3ByY3MnIDogcHJvY2VzcywKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2FwcGYnIDogX1Byb3BfYXBwbGljYXRpb25fZmlsZSwKKyAgICAnYXBwdCcgOiBfUHJvcF90b3RhbF9wYXJ0aXRpb25fc2l6ZSwKKyAgICAnYXN0eScgOiBfUHJvcF9maWxlX3R5cGUsCisgICAgJ2NAI14nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnZGFmaScgOiBfUHJvcF9kZXNrX2FjY2Vzc29yeV9maWxlLAorICAgICdkcGljJyA6IF9Qcm9wX2Rlc2t0b3BfcGljdHVyZSwKKyAgICAnZmNydCcgOiBfUHJvcF9jcmVhdG9yX3R5cGUsCisgICAgJ2ZpbGUnIDogX1Byb3BfZmlsZSwKKyAgICAnaHNjcicgOiBfUHJvcF9oYXNfc2NyaXB0aW5nX3Rlcm1pbm9sb2d5LAorICAgICdpc2FiJyA6IF9Qcm9wX2FjY2VwdHNfaGlnaF9sZXZlbF9ldmVudHMsCisgICAgJ3Bpc2YnIDogX1Byb3BfZnJvbnRtb3N0LAorICAgICdwbmFtJyA6IF9Qcm9wX25hbWUsCisgICAgJ3B1c2QnIDogX1Byb3BfcGFydGl0aW9uX3NwYWNlX3VzZWQsCisgICAgJ3B2aXMnIDogX1Byb3BfdmlzaWJsZSwKKyAgICAncmV2dCcgOiBfUHJvcF9hY2NlcHRzX3JlbW90ZV9ldmVudHMsCit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9MZWdhY3lfc3VpdGUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0xlZ2FjeV9zdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkZjc1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9MZWdhY3lfc3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9MZWdhY3lfc3VpdGUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL0xlZ2FjeV9zdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkZjc1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9MZWdhY3lfc3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9TdGFuZGFyZF9TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9TdGFuZGFyZF9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTc5MThmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL1N0YW5kYXJkX1N1aXRlLnB5CkBAIC0wLDAgKzEsMzM1IEBACisiIiJTdWl0ZSBTdGFuZGFyZCBTdWl0ZTogQ29tbW9uIHRlcm1zIHRoYXQgbW9zdCBhcHBsaWNhdGlvbnMgc2hvdWxkIHN1cHBvcnQKK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL0ZpbmRlci5hcHAKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDAvMTQ0LCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAnQ29SZScKKworZnJvbSBTdGRTdWl0ZXMuU3RhbmRhcmRfU3VpdGUgaW1wb3J0ICoKK2NsYXNzIFN0YW5kYXJkX1N1aXRlX0V2ZW50cyhTdGFuZGFyZF9TdWl0ZV9FdmVudHMpOgorCisgICAgZGVmIGNsb3NlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJjbG9zZTogQ2xvc2UgYW4gb2JqZWN0CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IHRvIGNsb3NlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2Nsb3MnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX2NvdW50ID0geworICAgICAgICAnZWFjaCcgOiAna29jbCcsCisgICAgfQorCisgICAgZGVmIGNvdW50KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJjb3VudDogUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSBwYXJ0aWN1bGFyIGNsYXNzIHdpdGhpbiBhbiBvYmplY3QKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3Qgd2hvc2UgZWxlbWVudHMgYXJlIHRvIGJlIGNvdW50ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBlYWNoOiB0aGUgY2xhc3Mgb2YgdGhlIGVsZW1lbnRzIHRvIGJlIGNvdW50ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdjbnRlJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2NvdW50KQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfZGF0YV9zaXplID0geworICAgICAgICAnYXMnIDogJ3J0eXAnLAorICAgIH0KKworICAgIGRlZiBkYXRhX3NpemUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImRhdGEgc2l6ZTogUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIG9iamVjdAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCB3aG9zZSBkYXRhIHNpemUgaXMgdG8gYmUgcmV0dXJuZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBhczogdGhlIGRhdGEgdHlwZSBmb3Igd2hpY2ggdGhlIHNpemUgaXMgY2FsY3VsYXRlZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRoZSBzaXplIG9mIHRoZSBvYmplY3QgaW4gYnl0ZXMKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2RzaXonCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfZGF0YV9zaXplKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBkZWxldGUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImRlbGV0ZTogTW92ZSBhbiBpdGVtIGZyb20gaXRzIGNvbnRhaW5lciB0byB0aGUgdHJhc2gKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBpdGVtIHRvIGRlbGV0ZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRvIHRoZSBpdGVtIHRoYXQgd2FzIGp1c3QgZGVsZXRlZAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnZGVsbycKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfZHVwbGljYXRlID0geworICAgICAgICAndG8nIDogJ2luc2gnLAorICAgICAgICAncmVwbGFjaW5nJyA6ICdhbHJwJywKKyAgICAgICAgJ3JvdXRpbmdfc3VwcHJlc3NlZCcgOiAncm91dCcsCisgICAgfQorCisgICAgZGVmIGR1cGxpY2F0ZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiZHVwbGljYXRlOiBEdXBsaWNhdGUgb25lIG9yIG1vcmUgb2JqZWN0KHMpCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0KHMpIHRvIGR1cGxpY2F0ZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRvOiB0aGUgbmV3IGxvY2F0aW9uIGZvciB0aGUgb2JqZWN0KHMpCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgcmVwbGFjaW5nOiBTcGVjaWZpZXMgd2hldGhlciBvciBub3QgdG8gcmVwbGFjZSBpdGVtcyBpbiB0aGUgZGVzdGluYXRpb24gdGhhdCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgaXRlbXMgYmVpbmcgZHVwbGljYXRlZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHJvdXRpbmdfc3VwcHJlc3NlZDogU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGF1dG9yb3V0ZSBpdGVtcyAoZGVmYXVsdCBpcyBmYWxzZSkuIE9ubHkgYXBwbGllcyB3aGVuIGNvcHlpbmcgdG8gdGhlIHN5c3RlbSBmb2xkZXIuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdG8gdGhlIGR1cGxpY2F0ZWQgb2JqZWN0KHMpCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdjbG9uJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2R1cGxpY2F0ZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdhbHJwJywgX0VudW1fYm9vbCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ3JvdXQnLCBfRW51bV9ib29sKQorCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIGV4aXN0cyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiZXhpc3RzOiBWZXJpZnkgaWYgYW4gb2JqZWN0IGV4aXN0cworICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBpbiBxdWVzdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRydWUgaWYgaXQgZXhpc3RzLCBmYWxzZSBpZiBub3QKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2RvZXgnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX21ha2UgPSB7CisgICAgICAgICduZXcnIDogJ2tvY2wnLAorICAgICAgICAnYXQnIDogJ2luc2gnLAorICAgICAgICAndG8nIDogJ3RvICAnLAorICAgICAgICAnd2l0aF9wcm9wZXJ0aWVzJyA6ICdwcmR0JywKKyAgICB9CisKKyAgICBkZWYgbWFrZShzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJtYWtlOiBNYWtlIGEgbmV3IGVsZW1lbnQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBuZXc6IHRoZSBjbGFzcyBvZiB0aGUgbmV3IGVsZW1lbnQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBhdDogdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRvIGluc2VydCB0aGUgZWxlbWVudAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRvOiB3aGVuIGNyZWF0aW5nIGFuIGFsaWFzIGZpbGUsIHRoZSBvcmlnaW5hbCBpdGVtIHRvIGNyZWF0ZSBhbiBhbGlhcyB0byBvciB3aGVuIGNyZWF0aW5nIGEgZmlsZSB2aWV3ZXIgd2luZG93LCB0aGUgdGFyZ2V0IG9mIHRoZSB3aW5kb3cKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb3BlcnRpZXM6IHRoZSBpbml0aWFsIHZhbHVlcyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGVsZW1lbnQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB0byB0aGUgbmV3IG9iamVjdChzKQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnY3JlbCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9tYWtlKQorICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX21vdmUgPSB7CisgICAgICAgICd0bycgOiAnaW5zaCcsCisgICAgICAgICdyZXBsYWNpbmcnIDogJ2FscnAnLAorICAgICAgICAncG9zaXRpb25lZF9hdCcgOiAnbXZwbCcsCisgICAgICAgICdyb3V0aW5nX3N1cHByZXNzZWQnIDogJ3JvdXQnLAorICAgIH0KKworICAgIGRlZiBtb3ZlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJtb3ZlOiBNb3ZlIG9iamVjdChzKSB0byBhIG5ldyBsb2NhdGlvbgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdChzKSB0byBtb3ZlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG86IHRoZSBuZXcgbG9jYXRpb24gZm9yIHRoZSBvYmplY3QocykKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCByZXBsYWNpbmc6IFNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0byByZXBsYWNlIGl0ZW1zIGluIHRoZSBkZXN0aW5hdGlvbiB0aGF0IGhhdmUgdGhlIHNhbWUgbmFtZSBhcyBpdGVtcyBiZWluZyBtb3ZlZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHBvc2l0aW9uZWRfYXQ6IEdpdmVzIGEgbGlzdCAoaW4gbG9jYWwgd2luZG93IGNvb3JkaW5hdGVzKSBvZiBwb3NpdGlvbnMgZm9yIHRoZSBkZXN0aW5hdGlvbiBpdGVtcworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHJvdXRpbmdfc3VwcHJlc3NlZDogU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRvIGF1dG9yb3V0ZSBpdGVtcyAoZGVmYXVsdCBpcyBmYWxzZSkuIE9ubHkgYXBwbGllcyB3aGVuIG1vdmluZyB0byB0aGUgc3lzdGVtIGZvbGRlci4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB0byB0aGUgb2JqZWN0KHMpIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIG1vdmVkCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdtb3ZlJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX21vdmUpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnYWxycCcsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdtdnBsJywgX0VudW1fbGlzdCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ3JvdXQnLCBfRW51bV9ib29sKQorCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9vcGVuID0geworICAgICAgICAndXNpbmcnIDogJ3VzaW4nLAorICAgICAgICAnd2l0aF9wcm9wZXJ0aWVzJyA6ICdwcmR0JywKKyAgICB9CisKKyAgICBkZWYgb3BlbihzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIib3BlbjogT3BlbiB0aGUgc3BlY2lmaWVkIG9iamVjdChzKQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogbGlzdCBvZiBvYmplY3RzIHRvIG9wZW4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB1c2luZzogdGhlIGFwcGxpY2F0aW9uIGZpbGUgdG8gb3BlbiB0aGUgb2JqZWN0IHdpdGgKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb3BlcnRpZXM6IHRoZSBpbml0aWFsIHZhbHVlcyBmb3IgdGhlIHByb3BlcnRpZXMsIHRvIGJlIGluY2x1ZGVkIHdpdGggdGhlIG9wZW4gY29tbWFuZCBzZW50IHRvIHRoZSBhcHBsaWNhdGlvbiB0aGF0IG9wZW5zIHRoZSBkaXJlY3Qgb2JqZWN0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ29kb2MnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfb3BlbikKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX3ByaW50XyA9IHsKKyAgICAgICAgJ3dpdGhfcHJvcGVydGllcycgOiAncHJkdCcsCisgICAgfQorCisgICAgZGVmIHByaW50XyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIicHJpbnQ6IFByaW50IHRoZSBzcGVjaWZpZWQgb2JqZWN0KHMpCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBsaXN0IG9mIG9iamVjdHMgdG8gcHJpbnQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb3BlcnRpZXM6IG9wdGlvbmFsIHByb3BlcnRpZXMgdG8gYmUgaW5jbHVkZWQgd2l0aCB0aGUgcHJpbnQgY29tbWFuZCBzZW50IHRvIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHByaW50cyB0aGUgZGlyZWN0IG9iamVjdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhZXZ0JworICAgICAgICBfc3ViY29kZSA9ICdwZG9jJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3ByaW50XykKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgcXVpdChzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJxdWl0OiBRdWl0IHRoZSBGaW5kZXIKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYWV2dCcKKyAgICAgICAgX3N1YmNvZGUgPSAncXVpdCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgc2VsZWN0KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzZWxlY3Q6IFNlbGVjdCB0aGUgc3BlY2lmaWVkIG9iamVjdChzKQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCB0byBzZWxlY3QKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnbWlzYycKKyAgICAgICAgX3N1YmNvZGUgPSAnc2xjdCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworX0VudW1fbGlzdCA9IE5vbmUgIyBYWFhYIGVudW0gbGlzdCBub3QgZm91bmQhIQorX0VudW1fYm9vbCA9IE5vbmUgIyBYWFhYIGVudW0gYm9vbCBub3QgZm91bmQhIQorCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9TdGFuZGFyZF9TdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvU3RhbmRhcmRfU3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZTJlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvU3RhbmRhcmRfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9TdGFuZGFyZF9TdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvU3RhbmRhcmRfU3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZTJlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvU3RhbmRhcmRfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9UeXBlX0RlZmluaXRpb25zLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL1R5cGVfRGVmaW5pdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U3ZDgxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9UeXBlX0RlZmluaXRpb25zLnB5CkBAIC0wLDAgKzEsMzQ2IEBACisiIiJTdWl0ZSBUeXBlIERlZmluaXRpb25zOiBEZWZpbml0aW9ucyBvZiByZWNvcmRzIHVzZWQgaW4gc2NyaXB0aW5nIHRoZSBGaW5kZXIKK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL0ZpbmRlci5hcHAKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDAvMTQ0LCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAndHBkZicKKworY2xhc3MgVHlwZV9EZWZpbml0aW9uc19FdmVudHM6CisKKyAgICBwYXNzCisKKworY2xhc3MgYWxpYXNfbGlzdChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImFsaWFzIGxpc3QgLSBBIGxpc3Qgb2YgYWxpYXNlcy4gIFVzZSBceGQ0YXMgYWxpYXMgbGlzdFx4ZDUgd2hlbiBhIGxpc3Qgb2YgYWxpYXNlcyBpcyBuZWVkZWQgKGluc3RlYWQgb2YgYSBsaXN0IG9mIGZpbGUgc3lzdGVtIGl0ZW0gcmVmZXJlbmNlcykuICIiIgorICAgIHdhbnQgPSAnYWxzdCcKKworY2xhc3MgbGFiZWwoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJsYWJlbCAtIChOT1QgQVZBSUxBQkxFIFlFVCkgQSBGaW5kZXIgbGFiZWwgKG5hbWUgYW5kIGNvbG9yKSAiIiIKKyAgICB3YW50ID0gJ2NsYmwnCitjbGFzcyBfUHJvcF9jb2xvcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY29sb3IgLSB0aGUgY29sb3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBsYWJlbCAiIiIKKyAgICB3aGljaCA9ICdjb2xyJworICAgIHdhbnQgPSAnY1JHQicKK2NsYXNzIF9Qcm9wX2luZGV4KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJpbmRleCAtIHRoZSBpbmRleCBpbiB0aGUgZnJvbnQtdG8tYmFjayBvcmRlcmluZyB3aXRoaW4gaXRzIGNvbnRhaW5lciAiIiIKKyAgICB3aGljaCA9ICdwaWR4JworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX25hbWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm5hbWUgLSB0aGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxhYmVsICIiIgorICAgIHdoaWNoID0gJ3BuYW0nCisgICAgd2FudCA9ICd1dHh0JworCitjbGFzcyBwcmVmZXJlbmNlcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInByZWZlcmVuY2VzIC0gKE5PVCBBVkFJTEFCTEUsIFNVQkpFQ1QgVE8gQ0hBTkdFKSBUaGUgRmluZGVyIFByZWZlcmVuY2VzICIiIgorICAgIHdhbnQgPSAnY3ByZicKK2NsYXNzIF9Qcm9wX2J1dHRvbl92aWV3X2FycmFuZ2VtZW50KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJidXR0b24gdmlldyBhcnJhbmdlbWVudCAtIHRoZSBtZXRob2Qgb2YgYXJyYW5nZW1lbnQgb2YgaWNvbnMgaW4gZGVmYXVsdCBGaW5kZXIgYnV0dG9uIHZpZXcgd2luZG93cyAiIiIKKyAgICB3aGljaCA9ICdiYXJyJworICAgIHdhbnQgPSAnZWFycicKK2NsYXNzIF9Qcm9wX2J1dHRvbl92aWV3X2ljb25fc2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiYnV0dG9uIHZpZXcgaWNvbiBzaXplIC0gdGhlIHNpemUgb2YgaWNvbnMgZGlzcGxheWVkIGluIEZpbmRlciBidXR0b24gdmlldyB3aW5kb3dzLiAiIiIKKyAgICB3aGljaCA9ICdiaXN6JworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX2NhbGN1bGF0ZXNfZm9sZGVyX3NpemVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjYWxjdWxhdGVzIGZvbGRlciBzaXplcyAtIEFyZSBmb2xkZXIgc2l6ZXMgY2FsY3VsYXRlZCBhbmQgZGlzcGxheWVkIGluIEZpbmRlciBsaXN0IHZpZXcgd2luZG93cz8gIiIiCisgICAgd2hpY2ggPSAnc2ZzeicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9kZWxheV9iZWZvcmVfc3ByaW5naW5nKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJkZWxheSBiZWZvcmUgc3ByaW5naW5nIC0gdGhlIGRlbGF5IGJlZm9yZSBzcHJpbmdpbmcgb3BlbiBhIGNvbnRhaW5lciBpbiB0aWNrcyAoMS82MHRoIG9mIGEgc2Vjb25kKSAoMTIgaXMgc2hvcnRlc3QgZGVsYXksIDYwIGlzIGxvbmdlc3QgZGVsYXkpICIiIgorICAgIHdoaWNoID0gJ2RlbGEnCisgICAgd2FudCA9ICdzaG9yJworY2xhc3MgX1Byb3BfbGlzdF92aWV3X2ljb25fc2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibGlzdCB2aWV3IGljb24gc2l6ZSAtIHRoZSBzaXplIG9mIGljb25zIGRpc3BsYXllZCBpbiBGaW5kZXIgbGlzdCB2aWV3IHdpbmRvd3MuICIiIgorICAgIHdoaWNoID0gJ2xpc3onCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3Bfc2hvd3NfY29tbWVudHMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNob3dzIGNvbW1lbnRzIC0gQXJlIGNvbW1lbnRzIGRpc3BsYXllZCBpbiBkZWZhdWx0IEZpbmRlciBsaXN0IHZpZXcgd2luZG93cz8gIiIiCisgICAgd2hpY2ggPSAnc2NvbScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9zaG93c19jcmVhdGlvbl9kYXRlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzaG93cyBjcmVhdGlvbiBkYXRlIC0gQXJlIGNyZWF0aW9uIGRhdGVzIGRpc3BsYXllZCBpbiBkZWZhdWx0IEZpbmRlciBsaXN0IHZpZXcgd2luZG93cz8gIiIiCisgICAgd2hpY2ggPSAnc2NkYScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9zaG93c19raW5kKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzaG93cyBraW5kIC0gQXJlIGRvY3VtZW50IGtpbmRzIGRpc3BsYXllZCBpbiBkZWZhdWx0IEZpbmRlciBsaXN0IHZpZXcgd2luZG93cz8gIiIiCisgICAgd2hpY2ggPSAnc2tuZCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9zaG93c19sYWJlbChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic2hvd3MgbGFiZWwgLSBBcmUgbGFiZWxzIGRpc3BsYXllZCBpbiBkZWZhdWx0IEZpbmRlciBsaXN0IHZpZXcgd2luZG93cz8gIiIiCisgICAgd2hpY2ggPSAnc2xibCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9zaG93c19tb2RpZmljYXRpb25fZGF0ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic2hvd3MgbW9kaWZpY2F0aW9uIGRhdGUgLSBBcmUgbW9kaWZpY2F0aW9uIGRhdGVzIGRpc3BsYXllZCBpbiBkZWZhdWx0IEZpbmRlciBsaXN0IHZpZXcgd2luZG93cz8gIiIiCisgICAgd2hpY2ggPSAnc2RhdCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9zaG93c19zaXplKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzaG93cyBzaXplIC0gQXJlIGZpbGUgc2l6ZXMgZGlzcGxheWVkIGluIGRlZmF1bHQgRmluZGVyIGxpc3QgdmlldyB3aW5kb3dzPyAiIiIKKyAgICB3aGljaCA9ICdzc2l6JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3Nob3dzX3ZlcnNpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNob3dzIHZlcnNpb24gLSBBcmUgZmlsZSB2ZXJzaW9ucyBkaXNwbGF5ZWQgaW4gZGVmYXVsdCBGaW5kZXIgbGlzdCB2aWV3IHdpbmRvd3M/ICIiIgorICAgIHdoaWNoID0gJ3N2cnMnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3Bfc3BhdGlhbF92aWV3X2FycmFuZ2VtZW50KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzcGF0aWFsIHZpZXcgYXJyYW5nZW1lbnQgLSB0aGUgbWV0aG9kIG9mIGFycmFuZ2VtZW50IG9mIGljb25zIGluIGRlZmF1bHQgRmluZGVyIHNwYXRpYWwgdmlldyB3aW5kb3dzICIiIgorICAgIHdoaWNoID0gJ2lhcnInCisgICAgd2FudCA9ICdlYXJyJworY2xhc3MgX1Byb3Bfc3BhdGlhbF92aWV3X2ljb25fc2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic3BhdGlhbCB2aWV3IGljb24gc2l6ZSAtIHRoZSBzaXplIG9mIGljb25zIGRpc3BsYXllZCBpbiBGaW5kZXIgc3BhdGlhbCB2aWV3IHdpbmRvd3MuICIiIgorICAgIHdoaWNoID0gJ2lpc3onCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3Bfc3ByaW5nX29wZW5fZm9sZGVycyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic3ByaW5nIG9wZW4gZm9sZGVycyAtIFNwcmluZyBvcGVuIGZvbGRlcnMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheT8gIiIiCisgICAgd2hpY2ggPSAnc3ByZycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF91c2VzX3JlbGF0aXZlX2RhdGVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ1c2VzIHJlbGF0aXZlIGRhdGVzIC0gQXJlIHJlbGF0aXZlIGRhdGVzIChlLmcuLCB0b2RheSwgeWVzdGVyZGF5KSBzaG93biAgaW4gRmluZGVyIGxpc3QgdmlldyB3aW5kb3dzPyAiIiIKKyAgICB3aGljaCA9ICd1cmR0JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3VzZXNfc2ltcGxlX21lbnVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ1c2VzIHNpbXBsZSBtZW51cyAtIFVzZSBzaW1wbGlmaWVkIEZpbmRlciBtZW51cz8gIiIiCisgICAgd2hpY2ggPSAndXNtZScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF91c2VzX3dpZGVfZ3JpZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidXNlcyB3aWRlIGdyaWQgLSBTcGFjZSBpY29ucyBvbiBhIHdpZGUgZ3JpZD8gIiIiCisgICAgd2hpY2ggPSAndXN3ZycKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF92aWV3X2ZvbnQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInZpZXcgZm9udCAtIHRoZSBpZCBvZiB0aGUgZm9udCB1c2VkIGluIEZpbmRlciB2aWV3cy4gIiIiCisgICAgd2hpY2ggPSAndmZudCcKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF92aWV3X2ZvbnRfc2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidmlldyBmb250IHNpemUgLSB0aGUgc2l6ZSBvZiB0aGUgZm9udCB1c2VkIGluIEZpbmRlciB2aWV3cyAiIiIKKyAgICB3aGljaCA9ICd2ZnN6JworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX3dpbmRvdyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIid2luZG93IC0gdGhlIHdpbmRvdyB0aGF0IHdvdWxkIG9wZW4gaWYgRmluZGVyIHByZWZlcmVuY2VzIHdhcyBvcGVuZWQgIiIiCisgICAgd2hpY2ggPSAnY3dpbicKKyAgICB3YW50ID0gJ3B3bmQnCisjICAgICAgICBlbGVtZW50ICdjbGJsJyBhcyBbJ2luZHgnLCAnbmFtZSddCisKK2NsYXNzIGljb25fdmlld19vcHRpb25zKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiaWNvbiB2aWV3IG9wdGlvbnMgLSB0aGUgaWNvbiB2aWV3IG9wdGlvbnMgIiIiCisgICAgd2FudCA9ICdpY29wJworCitfUHJvcF9hcnJhbmdlbWVudCA9IF9Qcm9wX3NwYXRpYWxfdmlld19hcnJhbmdlbWVudAorY2xhc3MgX1Byb3BfaWNvbl9zaXplKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJpY29uIHNpemUgLSB0aGUgc2l6ZSBvZiBpY29ucyBkaXNwbGF5ZWQgaW4gdGhlIGljb24gdmlldyAiIiIKKyAgICB3aGljaCA9ICdsdmlzJworICAgIHdhbnQgPSAnc2hvcicKKworY2xhc3MgaWNvbl9mYW1pbHkoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJpY29uIGZhbWlseSAtIChOT1QgQVZBSUxBQkxFIFlFVCkgQSBmYW1pbHkgb2YgaWNvbnMgIiIiCisgICAgd2FudCA9ICdpZmFtJworY2xhc3MgX1Byb3BfbGFyZ2VfMzJfYml0X2ljb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImxhcmdlIDMyIGJpdCBpY29uIC0gdGhlIGxhcmdlIDMyLWJpdCBjb2xvciBpY29uICIiIgorICAgIHdoaWNoID0gJ2lsMzInCisgICAgd2FudCA9ICdpbDMyJworY2xhc3MgX1Byb3BfbGFyZ2VfNF9iaXRfaWNvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibGFyZ2UgNCBiaXQgaWNvbiAtIHRoZSBsYXJnZSA0LWJpdCBjb2xvciBpY29uICIiIgorICAgIHdoaWNoID0gJ2ljbDQnCisgICAgd2FudCA9ICdpY2w0JworY2xhc3MgX1Byb3BfbGFyZ2VfOF9iaXRfaWNvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibGFyZ2UgOCBiaXQgaWNvbiAtIHRoZSBsYXJnZSA4LWJpdCBjb2xvciBpY29uICIiIgorICAgIHdoaWNoID0gJ2ljbDgnCisgICAgd2FudCA9ICdpY2w4JworY2xhc3MgX1Byb3BfbGFyZ2VfOF9iaXRfbWFzayhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibGFyZ2UgOCBiaXQgbWFzayAtIHRoZSBsYXJnZSA4LWJpdCBtYXNrIGZvciBsYXJnZSAzMi1iaXQgaWNvbnMgIiIiCisgICAgd2hpY2ggPSAnbDhtaycKKyAgICB3YW50ID0gJ2w4bWsnCitjbGFzcyBfUHJvcF9sYXJnZV9tb25vY2hyb21lX2ljb25fYW5kX21hc2soYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImxhcmdlIG1vbm9jaHJvbWUgaWNvbiBhbmQgbWFzayAtIHRoZSBsYXJnZSBibGFjay1hbmQtd2hpdGUgaWNvbiBhbmQgdGhlIG1hc2sgZm9yIGxhcmdlIGljb25zICIiIgorICAgIHdoaWNoID0gJ0lDTiMnCisgICAgd2FudCA9ICdJQ04jJworY2xhc3MgX1Byb3Bfc21hbGxfMzJfYml0X2ljb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNtYWxsIDMyIGJpdCBpY29uIC0gdGhlIHNtYWxsIDMyLWJpdCBjb2xvciBpY29uICIiIgorICAgIHdoaWNoID0gJ2lzMzInCisgICAgd2FudCA9ICdpczMyJworY2xhc3MgX1Byb3Bfc21hbGxfNF9iaXRfaWNvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic21hbGwgNCBiaXQgaWNvbiAtIHRoZSBzbWFsbCA0LWJpdCBjb2xvciBpY29uICIiIgorICAgIHdoaWNoID0gJ2ljczQnCisgICAgd2FudCA9ICdpY3M0JworY2xhc3MgX1Byb3Bfc21hbGxfOF9iaXRfaWNvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic21hbGwgOCBiaXQgaWNvbiAtIHRoZSBzbWFsbCA4LWJpdCBjb2xvciBpY29uICIiIgorICAgIHdoaWNoID0gJ2ljczgnCisgICAgd2FudCA9ICdpY3M4JworCitfUHJvcF9zbWFsbF84X2JpdF9tYXNrID0gX1Byb3Bfc21hbGxfOF9iaXRfaWNvbgorY2xhc3MgX1Byb3Bfc21hbGxfbW9ub2Nocm9tZV9pY29uX2FuZF9tYXNrKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzbWFsbCBtb25vY2hyb21lIGljb24gYW5kIG1hc2sgLSB0aGUgc21hbGwgYmxhY2stYW5kLXdoaXRlIGljb24gYW5kIHRoZSBtYXNrIGZvciBzbWFsbCBpY29ucyAiIiIKKyAgICB3aGljaCA9ICdpY3MjJworICAgIHdhbnQgPSAnaWNzIycKKworY2xhc3MgY29sdW1uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiY29sdW1uIC0gYSBjb2x1bW4gb2YgYSBsaXN0IHZpZXcgIiIiCisgICAgd2FudCA9ICdsdmNsJworY2xhc3MgX1Byb3Bfc29ydF9kaXJlY3Rpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNvcnQgZGlyZWN0aW9uIC0gVGhlIGRpcmVjdGlvbiBpbiB3aGljaCB0aGUgd2luZG93IGlzIHNvcnRlZCAiIiIKKyAgICB3aGljaCA9ICdzb3JkJworICAgIHdhbnQgPSAnc29kcicKK2NsYXNzIF9Qcm9wX3Zpc2libGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInZpc2libGUgLSBpcyB0aGlzIGNvbHVtbiB2aXNpYmxlICIiIgorICAgIHdoaWNoID0gJ3B2aXMnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3Bfd2lkdGgoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIndpZHRoIC0gdGhlIHdpZHRoIG9mIHRoaXMgY29sdW1uICIiIgorICAgIHdoaWNoID0gJ2Nsd2QnCisgICAgd2FudCA9ICdzaG9yJworCitjb2x1bW5zID0gY29sdW1uCisKK2NsYXNzIGxpc3Rfdmlld19vcHRpb25zKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIibGlzdCB2aWV3IG9wdGlvbnMgLSB0aGUgbGlzdCB2aWV3IG9wdGlvbnMgIiIiCisgICAgd2FudCA9ICdsdm9wJworY2xhc3MgX1Byb3Bfc29ydF9jb2x1bW4oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNvcnQgY29sdW1uIC0gdGhlIGNvbHVtbiB0aGF0IHRoZSBsaXN0IHZpZXcgaXMgc29ydGVkIG9uICIiIgorICAgIHdoaWNoID0gJ3NydGMnCisgICAgd2FudCA9ICdsdmNsJworIyAgICAgICAgZWxlbWVudCAnbHZjbCcgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KK2FsaWFzX2xpc3QuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCithbGlhc19saXN0Ll9wcml2cHJvcGRpY3QgPSB7Cit9CithbGlhc19saXN0Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitsYWJlbC5fc3VwZXJjbGFzc25hbWVzID0gW10KK2xhYmVsLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2NvbG9yJyA6IF9Qcm9wX2NvbG9yLAorICAgICdpbmRleCcgOiBfUHJvcF9pbmRleCwKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorfQorbGFiZWwuX3ByaXZlbGVtZGljdCA9IHsKK30KK3ByZWZlcmVuY2VzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorcHJlZmVyZW5jZXMuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnYnV0dG9uX3ZpZXdfYXJyYW5nZW1lbnQnIDogX1Byb3BfYnV0dG9uX3ZpZXdfYXJyYW5nZW1lbnQsCisgICAgJ2J1dHRvbl92aWV3X2ljb25fc2l6ZScgOiBfUHJvcF9idXR0b25fdmlld19pY29uX3NpemUsCisgICAgJ2NhbGN1bGF0ZXNfZm9sZGVyX3NpemVzJyA6IF9Qcm9wX2NhbGN1bGF0ZXNfZm9sZGVyX3NpemVzLAorICAgICdkZWxheV9iZWZvcmVfc3ByaW5naW5nJyA6IF9Qcm9wX2RlbGF5X2JlZm9yZV9zcHJpbmdpbmcsCisgICAgJ2xpc3Rfdmlld19pY29uX3NpemUnIDogX1Byb3BfbGlzdF92aWV3X2ljb25fc2l6ZSwKKyAgICAnc2hvd3NfY29tbWVudHMnIDogX1Byb3Bfc2hvd3NfY29tbWVudHMsCisgICAgJ3Nob3dzX2NyZWF0aW9uX2RhdGUnIDogX1Byb3Bfc2hvd3NfY3JlYXRpb25fZGF0ZSwKKyAgICAnc2hvd3Nfa2luZCcgOiBfUHJvcF9zaG93c19raW5kLAorICAgICdzaG93c19sYWJlbCcgOiBfUHJvcF9zaG93c19sYWJlbCwKKyAgICAnc2hvd3NfbW9kaWZpY2F0aW9uX2RhdGUnIDogX1Byb3Bfc2hvd3NfbW9kaWZpY2F0aW9uX2RhdGUsCisgICAgJ3Nob3dzX3NpemUnIDogX1Byb3Bfc2hvd3Nfc2l6ZSwKKyAgICAnc2hvd3NfdmVyc2lvbicgOiBfUHJvcF9zaG93c192ZXJzaW9uLAorICAgICdzcGF0aWFsX3ZpZXdfYXJyYW5nZW1lbnQnIDogX1Byb3Bfc3BhdGlhbF92aWV3X2FycmFuZ2VtZW50LAorICAgICdzcGF0aWFsX3ZpZXdfaWNvbl9zaXplJyA6IF9Qcm9wX3NwYXRpYWxfdmlld19pY29uX3NpemUsCisgICAgJ3NwcmluZ19vcGVuX2ZvbGRlcnMnIDogX1Byb3Bfc3ByaW5nX29wZW5fZm9sZGVycywKKyAgICAndXNlc19yZWxhdGl2ZV9kYXRlcycgOiBfUHJvcF91c2VzX3JlbGF0aXZlX2RhdGVzLAorICAgICd1c2VzX3NpbXBsZV9tZW51cycgOiBfUHJvcF91c2VzX3NpbXBsZV9tZW51cywKKyAgICAndXNlc193aWRlX2dyaWQnIDogX1Byb3BfdXNlc193aWRlX2dyaWQsCisgICAgJ3ZpZXdfZm9udCcgOiBfUHJvcF92aWV3X2ZvbnQsCisgICAgJ3ZpZXdfZm9udF9zaXplJyA6IF9Qcm9wX3ZpZXdfZm9udF9zaXplLAorICAgICd3aW5kb3cnIDogX1Byb3Bfd2luZG93LAorfQorcHJlZmVyZW5jZXMuX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnbGFiZWwnIDogbGFiZWwsCit9CitpY29uX3ZpZXdfb3B0aW9ucy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2ljb25fdmlld19vcHRpb25zLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2FycmFuZ2VtZW50JyA6IF9Qcm9wX2FycmFuZ2VtZW50LAorICAgICdpY29uX3NpemUnIDogX1Byb3BfaWNvbl9zaXplLAorfQoraWNvbl92aWV3X29wdGlvbnMuX3ByaXZlbGVtZGljdCA9IHsKK30KK2ljb25fZmFtaWx5Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQoraWNvbl9mYW1pbHkuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnbGFyZ2VfMzJfYml0X2ljb24nIDogX1Byb3BfbGFyZ2VfMzJfYml0X2ljb24sCisgICAgJ2xhcmdlXzRfYml0X2ljb24nIDogX1Byb3BfbGFyZ2VfNF9iaXRfaWNvbiwKKyAgICAnbGFyZ2VfOF9iaXRfaWNvbicgOiBfUHJvcF9sYXJnZV84X2JpdF9pY29uLAorICAgICdsYXJnZV84X2JpdF9tYXNrJyA6IF9Qcm9wX2xhcmdlXzhfYml0X21hc2ssCisgICAgJ2xhcmdlX21vbm9jaHJvbWVfaWNvbl9hbmRfbWFzaycgOiBfUHJvcF9sYXJnZV9tb25vY2hyb21lX2ljb25fYW5kX21hc2ssCisgICAgJ3NtYWxsXzMyX2JpdF9pY29uJyA6IF9Qcm9wX3NtYWxsXzMyX2JpdF9pY29uLAorICAgICdzbWFsbF80X2JpdF9pY29uJyA6IF9Qcm9wX3NtYWxsXzRfYml0X2ljb24sCisgICAgJ3NtYWxsXzhfYml0X2ljb24nIDogX1Byb3Bfc21hbGxfOF9iaXRfaWNvbiwKKyAgICAnc21hbGxfOF9iaXRfbWFzaycgOiBfUHJvcF9zbWFsbF84X2JpdF9tYXNrLAorICAgICdzbWFsbF9tb25vY2hyb21lX2ljb25fYW5kX21hc2snIDogX1Byb3Bfc21hbGxfbW9ub2Nocm9tZV9pY29uX2FuZF9tYXNrLAorfQoraWNvbl9mYW1pbHkuX3ByaXZlbGVtZGljdCA9IHsKK30KK2NvbHVtbi5fc3VwZXJjbGFzc25hbWVzID0gW10KK2NvbHVtbi5fcHJpdnByb3BkaWN0ID0geworICAgICdpbmRleCcgOiBfUHJvcF9pbmRleCwKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorICAgICdzb3J0X2RpcmVjdGlvbicgOiBfUHJvcF9zb3J0X2RpcmVjdGlvbiwKKyAgICAndmlzaWJsZScgOiBfUHJvcF92aXNpYmxlLAorICAgICd3aWR0aCcgOiBfUHJvcF93aWR0aCwKK30KK2NvbHVtbi5fcHJpdmVsZW1kaWN0ID0geworfQorbGlzdF92aWV3X29wdGlvbnMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitsaXN0X3ZpZXdfb3B0aW9ucy5fcHJpdnByb3BkaWN0ID0geworICAgICdjYWxjdWxhdGVzX2ZvbGRlcl9zaXplcycgOiBfUHJvcF9jYWxjdWxhdGVzX2ZvbGRlcl9zaXplcywKKyAgICAnaWNvbl9zaXplJyA6IF9Qcm9wX2ljb25fc2l6ZSwKKyAgICAnc29ydF9jb2x1bW4nIDogX1Byb3Bfc29ydF9jb2x1bW4sCisgICAgJ3VzZXNfcmVsYXRpdmVfZGF0ZXMnIDogX1Byb3BfdXNlc19yZWxhdGl2ZV9kYXRlcywKK30KK2xpc3Rfdmlld19vcHRpb25zLl9wcml2ZWxlbWRpY3QgPSB7CisgICAgJ2NvbHVtbicgOiBjb2x1bW4sCit9CisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdhbHN0JyA6IGFsaWFzX2xpc3QsCisgICAgJ2NsYmwnIDogbGFiZWwsCisgICAgJ2NwcmYnIDogcHJlZmVyZW5jZXMsCisgICAgJ2ljb3AnIDogaWNvbl92aWV3X29wdGlvbnMsCisgICAgJ2lmYW0nIDogaWNvbl9mYW1pbHksCisgICAgJ2x2Y2wnIDogY29sdW1uLAorICAgICdsdm9wJyA6IGxpc3Rfdmlld19vcHRpb25zLAorfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKKyAgICAnSUNOIycgOiBfUHJvcF9sYXJnZV9tb25vY2hyb21lX2ljb25fYW5kX21hc2ssCisgICAgJ2JhcnInIDogX1Byb3BfYnV0dG9uX3ZpZXdfYXJyYW5nZW1lbnQsCisgICAgJ2Jpc3onIDogX1Byb3BfYnV0dG9uX3ZpZXdfaWNvbl9zaXplLAorICAgICdjbHdkJyA6IF9Qcm9wX3dpZHRoLAorICAgICdjb2xyJyA6IF9Qcm9wX2NvbG9yLAorICAgICdjd2luJyA6IF9Qcm9wX3dpbmRvdywKKyAgICAnZGVsYScgOiBfUHJvcF9kZWxheV9iZWZvcmVfc3ByaW5naW5nLAorICAgICdpYXJyJyA6IF9Qcm9wX3NwYXRpYWxfdmlld19hcnJhbmdlbWVudCwKKyAgICAnaWNsNCcgOiBfUHJvcF9sYXJnZV80X2JpdF9pY29uLAorICAgICdpY2w4JyA6IF9Qcm9wX2xhcmdlXzhfYml0X2ljb24sCisgICAgJ2ljcyMnIDogX1Byb3Bfc21hbGxfbW9ub2Nocm9tZV9pY29uX2FuZF9tYXNrLAorICAgICdpY3M0JyA6IF9Qcm9wX3NtYWxsXzRfYml0X2ljb24sCisgICAgJ2ljczgnIDogX1Byb3Bfc21hbGxfOF9iaXRfaWNvbiwKKyAgICAnaWlzeicgOiBfUHJvcF9zcGF0aWFsX3ZpZXdfaWNvbl9zaXplLAorICAgICdpbDMyJyA6IF9Qcm9wX2xhcmdlXzMyX2JpdF9pY29uLAorICAgICdpczMyJyA6IF9Qcm9wX3NtYWxsXzMyX2JpdF9pY29uLAorICAgICdsOG1rJyA6IF9Qcm9wX2xhcmdlXzhfYml0X21hc2ssCisgICAgJ2xpc3onIDogX1Byb3BfbGlzdF92aWV3X2ljb25fc2l6ZSwKKyAgICAnbHZpcycgOiBfUHJvcF9pY29uX3NpemUsCisgICAgJ3BpZHgnIDogX1Byb3BfaW5kZXgsCisgICAgJ3BuYW0nIDogX1Byb3BfbmFtZSwKKyAgICAncHZpcycgOiBfUHJvcF92aXNpYmxlLAorICAgICdzY2RhJyA6IF9Qcm9wX3Nob3dzX2NyZWF0aW9uX2RhdGUsCisgICAgJ3Njb20nIDogX1Byb3Bfc2hvd3NfY29tbWVudHMsCisgICAgJ3NkYXQnIDogX1Byb3Bfc2hvd3NfbW9kaWZpY2F0aW9uX2RhdGUsCisgICAgJ3Nmc3onIDogX1Byb3BfY2FsY3VsYXRlc19mb2xkZXJfc2l6ZXMsCisgICAgJ3NrbmQnIDogX1Byb3Bfc2hvd3Nfa2luZCwKKyAgICAnc2xibCcgOiBfUHJvcF9zaG93c19sYWJlbCwKKyAgICAnc29yZCcgOiBfUHJvcF9zb3J0X2RpcmVjdGlvbiwKKyAgICAnc3ByZycgOiBfUHJvcF9zcHJpbmdfb3Blbl9mb2xkZXJzLAorICAgICdzcnRjJyA6IF9Qcm9wX3NvcnRfY29sdW1uLAorICAgICdzc2l6JyA6IF9Qcm9wX3Nob3dzX3NpemUsCisgICAgJ3N2cnMnIDogX1Byb3Bfc2hvd3NfdmVyc2lvbiwKKyAgICAndXJkdCcgOiBfUHJvcF91c2VzX3JlbGF0aXZlX2RhdGVzLAorICAgICd1c21lJyA6IF9Qcm9wX3VzZXNfc2ltcGxlX21lbnVzLAorICAgICd1c3dnJyA6IF9Qcm9wX3VzZXNfd2lkZV9ncmlkLAorICAgICd2Zm50JyA6IF9Qcm9wX3ZpZXdfZm9udCwKKyAgICAndmZzeicgOiBfUHJvcF92aWV3X2ZvbnRfc2l6ZSwKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL1R5cGVfRGVmaW5pdGlvbnMucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL1R5cGVfRGVmaW5pdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDE1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvVHlwZV9EZWZpbml0aW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL1R5cGVfRGVmaW5pdGlvbnMucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL1R5cGVfRGVmaW5pdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDE1YmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvVHlwZV9EZWZpbml0aW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL1dpbmRvd19jbGFzc2VzLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL1dpbmRvd19jbGFzc2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Njk2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvV2luZG93X2NsYXNzZXMucHkKQEAgLTAsMCArMSwyMjkgQEAKKyIiIlN1aXRlIFdpbmRvdyBjbGFzc2VzOiBDbGFzc2VzIHJlcHJlc2VudGluZyB3aW5kb3dzCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9GaW5kZXIuYXBwCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAwLzE0NCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ2ZuZHInCisKK2NsYXNzIFdpbmRvd19jbGFzc2VzX0V2ZW50czoKKworICAgIHBhc3MKKworCitjbGFzcyBGaW5kZXJfd2luZG93KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiRmluZGVyIHdpbmRvdyAtIEEgZmlsZSB2aWV3ZXIgd2luZG93ICIiIgorICAgIHdhbnQgPSAnYnJvdycKK2NsYXNzIF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIjxJbmhlcml0YW5jZT4gLSBpbmhlcml0cyBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzIGZyb20gdGhlIHdpbmRvdyBjbGFzcyAiIiIKKyAgICB3aGljaCA9ICdjQCNeJworICAgIHdhbnQgPSAnY3dpbicKK2NsYXNzIF9Qcm9wX2N1cnJlbnRfdmlldyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY3VycmVudCB2aWV3IC0gdGhlIGN1cnJlbnQgdmlldyBmb3IgdGhlIGNvbnRhaW5lciB3aW5kb3cgIiIiCisgICAgd2hpY2ggPSAncHZldycKKyAgICB3YW50ID0gJ2VjdncnCitjbGFzcyBfUHJvcF9pY29uX3ZpZXdfb3B0aW9ucyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaWNvbiB2aWV3IG9wdGlvbnMgLSB0aGUgaWNvbiB2aWV3IG9wdGlvbnMgZm9yIHRoZSBjb250YWluZXIgd2luZG93ICIiIgorICAgIHdoaWNoID0gJ2ljb3AnCisgICAgd2FudCA9ICdpY29wJworY2xhc3MgX1Byb3BfbGlzdF92aWV3X29wdGlvbnMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImxpc3QgdmlldyBvcHRpb25zIC0gdGhlIGxpc3QgdmlldyBvcHRpb25zIGZvciB0aGUgY29udGFpbmVyIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdsdm9wJworICAgIHdhbnQgPSAnbHZvcCcKK2NsYXNzIF9Qcm9wX3RhcmdldChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidGFyZ2V0IC0gdGhlIGNvbnRhaW5lciBhdCB3aGljaCB0aGlzIGZpbGUgdmlld2VyIGlzIHRhcmdldGVkICIiIgorICAgIHdoaWNoID0gJ2Z2dGcnCisgICAgd2FudCA9ICdvYmogJworCitGaW5kZXJfd2luZG93cyA9IEZpbmRlcl93aW5kb3cKKworY2xhc3Mgd2luZG93KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIid2luZG93IC0gQSB3aW5kb3cgIiIiCisgICAgd2FudCA9ICdjd2luJworY2xhc3MgX1Byb3BfYm91bmRzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJib3VuZHMgLSB0aGUgYm91bmRhcnkgcmVjdGFuZ2xlIGZvciB0aGUgd2luZG93ICIiIgorICAgIHdoaWNoID0gJ3BibmQnCisgICAgd2FudCA9ICdxZHJ0JworY2xhc3MgX1Byb3BfY2xvc2VhYmxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjbG9zZWFibGUgLSBEb2VzIHRoZSB3aW5kb3cgaGF2ZSBhIGNsb3NlIGJveD8gIiIiCisgICAgd2hpY2ggPSAnaGNsYicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9jb2xsYXBzZWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNvbGxhcHNlZCAtIElzIHRoZSB3aW5kb3cgY29sbGFwc2VkICIiIgorICAgIHdoaWNoID0gJ3dzaGQnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfZmxvYXRpbmcoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZsb2F0aW5nIC0gRG9lcyB0aGUgd2luZG93IGhhdmUgYSB0aXRsZSBiYXI/ICIiIgorICAgIHdoaWNoID0gJ2lzZmwnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfaWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImlkIC0gdGhlIHVuaXF1ZSBpZCBmb3IgdGhpcyB3aW5kb3cgIiIiCisgICAgd2hpY2ggPSAnSUQgICcKKyAgICB3YW50ID0gJ21hZ24nCitjbGFzcyBfUHJvcF9pbmRleChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaW5kZXggLSB0aGUgbnVtYmVyIG9mIHRoZSB3aW5kb3cgaW4gdGhlIGZyb250LXRvLWJhY2sgbGF5ZXIgb3JkZXJpbmcgIiIiCisgICAgd2hpY2ggPSAncGlkeCcKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF9tb2RhbChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibW9kYWwgLSBJcyB0aGUgd2luZG93IG1vZGFsPyAiIiIKKyAgICB3aGljaCA9ICdwbW9kJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX25hbWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgd2luZG93ICIiIgorICAgIHdoaWNoID0gJ3BuYW0nCisgICAgd2FudCA9ICd1dHh0JworY2xhc3MgX1Byb3BfcG9zaXRpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInBvc2l0aW9uIC0gdGhlIHVwcGVyIGxlZnQgcG9zaXRpb24gb2YgdGhlIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdwb3NuJworICAgIHdhbnQgPSAnUURwdCcKK2NsYXNzIF9Qcm9wX3Byb3BlcnRpZXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInByb3BlcnRpZXMgLSBldmVyeSBwcm9wZXJ0eSBvZiBhIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdwQUxMJworICAgIHdhbnQgPSAncmVjbycKK2NsYXNzIF9Qcm9wX3Jlc2l6YWJsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicmVzaXphYmxlIC0gSXMgdGhlIHdpbmRvdyByZXNpemFibGU/ICIiIgorICAgIHdoaWNoID0gJ3Byc3onCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfdGl0bGVkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ0aXRsZWQgLSBEb2VzIHRoZSB3aW5kb3cgaGF2ZSBhIHRpdGxlIGJhcj8gIiIiCisgICAgd2hpY2ggPSAncHRpdCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF92aXNpYmxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ2aXNpYmxlIC0gSXMgdGhlIHdpbmRvdyB2aXNpYmxlIChhbHdheXMgdHJ1ZSBmb3Igb3BlbiBGaW5kZXIgd2luZG93cyk/ICIiIgorICAgIHdoaWNoID0gJ3B2aXMnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3Bfem9vbWFibGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInpvb21hYmxlIC0gSXMgdGhlIHdpbmRvdyB6b29tYWJsZT8gIiIiCisgICAgd2hpY2ggPSAnaXN6bScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF96b29tZWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInpvb21lZCAtIElzIHRoZSB3aW5kb3cgem9vbWVkPyAiIiIKKyAgICB3aGljaCA9ICdwenVtJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3pvb21lZF9mdWxsX3NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInpvb21lZCBmdWxsIHNpemUgLSBJcyB0aGUgd2luZG93IHpvb21lZCB0byB0aGUgZnVsbCBzaXplIG9mIHRoZSBzY3JlZW4/IChjYW4gb25seSBiZSBzZXQsIG5vdCByZWFkKSAiIiIKKyAgICB3aGljaCA9ICd6dW1mJworICAgIHdhbnQgPSAnYm9vbCcKKword2luZG93cyA9IHdpbmRvdworCitjbGFzcyBpbmZvcm1hdGlvbl93aW5kb3coYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJpbmZvcm1hdGlvbiB3aW5kb3cgLSBBbiBpbnNwZWN0b3Igd2luZG93IChvcGVuZWQgYnkgXHhkMlNob3cgSW5mb1x4ZDMpICIiIgorICAgIHdhbnQgPSAnaXduZCcKK2NsYXNzIF9Qcm9wX2N1cnJlbnRfcGFuZWwoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImN1cnJlbnQgcGFuZWwgLSB0aGUgY3VycmVudCBwYW5lbCBpbiB0aGUgaW5mb3JtYXRpb24gd2luZG93ICIiIgorICAgIHdoaWNoID0gJ3BhbmwnCisgICAgd2FudCA9ICdpcG5sJworY2xhc3MgX1Byb3BfaXRlbShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaXRlbSAtIHRoZSBpdGVtIGZyb20gd2hpY2ggdGhpcyB3aW5kb3cgd2FzIG9wZW5lZCAiIiIKKyAgICB3aGljaCA9ICdjb2JqJworICAgIHdhbnQgPSAnb2JqICcKKworY2xhc3MgY2xpcHBpbmdfd2luZG93KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiY2xpcHBpbmcgd2luZG93IC0gVGhlIHdpbmRvdyBjb250YWluaW5nIGEgY2xpcHBpbmcgIiIiCisgICAgd2FudCA9ICdsd25kJworCitjbGlwcGluZ193aW5kb3dzID0gY2xpcHBpbmdfd2luZG93CisKK2NsYXNzIHByZWZlcmVuY2VzX3dpbmRvdyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInByZWZlcmVuY2VzIHdpbmRvdyAtIChOT1QgQVZBSUxBQkxFIFlFVCkgVGhlIEZpbmRlciBQcmVmZXJlbmNlcyB3aW5kb3cgIiIiCisgICAgd2FudCA9ICdwd25kJworRmluZGVyX3dpbmRvdy5fc3VwZXJjbGFzc25hbWVzID0gWyd3aW5kb3cnXQorRmluZGVyX3dpbmRvdy5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2N1cnJlbnRfdmlldycgOiBfUHJvcF9jdXJyZW50X3ZpZXcsCisgICAgJ2ljb25fdmlld19vcHRpb25zJyA6IF9Qcm9wX2ljb25fdmlld19vcHRpb25zLAorICAgICdsaXN0X3ZpZXdfb3B0aW9ucycgOiBfUHJvcF9saXN0X3ZpZXdfb3B0aW9ucywKKyAgICAndGFyZ2V0JyA6IF9Qcm9wX3RhcmdldCwKK30KK0ZpbmRlcl93aW5kb3cuX3ByaXZlbGVtZGljdCA9IHsKK30KK3dpbmRvdy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3dpbmRvdy5fcHJpdnByb3BkaWN0ID0geworICAgICdib3VuZHMnIDogX1Byb3BfYm91bmRzLAorICAgICdjbG9zZWFibGUnIDogX1Byb3BfY2xvc2VhYmxlLAorICAgICdjb2xsYXBzZWQnIDogX1Byb3BfY29sbGFwc2VkLAorICAgICdmbG9hdGluZycgOiBfUHJvcF9mbG9hdGluZywKKyAgICAnaWQnIDogX1Byb3BfaWQsCisgICAgJ2luZGV4JyA6IF9Qcm9wX2luZGV4LAorICAgICdtb2RhbCcgOiBfUHJvcF9tb2RhbCwKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorICAgICdwb3NpdGlvbicgOiBfUHJvcF9wb3NpdGlvbiwKKyAgICAncHJvcGVydGllcycgOiBfUHJvcF9wcm9wZXJ0aWVzLAorICAgICdyZXNpemFibGUnIDogX1Byb3BfcmVzaXphYmxlLAorICAgICd0aXRsZWQnIDogX1Byb3BfdGl0bGVkLAorICAgICd2aXNpYmxlJyA6IF9Qcm9wX3Zpc2libGUsCisgICAgJ3pvb21hYmxlJyA6IF9Qcm9wX3pvb21hYmxlLAorICAgICd6b29tZWQnIDogX1Byb3Bfem9vbWVkLAorICAgICd6b29tZWRfZnVsbF9zaXplJyA6IF9Qcm9wX3pvb21lZF9mdWxsX3NpemUsCit9Cit3aW5kb3cuX3ByaXZlbGVtZGljdCA9IHsKK30KK2luZm9ybWF0aW9uX3dpbmRvdy5fc3VwZXJjbGFzc25hbWVzID0gWyd3aW5kb3cnXQoraW5mb3JtYXRpb25fd2luZG93Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnY3VycmVudF9wYW5lbCcgOiBfUHJvcF9jdXJyZW50X3BhbmVsLAorICAgICdpdGVtJyA6IF9Qcm9wX2l0ZW0sCit9CitpbmZvcm1hdGlvbl93aW5kb3cuX3ByaXZlbGVtZGljdCA9IHsKK30KK2NsaXBwaW5nX3dpbmRvdy5fc3VwZXJjbGFzc25hbWVzID0gWyd3aW5kb3cnXQorY2xpcHBpbmdfd2luZG93Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKK30KK2NsaXBwaW5nX3dpbmRvdy5fcHJpdmVsZW1kaWN0ID0geworfQorcHJlZmVyZW5jZXNfd2luZG93Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ3dpbmRvdyddCitwcmVmZXJlbmNlc193aW5kb3cuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdjdXJyZW50X3BhbmVsJyA6IF9Qcm9wX2N1cnJlbnRfcGFuZWwsCit9CitwcmVmZXJlbmNlc193aW5kb3cuX3ByaXZlbGVtZGljdCA9IHsKK30KKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2Jyb3cnIDogRmluZGVyX3dpbmRvdywKKyAgICAnY3dpbicgOiB3aW5kb3csCisgICAgJ2l3bmQnIDogaW5mb3JtYXRpb25fd2luZG93LAorICAgICdsd25kJyA6IGNsaXBwaW5nX3dpbmRvdywKKyAgICAncHduZCcgOiBwcmVmZXJlbmNlc193aW5kb3csCit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworICAgICdJRCAgJyA6IF9Qcm9wX2lkLAorICAgICdjQCNeJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2NvYmonIDogX1Byb3BfaXRlbSwKKyAgICAnZnZ0ZycgOiBfUHJvcF90YXJnZXQsCisgICAgJ2hjbGInIDogX1Byb3BfY2xvc2VhYmxlLAorICAgICdpY29wJyA6IF9Qcm9wX2ljb25fdmlld19vcHRpb25zLAorICAgICdpc2ZsJyA6IF9Qcm9wX2Zsb2F0aW5nLAorICAgICdpc3ptJyA6IF9Qcm9wX3pvb21hYmxlLAorICAgICdsdm9wJyA6IF9Qcm9wX2xpc3Rfdmlld19vcHRpb25zLAorICAgICdwQUxMJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCisgICAgJ3BhbmwnIDogX1Byb3BfY3VycmVudF9wYW5lbCwKKyAgICAncGJuZCcgOiBfUHJvcF9ib3VuZHMsCisgICAgJ3BpZHgnIDogX1Byb3BfaW5kZXgsCisgICAgJ3Btb2QnIDogX1Byb3BfbW9kYWwsCisgICAgJ3BuYW0nIDogX1Byb3BfbmFtZSwKKyAgICAncG9zbicgOiBfUHJvcF9wb3NpdGlvbiwKKyAgICAncHJzeicgOiBfUHJvcF9yZXNpemFibGUsCisgICAgJ3B0aXQnIDogX1Byb3BfdGl0bGVkLAorICAgICdwdmV3JyA6IF9Qcm9wX2N1cnJlbnRfdmlldywKKyAgICAncHZpcycgOiBfUHJvcF92aXNpYmxlLAorICAgICdwenVtJyA6IF9Qcm9wX3pvb21lZCwKKyAgICAnd3NoZCcgOiBfUHJvcF9jb2xsYXBzZWQsCisgICAgJ3p1bWYnIDogX1Byb3Bfem9vbWVkX2Z1bGxfc2l6ZSwKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL1dpbmRvd19jbGFzc2VzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9XaW5kb3dfY2xhc3Nlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4ODI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9XaW5kb3dfY2xhc3Nlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL1dpbmRvd19jbGFzc2VzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9XaW5kb3dfY2xhc3Nlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4ODI3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9XaW5kb3dfY2xhc3Nlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRmluZGVyL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZDE3OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvX19pbml0X18ucHkKQEAgLTAsMCArMSwyMzcgQEAKKyIiIgorUGFja2FnZSBnZW5lcmF0ZWQgZnJvbSAvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL0ZpbmRlci5hcHAKKyIiIgorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIEZpbmRlciBwYWNrYWdlIGlzIHJlbW92ZWQuIiwgc3RhY2tsZXZlbD0yKQorCitpbXBvcnQgYWV0b29scworRXJyb3IgPSBhZXRvb2xzLkVycm9yCitpbXBvcnQgU3RhbmRhcmRfU3VpdGUKK2ltcG9ydCBMZWdhY3lfc3VpdGUKK2ltcG9ydCBDb250YWluZXJzX2FuZF9mb2xkZXJzCitpbXBvcnQgRmlsZXMKK2ltcG9ydCBGaW5kZXJfQmFzaWNzCitpbXBvcnQgRmluZGVyX2l0ZW1zCitpbXBvcnQgV2luZG93X2NsYXNzZXMKK2ltcG9ydCBUeXBlX0RlZmluaXRpb25zCitpbXBvcnQgRW51bWVyYXRpb25zCisKKworX2NvZGVfdG9fbW9kdWxlID0geworICAgICdDb1JlJyA6IFN0YW5kYXJkX1N1aXRlLAorICAgICdmbGVnJyA6IExlZ2FjeV9zdWl0ZSwKKyAgICAnZm5kcicgOiBDb250YWluZXJzX2FuZF9mb2xkZXJzLAorICAgICdmbmRyJyA6IEZpbGVzLAorICAgICdmbmRyJyA6IEZpbmRlcl9CYXNpY3MsCisgICAgJ2ZuZHInIDogRmluZGVyX2l0ZW1zLAorICAgICdmbmRyJyA6IFdpbmRvd19jbGFzc2VzLAorICAgICd0cGRmJyA6IFR5cGVfRGVmaW5pdGlvbnMsCisgICAgJ3Rwbm0nIDogRW51bWVyYXRpb25zLAorfQorCisKKworX2NvZGVfdG9fZnVsbG5hbWUgPSB7CisgICAgJ0NvUmUnIDogKCdGaW5kZXIuU3RhbmRhcmRfU3VpdGUnLCAnU3RhbmRhcmRfU3VpdGUnKSwKKyAgICAnZmxlZycgOiAoJ0ZpbmRlci5MZWdhY3lfc3VpdGUnLCAnTGVnYWN5X3N1aXRlJyksCisgICAgJ2ZuZHInIDogKCdGaW5kZXIuQ29udGFpbmVyc19hbmRfZm9sZGVycycsICdDb250YWluZXJzX2FuZF9mb2xkZXJzJyksCisgICAgJ2ZuZHInIDogKCdGaW5kZXIuRmlsZXMnLCAnRmlsZXMnKSwKKyAgICAnZm5kcicgOiAoJ0ZpbmRlci5GaW5kZXJfQmFzaWNzJywgJ0ZpbmRlcl9CYXNpY3MnKSwKKyAgICAnZm5kcicgOiAoJ0ZpbmRlci5GaW5kZXJfaXRlbXMnLCAnRmluZGVyX2l0ZW1zJyksCisgICAgJ2ZuZHInIDogKCdGaW5kZXIuV2luZG93X2NsYXNzZXMnLCAnV2luZG93X2NsYXNzZXMnKSwKKyAgICAndHBkZicgOiAoJ0ZpbmRlci5UeXBlX0RlZmluaXRpb25zJywgJ1R5cGVfRGVmaW5pdGlvbnMnKSwKKyAgICAndHBubScgOiAoJ0ZpbmRlci5FbnVtZXJhdGlvbnMnLCAnRW51bWVyYXRpb25zJyksCit9CisKK2Zyb20gU3RhbmRhcmRfU3VpdGUgaW1wb3J0ICoKK2Zyb20gTGVnYWN5X3N1aXRlIGltcG9ydCAqCitmcm9tIENvbnRhaW5lcnNfYW5kX2ZvbGRlcnMgaW1wb3J0ICoKK2Zyb20gRmlsZXMgaW1wb3J0ICoKK2Zyb20gRmluZGVyX0Jhc2ljcyBpbXBvcnQgKgorZnJvbSBGaW5kZXJfaXRlbXMgaW1wb3J0ICoKK2Zyb20gV2luZG93X2NsYXNzZXMgaW1wb3J0ICoKK2Zyb20gVHlwZV9EZWZpbml0aW9ucyBpbXBvcnQgKgorZnJvbSBFbnVtZXJhdGlvbnMgaW1wb3J0ICoKKworZGVmIGdldGJhc2VjbGFzc2VzKHYpOgorICAgIGlmIG5vdCBnZXRhdHRyKHYsICdfcHJvcGRpY3QnLCBOb25lKToKKyAgICAgICAgdi5fcHJvcGRpY3QgPSB7fQorICAgICAgICB2Ll9lbGVtZGljdCA9IHt9CisgICAgICAgIGZvciBzdXBlcmNsYXNzbmFtZSBpbiBnZXRhdHRyKHYsICdfc3VwZXJjbGFzc25hbWVzJywgW10pOgorICAgICAgICAgICAgc3VwZXJjbGFzcyA9IGV2YWwoc3VwZXJjbGFzc25hbWUpCisgICAgICAgICAgICBnZXRiYXNlY2xhc3NlcyhzdXBlcmNsYXNzKQorICAgICAgICAgICAgdi5fcHJvcGRpY3QudXBkYXRlKGdldGF0dHIoc3VwZXJjbGFzcywgJ19wcm9wZGljdCcsIHt9KSkKKyAgICAgICAgICAgIHYuX2VsZW1kaWN0LnVwZGF0ZShnZXRhdHRyKHN1cGVyY2xhc3MsICdfZWxlbWRpY3QnLCB7fSkpCisgICAgICAgIHYuX3Byb3BkaWN0LnVwZGF0ZShnZXRhdHRyKHYsICdfcHJpdnByb3BkaWN0Jywge30pKQorICAgICAgICB2Ll9lbGVtZGljdC51cGRhdGUoZ2V0YXR0cih2LCAnX3ByaXZlbGVtZGljdCcsIHt9KSkKKworaW1wb3J0IFN0ZFN1aXRlcworCisjCisjIFNldCBwcm9wZXJ0eSBhbmQgZWxlbWVudCBkaWN0aW9uYXJpZXMgbm93IHRoYXQgYWxsIGNsYXNzZXMgaGF2ZSBiZWVuIGRlZmluZWQKKyMKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLnNtYWxsX2ludGVnZXIpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5zeXN0ZW1fZGljdGlvbmFyeSkKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLmNvbG9yX3RhYmxlKQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUuZml4ZWRfcG9pbnQpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5zdHJpbmcpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS50eXBlX2VsZW1lbnRfaW5mbykKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLm1hY2hpbmVfbG9jYXRpb24pCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5Qb3N0U2NyaXB0X3BpY3R1cmUpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS50eXBlX3Byb3BlcnR5X2luZm8pCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5tZW51X2l0ZW0pCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5zY3JhcF9zdHlsZXMpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5maXhlZF9yZWN0YW5nbGUpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5udWxsKQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUudHlwZV9ldmVudF9pbmZvKQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUucm90YXRpb24pCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5sb25nX2ZpeGVkX3JlY3RhbmdsZSkKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLmxvbmdfcG9pbnQpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS50YXJnZXRfaWQpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS50eXBlX3N1aXRlX2luZm8pCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS50eXBlX3BhcmFtZXRlcl9pbmZvKQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUubG9uZ19maXhlZF9wb2ludCkKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLmJvdW5kaW5nX3JlY3RhbmdsZSkKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLlRJRkZfcGljdHVyZSkKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLmxvbmdfZml4ZWQpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS52ZXJzaW9uKQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUuUkdCMTZfY29sb3IpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5kb3VibGVfaW50ZWdlcikKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLmxvY2F0aW9uX3JlZmVyZW5jZSkKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLnBvaW50KQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUuYXBwbGljYXRpb25fZGljdGlvbmFyeSkKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLnVuc2lnbmVkX2ludGVnZXIpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5tZW51KQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUuc21hbGxfcmVhbCkKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLmZpeGVkKQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUudHlwZV9jbGFzc19pbmZvKQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUuUkdCOTZfY29sb3IpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5kYXNoX3N0eWxlKQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUucGl4ZWxfbWFwX3JlY29yZCkKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLmV4dGVuZGVkX3JlYWwpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5sb25nX3JlY3RhbmdsZSkKK2dldGJhc2VjbGFzc2VzKHByb2Nlc3MpCitnZXRiYXNlY2xhc3NlcyhhcHBsaWNhdGlvbl9wcm9jZXNzKQorZ2V0YmFzZWNsYXNzZXMoZGVza19hY2Nlc3NvcnlfcHJvY2VzcykKK2dldGJhc2VjbGFzc2VzKGFwcGxpY2F0aW9uKQorZ2V0YmFzZWNsYXNzZXModHJhc2hfMmRfb2JqZWN0KQorZ2V0YmFzZWNsYXNzZXMoZGVza3RvcF8yZF9vYmplY3QpCitnZXRiYXNlY2xhc3Nlcyhjb250YWluZXIpCitnZXRiYXNlY2xhc3Nlcyhmb2xkZXIpCitnZXRiYXNlY2xhc3NlcyhkaXNrKQorZ2V0YmFzZWNsYXNzZXMoYXBwbGljYXRpb24pCitnZXRiYXNlY2xhc3NlcyhhbGlhc19maWxlKQorZ2V0YmFzZWNsYXNzZXMocGFja2FnZSkKK2dldGJhc2VjbGFzc2VzKGZpbGUpCitnZXRiYXNlY2xhc3NlcyhhcHBsaWNhdGlvbl9maWxlKQorZ2V0YmFzZWNsYXNzZXMoaW50ZXJuZXRfbG9jYXRpb25fZmlsZSkKK2dldGJhc2VjbGFzc2VzKGRvY3VtZW50X2ZpbGUpCitnZXRiYXNlY2xhc3NlcyhjbGlwcGluZykKK2dldGJhc2VjbGFzc2VzKHByZWZlcmVuY2VzX3dpbmRvdykKK2dldGJhc2VjbGFzc2VzKEZpbmRlcl93aW5kb3cpCitnZXRiYXNlY2xhc3Nlcyh3aW5kb3cpCitnZXRiYXNlY2xhc3NlcyhjbGlwcGluZ193aW5kb3cpCitnZXRiYXNlY2xhc3NlcyhpbmZvcm1hdGlvbl93aW5kb3cpCitnZXRiYXNlY2xhc3NlcyhpdGVtKQorZ2V0YmFzZWNsYXNzZXMoaWNvbl92aWV3X29wdGlvbnMpCitnZXRiYXNlY2xhc3NlcyhwcmVmZXJlbmNlcykKK2dldGJhc2VjbGFzc2VzKGFsaWFzX2xpc3QpCitnZXRiYXNlY2xhc3NlcyhpY29uX2ZhbWlseSkKK2dldGJhc2VjbGFzc2VzKGxhYmVsKQorZ2V0YmFzZWNsYXNzZXMoY29sdW1uKQorZ2V0YmFzZWNsYXNzZXMobGlzdF92aWV3X29wdGlvbnMpCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdzaG9yJyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLnNtYWxsX2ludGVnZXIsCisgICAgJ2FldXQnIDogU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUuc3lzdGVtX2RpY3Rpb25hcnksCisgICAgJ2NscnQnIDogU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUuY29sb3JfdGFibGUsCisgICAgJ2ZwbnQnIDogU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUuZml4ZWRfcG9pbnQsCisgICAgJ1RFWFQnIDogU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUuc3RyaW5nLAorICAgICdlbGluJyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLnR5cGVfZWxlbWVudF9pbmZvLAorICAgICdtTG9jJyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLm1hY2hpbmVfbG9jYXRpb24sCisgICAgJ0VQUyAnIDogU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUuUG9zdFNjcmlwdF9waWN0dXJlLAorICAgICdwaW5mJyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLnR5cGVfcHJvcGVydHlfaW5mbywKKyAgICAnY21lbicgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5tZW51X2l0ZW0sCisgICAgJ3N0eWwnIDogU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUuc2NyYXBfc3R5bGVzLAorICAgICdmcmN0JyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLmZpeGVkX3JlY3RhbmdsZSwKKyAgICAnbnVsbCcgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5udWxsLAorICAgICdldmluJyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLnR5cGVfZXZlbnRfaW5mbywKKyAgICAndHJvdCcgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5yb3RhdGlvbiwKKyAgICAnbGZyYycgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5sb25nX2ZpeGVkX3JlY3RhbmdsZSwKKyAgICAnbHBudCcgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5sb25nX3BvaW50LAorICAgICd0YXJnJyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLnRhcmdldF9pZCwKKyAgICAnc3VpbicgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS50eXBlX3N1aXRlX2luZm8sCisgICAgJ3BtaW4nIDogU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUudHlwZV9wYXJhbWV0ZXJfaW5mbywKKyAgICAnbGZwdCcgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5sb25nX2ZpeGVkX3BvaW50LAorICAgICdxZHJ0JyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLmJvdW5kaW5nX3JlY3RhbmdsZSwKKyAgICAnVElGRicgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5USUZGX3BpY3R1cmUsCisgICAgJ2xmeGQnIDogU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUubG9uZ19maXhlZCwKKyAgICAndmVycycgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS52ZXJzaW9uLAorICAgICd0cjE2JyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLlJHQjE2X2NvbG9yLAorICAgICdjb21wJyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLmRvdWJsZV9pbnRlZ2VyLAorICAgICdpbnNsJyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLmxvY2F0aW9uX3JlZmVyZW5jZSwKKyAgICAnUURwdCcgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5wb2ludCwKKyAgICAnYWV0ZScgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5hcHBsaWNhdGlvbl9kaWN0aW9uYXJ5LAorICAgICdtYWduJyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLnVuc2lnbmVkX2ludGVnZXIsCisgICAgJ2NtbnUnIDogU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUubWVudSwKKyAgICAnc2luZycgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5zbWFsbF9yZWFsLAorICAgICdmaXhkJyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLmZpeGVkLAorICAgICdnY2xpJyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLnR5cGVfY2xhc3NfaW5mbywKKyAgICAndHI5NicgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5SR0I5Nl9jb2xvciwKKyAgICAndGRhcycgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5kYXNoX3N0eWxlLAorICAgICd0cG1tJyA6IFN0ZFN1aXRlcy5UeXBlX05hbWVzX1N1aXRlLnBpeGVsX21hcF9yZWNvcmQsCisgICAgJ2V4dGUnIDogU3RkU3VpdGVzLlR5cGVfTmFtZXNfU3VpdGUuZXh0ZW5kZWRfcmVhbCwKKyAgICAnbHJjdCcgOiBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZS5sb25nX3JlY3RhbmdsZSwKKyAgICAncHJjcycgOiBwcm9jZXNzLAorICAgICdwY2FwJyA6IGFwcGxpY2F0aW9uX3Byb2Nlc3MsCisgICAgJ3BjZGEnIDogZGVza19hY2Nlc3NvcnlfcHJvY2VzcywKKyAgICAnY2FwcCcgOiBhcHBsaWNhdGlvbiwKKyAgICAnY3RycycgOiB0cmFzaF8yZF9vYmplY3QsCisgICAgJ2Nkc2snIDogZGVza3RvcF8yZF9vYmplY3QsCisgICAgJ2N0bnInIDogY29udGFpbmVyLAorICAgICdjZm9sJyA6IGZvbGRlciwKKyAgICAnY2RpcycgOiBkaXNrLAorICAgICdjYXBwJyA6IGFwcGxpY2F0aW9uLAorICAgICdhbGlhJyA6IGFsaWFzX2ZpbGUsCisgICAgJ3BhY2snIDogcGFja2FnZSwKKyAgICAnZmlsZScgOiBmaWxlLAorICAgICdhcHBmJyA6IGFwcGxpY2F0aW9uX2ZpbGUsCisgICAgJ2lubGYnIDogaW50ZXJuZXRfbG9jYXRpb25fZmlsZSwKKyAgICAnZG9jZicgOiBkb2N1bWVudF9maWxlLAorICAgICdjbHBmJyA6IGNsaXBwaW5nLAorICAgICdwd25kJyA6IHByZWZlcmVuY2VzX3dpbmRvdywKKyAgICAnYnJvdycgOiBGaW5kZXJfd2luZG93LAorICAgICdjd2luJyA6IHdpbmRvdywKKyAgICAnbHduZCcgOiBjbGlwcGluZ193aW5kb3csCisgICAgJ2l3bmQnIDogaW5mb3JtYXRpb25fd2luZG93LAorICAgICdjb2JqJyA6IGl0ZW0sCisgICAgJ2ljb3AnIDogaWNvbl92aWV3X29wdGlvbnMsCisgICAgJ2NwcmYnIDogcHJlZmVyZW5jZXMsCisgICAgJ2Fsc3QnIDogYWxpYXNfbGlzdCwKKyAgICAnaWZhbScgOiBpY29uX2ZhbWlseSwKKyAgICAnY2xibCcgOiBsYWJlbCwKKyAgICAnbHZjbCcgOiBjb2x1bW4sCisgICAgJ2x2b3AnIDogbGlzdF92aWV3X29wdGlvbnMsCit9CisKKworY2xhc3MgRmluZGVyKFN0YW5kYXJkX1N1aXRlX0V2ZW50cywKKyAgICAgICAgTGVnYWN5X3N1aXRlX0V2ZW50cywKKyAgICAgICAgQ29udGFpbmVyc19hbmRfZm9sZGVyc19FdmVudHMsCisgICAgICAgIEZpbGVzX0V2ZW50cywKKyAgICAgICAgRmluZGVyX0Jhc2ljc19FdmVudHMsCisgICAgICAgIEZpbmRlcl9pdGVtc19FdmVudHMsCisgICAgICAgIFdpbmRvd19jbGFzc2VzX0V2ZW50cywKKyAgICAgICAgVHlwZV9EZWZpbml0aW9uc19FdmVudHMsCisgICAgICAgIEVudW1lcmF0aW9uc19FdmVudHMsCisgICAgICAgIGFldG9vbHMuVGFsa1RvKToKKyAgICBfc2lnbmF0dXJlID0gJ01BQ1MnCisKKyAgICBfbW9kdWxlTmFtZSA9ICdGaW5kZXInCisKKyAgICBfZWxlbWRpY3QgPSBhcHBsaWNhdGlvbi5fZWxlbWRpY3QKKyAgICBfcHJvcGRpY3QgPSBhcHBsaWNhdGlvbi5fcHJvcGRpY3QKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNDYwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0ZpbmRlci9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNDYwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL01vemlsbGFfc3VpdGUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9Nb3ppbGxhX3N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjYyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9Nb3ppbGxhX3N1aXRlLnB5CkBAIC0wLDAgKzEsMjY5IEBACisiIiJTdWl0ZSBNb3ppbGxhIHN1aXRlOiBFeHBlcmltZW50YWwgTW96aWxsYSBzdWl0ZQorTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9Wb2x1bWVzL1NhcC9BcHBsaWNhdGlvbnMgKE1hYyBPUyA5KS9OZXRzY2FwZSBDb21tdW5pY2F0b3JceGUyXHg4NFx4YTIgRm9sZGVyL05ldHNjYXBlIENvbW11bmljYXRvclx4ZTJceDg0XHhhMgorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMS8wLCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAnTU9TUycKKworY2xhc3MgTW96aWxsYV9zdWl0ZV9FdmVudHM6CisKKyAgICBkZWYgR2V0X0ltcG9ydF9EYXRhKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkdldCBJbXBvcnQgRGF0YTogUmV0dXJucyBhIHN0cnVjdHVyZSBjb250YWluaW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgb2YgdXNlIHRvIGFuIGV4dGVybmFsIG1vZHVsZSBpbiBpbXBvcnRpbmcgZGF0YSBmcm9tIGFuIGV4dGVybmFsIG1haWwgYXBwbGljYXRpb24gaW50byBDb21tdW5pY2F0b3IuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdlJlZk51bSBhbmQgZGlySUQgb2YgcHJvZmlsZSBmb2xkZXIgKDIrNCBieXRlcyksIHZSZWZOdW0gYW5kIERpcklEIG9mIHRoZSBsb2NhbCBtYWlsIGZvbGRlciAoMis0IGJ5dGVzKSwgd2luZG93IHR5cGUgb2YgZnJvbnQgd2luZG93ICgwIGlmIG5vbmUsIFx4ZDRCcnd6XHhkNSBicm93c2VyLCBceGQ0QWRkclx4ZDUgYWRkcmVzc2Jvb2ssIFx4ZDRNZXNnXHhkNSBtZXNzZW5nZXIsIGV0Yy4sIDQgYnl0ZXMpCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNT1NTJworICAgICAgICBfc3ViY29kZSA9ICdJbXB0JworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBHZXRfUHJvZmlsZV9OYW1lKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkdldCBQcm9maWxlIE5hbWU6IEdldCB0aGUgY3VycmVudCBVc2VyIFByb2ZpbGUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBOYW1lIG9mIHRoZSBjdXJyZW50IHByb2ZpbGUsIGxpa2UgXHhkMkpvZSBCbG9nZ3NceGQzLiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm9maWxlIGZvbGRlciBpbiB0aGUgTmV0c2NhcGUgVXNlcnMgZm9sZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU9TUycKKyAgICAgICAgX3N1YmNvZGUgPSAndXBybycKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgR2V0X3dvcmtpbmdVUkwoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiR2V0IHdvcmtpbmdVUkw6IEdldCB0aGUgcGF0aCB0byB0aGUgcnVubmluZyBhcHBsaWNhdGlvbiBpbiBVUkwgZm9ybWF0LiAgVGhpcyB3aWxsIGFsbG93IGEgc2NyaXB0IHRvIGNvbnN0cnVjdCBhIHJlbGF0aXZlIFVSTAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IFdpbGwgcmV0dXJuIHRleHQgb2YgdGhlIGZyb20gXHhkMkZJTEU6Ly9mb28vYXBwbGljYXRpb25uYW1lXHhkMworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU9TUycKKyAgICAgICAgX3N1YmNvZGUgPSAnd3VybCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX0dvID0geworICAgICAgICAnZGlyZWN0aW9uJyA6ICdkaXJlJywKKyAgICB9CisKKyAgICBkZWYgR28oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkdvOiBuYXZpZ2F0ZSBhIHdpbmRvdzogYmFjaywgZm9yd2FyZCwgYWdhaW4ocmVsb2FkKSwgaG9tZSkKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHdpbmRvdworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGRpcmVjdGlvbjogdW5kb2N1bWVudGVkLCB0eXBlY29kZSAnZGlyZScKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU9TUycKKyAgICAgICAgX3N1YmNvZGUgPSAnZ29nbycKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9HbykKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdkaXJlJywgX0VudW1fZGlyZSkKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBIYW5kbGVfY29tbWFuZChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiSGFuZGxlIGNvbW1hbmQ6IEhhbmRsZSBhIGNvbW1hbmQKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IFRoZSBjb21tYW5kIHRvIGhhbmRsZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNT1NTJworICAgICAgICBfc3ViY29kZSA9ICdoY21kJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIE9wZW5fQWRkcmVzc19Cb29rKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIk9wZW4gQWRkcmVzcyBCb29rOiBPcGVucyB0aGUgYWRkcmVzcyBib29rCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ01PU1MnCisgICAgICAgIF9zdWJjb2RlID0gJ2FkZHInCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIE9wZW5fQ29tcG9uZW50KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJPcGVuIENvbXBvbmVudDogT3BlbiBhIENvbW11bmljYXRvciBjb21wb25lbnQKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IFRoZSBjb21wb25lbnQgdG8gb3BlbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdNT1NTJworICAgICAgICBfc3ViY29kZSA9ICdjcG50JworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIE9wZW5fUHJvZmlsZV9NYW5hZ2VyKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIk9wZW4gUHJvZmlsZSBNYW5hZ2VyOiBPcGVuIHRoZSB1c2VyIHByb2ZpbGUgbWFuYWdlciAob2Jzb2xldGUpCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ01PU1MnCisgICAgICAgIF9zdWJjb2RlID0gJ3ByZmwnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIE9wZW5fYm9va21hcmsoc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiT3BlbiBib29rbWFyazogUmVhZHMgaW4gYSBib29rbWFyayBmaWxlCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBJZiBub3QgYXZhaWxhYmxlLCByZWxvYWRzIHRoZSBjdXJyZW50IGJvb2ttYXJrIGZpbGUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnTU9TUycKKyAgICAgICAgX3N1YmNvZGUgPSAnYm9vaycKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfUmVhZF9oZWxwX2ZpbGUgPSB7CisgICAgICAgICd3aXRoX2luZGV4JyA6ICdpZGlkJywKKyAgICAgICAgJ3NlYXJjaF90ZXh0JyA6ICdzZWFyJywKKyAgICB9CisKKyAgICBkZWYgUmVhZF9oZWxwX2ZpbGUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIlJlYWQgaGVscCBmaWxlOiBSZWFkcyBpbiB0aGUgaGVscCBmaWxlIChmaWxlIHNob3VsZCBiZSBpbiB0aGUgaGVscCBmaWxlIGZvcm1hdCkKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHVuZG9jdW1lbnRlZCwgdHlwZWNvZGUgJ2FsaXMnCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgd2l0aF9pbmRleDogSW5kZXggdG8gdGhlIGhlbHAgZmlsZS4gRGVmYXVsdHMgdG8gIFx4ZDRERUZBVUxUXHhkNSkKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzZWFyY2hfdGV4dDogT3B0aW9uYWwgdGV4dCB0byBzZWFyY2ggZm9yCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ01PU1MnCisgICAgICAgIF9zdWJjb2RlID0gJ2hlbHAnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfUmVhZF9oZWxwX2ZpbGUpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCitfRW51bV9jb21wID0geworICAgICdOYXZpZ2F0b3InIDogJ25hdmcnLCAgICAgICAjIFRoZSBOYXZpZ2F0b3IgY29tcG9uZW50CisgICAgJ0luQm94JyA6ICdpbmJ4JywgICAjIFRoZSBJbkJveCBjb21wb25lbnQKKyAgICAnTmV3c2dyb3VwcycgOiAnY29sYicsICAgICAgIyBUaGUgTmV3c2dyb3VwcyBjb21wb25lbnQKKyAgICAnQ29tcG9zZXInIDogJ2Nwc3InLCAgICAgICAgIyBUaGUgUGFnZSBDb21wb3NlciBjb21wb25lbnQKKyAgICAnQ29uZmVyZW5jZScgOiAnY29uZicsICAgICAgIyBUaGUgQ29uZmVyZW5jZSBDb21wb25lbnQKKyAgICAnQ2FsZW5kYXInIDogJ2NhbGQnLCAgICAgICAgIyBUaGUgQ2FsZW5kYXIgQ29tcG9uZW50Cit9CisKK19FbnVtX2RpcmUgPSB7CisgICAgJ2FnYWluJyA6ICdhZ2FpJywgICAjIEFnYWluIChyZWxvYWQpCisgICAgJ2hvbWUnIDogJ2hvbWUnLCAgICAjIEhvbWUKKyAgICAnYmFja3dhcmQnIDogJ3ByZXYnLCAgICAgICAgIyBQcmV2aW91cyBwYWdlCisgICAgJ2ZvcndhcmQnIDogJ25leHQnLCAjIE5leHQgcGFnZQorfQorCitfRW51bV9uY21kID0geworICAgICdHZXRfbmV3X21haWwnIDogJ1x4MDBceDAwXHgwNFcnLCAgICMKKyAgICAnU2VuZF9xdWV1ZWRfbWVzc2FnZXMnIDogJ1x4MDBceDAwXHgwNFgnLCAgICMKKyAgICAnUmVhZF9uZXdzZ3JvdXBzJyA6ICdceDAwXHgwMFx4MDRceDA0JywgICAgICMKKyAgICAnU2hvd19JbmJveCcgOiAnXHgwMFx4MDBceDA0XHgwNScsICAjCisgICAgJ1Nob3dfQm9va21hcmtzX3dpbmRvdycgOiAnXHgwMFx4MDBceDA0XHgwNicsICAgICAgICMKKyAgICAnU2hvd19IaXN0b3J5X3dpbmRvdycgOiAnXHgwMFx4MDBceDA0XHgwNycsICMKKyAgICAnU2hvd19BZGRyZXNzX0Jvb2tfd2luZG93JyA6ICdceDAwXHgwMFx4MDRcdCcsICAgICAgIworfQorCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworICAgICdjb21wJyA6IF9FbnVtX2NvbXAsCisgICAgJ2RpcmUnIDogX0VudW1fZGlyZSwKKyAgICAnbmNtZCcgOiBfRW51bV9uY21kLAorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvTW96aWxsYV9zdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9Nb3ppbGxhX3N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjNjOTZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvTW96aWxsYV9zdWl0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvTW96aWxsYV9zdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9Nb3ppbGxhX3N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjNjOTZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvTW96aWxsYV9zdWl0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUG93ZXJQbGFudC5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1Bvd2VyUGxhbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM3ZTY2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1Bvd2VyUGxhbnQucHkKQEAgLTAsMCArMSw4NiBAQAorIiIiU3VpdGUgUG93ZXJQbGFudDoKK0xldmVsIDAsIHZlcnNpb24gMAorCitHZW5lcmF0ZWQgZnJvbSAvVm9sdW1lcy9TYXAvQXBwbGljYXRpb25zIChNYWMgT1MgOSkvTmV0c2NhcGUgQ29tbXVuaWNhdG9yXHhlMlx4ODRceGEyIEZvbGRlci9OZXRzY2FwZSBDb21tdW5pY2F0b3JceGUyXHg4NFx4YTIKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ3BwbnQnCisKK2NsYXNzIFBvd2VyUGxhbnRfRXZlbnRzOgorCisgICAgX2FyZ21hcF9Td2l0Y2hUZWxsVGFyZ2V0ID0geworICAgICAgICAndG8nIDogJ2RhdGEnLAorICAgIH0KKworICAgIGRlZiBTd2l0Y2hUZWxsVGFyZ2V0KHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIlN3aXRjaFRlbGxUYXJnZXQ6IE1ha2VzIGFuIG9iamVjdCB0aGUgXHhkMmZvY3VzXHhkMyBvZiBBcHBsZUV2ZW50cworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRvOiByZWZlcmVuY2UgdG8gbmV3IGZvY3VzIG9mIEFwcGxlRXZlbnRzCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ3BwbnQnCisgICAgICAgIF9zdWJjb2RlID0gJ3N0dGcnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfU3dpdGNoVGVsbFRhcmdldCkKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9zZWxlY3QgPSB7CisgICAgICAgICdkYXRhJyA6ICdkYXRhJywKKyAgICB9CisKKyAgICBkZWYgc2VsZWN0KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzZWxlY3Q6IFNldHMgdGhlIHByZXNlbnQgc2VsZWN0aW9uCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBvYmplY3QgdG8gc2VsZWN0IG9yIGNvbnRhaW5lciBvZiBzdWItb2JqZWN0cyB0byBzZWxlY3QKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBkYXRhOiBzdWItb2JqZWN0KHMpIHRvIHNlbGVjdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdtaXNjJworICAgICAgICBfc3ViY29kZSA9ICdzbGN0JworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NlbGVjdCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKK19FbnVtX2RiYWMgPSB7CisgICAgJ0RvTm90aGluZycgOiAnXHgwMFx4MDBceDAwXHgwMCcsICAgIyBObyBkZWJ1Z2dpbmcgYWN0aW9uIGlzIHRha2VuLgorICAgICdQb3N0QWxlcnQnIDogJ1x4MDBceDAwXHgwMFx4MDEnLCAgICMgUG9zdCBhbiBhbGVydC4KKyAgICAnTG93TGV2ZWxEZWJ1Z2dlcicgOiAnXHgwMFx4MDBceDAwXHgwMicsICAgICMgQnJlYWsgaW50byB0aGUgbG93IGxldmVsIGRlYnVnZ2VyIChNYWNzQnVnKS4KKyAgICAnU291cmNlRGVidWdnZXInIDogJ1x4MDBceDAwXHgwMFx4MDMnLCAgICAgICMgQnJlYWsgaW50byB0aGUgc291cmNlIGxldmVsIGRlYnVnZ2VyIChpZiBzb3VyY2UgZGVidWdnZXIgaXMgZXhlY3V0aW5nKS4KK30KKworCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKKyAgICAnZGJhYycgOiBfRW51bV9kYmFjLAorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUG93ZXJQbGFudC5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9Qb3dlclBsYW50LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjA3YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUG93ZXJQbGFudC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUG93ZXJQbGFudC5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9Qb3dlclBsYW50LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjA3YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUG93ZXJQbGFudC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUmVxdWlyZWRfc3VpdGUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9SZXF1aXJlZF9zdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTk3OTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUmVxdWlyZWRfc3VpdGUucHkKQEAgLTAsMCArMSwxMDggQEAKKyIiIlN1aXRlIFJlcXVpcmVkIHN1aXRlOgorTGV2ZWwgMCwgdmVyc2lvbiAwCisKK0dlbmVyYXRlZCBmcm9tIC9Wb2x1bWVzL1NhcC9BcHBsaWNhdGlvbnMgKE1hYyBPUyA5KS9OZXRzY2FwZSBDb21tdW5pY2F0b3JceGUyXHg4NFx4YTIgRm9sZGVyL05ldHNjYXBlIENvbW11bmljYXRvclx4ZTJceDg0XHhhMgorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMS8wLCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAncmVxZCcKKworZnJvbSBTdGRTdWl0ZXMuUmVxdWlyZWRfU3VpdGUgaW1wb3J0ICoKK2NsYXNzIFJlcXVpcmVkX3N1aXRlX0V2ZW50cyhSZXF1aXJlZF9TdWl0ZV9FdmVudHMpOgorCisgICAgZGVmIG9wZW4oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIm9wZW46IE9wZW4gdGhlIHNwZWNpZmllZCBvYmplY3QocykKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGxpc3Qgb2Ygb2JqZWN0cyB0byBvcGVuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ29kb2MnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgcHJpbnRfKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJwcmludDogUHJpbnQgdGhlIHNwZWNpZmllZCBvYmplY3QocykKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGxpc3Qgb2Ygb2JqZWN0cyB0byBwcmludAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhZXZ0JworICAgICAgICBfc3ViY29kZSA9ICdwZG9jJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIHF1aXQoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIicXVpdDogUXVpdCBOYXZpZ2F0b3IKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYWV2dCcKKyAgICAgICAgX3N1YmNvZGUgPSAncXVpdCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgcnVuKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInJ1bjogU2VudCB0byBhbiBhcHBsaWNhdGlvbiB3aGVuIGl0IGlzIGRvdWJsZS1jbGlja2VkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ29hcHAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUmVxdWlyZWRfc3VpdGUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUmVxdWlyZWRfc3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTNkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9SZXF1aXJlZF9zdWl0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUmVxdWlyZWRfc3VpdGUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvUmVxdWlyZWRfc3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YTNkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9SZXF1aXJlZF9zdWl0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvU3RhbmRhcmRfU3VpdGUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9TdGFuZGFyZF9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzNlOTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvU3RhbmRhcmRfU3VpdGUucHkKQEAgLTAsMCArMSwyNDMgQEAKKyIiIlN1aXRlIFN0YW5kYXJkIFN1aXRlOiBDb21tb24gdGVybXMgZm9yIG1vc3QgYXBwbGljYXRpb25zCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1ZvbHVtZXMvU2FwL0FwcGxpY2F0aW9ucyAoTWFjIE9TIDkpL05ldHNjYXBlIENvbW11bmljYXRvclx4ZTJceDg0XHhhMiBGb2xkZXIvTmV0c2NhcGUgQ29tbXVuaWNhdG9yXHhlMlx4ODRceGEyCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdDb1JlJworCitmcm9tIFN0ZFN1aXRlcy5TdGFuZGFyZF9TdWl0ZSBpbXBvcnQgKgorY2xhc3MgU3RhbmRhcmRfU3VpdGVfRXZlbnRzKFN0YW5kYXJkX1N1aXRlX0V2ZW50cyk6CisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImNsb3NlOiBDbG9zZSBhbiBvYmplY3QKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3RzIHRvIGNsb3NlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2Nsb3MnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgZGF0YV9zaXplKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJkYXRhIHNpemU6IFJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBvYmplY3QKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3Qgd2hvc2UgZGF0YSBzaXplIGlzIHRvIGJlIHJldHVybmVkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdGhlIHNpemUgb2YgdGhlIG9iamVjdCBpbiBieXRlcworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnZHNpeicKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBnZXQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImdldDogR2V0IHRoZSBkYXRhIGZvciBhbiBvYmplY3QKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3Qgd2hvc2UgZGF0YSBpcyB0byBiZSByZXR1cm5lZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IFRoZSBkYXRhIGZyb20gdGhlIG9iamVjdAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnZ2V0ZCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfc2V0ID0geworICAgICAgICAndG8nIDogJ2RhdGEnLAorICAgIH0KKworICAgIGRlZiBzZXQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNldDogU2V0IGFuIG9iamVjdFx4ZDVzIGRhdGEKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgdG8gY2hhbmdlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG86IHRoZSBuZXcgdmFsdWUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnc2V0ZCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZXQpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisKK2NsYXNzIGFwcGxpY2F0aW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYXBwbGljYXRpb24gLSBBbiBhcHBsaWNhdGlvbiBwcm9ncmFtICIiIgorICAgIHdhbnQgPSAnY2FwcCcKK2NsYXNzIF9Qcm9wX2FsZXJ0X2FwcGxpY2F0aW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJhbGVydCBhcHBsaWNhdGlvbiAtIE1vc3Qgb2YgdGhlIGFsZXJ0cyB3aWxsIGJlIHNlbnQgdG8gdGhpcyBhcHBsaWNhdGlvbiB1c2luZyB5ZXQgdW5zcGVjaWZpZWQgQUUgaW50ZXJmYWNlLiBXZSBuZWVkIGEgZmV3IGFsZXJ0IGJveGVzOiBhbGVydCwgY29uZmlybSBhbmQgbm90aWZ5LiBBbnkgaWRlYXMgb24gaG93IHRvIGRlc2lnbiB0aGlzIGV2ZW50PyBtYWlsdG86YXRvdGljQG5ldHNjYXBlLmNvbS4gSVx4ZDVkIGxpa2UgdG8gY29uZm9ybSB0byB0aGUgc3RhbmRhcmQuICIiIgorICAgIHdoaWNoID0gJ0FMQVAnCisgICAgd2FudCA9ICd0eXBlJworYWxlcnRfYXBwbGljYXRpb24gPSBfUHJvcF9hbGVydF9hcHBsaWNhdGlvbigpCitjbGFzcyBfUHJvcF9raW9za19tb2RlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJraW9zayBtb2RlIC0gS2lvc2sgbW9kZSBsZWF2ZXMgdmVyeSBmZXcgbWVudXMgZW5hYmxlZCAiIiIKKyAgICB3aGljaCA9ICdLT1NLJworICAgIHdhbnQgPSAnbG9uZycKK2tpb3NrX21vZGUgPSBfUHJvcF9raW9za19tb2RlKCkKKyMgICAgICAgIGVsZW1lbnQgJ2N3aW4nIGFzIFsnaW5keCcsICduYW1lJywgJ0lEICAnXQorCitjbGFzcyB3aW5kb3coYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJ3aW5kb3cgLSBBIFdpbmRvdyAiIiIKKyAgICB3YW50ID0gJ2N3aW4nCitjbGFzcyBfUHJvcF9VUkwoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlVSTCAtIEN1cnJlbnQgVVJMICIiIgorICAgIHdoaWNoID0gJ2N1cmwnCisgICAgd2FudCA9ICdURVhUJworY2xhc3MgX1Byb3BfYm91bmRzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJib3VuZHMgLSB0aGUgYm91bmRhcnkgcmVjdGFuZ2xlIGZvciB0aGUgd2luZG93ICIiIgorICAgIHdoaWNoID0gJ3BibmQnCisgICAgd2FudCA9ICdxZHJ0JworY2xhc3MgX1Byb3BfYnVzeShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiYnVzeSAtIElzIHdpbmRvdyBsb2FkaW5nIHNvbWV0aGluZyByaWdodCBub3cuIDIsIHdpbmRvdyBpcyBidXN5IGFuZCB3aWxsIHJlamVjdCBsb2FkIHJlcXVlc3RzLiAxLCB3aW5kb3cgaXMgYnVzeSwgYnV0IHdpbGwgaW50ZXJydXB0IG91dHN0YW5kaW5nIGxvYWRzICIiIgorICAgIHdoaWNoID0gJ2J1c3knCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3BfY2xvc2VhYmxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjbG9zZWFibGUgLSBEb2VzIHRoZSB3aW5kb3cgaGF2ZSBhIGNsb3NlIGJveD8gIiIiCisgICAgd2hpY2ggPSAnaGNsYicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9mbG9hdGluZyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZmxvYXRpbmcgLSBEb2VzIHRoZSB3aW5kb3cgZmxvYXQ/ICIiIgorICAgIHdoaWNoID0gJ2lzZmwnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfaW5kZXgoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImluZGV4IC0gdGhlIG51bWJlciBvZiB0aGUgd2luZG93ICIiIgorICAgIHdoaWNoID0gJ3BpZHgnCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3BfbW9kYWwoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm1vZGFsIC0gSXMgdGhlIHdpbmRvdyBtb2RhbD8gIiIiCisgICAgd2hpY2ggPSAncG1vZCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9uYW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJuYW1lIC0gdGhlIHRpdGxlIG9mIHRoZSB3aW5kb3cgIiIiCisgICAgd2hpY2ggPSAncG5hbScKKyAgICB3YW50ID0gJ2l0eHQnCitjbGFzcyBfUHJvcF9wb3NpdGlvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicG9zaXRpb24gLSB1cHBlciBsZWZ0IGNvb3JkaW5hdGVzIG9mIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdwcG9zJworICAgIHdhbnQgPSAnUURwdCcKK2NsYXNzIF9Qcm9wX3Jlc2l6YWJsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicmVzaXphYmxlIC0gSXMgdGhlIHdpbmRvdyByZXNpemFibGU/ICIiIgorICAgIHdoaWNoID0gJ3Byc3onCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfdGl0bGVkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ0aXRsZWQgLSBEb2VzIHRoZSB3aW5kb3cgaGF2ZSBhIHRpdGxlIGJhcj8gIiIiCisgICAgd2hpY2ggPSAncHRpdCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF91bmlxdWVfSUQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInVuaXF1ZSBJRCAtIFdpbmRvd1x4ZDVzIHVuaXF1ZSBJRCAoYSBicmlkZ2UgYmV0d2VlbiBXV1chIHN1aXRlIHdpbmRvdyBpZFx4ZDVzIGFuZCBzdGFuZGFyZCBBRSB3aW5kb3dzKSAiIiIKKyAgICB3aGljaCA9ICd3aWlkJworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX3Zpc2libGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInZpc2libGUgLSBpcyB0aGUgd2luZG93IHZpc2libGU/ICIiIgorICAgIHdoaWNoID0gJ3B2aXMnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3Bfem9vbWFibGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInpvb21hYmxlIC0gSXMgdGhlIHdpbmRvdyB6b29tYWJsZT8gIiIiCisgICAgd2hpY2ggPSAnaXN6bScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF96b29tZWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInpvb21lZCAtIElzIHRoZSB3aW5kb3cgem9vbWVkPyAiIiIKKyAgICB3aGljaCA9ICdwenVtJworICAgIHdhbnQgPSAnYm9vbCcKK2FwcGxpY2F0aW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorYXBwbGljYXRpb24uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnYWxlcnRfYXBwbGljYXRpb24nIDogX1Byb3BfYWxlcnRfYXBwbGljYXRpb24sCisgICAgJ2tpb3NrX21vZGUnIDogX1Byb3Bfa2lvc2tfbW9kZSwKK30KK2FwcGxpY2F0aW9uLl9wcml2ZWxlbWRpY3QgPSB7CisgICAgJ3dpbmRvdycgOiB3aW5kb3csCit9Cit3aW5kb3cuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit3aW5kb3cuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnVVJMJyA6IF9Qcm9wX1VSTCwKKyAgICAnYm91bmRzJyA6IF9Qcm9wX2JvdW5kcywKKyAgICAnYnVzeScgOiBfUHJvcF9idXN5LAorICAgICdjbG9zZWFibGUnIDogX1Byb3BfY2xvc2VhYmxlLAorICAgICdmbG9hdGluZycgOiBfUHJvcF9mbG9hdGluZywKKyAgICAnaW5kZXgnIDogX1Byb3BfaW5kZXgsCisgICAgJ21vZGFsJyA6IF9Qcm9wX21vZGFsLAorICAgICduYW1lJyA6IF9Qcm9wX25hbWUsCisgICAgJ3Bvc2l0aW9uJyA6IF9Qcm9wX3Bvc2l0aW9uLAorICAgICdyZXNpemFibGUnIDogX1Byb3BfcmVzaXphYmxlLAorICAgICd0aXRsZWQnIDogX1Byb3BfdGl0bGVkLAorICAgICd1bmlxdWVfSUQnIDogX1Byb3BfdW5pcXVlX0lELAorICAgICd2aXNpYmxlJyA6IF9Qcm9wX3Zpc2libGUsCisgICAgJ3pvb21hYmxlJyA6IF9Qcm9wX3pvb21hYmxlLAorICAgICd6b29tZWQnIDogX1Byb3Bfem9vbWVkLAorfQord2luZG93Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdjYXBwJyA6IGFwcGxpY2F0aW9uLAorICAgICdjd2luJyA6IHdpbmRvdywKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7CisgICAgJ0FMQVAnIDogX1Byb3BfYWxlcnRfYXBwbGljYXRpb24sCisgICAgJ0tPU0snIDogX1Byb3Bfa2lvc2tfbW9kZSwKKyAgICAnYnVzeScgOiBfUHJvcF9idXN5LAorICAgICdjdXJsJyA6IF9Qcm9wX1VSTCwKKyAgICAnaGNsYicgOiBfUHJvcF9jbG9zZWFibGUsCisgICAgJ2lzZmwnIDogX1Byb3BfZmxvYXRpbmcsCisgICAgJ2lzem0nIDogX1Byb3Bfem9vbWFibGUsCisgICAgJ3BibmQnIDogX1Byb3BfYm91bmRzLAorICAgICdwaWR4JyA6IF9Qcm9wX2luZGV4LAorICAgICdwbW9kJyA6IF9Qcm9wX21vZGFsLAorICAgICdwbmFtJyA6IF9Qcm9wX25hbWUsCisgICAgJ3Bwb3MnIDogX1Byb3BfcG9zaXRpb24sCisgICAgJ3Byc3onIDogX1Byb3BfcmVzaXphYmxlLAorICAgICdwdGl0JyA6IF9Qcm9wX3RpdGxlZCwKKyAgICAncHZpcycgOiBfUHJvcF92aXNpYmxlLAorICAgICdwenVtJyA6IF9Qcm9wX3pvb21lZCwKKyAgICAnd2lpZCcgOiBfUHJvcF91bmlxdWVfSUQsCit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2E2NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvU3RhbmRhcmRfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2E2NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvU3RhbmRhcmRfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1VSTF9zdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1VSTF9zdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTRhMDFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvU3RhbmRhcmRfVVJMX3N1aXRlLnB5CkBAIC0wLDAgKzEsNjAgQEAKKyIiIlN1aXRlIFN0YW5kYXJkIFVSTCBzdWl0ZTogTWFjIFVSTCBzdGFuZGFyZCwgc3VwcG9ydGVkIGJ5IG1hbnkgYXBwcworCisKK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvVm9sdW1lcy9TYXAvQXBwbGljYXRpb25zIChNYWMgT1MgOSkvTmV0c2NhcGUgQ29tbXVuaWNhdG9yXHhlMlx4ODRceGEyIEZvbGRlci9OZXRzY2FwZSBDb21tdW5pY2F0b3JceGUyXHg4NFx4YTIKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ0dVUkwnCisKK2NsYXNzIFN0YW5kYXJkX1VSTF9zdWl0ZV9FdmVudHM6CisKKyAgICBfYXJnbWFwX0dldFVSTCA9IHsKKyAgICAgICAgJ3RvJyA6ICdkZXN0JywKKyAgICAgICAgJ2luc2lkZScgOiAnSFdJTicsCisgICAgICAgICdmcm9tXycgOiAncmVmZScsCisgICAgfQorCisgICAgZGVmIEdldFVSTChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiR2V0VVJMOiBMb2FkcyB0aGUgVVJMIChvcHRpb25hbGx5IHRvIGRpc2spCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBUaGUgdXJsCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG86IGZpbGUgdGhlIFVSTCBzaG91bGQgYmUgbG9hZGVkIGludG8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBpbnNpZGU6IFdpbmRvdyB0aGUgVVJMIHNob3VsZCBiZSBsb2FkZWQgdG8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBmcm9tXzogUmVmZXJyZXIsIHRvIGJlIHNlbnQgd2l0aCB0aGUgSFRUUCByZXF1ZXN0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ0dVUkwnCisgICAgICAgIF9zdWJjb2RlID0gJ0dVUkwnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfR2V0VVJMKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1VSTF9zdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9TdGFuZGFyZF9VUkxfc3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYjIwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9TdGFuZGFyZF9VUkxfc3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1N0YW5kYXJkX1VSTF9zdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9TdGFuZGFyZF9VUkxfc3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYjIwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9TdGFuZGFyZF9VUkxfc3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1RleHQucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9UZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNjBkOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9UZXh0LnB5CkBAIC0wLDAgKzEsMTIyIEBACisiIiJTdWl0ZSBUZXh0OgorTGV2ZWwgMCwgdmVyc2lvbiAwCisKK0dlbmVyYXRlZCBmcm9tIC9Wb2x1bWVzL1NhcC9BcHBsaWNhdGlvbnMgKE1hYyBPUyA5KS9OZXRzY2FwZSBDb21tdW5pY2F0b3JceGUyXHg4NFx4YTIgRm9sZGVyL05ldHNjYXBlIENvbW11bmljYXRvclx4ZTJceDg0XHhhMgorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMS8wLCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAnVEVYVCcKKworZnJvbSBTdGRTdWl0ZXMuVGV4dF9TdWl0ZSBpbXBvcnQgKgorY2xhc3MgVGV4dF9FdmVudHMoVGV4dF9TdWl0ZV9FdmVudHMpOgorCisgICAgcGFzcworCisKK2NsYXNzIHRleHQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJ0ZXh0IC0gaW5kZXBlbmRlbnQgdGV4dCB2aWV3IG9iamVjdHMgIiIiCisgICAgd2FudCA9ICdjdHh0JworY2xhc3MgX1Byb3BfYmVnaW5uaW5nKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJiZWdpbm5pbmcgLSBCZWdpbm5pbmcgb2YgZWxlbWVudCAiIiIKKyAgICB3aGljaCA9ICdiZ25nJworICAgIHdhbnQgPSAnb2JqICcKK2NsYXNzIF9Qcm9wX2VuZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZW5kIC0gRW5kaW5nIG9mIGVsZW1lbnQgIiIiCisgICAgd2hpY2ggPSAnZW5kICcKKyAgICB3YW50ID0gJ29iaiAnCitjbGFzcyBfUHJvcF9pbmZyb250KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJpbmZyb250IC0gSW1tZWRpYXRlbHkgYmVmb3JlIGVsZW1lbnQgIiIiCisgICAgd2hpY2ggPSAncEJlZicKKyAgICB3YW50ID0gJ29iaiAnCitjbGFzcyBfUHJvcF9qdXN0YmVoaW5kKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJqdXN0YmVoaW5kIC0gSW1tZWRpYXRlbHkgYWZ0ZXIgZWxlbWVudCAiIiIKKyAgICB3aGljaCA9ICdwQWZ0JworICAgIHdhbnQgPSAnb2JqICcKK2NsYXNzIF9Qcm9wX3VwZGF0ZUxldmVsKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ1cGRhdGVMZXZlbCAtIHVwZGF0aW5nIGxldmVsLiAgQ2FuIG9ubHkgYmUgaW5jcmVtZW50ZWQgb3IgZGVjcmVtZW50ZWQuICBEbyBzbyBvbmx5IGluIGEgdHJ5IGJsb2NrIC0tIGlmIHRoZSBsZXZlbCBpcyBncmVhdGVyIHRoYW4gemVybywgdmlzdWFsIHRleHQgdXBkYXRpbmcgd2lsbCBjZWFzZS4gIiIiCisgICAgd2hpY2ggPSAncFVwTCcKKyAgICB3YW50ID0gJ2xvbmcnCisjICAgICAgICBlbGVtZW50ICdzdHlzJyBhcyBbJ2luZHgnLCAnbmFtZSddCisKK2NsYXNzIHN0eWxlc2V0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIic3R5bGVzZXQgLSBBIHN0eWxlIFx4ZDJzZXRceGQzIHRoYXQgbWF5IGJlIHVzZWQgcmVwZWF0ZWRseSBpbiB0ZXh0IG9iamVjdHMuICIiIgorICAgIHdhbnQgPSAnc3R5cycKK2NsYXNzIF9Qcm9wX2NvbG9yKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjb2xvciAtIHRoZSBjb2xvciAiIiIKKyAgICB3aGljaCA9ICdjb2xyJworICAgIHdhbnQgPSAnUkdCICcKK2NsYXNzIF9Qcm9wX2ZvbnQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZvbnQgLSBmb250IG5hbWUgIiIiCisgICAgd2hpY2ggPSAnZm9udCcKKyAgICB3YW50ID0gJ1RFWFQnCitjbGFzcyBfUHJvcF9uYW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJuYW1lIC0gc3R5bGUgbmFtZSAiIiIKKyAgICB3aGljaCA9ICdwbmFtJworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX3NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNpemUgLSB0aGUgc2l6ZSBpbiBwb2ludHMgIiIiCisgICAgd2hpY2ggPSAncHRzeicKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF9zdHlsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic3R5bGUgLSB0aGUgdGV4dCBzdHlsZXMgb3IgZmFjZSBhdHRyaWJ1dGVzICIiIgorICAgIHdoaWNoID0gJ3R4c3QnCisgICAgd2FudCA9ICd0c3R5JworY2xhc3MgX1Byb3Bfd3JpdGluZ19jb2RlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ3cml0aW5nIGNvZGUgLSB0aGUgc2NyaXB0IHN5c3RlbSBhbmQgbGFuZ3VhZ2UgIiIiCisgICAgd2hpY2ggPSAncHNjdCcKKyAgICB3YW50ID0gJ3RzdHknCisKK3N0eWxlc2V0cyA9IHN0eWxlc2V0Cit0ZXh0Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQordGV4dC5fcHJpdnByb3BkaWN0ID0geworICAgICdiZWdpbm5pbmcnIDogX1Byb3BfYmVnaW5uaW5nLAorICAgICdlbmQnIDogX1Byb3BfZW5kLAorICAgICdpbmZyb250JyA6IF9Qcm9wX2luZnJvbnQsCisgICAgJ2p1c3RiZWhpbmQnIDogX1Byb3BfanVzdGJlaGluZCwKKyAgICAndXBkYXRlTGV2ZWwnIDogX1Byb3BfdXBkYXRlTGV2ZWwsCit9Cit0ZXh0Ll9wcml2ZWxlbWRpY3QgPSB7CisgICAgJ3N0eWxlc2V0JyA6IHN0eWxlc2V0LAorfQorc3R5bGVzZXQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitzdHlsZXNldC5fcHJpdnByb3BkaWN0ID0geworICAgICdjb2xvcicgOiBfUHJvcF9jb2xvciwKKyAgICAnZm9udCcgOiBfUHJvcF9mb250LAorICAgICduYW1lJyA6IF9Qcm9wX25hbWUsCisgICAgJ3NpemUnIDogX1Byb3Bfc2l6ZSwKKyAgICAnc3R5bGUnIDogX1Byb3Bfc3R5bGUsCisgICAgJ3dyaXRpbmdfY29kZScgOiBfUHJvcF93cml0aW5nX2NvZGUsCit9CitzdHlsZXNldC5fcHJpdmVsZW1kaWN0ID0geworfQorCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKKyAgICAnY3R4dCcgOiB0ZXh0LAorICAgICdzdHlzJyA6IHN0eWxlc2V0LAorfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKKyAgICAnYmduZycgOiBfUHJvcF9iZWdpbm5pbmcsCisgICAgJ2NvbHInIDogX1Byb3BfY29sb3IsCisgICAgJ2VuZCAnIDogX1Byb3BfZW5kLAorICAgICdmb250JyA6IF9Qcm9wX2ZvbnQsCisgICAgJ3BBZnQnIDogX1Byb3BfanVzdGJlaGluZCwKKyAgICAncEJlZicgOiBfUHJvcF9pbmZyb250LAorICAgICdwVXBMJyA6IF9Qcm9wX3VwZGF0ZUxldmVsLAorICAgICdwbmFtJyA6IF9Qcm9wX25hbWUsCisgICAgJ3BzY3QnIDogX1Byb3Bfd3JpdGluZ19jb2RlLAorICAgICdwdHN6JyA6IF9Qcm9wX3NpemUsCisgICAgJ3R4c3QnIDogX1Byb3Bfc3R5bGUsCit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1RleHQucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvVGV4dC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjYmI1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1RleHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1RleHQucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvVGV4dC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjYmI1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1RleHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1dvcmxkV2lkZVdlYl9zdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1dvcmxkV2lkZVdlYl9zdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzA2YjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvV29ybGRXaWRlV2ViX3N1aXRlLnB5CkBAIC0wLDAgKzEsNDI2IEBACisiIiJTdWl0ZSBXb3JsZFdpZGVXZWIgc3VpdGUsIGFzIGRlZmluZWQgaW4gU3B5Z2xhc3Mgc3BlYy46CitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1ZvbHVtZXMvU2FwL0FwcGxpY2F0aW9ucyAoTWFjIE9TIDkpL05ldHNjYXBlIENvbW11bmljYXRvclx4ZTJceDg0XHhhMiBGb2xkZXIvTmV0c2NhcGUgQ29tbXVuaWNhdG9yXHhlMlx4ODRceGEyCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdXV1chJworCitjbGFzcyBXb3JsZFdpZGVXZWJfc3VpdGVfRXZlbnRzOgorCisgICAgX2FyZ21hcF9PcGVuVVJMID0geworICAgICAgICAndG8nIDogJ0lOVE8nLAorICAgICAgICAndG9XaW5kb3cnIDogJ1dJTkQnLAorICAgICAgICAnZmxhZ3MnIDogJ0ZMR1MnLAorICAgICAgICAncG9zdF9kYXRhJyA6ICdQT1NUJywKKyAgICAgICAgJ3Bvc3RfdHlwZScgOiAnTUlNRScsCisgICAgICAgICdwcm9ncmVzc0FwcCcgOiAnUFJPRycsCisgICAgfQorCisgICAgZGVmIE9wZW5VUkwoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIk9wZW5VUkw6IE9wZW5zIGEgVVJMLiBBbGxvd3MgZm9yIG1vcmUgb3B0aW9ucyB0aGFuIEdldFVSTCBldmVudAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogVVJMCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG86IGZpbGUgZGVzdGluYXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB0b1dpbmRvdzogd2luZG93IGlECisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgZmxhZ3M6IEJpbmFyeTogYW55IGNvbWJpbmF0aW9uIG9mIDEsIDIgYW5kIDQgaXMgYWxsb3dlZDogMSBhbmQgMiBtZWFuIGZvcmNlIHJlbG9hZCB0aGUgZG9jdW1lbnQuIDQgaXMgaWdub3JlZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHBvc3RfZGF0YTogRm9ybSBwb3N0aW5nIGRhdGEKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBwb3N0X3R5cGU6IE1JTUUgdHlwZSBvZiB0aGUgcG9zdGluZyBkYXRhLiBEZWZhdWx0cyB0byBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBwcm9ncmVzc0FwcDogQXBwbGljYXRpb24gdGhhdCB3aWxsIGRpc3BsYXkgcHJvZ3Jlc3MKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBJRCBvZiB0aGUgbG9hZGluZyB3aW5kb3cKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1dXVyEnCisgICAgICAgIF9zdWJjb2RlID0gJ09VUkwnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfT3BlblVSTCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX1Nob3dGaWxlID0geworICAgICAgICAnTUlNRV90eXBlJyA6ICdNSU1FJywKKyAgICAgICAgJ1dpbmRvd19JRCcgOiAnV0lORCcsCisgICAgICAgICdVUkwnIDogJ1VSTCAnLAorICAgIH0KKworICAgIGRlZiBTaG93RmlsZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiU2hvd0ZpbGU6IFNpbWlsYXIgdG8gT3BlbkRvY3VtZW50cywgZXhjZXB0IHRoYXQgaXQgc3BlY2lmaWVzIHRoZSBwYXJlbnQgVVJMLCBhbmQgTUlNRSB0eXBlIG9mIHRoZSBmaWxlCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBGaWxlIHRvIG9wZW4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBNSU1FX3R5cGU6IE1JTUUgdHlwZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IFdpbmRvd19JRDogV2luZG93IHRvIG9wZW4gdGhlIGZpbGUgaW4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBVUkw6IFVzZSB0aGlzIGFzIGEgYmFzZSBVUkwKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBXaW5kb3cgSUQgb2YgdGhlIGxvYWRlZCB3aW5kb3cuIDAgbWVhbnMgU2hvd0ZpbGUgZmFpbGVkLCBGRkZGRkZGIG1lYW5zIHRoYXQgZGF0YSB3YXMgbm90IGFwcHJvcHJpYXRlIHR5cGUgdG8gZGlzcGxheSBpbiB0aGUgYnJvd3Nlci4KKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1dXVyEnCisgICAgICAgIF9zdWJjb2RlID0gJ1NIV0YnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfU2hvd0ZpbGUpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9jYW5jZWxfcHJvZ3Jlc3MgPSB7CisgICAgICAgICdpbl93aW5kb3cnIDogJ1dJTkQnLAorICAgIH0KKworICAgIGRlZiBjYW5jZWxfcHJvZ3Jlc3Moc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiY2FuY2VsIHByb2dyZXNzOiBJbnRlcnJ1cHRzIHRoZSBkb3dubG9hZCBvZiB0aGUgZG9jdW1lbnQgaW4gdGhlIGdpdmVuIHdpbmRvdworICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogcHJvZ3Jlc3MgSUQsIG9idGFpbmVkIGZyb20gdGhlIHByb2dyZXNzIGFwcAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGluX3dpbmRvdzogd2luZG93IElEIG9mIHRoZSBwcm9ncmVzcyB0byBjYW5jZWwKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnV1dXIScKKyAgICAgICAgX3N1YmNvZGUgPSAnQ05DTCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9jYW5jZWxfcHJvZ3Jlc3MpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIGZpbmRfVVJMKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJmaW5kIFVSTDogSWYgdGhlIGZpbGUgd2FzIGRvd25sb2FkZWQgYnkgTmV0c2NhcGUsIHlvdSBjYW4gY2FsbCBGaW5kVVJMIHRvIGZpbmQgb3V0IHRoZSBVUkwgdXNlZCB0byBkb3dubG9hZCB0aGUgZmlsZS4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IEZpbGUgc3BlYworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IFRoZSBVUkwKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1dXVyEnCisgICAgICAgIF9zdWJjb2RlID0gJ0ZVUkwnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgZ2V0X3dpbmRvd19pbmZvKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImdldCB3aW5kb3cgaW5mbzogUmV0dXJucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdpbmRvdyBhcyBhIGxpc3QuIEN1cnJlbnRseSB0aGUgbGlzdCBjb250YWlucyB0aGUgd2luZG93IHRpdGxlIGFuZCB0aGUgVVJMLiBZb3UgY2FuIGdldCB0aGUgc2FtZSBpbmZvcm1hdGlvbiB1c2luZyBzdGFuZGFyZCBBcHBsZSBFdmVudCBHZXRQcm9wZXJ0eS4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHdpbmRvdyBJRAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHVuZG9jdW1lbnRlZCwgdHlwZWNvZGUgJ2xpc3QnCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdXV1chJworICAgICAgICBfc3ViY29kZSA9ICdXTkZPJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIGxpc3Rfd2luZG93cyhzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJsaXN0IHdpbmRvd3M6IExpc3RzIHRoZSBJRHMgb2YgYWxsIHRoZSBoeXBlcnRleHQgd2luZG93cworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IExpc3Qgb2YgdW5pcXVlIElEcyBvZiBhbGwgdGhlIGh5cGVydGV4dCB3aW5kb3dzCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdXV1chJworICAgICAgICBfc3ViY29kZSA9ICdMU1RXJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfcGFyc2VfYW5jaG9yID0geworICAgICAgICAncmVsYXRpdmVfdG8nIDogJ1JFTEEnLAorICAgIH0KKworICAgIGRlZiBwYXJzZV9hbmNob3Ioc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInBhcnNlIGFuY2hvcjogUmVzb2x2ZXMgdGhlIHJlbGF0aXZlIFVSTAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogTWFpbiBVUkwKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCByZWxhdGl2ZV90bzogUmVsYXRpdmUgVVJMCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogUGFyc2VkICBVUkwKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1dXVyEnCisgICAgICAgIF9zdWJjb2RlID0gJ1BSU0EnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfcGFyc2VfYW5jaG9yKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiByZWdpc3Rlcl9VUkxfZWNobyhzZWxmLCBfb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJyZWdpc3RlciBVUkwgZWNobzogUmVnaXN0ZXJzIHRoZSBceGQyZWNob1x4ZDMgYXBwbGljYXRpb24uIEVhY2ggZG93bmxvYWQgZnJvbSBub3cgb24gd2lsbCBiZSBlY2hvZWQgdG8gdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IEFwcGxpY2F0aW9uIHNpZ25hdHVyZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdXV1chJworICAgICAgICBfc3ViY29kZSA9ICdSR1VFJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9yZWdpc3Rlcl9wcm90b2NvbCA9IHsKKyAgICAgICAgJ2Zvcl9wcm90b2NvbCcgOiAnUFJPVCcsCisgICAgfQorCisgICAgZGVmIHJlZ2lzdGVyX3Byb3RvY29sKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInJlZ2lzdGVyIHByb3RvY29sOiBSZWdpc3RlcnMgYXBwbGljYXRpb24gYXMgYSBceGQyaGFuZGxlclx4ZDMgZm9yIHRoaXMgcHJvdG9jb2wgd2l0aCBhIGdpdmVuIHByZWZpeC4gVGhlIGhhbmRsZXIgd2lsbCByZWNlaXZlIFx4ZDJPcGVuVVJMXHhkMywgb3IgaWYgdGhhdCBmYWlscywgXHhkMkdldFVSTFx4ZDMgZXZlbnQuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBBcHBsaWNhdGlvbiBzaWcKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBmb3JfcHJvdG9jb2w6IHByb3RvY29sIHByZWZpeDogXHhkMmZpbmdlcjpceGQzLCBceGQyZmlsZVx4ZDMsCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogVFJVRSBpZiByZWdpc3RyYXRpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnV1dXIScKKyAgICAgICAgX3N1YmNvZGUgPSAnUkdQUicKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9yZWdpc3Rlcl9wcm90b2NvbCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX3JlZ2lzdGVyX3ZpZXdlciA9IHsKKyAgICAgICAgJ01JTUVfdHlwZScgOiAnTUlNRScsCisgICAgICAgICd3aXRoX2ZpbGVfdHlwZScgOiAnRlRZUCcsCisgICAgfQorCisgICAgZGVmIHJlZ2lzdGVyX3ZpZXdlcihzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIicmVnaXN0ZXIgdmlld2VyOiBSZWdpc3RlcnMgYW4gYXBwbGljYXRpb24gYXMgYSBceGQ0c3BlY2lhbFx4ZDUgdmlld2VyIGZvciB0aGlzIE1JTUUgdHlwZS4gVGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgbGF1bmNoZWQgd2l0aCBWaWV3RG9jIGV2ZW50cworICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogQXBwbGljYXRpb24gc2lnCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgTUlNRV90eXBlOiBNSU1FIHR5cGUgdmlld2VyIGlzIHJlZ2lzdGVyaW5nIGZvcgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHdpdGhfZmlsZV90eXBlOiBNYWMgZmlsZSB0eXBlIGZvciB0aGUgZG93bmxvYWRlZCBmaWxlcworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IFRSVUUgaWYgcmVnaXN0cmF0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWwKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1dXVyEnCisgICAgICAgIF9zdWJjb2RlID0gJ1JHVlcnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfcmVnaXN0ZXJfdmlld2VyKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfcmVnaXN0ZXJfd2luZG93X2Nsb3NlID0geworICAgICAgICAnZm9yX3dpbmRvdycgOiAnV0lORCcsCisgICAgfQorCisgICAgZGVmIHJlZ2lzdGVyX3dpbmRvd19jbG9zZShzZWxmLCBfb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJyZWdpc3RlciB3aW5kb3cgY2xvc2U6IE5ldHNjYXBlIHdpbGwgbm90aWZ5IHJlZ2lzdGVyZWQgYXBwbGljYXRpb24gd2hlbiB0aGlzIHdpbmRvdyBjbG9zZXMKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IEFwcGxpY2F0aW9uIHNpZ25hdHVyZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGZvcl93aW5kb3c6IHdpbmRvdyBJRAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRydWUgaWYgc3VjY2Vzc2Z1bAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnV1dXIScKKyAgICAgICAgX3N1YmNvZGUgPSAnUkdXQycKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9yZWdpc3Rlcl93aW5kb3dfY2xvc2UpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIHVucmVnaXN0ZXJfVVJMX2VjaG8oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInVucmVnaXN0ZXIgVVJMIGVjaG86IGNhbmNlbHMgVVJMIGVjaG8KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGFwcGxpY2F0aW9uIHNpZ25hdHVyZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdXV1chJworICAgICAgICBfc3ViY29kZSA9ICdVTlJVJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF91bnJlZ2lzdGVyX3Byb3RvY29sID0geworICAgICAgICAnZm9yX3Byb3RvY29sJyA6ICdQUk9UJywKKyAgICB9CisKKyAgICBkZWYgdW5yZWdpc3Rlcl9wcm90b2NvbChzZWxmLCBfb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJ1bnJlZ2lzdGVyIHByb3RvY29sOiByZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiBceGQycmVnaXN0ZXIgcHJvdG9jb2xceGQzCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBBcHBsaWNhdGlvbiBzaWcuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgZm9yX3Byb3RvY29sOiBwcm90b2NvbCBwcmVmaXguIElmIG5vbmUsIHVucmVnaXN0ZXIgZm9yIGFsbCBwcm90b2NvbHMKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBUUlVFIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1dXVyEnCisgICAgICAgIF9zdWJjb2RlID0gJ1VOUlAnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfdW5yZWdpc3Rlcl9wcm90b2NvbCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX3VucmVnaXN0ZXJfdmlld2VyID0geworICAgICAgICAnTUlNRV90eXBlJyA6ICdNSU1FJywKKyAgICB9CisKKyAgICBkZWYgdW5yZWdpc3Rlcl92aWV3ZXIoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInVucmVnaXN0ZXIgdmlld2VyOiBSZXZlcnQgdG8gdGhlIG9sZCB3YXkgb2YgaGFuZGxpbmcgdGhpcyBNSU1FIHR5cGUKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IEFwcGxpY2F0aW9uIHNpZworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IE1JTUVfdHlwZTogTUlNRSB0eXBlIHRvIGJlIHVucmVnaXN0ZXJlZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IFRSVUUgaWYgdGhlIGV2ZW50IHdhcyBzdWNjZXNzZnVsCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdXV1chJworICAgICAgICBfc3ViY29kZSA9ICdVTlJWJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3VucmVnaXN0ZXJfdmlld2VyKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfdW5yZWdpc3Rlcl93aW5kb3dfY2xvc2UgPSB7CisgICAgICAgICdmb3Jfd2luZG93JyA6ICdXSU5EJywKKyAgICB9CisKKyAgICBkZWYgdW5yZWdpc3Rlcl93aW5kb3dfY2xvc2Uoc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIidW5yZWdpc3RlciB3aW5kb3cgY2xvc2U6IFVuZG8gZm9yIHJlZ2lzdGVyIHdpbmRvdyBjbG9zZQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogQXBwbGljYXRpb24gc2lnbmF0dXJlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgZm9yX3dpbmRvdzogd2luZG93IElECisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdHJ1ZSBpZiBzdWNjZXNzZnVsCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdXV1chJworICAgICAgICBfc3ViY29kZSA9ICdVTlJDJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3VucmVnaXN0ZXJfd2luZG93X2Nsb3NlKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiB3ZWJBY3RpdmF0ZShzZWxmLCBfb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJ3ZWJBY3RpdmF0ZTogTWFrZXMgTmV0c2NhcGUgdGhlIGZyb250bW9zdCBhcHBsaWNhdGlvbiwgYW5kIHNlbGVjdHMgYSBnaXZlbiB3aW5kb3cuIFRoaXMgZXZlbnQgaXMgaGVyZSBmb3Igc3VpdGUgY29tcGxldGVuZXNzLyBjcm9zcy1wbGF0Zm9ybSBjb21wYXRpYmlsaXR5IG9ubHksIHlvdSBzaG91bGQgdXNlIHN0YW5kYXJkIEFwcGxlRXZlbnRzIGluc3RlYWQuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB3aW5kb3cgdG8gYnJpbmcgdG8gZnJvbnQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnV1dXIScKKyAgICAgICAgX3N1YmNvZGUgPSAnQUNUVicKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1dvcmxkV2lkZVdlYl9zdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9Xb3JsZFdpZGVXZWJfc3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMGJiNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9Xb3JsZFdpZGVXZWJfc3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL1dvcmxkV2lkZVdlYl9zdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9Xb3JsZFdpZGVXZWJfc3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMGJiNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZS9Xb3JsZFdpZGVXZWJfc3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyZjE4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMTA5IEBACisiIiIKK1BhY2thZ2UgZ2VuZXJhdGVkIGZyb20gL1ZvbHVtZXMvU2FwL0FwcGxpY2F0aW9ucyAoTWFjIE9TIDkpL05ldHNjYXBlIENvbW11bmljYXRvclx4ZTJceDg0XHhhMiBGb2xkZXIvTmV0c2NhcGUgQ29tbXVuaWNhdG9yXHhlMlx4ODRceGEyCisiIiIKKworZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJJbiAzLngsIHRoZSBOZXRzY2FwZSBwYWNrYWdlIGlzIHJlbW92ZWQuIiwgc3RhY2tsZXZlbD0yKQorCitpbXBvcnQgYWV0b29scworRXJyb3IgPSBhZXRvb2xzLkVycm9yCitpbXBvcnQgU3RhbmRhcmRfU3VpdGUKK2ltcG9ydCBTdGFuZGFyZF9VUkxfc3VpdGUKK2ltcG9ydCBNb3ppbGxhX3N1aXRlCitpbXBvcnQgVGV4dAoraW1wb3J0IFdvcmxkV2lkZVdlYl9zdWl0ZQoraW1wb3J0IFBvd2VyUGxhbnQKK2ltcG9ydCBSZXF1aXJlZF9zdWl0ZQorCisKK19jb2RlX3RvX21vZHVsZSA9IHsKKyAgICAnQ29SZScgOiBTdGFuZGFyZF9TdWl0ZSwKKyAgICAnR1VSTCcgOiBTdGFuZGFyZF9VUkxfc3VpdGUsCisgICAgJ01PU1MnIDogTW96aWxsYV9zdWl0ZSwKKyAgICAnVEVYVCcgOiBUZXh0LAorICAgICdXV1chJyA6IFdvcmxkV2lkZVdlYl9zdWl0ZSwKKyAgICAncHBudCcgOiBQb3dlclBsYW50LAorICAgICdyZXFkJyA6IFJlcXVpcmVkX3N1aXRlLAorfQorCisKKworX2NvZGVfdG9fZnVsbG5hbWUgPSB7CisgICAgJ0NvUmUnIDogKCdOZXRzY2FwZS5TdGFuZGFyZF9TdWl0ZScsICdTdGFuZGFyZF9TdWl0ZScpLAorICAgICdHVVJMJyA6ICgnTmV0c2NhcGUuU3RhbmRhcmRfVVJMX3N1aXRlJywgJ1N0YW5kYXJkX1VSTF9zdWl0ZScpLAorICAgICdNT1NTJyA6ICgnTmV0c2NhcGUuTW96aWxsYV9zdWl0ZScsICdNb3ppbGxhX3N1aXRlJyksCisgICAgJ1RFWFQnIDogKCdOZXRzY2FwZS5UZXh0JywgJ1RleHQnKSwKKyAgICAnV1dXIScgOiAoJ05ldHNjYXBlLldvcmxkV2lkZVdlYl9zdWl0ZScsICdXb3JsZFdpZGVXZWJfc3VpdGUnKSwKKyAgICAncHBudCcgOiAoJ05ldHNjYXBlLlBvd2VyUGxhbnQnLCAnUG93ZXJQbGFudCcpLAorICAgICdyZXFkJyA6ICgnTmV0c2NhcGUuUmVxdWlyZWRfc3VpdGUnLCAnUmVxdWlyZWRfc3VpdGUnKSwKK30KKworZnJvbSBTdGFuZGFyZF9TdWl0ZSBpbXBvcnQgKgorZnJvbSBTdGFuZGFyZF9VUkxfc3VpdGUgaW1wb3J0ICoKK2Zyb20gTW96aWxsYV9zdWl0ZSBpbXBvcnQgKgorZnJvbSBUZXh0IGltcG9ydCAqCitmcm9tIFdvcmxkV2lkZVdlYl9zdWl0ZSBpbXBvcnQgKgorZnJvbSBQb3dlclBsYW50IGltcG9ydCAqCitmcm9tIFJlcXVpcmVkX3N1aXRlIGltcG9ydCAqCisKK2RlZiBnZXRiYXNlY2xhc3Nlcyh2KToKKyAgICBpZiBub3QgZ2V0YXR0cih2LCAnX3Byb3BkaWN0JywgTm9uZSk6CisgICAgICAgIHYuX3Byb3BkaWN0ID0ge30KKyAgICAgICAgdi5fZWxlbWRpY3QgPSB7fQorICAgICAgICBmb3Igc3VwZXJjbGFzc25hbWUgaW4gZ2V0YXR0cih2LCAnX3N1cGVyY2xhc3NuYW1lcycsIFtdKToKKyAgICAgICAgICAgIHN1cGVyY2xhc3MgPSBldmFsKHN1cGVyY2xhc3NuYW1lKQorICAgICAgICAgICAgZ2V0YmFzZWNsYXNzZXMoc3VwZXJjbGFzcykKKyAgICAgICAgICAgIHYuX3Byb3BkaWN0LnVwZGF0ZShnZXRhdHRyKHN1cGVyY2xhc3MsICdfcHJvcGRpY3QnLCB7fSkpCisgICAgICAgICAgICB2Ll9lbGVtZGljdC51cGRhdGUoZ2V0YXR0cihzdXBlcmNsYXNzLCAnX2VsZW1kaWN0Jywge30pKQorICAgICAgICB2Ll9wcm9wZGljdC51cGRhdGUoZ2V0YXR0cih2LCAnX3ByaXZwcm9wZGljdCcsIHt9KSkKKyAgICAgICAgdi5fZWxlbWRpY3QudXBkYXRlKGdldGF0dHIodiwgJ19wcml2ZWxlbWRpY3QnLCB7fSkpCisKK2ltcG9ydCBTdGRTdWl0ZXMKKworIworIyBTZXQgcHJvcGVydHkgYW5kIGVsZW1lbnQgZGljdGlvbmFyaWVzIG5vdyB0aGF0IGFsbCBjbGFzc2VzIGhhdmUgYmVlbiBkZWZpbmVkCisjCitnZXRiYXNlY2xhc3Nlcyh0ZXh0KQorZ2V0YmFzZWNsYXNzZXMoc3R5bGVzZXQpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVGV4dF9TdWl0ZS5jaGFyYWN0ZXIpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVGV4dF9TdWl0ZS50ZXh0X2Zsb3cpCitnZXRiYXNlY2xhc3NlcyhTdGRTdWl0ZXMuVGV4dF9TdWl0ZS53b3JkKQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlRleHRfU3VpdGUucGFyYWdyYXBoKQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlRleHRfU3VpdGUudGV4dF9zdHlsZV9pbmZvKQorZ2V0YmFzZWNsYXNzZXMoU3RkU3VpdGVzLlRleHRfU3VpdGUubGluZSkKK2dldGJhc2VjbGFzc2VzKFN0ZFN1aXRlcy5UZXh0X1N1aXRlLnRleHQpCitnZXRiYXNlY2xhc3Nlcyh3aW5kb3cpCitnZXRiYXNlY2xhc3NlcyhhcHBsaWNhdGlvbikKKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2N0eHQnIDogdGV4dCwKKyAgICAnc3R5cycgOiBzdHlsZXNldCwKKyAgICAnY2hhICcgOiBTdGRTdWl0ZXMuVGV4dF9TdWl0ZS5jaGFyYWN0ZXIsCisgICAgJ2NmbG8nIDogU3RkU3VpdGVzLlRleHRfU3VpdGUudGV4dF9mbG93LAorICAgICdjd29yJyA6IFN0ZFN1aXRlcy5UZXh0X1N1aXRlLndvcmQsCisgICAgJ2NwYXInIDogU3RkU3VpdGVzLlRleHRfU3VpdGUucGFyYWdyYXBoLAorICAgICd0c3R5JyA6IFN0ZFN1aXRlcy5UZXh0X1N1aXRlLnRleHRfc3R5bGVfaW5mbywKKyAgICAnY2xpbicgOiBTdGRTdWl0ZXMuVGV4dF9TdWl0ZS5saW5lLAorICAgICdjdHh0JyA6IFN0ZFN1aXRlcy5UZXh0X1N1aXRlLnRleHQsCisgICAgJ2N3aW4nIDogd2luZG93LAorICAgICdjYXBwJyA6IGFwcGxpY2F0aW9uLAorfQorCisKK2NsYXNzIE5ldHNjYXBlKFN0YW5kYXJkX1N1aXRlX0V2ZW50cywKKyAgICAgICAgU3RhbmRhcmRfVVJMX3N1aXRlX0V2ZW50cywKKyAgICAgICAgTW96aWxsYV9zdWl0ZV9FdmVudHMsCisgICAgICAgIFRleHRfRXZlbnRzLAorICAgICAgICBXb3JsZFdpZGVXZWJfc3VpdGVfRXZlbnRzLAorICAgICAgICBQb3dlclBsYW50X0V2ZW50cywKKyAgICAgICAgUmVxdWlyZWRfc3VpdGVfRXZlbnRzLAorICAgICAgICBhZXRvb2xzLlRhbGtUbyk6CisgICAgX3NpZ25hdHVyZSA9ICdNT1NTJworCisgICAgX21vZHVsZU5hbWUgPSAnTmV0c2NhcGUnCisKKyAgICBfZWxlbWRpY3QgPSBhcHBsaWNhdGlvbi5fZWxlbWRpY3QKKyAgICBfcHJvcGRpY3QgPSBhcHBsaWNhdGlvbi5fcHJvcGRpY3QKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDc2ODkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDc2ODkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvTmV0c2NhcGUvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjViY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL0FwcGxlU2NyaXB0X1N1aXRlLnB5CkBAIC0wLDAgKzEsMjIxNSBAQAorIiIiU3VpdGUgQXBwbGVTY3JpcHQgU3VpdGU6IFN0YW5kYXJkIHRlcm1zIGZvciBBcHBsZVNjcmlwdAorTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9Wb2x1bWVzL1NhcC9TeXN0ZW0gRm9sZGVyL0V4dGVuc2lvbnMvQXBwbGVTY3JpcHQKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ2FzY3InCisKK2NsYXNzIEFwcGxlU2NyaXB0X1N1aXRlX0V2ZW50czoKKworICAgIGRlZiBfMjZfKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiImOiBDb25jYXRlbmF0aW9uCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FzY3InCisgICAgICAgIF9zdWJjb2RlID0gJ2NjYXQnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgXzJhXyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiKjogTXVsdGlwbGljYXRpb24KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhbnl0aGluZworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYXNjcicKKyAgICAgICAgX3N1YmNvZGUgPSAnKiAgICcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBfMmJfKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiIrOiBBZGRpdGlvbgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IGFueXRoaW5nCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhc2NyJworICAgICAgICBfc3ViY29kZSA9ICcrICAgJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIF8yZF8oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIi06IFN1YnRyYWN0aW9uCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FzY3InCisgICAgICAgIF9zdWJjb2RlID0gJy0gICAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgXzNjXyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiPDogTGVzcyB0aGFuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FzY3InCisgICAgICAgIF9zdWJjb2RlID0gJzwgICAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgXzNkXyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiPTogRXF1YWxpdHkKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhbnl0aGluZworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYXNjcicKKyAgICAgICAgX3N1YmNvZGUgPSAnPSAgICcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBfM2VfKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiI+OiBHcmVhdGVyIHRoYW4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhbnl0aGluZworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYXNjcicKKyAgICAgICAgX3N1YmNvZGUgPSAnPiAgICcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfQ2FsbF9hNV9zdWJyb3V0aW5lID0geworICAgICAgICAnYXQnIDogJ2F0ICAnLAorICAgICAgICAnZnJvbV8nIDogJ2Zyb20nLAorICAgICAgICAnZm9yXycgOiAnZm9yICcsCisgICAgICAgICd0bycgOiAndG8gICcsCisgICAgICAgICd0aHJ1JyA6ICd0aHJ1JywKKyAgICAgICAgJ3Rocm91Z2gnIDogJ3RoZ2gnLAorICAgICAgICAnYnknIDogJ2J5ICAnLAorICAgICAgICAnb24nIDogJ29uICAnLAorICAgICAgICAnaW50bycgOiAnaW50bycsCisgICAgICAgICdvbnRvJyA6ICdvbnRvJywKKyAgICAgICAgJ2JldHdlZW4nIDogJ2J0d24nLAorICAgICAgICAnYWdhaW5zdCcgOiAnYWdzdCcsCisgICAgICAgICdvdXRfb2YnIDogJ291dG8nLAorICAgICAgICAnaW5zdGVhZF9vZicgOiAnaXN0bycsCisgICAgICAgICdhc2lkZV9mcm9tJyA6ICdhc2RmJywKKyAgICAgICAgJ2Fyb3VuZCcgOiAnYXJuZCcsCisgICAgICAgICdiZXNpZGUnIDogJ2JzaWQnLAorICAgICAgICAnYmVuZWF0aCcgOiAnYm50aCcsCisgICAgICAgICd1bmRlcicgOiAndW5kcicsCisgICAgICAgICdvdmVyJyA6ICdvdmVyJywKKyAgICAgICAgJ2Fib3ZlJyA6ICdhYnZlJywKKyAgICAgICAgJ2JlbG93JyA6ICdiZWx3JywKKyAgICAgICAgJ2FwYXJ0X2Zyb20nIDogJ2FwcnQnLAorICAgICAgICAnYWJvdXQnIDogJ2Fib3UnLAorICAgICAgICAnc2luY2UnIDogJ3NuY2UnLAorICAgICAgICAnZ2l2ZW4nIDogJ2dpdm4nLAorICAgICAgICAnd2l0aCcgOiAnd2l0aCcsCisgICAgICAgICd3aXRob3V0JyA6ICd3b3V0JywKKyAgICB9CisKKyAgICBkZWYgQ2FsbF9hNV9zdWJyb3V0aW5lKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkNhbGxceGE1c3Vicm91dGluZTogQSBzdWJyb3V0aW5lIGNhbGwKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGFueXRoaW5nCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgYXQ6IGEgcHJlcG9zaXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBmcm9tXzogYSBwcmVwb3NpdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGZvcl86IGEgcHJlcG9zaXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB0bzogYSBwcmVwb3NpdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRocnU6IGEgcHJlcG9zaXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB0aHJvdWdoOiBhIHByZXBvc2l0aW9uCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgYnk6IGEgcHJlcG9zaXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBvbjogYSBwcmVwb3NpdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGludG86IGEgcHJlcG9zaXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBvbnRvOiBhIHByZXBvc2l0aW9uCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgYmV0d2VlbjogYSBwcmVwb3NpdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGFnYWluc3Q6IGEgcHJlcG9zaXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBvdXRfb2Y6IGEgcHJlcG9zaXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBpbnN0ZWFkX29mOiBhIHByZXBvc2l0aW9uCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgYXNpZGVfZnJvbTogYSBwcmVwb3NpdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGFyb3VuZDogYSBwcmVwb3NpdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGJlc2lkZTogYSBwcmVwb3NpdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGJlbmVhdGg6IGEgcHJlcG9zaXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB1bmRlcjogYSBwcmVwb3NpdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IG92ZXI6IGEgcHJlcG9zaXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBhYm92ZTogYSBwcmVwb3NpdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGJlbG93OiBhIHByZXBvc2l0aW9uCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgYXBhcnRfZnJvbTogYSBwcmVwb3NpdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGFib3V0OiBhIHByZXBvc2l0aW9uCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgc2luY2U6IGEgcHJlcG9zaXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBnaXZlbjogcGFyYW1ldGVyOnZhbHVlIHBhaXJzLCBjb21tYS1zZXBhcmF0ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoOiBmb3JtYWwgcGFyYW1ldGVyIHNldCB0byB0cnVlIGlmIG1hdGNoaW5nIGFjdHVhbCBwYXJhbWV0ZXIgaXMgcHJvdmlkZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRob3V0OiBmb3JtYWwgcGFyYW1ldGVyIHNldCB0byBmYWxzZSBpZiBtYXRjaGluZyBhY3R1YWwgcGFybWV0ZXIgaXMgcHJvdmlkZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhbnl0aGluZworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYXNjcicKKyAgICAgICAgX3N1YmNvZGUgPSAncHNicicKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9DYWxsX2E1X3N1YnJvdXRpbmUpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIF81ZV8oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIl46IEV4cG9uZW50aWF0aW9uCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FzY3InCisgICAgICAgIF9zdWJjb2RlID0gJ14gICAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiYWN0aXZhdGU6IEJyaW5nIHRoZSB0YXJnZXRlZCBhcHBsaWNhdGlvbiBwcm9ncmFtIHRvIHRoZSBmcm9udAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdtaXNjJworICAgICAgICBfc3ViY29kZSA9ICdhY3R2JworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBhbmRfKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJhbmQ6IExvZ2ljYWwgY29uanVuY3Rpb24KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhbnl0aGluZworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYXNjcicKKyAgICAgICAgX3N1YmNvZGUgPSAnQU5EICcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBhc18oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImFzOiBDb2VyY2lvbgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IGFueXRoaW5nCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhc2NyJworICAgICAgICBfc3ViY29kZSA9ICdjb2VyJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIGNvbnRhaW5zKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJjb250YWluczogQ29udGFpbm1lbnQKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhbnl0aGluZworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYXNjcicKKyAgICAgICAgX3N1YmNvZGUgPSAnY29udCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBkaXYoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImRpdjogUXVvdGllbnQKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhbnl0aGluZworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYXNjcicKKyAgICAgICAgX3N1YmNvZGUgPSAnZGl2ICcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBlbmRfdGVsbChzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJlbmQgdGVsbDogUmVjb3JkIG9yIGxvZyBhbiBceGQ0ZW5kIHRlbGxceGQ1IHN0YXRlbWVudAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhc2NyJworICAgICAgICBfc3ViY29kZSA9ICd0ZW5kJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBlbmRzX3dpdGgoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImVuZHMgd2l0aDogRW5kcyB3aXRoCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FzY3InCisgICAgICAgIF9zdWJjb2RlID0gJ2VuZHMnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX2Vycm9yID0geworICAgICAgICAnbnVtYmVyJyA6ICdlcnJuJywKKyAgICAgICAgJ3BhcnRpYWxfcmVzdWx0JyA6ICdwdGxyJywKKyAgICAgICAgJ2Zyb21fJyA6ICdlcm9iJywKKyAgICAgICAgJ3RvJyA6ICdlcnJ0JywKKyAgICB9CisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiZXJyb3I6IFJhaXNlIGFuIGVycm9yCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhbnl0aGluZworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IG51bWJlcjogYW4gZXJyb3IgbnVtYmVyCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgcGFydGlhbF9yZXN1bHQ6IGFueSBwYXJ0aWFsIHJlc3VsdCBvY2N1cnJpbmcgYmVmb3JlIHRoZSBlcnJvcgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGZyb21fOiB0aGUgb2JqZWN0IHRoYXQgY2F1c2VkIHRoZSBlcnJvcgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRvOiB0aGUgZGVzaXJlZCBjbGFzcyBmb3IgYSBmYWlsZWQgY29lcmNpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYXNjcicKKyAgICAgICAgX3N1YmNvZGUgPSAnZXJyICcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9lcnJvcikKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgaWRsZShzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJpZGxlOiBTZW50IHRvIGEgc2NyaXB0IGFwcGxpY2F0aW9uIHdoZW4gaXQgaXMgaWRsZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciBuZXh0IGlkbGUgZXZlbnQKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ21pc2MnCisgICAgICAgIF9zdWJjb2RlID0gJ2lkbGUnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIGxhdW5jaChzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJsYXVuY2g6IFN0YXJ0IGFuIGFwcGxpY2F0aW9uIGZvciBzY3JpcHRpbmcKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYXNjcicKKyAgICAgICAgX3N1YmNvZGUgPSAnbm9vcCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgbG9nKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJsb2c6IENhdXNlIGEgY29tbWVudCB0byBiZSBsb2dnZWQKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHVuZG9jdW1lbnRlZCwgdHlwZWNvZGUgJ1RFWFQnCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FzY3InCisgICAgICAgIF9zdWJjb2RlID0gJ2NtbnQnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgbW9kKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJtb2Q6IFJlbWFpbmRlcgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IGFueXRoaW5nCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhc2NyJworICAgICAgICBfc3ViY29kZSA9ICdtb2QgJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIG5lZ2F0ZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIibmVnYXRlOiBOdW1lcmljIG5lZ2F0aW9uCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FzY3InCisgICAgICAgIF9zdWJjb2RlID0gJ25lZyAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgbm90XyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIibm90OiBMb2dpY2FsIG5lZ2F0aW9uCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FzY3InCisgICAgICAgIF9zdWJjb2RlID0gJ05PVCAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgb3JfKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJvcjogTG9naWNhbCBkaXNqdW5jdGlvbgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IGFueXRoaW5nCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhc2NyJworICAgICAgICBfc3ViY29kZSA9ICdPUiAgJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIHN0YXJ0X2xvZyhzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzdGFydCBsb2c6IFN0YXJ0IGV2ZW50IGxvZ2dpbmcgaW4gdGhlIHNjcmlwdCBlZGl0b3IKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnVG95UycKKyAgICAgICAgX3N1YmNvZGUgPSAnbG9nMScKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgc3RhcnRzX3dpdGgoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInN0YXJ0cyB3aXRoOiBTdGFydHMgd2l0aAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogYW4gQUUgb2JqZWN0IHJlZmVyZW5jZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IGFueXRoaW5nCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhc2NyJworICAgICAgICBfc3ViY29kZSA9ICdiZ3d0JworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIHN0b3BfbG9nKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInN0b3AgbG9nOiBTdG9wIGV2ZW50IGxvZ2dpbmcgaW4gdGhlIHNjcmlwdCBlZGl0b3IKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnVG95UycKKyAgICAgICAgX3N1YmNvZGUgPSAnbG9nMCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgdGVsbChzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJ0ZWxsOiBSZWNvcmQgb3IgbG9nIGEgXHhkNHRlbGxceGQ1IHN0YXRlbWVudAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhc2NyJworICAgICAgICBfc3ViY29kZSA9ICd0ZWxsJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBfYWRfKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJceGFkOiBJbmVxdWFsaXR5CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FzY3InCisgICAgICAgIF9zdWJjb2RlID0gJ1x4YWQgICAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgX2IyXyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiXHhiMjogTGVzcyB0aGFuIG9yIGVxdWFsIHRvCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FzY3InCisgICAgICAgIF9zdWJjb2RlID0gJzw9ICAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgX2IzXyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiXHhiMzogR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBhbiBBRSBvYmplY3QgcmVmZXJlbmNlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYW55dGhpbmcKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FzY3InCisgICAgICAgIF9zdWJjb2RlID0gJz49ICAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgX2Q2XyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiXHhkNjogRGl2aXNpb24KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGFuIEFFIG9iamVjdCByZWZlcmVuY2UKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhbnl0aGluZworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYXNjcicKKyAgICAgICAgX3N1YmNvZGUgPSAnLyAgICcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCitjbGFzcyBhbnl0aGluZyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImFueXRoaW5nIC0gYW55IGNsYXNzIG9yIHJlZmVyZW5jZSAiIiIKKyAgICB3YW50ID0gJyoqKionCisKK2NsYXNzIHBpY3R1cmVzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIicGljdHVyZXMgLSAgIiIiCisgICAgd2FudCA9ICdQSUNUJworCitwaWN0dXJlID0gcGljdHVyZXMKKworY2xhc3Mgc3R5bGVkX3RleHQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJzdHlsZWQgdGV4dCAtIHRleHQgd2l0aCBmb250LCBzaXplLCBhbmQgc3R5bGUgaW5mb3JtYXRpb24gIiIiCisgICAgd2FudCA9ICdTVFhUJworCitzdHlsZWRfdGV4dCA9IHN0eWxlZF90ZXh0CisKK2NsYXNzIHN0cmluZ3MoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJzdHJpbmdzIC0gICIiIgorICAgIHdhbnQgPSAnVEVYVCcKKworc3RyaW5nID0gc3RyaW5ncworCitjbGFzcyBhbGlhcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImFsaWFzIC0gYSBmaWxlIG9uIGEgZGlzayBvciBzZXJ2ZXIuICBUaGUgZmlsZSBtdXN0IGV4aXN0IHdoZW4geW91IGNoZWNrIHRoZSBzeW50YXggb2YgeW91ciBzY3JpcHQuICIiIgorICAgIHdhbnQgPSAnYWxpcycKK2NsYXNzIF9Qcm9wX1BPU0lYX3BhdGgoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlBPU0lYIHBhdGggLSB0aGUgUE9TSVggcGF0aCBvZiB0aGUgZmlsZSAiIiIKKyAgICB3aGljaCA9ICdwc3hwJworICAgIHdhbnQgPSAnVEVYVCcKKworYWxpYXNlcyA9IGFsaWFzCisKK2NsYXNzIEFwcmlsKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiQXByaWwgLSB0aGUgbW9udGggb2YgQXByaWwgIiIiCisgICAgd2FudCA9ICdhcHIgJworCitjbGFzcyBBdWd1c3QoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJBdWd1c3QgLSB0aGUgbW9udGggb2YgQXVndXN0ICIiIgorICAgIHdhbnQgPSAnYXVnICcKKworY2xhc3MgYm9vbGVhbnMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJib29sZWFucyAtICAiIiIKKyAgICB3YW50ID0gJ2Jvb2wnCisKK2Jvb2xlYW4gPSBib29sZWFucworCitjbGFzcyBSR0JfY29sb3JzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiUkdCIGNvbG9ycyAtICAiIiIKKyAgICB3YW50ID0gJ2NSR0InCisKK1JHQl9jb2xvciA9IFJHQl9jb2xvcnMKKworY2xhc3MgYXBwbGljYXRpb24oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJhcHBsaWNhdGlvbiAtIHNwZWNpZmllcyBnbG9iYWwgcHJvcGVydGllcyBvZiBBcHBsZVNjcmlwdCAiIiIKKyAgICB3YW50ID0gJ2NhcHAnCitjbGFzcyBfUHJvcF9BcHBsZVNjcmlwdChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiQXBwbGVTY3JpcHQgLSB0aGUgdG9wLWxldmVsIHNjcmlwdCBvYmplY3QgIiIiCisgICAgd2hpY2ggPSAnYXNjcicKKyAgICB3YW50ID0gJ3NjcHQnCitBcHBsZVNjcmlwdCA9IF9Qcm9wX0FwcGxlU2NyaXB0KCkKK2NsYXNzIF9Qcm9wX2RheXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImRheXMgLSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgaW4gYSBkYXkgIiIiCisgICAgd2hpY2ggPSAnZGF5cycKKyAgICB3YW50ID0gJ2xvbmcnCitkYXlzID0gX1Byb3BfZGF5cygpCitjbGFzcyBfUHJvcF9ob3VycyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaG91cnMgLSB0aGUgbnVtYmVyIG9mIHNlY29uZHMgaW4gYW4gaG91ciAiIiIKKyAgICB3aGljaCA9ICdob3VyJworICAgIHdhbnQgPSAnbG9uZycKK2hvdXJzID0gX1Byb3BfaG91cnMoKQorY2xhc3MgX1Byb3BfbWludXRlcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibWludXRlcyAtIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBpbiBhIG1pbnV0ZSAiIiIKKyAgICB3aGljaCA9ICdtaW4gJworICAgIHdhbnQgPSAnbG9uZycKK21pbnV0ZXMgPSBfUHJvcF9taW51dGVzKCkKK2NsYXNzIF9Qcm9wX3BpKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwaSAtIHRoZSBjb25zdGFudCBwaSAiIiIKKyAgICB3aGljaCA9ICdwaSAgJworICAgIHdhbnQgPSAnZG91YicKK3BpID0gX1Byb3BfcGkoKQorY2xhc3MgX1Byb3BfcHJpbnRfZGVwdGgoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInByaW50IGRlcHRoIC0gdGhlIG1heGltdW0gZGVwdGggdG8gcHJpbnQgIiIiCisgICAgd2hpY2ggPSAncHJkcCcKKyAgICB3YW50ID0gJ2xvbmcnCitwcmludF9kZXB0aCA9IF9Qcm9wX3ByaW50X2RlcHRoKCkKK2NsYXNzIF9Qcm9wX3ByaW50X2xlbmd0aChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicHJpbnQgbGVuZ3RoIC0gdGhlIG1heGltdW0gbGVuZ3RoIHRvIHByaW50ICIiIgorICAgIHdoaWNoID0gJ3BybG4nCisgICAgd2FudCA9ICdsb25nJworcHJpbnRfbGVuZ3RoID0gX1Byb3BfcHJpbnRfbGVuZ3RoKCkKK2NsYXNzIF9Qcm9wX3Jlc3VsdChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicmVzdWx0IC0gdGhlIGxhc3QgcmVzdWx0IG9mIGV2YWx1YXRpb24gIiIiCisgICAgd2hpY2ggPSAncnNsdCcKKyAgICB3YW50ID0gJyoqKionCityZXN1bHQgPSBfUHJvcF9yZXN1bHQoKQorY2xhc3MgX1Byb3BfcmV0dXJuXyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicmV0dXJuIC0gYSByZXR1cm4gY2hhcmFjdGVyICIiIgorICAgIHdoaWNoID0gJ3JldCAnCisgICAgd2FudCA9ICdjaGEgJworcmV0dXJuXyA9IF9Qcm9wX3JldHVybl8oKQorY2xhc3MgX1Byb3Bfc3BhY2UoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNwYWNlIC0gYSBzcGFjZSBjaGFyYWN0ZXIgIiIiCisgICAgd2hpY2ggPSAnc3BhYycKKyAgICB3YW50ID0gJ2NoYSAnCitzcGFjZSA9IF9Qcm9wX3NwYWNlKCkKK2NsYXNzIF9Qcm9wX3RhYihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidGFiIC0gYSB0YWIgY2hhcmFjdGVyICIiIgorICAgIHdoaWNoID0gJ3RhYiAnCisgICAgd2FudCA9ICdjaGEgJwordGFiID0gX1Byb3BfdGFiKCkKK2NsYXNzIF9Qcm9wX3RleHRfaXRlbV9kZWxpbWl0ZXJzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ0ZXh0IGl0ZW0gZGVsaW1pdGVycyAtIHRoZSB0ZXh0IGl0ZW0gZGVsaW1pdGVycyBvZiBhIHN0cmluZyAiIiIKKyAgICB3aGljaCA9ICd0eGRsJworICAgIHdhbnQgPSAnbGlzdCcKK3RleHRfaXRlbV9kZWxpbWl0ZXJzID0gX1Byb3BfdGV4dF9pdGVtX2RlbGltaXRlcnMoKQorY2xhc3MgX1Byb3Bfd2Vla3MoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIndlZWtzIC0gdGhlIG51bWJlciBvZiBzZWNvbmRzIGluIGEgd2VlayAiIiIKKyAgICB3aGljaCA9ICd3ZWVrJworICAgIHdhbnQgPSAnbG9uZycKK3dlZWtzID0gX1Byb3Bfd2Vla3MoKQorCithcHBsaWNhdGlvbnMgPSBhcHBsaWNhdGlvbgorCithcHAgPSBhcHBsaWNhdGlvbgorCitjbGFzcyB1cHBlcl9jYXNlKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidXBwZXIgY2FzZSAtIFRleHQgd2l0aCBsb3dlciBjYXNlIGNvbnZlcnRlZCB0byB1cHBlciBjYXNlICIiIgorICAgIHdhbnQgPSAnY2FzZScKKworY2xhc3MgY3ViaWNfY2VudGltZXRlcnMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJjdWJpYyBjZW50aW1ldGVycyAtIGEgdm9sdW1lIG1lYXN1cmVtZW50IGluIFNJIGN1YmljIGNlbnRpbWV0ZXJzICIiIgorICAgIHdhbnQgPSAnY2NtdCcKKworY3ViaWNfY2VudGltZXRyZXMgPSBjdWJpY19jZW50aW1ldGVycworCitjbGFzcyBjdWJpY19mZWV0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiY3ViaWMgZmVldCAtIGEgdm9sdW1lIG1lYXN1cmVtZW50IGluIEltcGVyaWFsIGN1YmljIGZlZXQgIiIiCisgICAgd2FudCA9ICdjZmV0JworCitjbGFzcyBjaGFyYWN0ZXJzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiY2hhcmFjdGVycyAtICAiIiIKKyAgICB3YW50ID0gJ2NoYSAnCisKK2NoYXJhY3RlciA9IGNoYXJhY3RlcnMKKworY2xhc3Mgd3JpdGluZ19jb2RlX2luZm8oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJ3cml0aW5nIGNvZGUgaW5mbyAtIHNjcmlwdCBjb2RlIGFuZCBsYW5ndWFnZSBjb2RlIG9mIHRleHQgcnVuICIiIgorICAgIHdhbnQgPSAnY2l0bCcKK2NsYXNzIF9Qcm9wX2xhbmd1YWdlX2NvZGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImxhbmd1YWdlIGNvZGUgLSB0aGUgbGFuZ3VhZ2UgY29kZSBmb3IgdGhlIHRleHQgIiIiCisgICAgd2hpY2ggPSAncGxjZCcKKyAgICB3YW50ID0gJ3Nob3InCitjbGFzcyBfUHJvcF9zY3JpcHRfY29kZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic2NyaXB0IGNvZGUgLSB0aGUgc2NyaXB0IGNvZGUgZm9yIHRoZSB0ZXh0ICIiIgorICAgIHdoaWNoID0gJ3BzY2QnCisgICAgd2FudCA9ICdzaG9yJworCit3cml0aW5nX2NvZGVfaW5mb3MgPSB3cml0aW5nX2NvZGVfaW5mbworCitjbGFzcyB0ZXh0X2l0ZW1zKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidGV4dCBpdGVtcyAtICAiIiIKKyAgICB3YW50ID0gJ2NpdG0nCisKK3RleHRfaXRlbSA9IHRleHRfaXRlbXMKKworY2xhc3MgY3ViaWNfbWV0ZXJzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiY3ViaWMgbWV0ZXJzIC0gYSB2b2x1bWUgbWVhc3VyZW1lbnQgaW4gU0kgY3ViaWMgbWV0ZXJzICIiIgorICAgIHdhbnQgPSAnY21ldCcKKworY3ViaWNfbWV0cmVzID0gY3ViaWNfbWV0ZXJzCisKK2NsYXNzIGNlbnRpbWV0ZXJzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiY2VudGltZXRlcnMgLSBhIGRpc3RhbmNlIG1lYXN1cmVtZW50IGluIFNJIGNlbnRpbWV0ZXJzICIiIgorICAgIHdhbnQgPSAnY210cicKKworY2VudGltZXRyZXMgPSBjZW50aW1ldGVycworCitjbGFzcyBpdGVtKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiaXRlbSAtIEFuIGl0ZW0gb2YgYW55IHR5cGUgIiIiCisgICAgd2FudCA9ICdjb2JqJworY2xhc3MgX1Byb3BfaWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImlkIC0gdGhlIHVuaXF1ZSBJRCBudW1iZXIgb2YgdGhpcyBvYmplY3QgIiIiCisgICAgd2hpY2ggPSAnSUQgICcKKyAgICB3YW50ID0gJ2xvbmcnCisKK2l0ZW1zID0gaXRlbQorCitjbGFzcyBDX3N0cmluZ3MoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJDIHN0cmluZ3MgLSAgIiIiCisgICAgd2FudCA9ICdjc3RyJworCitDX3N0cmluZyA9IENfc3RyaW5ncworCitjbGFzcyB0ZXh0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidGV4dCAtIHRleHQgd2l0aCBsYW5ndWFnZSBhbmQgc3R5bGUgaW5mb3JtYXRpb24gIiIiCisgICAgd2FudCA9ICdjdHh0JworCitjbGFzcyBjdWJpY19pbmNoZXMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJjdWJpYyBpbmNoZXMgLSBhIHZvbHVtZSBtZWFzdXJlbWVudCBpbiBJbXBlcmlhbCBjdWJpYyBpbmNoZXMgIiIiCisgICAgd2FudCA9ICdjdWluJworCitjbGFzcyBjdWJpY195YXJkcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImN1YmljIHlhcmRzIC0gYSBkaXN0YW5jZSBtZWFzdXJlbWVudCBpbiBJbXBlcmlhbCBjdWJpYyB5YXJkcyAiIiIKKyAgICB3YW50ID0gJ2N5cmQnCisKK2NsYXNzIERlY2VtYmVyKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiRGVjZW1iZXIgLSB0aGUgbW9udGggb2YgRGVjZW1iZXIgIiIiCisgICAgd2FudCA9ICdkZWMgJworCitjbGFzcyBkZWdyZWVzX0NlbHNpdXMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkZWdyZWVzIENlbHNpdXMgLSBhIHRlbXBlcmF0dXJlIG1lYXN1cmVtZW50IGluIFNJIGRlZ3JlZXMgQ2Vsc2l1cyAiIiIKKyAgICB3YW50ID0gJ2RlZ2MnCisKK2NsYXNzIGRlZ3JlZXNfRmFocmVuaGVpdChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImRlZ3JlZXMgRmFocmVuaGVpdCAtIGEgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQgaW4gZGVncmVlcyBGYWhyZW5oZWl0ICIiIgorICAgIHdhbnQgPSAnZGVnZicKKworY2xhc3MgZGVncmVlc19LZWx2aW4oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkZWdyZWVzIEtlbHZpbiAtIGEgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQgaW4gZGVncmVlcyBLZWx2aW4gIiIiCisgICAgd2FudCA9ICdkZWdrJworCitjbGFzcyByZWFscyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInJlYWxzIC0gICIiIgorICAgIHdhbnQgPSAnZG91YicKKworcmVhbCA9IHJlYWxzCisKK2NsYXNzIGVuY29kZWRfc3RyaW5ncyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImVuY29kZWQgc3RyaW5ncyAtICAiIiIKKyAgICB3YW50ID0gJ2VuY3MnCisKK2VuY29kZWRfc3RyaW5nID0gZW5jb2RlZF9zdHJpbmdzCisKK2NsYXNzIGNvbnN0YW50cyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImNvbnN0YW50cyAtICAiIiIKKyAgICB3YW50ID0gJ2VudW0nCisKK2NvbnN0YW50ID0gY29uc3RhbnRzCisKK2NsYXNzIGV2ZW50cyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImV2ZW50cyAtICAiIiIKKyAgICB3YW50ID0gJ2V2bnQnCisKK2V2ZW50ID0gZXZlbnRzCisKK2NsYXNzIEZlYnJ1YXJ5KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiRmVicnVhcnkgLSB0aGUgbW9udGggb2YgRmVicnVhcnkgIiIiCisgICAgd2FudCA9ICdmZWIgJworCitjbGFzcyBmZWV0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiZmVldCAtIGEgZGlzdGFuY2UgbWVhc3VyZW1lbnQgaW4gSW1wZXJpYWwgZmVldCAiIiIKKyAgICB3YW50ID0gJ2ZlZXQnCisKK2NsYXNzIEZyaWRheShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkZyaWRheSAtIEZyaWRheSAiIiIKKyAgICB3YW50ID0gJ2ZyaSAnCisKK2NsYXNzIGZpbGVfc3BlY2lmaWNhdGlvbihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImZpbGUgc3BlY2lmaWNhdGlvbiAtIGEgZmlsZSBzcGVjaWZpY2F0aW9uIGFzIHVzZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gIiIiCisgICAgd2FudCA9ICdmc3MgJworCitmaWxlX3NwZWNpZmljYXRpb25zID0gZmlsZV9zcGVjaWZpY2F0aW9uCisKK2NsYXNzIGdhbGxvbnMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJnYWxsb25zIC0gYSB2b2x1bWUgbWVhc3VyZW1lbnQgaW4gSW1wZXJpYWwgZ2FsbG9ucyAiIiIKKyAgICB3YW50ID0gJ2dhbG4nCisKK2NsYXNzIGdyYW1zKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiZ3JhbXMgLSBhIG1hc3MgbWVhc3VyZW1lbnQgaW4gU0kgbWV0ZXJzICIiIgorICAgIHdhbnQgPSAnZ3JhbScKKworY2xhc3MgaGFuZGxlcnMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJoYW5kbGVycyAtICAiIiIKKyAgICB3YW50ID0gJ2hhbmQnCisKK2hhbmRsZXIgPSBoYW5kbGVycworCitjbGFzcyBpbmNoZXMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJpbmNoZXMgLSBhIGRpc3RhbmNlIG1lYXN1cmVtZW50IGluIEltcGVyaWFsIGluY2hlcyAiIiIKKyAgICB3YW50ID0gJ2luY2gnCisKK2NsYXNzIGludGVybmF0aW9uYWxfdGV4dChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImludGVybmF0aW9uYWwgdGV4dCAtIHRleHQgdGhhdCBiZWdpbnMgd2l0aCBhIHdyaXRpbmcgY29kZSAiIiIKKyAgICB3YW50ID0gJ2l0eHQnCisKK2ludGVybmF0aW9uYWxfdGV4dCA9IGludGVybmF0aW9uYWxfdGV4dAorCitjbGFzcyBKYW51YXJ5KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiSmFudWFyeSAtIHRoZSBtb250aCBvZiBKYW51YXJ5ICIiIgorICAgIHdhbnQgPSAnamFuICcKKworY2xhc3MgSnVseShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkp1bHkgLSB0aGUgbW9udGggb2YgSnVseSAiIiIKKyAgICB3YW50ID0gJ2p1bCAnCisKK2NsYXNzIEp1bmUoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJKdW5lIC0gdGhlIG1vbnRoIG9mIEp1bmUgIiIiCisgICAgd2FudCA9ICdqdW4gJworCitjbGFzcyByZWZlcmVuY2VfZm9ybXMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJyZWZlcmVuY2UgZm9ybXMgLSAgIiIiCisgICAgd2FudCA9ICdrZnJtJworCityZWZlcmVuY2VfZm9ybSA9IHJlZmVyZW5jZV9mb3JtcworCitjbGFzcyBraWxvZ3JhbXMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJraWxvZ3JhbXMgLSBhIG1hc3MgbWVhc3VyZW1lbnQgaW4gU0kga2lsb2dyYW1zICIiIgorICAgIHdhbnQgPSAna2dybScKKworY2xhc3Mga2lsb21ldGVycyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImtpbG9tZXRlcnMgLSBhIGRpc3RhbmNlIG1lYXN1cmVtZW50IGluIFNJIGtpbG9tZXRlcnMgIiIiCisgICAgd2FudCA9ICdrbXRyJworCitraWxvbWV0cmVzID0ga2lsb21ldGVycworCitjbGFzcyBrZXlzdHJva2UoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJrZXlzdHJva2UgLSBhIHByZXNzIG9mIGEga2V5IGNvbWJpbmF0aW9uIG9uIGEgTWFjaW50b3NoIGtleWJvYXJkICIiIgorICAgIHdhbnQgPSAna3BycycKK2NsYXNzIF9Qcm9wX2tleShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIia2V5IC0gdGhlIGNoYXJhY3RlciBmb3IgdGhlIGtleSB3YXMgcHJlc3NlZCAoaWdub3JpbmcgbW9kaWZpZXJzKSAiIiIKKyAgICB3aGljaCA9ICdrTXNnJworICAgIHdhbnQgPSAnY2hhICcKK2NsYXNzIF9Qcm9wX2tleV9raW5kKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJrZXkga2luZCAtIHRoZSBraW5kIG9mIGtleSB0aGF0IHdhcyBwcmVzc2VkICIiIgorICAgIHdoaWNoID0gJ2trbmQnCisgICAgd2FudCA9ICdla3N0JworY2xhc3MgX1Byb3BfbW9kaWZpZXJzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJtb2RpZmllcnMgLSB0aGUgbW9kaWZpZXIga2V5cyBwcmVzc2VkIGluIGNvbWJpbmF0aW9uICIiIgorICAgIHdoaWNoID0gJ2tNb2QnCisgICAgd2FudCA9ICdlTWRzJworCitrZXlzdHJva2VzID0ga2V5c3Ryb2tlCisKK2NsYXNzIHBvdW5kcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInBvdW5kcyAtIGEgd2VpZ2h0IG1lYXN1cmVtZW50IGluIFNJIG1ldGVycyAiIiIKKyAgICB3YW50ID0gJ2xicyAnCisKK2NsYXNzIGRhdGUoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkYXRlIC0gQWJzb2x1dGUgZGF0ZSBhbmQgdGltZSB2YWx1ZXMgIiIiCisgICAgd2FudCA9ICdsZHQgJworY2xhc3MgX1Byb3BfZGF0ZV9zdHJpbmcoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImRhdGUgc3RyaW5nIC0gdGhlIGRhdGUgcG9ydGlvbiBvZiBhIGRhdGUtdGltZSB2YWx1ZSBhcyB0ZXh0ICIiIgorICAgIHdoaWNoID0gJ2RzdHInCisgICAgd2FudCA9ICdURVhUJworY2xhc3MgX1Byb3BfZGF5KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJkYXkgLSB0aGUgZGF5IG9mIHRoZSBtb250aCBvZiBhIGRhdGUgIiIiCisgICAgd2hpY2ggPSAnZGF5ICcKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF9tb250aChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibW9udGggLSB0aGUgbW9udGggb2YgYSBkYXRlICIiIgorICAgIHdoaWNoID0gJ21udGgnCisgICAgd2FudCA9ICdtbnRoJworY2xhc3MgX1Byb3BfdGltZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidGltZSAtIHRoZSB0aW1lIHNpbmNlIG1pZG5pZ2h0IG9mIGEgZGF0ZSAiIiIKKyAgICB3aGljaCA9ICd0aW1lJworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX3RpbWVfc3RyaW5nKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ0aW1lIHN0cmluZyAtIHRoZSB0aW1lIHBvcnRpb24gb2YgYSBkYXRlLXRpbWUgdmFsdWUgYXMgdGV4dCAiIiIKKyAgICB3aGljaCA9ICd0c3RyJworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX3dlZWtkYXkoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIndlZWtkYXkgLSB0aGUgZGF5IG9mIGEgd2VlayBvZiBhIGRhdGUgIiIiCisgICAgd2hpY2ggPSAnd2tkeScKKyAgICB3YW50ID0gJ3drZHknCitjbGFzcyBfUHJvcF95ZWFyKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ5ZWFyIC0gdGhlIHllYXIgb2YgYSBkYXRlICIiIgorICAgIHdoaWNoID0gJ3llYXInCisgICAgd2FudCA9ICdsb25nJworCitkYXRlcyA9IGRhdGUKKworY2xhc3MgbGlzdChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImxpc3QgLSBBbiBvcmRlcmVkIGNvbGxlY3Rpb24gb2YgaXRlbXMgIiIiCisgICAgd2FudCA9ICdsaXN0JworY2xhc3MgX1Byb3BfbGVuZ3RoKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJsZW5ndGggLSB0aGUgbGVuZ3RoIG9mIGEgbGlzdCAiIiIKKyAgICB3aGljaCA9ICdsZW5nJworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX3Jlc3QoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInJlc3QgLSBhbGwgaXRlbXMgb2YgdGhlIGxpc3QgZXhjbHVkaW5nIGZpcnN0ICIiIgorICAgIHdoaWNoID0gJ3Jlc3QnCisgICAgd2FudCA9ICdsaXN0JworY2xhc3MgX1Byb3BfcmV2ZXJzZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicmV2ZXJzZSAtIHRoZSBpdGVtcyBvZiB0aGUgbGlzdCBpbiByZXZlcnNlIG9yZGVyICIiIgorICAgIHdoaWNoID0gJ3J2c2UnCisgICAgd2FudCA9ICdsaXN0JworCitsaXN0cyA9IGxpc3QKKworY2xhc3MgbGl0ZXJzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIibGl0ZXJzIC0gYSB2b2x1bWUgbWVhc3VyZW1lbnQgaW4gU0kgbGl0ZXJzICIiIgorICAgIHdhbnQgPSAnbGl0cicKKworbGl0cmVzID0gbGl0ZXJzCisKK2NsYXNzIGxpbmtlZF9saXN0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIibGlua2VkIGxpc3QgLSBBbiBvcmRlcmVkIGNvbGxlY3Rpb24gb2YgaXRlbXMgIiIiCisgICAgd2FudCA9ICdsbHN0JworCitsaW5rZWRfbGlzdHMgPSBsaW5rZWRfbGlzdAorCitjbGFzcyBpbnRlZ2VycyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImludGVnZXJzIC0gICIiIgorICAgIHdhbnQgPSAnbG9uZycKKworaW50ZWdlciA9IGludGVnZXJzCisKK2NsYXNzIGxpc3Rfb3JfcmVjb3JkKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIibGlzdCBvciByZWNvcmQgLSBhIGxpc3Qgb3IgcmVjb3JkICIiIgorICAgIHdhbnQgPSAnbHIgICcKKworY2xhc3MgbGlzdF8yY19fcmVjb3JkX29yX3RleHQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJsaXN0LCByZWNvcmQgb3IgdGV4dCAtIGEgbGlzdCwgcmVjb3JkIG9yIHRleHQgIiIiCisgICAgd2FudCA9ICdscnMgJworCitjbGFzcyBsaXN0X29yX3N0cmluZyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImxpc3Qgb3Igc3RyaW5nIC0gYSBsaXN0IG9yIHN0cmluZyAiIiIKKyAgICB3YW50ID0gJ2xzICAnCisKK2NsYXNzIG1hY2hpbmVzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIibWFjaGluZXMgLSAgIiIiCisgICAgd2FudCA9ICdtYWNoJworCittYWNoaW5lID0gbWFjaGluZXMKKworY2xhc3MgTWFyY2goYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJNYXJjaCAtIHRoZSBtb250aCBvZiBNYXJjaCAiIiIKKyAgICB3YW50ID0gJ21hciAnCisKK2NsYXNzIE1heShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIk1heSAtIHRoZSBtb250aCBvZiBNYXkgIiIiCisgICAgd2FudCA9ICdtYXkgJworCitjbGFzcyBtZXRlcnMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJtZXRlcnMgLSBhIGRpc3RhbmNlIG1lYXN1cmVtZW50IGluIFNJIG1ldGVycyAiIiIKKyAgICB3YW50ID0gJ21ldHInCisKK21ldHJlcyA9IG1ldGVycworCitjbGFzcyBtaWxlcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIm1pbGVzIC0gYSBkaXN0YW5jZSBtZWFzdXJlbWVudCBpbiBJbXBlcmlhbCBtaWxlcyAiIiIKKyAgICB3YW50ID0gJ21pbGUnCisKK2NsYXNzIG1vbnRocyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIm1vbnRocyAtICAiIiIKKyAgICB3YW50ID0gJ21udGgnCisKK21vbnRoID0gbW9udGhzCisKK2NsYXNzIE1vbmRheShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIk1vbmRheSAtIE1vbmRheSAiIiIKKyAgICB3YW50ID0gJ21vbiAnCisKK2NsYXNzIG1pc3NpbmdfdmFsdWVzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIibWlzc2luZyB2YWx1ZXMgLSAgIiIiCisgICAgd2FudCA9ICdtc25nJworCittaXNzaW5nX3ZhbHVlID0gbWlzc2luZ192YWx1ZXMKKworY2xhc3MgbnVtYmVyX29yX2RhdGUoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJudW1iZXIgb3IgZGF0ZSAtIGEgbnVtYmVyIG9yIGRhdGUgIiIiCisgICAgd2FudCA9ICduZCAgJworCitjbGFzcyBudW1iZXJfMmNfX2RhdGVfb3JfdGV4dChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIm51bWJlciwgZGF0ZSBvciB0ZXh0IC0gYSBudW1iZXIsIGRhdGUgb3IgdGV4dCAiIiIKKyAgICB3YW50ID0gJ25kcyAnCisKK2NsYXNzIG51bWJlcnMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJudW1iZXJzIC0gICIiIgorICAgIHdhbnQgPSAnbm1icicKKworbnVtYmVyID0gbnVtYmVycworCitjbGFzcyBOb3ZlbWJlcihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIk5vdmVtYmVyIC0gdGhlIG1vbnRoIG9mIE5vdmVtYmVyICIiIgorICAgIHdhbnQgPSAnbm92ICcKKworY2xhc3MgbnVtYmVyX29yX3N0cmluZyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIm51bWJlciBvciBzdHJpbmcgLSBhIG51bWJlciBvciBzdHJpbmcgIiIiCisgICAgd2FudCA9ICducyAgJworCitjbGFzcyByZWZlcmVuY2VzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIicmVmZXJlbmNlcyAtICAiIiIKKyAgICB3YW50ID0gJ29iaiAnCisKK3JlZmVyZW5jZSA9IHJlZmVyZW5jZXMKKworY2xhc3MgT2N0b2JlcihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIk9jdG9iZXIgLSB0aGUgbW9udGggb2YgT2N0b2JlciAiIiIKKyAgICB3YW50ID0gJ29jdCAnCisKK2NsYXNzIG91bmNlcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIm91bmNlcyAtIGEgd2VpZ2h0IG1lYXN1cmVtZW50IGluIFNJIG1ldGVycyAiIiIKKyAgICB3YW50ID0gJ296cyAnCisKK2NsYXNzIGNsYXNzXyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImNsYXNzIC0gdGhlIHR5cGUgb2YgYSB2YWx1ZSAiIiIKKyAgICB3YW50ID0gJ3BjbHMnCitjbGFzcyBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiI8SW5oZXJpdGFuY2U+IC0gaW5oZXJpdHMgc29tZSBvZiBpdHMgcHJvcGVydGllcyBmcm9tIHRoaXMgY2xhc3MgIiIiCisgICAgd2hpY2ggPSAnY0AjXicKKyAgICB3YW50ID0gJ3R5cGUnCisKK2NsYXNzZXMgPSBjbGFzc18KKworY2xhc3MgcHJlcG9zaXRpb25zKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIicHJlcG9zaXRpb25zIC0gICIiIgorICAgIHdhbnQgPSAncHJlcCcKKworcHJlcG9zaXRpb24gPSBwcmVwb3NpdGlvbnMKKworY2xhc3MgcHJvcGVydGllcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInByb3BlcnRpZXMgLSAgIiIiCisgICAgd2FudCA9ICdwcm9wJworCitwcm9wZXJ0eSA9IHByb3BlcnRpZXMKKworY2xhc3Mgd3JpdGluZ19jb2RlKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIid3JpdGluZyBjb2RlIC0gY29kZXMgdGhhdCBpZGVudGlmeSB0aGUgbGFuZ3VhZ2UgYW5kIHNjcmlwdCBzeXN0ZW0gIiIiCisgICAgd2FudCA9ICdwc2N0JworCitjbGFzcyBQYXNjYWxfc3RyaW5ncyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIlBhc2NhbCBzdHJpbmdzIC0gICIiIgorICAgIHdhbnQgPSAncHN0cicKKworUGFzY2FsX3N0cmluZyA9IFBhc2NhbF9zdHJpbmdzCisKK2NsYXNzIHF1YXJ0cyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInF1YXJ0cyAtIGEgdm9sdW1lIG1lYXN1cmVtZW50IGluIEltcGVyaWFsIHF1YXJ0cyAiIiIKKyAgICB3YW50ID0gJ3FydHMnCisKK2NsYXNzIGRhdGEoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkYXRhIC0gYW4gQXBwbGVTY3JpcHQgcmF3IGRhdGEgb2JqZWN0ICIiIgorICAgIHdhbnQgPSAncmRhdCcKKworY2xhc3MgcmVjb3JkcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInJlY29yZHMgLSAgIiIiCisgICAgd2FudCA9ICdyZWNvJworCityZWNvcmQgPSByZWNvcmRzCisKK2NsYXNzIFNhdHVyZGF5KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiU2F0dXJkYXkgLSBTYXR1cmRheSAiIiIKKyAgICB3YW50ID0gJ3NhdCAnCisKK2NsYXNzIHNlY29uZHMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJzZWNvbmRzIC0gbW9yZSB0aGFuIG9uZSBzZWNvbmQgIiIiCisgICAgd2FudCA9ICdzY25kJworCitjbGFzcyBzY3JpcHQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJzY3JpcHQgLSBBbiBBcHBsZVNjcmlwdCBzY3JpcHQgIiIiCisgICAgd2FudCA9ICdzY3B0JworY2xhc3MgX1Byb3BfbmFtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQgIiIiCisgICAgd2hpY2ggPSAncG5hbScKKyAgICB3YW50ID0gJ1RFWFQnCitjbGFzcyBfUHJvcF9wYXJlbnQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInBhcmVudCAtIGl0cyBwYXJlbnQsIGkuZS4gdGhlIHNjcmlwdCB0aGF0IHdpbGwgaGFuZGxlIGV2ZW50cyB0aGF0IHRoaXMgc2NyaXB0IGRvZXNuXHhkNXQgIiIiCisgICAgd2hpY2ggPSAncGFyZScKKyAgICB3YW50ID0gJ3NjcHQnCisKK3NjcmlwdHMgPSBzY3JpcHQKKworY2xhc3MgU2VwdGVtYmVyKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiU2VwdGVtYmVyIC0gdGhlIG1vbnRoIG9mIFNlcHRlbWJlciAiIiIKKyAgICB3YW50ID0gJ3NlcCAnCisKK2NsYXNzIGFsaWFzX29yX3N0cmluZyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImFsaWFzIG9yIHN0cmluZyAtIGFuIGFsaWFzIG9yIHN0cmluZyAiIiIKKyAgICB3YW50ID0gJ3NmICAnCisKK2NsYXNzIHNvdW5kcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInNvdW5kcyAtICAiIiIKKyAgICB3YW50ID0gJ3NuZCAnCisKK3NvdW5kID0gc291bmRzCisKK2NsYXNzIHNxdWFyZV9mZWV0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIic3F1YXJlIGZlZXQgLSBhbiBhcmVhIG1lYXN1cmVtZW50IGluIEltcGVyaWFsIHNxdWFyZSBmZWV0ICIiIgorICAgIHdhbnQgPSAnc3FmdCcKKworY2xhc3Mgc3F1YXJlX2tpbG9tZXRlcnMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJzcXVhcmUga2lsb21ldGVycyAtIGFuIGFyZWEgbWVhc3VyZW1lbnQgaW4gU0kgc3F1YXJlIGtpbG9tZXRlcnMgIiIiCisgICAgd2FudCA9ICdzcWttJworCitzcXVhcmVfa2lsb21ldHJlcyA9IHNxdWFyZV9raWxvbWV0ZXJzCisKK2NsYXNzIHNxdWFyZV9taWxlcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInNxdWFyZSBtaWxlcyAtIGFuIGFyZWEgbWVhc3VyZW1lbnQgaW4gSW1wZXJpYWwgc3F1YXJlIG1pbGVzICIiIgorICAgIHdhbnQgPSAnc3FtaScKKworY2xhc3Mgc3F1YXJlX21ldGVycyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInNxdWFyZSBtZXRlcnMgLSBhbiBhcmVhIG1lYXN1cmVtZW50IGluIFNJIHNxdWFyZSBtZXRlcnMgIiIiCisgICAgd2FudCA9ICdzcXJtJworCitzcXVhcmVfbWV0cmVzID0gc3F1YXJlX21ldGVycworCitjbGFzcyBzcXVhcmVfeWFyZHMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJzcXVhcmUgeWFyZHMgLSBhbiBhcmVhIG1lYXN1cmVtZW50IGluIEltcGVyaWFsIHNxdWFyZSB5YXJkcyAiIiIKKyAgICB3YW50ID0gJ3NxeWQnCisKK2NsYXNzIHN0eWxlZF9DbGlwYm9hcmRfdGV4dChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInN0eWxlZCBDbGlwYm9hcmQgdGV4dCAtIGNsaXBib2FyZCB0ZXh0IHdpdGggZm9udCwgc2l6ZSwgYW5kIHN0eWxlIGluZm9ybWF0aW9uICIiIgorICAgIHdhbnQgPSAnc3R5bCcKKworc3R5bGVkX0NsaXBib2FyZF90ZXh0ID0gc3R5bGVkX0NsaXBib2FyZF90ZXh0CisKK2NsYXNzIFN1bmRheShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIlN1bmRheSAtIFN1bmRheSAiIiIKKyAgICB3YW50ID0gJ3N1biAnCisKK2NsYXNzIHN0eWxlZF9Vbmljb2RlX3RleHQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJzdHlsZWQgVW5pY29kZSB0ZXh0IC0gc3R5bGVkIHRleHQgaW4gdGhlIFVuaWNvZGUgZm9ybWF0ICIiIgorICAgIHdhbnQgPSAnc3V0eCcKKworc3R5bGVkX1VuaWNvZGVfdGV4dCA9IHN0eWxlZF9Vbmljb2RlX3RleHQKKworY2xhc3MgVGh1cnNkYXkoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJUaHVyc2RheSAtIFRodXJzZGF5ICIiIgorICAgIHdhbnQgPSAndGh1ICcKKworY2xhc3MgVHVlc2RheShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIlR1ZXNkYXkgLSBUdWVzZGF5ICIiIgorICAgIHdhbnQgPSAndHVlICcKKworY2xhc3MgdHlwZV9jbGFzcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInR5cGUgY2xhc3MgLSB0aGUgbmFtZSBvZiBhIHBhcnRpY3VsYXIgY2xhc3MgKG9yIGFueSBmb3VyLWNoYXJhY3RlciBjb2RlKSAiIiIKKyAgICB3YW50ID0gJ3R5cGUnCisKK2NsYXNzIGVtcHR5X2FlX25hbWVfKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiIC0gdGhlIHVuZGVmaW5lZCB2YWx1ZSAiIiIKKyAgICB3YW50ID0gJ3VuZGYnCisKK2NsYXNzIFVuaWNvZGVfdGV4dChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIlVuaWNvZGUgdGV4dCAtIHRleHQgaW4gdGhlIFVuaWNvZGUgZm9ybWF0IChjYW5ub3QgYmUgdmlld2VkIHdpdGhvdXQgY29udmVyc2lvbikgIiIiCisgICAgd2FudCA9ICd1dHh0JworCitVbmljb2RlX3RleHQgPSBVbmljb2RlX3RleHQKKworY2xhc3MgdmVjdG9yKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidmVjdG9yIC0gQW4gb3JkZXJlZCBjb2xsZWN0aW9uIG9mIGl0ZW1zICIiIgorICAgIHdhbnQgPSAndmVjdCcKKwordmVjdG9ycyA9IHZlY3RvcgorCitjbGFzcyB2ZXJzaW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidmVyc2lvbiAtIGEgdmVyc2lvbiB2YWx1ZSAiIiIKKyAgICB3YW50ID0gJ3ZlcnMnCisKK2NsYXNzIFdlZG5lc2RheShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIldlZG5lc2RheSAtIFdlZG5lc2RheSAiIiIKKyAgICB3YW50ID0gJ3dlZCAnCisKK2NsYXNzIHdlZWtkYXlzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIid2Vla2RheXMgLSAgIiIiCisgICAgd2FudCA9ICd3a2R5JworCit3ZWVrZGF5ID0gd2Vla2RheXMKKworY2xhc3MgeWFyZHMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJ5YXJkcyAtIGEgZGlzdGFuY2UgbWVhc3VyZW1lbnQgaW4gSW1wZXJpYWwgeWFyZHMgIiIiCisgICAgd2FudCA9ICd5YXJkJworCitjbGFzcyB6b25lcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInpvbmVzIC0gICIiIgorICAgIHdhbnQgPSAnem9uZScKKworem9uZSA9IHpvbmVzCithbnl0aGluZy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2FueXRoaW5nLl9wcml2cHJvcGRpY3QgPSB7Cit9Cithbnl0aGluZy5fcHJpdmVsZW1kaWN0ID0geworfQorcGljdHVyZXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitwaWN0dXJlcy5fcHJpdnByb3BkaWN0ID0geworfQorcGljdHVyZXMuX3ByaXZlbGVtZGljdCA9IHsKK30KK3N0eWxlZF90ZXh0Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorc3R5bGVkX3RleHQuX3ByaXZwcm9wZGljdCA9IHsKK30KK3N0eWxlZF90ZXh0Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitzdHlsZWRfdGV4dC5fc3VwZXJjbGFzc25hbWVzID0gW10KK3N0eWxlZF90ZXh0Ll9wcml2cHJvcGRpY3QgPSB7Cit9CitzdHlsZWRfdGV4dC5fcHJpdmVsZW1kaWN0ID0geworfQorc3RyaW5ncy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3N0cmluZ3MuX3ByaXZwcm9wZGljdCA9IHsKK30KK3N0cmluZ3MuX3ByaXZlbGVtZGljdCA9IHsKK30KK2FsaWFzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorYWxpYXMuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnUE9TSVhfcGF0aCcgOiBfUHJvcF9QT1NJWF9wYXRoLAorfQorYWxpYXMuX3ByaXZlbGVtZGljdCA9IHsKK30KK0FwcmlsLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorQXByaWwuX3ByaXZwcm9wZGljdCA9IHsKK30KK0FwcmlsLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitBdWd1c3QuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitBdWd1c3QuX3ByaXZwcm9wZGljdCA9IHsKK30KK0F1Z3VzdC5fcHJpdmVsZW1kaWN0ID0geworfQorYm9vbGVhbnMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitib29sZWFucy5fcHJpdnByb3BkaWN0ID0geworfQorYm9vbGVhbnMuX3ByaXZlbGVtZGljdCA9IHsKK30KK1JHQl9jb2xvcnMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitSR0JfY29sb3JzLl9wcml2cHJvcGRpY3QgPSB7Cit9CitSR0JfY29sb3JzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CithcHBsaWNhdGlvbi5fc3VwZXJjbGFzc25hbWVzID0gW10KK2FwcGxpY2F0aW9uLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ0FwcGxlU2NyaXB0JyA6IF9Qcm9wX0FwcGxlU2NyaXB0LAorICAgICdkYXlzJyA6IF9Qcm9wX2RheXMsCisgICAgJ2hvdXJzJyA6IF9Qcm9wX2hvdXJzLAorICAgICdtaW51dGVzJyA6IF9Qcm9wX21pbnV0ZXMsCisgICAgJ3BpJyA6IF9Qcm9wX3BpLAorICAgICdwcmludF9kZXB0aCcgOiBfUHJvcF9wcmludF9kZXB0aCwKKyAgICAncHJpbnRfbGVuZ3RoJyA6IF9Qcm9wX3ByaW50X2xlbmd0aCwKKyAgICAncmVzdWx0JyA6IF9Qcm9wX3Jlc3VsdCwKKyAgICAncmV0dXJuXycgOiBfUHJvcF9yZXR1cm5fLAorICAgICdzcGFjZScgOiBfUHJvcF9zcGFjZSwKKyAgICAndGFiJyA6IF9Qcm9wX3RhYiwKKyAgICAndGV4dF9pdGVtX2RlbGltaXRlcnMnIDogX1Byb3BfdGV4dF9pdGVtX2RlbGltaXRlcnMsCisgICAgJ3dlZWtzJyA6IF9Qcm9wX3dlZWtzLAorfQorYXBwbGljYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKK30KK3VwcGVyX2Nhc2UuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit1cHBlcl9jYXNlLl9wcml2cHJvcGRpY3QgPSB7Cit9Cit1cHBlcl9jYXNlLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitjdWJpY19jZW50aW1ldGVycy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2N1YmljX2NlbnRpbWV0ZXJzLl9wcml2cHJvcGRpY3QgPSB7Cit9CitjdWJpY19jZW50aW1ldGVycy5fcHJpdmVsZW1kaWN0ID0geworfQorY3ViaWNfZmVldC5fc3VwZXJjbGFzc25hbWVzID0gW10KK2N1YmljX2ZlZXQuX3ByaXZwcm9wZGljdCA9IHsKK30KK2N1YmljX2ZlZXQuX3ByaXZlbGVtZGljdCA9IHsKK30KK2NoYXJhY3RlcnMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitjaGFyYWN0ZXJzLl9wcml2cHJvcGRpY3QgPSB7Cit9CitjaGFyYWN0ZXJzLl9wcml2ZWxlbWRpY3QgPSB7Cit9Cit3cml0aW5nX2NvZGVfaW5mby5fc3VwZXJjbGFzc25hbWVzID0gW10KK3dyaXRpbmdfY29kZV9pbmZvLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2xhbmd1YWdlX2NvZGUnIDogX1Byb3BfbGFuZ3VhZ2VfY29kZSwKKyAgICAnc2NyaXB0X2NvZGUnIDogX1Byb3Bfc2NyaXB0X2NvZGUsCit9Cit3cml0aW5nX2NvZGVfaW5mby5fcHJpdmVsZW1kaWN0ID0geworfQordGV4dF9pdGVtcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3RleHRfaXRlbXMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3RleHRfaXRlbXMuX3ByaXZlbGVtZGljdCA9IHsKK30KK2N1YmljX21ldGVycy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2N1YmljX21ldGVycy5fcHJpdnByb3BkaWN0ID0geworfQorY3ViaWNfbWV0ZXJzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitjZW50aW1ldGVycy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2NlbnRpbWV0ZXJzLl9wcml2cHJvcGRpY3QgPSB7Cit9CitjZW50aW1ldGVycy5fcHJpdmVsZW1kaWN0ID0geworfQoraXRlbS5fc3VwZXJjbGFzc25hbWVzID0gW10KK2l0ZW0uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnaWQnIDogX1Byb3BfaWQsCit9CitpdGVtLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitDX3N0cmluZ3MuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitDX3N0cmluZ3MuX3ByaXZwcm9wZGljdCA9IHsKK30KK0Nfc3RyaW5ncy5fcHJpdmVsZW1kaWN0ID0geworfQordGV4dC5fc3VwZXJjbGFzc25hbWVzID0gW10KK3RleHQuX3ByaXZwcm9wZGljdCA9IHsKK30KK3RleHQuX3ByaXZlbGVtZGljdCA9IHsKK30KK2N1YmljX2luY2hlcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2N1YmljX2luY2hlcy5fcHJpdnByb3BkaWN0ID0geworfQorY3ViaWNfaW5jaGVzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitjdWJpY195YXJkcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2N1YmljX3lhcmRzLl9wcml2cHJvcGRpY3QgPSB7Cit9CitjdWJpY195YXJkcy5fcHJpdmVsZW1kaWN0ID0geworfQorRGVjZW1iZXIuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitEZWNlbWJlci5fcHJpdnByb3BkaWN0ID0geworfQorRGVjZW1iZXIuX3ByaXZlbGVtZGljdCA9IHsKK30KK2RlZ3JlZXNfQ2Vsc2l1cy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2RlZ3JlZXNfQ2Vsc2l1cy5fcHJpdnByb3BkaWN0ID0geworfQorZGVncmVlc19DZWxzaXVzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitkZWdyZWVzX0ZhaHJlbmhlaXQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitkZWdyZWVzX0ZhaHJlbmhlaXQuX3ByaXZwcm9wZGljdCA9IHsKK30KK2RlZ3JlZXNfRmFocmVuaGVpdC5fcHJpdmVsZW1kaWN0ID0geworfQorZGVncmVlc19LZWx2aW4uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitkZWdyZWVzX0tlbHZpbi5fcHJpdnByb3BkaWN0ID0geworfQorZGVncmVlc19LZWx2aW4uX3ByaXZlbGVtZGljdCA9IHsKK30KK3JlYWxzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorcmVhbHMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3JlYWxzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitlbmNvZGVkX3N0cmluZ3MuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitlbmNvZGVkX3N0cmluZ3MuX3ByaXZwcm9wZGljdCA9IHsKK30KK2VuY29kZWRfc3RyaW5ncy5fcHJpdmVsZW1kaWN0ID0geworfQorY29uc3RhbnRzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorY29uc3RhbnRzLl9wcml2cHJvcGRpY3QgPSB7Cit9Citjb25zdGFudHMuX3ByaXZlbGVtZGljdCA9IHsKK30KK2V2ZW50cy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2V2ZW50cy5fcHJpdnByb3BkaWN0ID0geworfQorZXZlbnRzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitGZWJydWFyeS5fc3VwZXJjbGFzc25hbWVzID0gW10KK0ZlYnJ1YXJ5Ll9wcml2cHJvcGRpY3QgPSB7Cit9CitGZWJydWFyeS5fcHJpdmVsZW1kaWN0ID0geworfQorZmVldC5fc3VwZXJjbGFzc25hbWVzID0gW10KK2ZlZXQuX3ByaXZwcm9wZGljdCA9IHsKK30KK2ZlZXQuX3ByaXZlbGVtZGljdCA9IHsKK30KK0ZyaWRheS5fc3VwZXJjbGFzc25hbWVzID0gW10KK0ZyaWRheS5fcHJpdnByb3BkaWN0ID0geworfQorRnJpZGF5Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitmaWxlX3NwZWNpZmljYXRpb24uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitmaWxlX3NwZWNpZmljYXRpb24uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnUE9TSVhfcGF0aCcgOiBfUHJvcF9QT1NJWF9wYXRoLAorfQorZmlsZV9zcGVjaWZpY2F0aW9uLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitnYWxsb25zLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorZ2FsbG9ucy5fcHJpdnByb3BkaWN0ID0geworfQorZ2FsbG9ucy5fcHJpdmVsZW1kaWN0ID0geworfQorZ3JhbXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitncmFtcy5fcHJpdnByb3BkaWN0ID0geworfQorZ3JhbXMuX3ByaXZlbGVtZGljdCA9IHsKK30KK2hhbmRsZXJzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQoraGFuZGxlcnMuX3ByaXZwcm9wZGljdCA9IHsKK30KK2hhbmRsZXJzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitpbmNoZXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitpbmNoZXMuX3ByaXZwcm9wZGljdCA9IHsKK30KK2luY2hlcy5fcHJpdmVsZW1kaWN0ID0geworfQoraW50ZXJuYXRpb25hbF90ZXh0Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQoraW50ZXJuYXRpb25hbF90ZXh0Ll9wcml2cHJvcGRpY3QgPSB7Cit9CitpbnRlcm5hdGlvbmFsX3RleHQuX3ByaXZlbGVtZGljdCA9IHsKK30KK2ludGVybmF0aW9uYWxfdGV4dC5fc3VwZXJjbGFzc25hbWVzID0gW10KK2ludGVybmF0aW9uYWxfdGV4dC5fcHJpdnByb3BkaWN0ID0geworfQoraW50ZXJuYXRpb25hbF90ZXh0Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitKYW51YXJ5Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorSmFudWFyeS5fcHJpdnByb3BkaWN0ID0geworfQorSmFudWFyeS5fcHJpdmVsZW1kaWN0ID0geworfQorSnVseS5fc3VwZXJjbGFzc25hbWVzID0gW10KK0p1bHkuX3ByaXZwcm9wZGljdCA9IHsKK30KK0p1bHkuX3ByaXZlbGVtZGljdCA9IHsKK30KK0p1bmUuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitKdW5lLl9wcml2cHJvcGRpY3QgPSB7Cit9CitKdW5lLl9wcml2ZWxlbWRpY3QgPSB7Cit9CityZWZlcmVuY2VfZm9ybXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCityZWZlcmVuY2VfZm9ybXMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3JlZmVyZW5jZV9mb3Jtcy5fcHJpdmVsZW1kaWN0ID0geworfQora2lsb2dyYW1zLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQora2lsb2dyYW1zLl9wcml2cHJvcGRpY3QgPSB7Cit9CitraWxvZ3JhbXMuX3ByaXZlbGVtZGljdCA9IHsKK30KK2tpbG9tZXRlcnMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitraWxvbWV0ZXJzLl9wcml2cHJvcGRpY3QgPSB7Cit9CitraWxvbWV0ZXJzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitrZXlzdHJva2UuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitrZXlzdHJva2UuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAna2V5JyA6IF9Qcm9wX2tleSwKKyAgICAna2V5X2tpbmQnIDogX1Byb3Bfa2V5X2tpbmQsCisgICAgJ21vZGlmaWVycycgOiBfUHJvcF9tb2RpZmllcnMsCit9CitrZXlzdHJva2UuX3ByaXZlbGVtZGljdCA9IHsKK30KK3BvdW5kcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3BvdW5kcy5fcHJpdnByb3BkaWN0ID0geworfQorcG91bmRzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitkYXRlLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorZGF0ZS5fcHJpdnByb3BkaWN0ID0geworICAgICdkYXRlX3N0cmluZycgOiBfUHJvcF9kYXRlX3N0cmluZywKKyAgICAnZGF5JyA6IF9Qcm9wX2RheSwKKyAgICAnbW9udGgnIDogX1Byb3BfbW9udGgsCisgICAgJ3RpbWUnIDogX1Byb3BfdGltZSwKKyAgICAndGltZV9zdHJpbmcnIDogX1Byb3BfdGltZV9zdHJpbmcsCisgICAgJ3dlZWtkYXknIDogX1Byb3Bfd2Vla2RheSwKKyAgICAneWVhcicgOiBfUHJvcF95ZWFyLAorfQorZGF0ZS5fcHJpdmVsZW1kaWN0ID0geworfQorbGlzdC5fc3VwZXJjbGFzc25hbWVzID0gW10KK2xpc3QuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnbGVuZ3RoJyA6IF9Qcm9wX2xlbmd0aCwKKyAgICAncmVzdCcgOiBfUHJvcF9yZXN0LAorICAgICdyZXZlcnNlJyA6IF9Qcm9wX3JldmVyc2UsCit9CitsaXN0Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitsaXRlcnMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitsaXRlcnMuX3ByaXZwcm9wZGljdCA9IHsKK30KK2xpdGVycy5fcHJpdmVsZW1kaWN0ID0geworfQorbGlua2VkX2xpc3QuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitsaW5rZWRfbGlzdC5fcHJpdnByb3BkaWN0ID0geworICAgICdsZW5ndGgnIDogX1Byb3BfbGVuZ3RoLAorfQorbGlua2VkX2xpc3QuX3ByaXZlbGVtZGljdCA9IHsKK30KK2ludGVnZXJzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQoraW50ZWdlcnMuX3ByaXZwcm9wZGljdCA9IHsKK30KK2ludGVnZXJzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitsaXN0X29yX3JlY29yZC5fc3VwZXJjbGFzc25hbWVzID0gW10KK2xpc3Rfb3JfcmVjb3JkLl9wcml2cHJvcGRpY3QgPSB7Cit9CitsaXN0X29yX3JlY29yZC5fcHJpdmVsZW1kaWN0ID0geworfQorbGlzdF8yY19fcmVjb3JkX29yX3RleHQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitsaXN0XzJjX19yZWNvcmRfb3JfdGV4dC5fcHJpdnByb3BkaWN0ID0geworfQorbGlzdF8yY19fcmVjb3JkX29yX3RleHQuX3ByaXZlbGVtZGljdCA9IHsKK30KK2xpc3Rfb3Jfc3RyaW5nLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorbGlzdF9vcl9zdHJpbmcuX3ByaXZwcm9wZGljdCA9IHsKK30KK2xpc3Rfb3Jfc3RyaW5nLl9wcml2ZWxlbWRpY3QgPSB7Cit9CittYWNoaW5lcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK21hY2hpbmVzLl9wcml2cHJvcGRpY3QgPSB7Cit9CittYWNoaW5lcy5fcHJpdmVsZW1kaWN0ID0geworfQorTWFyY2guX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitNYXJjaC5fcHJpdnByb3BkaWN0ID0geworfQorTWFyY2guX3ByaXZlbGVtZGljdCA9IHsKK30KK01heS5fc3VwZXJjbGFzc25hbWVzID0gW10KK01heS5fcHJpdnByb3BkaWN0ID0geworfQorTWF5Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CittZXRlcnMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCittZXRlcnMuX3ByaXZwcm9wZGljdCA9IHsKK30KK21ldGVycy5fcHJpdmVsZW1kaWN0ID0geworfQorbWlsZXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCittaWxlcy5fcHJpdnByb3BkaWN0ID0geworfQorbWlsZXMuX3ByaXZlbGVtZGljdCA9IHsKK30KK21vbnRocy5fc3VwZXJjbGFzc25hbWVzID0gW10KK21vbnRocy5fcHJpdnByb3BkaWN0ID0geworfQorbW9udGhzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitNb25kYXkuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitNb25kYXkuX3ByaXZwcm9wZGljdCA9IHsKK30KK01vbmRheS5fcHJpdmVsZW1kaWN0ID0geworfQorbWlzc2luZ192YWx1ZXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCittaXNzaW5nX3ZhbHVlcy5fcHJpdnByb3BkaWN0ID0geworfQorbWlzc2luZ192YWx1ZXMuX3ByaXZlbGVtZGljdCA9IHsKK30KK251bWJlcl9vcl9kYXRlLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorbnVtYmVyX29yX2RhdGUuX3ByaXZwcm9wZGljdCA9IHsKK30KK251bWJlcl9vcl9kYXRlLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitudW1iZXJfMmNfX2RhdGVfb3JfdGV4dC5fc3VwZXJjbGFzc25hbWVzID0gW10KK251bWJlcl8yY19fZGF0ZV9vcl90ZXh0Ll9wcml2cHJvcGRpY3QgPSB7Cit9CitudW1iZXJfMmNfX2RhdGVfb3JfdGV4dC5fcHJpdmVsZW1kaWN0ID0geworfQorbnVtYmVycy5fc3VwZXJjbGFzc25hbWVzID0gW10KK251bWJlcnMuX3ByaXZwcm9wZGljdCA9IHsKK30KK251bWJlcnMuX3ByaXZlbGVtZGljdCA9IHsKK30KK05vdmVtYmVyLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorTm92ZW1iZXIuX3ByaXZwcm9wZGljdCA9IHsKK30KK05vdmVtYmVyLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitudW1iZXJfb3Jfc3RyaW5nLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorbnVtYmVyX29yX3N0cmluZy5fcHJpdnByb3BkaWN0ID0geworfQorbnVtYmVyX29yX3N0cmluZy5fcHJpdmVsZW1kaWN0ID0geworfQorcmVmZXJlbmNlcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3JlZmVyZW5jZXMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3JlZmVyZW5jZXMuX3ByaXZlbGVtZGljdCA9IHsKK30KK09jdG9iZXIuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitPY3RvYmVyLl9wcml2cHJvcGRpY3QgPSB7Cit9CitPY3RvYmVyLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitvdW5jZXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitvdW5jZXMuX3ByaXZwcm9wZGljdCA9IHsKK30KK291bmNlcy5fcHJpdmVsZW1kaWN0ID0geworfQorY2xhc3NfLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ3R5cGVfY2xhc3MnXQorY2xhc3NfLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKK30KK2NsYXNzXy5fcHJpdmVsZW1kaWN0ID0geworfQorcHJlcG9zaXRpb25zLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorcHJlcG9zaXRpb25zLl9wcml2cHJvcGRpY3QgPSB7Cit9CitwcmVwb3NpdGlvbnMuX3ByaXZlbGVtZGljdCA9IHsKK30KK3Byb3BlcnRpZXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitwcm9wZXJ0aWVzLl9wcml2cHJvcGRpY3QgPSB7Cit9Citwcm9wZXJ0aWVzLl9wcml2ZWxlbWRpY3QgPSB7Cit9Cit3cml0aW5nX2NvZGUuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit3cml0aW5nX2NvZGUuX3ByaXZwcm9wZGljdCA9IHsKK30KK3dyaXRpbmdfY29kZS5fcHJpdmVsZW1kaWN0ID0geworfQorUGFzY2FsX3N0cmluZ3MuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitQYXNjYWxfc3RyaW5ncy5fcHJpdnByb3BkaWN0ID0geworfQorUGFzY2FsX3N0cmluZ3MuX3ByaXZlbGVtZGljdCA9IHsKK30KK3F1YXJ0cy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3F1YXJ0cy5fcHJpdnByb3BkaWN0ID0geworfQorcXVhcnRzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitkYXRhLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorZGF0YS5fcHJpdnByb3BkaWN0ID0geworfQorZGF0YS5fcHJpdmVsZW1kaWN0ID0geworfQorcmVjb3Jkcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3JlY29yZHMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3JlY29yZHMuX3ByaXZlbGVtZGljdCA9IHsKK30KK1NhdHVyZGF5Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorU2F0dXJkYXkuX3ByaXZwcm9wZGljdCA9IHsKK30KK1NhdHVyZGF5Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitzZWNvbmRzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorc2Vjb25kcy5fcHJpdnByb3BkaWN0ID0geworfQorc2Vjb25kcy5fcHJpdmVsZW1kaWN0ID0geworfQorc2NyaXB0Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorc2NyaXB0Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAncGFyZW50JyA6IF9Qcm9wX3BhcmVudCwKK30KK3NjcmlwdC5fcHJpdmVsZW1kaWN0ID0geworfQorU2VwdGVtYmVyLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorU2VwdGVtYmVyLl9wcml2cHJvcGRpY3QgPSB7Cit9CitTZXB0ZW1iZXIuX3ByaXZlbGVtZGljdCA9IHsKK30KK2FsaWFzX29yX3N0cmluZy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2FsaWFzX29yX3N0cmluZy5fcHJpdnByb3BkaWN0ID0geworfQorYWxpYXNfb3Jfc3RyaW5nLl9wcml2ZWxlbWRpY3QgPSB7Cit9Citzb3VuZHMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitzb3VuZHMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3NvdW5kcy5fcHJpdmVsZW1kaWN0ID0geworfQorc3F1YXJlX2ZlZXQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitzcXVhcmVfZmVldC5fcHJpdnByb3BkaWN0ID0geworfQorc3F1YXJlX2ZlZXQuX3ByaXZlbGVtZGljdCA9IHsKK30KK3NxdWFyZV9raWxvbWV0ZXJzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorc3F1YXJlX2tpbG9tZXRlcnMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3NxdWFyZV9raWxvbWV0ZXJzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitzcXVhcmVfbWlsZXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitzcXVhcmVfbWlsZXMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3NxdWFyZV9taWxlcy5fcHJpdmVsZW1kaWN0ID0geworfQorc3F1YXJlX21ldGVycy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3NxdWFyZV9tZXRlcnMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3NxdWFyZV9tZXRlcnMuX3ByaXZlbGVtZGljdCA9IHsKK30KK3NxdWFyZV95YXJkcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3NxdWFyZV95YXJkcy5fcHJpdnByb3BkaWN0ID0geworfQorc3F1YXJlX3lhcmRzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitzdHlsZWRfQ2xpcGJvYXJkX3RleHQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitzdHlsZWRfQ2xpcGJvYXJkX3RleHQuX3ByaXZwcm9wZGljdCA9IHsKK30KK3N0eWxlZF9DbGlwYm9hcmRfdGV4dC5fcHJpdmVsZW1kaWN0ID0geworfQorc3R5bGVkX0NsaXBib2FyZF90ZXh0Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorc3R5bGVkX0NsaXBib2FyZF90ZXh0Ll9wcml2cHJvcGRpY3QgPSB7Cit9CitzdHlsZWRfQ2xpcGJvYXJkX3RleHQuX3ByaXZlbGVtZGljdCA9IHsKK30KK1N1bmRheS5fc3VwZXJjbGFzc25hbWVzID0gW10KK1N1bmRheS5fcHJpdnByb3BkaWN0ID0geworfQorU3VuZGF5Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitzdHlsZWRfVW5pY29kZV90ZXh0Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorc3R5bGVkX1VuaWNvZGVfdGV4dC5fcHJpdnByb3BkaWN0ID0geworfQorc3R5bGVkX1VuaWNvZGVfdGV4dC5fcHJpdmVsZW1kaWN0ID0geworfQorc3R5bGVkX1VuaWNvZGVfdGV4dC5fc3VwZXJjbGFzc25hbWVzID0gW10KK3N0eWxlZF9Vbmljb2RlX3RleHQuX3ByaXZwcm9wZGljdCA9IHsKK30KK3N0eWxlZF9Vbmljb2RlX3RleHQuX3ByaXZlbGVtZGljdCA9IHsKK30KK1RodXJzZGF5Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorVGh1cnNkYXkuX3ByaXZwcm9wZGljdCA9IHsKK30KK1RodXJzZGF5Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitUdWVzZGF5Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorVHVlc2RheS5fcHJpdnByb3BkaWN0ID0geworfQorVHVlc2RheS5fcHJpdmVsZW1kaWN0ID0geworfQordHlwZV9jbGFzcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3R5cGVfY2xhc3MuX3ByaXZwcm9wZGljdCA9IHsKK30KK3R5cGVfY2xhc3MuX3ByaXZlbGVtZGljdCA9IHsKK30KK2VtcHR5X2FlX25hbWVfLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorZW1wdHlfYWVfbmFtZV8uX3ByaXZwcm9wZGljdCA9IHsKK30KK2VtcHR5X2FlX25hbWVfLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitVbmljb2RlX3RleHQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitVbmljb2RlX3RleHQuX3ByaXZwcm9wZGljdCA9IHsKK30KK1VuaWNvZGVfdGV4dC5fcHJpdmVsZW1kaWN0ID0geworfQorVW5pY29kZV90ZXh0Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorVW5pY29kZV90ZXh0Ll9wcml2cHJvcGRpY3QgPSB7Cit9CitVbmljb2RlX3RleHQuX3ByaXZlbGVtZGljdCA9IHsKK30KK3ZlY3Rvci5fc3VwZXJjbGFzc25hbWVzID0gW10KK3ZlY3Rvci5fcHJpdnByb3BkaWN0ID0geworICAgICdsZW5ndGgnIDogX1Byb3BfbGVuZ3RoLAorfQordmVjdG9yLl9wcml2ZWxlbWRpY3QgPSB7Cit9Cit2ZXJzaW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQordmVyc2lvbi5fcHJpdnByb3BkaWN0ID0geworfQordmVyc2lvbi5fcHJpdmVsZW1kaWN0ID0geworfQorV2VkbmVzZGF5Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorV2VkbmVzZGF5Ll9wcml2cHJvcGRpY3QgPSB7Cit9CitXZWRuZXNkYXkuX3ByaXZlbGVtZGljdCA9IHsKK30KK3dlZWtkYXlzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQord2Vla2RheXMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3dlZWtkYXlzLl9wcml2ZWxlbWRpY3QgPSB7Cit9Cit5YXJkcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3lhcmRzLl9wcml2cHJvcGRpY3QgPSB7Cit9Cit5YXJkcy5fcHJpdmVsZW1kaWN0ID0geworfQorem9uZXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit6b25lcy5fcHJpdnByb3BkaWN0ID0geworfQorem9uZXMuX3ByaXZlbGVtZGljdCA9IHsKK30KK19FbnVtX2Jvb3YgPSB7CisgICAgJ3RydWUnIDogJ3RydWUnLCAgICAjIHRoZSB0cnVlIGJvb2xlYW4gdmFsdWUKKyAgICAnZmFsc2UnIDogJ2ZhbHMnLCAgICMgdGhlIGZhbHNlIGJvb2xlYW4gdmFsdWUKK30KKworX0VudW1fY29ucyA9IHsKKyAgICAnY2FzZScgOiAnY2FzZScsICAgICMgY2FzZQorICAgICdkaWFjcml0aWNhbHMnIDogJ2RpYWMnLCAgICAjIGRpYWNyaXRpY2FscworICAgICd3aGl0ZV9zcGFjZScgOiAnd2hpdCcsICAgICAjIHdoaXRlIHNwYWNlCisgICAgJ2h5cGhlbnMnIDogJ2h5cGgnLCAjIGh5cGhlbnMKKyAgICAnZXhwYW5zaW9uJyA6ICdleHBhJywgICAgICAgIyBleHBhbnNpb24KKyAgICAncHVuY3R1YXRpb24nIDogJ3B1bmMnLCAgICAgIyBwdW5jdHVhdGlvbgorICAgICdhcHBsaWNhdGlvbl9yZXNwb25zZXMnIDogJ3JtdGUnLCAgICMgcmVtb3RlIGV2ZW50IHJlcGxpZXMKK30KKworX0VudW1fZU1kcyA9IHsKKyAgICAnb3B0aW9uX2Rvd24nIDogJ0tvcHQnLCAgICAgIworICAgICdjb21tYW5kX2Rvd24nIDogJ0tjbWQnLCAgICAjCisgICAgJ2NvbnRyb2xfZG93bicgOiAnS2N0bCcsICAgICMKKyAgICAnc2hpZnRfZG93bicgOiAnS3NmdCcsICAgICAgIworICAgICdjYXBzX2xvY2tfZG93bicgOiAnS2NsaycsICAjCit9CisKK19FbnVtX2Vrc3QgPSB7CisgICAgJ2VzY2FwZV9rZXknIDogJ2tzNVx4MDAnLCAgICMKKyAgICAnZGVsZXRlX2tleScgOiAna3MzXHgwMCcsICAgIworICAgICd0YWJfa2V5JyA6ICdrczBceDAwJywgICAgICAjCisgICAgJ3JldHVybl9rZXknIDogJ2tzJFx4MDAnLCAgICMKKyAgICAnY2xlYXJfa2V5JyA6ICdrc0dceDAwJywgICAgIworICAgICdlbnRlcl9rZXknIDogJ2tzTFx4MDAnLCAgICAjCisgICAgJ3VwX2Fycm93X2tleScgOiAna3N+XHgwMCcsICMKKyAgICAnZG93bl9hcnJvd19rZXknIDogJ2tzfVx4MDAnLCAgICAgICAjCisgICAgJ2xlZnRfYXJyb3dfa2V5JyA6ICdrc3tceDAwJywgICAgICAgIworICAgICdyaWdodF9hcnJvd19rZXknIDogJ2tzfFx4MDAnLCAgICAgICMKKyAgICAnaGVscF9rZXknIDogJ2tzclx4MDAnLCAgICAgIworICAgICdob21lX2tleScgOiAna3NzXHgwMCcsICAgICAjCisgICAgJ3BhZ2VfdXBfa2V5JyA6ICdrc3RceDAwJywgICMKKyAgICAncGFnZV9kb3duX2tleScgOiAna3N5XHgwMCcsICAgICAgICAjCisgICAgJ2ZvcndhcmRfZGVsX2tleScgOiAna3N1XHgwMCcsICAgICAgIworICAgICdlbmRfa2V5JyA6ICdrc3dceDAwJywgICAgICAjCisgICAgJ0YxX2tleScgOiAna3N6XHgwMCcsICAgICAgICMKKyAgICAnRjJfa2V5JyA6ICdrc3hceDAwJywgICAgICAgIworICAgICdGM19rZXknIDogJ2tzY1x4MDAnLCAgICAgICAjCisgICAgJ0Y0X2tleScgOiAna3N2XHgwMCcsICAgICAgICMKKyAgICAnRjVfa2V5JyA6ICdrc2BceDAwJywgICAgICAgIworICAgICdGNl9rZXknIDogJ2tzYVx4MDAnLCAgICAgICAjCisgICAgJ0Y3X2tleScgOiAna3NiXHgwMCcsICAgICAgICMKKyAgICAnRjhfa2V5JyA6ICdrc2RceDAwJywgICAgICAgIworICAgICdGOV9rZXknIDogJ2tzZVx4MDAnLCAgICAgICAjCisgICAgJ0YxMF9rZXknIDogJ2tzbVx4MDAnLCAgICAgICMKKyAgICAnRjExX2tleScgOiAna3NnXHgwMCcsICAgICAgIworICAgICdGMTJfa2V5JyA6ICdrc29ceDAwJywgICAgICAjCisgICAgJ0YxM19rZXknIDogJ2tzaVx4MDAnLCAgICAgICMKKyAgICAnRjE0X2tleScgOiAna3NrXHgwMCcsICAgICAgIworICAgICdGMTVfa2V5JyA6ICdrc3FceDAwJywgICAgICAjCit9CisKK19FbnVtX21pc2MgPSB7CisgICAgJ2N1cnJlbnRfYXBwbGljYXRpb24nIDogJ2N1cmEnLCAgICAgIyB0aGUgY3VycmVudCBhcHBsaWNhdGlvbgorfQorCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICcqKioqJyA6IGFueXRoaW5nLAorICAgICdQSUNUJyA6IHBpY3R1cmVzLAorICAgICdTVFhUJyA6IHN0eWxlZF90ZXh0LAorICAgICdURVhUJyA6IHN0cmluZ3MsCisgICAgJ2FsaXMnIDogYWxpYXMsCisgICAgJ2FwciAnIDogQXByaWwsCisgICAgJ2F1ZyAnIDogQXVndXN0LAorICAgICdib29sJyA6IGJvb2xlYW5zLAorICAgICdjUkdCJyA6IFJHQl9jb2xvcnMsCisgICAgJ2NhcHAnIDogYXBwbGljYXRpb24sCisgICAgJ2Nhc2UnIDogdXBwZXJfY2FzZSwKKyAgICAnY2NtdCcgOiBjdWJpY19jZW50aW1ldGVycywKKyAgICAnY2ZldCcgOiBjdWJpY19mZWV0LAorICAgICdjaGEgJyA6IGNoYXJhY3RlcnMsCisgICAgJ2NpdGwnIDogd3JpdGluZ19jb2RlX2luZm8sCisgICAgJ2NpdG0nIDogdGV4dF9pdGVtcywKKyAgICAnY21ldCcgOiBjdWJpY19tZXRlcnMsCisgICAgJ2NtdHInIDogY2VudGltZXRlcnMsCisgICAgJ2NvYmonIDogaXRlbSwKKyAgICAnY3N0cicgOiBDX3N0cmluZ3MsCisgICAgJ2N0eHQnIDogdGV4dCwKKyAgICAnY3VpbicgOiBjdWJpY19pbmNoZXMsCisgICAgJ2N5cmQnIDogY3ViaWNfeWFyZHMsCisgICAgJ2RlYyAnIDogRGVjZW1iZXIsCisgICAgJ2RlZ2MnIDogZGVncmVlc19DZWxzaXVzLAorICAgICdkZWdmJyA6IGRlZ3JlZXNfRmFocmVuaGVpdCwKKyAgICAnZGVnaycgOiBkZWdyZWVzX0tlbHZpbiwKKyAgICAnZG91YicgOiByZWFscywKKyAgICAnZW5jcycgOiBlbmNvZGVkX3N0cmluZ3MsCisgICAgJ2VudW0nIDogY29uc3RhbnRzLAorICAgICdldm50JyA6IGV2ZW50cywKKyAgICAnZmViICcgOiBGZWJydWFyeSwKKyAgICAnZmVldCcgOiBmZWV0LAorICAgICdmcmkgJyA6IEZyaWRheSwKKyAgICAnZnNzICcgOiBmaWxlX3NwZWNpZmljYXRpb24sCisgICAgJ2dhbG4nIDogZ2FsbG9ucywKKyAgICAnZ3JhbScgOiBncmFtcywKKyAgICAnaGFuZCcgOiBoYW5kbGVycywKKyAgICAnaW5jaCcgOiBpbmNoZXMsCisgICAgJ2l0eHQnIDogaW50ZXJuYXRpb25hbF90ZXh0LAorICAgICdqYW4gJyA6IEphbnVhcnksCisgICAgJ2p1bCAnIDogSnVseSwKKyAgICAnanVuICcgOiBKdW5lLAorICAgICdrZnJtJyA6IHJlZmVyZW5jZV9mb3JtcywKKyAgICAna2dybScgOiBraWxvZ3JhbXMsCisgICAgJ2ttdHInIDoga2lsb21ldGVycywKKyAgICAna3BycycgOiBrZXlzdHJva2UsCisgICAgJ2xicyAnIDogcG91bmRzLAorICAgICdsZHQgJyA6IGRhdGUsCisgICAgJ2xpc3QnIDogbGlzdCwKKyAgICAnbGl0cicgOiBsaXRlcnMsCisgICAgJ2xsc3QnIDogbGlua2VkX2xpc3QsCisgICAgJ2xvbmcnIDogaW50ZWdlcnMsCisgICAgJ2xyICAnIDogbGlzdF9vcl9yZWNvcmQsCisgICAgJ2xycyAnIDogbGlzdF8yY19fcmVjb3JkX29yX3RleHQsCisgICAgJ2xzICAnIDogbGlzdF9vcl9zdHJpbmcsCisgICAgJ21hY2gnIDogbWFjaGluZXMsCisgICAgJ21hciAnIDogTWFyY2gsCisgICAgJ21heSAnIDogTWF5LAorICAgICdtZXRyJyA6IG1ldGVycywKKyAgICAnbWlsZScgOiBtaWxlcywKKyAgICAnbW50aCcgOiBtb250aHMsCisgICAgJ21vbiAnIDogTW9uZGF5LAorICAgICdtc25nJyA6IG1pc3NpbmdfdmFsdWVzLAorICAgICduZCAgJyA6IG51bWJlcl9vcl9kYXRlLAorICAgICduZHMgJyA6IG51bWJlcl8yY19fZGF0ZV9vcl90ZXh0LAorICAgICdubWJyJyA6IG51bWJlcnMsCisgICAgJ25vdiAnIDogTm92ZW1iZXIsCisgICAgJ25zICAnIDogbnVtYmVyX29yX3N0cmluZywKKyAgICAnb2JqICcgOiByZWZlcmVuY2VzLAorICAgICdvY3QgJyA6IE9jdG9iZXIsCisgICAgJ296cyAnIDogb3VuY2VzLAorICAgICdwY2xzJyA6IGNsYXNzXywKKyAgICAncHJlcCcgOiBwcmVwb3NpdGlvbnMsCisgICAgJ3Byb3AnIDogcHJvcGVydGllcywKKyAgICAncHNjdCcgOiB3cml0aW5nX2NvZGUsCisgICAgJ3BzdHInIDogUGFzY2FsX3N0cmluZ3MsCisgICAgJ3FydHMnIDogcXVhcnRzLAorICAgICdyZGF0JyA6IGRhdGEsCisgICAgJ3JlY28nIDogcmVjb3JkcywKKyAgICAnc2F0ICcgOiBTYXR1cmRheSwKKyAgICAnc2NuZCcgOiBzZWNvbmRzLAorICAgICdzY3B0JyA6IHNjcmlwdCwKKyAgICAnc2VwICcgOiBTZXB0ZW1iZXIsCisgICAgJ3NmICAnIDogYWxpYXNfb3Jfc3RyaW5nLAorICAgICdzbmQgJyA6IHNvdW5kcywKKyAgICAnc3FmdCcgOiBzcXVhcmVfZmVldCwKKyAgICAnc3FrbScgOiBzcXVhcmVfa2lsb21ldGVycywKKyAgICAnc3FtaScgOiBzcXVhcmVfbWlsZXMsCisgICAgJ3Nxcm0nIDogc3F1YXJlX21ldGVycywKKyAgICAnc3F5ZCcgOiBzcXVhcmVfeWFyZHMsCisgICAgJ3N0eWwnIDogc3R5bGVkX0NsaXBib2FyZF90ZXh0LAorICAgICdzdW4gJyA6IFN1bmRheSwKKyAgICAnc3V0eCcgOiBzdHlsZWRfVW5pY29kZV90ZXh0LAorICAgICd0aHUgJyA6IFRodXJzZGF5LAorICAgICd0dWUgJyA6IFR1ZXNkYXksCisgICAgJ3R5cGUnIDogdHlwZV9jbGFzcywKKyAgICAndW5kZicgOiBlbXB0eV9hZV9uYW1lXywKKyAgICAndXR4dCcgOiBVbmljb2RlX3RleHQsCisgICAgJ3ZlY3QnIDogdmVjdG9yLAorICAgICd2ZXJzJyA6IHZlcnNpb24sCisgICAgJ3dlZCAnIDogV2VkbmVzZGF5LAorICAgICd3a2R5JyA6IHdlZWtkYXlzLAorICAgICd5YXJkJyA6IHlhcmRzLAorICAgICd6b25lJyA6IHpvbmVzLAorfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKKyAgICAnSUQgICcgOiBfUHJvcF9pZCwKKyAgICAnYXNjcicgOiBfUHJvcF9BcHBsZVNjcmlwdCwKKyAgICAnY0AjXicgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdkYXkgJyA6IF9Qcm9wX2RheSwKKyAgICAnZGF5cycgOiBfUHJvcF9kYXlzLAorICAgICdkc3RyJyA6IF9Qcm9wX2RhdGVfc3RyaW5nLAorICAgICdob3VyJyA6IF9Qcm9wX2hvdXJzLAorICAgICdrTW9kJyA6IF9Qcm9wX21vZGlmaWVycywKKyAgICAna01zZycgOiBfUHJvcF9rZXksCisgICAgJ2trbmQnIDogX1Byb3Bfa2V5X2tpbmQsCisgICAgJ2xlbmcnIDogX1Byb3BfbGVuZ3RoLAorICAgICdtaW4gJyA6IF9Qcm9wX21pbnV0ZXMsCisgICAgJ21udGgnIDogX1Byb3BfbW9udGgsCisgICAgJ3BhcmUnIDogX1Byb3BfcGFyZW50LAorICAgICdwaSAgJyA6IF9Qcm9wX3BpLAorICAgICdwbGNkJyA6IF9Qcm9wX2xhbmd1YWdlX2NvZGUsCisgICAgJ3BuYW0nIDogX1Byb3BfbmFtZSwKKyAgICAncHJkcCcgOiBfUHJvcF9wcmludF9kZXB0aCwKKyAgICAncHJsbicgOiBfUHJvcF9wcmludF9sZW5ndGgsCisgICAgJ3BzY2QnIDogX1Byb3Bfc2NyaXB0X2NvZGUsCisgICAgJ3BzeHAnIDogX1Byb3BfUE9TSVhfcGF0aCwKKyAgICAncmVzdCcgOiBfUHJvcF9yZXN0LAorICAgICdyZXQgJyA6IF9Qcm9wX3JldHVybl8sCisgICAgJ3JzbHQnIDogX1Byb3BfcmVzdWx0LAorICAgICdydnNlJyA6IF9Qcm9wX3JldmVyc2UsCisgICAgJ3NwYWMnIDogX1Byb3Bfc3BhY2UsCisgICAgJ3RhYiAnIDogX1Byb3BfdGFiLAorICAgICd0aW1lJyA6IF9Qcm9wX3RpbWUsCisgICAgJ3RzdHInIDogX1Byb3BfdGltZV9zdHJpbmcsCisgICAgJ3R4ZGwnIDogX1Byb3BfdGV4dF9pdGVtX2RlbGltaXRlcnMsCisgICAgJ3dlZWsnIDogX1Byb3Bfd2Vla3MsCisgICAgJ3drZHknIDogX1Byb3Bfd2Vla2RheSwKKyAgICAneWVhcicgOiBfUHJvcF95ZWFyLAorfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7CisgICAgJ2Jvb3YnIDogX0VudW1fYm9vdiwKKyAgICAnY29ucycgOiBfRW51bV9jb25zLAorICAgICdlTWRzJyA6IF9FbnVtX2VNZHMsCisgICAgJ2Vrc3QnIDogX0VudW1fZWtzdCwKKyAgICAnbWlzYycgOiBfRW51bV9taXNjLAorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL0FwcGxlU2NyaXB0X1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1Y2U5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL0FwcGxlU2NyaXB0X1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1Y2U5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9BcHBsZVNjcmlwdF9TdWl0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL01hY2ludG9zaF9Db25uZWN0aXZpdHlfQ2xhcy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9NYWNpbnRvc2hfQ29ubmVjdGl2aXR5X0NsYXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmZTVlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9NYWNpbnRvc2hfQ29ubmVjdGl2aXR5X0NsYXMucHkKQEAgLTAsMCArMSwzNzMgQEAKKyIiIlN1aXRlIE1hY2ludG9zaCBDb25uZWN0aXZpdHkgQ2xhc3NlczogQ2xhc3NlcyByZWxhdGluZyB0byBBcHBsZSBNYWNpbnRvc2ggcGVyc29uYWwgY29tcHV0ZXIgY29ubmVjdGl2aXR5CitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1ZvbHVtZXMvU2FwL1N5c3RlbSBGb2xkZXIvRXh0ZW5zaW9ucy9BcHBsZVNjcmlwdAorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMS8wLCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAnbWFjYycKKworY2xhc3MgTWFjaW50b3NoX0Nvbm5lY3Rpdml0eV9DbGFzX0V2ZW50czoKKworICAgIHBhc3MKKworCitjbGFzcyBBREJfYWRkcmVzcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkFEQiBhZGRyZXNzIC0gQWRkcmVzc2VzIGEgZGV2aWNlIGNvbm5lY3RlZCB2aWEgQXBwbGUgRGVza3RvcCBCdXMgIiIiCisgICAgd2FudCA9ICdjYWRiJworY2xhc3MgX1Byb3BfXzNjX2luaGVyaXRhbmNlXzNlXyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiPGluaGVyaXRhbmNlPiAtIGluaGVyaXRzIHNvbWUgb2YgaXRzIHByb3BlcnRpZXMgZnJvbSB0aGlzIGNsYXNzICIiIgorICAgIHdoaWNoID0gJ2NAI14nCisgICAgd2FudCA9ICdjYWRyJworY2xhc3MgX1Byb3BfSUQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIklEIC0gdGhlIEFwcGxlIERlc2t0b3AgQnVzIGRldmljZSBJRCAiIiIKKyAgICB3aGljaCA9ICdJRCAgJworICAgIHdhbnQgPSAnc2hvcicKKworQURCX2FkZHJlc3NlcyA9IEFEQl9hZGRyZXNzCisKK2NsYXNzIGFkZHJlc3Nfc3BlY2lmaWNhdGlvbihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImFkZHJlc3Mgc3BlY2lmaWNhdGlvbiAtIFVuaXF1ZSBkZXNpZ25hdGlvbiBvZiBhIGRldmljZSBvciBzZXJ2aWNlIGNvbm5lY3RlZCB0byB0aGlzIGNvbXB1dGVyICIiIgorICAgIHdhbnQgPSAnY2FkcicKK2NsYXNzIF9Qcm9wX2NvbmR1aXQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNvbmR1aXQgLSBIb3cgdGhlIGFkZHJlc3NlZSBpcyBwaHlzaWNhbGx5IGNvbm5lY3RlZCAiIiIKKyAgICB3aGljaCA9ICdwY29uJworICAgIHdhbnQgPSAnZWNvbicKK2NsYXNzIF9Qcm9wX3Byb3BlcnRpZXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInByb3BlcnRpZXMgLSBwcm9wZXJ0eSB0aGF0IGFsbG93cyBnZXR0aW5nIGFuZCBzZXR0aW5nIG9mIG11bHRpcGxlIHByb3BlcnRpZXMgIiIiCisgICAgd2hpY2ggPSAncEFMTCcKKyAgICB3YW50ID0gJ3JlY28nCitjbGFzcyBfUHJvcF9wcm90b2NvbChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicHJvdG9jb2wgLSBIb3cgdG8gdGFsayB0byB0aGlzIGFkZHJlc3NlZSAiIiIKKyAgICB3aGljaCA9ICdwcHJ0JworICAgIHdhbnQgPSAnZXBybycKKworYWRkcmVzc19zcGVjaWZpY2F0aW9ucyA9IGFkZHJlc3Nfc3BlY2lmaWNhdGlvbgorCitjbGFzcyBBcHBsZVRhbGtfYWRkcmVzcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkFwcGxlVGFsayBhZGRyZXNzIC0gQWRkcmVzc2VzIGEgZGV2aWNlIG9yIHNlcnZpY2UgY29ubmVjdGVkIHZpYSB0aGUgQXBwbGVUYWxrIHByb3RvY29sICIiIgorICAgIHdhbnQgPSAnY2F0ICcKK2NsYXNzIF9Qcm9wX0FwcGxlVGFsa19tYWNoaW5lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJBcHBsZVRhbGsgbWFjaGluZSAtIHRoZSBtYWNoaW5lIG5hbWUgcGFydCBvZiB0aGUgYWRkcmVzcyAiIiIKKyAgICB3aGljaCA9ICdwYXRtJworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX0FwcGxlVGFsa190eXBlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJBcHBsZVRhbGsgdHlwZSAtIHRoZSB0eXBlIHBhcnQgb2YgdGhlIEFwcGxlVGFsayBhZGRyZXNzICIiIgorICAgIHdoaWNoID0gJ3BhdHQnCisgICAgd2FudCA9ICdURVhUJworY2xhc3MgX1Byb3BfQXBwbGVUYWxrX3pvbmUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkFwcGxlVGFsayB6b25lIC0gdGhlIHpvbmUgcGFydCBvZiB0aGUgYWRkcmVzcyAiIiIKKyAgICB3aGljaCA9ICdwYXR6JworICAgIHdhbnQgPSAnVEVYVCcKKworQXBwbGVUYWxrX2FkZHJlc3NlcyA9IEFwcGxlVGFsa19hZGRyZXNzCisKK2NsYXNzIGJ1c19zbG90KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYnVzIHNsb3QgLSBBZGRyZXNzZXMgYSBQQywgUENJLCBvciBOdUJ1cyBjYXJkICIiIgorICAgIHdhbnQgPSAnY2J1cycKKworYnVzX3Nsb3RzID0gYnVzX3Nsb3QKKworY2xhc3MgZGV2aWNlX3NwZWNpZmljYXRpb24oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkZXZpY2Ugc3BlY2lmaWNhdGlvbiAtIEEgZGV2aWNlIGNvbm5lY3RlZCB0byBhIGNvbXB1dGVyICIiIgorICAgIHdhbnQgPSAnY2RldicKK2NsYXNzIF9Qcm9wX2RldmljZV9hZGRyZXNzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJkZXZpY2UgYWRkcmVzcyAtIHRoZSBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgIiIiCisgICAgd2hpY2ggPSAncGR2YScKKyAgICB3YW50ID0gJ2NhZHInCitjbGFzcyBfUHJvcF9kZXZpY2VfdHlwZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZGV2aWNlIHR5cGUgLSB0aGUga2luZCBvZiBkZXZpY2UgIiIiCisgICAgd2hpY2ggPSAncGR2dCcKKyAgICB3YW50ID0gJ2VkdnQnCisKK2RldmljZV9zcGVjaWZpY2F0aW9ucyA9IGRldmljZV9zcGVjaWZpY2F0aW9uCisKK2NsYXNzIEV0aGVybmV0X2FkZHJlc3MoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJFdGhlcm5ldCBhZGRyZXNzIC0gQWRkcmVzc2VzIGEgZGV2aWNlIGJ5IGl0cyBFdGhlcm5ldCBhZGRyZXNzICIiIgorICAgIHdhbnQgPSAnY2VuICcKKworRXRoZXJuZXRfYWRkcmVzc2VzID0gRXRoZXJuZXRfYWRkcmVzcworCitjbGFzcyBGaXJlV2lyZV9hZGRyZXNzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiRmlyZVdpcmUgYWRkcmVzcyAtIEFkZHJlc3NlcyBhIGRldmljZSBvbiB0aGUgRmlyZVdpcmUgYnVzICIiIgorICAgIHdhbnQgPSAnY2Z3ICcKKworRmlyZVdpcmVfYWRkcmVzc2VzID0gRmlyZVdpcmVfYWRkcmVzcworCitjbGFzcyBJUF9hZGRyZXNzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiSVAgYWRkcmVzcyAtIEFkZHJlc3NlcyBhIGRldmljZSBvciBzZXJ2aWNlIHZpYSB0aGUgSW50ZXJuZXQgUHJvdG9jb2wgKElQKSAiIiIKKyAgICB3YW50ID0gJ2NpcCAnCitjbGFzcyBfUHJvcF9ETlNfZm9ybShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiRE5TIGZvcm0gLSB0aGUgYWRkcmVzcyBpbiB0aGUgZm9ybSAiYXBwbGUuY29tIiAiIiIKKyAgICB3aGljaCA9ICdwZG5zJworICAgIHdhbnQgPSAnVEVYVCcKK2NsYXNzIF9Qcm9wX3BvcnQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInBvcnQgLSB0aGUgcG9ydCBudW1iZXIgb2YgdGhlIHNlcnZpY2Ugb3IgY2xpZW50IGJlaW5nIGFkZHJlc3NlZCAiIiIKKyAgICB3aGljaCA9ICdwcG9yJworICAgIHdhbnQgPSAnVEVYVCcKKworSVBfYWRkcmVzc2VzID0gSVBfYWRkcmVzcworCitjbGFzcyBMb2NhbFRhbGtfYWRkcmVzcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIkxvY2FsVGFsayBhZGRyZXNzIC0gQWRkcmVzc2VzIGEgZGV2aWNlIGJ5IGl0cyBMb2NhbFRhbGsgYWRkcmVzcyAiIiIKKyAgICB3YW50ID0gJ2NsdCAnCitjbGFzcyBfUHJvcF9uZXR3b3JrKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJuZXR3b3JrIC0gdGhlIExvY2FsVGFsayBuZXR3b3JrIG51bWJlciAiIiIKKyAgICB3aGljaCA9ICdwbmV0JworICAgIHdhbnQgPSAnc2hvcicKK2NsYXNzIF9Qcm9wX25vZGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm5vZGUgLSB0aGUgTG9jYWxUYWxrIG5vZGUgbnVtYmVyICIiIgorICAgIHdoaWNoID0gJ3Bub2QnCisgICAgd2FudCA9ICdzaG9yJworY2xhc3MgX1Byb3Bfc29ja2V0KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzb2NrZXQgLSB0aGUgTG9jYWxUYWxrIHNvY2tldCBudW1iZXIgIiIiCisgICAgd2hpY2ggPSAncHNvYycKKyAgICB3YW50ID0gJ3Nob3InCisKK0xvY2FsVGFsa19hZGRyZXNzZXMgPSBMb2NhbFRhbGtfYWRkcmVzcworCitjbGFzcyBTQ1NJX2FkZHJlc3MoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJTQ1NJIGFkZHJlc3MgLSBBZGRyZXNzZXMgYSBTQ1NJIGRldmljZSAiIiIKKyAgICB3YW50ID0gJ2NzY3MnCitjbGFzcyBfUHJvcF9MVU4oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIkxVTiAtIHRoZSBTQ1NJIGxvZ2ljYWwgdW5pdCBudW1iZXIgIiIiCisgICAgd2hpY2ggPSAncHNsdScKKyAgICB3YW50ID0gJ3Nob3InCitjbGFzcyBfUHJvcF9TQ1NJX2J1cyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiU0NTSSBidXMgLSB0aGUgU0NTSSBidXMgbnVtYmVyICIiIgorICAgIHdoaWNoID0gJ3BzY2InCisgICAgd2FudCA9ICdzaG9yJworCitTQ1NJX2FkZHJlc3NlcyA9IFNDU0lfYWRkcmVzcworCitjbGFzcyBUb2tlbl9SaW5nX2FkZHJlc3MoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJUb2tlbiBSaW5nIGFkZHJlc3MgLSBBZGRyZXNzZXMgYSBkZXZpY2Ugb3Igc2VydmljZSB2aWEgdGhlIFRva2VuIFJpbmcgcHJvdG9jb2wgIiIiCisgICAgd2FudCA9ICdjdG9rJworCitUb2tlbl9SaW5nX2FkZHJlc3NlcyA9IFRva2VuX1JpbmdfYWRkcmVzcworCitjbGFzcyBVU0JfYWRkcmVzcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIlVTQiBhZGRyZXNzIC0gQWRkcmVzc2VzIGEgZGV2aWNlIG9uIHRoZSBVbml2ZXJzYWwgU2VyaWFsIEJ1cyAiIiIKKyAgICB3YW50ID0gJ2N1c2InCitjbGFzcyBfUHJvcF9uYW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJuYW1lIC0gdGhlIFVTQiBkZXZpY2UgbmFtZSAiIiIKKyAgICB3aGljaCA9ICdwbmFtJworICAgIHdhbnQgPSAnVEVYVCcKKworVVNCX0FkZHJlc3NlcyA9IFVTQl9hZGRyZXNzCitBREJfYWRkcmVzcy5fc3VwZXJjbGFzc25hbWVzID0gWydhZGRyZXNzX3NwZWNpZmljYXRpb24nXQorQURCX2FkZHJlc3MuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnSUQnIDogX1Byb3BfSUQsCisgICAgJ18zY19pbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX2luaGVyaXRhbmNlXzNlXywKK30KK0FEQl9hZGRyZXNzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CithZGRyZXNzX3NwZWNpZmljYXRpb24uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCithZGRyZXNzX3NwZWNpZmljYXRpb24uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnY29uZHVpdCcgOiBfUHJvcF9jb25kdWl0LAorICAgICdwcm9wZXJ0aWVzJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCisgICAgJ3Byb3RvY29sJyA6IF9Qcm9wX3Byb3RvY29sLAorfQorYWRkcmVzc19zcGVjaWZpY2F0aW9uLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitBcHBsZVRhbGtfYWRkcmVzcy5fc3VwZXJjbGFzc25hbWVzID0gWydhZGRyZXNzX3NwZWNpZmljYXRpb24nXQorQXBwbGVUYWxrX2FkZHJlc3MuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnQXBwbGVUYWxrX21hY2hpbmUnIDogX1Byb3BfQXBwbGVUYWxrX21hY2hpbmUsCisgICAgJ0FwcGxlVGFsa190eXBlJyA6IF9Qcm9wX0FwcGxlVGFsa190eXBlLAorICAgICdBcHBsZVRhbGtfem9uZScgOiBfUHJvcF9BcHBsZVRhbGtfem9uZSwKKyAgICAnXzNjX2luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfaW5oZXJpdGFuY2VfM2VfLAorfQorQXBwbGVUYWxrX2FkZHJlc3MuX3ByaXZlbGVtZGljdCA9IHsKK30KK2J1c19zbG90Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ2FkZHJlc3Nfc3BlY2lmaWNhdGlvbiddCitidXNfc2xvdC5fcHJpdnByb3BkaWN0ID0geworICAgICdJRCcgOiBfUHJvcF9JRCwKKyAgICAnXzNjX2luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfaW5oZXJpdGFuY2VfM2VfLAorfQorYnVzX3Nsb3QuX3ByaXZlbGVtZGljdCA9IHsKK30KK2RldmljZV9zcGVjaWZpY2F0aW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorZGV2aWNlX3NwZWNpZmljYXRpb24uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnZGV2aWNlX2FkZHJlc3MnIDogX1Byb3BfZGV2aWNlX2FkZHJlc3MsCisgICAgJ2RldmljZV90eXBlJyA6IF9Qcm9wX2RldmljZV90eXBlLAorICAgICdwcm9wZXJ0aWVzJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCit9CitkZXZpY2Vfc3BlY2lmaWNhdGlvbi5fcHJpdmVsZW1kaWN0ID0geworfQorRXRoZXJuZXRfYWRkcmVzcy5fc3VwZXJjbGFzc25hbWVzID0gWydhZGRyZXNzX3NwZWNpZmljYXRpb24nXQorRXRoZXJuZXRfYWRkcmVzcy5fcHJpdnByb3BkaWN0ID0geworICAgICdJRCcgOiBfUHJvcF9JRCwKKyAgICAnXzNjX2luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfaW5oZXJpdGFuY2VfM2VfLAorfQorRXRoZXJuZXRfYWRkcmVzcy5fcHJpdmVsZW1kaWN0ID0geworfQorRmlyZVdpcmVfYWRkcmVzcy5fc3VwZXJjbGFzc25hbWVzID0gWydhZGRyZXNzX3NwZWNpZmljYXRpb24nXQorRmlyZVdpcmVfYWRkcmVzcy5fcHJpdnByb3BkaWN0ID0geworICAgICdJRCcgOiBfUHJvcF9JRCwKKyAgICAnXzNjX2luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfaW5oZXJpdGFuY2VfM2VfLAorfQorRmlyZVdpcmVfYWRkcmVzcy5fcHJpdmVsZW1kaWN0ID0geworfQorSVBfYWRkcmVzcy5fc3VwZXJjbGFzc25hbWVzID0gWydhZGRyZXNzX3NwZWNpZmljYXRpb24nXQorSVBfYWRkcmVzcy5fcHJpdnByb3BkaWN0ID0geworICAgICdETlNfZm9ybScgOiBfUHJvcF9ETlNfZm9ybSwKKyAgICAnSUQnIDogX1Byb3BfSUQsCisgICAgJ18zY19pbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX2luaGVyaXRhbmNlXzNlXywKKyAgICAncG9ydCcgOiBfUHJvcF9wb3J0LAorfQorSVBfYWRkcmVzcy5fcHJpdmVsZW1kaWN0ID0geworfQorTG9jYWxUYWxrX2FkZHJlc3MuX3N1cGVyY2xhc3NuYW1lcyA9IFsnYWRkcmVzc19zcGVjaWZpY2F0aW9uJ10KK0xvY2FsVGFsa19hZGRyZXNzLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19pbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX2luaGVyaXRhbmNlXzNlXywKKyAgICAnbmV0d29yaycgOiBfUHJvcF9uZXR3b3JrLAorICAgICdub2RlJyA6IF9Qcm9wX25vZGUsCisgICAgJ3NvY2tldCcgOiBfUHJvcF9zb2NrZXQsCit9CitMb2NhbFRhbGtfYWRkcmVzcy5fcHJpdmVsZW1kaWN0ID0geworfQorU0NTSV9hZGRyZXNzLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2FkZHJlc3Nfc3BlY2lmaWNhdGlvbiddCitTQ1NJX2FkZHJlc3MuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnSUQnIDogX1Byb3BfSUQsCisgICAgJ0xVTicgOiBfUHJvcF9MVU4sCisgICAgJ1NDU0lfYnVzJyA6IF9Qcm9wX1NDU0lfYnVzLAorICAgICdfM2NfaW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19pbmhlcml0YW5jZV8zZV8sCit9CitTQ1NJX2FkZHJlc3MuX3ByaXZlbGVtZGljdCA9IHsKK30KK1Rva2VuX1JpbmdfYWRkcmVzcy5fc3VwZXJjbGFzc25hbWVzID0gWydhZGRyZXNzX3NwZWNpZmljYXRpb24nXQorVG9rZW5fUmluZ19hZGRyZXNzLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ0lEJyA6IF9Qcm9wX0lELAorICAgICdfM2NfaW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19pbmhlcml0YW5jZV8zZV8sCit9CitUb2tlbl9SaW5nX2FkZHJlc3MuX3ByaXZlbGVtZGljdCA9IHsKK30KK1VTQl9hZGRyZXNzLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2FkZHJlc3Nfc3BlY2lmaWNhdGlvbiddCitVU0JfYWRkcmVzcy5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfaW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19pbmhlcml0YW5jZV8zZV8sCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKK30KK1VTQl9hZGRyZXNzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitfRW51bV9lY29uID0geworICAgICdBREInIDogJ2VhZGInLCAgICAgIworICAgICdwcmludGVyX3BvcnQnIDogJ2VjcHAnLCAgICAjCisgICAgJ21vZGVtX3BvcnQnIDogJ2VjbXAnLCAgICAgICMKKyAgICAnbW9kZW1fcHJpbnRlcl9wb3J0JyA6ICdlbXBwJywgICAgICAjCisgICAgJ0xvY2FsVGFsaycgOiAnZWNsdCcsICAgICAgICMKKyAgICAnRXRoZXJuZXQnIDogJ2VjZW4nLCAgICAgICAgIworICAgICdUb2tlbl9SaW5nJyA6ICdldG9rJywgICAgICAjCisgICAgJ1NDU0knIDogJ2Vjc2MnLCAgICAjCisgICAgJ1VTQicgOiAnZWN1cycsICAgICAjCisgICAgJ0ZpcmVXaXJlJyA6ICdlY2Z3JywgICAgICAgICMKKyAgICAnaW5mcmFyZWQnIDogJ2VjaXInLCAgICAgICAgIworICAgICdQQ19jYXJkJyA6ICdlY3BjJywgIworICAgICdQQ0lfYnVzJyA6ICdlY3BpJywgIworICAgICdOdUJ1cycgOiAnZW51YicsICAgIworICAgICdQRFNfc2xvdCcgOiAnZWNwZCcsICAgICAgICAjCisgICAgJ0NvbW1fc2xvdCcgOiAnZWNjbScsICAgICAgICMKKyAgICAnbW9uaXRvcl9vdXQnIDogJ2VjbW4nLCAgICAgIworICAgICd2aWRlb19vdXQnIDogJ2Vjdm8nLCAgICAgICAjCisgICAgJ3ZpZGVvX2luJyA6ICdlY3ZpJywgICAgICAgICMKKyAgICAnYXVkaW9fb3V0JyA6ICdlY2FvJywgICAgICAgIworICAgICdhdWRpb19saW5lX2luJyA6ICdlY2FpJywgICAjCisgICAgJ2F1ZGlvX2xpbmVfb3V0JyA6ICdlY2FsJywgICMKKyAgICAnbWljcm9waG9uZScgOiAnZWNtaScsICAgICAgIworfQorCitfRW51bV9lZHZ0ID0geworICAgICdoYXJkX2Rpc2tfZHJpdmUnIDogJ2VoZCAnLCAjCisgICAgJ2Zsb3BweV9kaXNrX2RyaXZlJyA6ICdlZmQgJywgICAgICAgIworICAgICdDRF9ST01fZHJpdmUnIDogJ2VjZCAnLCAgICAjCisgICAgJ0RWRF9kcml2ZScgOiAnZWR2ZCcsICAgICAgICMKKyAgICAnc3RvcmFnZV9kZXZpY2UnIDogJ2Vkc3QnLCAgIworICAgICdrZXlib2FyZCcgOiAnZWtiZCcsICAgICAgICAjCisgICAgJ21vdXNlJyA6ICdlbW91JywgICAjCisgICAgJ3RyYWNrYmFsbCcgOiAnZXRyaycsICAgICAgICMKKyAgICAndHJhY2twYWQnIDogJ2VkdHAnLCAgICAgICAgIworICAgICdwb2ludGluZ19kZXZpY2UnIDogJ2VkcGQnLCAjCisgICAgJ3ZpZGVvX21vbml0b3InIDogJ2Vkdm0nLCAgICMKKyAgICAnTENEX2Rpc3BsYXknIDogJ2VkbGMnLCAgICAgIworICAgICdkaXNwbGF5JyA6ICdlZGRzJywgIworICAgICdtb2RlbScgOiAnZWRtbScsICAgIworICAgICdQQ19jYXJkJyA6ICdlY3BjJywgIworICAgICdQQ0lfY2FyZCcgOiAnZWRwaScsICAgICAgICAjCisgICAgJ051QnVzX2NhcmQnIDogJ2VkbmInLCAgICAgICMKKyAgICAncHJpbnRlcicgOiAnZWRwcicsICMKKyAgICAnc3BlYWtlcnMnIDogJ2Vkc3AnLCAgICAgICAgIworICAgICdtaWNyb3Bob25lJyA6ICdlY21pJywgICAgICAjCit9CisKK19FbnVtX2Vwcm8gPSB7CisgICAgJ3NlcmlhbCcgOiAnZXBzcicsICAjCisgICAgJ0FwcGxlVGFsaycgOiAnZXBhdCcsICAgICAgICMKKyAgICAnSVAnIDogJ2VwaXAnLCAgICAgICMKKyAgICAnU0NTSScgOiAnZWNzYycsICAgICMKKyAgICAnQURCJyA6ICdlYWRiJywgICAgICMKKyAgICAnRmlyZVdpcmUnIDogJ2VjZncnLCAgICAgICAgIworICAgICdJckRBJyA6ICdlcGlyJywgICAgIworICAgICdJUlRhbGsnIDogJ2VwaXQnLCAgIworICAgICdVU0InIDogJ2VjdXMnLCAgICAgIworICAgICdQQ19jYXJkJyA6ICdlY3BjJywgIworICAgICdQQ0lfYnVzJyA6ICdlY3BpJywgIworICAgICdOdUJ1cycgOiAnZW51YicsICAgIworICAgICdidXMnIDogJ2VidXMnLCAgICAgIworICAgICdNYWNpbnRvc2hfdmlkZW8nIDogJ2VwbXYnLCAjCisgICAgJ1NWR0EnIDogJ2Vwc2cnLCAgICAjCisgICAgJ1NfdmlkZW8nIDogJ2Vwc3YnLCAjCisgICAgJ2FuYWxvZ19hdWRpbycgOiAnZXBhdScsICAgICMKKyAgICAnZGlnaXRhbF9hdWRpbycgOiAnZXBkYScsICAgIworICAgICdQb3N0U2NyaXB0JyA6ICdlcHBzJywgICAgICAjCit9CisKKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2NhZGInIDogQURCX2FkZHJlc3MsCisgICAgJ2NhZHInIDogYWRkcmVzc19zcGVjaWZpY2F0aW9uLAorICAgICdjYXQgJyA6IEFwcGxlVGFsa19hZGRyZXNzLAorICAgICdjYnVzJyA6IGJ1c19zbG90LAorICAgICdjZGV2JyA6IGRldmljZV9zcGVjaWZpY2F0aW9uLAorICAgICdjZW4gJyA6IEV0aGVybmV0X2FkZHJlc3MsCisgICAgJ2NmdyAnIDogRmlyZVdpcmVfYWRkcmVzcywKKyAgICAnY2lwICcgOiBJUF9hZGRyZXNzLAorICAgICdjbHQgJyA6IExvY2FsVGFsa19hZGRyZXNzLAorICAgICdjc2NzJyA6IFNDU0lfYWRkcmVzcywKKyAgICAnY3RvaycgOiBUb2tlbl9SaW5nX2FkZHJlc3MsCisgICAgJ2N1c2InIDogVVNCX2FkZHJlc3MsCit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworICAgICdJRCAgJyA6IF9Qcm9wX0lELAorICAgICdjQCNeJyA6IF9Qcm9wX18zY19pbmhlcml0YW5jZV8zZV8sCisgICAgJ3BBTEwnIDogX1Byb3BfcHJvcGVydGllcywKKyAgICAncGF0bScgOiBfUHJvcF9BcHBsZVRhbGtfbWFjaGluZSwKKyAgICAncGF0dCcgOiBfUHJvcF9BcHBsZVRhbGtfdHlwZSwKKyAgICAncGF0eicgOiBfUHJvcF9BcHBsZVRhbGtfem9uZSwKKyAgICAncGNvbicgOiBfUHJvcF9jb25kdWl0LAorICAgICdwZG5zJyA6IF9Qcm9wX0ROU19mb3JtLAorICAgICdwZHZhJyA6IF9Qcm9wX2RldmljZV9hZGRyZXNzLAorICAgICdwZHZ0JyA6IF9Qcm9wX2RldmljZV90eXBlLAorICAgICdwbmFtJyA6IF9Qcm9wX25hbWUsCisgICAgJ3BuZXQnIDogX1Byb3BfbmV0d29yaywKKyAgICAncG5vZCcgOiBfUHJvcF9ub2RlLAorICAgICdwcG9yJyA6IF9Qcm9wX3BvcnQsCisgICAgJ3BwcnQnIDogX1Byb3BfcHJvdG9jb2wsCisgICAgJ3BzY2InIDogX1Byb3BfU0NTSV9idXMsCisgICAgJ3BzbHUnIDogX1Byb3BfTFVOLAorICAgICdwc29jJyA6IF9Qcm9wX3NvY2tldCwKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworICAgICdlY29uJyA6IF9FbnVtX2Vjb24sCisgICAgJ2VkdnQnIDogX0VudW1fZWR2dCwKKyAgICAnZXBybycgOiBfRW51bV9lcHJvLAorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL01hY2ludG9zaF9Db25uZWN0aXZpdHlfQ2xhcy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvTWFjaW50b3NoX0Nvbm5lY3Rpdml0eV9DbGFzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzEwZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL01hY2ludG9zaF9Db25uZWN0aXZpdHlfQ2xhcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL01hY2ludG9zaF9Db25uZWN0aXZpdHlfQ2xhcy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvTWFjaW50b3NoX0Nvbm5lY3Rpdml0eV9DbGFzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzEwZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL01hY2ludG9zaF9Db25uZWN0aXZpdHlfQ2xhcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1F1aWNrRHJhd19HcmFwaGljc19TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3JhcGhpY3NfU3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3NDdmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3JhcGhpY3NfU3VpdGUucHkKQEAgLTAsMCArMSw0MTcgQEAKKyIiIlN1aXRlIFF1aWNrRHJhdyBHcmFwaGljcyBTdWl0ZTogQSBzZXQgb2YgYmFzaWMgY2xhc3NlcyBmb3IgZ3JhcGhpY3MKK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvVm9sdW1lcy9TYXAvU3lzdGVtIEZvbGRlci9FeHRlbnNpb25zL0FwcGxlU2NyaXB0CitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdxZHJ3JworCitjbGFzcyBRdWlja0RyYXdfR3JhcGhpY3NfU3VpdGVfRXZlbnRzOgorCisgICAgcGFzcworCisKK2NsYXNzIGFyYyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImFyYyAtIEFuIGFyYyAiIiIKKyAgICB3YW50ID0gJ2NhcmMnCitjbGFzcyBfUHJvcF9hcmNfYW5nbGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImFyYyBhbmdsZSAtIHRoZSBhbmdsZSBvZiB0aGUgYXJjIGluIGRlZ3JlZXMgIiIiCisgICAgd2hpY2ggPSAncGFyYycKKyAgICB3YW50ID0gJ2ZpeGQnCitjbGFzcyBfUHJvcF9ib3VuZHMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImJvdW5kcyAtIHRoZSBzbWFsbGVzdCByZWN0YW5nbGUgdGhhdCBjb250YWlucyB0aGUgZW50aXJlIGFyYyAiIiIKKyAgICB3aGljaCA9ICdwYm5kJworICAgIHdhbnQgPSAncWRydCcKK2NsYXNzIF9Qcm9wX2RlZmluaXRpb25fcmVjdChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZGVmaW5pdGlvbiByZWN0IC0gdGhlIHJlY3RhbmdsZSB0aGF0IGNvbnRhaW5zIHRoZSBjaXJjbGUgb3Igb3ZhbCB1c2VkIHRvIGRlZmluZSB0aGUgYXJjICIiIgorICAgIHdoaWNoID0gJ3BkcnQnCisgICAgd2FudCA9ICdxZHJ0JworY2xhc3MgX1Byb3BfZmlsbF9jb2xvcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZmlsbCBjb2xvciAtIHRoZSBmaWxsIGNvbG9yICIiIgorICAgIHdoaWNoID0gJ2ZsY2wnCisgICAgd2FudCA9ICdjUkdCJworY2xhc3MgX1Byb3BfZmlsbF9wYXR0ZXJuKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmaWxsIHBhdHRlcm4gLSB0aGUgZmlsbCBwYXR0ZXJuICIiIgorICAgIHdoaWNoID0gJ2ZscHQnCisgICAgd2FudCA9ICdjcGl4JworY2xhc3MgX1Byb3BfcGVuX2NvbG9yKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwZW4gY29sb3IgLSB0aGUgcGVuIGNvbG9yICIiIgorICAgIHdoaWNoID0gJ3BwY2wnCisgICAgd2FudCA9ICdjUkdCJworY2xhc3MgX1Byb3BfcGVuX3BhdHRlcm4oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInBlbiBwYXR0ZXJuIC0gdGhlIHBlbiBwYXR0ZXJuICIiIgorICAgIHdoaWNoID0gJ3BwcGEnCisgICAgd2FudCA9ICdjcGl4JworY2xhc3MgX1Byb3BfcGVuX3dpZHRoKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwZW4gd2lkdGggLSB0aGUgcGVuIHdpZHRoICIiIgorICAgIHdoaWNoID0gJ3Bwd2QnCisgICAgd2FudCA9ICdzaG9yJworY2xhc3MgX1Byb3Bfc3RhcnRfYW5nbGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInN0YXJ0IGFuZ2xlIC0gdGhlIGFuZ2xlIHRoYXQgZGVmaW5lcyB0aGUgc3RhcnQgb2YgdGhlIGFyYywgaW4gZGVncmVlcyAiIiIKKyAgICB3aGljaCA9ICdwYW5nJworICAgIHdhbnQgPSAnZml4ZCcKK2NsYXNzIF9Qcm9wX3RyYW5zZmVyX21vZGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInRyYW5zZmVyIG1vZGUgLSB0aGUgdHJhbnNmZXIgbW9kZSAiIiIKKyAgICB3aGljaCA9ICdwcHRtJworICAgIHdhbnQgPSAndHJhbicKKworYXJjcyA9IGFyYworCitjbGFzcyBkcmF3aW5nX2FyZWEoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkcmF3aW5nIGFyZWEgLSBDb250YWluZXIgZm9yIGdyYXBoaWNzIGFuZCBzdXBwb3J0aW5nIGluZm9ybWF0aW9uICIiIgorICAgIHdhbnQgPSAnY2RydycKK2NsYXNzIF9Qcm9wX2JhY2tncm91bmRfY29sb3IoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImJhY2tncm91bmQgY29sb3IgLSB0aGUgY29sb3IgdXNlZCB0byBmaWxsIGluIHVub2NjdXBpZWQgYXJlYXMgIiIiCisgICAgd2hpY2ggPSAncGJjbCcKKyAgICB3YW50ID0gJ2NSR0InCitjbGFzcyBfUHJvcF9iYWNrZ3JvdW5kX3BhdHRlcm4oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImJhY2tncm91bmQgcGF0dGVybiAtIHRoZSBwYXR0ZXJuIHVzZWQgdG8gZmlsbCBpbiB1bm9jY3VwaWVkIGFyZWFzICIiIgorICAgIHdoaWNoID0gJ3BicHQnCisgICAgd2FudCA9ICdjcGl4JworY2xhc3MgX1Byb3BfY29sb3JfdGFibGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNvbG9yIHRhYmxlIC0gdGhlIGNvbG9yIHRhYmxlICIiIgorICAgIHdoaWNoID0gJ2NsdGInCisgICAgd2FudCA9ICdjbHJ0JworY2xhc3MgX1Byb3BfZGVmYXVsdF9mb250KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJkZWZhdWx0IGZvbnQgLSB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBmb250IGZvciB0ZXh0IG9iamVjdHMgIiIiCisgICAgd2hpY2ggPSAncHR4ZicKKyAgICB3YW50ID0gJ2l0eHQnCitjbGFzcyBfUHJvcF9kZWZhdWx0X2xvY2F0aW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJkZWZhdWx0IGxvY2F0aW9uIC0gdGhlIGRlZmF1bHQgbG9jYXRpb24gb2YgZWFjaCBuZXcgZ3JhcGhpYyBvYmplY3QgIiIiCisgICAgd2hpY2ggPSAncG5lbCcKKyAgICB3YW50ID0gJ1FEcHQnCitjbGFzcyBfUHJvcF9kZWZhdWx0X3NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImRlZmF1bHQgc2l6ZSAtIHRoZSBkZWZhdWx0IHNpemUgZm9yIHRleHQgb2JqZWN0cyAiIiIKKyAgICB3aGljaCA9ICdwdHBzJworICAgIHdhbnQgPSAnZml4ZCcKK2NsYXNzIF9Qcm9wX25hbWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm5hbWUgLSB0aGUgbmFtZSAiIiIKKyAgICB3aGljaCA9ICdwbmFtJworICAgIHdhbnQgPSAnaXR4dCcKK2NsYXNzIF9Qcm9wX29yZGVyaW5nKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJvcmRlcmluZyAtIHRoZSBvcmRlcmVkIGxpc3Qgb2YgZ3JhcGhpYyBvYmplY3RzIGluIHRoZSBkcmF3aW5nIGFyZWEgIiIiCisgICAgd2hpY2ggPSAnZ29icycKKyAgICB3YW50ID0gJ29iaiAnCitjbGFzcyBfUHJvcF9waXhlbF9kZXB0aChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicGl4ZWwgZGVwdGggLSB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsICIiIgorICAgIHdoaWNoID0gJ3BkcHQnCisgICAgd2FudCA9ICdzaG9yJworY2xhc3MgX1Byb3Bfc3R5bGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInN0eWxlIC0gdGhlIGRlZmF1bHQgdGV4dCBzdHlsZSBmb3IgdGV4dCBvYmplY3RzICIiIgorICAgIHdoaWNoID0gJ3R4c3QnCisgICAgd2FudCA9ICd0c3R5JworY2xhc3MgX1Byb3BfdGV4dF9jb2xvcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidGV4dCBjb2xvciAtIHRoZSBkZWZhdWx0IGNvbG9yIGZvciB0ZXh0IG9iamVjdHMgIiIiCisgICAgd2hpY2ggPSAncHR4YycKKyAgICB3YW50ID0gJ2NSR0InCitjbGFzcyBfUHJvcF91cGRhdGVfb25fY2hhbmdlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ1cGRhdGUgb24gY2hhbmdlIC0gUmVkcmF3IGFmdGVyIGVhY2ggY2hhbmdlPyAiIiIKKyAgICB3aGljaCA9ICdwdXBkJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3dyaXRpbmdfY29kZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIid3JpdGluZyBjb2RlIC0gdGhlIHNjcmlwdCBzeXN0ZW0gYW5kIGxhbmd1YWdlIG9mIHRleHQgb2JqZWN0cyBpbiB0aGUgZHJhd2luZyBhcmVhICIiIgorICAgIHdoaWNoID0gJ3BzY3QnCisgICAgd2FudCA9ICdpbnRsJworCitkcmF3aW5nX2FyZWFzID0gZHJhd2luZ19hcmVhCisKK2NsYXNzIGdyYXBoaWNfb2JqZWN0cyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImdyYXBoaWMgb2JqZWN0cyAtICAiIiIKKyAgICB3YW50ID0gJ2Nnb2InCisKK2dyYXBoaWNfb2JqZWN0ID0gZ3JhcGhpY19vYmplY3RzCisKK2NsYXNzIGdyYXBoaWNfc2hhcGVzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiZ3JhcGhpYyBzaGFwZXMgLSAgIiIiCisgICAgd2FudCA9ICdjZ3NoJworCitncmFwaGljX3NoYXBlID0gZ3JhcGhpY19zaGFwZXMKKworY2xhc3MgZ3JhcGhpY190ZXh0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiZ3JhcGhpYyB0ZXh0IC0gQSBzZXJpZXMgb2YgY2hhcmFjdGVycyB3aXRoaW4gYSBkcmF3aW5nIGFyZWEgIiIiCisgICAgd2FudCA9ICdjZ3R4JworY2xhc3MgX1Byb3BfY29sb3IoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNvbG9yIC0gdGhlIGNvbG9yIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgIiIiCisgICAgd2hpY2ggPSAnY29scicKKyAgICB3YW50ID0gJ2NSR0InCitjbGFzcyBfUHJvcF9mb250KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmb250IC0gdGhlIG5hbWUgb2YgdGhlIGZvbnQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciAiIiIKKyAgICB3aGljaCA9ICdmb250JworICAgIHdhbnQgPSAnY3R4dCcKK2NsYXNzIF9Qcm9wX3NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNpemUgLSB0aGUgc2l6ZSBpbiBwb2ludHMgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciAiIiIKKyAgICB3aGljaCA9ICdwdHN6JworICAgIHdhbnQgPSAnZml4ZCcKK2NsYXNzIF9Qcm9wX3VuaWZvcm1fc3R5bGVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ1bmlmb3JtIHN0eWxlcyAtIHRoZSB0ZXh0IHN0eWxlcyB0aGF0IGFyZSB1bmlmb3JtIHRocm91Z2hvdXQgdGhlIHRleHQgIiIiCisgICAgd2hpY2ggPSAndXN0bCcKKyAgICB3YW50ID0gJ3RzdHknCisKK2NsYXNzIG92YWxzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIib3ZhbHMgLSAgIiIiCisgICAgd2FudCA9ICdjb3ZsJworCitvdmFsID0gb3ZhbHMKKworY2xhc3MgcG9seWdvbihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInBvbHlnb24gLSBBIHBvbHlnb24gIiIiCisgICAgd2FudCA9ICdjcGduJworY2xhc3MgX1Byb3BfcG9pbnRfbGlzdChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicG9pbnQgbGlzdCAtIHRoZSBsaXN0IG9mIHBvaW50cyB0aGF0IGRlZmluZSB0aGUgcG9seWdvbiAiIiIKKyAgICB3aGljaCA9ICdwdGx0JworICAgIHdhbnQgPSAnUURwdCcKKworcG9seWdvbnMgPSBwb2x5Z29uCisKK2NsYXNzIGdyYXBoaWNfZ3JvdXBzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiZ3JhcGhpYyBncm91cHMgLSAgIiIiCisgICAgd2FudCA9ICdjcGljJworCitncmFwaGljX2dyb3VwID0gZ3JhcGhpY19ncm91cHMKKworY2xhc3MgcGl4ZWxfbWFwcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInBpeGVsIG1hcHMgLSAgIiIiCisgICAgd2FudCA9ICdjcGl4JworCitwaXhlbF9tYXAgPSBwaXhlbF9tYXBzCisKK2NsYXNzIHBpeGVsKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIicGl4ZWwgLSBBIHBpeGVsICIiIgorICAgIHdhbnQgPSAnY3B4bCcKKworcGl4ZWxzID0gcGl4ZWwKKworY2xhc3MgcmVjdGFuZ2xlcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInJlY3RhbmdsZXMgLSAgIiIiCisgICAgd2FudCA9ICdjcmVjJworCityZWN0YW5nbGUgPSByZWN0YW5nbGVzCisKK2NsYXNzIHJvdW5kZWRfcmVjdGFuZ2xlKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIicm91bmRlZCByZWN0YW5nbGUgLSBBIHJvdW5kZWQgcmVjdGFuZ2xlICIiIgorICAgIHdhbnQgPSAnY3JyYycKK2NsYXNzIF9Qcm9wX2Nvcm5lcl9jdXJ2ZV9oZWlnaHQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNvcm5lciBjdXJ2ZSBoZWlnaHQgLSB0aGUgaGVpZ2h0IG9mIHRoZSBvdmFsIHVzZWQgdG8gZGVmaW5lIHRoZSBzaGFwZSBvZiB0aGUgcm91bmRlZCBjb3JuZXJzICIiIgorICAgIHdoaWNoID0gJ3BjaGQnCisgICAgd2FudCA9ICdzaG9yJworY2xhc3MgX1Byb3BfY29ybmVyX2N1cnZlX3dpZHRoKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjb3JuZXIgY3VydmUgd2lkdGggLSB0aGUgd2lkdGggb2YgdGhlIG92YWwgdXNlZCB0byBkZWZpbmUgdGhlIHNoYXBlIG9mIHRoZSByb3VuZGVkIGNvcm5lcnMgIiIiCisgICAgd2hpY2ggPSAncGN3ZCcKKyAgICB3YW50ID0gJ3Nob3InCisKK3JvdW5kZWRfcmVjdGFuZ2xlcyA9IHJvdW5kZWRfcmVjdGFuZ2xlCisKK2NsYXNzIGdyYXBoaWNfbGluZShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImdyYXBoaWMgbGluZSAtIEEgZ3JhcGhpYyBsaW5lICIiIgorICAgIHdhbnQgPSAnZ2xpbicKK2NsYXNzIF9Qcm9wX2Fycm93X3N0eWxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJhcnJvdyBzdHlsZSAtIHRoZSBhcnJvdyBzdHlsZSAiIiIKKyAgICB3aGljaCA9ICdhcnJvJworICAgIHdhbnQgPSAnYXJybycKK2NsYXNzIF9Qcm9wX2Rhc2hfc3R5bGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImRhc2ggc3R5bGUgLSB0aGUgZGFzaCBzdHlsZSAiIiIKKyAgICB3aGljaCA9ICdwZHN0JworICAgIHdhbnQgPSAndGRhcycKK2NsYXNzIF9Qcm9wX2VuZF9wb2ludChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZW5kIHBvaW50IC0gdGhlIGVuZGluZyBwb2ludCBvZiB0aGUgbGluZSAiIiIKKyAgICB3aGljaCA9ICdwZW5kJworICAgIHdhbnQgPSAnUURwdCcKK2NsYXNzIF9Qcm9wX3N0YXJ0X3BvaW50KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzdGFydCBwb2ludCAtIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgbGluZSAiIiIKKyAgICB3aGljaCA9ICdwc3RwJworICAgIHdhbnQgPSAnUURwdCcKKworZ3JhcGhpY19saW5lcyA9IGdyYXBoaWNfbGluZQorYXJjLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorYXJjLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2FyY19hbmdsZScgOiBfUHJvcF9hcmNfYW5nbGUsCisgICAgJ2JvdW5kcycgOiBfUHJvcF9ib3VuZHMsCisgICAgJ2RlZmluaXRpb25fcmVjdCcgOiBfUHJvcF9kZWZpbml0aW9uX3JlY3QsCisgICAgJ2ZpbGxfY29sb3InIDogX1Byb3BfZmlsbF9jb2xvciwKKyAgICAnZmlsbF9wYXR0ZXJuJyA6IF9Qcm9wX2ZpbGxfcGF0dGVybiwKKyAgICAncGVuX2NvbG9yJyA6IF9Qcm9wX3Blbl9jb2xvciwKKyAgICAncGVuX3BhdHRlcm4nIDogX1Byb3BfcGVuX3BhdHRlcm4sCisgICAgJ3Blbl93aWR0aCcgOiBfUHJvcF9wZW5fd2lkdGgsCisgICAgJ3N0YXJ0X2FuZ2xlJyA6IF9Qcm9wX3N0YXJ0X2FuZ2xlLAorICAgICd0cmFuc2Zlcl9tb2RlJyA6IF9Qcm9wX3RyYW5zZmVyX21vZGUsCit9CithcmMuX3ByaXZlbGVtZGljdCA9IHsKK30KK2RyYXdpbmdfYXJlYS5fc3VwZXJjbGFzc25hbWVzID0gW10KK2RyYXdpbmdfYXJlYS5fcHJpdnByb3BkaWN0ID0geworICAgICdiYWNrZ3JvdW5kX2NvbG9yJyA6IF9Qcm9wX2JhY2tncm91bmRfY29sb3IsCisgICAgJ2JhY2tncm91bmRfcGF0dGVybicgOiBfUHJvcF9iYWNrZ3JvdW5kX3BhdHRlcm4sCisgICAgJ2NvbG9yX3RhYmxlJyA6IF9Qcm9wX2NvbG9yX3RhYmxlLAorICAgICdkZWZhdWx0X2ZvbnQnIDogX1Byb3BfZGVmYXVsdF9mb250LAorICAgICdkZWZhdWx0X2xvY2F0aW9uJyA6IF9Qcm9wX2RlZmF1bHRfbG9jYXRpb24sCisgICAgJ2RlZmF1bHRfc2l6ZScgOiBfUHJvcF9kZWZhdWx0X3NpemUsCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAnb3JkZXJpbmcnIDogX1Byb3Bfb3JkZXJpbmcsCisgICAgJ3BpeGVsX2RlcHRoJyA6IF9Qcm9wX3BpeGVsX2RlcHRoLAorICAgICdzdHlsZScgOiBfUHJvcF9zdHlsZSwKKyAgICAndGV4dF9jb2xvcicgOiBfUHJvcF90ZXh0X2NvbG9yLAorICAgICd1cGRhdGVfb25fY2hhbmdlJyA6IF9Qcm9wX3VwZGF0ZV9vbl9jaGFuZ2UsCisgICAgJ3dyaXRpbmdfY29kZScgOiBfUHJvcF93cml0aW5nX2NvZGUsCit9CitkcmF3aW5nX2FyZWEuX3ByaXZlbGVtZGljdCA9IHsKK30KK2dyYXBoaWNfb2JqZWN0cy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2dyYXBoaWNfb2JqZWN0cy5fcHJpdnByb3BkaWN0ID0geworfQorZ3JhcGhpY19vYmplY3RzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitncmFwaGljX3NoYXBlcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2dyYXBoaWNfc2hhcGVzLl9wcml2cHJvcGRpY3QgPSB7Cit9CitncmFwaGljX3NoYXBlcy5fcHJpdmVsZW1kaWN0ID0geworfQorZ3JhcGhpY190ZXh0Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorZ3JhcGhpY190ZXh0Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2NvbG9yJyA6IF9Qcm9wX2NvbG9yLAorICAgICdmb250JyA6IF9Qcm9wX2ZvbnQsCisgICAgJ3NpemUnIDogX1Byb3Bfc2l6ZSwKKyAgICAndW5pZm9ybV9zdHlsZXMnIDogX1Byb3BfdW5pZm9ybV9zdHlsZXMsCit9CitncmFwaGljX3RleHQuX3ByaXZlbGVtZGljdCA9IHsKK30KK292YWxzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorb3ZhbHMuX3ByaXZwcm9wZGljdCA9IHsKK30KK292YWxzLl9wcml2ZWxlbWRpY3QgPSB7Cit9Citwb2x5Z29uLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorcG9seWdvbi5fcHJpdnByb3BkaWN0ID0geworICAgICdwb2ludF9saXN0JyA6IF9Qcm9wX3BvaW50X2xpc3QsCit9Citwb2x5Z29uLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitncmFwaGljX2dyb3Vwcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2dyYXBoaWNfZ3JvdXBzLl9wcml2cHJvcGRpY3QgPSB7Cit9CitncmFwaGljX2dyb3Vwcy5fcHJpdmVsZW1kaWN0ID0geworfQorcGl4ZWxfbWFwcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3BpeGVsX21hcHMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3BpeGVsX21hcHMuX3ByaXZlbGVtZGljdCA9IHsKK30KK3BpeGVsLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorcGl4ZWwuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnY29sb3InIDogX1Byb3BfY29sb3IsCit9CitwaXhlbC5fcHJpdmVsZW1kaWN0ID0geworfQorcmVjdGFuZ2xlcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3JlY3RhbmdsZXMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3JlY3RhbmdsZXMuX3ByaXZlbGVtZGljdCA9IHsKK30KK3JvdW5kZWRfcmVjdGFuZ2xlLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorcm91bmRlZF9yZWN0YW5nbGUuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnY29ybmVyX2N1cnZlX2hlaWdodCcgOiBfUHJvcF9jb3JuZXJfY3VydmVfaGVpZ2h0LAorICAgICdjb3JuZXJfY3VydmVfd2lkdGgnIDogX1Byb3BfY29ybmVyX2N1cnZlX3dpZHRoLAorfQorcm91bmRlZF9yZWN0YW5nbGUuX3ByaXZlbGVtZGljdCA9IHsKK30KK2dyYXBoaWNfbGluZS5fc3VwZXJjbGFzc25hbWVzID0gW10KK2dyYXBoaWNfbGluZS5fcHJpdnByb3BkaWN0ID0geworICAgICdhcnJvd19zdHlsZScgOiBfUHJvcF9hcnJvd19zdHlsZSwKKyAgICAnZGFzaF9zdHlsZScgOiBfUHJvcF9kYXNoX3N0eWxlLAorICAgICdlbmRfcG9pbnQnIDogX1Byb3BfZW5kX3BvaW50LAorICAgICdzdGFydF9wb2ludCcgOiBfUHJvcF9zdGFydF9wb2ludCwKK30KK2dyYXBoaWNfbGluZS5fcHJpdmVsZW1kaWN0ID0geworfQorX0VudW1fYXJybyA9IHsKKyAgICAnbm9fYXJyb3cnIDogJ2Fybm8nLCAgICAgICAgIyBObyBhcnJvdyBvbiBsaW5lCisgICAgJ2Fycm93X2F0X3N0YXJ0JyA6ICdhcnN0JywgICMgQXJyb3cgYXQgc3RhcnQgb2YgbGluZQorICAgICdhcnJvd19hdF9lbmQnIDogJ2FyZW4nLCAgICAjIEFycm93IGF0IGVuZCBvZiBsaW5lCisgICAgJ2Fycm93X2F0X2JvdGhfZW5kcycgOiAnYXJibycsICAgICAgIyBBcnJvdyBhdCBib3RoIHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiB0aGUgbGluZQorfQorCitfRW51bV90cmFuID0geworICAgICdjb3B5X3BpeGVscycgOiAnY3B5ICcsICAgICAjCisgICAgJ25vdF9jb3B5X3BpeGVscycgOiAnbmNweScsICMKKyAgICAnb3JfcGl4ZWxzJyA6ICdvciAgJywgICAgICAgIworICAgICdub3Rfb3JfcGl4ZWxzJyA6ICdudG9yJywgICAjCisgICAgJ2JpY19waXhlbHMnIDogJ2JpYyAnLCAgICAgICMKKyAgICAnbm90X2JpY19waXhlbHMnIDogJ25iaWMnLCAgIworICAgICd4b3JfcGl4ZWxzJyA6ICd4b3IgJywgICAgICAjCisgICAgJ25vdF94b3JfcGl4ZWxzJyA6ICdueG9yJywgICMKKyAgICAnYWRkX292ZXJfcGl4ZWxzJyA6ICdhZGRvJywgIworICAgICdhZGRfcGluX3BpeGVscycgOiAnYWRkcCcsICAjCisgICAgJ3N1Yl9vdmVyX3BpeGVscycgOiAnc3VibycsICMKKyAgICAnc3ViX3Bpbl9waXhlbHMnIDogJ3N1YnAnLCAgIworICAgICdhZF9tYXhfcGl4ZWxzJyA6ICdhZG14JywgICAjCisgICAgJ2FkX21pbl9waXhlbHMnIDogJ2FkbW4nLCAgICMKKyAgICAnYmxlbmRfcGl4ZWxzJyA6ICdibG5kJywgICAgIworfQorCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdjYXJjJyA6IGFyYywKKyAgICAnY2RydycgOiBkcmF3aW5nX2FyZWEsCisgICAgJ2Nnb2InIDogZ3JhcGhpY19vYmplY3RzLAorICAgICdjZ3NoJyA6IGdyYXBoaWNfc2hhcGVzLAorICAgICdjZ3R4JyA6IGdyYXBoaWNfdGV4dCwKKyAgICAnY292bCcgOiBvdmFscywKKyAgICAnY3BnbicgOiBwb2x5Z29uLAorICAgICdjcGljJyA6IGdyYXBoaWNfZ3JvdXBzLAorICAgICdjcGl4JyA6IHBpeGVsX21hcHMsCisgICAgJ2NweGwnIDogcGl4ZWwsCisgICAgJ2NyZWMnIDogcmVjdGFuZ2xlcywKKyAgICAnY3JyYycgOiByb3VuZGVkX3JlY3RhbmdsZSwKKyAgICAnZ2xpbicgOiBncmFwaGljX2xpbmUsCit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworICAgICdhcnJvJyA6IF9Qcm9wX2Fycm93X3N0eWxlLAorICAgICdjbHRiJyA6IF9Qcm9wX2NvbG9yX3RhYmxlLAorICAgICdjb2xyJyA6IF9Qcm9wX2NvbG9yLAorICAgICdmbGNsJyA6IF9Qcm9wX2ZpbGxfY29sb3IsCisgICAgJ2ZscHQnIDogX1Byb3BfZmlsbF9wYXR0ZXJuLAorICAgICdmb250JyA6IF9Qcm9wX2ZvbnQsCisgICAgJ2dvYnMnIDogX1Byb3Bfb3JkZXJpbmcsCisgICAgJ3BhbmcnIDogX1Byb3Bfc3RhcnRfYW5nbGUsCisgICAgJ3BhcmMnIDogX1Byb3BfYXJjX2FuZ2xlLAorICAgICdwYmNsJyA6IF9Qcm9wX2JhY2tncm91bmRfY29sb3IsCisgICAgJ3BibmQnIDogX1Byb3BfYm91bmRzLAorICAgICdwYnB0JyA6IF9Qcm9wX2JhY2tncm91bmRfcGF0dGVybiwKKyAgICAncGNoZCcgOiBfUHJvcF9jb3JuZXJfY3VydmVfaGVpZ2h0LAorICAgICdwY3dkJyA6IF9Qcm9wX2Nvcm5lcl9jdXJ2ZV93aWR0aCwKKyAgICAncGRwdCcgOiBfUHJvcF9waXhlbF9kZXB0aCwKKyAgICAncGRydCcgOiBfUHJvcF9kZWZpbml0aW9uX3JlY3QsCisgICAgJ3Bkc3QnIDogX1Byb3BfZGFzaF9zdHlsZSwKKyAgICAncGVuZCcgOiBfUHJvcF9lbmRfcG9pbnQsCisgICAgJ3BuYW0nIDogX1Byb3BfbmFtZSwKKyAgICAncG5lbCcgOiBfUHJvcF9kZWZhdWx0X2xvY2F0aW9uLAorICAgICdwcGNsJyA6IF9Qcm9wX3Blbl9jb2xvciwKKyAgICAncHBwYScgOiBfUHJvcF9wZW5fcGF0dGVybiwKKyAgICAncHB0bScgOiBfUHJvcF90cmFuc2Zlcl9tb2RlLAorICAgICdwcHdkJyA6IF9Qcm9wX3Blbl93aWR0aCwKKyAgICAncHNjdCcgOiBfUHJvcF93cml0aW5nX2NvZGUsCisgICAgJ3BzdHAnIDogX1Byb3Bfc3RhcnRfcG9pbnQsCisgICAgJ3B0bHQnIDogX1Byb3BfcG9pbnRfbGlzdCwKKyAgICAncHRwcycgOiBfUHJvcF9kZWZhdWx0X3NpemUsCisgICAgJ3B0c3onIDogX1Byb3Bfc2l6ZSwKKyAgICAncHR4YycgOiBfUHJvcF90ZXh0X2NvbG9yLAorICAgICdwdHhmJyA6IF9Qcm9wX2RlZmF1bHRfZm9udCwKKyAgICAncHVwZCcgOiBfUHJvcF91cGRhdGVfb25fY2hhbmdlLAorICAgICd0eHN0JyA6IF9Qcm9wX3N0eWxlLAorICAgICd1c3RsJyA6IF9Qcm9wX3VuaWZvcm1fc3R5bGVzLAorfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7CisgICAgJ2Fycm8nIDogX0VudW1fYXJybywKKyAgICAndHJhbicgOiBfRW51bV90cmFuLAorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1F1aWNrRHJhd19HcmFwaGljc19TdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvUXVpY2tEcmF3X0dyYXBoaWNzX1N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmYzODFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1F1aWNrRHJhd19HcmFwaGljc19TdWl0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1F1aWNrRHJhd19HcmFwaGljc19TdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvUXVpY2tEcmF3X0dyYXBoaWNzX1N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmYzODFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1F1aWNrRHJhd19HcmFwaGljc19TdWl0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1F1aWNrRHJhd19HcmFwaGljc19TdXBwbGVtZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3JhcGhpY3NfU3VwcGxlbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc4MTkzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3JhcGhpY3NfU3VwcGxlbWUucHkKQEAgLTAsMCArMSw3MyBAQAorIiIiU3VpdGUgUXVpY2tEcmF3IEdyYXBoaWNzIFN1cHBsZW1lbnRhbCBTdWl0ZTogRGVmaW5lcyB0cmFuc2Zvcm1hdGlvbnMgb2YgZ3JhcGhpYyBvYmplY3RzCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1ZvbHVtZXMvU2FwL1N5c3RlbSBGb2xkZXIvRXh0ZW5zaW9ucy9BcHBsZVNjcmlwdAorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMS8wLCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAncWRzcCcKKworY2xhc3MgUXVpY2tEcmF3X0dyYXBoaWNzX1N1cHBsZW1lX0V2ZW50czoKKworICAgIHBhc3MKKworCitjbGFzcyBkcmF3aW5nX2FyZWEoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkcmF3aW5nIGFyZWEgLSBDb250YWluZXIgZm9yIGdyYXBoaWNzIGFuZCBzdXBwb3J0aW5nIGluZm9ybWF0aW9uICIiIgorICAgIHdhbnQgPSAnY2RydycKK2NsYXNzIF9Qcm9wX3JvdGF0aW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJyb3RhdGlvbiAtIHRoZSBkZWZhdWx0IHJvdGF0aW9uIGZvciBvYmplY3RzIGluIHRoZSBkcmF3aW5nIGFyZWEgIiIiCisgICAgd2hpY2ggPSAncHJvdCcKKyAgICB3YW50ID0gJ3Ryb3QnCitjbGFzcyBfUHJvcF9zY2FsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic2NhbGUgLSB0aGUgZGVmYXVsdCBzY2FsaW5nIGZvciBvYmplY3RzIGluIHRoZSBkcmF3aW5nIGFyZWEgIiIiCisgICAgd2hpY2ggPSAncHNjbCcKKyAgICB3YW50ID0gJ2ZpeGQnCitjbGFzcyBfUHJvcF90cmFuc2xhdGlvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidHJhbnNsYXRpb24gLSB0aGUgZGVmYXVsdCByZXBvc2l0aW9uaW5nIGZvciBvYmplY3RzIGluIHRoZSBkcmF3aW5nIGFyZWEgIiIiCisgICAgd2hpY2ggPSAncHRycycKKyAgICB3YW50ID0gJ1FEcHQnCisKK2RyYXdpbmdfYXJlYXMgPSBkcmF3aW5nX2FyZWEKKworY2xhc3MgZ3JhcGhpY19ncm91cHMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJncmFwaGljIGdyb3VwcyAtICAiIiIKKyAgICB3YW50ID0gJ2NwaWMnCisKK2dyYXBoaWNfZ3JvdXAgPSBncmFwaGljX2dyb3VwcworZHJhd2luZ19hcmVhLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorZHJhd2luZ19hcmVhLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ3JvdGF0aW9uJyA6IF9Qcm9wX3JvdGF0aW9uLAorICAgICdzY2FsZScgOiBfUHJvcF9zY2FsZSwKKyAgICAndHJhbnNsYXRpb24nIDogX1Byb3BfdHJhbnNsYXRpb24sCit9CitkcmF3aW5nX2FyZWEuX3ByaXZlbGVtZGljdCA9IHsKK30KK2dyYXBoaWNfZ3JvdXBzLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorZ3JhcGhpY19ncm91cHMuX3ByaXZwcm9wZGljdCA9IHsKK30KK2dyYXBoaWNfZ3JvdXBzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdjZHJ3JyA6IGRyYXdpbmdfYXJlYSwKKyAgICAnY3BpYycgOiBncmFwaGljX2dyb3VwcywKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7CisgICAgJ3Byb3QnIDogX1Byb3Bfcm90YXRpb24sCisgICAgJ3BzY2wnIDogX1Byb3Bfc2NhbGUsCisgICAgJ3B0cnMnIDogX1Byb3BfdHJhbnNsYXRpb24sCit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3JhcGhpY3NfU3VwcGxlbWUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1F1aWNrRHJhd19HcmFwaGljc19TdXBwbGVtZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyYmZiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3JhcGhpY3NfU3VwcGxlbWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3JhcGhpY3NfU3VwcGxlbWUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1F1aWNrRHJhd19HcmFwaGljc19TdXBwbGVtZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMyYmZiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9RdWlja0RyYXdfR3JhcGhpY3NfU3VwcGxlbWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9SZXF1aXJlZF9TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9SZXF1aXJlZF9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc3ZGJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1JlcXVpcmVkX1N1aXRlLnB5CkBAIC0wLDAgKzEsMzIgQEAKKyIiIlN1aXRlIFJlcXVpcmVkIFN1aXRlOiBFdmVyeSBhcHBsaWNhdGlvbiBzdXBwb3J0cyBvcGVuLCBwcmludCwgcnVuLCBhbmQgcXVpdAorTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9Wb2x1bWVzL1NhcC9TeXN0ZW0gRm9sZGVyL0V4dGVuc2lvbnMvQXBwbGVTY3JpcHQKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ3JlcWQnCisKK2Zyb20gX2J1aWx0aW5TdWl0ZXMuYnVpbHRpbl9TdWl0ZSBpbXBvcnQgKgorY2xhc3MgUmVxdWlyZWRfU3VpdGVfRXZlbnRzKGJ1aWx0aW5fU3VpdGVfRXZlbnRzKToKKworICAgIHBhc3MKKworCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9SZXF1aXJlZF9TdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvUmVxdWlyZWRfU3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZTBlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvUmVxdWlyZWRfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9SZXF1aXJlZF9TdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvUmVxdWlyZWRfU3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZTBlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvUmVxdWlyZWRfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9TdGFuZGFyZF9TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9TdGFuZGFyZF9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGU1NDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1N0YW5kYXJkX1N1aXRlLnB5CkBAIC0wLDAgKzEsNzM4IEBACisiIiJTdWl0ZSBTdGFuZGFyZCBTdWl0ZTogQ29tbW9uIHRlcm1zIGZvciBtb3N0IGFwcGxpY2F0aW9ucworTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9Wb2x1bWVzL1NhcC9TeXN0ZW0gRm9sZGVyL0V4dGVuc2lvbnMvQXBwbGVTY3JpcHQKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ2NvcmUnCisKK2Zyb20gX2J1aWx0aW5TdWl0ZXMuYnVpbHRpbl9TdWl0ZSBpbXBvcnQgKgorY2xhc3MgU3RhbmRhcmRfU3VpdGVfRXZlbnRzKGJ1aWx0aW5fU3VpdGVfRXZlbnRzKToKKworICAgIF9hcmdtYXBfY2xhc3NfaW5mbyA9IHsKKyAgICAgICAgJ2luXycgOiAnd3JjZCcsCisgICAgfQorCisgICAgZGVmIGNsYXNzX2luZm8oc2VsZiwgX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiY2xhc3MgaW5mbzogKG9wdGlvbmFsKSBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYW4gb2JqZWN0IGNsYXNzCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGNsYXNzIGFib3V0IHdoaWNoIGluZm9ybWF0aW9uIGlzIHJlcXVlc3RlZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGluXzogdGhlIGh1bWFuIGxhbmd1YWdlIGFuZCBzY3JpcHQgc3lzdGVtIGluIHdoaWNoIHRvIHJldHVybiBpbmZvcm1hdGlvbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IGEgcmVjb3JkIGNvbnRhaW5pbmcgdGhlIG9iamVjdFx4ZDVzIHByb3BlcnRpZXMgYW5kIGVsZW1lbnRzCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdxb2JqJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2NsYXNzX2luZm8pCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9jbG9zZSA9IHsKKyAgICAgICAgJ3NhdmluZycgOiAnc2F2bycsCisgICAgICAgICdzYXZpbmdfaW4nIDogJ2tmaWwnLAorICAgIH0KKworICAgIGRlZiBjbG9zZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiY2xvc2U6IENsb3NlIGFuIG9iamVjdAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCB0byBjbG9zZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHNhdmluZzogc3BlY2lmaWVzIHdoZXRoZXIgY2hhbmdlcyBzaG91bGQgYmUgc2F2ZWQgYmVmb3JlIGNsb3NpbmcKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzYXZpbmdfaW46IHRoZSBmaWxlIG9yIGFsaWFzIGluIHdoaWNoIHRvIHNhdmUgdGhlIG9iamVjdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdjbG9zJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2Nsb3NlKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ3Nhdm8nLCBfRW51bV9zYXZvKQorCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9jb3VudCA9IHsKKyAgICAgICAgJ2VhY2gnIDogJ2tvY2wnLAorICAgIH0KKworICAgIGRlZiBjb3VudChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiY291bnQ6IFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGFuIG9iamVjdAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCB3aG9zZSBlbGVtZW50cyBhcmUgdG8gYmUgY291bnRlZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGVhY2g6IGlmIHNwZWNpZmllZCwgcmVzdHJpY3RzIGNvdW50aW5nIHRvIG9iamVjdHMgb2YgdGhpcyBjbGFzcworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRoZSBudW1iZXIgb2YgZWxlbWVudHMKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2NudGUnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY291bnQpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9kYXRhX3NpemUgPSB7CisgICAgICAgICdhcycgOiAncnR5cCcsCisgICAgfQorCisgICAgZGVmIGRhdGFfc2l6ZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiZGF0YSBzaXplOiAob3B0aW9uYWwpIFJldHVybiB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhbiBvYmplY3QKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3Qgd2hvc2UgZGF0YSBzaXplIGlzIHRvIGJlIHJldHVybmVkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgYXM6IHRoZSBkYXRhIHR5cGUgZm9yIHdoaWNoIHRoZSBzaXplIGlzIGNhbGN1bGF0ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0IGluIGJ5dGVzCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdkc2l6JworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2RhdGFfc2l6ZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJkZWxldGU6IERlbGV0ZSBhbiBvYmplY3QgZnJvbSBpdHMgY29udGFpbmVyLiBOb3RlIHRoaXMgZG9lcyBub3Qgd29yayBvbiBzY3JpcHQgdmFyaWFibGVzLCBvbmx5IG9uIGVsZW1lbnRzIG9mIGFwcGxpY2F0aW9uIGNsYXNzZXMuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZWxlbWVudCB0byBkZWxldGUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnZGVsbycKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfZHVwbGljYXRlID0geworICAgICAgICAndG8nIDogJ2luc2gnLAorICAgICAgICAnd2l0aF9wcm9wZXJ0aWVzJyA6ICdwcmR0JywKKyAgICB9CisKKyAgICBkZWYgZHVwbGljYXRlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJkdXBsaWNhdGU6IER1cGxpY2F0ZSBvbmUgb3IgbW9yZSBvYmplY3RzCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0KHMpIHRvIGR1cGxpY2F0ZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRvOiB0aGUgbmV3IGxvY2F0aW9uIGZvciB0aGUgb2JqZWN0KHMpCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgd2l0aF9wcm9wZXJ0aWVzOiB0aGUgaW5pdGlhbCB2YWx1ZXMgZm9yIHByb3BlcnRpZXMgb2YgdGhlIG5ldyBvYmplY3QgdGhhdCBhcmUgdG8gYmUgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdG8gdGhlIGR1cGxpY2F0ZWQgb2JqZWN0KHMpCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdjbG9uJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2R1cGxpY2F0ZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX2V2ZW50X2luZm8gPSB7CisgICAgICAgICdpbl8nIDogJ3dyY2QnLAorICAgIH0KKworICAgIGRlZiBldmVudF9pbmZvKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJldmVudCBpbmZvOiAob3B0aW9uYWwpIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgQXBwbGUgZXZlbnRzIGluIGEgc3VpdGUKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBldmVudCBjbGFzcyBvZiB0aGUgQXBwbGUgZXZlbnRzIGZvciB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBpbl86IHRoZSBodW1hbiBsYW5ndWFnZSBhbmQgc2NyaXB0IHN5c3RlbSBpbiB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhIHJlY29yZCBjb250YWluaW5nIHRoZSBldmVudHMgYW5kIHRoZWlyIHBhcmFtZXRlcnMKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2d0ZWknCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfZXZlbnRfaW5mbykKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgZXhpc3RzKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJleGlzdHM6IFZlcmlmeSBpZiBhbiBvYmplY3QgZXhpc3RzCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGluIHF1ZXN0aW9uCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdHJ1ZSBpZiBpdCBleGlzdHMsIGZhbHNlIGlmIG5vdAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnZG9leCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBoYW5kbGVCcmVha3BvaW50KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJoYW5kbGVCcmVha3BvaW50OiByZXR1cm4gdHJ1ZSB0byBzdG9wIGF0IGEgYnJlYWtwb2ludAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIGNhbGwgZnJhbWUgb2YgdGhlIGJyZWFrcG9pbnQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB0cnVlIHRvIHN0b3AsIGZhbHNlIGlmIG5vdAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnYnJhaycKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfbWFrZSA9IHsKKyAgICAgICAgJ25ldycgOiAna29jbCcsCisgICAgICAgICdhdCcgOiAnaW5zaCcsCisgICAgICAgICd3aXRoX2RhdGEnIDogJ2RhdGEnLAorICAgICAgICAnd2l0aF9wcm9wZXJ0aWVzJyA6ICdwcmR0JywKKyAgICB9CisKKyAgICBkZWYgbWFrZShzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJtYWtlOiBNYWtlIGEgbmV3IGVsZW1lbnQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBuZXc6IHRoZSBjbGFzcyBvZiB0aGUgbmV3IGVsZW1lbnQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBhdDogdGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRvIGluc2VydCB0aGUgZWxlbWVudAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHdpdGhfZGF0YTogdGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIGVsZW1lbnQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb3BlcnRpZXM6IHRoZSBpbml0aWFsIHZhbHVlcyBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGVsZW1lbnQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB0byB0aGUgbmV3IG9iamVjdChzKQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnY3JlbCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9tYWtlKQorICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX21vdmUgPSB7CisgICAgICAgICd0bycgOiAnaW5zaCcsCisgICAgfQorCisgICAgZGVmIG1vdmUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIm1vdmU6IE1vdmUgb2JqZWN0KHMpIHRvIGEgbmV3IGxvY2F0aW9uCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0KHMpIHRvIG1vdmUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB0bzogdGhlIG5ldyBsb2NhdGlvbiBmb3IgdGhlIG9iamVjdChzKQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRvIHRoZSBvYmplY3QocykgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gbW92ZWQKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ21vdmUnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfbW92ZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgb3BlbihzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIib3BlbjogT3BlbiB0aGUgc3BlY2lmaWVkIG9iamVjdChzKQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogbGlzdCBvZiBvYmplY3RzIHRvIG9wZW4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYWV2dCcKKyAgICAgICAgX3N1YmNvZGUgPSAnb2RvYycKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBwcmludF8oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInByaW50OiBQcmludCB0aGUgc3BlY2lmaWVkIG9iamVjdChzKQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogbGlzdCBvZiBvYmplY3RzIHRvIHByaW50CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ3Bkb2MnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX3F1aXQgPSB7CisgICAgICAgICdzYXZpbmcnIDogJ3Nhdm8nLAorICAgIH0KKworICAgIGRlZiBxdWl0KHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInF1aXQ6IFF1aXQgYW4gYXBwbGljYXRpb24KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzYXZpbmc6IHNwZWNpZmllcyB3aGV0aGVyIHRvIHNhdmUgY3VycmVudGx5IG9wZW4gZG9jdW1lbnRzCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ3F1aXQnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfcXVpdCkKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnc2F2bycsIF9FbnVtX3Nhdm8pCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgcmVvcGVuKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInJlb3BlbjogUmVhY3RpdmF0ZSBhIHJ1bm5pbmcgYXBwbGljYXRpb24uICBTb21lIGFwcGxpY2F0aW9ucyB3aWxsIG9wZW4gYSBuZXcgdW50aXRsZWQgd2luZG93IGlmIG5vIHdpbmRvdyBpcyBvcGVuLgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhZXZ0JworICAgICAgICBfc3ViY29kZSA9ICdyYXBwJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBydW4oc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIicnVuOiBSdW4gYW4gYXBwbGljYXRpb24uICBNb3N0IGFwcGxpY2F0aW9ucyB3aWxsIG9wZW4gYW4gZW1wdHksIHVudGl0bGVkIHdpbmRvdy4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYWV2dCcKKyAgICAgICAgX3N1YmNvZGUgPSAnb2FwcCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX3NhdmUgPSB7CisgICAgICAgICdpbl8nIDogJ2tmaWwnLAorICAgICAgICAnYXMnIDogJ2ZsdHAnLAorICAgIH0KKworICAgIGRlZiBzYXZlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzYXZlOiBTYXZlIGFuIG9iamVjdAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCB0byBzYXZlLCB1c3VhbGx5IGEgZG9jdW1lbnQgb3Igd2luZG93CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgaW5fOiB0aGUgZmlsZSBvciBhbGlhcyBpbiB3aGljaCB0byBzYXZlIHRoZSBvYmplY3QKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBhczogdGhlIGZpbGUgdHlwZSBvZiB0aGUgZG9jdW1lbnQgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgZGF0YQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdzYXZlJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NhdmUpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIHNlbGVjdChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIic2VsZWN0OiBNYWtlIGEgc2VsZWN0aW9uCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IHRvIHNlbGVjdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdtaXNjJworICAgICAgICBfc3ViY29kZSA9ICdzbGN0JworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9zdWl0ZV9pbmZvID0geworICAgICAgICAnaW5fJyA6ICd3cmNkJywKKyAgICB9CisKKyAgICBkZWYgc3VpdGVfaW5mbyhzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIic3VpdGUgaW5mbzogKG9wdGlvbmFsKSBHZXQgaW5mb3JtYXRpb24gYWJvdXQgZXZlbnQgc3VpdGUocykKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBzdWl0ZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGluZm9ybWF0aW9uCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgaW5fOiB0aGUgaHVtYW4gbGFuZ3VhZ2UgYW5kIHNjcmlwdCBzeXN0ZW0gaW4gd2hpY2ggdG8gcmV0dXJuIGluZm9ybWF0aW9uCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYSByZWNvcmQgY29udGFpbmluZyB0aGUgc3VpdGVzIGFuZCB0aGVpciB2ZXJzaW9ucworICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnZ3RzaScKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zdWl0ZV9pbmZvKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCitjbGFzcyBhbGlhcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImFsaWFzIC0gYSBmaWxlIG9uIGEgZGlzayBvciBzZXJ2ZXIuICBUaGUgZmlsZSBtdXN0IGV4aXN0IHdoZW4geW91IGNoZWNrIHRoZSBzeW50YXggb2YgeW91ciBzY3JpcHQuICIiIgorICAgIHdhbnQgPSAnYWxpcycKK2NsYXNzIF9Qcm9wX1BPU0lYX3BhdGgoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlBPU0lYIHBhdGggLSB0aGUgUE9TSVggcGF0aCBvZiB0aGUgZmlsZSAiIiIKKyAgICB3aGljaCA9ICdwc3hwJworICAgIHdhbnQgPSAnVEVYVCcKKworYWxpYXNlcyA9IGFsaWFzCisKK2NsYXNzIGFwcGxpY2F0aW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYXBwbGljYXRpb24gLSBBbiBhcHBsaWNhdGlvbiBwcm9ncmFtICIiIgorICAgIHdhbnQgPSAnY2FwcCcKK2NsYXNzIF9Qcm9wX2NsaXBib2FyZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY2xpcGJvYXJkIC0gdGhlIGNvbnRlbnRzIG9mIHRoZSBjbGlwYm9hcmQgZm9yIHRoaXMgYXBwbGljYXRpb24gIiIiCisgICAgd2hpY2ggPSAncGNsaScKKyAgICB3YW50ID0gJyoqKionCitjbGlwYm9hcmQgPSBfUHJvcF9jbGlwYm9hcmQoKQorY2xhc3MgX1Byb3BfZnJvbnRtb3N0KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmcm9udG1vc3QgLSBJcyB0aGlzIHRoZSBmcm9udG1vc3QgYXBwbGljYXRpb24/ICIiIgorICAgIHdoaWNoID0gJ3Bpc2YnCisgICAgd2FudCA9ICdib29sJworZnJvbnRtb3N0ID0gX1Byb3BfZnJvbnRtb3N0KCkKK2NsYXNzIF9Qcm9wX25hbWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gIiIiCisgICAgd2hpY2ggPSAncG5hbScKKyAgICB3YW50ID0gJ2l0eHQnCituYW1lID0gX1Byb3BfbmFtZSgpCitjbGFzcyBfUHJvcF9zZWxlY3Rpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNlbGVjdGlvbiAtIHRoZSBzZWxlY3Rpb24gdmlzaWJsZSB0byB0aGUgdXNlci4gIFVzZSB0aGUgXHhkNHNlbGVjdFx4ZDUgY29tbWFuZCB0byBzZXQgYSBuZXcgc2VsZWN0aW9uOyB1c2UgXHhkNGNvbnRlbnRzIG9mIHNlbGVjdGlvblx4ZDUgdG8gZ2V0IG9yIGNoYW5nZSBpbmZvcm1hdGlvbiBpbiB0aGUgZG9jdW1lbnQuICIiIgorICAgIHdoaWNoID0gJ3NlbGUnCisgICAgd2FudCA9ICdjc2VsJworc2VsZWN0aW9uID0gX1Byb3Bfc2VsZWN0aW9uKCkKK2NsYXNzIF9Qcm9wX3ZlcnNpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInZlcnNpb24gLSB0aGUgdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRpb24gIiIiCisgICAgd2hpY2ggPSAndmVycycKKyAgICB3YW50ID0gJ3ZlcnMnCit2ZXJzaW9uID0gX1Byb3BfdmVyc2lvbigpCisKK2FwcGxpY2F0aW9ucyA9IGFwcGxpY2F0aW9uCisKK2NsYXNzIGluc2VydGlvbl9wb2ludHMoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJpbnNlcnRpb24gcG9pbnRzIC0gICIiIgorICAgIHdhbnQgPSAnY2lucycKKworaW5zZXJ0aW9uX3BvaW50ID0gaW5zZXJ0aW9uX3BvaW50cworCitjbGFzcyBzZWxlY3Rpb25fMmRfb2JqZWN0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIic2VsZWN0aW9uLW9iamVjdCAtIEEgd2F5IHRvIHJlZmVyIHRvIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBvZiB0aGUgc2VsZWN0aW9uLiAgVXNlIHRoZSBceGQ0c2VsZWN0XHhkNSBjb21tYW5kIHRvIG1ha2UgYSBuZXcgc2VsZWN0aW9uLiAiIiIKKyAgICB3YW50ID0gJ2NzZWwnCitjbGFzcyBfUHJvcF9jb250ZW50cyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY29udGVudHMgLSB0aGUgaW5mb3JtYXRpb24gY3VycmVudGx5IHNlbGVjdGVkLiAgVXNlIFx4ZDRjb250ZW50cyBvZiBzZWxlY3Rpb25ceGQ1IHRvIGdldCBvciBjaGFuZ2UgaW5mb3JtYXRpb24gaW4gYSBkb2N1bWVudC4gIiIiCisgICAgd2hpY2ggPSAncGNudCcKKyAgICB3YW50ID0gJyoqKionCisKK2NsYXNzIHdpbmRvdyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIndpbmRvdyAtIEEgd2luZG93ICIiIgorICAgIHdhbnQgPSAnY3dpbicKK2NsYXNzIF9Qcm9wX2JvdW5kcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiYm91bmRzIC0gdGhlIGJvdW5kYXJ5IHJlY3RhbmdsZSBmb3IgdGhlIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdwYm5kJworICAgIHdhbnQgPSAncWRydCcKK2NsYXNzIF9Qcm9wX2Nsb3NlYWJsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY2xvc2VhYmxlIC0gRG9lcyB0aGUgd2luZG93IGhhdmUgYSBjbG9zZSBib3g/ICIiIgorICAgIHdoaWNoID0gJ2hjbGInCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfZmxvYXRpbmcoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZsb2F0aW5nIC0gRG9lcyB0aGUgd2luZG93IGZsb2F0PyAiIiIKKyAgICB3aGljaCA9ICdpc2ZsJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2luZGV4KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJpbmRleCAtIHRoZSBudW1iZXIgb2YgdGhlIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdwaWR4JworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX21vZGFsKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJtb2RhbCAtIElzIHRoZSB3aW5kb3cgbW9kYWw/ICIiIgorICAgIHdoaWNoID0gJ3Btb2QnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfcmVzaXphYmxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJyZXNpemFibGUgLSBJcyB0aGUgd2luZG93IHJlc2l6YWJsZT8gIiIiCisgICAgd2hpY2ggPSAncHJzeicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF90aXRsZWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInRpdGxlZCAtIERvZXMgdGhlIHdpbmRvdyBoYXZlIGEgdGl0bGUgYmFyPyAiIiIKKyAgICB3aGljaCA9ICdwdGl0JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3Zpc2libGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInZpc2libGUgLSBJcyB0aGUgd2luZG93IHZpc2libGU/ICIiIgorICAgIHdoaWNoID0gJ3B2aXMnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3Bfem9vbWFibGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInpvb21hYmxlIC0gSXMgdGhlIHdpbmRvdyB6b29tYWJsZT8gIiIiCisgICAgd2hpY2ggPSAnaXN6bScKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF96b29tZWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInpvb21lZCAtIElzIHRoZSB3aW5kb3cgem9vbWVkPyAiIiIKKyAgICB3aGljaCA9ICdwenVtJworICAgIHdhbnQgPSAnYm9vbCcKKword2luZG93cyA9IHdpbmRvdworCitjbGFzcyBkb2N1bWVudChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImRvY3VtZW50IC0gQSBkb2N1bWVudCBvZiBhIHNjcmlwdGFibGUgYXBwbGljYXRpb24gIiIiCisgICAgd2FudCA9ICdkb2N1JworY2xhc3MgX1Byb3BfbW9kaWZpZWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm1vZGlmaWVkIC0gSGFzIHRoZSBkb2N1bWVudCBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IHNhdmU/ICIiIgorICAgIHdoaWNoID0gJ2ltb2QnCisgICAgd2FudCA9ICdib29sJworCitkb2N1bWVudHMgPSBkb2N1bWVudAorCitjbGFzcyBmaWxlKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiZmlsZSAtIGEgZmlsZSBvbiBhIGRpc2sgb3Igc2VydmVyICIiIgorICAgIHdhbnQgPSAnZmlsZScKKworZmlsZXMgPSBmaWxlCithbGlhcy5fc3VwZXJjbGFzc25hbWVzID0gW10KK2FsaWFzLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ1BPU0lYX3BhdGgnIDogX1Byb3BfUE9TSVhfcGF0aCwKK30KK2FsaWFzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CithcHBsaWNhdGlvbi5fc3VwZXJjbGFzc25hbWVzID0gW10KK2FwcGxpY2F0aW9uLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2NsaXBib2FyZCcgOiBfUHJvcF9jbGlwYm9hcmQsCisgICAgJ2Zyb250bW9zdCcgOiBfUHJvcF9mcm9udG1vc3QsCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAnc2VsZWN0aW9uJyA6IF9Qcm9wX3NlbGVjdGlvbiwKKyAgICAndmVyc2lvbicgOiBfUHJvcF92ZXJzaW9uLAorfQorYXBwbGljYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKK30KK2luc2VydGlvbl9wb2ludHMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitpbnNlcnRpb25fcG9pbnRzLl9wcml2cHJvcGRpY3QgPSB7Cit9CitpbnNlcnRpb25fcG9pbnRzLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitzZWxlY3Rpb25fMmRfb2JqZWN0Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorc2VsZWN0aW9uXzJkX29iamVjdC5fcHJpdnByb3BkaWN0ID0geworICAgICdjb250ZW50cycgOiBfUHJvcF9jb250ZW50cywKK30KK3NlbGVjdGlvbl8yZF9vYmplY3QuX3ByaXZlbGVtZGljdCA9IHsKK30KK3dpbmRvdy5fc3VwZXJjbGFzc25hbWVzID0gW10KK3dpbmRvdy5fcHJpdnByb3BkaWN0ID0geworICAgICdib3VuZHMnIDogX1Byb3BfYm91bmRzLAorICAgICdjbG9zZWFibGUnIDogX1Byb3BfY2xvc2VhYmxlLAorICAgICdmbG9hdGluZycgOiBfUHJvcF9mbG9hdGluZywKKyAgICAnaW5kZXgnIDogX1Byb3BfaW5kZXgsCisgICAgJ21vZGFsJyA6IF9Qcm9wX21vZGFsLAorICAgICdyZXNpemFibGUnIDogX1Byb3BfcmVzaXphYmxlLAorICAgICd0aXRsZWQnIDogX1Byb3BfdGl0bGVkLAorICAgICd2aXNpYmxlJyA6IF9Qcm9wX3Zpc2libGUsCisgICAgJ3pvb21hYmxlJyA6IF9Qcm9wX3pvb21hYmxlLAorICAgICd6b29tZWQnIDogX1Byb3Bfem9vbWVkLAorfQord2luZG93Ll9wcml2ZWxlbWRpY3QgPSB7Cit9Citkb2N1bWVudC5fc3VwZXJjbGFzc25hbWVzID0gW10KK2RvY3VtZW50Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ21vZGlmaWVkJyA6IF9Qcm9wX21vZGlmaWVkLAorfQorZG9jdW1lbnQuX3ByaXZlbGVtZGljdCA9IHsKK30KK2ZpbGUuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitmaWxlLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ1BPU0lYX3BhdGgnIDogX1Byb3BfUE9TSVhfcGF0aCwKK30KK2ZpbGUuX3ByaXZlbGVtZGljdCA9IHsKK30KK2NsYXNzIF8zY18oYWV0b29scy5OQ29tcGFyaXNvbik6CisgICAgIiIiPCAtIExlc3MgdGhhbiAiIiIKK2NsYXNzIF8zZF8oYWV0b29scy5OQ29tcGFyaXNvbik6CisgICAgIiIiPSAtIEVxdWFsICIiIgorY2xhc3MgXzNlXyhhZXRvb2xzLk5Db21wYXJpc29uKToKKyAgICAiIiI+IC0gR3JlYXRlciB0aGFuICIiIgorY2xhc3MgY29udGFpbnMoYWV0b29scy5OQ29tcGFyaXNvbik6CisgICAgIiIiY29udGFpbnMgLSBDb250YWlucyAiIiIKK2NsYXNzIGVuZHNfd2l0aChhZXRvb2xzLk5Db21wYXJpc29uKToKKyAgICAiIiJlbmRzIHdpdGggLSBFbmRzIHdpdGggIiIiCitjbGFzcyBzdGFydHNfd2l0aChhZXRvb2xzLk5Db21wYXJpc29uKToKKyAgICAiIiJzdGFydHMgd2l0aCAtIFN0YXJ0cyB3aXRoICIiIgorY2xhc3MgX2IyXyhhZXRvb2xzLk5Db21wYXJpc29uKToKKyAgICAiIiJceGIyIC0gTGVzcyB0aGFuIG9yIGVxdWFsIHRvICIiIgorY2xhc3MgX2IzXyhhZXRvb2xzLk5Db21wYXJpc29uKToKKyAgICAiIiJceGIzIC0gR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIiIgorX0VudW1fa2ZybSA9IHsKKyAgICAnaW5kZXgnIDogJ2luZHgnLCAgICMga2V5Zm9ybSBkZXNpZ25hdGluZyBpbmRleGVkIGFjY2VzcworICAgICduYW1lZCcgOiAnbmFtZScsICAgIyBrZXlmb3JtIGRlc2lnbmF0aW5nIG5hbWVkIGFjY2VzcworICAgICdpZCcgOiAnSUQgICcsICAgICAgIyBrZXlmb3JtIGRlc2lnbmF0aW5nIGFjY2VzcyBieSB1bmlxdWUgaWRlbnRpZmllcgorfQorCitfRW51bV9zYXZvID0geworICAgICd5ZXMnIDogJ3llcyAnLCAgICAgIyBTYXZlIG9iamVjdHMgbm93CisgICAgJ25vJyA6ICdubyAgJywgICAgICAjIERvIG5vdCBzYXZlIG9iamVjdHMKKyAgICAnYXNrJyA6ICdhc2sgJywgICAgICMgQXNrIHRoZSB1c2VyIHdoZXRoZXIgdG8gc2F2ZQorfQorCitfRW51bV9zdHlsID0geworICAgICdwbGFpbicgOiAncGxhbicsICAgIyBQbGFpbgorICAgICdib2xkJyA6ICdib2xkJywgICAgIyBCb2xkCisgICAgJ2l0YWxpYycgOiAnaXRhbCcsICAjIEl0YWxpYworICAgICdvdXRsaW5lJyA6ICdvdXRsJywgIyBPdXRsaW5lCisgICAgJ3NoYWRvdycgOiAnc2hhZCcsICAjIFNoYWRvdworICAgICd1bmRlcmxpbmUnIDogJ3VuZGwnLCAgICAgICAjIFVuZGVybGluZQorICAgICdzdXBlcnNjcmlwdCcgOiAnc3BzYycsICAgICAjIFN1cGVyc2NyaXB0CisgICAgJ3N1YnNjcmlwdCcgOiAnc2JzYycsICAgICAgICMgU3Vic2NyaXB0CisgICAgJ3N0cmlrZXRocm91Z2gnIDogJ3N0cmsnLCAgICMgU3RyaWtldGhyb3VnaAorICAgICdzbWFsbF9jYXBzJyA6ICdzbWNwJywgICAgICAjIFNtYWxsIGNhcHMKKyAgICAnYWxsX2NhcHMnIDogJ2FsY3AnLCAgICAgICAgIyBBbGwgY2FwaXRhbCBsZXR0ZXJzCisgICAgJ2FsbF9sb3dlcmNhc2UnIDogJ2xvd2MnLCAgICMgTG93ZXJjYXNlCisgICAgJ2NvbmRlbnNlZCcgOiAnY29uZCcsICAgICAgICMgQ29uZGVuc2VkCisgICAgJ2V4cGFuZGVkJyA6ICdwZXhwJywgICAgICAgICMgRXhwYW5kZWQKKyAgICAnaGlkZGVuJyA6ICdoaWRuJywgICMgSGlkZGVuCit9CisKKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2FsaXMnIDogYWxpYXMsCisgICAgJ2NhcHAnIDogYXBwbGljYXRpb24sCisgICAgJ2NpbnMnIDogaW5zZXJ0aW9uX3BvaW50cywKKyAgICAnY3NlbCcgOiBzZWxlY3Rpb25fMmRfb2JqZWN0LAorICAgICdjd2luJyA6IHdpbmRvdywKKyAgICAnZG9jdScgOiBkb2N1bWVudCwKKyAgICAnZmlsZScgOiBmaWxlLAorfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKKyAgICAnaGNsYicgOiBfUHJvcF9jbG9zZWFibGUsCisgICAgJ2ltb2QnIDogX1Byb3BfbW9kaWZpZWQsCisgICAgJ2lzZmwnIDogX1Byb3BfZmxvYXRpbmcsCisgICAgJ2lzem0nIDogX1Byb3Bfem9vbWFibGUsCisgICAgJ3BibmQnIDogX1Byb3BfYm91bmRzLAorICAgICdwY2xpJyA6IF9Qcm9wX2NsaXBib2FyZCwKKyAgICAncGNudCcgOiBfUHJvcF9jb250ZW50cywKKyAgICAncGlkeCcgOiBfUHJvcF9pbmRleCwKKyAgICAncGlzZicgOiBfUHJvcF9mcm9udG1vc3QsCisgICAgJ3Btb2QnIDogX1Byb3BfbW9kYWwsCisgICAgJ3BuYW0nIDogX1Byb3BfbmFtZSwKKyAgICAncHJzeicgOiBfUHJvcF9yZXNpemFibGUsCisgICAgJ3BzeHAnIDogX1Byb3BfUE9TSVhfcGF0aCwKKyAgICAncHRpdCcgOiBfUHJvcF90aXRsZWQsCisgICAgJ3B2aXMnIDogX1Byb3BfdmlzaWJsZSwKKyAgICAncHp1bScgOiBfUHJvcF96b29tZWQsCisgICAgJ3NlbGUnIDogX1Byb3Bfc2VsZWN0aW9uLAorICAgICd2ZXJzJyA6IF9Qcm9wX3ZlcnNpb24sCit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworICAgICc8ICAgJyA6IF8zY18sCisgICAgJzw9ICAnIDogX2IyXywKKyAgICAnPSAgICcgOiBfM2RfLAorICAgICc+ICAgJyA6IF8zZV8sCisgICAgJz49ICAnIDogX2IzXywKKyAgICAnYmd3dCcgOiBzdGFydHNfd2l0aCwKKyAgICAnY29udCcgOiBjb250YWlucywKKyAgICAnZW5kcycgOiBlbmRzX3dpdGgsCit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworICAgICdrZnJtJyA6IF9FbnVtX2tmcm0sCisgICAgJ3Nhdm8nIDogX0VudW1fc2F2bywKKyAgICAnc3R5bCcgOiBfRW51bV9zdHlsLAorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1N0YW5kYXJkX1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9TdGFuZGFyZF9TdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0MjU4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9TdGFuZGFyZF9TdWl0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1N0YW5kYXJkX1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9TdGFuZGFyZF9TdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0MjU4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9TdGFuZGFyZF9TdWl0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1RhYmxlX1N1aXRlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1RhYmxlX1N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYTAxYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvVGFibGVfU3VpdGUucHkKQEAgLTAsMCArMSwxMDQgQEAKKyIiIlN1aXRlIFRhYmxlIFN1aXRlOiBDbGFzc2VzIGZvciBtYW5pcHVsYXRpbmcgdGFibGVzCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1ZvbHVtZXMvU2FwL1N5c3RlbSBGb2xkZXIvRXh0ZW5zaW9ucy9BcHBsZVNjcmlwdAorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMS8wLCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAndGJscycKKworY2xhc3MgVGFibGVfU3VpdGVfRXZlbnRzOgorCisgICAgcGFzcworCisKK2NsYXNzIGNlbGwoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJjZWxsIC0gQSBjZWxsICIiIgorICAgIHdhbnQgPSAnY2NlbCcKK2NsYXNzIF9Qcm9wX2Zvcm11bGEoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZvcm11bGEgLSB0aGUgZm9ybXVsYSBvZiB0aGUgY2VsbCAiIiIKKyAgICB3aGljaCA9ICdwZm9yJworICAgIHdhbnQgPSAnY3R4dCcKK2NsYXNzIF9Qcm9wX3Byb3RlY3Rpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInByb3RlY3Rpb24gLSBJbmRpY2F0ZXMgd2hldGhlciB2YWx1ZSBvciBmb3JtdWxhIGluIHRoZSBjZWxsIGNhbiBiZSBjaGFuZ2VkICIiIgorICAgIHdoaWNoID0gJ3Bwcm8nCisgICAgd2FudCA9ICdwcnRuJworCitjZWxscyA9IGNlbGwKKworY2xhc3MgY29sdW1uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiY29sdW1uIC0gQSBjb2x1bW4gIiIiCisgICAgd2FudCA9ICdjY29sJworY2xhc3MgX1Byb3BfbmFtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gIiIiCisgICAgd2hpY2ggPSAncG5hbScKKyAgICB3YW50ID0gJ2l0eHQnCisKK2NvbHVtbnMgPSBjb2x1bW4KKworY2xhc3Mgcm93cyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInJvd3MgLSAgIiIiCisgICAgd2FudCA9ICdjcm93JworCityb3cgPSByb3dzCisKK2NsYXNzIHRhYmxlcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInRhYmxlcyAtICAiIiIKKyAgICB3YW50ID0gJ2N0YmwnCisKK3RhYmxlID0gdGFibGVzCitjZWxsLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorY2VsbC5fcHJpdnByb3BkaWN0ID0geworICAgICdmb3JtdWxhJyA6IF9Qcm9wX2Zvcm11bGEsCisgICAgJ3Byb3RlY3Rpb24nIDogX1Byb3BfcHJvdGVjdGlvbiwKK30KK2NlbGwuX3ByaXZlbGVtZGljdCA9IHsKK30KK2NvbHVtbi5fc3VwZXJjbGFzc25hbWVzID0gW10KK2NvbHVtbi5fcHJpdnByb3BkaWN0ID0geworICAgICduYW1lJyA6IF9Qcm9wX25hbWUsCit9Citjb2x1bW4uX3ByaXZlbGVtZGljdCA9IHsKK30KK3Jvd3MuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCityb3dzLl9wcml2cHJvcGRpY3QgPSB7Cit9Cityb3dzLl9wcml2ZWxlbWRpY3QgPSB7Cit9Cit0YWJsZXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit0YWJsZXMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3RhYmxlcy5fcHJpdmVsZW1kaWN0ID0geworfQorX0VudW1fcHJ0biA9IHsKKyAgICAncmVhZF9vbmx5JyA6ICdubW9kJywgICAgICAgIyBDYW5ceGQ1dCBjaGFuZ2UgdmFsdWVzIG9yIGZvcm11bGFzCisgICAgJ2Zvcm11bGFzX3Byb3RlY3RlZCcgOiAnZnBybycsICAgICAgIyBDYW4gY2hhbmdlcyB2YWx1ZXMgYnV0IG5vdCBmb3JtdWxhcworICAgICdyZWFkXzJmX3dyaXRlJyA6ICdtb2RmJywgICAjIENhbiBjaGFuZ2UgdmFsdWVzIGFuZCBmb3JtdWxhcworfQorCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdjY2VsJyA6IGNlbGwsCisgICAgJ2Njb2wnIDogY29sdW1uLAorICAgICdjcm93JyA6IHJvd3MsCisgICAgJ2N0YmwnIDogdGFibGVzLAorfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKKyAgICAncGZvcicgOiBfUHJvcF9mb3JtdWxhLAorICAgICdwbmFtJyA6IF9Qcm9wX25hbWUsCisgICAgJ3Bwcm8nIDogX1Byb3BfcHJvdGVjdGlvbiwKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworICAgICdwcnRuJyA6IF9FbnVtX3BydG4sCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvVGFibGVfU3VpdGUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1RhYmxlX1N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2I0YmFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1RhYmxlX1N1aXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvVGFibGVfU3VpdGUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1RhYmxlX1N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2I0YmFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1RhYmxlX1N1aXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvVGV4dF9TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UZXh0X1N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NDVmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvVGV4dF9TdWl0ZS5weQpAQCAtMCwwICsxLDIyNCBAQAorIiIiU3VpdGUgVGV4dCBTdWl0ZTogQSBzZXQgb2YgYmFzaWMgY2xhc3NlcyBmb3IgdGV4dCBwcm9jZXNzaW5nCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1ZvbHVtZXMvU2FwL1N5c3RlbSBGb2xkZXIvRXh0ZW5zaW9ucy9BcHBsZVNjcmlwdAorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMS8wLCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAnVEVYVCcKKworY2xhc3MgVGV4dF9TdWl0ZV9FdmVudHM6CisKKyAgICBwYXNzCisKKworY2xhc3MgdGV4dF9mbG93KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidGV4dCBmbG93IC0gQSBjb250aWd1b3VzIGJsb2NrIG9mIHRleHQuICBQYWdlIGxheW91dCBhcHBsaWNhdGlvbnMgY2FsbCB0aGlzIGEgXHhkNHN0b3J5Llx4ZDUgIiIiCisgICAgd2FudCA9ICdjZmxvJworY2xhc3MgX1Byb3BfXzNjX2luaGVyaXRhbmNlXzNlXyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiPGluaGVyaXRhbmNlPiAtIGluaGVyaXRzIHNvbWUgb2YgaXRzIHByb3BlcnRpZXMgZnJvbSB0aGlzIGNsYXNzICIiIgorICAgIHdoaWNoID0gJ2NAI14nCisgICAgd2FudCA9ICdjdHh0JworY2xhc3MgX1Byb3BfbmFtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibmFtZSAtIHRoZSBuYW1lICIiIgorICAgIHdoaWNoID0gJ3BuYW0nCisgICAgd2FudCA9ICdpdHh0JworCit0ZXh0X2Zsb3dzID0gdGV4dF9mbG93CisKK2NsYXNzIGNoYXJhY3RlcihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImNoYXJhY3RlciAtIEEgY2hhcmFjdGVyICIiIgorICAgIHdhbnQgPSAnY2hhICcKKworY2xhc3MgbGluZShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImxpbmUgLSBBIGxpbmUgb2YgdGV4dCAiIiIKKyAgICB3YW50ID0gJ2NsaW4nCitjbGFzcyBfUHJvcF9qdXN0aWZpY2F0aW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJqdXN0aWZpY2F0aW9uIC0gdGhlIGp1c3RpZmljYXRpb24gb2YgdGhlIHRleHQgIiIiCisgICAgd2hpY2ggPSAncGpzdCcKKyAgICB3YW50ID0gJ2p1c3QnCisKK2xpbmVzID0gbGluZQorCitjbGFzcyBwYXJhZ3JhcGgoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJwYXJhZ3JhcGggLSBBIHBhcmFncmFwaCAiIiIKKyAgICB3YW50ID0gJ2NwYXInCisKK3BhcmFncmFwaHMgPSBwYXJhZ3JhcGgKKworY2xhc3MgdGV4dChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInRleHQgLSBUZXh0ICIiIgorICAgIHdhbnQgPSAnY3R4dCcKK2NsYXNzIF9Qcm9wX2NvbG9yKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjb2xvciAtIHRoZSBjb2xvciBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyICIiIgorICAgIHdoaWNoID0gJ2NvbHInCisgICAgd2FudCA9ICdjUkdCJworY2xhc3MgX1Byb3BfZm9udChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZm9udCAtIHRoZSBuYW1lIG9mIHRoZSBmb250IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgIiIiCisgICAgd2hpY2ggPSAnZm9udCcKKyAgICB3YW50ID0gJ2N0eHQnCitjbGFzcyBfUHJvcF9xdW90ZWRfZm9ybShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicXVvdGVkIGZvcm0gLSB0aGUgdGV4dCBpbiBxdW90ZWQgZm9ybSAiIiIKKyAgICB3aGljaCA9ICdzdHJxJworICAgIHdhbnQgPSAnY3R4dCcKK2NsYXNzIF9Qcm9wX3NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNpemUgLSB0aGUgc2l6ZSBpbiBwb2ludHMgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciAiIiIKKyAgICB3aGljaCA9ICdwdHN6JworICAgIHdhbnQgPSAnZml4ZCcKK2NsYXNzIF9Qcm9wX3N0eWxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzdHlsZSAtIHRoZSB0ZXh0IHN0eWxlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciAiIiIKKyAgICB3aGljaCA9ICd0eHN0JworICAgIHdhbnQgPSAndHN0eScKK2NsYXNzIF9Qcm9wX3VuaWZvcm1fc3R5bGVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ1bmlmb3JtIHN0eWxlcyAtIHRoZSB0ZXh0IHN0eWxlcyB0aGF0IGFyZSB1bmlmb3JtIHRocm91Z2hvdXQgdGhlIHRleHQgIiIiCisgICAgd2hpY2ggPSAndXN0bCcKKyAgICB3YW50ID0gJ3RzdHknCitjbGFzcyBfUHJvcF93cml0aW5nX2NvZGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIndyaXRpbmcgY29kZSAtIHRoZSBzY3JpcHQgc3lzdGVtIGFuZCBsYW5ndWFnZSAiIiIKKyAgICB3aGljaCA9ICdwc2N0JworICAgIHdhbnQgPSAnaW50bCcKKyMgICAgICAgIGVsZW1lbnQgJ2NoYSAnIGFzIFsnaW5keCddCisjICAgICAgICBlbGVtZW50ICdjbGluJyBhcyBbJ2luZHgnXQorIyAgICAgICAgZWxlbWVudCAnY3BhcicgYXMgWydpbmR4J10KKyMgICAgICAgIGVsZW1lbnQgJ2N0eHQnIGFzIFsnaW5keCddCisjICAgICAgICBlbGVtZW50ICdjd29yJyBhcyBbJ2luZHgnXQorCitjbGFzcyB3b3JkKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIid29yZCAtIEEgd29yZCAiIiIKKyAgICB3YW50ID0gJ2N3b3InCisKK3dvcmRzID0gd29yZAorCitjbGFzcyB0ZXh0X3N0eWxlX2luZm8oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJ0ZXh0IHN0eWxlIGluZm8gLSBPbiBhbmQgT2ZmIHN0eWxlcyBvZiB0ZXh0IHJ1biAiIiIKKyAgICB3YW50ID0gJ3RzdHknCitjbGFzcyBfUHJvcF9vZmZfc3R5bGVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJvZmYgc3R5bGVzIC0gdGhlIHN0eWxlcyB0aGF0IGFyZSBvZmYgZm9yIHRoZSB0ZXh0ICIiIgorICAgIHdoaWNoID0gJ29mc3QnCisgICAgd2FudCA9ICdzdHlsJworY2xhc3MgX1Byb3Bfb25fc3R5bGVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJvbiBzdHlsZXMgLSB0aGUgc3R5bGVzIHRoYXQgYXJlIG9uIGZvciB0aGUgdGV4dCAiIiIKKyAgICB3aGljaCA9ICdvbnN0JworICAgIHdhbnQgPSAnc3R5bCcKKwordGV4dF9zdHlsZV9pbmZvcyA9IHRleHRfc3R5bGVfaW5mbwordGV4dF9mbG93Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ3RleHQnXQordGV4dF9mbG93Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19pbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX2luaGVyaXRhbmNlXzNlXywKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorfQordGV4dF9mbG93Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitjaGFyYWN0ZXIuX3N1cGVyY2xhc3NuYW1lcyA9IFsndGV4dCddCitjaGFyYWN0ZXIuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX2luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfaW5oZXJpdGFuY2VfM2VfLAorfQorY2hhcmFjdGVyLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitsaW5lLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ3RleHQnXQorbGluZS5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfaW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19pbmhlcml0YW5jZV8zZV8sCisgICAgJ2p1c3RpZmljYXRpb24nIDogX1Byb3BfanVzdGlmaWNhdGlvbiwKK30KK2xpbmUuX3ByaXZlbGVtZGljdCA9IHsKK30KK3BhcmFncmFwaC5fc3VwZXJjbGFzc25hbWVzID0gWyd0ZXh0J10KK3BhcmFncmFwaC5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfaW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19pbmhlcml0YW5jZV8zZV8sCit9CitwYXJhZ3JhcGguX3ByaXZlbGVtZGljdCA9IHsKK30KK3RleHQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit0ZXh0Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2NvbG9yJyA6IF9Qcm9wX2NvbG9yLAorICAgICdmb250JyA6IF9Qcm9wX2ZvbnQsCisgICAgJ3F1b3RlZF9mb3JtJyA6IF9Qcm9wX3F1b3RlZF9mb3JtLAorICAgICdzaXplJyA6IF9Qcm9wX3NpemUsCisgICAgJ3N0eWxlJyA6IF9Qcm9wX3N0eWxlLAorICAgICd1bmlmb3JtX3N0eWxlcycgOiBfUHJvcF91bmlmb3JtX3N0eWxlcywKKyAgICAnd3JpdGluZ19jb2RlJyA6IF9Qcm9wX3dyaXRpbmdfY29kZSwKK30KK3RleHQuX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnY2hhcmFjdGVyJyA6IGNoYXJhY3RlciwKKyAgICAnbGluZScgOiBsaW5lLAorICAgICdwYXJhZ3JhcGgnIDogcGFyYWdyYXBoLAorICAgICd0ZXh0JyA6IHRleHQsCisgICAgJ3dvcmQnIDogd29yZCwKK30KK3dvcmQuX3N1cGVyY2xhc3NuYW1lcyA9IFsndGV4dCddCit3b3JkLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19pbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX2luaGVyaXRhbmNlXzNlXywKK30KK3dvcmQuX3ByaXZlbGVtZGljdCA9IHsKK30KK3RleHRfc3R5bGVfaW5mby5fc3VwZXJjbGFzc25hbWVzID0gW10KK3RleHRfc3R5bGVfaW5mby5fcHJpdnByb3BkaWN0ID0geworICAgICdvZmZfc3R5bGVzJyA6IF9Qcm9wX29mZl9zdHlsZXMsCisgICAgJ29uX3N0eWxlcycgOiBfUHJvcF9vbl9zdHlsZXMsCit9Cit0ZXh0X3N0eWxlX2luZm8uX3ByaXZlbGVtZGljdCA9IHsKK30KK19FbnVtX2p1c3QgPSB7CisgICAgJ2xlZnQnIDogJ2xlZnQnLCAgICAjIEFsaWduIHdpdGggbGVmdCBtYXJnaW4KKyAgICAncmlnaHQnIDogJ3JnaHQnLCAgICMgQWxpZ24gd2l0aCByaWdodCBtYXJnaW4KKyAgICAnY2VudGVyJyA6ICdjZW50JywgICMgQWxpZ24gd2l0aCBjZW50ZXIKKyAgICAnZnVsbCcgOiAnZnVsbCcsICAgICMgQWxpZ24gd2l0aCBib3RoIGxlZnQgYW5kIHJpZ2h0IG1hcmdpbnMKK30KKworX0VudW1fc3R5bCA9IHsKKyAgICAncGxhaW4nIDogJ3BsYW4nLCAgICMgUGxhaW4KKyAgICAnYm9sZCcgOiAnYm9sZCcsICAgICMgQm9sZAorICAgICdpdGFsaWMnIDogJ2l0YWwnLCAgIyBJdGFsaWMKKyAgICAnb3V0bGluZScgOiAnb3V0bCcsICMgT3V0bGluZQorICAgICdzaGFkb3cnIDogJ3NoYWQnLCAgIyBTaGFkb3cKKyAgICAndW5kZXJsaW5lJyA6ICd1bmRsJywgICAgICAgIyBVbmRlcmxpbmUKKyAgICAnc3VwZXJzY3JpcHQnIDogJ3Nwc2MnLCAgICAgIyBTdXBlcnNjcmlwdAorICAgICdzdWJzY3JpcHQnIDogJ3Nic2MnLCAgICAgICAjIFN1YnNjcmlwdAorICAgICdzdHJpa2V0aHJvdWdoJyA6ICdzdHJrJywgICAjIFN0cmlrZXRocm91Z2gKKyAgICAnc21hbGxfY2FwcycgOiAnc21jcCcsICAgICAgIyBTbWFsbCBjYXBzCisgICAgJ2FsbF9jYXBzJyA6ICdhbGNwJywgICAgICAgICMgQWxsIGNhcGl0YWwgbGV0dGVycworICAgICdhbGxfbG93ZXJjYXNlJyA6ICdsb3djJywgICAjIExvd2VyY2FzZQorICAgICdjb25kZW5zZWQnIDogJ2NvbmQnLCAgICAgICAjIENvbmRlbnNlZAorICAgICdleHBhbmRlZCcgOiAncGV4cCcsICAgICAgICAjIEV4cGFuZGVkCisgICAgJ2hpZGRlbicgOiAnaGlkbicsICAjIEhpZGRlbgorfQorCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdjZmxvJyA6IHRleHRfZmxvdywKKyAgICAnY2hhICcgOiBjaGFyYWN0ZXIsCisgICAgJ2NsaW4nIDogbGluZSwKKyAgICAnY3BhcicgOiBwYXJhZ3JhcGgsCisgICAgJ2N0eHQnIDogdGV4dCwKKyAgICAnY3dvcicgOiB3b3JkLAorICAgICd0c3R5JyA6IHRleHRfc3R5bGVfaW5mbywKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2NAI14nIDogX1Byb3BfXzNjX2luaGVyaXRhbmNlXzNlXywKKyAgICAnY29scicgOiBfUHJvcF9jb2xvciwKKyAgICAnZm9udCcgOiBfUHJvcF9mb250LAorICAgICdvZnN0JyA6IF9Qcm9wX29mZl9zdHlsZXMsCisgICAgJ29uc3QnIDogX1Byb3Bfb25fc3R5bGVzLAorICAgICdwanN0JyA6IF9Qcm9wX2p1c3RpZmljYXRpb24sCisgICAgJ3BuYW0nIDogX1Byb3BfbmFtZSwKKyAgICAncHNjdCcgOiBfUHJvcF93cml0aW5nX2NvZGUsCisgICAgJ3B0c3onIDogX1Byb3Bfc2l6ZSwKKyAgICAnc3RycScgOiBfUHJvcF9xdW90ZWRfZm9ybSwKKyAgICAndHhzdCcgOiBfUHJvcF9zdHlsZSwKKyAgICAndXN0bCcgOiBfUHJvcF91bmlmb3JtX3N0eWxlcywKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworICAgICdqdXN0JyA6IF9FbnVtX2p1c3QsCisgICAgJ3N0eWwnIDogX0VudW1fc3R5bCwKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UZXh0X1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UZXh0X1N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjI5ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1RleHRfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UZXh0X1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UZXh0X1N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjI5ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1RleHRfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UeXBlX05hbWVzX1N1aXRlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1R5cGVfTmFtZXNfU3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5ZmExOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UeXBlX05hbWVzX1N1aXRlLnB5CkBAIC0wLDAgKzEsNDM1IEBACisiIiJTdWl0ZSBUeXBlIE5hbWVzIFN1aXRlOiBUZXJtaW5vbG9neSBmb3IgUmVnaXN0cnkgZGF0YSB0eXBlcworTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9Wb2x1bWVzL1NhcC9TeXN0ZW0gRm9sZGVyL0V4dGVuc2lvbnMvQXBwbGVTY3JpcHQKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ3Rwbm0nCisKK2NsYXNzIFR5cGVfTmFtZXNfU3VpdGVfRXZlbnRzOgorCisgICAgcGFzcworCisKK2NsYXNzIFBvc3RTY3JpcHRfcGljdHVyZShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIlBvc3RTY3JpcHQgcGljdHVyZSAtICAiIiIKKyAgICB3YW50ID0gJ0VQUyAnCisKK2NsYXNzIHBvaW50KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIicG9pbnQgLSBwb2ludCBjb29yZGluYXRlcyAiIiIKKyAgICB3YW50ID0gJ1FEcHQnCisKK2NsYXNzIHN0cmluZyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInN0cmluZyAtIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMgIiIiCisgICAgd2FudCA9ICdURVhUJworCitwbGFpbl90ZXh0ID0gc3RyaW5nCisKK3BsYWluX3RleHQgPSBzdHJpbmcKKworY2xhc3MgVElGRl9waWN0dXJlKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiVElGRiBwaWN0dXJlIC0gICIiIgorICAgIHdhbnQgPSAnVElGRicKKworY2xhc3MgYXBwbGljYXRpb25fZGljdGlvbmFyeShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImFwcGxpY2F0aW9uIGRpY3Rpb25hcnkgLSAgIiIiCisgICAgd2FudCA9ICdhZXRlJworCitjbGFzcyBzeXN0ZW1fZGljdGlvbmFyeShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInN5c3RlbSBkaWN0aW9uYXJ5IC0gICIiIgorICAgIHdhbnQgPSAnYWV1dCcKKworY2xhc3MgY29sb3JfdGFibGUoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJjb2xvciB0YWJsZSAtICAiIiIKKyAgICB3YW50ID0gJ2NscnQnCisKK2NsYXNzIG1lbnVfaXRlbShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIm1lbnUgaXRlbSAtICAiIiIKKyAgICB3YW50ID0gJ2NtZW4nCisKK2NsYXNzIG1lbnUoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJtZW51IC0gICIiIgorICAgIHdhbnQgPSAnY21udScKKworY2xhc3MgZG91YmxlX2ludGVnZXIoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkb3VibGUgaW50ZWdlciAtICAiIiIKKyAgICB3YW50ID0gJ2NvbXAnCisKK2NsYXNzIHR5cGVfZWxlbWVudF9pbmZvKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidHlwZSBlbGVtZW50IGluZm8gLSAgIiIiCisgICAgd2FudCA9ICdlbGluJworCitjbGFzcyB0eXBlX2V2ZW50X2luZm8oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJ0eXBlIGV2ZW50IGluZm8gLSBpbmZvcm1hdGlvbiBhYm91dCBhbiBldmVudCAiIiIKKyAgICB3YW50ID0gJ2V2aW4nCisKK2NsYXNzIGV4dGVuZGVkX3JlYWwoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJleHRlbmRlZCByZWFsIC0gICIiIgorICAgIHdhbnQgPSAnZXh0ZScKKworY2xhc3MgZml4ZWQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJmaXhlZCAtIGEgcmVhbCBudW1iZXIgIiIiCisgICAgd2FudCA9ICdmaXhkJworCitjbGFzcyBmaXhlZF9wb2ludChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImZpeGVkIHBvaW50IC0gICIiIgorICAgIHdhbnQgPSAnZnBudCcKKworY2xhc3MgZml4ZWRfcmVjdGFuZ2xlKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiZml4ZWQgcmVjdGFuZ2xlIC0gICIiIgorICAgIHdhbnQgPSAnZnJjdCcKKworY2xhc3MgdHlwZV9jbGFzc19pbmZvKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidHlwZSBjbGFzcyBpbmZvIC0gaW5mb3JtYXRpb24gYWJvdXQgcHJvcGVydGllcyBhbmQgZWxlbWVudHMgb2YgYSBjbGFzcyAiIiIKKyAgICB3YW50ID0gJ2djbGknCisKK2NsYXNzIGxvY2F0aW9uX3JlZmVyZW5jZShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImxvY2F0aW9uIHJlZmVyZW5jZSAtICAiIiIKKyAgICB3YW50ID0gJ2luc2wnCisKK2NsYXNzIGxvbmdfZml4ZWRfcG9pbnQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJsb25nIGZpeGVkIHBvaW50IC0gICIiIgorICAgIHdhbnQgPSAnbGZwdCcKKworY2xhc3MgbG9uZ19maXhlZF9yZWN0YW5nbGUoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJsb25nIGZpeGVkIHJlY3RhbmdsZSAtICAiIiIKKyAgICB3YW50ID0gJ2xmcmMnCisKK2NsYXNzIGxvbmdfZml4ZWQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJsb25nIGZpeGVkIC0gICIiIgorICAgIHdhbnQgPSAnbGZ4ZCcKKworY2xhc3MgbG9uZ19wb2ludChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImxvbmcgcG9pbnQgLSAgIiIiCisgICAgd2FudCA9ICdscG50JworCitjbGFzcyBsb25nX3JlY3RhbmdsZShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImxvbmcgcmVjdGFuZ2xlIC0gICIiIgorICAgIHdhbnQgPSAnbHJjdCcKKworY2xhc3MgbWFjaGluZV9sb2NhdGlvbihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIm1hY2hpbmUgbG9jYXRpb24gLSAgIiIiCisgICAgd2FudCA9ICdtTG9jJworCitjbGFzcyB1bnNpZ25lZF9pbnRlZ2VyKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidW5zaWduZWQgaW50ZWdlciAtICAiIiIKKyAgICB3YW50ID0gJ21hZ24nCisKK2NsYXNzIG51bGwoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJudWxsIC0gICIiIgorICAgIHdhbnQgPSAnbnVsbCcKKworY2xhc3MgdHlwZV9wcm9wZXJ0eV9pbmZvKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidHlwZSBwcm9wZXJ0eSBpbmZvIC0gICIiIgorICAgIHdhbnQgPSAncGluZicKKworY2xhc3MgdHlwZV9wYXJhbWV0ZXJfaW5mbyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInR5cGUgcGFyYW1ldGVyIGluZm8gLSAgIiIiCisgICAgd2FudCA9ICdwbWluJworCitjbGFzcyBib3VuZGluZ19yZWN0YW5nbGUoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJib3VuZGluZyByZWN0YW5nbGUgLSBib3VuZGluZyByZWN0YW5nbGUgIiIiCisgICAgd2FudCA9ICdxZHJ0JworCitjbGFzcyBzbWFsbF9pbnRlZ2VyKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIic21hbGwgaW50ZWdlciAtICAiIiIKKyAgICB3YW50ID0gJ3Nob3InCisKK2NsYXNzIHNtYWxsX3JlYWwoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJzbWFsbCByZWFsIC0gICIiIgorICAgIHdhbnQgPSAnc2luZycKKworY2xhc3Mgc2NyYXBfc3R5bGVzKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIic2NyYXAgc3R5bGVzIC0gICIiIgorICAgIHdhbnQgPSAnc3R5bCcKKworY2xhc3MgdHlwZV9zdWl0ZV9pbmZvKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidHlwZSBzdWl0ZSBpbmZvIC0gICIiIgorICAgIHdhbnQgPSAnc3VpbicKKworY2xhc3MgdGFyZ2V0X2lkKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidGFyZ2V0IGlkIC0gICIiIgorICAgIHdhbnQgPSAndGFyZycKKworY2xhc3MgZGFzaF9zdHlsZShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImRhc2ggc3R5bGUgLSAgIiIiCisgICAgd2FudCA9ICd0ZGFzJworCitjbGFzcyBwaXhlbF9tYXBfcmVjb3JkKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIicGl4ZWwgbWFwIHJlY29yZCAtICAiIiIKKyAgICB3YW50ID0gJ3RwbW0nCisKK2NsYXNzIFJHQjE2X2NvbG9yKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiUkdCMTYgY29sb3IgLSAgIiIiCisgICAgd2FudCA9ICd0cjE2JworCitjbGFzcyBSR0I5Nl9jb2xvcihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIlJHQjk2IGNvbG9yIC0gICIiIgorICAgIHdhbnQgPSAndHI5NicKKworY2xhc3Mgcm90YXRpb24oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJyb3RhdGlvbiAtICAiIiIKKyAgICB3YW50ID0gJ3Ryb3QnCisKK2NsYXNzIHZlcnNpb24oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJ2ZXJzaW9uIC0gICIiIgorICAgIHdhbnQgPSAndmVycycKK1Bvc3RTY3JpcHRfcGljdHVyZS5fc3VwZXJjbGFzc25hbWVzID0gW10KK1Bvc3RTY3JpcHRfcGljdHVyZS5fcHJpdnByb3BkaWN0ID0geworfQorUG9zdFNjcmlwdF9waWN0dXJlLl9wcml2ZWxlbWRpY3QgPSB7Cit9Citwb2ludC5fc3VwZXJjbGFzc25hbWVzID0gW10KK3BvaW50Ll9wcml2cHJvcGRpY3QgPSB7Cit9Citwb2ludC5fcHJpdmVsZW1kaWN0ID0geworfQorc3RyaW5nLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorc3RyaW5nLl9wcml2cHJvcGRpY3QgPSB7Cit9CitzdHJpbmcuX3ByaXZlbGVtZGljdCA9IHsKK30KK1RJRkZfcGljdHVyZS5fc3VwZXJjbGFzc25hbWVzID0gW10KK1RJRkZfcGljdHVyZS5fcHJpdnByb3BkaWN0ID0geworfQorVElGRl9waWN0dXJlLl9wcml2ZWxlbWRpY3QgPSB7Cit9CithcHBsaWNhdGlvbl9kaWN0aW9uYXJ5Ll9zdXBlcmNsYXNzbmFtZXMgPSBbXQorYXBwbGljYXRpb25fZGljdGlvbmFyeS5fcHJpdnByb3BkaWN0ID0geworfQorYXBwbGljYXRpb25fZGljdGlvbmFyeS5fcHJpdmVsZW1kaWN0ID0geworfQorc3lzdGVtX2RpY3Rpb25hcnkuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitzeXN0ZW1fZGljdGlvbmFyeS5fcHJpdnByb3BkaWN0ID0geworfQorc3lzdGVtX2RpY3Rpb25hcnkuX3ByaXZlbGVtZGljdCA9IHsKK30KK2NvbG9yX3RhYmxlLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorY29sb3JfdGFibGUuX3ByaXZwcm9wZGljdCA9IHsKK30KK2NvbG9yX3RhYmxlLl9wcml2ZWxlbWRpY3QgPSB7Cit9CittZW51X2l0ZW0uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCittZW51X2l0ZW0uX3ByaXZwcm9wZGljdCA9IHsKK30KK21lbnVfaXRlbS5fcHJpdmVsZW1kaWN0ID0geworfQorbWVudS5fc3VwZXJjbGFzc25hbWVzID0gW10KK21lbnUuX3ByaXZwcm9wZGljdCA9IHsKK30KK21lbnUuX3ByaXZlbGVtZGljdCA9IHsKK30KK2RvdWJsZV9pbnRlZ2VyLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorZG91YmxlX2ludGVnZXIuX3ByaXZwcm9wZGljdCA9IHsKK30KK2RvdWJsZV9pbnRlZ2VyLl9wcml2ZWxlbWRpY3QgPSB7Cit9Cit0eXBlX2VsZW1lbnRfaW5mby5fc3VwZXJjbGFzc25hbWVzID0gW10KK3R5cGVfZWxlbWVudF9pbmZvLl9wcml2cHJvcGRpY3QgPSB7Cit9Cit0eXBlX2VsZW1lbnRfaW5mby5fcHJpdmVsZW1kaWN0ID0geworfQordHlwZV9ldmVudF9pbmZvLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQordHlwZV9ldmVudF9pbmZvLl9wcml2cHJvcGRpY3QgPSB7Cit9Cit0eXBlX2V2ZW50X2luZm8uX3ByaXZlbGVtZGljdCA9IHsKK30KK2V4dGVuZGVkX3JlYWwuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitleHRlbmRlZF9yZWFsLl9wcml2cHJvcGRpY3QgPSB7Cit9CitleHRlbmRlZF9yZWFsLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitmaXhlZC5fc3VwZXJjbGFzc25hbWVzID0gW10KK2ZpeGVkLl9wcml2cHJvcGRpY3QgPSB7Cit9CitmaXhlZC5fcHJpdmVsZW1kaWN0ID0geworfQorZml4ZWRfcG9pbnQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitmaXhlZF9wb2ludC5fcHJpdnByb3BkaWN0ID0geworfQorZml4ZWRfcG9pbnQuX3ByaXZlbGVtZGljdCA9IHsKK30KK2ZpeGVkX3JlY3RhbmdsZS5fc3VwZXJjbGFzc25hbWVzID0gW10KK2ZpeGVkX3JlY3RhbmdsZS5fcHJpdnByb3BkaWN0ID0geworfQorZml4ZWRfcmVjdGFuZ2xlLl9wcml2ZWxlbWRpY3QgPSB7Cit9Cit0eXBlX2NsYXNzX2luZm8uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit0eXBlX2NsYXNzX2luZm8uX3ByaXZwcm9wZGljdCA9IHsKK30KK3R5cGVfY2xhc3NfaW5mby5fcHJpdmVsZW1kaWN0ID0geworfQorbG9jYXRpb25fcmVmZXJlbmNlLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorbG9jYXRpb25fcmVmZXJlbmNlLl9wcml2cHJvcGRpY3QgPSB7Cit9Citsb2NhdGlvbl9yZWZlcmVuY2UuX3ByaXZlbGVtZGljdCA9IHsKK30KK2xvbmdfZml4ZWRfcG9pbnQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitsb25nX2ZpeGVkX3BvaW50Ll9wcml2cHJvcGRpY3QgPSB7Cit9Citsb25nX2ZpeGVkX3BvaW50Ll9wcml2ZWxlbWRpY3QgPSB7Cit9Citsb25nX2ZpeGVkX3JlY3RhbmdsZS5fc3VwZXJjbGFzc25hbWVzID0gW10KK2xvbmdfZml4ZWRfcmVjdGFuZ2xlLl9wcml2cHJvcGRpY3QgPSB7Cit9Citsb25nX2ZpeGVkX3JlY3RhbmdsZS5fcHJpdmVsZW1kaWN0ID0geworfQorbG9uZ19maXhlZC5fc3VwZXJjbGFzc25hbWVzID0gW10KK2xvbmdfZml4ZWQuX3ByaXZwcm9wZGljdCA9IHsKK30KK2xvbmdfZml4ZWQuX3ByaXZlbGVtZGljdCA9IHsKK30KK2xvbmdfcG9pbnQuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitsb25nX3BvaW50Ll9wcml2cHJvcGRpY3QgPSB7Cit9Citsb25nX3BvaW50Ll9wcml2ZWxlbWRpY3QgPSB7Cit9Citsb25nX3JlY3RhbmdsZS5fc3VwZXJjbGFzc25hbWVzID0gW10KK2xvbmdfcmVjdGFuZ2xlLl9wcml2cHJvcGRpY3QgPSB7Cit9Citsb25nX3JlY3RhbmdsZS5fcHJpdmVsZW1kaWN0ID0geworfQorbWFjaGluZV9sb2NhdGlvbi5fc3VwZXJjbGFzc25hbWVzID0gW10KK21hY2hpbmVfbG9jYXRpb24uX3ByaXZwcm9wZGljdCA9IHsKK30KK21hY2hpbmVfbG9jYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKK30KK3Vuc2lnbmVkX2ludGVnZXIuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit1bnNpZ25lZF9pbnRlZ2VyLl9wcml2cHJvcGRpY3QgPSB7Cit9Cit1bnNpZ25lZF9pbnRlZ2VyLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitudWxsLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorbnVsbC5fcHJpdnByb3BkaWN0ID0geworfQorbnVsbC5fcHJpdmVsZW1kaWN0ID0geworfQordHlwZV9wcm9wZXJ0eV9pbmZvLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQordHlwZV9wcm9wZXJ0eV9pbmZvLl9wcml2cHJvcGRpY3QgPSB7Cit9Cit0eXBlX3Byb3BlcnR5X2luZm8uX3ByaXZlbGVtZGljdCA9IHsKK30KK3R5cGVfcGFyYW1ldGVyX2luZm8uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit0eXBlX3BhcmFtZXRlcl9pbmZvLl9wcml2cHJvcGRpY3QgPSB7Cit9Cit0eXBlX3BhcmFtZXRlcl9pbmZvLl9wcml2ZWxlbWRpY3QgPSB7Cit9Citib3VuZGluZ19yZWN0YW5nbGUuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitib3VuZGluZ19yZWN0YW5nbGUuX3ByaXZwcm9wZGljdCA9IHsKK30KK2JvdW5kaW5nX3JlY3RhbmdsZS5fcHJpdmVsZW1kaWN0ID0geworfQorc21hbGxfaW50ZWdlci5fc3VwZXJjbGFzc25hbWVzID0gW10KK3NtYWxsX2ludGVnZXIuX3ByaXZwcm9wZGljdCA9IHsKK30KK3NtYWxsX2ludGVnZXIuX3ByaXZlbGVtZGljdCA9IHsKK30KK3NtYWxsX3JlYWwuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitzbWFsbF9yZWFsLl9wcml2cHJvcGRpY3QgPSB7Cit9CitzbWFsbF9yZWFsLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitzY3JhcF9zdHlsZXMuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitzY3JhcF9zdHlsZXMuX3ByaXZwcm9wZGljdCA9IHsKK30KK3NjcmFwX3N0eWxlcy5fcHJpdmVsZW1kaWN0ID0geworfQordHlwZV9zdWl0ZV9pbmZvLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQordHlwZV9zdWl0ZV9pbmZvLl9wcml2cHJvcGRpY3QgPSB7Cit9Cit0eXBlX3N1aXRlX2luZm8uX3ByaXZlbGVtZGljdCA9IHsKK30KK3RhcmdldF9pZC5fc3VwZXJjbGFzc25hbWVzID0gW10KK3RhcmdldF9pZC5fcHJpdnByb3BkaWN0ID0geworfQordGFyZ2V0X2lkLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitkYXNoX3N0eWxlLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorZGFzaF9zdHlsZS5fcHJpdnByb3BkaWN0ID0geworfQorZGFzaF9zdHlsZS5fcHJpdmVsZW1kaWN0ID0geworfQorcGl4ZWxfbWFwX3JlY29yZC5fc3VwZXJjbGFzc25hbWVzID0gW10KK3BpeGVsX21hcF9yZWNvcmQuX3ByaXZwcm9wZGljdCA9IHsKK30KK3BpeGVsX21hcF9yZWNvcmQuX3ByaXZlbGVtZGljdCA9IHsKK30KK1JHQjE2X2NvbG9yLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQorUkdCMTZfY29sb3IuX3ByaXZwcm9wZGljdCA9IHsKK30KK1JHQjE2X2NvbG9yLl9wcml2ZWxlbWRpY3QgPSB7Cit9CitSR0I5Nl9jb2xvci5fc3VwZXJjbGFzc25hbWVzID0gW10KK1JHQjk2X2NvbG9yLl9wcml2cHJvcGRpY3QgPSB7Cit9CitSR0I5Nl9jb2xvci5fcHJpdmVsZW1kaWN0ID0geworfQorcm90YXRpb24uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCityb3RhdGlvbi5fcHJpdnByb3BkaWN0ID0geworfQorcm90YXRpb24uX3ByaXZlbGVtZGljdCA9IHsKK30KK3ZlcnNpb24uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit2ZXJzaW9uLl9wcml2cHJvcGRpY3QgPSB7Cit9Cit2ZXJzaW9uLl9wcml2ZWxlbWRpY3QgPSB7Cit9CisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdFUFMgJyA6IFBvc3RTY3JpcHRfcGljdHVyZSwKKyAgICAnUURwdCcgOiBwb2ludCwKKyAgICAnVEVYVCcgOiBzdHJpbmcsCisgICAgJ1RJRkYnIDogVElGRl9waWN0dXJlLAorICAgICdhZXRlJyA6IGFwcGxpY2F0aW9uX2RpY3Rpb25hcnksCisgICAgJ2FldXQnIDogc3lzdGVtX2RpY3Rpb25hcnksCisgICAgJ2NscnQnIDogY29sb3JfdGFibGUsCisgICAgJ2NtZW4nIDogbWVudV9pdGVtLAorICAgICdjbW51JyA6IG1lbnUsCisgICAgJ2NvbXAnIDogZG91YmxlX2ludGVnZXIsCisgICAgJ2VsaW4nIDogdHlwZV9lbGVtZW50X2luZm8sCisgICAgJ2V2aW4nIDogdHlwZV9ldmVudF9pbmZvLAorICAgICdleHRlJyA6IGV4dGVuZGVkX3JlYWwsCisgICAgJ2ZpeGQnIDogZml4ZWQsCisgICAgJ2ZwbnQnIDogZml4ZWRfcG9pbnQsCisgICAgJ2ZyY3QnIDogZml4ZWRfcmVjdGFuZ2xlLAorICAgICdnY2xpJyA6IHR5cGVfY2xhc3NfaW5mbywKKyAgICAnaW5zbCcgOiBsb2NhdGlvbl9yZWZlcmVuY2UsCisgICAgJ2xmcHQnIDogbG9uZ19maXhlZF9wb2ludCwKKyAgICAnbGZyYycgOiBsb25nX2ZpeGVkX3JlY3RhbmdsZSwKKyAgICAnbGZ4ZCcgOiBsb25nX2ZpeGVkLAorICAgICdscG50JyA6IGxvbmdfcG9pbnQsCisgICAgJ2xyY3QnIDogbG9uZ19yZWN0YW5nbGUsCisgICAgJ21Mb2MnIDogbWFjaGluZV9sb2NhdGlvbiwKKyAgICAnbWFnbicgOiB1bnNpZ25lZF9pbnRlZ2VyLAorICAgICdudWxsJyA6IG51bGwsCisgICAgJ3BpbmYnIDogdHlwZV9wcm9wZXJ0eV9pbmZvLAorICAgICdwbWluJyA6IHR5cGVfcGFyYW1ldGVyX2luZm8sCisgICAgJ3FkcnQnIDogYm91bmRpbmdfcmVjdGFuZ2xlLAorICAgICdzaG9yJyA6IHNtYWxsX2ludGVnZXIsCisgICAgJ3NpbmcnIDogc21hbGxfcmVhbCwKKyAgICAnc3R5bCcgOiBzY3JhcF9zdHlsZXMsCisgICAgJ3N1aW4nIDogdHlwZV9zdWl0ZV9pbmZvLAorICAgICd0YXJnJyA6IHRhcmdldF9pZCwKKyAgICAndGRhcycgOiBkYXNoX3N0eWxlLAorICAgICd0cG1tJyA6IHBpeGVsX21hcF9yZWNvcmQsCisgICAgJ3RyMTYnIDogUkdCMTZfY29sb3IsCisgICAgJ3RyOTYnIDogUkdCOTZfY29sb3IsCisgICAgJ3Ryb3QnIDogcm90YXRpb24sCisgICAgJ3ZlcnMnIDogdmVyc2lvbiwKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UeXBlX05hbWVzX1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UeXBlX05hbWVzX1N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDE0NmZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1R5cGVfTmFtZXNfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UeXBlX05hbWVzX1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9UeXBlX05hbWVzX1N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDE0NmZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL1R5cGVfTmFtZXNfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTYwNTVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNDc1IEBACisiIiIKK1BhY2thZ2UgZ2VuZXJhdGVkIGZyb20gL1ZvbHVtZXMvU2FwL1N5c3RlbSBGb2xkZXIvRXh0ZW5zaW9ucy9BcHBsZVNjcmlwdAorUmVzb3VyY2UgYWV1dCByZXNpZCAwIFN0YW5kYXJkIEV2ZW50IFN1aXRlcyBmb3IgRW5nbGlzaAorIiIiCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgU3RkU3VpdGVzIHBhY2thZ2UgaXMgcmVtb3ZlZC4iLCBzdGFja2xldmVsPTIpCisKK2ltcG9ydCBhZXRvb2xzCitFcnJvciA9IGFldG9vbHMuRXJyb3IKK2ltcG9ydCBUZXh0X1N1aXRlCitpbXBvcnQgQXBwbGVTY3JpcHRfU3VpdGUKK2ltcG9ydCBTdGFuZGFyZF9TdWl0ZQoraW1wb3J0IE1hY2ludG9zaF9Db25uZWN0aXZpdHlfQ2xhcworaW1wb3J0IFF1aWNrRHJhd19HcmFwaGljc19TdWl0ZQoraW1wb3J0IFF1aWNrRHJhd19HcmFwaGljc19TdXBwbGVtZQoraW1wb3J0IFJlcXVpcmVkX1N1aXRlCitpbXBvcnQgVGFibGVfU3VpdGUKK2ltcG9ydCBUeXBlX05hbWVzX1N1aXRlCisKKworX2NvZGVfdG9fbW9kdWxlID0geworICAgICdURVhUJyA6IFRleHRfU3VpdGUsCisgICAgJ2FzY3InIDogQXBwbGVTY3JpcHRfU3VpdGUsCisgICAgJ2NvcmUnIDogU3RhbmRhcmRfU3VpdGUsCisgICAgJ21hY2MnIDogTWFjaW50b3NoX0Nvbm5lY3Rpdml0eV9DbGFzLAorICAgICdxZHJ3JyA6IFF1aWNrRHJhd19HcmFwaGljc19TdWl0ZSwKKyAgICAncWRzcCcgOiBRdWlja0RyYXdfR3JhcGhpY3NfU3VwcGxlbWUsCisgICAgJ3JlcWQnIDogUmVxdWlyZWRfU3VpdGUsCisgICAgJ3RibHMnIDogVGFibGVfU3VpdGUsCisgICAgJ3Rwbm0nIDogVHlwZV9OYW1lc19TdWl0ZSwKK30KKworCisKK19jb2RlX3RvX2Z1bGxuYW1lID0geworICAgICdURVhUJyA6ICgnU3RkU3VpdGVzLlRleHRfU3VpdGUnLCAnVGV4dF9TdWl0ZScpLAorICAgICdhc2NyJyA6ICgnU3RkU3VpdGVzLkFwcGxlU2NyaXB0X1N1aXRlJywgJ0FwcGxlU2NyaXB0X1N1aXRlJyksCisgICAgJ2NvcmUnIDogKCdTdGRTdWl0ZXMuU3RhbmRhcmRfU3VpdGUnLCAnU3RhbmRhcmRfU3VpdGUnKSwKKyAgICAnbWFjYycgOiAoJ1N0ZFN1aXRlcy5NYWNpbnRvc2hfQ29ubmVjdGl2aXR5X0NsYXMnLCAnTWFjaW50b3NoX0Nvbm5lY3Rpdml0eV9DbGFzJyksCisgICAgJ3FkcncnIDogKCdTdGRTdWl0ZXMuUXVpY2tEcmF3X0dyYXBoaWNzX1N1aXRlJywgJ1F1aWNrRHJhd19HcmFwaGljc19TdWl0ZScpLAorICAgICdxZHNwJyA6ICgnU3RkU3VpdGVzLlF1aWNrRHJhd19HcmFwaGljc19TdXBwbGVtZScsICdRdWlja0RyYXdfR3JhcGhpY3NfU3VwcGxlbWUnKSwKKyAgICAncmVxZCcgOiAoJ1N0ZFN1aXRlcy5SZXF1aXJlZF9TdWl0ZScsICdSZXF1aXJlZF9TdWl0ZScpLAorICAgICd0YmxzJyA6ICgnU3RkU3VpdGVzLlRhYmxlX1N1aXRlJywgJ1RhYmxlX1N1aXRlJyksCisgICAgJ3Rwbm0nIDogKCdTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZScsICdUeXBlX05hbWVzX1N1aXRlJyksCit9CisKK2Zyb20gVGV4dF9TdWl0ZSBpbXBvcnQgKgorZnJvbSBBcHBsZVNjcmlwdF9TdWl0ZSBpbXBvcnQgKgorZnJvbSBTdGFuZGFyZF9TdWl0ZSBpbXBvcnQgKgorZnJvbSBNYWNpbnRvc2hfQ29ubmVjdGl2aXR5X0NsYXMgaW1wb3J0ICoKK2Zyb20gUXVpY2tEcmF3X0dyYXBoaWNzX1N1aXRlIGltcG9ydCAqCitmcm9tIFF1aWNrRHJhd19HcmFwaGljc19TdXBwbGVtZSBpbXBvcnQgKgorZnJvbSBSZXF1aXJlZF9TdWl0ZSBpbXBvcnQgKgorZnJvbSBUYWJsZV9TdWl0ZSBpbXBvcnQgKgorZnJvbSBUeXBlX05hbWVzX1N1aXRlIGltcG9ydCAqCisKK2RlZiBnZXRiYXNlY2xhc3Nlcyh2KToKKyAgICBpZiBub3QgZ2V0YXR0cih2LCAnX3Byb3BkaWN0JywgTm9uZSk6CisgICAgICAgIHYuX3Byb3BkaWN0ID0ge30KKyAgICAgICAgdi5fZWxlbWRpY3QgPSB7fQorICAgICAgICBmb3Igc3VwZXJjbGFzc25hbWUgaW4gZ2V0YXR0cih2LCAnX3N1cGVyY2xhc3NuYW1lcycsIFtdKToKKyAgICAgICAgICAgIHN1cGVyY2xhc3MgPSBldmFsKHN1cGVyY2xhc3NuYW1lKQorICAgICAgICAgICAgZ2V0YmFzZWNsYXNzZXMoc3VwZXJjbGFzcykKKyAgICAgICAgICAgIHYuX3Byb3BkaWN0LnVwZGF0ZShnZXRhdHRyKHN1cGVyY2xhc3MsICdfcHJvcGRpY3QnLCB7fSkpCisgICAgICAgICAgICB2Ll9lbGVtZGljdC51cGRhdGUoZ2V0YXR0cihzdXBlcmNsYXNzLCAnX2VsZW1kaWN0Jywge30pKQorICAgICAgICB2Ll9wcm9wZGljdC51cGRhdGUoZ2V0YXR0cih2LCAnX3ByaXZwcm9wZGljdCcsIHt9KSkKKyAgICAgICAgdi5fZWxlbWRpY3QudXBkYXRlKGdldGF0dHIodiwgJ19wcml2ZWxlbWRpY3QnLCB7fSkpCisKK2ltcG9ydCBTdGRTdWl0ZXMKKworIworIyBTZXQgcHJvcGVydHkgYW5kIGVsZW1lbnQgZGljdGlvbmFyaWVzIG5vdyB0aGF0IGFsbCBjbGFzc2VzIGhhdmUgYmVlbiBkZWZpbmVkCisjCitnZXRiYXNlY2xhc3NlcyhncmFwaGljX2dyb3VwKQorZ2V0YmFzZWNsYXNzZXMob3ZhbCkKK2dldGJhc2VjbGFzc2VzKGdyYXBoaWNfdGV4dCkKK2dldGJhc2VjbGFzc2VzKGdyYXBoaWNfc2hhcGUpCitnZXRiYXNlY2xhc3NlcyhkcmF3aW5nX2FyZWEpCitnZXRiYXNlY2xhc3NlcyhncmFwaGljX2xpbmUpCitnZXRiYXNlY2xhc3Nlcyhwb2x5Z29uKQorZ2V0YmFzZWNsYXNzZXMocGl4ZWwpCitnZXRiYXNlY2xhc3Nlcyhyb3VuZGVkX3JlY3RhbmdsZSkKK2dldGJhc2VjbGFzc2VzKGdyYXBoaWNfb2JqZWN0KQorZ2V0YmFzZWNsYXNzZXMoYXJjKQorZ2V0YmFzZWNsYXNzZXMocGl4ZWxfbWFwKQorZ2V0YmFzZWNsYXNzZXMocmVjdGFuZ2xlKQorZ2V0YmFzZWNsYXNzZXMoc2VsZWN0aW9uXzJkX29iamVjdCkKK2dldGJhc2VjbGFzc2VzKGFwcGxpY2F0aW9uKQorZ2V0YmFzZWNsYXNzZXMoZG9jdW1lbnQpCitnZXRiYXNlY2xhc3Nlcyh3aW5kb3cpCitnZXRiYXNlY2xhc3NlcyhmaWxlKQorZ2V0YmFzZWNsYXNzZXMoYWxpYXMpCitnZXRiYXNlY2xhc3NlcyhpbnNlcnRpb25fcG9pbnQpCitnZXRiYXNlY2xhc3NlcyhjaGFyYWN0ZXIpCitnZXRiYXNlY2xhc3NlcyhwYXJhZ3JhcGgpCitnZXRiYXNlY2xhc3Nlcyh3b3JkKQorZ2V0YmFzZWNsYXNzZXModGV4dF9mbG93KQorZ2V0YmFzZWNsYXNzZXModGV4dF9zdHlsZV9pbmZvKQorZ2V0YmFzZWNsYXNzZXMobGluZSkKK2dldGJhc2VjbGFzc2VzKHRleHQpCitnZXRiYXNlY2xhc3NlcyhBcHBsZVRhbGtfYWRkcmVzcykKK2dldGJhc2VjbGFzc2VzKGFkZHJlc3Nfc3BlY2lmaWNhdGlvbikKK2dldGJhc2VjbGFzc2VzKFRva2VuX1JpbmdfYWRkcmVzcykKK2dldGJhc2VjbGFzc2VzKEZpcmVXaXJlX2FkZHJlc3MpCitnZXRiYXNlY2xhc3NlcyhidXNfc2xvdCkKK2dldGJhc2VjbGFzc2VzKFNDU0lfYWRkcmVzcykKK2dldGJhc2VjbGFzc2VzKEFEQl9hZGRyZXNzKQorZ2V0YmFzZWNsYXNzZXMoVVNCX2FkZHJlc3MpCitnZXRiYXNlY2xhc3NlcyhkZXZpY2Vfc3BlY2lmaWNhdGlvbikKK2dldGJhc2VjbGFzc2VzKExvY2FsVGFsa19hZGRyZXNzKQorZ2V0YmFzZWNsYXNzZXMoSVBfYWRkcmVzcykKK2dldGJhc2VjbGFzc2VzKEV0aGVybmV0X2FkZHJlc3MpCitnZXRiYXNlY2xhc3NlcyhncmFwaGljX2dyb3VwKQorZ2V0YmFzZWNsYXNzZXMoZHJhd2luZ19hcmVhKQorZ2V0YmFzZWNsYXNzZXMoY2VsbCkKK2dldGJhc2VjbGFzc2VzKGNvbHVtbikKK2dldGJhc2VjbGFzc2VzKHRhYmxlKQorZ2V0YmFzZWNsYXNzZXMocm93KQorZ2V0YmFzZWNsYXNzZXMoc21hbGxfaW50ZWdlcikKK2dldGJhc2VjbGFzc2VzKHN5c3RlbV9kaWN0aW9uYXJ5KQorZ2V0YmFzZWNsYXNzZXMoY29sb3JfdGFibGUpCitnZXRiYXNlY2xhc3NlcyhmaXhlZF9wb2ludCkKK2dldGJhc2VjbGFzc2VzKHBsYWluX3RleHQpCitnZXRiYXNlY2xhc3Nlcyh0eXBlX2VsZW1lbnRfaW5mbykKK2dldGJhc2VjbGFzc2VzKG1hY2hpbmVfbG9jYXRpb24pCitnZXRiYXNlY2xhc3NlcyhQb3N0U2NyaXB0X3BpY3R1cmUpCitnZXRiYXNlY2xhc3Nlcyh0eXBlX3N1aXRlX2luZm8pCitnZXRiYXNlY2xhc3NlcyhtZW51X2l0ZW0pCitnZXRiYXNlY2xhc3NlcyhwaXhlbF9tYXBfcmVjb3JkKQorZ2V0YmFzZWNsYXNzZXMoc21hbGxfcmVhbCkKK2dldGJhc2VjbGFzc2VzKG51bGwpCitnZXRiYXNlY2xhc3Nlcyhyb3RhdGlvbikKK2dldGJhc2VjbGFzc2VzKGZpeGVkKQorZ2V0YmFzZWNsYXNzZXMobG9uZ19wb2ludCkKK2dldGJhc2VjbGFzc2VzKHRhcmdldF9pZCkKK2dldGJhc2VjbGFzc2VzKHR5cGVfcHJvcGVydHlfaW5mbykKK2dldGJhc2VjbGFzc2VzKHR5cGVfcGFyYW1ldGVyX2luZm8pCitnZXRiYXNlY2xhc3Nlcyhsb25nX2ZpeGVkX3BvaW50KQorZ2V0YmFzZWNsYXNzZXMoYm91bmRpbmdfcmVjdGFuZ2xlKQorZ2V0YmFzZWNsYXNzZXMoVElGRl9waWN0dXJlKQorZ2V0YmFzZWNsYXNzZXMobG9uZ19maXhlZCkKK2dldGJhc2VjbGFzc2VzKGxvY2F0aW9uX3JlZmVyZW5jZSkKK2dldGJhc2VjbGFzc2VzKHZlcnNpb24pCitnZXRiYXNlY2xhc3NlcyhSR0IxNl9jb2xvcikKK2dldGJhc2VjbGFzc2VzKGRvdWJsZV9pbnRlZ2VyKQorZ2V0YmFzZWNsYXNzZXModHlwZV9ldmVudF9pbmZvKQorZ2V0YmFzZWNsYXNzZXMocG9pbnQpCitnZXRiYXNlY2xhc3NlcyhhcHBsaWNhdGlvbl9kaWN0aW9uYXJ5KQorZ2V0YmFzZWNsYXNzZXModW5zaWduZWRfaW50ZWdlcikKK2dldGJhc2VjbGFzc2VzKG1lbnUpCitnZXRiYXNlY2xhc3NlcyhmaXhlZF9yZWN0YW5nbGUpCitnZXRiYXNlY2xhc3Nlcyhsb25nX2ZpeGVkX3JlY3RhbmdsZSkKK2dldGJhc2VjbGFzc2VzKHR5cGVfY2xhc3NfaW5mbykKK2dldGJhc2VjbGFzc2VzKFJHQjk2X2NvbG9yKQorZ2V0YmFzZWNsYXNzZXMoZGFzaF9zdHlsZSkKK2dldGJhc2VjbGFzc2VzKHNjcmFwX3N0eWxlcykKK2dldGJhc2VjbGFzc2VzKGV4dGVuZGVkX3JlYWwpCitnZXRiYXNlY2xhc3Nlcyhsb25nX3JlY3RhbmdsZSkKK2dldGJhc2VjbGFzc2VzKE1heSkKK2dldGJhc2VjbGFzc2VzKHN0cmluZykKK2dldGJhc2VjbGFzc2VzKG1pbGVzKQorZ2V0YmFzZWNsYXNzZXMobnVtYmVyX29yX2RhdGUpCitnZXRiYXNlY2xhc3NlcyhPY3RvYmVyKQorZ2V0YmFzZWNsYXNzZXMoZXZlbnQpCitnZXRiYXNlY2xhc3NlcyhQYXNjYWxfc3RyaW5nKQorZ2V0YmFzZWNsYXNzZXMoem9uZSkKK2dldGJhc2VjbGFzc2VzKHBpY3R1cmUpCitnZXRiYXNlY2xhc3NlcyhsaXN0X29yX3N0cmluZykKK2dldGJhc2VjbGFzc2VzKG51bWJlcikKK2dldGJhc2VjbGFzc2VzKFR1ZXNkYXkpCitnZXRiYXNlY2xhc3Nlcyh2ZXJzaW9uKQorZ2V0YmFzZWNsYXNzZXMoRGVjZW1iZXIpCitnZXRiYXNlY2xhc3NlcyhzcXVhcmVfa2lsb21ldHJlcykKK2dldGJhc2VjbGFzc2VzKHJlZmVyZW5jZSkKK2dldGJhc2VjbGFzc2VzKHZlY3RvcikKK2dldGJhc2VjbGFzc2VzKHdlZWtkYXkpCitnZXRiYXNlY2xhc3NlcyhTdW5kYXkpCitnZXRiYXNlY2xhc3NlcyhpbnRlcm5hdGlvbmFsX3RleHQpCitnZXRiYXNlY2xhc3NlcyhzZWNvbmRzKQorZ2V0YmFzZWNsYXNzZXMoUkdCX2NvbG9yKQorZ2V0YmFzZWNsYXNzZXMoa2lsb21ldHJlcykKK2dldGJhc2VjbGFzc2VzKHN0eWxlZF9Vbmljb2RlX3RleHQpCitnZXRiYXNlY2xhc3NlcyhtaXNzaW5nX3ZhbHVlKQorZ2V0YmFzZWNsYXNzZXMobWV0cmVzKQorZ2V0YmFzZWNsYXNzZXMobnVtYmVyX29yX3N0cmluZykKK2dldGJhc2VjbGFzc2VzKGxpc3QpCitnZXRiYXNlY2xhc3NlcyhsaW5rZWRfbGlzdCkKK2dldGJhc2VjbGFzc2VzKHJlYWwpCitnZXRiYXNlY2xhc3NlcyhlbmNvZGVkX3N0cmluZykKK2dldGJhc2VjbGFzc2VzKGxpc3Rfb3JfcmVjb3JkKQorZ2V0YmFzZWNsYXNzZXMoTW9uZGF5KQorZ2V0YmFzZWNsYXNzZXMoU2VwdGVtYmVyKQorZ2V0YmFzZWNsYXNzZXMoYW55dGhpbmcpCitnZXRiYXNlY2xhc3Nlcyhwcm9wZXJ0eSkKK2dldGJhc2VjbGFzc2VzKHJlZmVyZW5jZV9mb3JtKQorZ2V0YmFzZWNsYXNzZXMoaXRlbSkKK2dldGJhc2VjbGFzc2VzKGdyYW1zKQorZ2V0YmFzZWNsYXNzZXMocmVjb3JkKQorZ2V0YmFzZWNsYXNzZXMoZW1wdHlfYWVfbmFtZV8pCitnZXRiYXNlY2xhc3Nlcyhjb25zdGFudCkKK2dldGJhc2VjbGFzc2VzKHNxdWFyZV9taWxlcykKK2dldGJhc2VjbGFzc2VzKGRhdGEpCitnZXRiYXNlY2xhc3NlcyhVbmljb2RlX3RleHQpCitnZXRiYXNlY2xhc3Nlcyh5YXJkcykKK2dldGJhc2VjbGFzc2VzKGN1YmljX3lhcmRzKQorZ2V0YmFzZWNsYXNzZXMocG91bmRzKQorZ2V0YmFzZWNsYXNzZXMoY3ViaWNfY2VudGltZXRyZXMpCitnZXRiYXNlY2xhc3Nlcyh0ZXh0KQorZ2V0YmFzZWNsYXNzZXMoSnVseSkKK2dldGJhc2VjbGFzc2VzKGN1YmljX21ldHJlcykKK2dldGJhc2VjbGFzc2VzKHN0eWxlZF90ZXh0KQorZ2V0YmFzZWNsYXNzZXMobnVtYmVyXzJjX19kYXRlX29yX3RleHQpCitnZXRiYXNlY2xhc3NlcyhmZWV0KQorZ2V0YmFzZWNsYXNzZXMoRmVicnVhcnkpCitnZXRiYXNlY2xhc3NlcyhkZWdyZWVzX0NlbHNpdXMpCitnZXRiYXNlY2xhc3NlcyhrZXlzdHJva2UpCitnZXRiYXNlY2xhc3NlcyhpbnRlZ2VyKQorZ2V0YmFzZWNsYXNzZXMoZGVncmVlc19GYWhyZW5oZWl0KQorZ2V0YmFzZWNsYXNzZXMobGlzdF8yY19fcmVjb3JkX29yX3RleHQpCitnZXRiYXNlY2xhc3NlcyhkYXRlKQorZ2V0YmFzZWNsYXNzZXMoZGVncmVlc19LZWx2aW4pCitnZXRiYXNlY2xhc3NlcyhjZW50aW1ldHJlcykKK2dldGJhc2VjbGFzc2VzKHdyaXRpbmdfY29kZSkKK2dldGJhc2VjbGFzc2VzKGFsaWFzX29yX3N0cmluZykKK2dldGJhc2VjbGFzc2VzKHdyaXRpbmdfY29kZV9pbmZvKQorZ2V0YmFzZWNsYXNzZXModGV4dF9pdGVtKQorZ2V0YmFzZWNsYXNzZXMobWFjaGluZSkKK2dldGJhc2VjbGFzc2VzKHR5cGVfY2xhc3MpCitnZXRiYXNlY2xhc3NlcyhwcmVwb3NpdGlvbikKK2dldGJhc2VjbGFzc2VzKFdlZG5lc2RheSkKK2dldGJhc2VjbGFzc2VzKHVwcGVyX2Nhc2UpCitnZXRiYXNlY2xhc3NlcyhNYXJjaCkKK2dldGJhc2VjbGFzc2VzKHNxdWFyZV9mZWV0KQorZ2V0YmFzZWNsYXNzZXMoTm92ZW1iZXIpCitnZXRiYXNlY2xhc3NlcyhxdWFydHMpCitnZXRiYXNlY2xhc3NlcyhhbGlhcykKK2dldGJhc2VjbGFzc2VzKEphbnVhcnkpCitnZXRiYXNlY2xhc3Nlcyhtb250aCkKK2dldGJhc2VjbGFzc2VzKEp1bmUpCitnZXRiYXNlY2xhc3NlcyhBdWd1c3QpCitnZXRiYXNlY2xhc3NlcyhzdHlsZWRfQ2xpcGJvYXJkX3RleHQpCitnZXRiYXNlY2xhc3NlcyhnYWxsb25zKQorZ2V0YmFzZWNsYXNzZXMoY3ViaWNfaW5jaGVzKQorZ2V0YmFzZWNsYXNzZXMoRnJpZGF5KQorZ2V0YmFzZWNsYXNzZXMoc291bmQpCitnZXRiYXNlY2xhc3NlcyhjbGFzc18pCitnZXRiYXNlY2xhc3NlcyhraWxvZ3JhbXMpCitnZXRiYXNlY2xhc3NlcyhzY3JpcHQpCitnZXRiYXNlY2xhc3NlcyhsaXRyZXMpCitnZXRiYXNlY2xhc3Nlcyhib29sZWFuKQorZ2V0YmFzZWNsYXNzZXMoc3F1YXJlX21ldHJlcykKK2dldGJhc2VjbGFzc2VzKGluY2hlcykKK2dldGJhc2VjbGFzc2VzKGNoYXJhY3RlcikKK2dldGJhc2VjbGFzc2VzKEFwcmlsKQorZ2V0YmFzZWNsYXNzZXMob3VuY2VzKQorZ2V0YmFzZWNsYXNzZXMoYXBwKQorZ2V0YmFzZWNsYXNzZXMoaGFuZGxlcikKK2dldGJhc2VjbGFzc2VzKENfc3RyaW5nKQorZ2V0YmFzZWNsYXNzZXMoVGh1cnNkYXkpCitnZXRiYXNlY2xhc3NlcyhzcXVhcmVfeWFyZHMpCitnZXRiYXNlY2xhc3NlcyhjdWJpY19mZWV0KQorZ2V0YmFzZWNsYXNzZXMoU2F0dXJkYXkpCitnZXRiYXNlY2xhc3NlcyhmaWxlX3NwZWNpZmljYXRpb24pCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdjcGljJyA6IGdyYXBoaWNfZ3JvdXAsCisgICAgJ2NvdmwnIDogb3ZhbCwKKyAgICAnY2d0eCcgOiBncmFwaGljX3RleHQsCisgICAgJ2Nnc2gnIDogZ3JhcGhpY19zaGFwZSwKKyAgICAnY2RydycgOiBkcmF3aW5nX2FyZWEsCisgICAgJ2dsaW4nIDogZ3JhcGhpY19saW5lLAorICAgICdjcGduJyA6IHBvbHlnb24sCisgICAgJ2NweGwnIDogcGl4ZWwsCisgICAgJ2NycmMnIDogcm91bmRlZF9yZWN0YW5nbGUsCisgICAgJ2Nnb2InIDogZ3JhcGhpY19vYmplY3QsCisgICAgJ2NhcmMnIDogYXJjLAorICAgICdjcGl4JyA6IHBpeGVsX21hcCwKKyAgICAnY3JlYycgOiByZWN0YW5nbGUsCisgICAgJ2NzZWwnIDogc2VsZWN0aW9uXzJkX29iamVjdCwKKyAgICAnY2FwcCcgOiBhcHBsaWNhdGlvbiwKKyAgICAnZG9jdScgOiBkb2N1bWVudCwKKyAgICAnY3dpbicgOiB3aW5kb3csCisgICAgJ2ZpbGUnIDogZmlsZSwKKyAgICAnYWxpcycgOiBhbGlhcywKKyAgICAnY2lucycgOiBpbnNlcnRpb25fcG9pbnQsCisgICAgJ2NoYSAnIDogY2hhcmFjdGVyLAorICAgICdjcGFyJyA6IHBhcmFncmFwaCwKKyAgICAnY3dvcicgOiB3b3JkLAorICAgICdjZmxvJyA6IHRleHRfZmxvdywKKyAgICAndHN0eScgOiB0ZXh0X3N0eWxlX2luZm8sCisgICAgJ2NsaW4nIDogbGluZSwKKyAgICAnY3R4dCcgOiB0ZXh0LAorICAgICdjYXQgJyA6IEFwcGxlVGFsa19hZGRyZXNzLAorICAgICdjYWRyJyA6IGFkZHJlc3Nfc3BlY2lmaWNhdGlvbiwKKyAgICAnY3RvaycgOiBUb2tlbl9SaW5nX2FkZHJlc3MsCisgICAgJ2NmdyAnIDogRmlyZVdpcmVfYWRkcmVzcywKKyAgICAnY2J1cycgOiBidXNfc2xvdCwKKyAgICAnY3NjcycgOiBTQ1NJX2FkZHJlc3MsCisgICAgJ2NhZGInIDogQURCX2FkZHJlc3MsCisgICAgJ2N1c2InIDogVVNCX2FkZHJlc3MsCisgICAgJ2NkZXYnIDogZGV2aWNlX3NwZWNpZmljYXRpb24sCisgICAgJ2NsdCAnIDogTG9jYWxUYWxrX2FkZHJlc3MsCisgICAgJ2NpcCAnIDogSVBfYWRkcmVzcywKKyAgICAnY2VuICcgOiBFdGhlcm5ldF9hZGRyZXNzLAorICAgICdjcGljJyA6IGdyYXBoaWNfZ3JvdXAsCisgICAgJ2NkcncnIDogZHJhd2luZ19hcmVhLAorICAgICdjY2VsJyA6IGNlbGwsCisgICAgJ2Njb2wnIDogY29sdW1uLAorICAgICdjdGJsJyA6IHRhYmxlLAorICAgICdjcm93JyA6IHJvdywKKyAgICAnc2hvcicgOiBzbWFsbF9pbnRlZ2VyLAorICAgICdhZXV0JyA6IHN5c3RlbV9kaWN0aW9uYXJ5LAorICAgICdjbHJ0JyA6IGNvbG9yX3RhYmxlLAorICAgICdmcG50JyA6IGZpeGVkX3BvaW50LAorICAgICdURVhUJyA6IHBsYWluX3RleHQsCisgICAgJ2VsaW4nIDogdHlwZV9lbGVtZW50X2luZm8sCisgICAgJ21Mb2MnIDogbWFjaGluZV9sb2NhdGlvbiwKKyAgICAnRVBTICcgOiBQb3N0U2NyaXB0X3BpY3R1cmUsCisgICAgJ3N1aW4nIDogdHlwZV9zdWl0ZV9pbmZvLAorICAgICdjbWVuJyA6IG1lbnVfaXRlbSwKKyAgICAndHBtbScgOiBwaXhlbF9tYXBfcmVjb3JkLAorICAgICdzaW5nJyA6IHNtYWxsX3JlYWwsCisgICAgJ251bGwnIDogbnVsbCwKKyAgICAndHJvdCcgOiByb3RhdGlvbiwKKyAgICAnZml4ZCcgOiBmaXhlZCwKKyAgICAnbHBudCcgOiBsb25nX3BvaW50LAorICAgICd0YXJnJyA6IHRhcmdldF9pZCwKKyAgICAncGluZicgOiB0eXBlX3Byb3BlcnR5X2luZm8sCisgICAgJ3BtaW4nIDogdHlwZV9wYXJhbWV0ZXJfaW5mbywKKyAgICAnbGZwdCcgOiBsb25nX2ZpeGVkX3BvaW50LAorICAgICdxZHJ0JyA6IGJvdW5kaW5nX3JlY3RhbmdsZSwKKyAgICAnVElGRicgOiBUSUZGX3BpY3R1cmUsCisgICAgJ2xmeGQnIDogbG9uZ19maXhlZCwKKyAgICAnaW5zbCcgOiBsb2NhdGlvbl9yZWZlcmVuY2UsCisgICAgJ3ZlcnMnIDogdmVyc2lvbiwKKyAgICAndHIxNicgOiBSR0IxNl9jb2xvciwKKyAgICAnY29tcCcgOiBkb3VibGVfaW50ZWdlciwKKyAgICAnZXZpbicgOiB0eXBlX2V2ZW50X2luZm8sCisgICAgJ1FEcHQnIDogcG9pbnQsCisgICAgJ2FldGUnIDogYXBwbGljYXRpb25fZGljdGlvbmFyeSwKKyAgICAnbWFnbicgOiB1bnNpZ25lZF9pbnRlZ2VyLAorICAgICdjbW51JyA6IG1lbnUsCisgICAgJ2ZyY3QnIDogZml4ZWRfcmVjdGFuZ2xlLAorICAgICdsZnJjJyA6IGxvbmdfZml4ZWRfcmVjdGFuZ2xlLAorICAgICdnY2xpJyA6IHR5cGVfY2xhc3NfaW5mbywKKyAgICAndHI5NicgOiBSR0I5Nl9jb2xvciwKKyAgICAndGRhcycgOiBkYXNoX3N0eWxlLAorICAgICdzdHlsJyA6IHNjcmFwX3N0eWxlcywKKyAgICAnZXh0ZScgOiBleHRlbmRlZF9yZWFsLAorICAgICdscmN0JyA6IGxvbmdfcmVjdGFuZ2xlLAorICAgICdtYXkgJyA6IE1heSwKKyAgICAnVEVYVCcgOiBzdHJpbmcsCisgICAgJ21pbGUnIDogbWlsZXMsCisgICAgJ25kICAnIDogbnVtYmVyX29yX2RhdGUsCisgICAgJ29jdCAnIDogT2N0b2JlciwKKyAgICAnZXZudCcgOiBldmVudCwKKyAgICAncHN0cicgOiBQYXNjYWxfc3RyaW5nLAorICAgICd6b25lJyA6IHpvbmUsCisgICAgJ1BJQ1QnIDogcGljdHVyZSwKKyAgICAnbHMgICcgOiBsaXN0X29yX3N0cmluZywKKyAgICAnbm1icicgOiBudW1iZXIsCisgICAgJ3R1ZSAnIDogVHVlc2RheSwKKyAgICAndmVycycgOiB2ZXJzaW9uLAorICAgICdkZWMgJyA6IERlY2VtYmVyLAorICAgICdzcWttJyA6IHNxdWFyZV9raWxvbWV0cmVzLAorICAgICdvYmogJyA6IHJlZmVyZW5jZSwKKyAgICAndmVjdCcgOiB2ZWN0b3IsCisgICAgJ3drZHknIDogd2Vla2RheSwKKyAgICAnc3VuICcgOiBTdW5kYXksCisgICAgJ2l0eHQnIDogaW50ZXJuYXRpb25hbF90ZXh0LAorICAgICdzY25kJyA6IHNlY29uZHMsCisgICAgJ2NSR0InIDogUkdCX2NvbG9yLAorICAgICdrbXRyJyA6IGtpbG9tZXRyZXMsCisgICAgJ3N1dHgnIDogc3R5bGVkX1VuaWNvZGVfdGV4dCwKKyAgICAnbXNuZycgOiBtaXNzaW5nX3ZhbHVlLAorICAgICdtZXRyJyA6IG1ldHJlcywKKyAgICAnbnMgICcgOiBudW1iZXJfb3Jfc3RyaW5nLAorICAgICdsaXN0JyA6IGxpc3QsCisgICAgJ2xsc3QnIDogbGlua2VkX2xpc3QsCisgICAgJ2RvdWInIDogcmVhbCwKKyAgICAnZW5jcycgOiBlbmNvZGVkX3N0cmluZywKKyAgICAnbHIgICcgOiBsaXN0X29yX3JlY29yZCwKKyAgICAnbW9uICcgOiBNb25kYXksCisgICAgJ3NlcCAnIDogU2VwdGVtYmVyLAorICAgICcqKioqJyA6IGFueXRoaW5nLAorICAgICdwcm9wJyA6IHByb3BlcnR5LAorICAgICdrZnJtJyA6IHJlZmVyZW5jZV9mb3JtLAorICAgICdjb2JqJyA6IGl0ZW0sCisgICAgJ2dyYW0nIDogZ3JhbXMsCisgICAgJ3JlY28nIDogcmVjb3JkLAorICAgICd1bmRmJyA6IGVtcHR5X2FlX25hbWVfLAorICAgICdlbnVtJyA6IGNvbnN0YW50LAorICAgICdzcW1pJyA6IHNxdWFyZV9taWxlcywKKyAgICAncmRhdCcgOiBkYXRhLAorICAgICd1dHh0JyA6IFVuaWNvZGVfdGV4dCwKKyAgICAneWFyZCcgOiB5YXJkcywKKyAgICAnY3lyZCcgOiBjdWJpY195YXJkcywKKyAgICAnbGJzICcgOiBwb3VuZHMsCisgICAgJ2NjbXQnIDogY3ViaWNfY2VudGltZXRyZXMsCisgICAgJ2N0eHQnIDogdGV4dCwKKyAgICAnanVsICcgOiBKdWx5LAorICAgICdjbWV0JyA6IGN1YmljX21ldHJlcywKKyAgICAnU1RYVCcgOiBzdHlsZWRfdGV4dCwKKyAgICAnbmRzICcgOiBudW1iZXJfMmNfX2RhdGVfb3JfdGV4dCwKKyAgICAnZmVldCcgOiBmZWV0LAorICAgICdmZWIgJyA6IEZlYnJ1YXJ5LAorICAgICdkZWdjJyA6IGRlZ3JlZXNfQ2Vsc2l1cywKKyAgICAna3BycycgOiBrZXlzdHJva2UsCisgICAgJ2xvbmcnIDogaW50ZWdlciwKKyAgICAnZGVnZicgOiBkZWdyZWVzX0ZhaHJlbmhlaXQsCisgICAgJ2xycyAnIDogbGlzdF8yY19fcmVjb3JkX29yX3RleHQsCisgICAgJ2xkdCAnIDogZGF0ZSwKKyAgICAnZGVnaycgOiBkZWdyZWVzX0tlbHZpbiwKKyAgICAnY210cicgOiBjZW50aW1ldHJlcywKKyAgICAncHNjdCcgOiB3cml0aW5nX2NvZGUsCisgICAgJ3NmICAnIDogYWxpYXNfb3Jfc3RyaW5nLAorICAgICdjaXRsJyA6IHdyaXRpbmdfY29kZV9pbmZvLAorICAgICdjaXRtJyA6IHRleHRfaXRlbSwKKyAgICAnbWFjaCcgOiBtYWNoaW5lLAorICAgICd0eXBlJyA6IHR5cGVfY2xhc3MsCisgICAgJ3ByZXAnIDogcHJlcG9zaXRpb24sCisgICAgJ3dlZCAnIDogV2VkbmVzZGF5LAorICAgICdjYXNlJyA6IHVwcGVyX2Nhc2UsCisgICAgJ21hciAnIDogTWFyY2gsCisgICAgJ3NxZnQnIDogc3F1YXJlX2ZlZXQsCisgICAgJ25vdiAnIDogTm92ZW1iZXIsCisgICAgJ3FydHMnIDogcXVhcnRzLAorICAgICdhbGlzJyA6IGFsaWFzLAorICAgICdqYW4gJyA6IEphbnVhcnksCisgICAgJ21udGgnIDogbW9udGgsCisgICAgJ2p1biAnIDogSnVuZSwKKyAgICAnYXVnICcgOiBBdWd1c3QsCisgICAgJ3N0eWwnIDogc3R5bGVkX0NsaXBib2FyZF90ZXh0LAorICAgICdnYWxuJyA6IGdhbGxvbnMsCisgICAgJ2N1aW4nIDogY3ViaWNfaW5jaGVzLAorICAgICdmcmkgJyA6IEZyaWRheSwKKyAgICAnc25kICcgOiBzb3VuZCwKKyAgICAncGNscycgOiBjbGFzc18sCisgICAgJ2tncm0nIDoga2lsb2dyYW1zLAorICAgICdzY3B0JyA6IHNjcmlwdCwKKyAgICAnbGl0cicgOiBsaXRyZXMsCisgICAgJ2Jvb2wnIDogYm9vbGVhbiwKKyAgICAnc3FybScgOiBzcXVhcmVfbWV0cmVzLAorICAgICdpbmNoJyA6IGluY2hlcywKKyAgICAnY2hhICcgOiBjaGFyYWN0ZXIsCisgICAgJ2FwciAnIDogQXByaWwsCisgICAgJ296cyAnIDogb3VuY2VzLAorICAgICdjYXBwJyA6IGFwcCwKKyAgICAnaGFuZCcgOiBoYW5kbGVyLAorICAgICdjc3RyJyA6IENfc3RyaW5nLAorICAgICd0aHUgJyA6IFRodXJzZGF5LAorICAgICdzcXlkJyA6IHNxdWFyZV95YXJkcywKKyAgICAnY2ZldCcgOiBjdWJpY19mZWV0LAorICAgICdzYXQgJyA6IFNhdHVyZGF5LAorICAgICdmc3MgJyA6IGZpbGVfc3BlY2lmaWNhdGlvbiwKK30KKworCitjbGFzcyBTdGRTdWl0ZXMoVGV4dF9TdWl0ZV9FdmVudHMsCisgICAgICAgIEFwcGxlU2NyaXB0X1N1aXRlX0V2ZW50cywKKyAgICAgICAgU3RhbmRhcmRfU3VpdGVfRXZlbnRzLAorICAgICAgICBNYWNpbnRvc2hfQ29ubmVjdGl2aXR5X0NsYXNfRXZlbnRzLAorICAgICAgICBRdWlja0RyYXdfR3JhcGhpY3NfU3VpdGVfRXZlbnRzLAorICAgICAgICBRdWlja0RyYXdfR3JhcGhpY3NfU3VwcGxlbWVfRXZlbnRzLAorICAgICAgICBSZXF1aXJlZF9TdWl0ZV9FdmVudHMsCisgICAgICAgIFRhYmxlX1N1aXRlX0V2ZW50cywKKyAgICAgICAgVHlwZV9OYW1lc19TdWl0ZV9FdmVudHMsCisgICAgICAgIGFldG9vbHMuVGFsa1RvKToKKyAgICBfc2lnbmF0dXJlID0gJ2FzY3InCisKKyAgICBfbW9kdWxlTmFtZSA9ICdTdGRTdWl0ZXMnCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWZlN2EzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TdGRTdWl0ZXMvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWZlN2EzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvRGlza19Gb2xkZXJfRmlsZV9TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9EaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YWMzZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvRGlza19Gb2xkZXJfRmlsZV9TdWl0ZS5weQpAQCAtMCwwICsxLDM4MSBAQAorIiIiU3VpdGUgRGlzay1Gb2xkZXItRmlsZSBTdWl0ZTogVGVybXMgYW5kIEV2ZW50cyBmb3IgY29udHJvbGxpbmcgRGlza3MsIEZvbGRlcnMsIGFuZCBGaWxlcworTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtIEV2ZW50cy5hcHAKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ2NkaXMnCisKK2NsYXNzIERpc2tfRm9sZGVyX0ZpbGVfU3VpdGVfRXZlbnRzOgorCisgICAgX2FyZ21hcF9tb3ZlID0geworICAgICAgICAndG8nIDogJ2luc2gnLAorICAgIH0KKworICAgIGRlZiBtb3ZlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJtb3ZlOiBNb3ZlIGRpc2sgaXRlbShzKSB0byBhIG5ldyBsb2NhdGlvbi4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgZm9yIHRoZSBjb21tYW5kCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG86IFRoZSBuZXcgbG9jYXRpb24gZm9yIHRoZSBkaXNrIGl0ZW0ocykuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdGhlIHJlcGx5IGZvciB0aGUgY29tbWFuZAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnbW92ZScKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9tb3ZlKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCitjbGFzcyBhcHBsaWNhdGlvbihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImFwcGxpY2F0aW9uIC0gVGhlIERpc2stRm9sZGVyLUZpbGUgU3VpdGUgaG9zdCBwcm9ncmFtICIiIgorICAgIHdhbnQgPSAnY2FwcCcKK2NsYXNzIF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIjxJbmhlcml0YW5jZT4gLSBBbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHN1cGVyY2xhc3MuICIiIgorICAgIHdoaWNoID0gJ2NAI14nCisgICAgd2FudCA9ICdjYXBwJworXzNjX0luaGVyaXRhbmNlXzNlXyA9IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8oKQorY2xhc3MgX1Byb3BfZm9sZGVyX2FjdGlvbnNfZW5hYmxlZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZm9sZGVyIGFjdGlvbnMgZW5hYmxlZCAtIEFyZSBGb2xkZXIgQWN0aW9ucyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkPyAiIiIKKyAgICB3aGljaCA9ICdmYWVuJworICAgIHdhbnQgPSAnYm9vbCcKK2ZvbGRlcl9hY3Rpb25zX2VuYWJsZWQgPSBfUHJvcF9mb2xkZXJfYWN0aW9uc19lbmFibGVkKCkKK2NsYXNzIF9Qcm9wX3Byb3BlcnRpZXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInByb3BlcnRpZXMgLSBldmVyeSBwcm9wZXJ0eSBvZiB0aGUgRGlzay1Gb2xkZXItRmlsZSBTdWl0ZSBob3N0IHByb2dyYW0gIiIiCisgICAgd2hpY2ggPSAncEFMTCcKKyAgICB3YW50ID0gJyoqKionCitwcm9wZXJ0aWVzID0gX1Byb3BfcHJvcGVydGllcygpCisjICAgICAgICBlbGVtZW50ICdjZGlzJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjZm9sJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjb2JqJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjd2luJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCcsICdJRCAgJ10KKyMgICAgICAgIGVsZW1lbnQgJ2RvY3UnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2ZpbGUnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2ZvYWMnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2xvZ2knIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ3BjYXAnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ3BjZGEnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ3ByY3MnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKworYXBwbGljYXRpb25zID0gYXBwbGljYXRpb24KKworY2xhc3MgZGlzayhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImRpc2sgLSBBIGRpc2sgaW4gdGhlIGZpbGUgc3lzdGVtICIiIgorICAgIHdhbnQgPSAnY2RpcycKK2NsYXNzIF9Qcm9wX1BPU0lYX3BhdGgoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIlBPU0lYIHBhdGggLSB0aGUgUE9TSVggZmlsZSBzeXN0ZW0gcGF0aCBvZiB0aGUgZGlzayAiIiIKKyAgICB3aGljaCA9ICdwb3N4JworICAgIHdhbnQgPSAndXR4dCcKK2NsYXNzIF9Qcm9wX2NhcGFjaXR5KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjYXBhY2l0eSAtIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgKGZyZWUgb3IgdXNlZCkgb24gdGhlIGRpc2sgIiIiCisgICAgd2hpY2ggPSAnY2FwYScKKyAgICB3YW50ID0gJ21hZ24nCitjbGFzcyBfUHJvcF9lamVjdGFibGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImVqZWN0YWJsZSAtIENhbiB0aGUgbWVkaWEgYmUgZWplY3RlZCAoZmxvcHBpZXMsIENEJ3MsIGFuZCBzbyBvbik/ICIiIgorICAgIHdoaWNoID0gJ2lzZWonCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfZm9ybWF0KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmb3JtYXQgLSB0aGUgZmlsZSBzeXN0ZW0gZm9ybWF0IG9mIHRoaXMgZGlzayAiIiIKKyAgICB3aGljaCA9ICdkZm10JworICAgIHdhbnQgPSAnZWRmbScKK2NsYXNzIF9Qcm9wX2ZyZWVfc3BhY2UoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZyZWUgc3BhY2UgLSB0aGUgbnVtYmVyIG9mIGZyZWUgYnl0ZXMgbGVmdCBvbiB0aGUgZGlzayAiIiIKKyAgICB3aGljaCA9ICdmcnNwJworICAgIHdhbnQgPSAnbWFnbicKK2NsYXNzIF9Qcm9wX2lnbm9yZV9wcml2aWxlZ2VzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJpZ25vcmUgcHJpdmlsZWdlcyAtIElnbm9yZSBwZXJtaXNzaW9ucyBvbiB0aGlzIGRpc2s/ICIiIgorICAgIHdoaWNoID0gJ2lncHInCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfbG9jYWxfdm9sdW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJsb2NhbCB2b2x1bWUgLSBJcyB0aGUgbWVkaWEgYSBsb2NhbCB2b2x1bWUgKGFzIG9wcG9zZWQgdG8gYSBmaWxlIHNlcnZlcj8gIiIiCisgICAgd2hpY2ggPSAnaXNydicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9uYW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGRpc2sgIiIiCisgICAgd2hpY2ggPSAncG5hbScKKyAgICB3YW50ID0gJ3V0eHQnCitjbGFzcyBfUHJvcF9wYXRoKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwYXRoIC0gdGhlIGZpbGUgc3lzdGVtIHBhdGggb2YgdGhlIGRpc2sgIiIiCisgICAgd2hpY2ggPSAncHB0aCcKKyAgICB3YW50ID0gJ3V0eHQnCitjbGFzcyBfUHJvcF9zdGFydHVwKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzdGFydHVwIC0gSXMgdGhpcyBkaXNrIHRoZSBib290IGRpc2s/ICIiIgorICAgIHdoaWNoID0gJ2lzdGQnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3Bfdm9sdW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ2b2x1bWUgLSB0aGUgdm9sdW1lIG9uIHdoaWNoIHRoZSBmb2xkZXIgcmVzaWRlcyAiIiIKKyAgICB3aGljaCA9ICd2b2x1JworICAgIHdhbnQgPSAndXR4dCcKKyMgICAgICAgIGVsZW1lbnQgJ2Nmb2wnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NvYmonIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2ZpbGUnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKworZGlza3MgPSBkaXNrCisKK2NsYXNzIGZvbGRlcihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImZvbGRlciAtIEEgZm9sZGVyIGluIHRoZSBmaWxlIHN5c3RlbSAiIiIKKyAgICB3YW50ID0gJ2Nmb2wnCisjICAgICAgICBlbGVtZW50ICdjZm9sJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjZm9sJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjb2JqJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjb2JqJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdmaWxlJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdmaWxlJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisKK2ZvbGRlcnMgPSBmb2xkZXIKKworY2xhc3MgaXRlbShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIml0ZW0gLSBBbiBpdGVtIGluIHRoZSBmaWxlIHN5c3RlbSAiIiIKKyAgICB3YW50ID0gJ2NvYmonCitjbGFzcyBfUHJvcF9idXN5X3N0YXR1cyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiYnVzeSBzdGF0dXMgLSBJcyB0aGUgaXRlbSBidXN5PyAiIiIKKyAgICB3aGljaCA9ICdidXN5JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2NyZWF0aW9uX2RhdGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNyZWF0aW9uIGRhdGUgLSB0aGUgZGF0ZSBvbiB3aGljaCB0aGUgaXRlbSB3YXMgY3JlYXRlZCAiIiIKKyAgICB3aGljaCA9ICdhc2NkJworICAgIHdhbnQgPSAnKioqKicKK2NsYXNzIF9Qcm9wX21vZGlmaWNhdGlvbl9kYXRlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJtb2RpZmljYXRpb24gZGF0ZSAtIHRoZSBkYXRlIG9uIHdoaWNoIHRoZSBpdGVtIHdhcyBsYXN0IG1vZGlmaWVkICIiIgorICAgIHdoaWNoID0gJ2FzbW8nCisgICAgd2FudCA9ICcqKioqJworY2xhc3MgX1Byb3BfbmFtZV9leHRlbnNpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm5hbWUgZXh0ZW5zaW9uIC0gdGhlIGV4dGVuc2lvbiBwb3J0aW9uIG9mIHRoZSBuYW1lICIiIgorICAgIHdoaWNoID0gJ2V4dG4nCisgICAgd2FudCA9ICd1dHh0JworY2xhc3MgX1Byb3BfcGFja2FnZV9mb2xkZXIoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInBhY2thZ2UgZm9sZGVyIC0gSXMgdGhlIGl0ZW0gYSBwYWNrYWdlPyAiIiIKKyAgICB3aGljaCA9ICdwa2dmJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3VybChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidXJsIC0gdGhlIHVybCBvZiB0aGUgaXRlbSAiIiIKKyAgICB3aGljaCA9ICd1cmwgJworICAgIHdhbnQgPSAndXR4dCcKK2NsYXNzIF9Qcm9wX3Zpc2libGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInZpc2libGUgLSBJcyB0aGUgaXRlbSB2aXNpYmxlPyAiIiIKKyAgICB3aGljaCA9ICd2aXNpJworICAgIHdhbnQgPSAnYm9vbCcKKyMgICAgICAgIGVsZW1lbnQgJ2Nmb2wnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NvYmonIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2ZpbGUnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKworaXRlbXMgPSBpdGVtCisKK2NsYXNzIGZpbGUoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJmaWxlIC0gQSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbSAiIiIKKyAgICB3YW50ID0gJ2ZpbGUnCitjbGFzcyBfUHJvcF9jcmVhdG9yX3R5cGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNyZWF0b3IgdHlwZSAtIHRoZSBPU1R5cGUgaWRlbnRpZnlpbmcgdGhlIGFwcGxpY2F0aW9uIHRoYXQgY3JlYXRlZCB0aGUgaXRlbSAiIiIKKyAgICB3aGljaCA9ICdmY3J0JworICAgIHdhbnQgPSAndXR4dCcKK2NsYXNzIF9Qcm9wX2ZpbGVfdHlwZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZmlsZSB0eXBlIC0gdGhlIE9TVHlwZSBpZGVudGlmeWluZyB0aGUgdHlwZSBvZiBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgaXRlbSAiIiIKKyAgICB3aGljaCA9ICdhc3R5JworICAgIHdhbnQgPSAndXR4dCcKK2NsYXNzIF9Qcm9wX3BoeXNpY2FsX3NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInBoeXNpY2FsIHNpemUgLSB0aGUgYWN0dWFsIHNwYWNlIHVzZWQgYnkgdGhlIGZpbGUgb24gZGlzayAiIiIKKyAgICB3aGljaCA9ICdwaHlzJworICAgIHdhbnQgPSAnbWFnbicKK2NsYXNzIF9Qcm9wX3Byb2R1Y3RfdmVyc2lvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicHJvZHVjdCB2ZXJzaW9uIC0gdGhlIHZlcnNpb24gb2YgdGhlIHByb2R1Y3QgKHZpc2libGUgYXQgdGhlIHRvcCBvZiB0aGUgP2V0IEluZm8/d2luZG93KSAiIiIKKyAgICB3aGljaCA9ICd2ZXIyJworICAgIHdhbnQgPSAndXR4dCcKK2NsYXNzIF9Qcm9wX3NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNpemUgLSB0aGUgbG9naWNhbCBzaXplIG9mIHRoZSBmaWxlICIiIgorICAgIHdoaWNoID0gJ3B0c3onCisgICAgd2FudCA9ICdtYWduJworY2xhc3MgX1Byb3Bfc3RhdGlvbmVyeShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic3RhdGlvbmVyeSAtIElzIHRoZSBmaWxlIGEgc3RhdGlvbmVyeSBwYWQ/ICIiIgorICAgIHdoaWNoID0gJ3BzcGQnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfdmVyc2lvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidmVyc2lvbiAtIHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlICh2aXNpYmxlIGF0IHRoZSBib3R0b20gb2YgdGhlID9ldCBJbmZvP3dpbmRvdykgIiIiCisgICAgd2hpY2ggPSAndmVycycKKyAgICB3YW50ID0gJ3V0eHQnCisjICAgICAgICBlbGVtZW50ICdjZm9sJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjb2JqJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdmaWxlJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisKK2ZpbGVzID0gZmlsZQorYXBwbGljYXRpb24uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitpbXBvcnQgU3RhbmRhcmRfU3VpdGUKK2ltcG9ydCBGb2xkZXJfQWN0aW9uc19TdWl0ZQoraW1wb3J0IExvZ2luX0l0ZW1zX1N1aXRlCitpbXBvcnQgUHJvY2Vzc2VzX1N1aXRlCithcHBsaWNhdGlvbi5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2ZvbGRlcl9hY3Rpb25zX2VuYWJsZWQnIDogX1Byb3BfZm9sZGVyX2FjdGlvbnNfZW5hYmxlZCwKKyAgICAncHJvcGVydGllcycgOiBfUHJvcF9wcm9wZXJ0aWVzLAorfQorYXBwbGljYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnYXBwbGljYXRpb25fcHJvY2VzcycgOiBQcm9jZXNzZXNfU3VpdGUuYXBwbGljYXRpb25fcHJvY2VzcywKKyAgICAnZGVza19hY2Nlc3NvcnlfcHJvY2VzcycgOiBQcm9jZXNzZXNfU3VpdGUuZGVza19hY2Nlc3NvcnlfcHJvY2VzcywKKyAgICAnZGlzaycgOiBkaXNrLAorICAgICdkb2N1bWVudCcgOiBTdGFuZGFyZF9TdWl0ZS5kb2N1bWVudCwKKyAgICAnZmlsZScgOiBmaWxlLAorICAgICdmb2xkZXInIDogZm9sZGVyLAorICAgICdmb2xkZXJfYWN0aW9uJyA6IEZvbGRlcl9BY3Rpb25zX1N1aXRlLmZvbGRlcl9hY3Rpb24sCisgICAgJ2l0ZW0nIDogaXRlbSwKKyAgICAnbG9naW5faXRlbScgOiBMb2dpbl9JdGVtc19TdWl0ZS5sb2dpbl9pdGVtLAorICAgICdwcm9jZXNzJyA6IFByb2Nlc3Nlc19TdWl0ZS5wcm9jZXNzLAorICAgICd3aW5kb3cnIDogU3RhbmRhcmRfU3VpdGUud2luZG93LAorfQorZGlzay5fc3VwZXJjbGFzc25hbWVzID0gWydpdGVtJ10KK2Rpc2suX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnUE9TSVhfcGF0aCcgOiBfUHJvcF9QT1NJWF9wYXRoLAorICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2NhcGFjaXR5JyA6IF9Qcm9wX2NhcGFjaXR5LAorICAgICdlamVjdGFibGUnIDogX1Byb3BfZWplY3RhYmxlLAorICAgICdmb3JtYXQnIDogX1Byb3BfZm9ybWF0LAorICAgICdmcmVlX3NwYWNlJyA6IF9Qcm9wX2ZyZWVfc3BhY2UsCisgICAgJ2lnbm9yZV9wcml2aWxlZ2VzJyA6IF9Qcm9wX2lnbm9yZV9wcml2aWxlZ2VzLAorICAgICdsb2NhbF92b2x1bWUnIDogX1Byb3BfbG9jYWxfdm9sdW1lLAorICAgICduYW1lJyA6IF9Qcm9wX25hbWUsCisgICAgJ3BhdGgnIDogX1Byb3BfcGF0aCwKKyAgICAncHJvcGVydGllcycgOiBfUHJvcF9wcm9wZXJ0aWVzLAorICAgICdzdGFydHVwJyA6IF9Qcm9wX3N0YXJ0dXAsCisgICAgJ3ZvbHVtZScgOiBfUHJvcF92b2x1bWUsCit9CitkaXNrLl9wcml2ZWxlbWRpY3QgPSB7CisgICAgJ2ZpbGUnIDogZmlsZSwKKyAgICAnZm9sZGVyJyA6IGZvbGRlciwKKyAgICAnaXRlbScgOiBpdGVtLAorfQorZm9sZGVyLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2l0ZW0nXQorZm9sZGVyLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ1BPU0lYX3BhdGgnIDogX1Byb3BfUE9TSVhfcGF0aCwKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICduYW1lJyA6IF9Qcm9wX25hbWUsCisgICAgJ3BhdGgnIDogX1Byb3BfcGF0aCwKKyAgICAncHJvcGVydGllcycgOiBfUHJvcF9wcm9wZXJ0aWVzLAorICAgICd2b2x1bWUnIDogX1Byb3Bfdm9sdW1lLAorfQorZm9sZGVyLl9wcml2ZWxlbWRpY3QgPSB7CisgICAgJ2ZpbGUnIDogZmlsZSwKKyAgICAnZmlsZScgOiBmaWxlLAorICAgICdmb2xkZXInIDogZm9sZGVyLAorICAgICdmb2xkZXInIDogZm9sZGVyLAorICAgICdpdGVtJyA6IGl0ZW0sCisgICAgJ2l0ZW0nIDogaXRlbSwKK30KK2l0ZW0uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitpdGVtLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ1BPU0lYX3BhdGgnIDogX1Byb3BfUE9TSVhfcGF0aCwKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdidXN5X3N0YXR1cycgOiBfUHJvcF9idXN5X3N0YXR1cywKKyAgICAnY3JlYXRpb25fZGF0ZScgOiBfUHJvcF9jcmVhdGlvbl9kYXRlLAorICAgICdtb2RpZmljYXRpb25fZGF0ZScgOiBfUHJvcF9tb2RpZmljYXRpb25fZGF0ZSwKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorICAgICduYW1lX2V4dGVuc2lvbicgOiBfUHJvcF9uYW1lX2V4dGVuc2lvbiwKKyAgICAncGFja2FnZV9mb2xkZXInIDogX1Byb3BfcGFja2FnZV9mb2xkZXIsCisgICAgJ3BhdGgnIDogX1Byb3BfcGF0aCwKKyAgICAncHJvcGVydGllcycgOiBfUHJvcF9wcm9wZXJ0aWVzLAorICAgICd1cmwnIDogX1Byb3BfdXJsLAorICAgICd2aXNpYmxlJyA6IF9Qcm9wX3Zpc2libGUsCisgICAgJ3ZvbHVtZScgOiBfUHJvcF92b2x1bWUsCit9CitpdGVtLl9wcml2ZWxlbWRpY3QgPSB7CisgICAgJ2ZpbGUnIDogZmlsZSwKKyAgICAnZm9sZGVyJyA6IGZvbGRlciwKKyAgICAnaXRlbScgOiBpdGVtLAorfQorZmlsZS5fc3VwZXJjbGFzc25hbWVzID0gWydpdGVtJ10KK2ZpbGUuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnUE9TSVhfcGF0aCcgOiBfUHJvcF9QT1NJWF9wYXRoLAorICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2NyZWF0b3JfdHlwZScgOiBfUHJvcF9jcmVhdG9yX3R5cGUsCisgICAgJ2ZpbGVfdHlwZScgOiBfUHJvcF9maWxlX3R5cGUsCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAncGF0aCcgOiBfUHJvcF9wYXRoLAorICAgICdwaHlzaWNhbF9zaXplJyA6IF9Qcm9wX3BoeXNpY2FsX3NpemUsCisgICAgJ3Byb2R1Y3RfdmVyc2lvbicgOiBfUHJvcF9wcm9kdWN0X3ZlcnNpb24sCisgICAgJ3Byb3BlcnRpZXMnIDogX1Byb3BfcHJvcGVydGllcywKKyAgICAnc2l6ZScgOiBfUHJvcF9zaXplLAorICAgICdzdGF0aW9uZXJ5JyA6IF9Qcm9wX3N0YXRpb25lcnksCisgICAgJ3ZlcnNpb24nIDogX1Byb3BfdmVyc2lvbiwKKyAgICAndm9sdW1lJyA6IF9Qcm9wX3ZvbHVtZSwKK30KK2ZpbGUuX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnZmlsZScgOiBmaWxlLAorICAgICdmb2xkZXInIDogZm9sZGVyLAorICAgICdpdGVtJyA6IGl0ZW0sCit9CitfRW51bV9lZGZtID0geworICAgICdNU18yZF9ET1NfZm9ybWF0JyA6ICdkZm1zJywgICAgICAgICMgTVMtRE9TIGZvcm1hdAorICAgICdBcHBsZV9QaG90b19mb3JtYXQnIDogJ2RmcGgnLCAgICAgICMgQXBwbGUgUGhvdG8gZm9ybWF0CisgICAgJ0lTT185NjYwX2Zvcm1hdCcgOiAnZGY5NicsICMgSVNPIDk2NjAgZm9ybWF0CisgICAgJ1F1aWNrVGFrZV9mb3JtYXQnIDogJ2RmcXQnLCAgICAgICAgIyBRdWlja1Rha2UgZm9ybWF0CisgICAgJ0FwcGxlU2hhcmVfZm9ybWF0JyA6ICdkZmFzJywgICAgICAgIyBBcHBsZVNoYXJlIGZvcm1hdAorICAgICdIaWdoX1NpZXJyYV9mb3JtYXQnIDogJ2RmaHMnLCAgICAgICMgSGlnaCBTaWVycmEgZm9ybWF0CisgICAgJ01hY19PU19FeHRlbmRlZF9mb3JtYXQnIDogJ2RmaCsnLCAgIyBNYWMgT1MgRXh0ZW5kZWQgZm9ybWF0CisgICAgJ1VERl9mb3JtYXQnIDogJ2RmdWQnLCAgICAgICMgVURGIGZvcm1hdAorICAgICd1bmtub3duX2Zvcm1hdCcgOiAnZGY/PycsICAjIHVua25vd24gZm9ybWF0CisgICAgJ2F1ZGlvX2Zvcm1hdCcgOiAnZGZhdScsICAgICMgYXVkaW8gZm9ybWF0CisgICAgJ01hY19PU19mb3JtYXQnIDogJ2RmaGYnLCAgICMgTWFjIE9TIGZvcm1hdAorICAgICdVRlNfZm9ybWF0JyA6ICdkZnVmJywgICAgICAjIFVGUyBmb3JtYXQKKyAgICAnTkZTX2Zvcm1hdCcgOiAnZGZuZicsICAgICAgIyBORlMgZm9ybWF0CisgICAgJ1Byb0RPU19mb3JtYXQnIDogJ2RmcHInLCAgICMgUHJvRE9TIGZvcm1hdAorICAgICdXZWJEQVZfZm9ybWF0JyA6ICdkZndkJywgICAjIFdlYkRBViBmb3JtYXQKK30KKworCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKKyAgICAnY2FwcCcgOiBhcHBsaWNhdGlvbiwKKyAgICAnY2RpcycgOiBkaXNrLAorICAgICdjZm9sJyA6IGZvbGRlciwKKyAgICAnY29iaicgOiBpdGVtLAorICAgICdmaWxlJyA6IGZpbGUsCit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworICAgICdhc2NkJyA6IF9Qcm9wX2NyZWF0aW9uX2RhdGUsCisgICAgJ2FzbW8nIDogX1Byb3BfbW9kaWZpY2F0aW9uX2RhdGUsCisgICAgJ2FzdHknIDogX1Byb3BfZmlsZV90eXBlLAorICAgICdidXN5JyA6IF9Qcm9wX2J1c3lfc3RhdHVzLAorICAgICdjQCNeJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2NhcGEnIDogX1Byb3BfY2FwYWNpdHksCisgICAgJ2RmbXQnIDogX1Byb3BfZm9ybWF0LAorICAgICdleHRuJyA6IF9Qcm9wX25hbWVfZXh0ZW5zaW9uLAorICAgICdmYWVuJyA6IF9Qcm9wX2ZvbGRlcl9hY3Rpb25zX2VuYWJsZWQsCisgICAgJ2ZjcnQnIDogX1Byb3BfY3JlYXRvcl90eXBlLAorICAgICdmcnNwJyA6IF9Qcm9wX2ZyZWVfc3BhY2UsCisgICAgJ2lncHInIDogX1Byb3BfaWdub3JlX3ByaXZpbGVnZXMsCisgICAgJ2lzZWonIDogX1Byb3BfZWplY3RhYmxlLAorICAgICdpc3J2JyA6IF9Qcm9wX2xvY2FsX3ZvbHVtZSwKKyAgICAnaXN0ZCcgOiBfUHJvcF9zdGFydHVwLAorICAgICdwQUxMJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCisgICAgJ3BoeXMnIDogX1Byb3BfcGh5c2ljYWxfc2l6ZSwKKyAgICAncGtnZicgOiBfUHJvcF9wYWNrYWdlX2ZvbGRlciwKKyAgICAncG5hbScgOiBfUHJvcF9uYW1lLAorICAgICdwb3N4JyA6IF9Qcm9wX1BPU0lYX3BhdGgsCisgICAgJ3BwdGgnIDogX1Byb3BfcGF0aCwKKyAgICAncHNwZCcgOiBfUHJvcF9zdGF0aW9uZXJ5LAorICAgICdwdHN6JyA6IF9Qcm9wX3NpemUsCisgICAgJ3VybCAnIDogX1Byb3BfdXJsLAorICAgICd2ZXIyJyA6IF9Qcm9wX3Byb2R1Y3RfdmVyc2lvbiwKKyAgICAndmVycycgOiBfUHJvcF92ZXJzaW9uLAorICAgICd2aXNpJyA6IF9Qcm9wX3Zpc2libGUsCisgICAgJ3ZvbHUnIDogX1Byb3Bfdm9sdW1lLAorfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7CisgICAgJ2VkZm0nIDogX0VudW1fZWRmbSwKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9EaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9EaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzM0OGJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL0Rpc2tfRm9sZGVyX0ZpbGVfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9EaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9EaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzM0OGJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL0Rpc2tfRm9sZGVyX0ZpbGVfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Gb2xkZXJfQWN0aW9uc19TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Gb2xkZXJfQWN0aW9uc19TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmM3ZTVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL0ZvbGRlcl9BY3Rpb25zX1N1aXRlLnB5CkBAIC0wLDAgKzEsMjg3IEBACisiIiJTdWl0ZSBGb2xkZXIgQWN0aW9ucyBTdWl0ZTogVGVybXMgYW5kIEV2ZW50cyBmb3IgY29udHJvbGxpbmcgRm9sZGVyIEFjdGlvbnMKK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbSBFdmVudHMuYXBwCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdmYWNvJworCitjbGFzcyBGb2xkZXJfQWN0aW9uc19TdWl0ZV9FdmVudHM6CisKKyAgICBfYXJnbWFwX2F0dGFjaF9hY3Rpb25fdG8gPSB7CisgICAgICAgICd1c2luZycgOiAnZmFhbCcsCisgICAgfQorCisgICAgZGVmIGF0dGFjaF9hY3Rpb25fdG8oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImF0dGFjaCBhY3Rpb24gdG86IEF0dGFjaCBhbiBhY3Rpb24gdG8gYSBmb2xkZXIKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgZm9yIHRoZSBjb21tYW5kCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdXNpbmc6IGEgZmlsZSBjb250YWluaW5nIHRoZSBzY3JpcHQgdG8gYXR0YWNoCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdGhlIHJlcGx5IGZvciB0aGUgY29tbWFuZAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnZmFjbycKKyAgICAgICAgX3N1YmNvZGUgPSAnYXRmYScKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9hdHRhY2hfYWN0aW9uX3RvKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBhdHRhY2hlZF9zY3JpcHRzKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJhdHRhY2hlZCBzY3JpcHRzOiBMaXN0IHRoZSBhY3Rpb25zIGF0dGFjaGVkIHRvIGEgZm9sZGVyCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGZvciB0aGUgY29tbWFuZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRoZSByZXBseSBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2ZhY28nCisgICAgICAgIF9zdWJjb2RlID0gJ2xhY3QnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX2RvX2ZvbGRlcl9hY3Rpb24gPSB7CisgICAgICAgICd3aXRoX3dpbmRvd19zaXplJyA6ICdmbnN6JywKKyAgICAgICAgJ3dpdGhfaXRlbV9saXN0JyA6ICdmbHN0JywKKyAgICAgICAgJ2ZvbGRlcl9hY3Rpb25fY29kZScgOiAnYWN0bicsCisgICAgfQorCisgICAgZGVmIGRvX2ZvbGRlcl9hY3Rpb24oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImRvIGZvbGRlciBhY3Rpb246IEV2ZW50IHRoZSBGaW5kZXIgc2VuZHMgdG8gdGhlIEZvbGRlciBBY3Rpb25zIEZCQQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoX3dpbmRvd19zaXplOiB0aGUgbmV3IHdpbmRvdyBzaXplIGZvciB0aGUgZm9sZGVyIGFjdGlvbiBtZXNzYWdlIHRvIHByb2Nlc3MKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoX2l0ZW1fbGlzdDogYSBsaXN0IG9mIGl0ZW1zIGZvciB0aGUgZm9sZGVyIGFjdGlvbiBtZXNzYWdlIHRvIHByb2Nlc3MKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBmb2xkZXJfYWN0aW9uX2NvZGU6IHRoZSBmb2xkZXIgYWN0aW9uIG1lc3NhZ2UgdG8gcHJvY2VzcworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRoZSByZXBseSBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2ZhY28nCisgICAgICAgIF9zdWJjb2RlID0gJ2ZvbGEnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfZG9fZm9sZGVyX2FjdGlvbikKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdhY3RuJywgX0VudW1fYWN0bikKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfZWRpdF9hY3Rpb25fb2YgPSB7CisgICAgICAgICd1c2luZ19hY3Rpb25fbmFtZScgOiAnc25hbScsCisgICAgICAgICd1c2luZ19hY3Rpb25fbnVtYmVyJyA6ICdpbmR4JywKKyAgICB9CisKKyAgICBkZWYgZWRpdF9hY3Rpb25fb2Yoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImVkaXQgYWN0aW9uIG9mOiBFZGl0IGFzIGFjdGlvbiBvZiBhIGZvbGRlcgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB1c2luZ19hY3Rpb25fbmFtZTogLi4ub3IgdGhlIG5hbWUgb2YgdGhlIGFjdGlvbiB0byBlZGl0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdXNpbmdfYWN0aW9uX251bWJlcjogdGhlIGluZGV4IG51bWJlciBvZiB0aGUgYWN0aW9uIHRvIGVkaXQuLi4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB0aGUgcmVwbHkgZm9yIHRoZSBjb21tYW5kCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdmYWNvJworICAgICAgICBfc3ViY29kZSA9ICdlZGZhJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2VkaXRfYWN0aW9uX29mKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfcmVtb3ZlX2FjdGlvbl9mcm9tID0geworICAgICAgICAndXNpbmdfYWN0aW9uX25hbWUnIDogJ3NuYW0nLAorICAgICAgICAndXNpbmdfYWN0aW9uX251bWJlcicgOiAnaW5keCcsCisgICAgfQorCisgICAgZGVmIHJlbW92ZV9hY3Rpb25fZnJvbShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIicmVtb3ZlIGFjdGlvbiBmcm9tOiBSZW1vdmUgYSBmb2xkZXIgYWN0aW9uIGZyb20gYSBmb2xkZXIKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgZm9yIHRoZSBjb21tYW5kCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdXNpbmdfYWN0aW9uX25hbWU6IC4uLm9yIHRoZSBuYW1lIG9mIHRoZSBhY3Rpb24gdG8gcmVtb3ZlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdXNpbmdfYWN0aW9uX251bWJlcjogdGhlIGluZGV4IG51bWJlciBvZiB0aGUgYWN0aW9uIHRvIHJlbW92ZS4uLgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRoZSByZXBseSBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2ZhY28nCisgICAgICAgIF9zdWJjb2RlID0gJ3JtZmEnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfcmVtb3ZlX2FjdGlvbl9mcm9tKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworCitjbGFzcyBhcHBsaWNhdGlvbihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImFwcGxpY2F0aW9uIC0gVGhlIEZvbGRlciBBY3Rpb25zIFN1aXRlIGhvc3QgcHJvZ3JhbSAiIiIKKyAgICB3YW50ID0gJ2NhcHAnCitjbGFzcyBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiI8SW5oZXJpdGFuY2U+IC0gQWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzdXBlcmNsYXNzLiAiIiIKKyAgICB3aGljaCA9ICdjQCNeJworICAgIHdhbnQgPSAnY2FwcCcKK18zY19Jbmhlcml0YW5jZV8zZV8gPSBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfKCkKK2NsYXNzIF9Qcm9wX2ZvbGRlcl9hY3Rpb25zX2VuYWJsZWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZvbGRlciBhY3Rpb25zIGVuYWJsZWQgLSBBcmUgRm9sZGVyIEFjdGlvbnMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZD8gIiIiCisgICAgd2hpY2ggPSAnZmFlbicKKyAgICB3YW50ID0gJ2Jvb2wnCitmb2xkZXJfYWN0aW9uc19lbmFibGVkID0gX1Byb3BfZm9sZGVyX2FjdGlvbnNfZW5hYmxlZCgpCitjbGFzcyBfUHJvcF9wcm9wZXJ0aWVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwcm9wZXJ0aWVzIC0gZXZlcnkgcHJvcGVydHkgb2YgdGhlIEZvbGRlciBBY3Rpb25zIFN1aXRlIGhvc3QgcHJvZ3JhbSAiIiIKKyAgICB3aGljaCA9ICdwQUxMJworICAgIHdhbnQgPSAnKioqKicKK3Byb3BlcnRpZXMgPSBfUHJvcF9wcm9wZXJ0aWVzKCkKKyMgICAgICAgIGVsZW1lbnQgJ2NkaXMnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2Nmb2wnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NvYmonIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2N3aW4nIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0JywgJ0lEICAnXQorIyAgICAgICAgZWxlbWVudCAnZG9jdScgYXMgWyduYW1lJywgJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnZmlsZScgYXMgWyduYW1lJywgJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnZm9hYycgYXMgWyduYW1lJywgJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnbG9naScgYXMgWyduYW1lJywgJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAncGNhcCcgYXMgWyduYW1lJywgJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAncGNkYScgYXMgWyduYW1lJywgJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAncHJjcycgYXMgWyduYW1lJywgJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorCithcHBsaWNhdGlvbnMgPSBhcHBsaWNhdGlvbgorCitjbGFzcyBmb2xkZXJfYWN0aW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiZm9sZGVyIGFjdGlvbiAtIEFuIGFjdGlvbiBhdHRhY2hlZCB0byBhIGZvbGRlciBpbiB0aGUgZmlsZSBzeXN0ZW0gIiIiCisgICAgd2FudCA9ICdmb2FjJworY2xhc3MgX1Byb3BfbmFtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgYWN0aW9uLCB3aGljaCBpcyBhbHNvIHRoZSBuYW1lIG9mIHRoZSBmb2xkZXIgIiIiCisgICAgd2hpY2ggPSAncG5hbScKKyAgICB3YW50ID0gJ3V0eHQnCitjbGFzcyBfUHJvcF9wYXRoKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwYXRoIC0gdGhlIHBhdGggdG8gdGhlIGZvbGRlciB0byB3aGljaCB0aGUgZm9sZGVyIGFjdGlvbiBhcHBsaWVzICIiIgorICAgIHdoaWNoID0gJ3BwdGgnCisgICAgd2FudCA9ICcqKioqJworY2xhc3MgX1Byb3Bfdm9sdW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ2b2x1bWUgLSB0aGUgdm9sdW1lIG9uIHdoaWNoIHRoZSBmb2xkZXIgYWN0aW9uIHJlc2lkZXMgIiIiCisgICAgd2hpY2ggPSAndm9sdScKKyAgICB3YW50ID0gJ3V0eHQnCisjICAgICAgICBlbGVtZW50ICdzY3B0JyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisKK2ZvbGRlcl9hY3Rpb25zID0gZm9sZGVyX2FjdGlvbgorCitjbGFzcyBzY3JpcHQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJzY3JpcHQgLSBBIHNjcmlwdCBpbnZva2VkIGJ5IGEgZm9sZGVyIGFjdGlvbiAiIiIKKyAgICB3YW50ID0gJ3NjcHQnCitjbGFzcyBfUHJvcF9QT1NJWF9wYXRoKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJQT1NJWCBwYXRoIC0gdGhlIFBPU0lYIGZpbGUgc3lzdGVtIHBhdGggb2YgdGhlIGRpc2sgIiIiCisgICAgd2hpY2ggPSAncG9zeCcKKyAgICB3YW50ID0gJ3V0eHQnCisKK3NjcmlwdHMgPSBzY3JpcHQKK2FwcGxpY2F0aW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQoraW1wb3J0IERpc2tfRm9sZGVyX0ZpbGVfU3VpdGUKK2ltcG9ydCBTdGFuZGFyZF9TdWl0ZQoraW1wb3J0IExvZ2luX0l0ZW1zX1N1aXRlCitpbXBvcnQgUHJvY2Vzc2VzX1N1aXRlCithcHBsaWNhdGlvbi5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2ZvbGRlcl9hY3Rpb25zX2VuYWJsZWQnIDogX1Byb3BfZm9sZGVyX2FjdGlvbnNfZW5hYmxlZCwKKyAgICAncHJvcGVydGllcycgOiBfUHJvcF9wcm9wZXJ0aWVzLAorfQorYXBwbGljYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnYXBwbGljYXRpb25fcHJvY2VzcycgOiBQcm9jZXNzZXNfU3VpdGUuYXBwbGljYXRpb25fcHJvY2VzcywKKyAgICAnZGVza19hY2Nlc3NvcnlfcHJvY2VzcycgOiBQcm9jZXNzZXNfU3VpdGUuZGVza19hY2Nlc3NvcnlfcHJvY2VzcywKKyAgICAnZGlzaycgOiBEaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLmRpc2ssCisgICAgJ2RvY3VtZW50JyA6IFN0YW5kYXJkX1N1aXRlLmRvY3VtZW50LAorICAgICdmaWxlJyA6IERpc2tfRm9sZGVyX0ZpbGVfU3VpdGUuZmlsZSwKKyAgICAnZm9sZGVyJyA6IERpc2tfRm9sZGVyX0ZpbGVfU3VpdGUuZm9sZGVyLAorICAgICdmb2xkZXJfYWN0aW9uJyA6IGZvbGRlcl9hY3Rpb24sCisgICAgJ2l0ZW0nIDogRGlza19Gb2xkZXJfRmlsZV9TdWl0ZS5pdGVtLAorICAgICdsb2dpbl9pdGVtJyA6IExvZ2luX0l0ZW1zX1N1aXRlLmxvZ2luX2l0ZW0sCisgICAgJ3Byb2Nlc3MnIDogUHJvY2Vzc2VzX1N1aXRlLnByb2Nlc3MsCisgICAgJ3dpbmRvdycgOiBTdGFuZGFyZF9TdWl0ZS53aW5kb3csCit9Citmb2xkZXJfYWN0aW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2l0ZW0nXQorZm9sZGVyX2FjdGlvbi5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAncGF0aCcgOiBfUHJvcF9wYXRoLAorICAgICdwcm9wZXJ0aWVzJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCisgICAgJ3ZvbHVtZScgOiBfUHJvcF92b2x1bWUsCit9Citmb2xkZXJfYWN0aW9uLl9wcml2ZWxlbWRpY3QgPSB7CisgICAgJ3NjcmlwdCcgOiBzY3JpcHQsCit9CitzY3JpcHQuX3N1cGVyY2xhc3NuYW1lcyA9IFsnaXRlbSddCitzY3JpcHQuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnUE9TSVhfcGF0aCcgOiBfUHJvcF9QT1NJWF9wYXRoLAorICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAncGF0aCcgOiBfUHJvcF9wYXRoLAorICAgICdwcm9wZXJ0aWVzJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCit9CitzY3JpcHQuX3ByaXZlbGVtZGljdCA9IHsKK30KK19FbnVtX2FjdG4gPSB7CisgICAgJ2l0ZW1zX2FkZGVkJyA6ICdmZ2V0JywgICAgICMgaXRlbXMgYWRkZWQKKyAgICAnaXRlbXNfcmVtb3ZlZCcgOiAnZmxvcycsICAgIyBpdGVtcyByZW1vdmVkCisgICAgJ3dpbmRvd19jbG9zZWQnIDogJ2ZjbG8nLCAgICMgd2luZG93IGNsb3NlZAorICAgICd3aW5kb3dfbW92ZWQnIDogJ2ZzaXonLCAgICAjIHdpbmRvdyBtb3ZlZAorICAgICd3aW5kb3dfb3BlbmVkJyA6ICdmb3BuJywgICAjIHdpbmRvdyBvcGVuZWQKK30KKworCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKKyAgICAnY2FwcCcgOiBhcHBsaWNhdGlvbiwKKyAgICAnZm9hYycgOiBmb2xkZXJfYWN0aW9uLAorICAgICdzY3B0JyA6IHNjcmlwdCwKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2NAI14nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnZmFlbicgOiBfUHJvcF9mb2xkZXJfYWN0aW9uc19lbmFibGVkLAorICAgICdwQUxMJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCisgICAgJ3BuYW0nIDogX1Byb3BfbmFtZSwKKyAgICAncG9zeCcgOiBfUHJvcF9QT1NJWF9wYXRoLAorICAgICdwcHRoJyA6IF9Qcm9wX3BhdGgsCisgICAgJ3ZvbHUnIDogX1Byb3Bfdm9sdW1lLAorfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7CisgICAgJ2FjdG4nIDogX0VudW1fYWN0biwKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Gb2xkZXJfQWN0aW9uc19TdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvRm9sZGVyX0FjdGlvbnNfU3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMWE4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvRm9sZGVyX0FjdGlvbnNfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Gb2xkZXJfQWN0aW9uc19TdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvRm9sZGVyX0FjdGlvbnNfU3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMWE4ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvRm9sZGVyX0FjdGlvbnNfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9IaWRkZW5fU3VpdGUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvSGlkZGVuX1N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MGFjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvSGlkZGVuX1N1aXRlLnB5CkBAIC0wLDAgKzEsNTAgQEAKKyIiIlN1aXRlIEhpZGRlbiBTdWl0ZTogSGlkZGVuIFRlcm1zIGFuZCBFdmVudHMgZm9yIGNvbnRyb2xsaW5nIHRoZSBTeXN0ZW0gRXZlbnRzIGFwcGxpY2F0aW9uCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9TeXN0ZW0gRXZlbnRzLmFwcAorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMS8wLCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAndHBubScKKworZnJvbSBTdGRTdWl0ZXMuVHlwZV9OYW1lc19TdWl0ZSBpbXBvcnQgKgorY2xhc3MgSGlkZGVuX1N1aXRlX0V2ZW50cyhUeXBlX05hbWVzX1N1aXRlX0V2ZW50cyk6CisKKyAgICBkZWYgZG9fc2NyaXB0KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJkbyBzY3JpcHQ6IEV4ZWN1dGUgYW4gT1NBIHNjcmlwdC4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgZm9yIHRoZSBjb21tYW5kCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ21pc2MnCisgICAgICAgIF9zdWJjb2RlID0gJ2Rvc2MnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7Cit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvSGlkZGVuX1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9IaWRkZW5fU3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MjY3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvSGlkZGVuX1N1aXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvSGlkZGVuX1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9IaWRkZW5fU3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MjY3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvSGlkZGVuX1N1aXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvTG9naW5fSXRlbXNfU3VpdGUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvTG9naW5fSXRlbXNfU3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwOTI0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Mb2dpbl9JdGVtc19TdWl0ZS5weQpAQCAtMCwwICsxLDc0IEBACisiIiJTdWl0ZSBMb2dpbiBJdGVtcyBTdWl0ZTogVGVybXMgYW5kIEV2ZW50cyBmb3IgY29udHJvbGxpbmcgdGhlIExvZ2luIEl0ZW1zIGFwcGxpY2F0aW9uCitMZXZlbCAxLCB2ZXJzaW9uIDEKKworR2VuZXJhdGVkIGZyb20gL1N5c3RlbS9MaWJyYXJ5L0NvcmVTZXJ2aWNlcy9TeXN0ZW0gRXZlbnRzLmFwcAorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMS8wLCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAnbG9naScKKworY2xhc3MgTG9naW5fSXRlbXNfU3VpdGVfRXZlbnRzOgorCisgICAgcGFzcworCisKK2NsYXNzIGxvZ2luX2l0ZW0oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJsb2dpbiBpdGVtIC0gYW4gaXRlbSB0byBiZSBsYXVuY2hlZCBvciBvcGVuZWQgYXQgbG9naW4gIiIiCisgICAgd2FudCA9ICdsb2dpJworY2xhc3MgX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiPEluaGVyaXRhbmNlPiAtIEFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3VwZXJjbGFzcy4gIiIiCisgICAgd2hpY2ggPSAnY0AjXicKKyAgICB3YW50ID0gJ2NvYmonCitjbGFzcyBfUHJvcF9oaWRkZW4oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImhpZGRlbiAtIElzIHRoZSBMb2dpbiBJdGVtIGhpZGRlbiB3aGVuIGxhdW5jaGVkPyAiIiIKKyAgICB3aGljaCA9ICdoaWRuJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2tpbmQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImtpbmQgLSB0aGUgZmlsZSB0eXBlIG9mIHRoZSBMb2dpbiBJdGVtICIiIgorICAgIHdoaWNoID0gJ2tpbmQnCisgICAgd2FudCA9ICd1dHh0JworY2xhc3MgX1Byb3BfbmFtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBMb2dpbiBJdGVtICIiIgorICAgIHdoaWNoID0gJ3BuYW0nCisgICAgd2FudCA9ICd1dHh0JworY2xhc3MgX1Byb3BfcGF0aChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicGF0aCAtIHRoZSBmaWxlIHN5c3RlbSBwYXRoIHRvIHRoZSBMb2dpbiBJdGVtICIiIgorICAgIHdoaWNoID0gJ3BwdGgnCisgICAgd2FudCA9ICd1dHh0JworCitsb2dpbl9pdGVtcyA9IGxvZ2luX2l0ZW0KK2ltcG9ydCBTdGFuZGFyZF9TdWl0ZQorbG9naW5faXRlbS5fc3VwZXJjbGFzc25hbWVzID0gWydpdGVtJ10KK2xvZ2luX2l0ZW0uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdoaWRkZW4nIDogX1Byb3BfaGlkZGVuLAorICAgICdraW5kJyA6IF9Qcm9wX2tpbmQsCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAncGF0aCcgOiBfUHJvcF9wYXRoLAorfQorbG9naW5faXRlbS5fcHJpdmVsZW1kaWN0ID0geworfQorCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKKyAgICAnbG9naScgOiBsb2dpbl9pdGVtLAorfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKKyAgICAnY0AjXicgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdoaWRuJyA6IF9Qcm9wX2hpZGRlbiwKKyAgICAna2luZCcgOiBfUHJvcF9raW5kLAorICAgICdwbmFtJyA6IF9Qcm9wX25hbWUsCisgICAgJ3BwdGgnIDogX1Byb3BfcGF0aCwKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19lbnVtZGVjbGFyYXRpb25zID0geworfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL0xvZ2luX0l0ZW1zX1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Mb2dpbl9JdGVtc19TdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3MzMxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Mb2dpbl9JdGVtc19TdWl0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL0xvZ2luX0l0ZW1zX1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Mb2dpbl9JdGVtc19TdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3MzMxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Mb2dpbl9JdGVtc19TdWl0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1Bvd2VyX1N1aXRlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1Bvd2VyX1N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTM5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvUG93ZXJfU3VpdGUucHkKQEAgLTAsMCArMSwxNDkgQEAKKyIiIlN1aXRlIFBvd2VyIFN1aXRlOiBUZXJtcyBhbmQgRXZlbnRzIGZvciBjb250cm9sbGluZyBTeXN0ZW0gcG93ZXIKK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbSBFdmVudHMuYXBwCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdwb3dyJworCitjbGFzcyBQb3dlcl9TdWl0ZV9FdmVudHM6CisKKyAgICBkZWYgcmVzdGFydChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIicmVzdGFydDogUmVzdGFydCB0aGUgY29tcHV0ZXIKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgZm9yIHRoZSBjb21tYW5kCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2ZuZHInCisgICAgICAgIF9zdWJjb2RlID0gJ3Jlc3QnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgc2h1dF9kb3duKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzaHV0IGRvd246IFNodXQgRG93biB0aGUgY29tcHV0ZXIKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgZm9yIHRoZSBjb21tYW5kCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2ZuZHInCisgICAgICAgIF9zdWJjb2RlID0gJ3NodXQnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgc2xlZXAoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNsZWVwOiBQdXQgdGhlIGNvbXB1dGVyIHRvIHNsZWVwCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGZvciB0aGUgY29tbWFuZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdmbmRyJworICAgICAgICBfc3ViY29kZSA9ICdzbGVwJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisKK2NsYXNzIGFwcGxpY2F0aW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYXBwbGljYXRpb24gLSBUaGUgU3lzdGVtIEV2ZW50cyBhcHBsaWNhdGlvbiAiIiIKKyAgICB3YW50ID0gJ2NhcHAnCitjbGFzcyBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiI8SW5oZXJpdGFuY2U+IC0gQWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzdXBlcmNsYXNzLiAiIiIKKyAgICB3aGljaCA9ICdjQCNeJworICAgIHdhbnQgPSAnY2FwcCcKK18zY19Jbmhlcml0YW5jZV8zZV8gPSBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfKCkKK2NsYXNzIF9Qcm9wX2ZvbGRlcl9hY3Rpb25zX2VuYWJsZWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZvbGRlciBhY3Rpb25zIGVuYWJsZWQgLSBBcmUgRm9sZGVyIEFjdGlvbnMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZD8gIiIiCisgICAgd2hpY2ggPSAnZmFlbicKKyAgICB3YW50ID0gJ2Jvb2wnCitmb2xkZXJfYWN0aW9uc19lbmFibGVkID0gX1Byb3BfZm9sZGVyX2FjdGlvbnNfZW5hYmxlZCgpCitjbGFzcyBfUHJvcF9wcm9wZXJ0aWVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwcm9wZXJ0aWVzIC0gZXZlcnkgcHJvcGVydHkgb2YgdGhlIFN5c3RlbSBFdmVudHMgYXBwbGljYXRpb24gIiIiCisgICAgd2hpY2ggPSAncEFMTCcKKyAgICB3YW50ID0gJyoqKionCitwcm9wZXJ0aWVzID0gX1Byb3BfcHJvcGVydGllcygpCisjICAgICAgICBlbGVtZW50ICdjZGlzJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjZm9sJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjb2JqJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjd2luJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCcsICdJRCAgJ10KKyMgICAgICAgIGVsZW1lbnQgJ2RvY3UnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2ZpbGUnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2ZvYWMnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2xvZ2knIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ3BjYXAnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ3BjZGEnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ3ByY3MnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKworYXBwbGljYXRpb25zID0gYXBwbGljYXRpb24KK2FwcGxpY2F0aW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQoraW1wb3J0IERpc2tfRm9sZGVyX0ZpbGVfU3VpdGUKK2ltcG9ydCBTdGFuZGFyZF9TdWl0ZQoraW1wb3J0IEZvbGRlcl9BY3Rpb25zX1N1aXRlCitpbXBvcnQgTG9naW5fSXRlbXNfU3VpdGUKK2ltcG9ydCBQcm9jZXNzZXNfU3VpdGUKK2FwcGxpY2F0aW9uLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnZm9sZGVyX2FjdGlvbnNfZW5hYmxlZCcgOiBfUHJvcF9mb2xkZXJfYWN0aW9uc19lbmFibGVkLAorICAgICdwcm9wZXJ0aWVzJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCit9CithcHBsaWNhdGlvbi5fcHJpdmVsZW1kaWN0ID0geworICAgICdhcHBsaWNhdGlvbl9wcm9jZXNzJyA6IFByb2Nlc3Nlc19TdWl0ZS5hcHBsaWNhdGlvbl9wcm9jZXNzLAorICAgICdkZXNrX2FjY2Vzc29yeV9wcm9jZXNzJyA6IFByb2Nlc3Nlc19TdWl0ZS5kZXNrX2FjY2Vzc29yeV9wcm9jZXNzLAorICAgICdkaXNrJyA6IERpc2tfRm9sZGVyX0ZpbGVfU3VpdGUuZGlzaywKKyAgICAnZG9jdW1lbnQnIDogU3RhbmRhcmRfU3VpdGUuZG9jdW1lbnQsCisgICAgJ2ZpbGUnIDogRGlza19Gb2xkZXJfRmlsZV9TdWl0ZS5maWxlLAorICAgICdmb2xkZXInIDogRGlza19Gb2xkZXJfRmlsZV9TdWl0ZS5mb2xkZXIsCisgICAgJ2ZvbGRlcl9hY3Rpb24nIDogRm9sZGVyX0FjdGlvbnNfU3VpdGUuZm9sZGVyX2FjdGlvbiwKKyAgICAnaXRlbScgOiBEaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLml0ZW0sCisgICAgJ2xvZ2luX2l0ZW0nIDogTG9naW5fSXRlbXNfU3VpdGUubG9naW5faXRlbSwKKyAgICAncHJvY2VzcycgOiBQcm9jZXNzZXNfU3VpdGUucHJvY2VzcywKKyAgICAnd2luZG93JyA6IFN0YW5kYXJkX1N1aXRlLndpbmRvdywKK30KKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2NhcHAnIDogYXBwbGljYXRpb24sCit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworICAgICdjQCNeJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2ZhZW4nIDogX1Byb3BfZm9sZGVyX2FjdGlvbnNfZW5hYmxlZCwKKyAgICAncEFMTCcgOiBfUHJvcF9wcm9wZXJ0aWVzLAorfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7Cit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvUG93ZXJfU3VpdGUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1Bvd2VyX1N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWEwNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1Bvd2VyX1N1aXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvUG93ZXJfU3VpdGUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1Bvd2VyX1N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWEwNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1Bvd2VyX1N1aXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvUHJvY2Vzc2VzX1N1aXRlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1Byb2Nlc3Nlc19TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGNiODVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1Byb2Nlc3Nlc19TdWl0ZS5weQpAQCAtMCwwICsxLDIxNCBAQAorIiIiU3VpdGUgUHJvY2Vzc2VzIFN1aXRlOiBUZXJtcyBhbmQgRXZlbnRzIGZvciBjb250cm9sbGluZyBQcm9jZXNzZXMKK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbSBFdmVudHMuYXBwCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICdwcmNzJworCitjbGFzcyBQcm9jZXNzZXNfU3VpdGVfRXZlbnRzOgorCisgICAgcGFzcworCisKK2NsYXNzIGFwcGxpY2F0aW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYXBwbGljYXRpb24gLSBUaGUgUHJvY2Vzc2VzIFN1aXRlIGhvc3QgcHJvZ3JhbSAiIiIKKyAgICB3YW50ID0gJ2NhcHAnCitjbGFzcyBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiI8SW5oZXJpdGFuY2U+IC0gQWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzdXBlcmNsYXNzLiAiIiIKKyAgICB3aGljaCA9ICdjQCNeJworICAgIHdhbnQgPSAnY2FwcCcKK18zY19Jbmhlcml0YW5jZV8zZV8gPSBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfKCkKK2NsYXNzIF9Qcm9wX2ZvbGRlcl9hY3Rpb25zX2VuYWJsZWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZvbGRlciBhY3Rpb25zIGVuYWJsZWQgLSBBcmUgRm9sZGVyIEFjdGlvbnMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZD8gIiIiCisgICAgd2hpY2ggPSAnZmFlbicKKyAgICB3YW50ID0gJ2Jvb2wnCitmb2xkZXJfYWN0aW9uc19lbmFibGVkID0gX1Byb3BfZm9sZGVyX2FjdGlvbnNfZW5hYmxlZCgpCitjbGFzcyBfUHJvcF9wcm9wZXJ0aWVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwcm9wZXJ0aWVzIC0gZXZlcnkgcHJvcGVydHkgb2YgdGhlIFByb2Nlc3NlcyBTdWl0ZSBob3N0IHByb2dyYW0gIiIiCisgICAgd2hpY2ggPSAncEFMTCcKKyAgICB3YW50ID0gJyoqKionCitwcm9wZXJ0aWVzID0gX1Byb3BfcHJvcGVydGllcygpCisjICAgICAgICBlbGVtZW50ICdjZGlzJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjZm9sJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjb2JqJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjd2luJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCcsICdJRCAgJ10KKyMgICAgICAgIGVsZW1lbnQgJ2RvY3UnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2ZpbGUnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2ZvYWMnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2xvZ2knIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ3BjYXAnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ3BjZGEnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ3ByY3MnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKworYXBwbGljYXRpb25zID0gYXBwbGljYXRpb24KKworY2xhc3MgYXBwbGljYXRpb25fcHJvY2VzcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImFwcGxpY2F0aW9uIHByb2Nlc3MgLSBBIHByb2Nlc3MgbGF1bmNoZWQgZnJvbSBhbiBhcHBsaWNhdGlvbiBmaWxlICIiIgorICAgIHdhbnQgPSAncGNhcCcKK2NsYXNzIF9Qcm9wX2FwcGxpY2F0aW9uX2ZpbGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImFwcGxpY2F0aW9uIGZpbGUgLSBhIHJlZmVyZW5jZSB0byB0aGUgYXBwbGljYXRpb24gZmlsZSBmcm9tIHdoaWNoIHRoaXMgcHJvY2VzcyB3YXMgbGF1bmNoZWQgIiIiCisgICAgd2hpY2ggPSAnYXBwZicKKyAgICB3YW50ID0gJyoqKionCisKK2FwcGxpY2F0aW9uX3Byb2Nlc3NlcyA9IGFwcGxpY2F0aW9uX3Byb2Nlc3MKKworY2xhc3MgZGVza19hY2Nlc3NvcnlfcHJvY2VzcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImRlc2sgYWNjZXNzb3J5IHByb2Nlc3MgLSBBIHByb2Nlc3MgbGF1bmNoZWQgZnJvbSBhbiBkZXNrIGFjY2Vzc29yeSBmaWxlICIiIgorICAgIHdhbnQgPSAncGNkYScKK2NsYXNzIF9Qcm9wX2Rlc2tfYWNjZXNzb3J5X2ZpbGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImRlc2sgYWNjZXNzb3J5IGZpbGUgLSBhIHJlZmVyZW5jZSB0byB0aGUgZGVzayBhY2Nlc3NvcnkgZmlsZSBmcm9tIHdoaWNoIHRoaXMgcHJvY2VzcyB3YXMgbGF1bmNoZWQgIiIiCisgICAgd2hpY2ggPSAnZGFmaScKKyAgICB3YW50ID0gJyoqKionCisKK2Rlc2tfYWNjZXNzb3J5X3Byb2Nlc3NlcyA9IGRlc2tfYWNjZXNzb3J5X3Byb2Nlc3MKKworY2xhc3MgcHJvY2VzcyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInByb2Nlc3MgLSBBIHByb2Nlc3MgcnVubmluZyBvbiB0aGlzIGNvbXB1dGVyICIiIgorICAgIHdhbnQgPSAncHJjcycKK2NsYXNzIF9Qcm9wX2FjY2VwdHNfaGlnaF9sZXZlbF9ldmVudHMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImFjY2VwdHMgaGlnaCBsZXZlbCBldmVudHMgLSBJcyB0aGUgcHJvY2VzcyBoaWdoLWxldmVsIGV2ZW50IGF3YXJlIChhY2NlcHRzIG9wZW4gYXBwbGljYXRpb24sIG9wZW4gZG9jdW1lbnQsIHByaW50IGRvY3VtZW50LCBhbmQgcXVpdCk/ICIiIgorICAgIHdoaWNoID0gJ2lzYWInCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfYWNjZXB0c19yZW1vdGVfZXZlbnRzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJhY2NlcHRzIHJlbW90ZSBldmVudHMgLSBEb2VzIHRoZSBwcm9jZXNzIGFjY2VwdCByZW1vdGUgZXZlbnRzPyAiIiIKKyAgICB3aGljaCA9ICdyZXZ0JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2NsYXNzaWMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNsYXNzaWMgLSBJcyB0aGUgcHJvY2VzcyBydW5uaW5nIGluIHRoZSBDbGFzc2ljIGVudmlyb25tZW50PyAiIiIKKyAgICB3aGljaCA9ICdjbHNjJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2NyZWF0b3JfdHlwZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY3JlYXRvciB0eXBlIC0gdGhlIE9TVHlwZSBvZiB0aGUgY3JlYXRvciBvZiB0aGUgcHJvY2VzcyAodGhlIHNpZ25hdHVyZSkgIiIiCisgICAgd2hpY2ggPSAnZmNydCcKKyAgICB3YW50ID0gJ3V0eHQnCitjbGFzcyBfUHJvcF9maWxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmaWxlIC0gdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgcHJvY2VzcyB3YXMgbGF1bmNoZWQgIiIiCisgICAgd2hpY2ggPSAnZmlsZScKKyAgICB3YW50ID0gJyoqKionCitjbGFzcyBfUHJvcF9maWxlX3R5cGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZpbGUgdHlwZSAtIHRoZSBPU1R5cGUgb2YgdGhlIGZpbGUgdHlwZSBvZiB0aGUgcHJvY2VzcyAiIiIKKyAgICB3aGljaCA9ICdhc3R5JworICAgIHdhbnQgPSAndXR4dCcKK2NsYXNzIF9Qcm9wX2Zyb250bW9zdChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZnJvbnRtb3N0IC0gSXMgdGhlIHByb2Nlc3MgdGhlIGZyb250bW9zdCBwcm9jZXNzICIiIgorICAgIHdoaWNoID0gJ3Bpc2YnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfaGFzX3NjcmlwdGluZ190ZXJtaW5vbG9neShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaGFzIHNjcmlwdGluZyB0ZXJtaW5vbG9neSAtIERvZXMgdGhlIHByb2Nlc3MgaGF2ZSBhIHNjcmlwdGluZyB0ZXJtaW5vbG9neSwgaS5lLiwgY2FuIGl0IGJlIHNjcmlwdGVkPyAiIiIKKyAgICB3aGljaCA9ICdoc2NyJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX25hbWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgcHJvY2VzcyAiIiIKKyAgICB3aGljaCA9ICdwbmFtJworICAgIHdhbnQgPSAndXR4dCcKK2NsYXNzIF9Qcm9wX3BhcnRpdGlvbl9zcGFjZV91c2VkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwYXJ0aXRpb24gc3BhY2UgdXNlZCAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IHVzZWQgaW4gdGhlIHByb2Nlc3MnIHBhcnRpdGlvbiAiIiIKKyAgICB3aGljaCA9ICdwdXNkJworICAgIHdhbnQgPSAnbWFnbicKK2NsYXNzIF9Qcm9wX3RvdGFsX3BhcnRpdGlvbl9zaXplKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ0b3RhbCBwYXJ0aXRpb24gc2l6ZSAtIHRoZSBzaXplIG9mIHRoZSBwYXJ0aXRpb24gd2l0aCB3aGljaCB0aGUgcHJvY2VzcyB3YXMgbGF1bmNoZWQgIiIiCisgICAgd2hpY2ggPSAnYXBwdCcKKyAgICB3YW50ID0gJ21hZ24nCitjbGFzcyBfUHJvcF92aXNpYmxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ2aXNpYmxlIC0gSXMgdGhlIHByb2Nlc3MnIGxheWVyIHZpc2libGU/ICIiIgorICAgIHdoaWNoID0gJ3B2aXMnCisgICAgd2FudCA9ICdib29sJworCitwcm9jZXNzZXMgPSBwcm9jZXNzCithcHBsaWNhdGlvbi5fc3VwZXJjbGFzc25hbWVzID0gW10KK2ltcG9ydCBEaXNrX0ZvbGRlcl9GaWxlX1N1aXRlCitpbXBvcnQgU3RhbmRhcmRfU3VpdGUKK2ltcG9ydCBGb2xkZXJfQWN0aW9uc19TdWl0ZQoraW1wb3J0IExvZ2luX0l0ZW1zX1N1aXRlCithcHBsaWNhdGlvbi5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2ZvbGRlcl9hY3Rpb25zX2VuYWJsZWQnIDogX1Byb3BfZm9sZGVyX2FjdGlvbnNfZW5hYmxlZCwKKyAgICAncHJvcGVydGllcycgOiBfUHJvcF9wcm9wZXJ0aWVzLAorfQorYXBwbGljYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnYXBwbGljYXRpb25fcHJvY2VzcycgOiBhcHBsaWNhdGlvbl9wcm9jZXNzLAorICAgICdkZXNrX2FjY2Vzc29yeV9wcm9jZXNzJyA6IGRlc2tfYWNjZXNzb3J5X3Byb2Nlc3MsCisgICAgJ2Rpc2snIDogRGlza19Gb2xkZXJfRmlsZV9TdWl0ZS5kaXNrLAorICAgICdkb2N1bWVudCcgOiBTdGFuZGFyZF9TdWl0ZS5kb2N1bWVudCwKKyAgICAnZmlsZScgOiBEaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLmZpbGUsCisgICAgJ2ZvbGRlcicgOiBEaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLmZvbGRlciwKKyAgICAnZm9sZGVyX2FjdGlvbicgOiBGb2xkZXJfQWN0aW9uc19TdWl0ZS5mb2xkZXJfYWN0aW9uLAorICAgICdpdGVtJyA6IERpc2tfRm9sZGVyX0ZpbGVfU3VpdGUuaXRlbSwKKyAgICAnbG9naW5faXRlbScgOiBMb2dpbl9JdGVtc19TdWl0ZS5sb2dpbl9pdGVtLAorICAgICdwcm9jZXNzJyA6IHByb2Nlc3MsCisgICAgJ3dpbmRvdycgOiBTdGFuZGFyZF9TdWl0ZS53aW5kb3csCit9CithcHBsaWNhdGlvbl9wcm9jZXNzLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ3Byb2Nlc3MnXQorYXBwbGljYXRpb25fcHJvY2Vzcy5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2FwcGxpY2F0aW9uX2ZpbGUnIDogX1Byb3BfYXBwbGljYXRpb25fZmlsZSwKK30KK2FwcGxpY2F0aW9uX3Byb2Nlc3MuX3ByaXZlbGVtZGljdCA9IHsKK30KK2Rlc2tfYWNjZXNzb3J5X3Byb2Nlc3MuX3N1cGVyY2xhc3NuYW1lcyA9IFsncHJvY2VzcyddCitkZXNrX2FjY2Vzc29yeV9wcm9jZXNzLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnZGVza19hY2Nlc3NvcnlfZmlsZScgOiBfUHJvcF9kZXNrX2FjY2Vzc29yeV9maWxlLAorfQorZGVza19hY2Nlc3NvcnlfcHJvY2Vzcy5fcHJpdmVsZW1kaWN0ID0geworfQorcHJvY2Vzcy5fc3VwZXJjbGFzc25hbWVzID0gWydpdGVtJ10KK3Byb2Nlc3MuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdhY2NlcHRzX2hpZ2hfbGV2ZWxfZXZlbnRzJyA6IF9Qcm9wX2FjY2VwdHNfaGlnaF9sZXZlbF9ldmVudHMsCisgICAgJ2FjY2VwdHNfcmVtb3RlX2V2ZW50cycgOiBfUHJvcF9hY2NlcHRzX3JlbW90ZV9ldmVudHMsCisgICAgJ2NsYXNzaWMnIDogX1Byb3BfY2xhc3NpYywKKyAgICAnY3JlYXRvcl90eXBlJyA6IF9Qcm9wX2NyZWF0b3JfdHlwZSwKKyAgICAnZmlsZScgOiBfUHJvcF9maWxlLAorICAgICdmaWxlX3R5cGUnIDogX1Byb3BfZmlsZV90eXBlLAorICAgICdmcm9udG1vc3QnIDogX1Byb3BfZnJvbnRtb3N0LAorICAgICdoYXNfc2NyaXB0aW5nX3Rlcm1pbm9sb2d5JyA6IF9Qcm9wX2hhc19zY3JpcHRpbmdfdGVybWlub2xvZ3ksCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAncGFydGl0aW9uX3NwYWNlX3VzZWQnIDogX1Byb3BfcGFydGl0aW9uX3NwYWNlX3VzZWQsCisgICAgJ3Byb3BlcnRpZXMnIDogX1Byb3BfcHJvcGVydGllcywKKyAgICAndG90YWxfcGFydGl0aW9uX3NpemUnIDogX1Byb3BfdG90YWxfcGFydGl0aW9uX3NpemUsCisgICAgJ3Zpc2libGUnIDogX1Byb3BfdmlzaWJsZSwKK30KK3Byb2Nlc3MuX3ByaXZlbGVtZGljdCA9IHsKK30KKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2NhcHAnIDogYXBwbGljYXRpb24sCisgICAgJ3BjYXAnIDogYXBwbGljYXRpb25fcHJvY2VzcywKKyAgICAncGNkYScgOiBkZXNrX2FjY2Vzc29yeV9wcm9jZXNzLAorICAgICdwcmNzJyA6IHByb2Nlc3MsCit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworICAgICdhcHBmJyA6IF9Qcm9wX2FwcGxpY2F0aW9uX2ZpbGUsCisgICAgJ2FwcHQnIDogX1Byb3BfdG90YWxfcGFydGl0aW9uX3NpemUsCisgICAgJ2FzdHknIDogX1Byb3BfZmlsZV90eXBlLAorICAgICdjQCNeJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2Nsc2MnIDogX1Byb3BfY2xhc3NpYywKKyAgICAnZGFmaScgOiBfUHJvcF9kZXNrX2FjY2Vzc29yeV9maWxlLAorICAgICdmYWVuJyA6IF9Qcm9wX2ZvbGRlcl9hY3Rpb25zX2VuYWJsZWQsCisgICAgJ2ZjcnQnIDogX1Byb3BfY3JlYXRvcl90eXBlLAorICAgICdmaWxlJyA6IF9Qcm9wX2ZpbGUsCisgICAgJ2hzY3InIDogX1Byb3BfaGFzX3NjcmlwdGluZ190ZXJtaW5vbG9neSwKKyAgICAnaXNhYicgOiBfUHJvcF9hY2NlcHRzX2hpZ2hfbGV2ZWxfZXZlbnRzLAorICAgICdwQUxMJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCisgICAgJ3Bpc2YnIDogX1Byb3BfZnJvbnRtb3N0LAorICAgICdwbmFtJyA6IF9Qcm9wX25hbWUsCisgICAgJ3B1c2QnIDogX1Byb3BfcGFydGl0aW9uX3NwYWNlX3VzZWQsCisgICAgJ3B2aXMnIDogX1Byb3BfdmlzaWJsZSwKKyAgICAncmV2dCcgOiBfUHJvcF9hY2NlcHRzX3JlbW90ZV9ldmVudHMsCit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Qcm9jZXNzZXNfU3VpdGUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1Byb2Nlc3Nlc19TdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmYTJiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Qcm9jZXNzZXNfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Qcm9jZXNzZXNfU3VpdGUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1Byb2Nlc3Nlc19TdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVmYTJiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9Qcm9jZXNzZXNfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9TdGFuZGFyZF9TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9TdGFuZGFyZF9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWMxNmMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1N0YW5kYXJkX1N1aXRlLnB5CkBAIC0wLDAgKzEsNTgyIEBACisiIiJTdWl0ZSBTdGFuZGFyZCBTdWl0ZTogQ29tbW9uIGNsYXNzZXMgYW5kIGNvbW1hbmRzIGZvciBtb3N0IGFwcGxpY2F0aW9ucy4KK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbSBFdmVudHMuYXBwCitBRVRFL0FFVVQgcmVzb3VyY2UgdmVyc2lvbiAxLzAsIGxhbmd1YWdlIDAsIHNjcmlwdCAwCisiIiIKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBNYWNPUworCitfY29kZSA9ICc/Pz8/JworCitjbGFzcyBTdGFuZGFyZF9TdWl0ZV9FdmVudHM6CisKKyAgICBfYXJnbWFwX2Nsb3NlID0geworICAgICAgICAnc2F2aW5nX2luJyA6ICdrZmlsJywKKyAgICAgICAgJ3NhdmluZycgOiAnc2F2bycsCisgICAgfQorCisgICAgZGVmIGNsb3NlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJjbG9zZTogQ2xvc2UgYW4gb2JqZWN0LgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzYXZpbmdfaW46IFRoZSBmaWxlIGluIHdoaWNoIHRvIHNhdmUgdGhlIG9iamVjdC4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzYXZpbmc6IFNwZWNpZmllcyB3aGV0aGVyIGNoYW5nZXMgc2hvdWxkIGJlIHNhdmVkIGJlZm9yZSBjbG9zaW5nLgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdjbG9zJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2Nsb3NlKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ3Nhdm8nLCBfRW51bV9zYXZvKQorCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9jb3VudCA9IHsKKyAgICAgICAgJ2VhY2gnIDogJ2tvY2wnLAorICAgIH0KKworICAgIGRlZiBjb3VudChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiY291bnQ6IFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGEgcGFydGljdWxhciBjbGFzcyB3aXRoaW4gYW4gb2JqZWN0LgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBlYWNoOiBUaGUgY2xhc3Mgb2Ygb2JqZWN0cyB0byBiZSBjb3VudGVkLgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRoZSByZXBseSBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2NudGUnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY291bnQpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiZGVsZXRlOiBEZWxldGUgYW4gb2JqZWN0LgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnZGVsbycKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfZHVwbGljYXRlID0geworICAgICAgICAndG8nIDogJ2luc2gnLAorICAgICAgICAnd2l0aF9wcm9wZXJ0aWVzJyA6ICdwcmR0JywKKyAgICB9CisKKyAgICBkZWYgZHVwbGljYXRlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJkdXBsaWNhdGU6IENvcHkgb2JqZWN0KHMpIGFuZCBwdXQgdGhlIGNvcGllcyBhdCBhIG5ldyBsb2NhdGlvbi4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgZm9yIHRoZSBjb21tYW5kCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG86IFRoZSBsb2NhdGlvbiBmb3IgdGhlIG5ldyBvYmplY3QocykuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgd2l0aF9wcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzIHRvIGJlIHNldCBpbiB0aGUgbmV3IGR1cGxpY2F0ZWQgb2JqZWN0KHMpLgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdjbG9uJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2R1cGxpY2F0ZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgZXhpc3RzKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJleGlzdHM6IFZlcmlmeSBpZiBhbiBvYmplY3QgZXhpc3RzLgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB0aGUgcmVwbHkgZm9yIHRoZSBjb21tYW5kCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdkb2V4JworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIGdldChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiZ2V0OiBHZXQgdGhlIGRhdGEgZm9yIGFuIG9iamVjdC4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgZm9yIHRoZSBjb21tYW5kCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdGhlIHJlcGx5IGZvciB0aGUgY29tbWFuZAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnZ2V0ZCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfbWFrZSA9IHsKKyAgICAgICAgJ2F0JyA6ICdpbnNoJywKKyAgICAgICAgJ25ldycgOiAna29jbCcsCisgICAgICAgICd3aXRoX2RhdGEnIDogJ2RhdGEnLAorICAgICAgICAnd2l0aF9wcm9wZXJ0aWVzJyA6ICdwcmR0JywKKyAgICB9CisKKyAgICBkZWYgbWFrZShzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJtYWtlOiBNYWtlIGEgbmV3IG9iamVjdC4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBhdDogVGhlIGxvY2F0aW9uIGF0IHdoaWNoIHRvIGluc2VydCB0aGUgb2JqZWN0LgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IG5ldzogVGhlIGNsYXNzIG9mIHRoZSBuZXcgb2JqZWN0LgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHdpdGhfZGF0YTogVGhlIGluaXRpYWwgZGF0YSBmb3IgdGhlIG9iamVjdC4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb3BlcnRpZXM6IFRoZSBpbml0aWFsIHZhbHVlcyBmb3IgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0LgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRoZSByZXBseSBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2NyZWwnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfbWFrZSkKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9tb3ZlID0geworICAgICAgICAndG8nIDogJ2luc2gnLAorICAgIH0KKworICAgIGRlZiBtb3ZlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJtb3ZlOiBNb3ZlIG9iamVjdChzKSB0byBhIG5ldyBsb2NhdGlvbi4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgZm9yIHRoZSBjb21tYW5kCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgdG86IFRoZSBuZXcgbG9jYXRpb24gZm9yIHRoZSBvYmplY3QocykuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ21vdmUnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfbW92ZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgb3BlbihzZWxmLCBfb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJvcGVuOiBPcGVuIGFuIG9iamVjdC4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGxpc3Qgb2Ygb2JqZWN0cworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhZXZ0JworICAgICAgICBfc3ViY29kZSA9ICdvZG9jJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIHByaW50XyhzZWxmLCBfb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJwcmludDogUHJpbnQgYW4gb2JqZWN0LgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogbGlzdCBvZiBvYmplY3RzCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ3Bkb2MnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX3F1aXQgPSB7CisgICAgICAgICdzYXZpbmcnIDogJ3Nhdm8nLAorICAgIH0KKworICAgIGRlZiBxdWl0KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJxdWl0OiBRdWl0IGFuIGFwcGxpY2F0aW9uLgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzYXZpbmc6IFNwZWNpZmllcyB3aGV0aGVyIGNoYW5nZXMgc2hvdWxkIGJlIHNhdmVkIGJlZm9yZSBxdWl0dGluZy4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYWV2dCcKKyAgICAgICAgX3N1YmNvZGUgPSAncXVpdCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9xdWl0KQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ3Nhdm8nLCBfRW51bV9zYXZvKQorCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9zYXZlID0geworICAgICAgICAnaW5fJyA6ICdrZmlsJywKKyAgICAgICAgJ2FzJyA6ICdmbHRwJywKKyAgICB9CisKKyAgICBkZWYgc2F2ZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIic2F2ZTogU2F2ZSBhbiBvYmplY3QuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGZvciB0aGUgY29tbWFuZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGluXzogVGhlIGZpbGUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgb2JqZWN0LgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGFzOiBUaGUgZmlsZSB0eXBlIGluIHdoaWNoIHRvIHNhdmUgdGhlIGRhdGEuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ3NhdmUnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2F2ZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX3NldCA9IHsKKyAgICAgICAgJ3RvJyA6ICdkYXRhJywKKyAgICB9CisKKyAgICBkZWYgc2V0KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzZXQ6IFNldCBhbiBvYmplY3QncyBkYXRhLgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB0bzogVGhlIG5ldyB2YWx1ZS4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnc2V0ZCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZXQpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisKK2NsYXNzIGFwcGxpY2F0aW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYXBwbGljYXRpb24gLSBBbiBhcHBsaWNhdGlvbidzIHRvcCBsZXZlbCBzY3JpcHRpbmcgb2JqZWN0LiAiIiIKKyAgICB3YW50ID0gJ2NhcHAnCitjbGFzcyBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiI8SW5oZXJpdGFuY2U+IC0gQWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzdXBlcmNsYXNzLiAiIiIKKyAgICB3aGljaCA9ICdjQCNeJworICAgIHdhbnQgPSAnY29iaicKK18zY19Jbmhlcml0YW5jZV8zZV8gPSBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfKCkKK2NsYXNzIF9Qcm9wX2Zyb250bW9zdChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZnJvbnRtb3N0IC0gSXMgdGhpcyB0aGUgZnJvbnRtb3N0IChhY3RpdmUpIGFwcGxpY2F0aW9uPyAiIiIKKyAgICB3aGljaCA9ICdwaXNmJworICAgIHdhbnQgPSAnYm9vbCcKK2Zyb250bW9zdCA9IF9Qcm9wX2Zyb250bW9zdCgpCitjbGFzcyBfUHJvcF9uYW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uLiAiIiIKKyAgICB3aGljaCA9ICdwbmFtJworICAgIHdhbnQgPSAndXR4dCcKK25hbWUgPSBfUHJvcF9uYW1lKCkKK2NsYXNzIF9Qcm9wX3ZlcnNpb24oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInZlcnNpb24gLSBUaGUgdmVyc2lvbiBvZiB0aGUgYXBwbGljYXRpb24uICIiIgorICAgIHdoaWNoID0gJ3ZlcnMnCisgICAgd2FudCA9ICd1dHh0JwordmVyc2lvbiA9IF9Qcm9wX3ZlcnNpb24oKQorIyAgICAgICAgZWxlbWVudCAnY3dpbicgYXMgWyduYW1lJywgJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnLCAnSUQgICddCisjICAgICAgICBlbGVtZW50ICdkb2N1JyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisKK2FwcGxpY2F0aW9ucyA9IGFwcGxpY2F0aW9uCisKK2NsYXNzIGl0ZW0oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJpdGVtIC0gQSBzY3JpcHRhYmxlIG9iamVjdC4gIiIiCisgICAgd2FudCA9ICdjb2JqJworY2xhc3MgX1Byb3BfY2xhc3NfKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjbGFzcyAtIFRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0LiAiIiIKKyAgICB3aGljaCA9ICdwY2xzJworICAgIHdhbnQgPSAndHlwZScKK2NsYXNzIF9Qcm9wX3Byb3BlcnRpZXMoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInByb3BlcnRpZXMgLSBBbGwgb2YgdGhlIG9iamVjdCdzIHByb3BlcnRpZXMuICIiIgorICAgIHdoaWNoID0gJ3BBTEwnCisgICAgd2FudCA9ICdyZWNvJworCitpdGVtcyA9IGl0ZW0KKworY2xhc3MgY29sb3IoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJjb2xvciAtIEEgY29sb3IuICIiIgorICAgIHdhbnQgPSAnY29scicKKworY29sb3JzID0gY29sb3IKKworY2xhc3Mgd2luZG93KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIid2luZG93IC0gQSB3aW5kb3cuICIiIgorICAgIHdhbnQgPSAnY3dpbicKK2NsYXNzIF9Qcm9wX2JvdW5kcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiYm91bmRzIC0gVGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBvZiB0aGUgd2luZG93LiAiIiIKKyAgICB3aGljaCA9ICdwYm5kJworICAgIHdhbnQgPSAncWRydCcKK2NsYXNzIF9Qcm9wX2Nsb3NlYWJsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY2xvc2VhYmxlIC0gV2hldGhlciB0aGUgd2luZG93IGhhcyBhIGNsb3NlIGJveC4gIiIiCisgICAgd2hpY2ggPSAnaGNsYicKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9kb2N1bWVudChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZG9jdW1lbnQgLSBUaGUgZG9jdW1lbnQgd2hvc2UgY29udGVudHMgYXJlIGJlaW5nIGRpc3BsYXllZCBpbiB0aGUgd2luZG93LiAiIiIKKyAgICB3aGljaCA9ICdkb2N1JworICAgIHdhbnQgPSAnZG9jdScKK2NsYXNzIF9Qcm9wX2Zsb2F0aW5nKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmbG9hdGluZyAtIFdoZXRoZXIgdGhlIHdpbmRvdyBmbG9hdHMuICIiIgorICAgIHdoaWNoID0gJ2lzZmwnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfaWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImlkIC0gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSB3aW5kb3cuICIiIgorICAgIHdoaWNoID0gJ0lEICAnCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3BfaW5kZXgoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSB3aW5kb3cgaW4gdGhlIGJhY2stdG8tZnJvbnQgd2luZG93IG9yZGVyaW5nLiAiIiIKKyAgICB3aGljaCA9ICdwaWR4JworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX21pbmlhdHVyaXphYmxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJtaW5pYXR1cml6YWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBjYW4gYmUgbWluaWF0dXJpemVkLiAiIiIKKyAgICB3aGljaCA9ICdpc21uJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX21pbmlhdHVyaXplZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibWluaWF0dXJpemVkIC0gV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSBtaW5pYXR1cml6ZWQuICIiIgorICAgIHdoaWNoID0gJ3BtbmQnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfbW9kYWwoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm1vZGFsIC0gV2hldGhlciB0aGUgd2luZG93IGlzIHRoZSBhcHBsaWNhdGlvbidzIGN1cnJlbnQgbW9kYWwgd2luZG93LiAiIiIKKyAgICB3aGljaCA9ICdwbW9kJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3Jlc2l6YWJsZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicmVzaXphYmxlIC0gV2hldGhlciB0aGUgd2luZG93IGNhbiBiZSByZXNpemVkLiAiIiIKKyAgICB3aGljaCA9ICdwcnN6JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3RpdGxlZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidGl0bGVkIC0gV2hldGhlciB0aGUgd2luZG93IGhhcyBhIHRpdGxlIGJhci4gIiIiCisgICAgd2hpY2ggPSAncHRpdCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF92aXNpYmxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ2aXNpYmxlIC0gV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSB2aXNpYmxlLiAiIiIKKyAgICB3aGljaCA9ICdwdmlzJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3pvb21hYmxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ6b29tYWJsZSAtIFdoZXRoZXIgdGhlIHdpbmRvdyBjYW4gYmUgem9vbWVkLiAiIiIKKyAgICB3aGljaCA9ICdpc3ptJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3pvb21lZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiem9vbWVkIC0gV2hldGhlciB0aGUgd2luZG93IGlzIGN1cnJlbnRseSB6b29tZWQuICIiIgorICAgIHdoaWNoID0gJ3B6dW0nCisgICAgd2FudCA9ICdib29sJworCit3aW5kb3dzID0gd2luZG93CisKK2NsYXNzIGRvY3VtZW50KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiZG9jdW1lbnQgLSBBIGRvY3VtZW50LiAiIiIKKyAgICB3YW50ID0gJ2RvY3UnCitjbGFzcyBfUHJvcF9tb2RpZmllZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibW9kaWZpZWQgLSBIYXMgdGhlIGRvY3VtZW50IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIGxhc3Qgc2F2ZT8gIiIiCisgICAgd2hpY2ggPSAnaW1vZCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9wYXRoKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwYXRoIC0gVGhlIGRvY3VtZW50J3MgcGF0aC4gIiIiCisgICAgd2hpY2ggPSAncHB0aCcKKyAgICB3YW50ID0gJ3V0eHQnCisKK2RvY3VtZW50cyA9IGRvY3VtZW50CithcHBsaWNhdGlvbi5fc3VwZXJjbGFzc25hbWVzID0gWydpdGVtJ10KK2FwcGxpY2F0aW9uLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnZnJvbnRtb3N0JyA6IF9Qcm9wX2Zyb250bW9zdCwKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorICAgICd2ZXJzaW9uJyA6IF9Qcm9wX3ZlcnNpb24sCit9CithcHBsaWNhdGlvbi5fcHJpdmVsZW1kaWN0ID0geworICAgICdkb2N1bWVudCcgOiBkb2N1bWVudCwKKyAgICAnd2luZG93JyA6IHdpbmRvdywKK30KK2l0ZW0uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitpdGVtLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ2NsYXNzXycgOiBfUHJvcF9jbGFzc18sCisgICAgJ3Byb3BlcnRpZXMnIDogX1Byb3BfcHJvcGVydGllcywKK30KK2l0ZW0uX3ByaXZlbGVtZGljdCA9IHsKK30KK2NvbG9yLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2l0ZW0nXQorY29sb3IuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorfQorY29sb3IuX3ByaXZlbGVtZGljdCA9IHsKK30KK3dpbmRvdy5fc3VwZXJjbGFzc25hbWVzID0gWydpdGVtJ10KK3dpbmRvdy5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2JvdW5kcycgOiBfUHJvcF9ib3VuZHMsCisgICAgJ2Nsb3NlYWJsZScgOiBfUHJvcF9jbG9zZWFibGUsCisgICAgJ2RvY3VtZW50JyA6IF9Qcm9wX2RvY3VtZW50LAorICAgICdmbG9hdGluZycgOiBfUHJvcF9mbG9hdGluZywKKyAgICAnaWQnIDogX1Byb3BfaWQsCisgICAgJ2luZGV4JyA6IF9Qcm9wX2luZGV4LAorICAgICdtaW5pYXR1cml6YWJsZScgOiBfUHJvcF9taW5pYXR1cml6YWJsZSwKKyAgICAnbWluaWF0dXJpemVkJyA6IF9Qcm9wX21pbmlhdHVyaXplZCwKKyAgICAnbW9kYWwnIDogX1Byb3BfbW9kYWwsCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAncmVzaXphYmxlJyA6IF9Qcm9wX3Jlc2l6YWJsZSwKKyAgICAndGl0bGVkJyA6IF9Qcm9wX3RpdGxlZCwKKyAgICAndmlzaWJsZScgOiBfUHJvcF92aXNpYmxlLAorICAgICd6b29tYWJsZScgOiBfUHJvcF96b29tYWJsZSwKKyAgICAnem9vbWVkJyA6IF9Qcm9wX3pvb21lZCwKK30KK3dpbmRvdy5fcHJpdmVsZW1kaWN0ID0geworfQorZG9jdW1lbnQuX3N1cGVyY2xhc3NuYW1lcyA9IFsnaXRlbSddCitkb2N1bWVudC5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ21vZGlmaWVkJyA6IF9Qcm9wX21vZGlmaWVkLAorICAgICduYW1lJyA6IF9Qcm9wX25hbWUsCisgICAgJ3BhdGgnIDogX1Byb3BfcGF0aCwKK30KK2RvY3VtZW50Ll9wcml2ZWxlbWRpY3QgPSB7Cit9CitjbGFzcyBfM2NfKGFldG9vbHMuTkNvbXBhcmlzb24pOgorICAgICIiIjwgLSBMZXNzIHRoYW4gIiIiCitjbGFzcyBfM2RfKGFldG9vbHMuTkNvbXBhcmlzb24pOgorICAgICIiIj0gLSBFcXVhbCAiIiIKK2NsYXNzIF8zZV8oYWV0b29scy5OQ29tcGFyaXNvbik6CisgICAgIiIiPiAtIEdyZWF0ZXIgdGhhbiAiIiIKK2NsYXNzIGNvbnRhaW5zKGFldG9vbHMuTkNvbXBhcmlzb24pOgorICAgICIiImNvbnRhaW5zIC0gQ29udGFpbnMgIiIiCitjbGFzcyBlbmRzX3dpdGgoYWV0b29scy5OQ29tcGFyaXNvbik6CisgICAgIiIiZW5kcyB3aXRoIC0gRW5kcyB3aXRoICIiIgorY2xhc3Mgc3RhcnRzX3dpdGgoYWV0b29scy5OQ29tcGFyaXNvbik6CisgICAgIiIic3RhcnRzIHdpdGggLSBTdGFydHMgd2l0aCAiIiIKK2NsYXNzIF9iMl8oYWV0b29scy5OQ29tcGFyaXNvbik6CisgICAgIiIiXHhiMiAtIExlc3MgdGhhbiBvciBlcXVhbCB0byAiIiIKK2NsYXNzIF9iM18oYWV0b29scy5OQ29tcGFyaXNvbik6CisgICAgIiIiXHhiMyAtIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAiIiIKK19FbnVtX3Nhdm8gPSB7CisgICAgJ2FzaycgOiAnYXNrICcsICAgICAjIEFzayB0aGUgdXNlciB3aGV0aGVyIG9yIG5vdCB0byBzYXZlIHRoZSBmaWxlLgorICAgICd5ZXMnIDogJ3llcyAnLCAgICAgIyBTYXZlIHRoZSBmaWxlLgorICAgICdubycgOiAnbm8gICcsICAgICAgIyBEbyBub3Qgc2F2ZSB0aGUgZmlsZS4KK30KKworCisjCisjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKKyMKK19jbGFzc2RlY2xhcmF0aW9ucyA9IHsKKyAgICAnY2FwcCcgOiBhcHBsaWNhdGlvbiwKKyAgICAnY29iaicgOiBpdGVtLAorICAgICdjb2xyJyA6IGNvbG9yLAorICAgICdjd2luJyA6IHdpbmRvdywKKyAgICAnZG9jdScgOiBkb2N1bWVudCwKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7CisgICAgJ0lEICAnIDogX1Byb3BfaWQsCisgICAgJ2NAI14nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnZG9jdScgOiBfUHJvcF9kb2N1bWVudCwKKyAgICAnaGNsYicgOiBfUHJvcF9jbG9zZWFibGUsCisgICAgJ2ltb2QnIDogX1Byb3BfbW9kaWZpZWQsCisgICAgJ2lzZmwnIDogX1Byb3BfZmxvYXRpbmcsCisgICAgJ2lzbW4nIDogX1Byb3BfbWluaWF0dXJpemFibGUsCisgICAgJ2lzem0nIDogX1Byb3Bfem9vbWFibGUsCisgICAgJ3BBTEwnIDogX1Byb3BfcHJvcGVydGllcywKKyAgICAncGJuZCcgOiBfUHJvcF9ib3VuZHMsCisgICAgJ3BjbHMnIDogX1Byb3BfY2xhc3NfLAorICAgICdwaWR4JyA6IF9Qcm9wX2luZGV4LAorICAgICdwaXNmJyA6IF9Qcm9wX2Zyb250bW9zdCwKKyAgICAncG1uZCcgOiBfUHJvcF9taW5pYXR1cml6ZWQsCisgICAgJ3Btb2QnIDogX1Byb3BfbW9kYWwsCisgICAgJ3BuYW0nIDogX1Byb3BfbmFtZSwKKyAgICAncHB0aCcgOiBfUHJvcF9wYXRoLAorICAgICdwcnN6JyA6IF9Qcm9wX3Jlc2l6YWJsZSwKKyAgICAncHRpdCcgOiBfUHJvcF90aXRsZWQsCisgICAgJ3B2aXMnIDogX1Byb3BfdmlzaWJsZSwKKyAgICAncHp1bScgOiBfUHJvcF96b29tZWQsCisgICAgJ3ZlcnMnIDogX1Byb3BfdmVyc2lvbiwKK30KKworX2NvbXBkZWNsYXJhdGlvbnMgPSB7CisgICAgJzwgICAnIDogXzNjXywKKyAgICAnPD0gICcgOiBfYjJfLAorICAgICc9ICAgJyA6IF8zZF8sCisgICAgJz4gICAnIDogXzNlXywKKyAgICAnPj0gICcgOiBfYjNfLAorICAgICdiZ3d0JyA6IHN0YXJ0c193aXRoLAorICAgICdjb250JyA6IGNvbnRhaW5zLAorICAgICdlbmRzJyA6IGVuZHNfd2l0aCwKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7CisgICAgJ3Nhdm8nIDogX0VudW1fc2F2bywKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9TdGFuZGFyZF9TdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvU3RhbmRhcmRfU3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2QyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvU3RhbmRhcmRfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9TdGFuZGFyZF9TdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvU3RhbmRhcmRfU3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzY2QyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvU3RhbmRhcmRfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9TeXN0ZW1fRXZlbnRzX1N1aXRlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzL1N5c3RlbV9FdmVudHNfU3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViNGJmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9TeXN0ZW1fRXZlbnRzX1N1aXRlLnB5CkBAIC0wLDAgKzEsMTA5IEBACisiIiJTdWl0ZSBTeXN0ZW0gRXZlbnRzIFN1aXRlOiBUZXJtcyBhbmQgRXZlbnRzIGZvciBjb250cm9sbGluZyB0aGUgU3lzdGVtIEV2ZW50cyBhcHBsaWNhdGlvbgorTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtIEV2ZW50cy5hcHAKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ3NldnMnCisKK2NsYXNzIFN5c3RlbV9FdmVudHNfU3VpdGVfRXZlbnRzOgorCisgICAgZGVmIGRvX3NjcmlwdChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiZG8gc2NyaXB0OiBFeGVjdXRlIGFuIE9TQSBzY3JpcHQuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGZvciB0aGUgY29tbWFuZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdtaXNjJworICAgICAgICBfc3ViY29kZSA9ICdkb3NjJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisKK2NsYXNzIGFwcGxpY2F0aW9uKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIiYXBwbGljYXRpb24gLSBUaGUgU3lzdGVtIEV2ZW50cyBhcHBsaWNhdGlvbiAiIiIKKyAgICB3YW50ID0gJ2NhcHAnCitjbGFzcyBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiI8SW5oZXJpdGFuY2U+IC0gQWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzdXBlcmNsYXNzLiAiIiIKKyAgICB3aGljaCA9ICdjQCNeJworICAgIHdhbnQgPSAnY2FwcCcKK18zY19Jbmhlcml0YW5jZV8zZV8gPSBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfKCkKK2NsYXNzIF9Qcm9wX2ZvbGRlcl9hY3Rpb25zX2VuYWJsZWQoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZvbGRlciBhY3Rpb25zIGVuYWJsZWQgLSBBcmUgRm9sZGVyIEFjdGlvbnMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZD8gIiIiCisgICAgd2hpY2ggPSAnZmFlbicKKyAgICB3YW50ID0gJ2Jvb2wnCitmb2xkZXJfYWN0aW9uc19lbmFibGVkID0gX1Byb3BfZm9sZGVyX2FjdGlvbnNfZW5hYmxlZCgpCitjbGFzcyBfUHJvcF9wcm9wZXJ0aWVzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwcm9wZXJ0aWVzIC0gZXZlcnkgcHJvcGVydHkgb2YgdGhlIFN5c3RlbSBFdmVudHMgYXBwbGljYXRpb24gIiIiCisgICAgd2hpY2ggPSAncEFMTCcKKyAgICB3YW50ID0gJyoqKionCitwcm9wZXJ0aWVzID0gX1Byb3BfcHJvcGVydGllcygpCisjICAgICAgICBlbGVtZW50ICdjZGlzJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjZm9sJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjb2JqJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjd2luJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCcsICdJRCAgJ10KKyMgICAgICAgIGVsZW1lbnQgJ2RvY3UnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2ZpbGUnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2ZvYWMnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2xvZ2knIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ3BjYXAnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ3BjZGEnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ3ByY3MnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKworYXBwbGljYXRpb25zID0gYXBwbGljYXRpb24KK2FwcGxpY2F0aW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbXQoraW1wb3J0IERpc2tfRm9sZGVyX0ZpbGVfU3VpdGUKK2ltcG9ydCBTdGFuZGFyZF9TdWl0ZQoraW1wb3J0IEZvbGRlcl9BY3Rpb25zX1N1aXRlCitpbXBvcnQgTG9naW5fSXRlbXNfU3VpdGUKK2ltcG9ydCBQcm9jZXNzZXNfU3VpdGUKK2FwcGxpY2F0aW9uLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnZm9sZGVyX2FjdGlvbnNfZW5hYmxlZCcgOiBfUHJvcF9mb2xkZXJfYWN0aW9uc19lbmFibGVkLAorICAgICdwcm9wZXJ0aWVzJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCit9CithcHBsaWNhdGlvbi5fcHJpdmVsZW1kaWN0ID0geworICAgICdhcHBsaWNhdGlvbl9wcm9jZXNzJyA6IFByb2Nlc3Nlc19TdWl0ZS5hcHBsaWNhdGlvbl9wcm9jZXNzLAorICAgICdkZXNrX2FjY2Vzc29yeV9wcm9jZXNzJyA6IFByb2Nlc3Nlc19TdWl0ZS5kZXNrX2FjY2Vzc29yeV9wcm9jZXNzLAorICAgICdkaXNrJyA6IERpc2tfRm9sZGVyX0ZpbGVfU3VpdGUuZGlzaywKKyAgICAnZG9jdW1lbnQnIDogU3RhbmRhcmRfU3VpdGUuZG9jdW1lbnQsCisgICAgJ2ZpbGUnIDogRGlza19Gb2xkZXJfRmlsZV9TdWl0ZS5maWxlLAorICAgICdmb2xkZXInIDogRGlza19Gb2xkZXJfRmlsZV9TdWl0ZS5mb2xkZXIsCisgICAgJ2ZvbGRlcl9hY3Rpb24nIDogRm9sZGVyX0FjdGlvbnNfU3VpdGUuZm9sZGVyX2FjdGlvbiwKKyAgICAnaXRlbScgOiBEaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLml0ZW0sCisgICAgJ2xvZ2luX2l0ZW0nIDogTG9naW5fSXRlbXNfU3VpdGUubG9naW5faXRlbSwKKyAgICAncHJvY2VzcycgOiBQcm9jZXNzZXNfU3VpdGUucHJvY2VzcywKKyAgICAnd2luZG93JyA6IFN0YW5kYXJkX1N1aXRlLndpbmRvdywKK30KKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2NhcHAnIDogYXBwbGljYXRpb24sCit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworICAgICdjQCNeJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2ZhZW4nIDogX1Byb3BfZm9sZGVyX2FjdGlvbnNfZW5hYmxlZCwKKyAgICAncEFMTCcgOiBfUHJvcF9wcm9wZXJ0aWVzLAorfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7Cit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvU3lzdGVtX0V2ZW50c19TdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvU3lzdGVtX0V2ZW50c19TdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwNzY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9TeXN0ZW1fRXZlbnRzX1N1aXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvU3lzdGVtX0V2ZW50c19TdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvU3lzdGVtX0V2ZW50c19TdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwNzY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9TeXN0ZW1fRXZlbnRzX1N1aXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvVGV4dF9TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9UZXh0X1N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMTA5ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvVGV4dF9TdWl0ZS5weQpAQCAtMCwwICsxLDE5NSBAQAorIiIiU3VpdGUgVGV4dCBTdWl0ZTogQSBzZXQgb2YgYmFzaWMgY2xhc3NlcyBmb3IgdGV4dCBwcm9jZXNzaW5nLgorTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtIEV2ZW50cy5hcHAKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJz8/Pz8nCisKK2NsYXNzIFRleHRfU3VpdGVfRXZlbnRzOgorCisgICAgcGFzcworCisKK2NsYXNzIGF0dGFjaG1lbnQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJhdHRhY2htZW50IC0gUmVwcmVzZW50cyBhbiBpbmxpbmUgdGV4dCBhdHRhY2htZW50LiAgVGhpcyBjbGFzcyBpcyB1c2VkIG1haW5seSBmb3IgbWFrZSBjb21tYW5kcy4gIiIiCisgICAgd2FudCA9ICdhdHRzJworY2xhc3MgX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiPEluaGVyaXRhbmNlPiAtIEFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3VwZXJjbGFzcy4gIiIiCisgICAgd2hpY2ggPSAnY0AjXicKKyAgICB3YW50ID0gJ2N0eHQnCitjbGFzcyBfUHJvcF9maWxlX25hbWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZpbGUgbmFtZSAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIGZvciB0aGUgYXR0YWNobWVudCAiIiIKKyAgICB3aGljaCA9ICdhdGZuJworICAgIHdhbnQgPSAndXR4dCcKKyMgICAgICAgIGVsZW1lbnQgJ2NhdHInIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjaGEgJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY3BhcicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2N3b3InIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisKK2NsYXNzIGF0dHJpYnV0ZV9ydW4oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJhdHRyaWJ1dGUgcnVuIC0gVGhpcyBzdWJkaXZpZGVzIHRoZSB0ZXh0IGludG8gY2h1bmtzIHRoYXQgYWxsIGhhdmUgdGhlIHNhbWUgYXR0cmlidXRlcy4gIiIiCisgICAgd2FudCA9ICdjYXRyJworY2xhc3MgX1Byb3BfY29sb3IoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNvbG9yIC0gVGhlIGNvbG9yIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICIiIgorICAgIHdoaWNoID0gJ2NvbHInCisgICAgd2FudCA9ICdjb2xyJworY2xhc3MgX1Byb3BfZm9udChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZm9udCAtIFRoZSBuYW1lIG9mIHRoZSBmb250IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICIiIgorICAgIHdoaWNoID0gJ2ZvbnQnCisgICAgd2FudCA9ICd1dHh0JworY2xhc3MgX1Byb3Bfc2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIic2l6ZSAtIFRoZSBzaXplIGluIHBvaW50cyBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLiAiIiIKKyAgICB3aGljaCA9ICdwdHN6JworICAgIHdhbnQgPSAnbG9uZycKKyMgICAgICAgIGVsZW1lbnQgJ2NhdHInIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjaGEgJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY3BhcicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2N3b3InIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisKK2F0dHJpYnV0ZV9ydW5zID0gYXR0cmlidXRlX3J1bgorCitjbGFzcyBjaGFyYWN0ZXIoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJjaGFyYWN0ZXIgLSBUaGlzIHN1YmRpdmlkZXMgdGhlIHRleHQgaW50byBjaGFyYWN0ZXJzLiAiIiIKKyAgICB3YW50ID0gJ2NoYSAnCisjICAgICAgICBlbGVtZW50ICdjYXRyJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY2hhICcgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NwYXInIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjd29yJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorCitjaGFyYWN0ZXJzID0gY2hhcmFjdGVyCisKK2NsYXNzIHBhcmFncmFwaChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInBhcmFncmFwaCAtIFRoaXMgc3ViZGl2aWRlcyB0aGUgdGV4dCBpbnRvIHBhcmFncmFwaHMuICIiIgorICAgIHdhbnQgPSAnY3BhcicKKyMgICAgICAgIGVsZW1lbnQgJ2NhdHInIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjaGEgJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY3BhcicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2N3b3InIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisKK3BhcmFncmFwaHMgPSBwYXJhZ3JhcGgKKworY2xhc3MgdGV4dChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiInRleHQgLSBSaWNoIChzdHlsZWQpIHRleHQgIiIiCisgICAgd2FudCA9ICdjdHh0JworIyAgICAgICAgZWxlbWVudCAnY2F0cicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NoYSAnIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjcGFyJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY3dvcicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKworY2xhc3Mgd29yZChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIndvcmQgLSBUaGlzIHN1YmRpdmlkZXMgdGhlIHRleHQgaW50byB3b3Jkcy4gIiIiCisgICAgd2FudCA9ICdjd29yJworIyAgICAgICAgZWxlbWVudCAnY2F0cicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NoYSAnIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjcGFyJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY3dvcicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKword29yZHMgPSB3b3JkCithdHRhY2htZW50Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ3RleHQnXQorYXR0YWNobWVudC5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2ZpbGVfbmFtZScgOiBfUHJvcF9maWxlX25hbWUsCit9CithdHRhY2htZW50Ll9wcml2ZWxlbWRpY3QgPSB7CisgICAgJ2F0dHJpYnV0ZV9ydW4nIDogYXR0cmlidXRlX3J1biwKKyAgICAnY2hhcmFjdGVyJyA6IGNoYXJhY3RlciwKKyAgICAncGFyYWdyYXBoJyA6IHBhcmFncmFwaCwKKyAgICAnd29yZCcgOiB3b3JkLAorfQoraW1wb3J0IFN0YW5kYXJkX1N1aXRlCithdHRyaWJ1dGVfcnVuLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2l0ZW0nXQorYXR0cmlidXRlX3J1bi5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2NvbG9yJyA6IF9Qcm9wX2NvbG9yLAorICAgICdmb250JyA6IF9Qcm9wX2ZvbnQsCisgICAgJ3NpemUnIDogX1Byb3Bfc2l6ZSwKK30KK2F0dHJpYnV0ZV9ydW4uX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnYXR0cmlidXRlX3J1bicgOiBhdHRyaWJ1dGVfcnVuLAorICAgICdjaGFyYWN0ZXInIDogY2hhcmFjdGVyLAorICAgICdwYXJhZ3JhcGgnIDogcGFyYWdyYXBoLAorICAgICd3b3JkJyA6IHdvcmQsCit9CitjaGFyYWN0ZXIuX3N1cGVyY2xhc3NuYW1lcyA9IFsnaXRlbSddCitjaGFyYWN0ZXIuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdjb2xvcicgOiBfUHJvcF9jb2xvciwKKyAgICAnZm9udCcgOiBfUHJvcF9mb250LAorICAgICdzaXplJyA6IF9Qcm9wX3NpemUsCit9CitjaGFyYWN0ZXIuX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnYXR0cmlidXRlX3J1bicgOiBhdHRyaWJ1dGVfcnVuLAorICAgICdjaGFyYWN0ZXInIDogY2hhcmFjdGVyLAorICAgICdwYXJhZ3JhcGgnIDogcGFyYWdyYXBoLAorICAgICd3b3JkJyA6IHdvcmQsCit9CitwYXJhZ3JhcGguX3N1cGVyY2xhc3NuYW1lcyA9IFsnaXRlbSddCitwYXJhZ3JhcGguX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdjb2xvcicgOiBfUHJvcF9jb2xvciwKKyAgICAnZm9udCcgOiBfUHJvcF9mb250LAorICAgICdzaXplJyA6IF9Qcm9wX3NpemUsCit9CitwYXJhZ3JhcGguX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnYXR0cmlidXRlX3J1bicgOiBhdHRyaWJ1dGVfcnVuLAorICAgICdjaGFyYWN0ZXInIDogY2hhcmFjdGVyLAorICAgICdwYXJhZ3JhcGgnIDogcGFyYWdyYXBoLAorICAgICd3b3JkJyA6IHdvcmQsCit9Cit0ZXh0Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ2l0ZW0nXQordGV4dC5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2NvbG9yJyA6IF9Qcm9wX2NvbG9yLAorICAgICdmb250JyA6IF9Qcm9wX2ZvbnQsCisgICAgJ3NpemUnIDogX1Byb3Bfc2l6ZSwKK30KK3RleHQuX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnYXR0cmlidXRlX3J1bicgOiBhdHRyaWJ1dGVfcnVuLAorICAgICdjaGFyYWN0ZXInIDogY2hhcmFjdGVyLAorICAgICdwYXJhZ3JhcGgnIDogcGFyYWdyYXBoLAorICAgICd3b3JkJyA6IHdvcmQsCit9Cit3b3JkLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2l0ZW0nXQord29yZC5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2NvbG9yJyA6IF9Qcm9wX2NvbG9yLAorICAgICdmb250JyA6IF9Qcm9wX2ZvbnQsCisgICAgJ3NpemUnIDogX1Byb3Bfc2l6ZSwKK30KK3dvcmQuX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnYXR0cmlidXRlX3J1bicgOiBhdHRyaWJ1dGVfcnVuLAorICAgICdjaGFyYWN0ZXInIDogY2hhcmFjdGVyLAorICAgICdwYXJhZ3JhcGgnIDogcGFyYWdyYXBoLAorICAgICd3b3JkJyA6IHdvcmQsCit9CisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdhdHRzJyA6IGF0dGFjaG1lbnQsCisgICAgJ2NhdHInIDogYXR0cmlidXRlX3J1biwKKyAgICAnY2hhICcgOiBjaGFyYWN0ZXIsCisgICAgJ2NwYXInIDogcGFyYWdyYXBoLAorICAgICdjdHh0JyA6IHRleHQsCisgICAgJ2N3b3InIDogd29yZCwKK30KKworX3Byb3BkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2F0Zm4nIDogX1Byb3BfZmlsZV9uYW1lLAorICAgICdjQCNeJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2NvbHInIDogX1Byb3BfY29sb3IsCisgICAgJ2ZvbnQnIDogX1Byb3BfZm9udCwKKyAgICAncHRzeicgOiBfUHJvcF9zaXplLAorfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7Cit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvVGV4dF9TdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvVGV4dF9TdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3NDllNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9UZXh0X1N1aXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvVGV4dF9TdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvVGV4dF9TdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y3NDllNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9UZXh0X1N1aXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjZTI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDE0NCBAQAorIiIiCitQYWNrYWdlIGdlbmVyYXRlZCBmcm9tIC9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtIEV2ZW50cy5hcHAKKyIiIgorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIFN5c3RlbUV2ZW50cyBwYWNrYWdlIGlzIHJlbW92ZWQuIiwgc3RhY2tsZXZlbD0yKQorCitpbXBvcnQgYWV0b29scworRXJyb3IgPSBhZXRvb2xzLkVycm9yCitpbXBvcnQgU3RhbmRhcmRfU3VpdGUKK2ltcG9ydCBUZXh0X1N1aXRlCitpbXBvcnQgRGlza19Gb2xkZXJfRmlsZV9TdWl0ZQoraW1wb3J0IEZvbGRlcl9BY3Rpb25zX1N1aXRlCitpbXBvcnQgTG9naW5fSXRlbXNfU3VpdGUKK2ltcG9ydCBQb3dlcl9TdWl0ZQoraW1wb3J0IFByb2Nlc3Nlc19TdWl0ZQoraW1wb3J0IFN5c3RlbV9FdmVudHNfU3VpdGUKKworCitfY29kZV90b19tb2R1bGUgPSB7CisgICAgJz8/Pz8nIDogU3RhbmRhcmRfU3VpdGUsCisgICAgJz8/Pz8nIDogVGV4dF9TdWl0ZSwKKyAgICAnY2RpcycgOiBEaXNrX0ZvbGRlcl9GaWxlX1N1aXRlLAorICAgICdmYWNvJyA6IEZvbGRlcl9BY3Rpb25zX1N1aXRlLAorICAgICdsb2dpJyA6IExvZ2luX0l0ZW1zX1N1aXRlLAorICAgICdwb3dyJyA6IFBvd2VyX1N1aXRlLAorICAgICdwcmNzJyA6IFByb2Nlc3Nlc19TdWl0ZSwKKyAgICAnc2V2cycgOiBTeXN0ZW1fRXZlbnRzX1N1aXRlLAorfQorCisKKworX2NvZGVfdG9fZnVsbG5hbWUgPSB7CisgICAgJz8/Pz8nIDogKCdTeXN0ZW1FdmVudHMuU3RhbmRhcmRfU3VpdGUnLCAnU3RhbmRhcmRfU3VpdGUnKSwKKyAgICAnPz8/PycgOiAoJ1N5c3RlbUV2ZW50cy5UZXh0X1N1aXRlJywgJ1RleHRfU3VpdGUnKSwKKyAgICAnY2RpcycgOiAoJ1N5c3RlbUV2ZW50cy5EaXNrX0ZvbGRlcl9GaWxlX1N1aXRlJywgJ0Rpc2tfRm9sZGVyX0ZpbGVfU3VpdGUnKSwKKyAgICAnZmFjbycgOiAoJ1N5c3RlbUV2ZW50cy5Gb2xkZXJfQWN0aW9uc19TdWl0ZScsICdGb2xkZXJfQWN0aW9uc19TdWl0ZScpLAorICAgICdsb2dpJyA6ICgnU3lzdGVtRXZlbnRzLkxvZ2luX0l0ZW1zX1N1aXRlJywgJ0xvZ2luX0l0ZW1zX1N1aXRlJyksCisgICAgJ3Bvd3InIDogKCdTeXN0ZW1FdmVudHMuUG93ZXJfU3VpdGUnLCAnUG93ZXJfU3VpdGUnKSwKKyAgICAncHJjcycgOiAoJ1N5c3RlbUV2ZW50cy5Qcm9jZXNzZXNfU3VpdGUnLCAnUHJvY2Vzc2VzX1N1aXRlJyksCisgICAgJ3NldnMnIDogKCdTeXN0ZW1FdmVudHMuU3lzdGVtX0V2ZW50c19TdWl0ZScsICdTeXN0ZW1fRXZlbnRzX1N1aXRlJyksCit9CisKK2Zyb20gU3RhbmRhcmRfU3VpdGUgaW1wb3J0ICoKK2Zyb20gVGV4dF9TdWl0ZSBpbXBvcnQgKgorZnJvbSBEaXNrX0ZvbGRlcl9GaWxlX1N1aXRlIGltcG9ydCAqCitmcm9tIEZvbGRlcl9BY3Rpb25zX1N1aXRlIGltcG9ydCAqCitmcm9tIExvZ2luX0l0ZW1zX1N1aXRlIGltcG9ydCAqCitmcm9tIFBvd2VyX1N1aXRlIGltcG9ydCAqCitmcm9tIFByb2Nlc3Nlc19TdWl0ZSBpbXBvcnQgKgorZnJvbSBTeXN0ZW1fRXZlbnRzX1N1aXRlIGltcG9ydCAqCisKK2RlZiBnZXRiYXNlY2xhc3Nlcyh2KToKKyAgICBpZiBub3QgZ2V0YXR0cih2LCAnX3Byb3BkaWN0JywgTm9uZSk6CisgICAgICAgIHYuX3Byb3BkaWN0ID0ge30KKyAgICAgICAgdi5fZWxlbWRpY3QgPSB7fQorICAgICAgICBmb3Igc3VwZXJjbGFzc25hbWUgaW4gZ2V0YXR0cih2LCAnX3N1cGVyY2xhc3NuYW1lcycsIFtdKToKKyAgICAgICAgICAgIHN1cGVyY2xhc3MgPSBldmFsKHN1cGVyY2xhc3NuYW1lKQorICAgICAgICAgICAgZ2V0YmFzZWNsYXNzZXMoc3VwZXJjbGFzcykKKyAgICAgICAgICAgIHYuX3Byb3BkaWN0LnVwZGF0ZShnZXRhdHRyKHN1cGVyY2xhc3MsICdfcHJvcGRpY3QnLCB7fSkpCisgICAgICAgICAgICB2Ll9lbGVtZGljdC51cGRhdGUoZ2V0YXR0cihzdXBlcmNsYXNzLCAnX2VsZW1kaWN0Jywge30pKQorICAgICAgICB2Ll9wcm9wZGljdC51cGRhdGUoZ2V0YXR0cih2LCAnX3ByaXZwcm9wZGljdCcsIHt9KSkKKyAgICAgICAgdi5fZWxlbWRpY3QudXBkYXRlKGdldGF0dHIodiwgJ19wcml2ZWxlbWRpY3QnLCB7fSkpCisKK2ltcG9ydCBTdGRTdWl0ZXMKKworIworIyBTZXQgcHJvcGVydHkgYW5kIGVsZW1lbnQgZGljdGlvbmFyaWVzIG5vdyB0aGF0IGFsbCBjbGFzc2VzIGhhdmUgYmVlbiBkZWZpbmVkCisjCitnZXRiYXNlY2xhc3Nlcyhsb2dpbl9pdGVtKQorZ2V0YmFzZWNsYXNzZXMoY29sb3IpCitnZXRiYXNlY2xhc3Nlcyh3aW5kb3cpCitnZXRiYXNlY2xhc3NlcyhhcHBsaWNhdGlvbikKK2dldGJhc2VjbGFzc2VzKGl0ZW0pCitnZXRiYXNlY2xhc3Nlcyhkb2N1bWVudCkKK2dldGJhc2VjbGFzc2VzKGNoYXJhY3RlcikKK2dldGJhc2VjbGFzc2VzKGF0dGFjaG1lbnQpCitnZXRiYXNlY2xhc3NlcyhwYXJhZ3JhcGgpCitnZXRiYXNlY2xhc3Nlcyh3b3JkKQorZ2V0YmFzZWNsYXNzZXMoYXR0cmlidXRlX3J1bikKK2dldGJhc2VjbGFzc2VzKHRleHQpCitnZXRiYXNlY2xhc3NlcyhmaWxlKQorZ2V0YmFzZWNsYXNzZXMoYXBwbGljYXRpb24pCitnZXRiYXNlY2xhc3NlcyhpdGVtKQorZ2V0YmFzZWNsYXNzZXMoZm9sZGVyKQorZ2V0YmFzZWNsYXNzZXMoZGlzaykKK2dldGJhc2VjbGFzc2VzKHNjcmlwdCkKK2dldGJhc2VjbGFzc2VzKGFwcGxpY2F0aW9uKQorZ2V0YmFzZWNsYXNzZXMoZm9sZGVyX2FjdGlvbikKK2dldGJhc2VjbGFzc2VzKGFwcGxpY2F0aW9uKQorZ2V0YmFzZWNsYXNzZXMoYXBwbGljYXRpb24pCitnZXRiYXNlY2xhc3Nlcyhwcm9jZXNzKQorZ2V0YmFzZWNsYXNzZXMoYXBwbGljYXRpb25fcHJvY2VzcykKK2dldGJhc2VjbGFzc2VzKGRlc2tfYWNjZXNzb3J5X3Byb2Nlc3MpCitnZXRiYXNlY2xhc3NlcyhhcHBsaWNhdGlvbikKKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2xvZ2knIDogbG9naW5faXRlbSwKKyAgICAnY29scicgOiBjb2xvciwKKyAgICAnY3dpbicgOiB3aW5kb3csCisgICAgJ2NhcHAnIDogYXBwbGljYXRpb24sCisgICAgJ2NvYmonIDogaXRlbSwKKyAgICAnZG9jdScgOiBkb2N1bWVudCwKKyAgICAnY2hhICcgOiBjaGFyYWN0ZXIsCisgICAgJ2F0dHMnIDogYXR0YWNobWVudCwKKyAgICAnY3BhcicgOiBwYXJhZ3JhcGgsCisgICAgJ2N3b3InIDogd29yZCwKKyAgICAnY2F0cicgOiBhdHRyaWJ1dGVfcnVuLAorICAgICdjdHh0JyA6IHRleHQsCisgICAgJ2ZpbGUnIDogZmlsZSwKKyAgICAnY2FwcCcgOiBhcHBsaWNhdGlvbiwKKyAgICAnY29iaicgOiBpdGVtLAorICAgICdjZm9sJyA6IGZvbGRlciwKKyAgICAnY2RpcycgOiBkaXNrLAorICAgICdzY3B0JyA6IHNjcmlwdCwKKyAgICAnY2FwcCcgOiBhcHBsaWNhdGlvbiwKKyAgICAnZm9hYycgOiBmb2xkZXJfYWN0aW9uLAorICAgICdjYXBwJyA6IGFwcGxpY2F0aW9uLAorICAgICdjYXBwJyA6IGFwcGxpY2F0aW9uLAorICAgICdwcmNzJyA6IHByb2Nlc3MsCisgICAgJ3BjYXAnIDogYXBwbGljYXRpb25fcHJvY2VzcywKKyAgICAncGNkYScgOiBkZXNrX2FjY2Vzc29yeV9wcm9jZXNzLAorICAgICdjYXBwJyA6IGFwcGxpY2F0aW9uLAorfQorCisKK2NsYXNzIFN5c3RlbUV2ZW50cyhTdGFuZGFyZF9TdWl0ZV9FdmVudHMsCisgICAgICAgIFRleHRfU3VpdGVfRXZlbnRzLAorICAgICAgICBEaXNrX0ZvbGRlcl9GaWxlX1N1aXRlX0V2ZW50cywKKyAgICAgICAgRm9sZGVyX0FjdGlvbnNfU3VpdGVfRXZlbnRzLAorICAgICAgICBMb2dpbl9JdGVtc19TdWl0ZV9FdmVudHMsCisgICAgICAgIFBvd2VyX1N1aXRlX0V2ZW50cywKKyAgICAgICAgUHJvY2Vzc2VzX1N1aXRlX0V2ZW50cywKKyAgICAgICAgU3lzdGVtX0V2ZW50c19TdWl0ZV9FdmVudHMsCisgICAgICAgIGFldG9vbHMuVGFsa1RvKToKKyAgICBfc2lnbmF0dXJlID0gJ3NldnMnCisKKyAgICBfbW9kdWxlTmFtZSA9ICdTeXN0ZW1FdmVudHMnCisKKyAgICBfZWxlbWRpY3QgPSBhcHBsaWNhdGlvbi5fZWxlbWRpY3QKKyAgICBfcHJvcGRpY3QgPSBhcHBsaWNhdGlvbi5fcHJvcGRpY3QKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDY2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cy9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDY2ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9TeXN0ZW1FdmVudHMvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1N0YW5kYXJkX1N1aXRlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvU3RhbmRhcmRfU3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyNTI4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1N0YW5kYXJkX1N1aXRlLnB5CkBAIC0wLDAgKzEsNTgyIEBACisiIiJTdWl0ZSBTdGFuZGFyZCBTdWl0ZTogQ29tbW9uIGNsYXNzZXMgYW5kIGNvbW1hbmRzIGZvciBtb3N0IGFwcGxpY2F0aW9ucy4KK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvQXBwbGljYXRpb25zL1V0aWxpdGllcy9UZXJtaW5hbC5hcHAKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJz8/Pz8nCisKK2NsYXNzIFN0YW5kYXJkX1N1aXRlX0V2ZW50czoKKworICAgIF9hcmdtYXBfY2xvc2UgPSB7CisgICAgICAgICdzYXZpbmdfaW4nIDogJ2tmaWwnLAorICAgICAgICAnc2F2aW5nJyA6ICdzYXZvJywKKyAgICB9CisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImNsb3NlOiBDbG9zZSBhbiBvYmplY3QuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGZvciB0aGUgY29tbWFuZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHNhdmluZ19pbjogVGhlIGZpbGUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgb2JqZWN0LgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHNhdmluZzogU3BlY2lmaWVzIHdoZXRoZXIgY2hhbmdlcyBzaG91bGQgYmUgc2F2ZWQgYmVmb3JlIGNsb3NpbmcuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2Nsb3MnCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY2xvc2UpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnc2F2bycsIF9FbnVtX3Nhdm8pCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX2NvdW50ID0geworICAgICAgICAnZWFjaCcgOiAna29jbCcsCisgICAgfQorCisgICAgZGVmIGNvdW50KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJjb3VudDogUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSBwYXJ0aWN1bGFyIGNsYXNzIHdpdGhpbiBhbiBvYmplY3QuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGZvciB0aGUgY29tbWFuZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGVhY2g6IFRoZSBjbGFzcyBvZiBvYmplY3RzIHRvIGJlIGNvdW50ZWQuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdGhlIHJlcGx5IGZvciB0aGUgY29tbWFuZAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnY250ZScKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9jb3VudCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJkZWxldGU6IERlbGV0ZSBhbiBvYmplY3QuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGZvciB0aGUgY29tbWFuZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdkZWxvJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9kdXBsaWNhdGUgPSB7CisgICAgICAgICd0bycgOiAnaW5zaCcsCisgICAgICAgICd3aXRoX3Byb3BlcnRpZXMnIDogJ3ByZHQnLAorICAgIH0KKworICAgIGRlZiBkdXBsaWNhdGUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImR1cGxpY2F0ZTogQ29weSBvYmplY3QocykgYW5kIHB1dCB0aGUgY29waWVzIGF0IGEgbmV3IGxvY2F0aW9uLgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB0bzogVGhlIGxvY2F0aW9uIGZvciB0aGUgbmV3IG9iamVjdChzKS4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb3BlcnRpZXM6IFByb3BlcnRpZXMgdG8gYmUgc2V0IGluIHRoZSBuZXcgZHVwbGljYXRlZCBvYmplY3QocykuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2Nsb24nCisKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfZHVwbGljYXRlKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBleGlzdHMoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImV4aXN0czogVmVyaWZ5IGlmIGFuIG9iamVjdCBleGlzdHMuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGZvciB0aGUgY29tbWFuZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRoZSByZXBseSBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2NvcmUnCisgICAgICAgIF9zdWJjb2RlID0gJ2RvZXgnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgZ2V0KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJnZXQ6IEdldCB0aGUgZGF0YSBmb3IgYW4gb2JqZWN0LgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB0aGUgcmVwbHkgZm9yIHRoZSBjb21tYW5kCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdnZXRkJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgX2FyZ21hcF9tYWtlID0geworICAgICAgICAnYXQnIDogJ2luc2gnLAorICAgICAgICAnbmV3JyA6ICdrb2NsJywKKyAgICAgICAgJ3dpdGhfZGF0YScgOiAnZGF0YScsCisgICAgICAgICd3aXRoX3Byb3BlcnRpZXMnIDogJ3ByZHQnLAorICAgIH0KKworICAgIGRlZiBtYWtlKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIm1ha2U6IE1ha2UgYSBuZXcgb2JqZWN0LgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGF0OiBUaGUgbG9jYXRpb24gYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBvYmplY3QuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgbmV3OiBUaGUgY2xhc3Mgb2YgdGhlIG5ldyBvYmplY3QuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgd2l0aF9kYXRhOiBUaGUgaW5pdGlhbCBkYXRhIGZvciB0aGUgb2JqZWN0LgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHdpdGhfcHJvcGVydGllczogVGhlIGluaXRpYWwgdmFsdWVzIGZvciBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogdGhlIHJlcGx5IGZvciB0aGUgY29tbWFuZAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnY3JlbCcKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9tYWtlKQorICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX21vdmUgPSB7CisgICAgICAgICd0bycgOiAnaW5zaCcsCisgICAgfQorCisgICAgZGVmIG1vdmUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIm1vdmU6IE1vdmUgb2JqZWN0KHMpIHRvIGEgbmV3IGxvY2F0aW9uLgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB0bzogVGhlIG5ldyBsb2NhdGlvbiBmb3IgdGhlIG9iamVjdChzKS4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnbW92ZScKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9tb3ZlKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiBvcGVuKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIm9wZW46IE9wZW4gYW4gb2JqZWN0LgorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogbGlzdCBvZiBvYmplY3RzCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ29kb2MnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgcHJpbnRfKHNlbGYsIF9vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInByaW50OiBQcmludCBhbiBvYmplY3QuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiBsaXN0IG9mIG9iamVjdHMKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYWV2dCcKKyAgICAgICAgX3N1YmNvZGUgPSAncGRvYycKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfcXVpdCA9IHsKKyAgICAgICAgJ3NhdmluZycgOiAnc2F2bycsCisgICAgfQorCisgICAgZGVmIHF1aXQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInF1aXQ6IFF1aXQgYW4gYXBwbGljYXRpb24uCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGZvciB0aGUgY29tbWFuZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHNhdmluZzogU3BlY2lmaWVzIHdoZXRoZXIgY2hhbmdlcyBzaG91bGQgYmUgc2F2ZWQgYmVmb3JlIHF1aXR0aW5nLgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhZXZ0JworICAgICAgICBfc3ViY29kZSA9ICdxdWl0JworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3F1aXQpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnc2F2bycsIF9FbnVtX3Nhdm8pCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX3NhdmUgPSB7CisgICAgICAgICdpbl8nIDogJ2tmaWwnLAorICAgICAgICAnYXMnIDogJ2ZsdHAnLAorICAgIH0KKworICAgIGRlZiBzYXZlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzYXZlOiBTYXZlIGFuIG9iamVjdC4KKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBvYmplY3QgZm9yIHRoZSBjb21tYW5kCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgaW5fOiBUaGUgZmlsZSBpbiB3aGljaCB0byBzYXZlIHRoZSBvYmplY3QuCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgYXM6IFRoZSBmaWxlIHR5cGUgaW4gd2hpY2ggdG8gc2F2ZSB0aGUgZGF0YS4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnc2F2ZScKKworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zYXZlKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfc2V0ID0geworICAgICAgICAndG8nIDogJ2RhdGEnLAorICAgIH0KKworICAgIGRlZiBzZXQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNldDogU2V0IGFuIG9iamVjdCdzIGRhdGEuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGZvciB0aGUgY29tbWFuZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHRvOiBUaGUgbmV3IHZhbHVlLgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdzZXRkJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NldCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKworY2xhc3MgYXBwbGljYXRpb24oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJhcHBsaWNhdGlvbiAtIEFuIGFwcGxpY2F0aW9uJ3MgdG9wIGxldmVsIHNjcmlwdGluZyBvYmplY3QuICIiIgorICAgIHdhbnQgPSAnY2FwcCcKK2NsYXNzIF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIjxJbmhlcml0YW5jZT4gLSBBbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHN1cGVyY2xhc3MuICIiIgorICAgIHdoaWNoID0gJ2NAI14nCisgICAgd2FudCA9ICdjb2JqJworXzNjX0luaGVyaXRhbmNlXzNlXyA9IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8oKQorY2xhc3MgX1Byb3BfZnJvbnRtb3N0KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmcm9udG1vc3QgLSBJcyB0aGlzIHRoZSBmcm9udG1vc3QgKGFjdGl2ZSkgYXBwbGljYXRpb24/ICIiIgorICAgIHdoaWNoID0gJ3Bpc2YnCisgICAgd2FudCA9ICdib29sJworZnJvbnRtb3N0ID0gX1Byb3BfZnJvbnRtb3N0KCkKK2NsYXNzIF9Qcm9wX25hbWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24uICIiIgorICAgIHdoaWNoID0gJ3BuYW0nCisgICAgd2FudCA9ICd1dHh0JworbmFtZSA9IF9Qcm9wX25hbWUoKQorY2xhc3MgX1Byb3BfdmVyc2lvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidmVyc2lvbiAtIFRoZSB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4gIiIiCisgICAgd2hpY2ggPSAndmVycycKKyAgICB3YW50ID0gJ3V0eHQnCit2ZXJzaW9uID0gX1Byb3BfdmVyc2lvbigpCisjICAgICAgICBlbGVtZW50ICdjd2luJyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCcsICdJRCAgJ10KKyMgICAgICAgIGVsZW1lbnQgJ2RvY3UnIGFzIFsnbmFtZScsICdpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKworYXBwbGljYXRpb25zID0gYXBwbGljYXRpb24KKworY2xhc3MgaXRlbShhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIml0ZW0gLSBBIHNjcmlwdGFibGUgb2JqZWN0LiAiIiIKKyAgICB3YW50ID0gJ2NvYmonCitjbGFzcyBfUHJvcF9jbGFzc18oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImNsYXNzIC0gVGhlIGNsYXNzIG9mIHRoZSBvYmplY3QuICIiIgorICAgIHdoaWNoID0gJ3BjbHMnCisgICAgd2FudCA9ICd0eXBlJworY2xhc3MgX1Byb3BfcHJvcGVydGllcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicHJvcGVydGllcyAtIEFsbCBvZiB0aGUgb2JqZWN0J3MgcHJvcGVydGllcy4gIiIiCisgICAgd2hpY2ggPSAncEFMTCcKKyAgICB3YW50ID0gJ3JlY28nCisKK2l0ZW1zID0gaXRlbQorCitjbGFzcyBjb2xvcihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImNvbG9yIC0gQSBjb2xvci4gIiIiCisgICAgd2FudCA9ICdjb2xyJworCitjb2xvcnMgPSBjb2xvcgorCitjbGFzcyB3aW5kb3coYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJ3aW5kb3cgLSBBIHdpbmRvdy4gIiIiCisgICAgd2FudCA9ICdjd2luJworY2xhc3MgX1Byb3BfYm91bmRzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJib3VuZHMgLSBUaGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSB3aW5kb3cuICIiIgorICAgIHdoaWNoID0gJ3BibmQnCisgICAgd2FudCA9ICdxZHJ0JworY2xhc3MgX1Byb3BfY2xvc2VhYmxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjbG9zZWFibGUgLSBXaGV0aGVyIHRoZSB3aW5kb3cgaGFzIGEgY2xvc2UgYm94LiAiIiIKKyAgICB3aGljaCA9ICdoY2xiJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2RvY3VtZW50KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJkb2N1bWVudCAtIFRoZSBkb2N1bWVudCB3aG9zZSBjb250ZW50cyBhcmUgYmVpbmcgZGlzcGxheWVkIGluIHRoZSB3aW5kb3cuICIiIgorICAgIHdoaWNoID0gJ2RvY3UnCisgICAgd2FudCA9ICdkb2N1JworY2xhc3MgX1Byb3BfZmxvYXRpbmcoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZsb2F0aW5nIC0gV2hldGhlciB0aGUgd2luZG93IGZsb2F0cy4gIiIiCisgICAgd2hpY2ggPSAnaXNmbCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9pZChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHdpbmRvdy4gIiIiCisgICAgd2hpY2ggPSAnSUQgICcKKyAgICB3YW50ID0gJ2xvbmcnCitjbGFzcyBfUHJvcF9pbmRleChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIHdpbmRvdyBpbiB0aGUgYmFjay10by1mcm9udCB3aW5kb3cgb3JkZXJpbmcuICIiIgorICAgIHdoaWNoID0gJ3BpZHgnCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3BfbWluaWF0dXJpemFibGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIm1pbmlhdHVyaXphYmxlIC0gV2hldGhlciB0aGUgd2luZG93IGNhbiBiZSBtaW5pYXR1cml6ZWQuICIiIgorICAgIHdoaWNoID0gJ2lzbW4nCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfbWluaWF0dXJpemVkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJtaW5pYXR1cml6ZWQgLSBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1pbmlhdHVyaXplZC4gIiIiCisgICAgd2hpY2ggPSAncG1uZCcKKyAgICB3YW50ID0gJ2Jvb2wnCitjbGFzcyBfUHJvcF9tb2RhbChhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibW9kYWwgLSBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgdGhlIGFwcGxpY2F0aW9uJ3MgY3VycmVudCBtb2RhbCB3aW5kb3cuICIiIgorICAgIHdoaWNoID0gJ3Btb2QnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfcmVzaXphYmxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJyZXNpemFibGUgLSBXaGV0aGVyIHRoZSB3aW5kb3cgY2FuIGJlIHJlc2l6ZWQuICIiIgorICAgIHdoaWNoID0gJ3Byc3onCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3BfdGl0bGVkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ0aXRsZWQgLSBXaGV0aGVyIHRoZSB3aW5kb3cgaGFzIGEgdGl0bGUgYmFyLiAiIiIKKyAgICB3aGljaCA9ICdwdGl0JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3Zpc2libGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInZpc2libGUgLSBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHZpc2libGUuICIiIgorICAgIHdoaWNoID0gJ3B2aXMnCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3Bfem9vbWFibGUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInpvb21hYmxlIC0gV2hldGhlciB0aGUgd2luZG93IGNhbiBiZSB6b29tZWQuICIiIgorICAgIHdoaWNoID0gJ2lzem0nCisgICAgd2FudCA9ICdib29sJworY2xhc3MgX1Byb3Bfem9vbWVkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ6b29tZWQgLSBXaGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IHpvb21lZC4gIiIiCisgICAgd2hpY2ggPSAncHp1bScKKyAgICB3YW50ID0gJ2Jvb2wnCisKK3dpbmRvd3MgPSB3aW5kb3cKKworY2xhc3MgZG9jdW1lbnQoYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJkb2N1bWVudCAtIEEgZG9jdW1lbnQuICIiIgorICAgIHdhbnQgPSAnZG9jdScKK2NsYXNzIF9Qcm9wX21vZGlmaWVkKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJtb2RpZmllZCAtIEhhcyB0aGUgZG9jdW1lbnQgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBzYXZlPyAiIiIKKyAgICB3aGljaCA9ICdpbW9kJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3BhdGgoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInBhdGggLSBUaGUgZG9jdW1lbnQncyBwYXRoLiAiIiIKKyAgICB3aGljaCA9ICdwcHRoJworICAgIHdhbnQgPSAndXR4dCcKKworZG9jdW1lbnRzID0gZG9jdW1lbnQKK2FwcGxpY2F0aW9uLl9zdXBlcmNsYXNzbmFtZXMgPSBbJ2l0ZW0nXQorYXBwbGljYXRpb24uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdmcm9udG1vc3QnIDogX1Byb3BfZnJvbnRtb3N0LAorICAgICduYW1lJyA6IF9Qcm9wX25hbWUsCisgICAgJ3ZlcnNpb24nIDogX1Byb3BfdmVyc2lvbiwKK30KK2FwcGxpY2F0aW9uLl9wcml2ZWxlbWRpY3QgPSB7CisgICAgJ2RvY3VtZW50JyA6IGRvY3VtZW50LAorICAgICd3aW5kb3cnIDogd2luZG93LAorfQoraXRlbS5fc3VwZXJjbGFzc25hbWVzID0gW10KK2l0ZW0uX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnY2xhc3NfJyA6IF9Qcm9wX2NsYXNzXywKKyAgICAncHJvcGVydGllcycgOiBfUHJvcF9wcm9wZXJ0aWVzLAorfQoraXRlbS5fcHJpdmVsZW1kaWN0ID0geworfQorY29sb3IuX3N1cGVyY2xhc3NuYW1lcyA9IFsnaXRlbSddCitjb2xvci5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCit9Citjb2xvci5fcHJpdmVsZW1kaWN0ID0geworfQord2luZG93Ll9zdXBlcmNsYXNzbmFtZXMgPSBbJ2l0ZW0nXQord2luZG93Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnYm91bmRzJyA6IF9Qcm9wX2JvdW5kcywKKyAgICAnY2xvc2VhYmxlJyA6IF9Qcm9wX2Nsb3NlYWJsZSwKKyAgICAnZG9jdW1lbnQnIDogX1Byb3BfZG9jdW1lbnQsCisgICAgJ2Zsb2F0aW5nJyA6IF9Qcm9wX2Zsb2F0aW5nLAorICAgICdpZCcgOiBfUHJvcF9pZCwKKyAgICAnaW5kZXgnIDogX1Byb3BfaW5kZXgsCisgICAgJ21pbmlhdHVyaXphYmxlJyA6IF9Qcm9wX21pbmlhdHVyaXphYmxlLAorICAgICdtaW5pYXR1cml6ZWQnIDogX1Byb3BfbWluaWF0dXJpemVkLAorICAgICdtb2RhbCcgOiBfUHJvcF9tb2RhbCwKKyAgICAnbmFtZScgOiBfUHJvcF9uYW1lLAorICAgICdyZXNpemFibGUnIDogX1Byb3BfcmVzaXphYmxlLAorICAgICd0aXRsZWQnIDogX1Byb3BfdGl0bGVkLAorICAgICd2aXNpYmxlJyA6IF9Qcm9wX3Zpc2libGUsCisgICAgJ3pvb21hYmxlJyA6IF9Qcm9wX3pvb21hYmxlLAorICAgICd6b29tZWQnIDogX1Byb3Bfem9vbWVkLAorfQord2luZG93Ll9wcml2ZWxlbWRpY3QgPSB7Cit9Citkb2N1bWVudC5fc3VwZXJjbGFzc25hbWVzID0gWydpdGVtJ10KK2RvY3VtZW50Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnbW9kaWZpZWQnIDogX1Byb3BfbW9kaWZpZWQsCisgICAgJ25hbWUnIDogX1Byb3BfbmFtZSwKKyAgICAncGF0aCcgOiBfUHJvcF9wYXRoLAorfQorZG9jdW1lbnQuX3ByaXZlbGVtZGljdCA9IHsKK30KK2NsYXNzIF8zY18oYWV0b29scy5OQ29tcGFyaXNvbik6CisgICAgIiIiPCAtIExlc3MgdGhhbiAiIiIKK2NsYXNzIF8zZF8oYWV0b29scy5OQ29tcGFyaXNvbik6CisgICAgIiIiPSAtIEVxdWFsICIiIgorY2xhc3MgXzNlXyhhZXRvb2xzLk5Db21wYXJpc29uKToKKyAgICAiIiI+IC0gR3JlYXRlciB0aGFuICIiIgorY2xhc3MgY29udGFpbnMoYWV0b29scy5OQ29tcGFyaXNvbik6CisgICAgIiIiY29udGFpbnMgLSBDb250YWlucyAiIiIKK2NsYXNzIGVuZHNfd2l0aChhZXRvb2xzLk5Db21wYXJpc29uKToKKyAgICAiIiJlbmRzIHdpdGggLSBFbmRzIHdpdGggIiIiCitjbGFzcyBzdGFydHNfd2l0aChhZXRvb2xzLk5Db21wYXJpc29uKToKKyAgICAiIiJzdGFydHMgd2l0aCAtIFN0YXJ0cyB3aXRoICIiIgorY2xhc3MgX2IyXyhhZXRvb2xzLk5Db21wYXJpc29uKToKKyAgICAiIiJceGIyIC0gTGVzcyB0aGFuIG9yIGVxdWFsIHRvICIiIgorY2xhc3MgX2IzXyhhZXRvb2xzLk5Db21wYXJpc29uKToKKyAgICAiIiJceGIzIC0gR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICIiIgorX0VudW1fc2F2byA9IHsKKyAgICAnYXNrJyA6ICdhc2sgJywgICAgICMgQXNrIHRoZSB1c2VyIHdoZXRoZXIgb3Igbm90IHRvIHNhdmUgdGhlIGZpbGUuCisgICAgJ3llcycgOiAneWVzICcsICAgICAjIFNhdmUgdGhlIGZpbGUuCisgICAgJ25vJyA6ICdubyAgJywgICAgICAjIERvIG5vdCBzYXZlIHRoZSBmaWxlLgorfQorCisKKyMKKyMgSW5kaWNlcyBvZiB0eXBlcyBkZWNsYXJlZCBpbiB0aGlzIG1vZHVsZQorIworX2NsYXNzZGVjbGFyYXRpb25zID0geworICAgICdjYXBwJyA6IGFwcGxpY2F0aW9uLAorICAgICdjb2JqJyA6IGl0ZW0sCisgICAgJ2NvbHInIDogY29sb3IsCisgICAgJ2N3aW4nIDogd2luZG93LAorICAgICdkb2N1JyA6IGRvY3VtZW50LAorfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKKyAgICAnSUQgICcgOiBfUHJvcF9pZCwKKyAgICAnY0AjXicgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdkb2N1JyA6IF9Qcm9wX2RvY3VtZW50LAorICAgICdoY2xiJyA6IF9Qcm9wX2Nsb3NlYWJsZSwKKyAgICAnaW1vZCcgOiBfUHJvcF9tb2RpZmllZCwKKyAgICAnaXNmbCcgOiBfUHJvcF9mbG9hdGluZywKKyAgICAnaXNtbicgOiBfUHJvcF9taW5pYXR1cml6YWJsZSwKKyAgICAnaXN6bScgOiBfUHJvcF96b29tYWJsZSwKKyAgICAncEFMTCcgOiBfUHJvcF9wcm9wZXJ0aWVzLAorICAgICdwYm5kJyA6IF9Qcm9wX2JvdW5kcywKKyAgICAncGNscycgOiBfUHJvcF9jbGFzc18sCisgICAgJ3BpZHgnIDogX1Byb3BfaW5kZXgsCisgICAgJ3Bpc2YnIDogX1Byb3BfZnJvbnRtb3N0LAorICAgICdwbW5kJyA6IF9Qcm9wX21pbmlhdHVyaXplZCwKKyAgICAncG1vZCcgOiBfUHJvcF9tb2RhbCwKKyAgICAncG5hbScgOiBfUHJvcF9uYW1lLAorICAgICdwcHRoJyA6IF9Qcm9wX3BhdGgsCisgICAgJ3Byc3onIDogX1Byb3BfcmVzaXphYmxlLAorICAgICdwdGl0JyA6IF9Qcm9wX3RpdGxlZCwKKyAgICAncHZpcycgOiBfUHJvcF92aXNpYmxlLAorICAgICdwenVtJyA6IF9Qcm9wX3pvb21lZCwKKyAgICAndmVycycgOiBfUHJvcF92ZXJzaW9uLAorfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKKyAgICAnPCAgICcgOiBfM2NfLAorICAgICc8PSAgJyA6IF9iMl8sCisgICAgJz0gICAnIDogXzNkXywKKyAgICAnPiAgICcgOiBfM2VfLAorICAgICc+PSAgJyA6IF9iM18sCisgICAgJ2Jnd3QnIDogc3RhcnRzX3dpdGgsCisgICAgJ2NvbnQnIDogY29udGFpbnMsCisgICAgJ2VuZHMnIDogZW5kc193aXRoLAorfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKKyAgICAnc2F2bycgOiBfRW51bV9zYXZvLAorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvU3RhbmRhcmRfU3VpdGUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvU3RhbmRhcmRfU3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODdhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbC9TdGFuZGFyZF9TdWl0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvU3RhbmRhcmRfU3VpdGUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvU3RhbmRhcmRfU3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyODdhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbC9TdGFuZGFyZF9TdWl0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvVGVybWluYWxfU3VpdGUucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbC9UZXJtaW5hbF9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmEwMmIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvVGVybWluYWxfU3VpdGUucHkKQEAgLTAsMCArMSwyNTQgQEAKKyIiIlN1aXRlIFRlcm1pbmFsIFN1aXRlOiBUZXJtcyBhbmQgRXZlbnRzIGZvciBjb250cm9sbGluZyB0aGUgVGVybWluYWwgYXBwbGljYXRpb24KK0xldmVsIDEsIHZlcnNpb24gMQorCitHZW5lcmF0ZWQgZnJvbSAvQXBwbGljYXRpb25zL1V0aWxpdGllcy9UZXJtaW5hbC5hcHAKK0FFVEUvQUVVVCByZXNvdXJjZSB2ZXJzaW9uIDEvMCwgbGFuZ3VhZ2UgMCwgc2NyaXB0IDAKKyIiIgorCitpbXBvcnQgYWV0b29scworaW1wb3J0IE1hY09TCisKK19jb2RlID0gJ3RybXgnCisKK2NsYXNzIFRlcm1pbmFsX1N1aXRlX0V2ZW50czoKKworICAgIGRlZiBHZXRVUkwoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIkdldFVSTDogT3BlbnMgYSB0ZWxuZXQ6IFVSTAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIG9iamVjdCBmb3IgdGhlIGNvbW1hbmQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnR1VSTCcKKyAgICAgICAgX3N1YmNvZGUgPSAnR1VSTCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIF9hcmdtYXBfZG9fc2NyaXB0ID0geworICAgICAgICAnaW5fJyA6ICdrZmlsJywKKyAgICAgICAgJ3dpdGhfY29tbWFuZCcgOiAnY21uZCcsCisgICAgfQorCisgICAgZGVmIGRvX3NjcmlwdChzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiZG8gc2NyaXB0OiBSdW4gYSBVTklYIHNoZWxsIHNjcmlwdCBvciBjb21tYW5kCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgb2JqZWN0IGZvciB0aGUgY29tbWFuZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGluXzogdGhlIHdpbmRvdyBpbiB3aGljaCB0byBleGVjdXRlIHRoZSBjb21tYW5kCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgd2l0aF9jb21tYW5kOiBkYXRhIHRvIGJlIHBhc3NlZCB0byB0aGUgVGVybWluYWwgYXBwbGljYXRpb24gYXMgdGhlIGNvbW1hbmQgbGluZSwgZGVwcmVjYXRlZCwgdXNlIGRpcmVjdCBwYXJhbWV0ZXIKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB0aGUgcmVwbHkgZm9yIHRoZSBjb21tYW5kCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdjb3JlJworICAgICAgICBfc3ViY29kZSA9ICdkb3NjJworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2RvX3NjcmlwdCkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKworY2xhc3MgYXBwbGljYXRpb24oYWV0b29scy5Db21wb25lbnRJdGVtKToKKyAgICAiIiJhcHBsaWNhdGlvbiAtIFRoZSBUZXJtaW5hbCBwcm9ncmFtICIiIgorICAgIHdhbnQgPSAnY2FwcCcKK2NsYXNzIF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8oYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiIjxJbmhlcml0YW5jZT4gLSBBbGwgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHN1cGVyY2xhc3MuICIiIgorICAgIHdoaWNoID0gJ2NAI14nCisgICAgd2FudCA9ICdjYXBwJworXzNjX0luaGVyaXRhbmNlXzNlXyA9IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8oKQorY2xhc3MgX1Byb3BfcHJvcGVydGllcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIicHJvcGVydGllcyAtIGV2ZXJ5IHByb3BlcnR5IG9mIHRoZSBUZXJtaW5hbCBwcm9ncmFtICIiIgorICAgIHdoaWNoID0gJ3BBTEwnCisgICAgd2FudCA9ICcqKioqJworcHJvcGVydGllcyA9IF9Qcm9wX3Byb3BlcnRpZXMoKQorIyAgICAgICAgZWxlbWVudCAnY3dpbicgYXMgWyduYW1lJywgJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnLCAnSUQgICddCisjICAgICAgICBlbGVtZW50ICdkb2N1JyBhcyBbJ25hbWUnLCAnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisKK2FwcGxpY2F0aW9ucyA9IGFwcGxpY2F0aW9uCisKK2NsYXNzIHdpbmRvdyhhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiIndpbmRvdyAtIEEgVGVybWluYWwgd2luZG93ICIiIgorICAgIHdhbnQgPSAnY3dpbicKK2NsYXNzIF9Qcm9wX2JhY2tncm91bmRfY29sb3IoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImJhY2tncm91bmQgY29sb3IgLSB0aGUgYmFja2dyb3VuZCBjb2xvciBmb3IgdGhlIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdwYmNsJworICAgIHdhbnQgPSAnKioqKicKK2NsYXNzIF9Qcm9wX2JvbGRfdGV4dF9jb2xvcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiYm9sZCB0ZXh0IGNvbG9yIC0gdGhlIGJvbGQgdGV4dCBjb2xvciBmb3IgdGhlIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdwYnRjJworICAgIHdhbnQgPSAnKioqKicKK2NsYXNzIF9Qcm9wX2JvdW5kcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiYm91bmRzIC0gdGhlIGJvdW5kYXJ5IHJlY3RhbmdsZSBmb3IgdGhlIHdpbmRvdywgcmVsYXRpdmUgdG8gdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBzY3JlZW4gIiIiCisgICAgd2hpY2ggPSAncGJuZCcKKyAgICB3YW50ID0gJyoqKionCitjbGFzcyBfUHJvcF9idXN5KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJidXN5IC0gSXMgdGhlIHdpbmRvdyBidXN5IHJ1bm5pbmcgYSBwcm9jZXNzPyAiIiIKKyAgICB3aGljaCA9ICdidXN5JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2NvbnRlbnRzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjb250ZW50cyAtIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBjb250ZW50cyBvZiB0aGUgd2luZG93ICIiIgorICAgIHdoaWNoID0gJ3BjbnQnCisgICAgd2FudCA9ICd1dHh0JworY2xhc3MgX1Byb3BfY3Vyc29yX2NvbG9yKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjdXJzb3IgY29sb3IgLSB0aGUgY3Vyc29yIGNvbG9yIGZvciB0aGUgd2luZG93ICIiIgorICAgIHdoaWNoID0gJ3BjdWMnCisgICAgd2FudCA9ICcqKioqJworY2xhc3MgX1Byb3BfY3VzdG9tX3RpdGxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJjdXN0b20gdGl0bGUgLSB0aGUgY3VzdG9tIHRpdGxlIGZvciB0aGUgd2luZG93ICIiIgorICAgIHdoaWNoID0gJ3RpdGwnCisgICAgd2FudCA9ICd1dHh0JworY2xhc3MgX1Byb3BfZnJhbWUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImZyYW1lIC0gdGhlIG9yaWdpbiBhbmQgc2l6ZSBvZiB0aGUgd2luZG93ICIiIgorICAgIHdoaWNoID0gJ3BmcmEnCisgICAgd2FudCA9ICcqKioqJworY2xhc3MgX1Byb3BfZnJvbnRtb3N0KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmcm9udG1vc3QgLSBJcyB0aGUgd2luZG93IGluIGZyb250IG9mIHRoZSBvdGhlciBUZXJtaW5hbCB3aW5kb3dzPyAiIiIKKyAgICB3aGljaCA9ICdwaXNmJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX2hpc3RvcnkoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiImhpc3RvcnkgLSB0aGUgY29udGVudHMgb2YgdGhlIGVudGlyZSBzY3JvbGxpbmcgYnVmZmVyIG9mIHRoZSB3aW5kb3cgIiIiCisgICAgd2hpY2ggPSAnaGlzdCcKKyAgICB3YW50ID0gJ3V0eHQnCitjbGFzcyBfUHJvcF9ub3JtYWxfdGV4dF9jb2xvcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibm9ybWFsIHRleHQgY29sb3IgLSB0aGUgbm9ybWFsIHRleHQgY29sb3IgZm9yIHRoZSB3aW5kb3cgIiIiCisgICAgd2hpY2ggPSAncHR4YycKKyAgICB3YW50ID0gJyoqKionCitjbGFzcyBfUHJvcF9udW1iZXJfb2ZfY29sdW1ucyhhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIibnVtYmVyIG9mIGNvbHVtbnMgLSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHdpbmRvdyAiIiIKKyAgICB3aGljaCA9ICdjY29sJworICAgIHdhbnQgPSAnbG9uZycKK2NsYXNzIF9Qcm9wX251bWJlcl9vZl9yb3dzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJudW1iZXIgb2Ygcm93cyAtIHRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgd2luZG93ICIiIgorICAgIHdoaWNoID0gJ2Nyb3cnCisgICAgd2FudCA9ICdsb25nJworY2xhc3MgX1Byb3Bfb3JpZ2luKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJvcmlnaW4gLSB0aGUgbG93ZXIgbGVmdCBjb29yZGluYXRlcyBvZiB0aGUgd2luZG93LCByZWxhdGl2ZSB0byB0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHNjcmVlbiAiIiIKKyAgICB3aGljaCA9ICdwb3JpJworICAgIHdhbnQgPSAnKioqKicKK2NsYXNzIF9Qcm9wX3Bvc2l0aW9uKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwb3NpdGlvbiAtIHRoZSB1cHBlciBsZWZ0IGNvb3JkaW5hdGVzIG9mIHRoZSB3aW5kb3csIHJlbGF0aXZlIHRvIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgc2NyZWVuICIiIgorICAgIHdoaWNoID0gJ3Bwb3MnCisgICAgd2FudCA9ICcqKioqJworY2xhc3MgX1Byb3BfcHJvY2Vzc2VzKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJwcm9jZXNzZXMgLSBhIGxpc3Qgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHByb2Nlc3NlcyAiIiIKKyAgICB3aGljaCA9ICdwcmNzJworICAgIHdhbnQgPSAndXR4dCcKK2NsYXNzIF9Qcm9wX3NpemUoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInNpemUgLSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgd2luZG93ICIiIgorICAgIHdoaWNoID0gJ3BzaXonCisgICAgd2FudCA9ICcqKioqJworY2xhc3MgX1Byb3BfdGl0bGVfZGlzcGxheXNfY3VzdG9tX3RpdGxlKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ0aXRsZSBkaXNwbGF5cyBjdXN0b20gdGl0bGUgLSBEb2VzIHRoZSB0aXRsZSBmb3IgdGhlIHdpbmRvdyBjb250YWluIGEgY3VzdG9tIHRpdGxlPyAiIiIKKyAgICB3aGljaCA9ICd0ZGN0JworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3RpdGxlX2Rpc3BsYXlzX2RldmljZV9uYW1lKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ0aXRsZSBkaXNwbGF5cyBkZXZpY2UgbmFtZSAtIERvZXMgdGhlIHRpdGxlIGZvciB0aGUgd2luZG93IGNvbnRhaW4gdGhlIGRldmljZSBuYW1lPyAiIiIKKyAgICB3aGljaCA9ICd0ZGRuJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3RpdGxlX2Rpc3BsYXlzX2ZpbGVfbmFtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIidGl0bGUgZGlzcGxheXMgZmlsZSBuYW1lIC0gRG9lcyB0aGUgdGl0bGUgZm9yIHRoZSB3aW5kb3cgY29udGFpbiB0aGUgZmlsZSBuYW1lPyAiIiIKKyAgICB3aGljaCA9ICd0ZGZuJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3RpdGxlX2Rpc3BsYXlzX3NoZWxsX3BhdGgoYWV0b29scy5OUHJvcGVydHkpOgorICAgICIiInRpdGxlIGRpc3BsYXlzIHNoZWxsIHBhdGggLSBEb2VzIHRoZSB0aXRsZSBmb3IgdGhlIHdpbmRvdyBjb250YWluIHRoZSBzaGVsbCBwYXRoPyAiIiIKKyAgICB3aGljaCA9ICd0ZHNwJworICAgIHdhbnQgPSAnYm9vbCcKK2NsYXNzIF9Qcm9wX3RpdGxlX2Rpc3BsYXlzX3dpbmRvd19zaXplKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJ0aXRsZSBkaXNwbGF5cyB3aW5kb3cgc2l6ZSAtIERvZXMgdGhlIHRpdGxlIGZvciB0aGUgd2luZG93IGNvbnRhaW4gdGhlIHdpbmRvdyBzaXplPyAiIiIKKyAgICB3aGljaCA9ICd0ZHdzJworICAgIHdhbnQgPSAnYm9vbCcKKword2luZG93cyA9IHdpbmRvdworYXBwbGljYXRpb24uX3N1cGVyY2xhc3NuYW1lcyA9IFtdCitpbXBvcnQgU3RhbmRhcmRfU3VpdGUKK2FwcGxpY2F0aW9uLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAncHJvcGVydGllcycgOiBfUHJvcF9wcm9wZXJ0aWVzLAorfQorYXBwbGljYXRpb24uX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnZG9jdW1lbnQnIDogU3RhbmRhcmRfU3VpdGUuZG9jdW1lbnQsCisgICAgJ3dpbmRvdycgOiB3aW5kb3csCit9Cit3aW5kb3cuX3N1cGVyY2xhc3NuYW1lcyA9IFtdCit3aW5kb3cuX3ByaXZwcm9wZGljdCA9IHsKKyAgICAnXzNjX0luaGVyaXRhbmNlXzNlXycgOiBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfLAorICAgICdiYWNrZ3JvdW5kX2NvbG9yJyA6IF9Qcm9wX2JhY2tncm91bmRfY29sb3IsCisgICAgJ2JvbGRfdGV4dF9jb2xvcicgOiBfUHJvcF9ib2xkX3RleHRfY29sb3IsCisgICAgJ2JvdW5kcycgOiBfUHJvcF9ib3VuZHMsCisgICAgJ2J1c3knIDogX1Byb3BfYnVzeSwKKyAgICAnY29udGVudHMnIDogX1Byb3BfY29udGVudHMsCisgICAgJ2N1cnNvcl9jb2xvcicgOiBfUHJvcF9jdXJzb3JfY29sb3IsCisgICAgJ2N1c3RvbV90aXRsZScgOiBfUHJvcF9jdXN0b21fdGl0bGUsCisgICAgJ2ZyYW1lJyA6IF9Qcm9wX2ZyYW1lLAorICAgICdmcm9udG1vc3QnIDogX1Byb3BfZnJvbnRtb3N0LAorICAgICdoaXN0b3J5JyA6IF9Qcm9wX2hpc3RvcnksCisgICAgJ25vcm1hbF90ZXh0X2NvbG9yJyA6IF9Qcm9wX25vcm1hbF90ZXh0X2NvbG9yLAorICAgICdudW1iZXJfb2ZfY29sdW1ucycgOiBfUHJvcF9udW1iZXJfb2ZfY29sdW1ucywKKyAgICAnbnVtYmVyX29mX3Jvd3MnIDogX1Byb3BfbnVtYmVyX29mX3Jvd3MsCisgICAgJ29yaWdpbicgOiBfUHJvcF9vcmlnaW4sCisgICAgJ3Bvc2l0aW9uJyA6IF9Qcm9wX3Bvc2l0aW9uLAorICAgICdwcm9jZXNzZXMnIDogX1Byb3BfcHJvY2Vzc2VzLAorICAgICdwcm9wZXJ0aWVzJyA6IF9Qcm9wX3Byb3BlcnRpZXMsCisgICAgJ3NpemUnIDogX1Byb3Bfc2l6ZSwKKyAgICAndGl0bGVfZGlzcGxheXNfY3VzdG9tX3RpdGxlJyA6IF9Qcm9wX3RpdGxlX2Rpc3BsYXlzX2N1c3RvbV90aXRsZSwKKyAgICAndGl0bGVfZGlzcGxheXNfZGV2aWNlX25hbWUnIDogX1Byb3BfdGl0bGVfZGlzcGxheXNfZGV2aWNlX25hbWUsCisgICAgJ3RpdGxlX2Rpc3BsYXlzX2ZpbGVfbmFtZScgOiBfUHJvcF90aXRsZV9kaXNwbGF5c19maWxlX25hbWUsCisgICAgJ3RpdGxlX2Rpc3BsYXlzX3NoZWxsX3BhdGgnIDogX1Byb3BfdGl0bGVfZGlzcGxheXNfc2hlbGxfcGF0aCwKKyAgICAndGl0bGVfZGlzcGxheXNfd2luZG93X3NpemUnIDogX1Byb3BfdGl0bGVfZGlzcGxheXNfd2luZG93X3NpemUsCit9Cit3aW5kb3cuX3ByaXZlbGVtZGljdCA9IHsKK30KKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2NhcHAnIDogYXBwbGljYXRpb24sCisgICAgJ2N3aW4nIDogd2luZG93LAorfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKKyAgICAnYnVzeScgOiBfUHJvcF9idXN5LAorICAgICdjQCNeJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2Njb2wnIDogX1Byb3BfbnVtYmVyX29mX2NvbHVtbnMsCisgICAgJ2Nyb3cnIDogX1Byb3BfbnVtYmVyX29mX3Jvd3MsCisgICAgJ2hpc3QnIDogX1Byb3BfaGlzdG9yeSwKKyAgICAncEFMTCcgOiBfUHJvcF9wcm9wZXJ0aWVzLAorICAgICdwYmNsJyA6IF9Qcm9wX2JhY2tncm91bmRfY29sb3IsCisgICAgJ3BibmQnIDogX1Byb3BfYm91bmRzLAorICAgICdwYnRjJyA6IF9Qcm9wX2JvbGRfdGV4dF9jb2xvciwKKyAgICAncGNudCcgOiBfUHJvcF9jb250ZW50cywKKyAgICAncGN1YycgOiBfUHJvcF9jdXJzb3JfY29sb3IsCisgICAgJ3BmcmEnIDogX1Byb3BfZnJhbWUsCisgICAgJ3Bpc2YnIDogX1Byb3BfZnJvbnRtb3N0LAorICAgICdwb3JpJyA6IF9Qcm9wX29yaWdpbiwKKyAgICAncHBvcycgOiBfUHJvcF9wb3NpdGlvbiwKKyAgICAncHJjcycgOiBfUHJvcF9wcm9jZXNzZXMsCisgICAgJ3BzaXonIDogX1Byb3Bfc2l6ZSwKKyAgICAncHR4YycgOiBfUHJvcF9ub3JtYWxfdGV4dF9jb2xvciwKKyAgICAndGRjdCcgOiBfUHJvcF90aXRsZV9kaXNwbGF5c19jdXN0b21fdGl0bGUsCisgICAgJ3RkZG4nIDogX1Byb3BfdGl0bGVfZGlzcGxheXNfZGV2aWNlX25hbWUsCisgICAgJ3RkZm4nIDogX1Byb3BfdGl0bGVfZGlzcGxheXNfZmlsZV9uYW1lLAorICAgICd0ZHNwJyA6IF9Qcm9wX3RpdGxlX2Rpc3BsYXlzX3NoZWxsX3BhdGgsCisgICAgJ3Rkd3MnIDogX1Byb3BfdGl0bGVfZGlzcGxheXNfd2luZG93X3NpemUsCisgICAgJ3RpdGwnIDogX1Byb3BfY3VzdG9tX3RpdGxlLAorfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7Cit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbC9UZXJtaW5hbF9TdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbC9UZXJtaW5hbF9TdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiNGIyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1Rlcm1pbmFsX1N1aXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbC9UZXJtaW5hbF9TdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbC9UZXJtaW5hbF9TdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRiNGIyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1Rlcm1pbmFsX1N1aXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbC9UZXh0X1N1aXRlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvVGV4dF9TdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmY0NzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvVGV4dF9TdWl0ZS5weQpAQCAtMCwwICsxLDE5NSBAQAorIiIiU3VpdGUgVGV4dCBTdWl0ZTogQSBzZXQgb2YgYmFzaWMgY2xhc3NlcyBmb3IgdGV4dCBwcm9jZXNzaW5nLgorTGV2ZWwgMSwgdmVyc2lvbiAxCisKK0dlbmVyYXRlZCBmcm9tIC9BcHBsaWNhdGlvbnMvVXRpbGl0aWVzL1Rlcm1pbmFsLmFwcAorQUVURS9BRVVUIHJlc291cmNlIHZlcnNpb24gMS8wLCBsYW5ndWFnZSAwLCBzY3JpcHQgMAorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAnPz8/PycKKworY2xhc3MgVGV4dF9TdWl0ZV9FdmVudHM6CisKKyAgICBwYXNzCisKKworY2xhc3MgYXR0YWNobWVudChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImF0dGFjaG1lbnQgLSBSZXByZXNlbnRzIGFuIGlubGluZSB0ZXh0IGF0dGFjaG1lbnQuICBUaGlzIGNsYXNzIGlzIHVzZWQgbWFpbmx5IGZvciBtYWtlIGNvbW1hbmRzLiAiIiIKKyAgICB3YW50ID0gJ2F0dHMnCitjbGFzcyBfUHJvcF9fM2NfSW5oZXJpdGFuY2VfM2VfKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiI8SW5oZXJpdGFuY2U+IC0gQWxsIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBzdXBlcmNsYXNzLiAiIiIKKyAgICB3aGljaCA9ICdjQCNeJworICAgIHdhbnQgPSAnY3R4dCcKK2NsYXNzIF9Qcm9wX2ZpbGVfbmFtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiZmlsZSBuYW1lIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgZm9yIHRoZSBhdHRhY2htZW50ICIiIgorICAgIHdoaWNoID0gJ2F0Zm4nCisgICAgd2FudCA9ICd1dHh0JworIyAgICAgICAgZWxlbWVudCAnY2F0cicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NoYSAnIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjcGFyJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY3dvcicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKworY2xhc3MgYXR0cmlidXRlX3J1bihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImF0dHJpYnV0ZSBydW4gLSBUaGlzIHN1YmRpdmlkZXMgdGhlIHRleHQgaW50byBjaHVua3MgdGhhdCBhbGwgaGF2ZSB0aGUgc2FtZSBhdHRyaWJ1dGVzLiAiIiIKKyAgICB3YW50ID0gJ2NhdHInCitjbGFzcyBfUHJvcF9jb2xvcihhZXRvb2xzLk5Qcm9wZXJ0eSk6CisgICAgIiIiY29sb3IgLSBUaGUgY29sb3Igb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4gIiIiCisgICAgd2hpY2ggPSAnY29scicKKyAgICB3YW50ID0gJ2NvbHInCitjbGFzcyBfUHJvcF9mb250KGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJmb250IC0gVGhlIG5hbWUgb2YgdGhlIGZvbnQgb2YgdGhlIGZpcnN0IGNoYXJhY3Rlci4gIiIiCisgICAgd2hpY2ggPSAnZm9udCcKKyAgICB3YW50ID0gJ3V0eHQnCitjbGFzcyBfUHJvcF9zaXplKGFldG9vbHMuTlByb3BlcnR5KToKKyAgICAiIiJzaXplIC0gVGhlIHNpemUgaW4gcG9pbnRzIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIuICIiIgorICAgIHdoaWNoID0gJ3B0c3onCisgICAgd2FudCA9ICdsb25nJworIyAgICAgICAgZWxlbWVudCAnY2F0cicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NoYSAnIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjcGFyJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY3dvcicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKworYXR0cmlidXRlX3J1bnMgPSBhdHRyaWJ1dGVfcnVuCisKK2NsYXNzIGNoYXJhY3RlcihhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgorICAgICIiImNoYXJhY3RlciAtIFRoaXMgc3ViZGl2aWRlcyB0aGUgdGV4dCBpbnRvIGNoYXJhY3RlcnMuICIiIgorICAgIHdhbnQgPSAnY2hhICcKKyMgICAgICAgIGVsZW1lbnQgJ2NhdHInIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjaGEgJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY3BhcicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2N3b3InIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisKK2NoYXJhY3RlcnMgPSBjaGFyYWN0ZXIKKworY2xhc3MgcGFyYWdyYXBoKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIicGFyYWdyYXBoIC0gVGhpcyBzdWJkaXZpZGVzIHRoZSB0ZXh0IGludG8gcGFyYWdyYXBocy4gIiIiCisgICAgd2FudCA9ICdjcGFyJworIyAgICAgICAgZWxlbWVudCAnY2F0cicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NoYSAnIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjcGFyJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY3dvcicgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKworcGFyYWdyYXBocyA9IHBhcmFncmFwaAorCitjbGFzcyB0ZXh0KGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIidGV4dCAtIFJpY2ggKHN0eWxlZCkgdGV4dCAiIiIKKyAgICB3YW50ID0gJ2N0eHQnCisjICAgICAgICBlbGVtZW50ICdjYXRyJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY2hhICcgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NwYXInIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjd29yJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorCitjbGFzcyB3b3JkKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6CisgICAgIiIid29yZCAtIFRoaXMgc3ViZGl2aWRlcyB0aGUgdGV4dCBpbnRvIHdvcmRzLiAiIiIKKyAgICB3YW50ID0gJ2N3b3InCisjICAgICAgICBlbGVtZW50ICdjYXRyJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorIyAgICAgICAgZWxlbWVudCAnY2hhICcgYXMgWydpbmR4JywgJ3JlbGUnLCAncmFuZycsICd0ZXN0J10KKyMgICAgICAgIGVsZW1lbnQgJ2NwYXInIGFzIFsnaW5keCcsICdyZWxlJywgJ3JhbmcnLCAndGVzdCddCisjICAgICAgICBlbGVtZW50ICdjd29yJyBhcyBbJ2luZHgnLCAncmVsZScsICdyYW5nJywgJ3Rlc3QnXQorCit3b3JkcyA9IHdvcmQKK2F0dGFjaG1lbnQuX3N1cGVyY2xhc3NuYW1lcyA9IFsndGV4dCddCithdHRhY2htZW50Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnZmlsZV9uYW1lJyA6IF9Qcm9wX2ZpbGVfbmFtZSwKK30KK2F0dGFjaG1lbnQuX3ByaXZlbGVtZGljdCA9IHsKKyAgICAnYXR0cmlidXRlX3J1bicgOiBhdHRyaWJ1dGVfcnVuLAorICAgICdjaGFyYWN0ZXInIDogY2hhcmFjdGVyLAorICAgICdwYXJhZ3JhcGgnIDogcGFyYWdyYXBoLAorICAgICd3b3JkJyA6IHdvcmQsCit9CitpbXBvcnQgU3RhbmRhcmRfU3VpdGUKK2F0dHJpYnV0ZV9ydW4uX3N1cGVyY2xhc3NuYW1lcyA9IFsnaXRlbSddCithdHRyaWJ1dGVfcnVuLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnY29sb3InIDogX1Byb3BfY29sb3IsCisgICAgJ2ZvbnQnIDogX1Byb3BfZm9udCwKKyAgICAnc2l6ZScgOiBfUHJvcF9zaXplLAorfQorYXR0cmlidXRlX3J1bi5fcHJpdmVsZW1kaWN0ID0geworICAgICdhdHRyaWJ1dGVfcnVuJyA6IGF0dHJpYnV0ZV9ydW4sCisgICAgJ2NoYXJhY3RlcicgOiBjaGFyYWN0ZXIsCisgICAgJ3BhcmFncmFwaCcgOiBwYXJhZ3JhcGgsCisgICAgJ3dvcmQnIDogd29yZCwKK30KK2NoYXJhY3Rlci5fc3VwZXJjbGFzc25hbWVzID0gWydpdGVtJ10KK2NoYXJhY3Rlci5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2NvbG9yJyA6IF9Qcm9wX2NvbG9yLAorICAgICdmb250JyA6IF9Qcm9wX2ZvbnQsCisgICAgJ3NpemUnIDogX1Byb3Bfc2l6ZSwKK30KK2NoYXJhY3Rlci5fcHJpdmVsZW1kaWN0ID0geworICAgICdhdHRyaWJ1dGVfcnVuJyA6IGF0dHJpYnV0ZV9ydW4sCisgICAgJ2NoYXJhY3RlcicgOiBjaGFyYWN0ZXIsCisgICAgJ3BhcmFncmFwaCcgOiBwYXJhZ3JhcGgsCisgICAgJ3dvcmQnIDogd29yZCwKK30KK3BhcmFncmFwaC5fc3VwZXJjbGFzc25hbWVzID0gWydpdGVtJ10KK3BhcmFncmFwaC5fcHJpdnByb3BkaWN0ID0geworICAgICdfM2NfSW5oZXJpdGFuY2VfM2VfJyA6IF9Qcm9wX18zY19Jbmhlcml0YW5jZV8zZV8sCisgICAgJ2NvbG9yJyA6IF9Qcm9wX2NvbG9yLAorICAgICdmb250JyA6IF9Qcm9wX2ZvbnQsCisgICAgJ3NpemUnIDogX1Byb3Bfc2l6ZSwKK30KK3BhcmFncmFwaC5fcHJpdmVsZW1kaWN0ID0geworICAgICdhdHRyaWJ1dGVfcnVuJyA6IGF0dHJpYnV0ZV9ydW4sCisgICAgJ2NoYXJhY3RlcicgOiBjaGFyYWN0ZXIsCisgICAgJ3BhcmFncmFwaCcgOiBwYXJhZ3JhcGgsCisgICAgJ3dvcmQnIDogd29yZCwKK30KK3RleHQuX3N1cGVyY2xhc3NuYW1lcyA9IFsnaXRlbSddCit0ZXh0Ll9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnY29sb3InIDogX1Byb3BfY29sb3IsCisgICAgJ2ZvbnQnIDogX1Byb3BfZm9udCwKKyAgICAnc2l6ZScgOiBfUHJvcF9zaXplLAorfQordGV4dC5fcHJpdmVsZW1kaWN0ID0geworICAgICdhdHRyaWJ1dGVfcnVuJyA6IGF0dHJpYnV0ZV9ydW4sCisgICAgJ2NoYXJhY3RlcicgOiBjaGFyYWN0ZXIsCisgICAgJ3BhcmFncmFwaCcgOiBwYXJhZ3JhcGgsCisgICAgJ3dvcmQnIDogd29yZCwKK30KK3dvcmQuX3N1cGVyY2xhc3NuYW1lcyA9IFsnaXRlbSddCit3b3JkLl9wcml2cHJvcGRpY3QgPSB7CisgICAgJ18zY19Jbmhlcml0YW5jZV8zZV8nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnY29sb3InIDogX1Byb3BfY29sb3IsCisgICAgJ2ZvbnQnIDogX1Byb3BfZm9udCwKKyAgICAnc2l6ZScgOiBfUHJvcF9zaXplLAorfQord29yZC5fcHJpdmVsZW1kaWN0ID0geworICAgICdhdHRyaWJ1dGVfcnVuJyA6IGF0dHJpYnV0ZV9ydW4sCisgICAgJ2NoYXJhY3RlcicgOiBjaGFyYWN0ZXIsCisgICAgJ3BhcmFncmFwaCcgOiBwYXJhZ3JhcGgsCisgICAgJ3dvcmQnIDogd29yZCwKK30KKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2F0dHMnIDogYXR0YWNobWVudCwKKyAgICAnY2F0cicgOiBhdHRyaWJ1dGVfcnVuLAorICAgICdjaGEgJyA6IGNoYXJhY3RlciwKKyAgICAnY3BhcicgOiBwYXJhZ3JhcGgsCisgICAgJ2N0eHQnIDogdGV4dCwKKyAgICAnY3dvcicgOiB3b3JkLAorfQorCitfcHJvcGRlY2xhcmF0aW9ucyA9IHsKKyAgICAnYXRmbicgOiBfUHJvcF9maWxlX25hbWUsCisgICAgJ2NAI14nIDogX1Byb3BfXzNjX0luaGVyaXRhbmNlXzNlXywKKyAgICAnY29scicgOiBfUHJvcF9jb2xvciwKKyAgICAnZm9udCcgOiBfUHJvcF9mb250LAorICAgICdwdHN6JyA6IF9Qcm9wX3NpemUsCit9CisKK19jb21wZGVjbGFyYXRpb25zID0geworfQorCitfZW51bWRlY2xhcmF0aW9ucyA9IHsKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1RleHRfU3VpdGUucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvVGV4dF9TdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhNmU5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1RleHRfU3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1RleHRfU3VpdGUucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvVGV4dF9TdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhNmU5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL1RleHRfU3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzMzBiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsOTMgQEAKKyIiIgorUGFja2FnZSBnZW5lcmF0ZWQgZnJvbSAvQXBwbGljYXRpb25zL1V0aWxpdGllcy9UZXJtaW5hbC5hcHAKKyIiIgorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIFRlcm1pbmFsIG1vZHVsZSBpcyByZW1vdmVkLiIsIHN0YWNrbGV2ZWw9MikKKworaW1wb3J0IGFldG9vbHMKK0Vycm9yID0gYWV0b29scy5FcnJvcgoraW1wb3J0IFN0YW5kYXJkX1N1aXRlCitpbXBvcnQgVGV4dF9TdWl0ZQoraW1wb3J0IFRlcm1pbmFsX1N1aXRlCisKKworX2NvZGVfdG9fbW9kdWxlID0geworICAgICc/Pz8/JyA6IFN0YW5kYXJkX1N1aXRlLAorICAgICc/Pz8/JyA6IFRleHRfU3VpdGUsCisgICAgJ3RybXgnIDogVGVybWluYWxfU3VpdGUsCit9CisKKworCitfY29kZV90b19mdWxsbmFtZSA9IHsKKyAgICAnPz8/PycgOiAoJ1Rlcm1pbmFsLlN0YW5kYXJkX1N1aXRlJywgJ1N0YW5kYXJkX1N1aXRlJyksCisgICAgJz8/Pz8nIDogKCdUZXJtaW5hbC5UZXh0X1N1aXRlJywgJ1RleHRfU3VpdGUnKSwKKyAgICAndHJteCcgOiAoJ1Rlcm1pbmFsLlRlcm1pbmFsX1N1aXRlJywgJ1Rlcm1pbmFsX1N1aXRlJyksCit9CisKK2Zyb20gU3RhbmRhcmRfU3VpdGUgaW1wb3J0ICoKK2Zyb20gVGV4dF9TdWl0ZSBpbXBvcnQgKgorZnJvbSBUZXJtaW5hbF9TdWl0ZSBpbXBvcnQgKgorCitkZWYgZ2V0YmFzZWNsYXNzZXModik6CisgICAgaWYgbm90IGdldGF0dHIodiwgJ19wcm9wZGljdCcsIE5vbmUpOgorICAgICAgICB2Ll9wcm9wZGljdCA9IHt9CisgICAgICAgIHYuX2VsZW1kaWN0ID0ge30KKyAgICAgICAgZm9yIHN1cGVyY2xhc3NuYW1lIGluIGdldGF0dHIodiwgJ19zdXBlcmNsYXNzbmFtZXMnLCBbXSk6CisgICAgICAgICAgICBzdXBlcmNsYXNzID0gZXZhbChzdXBlcmNsYXNzbmFtZSkKKyAgICAgICAgICAgIGdldGJhc2VjbGFzc2VzKHN1cGVyY2xhc3MpCisgICAgICAgICAgICB2Ll9wcm9wZGljdC51cGRhdGUoZ2V0YXR0cihzdXBlcmNsYXNzLCAnX3Byb3BkaWN0Jywge30pKQorICAgICAgICAgICAgdi5fZWxlbWRpY3QudXBkYXRlKGdldGF0dHIoc3VwZXJjbGFzcywgJ19lbGVtZGljdCcsIHt9KSkKKyAgICAgICAgdi5fcHJvcGRpY3QudXBkYXRlKGdldGF0dHIodiwgJ19wcml2cHJvcGRpY3QnLCB7fSkpCisgICAgICAgIHYuX2VsZW1kaWN0LnVwZGF0ZShnZXRhdHRyKHYsICdfcHJpdmVsZW1kaWN0Jywge30pKQorCitpbXBvcnQgU3RkU3VpdGVzCisKKyMKKyMgU2V0IHByb3BlcnR5IGFuZCBlbGVtZW50IGRpY3Rpb25hcmllcyBub3cgdGhhdCBhbGwgY2xhc3NlcyBoYXZlIGJlZW4gZGVmaW5lZAorIworZ2V0YmFzZWNsYXNzZXMoY29sb3IpCitnZXRiYXNlY2xhc3Nlcyh3aW5kb3cpCitnZXRiYXNlY2xhc3NlcyhhcHBsaWNhdGlvbikKK2dldGJhc2VjbGFzc2VzKGl0ZW0pCitnZXRiYXNlY2xhc3Nlcyhkb2N1bWVudCkKK2dldGJhc2VjbGFzc2VzKHdpbmRvdykKK2dldGJhc2VjbGFzc2VzKGFwcGxpY2F0aW9uKQorZ2V0YmFzZWNsYXNzZXMoY2hhcmFjdGVyKQorZ2V0YmFzZWNsYXNzZXMoYXR0YWNobWVudCkKK2dldGJhc2VjbGFzc2VzKHBhcmFncmFwaCkKK2dldGJhc2VjbGFzc2VzKHdvcmQpCitnZXRiYXNlY2xhc3NlcyhhdHRyaWJ1dGVfcnVuKQorZ2V0YmFzZWNsYXNzZXModGV4dCkKKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7CisgICAgJ2NvbHInIDogY29sb3IsCisgICAgJ2N3aW4nIDogd2luZG93LAorICAgICdjYXBwJyA6IGFwcGxpY2F0aW9uLAorICAgICdjb2JqJyA6IGl0ZW0sCisgICAgJ2RvY3UnIDogZG9jdW1lbnQsCisgICAgJ2N3aW4nIDogd2luZG93LAorICAgICdjYXBwJyA6IGFwcGxpY2F0aW9uLAorICAgICdjaGEgJyA6IGNoYXJhY3RlciwKKyAgICAnYXR0cycgOiBhdHRhY2htZW50LAorICAgICdjcGFyJyA6IHBhcmFncmFwaCwKKyAgICAnY3dvcicgOiB3b3JkLAorICAgICdjYXRyJyA6IGF0dHJpYnV0ZV9ydW4sCisgICAgJ2N0eHQnIDogdGV4dCwKK30KKworCitjbGFzcyBUZXJtaW5hbChTdGFuZGFyZF9TdWl0ZV9FdmVudHMsCisgICAgICAgIFRleHRfU3VpdGVfRXZlbnRzLAorICAgICAgICBUZXJtaW5hbF9TdWl0ZV9FdmVudHMsCisgICAgICAgIGFldG9vbHMuVGFsa1RvKToKKyAgICBfc2lnbmF0dXJlID0gJ3RybXgnCisKKyAgICBfbW9kdWxlTmFtZSA9ICdUZXJtaW5hbCcKKworICAgIF9lbGVtZGljdCA9IGFwcGxpY2F0aW9uLl9lbGVtZGljdAorICAgIF9wcm9wZGljdCA9IGFwcGxpY2F0aW9uLl9wcm9wZGljdApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjFmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbC9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjFmY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9UZXJtaW5hbC9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvX2J1aWx0aW5TdWl0ZXMvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjc1Yjk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvX2J1aWx0aW5TdWl0ZXMvX19pbml0X18ucHkKQEAgLTAsMCArMSwzMSBAQAorIiIiCitNYW51YWxseSBnZW5lcmF0ZWQgc3VpdGUgdXNlZCBhcyBiYXNlIGNsYXNzIGZvciBTdGRTdWl0ZXMgUmVxdWlyZWQgYW5kIFN0YW5kYXJkCitzdWl0ZXMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIGV2ZW50cyBhbmQgZW51bXMgaW4gdGhpcyBzdWl0ZSBiZWxvbmcKK2luIHRoZSBSZXF1aXJlZCBzdWl0ZSBhY2NvcmRpbmcgdG8gdGhlIEFwcGxlIGRvY3MsIGJ1dCB0aGV5IG9mdGVuIHNlZW0gdG8gYmUKK2luIHRoZSBTdGFuZGFyZCBzdWl0ZS4KKyIiIgorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIF9idWlsdGluU3VpdGVzIG1vZHVsZSBpcyByZW1vdmVkLiIsIHN0YWNrbGV2ZWw9MikKKworaW1wb3J0IGFldG9vbHMKK2ltcG9ydCBidWlsdGluX1N1aXRlCisKKworX2NvZGVfdG9fbW9kdWxlID0geworICAgICAgICAncmVxZCcgOiBidWlsdGluX1N1aXRlLAorICAgICAgICAnY29yZScgOiBidWlsdGluX1N1aXRlLAorfQorCisKKworX2NvZGVfdG9fZnVsbG5hbWUgPSB7CisgICAgICAgICdyZXFkJyA6ICgnX2J1aWx0aW5TdWl0ZXMuYnVpbHRpbl9TdWl0ZScsICdidWlsdGluX1N1aXRlJyksCisgICAgICAgICdjb3JlJyA6ICgnX2J1aWx0aW5TdWl0ZXMuYnVpbHRpbl9TdWl0ZScsICdidWlsdGluX1N1aXRlJyksCit9CisKK2Zyb20gYnVpbHRpbl9TdWl0ZSBpbXBvcnQgKgorCitjbGFzcyBfYnVpbHRpblN1aXRlcyhidWlsdGluX1N1aXRlX0V2ZW50cywKKyAgICAgICAgICAgICAgICBhZXRvb2xzLlRhbGtUbyk6CisgICAgX3NpZ25hdHVyZSA9ICdhc2NyJwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvX2J1aWx0aW5TdWl0ZXMvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvX2J1aWx0aW5TdWl0ZXMvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OTJiN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcy9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvX2J1aWx0aW5TdWl0ZXMvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvX2J1aWx0aW5TdWl0ZXMvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OTJiN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcy9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvX2J1aWx0aW5TdWl0ZXMvYnVpbHRpbl9TdWl0ZS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL19idWlsdGluU3VpdGVzL2J1aWx0aW5fU3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNlZTI3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL19idWlsdGluU3VpdGVzL2J1aWx0aW5fU3VpdGUucHkKQEAgLTAsMCArMSwxNDAgQEAKKyIiIlN1aXRlIGJ1aWx0aW5fU3VpdGU6IEV2ZXJ5IGFwcGxpY2F0aW9uIHN1cHBvcnRzIG9wZW4sIHJlb3BlbiwgcHJpbnQsIHJ1biwgYW5kIHF1aXQKK0xldmVsIDEsIHZlcnNpb24gMQorIiIiCisKK2ltcG9ydCBhZXRvb2xzCitpbXBvcnQgTWFjT1MKKworX2NvZGUgPSAnYWV2dCcKKworY2xhc3MgYnVpbHRpbl9TdWl0ZV9FdmVudHM6CisKKyAgICBkZWYgb3BlbihzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIib3BlbjogT3BlbiB0aGUgc3BlY2lmaWVkIG9iamVjdChzKQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogbGlzdCBvZiBvYmplY3RzIHRvIG9wZW4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYWV2dCcKKyAgICAgICAgX3N1YmNvZGUgPSAnb2RvYycKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisKKworICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmdldCgnZXJybicsIDApOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorCisgICAgZGVmIHJ1bihzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJydW46IFJ1biBhbiBhcHBsaWNhdGlvbi4gICAgICBNb3N0IGFwcGxpY2F0aW9ucyB3aWxsIG9wZW4gYW4gZW1wdHksIHVudGl0bGVkIHdpbmRvdy4KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnYWV2dCcKKyAgICAgICAgX3N1YmNvZGUgPSAnb2FwcCcKKworICAgICAgICBpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJworICAgICAgICBpZiBfbm9fb2JqZWN0IGlzIG5vdCBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworCisKKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5nZXQoJ2Vycm4nLCAwKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKworICAgIGRlZiByZW9wZW4oc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIicmVvcGVuOiBSZWFjdGl2YXRlIGEgcnVubmluZyBhcHBsaWNhdGlvbi4gIFNvbWUgYXBwbGljYXRpb25zIHdpbGwgb3BlbiBhIG5ldyB1bnRpdGxlZCB3aW5kb3cgaWYgbm8gd2luZG93IGlzIG9wZW4uCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2FldnQnCisgICAgICAgIF9zdWJjb2RlID0gJ3JhcHAnCisKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgaWYgX25vX29iamVjdCBpcyBub3QgTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBkZWYgX3ByaW50KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJwcmludDogUHJpbnQgdGhlIHNwZWNpZmllZCBvYmplY3QocykKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGxpc3Qgb2Ygb2JqZWN0cyB0byBwcmludAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhZXZ0JworICAgICAgICBfc3ViY29kZSA9ICdwZG9jJworCisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKworCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX3F1aXQgPSB7CisgICAgICAgICAgICAnc2F2aW5nJyA6ICdzYXZvJywKKyAgICB9CisKKyAgICBkZWYgcXVpdChzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJxdWl0OiBRdWl0IGFuIGFwcGxpY2F0aW9uCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgc2F2aW5nOiBzcGVjaWZpZXMgd2hldGhlciB0byBzYXZlIGN1cnJlbnRseSBvcGVuIGRvY3VtZW50cworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdhZXZ0JworICAgICAgICBfc3ViY29kZSA9ICdxdWl0JworCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3F1aXQpCisgICAgICAgIGlmIF9ub19vYmplY3QgaXMgbm90IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ3Nhdm8nLCBfRW51bV9zYXZvKQorCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuZ2V0KCdlcnJuJywgMCk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisKKyAgICBfYXJnbWFwX2Nsb3NlID0geworICAgICAgICAgICAgJ3NhdmluZycgOiAnc2F2bycsCisgICAgICAgICAgICAnc2F2aW5nX2luJyA6ICdrZmlsJywKKyAgICB9CisKK19FbnVtX3Nhdm8gPSB7CisgICAgICAgICd5ZXMnIDogJ3llcyAnLCAjIFNhdmUgb2JqZWN0cyBub3cKKyAgICAgICAgJ25vJyA6ICdubyAgICAgICcsICAgICAgIyBEbyBub3Qgc2F2ZSBvYmplY3RzCisgICAgICAgICdhc2snIDogJ2FzayAnLCAjIEFzayB0aGUgdXNlciB3aGV0aGVyIHRvIHNhdmUKK30KKworIworIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCisjCitfY2xhc3NkZWNsYXJhdGlvbnMgPSB7Cit9CisKK19wcm9wZGVjbGFyYXRpb25zID0geworfQorCitfY29tcGRlY2xhcmF0aW9ucyA9IHsKK30KKworX2VudW1kZWNsYXJhdGlvbnMgPSB7CisgICAgICAgICdzYXZvJyA6IF9FbnVtX3Nhdm8sCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcy9idWlsdGluX1N1aXRlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL19idWlsdGluU3VpdGVzL2J1aWx0aW5fU3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjJkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcy9idWlsdGluX1N1aXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcy9idWlsdGluX1N1aXRlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL19idWlsdGluU3VpdGVzL2J1aWx0aW5fU3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjJkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcy9idWlsdGluX1N1aXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL21hY2Vycm9ycy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbWFjZXJyb3JzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZDc5ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL21hY2Vycm9ycy5weQpAQCAtMCwwICsxLDE4NTcgQEAKKyMgLWNvZGluZz1sYXRpbjEtCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgbWFjZXJyb3JzIG1vZHVsZSBpcyByZW1vdmVkLiIsIHN0YWNrbGV2ZWw9MikKKworc3ZUZW1wRGlzYWJsZSAgID0gICAtMzI3NjggICNzdlRlbXBEaXNhYmxlCitzdkRpc2FibGVkICA9ICAgLTMyNjQwICAjUmVzZXJ2ZSByYW5nZSAtMzI2NDAgdG8gLTMyNzY4IGZvciBBcHBsZSB0ZW1wIGRpc2FibGVzLgorZm9udE5vdE91dGxpbmVFcnIgICA9ICAgLTMyNjE1ICAjYml0bWFwIGZvbnQgcGFzc2VkIHRvIHJvdXRpbmUgdGhhdCBkb2VzIG91dGxpbmVzIG9ubHkKK2tVUkw2OGtOb3RTdXBwb3J0ZWRFcnJvciAgICA9ICAgLTMwNzg4ICAja1VSTDY4a05vdFN1cHBvcnRlZEVycm9yCitrVVJMQWNjZXNzTm90QXZhaWxhYmxlRXJyb3IgPSAgIC0zMDc4NyAgI2tVUkxBY2Nlc3NOb3RBdmFpbGFibGVFcnJvcgora1VSTEludmFsaWRDb25maWd1cmF0aW9uRXJyb3IgICA9ICAgLTMwNzg2ICAja1VSTEludmFsaWRDb25maWd1cmF0aW9uRXJyb3IKK2tVUkxFeHRlbnNpb25GYWlsdXJlRXJyb3IgICA9ICAgLTMwNzg1ICAja1VSTEV4dGVuc2lvbkZhaWx1cmVFcnJvcgora1VSTEZpbGVFbXB0eUVycm9yICA9ICAgLTMwNzgzICAja1VSTEZpbGVFbXB0eUVycm9yCitrVVJMSW52YWxpZENhbGxFcnJvciAgICA9ICAgLTMwNzgxICAja1VSTEludmFsaWRDYWxsRXJyb3IKK2tVUkxVbnNldHRhYmxlUHJvcGVydHlFcnJvciA9ICAgLTMwNzgwICAja1VSTFVuc2V0dGFibGVQcm9wZXJ0eUVycm9yCitrVVJMUHJvcGVydHlCdWZmZXJUb29TbWFsbEVycm9yID0gICAtMzA3NzkgICNrVVJMUHJvcGVydHlCdWZmZXJUb29TbWFsbEVycm9yCitrVVJMVW5rbm93blByb3BlcnR5RXJyb3IgICAgPSAgIC0zMDc3OCAgI2tVUkxVbmtub3duUHJvcGVydHlFcnJvcgora1VSTFByb3BlcnR5Tm90WWV0S25vd25FcnJvciAgICA9ICAgLTMwNzc3ICAja1VSTFByb3BlcnR5Tm90WWV0S25vd25FcnJvcgora1VSTEF1dGhlbnRpY2F0aW9uRXJyb3IgPSAgIC0zMDc3NiAgI2tVUkxBdXRoZW50aWNhdGlvbkVycm9yCitrVVJMU2VydmVyQnVzeUVycm9yID0gICAtMzA3NzUgICNrVVJMU2VydmVyQnVzeUVycm9yCitrVVJMVW5zdXBwb3J0ZWRTY2hlbWVFcnJvciAgPSAgIC0zMDc3NCAgI2tVUkxVbnN1cHBvcnRlZFNjaGVtZUVycm9yCitrVVJMSW52YWxpZFVSTEVycm9yID0gICAtMzA3NzMgICNrVVJMSW52YWxpZFVSTEVycm9yCitrVVJMRGVzdGluYXRpb25FeGlzdHNFcnJvciAgPSAgIC0zMDc3MiAgI2tVUkxEZXN0aW5hdGlvbkV4aXN0c0Vycm9yCitrVVJMUHJvZ3Jlc3NBbHJlYWR5RGlzcGxheWVkRXJyb3IgICA9ICAgLTMwNzcxICAja1VSTFByb2dyZXNzQWxyZWFkeURpc3BsYXllZEVycm9yCitrVVJMSW52YWxpZFVSTFJlZmVyZW5jZUVycm9yICAgID0gICAtMzA3NzAgICNrVVJMSW52YWxpZFVSTFJlZmVyZW5jZUVycm9yCitjb250cm9sSGFuZGxlSW52YWxpZEVyciA9ICAgLTMwNTk5ICAjY29udHJvbEhhbmRsZUludmFsaWRFcnIKK2NvbnRyb2xJbnZhbGlkRGF0YVZlcnNpb25FcnIgICAgPSAgIC0zMDU5NyAgI2NvbnRyb2xJbnZhbGlkRGF0YVZlcnNpb25FcnIKK2Vyckl0ZW1Ob3RDb250cm9sICAgPSAgIC0zMDU5NiAgI2Vyckl0ZW1Ob3RDb250cm9sCitlcnJDYW50RW1iZWRSb290ICAgID0gICAtMzA1OTUgICNlcnJDYW50RW1iZWRSb290CitlcnJDYW50RW1iZWRJbnRvU2VsZiAgICA9ICAgLTMwNTk0ICAjZXJyQ2FudEVtYmVkSW50b1NlbGYKK2VycldpbmRvd1JlZ2lvbkNvZGVJbnZhbGlkICA9ICAgLTMwNTkzICAjZXJyV2luZG93UmVnaW9uQ29kZUludmFsaWQKK2VyckNvbnRyb2xIaWRkZW5PckRpc2FibGVkICA9ICAgLTMwNTkyICAjZXJyQ29udHJvbEhpZGRlbk9yRGlzYWJsZWQKK2VyckRhdGFTaXplTWlzbWF0Y2ggPSAgIC0zMDU5MSAgI2VyckRhdGFTaXplTWlzbWF0Y2gKK2VyckNvbnRyb2xJc05vdEVtYmVkZGVyID0gICAtMzA1OTAgICNlcnJDb250cm9sSXNOb3RFbWJlZGRlcgorZXJyQ29udHJvbHNBbHJlYWR5RXhpc3QgPSAgIC0zMDU4OSAgI2VyckNvbnRyb2xzQWxyZWFkeUV4aXN0CitlcnJJbnZhbGlkUGFydENvZGUgID0gICAtMzA1ODggICNlcnJJbnZhbGlkUGFydENvZGUKK2VyclJvb3RBbHJlYWR5RXhpc3RzICAgID0gICAtMzA1ODcgICNlcnJSb290QWxyZWFkeUV4aXN0cworZXJyTm9Sb290Q29udHJvbCAgICA9ICAgLTMwNTg2ICAjZXJyTm9Sb290Q29udHJvbAorZXJyQ291bGRudFNldEZvY3VzICA9ICAgLTMwNTg1ICAjZXJyQ291bGRudFNldEZvY3VzCitlcnJVbmtub3duQ29udHJvbCAgID0gICAtMzA1ODQgICNlcnJVbmtub3duQ29udHJvbAorZXJyV2luZG93RG9lc250U3VwcG9ydEZvY3VzID0gICAtMzA1ODMgICNlcnJXaW5kb3dEb2VzbnRTdXBwb3J0Rm9jdXMKK2VyckNvbnRyb2xEb2VzbnRTdXBwb3J0Rm9jdXMgICAgPSAgIC0zMDU4MiAgI2VyckNvbnRyb2xEb2VzbnRTdXBwb3J0Rm9jdXMKK2VyckRhdGFOb3RTdXBwb3J0ZWQgPSAgIC0zMDU4MSAgI2VyckRhdGFOb3RTdXBwb3J0ZWQKK2Vyck1lc3NhZ2VOb3RTdXBwb3J0ZWQgID0gICAtMzA1ODAgICNlcnJNZXNzYWdlTm90U3VwcG9ydGVkCit0aGVtZU1vbml0b3JEZXB0aE5vdFN1cHBvcnRlZEVyciAgICA9ICAgLTMwNTY3ICAjdGhlbWUgbm90IHN1cHBvcnRlZCBhdCBtb25pdG9yIGRlcHRoCit0aGVtZVNjcmlwdEZvbnROb3RGb3VuZEVyciAgPSAgIC0zMDU2NiAgI3RoZW1lIGZvbnQgcmVxdWVzdGVkIGZvciB1bmluc3RhbGxlZCBzY3JpcHQgc3lzdGVtCit0aGVtZUJhZEN1cnNvckluZGV4RXJyICA9ICAgLTMwNTY1ICAjdGhlbWVCYWRDdXJzb3JJbmRleEVycgordGhlbWVIYXNOb0FjY2VudHNFcnIgICAgPSAgIC0zMDU2NCAgI3RoZW1lSGFzTm9BY2NlbnRzRXJyCit0aGVtZUJhZFRleHRDb2xvckVyciAgICA9ICAgLTMwNTYzICAjdGhlbWVCYWRUZXh0Q29sb3JFcnIKK3RoZW1lUHJvY2Vzc05vdFJlZ2lzdGVyZWRFcnIgICAgPSAgIC0zMDU2MiAgI3RoZW1lUHJvY2Vzc05vdFJlZ2lzdGVyZWRFcnIKK3RoZW1lUHJvY2Vzc1JlZ2lzdGVyZWRFcnIgICA9ICAgLTMwNTYxICAjdGhlbWVQcm9jZXNzUmVnaXN0ZXJlZEVycgordGhlbWVJbnZhbGlkQnJ1c2hFcnIgICAgPSAgIC0zMDU2MCAgI3BhdHRlcm4gaW5kZXggaW52YWxpZAorcXR2clVuaW5pdGlhbGl6ZWQgICA9ICAgLTMwNTU1ICAjcXR2clVuaW5pdGlhbGl6ZWQKK3F0dnJMaWJyYXJ5TG9hZEVyciAgPSAgIC0zMDU1NCAgI3F0dnJMaWJyYXJ5TG9hZEVycgorc3RyZWFtaW5nTm9kZU5vdFJlYWR5RXJyICAgID0gICAtMzA1NTMgICNzdHJlYW1pbmdOb2RlTm90UmVhZHlFcnIKK25vTWVtb3J5Tm9kZUZhaWxlZEluaXRpYWxpemUgICAgPSAgIC0zMDU1MiAgI25vTWVtb3J5Tm9kZUZhaWxlZEluaXRpYWxpemUKK2ludmFsaWRIb3RTcG90SURFcnIgPSAgIC0zMDU1MSAgI2ludmFsaWRIb3RTcG90SURFcnIKK2ludmFsaWROb2RlRm9ybWF0RXJyICAgID0gICAtMzA1NTAgICNpbnZhbGlkTm9kZUZvcm1hdEVycgorbGltaXRSZWFjaGVkRXJyID0gICAtMzA1NDkgICNsaW1pdFJlYWNoZWRFcnIKK3NldHRpbmdOb3RTdXBwb3J0ZWRCeU5vZGVFcnIgICAgPSAgIC0zMDU0OCAgI3NldHRpbmdOb3RTdXBwb3J0ZWRCeU5vZGVFcnIKK3Byb3BlcnR5Tm90U3VwcG9ydGVkQnlOb2RlRXJyICAgPSAgIC0zMDU0NyAgI3Byb3BlcnR5Tm90U3VwcG9ydGVkQnlOb2RlRXJyCit0aW1lTm90SW5WaWV3RXJyICAgID0gICAtMzA1NDYgICN0aW1lTm90SW5WaWV3RXJyCitpbnZhbGlkVmlld1N0YXRlRXJyID0gICAtMzA1NDUgICNpbnZhbGlkVmlld1N0YXRlRXJyCitpbnZhbGlkTm9kZUlERXJyICAgID0gICAtMzA1NDQgICNpbnZhbGlkTm9kZUlERXJyCitzZWxlY3Rvck5vdFN1cHBvcnRlZEJ5Tm9kZUVyciAgID0gICAtMzA1NDMgICNzZWxlY3Rvck5vdFN1cHBvcnRlZEJ5Tm9kZUVycgorY2FsbE5vdFN1cHBvcnRlZEJ5Tm9kZUVyciAgID0gICAtMzA1NDIgICNjYWxsTm90U3VwcG9ydGVkQnlOb2RlRXJyCitjb25zdHJhaW50UmVhY2hlZEVyciAgICA9ICAgLTMwNTQxICAjY29uc3RyYWludFJlYWNoZWRFcnIKK25vdEFRVFZSTW92aWVFcnIgICAgPSAgIC0zMDU0MCAgI25vdEFRVFZSTW92aWVFcnIKK2tGQkNub1N1Y2hIaXQgICA9ICAgLTMwNTMyICAja0ZCQ25vU3VjaEhpdAora0ZCQ2JhZFNlYXJjaFNlc3Npb24gICAgPSAgIC0zMDUzMSAgI2tGQkNiYWRTZWFyY2hTZXNzaW9uCitrRkJDaW5kZXhEaXNrSU9GYWlsZWQgICA9ICAgLTMwNTMwICAja0ZCQ2luZGV4RGlza0lPRmFpbGVkCitrRkJDc3VtbWFyaXphdGlvbkNhbmNlbGVkICAgPSAgIC0zMDUyOSAgI2tGQkNzdW1tYXJpemF0aW9uQ2FuY2VsZWQKK2tGQkNiYWRJbmRleEZpbGVWZXJzaW9uID0gICAtMzA1MjggICNrRkJDYmFkSW5kZXhGaWxlVmVyc2lvbgora0ZCQ2FuYWx5c2lzTm90QXZhaWxhYmxlICAgID0gICAtMzA1MjcgICNrRkJDYW5hbHlzaXNOb3RBdmFpbGFibGUKK2tGQkNpbGxlZ2FsU2Vzc2lvbkNoYW5nZSAgICA9ICAgLTMwNTI2ICAjdHJpZWQgdG8gYWRkL3JlbW92ZSB2b2xzIHRvIGEgc2Vzc2lvbgora0ZCQ3NvbWVGaWxlc05vdEluZGV4ZWQgPSAgIC0zMDUyNSAgI2tGQkNzb21lRmlsZXNOb3RJbmRleGVkCitrRkJDc2VhcmNoRmFpbGVkICAgID0gICAtMzA1MjQgICNrRkJDc2VhcmNoRmFpbGVkCitrRkJDaW5kZXhOb3RBdmFpbGFibGUgICA9ICAgLTMwNTIzICAja0ZCQ2luZGV4Tm90QXZhaWxhYmxlCitrRkJDaW5kZXhGaWxlRGVzdHJveWVkICA9ICAgLTMwNTIyICAja0ZCQ2luZGV4RmlsZURlc3Ryb3llZAora0ZCQ2FjY2Vzc0NhbmNlbGVkICA9ICAgLTMwNTIxICAja0ZCQ2FjY2Vzc0NhbmNlbGVkCitrRkJDaW5kZXhpbmdDYW5jZWxlZCAgICA9ICAgLTMwNTIwICAja0ZCQ2luZGV4aW5nQ2FuY2VsZWQKK2tGQkNub1NlYXJjaFNlc3Npb24gPSAgIC0zMDUxOSAgI2tGQkNub1NlYXJjaFNlc3Npb24KK2tGQkNpbmRleE5vdEZvdW5kICAgPSAgIC0zMDUxOCAgI2tGQkNpbmRleE5vdEZvdW5kCitrRkJDZmx1c2hGYWlsZWQgPSAgIC0zMDUxNyAgI2tGQkNmbHVzaEZhaWxlZAora0ZCQ2FkZERvY0ZhaWxlZCAgICA9ICAgLTMwNTE2ICAja0ZCQ2FkZERvY0ZhaWxlZAora0ZCQ2FjY2Vzc29yU3RvcmVGYWlsZWQgPSAgIC0zMDUxNSAgI2tGQkNhY2Nlc3NvclN0b3JlRmFpbGVkCitrRkJDaW5kZXhDcmVhdGlvbkZhaWxlZCA9ICAgLTMwNTE0ICAjY291bGRuJ3QgY3JlYXRlIGluZGV4CitrRkJDbWVyZ2luZ0ZhaWxlZCAgID0gICAtMzA1MTMgICNjb3VsZG4ndCBtZXJnZSBpbmRleCBmaWxlcwora0ZCQ3Rva2VuaXphdGlvbkZhaWxlZCAgPSAgIC0zMDUxMiAgI2NvdWxkbid0IHJlYWQgZnJvbSBkb2N1bWVudCBvciBxdWVyeQora0ZCQ21vdmVGYWlsZWQgID0gICAtMzA1MTEgICNWLVR3aW4gZXhjZXB0aW9uIGNhdWdodAora0ZCQ2RlbGV0aW9uRmFpbGVkICA9ICAgLTMwNTEwICAjVi1Ud2luIGV4Y2VwdGlvbiBjYXVnaHQKK2tGQkNjb21taXRGYWlsZWQgICAgPSAgIC0zMDUwOSAgI1YtVHdpbiBleGNlcHRpb24gY2F1Z2h0CitrRkJDaW5kZXhpbmdGYWlsZWQgID0gICAtMzA1MDggICNWLVR3aW4gZXhjZXB0aW9uIGNhdWdodAora0ZCQ3ZhbGlkYXRpb25GYWlsZWQgICAgPSAgIC0zMDUwNyAgI1YtVHdpbiBleGNlcHRpb24gY2F1Z2h0CitrRkJDY29tcGFjdGlvbkZhaWxlZCAgICA9ICAgLTMwNTA2ICAjVi1Ud2luIGV4Y2VwdGlvbiBjYXVnaHQKK2tGQkNiYWRJbmRleEZpbGUgICAgPSAgIC0zMDUwNSAgI2JhZCBGU1NwZWMsIG9yIGJhZCBkYXRhIGluIGZpbGUKK2tGQkNmaWxlTm90SW5kZXhlZCAgPSAgIC0zMDUwNCAgI2tGQkNmaWxlTm90SW5kZXhlZAora0ZCQ2JhZFBhcmFtICAgID0gICAtMzA1MDMgICNrRkJDYmFkUGFyYW0KK2tGQkNhbGxvY0ZhaWxlZCA9ICAgLTMwNTAyICAjcHJvYmFibHkgbG93IG1lbW9yeQora0ZCQ25vSW5kZXhlc0ZvdW5kICA9ICAgLTMwNTAxICAja0ZCQ25vSW5kZXhlc0ZvdW5kCitrRkJDdlR3aW5FeGNlcHRpb25FcnIgICA9ICAgLTMwNTAwICAjbm8gdGVsbGluZyB3aGF0IGl0IHdhcwora0RTcFN0ZXJlb0NvbnRleHRFcnIgICAgPSAgIC0zMDQ1MCAgI2tEU3BTdGVyZW9Db250ZXh0RXJyCitrRFNwSW50ZXJuYWxFcnIgPSAgIC0zMDQ0OSAgI2tEU3BJbnRlcm5hbEVycgora0RTcENvbmZpcm1Td2l0Y2hXYXJuaW5nICAgID0gICAtMzA0NDggICNrRFNwQ29uZmlybVN3aXRjaFdhcm5pbmcKK2tEU3BGcmFtZVJhdGVOb3RSZWFkeUVyciAgICA9ICAgLTMwNDQ3ICAja0RTcEZyYW1lUmF0ZU5vdFJlYWR5RXJyCitrRFNwQ29udGV4dE5vdEZvdW5kRXJyICA9ICAgLTMwNDQ2ICAja0RTcENvbnRleHROb3RGb3VuZEVycgora0RTcENvbnRleHROb3RSZXNlcnZlZEVyciAgID0gICAtMzA0NDUgICNrRFNwQ29udGV4dE5vdFJlc2VydmVkRXJyCitrRFNwQ29udGV4dEFscmVhZHlSZXNlcnZlZEVyciAgID0gICAtMzA0NDQgICNrRFNwQ29udGV4dEFscmVhZHlSZXNlcnZlZEVycgora0RTcEludmFsaWRBdHRyaWJ1dGVzRXJyICAgID0gICAtMzA0NDMgICNrRFNwSW52YWxpZEF0dHJpYnV0ZXNFcnIKK2tEU3BJbnZhbGlkQ29udGV4dEVyciAgID0gICAtMzA0NDIgICNrRFNwSW52YWxpZENvbnRleHRFcnIKK2tEU3BTeXN0ZW1TV1Rvb09sZEVyciAgID0gICAtMzA0NDEgICNrRFNwU3lzdGVtU1dUb29PbGRFcnIKK2tEU3BOb3RJbml0aWFsaXplZEVyciAgID0gICAtMzA0NDAgICNrRFNwTm90SW5pdGlhbGl6ZWRFcnIKK2tJU3BMaXN0QnVzeUVyciA9ICAgLTMwNDI5ICAja0lTcExpc3RCdXN5RXJyCitrSVNwRGV2aWNlQWN0aXZlRXJyID0gICAtMzA0MjggICNrSVNwRGV2aWNlQWN0aXZlRXJyCitrSVNwU3lzdGVtQWN0aXZlRXJyID0gICAtMzA0MjcgICNrSVNwU3lzdGVtQWN0aXZlRXJyCitrSVNwRGV2aWNlSW5hY3RpdmVFcnIgICA9ICAgLTMwNDI2ICAja0lTcERldmljZUluYWN0aXZlRXJyCitrSVNwU3lzdGVtSW5hY3RpdmVFcnIgICA9ICAgLTMwNDI1ICAja0lTcFN5c3RlbUluYWN0aXZlRXJyCitrSVNwRWxlbWVudE5vdEluTGlzdEVyciA9ICAgLTMwNDI0ICAja0lTcEVsZW1lbnROb3RJbkxpc3RFcnIKK2tJU3BFbGVtZW50SW5MaXN0RXJyICAgID0gICAtMzA0MjMgICNrSVNwRWxlbWVudEluTGlzdEVycgora0lTcEJ1ZmZlclRvU21hbGxFcnIgICAgPSAgIC0zMDQyMiAgI2tJU3BCdWZmZXJUb1NtYWxsRXJyCitrSVNwU3lzdGVtTGlzdEVyciAgID0gICAtMzA0MjEgICNrSVNwU3lzdGVtTGlzdEVycgora0lTcEludGVybmFsRXJyID0gICAtMzA0MjAgICNrSVNwSW50ZXJuYWxFcnIKK2tOU3BKb2luRmFpbGVkRXJyICAgPSAgIC0zMDM5OSAgI2tOU3BKb2luRmFpbGVkRXJyCitrTlNwQ2FudEJsb2NrRXJyICAgID0gICAtMzAzOTggICNrTlNwQ2FudEJsb2NrRXJyCitrTlNwTWVzc2FnZVRvb0JpZ0VyciAgICA9ICAgLTMwMzk3ICAja05TcE1lc3NhZ2VUb29CaWdFcnIKK2tOU3BTZW5kRmFpbGVkRXJyICAgPSAgIC0zMDM5NiAgI2tOU3BTZW5kRmFpbGVkRXJyCitrTlNwQ29ubmVjdEZhaWxlZEVyciAgICA9ICAgLTMwMzk1ICAja05TcENvbm5lY3RGYWlsZWRFcnIKK2tOU3BHYW1lVGVybWluYXRlZEVyciAgID0gICAtMzAzOTQgICNrTlNwR2FtZVRlcm1pbmF0ZWRFcnIKK2tOU3BUaW1lb3V0RXJyICA9ICAgLTMwMzkzICAja05TcFRpbWVvdXRFcnIKK2tOU3BJbnZhbGlkUHJvdG9jb2xMaXN0RXJyICA9ICAgLTMwMzkyICAja05TcEludmFsaWRQcm90b2NvbExpc3RFcnIKK2tOU3BJbnZhbGlkUHJvdG9jb2xSZWZFcnIgICA9ICAgLTMwMzkxICAja05TcEludmFsaWRQcm90b2NvbFJlZkVycgora05TcEludmFsaWREZWZpbml0aW9uRXJyICAgID0gICAtMzAzOTAgICNrTlNwSW52YWxpZERlZmluaXRpb25FcnIKK2tOU3BBZGRQbGF5ZXJGYWlsZWRFcnIgID0gICAtMzAzODkgICNrTlNwQWRkUGxheWVyRmFpbGVkRXJyCitrTlNwQ3JlYXRlR3JvdXBGYWlsZWRFcnIgICAgPSAgIC0zMDM4OCAgI2tOU3BDcmVhdGVHcm91cEZhaWxlZEVycgora05TcE5vSG9zdFZvbHVudGVlcnNFcnIgPSAgIC0zMDM4NyAgI2tOU3BOb0hvc3RWb2x1bnRlZXJzRXJyCitrTlNwTm9Hcm91cHNFcnIgPSAgIC0zMDM4NiAgI2tOU3BOb0dyb3Vwc0Vycgora05TcE5vUGxheWVyc0VyciAgICA9ICAgLTMwMzg1ICAja05TcE5vUGxheWVyc0Vycgora05TcEludmFsaWRHcm91cElERXJyICAgPSAgIC0zMDM4NCAgI2tOU3BJbnZhbGlkR3JvdXBJREVycgora05TcEludmFsaWRQbGF5ZXJJREVyciAgPSAgIC0zMDM4MyAgI2tOU3BJbnZhbGlkUGxheWVySURFcnIKK2tOU3BOYW1lUmVxdWlyZWRFcnIgPSAgIC0zMDM4MiAgI2tOU3BOYW1lUmVxdWlyZWRFcnIKK2tOU3BGZWF0dXJlTm90SW1wbGVtZW50ZWRFcnIgICAgPSAgIC0zMDM4MSAgI2tOU3BGZWF0dXJlTm90SW1wbGVtZW50ZWRFcnIKK2tOU3BBZGRyZXNzSW5Vc2VFcnIgPSAgIC0zMDM4MCAgI2tOU3BBZGRyZXNzSW5Vc2VFcnIKK2tOU3BSZW1vdmVQbGF5ZXJGYWlsZWRFcnIgICA9ICAgLTMwMzc5ICAja05TcFJlbW92ZVBsYXllckZhaWxlZEVycgora05TcEZyZWVRRXhoYXVzdGVkRXJyICAgPSAgIC0zMDM3OCAgI2tOU3BGcmVlUUV4aGF1c3RlZEVycgora05TcEludmFsaWRBZGRyZXNzRXJyICAgPSAgIC0zMDM3NyAgI2tOU3BJbnZhbGlkQWRkcmVzc0Vycgora05TcE5vdEFkdmVydGlzaW5nRXJyICAgPSAgIC0zMDM3NiAgI2tOU3BOb3RBZHZlcnRpc2luZ0Vycgora05TcEFscmVhZHlBZHZlcnRpc2luZ0VyciAgID0gICAtMzAzNzQgICNrTlNwQWxyZWFkeUFkdmVydGlzaW5nRXJyCitrTlNwTWVtQWxsb2NhdGlvbkVyciAgICA9ICAgLTMwMzczICAja05TcE1lbUFsbG9jYXRpb25FcnIKK2tOU3BPVFZlcnNpb25Ub29PbGRFcnIgID0gICAtMzAzNzEgICNrTlNwT1RWZXJzaW9uVG9vT2xkRXJyCitrTlNwT1ROb3RQcmVzZW50RXJyID0gICAtMzAzNzAgICNrTlNwT1ROb3RQcmVzZW50RXJyCitrTlNwSW52YWxpZFBhcmFtZXRlckVyciA9ICAgLTMwMzY5ICAja05TcEludmFsaWRQYXJhbWV0ZXJFcnIKK2tOU3BJbnZhbGlkR2FtZVJlZkVyciAgID0gICAtMzAzNjcgICNrTlNwSW52YWxpZEdhbWVSZWZFcnIKK2tOU3BQcm90b2NvbE5vdEF2YWlsYWJsZUVyciA9ICAgLTMwMzY2ICAja05TcFByb3RvY29sTm90QXZhaWxhYmxlRXJyCitrTlNwSG9zdEZhaWxlZEVyciAgID0gICAtMzAzNjUgICNrTlNwSG9zdEZhaWxlZEVycgora05TcFBpcGVGdWxsRXJyID0gICAtMzAzNjQgICNrTlNwUGlwZUZ1bGxFcnIKK2tOU3BUb3BvbG9neU5vdFN1cHBvcnRlZEVyciA9ICAgLTMwMzYyICAja05TcFRvcG9sb2d5Tm90U3VwcG9ydGVkRXJyCitrTlNwQWxyZWFkeUluaXRpYWxpemVkRXJyICAgPSAgIC0zMDM2MSAgI2tOU3BBbHJlYWR5SW5pdGlhbGl6ZWRFcnIKK2tOU3BJbml0aWFsaXphdGlvbkZhaWxlZEVyciA9ICAgLTMwMzYwICAja05TcEluaXRpYWxpemF0aW9uRmFpbGVkRXJyCitrU1NwU2NhbGVUb1plcm9FcnIgID0gICAtMzAzNDQgICNrU1NwU2NhbGVUb1plcm9FcnIKK2tTU3BQYXJhbGxlbFVwVmVjdG9yRXJyID0gICAtMzAzNDMgICNrU1NwUGFyYWxsZWxVcFZlY3RvckVycgora1NTcENhbnRJbnN0YWxsRXJyICA9ICAgLTMwMzQyICAja1NTcENhbnRJbnN0YWxsRXJyCitrU1NwVmVyc2lvbkVyciAgPSAgIC0zMDM0MSAgI2tTU3BWZXJzaW9uRXJyCitrU1NwSW50ZXJuYWxFcnIgPSAgIC0zMDM0MCAgI2tTU3BJbnRlcm5hbEVycgora0FMTUludGVybmFsRXJyID0gICAtMzAwNDkgICNrQUxNSW50ZXJuYWxFcnIKK2tBTE1Hcm91cE5vdEZvdW5kRXJyICAgID0gICAtMzAwNDggICNrQUxNR3JvdXBOb3RGb3VuZEVycgora0FMTU5vU3VjaE1vZHVsZUVyciA9ICAgLTMwMDQ3ICAja0FMTU5vU3VjaE1vZHVsZUVycgora0FMTU1vZHVsZUNvbW11bmljYXRpb25FcnIgID0gICAtMzAwNDYgICNrQUxNTW9kdWxlQ29tbXVuaWNhdGlvbkVycgora0FMTUR1cGxpY2F0ZU1vZHVsZUVyciAgPSAgIC0zMDA0NSAgI2tBTE1EdXBsaWNhdGVNb2R1bGVFcnIKK2tBTE1JbnN0YWxsYXRpb25FcnIgPSAgIC0zMDA0NCAgI2tBTE1JbnN0YWxsYXRpb25FcnIKK2tBTE1EZWZlclN3aXRjaEVyciAgPSAgIC0zMDA0MyAgI2tBTE1EZWZlclN3aXRjaEVycgora0FMTVJlYm9vdEZsYWdzTGV2ZWxFcnIgPSAgIC0zMDA0MiAgI2tBTE1SZWJvb3RGbGFnc0xldmVsRXJyCitrTG9jYWxlc0RlZmF1bHREaXNwbGF5U3RhdHVzICAgID0gICAtMzAwMjkgICNSZXF1ZXN0ZWQgZGlzcGxheSBsb2NhbGUgdW5hdmFpbGFibGUsIHVzZWQgZGVmYXVsdAora0xvY2FsZXNUYWJsZUZvcm1hdEVyciAgPSAgIC0zMDAwMiAgI2tMb2NhbGVzVGFibGVGb3JtYXRFcnIKK2tMb2NhbGVzQnVmZmVyVG9vU21hbGxFcnIgICA9ICAgLTMwMDAxICAja0xvY2FsZXNCdWZmZXJUb29TbWFsbEVycgora0ZOU05hbWVOb3RGb3VuZEVyciA9ICAgLTI5NTg5ICAjVGhlIG5hbWUgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtdGVycyB3YXMgbm90IGZvdW5kCitrRk5TQmFkRmxhdHRlbmVkU2l6ZUVyciA9ICAgLTI5NTg3ICAjZmxhdHRlbmVkIHNpemUgZGlkbid0IG1hdGNoIGlucHV0IG9yIHdhcyB0b28gc21hbGwKK2tGTlNJbnN1ZmZpY2llbnREYXRhRXJyID0gICAtMjk1ODYgICNpbnN1ZmZpY2llbnQgZGF0YSBmb3IgdGhlIG9wZXJhdGlvbgora0ZOU01pc21hdGNoRXJyID0gICAtMjk1ODUgICNyZWZlcmVuY2UgZGlkbid0IG1hdGNoIG9yIHdhc24ndCBmb3VuZCBpbiBwcm9maWxlCitrRk5TRHVwbGljYXRlUmVmZXJlbmNlRXJyICAgPSAgIC0yOTU4NCAgI3RoZSByZWYuIGJlaW5nIGFkZGVkIGlzIGFscmVhZHkgaW4gdGhlIHByb2ZpbGUKK2tGTlNCYWRQcm9maWxlVmVyc2lvbkVyciAgICA9ICAgLTI5NTgzICAjcHJvZmlsZSB2ZXJzaW9uIGlzIG91dCBvZiBrbm93biByYW5nZQora0ZOU0ludmFsaWRQcm9maWxlRXJyICAgPSAgIC0yOTU4MiAgI3Byb2ZpbGUgaXMgTlVMTCBvciBvdGhlcndpc2UgYmFkCitrRk5TQmFkUmVmZXJlbmNlVmVyc2lvbkVyciAgPSAgIC0yOTU4MSAgI3JlZi4gdmVyc2lvbiBpcyBvdXQgb2Yga25vd24gcmFuZ2UKK2tGTlNJbnZhbGlkUmVmZXJlbmNlRXJyID0gICAtMjk1ODAgICNyZWYuIHdhcyBOVUxMIG9yIG90aGVyd2lzZSBiYWQKK2tDb2xsYXRlSW52YWxpZENvbGxhdGlvblJlZiA9ICAgLTI5NTA3ICAja0NvbGxhdGVJbnZhbGlkQ29sbGF0aW9uUmVmCitrQ29sbGF0ZUJ1ZmZlclRvb1NtYWxsICA9ICAgLTI5NTA2ICAja0NvbGxhdGVCdWZmZXJUb29TbWFsbAora0NvbGxhdGVJbnZhbGlkQ2hhciA9ICAgLTI5NTA1ICAja0NvbGxhdGVJbnZhbGlkQ2hhcgora0NvbGxhdGVQYXR0ZXJuTm90Rm91bmRFcnIgID0gICAtMjk1MDQgICNrQ29sbGF0ZVBhdHRlcm5Ob3RGb3VuZEVycgora0NvbGxhdGVVbmljb2RlQ29udmVydEZhaWxlZEVyciA9ICAgLTI5NTAzICAja0NvbGxhdGVVbmljb2RlQ29udmVydEZhaWxlZEVycgora0NvbGxhdGVNaXNzaW5nVW5pY29kZVRhYmxlRXJyICA9ICAgLTI5NTAyICAja0NvbGxhdGVNaXNzaW5nVW5pY29kZVRhYmxlRXJyCitrQ29sbGF0ZUludmFsaWRPcHRpb25zICA9ICAgLTI5NTAxICAja0NvbGxhdGVJbnZhbGlkT3B0aW9ucwora0NvbGxhdGVBdHRyaWJ1dGVzTm90Rm91bmRFcnIgICA9ICAgLTI5NTAwICAja0NvbGxhdGVBdHRyaWJ1dGVzTm90Rm91bmRFcnIKK2tNUEludmFsaWRJREVyciA9ICAgLTI5Mjk5ICAja01QSW52YWxpZElERXJyCitrTVBJbnN1ZmZpY2llbnRSZXNvdXJjZXNFcnIgPSAgIC0yOTI5OCAgI2tNUEluc3VmZmljaWVudFJlc291cmNlc0Vycgora01QVGFza0Fib3J0ZWRFcnIgICA9ICAgLTI5Mjk3ICAja01QVGFza0Fib3J0ZWRFcnIKK2tNUFRpbWVvdXRFcnIgICA9ICAgLTI5Mjk2ICAja01QVGltZW91dEVycgora01QRGVsZXRlZEVyciAgID0gICAtMjkyOTUgICNrTVBEZWxldGVkRXJyCitrTVBCbHVlQmxvY2tpbmdFcnIgID0gICAtMjkyOTMgICNrTVBCbHVlQmxvY2tpbmdFcnIKK2tNUFRhc2tTdG9wcGVkRXJyICAgPSAgIC0yOTI5MiAgI0EgY29udmVudGlvbiB1c2VkIHdpdGggTVBUaHJvd0V4Y2VwdGlvbi4KK2tNUFRhc2tCbG9ja2VkRXJyICAgPSAgIC0yOTI5MSAgI2tNUFRhc2tCbG9ja2VkRXJyCitrTVBUYXNrQ3JlYXRlZEVyciAgID0gICAtMjkyOTAgICNrTVBUYXNrQ3JlYXRlZEVycgora01QUHJvY2Vzc1Rlcm1pbmF0ZWRFcnIgPSAgIC0yOTI4OSAgI2tNUFByb2Nlc3NUZXJtaW5hdGVkRXJyCitrTVBQcm9jZXNzQ3JlYXRlZEVyciAgICA9ICAgLTI5Mjg4ICAja01QUHJvY2Vzc0NyZWF0ZWRFcnIKK2tNUFByaXZpbGVnZWRFcnIgICAgPSAgIC0yOTI3NiAgI2tNUFByaXZpbGVnZWRFcnIKK2tNUEl0ZXJhdGlvbkVuZEVyciAgPSAgIC0yOTI3NSAgI2tNUEl0ZXJhdGlvbkVuZEVycgora1VDVGV4dEJyZWFrTG9jYXRvck1pc3NpbmdUeXBlICA9ICAgLTI1MzQxICAjVW5pY29kZSB0ZXh0IGJyZWFrIGVycm9yCitrVUNPdXRwdXRCdWZmZXJUb29TbWFsbCA9ICAgLTI1MzQwICAjT3V0cHV0IGJ1ZmZlciB0b28gc21hbGwgZm9yIFVuaWNvZGUgc3RyaW5nIHJlc3VsdAorZXJyS0NDcmVhdGVDaGFpbkZhaWxlZCAgPSAgIC0yNTMxOCAgI2VycktDQ3JlYXRlQ2hhaW5GYWlsZWQKK2VycktDRGF0YU5vdE1vZGlmaWFibGUgID0gICAtMjUzMTcgICNlcnJLQ0RhdGFOb3RNb2RpZmlhYmxlCitlcnJLQ0RhdGFOb3RBdmFpbGFibGUgICA9ICAgLTI1MzE2ICAjZXJyS0NEYXRhTm90QXZhaWxhYmxlCitlcnJLQ0ludGVyYWN0aW9uUmVxdWlyZWQgICAgPSAgIC0yNTMxNSAgI2VycktDSW50ZXJhY3Rpb25SZXF1aXJlZAorZXJyS0NOb1BvbGljeU1vZHVsZSA9ICAgLTI1MzE0ICAjZXJyS0NOb1BvbGljeU1vZHVsZQorZXJyS0NOb0NlcnRpZmljYXRlTW9kdWxlICAgID0gICAtMjUzMTMgICNlcnJLQ05vQ2VydGlmaWNhdGVNb2R1bGUKK2VycktDTm9TdG9yYWdlTW9kdWxlICAgID0gICAtMjUzMTIgICNlcnJLQ05vU3RvcmFnZU1vZHVsZQorZXJyS0NLZXlTaXplTm90QWxsb3dlZCAgPSAgIC0yNTMxMSAgI2VycktDS2V5U2l6ZU5vdEFsbG93ZWQKK2VycktDV3JvbmdLQ1ZlcnNpb24gPSAgIC0yNTMxMCAgI2VycktDV3JvbmdLQ1ZlcnNpb24KK2VycktDUmVhZE9ubHlBdHRyICAgPSAgIC0yNTMwOSAgI2VycktDUmVhZE9ubHlBdHRyCitlcnJLQ0ludGVyYWN0aW9uTm90QWxsb3dlZCAgPSAgIC0yNTMwOCAgI2VycktDSW50ZXJhY3Rpb25Ob3RBbGxvd2VkCitlcnJLQ05vRGVmYXVsdEtleWNoYWluICA9ICAgLTI1MzA3ICAjZXJyS0NOb0RlZmF1bHRLZXljaGFpbgorZXJyS0NOb1N1Y2hDbGFzcyAgICA9ICAgLTI1MzA2ICAjZXJyS0NOb1N1Y2hDbGFzcworZXJyS0NJbnZhbGlkU2VhcmNoUmVmICAgPSAgIC0yNTMwNSAgI2VycktDSW52YWxpZFNlYXJjaFJlZgorZXJyS0NJbnZhbGlkSXRlbVJlZiA9ICAgLTI1MzA0ICAjZXJyS0NJbnZhbGlkSXRlbVJlZgorZXJyS0NOb1N1Y2hBdHRyID0gICAtMjUzMDMgICNlcnJLQ05vU3VjaEF0dHIKK2VycktDRGF0YVRvb0xhcmdlICAgPSAgIC0yNTMwMiAgI2VycktDRGF0YVRvb0xhcmdlCitlcnJLQ0J1ZmZlclRvb1NtYWxsID0gICAtMjUzMDEgICNlcnJLQ0J1ZmZlclRvb1NtYWxsCitlcnJLQ0l0ZW1Ob3RGb3VuZCAgID0gICAtMjUzMDAgICNlcnJLQ0l0ZW1Ob3RGb3VuZAorZXJyS0NEdXBsaWNhdGVJdGVtICA9ICAgLTI1Mjk5ICAjZXJyS0NEdXBsaWNhdGVJdGVtCitlcnJLQ0ludmFsaWRDYWxsYmFjayAgICA9ICAgLTI1Mjk4ICAjZXJyS0NJbnZhbGlkQ2FsbGJhY2sKK2VycktDRHVwbGljYXRlQ2FsbGJhY2sgID0gICAtMjUyOTcgICNlcnJLQ0R1cGxpY2F0ZUNhbGxiYWNrCitlcnJLQ0R1cGxpY2F0ZUtleWNoYWluICA9ICAgLTI1Mjk2ICAjZXJyS0NEdXBsaWNhdGVLZXljaGFpbgorZXJyS0NJbnZhbGlkS2V5Y2hhaW4gICAgPSAgIC0yNTI5NSAgI2VycktDSW52YWxpZEtleWNoYWluCitlcnJLQ05vU3VjaEtleWNoYWluID0gICAtMjUyOTQgICNlcnJLQ05vU3VjaEtleWNoYWluCitlcnJLQ0F1dGhGYWlsZWQgPSAgIC0yNTI5MyAgI2VycktDQXV0aEZhaWxlZAorZXJyS0NSZWFkT25seSAgID0gICAtMjUyOTIgICNlcnJLQ1JlYWRPbmx5CitlcnJLQ05vdEF2YWlsYWJsZSAgID0gICAtMjUyOTEgICNlcnJLQ05vdEF2YWlsYWJsZQorcHJpbnRlclN0YXR1c09wQ29kZU5vdFN1cHBvcnRlZEVyciAgPSAgIC0yNTI4MCAgI3ByaW50ZXJTdGF0dXNPcENvZGVOb3RTdXBwb3J0ZWRFcnIKK2tUWE5PdXRzaWRlT2ZGcmFtZUVyciAgID0gICAtMjIwMTggICNrVFhOT3V0c2lkZU9mRnJhbWVFcnIKK2tUWE5PdXRzaWRlT2ZMaW5lRXJyICAgID0gICAtMjIwMTcgICNrVFhOT3V0c2lkZU9mTGluZUVycgora1RYTkFUU1VJSXNOb3RJbnN0YWxsZWRFcnIgID0gICAtMjIwMTYgICNrVFhOQVRTVUlJc05vdEluc3RhbGxlZEVycgora1RYTkRhdGFUeXBlTm90QWxsb3dlZEVyciAgID0gICAtMjIwMTUgICNrVFhORGF0YVR5cGVOb3RBbGxvd2VkRXJyCitrVFhOQ29weU5vdEFsbG93ZWRJbkVjaG9Nb2RlRXJyID0gICAtMjIwMTQgICNrVFhOQ29weU5vdEFsbG93ZWRJbkVjaG9Nb2RlRXJyCitrVFhOQ2Fubm90VHVyblRTTU9mZldoZW5Vc2luZ1VuaWNvZGVFcnIgPSAgIC0yMjAxMyAgI2tUWE5DYW5ub3RUdXJuVFNNT2ZmV2hlblVzaW5nVW5pY29kZUVycgora1RYTkFscmVhZHlJbml0aWFsaXplZEVyciAgID0gICAtMjIwMTIgICNrVFhOQWxyZWFkeUluaXRpYWxpemVkRXJyCitrVFhOSW52YWxpZFJ1bkluZGV4ID0gICAtMjIwMTEgICNrVFhOSW52YWxpZFJ1bkluZGV4CitrVFhOU29tZU9yQWxsVGFnc0ludmFsaWRGb3JSdW5FcnIgICA9ICAgLTIyMDEwICAja1RYTlNvbWVPckFsbFRhZ3NJbnZhbGlkRm9yUnVuRXJyCitrVFhOQXR0cmlidXRlVGFnSW52YWxpZEZvclJ1bkVyciAgICA9ICAgLTIyMDA5ICAjZGF0YVZhbHVlIGlzIHNldCB0byB0aGlzIHBlciBpbnZhbGlkIHRhZwora1RYTk5vTWF0Y2hFcnIgID0gICAtMjIwMDggICNrVFhOTm9NYXRjaEVycgora1RYTlJ1bkluZGV4T3V0b2ZCb3VuZHNFcnIgID0gICAtMjIwMDcgICNrVFhOUnVuSW5kZXhPdXRvZkJvdW5kc0Vycgora1RYTkNhbm5vdFNldEF1dG9JbmRlbnRFcnIgID0gICAtMjIwMDYgICNrVFhOQ2Fubm90U2V0QXV0b0luZGVudEVycgora1RYTkJhZERlZmF1bHRGaWxlVHlwZVdhcm5pbmcgICA9ICAgLTIyMDA1ICAja1RYTkJhZERlZmF1bHRGaWxlVHlwZVdhcm5pbmcKK2tUWE5Vc2VyQ2FuY2VsZWRPcGVyYXRpb25FcnIgICAgPSAgIC0yMjAwNCAgI2tUWE5Vc2VyQ2FuY2VsZWRPcGVyYXRpb25FcnIKK2tUWE5JbGxlZ2FsVG9Dcm9zc0RhdGFCb3VuZGFyaWVzRXJyID0gICAtMjIwMDMgICNrVFhOSWxsZWdhbFRvQ3Jvc3NEYXRhQm91bmRhcmllc0Vycgora1RYTkludmFsaWRGcmFtZUlERXJyICAgPSAgIC0yMjAwMiAgI2tUWE5JbnZhbGlkRnJhbWVJREVycgora1RYTkNhbm5vdEFkZEZyYW1lRXJyICAgPSAgIC0yMjAwMSAgI2tUWE5DYW5ub3RBZGRGcmFtZUVycgora1RYTkVuZEl0ZXJhdGlvbkVyciA9ICAgLTIyMDAwICAja1RYTkVuZEl0ZXJhdGlvbkVycgoraW52YWxpZEluZGV4RXJyID0gICAtMjAwMDIgICNUaGUgcmVjb3JkSW5kZXggcGFyYW1ldGVyIGlzIG5vdCB2YWxpZC4KK3JlY29yZERhdGFUb29CaWdFcnIgPSAgIC0yMDAwMSAgI1RoZSByZWNvcmQgZGF0YSBpcyBiaWdnZXIgdGhhbiBidWZmZXIgc2l6ZSAoMTAyNCBieXRlcykuCit1bmtub3duSW5zZXJ0TW9kZUVyciAgICA9ICAgLTIwMDAwICAjVGhlcmUgaXMgbm8gc3VjaCBhbiBpbnNlcnQgbW9kZS4KK2tNb2RlbVNjcmlwdE1pc3NpbmcgPSAgIC0xNDAwMiAgI2tNb2RlbVNjcmlwdE1pc3NpbmcKK2tNb2RlbVByZWZlcmVuY2VzTWlzc2luZyAgICA9ICAgLTE0MDAxICAja01vZGVtUHJlZmVyZW5jZXNNaXNzaW5nCitrTW9kZW1PdXRPZk1lbW9yeSAgID0gICAtMTQwMDAgICNrTW9kZW1PdXRPZk1lbW9yeQora0hJREJhc2VFcnJvciAgID0gICAtMTM5NTAgICNrSElEQmFzZUVycm9yCitrSElETnVsbFN0YXRlRXJyICAgID0gICAtMTM5NDkgICNrSElETnVsbFN0YXRlRXJyCitrSElEQnVmZmVyVG9vU21hbGxFcnIgICA9ICAgLTEzOTQ4ICAja0hJREJ1ZmZlclRvb1NtYWxsRXJyCitrSElEVmFsdWVPdXRPZlJhbmdlRXJyICA9ICAgLTEzOTQ3ICAja0hJRFZhbHVlT3V0T2ZSYW5nZUVycgora0hJRFVzYWdlTm90Rm91bmRFcnIgICAgPSAgIC0xMzk0NiAgI2tISURVc2FnZU5vdEZvdW5kRXJyCitrSElETm90VmFsdWVBcnJheUVyciAgICA9ICAgLTEzOTQ1ICAja0hJRE5vdFZhbHVlQXJyYXlFcnIKK2tISURJbnZhbGlkUHJlcGFyc2VkRGF0YUVyciA9ICAgLTEzOTQ0ICAja0hJREludmFsaWRQcmVwYXJzZWREYXRhRXJyCitrSElESW5jb21wYXRpYmxlUmVwb3J0RXJyICAgPSAgIC0xMzk0MyAgI2tISURJbmNvbXBhdGlibGVSZXBvcnRFcnIKK2tISURCYWRMb2dQaHlzVmFsdWVzRXJyID0gICAtMTM5NDIgICNrSElEQmFkTG9nUGh5c1ZhbHVlc0Vycgora0hJREludmFsaWRSZXBvcnRUeXBlRXJyICAgID0gICAtMTM5NDEgICNrSElESW52YWxpZFJlcG9ydFR5cGVFcnIKK2tISURJbnZhbGlkUmVwb3J0TGVuZ3RoRXJyICA9ICAgLTEzOTQwICAja0hJREludmFsaWRSZXBvcnRMZW5ndGhFcnIKK2tISUROdWxsUG9pbnRlckVyciAgPSAgIC0xMzkzOSAgI2tISUROdWxsUG9pbnRlckVycgora0hJREJhZFBhcmFtZXRlckVyciA9ICAgLTEzOTM4ICAja0hJREJhZFBhcmFtZXRlckVycgora0hJRE5vdEVub3VnaE1lbW9yeUVyciAgPSAgIC0xMzkzNyAgI2tISUROb3RFbm91Z2hNZW1vcnlFcnIKK2tISURFbmRPZkRlc2NyaXB0b3JFcnIgID0gICAtMTM5MzYgICNrSElERW5kT2ZEZXNjcmlwdG9yRXJyCitrSElEVXNhZ2VQYWdlWmVyb0VyciAgICA9ICAgLTEzOTM1ICAja0hJRFVzYWdlUGFnZVplcm9FcnIKK2tISURCYWRMb2dpY2FsTWluaW11bUVyciAgICA9ICAgLTEzOTM0ICAja0hJREJhZExvZ2ljYWxNaW5pbXVtRXJyCitrSElEQmFkTG9naWNhbE1heGltdW1FcnIgICAgPSAgIC0xMzkzMyAgI2tISURCYWRMb2dpY2FsTWF4aW11bUVycgora0hJREludmVydGVkTG9naWNhbFJhbmdlRXJyID0gICAtMTM5MzIgICNrSElESW52ZXJ0ZWRMb2dpY2FsUmFuZ2VFcnIKK2tISURJbnZlcnRlZFBoeXNpY2FsUmFuZ2VFcnIgICAgPSAgIC0xMzkzMSAgI2tISURJbnZlcnRlZFBoeXNpY2FsUmFuZ2VFcnIKK2tISURVbm1hdGNoZWRVc2FnZVJhbmdlRXJyICA9ICAgLTEzOTMwICAja0hJRFVubWF0Y2hlZFVzYWdlUmFuZ2VFcnIKK2tISURJbnZlcnRlZFVzYWdlUmFuZ2VFcnIgICA9ICAgLTEzOTI5ICAja0hJREludmVydGVkVXNhZ2VSYW5nZUVycgora0hJRFVubWF0Y2hlZFN0cmluZ1JhbmdlRXJyID0gICAtMTM5MjggICNrSElEVW5tYXRjaGVkU3RyaW5nUmFuZ2VFcnIKK2tISURVbm1hdGNoZWREZXNpZ25hdG9yUmFuZ2VFcnIgPSAgIC0xMzkyNyAgI2tISURVbm1hdGNoZWREZXNpZ25hdG9yUmFuZ2VFcnIKK2tISURSZXBvcnRTaXplWmVyb0VyciAgID0gICAtMTM5MjYgICNrSElEUmVwb3J0U2l6ZVplcm9FcnIKK2tISURSZXBvcnRDb3VudFplcm9FcnIgID0gICAtMTM5MjUgICNrSElEUmVwb3J0Q291bnRaZXJvRXJyCitrSElEUmVwb3J0SURaZXJvRXJyID0gICAtMTM5MjQgICNrSElEUmVwb3J0SURaZXJvRXJyCitrSElESW52YWxpZFJhbmdlUGFnZUVyciA9ICAgLTEzOTIzICAja0hJREludmFsaWRSYW5nZVBhZ2VFcnIKK2tISUREZXZpY2VOb3RSZWFkeSAgPSAgIC0xMzkxMCAgI1RoZSBkZXZpY2UgaXMgc3RpbGwgaW5pdGlhbGl6aW5nLCB0cnkgYWdhaW4gbGF0ZXIKK2tISURWZXJzaW9uSW5jb21wYXRpYmxlRXJyICA9ICAgLTEzOTA5ICAja0hJRFZlcnNpb25JbmNvbXBhdGlibGVFcnIKK2RlYnVnZ2luZ05vTWF0Y2hFcnIgPSAgIC0xMzg4NyAgI2RlYnVnZ2luZyBjb21wb25lbnQgb3Igb3B0aW9uIG5vdCBmb3VuZCBhdCB0aGlzIGluZGV4CitkZWJ1Z2dpbmdOb0NhbGxiYWNrRXJyICA9ICAgLTEzODg2ICAjZGVidWdnaW5nIGNvbXBvbmVudCBoYXMgbm8gY2FsbGJhY2sKK2RlYnVnZ2luZ0ludmFsaWROYW1lRXJyID0gICAtMTM4ODUgICNjb21wb25lbnROYW1lIG9yIG9wdGlvbk5hbWUgaXMgaW52YWxpZCAoTlVMTCkKK2RlYnVnZ2luZ0ludmFsaWRPcHRpb25FcnIgICA9ICAgLTEzODg0ICAjb3B0aW9uU2VsZWN0b3JOdW0gaXMgbm90IHJlZ2lzdGVyZWQKK2RlYnVnZ2luZ0ludmFsaWRTaWduYXR1cmVFcnIgICAgPSAgIC0xMzg4MyAgI2NvbXBvbmVudFNpZ25hdHVyZSBub3QgcmVnaXN0ZXJlZAorZGVidWdnaW5nRHVwbGljYXRlT3B0aW9uRXJyID0gICAtMTM4ODIgICNvcHRpb25TZWxlY3Rvck51bSBhbHJlYWR5IHJlZ2lzdGVyZWQKK2RlYnVnZ2luZ0R1cGxpY2F0ZVNpZ25hdHVyZUVyciAgPSAgIC0xMzg4MSAgI2NvbXBvbmVudFNpZ25hdHVyZSBhbHJlYWR5IHJlZ2lzdGVyZWQKK2RlYnVnZ2luZ0V4ZWN1dGlvbkNvbnRleHRFcnIgICAgPSAgIC0xMzg4MCAgI3JvdXRpbmUgY2Fubm90IGJlIGNhbGxlZCBhdCB0aGlzIHRpbWUKK2tCcmlkZ2VTb2Z0d2FyZVJ1bm5pbmdDYW50U2xlZXAgPSAgIC0xMzAzOCAgI2tCcmlkZ2VTb2Z0d2FyZVJ1bm5pbmdDYW50U2xlZXAKK2tOb1N1Y2hQb3dlclNvdXJjZSAgPSAgIC0xMzAyMCAgI2tOb1N1Y2hQb3dlclNvdXJjZQora1Byb2Nlc3NvclRlbXBSb3V0aW5lUmVxdWlyZXNNUExpYjIgPSAgIC0xMzAxNCAgI2tQcm9jZXNzb3JUZW1wUm91dGluZVJlcXVpcmVzTVBMaWIyCitrQ2FudFJlcG9ydFByb2Nlc3NvclRlbXBlcmF0dXJlRXJyICA9ICAgLTEzMDEzICAja0NhbnRSZXBvcnRQcm9jZXNzb3JUZW1wZXJhdHVyZUVycgora1Bvd2VyTWd0UmVxdWVzdERlbmllZCAgPSAgIC0xMzAxMCAgI2tQb3dlck1ndFJlcXVlc3REZW5pZWQKK2tQb3dlck1ndE1lc3NhZ2VOb3RIYW5kbGVkICA9ICAgLTEzMDA5ICAja1Bvd2VyTWd0TWVzc2FnZU5vdEhhbmRsZWQKK2tQb3dlckhhbmRsZXJOb3RGb3VuZEZvclByb2NFcnIgPSAgIC0xMzAwOCAgI2tQb3dlckhhbmRsZXJOb3RGb3VuZEZvclByb2NFcnIKK2tQb3dlckhhbmRsZXJOb3RGb3VuZEZvckRldmljZUVyciAgID0gICAtMTMwMDcgICNrUG93ZXJIYW5kbGVyTm90Rm91bmRGb3JEZXZpY2VFcnIKK2tQb3dlckhhbmRsZXJFeGlzdHNGb3JEZXZpY2VFcnIgPSAgIC0xMzAwNiAgI2tQb3dlckhhbmRsZXJFeGlzdHNGb3JEZXZpY2VFcnIKK3BtUmVjdkVuZEVyciAgICA9ICAgLTEzMDA1ICAjZHVyaW5nIHJlY2VpdmUsIHBtZ3IgZGlkIG5vdCBmaW5pc2ggaHMgY29uZmlndXJlZCBmb3IgdGhpcyBjb25uZWN0aW9uCitwbVJlY3ZTdGFydEVyciAgPSAgIC0xMzAwNCAgI2R1cmluZyByZWNlaXZlLCBwbWdyIGRpZCBub3Qgc3RhcnQgaHMKK3BtU2VuZEVuZEVyciAgICA9ICAgLTEzMDAzICAjZHVyaW5nIHNlbmQsIHBtZ3IgZGlkIG5vdCBmaW5pc2ggaHMKK3BtU2VuZFN0YXJ0RXJyICA9ICAgLTEzMDAyICAjZHVyaW5nIHNlbmQsIHBtZ3IgZGlkIG5vdCBzdGFydCBocworcG1SZXBseVRPRXJyICAgID0gICAtMTMwMDEgICNUaW1lZCBvdXQgd2FpdGluZyBmb3IgcmVwbHkKK3BtQnVzeUVyciAgID0gICAtMTMwMDAgICNQb3dlciBNZ3IgbmV2ZXIgcmVhZHkgdG8gc3RhcnQgaGFuZHNoYWtlCitwaWN0dXJlRGF0YUVyciAgPSAgIC0xMTAwNSAgI3RoZSBwaWN0dXJlIGRhdGEgd2FzIGludmFsaWQKK2NvbG9yc1JlcXVlc3RlZEVyciAgPSAgIC0xMTAwNCAgI3RoZSBudW1iZXIgb2YgY29sb3JzIHJlcXVlc3RlZCB3YXMgaWxsZWdhbAorY2FudExvYWRQaWNrTWV0aG9kRXJyICAgPSAgIC0xMTAwMyAgI3VuYWJsZSB0byBsb2FkIHRoZSBjdXN0b20gcGljayBwcm9jCitwaWN0SW5mb1ZlcmJFcnIgPSAgIC0xMTAwMiAgI3RoZSBwYXNzZWQgdmVyYiB3YXMgaW52YWxpZAorcGljdEluZm9JREVyciAgID0gICAtMTEwMDEgICN0aGUgaW50ZXJuYWwgY29uc2lzdGFuY3kgY2hlY2sgZm9yIHRoZSBQaWN0SW5mb0lEIGlzIHdyb25nCitwaWN0SW5mb1ZlcnNpb25FcnIgID0gICAtMTEwMDAgICN3cm9uZyB2ZXJzaW9uIG9mIHRoZSBQaWN0SW5mbyBzdHJ1Y3R1cmUKK2VyclRhc2tOb3RGb3VuZCA9ICAgLTEwNzgwICAjbm8gdGFzayB3aXRoIHRoYXQgdGFzayBpZCBleGlzdHMKK3RlbE5vdEVub3VnaGRzcEJXICAgPSAgIC0xMDExNiAgI25vdCBlbm91Z2ggcmVhbC10aW1lIGZvciBhbGxvY2F0aW9uCit0ZWxCYWRTYW1wbGVSYXRlICAgID0gICAtMTAxMTUgICNpbmNvbXBhdGlibGUgc2FtcGxlIHJhdGUKK3RlbEJhZFNXRXJyID0gICAtMTAxMTQgICNTb2Z0d2FyZSBub3QgaW5zdGFsbGVkIHByb3Blcmx5Cit0ZWxEZXRBbHJlYWR5T24gPSAgIC0xMDExMyAgI2RldGVjdGlvbiBpcyBhbHJlYWR5IHR1cm5lZCBvbgordGVsQXV0b0Fuc05vdE9uID0gICAtMTAxMTIgICNhdXRvQW5zd2VyIGluIG5vdCB0dXJuZWQgb24KK3RlbFZhbGlkYXRlRmFpbGVkICAgPSAgIC0xMDExMSAgI3RlbFZhbGlkYXRlIGZhaWxlZAordGVsQmFkUHJvY0lEICAgID0gICAtMTAxMTAgICNpbnZhbGlkIHByb2NJRAordGVsRGV2aWNlTm90Rm91bmQgICA9ICAgLTEwMTA5ICAjZGV2aWNlIG5vdCBmb3VuZAordGVsQmFkQ29kZVJlc291cmNlICA9ICAgLTEwMTA4ICAjY29kZSByZXNvdXJjZSBub3QgZm91bmQKK3RlbEluaXRGYWlsZWQgICA9ICAgLTEwMTA3ICAjaW5pdGlhbGl6YXRpb24gZmFpbGVkCit0ZWxOb0NvbW1Gb2xkZXIgPSAgIC0xMDEwNiAgI0NvbW11bmljYXRpb25zL0V4dGVuc2lvbnMggCBub3QgZm91bmQKK3RlbFVua25vd25FcnIgICA9ICAgLTEwMTAzICAjdW5hYmxlIHRvIHNldCBjb25maWcKK3RlbE5vU3VjaFRvb2wgICA9ICAgLTEwMTAyICAjdW5hYmxlIHRvIGZpbmQgdG9vbCB3aXRoIG5hbWUgc3BlY2lmaWVkCit0ZWxCYWRGdW5jdGlvbiAgPSAgIC0xMDA5MSAgI2JhZCBtc2dDb2RlIHNwZWNpZmllZAordGVsUEJFcnIgICAgPSAgIC0xMDA5MCAgI3BhcmFtZXRlciBibG9jayBlcnJvciwgYmFkIGZvcm1hdAordGVsQ0FOb3REZWZsZWN0YWJsZSA9ICAgLTEwMDgyICAjQ0Egbm90ICJkZWZsZWN0YWJsZSIKK3RlbENBTm90UmVqZWN0YWJsZSAgPSAgIC0xMDA4MSAgI0NBIG5vdCAicmVqZWN0YWJsZSIKK3RlbENBTm90QWNjZXB0YWJsZSAgPSAgIC0xMDA4MCAgI0NBIG5vdCAiYWNjZXB0YWJsZSIKK3RlbFRlcm1Ob3RPcGVuICA9ICAgLTEwMDcyICAjdGVybWluYWwgbm90IG9wZW5lZCB2aWEgVEVMT3BlblRlcm0KK3RlbFN0aWxsTmVlZGVkICA9ICAgLTEwMDcxICAjdGVybWluYWwgZHJpdmVyIHN0aWxsIG5lZWRlZCBieSBzb21lb25lIGVsc2UKK3RlbEFscmVhZHlPcGVuICA9ICAgLTEwMDcwICAjdGVybWluYWwgYWxyZWFkeSBvcGVuCit0ZWxOb0NhbGxiYWNrUmVmICAgID0gICAtMTAwNjQgICNubyBjYWxsIGJhY2sgcmVmZXJlbmNlIHdhcyBzcGVjaWZpZWQsIGJ1dCBpcyByZXF1aXJlZAordGVsRGlzcGxheU1vZGVOb3RTdXBwICAgPSAgIC0xMDA2MyAgI2Rpc3BsYXkgbW9kZSBub3Qgc3VwcG9ydGVkIGJ5IHRvb2wKK3RlbEJhZERpc3BsYXlNb2RlICAgPSAgIC0xMDA2MiAgI2JhZCBkaXNwbGF5IG1vZGUgc3BlY2lmaWVkCit0ZWxGd2RUeXBlTm90U3VwcCAgID0gICAtMTAwNjEgICNmb3J3YXJkIHR5cGUgbm90IHN1cHBvcnRlZCBieSB0b29sCit0ZWxETlR5cGVOb3RTdXBwICAgID0gICAtMTAwNjAgICNETiB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgdG9vbAordGVsQmFkUmF0ZSAgPSAgIC0xMDA1OSAgI2JhZCByYXRlIHNwZWNpZmllZAordGVsQmFkQmVhcmVyVHlwZSAgICA9ICAgLTEwMDU4ICAjYmFkIGJlYXJlclR5cGUgc3BlY2lmaWVkCit0ZWxCYWRTZWxlY3QgICAgPSAgIC0xMDA1NyAgI3VuYWJsZSB0byBzZWxlY3Qgb3IgZGVzZWxlY3QgRE4KK3RlbEJhZFBhcmtJRCAgICA9ICAgLTEwMDU2ICAjYmFkIHBhcmsgaWQgc3BlY2lmaWVkCit0ZWxCYWRQaWNrdXBHcm91cElEID0gICAtMTAwNTUgICNiYWQgcGlja3VwIGdyb3VwIElEIHNwZWNpZmllZAordGVsQmFkRndkVHlwZSAgID0gICAtMTAwNTQgICNiYWQgZndkVHlwZSBzcGVjaWZpZWQKK3RlbEJhZEZlYXR1cmVJRCA9ICAgLTEwMDUzICAjYmFkIGZlYXR1cmUgSUQgc3BlY2lmaWVkCit0ZWxCYWRJbnRlcmNvbUlEICAgID0gICAtMTAwNTIgICNiYWQgaW50ZXJjb20gSUQgc3BlY2lmaWVkCit0ZWxCYWRQYWdlSUQgICAgPSAgIC0xMDA1MSAgI2JhZCBwYWdlIElEIHNwZWNpZmllZAordGVsQmFkRE5UeXBlICAgID0gICAtMTAwNTAgICNETiB0eXBlIGludmFsaWQKK3RlbENvbmZMaW1pdEV4Y2VlZGVkICAgID0gICAtMTAwNDcgICNhdHRlbXB0IHRvIGV4Y2VlZCBzd2l0Y2ggY29uZmVyZW5jZSBsaW1pdHMKK3RlbENCRXJyICAgID0gICAtMTAwNDYgICNjYWxsIGJhY2sgZmVhdHVyZSBub3Qgc2V0IHByZXZpb3VzbHkKK3RlbFRyYW5zZmVyUmVqICA9ICAgLTEwMDQ1ICAjdHJhbnNmZXIgcmVxdWVzdCByZWplY3RlZAordGVsVHJhbnNmZXJFcnIgID0gICAtMTAwNDQgICN0cmFuc2ZlciBub3QgcHJlcGFyZWQKK3RlbENvbmZSZWogID0gICAtMTAwNDMgICNjb25mZXJlbmNlIHJlcXVlc3Qgd2FzIHJlamVjdGVkCit0ZWxDb25mRXJyICA9ICAgLTEwMDQyICAjY29uZmVyZW5jZSB3YXMgbm90IHByZXBhcmVkCit0ZWxDb25mTm9MaW1pdCAgPSAgIC0xMDA0MSAgI25vIGxpbWl0IHdhcyBzcGVjaWZpZWQgYnV0IHJlcXVpcmVkCit0ZWxDb25mTGltaXRFcnIgPSAgIC0xMDA0MCAgI2xpbWl0IHNwZWNpZmllZCBpcyB0b28gaGlnaCBmb3IgdGhpcyBjb25maWd1cmF0aW9uCit0ZWxGZWF0Tm90U3VwcCAgPSAgIC0xMDAzMyAgI2ZlYXR1cmUgcHJvZ3JhbSBjYWxsIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB0b29sCit0ZWxGZWF0QWN0aXZlICAgPSAgIC0xMDAzMiAgI2ZlYXR1cmUgYWxyZWFkeSBhY3RpdmUKK3RlbEZlYXROb3RBdmFpbCA9ICAgLTEwMDMxICAjZmVhdHVyZSBzdWJzY3JpYmVkIGJ1dCBub3QgYXZhaWxhYmxlCit0ZWxGZWF0Tm90U3ViICAgPSAgIC0xMDAzMCAgI2ZlYXR1cmUgbm90IHN1YnNjcmliZWQKK2VyckFFUHJvcGVydGllc0NsYXNoICAgID0gICAtMTAwMjUgICNpbGxlZ2FsIGNvbWJpbmF0aW9uIG9mIHByb3BlcnRpZXMgc2V0dGluZ3MgZm9yIFNldCBEYXRhLCBtYWtlIG5ldywgb3IgZHVwbGljYXRlCitlcnJBRUNhbnRQdXRUaGF0VGhlcmUgICA9ICAgLTEwMDI0ICAjaW4gbWFrZSBuZXcsIGR1cGxpY2F0ZSwgZXRjLiBjbGFzcyBjYW4ndCBiZSBhbiBlbGVtZW50IG9mIGNvbnRhaW5lcgorZXJyQUVOb3RBbkVudW1NZW1iZXIgICAgPSAgIC0xMDAyMyAgI2VudW1lcmF0ZWQgdmFsdWUgaW4gU2V0RGF0YSBpcyBub3QgYWxsb3dlZCBmb3IgdGhpcyBwcm9wZXJ0eQordGVsSW50RXh0Tm90U3VwcCAgICA9ICAgLTEwMDIyICAjaW50ZXJuYWwgZXh0ZXJuYWwgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdG9vbAordGVsQmFkSW50RXh0ICAgID0gICAtMTAwMjEgICNiYWQgaW50ZXJuYWwgZXh0ZXJuYWwgZXJyb3IKK3RlbFN0YXRlTm90U3VwcCA9ICAgLTEwMDIwICAjZGV2aWNlIHN0YXRlIG5vdCBzdXBwb3J0ZWQgYnkgdG9vbAordGVsQmFkU3RhdGVFcnIgID0gICAtMTAwMTkgICNiYWQgZGV2aWNlIHN0YXRlIHNwZWNpZmllZAordGVsSW5kZXhOb3RTdXBwID0gICAtMTAwMTggICNpbmRleCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdG9vbAordGVsQmFkSW5kZXggPSAgIC0xMDAxNyAgI2JhZCBpbmRleCBzcGVjaWZpZWQKK3RlbEFQYXR0Tm90U3VwcCA9ICAgLTEwMDE2ICAjYWxlcnRpbmcgcGF0dGVybiBub3Qgc3VwcG9ydGVkIGJ5IHRvb2wKK3RlbEJhZEFQYXR0RXJyICA9ICAgLTEwMDE1ICAjYmFkIGFsZXJ0aW5nIHBhdHRlcm4gc3BlY2lmaWVkCit0ZWxWVHlwZU5vdFN1cHAgPSAgIC0xMDAxNCAgI3ZvbHVtZSB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB0b29sCit0ZWxCYWRWVHlwZUVyciAgPSAgIC0xMDAxMyAgI2JhZCB2b2x1bWUgdHlwZSBlcnJvcgordGVsQmFkTGV2ZWxFcnIgID0gICAtMTAwMTIgICNiYWQgdm9sdW1lIGxldmVsIHNldHRpbmcKK3RlbEhUeXBlTm90U3VwcCA9ICAgLTEwMDExICAjaG9vayB0eXBlIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB0b29sCit0ZWxCYWRIVHlwZUVyciAgPSAgIC0xMDAxMCAgI2JhZCBob29rIHR5cGUgc3BlY2lmaWVkCitlcnJBRUNhbnRTdXBwbHlUeXBlID0gICAtMTAwMDkgICNlcnJBRUNhbnRTdXBwbHlUeXBlCit0ZWxOb09wZW5FcnIgICAgPSAgIC0xMDAwOCAgI3VuYWJsZSB0byBvcGVuIHRlcm1pbmFsCit0ZWxOb01lbUVyciA9ICAgLTEwMDA3ICAjbm8gbWVtb3J5IHRvIGFsbG9jYXRlIGhhbmRsZQorZXJyT1NBQ2FudEFzc2lnbiAgICA9ICAgLTEwMDA2ICAjU2lnbmFsZWQgd2hlbiBhbiBvYmplY3QgY2Fubm90IGJlIHNldCBpbiBhIGNvbnRhaW5lci4KK3RlbEJhZFByb2NFcnIgICA9ICAgLTEwMDA1ICAjYmFkIG1zZ1Byb2Mgc3BlY2lmaWVkCit0ZWxCYWRIYW5kRXJyICAgPSAgIC0xMDAwNCAgI2JhZCBoYW5kbGUgc3BlY2lmaWVkCitPU0FJbGxlZ2FsQXNzaWduICAgID0gICAtMTAwMDMgICNTaWduYWxlZCB3aGVuIGFuIG9iamVjdCBjYW4gbmV2ZXIgYmUgc2V0IGluIGEgY29udGFpbmVyCit0ZWxCYWRETkVyciA9ICAgLTEwMDAyICAjVEVMRE5IYW5kbGUgbm90IGZvdW5kIG9yIGludmFsaWQKK3RlbEJhZFRlcm1FcnIgICA9ICAgLTEwMDAxICAjaW52YWxpZCBURUxIYW5kbGUgb3IgaGFuZGxlIG5vdCBmb3VuZAorZXJyQUVFdmVudEZhaWxlZCAgICA9ICAgLTEwMDAwICAjZXJyQUVFdmVudEZhaWxlZAorY2Fubm90TW92ZUF0dGFjaGVkQ29udHJvbGxlciAgICA9ICAgLTk5OTkgICAjY2Fubm90TW92ZUF0dGFjaGVkQ29udHJvbGxlcgorY29udHJvbGxlckhhc0ZpeGVkSGVpZ2h0ICAgID0gICAtOTk5OCAgICNjb250cm9sbGVySGFzRml4ZWRIZWlnaHQKK2Nhbm5vdFNldFdpZHRoT2ZBdHRhY2hlZENvbnRyb2xsZXIgID0gICAtOTk5NyAgICNjYW5ub3RTZXRXaWR0aE9mQXR0YWNoZWRDb250cm9sbGVyCitjb250cm9sbGVyQm91bmRzTm90RXhhY3QgICAgPSAgIC05OTk2ICAgI2NvbnRyb2xsZXJCb3VuZHNOb3RFeGFjdAorZWRpdGluZ05vdEFsbG93ZWQgICA9ICAgLTk5OTUgICAjZWRpdGluZ05vdEFsbG93ZWQKK2JhZENvbnRyb2xsZXJIZWlnaHQgPSAgIC05OTk0ICAgI2JhZENvbnRyb2xsZXJIZWlnaHQKK2RldmljZUNhbnRNZWV0UmVxdWVzdCAgID0gICAtOTQwOCAgICNkZXZpY2VDYW50TWVldFJlcXVlc3QKK3NlcUdyYWJJbmZvTm90QXZhaWxhYmxlID0gICAtOTQwNyAgICNzZXFHcmFiSW5mb05vdEF2YWlsYWJsZQorYmFkU0dDaGFubmVsICAgID0gICAtOTQwNiAgICNiYWRTR0NoYW5uZWwKK2NvdWxkbnRHZXRSZXF1aXJlZENvbXBvbmVudCA9ICAgLTk0MDUgICAjY291bGRudEdldFJlcXVpcmVkQ29tcG9uZW50Citub3RFbm91Z2hEaXNrU3BhY2VUb0dyYWIgICAgPSAgIC05NDA0ICAgI25vdEVub3VnaERpc2tTcGFjZVRvR3JhYgorbm90RW5vdWdoTWVtb3J5VG9HcmFiICAgPSAgIC05NDAzICAgI25vdEVub3VnaE1lbW9yeVRvR3JhYgorY2FudERvVGhhdEluQ3VycmVudE1vZGUgPSAgIC05NDAyICAgI2NhbnREb1RoYXRJbkN1cnJlbnRNb2RlCitncmFiVGltZUNvbXBsZXRlICAgID0gICAtOTQwMSAgICNncmFiVGltZUNvbXBsZXRlCitub0RldmljZUZvckNoYW5uZWwgID0gICAtOTQwMCAgICNub0RldmljZUZvckNoYW5uZWwKK2tOb0NhcmRCdXNDSVNFcnIgICAgPSAgIC05MTA5ICAgI05vIHZhbGlkIENJUyBleGlzdHMgZm9yIHRoaXMgQ2FyZEJ1cyBjYXJkCitrTm90WlZDYXBhYmxlRXJyICAgID0gICAtOTEwOCAgICNUaGlzIHNvY2tldCBkb2VzIG5vdCBzdXBwb3J0IFpvb21lZCBWaWRlbwora0NhcmRQb3dlck9mZkVyciAgICA9ICAgLTkxMDcgICAjUG93ZXIgdG8gdGhlIGNhcmQgaGFzIGJlZW4gdHVybmVkIG9mZgora0F0dGVtcHREdXBDYXJkRW50cnlFcnIgPSAgIC05MTA2ICAgI1RoZSBFbmFibGVyIHdhcyBhc2tlZCB0byBjcmVhdGUgYSBkdXBsaWNhdGUgY2FyZCBlbnRyeQora0FscmVhZHlTYXZlZFN0YXRlRXJyICAgPSAgIC05MTA1ICAgI1RoZSBzdGF0ZSBoYXMgYmVlbiBzYXZlZCBvbiBwcmV2aW91cyBjYWxsCitrVG9vTWFueUlPV2luZG93c0VyciAgICA9ICAgLTkxMDQgICAjZGV2aWNlIHJlcXVlc3RlZCBtb3JlIHRoYW4gb25lIEkvTyB3aW5kb3cKK2tOb3RSZWFkeUVyciAgICA9ICAgLTkxMDMgICAjUEMgQ2FyZCBmYWlsZWQgdG8gZ28gcmVhZHkKK2tDbGllbnRSZXF1ZXN0RGVuaWVkICAgID0gICAtOTEwMiAgICNDUyBDbGllbnRzIHNob3VsZCByZXR1cm4gdGhpcyBjb2RlIGlub3JkZXIgdG8KK2tOb0NvbXBhdGlibGVOYW1lRXJyICAgID0gICAtOTEwMSAgICNUaGVyZSBpcyBubyBjb21wYXRpYmxlIGRyaXZlciBuYW1lIGZvciB0aGlzIGRldmljZQora05vRW5hYmxlckZvckNhcmRFcnIgICAgPSAgIC05MTAwICAgI05vIEVuYWJsZXJzIHdlcmUgZm91bmQgdGhhdCBjYW4gc3VwcG9ydCB0aGUgY2FyZAora05vQ2FyZEVuYWJsZXJzRm91bmRFcnIgPSAgIC05MDk5ICAgI05vIEVuYWJsZXJzIHdlcmUgZm91bmQKK2tVbnN1cHBvcnRlZENhcmRFcnIgPSAgIC05MDk4ICAgI0NhcmQgbm90IHN1cHBvcnRlZCBieSBnZW5lcmljIGVuYWJsZXIKK2tOb0NsaWVudFRhYmxlRXJyICAgPSAgIC05MDk3ICAgI1RoZSBjbGllbnQgdGFibGUgaGFzIG5vdCBiZSBpbml0aWFsaXplZCB5ZXQKK2tOb01vcmVJbnRlcnJ1cHRTbG90c0VyciAgICA9ICAgLTkwOTYgICAjQWxsIGludGVybmFsIEludGVycnVwdCBzbG90cyBhcmUgaW4gdXNlCitrTm9Nb3JlVGltZXJDbGllbnRzRXJyICA9ICAgLTkwOTUgICAjQWxsIHRpbWVyIGNhbGxiYWNrcyBhcmUgaW4gdXNlCitrTm9JT1dpbmRvd1JlcXVlc3RlZEVyciA9ICAgLTkwOTQgICAjUmVxdWVzdCBJL08gd2luZG93IGJlZm9yZSBjYWxsaW5nIGNvbmZpZ3VyYXRpb24KK2tCYWRDdXN0b21JRklERXJyICAgPSAgIC05MDkzICAgI0N1c3RvbSBpbnRlcmZhY2UgSUQgaXMgaW52YWxpZAora0JhZFR1cGxlRGF0YUVyciAgICA9ICAgLTkwOTIgICAjRGF0YSBpbiB0dXBsZSBpcyBpbnZhbGlkCitrSW52YWxpZENTQ2xpZW50RXJyID0gICAtOTA5MSAgICNDYXJkIFNlcnZpY2VzIENsaWVudElEIGlzIG5vdCByZWdpc3RlcmVkCitrVW5zdXBwb3J0ZWRWc0VyciAgID0gICAtOTA5MCAgICNVbnN1cHBvcnRlZCBWb2x0YWdlIFNlbnNlCitrSW52YWxpZERldmljZU51bWJlciAgICA9ICAgLTkwODkgICAja0ludmFsaWREZXZpY2VOdW1iZXIKK2tQb3N0Q2FyZEV2ZW50RXJyICAgPSAgIC05MDg4ICAgI19QQ0NTTFBvc3RDYXJkRXZlbnQgZmFpbGVkIGFuZCBkcm9wcGVkIGFuIGV2ZW50CitrQ2FudENvbmZpZ3VyZUNhcmRFcnIgICA9ICAgLTkwODcgICAja0NhbnRDb25maWd1cmVDYXJkRXJyCitrUGFzc0NhbGxUb0NoYWluRXJyID0gICAtOTA4NiAgICNrUGFzc0NhbGxUb0NoYWluRXJyCitrQ2FyZEJ1c0NhcmRFcnIgPSAgIC05MDg1ICAgI2tDYXJkQnVzQ2FyZEVycgorazE2Qml0Q2FyZEVyciAgID0gICAtOTA4NCAgICNrMTZCaXRDYXJkRXJyCitrQmFkRGV2aWNlRXJyICAgPSAgIC05MDgzICAgI2tCYWREZXZpY2VFcnIKK2tCYWRMaW5rRXJyID0gICAtOTA4MiAgICNrQmFkTGlua0Vycgora0ludmFsaWRSZWdFbnRyeUVyciA9ICAgLTkwODEgICAja0ludmFsaWRSZWdFbnRyeUVycgora05vQ2FyZFNldmljZXNTb2NrZXRzRXJyICAgID0gICAtOTA4MCAgICNrTm9DYXJkU2V2aWNlc1NvY2tldHNFcnIKK2tPdXRPZlJlc291cmNlRXJyICAgPSAgIC05MDc5ICAgI0NhcmQgU2VydmljZXMgaGFzIGV4aGF1c3RlZCB0aGUgcmVzb3VyY2UKK2tOb01vcmVJdGVtc0VyciA9ICAgLTkwNzggICAjdGhlcmUgYXJlIG5vIG1vcmUgb2YgdGhlIHJlcXVlc3RlZCBpdGVtCitrSW5Vc2VFcnIgICA9ICAgLTkwNzcgICAjcmVxdWVzdGVkIHJlc291cmNlIGlzIGJlaW5nIHVzZWQgYnkgYSBjbGllbnQKK2tDb25maWd1cmF0aW9uTG9ja2VkRXJyID0gICAtOTA3NiAgICNhIGNvbmZpZ3VyYXRpb24gaGFzIGFscmVhZHkgYmVlbiBsb2NrZWQKK2tXcml0ZVByb3RlY3RlZEVyciAgPSAgIC05MDc1ICAgI21lZGlhIGlzIHdyaXRlLXByb3RlY3RlZAora0J1c3lFcnIgICAgPSAgIC05MDc0ICAgI3VuYWJsZSB0byBwcm9jZXNzIHJlcXVlc3QgYXQgdGhpcyB0aW1lIC0gdHJ5IGxhdGVyCitrVW5zdXBwb3J0ZWRNb2RlRXJyID0gICAtOTA3MyAgICNtb2RlIGlzIG5vdCBzdXBwb3J0ZWQKK2tVbnN1cHBvcnRlZEZ1bmN0aW9uRXJyID0gICAtOTA3MiAgICNmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24KK2tOb0NhcmRFcnIgID0gICAtOTA3MSAgICNubyBQQyBjYXJkIGluIHRoZSBzb2NrZXQKK2tHZW5lcmFsRmFpbHVyZUVyciAgPSAgIC05MDcwICAgI2FuIHVuZGVmaW5lZCBlcnJvciBoYXMgb2NjdXJyZWQKK2tXcml0ZUZhaWx1cmVFcnIgICAgPSAgIC05MDY5ICAgI3VuYWJsZSB0byBjb21wbGV0ZSB3cml0ZSByZXF1ZXN0CitrUmVhZEZhaWx1cmVFcnIgPSAgIC05MDY4ICAgI3VuYWJsZSB0byBjb21wbGV0ZSByZWFkIHJlcXVlc3QKK2tCYWRTcGVlZEVyciAgICA9ICAgLTkwNjcgICAjc3BlY2lmaWVkIHNwZWVkIGlzIHVuYXZhaWxhYmxlCitrQmFkQ0lTRXJyICA9ICAgLTkwNjYgICAjQ0lTIG9uIGNhcmQgaXMgaW52YWxpZAora0JhZEhhbmRsZUVyciAgID0gICAtOTA2NSAgICNjbGllbnRIYW5kbGUgaXMgaW52YWxpZAora0JhZEFyZ3NFcnIgPSAgIC05MDY0ICAgI3ZhbHVlcyBpbiBhcmd1bWVudCBwYWNrZXQgYXJlIGludmFsaWQKK2tCYWRBcmdMZW5ndGhFcnIgICAgPSAgIC05MDYzICAgI0FyZ0xlbmd0aCBhcmd1bWVudCBpcyBpbnZhbGlkCitrQmFkV2luZG93RXJyICAgPSAgIC05MDYyICAgI3NwZWNpZmllZCB3aW5kb3cgaXMgaW52YWxpZAora0JhZFZwcEVyciAgPSAgIC05MDYxICAgI3NwZWNpZmllZCBWcHAxIG9yIFZwcDIgcG93ZXIgbGV2ZWwgaW5kZXggaXMgaW52YWxpZAora0JhZFZjY0VyciAgPSAgIC05MDYwICAgI3NwZWNpZmllZCBWY2MgcG93ZXIgbGV2ZWwgaW5kZXggaXMgaW52YWxpZAora0JhZFR5cGVFcnIgPSAgIC05MDU5ICAgI3NwZWNpZmllZCB3aW5kb3cgb3IgaW50ZXJmYWNlIHR5cGUgaXMgaW52YWxpZAora0JhZFNvY2tldEVyciAgID0gICAtOTA1OCAgICNzcGVjaWZpZWQgbG9naWNhbCBvciBwaHlzaWNhbCBzb2NrZXQgbnVtYmVyIGlzIGludmFsaWQKK2tCYWRTaXplRXJyID0gICAtOTA1NyAgICNzcGVjaWZpZWQgc2l6ZSBpcyBpbnZhbGlkCitrQmFkUGFnZUVyciA9ICAgLTkwNTYgICAjc3BlY2lmaWVkIHBhZ2UgaXMgaW52YWxpZAora0JhZE9mZnNldEVyciAgID0gICAtOTA1NSAgICNzcGVjaWZpZWQgUEMgY2FyZCBtZW1vcnkgYXJyYXkgb2Zmc2V0IGlzIGludmFsaWQKK2tCYWRJUlFFcnIgID0gICAtOTA1NCAgICNzcGVjaWZpZWQgSVJRIGxldmVsIGlzIGludmFsaWQKK2tCYWRFRENFcnIgID0gICAtOTA1MyAgICNzcGVjaWZpZWQgRURDIGdlbmVyYXRvciBzcGVjaWZpZWQgaXMgaW52YWxpZAora0JhZEJhc2VFcnIgPSAgIC05MDUyICAgI3NwZWNpZmllZCBiYXNlIHN5c3RlbSBtZW1vcnkgYWRkcmVzcyBpcyBpbnZhbGlkCitrQmFkQXR0cmlidXRlRXJyICAgID0gICAtOTA1MSAgICNzcGVjaWZpZWQgYXR0cmlidXRlcyBmaWVsZCB2YWx1ZSBpcyBpbnZhbGlkCitrQmFkQWRhcHRlckVyciAgPSAgIC05MDUwICAgI2ludmFsaWQgYWRhcHRlciBudW1iZXIKK2NvZGVjT2Zmc2NyZWVuRmFpbGVkUGxlYXNlUmV0cnlFcnIgID0gICAtODk5MiAgICNjb2RlY09mZnNjcmVlbkZhaWxlZFBsZWFzZVJldHJ5RXJyCitsb2NrUG9ydEJpdHNXcm9uZ0dEZXZpY2VFcnIgPSAgIC04OTkxICAgI2xvY2tQb3J0Qml0c1dyb25nR0RldmljZUVycgorZGlyZWN0WE9iamVjdEFscmVhZHlFeGlzdHMgID0gICAtODk5MCAgICNkaXJlY3RYT2JqZWN0QWxyZWFkeUV4aXN0cworY29kZWNEcm9wcGVkRnJhbWVFcnIgICAgPSAgIC04OTg5ICAgI3JldHVybmVkIGZyb20gSW1hZ2VDb2RlY0RyYXdCYW5kCitjb2RlY09mZnNjcmVlbkZhaWxlZEVyciA9ICAgLTg5ODggICAjY29kZWNPZmZzY3JlZW5GYWlsZWRFcnIKK2NvZGVjTmVlZEFjY2Vzc0tleUVyciAgID0gICAtODk4NyAgICNjb2RlYyBuZWVkcyBwYXNzd29yZCBpbiBvcmRlciB0byBkZWNvbXByZXNzCitjb2RlY1BhcmFtZXRlckRpYWxvZ0NvbmZpcm0gPSAgIC04OTg2ICAgI2NvZGVjUGFyYW1ldGVyRGlhbG9nQ29uZmlybQorbG9ja1BvcnRCaXRzU3VyZmFjZUxvc3RFcnIgID0gICAtODk4NSAgICNsb2NrUG9ydEJpdHNTdXJmYWNlTG9zdEVycgorbG9ja1BvcnRCaXRzQmFkUG9ydEVyciAgPSAgIC04OTg0ICAgI2xvY2tQb3J0Qml0c0JhZFBvcnRFcnIKK2xvY2tQb3J0Qml0c1dpbmRvd0NsaXBwZWRFcnIgICAgPSAgIC04OTgzICAgI2xvY2tQb3J0Qml0c1dpbmRvd0NsaXBwZWRFcnIKK2xvY2tQb3J0Qml0c1dpbmRvd1Jlc2l6ZWRFcnIgICAgPSAgIC04OTgyICAgI2xvY2tQb3J0Qml0c1dpbmRvd1Jlc2l6ZWRFcnIKK2xvY2tQb3J0Qml0c1dpbmRvd01vdmVkRXJyICA9ICAgLTg5ODEgICAjbG9ja1BvcnRCaXRzV2luZG93TW92ZWRFcnIKK2xvY2tQb3J0Qml0c0JhZFN1cmZhY2VFcnIgICA9ICAgLTg5ODAgICAjbG9ja1BvcnRCaXRzQmFkU3VyZmFjZUVycgorY29kZWNOZWVkVG9GbHVzaENoYWluRXJyICAgID0gICAtODk3OSAgICNjb2RlY05lZWRUb0ZsdXNoQ2hhaW5FcnIKK2NvZGVjRGlzYWJsZWRFcnIgICAgPSAgIC04OTc4ICAgI2NvZGVjIGRpc2FibGVkIGl0c2VsZiAtLSBwYXNzIGNvZGVjRmxhZ1JlZW5hYmxlIHRvIHJlc2V0Citjb2RlY05vTWVtb3J5UGxlYXNlV2FpdEVyciAgPSAgIC04OTc3ICAgI2NvZGVjTm9NZW1vcnlQbGVhc2VXYWl0RXJyCitjb2RlY05vdGhpbmdUb0JsaXRFcnIgICA9ICAgLTg5NzYgICAjY29kZWNOb3RoaW5nVG9CbGl0RXJyCitjb2RlY0NhbnRRdWV1ZUVyciAgID0gICAtODk3NSAgICNjb2RlY0NhbnRRdWV1ZUVycgorY29kZWNDYW50V2hlbkVyciAgICA9ICAgLTg5NzQgICAjY29kZWNDYW50V2hlbkVycgorY29kZWNPcGVuRXJyICAgID0gICAtODk3MyAgICNjb2RlY09wZW5FcnIKK2NvZGVjQ29uZGl0aW9uRXJyICAgPSAgIC04OTcyICAgI2NvZGVjQ29uZGl0aW9uRXJyCitjb2RlY0V4dGVuc2lvbk5vdEZvdW5kRXJyICAgPSAgIC04OTcxICAgI2NvZGVjRXh0ZW5zaW9uTm90Rm91bmRFcnIKK2NvZGVjRGF0YVZlcnNFcnIgICAgPSAgIC04OTcwICAgI2NvZGVjRGF0YVZlcnNFcnIKK2NvZGVjQmFkRGF0YUVyciA9ICAgLTg5NjkgICAjY29kZWNCYWREYXRhRXJyCitjb2RlY1dvdWxkT2Zmc2NyZWVuRXJyICA9ICAgLTg5NjggICAjY29kZWNXb3VsZE9mZnNjcmVlbkVycgorY29kZWNBYm9ydEVyciAgID0gICAtODk2NyAgICNjb2RlY0Fib3J0RXJyCitjb2RlY1Nwb29sRXJyICAgPSAgIC04OTY2ICAgI2NvZGVjU3Bvb2xFcnIKK2NvZGVjSW1hZ2VCdWZFcnIgICAgPSAgIC04OTY1ICAgI2NvZGVjSW1hZ2VCdWZFcnIKK2NvZGVjU2NyZWVuQnVmRXJyICAgPSAgIC04OTY0ICAgI2NvZGVjU2NyZWVuQnVmRXJyCitjb2RlY1NpemVFcnIgICAgPSAgIC04OTYzICAgI2NvZGVjU2l6ZUVycgorY29kZWNVbmltcEVyciAgID0gICAtODk2MiAgICNjb2RlY1VuaW1wRXJyCitub0NvZGVjRXJyICA9ICAgLTg5NjEgICAjbm9Db2RlY0VycgorY29kZWNFcnIgICAgPSAgIC04OTYwICAgI2NvZGVjRXJyCitrSWxsZWdhbENsb2NrVmFsdWVFcnIgICA9ICAgLTg4NTIgICAja0lsbGVnYWxDbG9ja1ZhbHVlRXJyCitrVVRDT3ZlcmZsb3dFcnIgPSAgIC04ODUxICAgI2tVVENPdmVyZmxvd0Vycgora1VUQ1VuZGVyZmxvd0VyciAgICA9ICAgLTg4NTAgICAja1VUQ1VuZGVyZmxvd0Vycgora0FUU1VMYXN0RXJyICAgID0gICAtODgwOSAgICNUaGUgbGFzdCBBVFNVSSBlcnJvciBjb2RlLgora0FUU1VMaW5lQnJlYWtJbldvcmQgICAgPSAgIC04ODA4ICAgI1RoaXMgaXMgbm90IGFuIGVycm9yIGNvZGUgYnV0IGlzIHJldHVybmVkIGJ5IEFUU1VCcmVha0xpbmUgdG8KK2tBVFNVQ29vcmRpbmF0ZU92ZXJmbG93RXJyICA9ICAgLTg4MDcgICAjVXNlZCB0byBpbmRpY2F0ZSB0aGUgY29vcmRpbmF0ZXMgcHJvdmlkZWQgdG8gYW4gQVRTVUkgcm91dGluZSBjYXVzZWQKK2tBVFNVTm9Gb250U2NhbGVyQXZhaWxhYmxlRXJyICAgPSAgIC04ODA2ICAgI1VzZWQgd2hlbiBubyBmb250IHNjYWxlciBpcyBhdmFpbGFibGUgZm9yIHRoZSBmb250IHBhc3NlZAora0FUU1VOb0ZvbnRDbWFwQXZhaWxhYmxlRXJyID0gICAtODgwNSAgICNVc2VkIHdoZW4gbm8gQ01BUCB0YWJsZSBjYW4gYmUgYWNjZXNzZWQgb3Igc3ludGhlc2l6ZWQgZm9yIHRoZQora0FUU1VMb3dMZXZlbEVyciAgICA9ICAgLTg4MDQgICAjVXNlZCB3aGVuIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aXRoaW4gdGhlIGxvdyBsZXZlbCBBVFMKK2tBVFNVUXVpY2tEcmF3VGV4dEVyciAgID0gICAtODgwMyAgICNVc2VkIHdoZW4gUXVpY2tEcmF3IFRleHQgZW5jb3VudGVycyBhbiBlcnJvciByZW5kZXJpbmcgb3IgbWVhc3VyaW5nCitrQVRTVU5vU3R5bGVSdW5zQXNzaWduZWRFcnIgPSAgIC04ODAyICAgI1VzZWQgd2hlbiBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIG1lYXN1cmUsIGhpZ2hsaWdodCBvciBkcmF3CitrQVRTVU5vdFNldEVyciAgPSAgIC04ODAxICAgI1VzZWQgd2hlbiB0aGUgY2xpZW50IGF0dGVtcHRzIHRvIHJldHJpZXZlIGFuIGF0dHJpYnV0ZSwKK2tBVFNVSW52YWxpZENhY2hlRXJyICAgID0gICAtODgwMCAgICNVc2VkIHdoZW4gYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byByZWFkIGluIHN0eWxlIGRhdGEKK2tBVFNVSW52YWxpZEF0dHJpYnV0ZVRhZ0VyciA9ICAgLTg3OTkgICAjVXNlZCB3aGVuIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gdXNlIGEgdGFnIHZhbHVlIHRoYXQKK2tBVFNVSW52YWxpZEF0dHJpYnV0ZVNpemVFcnIgICAgPSAgIC04Nzk4ICAgI1VzZWQgd2hlbiBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHVzZSBhbiBhdHRyaWJ1dGUgd2l0aCBhCitrQVRTVUludmFsaWRBdHRyaWJ1dGVWYWx1ZUVyciAgID0gICAtODc5NyAgICNVc2VkIHdoZW4gYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byB1c2UgYW4gYXR0cmlidXRlIHdpdGgKK2tBVFNVSW52YWxpZEZvbnRFcnIgPSAgIC04Nzk2ICAgI1VzZWQgd2hlbiBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIHVzZSBhbiBpbnZhbGlkIGZvbnQgSUQuCitrQVRTVU5vQ29ycmVzcG9uZGluZ0ZvbnRFcnIgPSAgIC04Nzk1ICAgI1RoaXMgdmFsdWUgaXMgcmV0cm5lZCBieSBmb250IElEIGNvbnZlcnNpb24KK2tBVFNVRm9udHNOb3RNYXRjaGVkICAgID0gICAtODc5NCAgICNUaGlzIHZhbHVlIGlzIHJldHVybmVkIGJ5IEFUU1VNYXRjaEZvbnRzVG9UZXh0KCkKK2tBVFNVRm9udHNNYXRjaGVkICAgPSAgIC04NzkzICAgI1RoaXMgaXMgbm90IGFuIGVycm9yIGNvZGUgYnV0IGlzIHJldHVybmVkIGJ5CitrQVRTVUludmFsaWRUZXh0UmFuZ2VFcnIgICAgPSAgIC04NzkyICAgI0FuIGF0dGVtcHQgd2FzIG1hZGUgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbgora0FUU1VJbnZhbGlkU3R5bGVFcnIgICAgPSAgIC04NzkxICAgI0FuIGF0dGVtcHQgd2FzIG1hZGUgdG8gdXNlIGEgQVRTVVN0eWxlIHdoaWNoCitrQVRTVUludmFsaWRUZXh0TGF5b3V0RXJyICAgPSAgIC04NzkwICAgI0FuIGF0dGVtcHQgd2FzIG1hZGUgdG8gdXNlIGEgQVRTVVRleHRMYXlvdXQKK2tURUNPdXRwdXRCdWZmZXJGdWxsU3RhdHVzICA9ICAgLTg3ODUgICAjb3V0cHV0IGJ1ZmZlciBoYXMgbm8gcm9vbSBmb3IgY29udmVyc2lvbiBvZiBuZXh0IGlucHV0IHRleHQgZWxlbWVudCAocGFydGlhbCBjb252ZXJzaW9uKQora1RFQ05lZWRGbHVzaFN0YXR1cyA9ICAgLTg3ODQgICAja1RFQ05lZWRGbHVzaFN0YXR1cwora1RFQ1VzZWRGYWxsYmFja3NTdGF0dXMgPSAgIC04NzgzICAgI2tURUNVc2VkRmFsbGJhY2tzU3RhdHVzCitrVEVDSXRlbVVuYXZhaWxhYmxlRXJyICA9ICAgLTg3NzEgICAjaXRlbSAoZS5nLiBuYW1lKSBub3QgYXZhaWxhYmxlIGZvciBzcGVjaWZpZWQgcmVnaW9uICgmIGVuY29kaW5nIGlmIHJlbGV2YW50KQora1RFQ0dsb2JhbHNVbmF2YWlsYWJsZUVyciAgID0gICAtODc3MCAgICNnbG9iYWxzIGhhdmUgYWxyZWFkeSBiZWVuIGRlYWxsb2NhdGVkIChwcmVtYXR1cmUgVEVSTSkKK3VuaWNvZGVDaGVja3N1bUVyciAgPSAgIC04NzY5ICAgI3VuaWNvZGVDaGVja3N1bUVycgordW5pY29kZU5vVGFibGVFcnIgICA9ICAgLTg3NjggICAjdW5pY29kZU5vVGFibGVFcnIKK3VuaWNvZGVWYXJpYW50RXJyICAgPSAgIC04NzY3ICAgI3VuaWNvZGVWYXJpYW50RXJyCit1bmljb2RlRmFsbGJhY2tzRXJyID0gICAtODc2NiAgICN1bmljb2RlRmFsbGJhY2tzRXJyCit1bmljb2RlUGFydENvbnZlcnRFcnIgICA9ICAgLTg3NjUgICAjdW5pY29kZVBhcnRDb252ZXJ0RXJyCit1bmljb2RlQnVmRXJyICAgPSAgIC04NzY0ICAgI3VuaWNvZGVCdWZFcnIKK3VuaWNvZGVDaGFyRXJyICA9ICAgLTg3NjMgICAjdW5pY29kZUNoYXJFcnIKK3VuaWNvZGVFbGVtZW50RXJyICAgPSAgIC04NzYyICAgI3VuaWNvZGVFbGVtZW50RXJyCit1bmljb2RlTm90Rm91bmRFcnIgID0gICAtODc2MSAgICN1bmljb2RlTm90Rm91bmRFcnIKK3VuaWNvZGVUYWJsZUZvcm1hdEVyciAgID0gICAtODc2MCAgICN1bmljb2RlVGFibGVGb3JtYXRFcnIKK3VuaWNvZGVEaXJlY3Rpb25FcnIgPSAgIC04NzU5ICAgI3VuaWNvZGVEaXJlY3Rpb25FcnIKK3VuaWNvZGVDb250ZXh0dWFsRXJyICAgID0gICAtODc1OCAgICN1bmljb2RlQ29udGV4dHVhbEVycgordW5pY29kZVRleHRFbmNvZGluZ0RhdGFFcnIgID0gICAtODc1NyAgICN1bmljb2RlVGV4dEVuY29kaW5nRGF0YUVycgora1RFQ0RpcmVjdGlvbkVyciAgICA9ICAgLTg3NTYgICAjZGlyZWN0aW9uIHN0YWNrIG92ZXJmbG93LCBldGMuCitrVEVDSW5jb21wbGV0ZUVsZW1lbnRFcnIgICAgPSAgIC04NzU1ICAgI3RleHQgZWxlbWVudCBtYXkgYmUgaW5jb21wbGV0ZSBvciBpcyB0b28gbG9uZyBmb3IgaW50ZXJuYWwgYnVmZmVycwora1RFQ1VubWFwcGFibGVFbGVtZW50RXJyICAgID0gICAtODc1NCAgICNrVEVDVW5tYXBwYWJsZUVsZW1lbnRFcnIKK2tURUNQYXJ0aWFsQ2hhckVyciAgPSAgIC04NzUzICAgI2lucHV0IGJ1ZmZlciBlbmRzIGluIHRoZSBtaWRkbGUgb2YgYSBtdWx0aWJ5dGUgY2hhcmFjdGVyLCBjb252ZXJzaW9uIHN0b3BwZWQKK2tURUNCYWRUZXh0UnVuRXJyICAgPSAgIC04NzUyICAgI2tURUNCYWRUZXh0UnVuRXJyCitrVEVDQXJyYXlGdWxsRXJyICAgID0gICAtODc1MSAgICNzdXBwbGllZCBuYW1lIGJ1ZmZlciBvciBUZXh0UnVuLCBUZXh0RW5jb2RpbmcsIG9yIFVuaWNvZGVNYXBwaW5nIGFycmF5IGlzIHRvbyBzbWFsbAora1RFQ0J1ZmZlckJlbG93TWluaW11bVNpemVFcnIgICA9ICAgLTg3NTAgICAjb3V0cHV0IGJ1ZmZlciB0b28gc21hbGwgdG8gYWxsb3cgcHJvY2Vzc2luZyBvZiBmaXJzdCBpbnB1dCB0ZXh0IGVsZW1lbnQKK2tURUNOb0NvbnZlcnNpb25QYXRoRXJyID0gICAtODc0OSAgICNrVEVDTm9Db252ZXJzaW9uUGF0aEVycgora1RFQ0NvcnJ1cHRDb252ZXJ0ZXJFcnIgPSAgIC04NzQ4ICAgI2ludmFsaWQgY29udmVydGVyIG9iamVjdCByZWZlcmVuY2UKK2tURUNUYWJsZUZvcm1hdEVyciAgPSAgIC04NzQ3ICAgI2tURUNUYWJsZUZvcm1hdEVycgora1RFQ1RhYmxlQ2hlY2tzdW1FcnIgICAgPSAgIC04NzQ2ICAgI2tURUNUYWJsZUNoZWNrc3VtRXJyCitrVEVDTWlzc2luZ1RhYmxlRXJyID0gICAtODc0NSAgICNrVEVDTWlzc2luZ1RhYmxlRXJyCitrVGV4dFVuZGVmaW5lZEVsZW1lbnRFcnIgICAgPSAgIC04NzQwICAgI3RleHQgY29udmVyc2lvbiBlcnJvcnMKK2tUZXh0TWFsZm9ybWVkSW5wdXRFcnIgID0gICAtODczOSAgICNpbiBEQkNTLCBmb3IgZXhhbXBsZSwgaGlnaCBieXRlIGZvbGxvd2VkIGJ5IGludmFsaWQgbG93IGJ5dGUKK2tUZXh0VW5zdXBwb3J0ZWRFbmNvZGluZ0VyciA9ICAgLTg3MzggICAjc3BlY2lmaWVkIGVuY29kaW5nIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgb3BlcmF0aW9uCitrUkFOb3RFbmFibGVkICAgPSAgIC03MTM5ICAgI2tSQU5vdEVuYWJsZWQKK2tSQUNhbGxCYWNrRmFpbGVkICAgPSAgIC03MTM4ICAgI2tSQUNhbGxCYWNrRmFpbGVkCitrUkFEdXBsaWNhdGVJUEFkZHIgID0gICAtNzEzNyAgICNrUkFEdXBsaWNhdGVJUEFkZHIKK2tSQU5DUFJlamVjdGVkYnlQZWVyICAgID0gICAtNzEzNiAgICNrUkFOQ1BSZWplY3RlZGJ5UGVlcgora1JBRXh0QXV0aGVudGljYXRpb25GYWlsZWQgID0gICAtNzEzNSAgICNrUkFFeHRBdXRoZW50aWNhdGlvbkZhaWxlZAora1JBQVRhbGtJbmFjdGl2ZSAgICA9ICAgLTcxMzQgICAja1JBQVRhbGtJbmFjdGl2ZQora1JBUGVlck5vdFJlc3BvbmRpbmcgICAgPSAgIC03MTMzICAgI2tSQVBlZXJOb3RSZXNwb25kaW5nCitrUkFQUFBQZWVyRGlzY29ubmVjdGVkICA9ICAgLTcxMzIgICAja1JBUFBQUGVlckRpc2Nvbm5lY3RlZAora1JBUFBQVXNlckRpc2Nvbm5lY3RlZCAgPSAgIC03MTMxICAgI2tSQVBQUFVzZXJEaXNjb25uZWN0ZWQKK2tSQVBQUE5lZ290aWF0aW9uRmFpbGVkID0gICAtNzEzMCAgICNrUkFQUFBOZWdvdGlhdGlvbkZhaWxlZAora1JBUFBQQXV0aGVudGljYXRpb25GYWlsZWQgID0gICAtNzEyOSAgICNrUkFQUFBBdXRoZW50aWNhdGlvbkZhaWxlZAora1JBUFBQUHJvdG9jb2xSZWplY3RlZCAgPSAgIC03MTI4ICAgI2tSQVBQUFByb3RvY29sUmVqZWN0ZWQKK2RjbUJ1ZmZlck92ZXJmbG93RXJyICAgID0gICAtNzEyNyAgICNkYXRhIGlzIGxhcmdlciB0aGFuIGJ1ZmZlciBzaXplCitrUkFOb3RQcmltYXJ5SW50ZXJmYWNlICA9ICAgLTcxMjYgICAjd2hlbiBJUENQIGlzIG5vdCBwcmltYXJ5IFRDUC9JUCBpbnRmLgora1JBVENQSVBOb3RDb25maWd1cmVkICAgPSAgIC03MTI1ICAgI1RDUC9JUCBub3QgY29uZmlndXJlZCwgY291bGQgYmUgbG9hZGVkCitrUkFUQ1BJUEluYWN0aXZlICAgID0gICAtNzEyNCAgICNUQ1AvSVAgaW5hY3RpdmUsIGNhbm5vdCBiZSBsb2FkZWQKK2tSQVJlbW90ZUFjY2Vzc05vdFJlYWR5ID0gICAtNzEyMyAgICNrUkFSZW1vdGVBY2Nlc3NOb3RSZWFkeQora1JBSW5pdE9wZW5UcmFuc3BvcnRGYWlsZWQgID0gICAtNzEyMiAgICNrUkFJbml0T3BlblRyYW5zcG9ydEZhaWxlZAorZGNtUHJvdGVjdGVkRXJyID0gICAtNzEyMSAgICNuZWVkIGtleXdvcmQgdG8gdXNlIGRpY3Rpb25hcnkKK2tSQVVzZXJQd2RFbnRyeVJlcXVpcmVkID0gICAtNzEyMCAgICNrUkFVc2VyUHdkRW50cnlSZXF1aXJlZAora1JBVXNlclB3ZENoYW5nZVJlcXVpcmVkICAgID0gICAtNzExOSAgICNrUkFVc2VyUHdkQ2hhbmdlUmVxdWlyZWQKK2RjbUJhZEZpbmRNZXRob2RFcnIgPSAgIC03MTE4ICAgI25vIHN1Y2ggZmluZCBtZXRob2Qgc3VwcG9ydGVkCitrUkFJbnZhbGlkU2VyaWFsUHJvdG9jb2wgICAgPSAgIC03MTE3ICAgI2tSQUludmFsaWRTZXJpYWxQcm90b2NvbAora1JBSW52YWxpZFBvcnRTdGF0ZSA9ICAgLTcxMTYgICAja1JBSW52YWxpZFBvcnRTdGF0ZQorZGNtQmFkS2V5RXJyICAgID0gICAtNzExNSAgICNiYWQga2V5IGluZm9ybWF0aW9uCitrUkFQb3J0QnVzeSA9ICAgLTcxMTQgICAja1JBUG9ydEJ1c3kKK2tSQUluc3RhbGxhdGlvbkRhbWFnZWQgID0gICAtNzExMyAgICNrUkFJbnN0YWxsYXRpb25EYW1hZ2VkCitkY21CYWRGaWVsZFR5cGVFcnIgID0gICAtNzExMiAgICNubyBzdWNoIGZpZWxkIHR5cGUgc3VwcG9ydGVkCitkY21CYWRGaWVsZEluZm9FcnIgID0gICAtNzExMSAgICNpbmNvbXBsZXRlIGluZm9ybWF0aW9uCitkY21OZWNlc3NhcnlGaWVsZEVyciAgICA9ICAgLTcxMTAgICAjbGFjayByZXF1aXJlZC9pZGVudGlmeSBmaWVsZAorZGNtRHVwUmVjb3JkRXJyID0gICAtNzEwOSAgICNzYW1lIHJlY29yZCBhbHJlYWR5IGV4aXN0CitrUkFOb3RDb25uZWN0ZWQgPSAgIC03MTA4ICAgI2tSQU5vdENvbm5lY3RlZAorZGNtQmxvY2tGdWxsRXJyID0gICAtNzEwNyAgICNkaWN0aW9uYXJ5IGJsb2NrIGZ1bGwKK2tSQU1pc3NpbmdSZXNvdXJjZXMgPSAgIC03MTA2ICAgI2tSQU1pc3NpbmdSZXNvdXJjZXMKK2RjbURpY3Rpb25hcnlCdXN5RXJyICAgID0gICAtNzEwNSAgICNkaWN0aW9uYXJ5IGlzIGJ1c3kKK2RjbURpY3Rpb25hcnlOb3RPcGVuRXJyID0gICAtNzEwNCAgICNkaWN0aW9uYXJ5IG5vdCBvcGVuZWQKK2RjbVBlcm1pc3Npb25FcnIgICAgPSAgIC03MTAzICAgI2ludmFsaWQgcGVybWlzc2lvbgorZGNtQmFkRGljdGlvbmFyeUVyciA9ICAgLTcxMDIgICAjaW52YWxpZCBkaWN0aW9uYXJ5CitkY21Ob3REaWN0aW9uYXJ5RXJyID0gICAtNzEwMSAgICNub3QgZGljdGlvbmFyeQora1JBSW52YWxpZFBhcmFtZXRlciA9ICAgLTcxMDAgICAja1JBSW52YWxpZFBhcmFtZXRlcgorbGFFbmdpbmVOb3RGb3VuZEVyciA9ICAgLTcwMDAgICAjY2FuJ3QgZmluZCB0aGUgZW5naW5lCitsYVByb3BlcnR5RXJyICAgPSAgIC02OTk5ICAgI0Vycm9yIGluIHByb3BlcnRpZXMKK2tVU0JVbmtub3duRGV2aWNlRXJyICAgID0gICAtNjk5OCAgICNkZXZpY2UgcmVmIG5vdCByZWNvZ25pc2VkCitsYVByb3BlcnR5SXNSZWFkT25seUVyciA9ICAgLTY5OTcgICAjdGhlIHByb3BlcnR5IGlzIHJlYWQgb25seQorbGFQcm9wZXJ0eVVua25vd25FcnIgICAgPSAgIC02OTk2ICAgI3RoZSBwcm9wZXJ0eSBpcyB1bmtub3duIHRvIHRoaXMgZW52aXJvbm1lbnQKK2xhUHJvcGVydHlWYWx1ZUVyciAgPSAgIC02OTk1ICAgI0ludmFsaWQgcHJvcGVydHkgdmFsdWUKK2xhRGljdGlvbmFyeVRvb01hbnlFcnIgID0gICAtNjk5NCAgICN0b28gbWFueSBkaWN0aW9uYXJpZXMKK2xhRGljdGlvbmFyeVVua25vd25FcnIgID0gICAtNjk5MyAgICNjYW4ndCB1c2UgdGhpcyBkaWN0aW9uYXJ5IHdpdGggdGhpcyBlbnZpcm9ubWVudAorbGFEaWN0aW9uYXJ5Tm90T3BlbmVkRXJyICAgID0gICAtNjk5MiAgICN0aGUgZGljdGlvbmFyeSBpcyBub3Qgb3BlbmVkCitsYVRleHRPdmVyRmxvd0VyciAgID0gICAtNjk5MSAgICN0ZXh0IGlzIHRvbyBsb25nCitsYUZhaWxBbmFseXNpc0VyciAgID0gICAtNjk5MCAgICNhbmFseXNpcyBmYWlsZWQKK2xhTm9Nb3JlTW9ycGhlbWVFcnIgPSAgIC02OTg5ICAgI25vdGhpbmcgdG8gcmVhZAorbGFJbnZhbGlkUGF0aEVyciAgICA9ICAgLTY5ODggICAjcGF0aCBpcyBub3QgY29ycmVjdAora1VTQk5vdEhhbmRsZWQgID0gICAtNjk4NyAgICNOb3RpZmljYXRpb24gd2FzIG5vdCBoYW5kbGVkICAgKHNhbWUgYXMgTm90Rm91bmQpCitsYUVudmlyb25tZW50Tm90Rm91bmRFcnIgICAgPSAgIC02OTg2ICAgI2Nhbid0IGZpbnQgdGhlIHNwZWNpZmllZCBlbnZpcm9ubWVudAorbGFFbnZpcm9ubWVudEJ1c3lFcnIgICAgPSAgIC02OTg1ICAgI3NwZWNpZmllZCBlbnZpcm9ubWVudCBpcyB1c2VkCitsYVRvb1NtYWxsQnVmZmVyRXJyID0gICAtNjk4NCAgICNvdXRwdXQgYnVmZmVyIGlzIHRvbyBzbWFsbCB0byBzdG9yZSBhbnkgcmVzdWx0CitrVVNCRmxhZ3NFcnJvciAgPSAgIC02OTgzICAgI1VudXNlZCBmbGFncyBub3QgemVyb2VkCitrVVNCQWJvcnRlZEVycm9yICAgID0gICAtNjk4MiAgICNQaXBlIGFib3J0ZWQKK2tVU0JOb0JhbmR3aWR0aEVycm9yICAgID0gICAtNjk4MSAgICNOb3QgZW5vdWdoIGJhbmR3aWR0aCBhdmFpbGFibGUKK2tVU0JQaXBlSWRsZUVycm9yICAgPSAgIC02OTgwICAgI1BpcGUgaXMgSWRsZSwgaXQgd2lsbCBub3QgYWNjZXB0IHRyYW5zYWN0aW9ucwora1VTQlBpcGVTdGFsbGVkRXJyb3IgICAgPSAgIC02OTc5ICAgI1BpcGUgaGFzIHN0YWxsZWQsIGVycm9yIG5lZWRzIHRvIGJlIGNsZWFyZWQKK2tVU0JVbmtub3duSW50ZXJmYWNlRXJyID0gICAtNjk3OCAgICNJbnRlcmZhY2UgcmVmIG5vdCByZWNvZ25pc2VkCitrVVNCRGV2aWNlQnVzeSAgPSAgIC02OTc3ICAgI0RldmljZSBpcyBhbHJlYWR5IGJlaW5nIGNvbmZpZ3VyZWQKK2tVU0JEZXZpY2VQb3dlclByb2JsZW0gID0gICAtNjk3NiAgICNEZXZpY2UgaGFzIGEgcG93ZXIgcHJvYmxlbQora1VTQkludmFsaWRCdWZmZXIgICA9ICAgLTY5NzUgICAjYmFkIGJ1ZmZlciwgdXN1YWxseSBuaWwKK2tVU0JEZXZpY2VTdXNwZW5kZWQgPSAgIC02OTc0ICAgI0RldmljZSBpcyBzdXNwZW5kZWQKK2tVU0JEZXZpY2VOb3RTdXNwZW5kZWQgID0gICAtNjk3MyAgICNkZXZpY2UgaXMgbm90IHN1c3BlbmRlZCBmb3IgcmVzdW1lCitrVVNCRGV2aWNlRGlzY29ubmVjdGVkICA9ICAgLTY5NzIgICAjRGlzY29ubmVjdGVkIGR1cmluZyBzdXNwZW5kIG9yIHJlc2V0CitrVVNCVGltZWRPdXQgICAgPSAgIC02OTcxICAgI1RyYW5zYWN0aW9uIHRpbWVkIG91dC4KK2tVU0JRdWV1ZUFib3J0ZWQgICAgPSAgIC02OTcwICAgI1BpcGUgemVybyBzdGFsbCBjbGVhcmVkLgora1VTQlBvcnREaXNhYmxlZCAgICA9ICAgLTY5NjkgICAjVGhlIHBvcnQgeW91IGFyZSBhdHRhY2hlZCB0byBpcyBkaXNhYmxlZCwgdXNlIFVTQkRldmljZVJlc2V0Lgora1VTQkJhZERpc3BhdGNoVGFibGUgICAgPSAgIC02OTUwICAgI0ltcHJvcGVyIGRyaXZlciBkaXNwYXRjaCB0YWJsZQora1VTQlVua25vd25Ob3RpZmljYXRpb24gPSAgIC02OTQ5ICAgI05vdGlmaWNhdGlvbiB0eXBlIG5vdCBkZWZpbmVkCitrVVNCUXVldWVGdWxsICAgPSAgIC02OTQ4ICAgI0ludGVybmFsIHF1ZXVlIG1heHhlZAora1VTQkxpbmtFcnIgPSAgIC02OTE2ICAgI2tVU0JMaW5rRXJyCitrVVNCQ1JDRXJyICA9ICAgLTY5MTUgICAjUGlwZSBzdGFsbCwgYmFkIENSQwora1VTQkJpdHN0dWZFcnIgID0gICAtNjkxNCAgICNQaXBlIHN0YWxsLCBiaXRzdHVmZmluZwora1VTQkRhdGFUb2dnbGVFcnIgICA9ICAgLTY5MTMgICAjUGlwZSBzdGFsbCwgQmFkIGRhdGEgdG9nZ2xlCitrVVNCRW5kcG9pbnRTdGFsbEVyciAgICA9ICAgLTY5MTIgICAjRGV2aWNlIGRpZG4ndCB1bmRlcnN0YW5kCitrVVNCTm90UmVzcG9uZGluZ0VyciAgICA9ICAgLTY5MTEgICAjUGlwZSBzdGFsbCwgTm8gZGV2aWNlLCBkZXZpY2UgaHVuZwora1VTQlBJRENoZWNrRXJyID0gICAtNjkxMCAgICNQaXBlIHN0YWxsLCBQSUQgQ1JDIGVycm9yCitrVVNCV3JvbmdQSURFcnIgPSAgIC02OTA5ICAgI1BpcGUgc3RhbGwsIEJhZCBvciB3cm9uZyBQSUQKK2tVU0JPdmVyUnVuRXJyICA9ICAgLTY5MDggICAjUGFja2V0IHRvbyBsYXJnZSBvciBtb3JlIGRhdGEgdGhhbiBidWZmZXIKK2tVU0JVbmRlclJ1bkVyciA9ICAgLTY5MDcgICAjTGVzcyBkYXRhIHRoYW4gYnVmZmVyCitrVVNCUmVzMUVyciA9ICAgLTY5MDYgICAja1VTQlJlczFFcnIKK2tVU0JSZXMyRXJyID0gICAtNjkwNSAgICNrVVNCUmVzMkVycgora1VTQkJ1Zk92clJ1bkVyciAgICA9ICAgLTY5MDQgICAjSG9zdCBoYXJkd2FyZSBmYWlsdXJlIG9uIGRhdGEgaW4sIFBDSSBidXN5Pwora1VTQkJ1ZlVuZGVyUnVuRXJyICA9ICAgLTY5MDMgICAjSG9zdCBoYXJkd2FyZSBmYWlsdXJlIG9uIGRhdGEgb3V0LCBQQ0kgYnVzeT8KK2tVU0JOb3RTZW50MUVyciA9ICAgLTY5MDIgICAjVHJhbnNhY3Rpb24gbm90IHNlbnQKK2tVU0JOb3RTZW50MkVyciA9ICAgLTY5MDEgICAjVHJhbnNhY3Rpb24gbm90IHNlbnQKK2tETUZvdW5kRXJyID0gICAtNjIzMiAgICNEaWQgbm90IHByb2NlZWQgYmVjYXVzZSB3ZSBmb3VuZCBhbiBpdGVtCitrRE1NYWluRGlzcGxheUNhbm5vdE1vdmVFcnIgPSAgIC02MjMxICAgI1RyeWluZyB0byBtb3ZlIG1haW4gZGlzcGxheSAob3IgYSBkaXNwbGF5IG1pcnJvcmVkIHRvIGl0KQora0RNRGlzcGxheUFscmVhZHlJbnN0YWxsZWRFcnIgICA9ICAgLTYyMzAgICAjQXR0ZW1wdCB0byBhZGQgYW4gYWxyZWFkeSBpbnN0YWxsZWQgZGlzcGxheS4KK2tETURpc3BsYXlOb3RGb3VuZEVyciAgID0gICAtNjIyOSAgICNDb3VsZCBub3QgZmluZCBpdGVtICh3aWxsIHNvbWVkYXkgcmVtb3ZlKS4KK2tETURyaXZlck5vdERpc3BsYXlNZ3JBd2FyZUVyciAgPSAgIC02MjI4ICAgI1ZpZGVvIERyaXZlciBkb2VzIG5vdCBzdXBwb3J0IGRpc3BsYXkgbWFuYWdlci4KK2tETVNXTm90SW5pdGlhbGl6ZWRFcnIgID0gICAtNjIyNyAgICNSZXF1aXJlZCBzb2Z0d2FyZSBub3QgaW5pdGlhbGl6ZWQgKGVnIHdpbmRvd21hbmFnZXIgb3IgZGlzcGxheSBtZ3IpLgora1N5c1NXVG9vT2xkICAgID0gICAtNjIyNiAgICNNaXNzaW5nIGNyaXRpY2FsIHBpZWNlcyBvZiBTeXN0ZW0gU29mdHdhcmUuCitrRE1NaXJyb3JpbmdOb3RPbiAgID0gICAtNjIyNSAgICNSZXR1cm5lZCBieSBhbGwgY2FsbHMgdGhhdCBuZWVkIG1pcnJvcmluZyB0byBiZSBvbiB0byBkbyB0aGVpciB0aGluZy4KK2tETUNhbnRCbG9jayAgICA9ICAgLTYyMjQgICAjTWlycm9yaW5nIGlzIGFscmVhZHkgb24sIGNhbtV0IEJsb2NrIG5vdyAoY2FsbCBETVVuTWlycm9yKCkgZmlyc3QpLgora0RNTWlycm9yaW5nQmxvY2tlZCA9ICAgLTYyMjMgICAjRE1CbG9ja01pcnJvcmluZygpIGhhcyBiZWVuIGNhbGxlZC4KK2tETVdyb25nTnVtYmVyT2ZEaXNwbGF5cyAgICA9ICAgLTYyMjIgICAjQ2FuIG9ubHkgaGFuZGxlIDIgZGlzcGxheXMgZm9yIG5vdy4KK2tETU1pcnJvcmluZ09uQWxyZWFkeSAgID0gICAtNjIyMSAgICNSZXR1cm5lZCBieSBhbGwgY2FsbHMgdGhhdCBuZWVkIG1pcnJvcmluZyB0byBiZSBvZmYgdG8gZG8gdGhlaXIgdGhpbmcuCitrRE1HZW5FcnIgICA9ICAgLTYyMjAgICAjVW5leHBlY3RlZCBFcnJvcgora1FUU1NVbmtub3duRXJyID0gICAtNjE1MCAgICNrUVRTU1Vua25vd25FcnIKK2NvbGxlY3Rpb25WZXJzaW9uRXJyICAgID0gICAtNTc1MyAgICNjb2xsZWN0aW9uVmVyc2lvbkVycgorY29sbGVjdGlvbkluZGV4UmFuZ2VFcnIgPSAgIC01NzUyICAgI2NvbGxlY3Rpb25JbmRleFJhbmdlRXJyCitjb2xsZWN0aW9uSXRlbU5vdEZvdW5kRXJyICAgPSAgIC01NzUxICAgI2NvbGxlY3Rpb25JdGVtTm90Rm91bmRFcnIKK2NvbGxlY3Rpb25JdGVtTG9ja2VkRXJyID0gICAtNTc1MCAgICNjb2xsZWN0aW9uSXRlbUxvY2tlZEVycgora05hdk1pc3NpbmdLaW5kU3RyaW5nRXJyICAgID0gICAtNTY5OSAgICNrTmF2TWlzc2luZ0tpbmRTdHJpbmdFcnIKK2tOYXZJbnZhbGlkQ3VzdG9tQ29udHJvbE1lc3NhZ2VFcnIgID0gICAtNTY5OCAgICNrTmF2SW52YWxpZEN1c3RvbUNvbnRyb2xNZXNzYWdlRXJyCitrTmF2Q3VzdG9tQ29udHJvbE1lc3NhZ2VGYWlsZWRFcnIgICA9ICAgLTU2OTcgICAja05hdkN1c3RvbUNvbnRyb2xNZXNzYWdlRmFpbGVkRXJyCitrTmF2SW52YWxpZFN5c3RlbUNvbmZpZ0VyciAgPSAgIC01Njk2ICAgI2tOYXZJbnZhbGlkU3lzdGVtQ29uZmlnRXJyCitrTmF2V3JvbmdEaWFsb2dDbGFzc0VyciA9ICAgLTU2OTUgICAja05hdldyb25nRGlhbG9nQ2xhc3NFcnIKK2tOYXZXcm9uZ0RpYWxvZ1N0YXRlRXJyID0gICAtNTY5NCAgICNrTmF2V3JvbmdEaWFsb2dTdGF0ZUVycgorZGlhbG9nTm9UaW1lb3V0RXJyICA9ICAgLTU2NDAgICAjZGlhbG9nTm9UaW1lb3V0RXJyCittZW51SW52YWxpZEVyciAgPSAgIC01NjIzICAgI21lbnUgaXMgaW52YWxpZAorbWVudUl0ZW1Ob3RGb3VuZEVyciA9ICAgLTU2MjIgICAjc3BlY2lmaWVkIG1lbnUgaXRlbSB3YXNuJ3QgZm91bmQKK21lbnVVc2VzU3lzdGVtRGVmRXJyICAgID0gICAtNTYyMSAgICNHZXRNZW51RGVmaW5pdGlvbiBmYWlsZWQgYmVjYXVzZSB0aGUgbWVudSB1c2VzIHRoZSBzeXN0ZW0gTURFRgorbWVudU5vdEZvdW5kRXJyID0gICAtNTYyMCAgICNzcGVjaWZpZWQgbWVudSBvciBtZW51IElEIHdhc24ndCBmb3VuZAord2luZG93V3JvbmdTdGF0ZUVyciA9ICAgLTU2MTUgICAjd2luZG93IGlzIG5vdCBpbiBhIHN0YXRlIHRoYXQgaXMgdmFsaWQgZm9yIHRoZSBjdXJyZW50IGFjdGlvbgord2luZG93TWFuYWdlckludGVybmFsRXJyICAgID0gICAtNTYxNCAgICNzb21ldGhpbmcgcmVhbGx5IHdlaXJkIGhhcHBlbmVkIGluc2lkZSB0aGUgd2luZG93IG1hbmFnZXIKK3dpbmRvd0F0dHJpYnV0ZXNDb25mbGljdEVyciA9ICAgLTU2MTMgICAjcGFzc2VkIHNvbWUgYXR0cmlidXRlcyB0aGF0IGFyZSBtdXR1YWxseSBleGNsdXNpdmUKK3dpbmRvd0F0dHJpYnV0ZUltbXV0YWJsZUVyciA9ICAgLTU2MTIgICAjdHJpZWQgdG8gY2hhbmdlIGF0dHJpYnV0ZXMgd2hpY2ggY2FuJ3QgYmUgY2hhbmdlZAorZXJyV2luZG93RG9lc05vdEZpdE9uc2NyZWVuID0gICAtNTYxMSAgICNDb25zdHJhaW5XaW5kb3dUb1NjcmVlbiBjb3VsZCBub3QgbWFrZSB0aGUgd2luZG93IGZpdCBvbnNjcmVlbgorZXJyV2luZG93Tm90Rm91bmQgICA9ICAgLTU2MTAgICAjcmV0dXJuZWQgZnJvbSBGaW5kV2luZG93T2ZDbGFzcworZXJyRmxvYXRpbmdXaW5kb3dzTm90SW5pdGlhbGl6ZWQgICAgPSAgIC01NjA5ICAgI2NhbGxlZCBIaWRlRmxvYXRpbmdXaW5kb3dzIG9yIFNob3dGbG9hdGluZ1dpbmRvd3Mgd2l0aG91dCBjYWxsaW5nIEluaXRGbG9hdGluZ1dpbmRvd3MKK2VycldpbmRvd3NBbHJlYWR5SW5pdGlhbGl6ZWQgICAgPSAgIC01NjA4ICAgI3RyaWVkIHRvIGNhbGwgSW5pdEZsb2F0aW5nV2luZG93cyB0d2ljZSwgb3IgY2FsbGVkIEluaXRXaW5kb3dzIGFuZCB0aGVuIGZsb2F0aW5nIHdpbmRvd3MKK2VyclVzZXJXYW50c1RvRHJhZ1dpbmRvdyAgICA9ICAgLTU2MDcgICAjaWYgcmV0dXJuZWQgZnJvbSBUcmFja1dpbmRvd1Byb3h5RHJhZywgeW91IHNob3VsZCBjYWxsIERyYWdXaW5kb3cgb24gdGhlIHdpbmRvdworZXJyQ29ycnVwdFdpbmRvd0Rlc2NyaXB0aW9uID0gICAtNTYwNiAgICN0cmllZCB0byBsb2FkIGEgY29ycnVwdCB3aW5kb3cgZGVzY3JpcHRpb24gKHNpemUgb3IgdmVyc2lvbiBmaWVsZHMgaW5jb3JyZWN0KQorZXJyVW5yZWNvZ25pemVkV2luZG93Q2xhc3MgID0gICAtNTYwNSAgICN0cmllZCB0byBjcmVhdGUgYSB3aW5kb3cgd2l0aCBhIGJhZCBXaW5kb3dDbGFzcworZXJyV2luZG93UHJvcGVydHlOb3RGb3VuZCAgID0gICAtNTYwNCAgICN0cmllZCB0byBnZXQgYSBub25leGlzdGVudCBwcm9wZXJ0eQorZXJySW52YWxpZFdpbmRvd1Byb3BlcnR5ICAgID0gICAtNTYwMyAgICN0cmllZCB0byBhY2Nlc3MgYSBwcm9wZXJ0eSB0YWcgd2l0aCBwcml2YXRlIGNyZWF0b3IKK2VycldpbmRvd0RvZXNOb3RIYXZlUHJveHkgICA9ICAgLTU2MDIgICAjdHJpZWQgdG8gZG8gc29tZXRoaW5nIHJlcXVpcmluZyBhIHByb3h5IHRvIGEgd2luZG93IHdoaWNoIGRvZXNu1XQgaGF2ZSBhIHByb3h5CitlcnJVbnN1cHBvcnRlZFdpbmRvd0F0dHJpYnV0ZXNGb3JDbGFzcyAgPSAgIC01NjAxICAgI3RyaWVkIHRvIGNyZWF0ZSBhIHdpbmRvdyB3aXRoIFdpbmRvd0F0dHJpYnV0ZXMgbm90IHN1cHBvcnRlZCBieSB0aGUgV2luZG93Q2xhc3MKK2VyckludmFsaWRXaW5kb3dQdHIgPSAgIC01NjAwICAgI3RyaWVkIHRvIHBhc3MgYSBiYWQgV2luZG93UmVmIGFyZ3VtZW50CitnZXN0YWx0TG9jYXRpb25FcnIgID0gICAtNTU1MyAgICNnZXN0YWx0IGZ1bmN0aW9uIHB0ciB3YXNuJ3QgaW4gc3lzaGVhcAorZ2VzdGFsdER1cFNlbGVjdG9yRXJyICAgPSAgIC01NTUyICAgI3RyaWVkIHRvIGFkZCBhbiBlbnRyeSB0aGF0IGFscmVhZHkgZXhpc3RlZAorZ2VzdGFsdFVuZGVmU2VsZWN0b3JFcnIgPSAgIC01NTUxICAgI3VuZGVmaW5lZCBzZWxlY3RvciB3YXMgcGFzc2VkIHRvIEdlc3RhbHQKK2dlc3RhbHRVbmtub3duRXJyICAgPSAgIC01NTUwICAgI3ZhbHVlIHJldHVybmVkIGlmIEdlc3RhbHQgZG9lc24ndCBrbm93IHRoZSBhbnN3ZXIKK2VudlZlcnNUb29CaWcgICA9ICAgLTU1MDIgICAjVmVyc2lvbiBiaWdnZXIgdGhhbiBjYWxsIGNhbiBoYW5kbGUKK2VudkJhZFZlcnMgID0gICAtNTUwMSAgICNWZXJzaW9uIG5vbi1wb3NpdGl2ZQorZW52Tm90UHJlc2VudCAgID0gICAtNTUwMCAgICNyZXR1cm5lZCBieSBnbHVlLgorcXRzQWRkcmVzc0J1c3lFcnIgICA9ICAgLTU0MjEgICAjcXRzQWRkcmVzc0J1c3lFcnIKK3F0c0Nvbm5lY3Rpb25GYWlsZWRFcnIgID0gICAtNTQyMCAgICNxdHNDb25uZWN0aW9uRmFpbGVkRXJyCitxdHNUaW1lb3V0RXJyICAgPSAgIC01NDA4ICAgI3F0c1RpbWVvdXRFcnIKK3F0c1Vua25vd25WYWx1ZUVyciAgPSAgIC01NDA3ICAgI3F0c1Vua25vd25WYWx1ZUVycgorcXRzVG9vTXVjaERhdGFFcnIgICA9ICAgLTU0MDYgICAjcXRzVG9vTXVjaERhdGFFcnIKK3F0c1Vuc3VwcG9ydGVkRmVhdHVyZUVyciAgICA9ICAgLTU0MDUgICAjcXRzVW5zdXBwb3J0ZWRGZWF0dXJlRXJyCitxdHNVbnN1cHBvcnRlZFJhdGVFcnIgICA9ICAgLTU0MDQgICAjcXRzVW5zdXBwb3J0ZWRSYXRlRXJyCitxdHNVbnN1cHBvcnRlZERhdGFUeXBlRXJyICAgPSAgIC01NDAzICAgI3F0c1Vuc3VwcG9ydGVkRGF0YVR5cGVFcnIKK3F0c0JhZERhdGFFcnIgICA9ICAgLTU0MDIgICAjc29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIGRhdGEKK3F0c0JhZFN0YXRlRXJyICA9ICAgLTU0MDEgICAjcXRzQmFkU3RhdGVFcnIKK3F0c0JhZFNlbGVjdG9yRXJyICAgPSAgIC01NDAwICAgI3F0c0JhZFNlbGVjdG9yRXJyCitlcnJJQUVuZE9mVGV4dFJ1biAgID0gICAtNTM4OCAgICNlcnJJQUVuZE9mVGV4dFJ1bgorZXJySUFUZXh0RXh0cmFjdGlvbkVyciAgPSAgIC01Mzg3ICAgI2VycklBVGV4dEV4dHJhY3Rpb25FcnIKK2VycklBSW52YWxpZERvY3VtZW50ICAgID0gICAtNTM4NiAgICNlcnJJQUludmFsaWREb2N1bWVudAorZXJySUFDYW5jZWxlZCAgID0gICAtNTM4NSAgICNlcnJJQUNhbmNlbGVkCitlcnJJQUJ1ZmZlclRvb1NtYWxsID0gICAtNTM4NCAgICNlcnJJQUJ1ZmZlclRvb1NtYWxsCitlcnJJQU5vTW9yZUl0ZW1zICAgID0gICAtNTM4MyAgICNlcnJJQU5vTW9yZUl0ZW1zCitlcnJJQVBhcmFtRXJyICAgPSAgIC01MzgyICAgI2VycklBUGFyYW1FcnIKK2VycklBQWxsb2NhdGlvbkVyciAgPSAgIC01MzgxICAgI2VycklBQWxsb2NhdGlvbkVycgorZXJySUFVbmtub3duRXJyID0gICAtNTM4MCAgICNlcnJJQVVua25vd25FcnIKK2hyVVJMTm90SGFuZGxlZEVyciAgPSAgIC01MzYzICAgI2hyVVJMTm90SGFuZGxlZEVycgoraHJVbmFibGVUb1Jlc2l6ZUhhbmRsZUVyciAgID0gICAtNTM2MiAgICNoclVuYWJsZVRvUmVzaXplSGFuZGxlRXJyCitock1pc2NlbGxhbmVvdXNFeGNlcHRpb25FcnIgPSAgIC01MzYxICAgI2hyTWlzY2VsbGFuZW91c0V4Y2VwdGlvbkVycgoraHJIVE1MUmVuZGVyaW5nTGliTm90SW5zdGFsbGVkRXJyICAgPSAgIC01MzYwICAgI2hySFRNTFJlbmRlcmluZ0xpYk5vdEluc3RhbGxlZEVycgorZXJyQ2Fubm90VW5kbyAgID0gICAtNTI1MyAgICNlcnJDYW5ub3RVbmRvCitlcnJOb25Db250aXVvdXNBdHRyaWJ1dGUgICAgPSAgIC01MjUyICAgI2Vyck5vbkNvbnRpdW91c0F0dHJpYnV0ZQorZXJyVW5rbm93bkVsZW1lbnQgICA9ICAgLTUyNTEgICAjZXJyVW5rbm93bkVsZW1lbnQKK2VyclJlYWRPbmx5VGV4dCA9ICAgLTUyNTAgICAjZXJyUmVhZE9ubHlUZXh0CitlcnJFbXB0eVNjcmFwICAgPSAgIC01MjQ5ICAgI2VyckVtcHR5U2NyYXAKK2Vyck5vSGlsaXRlVGV4dCA9ICAgLTUyNDggICAjZXJyTm9IaWxpdGVUZXh0CitlcnJPZmZzZXROb3RPbkVsZW1lbnRCb3VuZGF5ICAgID0gICAtNTI0NyAgICNlcnJPZmZzZXROb3RPbkVsZW1lbnRCb3VuZGF5CitlcnJJbnZhbGlkUmFuZ2UgPSAgIC01MjQ2ICAgI2VyckludmFsaWRSYW5nZQorZXJySXRlcmF0b3JSZWFjaGVkRW5kICAgPSAgIC01MjQ1ICAgI2Vyckl0ZXJhdG9yUmVhY2hlZEVuZAorZXJyRW5naW5lTm90Rm91bmQgICA9ICAgLTUyNDQgICAjZXJyRW5naW5lTm90Rm91bmQKK2VyckFscmVhZHlJbkltYWdpbmdNb2RlID0gICAtNTI0MyAgICNlcnJBbHJlYWR5SW5JbWFnaW5nTW9kZQorZXJyTm90SW5JbWFnaW5nTW9kZSA9ICAgLTUyNDIgICAjZXJyTm90SW5JbWFnaW5nTW9kZQorZXJyTWFyZ2luV2lsbGxOb3RGaXQgICAgPSAgIC01MjQxICAgI2Vyck1hcmdpbldpbGxsTm90Rml0CitlcnJVbmtub3duQXR0cmlidXRlVGFnICA9ICAgLTUyNDAgICAjZXJyVW5rbm93bkF0dHJpYnV0ZVRhZworYWZwU2FtZU5vZGVFcnIgID0gICAtNTA2MyAgICNBbiBBdHRlbXB0IHdhcyBtYWRlIHRvIGNvbm5lY3QgdG8gYSBmaWxlIHNlcnZlciBydW5uaW5nIG9uIHRoZSBzYW1lIG1hY2hpbmUKK2FmcEFscmVhZHlNb3VudGVkICAgPSAgIC01MDYyICAgI1RoZSB2b2x1bWUgaXMgYWxyZWFkeSBtb3VudGVkCithZnBDYW50TW91bnRNb3JlU3J2cmUgICA9ICAgLTUwNjEgICAjVGhlIE1heGltdW0gbnVtYmVyIG9mIHNlcnZlciBjb25uZWN0aW9ucyBoYXMgYmVlbiByZWFjaGVkCithZnBCYWREaXJJRFR5cGUgPSAgIC01MDYwICAgI2FmcEJhZERpcklEVHlwZQorYWZwQ2FsbE5vdEFsbG93ZWQgICA9ICAgLTUwNDggICAjVGhlIHNlcnZlciBrbm93cyB3aGF0IHlvdSB3YW50ZWQgdG8gZG8sIGJ1dCB3b24ndCBsZXQgeW91IGRvIGl0IGp1c3Qgbm93CithZnBBbHJlYWR5TG9nZ2VkSW5FcnIgICA9ICAgLTUwNDcgICAjVXNlciBoYXMgYmVlbiBhdXRoZW50aWNhdGVkIGJ1dCBpcyBhbHJlYWR5IGxvZ2dlZCBpbiBmcm9tIGFub3RoZXIgbWFjaGluZSAoYW5kIHRoYXQncyBub3QgYWxsb3dlZCBvbiB0aGlzIHNlcnZlcikKK2FmcFB3ZFBvbGljeUVyciA9ICAgLTUwNDYgICAjUGFzc3dvcmQgZG9lcyBub3QgY29uZm9ybSB0byBzZXJ2ZXJzIHBhc3N3b3JkIHBvbGljeQorYWZwUHdkTmVlZHNDaGFuZ2VFcnIgICAgPSAgIC01MDQ1ICAgI1RoZSBwYXNzd29yZCBuZWVkcyB0byBiZSBjaGFuZ2VkCithZnBJbnNpZGVUcmFzaEVyciAgID0gICAtNTA0NCAgICNUaGUgZm9sZGVyIGJlaW5nIHNoYXJlZCBpcyBpbnNpZGUgdGhlIHRyYXNoIGZvbGRlciBPUiB0aGUgc2hhcmVkIGZvbGRlciBpcyBiZWluZyBtb3ZlZCBpbnRvIHRoZSB0cmFzaCBmb2xkZXIKK2FmcEluc2lkZVNoYXJlZEVyciAgPSAgIC01MDQzICAgI1RoZSBmb2xkZXIgYmVpbmcgc2hhcmVkIGlzIGluc2lkZSBhIHNoYXJlZCBmb2xkZXIgT1IgdGhlIGZvbGRlciBjb250YWlucyBhIHNoYXJlZCBmb2xkZXIgYW5kIGlzIGJlaW5nIG1vdmVkIGludG8gYSBzaGFyZWQgZm9sZGVyCithZnBQd2RFeHBpcmVkRXJyICAgID0gICAtNTA0MiAgICNUaGUgcGFzc3dvcmQgYmVpbmcgdXNlZCBpcyB0b28gb2xkOiB0aGlzIHJlcXVpcmVzIHRoZSB1c2VyIHRvIGNoYW5nZSB0aGUgcGFzc3dvcmQgYmVmb3JlIGxvZy1pbiBjYW4gY29udGludWUKK2FmcFB3ZFRvb1Nob3J0RXJyICAgPSAgIC01MDQxICAgI1RoZSBwYXNzd29yZCBiZWluZyBzZXQgaXMgdG9vIHNob3J0OiB0aGVyZSBpcyBhIG1pbmltdW0gbGVuZ3RoIHRoYXQgbXVzdCBiZSBtZXQgb3IgZXhjZWVkZWQKK2FmcFB3ZFNhbWVFcnIgICA9ICAgLTUwNDAgICAjU29tZW9uZSB0cmllZCB0byBjaGFuZ2UgdGhlaXIgcGFzc3dvcmQgdG8gdGhlIHNhbWUgcGFzc3dvcmQgb24gYSBtYW50YWRvcnkgcGFzc3dvcmQgY2hhbmdlCithZnBCYWRJREVyciA9ICAgLTUwMzkgICAjYWZwQmFkSURFcnIKK2FmcFNhbWVPYmplY3RFcnIgICAgPSAgIC01MDM4ICAgI2FmcFNhbWVPYmplY3RFcnIKK2FmcENhdGFsb2dDaGFuZ2VkICAgPSAgIC01MDM3ICAgI2FmcENhdGFsb2dDaGFuZ2VkCithZnBEaWZmVm9sRXJyICAgPSAgIC01MDM2ICAgI2FmcERpZmZWb2xFcnIKK2FmcElERXhpc3RzID0gICAtNTAzNSAgICNhZnBJREV4aXN0cworYWZwSUROb3RGb3VuZCAgID0gICAtNTAzNCAgICNhZnBJRE5vdEZvdW5kCithZnBDb250YWluc1NoYXJlZEVyciAgICA9ICAgLTUwMzMgICAjdGhlIGZvbGRlciBiZWluZyBzaGFyZWQgY29udGFpbnMgYSBzaGFyZWQgZm9sZGVyCithZnBPYmplY3RMb2NrZWQgPSAgIC01MDMyICAgI09iamVjdCBpcyBNL1IvRC9XIGluaGliaXRlZAorYWZwVm9sTG9ja2VkICAgID0gICAtNTAzMSAgICNWb2x1bWUgaXMgUmVhZC1Pbmx5CithZnBJY29uVHlwZUVycm9yICAgID0gICAtNTAzMCAgICNJY29uIHNpemUgc3BlY2lmaWVkIGRpZmZlcmVudCBmcm9tIGV4aXN0aW5nIGljb24gc2l6ZQorYWZwRGlyTm90Rm91bmQgID0gICAtNTAyOSAgICNVbmtub3duIGRpcmVjdG9yeSBzcGVjaWZpZWQKK2FmcENhbnRSZW5hbWUgICA9ICAgLTUwMjggICAjQUZQUmVuYW1lIGNhbm5vdCByZW5hbWUgdm9sdW1lCithZnBTZXJ2ZXJHb2luZ0Rvd24gID0gICAtNTAyNyAgICNTZXJ2ZXIgaXMgc2h1dHRpbmcgZG93bgorYWZwVG9vTWFueUZpbGVzT3BlbiA9ICAgLTUwMjYgICAjTWF4aW11bSBvcGVuIGZpbGUgY291bnQgcmVhY2hlZAorYWZwT2JqZWN0VHlwZUVyciAgICA9ICAgLTUwMjUgICAjRmlsZS9EaXJlY3Rvcnkgc3BlY2lmaWVkIHdoZXJlIERpcmVjdG9yeS9GaWxlIGV4cGVjdGVkCithZnBDYWxsTm90U3VwcG9ydGVkID0gICAtNTAyNCAgICNVbnN1cHBvcnRlZCBBRlAgY2FsbCB3YXMgbWFkZQorYWZwVXNlck5vdEF1dGggID0gICAtNTAyMyAgICNObyBBRlBMb2dpbiBjYWxsIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYWRlIGZvciB0aGlzIHNlc3Npb24KK2FmcFNlc3NDbG9zZWQgICA9ICAgLTUwMjIgICAjU2Vzc2lvbiBjbG9zZWQKK2FmcFJhbmdlT3ZlcmxhcCA9ICAgLTUwMjEgICAjU29tZSBvciBhbGwgb2YgcmFuZ2UgYWxyZWFkeSBsb2NrZWQgYnkgc2FtZSB1c2VyCithZnBSYW5nZU5vdExvY2tlZCAgID0gICAtNTAyMCAgICNUcmllZCB0byB1bmxvY2sgcmFuZ2UgdGhhdCB3YXMgbm90IGxvY2tlZCBieSB1c2VyCithZnBQYXJtRXJyICA9ICAgLTUwMTkgICAjQSBzcGVjaWZpZWQgcGFyYW1ldGVyIHdhcyBvdXQgb2YgYWxsb3dhYmxlIHJhbmdlCithZnBPYmplY3ROb3RGb3VuZCAgID0gICAtNTAxOCAgICNTcGVjaWZpZWQgZmlsZSBvciBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QKK2FmcE9iamVjdEV4aXN0cyA9ICAgLTUwMTcgICAjU3BlY2lmaWVkIGRlc3RpbmF0aW9uIGZpbGUgb3IgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzCithZnBOb1NlcnZlciA9ICAgLTUwMTYgICAjU2VydmVyIG5vdCByZXNwb25kaW5nCithZnBOb01vcmVMb2NrcyAgPSAgIC01MDE1ICAgI01heGltdW0gbG9jayBsaW1pdCByZWFjaGVkCithZnBNaXNjRXJyICA9ICAgLTUwMTQgICAjVW5leHBlY3RlZCBlcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgZXhlY3V0aW9uCithZnBMb2NrRXJyICA9ICAgLTUwMTMgICAjU29tZSBvciBhbGwgb2YgcmVxdWVzdGVkIHJhbmdlIGlzIGxvY2tlZCBieSBhbm90aGVyIHVzZXIKK2FmcEl0ZW1Ob3RGb3VuZCA9ICAgLTUwMTIgICAjVW5rbm93biBVc2VyTmFtZS9Vc2VySUQgb3IgbWlzc2luZyBjb21tZW50L0FQUEwgZW50cnkKK2FmcEZsYXRWb2wgID0gICAtNTAxMSAgICNDYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBvbiBzcGVjaWZpZWQgdm9sdW1lCithZnBGaWxlQnVzeSA9ICAgLTUwMTAgICAjQ2Fubm90IGRlbGV0ZSBhbiBvcGVuIGZpbGUKK2FmcEVvZkVycm9yID0gICAtNTAwOSAgICNSZWFkIGJleW9uZCBsb2dpY2FsIGVuZC1vZi1maWxlCithZnBEaXNrRnVsbCA9ICAgLTUwMDggICAjSW5zdWZmaWNpZW50IGZyZWUgc3BhY2Ugb24gdm9sdW1lIGZvciBvcGVyYXRpb24KK2FmcERpck5vdEVtcHR5ICA9ICAgLTUwMDcgICAjQ2Fubm90IGRlbGV0ZSBub24tZW1wdHkgZGlyZWN0b3J5CithZnBEZW55Q29uZmxpY3QgPSAgIC01MDA2ICAgI1NwZWNpZmllZCBvcGVuL2RlbnkgbW9kZXMgY29uZmxpY3Qgd2l0aCBjdXJyZW50IG9wZW4gbW9kZXMKK2FmcENhbnRNb3ZlID0gICAtNTAwNSAgICNNb3ZlIGRlc3RpbmF0aW9uIGlzIG9mZnNwcmluZyBvZiBzb3VyY2UsIG9yIHJvb3Qgd2FzIHNwZWNpZmllZAorYWZwQml0bWFwRXJyICAgID0gICAtNTAwNCAgICNCaXRtYXAgY29udGFpbmVkIGJpdHMgdW5kZWZpbmVkIGZvciBjYWxsCithZnBCYWRWZXJzTnVtICAgPSAgIC01MDAzICAgI1Vua25vd24gQUZQIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIHNwZWNpZmllZAorYWZwQmFkVUFNICAgPSAgIC01MDAyICAgI1Vua25vd24gdXNlciBhdXRoZW50aWNhdGlvbiBtZXRob2Qgc3BlY2lmaWVkCithZnBBdXRoQ29udGludWUgPSAgIC01MDAxICAgI0Z1cnRoZXIgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gY29tcGxldGUgQUZQTG9naW4gY2FsbAorYWZwQWNjZXNzRGVuaWVkID0gICAtNTAwMCAgICNJbnN1ZmZpY2llbnQgYWNjZXNzIHByaXZpbGVnZXMgZm9yIG9wZXJhdGlvbgoraWxsZWdhbFNjcmFwRmxhdm9yU2l6ZUVyciAgID0gICAtNDk5OSAgICNpbGxlZ2FsU2NyYXBGbGF2b3JTaXplRXJyCitpbGxlZ2FsU2NyYXBGbGF2b3JUeXBlRXJyICAgPSAgIC00OTk4ICAgI2lsbGVnYWxTY3JhcEZsYXZvclR5cGVFcnIKK2lsbGVnYWxTY3JhcEZsYXZvckZsYWdzRXJyICA9ICAgLTQ5OTcgICAjaWxsZWdhbFNjcmFwRmxhdm9yRmxhZ3NFcnIKK3NjcmFwRmxhdm9yU2l6ZU1pc21hdGNoRXJyICA9ICAgLTQ5OTYgICAjc2NyYXBGbGF2b3JTaXplTWlzbWF0Y2hFcnIKK3NjcmFwRmxhdm9yRmxhZ3NNaXNtYXRjaEVyciA9ICAgLTQ5OTUgICAjc2NyYXBGbGF2b3JGbGFnc01pc21hdGNoRXJyCituaWxTY3JhcEZsYXZvckRhdGFFcnIgICA9ICAgLTQ5OTQgICAjbmlsU2NyYXBGbGF2b3JEYXRhRXJyCitub1NjcmFwUHJvbWlzZUtlZXBlckVyciA9ICAgLTQ5OTMgICAjbm9TY3JhcFByb21pc2VLZWVwZXJFcnIKK3NjcmFwUHJvbWlzZU5vdEtlcHRFcnIgID0gICAtNDk5MiAgICNzY3JhcFByb21pc2VOb3RLZXB0RXJyCitwcm9jZXNzU3RhdGVJbmNvcnJlY3RFcnIgICAgPSAgIC00OTkxICAgI3Byb2Nlc3NTdGF0ZUluY29ycmVjdEVycgorYmFkU2NyYXBSZWZFcnIgID0gICAtNDk5MCAgICNiYWRTY3JhcFJlZkVycgorZHVwbGljYXRlU2NyYXBGbGF2b3JFcnIgPSAgIC00OTg5ICAgI2R1cGxpY2F0ZVNjcmFwRmxhdm9yRXJyCitpbnRlcm5hbFNjcmFwRXJyICAgID0gICAtNDk4OCAgICNpbnRlcm5hbFNjcmFwRXJyCitjb3JlRm91bmRhdGlvblVua25vd25FcnIgICAgPSAgIC00OTYwICAgI2NvcmVGb3VuZGF0aW9uVW5rbm93bkVycgorYmFkUm91dGluZ1NpemVFcnIgICA9ICAgLTQyNzYgICAjYmFkUm91dGluZ1NpemVFcnIKK3JvdXRpbmdOb3RGb3VuZEVyciAgPSAgIC00Mjc1ICAgI3JvdXRpbmdOb3RGb3VuZEVycgorZHVwbGljYXRlUm91dGluZ0VyciA9ICAgLTQyNzQgICAjZHVwbGljYXRlUm91dGluZ0VycgoraW52YWxpZEZvbGRlclR5cGVFcnIgICAgPSAgIC00MjczICAgI2ludmFsaWRGb2xkZXJUeXBlRXJyCitub01vcmVGb2xkZXJEZXNjRXJyID0gICAtNDI3MiAgICNub01vcmVGb2xkZXJEZXNjRXJyCitkdXBsaWNhdGVGb2xkZXJEZXNjRXJyICA9ICAgLTQyNzEgICAjZHVwbGljYXRlRm9sZGVyRGVzY0VycgorYmFkRm9sZGVyRGVzY0VyciAgICA9ICAgLTQyNzAgICAjYmFkRm9sZGVyRGVzY0VycgorY21DYW50R2FtdXRDaGVja0Vycm9yICAgPSAgIC00MjE3ICAgI0dhbW11dCBjaGVja2luZyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgQ29sb3JXb3JsZAorY21OYW1lZENvbG9yTm90Rm91bmQgICAgPSAgIC00MjE2ICAgI05hbWVkQ29sb3Igbm90IGZvdW5kCitjbUNhbnRDb3B5TW9kaWZpZWRWMVByb2ZpbGUgPSAgIC00MjE1ICAgI0lsbGVnYWwgdG8gY29weSB2ZXJzaW9uIDEgcHJvZmlsZXMgdGhhdCBoYXZlIGJlZW4gbW9kaWZpZWQKK2NtUmFuZ2VPdmVyRmxvdyA9ICAgLTQyMTQgICAjQ29sb3IgY29udmVyc2lvbiB3YXJuaW5nIHRoYXQgc29tZSBvdXRwdXQgY29sb3IgdmFsdWVzIG92ZXIvdW5kZXJmbG93ZWQgYW5kIHdlcmUgY2xpcHBlZAorY21JbnZhbGlkUHJvZmlsZUNvbW1lbnQgPSAgIC00MjEzICAgI0JhZCBQcm9maWxlIGNvbW1lbnQgZHVyaW5nIGRyYXdwaWN0dXJlCitjbU5vR0RldmljZXNFcnJvciAgID0gICAtNDIxMiAgICNCZWdpbi9FbmQgTWF0Y2hpbmcgLS0gbm8gZ2RldmljZXMgYXZhaWxhYmxlCitjbUludmFsaWREc3RNYXAgPSAgIC00MjExICAgI0Rlc3RpbmF0aW9uIHBpeC9iaXQgbWFwIHdhcyBpbnZhbGlkCitjbUludmFsaWRTcmNNYXAgPSAgIC00MjEwICAgI1NvdXJjZSBwaXgvYml0IG1hcCB3YXMgaW52YWxpZAorY21JbnZhbGlkQ29sb3JTcGFjZSA9ICAgLTQyMDkgICAjUHJvZmlsZSBjb2xvcnNwYWNlIGRvZXMgbm90IG1hdGNoIGJpdG1hcCB0eXBlCitjbUVyckluY29tcGF0aWJsZVByb2ZpbGUgICAgPSAgIC00MjA4ICAgI090aGVyIENvbG9yU3luYyBFcnJvcnMKK2NtU2VhcmNoRXJyb3IgICA9ICAgLTQyMDcgICAjY21TZWFyY2hFcnJvcgorY21JbnZhbGlkU2VhcmNoID0gICAtNDIwNiAgICNCYWQgU2VhcmNoIEhhbmRsZQorY21JbnZhbGlkUHJvZmlsZUxvY2F0aW9uICAgID0gICAtNDIwNSAgICNPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBwcm9maWxlIGxvY2F0aW9uCitjbUludmFsaWRQcm9maWxlICAgID0gICAtNDIwNCAgICNBIFByb2ZpbGUgbXVzdCBjb250YWluIGEgJ2NzMSAnIHRhZyB0byBiZSB2YWxpZAorY21GYXRhbFByb2ZpbGVFcnIgICA9ICAgLTQyMDMgICAjY21GYXRhbFByb2ZpbGVFcnIKK2NtQ2FudERlbGV0ZUVsZW1lbnQgPSAgIC00MjAyICAgI2NtQ2FudERlbGV0ZUVsZW1lbnQKK2NtSW5kZXhSYW5nZUVyciA9ICAgLTQyMDEgICAjVGFnIGluZGV4IG91dCBvZiByYW5nZQora05TTEluaXRpYWxpemF0aW9uRmFpbGVkICAgID0gICAtNDIwMCAgICNVTkFCTEUgVE8gSU5JVElBTElaRSBUSEUgTUFOQUdFUiEhISEhIERPIE5PVCBDT05USU5VRSEhISEKK2tOU0xOb3RJbml0aWFsaXplZCAgPSAgIC00MTk5ICAgI2tOU0xOb3RJbml0aWFsaXplZAora05TTEluc3VmZmljaWVudFN5c1ZlciAgPSAgIC00MTk4ICAgI2tOU0xJbnN1ZmZpY2llbnRTeXNWZXIKK2tOU0xJbnN1ZmZpY2llbnRPVFZlciAgID0gICAtNDE5NyAgICNrTlNMSW5zdWZmaWNpZW50T1RWZXIKK2tOU0xOb0VsZW1lbnRzSW5MaXN0ICAgID0gICAtNDE5NiAgICNrTlNMTm9FbGVtZW50c0luTGlzdAora05TTEJhZFJlZmVyZW5jZUVyciA9ICAgLTQxOTUgICAja05TTEJhZFJlZmVyZW5jZUVycgora05TTEJhZFNlcnZpY2VUeXBlRXJyICAgPSAgIC00MTk0ICAgI2tOU0xCYWRTZXJ2aWNlVHlwZUVycgora05TTEJhZERhdGFUeXBlRXJyICA9ICAgLTQxOTMgICAja05TTEJhZERhdGFUeXBlRXJyCitrTlNMQmFkTmV0Q29ubmVjdGlvbiAgICA9ICAgLTQxOTIgICAja05TTEJhZE5ldENvbm5lY3Rpb24KK2tOU0xOb1N1cHBvcnRGb3JTZXJ2aWNlID0gICAtNDE5MSAgICNrTlNMTm9TdXBwb3J0Rm9yU2VydmljZQora05TTEludmFsaWRQbHVnaW5TcGVjICAgPSAgIC00MTkwICAgI2tOU0xJbnZhbGlkUGx1Z2luU3BlYwora05TTFJlcXVlc3RCdWZmZXJBbHJlYWR5SW5MaXN0ICA9ICAgLTQxODkgICAja05TTFJlcXVlc3RCdWZmZXJBbHJlYWR5SW5MaXN0CitrTlNMTm9Db250ZXh0QXZhaWxhYmxlICA9ICAgLTQxODggICAjKENvbnRpbnVlTG9va3VwIGZ1bmN0aW9uIHB0ciBpbnZhbGlkKQora05TTEJ1ZmZlclRvb1NtYWxsRm9yRGF0YSAgID0gICAtNDE4NyAgICMoQ2xpZW50IGJ1ZmZlciB0b28gc21hbGwgZm9yIGRhdGEgZnJvbSBwbHVnaW4pCitrTlNMQ2Fubm90Q29udGludWVMb29rdXAgICAgPSAgIC00MTg2ICAgIyhDYW4ndCBjb250aW51ZSBsb29rdXA7IGVycm9yIG9yIGJhZCBzdGF0ZSkKK2tOU0xCYWRDbGllbnRJbmZvUHRyICAgID0gICAtNDE4NSAgICMobmlsIENsaWVudEFzeW5jSW5mb1B0cjsgbm8gcmVmZXJlbmNlIGF2YWlsYWJsZSkKK2tOU0xOdWxsTGlzdFB0ciA9ICAgLTQxODQgICAjKGNsaWVudCBpcyB0cnlpbmcgdG8gYWRkIGl0ZW1zIHRvIGEgbmlsIGxpc3QpCitrTlNMQmFkUHJvdG9jb2xUeXBlRXJyICA9ICAgLTQxODMgICAjKGNsaWVudCBpcyB0cnlpbmcgdG8gYWRkIGEgbnVsbCBwcm90b2NvbCB0eXBlKQora05TTFBsdWdpbkxvYWRGYWlsZWQgICAgPSAgIC00MTgyICAgIyhtYW5hZ2VyIHVuYWJsZSB0byBsb2FkIG9uZSBvZiB0aGUgcGx1Z2lucykKK2tOU0xOb1BsdWdpbnNGb3VuZCAgPSAgIC00MTgxICAgIyhtYW5hZ2VyIGRpZG4ndCBmaW5kIGFueSB2YWxpZCBwbHVnaW5zIHRvIGxvYWQpCitrTlNMU2VhcmNoQWxyZWFkeUluUHJvZ3Jlc3MgPSAgIC00MTgwICAgIyh5b3UgY2FuIG9ubHkgaGF2ZSBvbmUgb25nb2luZyBzZWFyY2ggcGVyIGNsaWVudFJlZikKK2tOU0xOb1BsdWdpbnNGb3JTZWFyY2ggID0gICAtNDE3OSAgICMobm8gcGx1Z2lucyB3aWxsIHJlc3BvbmQgdG8gc2VhcmNoIHJlcXVlc3Q7IGJhZCBwcm90b2NvbChzKT8pCitrTlNMTnVsbE5laWdoYm9yaG9vZFB0ciA9ICAgLTQxNzggICAjKGNsaWVudCBwYXNzZWQgYSBudWxsIG5laWdoYm9yaG9vZCBwdHIpCitrTlNMU29tZVBsdWdpbnNGYWlsZWRUb0xvYWQgPSAgIC00MTc3ICAgIyhvbmUgb3IgbW9yZSBwbHVnaW5zIGZhaWxlZCB0byBsb2FkLCBidXQgYXQgbGVhc3Qgb25lIGRpZCBsb2FkOyB0aGlzIGVycm9yIGlzbid0IGZhdGFsKQora05TTEVyck51bGxQdHJFcnJvciA9ICAgLTQxNzYgICAja05TTEVyck51bGxQdHJFcnJvcgora05TTE5vdEltcGxlbWVudGVkWWV0ICAgPSAgIC00MTc1ICAgI2tOU0xOb3RJbXBsZW1lbnRlZFlldAora05TTFVJTGlicmFyeU5vdEF2YWlsYWJsZSAgID0gICAtNDE3NCAgICNUaGUgTlNMIFVJIExpYnJhcnkgbmVlZHMgdG8gYmUgaW4gdGhlIEV4dGVuc2lvbnMgRm9sZGVyCitrTlNMTm9DYXJib25MaWIgPSAgIC00MTczICAgI2tOU0xOb0NhcmJvbkxpYgora05TTEJhZFVSTFN5bnRheCAgICA9ICAgLTQxNzIgICAjVVJMIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycwora05TTFNjaGVkdWxlckVycm9yICA9ICAgLTQxNzEgICAjQSBjdXN0b20gdGhyZWFkIHJvdXRpbmUgZW5jb3VudGVyZWQgYW4gZXJyb3IKK2tOU0w2OGtDb250ZXh0Tm90U3VwcG9ydGVkICA9ICAgLTQxNzAgICAjbm8gNjhrIGFsbG93ZWQKK25vSGVscEZvckl0ZW0gICA9ICAgLTQwMDkgICAjbm9IZWxwRm9ySXRlbQorYmFkUHJvZmlsZUVycm9yID0gICAtNDAwOCAgICNiYWRQcm9maWxlRXJyb3IKK2NvbG9yU3luY05vdEluc3RhbGxlZCAgID0gICAtNDAwNyAgICNjb2xvclN5bmNOb3RJbnN0YWxsZWQKK3BpY2tlckNhbnRMaXZlICA9ICAgLTQwMDYgICAjcGlja2VyQ2FudExpdmUKK2NhbnRMb2FkUGFja2FnZSA9ICAgLTQwMDUgICAjY2FudExvYWRQYWNrYWdlCitjYW50Q3JlYXRlUGlja2VyV2luZG93ICA9ICAgLTQwMDQgICAjY2FudENyZWF0ZVBpY2tlcldpbmRvdworY2FudExvYWRQaWNrZXIgID0gICAtNDAwMyAgICNjYW50TG9hZFBpY2tlcgorcGlja2VyUmVzb3VyY2VFcnJvciA9ICAgLTQwMDIgICAjcGlja2VyUmVzb3VyY2VFcnJvcgorcmVxdWlyZWRGbGFnc0RvbnRNYXRjaCAgPSAgIC00MDAxICAgI3JlcXVpcmVkRmxhZ3NEb250TWF0Y2gKK2ZpcnN0UGlja2VyRXJyb3IgICAgPSAgIC00MDAwICAgI2ZpcnN0UGlja2VyRXJyb3IKK2tPVFBvcnRMb3N0Q29ubmVjdGlvbiAgID0gICAtMzI4NSAgICMKK2tPVFVzZXJSZXF1ZXN0ZWRFcnIgPSAgIC0zMjg0ICAgIwora09UQ29uZmlndXJhdGlvbkNoYW5nZWRFcnIgID0gICAtMzI4MyAgICMKK2tPVEJhZENvbmZpZ3VyYXRpb25FcnIgID0gICAtMzI4MiAgICMKK2tPVFBvcnRXYXNFamVjdGVkRXJyICAgID0gICAtMzI4MSAgICMKK2tPVFBvcnRIYXNEaWVkRXJyICAgPSAgIC0zMjgwICAgIwora09UQ2xpZW50Tm90SW5pdHRlZEVyciAgPSAgIC0zMjc5ICAgIwora0VOT01TR0VyciAgPSAgIC0zMjc4ICAgIwora0VTUkNIRXJyICAgPSAgIC0zMjc3ICAgIwora0VJTlBST0dSRVNTRXJyID0gICAtMzI3NiAgICMKK2tFTk9EQVRBRXJyID0gICAtMzI3NSAgICMKK2tFTk9TVFJFcnIgID0gICAtMzI3NCAgICMKK2tFQ0FOQ0VMRXJyID0gICAtMzI3MyAgICMKK2tFQkFETVNHRXJyID0gICAtMzI3MiAgICMKK2tFTk9TUkVyciAgID0gICAtMzI3MSAgICMKK2tFVElNRUVyciAgID0gICAtMzI3MCAgICMKK2tFUFJPVE9FcnIgID0gICAtMzI2OSAgICOCgoIgZmlsbCBvdXQgbWlzc2luZyBjb2RlcyCCgoIKK2tFSE9TVFVOUkVBQ0hFcnIgICAgPSAgIC0zMjY0ICAgI05vIHJvdXRlIHRvIGhvc3QKK2tFSE9TVERPV05FcnIgICA9ICAgLTMyNjMgICAjSG9zdCBpcyBkb3duCitrRUNPTk5SRUZVU0VERXJyICAgID0gICAtMzI2MCAgICNDb25uZWN0aW9uIHJlZnVzZWQKK2tFVElNRURPVVRFcnIgICA9ICAgLTMyNTkgICAjQ29ubmVjdGlvbiB0aW1lZCBvdXQKK2tFVE9PTUFOWVJFRlNFcnIgICAgPSAgIC0zMjU4ICAgI1RvbyBtYW55IHJlZmVyZW5jZXM6IGNhbid0IHNwbGljZQora0VTSFVURE9XTkVyciAgID0gICAtMzI1NyAgICNDYW4ndCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgora0VOT1RDT05ORXJyICAgID0gICAtMzI1NiAgICNTb2NrZXQgaXMgbm90IGNvbm5lY3RlZAora0VJU0NPTk5FcnIgPSAgIC0zMjU1ICAgI1NvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZAora0VOT0JVRlNFcnIgPSAgIC0zMjU0ICAgI05vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUKK2tFQ09OTlJFU0VURXJyICA9ICAgLTMyNTMgICAjQ29ubmVjdGlvbiByZXNldCBieSBwZWVyCitrRUNPTk5BQk9SVEVERXJyICAgID0gICAtMzI1MiAgICNTb2Z0d2FyZSBjYXVzZWQgY29ubmVjdGlvbiBhYm9ydAora0VORVRSRVNFVEVyciAgID0gICAtMzI1MSAgICNOZXR3b3JrIGRyb3BwZWQgY29ubmVjdGlvbiBvbiByZXNldAora0VORVRVTlJFQUNIRXJyID0gICAtMzI1MCAgICNOZXR3b3JrIGlzIHVucmVhY2hhYmxlCitrRU5FVERPV05FcnIgICAgPSAgIC0zMjQ5ICAgI05ldHdvcmsgaXMgZG93bgora0VBRERSTk9UQVZBSUxFcnIgICA9ICAgLTMyNDggICAjQ2FuJ3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzCitrRUFERFJJTlVTRUVyciAgPSAgIC0zMjQ3ICAgI0FkZHJlc3MgYWxyZWFkeSBpbiB1c2UKK2tFT1BOT1RTVVBQRXJyICA9ICAgLTMyNDQgICAjT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgb24gc29ja2V0CitrRVNPQ0tUTk9TVVBQT1JURXJyID0gICAtMzI0MyAgICNTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkCitrRVBST1RPTk9TVVBQT1JURXJyID0gICAtMzI0MiAgICNQcm90b2NvbCBub3Qgc3VwcG9ydGVkCitrRU5PUFJPVE9PUFRFcnIgPSAgIC0zMjQxICAgI1Byb3RvY29sIG5vdCBhdmFpbGFibGUKK2tFUFJPVE9UWVBFRXJyICA9ICAgLTMyNDAgICAjUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0CitrRU1TR1NJWkVFcnIgICAgPSAgIC0zMjM5ICAgI01lc3NhZ2UgdG9vIGxvbmcKK2tFREVTVEFERFJSRVFFcnIgICAgPSAgIC0zMjM4ICAgI0Rlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQKK2tFTk9UU09DS0VyciAgICA9ICAgLTMyMzcgICAjU29ja2V0IG9wZXJhdGlvbiBvbiBub24tc29ja2V0CitrRUFMUkVBRFlFcnIgICAgPSAgIC0zMjM2ICAgIwora0VXT1VMREJMT0NLRXJyID0gICAtMzIzNCAgICNDYWxsIHdvdWxkIGJsb2NrLCBzbyB3YXMgYWJvcnRlZAora0VSQU5HRUVyciAgPSAgIC0zMjMzICAgI01lc3NhZ2Ugc2l6ZSB0b28gbGFyZ2UgZm9yIFNUUkVBTQora0VQSVBFRXJyICAgPSAgIC0zMjMxICAgI0Jyb2tlbiBwaXBlCitrRU5PVFRZRXJyICA9ICAgLTMyMjQgICAjTm90IGEgY2hhcmFjdGVyIGRldmljZQora0VJTlZBTEVyciAgPSAgIC0zMjIxICAgI0ludmFsaWQgYXJndW1lbnQKK2tFTk9ERVZFcnIgID0gICAtMzIxOCAgICNObyBzdWNoIGRldmljZQora09URHVwbGljYXRlRm91bmRFcnIgICAgPSAgIC0zMjE2ICAgI09UIGdlbmVyaWMgZHVwbGljYXRlIGZvdW5kIGVycm9yCitrRUJVU1lFcnIgICA9ICAgLTMyMTUgICAjRGV2aWNlIG9yIHJlc291cmNlIGJ1c3kKK2tFRkFVTFRFcnIgID0gICAtMzIxMyAgICNCYWQgYWRkcmVzcwora0VBQ0NFU0VyciAgPSAgIC0zMjEyICAgI1Blcm1pc3Npb24gZGVuaWVkCitrT1RPdXRPZk1lbW9yeUVyciAgID0gICAtMzIxMSAgICNPVCByYW4gb3V0IG9mIG1lbW9yeSwgbWF5IGJlIGEgdGVtcG9yYXJ5CitrRUFHQUlORXJyICA9ICAgLTMyMTAgICAjVHJ5IG9wZXJhdGlvbiBhZ2FpbiBsYXRlcgora0VCQURGRXJyICAgPSAgIC0zMjA4ICAgI0JhZCBmaWxlIG51bWJlcgora0VOWElPRXJyICAgPSAgIC0zMjA1ICAgI05vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MKK2tFSU9FcnIgPSAgIC0zMjA0ICAgI0kvTyBlcnJvcgora0VJTlRSRXJyICAgPSAgIC0zMjAzICAgI0ludGVycnVwdGVkIHN5c3RlbSBzZXJ2aWNlCitrRU5PUlNSQ0VyciA9ICAgLTMyMDIgICAjTm8gc3VjaCByZXNvdXJjZQora09UTm90Rm91bmRFcnIgID0gICAtMzIwMSAgICNPVCBnZW5lcmljIG5vdCBmb3VuZCBlcnJvcgora0VQRVJNRXJyICAgPSAgIC0zMjAwICAgI1Blcm1pc3Npb24gZGVuaWVkCitrT1RDYW5jZWxlZEVyciAgPSAgIC0zMTgwICAgI1hUSTJPU1N0YXR1cyhUQ0FOQ0VMRUQpIFRoZSBjb21tYW5kIHdhcyBjYW5jZWxsZWQKK2tPVEJhZFN5bmNFcnIgICA9ICAgLTMxNzkgICAjWFRJMk9TU3RhdHVzKFRCQURTWU5DKSBBIHN5bmNocm9ub3VzIGNhbGwgYXQgaW50ZXJydXB0IHRpbWUKK2tPVFByb3RvY29sRXJyICA9ICAgLTMxNzggICAjWFRJMk9TU3RhdHVzKFRQUk9UTykgQW4gdW5zcGVjaWZpZWQgcHJvdmlkZXIgZXJyb3Igb2NjdXJyZWQKK2tPVFFGdWxsRXJyID0gICAtMzE3NyAgICNYVEkyT1NTdGF0dXMoVFFGVUxMKQora09UUmVzQWRkcmVzc0VyciAgICA9ICAgLTMxNzYgICAjWFRJMk9TU3RhdHVzKFRSRVNBRERSKQora09UUmVzUUxlbkVyciAgID0gICAtMzE3NSAgICNYVEkyT1NTdGF0dXMoVFJFU1FMRU4pCitrT1RQcm92aWRlck1pc21hdGNoRXJyICA9ICAgLTMxNzQgICAjWFRJMk9TU3RhdHVzKFRQUk9WTUlTTUFUQ0gpIFRyaWVkIHRvIGFjY2VwdCBvbiBpbmNvbXBhdGlibGUgZW5kcG9pbnQKK2tPVEluZE91dEVyciAgICA9ICAgLTMxNzMgICAjWFRJMk9TU3RhdHVzKFRJTkRPVVQpIEFjY2VwdCBmYWlsZWQgYmVjYXVzZSBvZiBwZW5kaW5nIGxpc3Rlbgora09UQWRkcmVzc0J1c3lFcnIgICA9ICAgLTMxNzIgICAjWFRJMk9TU3RhdHVzKFRBRERSQlVTWSkgQWRkcmVzcyByZXF1ZXN0ZWQgaXMgYWxyZWFkeSBpbiB1c2UKK2tPVEJhZFFMZW5FcnIgICA9ICAgLTMxNzEgICAjWFRJMk9TU3RhdHVzKFRCQURRTEVOKSBBIEJpbmQgdG8gYW4gaW4tdXNlIGFkZHIgd2l0aCBxbGVuID4gMAora09UQmFkTmFtZUVyciAgID0gICAtMzE3MCAgICNYVEkyT1NTdGF0dXMoVEJBRE5BTUUpIEEgYmFkIGVuZHBvaW50IG5hbWUgd2FzIHN1cHBsaWVkCitrT1ROb1N0cnVjdHVyZVR5cGVFcnIgICA9ICAgLTMxNjkgICAjWFRJMk9TU3RhdHVzKFROT1NUUlVDVFlQRSkgQmFkIHN0cnVjdHVyZSB0eXBlIHJlcXVlc3RlZCBmb3IgT1RBbGxvYwora09UU3RhdGVDaGFuZ2VFcnIgICA9ICAgLTMxNjggICAjWFRJMk9TU3RhdHVzKFRTVEFURUNITkcpIFN0YXRlIGlzIGNoYW5naW5nIC0gdHJ5IGFnYWluIGxhdGVyCitrT1ROb3RTdXBwb3J0ZWRFcnIgID0gICAtMzE2NyAgICNYVEkyT1NTdGF0dXMoVE5PVFNVUFBPUlQpIENvbW1hbmQgaXMgbm90IHN1cHBvcnRlZAora09UTm9SZWxlYXNlRXJyID0gICAtMzE2NiAgICNYVEkyT1NTdGF0dXMoVE5PUkVMKSBObyBvcmRlcmx5IHJlbGVhc2UgaW5kaWNhdGlvbiBhdmFpbGFibGUKK2tPVEJhZEZsYWdFcnIgICA9ICAgLTMxNjUgICAjWFRJMk9TU3RhdHVzKFRCQURGTEFHKSBBIEJhZCBmbGFnIHZhbHVlIHdhcyBzdXBwbGllZAora09UTm9VREVyckVyciAgID0gICAtMzE2NCAgICNYVEkyT1NTdGF0dXMoVE5PVURFUlIpIE5vIFVuaXQgRGF0YSBFcnJvciBpbmRpY2F0aW9uIGF2YWlsYWJsZQora09UTm9EaXNjb25uZWN0RXJyICA9ICAgLTMxNjMgICAjWFRJMk9TU3RhdHVzKFROT0RJUykgTm8gZGlzY29ubmVjdCBpbmRpY2F0aW9uIGF2YWlsYWJsZQora09UTm9EYXRhRXJyICAgID0gICAtMzE2MiAgICNYVEkyT1NTdGF0dXMoVE5PREFUQSkgTm8gZGF0YSBhdmFpbGFibGUgZm9yIHJlYWRpbmcKK2tPVEZsb3dFcnIgID0gICAtMzE2MSAgICNYVEkyT1NTdGF0dXMoVEZMT1cpIFByb3ZpZGVyIGlzIGZsb3ctY29udHJvbGxlZAora09UQnVmZmVyT3ZlcmZsb3dFcnIgICAgPSAgIC0zMTYwICAgI1hUSTJPU1N0YXR1cyhUQlVGT1ZGTFcpIFBhc3NlZCBidWZmZXIgbm90IGJpZyBlbm91Z2gKK2tPVEJhZERhdGFFcnIgICA9ICAgLTMxNTkgICAjWFRJMk9TU3RhdHVzKFRCQUREQVRBKSBBbiBpbGxlZ2FsIGFtb3VudCBvZiBkYXRhIHdhcyBzcGVjaWZpZWQKK2tPVExvb2tFcnIgID0gICAtMzE1OCAgICNYVEkyT1NTdGF0dXMoVExPT0spIEFuIGV2ZW50IG9jY3VycmVkIC0gY2FsbCBMb29rKCkKK2tPVFN5c0Vycm9yRXJyICA9ICAgLTMxNTcgICAjWFRJMk9TU3RhdHVzKFRTWVNFUlIpIEEgc3lzdGVtIGVycm9yIG9jY3VycmVkCitrT1RCYWRTZXF1ZW5jZUVyciAgID0gICAtMzE1NiAgICNYVEkyT1NTdGF0dXMoVEJBRFNFUSkgU2VxdWVuY2Ugc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0CitrT1RPdXRTdGF0ZUVyciAgPSAgIC0zMTU1ICAgI1hUSTJPU1N0YXR1cyhUT1VUU1RBVEUpIENhbGwgaXNzdWVkIGluIHdyb25nIHN0YXRlCitrT1ROb0FkZHJlc3NFcnIgPSAgIC0zMTU0ICAgI1hUSTJPU1N0YXR1cyhUTk9BRERSKSBObyBhZGRyZXNzIHdhcyBzcGVjaWZpZWQKK2tPVEJhZFJlZmVyZW5jZUVyciAgPSAgIC0zMTUzICAgI1hUSTJPU1N0YXR1cyhUQkFERikgQmFkIHByb3ZpZGVyIHJlZmVyZW5jZQora09UQWNjZXNzRXJyICAgID0gICAtMzE1MiAgICNYVEkyT1NTdGF0dXMoVEFDQ0VTKSBNaXNzaW5nIGFjY2VzcyBwZXJtaXNzaW9uCitrT1RCYWRPcHRpb25FcnIgPSAgIC0zMTUxICAgI1hUSTJPU1N0YXR1cyhUQkFET1BUKSBBIEJhZCBvcHRpb24gd2FzIHNwZWNpZmllZAora09UQmFkQWRkcmVzc0VyciAgICA9ICAgLTMxNTAgICAjWFRJMk9TU3RhdHVzKFRCQURBRERSKSBBIEJhZCBhZGRyZXNzIHdhcyBzcGVjaWZpZWQKK3NrdENsb3NlZEVyciAgICA9ICAgLTMxMDkgICAjc2t0Q2xvc2VkRXJyCityZWNOb3RGbmQgICA9ICAgLTMxMDggICAjcmVjTm90Rm5kCithdHBCYWRSc3AgICA9ICAgLTMxMDcgICAjYXRwQmFkUnNwCithdHBMZW5FcnIgICA9ICAgLTMxMDYgICAjYXRwTGVuRXJyCityZWFkUUVyciAgICA9ICAgLTMxMDUgICAjcmVhZFFFcnIKK2V4dHJhY3RFcnIgID0gICAtMzEwNCAgICNleHRyYWN0RXJyCitja1N1bUVyciAgICA9ICAgLTMxMDMgICAjY2tTdW1FcnIKK25vTVBQRXJyICAgID0gICAtMzEwMiAgICNub01QUEVycgorYnVmMlNtYWxsRXJyICAgID0gICAtMzEwMSAgICNidWYyU21hbGxFcnIKK25vUHJlZkFwcEVyciAgICA9ICAgLTMwMzIgICAjbm9QcmVmQXBwRXJyCitiYWRUcmFuc2xhdGlvblNwZWNFcnIgICA9ICAgLTMwMzEgICAjYmFkVHJhbnNsYXRpb25TcGVjRXJyCitub1RyYW5zbGF0aW9uUGF0aEVyciAgICA9ICAgLTMwMzAgICAjbm9UcmFuc2xhdGlvblBhdGhFcnIKK2NvdWxkTm90UGFyc2VTb3VyY2VGaWxlRXJyICA9ICAgLTMwMjYgICAjU291cmNlIGRvY3VtZW50IGRvZXMgbm90IGNvbnRhaW4gc291cmNlIHR5cGUKK2ludmFsaWRUcmFuc2xhdGlvblBhdGhFcnIgICA9ICAgLTMwMjUgICAjU291cmNlIHR5cGUgdG8gZGVzdGluYXRpb24gdHlwZSBub3QgYSB2YWxpZCBwYXRoCityZXRyeUNvbXBvbmVudFJlZ2lzdHJhdGlvbkVyciAgID0gICAtMzAwNSAgICNyZXRyeUNvbXBvbmVudFJlZ2lzdHJhdGlvbkVycgordW5yZXNvbHZlZENvbXBvbmVudERMTEVyciAgID0gICAtMzAwNCAgICN1bnJlc29sdmVkQ29tcG9uZW50RExMRXJyCitjb21wb25lbnREb250UmVnaXN0ZXIgICA9ICAgLTMwMDMgICAjY29tcG9uZW50RG9udFJlZ2lzdGVyCitjb21wb25lbnROb3RDYXB0dXJlZCAgICA9ICAgLTMwMDIgICAjY29tcG9uZW50Tm90Q2FwdHVyZWQKK3ZhbGlkSW5zdGFuY2VzRXhpc3QgPSAgIC0zMDAxICAgI3ZhbGlkSW5zdGFuY2VzRXhpc3QKK2ludmFsaWRDb21wb25lbnRJRCAgPSAgIC0zMDAwICAgI2ludmFsaWRDb21wb25lbnRJRAorY2ZyYWdMYXN0RXJyQ29kZSAgICA9ICAgLTI4OTkgICAjVGhlIGxhc3QgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIENGTSBlcnJvcnMuCitjZnJhZ091dHB1dExlbmd0aEVyciAgICA9ICAgLTI4MzEgICAjQW4gb3V0cHV0IHBhcmFtZXRlciBpcyB0b28gc21hbGwgdG8gaG9sZCB0aGUgdmFsdWUuCitjZnJhZ0Fib3J0Q2xvc3VyZUVyciAgICA9ICAgLTI4MzAgICAjVXNlZCBieSBub3RpZmljYXRpb24gaGFuZGxlcnMgdG8gYWJvcnQgYSBjbG9zdXJlLgorY2ZyYWdDbG9zdXJlSURFcnIgICA9ICAgLTI4MjkgICAjVGhlIGNsb3N1cmUgSUQgd2FzIG5vdCB2YWxpZC4KK2NmcmFnQ29udGFpbmVySURFcnIgPSAgIC0yODI4ICAgI1RoZSBmcmFnbWVudCBjb250YWluZXIgSUQgd2FzIG5vdCB2YWxpZC4KK2NmcmFnTm9SZWdpc3RyYXRpb25FcnIgID0gICAtMjgyNyAgICNUaGUgcmVnaXN0cmF0aW9uIG5hbWUgd2FzIG5vdCBmb3VuZC4KK2NmcmFnTm90Q2xvc3VyZUVyciAgPSAgIC0yODI2ICAgI1RoZSBjbG9zdXJlIElEIHdhcyBhY3R1YWxseSBhIGNvbm5lY3Rpb24gSUQuCitjZnJhZ0ZpbGVTaXplRXJyICAgID0gICAtMjgyNSAgICNBIGZpbGUgd2FzIHRvbyBsYXJnZSB0byBiZSBtYXBwZWQuCitjZnJhZ0ZyYWdtZW50VXNhZ2VFcnIgICA9ICAgLTI4MjQgICAjQSBzZW1hbnRpYyBlcnJvciBpbiB1c2FnZSBvZiB0aGUgZnJhZ21lbnQuCitjZnJhZ0FyY2hpdGVjdHVyZUVyciAgICA9ICAgLTI4MjMgICAjQSBmcmFnbWVudCBoYXMgYW4gdW5hY2NlcHRhYmxlIGFyY2hpdGVjdHVyZS4KK2NmcmFnTm9BcHBsaWNhdGlvbkVyciAgID0gICAtMjgyMiAgICNObyBhcHBsaWNhdGlvbiBtZW1iZXIgZm91bmQgaW4gdGhlIGNmcmcgcmVzb3VyY2UuCitjZnJhZ0luaXRGdW5jdGlvbkVyciAgICA9ICAgLTI4MjEgICAjQSBmcmFnbWVudCdzIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgcmV0dXJuZWQgYW4gZXJyb3IuCitjZnJhZ0ZyYWdtZW50Q29ycnVwdEVyciA9ICAgLTI4MjAgICAjQSBmcmFnbWVudCdzIGNvbnRhaW5lciB3YXMgY29ycnVwdCAoa25vd24gZm9ybWF0KS4KK2NmcmFnQ0ZNSW50ZXJuYWxFcnIgPSAgIC0yODE5ICAgI0FuIGludGVybmFsIGluY29uc3Rpc3RhbmN5IGhhcyBiZWVuIGRldGVjdGVkLgorY2ZyYWdDRk1TdGFydHVwRXJyICA9ICAgLTI4MTggICAjSW50ZXJuYWwgZXJyb3IgZHVyaW5nIENGTSBpbml0aWFsaXphdGlvbi4KK2NmcmFnTGliQ29ubkVyciA9ICAgLTI4MTcgICAjCitjZnJhZ0luaXRBdEJvb3RFcnIgID0gICAtMjgxNiAgICNBIGJvb3QgbGlicmFyeSBoYXMgYW4gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uICAoU3lzdGVtIDcgb25seSkKK2NmcmFnSW5pdExvb3BFcnIgICAgPSAgIC0yODE1ICAgI0NpcmN1bGFyaXR5IGluIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uIG9yZGVyLgorY2ZyYWdJbXBvcnRUb29OZXdFcnIgICAgPSAgIC0yODE0ICAgI0FuIGltcG9ydCBsaWJyYXJ5IHdhcyB0b28gbmV3IGZvciBhIGNsaWVudC4KK2NmcmFnSW1wb3J0VG9vT2xkRXJyICAgID0gICAtMjgxMyAgICNBbiBpbXBvcnQgbGlicmFyeSB3YXMgdG9vIG9sZCBmb3IgYSBjbGllbnQuCitjZnJhZ0luaXRPcmRlckVyciAgID0gICAtMjgxMiAgICMKK2NmcmFnTm9JRHNFcnIgICA9ICAgLTI4MTEgICAjTm8gbW9yZSBDRk0gSURzIGZvciBjb250ZXh0cywgY29ubmVjdGlvbnMsIGV0Yy4KK2NmcmFnTm9DbGllbnRNZW1FcnIgPSAgIC0yODEwICAgI091dCBvZiBtZW1vcnkgZm9yIGZyYWdtZW50IG1hcHBpbmcgb3Igc2VjdGlvbiBpbnN0YW5jZXMuCitjZnJhZ05vUHJpdmF0ZU1lbUVyciAgICA9ICAgLTI4MDkgICAjT3V0IG9mIG1lbW9yeSBmb3IgaW50ZXJuYWwgYm9va2tlZXBpbmcuCitjZnJhZ05vUG9zaXRpb25FcnIgID0gICAtMjgwOCAgICNUaGUgcmVnaXN0cmF0aW9uIGluc2VydGlvbiBwb2ludCB3YXMgbm90IGZvdW5kLgorY2ZyYWdVbnJlc29sdmVkRXJyICA9ICAgLTI4MDcgICAjQSBmcmFnbWVudCBoYWQgImhhcmQiIHVucmVzb2x2ZWQgaW1wb3J0cy4KK2NmcmFnRnJhZ21lbnRGb3JtYXRFcnIgID0gICAtMjgwNiAgICNBIGZyYWdtZW50J3MgY29udGFpbmVyIGZvcm1hdCBpcyB1bmtub3duLgorY2ZyYWdEdXBSZWdpc3RyYXRpb25FcnIgPSAgIC0yODA1ICAgI1RoZSByZWdpc3RyYXRpb24gbmFtZSB3YXMgYWxyZWFkeSBpbiB1c2UuCitjZnJhZ05vTGlicmFyeUVyciAgID0gICAtMjgwNCAgICNUaGUgbmFtZWQgbGlicmFyeSB3YXMgbm90IGZvdW5kLgorY2ZyYWdOb1NlY3Rpb25FcnIgICA9ICAgLTI4MDMgICAjVGhlIHNwZWNpZmllZCBzZWN0aW9uIHdhcyBub3QgZm91bmQuCitjZnJhZ05vU3ltYm9sRXJyICAgID0gICAtMjgwMiAgICNUaGUgc3BlY2lmaWVkIHN5bWJvbCB3YXMgbm90IGZvdW5kLgorY2ZyYWdDb25uZWN0aW9uSURFcnIgICAgPSAgIC0yODAxICAgI1RoZSBjb25uZWN0aW9uIElEIHdhcyBub3QgdmFsaWQuCitjZnJhZ0ZpcnN0RXJyQ29kZSAgID0gICAtMjgwMCAgICNUaGUgZmlyc3QgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIENGTSBlcnJvcnMuCitlcnJBU0luY29uc2lzdGVudE5hbWVzICA9ICAgLTI3ODAgICAjRW5nbGlzaCBlcnJvcnM6CitlcnJBU05vUmVzdWx0UmV0dXJuZWQgICA9ICAgLTI3NjMgICAjVGhlIHJhbmdlIC0yNzgwIHRocnUgLTI3OTkgaXMgcmVzZXJ2ZWQgZm9yIGRpYWxlY3Qgc3BlY2lmaWMgZXJyb3IgY29kZXMuIChFcnJvciBjb2RlcyBmcm9tIGRpZmZlcmVudCBkaWFsZWN0cyBtYXkgb3ZlcmxhcC4pCitlcnJBU1BhcmFtZXRlck5vdEZvckV2ZW50ICAgPSAgIC0yNzYyICAgI2VyckFTUGFyYW1ldGVyTm90Rm9yRXZlbnQKK2VyckFTSWxsZWdhbEZvcm1hbFBhcmFtZXRlciA9ICAgLTI3NjEgICAjZXJyQVNJbGxlZ2FsRm9ybWFsUGFyYW1ldGVyCitlcnJBU1Rlcm1pbm9sb2d5TmVzdGluZ1Rvb0RlZXAgID0gICAtMjc2MCAgICNlcnJBU1Rlcm1pbm9sb2d5TmVzdGluZ1Rvb0RlZXAKK09TQUNvbnRyb2xGbG93RXJyb3IgPSAgIC0yNzU1ICAgI1NpZ25hbGVkIHdoZW4gaWxsZWdhbCBjb250cm9sIGZsb3cgb2NjdXJzIGluIGFuIGFwcGxpY2F0aW9uIChubyBjYXRjaGVyIGZvciB0aHJvdywgbm9uLWxleGljYWwgbG9vcCBleGl0LCBldGMuKQorT1NBSW5jb25zaXN0ZW50RGVjbGFyYXRpb25zID0gICAtMjc1NCAgICNTaWduYWxlZCB3aGVuIGEgdmFyaWFibGUgaXMgZGVjbGFyZWQgaW5jb25zaXN0ZW50bHkgaW4gdGhlIHNhbWUgc2NvcGUsIHN1Y2ggYXMgYm90aCBsb2NhbCBhbmQgZ2xvYmFsCitPU0FVbmRlZmluZWRWYXJpYWJsZSAgICA9ICAgLTI3NTMgICAjU2lnbmFsZWQgd2hlbiBhIHZhcmlhYmxlIGlzIGFjY2Vzc2VkIHRoYXQgaGFzIG5vIHZhbHVlCitPU0FEdXBsaWNhdGVIYW5kbGVyID0gICAtMjc1MiAgICNTaWduYWxlZCB3aGVuIG1vcmUgdGhhbiBvbmUgaGFuZGxlciBpcyBkZWZpbmVkIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBhIHNjb3BlIHdoZXJlIHRoZSBsYW5ndWFnZSBkb2Vzbid0IGFsbG93IGl0CitPU0FEdXBsaWNhdGVQcm9wZXJ0eSAgICA9ICAgLTI3NTEgICAjU2lnbmFsZWQgd2hlbiBhIGZvcm1hbCBwYXJhbWV0ZXIsIGxvY2FsIHZhcmlhYmxlLCBvciBpbnN0YW5jZSB2YXJpYWJsZSBpcyBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UuCitPU0FEdXBsaWNhdGVQYXJhbWV0ZXIgICA9ICAgLTI3NTAgICAjU2lnbmFsZWQgd2hlbiBhIGZvcm1hbCBwYXJhbWV0ZXIsIGxvY2FsIHZhcmlhYmxlLCBvciBpbnN0YW5jZSB2YXJpYWJsZSBpcyBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UKK09TQVRva2VuVG9vTG9uZyA9ICAgLTI3NDIgICAjU2lnbmFsZWQgd2hlbiBhIG5hbWUgb3IgbnVtYmVyIGlzIHRvbyBsb25nIHRvIGJlIHBhcnNlZAorT1NBU3ludGF4VHlwZUVycm9yICA9ICAgLTI3NDEgICAjU2lnbmFsZWQgd2hlbiBhbm90aGVyIGZvcm0gb2Ygc3ludGF4IHdhcyBleHBlY3RlZC4gKGUuZy4gImV4cGVjdGVkIGEgPHR5cGU+IGJ1dCBmb3VuZCA8dGhpcz4iKQorT1NBU3ludGF4RXJyb3IgID0gICAtMjc0MCAgICNTaWduYWxlZCB3aGVuIGEgc3ludGF4IGVycm9yIG9jY3Vycy4gKGUuZy4gIlN5bnRheCBlcnJvciIgb3IgIjx0aGlzPiBjYW4ndCBnbyBhZnRlciA8dGhhdD4iKQorZXJyQVNDYW50Q29tcGFyZU1vcmVUaGFuMzJrID0gICAtMjcyMSAgICNQYXJzZXIvQ29tcGlsZXIgZXJyb3JzOgorZXJyQVNDYW50Q29uc2lkZXJBbmRJZ25vcmUgID0gICAtMjcyMCAgICNlcnJBU0NhbnRDb25zaWRlckFuZElnbm9yZQorZXJyT1NBQ2FudENyZWF0ZSAgICA9ICAgLTI3MTAgICAjZXJyT1NBQ2FudENyZWF0ZQorZXJyT1NBQ2FudEdldFRlcm1pbm9sb2d5ICAgID0gICAtMjcwOSAgICNlcnJPU0FDYW50R2V0VGVybWlub2xvZ3kKK2Vyck9TQURhdGFCbG9ja1Rvb0xhcmdlID0gICAtMjcwOCAgICNTaWduYWxlZCB3aGVuIGFuIGludHJpbnNpYyBsaW1pdGF0aW9uIGlzIGV4Y2VlZGVkIGZvciB0aGUgc2l6ZSBvZiBhIHZhbHVlIG9yIGRhdGEgc3RydWN0dXJlLgorZXJyT1NBSW50ZXJuYWxUYWJsZU92ZXJmbG93ID0gICAtMjcwNyAgICNTaWduYWxlZCB3aGVuIGEgcnVudGltZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBvdmVyZmxvd3MKK2Vyck9TQVN0YWNrT3ZlcmZsb3cgPSAgIC0yNzA2ICAgI1NpZ25hbGVkIHdoZW4gdGhlIHJ1bnRpbWUgc3RhY2sgb3ZlcmZsb3dzCitlcnJPU0FDb3JydXB0VGVybWlub2xvZ3kgICAgPSAgIC0yNzA1ICAgI1NpZ25hbGVkIHdoZW4gYW4gYXBwbGljYXRpb24ncyB0ZXJtaW5vbG9neSByZXNvdXJjZSBpcyBub3QgcmVhZGFibGUKK2Vyck9TQUFwcE5vdEhpZ2hMZXZlbEV2ZW50QXdhcmUgPSAgIC0yNzA0ICAgI1NpZ25hbGVkIHdoZW4gYW4gYXBwbGljYXRpb24gY2FuJ3QgcmVzcG9uZCB0byBBcHBsZUV2ZW50cworZXJyT1NBQ2FudExhdW5jaCAgICA9ICAgLTI3MDMgICAjU2lnbmFsZWQgd2hlbiBhcHBsaWNhdGlvbiBjYW4ndCBiZSBsYXVuY2hlZCBvciB3aGVuIGl0IGlzIHJlbW90ZSBhbmQgcHJvZ3JhbSBsaW5raW5nIGlzIG5vdCBlbmFibGVkCitlcnJPU0FOdW1lcmljT3ZlcmZsb3cgICA9ICAgLTI3MDIgICAjU2lnbmFsZWQgd2hlbiBpbnRlZ2VyIG9yIHJlYWwgdmFsdWUgaXMgdG9vIGxhcmdlIHRvIGJlIHJlcHJlc2VudGVkCitlcnJPU0FEaXZpZGVCeVplcm8gID0gICAtMjcwMSAgICNTaWduYWxlZCB3aGVuIHRoZXJlIGlzIGFuIGF0dGVtcHQgdG8gZGl2aWRlIGJ5IHplcm8KK2Vyck9TQUdlbmVyYWxFcnJvciAgPSAgIC0yNzAwICAgI1NpZ25hbGVkIGJ5IHVzZXIgc2NyaXB0cyBvciBhcHBsaWNhdGlvbnMgd2hlbiBubyBhY3R1YWwgZXJyb3IgY29kZSBpcyB0byBiZSByZXR1cm5lZC4KK25vSWNvbkRhdGFBdmFpbGFibGVFcnIgID0gICAtMjU4MiAgICNUaGUgbmVjZXNzYXJ5IGljb24gZGF0YSBpcyBub3QgYXZhaWxhYmxlCitub1N1Y2hJY29uRXJyICAgPSAgIC0yNTgxICAgI1RoZSByZXF1ZXN0ZWQgaWNvbiBjb3VsZCBub3QgYmUgZm91bmQKK2ludmFsaWRJY29uUmVmRXJyICAgPSAgIC0yNTgwICAgI1RoZSBpY29uIHJlZiBpcyBub3QgdmFsaWQKK25yQ2FsbE5vdFN1cHBvcnRlZCAgPSAgIC0yNTU3ICAgI1RoaXMgY2FsbCBpcyBub3QgYXZhaWxhYmxlIG9yIHN1cHBvcnRlZCBvbiB0aGlzIG1hY2hpbmUKK25yVHJhbnNhY3Rpb25BYm9ydGVkICAgID0gICAtMjU1NiAgICN0cmFuc2FjdGlvbiB3YXMgYWJvcnRlZAorbnJFeGl0ZWRJdGVyYXRvclNjb3BlICAgPSAgIC0yNTU1ICAgI291dGVyIHNjb3BlIG9mIGl0ZXJhdG9yIHdhcyBleGl0ZWQKK25ySXRlcmF0aW9uRG9uZSA9ICAgLTI1NTQgICAjaXRlcmF0aW9uIG9wZXJhdGlvbiBpcyBkb25lCituclByb3BlcnR5QWxyZWFkeUV4aXN0cyA9ICAgLTI1NTMgICAjcHJvcGVydHkgYWxyZWFkeSBleGlzdHMKK25ySW52YWxpZEVudHJ5SXRlcmF0aW9uT3AgICA9ICAgLTI1NTIgICAjaW52YWxpZCBlbnRyeSBpdGVyYXRpb24gb3BlcmF0aW9uCituclBhdGhCdWZmZXJUb29TbWFsbCAgICA9ICAgLTI1NTEgICAjYnVmZmVyIGZvciBwYXRoIGlzIHRvbyBzbWFsbAorbnJQYXRoTm90Rm91bmQgID0gICAtMjU1MCAgICNhIHBhdGggY29tcG9uZW50IGxvb2t1cCBmYWlsZWQKK25yUmVzdWx0Q29kZUJhc2UgICAgPSAgIC0yNTQ5ICAgI25yUmVzdWx0Q29kZUJhc2UKK25yT3ZlcnJ1bkVyciAgICA9ICAgLTI1NDggICAjbnJPdmVycnVuRXJyCituck5vdE1vZGlmaWVkRXJyICAgID0gICAtMjU0NyAgICNuck5vdE1vZGlmaWVkRXJyCituclR5cGVNaXNtYXRjaEVyciAgID0gICAtMjU0NiAgICNuclR5cGVNaXNtYXRjaEVycgorbnJQb3dlclN3aXRjaEFib3J0RXJyICAgPSAgIC0yNTQ1ICAgI25yUG93ZXJTd2l0Y2hBYm9ydEVycgorbnJQb3dlckVyciAgPSAgIC0yNTQ0ICAgI25yUG93ZXJFcnIKK25yRGF0YVRydW5jYXRlZEVyciAgPSAgIC0yNTQzICAgI25yRGF0YVRydW5jYXRlZEVycgorbnJOb3RTbG90RGV2aWNlRXJyICA9ICAgLTI1NDIgICAjbnJOb3RTbG90RGV2aWNlRXJyCituck5hbWVFcnIgICA9ICAgLTI1NDEgICAjbnJOYW1lRXJyCituck5vdENyZWF0ZWRFcnIgPSAgIC0yNTQwICAgI25yTm90Q3JlYXRlZEVycgorbnJOb3RGb3VuZEVyciAgID0gICAtMjUzOSAgICNuck5vdEZvdW5kRXJyCituckludmFsaWROb2RlRXJyICAgID0gICAtMjUzOCAgICNuckludmFsaWROb2RlRXJyCituck5vdEVub3VnaE1lbW9yeUVyciAgICA9ICAgLTI1MzcgICAjbnJOb3RFbm91Z2hNZW1vcnlFcnIKK25yTG9ja2VkRXJyID0gICAtMjUzNiAgICNuckxvY2tlZEVycgorbW1JbnRlcm5hbEVycm9yID0gICAtMjUyNiAgICNtbUludGVybmFsRXJyb3IKK3RzbURlZmF1bHRJc05vdElucHV0TWV0aG9kRXJyICAgPSAgIC0yNTI0ICAgI0N1cnJlbnQgSW5wdXQgc291cmNlIGlzIEtDSFIgb3IgdWNociwgbm90IElucHV0IE1ldGhvZCAgKEdldERlZmF1bHRJbnB1dE1ldGhvZCkKK3RzbU5vU3RlbSAgID0gICAtMjUyMyAgICNObyBzdGVtIGV4aXN0cyBmb3IgdGhlIHRva2VuCit0c21Ob01vcmVUb2tlbnMgPSAgIC0yNTIyICAgI05vIG1vcmUgdG9rZW5zIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBzb3VyY2UgdGV4dAordHNtTm9IYW5kbGVyICAgID0gICAtMjUyMSAgICNObyBDYWxsYmFjayBIYW5kbGVyIGV4aXN0cyBmb3IgY2FsbGJhY2sKK3RzbUludmFsaWRDb250ZXh0ICAgPSAgIC0yNTIwICAgI0ludmFsaWQgVFNNQ29udGV4dCBzcGVjaWZpZWQgaW4gY2FsbAordHNtVW5rbm93bkVyciAgID0gICAtMjUxOSAgICNhbnkgb3RoZXIgZXJyb3JzCit0c21VbnN1cHBvcnRlZFR5cGVFcnIgICA9ICAgLTI1MTggICAjdW5TdXBwb3J0ZWQgaW50ZXJmYWNlIHR5cGUgZXJyb3IKK3RzbVNjcmlwdEhhc05vSU1FcnIgPSAgIC0yNTE3ICAgI3NjcmlwdCBoYXMgbm8gaW1wdXQgbWV0aG9kIG9yIGlzIHVzaW5nIG9sZCBJTQordHNtSW5wdXRNZXRob2RJc09sZEVyciAgPSAgIC0yNTE2ICAgI3JldHVybmVkIGJ5IEdldERlZmF1bHRJbnB1dE1ldGhvZAordHNtQ29tcG9uZW50QWxyZWFkeU9wZW5FcnIgID0gICAtMjUxNSAgICN0ZXh0IHNlcnZpY2UgYWxyZWFkeSBvcGVuZWQgZm9yIHRoZSBkb2N1bWVudAordHNtVFNOb3RPcGVuRXJyID0gICAtMjUxNCAgICN0ZXh0IHNlcnZpY2UgaXMgbm90IG9wZW4KK3RzbVRTSGFzTm9NZW51RXJyICAgPSAgIC0yNTEzICAgI3RoZSB0ZXh0IHNlcnZpY2UgaGFzIG5vIG1lbnUKK3RzbVVzZUlucHV0V2luZG93RXJyICAgID0gICAtMjUxMiAgICNub3QgVFNNIGF3YXJlIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIGlucHV0IHdpbmRvdwordHNtRG9jdW1lbnRPcGVuRXJyICA9ICAgLTI1MTEgICAjdGhlcmUgYXJlIG9wZW4gZG9jdW1lbnRzCit0c21UZXh0U2VydmljZU5vdEZvdW5kRXJyICAgPSAgIC0yNTEwICAgI25vIHRleHQgc2VydmljZSBmb3VuZAordHNtQ2FudE9wZW5Db21wb25lbnRFcnIgPSAgIC0yNTA5ICAgI2NhbtV0IG9wZW4gdGhlIGNvbXBvbmVudAordHNtTm9PcGVuVFNFcnIgID0gICAtMjUwOCAgICNubyBvcGVuIHRleHQgc2VydmljZQordHNtRG9jTm90QWN0aXZlRXJyICA9ICAgLTI1MDcgICAjZG9jdW1lbnQgaXMgTk9UIGFjdGl2ZQordHNtVFNNRG9jQnVzeUVyciAgICA9ICAgLTI1MDYgICAjZG9jdW1lbnQgaXMgc3RpbGwgYWN0aXZlCit0c21JbnZhbGlkRG9jSURFcnIgID0gICAtMjUwNSAgICNpbnZhbGlkIFRTTSBkb2N1bWVudGF0aW9uIGlkCit0c21OZXZlclJlZ2lzdGVyZWRFcnIgICA9ICAgLTI1MDQgICAjYXBwIG5ldmVyIHJlZ2lzdGVyZWQgZXJyb3IgKG5vdCBUU00gYXdhcmUpCit0c21BbHJlYWR5UmVnaXN0ZXJlZEVyciA9ICAgLTI1MDMgICAjd2FudCB0byByZWdpc3RlciBhZ2FpbiBlcnJvcgordHNtTm90QW5BcHBFcnIgID0gICAtMjUwMiAgICNub3QgYW4gYXBwbGljYXRpb24gZXJyb3IKK3RzbUlucHV0TWV0aG9kTm90Rm91bmRFcnIgICA9ICAgLTI1MDEgICAjdHNtSW5wdXRNZXRob2ROb3RGb3VuZEVycgordHNtVW5zdXBTY3JpcHRMYW5ndWFnZUVyciAgID0gICAtMjUwMCAgICN0c21VbnN1cFNjcmlwdExhbmd1YWdlRXJyCitrZXJuZWxVbnJlY292ZXJhYmxlRXJyICA9ICAgLTI0OTkgICAja2VybmVsVW5yZWNvdmVyYWJsZUVycgora2VybmVsUmV0dXJuVmFsdWVFcnIgICAgPSAgIC0yNDIyICAgI2tlcm5lbFJldHVyblZhbHVlRXJyCitrZXJuZWxBbHJlYWR5RnJlZUVyciAgICA9ICAgLTI0MjEgICAja2VybmVsQWxyZWFkeUZyZWVFcnIKK2tlcm5lbElERXJyID0gICAtMjQxOSAgICNrZXJuZWxJREVycgora2VybmVsRXhjZXB0aW9uRXJyICA9ICAgLTI0MTggICAja2VybmVsRXhjZXB0aW9uRXJyCitrZXJuZWxUZXJtaW5hdGVkRXJyID0gICAtMjQxNyAgICNrZXJuZWxUZXJtaW5hdGVkRXJyCitrZXJuZWxJblVzZUVyciAgPSAgIC0yNDE2ICAgI2tlcm5lbEluVXNlRXJyCitrZXJuZWxUaW1lb3V0RXJyICAgID0gICAtMjQxNSAgICNrZXJuZWxUaW1lb3V0RXJyCitrZXJuZWxBc3luY1JlY2VpdmVMaW1pdEVyciAgPSAgIC0yNDE0ICAgI2tlcm5lbEFzeW5jUmVjZWl2ZUxpbWl0RXJyCitrZXJuZWxBc3luY1NlbmRMaW1pdEVyciA9ICAgLTI0MTMgICAja2VybmVsQXN5bmNTZW5kTGltaXRFcnIKK2tlcm5lbEF0dHJpYnV0ZUVyciAgPSAgIC0yNDEyICAgI2tlcm5lbEF0dHJpYnV0ZUVycgora2VybmVsRXhlY3V0aW9uTGV2ZWxFcnIgPSAgIC0yNDExICAgI2tlcm5lbEV4ZWN1dGlvbkxldmVsRXJyCitrZXJuZWxEZWxldGVQZXJtaXNzaW9uRXJyICAgPSAgIC0yNDEwICAgI2tlcm5lbERlbGV0ZVBlcm1pc3Npb25FcnIKK2tlcm5lbEV4ZWN1dGVQZXJtaXNzaW9uRXJyICA9ICAgLTI0MDkgICAja2VybmVsRXhlY3V0ZVBlcm1pc3Npb25FcnIKK2tlcm5lbFJlYWRQZXJtaXNzaW9uRXJyID0gICAtMjQwOCAgICNrZXJuZWxSZWFkUGVybWlzc2lvbkVycgora2VybmVsV3JpdGVQZXJtaXNzaW9uRXJyICAgID0gICAtMjQwNyAgICNrZXJuZWxXcml0ZVBlcm1pc3Npb25FcnIKK2tlcm5lbE9iamVjdEV4aXN0c0VyciAgID0gICAtMjQwNiAgICNrZXJuZWxPYmplY3RFeGlzdHNFcnIKK2tlcm5lbFVuc3VwcG9ydGVkRXJyICAgID0gICAtMjQwNSAgICNrZXJuZWxVbnN1cHBvcnRlZEVycgora2VybmVsUHJpdmlsZWdlRXJyICA9ICAgLTI0MDQgICAja2VybmVsUHJpdmlsZWdlRXJyCitrZXJuZWxPcHRpb25zRXJyICAgID0gICAtMjQwMyAgICNrZXJuZWxPcHRpb25zRXJyCitrZXJuZWxDYW5jZWxlZEVyciAgID0gICAtMjQwMiAgICNrZXJuZWxDYW5jZWxlZEVycgora2VybmVsSW5jb21wbGV0ZUVyciA9ICAgLTI0MDEgICAja2VybmVsSW5jb21wbGV0ZUVycgorYmFkQ2FsbE9yZGVyRXJyID0gICAtMjIwOSAgICNVc3VhbGx5IGR1ZSB0byBhIHN0YXR1cyBjYWxsIGJlaW5nIGNhbGxlZCBwcmlvciB0byBiZWluZyBzZXR1cCBmaXJzdAorbm9ETUFFcnIgICAgPSAgIC0yMjA4ICAgI0NhbtV0IGRvIERNQSBkaWdpdGl6aW5nIChpLmUuIGNhbid0IGdvIHRvIHJlcXVlc3RlZCBkZXN0CitiYWREZXB0aEVyciA9ICAgLTIyMDcgICAjQ2Fu1XQgZGlnaXRpemUgaW50byB0aGlzIGRlcHRoCitub3RFeGFjdFNpemVFcnIgPSAgIC0yMjA2ICAgI0NhbtV0IGRvIGV4YWN0IHNpemUgcmVxdWVzdGVkCitub01vcmVLZXlDb2xvcnNFcnIgID0gICAtMjIwNSAgICNhbGwga2V5IGluZGV4ZXMgaW4gdXNlCitub3RFeGFjdE1hdHJpeEVyciAgID0gICAtMjIwNCAgICN3YXJuaW5nIG9mIGJhZCBtYXRyaXgsIGRpZ2l0aXplciBkaWQgaXRzIGJlc3QKK21hdHJpeEVyciAgID0gICAtMjIwMyAgICNiYWQgbWF0cml4LCBkaWdpdGl6ZXIgZGlkIG5vdGhpbmcKK3F0UGFyYW1FcnIgID0gICAtMjIwMiAgICNiYWQgaW5wdXQgcGFyYW1ldGVyIChvdXQgb2YgcmFuZ2UsIGV0YykKK2RpZ2lVbmltcEVyciAgICA9ICAgLTIyMDEgICAjZmVhdHVyZSB1bmltcGxlbWVudGVkCitxdFhNTEFwcGxpY2F0aW9uRXJyID0gICAtMjE1OSAgICNxdFhNTEFwcGxpY2F0aW9uRXJyCitxdFhNTFBhcnNlRXJyICAgPSAgIC0yMTU4ICAgI3F0WE1MUGFyc2VFcnIKK3F0QWN0aW9uTm90SGFuZGxlZEVyciAgID0gICAtMjE1NyAgICNxdEFjdGlvbk5vdEhhbmRsZWRFcnIKK25vdEVub3VnaERhdGFFcnIgICAgPSAgIC0yMTQ5ICAgI25vdEVub3VnaERhdGFFcnIKK3VybERhdGFIRlRQVVJMRXJyICAgPSAgIC0yMTQ4ICAgI3VybERhdGFIRlRQVVJMRXJyCit1cmxEYXRhSEZUUFNlcnZlckRpc2Nvbm5lY3RlZEVyciAgICA9ICAgLTIxNDcgICAjdXJsRGF0YUhGVFBTZXJ2ZXJEaXNjb25uZWN0ZWRFcnIKK3VybERhdGFIRlRQTm9QYXNzd29yZEVyciAgICA9ICAgLTIxNDYgICAjdXJsRGF0YUhGVFBOb1Bhc3N3b3JkRXJyCit1cmxEYXRhSEZUUE5lZWRQYXNzd29yZEVyciAgPSAgIC0yMTQ1ICAgI3VybERhdGFIRlRQTmVlZFBhc3N3b3JkRXJyCit1cmxEYXRhSEZUUEJhZE5hbWVMaXN0RXJyICAgPSAgIC0yMTQ0ICAgI3VybERhdGFIRlRQQmFkTmFtZUxpc3RFcnIKK3VybERhdGFIRlRQTm9OZXREcml2ZXJFcnIgICA9ICAgLTIxNDMgICAjdXJsRGF0YUhGVFBOb05ldERyaXZlckVycgordXJsRGF0YUhGVFBGaWxlbmFtZUVyciAgPSAgIC0yMTQyICAgI3VybERhdGFIRlRQRmlsZW5hbWVFcnIKK3VybERhdGFIRlRQUGVybWlzc2lvbnNFcnIgICA9ICAgLTIxNDEgICAjdXJsRGF0YUhGVFBQZXJtaXNzaW9uc0VycgordXJsRGF0YUhGVFBRdW90YUVyciA9ICAgLTIxNDAgICAjdXJsRGF0YUhGVFBRdW90YUVycgordXJsRGF0YUhGVFBOb0RpcmVjdG9yeUVyciAgID0gICAtMjEzOSAgICN1cmxEYXRhSEZUUE5vRGlyZWN0b3J5RXJyCit1cmxEYXRhSEZUUERhdGFDb25uZWN0aW9uRXJyICAgID0gICAtMjEzOCAgICN1cmxEYXRhSEZUUERhdGFDb25uZWN0aW9uRXJyCit1cmxEYXRhSEZUUFNlcnZlckVyciAgICA9ICAgLTIxMzcgICAjdXJsRGF0YUhGVFBTZXJ2ZXJFcnIKK3VybERhdGFIRlRQQmFkUGFzc3dvcmRFcnIgICA9ICAgLTIxMzYgICAjdXJsRGF0YUhGVFBCYWRQYXNzd29yZEVycgordXJsRGF0YUhGVFBCYWRVc2VyRXJyICAgPSAgIC0yMTM1ICAgI3VybERhdGFIRlRQQmFkVXNlckVycgordXJsRGF0YUhGVFBTaHV0ZG93bkVyciAgPSAgIC0yMTM0ICAgI3VybERhdGFIRlRQU2h1dGRvd25FcnIKK3VybERhdGFIRlRQUHJvdG9jb2xFcnIgID0gICAtMjEzMyAgICN1cmxEYXRhSEZUUFByb3RvY29sRXJyCit1cmxEYXRhSEhUVFBSZWRpcmVjdEVyciA9ICAgLTIxMzIgICAjdXJsRGF0YUhIVFRQUmVkaXJlY3RFcnIKK3VybERhdGFISFRUUFVSTEVyciAgPSAgIC0yMTMxICAgI3VybERhdGFISFRUUFVSTEVycgordXJsRGF0YUhIVFRQTm9OZXREcml2ZXJFcnIgID0gICAtMjEzMCAgICN1cmxEYXRhSEhUVFBOb05ldERyaXZlckVycgordXJsRGF0YUhIVFRQUHJvdG9jb2xFcnIgPSAgIC0yMTI5ICAgI3VybERhdGFISFRUUFByb3RvY29sRXJyCitxdE5ldHdvcmtBbHJlYWR5QWxsb2NhdGVkRXJyICAgID0gICAtMjEyNyAgICNxdE5ldHdvcmtBbHJlYWR5QWxsb2NhdGVkRXJyCitub3RBbGxvd2VkVG9TYXZlTW92aWVFcnIgICAgPSAgIC0yMTI2ICAgI25vdEFsbG93ZWRUb1NhdmVNb3ZpZUVycgorZmlsZU9mZnNldFRvb0JpZ0VyciA9ICAgLTIxMjUgICAjZmlsZU9mZnNldFRvb0JpZ0VycgorQVNERW50cnlOb3RGb3VuZEVyciA9ICAgLTIxMjQgICAjQVNERW50cnlOb3RGb3VuZEVycgorQVNEQmFkRm9ya0VyciAgID0gICAtMjEyMyAgICNBU0RCYWRGb3JrRXJyCitBU0RCYWRIZWFkZXJFcnIgPSAgIC0yMTIyICAgI0FTREJhZEhlYWRlckVycgorQUFQTm90Rm91bmRFcnIgID0gICAtMjEyMSAgICNBQVBOb3RGb3VuZEVycgorQUFQTm90Q3JlYXRlZEVyciAgICA9ICAgLTIxMjAgICAjQUFQTm90Q3JlYXRlZEVycgorcWZjYk5vdENyZWF0ZWRFcnIgICA9ICAgLTIxMTkgICAjcWZjYk5vdENyZWF0ZWRFcnIKK3FmY2JOb3RGb3VuZEVyciA9ICAgLTIxMTggICAjcWZjYk5vdEZvdW5kRXJyCit3YWNrQmFkTWV0YURhdGFFcnIgID0gICAtMjExNyAgICN3YWNrQmFkTWV0YURhdGFFcnIKK3dhY2tGb3JrTm90Rm91bmRFcnIgPSAgIC0yMTE2ICAgI3dhY2tGb3JrTm90Rm91bmRFcnIKK3dhY2tCYWRGaWxlRXJyICA9ICAgLTIxMTUgICAjd2Fja0JhZEZpbGVFcnIKK3Vua25vd25Gb3JtYXRFcnIgICAgPSAgIC0yMTE0ICAgI3Vua25vd25Gb3JtYXRFcnIKK3BhdGhOb3RWZXJpZmllZEVyciAgPSAgIC0yMTEzICAgI3BhdGhOb3RWZXJpZmllZEVycgorbm9QYXRoTWFwcGluZ0VyciAgICA9ICAgLTIxMTIgICAjbm9QYXRoTWFwcGluZ0VycgorZW1wdHlQYXRoRXJyICAgID0gICAtMjExMSAgICNlbXB0eVBhdGhFcnIKK3BhdGhUb29Mb25nRXJyICA9ICAgLTIxMTAgICAjcGF0aFRvb0xvbmdFcnIKK2Nhbm5vdEJlTGVhZkF0b21FcnIgPSAgIC0yMTA5ICAgI2Nhbm5vdEJlTGVhZkF0b21FcnIKK2ludmFsaWRBdG9tVHlwZUVyciAgPSAgIC0yMTA4ICAgI2ludmFsaWRBdG9tVHlwZUVycgoraW52YWxpZEF0b21Db250YWluZXJFcnIgPSAgIC0yMTA3ICAgI2ludmFsaWRBdG9tQ29udGFpbmVyRXJyCitpbnZhbGlkQXRvbUVyciAgPSAgIC0yMTA2ICAgI2ludmFsaWRBdG9tRXJyCitkdXBsaWNhdGVBdG9tVHlwZUFuZElERXJyICAgPSAgIC0yMTA1ICAgI2R1cGxpY2F0ZUF0b21UeXBlQW5kSURFcnIKK2F0b21JbmRleEludmFsaWRFcnIgPSAgIC0yMTA0ICAgI2F0b21JbmRleEludmFsaWRFcnIKK2F0b21zTm90T2ZTYW1lVHlwZUVyciAgID0gICAtMjEwMyAgICNhdG9tc05vdE9mU2FtZVR5cGVFcnIKK25vdExlYWZBdG9tRXJyICA9ICAgLTIxMDIgICAjbm90TGVhZkF0b21FcnIKK2Nhbm5vdEZpbmRBdG9tRXJyICAgPSAgIC0yMTAxICAgI2Nhbm5vdEZpbmRBdG9tRXJyCit1bnN1cHBvcnRlZFByb2Nlc3NvckVyciA9ICAgLTIwOTcgICAjdW5zdXBwb3J0ZWRQcm9jZXNzb3JFcnIKK3Vuc3VwcG9ydGVkT1NFcnIgICAgPSAgIC0yMDk2ICAgI3Vuc3VwcG9ydGVkT1NFcnIKK3F0bWxVbmluaXRpYWxpemVkICAgPSAgIC0yMDk1ICAgI3F0bWxVbmluaXRpYWxpemVkCitxdG1sRGxsRW50cnlOb3RGb3VuZEVyciA9ICAgLTIwOTQgICAjV2luZG93cyBzcGVjaWZpYyBlcnJvcnMgKHdoZW4gcXRtbCBpcyBsb2FkaW5nKQorcXRtbERsbExvYWRFcnIgID0gICAtMjA5MyAgICNXaW5kb3dzIHNwZWNpZmljIGVycm9ycyAod2hlbiBxdG1sIGlzIGxvYWRpbmcpCitjb21wb25lbnREbGxFbnRyeU5vdEZvdW5kRXJyICAgID0gICAtMjA5MiAgICNXaW5kb3dzIHNwZWNpZmljIGVycm9ycyAod2hlbiBjb21wb25lbnQgaXMgbG9hZGluZykKK2NvbXBvbmVudERsbExvYWRFcnIgPSAgIC0yMDkxICAgI1dpbmRvd3Mgc3BlY2lmaWMgZXJyb3JzICh3aGVuIGNvbXBvbmVudCBpcyBsb2FkaW5nKQordmlkZW9PdXRwdXRJblVzZUVyciA9ICAgLTIwOTAgICAjdmlkZW9PdXRwdXRJblVzZUVycgorbm9FeHBvcnRQcm9jQXZhaWxhYmxlRXJyICAgID0gICAtMjA4OSAgICNub0V4cG9ydFByb2NBdmFpbGFibGVFcnIKK3R1bmVQYXJzZU9TRXJyICA9ICAgLTIwODcgICAjdHVuZVBhcnNlT1NFcnIKK3R1bmVQbGF5ZXJGdWxsT1NFcnIgPSAgIC0yMDg2ICAgI3R1bmVQbGF5ZXJGdWxsT1NFcnIKK25vdGVDaGFubmVsTm90QWxsb2NhdGVkT1NFcnIgICAgPSAgIC0yMDg1ICAgI25vdGVDaGFubmVsTm90QWxsb2NhdGVkT1NFcnIKK2lsbGVnYWxOb3RlQ2hhbm5lbE9TRXJyID0gICAtMjA4NCAgICNpbGxlZ2FsTm90ZUNoYW5uZWxPU0Vycgorc3ludGhlc2l6ZXJPU0VyciAgICA9ICAgLTIwODMgICAjc3ludGhlc2l6ZXJPU0Vycgorc3ludGhlc2l6ZXJOb3RSZXNwb25kaW5nT1NFcnIgICA9ICAgLTIwODIgICAjc3ludGhlc2l6ZXJOb3RSZXNwb25kaW5nT1NFcnIKK21pZGlNYW5hZ2VyQWJzZW50T1NFcnIgID0gICAtMjA4MSAgICNtaWRpTWFuYWdlckFic2VudE9TRXJyCitpbGxlZ2FsQ29udHJvbGxlck9TRXJyICA9ICAgLTIwODAgICAjaWxsZWdhbENvbnRyb2xsZXJPU0VycgoraWxsZWdhbEluc3RydW1lbnRPU0VyciAgPSAgIC0yMDc5ICAgI2lsbGVnYWxJbnN0cnVtZW50T1NFcnIKK2lsbGVnYWxLbm9iVmFsdWVPU0VyciAgID0gICAtMjA3OCAgICNpbGxlZ2FsS25vYlZhbHVlT1NFcnIKK2lsbGVnYWxLbm9iT1NFcnIgICAgPSAgIC0yMDc3ICAgI2lsbGVnYWxLbm9iT1NFcnIKK2lsbGVnYWxDaGFubmVsT1NFcnIgPSAgIC0yMDc2ICAgI2lsbGVnYWxDaGFubmVsT1NFcnIKK2lsbGVnYWxQYXJ0T1NFcnIgICAgPSAgIC0yMDc1ICAgI2lsbGVnYWxQYXJ0T1NFcnIKK2lsbGVnYWxWb2ljZUFsbG9jYXRpb25PU0VyciA9ICAgLTIwNzQgICAjaWxsZWdhbFZvaWNlQWxsb2NhdGlvbk9TRXJyCitjYW50UmVjZWl2ZUZyb21TeW50aGVzaXplck9TRXJyID0gICAtMjA3MyAgICNjYW50UmVjZWl2ZUZyb21TeW50aGVzaXplck9TRXJyCitjYW50U2VuZFRvU3ludGhlc2l6ZXJPU0VyciAgPSAgIC0yMDcyICAgI2NhbnRTZW5kVG9TeW50aGVzaXplck9TRXJyCitub3RJbXBsZW1lbnRlZE11c2ljT1NFcnIgICAgPSAgIC0yMDcxICAgI25vdEltcGxlbWVudGVkTXVzaWNPU0VycgoraW50ZXJuYWxDb21wb25lbnRFcnIgICAgPSAgIC0yMDcwICAgI2ludGVybmFsQ29tcG9uZW50RXJyCitpbnZhbGlkU3ByaXRlSURFcnIgID0gICAtMjA2OSAgICNpbnZhbGlkU3ByaXRlSURFcnIKK2ludmFsaWRJbWFnZUluZGV4RXJyICAgID0gICAtMjA2OCAgICNpbnZhbGlkSW1hZ2VJbmRleEVycgoraW52YWxpZFNwcml0ZUluZGV4RXJyICAgPSAgIC0yMDY3ICAgI2ludmFsaWRTcHJpdGVJbmRleEVycgorZ1dvcmxkc05vdFNhbWVEZXB0aEFuZFNpemVFcnIgICA9ICAgLTIwNjYgICAjZ1dvcmxkc05vdFNhbWVEZXB0aEFuZFNpemVFcnIKK2ludmFsaWRTcHJpdGVQcm9wZXJ0eUVyciAgICA9ICAgLTIwNjUgICAjaW52YWxpZFNwcml0ZVByb3BlcnR5RXJyCitpbnZhbGlkU3ByaXRlV29ybGRQcm9wZXJ0eUVyciAgID0gICAtMjA2NCAgICNpbnZhbGlkU3ByaXRlV29ybGRQcm9wZXJ0eUVycgorbWlzc2luZ1JlcXVpcmVkUGFyYW1ldGVyRXJyID0gICAtMjA2MyAgICNtaXNzaW5nUmVxdWlyZWRQYXJhbWV0ZXJFcnIKK21vdmllVGV4dE5vdEZvdW5kRXJyICAgID0gICAtMjA2MiAgICNtb3ZpZVRleHROb3RGb3VuZEVycgorc291cmNlTm90Rm91bmRFcnIgICA9ICAgLTIwNjEgICAjc291cmNlTm90Rm91bmRFcnIKK25vU291cmNlVHJlZUZvdW5kRXJyICAgID0gICAtMjA2MCAgICNub1NvdXJjZVRyZWVGb3VuZEVycgorc2FtcGxlc0FscmVhZHlJbk1lZGlhRXJyICAgID0gICAtMjA1OSAgICNzYW1wbGVzQWxyZWFkeUluTWVkaWFFcnIKK2F1eGlsaWFyeUV4cG9ydERhdGFVbmF2YWlsYWJsZSAgPSAgIC0yMDU4ICAgI2F1eGlsaWFyeUV4cG9ydERhdGFVbmF2YWlsYWJsZQordW5zdXBwb3J0ZWRBdXhpbGlhcnlJbXBvcnREYXRhICA9ICAgLTIwNTcgICAjdW5zdXBwb3J0ZWRBdXhpbGlhcnlJbXBvcnREYXRhCitzb3VuZFN1cHBvcnROb3RBdmFpbGFibGVFcnIgPSAgIC0yMDU2ICAgI1FUIGZvciBXaW5kb3dzIGVycm9yCitub1NvdW5kVHJhY2tJbk1vdmllRXJyICA9ICAgLTIwNTUgICAjUVQgZm9yIFdpbmRvd3MgZXJyb3IKK25vVmlkZW9UcmFja0luTW92aWVFcnIgID0gICAtMjA1NCAgICNRVCBmb3IgV2luZG93cyBlcnJvcgorZmVhdHVyZVVuc3VwcG9ydGVkICA9ICAgLTIwNTMgICAjZmVhdHVyZVVuc3VwcG9ydGVkCitjb3VsZE5vdFVzZUFuRXhpc3RpbmdTYW1wbGUgPSAgIC0yMDUyICAgI2NvdWxkTm90VXNlQW5FeGlzdGluZ1NhbXBsZQorbm9EZWZhdWx0RGF0YVJlZiAgICA9ICAgLTIwNTEgICAjbm9EZWZhdWx0RGF0YVJlZgorYmFkRGF0YVJlZkluZGV4ID0gICAtMjA1MCAgICNiYWREYXRhUmVmSW5kZXgKK2ludmFsaWREYXRhUmVmQ29udGFpbmVyID0gICAtMjA0OSAgICNpbnZhbGlkRGF0YVJlZkNvbnRhaW5lcgorbm9Nb3ZpZUZvdW5kICAgID0gICAtMjA0OCAgICNub01vdmllRm91bmQKK2RhdGFOb0RhdGFSZWYgICA9ICAgLTIwNDcgICAjZGF0YU5vRGF0YVJlZgorZW5kT2ZEYXRhUmVhY2hlZCAgICA9ICAgLTIwNDYgICAjZW5kT2ZEYXRhUmVhY2hlZAorZGF0YUFscmVhZHlDbG9zZWQgICA9ICAgLTIwNDUgICAjZGF0YUFscmVhZHlDbG9zZWQKK2RhdGFBbHJlYWR5T3BlbkZvcldyaXRlID0gICAtMjA0NCAgICNkYXRhQWxyZWFkeU9wZW5Gb3JXcml0ZQorZGF0YU5vdE9wZW5Gb3JXcml0ZSA9ICAgLTIwNDMgICAjZGF0YU5vdE9wZW5Gb3JXcml0ZQorZGF0YU5vdE9wZW5Gb3JSZWFkICA9ICAgLTIwNDIgICAjZGF0YU5vdE9wZW5Gb3JSZWFkCitpbnZhbGlkU2FtcGxlRGVzY3JpcHRpb24gICAgPSAgIC0yMDQxICAgI2ludmFsaWRTYW1wbGVEZXNjcmlwdGlvbgoraW52YWxpZENodW5rQ2FjaGUgICA9ICAgLTIwNDAgICAjaW52YWxpZENodW5rQ2FjaGUKK2ludmFsaWRTYW1wbGVEZXNjSW5kZXggID0gICAtMjAzOSAgICNpbnZhbGlkU2FtcGxlRGVzY0luZGV4CitpbnZhbGlkQ2h1bmtOdW0gPSAgIC0yMDM4ICAgI2ludmFsaWRDaHVua051bQoraW52YWxpZFNhbXBsZU51bSAgICA9ICAgLTIwMzcgICAjaW52YWxpZFNhbXBsZU51bQoraW52YWxpZFJlY3QgPSAgIC0yMDM2ICAgI2ludmFsaWRSZWN0CitjYW50RW5hYmxlVHJhY2sgPSAgIC0yMDM1ICAgI2NhbnRFbmFibGVUcmFjaworaW50ZXJuYWxRdWlja1RpbWVFcnJvciAgPSAgIC0yMDM0ICAgI2ludGVybmFsUXVpY2tUaW1lRXJyb3IKK2JhZEVkaXRJbmRleCAgICA9ICAgLTIwMzMgICAjYmFkRWRpdEluZGV4Cit0aW1lTm90SW5NZWRpYSAgPSAgIC0yMDMyICAgI3RpbWVOb3RJbk1lZGlhCit0aW1lTm90SW5UcmFjayAgPSAgIC0yMDMxICAgI3RpbWVOb3RJblRyYWNrCit0cmFja05vdEluTW92aWUgPSAgIC0yMDMwICAgI3RyYWNrTm90SW5Nb3ZpZQordHJhY2tJRE5vdEZvdW5kID0gICAtMjAyOSAgICN0cmFja0lETm90Rm91bmQKK2JhZFRyYWNrSW5kZXggICA9ICAgLTIwMjggICAjYmFkVHJhY2tJbmRleAorbWF4U2l6ZVRvR3Jvd1Rvb1NtYWxsICAgPSAgIC0yMDI3ICAgI21heFNpemVUb0dyb3dUb29TbWFsbAordXNlckRhdGFJdGVtTm90Rm91bmQgICAgPSAgIC0yMDI2ICAgI3VzZXJEYXRhSXRlbU5vdEZvdW5kCitzdGFsZUVkaXRTdGF0ZSAgPSAgIC0yMDI1ICAgI3N0YWxlRWRpdFN0YXRlCitub25NYXRjaGluZ0VkaXRTdGF0ZSAgICA9ICAgLTIwMjQgICAjbm9uTWF0Y2hpbmdFZGl0U3RhdGUKK2ludmFsaWRFZGl0U3RhdGUgICAgPSAgIC0yMDIzICAgI2ludmFsaWRFZGl0U3RhdGUKK2NhbnRDcmVhdGVTaW5nbGVGb3JrRmlsZSAgICA9ICAgLTIwMjIgICAjaGFwcGVucyB3aGVuIGZpbGUgYWxyZWFkeSBleGlzdHMKK3dmRmlsZU5vdEZvdW5kICA9ICAgLTIwMjEgICAjd2ZGaWxlTm90Rm91bmQKK21vdmllVG9vbGJveFVuaW5pdGlhbGl6ZWQgICA9ICAgLTIwMjAgICAjbW92aWVUb29sYm94VW5pbml0aWFsaXplZAorcHJvZ3Jlc3NQcm9jQWJvcnRlZCA9ICAgLTIwMTkgICAjcHJvZ3Jlc3NQcm9jQWJvcnRlZAorbWVkaWFUeXBlc0RvbnRNYXRjaCA9ICAgLTIwMTggICAjbWVkaWFUeXBlc0RvbnRNYXRjaAorYmFkRWRpdExpc3QgPSAgIC0yMDE3ICAgI2JhZEVkaXRMaXN0CitjYW50UHV0UHVibGljTW92aWVBdG9tICA9ICAgLTIwMTYgICAjY2FudFB1dFB1YmxpY01vdmllQXRvbQoraW52YWxpZFRpbWUgPSAgIC0yMDE1ICAgI2ludmFsaWRUaW1lCitpbnZhbGlkRHVyYXRpb24gPSAgIC0yMDE0ICAgI2ludmFsaWREdXJhdGlvbgoraW52YWxpZEhhbmRsZXIgID0gICAtMjAxMyAgICNpbnZhbGlkSGFuZGxlcgoraW52YWxpZERhdGFSZWYgID0gICAtMjAxMiAgICNpbnZhbGlkRGF0YVJlZgoraW52YWxpZFNhbXBsZVRhYmxlICA9ICAgLTIwMTEgICAjaW52YWxpZFNhbXBsZVRhYmxlCitpbnZhbGlkTW92aWUgICAgPSAgIC0yMDEwICAgI2ludmFsaWRNb3ZpZQoraW52YWxpZFRyYWNrICAgID0gICAtMjAwOSAgICNpbnZhbGlkVHJhY2sKK2ludmFsaWRNZWRpYSAgICA9ICAgLTIwMDggICAjaW52YWxpZE1lZGlhCitub0RhdGFIYW5kbGVyICAgPSAgIC0yMDA3ICAgI25vRGF0YUhhbmRsZXIKK25vTWVkaWFIYW5kbGVyICA9ICAgLTIwMDYgICAjbm9NZWRpYUhhbmRsZXIKK2JhZENvbXBvbmVudFR5cGUgICAgPSAgIC0yMDA1ICAgI2JhZENvbXBvbmVudFR5cGUKK2NhbnRPcGVuSGFuZGxlciA9ICAgLTIwMDQgICAjY2FudE9wZW5IYW5kbGVyCitjYW50RmluZEhhbmRsZXIgPSAgIC0yMDAzICAgI2NhbnRGaW5kSGFuZGxlcgorYmFkUHVibGljTW92aWVBdG9tICA9ICAgLTIwMDIgICAjYmFkUHVibGljTW92aWVBdG9tCitiYWRJbWFnZURlc2NyaXB0aW9uID0gICAtMjAwMSAgICNiYWRJbWFnZURlc2NyaXB0aW9uCitjb3VsZE5vdFJlc29sdmVEYXRhUmVmICA9ICAgLTIwMDAgICAjY291bGROb3RSZXNvbHZlRGF0YVJlZgorbm9uRHJhZ09yaWdpbmF0b3JFcnIgICAgPSAgIC0xODYyICAgI2lsbGVnYWwgYXR0ZW1wdCBhdCBvcmlnaW5hdG9yIG9ubHkgZGF0YQorYmFkSW1hZ2VFcnIgPSAgIC0xODYxICAgI2JhZCB0cmFuc2x1Y2VudCBpbWFnZSBQaXhNYXAKK2JhZEltYWdlUmduRXJyICA9ICAgLTE4NjAgICAjYmFkIHRyYW5zbHVjZW50IGltYWdlIHJlZ2lvbgorbm9TdWl0YWJsZURpc3BsYXlzRXJyICAgPSAgIC0xODU5ICAgI25vIGRpc3BsYXlzIHN1cHBvcnQgdHJhbnNsdWNlbmN5Cit1bnN1cHBvcnRlZEZvclBsYXRmb3JtRXJyICAgPSAgIC0xODU4ICAgI2NhbGwgaXMgZm9yIFBvd2VyUEMgb25seQorZHJhZ05vdEFjY2VwdGVkRXJyICA9ICAgLTE4NTcgICAjZHJhZyB3YXMgbm90IGFjY2VwdGVkIGJ5IHJlY2VpdmVyCitoYW5kbGVyTm90Rm91bmRFcnIgID0gICAtMTg1NiAgICNoYW5kbGVyIG5vdCBmb3VuZAorZHVwbGljYXRlSGFuZGxlckVyciA9ICAgLTE4NTUgICAjaGFuZGxlciBhbHJlYWR5IGV4aXN0cworY2FudEdldEZsYXZvckVyciAgICA9ICAgLTE4NTQgICAjZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGdldCBmbGF2b3IgZGF0YQorZHVwbGljYXRlRmxhdm9yRXJyICA9ICAgLTE4NTMgICAjZmxhdm9yIHR5cGUgYWxyZWFkeSBleGlzdHMKK2JhZERyYWdGbGF2b3JFcnIgICAgPSAgIC0xODUyICAgI3Vua25vd24gZmxhdm9yIHR5cGUKK2JhZERyYWdJdGVtRXJyICA9ICAgLTE4NTEgICAjdW5rbm93biBkcmFnIGl0ZW0gcmVmZXJlbmNlCitiYWREcmFnUmVmRXJyICAgPSAgIC0xODUwICAgI3Vua25vd24gZHJhZyByZWZlcmVuY2UKK2VyckVuZE9mQm9keSAgICA9ICAgLTE4MTMgICAjZXJyRW5kT2ZCb2R5CitlcnJFbmRPZkRvY3VtZW50ICAgID0gICAtMTgxMiAgICNlcnJFbmRPZkRvY3VtZW50CitlcnJUb3BPZkJvZHkgICAgPSAgIC0xODExICAgI2VyclRvcE9mQm9keQorZXJyVG9wT2ZEb2N1bWVudCAgICA9ICAgLTE4MTAgICAjZXJyVG9wT2ZEb2N1bWVudAorZXJyT2Zmc2V0SXNPdXRzaWRlT2ZWaWV3ICAgID0gICAtMTgwMSAgICNlcnJPZmZzZXRJc091dHNpZGVPZlZpZXcKK2Vyck9mZnNldEludmFsaWQgICAgPSAgIC0xODAwICAgI2Vyck9mZnNldEludmFsaWQKK2Vyck9TQUNhbnRPcGVuQ29tcG9uZW50ID0gICAtMTc2MiAgICNDYW4ndCBjb25uZWN0IHRvIHNjcmlwdGluZyBzeXN0ZW0gd2l0aCB0aGF0IElECitlcnJPU0FDb21wb25lbnRNaXNtYXRjaCA9ICAgLTE3NjEgICAjUGFyYW1ldGVycyBhcmUgZnJvbSAyIGRpZmZlcmVudCBjb21wb25lbnRzCitlcnJPU0FEYXRhRm9ybWF0VG9vTmV3ICA9ICAgLTE3NTkgICAjZXJyT1NBRGF0YUZvcm1hdFRvb05ldworZXJyT1NBRGF0YUZvcm1hdE9ic29sZXRlICAgID0gICAtMTc1OCAgICNlcnJPU0FEYXRhRm9ybWF0T2Jzb2xldGUKK2Vyck9TQU5vU3VjaERpYWxlY3QgPSAgIC0xNzU3ICAgI2Vyck9TQU5vU3VjaERpYWxlY3QKK2Vyck9TQVNvdXJjZU5vdEF2YWlsYWJsZSAgICA9ICAgLTE3NTYgICAjZXJyT1NBU291cmNlTm90QXZhaWxhYmxlCitlcnJPU0FCYWRTZWxlY3RvciAgID0gICAtMTc1NCAgICNlcnJPU0FCYWRTZWxlY3RvcgorZXJyT1NBU2NyaXB0RXJyb3IgICA9ICAgLTE3NTMgICAjZXJyT1NBU2NyaXB0RXJyb3IKK2Vyck9TQUJhZFN0b3JhZ2VUeXBlICAgID0gICAtMTc1MiAgICNlcnJPU0FCYWRTdG9yYWdlVHlwZQorZXJyT1NBSW52YWxpZElEID0gICAtMTc1MSAgICNlcnJPU0FJbnZhbGlkSUQKK2Vyck9TQVN5c3RlbUVycm9yICAgPSAgIC0xNzUwICAgI2Vyck9TQVN5c3RlbUVycm9yCitlcnJBRUJ1ZmZlclRvb1NtYWxsID0gICAtMTc0MSAgICNidWZmZXIgZm9yIEFFRmxhdHRlbkRlc2MgdG9vIHNtYWxsCitlcnJBRUJ1aWxkU3ludGF4RXJyb3IgICA9ICAgLTE3NDAgICAjQUVCdWlsZERlc2MgYW5kIGZyaWVuZHMgZGV0ZWN0ZWQgYSBzeW50YXggZXJyb3IKK2VyckFFRGVzY0lzTnVsbCA9ICAgLTE3MzkgICAjYXR0ZW1wdGluZyB0byBwZXJmb3JtIGFuIGludmFsaWQgb3BlcmF0aW9uIG9uIGEgbnVsbCBkZXNjcmlwdG9yCitlcnJBRVN0cmVhbUFscmVhZHlDb252ZXJ0ZWQgPSAgIC0xNzM4ICAgI2F0dGVtcHQgdG8gY29udmVydCBhIHN0cmVhbSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY29udmVydGVkCitlcnJBRVN0cmVhbUJhZE5lc3RpbmcgICA9ICAgLTE3MzcgICAjbmVzdGluZyB2aW9sYXRpb24gd2hpbGUgc3RyZWFtaW5nCitlcnJBRUR1cGxpY2F0ZUhhbmRsZXIgICA9ICAgLTE3MzYgICAjYXR0ZW1wdCB0byBpbnN0YWxsIGhhbmRsZXIgaW4gdGFibGUgZm9yIGlkZW50aWNhbCBjbGFzcyBhbmQgaWQgKDEuMSBvciBncmVhdGVyKQorZXJyQUVFdmVudEZpbHRlcmVkICA9ICAgLTE3MzUgICAjZXZlbnQgaGFzIGJlZW4gZmlsdGVyZWQsIGFuZCBzaG91bGQgbm90IGJlIHByb3BvZ2F0ZWQgKDEuMSBvciBncmVhdGVyKQorZXJyQUVSZWNlaXZlRXNjYXBlQ3VycmVudCAgID0gICAtMTczNCAgICNicmVhayBvdXQgb2Ygb25seSBsb3dlc3QgbGV2ZWwgb2YgQUVSZWNlaXZlICgxLjEgb3IgZ3JlYXRlcikKK2VyckFFUmVjZWl2ZVRlcm1pbmF0ZSAgID0gICAtMTczMyAgICNicmVhayBvdXQgb2YgYWxsIGxldmVscyBvZiBBRVJlY2VpdmUgdG8gdGhlIHRvcG1vc3QgKDEuMSBvciBncmVhdGVyKQorZXJyQUVSZWNvcmRpbmdJc0FscmVhZHlPbiAgID0gICAtMTczMiAgICNhdmFpbGFibGUgb25seSBpbiB2ZXJzaW9uIDEuMC4xIG9yIGdyZWF0ZXIKK2VyckFFVW5rbm93bk9iamVjdFR5cGUgID0gICAtMTczMSAgICNhdmFpbGFibGUgb25seSBpbiB2ZXJzaW9uIDEuMC4xIG9yIGdyZWF0ZXIKK2VyckFFRW1wdHlMaXN0Q29udGFpbmVyID0gICAtMTczMCAgICNBdHRlbXB0IHRvIHBhc3MgZW1wdHkgbGlzdCBhcyBjb250YWluZXIgdG8gYWNjZXNzb3IKK2VyckFFTmVnYXRpdmVDb3VudCAgPSAgIC0xNzI5ICAgI0NvdW50UHJvYyByZXR1cm5lZCBuZWdhdGl2ZSB2YWx1ZQorZXJyQUVOb1N1Y2hPYmplY3QgICA9ICAgLTE3MjggICAjZS5nLiw6IHNwZWNpZmllciBhc2tlZCBmb3IgdGhlIDNyZCwgYnV0IHRoZXJlIGFyZSBvbmx5IDIuIEJhc2ljYWxseSwgdGhpcyBpbmRpY2F0ZXMgYSBydW4tdGltZSByZXNvbHV0aW9uIGVycm9yLgorZXJyQUVOb3RBbk9ialNwZWMgICA9ICAgLTE3MjcgICAjUGFyYW0gdG8gQUVSZXNvbHZlIG5vdCBvZiB0eXBlICdvYmogJworZXJyQUVCYWRUZXN0S2V5ID0gICAtMTcyNiAgICNUZXN0IGlzIG5laXRoZXIgdHlwZUxvZ2ljYWxEZXNjcmlwdG9yIG5vciB0eXBlQ29tcERlc2NyaXB0b3IKK2VyckFFTm9TdWNoTG9naWNhbCAgPSAgIC0xNzI1ICAgI1NvbWV0aGluZyBvdGhlciB0aGFuIEFORCwgT1IsIG9yIE5PVAorZXJyQUVBY2Nlc3Nvck5vdEZvdW5kICAgPSAgIC0xNzIzICAgI0FjY2Vzc29yIHByb2MgbWF0Y2hpbmcgd2FudENsYXNzIGFuZCBjb250YWluZXJUeXBlIG9yIHdpbGRjYXJkcyBub3QgZm91bmQKK2VyckFFV3JvbmdOdW1iZXJBcmdzICAgID0gICAtMTcyMSAgICNMb2dpY2FsIG9wIGtBRU5PVCB1c2VkIHdpdGggb3RoZXIgdGhhbiAxIHRlcm0KK2VyckFFSW1wb3NzaWJsZVJhbmdlICAgID0gICAtMTcyMCAgICNBIHJhbmdlIGxpa2UgM3JkIHRvIDJuZCwgb3IgMXN0IHRvIGFsbC4KK2VyckFFSWxsZWdhbEluZGV4ICAgPSAgIC0xNzE5ICAgI2luZGV4IGlzIG91dCBvZiByYW5nZSBpbiBhIHB1dCBvcGVyYXRpb24KK2VyckFFUmVwbHlOb3RBcnJpdmVkICAgID0gICAtMTcxOCAgICN0aGUgY29udGVudHMgb2YgdGhlIHJlcGx5IHlvdSBhcmUgYWNjZXNzaW5nIGhhdmUgbm90IGFycml2ZWQgeWV0CitlcnJBRUhhbmRsZXJOb3RGb3VuZCAgICA9ICAgLTE3MTcgICAjbm8gaGFuZGxlciBpbiB0aGUgZGlzcGF0Y2ggdGFibGVzIGZpdHMgdGhlIHBhcmFtZXRlcnMgdG8gQUVHZXRFdmVudEhhbmRsZXIgb3IgQUVHZXRDb2VyY2lvbkhhbmRsZXIKK2VyckFFVW5rbm93bkFkZHJlc3NUeXBlID0gICAtMTcxNiAgICN0aGUgdGFyZ2V0IGFkZHJlc3MgdHlwZSBpcyBub3Qga25vd24KK2VyckFFUGFyYW1NaXNzZWQgICAgPSAgIC0xNzE1ICAgI2EgcmVxdWlyZWQgcGFyYW1ldGVyIHdhcyBub3QgYWNjZXNzZWQKK2VyckFFTm90QVNwZWNpYWxGdW5jdGlvbiAgICA9ICAgLTE3MTQgICAjdGhlcmUgaXMgbm8gc3BlY2lhbCBmdW5jdGlvbiBmb3Ivd2l0aCB0aGlzIGtleXdvcmQKK2VyckFFTm9Vc2VySW50ZXJhY3Rpb24gID0gICAtMTcxMyAgICNubyB1c2VyIGludGVyYWN0aW9uIGlzIGFsbG93ZWQKK2VyckFFVGltZW91dCAgICA9ICAgLTE3MTIgICAjdGhlIEFwcGxlRXZlbnQgdGltZWQgb3V0CitlcnJBRVdhaXRDYW5jZWxlZCAgID0gICAtMTcxMSAgICNpbiBBRVNlbmQsIHRoZSB1c2VyIGNhbmNlbGxlZCBvdXQgb2Ygd2FpdCBsb29wIGZvciByZXBseSBvciByZWNlaXB0CitlcnJBRVVua25vd25TZW5kTW9kZSAgICA9ICAgLTE3MTAgICAjbW9kZSB3YXNuJ3QgTm9SZXBseSwgV2FpdFJlcGx5LCBvciBRdWV1ZVJlcGx5IG9yIEludGVyYWN0aW9uIGxldmVsIGlzIHVua25vd24KK2VyckFFUmVwbHlOb3RWYWxpZCAgPSAgIC0xNzA5ICAgI0FFUmVzZXRUaW1lciB3YXMgcGFzc2VkIGFuIGludmFsaWQgcmVwbHkgcGFyYW1ldGVyCitlcnJBRUV2ZW50Tm90SGFuZGxlZCAgICA9ICAgLTE3MDggICAjdGhlIEFwcGxlRXZlbnQgd2FzIG5vdCBoYW5kbGVkIGJ5IGFueSBoYW5kbGVyCitlcnJBRU5vdEFwcGxlRXZlbnQgID0gICAtMTcwNyAgICN0aGUgZXZlbnQgaXMgbm90IGluIEFwcGxlRXZlbnQgZm9ybWF0CitlcnJBRU5ld2VyVmVyc2lvbiAgID0gICAtMTcwNiAgICNuZWVkIG5ld2VyIHZlcnNpb24gb2YgdGhlIEFwcGxlRXZlbnQgbWFuYWdlcgorZXJyQUVCYWRMaXN0SXRlbSAgICA9ICAgLTE3MDUgICAjdGhlIHNwZWNpZmllZCBsaXN0IGl0ZW0gZG9lcyBub3QgZXhpc3QKK2VyckFFTm90QUVEZXNjICA9ICAgLTE3MDQgICAjZXJyQUVOb3RBRURlc2MKK2VyckFFV3JvbmdEYXRhVHlwZSAgPSAgIC0xNzAzICAgI2VyckFFV3JvbmdEYXRhVHlwZQorZXJyQUVDb3JydXB0RGF0YSAgICA9ICAgLTE3MDIgICAjZXJyQUVDb3JydXB0RGF0YQorZXJyQUVEZXNjTm90Rm91bmQgICA9ICAgLTE3MDEgICAjZXJyQUVEZXNjTm90Rm91bmQKK2VyckFFQ29lcmNpb25GYWlsICAgPSAgIC0xNzAwICAgI2JhZCBwYXJhbWV0ZXIgZGF0YSBvciB1bmFibGUgdG8gY29lcmNlIHRoZSBkYXRhIHN1cHBsaWVkCitlcnJGU0l0ZXJhdG9yTm90U3VwcG9ydGVkICAgPSAgIC0xNDI0ICAgI1RoZSBpdGVyYXRvcidzIGZsYWdzIG9yIGNvbnRhaW5lciBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNhbGwKK2VyckZTSXRlcmF0b3JOb3RGb3VuZCAgID0gICAtMTQyMyAgICNQYXNzZWQgRlNJdGVyYXRvciBpcyBub3QgYW4gb3BlbiBpdGVyYXRvcgorZXJyRlNCYWRJdGVyYXRvckZsYWdzICAgPSAgIC0xNDIyICAgI0ZsYWdzIHBhc3NlZCB0byBGU09wZW5JdGVyYXRvciBhcmUgYmFkCitlcnJGU0ZvcmtFeGlzdHMgPSAgIC0xNDIxICAgI05hbWVkIGZvcmsgYWxyZWFkeSBleGlzdHMuCitlcnJGU1JlZnNEaWZmZXJlbnQgID0gICAtMTQyMCAgICNGU0NvbXBhcmVGU1JlZnM7IHJlZnMgYXJlIGZvciBkaWZmZXJlbnQgb2JqZWN0cworZXJyRlNCYWRTZWFyY2hQYXJhbXMgICAgPSAgIC0xNDE5ICAgI1NvbWV0aGluZyB3cm9uZyB3aXRoIENhdGFsb2dTZWFyY2ggc2VhcmNoUGFyYW1zCitlcnJGU0JhZEl0ZW1Db3VudCAgID0gICAtMTQxOCAgICNtYXhpbXVtSXRlbXMgd2FzIHplcm8KK2VyckZTTm9Nb3JlSXRlbXMgICAgPSAgIC0xNDE3ICAgI0l0ZXJhdGlvbiByYW4gb3V0IG9mIGl0ZW1zIHRvIHJldHVybgorZXJyRlNCYWRBbGxvY0ZsYWdzICA9ICAgLTE0MTMgICAjSW52YWxpZCBiaXRzIHNldCBpbiBhbGxvY2F0aW9uRmxhZ3MKK2VyckZTQmFkUG9zTW9kZSA9ICAgLTE0MTIgICAjTmV3bGluZSBiaXRzIHNldCBpbiBwb3NpdGlvbk1vZGUKK2VyckZTTWlzc2luZ05hbWUgICAgPSAgIC0xNDExICAgI0EgVW5pY29kZSBuYW1lIHBhcmFtZXRlciB3YXMgTlVMTCBvciBuYW1lTGVuZ3RoIHBhcmFtZXRlciB3YXMgemVybworZXJyRlNOYW1lVG9vTG9uZyAgICA9ICAgLTE0MTAgICAjRmlsZS9mb3JrIG5hbWUgaXMgdG9vIGxvbmcgdG8gY3JlYXRlL3JlbmFtZQorZXJyRlNGb3JrTm90Rm91bmQgICA9ICAgLTE0MDkgICAjTmFtZWQgZm9yayBkb2VzIG5vdCBleGlzdAorZXJyRlNOb3RBRm9sZGVyID0gICAtMTQwNyAgICNFeHBlY3RlZCBhIGZvbGRlciwgZ290IGEgZmlsZQorZXJyRlNNaXNzaW5nQ2F0SW5mbyA9ICAgLTE0MDYgICAjQSBDYXRhbG9nSW5mbyBwYXJhbWV0ZXIgd2FzIE5VTEwKK2VyckZTQmFkSW5mb0JpdG1hcCAgPSAgIC0xNDA1ICAgI0EgQ2F0YWxvZ0luZm9CaXRtYXAgb3IgVm9sdW1lSW5mb0JpdG1hcCBoYXMgcmVzZXJ2ZWQgb3IgaW52YWxpZCBiaXRzIHNldAorZXJyRlNCYWRGb3JrUmVmID0gICAtMTQwNCAgICNBIEZvcmtSZWZOdW0gcGFyYW1ldGVyIHdhcyBiYWQKK2VyckZTQmFkQnVmZmVyICA9ICAgLTE0MDMgICAjQSBidWZmZXIgcGFyYW1ldGVyIHdhcyBiYWQKK2VyckZTQmFkRm9ya05hbWUgICAgPSAgIC0xNDAyICAgI0ZvcmsgbmFtZSBwYXJhbWV0ZXIgaXMgYmFkCitlcnJGU0JhZEZTUmVmICAgPSAgIC0xNDAxICAgI0ZTUmVmIHBhcmFtZXRlciBpcyBiYWQKK2VyckZTVW5rbm93bkNhbGwgICAgPSAgIC0xNDAwICAgI3NlbGVjdG9yIGlzIG5vdCByZWNvZ25pemVkIGJ5IHRoaXMgZmlsZXN5c3RlbQorYmFkRkNCRXJyICAgPSAgIC0xMzI3ICAgI0ZDQlJlY1B0ciBpcyBub3QgdmFsaWQKK3ZvbFZNQnVzeUVyciAgICA9ICAgLTEzMTEgICAjY2FuJ3QgZWplY3QgYmVjYXVzZSB2b2x1bWUgaXMgaW4gdXNlIGJ5IFZNCitmc0RhdGFUb29CaWdFcnIgPSAgIC0xMzEwICAgI2ZpbGUgb3Igdm9sdW1lIGlzIHRvbyBiaWcgZm9yIHN5c3RlbQorZmlsZUJvdW5kc0VyciAgID0gICAtMTMwOSAgICNmaWxlJ3MgRU9GLCBvZmZzZXQsIG1hcmsgb3Igc2l6ZSBpcyB0b28gYmlnCitub3RBUmVtb3VudEVyciAgPSAgIC0xMzA4ICAgI3doZW4gX01vdW50IGFsbG93cyBvbmx5IHJlbW91bnRzIGFuZCBkb2Vzbid0IGdldCBvbmUKK2JhZEZpZEVyciAgID0gICAtMTMwNyAgICNmaWxlIGlkIGlzIGRhbmdsaW5nIG9yIGRvZXNuJ3QgbWF0Y2ggd2l0aCB0aGUgZmlsZSBudW1iZXIKK3NhbWVGaWxlRXJyID0gICAtMTMwNiAgICNjYW4ndCBleGNoYW5nZSBhIGZpbGUgd2l0aCBpdHNlbGYKK2Rlc2t0b3BEYW1hZ2VkRXJyICAgPSAgIC0xMzA1ICAgI2Rlc2t0b3AgZGF0YWJhc2UgZmlsZXMgYXJlIGNvcnJ1cHRlZAorY2F0Q2hhbmdlZEVyciAgID0gICAtMTMwNCAgICN0aGUgY2F0YWxvZyBoYXMgYmVlbiBtb2RpZmllZAorZGlmZlZvbEVyciAgPSAgIC0xMzAzICAgI2ZpbGVzIG9uIGRpZmZlcmVudCB2b2x1bWVzCitub3RBRmlsZUVyciA9ICAgLTEzMDIgICAjZGlyZWN0b3J5IHNwZWNpZmllZAorZmlkRXhpc3RzICAgPSAgIC0xMzAxICAgI2ZpbGUgaWQgYWxyZWFkeSBleGlzdHMKK2ZpZE5vdEZvdW5kID0gICAtMTMwMCAgICNubyBmaWxlIHRocmVhZCBleGlzdHMuCitlcnJSZWZOdW0gICA9ICAgLTEyODAgICAjYmFkIGNvbm5lY3Rpb24gcmVmTnVtCitlcnJBYm9ydGVkICA9ICAgLTEyNzkgICAjY29udHJvbCBjYWxsIHdhcyBhYm9ydGVkCitlcnJTdGF0ZSAgICA9ICAgLTEyNzggICAjYmFkIGNvbm5lY3Rpb24gc3RhdGUgZm9yIHRoaXMgb3BlcmF0aW9uCitlcnJPcGVuaW5nICA9ICAgLTEyNzcgICAjb3BlbiBjb25uZWN0aW9uIHJlcXVlc3QgZmFpbGVkCitlcnJBdHRlbnRpb24gICAgPSAgIC0xMjc2ICAgI2F0dGVudGlvbiBtZXNzYWdlIHRvbyBsb25nCitlcnJGd2RSZXNldCA9ICAgLTEyNzUgICAjcmVhZCB0ZXJtaW5hdGVkIGJ5IGZvcndhcmQgcmVzZXQKK2VyckRTUFF1ZXVlU2l6ZSA9ICAgLTEyNzQgICAjRFNQIFJlYWQvV3JpdGUgUXVldWUgVG9vIHNtYWxsCitlcnJPcGVuRGVuaWVkICAgPSAgIC0xMjczICAgI29wZW4gY29ubmVjdGlvbiByZXF1ZXN0IHdhcyBkZW5pZWQKK3JlcUFib3J0ZWQgID0gICAtMTEwNSAgICNyZXFBYm9ydGVkCitub0RhdGFBcmVhICA9ICAgLTExMDQgICAjbm9EYXRhQXJlYQorbm9TZW5kUmVzcCAgPSAgIC0xMTAzICAgI25vU2VuZFJlc3AKK2NiTm90Rm91bmQgID0gICAtMTEwMiAgICNjYk5vdEZvdW5kCitub1JlbEVyciAgICA9ICAgLTExMDEgICAjbm9SZWxFcnIKK2JhZEJ1ZmZOdW0gID0gICAtMTEwMCAgICNiYWRCdWZmTnVtCitiYWRBVFBTa3QgICA9ICAgLTEwOTkgICAjYmFkQVRQU2t0Cit0b29NYW55U2t0cyA9ICAgLTEwOTggICAjdG9vTWFueVNrdHMKK3Rvb01hbnlSZXFzID0gICAtMTA5NyAgICN0b29NYW55UmVxcworcmVxRmFpbGVkICAgPSAgIC0xMDk2ICAgI3JlcUZhaWxlZAorYXNwTm9BY2sgICAgPSAgIC0xMDc1ICAgI05vIGFjayBvbiBhdHRlbnRpb24gcmVxdWVzdCAoc2VydmVyIGVycikKK2FzcFRvb01hbnkgID0gICAtMTA3NCAgICNUb28gbWFueSBjbGllbnRzIChzZXJ2ZXIgZXJyb3IpCithc3BTaXplRXJyICA9ICAgLTEwNzMgICAjQ29tbWFuZCBibG9jayB0b28gYmlnCithc3BTZXNzQ2xvc2VkICAgPSAgIC0xMDcyICAgI1Nlc3Npb24gY2xvc2VkCithc3BTZXJ2ZXJCdXN5ICAgPSAgIC0xMDcxICAgI1NlcnZlciBjYW5ub3Qgb3BlbiBhbm90aGVyIHNlc3Npb24KK2FzcFBhcmFtRXJyID0gICAtMTA3MCAgICNQYXJhbWV0ZXIgZXJyb3IKK2FzcE5vU2VydmVycyAgICA9ICAgLTEwNjkgICAjTm8gc2VydmVycyBhdCB0aGF0IGFkZHJlc3MKK2FzcE5vTW9yZVNlc3MgICA9ICAgLTEwNjggICAjTm8gbW9yZSBzZXNzaW9ucyBvbiBzZXJ2ZXIKK2FzcEJ1ZlRvb1NtYWxsICA9ICAgLTEwNjcgICAjQnVmZmVyIHRvbyBzbWFsbAorYXNwQmFkVmVyc051bSAgID0gICAtMTA2NiAgICNTZXJ2ZXIgY2Fubm90IHN1cHBvcnQgdGhpcyBBU1AgdmVyc2lvbgorbmJwTklTRXJyICAgPSAgIC0xMDI5ICAgI0Vycm9yIHRyeWluZyB0byBvcGVuIHRoZSBOSVMKK25icE5vdEZvdW5kID0gICAtMTAyOCAgICNOYW1lIG5vdCBmb3VuZCBvbiByZW1vdmUKK25icER1cGxpY2F0ZSAgICA9ICAgLTEwMjcgICAjRHVwbGljYXRlIG5hbWUgZXhpc3RzIGFscmVhZHkKK25icENvbmZEaWZmID0gICAtMTAyNiAgICNOYW1lIGNvbmZpcm1lZCBhdCBkaWZmZXJlbnQgc29ja2V0CituYnBOb0NvbmZpcm0gICAgPSAgIC0xMDI1ICAgI25icE5vQ29uZmlybQorbmJwQnVmZk92ciAgPSAgIC0xMDI0ICAgI0J1ZmZlciBvdmVyZmxvdyBpbiBMb29rdXBOYW1lCitub01hc2tGb3VuZEVyciAgPSAgIC0xMDAwICAgI0ljb24gVXRpbHRpZXMgRXJyb3IKK2tGTUZvbnRDb250YWluZXJBY2Nlc3NFcnIgICA9ICAgLTk4NSAgICAja0ZNRm9udENvbnRhaW5lckFjY2Vzc0Vycgora0ZNRm9udFRhYmxlQWNjZXNzRXJyICAgPSAgIC05ODQgICAgI2tGTUZvbnRUYWJsZUFjY2Vzc0Vycgora0ZNSXRlcmF0aW9uU2NvcGVNb2RpZmllZEVyciAgICA9ICAgLTk4MyAgICAja0ZNSXRlcmF0aW9uU2NvcGVNb2RpZmllZEVycgora0ZNSW52YWxpZEZvbnRFcnIgICA9ICAgLTk4MiAgICAja0ZNSW52YWxpZEZvbnRFcnIKK2tGTUludmFsaWRGb250RmFtaWx5RXJyID0gICAtOTgxICAgICNrRk1JbnZhbGlkRm9udEZhbWlseUVycgora0ZNSXRlcmF0aW9uQ29tcGxldGVkICAgPSAgIC05ODAgICAgI2tGTUl0ZXJhdGlvbkNvbXBsZXRlZAorZ3Vlc3ROb3RBbGxvd2VkRXJyICA9ICAgLTkzMiAgICAjZGVzdGluYXRpb24gcG9ydCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbgorYmFkTG9jTmFtZUVyciAgID0gICAtOTMxICAgICNsb2NhdGlvbiBuYW1lIG1hbGZvcm1lZAorYmFkU2VydmljZU1ldGhvZEVyciA9ICAgLTkzMCAgICAjaWxsZWdhbCBzZXJ2aWNlIHR5cGUsIG9yIG5vdCBzdXBwb3J0ZWQKK25vVXNlclJlY0VyciAgICA9ICAgLTkyOCAgICAjSW52YWxpZCB1c2VyIHJlZmVyZW5jZSBudW1iZXIKK2F1dGhGYWlsRXJyID0gICAtOTI3ICAgICN1bmFibGUgdG8gYXV0aGVudGljYXRlIHVzZXIgYXQgZGVzdGluYXRpb24KK25vSW5mb3JtRXJyID0gICAtOTI2ICAgICNQUENTdGFydCBmYWlsZWQgYmVjYXVzZSBkZXN0aW5hdGlvbiBkaWQgbm90IGhhdmUgaW5mb3JtIHBlbmRpbmcKK25ldHdvcmtFcnIgID0gICAtOTI1ICAgICNBbiBlcnJvciBoYXMgb2NjdXJyZWQgaW4gdGhlIG5ldHdvcmssIG5vdCB0b28gbGlrZWx5Citub1VzZXJSZWZFcnIgICAgPSAgIC05MjQgICAgI3VuYWJsZSB0byBjcmVhdGUgYSBuZXcgdXNlclJlZk51bQorbm90TG9nZ2VkSW5FcnIgID0gICAtOTIzICAgICNUaGUgZGVmYXVsdCB1c2VyUmVmTnVtIGRvZXMgbm90IHlldCBleGlzdAorbm9EZWZhdWx0VXNlckVyciAgICA9ICAgLTkyMiAgICAjdXNlciBoYXNuJ3QgdHlwZWQgaW4gb3duZXJzIG5hbWUgaW4gTmV0d29yayBTZXR1cCBDb250cm9sIFBhbm5lbAorYmFkUG9ydE5hbWVFcnIgID0gICAtOTE5ICAgICNQUENQb3J0UmVjIG1hbGZvcm1lZAorc2Vzc0Nsb3NlZEVyciAgID0gICAtOTE3ICAgICNzZXNzaW9uIHdhcyBjbG9zZWQKK3BvcnRDbG9zZWRFcnIgICA9ICAgLTkxNiAgICAjcG9ydCB3YXMgY2xvc2VkCitub1Jlc3BvbnNlRXJyICAgPSAgIC05MTUgICAgI3VuYWJsZSB0byBjb250YWN0IGRlc3RpbmF0aW9uCitub1Rvb2xib3hOYW1lRXJyICAgID0gICAtOTE0ICAgICNBIHN5c3RlbSByZXNvdXJjZSBpcyBtaXNzaW5nLCBub3QgdG9vIGxpa2VseQorbm9NYWNoaW5lTmFtZUVyciAgICA9ICAgLTkxMyAgICAjdXNlciBoYXNuJ3QgbmFtZWQgaGlzIE1hY2ludG9zaCBpbiB0aGUgTmV0d29yayBTZXR1cCBDb250cm9sIFBhbmVsCit1c2VyUmVqZWN0RXJyICAgPSAgIC05MTIgICAgI0Rlc3RpbmF0aW9uIHJlamVjdGVkIHRoZSBzZXNzaW9uIHJlcXVlc3QKK25vVXNlck5hbWVFcnIgICA9ICAgLTkxMSAgICAjdXNlciBuYW1lIHVua25vd24gb24gZGVzdGluYXRpb24gbWFjaGluZQorcG9ydE5hbWVFeGlzdHNFcnIgICA9ICAgLTkxMCAgICAjcG9ydCBpcyBhbHJlYWR5IG9wZW4gKHBlcmhhcHMgaW4gYW5vdGhlciBhcHApCitiYWRSZXFFcnIgICA9ICAgLTkwOSAgICAjYmFkIHBhcmFtZXRlciBvciBpbnZhbGlkIHN0YXRlIGZvciBvcGVyYXRpb24KK25vU2Vzc2lvbkVyciAgICA9ICAgLTkwOCAgICAjSW52YWxpZCBzZXNzaW9uIHJlZmVyZW5jZSBudW1iZXIKK3Nlc3NUYWJsZUVyciAgICA9ICAgLTkwNyAgICAjT3V0IG9mIHNlc3Npb24gdGFibGVzLCB0cnkgYWdhaW4gbGF0ZXIKK2Rlc3RQb3J0RXJyID0gICAtOTA2ICAgICNQb3J0IGRvZXMgbm90IGV4aXN0IGF0IGRlc3RpbmF0aW9uCitsb2NhbE9ubHlFcnIgICAgPSAgIC05MDUgICAgI05ldHdvcmsgYWN0aXZpdHkgaXMgY3VycmVudGx5IGRpc2FibGVkCitub0dsb2JhbHNFcnIgICAgPSAgIC05MDQgICAgI1RoZSBzeXN0ZW0gaXMgaG9zZWQsIGJldHRlciByZS1ib290Citub1BvcnRFcnIgICA9ICAgLTkwMyAgICAjVW5hYmxlIHRvIG9wZW4gcG9ydCBvciBiYWQgcG9ydFJlZk51bS4gIElmIHlvdSdyZSBjYWxsaW5nCituYW1lVHlwZUVyciA9ICAgLTkwMiAgICAjSW52YWxpZCBvciBpbmFwcHJvcHJpYXRlIGxvY2F0aW9uS2luZFNlbGVjdG9yIGluIGxvY2F0aW9uTmFtZQorbm90SW5pdEVyciAgPSAgIC05MDAgICAgI1BQQ1Rvb2xCb3ggbm90IGluaXRpYWxpemVkCitub3RBcHByb3ByaWF0ZUZvckNsYXNzaWMgICAgPSAgIC04NzcgICAgI1RoaXMgYXBwbGljYXRpb24gd29uJ3Qgb3Igc2hvdWxkbid0IHJ1biBvbiBDbGFzc2ljIChQcm9ibGVtIDI0ODEwNTgpLgorYXBwVmVyc2lvblRvb09sZCAgICA9ICAgLTg3NiAgICAjVGhlIGFwcGxpY2F0aW9uJ3MgY3JlYXRvciBhbmQgdmVyc2lvbiBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBNYWMgT1MuCit3cm9uZ0FwcGxpY2F0aW9uUGxhdGZvcm0gICAgPSAgIC04NzUgICAgI1RoZSBhcHBsaWNhdGlvbiBjb3VsZCBub3QgbGF1bmNoIGJlY2F1c2UgdGhlIHJlcXVpcmVkIHBsYXRmb3JtIGlzIG5vdCBhdmFpbGFibGUKK2htQ2xvc2VWaWV3QWN0aXZlICAgPSAgIC04NjMgICAgI1JldHVybmVkIGZyb20gSE1SZW1vdmVCYWxsb29uIGlmIENsb3NlVmlldyB3YXMgYWN0aXZlCitobU5vQmFsbG9vblVwICAgPSAgIC04NjIgICAgI1JldHVybmVkIGZyb20gSE1SZW1vdmVCYWxsb29uIGlmIG5vIGJhbGxvb24gd2FzIHZpc2libGUgd2hlbiBjYWxsIHdhcyBtYWRlCitobU9wZXJhdGlvblVuc3VwcG9ydGVkICA9ICAgLTg2MSAgICAjUmV0dXJuZWQgZnJvbSBITVNob3dCYWxsb29uIGNhbGwgaWYgYmFkIG1ldGhvZCBwYXNzZWQgdG8gcm91dGluZQoraG1Vbmtub3duSGVscFR5cGUgICA9ICAgLTg1OSAgICAjUmV0dXJuZWQgaWYgaGVscCBtc2cgcmVjb3JkIGNvbnRhaW5lZCBhIGJhZCB0eXBlCitobVdyb25nVmVyc2lvbiAgPSAgIC04NTggICAgI1JldHVybmVkIGlmIGhlbHAgbWdyIHJlc291cmNlIHdhcyB0aGUgd3JvbmcgdmVyc2lvbgoraG1Ta2lwcGVkQmFsbG9vbiAgICA9ICAgLTg1NyAgICAjUmV0dXJuZWQgZnJvbSBjYWxscyBpZiBoZWxwbXNnIHNwZWNpZmllZCBhIHNraXAgYmFsbG9vbgoraG1IZWxwTWFuYWdlck5vdEluaXRlZCAgPSAgIC04NTUgICAgI1JldHVybmVkIGZyb20gSE1HZXRIZWxwTWVudUhhbmRsZSBpZiBoZWxwIG1lbnUgbm90IHNldHVwCitobVNhbWVBc0xhc3RCYWxsb29uID0gICAtODU0ICAgICNSZXR1cm5lZCBmcm9tIEhNU2hvd01lbnVCYWxsb29uIGlmIG1lbnUgJiBpdGVtIGlzIHNhbWUgYXMgbGFzdCB0aW1lCitobUJhbGxvb25BYm9ydGVkICAgID0gICAtODUzICAgICNSZXR1cm5lZCBpZiBtb3VzZSB3YXMgbW92aW5nIG9yIG1vdXNlIHdhc24ndCBpbiB3aW5kb3cgcG9ydCByZWN0CitobUhlbHBEaXNhYmxlZCAgPSAgIC04NTAgICAgI1Nob3cgQmFsbG9vbnMgbW9kZSB3YXMgb2ZmLCBjYWxsIHRvIHJvdXRpbmUgaWdub3JlZAorcmNEQlBhY2tOb3RJbml0ZWQgICA9ICAgLTgxMyAgICAjYXR0ZW1wdCB0byBjYWxsIG90aGVyIHJvdXRpbmUgYmVmb3JlIEluaXREQlBhY2sKK3JjREJXcm9uZ1ZlcnNpb24gICAgPSAgIC04MTIgICAgI2luY29tcGF0aWJsZSB2ZXJzaW9ucworcmNEQk5vSGFuZGxlciAgID0gICAtODExICAgICNubyBhcHAgaGFuZGxlciBmb3Igc3BlY2lmaWVkIGRhdGEgdHlwZQorcmNEQkJhZEFzeW5jUEIgID0gICAtODEwICAgICN0cmllZCB0byBraWxsIGEgYmFkIHBiCityY0RCQXN5bmNOb3RTdXBwICAgID0gICAtODA5ICAgICNkZGV2IGRvZXMgbm90IHN1cHBvcnQgYXN5bmMgY2FsbHMKK3JjREJCYWREREVWID0gICAtODA4ICAgICNiYWQgZGRldiBzcGVjaWZpZWQgb24gREJJbml0CityY0RCQmFkU2Vzc051bSAgPSAgIC04MDcgICAgI2JhZCBzZXNzaW9uIG51bWJlciBmb3IgREJHZXRDb25uSW5mbworcmNEQkJhZFNlc3NJRCAgID0gICAtODA2ICAgICNyY0RCQmFkU2Vzc0lECityY0RCRXhlYyAgICA9ICAgLTgwNSAgICAjcmNEQkV4ZWMKK3JjREJCcmVhayAgID0gICAtODA0ICAgICNyY0RCQnJlYWsKK3JjREJCYWRUeXBlID0gICAtODAzICAgICNyY0RCQmFkVHlwZQorcmNEQkVycm9yICAgPSAgIC04MDIgICAgI3JjREJFcnJvcgorcmNEQlZhbHVlICAgPSAgIC04MDEgICAgI3JjREJWYWx1ZQorcmNEQk51bGwgICAgPSAgIC04MDAgICAgI3JjREJOdWxsCitpY1Rvb01hbnlQcm9maWxlc0VyciAgICA9ICAgLTY3NyAgICAjdG9vIG1hbnkgcHJvZmlsZXMgaW4gZGF0YWJhc2UKK2ljUHJvZmlsZU5vdEZvdW5kRXJyICAgID0gICAtNjc2ICAgICNwcm9maWxlIG5vdCBmb3VuZAoraWNDb25maWdJbmFwcHJvcHJpYXRlRXJyICAgID0gICAtNjc1ICAgICNpbmNvcnJlY3QgbWFudWZhY3R1cmVyIGNvZGUKK2ljQ29uZmlnTm90Rm91bmRFcnIgPSAgIC02NzQgICAgI25vIGludGVybmV0IGNvbmZpZ3VyYXRpb24gd2FzIGZvdW5kCitpY05vVVJMRXJyICA9ICAgLTY3MyAgICAjbm8gVVJMIGZvdW5kCitpY05vdGhpbmdUb092ZXJyaWRlRXJyICA9ICAgLTY3MiAgICAjbm8gY29tcG9uZW50IGZvciB0aGUgb3ZlcnJpZGUgY29tcG9uZW50IHRvIGNhcHR1cmUKK2ljTm9Nb3JlV3JpdGVyc0VyciAgPSAgIC02NzEgICAgI3lvdSBjYW5ub3QgYmVnaW4gYSB3cml0ZSBzZXNzaW9uIGJlY2F1c2Ugc29tZW9uZSBlbHNlIGlzIGFscmVhZHkgZG9pbmcgaXQKK2ljVHJ1bmNhdGVkRXJyICA9ICAgLTY3MCAgICAjbW9yZSBkYXRhIHdhcyBwcmVzZW50IHRoYW4gd2FzIHJldHVybmVkCitpY0ludGVybmFsRXJyICAgPSAgIC02NjkgICAgI0ludGVybmV0IENvbmZpZyBpbnRlcm5hbCBlcnJvcgoraWNQcmVmRGF0YUVyciAgID0gICAtNjY4ICAgICNwcm9ibGVtIHdpdGggcHJlZmVyZW5jZSBkYXRhCitpY1Blcm1FcnIgICA9ICAgLTY2NyAgICAjY2Fubm90IHNldCBwcmVmZXJlbmNlCitpY1ByZWZOb3RGb3VuZEVyciAgID0gICAtNjY2ICAgICNJbnRlcm5ldCBwcmVmZXJlbmNlIG5vdCBmb3VuZAordm1JbnZhbGlkT3duaW5nUHJvY2Vzc0VyciAgID0gICAtNjQ4ICAgICNjdXJyZW50IHByb2Nlc3MgZG9lcyBub3Qgb3duIHRoZSBCYWNraW5nRmlsZUlEIG9yIEZpbGVWaWV3SUQKK3ZtQWRkcmVzc05vdEluRmlsZVZpZXdFcnIgICA9ICAgLTY0NyAgICAjYWRkcmVzcyBpcyBub3QgaW4gYSBGaWxlVmlldwordm1Ob01vcmVGaWxlVmlld3NFcnIgICAgPSAgIC02NDYgICAgI25vIG1vcmUgRmlsZVZpZXdzIHdlcmUgZm91bmQKK3ZtRmlsZVZpZXdBY2Nlc3NFcnIgPSAgIC02NDUgICAgI3JlcXVlc3RlZCBGaWxlVmlld0FjY2VzcyBjYW5ub3QgYmUgb2J0YWluZWQKK3ZtSW52YWxpZEZpbGVWaWV3SURFcnIgID0gICAtNjQ0ICAgICNpbnZhbGlkIEZpbGVWaWV3SUQKK3ZtTm9Nb3JlQmFja2luZ0ZpbGVzRXJyID0gICAtNjQzICAgICNubyBtb3JlIEJhY2tpbmdGaWxlcyB3ZXJlIGZvdW5kCit2bUJ1c3lCYWNraW5nRmlsZUVyciAgICA9ICAgLTY0MiAgICAjb3BlbiB2aWV3cyBmb3VuZCBvbiBCYWNraW5nRmlsZQordm1NYXBwaW5nUHJpdmlsZWdlc0VyciAgPSAgIC02NDEgICAgI3JlcXVlc3RlZCBNYXBwaW5nUHJpdmlsZWdlcyBjYW5ub3QgYmUgb2J0YWluZWQKK3ZtSW52YWxpZEJhY2tpbmdGaWxlSURFcnIgICA9ICAgLTY0MCAgICAjaW52YWxpZCBCYWNraW5nRmlsZUlECitub01NVUVyciAgICA9ICAgLTYyNiAgICAjbm8gTU1VIHByZXNlbnQKK2Nhbm5vdERlZmVyRXJyICA9ICAgLTYyNSAgICAjdW5hYmxlIHRvIGRlZmVyIGFkZGl0aW9uYWwgZnVuY3Rpb25zCitpbnRlcnJ1cHRzTWFza2VkRXJyID0gICAtNjI0ICAgICNkb27VdCBjYWxsIHdpdGggaW50ZXJydXB0cyBtYXNrZWQKK25vdExvY2tlZEVyciAgICA9ICAgLTYyMyAgICAjc3BlY2lmaWVkIHJhbmdlIG9mIG1lbW9yeSBpcyBub3QgbG9ja2VkCitjYW5ub3RNYWtlQ29udGlndW91c0VyciA9ICAgLTYyMiAgICAjY2Fubm90IG1ha2Ugc3BlY2lmaWVkIHJhbmdlIGNvbnRpZ3VvdXMKK25vdEhlbGRFcnIgID0gICAtNjIxICAgICNzcGVjaWZpZWQgcmFuZ2Ugb2YgbWVtb3J5IGlzIG5vdCBoZWxkCitub3RFbm91Z2hNZW1vcnlFcnIgID0gICAtNjIwICAgICNpbnN1ZmZpY2llbnQgcGh5c2ljYWwgbWVtb3J5Cit0aHJlYWRQcm90b2NvbEVyciAgID0gICAtNjE5ICAgICN0aHJlYWRQcm90b2NvbEVycgordGhyZWFkTm90Rm91bmRFcnIgICA9ICAgLTYxOCAgICAjdGhyZWFkTm90Rm91bmRFcnIKK3RocmVhZFRvb01hbnlSZXFzRXJyICAgID0gICAtNjE3ICAgICN0aHJlYWRUb29NYW55UmVxc0Vycgorbm9Vc2VySW50ZXJhY3Rpb25BbGxvd2VkICAgID0gICAtNjEwICAgICNubyB1c2VyIGludGVyYWN0aW9uIGFsbG93ZWQKK2Nvbm5lY3Rpb25JbnZhbGlkICAgPSAgIC02MDkgICAgI2Nvbm5lY3Rpb25JbnZhbGlkCitub091dHN0YW5kaW5nSExFICAgID0gICAtNjA4ICAgICNub091dHN0YW5kaW5nSExFCitidWZmZXJJc1NtYWxsICAgPSAgIC02MDcgICAgI2Vycm9yIHJldHVybnMgZnJvbSBQb3N0IGFuZCBBY2NlcHQKK2FwcElzRGFlbW9uID0gICAtNjA2ICAgICNhcHAgaXMgQkctb25seSwgYW5kIGxhdW5jaCBmbGFncyBkaXNhbGxvdyB0aGlzCithcHBNZW1GdWxsRXJyICAgPSAgIC02MDUgICAgI2FwcGxpY2F0aW9uIFNJWkUgbm90IGJpZyBlbm91Z2ggZm9yIGxhdW5jaAoraGFyZHdhcmVDb25maWdFcnIgICA9ICAgLTYwNCAgICAjaGFyZHdhcmUgY29uZmlndXJhdGlvbiBub3QgY29ycmVjdCBmb3IgY2FsbAorcHJvdG9jb2xFcnIgPSAgIC02MDMgICAgI2FwcCBtYWRlIG1vZHVsZSBjYWxscyBpbiBpbXByb3BlciBvcmRlcgorYXBwTW9kZUVyciAgPSAgIC02MDIgICAgI21lbW9yeSBtb2RlIGlzIDMyLWJpdCwgYnV0IGFwcCBub3QgMzItYml0IGNsZWFuCittZW1GcmFnRXJyICA9ICAgLTYwMSAgICAjbm90IGVub3VnaCByb29tIHRvIGxhdW5jaCBhcHAgdy9zcGVjaWFsIHJlcXVpcmVtZW50cworcHJvY05vdEZvdW5kICAgID0gICAtNjAwICAgICNubyBlbGlnaWJsZSBwcm9jZXNzIHdpdGggc3BlY2lmaWVkIGRlc2NyaXB0b3IKK2RyaXZlckhhcmR3YXJlR29uZUVyciAgID0gICAtNTAzICAgICNkaXNrIGRyaXZlcidzIGhhcmR3YXJlIHdhcyBkaXNjb25uZWN0ZWQKK2h3UGFyYW1FcnIgID0gICAtNTAyICAgICNiYWQgc2VsZWN0b3IgZm9yIF9IV1ByaXYKK3RlU2NyYXBTaXplRXJyICA9ICAgLTUwMSAgICAjc2NyYXAgaXRlbSB0b28gYmlnIGZvciB0ZXh0IGVkaXQgcmVjb3JkCityZ25Ub29CaWdFcnIgICAgPSAgIC01MDAgICAgI3JnblRvb0JpZ0VycgorZXhVc2VyQnJlYWsgPSAgIC00OTIgICAgI3VzZXIgZGVidWdnZXIgYnJlYWs7IGV4ZWN1dGUgZGVidWdnZXIgY29tbWFuZHMgb24gc3RhY2sKK3N0clVzZXJCcmVhayAgICA9ICAgLTQ5MSAgICAjdXNlciBkZWJ1Z2dlciBicmVhazsgZGlzcGxheSBzdHJpbmcgb24gc3RhY2sKK3VzZXJCcmVhayAgID0gICAtNDkwICAgICN1c2VyIGRlYnVnZ2VyIGJyZWFrCitub3RUaGVQdWJsaXNoZXJXcm4gID0gICAtNDYzICAgICNub3QgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgcHVibGlzaGVyIGZvciB0aGF0IGNvbnRhaW5lcgorY29udGFpbmVyQWxyZWFkeU9wZW5Xcm4gPSAgIC00NjIgICAgI2NvbnRhaW5lciBhbHJlYWR5IG9wZW5lZCBieSB0aGlzIHNlY3Rpb24KK2NvbnRhaW5lck5vdEZvdW5kV3JuICAgID0gICAtNDYxICAgICNjb3VsZCBub3QgZmluZCBlZGl0aW9uQ29udGFpbmVyIGF0IHRoaXMgdGltZQorbXVsdGlwbGVQdWJsaXNoZXJXcm4gICAgPSAgIC00NjAgICAgI0EgUHVibGlzaGVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdGhhdCBjb250YWluZXIKK2JhZFN1YlBhcnRFcnIgICA9ICAgLTQ1NCAgICAjY2FuIG5vdCB1c2Ugc3ViIHBhcnRzIGluIHRoaXMgcmVsZWFzZQorYmFkRWRpdGlvbkZpbGVFcnIgICA9ICAgLTQ1MyAgICAjZWRpdGlvbiBmaWxlIGlzIGNvcnJ1cHQKK25vdFJlZ2lzdGVyZWRTZWN0aW9uRXJyID0gICAtNDUyICAgICNub3QgYSByZWdpc3RlcmVkIFNlY3Rpb25SZWNvcmQKK2JhZFNlY3Rpb25FcnIgICA9ICAgLTQ1MSAgICAjbm90IGEgdmFsaWQgU2VjdGlvblJlY29yZAorZWRpdGlvbk1nckluaXRFcnIgICA9ICAgLTQ1MCAgICAjZWRpdGlvbiBtYW5hZ2VyIG5vdCBpbml0ZWQgYnkgdGhpcyBhcHAKK2ZzbVVua25vd25GU01NZXNzYWdlRXJyID0gICAtNDM4ICAgICN1bmtub3duIG1lc3NhZ2UgcGFzc2VkIHRvIEZTTQorZnNtTm9BbHRlcm5hdGVTdGFja0VyciAgPSAgIC00MzcgICAgI25vIGFsdGVybmF0ZSBzdGFjayBmb3IgSEZTIENJCitmc21CYWRGU0RWZXJzaW9uRXJyID0gICAtNDM2ICAgICNGU00gdmVyc2lvbiBpbmNvbXBhdGlibGUgd2l0aCBGU0QKK2ZzbUR1cGxpY2F0ZUZTSURFcnIgPSAgIC00MzUgICAgI0ZTSUQgYWxyZWFkeSBleGlzdHMgb24gSW5zdGFsbEZTCitmc21CYWRGU0RMZW5FcnIgPSAgIC00MzQgICAgI0ZTRCBzaXplIGluY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQgRlNNIHZlcnMKK2ZzbUJhZEZGU05hbWVFcnIgICAgPSAgIC00MzMgICAgI05hbWUgbGVuZ3RoIG5vdCAxIDw9IGxlbmd0aCA8PSAzMQorZnNtQnVzeUZGU0VyciAgID0gICAtNDMyICAgICNGaWxlIHN5c3RlbSBpcyBidXN5LCBjYW5ub3QgYmUgcmVtb3ZlZAorZnNtRkZTTm90Rm91bmRFcnIgICA9ICAgLTQzMSAgICAjRm9yZWlnbiBGaWxlIHN5c3RlbSBkb2VzIG5vdCBleGlzdCAtIG5ldyBQYWNrMiBjb3VsZCByZXR1cm4gdGhpcyBlcnJvciB0b28KK2J0S2V5QXR0ckVyciAgICA9ICAgLTQxNyAgICAjVGhlcmUgaXMgbm8gc3VjaCBhIGtleSBhdHRyaWJ1dGUuCitidEtleUxlbkVyciA9ICAgLTQxNiAgICAjTWF4aW11bSBrZXkgbGVuZ3RoIGlzIHRvbyBsb25nIG9yIGVxdWFsIHRvIHplcm8uCitidFJlY05vdEZuZCA9ICAgLTQxNSAgICAjUmVjb3JkIGNhbm5vdCBiZSBmb3VuZC4KK2J0RHVwUmVjRXJyID0gICAtNDE0ICAgICNSZWNvcmQgYWxyZWFkeSBleGlzdHMuCitidE5vU3BhY2UgICA9ICAgLTQxMyAgICAjQ2FuJ3QgYWxsb2NhdGUgZGlzayBzcGFjZS4KK25vdEJUcmVlICAgID0gICAtNDEwICAgICNUaGUgZmlsZSBpcyBub3QgYSBkaWN0aW9uYXJ5LgorZ2NyT25NRk1FcnIgPSAgIC00MDAgICAgI2djciBmb3JtYXQgb24gaGlnaCBkZW5zaXR5IG1lZGlhIGVycm9yCitzbG90TnVtRXJyICA9ICAgLTM2MCAgICAjaW52YWxpZCBzbG90ICMgZXJyb3IKK3NtUmVjTm90Rm5kID0gICAtMzUxICAgICNSZWNvcmQgbm90IGZvdW5kIGluIHRoZSBTUlQuCitzbVNSVE92ckZsRXJyICAgPSAgIC0zNTAgICAgI1NSVCBvdmVyIGZsb3cuCitzbU5vR29vZE9wZW5zICAgPSAgIC0zNDkgICAgI05vIG9wZW5zIHdlcmUgc3VjY2Vzc2Z1bGwgaW4gdGhlIGxvb3AuCitzbU9mZnNldEVyciA9ICAgLTM0OCAgICAjT2Zmc2V0IHdhcyB0b28gYmlnICh0ZW1wb3JhcnkgZXJyb3IKK3NtQnl0ZUxhbmVzRXJyICA9ICAgLTM0NyAgICAjTnVtQnl0ZUxhbmVzIHdhcyBkZXRlcm1pbmVkIHRvIGJlIHplcm8uCitzbUJhZHNQdHJFcnIgICAgPSAgIC0zNDYgICAgI0JhZCBwb2ludGVyIHdhcyBwYXNzZWQgdG8gc0NhbGNzUG9pbnRlcgorc21zR2V0RHJ2ckVyciAgID0gICAtMzQ1ICAgICNFcnJvciBvY2N1cnJlZCBkdXJpbmcgX3NHZXREcml2ZXIuCitzbU5vTW9yZXNSc3JjcyAgPSAgIC0zNDQgICAgI05vIG1vcmUgc1Jlc291cmNlcworc21EaXNEcnZyTmFtRXJyID0gICAtMzQzICAgICNFcnJvciBvY2N1cnJlZCBkdXJpbmcgX3NEaXNEcnZyTmFtZS4KK3NtR2V0RHJ2ck5hbUVyciA9ICAgLTM0MiAgICAjRXJyb3Igb2NjdXJyZWQgZHVyaW5nIF9zR2V0RHJ2ck5hbWUuCitzbUNrU3RhdHVzRXJyICAgPSAgIC0zNDEgICAgI1N0YXR1cyBvZiBzbG90ID0gZmFpbC4KK3NtQmxrTW92ZUVyciAgICA9ICAgLTM0MCAgICAjX0Jsb2NrTW92ZSBlcnJvcgorc21OZXdQRXJyICAgPSAgIC0zMzkgICAgI19OZXdQdHIgZXJyb3IKK3NtU2VsT09CRXJyID0gICAtMzM4ICAgICNTZWxlY3RvciBvdXQgb2YgYm91bmRzIGVycm9yCitzbVNsb3RPT0JFcnIgICAgPSAgIC0zMzcgICAgI1Nsb3Qgb3V0IG9mIGJvdW5kcyBlcnJvcgorc21OaWxzQmxvY2tFcnIgID0gICAtMzM2ICAgICNOaWwgc0Jsb2NrIGVycm9yIChEb250IGFsbG9jYXRlIGFuZCB0cnkgdG8gdXNlIGEgbmlsIHNCbG9jaykKK3Ntc1BvaW50ZXJOaWwgICA9ICAgLTMzNSAgICAjTFBvaW50ZXIgaXMgbmlsIEZyb20gc09mZnNldERhdGEuIElmIHRoaXMgZXJyb3Igb2NjdXJzOyBjaGVjayBzSW5mbyByZWMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCitzbUNQVUVyciAgICA9ICAgLTMzNCAgICAjQ29kZSByZXZpc2lvbiBpcyB3cm9uZworc21Db2RlUmV2RXJyICAgID0gICAtMzMzICAgICNDb2RlIHJldmlzaW9uIGlzIHdyb25nCitzbVJlc2VydmVkRXJyICAgPSAgIC0zMzIgICAgI1Jlc2VydmVkIGZpZWxkIG5vdCB6ZXJvCitzbUJhZHNMaXN0ICA9ICAgLTMzMSAgICAjQmFkIHNMaXN0OiBJZDEgPCBJZDIgPCBJZDMgLi4uZm9ybWF0IGlzIG5vdCBmb2xsb3dlZC4KK3NtQmFkUmVmSWQgID0gICAtMzMwICAgICNSZWZlcmVuY2UgSWQgbm90IGZvdW5kIGluIExpc3QKK3NtQnVzRXJyVE8gID0gICAtMzIwICAgICNCdXNFcnJvciB0aW1lIG91dC4KK3NtQmFkQm9hcmRJZCAgICA9ICAgLTMxOSAgICAjQm9hcmRJZCB3YXMgd3Jvbmc7IHJlLWluaXQgdGhlIFBSQU0gcmVjb3JkLgorc21SZXNlcnZlZFNsb3QgID0gICAtMzE4ICAgICNzbG90IGlzIHJlc2VydmVkLCBWTSBzaG91bGQgbm90IHVzZSB0aGlzIGFkZHJlc3Mgc3BhY2UuCitzbUluaXRUYmxWRXJyICAgPSAgIC0zMTcgICAgI0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBpbml0aWFsaXplIHRoZSBTbG90IFJlc291cmNlIFRhYmxlLgorc21Jbml0U3RhdFZFcnIgID0gICAtMzE2ICAgICNUaGUgSW5pdFN0YXR1c1YgZmllbGQgd2FzIG5lZ2F0aXZlIGFmdGVyIHByaW1hcnkgb3Igc2Vjb25kYXJ5IGluaXQuCitzbU5vQm9hcmRJZCA9ICAgLTMxNSAgICAjTm8gQm9hcmQgSWQuCitzbUdldFBSRXJyICA9ICAgLTMxNCAgICAjRXJyb3Igb2NjdXJyZWQgZHVyaW5nIF9zR2V0UFJBTVJlYyAoU2VlIFNJTVN0YXR1cykuCitzbU5vQm9hcmRTUnNyYyAgPSAgIC0zMTMgICAgI05vIEJvYXJkIHNSZXNvdXJjZS4KK3NtRGlzcG9zZVBFcnIgICA9ICAgLTMxMiAgICAjX0Rpc3Bvc2VQb2ludGVyIGVycm9yCitzbUZIQmxrRGlzcEVyciAgPSAgIC0zMTEgICAgI0Vycm9yIG9jY3VycmVkIGR1cmluZyBfc0Rpc3Bvc2VQdHIgKERpc3Bvc2Ugb2YgRkhlYWRlciBibG9jaykuCitzbUZIQmxvY2tSZEVyciAgPSAgIC0zMTAgICAgI0Vycm9yIG9jY3VycmVkIGR1cmluZyBfc0dldEZIZWFkZXIuCitzbUJMRmllbGRCYWQgICAgPSAgIC0zMDkgICAgI0J5dGVMYW5lcyBmaWVsZCB3YXMgYmFkLgorc21VbkV4QnVzRXJyICAgID0gICAtMzA4ICAgICNVbmV4cGVjdGVkIEJ1c0Vycm9yCitzbVJlc3J2RXJyICA9ICAgLTMwNyAgICAjRmF0YWwgcmVzZXJ2ZWQgZXJyb3IuIFJlc2VydmVkIGZpZWxkICE9IDAuCitzbU5vc0luZm9BcnJheSAgPSAgIC0zMDYgICAgI05vIHNJbmZvQXJyYXkuIE1lbW9yeSBNZ3IgZXJyb3IuCitzbURpc2FibGVkU2xvdCAgPSAgIC0zMDUgICAgI1RoaXMgc2xvdCBpcyBkaXNhYmxlZCAoLTMwNSB1c2UgdG8gYmUgc21MV1RzdEJhZCkKK3NtTm9EaXIgPSAgIC0zMDQgICAgI0RpcmVjdG9yeSBvZmZzZXQgaXMgTmlsCitzbVJldmlzaW9uRXJyICAgPSAgIC0zMDMgICAgI1dyb25nIHJldmlzb24gbGV2ZWwKK3NtRm9ybWF0RXJyID0gICAtMzAyICAgICNGSGVhZGVyIEZvcm1hdCBpcyBub3QgQXBwbGUncworc21DUkNGYWlsICAgPSAgIC0zMDEgICAgI0NSQyBjaGVjayBmYWlsZWQgZm9yIGRlY2xhcmF0aW9uIGRhdGEKK3NtRW1wdHlTbG90ID0gICAtMzAwICAgICNObyBjYXJkIGluIHNsb3QKK25tVHlwRXJyICAgID0gICAtMjk5ICAgICNOb3RpZmljYXRpb24gTWFuYWdlcjp3cm9uZyBxdWV1ZSB0eXBlCitzbVByaUluaXRFcnIgICAgPSAgIC0yOTMgICAgI0Vycm9yOyBDYXJkcyBjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWQuCitzbVBSQU1Jbml0RXJyICAgPSAgIC0yOTIgICAgI0Vycm9yOyBTbG90IFJlc291cmNlIFRhYmxlIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KK3NtU1JUSW5pdEVyciAgICA9ICAgLTI5MSAgICAjRXJyb3I7IFNsb3QgUmVzb3VyY2UgVGFibGUgY291bGQgbm90IGJlIGluaXRpYWxpemVkLgorc21TRE1Jbml0RXJyICAgID0gICAtMjkwICAgICNFcnJvcjsgU0RNIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC4KK21pZGlJbnZhbGlkQ21kRXJyICAgPSAgIC0yNjEgICAgI2NvbW1hbmQgbm90IHN1cHBvcnRlZCBmb3IgcG9ydCB0eXBlCittaWRpRHVwSURFcnIgICAgPSAgIC0yNjAgICAgI2R1cGxpY2F0ZSBjbGllbnQgSUQKK21pZGlOYW1lTGVuRXJyICA9ICAgLTI1OSAgICAjbmFtZSBzdXBwbGllZCBpcyBsb25nZXIgdGhhbiAzMSBjaGFyYWN0ZXJzCittaWRpV3JpdGVFcnIgICAgPSAgIC0yNTggICAgI01JRElXcml0ZVBhY2tldCBjb3VsZG4ndCB3cml0ZSB0byBhbGwgY29ubmVjdGVkIHBvcnRzCittaWRpTm9Db25FcnIgICAgPSAgIC0yNTcgICAgI25vIGNvbm5lY3Rpb24gZXhpc3RzIGJldHdlZW4gc3BlY2lmaWVkIHBvcnRzCittaWRpVkNvbm5lY3RSbXZkICAgID0gICAtMjU2ICAgICNwZW5kaW5nIHZpcnR1YWwgY29ubmVjdGlvbiByZW1vdmVkCittaWRpVkNvbm5lY3RNYWRlICAgID0gICAtMjU1ICAgICNwZW5kaW5nIHZpcnR1YWwgY29ubmVjdGlvbiByZXNvbHZlZAorbWlkaVZDb25uZWN0RXJyID0gICAtMjU0ICAgICNwZW5kaW5nIHZpcnR1YWwgY29ubmVjdGlvbiBjcmVhdGVkCittaWRpVG9vTWFueUNvbnNFcnIgID0gICAtMjUzICAgICN0b28gbWFueSBjb25uZWN0aW9ucyBtYWRlCittaWRpVG9vTWFueVBvcnRzRXJyID0gICAtMjUyICAgICN0b28gbWFueSBwb3J0cyBhbHJlYWR5IGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtCittaWRpTm9Qb3J0RXJyICAgPSAgIC0yNTEgICAgI25vIHBvcnQgd2l0aCB0aGF0IElEIGZvdW5kCittaWRpTm9DbGllbnRFcnIgPSAgIC0yNTAgICAgI25vIGNsaWVudCB3aXRoIHRoYXQgSUQgZm91bmQKK2JhZElucHV0VGV4dCAgICA9ICAgLTI0NyAgICAjYmFkSW5wdXRUZXh0CitiYWREaWN0Rm9ybWF0ICAgPSAgIC0yNDYgICAgI2JhZERpY3RGb3JtYXQKK2luY29tcGF0aWJsZVZvaWNlICAgPSAgIC0yNDUgICAgI2luY29tcGF0aWJsZVZvaWNlCit2b2ljZU5vdEZvdW5kICAgPSAgIC0yNDQgICAgI3ZvaWNlTm90Rm91bmQKK2J1ZlRvb1NtYWxsID0gICAtMjQzICAgICNidWZUb29TbWFsbAorc3ludGhOb3RSZWFkeSAgID0gICAtMjQyICAgICNzeW50aE5vdFJlYWR5CitzeW50aE9wZW5GYWlsZWQgPSAgIC0yNDEgICAgI3N5bnRoT3BlbkZhaWxlZAorbm9TeW50aEZvdW5kICAgID0gICAtMjQwICAgICNub1N5bnRoRm91bmQKK3NpVW5rbm93blF1YWxpdHkgICAgPSAgIC0yMzIgICAgI2ludmFsaWQgcXVhbGl0eSBzZWxlY3RvciAocmV0dXJuZWQgYnkgZHJpdmVyKQorc2lVbmtub3duSW5mb1R5cGUgICA9ICAgLTIzMSAgICAjaW52YWxpZCBpbmZvIHR5cGUgc2VsZWN0b3IgKHJldHVybmVkIGJ5IGRyaXZlcikKK3NpSW5wdXREZXZpY2VFcnIgICAgPSAgIC0yMzAgICAgI2lucHV0IGRldmljZSBoYXJkd2FyZSBmYWlsdXJlCitzaUJhZFJlZk51bSA9ICAgLTIyOSAgICAjaW52YWxpZCBpbnB1dCBkZXZpY2UgcmVmZXJlbmNlIG51bWJlcgorc2lCYWREZXZpY2VOYW1lID0gICAtMjI4ICAgICNpbnB1dCBkZXZpY2UgY291bGQgbm90IGJlIG9wZW5lZAorc2lEZXZpY2VCdXN5RXJyID0gICAtMjI3ICAgICNpbnB1dCBkZXZpY2UgYWxyZWFkeSBpbiB1c2UKK3NpSW52YWxpZFNhbXBsZVNpemUgPSAgIC0yMjYgICAgI2ludmFsaWQgc2FtcGxlIHNpemUKK3NpSW52YWxpZFNhbXBsZVJhdGUgPSAgIC0yMjUgICAgI2ludmFsaWQgc2FtcGxlIHJhdGUKK3NpSGFyZERyaXZlVG9vU2xvdyAgPSAgIC0yMjQgICAgI2hhcmQgZHJpdmUgdG9vIHNsb3cgdG8gcmVjb3JkIHRvIGRpc2sKK3NpSW52YWxpZENvbXByZXNzaW9uICAgID0gICAtMjIzICAgICNpbnZhbGlkIGNvbXByZXNzaW9uIHR5cGUKK3NpTm9CdWZmZXJTcGVjaWZpZWQgPSAgIC0yMjIgICAgI3JldHVybmVkIGJ5IHN5bmNocm9ub3VzIFNQQlJlY29yZCBpZiBuaWwgYnVmZmVyIHBhc3NlZAorc2lCYWRTb3VuZEluRGV2aWNlICA9ICAgLTIyMSAgICAjaW52YWxpZCBpbmRleCBwYXNzZWQgdG8gU291bmRJbkdldEluZGV4ZWREZXZpY2UKK3NpTm9Tb3VuZEluSGFyZHdhcmUgPSAgIC0yMjAgICAgI25vIFNvdW5kIElucHV0IGhhcmR3YXJlCitzaVZCUkNvbXByZXNzaW9uTm90U3VwcG9ydGVkICAgID0gICAtMjEzICAgICN2YnIgYXVkaW8gY29tcHJlc3Npb24gbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBvcGVyYXRpb24KK25vTW9yZVJlYWxUaW1lICA9ICAgLTIxMiAgICAjbm90IGVub3VnaCBDUFUgY3ljbGVzIGxlZnQgdG8gYWRkIGFub3RoZXIgdGFzaworY2hhbm5lbE5vdEJ1c3kgID0gICAtMjExICAgICNjaGFubmVsTm90QnVzeQorYnVmZmVyc1Rvb1NtYWxsID0gICAtMjEwICAgICNjYW4gbm90IG9wZXJhdGUgaW4gdGhlIG1lbW9yeSBhbGxvd2VkCitjaGFubmVsQnVzeSA9ICAgLTIwOSAgICAjdGhlIENoYW5uZWwgaXMgYmVpbmcgdXNlZCBmb3IgYSBQRkQgYWxyZWFkeQorYmFkRmlsZUZvcm1hdCAgID0gICAtMjA4ICAgICN3YXMgbm90IHR5cGUgQUlGRiBvciB3YXMgb2YgYmFkIGZvcm1hdCxjb3JydXB0Citub3RFbm91Z2hCdWZmZXJTcGFjZSAgICA9ICAgLTIwNyAgICAjY291bGQgbm90IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkKK2JhZEZvcm1hdCAgID0gICAtMjA2ICAgICNTb3VuZCBNYW5hZ2VyIEVycm9yIFJldHVybnMKK2JhZENoYW5uZWwgID0gICAtMjA1ICAgICNTb3VuZCBNYW5hZ2VyIEVycm9yIFJldHVybnMKK3Jlc1Byb2JsZW0gID0gICAtMjA0ICAgICNTb3VuZCBNYW5hZ2VyIEVycm9yIFJldHVybnMKK3F1ZXVlRnVsbCAgID0gICAtMjAzICAgICNTb3VuZCBNYW5hZ2VyIEVycm9yIFJldHVybnMKK25vdEVub3VnaEhhcmR3YXJlRXJyICAgID0gICAtMjAxICAgICNTb3VuZCBNYW5hZ2VyIEVycm9yIFJldHVybnMKK25vSGFyZHdhcmVFcnIgICA9ICAgLTIwMCAgICAjU291bmQgTWFuYWdlciBFcnJvciBSZXR1cm5zCittYXBSZWFkRXJyICA9ICAgLTE5OSAgICAjbWFwIGluY29uc2lzdGVudCB3aXRoIG9wZXJhdGlvbgorcmVzQXR0ckVyciAgPSAgIC0xOTggICAgI2F0dHJpYnV0ZSBpbmNvbnNpc3RlbnQgd2l0aCBvcGVyYXRpb24KK3JtdlJlZkZhaWxlZCAgICA9ICAgLTE5NyAgICAjUm12ZVJlZmVyZW5jZSBmYWlsZWQKK3JtdlJlc0ZhaWxlZCAgICA9ICAgLTE5NiAgICAjUm12ZVJlc291cmNlIGZhaWxlZAorYWRkUmVmRmFpbGVkICAgID0gICAtMTk1ICAgICNBZGRSZWZlcmVuY2UgZmFpbGVkCithZGRSZXNGYWlsZWQgICAgPSAgIC0xOTQgICAgI0FkZFJlc291cmNlIGZhaWxlZAorcmVzRk5vdEZvdW5kICAgID0gICAtMTkzICAgICNSZXNvdXJjZSBmaWxlIG5vdCBmb3VuZAorcmVzTm90Rm91bmQgPSAgIC0xOTIgICAgI1Jlc291cmNlIG5vdCBmb3VuZAoraW5wdXRPdXRPZkJvdW5kcyAgICA9ICAgLTE5MCAgICAjT2Zmc2V0IG9mIENvdW50IG91dCBvZiBib3VuZHMKK3dyaXRpbmdQYXN0RW5kICA9ICAgLTE4OSAgICAjV3JpdGluZyBwYXN0IGVuZCBvZiBmaWxlCityZXNvdXJjZUluTWVtb3J5ICAgID0gICAtMTg4ICAgICNSZXNvdXJjZSBhbHJlYWR5IGluIG1lbW9yeQorQ2FudERlY29tcHJlc3MgID0gICAtMTg2ICAgICNyZXNvdXJjZSBiZW50ICgidGhlIGJlbmRzIikgLSBjYW4ndCBkZWNvbXByZXNzIGEgY29tcHJlc3NlZCByZXNvdXJjZQorYmFkRXh0UmVzb3VyY2UgID0gICAtMTg1ICAgICNleHRlbmRlZCByZXNvdXJjZSBoYXMgYSBiYWQgZm9ybWF0LgorY21Ob0N1cnJlbnRQcm9maWxlICA9ICAgLTE4MiAgICAjUmVzcG9uZGVyIGVycm9yCitjbVVuc3VwcG9ydGVkRGF0YVR5cGUgICA9ICAgLTE4MSAgICAjUmVzcG9uZGVyIGVycm9yCitjbUNhbnREZWxldGVQcm9maWxlID0gICAtMTgwICAgICNSZXNwb25kZXIgZXJyb3IKK2NtQ2FudFhZWiAgID0gICAtMTc5ICAgICNDTU0gY2FudCBoYW5kbGUgWFlaIHNwYWNlCitjbUNhbnRDb25jYXRlbmF0ZUVycm9yICA9ICAgLTE3OCAgICAjUHJvZmlsZSBjYW4ndCBiZSBjb25jYXRlbmF0ZWQKK2NtUHJvZmlsZXNJZGVudGljYWwgPSAgIC0xNzcgICAgI1Byb2ZpbGVzIHRoZSBzYW1lCitjbVByb2ZpbGVOb3RGb3VuZCAgID0gICAtMTc2ICAgICNSZXNwb25kZXIgZXJyb3IKK2NtTWV0aG9kTm90Rm91bmQgICAgPSAgIC0xNzUgICAgI0NNTSBub3QgcHJlc2VudAorY21NZXRob2RFcnJvciAgID0gICAtMTcxICAgICNjbU1ldGhvZEVycm9yCitjbVByb2ZpbGVFcnJvciAgPSAgIC0xNzAgICAgI2NtUHJvZmlsZUVycm9yCitjRGVwdGhFcnIgICA9ICAgLTE1NyAgICAjaW52YWxpZCBwaXhlbCBkZXB0aAorY1Jlc0VyciA9ICAgLTE1NiAgICAjaW52YWxpZCByZXNvbHV0aW9uIGZvciBNYWtlSVRhYmxlCitjRGV2RXJyID0gICAtMTU1ICAgICNpbnZhbGlkIHR5cGUgb2YgZ3JhcGhpY3MgZGV2aWNlCitjUHJvdGVjdEVyciA9ICAgLTE1NCAgICAjY29sb3JUYWJsZSBlbnRyeSBwcm90ZWN0aW9uIHZpb2xhdGlvbgorY1JhbmdlRXJyICAgPSAgIC0xNTMgICAgI3JhbmdlIGVycm9yIG9uIGNvbG9yVGFibGUgcmVxdWVzdAorY05vTWVtRXJyICAgPSAgIC0xNTIgICAgI2ZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0cnVjdHVyZQorY1RlbXBNZW1FcnIgPSAgIC0xNTEgICAgI2ZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRlbXBvcmFyeSBzdHJ1Y3R1cmVzCitjTWF0Y2hFcnIgICA9ICAgLTE1MCAgICAjQ29sb3IySW5kZXggZmFpbGVkIHRvIGZpbmQgYW4gaW5kZXgKK2luc3VmZmljaWVudFN0YWNrRXJyICAgID0gICAtMTQ5ICAgICNpbnN1ZmZpY2llbnRTdGFja0VycgorcGl4TWFwVG9vRGVlcEVyciAgICA9ICAgLTE0OCAgICAjcGl4TWFwVG9vRGVlcEVycgorcmduT3ZlcmZsb3dFcnIgID0gICAtMTQ3ICAgICNyZ25PdmVyZmxvd0Vycgorbm9NZW1Gb3JQaWN0UGxheWJhY2tFcnIgPSAgIC0xNDUgICAgI25vTWVtRm9yUGljdFBsYXliYWNrRXJyCit1c2VyQ2FuY2VsZWRFcnIgPSAgIC0xMjggICAgI3VzZXJDYW5jZWxlZEVycgoraE1lbnVGaW5kRXJyICAgID0gICAtMTI3ICAgICNjb3VsZCBub3QgZmluZCBITWVudSdzIHBhcmVudCBpbiBNZW51S2V5ICh3cm9uZyBlcnJvciBjb2RlIC0gb2Jzb2xldGUpCittQmFyTkZuZCAgICA9ICAgLTEyNiAgICAjc3lzdGVtIGVycm9yIGNvZGUgZm9yIE1CREYgbm90IGZvdW5kCit1cGRQaXhNZW1FcnIgICAgPSAgIC0xMjUgICAgI2luc3VmZmljaWVudCBtZW1vcnkgdG8gdXBkYXRlIGEgcGl4bWFwCit2b2xHb25lRXJyICA9ICAgLTEyNCAgICAjU2VydmVyIHZvbHVtZSBoYXMgYmVlbiBkaXNjb25uZWN0ZWQuCit3cmdWb2xUeXBFcnIgICAgPSAgIC0xMjMgICAgI1dyb25nIHZvbHVtZSB0eXBlIGVycm9yIFtvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBmb3IgTUZTXQorYmFkTW92RXJyICAgPSAgIC0xMjIgICAgI01vdmUgaW50byBvZmZzcHJpbmcgZXJyb3IKK3Rtd2RvRXJyICAgID0gICAtMTIxICAgICNObyBmcmVlIFdEQ0IgYXZhaWxhYmxlCitkaXJORkVyciAgICA9ICAgLTEyMCAgICAjRGlyZWN0b3J5IG5vdCBmb3VuZAorbWVtTG9ja2VkRXJyICAgID0gICAtMTE3ICAgICN0cnlpbmcgdG8gbW92ZSBhIGxvY2tlZCBibG9jayAoTW92ZUhIaSkKK21lbVNDRXJyICAgID0gICAtMTE2ICAgICNTaXplIENoZWNrIGZhaWxlZAorbWVtQkNFcnIgICAgPSAgIC0xMTUgICAgI0Jsb2NrIENoZWNrIGZhaWxlZAorbWVtUENFcnIgICAgPSAgIC0xMTQgICAgI1BvaW50ZXIgQ2hlY2sgZmFpbGVkCittZW1BWkVyciAgICA9ICAgLTExMyAgICAjQWRkcmVzcyBpbiB6b25lIGNoZWNrIGZhaWxlZAorbWVtUHVyRXJyICAgPSAgIC0xMTIgICAgI3RyeWluZyB0byBwdXJnZSBhIGxvY2tlZCBvciBub24tcHVyZ2VhYmxlIGJsb2NrCittZW1XWkVyciAgICA9ICAgLTExMSAgICAjV2hpY2hab25lIGZhaWxlZCAoYXBwbGllZCB0byBmcmVlIGJsb2NrKQorbWVtQWRyRXJyICAgPSAgIC0xMTAgICAgI2FkZHJlc3Mgd2FzIG9kZDsgb3Igb3V0IG9mIHJhbmdlCituaWxIYW5kbGVFcnIgICAgPSAgIC0xMDkgICAgI01hc3RlciBQb2ludGVyIHdhcyBOSUwgaW4gSGFuZGxlWm9uZSBvciBvdGhlcgorbWVtRnVsbEVyciAgPSAgIC0xMDggICAgI05vdCBlbm91Z2ggcm9vbSBpbiBoZWFwIHpvbmUKK25vVHlwZUVyciAgID0gICAtMTAyICAgICNObyBvYmplY3Qgb2YgdGhhdCB0eXBlIGluIHNjcmFwCitub1NjcmFwRXJyICA9ICAgLTEwMCAgICAjTm8gc2NyYXAgZXhpc3RzIGVycm9yCittZW1ST1pXYXJuICA9ICAgLTk5ICNzb2Z0IGVycm9yIGluIFJPWgorcG9ydE5vdENmICAgPSAgIC05OCAjZHJpdmVyIE9wZW4gZXJyb3IgY29kZSAocGFyYW1ldGVyIFJBTSBub3QgY29uZmlndXJlZCBmb3IgdGhpcyBjb25uZWN0aW9uKQorcG9ydEluVXNlICAgPSAgIC05NyAjZHJpdmVyIE9wZW4gZXJyb3IgY29kZSAocG9ydCBpcyBpbiB1c2UpCitwb3J0Tm90UHdyICA9ICAgLTk2ICNzZXJpYWwgcG9ydCBub3QgY3VycmVudGx5IHBvd2VyZWQKK2V4Y2Vzc0NvbGxzbnMgICA9ICAgLTk1ICNleGNlc3NpdmUgY29sbGlzaW9ucyBvbiB3cml0ZQorbGFwUHJvdEVyciAgPSAgIC05NCAjZXJyb3IgaW4gYXR0YWNoaW5nL2RldGFjaGluZyBwcm90b2NvbAorbm9CcmlkZ2VFcnIgPSAgIC05MyAjbm8gbmV0d29yayBicmlkZ2UgZm9yIG5vbi1sb2NhbCBzZW5kCitlTGVuRXJyID0gICAtOTIgI0xlbmd0aCBlcnJvciBkZHBMZW5FcnIKK2VNdWx0aUVyciAgID0gICAtOTEgI011bHRpY2FzdCBhZGRyZXNzIGVycm9yIGRkcFNrdEVycgorYnJlYWtSZWNkICAgPSAgIC05MCAjQnJlYWsgcmVjZWl2ZWQgKFNDQykKK3JjdnJFcnIgPSAgIC04OSAjU0NDIHJlY2VpdmVyIGVycm9yIChmcmFtaW5nOyBwYXJpdHk7IE9SKQorcHJJbml0RXJyICAgPSAgIC04OCAjSW5pdFV0aWwgZm91bmQgdGhlIHBhcmFtZXRlciByYW0gdW5pbml0aWFsaXplZAorcHJXckVyciA9ICAgLTg3ICNwYXJhbWV0ZXIgcmFtIHdyaXR0ZW4gZGlkbid0IHJlYWQtdmVyaWZ5CitjbGtXckVyciAgICA9ICAgLTg2ICN0aW1lIHdyaXR0ZW4gZGlkIG5vdCB2ZXJpZnkKK2Nsa1JkRXJyICAgID0gICAtODUgI3VuYWJsZSB0byByZWFkIHNhbWUgY2xvY2sgdmFsdWUgdHdpY2UKK3ZlckVyciAgPSAgIC04NCAjdHJhY2sgZmFpbGVkIHRvIHZlcmlmeQorZm10MkVyciA9ICAgLTgzICNjYW4ndCBnZXQgZW5vdWdoIHN5bmMKK2ZtdDFFcnIgPSAgIC04MiAjY2FuJ3QgZmluZCBzZWN0b3IgMCBhZnRlciB0cmFjayBmb3JtYXQKK3NlY3RORkVyciAgID0gICAtODEgI3NlY3RvciBudW1iZXIgbmV2ZXIgZm91bmQgb24gYSB0cmFjaworc2Vla0VyciA9ICAgLTgwICN0cmFjayBudW1iZXIgd3Jvbmcgb24gYWRkcmVzcyBtYXJrCitzcGRBZGpFcnIgICA9ICAgLTc5ICN1bmFibGUgdG8gY29ycmVjdGx5IGFkanVzdCBkaXNrIHNwZWVkCit0d29TaWRlRXJyICA9ICAgLTc4ICN0cmllZCB0byByZWFkIDJuZCBzaWRlIG9uIGEgMS1zaWRlZCBkcml2ZQoraW5pdElXTUVyciAgPSAgIC03NyAjdW5hYmxlIHRvIGluaXRpYWxpemUgSVdNCit0azBCYWRFcnIgICA9ICAgLTc2ICN0cmFjayAwIGRldGVjdCBkb2Vzbid0IGNoYW5nZQorY2FudFN0ZXBFcnIgPSAgIC03NSAjc3RlcCBoYW5kc2hha2UgZmFpbGVkCit3clVuZGVycnVuICA9ICAgLTc0ICN3cml0ZSB1bmRlcnJ1biBvY2N1cnJlZAorYmFkREJ0U2xwICAgPSAgIC03MyAjYmFkIGRhdGEgbWFyayBiaXQgc2xpcCBuaWJibGVzCitiYWREQ2tzdW0gICA9ICAgLTcyICNiYWQgZGF0YSBtYXJrIGNoZWNrc3VtCitub0R0YU1rRXJyICA9ICAgLTcxICNjb3VsZG4ndCBmaW5kIGEgZGF0YSBtYXJrIGhlYWRlcgorYmFkQnRTbHBFcnIgPSAgIC03MCAjYmFkIGFkZHIgbWFyayBiaXQgc2xpcCBuaWJibGVzCitiYWRDa3NtRXJyICA9ICAgLTY5ICNhZGRyIG1hcmsgY2hlY2tzdW0gZGlkbid0IGNoZWNrCitkYXRhVmVyRXJyICA9ICAgLTY4ICNyZWFkIHZlcmlmeSBjb21wYXJlIGZhaWxlZAorbm9BZHJNa0VyciAgPSAgIC02NyAjY291bGRuJ3QgZmluZCB2YWxpZCBhZGRyIG1hcmsKK25vTnliRXJyICAgID0gICAtNjYgI2NvdWxkbid0IGZpbmQgNSBueWJibGVzIGluIDIwMCB0cmllcworb2ZmTGluRXJyICAgPSAgIC02NSAjci93IHJlcXVlc3RlZCBmb3IgYW4gb2ZmLWxpbmUgZHJpdmUKK2ZvbnREZWNFcnJvciAgICA9ICAgLTY0ICNlcnJvciBkdXJpbmcgZm9udCBkZWNsYXJhdGlvbgord3JQZXJtRXJyICAgPSAgIC02MSAjd3JpdGUgcGVybWlzc2lvbnMgZXJyb3IKK2JhZE1EQkVyciAgID0gICAtNjAgI2JhZCBtYXN0ZXIgZGlyZWN0b3J5IGJsb2NrCitmc1JuRXJyID0gICAtNTkgI2ZpbGUgc3lzdGVtIGludGVybmFsIGVycm9yOmR1cmluZyByZW5hbWUgdGhlIG9sZCBlbnRyeSB3YXMgZGVsZXRlZCBidXQgY291bGQgbm90IGJlIHJlc3RvcmVkLgorZXh0RlNFcnIgICAgPSAgIC01OCAjdm9sdW1lIGluIHF1ZXN0aW9uIGJlbG9uZ3MgdG8gYW4gZXh0ZXJuYWwgZnMKK25vTWFjRHNrRXJyID0gICAtNTcgI25vdCBhIG1hYyBkaXNrZXR0ZSAoc2lnIGJ5dGVzIGFyZSB3cm9uZykKK25zRHJ2RXJyICAgID0gICAtNTYgI25vIHN1Y2ggZHJpdmUgKHRyaWVkIHRvIG1vdW50IGEgYmFkIGRyaXZlIG51bSkKK3ZvbE9uTGluRXJyID0gICAtNTUgI2RyaXZlIHZvbHVtZSBhbHJlYWR5IG9uLWxpbmUgYXQgTW91bnRWb2wKK3Blcm1FcnIgPSAgIC01NCAjcGVybWlzc2lvbnMgZXJyb3IgKG9uIGZpbGUgb3BlbikKK3ZvbE9mZkxpbkVyciAgICA9ICAgLTUzICN2b2x1bWUgbm90IG9uIGxpbmUgZXJyb3IgKHdhcyBFamVjdGVkKQorZ2ZwRXJyICA9ICAgLTUyICNnZXQgZmlsZSBwb3NpdGlvbiBlcnJvcgorcmZOdW1FcnIgICAgPSAgIC01MSAjcmVmbnVtIGVycm9yCitwYXJhbUVyciAgICA9ICAgLTUwICNlcnJvciBpbiB1c2VyIHBhcmFtZXRlciBsaXN0CitvcFdyRXJyID0gICAtNDkgI2ZpbGUgYWxyZWFkeSBvcGVuIHdpdGggd2l0aCB3cml0ZSBwZXJtaXNzaW9uCitkdXBGTkVyciAgICA9ICAgLTQ4ICNkdXBsaWNhdGUgZmlsZW5hbWUgKHJlbmFtZSkKK2ZCc3lFcnIgPSAgIC00NyAjRmlsZSBpcyBidXN5IChkZWxldGUpCit2TGNrZEVyciAgICA9ICAgLTQ2ICN2b2x1bWUgaXMgbG9ja2VkCitmTGNrZEVyciAgICA9ICAgLTQ1ICNmaWxlIGlzIGxvY2tlZAord1ByRXJyICA9ICAgLTQ0ICNkaXNrZXR0ZSBpcyB3cml0ZSBwcm90ZWN0ZWQuCitmbmZFcnIgID0gICAtNDMgI0ZpbGUgbm90IGZvdW5kCit0bWZvRXJyID0gICAtNDIgI3RvbyBtYW55IGZpbGVzIG9wZW4KK21GdWxFcnIgPSAgIC00MSAjbWVtb3J5IGZ1bGwgKG9wZW4pIG9yIGZpbGUgd29uJ3QgZml0IChsb2FkKQorcG9zRXJyICA9ICAgLTQwICN0cmllZCB0byBwb3NpdGlvbiB0byBiZWZvcmUgc3RhcnQgb2YgZmlsZSAoci93KQorZW9mRXJyICA9ICAgLTM5ICNFbmQgb2YgZmlsZQorZm5PcG5FcnIgICAgPSAgIC0zOCAjRmlsZSBub3Qgb3BlbgorYmROYW1FcnIgICAgPSAgIC0zNyAjdGhlcmUgbWF5IGJlIG5vIGJhZCBuYW1lcyBpbiB0aGUgZmluYWwgc3lzdGVtIQoraW9FcnIgICA9ICAgLTM2ICNJL08gZXJyb3IgKGJ1bW1lcnMpCituc3ZFcnIgID0gICAtMzUgI25vIHN1Y2ggdm9sdW1lCitkc2tGdWxFcnIgICA9ICAgLTM0ICNkaXNrIGZ1bGwKK2RpckZ1bEVyciAgID0gICAtMzMgI0RpcmVjdG9yeSBmdWxsCitkY2VFeHRFcnIgICA9ICAgLTMwICNkY2UgZXh0ZW5zaW9uIGVycm9yCit1bml0VGJsRnVsbEVyciAgPSAgIC0yOSAjdW5pdCB0YWJsZSBoYXMgbm8gbW9yZSBlbnRyaWVzCitub3RPcGVuRXJyICA9ICAgLTI4ICNDb3VsZG4ndCByZC93ci9jdGwvc3RzIGNhdXNlIGRyaXZlciBub3Qgb3BlbmVkCitpSU9BYm9ydEVyciA9ICAgLTI3ICNJTyBhYm9ydCBlcnJvciAoUHJpbnRpbmcgTWFuYWdlcikKK2RJbnN0RXJyICAgID0gICAtMjYgI0RydnJJbnN0YWxsIGNvdWxkbid0IGZpbmQgZHJpdmVyIGluIHJlc291cmNlcworZFJlbW92RXJyICAgPSAgIC0yNSAjdHJpZWQgdG8gcmVtb3ZlIGFuIG9wZW4gZHJpdmVyCitjbG9zRXJyID0gICAtMjQgI0kvTyBTeXN0ZW0gRXJyb3JzCitvcGVuRXJyID0gICAtMjMgI0kvTyBTeXN0ZW0gRXJyb3JzCit1bml0RW1wdHlFcnIgICAgPSAgIC0yMiAjSS9PIFN5c3RlbSBFcnJvcnMKK2JhZFVuaXRFcnIgID0gICAtMjEgI0kvTyBTeXN0ZW0gRXJyb3JzCit3cml0RXJyID0gICAtMjAgI0kvTyBTeXN0ZW0gRXJyb3JzCityZWFkRXJyID0gICAtMTkgI0kvTyBTeXN0ZW0gRXJyb3JzCitzdGF0dXNFcnIgICA9ICAgLTE4ICNJL08gU3lzdGVtIEVycm9ycworY29udHJvbEVyciAgPSAgIC0xNyAjSS9PIFN5c3RlbSBFcnJvcnMKK2RzRXh0ZW5zaW9uc0Rpc2FibGVkICAgID0gICAtMTMgI3NheSCWRXh0ZW5zaW9ucyBEaXNhYmxlZJQKK2RzSEQyMEluc3RhbGxlZCA9ICAgLTEyICNzYXkglkhEMjAgU3RhcnR1cJQKK2RzRGlzYXNzZW1ibGVySW5zdGFsbGVkID0gICAtMTEgI3NheSCWRGlzYXNzZW1ibGVyIEluc3RhbGxlZJQKK2RzTWFjc0J1Z0luc3RhbGxlZCAgPSAgIC0xMCAjc2F5IJZNYWNzQnVnIEluc3RhbGxlZJQKK3NlTm9EQiAgPSAgIC04ICAjbm8gZGVidWdnZXIgaW5zdGFsbGVkIHRvIGhhbmRsZSBkZWJ1Z2dlciBjb21tYW5kCitTbHBUeXBlRXJyICA9ICAgLTUgICNpbnZhbGlkIHF1ZXVlIGVsZW1lbnQKK3VuaW1wRXJyICAgID0gICAtNCAgI3VuaW1wbGVtZW50ZWQgY29yZSByb3V0aW5lCitjb3JFcnIgID0gICAtMyAgI2NvcmUgcm91dGluZSBudW1iZXIgb3V0IG9mIHJhbmdlCitkc05vRXh0c0Rpc2Fzc2VtYmxlciAgICA9ICAgLTIgICNub3QgYSBTeXNFcnIsIGp1c3QgYSBwbGFjZWhvbGRlcgorcUVyciAgICA9ICAgLTEgICNxdWV1ZSBlbGVtZW50IG5vdCBmb3VuZCBkdXJpbmcgZGVsZXRpb24KK3RzbUNvbXBvbmVudE5vRXJyICAgPSAgIDAgICAjY29tcG9uZW50IHJlc3VsdCA9IG5vIGVycm9yCitFUEVSTSAgID0gICAxICAgI09wZXJhdGlvbiBub3QgcGVybWl0dGVkCitFTk9FTlQgID0gICAyICAgI05vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK0VTUkNIICAgPSAgIDMgICAjTm8gc3VjaCBwcm9jZXNzCitFSU5UUiAgID0gICA0ICAgI0ludGVycnVwdGVkIHN5c3RlbSBjYWxsCitFSU8gPSAgIDUgICAjSW5wdXQvb3V0cHV0IGVycm9yCitFTlhJTyAgID0gICA2ICAgI0RldmljZSBub3QgY29uZmlndXJlZAorRTJCSUcgICA9ICAgNyAgICNBcmd1bWVudCBsaXN0IHRvbyBsb25nCitFTk9FWEVDID0gICA4ICAgI0V4ZWMgZm9ybWF0IGVycm9yCitFQkFERiAgID0gICA5ICAgI0JhZCBmaWxlIGRlc2NyaXB0b3IKK0VDSElMRCAgPSAgIDEwICAjTm8gY2hpbGQgcHJvY2Vzc2VzCitFREVBRExLID0gICAxMSAgI1Jlc291cmNlIGRlYWRsb2NrIGF2b2lkZWQKK0VOT01FTSAgPSAgIDEyICAjQ2Fubm90IGFsbG9jYXRlIG1lbW9yeQorRUFDQ0VTICA9ICAgMTMgICNQZXJtaXNzaW9uIGRlbmllZAorRUZBVUxUICA9ICAgMTQgICNCYWQgYWRkcmVzcworRUNBTkNFTEVEICAgPSAgIDE1ICAjT3BlcmF0aW9uIGNhbmNlbGxlZAorRUJVU1kgICA9ICAgMTYgICNEZXZpY2UgYnVzeQorRUVYSVNUICA9ICAgMTcgICNGaWxlIGV4aXN0cworRVhERVYgICA9ICAgMTggICNDcm9zcy1kZXZpY2UgbGluaworRU5PREVWICA9ICAgMTkgICNPcGVyYXRpb24gbm90IHN1cHBvcnRlZCBieSBkZXZpY2UKK0VOT1RESVIgPSAgIDIwICAjTm90IGEgZGlyZWN0b3J5CitFSVNESVIgID0gICAyMSAgI0lzIGEgZGlyZWN0b3J5CitFSU5WQUwgID0gICAyMiAgI0ludmFsaWQgYXJndW1lbnQKK0VORklMRSAgPSAgIDIzICAjVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0KK0VNRklMRSAgPSAgIDI0ICAjVG9vIG1hbnkgb3BlbiBmaWxlcworRU5PVFRZICA9ICAgMjUgICNJbmFwcHJvcHJpYXRlIGlvY3RsIGZvciBkZXZpY2UKK0VTSUdQQVJNICAgID0gICAyNiAgI1NpZ25hbCBlcnJvcgorRUZCSUcgICA9ICAgMjcgICNGaWxlIHRvbyBsYXJnZQorRU5PU1BDICA9ICAgMjggICNObyBzcGFjZSBsZWZ0IG9uIGRldmljZQorRVNQSVBFICA9ICAgMjkgICNJbGxlZ2FsIHNlZWsKK0VST0ZTICAgPSAgIDMwICAjUmVhZC1vbmx5IGZpbGUgc3lzdGVtCitFTUxJTksgID0gICAzMSAgI1RvbyBtYW55IGxpbmtzCitFUElQRSAgID0gICAzMiAgI0Jyb2tlbiBwaXBlCitFRE9NICAgID0gICAzMyAgI051bWVyaWNhbCBhcmd1bWVudCBvdXQgb2YgZG9tYWluCitFUkFOR0UgID0gICAzNCAgI1Jlc3VsdCB0b28gbGFyZ2UKK0VBR0FJTiAgPSAgIDM1ICAjUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUKK0VJTlBST0dSRVNTID0gICAzNiAgI09wZXJhdGlvbiBub3cgaW4gcHJvZ3Jlc3MKK0VBTFJFQURZICAgID0gICAzNyAgI09wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzCitFTk9UU09DSyAgICA9ICAgMzggICNTb2NrZXQgb3BlcmF0aW9uIG9uIG5vbi1zb2NrZXQKK0VERVNUQUREUlJFUSAgICA9ICAgMzkgICNEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkCitFTVNHU0laRSAgICA9ICAgNDAgICNNZXNzYWdlIHRvbyBsb25nCitFUFJPVE9UWVBFICA9ICAgNDEgICNQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQKK0VOT1BST1RPT1BUID0gICA0MiAgI1Byb3RvY29sIG5vdCBhdmFpbGFibGUKK0VQUk9UT05PU1VQUE9SVCA9ICAgNDMgICNQcm90b2NvbCBub3Qgc3VwcG9ydGVkCitFU09DS1ROT1NVUFBPUlQgPSAgIDQ0ICAjU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZAorRU9QTk9UU1VQUCAgPSAgIDQ1ICAjT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQKK0VQRk5PU1VQUE9SVCAgICA9ICAgNDYgICNQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZAorRUFGTk9TVVBQT1JUICAgID0gICA0NyAgI0FkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wgZmFtaWx5CitFQUREUklOVVNFICA9ICAgNDggICNBZGRyZXNzIGFscmVhZHkgaW4gdXNlCitFQUREUk5PVEFWQUlMICAgPSAgIDQ5ICAjQ2FuJ3QgYXNzaWduIHJlcXVlc3RlZCBhZGRyZXNzCitFTkVURE9XTiAgICA9ICAgNTAgICNOZXR3b3JrIGlzIGRvd24KK0VORVRVTlJFQUNIID0gICA1MSAgI05ldHdvcmsgaXMgdW5yZWFjaGFibGUKK0VORVRSRVNFVCAgID0gICA1MiAgI05ldHdvcmsgZHJvcHBlZCBjb25uZWN0aW9uIG9uIHJlc2V0CitFQ09OTkFCT1JURUQgICAgPSAgIDUzICAjU29mdHdhcmUgY2F1c2VkIGNvbm5lY3Rpb24gYWJvcnQKK0VDT05OUkVTRVQgID0gICA1NCAgI0Nvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgorRU5PQlVGUyA9ICAgNTUgICNObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlCitFSVNDT05OID0gICA1NiAgI1NvY2tldCBpcyBhbHJlYWR5IGNvbm5lY3RlZAorRU5PVENPTk4gICAgPSAgIDU3ICAjU29ja2V0IGlzIG5vdCBjb25uZWN0ZWQKK0VTSFVURE9XTiAgID0gICA1OCAgI0Nhbid0IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duCitFVE9PTUFOWVJFRlMgICAgPSAgIDU5ICAjVG9vIG1hbnkgcmVmZXJlbmNlczogY2FuJ3Qgc3BsaWNlCitFVElNRURPVVQgICA9ICAgNjAgICNPcGVyYXRpb24gdGltZWQgb3V0CitFQ09OTlJFRlVTRUQgICAgPSAgIDYxICAjQ29ubmVjdGlvbiByZWZ1c2VkCitFTE9PUCAgID0gICA2MiAgI1RvbyBtYW55IGxldmVscyBvZiBzeW1ib2xpYyBsaW5rcworRU5BTUVUT09MT05HICAgID0gICA2MyAgI0ZpbGUgbmFtZSB0b28gbG9uZworRUhPU1RET1dOICAgPSAgIDY0ICAjSG9zdCBpcyBkb3duCitFSE9TVFVOUkVBQ0ggICAgPSAgIDY1ICAjTm8gcm91dGUgdG8gaG9zdAorRU5PVEVNUFRZICAgPSAgIDY2ICAjRGlyZWN0b3J5IG5vdCBlbXB0eQorRUxPT0sgICA9ICAgNjcgICNJbnRlcm5hbCBtYXBwaW5nIGZvciBrT1RMb29rRXJyLCBkb24ndCByZXR1cm4gdG8gY2xpZW50CitFTk9MQ0sgID0gICA3NyAgI05vIGxvY2tzIGF2YWlsYWJsZQorRU5PU1lTICA9ICAgNzggICNGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQKK0VJTFNFUSAgPSAgIDg4ICAjV2lkZSBjaGFyYWN0ZXIgZW5jb2RpbmcgZXJyb3IKK0VVTktOT1dOICAgID0gICA5OSAgI1Vua25vd24gZXJyb3IKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbWFjZXJyb3JzLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbWFjZXJyb3JzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDMwMjEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9tYWNlcnJvcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbWFjZXJyb3JzLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbWFjZXJyb3JzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDMwMjEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9tYWNlcnJvcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbWFjb3N0b29scy5weSBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbWFjb3N0b29scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTUwMDFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9tYWNvc3Rvb2xzLnB5CkBAIC0wLDAgKzEsMTM4IEBACisiIiJtYWNvc3Rvb2xzIC0gVmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgTWFjT1MuCisKK21rYWxpYXMoc3JjLCBkc3QpIC0gQ3JlYXRlIGEgZmluZGVyIGFsaWFzICdkc3QnIHBvaW50aW5nIHRvICdzcmMnCitjb3B5KHNyYywgZHN0KSAtIEZ1bGwgY29weSBvZiAnc3JjJyB0byAnZHN0JworIiIiCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgbWFjb3N0b29scyBtb2R1bGUgaXMgcmVtb3ZlZC4iLCBzdGFja2xldmVsPTIpCisKK2Zyb20gQ2FyYm9uIGltcG9ydCBSZXMKK2Zyb20gQ2FyYm9uIGltcG9ydCBGaWxlLCBGaWxlcworaW1wb3J0IG9zCitpbXBvcnQgZXJybm8KK2ltcG9ydCBNYWNPUwordHJ5OgorICAgIG9wZW5yZiA9IE1hY09TLm9wZW5yZgorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICMgQmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIG9wZW5yZiA9IG9wZW4KKworRXJyb3IgPSAnbWFjb3N0b29scy5FcnJvcicKKworQlVGU0laPTB4ODAwMDAgICAgICAjIENvcHkgaW4gMC41TWIgY2h1bmtzCisKK0NPUFlfRkxBR1MgPSAoRmlsZXMua0lzU3RhdGlvbmFyeXxGaWxlcy5rTmFtZUxvY2tlZHxGaWxlcy5rSGFzQnVuZGxlfAorICAgICAgICAgICAgICBGaWxlcy5rSXNJbnZpc2libGV8RmlsZXMua0lzQWxpYXMpCisKKyMKKyMgTm90IGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdCBvciBzdGF5IGNvcnJlY3QgKEFwcGxlIGRvZXNuJ3QgdGVsbCB5b3UKKyMgaG93IHRvIGRvIHRoaXMpLCBidXQgaXQgc2VlbXMgdG8gd29yay4KKyMKK2RlZiBta2FsaWFzKHNyYywgZHN0LCByZWxhdGl2ZT1Ob25lKToKKyAgICAiIiJDcmVhdGUgYSBmaW5kZXIgYWxpYXMiIiIKKyAgICBzcmNmc3IgPSBGaWxlLkZTUmVmKHNyYykKKyAgICAjIFRoZSBuZXh0IGxpbmUgd2lsbCBmYWlsIHVuZGVyIHVuaXgtUHl0aG9uIGlmIHRoZSBkZXN0aW5hdGlvbgorICAgICMgZG9lc24ndCBleGlzdCB5ZXQuIFdlIHNob3VsZCBjaGFuZ2UgdGhpcyBjb2RlIHRvIGJlIGZzcmVmLWJhc2VkLgorICAgIGRzdGRpciwgZHN0bmFtZSA9IG9zLnBhdGguc3BsaXQoZHN0KQorICAgIGlmIG5vdCBkc3RkaXI6IGRzdGRpciA9IG9zLmN1cmRpcgorICAgIGRzdGRpcmZzciA9IEZpbGUuRlNSZWYoZHN0ZGlyKQorICAgIGlmIHJlbGF0aXZlOgorICAgICAgICByZWxhdGl2ZWZzciA9IEZpbGUuRlNSZWYocmVsYXRpdmUpCisgICAgICAgICMgaWsgbWFnIGVyIGdlZW4gTm9uZSBpbiBzdG9wcGVuIDotKAorICAgICAgICBhbGlhcyA9IEZpbGUuRlNOZXdBbGlhcyhyZWxhdGl2ZWZzciwgc3JjZnNyKQorICAgIGVsc2U6CisgICAgICAgIGFsaWFzID0gc3JjZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKKworICAgIGRzdGZzciwgZHN0ZnNzID0gUmVzLkZTQ3JlYXRlUmVzb3VyY2VGaWxlKGRzdGRpcmZzciwgdW5pY29kZShkc3RuYW1lKSwKKyAgICAgICAgRmlsZS5GU0dldFJlc291cmNlRm9ya05hbWUoKSkKKyAgICBoID0gUmVzLkZTT3BlblJlc291cmNlRmlsZShkc3Rmc3IsIEZpbGUuRlNHZXRSZXNvdXJjZUZvcmtOYW1lKCksIDMpCisgICAgcmVzb3VyY2UgPSBSZXMuUmVzb3VyY2UoYWxpYXMuZGF0YSkKKyAgICByZXNvdXJjZS5BZGRSZXNvdXJjZSgnYWxpcycsIDAsICcnKQorICAgIFJlcy5DbG9zZVJlc0ZpbGUoaCkKKworICAgIGRzdGZpbmZvID0gZHN0ZnNzLkZTcEdldEZJbmZvKCkKKyAgICBkc3RmaW5mby5GbGFncyA9IGRzdGZpbmZvLkZsYWdzfDB4ODAwMCAgICAjIEFsaWFzIGZsYWcKKyAgICBkc3Rmc3MuRlNwU2V0RkluZm8oZHN0ZmluZm8pCisKK2RlZiBta2RpcnMoZHN0KToKKyAgICAiIiJNYWtlIGRpcmVjdG9yaWVzIGxlYWRpbmcgdG8gJ2RzdCcgaWYgdGhleSBkb24ndCBleGlzdCB5ZXQiIiIKKyAgICBpZiBkc3QgPT0gJycgb3Igb3MucGF0aC5leGlzdHMoZHN0KToKKyAgICAgICAgcmV0dXJuCisgICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQoZHN0KQorICAgIGlmIG9zLnNlcCA9PSAnOicgYW5kIG5vdCAnOicgaW4gaGVhZDoKKyAgICAgICAgaGVhZCA9IGhlYWQgKyAnOicKKyAgICBta2RpcnMoaGVhZCkKKworICAgIHRyeToKKyAgICAgICAgb3MubWtkaXIoZHN0LCAwNzc3KQorICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAjIGJlIGhhcHB5IGlmIHNvbWVvbmUgYWxyZWFkeSBjcmVhdGVkIHRoZSBwYXRoCisgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgcmFpc2UKKworCitkZWYgdG91Y2hlZChkc3QpOgorICAgICIiIlRlbGwgdGhlIGZpbmRlciBhIGZpbGUgaGFzIGNoYW5nZWQuIE5vLW9wIG9uIE1hY09TWC4iIiIKKyAgICBpbXBvcnQgd2FybmluZ3MKKyAgICB3YXJuaW5ncy53YXJuKCJtYWNvc3Rvb2xzLnRvdWNoZWQoKSBoYXMgYmVlbiBkZXByZWNhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorCitkZWYgdG91Y2hlZF9hZShkc3QpOgorICAgICIiIlRlbGwgdGhlIGZpbmRlciBhIGZpbGUgaGFzIGNoYW5nZWQiIiIKKyAgICBwYXJkaXIgPSBvcy5wYXRoLnNwbGl0KGRzdClbMF0KKyAgICBpZiBub3QgcGFyZGlyOgorICAgICAgICBwYXJkaXIgPSBvcy5jdXJkaXIKKyAgICBpbXBvcnQgRmluZGVyCisgICAgZiA9IEZpbmRlci5GaW5kZXIoKQorICAgIGYudXBkYXRlKEZpbGUuRlNSZWYocGFyZGlyKSkKKworZGVmIGNvcHkoc3JjLCBkc3QsIGNyZWF0ZXBhdGg9MCwgY29weWRhdGVzPTEsIGZvcmNldHlwZT1Ob25lKToKKyAgICAiIiJDb3B5IGEgZmlsZSwgaW5jbHVkaW5nIGZpbmRlciBpbmZvLCByZXNvdXJjZSBmb3JrLCBldGMiIiIKKyAgICBzcmMgPSBGaWxlLnBhdGhuYW1lKHNyYykKKyAgICBkc3QgPSBGaWxlLnBhdGhuYW1lKGRzdCkKKyAgICBpZiBjcmVhdGVwYXRoOgorICAgICAgICBta2RpcnMob3MucGF0aC5zcGxpdChkc3QpWzBdKQorCisgICAgaWZwID0gb3BlbihzcmMsICdyYicpCisgICAgb2ZwID0gb3Blbihkc3QsICd3YicpCisgICAgZCA9IGlmcC5yZWFkKEJVRlNJWikKKyAgICB3aGlsZSBkOgorICAgICAgICBvZnAud3JpdGUoZCkKKyAgICAgICAgZCA9IGlmcC5yZWFkKEJVRlNJWikKKyAgICBpZnAuY2xvc2UoKQorICAgIG9mcC5jbG9zZSgpCisKKyAgICBpZnAgPSBvcGVucmYoc3JjLCAnKnJiJykKKyAgICBvZnAgPSBvcGVucmYoZHN0LCAnKndiJykKKyAgICBkID0gaWZwLnJlYWQoQlVGU0laKQorICAgIHdoaWxlIGQ6CisgICAgICAgIG9mcC53cml0ZShkKQorICAgICAgICBkID0gaWZwLnJlYWQoQlVGU0laKQorICAgIGlmcC5jbG9zZSgpCisgICAgb2ZwLmNsb3NlKCkKKworICAgIHNyY2ZzcyA9IEZpbGUuRlNTcGVjKHNyYykKKyAgICBkc3Rmc3MgPSBGaWxlLkZTU3BlYyhkc3QpCisgICAgc2YgPSBzcmNmc3MuRlNwR2V0RkluZm8oKQorICAgIGRmID0gZHN0ZnNzLkZTcEdldEZJbmZvKCkKKyAgICBkZi5DcmVhdG9yLCBkZi5UeXBlID0gc2YuQ3JlYXRvciwgc2YuVHlwZQorICAgIGlmIGZvcmNldHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgZGYuVHlwZSA9IGZvcmNldHlwZQorICAgIGRmLkZsYWdzID0gKHNmLkZsYWdzICYgQ09QWV9GTEFHUykKKyAgICBkc3Rmc3MuRlNwU2V0RkluZm8oZGYpCisgICAgaWYgY29weWRhdGVzOgorICAgICAgICBzcmNmc3IgPSBGaWxlLkZTUmVmKHNyYykKKyAgICAgICAgZHN0ZnNyID0gRmlsZS5GU1JlZihkc3QpCisgICAgICAgIGNhdGluZm8sIF8sIF8sIF8gPSBzcmNmc3IuRlNHZXRDYXRhbG9nSW5mbyhGaWxlcy5rRlNDYXRJbmZvQWxsRGF0ZXMpCisgICAgICAgIGRzdGZzci5GU1NldENhdGFsb2dJbmZvKEZpbGVzLmtGU0NhdEluZm9BbGxEYXRlcywgY2F0aW5mbykKKworZGVmIGNvcHl0cmVlKHNyYywgZHN0LCBjb3B5ZGF0ZXM9MSk6CisgICAgIiIiQ29weSBhIGNvbXBsZXRlIGZpbGUgdHJlZSB0byBhIG5ldyBkZXN0aW5hdGlvbiIiIgorICAgIGlmIG9zLnBhdGguaXNkaXIoc3JjKToKKyAgICAgICAgbWtkaXJzKGRzdCkKKyAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKHNyYykKKyAgICAgICAgZm9yIGYgaW4gZmlsZXM6CisgICAgICAgICAgICBjb3B5dHJlZShvcy5wYXRoLmpvaW4oc3JjLCBmKSwgb3MucGF0aC5qb2luKGRzdCwgZiksIGNvcHlkYXRlcykKKyAgICBlbHNlOgorICAgICAgICBjb3B5KHNyYywgZHN0LCAxLCBjb3B5ZGF0ZXMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL21hY29zdG9vbHMucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9tYWNvc3Rvb2xzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjM1MTQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9tYWNvc3Rvb2xzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL21hY29zdG9vbHMucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9tYWNvc3Rvb2xzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjM1MTQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9tYWNvc3Rvb2xzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL21hY3Jlc291cmNlLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9tYWNyZXNvdXJjZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQ4ZDRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy9tYWNyZXNvdXJjZS5weQpAQCAtMCwwICsxLDEzNSBAQAorIiIibWFjcmVzb3VyY2UgLSBMb2NhdGUgYW5kIG9wZW4gdGhlIHJlc291cmNlcyBuZWVkZWQgZm9yIGEgc2NyaXB0LiIiIgorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIG1hY3Jlc291cmNlIG1vZHVsZSBpcyByZW1vdmVkLiIsIHN0YWNrbGV2ZWw9MikKKworZnJvbSBDYXJib24gaW1wb3J0IFJlcworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgTWFjT1MKK2ltcG9ydCBtYWNvc3Rvb2xzCisKK2NsYXNzIEFyZ3VtZW50RXJyb3IoVHlwZUVycm9yKTogcGFzcworY2xhc3MgUmVzb3VyY2VGaWxlTm90Rm91bmRFcnJvcihJbXBvcnRFcnJvcik6IHBhc3MKKworZGVmIG5lZWQocmVzdHlwZSwgcmVzaWQsIGZpbGVuYW1lPU5vbmUsIG1vZG5hbWU9Tm9uZSk6CisgICAgIiIiT3BlbiBhIHJlc291cmNlIGZpbGUsIGlmIG5lZWRlZC4gcmVzdHlwZSBhbmQgcmVzaWQKKyAgICBhcmUgcmVxdWlyZWQgcGFyYW1ldGVycywgYW5kIGlkZW50aWZ5IHRoZSByZXNvdXJjZSBmb3Igd2hpY2ggdG8gdGVzdC4gSWYgaXQKKyAgICBpcyBhdmFpbGFibGUgd2UgYXJlIGRvbmUuIElmIGl0IGlzIG5vdCBhdmFpbGFibGUgd2UgbG9vayBmb3IgYSBmaWxlIGZpbGVuYW1lCisgICAgKGRlZmF1bHQ6IG1vZG5hbWUgd2l0aCAucnNyYyBhcHBlbmRlZCkgZWl0aGVyIGluIHRoZSBzYW1lIGZvbGRlciBhcworICAgIHdoZXJlIG1vZG5hbWUgd2FzIGxvYWRlZCBmcm9tLCBvciBvdGhlcndpc2UgYWNyb3NzIHN5cy5wYXRoLgorCisgICAgUmV0dXJucyB0aGUgcmVmbm8gb2YgdGhlIHJlc291cmNlIGZpbGUgb3BlbmVkIChvciBOb25lKSIiIgorCisgICAgaWYgbW9kbmFtZSBpcyBOb25lIGFuZCBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yLCAiRWl0aGVyIGZpbGVuYW1lIG9yIG1vZG5hbWUgYXJndW1lbnQgKG9yIGJvdGgpIG11c3QgYmUgZ2l2ZW4iCisKKyAgICBpZiB0eXBlKHJlc2lkKSBpcyB0eXBlKDEpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBoID0gUmVzLkdldFJlc291cmNlKHJlc3R5cGUsIHJlc2lkKQorICAgICAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBoID0gUmVzLkdldE5hbWVkUmVzb3VyY2UocmVzdHlwZSwgcmVzaWQpCisgICAgICAgIGV4Y2VwdCBSZXMuRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBDb25zdHJ1Y3QgYSBmaWxlbmFtZSBpZiB3ZSBkb24ndCBoYXZlIG9uZQorICAgIGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgaWYgJy4nIGluIG1vZG5hbWU6CisgICAgICAgICAgICBmaWxlbmFtZSA9IG1vZG5hbWUuc3BsaXQoJy4nKVstMV0gKyAnLnJzcmMnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlbmFtZSA9IG1vZG5hbWUgKyAnLnJzcmMnCisKKyAgICAjIE5vdyBjcmVhdGUgYSBsaXN0IG9mIGZvbGRlcnMgdG8gc2VhcmNoCisgICAgc2VhcmNoZGlycyA9IFtdCisgICAgaWYgbW9kbmFtZSA9PSAnX19tYWluX18nOgorICAgICAgICAjIElmIHdlJ3JlIG1haW4gd2UgbG9vayBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkKKyAgICAgICAgc2VhcmNoZGlycyA9IFtvcy5jdXJkaXJdCisgICAgaWYgbW9kbmFtZSBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbbW9kbmFtZV0KKyAgICAgICAgaWYgaGFzYXR0cihtb2QsICdfX2ZpbGVfXycpOgorICAgICAgICAgICAgc2VhcmNoZGlycyA9IFtvcy5wYXRoLmRpcm5hbWUobW9kLl9fZmlsZV9fKV0KKyAgICBzZWFyY2hkaXJzLmV4dGVuZChzeXMucGF0aCkKKworICAgICMgQW5kIGxvb2sgZm9yIHRoZSBmaWxlCisgICAgZm9yIGRpciBpbiBzZWFyY2hkaXJzOgorICAgICAgICBwYXRobmFtZSA9IG9zLnBhdGguam9pbihkaXIsIGZpbGVuYW1lKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRobmFtZSk6CisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFJlc291cmNlRmlsZU5vdEZvdW5kRXJyb3IsIGZpbGVuYW1lCisKKyAgICByZWZubyA9IG9wZW5fcGF0aG5hbWUocGF0aG5hbWUpCisKKyAgICAjIEFuZCBjaGVjayB0aGF0IHRoZSByZXNvdXJjZSBleGlzdHMgbm93CisgICAgaWYgdHlwZShyZXNpZCkgaXMgdHlwZSgxKToKKyAgICAgICAgaCA9IFJlcy5HZXRSZXNvdXJjZShyZXN0eXBlLCByZXNpZCkKKyAgICBlbHNlOgorICAgICAgICBoID0gUmVzLkdldE5hbWVkUmVzb3VyY2UocmVzdHlwZSwgcmVzaWQpCisgICAgcmV0dXJuIHJlZm5vCisKK2RlZiBvcGVuX3BhdGhuYW1lKHBhdGhuYW1lLCB2ZXJib3NlPTApOgorICAgICIiIk9wZW4gYSByZXNvdXJjZSBmaWxlIGdpdmVuIGJ5IHBhdGhuYW1lLCBwb3NzaWJseSBkZWNvZGluZyBhbgorICAgIEFwcGxlU2luZ2xlIGZpbGUiIiIKKyAgICAjIE5vIHJlc291cmNlIGZvcmsuIFdlIG1heSBiZSBvbiBPU1gsIGFuZCB0aGlzIG1heSBiZSBlaXRoZXIKKyAgICAjIGEgZGF0YS1mb3JrIGJhc2VkIHJlc291cmNlIGZpbGUgb3IgYSBBcHBsZVNpbmdsZSBmaWxlCisgICAgIyBmcm9tIHRoZSBDVlMgcmVwb3NpdG9yeS4KKyAgICB0cnk6CisgICAgICAgIHJlZm5vID0gUmVzLkZTT3BlblJlc291cmNlRmlsZShwYXRobmFtZSwgdScnLCAxKQorICAgIGV4Y2VwdCBSZXMuRXJyb3IsIGFyZzoKKyAgICAgICAgaWYgYXJnWzBdICE9IC0xOTk6CisgICAgICAgICAgICAjIC0xOTkgaXMgImJhZCByZXNvdXJjZSBtYXAiCisgICAgICAgICAgICByYWlzZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiByZWZubworICAgICMgRmluYWxseSB0cnkgZGVjb2RpbmcgYW4gQXBwbGVTaW5nbGUgZmlsZQorICAgIHBhdGhuYW1lID0gX2RlY29kZShwYXRobmFtZSwgdmVyYm9zZT12ZXJib3NlKQorICAgIHJlZm5vID0gUmVzLkZTT3BlblJlc291cmNlRmlsZShwYXRobmFtZSwgdScnLCAxKQorCitkZWYgcmVzb3VyY2VfcGF0aG5hbWUocGF0aG5hbWUsIHZlcmJvc2U9MCk6CisgICAgIiIiUmV0dXJuIHRoZSBwYXRobmFtZSBmb3IgYSByZXNvdXJjZSBmaWxlIChlaXRoZXIgREYgb3IgUkYgYmFzZWQpLgorICAgIElmIHRoZSBwYXRobmFtZSBnaXZlbiBhbHJlYWR5IHJlZmVycyB0byBzdWNoIGEgZmlsZSBzaW1wbHkgcmV0dXJuIGl0LAorICAgIG90aGVyd2lzZSBmaXJzdCBkZWNvZGUgaXQuIiIiCisgICAgIyBObyByZXNvdXJjZSBmb3JrLiBXZSBtYXkgYmUgb24gT1NYLCBhbmQgdGhpcyBtYXkgYmUgZWl0aGVyCisgICAgIyBhIGRhdGEtZm9yayBiYXNlZCByZXNvdXJjZSBmaWxlIG9yIGEgQXBwbGVTaW5nbGUgZmlsZQorICAgICMgZnJvbSB0aGUgQ1ZTIHJlcG9zaXRvcnkuCisgICAgdHJ5OgorICAgICAgICByZWZubyA9IFJlcy5GU09wZW5SZXNvdXJjZUZpbGUocGF0aG5hbWUsIHUnJywgMSkKKyAgICBleGNlcHQgUmVzLkVycm9yLCBhcmc6CisgICAgICAgIGlmIGFyZ1swXSAhPSAtMTk5OgorICAgICAgICAgICAgIyAtMTk5IGlzICJiYWQgcmVzb3VyY2UgbWFwIgorICAgICAgICAgICAgcmFpc2UKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcmVmbm8KKyAgICAjIEZpbmFsbHkgdHJ5IGRlY29kaW5nIGFuIEFwcGxlU2luZ2xlIGZpbGUKKyAgICBwYXRobmFtZSA9IF9kZWNvZGUocGF0aG5hbWUsIHZlcmJvc2U9dmVyYm9zZSkKKyAgICByZXR1cm4gcGF0aG5hbWUKKworZGVmIG9wZW5fZXJyb3JfcmVzb3VyY2UoKToKKyAgICAiIiJPcGVuIHRoZSByZXNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGVycm9yIGNvZGUgdG8gZXJyb3IgbWVzc2FnZQorICAgIG1hcHBpbmcuIiIiCisgICAgbmVlZCgnRXN0cicsIDEsIGZpbGVuYW1lPSJlcnJvcnMucnNyYyIsIG1vZG5hbWU9X19uYW1lX18pCisKK2RlZiBfZGVjb2RlKHBhdGhuYW1lLCB2ZXJib3NlPTApOgorICAgICMgRGVjb2RlIGFuIEFwcGxlU2luZ2xlIHJlc291cmNlIGZpbGUsIHJldHVybiB0aGUgbmV3IHBhdGhuYW1lLgorICAgIG5ld3BhdGhuYW1lID0gcGF0aG5hbWUgKyAnLmRmLnJzcmMnCisgICAgaWYgb3MucGF0aC5leGlzdHMobmV3cGF0aG5hbWUpIGFuZCBcCisgICAgICAgIG9zLnN0YXQobmV3cGF0aG5hbWUpLnN0X210aW1lID49IG9zLnN0YXQocGF0aG5hbWUpLnN0X210aW1lOgorICAgICAgICByZXR1cm4gbmV3cGF0aG5hbWUKKyAgICBpZiBoYXNhdHRyKG9zLCAnYWNjZXNzJykgYW5kIG5vdCBcCisgICAgICAgIG9zLmFjY2Vzcyhvcy5wYXRoLmRpcm5hbWUocGF0aG5hbWUpLCBvcy5XX09LfG9zLlhfT0spOgorICAgICAgICAjIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgaXNuJ3Qgd3JpdGVhYmxlLiBDcmVhdGUgdGhlIGZpbGUgaW4KKyAgICAgICAgIyBhIHRlbXBvcmFyeSBkaXJlY3RvcnkKKyAgICAgICAgaW1wb3J0IHRlbXBmaWxlCisgICAgICAgIGZkLCBuZXdwYXRobmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoIi5yc3JjIikKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnRGVjb2RpbmcnLCBwYXRobmFtZSwgJ3RvJywgbmV3cGF0aG5hbWUKKyAgICBpbXBvcnQgYXBwbGVzaW5nbGUKKyAgICBhcHBsZXNpbmdsZS5kZWNvZGUocGF0aG5hbWUsIG5ld3BhdGhuYW1lLCByZXNvbmx5PTEpCisgICAgcmV0dXJuIG5ld3BhdGhuYW1lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL21hY3Jlc291cmNlLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbWFjcmVzb3VyY2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjJkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL21hY3Jlc291cmNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL21hY3Jlc291cmNlLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvbWFjcmVzb3VyY2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjJkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL21hY3Jlc291cmNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3BpbXAucHkgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3BpbXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzZTgyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvcGltcC5weQpAQCAtMCwwICsxLDExODIgQEAKKyIiIlBhY2thZ2UgSW5zdGFsbCBNYW5hZ2VyIGZvciBQeXRob24uCisKK1RoaXMgaXMgY3VycmVudGx5IGEgTWFjT1NYLW9ubHkgc3RyYXdtYW4gaW1wbGVtZW50YXRpb24uCitEZXNwaXRlIG90aGVyIHJ1bW91cnMgdGhlIG5hbWUgc3RhbmRzIGZvciAiUGFja21hbiBJTVBsZW1lbnRhdGlvbiIuCisKK1Rvb2xzIHRvIGFsbG93IGVhc3kgaW5zdGFsbGF0aW9uIG9mIHBhY2thZ2VzLiBUaGUgaWRlYSBpcyB0aGF0IHRoZXJlIGlzCithbiBvbmxpbmUgWE1MIGRhdGFiYXNlIHBlciAocGxhdGZvcm0sIHB5dGhvbi12ZXJzaW9uKSBjb250YWluaW5nIHBhY2thZ2VzCitrbm93biB0byB3b3JrIHdpdGggdGhhdCBjb21iaW5hdGlvbi4gVGhpcyBtb2R1bGUgY29udGFpbnMgdG9vbHMgZm9yIGdldHRpbmcKK2FuZCBwYXJzaW5nIHRoZSBkYXRhYmFzZSwgdGVzdGluZyB3aGV0aGVyIHBhY2thZ2VzIGFyZSBpbnN0YWxsZWQsIGNvbXB1dGluZworZGVwZW5kZW5jaWVzIGFuZCBpbnN0YWxsaW5nIHBhY2thZ2VzLgorCitUaGVyZSBpcyBhIG1pbmltYWwgbWFpbiBwcm9ncmFtIHRoYXQgd29ya3MgYXMgYSBjb21tYW5kIGxpbmUgdG9vbCwgYnV0IHRoZQoraW50ZW50aW9uIGlzIHRoYXQgdGhlIGVuZCB1c2VyIHdpbGwgdXNlIHRoaXMgdGhyb3VnaCBhIEdVSS4KKyIiIgorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIkluIDMueCwgdGhlIHBpbXAgbW9kdWxlIGlzIHJlbW92ZWQuIiwgc3RhY2tsZXZlbD0yKQorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdXJsbGliCitpbXBvcnQgdXJsbGliMgoraW1wb3J0IHVybHBhcnNlCitpbXBvcnQgcGxpc3RsaWIKK2ltcG9ydCBkaXN0dXRpbHMudXRpbAoraW1wb3J0IGRpc3R1dGlscy5zeXNjb25maWcKK2ltcG9ydCBoYXNobGliCitpbXBvcnQgdGFyZmlsZQoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgdGltZQorCitfX2FsbF9fID0gWyJQaW1wUHJlZmVyZW5jZXMiLCAiUGltcERhdGFiYXNlIiwgIlBpbXBQYWNrYWdlIiwgIm1haW4iLAorICAgICJnZXREZWZhdWx0RGF0YWJhc2UiLCAiUElNUF9WRVJTSU9OIiwgIm1haW4iXQorCitfc2NyaXB0RXhjX05vdEluc3RhbGxlZCA9ICJwaW1wLl9zY3JpcHRFeGNfTm90SW5zdGFsbGVkIgorX3NjcmlwdEV4Y19PbGRJbnN0YWxsZWQgPSAicGltcC5fc2NyaXB0RXhjX09sZEluc3RhbGxlZCIKK19zY3JpcHRFeGNfQmFkSW5zdGFsbGVkID0gInBpbXAuX3NjcmlwdEV4Y19CYWRJbnN0YWxsZWQiCisKK05PX0VYRUNVVEU9MAorCitQSU1QX1ZFUlNJT049IjAuNSIKKworIyBGbGF2b3JzOgorIyBzb3VyY2U6IHNldHVwLWJhc2VkIHBhY2thZ2UKKyMgYmluYXJ5OiB0YXIgKG9yIG90aGVyKSBhcmNoaXZlIGNyZWF0ZWQgd2l0aCBzZXR1cC5weSBiZGlzdC4KKyMgaW5zdGFsbGVyOiBzb21ldGhpbmcgdGhhdCBjYW4gYmUgb3BlbmVkCitERUZBVUxUX0ZMQVZPUk9SREVSPVsnc291cmNlJywgJ2JpbmFyeScsICdpbnN0YWxsZXInXQorREVGQVVMVF9ET1dOTE9BRERJUj0nL3RtcCcKK0RFRkFVTFRfQlVJTERESVI9Jy90bXAnCitERUZBVUxUX0lOU1RBTExESVI9ZGlzdHV0aWxzLnN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYigpCitERUZBVUxUX1BJTVBEQVRBQkFTRV9GTVQ9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9wYWNrbWFuL3ZlcnNpb24tJXMvJXMtJXMtJXMtJXMtJXMucGxpc3QiCisKK2RlZiBnZXREZWZhdWx0RGF0YWJhc2UoZXhwZXJpbWVudGFsPUZhbHNlKToKKyAgICBpZiBleHBlcmltZW50YWw6CisgICAgICAgIHN0YXR1cyA9ICJleHAiCisgICAgZWxzZToKKyAgICAgICAgc3RhdHVzID0gInByb2QiCisKKyAgICBtYWpvciwgbWlub3IsIG1pY3JvLCBzdGF0ZSwgZXh0cmEgPSBzeXMudmVyc2lvbl9pbmZvCisgICAgcHl2ZXJzID0gJyVkLiVkJyAlIChtYWpvciwgbWlub3IpCisgICAgaWYgbWljcm8gPT0gMCBhbmQgc3RhdGUgIT0gJ2ZpbmFsJzoKKyAgICAgICAgcHl2ZXJzID0gcHl2ZXJzICsgJyVzJWQnICUgKHN0YXRlLCBleHRyYSkKKworICAgIGxvbmdwbGF0Zm9ybSA9IGRpc3R1dGlscy51dGlsLmdldF9wbGF0Zm9ybSgpCisgICAgb3NuYW1lLCByZWxlYXNlLCBtYWNoaW5lID0gbG9uZ3BsYXRmb3JtLnNwbGl0KCctJykKKyAgICAjIEZvciBzb21lIHBsYXRmb3JtcyB3ZSBtYXkgd2FudCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4KKyAgICAjIGluc3RhbGxhdGlvbiB0eXBlcworICAgIGlmIG9zbmFtZSA9PSAnZGFyd2luJzoKKyAgICAgICAgaWYgc3lzLnByZWZpeC5zdGFydHN3aXRoKCcvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrJyk6CisgICAgICAgICAgICBvc25hbWUgPSAnZGFyd2luX2FwcGxlJworICAgICAgICBlbGlmIHN5cy5wcmVmaXguc3RhcnRzd2l0aCgnL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrJyk6CisgICAgICAgICAgICBvc25hbWUgPSAnZGFyd2luX21hY3B5dGhvbicKKyAgICAgICAgIyBPdGhlcndpc2Ugd2UgZG9uJ3Qga25vdy4uLgorICAgICMgTm93IHdlIHRyeSB2YXJpb3VzIFVSTHMgYnkgcGxheWluZyB3aXRoIHRoZSByZWxlYXNlIHN0cmluZy4KKyAgICAjIFdlIHJlbW92ZSBudW1iZXJzIG9mZiB0aGUgZW5kIHVudGlsIHdlIGZpbmQgYSBtYXRjaC4KKyAgICByZWwgPSByZWxlYXNlCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdXJsID0gREVGQVVMVF9QSU1QREFUQUJBU0VfRk1UICUgKFBJTVBfVkVSU0lPTiwgc3RhdHVzLCBweXZlcnMsIG9zbmFtZSwgcmVsLCBtYWNoaW5lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB1cmxsaWIyLnVybG9wZW4odXJsKQorICAgICAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3IsIGFyZzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIG5vdCByZWw6CisgICAgICAgICAgICAjIFdlJ3JlIG91dCBvZiB2ZXJzaW9uIG51bWJlcnMgdG8gdHJ5LiBVc2UgdGhlCisgICAgICAgICAgICAjIGZ1bGwgcmVsZWFzZSBudW1iZXIsIHRoaXMgd2lsbCBnaXZlIGEgcmVhc29uYWJsZQorICAgICAgICAgICAgIyBlcnJvciBtZXNzYWdlIGxhdGVyCisgICAgICAgICAgICB1cmwgPSBERUZBVUxUX1BJTVBEQVRBQkFTRV9GTVQgJSAoUElNUF9WRVJTSU9OLCBzdGF0dXMsIHB5dmVycywgb3NuYW1lLCByZWxlYXNlLCBtYWNoaW5lKQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWR4ID0gcmVsLnJmaW5kKCcuJykKKyAgICAgICAgaWYgaWR4IDwgMDoKKyAgICAgICAgICAgIHJlbCA9ICcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZWwgPSByZWxbOmlkeF0KKyAgICByZXR1cm4gdXJsCisKK2RlZiBfY21kKG91dHB1dCwgZGlyLCAqY21kaXRlbXMpOgorICAgICIiIkludGVybmFsIHJvdXRpbmUgdG8gcnVuIGEgc2hlbGwgY29tbWFuZCBpbiBhIGdpdmVuIGRpcmVjdG9yeS4iIiIKKworICAgIGNtZCA9ICgiY2QgXCIlc1wiOyAiICUgZGlyKSArICIgIi5qb2luKGNtZGl0ZW1zKQorICAgIGlmIG91dHB1dDoKKyAgICAgICAgb3V0cHV0LndyaXRlKCIrICVzXG4iICUgY21kKQorICAgIGlmIE5PX0VYRUNVVEU6CisgICAgICAgIHJldHVybiAwCisgICAgY2hpbGQgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9VHJ1ZSwgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgY2hpbGQuc3RkaW4uY2xvc2UoKQorICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBjaGlsZC5zdGRvdXQucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIG91dHB1dDoKKyAgICAgICAgICAgIG91dHB1dC53cml0ZShsaW5lKQorICAgIHJldHVybiBjaGlsZC53YWl0KCkKKworY2xhc3MgUGltcERvd25sb2FkZXI6CisgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyAtIERvd25sb2FkZXIgZm9yIGFyY2hpdmVzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJndW1lbnQsCisgICAgICAgICAgICBkaXI9IiIsCisgICAgICAgICAgICB3YXRjaGVyPU5vbmUpOgorICAgICAgICBzZWxmLmFyZ3VtZW50ID0gYXJndW1lbnQKKyAgICAgICAgc2VsZi5fZGlyID0gZGlyCisgICAgICAgIHNlbGYuX3dhdGNoZXIgPSB3YXRjaGVyCisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdXJsLCBmaWxlbmFtZSwgb3V0cHV0PU5vbmUpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHVwZGF0ZShzZWxmLCBzdHIpOgorICAgICAgICBpZiBzZWxmLl93YXRjaGVyOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3dhdGNoZXIudXBkYXRlKHN0cikKKyAgICAgICAgcmV0dXJuIFRydWUKKworY2xhc3MgUGltcEN1cmxEb3dubG9hZGVyKFBpbXBEb3dubG9hZGVyKToKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCB1cmwsIGZpbGVuYW1lLCBvdXRwdXQ9Tm9uZSk6CisgICAgICAgIHNlbGYudXBkYXRlKCJEb3dubG9hZGluZyAlcy4uLiIgJSB1cmwpCisgICAgICAgIGV4aXRzdGF0dXMgPSBfY21kKG91dHB1dCwgc2VsZi5fZGlyLAorICAgICAgICAgICAgICAgICAgICAiY3VybCIsCisgICAgICAgICAgICAgICAgICAgICItLW91dHB1dCIsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICB1cmwpCisgICAgICAgIHNlbGYudXBkYXRlKCJEb3dubG9hZGluZyAlczogZmluaXNoZWQiICUgdXJsKQorICAgICAgICByZXR1cm4gKG5vdCBleGl0c3RhdHVzKQorCitjbGFzcyBQaW1wVXJsbGliRG93bmxvYWRlcihQaW1wRG93bmxvYWRlcik6CisKKyAgICBkZWYgZG93bmxvYWQoc2VsZiwgdXJsLCBmaWxlbmFtZSwgb3V0cHV0PU5vbmUpOgorICAgICAgICBvdXRwdXQgPSBvcGVuKGZpbGVuYW1lLCAnd2InKQorICAgICAgICBzZWxmLnVwZGF0ZSgiRG93bmxvYWRpbmcgJXM6IG9wZW5pbmcgY29ubmVjdGlvbiIgJSB1cmwpCisgICAgICAgIGtlZXBnb2luZyA9IFRydWUKKyAgICAgICAgZG93bmxvYWQgPSB1cmxsaWIyLnVybG9wZW4odXJsKQorICAgICAgICBpZiAnY29udGVudC1sZW5ndGgnIGluIGRvd25sb2FkLmhlYWRlcnM6CisgICAgICAgICAgICBsZW5ndGggPSBsb25nKGRvd25sb2FkLmhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsZW5ndGggPSAtMQorCisgICAgICAgIGRhdGEgPSBkb3dubG9hZC5yZWFkKDQwOTYpICNyZWFkIDRLIGF0IGEgdGltZQorICAgICAgICBkbHNpemUgPSAwCisgICAgICAgIGxhc3R0aW1lID0gMAorICAgICAgICB3aGlsZSBrZWVwZ29pbmc6CisgICAgICAgICAgICBkbHNpemUgPSBkbHNpemUgKyBsZW4oZGF0YSkKKyAgICAgICAgICAgIGlmIGxlbihkYXRhKSA9PSAwOgorICAgICAgICAgICAgICAgICN0aGlzIGlzIG91ciBleGl0IGNvbmRpdGlvbgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBvdXRwdXQud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGlmIGludCh0aW1lLnRpbWUoKSkgIT0gbGFzdHRpbWU6CisgICAgICAgICAgICAgICAgIyBVcGRhdGUgYXQgbW9zdCBvbmNlIHBlciBzZWNvbmQKKyAgICAgICAgICAgICAgICBsYXN0dGltZSA9IGludCh0aW1lLnRpbWUoKSkKKyAgICAgICAgICAgICAgICBpZiBsZW5ndGggPT0gLTE6CisgICAgICAgICAgICAgICAgICAgIGtlZXBnb2luZyA9IHNlbGYudXBkYXRlKCJEb3dubG9hZGluZyAlczogJWQgYnl0ZXMuLi4iICUgKHVybCwgZGxzaXplKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBrZWVwZ29pbmcgPSBzZWxmLnVwZGF0ZSgiRG93bmxvYWRpbmcgJXM6ICVkJSUgKCVkIGJ5dGVzKS4uLiIgJSAodXJsLCBpbnQoMTAwLjAqZGxzaXplL2xlbmd0aCksIGRsc2l6ZSkpCisgICAgICAgICAgICBkYXRhID0gZG93bmxvYWQucmVhZCg0MDk2KQorICAgICAgICBpZiBrZWVwZ29pbmc6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZSgiRG93bmxvYWRpbmcgJXM6IGZpbmlzaGVkIiAlIHVybCkKKyAgICAgICAgcmV0dXJuIGtlZXBnb2luZworCitjbGFzcyBQaW1wVW5wYWNrZXI6CisgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyAtIFVucGFja2VyIGZvciBhcmNoaXZlcyIiIgorCisgICAgX2Nhbl9yZW5hbWUgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3VtZW50LAorICAgICAgICAgICAgZGlyPSIiLAorICAgICAgICAgICAgcmVuYW1lcz1bXSwKKyAgICAgICAgICAgIHdhdGNoZXI9Tm9uZSk6CisgICAgICAgIHNlbGYuYXJndW1lbnQgPSBhcmd1bWVudAorICAgICAgICBpZiByZW5hbWVzIGFuZCBub3Qgc2VsZi5fY2FuX3JlbmFtZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIlRoaXMgdW5wYWNrZXIgY2Fubm90IHJlbmFtZSBmaWxlcyIKKyAgICAgICAgc2VsZi5fZGlyID0gZGlyCisgICAgICAgIHNlbGYuX3JlbmFtZXMgPSByZW5hbWVzCisgICAgICAgIHNlbGYuX3dhdGNoZXIgPSB3YXRjaGVyCisKKyAgICBkZWYgdW5wYWNrKHNlbGYsIGFyY2hpdmUsIG91dHB1dD1Ob25lLCBwYWNrYWdlPU5vbmUpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHVwZGF0ZShzZWxmLCBzdHIpOgorICAgICAgICBpZiBzZWxmLl93YXRjaGVyOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3dhdGNoZXIudXBkYXRlKHN0cikKKyAgICAgICAgcmV0dXJuIFRydWUKKworY2xhc3MgUGltcENvbW1hbmRVbnBhY2tlcihQaW1wVW5wYWNrZXIpOgorICAgICIiIlVucGFjayBhcmNoaXZlcyBieSBjYWxsaW5nIGEgVW5peCB1dGlsaXR5IiIiCisKKyAgICBfY2FuX3JlbmFtZSA9IEZhbHNlCisKKyAgICBkZWYgdW5wYWNrKHNlbGYsIGFyY2hpdmUsIG91dHB1dD1Ob25lLCBwYWNrYWdlPU5vbmUpOgorICAgICAgICBjbWQgPSBzZWxmLmFyZ3VtZW50ICUgYXJjaGl2ZQorICAgICAgICBpZiBfY21kKG91dHB1dCwgc2VsZi5fZGlyLCBjbWQpOgorICAgICAgICAgICAgcmV0dXJuICJ1bnBhY2sgY29tbWFuZCBmYWlsZWQiCisKK2NsYXNzIFBpbXBUYXJVbnBhY2tlcihQaW1wVW5wYWNrZXIpOgorICAgICIiIlVucGFjayB0YXJmaWxlcyB1c2luZyB0aGUgYnVpbHRpbiB0YXJmaWxlIG1vZHVsZSIiIgorCisgICAgX2Nhbl9yZW5hbWUgPSBUcnVlCisKKyAgICBkZWYgdW5wYWNrKHNlbGYsIGFyY2hpdmUsIG91dHB1dD1Ob25lLCBwYWNrYWdlPU5vbmUpOgorICAgICAgICB0ZiA9IHRhcmZpbGUub3BlbihhcmNoaXZlLCAiciIpCisgICAgICAgIG1lbWJlcnMgPSB0Zi5nZXRtZW1iZXJzKCkKKyAgICAgICAgc2tpcCA9IFtdCisgICAgICAgIGlmIHNlbGYuX3JlbmFtZXM6CisgICAgICAgICAgICBmb3IgbWVtYmVyIGluIG1lbWJlcnM6CisgICAgICAgICAgICAgICAgZm9yIG9sZHByZWZpeCwgbmV3cHJlZml4IGluIHNlbGYuX3JlbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIG9sZHByZWZpeFs6bGVuKHNlbGYuX2RpcildID09IHNlbGYuX2RpcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9sZHByZWZpeDIgPSBvbGRwcmVmaXhbbGVuKHNlbGYuX2Rpcik6XQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgb2xkcHJlZml4MiA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgbWVtYmVyLm5hbWVbOmxlbihvbGRwcmVmaXgpXSA9PSBvbGRwcmVmaXg6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBuZXdwcmVmaXggaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwLmFwcGVuZChtZW1iZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3ByaW50ICdTS0lQJywgbWVtYmVyLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyLm5hbWUgPSBuZXdwcmVmaXggKyBtZW1iZXIubmFtZVtsZW4ob2xkcHJlZml4KTpdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyAgICAnLCBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBvbGRwcmVmaXgyIGFuZCBtZW1iZXIubmFtZVs6bGVuKG9sZHByZWZpeDIpXSA9PSBvbGRwcmVmaXgyOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbmV3cHJlZml4IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcC5hcHBlbmQobWVtYmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCAnU0tJUCcsIG1lbWJlci5uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlci5uYW1lID0gbmV3cHJlZml4ICsgbWVtYmVyLm5hbWVbbGVuKG9sZHByZWZpeDIpOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcHJpbnQgJyAgICAnLCBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBza2lwLmFwcGVuZChtZW1iZXIpCisgICAgICAgICAgICAgICAgICAgICNwcmludCAnPz8/PycsIG1lbWJlci5uYW1lCisgICAgICAgIGZvciBtZW1iZXIgaW4gbWVtYmVyczoKKyAgICAgICAgICAgIGlmIG1lbWJlciBpbiBza2lwOgorICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlKCJTa2lwcGluZyAlcyIgJSBtZW1iZXIubmFtZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi51cGRhdGUoIkV4dHJhY3RpbmcgJXMiICUgbWVtYmVyLm5hbWUpCisgICAgICAgICAgICB0Zi5leHRyYWN0KG1lbWJlciwgc2VsZi5fZGlyKQorICAgICAgICBpZiBza2lwOgorICAgICAgICAgICAgbmFtZXMgPSBbbWVtYmVyLm5hbWUgZm9yIG1lbWJlciBpbiBza2lwIGlmIG1lbWJlci5uYW1lWy0xXSAhPSAnLyddCisgICAgICAgICAgICBpZiBwYWNrYWdlOgorICAgICAgICAgICAgICAgIG5hbWVzID0gcGFja2FnZS5maWx0ZXJFeHBlY3RlZFNraXBzKG5hbWVzKQorICAgICAgICAgICAgaWYgbmFtZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJOb3QgYWxsIGZpbGVzIHdlcmUgdW5wYWNrZWQ6ICVzIiAlICIgIi5qb2luKG5hbWVzKQorCitBUkNISVZFX0ZPUk1BVFMgPSBbCisgICAgKCIudGFyLloiLCBQaW1wVGFyVW5wYWNrZXIsIE5vbmUpLAorICAgICgiLnRheiIsIFBpbXBUYXJVbnBhY2tlciwgTm9uZSksCisgICAgKCIudGFyLmd6IiwgUGltcFRhclVucGFja2VyLCBOb25lKSwKKyAgICAoIi50Z3oiLCBQaW1wVGFyVW5wYWNrZXIsIE5vbmUpLAorICAgICgiLnRhci5ieiIsIFBpbXBUYXJVbnBhY2tlciwgTm9uZSksCisgICAgKCIuemlwIiwgUGltcENvbW1hbmRVbnBhY2tlciwgInVuemlwIFwiJXNcIiIpLAorXQorCitjbGFzcyBQaW1wUHJlZmVyZW5jZXM6CisgICAgIiIiQ29udGFpbmVyIGZvciBwZXItdXNlciBwcmVmZXJlbmNlcywgc3VjaCBhcyB0aGUgZGF0YWJhc2UgdG8gdXNlCisgICAgYW5kIHdoZXJlIHRvIGluc3RhbGwgcGFja2FnZXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgIGZsYXZvck9yZGVyPU5vbmUsCisgICAgICAgICAgICBkb3dubG9hZERpcj1Ob25lLAorICAgICAgICAgICAgYnVpbGREaXI9Tm9uZSwKKyAgICAgICAgICAgIGluc3RhbGxEaXI9Tm9uZSwKKyAgICAgICAgICAgIHBpbXBEYXRhYmFzZT1Ob25lKToKKyAgICAgICAgaWYgbm90IGZsYXZvck9yZGVyOgorICAgICAgICAgICAgZmxhdm9yT3JkZXIgPSBERUZBVUxUX0ZMQVZPUk9SREVSCisgICAgICAgIGlmIG5vdCBkb3dubG9hZERpcjoKKyAgICAgICAgICAgIGRvd25sb2FkRGlyID0gREVGQVVMVF9ET1dOTE9BRERJUgorICAgICAgICBpZiBub3QgYnVpbGREaXI6CisgICAgICAgICAgICBidWlsZERpciA9IERFRkFVTFRfQlVJTERESVIKKyAgICAgICAgaWYgbm90IHBpbXBEYXRhYmFzZToKKyAgICAgICAgICAgIHBpbXBEYXRhYmFzZSA9IGdldERlZmF1bHREYXRhYmFzZSgpCisgICAgICAgIHNlbGYuc2V0SW5zdGFsbERpcihpbnN0YWxsRGlyKQorICAgICAgICBzZWxmLmZsYXZvck9yZGVyID0gZmxhdm9yT3JkZXIKKyAgICAgICAgc2VsZi5kb3dubG9hZERpciA9IGRvd25sb2FkRGlyCisgICAgICAgIHNlbGYuYnVpbGREaXIgPSBidWlsZERpcgorICAgICAgICBzZWxmLnBpbXBEYXRhYmFzZSA9IHBpbXBEYXRhYmFzZQorICAgICAgICBzZWxmLndhdGNoZXIgPSBOb25lCisKKyAgICBkZWYgc2V0V2F0Y2hlcihzZWxmLCB3YXRjaGVyKToKKyAgICAgICAgc2VsZi53YXRjaGVyID0gd2F0Y2hlcgorCisgICAgZGVmIHNldEluc3RhbGxEaXIoc2VsZiwgaW5zdGFsbERpcj1Ob25lKToKKyAgICAgICAgaWYgaW5zdGFsbERpcjoKKyAgICAgICAgICAgICMgSW5zdGFsbGluZyB0byBub24tc3RhbmRhcmQgbG9jYXRpb24uCisgICAgICAgICAgICBzZWxmLmluc3RhbGxMb2NhdGlvbnMgPSBbCisgICAgICAgICAgICAgICAgKCctLWluc3RhbGwtbGliJywgaW5zdGFsbERpciksCisgICAgICAgICAgICAgICAgKCctLWluc3RhbGwtaGVhZGVycycsIE5vbmUpLAorICAgICAgICAgICAgICAgICgnLS1pbnN0YWxsLXNjcmlwdHMnLCBOb25lKSwKKyAgICAgICAgICAgICAgICAoJy0taW5zdGFsbC1kYXRhJywgTm9uZSldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbnN0YWxsRGlyID0gREVGQVVMVF9JTlNUQUxMRElSCisgICAgICAgICAgICBzZWxmLmluc3RhbGxMb2NhdGlvbnMgPSBbXQorICAgICAgICBzZWxmLmluc3RhbGxEaXIgPSBpbnN0YWxsRGlyCisKKyAgICBkZWYgaXNVc2VySW5zdGFsbChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbERpciAhPSBERUZBVUxUX0lOU1RBTExESVIKKworICAgIGRlZiBjaGVjayhzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCB0aGUgcHJlZmVyZW5jZXMgbWFrZSBzZW5zZTogZGlyZWN0b3JpZXMgZXhpc3QgYW5kIGFyZQorICAgICAgICB3cml0YWJsZSwgdGhlIGluc3RhbGwgZGlyZWN0b3J5IGlzIG9uIHN5cy5wYXRoLCBldGMuIiIiCisKKyAgICAgICAgcnYgPSAiIgorICAgICAgICBSV1hfT0sgPSBvcy5SX09LfG9zLldfT0t8b3MuWF9PSworICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5kb3dubG9hZERpcik6CisgICAgICAgICAgICBydiArPSAiV2FybmluZzogRG93bmxvYWQgZGlyZWN0b3J5IFwiJXNcIiBkb2VzIG5vdCBleGlzdFxuIiAlIHNlbGYuZG93bmxvYWREaXIKKyAgICAgICAgZWxpZiBub3Qgb3MuYWNjZXNzKHNlbGYuZG93bmxvYWREaXIsIFJXWF9PSyk6CisgICAgICAgICAgICBydiArPSAiV2FybmluZzogRG93bmxvYWQgZGlyZWN0b3J5IFwiJXNcIiBpcyBub3Qgd3JpdGFibGUgb3Igbm90IHJlYWRhYmxlXG4iICUgc2VsZi5kb3dubG9hZERpcgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5idWlsZERpcik6CisgICAgICAgICAgICBydiArPSAiV2FybmluZzogQnVpbGQgZGlyZWN0b3J5IFwiJXNcIiBkb2VzIG5vdCBleGlzdFxuIiAlIHNlbGYuYnVpbGREaXIKKyAgICAgICAgZWxpZiBub3Qgb3MuYWNjZXNzKHNlbGYuYnVpbGREaXIsIFJXWF9PSyk6CisgICAgICAgICAgICBydiArPSAiV2FybmluZzogQnVpbGQgZGlyZWN0b3J5IFwiJXNcIiBpcyBub3Qgd3JpdGFibGUgb3Igbm90IHJlYWRhYmxlXG4iICUgc2VsZi5idWlsZERpcgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5pbnN0YWxsRGlyKToKKyAgICAgICAgICAgIHJ2ICs9ICJXYXJuaW5nOiBJbnN0YWxsIGRpcmVjdG9yeSBcIiVzXCIgZG9lcyBub3QgZXhpc3RcbiIgJSBzZWxmLmluc3RhbGxEaXIKKyAgICAgICAgZWxpZiBub3Qgb3MuYWNjZXNzKHNlbGYuaW5zdGFsbERpciwgUldYX09LKToKKyAgICAgICAgICAgIHJ2ICs9ICJXYXJuaW5nOiBJbnN0YWxsIGRpcmVjdG9yeSBcIiVzXCIgaXMgbm90IHdyaXRhYmxlIG9yIG5vdCByZWFkYWJsZVxuIiAlIHNlbGYuaW5zdGFsbERpcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5zdGFsbERpciA9IG9zLnBhdGgucmVhbHBhdGgoc2VsZi5pbnN0YWxsRGlyKQorICAgICAgICAgICAgZm9yIHAgaW4gc3lzLnBhdGg6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZWFscGF0aCA9IG9zLnBhdGgucmVhbHBhdGgocCkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBpZiBpbnN0YWxsRGlyID09IHJlYWxwYXRoOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBydiArPSAiV2FybmluZzogSW5zdGFsbCBkaXJlY3RvcnkgXCIlc1wiIGlzIG5vdCBvbiBzeXMucGF0aFxuIiAlIHNlbGYuaW5zdGFsbERpcgorICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBjb21wYXJlRmxhdm9ycyhzZWxmLCBsZWZ0LCByaWdodCk6CisgICAgICAgICIiIkNvbXBhcmUgdHdvIGZsYXZvciBzdHJpbmdzLiBUaGlzIGlzIHBhcnQgb2YgeW91ciBwcmVmZXJlbmNlcworICAgICAgICBiZWNhdXNlIHdoZXRoZXIgdGhlIHVzZXIgcHJlZmVycyBpbnN0YWxsaW5nIGZyb20gc291cmNlIG9yIGJpbmFyeSBpcy4iIiIKKyAgICAgICAgaWYgbGVmdCBpbiBzZWxmLmZsYXZvck9yZGVyOgorICAgICAgICAgICAgaWYgcmlnaHQgaW4gc2VsZi5mbGF2b3JPcmRlcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZmxhdm9yT3JkZXIuaW5kZXgobGVmdCksIHNlbGYuZmxhdm9yT3JkZXIuaW5kZXgocmlnaHQpKQorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGlmIHJpZ2h0IGluIHNlbGYuZmxhdm9yT3JkZXI6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICByZXR1cm4gY21wKGxlZnQsIHJpZ2h0KQorCitjbGFzcyBQaW1wRGF0YWJhc2U6CisgICAgIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGEgcGltcCBkYXRhYmFzZS4gSXQgY2FuIGFjdHVhbGx5IGNvbnRhaW4KKyAgICBpbmZvcm1hdGlvbiBmcm9tIG11bHRpcGxlIGRhdGFiYXNlcyB0aHJvdWdoIGluY2x1c2lvbiwgYnV0IHRoZQorICAgIHRvcGxldmVsIGRhdGFiYXNlIGlzIGNvbnNpZGVyZWQgdGhlIG1hc3RlciwgYXMgaXRzIG1haW50YWluZXIgaXMKKyAgICAicmVzcG9uc2libGUiIGZvciB0aGUgY29udGVudHMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJlZnMpOgorICAgICAgICBzZWxmLl9wYWNrYWdlcyA9IFtdCisgICAgICAgIHNlbGYucHJlZmVyZW5jZXMgPSBwcmVmcworICAgICAgICBzZWxmLl91cmwgPSAiIgorICAgICAgICBzZWxmLl91cmxsaXN0ID0gW10KKyAgICAgICAgc2VsZi5fdmVyc2lvbiA9ICIiCisgICAgICAgIHNlbGYuX21haW50YWluZXIgPSAiIgorICAgICAgICBzZWxmLl9kZXNjcmlwdGlvbiA9ICIiCisKKyAgICAjIEFjY2Vzc29yIGZ1bmN0aW9ucworICAgIGRlZiB1cmwoc2VsZik6IHJldHVybiBzZWxmLl91cmwKKyAgICBkZWYgdmVyc2lvbihzZWxmKTogcmV0dXJuIHNlbGYuX3ZlcnNpb24KKyAgICBkZWYgbWFpbnRhaW5lcihzZWxmKTogcmV0dXJuIHNlbGYuX21haW50YWluZXIKKyAgICBkZWYgZGVzY3JpcHRpb24oc2VsZik6IHJldHVybiBzZWxmLl9kZXNjcmlwdGlvbgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbGVhbiB1cCIiIgorICAgICAgICBzZWxmLl9wYWNrYWdlcyA9IFtdCisgICAgICAgIHNlbGYucHJlZmVyZW5jZXMgPSBOb25lCisKKyAgICBkZWYgYXBwZW5kVVJMKHNlbGYsIHVybCwgaW5jbHVkZWQ9MCk6CisgICAgICAgICIiIkFwcGVuZCBwYWNrYWdlcyBmcm9tIHRoZSBkYXRhYmFzZSB3aXRoIHRoZSBnaXZlbiBVUkwuCisgICAgICAgIE9ubHkgdGhlIGZpcnN0IGRhdGFiYXNlIHNob3VsZCBzcGVjaWZ5IGluY2x1ZGVkPTAsIHNvIHRoZQorICAgICAgICBnbG9iYWwgaW5mb3JtYXRpb24gKG1haW50YWluZXIsIGRlc2NyaXB0aW9uKSBnZXQgc3RvcmVkLiIiIgorCisgICAgICAgIGlmIHVybCBpbiBzZWxmLl91cmxsaXN0OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX3VybGxpc3QuYXBwZW5kKHVybCkKKyAgICAgICAgZnAgPSB1cmxsaWIyLnVybG9wZW4odXJsKS5mcAorICAgICAgICBwbGlzdGRhdGEgPSBwbGlzdGxpYi5QbGlzdC5mcm9tRmlsZShmcCkKKyAgICAgICAgIyBUZXN0IGhlcmUgZm9yIFBpbXAgdmVyc2lvbiwgZXRjCisgICAgICAgIGlmIGluY2x1ZGVkOgorICAgICAgICAgICAgdmVyc2lvbiA9IHBsaXN0ZGF0YS5nZXQoJ1ZlcnNpb24nKQorICAgICAgICAgICAgaWYgdmVyc2lvbiBhbmQgdmVyc2lvbiA+IHNlbGYuX3ZlcnNpb246CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogaW5jbHVkZWQgZGF0YWJhc2UgJXMgaXMgZm9yIHBpbXAgdmVyc2lvbiAlc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICh1cmwsIHZlcnNpb24pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fdmVyc2lvbiA9IHBsaXN0ZGF0YS5nZXQoJ1ZlcnNpb24nKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3ZlcnNpb246CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogZGF0YWJhc2UgaGFzIG5vIFZlcnNpb24gaW5mb3JtYXRpb25cbiIpCisgICAgICAgICAgICBlbGlmIHNlbGYuX3ZlcnNpb24gPiBQSU1QX1ZFUlNJT046CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogZGF0YWJhc2UgdmVyc2lvbiAlcyBuZXdlciB0aGFuIHBpbXAgdmVyc2lvbiAlc1xuIgorICAgICAgICAgICAgICAgICAgICAlIChzZWxmLl92ZXJzaW9uLCBQSU1QX1ZFUlNJT04pKQorICAgICAgICAgICAgc2VsZi5fbWFpbnRhaW5lciA9IHBsaXN0ZGF0YS5nZXQoJ01haW50YWluZXInLCAnJykKKyAgICAgICAgICAgIHNlbGYuX2Rlc2NyaXB0aW9uID0gcGxpc3RkYXRhLmdldCgnRGVzY3JpcHRpb24nLCAnJykuc3RyaXAoKQorICAgICAgICAgICAgc2VsZi5fdXJsID0gdXJsCisgICAgICAgIHNlbGYuX2FwcGVuZFBhY2thZ2VzKHBsaXN0ZGF0YVsnUGFja2FnZXMnXSwgdXJsKQorICAgICAgICBvdGhlcnMgPSBwbGlzdGRhdGEuZ2V0KCdJbmNsdWRlJywgW10pCisgICAgICAgIGZvciBvIGluIG90aGVyczoKKyAgICAgICAgICAgIG8gPSB1cmxsaWIuYmFzZWpvaW4odXJsLCBvKQorICAgICAgICAgICAgc2VsZi5hcHBlbmRVUkwobywgaW5jbHVkZWQ9MSkKKworICAgIGRlZiBfYXBwZW5kUGFja2FnZXMoc2VsZiwgcGFja2FnZXMsIHVybCk6CisgICAgICAgICIiIkdpdmVuIGEgbGlzdCBvZiBkaWN0aW9uYXJpZXMgY29udGFpbmluZyBwYWNrYWdlCisgICAgICAgIGRlc2NyaXB0aW9ucyBjcmVhdGUgdGhlIFBpbXBQYWNrYWdlIG9iamVjdHMgYW5kIGFwcGVuZCB0aGVtCisgICAgICAgIHRvIG91ciBpbnRlcm5hbCBzdG9yYWdlLiIiIgorCisgICAgICAgIGZvciBwIGluIHBhY2thZ2VzOgorICAgICAgICAgICAgcCA9IGRpY3QocCkKKyAgICAgICAgICAgIGlmICdEb3dubG9hZC1VUkwnIGluIHA6CisgICAgICAgICAgICAgICAgcFsnRG93bmxvYWQtVVJMJ10gPSB1cmxsaWIuYmFzZWpvaW4odXJsLCBwWydEb3dubG9hZC1VUkwnXSkKKyAgICAgICAgICAgIGZsYXZvciA9IHAuZ2V0KCdGbGF2b3InKQorICAgICAgICAgICAgaWYgZmxhdm9yID09ICdzb3VyY2UnOgorICAgICAgICAgICAgICAgIHBrZyA9IFBpbXBQYWNrYWdlX3NvdXJjZShzZWxmLCBwKQorICAgICAgICAgICAgZWxpZiBmbGF2b3IgPT0gJ2JpbmFyeSc6CisgICAgICAgICAgICAgICAgcGtnID0gUGltcFBhY2thZ2VfYmluYXJ5KHNlbGYsIHApCisgICAgICAgICAgICBlbGlmIGZsYXZvciA9PSAnaW5zdGFsbGVyJzoKKyAgICAgICAgICAgICAgICBwa2cgPSBQaW1wUGFja2FnZV9pbnN0YWxsZXIoc2VsZiwgcCkKKyAgICAgICAgICAgIGVsaWYgZmxhdm9yID09ICdoaWRkZW4nOgorICAgICAgICAgICAgICAgIHBrZyA9IFBpbXBQYWNrYWdlX2luc3RhbGxlcihzZWxmLCBwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwa2cgPSBQaW1wUGFja2FnZShzZWxmLCBkaWN0KHApKQorICAgICAgICAgICAgc2VsZi5fcGFja2FnZXMuYXBwZW5kKHBrZykKKworICAgIGRlZiBsaXN0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBQaW1wUGFja2FnZSBvYmplY3RzIGluIHRoZSBkYXRhYmFzZS4iIiIKKworICAgICAgICByZXR1cm4gc2VsZi5fcGFja2FnZXMKKworICAgIGRlZiBsaXN0bmFtZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgbmFtZXMgb2YgYWxsIHBhY2thZ2VzIGluIHRoZSBkYXRhYmFzZS4iIiIKKworICAgICAgICBydiA9IFtdCisgICAgICAgIGZvciBwa2cgaW4gc2VsZi5fcGFja2FnZXM6CisgICAgICAgICAgICBydi5hcHBlbmQocGtnLmZ1bGxuYW1lKCkpCisgICAgICAgIHJ2LnNvcnQoKQorICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBkdW1wKHNlbGYsIHBhdGhPckZpbGUpOgorICAgICAgICAiIiJEdW1wIHRoZSBjb250ZW50cyBvZiB0aGUgZGF0YWJhc2UgdG8gYW4gWE1MIC5wbGlzdCBmaWxlLgorCisgICAgICAgIFRoZSBmaWxlIGNhbiBiZSBwYXNzZWQgYXMgZWl0aGVyIGEgZmlsZSBvYmplY3Qgb3IgYSBwYXRobmFtZS4KKyAgICAgICAgQWxsIGRhdGEsIGluY2x1ZGluZyBpbmNsdWRlZCBkYXRhYmFzZXMsIGlzIGR1bXBlZC4iIiIKKworICAgICAgICBwYWNrYWdlcyA9IFtdCisgICAgICAgIGZvciBwa2cgaW4gc2VsZi5fcGFja2FnZXM6CisgICAgICAgICAgICBwYWNrYWdlcy5hcHBlbmQocGtnLmR1bXAoKSkKKyAgICAgICAgcGxpc3RkYXRhID0geworICAgICAgICAgICAgJ1ZlcnNpb24nOiBzZWxmLl92ZXJzaW9uLAorICAgICAgICAgICAgJ01haW50YWluZXInOiBzZWxmLl9tYWludGFpbmVyLAorICAgICAgICAgICAgJ0Rlc2NyaXB0aW9uJzogc2VsZi5fZGVzY3JpcHRpb24sCisgICAgICAgICAgICAnUGFja2FnZXMnOiBwYWNrYWdlcworICAgICAgICAgICAgfQorICAgICAgICBwbGlzdCA9IHBsaXN0bGliLlBsaXN0KCoqcGxpc3RkYXRhKQorICAgICAgICBwbGlzdC53cml0ZShwYXRoT3JGaWxlKQorCisgICAgZGVmIGZpbmQoc2VsZiwgaWRlbnQpOgorICAgICAgICAiIiJGaW5kIGEgcGFja2FnZS4gVGhlIHBhY2thZ2UgY2FuIGJlIHNwZWNpZmllZCBieSBuYW1lCisgICAgICAgIG9yIGFzIGEgZGljdGlvbmFyeSB3aXRoIG5hbWUsIHZlcnNpb24gYW5kIGZsYXZvciBlbnRyaWVzLgorCisgICAgICAgIE9ubHkgbmFtZSBpcyBvYmxpZ2F0b3J5LiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgbWF0Y2hlcyB0aGUKKyAgICAgICAgYmVzdCBvbmUgKGhpZ2hlciB2ZXJzaW9uIG51bWJlciwgZmxhdm9ycyBvcmRlcmVkIGFjY29yZGluZyB0bworICAgICAgICB1c2VycycgcHJlZmVyZW5jZSkgaXMgcmV0dXJuZWQuIiIiCisKKyAgICAgICAgaWYgdHlwZShpZGVudCkgPT0gc3RyOgorICAgICAgICAgICAgIyBSZW1vdmUgKCBhbmQgKSBmb3IgcHNldWRvLXBhY2thZ2VzCisgICAgICAgICAgICBpZiBpZGVudFswXSA9PSAnKCcgYW5kIGlkZW50Wy0xXSA9PSAnKSc6CisgICAgICAgICAgICAgICAgaWRlbnQgPSBpZGVudFsxOi0xXQorICAgICAgICAgICAgIyBTcGxpdCBpbnRvIG5hbWUtdmVyc2lvbi1mbGF2b3IKKyAgICAgICAgICAgIGZpZWxkcyA9IGlkZW50LnNwbGl0KCctJykKKyAgICAgICAgICAgIGlmIGxlbihmaWVsZHMpIDwgMSBvciBsZW4oZmllbGRzKSA+IDM6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIG5hbWUgPSBmaWVsZHNbMF0KKyAgICAgICAgICAgIGlmIGxlbihmaWVsZHMpID4gMToKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gZmllbGRzWzFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZlcnNpb24gPSBOb25lCisgICAgICAgICAgICBpZiBsZW4oZmllbGRzKSA+IDI6CisgICAgICAgICAgICAgICAgZmxhdm9yID0gZmllbGRzWzJdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZsYXZvciA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSBpZGVudFsnTmFtZSddCisgICAgICAgICAgICB2ZXJzaW9uID0gaWRlbnQuZ2V0KCdWZXJzaW9uJykKKyAgICAgICAgICAgIGZsYXZvciA9IGlkZW50LmdldCgnRmxhdm9yJykKKyAgICAgICAgZm91bmQgPSBOb25lCisgICAgICAgIGZvciBwIGluIHNlbGYuX3BhY2thZ2VzOgorICAgICAgICAgICAgaWYgbmFtZSA9PSBwLm5hbWUoKSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAobm90IHZlcnNpb24gb3IgdmVyc2lvbiA9PSBwLnZlcnNpb24oKSkgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgKG5vdCBmbGF2b3Igb3IgZmxhdm9yID09IHAuZmxhdm9yKCkpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBmb3VuZCBvciBmb3VuZCA8IHA6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gcAorICAgICAgICByZXR1cm4gZm91bmQKKworQUxMT1dFRF9LRVlTID0gWworICAgICJOYW1lIiwKKyAgICAiVmVyc2lvbiIsCisgICAgIkZsYXZvciIsCisgICAgIkRlc2NyaXB0aW9uIiwKKyAgICAiSG9tZS1wYWdlIiwKKyAgICAiRG93bmxvYWQtVVJMIiwKKyAgICAiSW5zdGFsbC10ZXN0IiwKKyAgICAiSW5zdGFsbC1jb21tYW5kIiwKKyAgICAiUHJlLWluc3RhbGwtY29tbWFuZCIsCisgICAgIlBvc3QtaW5zdGFsbC1jb21tYW5kIiwKKyAgICAiUHJlcmVxdWlzaXRlcyIsCisgICAgIk1ENVN1bSIsCisgICAgIlVzZXItaW5zdGFsbC1za2lwcyIsCisgICAgIlN5c3RlbXdpZGUtb25seSIsCitdCisKK2NsYXNzIFBpbXBQYWNrYWdlOgorICAgICIiIkNsYXNzIHJlcHJlc2VudGluZyBhIHNpbmdsZSBwYWNrYWdlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiLCBwbGlzdGRhdGEpOgorICAgICAgICBzZWxmLl9kYiA9IGRiCisgICAgICAgIG5hbWUgPSBwbGlzdGRhdGFbIk5hbWUiXQorICAgICAgICBmb3IgayBpbiBwbGlzdGRhdGEua2V5cygpOgorICAgICAgICAgICAgaWYgbm90IGsgaW4gQUxMT1dFRF9LRVlTOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldhcm5pbmc6ICVzOiB1bmtub3duIGtleSAlc1xuIiAlIChuYW1lLCBrKSkKKyAgICAgICAgc2VsZi5fZGljdCA9IHBsaXN0ZGF0YQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBzZWxmLl9kaWN0W2tleV0KKworICAgIGRlZiBuYW1lKHNlbGYpOiByZXR1cm4gc2VsZi5fZGljdFsnTmFtZSddCisgICAgZGVmIHZlcnNpb24oc2VsZik6IHJldHVybiBzZWxmLl9kaWN0LmdldCgnVmVyc2lvbicpCisgICAgZGVmIGZsYXZvcihzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3QuZ2V0KCdGbGF2b3InKQorICAgIGRlZiBkZXNjcmlwdGlvbihzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3RbJ0Rlc2NyaXB0aW9uJ10uc3RyaXAoKQorICAgIGRlZiBzaG9ydGRlc2NyaXB0aW9uKHNlbGYpOiByZXR1cm4gc2VsZi5kZXNjcmlwdGlvbigpLnNwbGl0bGluZXMoKVswXQorICAgIGRlZiBob21lcGFnZShzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3QuZ2V0KCdIb21lLXBhZ2UnKQorICAgIGRlZiBkb3dubG9hZFVSTChzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3QuZ2V0KCdEb3dubG9hZC1VUkwnKQorICAgIGRlZiBzeXN0ZW13aWRlT25seShzZWxmKTogcmV0dXJuIHNlbGYuX2RpY3QuZ2V0KCdTeXN0ZW13aWRlLW9ubHknKQorCisgICAgZGVmIGZ1bGxuYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGZ1bGwgbmFtZSAibmFtZS12ZXJzaW9uLWZsYXZvciIgb2YgYSBwYWNrYWdlLgorCisgICAgICAgIElmIHRoZSBwYWNrYWdlIGlzIGEgcHNldWRvLXBhY2thZ2UsIHNvbWV0aGluZyB0aGF0IGNhbm5vdCBiZQorICAgICAgICBpbnN0YWxsZWQgdGhyb3VnaCBwaW1wLCByZXR1cm4gdGhlIG5hbWUgaW4gKHBhcmVudGhlc2VzKS4iIiIKKworICAgICAgICBydiA9IHNlbGYuX2RpY3RbJ05hbWUnXQorICAgICAgICBpZiAnVmVyc2lvbicgaW4gc2VsZi5fZGljdDoKKyAgICAgICAgICAgIHJ2ID0gcnYgKyAnLSVzJyAlIHNlbGYuX2RpY3RbJ1ZlcnNpb24nXQorICAgICAgICBpZiAnRmxhdm9yJyBpbiBzZWxmLl9kaWN0OgorICAgICAgICAgICAgcnYgPSBydiArICctJXMnICUgc2VsZi5fZGljdFsnRmxhdm9yJ10KKyAgICAgICAgaWYgc2VsZi5fZGljdC5nZXQoJ0ZsYXZvcicpID09ICdoaWRkZW4nOgorICAgICAgICAgICAgIyBQc2V1ZG8tcGFja2FnZSwgc2hvdyBpbiBwYXJlbnRoZXNlcworICAgICAgICAgICAgcnYgPSAnKCVzKScgJSBydgorICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBkdW1wKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBkaWN0IG9iamVjdCBjb250YWluaW5nIHRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgcGFja2FnZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RpY3QKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQ29tcGFyZSB0d28gcGFja2FnZXMsIHdoZXJlIHRoZSAiYmV0dGVyIiBwYWNrYWdlIHNvcnRzIGxvd2VyLiIiIgorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBQaW1wUGFja2FnZSk6CisgICAgICAgICAgICByZXR1cm4gY21wKGlkKHNlbGYpLCBpZChvdGhlcikpCisgICAgICAgIGlmIHNlbGYubmFtZSgpICE9IG90aGVyLm5hbWUoKToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5uYW1lKCksIG90aGVyLm5hbWUoKSkKKyAgICAgICAgaWYgc2VsZi52ZXJzaW9uKCkgIT0gb3RoZXIudmVyc2lvbigpOgorICAgICAgICAgICAgcmV0dXJuIC1jbXAoc2VsZi52ZXJzaW9uKCksIG90aGVyLnZlcnNpb24oKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RiLnByZWZlcmVuY2VzLmNvbXBhcmVGbGF2b3JzKHNlbGYuZmxhdm9yKCksIG90aGVyLmZsYXZvcigpKQorCisgICAgZGVmIGluc3RhbGxlZChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB3aGV0ZXIgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkLgorCisgICAgICAgIFJldHVybnMgdHdvIHZhbHVlczogYSBzdGF0dXMgaW5kaWNhdG9yIHdoaWNoIGlzIG9uZSBvZgorICAgICAgICAieWVzIiwgIm5vIiwgIm9sZCIgKGFuIG9sZGVyIHZlcnNpb24gaXMgaW5zdGFsbGVkKSBvciAiYmFkIgorICAgICAgICAoc29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIHRoZSBpbnN0YWxsIHRlc3QpIGFuZCBhIGh1bWFuCisgICAgICAgIHJlYWRhYmxlIHN0cmluZyB3aGljaCBtYXkgY29udGFpbiBtb3JlIGRldGFpbHMuIiIiCisKKyAgICAgICAgbmFtZXNwYWNlID0geworICAgICAgICAgICAgIk5vdEluc3RhbGxlZCI6IF9zY3JpcHRFeGNfTm90SW5zdGFsbGVkLAorICAgICAgICAgICAgIk9sZEluc3RhbGxlZCI6IF9zY3JpcHRFeGNfT2xkSW5zdGFsbGVkLAorICAgICAgICAgICAgIkJhZEluc3RhbGxlZCI6IF9zY3JpcHRFeGNfQmFkSW5zdGFsbGVkLAorICAgICAgICAgICAgIm9zIjogb3MsCisgICAgICAgICAgICAic3lzIjogc3lzLAorICAgICAgICAgICAgfQorICAgICAgICBpbnN0YWxsVGVzdCA9IHNlbGYuX2RpY3RbJ0luc3RhbGwtdGVzdCddLnN0cmlwKCkgKyAnXG4nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgaW5zdGFsbFRlc3QgaW4gbmFtZXNwYWNlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgYXJnOgorICAgICAgICAgICAgcmV0dXJuICJubyIsIHN0cihhcmcpCisgICAgICAgIGV4Y2VwdCBfc2NyaXB0RXhjX05vdEluc3RhbGxlZCwgYXJnOgorICAgICAgICAgICAgcmV0dXJuICJubyIsIHN0cihhcmcpCisgICAgICAgIGV4Y2VwdCBfc2NyaXB0RXhjX09sZEluc3RhbGxlZCwgYXJnOgorICAgICAgICAgICAgcmV0dXJuICJvbGQiLCBzdHIoYXJnKQorICAgICAgICBleGNlcHQgX3NjcmlwdEV4Y19CYWRJbnN0YWxsZWQsIGFyZzoKKyAgICAgICAgICAgIHJldHVybiAiYmFkIiwgc3RyKGFyZykKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIikKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIi0tLS0gJXM6IGluc3RhbGwgdGVzdCBnb3QgZXhjZXB0aW9uXG4iICUgc2VsZi5mdWxsbmFtZSgpKQorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiLS0tLSBzb3VyY2U6XG4iKQorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShpbnN0YWxsVGVzdCkKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIi0tLS0gZXhjZXB0aW9uOlxuIikKKyAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgaWYgc2VsZi5fZGIuX21haW50YWluZXI6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiLS0tLSBQbGVhc2UgY29weSB0aGlzIGFuZCBtYWlsIHRvICVzXG4iICUgc2VsZi5fZGIuX21haW50YWluZXIpCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKQorICAgICAgICAgICAgcmV0dXJuICJiYWQiLCAiUGFja2FnZSBpbnN0YWxsIHRlc3QgZ290IGV4Y2VwdGlvbiIKKyAgICAgICAgcmV0dXJuICJ5ZXMiLCAiIgorCisgICAgZGVmIHByZXJlcXVpc2l0ZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgcHJlcmVxdWlzaXRlcyBmb3IgdGhpcyBwYWNrYWdlLgorCisgICAgICAgIFRoZSBsaXN0IGNvbnRhaW5zIDItdHVwbGVzLCBvZiB3aGljaCB0aGUgZmlyc3QgaXRlbSBpcyBlaXRoZXIKKyAgICAgICAgYSBQaW1wUGFja2FnZSBvYmplY3Qgb3IgTm9uZSwgYW5kIHRoZSBzZWNvbmQgaXMgYSBkZXNjcmlwdGl2ZQorICAgICAgICBzdHJpbmcuIFRoZSBmaXJzdCBpdGVtIGNhbiBiZSBOb25lIGlmIHRoaXMgcGFja2FnZSBkZXBlbmRzIG9uCisgICAgICAgIHNvbWV0aGluZyB0aGF0IGlzbid0IHBpbXAtaW5zdGFsbGFibGUsIGluIHdoaWNoIGNhc2UgdGhlIGRlc2NyaXB0aXZlCisgICAgICAgIHN0cmluZyBzaG91bGQgdGVsbCB0aGUgdXNlciB3aGF0IHRvIGRvLiIiIgorCisgICAgICAgIHJ2ID0gW10KKyAgICAgICAgaWYgbm90IHNlbGYuX2RpY3QuZ2V0KCdEb3dubG9hZC1VUkwnKToKKyAgICAgICAgICAgICMgRm9yIHBzZXVkby1wYWNrYWdlcyB0aGF0IGFyZSBhbHJlYWR5IGluc3RhbGxlZCB3ZSBkb24ndAorICAgICAgICAgICAgIyByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZQorICAgICAgICAgICAgc3RhdHVzLCBfICA9IHNlbGYuaW5zdGFsbGVkKCkKKyAgICAgICAgICAgIGlmIHN0YXR1cyA9PSAieWVzIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgICAgIHJldHVybiBbKE5vbmUsCisgICAgICAgICAgICAgICAgIlBhY2thZ2UgJXMgY2Fubm90IGJlIGluc3RhbGxlZCBhdXRvbWF0aWNhbGx5LCBzZWUgdGhlIGRlc2NyaXB0aW9uIiAlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnVsbG5hbWUoKSldCisgICAgICAgIGlmIHNlbGYuc3lzdGVtd2lkZU9ubHkoKSBhbmQgc2VsZi5fZGIucHJlZmVyZW5jZXMuaXNVc2VySW5zdGFsbCgpOgorICAgICAgICAgICAgcmV0dXJuIFsoTm9uZSwKKyAgICAgICAgICAgICAgICAiUGFja2FnZSAlcyBjYW4gb25seSBiZSBpbnN0YWxsZWQgc3lzdGVtLXdpZGUiICUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mdWxsbmFtZSgpKV0KKyAgICAgICAgaWYgbm90IHNlbGYuX2RpY3QuZ2V0KCdQcmVyZXF1aXNpdGVzJyk6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5fZGljdFsnUHJlcmVxdWlzaXRlcyddOgorICAgICAgICAgICAgaWYgdHlwZShpdGVtKSA9PSBzdHI6CisgICAgICAgICAgICAgICAgcGtnID0gTm9uZQorICAgICAgICAgICAgICAgIGRlc2NyID0gc3RyKGl0ZW0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWUgPSBpdGVtWydOYW1lJ10KKyAgICAgICAgICAgICAgICBpZiAnVmVyc2lvbicgaW4gaXRlbToKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyAnLScgKyBpdGVtWydWZXJzaW9uJ10KKyAgICAgICAgICAgICAgICBpZiAnRmxhdm9yJyBpbiBpdGVtOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSArICctJyArIGl0ZW1bJ0ZsYXZvciddCisgICAgICAgICAgICAgICAgcGtnID0gc2VsZi5fZGIuZmluZChuYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBwa2c6CisgICAgICAgICAgICAgICAgICAgIGRlc2NyID0gIlJlcXVpcmVzIHVua25vd24gJXMiJW5hbWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkZXNjciA9IHBrZy5zaG9ydGRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgIHJ2LmFwcGVuZCgocGtnLCBkZXNjcikpCisgICAgICAgIHJldHVybiBydgorCisKKyAgICBkZWYgZG93bmxvYWRQYWNrYWdlT25seShzZWxmLCBvdXRwdXQ9Tm9uZSk6CisgICAgICAgICIiIkRvd25sb2FkIGEgc2luZ2xlIHBhY2thZ2UsIGlmIG5lZWRlZC4KKworICAgICAgICBBbiBNRDUgc2lnbmF0dXJlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgZG93bmxvYWQgaXMgbmVlZGVkLAorICAgICAgICBhbmQgdG8gdGVzdCB0aGF0IHdlIGFjdHVhbGx5IGRvd25sb2FkZWQgd2hhdCB3ZSBleHBlY3RlZC4KKyAgICAgICAgSWYgb3V0cHV0IGlzIGdpdmVuIGl0IGlzIGEgZmlsZS1saWtlIG9iamVjdCB0aGF0IHdpbGwgcmVjZWl2ZSBhIGxvZworICAgICAgICBvZiB3aGF0IGhhcHBlbnMuCisKKyAgICAgICAgSWYgYW55dGhpbmcgdW5mb3Jlc2VlbiBoYXBwZW5lZCB0aGUgbWV0aG9kIHJldHVybnMgYW4gZXJyb3IgbWVzc2FnZQorICAgICAgICBzdHJpbmcuCisgICAgICAgICIiIgorCisgICAgICAgIHNjaGVtZSwgbG9jLCBwYXRoLCBxdWVyeSwgZnJhZyA9IHVybHBhcnNlLnVybHNwbGl0KHNlbGYuX2RpY3RbJ0Rvd25sb2FkLVVSTCddKQorICAgICAgICBwYXRoID0gdXJsbGliLnVybDJwYXRobmFtZShwYXRoKQorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aClbMV0KKyAgICAgICAgc2VsZi5hcmNoaXZlRmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5fZGIucHJlZmVyZW5jZXMuZG93bmxvYWREaXIsIGZpbGVuYW1lKQorICAgICAgICBpZiBub3Qgc2VsZi5fYXJjaGl2ZU9LKCk6CisgICAgICAgICAgICBpZiBzY2hlbWUgPT0gJ21hbnVhbCc6CisgICAgICAgICAgICAgICAgcmV0dXJuICJQbGVhc2UgZG93bmxvYWQgcGFja2FnZSBtYW51YWxseSBhbmQgc2F2ZSBhcyAlcyIgJSBzZWxmLmFyY2hpdmVGaWxlbmFtZQorICAgICAgICAgICAgZG93bmxvYWRlciA9IFBpbXBVcmxsaWJEb3dubG9hZGVyKE5vbmUsIHNlbGYuX2RiLnByZWZlcmVuY2VzLmRvd25sb2FkRGlyLAorICAgICAgICAgICAgICAgIHdhdGNoZXI9c2VsZi5fZGIucHJlZmVyZW5jZXMud2F0Y2hlcikKKyAgICAgICAgICAgIGlmIG5vdCBkb3dubG9hZGVyLmRvd25sb2FkKHNlbGYuX2RpY3RbJ0Rvd25sb2FkLVVSTCddLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmFyY2hpdmVGaWxlbmFtZSwgb3V0cHV0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gImRvd25sb2FkIGNvbW1hbmQgZmFpbGVkIgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5hcmNoaXZlRmlsZW5hbWUpIGFuZCBub3QgTk9fRVhFQ1VURToKKyAgICAgICAgICAgIHJldHVybiAiYXJjaGl2ZSBub3QgZm91bmQgYWZ0ZXIgZG93bmxvYWQiCisgICAgICAgIGlmIG5vdCBzZWxmLl9hcmNoaXZlT0soKToKKyAgICAgICAgICAgIHJldHVybiAiYXJjaGl2ZSBkb2VzIG5vdCBoYXZlIGNvcnJlY3QgTUQ1IGNoZWNrc3VtIgorCisgICAgZGVmIF9hcmNoaXZlT0soc2VsZik6CisgICAgICAgICIiIlRlc3QgYW4gYXJjaGl2ZS4gSXQgc2hvdWxkIGV4aXN0IGFuZCB0aGUgTUQ1IGNoZWNrc3VtIHNob3VsZCBiZSBjb3JyZWN0LiIiIgorCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmFyY2hpdmVGaWxlbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBpZiBub3Qgc2VsZi5fZGljdC5nZXQoJ01ENVN1bScpOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogbm8gTUQ1U3VtIGZvciAlc1xuIiAlIHNlbGYuZnVsbG5hbWUoKSkKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGRhdGEgPSBvcGVuKHNlbGYuYXJjaGl2ZUZpbGVuYW1lLCAncmInKS5yZWFkKCkKKyAgICAgICAgY2hlY2tzdW0gPSBoYXNobGliLm1kNShkYXRhKS5oZXhkaWdlc3QoKQorICAgICAgICByZXR1cm4gY2hlY2tzdW0gPT0gc2VsZi5fZGljdFsnTUQ1U3VtJ10KKworICAgIGRlZiB1bnBhY2tQYWNrYWdlT25seShzZWxmLCBvdXRwdXQ9Tm9uZSk6CisgICAgICAgICIiIlVucGFjayBhIGRvd25sb2FkZWQgcGFja2FnZSBhcmNoaXZlLiIiIgorCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLmFyY2hpdmVGaWxlbmFtZSlbMV0KKyAgICAgICAgZm9yIGV4dCwgdW5wYWNrZXJDbGFzcywgYXJnIGluIEFSQ0hJVkVfRk9STUFUUzoKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lWy1sZW4oZXh0KTpdID09IGV4dDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIGV4dGVuc2lvbiBmb3IgYXJjaGl2ZSBmaWxlOiAlcyIgJSBmaWxlbmFtZQorICAgICAgICBzZWxmLmJhc2VuYW1lID0gZmlsZW5hbWVbOi1sZW4oZXh0KV0KKyAgICAgICAgdW5wYWNrZXIgPSB1bnBhY2tlckNsYXNzKGFyZywgZGlyPXNlbGYuX2RiLnByZWZlcmVuY2VzLmJ1aWxkRGlyLAorICAgICAgICAgICAgICAgIHdhdGNoZXI9c2VsZi5fZGIucHJlZmVyZW5jZXMud2F0Y2hlcikKKyAgICAgICAgcnYgPSB1bnBhY2tlci51bnBhY2soc2VsZi5hcmNoaXZlRmlsZW5hbWUsIG91dHB1dD1vdXRwdXQpCisgICAgICAgIGlmIHJ2OgorICAgICAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgaW5zdGFsbFBhY2thZ2VPbmx5KHNlbGYsIG91dHB1dD1Ob25lKToKKyAgICAgICAgIiIiRGVmYXVsdCBpbnN0YWxsIG1ldGhvZCwgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIiIiCisgICAgICAgIHJldHVybiAiJXM6IFRoaXMgcGFja2FnZSBuZWVkcyB0byBiZSBpbnN0YWxsZWQgbWFudWFsbHkgKG5vIHN1cHBvcnQgZm9yIGZsYXZvcj1cIiVzXCIpIiBcCisgICAgICAgICAgICAlIChzZWxmLmZ1bGxuYW1lKCksIHNlbGYuX2RpY3QuZ2V0KGZsYXZvciwgIiIpKQorCisgICAgZGVmIGluc3RhbGxTaW5nbGVQYWNrYWdlKHNlbGYsIG91dHB1dD1Ob25lKToKKyAgICAgICAgIiIiRG93bmxvYWQsIHVucGFjayBhbmQgaW5zdGFsbCBhIHNpbmdsZSBwYWNrYWdlLgorCisgICAgICAgIElmIG91dHB1dCBpcyBnaXZlbiBpdCBzaG91bGQgYmUgYSBmaWxlLWxpa2Ugb2JqZWN0IGFuZCBpdAorICAgICAgICB3aWxsIHJlY2VpdmUgYSBsb2cgb2Ygd2hhdCBoYXBwZW5lZC4iIiIKKworICAgICAgICBpZiBub3Qgc2VsZi5fZGljdC5nZXQoJ0Rvd25sb2FkLVVSTCcpOgorICAgICAgICAgICAgcmV0dXJuICIlczogVGhpcyBwYWNrYWdlIG5lZWRzIHRvIGJlIGluc3RhbGxlZCBtYW51YWxseSAobm8gRG93bmxvYWQtVVJMIGZpZWxkKSIgJSBzZWxmLmZ1bGxuYW1lKCkKKyAgICAgICAgbXNnID0gc2VsZi5kb3dubG9hZFBhY2thZ2VPbmx5KG91dHB1dCkKKyAgICAgICAgaWYgbXNnOgorICAgICAgICAgICAgcmV0dXJuICIlczogZG93bmxvYWQ6ICVzIiAlIChzZWxmLmZ1bGxuYW1lKCksIG1zZykKKworICAgICAgICBtc2cgPSBzZWxmLnVucGFja1BhY2thZ2VPbmx5KG91dHB1dCkKKyAgICAgICAgaWYgbXNnOgorICAgICAgICAgICAgcmV0dXJuICIlczogdW5wYWNrOiAlcyIgJSAoc2VsZi5mdWxsbmFtZSgpLCBtc2cpCisKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbFBhY2thZ2VPbmx5KG91dHB1dCkKKworICAgIGRlZiBiZWZvcmVJbnN0YWxsKHNlbGYpOgorICAgICAgICAiIiJCb29ra2VlcGluZyBiZWZvcmUgaW5zdGFsbGF0aW9uOiByZW1lbWJlciB3aGF0IHdlIGhhdmUgaW4gc2l0ZS1wYWNrYWdlcyIiIgorICAgICAgICBzZWxmLl9vbGRfY29udGVudHMgPSBvcy5saXN0ZGlyKHNlbGYuX2RiLnByZWZlcmVuY2VzLmluc3RhbGxEaXIpCisKKyAgICBkZWYgYWZ0ZXJJbnN0YWxsKHNlbGYpOgorICAgICAgICAiIiJCb29ra2VlcGluZyBhZnRlciBpbnN0YWxsYXRpb246IGludGVycHJldCBhbnkgbmV3IC5wdGggZmlsZXMgdGhhdCBoYXZlCisgICAgICAgIGFwcGVhcmVkIiIiCisKKyAgICAgICAgbmV3X2NvbnRlbnRzID0gb3MubGlzdGRpcihzZWxmLl9kYi5wcmVmZXJlbmNlcy5pbnN0YWxsRGlyKQorICAgICAgICBmb3IgZm4gaW4gbmV3X2NvbnRlbnRzOgorICAgICAgICAgICAgaWYgZm4gaW4gc2VsZi5fb2xkX2NvbnRlbnRzOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBmblstNDpdICE9ICcucHRoJzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5fZGIucHJlZmVyZW5jZXMuaW5zdGFsbERpciwgZm4pCisgICAgICAgICAgICBmID0gb3BlbihmdWxsbmFtZSkKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGYucmVhZGxpbmVzKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbGluZVswXSA9PSAnIyc6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbGluZVs6Nl0gPT0gJ2ltcG9ydCc6CisgICAgICAgICAgICAgICAgICAgIGV4ZWMgbGluZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGxpbmVbLTFdID09ICdcbic6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IG9zLnBhdGguam9pbihzZWxmLl9kYi5wcmVmZXJlbmNlcy5pbnN0YWxsRGlyLCBsaW5lKQorICAgICAgICAgICAgICAgIGxpbmUgPSBvcy5wYXRoLnJlYWxwYXRoKGxpbmUpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmUgaW4gc3lzLnBhdGg6CisgICAgICAgICAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChsaW5lKQorCisgICAgZGVmIGZpbHRlckV4cGVjdGVkU2tpcHMoc2VsZiwgbmFtZXMpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IHRoYXQgY29udGFpbnMgb25seSB1bnBleHBlY3RlZCBza2lwcyIiIgorICAgICAgICBpZiBub3Qgc2VsZi5fZGIucHJlZmVyZW5jZXMuaXNVc2VySW5zdGFsbCgpOgorICAgICAgICAgICAgcmV0dXJuIG5hbWVzCisgICAgICAgIGV4cGVjdGVkX3NraXBzID0gc2VsZi5fZGljdC5nZXQoJ1VzZXItaW5zdGFsbC1za2lwcycpCisgICAgICAgIGlmIG5vdCBleHBlY3RlZF9za2lwczoKKyAgICAgICAgICAgIHJldHVybiBuYW1lcworICAgICAgICBuZXduYW1lcyA9IFtdCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgZm9yIHNraXAgaW4gZXhwZWN0ZWRfc2tpcHM6CisgICAgICAgICAgICAgICAgaWYgbmFtZVs6bGVuKHNraXApXSA9PSBza2lwOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXduYW1lcy5hcHBlbmQobmFtZSkKKyAgICAgICAgcmV0dXJuIG5ld25hbWVzCisKK2NsYXNzIFBpbXBQYWNrYWdlX2JpbmFyeShQaW1wUGFja2FnZSk6CisKKyAgICBkZWYgdW5wYWNrUGFja2FnZU9ubHkoc2VsZiwgb3V0cHV0PU5vbmUpOgorICAgICAgICAiIiJXZSBkb24ndCB1bnBhY2sgYmluYXJ5IHBhY2thZ2VzIHVudGlsIGluc3RhbGxpbmciIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIGluc3RhbGxQYWNrYWdlT25seShzZWxmLCBvdXRwdXQ9Tm9uZSk6CisgICAgICAgICIiIkluc3RhbGwgYSBzaW5nbGUgc291cmNlIHBhY2thZ2UuCisKKyAgICAgICAgSWYgb3V0cHV0IGlzIGdpdmVuIGl0IHNob3VsZCBiZSBhIGZpbGUtbGlrZSBvYmplY3QgYW5kIGl0CisgICAgICAgIHdpbGwgcmVjZWl2ZSBhIGxvZyBvZiB3aGF0IGhhcHBlbmVkLiIiIgorCisgICAgICAgIGlmICdJbnN0YWxsLWNvbW1hbmQnIGluIHNlbGYuX2RpY3Q6CisgICAgICAgICAgICByZXR1cm4gIiVzOiBCaW5hcnkgcGFja2FnZSBjYW5ub3QgaGF2ZSBJbnN0YWxsLWNvbW1hbmQiICUgc2VsZi5mdWxsbmFtZSgpCisKKyAgICAgICAgaWYgJ1ByZS1pbnN0YWxsLWNvbW1hbmQnIGluIHNlbGYuX2RpY3Q6CisgICAgICAgICAgICBpZiBfY21kKG91dHB1dCwgJy90bXAnLCBzZWxmLl9kaWN0WydQcmUtaW5zdGFsbC1jb21tYW5kJ10pOgorICAgICAgICAgICAgICAgIHJldHVybiAicHJlLWluc3RhbGwgJXM6IHJ1bm5pbmcgXCIlc1wiIGZhaWxlZCIgJSBcCisgICAgICAgICAgICAgICAgICAgIChzZWxmLmZ1bGxuYW1lKCksIHNlbGYuX2RpY3RbJ1ByZS1pbnN0YWxsLWNvbW1hbmQnXSkKKworICAgICAgICBzZWxmLmJlZm9yZUluc3RhbGwoKQorCisgICAgICAgICMgSW5zdGFsbCBieSB1bnBhY2tpbmcKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYuYXJjaGl2ZUZpbGVuYW1lKVsxXQorICAgICAgICBmb3IgZXh0LCB1bnBhY2tlckNsYXNzLCBhcmcgaW4gQVJDSElWRV9GT1JNQVRTOgorICAgICAgICAgICAgaWYgZmlsZW5hbWVbLWxlbihleHQpOl0gPT0gZXh0OgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIiVzOiB1bmtub3duIGV4dGVuc2lvbiBmb3IgYXJjaGl2ZSBmaWxlOiAlcyIgJSAoc2VsZi5mdWxsbmFtZSgpLCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5iYXNlbmFtZSA9IGZpbGVuYW1lWzotbGVuKGV4dCldCisKKyAgICAgICAgaW5zdGFsbF9yZW5hbWVzID0gW10KKyAgICAgICAgZm9yIGssIG5ld2xvYyBpbiBzZWxmLl9kYi5wcmVmZXJlbmNlcy5pbnN0YWxsTG9jYXRpb25zOgorICAgICAgICAgICAgaWYgbm90IG5ld2xvYzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgayA9PSAiLS1pbnN0YWxsLWxpYiI6CisgICAgICAgICAgICAgICAgb2xkbG9jID0gREVGQVVMVF9JTlNUQUxMRElSCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAiJXM6IERvbid0IGtub3cgaW5zdGFsbExvY2F0aW9uICVzIiAlIChzZWxmLmZ1bGxuYW1lKCksIGspCisgICAgICAgICAgICBpbnN0YWxsX3JlbmFtZXMuYXBwZW5kKChvbGRsb2MsIG5ld2xvYykpCisKKyAgICAgICAgdW5wYWNrZXIgPSB1bnBhY2tlckNsYXNzKGFyZywgZGlyPSIvIiwgcmVuYW1lcz1pbnN0YWxsX3JlbmFtZXMpCisgICAgICAgIHJ2ID0gdW5wYWNrZXIudW5wYWNrKHNlbGYuYXJjaGl2ZUZpbGVuYW1lLCBvdXRwdXQ9b3V0cHV0LCBwYWNrYWdlPXNlbGYpCisgICAgICAgIGlmIHJ2OgorICAgICAgICAgICAgcmV0dXJuIHJ2CisKKyAgICAgICAgc2VsZi5hZnRlckluc3RhbGwoKQorCisgICAgICAgIGlmICdQb3N0LWluc3RhbGwtY29tbWFuZCcgaW4gc2VsZi5fZGljdDoKKyAgICAgICAgICAgIGlmIF9jbWQob3V0cHV0LCAnL3RtcCcsIHNlbGYuX2RpY3RbJ1Bvc3QtaW5zdGFsbC1jb21tYW5kJ10pOgorICAgICAgICAgICAgICAgIHJldHVybiAiJXM6IHBvc3QtaW5zdGFsbDogcnVubmluZyBcIiVzXCIgZmFpbGVkIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgKHNlbGYuZnVsbG5hbWUoKSwgc2VsZi5fZGljdFsnUG9zdC1pbnN0YWxsLWNvbW1hbmQnXSkKKworICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIFBpbXBQYWNrYWdlX3NvdXJjZShQaW1wUGFja2FnZSk6CisKKyAgICBkZWYgdW5wYWNrUGFja2FnZU9ubHkoc2VsZiwgb3V0cHV0PU5vbmUpOgorICAgICAgICAiIiJVbnBhY2sgYSBzb3VyY2UgcGFja2FnZSBhbmQgY2hlY2sgdGhhdCBzZXR1cC5weSBleGlzdHMiIiIKKyAgICAgICAgUGltcFBhY2thZ2UudW5wYWNrUGFja2FnZU9ubHkoc2VsZiwgb3V0cHV0KQorICAgICAgICAjIFRlc3QgdGhhdCBhIHNldHVwIHNjcmlwdCBoYXMgYmVlbiBjcmVhdGUKKyAgICAgICAgc2VsZi5fYnVpbGREaXJuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX2RiLnByZWZlcmVuY2VzLmJ1aWxkRGlyLCBzZWxmLmJhc2VuYW1lKQorICAgICAgICBzZXR1cG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5fYnVpbGREaXJuYW1lLCAic2V0dXAucHkiKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2V0dXBuYW1lKSBhbmQgbm90IE5PX0VYRUNVVEU6CisgICAgICAgICAgICByZXR1cm4gIm5vIHNldHVwLnB5IGZvdW5kIGFmdGVyIHVucGFjayBvZiBhcmNoaXZlIgorCisgICAgZGVmIGluc3RhbGxQYWNrYWdlT25seShzZWxmLCBvdXRwdXQ9Tm9uZSk6CisgICAgICAgICIiIkluc3RhbGwgYSBzaW5nbGUgc291cmNlIHBhY2thZ2UuCisKKyAgICAgICAgSWYgb3V0cHV0IGlzIGdpdmVuIGl0IHNob3VsZCBiZSBhIGZpbGUtbGlrZSBvYmplY3QgYW5kIGl0CisgICAgICAgIHdpbGwgcmVjZWl2ZSBhIGxvZyBvZiB3aGF0IGhhcHBlbmVkLiIiIgorCisgICAgICAgIGlmICdQcmUtaW5zdGFsbC1jb21tYW5kJyBpbiBzZWxmLl9kaWN0OgorICAgICAgICAgICAgaWYgX2NtZChvdXRwdXQsIHNlbGYuX2J1aWxkRGlybmFtZSwgc2VsZi5fZGljdFsnUHJlLWluc3RhbGwtY29tbWFuZCddKToKKyAgICAgICAgICAgICAgICByZXR1cm4gInByZS1pbnN0YWxsICVzOiBydW5uaW5nIFwiJXNcIiBmYWlsZWQiICUgXAorICAgICAgICAgICAgICAgICAgICAoc2VsZi5mdWxsbmFtZSgpLCBzZWxmLl9kaWN0WydQcmUtaW5zdGFsbC1jb21tYW5kJ10pCisKKyAgICAgICAgc2VsZi5iZWZvcmVJbnN0YWxsKCkKKyAgICAgICAgaW5zdGFsbGNtZCA9IHNlbGYuX2RpY3QuZ2V0KCdJbnN0YWxsLWNvbW1hbmQnKQorICAgICAgICBpZiBpbnN0YWxsY21kIGFuZCBzZWxmLl9pbnN0YWxsX3JlbmFtZXM6CisgICAgICAgICAgICByZXR1cm4gIlBhY2thZ2UgaGFzIGluc3RhbGwtY29tbWFuZCBhbmQgY2FuIG9ubHkgYmUgaW5zdGFsbGVkIHRvIHN0YW5kYXJkIGxvY2F0aW9uIgorICAgICAgICAjIFRoaXMgaXMgdGhlICJiaXQtYnVja2V0IiBmb3IgaW5zdGFsbGF0aW9uczogZXZlcnl0aGluZyB3ZSBkb24ndAorICAgICAgICAjIHdhbnQuIEFmdGVyIGluc3RhbGxhdGlvbiB3ZSBjaGVjayB0aGF0IGl0IGlzIGFjdHVhbGx5IGVtcHR5CisgICAgICAgIHVud2FudGVkX2luc3RhbGxfZGlyID0gTm9uZQorICAgICAgICBpZiBub3QgaW5zdGFsbGNtZDoKKyAgICAgICAgICAgIGV4dHJhX2FyZ3MgPSAiIgorICAgICAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5fZGIucHJlZmVyZW5jZXMuaW5zdGFsbExvY2F0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBub3QgdjoKKyAgICAgICAgICAgICAgICAgICAgIyBXZSBkb24ndCB3YW50IHRoZXNlIGZpbGVzIGluc3RhbGxlZC4gU2VuZCB0aGVtCisgICAgICAgICAgICAgICAgICAgICMgdG8gdGhlIGJpdC1idWNrZXQuCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCB1bndhbnRlZF9pbnN0YWxsX2RpcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVud2FudGVkX2luc3RhbGxfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgICAgICAgICAgICAgIHYgPSB1bndhbnRlZF9pbnN0YWxsX2RpcgorICAgICAgICAgICAgICAgIGV4dHJhX2FyZ3MgPSBleHRyYV9hcmdzICsgIiAlcyBcIiVzXCIiICUgKGssIHYpCisgICAgICAgICAgICBpbnN0YWxsY21kID0gJyIlcyIgc2V0dXAucHkgaW5zdGFsbCAlcycgJSAoc3lzLmV4ZWN1dGFibGUsIGV4dHJhX2FyZ3MpCisgICAgICAgIGlmIF9jbWQob3V0cHV0LCBzZWxmLl9idWlsZERpcm5hbWUsIGluc3RhbGxjbWQpOgorICAgICAgICAgICAgcmV0dXJuICJpbnN0YWxsICVzOiBydW5uaW5nIFwiJXNcIiBmYWlsZWQiICUgXAorICAgICAgICAgICAgICAgIChzZWxmLmZ1bGxuYW1lKCksIGluc3RhbGxjbWQpCisgICAgICAgIGlmIHVud2FudGVkX2luc3RhbGxfZGlyIGFuZCBvcy5wYXRoLmV4aXN0cyh1bndhbnRlZF9pbnN0YWxsX2Rpcik6CisgICAgICAgICAgICB1bndhbnRlZF9maWxlcyA9IG9zLmxpc3RkaXIodW53YW50ZWRfaW5zdGFsbF9kaXIpCisgICAgICAgICAgICBpZiB1bndhbnRlZF9maWxlczoKKyAgICAgICAgICAgICAgICBydiA9ICJXYXJuaW5nOiBzb21lIGZpbGVzIHdlcmUgbm90IGluc3RhbGxlZDogJXMiICUgIiAiLmpvaW4odW53YW50ZWRfZmlsZXMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJ2ID0gTm9uZQorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh1bndhbnRlZF9pbnN0YWxsX2RpcikKKyAgICAgICAgICAgIHJldHVybiBydgorCisgICAgICAgIHNlbGYuYWZ0ZXJJbnN0YWxsKCkKKworICAgICAgICBpZiAnUG9zdC1pbnN0YWxsLWNvbW1hbmQnIGluIHNlbGYuX2RpY3Q6CisgICAgICAgICAgICBpZiBfY21kKG91dHB1dCwgc2VsZi5fYnVpbGREaXJuYW1lLCBzZWxmLl9kaWN0WydQb3N0LWluc3RhbGwtY29tbWFuZCddKToKKyAgICAgICAgICAgICAgICByZXR1cm4gInBvc3QtaW5zdGFsbCAlczogcnVubmluZyBcIiVzXCIgZmFpbGVkIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgKHNlbGYuZnVsbG5hbWUoKSwgc2VsZi5fZGljdFsnUG9zdC1pbnN0YWxsLWNvbW1hbmQnXSkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworY2xhc3MgUGltcFBhY2thZ2VfaW5zdGFsbGVyKFBpbXBQYWNrYWdlKToKKworICAgIGRlZiB1bnBhY2tQYWNrYWdlT25seShzZWxmLCBvdXRwdXQ9Tm9uZSk6CisgICAgICAgICIiIldlIGRvbid0IHVucGFjayBkbWcgcGFja2FnZXMgdW50aWwgaW5zdGFsbGluZyIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaW5zdGFsbFBhY2thZ2VPbmx5KHNlbGYsIG91dHB1dD1Ob25lKToKKyAgICAgICAgIiIiSW5zdGFsbCBhIHNpbmdsZSBzb3VyY2UgcGFja2FnZS4KKworICAgICAgICBJZiBvdXRwdXQgaXMgZ2l2ZW4gaXQgc2hvdWxkIGJlIGEgZmlsZS1saWtlIG9iamVjdCBhbmQgaXQKKyAgICAgICAgd2lsbCByZWNlaXZlIGEgbG9nIG9mIHdoYXQgaGFwcGVuZWQuIiIiCisKKyAgICAgICAgaWYgJ1Bvc3QtaW5zdGFsbC1jb21tYW5kJyBpbiBzZWxmLl9kaWN0OgorICAgICAgICAgICAgcmV0dXJuICIlczogSW5zdGFsbGVyIHBhY2thZ2UgY2Fubm90IGhhdmUgUG9zdC1pbnN0YWxsLWNvbW1hbmQiICUgc2VsZi5mdWxsbmFtZSgpCisKKyAgICAgICAgaWYgJ1ByZS1pbnN0YWxsLWNvbW1hbmQnIGluIHNlbGYuX2RpY3Q6CisgICAgICAgICAgICBpZiBfY21kKG91dHB1dCwgJy90bXAnLCBzZWxmLl9kaWN0WydQcmUtaW5zdGFsbC1jb21tYW5kJ10pOgorICAgICAgICAgICAgICAgIHJldHVybiAicHJlLWluc3RhbGwgJXM6IHJ1bm5pbmcgXCIlc1wiIGZhaWxlZCIgJSBcCisgICAgICAgICAgICAgICAgICAgIChzZWxmLmZ1bGxuYW1lKCksIHNlbGYuX2RpY3RbJ1ByZS1pbnN0YWxsLWNvbW1hbmQnXSkKKworICAgICAgICBzZWxmLmJlZm9yZUluc3RhbGwoKQorCisgICAgICAgIGluc3RhbGxjbWQgPSBzZWxmLl9kaWN0LmdldCgnSW5zdGFsbC1jb21tYW5kJykKKyAgICAgICAgaWYgaW5zdGFsbGNtZDoKKyAgICAgICAgICAgIGlmICclJyBpbiBpbnN0YWxsY21kOgorICAgICAgICAgICAgICAgIGluc3RhbGxjbWQgPSBpbnN0YWxsY21kICUgc2VsZi5hcmNoaXZlRmlsZW5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGluc3RhbGxjbWQgPSAnb3BlbiBcIiVzXCInICUgc2VsZi5hcmNoaXZlRmlsZW5hbWUKKyAgICAgICAgaWYgX2NtZChvdXRwdXQsICIvdG1wIiwgaW5zdGFsbGNtZCk6CisgICAgICAgICAgICByZXR1cm4gJyVzOiBpbnN0YWxsIGNvbW1hbmQgZmFpbGVkICh1c2UgdmVyYm9zZSBmb3IgZGV0YWlscyknICUgc2VsZi5mdWxsbmFtZSgpCisgICAgICAgIHJldHVybiAnJXM6IGRvd25sb2FkZWQgYW5kIG9wZW5lZC4gSW5zdGFsbCBtYW51YWxseSBhbmQgcmVzdGFydCBQYWNrYWdlIE1hbmFnZXInICUgc2VsZi5hcmNoaXZlRmlsZW5hbWUKKworY2xhc3MgUGltcEluc3RhbGxlcjoKKyAgICAiIiJJbnN0YWxsZXIgZW5naW5lOiBjb21wdXRlcyBkZXBlbmRlbmNpZXMgYW5kIGluc3RhbGxzCisgICAgcGFja2FnZXMgaW4gdGhlIHJpZ2h0IG9yZGVyLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiKToKKyAgICAgICAgc2VsZi5fdG9kbyA9IFtdCisgICAgICAgIHNlbGYuX2RiID0gZGIKKyAgICAgICAgc2VsZi5fY3VydG9kbyA9IFtdCisgICAgICAgIHNlbGYuX2N1cm1lc3NhZ2VzID0gW10KKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgcGFja2FnZSk6CisgICAgICAgIHJldHVybiBwYWNrYWdlIGluIHNlbGYuX3RvZG8KKworICAgIGRlZiBfYWRkUGFja2FnZXMoc2VsZiwgcGFja2FnZXMpOgorICAgICAgICBmb3IgcGFja2FnZSBpbiBwYWNrYWdlczoKKyAgICAgICAgICAgIGlmIG5vdCBwYWNrYWdlIGluIHNlbGYuX3RvZG86CisgICAgICAgICAgICAgICAgc2VsZi5fdG9kby5hcHBlbmQocGFja2FnZSkKKworICAgIGRlZiBfcHJlcGFyZUluc3RhbGwoc2VsZiwgcGFja2FnZSwgZm9yY2U9MCwgcmVjdXJzaXZlPTEpOgorICAgICAgICAiIiJJbnRlcm5hbCByb3V0aW5lLCByZWN1cnNpdmUgZW5naW5lIGZvciBwcmVwYXJlSW5zdGFsbC4KKworICAgICAgICBUZXN0IHdoZXRoZXIgdGhlIHBhY2thZ2UgaXMgaW5zdGFsbGVkIGFuZCAoaWYgbm90IGluc3RhbGxlZAorICAgICAgICBvciBpZiBmb3JjZT09MSkgcHJlcGVuZCBpdCB0byB0aGUgdGVtcG9yYXJ5IHRvZG8gbGlzdCBhbmQKKyAgICAgICAgY2FsbCBvdXJzZWx2ZXMgcmVjdXJzaXZlbHkgb24gYWxsIHByZXJlcXVpc2l0ZXMuIiIiCisKKyAgICAgICAgaWYgbm90IGZvcmNlOgorICAgICAgICAgICAgc3RhdHVzLCBtZXNzYWdlID0gcGFja2FnZS5pbnN0YWxsZWQoKQorICAgICAgICAgICAgaWYgc3RhdHVzID09ICJ5ZXMiOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBwYWNrYWdlIGluIHNlbGYuX3RvZG8gb3IgcGFja2FnZSBpbiBzZWxmLl9jdXJ0b2RvOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2N1cnRvZG8uaW5zZXJ0KDAsIHBhY2thZ2UpCisgICAgICAgIGlmIG5vdCByZWN1cnNpdmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcHJlcmVxcyA9IHBhY2thZ2UucHJlcmVxdWlzaXRlcygpCisgICAgICAgIGZvciBwa2csIGRlc2NyIGluIHByZXJlcXM6CisgICAgICAgICAgICBpZiBwa2c6CisgICAgICAgICAgICAgICAgc2VsZi5fcHJlcGFyZUluc3RhbGwocGtnLCBGYWxzZSwgcmVjdXJzaXZlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9jdXJtZXNzYWdlcy5hcHBlbmQoIlByb2JsZW0gd2l0aCBkZXBlbmRlbmN5OiAlcyIgJSBkZXNjcikKKworICAgIGRlZiBwcmVwYXJlSW5zdGFsbChzZWxmLCBwYWNrYWdlLCBmb3JjZT0wLCByZWN1cnNpdmU9MSk6CisgICAgICAgICIiIlByZXBhcmUgaW5zdGFsbGF0aW9uIG9mIGEgcGFja2FnZS4KKworICAgICAgICBJZiB0aGUgcGFja2FnZSBpcyBhbHJlYWR5IGluc3RhbGxlZCBhbmQgZm9yY2UgaXMgZmFsc2Ugbm90aGluZworICAgICAgICBpcyBkb25lLiBJZiByZWN1cnNpdmUgaXMgdHJ1ZSBwcmVyZXF1aXNpdGVzIGFyZSBpbnN0YWxsZWQgZmlyc3QuCisKKyAgICAgICAgUmV0dXJucyBhIGxpc3Qgb2YgcGFja2FnZXMgKHRvIGJlIHBhc3NlZCB0byBpbnN0YWxsKSBhbmQgYSBsaXN0CisgICAgICAgIG9mIG1lc3NhZ2VzIG9mIGFueSBwcm9ibGVtcyBlbmNvdW50ZXJlZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5fY3VydG9kbyA9IFtdCisgICAgICAgIHNlbGYuX2N1cm1lc3NhZ2VzID0gW10KKyAgICAgICAgc2VsZi5fcHJlcGFyZUluc3RhbGwocGFja2FnZSwgZm9yY2UsIHJlY3Vyc2l2ZSkKKyAgICAgICAgcnYgPSBzZWxmLl9jdXJ0b2RvLCBzZWxmLl9jdXJtZXNzYWdlcworICAgICAgICBzZWxmLl9jdXJ0b2RvID0gW10KKyAgICAgICAgc2VsZi5fY3VybWVzc2FnZXMgPSBbXQorICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBpbnN0YWxsKHNlbGYsIHBhY2thZ2VzLCBvdXRwdXQpOgorICAgICAgICAiIiJJbnN0YWxsIGEgbGlzdCBvZiBwYWNrYWdlcy4iIiIKKworICAgICAgICBzZWxmLl9hZGRQYWNrYWdlcyhwYWNrYWdlcykKKyAgICAgICAgc3RhdHVzID0gW10KKyAgICAgICAgZm9yIHBrZyBpbiBzZWxmLl90b2RvOgorICAgICAgICAgICAgbXNnID0gcGtnLmluc3RhbGxTaW5nbGVQYWNrYWdlKG91dHB1dCkKKyAgICAgICAgICAgIGlmIG1zZzoKKyAgICAgICAgICAgICAgICBzdGF0dXMuYXBwZW5kKG1zZykKKyAgICAgICAgcmV0dXJuIHN0YXR1cworCisKKworZGVmIF9ydW4obW9kZSwgdmVyYm9zZSwgZm9yY2UsIGFyZ3MsIHByZWZhcmdzLCB3YXRjaGVyKToKKyAgICAiIiJFbmdpbmUgZm9yIHRoZSBtYWluIHByb2dyYW0iIiIKKworICAgIHByZWZzID0gUGltcFByZWZlcmVuY2VzKCoqcHJlZmFyZ3MpCisgICAgaWYgd2F0Y2hlcjoKKyAgICAgICAgcHJlZnMuc2V0V2F0Y2hlcih3YXRjaGVyKQorICAgIHJ2ID0gcHJlZnMuY2hlY2soKQorICAgIGlmIHJ2OgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHJ2KQorICAgIGRiID0gUGltcERhdGFiYXNlKHByZWZzKQorICAgIGRiLmFwcGVuZFVSTChwcmVmcy5waW1wRGF0YWJhc2UpCisKKyAgICBpZiBtb2RlID09ICdkdW1wJzoKKyAgICAgICAgZGIuZHVtcChzeXMuc3Rkb3V0KQorICAgIGVsaWYgbW9kZSA9PSdsaXN0JzoKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICBhcmdzID0gZGIubGlzdG5hbWVzKCkKKyAgICAgICAgcHJpbnQgIiUtMjAuMjBzXHQlcyIgJSAoIlBhY2thZ2UiLCAiRGVzY3JpcHRpb24iKQorICAgICAgICBwcmludAorICAgICAgICBmb3IgcGtnbmFtZSBpbiBhcmdzOgorICAgICAgICAgICAgcGtnID0gZGIuZmluZChwa2duYW1lKQorICAgICAgICAgICAgaWYgcGtnOgorICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcGtnLnNob3J0ZGVzY3JpcHRpb24oKQorICAgICAgICAgICAgICAgIHBrZ25hbWUgPSBwa2cuZnVsbG5hbWUoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICdFcnJvcjogbm8gc3VjaCBwYWNrYWdlJworICAgICAgICAgICAgcHJpbnQgIiUtMjAuMjBzXHQlcyIgJSAocGtnbmFtZSwgZGVzY3JpcHRpb24pCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJcdEhvbWUgcGFnZTpcdCIsIHBrZy5ob21lcGFnZSgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwcmludCAiXHREb3dubG9hZCBVUkw6XHQiLCBwa2cuZG93bmxvYWRVUkwoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gcGtnLmRlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9ICdcblx0XHRcdFx0XHQnLmpvaW4oZGVzY3JpcHRpb24uc3BsaXRsaW5lcygpKQorICAgICAgICAgICAgICAgIHByaW50ICJcdERlc2NyaXB0aW9uOlx0JXMiICUgZGVzY3JpcHRpb24KKyAgICBlbGlmIG1vZGUgPT0nc3RhdHVzJzoKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICBhcmdzID0gZGIubGlzdG5hbWVzKCkKKyAgICAgICAgICAgIHByaW50ICIlLTIwLjIwc1x0JXNcdCVzIiAlICgiUGFja2FnZSIsICJJbnN0YWxsZWQiLCAiTWVzc2FnZSIpCisgICAgICAgICAgICBwcmludAorICAgICAgICBmb3IgcGtnbmFtZSBpbiBhcmdzOgorICAgICAgICAgICAgcGtnID0gZGIuZmluZChwa2duYW1lKQorICAgICAgICAgICAgaWYgcGtnOgorICAgICAgICAgICAgICAgIHN0YXR1cywgbXNnID0gcGtnLmluc3RhbGxlZCgpCisgICAgICAgICAgICAgICAgcGtnbmFtZSA9IHBrZy5mdWxsbmFtZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdlcnJvcicKKyAgICAgICAgICAgICAgICBtc2cgPSAnTm8gc3VjaCBwYWNrYWdlJworICAgICAgICAgICAgcHJpbnQgIiUtMjAuMjBzXHQlLTkuOXNcdCVzIiAlIChwa2duYW1lLCBzdGF0dXMsIG1zZykKKyAgICAgICAgICAgIGlmIHZlcmJvc2UgYW5kIHN0YXR1cyA9PSAibm8iOgorICAgICAgICAgICAgICAgIHByZXJlcSA9IHBrZy5wcmVyZXF1aXNpdGVzKCkKKyAgICAgICAgICAgICAgICBmb3IgcGtnLCBtc2cgaW4gcHJlcmVxOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcGtnOgorICAgICAgICAgICAgICAgICAgICAgICAgcGtnID0gJycKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBrZyA9IHBrZy5mdWxsbmFtZSgpCisgICAgICAgICAgICAgICAgICAgIHByaW50ICIlLTIwLjIwc1x0UmVxdWlyZW1lbnQ6ICVzICVzIiAlICgiIiwgcGtnLCBtc2cpCisgICAgZWxpZiBtb2RlID09ICdpbnN0YWxsJzoKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICBwcmludCAnUGxlYXNlIHNwZWNpZnkgcGFja2FnZXMgdG8gaW5zdGFsbCcKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIGluc3QgPSBQaW1wSW5zdGFsbGVyKGRiKQorICAgICAgICBmb3IgcGtnbmFtZSBpbiBhcmdzOgorICAgICAgICAgICAgcGtnID0gZGIuZmluZChwa2duYW1lKQorICAgICAgICAgICAgaWYgbm90IHBrZzoKKyAgICAgICAgICAgICAgICBwcmludCAnJXM6IE5vIHN1Y2ggcGFja2FnZScgJSBwa2duYW1lCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxpc3QsIG1lc3NhZ2VzID0gaW5zdC5wcmVwYXJlSW5zdGFsbChwa2csIGZvcmNlKQorICAgICAgICAgICAgaWYgbWVzc2FnZXMgYW5kIG5vdCBmb3JjZToKKyAgICAgICAgICAgICAgICBwcmludCAiJXM6IE5vdCBpbnN0YWxsZWQ6IiAlIHBrZ25hbWUKKyAgICAgICAgICAgICAgICBmb3IgbSBpbiBtZXNzYWdlczoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlx0IiwgbQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gTm9uZQorICAgICAgICAgICAgICAgIG1lc3NhZ2VzID0gaW5zdC5pbnN0YWxsKGxpc3QsIG91dHB1dCkKKyAgICAgICAgICAgICAgICBpZiBtZXNzYWdlczoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiBOb3QgaW5zdGFsbGVkOiIgJSBwa2duYW1lCisgICAgICAgICAgICAgICAgICAgIGZvciBtIGluIG1lc3NhZ2VzOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlx0IiwgbQorCitkZWYgbWFpbigpOgorICAgICIiIk1pbmltYWwgY29tbWFuZGxpbmUgdG9vbCB0byBkcml2ZSBwaW1wLiIiIgorCisgICAgaW1wb3J0IGdldG9wdAorICAgIGRlZiBfaGVscCgpOgorICAgICAgICBwcmludCAiVXNhZ2U6IHBpbXAgW29wdGlvbnNdIC1zIFtwYWNrYWdlIC4uLl0gIExpc3QgaW5zdGFsbGVkIHN0YXR1cyIKKyAgICAgICAgcHJpbnQgIiAgICAgICBwaW1wIFtvcHRpb25zXSAtbCBbcGFja2FnZSAuLi5dICBTaG93IHBhY2thZ2UgaW5mb3JtYXRpb24iCisgICAgICAgIHByaW50ICIgICAgICAgcGltcCBbb3B0aW9uc10gLWkgcGFja2FnZSAuLi4gICAgSW5zdGFsbCBwYWNrYWdlcyIKKyAgICAgICAgcHJpbnQgIiAgICAgICBwaW1wIC1kICAgICAgICAgICAgICAgICAgICAgICAgICBEdW1wIGRhdGFiYXNlIHRvIHN0ZG91dCIKKyAgICAgICAgcHJpbnQgIiAgICAgICBwaW1wIC1WICAgICAgICAgICAgICAgICAgICAgICAgICBQcmludCB2ZXJzaW9uIG51bWJlciIKKyAgICAgICAgcHJpbnQgIk9wdGlvbnM6IgorICAgICAgICBwcmludCAiICAgICAgIC12ICAgICBWZXJib3NlIgorICAgICAgICBwcmludCAiICAgICAgIC1mICAgICBGb3JjZSBpbnN0YWxsYXRpb24iCisgICAgICAgIHByaW50ICIgICAgICAgLUQgZGlyIFNldCBkZXN0aW5hdGlvbiBkaXJlY3RvcnkiCisgICAgICAgIHByaW50ICIgICAgICAgICAgICAgIChkZWZhdWx0OiAlcykiICUgREVGQVVMVF9JTlNUQUxMRElSCisgICAgICAgIHByaW50ICIgICAgICAgLXUgdXJsIFVSTCBmb3IgZGF0YWJhc2UiCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBjbGFzcyBfV2F0Y2hlcjoKKyAgICAgICAgZGVmIHVwZGF0ZShzZWxmLCBtc2cpOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShtc2cgKyAnXHInKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAic2xpZnZkRDpWdToiKQorICAgIGV4Y2VwdCBnZXRvcHQuR2V0b3B0RXJyb3I6CisgICAgICAgIF9oZWxwKCkKKyAgICBpZiBub3Qgb3B0cyBhbmQgbm90IGFyZ3M6CisgICAgICAgIF9oZWxwKCkKKyAgICBtb2RlID0gTm9uZQorICAgIGZvcmNlID0gMAorICAgIHZlcmJvc2UgPSAwCisgICAgcHJlZmFyZ3MgPSB7fQorICAgIHdhdGNoZXIgPSBOb25lCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyA9PSAnLXMnOgorICAgICAgICAgICAgaWYgbW9kZToKKyAgICAgICAgICAgICAgICBfaGVscCgpCisgICAgICAgICAgICBtb2RlID0gJ3N0YXR1cycKKyAgICAgICAgaWYgbyA9PSAnLWwnOgorICAgICAgICAgICAgaWYgbW9kZToKKyAgICAgICAgICAgICAgICBfaGVscCgpCisgICAgICAgICAgICBtb2RlID0gJ2xpc3QnCisgICAgICAgIGlmIG8gPT0gJy1kJzoKKyAgICAgICAgICAgIGlmIG1vZGU6CisgICAgICAgICAgICAgICAgX2hlbHAoKQorICAgICAgICAgICAgbW9kZSA9ICdkdW1wJworICAgICAgICBpZiBvID09ICctVic6CisgICAgICAgICAgICBpZiBtb2RlOgorICAgICAgICAgICAgICAgIF9oZWxwKCkKKyAgICAgICAgICAgIG1vZGUgPSAndmVyc2lvbicKKyAgICAgICAgaWYgbyA9PSAnLWknOgorICAgICAgICAgICAgbW9kZSA9ICdpbnN0YWxsJworICAgICAgICBpZiBvID09ICctZic6CisgICAgICAgICAgICBmb3JjZSA9IDEKKyAgICAgICAgaWYgbyA9PSAnLXYnOgorICAgICAgICAgICAgdmVyYm9zZSA9IDEKKyAgICAgICAgICAgIHdhdGNoZXIgPSBfV2F0Y2hlcigpCisgICAgICAgIGlmIG8gPT0gJy1EJzoKKyAgICAgICAgICAgIHByZWZhcmdzWydpbnN0YWxsRGlyJ10gPSBhCisgICAgICAgIGlmIG8gPT0gJy11JzoKKyAgICAgICAgICAgIHByZWZhcmdzWydwaW1wRGF0YWJhc2UnXSA9IGEKKyAgICBpZiBub3QgbW9kZToKKyAgICAgICAgX2hlbHAoKQorICAgIGlmIG1vZGUgPT0gJ3ZlcnNpb24nOgorICAgICAgICBwcmludCAnUGltcCB2ZXJzaW9uICVzOyBtb2R1bGUgbmFtZSBpcyAlcycgJSAoUElNUF9WRVJTSU9OLCBfX25hbWVfXykKKyAgICBlbHNlOgorICAgICAgICBfcnVuKG1vZGUsIHZlcmJvc2UsIGZvcmNlLCBhcmdzLCBwcmVmYXJncywgd2F0Y2hlcikKKworIyBGaW5hbGx5LCB0cnkgdG8gdXBkYXRlIG91cnNlbHZlcyB0byBhIG5ld2VyIHZlcnNpb24uCisjIElmIHRoZSBlbmQtdXNlciB1cGRhdGVzIHBpbXAgdGhyb3VnaCBwaW1wIHRoZSBuZXcgdmVyc2lvbgorIyB3aWxsIGJlIGNhbGxlZCBwaW1wX3VwZGF0ZSBhbmQgbGl2ZSBpbiBzaXRlLXBhY2thZ2VzCisjIG9yIHNvbWV3aGVyZSBzaW1pbGFyCitpZiBfX25hbWVfXyAhPSAncGltcF91cGRhdGUnOgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHBpbXBfdXBkYXRlCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgaWYgcGltcF91cGRhdGUuUElNUF9WRVJTSU9OIDw9IFBJTVBfVkVSU0lPTjoKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgd2FybmluZ3Mud2FybigicGltcF91cGRhdGUgaXMgdmVyc2lvbiAlcywgbm90IG5ld2VyIHRoYW4gcGltcCB2ZXJzaW9uICVzIiAlCisgICAgICAgICAgICAgICAgKHBpbXBfdXBkYXRlLlBJTVBfVkVSU0lPTiwgUElNUF9WRVJTSU9OKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZyb20gcGltcF91cGRhdGUgaW1wb3J0ICoKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvcGltcC5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3BpbXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NmViYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3BpbXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvcGltcC5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3BpbXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NmViYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3BpbXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdC1tYWMvdGVybWluYWxjb21tYW5kLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy90ZXJtaW5hbGNvbW1hbmQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4Y2I2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvdGVybWluYWxjb21tYW5kLnB5CkBAIC0wLDAgKzEsNTAgQEAKKyIiInRlcm1pbmFsY29tbWFuZC5weSAtLSBBIG1pbmltYWwgaW50ZXJmYWNlIHRvIFRlcm1pbmFsLmFwcC4KKworVG8gcnVuIGEgc2hlbGwgY29tbWFuZCBpbiBhIG5ldyBUZXJtaW5hbC5hcHAgd2luZG93OgorCisgICAgaW1wb3J0IHRlcm1pbmFsY29tbWFuZAorICAgIHRlcm1pbmFsY29tbWFuZC5ydW4oImxzIC1sIikKKworTm8gcmVzdWx0IGlzIHJldHVybmVkOyBpdCBpcyBwdXJlbHkgbWVhbnQgYXMgYSBxdWljayB3YXkgdG8gcnVuIGEgc2NyaXB0Cit3aXRoIGEgZGVjZW50IGlucHV0L291dHB1dCB3aW5kb3cuCisiIiIKKworIworIyBUaGlzIG1vZHVsZSBpcyBhIGZhaXJseSBzdHJhaWdodGZvcndhcmQgdHJhbnNsYXRpb24gb2YgSmFjayBKYW5zZW4ncworIyBNYWMvT1NYL1B5dGhvbkxhdW5jaGVyL2Rvc2NyaXB0Lm0uCisjCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiSW4gMy54LCB0aGUgdGVybWluYWxjb21tYW5kIG1vZHVsZSBpcyByZW1vdmVkLiIsIHN0YWNrbGV2ZWw9MikKKworaW1wb3J0IHRpbWUKK2ltcG9ydCBvcworZnJvbSBDYXJib24gaW1wb3J0IEFFCitmcm9tIENhcmJvbi5BcHBsZUV2ZW50cyBpbXBvcnQgKgorCisKK1RFUk1JTkFMX1NJRyA9ICJ0cm14IgorU1RBUlRfVEVSTUlOQUwgPSAiL3Vzci9iaW4vb3BlbiAvQXBwbGljYXRpb25zL1V0aWxpdGllcy9UZXJtaW5hbC5hcHAiCitTRU5EX01PREUgPSBrQUVOb1JlcGx5ICAjIGtBRVdhaXRSZXBseSBoYW5ncyB3aGVuIHJ1biBmcm9tIFRlcm1pbmFsLmFwcCBpdHNlbGYKKworCitkZWYgcnVuKGNvbW1hbmQpOgorICAgICIiIlJ1biBhIHNoZWxsIGNvbW1hbmQgaW4gYSBuZXcgVGVybWluYWwuYXBwIHdpbmRvdy4iIiIKKyAgICB0ZXJtQWRkcmVzcyA9IEFFLkFFQ3JlYXRlRGVzYyh0eXBlQXBwbGljYXRpb25CdW5kbGVJRCwgImNvbS5hcHBsZS5UZXJtaW5hbCIpCisgICAgdGhlRXZlbnQgPSBBRS5BRUNyZWF0ZUFwcGxlRXZlbnQoa0FFQ29yZVN1aXRlLCBrQUVEb1NjcmlwdCwgdGVybUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1dG9HZW5lcmF0ZVJldHVybklELCBrQW55VHJhbnNhY3Rpb25JRCkKKyAgICBjb21tYW5kRGVzYyA9IEFFLkFFQ3JlYXRlRGVzYyh0eXBlQ2hhciwgY29tbWFuZCkKKyAgICB0aGVFdmVudC5BRVB1dFBhcmFtRGVzYyhrQUVDb21tYW5kQ2xhc3MsIGNvbW1hbmREZXNjKQorCisgICAgdHJ5OgorICAgICAgICB0aGVFdmVudC5BRVNlbmQoU0VORF9NT0RFLCBrQUVOb3JtYWxQcmlvcml0eSwga0FFRGVmYXVsdFRpbWVvdXQpCisgICAgZXhjZXB0IEFFLkVycm9yLCB3aHk6CisgICAgICAgIGlmIHdoeVswXSAhPSAtNjAwOiAgIyBUZXJtaW5hbC5hcHAgbm90IHlldCBydW5uaW5nCisgICAgICAgICAgICByYWlzZQorICAgICAgICBvcy5zeXN0ZW0oU1RBUlRfVEVSTUlOQUwpCisgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgdGhlRXZlbnQuQUVTZW5kKFNFTkRfTU9ERSwga0FFTm9ybWFsUHJpb3JpdHksIGtBRURlZmF1bHRUaW1lb3V0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuKCJscyAtbCIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3Rlcm1pbmFsY29tbWFuZC5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3Rlcm1pbmFsY29tbWFuZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkODMzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvdGVybWluYWxjb21tYW5kLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3Rlcm1pbmFsY29tbWFuZC5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3Rlcm1pbmFsY29tbWFuZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVkODMzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvdGVybWluYWxjb21tYW5kLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3ZpZGVvcmVhZGVyLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy92aWRlb3JlYWRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGQ3ZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LW1hYy92aWRlb3JlYWRlci5weQpAQCAtMCwwICsxLDI5NCBAQAorIyBWaWRlbyBmaWxlIHJlYWRlciwgdXNpbmcgUXVpY2tUaW1lCisjCisjIFRoaXMgbW9kdWxlIHdhcyBxdWlja2x5IHJpcHBlZCBvdXQgb2YgYW5vdGhlciBzb2Z0d2FyZSBwYWNrYWdlLCBzbyB0aGVyZSBpcyBhIGdvb2QKKyMgY2hhbmNlIHRoYXQgaXQgZG9lcyBub3Qgd29yayBhcy1pcyBhbmQgaXQgbmVlZHMgc29tZSBoYWNraW5nLgorIworIyBKYWNrIEphbnNlbiwgQXVndXN0IDIwMDAKKyMKKworZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJJbiAzLngsIHRoZSB2aWRlb3JlYWRlciBtb2R1bGUgaXMgcmVtb3ZlZC4iLCBzdGFja2xldmVsPTIpCisKKworaW1wb3J0IHN5cworZnJvbSBDYXJib24gaW1wb3J0IFF0Citmcm9tIENhcmJvbiBpbXBvcnQgUXVpY2tUaW1lCitmcm9tIENhcmJvbiBpbXBvcnQgUWQKK2Zyb20gQ2FyYm9uIGltcG9ydCBRZG9mZnMKK2Zyb20gQ2FyYm9uIGltcG9ydCBRRE9mZnNjcmVlbgorZnJvbSBDYXJib24gaW1wb3J0IFJlcwordHJ5OgorICAgIGZyb20gQ2FyYm9uIGltcG9ydCBNZWRpYURlc2NyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZGVmIF9hdWRpb2Rlc2NyKGRhdGEpOgorICAgICAgICByZXR1cm4gTm9uZQorZWxzZToKKyAgICBkZWYgX2F1ZGlvZGVzY3IoZGF0YSk6CisgICAgICAgIHJldHVybiBNZWRpYURlc2NyLlNvdW5kRGVzY3JpcHRpb24uZGVjb2RlKGRhdGEpCit0cnk6CisgICAgZnJvbSBpbWdmb3JtYXQgaW1wb3J0IG1hY3JnYgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIG1hY3JnYiA9ICJNYWNpbnRvc2ggUkdCIGZvcm1hdCIKK2ltcG9ydCBvcworIyBpbXBvcnQgYXVkaW8uZm9ybWF0CisKK2NsYXNzIFZpZGVvRm9ybWF0OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBkZXNjciwgd2lkdGgsIGhlaWdodCwgZm9ybWF0KToKKyAgICAgICAgc2VsZi5fX25hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuX19kZXNjciA9IGRlc2NyCisgICAgICAgIHNlbGYuX193aWR0aCA9IHdpZHRoCisgICAgICAgIHNlbGYuX19oZWlnaHQgPSBoZWlnaHQKKyAgICAgICAgc2VsZi5fX2Zvcm1hdCA9IGZvcm1hdAorCisgICAgZGVmIGdldG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fbmFtZQorCisgICAgZGVmIGdldGRlc2NyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2Rlc2NyCisKKyAgICBkZWYgZ2V0c2l6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX193aWR0aCwgc2VsZi5fX2hlaWdodAorCisgICAgZGVmIGdldGZvcm1hdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19mb3JtYXQKKworY2xhc3MgX1JlYWRlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCk6CisgICAgICAgIGZkID0gUXQuT3Blbk1vdmllRmlsZShwYXRoLCAwKQorICAgICAgICBzZWxmLm1vdmllLCBkMSwgZDIgPSBRdC5OZXdNb3ZpZUZyb21GaWxlKGZkLCAwLCAwKQorICAgICAgICBzZWxmLm1vdmlldGltZXNjYWxlID0gc2VsZi5tb3ZpZS5HZXRNb3ZpZVRpbWVTY2FsZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXVkaW90cmFjayA9IHNlbGYubW92aWUuR2V0TW92aWVJbmRUcmFja1R5cGUoMSwKKyAgICAgICAgICAgICAgICBRdWlja1RpbWUuQXVkaW9NZWRpYUNoYXJhY3RlcmlzdGljLCBRdWlja1RpbWUubW92aWVUcmFja0NoYXJhY3RlcmlzdGljKQorICAgICAgICAgICAgc2VsZi5hdWRpb21lZGlhID0gc2VsZi5hdWRpb3RyYWNrLkdldFRyYWNrTWVkaWEoKQorICAgICAgICBleGNlcHQgUXQuRXJyb3I6CisgICAgICAgICAgICBzZWxmLmF1ZGlvdHJhY2sgPSBzZWxmLmF1ZGlvbWVkaWEgPSBOb25lCisgICAgICAgICAgICBzZWxmLmF1ZGlvZGVzY3IgPSB7fQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGFuZGxlID0gUmVzLkhhbmRsZSgnJykKKyAgICAgICAgICAgIG4gPSBzZWxmLmF1ZGlvbWVkaWEuR2V0TWVkaWFTYW1wbGVEZXNjcmlwdGlvbkNvdW50KCkKKyAgICAgICAgICAgIHNlbGYuYXVkaW9tZWRpYS5HZXRNZWRpYVNhbXBsZURlc2NyaXB0aW9uKDEsIGhhbmRsZSkKKyAgICAgICAgICAgIHNlbGYuYXVkaW9kZXNjciA9IF9hdWRpb2Rlc2NyKGhhbmRsZS5kYXRhKQorICAgICAgICAgICAgc2VsZi5hdWRpb3RpbWVzY2FsZSA9IHNlbGYuYXVkaW9tZWRpYS5HZXRNZWRpYVRpbWVTY2FsZSgpCisgICAgICAgICAgICBkZWwgaGFuZGxlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi52aWRlb3RyYWNrID0gc2VsZi5tb3ZpZS5HZXRNb3ZpZUluZFRyYWNrVHlwZSgxLAorICAgICAgICAgICAgICAgIFF1aWNrVGltZS5WaXN1YWxNZWRpYUNoYXJhY3RlcmlzdGljLCBRdWlja1RpbWUubW92aWVUcmFja0NoYXJhY3RlcmlzdGljKQorICAgICAgICAgICAgc2VsZi52aWRlb21lZGlhID0gc2VsZi52aWRlb3RyYWNrLkdldFRyYWNrTWVkaWEoKQorICAgICAgICBleGNlcHQgUXQuRXJyb3I6CisgICAgICAgICAgICBzZWxmLnZpZGVvdHJhY2sgPSBzZWxmLnZpZGVvbWVkaWEgPSBzZWxmLnZpZGVvdGltZXNjYWxlID0gTm9uZQorICAgICAgICBpZiBzZWxmLnZpZGVvdHJhY2s6CisgICAgICAgICAgICBzZWxmLnZpZGVvdGltZXNjYWxlID0gc2VsZi52aWRlb21lZGlhLkdldE1lZGlhVGltZVNjYWxlKCkKKyAgICAgICAgICAgIHgwLCB5MCwgeDEsIHkxID0gc2VsZi5tb3ZpZS5HZXRNb3ZpZUJveCgpCisgICAgICAgICAgICBzZWxmLnZpZGVvZGVzY3IgPSB7J3dpZHRoJzooeDEteDApLCAnaGVpZ2h0JzooeTEteTApfQorICAgICAgICAgICAgc2VsZi5faW5pdGd3b3JsZCgpCisgICAgICAgIHNlbGYudmlkZW9jdXJ0aW1lID0gTm9uZQorICAgICAgICBzZWxmLmF1ZGlvY3VydGltZSA9IE5vbmUKKworCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHNlbGYuYXVkaW9tZWRpYSA9IE5vbmUKKyAgICAgICAgc2VsZi5hdWRpb3RyYWNrID0gTm9uZQorICAgICAgICBzZWxmLnZpZGVvbWVkaWEgPSBOb25lCisgICAgICAgIHNlbGYudmlkZW90cmFjayA9IE5vbmUKKyAgICAgICAgc2VsZi5tb3ZpZSA9IE5vbmUKKworICAgIGRlZiBfaW5pdGd3b3JsZChzZWxmKToKKyAgICAgICAgb2xkX3BvcnQsIG9sZF9kZXYgPSBRZG9mZnMuR2V0R1dvcmxkKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW92aWVfdyA9IHNlbGYudmlkZW9kZXNjclsnd2lkdGgnXQorICAgICAgICAgICAgbW92aWVfaCA9IHNlbGYudmlkZW9kZXNjclsnaGVpZ2h0J10KKyAgICAgICAgICAgIG1vdmllX3JlY3QgPSAoMCwgMCwgbW92aWVfdywgbW92aWVfaCkKKyAgICAgICAgICAgIHNlbGYuZ3dvcmxkID0gUWRvZmZzLk5ld0dXb3JsZCgzMiwgIG1vdmllX3JlY3QsIE5vbmUsIE5vbmUsIFFET2Zmc2NyZWVuLmtlZXBMb2NhbCkKKyAgICAgICAgICAgIHNlbGYucGl4bWFwID0gc2VsZi5nd29ybGQuR2V0R1dvcmxkUGl4TWFwKCkKKyAgICAgICAgICAgIFFkb2Zmcy5Mb2NrUGl4ZWxzKHNlbGYucGl4bWFwKQorICAgICAgICAgICAgUWRvZmZzLlNldEdXb3JsZChzZWxmLmd3b3JsZC5hc19HcmFmUHRyKCksIE5vbmUpCisgICAgICAgICAgICBRZC5FcmFzZVJlY3QobW92aWVfcmVjdCkKKyAgICAgICAgICAgIHNlbGYubW92aWUuU2V0TW92aWVHV29ybGQoc2VsZi5nd29ybGQuYXNfR3JhZlB0cigpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5tb3ZpZS5TZXRNb3ZpZUJveChtb3ZpZV9yZWN0KQorICAgICAgICAgICAgc2VsZi5tb3ZpZS5TZXRNb3ZpZUFjdGl2ZSgxKQorICAgICAgICAgICAgc2VsZi5tb3ZpZS5Nb3ZpZXNUYXNrKDApCisgICAgICAgICAgICBzZWxmLm1vdmllLlNldE1vdmllUGxheUhpbnRzKFF1aWNrVGltZS5oaW50c0hpZ2hRdWFsaXR5LCBRdWlja1RpbWUuaGludHNIaWdoUXVhbGl0eSkKKyAgICAgICAgICAgICMgWFhYWCBmcmFtZXJhdGUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIFFkb2Zmcy5TZXRHV29ybGQob2xkX3BvcnQsIG9sZF9kZXYpCisKKyAgICBkZWYgX2dldHRyYWNrZHVyYXRpb25fbXMoc2VsZiwgdHJhY2spOgorICAgICAgICB0cmFja3RpbWUgPSB0cmFjay5HZXRUcmFja0R1cmF0aW9uKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX21vdmlldGltZV90b19tcyh0cmFja3RpbWUpCisKKyAgICBkZWYgX21vdmlldGltZV90b19tcyhzZWxmLCB0aW1lKToKKyAgICAgICAgdmFsdWUsIGQxLCBkMiA9IFF0LkNvbnZlcnRUaW1lU2NhbGUoKHRpbWUsIHNlbGYubW92aWV0aW1lc2NhbGUsIE5vbmUpLCAxMDAwKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBfdmlkZW90aW1lX3RvX21zKHNlbGYsIHRpbWUpOgorICAgICAgICB2YWx1ZSwgZDEsIGQyID0gUXQuQ29udmVydFRpbWVTY2FsZSgodGltZSwgc2VsZi52aWRlb3RpbWVzY2FsZSwgTm9uZSksIDEwMDApCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIF9hdWRpb3RpbWVfdG9fbXMoc2VsZiwgdGltZSk6CisgICAgICAgIHZhbHVlLCBkMSwgZDIgPSBRdC5Db252ZXJ0VGltZVNjYWxlKCh0aW1lLCBzZWxmLmF1ZGlvdGltZXNjYWxlLCBOb25lKSwgMTAwMCkKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgX3ZpZGVvdGltZV90b19tb3ZpZXRpbWUoc2VsZiwgdGltZSk6CisgICAgICAgIHZhbHVlLCBkMSwgZDIgPSBRdC5Db252ZXJ0VGltZVNjYWxlKCh0aW1lLCBzZWxmLnZpZGVvdGltZXNjYWxlLCBOb25lKSwKKyAgICAgICAgICAgICAgICBzZWxmLm1vdmlldGltZXNjYWxlKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBIYXNBdWRpbyhzZWxmKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLmF1ZGlvdHJhY2sgaXMgTm9uZQorCisgICAgZGVmIEhhc1ZpZGVvKHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYudmlkZW90cmFjayBpcyBOb25lCisKKyAgICBkZWYgR2V0QXVkaW9EdXJhdGlvbihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuYXVkaW90cmFjazoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiBzZWxmLl9nZXR0cmFja2R1cmF0aW9uX21zKHNlbGYuYXVkaW90cmFjaykKKworICAgIGRlZiBHZXRWaWRlb0R1cmF0aW9uKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi52aWRlb3RyYWNrOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldHRyYWNrZHVyYXRpb25fbXMoc2VsZi52aWRlb3RyYWNrKQorCisgICAgZGVmIEdldEF1ZGlvRm9ybWF0KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5hdWRpb2Rlc2NyOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUKKyAgICAgICAgYnBzID0gc2VsZi5hdWRpb2Rlc2NyWydzYW1wbGVTaXplJ10KKyAgICAgICAgbmNoID0gc2VsZi5hdWRpb2Rlc2NyWydudW1DaGFubmVscyddCisgICAgICAgIGlmIG5jaCA9PSAxOgorICAgICAgICAgICAgY2hhbm5lbHMgPSBbJ21vbm8nXQorICAgICAgICBlbGlmIG5jaCA9PSAyOgorICAgICAgICAgICAgY2hhbm5lbHMgPSBbJ2xlZnQnLCAncmlnaHQnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2hhbm5lbHMgPSBtYXAobGFtYmRhIHg6IHN0cih4KzEpLCByYW5nZShuY2gpKQorICAgICAgICBpZiBicHMgJSA4OgorICAgICAgICAgICAgIyBGdW5ueSBiaXRzLXBlciBzYW1wbGUuIFdlIHByZXRlbmQgbm90IHRvIHVuZGVyc3RhbmQKKyAgICAgICAgICAgIGJsb2Nrc2l6ZSA9IDAKKyAgICAgICAgICAgIGZwYiA9IDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgUXVpY2tUaW1lIGlzIGVhc3kgKGZvciBhcyBmYXIgYXMgd2Ugc3VwcG9ydCBpdCk6IHNhbXBsZXMgYXJlIGFsd2F5cyBhIHdob2xlCisgICAgICAgICAgICAjIG51bWJlciBvZiBieXRlcywgc28gZnJhbWVzIGFyZSBuY2hhbm5lbHMqc2FtcGxlc2l6ZSwgYW5kIHRoZXJlJ3Mgb25lIGZyYW1lIHBlciBibG9jay4KKyAgICAgICAgICAgIGJsb2Nrc2l6ZSA9IChicHMvOCkqbmNoCisgICAgICAgICAgICBmcGIgPSAxCisgICAgICAgIGlmIHNlbGYuYXVkaW9kZXNjclsnZGF0YUZvcm1hdCddID09ICdyYXcgJzoKKyAgICAgICAgICAgIGVuY29kaW5nID0gJ2xpbmVhci1leGNlc3MnCisgICAgICAgIGVsaWYgc2VsZi5hdWRpb2Rlc2NyWydkYXRhRm9ybWF0J10gPT0gJ3R3b3MnOgorICAgICAgICAgICAgZW5jb2RpbmcgPSAnbGluZWFyLXNpZ25lZCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gJ3F1aWNrdGltZS1jb2RpbmctJXMnJXNlbGYuYXVkaW9kZXNjclsnZGF0YUZvcm1hdCddCisjIyAgICAgIHJldHVybiBhdWRpby5mb3JtYXQuQXVkaW9Gb3JtYXRMaW5lYXIoJ3F1aWNrdGltZV9hdWRpbycsICdRdWlja1RpbWUgQXVkaW8gRm9ybWF0JywKKyMjICAgICAgICAgIGNoYW5uZWxzLCBlbmNvZGluZywgYmxvY2tzaXplPWJsb2Nrc2l6ZSwgZnBiPWZwYiwgYnBzPWJwcykKKyAgICAgICAgcmV0dXJuIGNoYW5uZWxzLCBlbmNvZGluZywgYmxvY2tzaXplLCBmcGIsIGJwcworCisgICAgZGVmIEdldEF1ZGlvRnJhbWVSYXRlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5hdWRpb2Rlc2NyOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIGludChzZWxmLmF1ZGlvZGVzY3JbJ3NhbXBsZVJhdGUnXSkKKworICAgIGRlZiBHZXRWaWRlb0Zvcm1hdChzZWxmKToKKyAgICAgICAgd2lkdGggPSBzZWxmLnZpZGVvZGVzY3JbJ3dpZHRoJ10KKyAgICAgICAgaGVpZ2h0ID0gc2VsZi52aWRlb2Rlc2NyWydoZWlnaHQnXQorICAgICAgICByZXR1cm4gVmlkZW9Gb3JtYXQoJ2R1bW15X2Zvcm1hdCcsICdEdW1teSBWaWRlbyBGb3JtYXQnLCB3aWR0aCwgaGVpZ2h0LCBtYWNyZ2IpCisKKyAgICBkZWYgR2V0VmlkZW9GcmFtZVJhdGUoc2VsZik6CisgICAgICAgIHR2ID0gc2VsZi52aWRlb2N1cnRpbWUKKyAgICAgICAgaWYgdHYgaXMgTm9uZToKKyAgICAgICAgICAgIHR2ID0gMAorICAgICAgICBmbGFncyA9IFF1aWNrVGltZS5uZXh0VGltZVN0ZXB8UXVpY2tUaW1lLm5leHRUaW1lRWRnZU9LCisgICAgICAgIHR2LCBkdXIgPSBzZWxmLnZpZGVvbWVkaWEuR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lKGZsYWdzLCB0diwgMS4wKQorICAgICAgICBkdXIgPSBzZWxmLl92aWRlb3RpbWVfdG9fbXMoZHVyKQorICAgICAgICByZXR1cm4gaW50KCgxMDAwLjAvZHVyKSswLjUpCisKKyAgICBkZWYgUmVhZEF1ZGlvKHNlbGYsIG5mcmFtZXMsIHRpbWU9Tm9uZSk6CisgICAgICAgIGlmIG5vdCB0aW1lIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmF1ZGlvY3VydGltZSA9IHRpbWUKKyAgICAgICAgZmxhZ3MgPSBRdWlja1RpbWUubmV4dFRpbWVTdGVwfFF1aWNrVGltZS5uZXh0VGltZUVkZ2VPSworICAgICAgICBpZiBzZWxmLmF1ZGlvY3VydGltZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5hdWRpb2N1cnRpbWUgPSAwCisgICAgICAgIHR2ID0gc2VsZi5hdWRpb21lZGlhLkdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZU9ubHkoZmxhZ3MsIHNlbGYuYXVkaW9jdXJ0aW1lLCAxLjApCisgICAgICAgIGlmIHR2IDwgMCBvciAoc2VsZi5hdWRpb2N1cnRpbWUgYW5kIHR2IDwgc2VsZi5hdWRpb2N1cnRpbWUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2F1ZGlvdGltZV90b19tcyhzZWxmLmF1ZGlvY3VydGltZSksIE5vbmUKKyAgICAgICAgaCA9IFJlcy5IYW5kbGUoJycpCisgICAgICAgIGRlc2NfaCA9IFJlcy5IYW5kbGUoJycpCisgICAgICAgIHNpemUsIGFjdHVhbHRpbWUsIHNhbXBsZWR1cmF0aW9uLCBkZXNjX2luZGV4LCBhY3R1YWxjb3VudCwgZmxhZ3MgPSBcCisgICAgICAgICAgICBzZWxmLmF1ZGlvbWVkaWEuR2V0TWVkaWFTYW1wbGUoaCwgMCwgdHYsIGRlc2NfaCwgbmZyYW1lcykKKyAgICAgICAgc2VsZi5hdWRpb2N1cnRpbWUgPSBhY3R1YWx0aW1lICsgYWN0dWFsY291bnQqc2FtcGxlZHVyYXRpb24KKyAgICAgICAgcmV0dXJuIHNlbGYuX2F1ZGlvdGltZV90b19tcyhhY3R1YWx0aW1lKSwgaC5kYXRhCisKKyAgICBkZWYgUmVhZFZpZGVvKHNlbGYsIHRpbWU9Tm9uZSk6CisgICAgICAgIGlmIG5vdCB0aW1lIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnZpZGVvY3VydGltZSA9IHRpbWUKKyAgICAgICAgZmxhZ3MgPSBRdWlja1RpbWUubmV4dFRpbWVTdGVwCisgICAgICAgIGlmIHNlbGYudmlkZW9jdXJ0aW1lIGlzIE5vbmU6CisgICAgICAgICAgICBmbGFncyA9IGZsYWdzIHwgUXVpY2tUaW1lLm5leHRUaW1lRWRnZU9LCisgICAgICAgICAgICBzZWxmLnZpZGVvY3VydGltZSA9IDAKKyAgICAgICAgdHYgPSBzZWxmLnZpZGVvbWVkaWEuR2V0TWVkaWFOZXh0SW50ZXJlc3RpbmdUaW1lT25seShmbGFncywgc2VsZi52aWRlb2N1cnRpbWUsIDEuMCkKKyAgICAgICAgaWYgdHYgPCAwIG9yIChzZWxmLnZpZGVvY3VydGltZSBhbmQgdHYgPD0gc2VsZi52aWRlb2N1cnRpbWUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ZpZGVvdGltZV90b19tcyhzZWxmLnZpZGVvY3VydGltZSksIE5vbmUKKyAgICAgICAgc2VsZi52aWRlb2N1cnRpbWUgPSB0dgorICAgICAgICBtb3ZpZWN1cnRpbWUgPSBzZWxmLl92aWRlb3RpbWVfdG9fbW92aWV0aW1lKHNlbGYudmlkZW9jdXJ0aW1lKQorICAgICAgICBzZWxmLm1vdmllLlNldE1vdmllVGltZVZhbHVlKG1vdmllY3VydGltZSkKKyAgICAgICAgc2VsZi5tb3ZpZS5Nb3ZpZXNUYXNrKDApCisgICAgICAgIHJldHVybiBzZWxmLl92aWRlb3RpbWVfdG9fbXMoc2VsZi52aWRlb2N1cnRpbWUpLCBzZWxmLl9nZXRwaXhtYXBjb250ZW50KCkKKworICAgIGRlZiBfZ2V0cGl4bWFwY29udGVudChzZWxmKToKKyAgICAgICAgIiIiU2h1ZmZsZSB0aGUgb2Zmc2NyZWVuIFBpeE1hcCBkYXRhLCBiZWNhdXNlIGl0IG1heSBoYXZlIGZ1bm55IHN0cmlkZSB2YWx1ZXMiIiIKKyAgICAgICAgcm93Ynl0ZXMgPSBRZG9mZnMuR2V0UGl4Um93Qnl0ZXMoc2VsZi5waXhtYXApCisgICAgICAgIHdpZHRoID0gc2VsZi52aWRlb2Rlc2NyWyd3aWR0aCddCisgICAgICAgIGhlaWdodCA9IHNlbGYudmlkZW9kZXNjclsnaGVpZ2h0J10KKyAgICAgICAgc3RhcnQgPSAwCisgICAgICAgIHJ2ID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoaGVpZ2h0KToKKyAgICAgICAgICAgIG5leHRsaW5lID0gUWRvZmZzLkdldFBpeE1hcEJ5dGVzKHNlbGYucGl4bWFwLCBzdGFydCwgd2lkdGgqNCkKKyAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQgKyByb3dieXRlcworICAgICAgICAgICAgcnYuYXBwZW5kKG5leHRsaW5lKQorICAgICAgICByZXR1cm4gJycuam9pbihydikKKworZGVmIHJlYWRlcih1cmwpOgorICAgIHRyeToKKyAgICAgICAgcmRyID0gX1JlYWRlcih1cmwpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIHJkcgorCitkZWYgX3Rlc3QoKToKKyAgICBpbXBvcnQgRWFzeURpYWxvZ3MKKyAgICB0cnk6CisgICAgICAgIGZyb20gUElMIGltcG9ydCBJbWFnZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgSW1hZ2UgPSBOb25lCisgICAgaW1wb3J0IE1hY09TCisgICAgUXQuRW50ZXJNb3ZpZXMoKQorICAgIHBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPSdWaWRlbyB0byBjb252ZXJ0JykKKyAgICBpZiBub3QgcGF0aDogc3lzLmV4aXQoMCkKKyAgICByZHIgPSByZWFkZXIocGF0aCkKKyAgICBpZiBub3QgcmRyOgorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGRzdGRpciA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J05hbWUgZm9yIG91dHB1dCBmb2xkZXInKQorICAgIGlmIG5vdCBkc3RkaXI6IHN5cy5leGl0KDApCisgICAgbnVtID0gMAorICAgIG9zLm1rZGlyKGRzdGRpcikKKyAgICB2aWRlb2ZtdCA9IHJkci5HZXRWaWRlb0Zvcm1hdCgpCisgICAgaW1nZm10ID0gdmlkZW9mbXQuZ2V0Zm9ybWF0KCkKKyAgICBpbWd3LCBpbWdoID0gdmlkZW9mbXQuZ2V0c2l6ZSgpCisgICAgdGltZXN0YW1wLCBkYXRhID0gcmRyLlJlYWRWaWRlbygpCisgICAgd2hpbGUgZGF0YToKKyAgICAgICAgZm5hbWUgPSAnZnJhbWUlMDQuNGQuanBnJyVudW0KKyAgICAgICAgbnVtID0gbnVtKzEKKyAgICAgICAgcG5hbWUgPSBvcy5wYXRoLmpvaW4oZHN0ZGlyLCBmbmFtZSkKKyAgICAgICAgaWYgbm90IEltYWdlOiBwcmludCAnTm90JywKKyAgICAgICAgcHJpbnQgJ1dyaXRpbmcgJXMsIHNpemUgJWR4JWQsICVkIGJ5dGVzJyUoZm5hbWUsIGltZ3csIGltZ2gsIGxlbihkYXRhKSkKKyAgICAgICAgaWYgSW1hZ2U6CisgICAgICAgICAgICBpbWcgPSBJbWFnZS5mcm9tc3RyaW5nKCJSR0JBIiwgKGltZ3csIGltZ2gpLCBkYXRhKQorICAgICAgICAgICAgaW1nLnNhdmUocG5hbWUsICdKUEVHJykKKyAgICAgICAgICAgIHRpbWVzdGFtcCwgZGF0YSA9IHJkci5SZWFkVmlkZW8oKQorICAgICAgICAgICAgTWFjT1MuU2V0Q3JlYXRvckFuZFR5cGUocG5hbWUsICdvZ2xlJywgJ0pQRUcnKQorICAgICAgICAgICAgaWYgbnVtID4gMjA6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3N0b3BwaW5nIGF0IDIwIGZyYW1lcyBzbyB5b3VyIGRpc2sgZG9lcyBub3QgZmlsbCB1cDotKScKKyAgICAgICAgICAgICAgICBicmVhaworICAgIHByaW50ICdUb3RhbCBmcmFtZXM6JywgbnVtCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgX3Rlc3QoKQorICAgIHN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3ZpZGVvcmVhZGVyLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvdmlkZW9yZWFkZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWEwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3ZpZGVvcmVhZGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3ZpZGVvcmVhZGVyLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1tYWMvdmlkZW9yZWFkZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZWEwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbWFjL3ZpZGVvcmVhZGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXRmb3JtLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0Zm9ybS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMDAxNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0Zm9ybS5weQpAQCAtMCwwICsxLDE2NDIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiIgVGhpcyBtb2R1bGUgdHJpZXMgdG8gcmV0cmlldmUgYXMgbXVjaCBwbGF0Zm9ybS1pZGVudGlmeWluZyBkYXRhIGFzCisgICAgcG9zc2libGUuIEl0IG1ha2VzIHRoaXMgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHZpYSBmdW5jdGlvbiBBUElzLgorCisgICAgSWYgY2FsbGVkIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgaXQgcHJpbnRzIHRoZSBwbGF0Zm9ybQorICAgIGluZm9ybWF0aW9uIGNvbmNhdGVuYXRlZCBhcyBzaW5nbGUgc3RyaW5nIHRvIHN0ZG91dC4gVGhlIG91dHB1dAorICAgIGZvcm1hdCBpcyB1c2VhYmxlIGFzIHBhcnQgb2YgYSBmaWxlbmFtZS4KKworIiIiCisjICAgIFRoaXMgbW9kdWxlIGlzIG1haW50YWluZWQgYnkgTWFyYy1BbmRyZSBMZW1idXJnIDxtYWxAZWdlbml4LmNvbT4uCisjICAgIElmIHlvdSBmaW5kIHByb2JsZW1zLCBwbGVhc2Ugc3VibWl0IGJ1ZyByZXBvcnRzL3BhdGNoZXMgdmlhIHRoZQorIyAgICBQeXRob24gYnVnIHRyYWNrZXIgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcpIGFuZCBhc3NpZ24gdGhlbSB0byAibGVtYnVyZyIuCisjCisjICAgIE5vdGU6IFBsZWFzZSBrZWVwIHRoaXMgbW9kdWxlIGNvbXBhdGlibGUgdG8gUHl0aG9uIDEuNS4yLgorIworIyAgICBTdGlsbCBuZWVkZWQ6CisjICAgICogbW9yZSBzdXBwb3J0IGZvciBXaW5DRQorIyAgICAqIHN1cHBvcnQgZm9yIE1TLURPUyAoUHl0aG9uRFggPykKKyMgICAgKiBzdXBwb3J0IGZvciBBbWlnYSBhbmQgb3RoZXIgc3RpbGwgdW5zdXBwb3J0ZWQgcGxhdGZvcm1zIHJ1bm5pbmcgUHl0aG9uCisjICAgICogc3VwcG9ydCBmb3IgYWRkaXRpb25hbCBMaW51eCBkaXN0cmlidXRpb25zCisjCisjICAgIE1hbnkgdGhhbmtzIHRvIGFsbCB0aG9zZSB3aG8gaGVscGVkIGFkZGluZyBwbGF0Zm9ybS1zcGVjaWZpYworIyAgICBjaGVja3MgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpOgorIworIyAgICAgIENoYXJsZXMgRyBXYWxkbWFuLCBEYXZpZCBBcm5vbGQsIEdvcmRvbiBNY01pbGxhbiwgQmVuIERhcm5lbGwsCisjICAgICAgSmVmZiBCYXVlciwgQ2xpZmYgQ3Jhd2ZvcmQsIEl2YW4gVmFuIExhbmluZ2hhbSwgSm9zZWYKKyMgICAgICBCZXRhbmNvdXJ0LCBSYW5kYWxsIEhvcHBlciwgS2FybCBQdXRsYW5kLCBKb2huIEZhcnJlbGwsIEdyZWcKKyMgICAgICBBbmRydWssIEp1c3QgdmFuIFJvc3N1bSwgVGhvbWFzIEhlbGxlciwgTWFyayBSLiBMZXZpbnNvbiwgTWFyaworIyAgICAgIEhhbW1vbmQsIEJpbGwgVHV0dCwgSGFucyBOb3dhaywgVXdlIFplc3NpbiAoT3BlblZNUyBzdXBwb3J0KSwKKyMgICAgICBDb2xpbiBLb25nLCBUcmVudCBNaWNrLCBHdWlkbyB2YW4gUm9zc3VtLCBBbnRob255IEJheHRlcgorIworIyAgICBIaXN0b3J5OgorIworIyAgICA8c2VlIENWUyBhbmQgU1ZOIGNoZWNraW4gbWVzc2FnZXMgZm9yIGhpc3Rvcnk+CisjCisjICAgIDEuMC43IC0gYWRkZWQgREVWX05VTEwKKyMgICAgMS4wLjYgLSBhZGRlZCBsaW51eF9kaXN0cmlidXRpb24oKQorIyAgICAxLjAuNSAtIGZpeGVkIEphdmEgc3VwcG9ydCB0byBhbGxvdyBydW5uaW5nIHRoZSBtb2R1bGUgb24gSnl0aG9uCisjICAgIDEuMC40IC0gYWRkZWQgSXJvblB5dGhvbiBzdXBwb3J0CisjICAgIDEuMC4zIC0gYWRkZWQgbm9ybWFsaXphdGlvbiBvZiBXaW5kb3dzIHN5c3RlbSBuYW1lCisjICAgIDEuMC4yIC0gYWRkZWQgbW9yZSBXaW5kb3dzIHN1cHBvcnQKKyMgICAgMS4wLjEgLSByZWZvcm1hdHRlZCB0byBtYWtlIGRvYy5weSBoYXBweQorIyAgICAxLjAuMCAtIHJlZm9ybWF0dGVkIGEgYml0IGFuZCBjaGVja2VkIGludG8gUHl0aG9uIENWUworIyAgICAwLjguMCAtIGFkZGVkIHN5cy52ZXJzaW9uIHBhcnNlciBhbmQgdmFyaW91cyBuZXcgYWNjZXNzCisjICAgICAgICAgICAgQVBJcyAocHl0aG9uX3ZlcnNpb24oKSwgcHl0aG9uX2NvbXBpbGVyKCksIGV0Yy4pCisjICAgIDAuNy4yIC0gZml4ZWQgYXJjaGl0ZWN0dXJlKCkgdG8gdXNlIHNpemVvZihwb2ludGVyKSB3aGVyZSBhdmFpbGFibGUKKyMgICAgMC43LjEgLSBhZGRlZCBzdXBwb3J0IGZvciBDYWxkZXJhIE9wZW5MaW51eAorIyAgICAwLjcuMCAtIHNvbWUgZml4ZXMgZm9yIFdpbkNFOyB1bnRhYmlmaWVkIHRoZSBzb3VyY2UgZmlsZQorIyAgICAwLjYuMiAtIHN1cHBvcnQgZm9yIE9wZW5WTVMgLSByZXF1aXJlcyB2ZXJzaW9uIDEuNS4yLVYwMDYgb3IgaGlnaGVyIGFuZAorIyAgICAgICAgICAgIHZtc19saWIuZ2V0c3lpKCkgY29uZmlndXJlZAorIyAgICAwLjYuMSAtIGFkZGVkIGNvZGUgdG8gcHJldmVudCAndW5hbWUgLXAnIG9uIHBsYXRmb3JtcyB3aGljaCBhcmUKKyMgICAgICAgICAgICBrbm93biBub3QgdG8gc3VwcG9ydCBpdAorIyAgICAwLjYuMCAtIGZpeGVkIHdpbjMyX3ZlcigpIHRvIGhvcGVmdWxseSB3b3JrIG9uIFdpbjk1LDk4LE5UIGFuZCBXaW4yazsKKyMgICAgICAgICAgICBkaWQgc29tZSBjbGVhbnVwIG9mIHRoZSBpbnRlcmZhY2VzIC0gc29tZSBBUElzIGhhdmUgY2hhbmdlZAorIyAgICAwLjUuNSAtIGZpeGVkIGFub3RoZXIgdHlwZSBpbiB0aGUgTWFjT1MgY29kZS4uLiBzaG91bGQgaGF2ZQorIyAgICAgICAgICAgIHVzZWQgbW9yZSBjb2ZmZWUgdG9kYXkgOy0pCisjICAgIDAuNS40IC0gZml4ZWQgYSBmZXcgdHlwb3MgaW4gdGhlIE1hY09TIGNvZGUKKyMgICAgMC41LjMgLSBhZGRlZCBleHBlcmltZW50YWwgTWFjT1Mgc3VwcG9ydDsgYWRkZWQgYmV0dGVyIHBvcGVuKCkKKyMgICAgICAgICAgICB3b3JrYXJvdW5kcyBpbiBfc3lzY21kX3ZlcigpIC0tIHN0aWxsIG5vdCAxMDAlIGVsZWdhbnQKKyMgICAgICAgICAgICB0aG91Z2gKKyMgICAgMC41LjIgLSBmaXhlZCB1bmFtZSgpIHRvIHJldHVybiAnJyBpbnN0ZWFkIG9mICd1bmtub3duJyBpbiBhbGwKKyMgICAgICAgICAgICByZXR1cm4gdmFsdWVzICh0aGUgc3lzdGVtIHVuYW1lIGNvbW1hbmQgdGVuZHMgdG8gcmV0dXJuCisjICAgICAgICAgICAgJ3Vua25vd24nIGluc3RlYWQgb2YganVzdCBsZWF2aW5nIHRoZSBmaWVsZCBlbXRweSkKKyMgICAgMC41LjEgLSBpbmNsdWRlZCBjb2RlIGZvciBzbGFja3dhcmUgZGlzdDsgYWRkZWQgZXhjZXB0aW9uIGhhbmRsZXJzCisjICAgICAgICAgICAgdG8gY292ZXIgdXAgc2l0dWF0aW9ucyB3aGVyZSBwbGF0Zm9ybXMgZG9uJ3QgaGF2ZSBvcy5wb3BlbgorIyAgICAgICAgICAgIChlLmcuIE1hYykgb3IgZmFpbCBvbiBzb2NrZXQuZ2V0aG9zdG5hbWUoKTsgZml4ZWQgbGliYworIyAgICAgICAgICAgIGRldGVjdGlvbiBSRQorIyAgICAwLjUuMCAtIGNoYW5nZWQgdGhlIEFQSSBuYW1lcyByZWZlcnJpbmcgdG8gc3lzdGVtIGNvbW1hbmRzIHRvICpzeXNjbWQqOworIyAgICAgICAgICAgIGFkZGVkIGphdmFfdmVyKCk7IG1hZGUgc3lzY21kX3ZlcigpIGEgcHJpdmF0ZQorIyAgICAgICAgICAgIEFQSSAod2FzIHN5c3RlbV92ZXIoKSBpbiBwcmV2aW91cyB2ZXJzaW9ucykgLS0gdXNlIHVuYW1lKCkKKyMgICAgICAgICAgICBpbnN0ZWFkOyBleHRlbmRlZCB0aGUgd2luMzJfdmVyKCkgdG8gYWxzbyByZXR1cm4gcHJvY2Vzc29yCisjICAgICAgICAgICAgdHlwZSBpbmZvcm1hdGlvbgorIyAgICAwLjQuMCAtIGFkZGVkIHdpbjMyX3ZlcigpIGFuZCBtb2RpZmllZCB0aGUgcGxhdGZvcm0oKSBvdXRwdXQgZm9yIFdpblhYCisjICAgIDAuMy40IC0gZml4ZWQgYSBidWcgaW4gX2ZvbGxvd19zeW1saW5rcygpCisjICAgIDAuMy4zIC0gZml4ZWQgcG9wZW4oKSBhbmQgImZpbGUiIGNvbW1hbmQgaW52b2thdGlvbiBidWdzCisjICAgIDAuMy4yIC0gYWRkZWQgYXJjaGl0ZWN0dXJlKCkgQVBJIGFuZCBzdXBwb3J0IGZvciBpdCBpbiBwbGF0Zm9ybSgpCisjICAgIDAuMy4xIC0gZml4ZWQgc3lzY21kX3ZlcigpIFJFIHRvIHN1cHBvcnQgV2luZG93cyBOVAorIyAgICAwLjMuMCAtIGFkZGVkIHN5c3RlbSBhbGlhcyBzdXBwb3J0CisjICAgIDAuMi4zIC0gcmVtb3ZlZCAnd2luY2UnIGFnYWluLi4uIG9oIHdlbGwuCisjICAgIDAuMi4yIC0gYWRkZWQgJ3dpbmNlJyB0byBzeXNjbWRfdmVyKCkgc3VwcG9ydGVkIHBsYXRmb3JtcworIyAgICAwLjIuMSAtIGFkZGVkIGNhY2hlIGxvZ2ljIGFuZCBjaGFuZ2VkIHRoZSBwbGF0Zm9ybSBzdHJpbmcgZm9ybWF0CisjICAgIDAuMi4wIC0gY2hhbmdlZCB0aGUgQVBJIHRvIHVzZSBmdW5jdGlvbnMgaW5zdGVhZCBvZiBtb2R1bGUgZ2xvYmFscworIyAgICAgICAgICAgIHNpbmNlIHNvbWUgYWN0aW9uIHRha2UgdG9vIGxvbmcgdG8gYmUgcnVuIG9uIG1vZHVsZSBpbXBvcnQKKyMgICAgMC4xLjAgLSBmaXJzdCByZWxlYXNlCisjCisjICAgIFlvdSBjYW4gYWx3YXlzIGdldCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBtb2R1bGUgYXQ6CisjCisjICAgICAgICAgICAgIGh0dHA6Ly93d3cuZWdlbml4LmNvbS9maWxlcy9weXRob24vcGxhdGZvcm0ucHkKKyMKKyMgICAgSWYgdGhhdCBVUkwgc2hvdWxkIGZhaWwsIHRyeSBjb250YWN0aW5nIHRoZSBhdXRob3IuCisKK19fY29weXJpZ2h0X18gPSAiIiIKKyAgICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMCwgTWFyYy1BbmRyZSBMZW1idXJnOyBtYWlsdG86bWFsQGxlbWJ1cmcuY29tCisgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMTAsIGVHZW5peC5jb20gU29mdHdhcmUgR21iSDsgbWFpbHRvOmluZm9AZWdlbml4LmNvbQorCisgICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgICAgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIG9yIHJveWFsdHkgaXMgaGVyZWJ5IGdyYW50ZWQsCisgICAgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorICAgIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorICAgIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiBvciBwb3J0aW9ucyB0aGVyZW9mLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9ucywKKyAgICB0aGF0IHlvdSBtYWtlLgorCisgICAgRUdFTklYLkNPTSBTT0ZUV0FSRSBHTUJIIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTworICAgIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyAgICBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsCisgICAgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HCisgICAgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAgICBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorICAgIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFICEKKworIiIiCisKK19fdmVyc2lvbl9fID0gJzEuMC43JworCitpbXBvcnQgc3lzLHN0cmluZyxvcyxyZQorCisjIyMgR2xvYmFscyAmIENvbnN0YW50cworCisjIERldGVybWluZSB0aGUgcGxhdGZvcm0ncyAvZGV2L251bGwgZGV2aWNlCit0cnk6CisgICAgREVWX05VTEwgPSBvcy5kZXZudWxsCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgIyBvcy5kZXZudWxsIHdhcyBhZGRlZCBpbiBQeXRob24gMi40LCBzbyBlbXVsYXRlIGl0IGZvciBlYXJsaWVyCisgICAgIyBQeXRob24gdmVyc2lvbnMKKyAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCdkb3MnLCd3aW4zMicsJ3dpbjE2Jywnb3MyJyk6CisgICAgICAgICMgVXNlIHRoZSBvbGQgQ1AvTSBOVUwgYXMgZGV2aWNlIG5hbWUKKyAgICAgICAgREVWX05VTEwgPSAnTlVMJworICAgIGVsc2U6CisgICAgICAgICMgU3RhbmRhcmQgVW5peCB1c2VzIC9kZXYvbnVsbAorICAgICAgICBERVZfTlVMTCA9ICcvZGV2L251bGwnCisKKyMjIyBQbGF0Zm9ybSBzcGVjaWZpYyBBUElzCisKK19saWJjX3NlYXJjaCA9IHJlLmNvbXBpbGUocicoX19saWJjX2luaXQpJworICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyhHTElCQ18oWzAtOS5dKykpJworICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyhsaWJjKF9cdyspP1wuc28oPzpcLihcZFswLTkuXSopKT8pJykKKworZGVmIGxpYmNfdmVyKGV4ZWN1dGFibGU9c3lzLmV4ZWN1dGFibGUsbGliPScnLHZlcnNpb249JycsCisKKyAgICAgICAgICAgICBjaHVua3NpemU9MjA0OCk6CisKKyAgICAiIiIgVHJpZXMgdG8gZGV0ZXJtaW5lIHRoZSBsaWJjIHZlcnNpb24gdGhhdCB0aGUgZmlsZSBleGVjdXRhYmxlCisgICAgICAgICh3aGljaCBkZWZhdWx0cyB0byB0aGUgUHl0aG9uIGludGVycHJldGVyKSBpcyBsaW5rZWQgYWdhaW5zdC4KKworICAgICAgICBSZXR1cm5zIGEgdHVwbGUgb2Ygc3RyaW5ncyAobGliLHZlcnNpb24pIHdoaWNoIGRlZmF1bHQgdG8gdGhlCisgICAgICAgIGdpdmVuIHBhcmFtZXRlcnMgaW4gY2FzZSB0aGUgbG9va3VwIGZhaWxzLgorCisgICAgICAgIE5vdGUgdGhhdCB0aGUgZnVuY3Rpb24gaGFzIGludGltYXRlIGtub3dsZWRnZSBvZiBob3cgZGlmZmVyZW50CisgICAgICAgIGxpYmMgdmVyc2lvbnMgYWRkIHN5bWJvbHMgdG8gdGhlIGV4ZWN1dGFibGUgYW5kIHRodXMgaXMgcHJvYmFibHkKKyAgICAgICAgb25seSB1c2VhYmxlIGZvciBleGVjdXRhYmxlcyBjb21waWxlZCB1c2luZyBnY2MuCisKKyAgICAgICAgVGhlIGZpbGUgaXMgcmVhZCBhbmQgc2Nhbm5lZCBpbiBjaHVua3Mgb2YgY2h1bmtzaXplIGJ5dGVzLgorCisgICAgIiIiCisgICAgaWYgaGFzYXR0cihvcy5wYXRoLCAncmVhbHBhdGgnKToKKyAgICAgICAgIyBQeXRob24gMi4yIGludHJvZHVjZWQgb3MucGF0aC5yZWFscGF0aCgpOyBpdCBpcyB1c2VkCisgICAgICAgICMgaGVyZSB0byB3b3JrIGFyb3VuZCBwcm9ibGVtcyB3aXRoIEN5Z3dpbiBub3QgYmVpbmcKKyAgICAgICAgIyBhYmxlIHRvIG9wZW4gc3ltbGlua3MgZm9yIHJlYWRpbmcKKyAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGgucmVhbHBhdGgoZXhlY3V0YWJsZSkKKyAgICBmID0gb3BlbihleGVjdXRhYmxlLCdyYicpCisgICAgYmluYXJ5ID0gZi5yZWFkKGNodW5rc2l6ZSkKKyAgICBwb3MgPSAwCisgICAgd2hpbGUgMToKKyAgICAgICAgbSA9IF9saWJjX3NlYXJjaC5zZWFyY2goYmluYXJ5LHBvcykKKyAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICBiaW5hcnkgPSBmLnJlYWQoY2h1bmtzaXplKQorICAgICAgICAgICAgaWYgbm90IGJpbmFyeToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcG9zID0gMAorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbGliY2luaXQsZ2xpYmMsZ2xpYmN2ZXJzaW9uLHNvLHRocmVhZHMsc292ZXJzaW9uID0gbS5ncm91cHMoKQorICAgICAgICBpZiBsaWJjaW5pdCBhbmQgbm90IGxpYjoKKyAgICAgICAgICAgIGxpYiA9ICdsaWJjJworICAgICAgICBlbGlmIGdsaWJjOgorICAgICAgICAgICAgaWYgbGliICE9ICdnbGliYyc6CisgICAgICAgICAgICAgICAgbGliID0gJ2dsaWJjJworICAgICAgICAgICAgICAgIHZlcnNpb24gPSBnbGliY3ZlcnNpb24KKyAgICAgICAgICAgIGVsaWYgZ2xpYmN2ZXJzaW9uID4gdmVyc2lvbjoKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gZ2xpYmN2ZXJzaW9uCisgICAgICAgIGVsaWYgc286CisgICAgICAgICAgICBpZiBsaWIgIT0gJ2dsaWJjJzoKKyAgICAgICAgICAgICAgICBsaWIgPSAnbGliYycKKyAgICAgICAgICAgICAgICBpZiBzb3ZlcnNpb24gYW5kIHNvdmVyc2lvbiA+IHZlcnNpb246CisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSBzb3ZlcnNpb24KKyAgICAgICAgICAgICAgICBpZiB0aHJlYWRzIGFuZCB2ZXJzaW9uWy1sZW4odGhyZWFkcyk6XSAhPSB0aHJlYWRzOgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiArIHRocmVhZHMKKyAgICAgICAgcG9zID0gbS5lbmQoKQorICAgIGYuY2xvc2UoKQorICAgIHJldHVybiBsaWIsdmVyc2lvbgorCitkZWYgX2Rpc3RfdHJ5X2hhcmRlcihkaXN0bmFtZSx2ZXJzaW9uLGlkKToKKworICAgICIiIiBUcmllcyBzb21lIHNwZWNpYWwgdHJpY2tzIHRvIGdldCB0aGUgZGlzdHJpYnV0aW9uCisgICAgICAgIGluZm9ybWF0aW9uIGluIGNhc2UgdGhlIGRlZmF1bHQgbWV0aG9kIGZhaWxzLgorCisgICAgICAgIEN1cnJlbnRseSBzdXBwb3J0cyBvbGRlciBTdVNFIExpbnV4LCBDYWxkZXJhIE9wZW5MaW51eCBhbmQKKyAgICAgICAgU2xhY2t3YXJlIExpbnV4IGRpc3RyaWJ1dGlvbnMuCisKKyAgICAiIiIKKyAgICBpZiBvcy5wYXRoLmV4aXN0cygnL3Zhci9hZG0vaW5zdC1sb2cvaW5mbycpOgorICAgICAgICAjIFN1U0UgTGludXggc3RvcmVzIGRpc3RyaWJ1dGlvbiBpbmZvcm1hdGlvbiBpbiB0aGF0IGZpbGUKKyAgICAgICAgaW5mbyA9IG9wZW4oJy92YXIvYWRtL2luc3QtbG9nL2luZm8nKS5yZWFkbGluZXMoKQorICAgICAgICBkaXN0bmFtZSA9ICdTdVNFJworICAgICAgICBmb3IgbGluZSBpbiBpbmZvOgorICAgICAgICAgICAgdHYgPSBzdHJpbmcuc3BsaXQobGluZSkKKyAgICAgICAgICAgIGlmIGxlbih0dikgPT0gMjoKKyAgICAgICAgICAgICAgICB0YWcsdmFsdWUgPSB0dgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgdGFnID09ICdNSU5fRElTVF9WRVJTSU9OJzoKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gc3RyaW5nLnN0cmlwKHZhbHVlKQorICAgICAgICAgICAgZWxpZiB0YWcgPT0gJ0RJU1RfSURFTlQnOgorICAgICAgICAgICAgICAgIHZhbHVlcyA9IHN0cmluZy5zcGxpdCh2YWx1ZSwnLScpCisgICAgICAgICAgICAgICAgaWQgPSB2YWx1ZXNbMl0KKyAgICAgICAgcmV0dXJuIGRpc3RuYW1lLHZlcnNpb24saWQKKworICAgIGlmIG9zLnBhdGguZXhpc3RzKCcvZXRjLy5pbnN0YWxsZWQnKToKKyAgICAgICAgIyBDYWxkZXJhIE9wZW5MaW51eCBoYXMgc29tZSBpbmZvcyBpbiB0aGF0IGZpbGUgKHRoYW5rcyB0byBDb2xpbiBLb25nKQorICAgICAgICBpbmZvID0gb3BlbignL2V0Yy8uaW5zdGFsbGVkJykucmVhZGxpbmVzKCkKKyAgICAgICAgZm9yIGxpbmUgaW4gaW5mbzoKKyAgICAgICAgICAgIHBrZyA9IHN0cmluZy5zcGxpdChsaW5lLCctJykKKyAgICAgICAgICAgIGlmIGxlbihwa2cpID49IDIgYW5kIHBrZ1swXSA9PSAnT3BlbkxpbnV4JzoKKyAgICAgICAgICAgICAgICAjIFhYWCBkb2VzIENhbGRlcmEgc3VwcG9ydCBub24gSW50ZWwgcGxhdGZvcm1zID8gSWYgeWVzLAorICAgICAgICAgICAgICAgICMgICAgIHdoZXJlIGNhbiB3ZSBmaW5kIHRoZSBuZWVkZWQgaWQgPworICAgICAgICAgICAgICAgIHJldHVybiAnT3BlbkxpbnV4Jyxwa2dbMV0saWQKKworICAgIGlmIG9zLnBhdGguaXNkaXIoJy91c3IvbGliL3NldHVwJyk6CisgICAgICAgICMgQ2hlY2sgZm9yIHNsYWNrd2FyZSB2ZXJzb24gdGFnIGZpbGUgKHRoYW5rcyB0byBHcmVnIEFuZHJ1aykKKyAgICAgICAgdmVyZmlsZXMgPSBvcy5saXN0ZGlyKCcvdXNyL2xpYi9zZXR1cCcpCisgICAgICAgIGZvciBuIGluIHJhbmdlKGxlbih2ZXJmaWxlcyktMSwgLTEsIC0xKToKKyAgICAgICAgICAgIGlmIHZlcmZpbGVzW25dWzoxNF0gIT0gJ3NsYWNrLXZlcnNpb24tJzoKKyAgICAgICAgICAgICAgICBkZWwgdmVyZmlsZXNbbl0KKyAgICAgICAgaWYgdmVyZmlsZXM6CisgICAgICAgICAgICB2ZXJmaWxlcy5zb3J0KCkKKyAgICAgICAgICAgIGRpc3RuYW1lID0gJ3NsYWNrd2FyZScKKyAgICAgICAgICAgIHZlcnNpb24gPSB2ZXJmaWxlc1stMV1bMTQ6XQorICAgICAgICAgICAgcmV0dXJuIGRpc3RuYW1lLHZlcnNpb24saWQKKworICAgIHJldHVybiBkaXN0bmFtZSx2ZXJzaW9uLGlkCisKK19yZWxlYXNlX2ZpbGVuYW1lID0gcmUuY29tcGlsZShyJyhcdyspWy1fXShyZWxlYXNlfHZlcnNpb24pJykKK19sc2JfcmVsZWFzZV92ZXJzaW9uID0gcmUuY29tcGlsZShyJyguKyknCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgcmVsZWFzZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoW1xkLl0rKScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1teKF0qKD86XCgoLispXCkpPycpCitfcmVsZWFzZV92ZXJzaW9uID0gcmUuY29tcGlsZShyJyhbXjAtOV0rKScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKD86IHJlbGVhc2UgKT8nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhbXGQuXSspJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbXihdKig/OlwoKC4rKVwpKT8nKQorCisjIFNlZSBhbHNvIGh0dHA6Ly93d3cubm92ZWxsLmNvbS9jb29sc29sdXRpb25zL2ZlYXR1cmUvMTEyNTEuaHRtbAorIyBhbmQgaHR0cDovL2xpbnV4bWFmaWEuY29tL2ZhcS9BZG1pbi9yZWxlYXNlLWZpbGVzLmh0bWwKKyMgYW5kIGh0dHA6Ly9kYXRhLmxpbnV4LW50ZnMub3JnL3JwbS93aGljaHJwbQorIyBhbmQgaHR0cDovL3d3dy5kaWUubmV0L2RvYy9saW51eC9tYW4vbWFuMS9sc2JfcmVsZWFzZS4xLmh0bWwKKworX3N1cHBvcnRlZF9kaXN0cyA9ICgKKyAgICAnU3VTRScsICdkZWJpYW4nLCAnZmVkb3JhJywgJ3JlZGhhdCcsICdjZW50b3MnLAorICAgICdtYW5kcmFrZScsICdtYW5kcml2YScsICdyb2NrcycsICdzbGFja3dhcmUnLCAneWVsbG93ZG9nJywgJ2dlbnRvbycsCisgICAgJ1VuaXRlZExpbnV4JywgJ3R1cmJvbGludXgnKQorCitkZWYgX3BhcnNlX3JlbGVhc2VfZmlsZShmaXJzdGxpbmUpOgorCisgICAgIyBEZWZhdWx0IHRvIGVtcHR5ICd2ZXJzaW9uJyBhbmQgJ2lkJyBzdHJpbmdzLiAgQm90aCBkZWZhdWx0cyBhcmUgdXNlZAorICAgICMgd2hlbiAnZmlyc3RsaW5lJyBpcyBlbXB0eS4gICdpZCcgZGVmYXVsdHMgdG8gZW1wdHkgd2hlbiBhbiBpZCBjYW4gbm90CisgICAgIyBiZSBkZWR1Y2VkLgorICAgIHZlcnNpb24gPSAnJworICAgIGlkID0gJycKKworICAgICMgUGFyc2UgdGhlIGZpcnN0IGxpbmUKKyAgICBtID0gX2xzYl9yZWxlYXNlX3ZlcnNpb24ubWF0Y2goZmlyc3RsaW5lKQorICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgICMgTFNCIGZvcm1hdDogImRpc3RybyByZWxlYXNlIHgueCAoY29kZW5hbWUpIgorICAgICAgICByZXR1cm4gdHVwbGUobS5ncm91cHMoKSkKKworICAgICMgUHJlLUxTQiBmb3JtYXQ6ICJkaXN0cm8geC54IChjb2RlbmFtZSkiCisgICAgbSA9IF9yZWxlYXNlX3ZlcnNpb24ubWF0Y2goZmlyc3RsaW5lKQorICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiB0dXBsZShtLmdyb3VwcygpKQorCisgICAgIyBVbmtvd24gZm9ybWF0Li4uIHRha2UgdGhlIGZpcnN0IHR3byB3b3JkcworICAgIGwgPSBzdHJpbmcuc3BsaXQoc3RyaW5nLnN0cmlwKGZpcnN0bGluZSkpCisgICAgaWYgbDoKKyAgICAgICAgdmVyc2lvbiA9IGxbMF0KKyAgICAgICAgaWYgbGVuKGwpID4gMToKKyAgICAgICAgICAgIGlkID0gbFsxXQorICAgIHJldHVybiAnJywgdmVyc2lvbiwgaWQKKworZGVmIGxpbnV4X2Rpc3RyaWJ1dGlvbihkaXN0bmFtZT0nJywgdmVyc2lvbj0nJywgaWQ9JycsCisKKyAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkX2Rpc3RzPV9zdXBwb3J0ZWRfZGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfZGlzdHJpYnV0aW9uX25hbWU9MSk6CisKKyAgICAiIiIgVHJpZXMgdG8gZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBMaW51eCBPUyBkaXN0cmlidXRpb24gbmFtZS4KKworICAgICAgICBUaGUgZnVuY3Rpb24gZmlyc3QgbG9va3MgZm9yIGEgZGlzdHJpYnV0aW9uIHJlbGVhc2UgZmlsZSBpbgorICAgICAgICAvZXRjIGFuZCB0aGVuIHJldmVydHMgdG8gX2Rpc3RfdHJ5X2hhcmRlcigpIGluIGNhc2Ugbm8KKyAgICAgICAgc3VpdGFibGUgZmlsZXMgYXJlIGZvdW5kLgorCisgICAgICAgIHN1cHBvcnRlZF9kaXN0cyBtYXkgYmUgZ2l2ZW4gdG8gZGVmaW5lIHRoZSBzZXQgb2YgTGludXgKKyAgICAgICAgZGlzdHJpYnV0aW9ucyB0byBsb29rIGZvci4gSXQgZGVmYXVsdHMgdG8gYSBsaXN0IG9mIGN1cnJlbnRseQorICAgICAgICBzdXBwb3J0ZWQgTGludXggZGlzdHJpYnV0aW9ucyBpZGVudGlmaWVkIGJ5IHRoZWlyIHJlbGVhc2UgZmlsZQorICAgICAgICBuYW1lLgorCisgICAgICAgIElmIGZ1bGxfZGlzdHJpYnV0aW9uX25hbWUgaXMgdHJ1ZSAoZGVmYXVsdCksIHRoZSBmdWxsCisgICAgICAgIGRpc3RyaWJ1dGlvbiByZWFkIGZyb20gdGhlIE9TIGlzIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIHNob3J0CisgICAgICAgIG5hbWUgdGFrZW4gZnJvbSBzdXBwb3J0ZWRfZGlzdHMgaXMgdXNlZC4KKworICAgICAgICBSZXR1cm5zIGEgdHVwbGUgKGRpc3RuYW1lLHZlcnNpb24saWQpIHdoaWNoIGRlZmF1bHQgdG8gdGhlCisgICAgICAgIGFyZ3MgZ2l2ZW4gYXMgcGFyYW1ldGVycy4KKworICAgICIiIgorICAgIHRyeToKKyAgICAgICAgZXRjID0gb3MubGlzdGRpcignL2V0YycpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAjIFByb2JhYmx5IG5vdCBhIFVuaXggc3lzdGVtCisgICAgICAgIHJldHVybiBkaXN0bmFtZSx2ZXJzaW9uLGlkCisgICAgZXRjLnNvcnQoKQorICAgIGZvciBmaWxlIGluIGV0YzoKKyAgICAgICAgbSA9IF9yZWxlYXNlX2ZpbGVuYW1lLm1hdGNoKGZpbGUpCisgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfZGlzdG5hbWUsZHVtbXkgPSBtLmdyb3VwcygpCisgICAgICAgICAgICBpZiBfZGlzdG5hbWUgaW4gc3VwcG9ydGVkX2Rpc3RzOgorICAgICAgICAgICAgICAgIGRpc3RuYW1lID0gX2Rpc3RuYW1lCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gX2Rpc3RfdHJ5X2hhcmRlcihkaXN0bmFtZSx2ZXJzaW9uLGlkKQorCisgICAgIyBSZWFkIHRoZSBmaXJzdCBsaW5lCisgICAgZiA9IG9wZW4oJy9ldGMvJytmaWxlLCAncicpCisgICAgZmlyc3RsaW5lID0gZi5yZWFkbGluZSgpCisgICAgZi5jbG9zZSgpCisgICAgX2Rpc3RuYW1lLCBfdmVyc2lvbiwgX2lkID0gX3BhcnNlX3JlbGVhc2VfZmlsZShmaXJzdGxpbmUpCisKKyAgICBpZiBfZGlzdG5hbWUgYW5kIGZ1bGxfZGlzdHJpYnV0aW9uX25hbWU6CisgICAgICAgIGRpc3RuYW1lID0gX2Rpc3RuYW1lCisgICAgaWYgX3ZlcnNpb246CisgICAgICAgIHZlcnNpb24gPSBfdmVyc2lvbgorICAgIGlmIF9pZDoKKyAgICAgICAgaWQgPSBfaWQKKyAgICByZXR1cm4gZGlzdG5hbWUsIHZlcnNpb24sIGlkCisKKyMgVG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHk6CisKK2RlZiBkaXN0KGRpc3RuYW1lPScnLHZlcnNpb249JycsaWQ9JycsCisKKyAgICAgICAgIHN1cHBvcnRlZF9kaXN0cz1fc3VwcG9ydGVkX2Rpc3RzKToKKworICAgICIiIiBUcmllcyB0byBkZXRlcm1pbmUgdGhlIG5hbWUgb2YgdGhlIExpbnV4IE9TIGRpc3RyaWJ1dGlvbiBuYW1lLgorCisgICAgICAgIFRoZSBmdW5jdGlvbiBmaXJzdCBsb29rcyBmb3IgYSBkaXN0cmlidXRpb24gcmVsZWFzZSBmaWxlIGluCisgICAgICAgIC9ldGMgYW5kIHRoZW4gcmV2ZXJ0cyB0byBfZGlzdF90cnlfaGFyZGVyKCkgaW4gY2FzZSBubworICAgICAgICBzdWl0YWJsZSBmaWxlcyBhcmUgZm91bmQuCisKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIChkaXN0bmFtZSx2ZXJzaW9uLGlkKSB3aGljaCBkZWZhdWx0IHRvIHRoZQorICAgICAgICBhcmdzIGdpdmVuIGFzIHBhcmFtZXRlcnMuCisKKyAgICAiIiIKKyAgICByZXR1cm4gbGludXhfZGlzdHJpYnV0aW9uKGRpc3RuYW1lLCB2ZXJzaW9uLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZF9kaXN0cz1zdXBwb3J0ZWRfZGlzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX2Rpc3RyaWJ1dGlvbl9uYW1lPTApCisKK2NsYXNzIF9wb3BlbjoKKworICAgICIiIiBGYWlybHkgcG9ydGFibGUgKGFsdGVybmF0aXZlKSBwb3BlbiBpbXBsZW1lbnRhdGlvbi4KKworICAgICAgICBUaGlzIGlzIG1vc3RseSBuZWVkZWQgaW4gY2FzZSBvcy5wb3BlbigpIGlzIG5vdCBhdmFpbGFibGUsIG9yCisgICAgICAgIGRvZXNuJ3Qgd29yayBhcyBhZHZlcnRpc2VkLCBlLmcuIGluIFdpbjlYIEdVSSBwcm9ncmFtcyBsaWtlCisgICAgICAgIFB5dGhvbldpbiBvciBJRExFLgorCisgICAgICAgIFdyaXRpbmcgdG8gdGhlIHBpcGUgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuCisKKyAgICAiIiIKKyAgICB0bXBmaWxlID0gJycKKyAgICBwaXBlID0gTm9uZQorICAgIGJ1ZnNpemUgPSBOb25lCisgICAgbW9kZSA9ICdyJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsY21kLG1vZGU9J3InLGJ1ZnNpemU9Tm9uZSk6CisKKyAgICAgICAgaWYgbW9kZSAhPSAncic6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCdwb3BlbigpLWVtdWxhdGlvbiBvbmx5IHN1cHBvcnRzIHJlYWQgbW9kZScKKyAgICAgICAgaW1wb3J0IHRlbXBmaWxlCisgICAgICAgIHNlbGYudG1wZmlsZSA9IHRtcGZpbGUgPSB0ZW1wZmlsZS5ta3RlbXAoKQorICAgICAgICBvcy5zeXN0ZW0oY21kICsgJyA+ICVzJyAlIHRtcGZpbGUpCisgICAgICAgIHNlbGYucGlwZSA9IG9wZW4odG1wZmlsZSwncmInKQorICAgICAgICBzZWxmLmJ1ZnNpemUgPSBidWZzaXplCisgICAgICAgIHNlbGYubW9kZSA9IG1vZGUKKworICAgIGRlZiByZWFkKHNlbGYpOgorCisgICAgICAgIHJldHVybiBzZWxmLnBpcGUucmVhZCgpCisKKyAgICBkZWYgcmVhZGxpbmVzKHNlbGYpOgorCisgICAgICAgIGlmIHNlbGYuYnVmc2l6ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBpcGUucmVhZGxpbmVzKCkKKworICAgIGRlZiBjbG9zZShzZWxmLAorCisgICAgICAgICAgICAgIHJlbW92ZT1vcy51bmxpbmssZXJyb3I9b3MuZXJyb3IpOgorCisgICAgICAgIGlmIHNlbGYucGlwZToKKyAgICAgICAgICAgIHJjID0gc2VsZi5waXBlLmNsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJjID0gMjU1CisgICAgICAgIGlmIHNlbGYudG1wZmlsZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZW1vdmUoc2VsZi50bXBmaWxlKQorICAgICAgICAgICAgZXhjZXB0IGVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIHJjCisKKyAgICAjIEFsaWFzCisgICAgX19kZWxfXyA9IGNsb3NlCisKK2RlZiBwb3BlbihjbWQsIG1vZGU9J3InLCBidWZzaXplPU5vbmUpOgorCisgICAgIiIiIFBvcnRhYmxlIHBvcGVuKCkgaW50ZXJmYWNlLgorICAgICIiIgorICAgICMgRmluZCBhIHdvcmtpbmcgcG9wZW4gaW1wbGVtZW50YXRpb24gcHJlZmVycmluZyB3aW4zMnBpcGUucG9wZW4KKyAgICAjIG92ZXIgb3MucG9wZW4gb3ZlciBfcG9wZW4KKyAgICBwb3BlbiA9IE5vbmUKKyAgICBpZiBvcy5lbnZpcm9uLmdldCgnT1MnLCcnKSA9PSAnV2luZG93c19OVCc6CisgICAgICAgICMgT24gTlQgd2luMzJwaXBlIHNob3VsZCB3b3JrOyBvbiBXaW45eCBpdCBoYW5ncyBkdWUgdG8gYnVncworICAgICAgICAjIGluIHRoZSBNUyBDIGxpYiAoc2VlIE1TIEtub3dsZWRnZUJhc2UgYXJ0aWNsZSBRMTUwOTU2KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgd2luMzJwaXBlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBvcGVuID0gd2luMzJwaXBlLnBvcGVuCisgICAgaWYgcG9wZW4gaXMgTm9uZToKKyAgICAgICAgaWYgaGFzYXR0cihvcywncG9wZW4nKToKKyAgICAgICAgICAgIHBvcGVuID0gb3MucG9wZW4KKyAgICAgICAgICAgICMgQ2hlY2sgd2hldGhlciBpdCB3b3Jrcy4uLiBpdCBkb2Vzbid0IGluIEdVSSBwcm9ncmFtcworICAgICAgICAgICAgIyBvbiBXaW5kb3dzIHBsYXRmb3JtcworICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6ICMgWFhYIE90aGVycyB0b28gPworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcG9wZW4oJycpCisgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgICAgICBwb3BlbiA9IF9wb3BlbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcG9wZW4gPSBfcG9wZW4KKyAgICBpZiBidWZzaXplIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBwb3BlbihjbWQsbW9kZSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcG9wZW4oY21kLG1vZGUsYnVmc2l6ZSkKKworZGVmIF9ub3JtX3ZlcnNpb24odmVyc2lvbiwgYnVpbGQ9JycpOgorCisgICAgIiIiIE5vcm1hbGl6ZSB0aGUgdmVyc2lvbiBhbmQgYnVpbGQgc3RyaW5ncyBhbmQgcmV0dXJuIGEgc2luZ2xlCisgICAgICAgIHZlcnNpb24gc3RyaW5nIHVzaW5nIHRoZSBmb3JtYXQgbWFqb3IubWlub3IuYnVpbGQgKG9yIHBhdGNobGV2ZWwpLgorICAgICIiIgorICAgIGwgPSBzdHJpbmcuc3BsaXQodmVyc2lvbiwnLicpCisgICAgaWYgYnVpbGQ6CisgICAgICAgIGwuYXBwZW5kKGJ1aWxkKQorICAgIHRyeToKKyAgICAgICAgaW50cyA9IG1hcChpbnQsbCkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgc3RyaW5ncyA9IGwKKyAgICBlbHNlOgorICAgICAgICBzdHJpbmdzID0gbWFwKHN0cixpbnRzKQorICAgIHZlcnNpb24gPSBzdHJpbmcuam9pbihzdHJpbmdzWzozXSwnLicpCisgICAgcmV0dXJuIHZlcnNpb24KKworX3Zlcl9vdXRwdXQgPSByZS5jb21waWxlKHInKD86KFtcdyBdKykgKFtcdy5dKykgJworICAgICAgICAgICAgICAgICAgICAgICAgICcuKicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXFsuKiAoW1xkLl0rKVxdKScpCisKKyMgRXhhbXBsZXMgb2YgVkVSIGNvbW1hbmQgb3V0cHV0OgorIworIyAgIFdpbmRvd3MgMjAwMDogIE1pY3Jvc29mdCBXaW5kb3dzIDIwMDAgW1ZlcnNpb24gNS4wMC4yMTk1XQorIyAgIFdpbmRvd3MgWFA6ICAgIE1pY3Jvc29mdCBXaW5kb3dzIFhQIFtWZXJzaW9uIDUuMS4yNjAwXQorIyAgIFdpbmRvd3MgVmlzdGE6IE1pY3Jvc29mdCBXaW5kb3dzIFtWZXJzaW9uIDYuMC42MDAyXQorIworIyBOb3RlIHRoYXQgdGhlICJWZXJzaW9uIiBzdHJpbmcgZ2V0cyBsb2NhbGl6ZWQgb24gZGlmZmVyZW50CisjIFdpbmRvd3MgdmVyc2lvbnMuCisKK2RlZiBfc3lzY21kX3ZlcihzeXN0ZW09JycsIHJlbGVhc2U9JycsIHZlcnNpb249JycsCisKKyAgICAgICAgICAgICAgIHN1cHBvcnRlZF9wbGF0Zm9ybXM9KCd3aW4zMicsJ3dpbjE2JywnZG9zJywnb3MyJykpOgorCisgICAgIiIiIFRyaWVzIHRvIGZpZ3VyZSBvdXQgdGhlIE9TIHZlcnNpb24gdXNlZCBhbmQgcmV0dXJucworICAgICAgICBhIHR1cGxlIChzeXN0ZW0scmVsZWFzZSx2ZXJzaW9uKS4KKworICAgICAgICBJdCB1c2VzIHRoZSAidmVyIiBzaGVsbCBjb21tYW5kIGZvciB0aGlzIHdoaWNoIGlzIGtub3duCisgICAgICAgIHRvIGV4aXN0cyBvbiBXaW5kb3dzLCBET1MgYW5kIE9TLzIuIFhYWCBPdGhlcnMgdG9vID8KKworICAgICAgICBJbiBjYXNlIHRoaXMgZmFpbHMsIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIGFyZSB1c2VkIGFzCisgICAgICAgIGRlZmF1bHRzLgorCisgICAgIiIiCisgICAgaWYgc3lzLnBsYXRmb3JtIG5vdCBpbiBzdXBwb3J0ZWRfcGxhdGZvcm1zOgorICAgICAgICByZXR1cm4gc3lzdGVtLHJlbGVhc2UsdmVyc2lvbgorCisgICAgIyBUcnkgc29tZSBjb21tb24gY21kIHN0cmluZ3MKKyAgICBmb3IgY21kIGluICgndmVyJywnY29tbWFuZCAvYyB2ZXInLCdjbWQgL2MgdmVyJyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBpcGUgPSBwb3BlbihjbWQpCisgICAgICAgICAgICBpbmZvID0gcGlwZS5yZWFkKCkKKyAgICAgICAgICAgIGlmIHBpcGUuY2xvc2UoKToKKyAgICAgICAgICAgICAgICByYWlzZSBvcy5lcnJvciwnY29tbWFuZCBmYWlsZWQnCisgICAgICAgICAgICAjIFhYWCBIb3cgY2FuIEkgc3VwcHJlc3Mgc2hlbGwgZXJyb3JzIGZyb20gYmVpbmcgd3JpdHRlbgorICAgICAgICAgICAgIyAgICAgdG8gc3RkZXJyID8KKyAgICAgICAgZXhjZXB0IG9zLmVycm9yLHdoeToKKyAgICAgICAgICAgICNwcmludCAnQ29tbWFuZCAlcyBmYWlsZWQ6ICVzJyAlIChjbWQsd2h5KQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZXhjZXB0IElPRXJyb3Isd2h5OgorICAgICAgICAgICAgI3ByaW50ICdDb21tYW5kICVzIGZhaWxlZDogJXMnICUgKGNtZCx3aHkpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gc3lzdGVtLHJlbGVhc2UsdmVyc2lvbgorCisgICAgIyBQYXJzZSB0aGUgb3V0cHV0CisgICAgaW5mbyA9IHN0cmluZy5zdHJpcChpbmZvKQorICAgIG0gPSBfdmVyX291dHB1dC5tYXRjaChpbmZvKQorICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgIHN5c3RlbSxyZWxlYXNlLHZlcnNpb24gPSBtLmdyb3VwcygpCisgICAgICAgICMgU3RyaXAgdHJhaWxpbmcgZG90cyBmcm9tIHZlcnNpb24gYW5kIHJlbGVhc2UKKyAgICAgICAgaWYgcmVsZWFzZVstMV0gPT0gJy4nOgorICAgICAgICAgICAgcmVsZWFzZSA9IHJlbGVhc2VbOi0xXQorICAgICAgICBpZiB2ZXJzaW9uWy0xXSA9PSAnLic6CisgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbls6LTFdCisgICAgICAgICMgTm9ybWFsaXplIHRoZSB2ZXJzaW9uIGFuZCBidWlsZCBzdHJpbmdzIChlbGltaW5hdGluZyBhZGRpdGlvbmFsCisgICAgICAgICMgemVyb3MpCisgICAgICAgIHZlcnNpb24gPSBfbm9ybV92ZXJzaW9uKHZlcnNpb24pCisgICAgcmV0dXJuIHN5c3RlbSxyZWxlYXNlLHZlcnNpb24KKworZGVmIF93aW4zMl9nZXR2YWx1ZShrZXksbmFtZSxkZWZhdWx0PScnKToKKworICAgICIiIiBSZWFkIGEgdmFsdWUgZm9yIG5hbWUgZnJvbSB0aGUgcmVnaXN0cnkga2V5LgorCisgICAgICAgIEluIGNhc2UgdGhpcyBmYWlscywgZGVmYXVsdCBpcyByZXR1cm5lZC4KKworICAgICIiIgorICAgIHRyeToKKyAgICAgICAgIyBVc2Ugd2luMzJhcGkgaWYgYXZhaWxhYmxlCisgICAgICAgIGZyb20gd2luMzJhcGkgaW1wb3J0IFJlZ1F1ZXJ5VmFsdWVFeAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgIyBPbiBQeXRob24gMi4wIGFuZCBsYXRlciwgZW11bGF0ZSB1c2luZyBfd2lucmVnCisgICAgICAgIGltcG9ydCBfd2lucmVnCisgICAgICAgIFJlZ1F1ZXJ5VmFsdWVFeCA9IF93aW5yZWcuUXVlcnlWYWx1ZUV4CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gUmVnUXVlcnlWYWx1ZUV4KGtleSxuYW1lKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworZGVmIHdpbjMyX3ZlcihyZWxlYXNlPScnLHZlcnNpb249JycsY3NkPScnLHB0eXBlPScnKToKKworICAgICIiIiBHZXQgYWRkaXRpb25hbCB2ZXJzaW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIFdpbmRvd3MgUmVnaXN0cnkKKyAgICAgICAgYW5kIHJldHVybiBhIHR1cGxlICh2ZXJzaW9uLGNzZCxwdHlwZSkgcmVmZXJyaW5nIHRvIHZlcnNpb24KKyAgICAgICAgbnVtYmVyLCBDU0QgbGV2ZWwgKHNlcnZpY2UgcGFjayksIGFuZCBPUyB0eXBlIChtdWx0aS9zaW5nbGUKKyAgICAgICAgcHJvY2Vzc29yKS4KKworICAgICAgICBBcyBhIGhpbnQ6IHB0eXBlIHJldHVybnMgJ1VuaXByb2Nlc3NvciBGcmVlJyBvbiBzaW5nbGUKKyAgICAgICAgcHJvY2Vzc29yIE5UIG1hY2hpbmVzIGFuZCAnTXVsdGlwcm9jZXNzb3IgRnJlZScgb24gbXVsdGkKKyAgICAgICAgcHJvY2Vzc29yIG1hY2hpbmVzLiBUaGUgJ0ZyZWUnIHJlZmVycyB0byB0aGUgT1MgdmVyc2lvbiBiZWluZworICAgICAgICBmcmVlIG9mIGRlYnVnZ2luZyBjb2RlLiBJdCBjb3VsZCBhbHNvIHN0YXRlICdDaGVja2VkJyB3aGljaAorICAgICAgICBtZWFucyB0aGUgT1MgdmVyc2lvbiB1c2VzIGRlYnVnZ2luZyBjb2RlLCBpLmUuIGNvZGUgdGhhdAorICAgICAgICBjaGVja3MgYXJndW1lbnRzLCByYW5nZXMsIGV0Yy4gKFRob21hcyBIZWxsZXIpLgorCisgICAgICAgIE5vdGU6IHRoaXMgZnVuY3Rpb24gd29ya3MgYmVzdCB3aXRoIE1hcmsgSGFtbW9uZCdzIHdpbjMyCisgICAgICAgIHBhY2thZ2UgaW5zdGFsbGVkLCBidXQgYWxzbyBvbiBQeXRob24gMi4zIGFuZCBsYXRlci4gSXQKKyAgICAgICAgb2J2aW91c2x5IG9ubHkgcnVucyBvbiBXaW4zMiBjb21wYXRpYmxlIHBsYXRmb3Jtcy4KKworICAgICIiIgorICAgICMgWFhYIElzIHRoZXJlIGFueSB3YXkgdG8gZmluZCBvdXQgdGhlIHByb2Nlc3NvciB0eXBlIG9uIFdpblhYID8KKyAgICAjIFhYWCBJcyB3aW4zMiBhdmFpbGFibGUgb24gV2luZG93cyBDRSA/CisgICAgIworICAgICMgQWRhcHRlZCBmcm9tIGNvZGUgcG9zdGVkIGJ5IEthcmwgUHV0bGFuZCB0byBjb21wLmxhbmcucHl0aG9uLgorICAgICMKKyAgICAjIFRoZSBtYXBwaW5ncyBiZXR3ZWVuIHJlZy4gdmFsdWVzIGFuZCByZWxlYXNlIG5hbWVzIGNhbiBiZSBmb3VuZAorICAgICMgaGVyZTogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2VuLXVzL3N5c2luZm8vYmFzZS9vc3ZlcnNpb25pbmZvX3N0ci5hc3AKKworICAgICMgSW1wb3J0IHRoZSBuZWVkZWQgQVBJcworICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHdpbjMyYXBpCisgICAgICAgIGZyb20gd2luMzJhcGkgaW1wb3J0IFJlZ1F1ZXJ5VmFsdWVFeCwgUmVnT3BlbktleUV4LCBcCisgICAgICAgICAgICAgUmVnQ2xvc2VLZXksIEdldFZlcnNpb25FeAorICAgICAgICBmcm9tIHdpbjMyY29uIGltcG9ydCBIS0VZX0xPQ0FMX01BQ0hJTkUsIFZFUl9QTEFURk9STV9XSU4zMl9OVCwgXAorICAgICAgICAgICAgIFZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTLCBWRVJfTlRfV09SS1NUQVRJT04KKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICMgRW11bGF0ZSB0aGUgd2luMzJhcGkgbW9kdWxlIHVzaW5nIFB5dGhvbiBBUElzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5nZXR3aW5kb3dzdmVyc2lvbgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAjIE5vIGVtdWxhdGlvbiBwb3NzaWJsZSwgc28gcmV0dXJuIHRoZSBkZWZhdWx0cy4uLgorICAgICAgICAgICAgcmV0dXJuIHJlbGVhc2UsdmVyc2lvbixjc2QscHR5cGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgRW11bGF0aW9uIHVzaW5nIF93aW5yZWcgKGFkZGVkIGluIFB5dGhvbiAyLjApIGFuZAorICAgICAgICAgICAgIyBzeXMuZ2V0d2luZG93c3ZlcnNpb24oKSAoYWRkZWQgaW4gUHl0aG9uIDIuMykKKyAgICAgICAgICAgIGltcG9ydCBfd2lucmVnCisgICAgICAgICAgICBHZXRWZXJzaW9uRXggPSBzeXMuZ2V0d2luZG93c3ZlcnNpb24KKyAgICAgICAgICAgIFJlZ1F1ZXJ5VmFsdWVFeCA9IF93aW5yZWcuUXVlcnlWYWx1ZUV4CisgICAgICAgICAgICBSZWdPcGVuS2V5RXggPSBfd2lucmVnLk9wZW5LZXlFeAorICAgICAgICAgICAgUmVnQ2xvc2VLZXkgPSBfd2lucmVnLkNsb3NlS2V5CisgICAgICAgICAgICBIS0VZX0xPQ0FMX01BQ0hJTkUgPSBfd2lucmVnLkhLRVlfTE9DQUxfTUFDSElORQorICAgICAgICAgICAgVkVSX1BMQVRGT1JNX1dJTjMyX1dJTkRPV1MgPSAxCisgICAgICAgICAgICBWRVJfUExBVEZPUk1fV0lOMzJfTlQgPSAyCisgICAgICAgICAgICBWRVJfTlRfV09SS1NUQVRJT04gPSAxCisgICAgICAgICAgICBWRVJfTlRfU0VSVkVSID0gMworICAgICAgICAgICAgUkVHX1NaID0gMQorCisgICAgIyBGaW5kIG91dCB0aGUgcmVnaXN0cnkga2V5IGFuZCBzb21lIGdlbmVyYWwgdmVyc2lvbiBpbmZvcworICAgIHdpbnZlciA9IEdldFZlcnNpb25FeCgpCisgICAgbWFqLG1pbixidWlsZG5vLHBsYXQsY3NkID0gd2ludmVyCisgICAgdmVyc2lvbiA9ICclaS4laS4laScgJSAobWFqLG1pbixidWlsZG5vICYgMHhGRkZGKQorICAgIGlmIGhhc2F0dHIod2ludmVyLCAic2VydmljZV9wYWNrIik6CisgICAgICAgIGlmIHdpbnZlci5zZXJ2aWNlX3BhY2sgIT0gIiI6CisgICAgICAgICAgICBjc2QgPSAnU1AlcycgJSB3aW52ZXIuc2VydmljZV9wYWNrX21ham9yCisgICAgZWxzZToKKyAgICAgICAgaWYgY3NkWzoxM10gPT0gJ1NlcnZpY2UgUGFjayAnOgorICAgICAgICAgICAgY3NkID0gJ1NQJyArIGNzZFsxMzpdCisKKyAgICBpZiBwbGF0ID09IFZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTOgorICAgICAgICByZWdrZXkgPSAnU09GVFdBUkVcXE1pY3Jvc29mdFxcV2luZG93c1xcQ3VycmVudFZlcnNpb24nCisgICAgICAgICMgVHJ5IHRvIGd1ZXNzIHRoZSByZWxlYXNlIG5hbWUKKyAgICAgICAgaWYgbWFqID09IDQ6CisgICAgICAgICAgICBpZiBtaW4gPT0gMDoKKyAgICAgICAgICAgICAgICByZWxlYXNlID0gJzk1JworICAgICAgICAgICAgZWxpZiBtaW4gPT0gMTA6CisgICAgICAgICAgICAgICAgcmVsZWFzZSA9ICc5OCcKKyAgICAgICAgICAgIGVsaWYgbWluID09IDkwOgorICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAnTWUnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAncG9zdE1lJworICAgICAgICBlbGlmIG1haiA9PSA1OgorICAgICAgICAgICAgcmVsZWFzZSA9ICcyMDAwJworCisgICAgZWxpZiBwbGF0ID09IFZFUl9QTEFURk9STV9XSU4zMl9OVDoKKyAgICAgICAgcmVna2V5ID0gJ1NPRlRXQVJFXFxNaWNyb3NvZnRcXFdpbmRvd3MgTlRcXEN1cnJlbnRWZXJzaW9uJworICAgICAgICBpZiBtYWogPD0gNDoKKyAgICAgICAgICAgIHJlbGVhc2UgPSAnTlQnCisgICAgICAgIGVsaWYgbWFqID09IDU6CisgICAgICAgICAgICBpZiBtaW4gPT0gMDoKKyAgICAgICAgICAgICAgICByZWxlYXNlID0gJzIwMDAnCisgICAgICAgICAgICBlbGlmIG1pbiA9PSAxOgorICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAnWFAnCisgICAgICAgICAgICBlbGlmIG1pbiA9PSAyOgorICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAnMjAwM1NlcnZlcicKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVsZWFzZSA9ICdwb3N0MjAwMycKKyAgICAgICAgZWxpZiBtYWogPT0gNjoKKyAgICAgICAgICAgIGlmIGhhc2F0dHIod2ludmVyLCAicHJvZHVjdF90eXBlIik6CisgICAgICAgICAgICAgICAgcHJvZHVjdF90eXBlID0gd2ludmVyLnByb2R1Y3RfdHlwZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcm9kdWN0X3R5cGUgPSBWRVJfTlRfV09SS1NUQVRJT04KKyAgICAgICAgICAgICAgICAjIFdpdGhvdXQgYW4gT1NWRVJTSU9OSU5GT0VYIGNhcGFibGUgc3lzLmdldHdpbmRvd3N2ZXJzaW9uKCksCisgICAgICAgICAgICAgICAgIyBvciBoZWxwIGZyb20gdGhlIHJlZ2lzdHJ5LCB3ZSBjYW5ub3QgcHJvcGVybHkgaWRlbnRpZnkKKyAgICAgICAgICAgICAgICAjIG5vbi13b3Jrc3RhdGlvbiB2ZXJzaW9ucy4KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGtleSA9IFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsIHJlZ2tleSkKKyAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHlwZSA9IFJlZ1F1ZXJ5VmFsdWVFeChrZXksICJQcm9kdWN0TmFtZSIpCisgICAgICAgICAgICAgICAgICAgICMgRGlzY2FyZCBhbnkgdHlwZSB0aGF0IGlzbid0IFJFR19TWgorICAgICAgICAgICAgICAgICAgICBpZiB0eXBlID09IFJFR19TWiBhbmQgbmFtZS5maW5kKCJTZXJ2ZXIiKSAhPSAtMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RfdHlwZSA9IFZFUl9OVF9TRVJWRVIKKyAgICAgICAgICAgICAgICBleGNlcHQgV2luZG93c0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAjIFVzZSBkZWZhdWx0IG9mIFZFUl9OVF9XT1JLU1RBVElPTgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGlmIG1pbiA9PSAwOgorICAgICAgICAgICAgICAgIGlmIHByb2R1Y3RfdHlwZSA9PSBWRVJfTlRfV09SS1NUQVRJT046CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAnVmlzdGEnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9ICcyMDA4U2VydmVyJworICAgICAgICAgICAgZWxpZiBtaW4gPT0gMToKKyAgICAgICAgICAgICAgICBpZiBwcm9kdWN0X3R5cGUgPT0gVkVSX05UX1dPUktTVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0gJzcnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9ICcyMDA4U2VydmVyUjInCisgICAgICAgICAgICBlbGlmIG1pbiA9PSAyOgorICAgICAgICAgICAgICAgIGlmIHByb2R1Y3RfdHlwZSA9PSBWRVJfTlRfV09SS1NUQVRJT046CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAnOCcKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0gJzIwMTJTZXJ2ZXInCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAncG9zdDIwMTJTZXJ2ZXInCisKKyAgICBlbHNlOgorICAgICAgICBpZiBub3QgcmVsZWFzZToKKyAgICAgICAgICAgICMgRS5nLiBXaW4zLjEgd2l0aCB3aW4zMnMKKyAgICAgICAgICAgIHJlbGVhc2UgPSAnJWkuJWknICUgKG1haixtaW4pCisgICAgICAgIHJldHVybiByZWxlYXNlLHZlcnNpb24sY3NkLHB0eXBlCisKKyAgICAjIE9wZW4gdGhlIHJlZ2lzdHJ5IGtleQorICAgIHRyeToKKyAgICAgICAga2V5Q3VyVmVyID0gUmVnT3BlbktleUV4KEhLRVlfTE9DQUxfTUFDSElORSwgcmVna2V5KQorICAgICAgICAjIEdldCBhIHZhbHVlIHRvIG1ha2Ugc3VyZSB0aGUga2V5IGV4aXN0cy4uLgorICAgICAgICBSZWdRdWVyeVZhbHVlRXgoa2V5Q3VyVmVyLCAnU3lzdGVtUm9vdCcpCisgICAgZXhjZXB0OgorICAgICAgICByZXR1cm4gcmVsZWFzZSx2ZXJzaW9uLGNzZCxwdHlwZQorCisgICAgIyBQYXJzZSB2YWx1ZXMKKyAgICAjc3VidmVyc2lvbiA9IF93aW4zMl9nZXR2YWx1ZShrZXlDdXJWZXIsCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU3ViVmVyc2lvbk51bWJlcicsCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJycsMSkpWzBdCisgICAgI2lmIHN1YnZlcnNpb246CisgICAgIyAgIHJlbGVhc2UgPSByZWxlYXNlICsgc3VidmVyc2lvbiAjIDk1YSwgOTViLCBldGMuCisgICAgYnVpbGQgPSBfd2luMzJfZ2V0dmFsdWUoa2V5Q3VyVmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDdXJyZW50QnVpbGROdW1iZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnJywxKSlbMF0KKyAgICBwdHlwZSA9IF93aW4zMl9nZXR2YWx1ZShrZXlDdXJWZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3VycmVudFR5cGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0eXBlLDEpKVswXQorCisgICAgIyBOb3JtYWxpemUgdmVyc2lvbgorICAgIHZlcnNpb24gPSBfbm9ybV92ZXJzaW9uKHZlcnNpb24sYnVpbGQpCisKKyAgICAjIENsb3NlIGtleQorICAgIFJlZ0Nsb3NlS2V5KGtleUN1clZlcikKKyAgICByZXR1cm4gcmVsZWFzZSx2ZXJzaW9uLGNzZCxwdHlwZQorCitkZWYgX21hY192ZXJfbG9va3VwKHNlbGVjdG9ycyxkZWZhdWx0PU5vbmUpOgorCisgICAgZnJvbSBnZXN0YWx0IGltcG9ydCBnZXN0YWx0CisgICAgaW1wb3J0IE1hY09TCisgICAgbCA9IFtdCisgICAgYXBwZW5kID0gbC5hcHBlbmQKKyAgICBmb3Igc2VsZWN0b3IgaW4gc2VsZWN0b3JzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBhcHBlbmQoZ2VzdGFsdChzZWxlY3RvcikpCisgICAgICAgIGV4Y2VwdCAoUnVudGltZUVycm9yLCBNYWNPUy5FcnJvcik6CisgICAgICAgICAgICBhcHBlbmQoZGVmYXVsdCkKKyAgICByZXR1cm4gbAorCitkZWYgX2JjZDJzdHIoYmNkKToKKworICAgIHJldHVybiBoZXgoYmNkKVsyOl0KKworZGVmIF9tYWNfdmVyX2dlc3RhbHQoKToKKyAgICAiIiIKKyAgICAgICAgVGhhbmtzIHRvIE1hcmsgUi4gTGV2aW5zb24gZm9yIG1haWxpbmcgZG9jdW1lbnRhdGlvbiBsaW5rcyBhbmQKKyAgICAgICAgY29kZSBleGFtcGxlcyBmb3IgdGhpcyBmdW5jdGlvbi4gRG9jdW1lbnRhdGlvbiBmb3IgdGhlCisgICAgICAgIGdlc3RhbHQoKSBBUEkgaXMgYXZhaWxhYmxlIG9ubGluZSBhdDoKKworICAgICAgICAgICBodHRwOi8vd3d3LnJnYXJvcy5ubC9nZXN0YWx0LworICAgICIiIgorICAgICMgQ2hlY2sgd2hldGhlciB0aGUgdmVyc2lvbiBpbmZvIG1vZHVsZSBpcyBhdmFpbGFibGUKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBnZXN0YWx0CisgICAgICAgIGltcG9ydCBNYWNPUworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAjIEdldCB0aGUgaW5mb3MKKyAgICBzeXN2LHN5c2EgPSBfbWFjX3Zlcl9sb29rdXAoKCdzeXN2Jywnc3lzYScpKQorICAgICMgRGVjb2RlIHRoZSBpbmZvcworICAgIGlmIHN5c3Y6CisgICAgICAgIG1ham9yID0gKHN5c3YgJiAweEZGMDApID4+IDgKKyAgICAgICAgbWlub3IgPSAoc3lzdiAmIDB4MDBGMCkgPj4gNAorICAgICAgICBwYXRjaCA9IChzeXN2ICYgMHgwMDBGKQorCisgICAgICAgIGlmIChtYWpvciwgbWlub3IpID49ICgxMCwgNCk6CisgICAgICAgICAgICAjIHRoZSAnc3lzdicgZ2VzdGFsZCBjYW5ub3QgcmV0dXJuIHBhdGNobGV2ZWxzCisgICAgICAgICAgICAjIGhpZ2hlciB0aGFuIDkuIEFwcGxlIGludHJvZHVjZWQgMyBuZXcKKyAgICAgICAgICAgICMgZ2VzdGFsdCBjb2RlcyBpbiAxMC40IHRvIGRlYWwgd2l0aCB0aGlzCisgICAgICAgICAgICAjIGlzc3VlIChuZWVkZWQgYmVjYXVzZSBwYXRjaCBsZXZlbHMgY2FuCisgICAgICAgICAgICAjIHJ1biBoaWdoZXIgdGhhbiA5LCBzdWNoIGFzIDEwLjQuMTEpCisgICAgICAgICAgICBtYWpvcixtaW5vcixwYXRjaCA9IF9tYWNfdmVyX2xvb2t1cCgoJ3N5czEnLCdzeXMyJywnc3lzMycpKQorICAgICAgICAgICAgcmVsZWFzZSA9ICclaS4laS4laScgJShtYWpvciwgbWlub3IsIHBhdGNoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVsZWFzZSA9ICclcy4laS4laScgJSAoX2JjZDJzdHIobWFqb3IpLG1pbm9yLHBhdGNoKQorCisgICAgaWYgc3lzYToKKyAgICAgICAgbWFjaGluZSA9IHsweDE6ICc2OGsnLAorICAgICAgICAgICAgICAgICAgIDB4MjogJ1Bvd2VyUEMnLAorICAgICAgICAgICAgICAgICAgIDB4YTogJ2kzODYnfS5nZXQoc3lzYSwnJykKKworICAgIHZlcnNpb25pbmZvPSgnJywgJycsICcnKQorICAgIHJldHVybiByZWxlYXNlLHZlcnNpb25pbmZvLG1hY2hpbmUKKworZGVmIF9tYWNfdmVyX3htbCgpOgorICAgIGZuID0gJy9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtVmVyc2lvbi5wbGlzdCcKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZm4pOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgcGxpc3RsaWIKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBwbCA9IHBsaXN0bGliLnJlYWRQbGlzdChmbikKKyAgICByZWxlYXNlID0gcGxbJ1Byb2R1Y3RWZXJzaW9uJ10KKyAgICB2ZXJzaW9uaW5mbz0oJycsICcnLCAnJykKKyAgICBtYWNoaW5lID0gb3MudW5hbWUoKVs0XQorICAgIGlmIG1hY2hpbmUgaW4gKCdwcGMnLCAnUG93ZXIgTWFjaW50b3NoJyk6CisgICAgICAgICMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgZ2VzdGFsdCBiYXNlZCBjb2RlCisgICAgICAgIG1hY2hpbmUgPSAnUG93ZXJQQycKKworICAgIHJldHVybiByZWxlYXNlLHZlcnNpb25pbmZvLG1hY2hpbmUKKworCitkZWYgbWFjX3ZlcihyZWxlYXNlPScnLHZlcnNpb25pbmZvPSgnJywnJywnJyksbWFjaGluZT0nJyk6CisKKyAgICAiIiIgR2V0IE1hY09TIHZlcnNpb24gaW5mb3JtYXRpb24gYW5kIHJldHVybiBpdCBhcyB0dXBsZSAocmVsZWFzZSwKKyAgICAgICAgdmVyc2lvbmluZm8sIG1hY2hpbmUpIHdpdGggdmVyc2lvbmluZm8gYmVpbmcgYSB0dXBsZSAodmVyc2lvbiwKKyAgICAgICAgZGV2X3N0YWdlLCBub25fcmVsZWFzZV92ZXJzaW9uKS4KKworICAgICAgICBFbnRyaWVzIHdoaWNoIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGFyZSBzZXQgdG8gdGhlIHBhcmFtdGVyIHZhbHVlcworICAgICAgICB3aGljaCBkZWZhdWx0IHRvICcnLiBBbGwgdHVwbGUgZW50cmllcyBhcmUgc3RyaW5ncy4KKyAgICAiIiIKKworICAgICMgRmlyc3QgdHJ5IHJlYWRpbmcgdGhlIGluZm9ybWF0aW9uIGZyb20gYW4gWE1MIGZpbGUgd2hpY2ggc2hvdWxkCisgICAgIyBhbHdheXMgYmUgcHJlc2VudAorICAgIGluZm8gPSBfbWFjX3Zlcl94bWwoKQorICAgIGlmIGluZm8gaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBpbmZvCisKKyAgICAjIElmIHRoYXQgZG9lc24ndCB3b3JrIGZvciBzb21lIHJlYXNvbiBmYWxsIGJhY2sgdG8gcmVhZGluZyB0aGUKKyAgICAjIGluZm9ybWF0aW9uIHVzaW5nIGdlc3RhbHQgY2FsbHMuCisgICAgaW5mbyA9IF9tYWNfdmVyX2dlc3RhbHQoKQorICAgIGlmIGluZm8gaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBpbmZvCisKKyAgICAjIElmIHRoYXQgYWxzbyBkb2Vzbid0IHdvcmsgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlcworICAgIHJldHVybiByZWxlYXNlLHZlcnNpb25pbmZvLG1hY2hpbmUKKworZGVmIF9qYXZhX2dldHByb3AobmFtZSxkZWZhdWx0KToKKworICAgIGZyb20gamF2YS5sYW5nIGltcG9ydCBTeXN0ZW0KKyAgICB0cnk6CisgICAgICAgIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KG5hbWUpCisgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgICAgICByZXR1cm4gdmFsdWUKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHJldHVybiBkZWZhdWx0CisKK2RlZiBqYXZhX3ZlcihyZWxlYXNlPScnLHZlbmRvcj0nJyx2bWluZm89KCcnLCcnLCcnKSxvc2luZm89KCcnLCcnLCcnKSk6CisKKyAgICAiIiIgVmVyc2lvbiBpbnRlcmZhY2UgZm9yIEp5dGhvbi4KKworICAgICAgICBSZXR1cm5zIGEgdHVwbGUgKHJlbGVhc2UsdmVuZG9yLHZtaW5mbyxvc2luZm8pIHdpdGggdm1pbmZvIGJlaW5nCisgICAgICAgIGEgdHVwbGUgKHZtX25hbWUsdm1fcmVsZWFzZSx2bV92ZW5kb3IpIGFuZCBvc2luZm8gYmVpbmcgYQorICAgICAgICB0dXBsZSAob3NfbmFtZSxvc192ZXJzaW9uLG9zX2FyY2gpLgorCisgICAgICAgIFZhbHVlcyB3aGljaCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBhcmUgc2V0IHRvIHRoZSBkZWZhdWx0cworICAgICAgICBnaXZlbiBhcyBwYXJhbWV0ZXJzICh3aGljaCBhbGwgZGVmYXVsdCB0byAnJykuCisKKyAgICAiIiIKKyAgICAjIEltcG9ydCB0aGUgbmVlZGVkIEFQSXMKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBqYXZhLmxhbmcKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHJldHVybiByZWxlYXNlLHZlbmRvcix2bWluZm8sb3NpbmZvCisKKyAgICB2ZW5kb3IgPSBfamF2YV9nZXRwcm9wKCdqYXZhLnZlbmRvcicsIHZlbmRvcikKKyAgICByZWxlYXNlID0gX2phdmFfZ2V0cHJvcCgnamF2YS52ZXJzaW9uJywgcmVsZWFzZSkKKyAgICB2bV9uYW1lLCB2bV9yZWxlYXNlLCB2bV92ZW5kb3IgPSB2bWluZm8KKyAgICB2bV9uYW1lID0gX2phdmFfZ2V0cHJvcCgnamF2YS52bS5uYW1lJywgdm1fbmFtZSkKKyAgICB2bV92ZW5kb3IgPSBfamF2YV9nZXRwcm9wKCdqYXZhLnZtLnZlbmRvcicsIHZtX3ZlbmRvcikKKyAgICB2bV9yZWxlYXNlID0gX2phdmFfZ2V0cHJvcCgnamF2YS52bS52ZXJzaW9uJywgdm1fcmVsZWFzZSkKKyAgICB2bWluZm8gPSB2bV9uYW1lLCB2bV9yZWxlYXNlLCB2bV92ZW5kb3IKKyAgICBvc19uYW1lLCBvc192ZXJzaW9uLCBvc19hcmNoID0gb3NpbmZvCisgICAgb3NfYXJjaCA9IF9qYXZhX2dldHByb3AoJ2phdmEub3MuYXJjaCcsIG9zX2FyY2gpCisgICAgb3NfbmFtZSA9IF9qYXZhX2dldHByb3AoJ2phdmEub3MubmFtZScsIG9zX25hbWUpCisgICAgb3NfdmVyc2lvbiA9IF9qYXZhX2dldHByb3AoJ2phdmEub3MudmVyc2lvbicsIG9zX3ZlcnNpb24pCisgICAgb3NpbmZvID0gb3NfbmFtZSwgb3NfdmVyc2lvbiwgb3NfYXJjaAorCisgICAgcmV0dXJuIHJlbGVhc2UsIHZlbmRvciwgdm1pbmZvLCBvc2luZm8KKworIyMjIFN5c3RlbSBuYW1lIGFsaWFzaW5nCisKK2RlZiBzeXN0ZW1fYWxpYXMoc3lzdGVtLHJlbGVhc2UsdmVyc2lvbik6CisKKyAgICAiIiIgUmV0dXJucyAoc3lzdGVtLHJlbGVhc2UsdmVyc2lvbikgYWxpYXNlZCB0byBjb21tb24KKyAgICAgICAgbWFya2V0aW5nIG5hbWVzIHVzZWQgZm9yIHNvbWUgc3lzdGVtcy4KKworICAgICAgICBJdCBhbHNvIGRvZXMgc29tZSByZW9yZGVyaW5nIG9mIHRoZSBpbmZvcm1hdGlvbiBpbiBzb21lIGNhc2VzCisgICAgICAgIHdoZXJlIGl0IHdvdWxkIG90aGVyd2lzZSBjYXVzZSBjb25mdXNpb24uCisKKyAgICAiIiIKKyAgICBpZiBzeXN0ZW0gPT0gJ1JoYXBzb2R5JzoKKyAgICAgICAgIyBBcHBsZSdzIEJTRCBkZXJpdmF0aXZlCisgICAgICAgICMgWFhYIEhvdyBjYW4gd2UgZGV0ZXJtaW5lIHRoZSBtYXJrZXRpbmcgcmVsZWFzZSBudW1iZXIgPworICAgICAgICByZXR1cm4gJ01hY09TIFggU2VydmVyJyxzeXN0ZW0rcmVsZWFzZSx2ZXJzaW9uCisKKyAgICBlbGlmIHN5c3RlbSA9PSAnU3VuT1MnOgorICAgICAgICAjIFN1bidzIE9TCisgICAgICAgIGlmIHJlbGVhc2UgPCAnNSc6CisgICAgICAgICAgICAjIFRoZXNlIHJlbGVhc2VzIHVzZSB0aGUgb2xkIG5hbWUgU3VuT1MKKyAgICAgICAgICAgIHJldHVybiBzeXN0ZW0scmVsZWFzZSx2ZXJzaW9uCisgICAgICAgICMgTW9kaWZ5IHJlbGVhc2UgKG1hcmtldGluZyByZWxlYXNlID0gU3VuT1MgcmVsZWFzZSAtIDMpCisgICAgICAgIGwgPSBzdHJpbmcuc3BsaXQocmVsZWFzZSwnLicpCisgICAgICAgIGlmIGw6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbWFqb3IgPSBpbnQobFswXSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbWFqb3IgPSBtYWpvciAtIDMKKyAgICAgICAgICAgICAgICBsWzBdID0gc3RyKG1ham9yKQorICAgICAgICAgICAgICAgIHJlbGVhc2UgPSBzdHJpbmcuam9pbihsLCcuJykKKyAgICAgICAgaWYgcmVsZWFzZSA8ICc2JzoKKyAgICAgICAgICAgIHN5c3RlbSA9ICdTb2xhcmlzJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBYWFggV2hhdGV2ZXIgdGhlIG5ldyBTdW5PUyBtYXJrZXRpbmcgbmFtZSBpcy4uLgorICAgICAgICAgICAgc3lzdGVtID0gJ1NvbGFyaXMnCisKKyAgICBlbGlmIHN5c3RlbSA9PSAnSVJJWDY0JzoKKyAgICAgICAgIyBJUklYIHJlcG9ydHMgSVJJWDY0IG9uIHBsYXRmb3JtcyB3aXRoIDY0LWJpdCBzdXBwb3J0OyB5ZXQgaXQKKyAgICAgICAgIyBpcyByZWFsbHkgYSB2ZXJzaW9uIGFuZCBub3QgYSBkaWZmZXJlbnQgcGxhdGZvcm0sIHNpbmNlIDMyLWJpdAorICAgICAgICAjIGFwcHMgYXJlIGFsc28gc3VwcG9ydGVkLi4KKyAgICAgICAgc3lzdGVtID0gJ0lSSVgnCisgICAgICAgIGlmIHZlcnNpb246CisgICAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbiArICcgKDY0Yml0KScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZlcnNpb24gPSAnNjRiaXQnCisKKyAgICBlbGlmIHN5c3RlbSBpbiAoJ3dpbjMyJywnd2luMTYnKToKKyAgICAgICAgIyBJbiBjYXNlIG9uZSBvZiB0aGUgb3RoZXIgdHJpY2tzCisgICAgICAgIHN5c3RlbSA9ICdXaW5kb3dzJworCisgICAgcmV0dXJuIHN5c3RlbSxyZWxlYXNlLHZlcnNpb24KKworIyMjIFZhcmlvdXMgaW50ZXJuYWwgaGVscGVycworCitkZWYgX3BsYXRmb3JtKCphcmdzKToKKworICAgICIiIiBIZWxwZXIgdG8gZm9ybWF0IHRoZSBwbGF0Zm9ybSBzdHJpbmcgaW4gYSBmaWxlbmFtZQorICAgICAgICBjb21wYXRpYmxlIGZvcm1hdCBlLmcuICJzeXN0ZW0tdmVyc2lvbi1tYWNoaW5lIi4KKyAgICAiIiIKKyAgICAjIEZvcm1hdCB0aGUgcGxhdGZvcm0gc3RyaW5nCisgICAgcGxhdGZvcm0gPSBzdHJpbmcuam9pbigKKyAgICAgICAgbWFwKHN0cmluZy5zdHJpcCwKKyAgICAgICAgICAgIGZpbHRlcihsZW4sIGFyZ3MpKSwKKyAgICAgICAgJy0nKQorCisgICAgIyBDbGVhbnVwIHNvbWUgcG9zc2libGUgZmlsZW5hbWUgb2JzdGFjbGVzLi4uCisgICAgcmVwbGFjZSA9IHN0cmluZy5yZXBsYWNlCisgICAgcGxhdGZvcm0gPSByZXBsYWNlKHBsYXRmb3JtLCcgJywnXycpCisgICAgcGxhdGZvcm0gPSByZXBsYWNlKHBsYXRmb3JtLCcvJywnLScpCisgICAgcGxhdGZvcm0gPSByZXBsYWNlKHBsYXRmb3JtLCdcXCcsJy0nKQorICAgIHBsYXRmb3JtID0gcmVwbGFjZShwbGF0Zm9ybSwnOicsJy0nKQorICAgIHBsYXRmb3JtID0gcmVwbGFjZShwbGF0Zm9ybSwnOycsJy0nKQorICAgIHBsYXRmb3JtID0gcmVwbGFjZShwbGF0Zm9ybSwnIicsJy0nKQorICAgIHBsYXRmb3JtID0gcmVwbGFjZShwbGF0Zm9ybSwnKCcsJy0nKQorICAgIHBsYXRmb3JtID0gcmVwbGFjZShwbGF0Zm9ybSwnKScsJy0nKQorCisgICAgIyBObyBuZWVkIHRvIHJlcG9ydCAndW5rbm93bicgaW5mb3JtYXRpb24uLi4KKyAgICBwbGF0Zm9ybSA9IHJlcGxhY2UocGxhdGZvcm0sJ3Vua25vd24nLCcnKQorCisgICAgIyBGb2xkICctLSdzIGFuZCByZW1vdmUgdHJhaWxpbmcgJy0nCisgICAgd2hpbGUgMToKKyAgICAgICAgY2xlYW5lZCA9IHJlcGxhY2UocGxhdGZvcm0sJy0tJywnLScpCisgICAgICAgIGlmIGNsZWFuZWQgPT0gcGxhdGZvcm06CisgICAgICAgICAgICBicmVhaworICAgICAgICBwbGF0Zm9ybSA9IGNsZWFuZWQKKyAgICB3aGlsZSBwbGF0Zm9ybVstMV0gPT0gJy0nOgorICAgICAgICBwbGF0Zm9ybSA9IHBsYXRmb3JtWzotMV0KKworICAgIHJldHVybiBwbGF0Zm9ybQorCitkZWYgX25vZGUoZGVmYXVsdD0nJyk6CisKKyAgICAiIiIgSGVscGVyIHRvIGRldGVybWluZSB0aGUgbm9kZSBuYW1lIG9mIHRoaXMgbWFjaGluZS4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBzb2NrZXQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICMgTm8gc29ja2V0cy4uLgorICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHNvY2tldC5nZXRob3N0bmFtZSgpCisgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgIyBTdGlsbCBub3Qgd29ya2luZy4uLgorICAgICAgICByZXR1cm4gZGVmYXVsdAorCisjIG9zLnBhdGguYWJzcGF0aCBpcyBuZXcgaW4gUHl0aG9uIDEuNS4yOgoraWYgbm90IGhhc2F0dHIob3MucGF0aCwnYWJzcGF0aCcpOgorCisgICAgZGVmIF9hYnNwYXRoKHBhdGgsCisKKyAgICAgICAgICAgICAgICAgaXNhYnM9b3MucGF0aC5pc2Ficyxqb2luPW9zLnBhdGguam9pbixnZXRjd2Q9b3MuZ2V0Y3dkLAorICAgICAgICAgICAgICAgICBub3JtcGF0aD1vcy5wYXRoLm5vcm1wYXRoKToKKworICAgICAgICBpZiBub3QgaXNhYnMocGF0aCk6CisgICAgICAgICAgICBwYXRoID0gam9pbihnZXRjd2QoKSwgcGF0aCkKKyAgICAgICAgcmV0dXJuIG5vcm1wYXRoKHBhdGgpCisKK2Vsc2U6CisKKyAgICBfYWJzcGF0aCA9IG9zLnBhdGguYWJzcGF0aAorCitkZWYgX2ZvbGxvd19zeW1saW5rcyhmaWxlcGF0aCk6CisKKyAgICAiIiIgSW4gY2FzZSBmaWxlcGF0aCBpcyBhIHN5bWxpbmssIGZvbGxvdyBpdCB1bnRpbCBhCisgICAgICAgIHJlYWwgZmlsZSBpcyByZWFjaGVkLgorICAgICIiIgorICAgIGZpbGVwYXRoID0gX2Fic3BhdGgoZmlsZXBhdGgpCisgICAgd2hpbGUgb3MucGF0aC5pc2xpbmsoZmlsZXBhdGgpOgorICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgoCisgICAgICAgICAgICBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGZpbGVwYXRoKSxvcy5yZWFkbGluayhmaWxlcGF0aCkpKQorICAgIHJldHVybiBmaWxlcGF0aAorCitkZWYgX3N5c2NtZF91bmFtZShvcHRpb24sZGVmYXVsdD0nJyk6CisKKyAgICAiIiIgSW50ZXJmYWNlIHRvIHRoZSBzeXN0ZW0ncyB1bmFtZSBjb21tYW5kLgorICAgICIiIgorICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ2RvcycsJ3dpbjMyJywnd2luMTYnLCdvczInKToKKyAgICAgICAgIyBYWFggT3RoZXJzIHRvbyA/CisgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgdHJ5OgorICAgICAgICBmID0gb3MucG9wZW4oJ3VuYW1lICVzIDI+ICVzJyAlIChvcHRpb24sIERFVl9OVUxMKSkKKyAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLG9zLmVycm9yKToKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICBvdXRwdXQgPSBzdHJpbmcuc3RyaXAoZi5yZWFkKCkpCisgICAgcmMgPSBmLmNsb3NlKCkKKyAgICBpZiBub3Qgb3V0cHV0IG9yIHJjOgorICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBvdXRwdXQKKworZGVmIF9zeXNjbWRfZmlsZSh0YXJnZXQsZGVmYXVsdD0nJyk6CisKKyAgICAiIiIgSW50ZXJmYWNlIHRvIHRoZSBzeXN0ZW0ncyBmaWxlIGNvbW1hbmQuCisKKyAgICAgICAgVGhlIGZ1bmN0aW9uIHVzZXMgdGhlIC1iIG9wdGlvbiBvZiB0aGUgZmlsZSBjb21tYW5kIHRvIGhhdmUgaXQKKyAgICAgICAgb21taXQgdGhlIGZpbGVuYW1lIGluIGl0cyBvdXRwdXQgYW5kIGlmIHBvc3NpYmxlIHRoZSAtTCBvcHRpb24KKyAgICAgICAgdG8gaGF2ZSB0aGUgY29tbWFuZCBmb2xsb3cgc3ltbGlua3MuIEl0IHJldHVybnMgZGVmYXVsdCBpbgorICAgICAgICBjYXNlIHRoZSBjb21tYW5kIHNob3VsZCBmYWlsLgorCisgICAgIiIiCisKKyAgICAjIFdlIGRvIHRoZSBpbXBvcnQgaGVyZSB0byBhdm9pZCBhIGJvb3RzdHJhcCBpc3N1ZS4KKyAgICAjIFNlZSBjNzNiOTBiNmRhZGQgY2hhbmdlc2V0LgorICAgICMKKyAgICAjIFsuLl0KKyAgICAjIHJhbmxpYiBsaWJweXRob24yLjcuYQorICAgICMgZ2NjICAgLW8gcHl0aG9uIFwKKyAgICAjICAgICAgICBNb2R1bGVzL3B5dGhvbi5vIFwKKyAgICAjICAgICAgICBsaWJweXRob24yLjcuYSAtbHNvY2tldCAtbG5zbCAtbGRsICAgIC1sbQorICAgICMgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICMgIEZpbGUgIi4vc2V0dXAucHkiLCBsaW5lIDgsIGluIDxtb2R1bGU+CisgICAgIyAgICBmcm9tIHBsYXRmb3JtIGltcG9ydCBtYWNoaW5lIGFzIHBsYXRmb3JtX21hY2hpbmUKKyAgICAjICBGaWxlICJbLi5dL2J1aWxkL0xpYi9wbGF0Zm9ybS5weSIsIGxpbmUgMTE2LCBpbiA8bW9kdWxlPgorICAgICMgICAgaW1wb3J0IHN5cyxzdHJpbmcsb3MscmUsc3VicHJvY2VzcworICAgICMgIEZpbGUgIlsuLl0vYnVpbGQvTGliL3N1YnByb2Nlc3MucHkiLCBsaW5lIDQyOSwgaW4gPG1vZHVsZT4KKyAgICAjICAgIGltcG9ydCBzZWxlY3QKKyAgICAjIEltcG9ydEVycm9yOiBObyBtb2R1bGUgbmFtZWQgc2VsZWN0CisKKyAgICBpbXBvcnQgc3VicHJvY2VzcworCisgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnZG9zJywnd2luMzInLCd3aW4xNicsJ29zMicpOgorICAgICAgICAjIFhYWCBPdGhlcnMgdG9vID8KKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICB0YXJnZXQgPSBfZm9sbG93X3N5bWxpbmtzKHRhcmdldCkKKyAgICB0cnk6CisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKFsnZmlsZScsIHRhcmdldF0sCisgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorCisgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvcixvcy5lcnJvcik6CisgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgb3V0cHV0ID0gcHJvYy5jb21tdW5pY2F0ZSgpWzBdCisgICAgcmMgPSBwcm9jLndhaXQoKQorICAgIGlmIG5vdCBvdXRwdXQgb3IgcmM6CisgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIG91dHB1dAorCisjIyMgSW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZWQgYXJjaGl0ZWN0dXJlCisKKyMgRGVmYXVsdCB2YWx1ZXMgZm9yIGFyY2hpdGVjdHVyZTsgbm9uLWVtcHR5IHN0cmluZ3Mgb3ZlcnJpZGUgdGhlCisjIGRlZmF1bHRzIGdpdmVuIGFzIHBhcmFtZXRlcnMKK19kZWZhdWx0X2FyY2hpdGVjdHVyZSA9IHsKKyAgICAnd2luMzInOiAoJycsJ1dpbmRvd3NQRScpLAorICAgICd3aW4xNic6ICgnJywnV2luZG93cycpLAorICAgICdkb3MnOiAoJycsJ01TRE9TJyksCit9CisKK19hcmNoaXRlY3R1cmVfc3BsaXQgPSByZS5jb21waWxlKHInW1xzLF0nKS5zcGxpdAorCitkZWYgYXJjaGl0ZWN0dXJlKGV4ZWN1dGFibGU9c3lzLmV4ZWN1dGFibGUsYml0cz0nJyxsaW5rYWdlPScnKToKKworICAgICIiIiBRdWVyaWVzIHRoZSBnaXZlbiBleGVjdXRhYmxlIChkZWZhdWx0cyB0byB0aGUgUHl0aG9uIGludGVycHJldGVyCisgICAgICAgIGJpbmFyeSkgZm9yIHZhcmlvdXMgYXJjaGl0ZWN0dXJlIGluZm9ybWF0aW9uLgorCisgICAgICAgIFJldHVybnMgYSB0dXBsZSAoYml0cyxsaW5rYWdlKSB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dAorICAgICAgICB0aGUgYml0IGFyY2hpdGVjdHVyZSBhbmQgdGhlIGxpbmthZ2UgZm9ybWF0IHVzZWQgZm9yIHRoZQorICAgICAgICBleGVjdXRhYmxlLiBCb3RoIHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgc3RyaW5ncy4KKworICAgICAgICBWYWx1ZXMgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBhcmUgcmV0dXJuZWQgYXMgZ2l2ZW4gYnkgdGhlCisgICAgICAgIHBhcmFtZXRlciBwcmVzZXRzLiBJZiBiaXRzIGlzIGdpdmVuIGFzICcnLCB0aGUgc2l6ZW9mKHBvaW50ZXIpCisgICAgICAgIChvciBzaXplb2YobG9uZykgb24gUHl0aG9uIHZlcnNpb24gPCAxLjUuMikgaXMgdXNlZCBhcworICAgICAgICBpbmRpY2F0b3IgZm9yIHRoZSBzdXBwb3J0ZWQgcG9pbnRlciBzaXplLgorCisgICAgICAgIFRoZSBmdW5jdGlvbiByZWxpZXMgb24gdGhlIHN5c3RlbSdzICJmaWxlIiBjb21tYW5kIHRvIGRvIHRoZQorICAgICAgICBhY3R1YWwgd29yay4gVGhpcyBpcyBhdmFpbGFibGUgb24gbW9zdCBpZiBub3QgYWxsIFVuaXgKKyAgICAgICAgcGxhdGZvcm1zLiBPbiBzb21lIG5vbi1Vbml4IHBsYXRmb3JtcyB3aGVyZSB0aGUgImZpbGUiIGNvbW1hbmQKKyAgICAgICAgZG9lcyBub3QgZXhpc3QgYW5kIHRoZSBleGVjdXRhYmxlIGlzIHNldCB0byB0aGUgUHl0aG9uIGludGVycHJldGVyCisgICAgICAgIGJpbmFyeSBkZWZhdWx0cyBmcm9tIF9kZWZhdWx0X2FyY2hpdGVjdHVyZSBhcmUgdXNlZC4KKworICAgICIiIgorICAgICMgVXNlIHRoZSBzaXplb2YocG9pbnRlcikgYXMgZGVmYXVsdCBudW1iZXIgb2YgYml0cyBpZiBub3RoaW5nCisgICAgIyBlbHNlIGlzIGdpdmVuIGFzIGRlZmF1bHQuCisgICAgaWYgbm90IGJpdHM6CisgICAgICAgIGltcG9ydCBzdHJ1Y3QKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZSgnUCcpCisgICAgICAgIGV4Y2VwdCBzdHJ1Y3QuZXJyb3I6CisgICAgICAgICAgICAjIE9sZGVyIGluc3RhbGxhdGlvbnMgY2FuIG9ubHkgcXVlcnkgbG9uZ3MKKyAgICAgICAgICAgIHNpemUgPSBzdHJ1Y3QuY2FsY3NpemUoJ2wnKQorICAgICAgICBiaXRzID0gc3RyKHNpemUqOCkgKyAnYml0JworCisgICAgIyBHZXQgZGF0YSBmcm9tIHRoZSAnZmlsZScgc3lzdGVtIGNvbW1hbmQKKyAgICBpZiBleGVjdXRhYmxlOgorICAgICAgICBvdXRwdXQgPSBfc3lzY21kX2ZpbGUoZXhlY3V0YWJsZSwgJycpCisgICAgZWxzZToKKyAgICAgICAgb3V0cHV0ID0gJycKKworICAgIGlmIG5vdCBvdXRwdXQgYW5kIFwKKyAgICAgICBleGVjdXRhYmxlID09IHN5cy5leGVjdXRhYmxlOgorICAgICAgICAjICJmaWxlIiBjb21tYW5kIGRpZCBub3QgcmV0dXJuIGFueXRoaW5nOyB3ZSdsbCB0cnkgdG8gcHJvdmlkZQorICAgICAgICAjIHNvbWUgc2Vuc2libGUgZGVmYXVsdHMgdGhlbi4uLgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gX2RlZmF1bHRfYXJjaGl0ZWN0dXJlOgorICAgICAgICAgICAgYiwgbCA9IF9kZWZhdWx0X2FyY2hpdGVjdHVyZVtzeXMucGxhdGZvcm1dCisgICAgICAgICAgICBpZiBiOgorICAgICAgICAgICAgICAgIGJpdHMgPSBiCisgICAgICAgICAgICBpZiBsOgorICAgICAgICAgICAgICAgIGxpbmthZ2UgPSBsCisgICAgICAgIHJldHVybiBiaXRzLCBsaW5rYWdlCisKKyAgICAjIFNwbGl0IHRoZSBvdXRwdXQgaW50byBhIGxpc3Qgb2Ygc3RyaW5ncyBvbWl0dGluZyB0aGUgZmlsZW5hbWUKKyAgICBmaWxlb3V0ID0gX2FyY2hpdGVjdHVyZV9zcGxpdChvdXRwdXQpWzE6XQorCisgICAgaWYgJ2V4ZWN1dGFibGUnIG5vdCBpbiBmaWxlb3V0OgorICAgICAgICAjIEZvcm1hdCBub3Qgc3VwcG9ydGVkCisgICAgICAgIHJldHVybiBiaXRzLGxpbmthZ2UKKworICAgICMgQml0cworICAgIGlmICczMi1iaXQnIGluIGZpbGVvdXQ6CisgICAgICAgIGJpdHMgPSAnMzJiaXQnCisgICAgZWxpZiAnTjMyJyBpbiBmaWxlb3V0OgorICAgICAgICAjIE9uIElyaXggb25seQorICAgICAgICBiaXRzID0gJ24zMmJpdCcKKyAgICBlbGlmICc2NC1iaXQnIGluIGZpbGVvdXQ6CisgICAgICAgIGJpdHMgPSAnNjRiaXQnCisKKyAgICAjIExpbmthZ2UKKyAgICBpZiAnRUxGJyBpbiBmaWxlb3V0OgorICAgICAgICBsaW5rYWdlID0gJ0VMRicKKyAgICBlbGlmICdQRScgaW4gZmlsZW91dDoKKyAgICAgICAgIyBFLmcuIFdpbmRvd3MgdXNlcyB0aGlzIGZvcm1hdAorICAgICAgICBpZiAnV2luZG93cycgaW4gZmlsZW91dDoKKyAgICAgICAgICAgIGxpbmthZ2UgPSAnV2luZG93c1BFJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGlua2FnZSA9ICdQRScKKyAgICBlbGlmICdDT0ZGJyBpbiBmaWxlb3V0OgorICAgICAgICBsaW5rYWdlID0gJ0NPRkYnCisgICAgZWxpZiAnTVMtRE9TJyBpbiBmaWxlb3V0OgorICAgICAgICBsaW5rYWdlID0gJ01TRE9TJworICAgIGVsc2U6CisgICAgICAgICMgWFhYIHRoZSBBLk9VVCBmb3JtYXQgYWxzbyBmYWxscyB1bmRlciB0aGlzIGNsYXNzLi4uCisgICAgICAgIHBhc3MKKworICAgIHJldHVybiBiaXRzLGxpbmthZ2UKKworIyMjIFBvcnRhYmxlIHVuYW1lKCkgaW50ZXJmYWNlCisKK191bmFtZV9jYWNoZSA9IE5vbmUKKworZGVmIHVuYW1lKCk6CisKKyAgICAiIiIgRmFpcmx5IHBvcnRhYmxlIHVuYW1lIGludGVyZmFjZS4gUmV0dXJucyBhIHR1cGxlCisgICAgICAgIG9mIHN0cmluZ3MgKHN5c3RlbSxub2RlLHJlbGVhc2UsdmVyc2lvbixtYWNoaW5lLHByb2Nlc3NvcikKKyAgICAgICAgaWRlbnRpZnlpbmcgdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0uCisKKyAgICAgICAgTm90ZSB0aGF0IHVubGlrZSB0aGUgb3MudW5hbWUgZnVuY3Rpb24gdGhpcyBhbHNvIHJldHVybnMKKyAgICAgICAgcG9zc2libGUgcHJvY2Vzc29yIGluZm9ybWF0aW9uIGFzIGFuIGFkZGl0aW9uYWwgdHVwbGUgZW50cnkuCisKKyAgICAgICAgRW50cmllcyB3aGljaCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBhcmUgc2V0IHRvICcnLgorCisgICAgIiIiCisgICAgZ2xvYmFsIF91bmFtZV9jYWNoZQorICAgIG5vX29zX3VuYW1lID0gMAorCisgICAgaWYgX3VuYW1lX2NhY2hlIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gX3VuYW1lX2NhY2hlCisKKyAgICBwcm9jZXNzb3IgPSAnJworCisgICAgIyBHZXQgc29tZSBpbmZvcyBmcm9tIHRoZSBidWlsdGluIG9zLnVuYW1lIEFQSS4uLgorICAgIHRyeToKKyAgICAgICAgc3lzdGVtLG5vZGUscmVsZWFzZSx2ZXJzaW9uLG1hY2hpbmUgPSBvcy51bmFtZSgpCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBub19vc191bmFtZSA9IDEKKworICAgIGlmIG5vX29zX3VuYW1lIG9yIG5vdCBmaWx0ZXIoTm9uZSwgKHN5c3RlbSwgbm9kZSwgcmVsZWFzZSwgdmVyc2lvbiwgbWFjaGluZSkpOgorICAgICAgICAjIEhtbSwgbm8gdGhlcmUgaXMgZWl0aGVyIG5vIHVuYW1lIG9yIHVuYW1lIGhhcyByZXR1cm5lZAorICAgICAgICAjJ3Vua25vd25zJy4uLiB3ZSdsbCBoYXZlIHRvIHBva2UgYXJvdW5kIHRoZSBzeXN0ZW0gdGhlbi4KKyAgICAgICAgaWYgbm9fb3NfdW5hbWU6CisgICAgICAgICAgICBzeXN0ZW0gPSBzeXMucGxhdGZvcm0KKyAgICAgICAgICAgIHJlbGVhc2UgPSAnJworICAgICAgICAgICAgdmVyc2lvbiA9ICcnCisgICAgICAgICAgICBub2RlID0gX25vZGUoKQorICAgICAgICAgICAgbWFjaGluZSA9ICcnCisKKyAgICAgICAgdXNlX3N5c2NtZF92ZXIgPSAxCisKKyAgICAgICAgIyBUcnkgd2luMzJfdmVyKCkgb24gd2luMzIgcGxhdGZvcm1zCisgICAgICAgIGlmIHN5c3RlbSA9PSAnd2luMzInOgorICAgICAgICAgICAgcmVsZWFzZSx2ZXJzaW9uLGNzZCxwdHlwZSA9IHdpbjMyX3ZlcigpCisgICAgICAgICAgICBpZiByZWxlYXNlIGFuZCB2ZXJzaW9uOgorICAgICAgICAgICAgICAgIHVzZV9zeXNjbWRfdmVyID0gMAorICAgICAgICAgICAgIyBUcnkgdG8gdXNlIHRoZSBQUk9DRVNTT1JfKiBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgICAgICAgICMgYXZhaWxhYmxlIG9uIFdpbiBYUCBhbmQgbGF0ZXI7IHNlZQorICAgICAgICAgICAgIyBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzg4ODczMSBhbmQKKyAgICAgICAgICAgICMgaHR0cDovL3d3dy5nZW9jaXRpZXMuY29tL3JpY2tfbGl2ZWx5L01BTlVBTFMvRU5WL01TV0lOL1BST0NFU1NJLkhUTQorICAgICAgICAgICAgaWYgbm90IG1hY2hpbmU6CisgICAgICAgICAgICAgICAgIyBXT1c2NCBwcm9jZXNzZXMgbWFzayB0aGUgbmF0aXZlIGFyY2hpdGVjdHVyZQorICAgICAgICAgICAgICAgIGlmICJQUk9DRVNTT1JfQVJDSElURVc2NDMyIiBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gb3MuZW52aXJvbi5nZXQoIlBST0NFU1NPUl9BUkNISVRFVzY0MzIiLCAnJykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtYWNoaW5lID0gb3MuZW52aXJvbi5nZXQoJ1BST0NFU1NPUl9BUkNISVRFQ1RVUkUnLCAnJykKKyAgICAgICAgICAgIGlmIG5vdCBwcm9jZXNzb3I6CisgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gb3MuZW52aXJvbi5nZXQoJ1BST0NFU1NPUl9JREVOVElGSUVSJywgbWFjaGluZSkKKworICAgICAgICAjIFRyeSB0aGUgJ3Zlcicgc3lzdGVtIGNvbW1hbmQgYXZhaWxhYmxlIG9uIHNvbWUKKyAgICAgICAgIyBwbGF0Zm9ybXMKKyAgICAgICAgaWYgdXNlX3N5c2NtZF92ZXI6CisgICAgICAgICAgICBzeXN0ZW0scmVsZWFzZSx2ZXJzaW9uID0gX3N5c2NtZF92ZXIoc3lzdGVtKQorICAgICAgICAgICAgIyBOb3JtYWxpemUgc3lzdGVtIHRvIHdoYXQgd2luMzJfdmVyKCkgbm9ybWFsbHkgcmV0dXJucworICAgICAgICAgICAgIyAoX3N5c2NtZF92ZXIoKSB0ZW5kcyB0byByZXR1cm4gdGhlIHZlbmRvciBuYW1lIGFzIHdlbGwpCisgICAgICAgICAgICBpZiBzeXN0ZW0gPT0gJ01pY3Jvc29mdCBXaW5kb3dzJzoKKyAgICAgICAgICAgICAgICBzeXN0ZW0gPSAnV2luZG93cycKKyAgICAgICAgICAgIGVsaWYgc3lzdGVtID09ICdNaWNyb3NvZnQnIGFuZCByZWxlYXNlID09ICdXaW5kb3dzJzoKKyAgICAgICAgICAgICAgICAjIFVuZGVyIFdpbmRvd3MgVmlzdGEgYW5kIFdpbmRvd3MgU2VydmVyIDIwMDgsCisgICAgICAgICAgICAgICAgIyBNaWNyb3NvZnQgY2hhbmdlZCB0aGUgb3V0cHV0IG9mIHRoZSB2ZXIgY29tbWFuZC4gVGhlCisgICAgICAgICAgICAgICAgIyByZWxlYXNlIGlzIG5vIGxvbmdlciBwcmludGVkLiAgVGhpcyBjYXVzZXMgdGhlCisgICAgICAgICAgICAgICAgIyBzeXN0ZW0gYW5kIHJlbGVhc2UgdG8gYmUgbWlzaWRlbnRpZmllZC4KKyAgICAgICAgICAgICAgICBzeXN0ZW0gPSAnV2luZG93cycKKyAgICAgICAgICAgICAgICBpZiAnNi4wJyA9PSB2ZXJzaW9uWzozXToKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9ICdWaXN0YScKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0gJycKKworICAgICAgICAjIEluIGNhc2Ugd2Ugc3RpbGwgZG9uJ3Qga25vdyBhbnl0aGluZyB1c2VmdWwsIHdlJ2xsIHRyeSB0bworICAgICAgICAjIGhlbHAgb3Vyc2VsdmVzCisgICAgICAgIGlmIHN5c3RlbSBpbiAoJ3dpbjMyJywnd2luMTYnKToKKyAgICAgICAgICAgIGlmIG5vdCB2ZXJzaW9uOgorICAgICAgICAgICAgICAgIGlmIHN5c3RlbSA9PSAnd2luMzInOgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJzMyYml0JworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gPSAnMTZiaXQnCisgICAgICAgICAgICBzeXN0ZW0gPSAnV2luZG93cycKKworICAgICAgICBlbGlmIHN5c3RlbVs6NF0gPT0gJ2phdmEnOgorICAgICAgICAgICAgcmVsZWFzZSx2ZW5kb3Isdm1pbmZvLG9zaW5mbyA9IGphdmFfdmVyKCkKKyAgICAgICAgICAgIHN5c3RlbSA9ICdKYXZhJworICAgICAgICAgICAgdmVyc2lvbiA9IHN0cmluZy5qb2luKHZtaW5mbywnLCAnKQorICAgICAgICAgICAgaWYgbm90IHZlcnNpb246CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlbmRvcgorCisgICAgIyBTeXN0ZW0gc3BlY2lmaWMgZXh0ZW5zaW9ucworICAgIGlmIHN5c3RlbSA9PSAnT3BlblZNUyc6CisgICAgICAgICMgT3BlblZNUyBzZWVtcyB0byBoYXZlIHJlbGVhc2UgYW5kIHZlcnNpb24gbWl4ZWQgdXAKKyAgICAgICAgaWYgbm90IHJlbGVhc2Ugb3IgcmVsZWFzZSA9PSAnMCc6CisgICAgICAgICAgICByZWxlYXNlID0gdmVyc2lvbgorICAgICAgICAgICAgdmVyc2lvbiA9ICcnCisgICAgICAgICMgR2V0IHByb2Nlc3NvciBpbmZvcm1hdGlvbgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgdm1zX2xpYgorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjc2lkLCBjcHVfbnVtYmVyID0gdm1zX2xpYi5nZXRzeWkoJ1NZSSRfQ1BVJywwKQorICAgICAgICAgICAgaWYgKGNwdV9udW1iZXIgPj0gMTI4KToKKyAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSAnQWxwaGEnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9ICdWQVgnCisgICAgaWYgbm90IHByb2Nlc3NvcjoKKyAgICAgICAgIyBHZXQgcHJvY2Vzc29yIGluZm9ybWF0aW9uIGZyb20gdGhlIHVuYW1lIHN5c3RlbSBjb21tYW5kCisgICAgICAgIHByb2Nlc3NvciA9IF9zeXNjbWRfdW5hbWUoJy1wJywnJykKKworICAgICNJZiBhbnkgdW5rbm93bnMgc3RpbGwgZXhpc3QsIHJlcGxhY2UgdGhlbSB3aXRoICcncywgd2hpY2ggYXJlIG1vcmUgcG9ydGFibGUKKyAgICBpZiBzeXN0ZW0gPT0gJ3Vua25vd24nOgorICAgICAgICBzeXN0ZW0gPSAnJworICAgIGlmIG5vZGUgPT0gJ3Vua25vd24nOgorICAgICAgICBub2RlID0gJycKKyAgICBpZiByZWxlYXNlID09ICd1bmtub3duJzoKKyAgICAgICAgcmVsZWFzZSA9ICcnCisgICAgaWYgdmVyc2lvbiA9PSAndW5rbm93bic6CisgICAgICAgIHZlcnNpb24gPSAnJworICAgIGlmIG1hY2hpbmUgPT0gJ3Vua25vd24nOgorICAgICAgICBtYWNoaW5lID0gJycKKyAgICBpZiBwcm9jZXNzb3IgPT0gJ3Vua25vd24nOgorICAgICAgICBwcm9jZXNzb3IgPSAnJworCisgICAgIyAgbm9ybWFsaXplIG5hbWUKKyAgICBpZiBzeXN0ZW0gPT0gJ01pY3Jvc29mdCcgYW5kIHJlbGVhc2UgPT0gJ1dpbmRvd3MnOgorICAgICAgICBzeXN0ZW0gPSAnV2luZG93cycKKyAgICAgICAgcmVsZWFzZSA9ICdWaXN0YScKKworICAgIF91bmFtZV9jYWNoZSA9IHN5c3RlbSxub2RlLHJlbGVhc2UsdmVyc2lvbixtYWNoaW5lLHByb2Nlc3NvcgorICAgIHJldHVybiBfdW5hbWVfY2FjaGUKKworIyMjIERpcmVjdCBpbnRlcmZhY2VzIHRvIHNvbWUgb2YgdGhlIHVuYW1lKCkgcmV0dXJuIHZhbHVlcworCitkZWYgc3lzdGVtKCk6CisKKyAgICAiIiIgUmV0dXJucyB0aGUgc3lzdGVtL09TIG5hbWUsIGUuZy4gJ0xpbnV4JywgJ1dpbmRvd3MnIG9yICdKYXZhJy4KKworICAgICAgICBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgorCisgICAgIiIiCisgICAgcmV0dXJuIHVuYW1lKClbMF0KKworZGVmIG5vZGUoKToKKworICAgICIiIiBSZXR1cm5zIHRoZSBjb21wdXRlcidzIG5ldHdvcmsgbmFtZSAod2hpY2ggbWF5IG5vdCBiZSBmdWxseQorICAgICAgICBxdWFsaWZpZWQpCisKKyAgICAgICAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KKworICAgICIiIgorICAgIHJldHVybiB1bmFtZSgpWzFdCisKK2RlZiByZWxlYXNlKCk6CisKKyAgICAiIiIgUmV0dXJucyB0aGUgc3lzdGVtJ3MgcmVsZWFzZSwgZS5nLiAnMi4yLjAnIG9yICdOVCcKKworICAgICAgICBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgorCisgICAgIiIiCisgICAgcmV0dXJuIHVuYW1lKClbMl0KKworZGVmIHZlcnNpb24oKToKKworICAgICIiIiBSZXR1cm5zIHRoZSBzeXN0ZW0ncyByZWxlYXNlIHZlcnNpb24sIGUuZy4gJyMzIG9uIGRlZ2FzJworCisgICAgICAgIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gdW5hbWUoKVszXQorCitkZWYgbWFjaGluZSgpOgorCisgICAgIiIiIFJldHVybnMgdGhlIG1hY2hpbmUgdHlwZSwgZS5nLiAnaTM4NicKKworICAgICAgICBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgorCisgICAgIiIiCisgICAgcmV0dXJuIHVuYW1lKClbNF0KKworZGVmIHByb2Nlc3NvcigpOgorCisgICAgIiIiIFJldHVybnMgdGhlICh0cnVlKSBwcm9jZXNzb3IgbmFtZSwgZS5nLiAnYW1kazYnCisKKyAgICAgICAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUKKyAgICAgICAgZGV0ZXJtaW5lZC4gTm90ZSB0aGF0IG1hbnkgcGxhdGZvcm1zIGRvIG5vdCBwcm92aWRlIHRoaXMKKyAgICAgICAgaW5mb3JtYXRpb24gb3Igc2ltcGx5IHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcyBmb3IgbWFjaGluZSgpLAorICAgICAgICBlLmcuICBOZXRCU0QgZG9lcyB0aGlzLgorCisgICAgIiIiCisgICAgcmV0dXJuIHVuYW1lKClbNV0KKworIyMjIFZhcmlvdXMgQVBJcyBmb3IgZXh0cmFjdGluZyBpbmZvcm1hdGlvbiBmcm9tIHN5cy52ZXJzaW9uCisKK19zeXNfdmVyc2lvbl9wYXJzZXIgPSByZS5jb21waWxlKAorICAgIHInKFtcdy4rXSspXHMqJworICAgICdcKCM/KFteLF0rKSxccyooW1x3IF0rKSxccyooW1x3IDpdKylcKVxzKicKKyAgICAnXFsoW15cXV0rKVxdPycpCisKK19pcm9ucHl0aG9uX3N5c192ZXJzaW9uX3BhcnNlciA9IHJlLmNvbXBpbGUoCisgICAgcidJcm9uUHl0aG9uXHMqJworICAgICcoW1xkXC5dKyknCisgICAgJyg/OiBcKChbXGRcLl0rKVwpKT8nCisgICAgJyBvbiAoLk5FVCBbXGRcLl0rKScpCisKK19weXB5X3N5c192ZXJzaW9uX3BhcnNlciA9IHJlLmNvbXBpbGUoCisgICAgcicoW1x3LitdKylccyonCisgICAgJ1woIz8oW14sXSspLFxzKihbXHcgXSspLFxzKihbXHcgOl0rKVwpXHMqJworICAgICdcW1B5UHkgW15cXV0rXF0/JykKKworX3N5c192ZXJzaW9uX2NhY2hlID0ge30KKworZGVmIF9zeXNfdmVyc2lvbihzeXNfdmVyc2lvbj1Ob25lKToKKworICAgICIiIiBSZXR1cm5zIGEgcGFyc2VkIHZlcnNpb24gb2YgUHl0aG9uJ3Mgc3lzLnZlcnNpb24gYXMgdHVwbGUKKyAgICAgICAgKG5hbWUsIHZlcnNpb24sIGJyYW5jaCwgcmV2aXNpb24sIGJ1aWxkbm8sIGJ1aWxkZGF0ZSwgY29tcGlsZXIpCisgICAgICAgIHJlZmVycmluZyB0byB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIG5hbWUsIHZlcnNpb24sIGJyYW5jaCwKKyAgICAgICAgcmV2aXNpb24sIGJ1aWxkIG51bWJlciwgYnVpbGQgZGF0ZS90aW1lIGFzIHN0cmluZyBhbmQgdGhlIGNvbXBpbGVyCisgICAgICAgIGlkZW50aWZpY2F0aW9uIHN0cmluZy4KKworICAgICAgICBOb3RlIHRoYXQgdW5saWtlIHRoZSBQeXRob24gc3lzLnZlcnNpb24sIHRoZSByZXR1cm5lZCB2YWx1ZQorICAgICAgICBmb3IgdGhlIFB5dGhvbiB2ZXJzaW9uIHdpbGwgYWx3YXlzIGluY2x1ZGUgdGhlIHBhdGNobGV2ZWwgKGl0CisgICAgICAgIGRlZmF1bHRzIHRvICcuMCcpLgorCisgICAgICAgIFRoZSBmdW5jdGlvbiByZXR1cm5zIGVtcHR5IHN0cmluZ3MgZm9yIHR1cGxlIGVudHJpZXMgdGhhdAorICAgICAgICBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KKworICAgICAgICBzeXNfdmVyc2lvbiBtYXkgYmUgZ2l2ZW4gdG8gcGFyc2UgYW4gYWx0ZXJuYXRpdmUgdmVyc2lvbgorICAgICAgICBzdHJpbmcsIGUuZy4gaWYgdGhlIHZlcnNpb24gd2FzIHJlYWQgZnJvbSBhIGRpZmZlcmVudCBQeXRob24KKyAgICAgICAgaW50ZXJwcmV0ZXIuCisKKyAgICAiIiIKKyAgICAjIEdldCB0aGUgUHl0aG9uIHZlcnNpb24KKyAgICBpZiBzeXNfdmVyc2lvbiBpcyBOb25lOgorICAgICAgICBzeXNfdmVyc2lvbiA9IHN5cy52ZXJzaW9uCisKKyAgICAjIFRyeSB0aGUgY2FjaGUgZmlyc3QKKyAgICByZXN1bHQgPSBfc3lzX3ZlcnNpb25fY2FjaGUuZ2V0KHN5c192ZXJzaW9uLCBOb25lKQorICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgIyBQYXJzZSBpdAorICAgIGlmIHN5c192ZXJzaW9uWzoxMF0gPT0gJ0lyb25QeXRob24nOgorICAgICAgICAjIElyb25QeXRob24KKyAgICAgICAgbmFtZSA9ICdJcm9uUHl0aG9uJworICAgICAgICBtYXRjaCA9IF9pcm9ucHl0aG9uX3N5c192ZXJzaW9uX3BhcnNlci5tYXRjaChzeXNfdmVyc2lvbikKKyAgICAgICAgaWYgbWF0Y2ggaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgJ2ZhaWxlZCB0byBwYXJzZSBJcm9uUHl0aG9uIHN5cy52ZXJzaW9uOiAlcycgJQorICAgICAgICAgICAgICAgIHJlcHIoc3lzX3ZlcnNpb24pKQorICAgICAgICB2ZXJzaW9uLCBhbHRfdmVyc2lvbiwgY29tcGlsZXIgPSBtYXRjaC5ncm91cHMoKQorICAgICAgICBidWlsZG5vID0gJycKKyAgICAgICAgYnVpbGRkYXRlID0gJycKKworICAgIGVsaWYgc3lzLnBsYXRmb3JtWzo0XSA9PSAnamF2YSc6CisgICAgICAgICMgSnl0aG9uCisgICAgICAgIG5hbWUgPSAnSnl0aG9uJworICAgICAgICBtYXRjaCA9IF9zeXNfdmVyc2lvbl9wYXJzZXIubWF0Y2goc3lzX3ZlcnNpb24pCisgICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICdmYWlsZWQgdG8gcGFyc2UgSnl0aG9uIHN5cy52ZXJzaW9uOiAlcycgJQorICAgICAgICAgICAgICAgIHJlcHIoc3lzX3ZlcnNpb24pKQorICAgICAgICB2ZXJzaW9uLCBidWlsZG5vLCBidWlsZGRhdGUsIGJ1aWxkdGltZSwgXyA9IG1hdGNoLmdyb3VwcygpCisgICAgICAgIGNvbXBpbGVyID0gc3lzLnBsYXRmb3JtCisKKyAgICBlbGlmICJQeVB5IiBpbiBzeXNfdmVyc2lvbjoKKyAgICAgICAgIyBQeVB5CisgICAgICAgIG5hbWUgPSAiUHlQeSIKKyAgICAgICAgbWF0Y2ggPSBfcHlweV9zeXNfdmVyc2lvbl9wYXJzZXIubWF0Y2goc3lzX3ZlcnNpb24pCisgICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmYWlsZWQgdG8gcGFyc2UgUHlQeSBzeXMudmVyc2lvbjogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcihzeXNfdmVyc2lvbikpCisgICAgICAgIHZlcnNpb24sIGJ1aWxkbm8sIGJ1aWxkZGF0ZSwgYnVpbGR0aW1lID0gbWF0Y2guZ3JvdXBzKCkKKyAgICAgICAgY29tcGlsZXIgPSAiIgorCisgICAgZWxzZToKKyAgICAgICAgIyBDUHl0aG9uCisgICAgICAgIG1hdGNoID0gX3N5c192ZXJzaW9uX3BhcnNlci5tYXRjaChzeXNfdmVyc2lvbikKKyAgICAgICAgaWYgbWF0Y2ggaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgJ2ZhaWxlZCB0byBwYXJzZSBDUHl0aG9uIHN5cy52ZXJzaW9uOiAlcycgJQorICAgICAgICAgICAgICAgIHJlcHIoc3lzX3ZlcnNpb24pKQorICAgICAgICB2ZXJzaW9uLCBidWlsZG5vLCBidWlsZGRhdGUsIGJ1aWxkdGltZSwgY29tcGlsZXIgPSBcCisgICAgICAgICAgICAgIG1hdGNoLmdyb3VwcygpCisgICAgICAgIG5hbWUgPSAnQ1B5dGhvbicKKyAgICAgICAgYnVpbGRkYXRlID0gYnVpbGRkYXRlICsgJyAnICsgYnVpbGR0aW1lCisKKyAgICBpZiBoYXNhdHRyKHN5cywgJ3N1YnZlcnNpb24nKToKKyAgICAgICAgIyBzeXMuc3VidmVyc2lvbiB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuNQorICAgICAgICBfLCBicmFuY2gsIHJldmlzaW9uID0gc3lzLnN1YnZlcnNpb24KKyAgICBlbHNlOgorICAgICAgICBicmFuY2ggPSAnJworICAgICAgICByZXZpc2lvbiA9ICcnCisKKyAgICAjIEFkZCB0aGUgcGF0Y2hsZXZlbCB2ZXJzaW9uIGlmIG1pc3NpbmcKKyAgICBsID0gc3RyaW5nLnNwbGl0KHZlcnNpb24sICcuJykKKyAgICBpZiBsZW4obCkgPT0gMjoKKyAgICAgICAgbC5hcHBlbmQoJzAnKQorICAgICAgICB2ZXJzaW9uID0gc3RyaW5nLmpvaW4obCwgJy4nKQorCisgICAgIyBCdWlsZCBhbmQgY2FjaGUgdGhlIHJlc3VsdAorICAgIHJlc3VsdCA9IChuYW1lLCB2ZXJzaW9uLCBicmFuY2gsIHJldmlzaW9uLCBidWlsZG5vLCBidWlsZGRhdGUsIGNvbXBpbGVyKQorICAgIF9zeXNfdmVyc2lvbl9jYWNoZVtzeXNfdmVyc2lvbl0gPSByZXN1bHQKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBweXRob25faW1wbGVtZW50YXRpb24oKToKKworICAgICIiIiBSZXR1cm5zIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24uCisKKyAgICAgICAgQ3VycmVudGx5LCB0aGUgZm9sbG93aW5nIGltcGxlbWVudGF0aW9ucyBhcmUgaWRlbnRpZmllZDoKKyAgICAgICAgICAnQ1B5dGhvbicgKEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uKSwKKyAgICAgICAgICAnSXJvblB5dGhvbicgKC5ORVQgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uKSwKKyAgICAgICAgICAnSnl0aG9uJyAoSmF2YSBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24pLAorICAgICAgICAgICdQeVB5JyAoUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbikuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX3N5c192ZXJzaW9uKClbMF0KKworZGVmIHB5dGhvbl92ZXJzaW9uKCk6CisKKyAgICAiIiIgUmV0dXJucyB0aGUgUHl0aG9uIHZlcnNpb24gYXMgc3RyaW5nICdtYWpvci5taW5vci5wYXRjaGxldmVsJworCisgICAgICAgIE5vdGUgdGhhdCB1bmxpa2UgdGhlIFB5dGhvbiBzeXMudmVyc2lvbiwgdGhlIHJldHVybmVkIHZhbHVlCisgICAgICAgIHdpbGwgYWx3YXlzIGluY2x1ZGUgdGhlIHBhdGNobGV2ZWwgKGl0IGRlZmF1bHRzIHRvIDApLgorCisgICAgIiIiCisgICAgcmV0dXJuIF9zeXNfdmVyc2lvbigpWzFdCisKK2RlZiBweXRob25fdmVyc2lvbl90dXBsZSgpOgorCisgICAgIiIiIFJldHVybnMgdGhlIFB5dGhvbiB2ZXJzaW9uIGFzIHR1cGxlIChtYWpvciwgbWlub3IsIHBhdGNobGV2ZWwpCisgICAgICAgIG9mIHN0cmluZ3MuCisKKyAgICAgICAgTm90ZSB0aGF0IHVubGlrZSB0aGUgUHl0aG9uIHN5cy52ZXJzaW9uLCB0aGUgcmV0dXJuZWQgdmFsdWUKKyAgICAgICAgd2lsbCBhbHdheXMgaW5jbHVkZSB0aGUgcGF0Y2hsZXZlbCAoaXQgZGVmYXVsdHMgdG8gMCkuCisKKyAgICAiIiIKKyAgICByZXR1cm4gdHVwbGUoc3RyaW5nLnNwbGl0KF9zeXNfdmVyc2lvbigpWzFdLCAnLicpKQorCitkZWYgcHl0aG9uX2JyYW5jaCgpOgorCisgICAgIiIiIFJldHVybnMgYSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgorICAgICAgICBicmFuY2guCisKKyAgICAgICAgRm9yIENQeXRob24gdGhpcyBpcyB0aGUgU3VidmVyc2lvbiBicmFuY2ggZnJvbSB3aGljaCB0aGUKKyAgICAgICAgUHl0aG9uIGJpbmFyeSB3YXMgYnVpbHQuCisKKyAgICAgICAgSWYgbm90IGF2YWlsYWJsZSwgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorCisgICAgIiIiCisKKyAgICByZXR1cm4gX3N5c192ZXJzaW9uKClbMl0KKworZGVmIHB5dGhvbl9yZXZpc2lvbigpOgorCisgICAgIiIiIFJldHVybnMgYSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgorICAgICAgICByZXZpc2lvbi4KKworICAgICAgICBGb3IgQ1B5dGhvbiB0aGlzIGlzIHRoZSBTdWJ2ZXJzaW9uIHJldmlzaW9uIGZyb20gd2hpY2ggdGhlCisgICAgICAgIFB5dGhvbiBiaW5hcnkgd2FzIGJ1aWx0LgorCisgICAgICAgIElmIG5vdCBhdmFpbGFibGUsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKworICAgICIiIgorICAgIHJldHVybiBfc3lzX3ZlcnNpb24oKVszXQorCitkZWYgcHl0aG9uX2J1aWxkKCk6CisKKyAgICAiIiIgUmV0dXJucyBhIHR1cGxlIChidWlsZG5vLCBidWlsZGRhdGUpIHN0YXRpbmcgdGhlIFB5dGhvbgorICAgICAgICBidWlsZCBudW1iZXIgYW5kIGRhdGUgYXMgc3RyaW5ncy4KKworICAgICIiIgorICAgIHJldHVybiBfc3lzX3ZlcnNpb24oKVs0OjZdCisKK2RlZiBweXRob25fY29tcGlsZXIoKToKKworICAgICIiIiBSZXR1cm5zIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBjb21waWxlciB1c2VkIGZvciBjb21waWxpbmcKKyAgICAgICAgUHl0aG9uLgorCisgICAgIiIiCisgICAgcmV0dXJuIF9zeXNfdmVyc2lvbigpWzZdCisKKyMjIyBUaGUgT3B1cyBNYWdudW0gb2YgcGxhdGZvcm0gc3RyaW5ncyA6LSkKKworX3BsYXRmb3JtX2NhY2hlID0ge30KKworZGVmIHBsYXRmb3JtKGFsaWFzZWQ9MCwgdGVyc2U9MCk6CisKKyAgICAiIiIgUmV0dXJucyBhIHNpbmdsZSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0KKyAgICAgICAgd2l0aCBhcyBtdWNoIHVzZWZ1bCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSAoYnV0IG5vIG1vcmUgOikuCisKKyAgICAgICAgVGhlIG91dHB1dCBpcyBpbnRlbmRlZCB0byBiZSBodW1hbiByZWFkYWJsZSByYXRoZXIgdGhhbgorICAgICAgICBtYWNoaW5lIHBhcnNlYWJsZS4gSXQgbWF5IGxvb2sgZGlmZmVyZW50IG9uIGRpZmZlcmVudAorICAgICAgICBwbGF0Zm9ybXMgYW5kIHRoaXMgaXMgaW50ZW5kZWQuCisKKyAgICAgICAgSWYgImFsaWFzZWQiIGlzIHRydWUsIHRoZSBmdW5jdGlvbiB3aWxsIHVzZSBhbGlhc2VzIGZvcgorICAgICAgICB2YXJpb3VzIHBsYXRmb3JtcyB0aGF0IHJlcG9ydCBzeXN0ZW0gbmFtZXMgd2hpY2ggZGlmZmVyIGZyb20KKyAgICAgICAgdGhlaXIgY29tbW9uIG5hbWVzLCBlLmcuIFN1bk9TIHdpbGwgYmUgcmVwb3J0ZWQgYXMKKyAgICAgICAgU29sYXJpcy4gVGhlIHN5c3RlbV9hbGlhcygpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW1wbGVtZW50CisgICAgICAgIHRoaXMuCisKKyAgICAgICAgU2V0dGluZyB0ZXJzZSB0byB0cnVlIGNhdXNlcyB0aGUgZnVuY3Rpb24gdG8gcmV0dXJuIG9ubHkgdGhlCisgICAgICAgIGFic29sdXRlIG1pbmltdW0gaW5mb3JtYXRpb24gbmVlZGVkIHRvIGlkZW50aWZ5IHRoZSBwbGF0Zm9ybS4KKworICAgICIiIgorICAgIHJlc3VsdCA9IF9wbGF0Zm9ybV9jYWNoZS5nZXQoKGFsaWFzZWQsIHRlcnNlKSwgTm9uZSkKKyAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICMgR2V0IHVuYW1lIGluZm9ybWF0aW9uIGFuZCB0aGVuIGFwcGx5IHBsYXRmb3JtIHNwZWNpZmljIGNvc21ldGljcworICAgICMgdG8gaXQuLi4KKyAgICBzeXN0ZW0sbm9kZSxyZWxlYXNlLHZlcnNpb24sbWFjaGluZSxwcm9jZXNzb3IgPSB1bmFtZSgpCisgICAgaWYgbWFjaGluZSA9PSBwcm9jZXNzb3I6CisgICAgICAgIHByb2Nlc3NvciA9ICcnCisgICAgaWYgYWxpYXNlZDoKKyAgICAgICAgc3lzdGVtLHJlbGVhc2UsdmVyc2lvbiA9IHN5c3RlbV9hbGlhcyhzeXN0ZW0scmVsZWFzZSx2ZXJzaW9uKQorCisgICAgaWYgc3lzdGVtID09ICdXaW5kb3dzJzoKKyAgICAgICAgIyBNUyBwbGF0Zm9ybXMKKyAgICAgICAgcmVsLHZlcnMsY3NkLHB0eXBlID0gd2luMzJfdmVyKHZlcnNpb24pCisgICAgICAgIGlmIHRlcnNlOgorICAgICAgICAgICAgcGxhdGZvcm0gPSBfcGxhdGZvcm0oc3lzdGVtLHJlbGVhc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwbGF0Zm9ybSA9IF9wbGF0Zm9ybShzeXN0ZW0scmVsZWFzZSx2ZXJzaW9uLGNzZCkKKworICAgIGVsaWYgc3lzdGVtIGluICgnTGludXgnLCk6CisgICAgICAgICMgTGludXggYmFzZWQgc3lzdGVtcworICAgICAgICBkaXN0bmFtZSxkaXN0dmVyc2lvbixkaXN0aWQgPSBkaXN0KCcnKQorICAgICAgICBpZiBkaXN0bmFtZSBhbmQgbm90IHRlcnNlOgorICAgICAgICAgICAgcGxhdGZvcm0gPSBfcGxhdGZvcm0oc3lzdGVtLHJlbGVhc2UsbWFjaGluZSxwcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2l0aCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0bmFtZSxkaXN0dmVyc2lvbixkaXN0aWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIElmIHRoZSBkaXN0cmlidXRpb24gbmFtZSBpcyB1bmtub3duIGNoZWNrIGZvciBsaWJjIHZzLiBnbGliYworICAgICAgICAgICAgbGliY25hbWUsbGliY3ZlcnNpb24gPSBsaWJjX3ZlcihzeXMuZXhlY3V0YWJsZSkKKyAgICAgICAgICAgIHBsYXRmb3JtID0gX3BsYXRmb3JtKHN5c3RlbSxyZWxlYXNlLG1hY2hpbmUscHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpdGgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGliY25hbWUrbGliY3ZlcnNpb24pCisgICAgZWxpZiBzeXN0ZW0gPT0gJ0phdmEnOgorICAgICAgICAjIEphdmEgcGxhdGZvcm1zCisgICAgICAgIHIsdix2bWluZm8sKG9zX25hbWUsb3NfdmVyc2lvbixvc19hcmNoKSA9IGphdmFfdmVyKCkKKyAgICAgICAgaWYgdGVyc2Ugb3Igbm90IG9zX25hbWU6CisgICAgICAgICAgICBwbGF0Zm9ybSA9IF9wbGF0Zm9ybShzeXN0ZW0scmVsZWFzZSx2ZXJzaW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGxhdGZvcm0gPSBfcGxhdGZvcm0oc3lzdGVtLHJlbGVhc2UsdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc19uYW1lLG9zX3ZlcnNpb24sb3NfYXJjaCkKKworICAgIGVsaWYgc3lzdGVtID09ICdNYWNPUyc6CisgICAgICAgICMgTWFjT1MgcGxhdGZvcm1zCisgICAgICAgIGlmIHRlcnNlOgorICAgICAgICAgICAgcGxhdGZvcm0gPSBfcGxhdGZvcm0oc3lzdGVtLHJlbGVhc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwbGF0Zm9ybSA9IF9wbGF0Zm9ybShzeXN0ZW0scmVsZWFzZSxtYWNoaW5lKQorCisgICAgZWxzZToKKyAgICAgICAgIyBHZW5lcmljIGhhbmRsZXIKKyAgICAgICAgaWYgdGVyc2U6CisgICAgICAgICAgICBwbGF0Zm9ybSA9IF9wbGF0Zm9ybShzeXN0ZW0scmVsZWFzZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJpdHMsbGlua2FnZSA9IGFyY2hpdGVjdHVyZShzeXMuZXhlY3V0YWJsZSkKKyAgICAgICAgICAgIHBsYXRmb3JtID0gX3BsYXRmb3JtKHN5c3RlbSxyZWxlYXNlLG1hY2hpbmUscHJvY2Vzc29yLGJpdHMsbGlua2FnZSkKKworICAgIF9wbGF0Zm9ybV9jYWNoZVsoYWxpYXNlZCwgdGVyc2UpXSA9IHBsYXRmb3JtCisgICAgcmV0dXJuIHBsYXRmb3JtCisKKyMjIyBDb21tYW5kIGxpbmUgaW50ZXJmYWNlCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgIyBEZWZhdWx0IGlzIHRvIHByaW50IHRoZSBhbGlhc2VkIHZlcmJvc2UgcGxhdGZvcm0gc3RyaW5nCisgICAgdGVyc2UgPSAoJ3RlcnNlJyBpbiBzeXMuYXJndiBvciAnLS10ZXJzZScgaW4gc3lzLmFyZ3YpCisgICAgYWxpYXNlZCA9IChub3QgJ25vbmFsaWFzZWQnIGluIHN5cy5hcmd2IGFuZCBub3QgJy0tbm9uYWxpYXNlZCcgaW4gc3lzLmFyZ3YpCisgICAgcHJpbnQgcGxhdGZvcm0oYWxpYXNlZCx0ZXJzZSkKKyAgICBzeXMuZXhpdCgwKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0Zm9ybS5weWMgYi9saWIvcHl0aG9uMi43L3BsYXRmb3JtLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFmN2E0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0Zm9ybS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0Zm9ybS5weW8gYi9saWIvcHl0aG9uMi43L3BsYXRmb3JtLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFmN2E0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0Zm9ybS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGlzdGxpYi5weSBiL2xpYi9weXRob24yLjcvcGxpc3RsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4OTdiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxpc3RsaWIucHkKQEAgLTAsMCArMSw0NzQgQEAKK3IiIiJwbGlzdGxpYi5weSAtLSBhIHRvb2wgdG8gZ2VuZXJhdGUgYW5kIHBhcnNlIE1hY09TWCAucGxpc3QgZmlsZXMuCisKK1RoZSBQcm9wZXJ0eUxpc3QgKC5wbGlzdCkgZmlsZSBmb3JtYXQgaXMgYSBzaW1wbGUgWE1MIHBpY2tsZSBzdXBwb3J0aW5nCitiYXNpYyBvYmplY3QgdHlwZXMsIGxpa2UgZGljdGlvbmFyaWVzLCBsaXN0cywgbnVtYmVycyBhbmQgc3RyaW5ncy4KK1VzdWFsbHkgdGhlIHRvcCBsZXZlbCBvYmplY3QgaXMgYSBkaWN0aW9uYXJ5LgorCitUbyB3cml0ZSBvdXQgYSBwbGlzdCBmaWxlLCB1c2UgdGhlIHdyaXRlUGxpc3Qocm9vdE9iamVjdCwgcGF0aE9yRmlsZSkKK2Z1bmN0aW9uLiAncm9vdE9iamVjdCcgaXMgdGhlIHRvcCBsZXZlbCBvYmplY3QsICdwYXRoT3JGaWxlJyBpcyBhCitmaWxlbmFtZSBvciBhICh3cml0YWJsZSkgZmlsZSBvYmplY3QuCisKK1RvIHBhcnNlIGEgcGxpc3QgZnJvbSBhIGZpbGUsIHVzZSB0aGUgcmVhZFBsaXN0KHBhdGhPckZpbGUpIGZ1bmN0aW9uLAord2l0aCBhIGZpbGUgbmFtZSBvciBhIChyZWFkYWJsZSkgZmlsZSBvYmplY3QgYXMgdGhlIG9ubHkgYXJndW1lbnQuIEl0CityZXR1cm5zIHRoZSB0b3AgbGV2ZWwgb2JqZWN0IChhZ2FpbiwgdXN1YWxseSBhIGRpY3Rpb25hcnkpLgorCitUbyB3b3JrIHdpdGggcGxpc3QgZGF0YSBpbiBzdHJpbmdzLCB5b3UgY2FuIHVzZSByZWFkUGxpc3RGcm9tU3RyaW5nKCkKK2FuZCB3cml0ZVBsaXN0VG9TdHJpbmcoKS4KKworVmFsdWVzIGNhbiBiZSBzdHJpbmdzLCBpbnRlZ2VycywgZmxvYXRzLCBib29sZWFucywgdHVwbGVzLCBsaXN0cywKK2RpY3Rpb25hcmllcywgRGF0YSBvciBkYXRldGltZS5kYXRldGltZSBvYmplY3RzLiBTdHJpbmcgdmFsdWVzIChpbmNsdWRpbmcKK2RpY3Rpb25hcnkga2V5cykgbWF5IGJlIHVuaWNvZGUgc3RyaW5ncyAtLSB0aGV5IHdpbGwgYmUgd3JpdHRlbiBvdXQgYXMKK1VURi04LgorCitUaGUgPGRhdGE+IHBsaXN0IHR5cGUgaXMgc3VwcG9ydGVkIHRocm91Z2ggdGhlIERhdGEgY2xhc3MuIFRoaXMgaXMgYQordGhpbiB3cmFwcGVyIGFyb3VuZCBhIFB5dGhvbiBzdHJpbmcuCisKK0dlbmVyYXRlIFBsaXN0IGV4YW1wbGU6CisKKyAgICBwbCA9IGRpY3QoCisgICAgICAgIGFTdHJpbmc9IkRvb2RhaCIsCisgICAgICAgIGFMaXN0PVsiQSIsICJCIiwgMTIsIDMyLjEsIFsxLCAyLCAzXV0sCisgICAgICAgIGFGbG9hdD0wLjEsCisgICAgICAgIGFuSW50PTcyOCwKKyAgICAgICAgYURpY3Q9ZGljdCgKKyAgICAgICAgICAgIGFub3RoZXJTdHJpbmc9IjxoZWxsbyAmIGhpIHRoZXJlIT4iLAorICAgICAgICAgICAgYVVuaWNvZGVWYWx1ZT11J01ceGU0c3NpZywgTWFceGRmJywKKyAgICAgICAgICAgIGFUcnVlVmFsdWU9VHJ1ZSwKKyAgICAgICAgICAgIGFGYWxzZVZhbHVlPUZhbHNlLAorICAgICAgICApLAorICAgICAgICBzb21lRGF0YT1EYXRhKCI8YmluYXJ5IGd1bms+IiksCisgICAgICAgIHNvbWVNb3JlRGF0YT1EYXRhKCI8bG90cyBvZiBiaW5hcnkgZ3Vuaz4iICogMTApLAorICAgICAgICBhRGF0ZT1kYXRldGltZS5kYXRldGltZS5mcm9tdGltZXN0YW1wKHRpbWUubWt0aW1lKHRpbWUuZ210aW1lKCkpKSwKKyAgICApCisgICAgIyB1bmljb2RlIGtleXMgYXJlIHBvc3NpYmxlLCBidXQgYSBsaXR0bGUgYXdrd2FyZCB0byB1c2U6CisgICAgcGxbdSdceGM1YmVucmFhJ10gPSAiVGhhdCB3YXMgYSB1bmljb2RlIGtleS4iCisgICAgd3JpdGVQbGlzdChwbCwgZmlsZU5hbWUpCisKK1BhcnNlIFBsaXN0IGV4YW1wbGU6CisKKyAgICBwbCA9IHJlYWRQbGlzdChwYXRoT3JGaWxlKQorICAgIHByaW50IHBsWyJhS2V5Il0KKyIiIgorCisKK19fYWxsX18gPSBbCisgICAgInJlYWRQbGlzdCIsICJ3cml0ZVBsaXN0IiwgInJlYWRQbGlzdEZyb21TdHJpbmciLCAid3JpdGVQbGlzdFRvU3RyaW5nIiwKKyAgICAicmVhZFBsaXN0RnJvbVJlc291cmNlIiwgIndyaXRlUGxpc3RUb1Jlc291cmNlIiwKKyAgICAiUGxpc3QiLCAiRGF0YSIsICJEaWN0IgorXQorIyBOb3RlOiB0aGUgUGxpc3QgYW5kIERpY3QgY2xhc3NlcyBoYXZlIGJlZW4gZGVwcmVjYXRlZC4KKworaW1wb3J0IGJpbmFzY2lpCitpbXBvcnQgZGF0ZXRpbWUKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IHJlCitpbXBvcnQgd2FybmluZ3MKKworCitkZWYgcmVhZFBsaXN0KHBhdGhPckZpbGUpOgorICAgICIiIlJlYWQgYSAucGxpc3QgZmlsZS4gJ3BhdGhPckZpbGUnIG1heSBlaXRoZXIgYmUgYSBmaWxlIG5hbWUgb3IgYQorICAgIChyZWFkYWJsZSkgZmlsZSBvYmplY3QuIFJldHVybiB0aGUgdW5wYWNrZWQgcm9vdCBvYmplY3QgKHdoaWNoCisgICAgdXN1YWxseSBpcyBhIGRpY3Rpb25hcnkpLgorICAgICIiIgorICAgIGRpZE9wZW4gPSAwCisgICAgaWYgaXNpbnN0YW5jZShwYXRoT3JGaWxlLCAoc3RyLCB1bmljb2RlKSk6CisgICAgICAgIHBhdGhPckZpbGUgPSBvcGVuKHBhdGhPckZpbGUpCisgICAgICAgIGRpZE9wZW4gPSAxCisgICAgcCA9IFBsaXN0UGFyc2VyKCkKKyAgICByb290T2JqZWN0ID0gcC5wYXJzZShwYXRoT3JGaWxlKQorICAgIGlmIGRpZE9wZW46CisgICAgICAgIHBhdGhPckZpbGUuY2xvc2UoKQorICAgIHJldHVybiByb290T2JqZWN0CisKKworZGVmIHdyaXRlUGxpc3Qocm9vdE9iamVjdCwgcGF0aE9yRmlsZSk6CisgICAgIiIiV3JpdGUgJ3Jvb3RPYmplY3QnIHRvIGEgLnBsaXN0IGZpbGUuICdwYXRoT3JGaWxlJyBtYXkgZWl0aGVyIGJlIGEKKyAgICBmaWxlIG5hbWUgb3IgYSAod3JpdGFibGUpIGZpbGUgb2JqZWN0LgorICAgICIiIgorICAgIGRpZE9wZW4gPSAwCisgICAgaWYgaXNpbnN0YW5jZShwYXRoT3JGaWxlLCAoc3RyLCB1bmljb2RlKSk6CisgICAgICAgIHBhdGhPckZpbGUgPSBvcGVuKHBhdGhPckZpbGUsICJ3IikKKyAgICAgICAgZGlkT3BlbiA9IDEKKyAgICB3cml0ZXIgPSBQbGlzdFdyaXRlcihwYXRoT3JGaWxlKQorICAgIHdyaXRlci53cml0ZWxuKCI8cGxpc3QgdmVyc2lvbj1cIjEuMFwiPiIpCisgICAgd3JpdGVyLndyaXRlVmFsdWUocm9vdE9iamVjdCkKKyAgICB3cml0ZXIud3JpdGVsbigiPC9wbGlzdD4iKQorICAgIGlmIGRpZE9wZW46CisgICAgICAgIHBhdGhPckZpbGUuY2xvc2UoKQorCisKK2RlZiByZWFkUGxpc3RGcm9tU3RyaW5nKGRhdGEpOgorICAgICIiIlJlYWQgYSBwbGlzdCBkYXRhIGZyb20gYSBzdHJpbmcuIFJldHVybiB0aGUgcm9vdCBvYmplY3QuCisgICAgIiIiCisgICAgcmV0dXJuIHJlYWRQbGlzdChTdHJpbmdJTyhkYXRhKSkKKworCitkZWYgd3JpdGVQbGlzdFRvU3RyaW5nKHJvb3RPYmplY3QpOgorICAgICIiIlJldHVybiAncm9vdE9iamVjdCcgYXMgYSBwbGlzdC1mb3JtYXR0ZWQgc3RyaW5nLgorICAgICIiIgorICAgIGYgPSBTdHJpbmdJTygpCisgICAgd3JpdGVQbGlzdChyb290T2JqZWN0LCBmKQorICAgIHJldHVybiBmLmdldHZhbHVlKCkKKworCitkZWYgcmVhZFBsaXN0RnJvbVJlc291cmNlKHBhdGgsIHJlc3R5cGU9J3Bsc3QnLCByZXNpZD0wKToKKyAgICAiIiJSZWFkIHBsc3QgcmVzb3VyY2UgZnJvbSB0aGUgcmVzb3VyY2UgZm9yayBvZiBwYXRoLgorICAgICIiIgorICAgIHdhcm5pbmdzLndhcm5weTNrKCJJbiAzLngsIHJlYWRQbGlzdEZyb21SZXNvdXJjZSBpcyByZW1vdmVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorICAgIGZyb20gQ2FyYm9uLkZpbGUgaW1wb3J0IEZTUmVmLCBGU0dldFJlc291cmNlRm9ya05hbWUKKyAgICBmcm9tIENhcmJvbi5GaWxlcyBpbXBvcnQgZnNSZFBlcm0KKyAgICBmcm9tIENhcmJvbiBpbXBvcnQgUmVzCisgICAgZnNSZWYgPSBGU1JlZihwYXRoKQorICAgIHJlc051bSA9IFJlcy5GU09wZW5SZXNvdXJjZUZpbGUoZnNSZWYsIEZTR2V0UmVzb3VyY2VGb3JrTmFtZSgpLCBmc1JkUGVybSkKKyAgICBSZXMuVXNlUmVzRmlsZShyZXNOdW0pCisgICAgcGxpc3REYXRhID0gUmVzLkdldDFSZXNvdXJjZShyZXN0eXBlLCByZXNpZCkuZGF0YQorICAgIFJlcy5DbG9zZVJlc0ZpbGUocmVzTnVtKQorICAgIHJldHVybiByZWFkUGxpc3RGcm9tU3RyaW5nKHBsaXN0RGF0YSkKKworCitkZWYgd3JpdGVQbGlzdFRvUmVzb3VyY2Uocm9vdE9iamVjdCwgcGF0aCwgcmVzdHlwZT0ncGxzdCcsIHJlc2lkPTApOgorICAgICIiIldyaXRlICdyb290T2JqZWN0JyBhcyBhIHBsc3QgcmVzb3VyY2UgdG8gdGhlIHJlc291cmNlIGZvcmsgb2YgcGF0aC4KKyAgICAiIiIKKyAgICB3YXJuaW5ncy53YXJucHkzaygiSW4gMy54LCB3cml0ZVBsaXN0VG9SZXNvdXJjZSBpcyByZW1vdmVkLiIsIHN0YWNrbGV2ZWw9MikKKyAgICBmcm9tIENhcmJvbi5GaWxlIGltcG9ydCBGU1JlZiwgRlNHZXRSZXNvdXJjZUZvcmtOYW1lCisgICAgZnJvbSBDYXJib24uRmlsZXMgaW1wb3J0IGZzUmRXclBlcm0KKyAgICBmcm9tIENhcmJvbiBpbXBvcnQgUmVzCisgICAgcGxpc3REYXRhID0gd3JpdGVQbGlzdFRvU3RyaW5nKHJvb3RPYmplY3QpCisgICAgZnNSZWYgPSBGU1JlZihwYXRoKQorICAgIHJlc051bSA9IFJlcy5GU09wZW5SZXNvdXJjZUZpbGUoZnNSZWYsIEZTR2V0UmVzb3VyY2VGb3JrTmFtZSgpLCBmc1JkV3JQZXJtKQorICAgIFJlcy5Vc2VSZXNGaWxlKHJlc051bSkKKyAgICB0cnk6CisgICAgICAgIFJlcy5HZXQxUmVzb3VyY2UocmVzdHlwZSwgcmVzaWQpLlJlbW92ZVJlc291cmNlKCkKKyAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICBwYXNzCisgICAgcmVzID0gUmVzLlJlc291cmNlKHBsaXN0RGF0YSkKKyAgICByZXMuQWRkUmVzb3VyY2UocmVzdHlwZSwgcmVzaWQsICcnKQorICAgIHJlcy5Xcml0ZVJlc291cmNlKCkKKyAgICBSZXMuQ2xvc2VSZXNGaWxlKHJlc051bSkKKworCitjbGFzcyBEdW1iWE1MV3JpdGVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIGluZGVudExldmVsPTAsIGluZGVudD0iXHQiKToKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICBzZWxmLnN0YWNrID0gW10KKyAgICAgICAgc2VsZi5pbmRlbnRMZXZlbCA9IGluZGVudExldmVsCisgICAgICAgIHNlbGYuaW5kZW50ID0gaW5kZW50CisKKyAgICBkZWYgYmVnaW5FbGVtZW50KHNlbGYsIGVsZW1lbnQpOgorICAgICAgICBzZWxmLnN0YWNrLmFwcGVuZChlbGVtZW50KQorICAgICAgICBzZWxmLndyaXRlbG4oIjwlcz4iICUgZWxlbWVudCkKKyAgICAgICAgc2VsZi5pbmRlbnRMZXZlbCArPSAxCisKKyAgICBkZWYgZW5kRWxlbWVudChzZWxmLCBlbGVtZW50KToKKyAgICAgICAgYXNzZXJ0IHNlbGYuaW5kZW50TGV2ZWwgPiAwCisgICAgICAgIGFzc2VydCBzZWxmLnN0YWNrLnBvcCgpID09IGVsZW1lbnQKKyAgICAgICAgc2VsZi5pbmRlbnRMZXZlbCAtPSAxCisgICAgICAgIHNlbGYud3JpdGVsbigiPC8lcz4iICUgZWxlbWVudCkKKworICAgIGRlZiBzaW1wbGVFbGVtZW50KHNlbGYsIGVsZW1lbnQsIHZhbHVlPU5vbmUpOgorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHZhbHVlID0gX2VzY2FwZUFuZEVuY29kZSh2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVsbigiPCVzPiVzPC8lcz4iICUgKGVsZW1lbnQsIHZhbHVlLCBlbGVtZW50KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud3JpdGVsbigiPCVzLz4iICUgZWxlbWVudCkKKworICAgIGRlZiB3cml0ZWxuKHNlbGYsIGxpbmUpOgorICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgc2VsZi5maWxlLndyaXRlKHNlbGYuaW5kZW50TGV2ZWwgKiBzZWxmLmluZGVudCArIGxpbmUgKyAiXG4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5maWxlLndyaXRlKCJcbiIpCisKKworIyBDb250ZW50cyBzaG91bGQgY29uZm9ybSB0byBhIHN1YnNldCBvZiBJU08gODYwMQorIyAoaW4gcGFydGljdWxhciwgWVlZWSAnLScgTU0gJy0nIEREICdUJyBISCAnOicgTU0gJzonIFNTICdaJy4gIFNtYWxsZXIgdW5pdHMgbWF5IGJlIG9taXR0ZWQgd2l0aAorIyAgYSBsb3NzIG9mIHByZWNpc2lvbikKK19kYXRlUGFyc2VyID0gcmUuY29tcGlsZShyIig/UDx5ZWFyPlxkXGRcZFxkKSg/Oi0oP1A8bW9udGg+XGRcZCkoPzotKD9QPGRheT5cZFxkKSg/OlQoP1A8aG91cj5cZFxkKSg/OjooP1A8bWludXRlPlxkXGQpKD86Oig/UDxzZWNvbmQ+XGRcZCkpPyk/KT8pPyk/WiIpCisKK2RlZiBfZGF0ZUZyb21TdHJpbmcocyk6CisgICAgb3JkZXIgPSAoJ3llYXInLCAnbW9udGgnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcpCisgICAgZ2QgPSBfZGF0ZVBhcnNlci5tYXRjaChzKS5ncm91cGRpY3QoKQorICAgIGxzdCA9IFtdCisgICAgZm9yIGtleSBpbiBvcmRlcjoKKyAgICAgICAgdmFsID0gZ2Rba2V5XQorICAgICAgICBpZiB2YWwgaXMgTm9uZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGxzdC5hcHBlbmQoaW50KHZhbCkpCisgICAgcmV0dXJuIGRhdGV0aW1lLmRhdGV0aW1lKCpsc3QpCisKK2RlZiBfZGF0ZVRvU3RyaW5nKGQpOgorICAgIHJldHVybiAnJTA0ZC0lMDJkLSUwMmRUJTAyZDolMDJkOiUwMmRaJyAlICgKKyAgICAgICAgZC55ZWFyLCBkLm1vbnRoLCBkLmRheSwKKyAgICAgICAgZC5ob3VyLCBkLm1pbnV0ZSwgZC5zZWNvbmQKKyAgICApCisKKworIyBSZWdleCB0byBmaW5kIGFueSBjb250cm9sIGNoYXJzLCBleGNlcHQgZm9yIFx0IFxuIGFuZCBccgorX2NvbnRyb2xDaGFyUGF0ID0gcmUuY29tcGlsZSgKKyAgICByIltceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDBiXHgwY1x4MGVceDBmIgorICAgIHIiXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOVx4MWFceDFiXHgxY1x4MWRceDFlXHgxZl0iKQorCitkZWYgX2VzY2FwZUFuZEVuY29kZSh0ZXh0KToKKyAgICBtID0gX2NvbnRyb2xDaGFyUGF0LnNlYXJjaCh0ZXh0KQorICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInN0cmluZ3MgY2FuJ3QgY29udGFpbnMgY29udHJvbCBjaGFyYWN0ZXJzOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInVzZSBwbGlzdGxpYi5EYXRhIGluc3RlYWQiKQorICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIlxyXG4iLCAiXG4iKSAgICAgICAjIGNvbnZlcnQgRE9TIGxpbmUgZW5kaW5ncworICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIlxyIiwgIlxuIikgICAgICAgICAjIGNvbnZlcnQgTWFjIGxpbmUgZW5kaW5ncworICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIiYiLCAiJmFtcDsiKSAgICAgICAjIGVzY2FwZSAnJicKKyAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCI8IiwgIiZsdDsiKSAgICAgICAgIyBlc2NhcGUgJzwnCisgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiPiIsICImZ3Q7IikgICAgICAgICMgZXNjYXBlICc+JworICAgIHJldHVybiB0ZXh0LmVuY29kZSgidXRmLTgiKSAgICAgICAgICAgICAjIGVuY29kZSBhcyBVVEYtOAorCisKK1BMSVNUSEVBREVSID0gIiIiXAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorIiIiCisKK2NsYXNzIFBsaXN0V3JpdGVyKER1bWJYTUxXcml0ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIGluZGVudExldmVsPTAsIGluZGVudD0iXHQiLCB3cml0ZUhlYWRlcj0xKToKKyAgICAgICAgaWYgd3JpdGVIZWFkZXI6CisgICAgICAgICAgICBmaWxlLndyaXRlKFBMSVNUSEVBREVSKQorICAgICAgICBEdW1iWE1MV3JpdGVyLl9faW5pdF9fKHNlbGYsIGZpbGUsIGluZGVudExldmVsLCBpbmRlbnQpCisKKyAgICBkZWYgd3JpdGVWYWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChzdHIsIHVuaWNvZGUpKToKKyAgICAgICAgICAgIHNlbGYuc2ltcGxlRWxlbWVudCgic3RyaW5nIiwgdmFsdWUpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYm9vbCk6CisgICAgICAgICAgICAjIG11c3Qgc3dpdGNoIGZvciBib29sIGJlZm9yZSBpbnQsIGFzIGJvb2wgaXMgYQorICAgICAgICAgICAgIyBzdWJjbGFzcyBvZiBpbnQuLi4KKyAgICAgICAgICAgIGlmIHZhbHVlOgorICAgICAgICAgICAgICAgIHNlbGYuc2ltcGxlRWxlbWVudCgidHJ1ZSIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2ltcGxlRWxlbWVudCgiZmFsc2UiKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgIHNlbGYuc2ltcGxlRWxlbWVudCgiaW50ZWdlciIsICIlZCIgJSB2YWx1ZSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBmbG9hdCk6CisgICAgICAgICAgICBzZWxmLnNpbXBsZUVsZW1lbnQoInJlYWwiLCByZXByKHZhbHVlKSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKKyAgICAgICAgICAgIHNlbGYud3JpdGVEaWN0KHZhbHVlKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIERhdGEpOgorICAgICAgICAgICAgc2VsZi53cml0ZURhdGEodmFsdWUpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZGF0ZXRpbWUuZGF0ZXRpbWUpOgorICAgICAgICAgICAgc2VsZi5zaW1wbGVFbGVtZW50KCJkYXRlIiwgX2RhdGVUb1N0cmluZyh2YWx1ZSkpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKHR1cGxlLCBsaXN0KSk6CisgICAgICAgICAgICBzZWxmLndyaXRlQXJyYXkodmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInVuc3Vwb3J0ZWQgdHlwZTogJXMiICUgdHlwZSh2YWx1ZSkpCisKKyAgICBkZWYgd3JpdGVEYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmJlZ2luRWxlbWVudCgiZGF0YSIpCisgICAgICAgIHNlbGYuaW5kZW50TGV2ZWwgLT0gMQorICAgICAgICBtYXhsaW5lbGVuZ3RoID0gbWF4KDE2LCA3NiAtIGxlbihzZWxmLmluZGVudC5yZXBsYWNlKCJcdCIsICIgIiAqIDgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5kZW50TGV2ZWwpKQorICAgICAgICBmb3IgbGluZSBpbiBkYXRhLmFzQmFzZTY0KG1heGxpbmVsZW5ndGgpLnNwbGl0KCJcbiIpOgorICAgICAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlbG4obGluZSkKKyAgICAgICAgc2VsZi5pbmRlbnRMZXZlbCArPSAxCisgICAgICAgIHNlbGYuZW5kRWxlbWVudCgiZGF0YSIpCisKKyAgICBkZWYgd3JpdGVEaWN0KHNlbGYsIGQpOgorICAgICAgICBzZWxmLmJlZ2luRWxlbWVudCgiZGljdCIpCisgICAgICAgIGl0ZW1zID0gZC5pdGVtcygpCisgICAgICAgIGl0ZW1zLnNvcnQoKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBpdGVtczoKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGtleSwgKHN0ciwgdW5pY29kZSkpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigia2V5cyBtdXN0IGJlIHN0cmluZ3MiKQorICAgICAgICAgICAgc2VsZi5zaW1wbGVFbGVtZW50KCJrZXkiLCBrZXkpCisgICAgICAgICAgICBzZWxmLndyaXRlVmFsdWUodmFsdWUpCisgICAgICAgIHNlbGYuZW5kRWxlbWVudCgiZGljdCIpCisKKyAgICBkZWYgd3JpdGVBcnJheShzZWxmLCBhcnJheSk6CisgICAgICAgIHNlbGYuYmVnaW5FbGVtZW50KCJhcnJheSIpCisgICAgICAgIGZvciB2YWx1ZSBpbiBhcnJheToKKyAgICAgICAgICAgIHNlbGYud3JpdGVWYWx1ZSh2YWx1ZSkKKyAgICAgICAgc2VsZi5lbmRFbGVtZW50KCJhcnJheSIpCisKKworY2xhc3MgX0ludGVybmFsRGljdChkaWN0KToKKworICAgICMgVGhpcyBjbGFzcyBpcyBuZWVkZWQgd2hpbGUgRGljdCBpcyBzY2hlZHVsZWQgZm9yIGRlcHJlY2F0aW9uOgorICAgICMgd2Ugb25seSBuZWVkIHRvIHdhcm4gd2hlbiBhICp1c2VyKiBpbnN0YW50aWF0ZXMgRGljdCBvciB3aGVuCisgICAgIyB0aGUgImF0dHJpYnV0ZSBub3RhdGlvbiBmb3IgZGljdCBrZXlzIiBpcyB1c2VkLgorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGZbYXR0cl0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIGF0dHIKKyAgICAgICAgZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybgorICAgICAgICB3YXJuKCJBdHRyaWJ1dGUgYWNjZXNzIGZyb20gcGxpc3QgZGljdHMgaXMgZGVwcmVjYXRlZCwgdXNlIGRba2V5XSAiCisgICAgICAgICAgICAgIm5vdGF0aW9uIGluc3RlYWQiLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBhdHRyLCB2YWx1ZSk6CisgICAgICAgIGZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4KKyAgICAgICAgd2FybigiQXR0cmlidXRlIGFjY2VzcyBmcm9tIHBsaXN0IGRpY3RzIGlzIGRlcHJlY2F0ZWQsIHVzZSBkW2tleV0gIgorICAgICAgICAgICAgICJub3RhdGlvbiBpbnN0ZWFkIiwgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgMikKKyAgICAgICAgc2VsZlthdHRyXSA9IHZhbHVlCisKKyAgICBkZWYgX19kZWxhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBzZWxmW2F0dHJdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBhdHRyCisgICAgICAgIGZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4KKyAgICAgICAgd2FybigiQXR0cmlidXRlIGFjY2VzcyBmcm9tIHBsaXN0IGRpY3RzIGlzIGRlcHJlY2F0ZWQsIHVzZSBkW2tleV0gIgorICAgICAgICAgICAgICJub3RhdGlvbiBpbnN0ZWFkIiwgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgMikKKworY2xhc3MgRGljdChfSW50ZXJuYWxEaWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIGZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4KKyAgICAgICAgd2FybigiVGhlIHBsaXN0bGliLkRpY3QgY2xhc3MgaXMgZGVwcmVjYXRlZCwgdXNlIGJ1aWx0aW4gZGljdCBpbnN0ZWFkIiwKKyAgICAgICAgICAgICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgICAgICBzdXBlcihEaWN0LCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKKworCitjbGFzcyBQbGlzdChfSW50ZXJuYWxEaWN0KToKKworICAgICIiIlRoaXMgY2xhc3MgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIHJlYWRQbGlzdCgpIGFuZCB3cml0ZVBsaXN0KCkKKyAgICBmdW5jdGlvbnMgaW5zdGVhZCwgdG9nZXRoZXIgd2l0aCByZWd1bGFyIGRpY3Qgb2JqZWN0cy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIGZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4KKyAgICAgICAgd2FybigiVGhlIFBsaXN0IGNsYXNzIGlzIGRlcHJlY2F0ZWQsIHVzZSB0aGUgcmVhZFBsaXN0KCkgYW5kICIKKyAgICAgICAgICAgICAid3JpdGVQbGlzdCgpIGZ1bmN0aW9ucyBpbnN0ZWFkIiwgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgMikKKyAgICAgICAgc3VwZXIoUGxpc3QsIHNlbGYpLl9faW5pdF9fKCoqa3dhcmdzKQorCisgICAgZGVmIGZyb21GaWxlKGNscywgcGF0aE9yRmlsZSk6CisgICAgICAgICIiIkRlcHJlY2F0ZWQuIFVzZSB0aGUgcmVhZFBsaXN0KCkgZnVuY3Rpb24gaW5zdGVhZC4iIiIKKyAgICAgICAgcm9vdE9iamVjdCA9IHJlYWRQbGlzdChwYXRoT3JGaWxlKQorICAgICAgICBwbGlzdCA9IGNscygpCisgICAgICAgIHBsaXN0LnVwZGF0ZShyb290T2JqZWN0KQorICAgICAgICByZXR1cm4gcGxpc3QKKyAgICBmcm9tRmlsZSA9IGNsYXNzbWV0aG9kKGZyb21GaWxlKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIHBhdGhPckZpbGUpOgorICAgICAgICAiIiJEZXByZWNhdGVkLiBVc2UgdGhlIHdyaXRlUGxpc3QoKSBmdW5jdGlvbiBpbnN0ZWFkLiIiIgorICAgICAgICB3cml0ZVBsaXN0KHNlbGYsIHBhdGhPckZpbGUpCisKKworZGVmIF9lbmNvZGVCYXNlNjQocywgbWF4bGluZWxlbmd0aD03Nik6CisgICAgIyBjb3BpZWQgZnJvbSBiYXNlNjQuZW5jb2Rlc3RyaW5nKCksIHdpdGggYWRkZWQgbWF4bGluZWxlbmd0aCBhcmd1bWVudAorICAgIG1heGJpbnNpemUgPSAobWF4bGluZWxlbmd0aC8vNCkqMworICAgIHBpZWNlcyA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHMpLCBtYXhiaW5zaXplKToKKyAgICAgICAgY2h1bmsgPSBzW2kgOiBpICsgbWF4Ymluc2l6ZV0KKyAgICAgICAgcGllY2VzLmFwcGVuZChiaW5hc2NpaS5iMmFfYmFzZTY0KGNodW5rKSkKKyAgICByZXR1cm4gIiIuam9pbihwaWVjZXMpCisKK2NsYXNzIERhdGE6CisKKyAgICAiIiJXcmFwcGVyIGZvciBiaW5hcnkgZGF0YS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5kYXRhID0gZGF0YQorCisgICAgZGVmIGZyb21CYXNlNjQoY2xzLCBkYXRhKToKKyAgICAgICAgIyBiYXNlNjQuZGVjb2Rlc3RyaW5nIGp1c3QgY2FsbHMgYmluYXNjaWkuYTJiX2Jhc2U2NDsKKyAgICAgICAgIyBpdCBzZWVtcyBvdmVya2lsbCB0byB1c2UgYm90aCBiYXNlNjQgYW5kIGJpbmFzY2lpLgorICAgICAgICByZXR1cm4gY2xzKGJpbmFzY2lpLmEyYl9iYXNlNjQoZGF0YSkpCisgICAgZnJvbUJhc2U2NCA9IGNsYXNzbWV0aG9kKGZyb21CYXNlNjQpCisKKyAgICBkZWYgYXNCYXNlNjQoc2VsZiwgbWF4bGluZWxlbmd0aD03Nik6CisgICAgICAgIHJldHVybiBfZW5jb2RlQmFzZTY0KHNlbGYuZGF0YSwgbWF4bGluZWxlbmd0aCkKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmRhdGEsIG90aGVyLmRhdGEpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgc3RyKToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5kYXRhLCBvdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbXAoaWQoc2VsZiksIGlkKG90aGVyKSkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyglcykiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCByZXByKHNlbGYuZGF0YSkpCisKKworY2xhc3MgUGxpc3RQYXJzZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorICAgICAgICBzZWxmLmN1cnJlbnRLZXkgPSBOb25lCisgICAgICAgIHNlbGYucm9vdCA9IE5vbmUKKworICAgIGRlZiBwYXJzZShzZWxmLCBmaWxlb2JqKToKKyAgICAgICAgZnJvbSB4bWwucGFyc2Vycy5leHBhdCBpbXBvcnQgUGFyc2VyQ3JlYXRlCisgICAgICAgIHBhcnNlciA9IFBhcnNlckNyZWF0ZSgpCisgICAgICAgIHBhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyID0gc2VsZi5oYW5kbGVCZWdpbkVsZW1lbnQKKyAgICAgICAgcGFyc2VyLkVuZEVsZW1lbnRIYW5kbGVyID0gc2VsZi5oYW5kbGVFbmRFbGVtZW50CisgICAgICAgIHBhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IHNlbGYuaGFuZGxlRGF0YQorICAgICAgICBwYXJzZXIuUGFyc2VGaWxlKGZpbGVvYmopCisgICAgICAgIHJldHVybiBzZWxmLnJvb3QKKworICAgIGRlZiBoYW5kbGVCZWdpbkVsZW1lbnQoc2VsZiwgZWxlbWVudCwgYXR0cnMpOgorICAgICAgICBzZWxmLmRhdGEgPSBbXQorICAgICAgICBoYW5kbGVyID0gZ2V0YXR0cihzZWxmLCAiYmVnaW5fIiArIGVsZW1lbnQsIE5vbmUpCisgICAgICAgIGlmIGhhbmRsZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBoYW5kbGVyKGF0dHJzKQorCisgICAgZGVmIGhhbmRsZUVuZEVsZW1lbnQoc2VsZiwgZWxlbWVudCk6CisgICAgICAgIGhhbmRsZXIgPSBnZXRhdHRyKHNlbGYsICJlbmRfIiArIGVsZW1lbnQsIE5vbmUpCisgICAgICAgIGlmIGhhbmRsZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBoYW5kbGVyKCkKKworICAgIGRlZiBoYW5kbGVEYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmRhdGEuYXBwZW5kKGRhdGEpCisKKyAgICBkZWYgYWRkT2JqZWN0KHNlbGYsIHZhbHVlKToKKyAgICAgICAgaWYgc2VsZi5jdXJyZW50S2V5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zdGFja1stMV1bc2VsZi5jdXJyZW50S2V5XSA9IHZhbHVlCisgICAgICAgICAgICBzZWxmLmN1cnJlbnRLZXkgPSBOb25lCisgICAgICAgIGVsaWYgbm90IHNlbGYuc3RhY2s6CisgICAgICAgICAgICAjIHRoaXMgaXMgdGhlIHJvb3Qgb2JqZWN0CisgICAgICAgICAgICBzZWxmLnJvb3QgPSB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zdGFja1stMV0uYXBwZW5kKHZhbHVlKQorCisgICAgZGVmIGdldERhdGEoc2VsZik6CisgICAgICAgIGRhdGEgPSAiIi5qb2luKHNlbGYuZGF0YSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuZGF0YSA9IFtdCisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICAjIGVsZW1lbnQgaGFuZGxlcnMKKworICAgIGRlZiBiZWdpbl9kaWN0KHNlbGYsIGF0dHJzKToKKyAgICAgICAgZCA9IF9JbnRlcm5hbERpY3QoKQorICAgICAgICBzZWxmLmFkZE9iamVjdChkKQorICAgICAgICBzZWxmLnN0YWNrLmFwcGVuZChkKQorICAgIGRlZiBlbmRfZGljdChzZWxmKToKKyAgICAgICAgc2VsZi5zdGFjay5wb3AoKQorCisgICAgZGVmIGVuZF9rZXkoc2VsZik6CisgICAgICAgIHNlbGYuY3VycmVudEtleSA9IHNlbGYuZ2V0RGF0YSgpCisKKyAgICBkZWYgYmVnaW5fYXJyYXkoc2VsZiwgYXR0cnMpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5hZGRPYmplY3QoYSkKKyAgICAgICAgc2VsZi5zdGFjay5hcHBlbmQoYSkKKyAgICBkZWYgZW5kX2FycmF5KHNlbGYpOgorICAgICAgICBzZWxmLnN0YWNrLnBvcCgpCisKKyAgICBkZWYgZW5kX3RydWUoc2VsZik6CisgICAgICAgIHNlbGYuYWRkT2JqZWN0KFRydWUpCisgICAgZGVmIGVuZF9mYWxzZShzZWxmKToKKyAgICAgICAgc2VsZi5hZGRPYmplY3QoRmFsc2UpCisgICAgZGVmIGVuZF9pbnRlZ2VyKHNlbGYpOgorICAgICAgICBzZWxmLmFkZE9iamVjdChpbnQoc2VsZi5nZXREYXRhKCkpKQorICAgIGRlZiBlbmRfcmVhbChzZWxmKToKKyAgICAgICAgc2VsZi5hZGRPYmplY3QoZmxvYXQoc2VsZi5nZXREYXRhKCkpKQorICAgIGRlZiBlbmRfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFkZE9iamVjdChzZWxmLmdldERhdGEoKSkKKyAgICBkZWYgZW5kX2RhdGEoc2VsZik6CisgICAgICAgIHNlbGYuYWRkT2JqZWN0KERhdGEuZnJvbUJhc2U2NChzZWxmLmdldERhdGEoKSkpCisgICAgZGVmIGVuZF9kYXRlKHNlbGYpOgorICAgICAgICBzZWxmLmFkZE9iamVjdChfZGF0ZUZyb21TdHJpbmcoc2VsZi5nZXREYXRhKCkpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGlzdGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3BsaXN0bGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGM2MDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGlzdGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGlzdGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3BsaXN0bGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDdlZGQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGlzdGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wb3BlbjIucHkgYi9saWIvcHl0aG9uMi43L3BvcGVuMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjc2OWY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wb3BlbjIucHkKQEAgLTAsMCArMSwyMDEgQEAKKyIiIlNwYXduIGEgY29tbWFuZCB3aXRoIHBpcGVzIHRvIGl0cyBzdGRpbiwgc3Rkb3V0LCBhbmQgb3B0aW9uYWxseSBzdGRlcnIuCisKK1RoZSBub3JtYWwgb3MucG9wZW4oY21kLCBtb2RlKSBjYWxsIHNwYXducyBhIHNoZWxsIGNvbW1hbmQgYW5kIHByb3ZpZGVzIGEKK2ZpbGUgaW50ZXJmYWNlIHRvIGp1c3QgdGhlIGlucHV0IG9yIG91dHB1dCBvZiB0aGUgcHJvY2VzcyBkZXBlbmRpbmcgb24KK3doZXRoZXIgbW9kZSBpcyAncicgb3IgJ3cnLiAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgdGhlIGZ1bmN0aW9ucyBwb3BlbjIoY21kKQorYW5kIHBvcGVuMyhjbWQpIHdoaWNoIHJldHVybiB0d28gb3IgdGhyZWUgcGlwZXMgdG8gdGhlIHNwYXduZWQgY29tbWFuZC4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3Mud2FybigiVGhlIHBvcGVuMiBtb2R1bGUgaXMgZGVwcmVjYXRlZC4gIFVzZSB0aGUgc3VicHJvY2VzcyBtb2R1bGUuIiwKKyAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisKK19fYWxsX18gPSBbInBvcGVuMiIsICJwb3BlbjMiLCAicG9wZW40Il0KKwordHJ5OgorICAgIE1BWEZEID0gb3Muc3lzY29uZignU0NfT1BFTl9NQVgnKQorZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgTUFYRkQgPSAyNTYKKworX2FjdGl2ZSA9IFtdCisKK2RlZiBfY2xlYW51cCgpOgorICAgIGZvciBpbnN0IGluIF9hY3RpdmVbOl06CisgICAgICAgIGlmIGluc3QucG9sbChfZGVhZHN0YXRlPXN5cy5tYXhpbnQpID49IDA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX2FjdGl2ZS5yZW1vdmUoaW5zdCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICMgVGhpcyBjYW4gaGFwcGVuIGlmIHR3byB0aHJlYWRzIGNyZWF0ZSBhIG5ldyBQb3BlbiBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICAjIEl0J3MgaGFybWxlc3MgdGhhdCBpdCB3YXMgYWxyZWFkeSByZW1vdmVkLCBzbyBpZ25vcmUuCisgICAgICAgICAgICAgICAgcGFzcworCitjbGFzcyBQb3BlbjM6CisgICAgIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGEgY2hpbGQgcHJvY2Vzcy4gIE5vcm1hbGx5LCBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQKKyAgICBpbnRlcm5hbGx5IGJ5IHRoZSBmdW5jdGlvbnMgcG9wZW4yKCkgYW5kIHBvcGVuMygpLiIiIgorCisgICAgc3RzID0gLTEgICAgICAgICAgICAgICAgICAgICMgQ2hpbGQgbm90IGNvbXBsZXRlZCB5ZXQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbWQsIGNhcHR1cmVzdGRlcnI9RmFsc2UsIGJ1ZnNpemU9LTEpOgorICAgICAgICAiIiJUaGUgcGFyYW1ldGVyICdjbWQnIGlzIHRoZSBzaGVsbCBjb21tYW5kIHRvIGV4ZWN1dGUgaW4gYQorICAgICAgICBzdWItcHJvY2Vzcy4gIE9uIFVOSVgsICdjbWQnIG1heSBiZSBhIHNlcXVlbmNlLCBpbiB3aGljaCBjYXNlIGFyZ3VtZW50cworICAgICAgICB3aWxsIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgcHJvZ3JhbSB3aXRob3V0IHNoZWxsIGludGVydmVudGlvbiAoYXMKKyAgICAgICAgd2l0aCBvcy5zcGF3bnYoKSkuICBJZiAnY21kJyBpcyBhIHN0cmluZyBpdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc2hlbGwKKyAgICAgICAgKGFzIHdpdGggb3Muc3lzdGVtKCkpLiAgIFRoZSAnY2FwdHVyZXN0ZGVycicgZmxhZywgaWYgdHJ1ZSwgc3BlY2lmaWVzCisgICAgICAgIHRoYXQgdGhlIG9iamVjdCBzaG91bGQgY2FwdHVyZSBzdGFuZGFyZCBlcnJvciBvdXRwdXQgb2YgdGhlIGNoaWxkCisgICAgICAgIHByb2Nlc3MuICBUaGUgZGVmYXVsdCBpcyBmYWxzZS4gIElmIHRoZSAnYnVmc2l6ZScgcGFyYW1ldGVyIGlzCisgICAgICAgIHNwZWNpZmllZCwgaXQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBJL08gYnVmZmVycyB0by9mcm9tIHRoZSBjaGlsZAorICAgICAgICBwcm9jZXNzLiIiIgorICAgICAgICBfY2xlYW51cCgpCisgICAgICAgIHNlbGYuY21kID0gY21kCisgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlID0gb3MucGlwZSgpCisgICAgICAgIGMycHJlYWQsIGMycHdyaXRlID0gb3MucGlwZSgpCisgICAgICAgIGlmIGNhcHR1cmVzdGRlcnI6CisgICAgICAgICAgICBlcnJvdXQsIGVycmluID0gb3MucGlwZSgpCisgICAgICAgIHNlbGYucGlkID0gb3MuZm9yaygpCisgICAgICAgIGlmIHNlbGYucGlkID09IDA6CisgICAgICAgICAgICAjIENoaWxkCisgICAgICAgICAgICBvcy5kdXAyKHAyY3JlYWQsIDApCisgICAgICAgICAgICBvcy5kdXAyKGMycHdyaXRlLCAxKQorICAgICAgICAgICAgaWYgY2FwdHVyZXN0ZGVycjoKKyAgICAgICAgICAgICAgICBvcy5kdXAyKGVycmluLCAyKQorICAgICAgICAgICAgc2VsZi5fcnVuX2NoaWxkKGNtZCkKKyAgICAgICAgb3MuY2xvc2UocDJjcmVhZCkKKyAgICAgICAgc2VsZi50b2NoaWxkID0gb3MuZmRvcGVuKHAyY3dyaXRlLCAndycsIGJ1ZnNpemUpCisgICAgICAgIG9zLmNsb3NlKGMycHdyaXRlKQorICAgICAgICBzZWxmLmZyb21jaGlsZCA9IG9zLmZkb3BlbihjMnByZWFkLCAncicsIGJ1ZnNpemUpCisgICAgICAgIGlmIGNhcHR1cmVzdGRlcnI6CisgICAgICAgICAgICBvcy5jbG9zZShlcnJpbikKKyAgICAgICAgICAgIHNlbGYuY2hpbGRlcnIgPSBvcy5mZG9wZW4oZXJyb3V0LCAncicsIGJ1ZnNpemUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNoaWxkZXJyID0gTm9uZQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICMgSW4gY2FzZSB0aGUgY2hpbGQgaGFzbid0IGJlZW4gd2FpdGVkIG9uLCBjaGVjayBpZiBpdCdzIGRvbmUuCisgICAgICAgIHNlbGYucG9sbChfZGVhZHN0YXRlPXN5cy5tYXhpbnQpCisgICAgICAgIGlmIHNlbGYuc3RzIDwgMDoKKyAgICAgICAgICAgIGlmIF9hY3RpdmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBDaGlsZCBpcyBzdGlsbCBydW5uaW5nLCBrZWVwIHVzIGFsaXZlIHVudGlsIHdlIGNhbiB3YWl0IG9uIGl0LgorICAgICAgICAgICAgICAgIF9hY3RpdmUuYXBwZW5kKHNlbGYpCisKKyAgICBkZWYgX3J1bl9jaGlsZChzZWxmLCBjbWQpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGNtZCwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBjbWQgPSBbJy9iaW4vc2gnLCAnLWMnLCBjbWRdCisgICAgICAgIG9zLmNsb3NlcmFuZ2UoMywgTUFYRkQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmV4ZWN2cChjbWRbMF0sIGNtZCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLl9leGl0KDEpCisKKyAgICBkZWYgcG9sbChzZWxmLCBfZGVhZHN0YXRlPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzIGlmIGl0IGhhcyBmaW5pc2hlZCwKKyAgICAgICAgb3IgLTEgaWYgaXQgaGFzbid0IGZpbmlzaGVkIHlldC4iIiIKKyAgICAgICAgaWYgc2VsZi5zdHMgPCAwOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBpZCwgc3RzID0gb3Mud2FpdHBpZChzZWxmLnBpZCwgb3MuV05PSEFORykKKyAgICAgICAgICAgICAgICAjIHBpZCB3aWxsIGJlIDAgaWYgc2VsZi5waWQgaGFzbid0IHRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICBpZiBwaWQgPT0gc2VsZi5waWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RzID0gc3RzCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgaWYgX2RlYWRzdGF0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHMgPSBfZGVhZHN0YXRlCisgICAgICAgIHJldHVybiBzZWxmLnN0cworCisgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgICIiIldhaXQgZm9yIGFuZCByZXR1cm4gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzLiIiIgorICAgICAgICBpZiBzZWxmLnN0cyA8IDA6CisgICAgICAgICAgICBwaWQsIHN0cyA9IG9zLndhaXRwaWQoc2VsZi5waWQsIDApCisgICAgICAgICAgICAjIFRoaXMgdXNlZCB0byBiZSBhIHRlc3QsIGJ1dCBpdCBpcyBiZWxpZXZlZCB0byBiZQorICAgICAgICAgICAgIyBhbHdheXMgdHJ1ZSwgc28gSSBjaGFuZ2VkIGl0IHRvIGFuIGFzc2VydGlvbiAtIG12bAorICAgICAgICAgICAgYXNzZXJ0IHBpZCA9PSBzZWxmLnBpZAorICAgICAgICAgICAgc2VsZi5zdHMgPSBzdHMKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RzCisKKworY2xhc3MgUG9wZW40KFBvcGVuMyk6CisgICAgY2hpbGRlcnIgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY21kLCBidWZzaXplPS0xKToKKyAgICAgICAgX2NsZWFudXAoKQorICAgICAgICBzZWxmLmNtZCA9IGNtZAorICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSA9IG9zLnBpcGUoKQorICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSA9IG9zLnBpcGUoKQorICAgICAgICBzZWxmLnBpZCA9IG9zLmZvcmsoKQorICAgICAgICBpZiBzZWxmLnBpZCA9PSAwOgorICAgICAgICAgICAgIyBDaGlsZAorICAgICAgICAgICAgb3MuZHVwMihwMmNyZWFkLCAwKQorICAgICAgICAgICAgb3MuZHVwMihjMnB3cml0ZSwgMSkKKyAgICAgICAgICAgIG9zLmR1cDIoYzJwd3JpdGUsIDIpCisgICAgICAgICAgICBzZWxmLl9ydW5fY2hpbGQoY21kKQorICAgICAgICBvcy5jbG9zZShwMmNyZWFkKQorICAgICAgICBzZWxmLnRvY2hpbGQgPSBvcy5mZG9wZW4ocDJjd3JpdGUsICd3JywgYnVmc2l6ZSkKKyAgICAgICAgb3MuY2xvc2UoYzJwd3JpdGUpCisgICAgICAgIHNlbGYuZnJvbWNoaWxkID0gb3MuZmRvcGVuKGMycHJlYWQsICdyJywgYnVmc2l6ZSkKKworCitpZiBzeXMucGxhdGZvcm1bOjNdID09ICJ3aW4iIG9yIHN5cy5wbGF0Zm9ybSA9PSAib3MyZW14IjoKKyAgICAjIFNvbWUgdGhpbmdzIGRvbid0IG1ha2Ugc2Vuc2Ugb24gbm9uLVVuaXggcGxhdGZvcm1zLgorICAgIGRlbCBQb3BlbjMsIFBvcGVuNAorCisgICAgZGVmIHBvcGVuMihjbWQsIGJ1ZnNpemU9LTEsIG1vZGU9J3QnKToKKyAgICAgICAgIiIiRXhlY3V0ZSB0aGUgc2hlbGwgY29tbWFuZCAnY21kJyBpbiBhIHN1Yi1wcm9jZXNzLiBPbiBVTklYLCAnY21kJyBtYXkKKyAgICAgICAgYmUgYSBzZXF1ZW5jZSwgaW4gd2hpY2ggY2FzZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlCisgICAgICAgIHByb2dyYW0gd2l0aG91dCBzaGVsbCBpbnRlcnZlbnRpb24gKGFzIHdpdGggb3Muc3Bhd252KCkpLiBJZiAnY21kJyBpcyBhCisgICAgICAgIHN0cmluZyBpdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc2hlbGwgKGFzIHdpdGggb3Muc3lzdGVtKCkpLiBJZgorICAgICAgICAnYnVmc2l6ZScgaXMgc3BlY2lmaWVkLCBpdCBzZXRzIHRoZSBidWZmZXIgc2l6ZSBmb3IgdGhlIEkvTyBwaXBlcy4gVGhlCisgICAgICAgIGZpbGUgb2JqZWN0cyAoY2hpbGRfc3Rkb3V0LCBjaGlsZF9zdGRpbikgYXJlIHJldHVybmVkLiIiIgorICAgICAgICB3LCByID0gb3MucG9wZW4yKGNtZCwgbW9kZSwgYnVmc2l6ZSkKKyAgICAgICAgcmV0dXJuIHIsIHcKKworICAgIGRlZiBwb3BlbjMoY21kLCBidWZzaXplPS0xLCBtb2RlPSd0Jyk6CisgICAgICAgICIiIkV4ZWN1dGUgdGhlIHNoZWxsIGNvbW1hbmQgJ2NtZCcgaW4gYSBzdWItcHJvY2Vzcy4gT24gVU5JWCwgJ2NtZCcgbWF5CisgICAgICAgIGJlIGEgc2VxdWVuY2UsIGluIHdoaWNoIGNhc2UgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZQorICAgICAgICBwcm9ncmFtIHdpdGhvdXQgc2hlbGwgaW50ZXJ2ZW50aW9uIChhcyB3aXRoIG9zLnNwYXdudigpKS4gSWYgJ2NtZCcgaXMgYQorICAgICAgICBzdHJpbmcgaXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHNoZWxsIChhcyB3aXRoIG9zLnN5c3RlbSgpKS4gSWYKKyAgICAgICAgJ2J1ZnNpemUnIGlzIHNwZWNpZmllZCwgaXQgc2V0cyB0aGUgYnVmZmVyIHNpemUgZm9yIHRoZSBJL08gcGlwZXMuIFRoZQorICAgICAgICBmaWxlIG9iamVjdHMgKGNoaWxkX3N0ZG91dCwgY2hpbGRfc3RkaW4sIGNoaWxkX3N0ZGVycikgYXJlIHJldHVybmVkLiIiIgorICAgICAgICB3LCByLCBlID0gb3MucG9wZW4zKGNtZCwgbW9kZSwgYnVmc2l6ZSkKKyAgICAgICAgcmV0dXJuIHIsIHcsIGUKKworICAgIGRlZiBwb3BlbjQoY21kLCBidWZzaXplPS0xLCBtb2RlPSd0Jyk6CisgICAgICAgICIiIkV4ZWN1dGUgdGhlIHNoZWxsIGNvbW1hbmQgJ2NtZCcgaW4gYSBzdWItcHJvY2Vzcy4gT24gVU5JWCwgJ2NtZCcgbWF5CisgICAgICAgIGJlIGEgc2VxdWVuY2UsIGluIHdoaWNoIGNhc2UgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZQorICAgICAgICBwcm9ncmFtIHdpdGhvdXQgc2hlbGwgaW50ZXJ2ZW50aW9uIChhcyB3aXRoIG9zLnNwYXdudigpKS4gSWYgJ2NtZCcgaXMgYQorICAgICAgICBzdHJpbmcgaXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHNoZWxsIChhcyB3aXRoIG9zLnN5c3RlbSgpKS4gSWYKKyAgICAgICAgJ2J1ZnNpemUnIGlzIHNwZWNpZmllZCwgaXQgc2V0cyB0aGUgYnVmZmVyIHNpemUgZm9yIHRoZSBJL08gcGlwZXMuIFRoZQorICAgICAgICBmaWxlIG9iamVjdHMgKGNoaWxkX3N0ZG91dF9zdGRlcnIsIGNoaWxkX3N0ZGluKSBhcmUgcmV0dXJuZWQuIiIiCisgICAgICAgIHcsIHIgPSBvcy5wb3BlbjQoY21kLCBtb2RlLCBidWZzaXplKQorICAgICAgICByZXR1cm4gciwgdworZWxzZToKKyAgICBkZWYgcG9wZW4yKGNtZCwgYnVmc2l6ZT0tMSwgbW9kZT0ndCcpOgorICAgICAgICAiIiJFeGVjdXRlIHRoZSBzaGVsbCBjb21tYW5kICdjbWQnIGluIGEgc3ViLXByb2Nlc3MuIE9uIFVOSVgsICdjbWQnIG1heQorICAgICAgICBiZSBhIHNlcXVlbmNlLCBpbiB3aGljaCBjYXNlIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUKKyAgICAgICAgcHJvZ3JhbSB3aXRob3V0IHNoZWxsIGludGVydmVudGlvbiAoYXMgd2l0aCBvcy5zcGF3bnYoKSkuIElmICdjbWQnIGlzIGEKKyAgICAgICAgc3RyaW5nIGl0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzaGVsbCAoYXMgd2l0aCBvcy5zeXN0ZW0oKSkuIElmCisgICAgICAgICdidWZzaXplJyBpcyBzcGVjaWZpZWQsIGl0IHNldHMgdGhlIGJ1ZmZlciBzaXplIGZvciB0aGUgSS9PIHBpcGVzLiBUaGUKKyAgICAgICAgZmlsZSBvYmplY3RzIChjaGlsZF9zdGRvdXQsIGNoaWxkX3N0ZGluKSBhcmUgcmV0dXJuZWQuIiIiCisgICAgICAgIGluc3QgPSBQb3BlbjMoY21kLCBGYWxzZSwgYnVmc2l6ZSkKKyAgICAgICAgcmV0dXJuIGluc3QuZnJvbWNoaWxkLCBpbnN0LnRvY2hpbGQKKworICAgIGRlZiBwb3BlbjMoY21kLCBidWZzaXplPS0xLCBtb2RlPSd0Jyk6CisgICAgICAgICIiIkV4ZWN1dGUgdGhlIHNoZWxsIGNvbW1hbmQgJ2NtZCcgaW4gYSBzdWItcHJvY2Vzcy4gT24gVU5JWCwgJ2NtZCcgbWF5CisgICAgICAgIGJlIGEgc2VxdWVuY2UsIGluIHdoaWNoIGNhc2UgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZQorICAgICAgICBwcm9ncmFtIHdpdGhvdXQgc2hlbGwgaW50ZXJ2ZW50aW9uIChhcyB3aXRoIG9zLnNwYXdudigpKS4gSWYgJ2NtZCcgaXMgYQorICAgICAgICBzdHJpbmcgaXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHNoZWxsIChhcyB3aXRoIG9zLnN5c3RlbSgpKS4gSWYKKyAgICAgICAgJ2J1ZnNpemUnIGlzIHNwZWNpZmllZCwgaXQgc2V0cyB0aGUgYnVmZmVyIHNpemUgZm9yIHRoZSBJL08gcGlwZXMuIFRoZQorICAgICAgICBmaWxlIG9iamVjdHMgKGNoaWxkX3N0ZG91dCwgY2hpbGRfc3RkaW4sIGNoaWxkX3N0ZGVycikgYXJlIHJldHVybmVkLiIiIgorICAgICAgICBpbnN0ID0gUG9wZW4zKGNtZCwgVHJ1ZSwgYnVmc2l6ZSkKKyAgICAgICAgcmV0dXJuIGluc3QuZnJvbWNoaWxkLCBpbnN0LnRvY2hpbGQsIGluc3QuY2hpbGRlcnIKKworICAgIGRlZiBwb3BlbjQoY21kLCBidWZzaXplPS0xLCBtb2RlPSd0Jyk6CisgICAgICAgICIiIkV4ZWN1dGUgdGhlIHNoZWxsIGNvbW1hbmQgJ2NtZCcgaW4gYSBzdWItcHJvY2Vzcy4gT24gVU5JWCwgJ2NtZCcgbWF5CisgICAgICAgIGJlIGEgc2VxdWVuY2UsIGluIHdoaWNoIGNhc2UgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZQorICAgICAgICBwcm9ncmFtIHdpdGhvdXQgc2hlbGwgaW50ZXJ2ZW50aW9uIChhcyB3aXRoIG9zLnNwYXdudigpKS4gSWYgJ2NtZCcgaXMgYQorICAgICAgICBzdHJpbmcgaXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHNoZWxsIChhcyB3aXRoIG9zLnN5c3RlbSgpKS4gSWYKKyAgICAgICAgJ2J1ZnNpemUnIGlzIHNwZWNpZmllZCwgaXQgc2V0cyB0aGUgYnVmZmVyIHNpemUgZm9yIHRoZSBJL08gcGlwZXMuIFRoZQorICAgICAgICBmaWxlIG9iamVjdHMgKGNoaWxkX3N0ZG91dF9zdGRlcnIsIGNoaWxkX3N0ZGluKSBhcmUgcmV0dXJuZWQuIiIiCisgICAgICAgIGluc3QgPSBQb3BlbjQoY21kLCBidWZzaXplKQorICAgICAgICByZXR1cm4gaW5zdC5mcm9tY2hpbGQsIGluc3QudG9jaGlsZAorCisgICAgX19hbGxfXy5leHRlbmQoWyJQb3BlbjMiLCAiUG9wZW40Il0pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BvcGVuMi5weWMgYi9saWIvcHl0aG9uMi43L3BvcGVuMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyYjczOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcG9wZW4yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BvcGVuMi5weW8gYi9saWIvcHl0aG9uMi43L3BvcGVuMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmZmYyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcG9wZW4yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BvcGxpYi5weSBiL2xpYi9weXRob24yLjcvcG9wbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYjMzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BvcGxpYi5weQpAQCAtMCwwICsxLDQxNyBAQAorIiIiQSBQT1AzIGNsaWVudCBjbGFzcy4KKworQmFzZWQgb24gdGhlIEouIE15ZXJzIFBPUDMgZHJhZnQsIEphbi4gOTYKKyIiIgorCisjIEF1dGhvcjogRGF2aWQgQXNjaGVyIDxkYXZpZF9hc2NoZXJAYnJvd24uZWR1PgorIyAgICAgICAgIFtoZWF2aWx5IHN0ZWFsaW5nIGZyb20gbm50cGxpYi5weV0KKyMgVXBkYXRlZDogUGllcnMgTGF1ZGVyIDxwaWVyc0Bjcy5zdS5vei5hdT4gW0p1bCAnOTddCisjIFN0cmluZyBtZXRob2QgY29udmVyc2lvbiBhbmQgdGVzdCBqaWcgaW1wcm92ZW1lbnRzIGJ5IEVTUiwgRmVicnVhcnkgMjAwMS4KKyMgQWRkZWQgdGhlIFBPUDNfU1NMIGNsYXNzLiBNZXRob2RzIGxvb3NlbHkgYmFzZWQgb24gSU1BUF9TU0wuIEhlY3RvciBVcnR1YmlhIDx1cnR1YmlhQG1yYm9vay5vcmc+IEF1ZyAyMDAzCisKKyMgRXhhbXBsZSAoc2VlIHRoZSB0ZXN0IGZ1bmN0aW9uIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlKQorCisjIEltcG9ydHMKKworaW1wb3J0IHJlLCBzb2NrZXQKKworX19hbGxfXyA9IFsiUE9QMyIsImVycm9yX3Byb3RvIl0KKworIyBFeGNlcHRpb24gcmFpc2VkIHdoZW4gYW4gZXJyb3Igb3IgaW52YWxpZCByZXNwb25zZSBpcyByZWNlaXZlZDoKKworY2xhc3MgZXJyb3JfcHJvdG8oRXhjZXB0aW9uKTogcGFzcworCisjIFN0YW5kYXJkIFBvcnQKK1BPUDNfUE9SVCA9IDExMAorCisjIFBPUCBTU0wgUE9SVAorUE9QM19TU0xfUE9SVCA9IDk5NQorCisjIExpbmUgdGVybWluYXRvcnMgKHdlIGFsd2F5cyBvdXRwdXQgQ1JMRiwgYnV0IGFjY2VwdCBhbnkgb2YgQ1JMRiwgTEZDUiwgTEYpCitDUiA9ICdccicKK0xGID0gJ1xuJworQ1JMRiA9IENSK0xGCisKKworY2xhc3MgUE9QMzoKKworICAgICIiIlRoaXMgY2xhc3Mgc3VwcG9ydHMgYm90aCB0aGUgbWluaW1hbCBhbmQgb3B0aW9uYWwgY29tbWFuZCBzZXRzLgorICAgIEFyZ3VtZW50cyBjYW4gYmUgc3RyaW5ncyBvciBpbnRlZ2VycyAod2hlcmUgYXBwcm9wcmlhdGUpCisgICAgKGUuZy46IHJldHIoMSkgYW5kIHJldHIoJzEnKSBib3RoIHdvcmsgZXF1YWxseSB3ZWxsLgorCisgICAgTWluaW1hbCBDb21tYW5kIFNldDoKKyAgICAgICAgICAgIFVTRVIgbmFtZSAgICAgICAgICAgICAgIHVzZXIobmFtZSkKKyAgICAgICAgICAgIFBBU1Mgc3RyaW5nICAgICAgICAgICAgIHBhc3NfKHN0cmluZykKKyAgICAgICAgICAgIFNUQVQgICAgICAgICAgICAgICAgICAgIHN0YXQoKQorICAgICAgICAgICAgTElTVCBbbXNnXSAgICAgICAgICAgICAgbGlzdChtc2cgPSBOb25lKQorICAgICAgICAgICAgUkVUUiBtc2cgICAgICAgICAgICAgICAgcmV0cihtc2cpCisgICAgICAgICAgICBERUxFIG1zZyAgICAgICAgICAgICAgICBkZWxlKG1zZykKKyAgICAgICAgICAgIE5PT1AgICAgICAgICAgICAgICAgICAgIG5vb3AoKQorICAgICAgICAgICAgUlNFVCAgICAgICAgICAgICAgICAgICAgcnNldCgpCisgICAgICAgICAgICBRVUlUICAgICAgICAgICAgICAgICAgICBxdWl0KCkKKworICAgIE9wdGlvbmFsIENvbW1hbmRzIChzb21lIHNlcnZlcnMgc3VwcG9ydCB0aGVzZSk6CisgICAgICAgICAgICBSUE9QIG5hbWUgICAgICAgICAgICAgICBycG9wKG5hbWUpCisgICAgICAgICAgICBBUE9QIG5hbWUgZGlnZXN0ICAgICAgICBhcG9wKG5hbWUsIGRpZ2VzdCkKKyAgICAgICAgICAgIFRPUCBtc2cgbiAgICAgICAgICAgICAgIHRvcChtc2csIG4pCisgICAgICAgICAgICBVSURMIFttc2ddICAgICAgICAgICAgICB1aWRsKG1zZyA9IE5vbmUpCisKKyAgICBSYWlzZXMgb25lIGV4Y2VwdGlvbjogJ2Vycm9yX3Byb3RvJy4KKworICAgIEluc3RhbnRpYXRlIHdpdGg6CisgICAgICAgICAgICBQT1AzKGhvc3RuYW1lLCBwb3J0PTExMCkKKworICAgIE5COiAgICAgdGhlIFBPUCBwcm90b2NvbCBsb2NrcyB0aGUgbWFpbGJveCBmcm9tIHVzZXIKKyAgICAgICAgICAgIGF1dGhvcml6YXRpb24gdW50aWwgUVVJVCwgc28gYmUgc3VyZSB0byBnZXQgaW4sIHN1Y2sKKyAgICAgICAgICAgIHRoZSBtZXNzYWdlcywgYW5kIHF1aXQsIGVhY2ggdGltZSB5b3UgYWNjZXNzIHRoZQorICAgICAgICAgICAgbWFpbGJveC4KKworICAgICAgICAgICAgUE9QIGlzIGEgbGluZS1iYXNlZCBwcm90b2NvbCwgd2hpY2ggbWVhbnMgbGFyZ2UgbWFpbAorICAgICAgICAgICAgbWVzc2FnZXMgY29uc3VtZSBsb3RzIG9mIHB5dGhvbiBjeWNsZXMgcmVhZGluZyB0aGVtCisgICAgICAgICAgICBsaW5lLWJ5LWxpbmUuCisKKyAgICAgICAgICAgIElmIGl0J3MgYXZhaWxhYmxlIG9uIHlvdXIgbWFpbCBzZXJ2ZXIsIHVzZSBJTUFQNAorICAgICAgICAgICAgaW5zdGVhZCwgaXQgZG9lc24ndCBzdWZmZXIgZnJvbSB0aGUgdHdvIHByb2JsZW1zCisgICAgICAgICAgICBhYm92ZS4KKyAgICAiIiIKKworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQ9UE9QM19QT1JULAorICAgICAgICAgICAgICAgICB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCk6CisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKGhvc3QsIHBvcnQpLCB0aW1lb3V0KQorICAgICAgICBzZWxmLmZpbGUgPSBzZWxmLnNvY2subWFrZWZpbGUoJ3JiJykKKyAgICAgICAgc2VsZi5fZGVidWdnaW5nID0gMAorICAgICAgICBzZWxmLndlbGNvbWUgPSBzZWxmLl9nZXRyZXNwKCkKKworCisgICAgZGVmIF9wdXRsaW5lKHNlbGYsIGxpbmUpOgorICAgICAgICBpZiBzZWxmLl9kZWJ1Z2dpbmcgPiAxOiBwcmludCAnKnB1dConLCByZXByKGxpbmUpCisgICAgICAgIHNlbGYuc29jay5zZW5kYWxsKCclcyVzJyAlIChsaW5lLCBDUkxGKSkKKworCisgICAgIyBJbnRlcm5hbDogc2VuZCBvbmUgY29tbWFuZCB0byB0aGUgc2VydmVyICh0aHJvdWdoIF9wdXRsaW5lKCkpCisKKyAgICBkZWYgX3B1dGNtZChzZWxmLCBsaW5lKToKKyAgICAgICAgaWYgc2VsZi5fZGVidWdnaW5nOiBwcmludCAnKmNtZConLCByZXByKGxpbmUpCisgICAgICAgIHNlbGYuX3B1dGxpbmUobGluZSkKKworCisgICAgIyBJbnRlcm5hbDogcmV0dXJuIG9uZSBsaW5lIGZyb20gdGhlIHNlcnZlciwgc3RyaXBwaW5nIENSTEYuCisgICAgIyBUaGlzIGlzIHdoZXJlIGFsbCB0aGUgQ1BVIHRpbWUgb2YgdGhpcyBtb2R1bGUgaXMgY29uc3VtZWQuCisgICAgIyBSYWlzZSBlcnJvcl9wcm90bygnLUVSUiBFT0YnKSBpZiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisKKyAgICBkZWYgX2dldGxpbmUoc2VsZik6CisgICAgICAgIGxpbmUgPSBzZWxmLmZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBzZWxmLl9kZWJ1Z2dpbmcgPiAxOiBwcmludCAnKmdldConLCByZXByKGxpbmUpCisgICAgICAgIGlmIG5vdCBsaW5lOiByYWlzZSBlcnJvcl9wcm90bygnLUVSUiBFT0YnKQorICAgICAgICBvY3RldHMgPSBsZW4obGluZSkKKyAgICAgICAgIyBzZXJ2ZXIgY2FuIHNlbmQgYW55IGNvbWJpbmF0aW9uIG9mIENSICYgTEYKKyAgICAgICAgIyBob3dldmVyLCAncmVhZGxpbmUoKScgcmV0dXJucyBsaW5lcyBlbmRpbmcgaW4gTEYKKyAgICAgICAgIyBzbyBvbmx5IHBvc3NpYmlsaXRpZXMgYXJlIC4uLkxGLCAuLi5DUkxGLCBDUi4uLkxGCisgICAgICAgIGlmIGxpbmVbLTI6XSA9PSBDUkxGOgorICAgICAgICAgICAgcmV0dXJuIGxpbmVbOi0yXSwgb2N0ZXRzCisgICAgICAgIGlmIGxpbmVbMF0gPT0gQ1I6CisgICAgICAgICAgICByZXR1cm4gbGluZVsxOi0xXSwgb2N0ZXRzCisgICAgICAgIHJldHVybiBsaW5lWzotMV0sIG9jdGV0cworCisKKyAgICAjIEludGVybmFsOiBnZXQgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuCisgICAgIyBSYWlzZSAnZXJyb3JfcHJvdG8nIGlmIHRoZSByZXNwb25zZSBkb2Vzbid0IHN0YXJ0IHdpdGggJysnLgorCisgICAgZGVmIF9nZXRyZXNwKHNlbGYpOgorICAgICAgICByZXNwLCBvID0gc2VsZi5fZ2V0bGluZSgpCisgICAgICAgIGlmIHNlbGYuX2RlYnVnZ2luZyA+IDE6IHByaW50ICcqcmVzcConLCByZXByKHJlc3ApCisgICAgICAgIGMgPSByZXNwWzoxXQorICAgICAgICBpZiBjICE9ICcrJzoKKyAgICAgICAgICAgIHJhaXNlIGVycm9yX3Byb3RvKHJlc3ApCisgICAgICAgIHJldHVybiByZXNwCisKKworICAgICMgSW50ZXJuYWw6IGdldCBhIHJlc3BvbnNlIHBsdXMgZm9sbG93aW5nIHRleHQgZnJvbSB0aGUgc2VydmVyLgorCisgICAgZGVmIF9nZXRsb25ncmVzcChzZWxmKToKKyAgICAgICAgcmVzcCA9IHNlbGYuX2dldHJlc3AoKQorICAgICAgICBsaXN0ID0gW107IG9jdGV0cyA9IDAKKyAgICAgICAgbGluZSwgbyA9IHNlbGYuX2dldGxpbmUoKQorICAgICAgICB3aGlsZSBsaW5lICE9ICcuJzoKKyAgICAgICAgICAgIGlmIGxpbmVbOjJdID09ICcuLic6CisgICAgICAgICAgICAgICAgbyA9IG8tMQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzE6XQorICAgICAgICAgICAgb2N0ZXRzID0gb2N0ZXRzICsgbworICAgICAgICAgICAgbGlzdC5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIGxpbmUsIG8gPSBzZWxmLl9nZXRsaW5lKCkKKyAgICAgICAgcmV0dXJuIHJlc3AsIGxpc3QsIG9jdGV0cworCisKKyAgICAjIEludGVybmFsOiBzZW5kIGEgY29tbWFuZCBhbmQgZ2V0IHRoZSByZXNwb25zZQorCisgICAgZGVmIF9zaG9ydGNtZChzZWxmLCBsaW5lKToKKyAgICAgICAgc2VsZi5fcHV0Y21kKGxpbmUpCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRyZXNwKCkKKworCisgICAgIyBJbnRlcm5hbDogc2VuZCBhIGNvbW1hbmQgYW5kIGdldCB0aGUgcmVzcG9uc2UgcGx1cyBmb2xsb3dpbmcgdGV4dAorCisgICAgZGVmIF9sb25nY21kKHNlbGYsIGxpbmUpOgorICAgICAgICBzZWxmLl9wdXRjbWQobGluZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGxvbmdyZXNwKCkKKworCisgICAgIyBUaGVzZSBjYW4gYmUgdXNlZnVsOgorCisgICAgZGVmIGdldHdlbGNvbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLndlbGNvbWUKKworCisgICAgZGVmIHNldF9kZWJ1Z2xldmVsKHNlbGYsIGxldmVsKToKKyAgICAgICAgc2VsZi5fZGVidWdnaW5nID0gbGV2ZWwKKworCisgICAgIyBIZXJlIGFyZSBhbGwgdGhlIFBPUCBjb21tYW5kczoKKworICAgIGRlZiB1c2VyKHNlbGYsIHVzZXIpOgorICAgICAgICAiIiJTZW5kIHVzZXIgbmFtZSwgcmV0dXJuIHJlc3BvbnNlCisKKyAgICAgICAgKHNob3VsZCBpbmRpY2F0ZSBwYXNzd29yZCByZXF1aXJlZCkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc2hvcnRjbWQoJ1VTRVIgJXMnICUgdXNlcikKKworCisgICAgZGVmIHBhc3NfKHNlbGYsIHBzd2QpOgorICAgICAgICAiIiJTZW5kIHBhc3N3b3JkLCByZXR1cm4gcmVzcG9uc2UKKworICAgICAgICAocmVzcG9uc2UgaW5jbHVkZXMgbWVzc2FnZSBjb3VudCwgbWFpbGJveCBzaXplKS4KKworICAgICAgICBOQjogbWFpbGJveCBpcyBsb2NrZWQgYnkgc2VydmVyIGZyb20gaGVyZSB0byAncXVpdCgpJworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3J0Y21kKCdQQVNTICVzJyAlIHBzd2QpCisKKworICAgIGRlZiBzdGF0KHNlbGYpOgorICAgICAgICAiIiJHZXQgbWFpbGJveCBzdGF0dXMuCisKKyAgICAgICAgUmVzdWx0IGlzIHR1cGxlIG9mIDIgaW50cyAobWVzc2FnZSBjb3VudCwgbWFpbGJveCBzaXplKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dmFsID0gc2VsZi5fc2hvcnRjbWQoJ1NUQVQnKQorICAgICAgICByZXRzID0gcmV0dmFsLnNwbGl0KCkKKyAgICAgICAgaWYgc2VsZi5fZGVidWdnaW5nOiBwcmludCAnKnN0YXQqJywgcmVwcihyZXRzKQorICAgICAgICBudW1NZXNzYWdlcyA9IGludChyZXRzWzFdKQorICAgICAgICBzaXplTWVzc2FnZXMgPSBpbnQocmV0c1syXSkKKyAgICAgICAgcmV0dXJuIChudW1NZXNzYWdlcywgc2l6ZU1lc3NhZ2VzKQorCisKKyAgICBkZWYgbGlzdChzZWxmLCB3aGljaD1Ob25lKToKKyAgICAgICAgIiIiUmVxdWVzdCBsaXN0aW5nLCByZXR1cm4gcmVzdWx0LgorCisgICAgICAgIFJlc3VsdCB3aXRob3V0IGEgbWVzc2FnZSBudW1iZXIgYXJndW1lbnQgaXMgaW4gZm9ybQorICAgICAgICBbJ3Jlc3BvbnNlJywgWydtZXNnX251bSBvY3RldHMnLCAuLi5dLCBvY3RldHNdLgorCisgICAgICAgIFJlc3VsdCB3aGVuIGEgbWVzc2FnZSBudW1iZXIgYXJndW1lbnQgaXMgZ2l2ZW4gaXMgYQorICAgICAgICBzaW5nbGUgcmVzcG9uc2U6IHRoZSAic2NhbiBsaXN0aW5nIiBmb3IgdGhhdCBtZXNzYWdlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgd2hpY2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc2hvcnRjbWQoJ0xJU1QgJXMnICUgd2hpY2gpCisgICAgICAgIHJldHVybiBzZWxmLl9sb25nY21kKCdMSVNUJykKKworCisgICAgZGVmIHJldHIoc2VsZiwgd2hpY2gpOgorICAgICAgICAiIiJSZXRyaWV2ZSB3aG9sZSBtZXNzYWdlIG51bWJlciAnd2hpY2gnLgorCisgICAgICAgIFJlc3VsdCBpcyBpbiBmb3JtIFsncmVzcG9uc2UnLCBbJ2xpbmUnLCAuLi5dLCBvY3RldHNdLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xvbmdjbWQoJ1JFVFIgJXMnICUgd2hpY2gpCisKKworICAgIGRlZiBkZWxlKHNlbGYsIHdoaWNoKToKKyAgICAgICAgIiIiRGVsZXRlIG1lc3NhZ2UgbnVtYmVyICd3aGljaCcuCisKKyAgICAgICAgUmVzdWx0IGlzICdyZXNwb25zZScuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc2hvcnRjbWQoJ0RFTEUgJXMnICUgd2hpY2gpCisKKworICAgIGRlZiBub29wKHNlbGYpOgorICAgICAgICAiIiJEb2VzIG5vdGhpbmcuCisKKyAgICAgICAgT25lIHN1cHBvc2VzIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgdGhlIHNlcnZlciBpcyBhbGl2ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9zaG9ydGNtZCgnTk9PUCcpCisKKworICAgIGRlZiByc2V0KHNlbGYpOgorICAgICAgICAiIiJVbm1hcmsgYWxsIG1lc3NhZ2VzIG1hcmtlZCBmb3IgZGVsZXRpb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9zaG9ydGNtZCgnUlNFVCcpCisKKworICAgIGRlZiBxdWl0KHNlbGYpOgorICAgICAgICAiIiJTaWdub2ZmOiBjb21taXQgY2hhbmdlcyBvbiBzZXJ2ZXIsIHVubG9jayBtYWlsYm94LCBjbG9zZSBjb25uZWN0aW9uLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXNwID0gc2VsZi5fc2hvcnRjbWQoJ1FVSVQnKQorICAgICAgICBleGNlcHQgZXJyb3JfcHJvdG8sIHZhbDoKKyAgICAgICAgICAgIHJlc3AgPSB2YWwKKyAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKyAgICAgICAgZGVsIHNlbGYuZmlsZSwgc2VsZi5zb2NrCisgICAgICAgIHJldHVybiByZXNwCisKKyAgICAjX19kZWxfXyA9IHF1aXQKKworCisgICAgIyBvcHRpb25hbCBjb21tYW5kczoKKworICAgIGRlZiBycG9wKHNlbGYsIHVzZXIpOgorICAgICAgICAiIiJOb3Qgc3VyZSB3aGF0IHRoaXMgZG9lcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3J0Y21kKCdSUE9QICVzJyAlIHVzZXIpCisKKworICAgIHRpbWVzdGFtcCA9IHJlLmNvbXBpbGUocidcK09LLiooPFtePl0rPiknKQorCisgICAgZGVmIGFwb3Aoc2VsZiwgdXNlciwgc2VjcmV0KToKKyAgICAgICAgIiIiQXV0aG9yaXNhdGlvbgorCisgICAgICAgIC0gb25seSBwb3NzaWJsZSBpZiBzZXJ2ZXIgaGFzIHN1cHBsaWVkIGEgdGltZXN0YW1wIGluIGluaXRpYWwgZ3JlZXRpbmcuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgICAgICB1c2VyICAgIC0gbWFpbGJveCB1c2VyOworICAgICAgICAgICAgICAgIHNlY3JldCAgLSBzZWNyZXQgc2hhcmVkIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIuCisKKyAgICAgICAgTkI6IG1haWxib3ggaXMgbG9ja2VkIGJ5IHNlcnZlciBmcm9tIGhlcmUgdG8gJ3F1aXQoKScKKyAgICAgICAgIiIiCisgICAgICAgIG0gPSBzZWxmLnRpbWVzdGFtcC5tYXRjaChzZWxmLndlbGNvbWUpCisgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgcmFpc2UgZXJyb3JfcHJvdG8oJy1FUlIgQVBPUCBub3Qgc3VwcG9ydGVkIGJ5IHNlcnZlcicpCisgICAgICAgIGltcG9ydCBoYXNobGliCisgICAgICAgIGRpZ2VzdCA9IGhhc2hsaWIubWQ1KG0uZ3JvdXAoMSkrc2VjcmV0KS5kaWdlc3QoKQorICAgICAgICBkaWdlc3QgPSAnJy5qb2luKG1hcChsYW1iZGEgeDonJTAyeCclb3JkKHgpLCBkaWdlc3QpKQorICAgICAgICByZXR1cm4gc2VsZi5fc2hvcnRjbWQoJ0FQT1AgJXMgJXMnICUgKHVzZXIsIGRpZ2VzdCkpCisKKworICAgIGRlZiB0b3Aoc2VsZiwgd2hpY2gsIGhvd211Y2gpOgorICAgICAgICAiIiJSZXRyaWV2ZSBtZXNzYWdlIGhlYWRlciBvZiBtZXNzYWdlIG51bWJlciAnd2hpY2gnCisgICAgICAgIGFuZCBmaXJzdCAnaG93bXVjaCcgbGluZXMgb2YgbWVzc2FnZSBib2R5LgorCisgICAgICAgIFJlc3VsdCBpcyBpbiBmb3JtIFsncmVzcG9uc2UnLCBbJ2xpbmUnLCAuLi5dLCBvY3RldHNdLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xvbmdjbWQoJ1RPUCAlcyAlcycgJSAod2hpY2gsIGhvd211Y2gpKQorCisKKyAgICBkZWYgdWlkbChzZWxmLCB3aGljaD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIG1lc3NhZ2UgZGlnZXN0ICh1bmlxdWUgaWQpIGxpc3QuCisKKyAgICAgICAgSWYgJ3doaWNoJywgcmVzdWx0IGNvbnRhaW5zIHVuaXF1ZSBpZCBmb3IgdGhhdCBtZXNzYWdlCisgICAgICAgIGluIHRoZSBmb3JtICdyZXNwb25zZSBtZXNnbnVtIHVpZCcsIG90aGVyd2lzZSByZXN1bHQgaXMKKyAgICAgICAgdGhlIGxpc3QgWydyZXNwb25zZScsIFsnbWVzZ251bSB1aWQnLCAuLi5dLCBvY3RldHNdCisgICAgICAgICIiIgorICAgICAgICBpZiB3aGljaCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zaG9ydGNtZCgnVUlETCAlcycgJSB3aGljaCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xvbmdjbWQoJ1VJREwnKQorCit0cnk6CisgICAgaW1wb3J0IHNzbAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisKKyAgICBjbGFzcyBQT1AzX1NTTChQT1AzKToKKyAgICAgICAgIiIiUE9QMyBjbGllbnQgY2xhc3Mgb3ZlciBTU0wgY29ubmVjdGlvbgorCisgICAgICAgIEluc3RhbnRpYXRlIHdpdGg6IFBPUDNfU1NMKGhvc3RuYW1lLCBwb3J0PTk5NSwga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lKQorCisgICAgICAgICAgICAgICBob3N0bmFtZSAtIHRoZSBob3N0bmFtZSBvZiB0aGUgcG9wMyBvdmVyIHNzbCBzZXJ2ZXIKKyAgICAgICAgICAgICAgIHBvcnQgLSBwb3J0IG51bWJlcgorICAgICAgICAgICAgICAga2V5ZmlsZSAtIFBFTSBmb3JtYXR0ZWQgZmlsZSB0aGF0IGNvdW50YWlucyB5b3VyIHByaXZhdGUga2V5CisgICAgICAgICAgICAgICBjZXJ0ZmlsZSAtIFBFTSBmb3JtYXR0ZWQgY2VydGlmaWNhdGUgY2hhaW4gZmlsZQorCisgICAgICAgICAgICBTZWUgdGhlIG1ldGhvZHMgb2YgdGhlIHBhcmVudCBjbGFzcyBQT1AzIGZvciBtb3JlIGRvY3VtZW50YXRpb24uCisgICAgICAgICIiIgorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0ID0gUE9QM19TU0xfUE9SVCwga2V5ZmlsZSA9IE5vbmUsIGNlcnRmaWxlID0gTm9uZSk6CisgICAgICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgICAgICBzZWxmLmtleWZpbGUgPSBrZXlmaWxlCisgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gIiIKKyAgICAgICAgICAgIG1zZyA9ICJnZXRhZGRyaW5mbyByZXR1cm5zIGFuIGVtcHR5IGxpc3QiCisgICAgICAgICAgICBzZWxmLnNvY2sgPSBOb25lCisgICAgICAgICAgICBmb3IgcmVzIGluIHNvY2tldC5nZXRhZGRyaW5mbyhzZWxmLmhvc3QsIHNlbGYucG9ydCwgMCwgc29ja2V0LlNPQ0tfU1RSRUFNKToKKyAgICAgICAgICAgICAgICBhZiwgc29ja3R5cGUsIHByb3RvLCBjYW5vbm5hbWUsIHNhID0gcmVzCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KGFmLCBzb2NrdHlwZSwgcHJvdG8pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc29jay5jb25uZWN0KHNhKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zb2NrOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5zb2NrOgorICAgICAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvciwgbXNnCisgICAgICAgICAgICBzZWxmLmZpbGUgPSBzZWxmLnNvY2subWFrZWZpbGUoJ3JiJykKKyAgICAgICAgICAgIHNlbGYuc3Nsb2JqID0gc3NsLndyYXBfc29ja2V0KHNlbGYuc29jaywgc2VsZi5rZXlmaWxlLCBzZWxmLmNlcnRmaWxlKQorICAgICAgICAgICAgc2VsZi5fZGVidWdnaW5nID0gMAorICAgICAgICAgICAgc2VsZi53ZWxjb21lID0gc2VsZi5fZ2V0cmVzcCgpCisKKyAgICAgICAgZGVmIF9maWxsQnVmZmVyKHNlbGYpOgorICAgICAgICAgICAgbG9jYWxidWYgPSBzZWxmLnNzbG9iai5yZWFkKCkKKyAgICAgICAgICAgIGlmIGxlbihsb2NhbGJ1ZikgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBlcnJvcl9wcm90bygnLUVSUiBFT0YnKQorICAgICAgICAgICAgc2VsZi5idWZmZXIgKz0gbG9jYWxidWYKKworICAgICAgICBkZWYgX2dldGxpbmUoc2VsZik6CisgICAgICAgICAgICBsaW5lID0gIiIKKyAgICAgICAgICAgIHJlbmV3bGluZSA9IHJlLmNvbXBpbGUocicuKj9cbicpCisgICAgICAgICAgICBtYXRjaCA9IHJlbmV3bGluZS5tYXRjaChzZWxmLmJ1ZmZlcikKKyAgICAgICAgICAgIHdoaWxlIG5vdCBtYXRjaDoKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxsQnVmZmVyKCkKKyAgICAgICAgICAgICAgICBtYXRjaCA9IHJlbmV3bGluZS5tYXRjaChzZWxmLmJ1ZmZlcikKKyAgICAgICAgICAgIGxpbmUgPSBtYXRjaC5ncm91cCgwKQorICAgICAgICAgICAgc2VsZi5idWZmZXIgPSByZW5ld2xpbmUuc3ViKCcnICxzZWxmLmJ1ZmZlciwgMSkKKyAgICAgICAgICAgIGlmIHNlbGYuX2RlYnVnZ2luZyA+IDE6IHByaW50ICcqZ2V0KicsIHJlcHIobGluZSkKKworICAgICAgICAgICAgb2N0ZXRzID0gbGVuKGxpbmUpCisgICAgICAgICAgICBpZiBsaW5lWy0yOl0gPT0gQ1JMRjoKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZVs6LTJdLCBvY3RldHMKKyAgICAgICAgICAgIGlmIGxpbmVbMF0gPT0gQ1I6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVbMTotMV0sIG9jdGV0cworICAgICAgICAgICAgcmV0dXJuIGxpbmVbOi0xXSwgb2N0ZXRzCisKKyAgICAgICAgZGVmIF9wdXRsaW5lKHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgaWYgc2VsZi5fZGVidWdnaW5nID4gMTogcHJpbnQgJypwdXQqJywgcmVwcihsaW5lKQorICAgICAgICAgICAgbGluZSArPSBDUkxGCisgICAgICAgICAgICBieXRlcyA9IGxlbihsaW5lKQorICAgICAgICAgICAgd2hpbGUgYnl0ZXMgPiAwOgorICAgICAgICAgICAgICAgIHNlbnQgPSBzZWxmLnNzbG9iai53cml0ZShsaW5lKQorICAgICAgICAgICAgICAgIGlmIHNlbnQgPT0gYnl0ZXM6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgICMgYXZvaWQgY29weQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW3NlbnQ6XQorICAgICAgICAgICAgICAgIGJ5dGVzID0gYnl0ZXMgLSBzZW50CisKKyAgICAgICAgZGVmIHF1aXQoc2VsZik6CisgICAgICAgICAgICAiIiJTaWdub2ZmOiBjb21taXQgY2hhbmdlcyBvbiBzZXJ2ZXIsIHVubG9jayBtYWlsYm94LCBjbG9zZSBjb25uZWN0aW9uLiIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc3AgPSBzZWxmLl9zaG9ydGNtZCgnUVVJVCcpCisgICAgICAgICAgICBleGNlcHQgZXJyb3JfcHJvdG8sIHZhbDoKKyAgICAgICAgICAgICAgICByZXNwID0gdmFsCisgICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQorICAgICAgICAgICAgZGVsIHNlbGYuc3Nsb2JqLCBzZWxmLnNvY2sKKyAgICAgICAgICAgIHJldHVybiByZXNwCisKKyAgICBfX2FsbF9fLmFwcGVuZCgiUE9QM19TU0wiKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGltcG9ydCBzeXMKKyAgICBhID0gUE9QMyhzeXMuYXJndlsxXSkKKyAgICBwcmludCBhLmdldHdlbGNvbWUoKQorICAgIGEudXNlcihzeXMuYXJndlsyXSkKKyAgICBhLnBhc3NfKHN5cy5hcmd2WzNdKQorICAgIGEubGlzdCgpCisgICAgKG51bU1zZ3MsIHRvdGFsU2l6ZSkgPSBhLnN0YXQoKQorICAgIGZvciBpIGluIHJhbmdlKDEsIG51bU1zZ3MgKyAxKToKKyAgICAgICAgKGhlYWRlciwgbXNnLCBvY3RldHMpID0gYS5yZXRyKGkpCisgICAgICAgIHByaW50ICJNZXNzYWdlICVkOiIgJSBpCisgICAgICAgIGZvciBsaW5lIGluIG1zZzoKKyAgICAgICAgICAgIHByaW50ICcgICAnICsgbGluZQorICAgICAgICBwcmludCAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgICAgYS5xdWl0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcG9wbGliLnB5YyBiL2xpYi9weXRob24yLjcvcG9wbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjg1NDNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wb3BsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcG9wbGliLnB5byBiL2xpYi9weXRob24yLjcvcG9wbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjg1NDNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wb3BsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcG9zaXhmaWxlLnB5IGIvbGliL3B5dGhvbjIuNy9wb3NpeGZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyOTEwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcG9zaXhmaWxlLnB5CkBAIC0wLDAgKzEsMjM3IEBACisiIiJFeHRlbmRlZCBmaWxlIG9wZXJhdGlvbnMgYXZhaWxhYmxlIGluIFBPU0lYLgorCitmID0gcG9zaXhmaWxlLm9wZW4oZmlsZW5hbWUsIFttb2RlLCBbYnVmc2l6ZV1dKQorICAgICAgd2lsbCBjcmVhdGUgYSBuZXcgcG9zaXhmaWxlIG9iamVjdAorCitmID0gcG9zaXhmaWxlLmZpbGVvcGVuKGZpbGVvYmplY3QpCisgICAgICB3aWxsIGNyZWF0ZSBhIHBvc2l4ZmlsZSBvYmplY3QgZnJvbSBhIGJ1aWx0aW4gZmlsZSBvYmplY3QKKworZi5maWxlKCkKKyAgICAgIHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCBidWlsdGluIGZpbGUgb2JqZWN0CisKK2YuZHVwKCkKKyAgICAgIHdpbGwgcmV0dXJuIGEgbmV3IGZpbGUgb2JqZWN0IGJhc2VkIG9uIGEgbmV3IGZpbGVkZXNjcmlwdG9yCisKK2YuZHVwMihmZCkKKyAgICAgIHdpbGwgcmV0dXJuIGEgbmV3IGZpbGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBnaXZlbiBmaWxlZGVzY3JpcHRvcgorCitmLmZsYWdzKG1vZGUpCisgICAgICB3aWxsIHR1cm4gb24gdGhlIGFzc29jaWF0ZWQgZmxhZyAobWVyZ2UpCisgICAgICBtb2RlIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKKworICAoY2hhcmFjdGVyIHJlcHJlc2VudGluZyBhIGZsYWcpCisgICAgICBhICAgICAgIGFwcGVuZCBvbmx5IGZsYWcKKyAgICAgIGMgICAgICAgY2xvc2Ugb24gZXhlYyBmbGFnCisgICAgICBuICAgICAgIG5vIGRlbGF5IGZsYWcKKyAgICAgIHMgICAgICAgc3luY2hyb25pemF0aW9uIGZsYWcKKyAgKG1vZGlmaWVycykKKyAgICAgICEgICAgICAgdHVybiBmbGFncyAnb2ZmJyBpbnN0ZWFkIG9mIGRlZmF1bHQgJ29uJworICAgICAgPSAgICAgICBjb3B5IGZsYWdzICdhcyBpcycgaW5zdGVhZCBvZiBkZWZhdWx0ICdtZXJnZScKKyAgICAgID8gICAgICAgcmV0dXJuIGEgc3RyaW5nIGluIHdoaWNoIHRoZSBjaGFyYWN0ZXJzIHJlcHJlc2VudCB0aGUgZmxhZ3MKKyAgICAgICAgICAgICAgdGhhdCBhcmUgc2V0CisKKyAgICAgIG5vdGU6IC0gdGhlICchJyBhbmQgJz0nIG1vZGlmaWVycyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICAgICAgICAgICAgLSB0aGUgJz8nIG1vZGlmaWVyIHdpbGwgcmV0dXJuIHRoZSBzdGF0dXMgb2YgdGhlIGZsYWdzIGFmdGVyIHRoZXkKKyAgICAgICAgICAgICAgaGF2ZSBiZWVuIGNoYW5nZWQgYnkgb3RoZXIgY2hhcmFjdGVycyBpbiB0aGUgbW9kZSBzdHJpbmcKKworZi5sb2NrKG1vZGUgWywgbGVuIFssIHN0YXJ0IFssIHdoZW5jZV1dXSkKKyAgICAgIHdpbGwgKHVuKWxvY2sgYSByZWdpb24KKyAgICAgIG1vZGUgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOgorCisgIChjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHR5cGUgb2YgbG9jaykKKyAgICAgIHUgICAgICAgdW5sb2NrCisgICAgICByICAgICAgIHJlYWQgbG9jaworICAgICAgdyAgICAgICB3cml0ZSBsb2NrCisgIChtb2RpZmllcnMpCisgICAgICB8ICAgICAgIHdhaXQgdW50aWwgdGhlIGxvY2sgY2FuIGJlIGdyYW50ZWQKKyAgICAgID8gICAgICAgcmV0dXJuIHRoZSBmaXJzdCBsb2NrIGNvbmZsaWN0aW5nIHdpdGggdGhlIHJlcXVlc3RlZCBsb2NrCisgICAgICAgICAgICAgIG9yICdOb25lJyBpZiB0aGVyZSBpcyBubyBjb25mbGljdC4gVGhlIGxvY2sgcmV0dXJuZWQgaXMgaW4gdGhlCisgICAgICAgICAgICAgIGZvcm1hdCAobW9kZSwgbGVuLCBzdGFydCwgd2hlbmNlLCBwaWQpIHdoZXJlIG1vZGUgaXMgYQorICAgICAgICAgICAgICBjaGFyYWN0ZXIgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIGxvY2sgKCdyJyBvciAndycpCisKKyAgICAgIG5vdGU6IC0gdGhlICc/JyBtb2RpZmllciBwcmV2ZW50cyBhIHJlZ2lvbiBmcm9tIGJlaW5nIGxvY2tlZDsgaXQgaXMKKyAgICAgICAgICAgICAgcXVlcnkgb25seQorIiIiCitpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLndhcm4oIlRoZSBwb3NpeGZpbGUgbW9kdWxlIGlzIGRlcHJlY2F0ZWQ7ICIKKyAgICAgICAgICAgICAgICAiZmNudGwubG9ja2YoKSBwcm92aWRlcyBiZXR0ZXIgbG9ja2luZyIsIERlcHJlY2F0aW9uV2FybmluZywgMikKKworY2xhc3MgX3Bvc2l4ZmlsZV86CisgICAgIiIiRmlsZSB3cmFwcGVyIGNsYXNzIHRoYXQgcHJvdmlkZXMgZXh0cmEgUE9TSVggZmlsZSByb3V0aW5lcy4iIiIKKworICAgIHN0YXRlcyA9IFsnb3BlbicsICdjbG9zZWQnXQorCisgICAgIworICAgICMgSW50ZXJuYWwgcm91dGluZXMKKyAgICAjCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBmaWxlID0gc2VsZi5fZmlsZV8KKyAgICAgICAgcmV0dXJuICI8JXMgcG9zaXhmaWxlICclcycsIG1vZGUgJyVzJyBhdCAlcz4iICUgXAorICAgICAgICAgICAgICAgIChzZWxmLnN0YXRlc1tmaWxlLmNsb3NlZF0sIGZpbGUubmFtZSwgZmlsZS5tb2RlLCBcCisgICAgICAgICAgICAgICAgIGhleChpZChzZWxmKSlbMjpdKQorCisgICAgIworICAgICMgSW5pdGlhbGl6YXRpb24gcm91dGluZXMKKyAgICAjCisgICAgZGVmIG9wZW4oc2VsZiwgbmFtZSwgbW9kZT0ncicsIGJ1ZnNpemU9LTEpOgorICAgICAgICBpbXBvcnQgX19idWlsdGluX18KKyAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9wZW4oX19idWlsdGluX18ub3BlbihuYW1lLCBtb2RlLCBidWZzaXplKSkKKworICAgIGRlZiBmaWxlb3BlbihzZWxmLCBmaWxlKToKKyAgICAgICAgaW1wb3J0IHR5cGVzCisgICAgICAgIGlmIHJlcHIodHlwZShmaWxlKSkgIT0gIjx0eXBlICdmaWxlJz4iOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAncG9zaXhmaWxlLmZpbGVvcGVuKCkgYXJnIG11c3QgYmUgZmlsZSBvYmplY3QnCisgICAgICAgIHNlbGYuX2ZpbGVfICA9IGZpbGUKKyAgICAgICAgIyBDb3B5IGJhc2ljIGZpbGUgbWV0aG9kcworICAgICAgICBmb3IgbWF5YmVtZXRob2QgaW4gZGlyKGZpbGUpOgorICAgICAgICAgICAgaWYgbm90IG1heWJlbWV0aG9kLnN0YXJ0c3dpdGgoJ18nKToKKyAgICAgICAgICAgICAgICBhdHRyID0gZ2V0YXR0cihmaWxlLCBtYXliZW1ldGhvZCkKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGF0dHIsIHR5cGVzLkJ1aWx0aW5NZXRob2RUeXBlKToKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBtYXliZW1ldGhvZCwgYXR0cikKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICMKKyAgICAjIE5ldyBtZXRob2RzCisgICAgIworICAgIGRlZiBmaWxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZV8KKworICAgIGRlZiBkdXAoc2VsZik6CisgICAgICAgIGltcG9ydCBwb3NpeAorCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHBvc2l4LCAnZmRvcGVuJyk6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgJ2R1cCgpIG1ldGhvZCB1bmF2YWlsYWJsZScKKworICAgICAgICByZXR1cm4gcG9zaXguZmRvcGVuKHBvc2l4LmR1cChzZWxmLl9maWxlXy5maWxlbm8oKSksIHNlbGYuX2ZpbGVfLm1vZGUpCisKKyAgICBkZWYgZHVwMihzZWxmLCBmZCk6CisgICAgICAgIGltcG9ydCBwb3NpeAorCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHBvc2l4LCAnZmRvcGVuJyk6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgJ2R1cCgpIG1ldGhvZCB1bmF2YWlsYWJsZScKKworICAgICAgICBwb3NpeC5kdXAyKHNlbGYuX2ZpbGVfLmZpbGVubygpLCBmZCkKKyAgICAgICAgcmV0dXJuIHBvc2l4LmZkb3BlbihmZCwgc2VsZi5fZmlsZV8ubW9kZSkKKworICAgIGRlZiBmbGFncyhzZWxmLCAqd2hpY2gpOgorICAgICAgICBpbXBvcnQgZmNudGwsIG9zCisKKyAgICAgICAgaWYgd2hpY2g6CisgICAgICAgICAgICBpZiBsZW4od2hpY2gpID4gMToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICdUb28gbWFueSBhcmd1bWVudHMnCisgICAgICAgICAgICB3aGljaCA9IHdoaWNoWzBdCisgICAgICAgIGVsc2U6IHdoaWNoID0gJz8nCisKKyAgICAgICAgbF9mbGFncyA9IDAKKyAgICAgICAgaWYgJ24nIGluIHdoaWNoOiBsX2ZsYWdzID0gbF9mbGFncyB8IG9zLk9fTkRFTEFZCisgICAgICAgIGlmICdhJyBpbiB3aGljaDogbF9mbGFncyA9IGxfZmxhZ3MgfCBvcy5PX0FQUEVORAorICAgICAgICBpZiAncycgaW4gd2hpY2g6IGxfZmxhZ3MgPSBsX2ZsYWdzIHwgb3MuT19TWU5DCisKKyAgICAgICAgZmlsZSA9IHNlbGYuX2ZpbGVfCisKKyAgICAgICAgaWYgJz0nIG5vdCBpbiB3aGljaDoKKyAgICAgICAgICAgIGN1cl9mbCA9IGZjbnRsLmZjbnRsKGZpbGUuZmlsZW5vKCksIGZjbnRsLkZfR0VURkwsIDApCisgICAgICAgICAgICBpZiAnIScgaW4gd2hpY2g6IGxfZmxhZ3MgPSBjdXJfZmwgJiB+IGxfZmxhZ3MKKyAgICAgICAgICAgIGVsc2U6IGxfZmxhZ3MgPSBjdXJfZmwgfCBsX2ZsYWdzCisKKyAgICAgICAgbF9mbGFncyA9IGZjbnRsLmZjbnRsKGZpbGUuZmlsZW5vKCksIGZjbnRsLkZfU0VURkwsIGxfZmxhZ3MpCisKKyAgICAgICAgaWYgJ2MnIGluIHdoaWNoOgorICAgICAgICAgICAgYXJnID0gKCchJyBub3QgaW4gd2hpY2gpICAgICMgMCBpcyBkb24ndCwgMSBpcyBkbyBjbG9zZSBvbiBleGVjCisgICAgICAgICAgICBsX2ZsYWdzID0gZmNudGwuZmNudGwoZmlsZS5maWxlbm8oKSwgZmNudGwuRl9TRVRGRCwgYXJnKQorCisgICAgICAgIGlmICc/JyBpbiB3aGljaDoKKyAgICAgICAgICAgIHdoaWNoID0gJycgICAgICAgICAgICAgICAgICAjIFJldHVybiBjdXJyZW50IGZsYWdzCisgICAgICAgICAgICBsX2ZsYWdzID0gZmNudGwuZmNudGwoZmlsZS5maWxlbm8oKSwgZmNudGwuRl9HRVRGTCwgMCkKKyAgICAgICAgICAgIGlmIG9zLk9fQVBQRU5EICYgbF9mbGFnczogd2hpY2ggPSB3aGljaCArICdhJworICAgICAgICAgICAgaWYgZmNudGwuZmNudGwoZmlsZS5maWxlbm8oKSwgZmNudGwuRl9HRVRGRCwgMCkgJiAxOgorICAgICAgICAgICAgICAgIHdoaWNoID0gd2hpY2ggKyAnYycKKyAgICAgICAgICAgIGlmIG9zLk9fTkRFTEFZICYgbF9mbGFnczogd2hpY2ggPSB3aGljaCArICduJworICAgICAgICAgICAgaWYgb3MuT19TWU5DICYgbF9mbGFnczogd2hpY2ggPSB3aGljaCArICdzJworICAgICAgICAgICAgcmV0dXJuIHdoaWNoCisKKyAgICBkZWYgbG9jayhzZWxmLCBob3csICphcmdzKToKKyAgICAgICAgaW1wb3J0IHN0cnVjdCwgZmNudGwKKworICAgICAgICBpZiAndycgaW4gaG93OiBsX3R5cGUgPSBmY250bC5GX1dSTENLCisgICAgICAgIGVsaWYgJ3InIGluIGhvdzogbF90eXBlID0gZmNudGwuRl9SRExDSworICAgICAgICBlbGlmICd1JyBpbiBob3c6IGxfdHlwZSA9IGZjbnRsLkZfVU5MQ0sKKyAgICAgICAgZWxzZTogcmFpc2UgVHlwZUVycm9yLCAnbm8gdHlwZSBvZiBsb2NrIHNwZWNpZmllZCcKKworICAgICAgICBpZiAnfCcgaW4gaG93OiBjbWQgPSBmY250bC5GX1NFVExLVworICAgICAgICBlbGlmICc/JyBpbiBob3c6IGNtZCA9IGZjbnRsLkZfR0VUTEsKKyAgICAgICAgZWxzZTogY21kID0gZmNudGwuRl9TRVRMSworCisgICAgICAgIGxfd2hlbmNlID0gMAorICAgICAgICBsX3N0YXJ0ID0gMAorICAgICAgICBsX2xlbiA9IDAKKworICAgICAgICBpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgICAgIGxfbGVuID0gYXJnc1swXQorICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAyOgorICAgICAgICAgICAgbF9sZW4sIGxfc3RhcnQgPSBhcmdzCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDM6CisgICAgICAgICAgICBsX2xlbiwgbF9zdGFydCwgbF93aGVuY2UgPSBhcmdzCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID4gMzoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgJ3RvbyBtYW55IGFyZ3VtZW50cycKKworICAgICAgICAjIEhhY2sgYnkgZGF2ZW1AbWFnbmV0LmNvbSB0byBnZXQgbG9ja2luZyB0byBnbyBvbiBmcmVlYnNkOworICAgICAgICAjIGFkZGl0aW9ucyBmb3IgQUlYIGJ5IFZsYWRpbWlyLk1hcmFuZ296b3ZAaW1hZy5mcgorICAgICAgICBpbXBvcnQgc3lzLCBvcworICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCduZXRic2QxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3BlbmJzZDInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcmVlYnNkMicsICdmcmVlYnNkMycsICdmcmVlYnNkNCcsICdmcmVlYnNkNScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2Q2JywgJ2ZyZWVic2Q3JywgJ2ZyZWVic2Q4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnNkb3MyJywgJ2JzZG9zMycsICdic2RvczQnKToKKyAgICAgICAgICAgIGZsb2NrID0gc3RydWN0LnBhY2soJ2x4eHh4bHh4eHhsaGgnLCBcCisgICAgICAgICAgICAgICAgICBsX3N0YXJ0LCBsX2xlbiwgb3MuZ2V0cGlkKCksIGxfdHlwZSwgbF93aGVuY2UpCisgICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtIGluICgnYWl4MycsICdhaXg0Jyk6CisgICAgICAgICAgICBmbG9jayA9IHN0cnVjdC5wYWNrKCdoaGxsbGlpJywgXAorICAgICAgICAgICAgICAgICAgbF90eXBlLCBsX3doZW5jZSwgbF9zdGFydCwgbF9sZW4sIDAsIDAsIDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbG9jayA9IHN0cnVjdC5wYWNrKCdoaGxsaGgnLCBcCisgICAgICAgICAgICAgICAgICBsX3R5cGUsIGxfd2hlbmNlLCBsX3N0YXJ0LCBsX2xlbiwgMCwgMCkKKworICAgICAgICBmbG9jayA9IGZjbnRsLmZjbnRsKHNlbGYuX2ZpbGVfLmZpbGVubygpLCBjbWQsIGZsb2NrKQorCisgICAgICAgIGlmICc/JyBpbiBob3c6CisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCduZXRic2QxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wZW5ic2QyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2QyJywgJ2ZyZWVic2QzJywgJ2ZyZWVic2Q0JywgJ2ZyZWVic2Q1JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JzZG9zMicsICdic2RvczMnLCAnYnNkb3M0Jyk6CisgICAgICAgICAgICAgICAgbF9zdGFydCwgbF9sZW4sIGxfcGlkLCBsX3R5cGUsIGxfd2hlbmNlID0gXAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QudW5wYWNrKCdseHh4eGx4eHh4bGhoJywgZmxvY2spCisgICAgICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ2FpeDMnLCAnYWl4NCcpOgorICAgICAgICAgICAgICAgIGxfdHlwZSwgbF93aGVuY2UsIGxfc3RhcnQsIGxfbGVuLCBsX3N5c2lkLCBsX3BpZCwgbF92ZnMgPSBcCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdC51bnBhY2soJ2hobGxsaWknLCBmbG9jaykKKyAgICAgICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJsaW51eDIiOgorICAgICAgICAgICAgICAgIGxfdHlwZSwgbF93aGVuY2UsIGxfc3RhcnQsIGxfbGVuLCBsX3BpZCwgbF9zeXNpZCA9IFwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0LnVucGFjaygnaGhsbGhoJywgZmxvY2spCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxfdHlwZSwgbF93aGVuY2UsIGxfc3RhcnQsIGxfbGVuLCBsX3N5c2lkLCBsX3BpZCA9IFwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0LnVucGFjaygnaGhsbGhoJywgZmxvY2spCisKKyAgICAgICAgICAgIGlmIGxfdHlwZSAhPSBmY250bC5GX1VOTENLOgorICAgICAgICAgICAgICAgIGlmIGxfdHlwZSA9PSBmY250bC5GX1JETENLOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3InLCBsX2xlbiwgbF9zdGFydCwgbF93aGVuY2UsIGxfcGlkCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd3JywgbF9sZW4sIGxfc3RhcnQsIGxfd2hlbmNlLCBsX3BpZAorCitkZWYgb3BlbihuYW1lLCBtb2RlPSdyJywgYnVmc2l6ZT0tMSk6CisgICAgIiIiUHVibGljIHJvdXRpbmUgdG8gb3BlbiBhIGZpbGUgYXMgYSBwb3NpeGZpbGUgb2JqZWN0LiIiIgorICAgIHJldHVybiBfcG9zaXhmaWxlXygpLm9wZW4obmFtZSwgbW9kZSwgYnVmc2l6ZSkKKworZGVmIGZpbGVvcGVuKGZpbGUpOgorICAgICIiIlB1YmxpYyByb3V0aW5lIHRvIGdldCBhIHBvc2l4ZmlsZSBvYmplY3QgZnJvbSBhIFB5dGhvbiBmaWxlIG9iamVjdC4iIiIKKyAgICByZXR1cm4gX3Bvc2l4ZmlsZV8oKS5maWxlb3BlbihmaWxlKQorCisjCisjIENvbnN0YW50cworIworU0VFS19TRVQgPSAwCitTRUVLX0NVUiA9IDEKK1NFRUtfRU5EID0gMgorCisjCisjIEVuZCBvZiBwb3NpeGZpbGUucHkKKyMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcG9zaXhmaWxlLnB5YyBiL2xpYi9weXRob24yLjcvcG9zaXhmaWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWNkNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wb3NpeGZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcG9zaXhmaWxlLnB5byBiL2xpYi9weXRob24yLjcvcG9zaXhmaWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWNkNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wb3NpeGZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcG9zaXhwYXRoLnB5IGIvbGliL3B5dGhvbjIuNy9wb3NpeHBhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1ZGM3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcG9zaXhwYXRoLnB5CkBAIC0wLDAgKzEsNDMxIEBACisiIiJDb21tb24gb3BlcmF0aW9ucyBvbiBQb3NpeCBwYXRobmFtZXMuCisKK0luc3RlYWQgb2YgaW1wb3J0aW5nIHRoaXMgbW9kdWxlIGRpcmVjdGx5LCBpbXBvcnQgb3MgYW5kIHJlZmVyIHRvCit0aGlzIG1vZHVsZSBhcyBvcy5wYXRoLiAgVGhlICJvcy5wYXRoIiBuYW1lIGlzIGFuIGFsaWFzIGZvciB0aGlzCittb2R1bGUgb24gUG9zaXggc3lzdGVtczsgb24gb3RoZXIgc3lzdGVtcyAoZS5nLiBNYWMsIFdpbmRvd3MpLAorb3MucGF0aCBwcm92aWRlcyB0aGUgc2FtZSBvcGVyYXRpb25zIGluIGEgbWFubmVyIHNwZWNpZmljIHRvIHRoYXQKK3BsYXRmb3JtLCBhbmQgaXMgYW4gYWxpYXMgdG8gYW5vdGhlciBtb2R1bGUgKGUuZy4gbWFjcGF0aCwgbnRwYXRoKS4KKworU29tZSBvZiB0aGlzIGNhbiBhY3R1YWxseSBiZSB1c2VmdWwgb24gbm9uLVBvc2l4IHN5c3RlbXMgdG9vLCBlLmcuCitmb3IgbWFuaXB1bGF0aW9uIG9mIHRoZSBwYXRobmFtZSBjb21wb25lbnQgb2YgVVJMcy4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdGF0CitpbXBvcnQgZ2VuZXJpY3BhdGgKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBnZW5lcmljcGF0aCBpbXBvcnQgKgorCit0cnk6CisgICAgX3VuaWNvZGUgPSB1bmljb2RlCitleGNlcHQgTmFtZUVycm9yOgorICAgICMgSWYgUHl0aG9uIGlzIGJ1aWx0IHdpdGhvdXQgVW5pY29kZSBzdXBwb3J0LCB0aGUgdW5pY29kZSB0eXBlCisgICAgIyB3aWxsIG5vdCBleGlzdC4gRmFrZSBvbmUuCisgICAgY2xhc3MgX3VuaWNvZGUob2JqZWN0KToKKyAgICAgICAgcGFzcworCitfX2FsbF9fID0gWyJub3JtY2FzZSIsImlzYWJzIiwiam9pbiIsInNwbGl0ZHJpdmUiLCJzcGxpdCIsInNwbGl0ZXh0IiwKKyAgICAgICAgICAgImJhc2VuYW1lIiwiZGlybmFtZSIsImNvbW1vbnByZWZpeCIsImdldHNpemUiLCJnZXRtdGltZSIsCisgICAgICAgICAgICJnZXRhdGltZSIsImdldGN0aW1lIiwiaXNsaW5rIiwiZXhpc3RzIiwibGV4aXN0cyIsImlzZGlyIiwiaXNmaWxlIiwKKyAgICAgICAgICAgImlzbW91bnQiLCJ3YWxrIiwiZXhwYW5kdXNlciIsImV4cGFuZHZhcnMiLCJub3JtcGF0aCIsImFic3BhdGgiLAorICAgICAgICAgICAic2FtZWZpbGUiLCJzYW1lb3BlbmZpbGUiLCJzYW1lc3RhdCIsCisgICAgICAgICAgICJjdXJkaXIiLCJwYXJkaXIiLCJzZXAiLCJwYXRoc2VwIiwiZGVmcGF0aCIsImFsdHNlcCIsImV4dHNlcCIsCisgICAgICAgICAgICJkZXZudWxsIiwicmVhbHBhdGgiLCJzdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lcyIsInJlbHBhdGgiXQorCisjIHN0cmluZ3MgcmVwcmVzZW50aW5nIHZhcmlvdXMgcGF0aC1yZWxhdGVkIGJpdHMgYW5kIHBpZWNlcworY3VyZGlyID0gJy4nCitwYXJkaXIgPSAnLi4nCitleHRzZXAgPSAnLicKK3NlcCA9ICcvJworcGF0aHNlcCA9ICc6JworZGVmcGF0aCA9ICc6L2JpbjovdXNyL2JpbicKK2FsdHNlcCA9IE5vbmUKK2Rldm51bGwgPSAnL2Rldi9udWxsJworCisjIE5vcm1hbGl6ZSB0aGUgY2FzZSBvZiBhIHBhdGhuYW1lLiAgVHJpdmlhbCBpbiBQb3NpeCwgc3RyaW5nLmxvd2VyIG9uIE1hYy4KKyMgT24gTVMtRE9TIHRoaXMgbWF5IGFsc28gdHVybiBzbGFzaGVzIGludG8gYmFja3NsYXNoZXM7IGhvd2V2ZXIsIG90aGVyCisjIG5vcm1hbGl6YXRpb25zIChzdWNoIGFzIG9wdGltaXppbmcgJy4uLycgYXdheSkgYXJlIG5vdCBhbGxvd2VkCisjIChhbm90aGVyIGZ1bmN0aW9uIHNob3VsZCBiZSBkZWZpbmVkIHRvIGRvIHRoYXQpLgorCitkZWYgbm9ybWNhc2Uocyk6CisgICAgIiIiTm9ybWFsaXplIGNhc2Ugb2YgcGF0aG5hbWUuICBIYXMgbm8gZWZmZWN0IHVuZGVyIFBvc2l4IiIiCisgICAgcmV0dXJuIHMKKworCisjIFJldHVybiB3aGV0aGVyIGEgcGF0aCBpcyBhYnNvbHV0ZS4KKyMgVHJpdmlhbCBpbiBQb3NpeCwgaGFyZGVyIG9uIHRoZSBNYWMgb3IgTVMtRE9TLgorCitkZWYgaXNhYnMocyk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBpcyBhYnNvbHV0ZSIiIgorICAgIHJldHVybiBzLnN0YXJ0c3dpdGgoJy8nKQorCisKKyMgSm9pbiBwYXRobmFtZXMuCisjIElnbm9yZSB0aGUgcHJldmlvdXMgcGFydHMgaWYgYSBwYXJ0IGlzIGFic29sdXRlLgorIyBJbnNlcnQgYSAnLycgdW5sZXNzIHRoZSBmaXJzdCBwYXJ0IGlzIGVtcHR5IG9yIGFscmVhZHkgZW5kcyBpbiAnLycuCisKK2RlZiBqb2luKGEsICpwKToKKyAgICAiIiJKb2luIHR3byBvciBtb3JlIHBhdGhuYW1lIGNvbXBvbmVudHMsIGluc2VydGluZyAnLycgYXMgbmVlZGVkLgorICAgIElmIGFueSBjb21wb25lbnQgaXMgYW4gYWJzb2x1dGUgcGF0aCwgYWxsIHByZXZpb3VzIHBhdGggY29tcG9uZW50cworICAgIHdpbGwgYmUgZGlzY2FyZGVkLiAgQW4gZW1wdHkgbGFzdCBwYXJ0IHdpbGwgcmVzdWx0IGluIGEgcGF0aCB0aGF0CisgICAgZW5kcyB3aXRoIGEgc2VwYXJhdG9yLiIiIgorICAgIHBhdGggPSBhCisgICAgZm9yIGIgaW4gcDoKKyAgICAgICAgaWYgYi5zdGFydHN3aXRoKCcvJyk6CisgICAgICAgICAgICBwYXRoID0gYgorICAgICAgICBlbGlmIHBhdGggPT0gJycgb3IgcGF0aC5lbmRzd2l0aCgnLycpOgorICAgICAgICAgICAgcGF0aCArPSAgYgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aCArPSAnLycgKyBiCisgICAgcmV0dXJuIHBhdGgKKworCisjIFNwbGl0IGEgcGF0aCBpbiBoZWFkIChldmVyeXRoaW5nIHVwIHRvIHRoZSBsYXN0ICcvJykgYW5kIHRhaWwgKHRoZQorIyByZXN0KS4gIElmIHRoZSBwYXRoIGVuZHMgaW4gJy8nLCB0YWlsIHdpbGwgYmUgZW1wdHkuICBJZiB0aGVyZSBpcyBubworIyAnLycgaW4gdGhlIHBhdGgsIGhlYWQgIHdpbGwgYmUgZW1wdHkuCisjIFRyYWlsaW5nICcvJ2VzIGFyZSBzdHJpcHBlZCBmcm9tIGhlYWQgdW5sZXNzIGl0IGlzIHRoZSByb290LgorCitkZWYgc3BsaXQocCk6CisgICAgIiIiU3BsaXQgYSBwYXRobmFtZS4gIFJldHVybnMgdHVwbGUgIihoZWFkLCB0YWlsKSIgd2hlcmUgInRhaWwiIGlzCisgICAgZXZlcnl0aGluZyBhZnRlciB0aGUgZmluYWwgc2xhc2guICBFaXRoZXIgcGFydCBtYXkgYmUgZW1wdHkuIiIiCisgICAgaSA9IHAucmZpbmQoJy8nKSArIDEKKyAgICBoZWFkLCB0YWlsID0gcFs6aV0sIHBbaTpdCisgICAgaWYgaGVhZCBhbmQgaGVhZCAhPSAnLycqbGVuKGhlYWQpOgorICAgICAgICBoZWFkID0gaGVhZC5yc3RyaXAoJy8nKQorICAgIHJldHVybiBoZWFkLCB0YWlsCisKKworIyBTcGxpdCBhIHBhdGggaW4gcm9vdCBhbmQgZXh0ZW5zaW9uLgorIyBUaGUgZXh0ZW5zaW9uIGlzIGV2ZXJ5dGhpbmcgc3RhcnRpbmcgYXQgdGhlIGxhc3QgZG90IGluIHRoZSBsYXN0CisjIHBhdGhuYW1lIGNvbXBvbmVudDsgdGhlIHJvb3QgaXMgZXZlcnl0aGluZyBiZWZvcmUgdGhhdC4KKyMgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCByb290ICsgZXh0ID09IHAuCisKK2RlZiBzcGxpdGV4dChwKToKKyAgICByZXR1cm4gZ2VuZXJpY3BhdGguX3NwbGl0ZXh0KHAsIHNlcCwgYWx0c2VwLCBleHRzZXApCitzcGxpdGV4dC5fX2RvY19fID0gZ2VuZXJpY3BhdGguX3NwbGl0ZXh0Ll9fZG9jX18KKworIyBTcGxpdCBhIHBhdGhuYW1lIGludG8gYSBkcml2ZSBzcGVjaWZpY2F0aW9uIGFuZCB0aGUgcmVzdCBvZiB0aGUKKyMgcGF0aC4gIFVzZWZ1bCBvbiBET1MvV2luZG93cy9OVDsgb24gVW5peCwgdGhlIGRyaXZlIGlzIGFsd2F5cyBlbXB0eS4KKworZGVmIHNwbGl0ZHJpdmUocCk6CisgICAgIiIiU3BsaXQgYSBwYXRobmFtZSBpbnRvIGRyaXZlIGFuZCBwYXRoLiBPbiBQb3NpeCwgZHJpdmUgaXMgYWx3YXlzCisgICAgZW1wdHkuIiIiCisgICAgcmV0dXJuICcnLCBwCisKKworIyBSZXR1cm4gdGhlIHRhaWwgKGJhc2VuYW1lKSBwYXJ0IG9mIGEgcGF0aCwgc2FtZSBhcyBzcGxpdChwYXRoKVsxXS4KKworZGVmIGJhc2VuYW1lKHApOgorICAgICIiIlJldHVybnMgdGhlIGZpbmFsIGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lIiIiCisgICAgaSA9IHAucmZpbmQoJy8nKSArIDEKKyAgICByZXR1cm4gcFtpOl0KKworCisjIFJldHVybiB0aGUgaGVhZCAoZGlybmFtZSkgcGFydCBvZiBhIHBhdGgsIHNhbWUgYXMgc3BsaXQocGF0aClbMF0uCisKK2RlZiBkaXJuYW1lKHApOgorICAgICIiIlJldHVybnMgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgb2YgYSBwYXRobmFtZSIiIgorICAgIGkgPSBwLnJmaW5kKCcvJykgKyAxCisgICAgaGVhZCA9IHBbOmldCisgICAgaWYgaGVhZCBhbmQgaGVhZCAhPSAnLycqbGVuKGhlYWQpOgorICAgICAgICBoZWFkID0gaGVhZC5yc3RyaXAoJy8nKQorICAgIHJldHVybiBoZWFkCisKKworIyBJcyBhIHBhdGggYSBzeW1ib2xpYyBsaW5rPworIyBUaGlzIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZSBvbiBzeXN0ZW1zIHdoZXJlIG9zLmxzdGF0IGRvZXNuJ3QgZXhpc3QuCisKK2RlZiBpc2xpbmsocGF0aCk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBpcyBhIHN5bWJvbGljIGxpbmsiIiIKKyAgICB0cnk6CisgICAgICAgIHN0ID0gb3MubHN0YXQocGF0aCkKKyAgICBleGNlcHQgKG9zLmVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBzdGF0LlNfSVNMTksoc3Quc3RfbW9kZSkKKworIyBCZWluZyB0cnVlIGZvciBkYW5nbGluZyBzeW1ib2xpYyBsaW5rcyBpcyBhbHNvIHVzZWZ1bC4KKworZGVmIGxleGlzdHMocGF0aCk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBleGlzdHMuICBSZXR1cm5zIFRydWUgZm9yIGJyb2tlbiBzeW1ib2xpYyBsaW5rcyIiIgorICAgIHRyeToKKyAgICAgICAgb3MubHN0YXQocGF0aCkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCisKKworIyBBcmUgdHdvIGZpbGVuYW1lcyByZWFsbHkgcG9pbnRpbmcgdG8gdGhlIHNhbWUgZmlsZT8KKworZGVmIHNhbWVmaWxlKGYxLCBmMik6CisgICAgIiIiVGVzdCB3aGV0aGVyIHR3byBwYXRobmFtZXMgcmVmZXJlbmNlIHRoZSBzYW1lIGFjdHVhbCBmaWxlIiIiCisgICAgczEgPSBvcy5zdGF0KGYxKQorICAgIHMyID0gb3Muc3RhdChmMikKKyAgICByZXR1cm4gc2FtZXN0YXQoczEsIHMyKQorCisKKyMgQXJlIHR3byBvcGVuIGZpbGVzIHJlYWxseSByZWZlcmVuY2luZyB0aGUgc2FtZSBmaWxlPworIyAoTm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGZpbGUgZGVzY3JpcHRvciEpCisKK2RlZiBzYW1lb3BlbmZpbGUoZnAxLCBmcDIpOgorICAgICIiIlRlc3Qgd2hldGhlciB0d28gb3BlbiBmaWxlIG9iamVjdHMgcmVmZXJlbmNlIHRoZSBzYW1lIGZpbGUiIiIKKyAgICBzMSA9IG9zLmZzdGF0KGZwMSkKKyAgICBzMiA9IG9zLmZzdGF0KGZwMikKKyAgICByZXR1cm4gc2FtZXN0YXQoczEsIHMyKQorCisKKyMgQXJlIHR3byBzdGF0IGJ1ZmZlcnMgKG9idGFpbmVkIGZyb20gc3RhdCwgZnN0YXQgb3IgbHN0YXQpCisjIGRlc2NyaWJpbmcgdGhlIHNhbWUgZmlsZT8KKworZGVmIHNhbWVzdGF0KHMxLCBzMik6CisgICAgIiIiVGVzdCB3aGV0aGVyIHR3byBzdGF0IGJ1ZmZlcnMgcmVmZXJlbmNlIHRoZSBzYW1lIGZpbGUiIiIKKyAgICByZXR1cm4gczEuc3RfaW5vID09IHMyLnN0X2lubyBhbmQgXAorICAgICAgICAgICBzMS5zdF9kZXYgPT0gczIuc3RfZGV2CisKKworIyBJcyBhIHBhdGggYSBtb3VudCBwb2ludD8KKyMgKERvZXMgdGhpcyB3b3JrIGZvciBhbGwgVU5JWGVzPyAgSXMgaXQgZXZlbiBndWFyYW50ZWVkIHRvIHdvcmsgYnkgUG9zaXg/KQorCitkZWYgaXNtb3VudChwYXRoKToKKyAgICAiIiJUZXN0IHdoZXRoZXIgYSBwYXRoIGlzIGEgbW91bnQgcG9pbnQiIiIKKyAgICBpZiBpc2xpbmsocGF0aCk6CisgICAgICAgICMgQSBzeW1saW5rIGNhbiBuZXZlciBiZSBhIG1vdW50IHBvaW50CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHRyeToKKyAgICAgICAgczEgPSBvcy5sc3RhdChwYXRoKQorICAgICAgICBzMiA9IG9zLmxzdGF0KGpvaW4ocGF0aCwgJy4uJykpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UgIyBJdCBkb2Vzbid0IGV4aXN0IC0tIHNvIG5vdCBhIG1vdW50IHBvaW50IDotKQorICAgIGRldjEgPSBzMS5zdF9kZXYKKyAgICBkZXYyID0gczIuc3RfZGV2CisgICAgaWYgZGV2MSAhPSBkZXYyOgorICAgICAgICByZXR1cm4gVHJ1ZSAgICAgIyBwYXRoLy4uIG9uIGEgZGlmZmVyZW50IGRldmljZSBhcyBwYXRoCisgICAgaW5vMSA9IHMxLnN0X2lubworICAgIGlubzIgPSBzMi5zdF9pbm8KKyAgICBpZiBpbm8xID09IGlubzI6CisgICAgICAgIHJldHVybiBUcnVlICAgICAjIHBhdGgvLi4gaXMgdGhlIHNhbWUgaS1ub2RlIGFzIHBhdGgKKyAgICByZXR1cm4gRmFsc2UKKworCisjIERpcmVjdG9yeSB0cmVlIHdhbGsuCisjIEZvciBlYWNoIGRpcmVjdG9yeSB1bmRlciB0b3AgKGluY2x1ZGluZyB0b3AgaXRzZWxmLCBidXQgZXhjbHVkaW5nCisjICcuJyBhbmQgJy4uJyksIGZ1bmMoYXJnLCBkaXJuYW1lLCBmaWxlbmFtZXMpIGlzIGNhbGxlZCwgd2hlcmUKKyMgZGlybmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGFuZCBmaWxlbmFtZXMgaXMgdGhlIGxpc3QKKyMgb2YgZmlsZXMgKGFuZCBzdWJkaXJlY3RvcmllcyBldGMuKSBpbiB0aGUgZGlyZWN0b3J5LgorIyBUaGUgZnVuYyBtYXkgbW9kaWZ5IHRoZSBmaWxlbmFtZXMgbGlzdCwgdG8gaW1wbGVtZW50IGEgZmlsdGVyLAorIyBvciB0byBpbXBvc2UgYSBkaWZmZXJlbnQgb3JkZXIgb2YgdmlzaXRpbmcuCisKK2RlZiB3YWxrKHRvcCwgZnVuYywgYXJnKToKKyAgICAiIiJEaXJlY3RvcnkgdHJlZSB3YWxrIHdpdGggY2FsbGJhY2sgZnVuY3Rpb24uCisKKyAgICBGb3IgZWFjaCBkaXJlY3RvcnkgaW4gdGhlIGRpcmVjdG9yeSB0cmVlIHJvb3RlZCBhdCB0b3AgKGluY2x1ZGluZyB0b3AKKyAgICBpdHNlbGYsIGJ1dCBleGNsdWRpbmcgJy4nIGFuZCAnLi4nKSwgY2FsbCBmdW5jKGFyZywgZGlybmFtZSwgZm5hbWVzKS4KKyAgICBkaXJuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnksIGFuZCBmbmFtZXMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZgorICAgIHRoZSBmaWxlcyBhbmQgc3ViZGlyZWN0b3JpZXMgaW4gZGlybmFtZSAoZXhjbHVkaW5nICcuJyBhbmQgJy4uJykuICBmdW5jCisgICAgbWF5IG1vZGlmeSB0aGUgZm5hbWVzIGxpc3QgaW4tcGxhY2UgKGUuZy4gdmlhIGRlbCBvciBzbGljZSBhc3NpZ25tZW50KSwKKyAgICBhbmQgd2FsayB3aWxsIG9ubHkgcmVjdXJzZSBpbnRvIHRoZSBzdWJkaXJlY3RvcmllcyB3aG9zZSBuYW1lcyByZW1haW4gaW4KKyAgICBmbmFtZXM7IHRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGEgZmlsdGVyLCBvciB0byBpbXBvc2UgYSBzcGVjaWZpYworICAgIG9yZGVyIG9mIHZpc2l0aW5nLiAgTm8gc2VtYW50aWNzIGFyZSBkZWZpbmVkIGZvciwgb3IgcmVxdWlyZWQgb2YsIGFyZywKKyAgICBiZXlvbmQgdGhhdCBhcmcgaXMgYWx3YXlzIHBhc3NlZCB0byBmdW5jLiAgSXQgY2FuIGJlIHVzZWQsIGUuZy4sIHRvIHBhc3MKKyAgICBhIGZpbGVuYW1lIHBhdHRlcm4sIG9yIGEgbXV0YWJsZSBvYmplY3QgZGVzaWduZWQgdG8gYWNjdW11bGF0ZQorICAgIHN0YXRpc3RpY3MuICBQYXNzaW5nIE5vbmUgZm9yIGFyZyBpcyBjb21tb24uIiIiCisgICAgd2FybmluZ3Mud2FybnB5M2soIkluIDMueCwgb3MucGF0aC53YWxrIGlzIHJlbW92ZWQgaW4gZmF2b3Igb2Ygb3Mud2Fsay4iLAorICAgICAgICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MikKKyAgICB0cnk6CisgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcih0b3ApCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4KKyAgICBmdW5jKGFyZywgdG9wLCBuYW1lcykKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgbmFtZSA9IGpvaW4odG9wLCBuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdCA9IG9zLmxzdGF0KG5hbWUpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHN0YXQuU19JU0RJUihzdC5zdF9tb2RlKToKKyAgICAgICAgICAgIHdhbGsobmFtZSwgZnVuYywgYXJnKQorCisKKyMgRXhwYW5kIHBhdGhzIGJlZ2lubmluZyB3aXRoICd+JyBvciAnfnVzZXInLgorIyAnficgbWVhbnMgJEhPTUU7ICd+dXNlcicgbWVhbnMgdGhhdCB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCisjIElmIHRoZSBwYXRoIGRvZXNuJ3QgYmVnaW4gd2l0aCAnficsIG9yIGlmIHRoZSB1c2VyIG9yICRIT01FIGlzIHVua25vd24sCisjIHRoZSBwYXRoIGlzIHJldHVybmVkIHVuY2hhbmdlZCAobGVhdmluZyBlcnJvciByZXBvcnRpbmcgdG8gd2hhdGV2ZXIKKyMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIGV4cGFuZGVkIHBhdGggYXMgYXJndW1lbnQpLgorIyBTZWUgYWxzbyBtb2R1bGUgJ2dsb2InIGZvciBleHBhbnNpb24gb2YgKiwgPyBhbmQgWy4uLl0gaW4gcGF0aG5hbWVzLgorIyAoQSBmdW5jdGlvbiBzaG91bGQgYWxzbyBiZSBkZWZpbmVkIHRvIGRvIGZ1bGwgKnNoLXN0eWxlIGVudmlyb25tZW50CisjIHZhcmlhYmxlIGV4cGFuc2lvbi4pCisKK2RlZiBleHBhbmR1c2VyKHBhdGgpOgorICAgICIiIkV4cGFuZCB+IGFuZCB+dXNlciBjb25zdHJ1Y3Rpb25zLiAgSWYgdXNlciBvciAkSE9NRSBpcyB1bmtub3duLAorICAgIGRvIG5vdGhpbmcuIiIiCisgICAgaWYgbm90IHBhdGguc3RhcnRzd2l0aCgnficpOgorICAgICAgICByZXR1cm4gcGF0aAorICAgIGkgPSBwYXRoLmZpbmQoJy8nLCAxKQorICAgIGlmIGkgPCAwOgorICAgICAgICBpID0gbGVuKHBhdGgpCisgICAgaWYgaSA9PSAxOgorICAgICAgICBpZiAnSE9NRScgbm90IGluIG9zLmVudmlyb246CisgICAgICAgICAgICBpbXBvcnQgcHdkCisgICAgICAgICAgICB1c2VyaG9tZSA9IHB3ZC5nZXRwd3VpZChvcy5nZXR1aWQoKSkucHdfZGlyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1c2VyaG9tZSA9IG9zLmVudmlyb25bJ0hPTUUnXQorICAgIGVsc2U6CisgICAgICAgIGltcG9ydCBwd2QKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHdlbnQgPSBwd2QuZ2V0cHduYW0ocGF0aFsxOmldKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gcGF0aAorICAgICAgICB1c2VyaG9tZSA9IHB3ZW50LnB3X2RpcgorICAgIHVzZXJob21lID0gdXNlcmhvbWUucnN0cmlwKCcvJykKKyAgICByZXR1cm4gKHVzZXJob21lICsgcGF0aFtpOl0pIG9yICcvJworCisKKyMgRXhwYW5kIHBhdGhzIGNvbnRhaW5pbmcgc2hlbGwgdmFyaWFibGUgc3Vic3RpdHV0aW9ucy4KKyMgVGhpcyBleHBhbmRzIHRoZSBmb3JtcyAkdmFyaWFibGUgYW5kICR7dmFyaWFibGV9IG9ubHkuCisjIE5vbi1leGlzdGVudCB2YXJpYWJsZXMgYXJlIGxlZnQgdW5jaGFuZ2VkLgorCitfdmFycHJvZyA9IE5vbmUKKworZGVmIGV4cGFuZHZhcnMocGF0aCk6CisgICAgIiIiRXhwYW5kIHNoZWxsIHZhcmlhYmxlcyBvZiBmb3JtICR2YXIgYW5kICR7dmFyfS4gIFVua25vd24gdmFyaWFibGVzCisgICAgYXJlIGxlZnQgdW5jaGFuZ2VkLiIiIgorICAgIGdsb2JhbCBfdmFycHJvZworICAgIGlmICckJyBub3QgaW4gcGF0aDoKKyAgICAgICAgcmV0dXJuIHBhdGgKKyAgICBpZiBub3QgX3ZhcnByb2c6CisgICAgICAgIGltcG9ydCByZQorICAgICAgICBfdmFycHJvZyA9IHJlLmNvbXBpbGUocidcJChcdyt8XHtbXn1dKlx9KScpCisgICAgaSA9IDAKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBtID0gX3ZhcnByb2cuc2VhcmNoKHBhdGgsIGkpCisgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaSwgaiA9IG0uc3BhbigwKQorICAgICAgICBuYW1lID0gbS5ncm91cCgxKQorICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ3snKSBhbmQgbmFtZS5lbmRzd2l0aCgnfScpOgorICAgICAgICAgICAgbmFtZSA9IG5hbWVbMTotMV0KKyAgICAgICAgaWYgbmFtZSBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgdGFpbCA9IHBhdGhbajpdCisgICAgICAgICAgICBwYXRoID0gcGF0aFs6aV0gKyBvcy5lbnZpcm9uW25hbWVdCisgICAgICAgICAgICBpID0gbGVuKHBhdGgpCisgICAgICAgICAgICBwYXRoICs9IHRhaWwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGkgPSBqCisgICAgcmV0dXJuIHBhdGgKKworCisjIE5vcm1hbGl6ZSBhIHBhdGgsIGUuZy4gQS8vQiwgQS8uL0IgYW5kIEEvZm9vLy4uL0IgYWxsIGJlY29tZSBBL0IuCisjIEl0IHNob3VsZCBiZSB1bmRlcnN0b29kIHRoYXQgdGhpcyBtYXkgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIHRoZSBwYXRoCisjIGlmIGl0IGNvbnRhaW5zIHN5bWJvbGljIGxpbmtzIQorCitkZWYgbm9ybXBhdGgocGF0aCk6CisgICAgIiIiTm9ybWFsaXplIHBhdGgsIGVsaW1pbmF0aW5nIGRvdWJsZSBzbGFzaGVzLCBldGMuIiIiCisgICAgIyBQcmVzZXJ2ZSB1bmljb2RlIChpZiBwYXRoIGlzIHVuaWNvZGUpCisgICAgc2xhc2gsIGRvdCA9ICh1Jy8nLCB1Jy4nKSBpZiBpc2luc3RhbmNlKHBhdGgsIF91bmljb2RlKSBlbHNlICgnLycsICcuJykKKyAgICBpZiBwYXRoID09ICcnOgorICAgICAgICByZXR1cm4gZG90CisgICAgaW5pdGlhbF9zbGFzaGVzID0gcGF0aC5zdGFydHN3aXRoKCcvJykKKyAgICAjIFBPU0lYIGFsbG93cyBvbmUgb3IgdHdvIGluaXRpYWwgc2xhc2hlcywgYnV0IHRyZWF0cyB0aHJlZSBvciBtb3JlCisgICAgIyBhcyBzaW5nbGUgc2xhc2guCisgICAgaWYgKGluaXRpYWxfc2xhc2hlcyBhbmQKKyAgICAgICAgcGF0aC5zdGFydHN3aXRoKCcvLycpIGFuZCBub3QgcGF0aC5zdGFydHN3aXRoKCcvLy8nKSk6CisgICAgICAgIGluaXRpYWxfc2xhc2hlcyA9IDIKKyAgICBjb21wcyA9IHBhdGguc3BsaXQoJy8nKQorICAgIG5ld19jb21wcyA9IFtdCisgICAgZm9yIGNvbXAgaW4gY29tcHM6CisgICAgICAgIGlmIGNvbXAgaW4gKCcnLCAnLicpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgKGNvbXAgIT0gJy4uJyBvciAobm90IGluaXRpYWxfc2xhc2hlcyBhbmQgbm90IG5ld19jb21wcykgb3IKKyAgICAgICAgICAgICAobmV3X2NvbXBzIGFuZCBuZXdfY29tcHNbLTFdID09ICcuLicpKToKKyAgICAgICAgICAgIG5ld19jb21wcy5hcHBlbmQoY29tcCkKKyAgICAgICAgZWxpZiBuZXdfY29tcHM6CisgICAgICAgICAgICBuZXdfY29tcHMucG9wKCkKKyAgICBjb21wcyA9IG5ld19jb21wcworICAgIHBhdGggPSBzbGFzaC5qb2luKGNvbXBzKQorICAgIGlmIGluaXRpYWxfc2xhc2hlczoKKyAgICAgICAgcGF0aCA9IHNsYXNoKmluaXRpYWxfc2xhc2hlcyArIHBhdGgKKyAgICByZXR1cm4gcGF0aCBvciBkb3QKKworCitkZWYgYWJzcGF0aChwYXRoKToKKyAgICAiIiJSZXR1cm4gYW4gYWJzb2x1dGUgcGF0aC4iIiIKKyAgICBpZiBub3QgaXNhYnMocGF0aCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgX3VuaWNvZGUpOgorICAgICAgICAgICAgY3dkID0gb3MuZ2V0Y3dkdSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICBwYXRoID0gam9pbihjd2QsIHBhdGgpCisgICAgcmV0dXJuIG5vcm1wYXRoKHBhdGgpCisKKworIyBSZXR1cm4gYSBjYW5vbmljYWwgcGF0aCAoaS5lLiB0aGUgYWJzb2x1dGUgbG9jYXRpb24gb2YgYSBmaWxlIG9uIHRoZQorIyBmaWxlc3lzdGVtKS4KKworZGVmIHJlYWxwYXRoKGZpbGVuYW1lKToKKyAgICAiIiJSZXR1cm4gdGhlIGNhbm9uaWNhbCBwYXRoIG9mIHRoZSBzcGVjaWZpZWQgZmlsZW5hbWUsIGVsaW1pbmF0aW5nIGFueQorc3ltYm9saWMgbGlua3MgZW5jb3VudGVyZWQgaW4gdGhlIHBhdGguIiIiCisgICAgcGF0aCwgb2sgPSBfam9pbnJlYWxwYXRoKCcnLCBmaWxlbmFtZSwge30pCisgICAgcmV0dXJuIGFic3BhdGgocGF0aCkKKworIyBKb2luIHR3byBwYXRocywgbm9ybWFsaXppbmcgYW5nIGVsaW1pbmF0aW5nIGFueSBzeW1ib2xpYyBsaW5rcworIyBlbmNvdW50ZXJlZCBpbiB0aGUgc2Vjb25kIHBhdGguCitkZWYgX2pvaW5yZWFscGF0aChwYXRoLCByZXN0LCBzZWVuKToKKyAgICBpZiBpc2FicyhyZXN0KToKKyAgICAgICAgcmVzdCA9IHJlc3RbMTpdCisgICAgICAgIHBhdGggPSBzZXAKKworICAgIHdoaWxlIHJlc3Q6CisgICAgICAgIG5hbWUsIF8sIHJlc3QgPSByZXN0LnBhcnRpdGlvbihzZXApCisgICAgICAgIGlmIG5vdCBuYW1lIG9yIG5hbWUgPT0gY3VyZGlyOgorICAgICAgICAgICAgIyBjdXJyZW50IGRpcgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgbmFtZSA9PSBwYXJkaXI6CisgICAgICAgICAgICAjIHBhcmVudCBkaXIKKyAgICAgICAgICAgIGlmIHBhdGg6CisgICAgICAgICAgICAgICAgcGF0aCwgbmFtZSA9IHNwbGl0KHBhdGgpCisgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSBwYXJkaXI6CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBqb2luKHBhdGgsIHBhcmRpciwgcGFyZGlyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXRoID0gcGFyZGlyCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBuZXdwYXRoID0gam9pbihwYXRoLCBuYW1lKQorICAgICAgICBpZiBub3QgaXNsaW5rKG5ld3BhdGgpOgorICAgICAgICAgICAgcGF0aCA9IG5ld3BhdGgKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICMgUmVzb2x2ZSB0aGUgc3ltYm9saWMgbGluaworICAgICAgICBpZiBuZXdwYXRoIGluIHNlZW46CisgICAgICAgICAgICAjIEFscmVhZHkgc2VlbiB0aGlzIHBhdGgKKyAgICAgICAgICAgIHBhdGggPSBzZWVuW25ld3BhdGhdCisgICAgICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgdXNlIGNhY2hlZCB2YWx1ZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIFRoZSBzeW1saW5rIGlzIG5vdCByZXNvbHZlZCwgc28gd2UgbXVzdCBoYXZlIGEgc3ltbGluayBsb29wLgorICAgICAgICAgICAgIyBSZXR1cm4gYWxyZWFkeSByZXNvbHZlZCBwYXJ0ICsgcmVzdCBvZiB0aGUgcGF0aCB1bmNoYW5nZWQuCisgICAgICAgICAgICByZXR1cm4gam9pbihuZXdwYXRoLCByZXN0KSwgRmFsc2UKKyAgICAgICAgc2VlbltuZXdwYXRoXSA9IE5vbmUgIyBub3QgcmVzb2x2ZWQgc3ltbGluaworICAgICAgICBwYXRoLCBvayA9IF9qb2lucmVhbHBhdGgocGF0aCwgb3MucmVhZGxpbmsobmV3cGF0aCksIHNlZW4pCisgICAgICAgIGlmIG5vdCBvazoKKyAgICAgICAgICAgIHJldHVybiBqb2luKHBhdGgsIHJlc3QpLCBGYWxzZQorICAgICAgICBzZWVuW25ld3BhdGhdID0gcGF0aCAjIHJlc29sdmVkIHN5bWxpbmsKKworICAgIHJldHVybiBwYXRoLCBUcnVlCisKKworc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMgPSAoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nKQorCitkZWYgcmVscGF0aChwYXRoLCBzdGFydD1jdXJkaXIpOgorICAgICIiIlJldHVybiBhIHJlbGF0aXZlIHZlcnNpb24gb2YgYSBwYXRoIiIiCisKKyAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm8gcGF0aCBzcGVjaWZpZWQiKQorCisgICAgc3RhcnRfbGlzdCA9IFt4IGZvciB4IGluIGFic3BhdGgoc3RhcnQpLnNwbGl0KHNlcCkgaWYgeF0KKyAgICBwYXRoX2xpc3QgPSBbeCBmb3IgeCBpbiBhYnNwYXRoKHBhdGgpLnNwbGl0KHNlcCkgaWYgeF0KKworICAgICMgV29yayBvdXQgaG93IG11Y2ggb2YgdGhlIGZpbGVwYXRoIGlzIHNoYXJlZCBieSBzdGFydCBhbmQgcGF0aC4KKyAgICBpID0gbGVuKGNvbW1vbnByZWZpeChbc3RhcnRfbGlzdCwgcGF0aF9saXN0XSkpCisKKyAgICByZWxfbGlzdCA9IFtwYXJkaXJdICogKGxlbihzdGFydF9saXN0KS1pKSArIHBhdGhfbGlzdFtpOl0KKyAgICBpZiBub3QgcmVsX2xpc3Q6CisgICAgICAgIHJldHVybiBjdXJkaXIKKyAgICByZXR1cm4gam9pbigqcmVsX2xpc3QpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Bvc2l4cGF0aC5weWMgYi9saWIvcHl0aG9uMi43L3Bvc2l4cGF0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2OWFiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcG9zaXhwYXRoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Bvc2l4cGF0aC5weW8gYi9saWIvcHl0aG9uMi43L3Bvc2l4cGF0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2OWFiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcG9zaXhwYXRoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BwcmludC5weSBiL2xpYi9weXRob24yLjcvcHByaW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDA5OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BwcmludC5weQpAQCAtMCwwICsxLDM1MyBAQAorIyAgQXV0aG9yOiAgICAgIEZyZWQgTC4gRHJha2UsIEpyLgorIyAgICAgICAgICAgICAgIGZkcmFrZUBhY20ub3JnCisjCisjICBUaGlzIGlzIGEgc2ltcGxlIGxpdHRsZSBtb2R1bGUgSSB3cm90ZSB0byBtYWtlIGxpZmUgZWFzaWVyLiAgSSBkaWRuJ3QKKyMgIHNlZSBhbnl0aGluZyBxdWl0ZSBsaWtlIGl0IGluIHRoZSBsaWJyYXJ5LCB0aG91Z2ggSSBtYXkgaGF2ZSBvdmVybG9va2VkCisjICBzb21ldGhpbmcuICBJIHdyb3RlIHRoaXMgd2hlbiBJIHdhcyB0cnlpbmcgdG8gcmVhZCBzb21lIGhlYXZpbHkgbmVzdGVkCisjICB0dXBsZXMgd2l0aCBmYWlybHkgbm9uLWRlc2NyaXB0aXZlIGNvbnRlbnQuICBUaGlzIGlzIG1vZGVsZWQgdmVyeSBtdWNoCisjICBhZnRlciBMaXNwL1NjaGVtZSAtIHN0eWxlIHByZXR0eS1wcmludGluZyBvZiBsaXN0cy4gIElmIHlvdSBmaW5kIGl0CisjICB1c2VmdWwsIHRoYW5rIHNtYWxsIGNoaWxkcmVuIHdobyBzbGVlcCBhdCBuaWdodC4KKworIiIiU3VwcG9ydCB0byBwcmV0dHktcHJpbnQgbGlzdHMsIHR1cGxlcywgJiBkaWN0aW9uYXJpZXMgcmVjdXJzaXZlbHkuCisKK1Zlcnkgc2ltcGxlLCBidXQgdXNlZnVsLCBlc3BlY2lhbGx5IGluIGRlYnVnZ2luZyBkYXRhIHN0cnVjdHVyZXMuCisKK0NsYXNzZXMKKy0tLS0tLS0KKworUHJldHR5UHJpbnRlcigpCisgICAgSGFuZGxlIHByZXR0eS1wcmludGluZyBvcGVyYXRpb25zIG9udG8gYSBzdHJlYW0gdXNpbmcgYSBjb25maWd1cmVkCisgICAgc2V0IG9mIGZvcm1hdHRpbmcgcGFyYW1ldGVycy4KKworRnVuY3Rpb25zCistLS0tLS0tLS0KKworcGZvcm1hdCgpCisgICAgRm9ybWF0IGEgUHl0aG9uIG9iamVjdCBpbnRvIGEgcHJldHR5LXByaW50ZWQgcmVwcmVzZW50YXRpb24uCisKK3BwcmludCgpCisgICAgUHJldHR5LXByaW50IGEgUHl0aG9uIG9iamVjdCB0byBhIHN0cmVhbSBbZGVmYXVsdCBpcyBzeXMuc3Rkb3V0XS4KKworc2FmZXJlcHIoKQorICAgIEdlbmVyYXRlIGEgJ3N0YW5kYXJkJyByZXByKCktbGlrZSB2YWx1ZSwgYnV0IHByb3RlY3QgYWdhaW5zdCByZWN1cnNpdmUKKyAgICBkYXRhIHN0cnVjdHVyZXMuCisKKyIiIgorCitpbXBvcnQgc3lzIGFzIF9zeXMKK2ltcG9ydCB3YXJuaW5ncworCit0cnk6CisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPIGFzIF9TdHJpbmdJTworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPIGFzIF9TdHJpbmdJTworCitfX2FsbF9fID0gWyJwcHJpbnQiLCJwZm9ybWF0IiwiaXNyZWFkYWJsZSIsImlzcmVjdXJzaXZlIiwic2FmZXJlcHIiLAorICAgICAgICAgICAiUHJldHR5UHJpbnRlciJdCisKKyMgY2FjaGUgdGhlc2UgZm9yIGZhc3RlciBhY2Nlc3M6CitfY29tbWFqb2luID0gIiwgIi5qb2luCitfaWQgPSBpZAorX2xlbiA9IGxlbgorX3R5cGUgPSB0eXBlCisKKworZGVmIHBwcmludChvYmplY3QsIHN0cmVhbT1Ob25lLCBpbmRlbnQ9MSwgd2lkdGg9ODAsIGRlcHRoPU5vbmUpOgorICAgICIiIlByZXR0eS1wcmludCBhIFB5dGhvbiBvYmplY3QgdG8gYSBzdHJlYW0gW2RlZmF1bHQgaXMgc3lzLnN0ZG91dF0uIiIiCisgICAgcHJpbnRlciA9IFByZXR0eVByaW50ZXIoCisgICAgICAgIHN0cmVhbT1zdHJlYW0sIGluZGVudD1pbmRlbnQsIHdpZHRoPXdpZHRoLCBkZXB0aD1kZXB0aCkKKyAgICBwcmludGVyLnBwcmludChvYmplY3QpCisKK2RlZiBwZm9ybWF0KG9iamVjdCwgaW5kZW50PTEsIHdpZHRoPTgwLCBkZXB0aD1Ob25lKToKKyAgICAiIiJGb3JtYXQgYSBQeXRob24gb2JqZWN0IGludG8gYSBwcmV0dHktcHJpbnRlZCByZXByZXNlbnRhdGlvbi4iIiIKKyAgICByZXR1cm4gUHJldHR5UHJpbnRlcihpbmRlbnQ9aW5kZW50LCB3aWR0aD13aWR0aCwgZGVwdGg9ZGVwdGgpLnBmb3JtYXQob2JqZWN0KQorCitkZWYgc2FmZXJlcHIob2JqZWN0KToKKyAgICAiIiJWZXJzaW9uIG9mIHJlcHIoKSB3aGljaCBjYW4gaGFuZGxlIHJlY3Vyc2l2ZSBkYXRhIHN0cnVjdHVyZXMuIiIiCisgICAgcmV0dXJuIF9zYWZlX3JlcHIob2JqZWN0LCB7fSwgTm9uZSwgMClbMF0KKworZGVmIGlzcmVhZGFibGUob2JqZWN0KToKKyAgICAiIiJEZXRlcm1pbmUgaWYgc2FmZXJlcHIob2JqZWN0KSBpcyByZWFkYWJsZSBieSBldmFsKCkuIiIiCisgICAgcmV0dXJuIF9zYWZlX3JlcHIob2JqZWN0LCB7fSwgTm9uZSwgMClbMV0KKworZGVmIGlzcmVjdXJzaXZlKG9iamVjdCk6CisgICAgIiIiRGV0ZXJtaW5lIGlmIG9iamVjdCByZXF1aXJlcyBhIHJlY3Vyc2l2ZSByZXByZXNlbnRhdGlvbi4iIiIKKyAgICByZXR1cm4gX3NhZmVfcmVwcihvYmplY3QsIHt9LCBOb25lLCAwKVsyXQorCitkZWYgX3NvcnRlZChpdGVyYWJsZSk6CisgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICBpZiBfc3lzLnB5M2t3YXJuaW5nOgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJjb21wYXJpbmcgdW5lcXVhbCB0eXBlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgcmV0dXJuIHNvcnRlZChpdGVyYWJsZSkKKworY2xhc3MgUHJldHR5UHJpbnRlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZW50PTEsIHdpZHRoPTgwLCBkZXB0aD1Ob25lLCBzdHJlYW09Tm9uZSk6CisgICAgICAgICIiIkhhbmRsZSBwcmV0dHkgcHJpbnRpbmcgb3BlcmF0aW9ucyBvbnRvIGEgc3RyZWFtIHVzaW5nIGEgc2V0IG9mCisgICAgICAgIGNvbmZpZ3VyZWQgcGFyYW1ldGVycy4KKworICAgICAgICBpbmRlbnQKKyAgICAgICAgICAgIE51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IGZvciBlYWNoIGxldmVsIG9mIG5lc3RpbmcuCisKKyAgICAgICAgd2lkdGgKKyAgICAgICAgICAgIEF0dGVtcHRlZCBtYXhpbXVtIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSBvdXRwdXQuCisKKyAgICAgICAgZGVwdGgKKyAgICAgICAgICAgIFRoZSBtYXhpbXVtIGRlcHRoIHRvIHByaW50IG91dCBuZXN0ZWQgc3RydWN0dXJlcy4KKworICAgICAgICBzdHJlYW0KKyAgICAgICAgICAgIFRoZSBkZXNpcmVkIG91dHB1dCBzdHJlYW0uICBJZiBvbWl0dGVkIChvciBmYWxzZSksIHRoZSBzdGFuZGFyZAorICAgICAgICAgICAgb3V0cHV0IHN0cmVhbSBhdmFpbGFibGUgYXQgY29uc3RydWN0aW9uIHdpbGwgYmUgdXNlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgaW5kZW50ID0gaW50KGluZGVudCkKKyAgICAgICAgd2lkdGggPSBpbnQod2lkdGgpCisgICAgICAgIGFzc2VydCBpbmRlbnQgPj0gMCwgImluZGVudCBtdXN0IGJlID49IDAiCisgICAgICAgIGFzc2VydCBkZXB0aCBpcyBOb25lIG9yIGRlcHRoID4gMCwgImRlcHRoIG11c3QgYmUgPiAwIgorICAgICAgICBhc3NlcnQgd2lkdGgsICJ3aWR0aCBtdXN0IGJlICE9IDAiCisgICAgICAgIHNlbGYuX2RlcHRoID0gZGVwdGgKKyAgICAgICAgc2VsZi5faW5kZW50X3Blcl9sZXZlbCA9IGluZGVudAorICAgICAgICBzZWxmLl93aWR0aCA9IHdpZHRoCisgICAgICAgIGlmIHN0cmVhbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3N0cmVhbSA9IHN0cmVhbQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fc3RyZWFtID0gX3N5cy5zdGRvdXQKKworICAgIGRlZiBwcHJpbnQoc2VsZiwgb2JqZWN0KToKKyAgICAgICAgc2VsZi5fZm9ybWF0KG9iamVjdCwgc2VsZi5fc3RyZWFtLCAwLCAwLCB7fSwgMCkKKyAgICAgICAgc2VsZi5fc3RyZWFtLndyaXRlKCJcbiIpCisKKyAgICBkZWYgcGZvcm1hdChzZWxmLCBvYmplY3QpOgorICAgICAgICBzaW8gPSBfU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9mb3JtYXQob2JqZWN0LCBzaW8sIDAsIDAsIHt9LCAwKQorICAgICAgICByZXR1cm4gc2lvLmdldHZhbHVlKCkKKworICAgIGRlZiBpc3JlY3Vyc2l2ZShzZWxmLCBvYmplY3QpOgorICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXQob2JqZWN0LCB7fSwgMCwgMClbMl0KKworICAgIGRlZiBpc3JlYWRhYmxlKHNlbGYsIG9iamVjdCk6CisgICAgICAgIHMsIHJlYWRhYmxlLCByZWN1cnNpdmUgPSBzZWxmLmZvcm1hdChvYmplY3QsIHt9LCAwLCAwKQorICAgICAgICByZXR1cm4gcmVhZGFibGUgYW5kIG5vdCByZWN1cnNpdmUKKworICAgIGRlZiBfZm9ybWF0KHNlbGYsIG9iamVjdCwgc3RyZWFtLCBpbmRlbnQsIGFsbG93YW5jZSwgY29udGV4dCwgbGV2ZWwpOgorICAgICAgICBsZXZlbCA9IGxldmVsICsgMQorICAgICAgICBvYmppZCA9IF9pZChvYmplY3QpCisgICAgICAgIGlmIG9iamlkIGluIGNvbnRleHQ6CisgICAgICAgICAgICBzdHJlYW0ud3JpdGUoX3JlY3Vyc2lvbihvYmplY3QpKQorICAgICAgICAgICAgc2VsZi5fcmVjdXJzaXZlID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5fcmVhZGFibGUgPSBGYWxzZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJlcCA9IHNlbGYuX3JlcHIob2JqZWN0LCBjb250ZXh0LCBsZXZlbCAtIDEpCisgICAgICAgIHR5cCA9IF90eXBlKG9iamVjdCkKKyAgICAgICAgc2VwTGluZXMgPSBfbGVuKHJlcCkgPiAoc2VsZi5fd2lkdGggLSAxIC0gaW5kZW50IC0gYWxsb3dhbmNlKQorICAgICAgICB3cml0ZSA9IHN0cmVhbS53cml0ZQorCisgICAgICAgIGlmIHNlbGYuX2RlcHRoIGFuZCBsZXZlbCA+IHNlbGYuX2RlcHRoOgorICAgICAgICAgICAgd3JpdGUocmVwKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgciA9IGdldGF0dHIodHlwLCAiX19yZXByX18iLCBOb25lKQorICAgICAgICBpZiBpc3N1YmNsYXNzKHR5cCwgZGljdCkgYW5kIHIgaXMgZGljdC5fX3JlcHJfXzoKKyAgICAgICAgICAgIHdyaXRlKCd7JykKKyAgICAgICAgICAgIGlmIHNlbGYuX2luZGVudF9wZXJfbGV2ZWwgPiAxOgorICAgICAgICAgICAgICAgIHdyaXRlKChzZWxmLl9pbmRlbnRfcGVyX2xldmVsIC0gMSkgKiAnICcpCisgICAgICAgICAgICBsZW5ndGggPSBfbGVuKG9iamVjdCkKKyAgICAgICAgICAgIGlmIGxlbmd0aDoKKyAgICAgICAgICAgICAgICBjb250ZXh0W29iamlkXSA9IDEKKyAgICAgICAgICAgICAgICBpbmRlbnQgPSBpbmRlbnQgKyBzZWxmLl9pbmRlbnRfcGVyX2xldmVsCisgICAgICAgICAgICAgICAgaXRlbXMgPSBfc29ydGVkKG9iamVjdC5pdGVtcygpKQorICAgICAgICAgICAgICAgIGtleSwgZW50ID0gaXRlbXNbMF0KKyAgICAgICAgICAgICAgICByZXAgPSBzZWxmLl9yZXByKGtleSwgY29udGV4dCwgbGV2ZWwpCisgICAgICAgICAgICAgICAgd3JpdGUocmVwKQorICAgICAgICAgICAgICAgIHdyaXRlKCc6ICcpCisgICAgICAgICAgICAgICAgc2VsZi5fZm9ybWF0KGVudCwgc3RyZWFtLCBpbmRlbnQgKyBfbGVuKHJlcCkgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dhbmNlICsgMSwgY29udGV4dCwgbGV2ZWwpCisgICAgICAgICAgICAgICAgaWYgbGVuZ3RoID4gMToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGtleSwgZW50IGluIGl0ZW1zWzE6XToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcCA9IHNlbGYuX3JlcHIoa2V5LCBjb250ZXh0LCBsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlcExpbmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKCcsXG4lcyVzOiAnICUgKCcgJyppbmRlbnQsIHJlcCkpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKCcsICVzOiAnICUgcmVwKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZm9ybWF0KGVudCwgc3RyZWFtLCBpbmRlbnQgKyBfbGVuKHJlcCkgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2FuY2UgKyAxLCBjb250ZXh0LCBsZXZlbCkKKyAgICAgICAgICAgICAgICBpbmRlbnQgPSBpbmRlbnQgLSBzZWxmLl9pbmRlbnRfcGVyX2xldmVsCisgICAgICAgICAgICAgICAgZGVsIGNvbnRleHRbb2JqaWRdCisgICAgICAgICAgICB3cml0ZSgnfScpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiAoKGlzc3ViY2xhc3ModHlwLCBsaXN0KSBhbmQgciBpcyBsaXN0Ll9fcmVwcl9fKSBvcgorICAgICAgICAgICAgKGlzc3ViY2xhc3ModHlwLCB0dXBsZSkgYW5kIHIgaXMgdHVwbGUuX19yZXByX18pIG9yCisgICAgICAgICAgICAoaXNzdWJjbGFzcyh0eXAsIHNldCkgYW5kIHIgaXMgc2V0Ll9fcmVwcl9fKSBvcgorICAgICAgICAgICAgKGlzc3ViY2xhc3ModHlwLCBmcm96ZW5zZXQpIGFuZCByIGlzIGZyb3plbnNldC5fX3JlcHJfXykKKyAgICAgICAgICAgKToKKyAgICAgICAgICAgIGxlbmd0aCA9IF9sZW4ob2JqZWN0KQorICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyh0eXAsIGxpc3QpOgorICAgICAgICAgICAgICAgIHdyaXRlKCdbJykKKyAgICAgICAgICAgICAgICBlbmRjaGFyID0gJ10nCisgICAgICAgICAgICBlbGlmIGlzc3ViY2xhc3ModHlwLCBzZXQpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBsZW5ndGg6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlKCdzZXQoKScpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHdyaXRlKCdzZXQoWycpCisgICAgICAgICAgICAgICAgZW5kY2hhciA9ICddKScKKyAgICAgICAgICAgICAgICBvYmplY3QgPSBfc29ydGVkKG9iamVjdCkKKyAgICAgICAgICAgICAgICBpbmRlbnQgKz0gNAorICAgICAgICAgICAgZWxpZiBpc3N1YmNsYXNzKHR5cCwgZnJvemVuc2V0KToKKyAgICAgICAgICAgICAgICBpZiBub3QgbGVuZ3RoOgorICAgICAgICAgICAgICAgICAgICB3cml0ZSgnZnJvemVuc2V0KCknKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICB3cml0ZSgnZnJvemVuc2V0KFsnKQorICAgICAgICAgICAgICAgIGVuZGNoYXIgPSAnXSknCisgICAgICAgICAgICAgICAgb2JqZWN0ID0gX3NvcnRlZChvYmplY3QpCisgICAgICAgICAgICAgICAgaW5kZW50ICs9IDEwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdyaXRlKCcoJykKKyAgICAgICAgICAgICAgICBlbmRjaGFyID0gJyknCisgICAgICAgICAgICBpZiBzZWxmLl9pbmRlbnRfcGVyX2xldmVsID4gMSBhbmQgc2VwTGluZXM6CisgICAgICAgICAgICAgICAgd3JpdGUoKHNlbGYuX2luZGVudF9wZXJfbGV2ZWwgLSAxKSAqICcgJykKKyAgICAgICAgICAgIGlmIGxlbmd0aDoKKyAgICAgICAgICAgICAgICBjb250ZXh0W29iamlkXSA9IDEKKyAgICAgICAgICAgICAgICBpbmRlbnQgPSBpbmRlbnQgKyBzZWxmLl9pbmRlbnRfcGVyX2xldmVsCisgICAgICAgICAgICAgICAgc2VsZi5fZm9ybWF0KG9iamVjdFswXSwgc3RyZWFtLCBpbmRlbnQsIGFsbG93YW5jZSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGxldmVsKQorICAgICAgICAgICAgICAgIGlmIGxlbmd0aCA+IDE6CisgICAgICAgICAgICAgICAgICAgIGZvciBlbnQgaW4gb2JqZWN0WzE6XToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlcExpbmVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKCcsXG4nICsgJyAnKmluZGVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUoJywgJykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Zvcm1hdChlbnQsIHN0cmVhbSwgaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2FuY2UgKyAxLCBjb250ZXh0LCBsZXZlbCkKKyAgICAgICAgICAgICAgICBpbmRlbnQgPSBpbmRlbnQgLSBzZWxmLl9pbmRlbnRfcGVyX2xldmVsCisgICAgICAgICAgICAgICAgZGVsIGNvbnRleHRbb2JqaWRdCisgICAgICAgICAgICBpZiBpc3N1YmNsYXNzKHR5cCwgdHVwbGUpIGFuZCBsZW5ndGggPT0gMToKKyAgICAgICAgICAgICAgICB3cml0ZSgnLCcpCisgICAgICAgICAgICB3cml0ZShlbmRjaGFyKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgd3JpdGUocmVwKQorCisgICAgZGVmIF9yZXByKHNlbGYsIG9iamVjdCwgY29udGV4dCwgbGV2ZWwpOgorICAgICAgICByZXByLCByZWFkYWJsZSwgcmVjdXJzaXZlID0gc2VsZi5mb3JtYXQob2JqZWN0LCBjb250ZXh0LmNvcHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RlcHRoLCBsZXZlbCkKKyAgICAgICAgaWYgbm90IHJlYWRhYmxlOgorICAgICAgICAgICAgc2VsZi5fcmVhZGFibGUgPSBGYWxzZQorICAgICAgICBpZiByZWN1cnNpdmU6CisgICAgICAgICAgICBzZWxmLl9yZWN1cnNpdmUgPSBUcnVlCisgICAgICAgIHJldHVybiByZXByCisKKyAgICBkZWYgZm9ybWF0KHNlbGYsIG9iamVjdCwgY29udGV4dCwgbWF4bGV2ZWxzLCBsZXZlbCk6CisgICAgICAgICIiIkZvcm1hdCBvYmplY3QgZm9yIGEgc3BlY2lmaWMgY29udGV4dCwgcmV0dXJuaW5nIGEgc3RyaW5nCisgICAgICAgIGFuZCBmbGFncyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlcHJlc2VudGF0aW9uIGlzICdyZWFkYWJsZScKKyAgICAgICAgYW5kIHdoZXRoZXIgdGhlIG9iamVjdCByZXByZXNlbnRzIGEgcmVjdXJzaXZlIGNvbnN0cnVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBfc2FmZV9yZXByKG9iamVjdCwgY29udGV4dCwgbWF4bGV2ZWxzLCBsZXZlbCkKKworCisjIFJldHVybiB0cmlwbGUgKHJlcHJfc3RyaW5nLCBpc3JlYWRhYmxlLCBpc3JlY3Vyc2l2ZSkuCisKK2RlZiBfc2FmZV9yZXByKG9iamVjdCwgY29udGV4dCwgbWF4bGV2ZWxzLCBsZXZlbCk6CisgICAgdHlwID0gX3R5cGUob2JqZWN0KQorICAgIGlmIHR5cCBpcyBzdHI6CisgICAgICAgIGlmICdsb2NhbGUnIG5vdCBpbiBfc3lzLm1vZHVsZXM6CisgICAgICAgICAgICByZXR1cm4gcmVwcihvYmplY3QpLCBUcnVlLCBGYWxzZQorICAgICAgICBpZiAiJyIgaW4gb2JqZWN0IGFuZCAnIicgbm90IGluIG9iamVjdDoKKyAgICAgICAgICAgIGNsb3N1cmUgPSAnIicKKyAgICAgICAgICAgIHF1b3RlcyA9IHsnIic6ICdcXCInfQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2xvc3VyZSA9ICInIgorICAgICAgICAgICAgcXVvdGVzID0geyInIjogIlxcJyJ9CisgICAgICAgIHFnZXQgPSBxdW90ZXMuZ2V0CisgICAgICAgIHNpbyA9IF9TdHJpbmdJTygpCisgICAgICAgIHdyaXRlID0gc2lvLndyaXRlCisgICAgICAgIGZvciBjaGFyIGluIG9iamVjdDoKKyAgICAgICAgICAgIGlmIGNoYXIuaXNhbHBoYSgpOgorICAgICAgICAgICAgICAgIHdyaXRlKGNoYXIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdyaXRlKHFnZXQoY2hhciwgcmVwcihjaGFyKVsxOi0xXSkpCisgICAgICAgIHJldHVybiAoIiVzJXMlcyIgJSAoY2xvc3VyZSwgc2lvLmdldHZhbHVlKCksIGNsb3N1cmUpKSwgVHJ1ZSwgRmFsc2UKKworICAgIHIgPSBnZXRhdHRyKHR5cCwgIl9fcmVwcl9fIiwgTm9uZSkKKyAgICBpZiBpc3N1YmNsYXNzKHR5cCwgZGljdCkgYW5kIHIgaXMgZGljdC5fX3JlcHJfXzoKKyAgICAgICAgaWYgbm90IG9iamVjdDoKKyAgICAgICAgICAgIHJldHVybiAie30iLCBUcnVlLCBGYWxzZQorICAgICAgICBvYmppZCA9IF9pZChvYmplY3QpCisgICAgICAgIGlmIG1heGxldmVscyBhbmQgbGV2ZWwgPj0gbWF4bGV2ZWxzOgorICAgICAgICAgICAgcmV0dXJuICJ7Li4ufSIsIEZhbHNlLCBvYmppZCBpbiBjb250ZXh0CisgICAgICAgIGlmIG9iamlkIGluIGNvbnRleHQ6CisgICAgICAgICAgICByZXR1cm4gX3JlY3Vyc2lvbihvYmplY3QpLCBGYWxzZSwgVHJ1ZQorICAgICAgICBjb250ZXh0W29iamlkXSA9IDEKKyAgICAgICAgcmVhZGFibGUgPSBUcnVlCisgICAgICAgIHJlY3Vyc2l2ZSA9IEZhbHNlCisgICAgICAgIGNvbXBvbmVudHMgPSBbXQorICAgICAgICBhcHBlbmQgPSBjb21wb25lbnRzLmFwcGVuZAorICAgICAgICBsZXZlbCArPSAxCisgICAgICAgIHNhZmVyZXByID0gX3NhZmVfcmVwcgorICAgICAgICBmb3IgaywgdiBpbiBfc29ydGVkKG9iamVjdC5pdGVtcygpKToKKyAgICAgICAgICAgIGtyZXByLCBrcmVhZGFibGUsIGtyZWN1ciA9IHNhZmVyZXByKGssIGNvbnRleHQsIG1heGxldmVscywgbGV2ZWwpCisgICAgICAgICAgICB2cmVwciwgdnJlYWRhYmxlLCB2cmVjdXIgPSBzYWZlcmVwcih2LCBjb250ZXh0LCBtYXhsZXZlbHMsIGxldmVsKQorICAgICAgICAgICAgYXBwZW5kKCIlczogJXMiICUgKGtyZXByLCB2cmVwcikpCisgICAgICAgICAgICByZWFkYWJsZSA9IHJlYWRhYmxlIGFuZCBrcmVhZGFibGUgYW5kIHZyZWFkYWJsZQorICAgICAgICAgICAgaWYga3JlY3VyIG9yIHZyZWN1cjoKKyAgICAgICAgICAgICAgICByZWN1cnNpdmUgPSBUcnVlCisgICAgICAgIGRlbCBjb250ZXh0W29iamlkXQorICAgICAgICByZXR1cm4gInslc30iICUgX2NvbW1ham9pbihjb21wb25lbnRzKSwgcmVhZGFibGUsIHJlY3Vyc2l2ZQorCisgICAgaWYgKGlzc3ViY2xhc3ModHlwLCBsaXN0KSBhbmQgciBpcyBsaXN0Ll9fcmVwcl9fKSBvciBcCisgICAgICAgKGlzc3ViY2xhc3ModHlwLCB0dXBsZSkgYW5kIHIgaXMgdHVwbGUuX19yZXByX18pOgorICAgICAgICBpZiBpc3N1YmNsYXNzKHR5cCwgbGlzdCk6CisgICAgICAgICAgICBpZiBub3Qgb2JqZWN0OgorICAgICAgICAgICAgICAgIHJldHVybiAiW10iLCBUcnVlLCBGYWxzZQorICAgICAgICAgICAgZm9ybWF0ID0gIlslc10iCisgICAgICAgIGVsaWYgX2xlbihvYmplY3QpID09IDE6CisgICAgICAgICAgICBmb3JtYXQgPSAiKCVzLCkiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3Qgb2JqZWN0OgorICAgICAgICAgICAgICAgIHJldHVybiAiKCkiLCBUcnVlLCBGYWxzZQorICAgICAgICAgICAgZm9ybWF0ID0gIiglcykiCisgICAgICAgIG9iamlkID0gX2lkKG9iamVjdCkKKyAgICAgICAgaWYgbWF4bGV2ZWxzIGFuZCBsZXZlbCA+PSBtYXhsZXZlbHM6CisgICAgICAgICAgICByZXR1cm4gZm9ybWF0ICUgIi4uLiIsIEZhbHNlLCBvYmppZCBpbiBjb250ZXh0CisgICAgICAgIGlmIG9iamlkIGluIGNvbnRleHQ6CisgICAgICAgICAgICByZXR1cm4gX3JlY3Vyc2lvbihvYmplY3QpLCBGYWxzZSwgVHJ1ZQorICAgICAgICBjb250ZXh0W29iamlkXSA9IDEKKyAgICAgICAgcmVhZGFibGUgPSBUcnVlCisgICAgICAgIHJlY3Vyc2l2ZSA9IEZhbHNlCisgICAgICAgIGNvbXBvbmVudHMgPSBbXQorICAgICAgICBhcHBlbmQgPSBjb21wb25lbnRzLmFwcGVuZAorICAgICAgICBsZXZlbCArPSAxCisgICAgICAgIGZvciBvIGluIG9iamVjdDoKKyAgICAgICAgICAgIG9yZXByLCBvcmVhZGFibGUsIG9yZWN1ciA9IF9zYWZlX3JlcHIobywgY29udGV4dCwgbWF4bGV2ZWxzLCBsZXZlbCkKKyAgICAgICAgICAgIGFwcGVuZChvcmVwcikKKyAgICAgICAgICAgIGlmIG5vdCBvcmVhZGFibGU6CisgICAgICAgICAgICAgICAgcmVhZGFibGUgPSBGYWxzZQorICAgICAgICAgICAgaWYgb3JlY3VyOgorICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZSA9IFRydWUKKyAgICAgICAgZGVsIGNvbnRleHRbb2JqaWRdCisgICAgICAgIHJldHVybiBmb3JtYXQgJSBfY29tbWFqb2luKGNvbXBvbmVudHMpLCByZWFkYWJsZSwgcmVjdXJzaXZlCisKKyAgICByZXAgPSByZXByKG9iamVjdCkKKyAgICByZXR1cm4gcmVwLCAocmVwIGFuZCBub3QgcmVwLnN0YXJ0c3dpdGgoJzwnKSksIEZhbHNlCisKKworZGVmIF9yZWN1cnNpb24ob2JqZWN0KToKKyAgICByZXR1cm4gKCI8UmVjdXJzaW9uIG9uICVzIHdpdGggaWQ9JXM+IgorICAgICAgICAgICAgJSAoX3R5cGUob2JqZWN0KS5fX25hbWVfXywgX2lkKG9iamVjdCkpKQorCisKK2RlZiBfcGVyZmNoZWNrKG9iamVjdD1Ob25lKToKKyAgICBpbXBvcnQgdGltZQorICAgIGlmIG9iamVjdCBpcyBOb25lOgorICAgICAgICBvYmplY3QgPSBbKCJzdHJpbmciLCAoMSwgMiksIFszLCA0XSwgezU6IDYsIDc6IDh9KV0gKiAxMDAwMDAKKyAgICBwID0gUHJldHR5UHJpbnRlcigpCisgICAgdDEgPSB0aW1lLnRpbWUoKQorICAgIF9zYWZlX3JlcHIob2JqZWN0LCB7fSwgTm9uZSwgMCkKKyAgICB0MiA9IHRpbWUudGltZSgpCisgICAgcC5wZm9ybWF0KG9iamVjdCkKKyAgICB0MyA9IHRpbWUudGltZSgpCisgICAgcHJpbnQgIl9zYWZlX3JlcHI6IiwgdDIgLSB0MQorICAgIHByaW50ICJwZm9ybWF0OiIsIHQzIC0gdDIKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBfcGVyZmNoZWNrKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHByaW50LnB5YyBiL2xpYi9weXRob24yLjcvcHByaW50LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmJiMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wcHJpbnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHByaW50LnB5byBiL2xpYi9weXRob24yLjcvcHByaW50LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzdmZjkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wcHJpbnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHJvZmlsZS5weSBiL2xpYi9weXRob24yLjcvcHJvZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOTdhYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wcm9maWxlLnB5CkBAIC0wLDAgKzEsNjEwIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENsYXNzIGZvciBwcm9maWxpbmcgcHl0aG9uIGNvZGUuIHJldiAxLjAgIDYvMi85NAorIworIyBXcml0dGVuIGJ5IEphbWVzIFJvc2tpbmQKKyMgQmFzZWQgb24gcHJpb3IgcHJvZmlsZSBtb2R1bGUgYnkgU2pvZXJkIE11bGxlbmRlci4uLgorIyAgIHdoaWNoIHdhcyBoYWNrZWQgc29tZXdoYXQgYnk6IEd1aWRvIHZhbiBSb3NzdW0KKworIiIiQ2xhc3MgZm9yIHByb2ZpbGluZyBQeXRob24gY29kZS4iIiIKKworIyBDb3B5cmlnaHQgRGlzbmV5IEVudGVycHJpc2VzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELAorIyBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyMgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB0aW1lCitpbXBvcnQgbWFyc2hhbAorZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uUGFyc2VyCisKK19fYWxsX18gPSBbInJ1biIsICJydW5jdHgiLCAiaGVscCIsICJQcm9maWxlIl0KKworIyBTYW1wbGUgdGltZXIgZm9yIHVzZSB3aXRoCisjaV9jb3VudCA9IDAKKyNkZWYgaW50ZWdlcl90aW1lcigpOgorIyAgICAgICBnbG9iYWwgaV9jb3VudAorIyAgICAgICBpX2NvdW50ID0gaV9jb3VudCArIDEKKyMgICAgICAgcmV0dXJuIGlfY291bnQKKyNpdGltZXMgPSBpbnRlZ2VyX3RpbWVyICMgcmVwbGFjZSB3aXRoIEMgY29kZWQgdGltZXIgcmV0dXJuaW5nIGludGVnZXJzCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBUaGUgZm9sbG93aW5nIGFyZSB0aGUgc3RhdGljIG1lbWJlciBmdW5jdGlvbnMgZm9yIHRoZSBwcm9maWxlciBjbGFzcworIyBOb3RlIHRoYXQgYW4gaW5zdGFuY2Ugb2YgUHJvZmlsZSgpIGlzICpub3QqIG5lZWRlZCB0byBjYWxsIHRoZW0uCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworZGVmIHJ1bihzdGF0ZW1lbnQsIGZpbGVuYW1lPU5vbmUsIHNvcnQ9LTEpOgorICAgICIiIlJ1biBzdGF0ZW1lbnQgdW5kZXIgcHJvZmlsZXIgb3B0aW9uYWxseSBzYXZpbmcgcmVzdWx0cyBpbiBmaWxlbmFtZQorCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdGhlCisgICAgImV4ZWMiIHN0YXRlbWVudCwgYW5kIGFuIG9wdGlvbmFsIGZpbGUgbmFtZS4gIEluIGFsbCBjYXNlcyB0aGlzCisgICAgcm91dGluZSBhdHRlbXB0cyB0byAiZXhlYyIgaXRzIGZpcnN0IGFyZ3VtZW50IGFuZCBnYXRoZXIgcHJvZmlsaW5nCisgICAgc3RhdGlzdGljcyBmcm9tIHRoZSBleGVjdXRpb24uIElmIG5vIGZpbGUgbmFtZSBpcyBwcmVzZW50LCB0aGVuIHRoaXMKKyAgICBmdW5jdGlvbiBhdXRvbWF0aWNhbGx5IHByaW50cyBhIHNpbXBsZSBwcm9maWxpbmcgcmVwb3J0LCBzb3J0ZWQgYnkgdGhlCisgICAgc3RhbmRhcmQgbmFtZSBzdHJpbmcgKGZpbGUvbGluZS9mdW5jdGlvbi1uYW1lKSB0aGF0IGlzIHByZXNlbnRlZCBpbgorICAgIGVhY2ggbGluZS4KKyAgICAiIiIKKyAgICBwcm9mID0gUHJvZmlsZSgpCisgICAgdHJ5OgorICAgICAgICBwcm9mID0gcHJvZi5ydW4oc3RhdGVtZW50KQorICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICBwYXNzCisgICAgaWYgZmlsZW5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgIHByb2YuZHVtcF9zdGF0cyhmaWxlbmFtZSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcHJvZi5wcmludF9zdGF0cyhzb3J0KQorCitkZWYgcnVuY3R4KHN0YXRlbWVudCwgZ2xvYmFscywgbG9jYWxzLCBmaWxlbmFtZT1Ob25lLCBzb3J0PS0xKToKKyAgICAiIiJSdW4gc3RhdGVtZW50IHVuZGVyIHByb2ZpbGVyLCBzdXBwbHlpbmcgeW91ciBvd24gZ2xvYmFscyBhbmQgbG9jYWxzLAorICAgIG9wdGlvbmFsbHkgc2F2aW5nIHJlc3VsdHMgaW4gZmlsZW5hbWUuCisKKyAgICBzdGF0ZW1lbnQgYW5kIGZpbGVuYW1lIGhhdmUgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHByb2ZpbGUucnVuCisgICAgIiIiCisgICAgcHJvZiA9IFByb2ZpbGUoKQorICAgIHRyeToKKyAgICAgICAgcHJvZiA9IHByb2YucnVuY3R4KHN0YXRlbWVudCwgZ2xvYmFscywgbG9jYWxzKQorICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICBwYXNzCisKKyAgICBpZiBmaWxlbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgcHJvZi5kdW1wX3N0YXRzKGZpbGVuYW1lKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBwcm9mLnByaW50X3N0YXRzKHNvcnQpCisKKyMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCitkZWYgaGVscCgpOgorICAgIHByaW50ICJEb2N1bWVudGF0aW9uIGZvciB0aGUgcHJvZmlsZSBtb2R1bGUgY2FuIGJlIGZvdW5kICIKKyAgICBwcmludCAiaW4gdGhlIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSwgc2VjdGlvbiAnVGhlIFB5dGhvbiBQcm9maWxlcicuIgorCitpZiBoYXNhdHRyKG9zLCAidGltZXMiKToKKyAgICBkZWYgX2dldF90aW1lX3RpbWVzKHRpbWVyPW9zLnRpbWVzKToKKyAgICAgICAgdCA9IHRpbWVyKCkKKyAgICAgICAgcmV0dXJuIHRbMF0gKyB0WzFdCisKKyMgVXNpbmcgZ2V0cnVzYWdlKDMpIGlzIGJldHRlciB0aGFuIGNsb2NrKDMpIGlmIGF2YWlsYWJsZToKKyMgb24gc29tZSBzeXN0ZW1zIChlLmcuIEZyZWVCU0QpLCBnZXRydXNhZ2UgaGFzIGEgaGlnaGVyIHJlc29sdXRpb24KKyMgRnVydGhlcm1vcmUsIG9uIGEgUE9TSVggc3lzdGVtLCByZXR1cm5zIG1pY3Jvc2Vjb25kcywgd2hpY2gKKyMgd3JhcCBhcm91bmQgYWZ0ZXIgMzZtaW4uCitfaGFzX3JlcyA9IDAKK3RyeToKKyAgICBpbXBvcnQgcmVzb3VyY2UKKyAgICByZXNnZXRydXNhZ2UgPSBsYW1iZGE6IHJlc291cmNlLmdldHJ1c2FnZShyZXNvdXJjZS5SVVNBR0VfU0VMRikKKyAgICBkZWYgX2dldF90aW1lX3Jlc291cmNlKHRpbWVyPXJlc2dldHJ1c2FnZSk6CisgICAgICAgIHQgPSB0aW1lcigpCisgICAgICAgIHJldHVybiB0WzBdICsgdFsxXQorICAgIF9oYXNfcmVzID0gMQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKKworY2xhc3MgUHJvZmlsZToKKyAgICAiIiJQcm9maWxlciBjbGFzcy4KKworICAgIHNlbGYuY3VyIGlzIGFsd2F5cyBhIHR1cGxlLiAgRWFjaCBzdWNoIHR1cGxlIGNvcnJlc3BvbmRzIHRvIGEgc3RhY2sKKyAgICBmcmFtZSB0aGF0IGlzIGN1cnJlbnRseSBhY3RpdmUgKHNlbGYuY3VyWy0yXSkuICBUaGUgZm9sbG93aW5nIGFyZSB0aGUKKyAgICBkZWZpbml0aW9ucyBvZiBpdHMgbWVtYmVycy4gIFdlIHVzZSB0aGlzIGV4dGVybmFsICJwYXJhbGxlbCBzdGFjayIgdG8KKyAgICBhdm9pZCBjb250YW1pbmF0aW5nIHRoZSBwcm9ncmFtIHRoYXQgd2UgYXJlIHByb2ZpbGluZy4gKG9sZCBwcm9maWxlcgorICAgIHVzZWQgdG8gd3JpdGUgaW50byB0aGUgZnJhbWVzIGxvY2FsIGRpY3Rpb25hcnkhISkgRGVyaXZlZCBjbGFzc2VzCisgICAgY2FuIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZiBzb21lIGVudHJpZXMsIGFzIGxvbmcgYXMgdGhleSBsZWF2ZQorICAgIFstMjpdIGludGFjdCAoZnJhbWUgYW5kIHByZXZpb3VzIHR1cGxlKS4gIEluIGNhc2UgYW4gaW50ZXJuYWwgZXJyb3IgaXMKKyAgICBkZXRlY3RlZCwgdGhlIC0zIGVsZW1lbnQgaXMgdXNlZCBhcyB0aGUgZnVuY3Rpb24gbmFtZS4KKworICAgIFsgMF0gPSBUaW1lIHRoYXQgbmVlZHMgdG8gYmUgY2hhcmdlZCB0byB0aGUgcGFyZW50IGZyYW1lJ3MgZnVuY3Rpb24uCisgICAgICAgICAgIEl0IGlzIHVzZWQgc28gdGhhdCBhIGZ1bmN0aW9uIGNhbGwgd2lsbCBub3QgaGF2ZSB0byBhY2Nlc3MgdGhlCisgICAgICAgICAgIHRpbWluZyBkYXRhIGZvciB0aGUgcGFyZW50IGZyYW1lLgorICAgIFsgMV0gPSBUb3RhbCB0aW1lIHNwZW50IGluIHRoaXMgZnJhbWUncyBmdW5jdGlvbiwgZXhjbHVkaW5nIHRpbWUgaW4KKyAgICAgICAgICAgc3ViZnVuY3Rpb25zICh0aGlzIGxhdHRlciBpcyB0YWxsaWVkIGluIGN1clsyXSkuCisgICAgWyAyXSA9IFRvdGFsIHRpbWUgc3BlbnQgaW4gc3ViZnVuY3Rpb25zLCBleGNsdWRpbmcgdGltZSBleGVjdXRpbmcgdGhlCisgICAgICAgICAgIGZyYW1lJ3MgZnVuY3Rpb24gKHRoaXMgbGF0dGVyIGlzIHRhbGxpZWQgaW4gY3VyWzFdKS4KKyAgICBbLTNdID0gTmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIGZyYW1lLgorICAgIFstMl0gPSBBY3R1YWwgZnJhbWUgdGhhdCB3ZSBjb3JyZXNwb25kIHRvICh1c2VkIHRvIHN5bmMgZXhjZXB0aW9uIGhhbmRsaW5nKS4KKyAgICBbLTFdID0gT3VyIHBhcmVudCA2LXR1cGxlIChjb3JyZXNwb25kcyB0byBmcmFtZS5mX2JhY2spLgorCisgICAgVGltaW5nIGRhdGEgZm9yIGVhY2ggZnVuY3Rpb24gaXMgc3RvcmVkIGFzIGEgNS10dXBsZSBpbiB0aGUgZGljdGlvbmFyeQorICAgIHNlbGYudGltaW5nc1tdLiAgVGhlIGluZGV4IGlzIGFsd2F5cyB0aGUgbmFtZSBzdG9yZWQgaW4gc2VsZi5jdXJbLTNdLgorICAgIFRoZSBmb2xsb3dpbmcgYXJlIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgbWVtYmVyczoKKworICAgIFswXSA9IFRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkLCBub3QgY291bnRpbmcgZGlyZWN0CisgICAgICAgICAgb3IgaW5kaXJlY3QgcmVjdXJzaW9uLAorICAgIFsxXSA9IE51bWJlciBvZiB0aW1lcyB0aGlzIGZ1bmN0aW9uIGFwcGVhcnMgb24gdGhlIHN0YWNrLCBtaW51cyBvbmUKKyAgICBbMl0gPSBUb3RhbCB0aW1lIHNwZW50IGludGVybmFsIHRvIHRoaXMgZnVuY3Rpb24KKyAgICBbM10gPSBDdW11bGF0aXZlIHRpbWUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdhcyBwcmVzZW50IG9uIHRoZSBzdGFjay4gIEluCisgICAgICAgICAgbm9uLXJlY3Vyc2l2ZSBmdW5jdGlvbnMsIHRoaXMgaXMgdGhlIHRvdGFsIGV4ZWN1dGlvbiB0aW1lIGZyb20gc3RhcnQKKyAgICAgICAgICB0byBmaW5pc2ggb2YgZWFjaCBpbnZvY2F0aW9uIG9mIGEgZnVuY3Rpb24sIGluY2x1ZGluZyB0aW1lIHNwZW50IGluCisgICAgICAgICAgYWxsIHN1YmZ1bmN0aW9ucy4KKyAgICBbNF0gPSBBIGRpY3Rpb25hcnkgaW5kaWNhdGluZyBmb3IgZWFjaCBmdW5jdGlvbiBuYW1lLCB0aGUgbnVtYmVyIG9mIHRpbWVzCisgICAgICAgICAgaXQgd2FzIGNhbGxlZCBieSB1cy4KKyAgICAiIiIKKworICAgIGJpYXMgPSAwICAjIGNhbGlicmF0aW9uIGNvbnN0YW50CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGltZXI9Tm9uZSwgYmlhcz1Ob25lKToKKyAgICAgICAgc2VsZi50aW1pbmdzID0ge30KKyAgICAgICAgc2VsZi5jdXIgPSBOb25lCisgICAgICAgIHNlbGYuY21kID0gIiIKKyAgICAgICAgc2VsZi5jX2Z1bmNfbmFtZSA9ICIiCisKKyAgICAgICAgaWYgYmlhcyBpcyBOb25lOgorICAgICAgICAgICAgYmlhcyA9IHNlbGYuYmlhcworICAgICAgICBzZWxmLmJpYXMgPSBiaWFzICAgICAjIE1hdGVyaWFsaXplIGluIGxvY2FsIGRpY3QgZm9yIGxvb2t1cCBzcGVlZC4KKworICAgICAgICBpZiBub3QgdGltZXI6CisgICAgICAgICAgICBpZiBfaGFzX3JlczoKKyAgICAgICAgICAgICAgICBzZWxmLnRpbWVyID0gcmVzZ2V0cnVzYWdlCisgICAgICAgICAgICAgICAgc2VsZi5kaXNwYXRjaGVyID0gc2VsZi50cmFjZV9kaXNwYXRjaAorICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3RpbWUgPSBfZ2V0X3RpbWVfcmVzb3VyY2UKKyAgICAgICAgICAgIGVsaWYgaGFzYXR0cih0aW1lLCAnY2xvY2snKToKKyAgICAgICAgICAgICAgICBzZWxmLnRpbWVyID0gc2VsZi5nZXRfdGltZSA9IHRpbWUuY2xvY2sKKyAgICAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoZXIgPSBzZWxmLnRyYWNlX2Rpc3BhdGNoX2kKKyAgICAgICAgICAgIGVsaWYgaGFzYXR0cihvcywgJ3RpbWVzJyk6CisgICAgICAgICAgICAgICAgc2VsZi50aW1lciA9IG9zLnRpbWVzCisgICAgICAgICAgICAgICAgc2VsZi5kaXNwYXRjaGVyID0gc2VsZi50cmFjZV9kaXNwYXRjaAorICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3RpbWUgPSBfZ2V0X3RpbWVfdGltZXMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi50aW1lciA9IHNlbGYuZ2V0X3RpbWUgPSB0aW1lLnRpbWUKKyAgICAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoZXIgPSBzZWxmLnRyYWNlX2Rpc3BhdGNoX2kKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGltZXIgPSB0aW1lcgorICAgICAgICAgICAgdCA9IHNlbGYudGltZXIoKSAjIHRlc3Qgb3V0IHRpbWVyIGZ1bmN0aW9uCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gbGVuKHQpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3RpbWUgPSB0aW1lcgorICAgICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hlciA9IHNlbGYudHJhY2VfZGlzcGF0Y2hfaQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBsZW5ndGggPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXNwYXRjaGVyID0gc2VsZi50cmFjZV9kaXNwYXRjaAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hlciA9IHNlbGYudHJhY2VfZGlzcGF0Y2hfbAorICAgICAgICAgICAgICAgICMgVGhpcyBnZXRfdGltZSgpIGltcGxlbWVudGF0aW9uIG5lZWRzIHRvIGJlIGRlZmluZWQKKyAgICAgICAgICAgICAgICAjIGhlcmUgdG8gY2FwdHVyZSB0aGUgcGFzc2VkLWluIHRpbWVyIGluIHRoZSBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICAjIGxpc3QgKGZvciBwZXJmb3JtYW5jZSkuICBOb3RlIHRoYXQgd2UgY2FuJ3QgYXNzdW1lCisgICAgICAgICAgICAgICAgIyB0aGUgdGltZXIoKSByZXN1bHQgY29udGFpbnMgdHdvIHZhbHVlcyBpbiBhbGwKKyAgICAgICAgICAgICAgICAjIGNhc2VzLgorICAgICAgICAgICAgICAgIGRlZiBnZXRfdGltZV90aW1lcih0aW1lcj10aW1lciwgc3VtPXN1bSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdW0odGltZXIoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmdldF90aW1lID0gZ2V0X3RpbWVfdGltZXIKKyAgICAgICAgc2VsZi50ID0gc2VsZi5nZXRfdGltZSgpCisgICAgICAgIHNlbGYuc2ltdWxhdGVfY2FsbCgncHJvZmlsZXInKQorCisgICAgIyBIZWF2aWx5IG9wdGltaXplZCBkaXNwYXRjaCByb3V0aW5lIGZvciBvcy50aW1lcygpIHRpbWVyCisKKyAgICBkZWYgdHJhY2VfZGlzcGF0Y2goc2VsZiwgZnJhbWUsIGV2ZW50LCBhcmcpOgorICAgICAgICB0aW1lciA9IHNlbGYudGltZXIKKyAgICAgICAgdCA9IHRpbWVyKCkKKyAgICAgICAgdCA9IHRbMF0gKyB0WzFdIC0gc2VsZi50IC0gc2VsZi5iaWFzCisKKyAgICAgICAgaWYgZXZlbnQgPT0gImNfY2FsbCI6CisgICAgICAgICAgICBzZWxmLmNfZnVuY19uYW1lID0gYXJnLl9fbmFtZV9fCisKKyAgICAgICAgaWYgc2VsZi5kaXNwYXRjaFtldmVudF0oc2VsZiwgZnJhbWUsdCk6CisgICAgICAgICAgICB0ID0gdGltZXIoKQorICAgICAgICAgICAgc2VsZi50ID0gdFswXSArIHRbMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHIgPSB0aW1lcigpCisgICAgICAgICAgICBzZWxmLnQgPSByWzBdICsgclsxXSAtIHQgIyBwdXQgYmFjayB1bnJlY29yZGVkIGRlbHRhCisKKyAgICAjIERpc3BhdGNoIHJvdXRpbmUgZm9yIGJlc3QgdGltZXIgcHJvZ3JhbSAocmV0dXJuID0gc2NhbGFyLCBmYXN0ZXN0IGlmCisgICAgIyBhbiBpbnRlZ2VyIGJ1dCBmbG9hdCB3b3JrcyB0b28gLS0gYW5kIHRpbWUuY2xvY2soKSByZWxpZXMgb24gdGhhdCkuCisKKyAgICBkZWYgdHJhY2VfZGlzcGF0Y2hfaShzZWxmLCBmcmFtZSwgZXZlbnQsIGFyZyk6CisgICAgICAgIHRpbWVyID0gc2VsZi50aW1lcgorICAgICAgICB0ID0gdGltZXIoKSAtIHNlbGYudCAtIHNlbGYuYmlhcworCisgICAgICAgIGlmIGV2ZW50ID09ICJjX2NhbGwiOgorICAgICAgICAgICAgc2VsZi5jX2Z1bmNfbmFtZSA9IGFyZy5fX25hbWVfXworCisgICAgICAgIGlmIHNlbGYuZGlzcGF0Y2hbZXZlbnRdKHNlbGYsIGZyYW1lLCB0KToKKyAgICAgICAgICAgIHNlbGYudCA9IHRpbWVyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudCA9IHRpbWVyKCkgLSB0ICAjIHB1dCBiYWNrIHVucmVjb3JkZWQgZGVsdGEKKworICAgICMgRGlzcGF0Y2ggcm91dGluZSBmb3IgbWFjaW50b3NoICh0aW1lciByZXR1cm5zIHRpbWUgaW4gdGlja3Mgb2YKKyAgICAjIDEvNjB0aCBzZWNvbmQpCisKKyAgICBkZWYgdHJhY2VfZGlzcGF0Y2hfbWFjKHNlbGYsIGZyYW1lLCBldmVudCwgYXJnKToKKyAgICAgICAgdGltZXIgPSBzZWxmLnRpbWVyCisgICAgICAgIHQgPSB0aW1lcigpLzYwLjAgLSBzZWxmLnQgLSBzZWxmLmJpYXMKKworICAgICAgICBpZiBldmVudCA9PSAiY19jYWxsIjoKKyAgICAgICAgICAgIHNlbGYuY19mdW5jX25hbWUgPSBhcmcuX19uYW1lX18KKworICAgICAgICBpZiBzZWxmLmRpc3BhdGNoW2V2ZW50XShzZWxmLCBmcmFtZSwgdCk6CisgICAgICAgICAgICBzZWxmLnQgPSB0aW1lcigpLzYwLjAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudCA9IHRpbWVyKCkvNjAuMCAtIHQgICMgcHV0IGJhY2sgdW5yZWNvcmRlZCBkZWx0YQorCisgICAgIyBTTE9XIGdlbmVyaWMgZGlzcGF0Y2ggcm91dGluZSBmb3IgdGltZXIgcmV0dXJuaW5nIGxpc3RzIG9mIG51bWJlcnMKKworICAgIGRlZiB0cmFjZV9kaXNwYXRjaF9sKHNlbGYsIGZyYW1lLCBldmVudCwgYXJnKToKKyAgICAgICAgZ2V0X3RpbWUgPSBzZWxmLmdldF90aW1lCisgICAgICAgIHQgPSBnZXRfdGltZSgpIC0gc2VsZi50IC0gc2VsZi5iaWFzCisKKyAgICAgICAgaWYgZXZlbnQgPT0gImNfY2FsbCI6CisgICAgICAgICAgICBzZWxmLmNfZnVuY19uYW1lID0gYXJnLl9fbmFtZV9fCisKKyAgICAgICAgaWYgc2VsZi5kaXNwYXRjaFtldmVudF0oc2VsZiwgZnJhbWUsIHQpOgorICAgICAgICAgICAgc2VsZi50ID0gZ2V0X3RpbWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ID0gZ2V0X3RpbWUoKSAtIHQgIyBwdXQgYmFjayB1bnJlY29yZGVkIGRlbHRhCisKKyAgICAjIEluIHRoZSBldmVudCBoYW5kbGVycywgdGhlIGZpcnN0IDMgZWxlbWVudHMgb2Ygc2VsZi5jdXIgYXJlIHVucGFja2VkCisgICAgIyBpbnRvIHZyYmxzIHcvIDMtbGV0dGVyIG5hbWVzLiAgVGhlIGxhc3QgdHdvIGNoYXJhY3RlcnMgYXJlIG1lYW50IHRvIGJlCisgICAgIyBtbmVtb25pYzoKKyAgICAjICAgICBfcHQgIHNlbGYuY3VyWzBdICJwYXJlbnQgdGltZSIgICB0aW1lIHRvIGJlIGNoYXJnZWQgdG8gcGFyZW50IGZyYW1lCisgICAgIyAgICAgX2l0ICBzZWxmLmN1clsxXSAiaW50ZXJuYWwgdGltZSIgdGltZSBzcGVudCBkaXJlY3RseSBpbiB0aGUgZnVuY3Rpb24KKyAgICAjICAgICBfZXQgIHNlbGYuY3VyWzJdICJleHRlcm5hbCB0aW1lIiB0aW1lIHNwZW50IGluIHN1YmZ1bmN0aW9ucworCisgICAgZGVmIHRyYWNlX2Rpc3BhdGNoX2V4Y2VwdGlvbihzZWxmLCBmcmFtZSwgdCk6CisgICAgICAgIHJwdCwgcml0LCByZXQsIHJmbiwgcmZyYW1lLCByY3VyID0gc2VsZi5jdXIKKyAgICAgICAgaWYgKHJmcmFtZSBpcyBub3QgZnJhbWUpIGFuZCByY3VyOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhY2VfZGlzcGF0Y2hfcmV0dXJuKHJmcmFtZSwgdCkKKyAgICAgICAgc2VsZi5jdXIgPSBycHQsIHJpdCt0LCByZXQsIHJmbiwgcmZyYW1lLCByY3VyCisgICAgICAgIHJldHVybiAxCisKKworICAgIGRlZiB0cmFjZV9kaXNwYXRjaF9jYWxsKHNlbGYsIGZyYW1lLCB0KToKKyAgICAgICAgaWYgc2VsZi5jdXIgYW5kIGZyYW1lLmZfYmFjayBpcyBub3Qgc2VsZi5jdXJbLTJdOgorICAgICAgICAgICAgcnB0LCByaXQsIHJldCwgcmZuLCByZnJhbWUsIHJjdXIgPSBzZWxmLmN1cgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocmZyYW1lLCBQcm9maWxlLmZha2VfZnJhbWUpOgorICAgICAgICAgICAgICAgIGFzc2VydCByZnJhbWUuZl9iYWNrIGlzIGZyYW1lLmZfYmFjaywgKCJCYWQgY2FsbCIsIHJmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZnJhbWUsIHJmcmFtZS5mX2JhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUsIGZyYW1lLmZfYmFjaykKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlX2Rpc3BhdGNoX3JldHVybihyZnJhbWUsIDApCisgICAgICAgICAgICAgICAgYXNzZXJ0IChzZWxmLmN1ciBpcyBOb25lIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmZfYmFjayBpcyBzZWxmLmN1clstMl0pLCAoIkJhZCBjYWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJbLTNdKQorICAgICAgICBmY29kZSA9IGZyYW1lLmZfY29kZQorICAgICAgICBmbiA9IChmY29kZS5jb19maWxlbmFtZSwgZmNvZGUuY29fZmlyc3RsaW5lbm8sIGZjb2RlLmNvX25hbWUpCisgICAgICAgIHNlbGYuY3VyID0gKHQsIDAsIDAsIGZuLCBmcmFtZSwgc2VsZi5jdXIpCisgICAgICAgIHRpbWluZ3MgPSBzZWxmLnRpbWluZ3MKKyAgICAgICAgaWYgZm4gaW4gdGltaW5nczoKKyAgICAgICAgICAgIGNjLCBucywgdHQsIGN0LCBjYWxsZXJzID0gdGltaW5nc1tmbl0KKyAgICAgICAgICAgIHRpbWluZ3NbZm5dID0gY2MsIG5zICsgMSwgdHQsIGN0LCBjYWxsZXJzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0aW1pbmdzW2ZuXSA9IDAsIDAsIDAsIDAsIHt9CisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgdHJhY2VfZGlzcGF0Y2hfY19jYWxsIChzZWxmLCBmcmFtZSwgdCk6CisgICAgICAgIGZuID0gKCIiLCAwLCBzZWxmLmNfZnVuY19uYW1lKQorICAgICAgICBzZWxmLmN1ciA9ICh0LCAwLCAwLCBmbiwgZnJhbWUsIHNlbGYuY3VyKQorICAgICAgICB0aW1pbmdzID0gc2VsZi50aW1pbmdzCisgICAgICAgIGlmIGZuIGluIHRpbWluZ3M6CisgICAgICAgICAgICBjYywgbnMsIHR0LCBjdCwgY2FsbGVycyA9IHRpbWluZ3NbZm5dCisgICAgICAgICAgICB0aW1pbmdzW2ZuXSA9IGNjLCBucysxLCB0dCwgY3QsIGNhbGxlcnMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRpbWluZ3NbZm5dID0gMCwgMCwgMCwgMCwge30KKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiB0cmFjZV9kaXNwYXRjaF9yZXR1cm4oc2VsZiwgZnJhbWUsIHQpOgorICAgICAgICBpZiBmcmFtZSBpcyBub3Qgc2VsZi5jdXJbLTJdOgorICAgICAgICAgICAgYXNzZXJ0IGZyYW1lIGlzIHNlbGYuY3VyWy0yXS5mX2JhY2ssICgiQmFkIHJldHVybiIsIHNlbGYuY3VyWy0zXSkKKyAgICAgICAgICAgIHNlbGYudHJhY2VfZGlzcGF0Y2hfcmV0dXJuKHNlbGYuY3VyWy0yXSwgMCkKKworICAgICAgICAjIFByZWZpeCAiciIgbWVhbnMgcGFydCBvZiB0aGUgUmV0dXJuaW5nIG9yIGV4aXRpbmcgZnJhbWUuCisgICAgICAgICMgUHJlZml4ICJwIiBtZWFucyBwYXJ0IG9mIHRoZSBQcmV2aW91cyBvciBQYXJlbnQgb3Igb2xkZXIgZnJhbWUuCisKKyAgICAgICAgcnB0LCByaXQsIHJldCwgcmZuLCBmcmFtZSwgcmN1ciA9IHNlbGYuY3VyCisgICAgICAgIHJpdCA9IHJpdCArIHQKKyAgICAgICAgZnJhbWVfdG90YWwgPSByaXQgKyByZXQKKworICAgICAgICBwcHQsIHBpdCwgcGV0LCBwZm4sIHBmcmFtZSwgcGN1ciA9IHJjdXIKKyAgICAgICAgc2VsZi5jdXIgPSBwcHQsIHBpdCArIHJwdCwgcGV0ICsgZnJhbWVfdG90YWwsIHBmbiwgcGZyYW1lLCBwY3VyCisKKyAgICAgICAgdGltaW5ncyA9IHNlbGYudGltaW5ncworICAgICAgICBjYywgbnMsIHR0LCBjdCwgY2FsbGVycyA9IHRpbWluZ3NbcmZuXQorICAgICAgICBpZiBub3QgbnM6CisgICAgICAgICAgICAjIFRoaXMgaXMgdGhlIG9ubHkgb2NjdXJyZW5jZSBvZiB0aGUgZnVuY3Rpb24gb24gdGhlIHN0YWNrLgorICAgICAgICAgICAgIyBFbHNlIHRoaXMgaXMgYSAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgcmVjdXJzaXZlIGNhbGwsIGFuZAorICAgICAgICAgICAgIyBpdHMgY3VtdWxhdGl2ZSB0aW1lIHdpbGwgZ2V0IHVwZGF0ZWQgd2hlbiB0aGUgdG9wbW9zdCBjYWxsIHRvCisgICAgICAgICAgICAjIGl0IHJldHVybnMuCisgICAgICAgICAgICBjdCA9IGN0ICsgZnJhbWVfdG90YWwKKyAgICAgICAgICAgIGNjID0gY2MgKyAxCisKKyAgICAgICAgaWYgcGZuIGluIGNhbGxlcnM6CisgICAgICAgICAgICBjYWxsZXJzW3Bmbl0gPSBjYWxsZXJzW3Bmbl0gKyAxICAjIGhhY2s6IGdhdGhlciBtb3JlCisgICAgICAgICAgICAjIHN0YXRzIHN1Y2ggYXMgdGhlIGFtb3VudCBvZiB0aW1lIGFkZGVkIHRvIGN0IGNvdXJ0ZXN5CisgICAgICAgICAgICAjIG9mIHRoaXMgc3BlY2lmaWMgY2FsbCwgYW5kIHRoZSBjb250cmlidXRpb24gdG8gY2MKKyAgICAgICAgICAgICMgY291cnRlc3kgb2YgdGhpcyBjYWxsLgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2FsbGVyc1twZm5dID0gMQorCisgICAgICAgIHRpbWluZ3NbcmZuXSA9IGNjLCBucyAtIDEsIHR0ICsgcml0LCBjdCwgY2FsbGVycworCisgICAgICAgIHJldHVybiAxCisKKworICAgIGRpc3BhdGNoID0geworICAgICAgICAiY2FsbCI6IHRyYWNlX2Rpc3BhdGNoX2NhbGwsCisgICAgICAgICJleGNlcHRpb24iOiB0cmFjZV9kaXNwYXRjaF9leGNlcHRpb24sCisgICAgICAgICJyZXR1cm4iOiB0cmFjZV9kaXNwYXRjaF9yZXR1cm4sCisgICAgICAgICJjX2NhbGwiOiB0cmFjZV9kaXNwYXRjaF9jX2NhbGwsCisgICAgICAgICJjX2V4Y2VwdGlvbiI6IHRyYWNlX2Rpc3BhdGNoX3JldHVybiwgICMgdGhlIEMgZnVuY3Rpb24gcmV0dXJuZWQKKyAgICAgICAgImNfcmV0dXJuIjogdHJhY2VfZGlzcGF0Y2hfcmV0dXJuLAorICAgICAgICB9CisKKworICAgICMgVGhlIG5leHQgZmV3IGZ1bmN0aW9ucyBwbGF5IHdpdGggc2VsZi5jbWQuIEJ5IGNhcmVmdWxseSBwcmVsb2FkaW5nCisgICAgIyBvdXIgcGFyYWxsZWwgc3RhY2ssIHdlIGNhbiBmb3JjZSB0aGUgcHJvZmlsZWQgcmVzdWx0IHRvIGluY2x1ZGUKKyAgICAjIGFuIGFyYml0cmFyeSBzdHJpbmcgYXMgdGhlIG5hbWUgb2YgdGhlIGNhbGxpbmcgZnVuY3Rpb24uCisgICAgIyBXZSB1c2Ugc2VsZi5jbWQgYXMgdGhhdCBzdHJpbmcsIGFuZCB0aGUgcmVzdWx0aW5nIHN0YXRzIGxvb2sKKyAgICAjIHZlcnkgbmljZSA6LSkuCisKKyAgICBkZWYgc2V0X2NtZChzZWxmLCBjbWQpOgorICAgICAgICBpZiBzZWxmLmN1clstMV06IHJldHVybiAgICMgYWxyZWFkeSBzZXQKKyAgICAgICAgc2VsZi5jbWQgPSBjbWQKKyAgICAgICAgc2VsZi5zaW11bGF0ZV9jYWxsKGNtZCkKKworICAgIGNsYXNzIGZha2VfY29kZToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lLCBuYW1lKToKKyAgICAgICAgICAgIHNlbGYuY29fZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICAgICAgc2VsZi5jb19saW5lID0gbGluZQorICAgICAgICAgICAgc2VsZi5jb19uYW1lID0gbmFtZQorICAgICAgICAgICAgc2VsZi5jb19maXJzdGxpbmVubyA9IDAKKworICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gcmVwcigoc2VsZi5jb19maWxlbmFtZSwgc2VsZi5jb19saW5lLCBzZWxmLmNvX25hbWUpKQorCisgICAgY2xhc3MgZmFrZV9mcmFtZToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvZGUsIHByaW9yKToKKyAgICAgICAgICAgIHNlbGYuZl9jb2RlID0gY29kZQorICAgICAgICAgICAgc2VsZi5mX2JhY2sgPSBwcmlvcgorCisgICAgZGVmIHNpbXVsYXRlX2NhbGwoc2VsZiwgbmFtZSk6CisgICAgICAgIGNvZGUgPSBzZWxmLmZha2VfY29kZSgncHJvZmlsZScsIDAsIG5hbWUpCisgICAgICAgIGlmIHNlbGYuY3VyOgorICAgICAgICAgICAgcGZyYW1lID0gc2VsZi5jdXJbLTJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwZnJhbWUgPSBOb25lCisgICAgICAgIGZyYW1lID0gc2VsZi5mYWtlX2ZyYW1lKGNvZGUsIHBmcmFtZSkKKyAgICAgICAgc2VsZi5kaXNwYXRjaFsnY2FsbCddKHNlbGYsIGZyYW1lLCAwKQorCisgICAgIyBjb2xsZWN0IHN0YXRzIGZyb20gcGVuZGluZyBzdGFjaywgaW5jbHVkaW5nIGdldHRpbmcgZmluYWwKKyAgICAjIHRpbWluZ3MgZm9yIHNlbGYuY21kIGZyYW1lLgorCisgICAgZGVmIHNpbXVsYXRlX2NtZF9jb21wbGV0ZShzZWxmKToKKyAgICAgICAgZ2V0X3RpbWUgPSBzZWxmLmdldF90aW1lCisgICAgICAgIHQgPSBnZXRfdGltZSgpIC0gc2VsZi50CisgICAgICAgIHdoaWxlIHNlbGYuY3VyWy0xXToKKyAgICAgICAgICAgICMgV2UgKmNhbiogY2F1c2UgYXNzZXJ0aW9uIGVycm9ycyBoZXJlIGlmCisgICAgICAgICAgICAjIGRpc3BhdGNoX3RyYWNlX3JldHVybiBjaGVja3MgZm9yIGEgZnJhbWUgbWF0Y2ghCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoWydyZXR1cm4nXShzZWxmLCBzZWxmLmN1clstMl0sIHQpCisgICAgICAgICAgICB0ID0gMAorICAgICAgICBzZWxmLnQgPSBnZXRfdGltZSgpIC0gdAorCisKKyAgICBkZWYgcHJpbnRfc3RhdHMoc2VsZiwgc29ydD0tMSk6CisgICAgICAgIGltcG9ydCBwc3RhdHMKKyAgICAgICAgcHN0YXRzLlN0YXRzKHNlbGYpLnN0cmlwX2RpcnMoKS5zb3J0X3N0YXRzKHNvcnQpLiBcCisgICAgICAgICAgICAgICAgICBwcmludF9zdGF0cygpCisKKyAgICBkZWYgZHVtcF9zdGF0cyhzZWxmLCBmaWxlKToKKyAgICAgICAgZiA9IG9wZW4oZmlsZSwgJ3diJykKKyAgICAgICAgc2VsZi5jcmVhdGVfc3RhdHMoKQorICAgICAgICBtYXJzaGFsLmR1bXAoc2VsZi5zdGF0cywgZikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgY3JlYXRlX3N0YXRzKHNlbGYpOgorICAgICAgICBzZWxmLnNpbXVsYXRlX2NtZF9jb21wbGV0ZSgpCisgICAgICAgIHNlbGYuc25hcHNob3Rfc3RhdHMoKQorCisgICAgZGVmIHNuYXBzaG90X3N0YXRzKHNlbGYpOgorICAgICAgICBzZWxmLnN0YXRzID0ge30KKyAgICAgICAgZm9yIGZ1bmMsIChjYywgbnMsIHR0LCBjdCwgY2FsbGVycykgaW4gc2VsZi50aW1pbmdzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgY2FsbGVycyA9IGNhbGxlcnMuY29weSgpCisgICAgICAgICAgICBuYyA9IDAKKyAgICAgICAgICAgIGZvciBjYWxsY250IGluIGNhbGxlcnMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgICAgIG5jICs9IGNhbGxjbnQKKyAgICAgICAgICAgIHNlbGYuc3RhdHNbZnVuY10gPSBjYywgbmMsIHR0LCBjdCwgY2FsbGVycworCisKKyAgICAjIFRoZSBmb2xsb3dpbmcgdHdvIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBieSBjbGllbnRzIHRvIHVzZQorICAgICMgYSBwcm9maWxlciB0byBwcm9maWxlIGEgc3RhdGVtZW50LCBnaXZlbiBhcyBhIHN0cmluZy4KKworICAgIGRlZiBydW4oc2VsZiwgY21kKToKKyAgICAgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgICAgIGRpY3QgPSBfX21haW5fXy5fX2RpY3RfXworICAgICAgICByZXR1cm4gc2VsZi5ydW5jdHgoY21kLCBkaWN0LCBkaWN0KQorCisgICAgZGVmIHJ1bmN0eChzZWxmLCBjbWQsIGdsb2JhbHMsIGxvY2Fscyk6CisgICAgICAgIHNlbGYuc2V0X2NtZChjbWQpCisgICAgICAgIHN5cy5zZXRwcm9maWxlKHNlbGYuZGlzcGF0Y2hlcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYyBjbWQgaW4gZ2xvYmFscywgbG9jYWxzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc2V0cHJvZmlsZShOb25lKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgIyBUaGlzIG1ldGhvZCBpcyBtb3JlIHVzZWZ1bCB0byBwcm9maWxlIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwuCisgICAgZGVmIHJ1bmNhbGwoc2VsZiwgZnVuYywgKmFyZ3MsICoqa3cpOgorICAgICAgICBzZWxmLnNldF9jbWQocmVwcihmdW5jKSkKKyAgICAgICAgc3lzLnNldHByb2ZpbGUoc2VsZi5kaXNwYXRjaGVyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprdykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zZXRwcm9maWxlKE5vbmUpCisKKworICAgICMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAjIFRoZSBmb2xsb3dpbmcgY2FsY3VsYXRlcyB0aGUgb3ZlcmhlYWQgZm9yIHVzaW5nIGEgcHJvZmlsZXIuICBUaGUKKyAgICAjIHByb2JsZW0gaXMgdGhhdCBpdCB0YWtlcyBhIGZhaXIgYW1vdW50IG9mIHRpbWUgZm9yIHRoZSBwcm9maWxlcgorICAgICMgdG8gc3RvcCB0aGUgc3RvcHdhdGNoIChmcm9tIHRoZSB0aW1lIGl0IHJlY2VpdmVzIGFuIGV2ZW50KS4KKyAgICAjIFNpbWlsYXJseSwgdGhlcmUgaXMgYSBkZWxheSBmcm9tIHRoZSB0aW1lIHRoYXQgdGhlIHByb2ZpbGVyCisgICAgIyByZS1zdGFydHMgdGhlIHN0b3B3YXRjaCBiZWZvcmUgdGhlIHVzZXIncyBjb2RlIHJlYWxseSBnZXRzIHRvCisgICAgIyBjb250aW51ZS4gIFRoZSBmb2xsb3dpbmcgY29kZSB0cmllcyB0byBtZWFzdXJlIHRoZSBkaWZmZXJlbmNlIG9uCisgICAgIyBhIHBlci1ldmVudCBiYXNpcy4KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgdGhpcyBkaWZmZXJlbmNlIGlzIG9ubHkgc2lnbmlmaWNhbnQgaWYgdGhlcmUgYXJlIGEgbG90IG9mCisgICAgIyBldmVudHMsIGFuZCByZWxhdGl2ZWx5IGxpdHRsZSB1c2VyIGNvZGUgcGVyIGV2ZW50LiAgRm9yIGV4YW1wbGUsCisgICAgIyBjb2RlIHdpdGggc21hbGwgZnVuY3Rpb25zIHdpbGwgdHlwaWNhbGx5IGJlbmVmaXQgZnJvbSBoYXZpbmcgdGhlCisgICAgIyBwcm9maWxlciBjYWxpYnJhdGVkIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4gIFRoaXMgKmNvdWxkKiBiZQorICAgICMgZG9uZSBvbiB0aGUgZmx5IGR1cmluZyBpbml0KCkgdGltZSwgYnV0IGl0IGlzIG5vdCB3b3J0aCB0aGUKKyAgICAjIGVmZm9ydC4gIEFsc28gbm90ZSB0aGF0IGlmIHRvbyBsYXJnZSBhIHZhbHVlIHNwZWNpZmllZCwgdGhlbgorICAgICMgZXhlY3V0aW9uIHRpbWUgb24gc29tZSBmdW5jdGlvbnMgd2lsbCBhY3R1YWxseSBhcHBlYXIgYXMgYQorICAgICMgbmVnYXRpdmUgbnVtYmVyLiAgSXQgaXMgKm5vcm1hbCogZm9yIHNvbWUgZnVuY3Rpb25zICh3aXRoIHZlcnkKKyAgICAjIGxvdyBjYWxsIGNvdW50cykgdG8gaGF2ZSBzdWNoIG5lZ2F0aXZlIHN0YXRzLCBldmVuIGlmIHRoZQorICAgICMgY2FsaWJyYXRpb24gZmlndXJlIGlzICJjb3JyZWN0LiIKKyAgICAjCisgICAgIyBPbmUgYWx0ZXJuYXRpdmUgdG8gcHJvZmlsZS10aW1lIGNhbGlicmF0aW9uIGFkanVzdG1lbnRzIChpLmUuLAorICAgICMgYWRkaW5nIGluIHRoZSBtYWdpYyBsaXR0bGUgZGVsdGEgZHVyaW5nIGVhY2ggZXZlbnQpIGlzIHRvIHRyYWNrCisgICAgIyBtb3JlIGNhcmVmdWxseSB0aGUgbnVtYmVyIG9mIGV2ZW50cyAoYW5kIGN1bXVsYXRpdmVseSwgdGhlIG51bWJlcgorICAgICMgb2YgZXZlbnRzIGR1cmluZyBzdWIgZnVuY3Rpb25zKSB0aGF0IGFyZSBzZWVuLiAgSWYgdGhpcyB3ZXJlCisgICAgIyBkb25lLCB0aGVuIHRoZSBhcml0aG1ldGljIGNvdWxkIGJlIGRvbmUgYWZ0ZXIgdGhlIGZhY3QgKGkuZS4sIGF0CisgICAgIyBkaXNwbGF5IHRpbWUpLiAgQ3VycmVudGx5LCB3ZSB0cmFjayBvbmx5IGNhbGwvcmV0dXJuIGV2ZW50cy4KKyAgICAjIFRoZXNlIHZhbHVlcyBjYW4gYmUgZGVkdWNlZCBieSBleGFtaW5pbmcgdGhlIGNhbGxlZXMgYW5kIGNhbGxlcnMKKyAgICAjIHZlY3RvcnMgZm9yIGVhY2ggZnVuY3Rpb25zLiAgSGVuY2Ugd2UgKmNhbiogYWxtb3N0IGNvcnJlY3QgdGhlCisgICAgIyBpbnRlcm5hbCB0aW1lIGZpZ3VyZSBhdCBwcmludCB0aW1lIChub3RlIHRoYXQgd2UgY3VycmVudGx5IGRvbid0CisgICAgIyB0cmFjayBleGNlcHRpb24gZXZlbnQgcHJvY2Vzc2luZyBjb3VudHMpLiAgVW5mb3J0dW5hdGVseSwgdGhlcmUKKyAgICAjIGlzIGN1cnJlbnRseSBubyBzaW1pbGFyIGluZm9ybWF0aW9uIGZvciBjdW11bGF0aXZlIHN1Yi1mdW5jdGlvbgorICAgICMgdGltZS4gIEl0IHdvdWxkIG5vdCBiZSBoYXJkIHRvICJnZXQgYWxsIHRoaXMgaW5mbyIgYXQgcHJvZmlsZXIKKyAgICAjIHRpbWUuICBTcGVjaWZpY2FsbHksIHdlIHdvdWxkIGhhdmUgdG8gZXh0ZW5kIHRoZSB0dXBsZXMgdG8ga2VlcAorICAgICMgY291bnRzIG9mIHRoaXMgaW4gZWFjaCBmcmFtZSwgYW5kIHRoZW4gZXh0ZW5kIHRoZSBkZWZzIG9mIHRpbWluZworICAgICMgdHVwbGVzIHRvIGluY2x1ZGUgdGhlIHNpZ25pZmljYW50IHR3byBmaWd1cmVzLiBJJ20gYSBiaXQgZmVhcmZ1bAorICAgICMgdGhhdCB0aGlzIGFkZGl0aW9uYWwgZmVhdHVyZSB3aWxsIHNsb3cgdGhlIGhlYXZpbHkgb3B0aW1pemVkCisgICAgIyBldmVudC90aW1lIHJhdGlvIChpLmUuLCB0aGUgcHJvZmlsZXIgd291bGQgcnVuIHNsb3dlciwgZnVyIGEgdmVyeQorICAgICMgbG93ICJ2YWx1ZSBhZGRlZCIgZmVhdHVyZS4pCisgICAgIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICBkZWYgY2FsaWJyYXRlKHNlbGYsIG0sIHZlcmJvc2U9MCk6CisgICAgICAgIGlmIHNlbGYuX19jbGFzc19fIGlzIG5vdCBQcm9maWxlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgLmNhbGlicmF0ZSgpLiIpCisKKyAgICAgICAgc2F2ZWRfYmlhcyA9IHNlbGYuYmlhcworICAgICAgICBzZWxmLmJpYXMgPSAwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jYWxpYnJhdGVfaW5uZXIobSwgdmVyYm9zZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuYmlhcyA9IHNhdmVkX2JpYXMKKworICAgIGRlZiBfY2FsaWJyYXRlX2lubmVyKHNlbGYsIG0sIHZlcmJvc2UpOgorICAgICAgICBnZXRfdGltZSA9IHNlbGYuZ2V0X3RpbWUKKworICAgICAgICAjIFNldCB1cCBhIHRlc3QgY2FzZSB0byBiZSBydW4gd2l0aCBhbmQgd2l0aG91dCBwcm9maWxpbmcuICBJbmNsdWRlCisgICAgICAgICMgbG90cyBvZiBjYWxscywgYmVjYXVzZSB3ZSdyZSB0cnlpbmcgdG8gcXVhbnRpZnkgc3RvcHdhdGNoIG92ZXJoZWFkLgorICAgICAgICAjIERvIG5vdCByYWlzZSBhbnkgZXhjZXB0aW9ucywgdGhvdWdoLCBiZWNhdXNlIHdlIHdhbnQgdG8ga25vdworICAgICAgICAjIGV4YWN0bHkgaG93IG1hbnkgcHJvZmlsZSBldmVudHMgYXJlIGdlbmVyYXRlZCAob25lIGNhbGwgZXZlbnQsICsKKyAgICAgICAgIyBvbmUgcmV0dXJuIGV2ZW50LCBwZXIgUHl0aG9uLWxldmVsIGNhbGwpLgorCisgICAgICAgIGRlZiBmMShuKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgICAgIHggPSAxCisKKyAgICAgICAgZGVmIGYobSwgZjE9ZjEpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobSk6CisgICAgICAgICAgICAgICAgZjEoMTAwKQorCisgICAgICAgIGYobSkgICAgIyB3YXJtIHVwIHRoZSBjYWNoZQorCisgICAgICAgICMgZWxhcHNlZF9ub3Byb2ZpbGUgPC0gdGltZSBmKG0pIHRha2VzIHdpdGhvdXQgcHJvZmlsaW5nLgorICAgICAgICB0MCA9IGdldF90aW1lKCkKKyAgICAgICAgZihtKQorICAgICAgICB0MSA9IGdldF90aW1lKCkKKyAgICAgICAgZWxhcHNlZF9ub3Byb2ZpbGUgPSB0MSAtIHQwCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiZWxhcHNlZCB0aW1lIHdpdGhvdXQgcHJvZmlsaW5nID0iLCBlbGFwc2VkX25vcHJvZmlsZQorCisgICAgICAgICMgZWxhcHNlZF9wcm9maWxlIDwtIHRpbWUgZihtKSB0YWtlcyB3aXRoIHByb2ZpbGluZy4gIFRoZSBkaWZmZXJlbmNlCisgICAgICAgICMgaXMgcHJvZmlsaW5nIG92ZXJoZWFkLCBvbmx5IHNvbWUgb2Ygd2hpY2ggdGhlIHByb2ZpbGVyIHN1YnRyYWN0cworICAgICAgICAjIG91dCBvbiBpdHMgb3duLgorICAgICAgICBwID0gUHJvZmlsZSgpCisgICAgICAgIHQwID0gZ2V0X3RpbWUoKQorICAgICAgICBwLnJ1bmN0eCgnZihtKScsIGdsb2JhbHMoKSwgbG9jYWxzKCkpCisgICAgICAgIHQxID0gZ2V0X3RpbWUoKQorICAgICAgICBlbGFwc2VkX3Byb2ZpbGUgPSB0MSAtIHQwCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiZWxhcHNlZCB0aW1lIHdpdGggcHJvZmlsaW5nID0iLCBlbGFwc2VkX3Byb2ZpbGUKKworICAgICAgICAjIHJlcG9ydGVkX3RpbWUgPC0gIkNQVSBzZWNvbmRzIiB0aGUgcHJvZmlsZXIgY2hhcmdlZCB0byBmIGFuZCBmMS4KKyAgICAgICAgdG90YWxfY2FsbHMgPSAwLjAKKyAgICAgICAgcmVwb3J0ZWRfdGltZSA9IDAuMAorICAgICAgICBmb3IgKGZpbGVuYW1lLCBsaW5lLCBmdW5jbmFtZSksIChjYywgbnMsIHR0LCBjdCwgY2FsbGVycykgaW4gXAorICAgICAgICAgICAgICAgIHAudGltaW5ncy5pdGVtcygpOgorICAgICAgICAgICAgaWYgZnVuY25hbWUgaW4gKCJmIiwgImYxIik6CisgICAgICAgICAgICAgICAgdG90YWxfY2FsbHMgKz0gY2MKKyAgICAgICAgICAgICAgICByZXBvcnRlZF90aW1lICs9IHR0CisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICInQ1BVIHNlY29uZHMnIHByb2ZpbGVyIHJlcG9ydGVkID0iLCByZXBvcnRlZF90aW1lCisgICAgICAgICAgICBwcmludCAidG90YWwgIyBjYWxscyA9IiwgdG90YWxfY2FsbHMKKyAgICAgICAgaWYgdG90YWxfY2FsbHMgIT0gbSArIDE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnRlcm5hbCBlcnJvcjogdG90YWwgY2FsbHMgPSAlZCIgJSB0b3RhbF9jYWxscykKKworICAgICAgICAjIHJlcG9ydGVkX3RpbWUgLSBlbGFwc2VkX25vcHJvZmlsZSA9IG92ZXJoZWFkIHRoZSBwcm9maWxlciB3YXNuJ3QKKyAgICAgICAgIyBhYmxlIHRvIG1lYXN1cmUuICBEaXZpZGUgYnkgdHdpY2UgdGhlIG51bWJlciBvZiBjYWxscyAoc2luY2UgdGhlcmUKKyAgICAgICAgIyBhcmUgdHdvIHByb2ZpbGVyIGV2ZW50cyBwZXIgY2FsbCBpbiB0aGlzIHRlc3QpIHRvIGdldCB0aGUgaGlkZGVuCisgICAgICAgICMgb3ZlcmhlYWQgcGVyIGV2ZW50LgorICAgICAgICBtZWFuID0gKHJlcG9ydGVkX3RpbWUgLSBlbGFwc2VkX25vcHJvZmlsZSkgLyAyLjAgLyB0b3RhbF9jYWxscworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIm1lYW4gc3RvcHdhdGNoIG92ZXJoZWFkIHBlciBwcm9maWxlIGV2ZW50ID0iLCBtZWFuCisgICAgICAgIHJldHVybiBtZWFuCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitkZWYgU3RhdHMoKmFyZ3MpOgorICAgIHByaW50ICdSZXBvcnQgZ2VuZXJhdGluZyBmdW5jdGlvbnMgYXJlIGluIHRoZSAicHN0YXRzIiBtb2R1bGVcYScKKworZGVmIG1haW4oKToKKyAgICB1c2FnZSA9ICJwcm9maWxlLnB5IFstbyBvdXRwdXRfZmlsZV9wYXRoXSBbLXMgc29ydF0gc2NyaXB0ZmlsZSBbYXJnXSAuLi4iCisgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKHVzYWdlPXVzYWdlKQorICAgIHBhcnNlci5hbGxvd19pbnRlcnNwZXJzZWRfYXJncyA9IEZhbHNlCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1vJywgJy0tb3V0ZmlsZScsIGRlc3Q9Im91dGZpbGUiLAorICAgICAgICBoZWxwPSJTYXZlIHN0YXRzIHRvIDxvdXRmaWxlPiIsIGRlZmF1bHQ9Tm9uZSkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXMnLCAnLS1zb3J0JywgZGVzdD0ic29ydCIsCisgICAgICAgIGhlbHA9IlNvcnQgb3JkZXIgd2hlbiBwcmludGluZyB0byBzdGRvdXQsIGJhc2VkIG9uIHBzdGF0cy5TdGF0cyBjbGFzcyIsCisgICAgICAgIGRlZmF1bHQ9LTEpCisKKyAgICBpZiBub3Qgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBwYXJzZXIucHJpbnRfdXNhZ2UoKQorICAgICAgICBzeXMuZXhpdCgyKQorCisgICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgIHN5cy5hcmd2WzpdID0gYXJncworCisgICAgaWYgbGVuKGFyZ3MpID4gMDoKKyAgICAgICAgcHJvZ25hbWUgPSBhcmdzWzBdCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmRpcm5hbWUocHJvZ25hbWUpKQorICAgICAgICB3aXRoIG9wZW4ocHJvZ25hbWUsICdyYicpIGFzIGZwOgorICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZnAucmVhZCgpLCBwcm9nbmFtZSwgJ2V4ZWMnKQorICAgICAgICBnbG9icyA9IHsKKyAgICAgICAgICAgICdfX2ZpbGVfXyc6IHByb2duYW1lLAorICAgICAgICAgICAgJ19fbmFtZV9fJzogJ19fbWFpbl9fJywKKyAgICAgICAgICAgICdfX3BhY2thZ2VfXyc6IE5vbmUsCisgICAgICAgIH0KKyAgICAgICAgcnVuY3R4KGNvZGUsIGdsb2JzLCBOb25lLCBvcHRpb25zLm91dGZpbGUsIG9wdGlvbnMuc29ydCkKKyAgICBlbHNlOgorICAgICAgICBwYXJzZXIucHJpbnRfdXNhZ2UoKQorICAgIHJldHVybiBwYXJzZXIKKworIyBXaGVuIGludm9rZWQgYXMgbWFpbiBwcm9ncmFtLCBpbnZva2UgdGhlIHByb2ZpbGVyIG9uIGEgc2NyaXB0CitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wcm9maWxlLnB5YyBiL2xpYi9weXRob24yLjcvcHJvZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwNjAyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHJvZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wcm9maWxlLnB5byBiL2xpYi9weXRob24yLjcvcHJvZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjZjEzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHJvZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wc3RhdHMucHkgYi9saWIvcHl0aG9uMi43L3BzdGF0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzM4OTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wc3RhdHMucHkKQEAgLTAsMCArMSw3MDUgQEAKKyIiIkNsYXNzIGZvciBwcmludGluZyByZXBvcnRzIG9uIHByb2ZpbGVkIHB5dGhvbiBjb2RlLiIiIgorCisjIFdyaXR0ZW4gYnkgSmFtZXMgUm9za2luZAorIyBCYXNlZCBvbiBwcmlvciBwcm9maWxlIG1vZHVsZSBieSBTam9lcmQgTXVsbGVuZGVyLi4uCisjICAgd2hpY2ggd2FzIGhhY2tlZCBzb21ld2hhdCBieTogR3VpZG8gdmFuIFJvc3N1bQorCisjIENvcHlyaWdodCBEaXNuZXkgRW50ZXJwcmlzZXMsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsCisjIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZQorIyBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHRpbWUKK2ltcG9ydCBtYXJzaGFsCitpbXBvcnQgcmUKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCBjbXBfdG9fa2V5CisKK19fYWxsX18gPSBbIlN0YXRzIl0KKworY2xhc3MgU3RhdHM6CisgICAgIiIiVGhpcyBjbGFzcyBpcyB1c2VkIGZvciBjcmVhdGluZyByZXBvcnRzIGZyb20gZGF0YSBnZW5lcmF0ZWQgYnkgdGhlCisgICAgUHJvZmlsZSBjbGFzcy4gIEl0IGlzIGEgImZyaWVuZCIgb2YgdGhhdCBjbGFzcywgYW5kIGltcG9ydHMgZGF0YSBlaXRoZXIKKyAgICBieSBkaXJlY3QgYWNjZXNzIHRvIG1lbWJlcnMgb2YgUHJvZmlsZSBjbGFzcywgb3IgYnkgcmVhZGluZyBpbiBhIGRpY3Rpb25hcnkKKyAgICB0aGF0IHdhcyBlbWl0dGVkICh2aWEgbWFyc2hhbCkgZnJvbSB0aGUgUHJvZmlsZSBjbGFzcy4KKworICAgIFRoZSBiaWcgY2hhbmdlIGZyb20gdGhlIHByZXZpb3VzIFByb2ZpbGVyIChpbiB0ZXJtcyBvZiByYXcgZnVuY3Rpb25hbGl0eSkKKyAgICBpcyB0aGF0IGFuICJhZGQoKSIgbWV0aG9kIGhhcyBiZWVuIHByb3ZpZGVkIHRvIGNvbWJpbmUgU3RhdHMgZnJvbQorICAgIHNldmVyYWwgZGlzdGluY3QgcHJvZmlsZSBydW5zLiAgQm90aCB0aGUgY29uc3RydWN0b3IgYW5kIHRoZSBhZGQoKQorICAgIG1ldGhvZCBub3cgdGFrZSBhcmJpdHJhcmlseSBtYW55IGZpbGUgbmFtZXMgYXMgYXJndW1lbnRzLgorCisgICAgQWxsIHRoZSBwcmludCBtZXRob2RzIG5vdyB0YWtlIGFuIGFyZ3VtZW50IHRoYXQgaW5kaWNhdGVzIGhvdyBtYW55IGxpbmVzCisgICAgdG8gcHJpbnQuICBJZiB0aGUgYXJnIGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS4wLCB0aGVuCisgICAgaXQgaXMgdGFrZW4gYXMgYSBkZWNpbWFsIHBlcmNlbnRhZ2Ugb2YgdGhlIGF2YWlsYWJsZSBsaW5lcyB0byBiZSBwcmludGVkCisgICAgKGUuZy4sIC4xIG1lYW5zIHByaW50IDEwJSBvZiBhbGwgYXZhaWxhYmxlIGxpbmVzKS4gIElmIGl0IGlzIGFuIGludGVnZXIsCisgICAgaXQgaXMgdGFrZW4gdG8gbWVhbiB0aGUgbnVtYmVyIG9mIGxpbmVzIG9mIGRhdGEgdGhhdCB5b3Ugd2lzaCB0byBoYXZlCisgICAgcHJpbnRlZC4KKworICAgIFRoZSBzb3J0X3N0YXRzKCkgbWV0aG9kIG5vdyBwcm9jZXNzZXMgc29tZSBhZGRpdGlvbmFsIG9wdGlvbnMgKGkuZS4sIGluCisgICAgYWRkaXRpb24gdG8gdGhlIG9sZCAtMSwgMCwgMSwgb3IgMikuICBJdCB0YWtlcyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mCisgICAgcXVvdGVkIHN0cmluZ3MgdG8gc2VsZWN0IHRoZSBzb3J0IG9yZGVyLiAgRm9yIGV4YW1wbGUgc29ydF9zdGF0cygndGltZScsCisgICAgJ25hbWUnKSBzb3J0cyBvbiB0aGUgbWFqb3Iga2V5IG9mICdpbnRlcm5hbCBmdW5jdGlvbiB0aW1lJywgYW5kIG9uIHRoZQorICAgIG1pbm9yIGtleSBvZiAndGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uJy4gIExvb2sgYXQgdGhlIHR3byB0YWJsZXMgaW4KKyAgICBzb3J0X3N0YXRzKCkgYW5kIGdldF9zb3J0X2FyZ19kZWZzKHNlbGYpIGZvciBtb3JlIGV4YW1wbGVzLgorCisgICAgQWxsIG1ldGhvZHMgcmV0dXJuIHNlbGYsIHNvIHlvdSBjYW4gc3RyaW5nIHRvZ2V0aGVyIGNvbW1hbmRzIGxpa2U6CisgICAgICAgIFN0YXRzKCdmb28nLCAnZ29vJykuc3RyaXBfZGlycygpLnNvcnRfc3RhdHMoJ2NhbGxzJykuXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0YXRzKDUpLnByaW50X2NhbGxlcnMoNSkKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgIyBJIGNhbid0IGZpZ3VyZSBvdXQgaG93IHRvIGV4cGxpY3RseSBzcGVjaWZ5IGEgc3RyZWFtIGtleXdvcmQgYXJnCisgICAgICAgICMgd2l0aCAqYXJnczoKKyAgICAgICAgIyAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgc3RyZWFtPXN5cy5zdGRvdXQpOiAuLi4KKyAgICAgICAgIyBzbyBJIHVzZSAqKmt3ZHMgYW5kIHNxYXV3ayBpZiBzb21ldGhpbmcgdW5leHBlY3RlZCBpcyBwYXNzZWQgaW4uCisgICAgICAgIHNlbGYuc3RyZWFtID0gc3lzLnN0ZG91dAorICAgICAgICBpZiAic3RyZWFtIiBpbiBrd2RzOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBrd2RzWyJzdHJlYW0iXQorICAgICAgICAgICAgZGVsIGt3ZHNbInN0cmVhbSJdCisgICAgICAgIGlmIGt3ZHM6CisgICAgICAgICAgICBrZXlzID0ga3dkcy5rZXlzKCkKKyAgICAgICAgICAgIGtleXMuc29ydCgpCisgICAgICAgICAgICBleHRyYXMgPSAiLCAiLmpvaW4oWyIlcz0lcyIgJSAoaywga3dkc1trXSkgZm9yIGsgaW4ga2V5c10pCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidW5yZWNvZ25pemVkIGtleXdvcmQgYXJnczogJXMiICUgZXh0cmFzCisgICAgICAgIGlmIG5vdCBsZW4oYXJncyk6CisgICAgICAgICAgICBhcmcgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcmcgPSBhcmdzWzBdCisgICAgICAgICAgICBhcmdzID0gYXJnc1sxOl0KKyAgICAgICAgc2VsZi5pbml0KGFyZykKKyAgICAgICAgc2VsZi5hZGQoKmFyZ3MpCisKKyAgICBkZWYgaW5pdChzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLmFsbF9jYWxsZWVzID0gTm9uZSAgIyBjYWxjIG9ubHkgaWYgbmVlZGVkCisgICAgICAgIHNlbGYuZmlsZXMgPSBbXQorICAgICAgICBzZWxmLmZjbl9saXN0ID0gTm9uZQorICAgICAgICBzZWxmLnRvdGFsX3R0ID0gMAorICAgICAgICBzZWxmLnRvdGFsX2NhbGxzID0gMAorICAgICAgICBzZWxmLnByaW1fY2FsbHMgPSAwCisgICAgICAgIHNlbGYubWF4X25hbWVfbGVuID0gMAorICAgICAgICBzZWxmLnRvcF9sZXZlbCA9IHt9CisgICAgICAgIHNlbGYuc3RhdHMgPSB7fQorICAgICAgICBzZWxmLnNvcnRfYXJnX2RpY3QgPSB7fQorICAgICAgICBzZWxmLmxvYWRfc3RhdHMoYXJnKQorICAgICAgICB0cm91YmxlID0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmdldF90b3BfbGV2ZWxfc3RhdHMoKQorICAgICAgICAgICAgdHJvdWJsZSA9IDAKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHRyb3VibGU6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJJbnZhbGlkIHRpbWluZyBkYXRhIiwKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmZpbGVzOiBwcmludCA+PiBzZWxmLnN0cmVhbSwgc2VsZi5maWxlc1stMV0sCisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KKworICAgIGRlZiBsb2FkX3N0YXRzKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIG5vdCBhcmc6ICBzZWxmLnN0YXRzID0ge30KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGFyZywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBmID0gb3BlbihhcmcsICdyYicpCisgICAgICAgICAgICBzZWxmLnN0YXRzID0gbWFyc2hhbC5sb2FkKGYpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaWxlX3N0YXRzID0gb3Muc3RhdChhcmcpCisgICAgICAgICAgICAgICAgYXJnID0gdGltZS5jdGltZShmaWxlX3N0YXRzLnN0X210aW1lKSArICIgICAgIiArIGFyZworICAgICAgICAgICAgZXhjZXB0OiAgIyBpbiBjYXNlIHRoaXMgaXMgbm90IHVuaXgKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLmZpbGVzID0gWyBhcmcgXQorICAgICAgICBlbGlmIGhhc2F0dHIoYXJnLCAnY3JlYXRlX3N0YXRzJyk6CisgICAgICAgICAgICBhcmcuY3JlYXRlX3N0YXRzKCkKKyAgICAgICAgICAgIHNlbGYuc3RhdHMgPSBhcmcuc3RhdHMKKyAgICAgICAgICAgIGFyZy5zdGF0cyA9IHt9CisgICAgICAgIGlmIG5vdCBzZWxmLnN0YXRzOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW5ub3QgY3JlYXRlIG9yIGNvbnN0cnVjdCBhICVyIG9iamVjdCBmcm9tICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlbGYuX19jbGFzc19fLCBhcmcpKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiBnZXRfdG9wX2xldmVsX3N0YXRzKHNlbGYpOgorICAgICAgICBmb3IgZnVuYywgKGNjLCBuYywgdHQsIGN0LCBjYWxsZXJzKSBpbiBzZWxmLnN0YXRzLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLnRvdGFsX2NhbGxzICs9IG5jCisgICAgICAgICAgICBzZWxmLnByaW1fY2FsbHMgICs9IGNjCisgICAgICAgICAgICBzZWxmLnRvdGFsX3R0ICAgICs9IHR0CisgICAgICAgICAgICBpZiAoImpwcm9maWxlIiwgMCwgInByb2ZpbGVyIikgaW4gY2FsbGVyczoKKyAgICAgICAgICAgICAgICBzZWxmLnRvcF9sZXZlbFtmdW5jXSA9IE5vbmUKKyAgICAgICAgICAgIGlmIGxlbihmdW5jX3N0ZF9zdHJpbmcoZnVuYykpID4gc2VsZi5tYXhfbmFtZV9sZW46CisgICAgICAgICAgICAgICAgc2VsZi5tYXhfbmFtZV9sZW4gPSBsZW4oZnVuY19zdGRfc3RyaW5nKGZ1bmMpKQorCisgICAgZGVmIGFkZChzZWxmLCAqYXJnX2xpc3QpOgorICAgICAgICBpZiBub3QgYXJnX2xpc3Q6IHJldHVybiBzZWxmCisgICAgICAgIGlmIGxlbihhcmdfbGlzdCkgPiAxOiBzZWxmLmFkZCgqYXJnX2xpc3RbMTpdKQorICAgICAgICBvdGhlciA9IGFyZ19saXN0WzBdCisgICAgICAgIGlmIHR5cGUoc2VsZikgIT0gdHlwZShvdGhlcikgb3Igc2VsZi5fX2NsYXNzX18gIT0gb3RoZXIuX19jbGFzc19fOgorICAgICAgICAgICAgb3RoZXIgPSBTdGF0cyhvdGhlcikKKyAgICAgICAgc2VsZi5maWxlcyArPSBvdGhlci5maWxlcworICAgICAgICBzZWxmLnRvdGFsX2NhbGxzICs9IG90aGVyLnRvdGFsX2NhbGxzCisgICAgICAgIHNlbGYucHJpbV9jYWxscyArPSBvdGhlci5wcmltX2NhbGxzCisgICAgICAgIHNlbGYudG90YWxfdHQgKz0gb3RoZXIudG90YWxfdHQKKyAgICAgICAgZm9yIGZ1bmMgaW4gb3RoZXIudG9wX2xldmVsOgorICAgICAgICAgICAgc2VsZi50b3BfbGV2ZWxbZnVuY10gPSBOb25lCisKKyAgICAgICAgaWYgc2VsZi5tYXhfbmFtZV9sZW4gPCBvdGhlci5tYXhfbmFtZV9sZW46CisgICAgICAgICAgICBzZWxmLm1heF9uYW1lX2xlbiA9IG90aGVyLm1heF9uYW1lX2xlbgorCisgICAgICAgIHNlbGYuZmNuX2xpc3QgPSBOb25lCisKKyAgICAgICAgZm9yIGZ1bmMsIHN0YXQgaW4gb3RoZXIuc3RhdHMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBpZiBmdW5jIGluIHNlbGYuc3RhdHM6CisgICAgICAgICAgICAgICAgb2xkX2Z1bmNfc3RhdCA9IHNlbGYuc3RhdHNbZnVuY10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2xkX2Z1bmNfc3RhdCA9ICgwLCAwLCAwLCAwLCB7fSwpCisgICAgICAgICAgICBzZWxmLnN0YXRzW2Z1bmNdID0gYWRkX2Z1bmNfc3RhdHMob2xkX2Z1bmNfc3RhdCwgc3RhdCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBkdW1wX3N0YXRzKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiV3JpdGUgdGhlIHByb2ZpbGUgZGF0YSB0byBhIGZpbGUgd2Uga25vdyBob3cgdG8gbG9hZCBiYWNrLiIiIgorICAgICAgICBmID0gZmlsZShmaWxlbmFtZSwgJ3diJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFyc2hhbC5kdW1wKHNlbGYuc3RhdHMsIGYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICMgbGlzdCB0aGUgdHVwbGUgaW5kaWNlcyBhbmQgZGlyZWN0aW9ucyBmb3Igc29ydGluZywKKyAgICAjIGFsb25nIHdpdGggc29tZSBwcmludGFibGUgZGVzY3JpcHRpb24KKyAgICBzb3J0X2FyZ19kaWN0X2RlZmF1bHQgPSB7CisgICAgICAgICAgICAgICJjYWxscyIgICAgIDogKCgoMSwtMSksICAgICAgICAgICAgICApLCAiY2FsbCBjb3VudCIpLAorICAgICAgICAgICAgICAibmNhbGxzIiAgICA6ICgoKDEsLTEpLCAgICAgICAgICAgICAgKSwgImNhbGwgY291bnQiKSwKKyAgICAgICAgICAgICAgImN1bXRpbWUiICAgOiAoKCgzLC0xKSwgICAgICAgICAgICAgICksICJjdW11bGF0aXZlIHRpbWUiKSwKKyAgICAgICAgICAgICAgImN1bXVsYXRpdmUiOiAoKCgzLC0xKSwgICAgICAgICAgICAgICksICJjdW11bGF0aXZlIHRpbWUiKSwKKyAgICAgICAgICAgICAgImZpbGUiICAgICAgOiAoKCg0LCAxKSwgICAgICAgICAgICAgICksICJmaWxlIG5hbWUiKSwKKyAgICAgICAgICAgICAgImZpbGVuYW1lIiAgOiAoKCg0LCAxKSwgICAgICAgICAgICAgICksICJmaWxlIG5hbWUiKSwKKyAgICAgICAgICAgICAgImxpbmUiICAgICAgOiAoKCg1LCAxKSwgICAgICAgICAgICAgICksICJsaW5lIG51bWJlciIpLAorICAgICAgICAgICAgICAibW9kdWxlIiAgICA6ICgoKDQsIDEpLCAgICAgICAgICAgICAgKSwgImZpbGUgbmFtZSIpLAorICAgICAgICAgICAgICAibmFtZSIgICAgICA6ICgoKDYsIDEpLCAgICAgICAgICAgICAgKSwgImZ1bmN0aW9uIG5hbWUiKSwKKyAgICAgICAgICAgICAgIm5mbCIgICAgICAgOiAoKCg2LCAxKSwoNCwgMSksKDUsIDEpLCksICJuYW1lL2ZpbGUvbGluZSIpLAorICAgICAgICAgICAgICAicGNhbGxzIiAgICA6ICgoKDAsLTEpLCAgICAgICAgICAgICAgKSwgInByaW1pdGl2ZSBjYWxsIGNvdW50IiksCisgICAgICAgICAgICAgICJzdGRuYW1lIiAgIDogKCgoNywgMSksICAgICAgICAgICAgICApLCAic3RhbmRhcmQgbmFtZSIpLAorICAgICAgICAgICAgICAidGltZSIgICAgICA6ICgoKDIsLTEpLCAgICAgICAgICAgICAgKSwgImludGVybmFsIHRpbWUiKSwKKyAgICAgICAgICAgICAgInRvdHRpbWUiICAgOiAoKCgyLC0xKSwgICAgICAgICAgICAgICksICJpbnRlcm5hbCB0aW1lIiksCisgICAgICAgICAgICAgIH0KKworICAgIGRlZiBnZXRfc29ydF9hcmdfZGVmcyhzZWxmKToKKyAgICAgICAgIiIiRXhwYW5kIGFsbCBhYmJyZXZpYXRpb25zIHRoYXQgYXJlIHVuaXF1ZS4iIiIKKyAgICAgICAgaWYgbm90IHNlbGYuc29ydF9hcmdfZGljdDoKKyAgICAgICAgICAgIHNlbGYuc29ydF9hcmdfZGljdCA9IGRpY3QgPSB7fQorICAgICAgICAgICAgYmFkX2xpc3QgPSB7fQorICAgICAgICAgICAgZm9yIHdvcmQsIHR1cCBpbiBzZWxmLnNvcnRfYXJnX2RpY3RfZGVmYXVsdC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBmcmFnbWVudCA9IHdvcmQKKyAgICAgICAgICAgICAgICB3aGlsZSBmcmFnbWVudDoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZyYWdtZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgaWYgZnJhZ21lbnQgaW4gZGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhZF9saXN0W2ZyYWdtZW50XSA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGRpY3RbZnJhZ21lbnRdID0gdHVwCisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gZnJhZ21lbnRbOi0xXQorICAgICAgICAgICAgZm9yIHdvcmQgaW4gYmFkX2xpc3Q6CisgICAgICAgICAgICAgICAgZGVsIGRpY3Rbd29yZF0KKyAgICAgICAgcmV0dXJuIHNlbGYuc29ydF9hcmdfZGljdAorCisgICAgZGVmIHNvcnRfc3RhdHMoc2VsZiwgKmZpZWxkKToKKyAgICAgICAgaWYgbm90IGZpZWxkOgorICAgICAgICAgICAgc2VsZi5mY25fbGlzdCA9IDAKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGlmIGxlbihmaWVsZCkgPT0gMSBhbmQgaXNpbnN0YW5jZShmaWVsZFswXSwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgIyBCZSBjb21wYXRpYmxlIHdpdGggb2xkIHByb2ZpbGVyCisgICAgICAgICAgICBmaWVsZCA9IFsgey0xOiAic3RkbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgIDA6ICAiY2FsbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAxOiAgInRpbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAyOiAgImN1bXVsYXRpdmUifVtmaWVsZFswXV0gXQorCisgICAgICAgIHNvcnRfYXJnX2RlZnMgPSBzZWxmLmdldF9zb3J0X2FyZ19kZWZzKCkKKyAgICAgICAgc29ydF90dXBsZSA9ICgpCisgICAgICAgIHNlbGYuc29ydF90eXBlID0gIiIKKyAgICAgICAgY29ubmVjdG9yID0gIiIKKyAgICAgICAgZm9yIHdvcmQgaW4gZmllbGQ6CisgICAgICAgICAgICBzb3J0X3R1cGxlID0gc29ydF90dXBsZSArIHNvcnRfYXJnX2RlZnNbd29yZF1bMF0KKyAgICAgICAgICAgIHNlbGYuc29ydF90eXBlICs9IGNvbm5lY3RvciArIHNvcnRfYXJnX2RlZnNbd29yZF1bMV0KKyAgICAgICAgICAgIGNvbm5lY3RvciA9ICIsICIKKworICAgICAgICBzdGF0c19saXN0ID0gW10KKyAgICAgICAgZm9yIGZ1bmMsIChjYywgbmMsIHR0LCBjdCwgY2FsbGVycykgaW4gc2VsZi5zdGF0cy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHN0YXRzX2xpc3QuYXBwZW5kKChjYywgbmMsIHR0LCBjdCkgKyBmdW5jICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmdW5jX3N0ZF9zdHJpbmcoZnVuYyksIGZ1bmMpKQorCisgICAgICAgIHN0YXRzX2xpc3Quc29ydChrZXk9Y21wX3RvX2tleShUdXBsZUNvbXAoc29ydF90dXBsZSkuY29tcGFyZSkpCisKKyAgICAgICAgc2VsZi5mY25fbGlzdCA9IGZjbl9saXN0ID0gW10KKyAgICAgICAgZm9yIHR1cGxlIGluIHN0YXRzX2xpc3Q6CisgICAgICAgICAgICBmY25fbGlzdC5hcHBlbmQodHVwbGVbLTFdKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHJldmVyc2Vfb3JkZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZmNuX2xpc3Q6CisgICAgICAgICAgICBzZWxmLmZjbl9saXN0LnJldmVyc2UoKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHN0cmlwX2RpcnMoc2VsZik6CisgICAgICAgIG9sZHN0YXRzID0gc2VsZi5zdGF0cworICAgICAgICBzZWxmLnN0YXRzID0gbmV3c3RhdHMgPSB7fQorICAgICAgICBtYXhfbmFtZV9sZW4gPSAwCisgICAgICAgIGZvciBmdW5jLCAoY2MsIG5jLCB0dCwgY3QsIGNhbGxlcnMpIGluIG9sZHN0YXRzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgbmV3ZnVuYyA9IGZ1bmNfc3RyaXBfcGF0aChmdW5jKQorICAgICAgICAgICAgaWYgbGVuKGZ1bmNfc3RkX3N0cmluZyhuZXdmdW5jKSkgPiBtYXhfbmFtZV9sZW46CisgICAgICAgICAgICAgICAgbWF4X25hbWVfbGVuID0gbGVuKGZ1bmNfc3RkX3N0cmluZyhuZXdmdW5jKSkKKyAgICAgICAgICAgIG5ld2NhbGxlcnMgPSB7fQorICAgICAgICAgICAgZm9yIGZ1bmMyLCBjYWxsZXIgaW4gY2FsbGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBuZXdjYWxsZXJzW2Z1bmNfc3RyaXBfcGF0aChmdW5jMildID0gY2FsbGVyCisKKyAgICAgICAgICAgIGlmIG5ld2Z1bmMgaW4gbmV3c3RhdHM6CisgICAgICAgICAgICAgICAgbmV3c3RhdHNbbmV3ZnVuY10gPSBhZGRfZnVuY19zdGF0cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzdGF0c1tuZXdmdW5jXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2MsIG5jLCB0dCwgY3QsIG5ld2NhbGxlcnMpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdzdGF0c1tuZXdmdW5jXSA9IChjYywgbmMsIHR0LCBjdCwgbmV3Y2FsbGVycykKKyAgICAgICAgb2xkX3RvcCA9IHNlbGYudG9wX2xldmVsCisgICAgICAgIHNlbGYudG9wX2xldmVsID0gbmV3X3RvcCA9IHt9CisgICAgICAgIGZvciBmdW5jIGluIG9sZF90b3A6CisgICAgICAgICAgICBuZXdfdG9wW2Z1bmNfc3RyaXBfcGF0aChmdW5jKV0gPSBOb25lCisKKyAgICAgICAgc2VsZi5tYXhfbmFtZV9sZW4gPSBtYXhfbmFtZV9sZW4KKworICAgICAgICBzZWxmLmZjbl9saXN0ID0gTm9uZQorICAgICAgICBzZWxmLmFsbF9jYWxsZWVzID0gTm9uZQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGNhbGNfY2FsbGVlcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5hbGxfY2FsbGVlczogcmV0dXJuCisgICAgICAgIHNlbGYuYWxsX2NhbGxlZXMgPSBhbGxfY2FsbGVlcyA9IHt9CisgICAgICAgIGZvciBmdW5jLCAoY2MsIG5jLCB0dCwgY3QsIGNhbGxlcnMpIGluIHNlbGYuc3RhdHMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBpZiBub3QgZnVuYyBpbiBhbGxfY2FsbGVlczoKKyAgICAgICAgICAgICAgICBhbGxfY2FsbGVlc1tmdW5jXSA9IHt9CisgICAgICAgICAgICBmb3IgZnVuYzIsIGNhbGxlciBpbiBjYWxsZXJzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBmdW5jMiBpbiBhbGxfY2FsbGVlczoKKyAgICAgICAgICAgICAgICAgICAgYWxsX2NhbGxlZXNbZnVuYzJdID0ge30KKyAgICAgICAgICAgICAgICBhbGxfY2FsbGVlc1tmdW5jMl1bZnVuY10gID0gY2FsbGVyCisgICAgICAgIHJldHVybgorCisgICAgIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgc3VwcG9ydCBhY3R1YWwgcHJpbnRpbmcgb2YgcmVwb3J0cworICAgICMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworICAgICMgT3B0aW9uYWwgImFtb3VudCIgaXMgZWl0aGVyIGEgbGluZSBjb3VudCwgb3IgYSBwZXJjZW50YWdlIG9mIGxpbmVzLgorCisgICAgZGVmIGV2YWxfcHJpbnRfYW1vdW50KHNlbGYsIHNlbCwgbGlzdCwgbXNnKToKKyAgICAgICAgbmV3X2xpc3QgPSBsaXN0CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXggPSByZS5jb21waWxlKHNlbCkKKyAgICAgICAgICAgIGV4Y2VwdCByZS5lcnJvcjoKKyAgICAgICAgICAgICAgICBtc2cgKz0gIiAgIDxJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiAlcj5cbiIgJSBzZWwKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3X2xpc3QsIG1zZworICAgICAgICAgICAgbmV3X2xpc3QgPSBbXQorICAgICAgICAgICAgZm9yIGZ1bmMgaW4gbGlzdDoKKyAgICAgICAgICAgICAgICBpZiByZXguc2VhcmNoKGZ1bmNfc3RkX3N0cmluZyhmdW5jKSk6CisgICAgICAgICAgICAgICAgICAgIG5ld19saXN0LmFwcGVuZChmdW5jKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY291bnQgPSBsZW4obGlzdCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsLCBmbG9hdCkgYW5kIDAuMCA8PSBzZWwgPCAxLjA6CisgICAgICAgICAgICAgICAgY291bnQgPSBpbnQoY291bnQgKiBzZWwgKyAuNSkKKyAgICAgICAgICAgICAgICBuZXdfbGlzdCA9IGxpc3RbOmNvdW50XQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbCwgKGludCwgbG9uZykpIGFuZCAwIDw9IHNlbCA8IGNvdW50OgorICAgICAgICAgICAgICAgIGNvdW50ID0gc2VsCisgICAgICAgICAgICAgICAgbmV3X2xpc3QgPSBsaXN0Wzpjb3VudF0KKyAgICAgICAgaWYgbGVuKGxpc3QpICE9IGxlbihuZXdfbGlzdCk6CisgICAgICAgICAgICBtc2cgKz0gIiAgIExpc3QgcmVkdWNlZCBmcm9tICVyIHRvICVyIGR1ZSB0byByZXN0cmljdGlvbiA8JXI+XG4iICUgKAorICAgICAgICAgICAgICAgIGxlbihsaXN0KSwgbGVuKG5ld19saXN0KSwgc2VsKQorCisgICAgICAgIHJldHVybiBuZXdfbGlzdCwgbXNnCisKKyAgICBkZWYgZ2V0X3ByaW50X2xpc3Qoc2VsZiwgc2VsX2xpc3QpOgorICAgICAgICB3aWR0aCA9IHNlbGYubWF4X25hbWVfbGVuCisgICAgICAgIGlmIHNlbGYuZmNuX2xpc3Q6CisgICAgICAgICAgICBzdGF0X2xpc3QgPSBzZWxmLmZjbl9saXN0WzpdCisgICAgICAgICAgICBtc2cgPSAiICAgT3JkZXJlZCBieTogIiArIHNlbGYuc29ydF90eXBlICsgJ1xuJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhdF9saXN0ID0gc2VsZi5zdGF0cy5rZXlzKCkKKyAgICAgICAgICAgIG1zZyA9ICIgICBSYW5kb20gbGlzdGluZyBvcmRlciB3YXMgdXNlZFxuIgorCisgICAgICAgIGZvciBzZWxlY3Rpb24gaW4gc2VsX2xpc3Q6CisgICAgICAgICAgICBzdGF0X2xpc3QsIG1zZyA9IHNlbGYuZXZhbF9wcmludF9hbW91bnQoc2VsZWN0aW9uLCBzdGF0X2xpc3QsIG1zZykKKworICAgICAgICBjb3VudCA9IGxlbihzdGF0X2xpc3QpCisKKyAgICAgICAgaWYgbm90IHN0YXRfbGlzdDoKKyAgICAgICAgICAgIHJldHVybiAwLCBzdGF0X2xpc3QKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIG1zZworICAgICAgICBpZiBjb3VudCA8IGxlbihzZWxmLnN0YXRzKToKKyAgICAgICAgICAgIHdpZHRoID0gMAorICAgICAgICAgICAgZm9yIGZ1bmMgaW4gc3RhdF9saXN0OgorICAgICAgICAgICAgICAgIGlmICBsZW4oZnVuY19zdGRfc3RyaW5nKGZ1bmMpKSA+IHdpZHRoOgorICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGxlbihmdW5jX3N0ZF9zdHJpbmcoZnVuYykpCisgICAgICAgIHJldHVybiB3aWR0aCsyLCBzdGF0X2xpc3QKKworICAgIGRlZiBwcmludF9zdGF0cyhzZWxmLCAqYW1vdW50KToKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIHNlbGYuZmlsZXM6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgZmlsZW5hbWUKKyAgICAgICAgaWYgc2VsZi5maWxlczogcHJpbnQgPj4gc2VsZi5zdHJlYW0KKyAgICAgICAgaW5kZW50ID0gJyAnICogOAorICAgICAgICBmb3IgZnVuYyBpbiBzZWxmLnRvcF9sZXZlbDoKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBpbmRlbnQsIGZ1bmNfZ2V0X2Z1bmN0aW9uX25hbWUoZnVuYykKKworICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgaW5kZW50LCBzZWxmLnRvdGFsX2NhbGxzLCAiZnVuY3Rpb24gY2FsbHMiLAorICAgICAgICBpZiBzZWxmLnRvdGFsX2NhbGxzICE9IHNlbGYucHJpbV9jYWxsczoKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiKCVkIHByaW1pdGl2ZSBjYWxscykiICUgc2VsZi5wcmltX2NhbGxzLAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgImluICUuM2Ygc2Vjb25kcyIgJSBzZWxmLnRvdGFsX3R0CisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCisgICAgICAgIHdpZHRoLCBsaXN0ID0gc2VsZi5nZXRfcHJpbnRfbGlzdChhbW91bnQpCisgICAgICAgIGlmIGxpc3Q6CisgICAgICAgICAgICBzZWxmLnByaW50X3RpdGxlKCkKKyAgICAgICAgICAgIGZvciBmdW5jIGluIGxpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5wcmludF9saW5lKGZ1bmMpCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBwcmludF9jYWxsZWVzKHNlbGYsICphbW91bnQpOgorICAgICAgICB3aWR0aCwgbGlzdCA9IHNlbGYuZ2V0X3ByaW50X2xpc3QoYW1vdW50KQorICAgICAgICBpZiBsaXN0OgorICAgICAgICAgICAgc2VsZi5jYWxjX2NhbGxlZXMoKQorCisgICAgICAgICAgICBzZWxmLnByaW50X2NhbGxfaGVhZGluZyh3aWR0aCwgImNhbGxlZC4uLiIpCisgICAgICAgICAgICBmb3IgZnVuYyBpbiBsaXN0OgorICAgICAgICAgICAgICAgIGlmIGZ1bmMgaW4gc2VsZi5hbGxfY2FsbGVlczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9jYWxsX2xpbmUod2lkdGgsIGZ1bmMsIHNlbGYuYWxsX2NhbGxlZXNbZnVuY10pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9jYWxsX2xpbmUod2lkdGgsIGZ1bmMsIHt9KQorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgcHJpbnRfY2FsbGVycyhzZWxmLCAqYW1vdW50KToKKyAgICAgICAgd2lkdGgsIGxpc3QgPSBzZWxmLmdldF9wcmludF9saXN0KGFtb3VudCkKKyAgICAgICAgaWYgbGlzdDoKKyAgICAgICAgICAgIHNlbGYucHJpbnRfY2FsbF9oZWFkaW5nKHdpZHRoLCAid2FzIGNhbGxlZCBieS4uLiIpCisgICAgICAgICAgICBmb3IgZnVuYyBpbiBsaXN0OgorICAgICAgICAgICAgICAgIGNjLCBuYywgdHQsIGN0LCBjYWxsZXJzID0gc2VsZi5zdGF0c1tmdW5jXQorICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfY2FsbF9saW5lKHdpZHRoLCBmdW5jLCBjYWxsZXJzLCAiPC0iKQorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgcHJpbnRfY2FsbF9oZWFkaW5nKHNlbGYsIG5hbWVfc2l6ZSwgY29sdW1uX3RpdGxlKToKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJGdW5jdGlvbiAiLmxqdXN0KG5hbWVfc2l6ZSkgKyBjb2x1bW5fdGl0bGUKKyAgICAgICAgIyBwcmludCBzdWItaGVhZGVyIG9ubHkgaWYgd2UgaGF2ZSBuZXctc3R5bGUgY2FsbGVycworICAgICAgICBzdWJoZWFkZXIgPSBGYWxzZQorICAgICAgICBmb3IgY2MsIG5jLCB0dCwgY3QsIGNhbGxlcnMgaW4gc2VsZi5zdGF0cy5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICBpZiBjYWxsZXJzOgorICAgICAgICAgICAgICAgIHZhbHVlID0gY2FsbGVycy5pdGVydmFsdWVzKCkubmV4dCgpCisgICAgICAgICAgICAgICAgc3ViaGVhZGVyID0gaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgc3ViaGVhZGVyOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIgIipuYW1lX3NpemUgKyAiICAgIG5jYWxscyAgdG90dGltZSAgY3VtdGltZSIKKworICAgIGRlZiBwcmludF9jYWxsX2xpbmUoc2VsZiwgbmFtZV9zaXplLCBzb3VyY2UsIGNhbGxfZGljdCwgYXJyb3c9Ii0+Iik6CisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmdW5jX3N0ZF9zdHJpbmcoc291cmNlKS5sanVzdChuYW1lX3NpemUpICsgYXJyb3csCisgICAgICAgIGlmIG5vdCBjYWxsX2RpY3Q6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGNsaXN0ID0gY2FsbF9kaWN0LmtleXMoKQorICAgICAgICBjbGlzdC5zb3J0KCkKKyAgICAgICAgaW5kZW50ID0gIiIKKyAgICAgICAgZm9yIGZ1bmMgaW4gY2xpc3Q6CisgICAgICAgICAgICBuYW1lID0gZnVuY19zdGRfc3RyaW5nKGZ1bmMpCisgICAgICAgICAgICB2YWx1ZSA9IGNhbGxfZGljdFtmdW5jXQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgorICAgICAgICAgICAgICAgIG5jLCBjYywgdHQsIGN0ID0gdmFsdWUKKyAgICAgICAgICAgICAgICBpZiBuYyAhPSBjYzoKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RhdHMgPSAnJWQvJWQnICUgKG5jLCBjYykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzdWJzdGF0cyA9ICclZCcgJSAobmMsKQorICAgICAgICAgICAgICAgIHN1YnN0YXRzID0gJyVzICVzICVzICAlcycgJSAoc3Vic3RhdHMucmp1c3QoNysyKmxlbihpbmRlbnQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGY4KHR0KSwgZjgoY3QpLCBuYW1lKQorICAgICAgICAgICAgICAgIGxlZnRfd2lkdGggPSBuYW1lX3NpemUgKyAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN1YnN0YXRzID0gJyVzKCVyKSAlcycgJSAobmFtZSwgdmFsdWUsIGY4KHNlbGYuc3RhdHNbZnVuY11bM10pKQorICAgICAgICAgICAgICAgIGxlZnRfd2lkdGggPSBuYW1lX3NpemUgKyAzCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgaW5kZW50KmxlZnRfd2lkdGggKyBzdWJzdGF0cworICAgICAgICAgICAgaW5kZW50ID0gIiAiCisKKyAgICBkZWYgcHJpbnRfdGl0bGUoc2VsZik6CisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAnICAgbmNhbGxzICB0b3R0aW1lICBwZXJjYWxsICBjdW10aW1lICBwZXJjYWxsJywKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICdmaWxlbmFtZTpsaW5lbm8oZnVuY3Rpb24pJworCisgICAgZGVmIHByaW50X2xpbmUoc2VsZiwgZnVuYyk6ICAjIGhhY2sgOiBzaG91bGQgcHJpbnQgcGVyY2VudGFnZXMKKyAgICAgICAgY2MsIG5jLCB0dCwgY3QsIGNhbGxlcnMgPSBzZWxmLnN0YXRzW2Z1bmNdCisgICAgICAgIGMgPSBzdHIobmMpCisgICAgICAgIGlmIG5jICE9IGNjOgorICAgICAgICAgICAgYyA9IGMgKyAnLycgKyBzdHIoY2MpCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBjLnJqdXN0KDkpLAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgZjgodHQpLAorICAgICAgICBpZiBuYyA9PSAwOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICcgJyo4LAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGY4KGZsb2F0KHR0KS9uYyksCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmOChjdCksCisgICAgICAgIGlmIGNjID09IDA6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgJyAnKjgsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgZjgoZmxvYXQoY3QpL2NjKSwKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGZ1bmNfc3RkX3N0cmluZyhmdW5jKQorCitjbGFzcyBUdXBsZUNvbXA6CisgICAgIiIiVGhpcyBjbGFzcyBwcm92aWRlcyBhIGdlbmVyaWMgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyBhbnkgdHdvIHR1cGxlcy4KKyAgICBFYWNoIGluc3RhbmNlIHJlY29yZHMgYSBsaXN0IG9mIHR1cGxlLWluZGljZXMgKGZyb20gbW9zdCBzaWduaWZpY2FudAorICAgIHRvIGxlYXN0IHNpZ25pZmljYW50KSwgYW5kIHNvcnQgZGlyZWN0aW9uIChhc2NlbmRpbmcgb3IgZGVjZW5kaW5nKSBmb3IKKyAgICBlYWNoIHR1cGxlLWluZGV4LiAgVGhlIGNvbXBhcmUgZnVuY3Rpb25zIGNhbiB0aGVuIGJlIHVzZWQgYXMgdGhlIGZ1bmN0aW9uCisgICAgYXJndW1lbnQgdG8gdGhlIHN5c3RlbSBzb3J0KCkgZnVuY3Rpb24gd2hlbiBhIGxpc3Qgb2YgdHVwbGVzIG5lZWQgdG8gYmUKKyAgICBzb3J0ZWQgaW4gdGhlIGluc3RhbmNlcyBvcmRlci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21wX3NlbGVjdF9saXN0KToKKyAgICAgICAgc2VsZi5jb21wX3NlbGVjdF9saXN0ID0gY29tcF9zZWxlY3RfbGlzdAorCisgICAgZGVmIGNvbXBhcmUgKHNlbGYsIGxlZnQsIHJpZ2h0KToKKyAgICAgICAgZm9yIGluZGV4LCBkaXJlY3Rpb24gaW4gc2VsZi5jb21wX3NlbGVjdF9saXN0OgorICAgICAgICAgICAgbCA9IGxlZnRbaW5kZXhdCisgICAgICAgICAgICByID0gcmlnaHRbaW5kZXhdCisgICAgICAgICAgICBpZiBsIDwgcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gLWRpcmVjdGlvbgorICAgICAgICAgICAgaWYgbCA+IHI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGlvbgorICAgICAgICByZXR1cm4gMAorCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgZnVuY19uYW1lIGlzIGEgdHJpcGxlIChmaWxlOnN0cmluZywgbGluZTppbnQsIG5hbWU6c3RyaW5nKQorCitkZWYgZnVuY19zdHJpcF9wYXRoKGZ1bmNfbmFtZSk6CisgICAgZmlsZW5hbWUsIGxpbmUsIG5hbWUgPSBmdW5jX25hbWUKKyAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSksIGxpbmUsIG5hbWUKKworZGVmIGZ1bmNfZ2V0X2Z1bmN0aW9uX25hbWUoZnVuYyk6CisgICAgcmV0dXJuIGZ1bmNbMl0KKworZGVmIGZ1bmNfc3RkX3N0cmluZyhmdW5jX25hbWUpOiAjIG1hdGNoIHdoYXQgb2xkIHByb2ZpbGUgcHJvZHVjZWQKKyAgICBpZiBmdW5jX25hbWVbOjJdID09ICgnficsIDApOgorICAgICAgICAjIHNwZWNpYWwgY2FzZSBmb3IgYnVpbHQtaW4gZnVuY3Rpb25zCisgICAgICAgIG5hbWUgPSBmdW5jX25hbWVbMl0KKyAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCc8JykgYW5kIG5hbWUuZW5kc3dpdGgoJz4nKToKKyAgICAgICAgICAgIHJldHVybiAneyVzfScgJSBuYW1lWzE6LTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbmFtZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAiJXM6JWQoJXMpIiAlIGZ1bmNfbmFtZQorCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgY29tYmluZSBzdGF0aXN0cyBmb3IgcGFpcnMgZnVuY3Rpb25zLgorIyBUaGUgYnVsayBvZiB0aGUgcHJvY2Vzc2luZyBpbnZvbHZlcyBjb3JyZWN0bHkgaGFuZGxpbmcgImNhbGwiIGxpc3RzLAorIyBzdWNoIGFzIGNhbGxlcnMgYW5kIGNhbGxlZXMuCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworZGVmIGFkZF9mdW5jX3N0YXRzKHRhcmdldCwgc291cmNlKToKKyAgICAiIiJBZGQgdG9nZXRoZXIgYWxsIHRoZSBzdGF0cyBmb3IgdHdvIHByb2ZpbGUgZW50cmllcy4iIiIKKyAgICBjYywgbmMsIHR0LCBjdCwgY2FsbGVycyA9IHNvdXJjZQorICAgIHRfY2MsIHRfbmMsIHRfdHQsIHRfY3QsIHRfY2FsbGVycyA9IHRhcmdldAorICAgIHJldHVybiAoY2MrdF9jYywgbmMrdF9uYywgdHQrdF90dCwgY3QrdF9jdCwKKyAgICAgICAgICAgICAgYWRkX2NhbGxlcnModF9jYWxsZXJzLCBjYWxsZXJzKSkKKworZGVmIGFkZF9jYWxsZXJzKHRhcmdldCwgc291cmNlKToKKyAgICAiIiJDb21iaW5lIHR3byBjYWxsZXIgbGlzdHMgaW4gYSBzaW5nbGUgbGlzdC4iIiIKKyAgICBuZXdfY2FsbGVycyA9IHt9CisgICAgZm9yIGZ1bmMsIGNhbGxlciBpbiB0YXJnZXQuaXRlcml0ZW1zKCk6CisgICAgICAgIG5ld19jYWxsZXJzW2Z1bmNdID0gY2FsbGVyCisgICAgZm9yIGZ1bmMsIGNhbGxlciBpbiBzb3VyY2UuaXRlcml0ZW1zKCk6CisgICAgICAgIGlmIGZ1bmMgaW4gbmV3X2NhbGxlcnM6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNhbGxlciwgdHVwbGUpOgorICAgICAgICAgICAgICAgICMgZm9ybWF0IHVzZWQgYnkgY1Byb2ZpbGUKKyAgICAgICAgICAgICAgICBuZXdfY2FsbGVyc1tmdW5jXSA9IHR1cGxlKFtpWzBdICsgaVsxXSBmb3IgaSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcChjYWxsZXIsIG5ld19jYWxsZXJzW2Z1bmNdKV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgZm9ybWF0IHVzZWQgYnkgcHJvZmlsZQorICAgICAgICAgICAgICAgIG5ld19jYWxsZXJzW2Z1bmNdICs9IGNhbGxlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV3X2NhbGxlcnNbZnVuY10gPSBjYWxsZXIKKyAgICByZXR1cm4gbmV3X2NhbGxlcnMKKworZGVmIGNvdW50X2NhbGxzKGNhbGxlcnMpOgorICAgICIiIlN1bSB0aGUgY2FsbGVyIHN0YXRpc3RpY3MgdG8gZ2V0IHRvdGFsIG51bWJlciBvZiBjYWxscyByZWNlaXZlZC4iIiIKKyAgICBuYyA9IDAKKyAgICBmb3IgY2FsbHMgaW4gY2FsbGVycy5pdGVydmFsdWVzKCk6CisgICAgICAgIG5jICs9IGNhbGxzCisgICAgcmV0dXJuIG5jCisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBzdXBwb3J0IHByaW50aW5nIG9mIHJlcG9ydHMKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitkZWYgZjgoeCk6CisgICAgcmV0dXJuICIlOC4zZiIgJSB4CisKKyMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIyBTdGF0aXN0aWNzIGJyb3dzZXIgYWRkZWQgYnkgRVNSLCBBcHJpbCAyMDAxCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgY21kCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgcmVhZGxpbmUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKworICAgIGNsYXNzIFByb2ZpbGVCcm93c2VyKGNtZC5DbWQpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvZmlsZT1Ob25lKToKKyAgICAgICAgICAgIGNtZC5DbWQuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgIHNlbGYucHJvbXB0ID0gIiUgIgorICAgICAgICAgICAgc2VsZi5zdGF0cyA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgaWYgcHJvZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmRvX3JlYWQocHJvZmlsZSkKKworICAgICAgICBkZWYgZ2VuZXJpYyhzZWxmLCBmbiwgbGluZSk6CisgICAgICAgICAgICBhcmdzID0gbGluZS5zcGxpdCgpCisgICAgICAgICAgICBwcm9jZXNzZWQgPSBbXQorICAgICAgICAgICAgZm9yIHRlcm0gaW4gYXJnczoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hcHBlbmQoaW50KHRlcm0pKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmcmFjID0gZmxvYXQodGVybSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZnJhYyA+IDEgb3IgZnJhYyA8IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkZyYWN0aW9uIGFyZ3VtZW50IG11c3QgYmUgaW4gWzAsIDFdIgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFwcGVuZChmcmFjKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFwcGVuZCh0ZXJtKQorICAgICAgICAgICAgaWYgc2VsZi5zdGF0czoKKyAgICAgICAgICAgICAgICBnZXRhdHRyKHNlbGYuc3RhdHMsIGZuKSgqcHJvY2Vzc2VkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIk5vIHN0YXRpc3RpY3Mgb2JqZWN0IGlzIGxvYWRlZC4iCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBkZWYgZ2VuZXJpY19oZWxwKHNlbGYpOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJBcmd1bWVudHMgbWF5IGJlOiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiKiBBbiBpbnRlZ2VyIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8gcHJpbnQuIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIqIEEgZGVjaW1hbCBmcmFjdGlvbmFsIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEsIGNvbnRyb2xsaW5nIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIgIHdoYXQgZnJhY3Rpb24gb2Ygc2VsZWN0ZWQgZW50cmllcyB0byBwcmludC4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiogQSByZWd1bGFyIGV4cHJlc3Npb247IG9ubHkgZW50cmllcyB3aXRoIGZ1bmN0aW9uIG5hbWVzIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIgIHRoYXQgbWF0Y2ggaXQgYXJlIHByaW50ZWQuIgorCisgICAgICAgIGRlZiBkb19hZGQoc2VsZiwgbGluZSk6CisgICAgICAgICAgICBpZiBzZWxmLnN0YXRzOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdHMuYWRkKGxpbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiTm8gc3RhdGlzdGljcyBvYmplY3QgaXMgbG9hZGVkLiIKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGRlZiBoZWxwX2FkZChzZWxmKToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiQWRkIHByb2ZpbGUgaW5mbyBmcm9tIGdpdmVuIGZpbGUgdG8gY3VycmVudCBzdGF0aXN0aWNzIG9iamVjdC4iCisKKyAgICAgICAgZGVmIGRvX2NhbGxlZXMoc2VsZiwgbGluZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZW5lcmljKCdwcmludF9jYWxsZWVzJywgbGluZSkKKyAgICAgICAgZGVmIGhlbHBfY2FsbGVlcyhzZWxmKToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiUHJpbnQgY2FsbGVlcyBzdGF0aXN0aWNzIGZyb20gdGhlIGN1cnJlbnQgc3RhdCBvYmplY3QuIgorICAgICAgICAgICAgc2VsZi5nZW5lcmljX2hlbHAoKQorCisgICAgICAgIGRlZiBkb19jYWxsZXJzKHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2VuZXJpYygncHJpbnRfY2FsbGVycycsIGxpbmUpCisgICAgICAgIGRlZiBoZWxwX2NhbGxlcnMoc2VsZik6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlByaW50IGNhbGxlcnMgc3RhdGlzdGljcyBmcm9tIHRoZSBjdXJyZW50IHN0YXQgb2JqZWN0LiIKKyAgICAgICAgICAgIHNlbGYuZ2VuZXJpY19oZWxwKCkKKworICAgICAgICBkZWYgZG9fRU9GKHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIiCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBkZWYgaGVscF9FT0Yoc2VsZik6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkxlYXZlIHRoZSBwcm9maWxlIGJyb3dlci4iCisKKyAgICAgICAgZGVmIGRvX3F1aXQoc2VsZiwgbGluZSk6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBkZWYgaGVscF9xdWl0KHNlbGYpOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJMZWF2ZSB0aGUgcHJvZmlsZSBicm93ZXIuIgorCisgICAgICAgIGRlZiBkb19yZWFkKHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdHMgPSBTdGF0cyhsaW5lKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBhcmdzOgorICAgICAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgYXJnc1sxXQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGVyci5fX2NsYXNzX18uX19uYW1lX18gKyAnOicsIGVycgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBzZWxmLnByb21wdCA9IGxpbmUgKyAiJSAiCisgICAgICAgICAgICBlbGlmIGxlbihzZWxmLnByb21wdCkgPiAyOgorICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLnByb21wdFs6LTJdCisgICAgICAgICAgICAgICAgc2VsZi5kb19yZWFkKGxpbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiTm8gc3RhdGlzdGljcyBvYmplY3QgaXMgY3VycmVudCAtLSBjYW5ub3QgcmVsb2FkLiIKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGRlZiBoZWxwX3JlYWQoc2VsZik6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlJlYWQgaW4gcHJvZmlsZSBkYXRhIGZyb20gYSBzcGVjaWZpZWQgZmlsZS4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIldpdGhvdXQgYXJndW1lbnQsIHJlbG9hZCB0aGUgY3VycmVudCBmaWxlLiIKKworICAgICAgICBkZWYgZG9fcmV2ZXJzZShzZWxmLCBsaW5lKToKKyAgICAgICAgICAgIGlmIHNlbGYuc3RhdHM6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0cy5yZXZlcnNlX29yZGVyKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJObyBzdGF0aXN0aWNzIG9iamVjdCBpcyBsb2FkZWQuIgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZGVmIGhlbHBfcmV2ZXJzZShzZWxmKToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiUmV2ZXJzZSB0aGUgc29ydCBvcmRlciBvZiB0aGUgcHJvZmlsaW5nIHJlcG9ydC4iCisKKyAgICAgICAgZGVmIGRvX3NvcnQoc2VsZiwgbGluZSk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5zdGF0czoKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIk5vIHN0YXRpc3RpY3Mgb2JqZWN0IGlzIGxvYWRlZC4iCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBhYmJyZXZzID0gc2VsZi5zdGF0cy5nZXRfc29ydF9hcmdfZGVmcygpCisgICAgICAgICAgICBpZiBsaW5lIGFuZCBhbGwoKHggaW4gYWJicmV2cykgZm9yIHggaW4gbGluZS5zcGxpdCgpKToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRzLnNvcnRfc3RhdHMoKmxpbmUuc3BsaXQoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJWYWxpZCBzb3J0IGtleXMgKHVuaXF1ZSBwcmVmaXhlcyBhcmUgYWNjZXB0ZWQpOiIKKyAgICAgICAgICAgICAgICBmb3IgKGtleSwgdmFsdWUpIGluIFN0YXRzLnNvcnRfYXJnX2RpY3RfZGVmYXVsdC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIlcyAtLSAlcyIgJSAoa2V5LCB2YWx1ZVsxXSkKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGRlZiBoZWxwX3NvcnQoc2VsZik6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlNvcnQgcHJvZmlsZSBkYXRhIGFjY29yZGluZyB0byBzcGVjaWZpZWQga2V5cy4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIihUeXBpbmcgYHNvcnQnIHdpdGhvdXQgYXJndW1lbnRzIGxpc3RzIHZhbGlkIGtleXMuKSIKKyAgICAgICAgZGVmIGNvbXBsZXRlX3NvcnQoc2VsZiwgdGV4dCwgKmFyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIFthIGZvciBhIGluIFN0YXRzLnNvcnRfYXJnX2RpY3RfZGVmYXVsdCBpZiBhLnN0YXJ0c3dpdGgodGV4dCldCisKKyAgICAgICAgZGVmIGRvX3N0YXRzKHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2VuZXJpYygncHJpbnRfc3RhdHMnLCBsaW5lKQorICAgICAgICBkZWYgaGVscF9zdGF0cyhzZWxmKToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiUHJpbnQgc3RhdGlzdGljcyBmcm9tIHRoZSBjdXJyZW50IHN0YXQgb2JqZWN0LiIKKyAgICAgICAgICAgIHNlbGYuZ2VuZXJpY19oZWxwKCkKKworICAgICAgICBkZWYgZG9fc3RyaXAoc2VsZiwgbGluZSk6CisgICAgICAgICAgICBpZiBzZWxmLnN0YXRzOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdHMuc3RyaXBfZGlycygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiTm8gc3RhdGlzdGljcyBvYmplY3QgaXMgbG9hZGVkLiIKKyAgICAgICAgZGVmIGhlbHBfc3RyaXAoc2VsZik6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlN0cmlwIGxlYWRpbmcgcGF0aCBpbmZvcm1hdGlvbiBmcm9tIGZpbGVuYW1lcyBpbiB0aGUgcmVwb3J0LiIKKworICAgICAgICBkZWYgaGVscF9oZWxwKHNlbGYpOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJTaG93IGhlbHAgZm9yIGEgZ2l2ZW4gY29tbWFuZC4iCisKKyAgICAgICAgZGVmIHBvc3RjbWQoc2VsZiwgc3RvcCwgbGluZSk6CisgICAgICAgICAgICBpZiBzdG9wOgorICAgICAgICAgICAgICAgIHJldHVybiBzdG9wCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgaW1wb3J0IHN5cworICAgIGlmIGxlbihzeXMuYXJndikgPiAxOgorICAgICAgICBpbml0cHJvZmlsZSA9IHN5cy5hcmd2WzFdCisgICAgZWxzZToKKyAgICAgICAgaW5pdHByb2ZpbGUgPSBOb25lCisgICAgdHJ5OgorICAgICAgICBicm93c2VyID0gUHJvZmlsZUJyb3dzZXIoaW5pdHByb2ZpbGUpCisgICAgICAgIHByaW50ID4+IGJyb3dzZXIuc3RyZWFtLCAiV2VsY29tZSB0byB0aGUgcHJvZmlsZSBzdGF0aXN0aWNzIGJyb3dzZXIuIgorICAgICAgICBicm93c2VyLmNtZGxvb3AoKQorICAgICAgICBwcmludCA+PiBicm93c2VyLnN0cmVhbSwgIkdvb2RieWUuIgorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcGFzcworCisjIFRoYXQncyBhbGwsIGZvbGtzLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wc3RhdHMucHljIGIvbGliL3B5dGhvbjIuNy9wc3RhdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTg2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BzdGF0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wc3RhdHMucHlvIGIvbGliL3B5dGhvbjIuNy9wc3RhdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTg2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BzdGF0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wdHkucHkgYi9saWIvcHl0aG9uMi43L3B0eS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWZmNjg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wdHkucHkKQEAgLTAsMCArMSwxODAgQEAKKyIiIlBzZXVkbyB0ZXJtaW5hbCB1dGlsaXRpZXMuIiIiCisKKyMgQnVnczogTm8gc2lnbmFsIGhhbmRsaW5nLiAgRG9lc24ndCBzZXQgc2xhdmUgdGVybWlvcyBhbmQgd2luZG93IHNpemUuCisjICAgICAgIE9ubHkgdGVzdGVkIG9uIExpbnV4LgorIyBTZWU6ICBXLiBSaWNoYXJkIFN0ZXZlbnMuIDE5OTIuICBBZHZhbmNlZCBQcm9ncmFtbWluZyBpbiB0aGUKKyMgICAgICAgVU5JWCBFbnZpcm9ubWVudC4gIENoYXB0ZXIgMTkuCisjIEF1dGhvcjogU3RlZW4gTHVtaG9sdCAtLSB3aXRoIGFkZGl0aW9ucyBieSBHdWlkby4KKworZnJvbSBzZWxlY3QgaW1wb3J0IHNlbGVjdAoraW1wb3J0IG9zCitpbXBvcnQgdHR5CisKK19fYWxsX18gPSBbIm9wZW5wdHkiLCJmb3JrIiwic3Bhd24iXQorCitTVERJTl9GSUxFTk8gPSAwCitTVERPVVRfRklMRU5PID0gMQorU1RERVJSX0ZJTEVOTyA9IDIKKworQ0hJTEQgPSAwCisKK2RlZiBvcGVucHR5KCk6CisgICAgIiIib3BlbnB0eSgpIC0+IChtYXN0ZXJfZmQsIHNsYXZlX2ZkKQorICAgIE9wZW4gYSBwdHkgbWFzdGVyL3NsYXZlIHBhaXIsIHVzaW5nIG9zLm9wZW5wdHkoKSBpZiBwb3NzaWJsZS4iIiIKKworICAgIHRyeToKKyAgICAgICAgcmV0dXJuIG9zLm9wZW5wdHkoKQorICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIE9TRXJyb3IpOgorICAgICAgICBwYXNzCisgICAgbWFzdGVyX2ZkLCBzbGF2ZV9uYW1lID0gX29wZW5fdGVybWluYWwoKQorICAgIHNsYXZlX2ZkID0gc2xhdmVfb3BlbihzbGF2ZV9uYW1lKQorICAgIHJldHVybiBtYXN0ZXJfZmQsIHNsYXZlX2ZkCisKK2RlZiBtYXN0ZXJfb3BlbigpOgorICAgICIiIm1hc3Rlcl9vcGVuKCkgLT4gKG1hc3Rlcl9mZCwgc2xhdmVfbmFtZSkKKyAgICBPcGVuIGEgcHR5IG1hc3RlciBhbmQgcmV0dXJuIHRoZSBmZCwgYW5kIHRoZSBmaWxlbmFtZSBvZiB0aGUgc2xhdmUgZW5kLgorICAgIERlcHJlY2F0ZWQsIHVzZSBvcGVucHR5KCkgaW5zdGVhZC4iIiIKKworICAgIHRyeToKKyAgICAgICAgbWFzdGVyX2ZkLCBzbGF2ZV9mZCA9IG9zLm9wZW5wdHkoKQorICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIE9TRXJyb3IpOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgc2xhdmVfbmFtZSA9IG9zLnR0eW5hbWUoc2xhdmVfZmQpCisgICAgICAgIG9zLmNsb3NlKHNsYXZlX2ZkKQorICAgICAgICByZXR1cm4gbWFzdGVyX2ZkLCBzbGF2ZV9uYW1lCisKKyAgICByZXR1cm4gX29wZW5fdGVybWluYWwoKQorCitkZWYgX29wZW5fdGVybWluYWwoKToKKyAgICAiIiJPcGVuIHB0eSBtYXN0ZXIgYW5kIHJldHVybiAobWFzdGVyX2ZkLCB0dHlfbmFtZSkuCisgICAgU0dJIGFuZCBnZW5lcmljIEJTRCB2ZXJzaW9uLCBmb3Igd2hlbiBvcGVucHR5KCkgZmFpbHMuIiIiCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgc2dpCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHR5X25hbWUsIG1hc3Rlcl9mZCA9IHNnaS5fZ2V0cHR5KG9zLk9fUkRXUiwgMDY2NiwgMCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHJhaXNlIG9zLmVycm9yLCBtc2cKKyAgICAgICAgcmV0dXJuIG1hc3Rlcl9mZCwgdHR5X25hbWUKKyAgICBmb3IgeCBpbiAncHFyc3R1dnd4eXpQUVJTVCc6CisgICAgICAgIGZvciB5IGluICcwMTIzNDU2Nzg5YWJjZGVmJzoKKyAgICAgICAgICAgIHB0eV9uYW1lID0gJy9kZXYvcHR5JyArIHggKyB5CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmQgPSBvcy5vcGVuKHB0eV9uYW1lLCBvcy5PX1JEV1IpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHJldHVybiAoZmQsICcvZGV2L3R0eScgKyB4ICsgeSkKKyAgICByYWlzZSBvcy5lcnJvciwgJ291dCBvZiBwdHkgZGV2aWNlcycKKworZGVmIHNsYXZlX29wZW4odHR5X25hbWUpOgorICAgICIiInNsYXZlX29wZW4odHR5X25hbWUpIC0+IHNsYXZlX2ZkCisgICAgT3BlbiB0aGUgcHR5IHNsYXZlIGFuZCBhY3F1aXJlIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCwgcmV0dXJuaW5nCisgICAgb3BlbmVkIGZpbGVkZXNjcmlwdG9yLgorICAgIERlcHJlY2F0ZWQsIHVzZSBvcGVucHR5KCkgaW5zdGVhZC4iIiIKKworICAgIHJlc3VsdCA9IG9zLm9wZW4odHR5X25hbWUsIG9zLk9fUkRXUikKKyAgICB0cnk6CisgICAgICAgIGZyb20gZmNudGwgaW1wb3J0IGlvY3RsLCBJX1BVU0gKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICB0cnk6CisgICAgICAgIGlvY3RsKHJlc3VsdCwgSV9QVVNILCAicHRlbSIpCisgICAgICAgIGlvY3RsKHJlc3VsdCwgSV9QVVNILCAibGR0ZXJtIikKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcGFzcworICAgIHJldHVybiByZXN1bHQKKworZGVmIGZvcmsoKToKKyAgICAiIiJmb3JrKCkgLT4gKHBpZCwgbWFzdGVyX2ZkKQorICAgIEZvcmsgYW5kIG1ha2UgdGhlIGNoaWxkIGEgc2Vzc2lvbiBsZWFkZXIgd2l0aCBhIGNvbnRyb2xsaW5nIHRlcm1pbmFsLiIiIgorCisgICAgdHJ5OgorICAgICAgICBwaWQsIGZkID0gb3MuZm9ya3B0eSgpCisgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgT1NFcnJvcik6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBpZiBwaWQgPT0gQ0hJTEQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3Muc2V0c2lkKCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICMgb3MuZm9ya3B0eSgpIGFscmVhZHkgc2V0IHVzIHNlc3Npb24gbGVhZGVyCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gcGlkLCBmZAorCisgICAgbWFzdGVyX2ZkLCBzbGF2ZV9mZCA9IG9wZW5wdHkoKQorICAgIHBpZCA9IG9zLmZvcmsoKQorICAgIGlmIHBpZCA9PSBDSElMRDoKKyAgICAgICAgIyBFc3RhYmxpc2ggYSBuZXcgc2Vzc2lvbi4KKyAgICAgICAgb3Muc2V0c2lkKCkKKyAgICAgICAgb3MuY2xvc2UobWFzdGVyX2ZkKQorCisgICAgICAgICMgU2xhdmUgYmVjb21lcyBzdGRpbi9zdGRvdXQvc3RkZXJyIG9mIGNoaWxkLgorICAgICAgICBvcy5kdXAyKHNsYXZlX2ZkLCBTVERJTl9GSUxFTk8pCisgICAgICAgIG9zLmR1cDIoc2xhdmVfZmQsIFNURE9VVF9GSUxFTk8pCisgICAgICAgIG9zLmR1cDIoc2xhdmVfZmQsIFNUREVSUl9GSUxFTk8pCisgICAgICAgIGlmIChzbGF2ZV9mZCA+IFNUREVSUl9GSUxFTk8pOgorICAgICAgICAgICAgb3MuY2xvc2UgKHNsYXZlX2ZkKQorCisgICAgICAgICMgRXhwbGljaXRseSBvcGVuIHRoZSB0dHkgdG8gbWFrZSBpdCBiZWNvbWUgYSBjb250cm9sbGluZyB0dHkuCisgICAgICAgIHRtcF9mZCA9IG9zLm9wZW4ob3MudHR5bmFtZShTVERPVVRfRklMRU5PKSwgb3MuT19SRFdSKQorICAgICAgICBvcy5jbG9zZSh0bXBfZmQpCisgICAgZWxzZToKKyAgICAgICAgb3MuY2xvc2Uoc2xhdmVfZmQpCisKKyAgICAjIFBhcmVudCBhbmQgY2hpbGQgcHJvY2Vzcy4KKyAgICByZXR1cm4gcGlkLCBtYXN0ZXJfZmQKKworZGVmIF93cml0ZW4oZmQsIGRhdGEpOgorICAgICIiIldyaXRlIGFsbCB0aGUgZGF0YSB0byBhIGRlc2NyaXB0b3IuIiIiCisgICAgd2hpbGUgZGF0YSAhPSAnJzoKKyAgICAgICAgbiA9IG9zLndyaXRlKGZkLCBkYXRhKQorICAgICAgICBkYXRhID0gZGF0YVtuOl0KKworZGVmIF9yZWFkKGZkKToKKyAgICAiIiJEZWZhdWx0IHJlYWQgZnVuY3Rpb24uIiIiCisgICAgcmV0dXJuIG9zLnJlYWQoZmQsIDEwMjQpCisKK2RlZiBfY29weShtYXN0ZXJfZmQsIG1hc3Rlcl9yZWFkPV9yZWFkLCBzdGRpbl9yZWFkPV9yZWFkKToKKyAgICAiIiJQYXJlbnQgY29weSBsb29wLgorICAgIENvcGllcworICAgICAgICAgICAgcHR5IG1hc3RlciAtPiBzdGFuZGFyZCBvdXRwdXQgICAobWFzdGVyX3JlYWQpCisgICAgICAgICAgICBzdGFuZGFyZCBpbnB1dCAtPiBwdHkgbWFzdGVyICAgIChzdGRpbl9yZWFkKSIiIgorICAgIGZkcyA9IFttYXN0ZXJfZmQsIFNURElOX0ZJTEVOT10KKyAgICB3aGlsZSBUcnVlOgorICAgICAgICByZmRzLCB3ZmRzLCB4ZmRzID0gc2VsZWN0KGZkcywgW10sIFtdKQorICAgICAgICBpZiBtYXN0ZXJfZmQgaW4gcmZkczoKKyAgICAgICAgICAgIGRhdGEgPSBtYXN0ZXJfcmVhZChtYXN0ZXJfZmQpCisgICAgICAgICAgICBpZiBub3QgZGF0YTogICMgUmVhY2hlZCBFT0YuCisgICAgICAgICAgICAgICAgZmRzLnJlbW92ZShtYXN0ZXJfZmQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9zLndyaXRlKFNURE9VVF9GSUxFTk8sIGRhdGEpCisgICAgICAgIGlmIFNURElOX0ZJTEVOTyBpbiByZmRzOgorICAgICAgICAgICAgZGF0YSA9IHN0ZGluX3JlYWQoU1RESU5fRklMRU5PKQorICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgZmRzLnJlbW92ZShTVERJTl9GSUxFTk8pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIF93cml0ZW4obWFzdGVyX2ZkLCBkYXRhKQorCitkZWYgc3Bhd24oYXJndiwgbWFzdGVyX3JlYWQ9X3JlYWQsIHN0ZGluX3JlYWQ9X3JlYWQpOgorICAgICIiIkNyZWF0ZSBhIHNwYXduZWQgcHJvY2Vzcy4iIiIKKyAgICBpZiB0eXBlKGFyZ3YpID09IHR5cGUoJycpOgorICAgICAgICBhcmd2ID0gKGFyZ3YsKQorICAgIHBpZCwgbWFzdGVyX2ZkID0gZm9yaygpCisgICAgaWYgcGlkID09IENISUxEOgorICAgICAgICBvcy5leGVjbHAoYXJndlswXSwgKmFyZ3YpCisgICAgdHJ5OgorICAgICAgICBtb2RlID0gdHR5LnRjZ2V0YXR0cihTVERJTl9GSUxFTk8pCisgICAgICAgIHR0eS5zZXRyYXcoU1RESU5fRklMRU5PKQorICAgICAgICByZXN0b3JlID0gMQorICAgIGV4Y2VwdCB0dHkuZXJyb3I6ICAgICMgVGhpcyBpcyB0aGUgc2FtZSBhcyB0ZXJtaW9zLmVycm9yCisgICAgICAgIHJlc3RvcmUgPSAwCisgICAgdHJ5OgorICAgICAgICBfY29weShtYXN0ZXJfZmQsIG1hc3Rlcl9yZWFkLCBzdGRpbl9yZWFkKQorICAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcik6CisgICAgICAgIGlmIHJlc3RvcmU6CisgICAgICAgICAgICB0dHkudGNzZXRhdHRyKFNURElOX0ZJTEVOTywgdHR5LlRDU0FGTFVTSCwgbW9kZSkKKworICAgIG9zLmNsb3NlKG1hc3Rlcl9mZCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHR5LnB5YyBiL2xpYi9weXRob24yLjcvcHR5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc3MGNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wdHkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHR5LnB5byBiL2xpYi9weXRob24yLjcvcHR5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc3MGNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wdHkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHlfY29tcGlsZS5weSBiL2xpYi9weXRob24yLjcvcHlfY29tcGlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGJjMWU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9weV9jb21waWxlLnB5CkBAIC0wLDAgKzEsMTcwIEBACisiIiJSb3V0aW5lIHRvICJjb21waWxlIiBhIC5weSBmaWxlIHRvIGEgLnB5YyAob3IgLnB5bykgZmlsZS4KKworVGhpcyBtb2R1bGUgaGFzIGludGltYXRlIGtub3dsZWRnZSBvZiB0aGUgZm9ybWF0IG9mIC5weWMgZmlsZXMuCisiIiIKKworaW1wb3J0IF9fYnVpbHRpbl9fCitpbXBvcnQgaW1wCitpbXBvcnQgbWFyc2hhbAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdHJhY2ViYWNrCisKK01BR0lDID0gaW1wLmdldF9tYWdpYygpCisKK19fYWxsX18gPSBbImNvbXBpbGUiLCAibWFpbiIsICJQeUNvbXBpbGVFcnJvciJdCisKKworY2xhc3MgUHlDb21waWxlRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gcmFpc2VkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGF0dGVtcHRpbmcgdG8KKyAgICBjb21waWxlIHRoZSBmaWxlLgorCisgICAgVG8gcmFpc2UgdGhpcyBleGNlcHRpb24sIHVzZQorCisgICAgICAgIHJhaXNlIFB5Q29tcGlsZUVycm9yKGV4Y190eXBlLGV4Y192YWx1ZSxmaWxlWyxtc2ddKQorCisgICAgd2hlcmUKKworICAgICAgICBleGNfdHlwZTogICBleGNlcHRpb24gdHlwZSB0byBiZSB1c2VkIGluIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgdHlwZSBuYW1lIGNhbiBiZSBhY2Nlc3NlcyBhcyBjbGFzcyB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAnZXhjX3R5cGVfbmFtZScKKworICAgICAgICBleGNfdmFsdWU6ICBleGNlcHRpb24gdmFsdWUgdG8gYmUgdXNlZCBpbiBlcnJvciBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhY2Nlc3NlcyBhcyBjbGFzcyB2YXJpYWJsZSAnZXhjX3ZhbHVlJworCisgICAgICAgIGZpbGU6ICAgICAgIG5hbWUgb2YgZmlsZSBiZWluZyBjb21waWxlZCB0byBiZSB1c2VkIGluIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGFjY2Vzc2VzIGFzIGNsYXNzIHZhcmlhYmxlICdmaWxlJworCisgICAgICAgIG1zZzogICAgICAgIHN0cmluZyBtZXNzYWdlIHRvIGJlIHdyaXR0ZW4gYXMgZXJyb3IgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICBJZiBubyB2YWx1ZSBpcyBnaXZlbiwgYSBkZWZhdWx0IGV4Y2VwdGlvbiBtZXNzYWdlIHdpbGwgYmUgZ2l2ZW4sCisgICAgICAgICAgICAgICAgICAgIGNvbnNpc3RlbnQgd2l0aCAnc3RhbmRhcmQnIHB5X2NvbXBpbGUgb3V0cHV0LgorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIChvciBkZWZhdWx0KSBjYW4gYmUgYWNjZXNzZXMgYXMgY2xhc3MgdmFyaWFibGUgJ21zZycKKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIGZpbGUsIG1zZz0nJyk6CisgICAgICAgIGV4Y190eXBlX25hbWUgPSBleGNfdHlwZS5fX25hbWVfXworICAgICAgICBpZiBleGNfdHlwZSBpcyBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgIHRidGV4dCA9ICcnLmpvaW4odHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShleGNfdHlwZSwgZXhjX3ZhbHVlKSkKKyAgICAgICAgICAgIGVycm1zZyA9IHRidGV4dC5yZXBsYWNlKCdGaWxlICI8c3RyaW5nPiInLCAnRmlsZSAiJXMiJyAlIGZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlcnJtc2cgPSAiU29ycnk6ICVzOiAlcyIgJSAoZXhjX3R5cGVfbmFtZSxleGNfdmFsdWUpCisKKyAgICAgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsbXNnIG9yIGVycm1zZyxleGNfdHlwZV9uYW1lLGV4Y192YWx1ZSxmaWxlKQorCisgICAgICAgIHNlbGYuZXhjX3R5cGVfbmFtZSA9IGV4Y190eXBlX25hbWUKKyAgICAgICAgc2VsZi5leGNfdmFsdWUgPSBleGNfdmFsdWUKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICBzZWxmLm1zZyA9IG1zZyBvciBlcnJtc2cKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5tc2cKKworCitkZWYgd3JfbG9uZyhmLCB4KToKKyAgICAiIiJJbnRlcm5hbDsgd3JpdGUgYSAzMi1iaXQgaW50IHRvIGEgZmlsZSBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLiIiIgorICAgIGYud3JpdGUoY2hyKCB4ICAgICAgICAmIDB4ZmYpKQorICAgIGYud3JpdGUoY2hyKCh4ID4+IDgpICAmIDB4ZmYpKQorICAgIGYud3JpdGUoY2hyKCh4ID4+IDE2KSAmIDB4ZmYpKQorICAgIGYud3JpdGUoY2hyKCh4ID4+IDI0KSAmIDB4ZmYpKQorCitkZWYgY29tcGlsZShmaWxlLCBjZmlsZT1Ob25lLCBkZmlsZT1Ob25lLCBkb3JhaXNlPUZhbHNlKToKKyAgICAiIiJCeXRlLWNvbXBpbGUgb25lIFB5dGhvbiBzb3VyY2UgZmlsZSB0byBQeXRob24gYnl0ZWNvZGUuCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBmaWxlOiAgICBzb3VyY2UgZmlsZW5hbWUKKyAgICBjZmlsZTogICB0YXJnZXQgZmlsZW5hbWU7IGRlZmF1bHRzIHRvIHNvdXJjZSB3aXRoICdjJyBvciAnbycgYXBwZW5kZWQKKyAgICAgICAgICAgICAoJ2MnIG5vcm1hbGx5LCAnbycgaW4gb3B0aW1pemluZyBtb2RlLCBnaXZpbmcgLnB5YyBvciAucHlvKQorICAgIGRmaWxlOiAgIHB1cnBvcnRlZCBmaWxlbmFtZTsgZGVmYXVsdHMgdG8gc291cmNlICh0aGlzIGlzIHRoZSBmaWxlbmFtZQorICAgICAgICAgICAgIHRoYXQgd2lsbCBzaG93IHVwIGluIGVycm9yIG1lc3NhZ2VzKQorICAgIGRvcmFpc2U6IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBhbiBleGNlcHRpb24gc2hvdWxkIGJlCisgICAgICAgICAgICAgcmFpc2VkIHdoZW4gYSBjb21waWxlIGVycm9yIGlzIGZvdW5kLiBJZiBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICBvY2N1cnMgYW5kIHRoaXMgZmxhZyBpcyBzZXQgdG8gRmFsc2UsIGEgc3RyaW5nCisgICAgICAgICAgICAgaW5kaWNhdGluZyB0aGUgbmF0dXJlIG9mIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcmludGVkLAorICAgICAgICAgICAgIGFuZCB0aGUgZnVuY3Rpb24gd2lsbCByZXR1cm4gdG8gdGhlIGNhbGxlci4gSWYgYW4KKyAgICAgICAgICAgICBleGNlcHRpb24gb2NjdXJzIGFuZCB0aGlzIGZsYWcgaXMgc2V0IHRvIFRydWUsIGEKKyAgICAgICAgICAgICBQeUNvbXBpbGVFcnJvciBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuCisKKyAgICBOb3RlIHRoYXQgaXQgaXNuJ3QgbmVjZXNzYXJ5IHRvIGJ5dGUtY29tcGlsZSBQeXRob24gbW9kdWxlcyBmb3IKKyAgICBleGVjdXRpb24gZWZmaWNpZW5jeSAtLSBQeXRob24gaXRzZWxmIGJ5dGUtY29tcGlsZXMgYSBtb2R1bGUgd2hlbgorICAgIGl0IGlzIGxvYWRlZCwgYW5kIGlmIGl0IGNhbiwgd3JpdGVzIG91dCB0aGUgYnl0ZWNvZGUgdG8gdGhlCisgICAgY29ycmVzcG9uZGluZyAucHljIChvciAucHlvKSBmaWxlLgorCisgICAgSG93ZXZlciwgaWYgYSBQeXRob24gaW5zdGFsbGF0aW9uIGlzIHNoYXJlZCBiZXR3ZWVuIHVzZXJzLCBpdCBpcyBhCisgICAgZ29vZCBpZGVhIHRvIGJ5dGUtY29tcGlsZSBhbGwgbW9kdWxlcyB1cG9uIGluc3RhbGxhdGlvbiwgc2luY2UKKyAgICBvdGhlciB1c2VycyBtYXkgbm90IGJlIGFibGUgdG8gd3JpdGUgaW4gdGhlIHNvdXJjZSBkaXJlY3RvcmllcywKKyAgICBhbmQgdGh1cyB0aGV5IHdvbid0IGJlIGFibGUgdG8gd3JpdGUgdGhlIC5weWMvLnB5byBmaWxlLCBhbmQgdGhlbgorICAgIHRoZXkgd291bGQgYmUgYnl0ZS1jb21waWxpbmcgZXZlcnkgbW9kdWxlIGVhY2ggdGltZSBpdCBpcyBsb2FkZWQuCisgICAgVGhpcyBjYW4gc2xvdyBkb3duIHByb2dyYW0gc3RhcnQtdXAgY29uc2lkZXJhYmx5LgorCisgICAgU2VlIGNvbXBpbGVhbGwucHkgZm9yIGEgc2NyaXB0L21vZHVsZSB0aGF0IHVzZXMgdGhpcyBtb2R1bGUgdG8KKyAgICBieXRlLWNvbXBpbGUgYWxsIGluc3RhbGxlZCBmaWxlcyAob3IgYWxsIGZpbGVzIGluIHNlbGVjdGVkCisgICAgZGlyZWN0b3JpZXMpLgorCisgICAgIiIiCisgICAgd2l0aCBvcGVuKGZpbGUsICdVJykgYXMgZjoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGltZXN0YW1wID0gbG9uZyhvcy5mc3RhdChmLmZpbGVubygpKS5zdF9tdGltZSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgdGltZXN0YW1wID0gbG9uZyhvcy5zdGF0KGZpbGUpLnN0X210aW1lKQorICAgICAgICBjb2Rlc3RyaW5nID0gZi5yZWFkKCkKKyAgICB0cnk6CisgICAgICAgIGNvZGVvYmplY3QgPSBfX2J1aWx0aW5fXy5jb21waWxlKGNvZGVzdHJpbmcsIGRmaWxlIG9yIGZpbGUsJ2V4ZWMnKQorICAgIGV4Y2VwdCBFeGNlcHRpb24sZXJyOgorICAgICAgICBweV9leGMgPSBQeUNvbXBpbGVFcnJvcihlcnIuX19jbGFzc19fLCBlcnIsIGRmaWxlIG9yIGZpbGUpCisgICAgICAgIGlmIGRvcmFpc2U6CisgICAgICAgICAgICByYWlzZSBweV9leGMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUocHlfZXhjLm1zZyArICdcbicpCisgICAgICAgICAgICByZXR1cm4KKyAgICBpZiBjZmlsZSBpcyBOb25lOgorICAgICAgICBjZmlsZSA9IGZpbGUgKyAoX19kZWJ1Z19fIGFuZCAnYycgb3IgJ28nKQorICAgIHdpdGggb3BlbihjZmlsZSwgJ3diJykgYXMgZmM6CisgICAgICAgIGZjLndyaXRlKCdcMFwwXDBcMCcpCisgICAgICAgIHdyX2xvbmcoZmMsIHRpbWVzdGFtcCkKKyAgICAgICAgbWFyc2hhbC5kdW1wKGNvZGVvYmplY3QsIGZjKQorICAgICAgICBmYy5mbHVzaCgpCisgICAgICAgIGZjLnNlZWsoMCwgMCkKKyAgICAgICAgZmMud3JpdGUoTUFHSUMpCisKK2RlZiBtYWluKGFyZ3M9Tm9uZSk6CisgICAgIiIiQ29tcGlsZSBzZXZlcmFsIHNvdXJjZSBmaWxlcy4KKworICAgIFRoZSBmaWxlcyBuYW1lZCBpbiAnYXJncycgKG9yIG9uIHRoZSBjb21tYW5kIGxpbmUsIGlmICdhcmdzJyBpcworICAgIG5vdCBzcGVjaWZpZWQpIGFyZSBjb21waWxlZCBhbmQgdGhlIHJlc3VsdGluZyBieXRlY29kZSBpcyBjYWNoZWQKKyAgICBpbiB0aGUgbm9ybWFsIG1hbm5lci4gIFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc2VhcmNoIGEgZGlyZWN0b3J5CisgICAgc3RydWN0dXJlIHRvIGxvY2F0ZSBzb3VyY2UgZmlsZXM7IGl0IG9ubHkgY29tcGlsZXMgZmlsZXMgbmFtZWQKKyAgICBleHBsaWNpdGx5LiAgSWYgJy0nIGlzIHRoZSBvbmx5IHBhcmFtZXRlciBpbiBhcmdzLCB0aGUgbGlzdCBvZgorICAgIGZpbGVzIGlzIHRha2VuIGZyb20gc3RhbmRhcmQgaW5wdXQuCisKKyAgICAiIiIKKyAgICBpZiBhcmdzIGlzIE5vbmU6CisgICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKyAgICBydiA9IDAKKyAgICBpZiBhcmdzID09IFsnLSddOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnJzdHJpcCgnXG4nKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbXBpbGUoZmlsZW5hbWUsIGRvcmFpc2U9VHJ1ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBQeUNvbXBpbGVFcnJvciBhcyBlcnJvcjoKKyAgICAgICAgICAgICAgICBydiA9IDEKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIlc1xuIiAlIGVycm9yLm1zZykKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGVycm9yOgorICAgICAgICAgICAgICAgIHJ2ID0gMQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIiVzXG4iICUgZXJyb3IpCisgICAgZWxzZToKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3M6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29tcGlsZShmaWxlbmFtZSwgZG9yYWlzZT1UcnVlKQorICAgICAgICAgICAgZXhjZXB0IFB5Q29tcGlsZUVycm9yIGFzIGVycm9yOgorICAgICAgICAgICAgICAgICMgcmV0dXJuIHZhbHVlIHRvIGluZGljYXRlIGF0IGxlYXN0IG9uZSBmYWlsdXJlCisgICAgICAgICAgICAgICAgcnYgPSAxCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShlcnJvci5tc2cpCisgICAgcmV0dXJuIHJ2CisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9weV9jb21waWxlLnB5YyBiL2xpYi9weXRob24yLjcvcHlfY29tcGlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyMGVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHlfY29tcGlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9weV9jb21waWxlLnB5byBiL2xpYi9weXRob24yLjcvcHlfY29tcGlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgyMGVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHlfY29tcGlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9weWNsYnIucHkgYi9saWIvcHl0aG9uMi43L3B5Y2xici5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGY3MWFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9weWNsYnIucHkKQEAgLTAsMCArMSwzNDQgQEAKKyIiIlBhcnNlIGEgUHl0aG9uIG1vZHVsZSBhbmQgZGVzY3JpYmUgaXRzIGNsYXNzZXMgYW5kIG1ldGhvZHMuCisKK1BhcnNlIGVub3VnaCBvZiBhIFB5dGhvbiBmaWxlIHRvIHJlY29nbml6ZSBpbXBvcnRzIGFuZCBjbGFzcyBhbmQKK21ldGhvZCBkZWZpbml0aW9ucywgYW5kIHRvIGZpbmQgb3V0IHRoZSBzdXBlcmNsYXNzZXMgb2YgYSBjbGFzcy4KKworVGhlIGludGVyZmFjZSBjb25zaXN0cyBvZiBhIHNpbmdsZSBmdW5jdGlvbjoKKyAgICAgICAgcmVhZG1vZHVsZV9leChtb2R1bGUgWywgcGF0aF0pCit3aGVyZSBtb2R1bGUgaXMgdGhlIG5hbWUgb2YgYSBQeXRob24gbW9kdWxlLCBhbmQgcGF0aCBpcyBhbiBvcHRpb25hbAorbGlzdCBvZiBkaXJlY3RvcmllcyB3aGVyZSB0aGUgbW9kdWxlIGlzIHRvIGJlIHNlYXJjaGVkLiAgSWYgcHJlc2VudCwKK3BhdGggaXMgcHJlcGVuZGVkIHRvIHRoZSBzeXN0ZW0gc2VhcmNoIHBhdGggc3lzLnBhdGguICBUaGUgcmV0dXJuCit2YWx1ZSBpcyBhIGRpY3Rpb25hcnkuICBUaGUga2V5cyBvZiB0aGUgZGljdGlvbmFyeSBhcmUgdGhlIG5hbWVzIG9mCit0aGUgY2xhc3NlcyBkZWZpbmVkIGluIHRoZSBtb2R1bGUgKGluY2x1ZGluZyBjbGFzc2VzIHRoYXQgYXJlIGRlZmluZWQKK3ZpYSB0aGUgZnJvbSBYWFggaW1wb3J0IFlZWSBjb25zdHJ1Y3QpLiAgVGhlIHZhbHVlcyBhcmUgY2xhc3MKK2luc3RhbmNlcyBvZiB0aGUgY2xhc3MgQ2xhc3MgZGVmaW5lZCBoZXJlLiAgT25lIHNwZWNpYWwga2V5L3ZhbHVlIHBhaXIKK2lzIHByZXNlbnQgZm9yIHBhY2thZ2VzOiB0aGUga2V5ICdfX3BhdGhfXycgaGFzIGEgbGlzdCBhcyBpdHMgdmFsdWUKK3doaWNoIGNvbnRhaW5zIHRoZSBwYWNrYWdlIHNlYXJjaCBwYXRoLgorCitBIGNsYXNzIGlzIGRlc2NyaWJlZCBieSB0aGUgY2xhc3MgQ2xhc3MgaW4gdGhpcyBtb2R1bGUuICBJbnN0YW5jZXMKK29mIHRoaXMgY2xhc3MgaGF2ZSB0aGUgZm9sbG93aW5nIGluc3RhbmNlIHZhcmlhYmxlczoKKyAgICAgICAgbW9kdWxlIC0tIHRoZSBtb2R1bGUgbmFtZQorICAgICAgICBuYW1lIC0tIHRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAgICBzdXBlciAtLSBhIGxpc3Qgb2Ygc3VwZXIgY2xhc3NlcyAoQ2xhc3MgaW5zdGFuY2VzKQorICAgICAgICBtZXRob2RzIC0tIGEgZGljdGlvbmFyeSBvZiBtZXRob2RzCisgICAgICAgIGZpbGUgLS0gdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyBkZWZpbmVkCisgICAgICAgIGxpbmVubyAtLSB0aGUgbGluZSBpbiB0aGUgZmlsZSBvbiB3aGljaCB0aGUgY2xhc3Mgc3RhdGVtZW50IG9jY3VycmVkCitUaGUgZGljdGlvbmFyeSBvZiBtZXRob2RzIHVzZXMgdGhlIG1ldGhvZCBuYW1lcyBhcyBrZXlzIGFuZCB0aGUgbGluZQorbnVtYmVycyBvbiB3aGljaCB0aGUgbWV0aG9kIHdhcyBkZWZpbmVkIGFzIHZhbHVlcy4KK0lmIHRoZSBuYW1lIG9mIGEgc3VwZXIgY2xhc3MgaXMgbm90IHJlY29nbml6ZWQsIHRoZSBjb3JyZXNwb25kaW5nCitlbnRyeSBpbiB0aGUgbGlzdCBvZiBzdXBlciBjbGFzc2VzIGlzIG5vdCBhIGNsYXNzIGluc3RhbmNlIGJ1dCBhCitzdHJpbmcgZ2l2aW5nIHRoZSBuYW1lIG9mIHRoZSBzdXBlciBjbGFzcy4gIFNpbmNlIGltcG9ydCBzdGF0ZW1lbnRzCithcmUgcmVjb2duaXplZCBhbmQgaW1wb3J0ZWQgbW9kdWxlcyBhcmUgc2Nhbm5lZCBhcyB3ZWxsLCB0aGlzCitzaG91bGRuJ3QgaGFwcGVuIG9mdGVuLgorCitBIGZ1bmN0aW9uIGlzIGRlc2NyaWJlZCBieSB0aGUgY2xhc3MgRnVuY3Rpb24gaW4gdGhpcyBtb2R1bGUuCitJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBoYXZlIHRoZSBmb2xsb3dpbmcgaW5zdGFuY2UgdmFyaWFibGVzOgorICAgICAgICBtb2R1bGUgLS0gdGhlIG1vZHVsZSBuYW1lCisgICAgICAgIG5hbWUgLS0gdGhlIG5hbWUgb2YgdGhlIGNsYXNzCisgICAgICAgIGZpbGUgLS0gdGhlIGZpbGUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyBkZWZpbmVkCisgICAgICAgIGxpbmVubyAtLSB0aGUgbGluZSBpbiB0aGUgZmlsZSBvbiB3aGljaCB0aGUgY2xhc3Mgc3RhdGVtZW50IG9jY3VycmVkCisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IGltcAoraW1wb3J0IHRva2VuaXplCitmcm9tIHRva2VuIGltcG9ydCBOQU1FLCBERURFTlQsIE9QCitmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyCisKK19fYWxsX18gPSBbInJlYWRtb2R1bGUiLCAicmVhZG1vZHVsZV9leCIsICJDbGFzcyIsICJGdW5jdGlvbiJdCisKK19tb2R1bGVzID0ge30gICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNhY2hlIG9mIG1vZHVsZXMgd2UndmUgc2VlbgorCisjIGVhY2ggUHl0aG9uIGNsYXNzIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKK2NsYXNzIENsYXNzOgorICAgICcnJ0NsYXNzIHRvIHJlcHJlc2VudCBhIFB5dGhvbiBjbGFzcy4nJycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlLCBuYW1lLCBzdXBlciwgZmlsZSwgbGluZW5vKToKKyAgICAgICAgc2VsZi5tb2R1bGUgPSBtb2R1bGUKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBpZiBzdXBlciBpcyBOb25lOgorICAgICAgICAgICAgc3VwZXIgPSBbXQorICAgICAgICBzZWxmLnN1cGVyID0gc3VwZXIKKyAgICAgICAgc2VsZi5tZXRob2RzID0ge30KKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIF9hZGRtZXRob2Qoc2VsZiwgbmFtZSwgbGluZW5vKToKKyAgICAgICAgc2VsZi5tZXRob2RzW25hbWVdID0gbGluZW5vCisKK2NsYXNzIEZ1bmN0aW9uOgorICAgICcnJ0NsYXNzIHRvIHJlcHJlc2VudCBhIHRvcC1sZXZlbCBQeXRob24gZnVuY3Rpb24nJycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlLCBuYW1lLCBmaWxlLCBsaW5lbm8pOgorICAgICAgICBzZWxmLm1vZHVsZSA9IG1vZHVsZQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworZGVmIHJlYWRtb2R1bGUobW9kdWxlLCBwYXRoPU5vbmUpOgorICAgICcnJ0JhY2t3YXJkcyBjb21wYXRpYmxlIGludGVyZmFjZS4KKworICAgIENhbGwgcmVhZG1vZHVsZV9leCgpIGFuZCB0aGVuIG9ubHkga2VlcCBDbGFzcyBvYmplY3RzIGZyb20gdGhlCisgICAgcmVzdWx0aW5nIGRpY3Rpb25hcnkuJycnCisKKyAgICByZXMgPSB7fQorICAgIGZvciBrZXksIHZhbHVlIGluIF9yZWFkbW9kdWxlKG1vZHVsZSwgcGF0aCBvciBbXSkuaXRlbXMoKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgQ2xhc3MpOgorICAgICAgICAgICAgcmVzW2tleV0gPSB2YWx1ZQorICAgIHJldHVybiByZXMKKworZGVmIHJlYWRtb2R1bGVfZXgobW9kdWxlLCBwYXRoPU5vbmUpOgorICAgICcnJ1JlYWQgYSBtb2R1bGUgZmlsZSBhbmQgcmV0dXJuIGEgZGljdGlvbmFyeSBvZiBjbGFzc2VzLgorCisgICAgU2VhcmNoIGZvciBNT0RVTEUgaW4gUEFUSCBhbmQgc3lzLnBhdGgsIHJlYWQgYW5kIHBhcnNlIHRoZQorICAgIG1vZHVsZSBhbmQgcmV0dXJuIGEgZGljdGlvbmFyeSB3aXRoIG9uZSBlbnRyeSBmb3IgZWFjaCBjbGFzcworICAgIGZvdW5kIGluIHRoZSBtb2R1bGUuCisgICAgJycnCisgICAgcmV0dXJuIF9yZWFkbW9kdWxlKG1vZHVsZSwgcGF0aCBvciBbXSkKKworZGVmIF9yZWFkbW9kdWxlKG1vZHVsZSwgcGF0aCwgaW5wYWNrYWdlPU5vbmUpOgorICAgICcnJ0RvIHRoZSBoYXJkIHdvcmsgZm9yIHJlYWRtb2R1bGVbX2V4XS4KKworICAgIElmIElOUEFDS0FHRSBpcyBnaXZlbiwgaXQgbXVzdCBiZSB0aGUgZG90dGVkIG5hbWUgb2YgdGhlIHBhY2thZ2UgaW4KKyAgICB3aGljaCB3ZSBhcmUgc2VhcmNoaW5nIGZvciBhIHN1Ym1vZHVsZSwgYW5kIHRoZW4gUEFUSCBtdXN0IGJlIHRoZQorICAgIHBhY2thZ2Ugc2VhcmNoIHBhdGg7IG90aGVyd2lzZSwgd2UgYXJlIHNlYXJjaGluZyBmb3IgYSB0b3AtbGV2ZWwKKyAgICBtb2R1bGUsIGFuZCBQQVRIIGlzIGNvbWJpbmVkIHdpdGggc3lzLnBhdGguCisgICAgJycnCisgICAgIyBDb21wdXRlIHRoZSBmdWxsIG1vZHVsZSBuYW1lIChwcmVwZW5kaW5nIGlucGFja2FnZSBpZiBzZXQpCisgICAgaWYgaW5wYWNrYWdlIGlzIG5vdCBOb25lOgorICAgICAgICBmdWxsbW9kdWxlID0gIiVzLiVzIiAlIChpbnBhY2thZ2UsIG1vZHVsZSkKKyAgICBlbHNlOgorICAgICAgICBmdWxsbW9kdWxlID0gbW9kdWxlCisKKyAgICAjIENoZWNrIGluIHRoZSBjYWNoZQorICAgIGlmIGZ1bGxtb2R1bGUgaW4gX21vZHVsZXM6CisgICAgICAgIHJldHVybiBfbW9kdWxlc1tmdWxsbW9kdWxlXQorCisgICAgIyBJbml0aWFsaXplIHRoZSBkaWN0IGZvciB0aGlzIG1vZHVsZSdzIGNvbnRlbnRzCisgICAgZGljdCA9IHt9CisKKyAgICAjIENoZWNrIGlmIGl0IGlzIGEgYnVpbHQtaW4gbW9kdWxlOyB3ZSBkb24ndCBkbyBtdWNoIGZvciB0aGVzZQorICAgIGlmIG1vZHVsZSBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMgYW5kIGlucGFja2FnZSBpcyBOb25lOgorICAgICAgICBfbW9kdWxlc1ttb2R1bGVdID0gZGljdAorICAgICAgICByZXR1cm4gZGljdAorCisgICAgIyBDaGVjayBmb3IgYSBkb3R0ZWQgbW9kdWxlIG5hbWUKKyAgICBpID0gbW9kdWxlLnJmaW5kKCcuJykKKyAgICBpZiBpID49IDA6CisgICAgICAgIHBhY2thZ2UgPSBtb2R1bGVbOmldCisgICAgICAgIHN1Ym1vZHVsZSA9IG1vZHVsZVtpKzE6XQorICAgICAgICBwYXJlbnQgPSBfcmVhZG1vZHVsZShwYWNrYWdlLCBwYXRoLCBpbnBhY2thZ2UpCisgICAgICAgIGlmIGlucGFja2FnZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBhY2thZ2UgPSAiJXMuJXMiICUgKGlucGFja2FnZSwgcGFja2FnZSkKKyAgICAgICAgaWYgbm90ICdfX3BhdGhfXycgaW4gcGFyZW50OgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoJ05vIHBhY2thZ2UgbmFtZWQge30nLmZvcm1hdChwYWNrYWdlKSkKKyAgICAgICAgcmV0dXJuIF9yZWFkbW9kdWxlKHN1Ym1vZHVsZSwgcGFyZW50WydfX3BhdGhfXyddLCBwYWNrYWdlKQorCisgICAgIyBTZWFyY2ggdGhlIHBhdGggZm9yIHRoZSBtb2R1bGUKKyAgICBmID0gTm9uZQorICAgIGlmIGlucGFja2FnZSBpcyBub3QgTm9uZToKKyAgICAgICAgZiwgZm5hbWUsIChfcywgX20sIHR5KSA9IGltcC5maW5kX21vZHVsZShtb2R1bGUsIHBhdGgpCisgICAgZWxzZToKKyAgICAgICAgZiwgZm5hbWUsIChfcywgX20sIHR5KSA9IGltcC5maW5kX21vZHVsZShtb2R1bGUsIHBhdGggKyBzeXMucGF0aCkKKyAgICBpZiB0eSA9PSBpbXAuUEtHX0RJUkVDVE9SWToKKyAgICAgICAgZGljdFsnX19wYXRoX18nXSA9IFtmbmFtZV0KKyAgICAgICAgcGF0aCA9IFtmbmFtZV0gKyBwYXRoCisgICAgICAgIGYsIGZuYW1lLCAoX3MsIF9tLCB0eSkgPSBpbXAuZmluZF9tb2R1bGUoJ19faW5pdF9fJywgW2ZuYW1lXSkKKyAgICBfbW9kdWxlc1tmdWxsbW9kdWxlXSA9IGRpY3QKKyAgICBpZiB0eSAhPSBpbXAuUFlfU09VUkNFOgorICAgICAgICAjIG5vdCBQeXRob24gc291cmNlLCBjYW4ndCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgbW9kdWxlCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gZGljdAorCisgICAgc3RhY2sgPSBbXSAjIHN0YWNrIG9mIChjbGFzcywgaW5kZW50KSBwYWlycworCisgICAgZyA9IHRva2VuaXplLmdlbmVyYXRlX3Rva2VucyhmLnJlYWRsaW5lKQorICAgIHRyeToKKyAgICAgICAgZm9yIHRva2VudHlwZSwgdG9rZW4sIHN0YXJ0LCBfZW5kLCBfbGluZSBpbiBnOgorICAgICAgICAgICAgaWYgdG9rZW50eXBlID09IERFREVOVDoKKyAgICAgICAgICAgICAgICBsaW5lbm8sIHRoaXNpbmRlbnQgPSBzdGFydAorICAgICAgICAgICAgICAgICMgY2xvc2UgbmVzdGVkIGNsYXNzZXMgYW5kIGRlZnMKKyAgICAgICAgICAgICAgICB3aGlsZSBzdGFjayBhbmQgc3RhY2tbLTFdWzFdID49IHRoaXNpbmRlbnQ6CisgICAgICAgICAgICAgICAgICAgIGRlbCBzdGFja1stMV0KKyAgICAgICAgICAgIGVsaWYgdG9rZW4gPT0gJ2RlZic6CisgICAgICAgICAgICAgICAgbGluZW5vLCB0aGlzaW5kZW50ID0gc3RhcnQKKyAgICAgICAgICAgICAgICAjIGNsb3NlIHByZXZpb3VzIG5lc3RlZCBjbGFzc2VzIGFuZCBkZWZzCisgICAgICAgICAgICAgICAgd2hpbGUgc3RhY2sgYW5kIHN0YWNrWy0xXVsxXSA+PSB0aGlzaW5kZW50OgorICAgICAgICAgICAgICAgICAgICBkZWwgc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgdG9rZW50eXBlLCBtZXRoX25hbWUsIHN0YXJ0ID0gZy5uZXh0KClbMDozXQorICAgICAgICAgICAgICAgIGlmIHRva2VudHlwZSAhPSBOQU1FOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAjIFN5bnRheCBlcnJvcgorICAgICAgICAgICAgICAgIGlmIHN0YWNrOgorICAgICAgICAgICAgICAgICAgICBjdXJfY2xhc3MgPSBzdGFja1stMV1bMF0KKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjdXJfY2xhc3MsIENsYXNzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaXQncyBhIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2NsYXNzLl9hZGRtZXRob2QobWV0aF9uYW1lLCBsaW5lbm8pCisgICAgICAgICAgICAgICAgICAgICMgZWxzZSBpdCdzIGEgbmVzdGVkIGRlZgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgaXQncyBhIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgIGRpY3RbbWV0aF9uYW1lXSA9IEZ1bmN0aW9uKGZ1bGxtb2R1bGUsIG1ldGhfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWUsIGxpbmVubykKKyAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQoKE5vbmUsIHRoaXNpbmRlbnQpKSAjIE1hcmtlciBmb3IgbmVzdGVkIGZucworICAgICAgICAgICAgZWxpZiB0b2tlbiA9PSAnY2xhc3MnOgorICAgICAgICAgICAgICAgIGxpbmVubywgdGhpc2luZGVudCA9IHN0YXJ0CisgICAgICAgICAgICAgICAgIyBjbG9zZSBwcmV2aW91cyBuZXN0ZWQgY2xhc3NlcyBhbmQgZGVmcworICAgICAgICAgICAgICAgIHdoaWxlIHN0YWNrIGFuZCBzdGFja1stMV1bMV0gPj0gdGhpc2luZGVudDoKKyAgICAgICAgICAgICAgICAgICAgZGVsIHN0YWNrWy0xXQorICAgICAgICAgICAgICAgIHRva2VudHlwZSwgY2xhc3NfbmFtZSwgc3RhcnQgPSBnLm5leHQoKVswOjNdCisgICAgICAgICAgICAgICAgaWYgdG9rZW50eXBlICE9IE5BTUU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICMgU3ludGF4IGVycm9yCisgICAgICAgICAgICAgICAgIyBwYXJzZSB3aGF0IGZvbGxvd3MgdGhlIGNsYXNzIG5hbWUKKyAgICAgICAgICAgICAgICB0b2tlbnR5cGUsIHRva2VuLCBzdGFydCA9IGcubmV4dCgpWzA6M10KKyAgICAgICAgICAgICAgICBpbmhlcml0ID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIHRva2VuID09ICcoJzoKKyAgICAgICAgICAgICAgICAgICAgbmFtZXMgPSBbXSAjIExpc3Qgb2Ygc3VwZXJjbGFzc2VzCisgICAgICAgICAgICAgICAgICAgICMgdGhlcmUncyBhIGxpc3Qgb2Ygc3VwZXJjbGFzc2VzCisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gMQorICAgICAgICAgICAgICAgICAgICBzdXBlciA9IFtdICMgVG9rZW5zIG1ha2luZyB1cCBjdXJyZW50IHN1cGVyY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VudHlwZSwgdG9rZW4sIHN0YXJ0ID0gZy5uZXh0KClbMDozXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW4gaW4gKCcpJywgJywnKSBhbmQgbGV2ZWwgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gIiIuam9pbihzdXBlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuIGluIGRpY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2Uga25vdyB0aGlzIHN1cGVyIGNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBkaWN0W25dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IG4uc3BsaXQoJy4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4oYykgPiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdXBlciBjbGFzcyBpcyBvZiB0aGUgZm9ybQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtb2R1bGUuY2xhc3M6IGxvb2sgaW4gbW9kdWxlIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGNbLTJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gY1stMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG0gaW4gX21vZHVsZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IF9tb2R1bGVzW21dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYyBpbiBkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZFtjXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFwcGVuZChuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyID0gW10KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRva2VuID09ICcoJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHRva2VuID09ICcpJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCAtPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGV2ZWwgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgdG9rZW4gPT0gJywnIGFuZCBsZXZlbCA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSB1c2UgTkFNRSBhbmQgT1AgKD09IGRvdCkgdG9rZW5zIGZvciB0eXBlIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgdG9rZW50eXBlIGluIChOQU1FLCBPUCkgYW5kIGxldmVsID09IDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuYXBwZW5kKHRva2VuKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBleHByZXNzaW9ucyBpbiB0aGUgYmFzZSBsaXN0IGFyZSBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgIGluaGVyaXQgPSBuYW1lcworICAgICAgICAgICAgICAgIGN1cl9jbGFzcyA9IENsYXNzKGZ1bGxtb2R1bGUsIGNsYXNzX25hbWUsIGluaGVyaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWUsIGxpbmVubykKKyAgICAgICAgICAgICAgICBpZiBub3Qgc3RhY2s6CisgICAgICAgICAgICAgICAgICAgIGRpY3RbY2xhc3NfbmFtZV0gPSBjdXJfY2xhc3MKKyAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQoKGN1cl9jbGFzcywgdGhpc2luZGVudCkpCisgICAgICAgICAgICBlbGlmIHRva2VuID09ICdpbXBvcnQnIGFuZCBzdGFydFsxXSA9PSAwOgorICAgICAgICAgICAgICAgIG1vZHVsZXMgPSBfZ2V0bmFtZWxpc3QoZykKKyAgICAgICAgICAgICAgICBmb3IgbW9kLCBfbW9kMiBpbiBtb2R1bGVzOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFJlY3Vyc2l2ZWx5IHJlYWQgdGhlIGltcG9ydGVkIG1vZHVsZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW5wYWNrYWdlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JlYWRtb2R1bGUobW9kLCBwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZWFkbW9kdWxlKG1vZCwgcGF0aCwgaW5wYWNrYWdlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JlYWRtb2R1bGUobW9kLCBbXSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgIyBJZiB3ZSBjYW4ndCBmaW5kIG9yIHBhcnNlIHRoZSBpbXBvcnRlZCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAjIHRvbyBiYWQgLS0gZG9uJ3QgZGllIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIHRva2VuID09ICdmcm9tJyBhbmQgc3RhcnRbMV0gPT0gMDoKKyAgICAgICAgICAgICAgICBtb2QsIHRva2VuID0gX2dldG5hbWUoZykKKyAgICAgICAgICAgICAgICBpZiBub3QgbW9kIG9yIHRva2VuICE9ICJpbXBvcnQiOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIG5hbWVzID0gX2dldG5hbWVsaXN0KGcpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAjIFJlY3Vyc2l2ZWx5IHJlYWQgdGhlIGltcG9ydGVkIG1vZHVsZQorICAgICAgICAgICAgICAgICAgICBkID0gX3JlYWRtb2R1bGUobW9kLCBwYXRoLCBpbnBhY2thZ2UpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAjIElmIHdlIGNhbid0IGZpbmQgb3IgcGFyc2UgdGhlIGltcG9ydGVkIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgIyB0b28gYmFkIC0tIGRvbid0IGRpZSBoZXJlLgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICMgYWRkIGFueSBjbGFzc2VzIHRoYXQgd2VyZSBkZWZpbmVkIGluIHRoZSBpbXBvcnRlZCBtb2R1bGUKKyAgICAgICAgICAgICAgICAjIHRvIG91ciBuYW1lIHNwYWNlIGlmIHRoZXkgd2VyZSBtZW50aW9uZWQgaW4gdGhlIGxpc3QKKyAgICAgICAgICAgICAgICBmb3IgbiwgbjIgaW4gbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIG4gaW4gZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RbbjIgb3Igbl0gPSBkW25dCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbiA9PSAnKic6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGRvbid0IGFkZCBuYW1lcyB0aGF0IHN0YXJ0IHdpdGggXworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG4gaW4gZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuWzBdICE9ICdfJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdFtuXSA9IGRbbl0KKyAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgcGFzcworCisgICAgZi5jbG9zZSgpCisgICAgcmV0dXJuIGRpY3QKKworZGVmIF9nZXRuYW1lbGlzdChnKToKKyAgICAjIEhlbHBlciB0byBnZXQgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBkb3R0ZWQgbmFtZXMgcGx1cyAnYXMnCisgICAgIyBjbGF1c2VzLiAgUmV0dXJuIGEgbGlzdCBvZiBwYWlycyAobmFtZSwgbmFtZTIpIHdoZXJlIG5hbWUyIGlzCisgICAgIyB0aGUgJ2FzJyBuYW1lLCBvciBOb25lIGlmIHRoZXJlIGlzIG5vICdhcycgY2xhdXNlLgorICAgIG5hbWVzID0gW10KKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBuYW1lLCB0b2tlbiA9IF9nZXRuYW1lKGcpCisgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgdG9rZW4gPT0gJ2FzJzoKKyAgICAgICAgICAgIG5hbWUyLCB0b2tlbiA9IF9nZXRuYW1lKGcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lMiA9IE5vbmUKKyAgICAgICAgbmFtZXMuYXBwZW5kKChuYW1lLCBuYW1lMikpCisgICAgICAgIHdoaWxlIHRva2VuICE9ICIsIiBhbmQgIlxuIiBub3QgaW4gdG9rZW46CisgICAgICAgICAgICB0b2tlbiA9IGcubmV4dCgpWzFdCisgICAgICAgIGlmIHRva2VuICE9ICIsIjoKKyAgICAgICAgICAgIGJyZWFrCisgICAgcmV0dXJuIG5hbWVzCisKK2RlZiBfZ2V0bmFtZShnKToKKyAgICAjIEhlbHBlciB0byBnZXQgYSBkb3R0ZWQgbmFtZSwgcmV0dXJuIGEgcGFpciAobmFtZSwgdG9rZW4pIHdoZXJlCisgICAgIyBuYW1lIGlzIHRoZSBkb3R0ZWQgbmFtZSwgb3IgTm9uZSBpZiB0aGVyZSB3YXMgbm8gZG90dGVkIG5hbWUsCisgICAgIyBhbmQgdG9rZW4gaXMgdGhlIG5leHQgaW5wdXQgdG9rZW4uCisgICAgcGFydHMgPSBbXQorICAgIHRva2VudHlwZSwgdG9rZW4gPSBnLm5leHQoKVswOjJdCisgICAgaWYgdG9rZW50eXBlICE9IE5BTUUgYW5kIHRva2VuICE9ICcqJzoKKyAgICAgICAgcmV0dXJuIChOb25lLCB0b2tlbikKKyAgICBwYXJ0cy5hcHBlbmQodG9rZW4pCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdG9rZW50eXBlLCB0b2tlbiA9IGcubmV4dCgpWzA6Ml0KKyAgICAgICAgaWYgdG9rZW4gIT0gJy4nOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgdG9rZW50eXBlLCB0b2tlbiA9IGcubmV4dCgpWzA6Ml0KKyAgICAgICAgaWYgdG9rZW50eXBlICE9IE5BTUU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBwYXJ0cy5hcHBlbmQodG9rZW4pCisgICAgcmV0dXJuICgiLiIuam9pbihwYXJ0cyksIHRva2VuKQorCitkZWYgX21haW4oKToKKyAgICAjIE1haW4gcHJvZ3JhbSBmb3IgdGVzdGluZy4KKyAgICBpbXBvcnQgb3MKKyAgICBtb2QgPSBzeXMuYXJndlsxXQorICAgIGlmIG9zLnBhdGguZXhpc3RzKG1vZCk6CisgICAgICAgIHBhdGggPSBbb3MucGF0aC5kaXJuYW1lKG1vZCldCisgICAgICAgIG1vZCA9IG9zLnBhdGguYmFzZW5hbWUobW9kKQorICAgICAgICBpZiBtb2QubG93ZXIoKS5lbmRzd2l0aCgiLnB5Iik6CisgICAgICAgICAgICBtb2QgPSBtb2RbOi0zXQorICAgIGVsc2U6CisgICAgICAgIHBhdGggPSBbXQorICAgIGRpY3QgPSByZWFkbW9kdWxlX2V4KG1vZCwgcGF0aCkKKyAgICBvYmpzID0gZGljdC52YWx1ZXMoKQorICAgIG9ianMuc29ydChsYW1iZGEgYSwgYjogY21wKGdldGF0dHIoYSwgJ2xpbmVubycsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoYiwgJ2xpbmVubycsIDApKSkKKyAgICBmb3Igb2JqIGluIG9ianM6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBDbGFzcyk6CisgICAgICAgICAgICBwcmludCAiY2xhc3MiLCBvYmoubmFtZSwgb2JqLnN1cGVyLCBvYmoubGluZW5vCisgICAgICAgICAgICBtZXRob2RzID0gc29ydGVkKG9iai5tZXRob2RzLml0ZXJpdGVtcygpLCBrZXk9aXRlbWdldHRlcigxKSkKKyAgICAgICAgICAgIGZvciBuYW1lLCBsaW5lbm8gaW4gbWV0aG9kczoKKyAgICAgICAgICAgICAgICBpZiBuYW1lICE9ICJfX3BhdGhfXyI6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIgIGRlZiIsIG5hbWUsIGxpbmVubworICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBGdW5jdGlvbik6CisgICAgICAgICAgICBwcmludCAiZGVmIiwgb2JqLm5hbWUsIG9iai5saW5lbm8KKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B5Y2xici5weWMgYi9saWIvcHl0aG9uMi43L3B5Y2xici5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwMGM2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHljbGJyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B5Y2xici5weW8gYi9saWIvcHl0aG9uMi43L3B5Y2xici5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwMGM2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHljbGJyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B5ZG9jLnB5IGIvbGliL3B5dGhvbjIuNy9weWRvYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGJhMjFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9weWRvYy5weQpAQCAtMCwwICsxLDIzNTkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyAtKi0gY29kaW5nOiBsYXRpbi0xIC0qLQorIiIiR2VuZXJhdGUgUHl0aG9uIGRvY3VtZW50YXRpb24gaW4gSFRNTCBvciB0ZXh0IGZvciBpbnRlcmFjdGl2ZSB1c2UuCisKK0luIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIsIGRvICJmcm9tIHB5ZG9jIGltcG9ydCBoZWxwIiB0byBwcm92aWRlIG9ubGluZQoraGVscC4gIENhbGxpbmcgaGVscCh0aGluZykgb24gYSBQeXRob24gb2JqZWN0IGRvY3VtZW50cyB0aGUgb2JqZWN0LgorCitPciwgYXQgdGhlIHNoZWxsIGNvbW1hbmQgbGluZSBvdXRzaWRlIG9mIFB5dGhvbjoKKworUnVuICJweWRvYyA8bmFtZT4iIHRvIHNob3cgZG9jdW1lbnRhdGlvbiBvbiBzb21ldGhpbmcuICA8bmFtZT4gbWF5IGJlCit0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uLCBtb2R1bGUsIHBhY2thZ2UsIG9yIGEgZG90dGVkIHJlZmVyZW5jZSB0byBhCitjbGFzcyBvciBmdW5jdGlvbiB3aXRoaW4gYSBtb2R1bGUgb3IgbW9kdWxlIGluIGEgcGFja2FnZS4gIElmIHRoZQorYXJndW1lbnQgY29udGFpbnMgYSBwYXRoIHNlZ21lbnQgZGVsaW1pdGVyIChlLmcuIHNsYXNoIG9uIFVuaXgsCitiYWNrc2xhc2ggb24gV2luZG93cykgaXQgaXMgdHJlYXRlZCBhcyB0aGUgcGF0aCB0byBhIFB5dGhvbiBzb3VyY2UgZmlsZS4KKworUnVuICJweWRvYyAtayA8a2V5d29yZD4iIHRvIHNlYXJjaCBmb3IgYSBrZXl3b3JkIGluIHRoZSBzeW5vcHNpcyBsaW5lcworb2YgYWxsIGF2YWlsYWJsZSBtb2R1bGVzLgorCitSdW4gInB5ZG9jIC1wIDxwb3J0PiIgdG8gc3RhcnQgYW4gSFRUUCBzZXJ2ZXIgb24gYSBnaXZlbiBwb3J0IG9uIHRoZQorbG9jYWwgbWFjaGluZSB0byBnZW5lcmF0ZSBkb2N1bWVudGF0aW9uIHdlYiBwYWdlcy4KKworRm9yIHBsYXRmb3JtcyB3aXRob3V0IGEgY29tbWFuZCBsaW5lLCAicHlkb2MgLWciIHN0YXJ0cyB0aGUgSFRUUCBzZXJ2ZXIKK2FuZCBhbHNvIHBvcHMgdXAgYSBsaXR0bGUgd2luZG93IGZvciBjb250cm9sbGluZyBpdC4KKworUnVuICJweWRvYyAtdyA8bmFtZT4iIHRvIHdyaXRlIG91dCB0aGUgSFRNTCBkb2N1bWVudGF0aW9uIGZvciBhIG1vZHVsZQordG8gYSBmaWxlIG5hbWVkICI8bmFtZT4uaHRtbCIuCisKK01vZHVsZSBkb2NzIGZvciBjb3JlIG1vZHVsZXMgYXJlIGFzc3VtZWQgdG8gYmUgaW4KKworICAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS8KKworVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzZXR0aW5nIHRoZSBQWVRIT05ET0NTIGVudmlyb25tZW50IHZhcmlhYmxlCit0byBhIGRpZmZlcmVudCBVUkwgb3IgdG8gYSBsb2NhbCBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgTGlicmFyeQorUmVmZXJlbmNlIE1hbnVhbCBwYWdlcy4KKyIiIgorCitfX2F1dGhvcl9fID0gIkthLVBpbmcgWWVlIDxwaW5nQGxmdy5vcmc+IgorX19kYXRlX18gPSAiMjYgRmVicnVhcnkgMjAwMSIKKworX192ZXJzaW9uX18gPSAiJFJldmlzaW9uOiA4ODU2NCAkIgorX19jcmVkaXRzX18gPSAiIiJHdWlkbyB2YW4gUm9zc3VtLCBmb3IgYW4gZXhjZWxsZW50IHByb2dyYW1taW5nIGxhbmd1YWdlLgorVG9tbXkgQnVybmV0dGUsIHRoZSBvcmlnaW5hbCBjcmVhdG9yIG9mIG1hbnB5LgorUGF1bCBQcmVzY29kLCBmb3IgYWxsIGhpcyB3b3JrIG9uIG9ubGluZWhlbHAuCitSaWNoYXJkIENoYW1iZXJsYWluLCBmb3IgdGhlIGZpcnN0IGltcGxlbWVudGF0aW9uIG9mIHRleHRkb2MuCisiIiIKKworIyBLbm93biBidWdzIHRoYXQgY2FuJ3QgYmUgZml4ZWQgaGVyZToKKyMgICAtIGltcC5sb2FkX21vZHVsZSgpIGNhbm5vdCBiZSBwcmV2ZW50ZWQgZnJvbSBjbG9iYmVyaW5nIGV4aXN0aW5nCisjICAgICBsb2FkZWQgbW9kdWxlcywgc28gY2FsbGluZyBzeW5vcHNpcygpIG9uIGEgYmluYXJ5IG1vZHVsZSBmaWxlCisjICAgICBjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiBhbnkgZXhpc3RpbmcgbW9kdWxlIHdpdGggdGhlIHNhbWUgbmFtZS4KKyMgICAtIElmIHRoZSBfX2ZpbGVfXyBhdHRyaWJ1dGUgb24gYSBtb2R1bGUgaXMgYSByZWxhdGl2ZSBwYXRoIGFuZAorIyAgICAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIGNoYW5nZWQgd2l0aCBvcy5jaGRpcigpLCBhbiBpbmNvcnJlY3QKKyMgICAgIHBhdGggd2lsbCBiZSBkaXNwbGF5ZWQuCisKK2ltcG9ydCBzeXMsIGltcCwgb3MsIHJlLCB0eXBlcywgaW5zcGVjdCwgX19idWlsdGluX18sIHBrZ3V0aWwsIHdhcm5pbmdzCitmcm9tIHJlcHIgaW1wb3J0IFJlcHIKK2Zyb20gc3RyaW5nIGltcG9ydCBleHBhbmR0YWJzLCBmaW5kLCBqb2luLCBsb3dlciwgc3BsaXQsIHN0cmlwLCByZmluZCwgcnN0cmlwCitmcm9tIHRyYWNlYmFjayBpbXBvcnQgZXh0cmFjdF90YgordHJ5OgorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBQeXRob24gMi4zIGNvbXBhdGliaWxpdHkKKyAgICBjbGFzcyBkZXF1ZShsaXN0KToKKyAgICAgICAgZGVmIHBvcGxlZnQoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wb3AoMCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29tbW9uIHJvdXRpbmVzCisKK2RlZiBwYXRoZGlycygpOgorICAgICIiIkNvbnZlcnQgc3lzLnBhdGggaW50byBhIGxpc3Qgb2YgYWJzb2x1dGUsIGV4aXN0aW5nLCB1bmlxdWUgcGF0aHMuIiIiCisgICAgZGlycyA9IFtdCisgICAgbm9ybWRpcnMgPSBbXQorICAgIGZvciBkaXIgaW4gc3lzLnBhdGg6CisgICAgICAgIGRpciA9IG9zLnBhdGguYWJzcGF0aChkaXIgb3IgJy4nKQorICAgICAgICBub3JtZGlyID0gb3MucGF0aC5ub3JtY2FzZShkaXIpCisgICAgICAgIGlmIG5vcm1kaXIgbm90IGluIG5vcm1kaXJzIGFuZCBvcy5wYXRoLmlzZGlyKGRpcik6CisgICAgICAgICAgICBkaXJzLmFwcGVuZChkaXIpCisgICAgICAgICAgICBub3JtZGlycy5hcHBlbmQobm9ybWRpcikKKyAgICByZXR1cm4gZGlycworCitkZWYgZ2V0ZG9jKG9iamVjdCk6CisgICAgIiIiR2V0IHRoZSBkb2Mgc3RyaW5nIG9yIGNvbW1lbnRzIGZvciBhbiBvYmplY3QuIiIiCisgICAgcmVzdWx0ID0gaW5zcGVjdC5nZXRkb2Mob2JqZWN0KSBvciBpbnNwZWN0LmdldGNvbW1lbnRzKG9iamVjdCkKKyAgICByZXR1cm4gcmVzdWx0IGFuZCByZS5zdWIoJ14gKlxuJywgJycsIHJzdHJpcChyZXN1bHQpKSBvciAnJworCitkZWYgc3BsaXRkb2MoZG9jKToKKyAgICAiIiJTcGxpdCBhIGRvYyBzdHJpbmcgaW50byBhIHN5bm9wc2lzIGxpbmUgKGlmIGFueSkgYW5kIHRoZSByZXN0LiIiIgorICAgIGxpbmVzID0gc3BsaXQoc3RyaXAoZG9jKSwgJ1xuJykKKyAgICBpZiBsZW4obGluZXMpID09IDE6CisgICAgICAgIHJldHVybiBsaW5lc1swXSwgJycKKyAgICBlbGlmIGxlbihsaW5lcykgPj0gMiBhbmQgbm90IHJzdHJpcChsaW5lc1sxXSk6CisgICAgICAgIHJldHVybiBsaW5lc1swXSwgam9pbihsaW5lc1syOl0sICdcbicpCisgICAgcmV0dXJuICcnLCBqb2luKGxpbmVzLCAnXG4nKQorCitkZWYgY2xhc3NuYW1lKG9iamVjdCwgbW9kbmFtZSk6CisgICAgIiIiR2V0IGEgY2xhc3MgbmFtZSBhbmQgcXVhbGlmeSBpdCB3aXRoIGEgbW9kdWxlIG5hbWUgaWYgbmVjZXNzYXJ5LiIiIgorICAgIG5hbWUgPSBvYmplY3QuX19uYW1lX18KKyAgICBpZiBvYmplY3QuX19tb2R1bGVfXyAhPSBtb2RuYW1lOgorICAgICAgICBuYW1lID0gb2JqZWN0Ll9fbW9kdWxlX18gKyAnLicgKyBuYW1lCisgICAgcmV0dXJuIG5hbWUKKworZGVmIGlzZGF0YShvYmplY3QpOgorICAgICIiIkNoZWNrIGlmIGFuIG9iamVjdCBpcyBvZiBhIHR5cGUgdGhhdCBwcm9iYWJseSBtZWFucyBpdCdzIGRhdGEuIiIiCisgICAgcmV0dXJuIG5vdCAoaW5zcGVjdC5pc21vZHVsZShvYmplY3QpIG9yIGluc3BlY3QuaXNjbGFzcyhvYmplY3QpIG9yCisgICAgICAgICAgICAgICAgaW5zcGVjdC5pc3JvdXRpbmUob2JqZWN0KSBvciBpbnNwZWN0LmlzZnJhbWUob2JqZWN0KSBvcgorICAgICAgICAgICAgICAgIGluc3BlY3QuaXN0cmFjZWJhY2sob2JqZWN0KSBvciBpbnNwZWN0LmlzY29kZShvYmplY3QpKQorCitkZWYgcmVwbGFjZSh0ZXh0LCAqcGFpcnMpOgorICAgICIiIkRvIGEgc2VyaWVzIG9mIGdsb2JhbCByZXBsYWNlbWVudHMgb24gYSBzdHJpbmcuIiIiCisgICAgd2hpbGUgcGFpcnM6CisgICAgICAgIHRleHQgPSBqb2luKHNwbGl0KHRleHQsIHBhaXJzWzBdKSwgcGFpcnNbMV0pCisgICAgICAgIHBhaXJzID0gcGFpcnNbMjpdCisgICAgcmV0dXJuIHRleHQKKworZGVmIGNyYW0odGV4dCwgbWF4bGVuKToKKyAgICAiIiJPbWl0IHBhcnQgb2YgYSBzdHJpbmcgaWYgbmVlZGVkIHRvIG1ha2UgaXQgZml0IGluIGEgbWF4aW11bSBsZW5ndGguIiIiCisgICAgaWYgbGVuKHRleHQpID4gbWF4bGVuOgorICAgICAgICBwcmUgPSBtYXgoMCwgKG1heGxlbi0zKS8vMikKKyAgICAgICAgcG9zdCA9IG1heCgwLCBtYXhsZW4tMy1wcmUpCisgICAgICAgIHJldHVybiB0ZXh0WzpwcmVdICsgJy4uLicgKyB0ZXh0W2xlbih0ZXh0KS1wb3N0Ol0KKyAgICByZXR1cm4gdGV4dAorCitfcmVfc3RyaXBpZCA9IHJlLmNvbXBpbGUocicgYXQgMHhbMC05YS1mXXs2LDE2fSg+KykkJywgcmUuSUdOT1JFQ0FTRSkKK2RlZiBzdHJpcGlkKHRleHQpOgorICAgICIiIlJlbW92ZSB0aGUgaGV4YWRlY2ltYWwgaWQgZnJvbSBhIFB5dGhvbiBvYmplY3QgcmVwcmVzZW50YXRpb24uIiIiCisgICAgIyBUaGUgYmVoYXZpb3VyIG9mICVwIGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudCBpbiB0ZXJtcyBvZiBjYXNlLgorICAgIHJldHVybiBfcmVfc3RyaXBpZC5zdWIocidcMScsIHRleHQpCisKK2RlZiBfaXNfc29tZV9tZXRob2Qob2JqKToKKyAgICByZXR1cm4gaW5zcGVjdC5pc21ldGhvZChvYmopIG9yIGluc3BlY3QuaXNtZXRob2RkZXNjcmlwdG9yKG9iaikKKworZGVmIGFsbG1ldGhvZHMoY2wpOgorICAgIG1ldGhvZHMgPSB7fQorICAgIGZvciBrZXksIHZhbHVlIGluIGluc3BlY3QuZ2V0bWVtYmVycyhjbCwgX2lzX3NvbWVfbWV0aG9kKToKKyAgICAgICAgbWV0aG9kc1trZXldID0gMQorICAgIGZvciBiYXNlIGluIGNsLl9fYmFzZXNfXzoKKyAgICAgICAgbWV0aG9kcy51cGRhdGUoYWxsbWV0aG9kcyhiYXNlKSkgIyBhbGwgeW91ciBiYXNlIGFyZSBiZWxvbmcgdG8gdXMKKyAgICBmb3Iga2V5IGluIG1ldGhvZHMua2V5cygpOgorICAgICAgICBtZXRob2RzW2tleV0gPSBnZXRhdHRyKGNsLCBrZXkpCisgICAgcmV0dXJuIG1ldGhvZHMKKworZGVmIF9zcGxpdF9saXN0KHMsIHByZWRpY2F0ZSk6CisgICAgIiIiU3BsaXQgc2VxdWVuY2UgcyB2aWEgcHJlZGljYXRlLCBhbmQgcmV0dXJuIHBhaXIgKFt0cnVlXSwgW2ZhbHNlXSkuCisKKyAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgMi10dXBsZSBvZiBsaXN0cywKKyAgICAgICAgKFt4IGZvciB4IGluIHMgaWYgcHJlZGljYXRlKHgpXSwKKyAgICAgICAgIFt4IGZvciB4IGluIHMgaWYgbm90IHByZWRpY2F0ZSh4KV0pCisgICAgIiIiCisKKyAgICB5ZXMgPSBbXQorICAgIG5vID0gW10KKyAgICBmb3IgeCBpbiBzOgorICAgICAgICBpZiBwcmVkaWNhdGUoeCk6CisgICAgICAgICAgICB5ZXMuYXBwZW5kKHgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuby5hcHBlbmQoeCkKKyAgICByZXR1cm4geWVzLCBubworCitkZWYgdmlzaWJsZW5hbWUobmFtZSwgYWxsPU5vbmUsIG9iaj1Ob25lKToKKyAgICAiIiJEZWNpZGUgd2hldGhlciB0byBzaG93IGRvY3VtZW50YXRpb24gb24gYSB2YXJpYWJsZS4iIiIKKyAgICAjIENlcnRhaW4gc3BlY2lhbCBuYW1lcyBhcmUgcmVkdW5kYW50LgorICAgIF9oaWRkZW5fbmFtZXMgPSAoJ19fYnVpbHRpbnNfXycsICdfX2RvY19fJywgJ19fZmlsZV9fJywgJ19fcGF0aF9fJywKKyAgICAgICAgICAgICAgICAgICAgICdfX21vZHVsZV9fJywgJ19fbmFtZV9fJywgJ19fc2xvdHNfXycsICdfX3BhY2thZ2VfXycpCisgICAgaWYgbmFtZSBpbiBfaGlkZGVuX25hbWVzOiByZXR1cm4gMAorICAgICMgUHJpdmF0ZSBuYW1lcyBhcmUgaGlkZGVuLCBidXQgc3BlY2lhbCBuYW1lcyBhcmUgZGlzcGxheWVkLgorICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnX18nKSBhbmQgbmFtZS5lbmRzd2l0aCgnX18nKTogcmV0dXJuIDEKKyAgICAjIE5hbWVkdHVwbGVzIGhhdmUgcHVibGljIGZpZWxkcyBhbmQgbWV0aG9kcyB3aXRoIGEgc2luZ2xlIGxlYWRpbmcgdW5kZXJzY29yZQorICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnXycpIGFuZCBoYXNhdHRyKG9iaiwgJ19maWVsZHMnKToKKyAgICAgICAgcmV0dXJuIDEKKyAgICBpZiBhbGwgaXMgbm90IE5vbmU6CisgICAgICAgICMgb25seSBkb2N1bWVudCB0aGF0IHdoaWNoIHRoZSBwcm9ncmFtbWVyIGV4cG9ydGVkIGluIF9fYWxsX18KKyAgICAgICAgcmV0dXJuIG5hbWUgaW4gYWxsCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKQorCitkZWYgY2xhc3NpZnlfY2xhc3NfYXR0cnMob2JqZWN0KToKKyAgICAiIiJXcmFwIGluc3BlY3QuY2xhc3NpZnlfY2xhc3NfYXR0cnMsIHdpdGggZml4dXAgZm9yIGRhdGEgZGVzY3JpcHRvcnMuIiIiCisgICAgZGVmIGZpeHVwKGRhdGEpOgorICAgICAgICBuYW1lLCBraW5kLCBjbHMsIHZhbHVlID0gZGF0YQorICAgICAgICBpZiBpbnNwZWN0LmlzZGF0YWRlc2NyaXB0b3IodmFsdWUpOgorICAgICAgICAgICAga2luZCA9ICdkYXRhIGRlc2NyaXB0b3InCisgICAgICAgIHJldHVybiBuYW1lLCBraW5kLCBjbHMsIHZhbHVlCisgICAgcmV0dXJuIG1hcChmaXh1cCwgaW5zcGVjdC5jbGFzc2lmeV9jbGFzc19hdHRycyhvYmplY3QpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1vZHVsZSBtYW5pcHVsYXRpb24KKworZGVmIGlzcGFja2FnZShwYXRoKToKKyAgICAiIiJHdWVzcyB3aGV0aGVyIGEgcGF0aCByZWZlcnMgdG8gYSBwYWNrYWdlIGRpcmVjdG9yeS4iIiIKKyAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICBmb3IgZXh0IGluICgnLnB5JywgJy5weWMnLCAnLnB5bycpOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHBhdGgsICdfX2luaXRfXycgKyBleHQpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCitkZWYgc291cmNlX3N5bm9wc2lzKGZpbGUpOgorICAgIGxpbmUgPSBmaWxlLnJlYWRsaW5lKCkKKyAgICB3aGlsZSBsaW5lWzoxXSA9PSAnIycgb3Igbm90IHN0cmlwKGxpbmUpOgorICAgICAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgIGxpbmUgPSBzdHJpcChsaW5lKQorICAgIGlmIGxpbmVbOjRdID09ICdyIiIiJzogbGluZSA9IGxpbmVbMTpdCisgICAgaWYgbGluZVs6M10gPT0gJyIiIic6CisgICAgICAgIGxpbmUgPSBsaW5lWzM6XQorICAgICAgICBpZiBsaW5lWy0xOl0gPT0gJ1xcJzogbGluZSA9IGxpbmVbOi0xXQorICAgICAgICB3aGlsZSBub3Qgc3RyaXAobGluZSk6CisgICAgICAgICAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgcmVzdWx0ID0gc3RyaXAoc3BsaXQobGluZSwgJyIiIicpWzBdKQorICAgIGVsc2U6IHJlc3VsdCA9IE5vbmUKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBzeW5vcHNpcyhmaWxlbmFtZSwgY2FjaGU9e30pOgorICAgICIiIkdldCB0aGUgb25lLWxpbmUgc3VtbWFyeSBvdXQgb2YgYSBtb2R1bGUgZmlsZS4iIiIKKyAgICBtdGltZSA9IG9zLnN0YXQoZmlsZW5hbWUpLnN0X210aW1lCisgICAgbGFzdHVwZGF0ZSwgcmVzdWx0ID0gY2FjaGUuZ2V0KGZpbGVuYW1lLCAoTm9uZSwgTm9uZSkpCisgICAgaWYgbGFzdHVwZGF0ZSBpcyBOb25lIG9yIGxhc3R1cGRhdGUgPCBtdGltZToKKyAgICAgICAgaW5mbyA9IGluc3BlY3QuZ2V0bW9kdWxlaW5mbyhmaWxlbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSA9IG9wZW4oZmlsZW5hbWUpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgIyBtb2R1bGUgY2FuJ3QgYmUgb3BlbmVkLCBzbyBza2lwIGl0CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBpbmZvIGFuZCAnYicgaW4gaW5mb1syXTogIyBiaW5hcnkgbW9kdWxlcyBoYXZlIHRvIGJlIGltcG9ydGVkCisgICAgICAgICAgICB0cnk6IG1vZHVsZSA9IGltcC5sb2FkX21vZHVsZSgnX190ZW1wX18nLCBmaWxlLCBmaWxlbmFtZSwgaW5mb1sxOl0pCisgICAgICAgICAgICBleGNlcHQ6IHJldHVybiBOb25lCisgICAgICAgICAgICByZXN1bHQgPSAobW9kdWxlLl9fZG9jX18gb3IgJycpLnNwbGl0bGluZXMoKVswXQorICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzWydfX3RlbXBfXyddCisgICAgICAgIGVsc2U6ICMgdGV4dCBtb2R1bGVzIGNhbiBiZSBkaXJlY3RseSBleGFtaW5lZAorICAgICAgICAgICAgcmVzdWx0ID0gc291cmNlX3N5bm9wc2lzKGZpbGUpCisgICAgICAgICAgICBmaWxlLmNsb3NlKCkKKyAgICAgICAgY2FjaGVbZmlsZW5hbWVdID0gKG10aW1lLCByZXN1bHQpCisgICAgcmV0dXJuIHJlc3VsdAorCitjbGFzcyBFcnJvckR1cmluZ0ltcG9ydChFeGNlcHRpb24pOgorICAgICIiIkVycm9ycyB0aGF0IG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBpbXBvcnQgc29tZXRoaW5nIHRvIGRvY3VtZW50IGl0LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgZXhjX2luZm8pOgorICAgICAgICBleGMsIHZhbHVlLCB0YiA9IGV4Y19pbmZvCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmV4YyA9IGV4YworICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi50YiA9IHRiCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgZXhjID0gc2VsZi5leGMKKyAgICAgICAgaWYgdHlwZShleGMpIGlzIHR5cGVzLkNsYXNzVHlwZToKKyAgICAgICAgICAgIGV4YyA9IGV4Yy5fX25hbWVfXworICAgICAgICByZXR1cm4gJ3Byb2JsZW0gaW4gJXMgLSAlczogJXMnICUgKHNlbGYuZmlsZW5hbWUsIGV4Yywgc2VsZi52YWx1ZSkKKworZGVmIGltcG9ydGZpbGUocGF0aCk6CisgICAgIiIiSW1wb3J0IGEgUHl0aG9uIHNvdXJjZSBmaWxlIG9yIGNvbXBpbGVkIGZpbGUgZ2l2ZW4gaXRzIHBhdGguIiIiCisgICAgbWFnaWMgPSBpbXAuZ2V0X21hZ2ljKCkKKyAgICBmaWxlID0gb3BlbihwYXRoLCAncicpCisgICAgaWYgZmlsZS5yZWFkKGxlbihtYWdpYykpID09IG1hZ2ljOgorICAgICAgICBraW5kID0gaW1wLlBZX0NPTVBJTEVECisgICAgZWxzZToKKyAgICAgICAga2luZCA9IGltcC5QWV9TT1VSQ0UKKyAgICBmaWxlLmNsb3NlKCkKKyAgICBmaWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKKyAgICBuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgIGZpbGUgPSBvcGVuKHBhdGgsICdyJykKKyAgICB0cnk6CisgICAgICAgIG1vZHVsZSA9IGltcC5sb2FkX21vZHVsZShuYW1lLCBmaWxlLCBwYXRoLCAoZXh0LCAncicsIGtpbmQpKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcmFpc2UgRXJyb3JEdXJpbmdJbXBvcnQocGF0aCwgc3lzLmV4Y19pbmZvKCkpCisgICAgZmlsZS5jbG9zZSgpCisgICAgcmV0dXJuIG1vZHVsZQorCitkZWYgc2FmZWltcG9ydChwYXRoLCBmb3JjZWxvYWQ9MCwgY2FjaGU9e30pOgorICAgICIiIkltcG9ydCBhIG1vZHVsZTsgaGFuZGxlIGVycm9yczsgcmV0dXJuIE5vbmUgaWYgdGhlIG1vZHVsZSBpc24ndCBmb3VuZC4KKworICAgIElmIHRoZSBtb2R1bGUgKmlzKiBmb3VuZCBidXQgYW4gZXhjZXB0aW9uIG9jY3VycywgaXQncyB3cmFwcGVkIGluIGFuCisgICAgRXJyb3JEdXJpbmdJbXBvcnQgZXhjZXB0aW9uIGFuZCByZXJhaXNlZC4gIFVubGlrZSBfX2ltcG9ydF9fLCBpZiBhCisgICAgcGFja2FnZSBwYXRoIGlzIHNwZWNpZmllZCwgdGhlIG1vZHVsZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoIGlzIHJldHVybmVkLAorICAgIG5vdCB0aGUgcGFja2FnZSBhdCB0aGUgYmVnaW5uaW5nLiAgSWYgdGhlIG9wdGlvbmFsICdmb3JjZWxvYWQnIGFyZ3VtZW50CisgICAgaXMgMSwgd2UgcmVsb2FkIHRoZSBtb2R1bGUgZnJvbSBkaXNrICh1bmxlc3MgaXQncyBhIGR5bmFtaWMgZXh0ZW5zaW9uKS4iIiIKKyAgICB0cnk6CisgICAgICAgICMgSWYgZm9yY2Vsb2FkIGlzIDEgYW5kIHRoZSBtb2R1bGUgaGFzIGJlZW4gcHJldmlvdXNseSBsb2FkZWQgZnJvbQorICAgICAgICAjIGRpc2ssIHdlIGFsd2F5cyBoYXZlIHRvIHJlbG9hZCB0aGUgbW9kdWxlLiAgQ2hlY2tpbmcgdGhlIGZpbGUncworICAgICAgICAjIG10aW1lIGlzbid0IGdvb2QgZW5vdWdoIChlLmcuIHRoZSBtb2R1bGUgY291bGQgY29udGFpbiBhIGNsYXNzCisgICAgICAgICMgdGhhdCBpbmhlcml0cyBmcm9tIGFub3RoZXIgbW9kdWxlIHRoYXQgaGFzIGNoYW5nZWQpLgorICAgICAgICBpZiBmb3JjZWxvYWQgYW5kIHBhdGggaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICBpZiBwYXRoIG5vdCBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CisgICAgICAgICAgICAgICAgIyBBdm9pZCBzaW1wbHkgY2FsbGluZyByZWxvYWQoKSBiZWNhdXNlIGl0IGxlYXZlcyBuYW1lcyBpbgorICAgICAgICAgICAgICAgICMgdGhlIGN1cnJlbnRseSBsb2FkZWQgbW9kdWxlIGx5aW5nIGFyb3VuZCBpZiB0aGV5J3JlIG5vdAorICAgICAgICAgICAgICAgICMgZGVmaW5lZCBpbiB0aGUgbmV3IHNvdXJjZSBmaWxlLiAgSW5zdGVhZCwgcmVtb3ZlIHRoZQorICAgICAgICAgICAgICAgICMgbW9kdWxlIGZyb20gc3lzLm1vZHVsZXMgYW5kIHJlLWltcG9ydC4gIEFsc28gcmVtb3ZlIGFueQorICAgICAgICAgICAgICAgICMgc3VibW9kdWxlcyBiZWNhdXNlIHRoZXkgd29uJ3QgYXBwZWFyIGluIHRoZSBuZXdseSBsb2FkZWQKKyAgICAgICAgICAgICAgICAjIG1vZHVsZSdzIG5hbWVzcGFjZSBpZiB0aGV5J3JlIGFscmVhZHkgaW4gc3lzLm1vZHVsZXMuCisgICAgICAgICAgICAgICAgc3VicyA9IFttIGZvciBtIGluIHN5cy5tb2R1bGVzIGlmIG0uc3RhcnRzd2l0aChwYXRoICsgJy4nKV0KKyAgICAgICAgICAgICAgICBmb3Iga2V5IGluIFtwYXRoXSArIHN1YnM6CisgICAgICAgICAgICAgICAgICAgICMgUHJldmVudCBnYXJiYWdlIGNvbGxlY3Rpb24uCisgICAgICAgICAgICAgICAgICAgIGNhY2hlW2tleV0gPSBzeXMubW9kdWxlc1trZXldCisgICAgICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1trZXldCisgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18ocGF0aCkKKyAgICBleGNlcHQ6CisgICAgICAgICMgRGlkIHRoZSBlcnJvciBvY2N1ciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIG1vZHVsZSB3YXMgZm91bmQ/CisgICAgICAgIChleGMsIHZhbHVlLCB0YikgPSBpbmZvID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgaWYgcGF0aCBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgICMgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZXhlY3V0aW5nIHRoZSBpbXBvcnRlZCBtb2R1bGUuCisgICAgICAgICAgICByYWlzZSBFcnJvckR1cmluZ0ltcG9ydChzeXMubW9kdWxlc1twYXRoXS5fX2ZpbGVfXywgaW5mbykKKyAgICAgICAgZWxpZiBleGMgaXMgU3ludGF4RXJyb3I6CisgICAgICAgICAgICAjIEEgU3ludGF4RXJyb3Igb2NjdXJyZWQgYmVmb3JlIHdlIGNvdWxkIGV4ZWN1dGUgdGhlIG1vZHVsZS4KKyAgICAgICAgICAgIHJhaXNlIEVycm9yRHVyaW5nSW1wb3J0KHZhbHVlLmZpbGVuYW1lLCBpbmZvKQorICAgICAgICBlbGlmIGV4YyBpcyBJbXBvcnRFcnJvciBhbmQgZXh0cmFjdF90Yih0YilbLTFdWzJdPT0nc2FmZWltcG9ydCc6CisgICAgICAgICAgICAjIFRoZSBpbXBvcnQgZXJyb3Igb2NjdXJyZWQgZGlyZWN0bHkgaW4gdGhpcyBmdW5jdGlvbiwKKyAgICAgICAgICAgICMgd2hpY2ggbWVhbnMgdGhlcmUgaXMgbm8gc3VjaCBtb2R1bGUgaW4gdGhlIHBhdGguCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBTb21lIG90aGVyIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUgaW1wb3J0aW5nIHByb2Nlc3MuCisgICAgICAgICAgICByYWlzZSBFcnJvckR1cmluZ0ltcG9ydChwYXRoLCBzeXMuZXhjX2luZm8oKSkKKyAgICBmb3IgcGFydCBpbiBzcGxpdChwYXRoLCAnLicpWzE6XToKKyAgICAgICAgdHJ5OiBtb2R1bGUgPSBnZXRhdHRyKG1vZHVsZSwgcGFydCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiByZXR1cm4gTm9uZQorICAgIHJldHVybiBtb2R1bGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZvcm1hdHRlciBiYXNlIGNsYXNzCisKK2NsYXNzIERvYzoKKyAgICBkZWYgZG9jdW1lbnQoc2VsZiwgb2JqZWN0LCBuYW1lPU5vbmUsICphcmdzKToKKyAgICAgICAgIiIiR2VuZXJhdGUgZG9jdW1lbnRhdGlvbiBmb3IgYW4gb2JqZWN0LiIiIgorICAgICAgICBhcmdzID0gKG9iamVjdCwgbmFtZSkgKyBhcmdzCisgICAgICAgICMgJ3RyeScgY2xhdXNlIGlzIHRvIGF0dGVtcHQgdG8gaGFuZGxlIHRoZSBwb3NzaWJpbGl0eSB0aGF0IGluc3BlY3QKKyAgICAgICAgIyBpZGVudGlmaWVzIHNvbWV0aGluZyBpbiBhIHdheSB0aGF0IHB5ZG9jIGl0c2VsZiBoYXMgaXNzdWVzIGhhbmRsaW5nOworICAgICAgICAjIHRoaW5rICdzdXBlcicgYW5kIGhvdyBpdCBpcyBhIGRlc2NyaXB0b3IgKHdoaWNoIHJhaXNlcyB0aGUgZXhjZXB0aW9uCisgICAgICAgICMgYnkgbGFja2luZyBhIF9fbmFtZV9fIGF0dHJpYnV0ZSkgYW5kIGFuIGluc3RhbmNlLgorICAgICAgICBpZiBpbnNwZWN0LmlzZ2V0c2V0ZGVzY3JpcHRvcihvYmplY3QpOiByZXR1cm4gc2VsZi5kb2NkYXRhKCphcmdzKQorICAgICAgICBpZiBpbnNwZWN0LmlzbWVtYmVyZGVzY3JpcHRvcihvYmplY3QpOiByZXR1cm4gc2VsZi5kb2NkYXRhKCphcmdzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBpbnNwZWN0LmlzbW9kdWxlKG9iamVjdCk6IHJldHVybiBzZWxmLmRvY21vZHVsZSgqYXJncykKKyAgICAgICAgICAgIGlmIGluc3BlY3QuaXNjbGFzcyhvYmplY3QpOiByZXR1cm4gc2VsZi5kb2NjbGFzcygqYXJncykKKyAgICAgICAgICAgIGlmIGluc3BlY3QuaXNyb3V0aW5lKG9iamVjdCk6IHJldHVybiBzZWxmLmRvY3JvdXRpbmUoKmFyZ3MpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvYmplY3QsIHByb3BlcnR5KTogcmV0dXJuIHNlbGYuZG9jcHJvcGVydHkoKmFyZ3MpCisgICAgICAgIHJldHVybiBzZWxmLmRvY290aGVyKCphcmdzKQorCisgICAgZGVmIGZhaWwoc2VsZiwgb2JqZWN0LCBuYW1lPU5vbmUsICphcmdzKToKKyAgICAgICAgIiIiUmFpc2UgYW4gZXhjZXB0aW9uIGZvciB1bmltcGxlbWVudGVkIHR5cGVzLiIiIgorICAgICAgICBtZXNzYWdlID0gImRvbid0IGtub3cgaG93IHRvIGRvY3VtZW50IG9iamVjdCVzIG9mIHR5cGUgJXMiICUgKAorICAgICAgICAgICAgbmFtZSBhbmQgJyAnICsgcmVwcihuYW1lKSwgdHlwZShvYmplY3QpLl9fbmFtZV9fKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IsIG1lc3NhZ2UKKworICAgIGRvY21vZHVsZSA9IGRvY2NsYXNzID0gZG9jcm91dGluZSA9IGRvY290aGVyID0gZG9jcHJvcGVydHkgPSBkb2NkYXRhID0gZmFpbAorCisgICAgZGVmIGdldGRvY2xvYyhzZWxmLCBvYmplY3QpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIG1vZHVsZSBkb2NzIG9yIE5vbmUiIiIKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlID0gaW5zcGVjdC5nZXRhYnNmaWxlKG9iamVjdCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIGZpbGUgPSAnKGJ1aWx0LWluKScKKworICAgICAgICBkb2Nsb2MgPSBvcy5lbnZpcm9uLmdldCgiUFlUSE9ORE9DUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkiKQorICAgICAgICBiYXNlZGlyID0gb3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwgImxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiIrc3lzLnZlcnNpb25bMDozXSkKKyAgICAgICAgaWYgKGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlKG9zKSkgYW5kCisgICAgICAgICAgICAob2JqZWN0Ll9fbmFtZV9fIGluICgnZXJybm8nLCAnZXhjZXB0aW9ucycsICdnYycsICdpbXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcnNoYWwnLCAncG9zaXgnLCAnc2lnbmFsJywgJ3N5cycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhyZWFkJywgJ3ppcGltcG9ydCcpIG9yCisgICAgICAgICAgICAgKGZpbGUuc3RhcnRzd2l0aChiYXNlZGlyKSBhbmQKKyAgICAgICAgICAgICAgbm90IGZpbGUuc3RhcnRzd2l0aChvcy5wYXRoLmpvaW4oYmFzZWRpciwgJ3NpdGUtcGFja2FnZXMnKSkpKSBhbmQKKyAgICAgICAgICAgIG9iamVjdC5fX25hbWVfXyBub3QgaW4gKCd4bWwuZXRyZWUnLCAndGVzdC5weWRvY19tb2QnKSk6CisgICAgICAgICAgICBpZiBkb2Nsb2Muc3RhcnRzd2l0aCgiaHR0cDovLyIpOgorICAgICAgICAgICAgICAgIGRvY2xvYyA9ICIlcy8lcyIgJSAoZG9jbG9jLnJzdHJpcCgiLyIpLCBvYmplY3QuX19uYW1lX18pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRvY2xvYyA9IG9zLnBhdGguam9pbihkb2Nsb2MsIG9iamVjdC5fX25hbWVfXyArICIuaHRtbCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkb2Nsb2MgPSBOb25lCisgICAgICAgIHJldHVybiBkb2Nsb2MKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIVE1MIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yCisKK2NsYXNzIEhUTUxSZXByKFJlcHIpOgorICAgICIiIkNsYXNzIGZvciBzYWZlbHkgbWFraW5nIGFuIEhUTUwgcmVwcmVzZW50YXRpb24gb2YgYSBQeXRob24gb2JqZWN0LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgUmVwci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLm1heGxpc3QgPSBzZWxmLm1heHR1cGxlID0gMjAKKyAgICAgICAgc2VsZi5tYXhkaWN0ID0gMTAKKyAgICAgICAgc2VsZi5tYXhzdHJpbmcgPSBzZWxmLm1heG90aGVyID0gMTAwCisKKyAgICBkZWYgZXNjYXBlKHNlbGYsIHRleHQpOgorICAgICAgICByZXR1cm4gcmVwbGFjZSh0ZXh0LCAnJicsICcmYW1wOycsICc8JywgJyZsdDsnLCAnPicsICcmZ3Q7JykKKworICAgIGRlZiByZXByKHNlbGYsIG9iamVjdCk6CisgICAgICAgIHJldHVybiBSZXByLnJlcHIoc2VsZiwgb2JqZWN0KQorCisgICAgZGVmIHJlcHIxKHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgaWYgaGFzYXR0cih0eXBlKHgpLCAnX19uYW1lX18nKToKKyAgICAgICAgICAgIG1ldGhvZG5hbWUgPSAncmVwcl8nICsgam9pbihzcGxpdCh0eXBlKHgpLl9fbmFtZV9fKSwgJ18nKQorICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLCBtZXRob2RuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBtZXRob2RuYW1lKSh4LCBsZXZlbCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZXNjYXBlKGNyYW0oc3RyaXBpZChyZXByKHgpKSwgc2VsZi5tYXhvdGhlcikpCisKKyAgICBkZWYgcmVwcl9zdHJpbmcoc2VsZiwgeCwgbGV2ZWwpOgorICAgICAgICB0ZXN0ID0gY3JhbSh4LCBzZWxmLm1heHN0cmluZykKKyAgICAgICAgdGVzdHJlcHIgPSByZXByKHRlc3QpCisgICAgICAgIGlmICdcXCcgaW4gdGVzdCBhbmQgJ1xcJyBub3QgaW4gcmVwbGFjZSh0ZXN0cmVwciwgcidcXCcsICcnKToKKyAgICAgICAgICAgICMgQmFja3NsYXNoZXMgYXJlIG9ubHkgbGl0ZXJhbCBpbiB0aGUgc3RyaW5nIGFuZCBhcmUgbmV2ZXIKKyAgICAgICAgICAgICMgbmVlZGVkIHRvIG1ha2UgYW55IHNwZWNpYWwgY2hhcmFjdGVycywgc28gc2hvdyBhIHJhdyBzdHJpbmcuCisgICAgICAgICAgICByZXR1cm4gJ3InICsgdGVzdHJlcHJbMF0gKyBzZWxmLmVzY2FwZSh0ZXN0KSArIHRlc3RyZXByWzBdCisgICAgICAgIHJldHVybiByZS5zdWIocicoKFxcW1xcYWJmbnJ0dlwnIl18XFxbMC05XS4ufFxceC4ufFxcdS4uLi4pKyknLAorICAgICAgICAgICAgICAgICAgICAgIHInPGZvbnQgY29sb3I9IiNjMDQwYzAiPlwxPC9mb250PicsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lc2NhcGUodGVzdHJlcHIpKQorCisgICAgcmVwcl9zdHIgPSByZXByX3N0cmluZworCisgICAgZGVmIHJlcHJfaW5zdGFuY2Uoc2VsZiwgeCwgbGV2ZWwpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5lc2NhcGUoY3JhbShzdHJpcGlkKHJlcHIoeCkpLCBzZWxmLm1heHN0cmluZykpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmVzY2FwZSgnPCVzIGluc3RhbmNlPicgJSB4Ll9fY2xhc3NfXy5fX25hbWVfXykKKworICAgIHJlcHJfdW5pY29kZSA9IHJlcHJfc3RyaW5nCisKK2NsYXNzIEhUTUxEb2MoRG9jKToKKyAgICAiIiJGb3JtYXR0ZXIgY2xhc3MgZm9yIEhUTUwgZG9jdW1lbnRhdGlvbi4iIiIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBIVE1MIGZvcm1hdHRpbmcgdXRpbGl0aWVzCisKKyAgICBfcmVwcl9pbnN0YW5jZSA9IEhUTUxSZXByKCkKKyAgICByZXByID0gX3JlcHJfaW5zdGFuY2UucmVwcgorICAgIGVzY2FwZSA9IF9yZXByX2luc3RhbmNlLmVzY2FwZQorCisgICAgZGVmIHBhZ2Uoc2VsZiwgdGl0bGUsIGNvbnRlbnRzKToKKyAgICAgICAgIiIiRm9ybWF0IGFuIEhUTUwgcGFnZS4iIiIKKyAgICAgICAgcmV0dXJuICcnJworPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPjxoZWFkPjx0aXRsZT5QeXRob246ICVzPC90aXRsZT4KKzwvaGVhZD48Ym9keSBiZ2NvbG9yPSIjZjBmMGY4Ij4KKyVzCis8L2JvZHk+PC9odG1sPicnJyAlICh0aXRsZSwgY29udGVudHMpCisKKyAgICBkZWYgaGVhZGluZyhzZWxmLCB0aXRsZSwgZmdjb2wsIGJnY29sLCBleHRyYXM9JycpOgorICAgICAgICAiIiJGb3JtYXQgYSBwYWdlIGhlYWRpbmcuIiIiCisgICAgICAgIHJldHVybiAnJycKKzx0YWJsZSB3aWR0aD0iMTAwJSUiIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MiBib3JkZXI9MCBzdW1tYXJ5PSJoZWFkaW5nIj4KKzx0ciBiZ2NvbG9yPSIlcyI+Cis8dGQgdmFsaWduPWJvdHRvbT4mbmJzcDs8YnI+Cis8Zm9udCBjb2xvcj0iJXMiIGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPiZuYnNwOzxicj4lczwvZm9udD48L3RkCis+PHRkIGFsaWduPXJpZ2h0IHZhbGlnbj1ib3R0b20KKz48Zm9udCBjb2xvcj0iJXMiIGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPiVzPC9mb250PjwvdGQ+PC90cj48L3RhYmxlPgorICAgICcnJyAlIChiZ2NvbCwgZmdjb2wsIHRpdGxlLCBmZ2NvbCwgZXh0cmFzIG9yICcmbmJzcDsnKQorCisgICAgZGVmIHNlY3Rpb24oc2VsZiwgdGl0bGUsIGZnY29sLCBiZ2NvbCwgY29udGVudHMsIHdpZHRoPTYsCisgICAgICAgICAgICAgICAgcHJlbHVkZT0nJywgbWFyZ2luYWxpYT1Ob25lLCBnYXA9JyZuYnNwOycpOgorICAgICAgICAiIiJGb3JtYXQgYSBzZWN0aW9uIHdpdGggYSBoZWFkaW5nLiIiIgorICAgICAgICBpZiBtYXJnaW5hbGlhIGlzIE5vbmU6CisgICAgICAgICAgICBtYXJnaW5hbGlhID0gJzx0dD4nICsgJyZuYnNwOycgKiB3aWR0aCArICc8L3R0PicKKyAgICAgICAgcmVzdWx0ID0gJycnPHA+Cis8dGFibGUgd2lkdGg9IjEwMCUlIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTIgYm9yZGVyPTAgc3VtbWFyeT0ic2VjdGlvbiI+Cis8dHIgYmdjb2xvcj0iJXMiPgorPHRkIGNvbHNwYW49MyB2YWxpZ249Ym90dG9tPiZuYnNwOzxicj4KKzxmb250IGNvbG9yPSIlcyIgZmFjZT0iaGVsdmV0aWNhLCBhcmlhbCI+JXM8L2ZvbnQ+PC90ZD48L3RyPgorICAgICcnJyAlIChiZ2NvbCwgZmdjb2wsIHRpdGxlKQorICAgICAgICBpZiBwcmVsdWRlOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgJycnCis8dHIgYmdjb2xvcj0iJXMiPjx0ZCByb3dzcGFuPTI+JXM8L3RkPgorPHRkIGNvbHNwYW49Mj4lczwvdGQ+PC90cj4KKzx0cj48dGQ+JXM8L3RkPicnJyAlIChiZ2NvbCwgbWFyZ2luYWxpYSwgcHJlbHVkZSwgZ2FwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgJycnCis8dHI+PHRkIGJnY29sb3I9IiVzIj4lczwvdGQ+PHRkPiVzPC90ZD4nJycgJSAoYmdjb2wsIG1hcmdpbmFsaWEsIGdhcCkKKworICAgICAgICByZXR1cm4gcmVzdWx0ICsgJ1xuPHRkIHdpZHRoPSIxMDAlJSI+JXM8L3RkPjwvdHI+PC90YWJsZT4nICUgY29udGVudHMKKworICAgIGRlZiBiaWdzZWN0aW9uKHNlbGYsIHRpdGxlLCAqYXJncyk6CisgICAgICAgICIiIkZvcm1hdCBhIHNlY3Rpb24gd2l0aCBhIGJpZyBoZWFkaW5nLiIiIgorICAgICAgICB0aXRsZSA9ICc8YmlnPjxzdHJvbmc+JXM8L3N0cm9uZz48L2JpZz4nICUgdGl0bGUKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VjdGlvbih0aXRsZSwgKmFyZ3MpCisKKyAgICBkZWYgcHJlZm9ybWF0KHNlbGYsIHRleHQpOgorICAgICAgICAiIiJGb3JtYXQgbGl0ZXJhbCBwcmVmb3JtYXR0ZWQgdGV4dC4iIiIKKyAgICAgICAgdGV4dCA9IHNlbGYuZXNjYXBlKGV4cGFuZHRhYnModGV4dCkpCisgICAgICAgIHJldHVybiByZXBsYWNlKHRleHQsICdcblxuJywgJ1xuIFxuJywgJ1xuXG4nLCAnXG4gXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICcsICcmbmJzcDsnLCAnXG4nLCAnPGJyPlxuJykKKworICAgIGRlZiBtdWx0aWNvbHVtbihzZWxmLCBsaXN0LCBmb3JtYXQsIGNvbHM9NCk6CisgICAgICAgICIiIkZvcm1hdCBhIGxpc3Qgb2YgaXRlbXMgaW50byBhIG11bHRpLWNvbHVtbiBsaXN0LiIiIgorICAgICAgICByZXN1bHQgPSAnJworICAgICAgICByb3dzID0gKGxlbihsaXN0KStjb2xzLTEpLy9jb2xzCisgICAgICAgIGZvciBjb2wgaW4gcmFuZ2UoY29scyk6CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAnPHRkIHdpZHRoPSIlZCUlIiB2YWxpZ249dG9wPicgJSAoMTAwLy9jb2xzKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uocm93cypjb2wsIHJvd3MqY29sK3Jvd3MpOgorICAgICAgICAgICAgICAgIGlmIGkgPCBsZW4obGlzdCk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGZvcm1hdChsaXN0W2ldKSArICc8YnI+XG4nCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAnPC90ZD4nCisgICAgICAgIHJldHVybiAnPHRhYmxlIHdpZHRoPSIxMDAlJSIgc3VtbWFyeT0ibGlzdCI+PHRyPiVzPC90cj48L3RhYmxlPicgJSByZXN1bHQKKworICAgIGRlZiBncmV5KHNlbGYsIHRleHQpOiByZXR1cm4gJzxmb250IGNvbG9yPSIjOTA5MDkwIj4lczwvZm9udD4nICUgdGV4dAorCisgICAgZGVmIG5hbWVsaW5rKHNlbGYsIG5hbWUsICpkaWN0cyk6CisgICAgICAgICIiIk1ha2UgYSBsaW5rIGZvciBhbiBpZGVudGlmaWVyLCBnaXZlbiBuYW1lLXRvLVVSTCBtYXBwaW5ncy4iIiIKKyAgICAgICAgZm9yIGRpY3QgaW4gZGljdHM6CisgICAgICAgICAgICBpZiBuYW1lIGluIGRpY3Q6CisgICAgICAgICAgICAgICAgcmV0dXJuICc8YSBocmVmPSIlcyI+JXM8L2E+JyAlIChkaWN0W25hbWVdLCBuYW1lKQorICAgICAgICByZXR1cm4gbmFtZQorCisgICAgZGVmIGNsYXNzbGluayhzZWxmLCBvYmplY3QsIG1vZG5hbWUpOgorICAgICAgICAiIiJNYWtlIGEgbGluayBmb3IgYSBjbGFzcy4iIiIKKyAgICAgICAgbmFtZSwgbW9kdWxlID0gb2JqZWN0Ll9fbmFtZV9fLCBzeXMubW9kdWxlcy5nZXQob2JqZWN0Ll9fbW9kdWxlX18pCisgICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCBuYW1lKSBhbmQgZ2V0YXR0cihtb2R1bGUsIG5hbWUpIGlzIG9iamVjdDoKKyAgICAgICAgICAgIHJldHVybiAnPGEgaHJlZj0iJXMuaHRtbCMlcyI+JXM8L2E+JyAlICgKKyAgICAgICAgICAgICAgICBtb2R1bGUuX19uYW1lX18sIG5hbWUsIGNsYXNzbmFtZShvYmplY3QsIG1vZG5hbWUpKQorICAgICAgICByZXR1cm4gY2xhc3NuYW1lKG9iamVjdCwgbW9kbmFtZSkKKworICAgIGRlZiBtb2R1bGVsaW5rKHNlbGYsIG9iamVjdCk6CisgICAgICAgICIiIk1ha2UgYSBsaW5rIGZvciBhIG1vZHVsZS4iIiIKKyAgICAgICAgcmV0dXJuICc8YSBocmVmPSIlcy5odG1sIj4lczwvYT4nICUgKG9iamVjdC5fX25hbWVfXywgb2JqZWN0Ll9fbmFtZV9fKQorCisgICAgZGVmIG1vZHBrZ2xpbmsoc2VsZiwgZGF0YSk6CisgICAgICAgICIiIk1ha2UgYSBsaW5rIGZvciBhIG1vZHVsZSBvciBwYWNrYWdlIHRvIGRpc3BsYXkgaW4gYW4gaW5kZXguIiIiCisgICAgICAgIG5hbWUsIHBhdGgsIGlzcGFja2FnZSwgc2hhZG93ZWQgPSBkYXRhCisgICAgICAgIGlmIHNoYWRvd2VkOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ3JleShuYW1lKQorICAgICAgICBpZiBwYXRoOgorICAgICAgICAgICAgdXJsID0gJyVzLiVzLmh0bWwnICUgKHBhdGgsIG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1cmwgPSAnJXMuaHRtbCcgJSBuYW1lCisgICAgICAgIGlmIGlzcGFja2FnZToKKyAgICAgICAgICAgIHRleHQgPSAnPHN0cm9uZz4lczwvc3Ryb25nPiZuYnNwOyhwYWNrYWdlKScgJSBuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ZXh0ID0gbmFtZQorICAgICAgICByZXR1cm4gJzxhIGhyZWY9IiVzIj4lczwvYT4nICUgKHVybCwgdGV4dCkKKworICAgIGRlZiBtYXJrdXAoc2VsZiwgdGV4dCwgZXNjYXBlPU5vbmUsIGZ1bmNzPXt9LCBjbGFzc2VzPXt9LCBtZXRob2RzPXt9KToKKyAgICAgICAgIiIiTWFyayB1cCBzb21lIHBsYWluIHRleHQsIGdpdmVuIGEgY29udGV4dCBvZiBzeW1ib2xzIHRvIGxvb2sgZm9yLgorICAgICAgICBFYWNoIGNvbnRleHQgZGljdGlvbmFyeSBtYXBzIG9iamVjdCBuYW1lcyB0byBhbmNob3IgbmFtZXMuIiIiCisgICAgICAgIGVzY2FwZSA9IGVzY2FwZSBvciBzZWxmLmVzY2FwZQorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgaGVyZSA9IDAKKyAgICAgICAgcGF0dGVybiA9IHJlLmNvbXBpbGUocidcYigoaHR0cHxmdHApOi8vXFMrW1x3L118JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1JGQ1stIF0/KFxkKyl8JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1BFUFstIF0/KFxkKyl8JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJyhzZWxmXC4pPyhcdyspKScpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBtYXRjaCA9IHBhdHRlcm4uc2VhcmNoKHRleHQsIGhlcmUpCisgICAgICAgICAgICBpZiBub3QgbWF0Y2g6IGJyZWFrCisgICAgICAgICAgICBzdGFydCwgZW5kID0gbWF0Y2guc3BhbigpCisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChlc2NhcGUodGV4dFtoZXJlOnN0YXJ0XSkpCisKKyAgICAgICAgICAgIGFsbCwgc2NoZW1lLCByZmMsIHBlcCwgc2VsZmRvdCwgbmFtZSA9IG1hdGNoLmdyb3VwcygpCisgICAgICAgICAgICBpZiBzY2hlbWU6CisgICAgICAgICAgICAgICAgdXJsID0gZXNjYXBlKGFsbCkucmVwbGFjZSgnIicsICcmcXVvdDsnKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCc8YSBocmVmPSIlcyI+JXM8L2E+JyAlICh1cmwsIHVybCkpCisgICAgICAgICAgICBlbGlmIHJmYzoKKyAgICAgICAgICAgICAgICB1cmwgPSAnaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjJWQudHh0JyAlIGludChyZmMpCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJzxhIGhyZWY9IiVzIj4lczwvYT4nICUgKHVybCwgZXNjYXBlKGFsbCkpKQorICAgICAgICAgICAgZWxpZiBwZXA6CisgICAgICAgICAgICAgICAgdXJsID0gJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtJTA0ZC8nICUgaW50KHBlcCkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgnPGEgaHJlZj0iJXMiPiVzPC9hPicgJSAodXJsLCBlc2NhcGUoYWxsKSkpCisgICAgICAgICAgICBlbGlmIHRleHRbZW5kOmVuZCsxXSA9PSAnKCc6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoc2VsZi5uYW1lbGluayhuYW1lLCBtZXRob2RzLCBmdW5jcywgY2xhc3NlcykpCisgICAgICAgICAgICBlbGlmIHNlbGZkb3Q6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ3NlbGYuPHN0cm9uZz4lczwvc3Ryb25nPicgJSBuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChzZWxmLm5hbWVsaW5rKG5hbWUsIGNsYXNzZXMpKQorICAgICAgICAgICAgaGVyZSA9IGVuZAorICAgICAgICByZXN1bHRzLmFwcGVuZChlc2NhcGUodGV4dFtoZXJlOl0pKQorICAgICAgICByZXR1cm4gam9pbihyZXN1bHRzLCAnJykKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlLXNwZWNpZmljIHJvdXRpbmVzCisKKyAgICBkZWYgZm9ybWF0dHJlZShzZWxmLCB0cmVlLCBtb2RuYW1lLCBwYXJlbnQ9Tm9uZSk6CisgICAgICAgICIiIlByb2R1Y2UgSFRNTCBmb3IgYSBjbGFzcyB0cmVlIGFzIGdpdmVuIGJ5IGluc3BlY3QuZ2V0Y2xhc3N0cmVlKCkuIiIiCisgICAgICAgIHJlc3VsdCA9ICcnCisgICAgICAgIGZvciBlbnRyeSBpbiB0cmVlOgorICAgICAgICAgICAgaWYgdHlwZShlbnRyeSkgaXMgdHlwZSgoKSk6CisgICAgICAgICAgICAgICAgYywgYmFzZXMgPSBlbnRyeQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICc8ZHQ+PGZvbnQgZmFjZT0iaGVsdmV0aWNhLCBhcmlhbCI+JworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuY2xhc3NsaW5rKGMsIG1vZG5hbWUpCisgICAgICAgICAgICAgICAgaWYgYmFzZXMgYW5kIGJhc2VzICE9IChwYXJlbnQsKToKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50cyA9IFtdCisgICAgICAgICAgICAgICAgICAgIGZvciBiYXNlIGluIGJhc2VzOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5hcHBlbmQoc2VsZi5jbGFzc2xpbmsoYmFzZSwgbW9kbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICcoJyArIGpvaW4ocGFyZW50cywgJywgJykgKyAnKScKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAnXG48L2ZvbnQ+PC9kdD4nCisgICAgICAgICAgICBlbGlmIHR5cGUoZW50cnkpIGlzIHR5cGUoW10pOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICc8ZGQ+XG4lczwvZGQ+XG4nICUgc2VsZi5mb3JtYXR0cmVlKAorICAgICAgICAgICAgICAgICAgICBlbnRyeSwgbW9kbmFtZSwgYykKKyAgICAgICAgcmV0dXJuICc8ZGw+XG4lczwvZGw+XG4nICUgcmVzdWx0CisKKyAgICBkZWYgZG9jbW9kdWxlKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2Q9Tm9uZSwgKmlnbm9yZWQpOgorICAgICAgICAiIiJQcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgYSBtb2R1bGUgb2JqZWN0LiIiIgorICAgICAgICBuYW1lID0gb2JqZWN0Ll9fbmFtZV9fICMgaWdub3JlIHRoZSBwYXNzZWQtaW4gbmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhbGwgPSBvYmplY3QuX19hbGxfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBhbGwgPSBOb25lCisgICAgICAgIHBhcnRzID0gc3BsaXQobmFtZSwgJy4nKQorICAgICAgICBsaW5rcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihwYXJ0cyktMSk6CisgICAgICAgICAgICBsaW5rcy5hcHBlbmQoCisgICAgICAgICAgICAgICAgJzxhIGhyZWY9IiVzLmh0bWwiPjxmb250IGNvbG9yPSIjZmZmZmZmIj4lczwvZm9udD48L2E+JyAlCisgICAgICAgICAgICAgICAgKGpvaW4ocGFydHNbOmkrMV0sICcuJyksIHBhcnRzW2ldKSkKKyAgICAgICAgbGlua2VkbmFtZSA9IGpvaW4obGlua3MgKyBwYXJ0c1stMTpdLCAnLicpCisgICAgICAgIGhlYWQgPSAnPGJpZz48YmlnPjxzdHJvbmc+JXM8L3N0cm9uZz48L2JpZz48L2JpZz4nICUgbGlua2VkbmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXRoID0gaW5zcGVjdC5nZXRhYnNmaWxlKG9iamVjdCkKKyAgICAgICAgICAgIHVybCA9IHBhdGgKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgICAgIGltcG9ydCBudHVybDJwYXRoCisgICAgICAgICAgICAgICAgdXJsID0gbnR1cmwycGF0aC5wYXRobmFtZTJ1cmwocGF0aCkKKyAgICAgICAgICAgIGZpbGVsaW5rID0gJzxhIGhyZWY9ImZpbGU6JXMiPiVzPC9hPicgJSAodXJsLCBwYXRoKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgZmlsZWxpbmsgPSAnKGJ1aWx0LWluKScKKyAgICAgICAgaW5mbyA9IFtdCisgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCAnX192ZXJzaW9uX18nKToKKyAgICAgICAgICAgIHZlcnNpb24gPSBzdHIob2JqZWN0Ll9fdmVyc2lvbl9fKQorICAgICAgICAgICAgaWYgdmVyc2lvbls6MTFdID09ICckJyArICdSZXZpc2lvbjogJyBhbmQgdmVyc2lvblstMTpdID09ICckJzoKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gc3RyaXAodmVyc2lvblsxMTotMV0pCisgICAgICAgICAgICBpbmZvLmFwcGVuZCgndmVyc2lvbiAlcycgJSBzZWxmLmVzY2FwZSh2ZXJzaW9uKSkKKyAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX2RhdGVfXycpOgorICAgICAgICAgICAgaW5mby5hcHBlbmQoc2VsZi5lc2NhcGUoc3RyKG9iamVjdC5fX2RhdGVfXykpKQorICAgICAgICBpZiBpbmZvOgorICAgICAgICAgICAgaGVhZCA9IGhlYWQgKyAnICglcyknICUgam9pbihpbmZvLCAnLCAnKQorICAgICAgICBkb2Nsb2MgPSBzZWxmLmdldGRvY2xvYyhvYmplY3QpCisgICAgICAgIGlmIGRvY2xvYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRvY2xvYyA9ICc8YnI+PGEgaHJlZj0iJShkb2Nsb2MpcyI+TW9kdWxlIERvY3M8L2E+JyAlIGxvY2FscygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkb2Nsb2MgPSAnJworICAgICAgICByZXN1bHQgPSBzZWxmLmhlYWRpbmcoCisgICAgICAgICAgICBoZWFkLCAnI2ZmZmZmZicsICcjNzc5OWVlJywKKyAgICAgICAgICAgICc8YSBocmVmPSIuIj5pbmRleDwvYT48YnI+JyArIGZpbGVsaW5rICsgZG9jbG9jKQorCisgICAgICAgIG1vZHVsZXMgPSBpbnNwZWN0LmdldG1lbWJlcnMob2JqZWN0LCBpbnNwZWN0LmlzbW9kdWxlKQorCisgICAgICAgIGNsYXNzZXMsIGNkaWN0ID0gW10sIHt9CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGluc3BlY3QuZ2V0bWVtYmVycyhvYmplY3QsIGluc3BlY3QuaXNjbGFzcyk6CisgICAgICAgICAgICAjIGlmIF9fYWxsX18gZXhpc3RzLCBiZWxpZXZlIGl0LiAgT3RoZXJ3aXNlIHVzZSBvbGQgaGV1cmlzdGljLgorICAgICAgICAgICAgaWYgKGFsbCBpcyBub3QgTm9uZSBvcgorICAgICAgICAgICAgICAgIChpbnNwZWN0LmdldG1vZHVsZSh2YWx1ZSkgb3Igb2JqZWN0KSBpcyBvYmplY3QpOgorICAgICAgICAgICAgICAgIGlmIHZpc2libGVuYW1lKGtleSwgYWxsLCBvYmplY3QpOgorICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLmFwcGVuZCgoa2V5LCB2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIGNkaWN0W2tleV0gPSBjZGljdFt2YWx1ZV0gPSAnIycgKyBrZXkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gY2xhc3NlczoKKyAgICAgICAgICAgIGZvciBiYXNlIGluIHZhbHVlLl9fYmFzZXNfXzoKKyAgICAgICAgICAgICAgICBrZXksIG1vZG5hbWUgPSBiYXNlLl9fbmFtZV9fLCBiYXNlLl9fbW9kdWxlX18KKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlcy5nZXQobW9kbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBtb2RuYW1lICE9IG5hbWUgYW5kIG1vZHVsZSBhbmQgaGFzYXR0cihtb2R1bGUsIGtleSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGdldGF0dHIobW9kdWxlLCBrZXkpIGlzIGJhc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qga2V5IGluIGNkaWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkaWN0W2tleV0gPSBjZGljdFtiYXNlXSA9IG1vZG5hbWUgKyAnLmh0bWwjJyArIGtleQorICAgICAgICBmdW5jcywgZmRpY3QgPSBbXSwge30KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gaW5zcGVjdC5nZXRtZW1iZXJzKG9iamVjdCwgaW5zcGVjdC5pc3JvdXRpbmUpOgorICAgICAgICAgICAgIyBpZiBfX2FsbF9fIGV4aXN0cywgYmVsaWV2ZSBpdC4gIE90aGVyd2lzZSB1c2Ugb2xkIGhldXJpc3RpYy4KKyAgICAgICAgICAgIGlmIChhbGwgaXMgbm90IE5vbmUgb3IKKyAgICAgICAgICAgICAgICBpbnNwZWN0LmlzYnVpbHRpbih2YWx1ZSkgb3IgaW5zcGVjdC5nZXRtb2R1bGUodmFsdWUpIGlzIG9iamVjdCk6CisgICAgICAgICAgICAgICAgaWYgdmlzaWJsZW5hbWUoa2V5LCBhbGwsIG9iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmNzLmFwcGVuZCgoa2V5LCB2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIGZkaWN0W2tleV0gPSAnIy0nICsga2V5CisgICAgICAgICAgICAgICAgICAgIGlmIGluc3BlY3QuaXNmdW5jdGlvbih2YWx1ZSk6IGZkaWN0W3ZhbHVlXSA9IGZkaWN0W2tleV0KKyAgICAgICAgZGF0YSA9IFtdCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGluc3BlY3QuZ2V0bWVtYmVycyhvYmplY3QsIGlzZGF0YSk6CisgICAgICAgICAgICBpZiB2aXNpYmxlbmFtZShrZXksIGFsbCwgb2JqZWN0KToKKyAgICAgICAgICAgICAgICBkYXRhLmFwcGVuZCgoa2V5LCB2YWx1ZSkpCisKKyAgICAgICAgZG9jID0gc2VsZi5tYXJrdXAoZ2V0ZG9jKG9iamVjdCksIHNlbGYucHJlZm9ybWF0LCBmZGljdCwgY2RpY3QpCisgICAgICAgIGRvYyA9IGRvYyBhbmQgJzx0dD4lczwvdHQ+JyAlIGRvYworICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAnPHA+JXM8L3A+XG4nICUgZG9jCisKKyAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX3BhdGhfXycpOgorICAgICAgICAgICAgbW9kcGtncyA9IFtdCisgICAgICAgICAgICBmb3IgaW1wb3J0ZXIsIG1vZG5hbWUsIGlzcGtnIGluIHBrZ3V0aWwuaXRlcl9tb2R1bGVzKG9iamVjdC5fX3BhdGhfXyk6CisgICAgICAgICAgICAgICAgbW9kcGtncy5hcHBlbmQoKG1vZG5hbWUsIG5hbWUsIGlzcGtnLCAwKSkKKyAgICAgICAgICAgIG1vZHBrZ3Muc29ydCgpCisgICAgICAgICAgICBjb250ZW50cyA9IHNlbGYubXVsdGljb2x1bW4obW9kcGtncywgc2VsZi5tb2Rwa2dsaW5rKQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5iaWdzZWN0aW9uKAorICAgICAgICAgICAgICAgICdQYWNrYWdlIENvbnRlbnRzJywgJyNmZmZmZmYnLCAnI2FhNTVjYycsIGNvbnRlbnRzKQorICAgICAgICBlbGlmIG1vZHVsZXM6CisgICAgICAgICAgICBjb250ZW50cyA9IHNlbGYubXVsdGljb2x1bW4oCisgICAgICAgICAgICAgICAgbW9kdWxlcywgbGFtYmRhIGtleV92YWx1ZSwgcz1zZWxmOiBzLm1vZHVsZWxpbmsoa2V5X3ZhbHVlWzFdKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuYmlnc2VjdGlvbigKKyAgICAgICAgICAgICAgICAnTW9kdWxlcycsICcjZmZmZmZmJywgJyNhYTU1Y2MnLCBjb250ZW50cykKKworICAgICAgICBpZiBjbGFzc2VzOgorICAgICAgICAgICAgY2xhc3NsaXN0ID0gbWFwKGxhbWJkYSBrZXlfdmFsdWU6IGtleV92YWx1ZVsxXSwgY2xhc3NlcykKKyAgICAgICAgICAgIGNvbnRlbnRzID0gWworICAgICAgICAgICAgICAgIHNlbGYuZm9ybWF0dHJlZShpbnNwZWN0LmdldGNsYXNzdHJlZShjbGFzc2xpc3QsIDEpLCBuYW1lKV0KKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGNsYXNzZXM6CisgICAgICAgICAgICAgICAgY29udGVudHMuYXBwZW5kKHNlbGYuZG9jdW1lbnQodmFsdWUsIGtleSwgbmFtZSwgZmRpY3QsIGNkaWN0KSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuYmlnc2VjdGlvbigKKyAgICAgICAgICAgICAgICAnQ2xhc3NlcycsICcjZmZmZmZmJywgJyNlZTc3YWEnLCBqb2luKGNvbnRlbnRzKSkKKyAgICAgICAgaWYgZnVuY3M6CisgICAgICAgICAgICBjb250ZW50cyA9IFtdCisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBmdW5jczoKKyAgICAgICAgICAgICAgICBjb250ZW50cy5hcHBlbmQoc2VsZi5kb2N1bWVudCh2YWx1ZSwga2V5LCBuYW1lLCBmZGljdCwgY2RpY3QpKQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5iaWdzZWN0aW9uKAorICAgICAgICAgICAgICAgICdGdW5jdGlvbnMnLCAnI2ZmZmZmZicsICcjZWVhYTc3Jywgam9pbihjb250ZW50cykpCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICBjb250ZW50cyA9IFtdCisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkYXRhOgorICAgICAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZChzZWxmLmRvY3VtZW50KHZhbHVlLCBrZXkpKQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5iaWdzZWN0aW9uKAorICAgICAgICAgICAgICAgICdEYXRhJywgJyNmZmZmZmYnLCAnIzU1YWE1NScsIGpvaW4oY29udGVudHMsICc8YnI+XG4nKSkKKyAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX2F1dGhvcl9fJyk6CisgICAgICAgICAgICBjb250ZW50cyA9IHNlbGYubWFya3VwKHN0cihvYmplY3QuX19hdXRob3JfXyksIHNlbGYucHJlZm9ybWF0KQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5iaWdzZWN0aW9uKAorICAgICAgICAgICAgICAgICdBdXRob3InLCAnI2ZmZmZmZicsICcjNzc5OWVlJywgY29udGVudHMpCisgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCAnX19jcmVkaXRzX18nKToKKyAgICAgICAgICAgIGNvbnRlbnRzID0gc2VsZi5tYXJrdXAoc3RyKG9iamVjdC5fX2NyZWRpdHNfXyksIHNlbGYucHJlZm9ybWF0KQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5iaWdzZWN0aW9uKAorICAgICAgICAgICAgICAgICdDcmVkaXRzJywgJyNmZmZmZmYnLCAnIzc3OTllZScsIGNvbnRlbnRzKQorCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBkb2NjbGFzcyhzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsIGZ1bmNzPXt9LCBjbGFzc2VzPXt9LAorICAgICAgICAgICAgICAgICAqaWdub3JlZCk6CisgICAgICAgICIiIlByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uIGZvciBhIGNsYXNzIG9iamVjdC4iIiIKKyAgICAgICAgcmVhbG5hbWUgPSBvYmplY3QuX19uYW1lX18KKyAgICAgICAgbmFtZSA9IG5hbWUgb3IgcmVhbG5hbWUKKyAgICAgICAgYmFzZXMgPSBvYmplY3QuX19iYXNlc19fCisKKyAgICAgICAgY29udGVudHMgPSBbXQorICAgICAgICBwdXNoID0gY29udGVudHMuYXBwZW5kCisKKyAgICAgICAgIyBDdXRlIGxpdHRsZSBjbGFzcyB0byBwdW1wIG91dCBhIGhvcml6b250YWwgcnVsZSBiZXR3ZWVuIHNlY3Rpb25zLgorICAgICAgICBjbGFzcyBIb3Jpem9udGFsUnVsZToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLm5lZWRvbmUgPSAwCisgICAgICAgICAgICBkZWYgbWF5YmUoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5uZWVkb25lOgorICAgICAgICAgICAgICAgICAgICBwdXNoKCc8aHI+XG4nKQorICAgICAgICAgICAgICAgIHNlbGYubmVlZG9uZSA9IDEKKyAgICAgICAgaHIgPSBIb3Jpem9udGFsUnVsZSgpCisKKyAgICAgICAgIyBMaXN0IHRoZSBtcm8sIGlmIG5vbi10cml2aWFsLgorICAgICAgICBtcm8gPSBkZXF1ZShpbnNwZWN0LmdldG1ybyhvYmplY3QpKQorICAgICAgICBpZiBsZW4obXJvKSA+IDI6CisgICAgICAgICAgICBoci5tYXliZSgpCisgICAgICAgICAgICBwdXNoKCc8ZGw+PGR0Pk1ldGhvZCByZXNvbHV0aW9uIG9yZGVyOjwvZHQ+XG4nKQorICAgICAgICAgICAgZm9yIGJhc2UgaW4gbXJvOgorICAgICAgICAgICAgICAgIHB1c2goJzxkZD4lczwvZGQ+XG4nICUgc2VsZi5jbGFzc2xpbmsoYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5fX21vZHVsZV9fKSkKKyAgICAgICAgICAgIHB1c2goJzwvZGw+XG4nKQorCisgICAgICAgIGRlZiBzcGlsbChtc2csIGF0dHJzLCBwcmVkaWNhdGUpOgorICAgICAgICAgICAgb2ssIGF0dHJzID0gX3NwbGl0X2xpc3QoYXR0cnMsIHByZWRpY2F0ZSkKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIGhyLm1heWJlKCkKKyAgICAgICAgICAgICAgICBwdXNoKG1zZykKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSwga2luZCwgaG9tZWNscywgdmFsdWUgaW4gb2s6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihvYmplY3QsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAjIFNvbWUgZGVzY3JpcHRvcnMgbWF5IG1lZXQgYSBmYWlsdXJlIGluIHRoZWlyIF9fZ2V0X18uCisgICAgICAgICAgICAgICAgICAgICAgICAjIChidWcgIzE3ODUpCisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHNlbGYuX2RvY2Rlc2NyaXB0b3IobmFtZSwgdmFsdWUsIG1vZCkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHNlbGYuZG9jdW1lbnQodmFsdWUsIG5hbWUsIG1vZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcywgY2xhc3NlcywgbWRpY3QsIG9iamVjdCkpCisgICAgICAgICAgICAgICAgICAgIHB1c2goJ1xuJykKKyAgICAgICAgICAgIHJldHVybiBhdHRycworCisgICAgICAgIGRlZiBzcGlsbGRlc2NyaXB0b3JzKG1zZywgYXR0cnMsIHByZWRpY2F0ZSk6CisgICAgICAgICAgICBvaywgYXR0cnMgPSBfc3BsaXRfbGlzdChhdHRycywgcHJlZGljYXRlKQorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgaHIubWF5YmUoKQorICAgICAgICAgICAgICAgIHB1c2gobXNnKQorICAgICAgICAgICAgICAgIGZvciBuYW1lLCBraW5kLCBob21lY2xzLCB2YWx1ZSBpbiBvazoKKyAgICAgICAgICAgICAgICAgICAgcHVzaChzZWxmLl9kb2NkZXNjcmlwdG9yKG5hbWUsIHZhbHVlLCBtb2QpKQorICAgICAgICAgICAgcmV0dXJuIGF0dHJzCisKKyAgICAgICAgZGVmIHNwaWxsZGF0YShtc2csIGF0dHJzLCBwcmVkaWNhdGUpOgorICAgICAgICAgICAgb2ssIGF0dHJzID0gX3NwbGl0X2xpc3QoYXR0cnMsIHByZWRpY2F0ZSkKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIGhyLm1heWJlKCkKKyAgICAgICAgICAgICAgICBwdXNoKG1zZykKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSwga2luZCwgaG9tZWNscywgdmFsdWUgaW4gb2s6CisgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBzZWxmLmRvY290aGVyKGdldGF0dHIob2JqZWN0LCBuYW1lKSwgbmFtZSwgbW9kKQorICAgICAgICAgICAgICAgICAgICBpZiAoaGFzYXR0cih2YWx1ZSwgJ19fY2FsbF9fJykgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNwZWN0LmlzZGF0YWRlc2NyaXB0b3IodmFsdWUpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvYyA9IGdldGF0dHIodmFsdWUsICJfX2RvY19fIiwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvYyA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgaWYgZG9jIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKCc8ZGw+PGR0PiVzPC9kbD5cbicgJSBiYXNlKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZG9jID0gc2VsZi5tYXJrdXAoZ2V0ZG9jKHZhbHVlKSwgc2VsZi5wcmVmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jcywgY2xhc3NlcywgbWRpY3QpCisgICAgICAgICAgICAgICAgICAgICAgICBkb2MgPSAnPGRkPjx0dD4lczwvdHQ+JyAlIGRvYworICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCgnPGRsPjxkdD4lcyVzPC9kbD5cbicgJSAoYmFzZSwgZG9jKSkKKyAgICAgICAgICAgICAgICAgICAgcHVzaCgnXG4nKQorICAgICAgICAgICAgcmV0dXJuIGF0dHJzCisKKyAgICAgICAgYXR0cnMgPSBmaWx0ZXIobGFtYmRhIGRhdGE6IHZpc2libGVuYW1lKGRhdGFbMF0sIG9iaj1vYmplY3QpLAorICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmeV9jbGFzc19hdHRycyhvYmplY3QpKQorICAgICAgICBtZGljdCA9IHt9CisgICAgICAgIGZvciBrZXksIGtpbmQsIGhvbWVjbHMsIHZhbHVlIGluIGF0dHJzOgorICAgICAgICAgICAgbWRpY3Rba2V5XSA9IGFuY2hvciA9ICcjJyArIG5hbWUgKyAnLScgKyBrZXkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIob2JqZWN0LCBuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAjIFNvbWUgZGVzY3JpcHRvcnMgbWF5IG1lZXQgYSBmYWlsdXJlIGluIHRoZWlyIF9fZ2V0X18uCisgICAgICAgICAgICAgICAgIyAoYnVnICMxNzg1KQorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFRoZSB2YWx1ZSBtYXkgbm90IGJlIGhhc2hhYmxlIChlLmcuLCBhIGRhdGEgYXR0ciB3aXRoCisgICAgICAgICAgICAgICAgIyBhIGRpY3Qgb3IgbGlzdCB2YWx1ZSkuCisgICAgICAgICAgICAgICAgbWRpY3RbdmFsdWVdID0gYW5jaG9yCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICB3aGlsZSBhdHRyczoKKyAgICAgICAgICAgIGlmIG1ybzoKKyAgICAgICAgICAgICAgICB0aGlzY2xhc3MgPSBtcm8ucG9wbGVmdCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRoaXNjbGFzcyA9IGF0dHJzWzBdWzJdCisgICAgICAgICAgICBhdHRycywgaW5oZXJpdGVkID0gX3NwbGl0X2xpc3QoYXR0cnMsIGxhbWJkYSB0OiB0WzJdIGlzIHRoaXNjbGFzcykKKworICAgICAgICAgICAgaWYgdGhpc2NsYXNzIGlzIF9fYnVpbHRpbl9fLm9iamVjdDoKKyAgICAgICAgICAgICAgICBhdHRycyA9IGluaGVyaXRlZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRoaXNjbGFzcyBpcyBvYmplY3Q6CisgICAgICAgICAgICAgICAgdGFnID0gJ2RlZmluZWQgaGVyZScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGFnID0gJ2luaGVyaXRlZCBmcm9tICVzJyAlIHNlbGYuY2xhc3NsaW5rKHRoaXNjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Ll9fbW9kdWxlX18pCisgICAgICAgICAgICB0YWcgKz0gJzo8YnI+XG4nCisKKyAgICAgICAgICAgICMgU29ydCBhdHRycyBieSBuYW1lLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGF0dHJzLnNvcnQoa2V5PWxhbWJkYSB0OiB0WzBdKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBhdHRycy5zb3J0KGxhbWJkYSB0MSwgdDI6IGNtcCh0MVswXSwgdDJbMF0pKSAgICAjIDIuMyBjb21wYXQKKworICAgICAgICAgICAgIyBQdW1wIG91dCB0aGUgYXR0cnMsIHNlZ3JlZ2F0ZWQgYnkga2luZC4KKyAgICAgICAgICAgIGF0dHJzID0gc3BpbGwoJ01ldGhvZHMgJXMnICUgdGFnLCBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHQ6IHRbMV0gPT0gJ21ldGhvZCcpCisgICAgICAgICAgICBhdHRycyA9IHNwaWxsKCdDbGFzcyBtZXRob2RzICVzJyAlIHRhZywgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSB0OiB0WzFdID09ICdjbGFzcyBtZXRob2QnKQorICAgICAgICAgICAgYXR0cnMgPSBzcGlsbCgnU3RhdGljIG1ldGhvZHMgJXMnICUgdGFnLCBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHQ6IHRbMV0gPT0gJ3N0YXRpYyBtZXRob2QnKQorICAgICAgICAgICAgYXR0cnMgPSBzcGlsbGRlc2NyaXB0b3JzKCdEYXRhIGRlc2NyaXB0b3JzICVzJyAlIHRhZywgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHQ6IHRbMV0gPT0gJ2RhdGEgZGVzY3JpcHRvcicpCisgICAgICAgICAgICBhdHRycyA9IHNwaWxsZGF0YSgnRGF0YSBhbmQgb3RoZXIgYXR0cmlidXRlcyAlcycgJSB0YWcsIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHQ6IHRbMV0gPT0gJ2RhdGEnKQorICAgICAgICAgICAgYXNzZXJ0IGF0dHJzID09IFtdCisgICAgICAgICAgICBhdHRycyA9IGluaGVyaXRlZAorCisgICAgICAgIGNvbnRlbnRzID0gJycuam9pbihjb250ZW50cykKKworICAgICAgICBpZiBuYW1lID09IHJlYWxuYW1lOgorICAgICAgICAgICAgdGl0bGUgPSAnPGEgbmFtZT0iJXMiPmNsYXNzIDxzdHJvbmc+JXM8L3N0cm9uZz48L2E+JyAlICgKKyAgICAgICAgICAgICAgICBuYW1lLCByZWFsbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRpdGxlID0gJzxzdHJvbmc+JXM8L3N0cm9uZz4gPSA8YSBuYW1lPSIlcyI+Y2xhc3MgJXM8L2E+JyAlICgKKyAgICAgICAgICAgICAgICBuYW1lLCBuYW1lLCByZWFsbmFtZSkKKyAgICAgICAgaWYgYmFzZXM6CisgICAgICAgICAgICBwYXJlbnRzID0gW10KKyAgICAgICAgICAgIGZvciBiYXNlIGluIGJhc2VzOgorICAgICAgICAgICAgICAgIHBhcmVudHMuYXBwZW5kKHNlbGYuY2xhc3NsaW5rKGJhc2UsIG9iamVjdC5fX21vZHVsZV9fKSkKKyAgICAgICAgICAgIHRpdGxlID0gdGl0bGUgKyAnKCVzKScgJSBqb2luKHBhcmVudHMsICcsICcpCisgICAgICAgIGRvYyA9IHNlbGYubWFya3VwKGdldGRvYyhvYmplY3QpLCBzZWxmLnByZWZvcm1hdCwgZnVuY3MsIGNsYXNzZXMsIG1kaWN0KQorICAgICAgICBkb2MgPSBkb2MgYW5kICc8dHQ+JXM8YnI+Jm5ic3A7PC90dD4nICUgZG9jCisKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VjdGlvbih0aXRsZSwgJyMwMDAwMDAnLCAnI2ZmYzhkOCcsIGNvbnRlbnRzLCAzLCBkb2MpCisKKyAgICBkZWYgZm9ybWF0dmFsdWUoc2VsZiwgb2JqZWN0KToKKyAgICAgICAgIiIiRm9ybWF0IGFuIGFyZ3VtZW50IGRlZmF1bHQgdmFsdWUgYXMgdGV4dC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ3JleSgnPScgKyBzZWxmLnJlcHIob2JqZWN0KSkKKworICAgIGRlZiBkb2Nyb3V0aW5lKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2Q9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICBmdW5jcz17fSwgY2xhc3Nlcz17fSwgbWV0aG9kcz17fSwgY2w9Tm9uZSk6CisgICAgICAgICIiIlByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uIGZvciBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBvYmplY3QuIiIiCisgICAgICAgIHJlYWxuYW1lID0gb2JqZWN0Ll9fbmFtZV9fCisgICAgICAgIG5hbWUgPSBuYW1lIG9yIHJlYWxuYW1lCisgICAgICAgIGFuY2hvciA9IChjbCBhbmQgY2wuX19uYW1lX18gb3IgJycpICsgJy0nICsgbmFtZQorICAgICAgICBub3RlID0gJycKKyAgICAgICAgc2tpcGRvY3MgPSAwCisgICAgICAgIGlmIGluc3BlY3QuaXNtZXRob2Qob2JqZWN0KToKKyAgICAgICAgICAgIGltY2xhc3MgPSBvYmplY3QuaW1fY2xhc3MKKyAgICAgICAgICAgIGlmIGNsOgorICAgICAgICAgICAgICAgIGlmIGltY2xhc3MgaXMgbm90IGNsOgorICAgICAgICAgICAgICAgICAgICBub3RlID0gJyBmcm9tICcgKyBzZWxmLmNsYXNzbGluayhpbWNsYXNzLCBtb2QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG9iamVjdC5pbV9zZWxmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBub3RlID0gJyBtZXRob2Qgb2YgJXMgaW5zdGFuY2UnICUgc2VsZi5jbGFzc2xpbmsoCisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuaW1fc2VsZi5fX2NsYXNzX18sIG1vZCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBub3RlID0gJyB1bmJvdW5kICVzIG1ldGhvZCcgJSBzZWxmLmNsYXNzbGluayhpbWNsYXNzLG1vZCkKKyAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdC5pbV9mdW5jCisKKyAgICAgICAgaWYgbmFtZSA9PSByZWFsbmFtZToKKyAgICAgICAgICAgIHRpdGxlID0gJzxhIG5hbWU9IiVzIj48c3Ryb25nPiVzPC9zdHJvbmc+PC9hPicgJSAoYW5jaG9yLCByZWFsbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIChjbCBhbmQgcmVhbG5hbWUgaW4gY2wuX19kaWN0X18gYW5kCisgICAgICAgICAgICAgICAgY2wuX19kaWN0X19bcmVhbG5hbWVdIGlzIG9iamVjdCk6CisgICAgICAgICAgICAgICAgcmVhbGxpbmsgPSAnPGEgaHJlZj0iIyVzIj4lczwvYT4nICUgKAorICAgICAgICAgICAgICAgICAgICBjbC5fX25hbWVfXyArICctJyArIHJlYWxuYW1lLCByZWFsbmFtZSkKKyAgICAgICAgICAgICAgICBza2lwZG9jcyA9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVhbGxpbmsgPSByZWFsbmFtZQorICAgICAgICAgICAgdGl0bGUgPSAnPGEgbmFtZT0iJXMiPjxzdHJvbmc+JXM8L3N0cm9uZz48L2E+ID0gJXMnICUgKAorICAgICAgICAgICAgICAgIGFuY2hvciwgbmFtZSwgcmVhbGxpbmspCisgICAgICAgIGlmIGluc3BlY3QuaXNmdW5jdGlvbihvYmplY3QpOgorICAgICAgICAgICAgYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzID0gaW5zcGVjdC5nZXRhcmdzcGVjKG9iamVjdCkKKyAgICAgICAgICAgIGFyZ3NwZWMgPSBpbnNwZWN0LmZvcm1hdGFyZ3NwZWMoCisgICAgICAgICAgICAgICAgYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzLCBmb3JtYXR2YWx1ZT1zZWxmLmZvcm1hdHZhbHVlKQorICAgICAgICAgICAgaWYgcmVhbG5hbWUgPT0gJzxsYW1iZGE+JzoKKyAgICAgICAgICAgICAgICB0aXRsZSA9ICc8c3Ryb25nPiVzPC9zdHJvbmc+IDxlbT5sYW1iZGE8L2VtPiAnICUgbmFtZQorICAgICAgICAgICAgICAgIGFyZ3NwZWMgPSBhcmdzcGVjWzE6LTFdICMgcmVtb3ZlIHBhcmVudGhlc2VzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcmdzcGVjID0gJyguLi4pJworCisgICAgICAgIGRlY2wgPSB0aXRsZSArIGFyZ3NwZWMgKyAobm90ZSBhbmQgc2VsZi5ncmV5KAorICAgICAgICAgICAgICAgJzxmb250IGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPiVzPC9mb250PicgJSBub3RlKSkKKworICAgICAgICBpZiBza2lwZG9jczoKKyAgICAgICAgICAgIHJldHVybiAnPGRsPjxkdD4lczwvZHQ+PC9kbD5cbicgJSBkZWNsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkb2MgPSBzZWxmLm1hcmt1cCgKKyAgICAgICAgICAgICAgICBnZXRkb2Mob2JqZWN0KSwgc2VsZi5wcmVmb3JtYXQsIGZ1bmNzLCBjbGFzc2VzLCBtZXRob2RzKQorICAgICAgICAgICAgZG9jID0gZG9jIGFuZCAnPGRkPjx0dD4lczwvdHQ+PC9kZD4nICUgZG9jCisgICAgICAgICAgICByZXR1cm4gJzxkbD48ZHQ+JXM8L2R0PiVzPC9kbD5cbicgJSAoZGVjbCwgZG9jKQorCisgICAgZGVmIF9kb2NkZXNjcmlwdG9yKHNlbGYsIG5hbWUsIHZhbHVlLCBtb2QpOgorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgcHVzaCA9IHJlc3VsdHMuYXBwZW5kCisKKyAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgIHB1c2goJzxkbD48ZHQ+PHN0cm9uZz4lczwvc3Ryb25nPjwvZHQ+XG4nICUgbmFtZSkKKyAgICAgICAgaWYgdmFsdWUuX19kb2NfXyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRvYyA9IHNlbGYubWFya3VwKGdldGRvYyh2YWx1ZSksIHNlbGYucHJlZm9ybWF0KQorICAgICAgICAgICAgcHVzaCgnPGRkPjx0dD4lczwvdHQ+PC9kZD5cbicgJSBkb2MpCisgICAgICAgIHB1c2goJzwvZGw+XG4nKQorCisgICAgICAgIHJldHVybiAnJy5qb2luKHJlc3VsdHMpCisKKyAgICBkZWYgZG9jcHJvcGVydHkoc2VsZiwgb2JqZWN0LCBuYW1lPU5vbmUsIG1vZD1Ob25lLCBjbD1Ob25lKToKKyAgICAgICAgIiIiUHJvZHVjZSBodG1sIGRvY3VtZW50YXRpb24gZm9yIGEgcHJvcGVydHkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9kb2NkZXNjcmlwdG9yKG5hbWUsIG9iamVjdCwgbW9kKQorCisgICAgZGVmIGRvY290aGVyKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2Q9Tm9uZSwgKmlnbm9yZWQpOgorICAgICAgICAiIiJQcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgYSBkYXRhIG9iamVjdC4iIiIKKyAgICAgICAgbGhzID0gbmFtZSBhbmQgJzxzdHJvbmc+JXM8L3N0cm9uZz4gPSAnICUgbmFtZSBvciAnJworICAgICAgICByZXR1cm4gbGhzICsgc2VsZi5yZXByKG9iamVjdCkKKworICAgIGRlZiBkb2NkYXRhKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2Q9Tm9uZSwgY2w9Tm9uZSk6CisgICAgICAgICIiIlByb2R1Y2UgaHRtbCBkb2N1bWVudGF0aW9uIGZvciBhIGRhdGEgZGVzY3JpcHRvci4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvY2Rlc2NyaXB0b3IobmFtZSwgb2JqZWN0LCBtb2QpCisKKyAgICBkZWYgaW5kZXgoc2VsZiwgZGlyLCBzaGFkb3dlZD1Ob25lKToKKyAgICAgICAgIiIiR2VuZXJhdGUgYW4gSFRNTCBpbmRleCBmb3IgYSBkaXJlY3Rvcnkgb2YgbW9kdWxlcy4iIiIKKyAgICAgICAgbW9kcGtncyA9IFtdCisgICAgICAgIGlmIHNoYWRvd2VkIGlzIE5vbmU6IHNoYWRvd2VkID0ge30KKyAgICAgICAgZm9yIGltcG9ydGVyLCBuYW1lLCBpc3BrZyBpbiBwa2d1dGlsLml0ZXJfbW9kdWxlcyhbZGlyXSk6CisgICAgICAgICAgICBtb2Rwa2dzLmFwcGVuZCgobmFtZSwgJycsIGlzcGtnLCBuYW1lIGluIHNoYWRvd2VkKSkKKyAgICAgICAgICAgIHNoYWRvd2VkW25hbWVdID0gMQorCisgICAgICAgIG1vZHBrZ3Muc29ydCgpCisgICAgICAgIGNvbnRlbnRzID0gc2VsZi5tdWx0aWNvbHVtbihtb2Rwa2dzLCBzZWxmLm1vZHBrZ2xpbmspCisgICAgICAgIHJldHVybiBzZWxmLmJpZ3NlY3Rpb24oZGlyLCAnI2ZmZmZmZicsICcjZWU3N2FhJywgY29udGVudHMpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdGV4dCBkb2N1bWVudGF0aW9uIGdlbmVyYXRvcgorCitjbGFzcyBUZXh0UmVwcihSZXByKToKKyAgICAiIiJDbGFzcyBmb3Igc2FmZWx5IG1ha2luZyBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgYSBQeXRob24gb2JqZWN0LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgUmVwci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLm1heGxpc3QgPSBzZWxmLm1heHR1cGxlID0gMjAKKyAgICAgICAgc2VsZi5tYXhkaWN0ID0gMTAKKyAgICAgICAgc2VsZi5tYXhzdHJpbmcgPSBzZWxmLm1heG90aGVyID0gMTAwCisKKyAgICBkZWYgcmVwcjEoc2VsZiwgeCwgbGV2ZWwpOgorICAgICAgICBpZiBoYXNhdHRyKHR5cGUoeCksICdfX25hbWVfXycpOgorICAgICAgICAgICAgbWV0aG9kbmFtZSA9ICdyZXByXycgKyBqb2luKHNwbGl0KHR5cGUoeCkuX19uYW1lX18pLCAnXycpCisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIG1ldGhvZG5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIG1ldGhvZG5hbWUpKHgsIGxldmVsKQorICAgICAgICByZXR1cm4gY3JhbShzdHJpcGlkKHJlcHIoeCkpLCBzZWxmLm1heG90aGVyKQorCisgICAgZGVmIHJlcHJfc3RyaW5nKHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgdGVzdCA9IGNyYW0oeCwgc2VsZi5tYXhzdHJpbmcpCisgICAgICAgIHRlc3RyZXByID0gcmVwcih0ZXN0KQorICAgICAgICBpZiAnXFwnIGluIHRlc3QgYW5kICdcXCcgbm90IGluIHJlcGxhY2UodGVzdHJlcHIsIHInXFwnLCAnJyk6CisgICAgICAgICAgICAjIEJhY2tzbGFzaGVzIGFyZSBvbmx5IGxpdGVyYWwgaW4gdGhlIHN0cmluZyBhbmQgYXJlIG5ldmVyCisgICAgICAgICAgICAjIG5lZWRlZCB0byBtYWtlIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMsIHNvIHNob3cgYSByYXcgc3RyaW5nLgorICAgICAgICAgICAgcmV0dXJuICdyJyArIHRlc3RyZXByWzBdICsgdGVzdCArIHRlc3RyZXByWzBdCisgICAgICAgIHJldHVybiB0ZXN0cmVwcgorCisgICAgcmVwcl9zdHIgPSByZXByX3N0cmluZworCisgICAgZGVmIHJlcHJfaW5zdGFuY2Uoc2VsZiwgeCwgbGV2ZWwpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gY3JhbShzdHJpcGlkKHJlcHIoeCkpLCBzZWxmLm1heHN0cmluZykKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuICc8JXMgaW5zdGFuY2U+JyAlIHguX19jbGFzc19fLl9fbmFtZV9fCisKK2NsYXNzIFRleHREb2MoRG9jKToKKyAgICAiIiJGb3JtYXR0ZXIgY2xhc3MgZm9yIHRleHQgZG9jdW1lbnRhdGlvbi4iIiIKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0ZXh0IGZvcm1hdHRpbmcgdXRpbGl0aWVzCisKKyAgICBfcmVwcl9pbnN0YW5jZSA9IFRleHRSZXByKCkKKyAgICByZXByID0gX3JlcHJfaW5zdGFuY2UucmVwcgorCisgICAgZGVmIGJvbGQoc2VsZiwgdGV4dCk6CisgICAgICAgICIiIkZvcm1hdCBhIHN0cmluZyBpbiBib2xkIGJ5IG92ZXJzdHJpa2luZy4iIiIKKyAgICAgICAgcmV0dXJuIGpvaW4obWFwKGxhbWJkYSBjaDogY2ggKyAnXGInICsgY2gsIHRleHQpLCAnJykKKworICAgIGRlZiBpbmRlbnQoc2VsZiwgdGV4dCwgcHJlZml4PScgICAgJyk6CisgICAgICAgICIiIkluZGVudCB0ZXh0IGJ5IHByZXBlbmRpbmcgYSBnaXZlbiBwcmVmaXggdG8gZWFjaCBsaW5lLiIiIgorICAgICAgICBpZiBub3QgdGV4dDogcmV0dXJuICcnCisgICAgICAgIGxpbmVzID0gc3BsaXQodGV4dCwgJ1xuJykKKyAgICAgICAgbGluZXMgPSBtYXAobGFtYmRhIGxpbmUsIHByZWZpeD1wcmVmaXg6IHByZWZpeCArIGxpbmUsIGxpbmVzKQorICAgICAgICBpZiBsaW5lczogbGluZXNbLTFdID0gcnN0cmlwKGxpbmVzWy0xXSkKKyAgICAgICAgcmV0dXJuIGpvaW4obGluZXMsICdcbicpCisKKyAgICBkZWYgc2VjdGlvbihzZWxmLCB0aXRsZSwgY29udGVudHMpOgorICAgICAgICAiIiJGb3JtYXQgYSBzZWN0aW9uIHdpdGggYSBnaXZlbiBoZWFkaW5nLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5ib2xkKHRpdGxlKSArICdcbicgKyByc3RyaXAoc2VsZi5pbmRlbnQoY29udGVudHMpKSArICdcblxuJworCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGUtc3BlY2lmaWMgcm91dGluZXMKKworICAgIGRlZiBmb3JtYXR0cmVlKHNlbGYsIHRyZWUsIG1vZG5hbWUsIHBhcmVudD1Ob25lLCBwcmVmaXg9JycpOgorICAgICAgICAiIiJSZW5kZXIgaW4gdGV4dCBhIGNsYXNzIHRyZWUgYXMgcmV0dXJuZWQgYnkgaW5zcGVjdC5nZXRjbGFzc3RyZWUoKS4iIiIKKyAgICAgICAgcmVzdWx0ID0gJycKKyAgICAgICAgZm9yIGVudHJ5IGluIHRyZWU6CisgICAgICAgICAgICBpZiB0eXBlKGVudHJ5KSBpcyB0eXBlKCgpKToKKyAgICAgICAgICAgICAgICBjLCBiYXNlcyA9IGVudHJ5CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgcHJlZml4ICsgY2xhc3NuYW1lKGMsIG1vZG5hbWUpCisgICAgICAgICAgICAgICAgaWYgYmFzZXMgYW5kIGJhc2VzICE9IChwYXJlbnQsKToKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50cyA9IG1hcChsYW1iZGEgYywgbT1tb2RuYW1lOiBjbGFzc25hbWUoYywgbSksIGJhc2VzKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAnKCVzKScgJSBqb2luKHBhcmVudHMsICcsICcpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgJ1xuJworICAgICAgICAgICAgZWxpZiB0eXBlKGVudHJ5KSBpcyB0eXBlKFtdKToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLmZvcm1hdHRyZWUoCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LCBtb2RuYW1lLCBjLCBwcmVmaXggKyAnICAgICcpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBkb2Ntb2R1bGUoc2VsZiwgb2JqZWN0LCBuYW1lPU5vbmUsIG1vZD1Ob25lKToKKyAgICAgICAgIiIiUHJvZHVjZSB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIGEgZ2l2ZW4gbW9kdWxlIG9iamVjdC4iIiIKKyAgICAgICAgbmFtZSA9IG9iamVjdC5fX25hbWVfXyAjIGlnbm9yZSB0aGUgcGFzc2VkLWluIG5hbWUKKyAgICAgICAgc3lub3AsIGRlc2MgPSBzcGxpdGRvYyhnZXRkb2Mob2JqZWN0KSkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZWN0aW9uKCdOQU1FJywgbmFtZSArIChzeW5vcCBhbmQgJyAtICcgKyBzeW5vcCkpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYWxsID0gb2JqZWN0Ll9fYWxsX18KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgYWxsID0gTm9uZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGUgPSBpbnNwZWN0LmdldGFic2ZpbGUob2JqZWN0KQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgZmlsZSA9ICcoYnVpbHQtaW4pJworICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oJ0ZJTEUnLCBmaWxlKQorCisgICAgICAgIGRvY2xvYyA9IHNlbGYuZ2V0ZG9jbG9jKG9iamVjdCkKKyAgICAgICAgaWYgZG9jbG9jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5zZWN0aW9uKCdNT0RVTEUgRE9DUycsIGRvY2xvYykKKworICAgICAgICBpZiBkZXNjOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5zZWN0aW9uKCdERVNDUklQVElPTicsIGRlc2MpCisKKyAgICAgICAgY2xhc3NlcyA9IFtdCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGluc3BlY3QuZ2V0bWVtYmVycyhvYmplY3QsIGluc3BlY3QuaXNjbGFzcyk6CisgICAgICAgICAgICAjIGlmIF9fYWxsX18gZXhpc3RzLCBiZWxpZXZlIGl0LiAgT3RoZXJ3aXNlIHVzZSBvbGQgaGV1cmlzdGljLgorICAgICAgICAgICAgaWYgKGFsbCBpcyBub3QgTm9uZQorICAgICAgICAgICAgICAgIG9yIChpbnNwZWN0LmdldG1vZHVsZSh2YWx1ZSkgb3Igb2JqZWN0KSBpcyBvYmplY3QpOgorICAgICAgICAgICAgICAgIGlmIHZpc2libGVuYW1lKGtleSwgYWxsLCBvYmplY3QpOgorICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLmFwcGVuZCgoa2V5LCB2YWx1ZSkpCisgICAgICAgIGZ1bmNzID0gW10KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gaW5zcGVjdC5nZXRtZW1iZXJzKG9iamVjdCwgaW5zcGVjdC5pc3JvdXRpbmUpOgorICAgICAgICAgICAgIyBpZiBfX2FsbF9fIGV4aXN0cywgYmVsaWV2ZSBpdC4gIE90aGVyd2lzZSB1c2Ugb2xkIGhldXJpc3RpYy4KKyAgICAgICAgICAgIGlmIChhbGwgaXMgbm90IE5vbmUgb3IKKyAgICAgICAgICAgICAgICBpbnNwZWN0LmlzYnVpbHRpbih2YWx1ZSkgb3IgaW5zcGVjdC5nZXRtb2R1bGUodmFsdWUpIGlzIG9iamVjdCk6CisgICAgICAgICAgICAgICAgaWYgdmlzaWJsZW5hbWUoa2V5LCBhbGwsIG9iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmNzLmFwcGVuZCgoa2V5LCB2YWx1ZSkpCisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBpbnNwZWN0LmdldG1lbWJlcnMob2JqZWN0LCBpc2RhdGEpOgorICAgICAgICAgICAgaWYgdmlzaWJsZW5hbWUoa2V5LCBhbGwsIG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQoKGtleSwgdmFsdWUpKQorCisgICAgICAgIG1vZHBrZ3MgPSBbXQorICAgICAgICBtb2Rwa2dzX25hbWVzID0gc2V0KCkKKyAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX3BhdGhfXycpOgorICAgICAgICAgICAgZm9yIGltcG9ydGVyLCBtb2RuYW1lLCBpc3BrZyBpbiBwa2d1dGlsLml0ZXJfbW9kdWxlcyhvYmplY3QuX19wYXRoX18pOgorICAgICAgICAgICAgICAgIG1vZHBrZ3NfbmFtZXMuYWRkKG1vZG5hbWUpCisgICAgICAgICAgICAgICAgaWYgaXNwa2c6CisgICAgICAgICAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKG1vZG5hbWUgKyAnIChwYWNrYWdlKScpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbW9kcGtncy5hcHBlbmQobW9kbmFtZSkKKworICAgICAgICAgICAgbW9kcGtncy5zb3J0KCkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuc2VjdGlvbigKKyAgICAgICAgICAgICAgICAnUEFDS0FHRSBDT05URU5UUycsIGpvaW4obW9kcGtncywgJ1xuJykpCisKKyAgICAgICAgIyBEZXRlY3Qgc3VibW9kdWxlcyBhcyBzb21ldGltZXMgY3JlYXRlZCBieSBDIGV4dGVuc2lvbnMKKyAgICAgICAgc3VibW9kdWxlcyA9IFtdCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGluc3BlY3QuZ2V0bWVtYmVycyhvYmplY3QsIGluc3BlY3QuaXNtb2R1bGUpOgorICAgICAgICAgICAgaWYgdmFsdWUuX19uYW1lX18uc3RhcnRzd2l0aChuYW1lICsgJy4nKSBhbmQga2V5IG5vdCBpbiBtb2Rwa2dzX25hbWVzOgorICAgICAgICAgICAgICAgIHN1Ym1vZHVsZXMuYXBwZW5kKGtleSkKKyAgICAgICAgaWYgc3VibW9kdWxlczoKKyAgICAgICAgICAgIHN1Ym1vZHVsZXMuc29ydCgpCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oCisgICAgICAgICAgICAgICAgJ1NVQk1PRFVMRVMnLCBqb2luKHN1Ym1vZHVsZXMsICdcbicpKQorCisgICAgICAgIGlmIGNsYXNzZXM6CisgICAgICAgICAgICBjbGFzc2xpc3QgPSBtYXAobGFtYmRhIGtleV92YWx1ZToga2V5X3ZhbHVlWzFdLCBjbGFzc2VzKQorICAgICAgICAgICAgY29udGVudHMgPSBbc2VsZi5mb3JtYXR0cmVlKAorICAgICAgICAgICAgICAgIGluc3BlY3QuZ2V0Y2xhc3N0cmVlKGNsYXNzbGlzdCwgMSksIG5hbWUpXQorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gY2xhc3NlczoKKyAgICAgICAgICAgICAgICBjb250ZW50cy5hcHBlbmQoc2VsZi5kb2N1bWVudCh2YWx1ZSwga2V5LCBuYW1lKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuc2VjdGlvbignQ0xBU1NFUycsIGpvaW4oY29udGVudHMsICdcbicpKQorCisgICAgICAgIGlmIGZ1bmNzOgorICAgICAgICAgICAgY29udGVudHMgPSBbXQorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZnVuY3M6CisgICAgICAgICAgICAgICAgY29udGVudHMuYXBwZW5kKHNlbGYuZG9jdW1lbnQodmFsdWUsIGtleSwgbmFtZSkpCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oJ0ZVTkNUSU9OUycsIGpvaW4oY29udGVudHMsICdcbicpKQorCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICBjb250ZW50cyA9IFtdCisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkYXRhOgorICAgICAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZChzZWxmLmRvY290aGVyKHZhbHVlLCBrZXksIG5hbWUsIG1heGxlbj03MCkpCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oJ0RBVEEnLCBqb2luKGNvbnRlbnRzLCAnXG4nKSkKKworICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fdmVyc2lvbl9fJyk6CisgICAgICAgICAgICB2ZXJzaW9uID0gc3RyKG9iamVjdC5fX3ZlcnNpb25fXykKKyAgICAgICAgICAgIGlmIHZlcnNpb25bOjExXSA9PSAnJCcgKyAnUmV2aXNpb246ICcgYW5kIHZlcnNpb25bLTE6XSA9PSAnJCc6CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHN0cmlwKHZlcnNpb25bMTE6LTFdKQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5zZWN0aW9uKCdWRVJTSU9OJywgdmVyc2lvbikKKyAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX2RhdGVfXycpOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5zZWN0aW9uKCdEQVRFJywgc3RyKG9iamVjdC5fX2RhdGVfXykpCisgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCAnX19hdXRob3JfXycpOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5zZWN0aW9uKCdBVVRIT1InLCBzdHIob2JqZWN0Ll9fYXV0aG9yX18pKQorICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fY3JlZGl0c19fJyk6CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oJ0NSRURJVFMnLCBzdHIob2JqZWN0Ll9fY3JlZGl0c19fKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGRvY2NsYXNzKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2Q9Tm9uZSwgKmlnbm9yZWQpOgorICAgICAgICAiIiJQcm9kdWNlIHRleHQgZG9jdW1lbnRhdGlvbiBmb3IgYSBnaXZlbiBjbGFzcyBvYmplY3QuIiIiCisgICAgICAgIHJlYWxuYW1lID0gb2JqZWN0Ll9fbmFtZV9fCisgICAgICAgIG5hbWUgPSBuYW1lIG9yIHJlYWxuYW1lCisgICAgICAgIGJhc2VzID0gb2JqZWN0Ll9fYmFzZXNfXworCisgICAgICAgIGRlZiBtYWtlbmFtZShjLCBtPW9iamVjdC5fX21vZHVsZV9fKToKKyAgICAgICAgICAgIHJldHVybiBjbGFzc25hbWUoYywgbSkKKworICAgICAgICBpZiBuYW1lID09IHJlYWxuYW1lOgorICAgICAgICAgICAgdGl0bGUgPSAnY2xhc3MgJyArIHNlbGYuYm9sZChyZWFsbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRpdGxlID0gc2VsZi5ib2xkKG5hbWUpICsgJyA9IGNsYXNzICcgKyByZWFsbmFtZQorICAgICAgICBpZiBiYXNlczoKKyAgICAgICAgICAgIHBhcmVudHMgPSBtYXAobWFrZW5hbWUsIGJhc2VzKQorICAgICAgICAgICAgdGl0bGUgPSB0aXRsZSArICcoJXMpJyAlIGpvaW4ocGFyZW50cywgJywgJykKKworICAgICAgICBkb2MgPSBnZXRkb2Mob2JqZWN0KQorICAgICAgICBjb250ZW50cyA9IGRvYyBhbmQgW2RvYyArICdcbiddIG9yIFtdCisgICAgICAgIHB1c2ggPSBjb250ZW50cy5hcHBlbmQKKworICAgICAgICAjIExpc3QgdGhlIG1ybywgaWYgbm9uLXRyaXZpYWwuCisgICAgICAgIG1ybyA9IGRlcXVlKGluc3BlY3QuZ2V0bXJvKG9iamVjdCkpCisgICAgICAgIGlmIGxlbihtcm8pID4gMjoKKyAgICAgICAgICAgIHB1c2goIk1ldGhvZCByZXNvbHV0aW9uIG9yZGVyOiIpCisgICAgICAgICAgICBmb3IgYmFzZSBpbiBtcm86CisgICAgICAgICAgICAgICAgcHVzaCgnICAgICcgKyBtYWtlbmFtZShiYXNlKSkKKyAgICAgICAgICAgIHB1c2goJycpCisKKyAgICAgICAgIyBDdXRlIGxpdHRsZSBjbGFzcyB0byBwdW1wIG91dCBhIGhvcml6b250YWwgcnVsZSBiZXR3ZWVuIHNlY3Rpb25zLgorICAgICAgICBjbGFzcyBIb3Jpem9udGFsUnVsZToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLm5lZWRvbmUgPSAwCisgICAgICAgICAgICBkZWYgbWF5YmUoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5uZWVkb25lOgorICAgICAgICAgICAgICAgICAgICBwdXNoKCctJyAqIDcwKQorICAgICAgICAgICAgICAgIHNlbGYubmVlZG9uZSA9IDEKKyAgICAgICAgaHIgPSBIb3Jpem9udGFsUnVsZSgpCisKKyAgICAgICAgZGVmIHNwaWxsKG1zZywgYXR0cnMsIHByZWRpY2F0ZSk6CisgICAgICAgICAgICBvaywgYXR0cnMgPSBfc3BsaXRfbGlzdChhdHRycywgcHJlZGljYXRlKQorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgaHIubWF5YmUoKQorICAgICAgICAgICAgICAgIHB1c2gobXNnKQorICAgICAgICAgICAgICAgIGZvciBuYW1lLCBraW5kLCBob21lY2xzLCB2YWx1ZSBpbiBvazoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKG9iamVjdCwgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgU29tZSBkZXNjcmlwdG9ycyBtYXkgbWVldCBhIGZhaWx1cmUgaW4gdGhlaXIgX19nZXRfXy4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgKGJ1ZyAjMTc4NSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goc2VsZi5fZG9jZGVzY3JpcHRvcihuYW1lLCB2YWx1ZSwgbW9kKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goc2VsZi5kb2N1bWVudCh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtb2QsIG9iamVjdCkpCisgICAgICAgICAgICByZXR1cm4gYXR0cnMKKworICAgICAgICBkZWYgc3BpbGxkZXNjcmlwdG9ycyhtc2csIGF0dHJzLCBwcmVkaWNhdGUpOgorICAgICAgICAgICAgb2ssIGF0dHJzID0gX3NwbGl0X2xpc3QoYXR0cnMsIHByZWRpY2F0ZSkKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIGhyLm1heWJlKCkKKyAgICAgICAgICAgICAgICBwdXNoKG1zZykKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSwga2luZCwgaG9tZWNscywgdmFsdWUgaW4gb2s6CisgICAgICAgICAgICAgICAgICAgIHB1c2goc2VsZi5fZG9jZGVzY3JpcHRvcihuYW1lLCB2YWx1ZSwgbW9kKSkKKyAgICAgICAgICAgIHJldHVybiBhdHRycworCisgICAgICAgIGRlZiBzcGlsbGRhdGEobXNnLCBhdHRycywgcHJlZGljYXRlKToKKyAgICAgICAgICAgIG9rLCBhdHRycyA9IF9zcGxpdF9saXN0KGF0dHJzLCBwcmVkaWNhdGUpCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBoci5tYXliZSgpCisgICAgICAgICAgICAgICAgcHVzaChtc2cpCisgICAgICAgICAgICAgICAgZm9yIG5hbWUsIGtpbmQsIGhvbWVjbHMsIHZhbHVlIGluIG9rOgorICAgICAgICAgICAgICAgICAgICBpZiAoaGFzYXR0cih2YWx1ZSwgJ19fY2FsbF9fJykgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNwZWN0LmlzZGF0YWRlc2NyaXB0b3IodmFsdWUpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvYyA9IGdldGRvYyh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvYyA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgcHVzaChzZWxmLmRvY290aGVyKGdldGF0dHIob2JqZWN0LCBuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIG1vZCwgbWF4bGVuPTcwLCBkb2M9ZG9jKSArICdcbicpCisgICAgICAgICAgICByZXR1cm4gYXR0cnMKKworICAgICAgICBhdHRycyA9IGZpbHRlcihsYW1iZGEgZGF0YTogdmlzaWJsZW5hbWUoZGF0YVswXSwgb2JqPW9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZ5X2NsYXNzX2F0dHJzKG9iamVjdCkpCisgICAgICAgIHdoaWxlIGF0dHJzOgorICAgICAgICAgICAgaWYgbXJvOgorICAgICAgICAgICAgICAgIHRoaXNjbGFzcyA9IG1yby5wb3BsZWZ0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGhpc2NsYXNzID0gYXR0cnNbMF1bMl0KKyAgICAgICAgICAgIGF0dHJzLCBpbmhlcml0ZWQgPSBfc3BsaXRfbGlzdChhdHRycywgbGFtYmRhIHQ6IHRbMl0gaXMgdGhpc2NsYXNzKQorCisgICAgICAgICAgICBpZiB0aGlzY2xhc3MgaXMgX19idWlsdGluX18ub2JqZWN0OgorICAgICAgICAgICAgICAgIGF0dHJzID0gaW5oZXJpdGVkCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgdGhpc2NsYXNzIGlzIG9iamVjdDoKKyAgICAgICAgICAgICAgICB0YWcgPSAiZGVmaW5lZCBoZXJlIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0YWcgPSAiaW5oZXJpdGVkIGZyb20gJXMiICUgY2xhc3NuYW1lKHRoaXNjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5fX21vZHVsZV9fKQorCisgICAgICAgICAgICAjIFNvcnQgYXR0cnMgYnkgbmFtZS4KKyAgICAgICAgICAgIGF0dHJzLnNvcnQoKQorCisgICAgICAgICAgICAjIFB1bXAgb3V0IHRoZSBhdHRycywgc2VncmVnYXRlZCBieSBraW5kLgorICAgICAgICAgICAgYXR0cnMgPSBzcGlsbCgiTWV0aG9kcyAlczpcbiIgJSB0YWcsIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgdDogdFsxXSA9PSAnbWV0aG9kJykKKyAgICAgICAgICAgIGF0dHJzID0gc3BpbGwoIkNsYXNzIG1ldGhvZHMgJXM6XG4iICUgdGFnLCBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHQ6IHRbMV0gPT0gJ2NsYXNzIG1ldGhvZCcpCisgICAgICAgICAgICBhdHRycyA9IHNwaWxsKCJTdGF0aWMgbWV0aG9kcyAlczpcbiIgJSB0YWcsIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgdDogdFsxXSA9PSAnc3RhdGljIG1ldGhvZCcpCisgICAgICAgICAgICBhdHRycyA9IHNwaWxsZGVzY3JpcHRvcnMoIkRhdGEgZGVzY3JpcHRvcnMgJXM6XG4iICUgdGFnLCBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgdDogdFsxXSA9PSAnZGF0YSBkZXNjcmlwdG9yJykKKyAgICAgICAgICAgIGF0dHJzID0gc3BpbGxkYXRhKCJEYXRhIGFuZCBvdGhlciBhdHRyaWJ1dGVzICVzOlxuIiAlIHRhZywgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgdDogdFsxXSA9PSAnZGF0YScpCisgICAgICAgICAgICBhc3NlcnQgYXR0cnMgPT0gW10KKyAgICAgICAgICAgIGF0dHJzID0gaW5oZXJpdGVkCisKKyAgICAgICAgY29udGVudHMgPSAnXG4nLmpvaW4oY29udGVudHMpCisgICAgICAgIGlmIG5vdCBjb250ZW50czoKKyAgICAgICAgICAgIHJldHVybiB0aXRsZSArICdcbicKKyAgICAgICAgcmV0dXJuIHRpdGxlICsgJ1xuJyArIHNlbGYuaW5kZW50KHJzdHJpcChjb250ZW50cyksICcgfCAgJykgKyAnXG4nCisKKyAgICBkZWYgZm9ybWF0dmFsdWUoc2VsZiwgb2JqZWN0KToKKyAgICAgICAgIiIiRm9ybWF0IGFuIGFyZ3VtZW50IGRlZmF1bHQgdmFsdWUgYXMgdGV4dC4iIiIKKyAgICAgICAgcmV0dXJuICc9JyArIHNlbGYucmVwcihvYmplY3QpCisKKyAgICBkZWYgZG9jcm91dGluZShzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsIGNsPU5vbmUpOgorICAgICAgICAiIiJQcm9kdWNlIHRleHQgZG9jdW1lbnRhdGlvbiBmb3IgYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LiIiIgorICAgICAgICByZWFsbmFtZSA9IG9iamVjdC5fX25hbWVfXworICAgICAgICBuYW1lID0gbmFtZSBvciByZWFsbmFtZQorICAgICAgICBub3RlID0gJycKKyAgICAgICAgc2tpcGRvY3MgPSAwCisgICAgICAgIGlmIGluc3BlY3QuaXNtZXRob2Qob2JqZWN0KToKKyAgICAgICAgICAgIGltY2xhc3MgPSBvYmplY3QuaW1fY2xhc3MKKyAgICAgICAgICAgIGlmIGNsOgorICAgICAgICAgICAgICAgIGlmIGltY2xhc3MgaXMgbm90IGNsOgorICAgICAgICAgICAgICAgICAgICBub3RlID0gJyBmcm9tICcgKyBjbGFzc25hbWUoaW1jbGFzcywgbW9kKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBvYmplY3QuaW1fc2VsZiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbm90ZSA9ICcgbWV0aG9kIG9mICVzIGluc3RhbmNlJyAlIGNsYXNzbmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5pbV9zZWxmLl9fY2xhc3NfXywgbW9kKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5vdGUgPSAnIHVuYm91bmQgJXMgbWV0aG9kJyAlIGNsYXNzbmFtZShpbWNsYXNzLG1vZCkKKyAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdC5pbV9mdW5jCisKKyAgICAgICAgaWYgbmFtZSA9PSByZWFsbmFtZToKKyAgICAgICAgICAgIHRpdGxlID0gc2VsZi5ib2xkKHJlYWxuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgKGNsIGFuZCByZWFsbmFtZSBpbiBjbC5fX2RpY3RfXyBhbmQKKyAgICAgICAgICAgICAgICBjbC5fX2RpY3RfX1tyZWFsbmFtZV0gaXMgb2JqZWN0KToKKyAgICAgICAgICAgICAgICBza2lwZG9jcyA9IDEKKyAgICAgICAgICAgIHRpdGxlID0gc2VsZi5ib2xkKG5hbWUpICsgJyA9ICcgKyByZWFsbmFtZQorICAgICAgICBpZiBpbnNwZWN0LmlzZnVuY3Rpb24ob2JqZWN0KToKKyAgICAgICAgICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cyA9IGluc3BlY3QuZ2V0YXJnc3BlYyhvYmplY3QpCisgICAgICAgICAgICBhcmdzcGVjID0gaW5zcGVjdC5mb3JtYXRhcmdzcGVjKAorICAgICAgICAgICAgICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cywgZm9ybWF0dmFsdWU9c2VsZi5mb3JtYXR2YWx1ZSkKKyAgICAgICAgICAgIGlmIHJlYWxuYW1lID09ICc8bGFtYmRhPic6CisgICAgICAgICAgICAgICAgdGl0bGUgPSBzZWxmLmJvbGQobmFtZSkgKyAnIGxhbWJkYSAnCisgICAgICAgICAgICAgICAgYXJnc3BlYyA9IGFyZ3NwZWNbMTotMV0gIyByZW1vdmUgcGFyZW50aGVzZXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZ3NwZWMgPSAnKC4uLiknCisgICAgICAgIGRlY2wgPSB0aXRsZSArIGFyZ3NwZWMgKyBub3RlCisKKyAgICAgICAgaWYgc2tpcGRvY3M6CisgICAgICAgICAgICByZXR1cm4gZGVjbCArICdcbicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRvYyA9IGdldGRvYyhvYmplY3QpIG9yICcnCisgICAgICAgICAgICByZXR1cm4gZGVjbCArICdcbicgKyAoZG9jIGFuZCByc3RyaXAoc2VsZi5pbmRlbnQoZG9jKSkgKyAnXG4nKQorCisgICAgZGVmIF9kb2NkZXNjcmlwdG9yKHNlbGYsIG5hbWUsIHZhbHVlLCBtb2QpOgorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgcHVzaCA9IHJlc3VsdHMuYXBwZW5kCisKKyAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgIHB1c2goc2VsZi5ib2xkKG5hbWUpKQorICAgICAgICAgICAgcHVzaCgnXG4nKQorICAgICAgICBkb2MgPSBnZXRkb2ModmFsdWUpIG9yICcnCisgICAgICAgIGlmIGRvYzoKKyAgICAgICAgICAgIHB1c2goc2VsZi5pbmRlbnQoZG9jKSkKKyAgICAgICAgICAgIHB1c2goJ1xuJykKKyAgICAgICAgcmV0dXJuICcnLmpvaW4ocmVzdWx0cykKKworICAgIGRlZiBkb2Nwcm9wZXJ0eShzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsIGNsPU5vbmUpOgorICAgICAgICAiIiJQcm9kdWNlIHRleHQgZG9jdW1lbnRhdGlvbiBmb3IgYSBwcm9wZXJ0eS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvY2Rlc2NyaXB0b3IobmFtZSwgb2JqZWN0LCBtb2QpCisKKyAgICBkZWYgZG9jZGF0YShzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsIGNsPU5vbmUpOgorICAgICAgICAiIiJQcm9kdWNlIHRleHQgZG9jdW1lbnRhdGlvbiBmb3IgYSBkYXRhIGRlc2NyaXB0b3IuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9kb2NkZXNjcmlwdG9yKG5hbWUsIG9iamVjdCwgbW9kKQorCisgICAgZGVmIGRvY290aGVyKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2Q9Tm9uZSwgcGFyZW50PU5vbmUsIG1heGxlbj1Ob25lLCBkb2M9Tm9uZSk6CisgICAgICAgICIiIlByb2R1Y2UgdGV4dCBkb2N1bWVudGF0aW9uIGZvciBhIGRhdGEgb2JqZWN0LiIiIgorICAgICAgICByZXByID0gc2VsZi5yZXByKG9iamVjdCkKKyAgICAgICAgaWYgbWF4bGVuOgorICAgICAgICAgICAgbGluZSA9IChuYW1lIGFuZCBuYW1lICsgJyA9ICcgb3IgJycpICsgcmVwcgorICAgICAgICAgICAgY2hvcCA9IG1heGxlbiAtIGxlbihsaW5lKQorICAgICAgICAgICAgaWYgY2hvcCA8IDA6IHJlcHIgPSByZXByWzpjaG9wXSArICcuLi4nCisgICAgICAgIGxpbmUgPSAobmFtZSBhbmQgc2VsZi5ib2xkKG5hbWUpICsgJyA9ICcgb3IgJycpICsgcmVwcgorICAgICAgICBpZiBkb2MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaW5lICs9ICdcbicgKyBzZWxmLmluZGVudChzdHIoZG9jKSkKKyAgICAgICAgcmV0dXJuIGxpbmUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdXNlciBpbnRlcmZhY2VzCisKK2RlZiBwYWdlcih0ZXh0KToKKyAgICAiIiJUaGUgZmlyc3QgdGltZSB0aGlzIGlzIGNhbGxlZCwgZGV0ZXJtaW5lIHdoYXQga2luZCBvZiBwYWdlciB0byB1c2UuIiIiCisgICAgZ2xvYmFsIHBhZ2VyCisgICAgcGFnZXIgPSBnZXRwYWdlcigpCisgICAgcGFnZXIodGV4dCkKKworZGVmIGdldHBhZ2VyKCk6CisgICAgIiIiRGVjaWRlIHdoYXQgbWV0aG9kIHRvIHVzZSBmb3IgcGFnaW5nIHRocm91Z2ggdGV4dC4iIiIKKyAgICBpZiB0eXBlKHN5cy5zdGRvdXQpIGlzIG5vdCB0eXBlcy5GaWxlVHlwZToKKyAgICAgICAgcmV0dXJuIHBsYWlucGFnZXIKKyAgICBpZiBub3Qgc3lzLnN0ZGluLmlzYXR0eSgpIG9yIG5vdCBzeXMuc3Rkb3V0LmlzYXR0eSgpOgorICAgICAgICByZXR1cm4gcGxhaW5wYWdlcgorICAgIGlmICdQQUdFUicgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6ICMgcGlwZXMgY29tcGxldGVseSBicm9rZW4gaW4gV2luZG93cworICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSB0ZXh0OiB0ZW1wZmlsZXBhZ2VyKHBsYWluKHRleHQpLCBvcy5lbnZpcm9uWydQQUdFUiddKQorICAgICAgICBlbGlmIG9zLmVudmlyb24uZ2V0KCdURVJNJykgaW4gKCdkdW1iJywgJ2VtYWNzJyk6CisgICAgICAgICAgICByZXR1cm4gbGFtYmRhIHRleHQ6IHBpcGVwYWdlcihwbGFpbih0ZXh0KSwgb3MuZW52aXJvblsnUEFHRVInXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogcGlwZXBhZ2VyKHRleHQsIG9zLmVudmlyb25bJ1BBR0VSJ10pCisgICAgaWYgb3MuZW52aXJvbi5nZXQoJ1RFUk0nKSBpbiAoJ2R1bWInLCAnZW1hY3MnKToKKyAgICAgICAgcmV0dXJuIHBsYWlucGFnZXIKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBvciBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnb3MyJyk6CisgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogdGVtcGZpbGVwYWdlcihwbGFpbih0ZXh0KSwgJ21vcmUgPCcpCisgICAgaWYgaGFzYXR0cihvcywgJ3N5c3RlbScpIGFuZCBvcy5zeXN0ZW0oJyhsZXNzKSAyPi9kZXYvbnVsbCcpID09IDA6CisgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogcGlwZXBhZ2VyKHRleHQsICdsZXNzJykKKworICAgIGltcG9ydCB0ZW1wZmlsZQorICAgIChmZCwgZmlsZW5hbWUpID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgb3MuY2xvc2UoZmQpCisgICAgdHJ5OgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc3lzdGVtJykgYW5kIG9zLnN5c3RlbSgnbW9yZSAiJXMiJyAlIGZpbGVuYW1lKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSB0ZXh0OiBwaXBlcGFnZXIodGV4dCwgJ21vcmUnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHR0eXBhZ2VyCisgICAgZmluYWxseToKKyAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorCitkZWYgcGxhaW4odGV4dCk6CisgICAgIiIiUmVtb3ZlIGJvbGRmYWNlIGZvcm1hdHRpbmcgZnJvbSB0ZXh0LiIiIgorICAgIHJldHVybiByZS5zdWIoJy5cYicsICcnLCB0ZXh0KQorCitkZWYgcGlwZXBhZ2VyKHRleHQsIGNtZCk6CisgICAgIiIiUGFnZSB0aHJvdWdoIHRleHQgYnkgZmVlZGluZyBpdCB0byBhbm90aGVyIHByb2dyYW0uIiIiCisgICAgcGlwZSA9IG9zLnBvcGVuKGNtZCwgJ3cnKQorICAgIHRyeToKKyAgICAgICAgcGlwZS53cml0ZSh0ZXh0KQorICAgICAgICBwaXBlLmNsb3NlKCkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcGFzcyAjIElnbm9yZSBicm9rZW4gcGlwZXMgY2F1c2VkIGJ5IHF1aXR0aW5nIHRoZSBwYWdlciBwcm9ncmFtLgorCitkZWYgdGVtcGZpbGVwYWdlcih0ZXh0LCBjbWQpOgorICAgICIiIlBhZ2UgdGhyb3VnaCB0ZXh0IGJ5IGludm9raW5nIGEgcHJvZ3JhbSBvbiBhIHRlbXBvcmFyeSBmaWxlLiIiIgorICAgIGltcG9ydCB0ZW1wZmlsZQorICAgIGZpbGVuYW1lID0gdGVtcGZpbGUubWt0ZW1wKCkKKyAgICBmaWxlID0gb3BlbihmaWxlbmFtZSwgJ3cnKQorICAgIGZpbGUud3JpdGUodGV4dCkKKyAgICBmaWxlLmNsb3NlKCkKKyAgICB0cnk6CisgICAgICAgIG9zLnN5c3RlbShjbWQgKyAnICInICsgZmlsZW5hbWUgKyAnIicpCisgICAgZmluYWxseToKKyAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorCitkZWYgdHR5cGFnZXIodGV4dCk6CisgICAgIiIiUGFnZSB0aHJvdWdoIHRleHQgb24gYSB0ZXh0IHRlcm1pbmFsLiIiIgorICAgIGxpbmVzID0gc3BsaXQocGxhaW4odGV4dCksICdcbicpCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgdHR5CisgICAgICAgIGZkID0gc3lzLnN0ZGluLmZpbGVubygpCisgICAgICAgIG9sZCA9IHR0eS50Y2dldGF0dHIoZmQpCisgICAgICAgIHR0eS5zZXRjYnJlYWsoZmQpCisgICAgICAgIGdldGNoYXIgPSBsYW1iZGE6IHN5cy5zdGRpbi5yZWFkKDEpCisgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICB0dHkgPSBOb25lCisgICAgICAgIGdldGNoYXIgPSBsYW1iZGE6IHN5cy5zdGRpbi5yZWFkbGluZSgpWzotMV1bOjFdCisKKyAgICB0cnk6CisgICAgICAgIHIgPSBpbmMgPSBvcy5lbnZpcm9uLmdldCgnTElORVMnLCAyNSkgLSAxCisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoam9pbihsaW5lc1s6aW5jXSwgJ1xuJykgKyAnXG4nKQorICAgICAgICB3aGlsZSBsaW5lc1tyOl06CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCctLSBtb3JlIC0tJykKKyAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgYyA9IGdldGNoYXIoKQorCisgICAgICAgICAgICBpZiBjIGluICgncScsICdRJyk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnXHIgICAgICAgICAgXHInKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIGMgaW4gKCdccicsICdcbicpOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xyICAgICAgICAgIFxyJyArIGxpbmVzW3JdICsgJ1xuJykKKyAgICAgICAgICAgICAgICByID0gciArIDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgYyBpbiAoJ2InLCAnQicsICdceDFiJyk6CisgICAgICAgICAgICAgICAgciA9IHIgLSBpbmMgLSBpbmMKKyAgICAgICAgICAgICAgICBpZiByIDwgMDogciA9IDAKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xuJyArIGpvaW4obGluZXNbcjpyK2luY10sICdcbicpICsgJ1xuJykKKyAgICAgICAgICAgIHIgPSByICsgaW5jCisKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiB0dHk6CisgICAgICAgICAgICB0dHkudGNzZXRhdHRyKGZkLCB0dHkuVENTQUZMVVNILCBvbGQpCisKK2RlZiBwbGFpbnBhZ2VyKHRleHQpOgorICAgICIiIlNpbXBseSBwcmludCB1bmZvcm1hdHRlZCB0ZXh0LiAgVGhpcyBpcyB0aGUgdWx0aW1hdGUgZmFsbGJhY2suIiIiCisgICAgc3lzLnN0ZG91dC53cml0ZShwbGFpbih0ZXh0KSkKKworZGVmIGRlc2NyaWJlKHRoaW5nKToKKyAgICAiIiJQcm9kdWNlIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIGdpdmVuIHRoaW5nLiIiIgorICAgIGlmIGluc3BlY3QuaXNtb2R1bGUodGhpbmcpOgorICAgICAgICBpZiB0aGluZy5fX25hbWVfXyBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CisgICAgICAgICAgICByZXR1cm4gJ2J1aWx0LWluIG1vZHVsZSAnICsgdGhpbmcuX19uYW1lX18KKyAgICAgICAgaWYgaGFzYXR0cih0aGluZywgJ19fcGF0aF9fJyk6CisgICAgICAgICAgICByZXR1cm4gJ3BhY2thZ2UgJyArIHRoaW5nLl9fbmFtZV9fCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ21vZHVsZSAnICsgdGhpbmcuX19uYW1lX18KKyAgICBpZiBpbnNwZWN0LmlzYnVpbHRpbih0aGluZyk6CisgICAgICAgIHJldHVybiAnYnVpbHQtaW4gZnVuY3Rpb24gJyArIHRoaW5nLl9fbmFtZV9fCisgICAgaWYgaW5zcGVjdC5pc2dldHNldGRlc2NyaXB0b3IodGhpbmcpOgorICAgICAgICByZXR1cm4gJ2dldHNldCBkZXNjcmlwdG9yICVzLiVzLiVzJyAlICgKKyAgICAgICAgICAgIHRoaW5nLl9fb2JqY2xhc3NfXy5fX21vZHVsZV9fLCB0aGluZy5fX29iamNsYXNzX18uX19uYW1lX18sCisgICAgICAgICAgICB0aGluZy5fX25hbWVfXykKKyAgICBpZiBpbnNwZWN0LmlzbWVtYmVyZGVzY3JpcHRvcih0aGluZyk6CisgICAgICAgIHJldHVybiAnbWVtYmVyIGRlc2NyaXB0b3IgJXMuJXMuJXMnICUgKAorICAgICAgICAgICAgdGhpbmcuX19vYmpjbGFzc19fLl9fbW9kdWxlX18sIHRoaW5nLl9fb2JqY2xhc3NfXy5fX25hbWVfXywKKyAgICAgICAgICAgIHRoaW5nLl9fbmFtZV9fKQorICAgIGlmIGluc3BlY3QuaXNjbGFzcyh0aGluZyk6CisgICAgICAgIHJldHVybiAnY2xhc3MgJyArIHRoaW5nLl9fbmFtZV9fCisgICAgaWYgaW5zcGVjdC5pc2Z1bmN0aW9uKHRoaW5nKToKKyAgICAgICAgcmV0dXJuICdmdW5jdGlvbiAnICsgdGhpbmcuX19uYW1lX18KKyAgICBpZiBpbnNwZWN0LmlzbWV0aG9kKHRoaW5nKToKKyAgICAgICAgcmV0dXJuICdtZXRob2QgJyArIHRoaW5nLl9fbmFtZV9fCisgICAgaWYgdHlwZSh0aGluZykgaXMgdHlwZXMuSW5zdGFuY2VUeXBlOgorICAgICAgICByZXR1cm4gJ2luc3RhbmNlIG9mICcgKyB0aGluZy5fX2NsYXNzX18uX19uYW1lX18KKyAgICByZXR1cm4gdHlwZSh0aGluZykuX19uYW1lX18KKworZGVmIGxvY2F0ZShwYXRoLCBmb3JjZWxvYWQ9MCk6CisgICAgIiIiTG9jYXRlIGFuIG9iamVjdCBieSBuYW1lIG9yIGRvdHRlZCBwYXRoLCBpbXBvcnRpbmcgYXMgbmVjZXNzYXJ5LiIiIgorICAgIHBhcnRzID0gW3BhcnQgZm9yIHBhcnQgaW4gc3BsaXQocGF0aCwgJy4nKSBpZiBwYXJ0XQorICAgIG1vZHVsZSwgbiA9IE5vbmUsIDAKKyAgICB3aGlsZSBuIDwgbGVuKHBhcnRzKToKKyAgICAgICAgbmV4dG1vZHVsZSA9IHNhZmVpbXBvcnQoam9pbihwYXJ0c1s6bisxXSwgJy4nKSwgZm9yY2Vsb2FkKQorICAgICAgICBpZiBuZXh0bW9kdWxlOiBtb2R1bGUsIG4gPSBuZXh0bW9kdWxlLCBuICsgMQorICAgICAgICBlbHNlOiBicmVhaworICAgIGlmIG1vZHVsZToKKyAgICAgICAgb2JqZWN0ID0gbW9kdWxlCisgICAgZWxzZToKKyAgICAgICAgb2JqZWN0ID0gX19idWlsdGluX18KKyAgICBmb3IgcGFydCBpbiBwYXJ0c1tuOl06CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9iamVjdCA9IGdldGF0dHIob2JqZWN0LCBwYXJ0KQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiBvYmplY3QKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgaW50ZXJmYWNlCisKK3RleHQgPSBUZXh0RG9jKCkKK2h0bWwgPSBIVE1MRG9jKCkKKworY2xhc3MgX09sZFN0eWxlQ2xhc3M6IHBhc3MKK19PTERfSU5TVEFOQ0VfVFlQRSA9IHR5cGUoX09sZFN0eWxlQ2xhc3MoKSkKKworZGVmIHJlc29sdmUodGhpbmcsIGZvcmNlbG9hZD0wKToKKyAgICAiIiJHaXZlbiBhbiBvYmplY3Qgb3IgYSBwYXRoIHRvIGFuIG9iamVjdCwgZ2V0IHRoZSBvYmplY3QgYW5kIGl0cyBuYW1lLiIiIgorICAgIGlmIGlzaW5zdGFuY2UodGhpbmcsIHN0cik6CisgICAgICAgIG9iamVjdCA9IGxvY2F0ZSh0aGluZywgZm9yY2Vsb2FkKQorICAgICAgICBpZiBub3Qgb2JqZWN0OgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICdubyBQeXRob24gZG9jdW1lbnRhdGlvbiBmb3VuZCBmb3IgJXInICUgdGhpbmcKKyAgICAgICAgcmV0dXJuIG9iamVjdCwgdGhpbmcKKyAgICBlbHNlOgorICAgICAgICBuYW1lID0gZ2V0YXR0cih0aGluZywgJ19fbmFtZV9fJywgTm9uZSkKKyAgICAgICAgcmV0dXJuIHRoaW5nLCBuYW1lIGlmIGlzaW5zdGFuY2UobmFtZSwgc3RyKSBlbHNlIE5vbmUKKworZGVmIHJlbmRlcl9kb2ModGhpbmcsIHRpdGxlPSdQeXRob24gTGlicmFyeSBEb2N1bWVudGF0aW9uOiAlcycsIGZvcmNlbG9hZD0wKToKKyAgICAiIiJSZW5kZXIgdGV4dCBkb2N1bWVudGF0aW9uLCBnaXZlbiBhbiBvYmplY3Qgb3IgYSBwYXRoIHRvIGFuIG9iamVjdC4iIiIKKyAgICBvYmplY3QsIG5hbWUgPSByZXNvbHZlKHRoaW5nLCBmb3JjZWxvYWQpCisgICAgZGVzYyA9IGRlc2NyaWJlKG9iamVjdCkKKyAgICBtb2R1bGUgPSBpbnNwZWN0LmdldG1vZHVsZShvYmplY3QpCisgICAgaWYgbmFtZSBhbmQgJy4nIGluIG5hbWU6CisgICAgICAgIGRlc2MgKz0gJyBpbiAnICsgbmFtZVs6bmFtZS5yZmluZCgnLicpXQorICAgIGVsaWYgbW9kdWxlIGFuZCBtb2R1bGUgaXMgbm90IG9iamVjdDoKKyAgICAgICAgZGVzYyArPSAnIGluIG1vZHVsZSAnICsgbW9kdWxlLl9fbmFtZV9fCisgICAgaWYgdHlwZShvYmplY3QpIGlzIF9PTERfSU5TVEFOQ0VfVFlQRToKKyAgICAgICAgIyBJZiB0aGUgcGFzc2VkIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBhbiBvbGQtc3R5bGUgY2xhc3MsCisgICAgICAgICMgZG9jdW1lbnQgaXRzIGF2YWlsYWJsZSBtZXRob2RzIGluc3RlYWQgb2YgaXRzIHZhbHVlLgorICAgICAgICBvYmplY3QgPSBvYmplY3QuX19jbGFzc19fCisgICAgZWxpZiBub3QgKGluc3BlY3QuaXNtb2R1bGUob2JqZWN0KSBvcgorICAgICAgICAgICAgICBpbnNwZWN0LmlzY2xhc3Mob2JqZWN0KSBvcgorICAgICAgICAgICAgICBpbnNwZWN0Lmlzcm91dGluZShvYmplY3QpIG9yCisgICAgICAgICAgICAgIGluc3BlY3QuaXNnZXRzZXRkZXNjcmlwdG9yKG9iamVjdCkgb3IKKyAgICAgICAgICAgICAgaW5zcGVjdC5pc21lbWJlcmRlc2NyaXB0b3Iob2JqZWN0KSBvcgorICAgICAgICAgICAgICBpc2luc3RhbmNlKG9iamVjdCwgcHJvcGVydHkpKToKKyAgICAgICAgIyBJZiB0aGUgcGFzc2VkIG9iamVjdCBpcyBhIHBpZWNlIG9mIGRhdGEgb3IgYW4gaW5zdGFuY2UsCisgICAgICAgICMgZG9jdW1lbnQgaXRzIGF2YWlsYWJsZSBtZXRob2RzIGluc3RlYWQgb2YgaXRzIHZhbHVlLgorICAgICAgICBvYmplY3QgPSB0eXBlKG9iamVjdCkKKyAgICAgICAgZGVzYyArPSAnIG9iamVjdCcKKyAgICByZXR1cm4gdGl0bGUgJSBkZXNjICsgJ1xuXG4nICsgdGV4dC5kb2N1bWVudChvYmplY3QsIG5hbWUpCisKK2RlZiBkb2ModGhpbmcsIHRpdGxlPSdQeXRob24gTGlicmFyeSBEb2N1bWVudGF0aW9uOiAlcycsIGZvcmNlbG9hZD0wKToKKyAgICAiIiJEaXNwbGF5IHRleHQgZG9jdW1lbnRhdGlvbiwgZ2l2ZW4gYW4gb2JqZWN0IG9yIGEgcGF0aCB0byBhbiBvYmplY3QuIiIiCisgICAgdHJ5OgorICAgICAgICBwYWdlcihyZW5kZXJfZG9jKHRoaW5nLCB0aXRsZSwgZm9yY2Vsb2FkKSkKKyAgICBleGNlcHQgKEltcG9ydEVycm9yLCBFcnJvckR1cmluZ0ltcG9ydCksIHZhbHVlOgorICAgICAgICBwcmludCB2YWx1ZQorCitkZWYgd3JpdGVkb2ModGhpbmcsIGZvcmNlbG9hZD0wKToKKyAgICAiIiJXcml0ZSBIVE1MIGRvY3VtZW50YXRpb24gdG8gYSBmaWxlIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4iIiIKKyAgICB0cnk6CisgICAgICAgIG9iamVjdCwgbmFtZSA9IHJlc29sdmUodGhpbmcsIGZvcmNlbG9hZCkKKyAgICAgICAgcGFnZSA9IGh0bWwucGFnZShkZXNjcmliZShvYmplY3QpLCBodG1sLmRvY3VtZW50KG9iamVjdCwgbmFtZSkpCisgICAgICAgIGZpbGUgPSBvcGVuKG5hbWUgKyAnLmh0bWwnLCAndycpCisgICAgICAgIGZpbGUud3JpdGUocGFnZSkKKyAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgIHByaW50ICd3cm90ZScsIG5hbWUgKyAnLmh0bWwnCisgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgRXJyb3JEdXJpbmdJbXBvcnQpLCB2YWx1ZToKKyAgICAgICAgcHJpbnQgdmFsdWUKKworZGVmIHdyaXRlZG9jcyhkaXIsIHBrZ3BhdGg9JycsIGRvbmU9Tm9uZSk6CisgICAgIiIiV3JpdGUgb3V0IEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgYWxsIG1vZHVsZXMgaW4gYSBkaXJlY3RvcnkgdHJlZS4iIiIKKyAgICBpZiBkb25lIGlzIE5vbmU6IGRvbmUgPSB7fQorICAgIGZvciBpbXBvcnRlciwgbW9kbmFtZSwgaXNwa2cgaW4gcGtndXRpbC53YWxrX3BhY2thZ2VzKFtkaXJdLCBwa2dwYXRoKToKKyAgICAgICAgd3JpdGVkb2MobW9kbmFtZSkKKyAgICByZXR1cm4KKworY2xhc3MgSGVscGVyOgorCisgICAgIyBUaGVzZSBkaWN0aW9uYXJpZXMgbWFwIGEgdG9waWMgbmFtZSB0byBlaXRoZXIgYW4gYWxpYXMsIG9yIGEgdHVwbGUKKyAgICAjIChsYWJlbCwgc2VlYWxzby1pdGVtcykuICBUaGUgImxhYmVsIiBpcyB0aGUgbGFiZWwgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAjIHNlY3Rpb24gaW4gdGhlIC5yc3QgZmlsZSB1bmRlciBEb2MvIGFuZCBhbiBpbmRleCBpbnRvIHRoZSBkaWN0aW9uYXJ5CisgICAgIyBpbiBweWRvY19kYXRhL3RvcGljcy5weS4KKyAgICAjCisgICAgIyBDQVVUSU9OOiBpZiB5b3UgY2hhbmdlIG9uZSBvZiB0aGVzZSBkaWN0aW9uYXJpZXMsIGJlIHN1cmUgdG8gYWRhcHQgdGhlCisgICAgIyAgICAgICAgICBsaXN0IG9mIG5lZWRlZCBsYWJlbHMgaW4gRG9jL3Rvb2xzL3NwaGlueGV4dC9weXNwZWNpZmljLnB5IGFuZAorICAgICMgICAgICAgICAgcmVnZW5lcmF0ZSB0aGUgcHlkb2NfZGF0YS90b3BpY3MucHkgZmlsZSBieSBydW5uaW5nCisgICAgIyAgICAgICAgICAgICAgbWFrZSBweWRvYy10b3BpY3MKKyAgICAjICAgICAgICAgIGluIERvYy8gYW5kIGNvcHlpbmcgdGhlIG91dHB1dCBmaWxlIGludG8gdGhlIExpYi8gZGlyZWN0b3J5LgorCisgICAga2V5d29yZHMgPSB7CisgICAgICAgICdhbmQnOiAnQk9PTEVBTicsCisgICAgICAgICdhcyc6ICd3aXRoJywKKyAgICAgICAgJ2Fzc2VydCc6ICgnYXNzZXJ0JywgJycpLAorICAgICAgICAnYnJlYWsnOiAoJ2JyZWFrJywgJ3doaWxlIGZvcicpLAorICAgICAgICAnY2xhc3MnOiAoJ2NsYXNzJywgJ0NMQVNTRVMgU1BFQ0lBTE1FVEhPRFMnKSwKKyAgICAgICAgJ2NvbnRpbnVlJzogKCdjb250aW51ZScsICd3aGlsZSBmb3InKSwKKyAgICAgICAgJ2RlZic6ICgnZnVuY3Rpb24nLCAnJyksCisgICAgICAgICdkZWwnOiAoJ2RlbCcsICdCQVNJQ01FVEhPRFMnKSwKKyAgICAgICAgJ2VsaWYnOiAnaWYnLAorICAgICAgICAnZWxzZSc6ICgnZWxzZScsICd3aGlsZSBmb3InKSwKKyAgICAgICAgJ2V4Y2VwdCc6ICd0cnknLAorICAgICAgICAnZXhlYyc6ICgnZXhlYycsICcnKSwKKyAgICAgICAgJ2ZpbmFsbHknOiAndHJ5JywKKyAgICAgICAgJ2Zvcic6ICgnZm9yJywgJ2JyZWFrIGNvbnRpbnVlIHdoaWxlJyksCisgICAgICAgICdmcm9tJzogJ2ltcG9ydCcsCisgICAgICAgICdnbG9iYWwnOiAoJ2dsb2JhbCcsICdOQU1FU1BBQ0VTJyksCisgICAgICAgICdpZic6ICgnaWYnLCAnVFJVVEhWQUxVRScpLAorICAgICAgICAnaW1wb3J0JzogKCdpbXBvcnQnLCAnTU9EVUxFUycpLAorICAgICAgICAnaW4nOiAoJ2luJywgJ1NFUVVFTkNFTUVUSE9EUzInKSwKKyAgICAgICAgJ2lzJzogJ0NPTVBBUklTT04nLAorICAgICAgICAnbGFtYmRhJzogKCdsYW1iZGEnLCAnRlVOQ1RJT05TJyksCisgICAgICAgICdub3QnOiAnQk9PTEVBTicsCisgICAgICAgICdvcic6ICdCT09MRUFOJywKKyAgICAgICAgJ3Bhc3MnOiAoJ3Bhc3MnLCAnJyksCisgICAgICAgICdwcmludCc6ICgncHJpbnQnLCAnJyksCisgICAgICAgICdyYWlzZSc6ICgncmFpc2UnLCAnRVhDRVBUSU9OUycpLAorICAgICAgICAncmV0dXJuJzogKCdyZXR1cm4nLCAnRlVOQ1RJT05TJyksCisgICAgICAgICd0cnknOiAoJ3RyeScsICdFWENFUFRJT05TJyksCisgICAgICAgICd3aGlsZSc6ICgnd2hpbGUnLCAnYnJlYWsgY29udGludWUgaWYgVFJVVEhWQUxVRScpLAorICAgICAgICAnd2l0aCc6ICgnd2l0aCcsICdDT05URVhUTUFOQUdFUlMgRVhDRVBUSU9OUyB5aWVsZCcpLAorICAgICAgICAneWllbGQnOiAoJ3lpZWxkJywgJycpLAorICAgIH0KKyAgICAjIEVpdGhlciBhZGQgc3ltYm9scyB0byB0aGlzIGRpY3Rpb25hcnkgb3IgdG8gdGhlIHN5bWJvbHMgZGljdGlvbmFyeQorICAgICMgZGlyZWN0bHk6IFdoaWNoZXZlciBpcyBlYXNpZXIuIFRoZXkgYXJlIG1lcmdlZCBsYXRlci4KKyAgICBfc3ltYm9sc19pbnZlcnNlID0geworICAgICAgICAnU1RSSU5HUycgOiAoIiciLCAiJycnIiwgInInIiwgInUnIiwgJyIiIicsICciJywgJ3IiJywgJ3UiJyksCisgICAgICAgICdPUEVSQVRPUlMnIDogKCcrJywgJy0nLCAnKicsICcqKicsICcvJywgJy8vJywgJyUnLCAnPDwnLCAnPj4nLCAnJicsCisgICAgICAgICAgICAgICAgICAgICAgICd8JywgJ14nLCAnficsICc8JywgJz4nLCAnPD0nLCAnPj0nLCAnPT0nLCAnIT0nLCAnPD4nKSwKKyAgICAgICAgJ0NPTVBBUklTT04nIDogKCc8JywgJz4nLCAnPD0nLCAnPj0nLCAnPT0nLCAnIT0nLCAnPD4nKSwKKyAgICAgICAgJ1VOQVJZJyA6ICgnLScsICd+JyksCisgICAgICAgICdBVUdNRU5URURBU1NJR05NRU5UJyA6ICgnKz0nLCAnLT0nLCAnKj0nLCAnLz0nLCAnJT0nLCAnJj0nLCAnfD0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXj0nLCAnPDw9JywgJz4+PScsICcqKj0nLCAnLy89JyksCisgICAgICAgICdCSVRXSVNFJyA6ICgnPDwnLCAnPj4nLCAnJicsICd8JywgJ14nLCAnficpLAorICAgICAgICAnQ09NUExFWCcgOiAoJ2onLCAnSicpCisgICAgfQorICAgIHN5bWJvbHMgPSB7CisgICAgICAgICclJzogJ09QRVJBVE9SUyBGT1JNQVRUSU5HJywKKyAgICAgICAgJyoqJzogJ1BPV0VSJywKKyAgICAgICAgJywnOiAnVFVQTEVTIExJU1RTIEZVTkNUSU9OUycsCisgICAgICAgICcuJzogJ0FUVFJJQlVURVMgRkxPQVQgTU9EVUxFUyBPQkpFQ1RTJywKKyAgICAgICAgJy4uLic6ICdFTExJUFNJUycsCisgICAgICAgICc6JzogJ1NMSUNJTkdTIERJQ1RJT05BUllMSVRFUkFMUycsCisgICAgICAgICdAJzogJ2RlZiBjbGFzcycsCisgICAgICAgICdcXCc6ICdTVFJJTkdTJywKKyAgICAgICAgJ18nOiAnUFJJVkFURU5BTUVTJywKKyAgICAgICAgJ19fJzogJ1BSSVZBVEVOQU1FUyBTUEVDSUFMTUVUSE9EUycsCisgICAgICAgICdgJzogJ0JBQ0tRVU9URVMnLAorICAgICAgICAnKCc6ICdUVVBMRVMgRlVOQ1RJT05TIENBTExTJywKKyAgICAgICAgJyknOiAnVFVQTEVTIEZVTkNUSU9OUyBDQUxMUycsCisgICAgICAgICdbJzogJ0xJU1RTIFNVQlNDUklQVFMgU0xJQ0lOR1MnLAorICAgICAgICAnXSc6ICdMSVNUUyBTVUJTQ1JJUFRTIFNMSUNJTkdTJworICAgIH0KKyAgICBmb3IgdG9waWMsIHN5bWJvbHNfIGluIF9zeW1ib2xzX2ludmVyc2UuaXRlcml0ZW1zKCk6CisgICAgICAgIGZvciBzeW1ib2wgaW4gc3ltYm9sc186CisgICAgICAgICAgICB0b3BpY3MgPSBzeW1ib2xzLmdldChzeW1ib2wsIHRvcGljKQorICAgICAgICAgICAgaWYgdG9waWMgbm90IGluIHRvcGljczoKKyAgICAgICAgICAgICAgICB0b3BpY3MgPSB0b3BpY3MgKyAnICcgKyB0b3BpYworICAgICAgICAgICAgc3ltYm9sc1tzeW1ib2xdID0gdG9waWNzCisKKyAgICB0b3BpY3MgPSB7CisgICAgICAgICdUWVBFUyc6ICgndHlwZXMnLCAnU1RSSU5HUyBVTklDT0RFIE5VTUJFUlMgU0VRVUVOQ0VTIE1BUFBJTkdTICcKKyAgICAgICAgICAgICAgICAgICdGVU5DVElPTlMgQ0xBU1NFUyBNT0RVTEVTIEZJTEVTIGluc3BlY3QnKSwKKyAgICAgICAgJ1NUUklOR1MnOiAoJ3N0cmluZ3MnLCAnc3RyIFVOSUNPREUgU0VRVUVOQ0VTIFNUUklOR01FVEhPRFMgRk9STUFUVElORyAnCisgICAgICAgICAgICAgICAgICAgICdUWVBFUycpLAorICAgICAgICAnU1RSSU5HTUVUSE9EUyc6ICgnc3RyaW5nLW1ldGhvZHMnLCAnU1RSSU5HUyBGT1JNQVRUSU5HJyksCisgICAgICAgICdGT1JNQVRUSU5HJzogKCdmb3JtYXRzdHJpbmdzJywgJ09QRVJBVE9SUycpLAorICAgICAgICAnVU5JQ09ERSc6ICgnc3RyaW5ncycsICdlbmNvZGluZ3MgdW5pY29kZSBTRVFVRU5DRVMgU1RSSU5HTUVUSE9EUyAnCisgICAgICAgICAgICAgICAgICAgICdGT1JNQVRUSU5HIFRZUEVTJyksCisgICAgICAgICdOVU1CRVJTJzogKCdudW1iZXJzJywgJ0lOVEVHRVIgRkxPQVQgQ09NUExFWCBUWVBFUycpLAorICAgICAgICAnSU5URUdFUic6ICgnaW50ZWdlcnMnLCAnaW50IHJhbmdlJyksCisgICAgICAgICdGTE9BVCc6ICgnZmxvYXRpbmcnLCAnZmxvYXQgbWF0aCcpLAorICAgICAgICAnQ09NUExFWCc6ICgnaW1hZ2luYXJ5JywgJ2NvbXBsZXggY21hdGgnKSwKKyAgICAgICAgJ1NFUVVFTkNFUyc6ICgndHlwZXNzZXEnLCAnU1RSSU5HTUVUSE9EUyBGT1JNQVRUSU5HIHhyYW5nZSBMSVNUUycpLAorICAgICAgICAnTUFQUElOR1MnOiAnRElDVElPTkFSSUVTJywKKyAgICAgICAgJ0ZVTkNUSU9OUyc6ICgndHlwZXNmdW5jdGlvbnMnLCAnZGVmIFRZUEVTJyksCisgICAgICAgICdNRVRIT0RTJzogKCd0eXBlc21ldGhvZHMnLCAnY2xhc3MgZGVmIENMQVNTRVMgVFlQRVMnKSwKKyAgICAgICAgJ0NPREVPQkpFQ1RTJzogKCdibHRpbi1jb2RlLW9iamVjdHMnLCAnY29tcGlsZSBGVU5DVElPTlMgVFlQRVMnKSwKKyAgICAgICAgJ1RZUEVPQkpFQ1RTJzogKCdibHRpbi10eXBlLW9iamVjdHMnLCAndHlwZXMgVFlQRVMnKSwKKyAgICAgICAgJ0ZSQU1FT0JKRUNUUyc6ICdUWVBFUycsCisgICAgICAgICdUUkFDRUJBQ0tTJzogJ1RZUEVTJywKKyAgICAgICAgJ05PTkUnOiAoJ2JsdGluLW51bGwtb2JqZWN0JywgJycpLAorICAgICAgICAnRUxMSVBTSVMnOiAoJ2JsdGluLWVsbGlwc2lzLW9iamVjdCcsICdTTElDSU5HUycpLAorICAgICAgICAnRklMRVMnOiAoJ2JsdGluLWZpbGUtb2JqZWN0cycsICcnKSwKKyAgICAgICAgJ1NQRUNJQUxBVFRSSUJVVEVTJzogKCdzcGVjaWFsYXR0cnMnLCAnJyksCisgICAgICAgICdDTEFTU0VTJzogKCd0eXBlcycsICdjbGFzcyBTUEVDSUFMTUVUSE9EUyBQUklWQVRFTkFNRVMnKSwKKyAgICAgICAgJ01PRFVMRVMnOiAoJ3R5cGVzbW9kdWxlcycsICdpbXBvcnQnKSwKKyAgICAgICAgJ1BBQ0tBR0VTJzogJ2ltcG9ydCcsCisgICAgICAgICdFWFBSRVNTSU9OUyc6ICgnb3BlcmF0b3Itc3VtbWFyeScsICdsYW1iZGEgb3IgYW5kIG5vdCBpbiBpcyBCT09MRUFOICcKKyAgICAgICAgICAgICAgICAgICAgICAgICdDT01QQVJJU09OIEJJVFdJU0UgU0hJRlRJTkcgQklOQVJZIEZPUk1BVFRJTkcgUE9XRVIgJworICAgICAgICAgICAgICAgICAgICAgICAgJ1VOQVJZIEFUVFJJQlVURVMgU1VCU0NSSVBUUyBTTElDSU5HUyBDQUxMUyBUVVBMRVMgJworICAgICAgICAgICAgICAgICAgICAgICAgJ0xJU1RTIERJQ1RJT05BUklFUyBCQUNLUVVPVEVTJyksCisgICAgICAgICdPUEVSQVRPUlMnOiAnRVhQUkVTU0lPTlMnLAorICAgICAgICAnUFJFQ0VERU5DRSc6ICdFWFBSRVNTSU9OUycsCisgICAgICAgICdPQkpFQ1RTJzogKCdvYmplY3RzJywgJ1RZUEVTJyksCisgICAgICAgICdTUEVDSUFMTUVUSE9EUyc6ICgnc3BlY2lhbG5hbWVzJywgJ0JBU0lDTUVUSE9EUyBBVFRSSUJVVEVNRVRIT0RTICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdDQUxMQUJMRU1FVEhPRFMgU0VRVUVOQ0VNRVRIT0RTMSBNQVBQSU5HTUVUSE9EUyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnU0VRVUVOQ0VNRVRIT0RTMiBOVU1CRVJNRVRIT0RTIENMQVNTRVMnKSwKKyAgICAgICAgJ0JBU0lDTUVUSE9EUyc6ICgnY3VzdG9taXphdGlvbicsICdjbXAgaGFzaCByZXByIHN0ciBTUEVDSUFMTUVUSE9EUycpLAorICAgICAgICAnQVRUUklCVVRFTUVUSE9EUyc6ICgnYXR0cmlidXRlLWFjY2VzcycsICdBVFRSSUJVVEVTIFNQRUNJQUxNRVRIT0RTJyksCisgICAgICAgICdDQUxMQUJMRU1FVEhPRFMnOiAoJ2NhbGxhYmxlLXR5cGVzJywgJ0NBTExTIFNQRUNJQUxNRVRIT0RTJyksCisgICAgICAgICdTRVFVRU5DRU1FVEhPRFMxJzogKCdzZXF1ZW5jZS10eXBlcycsICdTRVFVRU5DRVMgU0VRVUVOQ0VNRVRIT0RTMiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTUEVDSUFMTUVUSE9EUycpLAorICAgICAgICAnU0VRVUVOQ0VNRVRIT0RTMic6ICgnc2VxdWVuY2UtbWV0aG9kcycsICdTRVFVRU5DRVMgU0VRVUVOQ0VNRVRIT0RTMSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTUEVDSUFMTUVUSE9EUycpLAorICAgICAgICAnTUFQUElOR01FVEhPRFMnOiAoJ3NlcXVlbmNlLXR5cGVzJywgJ01BUFBJTkdTIFNQRUNJQUxNRVRIT0RTJyksCisgICAgICAgICdOVU1CRVJNRVRIT0RTJzogKCdudW1lcmljLXR5cGVzJywgJ05VTUJFUlMgQVVHTUVOVEVEQVNTSUdOTUVOVCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdTUEVDSUFMTUVUSE9EUycpLAorICAgICAgICAnRVhFQ1VUSU9OJzogKCdleGVjbW9kZWwnLCAnTkFNRVNQQUNFUyBEWU5BTUlDRkVBVFVSRVMgRVhDRVBUSU9OUycpLAorICAgICAgICAnTkFNRVNQQUNFUyc6ICgnbmFtaW5nJywgJ2dsb2JhbCBBU1NJR05NRU5UIERFTEVUSU9OIERZTkFNSUNGRUFUVVJFUycpLAorICAgICAgICAnRFlOQU1JQ0ZFQVRVUkVTJzogKCdkeW5hbWljLWZlYXR1cmVzJywgJycpLAorICAgICAgICAnU0NPUElORyc6ICdOQU1FU1BBQ0VTJywKKyAgICAgICAgJ0ZSQU1FUyc6ICdOQU1FU1BBQ0VTJywKKyAgICAgICAgJ0VYQ0VQVElPTlMnOiAoJ2V4Y2VwdGlvbnMnLCAndHJ5IGV4Y2VwdCBmaW5hbGx5IHJhaXNlJyksCisgICAgICAgICdDT0VSQ0lPTlMnOiAoJ2NvZXJjaW9uLXJ1bGVzJywnQ09OVkVSU0lPTlMnKSwKKyAgICAgICAgJ0NPTlZFUlNJT05TJzogKCdjb252ZXJzaW9ucycsICdDT0VSQ0lPTlMnKSwKKyAgICAgICAgJ0lERU5USUZJRVJTJzogKCdpZGVudGlmaWVycycsICdrZXl3b3JkcyBTUEVDSUFMSURFTlRJRklFUlMnKSwKKyAgICAgICAgJ1NQRUNJQUxJREVOVElGSUVSUyc6ICgnaWQtY2xhc3NlcycsICcnKSwKKyAgICAgICAgJ1BSSVZBVEVOQU1FUyc6ICgnYXRvbS1pZGVudGlmaWVycycsICcnKSwKKyAgICAgICAgJ0xJVEVSQUxTJzogKCdhdG9tLWxpdGVyYWxzJywgJ1NUUklOR1MgQkFDS1FVT1RFUyBOVU1CRVJTICcKKyAgICAgICAgICAgICAgICAgICAgICdUVVBMRUxJVEVSQUxTIExJU1RMSVRFUkFMUyBESUNUSU9OQVJZTElURVJBTFMnKSwKKyAgICAgICAgJ1RVUExFUyc6ICdTRVFVRU5DRVMnLAorICAgICAgICAnVFVQTEVMSVRFUkFMUyc6ICgnZXhwcmxpc3RzJywgJ1RVUExFUyBMSVRFUkFMUycpLAorICAgICAgICAnTElTVFMnOiAoJ3R5cGVzc2VxLW11dGFibGUnLCAnTElTVExJVEVSQUxTJyksCisgICAgICAgICdMSVNUTElURVJBTFMnOiAoJ2xpc3RzJywgJ0xJU1RTIExJVEVSQUxTJyksCisgICAgICAgICdESUNUSU9OQVJJRVMnOiAoJ3R5cGVzbWFwcGluZycsICdESUNUSU9OQVJZTElURVJBTFMnKSwKKyAgICAgICAgJ0RJQ1RJT05BUllMSVRFUkFMUyc6ICgnZGljdCcsICdESUNUSU9OQVJJRVMgTElURVJBTFMnKSwKKyAgICAgICAgJ0JBQ0tRVU9URVMnOiAoJ3N0cmluZy1jb252ZXJzaW9ucycsICdyZXByIHN0ciBTVFJJTkdTIExJVEVSQUxTJyksCisgICAgICAgICdBVFRSSUJVVEVTJzogKCdhdHRyaWJ1dGUtcmVmZXJlbmNlcycsICdnZXRhdHRyIGhhc2F0dHIgc2V0YXR0ciAnCisgICAgICAgICAgICAgICAgICAgICAgICdBVFRSSUJVVEVNRVRIT0RTJyksCisgICAgICAgICdTVUJTQ1JJUFRTJzogKCdzdWJzY3JpcHRpb25zJywgJ1NFUVVFTkNFTUVUSE9EUzEnKSwKKyAgICAgICAgJ1NMSUNJTkdTJzogKCdzbGljaW5ncycsICdTRVFVRU5DRU1FVEhPRFMyJyksCisgICAgICAgICdDQUxMUyc6ICgnY2FsbHMnLCAnRVhQUkVTU0lPTlMnKSwKKyAgICAgICAgJ1BPV0VSJzogKCdwb3dlcicsICdFWFBSRVNTSU9OUycpLAorICAgICAgICAnVU5BUlknOiAoJ3VuYXJ5JywgJ0VYUFJFU1NJT05TJyksCisgICAgICAgICdCSU5BUlknOiAoJ2JpbmFyeScsICdFWFBSRVNTSU9OUycpLAorICAgICAgICAnU0hJRlRJTkcnOiAoJ3NoaWZ0aW5nJywgJ0VYUFJFU1NJT05TJyksCisgICAgICAgICdCSVRXSVNFJzogKCdiaXR3aXNlJywgJ0VYUFJFU1NJT05TJyksCisgICAgICAgICdDT01QQVJJU09OJzogKCdjb21wYXJpc29ucycsICdFWFBSRVNTSU9OUyBCQVNJQ01FVEhPRFMnKSwKKyAgICAgICAgJ0JPT0xFQU4nOiAoJ2Jvb2xlYW5zJywgJ0VYUFJFU1NJT05TIFRSVVRIVkFMVUUnKSwKKyAgICAgICAgJ0FTU0VSVElPTic6ICdhc3NlcnQnLAorICAgICAgICAnQVNTSUdOTUVOVCc6ICgnYXNzaWdubWVudCcsICdBVUdNRU5URURBU1NJR05NRU5UJyksCisgICAgICAgICdBVUdNRU5URURBU1NJR05NRU5UJzogKCdhdWdhc3NpZ24nLCAnTlVNQkVSTUVUSE9EUycpLAorICAgICAgICAnREVMRVRJT04nOiAnZGVsJywKKyAgICAgICAgJ1BSSU5USU5HJzogJ3ByaW50JywKKyAgICAgICAgJ1JFVFVSTklORyc6ICdyZXR1cm4nLAorICAgICAgICAnSU1QT1JUSU5HJzogJ2ltcG9ydCcsCisgICAgICAgICdDT05ESVRJT05BTCc6ICdpZicsCisgICAgICAgICdMT09QSU5HJzogKCdjb21wb3VuZCcsICdmb3Igd2hpbGUgYnJlYWsgY29udGludWUnKSwKKyAgICAgICAgJ1RSVVRIVkFMVUUnOiAoJ3RydXRoJywgJ2lmIHdoaWxlIGFuZCBvciBub3QgQkFTSUNNRVRIT0RTJyksCisgICAgICAgICdERUJVR0dJTkcnOiAoJ2RlYnVnZ2VyJywgJ3BkYicpLAorICAgICAgICAnQ09OVEVYVE1BTkFHRVJTJzogKCdjb250ZXh0LW1hbmFnZXJzJywgJ3dpdGgnKSwKKyAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5wdXQ9Tm9uZSwgb3V0cHV0PU5vbmUpOgorICAgICAgICBzZWxmLl9pbnB1dCA9IGlucHV0CisgICAgICAgIHNlbGYuX291dHB1dCA9IG91dHB1dAorCisgICAgaW5wdXQgID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IHNlbGYuX2lucHV0IG9yIHN5cy5zdGRpbikKKyAgICBvdXRwdXQgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogc2VsZi5fb3V0cHV0IG9yIHN5cy5zdGRvdXQpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGlmIGluc3BlY3Quc3RhY2soKVsxXVszXSA9PSAnPyc6CisgICAgICAgICAgICBzZWxmKCkKKyAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICByZXR1cm4gJzxweWRvYy5IZWxwZXIgaW5zdGFuY2U+JworCisgICAgX0dvSW50ZXJhY3RpdmUgPSBvYmplY3QoKQorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCByZXF1ZXN0PV9Hb0ludGVyYWN0aXZlKToKKyAgICAgICAgaWYgcmVxdWVzdCBpcyBub3Qgc2VsZi5fR29JbnRlcmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuaGVscChyZXF1ZXN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5pbnRybygpCisgICAgICAgICAgICBzZWxmLmludGVyYWN0KCkKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKCcnJworWW91IGFyZSBub3cgbGVhdmluZyBoZWxwIGFuZCByZXR1cm5pbmcgdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlci4KK0lmIHlvdSB3YW50IHRvIGFzayBmb3IgaGVscCBvbiBhIHBhcnRpY3VsYXIgb2JqZWN0IGRpcmVjdGx5IGZyb20gdGhlCitpbnRlcnByZXRlciwgeW91IGNhbiB0eXBlICJoZWxwKG9iamVjdCkiLiAgRXhlY3V0aW5nICJoZWxwKCdzdHJpbmcnKSIKK2hhcyB0aGUgc2FtZSBlZmZlY3QgYXMgdHlwaW5nIGEgcGFydGljdWxhciBzdHJpbmcgYXQgdGhlIGhlbHA+IHByb21wdC4KKycnJykKKworICAgIGRlZiBpbnRlcmFjdChzZWxmKToKKyAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJ1xuJykKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXF1ZXN0ID0gc2VsZi5nZXRsaW5lKCdoZWxwPiAnKQorICAgICAgICAgICAgICAgIGlmIG5vdCByZXF1ZXN0OiBicmVhaworICAgICAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgRU9GRXJyb3IpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZXF1ZXN0ID0gc3RyaXAocmVwbGFjZShyZXF1ZXN0LCAnIicsICcnLCAiJyIsICcnKSkKKyAgICAgICAgICAgIGlmIGxvd2VyKHJlcXVlc3QpIGluICgncScsICdxdWl0Jyk6IGJyZWFrCisgICAgICAgICAgICBzZWxmLmhlbHAocmVxdWVzdCkKKworICAgIGRlZiBnZXRsaW5lKHNlbGYsIHByb21wdCk6CisgICAgICAgICIiIlJlYWQgb25lIGxpbmUsIHVzaW5nIHJhd19pbnB1dCB3aGVuIGF2YWlsYWJsZS4iIiIKKyAgICAgICAgaWYgc2VsZi5pbnB1dCBpcyBzeXMuc3RkaW46CisgICAgICAgICAgICByZXR1cm4gcmF3X2lucHV0KHByb21wdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKHByb21wdCkKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LmZsdXNoKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmlucHV0LnJlYWRsaW5lKCkKKworICAgIGRlZiBoZWxwKHNlbGYsIHJlcXVlc3QpOgorICAgICAgICBpZiB0eXBlKHJlcXVlc3QpIGlzIHR5cGUoJycpOgorICAgICAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3Quc3RyaXAoKQorICAgICAgICAgICAgaWYgcmVxdWVzdCA9PSAnaGVscCc6IHNlbGYuaW50cm8oKQorICAgICAgICAgICAgZWxpZiByZXF1ZXN0ID09ICdrZXl3b3Jkcyc6IHNlbGYubGlzdGtleXdvcmRzKCkKKyAgICAgICAgICAgIGVsaWYgcmVxdWVzdCA9PSAnc3ltYm9scyc6IHNlbGYubGlzdHN5bWJvbHMoKQorICAgICAgICAgICAgZWxpZiByZXF1ZXN0ID09ICd0b3BpY3MnOiBzZWxmLmxpc3R0b3BpY3MoKQorICAgICAgICAgICAgZWxpZiByZXF1ZXN0ID09ICdtb2R1bGVzJzogc2VsZi5saXN0bW9kdWxlcygpCisgICAgICAgICAgICBlbGlmIHJlcXVlc3RbOjhdID09ICdtb2R1bGVzICc6CisgICAgICAgICAgICAgICAgc2VsZi5saXN0bW9kdWxlcyhzcGxpdChyZXF1ZXN0KVsxXSkKKyAgICAgICAgICAgIGVsaWYgcmVxdWVzdCBpbiBzZWxmLnN5bWJvbHM6IHNlbGYuc2hvd3N5bWJvbChyZXF1ZXN0KQorICAgICAgICAgICAgZWxpZiByZXF1ZXN0IGluIHNlbGYua2V5d29yZHM6IHNlbGYuc2hvd3RvcGljKHJlcXVlc3QpCisgICAgICAgICAgICBlbGlmIHJlcXVlc3QgaW4gc2VsZi50b3BpY3M6IHNlbGYuc2hvd3RvcGljKHJlcXVlc3QpCisgICAgICAgICAgICBlbGlmIHJlcXVlc3Q6IGRvYyhyZXF1ZXN0LCAnSGVscCBvbiAlczonKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UocmVxdWVzdCwgSGVscGVyKTogc2VsZigpCisgICAgICAgIGVsc2U6IGRvYyhyZXF1ZXN0LCAnSGVscCBvbiAlczonKQorICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnXG4nKQorCisgICAgZGVmIGludHJvKHNlbGYpOgorICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnJycKK1dlbGNvbWUgdG8gUHl0aG9uICVzISAgVGhpcyBpcyB0aGUgb25saW5lIGhlbHAgdXRpbGl0eS4KKworSWYgdGhpcyBpcyB5b3VyIGZpcnN0IHRpbWUgdXNpbmcgUHl0aG9uLCB5b3Ugc2hvdWxkIGRlZmluaXRlbHkgY2hlY2sgb3V0Cit0aGUgdHV0b3JpYWwgb24gdGhlIEludGVybmV0IGF0IGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvJXMvdHV0b3JpYWwvLgorCitFbnRlciB0aGUgbmFtZSBvZiBhbnkgbW9kdWxlLCBrZXl3b3JkLCBvciB0b3BpYyB0byBnZXQgaGVscCBvbiB3cml0aW5nCitQeXRob24gcHJvZ3JhbXMgYW5kIHVzaW5nIFB5dGhvbiBtb2R1bGVzLiAgVG8gcXVpdCB0aGlzIGhlbHAgdXRpbGl0eSBhbmQKK3JldHVybiB0byB0aGUgaW50ZXJwcmV0ZXIsIGp1c3QgdHlwZSAicXVpdCIuCisKK1RvIGdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIG1vZHVsZXMsIGtleXdvcmRzLCBvciB0b3BpY3MsIHR5cGUgIm1vZHVsZXMiLAorImtleXdvcmRzIiwgb3IgInRvcGljcyIuICBFYWNoIG1vZHVsZSBhbHNvIGNvbWVzIHdpdGggYSBvbmUtbGluZSBzdW1tYXJ5CitvZiB3aGF0IGl0IGRvZXM7IHRvIGxpc3QgdGhlIG1vZHVsZXMgd2hvc2Ugc3VtbWFyaWVzIGNvbnRhaW4gYSBnaXZlbiB3b3JkCitzdWNoIGFzICJzcGFtIiwgdHlwZSAibW9kdWxlcyBzcGFtIi4KKycnJyAlIHR1cGxlKFtzeXMudmVyc2lvbls6M11dKjIpKQorCisgICAgZGVmIGxpc3Qoc2VsZiwgaXRlbXMsIGNvbHVtbnM9NCwgd2lkdGg9ODApOgorICAgICAgICBpdGVtcyA9IGl0ZW1zWzpdCisgICAgICAgIGl0ZW1zLnNvcnQoKQorICAgICAgICBjb2x3ID0gd2lkdGggLyBjb2x1bW5zCisgICAgICAgIHJvd3MgPSAobGVuKGl0ZW1zKSArIGNvbHVtbnMgLSAxKSAvIGNvbHVtbnMKKyAgICAgICAgZm9yIHJvdyBpbiByYW5nZShyb3dzKToKKyAgICAgICAgICAgIGZvciBjb2wgaW4gcmFuZ2UoY29sdW1ucyk6CisgICAgICAgICAgICAgICAgaSA9IGNvbCAqIHJvd3MgKyByb3cKKyAgICAgICAgICAgICAgICBpZiBpIDwgbGVuKGl0ZW1zKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoaXRlbXNbaV0pCisgICAgICAgICAgICAgICAgICAgIGlmIGNvbCA8IGNvbHVtbnMgLSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJyAnICsgJyAnICogKGNvbHctMSAtIGxlbihpdGVtc1tpXSkpKQorICAgICAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJ1xuJykKKworICAgIGRlZiBsaXN0a2V5d29yZHMoc2VsZik6CisgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKCcnJworSGVyZSBpcyBhIGxpc3Qgb2YgdGhlIFB5dGhvbiBrZXl3b3Jkcy4gIEVudGVyIGFueSBrZXl3b3JkIHRvIGdldCBtb3JlIGhlbHAuCisKKycnJykKKyAgICAgICAgc2VsZi5saXN0KHNlbGYua2V5d29yZHMua2V5cygpKQorCisgICAgZGVmIGxpc3RzeW1ib2xzKHNlbGYpOgorICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnJycKK0hlcmUgaXMgYSBsaXN0IG9mIHRoZSBwdW5jdHVhdGlvbiBzeW1ib2xzIHdoaWNoIFB5dGhvbiBhc3NpZ25zIHNwZWNpYWwgbWVhbmluZwordG8uIEVudGVyIGFueSBzeW1ib2wgdG8gZ2V0IG1vcmUgaGVscC4KKworJycnKQorICAgICAgICBzZWxmLmxpc3Qoc2VsZi5zeW1ib2xzLmtleXMoKSkKKworICAgIGRlZiBsaXN0dG9waWNzKHNlbGYpOgorICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnJycKK0hlcmUgaXMgYSBsaXN0IG9mIGF2YWlsYWJsZSB0b3BpY3MuICBFbnRlciBhbnkgdG9waWMgbmFtZSB0byBnZXQgbW9yZSBoZWxwLgorCisnJycpCisgICAgICAgIHNlbGYubGlzdChzZWxmLnRvcGljcy5rZXlzKCkpCisKKyAgICBkZWYgc2hvd3RvcGljKHNlbGYsIHRvcGljLCBtb3JlX3hyZWZzPScnKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHB5ZG9jX2RhdGEudG9waWNzCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKCcnJworU29ycnksIHRvcGljIGFuZCBrZXl3b3JkIGRvY3VtZW50YXRpb24gaXMgbm90IGF2YWlsYWJsZSBiZWNhdXNlIHRoZQorbW9kdWxlICJweWRvY19kYXRhLnRvcGljcyIgY291bGQgbm90IGJlIGZvdW5kLgorJycnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRhcmdldCA9IHNlbGYudG9waWNzLmdldCh0b3BpYywgc2VsZi5rZXl3b3Jkcy5nZXQodG9waWMpKQorICAgICAgICBpZiBub3QgdGFyZ2V0OgorICAgICAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJ25vIGRvY3VtZW50YXRpb24gZm91bmQgZm9yICVzXG4nICUgcmVwcih0b3BpYykpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgdHlwZSh0YXJnZXQpIGlzIHR5cGUoJycpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2hvd3RvcGljKHRhcmdldCwgbW9yZV94cmVmcykKKworICAgICAgICBsYWJlbCwgeHJlZnMgPSB0YXJnZXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZG9jID0gcHlkb2NfZGF0YS50b3BpY3MudG9waWNzW2xhYmVsXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnbm8gZG9jdW1lbnRhdGlvbiBmb3VuZCBmb3IgJXNcbicgJSByZXByKHRvcGljKSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBwYWdlcihzdHJpcChkb2MpICsgJ1xuJykKKyAgICAgICAgaWYgbW9yZV94cmVmczoKKyAgICAgICAgICAgIHhyZWZzID0gKHhyZWZzIG9yICcnKSArICcgJyArIG1vcmVfeHJlZnMKKyAgICAgICAgaWYgeHJlZnM6CisgICAgICAgICAgICBpbXBvcnQgU3RyaW5nSU8sIGZvcm1hdHRlcgorICAgICAgICAgICAgYnVmZmVyID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgZm9ybWF0dGVyLkR1bWJXcml0ZXIoYnVmZmVyKS5zZW5kX2Zsb3dpbmdfZGF0YSgKKyAgICAgICAgICAgICAgICAnUmVsYXRlZCBoZWxwIHRvcGljczogJyArIGpvaW4oc3BsaXQoeHJlZnMpLCAnLCAnKSArICdcbicpCisgICAgICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnXG4lc1xuJyAlIGJ1ZmZlci5nZXR2YWx1ZSgpKQorCisgICAgZGVmIHNob3dzeW1ib2woc2VsZiwgc3ltYm9sKToKKyAgICAgICAgdGFyZ2V0ID0gc2VsZi5zeW1ib2xzW3N5bWJvbF0KKyAgICAgICAgdG9waWMsIF8sIHhyZWZzID0gdGFyZ2V0LnBhcnRpdGlvbignICcpCisgICAgICAgIHNlbGYuc2hvd3RvcGljKHRvcGljLCB4cmVmcykKKworICAgIGRlZiBsaXN0bW9kdWxlcyhzZWxmLCBrZXk9JycpOgorICAgICAgICBpZiBrZXk6CisgICAgICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnJycKK0hlcmUgaXMgYSBsaXN0IG9mIG1hdGNoaW5nIG1vZHVsZXMuICBFbnRlciBhbnkgbW9kdWxlIG5hbWUgdG8gZ2V0IG1vcmUgaGVscC4KKworJycnKQorICAgICAgICAgICAgYXByb3BvcyhrZXkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnJycKK1BsZWFzZSB3YWl0IGEgbW9tZW50IHdoaWxlIEkgZ2F0aGVyIGEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIG1vZHVsZXMuLi4KKworJycnKQorICAgICAgICAgICAgbW9kdWxlcyA9IHt9CisgICAgICAgICAgICBkZWYgY2FsbGJhY2socGF0aCwgbW9kbmFtZSwgZGVzYywgbW9kdWxlcz1tb2R1bGVzKToKKyAgICAgICAgICAgICAgICBpZiBtb2RuYW1lIGFuZCBtb2RuYW1lWy05Ol0gPT0gJy5fX2luaXRfXyc6CisgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBtb2RuYW1lWzotOV0gKyAnIChwYWNrYWdlKScKKyAgICAgICAgICAgICAgICBpZiBmaW5kKG1vZG5hbWUsICcuJykgPCAwOgorICAgICAgICAgICAgICAgICAgICBtb2R1bGVzW21vZG5hbWVdID0gMQorICAgICAgICAgICAgZGVmIG9uZXJyb3IobW9kbmFtZSk6CisgICAgICAgICAgICAgICAgY2FsbGJhY2soTm9uZSwgbW9kbmFtZSwgTm9uZSkKKyAgICAgICAgICAgIE1vZHVsZVNjYW5uZXIoKS5ydW4oY2FsbGJhY2ssIG9uZXJyb3I9b25lcnJvcikKKyAgICAgICAgICAgIHNlbGYubGlzdChtb2R1bGVzLmtleXMoKSkKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKCcnJworRW50ZXIgYW55IG1vZHVsZSBuYW1lIHRvIGdldCBtb3JlIGhlbHAuICBPciwgdHlwZSAibW9kdWxlcyBzcGFtIiB0byBzZWFyY2gKK2ZvciBtb2R1bGVzIHdob3NlIGRlc2NyaXB0aW9ucyBjb250YWluIHRoZSB3b3JkICJzcGFtIi4KKycnJykKKworaGVscCA9IEhlbHBlcigpCisKK2NsYXNzIFNjYW5uZXI6CisgICAgIiIiQSBnZW5lcmljIHRyZWUgaXRlcmF0b3IuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3RzLCBjaGlsZHJlbiwgZGVzY2VuZHApOgorICAgICAgICBzZWxmLnJvb3RzID0gcm9vdHNbOl0KKyAgICAgICAgc2VsZi5zdGF0ZSA9IFtdCisgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBjaGlsZHJlbgorICAgICAgICBzZWxmLmRlc2NlbmRwID0gZGVzY2VuZHAKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5zdGF0ZToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJvb3RzOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICByb290ID0gc2VsZi5yb290cy5wb3AoMCkKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBbKHJvb3QsIHNlbGYuY2hpbGRyZW4ocm9vdCkpXQorICAgICAgICBub2RlLCBjaGlsZHJlbiA9IHNlbGYuc3RhdGVbLTFdCisgICAgICAgIGlmIG5vdCBjaGlsZHJlbjoKKyAgICAgICAgICAgIHNlbGYuc3RhdGUucG9wKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm5leHQoKQorICAgICAgICBjaGlsZCA9IGNoaWxkcmVuLnBvcCgwKQorICAgICAgICBpZiBzZWxmLmRlc2NlbmRwKGNoaWxkKToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUuYXBwZW5kKChjaGlsZCwgc2VsZi5jaGlsZHJlbihjaGlsZCkpKQorICAgICAgICByZXR1cm4gY2hpbGQKKworCitjbGFzcyBNb2R1bGVTY2FubmVyOgorICAgICIiIkFuIGludGVycnVwdGlibGUgc2Nhbm5lciB0aGF0IHNlYXJjaGVzIG1vZHVsZSBzeW5vcHNlcy4iIiIKKworICAgIGRlZiBydW4oc2VsZiwgY2FsbGJhY2ssIGtleT1Ob25lLCBjb21wbGV0ZXI9Tm9uZSwgb25lcnJvcj1Ob25lKToKKyAgICAgICAgaWYga2V5OiBrZXkgPSBsb3dlcihrZXkpCisgICAgICAgIHNlbGYucXVpdCA9IEZhbHNlCisgICAgICAgIHNlZW4gPSB7fQorCisgICAgICAgIGZvciBtb2RuYW1lIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lczoKKyAgICAgICAgICAgIGlmIG1vZG5hbWUgIT0gJ19fbWFpbl9fJzoKKyAgICAgICAgICAgICAgICBzZWVuW21vZG5hbWVdID0gMQorICAgICAgICAgICAgICAgIGlmIGtleSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhOb25lLCBtb2RuYW1lLCAnJykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkZXNjID0gc3BsaXQoX19pbXBvcnRfXyhtb2RuYW1lKS5fX2RvY19fIG9yICcnLCAnXG4nKVswXQorICAgICAgICAgICAgICAgICAgICBpZiBmaW5kKGxvd2VyKG1vZG5hbWUgKyAnIC0gJyArIGRlc2MpLCBrZXkpID49IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhOb25lLCBtb2RuYW1lLCBkZXNjKQorCisgICAgICAgIGZvciBpbXBvcnRlciwgbW9kbmFtZSwgaXNwa2cgaW4gcGtndXRpbC53YWxrX3BhY2thZ2VzKG9uZXJyb3I9b25lcnJvcik6CisgICAgICAgICAgICBpZiBzZWxmLnF1aXQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGtleSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNhbGxiYWNrKE5vbmUsIG1vZG5hbWUsICcnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShtb2RuYW1lKQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIobG9hZGVyLCdnZXRfc291cmNlJyk6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBTdHJpbmdJTworICAgICAgICAgICAgICAgICAgICBkZXNjID0gc291cmNlX3N5bm9wc2lzKAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nSU8uU3RyaW5nSU8obG9hZGVyLmdldF9zb3VyY2UobW9kbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICkgb3IgJycKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihsb2FkZXIsJ2dldF9maWxlbmFtZScpOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGxvYWRlci5nZXRfZmlsZW5hbWUobW9kbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlID0gbG9hZGVyLmxvYWRfbW9kdWxlKG1vZG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSAobW9kdWxlLl9fZG9jX18gb3IgJycpLnNwbGl0bGluZXMoKVswXQorICAgICAgICAgICAgICAgICAgICBwYXRoID0gZ2V0YXR0cihtb2R1bGUsJ19fZmlsZV9fJyxOb25lKQorICAgICAgICAgICAgICAgIGlmIGZpbmQobG93ZXIobW9kbmFtZSArICcgLSAnICsgZGVzYyksIGtleSkgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socGF0aCwgbW9kbmFtZSwgZGVzYykKKworICAgICAgICBpZiBjb21wbGV0ZXI6CisgICAgICAgICAgICBjb21wbGV0ZXIoKQorCitkZWYgYXByb3BvcyhrZXkpOgorICAgICIiIlByaW50IGFsbCB0aGUgb25lLWxpbmUgbW9kdWxlIHN1bW1hcmllcyB0aGF0IGNvbnRhaW4gYSBzdWJzdHJpbmcuIiIiCisgICAgZGVmIGNhbGxiYWNrKHBhdGgsIG1vZG5hbWUsIGRlc2MpOgorICAgICAgICBpZiBtb2RuYW1lWy05Ol0gPT0gJy5fX2luaXRfXyc6CisgICAgICAgICAgICBtb2RuYW1lID0gbW9kbmFtZVs6LTldICsgJyAocGFja2FnZSknCisgICAgICAgIHByaW50IG1vZG5hbWUsIGRlc2MgYW5kICctICcgKyBkZXNjCisgICAgZGVmIG9uZXJyb3IobW9kbmFtZSk6CisgICAgICAgIHBhc3MKKyAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnKSAjIGlnbm9yZSBwcm9ibGVtcyBkdXJpbmcgaW1wb3J0CisgICAgICAgIE1vZHVsZVNjYW5uZXIoKS5ydW4oY2FsbGJhY2ssIGtleSwgb25lcnJvcj1vbmVycm9yKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB3ZWIgYnJvd3NlciBpbnRlcmZhY2UKKworZGVmIHNlcnZlKHBvcnQsIGNhbGxiYWNrPU5vbmUsIGNvbXBsZXRlcj1Ob25lKToKKyAgICBpbXBvcnQgQmFzZUhUVFBTZXJ2ZXIsIG1pbWV0b29scywgc2VsZWN0CisKKyAgICAjIFBhdGNoIHVwIG1pbWV0b29scy5NZXNzYWdlIHNvIGl0IGRvZXNuJ3QgYnJlYWsgaWYgcmZjODIyIGlzIHJlbG9hZGVkLgorICAgIGNsYXNzIE1lc3NhZ2UobWltZXRvb2xzLk1lc3NhZ2UpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZnAsIHNlZWthYmxlPTEpOgorICAgICAgICAgICAgTWVzc2FnZSA9IHNlbGYuX19jbGFzc19fCisgICAgICAgICAgICBNZXNzYWdlLl9fYmFzZXNfX1swXS5fX2Jhc2VzX19bMF0uX19pbml0X18oc2VsZiwgZnAsIHNlZWthYmxlKQorICAgICAgICAgICAgc2VsZi5lbmNvZGluZ2hlYWRlciA9IHNlbGYuZ2V0aGVhZGVyKCdjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJykKKyAgICAgICAgICAgIHNlbGYudHlwZWhlYWRlciA9IHNlbGYuZ2V0aGVhZGVyKCdjb250ZW50LXR5cGUnKQorICAgICAgICAgICAgc2VsZi5wYXJzZXR5cGUoKQorICAgICAgICAgICAgc2VsZi5wYXJzZXBsaXN0KCkKKworICAgIGNsYXNzIERvY0hhbmRsZXIoQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisgICAgICAgIGRlZiBzZW5kX2RvY3VtZW50KHNlbGYsIHRpdGxlLCBjb250ZW50cyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJykKKyAgICAgICAgICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKGh0bWwucGFnZSh0aXRsZSwgY29udGVudHMpKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6IHBhc3MKKworICAgICAgICBkZWYgZG9fR0VUKHNlbGYpOgorICAgICAgICAgICAgcGF0aCA9IHNlbGYucGF0aAorICAgICAgICAgICAgaWYgcGF0aFstNTpdID09ICcuaHRtbCc6IHBhdGggPSBwYXRoWzotNV0KKyAgICAgICAgICAgIGlmIHBhdGhbOjFdID09ICcvJzogcGF0aCA9IHBhdGhbMTpdCisgICAgICAgICAgICBpZiBwYXRoIGFuZCBwYXRoICE9ICcuJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9iaiA9IGxvY2F0ZShwYXRoLCBmb3JjZWxvYWQ9MSkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXJyb3JEdXJpbmdJbXBvcnQsIHZhbHVlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmRfZG9jdW1lbnQocGF0aCwgaHRtbC5lc2NhcGUoc3RyKHZhbHVlKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGlmIG9iajoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2RvY3VtZW50KGRlc2NyaWJlKG9iaiksIGh0bWwuZG9jdW1lbnQob2JqLCBwYXRoKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmRfZG9jdW1lbnQocGF0aCwKKydubyBQeXRob24gZG9jdW1lbnRhdGlvbiBmb3VuZCBmb3IgJXMnICUgcmVwcihwYXRoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaGVhZGluZyA9IGh0bWwuaGVhZGluZygKKyc8YmlnPjxiaWc+PHN0cm9uZz5QeXRob246IEluZGV4IG9mIE1vZHVsZXM8L3N0cm9uZz48L2JpZz48L2JpZz4nLAorJyNmZmZmZmYnLCAnIzc3OTllZScpCisgICAgICAgICAgICAgICAgZGVmIGJsdGlubGluayhuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8YSBocmVmPSIlcy5odG1sIj4lczwvYT4nICUgKG5hbWUsIG5hbWUpCisgICAgICAgICAgICAgICAgbmFtZXMgPSBmaWx0ZXIobGFtYmRhIHg6IHggIT0gJ19fbWFpbl9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMpCisgICAgICAgICAgICAgICAgY29udGVudHMgPSBodG1sLm11bHRpY29sdW1uKG5hbWVzLCBibHRpbmxpbmspCisgICAgICAgICAgICAgICAgaW5kaWNlcyA9IFsnPHA+JyArIGh0bWwuYmlnc2VjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgJ0J1aWx0LWluIE1vZHVsZXMnLCAnI2ZmZmZmZicsICcjZWU3N2FhJywgY29udGVudHMpXQorCisgICAgICAgICAgICAgICAgc2VlbiA9IHt9CisgICAgICAgICAgICAgICAgZm9yIGRpciBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgICAgICAgICAgaW5kaWNlcy5hcHBlbmQoaHRtbC5pbmRleChkaXIsIHNlZW4pKQorICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gaGVhZGluZyArIGpvaW4oaW5kaWNlcykgKyAnJyc8cCBhbGlnbj1yaWdodD4KKzxmb250IGNvbG9yPSIjOTA5MDkwIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48c3Ryb25nPgorcHlkb2M8L3N0cm9uZz4gYnkgS2EtUGluZyBZZWUgJmx0O3BpbmdAbGZ3Lm9yZyZndDs8L2ZvbnQ+JycnCisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2RvY3VtZW50KCdJbmRleCBvZiBNb2R1bGVzJywgY29udGVudHMpCisKKyAgICAgICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsICphcmdzKTogcGFzcworCisgICAgY2xhc3MgRG9jU2VydmVyKEJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydCwgY2FsbGJhY2spOgorICAgICAgICAgICAgaG9zdCA9ICdsb2NhbGhvc3QnCisgICAgICAgICAgICBzZWxmLmFkZHJlc3MgPSAoaG9zdCwgcG9ydCkKKyAgICAgICAgICAgIHNlbGYudXJsID0gJ2h0dHA6Ly8lczolZC8nICUgKGhvc3QsIHBvcnQpCisgICAgICAgICAgICBzZWxmLmNhbGxiYWNrID0gY2FsbGJhY2sKKyAgICAgICAgICAgIHNlbGYuYmFzZS5fX2luaXRfXyhzZWxmLCBzZWxmLmFkZHJlc3MsIHNlbGYuaGFuZGxlcikKKworICAgICAgICBkZWYgc2VydmVfdW50aWxfcXVpdChzZWxmKToKKyAgICAgICAgICAgIGltcG9ydCBzZWxlY3QKKyAgICAgICAgICAgIHNlbGYucXVpdCA9IEZhbHNlCisgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWl0OgorICAgICAgICAgICAgICAgIHJkLCB3ciwgZXggPSBzZWxlY3Quc2VsZWN0KFtzZWxmLnNvY2tldC5maWxlbm8oKV0sIFtdLCBbXSwgMSkKKyAgICAgICAgICAgICAgICBpZiByZDogc2VsZi5oYW5kbGVfcmVxdWVzdCgpCisKKyAgICAgICAgZGVmIHNlcnZlcl9hY3RpdmF0ZShzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYmFzZS5zZXJ2ZXJfYWN0aXZhdGUoc2VsZikKKyAgICAgICAgICAgIGlmIHNlbGYuY2FsbGJhY2s6IHNlbGYuY2FsbGJhY2soc2VsZikKKworICAgIERvY1NlcnZlci5iYXNlID0gQmFzZUhUVFBTZXJ2ZXIuSFRUUFNlcnZlcgorICAgIERvY1NlcnZlci5oYW5kbGVyID0gRG9jSGFuZGxlcgorICAgIERvY0hhbmRsZXIuTWVzc2FnZUNsYXNzID0gTWVzc2FnZQorICAgIHRyeToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgRG9jU2VydmVyKHBvcnQsIGNhbGxiYWNrKS5zZXJ2ZV91bnRpbF9xdWl0KCkKKyAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgc2VsZWN0LmVycm9yKToKKyAgICAgICAgICAgIHBhc3MKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBjb21wbGV0ZXI6IGNvbXBsZXRlcigpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ3JhcGhpY2FsIGludGVyZmFjZQorCitkZWYgZ3VpKCk6CisgICAgIiIiR3JhcGhpY2FsIGludGVyZmFjZSAoc3RhcnRzIHdlYiBzZXJ2ZXIgYW5kIHBvcHMgdXAgYSBjb250cm9sIHdpbmRvdykuIiIiCisgICAgY2xhc3MgR1VJOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgd2luZG93LCBwb3J0PTc0NjQpOgorICAgICAgICAgICAgc2VsZi53aW5kb3cgPSB3aW5kb3cKKyAgICAgICAgICAgIHNlbGYuc2VydmVyID0gTm9uZQorICAgICAgICAgICAgc2VsZi5zY2FubmVyID0gTm9uZQorCisgICAgICAgICAgICBpbXBvcnQgVGtpbnRlcgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfZnJtID0gVGtpbnRlci5GcmFtZSh3aW5kb3cpCisgICAgICAgICAgICBzZWxmLnRpdGxlX2xibCA9IFRraW50ZXIuTGFiZWwoc2VsZi5zZXJ2ZXJfZnJtLAorICAgICAgICAgICAgICAgIHRleHQ9J1N0YXJ0aW5nIHNlcnZlci4uLlxuICcpCisgICAgICAgICAgICBzZWxmLm9wZW5fYnRuID0gVGtpbnRlci5CdXR0b24oc2VsZi5zZXJ2ZXJfZnJtLAorICAgICAgICAgICAgICAgIHRleHQ9J29wZW4gYnJvd3NlcicsIGNvbW1hbmQ9c2VsZi5vcGVuLCBzdGF0ZT0nZGlzYWJsZWQnKQorICAgICAgICAgICAgc2VsZi5xdWl0X2J0biA9IFRraW50ZXIuQnV0dG9uKHNlbGYuc2VydmVyX2ZybSwKKyAgICAgICAgICAgICAgICB0ZXh0PSdxdWl0IHNlcnZpbmcnLCBjb21tYW5kPXNlbGYucXVpdCwgc3RhdGU9J2Rpc2FibGVkJykKKworICAgICAgICAgICAgc2VsZi5zZWFyY2hfZnJtID0gVGtpbnRlci5GcmFtZSh3aW5kb3cpCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9sYmwgPSBUa2ludGVyLkxhYmVsKHNlbGYuc2VhcmNoX2ZybSwgdGV4dD0nU2VhcmNoIGZvcicpCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9lbnQgPSBUa2ludGVyLkVudHJ5KHNlbGYuc2VhcmNoX2ZybSkKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2VudC5iaW5kKCc8UmV0dXJuPicsIHNlbGYuc2VhcmNoKQorICAgICAgICAgICAgc2VsZi5zdG9wX2J0biA9IFRraW50ZXIuQnV0dG9uKHNlbGYuc2VhcmNoX2ZybSwKKyAgICAgICAgICAgICAgICB0ZXh0PSdzdG9wJywgcGFkeT0wLCBjb21tYW5kPXNlbGYuc3RvcCwgc3RhdGU9J2Rpc2FibGVkJykKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgICAgICMgVHJ5aW5nIHRvIGhpZGUgYW5kIHNob3cgdGhpcyBidXR0b24gY3Jhc2hlcyB1bmRlciBXaW5kb3dzLgorICAgICAgICAgICAgICAgIHNlbGYuc3RvcF9idG4ucGFjayhzaWRlPSdyaWdodCcpCisKKyAgICAgICAgICAgIHNlbGYud2luZG93LnRpdGxlKCdweWRvYycpCisgICAgICAgICAgICBzZWxmLndpbmRvdy5wcm90b2NvbCgnV01fREVMRVRFX1dJTkRPVycsIHNlbGYucXVpdCkKKyAgICAgICAgICAgIHNlbGYudGl0bGVfbGJsLnBhY2soc2lkZT0ndG9wJywgZmlsbD0neCcpCisgICAgICAgICAgICBzZWxmLm9wZW5fYnRuLnBhY2soc2lkZT0nbGVmdCcsIGZpbGw9J3gnLCBleHBhbmQ9MSkKKyAgICAgICAgICAgIHNlbGYucXVpdF9idG4ucGFjayhzaWRlPSdyaWdodCcsIGZpbGw9J3gnLCBleHBhbmQ9MSkKKyAgICAgICAgICAgIHNlbGYuc2VydmVyX2ZybS5wYWNrKHNpZGU9J3RvcCcsIGZpbGw9J3gnKQorCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9sYmwucGFjayhzaWRlPSdsZWZ0JykKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2VudC5wYWNrKHNpZGU9J3JpZ2h0JywgZmlsbD0neCcsIGV4cGFuZD0xKQorICAgICAgICAgICAgc2VsZi5zZWFyY2hfZnJtLnBhY2soc2lkZT0ndG9wJywgZmlsbD0neCcpCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9lbnQuZm9jdXNfc2V0KCkKKworICAgICAgICAgICAgZm9udCA9ICgnaGVsdmV0aWNhJywgc3lzLnBsYXRmb3JtID09ICd3aW4zMicgYW5kIDggb3IgMTApCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9sc3QgPSBUa2ludGVyLkxpc3Rib3god2luZG93LCBmb250PWZvbnQsIGhlaWdodD02KQorICAgICAgICAgICAgc2VsZi5yZXN1bHRfbHN0LmJpbmQoJzxCdXR0b24tMT4nLCBzZWxmLnNlbGVjdCkKKyAgICAgICAgICAgIHNlbGYucmVzdWx0X2xzdC5iaW5kKCc8RG91YmxlLUJ1dHRvbi0xPicsIHNlbGYuZ290bykKKyAgICAgICAgICAgIHNlbGYucmVzdWx0X3NjciA9IFRraW50ZXIuU2Nyb2xsYmFyKHdpbmRvdywKKyAgICAgICAgICAgICAgICBvcmllbnQ9J3ZlcnRpY2FsJywgY29tbWFuZD1zZWxmLnJlc3VsdF9sc3QueXZpZXcpCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9sc3QuY29uZmlnKHlzY3JvbGxjb21tYW5kPXNlbGYucmVzdWx0X3Njci5zZXQpCisKKyAgICAgICAgICAgIHNlbGYucmVzdWx0X2ZybSA9IFRraW50ZXIuRnJhbWUod2luZG93KQorICAgICAgICAgICAgc2VsZi5nb3RvX2J0biA9IFRraW50ZXIuQnV0dG9uKHNlbGYucmVzdWx0X2ZybSwKKyAgICAgICAgICAgICAgICB0ZXh0PSdnbyB0byBzZWxlY3RlZCcsIGNvbW1hbmQ9c2VsZi5nb3RvKQorICAgICAgICAgICAgc2VsZi5oaWRlX2J0biA9IFRraW50ZXIuQnV0dG9uKHNlbGYucmVzdWx0X2ZybSwKKyAgICAgICAgICAgICAgICB0ZXh0PSdoaWRlIHJlc3VsdHMnLCBjb21tYW5kPXNlbGYuaGlkZSkKKyAgICAgICAgICAgIHNlbGYuZ290b19idG4ucGFjayhzaWRlPSdsZWZ0JywgZmlsbD0neCcsIGV4cGFuZD0xKQorICAgICAgICAgICAgc2VsZi5oaWRlX2J0bi5wYWNrKHNpZGU9J3JpZ2h0JywgZmlsbD0neCcsIGV4cGFuZD0xKQorCisgICAgICAgICAgICBzZWxmLndpbmRvdy51cGRhdGUoKQorICAgICAgICAgICAgc2VsZi5taW53aWR0aCA9IHNlbGYud2luZG93LndpbmZvX3dpZHRoKCkKKyAgICAgICAgICAgIHNlbGYubWluaGVpZ2h0ID0gc2VsZi53aW5kb3cud2luZm9faGVpZ2h0KCkKKyAgICAgICAgICAgIHNlbGYuYmlnbWluaGVpZ2h0ID0gKHNlbGYuc2VydmVyX2ZybS53aW5mb19yZXFoZWlnaHQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlYXJjaF9mcm0ud2luZm9fcmVxaGVpZ2h0KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRfbHN0LndpbmZvX3JlcWhlaWdodCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0X2ZybS53aW5mb19yZXFoZWlnaHQoKSkKKyAgICAgICAgICAgIHNlbGYuYmlnd2lkdGgsIHNlbGYuYmlnaGVpZ2h0ID0gc2VsZi5taW53aWR0aCwgc2VsZi5iaWdtaW5oZWlnaHQKKyAgICAgICAgICAgIHNlbGYuZXhwYW5kZWQgPSAwCisgICAgICAgICAgICBzZWxmLndpbmRvdy53bV9nZW9tZXRyeSgnJWR4JWQnICUgKHNlbGYubWlud2lkdGgsIHNlbGYubWluaGVpZ2h0KSkKKyAgICAgICAgICAgIHNlbGYud2luZG93LndtX21pbnNpemUoc2VsZi5taW53aWR0aCwgc2VsZi5taW5oZWlnaHQpCisgICAgICAgICAgICBzZWxmLndpbmRvdy50ay53aWxsZGlzcGF0Y2goKQorCisgICAgICAgICAgICBpbXBvcnQgdGhyZWFkaW5nCisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKAorICAgICAgICAgICAgICAgIHRhcmdldD1zZXJ2ZSwgYXJncz0ocG9ydCwgc2VsZi5yZWFkeSwgc2VsZi5xdWl0KSkuc3RhcnQoKQorCisgICAgICAgIGRlZiByZWFkeShzZWxmLCBzZXJ2ZXIpOgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIgPSBzZXJ2ZXIKKyAgICAgICAgICAgIHNlbGYudGl0bGVfbGJsLmNvbmZpZygKKyAgICAgICAgICAgICAgICB0ZXh0PSdQeXRob24gZG9jdW1lbnRhdGlvbiBzZXJ2ZXIgYXRcbicgKyBzZXJ2ZXIudXJsKQorICAgICAgICAgICAgc2VsZi5vcGVuX2J0bi5jb25maWcoc3RhdGU9J25vcm1hbCcpCisgICAgICAgICAgICBzZWxmLnF1aXRfYnRuLmNvbmZpZyhzdGF0ZT0nbm9ybWFsJykKKworICAgICAgICBkZWYgb3BlbihzZWxmLCBldmVudD1Ob25lLCB1cmw9Tm9uZSk6CisgICAgICAgICAgICB1cmwgPSB1cmwgb3Igc2VsZi5zZXJ2ZXIudXJsCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IHdlYmJyb3dzZXIKKyAgICAgICAgICAgICAgICB3ZWJicm93c2VyLm9wZW4odXJsKQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOiAjIHByZS13ZWJicm93c2VyLnB5IGNvbXBhdGliaWxpdHkKKyAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgICAgICAgICAgb3Muc3lzdGVtKCdzdGFydCAiJXMiJyAlIHVybCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYyA9IG9zLnN5c3RlbSgnbmV0c2NhcGUgLXJlbW90ZSAib3BlblVSTCglcykiICYnICUgdXJsKQorICAgICAgICAgICAgICAgICAgICBpZiByYzogb3Muc3lzdGVtKCduZXRzY2FwZSAiJXMiICYnICUgdXJsKQorCisgICAgICAgIGRlZiBxdWl0KHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICAgICAgaWYgc2VsZi5zZXJ2ZXI6CisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIucXVpdCA9IDEKKyAgICAgICAgICAgIHNlbGYud2luZG93LnF1aXQoKQorCisgICAgICAgIGRlZiBzZWFyY2goc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgICAgICBrZXkgPSBzZWxmLnNlYXJjaF9lbnQuZ2V0KCkKKyAgICAgICAgICAgIHNlbGYuc3RvcF9idG4ucGFjayhzaWRlPSdyaWdodCcpCisgICAgICAgICAgICBzZWxmLnN0b3BfYnRuLmNvbmZpZyhzdGF0ZT0nbm9ybWFsJykKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2xibC5jb25maWcodGV4dD0nU2VhcmNoaW5nIGZvciAiJXMiLi4uJyAlIGtleSkKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2VudC5mb3JnZXQoKQorICAgICAgICAgICAgc2VsZi5zZWFyY2hfbGJsLnBhY2soc2lkZT0nbGVmdCcpCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9sc3QuZGVsZXRlKDAsICdlbmQnKQorICAgICAgICAgICAgc2VsZi5nb3RvX2J0bi5jb25maWcoc3RhdGU9J2Rpc2FibGVkJykKKyAgICAgICAgICAgIHNlbGYuZXhwYW5kKCkKKworICAgICAgICAgICAgaW1wb3J0IHRocmVhZGluZworICAgICAgICAgICAgaWYgc2VsZi5zY2FubmVyOgorICAgICAgICAgICAgICAgIHNlbGYuc2Nhbm5lci5xdWl0ID0gMQorICAgICAgICAgICAgc2VsZi5zY2FubmVyID0gTW9kdWxlU2Nhbm5lcigpCisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLnNjYW5uZXIucnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShzZWxmLnVwZGF0ZSwga2V5LCBzZWxmLmRvbmUpKS5zdGFydCgpCisKKyAgICAgICAgZGVmIHVwZGF0ZShzZWxmLCBwYXRoLCBtb2RuYW1lLCBkZXNjKToKKyAgICAgICAgICAgIGlmIG1vZG5hbWVbLTk6XSA9PSAnLl9faW5pdF9fJzoKKyAgICAgICAgICAgICAgICBtb2RuYW1lID0gbW9kbmFtZVs6LTldICsgJyAocGFja2FnZSknCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9sc3QuaW5zZXJ0KCdlbmQnLAorICAgICAgICAgICAgICAgIG1vZG5hbWUgKyAnIC0gJyArIChkZXNjIG9yICcobm8gZGVzY3JpcHRpb24pJykpCisKKyAgICAgICAgZGVmIHN0b3Aoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgICAgICBpZiBzZWxmLnNjYW5uZXI6CisgICAgICAgICAgICAgICAgc2VsZi5zY2FubmVyLnF1aXQgPSAxCisgICAgICAgICAgICAgICAgc2VsZi5zY2FubmVyID0gTm9uZQorCisgICAgICAgIGRlZiBkb25lKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5zY2FubmVyID0gTm9uZQorICAgICAgICAgICAgc2VsZi5zZWFyY2hfbGJsLmNvbmZpZyh0ZXh0PSdTZWFyY2ggZm9yJykKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2xibC5wYWNrKHNpZGU9J2xlZnQnKQorICAgICAgICAgICAgc2VsZi5zZWFyY2hfZW50LnBhY2soc2lkZT0ncmlnaHQnLCBmaWxsPSd4JywgZXhwYW5kPTEpCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJzogc2VsZi5zdG9wX2J0bi5mb3JnZXQoKQorICAgICAgICAgICAgc2VsZi5zdG9wX2J0bi5jb25maWcoc3RhdGU9J2Rpc2FibGVkJykKKworICAgICAgICBkZWYgc2VsZWN0KHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICAgICAgc2VsZi5nb3RvX2J0bi5jb25maWcoc3RhdGU9J25vcm1hbCcpCisKKyAgICAgICAgZGVmIGdvdG8oc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLnJlc3VsdF9sc3QuY3Vyc2VsZWN0aW9uKCkKKyAgICAgICAgICAgIGlmIHNlbGVjdGlvbjoKKyAgICAgICAgICAgICAgICBtb2RuYW1lID0gc3BsaXQoc2VsZi5yZXN1bHRfbHN0LmdldChzZWxlY3Rpb25bMF0pKVswXQorICAgICAgICAgICAgICAgIHNlbGYub3Blbih1cmw9c2VsZi5zZXJ2ZXIudXJsICsgbW9kbmFtZSArICcuaHRtbCcpCisKKyAgICAgICAgZGVmIGNvbGxhcHNlKHNlbGYpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuZXhwYW5kZWQ6IHJldHVybgorICAgICAgICAgICAgc2VsZi5yZXN1bHRfZnJtLmZvcmdldCgpCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9zY3IuZm9yZ2V0KCkKKyAgICAgICAgICAgIHNlbGYucmVzdWx0X2xzdC5mb3JnZXQoKQorICAgICAgICAgICAgc2VsZi5iaWd3aWR0aCA9IHNlbGYud2luZG93LndpbmZvX3dpZHRoKCkKKyAgICAgICAgICAgIHNlbGYuYmlnaGVpZ2h0ID0gc2VsZi53aW5kb3cud2luZm9faGVpZ2h0KCkKKyAgICAgICAgICAgIHNlbGYud2luZG93LndtX2dlb21ldHJ5KCclZHglZCcgJSAoc2VsZi5taW53aWR0aCwgc2VsZi5taW5oZWlnaHQpKQorICAgICAgICAgICAgc2VsZi53aW5kb3cud21fbWluc2l6ZShzZWxmLm1pbndpZHRoLCBzZWxmLm1pbmhlaWdodCkKKyAgICAgICAgICAgIHNlbGYuZXhwYW5kZWQgPSAwCisKKyAgICAgICAgZGVmIGV4cGFuZChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuZXhwYW5kZWQ6IHJldHVybgorICAgICAgICAgICAgc2VsZi5yZXN1bHRfZnJtLnBhY2soc2lkZT0nYm90dG9tJywgZmlsbD0neCcpCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9zY3IucGFjayhzaWRlPSdyaWdodCcsIGZpbGw9J3knKQorICAgICAgICAgICAgc2VsZi5yZXN1bHRfbHN0LnBhY2soc2lkZT0ndG9wJywgZmlsbD0nYm90aCcsIGV4cGFuZD0xKQorICAgICAgICAgICAgc2VsZi53aW5kb3cud21fZ2VvbWV0cnkoJyVkeCVkJyAlIChzZWxmLmJpZ3dpZHRoLCBzZWxmLmJpZ2hlaWdodCkpCisgICAgICAgICAgICBzZWxmLndpbmRvdy53bV9taW5zaXplKHNlbGYubWlud2lkdGgsIHNlbGYuYmlnbWluaGVpZ2h0KQorICAgICAgICAgICAgc2VsZi5leHBhbmRlZCA9IDEKKworICAgICAgICBkZWYgaGlkZShzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgICAgIHNlbGYuc3RvcCgpCisgICAgICAgICAgICBzZWxmLmNvbGxhcHNlKCkKKworICAgIGltcG9ydCBUa2ludGVyCisgICAgdHJ5OgorICAgICAgICByb290ID0gVGtpbnRlci5UaygpCisgICAgICAgICMgVGsgd2lsbCBjcmFzaCBpZiBweXRob253LmV4ZSBoYXMgYW4gWFAgLm1hbmlmZXN0CisgICAgICAgICMgZmlsZSBhbmQgdGhlIHJvb3QgaGFzIGlzIG5vdCBkZXN0cm95ZWQgZXhwbGljaXRseS4KKyAgICAgICAgIyBJZiB0aGUgcHJvYmxlbSBpcyBldmVyIGZpeGVkIGluIFRrLCB0aGUgZXhwbGljaXQKKyAgICAgICAgIyBkZXN0cm95IGNhbiBnby4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZ3VpID0gR1VJKHJvb3QpCisgICAgICAgICAgICByb290Lm1haW5sb29wKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHJvb3QuZGVzdHJveSgpCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICBwYXNzCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29tbWFuZC1saW5lIGludGVyZmFjZQorCitkZWYgaXNwYXRoKHgpOgorICAgIHJldHVybiBpc2luc3RhbmNlKHgsIHN0cikgYW5kIGZpbmQoeCwgb3Muc2VwKSA+PSAwCisKK2RlZiBjbGkoKToKKyAgICAiIiJDb21tYW5kLWxpbmUgaW50ZXJmYWNlIChsb29rcyBhdCBzeXMuYXJndiB0byBkZWNpZGUgd2hhdCB0byBkbykuIiIiCisgICAgaW1wb3J0IGdldG9wdAorICAgIGNsYXNzIEJhZFVzYWdlOiBwYXNzCisKKyAgICAjIFNjcmlwdHMgZG9uJ3QgZ2V0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpbiB0aGVpciBwYXRoIGJ5IGRlZmF1bHQKKyAgICAjIHVubGVzcyB0aGV5IGFyZSBydW4gd2l0aCB0aGUgJy1tJyBzd2l0Y2gKKyAgICBpZiAnJyBub3QgaW4gc3lzLnBhdGg6CisgICAgICAgIHNjcmlwdGRpciA9IG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSkKKyAgICAgICAgaWYgc2NyaXB0ZGlyIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgc3lzLnBhdGgucmVtb3ZlKHNjcmlwdGRpcikKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsICcuJykKKworICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnZ2s6cDp3JykKKyAgICAgICAgd3JpdGluZyA9IDAKKworICAgICAgICBmb3Igb3B0LCB2YWwgaW4gb3B0czoKKyAgICAgICAgICAgIGlmIG9wdCA9PSAnLWcnOgorICAgICAgICAgICAgICAgIGd1aSgpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBvcHQgPT0gJy1rJzoKKyAgICAgICAgICAgICAgICBhcHJvcG9zKHZhbCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG9wdCA9PSAnLXAnOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGludCh2YWwpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJhZFVzYWdlCisgICAgICAgICAgICAgICAgZGVmIHJlYWR5KHNlcnZlcik6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICdweWRvYyBzZXJ2ZXIgcmVhZHkgYXQgJXMnICUgc2VydmVyLnVybAorICAgICAgICAgICAgICAgIGRlZiBzdG9wcGVkKCk6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICdweWRvYyBzZXJ2ZXIgc3RvcHBlZCcKKyAgICAgICAgICAgICAgICBzZXJ2ZShwb3J0LCByZWFkeSwgc3RvcHBlZCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG9wdCA9PSAnLXcnOgorICAgICAgICAgICAgICAgIHdyaXRpbmcgPSAxCisKKyAgICAgICAgaWYgbm90IGFyZ3M6IHJhaXNlIEJhZFVzYWdlCisgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgIGlmIGlzcGF0aChhcmcpIGFuZCBub3Qgb3MucGF0aC5leGlzdHMoYXJnKToKKyAgICAgICAgICAgICAgICBwcmludCAnZmlsZSAlciBkb2VzIG5vdCBleGlzdCcgJSBhcmcKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGlzcGF0aChhcmcpIGFuZCBvcy5wYXRoLmlzZmlsZShhcmcpOgorICAgICAgICAgICAgICAgICAgICBhcmcgPSBpbXBvcnRmaWxlKGFyZykKKyAgICAgICAgICAgICAgICBpZiB3cml0aW5nOgorICAgICAgICAgICAgICAgICAgICBpZiBpc3BhdGgoYXJnKSBhbmQgb3MucGF0aC5pc2RpcihhcmcpOgorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVkb2NzKGFyZykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlZG9jKGFyZykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBoZWxwLmhlbHAoYXJnKQorICAgICAgICAgICAgZXhjZXB0IEVycm9yRHVyaW5nSW1wb3J0LCB2YWx1ZToKKyAgICAgICAgICAgICAgICBwcmludCB2YWx1ZQorCisgICAgZXhjZXB0IChnZXRvcHQuZXJyb3IsIEJhZFVzYWdlKToKKyAgICAgICAgY21kID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKKyAgICAgICAgcHJpbnQgIiIicHlkb2MgLSB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24gdG9vbAorCislcyA8bmFtZT4gLi4uCisgICAgU2hvdyB0ZXh0IGRvY3VtZW50YXRpb24gb24gc29tZXRoaW5nLiAgPG5hbWU+IG1heSBiZSB0aGUgbmFtZSBvZiBhCisgICAgUHl0aG9uIGtleXdvcmQsIHRvcGljLCBmdW5jdGlvbiwgbW9kdWxlLCBvciBwYWNrYWdlLCBvciBhIGRvdHRlZAorICAgIHJlZmVyZW5jZSB0byBhIGNsYXNzIG9yIGZ1bmN0aW9uIHdpdGhpbiBhIG1vZHVsZSBvciBtb2R1bGUgaW4gYQorICAgIHBhY2thZ2UuICBJZiA8bmFtZT4gY29udGFpbnMgYSAnJXMnLCBpdCBpcyB1c2VkIGFzIHRoZSBwYXRoIHRvIGEKKyAgICBQeXRob24gc291cmNlIGZpbGUgdG8gZG9jdW1lbnQuIElmIG5hbWUgaXMgJ2tleXdvcmRzJywgJ3RvcGljcycsCisgICAgb3IgJ21vZHVsZXMnLCBhIGxpc3Rpbmcgb2YgdGhlc2UgdGhpbmdzIGlzIGRpc3BsYXllZC4KKworJXMgLWsgPGtleXdvcmQ+CisgICAgU2VhcmNoIGZvciBhIGtleXdvcmQgaW4gdGhlIHN5bm9wc2lzIGxpbmVzIG9mIGFsbCBhdmFpbGFibGUgbW9kdWxlcy4KKworJXMgLXAgPHBvcnQ+CisgICAgU3RhcnQgYW4gSFRUUCBzZXJ2ZXIgb24gdGhlIGdpdmVuIHBvcnQgb24gdGhlIGxvY2FsIG1hY2hpbmUuCisKKyVzIC1nCisgICAgUG9wIHVwIGEgZ3JhcGhpY2FsIGludGVyZmFjZSBmb3IgZmluZGluZyBhbmQgc2VydmluZyBkb2N1bWVudGF0aW9uLgorCislcyAtdyA8bmFtZT4gLi4uCisgICAgV3JpdGUgb3V0IHRoZSBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGEgbW9kdWxlIHRvIGEgZmlsZSBpbiB0aGUgY3VycmVudAorICAgIGRpcmVjdG9yeS4gIElmIDxuYW1lPiBjb250YWlucyBhICclcycsIGl0IGlzIHRyZWF0ZWQgYXMgYSBmaWxlbmFtZTsgaWYKKyAgICBpdCBuYW1lcyBhIGRpcmVjdG9yeSwgZG9jdW1lbnRhdGlvbiBpcyB3cml0dGVuIGZvciBhbGwgdGhlIGNvbnRlbnRzLgorIiIiICUgKGNtZCwgb3Muc2VwLCBjbWQsIGNtZCwgY21kLCBjbWQsIG9zLnNlcCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzogY2xpKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHlkb2MucHljIGIvbGliL3B5dGhvbjIuNy9weWRvYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2NWM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHlkb2MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHlkb2MucHlvIGIvbGliL3B5dGhvbjIuNy9weWRvYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiOWVkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHlkb2MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B5ZG9jX2RhdGEvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzhiZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B5ZG9jX2RhdGEvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzhiZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B5ZG9jX2RhdGEvdG9waWNzLnB5IGIvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL3RvcGljcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjFjMTVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL3RvcGljcy5weQpAQCAtMCwwICsxLDc3IEBACisjIEF1dG9nZW5lcmF0ZWQgYnkgU3BoaW54IG9uIFNhdCBNYXkgMTEgMjI6MzE6MTMgMjAxMwordG9waWNzID0geydhc3NlcnQnOiAnXG5UaGUgYGBhc3NlcnRgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5Bc3NlcnQgc3RhdGVtZW50cyBhcmUgYSBjb252ZW5pZW50IHdheSB0byBpbnNlcnQgZGVidWdnaW5nIGFzc2VydGlvbnNcbmludG8gYSBwcm9ncmFtOlxuXG4gICBhc3NlcnRfc3RtdCA6Oj0gImFzc2VydCIgZXhwcmVzc2lvbiBbIiwiIGV4cHJlc3Npb25dXG5cblRoZSBzaW1wbGUgZm9ybSwgYGBhc3NlcnQgZXhwcmVzc2lvbmBgLCBpcyBlcXVpdmFsZW50IHRvXG5cbiAgIGlmIF9fZGVidWdfXzpcbiAgICAgIGlmIG5vdCBleHByZXNzaW9uOiByYWlzZSBBc3NlcnRpb25FcnJvclxuXG5UaGUgZXh0ZW5kZWQgZm9ybSwgYGBhc3NlcnQgZXhwcmVzc2lvbjEsIGV4cHJlc3Npb24yYGAsIGlzIGVxdWl2YWxlbnRcbnRvXG5cbiAgIGlmIF9fZGVidWdfXzpcbiAgICAgIGlmIG5vdCBleHByZXNzaW9uMTogcmFpc2UgQXNzZXJ0aW9uRXJyb3IoZXhwcmVzc2lvbjIpXG5cblRoZXNlIGVxdWl2YWxlbmNlcyBhc3N1bWUgdGhhdCBgYF9fZGVidWdfX2BgIGFuZCBgYEFzc2VydGlvbkVycm9yYGBcbnJlZmVyIHRvIHRoZSBidWlsdC1pbiB2YXJpYWJsZXMgd2l0aCB0aG9zZSBuYW1lcy4gIEluIHRoZSBjdXJyZW50XG5pbXBsZW1lbnRhdGlvbiwgdGhlIGJ1aWx0LWluIHZhcmlhYmxlIGBgX19kZWJ1Z19fYGAgaXMgYGBUcnVlYGAgdW5kZXJcbm5vcm1hbCBjaXJjdW1zdGFuY2VzLCBgYEZhbHNlYGAgd2hlbiBvcHRpbWl6YXRpb24gaXMgcmVxdWVzdGVkXG4oY29tbWFuZCBsaW5lIG9wdGlvbiAtTykuICBUaGUgY3VycmVudCBjb2RlIGdlbmVyYXRvciBlbWl0cyBubyBjb2RlXG5mb3IgYW4gYXNzZXJ0IHN0YXRlbWVudCB3aGVuIG9wdGltaXphdGlvbiBpcyByZXF1ZXN0ZWQgYXQgY29tcGlsZVxudGltZS4gIE5vdGUgdGhhdCBpdCBpcyB1bm5lY2Vzc2FyeSB0byBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlXG5leHByZXNzaW9uIHRoYXQgZmFpbGVkIGluIHRoZSBlcnJvciBtZXNzYWdlOyBpdCB3aWxsIGJlIGRpc3BsYXllZCBhc1xucGFydCBvZiB0aGUgc3RhY2sgdHJhY2UuXG5cbkFzc2lnbm1lbnRzIHRvIGBgX19kZWJ1Z19fYGAgYXJlIGlsbGVnYWwuICBUaGUgdmFsdWUgZm9yIHRoZSBidWlsdC1pblxudmFyaWFibGUgaXMgZGV0ZXJtaW5lZCB3aGVuIHRoZSBpbnRlcnByZXRlciBzdGFydHMuXG4nLAorICdhc3NpZ25tZW50JzogJ1xuQXNzaWdubWVudCBzdGF0ZW1lbnRzXG4qKioqKioqKioqKioqKioqKioqKipcblxuQXNzaWdubWVudCBzdGF0ZW1lbnRzIGFyZSB1c2VkIHRvIChyZSliaW5kIG5hbWVzIHRvIHZhbHVlcyBhbmQgdG9cbm1vZGlmeSBhdHRyaWJ1dGVzIG9yIGl0ZW1zIG9mIG11dGFibGUgb2JqZWN0czpcblxuICAgYXNzaWdubWVudF9zdG10IDo6PSAodGFyZ2V0X2xpc3QgIj0iKSsgKGV4cHJlc3Npb25fbGlzdCB8IHlpZWxkX2V4cHJlc3Npb24pXG4gICB0YXJnZXRfbGlzdCAgICAgOjo9IHRhcmdldCAoIiwiIHRhcmdldCkqIFsiLCJdXG4gICB0YXJnZXQgICAgICAgICAgOjo9IGlkZW50aWZpZXJcbiAgICAgICAgICAgICAgfCAiKCIgdGFyZ2V0X2xpc3QgIikiXG4gICAgICAgICAgICAgIHwgIlsiIHRhcmdldF9saXN0ICJdIlxuICAgICAgICAgICAgICB8IGF0dHJpYnV0ZXJlZlxuICAgICAgICAgICAgICB8IHN1YnNjcmlwdGlvblxuICAgICAgICAgICAgICB8IHNsaWNpbmdcblxuKFNlZSBzZWN0aW9uICpQcmltYXJpZXMqIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIGZvciB0aGUgbGFzdCB0aHJlZVxuc3ltYm9scy4pXG5cbkFuIGFzc2lnbm1lbnQgc3RhdGVtZW50IGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbiBsaXN0IChyZW1lbWJlciB0aGF0XG50aGlzIGNhbiBiZSBhIHNpbmdsZSBleHByZXNzaW9uIG9yIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QsIHRoZSBsYXR0ZXJcbnlpZWxkaW5nIGEgdHVwbGUpIGFuZCBhc3NpZ25zIHRoZSBzaW5nbGUgcmVzdWx0aW5nIG9iamVjdCB0byBlYWNoIG9mXG50aGUgdGFyZ2V0IGxpc3RzLCBmcm9tIGxlZnQgdG8gcmlnaHQuXG5cbkFzc2lnbm1lbnQgaXMgZGVmaW5lZCByZWN1cnNpdmVseSBkZXBlbmRpbmcgb24gdGhlIGZvcm0gb2YgdGhlIHRhcmdldFxuKGxpc3QpLiBXaGVuIGEgdGFyZ2V0IGlzIHBhcnQgb2YgYSBtdXRhYmxlIG9iamVjdCAoYW4gYXR0cmlidXRlXG5yZWZlcmVuY2UsIHN1YnNjcmlwdGlvbiBvciBzbGljaW5nKSwgdGhlIG11dGFibGUgb2JqZWN0IG11c3RcbnVsdGltYXRlbHkgcGVyZm9ybSB0aGUgYXNzaWdubWVudCBhbmQgZGVjaWRlIGFib3V0IGl0cyB2YWxpZGl0eSwgYW5kXG5tYXkgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBhc3NpZ25tZW50IGlzIHVuYWNjZXB0YWJsZS4gIFRoZSBydWxlc1xub2JzZXJ2ZWQgYnkgdmFyaW91cyB0eXBlcyBhbmQgdGhlIGV4Y2VwdGlvbnMgcmFpc2VkIGFyZSBnaXZlbiB3aXRoIHRoZVxuZGVmaW5pdGlvbiBvZiB0aGUgb2JqZWN0IHR5cGVzIChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGVcbmhpZXJhcmNoeSopLlxuXG5Bc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIHRhcmdldCBsaXN0IGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXNcbmZvbGxvd3MuXG5cbiogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgc2luZ2xlIHRhcmdldDogVGhlIG9iamVjdCBpcyBhc3NpZ25lZCB0b1xuICB0aGF0IHRhcmdldC5cblxuKiBJZiB0aGUgdGFyZ2V0IGxpc3QgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YXJnZXRzOiBUaGUgb2JqZWN0XG4gIG11c3QgYmUgYW4gaXRlcmFibGUgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMgYXMgdGhlcmUgYXJlXG4gIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBhbmQgdGhlIGl0ZW1zIGFyZSBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvXG4gIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXRzLlxuXG5Bc3NpZ25tZW50IG9mIGFuIG9iamVjdCB0byBhIHNpbmdsZSB0YXJnZXQgaXMgcmVjdXJzaXZlbHkgZGVmaW5lZCBhc1xuZm9sbG93cy5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGFuIGlkZW50aWZpZXIgKG5hbWUpOlxuXG4gICogSWYgdGhlIG5hbWUgZG9lcyBub3Qgb2NjdXIgaW4gYSBgYGdsb2JhbGBgIHN0YXRlbWVudCBpbiB0aGVcbiAgICBjdXJyZW50IGNvZGUgYmxvY2s6IHRoZSBuYW1lIGlzIGJvdW5kIHRvIHRoZSBvYmplY3QgaW4gdGhlIGN1cnJlbnRcbiAgICBsb2NhbCBuYW1lc3BhY2UuXG5cbiAgKiBPdGhlcndpc2U6IHRoZSBuYW1lIGlzIGJvdW5kIHRvIHRoZSBvYmplY3QgaW4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgbmFtZXNwYWNlLlxuXG4gIFRoZSBuYW1lIGlzIHJlYm91bmQgaWYgaXQgd2FzIGFscmVhZHkgYm91bmQuICBUaGlzIG1heSBjYXVzZSB0aGVcbiAgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUgb2JqZWN0IHByZXZpb3VzbHkgYm91bmQgdG8gdGhlIG5hbWUgdG8gcmVhY2hcbiAgemVybywgY2F1c2luZyB0aGUgb2JqZWN0IHRvIGJlIGRlYWxsb2NhdGVkIGFuZCBpdHMgZGVzdHJ1Y3RvciAoaWYgaXRcbiAgaGFzIG9uZSkgdG8gYmUgY2FsbGVkLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYSB0YXJnZXQgbGlzdCBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcyBvciBpbiBzcXVhcmVcbiAgYnJhY2tldHM6IFRoZSBvYmplY3QgbXVzdCBiZSBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzYW1lIG51bWJlciBvZlxuICBpdGVtcyBhcyB0aGVyZSBhcmUgdGFyZ2V0cyBpbiB0aGUgdGFyZ2V0IGxpc3QsIGFuZCBpdHMgaXRlbXMgYXJlXG4gIGFzc2lnbmVkLCBmcm9tIGxlZnQgdG8gcmlnaHQsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHRhcmdldHMuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluXG4gIHRoZSByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGFuIG9iamVjdCB3aXRoXG4gIGFzc2lnbmFibGUgYXR0cmlidXRlczsgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIGBgVHlwZUVycm9yYGAgaXNcbiAgcmFpc2VkLiAgVGhhdCBvYmplY3QgaXMgdGhlbiBhc2tlZCB0byBhc3NpZ24gdGhlIGFzc2lnbmVkIG9iamVjdCB0b1xuICB0aGUgZ2l2ZW4gYXR0cmlidXRlOyBpZiBpdCBjYW5ub3QgcGVyZm9ybSB0aGUgYXNzaWdubWVudCwgaXQgcmFpc2VzXG4gIGFuIGV4Y2VwdGlvbiAodXN1YWxseSBidXQgbm90IG5lY2Vzc2FyaWx5IGBgQXR0cmlidXRlRXJyb3JgYCkuXG5cbiAgTm90ZTogSWYgdGhlIG9iamVjdCBpcyBhIGNsYXNzIGluc3RhbmNlIGFuZCB0aGUgYXR0cmlidXRlIHJlZmVyZW5jZVxuICBvY2N1cnMgb24gYm90aCBzaWRlcyBvZiB0aGUgYXNzaWdubWVudCBvcGVyYXRvciwgdGhlIFJIUyBleHByZXNzaW9uLFxuICBgYGEueGBgIGNhbiBhY2Nlc3MgZWl0aGVyIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBvciAoaWYgbm8gaW5zdGFuY2VcbiAgYXR0cmlidXRlIGV4aXN0cykgYSBjbGFzcyBhdHRyaWJ1dGUuICBUaGUgTEhTIHRhcmdldCBgYGEueGBgIGlzXG4gIGFsd2F5cyBzZXQgYXMgYW4gaW5zdGFuY2UgYXR0cmlidXRlLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkuXG4gIFRodXMsIHRoZSB0d28gb2NjdXJyZW5jZXMgb2YgYGBhLnhgYCBkbyBub3QgbmVjZXNzYXJpbHkgcmVmZXIgdG8gdGhlXG4gIHNhbWUgYXR0cmlidXRlOiBpZiB0aGUgUkhTIGV4cHJlc3Npb24gcmVmZXJzIHRvIGEgY2xhc3MgYXR0cmlidXRlLFxuICB0aGUgTEhTIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgYXR0cmlidXRlIGFzIHRoZSB0YXJnZXQgb2YgdGhlXG4gIGFzc2lnbm1lbnQ6XG5cbiAgICAgY2xhc3MgQ2xzOlxuICAgICAgICAgeCA9IDMgICAgICAgICAgICAgIyBjbGFzcyB2YXJpYWJsZVxuICAgICBpbnN0ID0gQ2xzKClcbiAgICAgaW5zdC54ID0gaW5zdC54ICsgMSAgICMgd3JpdGVzIGluc3QueCBhcyA0IGxlYXZpbmcgQ2xzLnggYXMgM1xuXG4gIFRoaXMgZGVzY3JpcHRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gZGVzY3JpcHRvclxuICBhdHRyaWJ1dGVzLCBzdWNoIGFzIHByb3BlcnRpZXMgY3JlYXRlZCB3aXRoIGBgcHJvcGVydHkoKWBgLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYSBzdWJzY3JpcHRpb246IFRoZSBwcmltYXJ5IGV4cHJlc3Npb24gaW4gdGhlXG4gIHJlZmVyZW5jZSBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgZWl0aGVyIGEgbXV0YWJsZSBzZXF1ZW5jZVxuICBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSBvciBhIG1hcHBpbmcgb2JqZWN0IChzdWNoIGFzIGEgZGljdGlvbmFyeSkuXG4gIE5leHQsIHRoZSBzdWJzY3JpcHQgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuXG5cbiAgSWYgdGhlIHByaW1hcnkgaXMgYSBtdXRhYmxlIHNlcXVlbmNlIG9iamVjdCAoc3VjaCBhcyBhIGxpc3QpLCB0aGVcbiAgc3Vic2NyaXB0IG11c3QgeWllbGQgYSBwbGFpbiBpbnRlZ2VyLiAgSWYgaXQgaXMgbmVnYXRpdmUsIHRoZVxuICBzZXF1ZW5jZVwncyBsZW5ndGggaXMgYWRkZWQgdG8gaXQuIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhXG4gIG5vbm5lZ2F0aXZlIGludGVnZXIgbGVzcyB0aGFuIHRoZSBzZXF1ZW5jZVwncyBsZW5ndGgsIGFuZCB0aGVcbiAgc2VxdWVuY2UgaXMgYXNrZWQgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG8gaXRzIGl0ZW0gd2l0aFxuICB0aGF0IGluZGV4LiAgSWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZSwgYGBJbmRleEVycm9yYGAgaXMgcmFpc2VkXG4gIChhc3NpZ25tZW50IHRvIGEgc3Vic2NyaXB0ZWQgc2VxdWVuY2UgY2Fubm90IGFkZCBuZXcgaXRlbXMgdG8gYVxuICBsaXN0KS5cblxuICBJZiB0aGUgcHJpbWFyeSBpcyBhIG1hcHBpbmcgb2JqZWN0IChzdWNoIGFzIGEgZGljdGlvbmFyeSksIHRoZVxuICBzdWJzY3JpcHQgbXVzdCBoYXZlIGEgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIG1hcHBpbmdcJ3Mga2V5IHR5cGUsXG4gIGFuZCB0aGUgbWFwcGluZyBpcyB0aGVuIGFza2VkIHRvIGNyZWF0ZSBhIGtleS9kYXR1bSBwYWlyIHdoaWNoIG1hcHNcbiAgdGhlIHN1YnNjcmlwdCB0byB0aGUgYXNzaWduZWQgb2JqZWN0LiAgVGhpcyBjYW4gZWl0aGVyIHJlcGxhY2UgYW5cbiAgZXhpc3Rpbmcga2V5L3ZhbHVlIHBhaXIgd2l0aCB0aGUgc2FtZSBrZXkgdmFsdWUsIG9yIGluc2VydCBhIG5ld1xuICBrZXkvdmFsdWUgcGFpciAoaWYgbm8ga2V5IHdpdGggdGhlIHNhbWUgdmFsdWUgZXhpc3RlZCkuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhIHNsaWNpbmc6IFRoZSBwcmltYXJ5IGV4cHJlc3Npb24gaW4gdGhlIHJlZmVyZW5jZVxuICBpcyBldmFsdWF0ZWQuICBJdCBzaG91bGQgeWllbGQgYSBtdXRhYmxlIHNlcXVlbmNlIG9iamVjdCAoc3VjaCBhcyBhXG4gIGxpc3QpLiAgVGhlIGFzc2lnbmVkIG9iamVjdCBzaG91bGQgYmUgYSBzZXF1ZW5jZSBvYmplY3Qgb2YgdGhlIHNhbWVcbiAgdHlwZS4gIE5leHQsIHRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmQgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCxcbiAgaW5zb2ZhciB0aGV5IGFyZSBwcmVzZW50OyBkZWZhdWx0cyBhcmUgemVybyBhbmQgdGhlIHNlcXVlbmNlXCdzXG4gIGxlbmd0aC4gIFRoZSBib3VuZHMgc2hvdWxkIGV2YWx1YXRlIHRvIChzbWFsbCkgaW50ZWdlcnMuICBJZiBlaXRoZXJcbiAgYm91bmQgaXMgbmVnYXRpdmUsIHRoZSBzZXF1ZW5jZVwncyBsZW5ndGggaXMgYWRkZWQgdG8gaXQuIFRoZVxuICByZXN1bHRpbmcgYm91bmRzIGFyZSBjbGlwcGVkIHRvIGxpZSBiZXR3ZWVuIHplcm8gYW5kIHRoZSBzZXF1ZW5jZVwnc1xuICBsZW5ndGgsIGluY2x1c2l2ZS4gIEZpbmFsbHksIHRoZSBzZXF1ZW5jZSBvYmplY3QgaXMgYXNrZWQgdG8gcmVwbGFjZVxuICB0aGUgc2xpY2Ugd2l0aCB0aGUgaXRlbXMgb2YgdGhlIGFzc2lnbmVkIHNlcXVlbmNlLiAgVGhlIGxlbmd0aCBvZlxuICB0aGUgc2xpY2UgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBsZW5ndGggb2YgdGhlIGFzc2lnbmVkIHNlcXVlbmNlLFxuICB0aHVzIGNoYW5naW5nIHRoZSBsZW5ndGggb2YgdGhlIHRhcmdldCBzZXF1ZW5jZSwgaWYgdGhlIG9iamVjdFxuICBhbGxvd3MgaXQuXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZVxuc3ludGF4IGZvciB0YXJnZXRzIGlzIHRha2VuIHRvIGJlIHRoZSBzYW1lIGFzIGZvciBleHByZXNzaW9ucywgYW5kXG5pbnZhbGlkIHN5bnRheCBpcyByZWplY3RlZCBkdXJpbmcgdGhlIGNvZGUgZ2VuZXJhdGlvbiBwaGFzZSwgY2F1c2luZ1xubGVzcyBkZXRhaWxlZCBlcnJvciBtZXNzYWdlcy5cblxuV0FSTklORzogQWx0aG91Z2ggdGhlIGRlZmluaXRpb24gb2YgYXNzaWdubWVudCBpbXBsaWVzIHRoYXQgb3ZlcmxhcHNcbmJldHdlZW4gdGhlIGxlZnQtaGFuZCBzaWRlIGFuZCB0aGUgcmlnaHQtaGFuZCBzaWRlIGFyZSBcJ3NhZmVcJyAoZm9yXG5leGFtcGxlIGBgYSwgYiA9IGIsIGFgYCBzd2FwcyB0d28gdmFyaWFibGVzKSwgb3ZlcmxhcHMgKndpdGhpbiogdGhlXG5jb2xsZWN0aW9uIG9mIGFzc2lnbmVkLXRvIHZhcmlhYmxlcyBhcmUgbm90IHNhZmUhICBGb3IgaW5zdGFuY2UsIHRoZVxuZm9sbG93aW5nIHByb2dyYW0gcHJpbnRzIGBgWzAsIDJdYGA6XG5cbiAgIHggPSBbMCwgMV1cbiAgIGkgPSAwXG4gICBpLCB4W2ldID0gMSwgMlxuICAgcHJpbnQgeFxuXG5cbkF1Z21lbnRlZCBhc3NpZ25tZW50IHN0YXRlbWVudHNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIGNvbWJpbmF0aW9uLCBpbiBhIHNpbmdsZSBzdGF0ZW1lbnQsIG9mIGFcbmJpbmFyeSBvcGVyYXRpb24gYW5kIGFuIGFzc2lnbm1lbnQgc3RhdGVtZW50OlxuXG4gICBhdWdtZW50ZWRfYXNzaWdubWVudF9zdG10IDo6PSBhdWd0YXJnZXQgYXVnb3AgKGV4cHJlc3Npb25fbGlzdCB8IHlpZWxkX2V4cHJlc3Npb24pXG4gICBhdWd0YXJnZXQgICAgICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyIHwgYXR0cmlidXRlcmVmIHwgc3Vic2NyaXB0aW9uIHwgc2xpY2luZ1xuICAgYXVnb3AgICAgICAgICAgICAgICAgICAgICA6Oj0gIis9IiB8ICItPSIgfCAiKj0iIHwgIi89IiB8ICIvLz0iIHwgIiU9IiB8ICIqKj0iXG4gICAgICAgICAgICAgfCAiPj49IiB8ICI8PD0iIHwgIiY9IiB8ICJePSIgfCAifD0iXG5cbihTZWUgc2VjdGlvbiAqUHJpbWFyaWVzKiBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBmb3IgdGhlIGxhc3QgdGhyZWVcbnN5bWJvbHMuKVxuXG5BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBldmFsdWF0ZXMgdGhlIHRhcmdldCAod2hpY2gsIHVubGlrZSBub3JtYWxcbmFzc2lnbm1lbnQgc3RhdGVtZW50cywgY2Fubm90IGJlIGFuIHVucGFja2luZykgYW5kIHRoZSBleHByZXNzaW9uXG5saXN0LCBwZXJmb3JtcyB0aGUgYmluYXJ5IG9wZXJhdGlvbiBzcGVjaWZpYyB0byB0aGUgdHlwZSBvZiBhc3NpZ25tZW50XG5vbiB0aGUgdHdvIG9wZXJhbmRzLCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvIHRoZSBvcmlnaW5hbCB0YXJnZXQuXG5UaGUgdGFyZ2V0IGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuXG5cbkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV4cHJlc3Npb24gbGlrZSBgYHggKz0gMWBgIGNhbiBiZSByZXdyaXR0ZW4gYXNcbmBgeCA9IHggKyAxYGAgdG8gYWNoaWV2ZSBhIHNpbWlsYXIsIGJ1dCBub3QgZXhhY3RseSBlcXVhbCBlZmZlY3QuIEluXG50aGUgYXVnbWVudGVkIHZlcnNpb24sIGBgeGBgIGlzIG9ubHkgZXZhbHVhdGVkIG9uY2UuIEFsc28sIHdoZW5cbnBvc3NpYmxlLCB0aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgKmluLXBsYWNlKiwgbWVhbmluZyB0aGF0XG5yYXRoZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvYmplY3QgYW5kIGFzc2lnbmluZyB0aGF0IHRvIHRoZSB0YXJnZXQsXG50aGUgb2xkIG9iamVjdCBpcyBtb2RpZmllZCBpbnN0ZWFkLlxuXG5XaXRoIHRoZSBleGNlcHRpb24gb2YgYXNzaWduaW5nIHRvIHR1cGxlcyBhbmQgbXVsdGlwbGUgdGFyZ2V0cyBpbiBhXG5zaW5nbGUgc3RhdGVtZW50LCB0aGUgYXNzaWdubWVudCBkb25lIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50XG5zdGF0ZW1lbnRzIGlzIGhhbmRsZWQgdGhlIHNhbWUgd2F5IGFzIG5vcm1hbCBhc3NpZ25tZW50cy4gU2ltaWxhcmx5LFxud2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBwb3NzaWJsZSAqaW4tcGxhY2UqIGJlaGF2aW9yLCB0aGUgYmluYXJ5XG5vcGVyYXRpb24gcGVyZm9ybWVkIGJ5IGF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBzYW1lIGFzIHRoZSBub3JtYWxcbmJpbmFyeSBvcGVyYXRpb25zLlxuXG5Gb3IgdGFyZ2V0cyB3aGljaCBhcmUgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHRoZSBzYW1lICpjYXZlYXQgYWJvdXRcbmNsYXNzIGFuZCBpbnN0YW5jZSBhdHRyaWJ1dGVzKiBhcHBsaWVzIGFzIGZvciByZWd1bGFyIGFzc2lnbm1lbnRzLlxuJywKKyAnYXRvbS1pZGVudGlmaWVycyc6ICdcbklkZW50aWZpZXJzIChOYW1lcylcbioqKioqKioqKioqKioqKioqKipcblxuQW4gaWRlbnRpZmllciBvY2N1cnJpbmcgYXMgYW4gYXRvbSBpcyBhIG5hbWUuICBTZWUgc2VjdGlvblxuKklkZW50aWZpZXJzIGFuZCBrZXl3b3JkcyogZm9yIGxleGljYWwgZGVmaW5pdGlvbiBhbmQgc2VjdGlvbiAqTmFtaW5nXG5hbmQgYmluZGluZyogZm9yIGRvY3VtZW50YXRpb24gb2YgbmFtaW5nIGFuZCBiaW5kaW5nLlxuXG5XaGVuIHRoZSBuYW1lIGlzIGJvdW5kIHRvIGFuIG9iamVjdCwgZXZhbHVhdGlvbiBvZiB0aGUgYXRvbSB5aWVsZHNcbnRoYXQgb2JqZWN0LiBXaGVuIGEgbmFtZSBpcyBub3QgYm91bmQsIGFuIGF0dGVtcHQgdG8gZXZhbHVhdGUgaXRcbnJhaXNlcyBhIGBgTmFtZUVycm9yYGAgZXhjZXB0aW9uLlxuXG4qKlByaXZhdGUgbmFtZSBtYW5nbGluZzoqKiBXaGVuIGFuIGlkZW50aWZpZXIgdGhhdCB0ZXh0dWFsbHkgb2NjdXJzIGluXG5hIGNsYXNzIGRlZmluaXRpb24gYmVnaW5zIHdpdGggdHdvIG9yIG1vcmUgdW5kZXJzY29yZSBjaGFyYWN0ZXJzIGFuZFxuZG9lcyBub3QgZW5kIGluIHR3byBvciBtb3JlIHVuZGVyc2NvcmVzLCBpdCBpcyBjb25zaWRlcmVkIGEgKnByaXZhdGVcbm5hbWUqIG9mIHRoYXQgY2xhc3MuIFByaXZhdGUgbmFtZXMgYXJlIHRyYW5zZm9ybWVkIHRvIGEgbG9uZ2VyIGZvcm1cbmJlZm9yZSBjb2RlIGlzIGdlbmVyYXRlZCBmb3IgdGhlbS4gIFRoZSB0cmFuc2Zvcm1hdGlvbiBpbnNlcnRzIHRoZVxuY2xhc3MgbmFtZSwgd2l0aCBsZWFkaW5nIHVuZGVyc2NvcmVzIHJlbW92ZWQgYW5kIGEgc2luZ2xlIHVuZGVyc2NvcmVcbmluc2VydGVkLCBpbiBmcm9udCBvZiB0aGUgbmFtZS4gIEZvciBleGFtcGxlLCB0aGUgaWRlbnRpZmllclxuYGBfX3NwYW1gYCBvY2N1cnJpbmcgaW4gYSBjbGFzcyBuYW1lZCBgYEhhbWBgIHdpbGwgYmUgdHJhbnNmb3JtZWQgdG9cbmBgX0hhbV9fc3BhbWBgLiAgVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBpbmRlcGVuZGVudCBvZiB0aGUgc3ludGFjdGljYWxcbmNvbnRleHQgaW4gd2hpY2ggdGhlIGlkZW50aWZpZXIgaXMgdXNlZC4gIElmIHRoZSB0cmFuc2Zvcm1lZCBuYW1lIGlzXG5leHRyZW1lbHkgbG9uZyAobG9uZ2VyIHRoYW4gMjU1IGNoYXJhY3RlcnMpLCBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkXG50cnVuY2F0aW9uIG1heSBoYXBwZW4uIElmIHRoZSBjbGFzcyBuYW1lIGNvbnNpc3RzIG9ubHkgb2YgdW5kZXJzY29yZXMsXG5ubyB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lLlxuJywKKyAnYXRvbS1saXRlcmFscyc6ICJcbkxpdGVyYWxzXG4qKioqKioqKlxuXG5QeXRob24gc3VwcG9ydHMgc3RyaW5nIGxpdGVyYWxzIGFuZCB2YXJpb3VzIG51bWVyaWMgbGl0ZXJhbHM6XG5cbiAgIGxpdGVyYWwgOjo9IHN0cmluZ2xpdGVyYWwgfCBpbnRlZ2VyIHwgbG9uZ2ludGVnZXJcbiAgICAgICAgICAgICAgIHwgZmxvYXRudW1iZXIgfCBpbWFnbnVtYmVyXG5cbkV2YWx1YXRpb24gb2YgYSBsaXRlcmFsIHlpZWxkcyBhbiBvYmplY3Qgb2YgdGhlIGdpdmVuIHR5cGUgKHN0cmluZyxcbmludGVnZXIsIGxvbmcgaW50ZWdlciwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBjb21wbGV4IG51bWJlcikgd2l0aCB0aGVcbmdpdmVuIHZhbHVlLiAgVGhlIHZhbHVlIG1heSBiZSBhcHByb3hpbWF0ZWQgaW4gdGhlIGNhc2Ugb2YgZmxvYXRpbmdcbnBvaW50IGFuZCBpbWFnaW5hcnkgKGNvbXBsZXgpIGxpdGVyYWxzLiAgU2VlIHNlY3Rpb24gKkxpdGVyYWxzKiBmb3JcbmRldGFpbHMuXG5cbkFsbCBsaXRlcmFscyBjb3JyZXNwb25kIHRvIGltbXV0YWJsZSBkYXRhIHR5cGVzLCBhbmQgaGVuY2UgdGhlXG5vYmplY3QncyBpZGVudGl0eSBpcyBsZXNzIGltcG9ydGFudCB0aGFuIGl0cyB2YWx1ZS4gIE11bHRpcGxlXG5ldmFsdWF0aW9ucyBvZiBsaXRlcmFscyB3aXRoIHRoZSBzYW1lIHZhbHVlIChlaXRoZXIgdGhlIHNhbWVcbm9jY3VycmVuY2UgaW4gdGhlIHByb2dyYW0gdGV4dCBvciBhIGRpZmZlcmVudCBvY2N1cnJlbmNlKSBtYXkgb2J0YWluXG50aGUgc2FtZSBvYmplY3Qgb3IgYSBkaWZmZXJlbnQgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUuXG4iLAorICdhdHRyaWJ1dGUtYWNjZXNzJzogJ1xuQ3VzdG9taXppbmcgYXR0cmlidXRlIGFjY2Vzc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gY3VzdG9taXplIHRoZSBtZWFuaW5nIG9mXG5hdHRyaWJ1dGUgYWNjZXNzICh1c2Ugb2YsIGFzc2lnbm1lbnQgdG8sIG9yIGRlbGV0aW9uIG9mIGBgeC5uYW1lYGApXG5mb3IgY2xhc3MgaW5zdGFuY2VzLlxuXG5vYmplY3QuX19nZXRhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGxvb2t1cCBoYXMgbm90IGZvdW5kIHRoZSBhdHRyaWJ1dGUgaW4gdGhlXG4gICB1c3VhbCBwbGFjZXMgKGkuZS4gaXQgaXMgbm90IGFuIGluc3RhbmNlIGF0dHJpYnV0ZSBub3IgaXMgaXQgZm91bmRcbiAgIGluIHRoZSBjbGFzcyB0cmVlIGZvciBgYHNlbGZgYCkuICBgYG5hbWVgYCBpcyB0aGUgYXR0cmlidXRlIG5hbWUuXG4gICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZVxuICAgYW4gYGBBdHRyaWJ1dGVFcnJvcmBgIGV4Y2VwdGlvbi5cblxuICAgTm90ZSB0aGF0IGlmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQgdGhyb3VnaCB0aGUgbm9ybWFsIG1lY2hhbmlzbSxcbiAgIGBgX19nZXRhdHRyX18oKWBgIGlzIG5vdCBjYWxsZWQuICAoVGhpcyBpcyBhbiBpbnRlbnRpb25hbCBhc3ltbWV0cnlcbiAgIGJldHdlZW4gYGBfX2dldGF0dHJfXygpYGAgYW5kIGBgX19zZXRhdHRyX18oKWBgLikgVGhpcyBpcyBkb25lIGJvdGhcbiAgIGZvciBlZmZpY2llbmN5IHJlYXNvbnMgYW5kIGJlY2F1c2Ugb3RoZXJ3aXNlIGBgX19nZXRhdHRyX18oKWBgXG4gICB3b3VsZCBoYXZlIG5vIHdheSB0byBhY2Nlc3Mgb3RoZXIgYXR0cmlidXRlcyBvZiB0aGUgaW5zdGFuY2UuICBOb3RlXG4gICB0aGF0IGF0IGxlYXN0IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIHlvdSBjYW4gZmFrZSB0b3RhbCBjb250cm9sIGJ5XG4gICBub3QgaW5zZXJ0aW5nIGFueSB2YWx1ZXMgaW4gdGhlIGluc3RhbmNlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5IChidXRcbiAgIGluc3RlYWQgaW5zZXJ0aW5nIHRoZW0gaW4gYW5vdGhlciBvYmplY3QpLiAgU2VlIHRoZVxuICAgYGBfX2dldGF0dHJpYnV0ZV9fKClgYCBtZXRob2QgYmVsb3cgZm9yIGEgd2F5IHRvIGFjdHVhbGx5IGdldCB0b3RhbFxuICAgY29udHJvbCBpbiBuZXctc3R5bGUgY2xhc3Nlcy5cblxub2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKVxuXG4gICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgYXNzaWdubWVudCBpcyBhdHRlbXB0ZWQuICBUaGlzIGlzIGNhbGxlZFxuICAgaW5zdGVhZCBvZiB0aGUgbm9ybWFsIG1lY2hhbmlzbSAoaS5lLiBzdG9yZSB0aGUgdmFsdWUgaW4gdGhlXG4gICBpbnN0YW5jZSBkaWN0aW9uYXJ5KS4gICpuYW1lKiBpcyB0aGUgYXR0cmlidXRlIG5hbWUsICp2YWx1ZSogaXMgdGhlXG4gICB2YWx1ZSB0byBiZSBhc3NpZ25lZCB0byBpdC5cblxuICAgSWYgYGBfX3NldGF0dHJfXygpYGAgd2FudHMgdG8gYXNzaWduIHRvIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgaXRcbiAgIHNob3VsZCBub3Qgc2ltcGx5IGV4ZWN1dGUgYGBzZWxmLm5hbWUgPSB2YWx1ZWBgIC0tLSB0aGlzIHdvdWxkXG4gICBjYXVzZSBhIHJlY3Vyc2l2ZSBjYWxsIHRvIGl0c2VsZi4gIEluc3RlYWQsIGl0IHNob3VsZCBpbnNlcnQgdGhlXG4gICB2YWx1ZSBpbiB0aGUgZGljdGlvbmFyeSBvZiBpbnN0YW5jZSBhdHRyaWJ1dGVzLCBlLmcuLFxuICAgYGBzZWxmLl9fZGljdF9fW25hbWVdID0gdmFsdWVgYC4gIEZvciBuZXctc3R5bGUgY2xhc3NlcywgcmF0aGVyXG4gICB0aGFuIGFjY2Vzc2luZyB0aGUgaW5zdGFuY2UgZGljdGlvbmFyeSwgaXQgc2hvdWxkIGNhbGwgdGhlIGJhc2VcbiAgIGNsYXNzIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUsIGZvciBleGFtcGxlLFxuICAgYGBvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpYGAuXG5cbm9iamVjdC5fX2RlbGF0dHJfXyhzZWxmLCBuYW1lKVxuXG4gICBMaWtlIGBgX19zZXRhdHRyX18oKWBgIGJ1dCBmb3IgYXR0cmlidXRlIGRlbGV0aW9uIGluc3RlYWQgb2ZcbiAgIGFzc2lnbm1lbnQuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGlmIGBgZGVsIG9iai5uYW1lYGAgaXNcbiAgIG1lYW5pbmdmdWwgZm9yIHRoZSBvYmplY3QuXG5cblxuTW9yZSBhdHRyaWJ1dGUgYWNjZXNzIGZvciBuZXctc3R5bGUgY2xhc3Nlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB0byBuZXctc3R5bGUgY2xhc3Nlcy5cblxub2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlcblxuICAgQ2FsbGVkIHVuY29uZGl0aW9uYWxseSB0byBpbXBsZW1lbnQgYXR0cmlidXRlIGFjY2Vzc2VzIGZvclxuICAgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy4gSWYgdGhlIGNsYXNzIGFsc28gZGVmaW5lc1xuICAgYGBfX2dldGF0dHJfXygpYGAsIHRoZSBsYXR0ZXIgd2lsbCBub3QgYmUgY2FsbGVkIHVubGVzc1xuICAgYGBfX2dldGF0dHJpYnV0ZV9fKClgYCBlaXRoZXIgY2FsbHMgaXQgZXhwbGljaXRseSBvciByYWlzZXMgYW5cbiAgIGBgQXR0cmlidXRlRXJyb3JgYC4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKVxuICAgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuIGBgQXR0cmlidXRlRXJyb3JgYCBleGNlcHRpb24uIEluIG9yZGVyXG4gICB0byBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24gaW4gdGhpcyBtZXRob2QsIGl0cyBpbXBsZW1lbnRhdGlvblxuICAgc2hvdWxkIGFsd2F5cyBjYWxsIHRoZSBiYXNlIGNsYXNzIG1ldGhvZCB3aXRoIHRoZSBzYW1lIG5hbWUgdG9cbiAgIGFjY2VzcyBhbnkgYXR0cmlidXRlcyBpdCBuZWVkcywgZm9yIGV4YW1wbGUsXG4gICBgYG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpYGAuXG5cbiAgIE5vdGU6IFRoaXMgbWV0aG9kIG1heSBzdGlsbCBiZSBieXBhc3NlZCB3aGVuIGxvb2tpbmcgdXAgc3BlY2lhbCBtZXRob2RzXG4gICAgIGFzIHRoZSByZXN1bHQgb2YgaW1wbGljaXQgaW52b2NhdGlvbiB2aWEgbGFuZ3VhZ2Ugc3ludGF4IG9yXG4gICAgIGJ1aWx0LWluIGZ1bmN0aW9ucy4gU2VlICpTcGVjaWFsIG1ldGhvZCBsb29rdXAgZm9yIG5ldy1zdHlsZVxuICAgICBjbGFzc2VzKi5cblxuXG5JbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnNcbj09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgb25seSBhcHBseSB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzc1xuY29udGFpbmluZyB0aGUgbWV0aG9kIChhIHNvLWNhbGxlZCAqZGVzY3JpcHRvciogY2xhc3MpIGFwcGVhcnMgaW4gYW5cbipvd25lciogY2xhc3MgKHRoZSBkZXNjcmlwdG9yIG11c3QgYmUgaW4gZWl0aGVyIHRoZSBvd25lclwncyBjbGFzc1xuZGljdGlvbmFyeSBvciBpbiB0aGUgY2xhc3MgZGljdGlvbmFyeSBmb3Igb25lIG9mIGl0cyBwYXJlbnRzKS4gIEluIHRoZVxuZXhhbXBsZXMgYmVsb3csICJ0aGUgYXR0cmlidXRlIiByZWZlcnMgdG8gdGhlIGF0dHJpYnV0ZSB3aG9zZSBuYW1lIGlzXG50aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgb3duZXIgY2xhc3NcJyBgYF9fZGljdF9fYGAuXG5cbm9iamVjdC5fX2dldF9fKHNlbGYsIGluc3RhbmNlLCBvd25lcilcblxuICAgQ2FsbGVkIHRvIGdldCB0aGUgYXR0cmlidXRlIG9mIHRoZSBvd25lciBjbGFzcyAoY2xhc3MgYXR0cmlidXRlXG4gICBhY2Nlc3MpIG9yIG9mIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgKGluc3RhbmNlIGF0dHJpYnV0ZVxuICAgYWNjZXNzKS4gKm93bmVyKiBpcyBhbHdheXMgdGhlIG93bmVyIGNsYXNzLCB3aGlsZSAqaW5zdGFuY2UqIGlzIHRoZVxuICAgaW5zdGFuY2UgdGhhdCB0aGUgYXR0cmlidXRlIHdhcyBhY2Nlc3NlZCB0aHJvdWdoLCBvciBgYE5vbmVgYCB3aGVuXG4gICB0aGUgYXR0cmlidXRlIGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlICpvd25lciouICBUaGlzIG1ldGhvZCBzaG91bGRcbiAgIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW5cbiAgIGBgQXR0cmlidXRlRXJyb3JgYCBleGNlcHRpb24uXG5cbm9iamVjdC5fX3NldF9fKHNlbGYsIGluc3RhbmNlLCB2YWx1ZSlcblxuICAgQ2FsbGVkIHRvIHNldCB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlIG93bmVyXG4gICBjbGFzcyB0byBhIG5ldyB2YWx1ZSwgKnZhbHVlKi5cblxub2JqZWN0Ll9fZGVsZXRlX18oc2VsZiwgaW5zdGFuY2UpXG5cbiAgIENhbGxlZCB0byBkZWxldGUgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZVxuICAgb3duZXIgY2xhc3MuXG5cblxuSW52b2tpbmcgRGVzY3JpcHRvcnNcbj09PT09PT09PT09PT09PT09PT09XG5cbkluIGdlbmVyYWwsIGEgZGVzY3JpcHRvciBpcyBhbiBvYmplY3QgYXR0cmlidXRlIHdpdGggImJpbmRpbmdcbmJlaGF2aW9yIiwgb25lIHdob3NlIGF0dHJpYnV0ZSBhY2Nlc3MgaGFzIGJlZW4gb3ZlcnJpZGRlbiBieSBtZXRob2RzXG5pbiB0aGUgZGVzY3JpcHRvciBwcm90b2NvbDogIGBgX19nZXRfXygpYGAsIGBgX19zZXRfXygpYGAsIGFuZFxuYGBfX2RlbGV0ZV9fKClgYC4gSWYgYW55IG9mIHRob3NlIG1ldGhvZHMgYXJlIGRlZmluZWQgZm9yIGFuIG9iamVjdCxcbml0IGlzIHNhaWQgdG8gYmUgYSBkZXNjcmlwdG9yLlxuXG5UaGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgYXR0cmlidXRlIGFjY2VzcyBpcyB0byBnZXQsIHNldCwgb3IgZGVsZXRlXG50aGUgYXR0cmlidXRlIGZyb20gYW4gb2JqZWN0XCdzIGRpY3Rpb25hcnkuIEZvciBpbnN0YW5jZSwgYGBhLnhgYCBoYXMgYVxubG9va3VwIGNoYWluIHN0YXJ0aW5nIHdpdGggYGBhLl9fZGljdF9fW1wneFwnXWBgLCB0aGVuXG5gYHR5cGUoYSkuX19kaWN0X19bXCd4XCddYGAsIGFuZCBjb250aW51aW5nIHRocm91Z2ggdGhlIGJhc2UgY2xhc3NlcyBvZlxuYGB0eXBlKGEpYGAgZXhjbHVkaW5nIG1ldGFjbGFzc2VzLlxuXG5Ib3dldmVyLCBpZiB0aGUgbG9va2VkLXVwIHZhbHVlIGlzIGFuIG9iamVjdCBkZWZpbmluZyBvbmUgb2YgdGhlXG5kZXNjcmlwdG9yIG1ldGhvZHMsIHRoZW4gUHl0aG9uIG1heSBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmRcbmludm9rZSB0aGUgZGVzY3JpcHRvciBtZXRob2QgaW5zdGVhZC4gIFdoZXJlIHRoaXMgb2NjdXJzIGluIHRoZVxucHJlY2VkZW5jZSBjaGFpbiBkZXBlbmRzIG9uIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyB3ZXJlIGRlZmluZWQgYW5kXG5ob3cgdGhleSB3ZXJlIGNhbGxlZC4gIE5vdGUgdGhhdCBkZXNjcmlwdG9ycyBhcmUgb25seSBpbnZva2VkIGZvciBuZXdcbnN0eWxlIG9iamVjdHMgb3IgY2xhc3NlcyAob25lcyB0aGF0IHN1YmNsYXNzIGBgb2JqZWN0KClgYCBvclxuYGB0eXBlKClgYCkuXG5cblRoZSBzdGFydGluZyBwb2ludCBmb3IgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGlzIGEgYmluZGluZywgYGBhLnhgYC5cbkhvdyB0aGUgYXJndW1lbnRzIGFyZSBhc3NlbWJsZWQgZGVwZW5kcyBvbiBgYGFgYDpcblxuRGlyZWN0IENhbGxcbiAgIFRoZSBzaW1wbGVzdCBhbmQgbGVhc3QgY29tbW9uIGNhbGwgaXMgd2hlbiB1c2VyIGNvZGUgZGlyZWN0bHlcbiAgIGludm9rZXMgYSBkZXNjcmlwdG9yIG1ldGhvZDogICAgYGB4Ll9fZ2V0X18oYSlgYC5cblxuSW5zdGFuY2UgQmluZGluZ1xuICAgSWYgYmluZGluZyB0byBhIG5ldy1zdHlsZSBvYmplY3QgaW5zdGFuY2UsIGBgYS54YGAgaXMgdHJhbnNmb3JtZWRcbiAgIGludG8gdGhlIGNhbGw6IGBgdHlwZShhKS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhhLCB0eXBlKGEpKWBgLlxuXG5DbGFzcyBCaW5kaW5nXG4gICBJZiBiaW5kaW5nIHRvIGEgbmV3LXN0eWxlIGNsYXNzLCBgYEEueGBgIGlzIHRyYW5zZm9ybWVkIGludG8gdGhlXG4gICBjYWxsOiBgYEEuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oTm9uZSwgQSlgYC5cblxuU3VwZXIgQmluZGluZ1xuICAgSWYgYGBhYGAgaXMgYW4gaW5zdGFuY2Ugb2YgYGBzdXBlcmBgLCB0aGVuIHRoZSBiaW5kaW5nIGBgc3VwZXIoQixcbiAgIG9iaikubSgpYGAgc2VhcmNoZXMgYGBvYmouX19jbGFzc19fLl9fbXJvX19gYCBmb3IgdGhlIGJhc2UgY2xhc3NcbiAgIGBgQWBgIGltbWVkaWF0ZWx5IHByZWNlZGluZyBgYEJgYCBhbmQgdGhlbiBpbnZva2VzIHRoZSBkZXNjcmlwdG9yXG4gICB3aXRoIHRoZSBjYWxsOiBgYEEuX19kaWN0X19bXCdtXCddLl9fZ2V0X18ob2JqLCBvYmouX19jbGFzc19fKWBgLlxuXG5Gb3IgaW5zdGFuY2UgYmluZGluZ3MsIHRoZSBwcmVjZWRlbmNlIG9mIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBkZXBlbmRzXG5vbiB0aGUgd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIGFyZSBkZWZpbmVkLiAgQSBkZXNjcmlwdG9yIGNhbiBkZWZpbmVcbmFueSBjb21iaW5hdGlvbiBvZiBgYF9fZ2V0X18oKWBgLCBgYF9fc2V0X18oKWBgIGFuZCBgYF9fZGVsZXRlX18oKWBgLlxuSWYgaXQgZG9lcyBub3QgZGVmaW5lIGBgX19nZXRfXygpYGAsIHRoZW4gYWNjZXNzaW5nIHRoZSBhdHRyaWJ1dGUgd2lsbFxucmV0dXJuIHRoZSBkZXNjcmlwdG9yIG9iamVjdCBpdHNlbGYgdW5sZXNzIHRoZXJlIGlzIGEgdmFsdWUgaW4gdGhlXG5vYmplY3RcJ3MgaW5zdGFuY2UgZGljdGlvbmFyeS4gIElmIHRoZSBkZXNjcmlwdG9yIGRlZmluZXMgYGBfX3NldF9fKClgYFxuYW5kL29yIGBgX19kZWxldGVfXygpYGAsIGl0IGlzIGEgZGF0YSBkZXNjcmlwdG9yOyBpZiBpdCBkZWZpbmVzXG5uZWl0aGVyLCBpdCBpcyBhIG5vbi1kYXRhIGRlc2NyaXB0b3IuICBOb3JtYWxseSwgZGF0YSBkZXNjcmlwdG9yc1xuZGVmaW5lIGJvdGggYGBfX2dldF9fKClgYCBhbmQgYGBfX3NldF9fKClgYCwgd2hpbGUgbm9uLWRhdGFcbmRlc2NyaXB0b3JzIGhhdmUganVzdCB0aGUgYGBfX2dldF9fKClgYCBtZXRob2QuICBEYXRhIGRlc2NyaXB0b3JzIHdpdGhcbmBgX19zZXRfXygpYGAgYW5kIGBgX19nZXRfXygpYGAgZGVmaW5lZCBhbHdheXMgb3ZlcnJpZGUgYSByZWRlZmluaXRpb25cbmluIGFuIGluc3RhbmNlIGRpY3Rpb25hcnkuICBJbiBjb250cmFzdCwgbm9uLWRhdGEgZGVzY3JpcHRvcnMgY2FuIGJlXG5vdmVycmlkZGVuIGJ5IGluc3RhbmNlcy5cblxuUHl0aG9uIG1ldGhvZHMgKGluY2x1ZGluZyBgYHN0YXRpY21ldGhvZCgpYGAgYW5kIGBgY2xhc3NtZXRob2QoKWBgKVxuYXJlIGltcGxlbWVudGVkIGFzIG5vbi1kYXRhIGRlc2NyaXB0b3JzLiAgQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5cbnJlZGVmaW5lIGFuZCBvdmVycmlkZSBtZXRob2RzLiAgVGhpcyBhbGxvd3MgaW5kaXZpZHVhbCBpbnN0YW5jZXMgdG9cbmFjcXVpcmUgYmVoYXZpb3JzIHRoYXQgZGlmZmVyIGZyb20gb3RoZXIgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGNsYXNzLlxuXG5UaGUgYGBwcm9wZXJ0eSgpYGAgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQgYXMgYSBkYXRhIGRlc2NyaXB0b3IuXG5BY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhbm5vdCBvdmVycmlkZSB0aGUgYmVoYXZpb3Igb2YgYSBwcm9wZXJ0eS5cblxuXG5fX3Nsb3RzX19cbj09PT09PT09PVxuXG5CeSBkZWZhdWx0LCBpbnN0YW5jZXMgb2YgYm90aCBvbGQgYW5kIG5ldy1zdHlsZSBjbGFzc2VzIGhhdmUgYVxuZGljdGlvbmFyeSBmb3IgYXR0cmlidXRlIHN0b3JhZ2UuICBUaGlzIHdhc3RlcyBzcGFjZSBmb3Igb2JqZWN0c1xuaGF2aW5nIHZlcnkgZmV3IGluc3RhbmNlIHZhcmlhYmxlcy4gIFRoZSBzcGFjZSBjb25zdW1wdGlvbiBjYW4gYmVjb21lXG5hY3V0ZSB3aGVuIGNyZWF0aW5nIGxhcmdlIG51bWJlcnMgb2YgaW5zdGFuY2VzLlxuXG5UaGUgZGVmYXVsdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBkZWZpbmluZyAqX19zbG90c19fKiBpbiBhIG5ldy1zdHlsZVxuY2xhc3MgZGVmaW5pdGlvbi4gIFRoZSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiB0YWtlcyBhIHNlcXVlbmNlIG9mXG5pbnN0YW5jZSB2YXJpYWJsZXMgYW5kIHJlc2VydmVzIGp1c3QgZW5vdWdoIHNwYWNlIGluIGVhY2ggaW5zdGFuY2UgdG9cbmhvbGQgYSB2YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gIFNwYWNlIGlzIHNhdmVkIGJlY2F1c2UgKl9fZGljdF9fKiBpc1xubm90IGNyZWF0ZWQgZm9yIGVhY2ggaW5zdGFuY2UuXG5cbl9fc2xvdHNfX1xuXG4gICBUaGlzIGNsYXNzIHZhcmlhYmxlIGNhbiBiZSBhc3NpZ25lZCBhIHN0cmluZywgaXRlcmFibGUsIG9yIHNlcXVlbmNlXG4gICBvZiBzdHJpbmdzIHdpdGggdmFyaWFibGUgbmFtZXMgdXNlZCBieSBpbnN0YW5jZXMuICBJZiBkZWZpbmVkIGluIGFcbiAgIG5ldy1zdHlsZSBjbGFzcywgKl9fc2xvdHNfXyogcmVzZXJ2ZXMgc3BhY2UgZm9yIHRoZSBkZWNsYXJlZFxuICAgdmFyaWFibGVzIGFuZCBwcmV2ZW50cyB0aGUgYXV0b21hdGljIGNyZWF0aW9uIG9mICpfX2RpY3RfXyogYW5kXG4gICAqX193ZWFrcmVmX18qIGZvciBlYWNoIGluc3RhbmNlLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbk5vdGVzIG9uIHVzaW5nICpfX3Nsb3RzX18qXG5cbiogV2hlbiBpbmhlcml0aW5nIGZyb20gYSBjbGFzcyB3aXRob3V0ICpfX3Nsb3RzX18qLCB0aGUgKl9fZGljdF9fKlxuICBhdHRyaWJ1dGUgb2YgdGhhdCBjbGFzcyB3aWxsIGFsd2F5cyBiZSBhY2Nlc3NpYmxlLCBzbyBhICpfX3Nsb3RzX18qXG4gIGRlZmluaXRpb24gaW4gdGhlIHN1YmNsYXNzIGlzIG1lYW5pbmdsZXNzLlxuXG4qIFdpdGhvdXQgYSAqX19kaWN0X18qIHZhcmlhYmxlLCBpbnN0YW5jZXMgY2Fubm90IGJlIGFzc2lnbmVkIG5ld1xuICB2YXJpYWJsZXMgbm90IGxpc3RlZCBpbiB0aGUgKl9fc2xvdHNfXyogZGVmaW5pdGlvbi4gIEF0dGVtcHRzIHRvXG4gIGFzc2lnbiB0byBhbiB1bmxpc3RlZCB2YXJpYWJsZSBuYW1lIHJhaXNlcyBgYEF0dHJpYnV0ZUVycm9yYGAuIElmXG4gIGR5bmFtaWMgYXNzaWdubWVudCBvZiBuZXcgdmFyaWFibGVzIGlzIGRlc2lyZWQsIHRoZW4gYWRkXG4gIGBgXCdfX2RpY3RfX1wnYGAgdG8gdGhlIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICpfX3Nsb3RzX18qXG4gIGRlY2xhcmF0aW9uLlxuXG4gIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksIGFkZGluZyBgYFwnX19kaWN0X19cJ2BgIHRvIHRoZVxuICAqX19zbG90c19fKiBkZWNsYXJhdGlvbiB3b3VsZCBub3QgZW5hYmxlIHRoZSBhc3NpZ25tZW50IG9mIG5ld1xuICBhdHRyaWJ1dGVzIG5vdCBzcGVjaWZpY2FsbHkgbGlzdGVkIGluIHRoZSBzZXF1ZW5jZSBvZiBpbnN0YW5jZVxuICB2YXJpYWJsZSBuYW1lcy5cblxuKiBXaXRob3V0IGEgKl9fd2Vha3JlZl9fKiB2YXJpYWJsZSBmb3IgZWFjaCBpbnN0YW5jZSwgY2xhc3NlcyBkZWZpbmluZ1xuICAqX19zbG90c19fKiBkbyBub3Qgc3VwcG9ydCB3ZWFrIHJlZmVyZW5jZXMgdG8gaXRzIGluc3RhbmNlcy4gSWYgd2Vha1xuICByZWZlcmVuY2Ugc3VwcG9ydCBpcyBuZWVkZWQsIHRoZW4gYWRkIGBgXCdfX3dlYWtyZWZfX1wnYGAgdG8gdGhlXG4gIHNlcXVlbmNlIG9mIHN0cmluZ3MgaW4gdGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uLlxuXG4gIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksIGFkZGluZyBgYFwnX193ZWFrcmVmX19cJ2BgIHRvIHRoZVxuICAqX19zbG90c19fKiBkZWNsYXJhdGlvbiB3b3VsZCBub3QgZW5hYmxlIHN1cHBvcnQgZm9yIHdlYWtcbiAgcmVmZXJlbmNlcy5cblxuKiAqX19zbG90c19fKiBhcmUgaW1wbGVtZW50ZWQgYXQgdGhlIGNsYXNzIGxldmVsIGJ5IGNyZWF0aW5nXG4gIGRlc2NyaXB0b3JzICgqSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzKikgZm9yIGVhY2ggdmFyaWFibGUgbmFtZS4gIEFzXG4gIGEgcmVzdWx0LCBjbGFzcyBhdHRyaWJ1dGVzIGNhbm5vdCBiZSB1c2VkIHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3JcbiAgaW5zdGFuY2UgdmFyaWFibGVzIGRlZmluZWQgYnkgKl9fc2xvdHNfXyo7IG90aGVyd2lzZSwgdGhlIGNsYXNzXG4gIGF0dHJpYnV0ZSB3b3VsZCBvdmVyd3JpdGUgdGhlIGRlc2NyaXB0b3IgYXNzaWdubWVudC5cblxuKiBUaGUgYWN0aW9uIG9mIGEgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gaXMgbGltaXRlZCB0byB0aGUgY2xhc3NcbiAgd2hlcmUgaXQgaXMgZGVmaW5lZC4gIEFzIGEgcmVzdWx0LCBzdWJjbGFzc2VzIHdpbGwgaGF2ZSBhICpfX2RpY3RfXypcbiAgdW5sZXNzIHRoZXkgYWxzbyBkZWZpbmUgKl9fc2xvdHNfXyogKHdoaWNoIG11c3Qgb25seSBjb250YWluIG5hbWVzXG4gIG9mIGFueSAqYWRkaXRpb25hbCogc2xvdHMpLlxuXG4qIElmIGEgY2xhc3MgZGVmaW5lcyBhIHNsb3QgYWxzbyBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcywgdGhlIGluc3RhbmNlXG4gIHZhcmlhYmxlIGRlZmluZWQgYnkgdGhlIGJhc2UgY2xhc3Mgc2xvdCBpcyBpbmFjY2Vzc2libGUgKGV4Y2VwdCBieVxuICByZXRyaWV2aW5nIGl0cyBkZXNjcmlwdG9yIGRpcmVjdGx5IGZyb20gdGhlIGJhc2UgY2xhc3MpLiBUaGlzXG4gIHJlbmRlcnMgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0gdW5kZWZpbmVkLiAgSW4gdGhlIGZ1dHVyZSwgYVxuICBjaGVjayBtYXkgYmUgYWRkZWQgdG8gcHJldmVudCB0aGlzLlxuXG4qIE5vbmVtcHR5ICpfX3Nsb3RzX18qIGRvZXMgbm90IHdvcmsgZm9yIGNsYXNzZXMgZGVyaXZlZCBmcm9tXG4gICJ2YXJpYWJsZS1sZW5ndGgiIGJ1aWx0LWluIHR5cGVzIHN1Y2ggYXMgYGBsb25nYGAsIGBgc3RyYGAgYW5kXG4gIGBgdHVwbGVgYC5cblxuKiBBbnkgbm9uLXN0cmluZyBpdGVyYWJsZSBtYXkgYmUgYXNzaWduZWQgdG8gKl9fc2xvdHNfXyouIE1hcHBpbmdzIG1heVxuICBhbHNvIGJlIHVzZWQ7IGhvd2V2ZXIsIGluIHRoZSBmdXR1cmUsIHNwZWNpYWwgbWVhbmluZyBtYXkgYmVcbiAgYXNzaWduZWQgdG8gdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGVhY2gga2V5LlxuXG4qICpfX2NsYXNzX18qIGFzc2lnbm1lbnQgd29ya3Mgb25seSBpZiBib3RoIGNsYXNzZXMgaGF2ZSB0aGUgc2FtZVxuICAqX19zbG90c19fKi5cblxuICBDaGFuZ2VkIGluIHZlcnNpb24gMi42OiBQcmV2aW91c2x5LCAqX19jbGFzc19fKiBhc3NpZ25tZW50IHJhaXNlZCBhblxuICBlcnJvciBpZiBlaXRoZXIgbmV3IG9yIG9sZCBjbGFzcyBoYWQgKl9fc2xvdHNfXyouXG4nLAorICdhdHRyaWJ1dGUtcmVmZXJlbmNlcyc6ICdcbkF0dHJpYnV0ZSByZWZlcmVuY2VzXG4qKioqKioqKioqKioqKioqKioqKlxuXG5BbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIGlzIGEgcHJpbWFyeSBmb2xsb3dlZCBieSBhIHBlcmlvZCBhbmQgYSBuYW1lOlxuXG4gICBhdHRyaWJ1dGVyZWYgOjo9IHByaW1hcnkgIi4iIGlkZW50aWZpZXJcblxuVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgYSB0eXBlIHRoYXQgc3VwcG9ydHNcbmF0dHJpYnV0ZSByZWZlcmVuY2VzLCBlLmcuLCBhIG1vZHVsZSwgbGlzdCwgb3IgYW4gaW5zdGFuY2UuICBUaGlzXG5vYmplY3QgaXMgdGhlbiBhc2tlZCB0byBwcm9kdWNlIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpcyB0aGVcbmlkZW50aWZpZXIuICBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgYXZhaWxhYmxlLCB0aGUgZXhjZXB0aW9uXG5gYEF0dHJpYnV0ZUVycm9yYGAgaXMgcmFpc2VkLiBPdGhlcndpc2UsIHRoZSB0eXBlIGFuZCB2YWx1ZSBvZiB0aGVcbm9iamVjdCBwcm9kdWNlZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvYmplY3QuICBNdWx0aXBsZSBldmFsdWF0aW9ucyBvZlxudGhlIHNhbWUgYXR0cmlidXRlIHJlZmVyZW5jZSBtYXkgeWllbGQgZGlmZmVyZW50IG9iamVjdHMuXG4nLAorICdhdWdhc3NpZ24nOiAnXG5BdWdtZW50ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnRzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBjb21iaW5hdGlvbiwgaW4gYSBzaW5nbGUgc3RhdGVtZW50LCBvZiBhXG5iaW5hcnkgb3BlcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHN0YXRlbWVudDpcblxuICAgYXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdCA6Oj0gYXVndGFyZ2V0IGF1Z29wIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuICAgYXVndGFyZ2V0ICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciB8IGF0dHJpYnV0ZXJlZiB8IHN1YnNjcmlwdGlvbiB8IHNsaWNpbmdcbiAgIGF1Z29wICAgICAgICAgICAgICAgICAgICAgOjo9ICIrPSIgfCAiLT0iIHwgIio9IiB8ICIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IlxuICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IlxuXG4oU2VlIHNlY3Rpb24gKlByaW1hcmllcyogZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgZm9yIHRoZSBsYXN0IHRocmVlXG5zeW1ib2xzLilcblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRoZSB0YXJnZXQgKHdoaWNoLCB1bmxpa2Ugbm9ybWFsXG5hc3NpZ25tZW50IHN0YXRlbWVudHMsIGNhbm5vdCBiZSBhbiB1bnBhY2tpbmcpIGFuZCB0aGUgZXhwcmVzc2lvblxubGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgYXNzaWdubWVudFxub24gdGhlIHR3byBvcGVyYW5kcywgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byB0aGUgb3JpZ2luYWwgdGFyZ2V0LlxuVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLlxuXG5BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIGxpa2UgYGB4ICs9IDFgYCBjYW4gYmUgcmV3cml0dGVuIGFzXG5gYHggPSB4ICsgMWBgIHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgZWZmZWN0LiBJblxudGhlIGF1Z21lbnRlZCB2ZXJzaW9uLCBgYHhgYCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuXG5wb3NzaWJsZSwgdGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkICppbi1wbGFjZSosIG1lYW5pbmcgdGhhdFxucmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LFxudGhlIG9sZCBvYmplY3QgaXMgbW9kaWZpZWQgaW5zdGVhZC5cblxuV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgaW4gYVxuc2luZ2xlIHN0YXRlbWVudCwgdGhlIGFzc2lnbm1lbnQgZG9uZSBieSBhdWdtZW50ZWQgYXNzaWdubWVudFxuc3RhdGVtZW50cyBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhcyBub3JtYWwgYXNzaWdubWVudHMuIFNpbWlsYXJseSxcbndpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcG9zc2libGUgKmluLXBsYWNlKiBiZWhhdmlvciwgdGhlIGJpbmFyeVxub3BlcmF0aW9uIHBlcmZvcm1lZCBieSBhdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgc2FtZSBhcyB0aGUgbm9ybWFsXG5iaW5hcnkgb3BlcmF0aW9ucy5cblxuRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgc2FtZSAqY2F2ZWF0IGFib3V0XG5jbGFzcyBhbmQgaW5zdGFuY2UgYXR0cmlidXRlcyogYXBwbGllcyBhcyBmb3IgcmVndWxhciBhc3NpZ25tZW50cy5cbicsCisgJ2JpbmFyeSc6ICdcbkJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGJpbmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgaGF2ZSB0aGUgY29udmVudGlvbmFsIHByaW9yaXR5XG5sZXZlbHMuICBOb3RlIHRoYXQgc29tZSBvZiB0aGVzZSBvcGVyYXRpb25zIGFsc28gYXBwbHkgdG8gY2VydGFpbiBub24tXG5udW1lcmljIHR5cGVzLiAgQXBhcnQgZnJvbSB0aGUgcG93ZXIgb3BlcmF0b3IsIHRoZXJlIGFyZSBvbmx5IHR3b1xubGV2ZWxzLCBvbmUgZm9yIG11bHRpcGxpY2F0aXZlIG9wZXJhdG9ycyBhbmQgb25lIGZvciBhZGRpdGl2ZVxub3BlcmF0b3JzOlxuXG4gICBtX2V4cHIgOjo9IHVfZXhwciB8IG1fZXhwciAiKiIgdV9leHByIHwgbV9leHByICIvLyIgdV9leHByIHwgbV9leHByICIvIiB1X2V4cHJcbiAgICAgICAgICAgICAgfCBtX2V4cHIgIiUiIHVfZXhwclxuICAgYV9leHByIDo6PSBtX2V4cHIgfCBhX2V4cHIgIisiIG1fZXhwciB8IGFfZXhwciAiLSIgbV9leHByXG5cblRoZSBgYCpgYCAobXVsdGlwbGljYXRpb24pIG9wZXJhdG9yIHlpZWxkcyB0aGUgcHJvZHVjdCBvZiBpdHNcbmFyZ3VtZW50cy4gIFRoZSBhcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzLCBvciBvbmUgYXJndW1lbnRcbm11c3QgYmUgYW4gaW50ZWdlciAocGxhaW4gb3IgbG9uZykgYW5kIHRoZSBvdGhlciBtdXN0IGJlIGEgc2VxdWVuY2UuXG5JbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSBudW1iZXJzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSBhbmRcbnRoZW4gbXVsdGlwbGllZCB0b2dldGhlci4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgc2VxdWVuY2UgcmVwZXRpdGlvbiBpc1xucGVyZm9ybWVkOyBhIG5lZ2F0aXZlIHJlcGV0aXRpb24gZmFjdG9yIHlpZWxkcyBhbiBlbXB0eSBzZXF1ZW5jZS5cblxuVGhlIGBgL2BgIChkaXZpc2lvbikgYW5kIGBgLy9gYCAoZmxvb3IgZGl2aXNpb24pIG9wZXJhdG9ycyB5aWVsZCB0aGVcbnF1b3RpZW50IG9mIHRoZWlyIGFyZ3VtZW50cy4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3RcbmNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiBQbGFpbiBvciBsb25nIGludGVnZXIgZGl2aXNpb24geWllbGRzIGFuXG5pbnRlZ2VyIG9mIHRoZSBzYW1lIHR5cGU7IHRoZSByZXN1bHQgaXMgdGhhdCBvZiBtYXRoZW1hdGljYWwgZGl2aXNpb25cbndpdGggdGhlIFwnZmxvb3JcJyBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSByZXN1bHQuIERpdmlzaW9uIGJ5IHplcm9cbnJhaXNlcyB0aGUgYGBaZXJvRGl2aXNpb25FcnJvcmBgIGV4Y2VwdGlvbi5cblxuVGhlIGBgJWBgIChtb2R1bG8pIG9wZXJhdG9yIHlpZWxkcyB0aGUgcmVtYWluZGVyIGZyb20gdGhlIGRpdmlzaW9uIG9mXG50aGUgZmlyc3QgYXJndW1lbnQgYnkgdGhlIHNlY29uZC4gIFRoZSBudW1lcmljIGFyZ3VtZW50cyBhcmUgZmlyc3RcbmNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgQSB6ZXJvIHJpZ2h0IGFyZ3VtZW50IHJhaXNlcyB0aGVcbmBgWmVyb0RpdmlzaW9uRXJyb3JgYCBleGNlcHRpb24uICBUaGUgYXJndW1lbnRzIG1heSBiZSBmbG9hdGluZyBwb2ludFxubnVtYmVycywgZS5nLiwgYGAzLjE0JTAuN2BgIGVxdWFscyBgYDAuMzRgYCAoc2luY2UgYGAzLjE0YGAgZXF1YWxzXG5gYDQqMC43ICsgMC4zNGBgLikgIFRoZSBtb2R1bG8gb3BlcmF0b3IgYWx3YXlzIHlpZWxkcyBhIHJlc3VsdCB3aXRoXG50aGUgc2FtZSBzaWduIGFzIGl0cyBzZWNvbmQgb3BlcmFuZCAob3IgemVybyk7IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZlxudGhlIHJlc3VsdCBpcyBzdHJpY3RseSBzbWFsbGVyIHRoYW4gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBzZWNvbmRcbm9wZXJhbmQgWzJdLlxuXG5UaGUgaW50ZWdlciBkaXZpc2lvbiBhbmQgbW9kdWxvIG9wZXJhdG9ycyBhcmUgY29ubmVjdGVkIGJ5IHRoZVxuZm9sbG93aW5nIGlkZW50aXR5OiBgYHggPT0gKHgveSkqeSArICh4JXkpYGAuICBJbnRlZ2VyIGRpdmlzaW9uIGFuZFxubW9kdWxvIGFyZSBhbHNvIGNvbm5lY3RlZCB3aXRoIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGRpdm1vZCgpYGA6XG5gYGRpdm1vZCh4LCB5KSA9PSAoeC95LCB4JXkpYGAuICBUaGVzZSBpZGVudGl0aWVzIGRvblwndCBob2xkIGZvclxuZmxvYXRpbmcgcG9pbnQgbnVtYmVyczsgdGhlcmUgc2ltaWxhciBpZGVudGl0aWVzIGhvbGQgYXBwcm94aW1hdGVseVxud2hlcmUgYGB4L3lgYCBpcyByZXBsYWNlZCBieSBgYGZsb29yKHgveSlgYCBvciBgYGZsb29yKHgveSkgLSAxYGAgWzNdLlxuXG5JbiBhZGRpdGlvbiB0byBwZXJmb3JtaW5nIHRoZSBtb2R1bG8gb3BlcmF0aW9uIG9uIG51bWJlcnMsIHRoZSBgYCVgYFxub3BlcmF0b3IgaXMgYWxzbyBvdmVybG9hZGVkIGJ5IHN0cmluZyBhbmQgdW5pY29kZSBvYmplY3RzIHRvIHBlcmZvcm1cbnN0cmluZyBmb3JtYXR0aW5nIChhbHNvIGtub3duIGFzIGludGVycG9sYXRpb24pLiBUaGUgc3ludGF4IGZvciBzdHJpbmdcbmZvcm1hdHRpbmcgaXMgZGVzY3JpYmVkIGluIHRoZSBQeXRob24gTGlicmFyeSBSZWZlcmVuY2UsIHNlY3Rpb25cbipTdHJpbmcgRm9ybWF0dGluZyBPcGVyYXRpb25zKi5cblxuRGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuMzogVGhlIGZsb29yIGRpdmlzaW9uIG9wZXJhdG9yLCB0aGUgbW9kdWxvXG5vcGVyYXRvciwgYW5kIHRoZSBgYGRpdm1vZCgpYGAgZnVuY3Rpb24gYXJlIG5vIGxvbmdlciBkZWZpbmVkIGZvclxuY29tcGxleCBudW1iZXJzLiAgSW5zdGVhZCwgY29udmVydCB0byBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB1c2luZ1xudGhlIGBgYWJzKClgYCBmdW5jdGlvbiBpZiBhcHByb3ByaWF0ZS5cblxuVGhlIGBgK2BgIChhZGRpdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBzdW0gb2YgaXRzIGFyZ3VtZW50cy4gVGhlXG5hcmd1bWVudHMgbXVzdCBlaXRoZXIgYm90aCBiZSBudW1iZXJzIG9yIGJvdGggc2VxdWVuY2VzIG9mIHRoZSBzYW1lXG50eXBlLiAgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGVcbmFuZCB0aGVuIGFkZGVkIHRvZ2V0aGVyLiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgc2VxdWVuY2VzIGFyZVxuY29uY2F0ZW5hdGVkLlxuXG5UaGUgYGAtYGAgKHN1YnRyYWN0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIGRpZmZlcmVuY2Ugb2YgaXRzXG5hcmd1bWVudHMuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBhIGNvbW1vblxudHlwZS5cbicsCisgJ2JpdHdpc2UnOiAnXG5CaW5hcnkgYml0d2lzZSBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkVhY2ggb2YgdGhlIHRocmVlIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXMgYSBkaWZmZXJlbnQgcHJpb3JpdHkgbGV2ZWw6XG5cbiAgIGFuZF9leHByIDo6PSBzaGlmdF9leHByIHwgYW5kX2V4cHIgIiYiIHNoaWZ0X2V4cHJcbiAgIHhvcl9leHByIDo6PSBhbmRfZXhwciB8IHhvcl9leHByICJeIiBhbmRfZXhwclxuICAgb3JfZXhwciAgOjo9IHhvcl9leHByIHwgb3JfZXhwciAifCIgeG9yX2V4cHJcblxuVGhlIGBgJmBgIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBBTkQgb2YgaXRzIGFyZ3VtZW50cywgd2hpY2ggbXVzdFxuYmUgcGxhaW4gb3IgbG9uZyBpbnRlZ2Vycy4gIFRoZSBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vblxudHlwZS5cblxuVGhlIGBgXmBgIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBYT1IgKGV4Y2x1c2l2ZSBPUikgb2YgaXRzXG5hcmd1bWVudHMsIHdoaWNoIG11c3QgYmUgcGxhaW4gb3IgbG9uZyBpbnRlZ2Vycy4gIFRoZSBhcmd1bWVudHMgYXJlXG5jb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS5cblxuVGhlIGBgfGBgIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSAoaW5jbHVzaXZlKSBPUiBvZiBpdHMgYXJndW1lbnRzLFxud2hpY2ggbXVzdCBiZSBwbGFpbiBvciBsb25nIGludGVnZXJzLiAgVGhlIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvXG5hIGNvbW1vbiB0eXBlLlxuJywKKyAnYmx0aW4tY29kZS1vYmplY3RzJzogJ1xuQ29kZSBPYmplY3RzXG4qKioqKioqKioqKipcblxuQ29kZSBvYmplY3RzIGFyZSB1c2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiB0byByZXByZXNlbnQgInBzZXVkby1cbmNvbXBpbGVkIiBleGVjdXRhYmxlIFB5dGhvbiBjb2RlIHN1Y2ggYXMgYSBmdW5jdGlvbiBib2R5LiBUaGV5IGRpZmZlclxuZnJvbSBmdW5jdGlvbiBvYmplY3RzIGJlY2F1c2UgdGhleSBkb25cJ3QgY29udGFpbiBhIHJlZmVyZW5jZSB0byB0aGVpclxuZ2xvYmFsIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4gIENvZGUgb2JqZWN0cyBhcmUgcmV0dXJuZWQgYnkgdGhlIGJ1aWx0LVxuaW4gYGBjb21waWxlKClgYCBmdW5jdGlvbiBhbmQgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIGZ1bmN0aW9uIG9iamVjdHNcbnRocm91Z2ggdGhlaXIgYGBmdW5jX2NvZGVgYCBhdHRyaWJ1dGUuIFNlZSBhbHNvIHRoZSBgYGNvZGVgYCBtb2R1bGUuXG5cbkEgY29kZSBvYmplY3QgY2FuIGJlIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCBieSBwYXNzaW5nIGl0IChpbnN0ZWFkIG9mIGFcbnNvdXJjZSBzdHJpbmcpIHRvIHRoZSBgYGV4ZWNgYCBzdGF0ZW1lbnQgb3IgdGhlIGJ1aWx0LWluIGBgZXZhbCgpYGBcbmZ1bmN0aW9uLlxuXG5TZWUgKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nLAorICdibHRpbi1lbGxpcHNpcy1vYmplY3QnOiAnXG5UaGUgRWxsaXBzaXMgT2JqZWN0XG4qKioqKioqKioqKioqKioqKioqXG5cblRoaXMgb2JqZWN0IGlzIHVzZWQgYnkgZXh0ZW5kZWQgc2xpY2Ugbm90YXRpb24gKHNlZSAqU2xpY2luZ3MqKS4gIEl0XG5zdXBwb3J0cyBubyBzcGVjaWFsIG9wZXJhdGlvbnMuICBUaGVyZSBpcyBleGFjdGx5IG9uZSBlbGxpcHNpcyBvYmplY3QsXG5uYW1lZCBgYEVsbGlwc2lzYGAgKGEgYnVpbHQtaW4gbmFtZSkuXG5cbkl0IGlzIHdyaXR0ZW4gYXMgYGBFbGxpcHNpc2BgLiAgV2hlbiBpbiBhIHN1YnNjcmlwdCwgaXQgY2FuIGFsc28gYmVcbndyaXR0ZW4gYXMgYGAuLi5gYCwgZm9yIGV4YW1wbGUgYGBzZXFbLi4uXWBgLlxuJywKKyAnYmx0aW4tbnVsbC1vYmplY3QnOiAiXG5UaGUgTnVsbCBPYmplY3RcbioqKioqKioqKioqKioqKlxuXG5UaGlzIG9iamVjdCBpcyByZXR1cm5lZCBieSBmdW5jdGlvbnMgdGhhdCBkb24ndCBleHBsaWNpdGx5IHJldHVybiBhXG52YWx1ZS4gIEl0IHN1cHBvcnRzIG5vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzIGV4YWN0bHkgb25lIG51bGxcbm9iamVjdCwgbmFtZWQgYGBOb25lYGAgKGEgYnVpbHQtaW4gbmFtZSkuXG5cbkl0IGlzIHdyaXR0ZW4gYXMgYGBOb25lYGAuXG4iLAorICdibHRpbi10eXBlLW9iamVjdHMnOiAiXG5UeXBlIE9iamVjdHNcbioqKioqKioqKioqKlxuXG5UeXBlIG9iamVjdHMgcmVwcmVzZW50IHRoZSB2YXJpb3VzIG9iamVjdCB0eXBlcy4gIEFuIG9iamVjdCdzIHR5cGUgaXNcbmFjY2Vzc2VkIGJ5IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYHR5cGUoKWBgLiAgVGhlcmUgYXJlIG5vIHNwZWNpYWxcbm9wZXJhdGlvbnMgb24gdHlwZXMuICBUaGUgc3RhbmRhcmQgbW9kdWxlIGBgdHlwZXNgYCBkZWZpbmVzIG5hbWVzIGZvclxuYWxsIHN0YW5kYXJkIGJ1aWx0LWluIHR5cGVzLlxuXG5UeXBlcyBhcmUgd3JpdHRlbiBsaWtlIHRoaXM6IGBgPHR5cGUgJ2ludCc+YGAuXG4iLAorICdib29sZWFucyc6ICdcbkJvb2xlYW4gb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqXG5cbiAgIG9yX3Rlc3QgIDo6PSBhbmRfdGVzdCB8IG9yX3Rlc3QgIm9yIiBhbmRfdGVzdFxuICAgYW5kX3Rlc3QgOjo9IG5vdF90ZXN0IHwgYW5kX3Rlc3QgImFuZCIgbm90X3Rlc3RcbiAgIG5vdF90ZXN0IDo6PSBjb21wYXJpc29uIHwgIm5vdCIgbm90X3Rlc3RcblxuSW4gdGhlIGNvbnRleHQgb2YgQm9vbGVhbiBvcGVyYXRpb25zLCBhbmQgYWxzbyB3aGVuIGV4cHJlc3Npb25zIGFyZVxudXNlZCBieSBjb250cm9sIGZsb3cgc3RhdGVtZW50cywgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGludGVycHJldGVkXG5hcyBmYWxzZTogYGBGYWxzZWBgLCBgYE5vbmVgYCwgbnVtZXJpYyB6ZXJvIG9mIGFsbCB0eXBlcywgYW5kIGVtcHR5XG5zdHJpbmdzIGFuZCBjb250YWluZXJzIChpbmNsdWRpbmcgc3RyaW5ncywgdHVwbGVzLCBsaXN0cyxcbmRpY3Rpb25hcmllcywgc2V0cyBhbmQgZnJvemVuc2V0cykuICBBbGwgb3RoZXIgdmFsdWVzIGFyZSBpbnRlcnByZXRlZFxuYXMgdHJ1ZS4gIChTZWUgdGhlIGBgX19ub256ZXJvX18oKWBgIHNwZWNpYWwgbWV0aG9kIGZvciBhIHdheSB0b1xuY2hhbmdlIHRoaXMuKVxuXG5UaGUgb3BlcmF0b3IgYGBub3RgYCB5aWVsZHMgYGBUcnVlYGAgaWYgaXRzIGFyZ3VtZW50IGlzIGZhbHNlLFxuYGBGYWxzZWBgIG90aGVyd2lzZS5cblxuVGhlIGV4cHJlc3Npb24gYGB4IGFuZCB5YGAgZmlyc3QgZXZhbHVhdGVzICp4KjsgaWYgKngqIGlzIGZhbHNlLCBpdHNcbnZhbHVlIGlzIHJldHVybmVkOyBvdGhlcndpc2UsICp5KiBpcyBldmFsdWF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgdmFsdWVcbmlzIHJldHVybmVkLlxuXG5UaGUgZXhwcmVzc2lvbiBgYHggb3IgeWBgIGZpcnN0IGV2YWx1YXRlcyAqeCo7IGlmICp4KiBpcyB0cnVlLCBpdHNcbnZhbHVlIGlzIHJldHVybmVkOyBvdGhlcndpc2UsICp5KiBpcyBldmFsdWF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgdmFsdWVcbmlzIHJldHVybmVkLlxuXG4oTm90ZSB0aGF0IG5laXRoZXIgYGBhbmRgYCBub3IgYGBvcmBgIHJlc3RyaWN0IHRoZSB2YWx1ZSBhbmQgdHlwZSB0aGV5XG5yZXR1cm4gdG8gYGBGYWxzZWBgIGFuZCBgYFRydWVgYCwgYnV0IHJhdGhlciByZXR1cm4gdGhlIGxhc3QgZXZhbHVhdGVkXG5hcmd1bWVudC4gVGhpcyBpcyBzb21ldGltZXMgdXNlZnVsLCBlLmcuLCBpZiBgYHNgYCBpcyBhIHN0cmluZyB0aGF0XG5zaG91bGQgYmUgcmVwbGFjZWQgYnkgYSBkZWZhdWx0IHZhbHVlIGlmIGl0IGlzIGVtcHR5LCB0aGUgZXhwcmVzc2lvblxuYGBzIG9yIFwnZm9vXCdgYCB5aWVsZHMgdGhlIGRlc2lyZWQgdmFsdWUuICBCZWNhdXNlIGBgbm90YGAgaGFzIHRvXG5pbnZlbnQgYSB2YWx1ZSBhbnl3YXksIGl0IGRvZXMgbm90IGJvdGhlciB0byByZXR1cm4gYSB2YWx1ZSBvZiB0aGVcbnNhbWUgdHlwZSBhcyBpdHMgYXJndW1lbnQsIHNvIGUuZy4sIGBgbm90IFwnZm9vXCdgYCB5aWVsZHMgYGBGYWxzZWBgLFxubm90IGBgXCdcJ2BgLilcbicsCisgJ2JyZWFrJzogJ1xuVGhlIGBgYnJlYWtgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIGJyZWFrX3N0bXQgOjo9ICJicmVhayJcblxuYGBicmVha2BgIG1heSBvbmx5IG9jY3VyIHN5bnRhY3RpY2FsbHkgbmVzdGVkIGluIGEgYGBmb3JgYCBvclxuYGB3aGlsZWBgIGxvb3AsIGJ1dCBub3QgbmVzdGVkIGluIGEgZnVuY3Rpb24gb3IgY2xhc3MgZGVmaW5pdGlvblxud2l0aGluIHRoYXQgbG9vcC5cblxuSXQgdGVybWluYXRlcyB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbG9vcCwgc2tpcHBpbmcgdGhlIG9wdGlvbmFsXG5gYGVsc2VgYCBjbGF1c2UgaWYgdGhlIGxvb3AgaGFzIG9uZS5cblxuSWYgYSBgYGZvcmBgIGxvb3AgaXMgdGVybWluYXRlZCBieSBgYGJyZWFrYGAsIHRoZSBsb29wIGNvbnRyb2wgdGFyZ2V0XG5rZWVwcyBpdHMgY3VycmVudCB2YWx1ZS5cblxuV2hlbiBgYGJyZWFrYGAgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgYGB0cnlgYCBzdGF0ZW1lbnQgd2l0aCBhXG5gYGZpbmFsbHlgYCBjbGF1c2UsIHRoYXQgYGBmaW5hbGx5YGAgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHlcbmxlYXZpbmcgdGhlIGxvb3AuXG4nLAorICdjYWxsYWJsZS10eXBlcyc6ICdcbkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5vYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgImNhbGxlZCIgYXMgYSBmdW5jdGlvbjsgaWYgdGhpcyBtZXRob2RcbiAgIGlzIGRlZmluZWQsIGBgeChhcmcxLCBhcmcyLCAuLi4pYGAgaXMgYSBzaG9ydGhhbmQgZm9yXG4gICBgYHguX19jYWxsX18oYXJnMSwgYXJnMiwgLi4uKWBgLlxuJywKKyAnY2FsbHMnOiAnXG5DYWxsc1xuKioqKipcblxuQSBjYWxsIGNhbGxzIGEgY2FsbGFibGUgb2JqZWN0IChlLmcuLCBhICpmdW5jdGlvbiopIHdpdGggYSBwb3NzaWJseVxuZW1wdHkgc2VyaWVzIG9mICphcmd1bWVudHMqOlxuXG4gICBjYWxsICAgICAgICAgICAgICAgICA6Oj0gcHJpbWFyeSAiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl1cbiAgICAgICAgICAgIHwgZXhwcmVzc2lvbiBnZW5leHByX2Zvcl0gIikiXG4gICBhcmd1bWVudF9saXN0ICAgICAgICA6Oj0gcG9zaXRpb25hbF9hcmd1bWVudHMgWyIsIiBrZXl3b3JkX2FyZ3VtZW50c11cbiAgICAgICAgICAgICAgICAgICAgICAgWyIsIiAiKiIgZXhwcmVzc2lvbl0gWyIsIiBrZXl3b3JkX2FyZ3VtZW50c11cbiAgICAgICAgICAgICAgICAgICAgICAgWyIsIiAiKioiIGV4cHJlc3Npb25dXG4gICAgICAgICAgICAgICAgICAgICB8IGtleXdvcmRfYXJndW1lbnRzIFsiLCIgIioiIGV4cHJlc3Npb25dXG4gICAgICAgICAgICAgICAgICAgICAgIFsiLCIgIioqIiBleHByZXNzaW9uXVxuICAgICAgICAgICAgICAgICAgICAgfCAiKiIgZXhwcmVzc2lvbiBbIiwiICIqIiBleHByZXNzaW9uXSBbIiwiICIqKiIgZXhwcmVzc2lvbl1cbiAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBleHByZXNzaW9uXG4gICBwb3NpdGlvbmFsX2FyZ3VtZW50cyA6Oj0gZXhwcmVzc2lvbiAoIiwiIGV4cHJlc3Npb24pKlxuICAga2V5d29yZF9hcmd1bWVudHMgICAgOjo9IGtleXdvcmRfaXRlbSAoIiwiIGtleXdvcmRfaXRlbSkqXG4gICBrZXl3b3JkX2l0ZW0gICAgICAgICA6Oj0gaWRlbnRpZmllciAiPSIgZXhwcmVzc2lvblxuXG5BIHRyYWlsaW5nIGNvbW1hIG1heSBiZSBwcmVzZW50IGFmdGVyIHRoZSBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkXG5hcmd1bWVudHMgYnV0IGRvZXMgbm90IGFmZmVjdCB0aGUgc2VtYW50aWNzLlxuXG5UaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGEgY2FsbGFibGUgb2JqZWN0ICh1c2VyLWRlZmluZWRcbmZ1bmN0aW9ucywgYnVpbHQtaW4gZnVuY3Rpb25zLCBtZXRob2RzIG9mIGJ1aWx0LWluIG9iamVjdHMsIGNsYXNzXG5vYmplY3RzLCBtZXRob2RzIG9mIGNsYXNzIGluc3RhbmNlcywgYW5kIGNlcnRhaW4gY2xhc3MgaW5zdGFuY2VzXG50aGVtc2VsdmVzIGFyZSBjYWxsYWJsZTsgZXh0ZW5zaW9ucyBtYXkgZGVmaW5lIGFkZGl0aW9uYWwgY2FsbGFibGVcbm9iamVjdCB0eXBlcykuICBBbGwgYXJndW1lbnQgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCBiZWZvcmUgdGhlIGNhbGxcbmlzIGF0dGVtcHRlZC4gIFBsZWFzZSByZWZlciB0byBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIHRoZVxuc3ludGF4IG9mIGZvcm1hbCAqcGFyYW1ldGVyKiBsaXN0cy5cblxuSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHByZXNlbnQsIHRoZXkgYXJlIGZpcnN0IGNvbnZlcnRlZCB0b1xucG9zaXRpb25hbCBhcmd1bWVudHMsIGFzIGZvbGxvd3MuICBGaXJzdCwgYSBsaXN0IG9mIHVuZmlsbGVkIHNsb3RzIGlzXG5jcmVhdGVkIGZvciB0aGUgZm9ybWFsIHBhcmFtZXRlcnMuICBJZiB0aGVyZSBhcmUgTiBwb3NpdGlvbmFsXG5hcmd1bWVudHMsIHRoZXkgYXJlIHBsYWNlZCBpbiB0aGUgZmlyc3QgTiBzbG90cy4gIE5leHQsIGZvciBlYWNoXG5rZXl3b3JkIGFyZ3VtZW50LCB0aGUgaWRlbnRpZmllciBpcyB1c2VkIHRvIGRldGVybWluZSB0aGVcbmNvcnJlc3BvbmRpbmcgc2xvdCAoaWYgdGhlIGlkZW50aWZpZXIgaXMgdGhlIHNhbWUgYXMgdGhlIGZpcnN0IGZvcm1hbFxucGFyYW1ldGVyIG5hbWUsIHRoZSBmaXJzdCBzbG90IGlzIHVzZWQsIGFuZCBzbyBvbikuICBJZiB0aGUgc2xvdCBpc1xuYWxyZWFkeSBmaWxsZWQsIGEgYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLiBPdGhlcndpc2UsIHRoZVxudmFsdWUgb2YgdGhlIGFyZ3VtZW50IGlzIHBsYWNlZCBpbiB0aGUgc2xvdCwgZmlsbGluZyBpdCAoZXZlbiBpZiB0aGVcbmV4cHJlc3Npb24gaXMgYGBOb25lYGAsIGl0IGZpbGxzIHRoZSBzbG90KS4gIFdoZW4gYWxsIGFyZ3VtZW50cyBoYXZlXG5iZWVuIHByb2Nlc3NlZCwgdGhlIHNsb3RzIHRoYXQgYXJlIHN0aWxsIHVuZmlsbGVkIGFyZSBmaWxsZWQgd2l0aCB0aGVcbmNvcnJlc3BvbmRpbmcgZGVmYXVsdCB2YWx1ZSBmcm9tIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAgKERlZmF1bHRcbnZhbHVlcyBhcmUgY2FsY3VsYXRlZCwgb25jZSwgd2hlbiB0aGUgZnVuY3Rpb24gaXMgZGVmaW5lZDsgdGh1cywgYVxubXV0YWJsZSBvYmplY3Qgc3VjaCBhcyBhIGxpc3Qgb3IgZGljdGlvbmFyeSB1c2VkIGFzIGRlZmF1bHQgdmFsdWUgd2lsbFxuYmUgc2hhcmVkIGJ5IGFsbCBjYWxscyB0aGF0IGRvblwndCBzcGVjaWZ5IGFuIGFyZ3VtZW50IHZhbHVlIGZvciB0aGVcbmNvcnJlc3BvbmRpbmcgc2xvdDsgdGhpcyBzaG91bGQgdXN1YWxseSBiZSBhdm9pZGVkLikgIElmIHRoZXJlIGFyZSBhbnlcbnVuZmlsbGVkIHNsb3RzIGZvciB3aGljaCBubyBkZWZhdWx0IHZhbHVlIGlzIHNwZWNpZmllZCwgYVxuYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLiAgT3RoZXJ3aXNlLCB0aGUgbGlzdCBvZiBmaWxsZWRcbnNsb3RzIGlzIHVzZWQgYXMgdGhlIGFyZ3VtZW50IGxpc3QgZm9yIHRoZSBjYWxsLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEFuIGltcGxlbWVudGF0aW9uIG1heSBwcm92aWRlXG5idWlsdC1pbiBmdW5jdGlvbnMgd2hvc2UgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIGRvIG5vdCBoYXZlIG5hbWVzLCBldmVuXG5pZiB0aGV5IGFyZSBcJ25hbWVkXCcgZm9yIHRoZSBwdXJwb3NlIG9mIGRvY3VtZW50YXRpb24sIGFuZCB3aGljaFxudGhlcmVmb3JlIGNhbm5vdCBiZSBzdXBwbGllZCBieSBrZXl3b3JkLiAgSW4gQ1B5dGhvbiwgdGhpcyBpcyB0aGUgY2FzZVxuZm9yIGZ1bmN0aW9ucyBpbXBsZW1lbnRlZCBpbiBDIHRoYXQgdXNlIGBgUHlBcmdfUGFyc2VUdXBsZSgpYGAgdG9cbnBhcnNlIHRoZWlyIGFyZ3VtZW50cy5cblxuSWYgdGhlcmUgYXJlIG1vcmUgcG9zaXRpb25hbCBhcmd1bWVudHMgdGhhbiB0aGVyZSBhcmUgZm9ybWFsIHBhcmFtZXRlclxuc2xvdHMsIGEgYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLCB1bmxlc3MgYSBmb3JtYWwgcGFyYW1ldGVyXG51c2luZyB0aGUgc3ludGF4IGBgKmlkZW50aWZpZXJgYCBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXQgZm9ybWFsXG5wYXJhbWV0ZXIgcmVjZWl2ZXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBleGNlc3MgcG9zaXRpb25hbCBhcmd1bWVudHNcbihvciBhbiBlbXB0eSB0dXBsZSBpZiB0aGVyZSB3ZXJlIG5vIGV4Y2VzcyBwb3NpdGlvbmFsIGFyZ3VtZW50cykuXG5cbklmIGFueSBrZXl3b3JkIGFyZ3VtZW50IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBmb3JtYWwgcGFyYW1ldGVyXG5uYW1lLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsIHBhcmFtZXRlclxudXNpbmcgdGhlIHN5bnRheCBgYCoqaWRlbnRpZmllcmBgIGlzIHByZXNlbnQ7IGluIHRoaXMgY2FzZSwgdGhhdFxuZm9ybWFsIHBhcmFtZXRlciByZWNlaXZlcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgZXhjZXNzIGtleXdvcmRcbmFyZ3VtZW50cyAodXNpbmcgdGhlIGtleXdvcmRzIGFzIGtleXMgYW5kIHRoZSBhcmd1bWVudCB2YWx1ZXMgYXNcbmNvcnJlc3BvbmRpbmcgdmFsdWVzKSwgb3IgYSAobmV3KSBlbXB0eSBkaWN0aW9uYXJ5IGlmIHRoZXJlIHdlcmUgbm9cbmV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cy5cblxuSWYgdGhlIHN5bnRheCBgYCpleHByZXNzaW9uYGAgYXBwZWFycyBpbiB0aGUgZnVuY3Rpb24gY2FsbCxcbmBgZXhwcmVzc2lvbmBgIG11c3QgZXZhbHVhdGUgdG8gYW4gaXRlcmFibGUuICBFbGVtZW50cyBmcm9tIHRoaXNcbml0ZXJhYmxlIGFyZSB0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZSBhZGRpdGlvbmFsIHBvc2l0aW9uYWwgYXJndW1lbnRzO1xuaWYgdGhlcmUgYXJlIHBvc2l0aW9uYWwgYXJndW1lbnRzICp4MSosIC4uLiwgKnhOKiwgYW5kIGBgZXhwcmVzc2lvbmBgXG5ldmFsdWF0ZXMgdG8gYSBzZXF1ZW5jZSAqeTEqLCAuLi4sICp5TSosIHRoaXMgaXMgZXF1aXZhbGVudCB0byBhIGNhbGxcbndpdGggTStOIHBvc2l0aW9uYWwgYXJndW1lbnRzICp4MSosIC4uLiwgKnhOKiwgKnkxKiwgLi4uLCAqeU0qLlxuXG5BIGNvbnNlcXVlbmNlIG9mIHRoaXMgaXMgdGhhdCBhbHRob3VnaCB0aGUgYGAqZXhwcmVzc2lvbmBgIHN5bnRheCBtYXlcbmFwcGVhciAqYWZ0ZXIqIHNvbWUga2V5d29yZCBhcmd1bWVudHMsIGl0IGlzIHByb2Nlc3NlZCAqYmVmb3JlKiB0aGVcbmtleXdvcmQgYXJndW1lbnRzIChhbmQgdGhlIGBgKipleHByZXNzaW9uYGAgYXJndW1lbnQsIGlmIGFueSAtLSBzZWVcbmJlbG93KS4gIFNvOlxuXG4gICA+Pj4gZGVmIGYoYSwgYik6XG4gICAuLi4gIHByaW50IGEsIGJcbiAgIC4uLlxuICAgPj4+IGYoYj0xLCAqKDIsKSlcbiAgIDIgMVxuICAgPj4+IGYoYT0xLCAqKDIsKSlcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gP1xuICAgVHlwZUVycm9yOiBmKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmd1bWVudCBcJ2FcJ1xuICAgPj4+IGYoMSwgKigyLCkpXG4gICAxIDJcblxuSXQgaXMgdW51c3VhbCBmb3IgYm90aCBrZXl3b3JkIGFyZ3VtZW50cyBhbmQgdGhlIGBgKmV4cHJlc3Npb25gYFxuc3ludGF4IHRvIGJlIHVzZWQgaW4gdGhlIHNhbWUgY2FsbCwgc28gaW4gcHJhY3RpY2UgdGhpcyBjb25mdXNpb24gZG9lc1xubm90IGFyaXNlLlxuXG5JZiB0aGUgc3ludGF4IGBgKipleHByZXNzaW9uYGAgYXBwZWFycyBpbiB0aGUgZnVuY3Rpb24gY2FsbCxcbmBgZXhwcmVzc2lvbmBgIG11c3QgZXZhbHVhdGUgdG8gYSBtYXBwaW5nLCB0aGUgY29udGVudHMgb2Ygd2hpY2ggYXJlXG50cmVhdGVkIGFzIGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMuICBJbiB0aGUgY2FzZSBvZiBhIGtleXdvcmRcbmFwcGVhcmluZyBpbiBib3RoIGBgZXhwcmVzc2lvbmBgIGFuZCBhcyBhbiBleHBsaWNpdCBrZXl3b3JkIGFyZ3VtZW50LFxuYSBgYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG5cbkZvcm1hbCBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBzeW50YXggYGAqaWRlbnRpZmllcmBgIG9yIGBgKippZGVudGlmaWVyYGBcbmNhbm5vdCBiZSB1c2VkIGFzIHBvc2l0aW9uYWwgYXJndW1lbnQgc2xvdHMgb3IgYXMga2V5d29yZCBhcmd1bWVudFxubmFtZXMuICBGb3JtYWwgcGFyYW1ldGVycyB1c2luZyB0aGUgc3ludGF4IGBgKHN1Ymxpc3QpYGAgY2Fubm90IGJlXG51c2VkIGFzIGtleXdvcmQgYXJndW1lbnQgbmFtZXM7IHRoZSBvdXRlcm1vc3Qgc3VibGlzdCBjb3JyZXNwb25kcyB0byBhXG5zaW5nbGUgdW5uYW1lZCBhcmd1bWVudCBzbG90LCBhbmQgdGhlIGFyZ3VtZW50IHZhbHVlIGlzIGFzc2lnbmVkIHRvXG50aGUgc3VibGlzdCB1c2luZyB0aGUgdXN1YWwgdHVwbGUgYXNzaWdubWVudCBydWxlcyBhZnRlciBhbGwgb3RoZXJcbnBhcmFtZXRlciBwcm9jZXNzaW5nIGlzIGRvbmUuXG5cbkEgY2FsbCBhbHdheXMgcmV0dXJucyBzb21lIHZhbHVlLCBwb3NzaWJseSBgYE5vbmVgYCwgdW5sZXNzIGl0IHJhaXNlc1xuYW4gZXhjZXB0aW9uLiAgSG93IHRoaXMgdmFsdWUgaXMgY29tcHV0ZWQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiB0aGVcbmNhbGxhYmxlIG9iamVjdC5cblxuSWYgaXQgaXMtLS1cblxuYSB1c2VyLWRlZmluZWQgZnVuY3Rpb246XG4gICBUaGUgY29kZSBibG9jayBmb3IgdGhlIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLCBwYXNzaW5nIGl0IHRoZVxuICAgYXJndW1lbnQgbGlzdC4gIFRoZSBmaXJzdCB0aGluZyB0aGUgY29kZSBibG9jayB3aWxsIGRvIGlzIGJpbmQgdGhlXG4gICBmb3JtYWwgcGFyYW1ldGVycyB0byB0aGUgYXJndW1lbnRzOyB0aGlzIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uXG4gICAqRnVuY3Rpb24gZGVmaW5pdGlvbnMqLiAgV2hlbiB0aGUgY29kZSBibG9jayBleGVjdXRlcyBhIGBgcmV0dXJuYGBcbiAgIHN0YXRlbWVudCwgdGhpcyBzcGVjaWZpZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gY2FsbC5cblxuYSBidWlsdC1pbiBmdW5jdGlvbiBvciBtZXRob2Q6XG4gICBUaGUgcmVzdWx0IGlzIHVwIHRvIHRoZSBpbnRlcnByZXRlcjsgc2VlICpCdWlsdC1pbiBGdW5jdGlvbnMqIGZvclxuICAgdGhlIGRlc2NyaXB0aW9ucyBvZiBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIG1ldGhvZHMuXG5cbmEgY2xhc3Mgb2JqZWN0OlxuICAgQSBuZXcgaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyBpcyByZXR1cm5lZC5cblxuYSBjbGFzcyBpbnN0YW5jZSBtZXRob2Q6XG4gICBUaGUgY29ycmVzcG9uZGluZyB1c2VyLWRlZmluZWQgZnVuY3Rpb24gaXMgY2FsbGVkLCB3aXRoIGFuIGFyZ3VtZW50XG4gICBsaXN0IHRoYXQgaXMgb25lIGxvbmdlciB0aGFuIHRoZSBhcmd1bWVudCBsaXN0IG9mIHRoZSBjYWxsOiB0aGVcbiAgIGluc3RhbmNlIGJlY29tZXMgdGhlIGZpcnN0IGFyZ3VtZW50LlxuXG5hIGNsYXNzIGluc3RhbmNlOlxuICAgVGhlIGNsYXNzIG11c3QgZGVmaW5lIGEgYGBfX2NhbGxfXygpYGAgbWV0aG9kOyB0aGUgZWZmZWN0IGlzIHRoZW5cbiAgIHRoZSBzYW1lIGFzIGlmIHRoYXQgbWV0aG9kIHdhcyBjYWxsZWQuXG4nLAorICdjbGFzcyc6ICdcbkNsYXNzIGRlZmluaXRpb25zXG4qKioqKioqKioqKioqKioqKlxuXG5BIGNsYXNzIGRlZmluaXRpb24gZGVmaW5lcyBhIGNsYXNzIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZFxudHlwZSBoaWVyYXJjaHkqKTpcblxuICAgY2xhc3NkZWYgICAgOjo9ICJjbGFzcyIgY2xhc3NuYW1lIFtpbmhlcml0YW5jZV0gIjoiIHN1aXRlXG4gICBpbmhlcml0YW5jZSA6Oj0gIigiIFtleHByZXNzaW9uX2xpc3RdICIpIlxuICAgY2xhc3NuYW1lICAgOjo9IGlkZW50aWZpZXJcblxuQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50LiAgSXQgZmlyc3QgZXZhbHVhdGVzIHRoZVxuaW5oZXJpdGFuY2UgbGlzdCwgaWYgcHJlc2VudC4gIEVhY2ggaXRlbSBpbiB0aGUgaW5oZXJpdGFuY2UgbGlzdFxuc2hvdWxkIGV2YWx1YXRlIHRvIGEgY2xhc3Mgb2JqZWN0IG9yIGNsYXNzIHR5cGUgd2hpY2ggYWxsb3dzXG5zdWJjbGFzc2luZy4gIFRoZSBjbGFzc1wncyBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIGluIGEgbmV3IGV4ZWN1dGlvblxuZnJhbWUgKHNlZSBzZWN0aW9uICpOYW1pbmcgYW5kIGJpbmRpbmcqKSwgdXNpbmcgYSBuZXdseSBjcmVhdGVkIGxvY2FsXG5uYW1lc3BhY2UgYW5kIHRoZSBvcmlnaW5hbCBnbG9iYWwgbmFtZXNwYWNlLiAoVXN1YWxseSwgdGhlIHN1aXRlXG5jb250YWlucyBvbmx5IGZ1bmN0aW9uIGRlZmluaXRpb25zLikgIFdoZW4gdGhlIGNsYXNzXCdzIHN1aXRlIGZpbmlzaGVzXG5leGVjdXRpb24sIGl0cyBleGVjdXRpb24gZnJhbWUgaXMgZGlzY2FyZGVkIGJ1dCBpdHMgbG9jYWwgbmFtZXNwYWNlIGlzXG5zYXZlZC4gWzRdIEEgY2xhc3Mgb2JqZWN0IGlzIHRoZW4gY3JlYXRlZCB1c2luZyB0aGUgaW5oZXJpdGFuY2UgbGlzdFxuZm9yIHRoZSBiYXNlIGNsYXNzZXMgYW5kIHRoZSBzYXZlZCBsb2NhbCBuYW1lc3BhY2UgZm9yIHRoZSBhdHRyaWJ1dGVcbmRpY3Rpb25hcnkuICBUaGUgY2xhc3MgbmFtZSBpcyBib3VuZCB0byB0aGlzIGNsYXNzIG9iamVjdCBpbiB0aGVcbm9yaWdpbmFsIGxvY2FsIG5hbWVzcGFjZS5cblxuKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogVmFyaWFibGVzIGRlZmluZWQgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24gYXJlXG5jbGFzcyB2YXJpYWJsZXM7IHRoZXkgYXJlIHNoYXJlZCBieSBhbGwgaW5zdGFuY2VzLiAgVG8gY3JlYXRlIGluc3RhbmNlXG52YXJpYWJsZXMsIHRoZXkgY2FuIGJlIHNldCBpbiBhIG1ldGhvZCB3aXRoIGBgc2VsZi5uYW1lID0gdmFsdWVgYC5cbkJvdGggY2xhc3MgYW5kIGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBub3RhdGlvblxuImBgc2VsZi5uYW1lYGAiLCBhbmQgYW4gaW5zdGFuY2UgdmFyaWFibGUgaGlkZXMgYSBjbGFzcyB2YXJpYWJsZSB3aXRoXG50aGUgc2FtZSBuYW1lIHdoZW4gYWNjZXNzZWQgaW4gdGhpcyB3YXkuIENsYXNzIHZhcmlhYmxlcyBjYW4gYmUgdXNlZFxuYXMgZGVmYXVsdHMgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgYnV0IHVzaW5nIG11dGFibGUgdmFsdWVzIHRoZXJlIGNhblxubGVhZCB0byB1bmV4cGVjdGVkIHJlc3VsdHMuICBGb3IgKm5ldy1zdHlsZSBjbGFzcyplcywgZGVzY3JpcHRvcnMgY2FuXG5iZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZSB2YXJpYWJsZXMgd2l0aCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25cbmRldGFpbHMuXG5cbkNsYXNzIGRlZmluaXRpb25zLCBsaWtlIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3Jcbm1vcmUgKmRlY29yYXRvciogZXhwcmVzc2lvbnMuICBUaGUgZXZhbHVhdGlvbiBydWxlcyBmb3IgdGhlIGRlY29yYXRvclxuZXhwcmVzc2lvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciBmdW5jdGlvbnMuICBUaGUgcmVzdWx0IG11c3QgYmUgYSBjbGFzc1xub2JqZWN0LCB3aGljaCBpcyB0aGVuIGJvdW5kIHRvIHRoZSBjbGFzcyBuYW1lLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoZSBleGNlcHRpb24gaXMgcHJvcGFnYXRlZCB0byB0aGUgaW52b2NhdGlvbiBzdGFjayB1bmxlc3MgdGhlcmVcbiAgICBpcyBhIGBgZmluYWxseWBgIGNsYXVzZSB3aGljaCBoYXBwZW5zIHRvIHJhaXNlIGFub3RoZXIgZXhjZXB0aW9uLlxuICAgIFRoYXQgbmV3IGV4Y2VwdGlvbiBjYXVzZXMgdGhlIG9sZCBvbmUgdG8gYmUgbG9zdC5cblxuWzJdIEN1cnJlbnRseSwgY29udHJvbCAiZmxvd3Mgb2ZmIHRoZSBlbmQiIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBhblxuICAgIGV4Y2VwdGlvbiBvciB0aGUgZXhlY3V0aW9uIG9mIGEgYGByZXR1cm5gYCwgYGBjb250aW51ZWBgLCBvclxuICAgIGBgYnJlYWtgYCBzdGF0ZW1lbnQuXG5cblszXSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBmdW5jdGlvblxuICAgIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgZnVuY3Rpb25cJ3MgYGBfX2RvY19fYGAgYXR0cmlidXRlIGFuZFxuICAgIHRoZXJlZm9yZSB0aGUgZnVuY3Rpb25cJ3MgKmRvY3N0cmluZyouXG5cbls0XSBBIHN0cmluZyBsaXRlcmFsIGFwcGVhcmluZyBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBjbGFzc1xuICAgIGJvZHkgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgbmFtZXNwYWNlXCdzIGBgX19kb2NfX2BgIGl0ZW0gYW5kXG4gICAgdGhlcmVmb3JlIHRoZSBjbGFzc1wncyAqZG9jc3RyaW5nKi5cbicsCisgJ2NvbXBhcmlzb25zJzogJ1xuQ29tcGFyaXNvbnNcbioqKioqKioqKioqXG5cblVubGlrZSBDLCBhbGwgY29tcGFyaXNvbiBvcGVyYXRpb25zIGluIFB5dGhvbiBoYXZlIHRoZSBzYW1lIHByaW9yaXR5LFxud2hpY2ggaXMgbG93ZXIgdGhhbiB0aGF0IG9mIGFueSBhcml0aG1ldGljLCBzaGlmdGluZyBvciBiaXR3aXNlXG5vcGVyYXRpb24uICBBbHNvIHVubGlrZSBDLCBleHByZXNzaW9ucyBsaWtlIGBgYSA8IGIgPCBjYGAgaGF2ZSB0aGVcbmludGVycHJldGF0aW9uIHRoYXQgaXMgY29udmVudGlvbmFsIGluIG1hdGhlbWF0aWNzOlxuXG4gICBjb21wYXJpc29uICAgIDo6PSBvcl9leHByICggY29tcF9vcGVyYXRvciBvcl9leHByICkqXG4gICBjb21wX29wZXJhdG9yIDo6PSAiPCIgfCAiPiIgfCAiPT0iIHwgIj49IiB8ICI8PSIgfCAiPD4iIHwgIiE9IlxuICAgICAgICAgICAgICAgICAgICAgfCAiaXMiIFsibm90Il0gfCBbIm5vdCJdICJpbiJcblxuQ29tcGFyaXNvbnMgeWllbGQgYm9vbGVhbiB2YWx1ZXM6IGBgVHJ1ZWBgIG9yIGBgRmFsc2VgYC5cblxuQ29tcGFyaXNvbnMgY2FuIGJlIGNoYWluZWQgYXJiaXRyYXJpbHksIGUuZy4sIGBgeCA8IHkgPD0gemBgIGlzXG5lcXVpdmFsZW50IHRvIGBgeCA8IHkgYW5kIHkgPD0gemBgLCBleGNlcHQgdGhhdCBgYHlgYCBpcyBldmFsdWF0ZWRcbm9ubHkgb25jZSAoYnV0IGluIGJvdGggY2FzZXMgYGB6YGAgaXMgbm90IGV2YWx1YXRlZCBhdCBhbGwgd2hlbiBgYHggPFxueWBgIGlzIGZvdW5kIHRvIGJlIGZhbHNlKS5cblxuRm9ybWFsbHksIGlmICphKiwgKmIqLCAqYyosIC4uLiwgKnkqLCAqeiogYXJlIGV4cHJlc3Npb25zIGFuZCAqb3AxKixcbipvcDIqLCAuLi4sICpvcE4qIGFyZSBjb21wYXJpc29uIG9wZXJhdG9ycywgdGhlbiBgYGEgb3AxIGIgb3AyIGMgLi4uIHlcbm9wTiB6YGAgaXMgZXF1aXZhbGVudCB0byBgYGEgb3AxIGIgYW5kIGIgb3AyIGMgYW5kIC4uLiB5IG9wTiB6YGAsXG5leGNlcHQgdGhhdCBlYWNoIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGF0IG1vc3Qgb25jZS5cblxuTm90ZSB0aGF0IGBgYSBvcDEgYiBvcDIgY2BgIGRvZXNuXCd0IGltcGx5IGFueSBraW5kIG9mIGNvbXBhcmlzb25cbmJldHdlZW4gKmEqIGFuZCAqYyosIHNvIHRoYXQsIGUuZy4sIGBgeCA8IHkgPiB6YGAgaXMgcGVyZmVjdGx5IGxlZ2FsXG4odGhvdWdoIHBlcmhhcHMgbm90IHByZXR0eSkuXG5cblRoZSBmb3JtcyBgYDw+YGAgYW5kIGBgIT1gYCBhcmUgZXF1aXZhbGVudDsgZm9yIGNvbnNpc3RlbmN5IHdpdGggQyxcbmBgIT1gYCBpcyBwcmVmZXJyZWQ7IHdoZXJlIGBgIT1gYCBpcyBtZW50aW9uZWQgYmVsb3cgYGA8PmBgIGlzIGFsc29cbmFjY2VwdGVkLiAgVGhlIGBgPD5gYCBzcGVsbGluZyBpcyBjb25zaWRlcmVkIG9ic29sZXNjZW50LlxuXG5UaGUgb3BlcmF0b3JzIGBgPGBgLCBgYD5gYCwgYGA9PWBgLCBgYD49YGAsIGBgPD1gYCwgYW5kIGBgIT1gYCBjb21wYXJlXG50aGUgdmFsdWVzIG9mIHR3byBvYmplY3RzLiAgVGhlIG9iamVjdHMgbmVlZCBub3QgaGF2ZSB0aGUgc2FtZSB0eXBlLlxuSWYgYm90aCBhcmUgbnVtYmVycywgdGhleSBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBPdGhlcndpc2UsXG5vYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyAqYWx3YXlzKiBjb21wYXJlIHVuZXF1YWwsIGFuZCBhcmUgb3JkZXJlZFxuY29uc2lzdGVudGx5IGJ1dCBhcmJpdHJhcmlseS4gWW91IGNhbiBjb250cm9sIGNvbXBhcmlzb24gYmVoYXZpb3Igb2Zcbm9iamVjdHMgb2Ygbm9uLWJ1aWx0LWluIHR5cGVzIGJ5IGRlZmluaW5nIGEgYGBfX2NtcF9fYGAgbWV0aG9kIG9yIHJpY2hcbmNvbXBhcmlzb24gbWV0aG9kcyBsaWtlIGBgX19ndF9fYGAsIGRlc2NyaWJlZCBpbiBzZWN0aW9uICpTcGVjaWFsXG5tZXRob2QgbmFtZXMqLlxuXG4oVGhpcyB1bnVzdWFsIGRlZmluaXRpb24gb2YgY29tcGFyaXNvbiB3YXMgdXNlZCB0byBzaW1wbGlmeSB0aGVcbmRlZmluaXRpb24gb2Ygb3BlcmF0aW9ucyBsaWtlIHNvcnRpbmcgYW5kIHRoZSBgYGluYGAgYW5kIGBgbm90IGluYGBcbm9wZXJhdG9ycy4gSW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBhcmlzb24gcnVsZXMgZm9yIG9iamVjdHMgb2ZcbmRpZmZlcmVudCB0eXBlcyBhcmUgbGlrZWx5IHRvIGNoYW5nZS4pXG5cbkNvbXBhcmlzb24gb2Ygb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGRlcGVuZHMgb24gdGhlIHR5cGU6XG5cbiogTnVtYmVycyBhcmUgY29tcGFyZWQgYXJpdGhtZXRpY2FsbHkuXG5cbiogU3RyaW5ncyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlIG51bWVyaWMgZXF1aXZhbGVudHNcbiAgKHRoZSByZXN1bHQgb2YgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgb3JkKClgYCkgb2YgdGhlaXIgY2hhcmFjdGVycy5cbiAgVW5pY29kZSBhbmQgOC1iaXQgc3RyaW5ncyBhcmUgZnVsbHkgaW50ZXJvcGVyYWJsZSBpbiB0aGlzIGJlaGF2aW9yLlxuICBbNF1cblxuKiBUdXBsZXMgYW5kIGxpc3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyBjb21wYXJpc29uIG9mXG4gIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMuICBUaGlzIG1lYW5zIHRoYXQgdG8gY29tcGFyZSBlcXVhbCwgZWFjaFxuICBlbGVtZW50IG11c3QgY29tcGFyZSBlcXVhbCBhbmQgdGhlIHR3byBzZXF1ZW5jZXMgbXVzdCBiZSBvZiB0aGUgc2FtZVxuICB0eXBlIGFuZCBoYXZlIHRoZSBzYW1lIGxlbmd0aC5cblxuICBJZiBub3QgZXF1YWwsIHRoZSBzZXF1ZW5jZXMgYXJlIG9yZGVyZWQgdGhlIHNhbWUgYXMgdGhlaXIgZmlyc3RcbiAgZGlmZmVyaW5nIGVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIGBgY21wKFsxLDIseF0sIFsxLDIseV0pYGAgcmV0dXJuc1xuICB0aGUgc2FtZSBhcyBgYGNtcCh4LHkpYGAuICBJZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGRvZXMgbm90XG4gIGV4aXN0LCB0aGUgc2hvcnRlciBzZXF1ZW5jZSBpcyBvcmRlcmVkIGZpcnN0IChmb3IgZXhhbXBsZSwgYGBbMSwyXSA8XG4gIFsxLDIsM11gYCkuXG5cbiogTWFwcGluZ3MgKGRpY3Rpb25hcmllcykgY29tcGFyZSBlcXVhbCBpZiBhbmQgb25seSBpZiB0aGVpciBzb3J0ZWRcbiAgKGtleSwgdmFsdWUpIGxpc3RzIGNvbXBhcmUgZXF1YWwuIFs1XSBPdXRjb21lcyBvdGhlciB0aGFuIGVxdWFsaXR5XG4gIGFyZSByZXNvbHZlZCBjb25zaXN0ZW50bHksIGJ1dCBhcmUgbm90IG90aGVyd2lzZSBkZWZpbmVkLiBbNl1cblxuKiBNb3N0IG90aGVyIG9iamVjdHMgb2YgYnVpbHQtaW4gdHlwZXMgY29tcGFyZSB1bmVxdWFsIHVubGVzcyB0aGV5IGFyZVxuICB0aGUgc2FtZSBvYmplY3Q7IHRoZSBjaG9pY2Ugd2hldGhlciBvbmUgb2JqZWN0IGlzIGNvbnNpZGVyZWQgc21hbGxlclxuICBvciBsYXJnZXIgdGhhbiBhbm90aGVyIG9uZSBpcyBtYWRlIGFyYml0cmFyaWx5IGJ1dCBjb25zaXN0ZW50bHlcbiAgd2l0aGluIG9uZSBleGVjdXRpb24gb2YgYSBwcm9ncmFtLlxuXG5UaGUgb3BlcmF0b3JzIGBgaW5gYCBhbmQgYGBub3QgaW5gYCB0ZXN0IGZvciBjb2xsZWN0aW9uIG1lbWJlcnNoaXAuXG5gYHggaW4gc2BgIGV2YWx1YXRlcyB0byB0cnVlIGlmICp4KiBpcyBhIG1lbWJlciBvZiB0aGUgY29sbGVjdGlvbiAqcyosXG5hbmQgZmFsc2Ugb3RoZXJ3aXNlLiAgYGB4IG5vdCBpbiBzYGAgcmV0dXJucyB0aGUgbmVnYXRpb24gb2YgYGB4IGluXG5zYGAuIFRoZSBjb2xsZWN0aW9uIG1lbWJlcnNoaXAgdGVzdCBoYXMgdHJhZGl0aW9uYWxseSBiZWVuIGJvdW5kIHRvXG5zZXF1ZW5jZXM7IGFuIG9iamVjdCBpcyBhIG1lbWJlciBvZiBhIGNvbGxlY3Rpb24gaWYgdGhlIGNvbGxlY3Rpb24gaXNcbmEgc2VxdWVuY2UgYW5kIGNvbnRhaW5zIGFuIGVsZW1lbnQgZXF1YWwgdG8gdGhhdCBvYmplY3QuICBIb3dldmVyLCBpdFxubWFrZSBzZW5zZSBmb3IgbWFueSBvdGhlciBvYmplY3QgdHlwZXMgdG8gc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3RzXG53aXRob3V0IGJlaW5nIGEgc2VxdWVuY2UuICBJbiBwYXJ0aWN1bGFyLCBkaWN0aW9uYXJpZXMgKGZvciBrZXlzKSBhbmRcbnNldHMgc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3RpbmcuXG5cbkZvciB0aGUgbGlzdCBhbmQgdHVwbGUgdHlwZXMsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZVxuZXhpc3RzIGFuIGluZGV4ICppKiBzdWNoIHRoYXQgYGB4ID09IHlbaV1gYCBpcyB0cnVlLlxuXG5Gb3IgdGhlIFVuaWNvZGUgYW5kIHN0cmluZyB0eXBlcywgYGB4IGluIHlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmXG4qeCogaXMgYSBzdWJzdHJpbmcgb2YgKnkqLiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzIGBgeS5maW5kKHgpICE9IC0xYGAuXG5Ob3RlLCAqeCogYW5kICp5KiBuZWVkIG5vdCBiZSB0aGUgc2FtZSB0eXBlOyBjb25zZXF1ZW50bHksIGBgdVwnYWJcJyBpblxuXCdhYmNcJ2BgIHdpbGwgcmV0dXJuIGBgVHJ1ZWBgLiBFbXB0eSBzdHJpbmdzIGFyZSBhbHdheXMgY29uc2lkZXJlZCB0b1xuYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyIHN0cmluZywgc28gYGAiIiBpbiAiYWJjImBgIHdpbGwgcmV0dXJuXG5gYFRydWVgYC5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgKngqIHdhcyByZXF1aXJlZCB0byBiZSBhIHN0cmluZyBvZlxubGVuZ3RoIGBgMWBgLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSBgYF9fY29udGFpbnNfXygpYGAgbWV0aG9kLFxuYGB4IGluIHlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIGBgeS5fX2NvbnRhaW5zX18oeClgYCBpcyB0cnVlLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZG8gbm90IGRlZmluZSBgYF9fY29udGFpbnNfXygpYGAgYnV0IGRvXG5kZWZpbmUgYGBfX2l0ZXJfXygpYGAsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBzb21lIHZhbHVlIGBgemBgIHdpdGggYGB4XG49PSB6YGAgaXMgcHJvZHVjZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgYGB5YGAuICBJZiBhbiBleGNlcHRpb24gaXNcbnJhaXNlZCBkdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYgYGBpbmBgIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbi5cblxuTGFzdGx5LCB0aGUgb2xkLXN0eWxlIGl0ZXJhdGlvbiBwcm90b2NvbCBpcyB0cmllZDogaWYgYSBjbGFzcyBkZWZpbmVzXG5gYF9fZ2V0aXRlbV9fKClgYCwgYGB4IGluIHlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgbm9uLVxubmVnYXRpdmUgaW50ZWdlciBpbmRleCAqaSogc3VjaCB0aGF0IGBgeCA9PSB5W2ldYGAsIGFuZCBhbGwgbG93ZXJcbmludGVnZXIgaW5kaWNlcyBkbyBub3QgcmFpc2UgYGBJbmRleEVycm9yYGAgZXhjZXB0aW9uLiAoSWYgYW55IG90aGVyXG5leGNlcHRpb24gaXMgcmFpc2VkLCBpdCBpcyBhcyBpZiBgYGluYGAgcmFpc2VkIHRoYXQgZXhjZXB0aW9uKS5cblxuVGhlIG9wZXJhdG9yIGBgbm90IGluYGAgaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgdmFsdWUgb2ZcbmBgaW5gYC5cblxuVGhlIG9wZXJhdG9ycyBgYGlzYGAgYW5kIGBgaXMgbm90YGAgdGVzdCBmb3Igb2JqZWN0IGlkZW50aXR5OiBgYHggaXNcbnlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBhbmQgKnkqIGFyZSB0aGUgc2FtZSBvYmplY3QuICBgYHggaXNcbm5vdCB5YGAgeWllbGRzIHRoZSBpbnZlcnNlIHRydXRoIHZhbHVlLiBbN11cbicsCisgJ2NvbXBvdW5kJzogJ1xuQ29tcG91bmQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKlxuXG5Db21wb3VuZCBzdGF0ZW1lbnRzIGNvbnRhaW4gKGdyb3VwcyBvZikgb3RoZXIgc3RhdGVtZW50czsgdGhleSBhZmZlY3Rcbm9yIGNvbnRyb2wgdGhlIGV4ZWN1dGlvbiBvZiB0aG9zZSBvdGhlciBzdGF0ZW1lbnRzIGluIHNvbWUgd2F5LiAgSW5cbmdlbmVyYWwsIGNvbXBvdW5kIHN0YXRlbWVudHMgc3BhbiBtdWx0aXBsZSBsaW5lcywgYWx0aG91Z2ggaW4gc2ltcGxlXG5pbmNhcm5hdGlvbnMgYSB3aG9sZSBjb21wb3VuZCBzdGF0ZW1lbnQgbWF5IGJlIGNvbnRhaW5lZCBpbiBvbmUgbGluZS5cblxuVGhlIGBgaWZgYCwgYGB3aGlsZWBgIGFuZCBgYGZvcmBgIHN0YXRlbWVudHMgaW1wbGVtZW50IHRyYWRpdGlvbmFsXG5jb250cm9sIGZsb3cgY29uc3RydWN0cy4gIGBgdHJ5YGAgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3JcbmNsZWFudXAgY29kZSBmb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzLiAgRnVuY3Rpb24gYW5kIGNsYXNzXG5kZWZpbml0aW9ucyBhcmUgYWxzbyBzeW50YWN0aWNhbGx5IGNvbXBvdW5kIHN0YXRlbWVudHMuXG5cbkNvbXBvdW5kIHN0YXRlbWVudHMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSBcJ2NsYXVzZXMuXCcgIEEgY2xhdXNlXG5jb25zaXN0cyBvZiBhIGhlYWRlciBhbmQgYSBcJ3N1aXRlLlwnICBUaGUgY2xhdXNlIGhlYWRlcnMgb2YgYVxucGFydGljdWxhciBjb21wb3VuZCBzdGF0ZW1lbnQgYXJlIGFsbCBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbiBsZXZlbC5cbkVhY2ggY2xhdXNlIGhlYWRlciBiZWdpbnMgd2l0aCBhIHVuaXF1ZWx5IGlkZW50aWZ5aW5nIGtleXdvcmQgYW5kIGVuZHNcbndpdGggYSBjb2xvbi4gIEEgc3VpdGUgaXMgYSBncm91cCBvZiBzdGF0ZW1lbnRzIGNvbnRyb2xsZWQgYnkgYVxuY2xhdXNlLiAgQSBzdWl0ZSBjYW4gYmUgb25lIG9yIG1vcmUgc2VtaWNvbG9uLXNlcGFyYXRlZCBzaW1wbGVcbnN0YXRlbWVudHMgb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgaGVhZGVyLCBmb2xsb3dpbmcgdGhlIGhlYWRlclwnc1xuY29sb24sIG9yIGl0IGNhbiBiZSBvbmUgb3IgbW9yZSBpbmRlbnRlZCBzdGF0ZW1lbnRzIG9uIHN1YnNlcXVlbnRcbmxpbmVzLiAgT25seSB0aGUgbGF0dGVyIGZvcm0gb2Ygc3VpdGUgY2FuIGNvbnRhaW4gbmVzdGVkIGNvbXBvdW5kXG5zdGF0ZW1lbnRzOyB0aGUgZm9sbG93aW5nIGlzIGlsbGVnYWwsIG1vc3RseSBiZWNhdXNlIGl0IHdvdWxkblwndCBiZVxuY2xlYXIgdG8gd2hpY2ggYGBpZmBgIGNsYXVzZSBhIGZvbGxvd2luZyBgYGVsc2VgYCBjbGF1c2Ugd291bGQgYmVsb25nOlxuXG4gICBpZiB0ZXN0MTogaWYgdGVzdDI6IHByaW50IHhcblxuQWxzbyBub3RlIHRoYXQgdGhlIHNlbWljb2xvbiBiaW5kcyB0aWdodGVyIHRoYW4gdGhlIGNvbG9uIGluIHRoaXNcbmNvbnRleHQsIHNvIHRoYXQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCBlaXRoZXIgYWxsIG9yIG5vbmUgb2YgdGhlXG5gYHByaW50YGAgc3RhdGVtZW50cyBhcmUgZXhlY3V0ZWQ6XG5cbiAgIGlmIHggPCB5IDwgejogcHJpbnQgeDsgcHJpbnQgeTsgcHJpbnQgelxuXG5TdW1tYXJpemluZzpcblxuICAgY29tcG91bmRfc3RtdCA6Oj0gaWZfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCB3aGlsZV9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IGZvcl9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHRyeV9zdG10XG4gICAgICAgICAgICAgICAgICAgICB8IHdpdGhfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBmdW5jZGVmXG4gICAgICAgICAgICAgICAgICAgICB8IGNsYXNzZGVmXG4gICAgICAgICAgICAgICAgICAgICB8IGRlY29yYXRlZFxuICAgc3VpdGUgICAgICAgICA6Oj0gc3RtdF9saXN0IE5FV0xJTkUgfCBORVdMSU5FIElOREVOVCBzdGF0ZW1lbnQrIERFREVOVFxuICAgc3RhdGVtZW50ICAgICA6Oj0gc3RtdF9saXN0IE5FV0xJTkUgfCBjb21wb3VuZF9zdG10XG4gICBzdG10X2xpc3QgICAgIDo6PSBzaW1wbGVfc3RtdCAoIjsiIHNpbXBsZV9zdG10KSogWyI7Il1cblxuTm90ZSB0aGF0IHN0YXRlbWVudHMgYWx3YXlzIGVuZCBpbiBhIGBgTkVXTElORWBgIHBvc3NpYmx5IGZvbGxvd2VkIGJ5XG5hIGBgREVERU5UYGAuIEFsc28gbm90ZSB0aGF0IG9wdGlvbmFsIGNvbnRpbnVhdGlvbiBjbGF1c2VzIGFsd2F5c1xuYmVnaW4gd2l0aCBhIGtleXdvcmQgdGhhdCBjYW5ub3Qgc3RhcnQgYSBzdGF0ZW1lbnQsIHRodXMgdGhlcmUgYXJlIG5vXG5hbWJpZ3VpdGllcyAodGhlIFwnZGFuZ2xpbmcgYGBlbHNlYGBcJyBwcm9ibGVtIGlzIHNvbHZlZCBpbiBQeXRob24gYnlcbnJlcXVpcmluZyBuZXN0ZWQgYGBpZmBgIHN0YXRlbWVudHMgdG8gYmUgaW5kZW50ZWQpLlxuXG5UaGUgZm9ybWF0dGluZyBvZiB0aGUgZ3JhbW1hciBydWxlcyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIHBsYWNlc1xuZWFjaCBjbGF1c2Ugb24gYSBzZXBhcmF0ZSBsaW5lIGZvciBjbGFyaXR5LlxuXG5cblRoZSBgYGlmYGAgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgYGBpZmBgIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG5cbiAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4gICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zIG9uZVxuYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiAqQm9vbGVhbiBvcGVyYXRpb25zKlxuZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4oYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlIGBgaWZgYCBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbklmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgYGBlbHNlYGAgY2xhdXNlLCBpZlxucHJlc2VudCwgaXMgZXhlY3V0ZWQuXG5cblxuVGhlIGBgd2hpbGVgYCBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBgYHdoaWxlYGAgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzIGFuXG5leHByZXNzaW9uIGlzIHRydWU6XG5cbiAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCBleGVjdXRlcyB0aGVcbmZpcnN0IHN1aXRlOyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSAod2hpY2ggbWF5IGJlIHRoZSBmaXJzdCB0aW1lXG5pdCBpcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgYGBlbHNlYGAgY2xhdXNlLCBpZiBwcmVzZW50LCBpc1xuZXhlY3V0ZWQgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuXG5cbkEgYGBicmVha2BgIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxud2l0aG91dCBleGVjdXRpbmcgdGhlIGBgZWxzZWBgIGNsYXVzZVwncyBzdWl0ZS4gIEEgYGBjb250aW51ZWBgXG5zdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmRcbmdvZXMgYmFjayB0byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuXG5cblRoZSBgYGZvcmBgIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBgYGZvcmBgIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYVxuc2VxdWVuY2UgKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDpcblxuICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgZXhwcmVzc2lvbl9saXN0ICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGV2YWx1YXRlZCBvbmNlOyBpdCBzaG91bGQgeWllbGQgYW4gaXRlcmFibGVcbm9iamVjdC4gIEFuIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZSByZXN1bHQgb2YgdGhlXG5gYGV4cHJlc3Npb25fbGlzdGBgLiAgVGhlIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgb25jZSBmb3IgZWFjaCBpdGVtXG5wcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZSBvcmRlciBvZiBhc2NlbmRpbmcgaW5kaWNlcy4gIEVhY2hcbml0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzXG5mb3IgYXNzaWdubWVudHMsIGFuZCB0aGVuIHRoZSBzdWl0ZSBpcyBleGVjdXRlZC4gIFdoZW4gdGhlIGl0ZW1zIGFyZVxuZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSksIHRoZSBzdWl0ZVxuaW4gdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbG9vcFxudGVybWluYXRlcy5cblxuQSBgYGJyZWFrYGAgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgYGBlbHNlYGAgY2xhdXNlXCdzIHN1aXRlLiAgQSBgYGNvbnRpbnVlYGBcbnN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZFxuY29udGludWVzIHdpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgYGBlbHNlYGAgY2xhdXNlIGlmIHRoZXJlIHdhc1xubm8gbmV4dCBpdGVtLlxuXG5UaGUgc3VpdGUgbWF5IGFzc2lnbiB0byB0aGUgdmFyaWFibGUocykgaW4gdGhlIHRhcmdldCBsaXN0OyB0aGlzIGRvZXNcbm5vdCBhZmZlY3QgdGhlIG5leHQgaXRlbSBhc3NpZ25lZCB0byBpdC5cblxuVGhlIHRhcmdldCBsaXN0IGlzIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsIGJ1dCBpZiB0aGVcbnNlcXVlbmNlIGlzIGVtcHR5LCBpdCB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYXQgYWxsIGJ5IHRoZVxubG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYHJhbmdlKClgYCByZXR1cm5zIGEgc2VxdWVuY2Ugb2ZcbmludGVnZXJzIHN1aXRhYmxlIHRvIGVtdWxhdGUgdGhlIGVmZmVjdCBvZiBQYXNjYWxcJ3MgYGBmb3IgaSA6PSBhIHRvIGJcbmRvYGA7IGUuZy4sIGBgcmFuZ2UoMylgYCByZXR1cm5zIHRoZSBsaXN0IGBgWzAsIDEsIDJdYGAuXG5cbk5vdGU6IFRoZXJlIGlzIGEgc3VidGxldHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlIGxvb3BcbiAgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gQW4gaW50ZXJuYWxcbiAgY291bnRlciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggaXRlbSBpcyB1c2VkIG5leHQsIGFuZCB0aGlzXG4gIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgaGFzIHJlYWNoZWQgdGhlXG4gIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGVcbiAgc3VpdGUgZGVsZXRlcyB0aGUgY3VycmVudCAob3IgYSBwcmV2aW91cykgaXRlbSBmcm9tIHRoZSBzZXF1ZW5jZSxcbiAgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlIGluZGV4IG9mIHRoZVxuICBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCBpZiB0aGVcbiAgc3VpdGUgaW5zZXJ0cyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSBiZWZvcmUgdGhlIGN1cnJlbnQgaXRlbSwgdGhlXG4gIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wLlxuICBUaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYVxuICB0ZW1wb3JhcnkgY29weSB1c2luZyBhIHNsaWNlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgZS5nLixcblxuICAgICBmb3IgeCBpbiBhWzpdOlxuICAgICAgICAgaWYgeCA8IDA6IGEucmVtb3ZlKHgpXG5cblxuVGhlIGBgdHJ5YGAgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGBgdHJ5YGAgc3RhdGVtZW50IHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yIGNsZWFudXAgY29kZVxuZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50czpcblxuICAgdHJ5X3N0bXQgIDo6PSB0cnkxX3N0bXQgfCB0cnkyX3N0bXRcbiAgIHRyeTFfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICgiZXhjZXB0IiBbZXhwcmVzc2lvbiBbKCJhcyIgfCAiLCIpIHRhcmdldF1dICI6IiBzdWl0ZSkrXG4gICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuICAgICAgICAgICAgICAgICBbImZpbmFsbHkiICI6IiBzdWl0ZV1cbiAgIHRyeTJfc3RtdCA6Oj0gInRyeSIgIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICJmaW5hbGx5IiAiOiIgc3VpdGVcblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uLFxuYGB0cnlgYC4uLmBgZXhjZXB0YGAuLi5gYGZpbmFsbHlgYCBkaWQgbm90IHdvcmsuIGBgdHJ5YGAuLi5gYGV4Y2VwdGBgXG5oYWQgdG8gYmUgbmVzdGVkIGluIGBgdHJ5YGAuLi5gYGZpbmFsbHlgYC5cblxuVGhlIGBgZXhjZXB0YGAgY2xhdXNlKHMpIHNwZWNpZnkgb25lIG9yIG1vcmUgZXhjZXB0aW9uIGhhbmRsZXJzLiBXaGVuXG5ubyBleGNlcHRpb24gb2NjdXJzIGluIHRoZSBgYHRyeWBgIGNsYXVzZSwgbm8gZXhjZXB0aW9uIGhhbmRsZXIgaXNcbmV4ZWN1dGVkLiBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIGBgdHJ5YGAgc3VpdGUsIGEgc2VhcmNoIGZvclxuYW4gZXhjZXB0aW9uIGhhbmRsZXIgaXMgc3RhcnRlZC4gIFRoaXMgc2VhcmNoIGluc3BlY3RzIHRoZSBleGNlcHRcbmNsYXVzZXMgaW4gdHVybiB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZSBleGNlcHRpb24uICBBblxuZXhwcmVzc2lvbi1sZXNzIGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIG11c3QgYmUgbGFzdDsgaXQgbWF0Y2hlc1xuYW55IGV4Y2VwdGlvbi4gIEZvciBhbiBleGNlcHQgY2xhdXNlIHdpdGggYW4gZXhwcmVzc2lvbiwgdGhhdFxuZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQsIGFuZCB0aGUgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiBpZiB0aGVcbnJlc3VsdGluZyBvYmplY3QgaXMgImNvbXBhdGlibGUiIHdpdGggdGhlIGV4Y2VwdGlvbi4gIEFuIG9iamVjdCBpc1xuY29tcGF0aWJsZSB3aXRoIGFuIGV4Y2VwdGlvbiBpZiBpdCBpcyB0aGUgY2xhc3Mgb3IgYSBiYXNlIGNsYXNzIG9mIHRoZVxuZXhjZXB0aW9uIG9iamVjdCwgb3IgYSB0dXBsZSBjb250YWluaW5nIGFuIGl0ZW0gY29tcGF0aWJsZSB3aXRoIHRoZVxuZXhjZXB0aW9uLlxuXG5JZiBubyBleGNlcHQgY2xhdXNlIG1hdGNoZXMgdGhlIGV4Y2VwdGlvbiwgdGhlIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNvbnRpbnVlcyBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb24gdGhlIGludm9jYXRpb24gc3RhY2suXG5bMV1cblxuSWYgdGhlIGV2YWx1YXRpb24gb2YgYW4gZXhwcmVzc2lvbiBpbiB0aGUgaGVhZGVyIG9mIGFuIGV4Y2VwdCBjbGF1c2VcbnJhaXNlcyBhbiBleGNlcHRpb24sIHRoZSBvcmlnaW5hbCBzZWFyY2ggZm9yIGEgaGFuZGxlciBpcyBjYW5jZWxlZCBhbmRcbmEgc2VhcmNoIHN0YXJ0cyBmb3IgdGhlIG5ldyBleGNlcHRpb24gaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uXG50aGUgY2FsbCBzdGFjayAoaXQgaXMgdHJlYXRlZCBhcyBpZiB0aGUgZW50aXJlIGBgdHJ5YGAgc3RhdGVtZW50XG5yYWlzZWQgdGhlIGV4Y2VwdGlvbikuXG5cbldoZW4gYSBtYXRjaGluZyBleGNlcHQgY2xhdXNlIGlzIGZvdW5kLCB0aGUgZXhjZXB0aW9uIGlzIGFzc2lnbmVkIHRvXG50aGUgdGFyZ2V0IHNwZWNpZmllZCBpbiB0aGF0IGV4Y2VwdCBjbGF1c2UsIGlmIHByZXNlbnQsIGFuZCB0aGUgZXhjZXB0XG5jbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQuICBBbGwgZXhjZXB0IGNsYXVzZXMgbXVzdCBoYXZlIGFuXG5leGVjdXRhYmxlIGJsb2NrLiAgV2hlbiB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgaXMgcmVhY2hlZCwgZXhlY3V0aW9uXG5jb250aW51ZXMgbm9ybWFsbHkgYWZ0ZXIgdGhlIGVudGlyZSB0cnkgc3RhdGVtZW50LiAgKFRoaXMgbWVhbnMgdGhhdFxuaWYgdHdvIG5lc3RlZCBoYW5kbGVycyBleGlzdCBmb3IgdGhlIHNhbWUgZXhjZXB0aW9uLCBhbmQgdGhlIGV4Y2VwdGlvblxub2NjdXJzIGluIHRoZSB0cnkgY2xhdXNlIG9mIHRoZSBpbm5lciBoYW5kbGVyLCB0aGUgb3V0ZXIgaGFuZGxlciB3aWxsXG5ub3QgaGFuZGxlIHRoZSBleGNlcHRpb24uKVxuXG5CZWZvcmUgYW4gZXhjZXB0IGNsYXVzZVwncyBzdWl0ZSBpcyBleGVjdXRlZCwgZGV0YWlscyBhYm91dCB0aGVcbmV4Y2VwdGlvbiBhcmUgYXNzaWduZWQgdG8gdGhyZWUgdmFyaWFibGVzIGluIHRoZSBgYHN5c2BgIG1vZHVsZTpcbmBgc3lzLmV4Y190eXBlYGAgcmVjZWl2ZXMgdGhlIG9iamVjdCBpZGVudGlmeWluZyB0aGUgZXhjZXB0aW9uO1xuYGBzeXMuZXhjX3ZhbHVlYGAgcmVjZWl2ZXMgdGhlIGV4Y2VwdGlvblwncyBwYXJhbWV0ZXI7XG5gYHN5cy5leGNfdHJhY2ViYWNrYGAgcmVjZWl2ZXMgYSB0cmFjZWJhY2sgb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlXG5zdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopIGlkZW50aWZ5aW5nIHRoZSBwb2ludCBpbiB0aGUgcHJvZ3JhbSB3aGVyZVxudGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4gVGhlc2UgZGV0YWlscyBhcmUgYWxzbyBhdmFpbGFibGUgdGhyb3VnaCB0aGVcbmBgc3lzLmV4Y19pbmZvKClgYCBmdW5jdGlvbiwgd2hpY2ggcmV0dXJucyBhIHR1cGxlIGBgKGV4Y190eXBlLFxuZXhjX3ZhbHVlLCBleGNfdHJhY2ViYWNrKWBgLiAgVXNlIG9mIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlcyBpc1xuZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGlzIGZ1bmN0aW9uLCBzaW5jZSB0aGVpciB1c2UgaXMgdW5zYWZlIGluIGFcbnRocmVhZGVkIHByb2dyYW0uICBBcyBvZiBQeXRob24gMS41LCB0aGUgdmFyaWFibGVzIGFyZSByZXN0b3JlZCB0b1xudGhlaXIgcHJldmlvdXMgdmFsdWVzIChiZWZvcmUgdGhlIGNhbGwpIHdoZW4gcmV0dXJuaW5nIGZyb20gYSBmdW5jdGlvblxudGhhdCBoYW5kbGVkIGFuIGV4Y2VwdGlvbi5cblxuVGhlIG9wdGlvbmFsIGBgZWxzZWBgIGNsYXVzZSBpcyBleGVjdXRlZCBpZiBhbmQgd2hlbiBjb250cm9sIGZsb3dzIG9mZlxudGhlIGVuZCBvZiB0aGUgYGB0cnlgYCBjbGF1c2UuIFsyXSBFeGNlcHRpb25zIGluIHRoZSBgYGVsc2VgYCBjbGF1c2VcbmFyZSBub3QgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIGBgZXhjZXB0YGAgY2xhdXNlcy5cblxuSWYgYGBmaW5hbGx5YGAgaXMgcHJlc2VudCwgaXQgc3BlY2lmaWVzIGEgXCdjbGVhbnVwXCcgaGFuZGxlci4gIFRoZVxuYGB0cnlgYCBjbGF1c2UgaXMgZXhlY3V0ZWQsIGluY2x1ZGluZyBhbnkgYGBleGNlcHRgYCBhbmQgYGBlbHNlYGBcbmNsYXVzZXMuICBJZiBhbiBleGNlcHRpb24gb2NjdXJzIGluIGFueSBvZiB0aGUgY2xhdXNlcyBhbmQgaXMgbm90XG5oYW5kbGVkLCB0aGUgZXhjZXB0aW9uIGlzIHRlbXBvcmFyaWx5IHNhdmVkLiBUaGUgYGBmaW5hbGx5YGAgY2xhdXNlIGlzXG5leGVjdXRlZC4gIElmIHRoZXJlIGlzIGEgc2F2ZWQgZXhjZXB0aW9uLCBpdCBpcyByZS1yYWlzZWQgYXQgdGhlIGVuZFxub2YgdGhlIGBgZmluYWxseWBgIGNsYXVzZS4gSWYgdGhlIGBgZmluYWxseWBgIGNsYXVzZSByYWlzZXMgYW5vdGhlclxuZXhjZXB0aW9uIG9yIGV4ZWN1dGVzIGEgYGByZXR1cm5gYCBvciBgYGJyZWFrYGAgc3RhdGVtZW50LCB0aGUgc2F2ZWRcbmV4Y2VwdGlvbiBpcyBkaXNjYXJkZWQ6XG5cbiAgIGRlZiBmKCk6XG4gICAgICAgdHJ5OlxuICAgICAgICAgICAxLzBcbiAgICAgICBmaW5hbGx5OlxuICAgICAgICAgICByZXR1cm4gNDJcblxuICAgPj4+IGYoKVxuICAgNDJcblxuVGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtIGR1cmluZ1xuZXhlY3V0aW9uIG9mIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UuXG5cbldoZW4gYSBgYHJldHVybmBgLCBgYGJyZWFrYGAgb3IgYGBjb250aW51ZWBgIHN0YXRlbWVudCBpcyBleGVjdXRlZCBpblxudGhlIGBgdHJ5YGAgc3VpdGUgb2YgYSBgYHRyeWBgLi4uYGBmaW5hbGx5YGAgc3RhdGVtZW50LCB0aGVcbmBgZmluYWxseWBgIGNsYXVzZSBpcyBhbHNvIGV4ZWN1dGVkIFwnb24gdGhlIHdheSBvdXQuXCcgQSBgYGNvbnRpbnVlYGBcbnN0YXRlbWVudCBpcyBpbGxlZ2FsIGluIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UuIChUaGUgcmVhc29uIGlzIGFcbnByb2JsZW0gd2l0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAtLS0gdGhpcyByZXN0cmljdGlvbiBtYXkgYmVcbmxpZnRlZCBpbiB0aGUgZnV0dXJlKS5cblxuQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4qRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBvbiB1c2luZyB0aGUgYGByYWlzZWBgIHN0YXRlbWVudCB0b1xuZ2VuZXJhdGUgZXhjZXB0aW9ucyBtYXkgYmUgZm91bmQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouXG5cblxuVGhlIGBgd2l0aGBgIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PT09PVxuXG5OZXcgaW4gdmVyc2lvbiAyLjUuXG5cblRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayB3aXRoXG5tZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uICpXaXRoIFN0YXRlbWVudFxuQ29udGV4dCBNYW5hZ2VycyopLiBUaGlzIGFsbG93cyBjb21tb25cbmBgdHJ5YGAuLi5gYGV4Y2VwdGBgLi4uYGBmaW5hbGx5YGAgdXNhZ2UgcGF0dGVybnMgdG8gYmUgZW5jYXBzdWxhdGVkXG5mb3IgY29udmVuaWVudCByZXVzZS5cblxuICAgd2l0aF9zdG10IDo6PSAid2l0aCIgd2l0aF9pdGVtICgiLCIgd2l0aF9pdGVtKSogIjoiIHN1aXRlXG4gICB3aXRoX2l0ZW0gOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XVxuXG5UaGUgZXhlY3V0aW9uIG9mIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgd2l0aCBvbmUgIml0ZW0iIHByb2NlZWRzIGFzXG5mb2xsb3dzOlxuXG4xLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgYGB3aXRoX2l0ZW1gYClcbiAgIGlzIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuXG5cbjIuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgYGBfX2V4aXRfXygpYGAgaXMgbG9hZGVkIGZvciBsYXRlciB1c2UuXG5cbjMuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgYGBfX2VudGVyX18oKWBgIG1ldGhvZCBpcyBpbnZva2VkLlxuXG40LiBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlIGBgd2l0aGBgIHN0YXRlbWVudCwgdGhlIHJldHVyblxuICAgdmFsdWUgZnJvbSBgYF9fZW50ZXJfXygpYGAgaXMgYXNzaWduZWQgdG8gaXQuXG5cbiAgIE5vdGU6IFRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSBgYF9fZW50ZXJfXygpYGBcbiAgICAgbWV0aG9kIHJldHVybnMgd2l0aG91dCBhbiBlcnJvciwgdGhlbiBgYF9fZXhpdF9fKClgYCB3aWxsIGFsd2F5c1xuICAgICBiZSBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlXG4gICAgIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYW4gZXJyb3Igb2NjdXJyaW5nXG4gICAgIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDYgYmVsb3cuXG5cbjUuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC5cblxuNi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyBgYF9fZXhpdF9fKClgYCBtZXRob2QgaXMgaW52b2tlZC4gSWYgYW5cbiAgIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmRcbiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBgYF9fZXhpdF9fKClgYC4gT3RoZXJ3aXNlLFxuICAgdGhyZWUgYGBOb25lYGAgYXJndW1lbnRzIGFyZSBzdXBwbGllZC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gdmFsdWVcbiAgIGZyb20gdGhlIGBgX19leGl0X18oKWBgIG1ldGhvZCB3YXMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXNcbiAgIHJlcmFpc2VkLiBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzXG4gICBzdXBwcmVzc2VkLCBhbmQgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nXG4gICB0aGUgYGB3aXRoYGAgc3RhdGVtZW50LlxuXG4gICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGV4Y2VwdGlvbiwgdGhlXG4gICByZXR1cm4gdmFsdWUgZnJvbSBgYF9fZXhpdF9fKClgYCBpcyBpZ25vcmVkLCBhbmQgZXhlY3V0aW9uIHByb2NlZWRzXG4gICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLlxuXG5XaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZlxubXVsdGlwbGUgYGB3aXRoYGAgc3RhdGVtZW50cyB3ZXJlIG5lc3RlZDpcblxuICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6XG4gICAgICAgc3VpdGVcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICB3aXRoIEEoKSBhcyBhOlxuICAgICAgIHdpdGggQigpIGFzIGI6XG4gICAgICAgICAgIHN1aXRlXG5cbk5vdGU6IEluIFB5dGhvbiAyLjUsIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgaXMgb25seSBhbGxvd2VkIHdoZW4gdGhlXG4gIGBgd2l0aF9zdGF0ZW1lbnRgYCBmZWF0dXJlIGhhcyBiZWVuIGVuYWJsZWQuICBJdCBpcyBhbHdheXMgZW5hYmxlZFxuICBpbiBQeXRob24gMi42LlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLlxuXG5TZWUgYWxzbzpcblxuICAgKipQRVAgMDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbiAgICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob25cbiAgICAgIGBgd2l0aGBgIHN0YXRlbWVudC5cblxuXG5GdW5jdGlvbiBkZWZpbml0aW9uc1xuPT09PT09PT09PT09PT09PT09PT1cblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IChzZWVcbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopOlxuXG4gICBkZWNvcmF0ZWQgICAgICA6Oj0gZGVjb3JhdG9ycyAoY2xhc3NkZWYgfCBmdW5jZGVmKVxuICAgZGVjb3JhdG9ycyAgICAgOjo9IGRlY29yYXRvcitcbiAgIGRlY29yYXRvciAgICAgIDo6PSAiQCIgZG90dGVkX25hbWUgWyIoIiBbYXJndW1lbnRfbGlzdCBbIiwiXV0gIikiXSBORVdMSU5FXG4gICBmdW5jZGVmICAgICAgICA6Oj0gImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiICI6IiBzdWl0ZVxuICAgZG90dGVkX25hbWUgICAgOjo9IGlkZW50aWZpZXIgKCIuIiBpZGVudGlmaWVyKSpcbiAgIHBhcmFtZXRlcl9saXN0IDo6PSAoZGVmcGFyYW1ldGVyICIsIikqXG4gICAgICAgICAgICAgICAgICAgICAgKCAgIioiIGlkZW50aWZpZXIgWyIsIiAiKioiIGlkZW50aWZpZXJdXG4gICAgICAgICAgICAgICAgICAgICAgfCAiKioiIGlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAgICAgICB8IGRlZnBhcmFtZXRlciBbIiwiXSApXG4gICBkZWZwYXJhbWV0ZXIgICA6Oj0gcGFyYW1ldGVyIFsiPSIgZXhwcmVzc2lvbl1cbiAgIHN1Ymxpc3QgICAgICAgIDo6PSBwYXJhbWV0ZXIgKCIsIiBwYXJhbWV0ZXIpKiBbIiwiXVxuICAgcGFyYW1ldGVyICAgICAgOjo9IGlkZW50aWZpZXIgfCAiKCIgc3VibGlzdCAiKSJcbiAgIGZ1bmNuYW1lICAgICAgIDo6PSBpZGVudGlmaWVyXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0cyBleGVjdXRpb24gYmluZHNcbnRoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZSB0byBhIGZ1bmN0aW9uIG9iamVjdFxuKGEgd3JhcHBlciBhcm91bmQgdGhlIGV4ZWN1dGFibGUgY29kZSBmb3IgdGhlIGZ1bmN0aW9uKS4gIFRoaXNcbmZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBnbG9iYWwgbmFtZXNwYWNlXG5hcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB0byBiZSB1c2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC5cblxuVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gZG9lcyBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gYm9keTsgdGhpcyBnZXRzXG5leGVjdXRlZCBvbmx5IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gWzNdXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3IgbW9yZSAqZGVjb3JhdG9yKlxuZXhwcmVzc2lvbnMuIERlY29yYXRvciBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzXG5kZWZpbmVkLCBpbiB0aGUgc2NvcGUgdGhhdCBjb250YWlucyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoZVxucmVzdWx0IG11c3QgYmUgYSBjYWxsYWJsZSwgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSBmdW5jdGlvbiBvYmplY3RcbmFzIHRoZSBvbmx5IGFyZ3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYm91bmQgdG8gdGhlIGZ1bmN0aW9uIG5hbWVcbmluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIE11bHRpcGxlIGRlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW5cbm5lc3RlZCBmYXNoaW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlOlxuXG4gICBAZjEoYXJnKVxuICAgQGYyXG4gICBkZWYgZnVuYygpOiBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG86XG5cbiAgIGRlZiBmdW5jKCk6IHBhc3NcbiAgIGZ1bmMgPSBmMShhcmcpKGYyKGZ1bmMpKVxuXG5XaGVuIG9uZSBvciBtb3JlIHRvcC1sZXZlbCAqcGFyYW1ldGVycyogaGF2ZSB0aGUgZm9ybSAqcGFyYW1ldGVyKlxuYGA9YGAgKmV4cHJlc3Npb24qLCB0aGUgZnVuY3Rpb24gaXMgc2FpZCB0byBoYXZlICJkZWZhdWx0IHBhcmFtZXRlclxudmFsdWVzLiIgIEZvciBhIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmdcbiphcmd1bWVudCogbWF5IGJlIG9taXR0ZWQgZnJvbSBhIGNhbGwsIGluIHdoaWNoIGNhc2UgdGhlIHBhcmFtZXRlclwnc1xuZGVmYXVsdCB2YWx1ZSBpcyBzdWJzdGl0dXRlZC4gIElmIGEgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGFsbFxuZm9sbG93aW5nIHBhcmFtZXRlcnMgbXVzdCBhbHNvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIC0tLSB0aGlzIGlzIGFcbnN5bnRhY3RpYyByZXN0cmljdGlvbiB0aGF0IGlzIG5vdCBleHByZXNzZWQgYnkgdGhlIGdyYW1tYXIuXG5cbioqRGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvblxuaXMgZXhlY3V0ZWQuKiogIFRoaXMgbWVhbnMgdGhhdCB0aGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgb25jZSwgd2hlblxudGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGF0IHRoZSBzYW1lICJwcmUtY29tcHV0ZWQiIHZhbHVlIGlzXG51c2VkIGZvciBlYWNoIGNhbGwuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgd2hlbiBhXG5kZWZhdWx0IHBhcmFtZXRlciBpcyBhIG11dGFibGUgb2JqZWN0LCBzdWNoIGFzIGEgbGlzdCBvciBhIGRpY3Rpb25hcnk6XG5pZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLiBieSBhcHBlbmRpbmcgYW4gaXRlbSB0byBhXG5saXN0KSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgaW4gZWZmZWN0IG1vZGlmaWVkLiBUaGlzIGlzIGdlbmVyYWxseSBub3RcbndoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkgYXJvdW5kIHRoaXMgIGlzIHRvIHVzZSBgYE5vbmVgYCBhcyB0aGVcbmRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yIGl0IGluIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgZS5nLjpcblxuICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOlxuICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZTpcbiAgICAgICAgICAgcGVuZ3VpbiA9IFtdXG4gICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKVxuICAgICAgIHJldHVybiBwZW5ndWluXG5cbkZ1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvblxuKkNhbGxzKi4gQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVyc1xubWVudGlvbmVkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tXG5rZXl3b3JkIGFyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtXG4iYGAqaWRlbnRpZmllcmBgIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIHR1cGxlIHJlY2VpdmluZ1xuYW55IGV4Y2VzcyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLiAgSWZcbnRoZSBmb3JtICJgYCoqaWRlbnRpZmllcmBgIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIG5ld1xuZGljdGlvbmFyeSByZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ld1xuZW1wdHkgZGljdGlvbmFyeS5cblxuSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCBib3VuZFxudG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhIGZvcm1zLFxuZGVzY3JpYmVkIGluIHNlY3Rpb24gKkxhbWJkYXMqLiAgTm90ZSB0aGF0IHRoZSBsYW1iZGEgZm9ybSBpcyBtZXJlbHkgYVxuc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gZGVmaW5pdGlvbjsgYSBmdW5jdGlvbiBkZWZpbmVkIGluXG5hICJgYGRlZmBgIiBzdGF0ZW1lbnQgY2FuIGJlIHBhc3NlZCBhcm91bmQgb3IgYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lXG5qdXN0IGxpa2UgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgbGFtYmRhIGZvcm0uICBUaGUgImBgZGVmYGAiIGZvcm0gaXNcbmFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgaXQgYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGVcbnN0YXRlbWVudHMuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEgImBgZGVmYGAiXG5mb3JtIGV4ZWN1dGVkIGluc2lkZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIGxvY2FsIGZ1bmN0aW9uXG50aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGVcbm5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZ1bmN0aW9uXG5jb250YWluaW5nIHRoZSBkZWYuICBTZWUgc2VjdGlvbiAqTmFtaW5nIGFuZCBiaW5kaW5nKiBmb3IgZGV0YWlscy5cblxuXG5DbGFzcyBkZWZpbml0aW9uc1xuPT09PT09PT09PT09PT09PT1cblxuQSBjbGFzcyBkZWZpbml0aW9uIGRlZmluZXMgYSBjbGFzcyBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmRcbnR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGNsYXNzZGVmICAgIDo6PSAiY2xhc3MiIGNsYXNzbmFtZSBbaW5oZXJpdGFuY2VdICI6IiBzdWl0ZVxuICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbZXhwcmVzc2lvbl9saXN0XSAiKSJcbiAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0IGZpcnN0IGV2YWx1YXRlcyB0aGVcbmluaGVyaXRhbmNlIGxpc3QsIGlmIHByZXNlbnQuICBFYWNoIGl0ZW0gaW4gdGhlIGluaGVyaXRhbmNlIGxpc3RcbnNob3VsZCBldmFsdWF0ZSB0byBhIGNsYXNzIG9iamVjdCBvciBjbGFzcyB0eXBlIHdoaWNoIGFsbG93c1xuc3ViY2xhc3NpbmcuICBUaGUgY2xhc3NcJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb25cbmZyYW1lIChzZWUgc2VjdGlvbiAqTmFtaW5nIGFuZCBiaW5kaW5nKiksIHVzaW5nIGEgbmV3bHkgY3JlYXRlZCBsb2NhbFxubmFtZXNwYWNlIGFuZCB0aGUgb3JpZ2luYWwgZ2xvYmFsIG5hbWVzcGFjZS4gKFVzdWFsbHksIHRoZSBzdWl0ZVxuY29udGFpbnMgb25seSBmdW5jdGlvbiBkZWZpbml0aW9ucy4pICBXaGVuIHRoZSBjbGFzc1wncyBzdWl0ZSBmaW5pc2hlc1xuZXhlY3V0aW9uLCBpdHMgZXhlY3V0aW9uIGZyYW1lIGlzIGRpc2NhcmRlZCBidXQgaXRzIGxvY2FsIG5hbWVzcGFjZSBpc1xuc2F2ZWQuIFs0XSBBIGNsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3RcbmZvciB0aGUgYmFzZSBjbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlXG5kaWN0aW9uYXJ5LiAgVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlXG5vcmlnaW5hbCBsb2NhbCBuYW1lc3BhY2UuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGFyZVxuY2xhc3MgdmFyaWFibGVzOyB0aGV5IGFyZSBzaGFyZWQgYnkgYWxsIGluc3RhbmNlcy4gIFRvIGNyZWF0ZSBpbnN0YW5jZVxudmFyaWFibGVzLCB0aGV5IGNhbiBiZSBzZXQgaW4gYSBtZXRob2Qgd2l0aCBgYHNlbGYubmFtZSA9IHZhbHVlYGAuXG5Cb3RoIGNsYXNzIGFuZCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb25cbiJgYHNlbGYubmFtZWBgIiwgYW5kIGFuIGluc3RhbmNlIHZhcmlhYmxlIGhpZGVzIGEgY2xhc3MgdmFyaWFibGUgd2l0aFxudGhlIHNhbWUgbmFtZSB3aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiBDbGFzcyB2YXJpYWJsZXMgY2FuIGJlIHVzZWRcbmFzIGRlZmF1bHRzIGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW5cbmxlYWQgdG8gdW5leHBlY3RlZCByZXN1bHRzLiAgRm9yICpuZXctc3R5bGUgY2xhc3MqZXMsIGRlc2NyaXB0b3JzIGNhblxuYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2UgdmFyaWFibGVzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uXG5kZXRhaWxzLlxuXG5DbGFzcyBkZWZpbml0aW9ucywgbGlrZSBmdW5jdGlvbiBkZWZpbml0aW9ucywgbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yXG5tb3JlICpkZWNvcmF0b3IqIGV4cHJlc3Npb25zLiAgVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3JcbmV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgZnVuY3Rpb25zLiAgVGhlIHJlc3VsdCBtdXN0IGJlIGEgY2xhc3Ncbm9iamVjdCwgd2hpY2ggaXMgdGhlbiBib3VuZCB0byB0aGUgY2xhc3MgbmFtZS5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBUaGUgZXhjZXB0aW9uIGlzIHByb3BhZ2F0ZWQgdG8gdGhlIGludm9jYXRpb24gc3RhY2sgdW5sZXNzIHRoZXJlXG4gICAgaXMgYSBgYGZpbmFsbHlgYCBjbGF1c2Ugd2hpY2ggaGFwcGVucyB0byByYWlzZSBhbm90aGVyIGV4Y2VwdGlvbi5cbiAgICBUaGF0IG5ldyBleGNlcHRpb24gY2F1c2VzIHRoZSBvbGQgb25lIHRvIGJlIGxvc3QuXG5cblsyXSBDdXJyZW50bHksIGNvbnRyb2wgImZsb3dzIG9mZiB0aGUgZW5kIiBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgYW5cbiAgICBleGNlcHRpb24gb3IgdGhlIGV4ZWN1dGlvbiBvZiBhIGBgcmV0dXJuYGAsIGBgY29udGludWVgYCwgb3JcbiAgICBgYGJyZWFrYGAgc3RhdGVtZW50LlxuXG5bM10gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgZnVuY3Rpb25cbiAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGZ1bmN0aW9uXCdzIGBgX19kb2NfX2BgIGF0dHJpYnV0ZSBhbmRcbiAgICB0aGVyZWZvcmUgdGhlIGZ1bmN0aW9uXCdzICpkb2NzdHJpbmcqLlxuXG5bNF0gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgY2xhc3NcbiAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG5hbWVzcGFjZVwncyBgYF9fZG9jX19gYCBpdGVtIGFuZFxuICAgIHRoZXJlZm9yZSB0aGUgY2xhc3NcJ3MgKmRvY3N0cmluZyouXG4nLAorICdjb250ZXh0LW1hbmFnZXJzJzogJ1xuV2l0aCBTdGF0ZW1lbnQgQ29udGV4dCBNYW5hZ2Vyc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5OZXcgaW4gdmVyc2lvbiAyLjUuXG5cbkEgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcnVudGltZSBjb250ZXh0IHRvXG5iZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhIGBgd2l0aGBgIHN0YXRlbWVudC4gVGhlIGNvbnRleHRcbm1hbmFnZXIgaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWVcbmNvbnRleHQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZVxubm9ybWFsbHkgaW52b2tlZCB1c2luZyB0aGUgYGB3aXRoYGAgc3RhdGVtZW50IChkZXNjcmliZWQgaW4gc2VjdGlvblxuKlRoZSB3aXRoIHN0YXRlbWVudCopLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGVpclxubWV0aG9kcy5cblxuVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kIHJlc3RvcmluZyB2YXJpb3VzXG5raW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkXG5maWxlcywgZXRjLlxuXG5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgKkNvbnRleHQgTWFuYWdlciBUeXBlcyouXG5cbm9iamVjdC5fX2VudGVyX18oc2VsZilcblxuICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgYGB3aXRoYGBcbiAgIHN0YXRlbWVudCB3aWxsIGJpbmQgdGhpcyBtZXRob2RcJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocylcbiAgIHNwZWNpZmllZCBpbiB0aGUgYGBhc2BgIGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuXG5cbm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spXG5cbiAgIEV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgcGFyYW1ldGVyc1xuICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZVxuICAgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgYXJndW1lbnRzIHdpbGxcbiAgIGJlIGBgTm9uZWBgLlxuXG4gICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGVcbiAgIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCBpdCBzaG91bGRcbiAgIHJldHVybiBhIHRydWUgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHByb2Nlc3NlZFxuICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuXG5cbiAgIE5vdGUgdGhhdCBgYF9fZXhpdF9fKClgYCBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgcGFzc2VkLWluXG4gICBleGNlcHRpb247IHRoaXMgaXMgdGhlIGNhbGxlclwncyByZXNwb25zaWJpbGl0eS5cblxuU2VlIGFsc286XG5cbiAgICoqUEVQIDAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4gICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uXG4gICAgICBgYHdpdGhgYCBzdGF0ZW1lbnQuXG4nLAorICdjb250aW51ZSc6ICdcblRoZSBgYGNvbnRpbnVlYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBjb250aW51ZV9zdG10IDo6PSAiY29udGludWUiXG5cbmBgY29udGludWVgYCBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhIGBgZm9yYGAgb3JcbmBgd2hpbGVgYCBsb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb24gb3JcbmBgZmluYWxseWBgIGNsYXVzZSB3aXRoaW4gdGhhdCBsb29wLiAgSXQgY29udGludWVzIHdpdGggdGhlIG5leHQgY3ljbGVcbm9mIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBsb29wLlxuXG5XaGVuIGBgY29udGludWVgYCBwYXNzZXMgY29udHJvbCBvdXQgb2YgYSBgYHRyeWBgIHN0YXRlbWVudCB3aXRoIGFcbmBgZmluYWxseWBgIGNsYXVzZSwgdGhhdCBgYGZpbmFsbHlgYCBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseVxuc3RhcnRpbmcgdGhlIG5leHQgbG9vcCBjeWNsZS5cbicsCisgJ2NvbnZlcnNpb25zJzogJ1xuQXJpdGhtZXRpYyBjb252ZXJzaW9uc1xuKioqKioqKioqKioqKioqKioqKioqKlxuXG5XaGVuIGEgZGVzY3JpcHRpb24gb2YgYW4gYXJpdGhtZXRpYyBvcGVyYXRvciBiZWxvdyB1c2VzIHRoZSBwaHJhc2VcbiJ0aGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLCIgdGhlIGFyZ3VtZW50c1xuYXJlIGNvZXJjZWQgdXNpbmcgdGhlIGNvZXJjaW9uIHJ1bGVzIGxpc3RlZCBhdCAgKkNvZXJjaW9uIHJ1bGVzKi4gIElmXG5ib3RoIGFyZ3VtZW50cyBhcmUgc3RhbmRhcmQgbnVtZXJpYyB0eXBlcywgdGhlIGZvbGxvd2luZyBjb2VyY2lvbnMgYXJlXG5hcHBsaWVkOlxuXG4qIElmIGVpdGhlciBhcmd1bWVudCBpcyBhIGNvbXBsZXggbnVtYmVyLCB0aGUgb3RoZXIgaXMgY29udmVydGVkIHRvXG4gIGNvbXBsZXg7XG5cbiogb3RoZXJ3aXNlLCBpZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIHRoZSBvdGhlclxuICBpcyBjb252ZXJ0ZWQgdG8gZmxvYXRpbmcgcG9pbnQ7XG5cbiogb3RoZXJ3aXNlLCBpZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBsb25nIGludGVnZXIsIHRoZSBvdGhlciBpc1xuICBjb252ZXJ0ZWQgdG8gbG9uZyBpbnRlZ2VyO1xuXG4qIG90aGVyd2lzZSwgYm90aCBtdXN0IGJlIHBsYWluIGludGVnZXJzIGFuZCBubyBjb252ZXJzaW9uIGlzXG4gIG5lY2Vzc2FyeS5cblxuU29tZSBhZGRpdGlvbmFsIHJ1bGVzIGFwcGx5IGZvciBjZXJ0YWluIG9wZXJhdG9ycyAoZS5nLiwgYSBzdHJpbmcgbGVmdFxuYXJndW1lbnQgdG8gdGhlIFwnJVwnIG9wZXJhdG9yKS4gRXh0ZW5zaW9ucyBjYW4gZGVmaW5lIHRoZWlyIG93blxuY29lcmNpb25zLlxuJywKKyAnY3VzdG9taXphdGlvbic6ICdcbkJhc2ljIGN1c3RvbWl6YXRpb25cbioqKioqKioqKioqKioqKioqKipcblxub2JqZWN0Ll9fbmV3X18oY2xzWywgLi4uXSlcblxuICAgQ2FsbGVkIHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBjbGFzcyAqY2xzKi4gIGBgX19uZXdfXygpYGAgaXMgYVxuICAgc3RhdGljIG1ldGhvZCAoc3BlY2lhbC1jYXNlZCBzbyB5b3UgbmVlZCBub3QgZGVjbGFyZSBpdCBhcyBzdWNoKVxuICAgdGhhdCB0YWtlcyB0aGUgY2xhc3Mgb2Ygd2hpY2ggYW4gaW5zdGFuY2Ugd2FzIHJlcXVlc3RlZCBhcyBpdHNcbiAgIGZpcnN0IGFyZ3VtZW50LiAgVGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRob3NlIHBhc3NlZCB0byB0aGVcbiAgIG9iamVjdCBjb25zdHJ1Y3RvciBleHByZXNzaW9uICh0aGUgY2FsbCB0byB0aGUgY2xhc3MpLiAgVGhlIHJldHVyblxuICAgdmFsdWUgb2YgYGBfX25ld19fKClgYCBzaG91bGQgYmUgdGhlIG5ldyBvYmplY3QgaW5zdGFuY2UgKHVzdWFsbHlcbiAgIGFuIGluc3RhbmNlIG9mICpjbHMqKS5cblxuICAgVHlwaWNhbCBpbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjbGFzcyBieVxuICAgaW52b2tpbmcgdGhlIHN1cGVyY2xhc3NcJ3MgYGBfX25ld19fKClgYCBtZXRob2QgdXNpbmdcbiAgIGBgc3VwZXIoY3VycmVudGNsYXNzLCBjbHMpLl9fbmV3X18oY2xzWywgLi4uXSlgYCB3aXRoIGFwcHJvcHJpYXRlXG4gICBhcmd1bWVudHMgYW5kIHRoZW4gbW9kaWZ5aW5nIHRoZSBuZXdseS1jcmVhdGVkIGluc3RhbmNlIGFzXG4gICBuZWNlc3NhcnkgYmVmb3JlIHJldHVybmluZyBpdC5cblxuICAgSWYgYGBfX25ld19fKClgYCByZXR1cm5zIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzIGBgX19pbml0X18oKWBgIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgbGlrZVxuICAgYGBfX2luaXRfXyhzZWxmWywgLi4uXSlgYCwgd2hlcmUgKnNlbGYqIGlzIHRoZSBuZXcgaW5zdGFuY2UgYW5kIHRoZVxuICAgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgd2VyZSBwYXNzZWQgdG8gYGBfX25ld19fKClgYC5cblxuICAgSWYgYGBfX25ld19fKClgYCBkb2VzIG5vdCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ld1xuICAgaW5zdGFuY2VcJ3MgYGBfX2luaXRfXygpYGAgbWV0aG9kIHdpbGwgbm90IGJlIGludm9rZWQuXG5cbiAgIGBgX19uZXdfXygpYGAgaXMgaW50ZW5kZWQgbWFpbmx5IHRvIGFsbG93IHN1YmNsYXNzZXMgb2YgaW1tdXRhYmxlXG4gICB0eXBlcyAobGlrZSBpbnQsIHN0ciwgb3IgdHVwbGUpIHRvIGN1c3RvbWl6ZSBpbnN0YW5jZSBjcmVhdGlvbi4gIEl0XG4gICBpcyBhbHNvIGNvbW1vbmx5IG92ZXJyaWRkZW4gaW4gY3VzdG9tIG1ldGFjbGFzc2VzIGluIG9yZGVyIHRvXG4gICBjdXN0b21pemUgY2xhc3MgY3JlYXRpb24uXG5cbm9iamVjdC5fX2luaXRfXyhzZWxmWywgLi4uXSlcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGNyZWF0ZWQuICBUaGUgYXJndW1lbnRzIGFyZSB0aG9zZVxuICAgcGFzc2VkIHRvIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBleHByZXNzaW9uLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhblxuICAgYGBfX2luaXRfXygpYGAgbWV0aG9kLCB0aGUgZGVyaXZlZCBjbGFzc1wncyBgYF9faW5pdF9fKClgYCBtZXRob2QsXG4gICBpZiBhbnksIG11c3QgZXhwbGljaXRseSBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgaW5pdGlhbGl6YXRpb24gb2ZcbiAgIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlIGluc3RhbmNlOyBmb3IgZXhhbXBsZTpcbiAgIGBgQmFzZUNsYXNzLl9faW5pdF9fKHNlbGYsIFthcmdzLi4uXSlgYC4gIEFzIGEgc3BlY2lhbCBjb25zdHJhaW50XG4gICBvbiBjb25zdHJ1Y3RvcnMsIG5vIHZhbHVlIG1heSBiZSByZXR1cm5lZDsgZG9pbmcgc28gd2lsbCBjYXVzZSBhXG4gICBgYFR5cGVFcnJvcmBgIHRvIGJlIHJhaXNlZCBhdCBydW50aW1lLlxuXG5vYmplY3QuX19kZWxfXyhzZWxmKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgYWJvdXQgdG8gYmUgZGVzdHJveWVkLiAgVGhpcyBpcyBhbHNvXG4gICBjYWxsZWQgYSBkZXN0cnVjdG9yLiAgSWYgYSBiYXNlIGNsYXNzIGhhcyBhIGBgX19kZWxfXygpYGAgbWV0aG9kLFxuICAgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgYGBfX2RlbF9fKClgYCBtZXRob2QsIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5XG4gICBjYWxsIGl0IHRvIGVuc3VyZSBwcm9wZXIgZGVsZXRpb24gb2YgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGVcbiAgIGluc3RhbmNlLiAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlICh0aG91Z2ggbm90IHJlY29tbWVuZGVkISkgZm9yXG4gICB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgdG8gcG9zdHBvbmUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGluc3RhbmNlIGJ5XG4gICBjcmVhdGluZyBhIG5ldyByZWZlcmVuY2UgdG8gaXQuICBJdCBtYXkgdGhlbiBiZSBjYWxsZWQgYXQgYSBsYXRlclxuICAgdGltZSB3aGVuIHRoaXMgbmV3IHJlZmVyZW5jZSBpcyBkZWxldGVkLiAgSXQgaXMgbm90IGd1YXJhbnRlZWQgdGhhdFxuICAgYGBfX2RlbF9fKClgYCBtZXRob2RzIGFyZSBjYWxsZWQgZm9yIG9iamVjdHMgdGhhdCBzdGlsbCBleGlzdCB3aGVuXG4gICB0aGUgaW50ZXJwcmV0ZXIgZXhpdHMuXG5cbiAgIE5vdGU6IGBgZGVsIHhgYCBkb2VzblwndCBkaXJlY3RseSBjYWxsIGBgeC5fX2RlbF9fKClgYCAtLS0gdGhlIGZvcm1lclxuICAgICBkZWNyZW1lbnRzIHRoZSByZWZlcmVuY2UgY291bnQgZm9yIGBgeGBgIGJ5IG9uZSwgYW5kIHRoZSBsYXR0ZXJcbiAgICAgaXMgb25seSBjYWxsZWQgd2hlbiBgYHhgYFwncyByZWZlcmVuY2UgY291bnQgcmVhY2hlcyB6ZXJvLiAgU29tZVxuICAgICBjb21tb24gc2l0dWF0aW9ucyB0aGF0IG1heSBwcmV2ZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW5cbiAgICAgb2JqZWN0IGZyb20gZ29pbmcgdG8gemVybyBpbmNsdWRlOiBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW5cbiAgICAgb2JqZWN0cyAoZS5nLiwgYSBkb3VibHktbGlua2VkIGxpc3Qgb3IgYSB0cmVlIGRhdGEgc3RydWN0dXJlIHdpdGhcbiAgICAgcGFyZW50IGFuZCBjaGlsZCBwb2ludGVycyk7IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlXG4gICAgIHN0YWNrIGZyYW1lIG9mIGEgZnVuY3Rpb24gdGhhdCBjYXVnaHQgYW4gZXhjZXB0aW9uICh0aGUgdHJhY2ViYWNrXG4gICAgIHN0b3JlZCBpbiBgYHN5cy5leGNfdHJhY2ViYWNrYGAga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKTsgb3JcbiAgICAgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGUgc3RhY2sgZnJhbWUgdGhhdCByYWlzZWQgYW5cbiAgICAgdW5oYW5kbGVkIGV4Y2VwdGlvbiBpbiBpbnRlcmFjdGl2ZSBtb2RlICh0aGUgdHJhY2ViYWNrIHN0b3JlZCBpblxuICAgICBgYHN5cy5sYXN0X3RyYWNlYmFja2BgIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSkuICBUaGUgZmlyc3RcbiAgICAgc2l0dWF0aW9uIGNhbiBvbmx5IGJlIHJlbWVkaWVkIGJ5IGV4cGxpY2l0bHkgYnJlYWtpbmcgdGhlIGN5Y2xlcztcbiAgICAgdGhlIGxhdHRlciB0d28gc2l0dWF0aW9ucyBjYW4gYmUgcmVzb2x2ZWQgYnkgc3RvcmluZyBgYE5vbmVgYCBpblxuICAgICBgYHN5cy5leGNfdHJhY2ViYWNrYGAgb3IgYGBzeXMubGFzdF90cmFjZWJhY2tgYC4gIENpcmN1bGFyXG4gICAgIHJlZmVyZW5jZXMgd2hpY2ggYXJlIGdhcmJhZ2UgYXJlIGRldGVjdGVkIHdoZW4gdGhlIG9wdGlvbiBjeWNsZVxuICAgICBkZXRlY3RvciBpcyBlbmFibGVkIChpdFwncyBvbiBieSBkZWZhdWx0KSwgYnV0IGNhbiBvbmx5IGJlIGNsZWFuZWRcbiAgICAgdXAgaWYgdGhlcmUgYXJlIG5vIFB5dGhvbi1sZXZlbCBgYF9fZGVsX18oKWBgIG1ldGhvZHMgaW52b2x2ZWQuXG4gICAgIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYGBnY2BgIG1vZHVsZSBmb3IgbW9yZVxuICAgICBpbmZvcm1hdGlvbiBhYm91dCBob3cgYGBfX2RlbF9fKClgYCBtZXRob2RzIGFyZSBoYW5kbGVkIGJ5IHRoZVxuICAgICBjeWNsZSBkZXRlY3RvciwgcGFydGljdWxhcmx5IHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYGBnYXJiYWdlYGBcbiAgICAgdmFsdWUuXG5cbiAgIFdhcm5pbmc6IER1ZSB0byB0aGUgcHJlY2FyaW91cyBjaXJjdW1zdGFuY2VzIHVuZGVyIHdoaWNoIGBgX19kZWxfXygpYGBcbiAgICAgbWV0aG9kcyBhcmUgaW52b2tlZCwgZXhjZXB0aW9ucyB0aGF0IG9jY3VyIGR1cmluZyB0aGVpciBleGVjdXRpb25cbiAgICAgYXJlIGlnbm9yZWQsIGFuZCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0byBgYHN5cy5zdGRlcnJgYCBpbnN0ZWFkLlxuICAgICBBbHNvLCB3aGVuIGBgX19kZWxfXygpYGAgaXMgaW52b2tlZCBpbiByZXNwb25zZSB0byBhIG1vZHVsZSBiZWluZ1xuICAgICBkZWxldGVkIChlLmcuLCB3aGVuIGV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSBpcyBkb25lKSwgb3RoZXJcbiAgICAgZ2xvYmFscyByZWZlcmVuY2VkIGJ5IHRoZSBgYF9fZGVsX18oKWBgIG1ldGhvZCBtYXkgYWxyZWFkeSBoYXZlXG4gICAgIGJlZW4gZGVsZXRlZCBvciBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyB0b3JuIGRvd24gKGUuZy4gdGhlXG4gICAgIGltcG9ydCBtYWNoaW5lcnkgc2h1dHRpbmcgZG93bikuICBGb3IgdGhpcyByZWFzb24sIGBgX19kZWxfXygpYGBcbiAgICAgbWV0aG9kcyBzaG91bGQgZG8gdGhlIGFic29sdXRlIG1pbmltdW0gbmVlZGVkIHRvIG1haW50YWluXG4gICAgIGV4dGVybmFsIGludmFyaWFudHMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMS41LCBQeXRob25cbiAgICAgZ3VhcmFudGVlcyB0aGF0IGdsb2JhbHMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCBhIHNpbmdsZVxuICAgICB1bmRlcnNjb3JlIGFyZSBkZWxldGVkIGZyb20gdGhlaXIgbW9kdWxlIGJlZm9yZSBvdGhlciBnbG9iYWxzIGFyZVxuICAgICBkZWxldGVkOyBpZiBubyBvdGhlciByZWZlcmVuY2VzIHRvIHN1Y2ggZ2xvYmFscyBleGlzdCwgdGhpcyBtYXlcbiAgICAgaGVscCBpbiBhc3N1cmluZyB0aGF0IGltcG9ydGVkIG1vZHVsZXMgYXJlIHN0aWxsIGF2YWlsYWJsZSBhdCB0aGVcbiAgICAgdGltZSB3aGVuIHRoZSBgYF9fZGVsX18oKWBgIG1ldGhvZCBpcyBjYWxsZWQuXG5cbiAgIFNlZSBhbHNvIHRoZSAqLVIqIGNvbW1hbmQtbGluZSBvcHRpb24uXG5cbm9iamVjdC5fX3JlcHJfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgdGhlIGBgcmVwcigpYGAgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHN0cmluZ1xuICAgY29udmVyc2lvbnMgKHJldmVyc2UgcXVvdGVzKSB0byBjb21wdXRlIHRoZSAib2ZmaWNpYWwiIHN0cmluZ1xuICAgcmVwcmVzZW50YXRpb24gb2YgYW4gb2JqZWN0LiAgSWYgYXQgYWxsIHBvc3NpYmxlLCB0aGlzIHNob3VsZCBsb29rXG4gICBsaWtlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb24gdGhhdCBjb3VsZCBiZSB1c2VkIHRvIHJlY3JlYXRlIGFuXG4gICBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZ2l2ZW4gYW4gYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQpLiAgSWZcbiAgIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhIHN0cmluZyBvZiB0aGUgZm9ybSBgYDwuLi5zb21lIHVzZWZ1bFxuICAgZGVzY3JpcHRpb24uLi4+YGAgc2hvdWxkIGJlIHJldHVybmVkLiAgVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGFcbiAgIHN0cmluZyBvYmplY3QuIElmIGEgY2xhc3MgZGVmaW5lcyBgYF9fcmVwcl9fKClgYCBidXQgbm90XG4gICBgYF9fc3RyX18oKWBgLCB0aGVuIGBgX19yZXByX18oKWBgIGlzIGFsc28gdXNlZCB3aGVuIGFuICJpbmZvcm1hbCJcbiAgIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBpcyByZXF1aXJlZC5cblxuICAgVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgZGVidWdnaW5nLCBzbyBpdCBpcyBpbXBvcnRhbnQgdGhhdCB0aGVcbiAgIHJlcHJlc2VudGF0aW9uIGlzIGluZm9ybWF0aW9uLXJpY2ggYW5kIHVuYW1iaWd1b3VzLlxuXG5vYmplY3QuX19zdHJfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgdGhlIGBgc3RyKClgYCBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgdGhlIGBgcHJpbnRgYFxuICAgc3RhdGVtZW50IHRvIGNvbXB1dGUgdGhlICJpbmZvcm1hbCIgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuXG4gICBvYmplY3QuICBUaGlzIGRpZmZlcnMgZnJvbSBgYF9fcmVwcl9fKClgYCBpbiB0aGF0IGl0IGRvZXMgbm90IGhhdmVcbiAgIHRvIGJlIGEgdmFsaWQgUHl0aG9uIGV4cHJlc3Npb246IGEgbW9yZSBjb252ZW5pZW50IG9yIGNvbmNpc2VcbiAgIHJlcHJlc2VudGF0aW9uIG1heSBiZSB1c2VkIGluc3RlYWQuIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhXG4gICBzdHJpbmcgb2JqZWN0LlxuXG5vYmplY3QuX19sdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbGVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2VxX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19uZV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZ3RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2dlX18oc2VsZiwgb3RoZXIpXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuMS5cblxuICAgVGhlc2UgYXJlIHRoZSBzby1jYWxsZWQgInJpY2ggY29tcGFyaXNvbiIgbWV0aG9kcywgYW5kIGFyZSBjYWxsZWRcbiAgIGZvciBjb21wYXJpc29uIG9wZXJhdG9ycyBpbiBwcmVmZXJlbmNlIHRvIGBgX19jbXBfXygpYGAgYmVsb3cuIFRoZVxuICAgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBvcGVyYXRvciBzeW1ib2xzIGFuZCBtZXRob2QgbmFtZXMgaXMgYXNcbiAgIGZvbGxvd3M6IGBgeDx5YGAgY2FsbHMgYGB4Ll9fbHRfXyh5KWBgLCBgYHg8PXlgYCBjYWxsc1xuICAgYGB4Ll9fbGVfXyh5KWBgLCBgYHg9PXlgYCBjYWxscyBgYHguX19lcV9fKHkpYGAsIGBgeCE9eWBgIGFuZFxuICAgYGB4PD55YGAgY2FsbCBgYHguX19uZV9fKHkpYGAsIGBgeD55YGAgY2FsbHMgYGB4Ll9fZ3RfXyh5KWBgLCBhbmRcbiAgIGBgeD49eWBgIGNhbGxzIGBgeC5fX2dlX18oeSlgYC5cblxuICAgQSByaWNoIGNvbXBhcmlzb24gbWV0aG9kIG1heSByZXR1cm4gdGhlIHNpbmdsZXRvblxuICAgYGBOb3RJbXBsZW1lbnRlZGBgIGlmIGl0IGRvZXMgbm90IGltcGxlbWVudCB0aGUgb3BlcmF0aW9uIGZvciBhXG4gICBnaXZlbiBwYWlyIG9mIGFyZ3VtZW50cy4gQnkgY29udmVudGlvbiwgYGBGYWxzZWBgIGFuZCBgYFRydWVgYCBhcmVcbiAgIHJldHVybmVkIGZvciBhIHN1Y2Nlc3NmdWwgY29tcGFyaXNvbi4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBjYW5cbiAgIHJldHVybiBhbnkgdmFsdWUsIHNvIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGlzIHVzZWQgaW4gYVxuICAgQm9vbGVhbiBjb250ZXh0IChlLmcuLCBpbiB0aGUgY29uZGl0aW9uIG9mIGFuIGBgaWZgYCBzdGF0ZW1lbnQpLFxuICAgUHl0aG9uIHdpbGwgY2FsbCBgYGJvb2woKWBgIG9uIHRoZSB2YWx1ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHJlc3VsdFxuICAgaXMgdHJ1ZSBvciBmYWxzZS5cblxuICAgVGhlcmUgYXJlIG5vIGltcGxpZWQgcmVsYXRpb25zaGlwcyBhbW9uZyB0aGUgY29tcGFyaXNvbiBvcGVyYXRvcnMuXG4gICBUaGUgdHJ1dGggb2YgYGB4PT15YGAgZG9lcyBub3QgaW1wbHkgdGhhdCBgYHghPXlgYCBpcyBmYWxzZS5cbiAgIEFjY29yZGluZ2x5LCB3aGVuIGRlZmluaW5nIGBgX19lcV9fKClgYCwgb25lIHNob3VsZCBhbHNvIGRlZmluZVxuICAgYGBfX25lX18oKWBgIHNvIHRoYXQgdGhlIG9wZXJhdG9ycyB3aWxsIGJlaGF2ZSBhcyBleHBlY3RlZC4gIFNlZVxuICAgdGhlIHBhcmFncmFwaCBvbiBgYF9faGFzaF9fKClgYCBmb3Igc29tZSBpbXBvcnRhbnQgbm90ZXMgb25cbiAgIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbSBjb21wYXJpc29uXG4gICBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy5cblxuICAgVGhlcmUgYXJlIG5vIHN3YXBwZWQtYXJndW1lbnQgdmVyc2lvbnMgb2YgdGhlc2UgbWV0aG9kcyAodG8gYmUgdXNlZFxuICAgd2hlbiB0aGUgbGVmdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gYnV0IHRoZSByaWdodFxuICAgYXJndW1lbnQgZG9lcyk7IHJhdGhlciwgYGBfX2x0X18oKWBgIGFuZCBgYF9fZ3RfXygpYGAgYXJlIGVhY2hcbiAgIG90aGVyXCdzIHJlZmxlY3Rpb24sIGBgX19sZV9fKClgYCBhbmQgYGBfX2dlX18oKWBgIGFyZSBlYWNoIG90aGVyXCdzXG4gICByZWZsZWN0aW9uLCBhbmQgYGBfX2VxX18oKWBgIGFuZCBgYF9fbmVfXygpYGAgYXJlIHRoZWlyIG93blxuICAgcmVmbGVjdGlvbi5cblxuICAgQXJndW1lbnRzIHRvIHJpY2ggY29tcGFyaXNvbiBtZXRob2RzIGFyZSBuZXZlciBjb2VyY2VkLlxuXG4gICBUbyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIG9yZGVyaW5nIG9wZXJhdGlvbnMgZnJvbSBhIHNpbmdsZSByb290XG4gICBvcGVyYXRpb24sIHNlZSBgYGZ1bmN0b29scy50b3RhbF9vcmRlcmluZygpYGAuXG5cbm9iamVjdC5fX2NtcF9fKHNlbGYsIG90aGVyKVxuXG4gICBDYWxsZWQgYnkgY29tcGFyaXNvbiBvcGVyYXRpb25zIGlmIHJpY2ggY29tcGFyaXNvbiAoc2VlIGFib3ZlKSBpc1xuICAgbm90IGRlZmluZWQuICBTaG91bGQgcmV0dXJuIGEgbmVnYXRpdmUgaW50ZWdlciBpZiBgYHNlbGYgPCBvdGhlcmBgLFxuICAgemVybyBpZiBgYHNlbGYgPT0gb3RoZXJgYCwgYSBwb3NpdGl2ZSBpbnRlZ2VyIGlmIGBgc2VsZiA+IG90aGVyYGAuXG4gICBJZiBubyBgYF9fY21wX18oKWBgLCBgYF9fZXFfXygpYGAgb3IgYGBfX25lX18oKWBgIG9wZXJhdGlvbiBpc1xuICAgZGVmaW5lZCwgY2xhc3MgaW5zdGFuY2VzIGFyZSBjb21wYXJlZCBieSBvYmplY3QgaWRlbnRpdHlcbiAgICgiYWRkcmVzcyIpLiAgU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIGBgX19oYXNoX18oKWBgIGZvciBzb21lXG4gICBpbXBvcnRhbnQgbm90ZXMgb24gY3JlYXRpbmcgKmhhc2hhYmxlKiBvYmplY3RzIHdoaWNoIHN1cHBvcnQgY3VzdG9tXG4gICBjb21wYXJpc29uIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLiAoTm90ZTogdGhlXG4gICByZXN0cmljdGlvbiB0aGF0IGV4Y2VwdGlvbnMgYXJlIG5vdCBwcm9wYWdhdGVkIGJ5IGBgX19jbXBfXygpYGAgaGFzXG4gICBiZWVuIHJlbW92ZWQgc2luY2UgUHl0aG9uIDEuNS4pXG5cbm9iamVjdC5fX3JjbXBfXyhzZWxmLCBvdGhlcilcblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMTogTm8gbG9uZ2VyIHN1cHBvcnRlZC5cblxub2JqZWN0Ll9faGFzaF9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSBidWlsdC1pbiBmdW5jdGlvbiBgYGhhc2goKWBgIGFuZCBmb3Igb3BlcmF0aW9ucyBvblxuICAgbWVtYmVycyBvZiBoYXNoZWQgY29sbGVjdGlvbnMgaW5jbHVkaW5nIGBgc2V0YGAsIGBgZnJvemVuc2V0YGAsIGFuZFxuICAgYGBkaWN0YGAuICBgYF9faGFzaF9fKClgYCBzaG91bGQgcmV0dXJuIGFuIGludGVnZXIuICBUaGUgb25seVxuICAgcmVxdWlyZWQgcHJvcGVydHkgaXMgdGhhdCBvYmplY3RzIHdoaWNoIGNvbXBhcmUgZXF1YWwgaGF2ZSB0aGUgc2FtZVxuICAgaGFzaCB2YWx1ZTsgaXQgaXMgYWR2aXNlZCB0byBzb21laG93IG1peCB0b2dldGhlciAoZS5nLiB1c2luZ1xuICAgZXhjbHVzaXZlIG9yKSB0aGUgaGFzaCB2YWx1ZXMgZm9yIHRoZSBjb21wb25lbnRzIG9mIHRoZSBvYmplY3QgdGhhdFxuICAgYWxzbyBwbGF5IGEgcGFydCBpbiBjb21wYXJpc29uIG9mIG9iamVjdHMuXG5cbiAgIElmIGEgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGEgYGBfX2NtcF9fKClgYCBvciBgYF9fZXFfXygpYGAgbWV0aG9kXG4gICBpdCBzaG91bGQgbm90IGRlZmluZSBhIGBgX19oYXNoX18oKWBgIG9wZXJhdGlvbiBlaXRoZXI7IGlmIGl0XG4gICBkZWZpbmVzIGBgX19jbXBfXygpYGAgb3IgYGBfX2VxX18oKWBgIGJ1dCBub3QgYGBfX2hhc2hfXygpYGAsIGl0c1xuICAgaW5zdGFuY2VzIHdpbGwgbm90IGJlIHVzYWJsZSBpbiBoYXNoZWQgY29sbGVjdGlvbnMuICBJZiBhIGNsYXNzXG4gICBkZWZpbmVzIG11dGFibGUgb2JqZWN0cyBhbmQgaW1wbGVtZW50cyBhIGBgX19jbXBfXygpYGAgb3JcbiAgIGBgX19lcV9fKClgYCBtZXRob2QsIGl0IHNob3VsZCBub3QgaW1wbGVtZW50IGBgX19oYXNoX18oKWBgLCBzaW5jZVxuICAgaGFzaGFibGUgY29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbnMgcmVxdWlyZSB0aGF0IGEgb2JqZWN0XCdzIGhhc2hcbiAgIHZhbHVlIGlzIGltbXV0YWJsZSAoaWYgdGhlIG9iamVjdFwncyBoYXNoIHZhbHVlIGNoYW5nZXMsIGl0IHdpbGwgYmVcbiAgIGluIHRoZSB3cm9uZyBoYXNoIGJ1Y2tldCkuXG5cbiAgIFVzZXItZGVmaW5lZCBjbGFzc2VzIGhhdmUgYGBfX2NtcF9fKClgYCBhbmQgYGBfX2hhc2hfXygpYGAgbWV0aG9kc1xuICAgYnkgZGVmYXVsdDsgd2l0aCB0aGVtLCBhbGwgb2JqZWN0cyBjb21wYXJlIHVuZXF1YWwgKGV4Y2VwdCB3aXRoXG4gICB0aGVtc2VsdmVzKSBhbmQgYGB4Ll9faGFzaF9fKClgYCByZXR1cm5zIGBgaWQoeClgYC5cblxuICAgQ2xhc3NlcyB3aGljaCBpbmhlcml0IGEgYGBfX2hhc2hfXygpYGAgbWV0aG9kIGZyb20gYSBwYXJlbnQgY2xhc3NcbiAgIGJ1dCBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgYGBfX2NtcF9fKClgYCBvciBgYF9fZXFfXygpYGAgc3VjaCB0aGF0XG4gICB0aGUgaGFzaCB2YWx1ZSByZXR1cm5lZCBpcyBubyBsb25nZXIgYXBwcm9wcmlhdGUgKGUuZy4gYnkgc3dpdGNoaW5nXG4gICB0byBhIHZhbHVlLWJhc2VkIGNvbmNlcHQgb2YgZXF1YWxpdHkgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdFxuICAgaWRlbnRpdHkgYmFzZWQgZXF1YWxpdHkpIGNhbiBleHBsaWNpdGx5IGZsYWcgdGhlbXNlbHZlcyBhcyBiZWluZ1xuICAgdW5oYXNoYWJsZSBieSBzZXR0aW5nIGBgX19oYXNoX18gPSBOb25lYGAgaW4gdGhlIGNsYXNzIGRlZmluaXRpb24uXG4gICBEb2luZyBzbyBtZWFucyB0aGF0IG5vdCBvbmx5IHdpbGwgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcyByYWlzZSBhblxuICAgYXBwcm9wcmlhdGUgYGBUeXBlRXJyb3JgYCB3aGVuIGEgcHJvZ3JhbSBhdHRlbXB0cyB0byByZXRyaWV2ZSB0aGVpclxuICAgaGFzaCB2YWx1ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIGJlIGNvcnJlY3RseSBpZGVudGlmaWVkIGFzXG4gICB1bmhhc2hhYmxlIHdoZW4gY2hlY2tpbmcgYGBpc2luc3RhbmNlKG9iaiwgY29sbGVjdGlvbnMuSGFzaGFibGUpYGBcbiAgICh1bmxpa2UgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlaXIgb3duIGBgX19oYXNoX18oKWBgIHRvIGV4cGxpY2l0bHlcbiAgIHJhaXNlIGBgVHlwZUVycm9yYGApLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi41OiBgYF9faGFzaF9fKClgYCBtYXkgbm93IGFsc28gcmV0dXJuIGEgbG9uZ1xuICAgaW50ZWdlciBvYmplY3Q7IHRoZSAzMi1iaXQgaW50ZWdlciBpcyB0aGVuIGRlcml2ZWQgZnJvbSB0aGUgaGFzaCBvZlxuICAgdGhhdCBvYmplY3QuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjY6IGBgX19oYXNoX19gYCBtYXkgbm93IGJlIHNldCB0byBgYE5vbmVgYCB0b1xuICAgZXhwbGljaXRseSBmbGFnIGluc3RhbmNlcyBvZiBhIGNsYXNzIGFzIHVuaGFzaGFibGUuXG5cbm9iamVjdC5fX25vbnplcm9fXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRydXRoIHZhbHVlIHRlc3RpbmcgYW5kIHRoZSBidWlsdC1pbiBvcGVyYXRpb25cbiAgIGBgYm9vbCgpYGA7IHNob3VsZCByZXR1cm4gYGBGYWxzZWBgIG9yIGBgVHJ1ZWBgLCBvciB0aGVpciBpbnRlZ2VyXG4gICBlcXVpdmFsZW50cyBgYDBgYCBvciBgYDFgYC4gIFdoZW4gdGhpcyBtZXRob2QgaXMgbm90IGRlZmluZWQsXG4gICBgYF9fbGVuX18oKWBgIGlzIGNhbGxlZCwgaWYgaXQgaXMgZGVmaW5lZCwgYW5kIHRoZSBvYmplY3QgaXNcbiAgIGNvbnNpZGVyZWQgdHJ1ZSBpZiBpdHMgcmVzdWx0IGlzIG5vbnplcm8uIElmIGEgY2xhc3MgZGVmaW5lc1xuICAgbmVpdGhlciBgYF9fbGVuX18oKWBgIG5vciBgYF9fbm9uemVyb19fKClgYCwgYWxsIGl0cyBpbnN0YW5jZXMgYXJlXG4gICBjb25zaWRlcmVkIHRydWUuXG5cbm9iamVjdC5fX3VuaWNvZGVfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGBgdW5pY29kZSgpYGAgYnVpbHQtaW47IHNob3VsZCByZXR1cm4gYSBVbmljb2RlXG4gICBvYmplY3QuIFdoZW4gdGhpcyBtZXRob2QgaXMgbm90IGRlZmluZWQsIHN0cmluZyBjb252ZXJzaW9uIGlzXG4gICBhdHRlbXB0ZWQsIGFuZCB0aGUgcmVzdWx0IG9mIHN0cmluZyBjb252ZXJzaW9uIGlzIGNvbnZlcnRlZCB0b1xuICAgVW5pY29kZSB1c2luZyB0aGUgc3lzdGVtIGRlZmF1bHQgZW5jb2RpbmcuXG4nLAorICdkZWJ1Z2dlcic6ICdcbmBgcGRiYGAgLS0tIFRoZSBQeXRob24gRGVidWdnZXJcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIG1vZHVsZSBgYHBkYmBgIGRlZmluZXMgYW4gaW50ZXJhY3RpdmUgc291cmNlIGNvZGUgZGVidWdnZXIgZm9yXG5QeXRob24gcHJvZ3JhbXMuICBJdCBzdXBwb3J0cyBzZXR0aW5nIChjb25kaXRpb25hbCkgYnJlYWtwb2ludHMgYW5kXG5zaW5nbGUgc3RlcHBpbmcgYXQgdGhlIHNvdXJjZSBsaW5lIGxldmVsLCBpbnNwZWN0aW9uIG9mIHN0YWNrIGZyYW1lcyxcbnNvdXJjZSBjb2RlIGxpc3RpbmcsIGFuZCBldmFsdWF0aW9uIG9mIGFyYml0cmFyeSBQeXRob24gY29kZSBpbiB0aGVcbmNvbnRleHQgb2YgYW55IHN0YWNrIGZyYW1lLiAgSXQgYWxzbyBzdXBwb3J0cyBwb3N0LW1vcnRlbSBkZWJ1Z2dpbmdcbmFuZCBjYW4gYmUgY2FsbGVkIHVuZGVyIHByb2dyYW0gY29udHJvbC5cblxuVGhlIGRlYnVnZ2VyIGlzIGV4dGVuc2libGUgLS0tIGl0IGlzIGFjdHVhbGx5IGRlZmluZWQgYXMgdGhlIGNsYXNzXG5gYFBkYmBgLiBUaGlzIGlzIGN1cnJlbnRseSB1bmRvY3VtZW50ZWQgYnV0IGVhc2lseSB1bmRlcnN0b29kIGJ5XG5yZWFkaW5nIHRoZSBzb3VyY2UuICBUaGUgZXh0ZW5zaW9uIGludGVyZmFjZSB1c2VzIHRoZSBtb2R1bGVzIGBgYmRiYGBcbmFuZCBgYGNtZGBgLlxuXG5UaGUgZGVidWdnZXJcJ3MgcHJvbXB0IGlzIGBgKFBkYilgYC4gVHlwaWNhbCB1c2FnZSB0byBydW4gYSBwcm9ncmFtXG51bmRlciBjb250cm9sIG9mIHRoZSBkZWJ1Z2dlciBpczpcblxuICAgPj4+IGltcG9ydCBwZGJcbiAgID4+PiBpbXBvcnQgbXltb2R1bGVcbiAgID4+PiBwZGIucnVuKFwnbXltb2R1bGUudGVzdCgpXCcpXG4gICA+IDxzdHJpbmc+KDApPygpXG4gICAoUGRiKSBjb250aW51ZVxuICAgPiA8c3RyaW5nPigxKT8oKVxuICAgKFBkYikgY29udGludWVcbiAgIE5hbWVFcnJvcjogXCdzcGFtXCdcbiAgID4gPHN0cmluZz4oMSk/KClcbiAgIChQZGIpXG5cbmBgcGRiLnB5YGAgY2FuIGFsc28gYmUgaW52b2tlZCBhcyBhIHNjcmlwdCB0byBkZWJ1ZyBvdGhlciBzY3JpcHRzLlxuRm9yIGV4YW1wbGU6XG5cbiAgIHB5dGhvbiAtbSBwZGIgbXlzY3JpcHQucHlcblxuV2hlbiBpbnZva2VkIGFzIGEgc2NyaXB0LCBwZGIgd2lsbCBhdXRvbWF0aWNhbGx5IGVudGVyIHBvc3QtbW9ydGVtXG5kZWJ1Z2dpbmcgaWYgdGhlIHByb2dyYW0gYmVpbmcgZGVidWdnZWQgZXhpdHMgYWJub3JtYWxseS4gQWZ0ZXIgcG9zdC1cbm1vcnRlbSBkZWJ1Z2dpbmcgKG9yIGFmdGVyIG5vcm1hbCBleGl0IG9mIHRoZSBwcm9ncmFtKSwgcGRiIHdpbGxcbnJlc3RhcnQgdGhlIHByb2dyYW0uIEF1dG9tYXRpYyByZXN0YXJ0aW5nIHByZXNlcnZlcyBwZGJcJ3Mgc3RhdGUgKHN1Y2hcbmFzIGJyZWFrcG9pbnRzKSBhbmQgaW4gbW9zdCBjYXNlcyBpcyBtb3JlIHVzZWZ1bCB0aGFuIHF1aXR0aW5nIHRoZVxuZGVidWdnZXIgdXBvbiBwcm9ncmFtXCdzIGV4aXQuXG5cbk5ldyBpbiB2ZXJzaW9uIDIuNDogUmVzdGFydGluZyBwb3N0LW1vcnRlbSBiZWhhdmlvciBhZGRlZC5cblxuVGhlIHR5cGljYWwgdXNhZ2UgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIgZnJvbSBhIHJ1bm5pbmcgcHJvZ3JhbSBpc1xudG8gaW5zZXJ0XG5cbiAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKVxuXG5hdCB0aGUgbG9jYXRpb24geW91IHdhbnQgdG8gYnJlYWsgaW50byB0aGUgZGVidWdnZXIuICBZb3UgY2FuIHRoZW5cbnN0ZXAgdGhyb3VnaCB0aGUgY29kZSBmb2xsb3dpbmcgdGhpcyBzdGF0ZW1lbnQsIGFuZCBjb250aW51ZSBydW5uaW5nXG53aXRob3V0IHRoZSBkZWJ1Z2dlciB1c2luZyB0aGUgYGBjYGAgY29tbWFuZC5cblxuVGhlIHR5cGljYWwgdXNhZ2UgdG8gaW5zcGVjdCBhIGNyYXNoZWQgcHJvZ3JhbSBpczpcblxuICAgPj4+IGltcG9ydCBwZGJcbiAgID4+PiBpbXBvcnQgbXltb2R1bGVcbiAgID4+PiBteW1vZHVsZS50ZXN0KClcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gP1xuICAgICBGaWxlICIuL215bW9kdWxlLnB5IiwgbGluZSA0LCBpbiB0ZXN0XG4gICAgICAgdGVzdDIoKVxuICAgICBGaWxlICIuL215bW9kdWxlLnB5IiwgbGluZSAzLCBpbiB0ZXN0MlxuICAgICAgIHByaW50IHNwYW1cbiAgIE5hbWVFcnJvcjogc3BhbVxuICAgPj4+IHBkYi5wbSgpXG4gICA+IC4vbXltb2R1bGUucHkoMyl0ZXN0MigpXG4gICAtPiBwcmludCBzcGFtXG4gICAoUGRiKVxuXG5UaGUgbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM7IGVhY2ggZW50ZXJzIHRoZSBkZWJ1Z2dlclxuaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQgd2F5OlxuXG5wZGIucnVuKHN0YXRlbWVudFssIGdsb2JhbHNbLCBsb2NhbHNdXSlcblxuICAgRXhlY3V0ZSB0aGUgKnN0YXRlbWVudCogKGdpdmVuIGFzIGEgc3RyaW5nKSB1bmRlciBkZWJ1Z2dlciBjb250cm9sLlxuICAgVGhlIGRlYnVnZ2VyIHByb21wdCBhcHBlYXJzIGJlZm9yZSBhbnkgY29kZSBpcyBleGVjdXRlZDsgeW91IGNhblxuICAgc2V0IGJyZWFrcG9pbnRzIGFuZCB0eXBlIGBgY29udGludWVgYCwgb3IgeW91IGNhbiBzdGVwIHRocm91Z2ggdGhlXG4gICBzdGF0ZW1lbnQgdXNpbmcgYGBzdGVwYGAgb3IgYGBuZXh0YGAgKGFsbCB0aGVzZSBjb21tYW5kcyBhcmVcbiAgIGV4cGxhaW5lZCBiZWxvdykuICBUaGUgb3B0aW9uYWwgKmdsb2JhbHMqIGFuZCAqbG9jYWxzKiBhcmd1bWVudHNcbiAgIHNwZWNpZnkgdGhlIGVudmlyb25tZW50IGluIHdoaWNoIHRoZSBjb2RlIGlzIGV4ZWN1dGVkOyBieSBkZWZhdWx0XG4gICB0aGUgZGljdGlvbmFyeSBvZiB0aGUgbW9kdWxlIGBgX19tYWluX19gYCBpcyB1c2VkLiAgKFNlZSB0aGVcbiAgIGV4cGxhbmF0aW9uIG9mIHRoZSBgYGV4ZWNgYCBzdGF0ZW1lbnQgb3IgdGhlIGBgZXZhbCgpYGAgYnVpbHQtaW5cbiAgIGZ1bmN0aW9uLilcblxucGRiLnJ1bmV2YWwoZXhwcmVzc2lvblssIGdsb2JhbHNbLCBsb2NhbHNdXSlcblxuICAgRXZhbHVhdGUgdGhlICpleHByZXNzaW9uKiAoZ2l2ZW4gYXMgYSBzdHJpbmcpIHVuZGVyIGRlYnVnZ2VyXG4gICBjb250cm9sLiAgV2hlbiBgYHJ1bmV2YWwoKWBgIHJldHVybnMsIGl0IHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZVxuICAgZXhwcmVzc2lvbi4gIE90aGVyd2lzZSB0aGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gYGBydW4oKWBgLlxuXG5wZGIucnVuY2FsbChmdW5jdGlvblssIGFyZ3VtZW50LCAuLi5dKVxuXG4gICBDYWxsIHRoZSAqZnVuY3Rpb24qIChhIGZ1bmN0aW9uIG9yIG1ldGhvZCBvYmplY3QsIG5vdCBhIHN0cmluZylcbiAgIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4gIFdoZW4gYGBydW5jYWxsKClgYCByZXR1cm5zLCBpdCByZXR1cm5zXG4gICB3aGF0ZXZlciB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5lZC4gIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFyc1xuICAgYXMgc29vbiBhcyB0aGUgZnVuY3Rpb24gaXMgZW50ZXJlZC5cblxucGRiLnNldF90cmFjZSgpXG5cbiAgIEVudGVyIHRoZSBkZWJ1Z2dlciBhdCB0aGUgY2FsbGluZyBzdGFjayBmcmFtZS4gIFRoaXMgaXMgdXNlZnVsIHRvXG4gICBoYXJkLWNvZGUgYSBicmVha3BvaW50IGF0IGEgZ2l2ZW4gcG9pbnQgaW4gYSBwcm9ncmFtLCBldmVuIGlmIHRoZVxuICAgY29kZSBpcyBub3Qgb3RoZXJ3aXNlIGJlaW5nIGRlYnVnZ2VkIChlLmcuIHdoZW4gYW4gYXNzZXJ0aW9uXG4gICBmYWlscykuXG5cbnBkYi5wb3N0X21vcnRlbShbdHJhY2ViYWNrXSlcblxuICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSBnaXZlbiAqdHJhY2ViYWNrKiBvYmplY3QuICBJZiBub1xuICAgKnRyYWNlYmFjayogaXMgZ2l2ZW4sIGl0IHVzZXMgdGhlIG9uZSBvZiB0aGUgZXhjZXB0aW9uIHRoYXQgaXNcbiAgIGN1cnJlbnRseSBiZWluZyBoYW5kbGVkIChhbiBleGNlcHRpb24gbXVzdCBiZSBiZWluZyBoYW5kbGVkIGlmIHRoZVxuICAgZGVmYXVsdCBpcyB0byBiZSB1c2VkKS5cblxucGRiLnBtKClcblxuICAgRW50ZXIgcG9zdC1tb3J0ZW0gZGVidWdnaW5nIG9mIHRoZSB0cmFjZWJhY2sgZm91bmQgaW5cbiAgIGBgc3lzLmxhc3RfdHJhY2ViYWNrYGAuXG5cblRoZSBgYHJ1bipgYCBmdW5jdGlvbnMgYW5kIGBgc2V0X3RyYWNlKClgYCBhcmUgYWxpYXNlcyBmb3Jcbmluc3RhbnRpYXRpbmcgdGhlIGBgUGRiYGAgY2xhc3MgYW5kIGNhbGxpbmcgdGhlIG1ldGhvZCBvZiB0aGUgc2FtZVxubmFtZS4gIElmIHlvdSB3YW50IHRvIGFjY2VzcyBmdXJ0aGVyIGZlYXR1cmVzLCB5b3UgaGF2ZSB0byBkbyB0aGlzXG55b3Vyc2VsZjpcblxuY2xhc3MgY2xhc3MgcGRiLlBkYihjb21wbGV0ZWtleT1cJ3RhYlwnLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc2tpcD1Ob25lKVxuXG4gICBgYFBkYmBgIGlzIHRoZSBkZWJ1Z2dlciBjbGFzcy5cblxuICAgVGhlICpjb21wbGV0ZWtleSosICpzdGRpbiogYW5kICpzdGRvdXQqIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHRoZVxuICAgdW5kZXJseWluZyBgYGNtZC5DbWRgYCBjbGFzczsgc2VlIHRoZSBkZXNjcmlwdGlvbiB0aGVyZS5cblxuICAgVGhlICpza2lwKiBhcmd1bWVudCwgaWYgZ2l2ZW4sIG11c3QgYmUgYW4gaXRlcmFibGUgb2YgZ2xvYi1zdHlsZVxuICAgbW9kdWxlIG5hbWUgcGF0dGVybnMuICBUaGUgZGVidWdnZXIgd2lsbCBub3Qgc3RlcCBpbnRvIGZyYW1lcyB0aGF0XG4gICBvcmlnaW5hdGUgaW4gYSBtb2R1bGUgdGhhdCBtYXRjaGVzIG9uZSBvZiB0aGVzZSBwYXR0ZXJucy4gWzFdXG5cbiAgIEV4YW1wbGUgY2FsbCB0byBlbmFibGUgdHJhY2luZyB3aXRoICpza2lwKjpcblxuICAgICAgaW1wb3J0IHBkYjsgcGRiLlBkYihza2lwPVtcJ2RqYW5nby4qXCddKS5zZXRfdHJhY2UoKVxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjc6IFRoZSAqc2tpcCogYXJndW1lbnQuXG5cbiAgIHJ1bihzdGF0ZW1lbnRbLCBnbG9iYWxzWywgbG9jYWxzXV0pXG4gICBydW5ldmFsKGV4cHJlc3Npb25bLCBnbG9iYWxzWywgbG9jYWxzXV0pXG4gICBydW5jYWxsKGZ1bmN0aW9uWywgYXJndW1lbnQsIC4uLl0pXG4gICBzZXRfdHJhY2UoKVxuXG4gICAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBmdW5jdGlvbnMgZXhwbGFpbmVkIGFib3ZlLlxuJywKKyAnZGVsJzogJ1xuVGhlIGBgZGVsYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKipcblxuICAgZGVsX3N0bXQgOjo9ICJkZWwiIHRhcmdldF9saXN0XG5cbkRlbGV0aW9uIGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgdmVyeSBzaW1pbGFyIHRvIHRoZSB3YXkgYXNzaWdubWVudCBpc1xuZGVmaW5lZC4gUmF0aGVyIHRoYW4gc3BlbGxpbmcgaXQgb3V0IGluIGZ1bGwgZGV0YWlscywgaGVyZSBhcmUgc29tZVxuaGludHMuXG5cbkRlbGV0aW9uIG9mIGEgdGFyZ2V0IGxpc3QgcmVjdXJzaXZlbHkgZGVsZXRlcyBlYWNoIHRhcmdldCwgZnJvbSBsZWZ0XG50byByaWdodC5cblxuRGVsZXRpb24gb2YgYSBuYW1lIHJlbW92ZXMgdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lICBmcm9tIHRoZSBsb2NhbCBvclxuZ2xvYmFsIG5hbWVzcGFjZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hbWUgb2NjdXJzIGluIGEgYGBnbG9iYWxgYFxuc3RhdGVtZW50IGluIHRoZSBzYW1lIGNvZGUgYmxvY2suICBJZiB0aGUgbmFtZSBpcyB1bmJvdW5kLCBhXG5gYE5hbWVFcnJvcmBgIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZC5cblxuSXQgaXMgaWxsZWdhbCB0byBkZWxldGUgYSBuYW1lIGZyb20gdGhlIGxvY2FsIG5hbWVzcGFjZSBpZiBpdCBvY2N1cnNcbmFzIGEgZnJlZSB2YXJpYWJsZSBpbiBhIG5lc3RlZCBibG9jay5cblxuRGVsZXRpb24gb2YgYXR0cmlidXRlIHJlZmVyZW5jZXMsIHN1YnNjcmlwdGlvbnMgYW5kIHNsaWNpbmdzIGlzIHBhc3NlZFxudG8gdGhlIHByaW1hcnkgb2JqZWN0IGludm9sdmVkOyBkZWxldGlvbiBvZiBhIHNsaWNpbmcgaXMgaW4gZ2VuZXJhbFxuZXF1aXZhbGVudCB0byBhc3NpZ25tZW50IG9mIGFuIGVtcHR5IHNsaWNlIG9mIHRoZSByaWdodCB0eXBlIChidXQgZXZlblxudGhpcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzbGljZWQgb2JqZWN0KS5cbicsCisgJ2RpY3QnOiAnXG5EaWN0aW9uYXJ5IGRpc3BsYXlzXG4qKioqKioqKioqKioqKioqKioqXG5cbkEgZGljdGlvbmFyeSBkaXNwbGF5IGlzIGEgcG9zc2libHkgZW1wdHkgc2VyaWVzIG9mIGtleS9kYXR1bSBwYWlyc1xuZW5jbG9zZWQgaW4gY3VybHkgYnJhY2VzOlxuXG4gICBkaWN0X2Rpc3BsYXkgICAgICAgOjo9ICJ7IiBba2V5X2RhdHVtX2xpc3QgfCBkaWN0X2NvbXByZWhlbnNpb25dICJ9IlxuICAga2V5X2RhdHVtX2xpc3QgICAgIDo6PSBrZXlfZGF0dW0gKCIsIiBrZXlfZGF0dW0pKiBbIiwiXVxuICAga2V5X2RhdHVtICAgICAgICAgIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uXG4gICBkaWN0X2NvbXByZWhlbnNpb24gOjo9IGV4cHJlc3Npb24gIjoiIGV4cHJlc3Npb24gY29tcF9mb3JcblxuQSBkaWN0aW9uYXJ5IGRpc3BsYXkgeWllbGRzIGEgbmV3IGRpY3Rpb25hcnkgb2JqZWN0LlxuXG5JZiBhIGNvbW1hLXNlcGFyYXRlZCBzZXF1ZW5jZSBvZiBrZXkvZGF0dW0gcGFpcnMgaXMgZ2l2ZW4sIHRoZXkgYXJlXG5ldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IHRvIGRlZmluZSB0aGUgZW50cmllcyBvZiB0aGUgZGljdGlvbmFyeTpcbmVhY2gga2V5IG9iamVjdCBpcyB1c2VkIGFzIGEga2V5IGludG8gdGhlIGRpY3Rpb25hcnkgdG8gc3RvcmUgdGhlXG5jb3JyZXNwb25kaW5nIGRhdHVtLiAgVGhpcyBtZWFucyB0aGF0IHlvdSBjYW4gc3BlY2lmeSB0aGUgc2FtZSBrZXlcbm11bHRpcGxlIHRpbWVzIGluIHRoZSBrZXkvZGF0dW0gbGlzdCwgYW5kIHRoZSBmaW5hbCBkaWN0aW9uYXJ5XCdzIHZhbHVlXG5mb3IgdGhhdCBrZXkgd2lsbCBiZSB0aGUgbGFzdCBvbmUgZ2l2ZW4uXG5cbkEgZGljdCBjb21wcmVoZW5zaW9uLCBpbiBjb250cmFzdCB0byBsaXN0IGFuZCBzZXQgY29tcHJlaGVuc2lvbnMsXG5uZWVkcyB0d28gZXhwcmVzc2lvbnMgc2VwYXJhdGVkIHdpdGggYSBjb2xvbiBmb2xsb3dlZCBieSB0aGUgdXN1YWxcbiJmb3IiIGFuZCAiaWYiIGNsYXVzZXMuIFdoZW4gdGhlIGNvbXByZWhlbnNpb24gaXMgcnVuLCB0aGUgcmVzdWx0aW5nXG5rZXkgYW5kIHZhbHVlIGVsZW1lbnRzIGFyZSBpbnNlcnRlZCBpbiB0aGUgbmV3IGRpY3Rpb25hcnkgaW4gdGhlIG9yZGVyXG50aGV5IGFyZSBwcm9kdWNlZC5cblxuUmVzdHJpY3Rpb25zIG9uIHRoZSB0eXBlcyBvZiB0aGUga2V5IHZhbHVlcyBhcmUgbGlzdGVkIGVhcmxpZXIgaW5cbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSouICAoVG8gc3VtbWFyaXplLCB0aGUga2V5IHR5cGVcbnNob3VsZCBiZSAqaGFzaGFibGUqLCB3aGljaCBleGNsdWRlcyBhbGwgbXV0YWJsZSBvYmplY3RzLikgIENsYXNoZXNcbmJldHdlZW4gZHVwbGljYXRlIGtleXMgYXJlIG5vdCBkZXRlY3RlZDsgdGhlIGxhc3QgZGF0dW0gKHRleHR1YWxseVxucmlnaHRtb3N0IGluIHRoZSBkaXNwbGF5KSBzdG9yZWQgZm9yIGEgZ2l2ZW4ga2V5IHZhbHVlIHByZXZhaWxzLlxuJywKKyAnZHluYW1pYy1mZWF0dXJlcyc6ICdcbkludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIHdoZXJlIFB5dGhvbiBzdGF0ZW1lbnRzIGFyZSBpbGxlZ2FsIHdoZW4gdXNlZFxuaW4gY29uanVuY3Rpb24gd2l0aCBuZXN0ZWQgc2NvcGVzIHRoYXQgY29udGFpbiBmcmVlIHZhcmlhYmxlcy5cblxuSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgaWxsZWdhbCB0b1xuZGVsZXRlIHRoZSBuYW1lLiAgQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhdCBjb21waWxlIHRpbWUuXG5cbklmIHRoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQgLS0tIGBgaW1wb3J0ICpgYCAtLS0gaXMgdXNlZCBpbiBhXG5mdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGEgbmVzdGVkIGJsb2NrIHdpdGggZnJlZVxudmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIGBgU3ludGF4RXJyb3JgYC5cblxuSWYgYGBleGVjYGAgaXMgdXNlZCBpbiBhIGZ1bmN0aW9uIGFuZCB0aGUgZnVuY3Rpb24gY29udGFpbnMgb3IgaXMgYVxubmVzdGVkIGJsb2NrIHdpdGggZnJlZSB2YXJpYWJsZXMsIHRoZSBjb21waWxlciB3aWxsIHJhaXNlIGFcbmBgU3ludGF4RXJyb3JgYCB1bmxlc3MgdGhlIGV4ZWMgZXhwbGljaXRseSBzcGVjaWZpZXMgdGhlIGxvY2FsXG5uYW1lc3BhY2UgZm9yIHRoZSBgYGV4ZWNgYC4gIChJbiBvdGhlciB3b3JkcywgYGBleGVjIG9iamBgIHdvdWxkIGJlXG5pbGxlZ2FsLCBidXQgYGBleGVjIG9iaiBpbiBuc2BgIHdvdWxkIGJlIGxlZ2FsLilcblxuVGhlIGBgZXZhbCgpYGAsIGBgZXhlY2ZpbGUoKWBgLCBhbmQgYGBpbnB1dCgpYGAgZnVuY3Rpb25zIGFuZCB0aGVcbmBgZXhlY2BgIHN0YXRlbWVudCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGwgZW52aXJvbm1lbnQgZm9yXG5yZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsIGFuZCBnbG9iYWxcbm5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWQgaW4gdGhlXG5uZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gWzFdIFRoZVxuYGBleGVjYGAgc3RhdGVtZW50IGFuZCB0aGUgYGBldmFsKClgYCBhbmQgYGBleGVjZmlsZSgpYGAgZnVuY3Rpb25zXG5oYXZlIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBvdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuXG5JZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuJywKKyAnZWxzZSc6ICdcblRoZSBgYGlmYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgYGBpZmBgIHN0YXRlbWVudCBpcyB1c2VkIGZvciBjb25kaXRpb25hbCBleGVjdXRpb246XG5cbiAgIGlmX3N0bXQgOjo9ICJpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICggImVsaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlICkqXG4gICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuSXQgc2VsZWN0cyBleGFjdGx5IG9uZSBvZiB0aGUgc3VpdGVzIGJ5IGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb25zIG9uZVxuYnkgb25lIHVudGlsIG9uZSBpcyBmb3VuZCB0byBiZSB0cnVlIChzZWUgc2VjdGlvbiAqQm9vbGVhbiBvcGVyYXRpb25zKlxuZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRydWUgYW5kIGZhbHNlKTsgdGhlbiB0aGF0IHN1aXRlIGlzIGV4ZWN1dGVkXG4oYW5kIG5vIG90aGVyIHBhcnQgb2YgdGhlIGBgaWZgYCBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgb3IgZXZhbHVhdGVkKS5cbklmIGFsbCBleHByZXNzaW9ucyBhcmUgZmFsc2UsIHRoZSBzdWl0ZSBvZiB0aGUgYGBlbHNlYGAgY2xhdXNlLCBpZlxucHJlc2VudCwgaXMgZXhlY3V0ZWQuXG4nLAorICdleGNlcHRpb25zJzogJ1xuRXhjZXB0aW9uc1xuKioqKioqKioqKlxuXG5FeGNlcHRpb25zIGFyZSBhIG1lYW5zIG9mIGJyZWFraW5nIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgb2YgY29udHJvbFxub2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgZXhjZXB0aW9uYWxcbmNvbmRpdGlvbnMuICBBbiBleGNlcHRpb24gaXMgKnJhaXNlZCogYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBlcnJvciBpc1xuZGV0ZWN0ZWQ7IGl0IG1heSBiZSAqaGFuZGxlZCogYnkgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYmxvY2sgb3IgYnkgYW55XG5jb2RlIGJsb2NrIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnZva2VkIHRoZSBjb2RlIGJsb2NrIHdoZXJlXG50aGUgZXJyb3Igb2NjdXJyZWQuXG5cblRoZSBQeXRob24gaW50ZXJwcmV0ZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGRldGVjdHMgYSBydW4tdGltZVxuZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvXG5leHBsaWNpdGx5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBgYHJhaXNlYGAgc3RhdGVtZW50LiBFeGNlcHRpb25cbmhhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgYGB0cnlgYCAuLi4gYGBleGNlcHRgYCBzdGF0ZW1lbnQuICBUaGVcbmBgZmluYWxseWBgIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgY2xlYW51cFxuY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkIHdoZXRoZXIgYW5cbmV4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLlxuXG5QeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXJcbmxldmVsLCBidXQgaXQgY2Fubm90IHJlcGFpciB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGFuZCByZXRyeSB0aGVcbmZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSBvZiBjb2RlXG5mcm9tIHRoZSB0b3ApLlxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciB0ZXJtaW5hdGVzXG5leGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gbG9vcC4gIEluXG5laXRoZXIgY2FzZSwgaXQgcHJpbnRzIGEgc3RhY2sgYmFja3RyYWNlLCBleGNlcHQgd2hlbiB0aGUgZXhjZXB0aW9uIGlzXG5gYFN5c3RlbUV4aXRgYC5cblxuRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgYGBleGNlcHRgYCBjbGF1c2VcbmlzIHNlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0IHJlZmVyZW5jZVxudGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZSBvciBhIGJhc2UgY2xhc3MgdGhlcmVvZi4gIFRoZSBpbnN0YW5jZSBjYW5cbmJlIHJlY2VpdmVkIGJ5IHRoZSBoYW5kbGVyIGFuZCBjYW4gY2FycnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dFxudGhlIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbi5cblxuRXhjZXB0aW9ucyBjYW4gYWxzbyBiZSBpZGVudGlmaWVkIGJ5IHN0cmluZ3MsIGluIHdoaWNoIGNhc2UgdGhlXG5gYGV4Y2VwdGBgIGNsYXVzZSBpcyBzZWxlY3RlZCBieSBvYmplY3QgaWRlbnRpdHkuICBBbiBhcmJpdHJhcnkgdmFsdWVcbmNhbiBiZSByYWlzZWQgYWxvbmcgd2l0aCB0aGUgaWRlbnRpZnlpbmcgc3RyaW5nIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG9cbnRoZSBoYW5kbGVyLlxuXG5Ob3RlOiBNZXNzYWdlcyB0byBleGNlcHRpb25zIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIEFQSS4gIFRoZWlyXG4gIGNvbnRlbnRzIG1heSBjaGFuZ2UgZnJvbSBvbmUgdmVyc2lvbiBvZiBQeXRob24gdG8gdGhlIG5leHQgd2l0aG91dFxuICB3YXJuaW5nIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuIHVuZGVyXG4gIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBpbnRlcnByZXRlci5cblxuU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgYHRyeWBgIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgdHJ5XG5zdGF0ZW1lbnQqIGFuZCBgYHJhaXNlYGAgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkIGJ5IHRoZXNlXG4gICAgb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgaXMgY29tcGlsZWQuXG4nLAorICdleGVjbW9kZWwnOiAnXG5FeGVjdXRpb24gbW9kZWxcbioqKioqKioqKioqKioqKlxuXG5cbk5hbWluZyBhbmQgYmluZGluZ1xuPT09PT09PT09PT09PT09PT09XG5cbipOYW1lcyogcmVmZXIgdG8gb2JqZWN0cy4gIE5hbWVzIGFyZSBpbnRyb2R1Y2VkIGJ5IG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy4gRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0b1xudGhlICpiaW5kaW5nKiBvZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgaW4gdGhlIGlubmVybW9zdCBmdW5jdGlvbiBibG9ja1xuY29udGFpbmluZyB0aGUgdXNlLlxuXG5BICpibG9jayogaXMgYSBwaWVjZSBvZiBQeXRob24gcHJvZ3JhbSB0ZXh0IHRoYXQgaXMgZXhlY3V0ZWQgYXMgYVxudW5pdC4gVGhlIGZvbGxvd2luZyBhcmUgYmxvY2tzOiBhIG1vZHVsZSwgYSBmdW5jdGlvbiBib2R5LCBhbmQgYSBjbGFzc1xuZGVmaW5pdGlvbi4gRWFjaCBjb21tYW5kIHR5cGVkIGludGVyYWN0aXZlbHkgaXMgYSBibG9jay4gIEEgc2NyaXB0XG5maWxlIChhIGZpbGUgZ2l2ZW4gYXMgc3RhbmRhcmQgaW5wdXQgdG8gdGhlIGludGVycHJldGVyIG9yIHNwZWNpZmllZFxub24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZSB0aGUgZmlyc3QgYXJndW1lbnQpIGlzIGEgY29kZSBibG9jay5cbkEgc2NyaXB0IGNvbW1hbmQgKGEgY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZVxud2l0aCB0aGUgXCcqKi1jKipcJyBvcHRpb24pIGlzIGEgY29kZSBibG9jay4gIFRoZSBmaWxlIHJlYWQgYnkgdGhlXG5idWlsdC1pbiBmdW5jdGlvbiBgYGV4ZWNmaWxlKClgYCBpcyBhIGNvZGUgYmxvY2suICBUaGUgc3RyaW5nIGFyZ3VtZW50XG5wYXNzZWQgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgZXZhbCgpYGAgYW5kIHRvIHRoZSBgYGV4ZWNgYFxuc3RhdGVtZW50IGlzIGEgY29kZSBibG9jay4gVGhlIGV4cHJlc3Npb24gcmVhZCBhbmQgZXZhbHVhdGVkIGJ5IHRoZVxuYnVpbHQtaW4gZnVuY3Rpb24gYGBpbnB1dCgpYGAgaXMgYSBjb2RlIGJsb2NrLlxuXG5BIGNvZGUgYmxvY2sgaXMgZXhlY3V0ZWQgaW4gYW4gKmV4ZWN1dGlvbiBmcmFtZSouICBBIGZyYW1lIGNvbnRhaW5zXG5zb21lIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uICh1c2VkIGZvciBkZWJ1Z2dpbmcpIGFuZCBkZXRlcm1pbmVzXG53aGVyZSBhbmQgaG93IGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlIGNvZGUgYmxvY2tcJ3MgZXhlY3V0aW9uIGhhc1xuY29tcGxldGVkLlxuXG5BICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsXG52YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgdGhlXG5kZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgYmxvY2tzXG5jb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzXG5hIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS4gIFRoZSBzY29wZSBvZiBuYW1lcyBkZWZpbmVkIGluIGFcbmNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG8gdGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlXG5jb2RlIGJsb2NrcyBvZiBtZXRob2RzIC0tIHRoaXMgaW5jbHVkZXMgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIHNpbmNlXG50aGV5IGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IHRoZVxuZm9sbG93aW5nIHdpbGwgZmFpbDpcblxuICAgY2xhc3MgQTpcbiAgICAgICBhID0gNDJcbiAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpXG5cbldoZW4gYSBuYW1lIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgbmVhcmVzdFxuZW5jbG9zaW5nIHNjb3BlLiAgVGhlIHNldCBvZiBhbGwgc3VjaCBzY29wZXMgdmlzaWJsZSB0byBhIGNvZGUgYmxvY2tcbmlzIGNhbGxlZCB0aGUgYmxvY2tcJ3MgKmVudmlyb25tZW50Ki5cblxuSWYgYSBuYW1lIGlzIGJvdW5kIGluIGEgYmxvY2ssIGl0IGlzIGEgbG9jYWwgdmFyaWFibGUgb2YgdGhhdCBibG9jay5cbklmIGEgbmFtZSBpcyBib3VuZCBhdCB0aGUgbW9kdWxlIGxldmVsLCBpdCBpcyBhIGdsb2JhbCB2YXJpYWJsZS4gIChUaGVcbnZhcmlhYmxlcyBvZiB0aGUgbW9kdWxlIGNvZGUgYmxvY2sgYXJlIGxvY2FsIGFuZCBnbG9iYWwuKSAgSWYgYVxudmFyaWFibGUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2sgYnV0IG5vdCBkZWZpbmVkIHRoZXJlLCBpdCBpcyBhICpmcmVlXG52YXJpYWJsZSouXG5cbldoZW4gYSBuYW1lIGlzIG5vdCBmb3VuZCBhdCBhbGwsIGEgYGBOYW1lRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLlxuSWYgdGhlIG5hbWUgcmVmZXJzIHRvIGEgbG9jYWwgdmFyaWFibGUgdGhhdCBoYXMgbm90IGJlZW4gYm91bmQsIGFcbmBgVW5ib3VuZExvY2FsRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLiAgYGBVbmJvdW5kTG9jYWxFcnJvcmBgIGlzIGFcbnN1YmNsYXNzIG9mIGBgTmFtZUVycm9yYGAuXG5cblRoZSBmb2xsb3dpbmcgY29uc3RydWN0cyBiaW5kIG5hbWVzOiBmb3JtYWwgcGFyYW1ldGVycyB0byBmdW5jdGlvbnMsXG5gYGltcG9ydGBgIHN0YXRlbWVudHMsIGNsYXNzIGFuZCBmdW5jdGlvbiBkZWZpbml0aW9ucyAodGhlc2UgYmluZCB0aGVcbmNsYXNzIG9yIGZ1bmN0aW9uIG5hbWUgaW4gdGhlIGRlZmluaW5nIGJsb2NrKSwgYW5kIHRhcmdldHMgdGhhdCBhcmVcbmlkZW50aWZpZXJzIGlmIG9jY3VycmluZyBpbiBhbiBhc3NpZ25tZW50LCBgYGZvcmBgIGxvb3AgaGVhZGVyLCBpbiB0aGVcbnNlY29uZCBwb3NpdGlvbiBvZiBhbiBgYGV4Y2VwdGBgIGNsYXVzZSBoZWFkZXIgb3IgYWZ0ZXIgYGBhc2BgIGluIGFcbmBgd2l0aGBgIHN0YXRlbWVudC4gIFRoZSBgYGltcG9ydGBgIHN0YXRlbWVudCBvZiB0aGUgZm9ybSBgYGZyb20gLi4uXG5pbXBvcnQgKmBgIGJpbmRzIGFsbCBuYW1lcyBkZWZpbmVkIGluIHRoZSBpbXBvcnRlZCBtb2R1bGUsIGV4Y2VwdFxudGhvc2UgYmVnaW5uaW5nIHdpdGggYW4gdW5kZXJzY29yZS4gIFRoaXMgZm9ybSBtYXkgb25seSBiZSB1c2VkIGF0IHRoZVxubW9kdWxlIGxldmVsLlxuXG5BIHRhcmdldCBvY2N1cnJpbmcgaW4gYSBgYGRlbGBgIHN0YXRlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYm91bmQgZm9yXG50aGlzIHB1cnBvc2UgKHRob3VnaCB0aGUgYWN0dWFsIHNlbWFudGljcyBhcmUgdG8gdW5iaW5kIHRoZSBuYW1lKS4gIEl0XG5pcyBpbGxlZ2FsIHRvIHVuYmluZCBhIG5hbWUgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IGFuIGVuY2xvc2luZyBzY29wZTtcbnRoZSBjb21waWxlciB3aWxsIHJlcG9ydCBhIGBgU3ludGF4RXJyb3JgYC5cblxuRWFjaCBhc3NpZ25tZW50IG9yIGltcG9ydCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrIGRlZmluZWQgYnkgYVxuY2xhc3Mgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbiBvciBhdCB0aGUgbW9kdWxlIGxldmVsICh0aGUgdG9wLWxldmVsXG5jb2RlIGJsb2NrKS5cblxuSWYgYSBuYW1lIGJpbmRpbmcgb3BlcmF0aW9uIG9jY3VycyBhbnl3aGVyZSB3aXRoaW4gYSBjb2RlIGJsb2NrLCBhbGxcbnVzZXMgb2YgdGhlIG5hbWUgd2l0aGluIHRoZSBibG9jayBhcmUgdHJlYXRlZCBhcyByZWZlcmVuY2VzIHRvIHRoZVxuY3VycmVudCBibG9jay4gIFRoaXMgY2FuIGxlYWQgdG8gZXJyb3JzIHdoZW4gYSBuYW1lIGlzIHVzZWQgd2l0aGluIGFcbmJsb2NrIGJlZm9yZSBpdCBpcyBib3VuZC4gVGhpcyBydWxlIGlzIHN1YnRsZS4gIFB5dGhvbiBsYWNrc1xuZGVjbGFyYXRpb25zIGFuZCBhbGxvd3MgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbnMgdG8gb2NjdXIgYW55d2hlcmVcbndpdGhpbiBhIGNvZGUgYmxvY2suICBUaGUgbG9jYWwgdmFyaWFibGVzIG9mIGEgY29kZSBibG9jayBjYW4gYmVcbmRldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIGVudGlyZSB0ZXh0IG9mIHRoZSBibG9jayBmb3IgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb25zLlxuXG5JZiB0aGUgZ2xvYmFsIHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2ssIGFsbCB1c2VzIG9mIHRoZSBuYW1lXG5zcGVjaWZpZWQgaW4gdGhlIHN0YXRlbWVudCByZWZlciB0byB0aGUgYmluZGluZyBvZiB0aGF0IG5hbWUgaW4gdGhlXG50b3AtbGV2ZWwgbmFtZXNwYWNlLiBOYW1lcyBhcmUgcmVzb2x2ZWQgaW4gdGhlIHRvcC1sZXZlbCBuYW1lc3BhY2UgYnlcbnNlYXJjaGluZyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSwgaS5lLiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGVcbmNvbnRhaW5pbmcgdGhlIGNvZGUgYmxvY2ssIGFuZCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlLCB0aGUgbmFtZXNwYWNlXG5vZiB0aGUgbW9kdWxlIGBgX19idWlsdGluX19gYC4gIFRoZSBnbG9iYWwgbmFtZXNwYWNlIGlzIHNlYXJjaGVkXG5maXJzdC4gIElmIHRoZSBuYW1lIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBpc1xuc2VhcmNoZWQuICBUaGUgZ2xvYmFsIHN0YXRlbWVudCBtdXN0IHByZWNlZGUgYWxsIHVzZXMgb2YgdGhlIG5hbWUuXG5cblRoZSBidWlsdGlucyBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlIGJsb2NrXG5pcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lIGBgX19idWlsdGluc19fYGAgaW4gaXRzXG5nbG9iYWwgbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZVxubGF0dGVyIGNhc2UgdGhlIG1vZHVsZVwncyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGVcbmBgX19tYWluX19gYCBtb2R1bGUsIGBgX19idWlsdGluc19fYGAgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZVxuYGBfX2J1aWx0aW5fX2BgIChub3RlOiBubyBcJ3NcJyk7IHdoZW4gaW4gYW55IG90aGVyIG1vZHVsZSxcbmBgX19idWlsdGluc19fYGAgaXMgYW4gYWxpYXMgZm9yIHRoZSBkaWN0aW9uYXJ5IG9mIHRoZSBgYF9fYnVpbHRpbl9fYGBcbm1vZHVsZSBpdHNlbGYuICBgYF9fYnVpbHRpbnNfX2BgIGNhbiBiZSBzZXQgdG8gYSB1c2VyLWNyZWF0ZWRcbmRpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQgZXhlY3V0aW9uLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFVzZXJzIHNob3VsZCBub3QgdG91Y2hcbmBgX19idWlsdGluc19fYGA7IGl0IGlzIHN0cmljdGx5IGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4gIFVzZXJzXG53YW50aW5nIHRvIG92ZXJyaWRlIHZhbHVlcyBpbiB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIHNob3VsZCBgYGltcG9ydGBgXG50aGUgYGBfX2J1aWx0aW5fX2BgIChubyBcJ3NcJykgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXNcbmFwcHJvcHJpYXRlbHkuXG5cblRoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBhXG5tb2R1bGUgaXMgaW1wb3J0ZWQuICBUaGUgbWFpbiBtb2R1bGUgZm9yIGEgc2NyaXB0IGlzIGFsd2F5cyBjYWxsZWRcbmBgX19tYWluX19gYC5cblxuVGhlIGBgZ2xvYmFsYGAgc3RhdGVtZW50IGhhcyB0aGUgc2FtZSBzY29wZSBhcyBhIG5hbWUgYmluZGluZ1xub3BlcmF0aW9uIGluIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhXG5mcmVlIHZhcmlhYmxlIGNvbnRhaW5zIGEgZ2xvYmFsIHN0YXRlbWVudCwgdGhlIGZyZWUgdmFyaWFibGUgaXNcbnRyZWF0ZWQgYXMgYSBnbG9iYWwuXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZVxubmFtZXMuIFRoZXNlIHJlZmVyZW5jZXMgZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbi5cblRoZSBuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnlcbm9mIHRoZSBjbGFzcy4gIE5hbWVzIGRlZmluZWQgYXQgdGhlIGNsYXNzIHNjb3BlIGFyZSBub3QgdmlzaWJsZSBpblxubWV0aG9kcy5cblxuXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5JZiB0aGUgd2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSBgYGltcG9ydCAqYGAgLS0tIGlzIHVzZWQgaW4gYVxuZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhIG5lc3RlZCBibG9jayB3aXRoIGZyZWVcbnZhcmlhYmxlcywgdGhlIGNvbXBpbGVyIHdpbGwgcmFpc2UgYSBgYFN5bnRheEVycm9yYGAuXG5cbklmIGBgZXhlY2BgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGFcbm5lc3RlZCBibG9jayB3aXRoIGZyZWUgdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhXG5gYFN5bnRheEVycm9yYGAgdW5sZXNzIHRoZSBleGVjIGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBsb2NhbFxubmFtZXNwYWNlIGZvciB0aGUgYGBleGVjYGAuICAoSW4gb3RoZXIgd29yZHMsIGBgZXhlYyBvYmpgYCB3b3VsZCBiZVxuaWxsZWdhbCwgYnV0IGBgZXhlYyBvYmogaW4gbnNgYCB3b3VsZCBiZSBsZWdhbC4pXG5cblRoZSBgYGV2YWwoKWBgLCBgYGV4ZWNmaWxlKClgYCwgYW5kIGBgaW5wdXQoKWBgIGZ1bmN0aW9ucyBhbmQgdGhlXG5gYGV4ZWNgYCBzdGF0ZW1lbnQgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsIGVudmlyb25tZW50IGZvclxucmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbCBhbmQgZ2xvYmFsXG5uYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkIGluIHRoZVxubmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFsxXSBUaGVcbmBgZXhlY2BgIHN0YXRlbWVudCBhbmQgdGhlIGBgZXZhbCgpYGAgYW5kIGBgZXhlY2ZpbGUoKWBgIGZ1bmN0aW9uc1xuaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLlxuSWYgb25seSBvbmUgbmFtZXNwYWNlIGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cblxuXG5FeGNlcHRpb25zXG49PT09PT09PT09XG5cbkV4Y2VwdGlvbnMgYXJlIGEgbWVhbnMgb2YgYnJlYWtpbmcgb3V0IG9mIHRoZSBub3JtYWwgZmxvdyBvZiBjb250cm9sXG5vZiBhIGNvZGUgYmxvY2sgaW4gb3JkZXIgdG8gaGFuZGxlIGVycm9ycyBvciBvdGhlciBleGNlcHRpb25hbFxuY29uZGl0aW9ucy4gIEFuIGV4Y2VwdGlvbiBpcyAqcmFpc2VkKiBhdCB0aGUgcG9pbnQgd2hlcmUgdGhlIGVycm9yIGlzXG5kZXRlY3RlZDsgaXQgbWF5IGJlICpoYW5kbGVkKiBieSB0aGUgc3Vycm91bmRpbmcgY29kZSBibG9jayBvciBieSBhbnlcbmNvZGUgYmxvY2sgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGludm9rZWQgdGhlIGNvZGUgYmxvY2sgd2hlcmVcbnRoZSBlcnJvciBvY2N1cnJlZC5cblxuVGhlIFB5dGhvbiBpbnRlcnByZXRlciByYWlzZXMgYW4gZXhjZXB0aW9uIHdoZW4gaXQgZGV0ZWN0cyBhIHJ1bi10aW1lXG5lcnJvciAoc3VjaCBhcyBkaXZpc2lvbiBieSB6ZXJvKS4gIEEgUHl0aG9uIHByb2dyYW0gY2FuIGFsc29cbmV4cGxpY2l0bHkgcmFpc2UgYW4gZXhjZXB0aW9uIHdpdGggdGhlIGBgcmFpc2VgYCBzdGF0ZW1lbnQuIEV4Y2VwdGlvblxuaGFuZGxlcnMgYXJlIHNwZWNpZmllZCB3aXRoIHRoZSBgYHRyeWBgIC4uLiBgYGV4Y2VwdGBgIHN0YXRlbWVudC4gIFRoZVxuYGBmaW5hbGx5YGAgY2xhdXNlIG9mIHN1Y2ggYSBzdGF0ZW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBjbGVhbnVwXG5jb2RlIHdoaWNoIGRvZXMgbm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLCBidXQgaXMgZXhlY3V0ZWQgd2hldGhlciBhblxuZXhjZXB0aW9uIG9jY3VycmVkIG9yIG5vdCBpbiB0aGUgcHJlY2VkaW5nIGNvZGUuXG5cblB5dGhvbiB1c2VzIHRoZSAidGVybWluYXRpb24iIG1vZGVsIG9mIGVycm9yIGhhbmRsaW5nOiBhbiBleGNlcHRpb25cbmhhbmRsZXIgY2FuIGZpbmQgb3V0IHdoYXQgaGFwcGVuZWQgYW5kIGNvbnRpbnVlIGV4ZWN1dGlvbiBhdCBhbiBvdXRlclxubGV2ZWwsIGJ1dCBpdCBjYW5ub3QgcmVwYWlyIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgYW5kIHJldHJ5IHRoZVxuZmFpbGluZyBvcGVyYXRpb24gKGV4Y2VwdCBieSByZS1lbnRlcmluZyB0aGUgb2ZmZW5kaW5nIHBpZWNlIG9mIGNvZGVcbmZyb20gdGhlIHRvcCkuXG5cbldoZW4gYW4gZXhjZXB0aW9uIGlzIG5vdCBoYW5kbGVkIGF0IGFsbCwgdGhlIGludGVycHJldGVyIHRlcm1pbmF0ZXNcbmV4ZWN1dGlvbiBvZiB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJucyB0byBpdHMgaW50ZXJhY3RpdmUgbWFpbiBsb29wLiAgSW5cbmVpdGhlciBjYXNlLCBpdCBwcmludHMgYSBzdGFjayBiYWNrdHJhY2UsIGV4Y2VwdCB3aGVuIHRoZSBleGNlcHRpb24gaXNcbmBgU3lzdGVtRXhpdGBgLlxuXG5FeGNlcHRpb25zIGFyZSBpZGVudGlmaWVkIGJ5IGNsYXNzIGluc3RhbmNlcy4gIFRoZSBgYGV4Y2VwdGBgIGNsYXVzZVxuaXMgc2VsZWN0ZWQgZGVwZW5kaW5nIG9uIHRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2U6IGl0IG11c3QgcmVmZXJlbmNlXG50aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlIG9yIGEgYmFzZSBjbGFzcyB0aGVyZW9mLiAgVGhlIGluc3RhbmNlIGNhblxuYmUgcmVjZWl2ZWQgYnkgdGhlIGhhbmRsZXIgYW5kIGNhbiBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0XG50aGUgZXhjZXB0aW9uYWwgY29uZGl0aW9uLlxuXG5FeGNlcHRpb25zIGNhbiBhbHNvIGJlIGlkZW50aWZpZWQgYnkgc3RyaW5ncywgaW4gd2hpY2ggY2FzZSB0aGVcbmBgZXhjZXB0YGAgY2xhdXNlIGlzIHNlbGVjdGVkIGJ5IG9iamVjdCBpZGVudGl0eS4gIEFuIGFyYml0cmFyeSB2YWx1ZVxuY2FuIGJlIHJhaXNlZCBhbG9uZyB3aXRoIHRoZSBpZGVudGlmeWluZyBzdHJpbmcgd2hpY2ggY2FuIGJlIHBhc3NlZCB0b1xudGhlIGhhbmRsZXIuXG5cbk5vdGU6IE1lc3NhZ2VzIHRvIGV4Y2VwdGlvbnMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBQeXRob24gQVBJLiAgVGhlaXJcbiAgY29udGVudHMgbWF5IGNoYW5nZSBmcm9tIG9uZSB2ZXJzaW9uIG9mIFB5dGhvbiB0byB0aGUgbmV4dCB3aXRob3V0XG4gIHdhcm5pbmcgYW5kIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uIGJ5IGNvZGUgd2hpY2ggd2lsbCBydW4gdW5kZXJcbiAgbXVsdGlwbGUgdmVyc2lvbnMgb2YgdGhlIGludGVycHJldGVyLlxuXG5TZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGBgdHJ5YGAgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSB0cnlcbnN0YXRlbWVudCogYW5kIGBgcmFpc2VgYCBzdGF0ZW1lbnQgaW4gc2VjdGlvbiAqVGhlIHJhaXNlIHN0YXRlbWVudCouXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gVGhpcyBsaW1pdGF0aW9uIG9jY3VycyBiZWNhdXNlIHRoZSBjb2RlIHRoYXQgaXMgZXhlY3V0ZWQgYnkgdGhlc2VcbiAgICBvcGVyYXRpb25zIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIHRpbWUgdGhlIG1vZHVsZSBpcyBjb21waWxlZC5cbicsCisgJ2V4cHJsaXN0cyc6ICdcbkV4cHJlc3Npb24gbGlzdHNcbioqKioqKioqKioqKioqKipcblxuICAgZXhwcmVzc2lvbl9saXN0IDo6PSBleHByZXNzaW9uICggIiwiIGV4cHJlc3Npb24gKSogWyIsIl1cblxuQW4gZXhwcmVzc2lvbiBsaXN0IGNvbnRhaW5pbmcgYXQgbGVhc3Qgb25lIGNvbW1hIHlpZWxkcyBhIHR1cGxlLiAgVGhlXG5sZW5ndGggb2YgdGhlIHR1cGxlIGlzIHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbnMgaW4gdGhlIGxpc3QuICBUaGVcbmV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuXG5UaGUgdHJhaWxpbmcgY29tbWEgaXMgcmVxdWlyZWQgb25seSB0byBjcmVhdGUgYSBzaW5nbGUgdHVwbGUgKGEuay5hLiBhXG4qc2luZ2xldG9uKik7IGl0IGlzIG9wdGlvbmFsIGluIGFsbCBvdGhlciBjYXNlcy4gIEEgc2luZ2xlIGV4cHJlc3Npb25cbndpdGhvdXQgYSB0cmFpbGluZyBjb21tYSBkb2VzblwndCBjcmVhdGUgYSB0dXBsZSwgYnV0IHJhdGhlciB5aWVsZHMgdGhlXG52YWx1ZSBvZiB0aGF0IGV4cHJlc3Npb24uIChUbyBjcmVhdGUgYW4gZW1wdHkgdHVwbGUsIHVzZSBhbiBlbXB0eSBwYWlyXG5vZiBwYXJlbnRoZXNlczogYGAoKWBgLilcbicsCisgJ2Zsb2F0aW5nJzogJ1xuRmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKioqKioqKioqXG5cbkZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsXG5kZWZpbml0aW9uczpcblxuICAgZmxvYXRudW1iZXIgICA6Oj0gcG9pbnRmbG9hdCB8IGV4cG9uZW50ZmxvYXRcbiAgIHBvaW50ZmxvYXQgICAgOjo9IFtpbnRwYXJ0XSBmcmFjdGlvbiB8IGludHBhcnQgIi4iXG4gICBleHBvbmVudGZsb2F0IDo6PSAoaW50cGFydCB8IHBvaW50ZmxvYXQpIGV4cG9uZW50XG4gICBpbnRwYXJ0ICAgICAgIDo6PSBkaWdpdCtcbiAgIGZyYWN0aW9uICAgICAgOjo9ICIuIiBkaWdpdCtcbiAgIGV4cG9uZW50ICAgICAgOjo9ICgiZSIgfCAiRSIpIFsiKyIgfCAiLSJdIGRpZ2l0K1xuXG5Ob3RlIHRoYXQgdGhlIGludGVnZXIgYW5kIGV4cG9uZW50IHBhcnRzIG9mIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgY2FuXG5sb29rIGxpa2Ugb2N0YWwgaW50ZWdlcnMsIGJ1dCBhcmUgaW50ZXJwcmV0ZWQgdXNpbmcgcmFkaXggMTAuICBGb3JcbmV4YW1wbGUsIGBgMDc3ZTAxMGBgIGlzIGxlZ2FsLCBhbmQgZGVub3RlcyB0aGUgc2FtZSBudW1iZXIgYXNcbmBgNzdlMTBgYC4gVGhlIGFsbG93ZWQgcmFuZ2Ugb2YgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHMgaXNcbmltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gU29tZSBleGFtcGxlcyBvZiBmbG9hdGluZyBwb2ludCBsaXRlcmFsczpcblxuICAgMy4xNCAgICAxMC4gICAgLjAwMSAgICAxZTEwMCAgICAzLjE0ZS0xMCAgICAwZTBcblxuTm90ZSB0aGF0IG51bWVyaWMgbGl0ZXJhbHMgZG8gbm90IGluY2x1ZGUgYSBzaWduOyBhIHBocmFzZSBsaWtlIGBgLTFgYFxuaXMgYWN0dWFsbHkgYW4gZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0aGUgdW5hcnkgb3BlcmF0b3IgYGAtYGAgYW5kIHRoZVxubGl0ZXJhbCBgYDFgYC5cbicsCisgJ2Zvcic6ICdcblRoZSBgYGZvcmBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBgYGZvcmBgIHN0YXRlbWVudCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYVxuc2VxdWVuY2UgKHN1Y2ggYXMgYSBzdHJpbmcsIHR1cGxlIG9yIGxpc3QpIG9yIG90aGVyIGl0ZXJhYmxlIG9iamVjdDpcblxuICAgZm9yX3N0bXQgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgZXhwcmVzc2lvbl9saXN0ICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGV2YWx1YXRlZCBvbmNlOyBpdCBzaG91bGQgeWllbGQgYW4gaXRlcmFibGVcbm9iamVjdC4gIEFuIGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZSByZXN1bHQgb2YgdGhlXG5gYGV4cHJlc3Npb25fbGlzdGBgLiAgVGhlIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgb25jZSBmb3IgZWFjaCBpdGVtXG5wcm92aWRlZCBieSB0aGUgaXRlcmF0b3IsIGluIHRoZSBvcmRlciBvZiBhc2NlbmRpbmcgaW5kaWNlcy4gIEVhY2hcbml0ZW0gaW4gdHVybiBpcyBhc3NpZ25lZCB0byB0aGUgdGFyZ2V0IGxpc3QgdXNpbmcgdGhlIHN0YW5kYXJkIHJ1bGVzXG5mb3IgYXNzaWdubWVudHMsIGFuZCB0aGVuIHRoZSBzdWl0ZSBpcyBleGVjdXRlZC4gIFdoZW4gdGhlIGl0ZW1zIGFyZVxuZXhoYXVzdGVkICh3aGljaCBpcyBpbW1lZGlhdGVseSB3aGVuIHRoZSBzZXF1ZW5jZSBpcyBlbXB0eSksIHRoZSBzdWl0ZVxuaW4gdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWYgcHJlc2VudCwgaXMgZXhlY3V0ZWQsIGFuZCB0aGUgbG9vcFxudGVybWluYXRlcy5cblxuQSBgYGJyZWFrYGAgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgYGBlbHNlYGAgY2xhdXNlXCdzIHN1aXRlLiAgQSBgYGNvbnRpbnVlYGBcbnN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZFxuY29udGludWVzIHdpdGggdGhlIG5leHQgaXRlbSwgb3Igd2l0aCB0aGUgYGBlbHNlYGAgY2xhdXNlIGlmIHRoZXJlIHdhc1xubm8gbmV4dCBpdGVtLlxuXG5UaGUgc3VpdGUgbWF5IGFzc2lnbiB0byB0aGUgdmFyaWFibGUocykgaW4gdGhlIHRhcmdldCBsaXN0OyB0aGlzIGRvZXNcbm5vdCBhZmZlY3QgdGhlIG5leHQgaXRlbSBhc3NpZ25lZCB0byBpdC5cblxuVGhlIHRhcmdldCBsaXN0IGlzIG5vdCBkZWxldGVkIHdoZW4gdGhlIGxvb3AgaXMgZmluaXNoZWQsIGJ1dCBpZiB0aGVcbnNlcXVlbmNlIGlzIGVtcHR5LCBpdCB3aWxsIG5vdCBoYXZlIGJlZW4gYXNzaWduZWQgdG8gYXQgYWxsIGJ5IHRoZVxubG9vcC4gIEhpbnQ6IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYHJhbmdlKClgYCByZXR1cm5zIGEgc2VxdWVuY2Ugb2ZcbmludGVnZXJzIHN1aXRhYmxlIHRvIGVtdWxhdGUgdGhlIGVmZmVjdCBvZiBQYXNjYWxcJ3MgYGBmb3IgaSA6PSBhIHRvIGJcbmRvYGA7IGUuZy4sIGBgcmFuZ2UoMylgYCByZXR1cm5zIHRoZSBsaXN0IGBgWzAsIDEsIDJdYGAuXG5cbk5vdGU6IFRoZXJlIGlzIGEgc3VidGxldHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgYmVpbmcgbW9kaWZpZWQgYnkgdGhlIGxvb3BcbiAgKHRoaXMgY2FuIG9ubHkgb2NjdXIgZm9yIG11dGFibGUgc2VxdWVuY2VzLCBpLmUuIGxpc3RzKS4gQW4gaW50ZXJuYWxcbiAgY291bnRlciBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggaXRlbSBpcyB1c2VkIG5leHQsIGFuZCB0aGlzXG4gIGlzIGluY3JlbWVudGVkIG9uIGVhY2ggaXRlcmF0aW9uLiAgV2hlbiB0aGlzIGNvdW50ZXIgaGFzIHJlYWNoZWQgdGhlXG4gIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgdGhlIGxvb3AgdGVybWluYXRlcy4gIFRoaXMgbWVhbnMgdGhhdCBpZiB0aGVcbiAgc3VpdGUgZGVsZXRlcyB0aGUgY3VycmVudCAob3IgYSBwcmV2aW91cykgaXRlbSBmcm9tIHRoZSBzZXF1ZW5jZSxcbiAgdGhlIG5leHQgaXRlbSB3aWxsIGJlIHNraXBwZWQgKHNpbmNlIGl0IGdldHMgdGhlIGluZGV4IG9mIHRoZVxuICBjdXJyZW50IGl0ZW0gd2hpY2ggaGFzIGFscmVhZHkgYmVlbiB0cmVhdGVkKS4gIExpa2V3aXNlLCBpZiB0aGVcbiAgc3VpdGUgaW5zZXJ0cyBhbiBpdGVtIGluIHRoZSBzZXF1ZW5jZSBiZWZvcmUgdGhlIGN1cnJlbnQgaXRlbSwgdGhlXG4gIGN1cnJlbnQgaXRlbSB3aWxsIGJlIHRyZWF0ZWQgYWdhaW4gdGhlIG5leHQgdGltZSB0aHJvdWdoIHRoZSBsb29wLlxuICBUaGlzIGNhbiBsZWFkIHRvIG5hc3R5IGJ1Z3MgdGhhdCBjYW4gYmUgYXZvaWRlZCBieSBtYWtpbmcgYVxuICB0ZW1wb3JhcnkgY29weSB1c2luZyBhIHNsaWNlIG9mIHRoZSB3aG9sZSBzZXF1ZW5jZSwgZS5nLixcblxuICAgICBmb3IgeCBpbiBhWzpdOlxuICAgICAgICAgaWYgeCA8IDA6IGEucmVtb3ZlKHgpXG4nLAorICdmb3JtYXRzdHJpbmdzJzogJ1xuRm9ybWF0IFN0cmluZyBTeW50YXhcbioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBgYHN0ci5mb3JtYXQoKWBgIG1ldGhvZCBhbmQgdGhlIGBgRm9ybWF0dGVyYGAgY2xhc3Mgc2hhcmUgdGhlIHNhbWVcbnN5bnRheCBmb3IgZm9ybWF0IHN0cmluZ3MgKGFsdGhvdWdoIGluIHRoZSBjYXNlIG9mIGBgRm9ybWF0dGVyYGAsXG5zdWJjbGFzc2VzIGNhbiBkZWZpbmUgdGhlaXIgb3duIGZvcm1hdCBzdHJpbmcgc3ludGF4KS5cblxuRm9ybWF0IHN0cmluZ3MgY29udGFpbiAicmVwbGFjZW1lbnQgZmllbGRzIiBzdXJyb3VuZGVkIGJ5IGN1cmx5IGJyYWNlc1xuYGB7fWBgLiBBbnl0aGluZyB0aGF0IGlzIG5vdCBjb250YWluZWQgaW4gYnJhY2VzIGlzIGNvbnNpZGVyZWQgbGl0ZXJhbFxudGV4dCwgd2hpY2ggaXMgY29waWVkIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0LiAgSWYgeW91IG5lZWQgdG8gaW5jbHVkZVxuYSBicmFjZSBjaGFyYWN0ZXIgaW4gdGhlIGxpdGVyYWwgdGV4dCwgaXQgY2FuIGJlIGVzY2FwZWQgYnkgZG91Ymxpbmc6XG5gYHt7YGAgYW5kIGBgfX1gYC5cblxuVGhlIGdyYW1tYXIgZm9yIGEgcmVwbGFjZW1lbnQgZmllbGQgaXMgYXMgZm9sbG93czpcblxuICAgICAgcmVwbGFjZW1lbnRfZmllbGQgOjo9ICJ7IiBbZmllbGRfbmFtZV0gWyIhIiBjb252ZXJzaW9uXSBbIjoiIGZvcm1hdF9zcGVjXSAifSJcbiAgICAgIGZpZWxkX25hbWUgICAgICAgIDo6PSBhcmdfbmFtZSAoIi4iIGF0dHJpYnV0ZV9uYW1lIHwgIlsiIGVsZW1lbnRfaW5kZXggIl0iKSpcbiAgICAgIGFyZ19uYW1lICAgICAgICAgIDo6PSBbaWRlbnRpZmllciB8IGludGVnZXJdXG4gICAgICBhdHRyaWJ1dGVfbmFtZSAgICA6Oj0gaWRlbnRpZmllclxuICAgICAgZWxlbWVudF9pbmRleCAgICAgOjo9IGludGVnZXIgfCBpbmRleF9zdHJpbmdcbiAgICAgIGluZGV4X3N0cmluZyAgICAgIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJdIj4gK1xuICAgICAgY29udmVyc2lvbiAgICAgICAgOjo9ICJyIiB8ICJzIlxuICAgICAgZm9ybWF0X3NwZWMgICAgICAgOjo9IDxkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbj5cblxuSW4gbGVzcyBmb3JtYWwgdGVybXMsIHRoZSByZXBsYWNlbWVudCBmaWVsZCBjYW4gc3RhcnQgd2l0aCBhXG4qZmllbGRfbmFtZSogdGhhdCBzcGVjaWZpZXMgdGhlIG9iamVjdCB3aG9zZSB2YWx1ZSBpcyB0byBiZSBmb3JtYXR0ZWRcbmFuZCBpbnNlcnRlZCBpbnRvIHRoZSBvdXRwdXQgaW5zdGVhZCBvZiB0aGUgcmVwbGFjZW1lbnQgZmllbGQuIFRoZVxuKmZpZWxkX25hbWUqIGlzIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYSAgKmNvbnZlcnNpb24qIGZpZWxkLCB3aGljaCBpc1xucHJlY2VkZWQgYnkgYW4gZXhjbGFtYXRpb24gcG9pbnQgYGBcJyFcJ2BgLCBhbmQgYSAqZm9ybWF0X3NwZWMqLCB3aGljaFxuaXMgcHJlY2VkZWQgYnkgYSBjb2xvbiBgYFwnOlwnYGAuICBUaGVzZSBzcGVjaWZ5IGEgbm9uLWRlZmF1bHQgZm9ybWF0XG5mb3IgdGhlIHJlcGxhY2VtZW50IHZhbHVlLlxuXG5TZWUgYWxzbyB0aGUgKkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2UqIHNlY3Rpb24uXG5cblRoZSAqZmllbGRfbmFtZSogaXRzZWxmIGJlZ2lucyB3aXRoIGFuICphcmdfbmFtZSogdGhhdCBpcyBlaXRoZXIgYVxubnVtYmVyIG9yIGEga2V5d29yZC4gIElmIGl0XCdzIGEgbnVtYmVyLCBpdCByZWZlcnMgdG8gYSBwb3NpdGlvbmFsXG5hcmd1bWVudCwgYW5kIGlmIGl0XCdzIGEga2V5d29yZCwgaXQgcmVmZXJzIHRvIGEgbmFtZWQga2V5d29yZFxuYXJndW1lbnQuICBJZiB0aGUgbnVtZXJpY2FsIGFyZ19uYW1lcyBpbiBhIGZvcm1hdCBzdHJpbmcgYXJlIDAsIDEsIDIsXG4uLi4gaW4gc2VxdWVuY2UsIHRoZXkgY2FuIGFsbCBiZSBvbWl0dGVkIChub3QganVzdCBzb21lKSBhbmQgdGhlXG5udW1iZXJzIDAsIDEsIDIsIC4uLiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQgaW4gdGhhdCBvcmRlci5cbkJlY2F1c2UgKmFyZ19uYW1lKiBpcyBub3QgcXVvdGUtZGVsaW1pdGVkLCBpdCBpcyBub3QgcG9zc2libGUgdG9cbnNwZWNpZnkgYXJiaXRyYXJ5IGRpY3Rpb25hcnkga2V5cyAoZS5nLiwgdGhlIHN0cmluZ3MgYGBcJzEwXCdgYCBvclxuYGBcJzotXVwnYGApIHdpdGhpbiBhIGZvcm1hdCBzdHJpbmcuIFRoZSAqYXJnX25hbWUqIGNhbiBiZSBmb2xsb3dlZCBieVxuYW55IG51bWJlciBvZiBpbmRleCBvciBhdHRyaWJ1dGUgZXhwcmVzc2lvbnMuIEFuIGV4cHJlc3Npb24gb2YgdGhlXG5mb3JtIGBgXCcubmFtZVwnYGAgc2VsZWN0cyB0aGUgbmFtZWQgYXR0cmlidXRlIHVzaW5nIGBgZ2V0YXR0cigpYGAsXG53aGlsZSBhbiBleHByZXNzaW9uIG9mIHRoZSBmb3JtIGBgXCdbaW5kZXhdXCdgYCBkb2VzIGFuIGluZGV4IGxvb2t1cFxudXNpbmcgYGBfX2dldGl0ZW1fXygpYGAuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjc6IFRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50IHNwZWNpZmllcnMgY2FuIGJlXG5vbWl0dGVkLCBzbyBgYFwne30ge31cJ2BgIGlzIGVxdWl2YWxlbnQgdG8gYGBcJ3swfSB7MX1cJ2BgLlxuXG5Tb21lIHNpbXBsZSBmb3JtYXQgc3RyaW5nIGV4YW1wbGVzOlxuXG4gICAiRmlyc3QsIHRob3Ugc2hhbHQgY291bnQgdG8gezB9IiAjIFJlZmVyZW5jZXMgZmlyc3QgcG9zaXRpb25hbCBhcmd1bWVudFxuICAgIkJyaW5nIG1lIGEge30iICAgICAgICAgICAgICAgICAgIyBJbXBsaWNpdGx5IHJlZmVyZW5jZXMgdGhlIGZpcnN0IHBvc2l0aW9uYWwgYXJndW1lbnRcbiAgICJGcm9tIHt9IHRvIHt9IiAgICAgICAgICAgICAgICAgICMgU2FtZSBhcyAiRnJvbSB7MH0gdG8gezF9IlxuICAgIk15IHF1ZXN0IGlzIHtuYW1lfSIgICAgICAgICAgICAgIyBSZWZlcmVuY2VzIGtleXdvcmQgYXJndW1lbnQgXCduYW1lXCdcbiAgICJXZWlnaHQgaW4gdG9ucyB7MC53ZWlnaHR9IiAgICAgICMgXCd3ZWlnaHRcJyBhdHRyaWJ1dGUgb2YgZmlyc3QgcG9zaXRpb25hbCBhcmdcbiAgICJVbml0cyBkZXN0cm95ZWQ6IHtwbGF5ZXJzWzBdfSIgICMgRmlyc3QgZWxlbWVudCBvZiBrZXl3b3JkIGFyZ3VtZW50IFwncGxheWVyc1wnLlxuXG5UaGUgKmNvbnZlcnNpb24qIGZpZWxkIGNhdXNlcyBhIHR5cGUgY29lcmNpb24gYmVmb3JlIGZvcm1hdHRpbmcuXG5Ob3JtYWxseSwgdGhlIGpvYiBvZiBmb3JtYXR0aW5nIGEgdmFsdWUgaXMgZG9uZSBieSB0aGVcbmBgX19mb3JtYXRfXygpYGAgbWV0aG9kIG9mIHRoZSB2YWx1ZSBpdHNlbGYuICBIb3dldmVyLCBpbiBzb21lIGNhc2VzXG5pdCBpcyBkZXNpcmFibGUgdG8gZm9yY2UgYSB0eXBlIHRvIGJlIGZvcm1hdHRlZCBhcyBhIHN0cmluZyxcbm92ZXJyaWRpbmcgaXRzIG93biBkZWZpbml0aW9uIG9mIGZvcm1hdHRpbmcuICBCeSBjb252ZXJ0aW5nIHRoZSB2YWx1ZVxudG8gYSBzdHJpbmcgYmVmb3JlIGNhbGxpbmcgYGBfX2Zvcm1hdF9fKClgYCwgdGhlIG5vcm1hbCBmb3JtYXR0aW5nXG5sb2dpYyBpcyBieXBhc3NlZC5cblxuVHdvIGNvbnZlcnNpb24gZmxhZ3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6IGBgXCchc1wnYGAgd2hpY2ggY2FsbHNcbmBgc3RyKClgYCBvbiB0aGUgdmFsdWUsIGFuZCBgYFwnIXJcJ2BgIHdoaWNoIGNhbGxzIGBgcmVwcigpYGAuXG5cblNvbWUgZXhhbXBsZXM6XG5cbiAgICJIYXJvbGRcJ3MgYSBjbGV2ZXIgezAhc30iICAgICAgICAjIENhbGxzIHN0cigpIG9uIHRoZSBhcmd1bWVudCBmaXJzdFxuICAgIkJyaW5nIG91dCB0aGUgaG9seSB7bmFtZSFyfSIgICAgIyBDYWxscyByZXByKCkgb24gdGhlIGFyZ3VtZW50IGZpcnN0XG5cblRoZSAqZm9ybWF0X3NwZWMqIGZpZWxkIGNvbnRhaW5zIGEgc3BlY2lmaWNhdGlvbiBvZiBob3cgdGhlIHZhbHVlXG5zaG91bGQgYmUgcHJlc2VudGVkLCBpbmNsdWRpbmcgc3VjaCBkZXRhaWxzIGFzIGZpZWxkIHdpZHRoLCBhbGlnbm1lbnQsXG5wYWRkaW5nLCBkZWNpbWFsIHByZWNpc2lvbiBhbmQgc28gb24uICBFYWNoIHZhbHVlIHR5cGUgY2FuIGRlZmluZSBpdHNcbm93biAiZm9ybWF0dGluZyBtaW5pLWxhbmd1YWdlIiBvciBpbnRlcnByZXRhdGlvbiBvZiB0aGUgKmZvcm1hdF9zcGVjKi5cblxuTW9zdCBidWlsdC1pbiB0eXBlcyBzdXBwb3J0IGEgY29tbW9uIGZvcm1hdHRpbmcgbWluaS1sYW5ndWFnZSwgd2hpY2hcbmlzIGRlc2NyaWJlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLlxuXG5BICpmb3JtYXRfc3BlYyogZmllbGQgY2FuIGFsc28gaW5jbHVkZSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzXG53aXRoaW4gaXQuIFRoZXNlIG5lc3RlZCByZXBsYWNlbWVudCBmaWVsZHMgY2FuIGNvbnRhaW4gb25seSBhIGZpZWxkXG5uYW1lOyBjb252ZXJzaW9uIGZsYWdzIGFuZCBmb3JtYXQgc3BlY2lmaWNhdGlvbnMgYXJlIG5vdCBhbGxvd2VkLiAgVGhlXG5yZXBsYWNlbWVudCBmaWVsZHMgd2l0aGluIHRoZSBmb3JtYXRfc3BlYyBhcmUgc3Vic3RpdHV0ZWQgYmVmb3JlIHRoZVxuKmZvcm1hdF9zcGVjKiBzdHJpbmcgaXMgaW50ZXJwcmV0ZWQuIFRoaXMgYWxsb3dzIHRoZSBmb3JtYXR0aW5nIG9mIGFcbnZhbHVlIHRvIGJlIGR5bmFtaWNhbGx5IHNwZWNpZmllZC5cblxuU2VlIHRoZSAqRm9ybWF0IGV4YW1wbGVzKiBzZWN0aW9uIGZvciBzb21lIGV4YW1wbGVzLlxuXG5cbkZvcm1hdCBTcGVjaWZpY2F0aW9uIE1pbmktTGFuZ3VhZ2Vcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuIkZvcm1hdCBzcGVjaWZpY2F0aW9ucyIgYXJlIHVzZWQgd2l0aGluIHJlcGxhY2VtZW50IGZpZWxkcyBjb250YWluZWRcbndpdGhpbiBhIGZvcm1hdCBzdHJpbmcgdG8gZGVmaW5lIGhvdyBpbmRpdmlkdWFsIHZhbHVlcyBhcmUgcHJlc2VudGVkXG4oc2VlICpGb3JtYXQgU3RyaW5nIFN5bnRheCopLiAgVGhleSBjYW4gYWxzbyBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlXG5idWlsdC1pbiBgYGZvcm1hdCgpYGAgZnVuY3Rpb24uICBFYWNoIGZvcm1hdHRhYmxlIHR5cGUgbWF5IGRlZmluZSBob3dcbnRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyB0byBiZSBpbnRlcnByZXRlZC5cblxuTW9zdCBidWlsdC1pbiB0eXBlcyBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBvcHRpb25zIGZvciBmb3JtYXRcbnNwZWNpZmljYXRpb25zLCBhbHRob3VnaCBzb21lIG9mIHRoZSBmb3JtYXR0aW5nIG9wdGlvbnMgYXJlIG9ubHlcbnN1cHBvcnRlZCBieSB0aGUgbnVtZXJpYyB0eXBlcy5cblxuQSBnZW5lcmFsIGNvbnZlbnRpb24gaXMgdGhhdCBhbiBlbXB0eSBmb3JtYXQgc3RyaW5nIChgYCIiYGApIHByb2R1Y2VzXG50aGUgc2FtZSByZXN1bHQgYXMgaWYgeW91IGhhZCBjYWxsZWQgYGBzdHIoKWBgIG9uIHRoZSB2YWx1ZS4gQSBub24tXG5lbXB0eSBmb3JtYXQgc3RyaW5nIHR5cGljYWxseSBtb2RpZmllcyB0aGUgcmVzdWx0LlxuXG5UaGUgZ2VuZXJhbCBmb3JtIG9mIGEgKnN0YW5kYXJkIGZvcm1hdCBzcGVjaWZpZXIqIGlzOlxuXG4gICBmb3JtYXRfc3BlYyA6Oj0gW1tmaWxsXWFsaWduXVtzaWduXVsjXVswXVt3aWR0aF1bLF1bLnByZWNpc2lvbl1bdHlwZV1cbiAgIGZpbGwgICAgICAgIDo6PSA8YSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBcJ3tcJyBvciBcJ31cJz5cbiAgIGFsaWduICAgICAgIDo6PSAiPCIgfCAiPiIgfCAiPSIgfCAiXiJcbiAgIHNpZ24gICAgICAgIDo6PSAiKyIgfCAiLSIgfCAiICJcbiAgIHdpZHRoICAgICAgIDo6PSBpbnRlZ2VyXG4gICBwcmVjaXNpb24gICA6Oj0gaW50ZWdlclxuICAgdHlwZSAgICAgICAgOjo9ICJiIiB8ICJjIiB8ICJkIiB8ICJlIiB8ICJFIiB8ICJmIiB8ICJGIiB8ICJnIiB8ICJHIiB8ICJuIiB8ICJvIiB8ICJzIiB8ICJ4IiB8ICJYIiB8ICIlIlxuXG5UaGUgKmZpbGwqIGNoYXJhY3RlciBjYW4gYmUgYW55IGNoYXJhY3RlciBvdGhlciB0aGFuIFwne1wnIG9yIFwnfVwnLiAgVGhlXG5wcmVzZW5jZSBvZiBhIGZpbGwgY2hhcmFjdGVyIGlzIHNpZ25hbGVkIGJ5IHRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nXG5pdCwgd2hpY2ggbXVzdCBiZSBvbmUgb2YgdGhlIGFsaWdubWVudCBvcHRpb25zLiAgSWYgdGhlIHNlY29uZFxuY2hhcmFjdGVyIG9mICpmb3JtYXRfc3BlYyogaXMgbm90IGEgdmFsaWQgYWxpZ25tZW50IG9wdGlvbiwgdGhlbiBpdCBpc1xuYXNzdW1lZCB0aGF0IGJvdGggdGhlIGZpbGwgY2hhcmFjdGVyIGFuZCB0aGUgYWxpZ25tZW50IG9wdGlvbiBhcmVcbmFic2VudC5cblxuVGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYWxpZ25tZW50IG9wdGlvbnMgaXMgYXMgZm9sbG93czpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgT3B0aW9uICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCBgYFwnPFwnYGAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgbGVmdC1hbGlnbmVkIHdpdGhpbiB0aGUgYXZhaWxhYmxlICAgfFxuICAgfCAgICAgICAgICAgfCBzcGFjZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgbW9zdCBvYmplY3RzKS4gICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCc+XCdgYCAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSByaWdodC1hbGlnbmVkIHdpdGhpbiB0aGUgYXZhaWxhYmxlICB8XG4gICB8ICAgICAgICAgICB8IHNwYWNlICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBudW1iZXJzKS4gICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJz1cJ2BgICAgfCBGb3JjZXMgdGhlIHBhZGRpbmcgdG8gYmUgcGxhY2VkIGFmdGVyIHRoZSBzaWduIChpZiBhbnkpICAgIHxcbiAgIHwgICAgICAgICAgIHwgYnV0IGJlZm9yZSB0aGUgZGlnaXRzLiAgVGhpcyBpcyB1c2VkIGZvciBwcmludGluZyBmaWVsZHMgICB8XG4gICB8ICAgICAgICAgICB8IGluIHRoZSBmb3JtIFwnKzAwMDAwMDEyMFwnLiBUaGlzIGFsaWdubWVudCBvcHRpb24gaXMgb25seSAgICB8XG4gICB8ICAgICAgICAgICB8IHZhbGlkIGZvciBudW1lcmljIHR5cGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ15cJ2BgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIGNlbnRlcmVkIHdpdGhpbiB0aGUgYXZhaWxhYmxlICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgc3BhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5Ob3RlIHRoYXQgdW5sZXNzIGEgbWluaW11bSBmaWVsZCB3aWR0aCBpcyBkZWZpbmVkLCB0aGUgZmllbGQgd2lkdGhcbndpbGwgYWx3YXlzIGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIGRhdGEgdG8gZmlsbCBpdCwgc28gdGhhdCB0aGVcbmFsaWdubWVudCBvcHRpb24gaGFzIG5vIG1lYW5pbmcgaW4gdGhpcyBjYXNlLlxuXG5UaGUgKnNpZ24qIG9wdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBudW1iZXIgdHlwZXMsIGFuZCBjYW4gYmUgb25lIG9mXG50aGUgZm9sbG93aW5nOlxuXG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBPcHRpb24gICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICs9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG4gICB8IGBgXCcrXCdgYCAgIHwgaW5kaWNhdGVzIHRoYXQgYSBzaWduIHNob3VsZCBiZSB1c2VkIGZvciBib3RoIHBvc2l0aXZlIGFzICB8XG4gICB8ICAgICAgICAgICB8IHdlbGwgYXMgbmVnYXRpdmUgbnVtYmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJy1cJ2BgICAgfCBpbmRpY2F0ZXMgdGhhdCBhIHNpZ24gc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgbmVnYXRpdmUgICAgIHxcbiAgIHwgICAgICAgICAgIHwgbnVtYmVycyAodGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvcikuICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBzcGFjZSAgICAgfCBpbmRpY2F0ZXMgdGhhdCBhIGxlYWRpbmcgc3BhY2Ugc2hvdWxkIGJlIHVzZWQgb24gcG9zaXRpdmUgIHxcbiAgIHwgICAgICAgICAgIHwgbnVtYmVycywgYW5kIGEgbWludXMgc2lnbiBvbiBuZWdhdGl2ZSBudW1iZXJzLiAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5UaGUgYGBcJyNcJ2BgIG9wdGlvbiBpcyBvbmx5IHZhbGlkIGZvciBpbnRlZ2VycywgYW5kIG9ubHkgZm9yIGJpbmFyeSxcbm9jdGFsLCBvciBoZXhhZGVjaW1hbCBvdXRwdXQuICBJZiBwcmVzZW50LCBpdCBzcGVjaWZpZXMgdGhhdCB0aGVcbm91dHB1dCB3aWxsIGJlIHByZWZpeGVkIGJ5IGBgXCcwYlwnYGAsIGBgXCcwb1wnYGAsIG9yIGBgXCcweFwnYGAsXG5yZXNwZWN0aXZlbHkuXG5cblRoZSBgYFwnLFwnYGAgb3B0aW9uIHNpZ25hbHMgdGhlIHVzZSBvZiBhIGNvbW1hIGZvciBhIHRob3VzYW5kc1xuc2VwYXJhdG9yLiBGb3IgYSBsb2NhbGUgYXdhcmUgc2VwYXJhdG9yLCB1c2UgdGhlIGBgXCduXCdgYCBpbnRlZ2VyXG5wcmVzZW50YXRpb24gdHlwZSBpbnN0ZWFkLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi43OiBBZGRlZCB0aGUgYGBcJyxcJ2BgIG9wdGlvbiAoc2VlIGFsc28gKipQRVBcbjM3OCoqKS5cblxuKndpZHRoKiBpcyBhIGRlY2ltYWwgaW50ZWdlciBkZWZpbmluZyB0aGUgbWluaW11bSBmaWVsZCB3aWR0aC4gIElmIG5vdFxuc3BlY2lmaWVkLCB0aGVuIHRoZSBmaWVsZCB3aWR0aCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGNvbnRlbnQuXG5cblByZWNlZGluZyB0aGUgKndpZHRoKiBmaWVsZCBieSBhIHplcm8gKGBgXCcwXCdgYCkgY2hhcmFjdGVyIGVuYWJsZXNcbnNpZ24tYXdhcmUgemVyby1wYWRkaW5nIGZvciBudW1lcmljIHR5cGVzLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGFcbipmaWxsKiBjaGFyYWN0ZXIgb2YgYGBcJzBcJ2BgIHdpdGggYW4gKmFsaWdubWVudCogdHlwZSBvZiBgYFwnPVwnYGAuXG5cblRoZSAqcHJlY2lzaW9uKiBpcyBhIGRlY2ltYWwgbnVtYmVyIGluZGljYXRpbmcgaG93IG1hbnkgZGlnaXRzIHNob3VsZFxuYmUgZGlzcGxheWVkIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IGZvciBhIGZsb2F0aW5nIHBvaW50IHZhbHVlXG5mb3JtYXR0ZWQgd2l0aCBgYFwnZlwnYGAgYW5kIGBgXCdGXCdgYCwgb3IgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjaW1hbFxucG9pbnQgZm9yIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgZm9ybWF0dGVkIHdpdGggYGBcJ2dcJ2BgIG9yIGBgXCdHXCdgYC5cbkZvciBub24tbnVtYmVyIHR5cGVzIHRoZSBmaWVsZCBpbmRpY2F0ZXMgdGhlIG1heGltdW0gZmllbGQgc2l6ZSAtIGluXG5vdGhlciB3b3JkcywgaG93IG1hbnkgY2hhcmFjdGVycyB3aWxsIGJlIHVzZWQgZnJvbSB0aGUgZmllbGQgY29udGVudC5cblRoZSAqcHJlY2lzaW9uKiBpcyBub3QgYWxsb3dlZCBmb3IgaW50ZWdlciB2YWx1ZXMuXG5cbkZpbmFsbHksIHRoZSAqdHlwZSogZGV0ZXJtaW5lcyBob3cgdGhlIGRhdGEgc2hvdWxkIGJlIHByZXNlbnRlZC5cblxuVGhlIGF2YWlsYWJsZSBzdHJpbmcgcHJlc2VudGF0aW9uIHR5cGVzIGFyZTpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCBgYFwnc1wnYGAgICB8IFN0cmluZyBmb3JtYXQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdHlwZSBmb3Igc3RyaW5ncyBhbmQgICAgfFxuICAgfCAgICAgICAgICAgfCBtYXkgYmUgb21pdHRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzIGBgXCdzXCdgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5UaGUgYXZhaWxhYmxlIGludGVnZXIgcHJlc2VudGF0aW9uIHR5cGVzIGFyZTpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCBgYFwnYlwnYGAgICB8IEJpbmFyeSBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDIuICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ2NcJ2BgICAgfCBDaGFyYWN0ZXIuIENvbnZlcnRzIHRoZSBpbnRlZ2VyIHRvIHRoZSBjb3JyZXNwb25kaW5nICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgdW5pY29kZSBjaGFyYWN0ZXIgYmVmb3JlIHByaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnZFwnYGAgICB8IERlY2ltYWwgSW50ZWdlci4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMTAuICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ29cJ2BgICAgfCBPY3RhbCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDguICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCd4XCdgYCAgIHwgSGV4IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMTYsIHVzaW5nIGxvd2VyLSAgICB8XG4gICB8ICAgICAgICAgICB8IGNhc2UgbGV0dGVycyBmb3IgdGhlIGRpZ2l0cyBhYm92ZSA5LiAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ1hcJ2BgICAgfCBIZXggZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAxNiwgdXNpbmcgdXBwZXItICAgIHxcbiAgIHwgICAgICAgICAgIHwgY2FzZSBsZXR0ZXJzIGZvciB0aGUgZGlnaXRzIGFib3ZlIDkuICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnblwnYGAgICB8IE51bWJlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyBgYFwnZFwnYGAsIGV4Y2VwdCB0aGF0IGl0IHVzZXMgICB8XG4gICB8ICAgICAgICAgICB8IHRoZSBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgYXBwcm9wcmlhdGUgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBudW1iZXIgc2VwYXJhdG9yIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzIGBgXCdkXCdgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5JbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgcHJlc2VudGF0aW9uIHR5cGVzLCBpbnRlZ2VycyBjYW4gYmUgZm9ybWF0dGVkXG53aXRoIHRoZSBmbG9hdGluZyBwb2ludCBwcmVzZW50YXRpb24gdHlwZXMgbGlzdGVkIGJlbG93IChleGNlcHRcbmBgXCduXCdgYCBhbmQgTm9uZSkuIFdoZW4gZG9pbmcgc28sIGBgZmxvYXQoKWBgIGlzIHVzZWQgdG8gY29udmVydCB0aGVcbmludGVnZXIgdG8gYSBmbG9hdGluZyBwb2ludCBudW1iZXIgYmVmb3JlIGZvcm1hdHRpbmcuXG5cblRoZSBhdmFpbGFibGUgcHJlc2VudGF0aW9uIHR5cGVzIGZvciBmbG9hdGluZyBwb2ludCBhbmQgZGVjaW1hbCB2YWx1ZXNcbmFyZTpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgVHlwZSAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCBgYFwnZVwnYGAgICB8IEV4cG9uZW50IG5vdGF0aW9uLiBQcmludHMgdGhlIG51bWJlciBpbiBzY2llbnRpZmljICAgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBub3RhdGlvbiB1c2luZyB0aGUgbGV0dGVyIFwnZVwnIHRvIGluZGljYXRlIHRoZSBleHBvbmVudC4gICAgfFxuICAgfCAgICAgICAgICAgfCBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgYGA2YGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdFXCdgYCAgIHwgRXhwb25lbnQgbm90YXRpb24uIFNhbWUgYXMgYGBcJ2VcJ2BgIGV4Y2VwdCBpdCB1c2VzIGFuIHVwcGVyIHxcbiAgIHwgICAgICAgICAgIHwgY2FzZSBcJ0VcJyBhcyB0aGUgc2VwYXJhdG9yIGNoYXJhY3Rlci4gICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdmXCdgYCAgIHwgRml4ZWQgcG9pbnQuIERpc3BsYXlzIHRoZSBudW1iZXIgYXMgYSBmaXhlZC1wb2ludCBudW1iZXIuICB8XG4gICB8ICAgICAgICAgICB8IFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyBgYDZgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ0ZcJ2BgICAgfCBGaXhlZCBwb2ludC4gU2FtZSBhcyBgYFwnZlwnYGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ2dcJ2BgICAgfCBHZW5lcmFsIGZvcm1hdC4gIEZvciBhIGdpdmVuIHByZWNpc2lvbiBgYHAgPj0gMWBgLCB0aGlzICAgIHxcbiAgIHwgICAgICAgICAgIHwgcm91bmRzIHRoZSBudW1iZXIgdG8gYGBwYGAgc2lnbmlmaWNhbnQgZGlnaXRzIGFuZCB0aGVuICAgICB8XG4gICB8ICAgICAgICAgICB8IGZvcm1hdHMgdGhlIHJlc3VsdCBpbiBlaXRoZXIgZml4ZWQtcG9pbnQgZm9ybWF0IG9yIGluICAgICAgfFxuICAgfCAgICAgICAgICAgfCBzY2llbnRpZmljIG5vdGF0aW9uLCBkZXBlbmRpbmcgb24gaXRzIG1hZ25pdHVkZS4gIFRoZSAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgcHJlY2lzZSBydWxlcyBhcmUgYXMgZm9sbG93czogc3VwcG9zZSB0aGF0IHRoZSByZXN1bHQgICAgICB8XG4gICB8ICAgICAgICAgICB8IGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlIGBgXCdlXCdgYCBhbmQgcHJlY2lzaW9uICAgICB8XG4gICB8ICAgICAgICAgICB8IGBgcC0xYGAgd291bGQgaGF2ZSBleHBvbmVudCBgYGV4cGBgLiAgVGhlbiBpZiBgYC00IDw9IGV4cCAgfFxuICAgfCAgICAgICAgICAgfCA8IHBgYCwgdGhlIG51bWJlciBpcyBmb3JtYXR0ZWQgd2l0aCBwcmVzZW50YXRpb24gdHlwZSAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgYGBcJ2ZcJ2BgIGFuZCBwcmVjaXNpb24gYGBwLTEtZXhwYGAuIE90aGVyd2lzZSwgdGhlIG51bWJlciAgIHxcbiAgIHwgICAgICAgICAgIHwgaXMgZm9ybWF0dGVkIHdpdGggcHJlc2VudGF0aW9uIHR5cGUgYGBcJ2VcJ2BgIGFuZCBwcmVjaXNpb24gIHxcbiAgIHwgICAgICAgICAgIHwgYGBwLTFgYC4gSW4gYm90aCBjYXNlcyBpbnNpZ25pZmljYW50IHRyYWlsaW5nIHplcm9zIGFyZSAgICB8XG4gICB8ICAgICAgICAgICB8IHJlbW92ZWQgZnJvbSB0aGUgc2lnbmlmaWNhbmQsIGFuZCB0aGUgZGVjaW1hbCBwb2ludCBpcyAgICAgfFxuICAgfCAgICAgICAgICAgfCBhbHNvIHJlbW92ZWQgaWYgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBkaWdpdHMgZm9sbG93aW5nICAgIHxcbiAgIHwgICAgICAgICAgIHwgaXQuICBQb3NpdGl2ZSBhbmQgbmVnYXRpdmUgaW5maW5pdHksIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB8XG4gICB8ICAgICAgICAgICB8IHplcm8sIGFuZCBuYW5zLCBhcmUgZm9ybWF0dGVkIGFzIGBgaW5mYGAsIGBgLWluZmBgLCBgYDBgYCwgfFxuICAgfCAgICAgICAgICAgfCBgYC0wYGAgYW5kIGBgbmFuYGAgcmVzcGVjdGl2ZWx5LCByZWdhcmRsZXNzIG9mIHRoZSAgICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgcHJlY2lzaW9uLiAgQSBwcmVjaXNpb24gb2YgYGAwYGAgaXMgdHJlYXRlZCBhcyBlcXVpdmFsZW50ICB8XG4gICB8ICAgICAgICAgICB8IHRvIGEgcHJlY2lzaW9uIG9mIGBgMWBgLiAgVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzIGBgNmBgLiAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ0dcJ2BgICAgfCBHZW5lcmFsIGZvcm1hdC4gU2FtZSBhcyBgYFwnZ1wnYGAgZXhjZXB0IHN3aXRjaGVzIHRvIGBgXCdFXCdgYCB8XG4gICB8ICAgICAgICAgICB8IGlmIHRoZSBudW1iZXIgZ2V0cyB0b28gbGFyZ2UuIFRoZSByZXByZXNlbnRhdGlvbnMgb2YgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBpbmZpbml0eSBhbmQgTmFOIGFyZSB1cHBlcmNhc2VkLCB0b28uICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCduXCdgYCAgIHwgTnVtYmVyLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGBgXCdnXCdgYCwgZXhjZXB0IHRoYXQgaXQgdXNlcyAgIHxcbiAgIHwgICAgICAgICAgIHwgdGhlIGN1cnJlbnQgbG9jYWxlIHNldHRpbmcgdG8gaW5zZXJ0IHRoZSBhcHByb3ByaWF0ZSAgICAgICB8XG4gICB8ICAgICAgICAgICB8IG51bWJlciBzZXBhcmF0b3IgY2hhcmFjdGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJyVcJ2BgICAgfCBQZXJjZW50YWdlLiBNdWx0aXBsaWVzIHRoZSBudW1iZXIgYnkgMTAwIGFuZCBkaXNwbGF5cyBpbiAgIHxcbiAgIHwgICAgICAgICAgIHwgZml4ZWQgKGBgXCdmXCdgYCkgZm9ybWF0LCBmb2xsb3dlZCBieSBhIHBlcmNlbnQgc2lnbi4gICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE5vbmUgICAgICB8IFRoZSBzYW1lIGFzIGBgXCdnXCdgYC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5cbkZvcm1hdCBleGFtcGxlc1xuPT09PT09PT09PT09PT09XG5cblRoaXMgc2VjdGlvbiBjb250YWlucyBleGFtcGxlcyBvZiB0aGUgbmV3IGZvcm1hdCBzeW50YXggYW5kIGNvbXBhcmlzb25cbndpdGggdGhlIG9sZCBgYCVgYC1mb3JtYXR0aW5nLlxuXG5JbiBtb3N0IG9mIHRoZSBjYXNlcyB0aGUgc3ludGF4IGlzIHNpbWlsYXIgdG8gdGhlIG9sZFxuYGAlYGAtZm9ybWF0dGluZywgd2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlIGBge31gYCBhbmQgd2l0aCBgYDpgYCB1c2VkXG5pbnN0ZWFkIG9mIGBgJWBgLiBGb3IgZXhhbXBsZSwgYGBcJyUwMy4yZlwnYGAgY2FuIGJlIHRyYW5zbGF0ZWQgdG9cbmBgXCd7OjAzLjJmfVwnYGAuXG5cblRoZSBuZXcgZm9ybWF0IHN5bnRheCBhbHNvIHN1cHBvcnRzIG5ldyBhbmQgZGlmZmVyZW50IG9wdGlvbnMsIHNob3duXG5pbiB0aGUgZm9sbG93IGV4YW1wbGVzLlxuXG5BY2Nlc3NpbmcgYXJndW1lbnRzIGJ5IHBvc2l0aW9uOlxuXG4gICA+Pj4gXCd7MH0sIHsxfSwgezJ9XCcuZm9ybWF0KFwnYVwnLCBcJ2JcJywgXCdjXCcpXG4gICBcJ2EsIGIsIGNcJ1xuICAgPj4+IFwne30sIHt9LCB7fVwnLmZvcm1hdChcJ2FcJywgXCdiXCcsIFwnY1wnKSAgIyAyLjcrIG9ubHlcbiAgIFwnYSwgYiwgY1wnXG4gICA+Pj4gXCd7Mn0sIHsxfSwgezB9XCcuZm9ybWF0KFwnYVwnLCBcJ2JcJywgXCdjXCcpXG4gICBcJ2MsIGIsIGFcJ1xuICAgPj4+IFwnezJ9LCB7MX0sIHswfVwnLmZvcm1hdCgqXCdhYmNcJykgICAgICAjIHVucGFja2luZyBhcmd1bWVudCBzZXF1ZW5jZVxuICAgXCdjLCBiLCBhXCdcbiAgID4+PiBcJ3swfXsxfXswfVwnLmZvcm1hdChcJ2FicmFcJywgXCdjYWRcJykgICAjIGFyZ3VtZW50c1wnIGluZGljZXMgY2FuIGJlIHJlcGVhdGVkXG4gICBcJ2FicmFjYWRhYnJhXCdcblxuQWNjZXNzaW5nIGFyZ3VtZW50cyBieSBuYW1lOlxuXG4gICA+Pj4gXCdDb29yZGluYXRlczoge2xhdGl0dWRlfSwge2xvbmdpdHVkZX1cJy5mb3JtYXQobGF0aXR1ZGU9XCczNy4yNE5cJywgbG9uZ2l0dWRlPVwnLTExNS44MVdcJylcbiAgIFwnQ29vcmRpbmF0ZXM6IDM3LjI0TiwgLTExNS44MVdcJ1xuICAgPj4+IGNvb3JkID0ge1wnbGF0aXR1ZGVcJzogXCczNy4yNE5cJywgXCdsb25naXR1ZGVcJzogXCctMTE1LjgxV1wnfVxuICAgPj4+IFwnQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sIHtsb25naXR1ZGV9XCcuZm9ybWF0KCoqY29vcmQpXG4gICBcJ0Nvb3JkaW5hdGVzOiAzNy4yNE4sIC0xMTUuODFXXCdcblxuQWNjZXNzaW5nIGFyZ3VtZW50c1wnIGF0dHJpYnV0ZXM6XG5cbiAgID4+PiBjID0gMy01alxuICAgPj4+IChcJ1RoZSBjb21wbGV4IG51bWJlciB7MH0gaXMgZm9ybWVkIGZyb20gdGhlIHJlYWwgcGFydCB7MC5yZWFsfSBcJ1xuICAgLi4uICBcJ2FuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgezAuaW1hZ30uXCcpLmZvcm1hdChjKVxuICAgXCdUaGUgY29tcGxleCBudW1iZXIgKDMtNWopIGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsIHBhcnQgMy4wIGFuZCB0aGUgaW1hZ2luYXJ5IHBhcnQgLTUuMC5cJ1xuICAgPj4+IGNsYXNzIFBvaW50KG9iamVjdCk6XG4gICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4LCB5KTpcbiAgIC4uLiAgICAgICAgIHNlbGYueCwgc2VsZi55ID0geCwgeVxuICAgLi4uICAgICBkZWYgX19zdHJfXyhzZWxmKTpcbiAgIC4uLiAgICAgICAgIHJldHVybiBcJ1BvaW50KHtzZWxmLnh9LCB7c2VsZi55fSlcJy5mb3JtYXQoc2VsZj1zZWxmKVxuICAgLi4uXG4gICA+Pj4gc3RyKFBvaW50KDQsIDIpKVxuICAgXCdQb2ludCg0LCAyKVwnXG5cbkFjY2Vzc2luZyBhcmd1bWVudHNcJyBpdGVtczpcblxuICAgPj4+IGNvb3JkID0gKDMsIDUpXG4gICA+Pj4gXCdYOiB7MFswXX07ICBZOiB7MFsxXX1cJy5mb3JtYXQoY29vcmQpXG4gICBcJ1g6IDM7ICBZOiA1XCdcblxuUmVwbGFjaW5nIGBgJXNgYCBhbmQgYGAlcmBgOlxuXG4gICA+Pj4gInJlcHIoKSBzaG93cyBxdW90ZXM6IHshcn07IHN0cigpIGRvZXNuXCd0OiB7IXN9Ii5mb3JtYXQoXCd0ZXN0MVwnLCBcJ3Rlc3QyXCcpXG4gICAicmVwcigpIHNob3dzIHF1b3RlczogXCd0ZXN0MVwnOyBzdHIoKSBkb2VzblwndDogdGVzdDIiXG5cbkFsaWduaW5nIHRoZSB0ZXh0IGFuZCBzcGVjaWZ5aW5nIGEgd2lkdGg6XG5cbiAgID4+PiBcJ3s6PDMwfVwnLmZvcm1hdChcJ2xlZnQgYWxpZ25lZFwnKVxuICAgXCdsZWZ0IGFsaWduZWQgICAgICAgICAgICAgICAgICBcJ1xuICAgPj4+IFwnezo+MzB9XCcuZm9ybWF0KFwncmlnaHQgYWxpZ25lZFwnKVxuICAgXCcgICAgICAgICAgICAgICAgIHJpZ2h0IGFsaWduZWRcJ1xuICAgPj4+IFwnezpeMzB9XCcuZm9ybWF0KFwnY2VudGVyZWRcJylcbiAgIFwnICAgICAgICAgICBjZW50ZXJlZCAgICAgICAgICAgXCdcbiAgID4+PiBcJ3s6Kl4zMH1cJy5mb3JtYXQoXCdjZW50ZXJlZFwnKSAgIyB1c2UgXCcqXCcgYXMgYSBmaWxsIGNoYXJcbiAgIFwnKioqKioqKioqKipjZW50ZXJlZCoqKioqKioqKioqXCdcblxuUmVwbGFjaW5nIGBgJStmYGAsIGBgJS1mYGAsIGFuZCBgYCUgZmBgIGFuZCBzcGVjaWZ5aW5nIGEgc2lnbjpcblxuICAgPj4+IFwnezorZn07IHs6K2Z9XCcuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IGl0IGFsd2F5c1xuICAgXCcrMy4xNDAwMDA7IC0zLjE0MDAwMFwnXG4gICA+Pj4gXCd7OiBmfTsgezogZn1cJy5mb3JtYXQoMy4xNCwgLTMuMTQpICAjIHNob3cgYSBzcGFjZSBmb3IgcG9zaXRpdmUgbnVtYmVyc1xuICAgXCcgMy4xNDAwMDA7IC0zLjE0MDAwMFwnXG4gICA+Pj4gXCd7Oi1mfTsgezotZn1cJy5mb3JtYXQoMy4xNCwgLTMuMTQpICAjIHNob3cgb25seSB0aGUgbWludXMgLS0gc2FtZSBhcyBcJ3s6Zn07IHs6Zn1cJ1xuICAgXCczLjE0MDAwMDsgLTMuMTQwMDAwXCdcblxuUmVwbGFjaW5nIGBgJXhgYCBhbmQgYGAlb2BgIGFuZCBjb252ZXJ0aW5nIHRoZSB2YWx1ZSB0byBkaWZmZXJlbnRcbmJhc2VzOlxuXG4gICA+Pj4gIyBmb3JtYXQgYWxzbyBzdXBwb3J0cyBiaW5hcnkgbnVtYmVyc1xuICAgPj4+ICJpbnQ6IHswOmR9OyAgaGV4OiB7MDp4fTsgIG9jdDogezA6b307ICBiaW46IHswOmJ9Ii5mb3JtYXQoNDIpXG4gICBcJ2ludDogNDI7ICBoZXg6IDJhOyAgb2N0OiA1MjsgIGJpbjogMTAxMDEwXCdcbiAgID4+PiAjIHdpdGggMHgsIDBvLCBvciAwYiBhcyBwcmVmaXg6XG4gICA+Pj4gImludDogezA6ZH07ICBoZXg6IHswOiN4fTsgIG9jdDogezA6I299OyAgYmluOiB7MDojYn0iLmZvcm1hdCg0MilcbiAgIFwnaW50OiA0MjsgIGhleDogMHgyYTsgIG9jdDogMG81MjsgIGJpbjogMGIxMDEwMTBcJ1xuXG5Vc2luZyB0aGUgY29tbWEgYXMgYSB0aG91c2FuZHMgc2VwYXJhdG9yOlxuXG4gICA+Pj4gXCd7Oix9XCcuZm9ybWF0KDEyMzQ1Njc4OTApXG4gICBcJzEsMjM0LDU2Nyw4OTBcJ1xuXG5FeHByZXNzaW5nIGEgcGVyY2VudGFnZTpcblxuICAgPj4+IHBvaW50cyA9IDE5LjVcbiAgID4+PiB0b3RhbCA9IDIyXG4gICA+Pj4gXCdDb3JyZWN0IGFuc3dlcnM6IHs6LjIlfVwnLmZvcm1hdChwb2ludHMvdG90YWwpXG4gICBcJ0NvcnJlY3QgYW5zd2VyczogODguNjQlXCdcblxuVXNpbmcgdHlwZS1zcGVjaWZpYyBmb3JtYXR0aW5nOlxuXG4gICA+Pj4gaW1wb3J0IGRhdGV0aW1lXG4gICA+Pj4gZCA9IGRhdGV0aW1lLmRhdGV0aW1lKDIwMTAsIDcsIDQsIDEyLCAxNSwgNTgpXG4gICA+Pj4gXCd7OiVZLSVtLSVkICVIOiVNOiVTfVwnLmZvcm1hdChkKVxuICAgXCcyMDEwLTA3LTA0IDEyOjE1OjU4XCdcblxuTmVzdGluZyBhcmd1bWVudHMgYW5kIG1vcmUgY29tcGxleCBleGFtcGxlczpcblxuICAgPj4+IGZvciBhbGlnbiwgdGV4dCBpbiB6aXAoXCc8Xj5cJywgW1wnbGVmdFwnLCBcJ2NlbnRlclwnLCBcJ3JpZ2h0XCddKTpcbiAgIC4uLiAgICAgXCd7MDp7ZmlsbH17YWxpZ259MTZ9XCcuZm9ybWF0KHRleHQsIGZpbGw9YWxpZ24sIGFsaWduPWFsaWduKVxuICAgLi4uXG4gICBcJ2xlZnQ8PDw8PDw8PDw8PDxcJ1xuICAgXCdeXl5eXmNlbnRlcl5eXl5eXCdcbiAgIFwnPj4+Pj4+Pj4+Pj5yaWdodFwnXG4gICA+Pj5cbiAgID4+PiBvY3RldHMgPSBbMTkyLCAxNjgsIDAsIDFdXG4gICA+Pj4gXCd7OjAyWH17OjAyWH17OjAyWH17OjAyWH1cJy5mb3JtYXQoKm9jdGV0cylcbiAgIFwnQzBBODAwMDFcJ1xuICAgPj4+IGludChfLCAxNilcbiAgIDMyMzIyMzU1MjFcbiAgID4+PlxuICAgPj4+IHdpZHRoID0gNVxuICAgPj4+IGZvciBudW0gaW4gcmFuZ2UoNSwxMik6XG4gICAuLi4gICAgIGZvciBiYXNlIGluIFwnZFhvYlwnOlxuICAgLi4uICAgICAgICAgcHJpbnQgXCd7MDp7d2lkdGh9e2Jhc2V9fVwnLmZvcm1hdChudW0sIGJhc2U9YmFzZSwgd2lkdGg9d2lkdGgpLFxuICAgLi4uICAgICBwcmludFxuICAgLi4uXG4gICAgICAgNSAgICAgNSAgICAgNSAgIDEwMVxuICAgICAgIDYgICAgIDYgICAgIDYgICAxMTBcbiAgICAgICA3ICAgICA3ICAgICA3ICAgMTExXG4gICAgICAgOCAgICAgOCAgICAxMCAgMTAwMFxuICAgICAgIDkgICAgIDkgICAgMTEgIDEwMDFcbiAgICAgIDEwICAgICBBICAgIDEyICAxMDEwXG4gICAgICAxMSAgICAgQiAgICAxMyAgMTAxMVxuJywKKyAnZnVuY3Rpb24nOiAnXG5GdW5jdGlvbiBkZWZpbml0aW9uc1xuKioqKioqKioqKioqKioqKioqKipcblxuQSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IChzZWVcbnNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopOlxuXG4gICBkZWNvcmF0ZWQgICAgICA6Oj0gZGVjb3JhdG9ycyAoY2xhc3NkZWYgfCBmdW5jZGVmKVxuICAgZGVjb3JhdG9ycyAgICAgOjo9IGRlY29yYXRvcitcbiAgIGRlY29yYXRvciAgICAgIDo6PSAiQCIgZG90dGVkX25hbWUgWyIoIiBbYXJndW1lbnRfbGlzdCBbIiwiXV0gIikiXSBORVdMSU5FXG4gICBmdW5jZGVmICAgICAgICA6Oj0gImRlZiIgZnVuY25hbWUgIigiIFtwYXJhbWV0ZXJfbGlzdF0gIikiICI6IiBzdWl0ZVxuICAgZG90dGVkX25hbWUgICAgOjo9IGlkZW50aWZpZXIgKCIuIiBpZGVudGlmaWVyKSpcbiAgIHBhcmFtZXRlcl9saXN0IDo6PSAoZGVmcGFyYW1ldGVyICIsIikqXG4gICAgICAgICAgICAgICAgICAgICAgKCAgIioiIGlkZW50aWZpZXIgWyIsIiAiKioiIGlkZW50aWZpZXJdXG4gICAgICAgICAgICAgICAgICAgICAgfCAiKioiIGlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAgICAgICB8IGRlZnBhcmFtZXRlciBbIiwiXSApXG4gICBkZWZwYXJhbWV0ZXIgICA6Oj0gcGFyYW1ldGVyIFsiPSIgZXhwcmVzc2lvbl1cbiAgIHN1Ymxpc3QgICAgICAgIDo6PSBwYXJhbWV0ZXIgKCIsIiBwYXJhbWV0ZXIpKiBbIiwiXVxuICAgcGFyYW1ldGVyICAgICAgOjo9IGlkZW50aWZpZXIgfCAiKCIgc3VibGlzdCAiKSJcbiAgIGZ1bmNuYW1lICAgICAgIDo6PSBpZGVudGlmaWVyXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0cyBleGVjdXRpb24gYmluZHNcbnRoZSBmdW5jdGlvbiBuYW1lIGluIHRoZSBjdXJyZW50IGxvY2FsIG5hbWVzcGFjZSB0byBhIGZ1bmN0aW9uIG9iamVjdFxuKGEgd3JhcHBlciBhcm91bmQgdGhlIGV4ZWN1dGFibGUgY29kZSBmb3IgdGhlIGZ1bmN0aW9uKS4gIFRoaXNcbmZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBnbG9iYWwgbmFtZXNwYWNlXG5hcyB0aGUgZ2xvYmFsIG5hbWVzcGFjZSB0byBiZSB1c2VkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC5cblxuVGhlIGZ1bmN0aW9uIGRlZmluaXRpb24gZG9lcyBub3QgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gYm9keTsgdGhpcyBnZXRzXG5leGVjdXRlZCBvbmx5IHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4gWzNdXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBtYXkgYmUgd3JhcHBlZCBieSBvbmUgb3IgbW9yZSAqZGVjb3JhdG9yKlxuZXhwcmVzc2lvbnMuIERlY29yYXRvciBleHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGlzXG5kZWZpbmVkLCBpbiB0aGUgc2NvcGUgdGhhdCBjb250YWlucyB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIFRoZVxucmVzdWx0IG11c3QgYmUgYSBjYWxsYWJsZSwgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSBmdW5jdGlvbiBvYmplY3RcbmFzIHRoZSBvbmx5IGFyZ3VtZW50LiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgYm91bmQgdG8gdGhlIGZ1bmN0aW9uIG5hbWVcbmluc3RlYWQgb2YgdGhlIGZ1bmN0aW9uIG9iamVjdC4gIE11bHRpcGxlIGRlY29yYXRvcnMgYXJlIGFwcGxpZWQgaW5cbm5lc3RlZCBmYXNoaW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlOlxuXG4gICBAZjEoYXJnKVxuICAgQGYyXG4gICBkZWYgZnVuYygpOiBwYXNzXG5cbmlzIGVxdWl2YWxlbnQgdG86XG5cbiAgIGRlZiBmdW5jKCk6IHBhc3NcbiAgIGZ1bmMgPSBmMShhcmcpKGYyKGZ1bmMpKVxuXG5XaGVuIG9uZSBvciBtb3JlIHRvcC1sZXZlbCAqcGFyYW1ldGVycyogaGF2ZSB0aGUgZm9ybSAqcGFyYW1ldGVyKlxuYGA9YGAgKmV4cHJlc3Npb24qLCB0aGUgZnVuY3Rpb24gaXMgc2FpZCB0byBoYXZlICJkZWZhdWx0IHBhcmFtZXRlclxudmFsdWVzLiIgIEZvciBhIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZSwgdGhlIGNvcnJlc3BvbmRpbmdcbiphcmd1bWVudCogbWF5IGJlIG9taXR0ZWQgZnJvbSBhIGNhbGwsIGluIHdoaWNoIGNhc2UgdGhlIHBhcmFtZXRlclwnc1xuZGVmYXVsdCB2YWx1ZSBpcyBzdWJzdGl0dXRlZC4gIElmIGEgcGFyYW1ldGVyIGhhcyBhIGRlZmF1bHQgdmFsdWUsIGFsbFxuZm9sbG93aW5nIHBhcmFtZXRlcnMgbXVzdCBhbHNvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIC0tLSB0aGlzIGlzIGFcbnN5bnRhY3RpYyByZXN0cmljdGlvbiB0aGF0IGlzIG5vdCBleHByZXNzZWQgYnkgdGhlIGdyYW1tYXIuXG5cbioqRGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBldmFsdWF0ZWQgd2hlbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvblxuaXMgZXhlY3V0ZWQuKiogIFRoaXMgbWVhbnMgdGhhdCB0aGUgZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgb25jZSwgd2hlblxudGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGF0IHRoZSBzYW1lICJwcmUtY29tcHV0ZWQiIHZhbHVlIGlzXG51c2VkIGZvciBlYWNoIGNhbGwuICBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQgd2hlbiBhXG5kZWZhdWx0IHBhcmFtZXRlciBpcyBhIG11dGFibGUgb2JqZWN0LCBzdWNoIGFzIGEgbGlzdCBvciBhIGRpY3Rpb25hcnk6XG5pZiB0aGUgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIG9iamVjdCAoZS5nLiBieSBhcHBlbmRpbmcgYW4gaXRlbSB0byBhXG5saXN0KSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgaW4gZWZmZWN0IG1vZGlmaWVkLiBUaGlzIGlzIGdlbmVyYWxseSBub3RcbndoYXQgd2FzIGludGVuZGVkLiAgQSB3YXkgYXJvdW5kIHRoaXMgIGlzIHRvIHVzZSBgYE5vbmVgYCBhcyB0aGVcbmRlZmF1bHQsIGFuZCBleHBsaWNpdGx5IHRlc3QgZm9yIGl0IGluIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgZS5nLjpcblxuICAgZGVmIHdoYXRzX29uX3RoZV90ZWxseShwZW5ndWluPU5vbmUpOlxuICAgICAgIGlmIHBlbmd1aW4gaXMgTm9uZTpcbiAgICAgICAgICAgcGVuZ3VpbiA9IFtdXG4gICAgICAgcGVuZ3Vpbi5hcHBlbmQoInByb3BlcnR5IG9mIHRoZSB6b28iKVxuICAgICAgIHJldHVybiBwZW5ndWluXG5cbkZ1bmN0aW9uIGNhbGwgc2VtYW50aWNzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gc2VjdGlvblxuKkNhbGxzKi4gQSBmdW5jdGlvbiBjYWxsIGFsd2F5cyBhc3NpZ25zIHZhbHVlcyB0byBhbGwgcGFyYW1ldGVyc1xubWVudGlvbmVkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWl0aGVyIGZyb20gcG9zaXRpb24gYXJndW1lbnRzLCBmcm9tXG5rZXl3b3JkIGFyZ3VtZW50cywgb3IgZnJvbSBkZWZhdWx0IHZhbHVlcy4gIElmIHRoZSBmb3JtXG4iYGAqaWRlbnRpZmllcmBgIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIHR1cGxlIHJlY2VpdmluZ1xuYW55IGV4Y2VzcyBwb3NpdGlvbmFsIHBhcmFtZXRlcnMsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHR1cGxlLiAgSWZcbnRoZSBmb3JtICJgYCoqaWRlbnRpZmllcmBgIiBpcyBwcmVzZW50LCBpdCBpcyBpbml0aWFsaXplZCB0byBhIG5ld1xuZGljdGlvbmFyeSByZWNlaXZpbmcgYW55IGV4Y2VzcyBrZXl3b3JkIGFyZ3VtZW50cywgZGVmYXVsdGluZyB0byBhIG5ld1xuZW1wdHkgZGljdGlvbmFyeS5cblxuSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYW5vbnltb3VzIGZ1bmN0aW9ucyAoZnVuY3Rpb25zIG5vdCBib3VuZFxudG8gYSBuYW1lKSwgZm9yIGltbWVkaWF0ZSB1c2UgaW4gZXhwcmVzc2lvbnMuICBUaGlzIHVzZXMgbGFtYmRhIGZvcm1zLFxuZGVzY3JpYmVkIGluIHNlY3Rpb24gKkxhbWJkYXMqLiAgTm90ZSB0aGF0IHRoZSBsYW1iZGEgZm9ybSBpcyBtZXJlbHkgYVxuc2hvcnRoYW5kIGZvciBhIHNpbXBsaWZpZWQgZnVuY3Rpb24gZGVmaW5pdGlvbjsgYSBmdW5jdGlvbiBkZWZpbmVkIGluXG5hICJgYGRlZmBgIiBzdGF0ZW1lbnQgY2FuIGJlIHBhc3NlZCBhcm91bmQgb3IgYXNzaWduZWQgdG8gYW5vdGhlciBuYW1lXG5qdXN0IGxpa2UgYSBmdW5jdGlvbiBkZWZpbmVkIGJ5IGEgbGFtYmRhIGZvcm0uICBUaGUgImBgZGVmYGAiIGZvcm0gaXNcbmFjdHVhbGx5IG1vcmUgcG93ZXJmdWwgc2luY2UgaXQgYWxsb3dzIHRoZSBleGVjdXRpb24gb2YgbXVsdGlwbGVcbnN0YXRlbWVudHMuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIEZ1bmN0aW9ucyBhcmUgZmlyc3QtY2xhc3Mgb2JqZWN0cy4gIEEgImBgZGVmYGAiXG5mb3JtIGV4ZWN1dGVkIGluc2lkZSBhIGZ1bmN0aW9uIGRlZmluaXRpb24gZGVmaW5lcyBhIGxvY2FsIGZ1bmN0aW9uXG50aGF0IGNhbiBiZSByZXR1cm5lZCBvciBwYXNzZWQgYXJvdW5kLiAgRnJlZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGVcbm5lc3RlZCBmdW5jdGlvbiBjYW4gYWNjZXNzIHRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZ1bmN0aW9uXG5jb250YWluaW5nIHRoZSBkZWYuICBTZWUgc2VjdGlvbiAqTmFtaW5nIGFuZCBiaW5kaW5nKiBmb3IgZGV0YWlscy5cbicsCisgJ2dsb2JhbCc6ICdcblRoZSBgYGdsb2JhbGBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIGdsb2JhbF9zdG10IDo6PSAiZ2xvYmFsIiBpZGVudGlmaWVyICgiLCIgaWRlbnRpZmllcikqXG5cblRoZSBgYGdsb2JhbGBgIHN0YXRlbWVudCBpcyBhIGRlY2xhcmF0aW9uIHdoaWNoIGhvbGRzIGZvciB0aGUgZW50aXJlXG5jdXJyZW50IGNvZGUgYmxvY2suICBJdCBtZWFucyB0aGF0IHRoZSBsaXN0ZWQgaWRlbnRpZmllcnMgYXJlIHRvIGJlXG5pbnRlcnByZXRlZCBhcyBnbG9iYWxzLiAgSXQgd291bGQgYmUgaW1wb3NzaWJsZSB0byBhc3NpZ24gdG8gYSBnbG9iYWxcbnZhcmlhYmxlIHdpdGhvdXQgYGBnbG9iYWxgYCwgYWx0aG91Z2ggZnJlZSB2YXJpYWJsZXMgbWF5IHJlZmVyIHRvXG5nbG9iYWxzIHdpdGhvdXQgYmVpbmcgZGVjbGFyZWQgZ2xvYmFsLlxuXG5OYW1lcyBsaXN0ZWQgaW4gYSBgYGdsb2JhbGBgIHN0YXRlbWVudCBtdXN0IG5vdCBiZSB1c2VkIGluIHRoZSBzYW1lXG5jb2RlIGJsb2NrIHRleHR1YWxseSBwcmVjZWRpbmcgdGhhdCBgYGdsb2JhbGBgIHN0YXRlbWVudC5cblxuTmFtZXMgbGlzdGVkIGluIGEgYGBnbG9iYWxgYCBzdGF0ZW1lbnQgbXVzdCBub3QgYmUgZGVmaW5lZCBhcyBmb3JtYWxcbnBhcmFtZXRlcnMgb3IgaW4gYSBgYGZvcmBgIGxvb3AgY29udHJvbCB0YXJnZXQsIGBgY2xhc3NgYCBkZWZpbml0aW9uLFxuZnVuY3Rpb24gZGVmaW5pdGlvbiwgb3IgYGBpbXBvcnRgYCBzdGF0ZW1lbnQuXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RcbmVuZm9yY2UgdGhlIGxhdHRlciB0d28gcmVzdHJpY3Rpb25zLCBidXQgcHJvZ3JhbXMgc2hvdWxkIG5vdCBhYnVzZVxudGhpcyBmcmVlZG9tLCBhcyBmdXR1cmUgaW1wbGVtZW50YXRpb25zIG1heSBlbmZvcmNlIHRoZW0gb3Igc2lsZW50bHlcbmNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbS5cblxuKipQcm9ncmFtbWVyXCdzIG5vdGU6KiogdGhlIGBgZ2xvYmFsYGAgaXMgYSBkaXJlY3RpdmUgdG8gdGhlIHBhcnNlci5cbkl0IGFwcGxpZXMgb25seSB0byBjb2RlIHBhcnNlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBgYGdsb2JhbGBgXG5zdGF0ZW1lbnQuIEluIHBhcnRpY3VsYXIsIGEgYGBnbG9iYWxgYCBzdGF0ZW1lbnQgY29udGFpbmVkIGluIGFuXG5gYGV4ZWNgYCBzdGF0ZW1lbnQgZG9lcyBub3QgYWZmZWN0IHRoZSBjb2RlIGJsb2NrICpjb250YWluaW5nKiB0aGVcbmBgZXhlY2BgIHN0YXRlbWVudCwgYW5kIGNvZGUgY29udGFpbmVkIGluIGFuIGBgZXhlY2BgIHN0YXRlbWVudCBpc1xudW5hZmZlY3RlZCBieSBgYGdsb2JhbGBgIHN0YXRlbWVudHMgaW4gdGhlIGNvZGUgY29udGFpbmluZyB0aGVcbmBgZXhlY2BgIHN0YXRlbWVudC4gIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIGBgZXZhbCgpYGAsXG5gYGV4ZWNmaWxlKClgYCBhbmQgYGBjb21waWxlKClgYCBmdW5jdGlvbnMuXG4nLAorICdpZC1jbGFzc2VzJzogJ1xuUmVzZXJ2ZWQgY2xhc3NlcyBvZiBpZGVudGlmaWVyc1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5DZXJ0YWluIGNsYXNzZXMgb2YgaWRlbnRpZmllcnMgKGJlc2lkZXMga2V5d29yZHMpIGhhdmUgc3BlY2lhbFxubWVhbmluZ3MuICBUaGVzZSBjbGFzc2VzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBwYXR0ZXJucyBvZiBsZWFkaW5nIGFuZFxudHJhaWxpbmcgdW5kZXJzY29yZSBjaGFyYWN0ZXJzOlxuXG5gYF8qYGBcbiAgIE5vdCBpbXBvcnRlZCBieSBgYGZyb20gbW9kdWxlIGltcG9ydCAqYGAuICBUaGUgc3BlY2lhbCBpZGVudGlmaWVyXG4gICBgYF9gYCBpcyB1c2VkIGluIHRoZSBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciB0byBzdG9yZSB0aGUgcmVzdWx0IG9mXG4gICB0aGUgbGFzdCBldmFsdWF0aW9uOyBpdCBpcyBzdG9yZWQgaW4gdGhlIGBgX19idWlsdGluX19gYCBtb2R1bGUuXG4gICBXaGVuIG5vdCBpbiBpbnRlcmFjdGl2ZSBtb2RlLCBgYF9gYCBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nIGFuZCBpc1xuICAgbm90IGRlZmluZWQuIFNlZSBzZWN0aW9uICpUaGUgaW1wb3J0IHN0YXRlbWVudCouXG5cbiAgIE5vdGU6IFRoZSBuYW1lIGBgX2BgIGlzIG9mdGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aFxuICAgICBpbnRlcm5hdGlvbmFsaXphdGlvbjsgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZVxuICAgICBgYGdldHRleHRgYCBtb2R1bGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyBjb252ZW50aW9uLlxuXG5gYF9fKl9fYGBcbiAgIFN5c3RlbS1kZWZpbmVkIG5hbWVzLiBUaGVzZSBuYW1lcyBhcmUgZGVmaW5lZCBieSB0aGUgaW50ZXJwcmV0ZXJcbiAgIGFuZCBpdHMgaW1wbGVtZW50YXRpb24gKGluY2x1ZGluZyB0aGUgc3RhbmRhcmQgbGlicmFyeSkuICBDdXJyZW50XG4gICBzeXN0ZW0gbmFtZXMgYXJlIGRpc2N1c3NlZCBpbiB0aGUgKlNwZWNpYWwgbWV0aG9kIG5hbWVzKiBzZWN0aW9uXG4gICBhbmQgZWxzZXdoZXJlLiAgTW9yZSB3aWxsIGxpa2VseSBiZSBkZWZpbmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZlxuICAgUHl0aG9uLiAgKkFueSogdXNlIG9mIGBgX18qX19gYCBuYW1lcywgaW4gYW55IGNvbnRleHQsIHRoYXQgZG9lc1xuICAgbm90IGZvbGxvdyBleHBsaWNpdGx5IGRvY3VtZW50ZWQgdXNlLCBpcyBzdWJqZWN0IHRvIGJyZWFrYWdlXG4gICB3aXRob3V0IHdhcm5pbmcuXG5cbmBgX18qYGBcbiAgIENsYXNzLXByaXZhdGUgbmFtZXMuICBOYW1lcyBpbiB0aGlzIGNhdGVnb3J5LCB3aGVuIHVzZWQgd2l0aGluIHRoZVxuICAgY29udGV4dCBvZiBhIGNsYXNzIGRlZmluaXRpb24sIGFyZSByZS13cml0dGVuIHRvIHVzZSBhIG1hbmdsZWQgZm9ybVxuICAgdG8gaGVscCBhdm9pZCBuYW1lIGNsYXNoZXMgYmV0d2VlbiAicHJpdmF0ZSIgYXR0cmlidXRlcyBvZiBiYXNlIGFuZFxuICAgZGVyaXZlZCBjbGFzc2VzLiBTZWUgc2VjdGlvbiAqSWRlbnRpZmllcnMgKE5hbWVzKSouXG4nLAorICdpZGVudGlmaWVycyc6ICdcbklkZW50aWZpZXJzIGFuZCBrZXl3b3Jkc1xuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbklkZW50aWZpZXJzIChhbHNvIHJlZmVycmVkIHRvIGFzICpuYW1lcyopIGFyZSBkZXNjcmliZWQgYnkgdGhlXG5mb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgaWRlbnRpZmllciA6Oj0gKGxldHRlcnwiXyIpIChsZXR0ZXIgfCBkaWdpdCB8ICJfIikqXG4gICBsZXR0ZXIgICAgIDo6PSBsb3dlcmNhc2UgfCB1cHBlcmNhc2VcbiAgIGxvd2VyY2FzZSAgOjo9ICJhIi4uLiJ6IlxuICAgdXBwZXJjYXNlICA6Oj0gIkEiLi4uIloiXG4gICBkaWdpdCAgICAgIDo6PSAiMCIuLi4iOSJcblxuSWRlbnRpZmllcnMgYXJlIHVubGltaXRlZCBpbiBsZW5ndGguICBDYXNlIGlzIHNpZ25pZmljYW50LlxuXG5cbktleXdvcmRzXG49PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIGlkZW50aWZpZXJzIGFyZSB1c2VkIGFzIHJlc2VydmVkIHdvcmRzLCBvciAqa2V5d29yZHMqIG9mXG50aGUgbGFuZ3VhZ2UsIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBvcmRpbmFyeSBpZGVudGlmaWVycy4gIFRoZXkgbXVzdFxuYmUgc3BlbGxlZCBleGFjdGx5IGFzIHdyaXR0ZW4gaGVyZTpcblxuICAgYW5kICAgICAgIGRlbCAgICAgICBmcm9tICAgICAgbm90ICAgICAgIHdoaWxlXG4gICBhcyAgICAgICAgZWxpZiAgICAgIGdsb2JhbCAgICBvciAgICAgICAgd2l0aFxuICAgYXNzZXJ0ICAgIGVsc2UgICAgICBpZiAgICAgICAgcGFzcyAgICAgIHlpZWxkXG4gICBicmVhayAgICAgZXhjZXB0ICAgIGltcG9ydCAgICBwcmludFxuICAgY2xhc3MgICAgIGV4ZWMgICAgICBpbiAgICAgICAgcmFpc2VcbiAgIGNvbnRpbnVlICBmaW5hbGx5ICAgaXMgICAgICAgIHJldHVyblxuICAgZGVmICAgICAgIGZvciAgICAgICBsYW1iZGEgICAgdHJ5XG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IGBgTm9uZWBgIGJlY2FtZSBhIGNvbnN0YW50IGFuZCBpcyBub3dcbnJlY29nbml6ZWQgYnkgdGhlIGNvbXBpbGVyIGFzIGEgbmFtZSBmb3IgdGhlIGJ1aWx0LWluIG9iamVjdCBgYE5vbmVgYC5cbkFsdGhvdWdoIGl0IGlzIG5vdCBhIGtleXdvcmQsIHlvdSBjYW5ub3QgYXNzaWduIGEgZGlmZmVyZW50IG9iamVjdCB0b1xuaXQuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IFVzaW5nIGBgYXNgYCBhbmQgYGB3aXRoYGAgYXMgaWRlbnRpZmllcnNcbnRyaWdnZXJzIGEgd2FybmluZy4gIFRvIHVzZSB0aGVtIGFzIGtleXdvcmRzLCBlbmFibGUgdGhlXG5gYHdpdGhfc3RhdGVtZW50YGAgZnV0dXJlIGZlYXR1cmUgLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi42OiBgYGFzYGAgYW5kIGBgd2l0aGBgIGFyZSBmdWxsIGtleXdvcmRzLlxuXG5cblJlc2VydmVkIGNsYXNzZXMgb2YgaWRlbnRpZmllcnNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQ2VydGFpbiBjbGFzc2VzIG9mIGlkZW50aWZpZXJzIChiZXNpZGVzIGtleXdvcmRzKSBoYXZlIHNwZWNpYWxcbm1lYW5pbmdzLiAgVGhlc2UgY2xhc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgcGF0dGVybnMgb2YgbGVhZGluZyBhbmRcbnRyYWlsaW5nIHVuZGVyc2NvcmUgY2hhcmFjdGVyczpcblxuYGBfKmBgXG4gICBOb3QgaW1wb3J0ZWQgYnkgYGBmcm9tIG1vZHVsZSBpbXBvcnQgKmBgLiAgVGhlIHNwZWNpYWwgaWRlbnRpZmllclxuICAgYGBfYGAgaXMgdXNlZCBpbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZlxuICAgdGhlIGxhc3QgZXZhbHVhdGlvbjsgaXQgaXMgc3RvcmVkIGluIHRoZSBgYF9fYnVpbHRpbl9fYGAgbW9kdWxlLlxuICAgV2hlbiBub3QgaW4gaW50ZXJhY3RpdmUgbW9kZSwgYGBfYGAgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgaXNcbiAgIG5vdCBkZWZpbmVkLiBTZWUgc2VjdGlvbiAqVGhlIGltcG9ydCBzdGF0ZW1lbnQqLlxuXG4gICBOb3RlOiBUaGUgbmFtZSBgYF9gYCBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGhcbiAgICAgaW50ZXJuYXRpb25hbGl6YXRpb247IHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGVcbiAgICAgYGBnZXR0ZXh0YGAgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgY29udmVudGlvbi5cblxuYGBfXypfX2BgXG4gICBTeXN0ZW0tZGVmaW5lZCBuYW1lcy4gVGhlc2UgbmFtZXMgYXJlIGRlZmluZWQgYnkgdGhlIGludGVycHJldGVyXG4gICBhbmQgaXRzIGltcGxlbWVudGF0aW9uIChpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnkpLiAgQ3VycmVudFxuICAgc3lzdGVtIG5hbWVzIGFyZSBkaXNjdXNzZWQgaW4gdGhlICpTcGVjaWFsIG1ldGhvZCBuYW1lcyogc2VjdGlvblxuICAgYW5kIGVsc2V3aGVyZS4gIE1vcmUgd2lsbCBsaWtlbHkgYmUgZGVmaW5lZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2ZcbiAgIFB5dGhvbi4gICpBbnkqIHVzZSBvZiBgYF9fKl9fYGAgbmFtZXMsIGluIGFueSBjb250ZXh0LCB0aGF0IGRvZXNcbiAgIG5vdCBmb2xsb3cgZXhwbGljaXRseSBkb2N1bWVudGVkIHVzZSwgaXMgc3ViamVjdCB0byBicmVha2FnZVxuICAgd2l0aG91dCB3YXJuaW5nLlxuXG5gYF9fKmBgXG4gICBDbGFzcy1wcml2YXRlIG5hbWVzLiAgTmFtZXMgaW4gdGhpcyBjYXRlZ29yeSwgd2hlbiB1c2VkIHdpdGhpbiB0aGVcbiAgIGNvbnRleHQgb2YgYSBjbGFzcyBkZWZpbml0aW9uLCBhcmUgcmUtd3JpdHRlbiB0byB1c2UgYSBtYW5nbGVkIGZvcm1cbiAgIHRvIGhlbHAgYXZvaWQgbmFtZSBjbGFzaGVzIGJldHdlZW4gInByaXZhdGUiIGF0dHJpYnV0ZXMgb2YgYmFzZSBhbmRcbiAgIGRlcml2ZWQgY2xhc3Nlcy4gU2VlIHNlY3Rpb24gKklkZW50aWZpZXJzIChOYW1lcykqLlxuJywKKyAnaWYnOiAnXG5UaGUgYGBpZmBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGBgaWZgYCBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuXG4gICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cbkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmVcbmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucypcbmZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSBgYGlmYGAgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG5JZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWZcbnByZXNlbnQsIGlzIGV4ZWN1dGVkLlxuJywKKyAnaW1hZ2luYXJ5JzogJ1xuSW1hZ2luYXJ5IGxpdGVyYWxzXG4qKioqKioqKioqKioqKioqKipcblxuSW1hZ2luYXJ5IGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOlxuXG4gICBpbWFnbnVtYmVyIDo6PSAoZmxvYXRudW1iZXIgfCBpbnRwYXJ0KSAoImoiIHwgIkoiKVxuXG5BbiBpbWFnaW5hcnkgbGl0ZXJhbCB5aWVsZHMgYSBjb21wbGV4IG51bWJlciB3aXRoIGEgcmVhbCBwYXJ0IG9mIDAuMC5cbkNvbXBsZXggbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgYXMgYSBwYWlyIG9mIGZsb2F0aW5nIHBvaW50IG51bWJlcnNcbmFuZCBoYXZlIHRoZSBzYW1lIHJlc3RyaWN0aW9ucyBvbiB0aGVpciByYW5nZS4gIFRvIGNyZWF0ZSBhIGNvbXBsZXhcbm51bWJlciB3aXRoIGEgbm9uemVybyByZWFsIHBhcnQsIGFkZCBhIGZsb2F0aW5nIHBvaW50IG51bWJlciB0byBpdCxcbmUuZy4sIGBgKDMrNGopYGAuICBTb21lIGV4YW1wbGVzIG9mIGltYWdpbmFyeSBsaXRlcmFsczpcblxuICAgMy4xNGogICAxMC5qICAgIDEwaiAgICAgLjAwMWogICAxZTEwMGogIDMuMTRlLTEwalxuJywKKyAnaW1wb3J0JzogJ1xuVGhlIGBgaW1wb3J0YGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuICAgaW1wb3J0X3N0bXQgICAgIDo6PSAiaW1wb3J0IiBtb2R1bGUgWyJhcyIgbmFtZV0gKCAiLCIgbW9kdWxlIFsiYXMiIG5hbWVdICkqXG4gICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgcmVsYXRpdmVfbW9kdWxlICJpbXBvcnQiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAoICIsIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdICkqXG4gICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgcmVsYXRpdmVfbW9kdWxlICJpbXBvcnQiICIoIiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgKCAiLCIgaWRlbnRpZmllciBbImFzIiBuYW1lXSApKiBbIiwiXSAiKSJcbiAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiBtb2R1bGUgImltcG9ydCIgIioiXG4gICBtb2R1bGUgICAgICAgICAgOjo9IChpZGVudGlmaWVyICIuIikqIGlkZW50aWZpZXJcbiAgIHJlbGF0aXZlX21vZHVsZSA6Oj0gIi4iKiBtb2R1bGUgfCAiLiIrXG4gICBuYW1lICAgICAgICAgICAgOjo9IGlkZW50aWZpZXJcblxuSW1wb3J0IHN0YXRlbWVudHMgYXJlIGV4ZWN1dGVkIGluIHR3byBzdGVwczogKDEpIGZpbmQgYSBtb2R1bGUsIGFuZFxuaW5pdGlhbGl6ZSBpdCBpZiBuZWNlc3Nhcnk7ICgyKSBkZWZpbmUgYSBuYW1lIG9yIG5hbWVzIGluIHRoZSBsb2NhbFxubmFtZXNwYWNlIChvZiB0aGUgc2NvcGUgd2hlcmUgdGhlIGBgaW1wb3J0YGAgc3RhdGVtZW50IG9jY3VycykuIFRoZVxuc3RhdGVtZW50IGNvbWVzIGluIHR3byBmb3JtcyBkaWZmZXJpbmcgb24gd2hldGhlciBpdCB1c2VzIHRoZSBgYGZyb21gYFxua2V5d29yZC4gVGhlIGZpcnN0IGZvcm0gKHdpdGhvdXQgYGBmcm9tYGApIHJlcGVhdHMgdGhlc2Ugc3RlcHMgZm9yXG5lYWNoIGlkZW50aWZpZXIgaW4gdGhlIGxpc3QuIFRoZSBmb3JtIHdpdGggYGBmcm9tYGAgcGVyZm9ybXMgc3RlcCAoMSlcbm9uY2UsIGFuZCB0aGVuIHBlcmZvcm1zIHN0ZXAgKDIpIHJlcGVhdGVkbHkuXG5cblRvIHVuZGVyc3RhbmQgaG93IHN0ZXAgKDEpIG9jY3Vycywgb25lIG11c3QgZmlyc3QgdW5kZXJzdGFuZCBob3dcblB5dGhvbiBoYW5kbGVzIGhpZXJhcmNoaWNhbCBuYW1pbmcgb2YgbW9kdWxlcy4gVG8gaGVscCBvcmdhbml6ZVxubW9kdWxlcyBhbmQgcHJvdmlkZSBhIGhpZXJhcmNoeSBpbiBuYW1pbmcsIFB5dGhvbiBoYXMgYSBjb25jZXB0IG9mXG5wYWNrYWdlcy4gQSBwYWNrYWdlIGNhbiBjb250YWluIG90aGVyIHBhY2thZ2VzIGFuZCBtb2R1bGVzIHdoaWxlXG5tb2R1bGVzIGNhbm5vdCBjb250YWluIG90aGVyIG1vZHVsZXMgb3IgcGFja2FnZXMuIEZyb20gYSBmaWxlIHN5c3RlbVxucGVyc3BlY3RpdmUsIHBhY2thZ2VzIGFyZSBkaXJlY3RvcmllcyBhbmQgbW9kdWxlcyBhcmUgZmlsZXMuIFRoZVxub3JpZ2luYWwgc3BlY2lmaWNhdGlvbiBmb3IgcGFja2FnZXMgaXMgc3RpbGwgYXZhaWxhYmxlIHRvIHJlYWQsXG5hbHRob3VnaCBtaW5vciBkZXRhaWxzIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgd3JpdGluZyBvZiB0aGF0XG5kb2N1bWVudC5cblxuT25jZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIGlzIGtub3duICh1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZCwgdGhlXG50ZXJtICJtb2R1bGUiIHdpbGwgcmVmZXIgdG8gYm90aCBwYWNrYWdlcyBhbmQgbW9kdWxlcyksIHNlYXJjaGluZyBmb3JcbnRoZSBtb2R1bGUgb3IgcGFja2FnZSBjYW4gYmVnaW4uIFRoZSBmaXJzdCBwbGFjZSBjaGVja2VkIGlzXG5gYHN5cy5tb2R1bGVzYGAsIHRoZSBjYWNoZSBvZiBhbGwgbW9kdWxlcyB0aGF0IGhhdmUgYmVlbiBpbXBvcnRlZFxucHJldmlvdXNseS4gSWYgdGhlIG1vZHVsZSBpcyBmb3VuZCB0aGVyZSB0aGVuIGl0IGlzIHVzZWQgaW4gc3RlcCAoMilcbm9mIGltcG9ydC5cblxuSWYgdGhlIG1vZHVsZSBpcyBub3QgZm91bmQgaW4gdGhlIGNhY2hlLCB0aGVuIGBgc3lzLm1ldGFfcGF0aGBgIGlzXG5zZWFyY2hlZCAodGhlIHNwZWNpZmljYXRpb24gZm9yIGBgc3lzLm1ldGFfcGF0aGBgIGNhbiBiZSBmb3VuZCBpblxuKipQRVAgMzAyKiopLiBUaGUgb2JqZWN0IGlzIGEgbGlzdCBvZiAqZmluZGVyKiBvYmplY3RzIHdoaWNoIGFyZVxucXVlcmllZCBpbiBvcmRlciBhcyB0byB3aGV0aGVyIHRoZXkga25vdyBob3cgdG8gbG9hZCB0aGUgbW9kdWxlIGJ5XG5jYWxsaW5nIHRoZWlyIGBgZmluZF9tb2R1bGUoKWBgIG1ldGhvZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUuIElmXG50aGUgbW9kdWxlIGhhcHBlbnMgdG8gYmUgY29udGFpbmVkIHdpdGhpbiBhIHBhY2thZ2UgKGFzIGRlbm90ZWQgYnkgdGhlXG5leGlzdGVuY2Ugb2YgYSBkb3QgaW4gdGhlIG5hbWUpLCB0aGVuIGEgc2Vjb25kIGFyZ3VtZW50IHRvXG5gYGZpbmRfbW9kdWxlKClgYCBpcyBnaXZlbiBhcyB0aGUgdmFsdWUgb2YgdGhlIGBgX19wYXRoX19gYCBhdHRyaWJ1dGVcbmZyb20gdGhlIHBhcmVudCBwYWNrYWdlIChldmVyeXRoaW5nIHVwIHRvIHRoZSBsYXN0IGRvdCBpbiB0aGUgbmFtZSBvZlxudGhlIG1vZHVsZSBiZWluZyBpbXBvcnRlZCkuIElmIGEgZmluZGVyIGNhbiBmaW5kIHRoZSBtb2R1bGUgaXQgcmV0dXJuc1xuYSAqbG9hZGVyKiAoZGlzY3Vzc2VkIGxhdGVyKSBvciByZXR1cm5zIGBgTm9uZWBgLlxuXG5JZiBub25lIG9mIHRoZSBmaW5kZXJzIG9uIGBgc3lzLm1ldGFfcGF0aGBgIGFyZSBhYmxlIHRvIGZpbmQgdGhlXG5tb2R1bGUgdGhlbiBzb21lIGltcGxpY2l0bHkgZGVmaW5lZCBmaW5kZXJzIGFyZSBxdWVyaWVkLlxuSW1wbGVtZW50YXRpb25zIG9mIFB5dGhvbiB2YXJ5IGluIHdoYXQgaW1wbGljaXQgbWV0YSBwYXRoIGZpbmRlcnMgYXJlXG5kZWZpbmVkLiBUaGUgb25lIHRoZXkgYWxsIGRvIGRlZmluZSwgdGhvdWdoLCBpcyBvbmUgdGhhdCBoYW5kbGVzXG5gYHN5cy5wYXRoX2hvb2tzYGAsIGBgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVgYCwgYW5kIGBgc3lzLnBhdGhgYC5cblxuVGhlIGltcGxpY2l0IGZpbmRlciBzZWFyY2hlcyBmb3IgdGhlIHJlcXVlc3RlZCBtb2R1bGUgaW4gdGhlICJwYXRocyJcbnNwZWNpZmllZCBpbiBvbmUgb2YgdHdvIHBsYWNlcyAoInBhdGhzIiBkbyBub3QgaGF2ZSB0byBiZSBmaWxlIHN5c3RlbVxucGF0aHMpLiBJZiB0aGUgbW9kdWxlIGJlaW5nIGltcG9ydGVkIGlzIHN1cHBvc2VkIHRvIGJlIGNvbnRhaW5lZFxud2l0aGluIGEgcGFja2FnZSB0aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQgcGFzc2VkIHRvIGBgZmluZF9tb2R1bGUoKWBgLFxuYGBfX3BhdGhfX2BgIG9uIHRoZSBwYXJlbnQgcGFja2FnZSwgaXMgdXNlZCBhcyB0aGUgc291cmNlIG9mIHBhdGhzLiBJZlxudGhlIG1vZHVsZSBpcyBub3QgY29udGFpbmVkIGluIGEgcGFja2FnZSB0aGVuIGBgc3lzLnBhdGhgYCBpcyB1c2VkIGFzXG50aGUgc291cmNlIG9mIHBhdGhzLlxuXG5PbmNlIHRoZSBzb3VyY2Ugb2YgcGF0aHMgaXMgY2hvc2VuIGl0IGlzIGl0ZXJhdGVkIG92ZXIgdG8gZmluZCBhXG5maW5kZXIgdGhhdCBjYW4gaGFuZGxlIHRoYXQgcGF0aC4gVGhlIGRpY3QgYXRcbmBgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVgYCBjYWNoZXMgZmluZGVycyBmb3IgcGF0aHMgYW5kIGlzIGNoZWNrZWRcbmZvciBhIGZpbmRlci4gSWYgdGhlIHBhdGggZG9lcyBub3QgaGF2ZSBhIGZpbmRlciBjYWNoZWQgdGhlblxuYGBzeXMucGF0aF9ob29rc2BgIGlzIHNlYXJjaGVkIGJ5IGNhbGxpbmcgZWFjaCBvYmplY3QgaW4gdGhlIGxpc3Qgd2l0aFxuYSBzaW5nbGUgYXJndW1lbnQgb2YgdGhlIHBhdGgsIHJldHVybmluZyBhIGZpbmRlciBvciByYWlzZXNcbmBgSW1wb3J0RXJyb3JgYC4gSWYgYSBmaW5kZXIgaXMgcmV0dXJuZWQgdGhlbiBpdCBpcyBjYWNoZWQgaW5cbmBgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVgYCBhbmQgdGhlbiB1c2VkIGZvciB0aGF0IHBhdGggZW50cnkuIElmIG5vXG5maW5kZXIgY2FuIGJlIGZvdW5kIGJ1dCB0aGUgcGF0aCBleGlzdHMgdGhlbiBhIHZhbHVlIG9mIGBgTm9uZWBgIGlzXG5zdG9yZWQgaW4gYGBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZWBgIHRvIHNpZ25pZnkgdGhhdCBhbiBpbXBsaWNpdCxcbmZpbGUtYmFzZWQgZmluZGVyIHRoYXQgaGFuZGxlcyBtb2R1bGVzIHN0b3JlZCBhcyBpbmRpdmlkdWFsIGZpbGVzXG5zaG91bGQgYmUgdXNlZCBmb3IgdGhhdCBwYXRoLiBJZiB0aGUgcGF0aCBkb2VzIG5vdCBleGlzdCB0aGVuIGEgZmluZGVyXG53aGljaCBhbHdheXMgcmV0dXJucyBgYE5vbmVgYCBpcyBwbGFjZWQgaW4gdGhlIGNhY2hlIGZvciB0aGUgcGF0aC5cblxuSWYgbm8gZmluZGVyIGNhbiBmaW5kIHRoZSBtb2R1bGUgdGhlbiBgYEltcG9ydEVycm9yYGAgaXMgcmFpc2VkLlxuT3RoZXJ3aXNlIHNvbWUgZmluZGVyIHJldHVybmVkIGEgbG9hZGVyIHdob3NlIGBgbG9hZF9tb2R1bGUoKWBgIG1ldGhvZFxuaXMgY2FsbGVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBsb2FkIChzZWUgKipQRVAgMzAyKiogZm9yIHRoZVxub3JpZ2luYWwgZGVmaW5pdGlvbiBvZiBsb2FkZXJzKS4gQSBsb2FkZXIgaGFzIHNldmVyYWwgcmVzcG9uc2liaWxpdGllc1xudG8gcGVyZm9ybSBvbiBhIG1vZHVsZSBpdCBsb2Fkcy4gRmlyc3QsIGlmIHRoZSBtb2R1bGUgYWxyZWFkeSBleGlzdHNcbmluIGBgc3lzLm1vZHVsZXNgYCAoYSBwb3NzaWJpbGl0eSBpZiB0aGUgbG9hZGVyIGlzIGNhbGxlZCBvdXRzaWRlIG9mXG50aGUgaW1wb3J0IG1hY2hpbmVyeSkgdGhlbiBpdCBpcyB0byB1c2UgdGhhdCBtb2R1bGUgZm9yIGluaXRpYWxpemF0aW9uXG5hbmQgbm90IGEgbmV3IG1vZHVsZS4gQnV0IGlmIHRoZSBtb2R1bGUgZG9lcyBub3QgZXhpc3QgaW5cbmBgc3lzLm1vZHVsZXNgYCB0aGVuIGl0IGlzIHRvIGJlIGFkZGVkIHRvIHRoYXQgZGljdCBiZWZvcmVcbmluaXRpYWxpemF0aW9uIGJlZ2lucy4gSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBsb2FkaW5nIG9mIHRoZSBtb2R1bGVcbmFuZCBpdCB3YXMgYWRkZWQgdG8gYGBzeXMubW9kdWxlc2BgIGl0IGlzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgZGljdC5cbklmIGFuIGVycm9yIG9jY3VycyBidXQgdGhlIG1vZHVsZSB3YXMgYWxyZWFkeSBpbiBgYHN5cy5tb2R1bGVzYGAgaXQgaXNcbmxlZnQgaW4gdGhlIGRpY3QuXG5cblRoZSBsb2FkZXIgbXVzdCBzZXQgc2V2ZXJhbCBhdHRyaWJ1dGVzIG9uIHRoZSBtb2R1bGUuIGBgX19uYW1lX19gYCBpc1xudG8gYmUgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUuIGBgX19maWxlX19gYCBpcyB0byBiZSB0aGUgInBhdGgiXG50byB0aGUgZmlsZSB1bmxlc3MgdGhlIG1vZHVsZSBpcyBidWlsdC1pbiAoYW5kIHRodXMgbGlzdGVkIGluXG5gYHN5cy5idWlsdGluX21vZHVsZV9uYW1lc2BgKSBpbiB3aGljaCBjYXNlIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHNldC5cbklmIHdoYXQgaXMgYmVpbmcgaW1wb3J0ZWQgaXMgYSBwYWNrYWdlIHRoZW4gYGBfX3BhdGhfX2BgIGlzIHRvIGJlIHNldFxudG8gYSBsaXN0IG9mIHBhdGhzIHRvIGJlIHNlYXJjaGVkIHdoZW4gbG9va2luZyBmb3IgbW9kdWxlcyBhbmRcbnBhY2thZ2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHBhY2thZ2UgYmVpbmcgaW1wb3J0ZWQuIGBgX19wYWNrYWdlX19gYFxuaXMgb3B0aW9uYWwgYnV0IHNob3VsZCBiZSBzZXQgdG8gdGhlIG5hbWUgb2YgcGFja2FnZSB0aGF0IGNvbnRhaW5zIHRoZVxubW9kdWxlIG9yIHBhY2thZ2UgKHRoZSBlbXB0eSBzdHJpbmcgaXMgdXNlZCBmb3IgbW9kdWxlIG5vdCBjb250YWluZWRcbmluIGEgcGFja2FnZSkuIGBgX19sb2FkZXJfX2BgIGlzIGFsc28gb3B0aW9uYWwgYnV0IHNob3VsZCBiZSBzZXQgdG9cbnRoZSBsb2FkZXIgb2JqZWN0IHRoYXQgaXMgbG9hZGluZyB0aGUgbW9kdWxlLlxuXG5JZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGxvYWRpbmcgdGhlbiB0aGUgbG9hZGVyIHJhaXNlc1xuYGBJbXBvcnRFcnJvcmBgIGlmIHNvbWUgb3RoZXIgZXhjZXB0aW9uIGlzIG5vdCBhbHJlYWR5IGJlaW5nXG5wcm9wYWdhdGVkLiBPdGhlcndpc2UgdGhlIGxvYWRlciByZXR1cm5zIHRoZSBtb2R1bGUgdGhhdCB3YXMgbG9hZGVkXG5hbmQgaW5pdGlhbGl6ZWQuXG5cbldoZW4gc3RlcCAoMSkgZmluaXNoZXMgd2l0aG91dCByYWlzaW5nIGFuIGV4Y2VwdGlvbiwgc3RlcCAoMikgY2FuXG5iZWdpbi5cblxuVGhlIGZpcnN0IGZvcm0gb2YgYGBpbXBvcnRgYCBzdGF0ZW1lbnQgYmluZHMgdGhlIG1vZHVsZSBuYW1lIGluIHRoZVxubG9jYWwgbmFtZXNwYWNlIHRvIHRoZSBtb2R1bGUgb2JqZWN0LCBhbmQgdGhlbiBnb2VzIG9uIHRvIGltcG9ydCB0aGVcbm5leHQgaWRlbnRpZmllciwgaWYgYW55LiAgSWYgdGhlIG1vZHVsZSBuYW1lIGlzIGZvbGxvd2VkIGJ5IGBgYXNgYCxcbnRoZSBuYW1lIGZvbGxvd2luZyBgYGFzYGAgaXMgdXNlZCBhcyB0aGUgbG9jYWwgbmFtZSBmb3IgdGhlIG1vZHVsZS5cblxuVGhlIGBgZnJvbWBgIGZvcm0gZG9lcyBub3QgYmluZCB0aGUgbW9kdWxlIG5hbWU6IGl0IGdvZXMgdGhyb3VnaCB0aGVcbmxpc3Qgb2YgaWRlbnRpZmllcnMsIGxvb2tzIGVhY2ggb25lIG9mIHRoZW0gdXAgaW4gdGhlIG1vZHVsZSBmb3VuZCBpblxuc3RlcCAoMSksIGFuZCBiaW5kcyB0aGUgbmFtZSBpbiB0aGUgbG9jYWwgbmFtZXNwYWNlIHRvIHRoZSBvYmplY3QgdGh1c1xuZm91bmQuICBBcyB3aXRoIHRoZSBmaXJzdCBmb3JtIG9mIGBgaW1wb3J0YGAsIGFuIGFsdGVybmF0ZSBsb2NhbCBuYW1lXG5jYW4gYmUgc3VwcGxpZWQgYnkgc3BlY2lmeWluZyAiYGBhc2BgIGxvY2FsbmFtZSIuICBJZiBhIG5hbWUgaXMgbm90XG5mb3VuZCwgYGBJbXBvcnRFcnJvcmBgIGlzIHJhaXNlZC4gIElmIHRoZSBsaXN0IG9mIGlkZW50aWZpZXJzIGlzXG5yZXBsYWNlZCBieSBhIHN0YXIgKGBgXCcqXCdgYCksIGFsbCBwdWJsaWMgbmFtZXMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlXG5hcmUgYm91bmQgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSBvZiB0aGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnQuLlxuXG5UaGUgKnB1YmxpYyBuYW1lcyogZGVmaW5lZCBieSBhIG1vZHVsZSBhcmUgZGV0ZXJtaW5lZCBieSBjaGVja2luZyB0aGVcbm1vZHVsZVwncyBuYW1lc3BhY2UgZm9yIGEgdmFyaWFibGUgbmFtZWQgYGBfX2FsbF9fYGA7IGlmIGRlZmluZWQsIGl0XG5tdXN0IGJlIGEgc2VxdWVuY2Ugb2Ygc3RyaW5ncyB3aGljaCBhcmUgbmFtZXMgZGVmaW5lZCBvciBpbXBvcnRlZCBieVxudGhhdCBtb2R1bGUuICBUaGUgbmFtZXMgZ2l2ZW4gaW4gYGBfX2FsbF9fYGAgYXJlIGFsbCBjb25zaWRlcmVkIHB1YmxpY1xuYW5kIGFyZSByZXF1aXJlZCB0byBleGlzdC4gIElmIGBgX19hbGxfX2BgIGlzIG5vdCBkZWZpbmVkLCB0aGUgc2V0IG9mXG5wdWJsaWMgbmFtZXMgaW5jbHVkZXMgYWxsIG5hbWVzIGZvdW5kIGluIHRoZSBtb2R1bGVcJ3MgbmFtZXNwYWNlIHdoaWNoXG5kbyBub3QgYmVnaW4gd2l0aCBhbiB1bmRlcnNjb3JlIGNoYXJhY3RlciAoYGBcJ19cJ2BgKS4gYGBfX2FsbF9fYGBcbnNob3VsZCBjb250YWluIHRoZSBlbnRpcmUgcHVibGljIEFQSS4gSXQgaXMgaW50ZW5kZWQgdG8gYXZvaWRcbmFjY2lkZW50YWxseSBleHBvcnRpbmcgaXRlbXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIEFQSSAoc3VjaCBhc1xubGlicmFyeSBtb2R1bGVzIHdoaWNoIHdlcmUgaW1wb3J0ZWQgYW5kIHVzZWQgd2l0aGluIHRoZSBtb2R1bGUpLlxuXG5UaGUgYGBmcm9tYGAgZm9ybSB3aXRoIGBgKmBgIG1heSBvbmx5IG9jY3VyIGluIGEgbW9kdWxlIHNjb3BlLiAgSWYgdGhlXG53aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQgLS0tIGBgaW1wb3J0ICpgYCAtLS0gaXMgdXNlZCBpbiBhIGZ1bmN0aW9uXG5hbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGEgbmVzdGVkIGJsb2NrIHdpdGggZnJlZSB2YXJpYWJsZXMsXG50aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIGBgU3ludGF4RXJyb3JgYC5cblxuV2hlbiBzcGVjaWZ5aW5nIHdoYXQgbW9kdWxlIHRvIGltcG9ydCB5b3UgZG8gbm90IGhhdmUgdG8gc3BlY2lmeSB0aGVcbmFic29sdXRlIG5hbWUgb2YgdGhlIG1vZHVsZS4gV2hlbiBhIG1vZHVsZSBvciBwYWNrYWdlIGlzIGNvbnRhaW5lZFxud2l0aGluIGFub3RoZXIgcGFja2FnZSBpdCBpcyBwb3NzaWJsZSB0byBtYWtlIGEgcmVsYXRpdmUgaW1wb3J0IHdpdGhpblxudGhlIHNhbWUgdG9wIHBhY2thZ2Ugd2l0aG91dCBoYXZpbmcgdG8gbWVudGlvbiB0aGUgcGFja2FnZSBuYW1lLiBCeVxudXNpbmcgbGVhZGluZyBkb3RzIGluIHRoZSBzcGVjaWZpZWQgbW9kdWxlIG9yIHBhY2thZ2UgYWZ0ZXIgYGBmcm9tYGBcbnlvdSBjYW4gc3BlY2lmeSBob3cgaGlnaCB0byB0cmF2ZXJzZSB1cCB0aGUgY3VycmVudCBwYWNrYWdlIGhpZXJhcmNoeVxud2l0aG91dCBzcGVjaWZ5aW5nIGV4YWN0IG5hbWVzLiBPbmUgbGVhZGluZyBkb3QgbWVhbnMgdGhlIGN1cnJlbnRcbnBhY2thZ2Ugd2hlcmUgdGhlIG1vZHVsZSBtYWtpbmcgdGhlIGltcG9ydCBleGlzdHMuIFR3byBkb3RzIG1lYW5zIHVwXG5vbmUgcGFja2FnZSBsZXZlbC4gVGhyZWUgZG90cyBpcyB1cCB0d28gbGV2ZWxzLCBldGMuIFNvIGlmIHlvdSBleGVjdXRlXG5gYGZyb20gLiBpbXBvcnQgbW9kYGAgZnJvbSBhIG1vZHVsZSBpbiB0aGUgYGBwa2dgYCBwYWNrYWdlIHRoZW4geW91XG53aWxsIGVuZCB1cCBpbXBvcnRpbmcgYGBwa2cubW9kYGAuIElmIHlvdSBleGVjdXRlIGBgZnJvbSAuLnN1YnBrZzJcbmltcG9ydCBtb2RgYCBmcm9tIHdpdGhpbiBgYHBrZy5zdWJwa2cxYGAgeW91IHdpbGwgaW1wb3J0XG5gYHBrZy5zdWJwa2cyLm1vZGBgLiBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgcmVsYXRpdmUgaW1wb3J0cyBpc1xuY29udGFpbmVkIHdpdGhpbiAqKlBFUCAzMjgqKi5cblxuYGBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgpYGAgaXMgcHJvdmlkZWQgdG8gc3VwcG9ydCBhcHBsaWNhdGlvbnMgdGhhdFxuZGV0ZXJtaW5lIHdoaWNoIG1vZHVsZXMgbmVlZCB0byBiZSBsb2FkZWQgZHluYW1pY2FsbHkuXG5cblxuRnV0dXJlIHN0YXRlbWVudHNcbj09PT09PT09PT09PT09PT09XG5cbkEgKmZ1dHVyZSBzdGF0ZW1lbnQqIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBjb21waWxlciB0aGF0IGEgcGFydGljdWxhclxubW9kdWxlIHNob3VsZCBiZSBjb21waWxlZCB1c2luZyBzeW50YXggb3Igc2VtYW50aWNzIHRoYXQgd2lsbCBiZVxuYXZhaWxhYmxlIGluIGEgc3BlY2lmaWVkIGZ1dHVyZSByZWxlYXNlIG9mIFB5dGhvbi4gIFRoZSBmdXR1cmVcbnN0YXRlbWVudCBpcyBpbnRlbmRlZCB0byBlYXNlIG1pZ3JhdGlvbiB0byBmdXR1cmUgdmVyc2lvbnMgb2YgUHl0aG9uXG50aGF0IGludHJvZHVjZSBpbmNvbXBhdGlibGUgY2hhbmdlcyB0byB0aGUgbGFuZ3VhZ2UuICBJdCBhbGxvd3MgdXNlIG9mXG50aGUgbmV3IGZlYXR1cmVzIG9uIGEgcGVyLW1vZHVsZSBiYXNpcyBiZWZvcmUgdGhlIHJlbGVhc2UgaW4gd2hpY2ggdGhlXG5mZWF0dXJlIGJlY29tZXMgc3RhbmRhcmQuXG5cbiAgIGZ1dHVyZV9zdGF0ZW1lbnQgOjo9ICJmcm9tIiAiX19mdXR1cmVfXyIgImltcG9ydCIgZmVhdHVyZSBbImFzIiBuYW1lXVxuICAgICAgICAgICAgICAgICAgICAgICAgKCIsIiBmZWF0dXJlIFsiYXMiIG5hbWVdKSpcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgImZyb20iICJfX2Z1dHVyZV9fIiAiaW1wb3J0IiAiKCIgZmVhdHVyZSBbImFzIiBuYW1lXVxuICAgICAgICAgICAgICAgICAgICAgICAgKCIsIiBmZWF0dXJlIFsiYXMiIG5hbWVdKSogWyIsIl0gIikiXG4gICBmZWF0dXJlICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4gICBuYW1lICAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG5cbkEgZnV0dXJlIHN0YXRlbWVudCBtdXN0IGFwcGVhciBuZWFyIHRoZSB0b3Agb2YgdGhlIG1vZHVsZS4gIFRoZSBvbmx5XG5saW5lcyB0aGF0IGNhbiBhcHBlYXIgYmVmb3JlIGEgZnV0dXJlIHN0YXRlbWVudCBhcmU6XG5cbiogdGhlIG1vZHVsZSBkb2NzdHJpbmcgKGlmIGFueSksXG5cbiogY29tbWVudHMsXG5cbiogYmxhbmsgbGluZXMsIGFuZFxuXG4qIG90aGVyIGZ1dHVyZSBzdGF0ZW1lbnRzLlxuXG5UaGUgZmVhdHVyZXMgcmVjb2duaXplZCBieSBQeXRob24gMi42IGFyZSBgYHVuaWNvZGVfbGl0ZXJhbHNgYCxcbmBgcHJpbnRfZnVuY3Rpb25gYCwgYGBhYnNvbHV0ZV9pbXBvcnRgYCwgYGBkaXZpc2lvbmBgLCBgYGdlbmVyYXRvcnNgYCxcbmBgbmVzdGVkX3Njb3Blc2BgIGFuZCBgYHdpdGhfc3RhdGVtZW50YGAuICBgYGdlbmVyYXRvcnNgYCxcbmBgd2l0aF9zdGF0ZW1lbnRgYCwgYGBuZXN0ZWRfc2NvcGVzYGAgYXJlIHJlZHVuZGFudCBpbiBQeXRob24gdmVyc2lvblxuMi42IGFuZCBhYm92ZSBiZWNhdXNlIHRoZXkgYXJlIGFsd2F5cyBlbmFibGVkLlxuXG5BIGZ1dHVyZSBzdGF0ZW1lbnQgaXMgcmVjb2duaXplZCBhbmQgdHJlYXRlZCBzcGVjaWFsbHkgYXQgY29tcGlsZVxudGltZTogQ2hhbmdlcyB0byB0aGUgc2VtYW50aWNzIG9mIGNvcmUgY29uc3RydWN0cyBhcmUgb2Z0ZW5cbmltcGxlbWVudGVkIGJ5IGdlbmVyYXRpbmcgZGlmZmVyZW50IGNvZGUuICBJdCBtYXkgZXZlbiBiZSB0aGUgY2FzZVxudGhhdCBhIG5ldyBmZWF0dXJlIGludHJvZHVjZXMgbmV3IGluY29tcGF0aWJsZSBzeW50YXggKHN1Y2ggYXMgYSBuZXdcbnJlc2VydmVkIHdvcmQpLCBpbiB3aGljaCBjYXNlIHRoZSBjb21waWxlciBtYXkgbmVlZCB0byBwYXJzZSB0aGVcbm1vZHVsZSBkaWZmZXJlbnRseS4gIFN1Y2ggZGVjaXNpb25zIGNhbm5vdCBiZSBwdXNoZWQgb2ZmIHVudGlsXG5ydW50aW1lLlxuXG5Gb3IgYW55IGdpdmVuIHJlbGVhc2UsIHRoZSBjb21waWxlciBrbm93cyB3aGljaCBmZWF0dXJlIG5hbWVzIGhhdmVcbmJlZW4gZGVmaW5lZCwgYW5kIHJhaXNlcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGZ1dHVyZSBzdGF0ZW1lbnRcbmNvbnRhaW5zIGEgZmVhdHVyZSBub3Qga25vd24gdG8gaXQuXG5cblRoZSBkaXJlY3QgcnVudGltZSBzZW1hbnRpY3MgYXJlIHRoZSBzYW1lIGFzIGZvciBhbnkgaW1wb3J0IHN0YXRlbWVudDpcbnRoZXJlIGlzIGEgc3RhbmRhcmQgbW9kdWxlIGBgX19mdXR1cmVfX2BgLCBkZXNjcmliZWQgbGF0ZXIsIGFuZCBpdFxud2lsbCBiZSBpbXBvcnRlZCBpbiB0aGUgdXN1YWwgd2F5IGF0IHRoZSB0aW1lIHRoZSBmdXR1cmUgc3RhdGVtZW50IGlzXG5leGVjdXRlZC5cblxuVGhlIGludGVyZXN0aW5nIHJ1bnRpbWUgc2VtYW50aWNzIGRlcGVuZCBvbiB0aGUgc3BlY2lmaWMgZmVhdHVyZVxuZW5hYmxlZCBieSB0aGUgZnV0dXJlIHN0YXRlbWVudC5cblxuTm90ZSB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCBhYm91dCB0aGUgc3RhdGVtZW50OlxuXG4gICBpbXBvcnQgX19mdXR1cmVfXyBbYXMgbmFtZV1cblxuVGhhdCBpcyBub3QgYSBmdXR1cmUgc3RhdGVtZW50OyBpdFwncyBhbiBvcmRpbmFyeSBpbXBvcnQgc3RhdGVtZW50IHdpdGhcbm5vIHNwZWNpYWwgc2VtYW50aWNzIG9yIHN5bnRheCByZXN0cmljdGlvbnMuXG5cbkNvZGUgY29tcGlsZWQgYnkgYW4gYGBleGVjYGAgc3RhdGVtZW50IG9yIGNhbGxzIHRvIHRoZSBidWlsdC1pblxuZnVuY3Rpb25zIGBgY29tcGlsZSgpYGAgYW5kIGBgZXhlY2ZpbGUoKWBgIHRoYXQgb2NjdXIgaW4gYSBtb2R1bGVcbmBgTWBgIGNvbnRhaW5pbmcgYSBmdXR1cmUgc3RhdGVtZW50IHdpbGwsIGJ5IGRlZmF1bHQsIHVzZSB0aGUgbmV3XG5zeW50YXggb3Igc2VtYW50aWNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZnV0dXJlIHN0YXRlbWVudC4gIFRoaXMgY2FuLFxuc3RhcnRpbmcgd2l0aCBQeXRob24gMi4yIGJlIGNvbnRyb2xsZWQgYnkgb3B0aW9uYWwgYXJndW1lbnRzIHRvXG5gYGNvbXBpbGUoKWBgIC0tLSBzZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmdW5jdGlvbiBmb3IgZGV0YWlscy5cblxuQSBmdXR1cmUgc3RhdGVtZW50IHR5cGVkIGF0IGFuIGludGVyYWN0aXZlIGludGVycHJldGVyIHByb21wdCB3aWxsXG50YWtlIGVmZmVjdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIGludGVycHJldGVyIHNlc3Npb24uICBJZiBhblxuaW50ZXJwcmV0ZXIgaXMgc3RhcnRlZCB3aXRoIHRoZSAqLWkqIG9wdGlvbiwgaXMgcGFzc2VkIGEgc2NyaXB0IG5hbWVcbnRvIGV4ZWN1dGUsIGFuZCB0aGUgc2NyaXB0IGluY2x1ZGVzIGEgZnV0dXJlIHN0YXRlbWVudCwgaXQgd2lsbCBiZSBpblxuZWZmZWN0IGluIHRoZSBpbnRlcmFjdGl2ZSBzZXNzaW9uIHN0YXJ0ZWQgYWZ0ZXIgdGhlIHNjcmlwdCBpc1xuZXhlY3V0ZWQuXG5cblNlZSBhbHNvOlxuXG4gICAqKlBFUCAyMzYqKiAtIEJhY2sgdG8gdGhlIF9fZnV0dXJlX19cbiAgICAgIFRoZSBvcmlnaW5hbCBwcm9wb3NhbCBmb3IgdGhlIF9fZnV0dXJlX18gbWVjaGFuaXNtLlxuJywKKyAnaW4nOiAnXG5Db21wYXJpc29uc1xuKioqKioqKioqKipcblxuVW5saWtlIEMsIGFsbCBjb21wYXJpc29uIG9wZXJhdGlvbnMgaW4gUHl0aG9uIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHksXG53aGljaCBpcyBsb3dlciB0aGFuIHRoYXQgb2YgYW55IGFyaXRobWV0aWMsIHNoaWZ0aW5nIG9yIGJpdHdpc2Vcbm9wZXJhdGlvbi4gIEFsc28gdW5saWtlIEMsIGV4cHJlc3Npb25zIGxpa2UgYGBhIDwgYiA8IGNgYCBoYXZlIHRoZVxuaW50ZXJwcmV0YXRpb24gdGhhdCBpcyBjb252ZW50aW9uYWwgaW4gbWF0aGVtYXRpY3M6XG5cbiAgIGNvbXBhcmlzb24gICAgOjo9IG9yX2V4cHIgKCBjb21wX29wZXJhdG9yIG9yX2V4cHIgKSpcbiAgIGNvbXBfb3BlcmF0b3IgOjo9ICI8IiB8ICI+IiB8ICI9PSIgfCAiPj0iIHwgIjw9IiB8ICI8PiIgfCAiIT0iXG4gICAgICAgICAgICAgICAgICAgICB8ICJpcyIgWyJub3QiXSB8IFsibm90Il0gImluIlxuXG5Db21wYXJpc29ucyB5aWVsZCBib29sZWFuIHZhbHVlczogYGBUcnVlYGAgb3IgYGBGYWxzZWBgLlxuXG5Db21wYXJpc29ucyBjYW4gYmUgY2hhaW5lZCBhcmJpdHJhcmlseSwgZS5nLiwgYGB4IDwgeSA8PSB6YGAgaXNcbmVxdWl2YWxlbnQgdG8gYGB4IDwgeSBhbmQgeSA8PSB6YGAsIGV4Y2VwdCB0aGF0IGBgeWBgIGlzIGV2YWx1YXRlZFxub25seSBvbmNlIChidXQgaW4gYm90aCBjYXNlcyBgYHpgYCBpcyBub3QgZXZhbHVhdGVkIGF0IGFsbCB3aGVuIGBgeCA8XG55YGAgaXMgZm91bmQgdG8gYmUgZmFsc2UpLlxuXG5Gb3JtYWxseSwgaWYgKmEqLCAqYiosICpjKiwgLi4uLCAqeSosICp6KiBhcmUgZXhwcmVzc2lvbnMgYW5kICpvcDEqLFxuKm9wMiosIC4uLiwgKm9wTiogYXJlIGNvbXBhcmlzb24gb3BlcmF0b3JzLCB0aGVuIGBgYSBvcDEgYiBvcDIgYyAuLi4geVxub3BOIHpgYCBpcyBlcXVpdmFsZW50IHRvIGBgYSBvcDEgYiBhbmQgYiBvcDIgYyBhbmQgLi4uIHkgb3BOIHpgYCxcbmV4Y2VwdCB0aGF0IGVhY2ggZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgYXQgbW9zdCBvbmNlLlxuXG5Ob3RlIHRoYXQgYGBhIG9wMSBiIG9wMiBjYGAgZG9lc25cJ3QgaW1wbHkgYW55IGtpbmQgb2YgY29tcGFyaXNvblxuYmV0d2VlbiAqYSogYW5kICpjKiwgc28gdGhhdCwgZS5nLiwgYGB4IDwgeSA+IHpgYCBpcyBwZXJmZWN0bHkgbGVnYWxcbih0aG91Z2ggcGVyaGFwcyBub3QgcHJldHR5KS5cblxuVGhlIGZvcm1zIGBgPD5gYCBhbmQgYGAhPWBgIGFyZSBlcXVpdmFsZW50OyBmb3IgY29uc2lzdGVuY3kgd2l0aCBDLFxuYGAhPWBgIGlzIHByZWZlcnJlZDsgd2hlcmUgYGAhPWBgIGlzIG1lbnRpb25lZCBiZWxvdyBgYDw+YGAgaXMgYWxzb1xuYWNjZXB0ZWQuICBUaGUgYGA8PmBgIHNwZWxsaW5nIGlzIGNvbnNpZGVyZWQgb2Jzb2xlc2NlbnQuXG5cblRoZSBvcGVyYXRvcnMgYGA8YGAsIGBgPmBgLCBgYD09YGAsIGBgPj1gYCwgYGA8PWBgLCBhbmQgYGAhPWBgIGNvbXBhcmVcbnRoZSB2YWx1ZXMgb2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBuZWVkIG5vdCBoYXZlIHRoZSBzYW1lIHR5cGUuXG5JZiBib3RoIGFyZSBudW1iZXJzLCB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIE90aGVyd2lzZSxcbm9iamVjdHMgb2YgZGlmZmVyZW50IHR5cGVzICphbHdheXMqIGNvbXBhcmUgdW5lcXVhbCwgYW5kIGFyZSBvcmRlcmVkXG5jb25zaXN0ZW50bHkgYnV0IGFyYml0cmFyaWx5LiBZb3UgY2FuIGNvbnRyb2wgY29tcGFyaXNvbiBiZWhhdmlvciBvZlxub2JqZWN0cyBvZiBub24tYnVpbHQtaW4gdHlwZXMgYnkgZGVmaW5pbmcgYSBgYF9fY21wX19gYCBtZXRob2Qgb3IgcmljaFxuY29tcGFyaXNvbiBtZXRob2RzIGxpa2UgYGBfX2d0X19gYCwgZGVzY3JpYmVkIGluIHNlY3Rpb24gKlNwZWNpYWxcbm1ldGhvZCBuYW1lcyouXG5cbihUaGlzIHVudXN1YWwgZGVmaW5pdGlvbiBvZiBjb21wYXJpc29uIHdhcyB1c2VkIHRvIHNpbXBsaWZ5IHRoZVxuZGVmaW5pdGlvbiBvZiBvcGVyYXRpb25zIGxpa2Ugc29ydGluZyBhbmQgdGhlIGBgaW5gYCBhbmQgYGBub3QgaW5gYFxub3BlcmF0b3JzLiBJbiB0aGUgZnV0dXJlLCB0aGUgY29tcGFyaXNvbiBydWxlcyBmb3Igb2JqZWN0cyBvZlxuZGlmZmVyZW50IHR5cGVzIGFyZSBsaWtlbHkgdG8gY2hhbmdlLilcblxuQ29tcGFyaXNvbiBvZiBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgZGVwZW5kcyBvbiB0aGUgdHlwZTpcblxuKiBOdW1iZXJzIGFyZSBjb21wYXJlZCBhcml0aG1ldGljYWxseS5cblxuKiBTdHJpbmdzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyB0aGUgbnVtZXJpYyBlcXVpdmFsZW50c1xuICAodGhlIHJlc3VsdCBvZiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBvcmQoKWBgKSBvZiB0aGVpciBjaGFyYWN0ZXJzLlxuICBVbmljb2RlIGFuZCA4LWJpdCBzdHJpbmdzIGFyZSBmdWxseSBpbnRlcm9wZXJhYmxlIGluIHRoaXMgYmVoYXZpb3IuXG4gIFs0XVxuXG4qIFR1cGxlcyBhbmQgbGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIGNvbXBhcmlzb24gb2ZcbiAgY29ycmVzcG9uZGluZyBlbGVtZW50cy4gIFRoaXMgbWVhbnMgdGhhdCB0byBjb21wYXJlIGVxdWFsLCBlYWNoXG4gIGVsZW1lbnQgbXVzdCBjb21wYXJlIGVxdWFsIGFuZCB0aGUgdHdvIHNlcXVlbmNlcyBtdXN0IGJlIG9mIHRoZSBzYW1lXG4gIHR5cGUgYW5kIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLlxuXG4gIElmIG5vdCBlcXVhbCwgdGhlIHNlcXVlbmNlcyBhcmUgb3JkZXJlZCB0aGUgc2FtZSBhcyB0aGVpciBmaXJzdFxuICBkaWZmZXJpbmcgZWxlbWVudHMuICBGb3IgZXhhbXBsZSwgYGBjbXAoWzEsMix4XSwgWzEsMix5XSlgYCByZXR1cm5zXG4gIHRoZSBzYW1lIGFzIGBgY21wKHgseSlgYC4gIElmIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZG9lcyBub3RcbiAgZXhpc3QsIHRoZSBzaG9ydGVyIHNlcXVlbmNlIGlzIG9yZGVyZWQgZmlyc3QgKGZvciBleGFtcGxlLCBgYFsxLDJdIDxcbiAgWzEsMiwzXWBgKS5cblxuKiBNYXBwaW5ncyAoZGljdGlvbmFyaWVzKSBjb21wYXJlIGVxdWFsIGlmIGFuZCBvbmx5IGlmIHRoZWlyIHNvcnRlZFxuICAoa2V5LCB2YWx1ZSkgbGlzdHMgY29tcGFyZSBlcXVhbC4gWzVdIE91dGNvbWVzIG90aGVyIHRoYW4gZXF1YWxpdHlcbiAgYXJlIHJlc29sdmVkIGNvbnNpc3RlbnRseSwgYnV0IGFyZSBub3Qgb3RoZXJ3aXNlIGRlZmluZWQuIFs2XVxuXG4qIE1vc3Qgb3RoZXIgb2JqZWN0cyBvZiBidWlsdC1pbiB0eXBlcyBjb21wYXJlIHVuZXF1YWwgdW5sZXNzIHRoZXkgYXJlXG4gIHRoZSBzYW1lIG9iamVjdDsgdGhlIGNob2ljZSB3aGV0aGVyIG9uZSBvYmplY3QgaXMgY29uc2lkZXJlZCBzbWFsbGVyXG4gIG9yIGxhcmdlciB0aGFuIGFub3RoZXIgb25lIGlzIG1hZGUgYXJiaXRyYXJpbHkgYnV0IGNvbnNpc3RlbnRseVxuICB3aXRoaW4gb25lIGV4ZWN1dGlvbiBvZiBhIHByb2dyYW0uXG5cblRoZSBvcGVyYXRvcnMgYGBpbmBgIGFuZCBgYG5vdCBpbmBgIHRlc3QgZm9yIGNvbGxlY3Rpb24gbWVtYmVyc2hpcC5cbmBgeCBpbiBzYGAgZXZhbHVhdGVzIHRvIHRydWUgaWYgKngqIGlzIGEgbWVtYmVyIG9mIHRoZSBjb2xsZWN0aW9uICpzKixcbmFuZCBmYWxzZSBvdGhlcndpc2UuICBgYHggbm90IGluIHNgYCByZXR1cm5zIHRoZSBuZWdhdGlvbiBvZiBgYHggaW5cbnNgYC4gVGhlIGNvbGxlY3Rpb24gbWVtYmVyc2hpcCB0ZXN0IGhhcyB0cmFkaXRpb25hbGx5IGJlZW4gYm91bmQgdG9cbnNlcXVlbmNlczsgYW4gb2JqZWN0IGlzIGEgbWVtYmVyIG9mIGEgY29sbGVjdGlvbiBpZiB0aGUgY29sbGVjdGlvbiBpc1xuYSBzZXF1ZW5jZSBhbmQgY29udGFpbnMgYW4gZWxlbWVudCBlcXVhbCB0byB0aGF0IG9iamVjdC4gIEhvd2V2ZXIsIGl0XG5tYWtlIHNlbnNlIGZvciBtYW55IG90aGVyIG9iamVjdCB0eXBlcyB0byBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdHNcbndpdGhvdXQgYmVpbmcgYSBzZXF1ZW5jZS4gIEluIHBhcnRpY3VsYXIsIGRpY3Rpb25hcmllcyAoZm9yIGtleXMpIGFuZFxuc2V0cyBzdXBwb3J0IG1lbWJlcnNoaXAgdGVzdGluZy5cblxuRm9yIHRoZSBsaXN0IGFuZCB0dXBsZSB0eXBlcywgYGB4IGluIHlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlXG5leGlzdHMgYW4gaW5kZXggKmkqIHN1Y2ggdGhhdCBgYHggPT0geVtpXWBgIGlzIHRydWUuXG5cbkZvciB0aGUgVW5pY29kZSBhbmQgc3RyaW5nIHR5cGVzLCBgYHggaW4geWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWZcbip4KiBpcyBhIHN1YnN0cmluZyBvZiAqeSouICBBbiBlcXVpdmFsZW50IHRlc3QgaXMgYGB5LmZpbmQoeCkgIT0gLTFgYC5cbk5vdGUsICp4KiBhbmQgKnkqIG5lZWQgbm90IGJlIHRoZSBzYW1lIHR5cGU7IGNvbnNlcXVlbnRseSwgYGB1XCdhYlwnIGluXG5cJ2FiY1wnYGAgd2lsbCByZXR1cm4gYGBUcnVlYGAuIEVtcHR5IHN0cmluZ3MgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvXG5iZSBhIHN1YnN0cmluZyBvZiBhbnkgb3RoZXIgc3RyaW5nLCBzbyBgYCIiIGluICJhYmMiYGAgd2lsbCByZXR1cm5cbmBgVHJ1ZWBgLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCAqeCogd2FzIHJlcXVpcmVkIHRvIGJlIGEgc3RyaW5nIG9mXG5sZW5ndGggYGAxYGAuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkZWZpbmUgdGhlIGBgX19jb250YWluc19fKClgYCBtZXRob2QsXG5gYHggaW4geWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgYGB5Ll9fY29udGFpbnNfXyh4KWBgIGlzIHRydWUuXG5cbkZvciB1c2VyLWRlZmluZWQgY2xhc3NlcyB3aGljaCBkbyBub3QgZGVmaW5lIGBgX19jb250YWluc19fKClgYCBidXQgZG9cbmRlZmluZSBgYF9faXRlcl9fKClgYCwgYGB4IGluIHlgYCBpcyB0cnVlIGlmIHNvbWUgdmFsdWUgYGB6YGAgd2l0aCBgYHhcbj09IHpgYCBpcyBwcm9kdWNlZCB3aGlsZSBpdGVyYXRpbmcgb3ZlciBgYHlgYC4gIElmIGFuIGV4Y2VwdGlvbiBpc1xucmFpc2VkIGR1cmluZyB0aGUgaXRlcmF0aW9uLCBpdCBpcyBhcyBpZiBgYGluYGAgcmFpc2VkIHRoYXQgZXhjZXB0aW9uLlxuXG5MYXN0bHksIHRoZSBvbGQtc3R5bGUgaXRlcmF0aW9uIHByb3RvY29sIGlzIHRyaWVkOiBpZiBhIGNsYXNzIGRlZmluZXNcbmBgX19nZXRpdGVtX18oKWBgLCBgYHggaW4geWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmUgaXMgYSBub24tXG5uZWdhdGl2ZSBpbnRlZ2VyIGluZGV4ICppKiBzdWNoIHRoYXQgYGB4ID09IHlbaV1gYCwgYW5kIGFsbCBsb3dlclxuaW50ZWdlciBpbmRpY2VzIGRvIG5vdCByYWlzZSBgYEluZGV4RXJyb3JgYCBleGNlcHRpb24uIChJZiBhbnkgb3RoZXJcbmV4Y2VwdGlvbiBpcyByYWlzZWQsIGl0IGlzIGFzIGlmIGBgaW5gYCByYWlzZWQgdGhhdCBleGNlcHRpb24pLlxuXG5UaGUgb3BlcmF0b3IgYGBub3QgaW5gYCBpcyBkZWZpbmVkIHRvIGhhdmUgdGhlIGludmVyc2UgdHJ1ZSB2YWx1ZSBvZlxuYGBpbmBgLlxuXG5UaGUgb3BlcmF0b3JzIGBgaXNgYCBhbmQgYGBpcyBub3RgYCB0ZXN0IGZvciBvYmplY3QgaWRlbnRpdHk6IGBgeCBpc1xueWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgKngqIGFuZCAqeSogYXJlIHRoZSBzYW1lIG9iamVjdC4gIGBgeCBpc1xubm90IHlgYCB5aWVsZHMgdGhlIGludmVyc2UgdHJ1dGggdmFsdWUuIFs3XVxuJywKKyAnaW50ZWdlcnMnOiAnXG5JbnRlZ2VyIGFuZCBsb25nIGludGVnZXIgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5JbnRlZ2VyIGFuZCBsb25nIGludGVnZXIgbGl0ZXJhbHMgYXJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nXG5sZXhpY2FsIGRlZmluaXRpb25zOlxuXG4gICBsb25naW50ZWdlciAgICA6Oj0gaW50ZWdlciAoImwiIHwgIkwiKVxuICAgaW50ZWdlciAgICAgICAgOjo9IGRlY2ltYWxpbnRlZ2VyIHwgb2N0aW50ZWdlciB8IGhleGludGVnZXIgfCBiaW5pbnRlZ2VyXG4gICBkZWNpbWFsaW50ZWdlciA6Oj0gbm9uemVyb2RpZ2l0IGRpZ2l0KiB8ICIwIlxuICAgb2N0aW50ZWdlciAgICAgOjo9ICIwIiAoIm8iIHwgIk8iKSBvY3RkaWdpdCsgfCAiMCIgb2N0ZGlnaXQrXG4gICBoZXhpbnRlZ2VyICAgICA6Oj0gIjAiICgieCIgfCAiWCIpIGhleGRpZ2l0K1xuICAgYmluaW50ZWdlciAgICAgOjo9ICIwIiAoImIiIHwgIkIiKSBiaW5kaWdpdCtcbiAgIG5vbnplcm9kaWdpdCAgIDo6PSAiMSIuLi4iOSJcbiAgIG9jdGRpZ2l0ICAgICAgIDo6PSAiMCIuLi4iNyJcbiAgIGJpbmRpZ2l0ICAgICAgIDo6PSAiMCIgfCAiMSJcbiAgIGhleGRpZ2l0ICAgICAgIDo6PSBkaWdpdCB8ICJhIi4uLiJmIiB8ICJBIi4uLiJGIlxuXG5BbHRob3VnaCBib3RoIGxvd2VyIGNhc2UgYGBcJ2xcJ2BgIGFuZCB1cHBlciBjYXNlIGBgXCdMXCdgYCBhcmUgYWxsb3dlZCBhc1xuc3VmZml4IGZvciBsb25nIGludGVnZXJzLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBhbHdheXMgdXNlXG5gYFwnTFwnYGAsIHNpbmNlIHRoZSBsZXR0ZXIgYGBcJ2xcJ2BgIGxvb2tzIHRvbyBtdWNoIGxpa2UgdGhlIGRpZ2l0XG5gYFwnMVwnYGAuXG5cblBsYWluIGludGVnZXIgbGl0ZXJhbHMgdGhhdCBhcmUgYWJvdmUgdGhlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBwbGFpblxuaW50ZWdlciAoZS5nLiwgMjE0NzQ4MzY0NyB3aGVuIHVzaW5nIDMyLWJpdCBhcml0aG1ldGljKSBhcmUgYWNjZXB0ZWRcbmFzIGlmIHRoZXkgd2VyZSBsb25nIGludGVnZXJzIGluc3RlYWQuIFsxXSAgVGhlcmUgaXMgbm8gbGltaXQgZm9yIGxvbmdcbmludGVnZXIgbGl0ZXJhbHMgYXBhcnQgZnJvbSB3aGF0IGNhbiBiZSBzdG9yZWQgaW4gYXZhaWxhYmxlIG1lbW9yeS5cblxuU29tZSBleGFtcGxlcyBvZiBwbGFpbiBpbnRlZ2VyIGxpdGVyYWxzIChmaXJzdCByb3cpIGFuZCBsb25nIGludGVnZXJcbmxpdGVyYWxzIChzZWNvbmQgYW5kIHRoaXJkIHJvd3MpOlxuXG4gICA3ICAgICAyMTQ3NDgzNjQ3ICAgICAgICAgICAgICAgICAgICAgICAgMDE3N1xuICAgM0wgICAgNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzZMICAgIDAzNzdMICAgMHgxMDAwMDAwMDBMXG4gICAgICAgICA3OTIyODE2MjUxNDI2NDMzNzU5MzU0Mzk1MDMzNiAgICAgICAgICAgICAweGRlYWRiZWVmXG4nLAorICdsYW1iZGEnOiAnXG5MYW1iZGFzXG4qKioqKioqXG5cbiAgIGxhbWJkYV9mb3JtICAgICA6Oj0gImxhbWJkYSIgW3BhcmFtZXRlcl9saXN0XTogZXhwcmVzc2lvblxuICAgb2xkX2xhbWJkYV9mb3JtIDo6PSAibGFtYmRhIiBbcGFyYW1ldGVyX2xpc3RdOiBvbGRfZXhwcmVzc2lvblxuXG5MYW1iZGEgZm9ybXMgKGxhbWJkYSBleHByZXNzaW9ucykgaGF2ZSB0aGUgc2FtZSBzeW50YWN0aWMgcG9zaXRpb24gYXNcbmV4cHJlc3Npb25zLiAgVGhleSBhcmUgYSBzaG9ydGhhbmQgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnM7IHRoZVxuZXhwcmVzc2lvbiBgYGxhbWJkYSBhcmd1bWVudHM6IGV4cHJlc3Npb25gYCB5aWVsZHMgYSBmdW5jdGlvbiBvYmplY3QuXG5UaGUgdW5uYW1lZCBvYmplY3QgYmVoYXZlcyBsaWtlIGEgZnVuY3Rpb24gb2JqZWN0IGRlZmluZWQgd2l0aFxuXG4gICBkZWYgbmFtZShhcmd1bWVudHMpOlxuICAgICAgIHJldHVybiBleHByZXNzaW9uXG5cblNlZSBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIHRoZSBzeW50YXggb2YgcGFyYW1ldGVyIGxpc3RzLlxuTm90ZSB0aGF0IGZ1bmN0aW9ucyBjcmVhdGVkIHdpdGggbGFtYmRhIGZvcm1zIGNhbm5vdCBjb250YWluXG5zdGF0ZW1lbnRzLlxuJywKKyAnbGlzdHMnOiAnXG5MaXN0IGRpc3BsYXlzXG4qKioqKioqKioqKioqXG5cbkEgbGlzdCBkaXNwbGF5IGlzIGEgcG9zc2libHkgZW1wdHkgc2VyaWVzIG9mIGV4cHJlc3Npb25zIGVuY2xvc2VkIGluXG5zcXVhcmUgYnJhY2tldHM6XG5cbiAgIGxpc3RfZGlzcGxheSAgICAgICAgOjo9ICJbIiBbZXhwcmVzc2lvbl9saXN0IHwgbGlzdF9jb21wcmVoZW5zaW9uXSAiXSJcbiAgIGxpc3RfY29tcHJlaGVuc2lvbiAgOjo9IGV4cHJlc3Npb24gbGlzdF9mb3JcbiAgIGxpc3RfZm9yICAgICAgICAgICAgOjo9ICJmb3IiIHRhcmdldF9saXN0ICJpbiIgb2xkX2V4cHJlc3Npb25fbGlzdCBbbGlzdF9pdGVyXVxuICAgb2xkX2V4cHJlc3Npb25fbGlzdCA6Oj0gb2xkX2V4cHJlc3Npb24gWygiLCIgb2xkX2V4cHJlc3Npb24pKyBbIiwiXV1cbiAgIG9sZF9leHByZXNzaW9uICAgICAgOjo9IG9yX3Rlc3QgfCBvbGRfbGFtYmRhX2Zvcm1cbiAgIGxpc3RfaXRlciAgICAgICAgICAgOjo9IGxpc3RfZm9yIHwgbGlzdF9pZlxuICAgbGlzdF9pZiAgICAgICAgICAgICA6Oj0gImlmIiBvbGRfZXhwcmVzc2lvbiBbbGlzdF9pdGVyXVxuXG5BIGxpc3QgZGlzcGxheSB5aWVsZHMgYSBuZXcgbGlzdCBvYmplY3QuICBJdHMgY29udGVudHMgYXJlIHNwZWNpZmllZFxuYnkgcHJvdmlkaW5nIGVpdGhlciBhIGxpc3Qgb2YgZXhwcmVzc2lvbnMgb3IgYSBsaXN0IGNvbXByZWhlbnNpb24uXG5XaGVuIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgaXMgc3VwcGxpZWQsIGl0cyBlbGVtZW50c1xuYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQgYW5kIHBsYWNlZCBpbnRvIHRoZSBsaXN0IG9iamVjdCBpblxudGhhdCBvcmRlci4gIFdoZW4gYSBsaXN0IGNvbXByZWhlbnNpb24gaXMgc3VwcGxpZWQsIGl0IGNvbnNpc3RzIG9mIGFcbnNpbmdsZSBleHByZXNzaW9uIGZvbGxvd2VkIGJ5IGF0IGxlYXN0IG9uZSBgYGZvcmBgIGNsYXVzZSBhbmQgemVybyBvclxubW9yZSBgYGZvcmBgIG9yIGBgaWZgYCBjbGF1c2VzLiAgSW4gdGhpcyBjYXNlLCB0aGUgZWxlbWVudHMgb2YgdGhlIG5ld1xubGlzdCBhcmUgdGhvc2UgdGhhdCB3b3VsZCBiZSBwcm9kdWNlZCBieSBjb25zaWRlcmluZyBlYWNoIG9mIHRoZVxuYGBmb3JgYCBvciBgYGlmYGAgY2xhdXNlcyBhIGJsb2NrLCBuZXN0aW5nIGZyb20gbGVmdCB0byByaWdodCwgYW5kXG5ldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uIHRvIHByb2R1Y2UgYSBsaXN0IGVsZW1lbnQgZWFjaCB0aW1lIHRoZVxuaW5uZXJtb3N0IGJsb2NrIGlzIHJlYWNoZWQgWzFdLlxuJywKKyAnbmFtaW5nJzogIlxuTmFtaW5nIGFuZCBiaW5kaW5nXG4qKioqKioqKioqKioqKioqKipcblxuKk5hbWVzKiByZWZlciB0byBvYmplY3RzLiAgTmFtZXMgYXJlIGludHJvZHVjZWQgYnkgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb25zLiBFYWNoIG9jY3VycmVuY2Ugb2YgYSBuYW1lIGluIHRoZSBwcm9ncmFtIHRleHQgcmVmZXJzIHRvXG50aGUgKmJpbmRpbmcqIG9mIHRoYXQgbmFtZSBlc3RhYmxpc2hlZCBpbiB0aGUgaW5uZXJtb3N0IGZ1bmN0aW9uIGJsb2NrXG5jb250YWluaW5nIHRoZSB1c2UuXG5cbkEgKmJsb2NrKiBpcyBhIHBpZWNlIG9mIFB5dGhvbiBwcm9ncmFtIHRleHQgdGhhdCBpcyBleGVjdXRlZCBhcyBhXG51bml0LiBUaGUgZm9sbG93aW5nIGFyZSBibG9ja3M6IGEgbW9kdWxlLCBhIGZ1bmN0aW9uIGJvZHksIGFuZCBhIGNsYXNzXG5kZWZpbml0aW9uLiBFYWNoIGNvbW1hbmQgdHlwZWQgaW50ZXJhY3RpdmVseSBpcyBhIGJsb2NrLiAgQSBzY3JpcHRcbmZpbGUgKGEgZmlsZSBnaXZlbiBhcyBzdGFuZGFyZCBpbnB1dCB0byB0aGUgaW50ZXJwcmV0ZXIgb3Igc3BlY2lmaWVkXG5vbiB0aGUgaW50ZXJwcmV0ZXIgY29tbWFuZCBsaW5lIHRoZSBmaXJzdCBhcmd1bWVudCkgaXMgYSBjb2RlIGJsb2NrLlxuQSBzY3JpcHQgY29tbWFuZCAoYSBjb21tYW5kIHNwZWNpZmllZCBvbiB0aGUgaW50ZXJwcmV0ZXIgY29tbWFuZCBsaW5lXG53aXRoIHRoZSAnKiotYyoqJyBvcHRpb24pIGlzIGEgY29kZSBibG9jay4gIFRoZSBmaWxlIHJlYWQgYnkgdGhlXG5idWlsdC1pbiBmdW5jdGlvbiBgYGV4ZWNmaWxlKClgYCBpcyBhIGNvZGUgYmxvY2suICBUaGUgc3RyaW5nIGFyZ3VtZW50XG5wYXNzZWQgdG8gdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgZXZhbCgpYGAgYW5kIHRvIHRoZSBgYGV4ZWNgYFxuc3RhdGVtZW50IGlzIGEgY29kZSBibG9jay4gVGhlIGV4cHJlc3Npb24gcmVhZCBhbmQgZXZhbHVhdGVkIGJ5IHRoZVxuYnVpbHQtaW4gZnVuY3Rpb24gYGBpbnB1dCgpYGAgaXMgYSBjb2RlIGJsb2NrLlxuXG5BIGNvZGUgYmxvY2sgaXMgZXhlY3V0ZWQgaW4gYW4gKmV4ZWN1dGlvbiBmcmFtZSouICBBIGZyYW1lIGNvbnRhaW5zXG5zb21lIGFkbWluaXN0cmF0aXZlIGluZm9ybWF0aW9uICh1c2VkIGZvciBkZWJ1Z2dpbmcpIGFuZCBkZXRlcm1pbmVzXG53aGVyZSBhbmQgaG93IGV4ZWN1dGlvbiBjb250aW51ZXMgYWZ0ZXIgdGhlIGNvZGUgYmxvY2sncyBleGVjdXRpb24gaGFzXG5jb21wbGV0ZWQuXG5cbkEgKnNjb3BlKiBkZWZpbmVzIHRoZSB2aXNpYmlsaXR5IG9mIGEgbmFtZSB3aXRoaW4gYSBibG9jay4gIElmIGEgbG9jYWxcbnZhcmlhYmxlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgaXRzIHNjb3BlIGluY2x1ZGVzIHRoYXQgYmxvY2suICBJZiB0aGVcbmRlZmluaXRpb24gb2NjdXJzIGluIGEgZnVuY3Rpb24gYmxvY2ssIHRoZSBzY29wZSBleHRlbmRzIHRvIGFueSBibG9ja3NcbmNvbnRhaW5lZCB3aXRoaW4gdGhlIGRlZmluaW5nIG9uZSwgdW5sZXNzIGEgY29udGFpbmVkIGJsb2NrIGludHJvZHVjZXNcbmEgZGlmZmVyZW50IGJpbmRpbmcgZm9yIHRoZSBuYW1lLiAgVGhlIHNjb3BlIG9mIG5hbWVzIGRlZmluZWQgaW4gYVxuY2xhc3MgYmxvY2sgaXMgbGltaXRlZCB0byB0aGUgY2xhc3MgYmxvY2s7IGl0IGRvZXMgbm90IGV4dGVuZCB0byB0aGVcbmNvZGUgYmxvY2tzIG9mIG1ldGhvZHMgLS0gdGhpcyBpbmNsdWRlcyBnZW5lcmF0b3IgZXhwcmVzc2lvbnMgc2luY2VcbnRoZXkgYXJlIGltcGxlbWVudGVkIHVzaW5nIGEgZnVuY3Rpb24gc2NvcGUuICBUaGlzIG1lYW5zIHRoYXQgdGhlXG5mb2xsb3dpbmcgd2lsbCBmYWlsOlxuXG4gICBjbGFzcyBBOlxuICAgICAgIGEgPSA0MlxuICAgICAgIGIgPSBsaXN0KGEgKyBpIGZvciBpIGluIHJhbmdlKDEwKSlcblxuV2hlbiBhIG5hbWUgaXMgdXNlZCBpbiBhIGNvZGUgYmxvY2ssIGl0IGlzIHJlc29sdmVkIHVzaW5nIHRoZSBuZWFyZXN0XG5lbmNsb3Npbmcgc2NvcGUuICBUaGUgc2V0IG9mIGFsbCBzdWNoIHNjb3BlcyB2aXNpYmxlIHRvIGEgY29kZSBibG9ja1xuaXMgY2FsbGVkIHRoZSBibG9jaydzICplbnZpcm9ubWVudCouXG5cbklmIGEgbmFtZSBpcyBib3VuZCBpbiBhIGJsb2NrLCBpdCBpcyBhIGxvY2FsIHZhcmlhYmxlIG9mIHRoYXQgYmxvY2suXG5JZiBhIG5hbWUgaXMgYm91bmQgYXQgdGhlIG1vZHVsZSBsZXZlbCwgaXQgaXMgYSBnbG9iYWwgdmFyaWFibGUuICAoVGhlXG52YXJpYWJsZXMgb2YgdGhlIG1vZHVsZSBjb2RlIGJsb2NrIGFyZSBsb2NhbCBhbmQgZ2xvYmFsLikgIElmIGFcbnZhcmlhYmxlIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrIGJ1dCBub3QgZGVmaW5lZCB0aGVyZSwgaXQgaXMgYSAqZnJlZVxudmFyaWFibGUqLlxuXG5XaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhIGBgTmFtZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbklmIHRoZSBuYW1lIHJlZmVycyB0byBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgaGFzIG5vdCBiZWVuIGJvdW5kLCBhXG5gYFVuYm91bmRMb2NhbEVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIGBgVW5ib3VuZExvY2FsRXJyb3JgYCBpcyBhXG5zdWJjbGFzcyBvZiBgYE5hbWVFcnJvcmBgLlxuXG5UaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczogZm9ybWFsIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLFxuYGBpbXBvcnRgYCBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlIGJpbmQgdGhlXG5jbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgYXJlXG5pZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgYGBmb3JgYCBsb29wIGhlYWRlciwgaW4gdGhlXG5zZWNvbmQgcG9zaXRpb24gb2YgYW4gYGBleGNlcHRgYCBjbGF1c2UgaGVhZGVyIG9yIGFmdGVyIGBgYXNgYCBpbiBhXG5gYHdpdGhgYCBzdGF0ZW1lbnQuICBUaGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gYGBmcm9tIC4uLlxuaW1wb3J0ICpgYCBiaW5kcyBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGUgaW1wb3J0ZWQgbW9kdWxlLCBleGNlcHRcbnRob3NlIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUuICBUaGlzIGZvcm0gbWF5IG9ubHkgYmUgdXNlZCBhdCB0aGVcbm1vZHVsZSBsZXZlbC5cblxuQSB0YXJnZXQgb2NjdXJyaW5nIGluIGEgYGBkZWxgYCBzdGF0ZW1lbnQgaXMgYWxzbyBjb25zaWRlcmVkIGJvdW5kIGZvclxudGhpcyBwdXJwb3NlICh0aG91Z2ggdGhlIGFjdHVhbCBzZW1hbnRpY3MgYXJlIHRvIHVuYmluZCB0aGUgbmFtZSkuICBJdFxuaXMgaWxsZWdhbCB0byB1bmJpbmQgYSBuYW1lIHRoYXQgaXMgcmVmZXJlbmNlZCBieSBhbiBlbmNsb3Npbmcgc2NvcGU7XG50aGUgY29tcGlsZXIgd2lsbCByZXBvcnQgYSBgYFN5bnRheEVycm9yYGAuXG5cbkVhY2ggYXNzaWdubWVudCBvciBpbXBvcnQgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jayBkZWZpbmVkIGJ5IGFcbmNsYXNzIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24gb3IgYXQgdGhlIG1vZHVsZSBsZXZlbCAodGhlIHRvcC1sZXZlbFxuY29kZSBibG9jaykuXG5cbklmIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbiBvY2N1cnMgYW55d2hlcmUgd2l0aGluIGEgY29kZSBibG9jaywgYWxsXG51c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byB0aGVcbmN1cnJlbnQgYmxvY2suICBUaGlzIGNhbiBsZWFkIHRvIGVycm9ycyB3aGVuIGEgbmFtZSBpcyB1c2VkIHdpdGhpbiBhXG5ibG9jayBiZWZvcmUgaXQgaXMgYm91bmQuIFRoaXMgcnVsZSBpcyBzdWJ0bGUuICBQeXRob24gbGFja3NcbmRlY2xhcmF0aW9ucyBhbmQgYWxsb3dzIG5hbWUgYmluZGluZyBvcGVyYXRpb25zIHRvIG9jY3VyIGFueXdoZXJlXG53aXRoaW4gYSBjb2RlIGJsb2NrLiAgVGhlIGxvY2FsIHZhcmlhYmxlcyBvZiBhIGNvZGUgYmxvY2sgY2FuIGJlXG5kZXRlcm1pbmVkIGJ5IHNjYW5uaW5nIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgYmxvY2sgZm9yIG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy5cblxuSWYgdGhlIGdsb2JhbCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrLCBhbGwgdXNlcyBvZiB0aGUgbmFtZVxuc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGluIHRoZVxudG9wLWxldmVsIG5hbWVzcGFjZS4gTmFtZXMgYXJlIHJlc29sdmVkIGluIHRoZSB0b3AtbGV2ZWwgbmFtZXNwYWNlIGJ5XG5zZWFyY2hpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGkuZS4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlXG5jb250YWluaW5nIHRoZSBjb2RlIGJsb2NrLCBhbmQgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSwgdGhlIG5hbWVzcGFjZVxub2YgdGhlIG1vZHVsZSBgYF9fYnVpbHRpbl9fYGAuICBUaGUgZ2xvYmFsIG5hbWVzcGFjZSBpcyBzZWFyY2hlZFxuZmlyc3QuICBJZiB0aGUgbmFtZSBpcyBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGlucyBuYW1lc3BhY2UgaXNcbnNlYXJjaGVkLiAgVGhlIGdsb2JhbCBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBuYW1lLlxuXG5UaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSBibG9ja1xuaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSBgYF9fYnVpbHRpbnNfX2BgIGluIGl0c1xuZ2xvYmFsIG5hbWVzcGFjZTsgdGhpcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG9yIGEgbW9kdWxlIChpbiB0aGVcbmxhdHRlciBjYXNlIHRoZSBtb2R1bGUncyBkaWN0aW9uYXJ5IGlzIHVzZWQpLiAgQnkgZGVmYXVsdCwgd2hlbiBpbiB0aGVcbmBgX19tYWluX19gYCBtb2R1bGUsIGBgX19idWlsdGluc19fYGAgaXMgdGhlIGJ1aWx0LWluIG1vZHVsZVxuYGBfX2J1aWx0aW5fX2BgIChub3RlOiBubyAncycpOyB3aGVuIGluIGFueSBvdGhlciBtb2R1bGUsXG5gYF9fYnVpbHRpbnNfX2BgIGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiB0aGUgYGBfX2J1aWx0aW5fX2BgXG5tb2R1bGUgaXRzZWxmLiAgYGBfX2J1aWx0aW5zX19gYCBjYW4gYmUgc2V0IHRvIGEgdXNlci1jcmVhdGVkXG5kaWN0aW9uYXJ5IHRvIGNyZWF0ZSBhIHdlYWsgZm9ybSBvZiByZXN0cmljdGVkIGV4ZWN1dGlvbi5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBVc2VycyBzaG91bGQgbm90IHRvdWNoXG5gYF9fYnVpbHRpbnNfX2BgOyBpdCBpcyBzdHJpY3RseSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuICBVc2Vyc1xud2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBzaG91bGQgYGBpbXBvcnRgYFxudGhlIGBgX19idWlsdGluX19gYCAobm8gJ3MnKSBtb2R1bGUgYW5kIG1vZGlmeSBpdHMgYXR0cmlidXRlc1xuYXBwcm9wcmlhdGVseS5cblxuVGhlIG5hbWVzcGFjZSBmb3IgYSBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIGFcbm1vZHVsZSBpcyBpbXBvcnRlZC4gIFRoZSBtYWluIG1vZHVsZSBmb3IgYSBzY3JpcHQgaXMgYWx3YXlzIGNhbGxlZFxuYGBfX21haW5fX2BgLlxuXG5UaGUgYGBnbG9iYWxgYCBzdGF0ZW1lbnQgaGFzIHRoZSBzYW1lIHNjb3BlIGFzIGEgbmFtZSBiaW5kaW5nXG5vcGVyYXRpb24gaW4gdGhlIHNhbWUgYmxvY2suICBJZiB0aGUgbmVhcmVzdCBlbmNsb3Npbmcgc2NvcGUgZm9yIGFcbmZyZWUgdmFyaWFibGUgY29udGFpbnMgYSBnbG9iYWwgc3RhdGVtZW50LCB0aGUgZnJlZSB2YXJpYWJsZSBpc1xudHJlYXRlZCBhcyBhIGdsb2JhbC5cblxuQSBjbGFzcyBkZWZpbml0aW9uIGlzIGFuIGV4ZWN1dGFibGUgc3RhdGVtZW50IHRoYXQgbWF5IHVzZSBhbmQgZGVmaW5lXG5uYW1lcy4gVGhlc2UgcmVmZXJlbmNlcyBmb2xsb3cgdGhlIG5vcm1hbCBydWxlcyBmb3IgbmFtZSByZXNvbHV0aW9uLlxuVGhlIG5hbWVzcGFjZSBvZiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBiZWNvbWVzIHRoZSBhdHRyaWJ1dGUgZGljdGlvbmFyeVxub2YgdGhlIGNsYXNzLiAgTmFtZXMgZGVmaW5lZCBhdCB0aGUgY2xhc3Mgc2NvcGUgYXJlIG5vdCB2aXNpYmxlIGluXG5tZXRob2RzLlxuXG5cbkludGVyYWN0aW9uIHdpdGggZHluYW1pYyBmZWF0dXJlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZXJlIGFyZSBzZXZlcmFsIGNhc2VzIHdoZXJlIFB5dGhvbiBzdGF0ZW1lbnRzIGFyZSBpbGxlZ2FsIHdoZW4gdXNlZFxuaW4gY29uanVuY3Rpb24gd2l0aCBuZXN0ZWQgc2NvcGVzIHRoYXQgY29udGFpbiBmcmVlIHZhcmlhYmxlcy5cblxuSWYgYSB2YXJpYWJsZSBpcyByZWZlcmVuY2VkIGluIGFuIGVuY2xvc2luZyBzY29wZSwgaXQgaXMgaWxsZWdhbCB0b1xuZGVsZXRlIHRoZSBuYW1lLiAgQW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZCBhdCBjb21waWxlIHRpbWUuXG5cbklmIHRoZSB3aWxkIGNhcmQgZm9ybSBvZiBpbXBvcnQgLS0tIGBgaW1wb3J0ICpgYCAtLS0gaXMgdXNlZCBpbiBhXG5mdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGEgbmVzdGVkIGJsb2NrIHdpdGggZnJlZVxudmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhIGBgU3ludGF4RXJyb3JgYC5cblxuSWYgYGBleGVjYGAgaXMgdXNlZCBpbiBhIGZ1bmN0aW9uIGFuZCB0aGUgZnVuY3Rpb24gY29udGFpbnMgb3IgaXMgYVxubmVzdGVkIGJsb2NrIHdpdGggZnJlZSB2YXJpYWJsZXMsIHRoZSBjb21waWxlciB3aWxsIHJhaXNlIGFcbmBgU3ludGF4RXJyb3JgYCB1bmxlc3MgdGhlIGV4ZWMgZXhwbGljaXRseSBzcGVjaWZpZXMgdGhlIGxvY2FsXG5uYW1lc3BhY2UgZm9yIHRoZSBgYGV4ZWNgYC4gIChJbiBvdGhlciB3b3JkcywgYGBleGVjIG9iamBgIHdvdWxkIGJlXG5pbGxlZ2FsLCBidXQgYGBleGVjIG9iaiBpbiBuc2BgIHdvdWxkIGJlIGxlZ2FsLilcblxuVGhlIGBgZXZhbCgpYGAsIGBgZXhlY2ZpbGUoKWBgLCBhbmQgYGBpbnB1dCgpYGAgZnVuY3Rpb25zIGFuZCB0aGVcbmBgZXhlY2BgIHN0YXRlbWVudCBkbyBub3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGZ1bGwgZW52aXJvbm1lbnQgZm9yXG5yZXNvbHZpbmcgbmFtZXMuICBOYW1lcyBtYXkgYmUgcmVzb2x2ZWQgaW4gdGhlIGxvY2FsIGFuZCBnbG9iYWxcbm5hbWVzcGFjZXMgb2YgdGhlIGNhbGxlci4gIEZyZWUgdmFyaWFibGVzIGFyZSBub3QgcmVzb2x2ZWQgaW4gdGhlXG5uZWFyZXN0IGVuY2xvc2luZyBuYW1lc3BhY2UsIGJ1dCBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gWzFdIFRoZVxuYGBleGVjYGAgc3RhdGVtZW50IGFuZCB0aGUgYGBldmFsKClgYCBhbmQgYGBleGVjZmlsZSgpYGAgZnVuY3Rpb25zXG5oYXZlIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBvdmVycmlkZSB0aGUgZ2xvYmFsIGFuZCBsb2NhbCBuYW1lc3BhY2UuXG5JZiBvbmx5IG9uZSBuYW1lc3BhY2UgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGZvciBib3RoLlxuIiwKKyAnbnVtYmVycyc6ICJcbk51bWVyaWMgbGl0ZXJhbHNcbioqKioqKioqKioqKioqKipcblxuVGhlcmUgYXJlIGZvdXIgdHlwZXMgb2YgbnVtZXJpYyBsaXRlcmFsczogcGxhaW4gaW50ZWdlcnMsIGxvbmdcbmludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBhbmQgaW1hZ2luYXJ5IG51bWJlcnMuICBUaGVyZSBhcmUgbm9cbmNvbXBsZXggbGl0ZXJhbHMgKGNvbXBsZXggbnVtYmVycyBjYW4gYmUgZm9ybWVkIGJ5IGFkZGluZyBhIHJlYWxcbm51bWJlciBhbmQgYW4gaW1hZ2luYXJ5IG51bWJlcikuXG5cbk5vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZSBgYC0xYGBcbmlzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yICdgYC1gYCcgYW5kXG50aGUgbGl0ZXJhbCBgYDFgYC5cbiIsCisgJ251bWVyaWMtdHlwZXMnOiAnXG5FbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyBvYmplY3RzLlxuTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGVcbnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3Jcbm5vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG5cbm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Rpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9fbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2FuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9feG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19vcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoYGArYGAsIGBgLWBgLCBgYCpgYCwgYGAvL2BgLCBgYCVgYCwgYGBkaXZtb2QoKWBgLFxuICAgYGBwb3coKWBgLCBgYCoqYGAsIGBgPDxgYCwgYGA+PmBgLCBgYCZgYCwgYGBeYGAsIGBgfGBgKS4gIEZvclxuICAgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGBgeCArIHlgYCwgd2hlcmUgKngqIGlzIGFuXG4gICBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuIGBgX19hZGRfXygpYGAgbWV0aG9kLFxuICAgYGB4Ll9fYWRkX18oeSlgYCBpcyBjYWxsZWQuICBUaGUgYGBfX2Rpdm1vZF9fKClgYCBtZXRob2Qgc2hvdWxkIGJlXG4gICB0aGUgZXF1aXZhbGVudCB0byB1c2luZyBgYF9fZmxvb3JkaXZfXygpYGAgYW5kIGBgX19tb2RfXygpYGA7IGl0XG4gICBzaG91bGQgbm90IGJlIHJlbGF0ZWQgdG8gYGBfX3RydWVkaXZfXygpYGAgKGRlc2NyaWJlZCBiZWxvdykuICBOb3RlXG4gICB0aGF0IGBgX19wb3dfXygpYGAgc2hvdWxkIGJlIGRlZmluZWQgdG8gYWNjZXB0IGFuIG9wdGlvbmFsIHRoaXJkXG4gICBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSBidWlsdC1pbiBgYHBvdygpYGAgZnVuY3Rpb25cbiAgIGlzIHRvIGJlIHN1cHBvcnRlZC5cblxuICAgSWYgb25lIG9mIHRob3NlIG1ldGhvZHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlXG4gICBzdXBwbGllZCBhcmd1bWVudHMsIGl0IHNob3VsZCByZXR1cm4gYGBOb3RJbXBsZW1lbnRlZGBgLlxuXG5vYmplY3QuX19kaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3RydWVkaXZfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlIGRpdmlzaW9uIG9wZXJhdG9yIChgYC9gYCkgaXMgaW1wbGVtZW50ZWQgYnkgdGhlc2UgbWV0aG9kcy4gIFRoZVxuICAgYGBfX3RydWVkaXZfXygpYGAgbWV0aG9kIGlzIHVzZWQgd2hlbiBgYF9fZnV0dXJlX18uZGl2aXNpb25gYCBpcyBpblxuICAgZWZmZWN0LCBvdGhlcndpc2UgYGBfX2Rpdl9fKClgYCBpcyB1c2VkLiAgSWYgb25seSBvbmUgb2YgdGhlc2UgdHdvXG4gICBtZXRob2RzIGlzIGRlZmluZWQsIHRoZSBvYmplY3Qgd2lsbCBub3Qgc3VwcG9ydCBkaXZpc2lvbiBpbiB0aGVcbiAgIGFsdGVybmF0ZSBjb250ZXh0OyBgYFR5cGVFcnJvcmBgIHdpbGwgYmUgcmFpc2VkIGluc3RlYWQuXG5cbm9iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JkaXZtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jyc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JhbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jvcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoYGArYGAsIGBgLWBgLCBgYCpgYCwgYGAvYGAsIGBgJWBgLCBgYGRpdm1vZCgpYGAsXG4gICBgYHBvdygpYGAsIGBgKipgYCwgYGA8PGBgLCBgYD4+YGAsIGBgJmBgLCBgYF5gYCwgYGB8YGApIHdpdGhcbiAgIHJlZmxlY3RlZCAoc3dhcHBlZCkgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmXG4gICB0aGUgbGVmdCBvcGVyYW5kIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZFxuICAgdGhlIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMuIFsyXSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlXG4gICB0aGUgZXhwcmVzc2lvbiBgYHggLSB5YGAsIHdoZXJlICp5KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXRcbiAgIGhhcyBhbiBgYF9fcnN1Yl9fKClgYCBtZXRob2QsIGBgeS5fX3JzdWJfXyh4KWBgIGlzIGNhbGxlZCBpZlxuICAgYGB4Ll9fc3ViX18oeSlgYCByZXR1cm5zICpOb3RJbXBsZW1lbnRlZCouXG5cbiAgIE5vdGUgdGhhdCB0ZXJuYXJ5IGBgcG93KClgYCB3aWxsIG5vdCB0cnkgY2FsbGluZyBgYF9fcnBvd19fKClgYFxuICAgKHRoZSBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS5cblxuICAgTm90ZTogSWYgdGhlIHJpZ2h0IG9wZXJhbmRcJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmRcJ3NcbiAgICAgdHlwZSBhbmQgdGhhdCBzdWJjbGFzcyBwcm92aWRlcyB0aGUgcmVmbGVjdGVkIG1ldGhvZCBmb3IgdGhlXG4gICAgIG9wZXJhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBsZWZ0IG9wZXJhbmRcJ3NcbiAgICAgbm9uLXJlZmxlY3RlZCBtZXRob2QuICBUaGlzIGJlaGF2aW9yIGFsbG93cyBzdWJjbGFzc2VzIHRvXG4gICAgIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9yc1wnIG9wZXJhdGlvbnMuXG5cbm9iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19peG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYXVnbWVudGVkIGFyaXRobWV0aWNcbiAgIGFzc2lnbm1lbnRzIChgYCs9YGAsIGBgLT1gYCwgYGAqPWBgLCBgYC89YGAsIGBgLy89YGAsIGBgJT1gYCxcbiAgIGBgKio9YGAsIGBgPDw9YGAsIGBgPj49YGAsIGBgJj1gYCwgYGBePWBgLCBgYHw9YGApLiAgVGhlc2UgbWV0aG9kc1xuICAgc2hvdWxkIGF0dGVtcHQgdG8gZG8gdGhlIG9wZXJhdGlvbiBpbi1wbGFjZSAobW9kaWZ5aW5nICpzZWxmKikgYW5kXG4gICByZXR1cm4gdGhlIHJlc3VsdCAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLFxuICAgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCB0aGUgYXVnbWVudGVkXG4gICBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBtZXRob2RzLiAgRm9yIGluc3RhbmNlLCB0b1xuICAgZXhlY3V0ZSB0aGUgc3RhdGVtZW50IGBgeCArPSB5YGAsIHdoZXJlICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhXG4gICBjbGFzcyB0aGF0IGhhcyBhbiBgYF9faWFkZF9fKClgYCBtZXRob2QsIGBgeC5fX2lhZGRfXyh5KWBgIGlzXG4gICBjYWxsZWQuICBJZiAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGRvZXMgbm90IGRlZmluZSBhXG4gICBgYF9faWFkZF9fKClgYCBtZXRob2QsIGBgeC5fX2FkZF9fKHkpYGAgYW5kIGBgeS5fX3JhZGRfXyh4KWBgIGFyZVxuICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiBgYHggKyB5YGAuXG5cbm9iamVjdC5fX25lZ19fKHNlbGYpXG5vYmplY3QuX19wb3NfXyhzZWxmKVxub2JqZWN0Ll9fYWJzX18oc2VsZilcbm9iamVjdC5fX2ludmVydF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoYGAtYGAsIGBgK2BgLFxuICAgYGBhYnMoKWBgIGFuZCBgYH5gYCkuXG5cbm9iamVjdC5fX2NvbXBsZXhfXyhzZWxmKVxub2JqZWN0Ll9faW50X18oc2VsZilcbm9iamVjdC5fX2xvbmdfXyhzZWxmKVxub2JqZWN0Ll9fZmxvYXRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgYGBjb21wbGV4KClgYCxcbiAgIGBgaW50KClgYCwgYGBsb25nKClgYCwgYW5kIGBgZmxvYXQoKWBgLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mXG4gICB0aGUgYXBwcm9wcmlhdGUgdHlwZS5cblxub2JqZWN0Ll9fb2N0X18oc2VsZilcbm9iamVjdC5fX2hleF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYG9jdCgpYGAgYW5kIGBgaGV4KClgYC5cbiAgIFNob3VsZCByZXR1cm4gYSBzdHJpbmcgdmFsdWUuXG5cbm9iamVjdC5fX2luZGV4X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBgYG9wZXJhdG9yLmluZGV4KClgYC4gIEFsc28gY2FsbGVkIHdoZW5ldmVyXG4gICBQeXRob24gbmVlZHMgYW4gaW50ZWdlciBvYmplY3QgKHN1Y2ggYXMgaW4gc2xpY2luZykuICBNdXN0IHJldHVyblxuICAgYW4gaW50ZWdlciAoaW50IG9yIGxvbmcpLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbm9iamVjdC5fX2NvZXJjZV9fKHNlbGYsIG90aGVyKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50ICJtaXhlZC1tb2RlIiBudW1lcmljIGFyaXRobWV0aWMuICBTaG91bGQgZWl0aGVyXG4gICByZXR1cm4gYSAyLXR1cGxlIGNvbnRhaW5pbmcgKnNlbGYqIGFuZCAqb3RoZXIqIGNvbnZlcnRlZCB0byBhXG4gICBjb21tb24gbnVtZXJpYyB0eXBlLCBvciBgYE5vbmVgYCBpZiBjb252ZXJzaW9uIGlzIGltcG9zc2libGUuICBXaGVuXG4gICB0aGUgY29tbW9uIHR5cGUgd291bGQgYmUgdGhlIHR5cGUgb2YgYGBvdGhlcmBgLCBpdCBpcyBzdWZmaWNpZW50IHRvXG4gICByZXR1cm4gYGBOb25lYGAsIHNpbmNlIHRoZSBpbnRlcnByZXRlciB3aWxsIGFsc28gYXNrIHRoZSBvdGhlclxuICAgb2JqZWN0IHRvIGF0dGVtcHQgYSBjb2VyY2lvbiAoYnV0IHNvbWV0aW1lcywgaWYgdGhlIGltcGxlbWVudGF0aW9uXG4gICBvZiB0aGUgb3RoZXIgdHlwZSBjYW5ub3QgYmUgY2hhbmdlZCwgaXQgaXMgdXNlZnVsIHRvIGRvIHRoZVxuICAgY29udmVyc2lvbiB0byB0aGUgb3RoZXIgdHlwZSBoZXJlKS4gIEEgcmV0dXJuIHZhbHVlIG9mXG4gICBgYE5vdEltcGxlbWVudGVkYGAgaXMgZXF1aXZhbGVudCB0byByZXR1cm5pbmcgYGBOb25lYGAuXG4nLAorICdvYmplY3RzJzogJ1xuT2JqZWN0cywgdmFsdWVzIGFuZCB0eXBlc1xuKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4qT2JqZWN0cyogYXJlIFB5dGhvblwncyBhYnN0cmFjdGlvbiBmb3IgZGF0YS4gIEFsbCBkYXRhIGluIGEgUHl0aG9uXG5wcm9ncmFtIGlzIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMgb3IgYnkgcmVsYXRpb25zIGJldHdlZW4gb2JqZWN0cy4gKEluXG5hIHNlbnNlLCBhbmQgaW4gY29uZm9ybWFuY2UgdG8gVm9uIE5ldW1hbm5cJ3MgbW9kZWwgb2YgYSAic3RvcmVkXG5wcm9ncmFtIGNvbXB1dGVyLCIgY29kZSBpcyBhbHNvIHJlcHJlc2VudGVkIGJ5IG9iamVjdHMuKVxuXG5FdmVyeSBvYmplY3QgaGFzIGFuIGlkZW50aXR5LCBhIHR5cGUgYW5kIGEgdmFsdWUuICBBbiBvYmplY3RcJ3NcbippZGVudGl0eSogbmV2ZXIgY2hhbmdlcyBvbmNlIGl0IGhhcyBiZWVuIGNyZWF0ZWQ7IHlvdSBtYXkgdGhpbmsgb2YgaXRcbmFzIHRoZSBvYmplY3RcJ3MgYWRkcmVzcyBpbiBtZW1vcnkuICBUaGUgXCdgYGlzYGBcJyBvcGVyYXRvciBjb21wYXJlcyB0aGVcbmlkZW50aXR5IG9mIHR3byBvYmplY3RzOyB0aGUgYGBpZCgpYGAgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyXG5yZXByZXNlbnRpbmcgaXRzIGlkZW50aXR5IChjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgaXRzIGFkZHJlc3MpLiBBblxub2JqZWN0XCdzICp0eXBlKiBpcyBhbHNvIHVuY2hhbmdlYWJsZS4gWzFdIEFuIG9iamVjdFwncyB0eXBlIGRldGVybWluZXNcbnRoZSBvcGVyYXRpb25zIHRoYXQgdGhlIG9iamVjdCBzdXBwb3J0cyAoZS5nLiwgImRvZXMgaXQgaGF2ZSBhXG5sZW5ndGg/IikgYW5kIGFsc28gZGVmaW5lcyB0aGUgcG9zc2libGUgdmFsdWVzIGZvciBvYmplY3RzIG9mIHRoYXRcbnR5cGUuICBUaGUgYGB0eXBlKClgYCBmdW5jdGlvbiByZXR1cm5zIGFuIG9iamVjdFwncyB0eXBlICh3aGljaCBpcyBhblxub2JqZWN0IGl0c2VsZikuICBUaGUgKnZhbHVlKiBvZiBzb21lIG9iamVjdHMgY2FuIGNoYW5nZS4gIE9iamVjdHNcbndob3NlIHZhbHVlIGNhbiBjaGFuZ2UgYXJlIHNhaWQgdG8gYmUgKm11dGFibGUqOyBvYmplY3RzIHdob3NlIHZhbHVlXG5pcyB1bmNoYW5nZWFibGUgb25jZSB0aGV5IGFyZSBjcmVhdGVkIGFyZSBjYWxsZWQgKmltbXV0YWJsZSouIChUaGVcbnZhbHVlIG9mIGFuIGltbXV0YWJsZSBjb250YWluZXIgb2JqZWN0IHRoYXQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYVxubXV0YWJsZSBvYmplY3QgY2FuIGNoYW5nZSB3aGVuIHRoZSBsYXR0ZXJcJ3MgdmFsdWUgaXMgY2hhbmdlZDsgaG93ZXZlclxudGhlIGNvbnRhaW5lciBpcyBzdGlsbCBjb25zaWRlcmVkIGltbXV0YWJsZSwgYmVjYXVzZSB0aGUgY29sbGVjdGlvbiBvZlxub2JqZWN0cyBpdCBjb250YWlucyBjYW5ub3QgYmUgY2hhbmdlZC4gIFNvLCBpbW11dGFiaWxpdHkgaXMgbm90XG5zdHJpY3RseSB0aGUgc2FtZSBhcyBoYXZpbmcgYW4gdW5jaGFuZ2VhYmxlIHZhbHVlLCBpdCBpcyBtb3JlIHN1YnRsZS4pXG5BbiBvYmplY3RcJ3MgbXV0YWJpbGl0eSBpcyBkZXRlcm1pbmVkIGJ5IGl0cyB0eXBlOyBmb3IgaW5zdGFuY2UsXG5udW1iZXJzLCBzdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSwgd2hpbGUgZGljdGlvbmFyaWVzIGFuZFxubGlzdHMgYXJlIG11dGFibGUuXG5cbk9iamVjdHMgYXJlIG5ldmVyIGV4cGxpY2l0bHkgZGVzdHJveWVkOyBob3dldmVyLCB3aGVuIHRoZXkgYmVjb21lXG51bnJlYWNoYWJsZSB0aGV5IG1heSBiZSBnYXJiYWdlLWNvbGxlY3RlZC4gIEFuIGltcGxlbWVudGF0aW9uIGlzXG5hbGxvd2VkIHRvIHBvc3Rwb25lIGdhcmJhZ2UgY29sbGVjdGlvbiBvciBvbWl0IGl0IGFsdG9nZXRoZXIgLS0tIGl0IGlzXG5hIG1hdHRlciBvZiBpbXBsZW1lbnRhdGlvbiBxdWFsaXR5IGhvdyBnYXJiYWdlIGNvbGxlY3Rpb24gaXNcbmltcGxlbWVudGVkLCBhcyBsb25nIGFzIG5vIG9iamVjdHMgYXJlIGNvbGxlY3RlZCB0aGF0IGFyZSBzdGlsbFxucmVhY2hhYmxlLlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIENQeXRob24gY3VycmVudGx5IHVzZXMgYSByZWZlcmVuY2UtXG5jb3VudGluZyBzY2hlbWUgd2l0aCAob3B0aW9uYWwpIGRlbGF5ZWQgZGV0ZWN0aW9uIG9mIGN5Y2xpY2FsbHkgbGlua2VkXG5nYXJiYWdlLCB3aGljaCBjb2xsZWN0cyBtb3N0IG9iamVjdHMgYXMgc29vbiBhcyB0aGV5IGJlY29tZVxudW5yZWFjaGFibGUsIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBjb2xsZWN0IGdhcmJhZ2UgY29udGFpbmluZ1xuY2lyY3VsYXIgcmVmZXJlbmNlcy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgYGBnY2BgIG1vZHVsZSBmb3JcbmluZm9ybWF0aW9uIG9uIGNvbnRyb2xsaW5nIHRoZSBjb2xsZWN0aW9uIG9mIGN5Y2xpYyBnYXJiYWdlLiBPdGhlclxuaW1wbGVtZW50YXRpb25zIGFjdCBkaWZmZXJlbnRseSBhbmQgQ1B5dGhvbiBtYXkgY2hhbmdlLiBEbyBub3QgZGVwZW5kXG5vbiBpbW1lZGlhdGUgZmluYWxpemF0aW9uIG9mIG9iamVjdHMgd2hlbiB0aGV5IGJlY29tZSB1bnJlYWNoYWJsZSAoZXg6XG5hbHdheXMgY2xvc2UgZmlsZXMpLlxuXG5Ob3RlIHRoYXQgdGhlIHVzZSBvZiB0aGUgaW1wbGVtZW50YXRpb25cJ3MgdHJhY2luZyBvciBkZWJ1Z2dpbmdcbmZhY2lsaXRpZXMgbWF5IGtlZXAgb2JqZWN0cyBhbGl2ZSB0aGF0IHdvdWxkIG5vcm1hbGx5IGJlIGNvbGxlY3RhYmxlLlxuQWxzbyBub3RlIHRoYXQgY2F0Y2hpbmcgYW4gZXhjZXB0aW9uIHdpdGggYSBcJ2BgdHJ5YGAuLi5gYGV4Y2VwdGBgXCdcbnN0YXRlbWVudCBtYXkga2VlcCBvYmplY3RzIGFsaXZlLlxuXG5Tb21lIG9iamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvICJleHRlcm5hbCIgcmVzb3VyY2VzIHN1Y2ggYXMgb3BlblxuZmlsZXMgb3Igd2luZG93cy4gIEl0IGlzIHVuZGVyc3Rvb2QgdGhhdCB0aGVzZSByZXNvdXJjZXMgYXJlIGZyZWVkXG53aGVuIHRoZSBvYmplY3QgaXMgZ2FyYmFnZS1jb2xsZWN0ZWQsIGJ1dCBzaW5jZSBnYXJiYWdlIGNvbGxlY3Rpb24gaXNcbm5vdCBndWFyYW50ZWVkIHRvIGhhcHBlbiwgc3VjaCBvYmplY3RzIGFsc28gcHJvdmlkZSBhbiBleHBsaWNpdCB3YXkgdG9cbnJlbGVhc2UgdGhlIGV4dGVybmFsIHJlc291cmNlLCB1c3VhbGx5IGEgYGBjbG9zZSgpYGAgbWV0aG9kLiBQcm9ncmFtc1xuYXJlIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGV4cGxpY2l0bHkgY2xvc2Ugc3VjaCBvYmplY3RzLiAgVGhlXG5cJ2BgdHJ5YGAuLi5gYGZpbmFsbHlgYFwnIHN0YXRlbWVudCBwcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIGRvXG50aGlzLlxuXG5Tb21lIG9iamVjdHMgY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHM7IHRoZXNlIGFyZSBjYWxsZWRcbipjb250YWluZXJzKi4gRXhhbXBsZXMgb2YgY29udGFpbmVycyBhcmUgdHVwbGVzLCBsaXN0cyBhbmRcbmRpY3Rpb25hcmllcy4gIFRoZSByZWZlcmVuY2VzIGFyZSBwYXJ0IG9mIGEgY29udGFpbmVyXCdzIHZhbHVlLiAgSW5cbm1vc3QgY2FzZXMsIHdoZW4gd2UgdGFsayBhYm91dCB0aGUgdmFsdWUgb2YgYSBjb250YWluZXIsIHdlIGltcGx5IHRoZVxudmFsdWVzLCBub3QgdGhlIGlkZW50aXRpZXMgb2YgdGhlIGNvbnRhaW5lZCBvYmplY3RzOyBob3dldmVyLCB3aGVuIHdlXG50YWxrIGFib3V0IHRoZSBtdXRhYmlsaXR5IG9mIGEgY29udGFpbmVyLCBvbmx5IHRoZSBpZGVudGl0aWVzIG9mIHRoZVxuaW1tZWRpYXRlbHkgY29udGFpbmVkIG9iamVjdHMgYXJlIGltcGxpZWQuICBTbywgaWYgYW4gaW1tdXRhYmxlXG5jb250YWluZXIgKGxpa2UgYSB0dXBsZSkgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYSBtdXRhYmxlIG9iamVjdCwgaXRzXG52YWx1ZSBjaGFuZ2VzIGlmIHRoYXQgbXV0YWJsZSBvYmplY3QgaXMgY2hhbmdlZC5cblxuVHlwZXMgYWZmZWN0IGFsbW9zdCBhbGwgYXNwZWN0cyBvZiBvYmplY3QgYmVoYXZpb3IuICBFdmVuIHRoZVxuaW1wb3J0YW5jZSBvZiBvYmplY3QgaWRlbnRpdHkgaXMgYWZmZWN0ZWQgaW4gc29tZSBzZW5zZTogZm9yIGltbXV0YWJsZVxudHlwZXMsIG9wZXJhdGlvbnMgdGhhdCBjb21wdXRlIG5ldyB2YWx1ZXMgbWF5IGFjdHVhbGx5IHJldHVybiBhXG5yZWZlcmVuY2UgdG8gYW55IGV4aXN0aW5nIG9iamVjdCB3aXRoIHRoZSBzYW1lIHR5cGUgYW5kIHZhbHVlLCB3aGlsZVxuZm9yIG11dGFibGUgb2JqZWN0cyB0aGlzIGlzIG5vdCBhbGxvd2VkLiAgRS5nLiwgYWZ0ZXIgYGBhID0gMTsgYiA9XG4xYGAsIGBgYWBgIGFuZCBgYGJgYCBtYXkgb3IgbWF5IG5vdCByZWZlciB0byB0aGUgc2FtZSBvYmplY3Qgd2l0aCB0aGVcbnZhbHVlIG9uZSwgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwgYnV0IGFmdGVyIGBgYyA9IFtdOyBkID1cbltdYGAsIGBgY2BgIGFuZCBgYGRgYCBhcmUgZ3VhcmFudGVlZCB0byByZWZlciB0byB0d28gZGlmZmVyZW50LFxudW5pcXVlLCBuZXdseSBjcmVhdGVkIGVtcHR5IGxpc3RzLiAoTm90ZSB0aGF0IGBgYyA9IGQgPSBbXWBgIGFzc2lnbnNcbnRoZSBzYW1lIG9iamVjdCB0byBib3RoIGBgY2BgIGFuZCBgYGRgYC4pXG4nLAorICdvcGVyYXRvci1zdW1tYXJ5JzogJ1xuT3BlcmF0b3IgcHJlY2VkZW5jZVxuKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgZm9sbG93aW5nIHRhYmxlIHN1bW1hcml6ZXMgdGhlIG9wZXJhdG9yIHByZWNlZGVuY2VzIGluIFB5dGhvbixcbmZyb20gbG93ZXN0IHByZWNlZGVuY2UgKGxlYXN0IGJpbmRpbmcpIHRvIGhpZ2hlc3QgcHJlY2VkZW5jZSAobW9zdFxuYmluZGluZykuIE9wZXJhdG9ycyBpbiB0aGUgc2FtZSBib3ggaGF2ZSB0aGUgc2FtZSBwcmVjZWRlbmNlLiAgVW5sZXNzXG50aGUgc3ludGF4IGlzIGV4cGxpY2l0bHkgZ2l2ZW4sIG9wZXJhdG9ycyBhcmUgYmluYXJ5LiAgT3BlcmF0b3JzIGluXG50aGUgc2FtZSBib3ggZ3JvdXAgbGVmdCB0byByaWdodCAoZXhjZXB0IGZvciBjb21wYXJpc29ucywgaW5jbHVkaW5nXG50ZXN0cywgd2hpY2ggYWxsIGhhdmUgdGhlIHNhbWUgcHJlY2VkZW5jZSBhbmQgY2hhaW4gZnJvbSBsZWZ0IHRvIHJpZ2h0XG4tLS0gc2VlIHNlY3Rpb24gKkNvbXBhcmlzb25zKiAtLS0gYW5kIGV4cG9uZW50aWF0aW9uLCB3aGljaCBncm91cHNcbmZyb20gcmlnaHQgdG8gbGVmdCkuXG5cbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgT3BlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbnwgYGBsYW1iZGFgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBMYW1iZGEgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBpZmBgIC0tIGBgZWxzZWBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDb25kaXRpb25hbCBleHByZXNzaW9uICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBvcmBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBhbmRgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBub3RgYCBgYHhgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29sZWFuIE5PVCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBpbmBgLCBgYG5vdCBpbmBgLCBgYGlzYGAsIGBgaXMgbm90YGAsIGBgPGBgLCAgfCBDb21wYXJpc29ucywgaW5jbHVkaW5nIG1lbWJlcnNoaXAgICAgIHxcbnwgYGA8PWBgLCBgYD5gYCwgYGA+PWBgLCBgYDw+YGAsIGBgIT1gYCwgYGA9PWBgICAgfCB0ZXN0cyBhbmQgaWRlbnRpdHkgdGVzdHMgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGB8YGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBeYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIFhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGAmYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCaXR3aXNlIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGA8PGBgLCBgYD4+YGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTaGlmdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGArYGAsIGBgLWBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGAqYGAsIGBgL2BgLCBgYC8vYGAsIGBgJWBgICAgICAgICAgICAgICAgICAgICAgfCBNdWx0aXBsaWNhdGlvbiwgZGl2aXNpb24sIHJlbWFpbmRlciAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbOF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGAreGBgLCBgYC14YGAsIGBgfnhgYCAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQb3NpdGl2ZSwgbmVnYXRpdmUsIGJpdHdpc2UgTk9UICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGAqKmBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeHBvbmVudGlhdGlvbiBbOV0gICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGB4W2luZGV4XWBgLCBgYHhbaW5kZXg6aW5kZXhdYGAsICAgICAgICAgICAgICAgfCBTdWJzY3JpcHRpb24sIHNsaWNpbmcsIGNhbGwsICAgICAgICAgIHxcbnwgYGB4KGFyZ3VtZW50cy4uLilgYCwgYGB4LmF0dHJpYnV0ZWBgICAgICAgICAgICAgfCBhdHRyaWJ1dGUgcmVmZXJlbmNlICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGAoZXhwcmVzc2lvbnMuLi4pYGAsIGBgW2V4cHJlc3Npb25zLi4uXWBgLCAgICAgfCBCaW5kaW5nIG9yIHR1cGxlIGRpc3BsYXksIGxpc3QgICAgICAgIHxcbnwgYGB7a2V5OiB2YWx1ZS4uLn1gYCwgYGBgZXhwcmVzc2lvbnMuLi5gYGAgICAgICAgfCBkaXNwbGF5LCBkaWN0aW9uYXJ5IGRpc3BsYXksIHN0cmluZyAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBjb252ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBJbiBQeXRob24gMi4zIGFuZCBsYXRlciByZWxlYXNlcywgYSBsaXN0IGNvbXByZWhlbnNpb24gImxlYWtzIiB0aGVcbiAgICBjb250cm9sIHZhcmlhYmxlcyBvZiBlYWNoIGBgZm9yYGAgaXQgY29udGFpbnMgaW50byB0aGUgY29udGFpbmluZ1xuICAgIHNjb3BlLiAgSG93ZXZlciwgdGhpcyBiZWhhdmlvciBpcyBkZXByZWNhdGVkLCBhbmQgcmVseWluZyBvbiBpdFxuICAgIHdpbGwgbm90IHdvcmsgaW4gUHl0aG9uIDMuXG5cblsyXSBXaGlsZSBgYGFicyh4JXkpIDwgYWJzKHkpYGAgaXMgdHJ1ZSBtYXRoZW1hdGljYWxseSwgZm9yIGZsb2F0cyBpdFxuICAgIG1heSBub3QgYmUgdHJ1ZSBudW1lcmljYWxseSBkdWUgdG8gcm91bmRvZmYuICBGb3IgZXhhbXBsZSwgYW5kXG4gICAgYXNzdW1pbmcgYSBwbGF0Zm9ybSBvbiB3aGljaCBhIFB5dGhvbiBmbG9hdCBpcyBhbiBJRUVFIDc1NCBkb3VibGUtXG4gICAgcHJlY2lzaW9uIG51bWJlciwgaW4gb3JkZXIgdGhhdCBgYC0xZS0xMDAgJSAxZTEwMGBgIGhhdmUgdGhlIHNhbWVcbiAgICBzaWduIGFzIGBgMWUxMDBgYCwgdGhlIGNvbXB1dGVkIHJlc3VsdCBpcyBgYC0xZS0xMDAgKyAxZTEwMGBgLFxuICAgIHdoaWNoIGlzIG51bWVyaWNhbGx5IGV4YWN0bHkgZXF1YWwgdG8gYGAxZTEwMGBgLiAgVGhlIGZ1bmN0aW9uXG4gICAgYGBtYXRoLmZtb2QoKWBgIHJldHVybnMgYSByZXN1bHQgd2hvc2Ugc2lnbiBtYXRjaGVzIHRoZSBzaWduIG9mXG4gICAgdGhlIGZpcnN0IGFyZ3VtZW50IGluc3RlYWQsIGFuZCBzbyByZXR1cm5zIGBgLTFlLTEwMGBgIGluIHRoaXNcbiAgICBjYXNlLiBXaGljaCBhcHByb2FjaCBpcyBtb3JlIGFwcHJvcHJpYXRlIGRlcGVuZHMgb24gdGhlXG4gICAgYXBwbGljYXRpb24uXG5cblszXSBJZiB4IGlzIHZlcnkgY2xvc2UgdG8gYW4gZXhhY3QgaW50ZWdlciBtdWx0aXBsZSBvZiB5LCBpdFwnc1xuICAgIHBvc3NpYmxlIGZvciBgYGZsb29yKHgveSlgYCB0byBiZSBvbmUgbGFyZ2VyIHRoYW4gYGAoeC14JXkpL3lgYFxuICAgIGR1ZSB0byByb3VuZGluZy4gIEluIHN1Y2ggY2FzZXMsIFB5dGhvbiByZXR1cm5zIHRoZSBsYXR0ZXIgcmVzdWx0LFxuICAgIGluIG9yZGVyIHRvIHByZXNlcnZlIHRoYXQgYGBkaXZtb2QoeCx5KVswXSAqIHkgKyB4ICUgeWBgIGJlIHZlcnlcbiAgICBjbG9zZSB0byBgYHhgYC5cblxuWzRdIFdoaWxlIGNvbXBhcmlzb25zIGJldHdlZW4gdW5pY29kZSBzdHJpbmdzIG1ha2Ugc2Vuc2UgYXQgdGhlIGJ5dGVcbiAgICBsZXZlbCwgdGhleSBtYXkgYmUgY291bnRlci1pbnR1aXRpdmUgdG8gdXNlcnMuIEZvciBleGFtcGxlLCB0aGVcbiAgICBzdHJpbmdzIGBgdSJcXHUwMEM3ImBgIGFuZCBgYHUiXFx1MDA0M1xcdTAzMjciYGAgY29tcGFyZSBkaWZmZXJlbnRseSxcbiAgICBldmVuIHRob3VnaCB0aGV5IGJvdGggcmVwcmVzZW50IHRoZSBzYW1lIHVuaWNvZGUgY2hhcmFjdGVyIChMQVRJTlxuICAgIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBKS4gVG8gY29tcGFyZSBzdHJpbmdzIGluIGEgaHVtYW5cbiAgICByZWNvZ25pemFibGUgd2F5LCBjb21wYXJlIHVzaW5nIGBgdW5pY29kZWRhdGEubm9ybWFsaXplKClgYC5cblxuWzVdIFRoZSBpbXBsZW1lbnRhdGlvbiBjb21wdXRlcyB0aGlzIGVmZmljaWVudGx5LCB3aXRob3V0IGNvbnN0cnVjdGluZ1xuICAgIGxpc3RzIG9yIHNvcnRpbmcuXG5cbls2XSBFYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbiB1c2VkIGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiBvZiB0aGVcbiAgICBzb3J0ZWQgKGtleSwgdmFsdWUpIGxpc3RzLCBidXQgdGhpcyB3YXMgdmVyeSBleHBlbnNpdmUgZm9yIHRoZVxuICAgIGNvbW1vbiBjYXNlIG9mIGNvbXBhcmluZyBmb3IgZXF1YWxpdHkuICBBbiBldmVuIGVhcmxpZXIgdmVyc2lvbiBvZlxuICAgIFB5dGhvbiBjb21wYXJlZCBkaWN0aW9uYXJpZXMgYnkgaWRlbnRpdHkgb25seSwgYnV0IHRoaXMgY2F1c2VkXG4gICAgc3VycHJpc2VzIGJlY2F1c2UgcGVvcGxlIGV4cGVjdGVkIHRvIGJlIGFibGUgdG8gdGVzdCBhIGRpY3Rpb25hcnlcbiAgICBmb3IgZW1wdGluZXNzIGJ5IGNvbXBhcmluZyBpdCB0byBgYHt9YGAuXG5cbls3XSBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UtY29sbGVjdGlvbiwgZnJlZSBsaXN0cywgYW5kIHRoZSBkeW5hbWljXG4gICAgbmF0dXJlIG9mIGRlc2NyaXB0b3JzLCB5b3UgbWF5IG5vdGljZSBzZWVtaW5nbHkgdW51c3VhbCBiZWhhdmlvdXJcbiAgICBpbiBjZXJ0YWluIHVzZXMgb2YgdGhlIGBgaXNgYCBvcGVyYXRvciwgbGlrZSB0aG9zZSBpbnZvbHZpbmdcbiAgICBjb21wYXJpc29ucyBiZXR3ZWVuIGluc3RhbmNlIG1ldGhvZHMsIG9yIGNvbnN0YW50cy4gIENoZWNrIHRoZWlyXG4gICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvLlxuXG5bOF0gVGhlIGBgJWBgIG9wZXJhdG9yIGlzIGFsc28gdXNlZCBmb3Igc3RyaW5nIGZvcm1hdHRpbmc7IHRoZSBzYW1lXG4gICAgcHJlY2VkZW5jZSBhcHBsaWVzLlxuXG5bOV0gVGhlIHBvd2VyIG9wZXJhdG9yIGBgKipgYCBiaW5kcyBsZXNzIHRpZ2h0bHkgdGhhbiBhbiBhcml0aG1ldGljIG9yXG4gICAgYml0d2lzZSB1bmFyeSBvcGVyYXRvciBvbiBpdHMgcmlnaHQsIHRoYXQgaXMsIGBgMioqLTFgYCBpc1xuICAgIGBgMC41YGAuXG4nLAorICdwYXNzJzogJ1xuVGhlIGBgcGFzc2BgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBwYXNzX3N0bXQgOjo9ICJwYXNzIlxuXG5gYHBhc3NgYCBpcyBhIG51bGwgb3BlcmF0aW9uIC0tLSB3aGVuIGl0IGlzIGV4ZWN1dGVkLCBub3RoaW5nIGhhcHBlbnMuXG5JdCBpcyB1c2VmdWwgYXMgYSBwbGFjZWhvbGRlciB3aGVuIGEgc3RhdGVtZW50IGlzIHJlcXVpcmVkXG5zeW50YWN0aWNhbGx5LCBidXQgbm8gY29kZSBuZWVkcyB0byBiZSBleGVjdXRlZCwgZm9yIGV4YW1wbGU6XG5cbiAgIGRlZiBmKGFyZyk6IHBhc3MgICAgIyBhIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3RoaW5nICh5ZXQpXG5cbiAgIGNsYXNzIEM6IHBhc3MgICAgICAgIyBhIGNsYXNzIHdpdGggbm8gbWV0aG9kcyAoeWV0KVxuJywKKyAncG93ZXInOiAnXG5UaGUgcG93ZXIgb3BlcmF0b3JcbioqKioqKioqKioqKioqKioqKlxuXG5UaGUgcG93ZXIgb3BlcmF0b3IgYmluZHMgbW9yZSB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0c1xubGVmdDsgaXQgYmluZHMgbGVzcyB0aWdodGx5IHRoYW4gdW5hcnkgb3BlcmF0b3JzIG9uIGl0cyByaWdodC4gIFRoZVxuc3ludGF4IGlzOlxuXG4gICBwb3dlciA6Oj0gcHJpbWFyeSBbIioqIiB1X2V4cHJdXG5cblRodXMsIGluIGFuIHVucGFyZW50aGVzaXplZCBzZXF1ZW5jZSBvZiBwb3dlciBhbmQgdW5hcnkgb3BlcmF0b3JzLCB0aGVcbm9wZXJhdG9ycyBhcmUgZXZhbHVhdGVkIGZyb20gcmlnaHQgdG8gbGVmdCAodGhpcyBkb2VzIG5vdCBjb25zdHJhaW5cbnRoZSBldmFsdWF0aW9uIG9yZGVyIGZvciB0aGUgb3BlcmFuZHMpOiBgYC0xKioyYGAgcmVzdWx0cyBpbiBgYC0xYGAuXG5cblRoZSBwb3dlciBvcGVyYXRvciBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZSBidWlsdC1pbiBgYHBvdygpYGBcbmZ1bmN0aW9uLCB3aGVuIGNhbGxlZCB3aXRoIHR3byBhcmd1bWVudHM6IGl0IHlpZWxkcyBpdHMgbGVmdCBhcmd1bWVudFxucmFpc2VkIHRvIHRoZSBwb3dlciBvZiBpdHMgcmlnaHQgYXJndW1lbnQuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlXG5maXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIFRoZSByZXN1bHQgdHlwZSBpcyB0aGF0IG9mIHRoZVxuYXJndW1lbnRzIGFmdGVyIGNvZXJjaW9uLlxuXG5XaXRoIG1peGVkIG9wZXJhbmQgdHlwZXMsIHRoZSBjb2VyY2lvbiBydWxlcyBmb3IgYmluYXJ5IGFyaXRobWV0aWNcbm9wZXJhdG9ycyBhcHBseS4gRm9yIGludCBhbmQgbG9uZyBpbnQgb3BlcmFuZHMsIHRoZSByZXN1bHQgaGFzIHRoZVxuc2FtZSB0eXBlIGFzIHRoZSBvcGVyYW5kcyAoYWZ0ZXIgY29lcmNpb24pIHVubGVzcyB0aGUgc2Vjb25kIGFyZ3VtZW50XG5pcyBuZWdhdGl2ZTsgaW4gdGhhdCBjYXNlLCBhbGwgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gZmxvYXQgYW5kIGFcbmZsb2F0IHJlc3VsdCBpcyBkZWxpdmVyZWQuIEZvciBleGFtcGxlLCBgYDEwKioyYGAgcmV0dXJucyBgYDEwMGBgLCBidXRcbmBgMTAqKi0yYGAgcmV0dXJucyBgYDAuMDFgYC4gKFRoaXMgbGFzdCBmZWF0dXJlIHdhcyBhZGRlZCBpbiBQeXRob25cbjIuMi4gSW4gUHl0aG9uIDIuMSBhbmQgYmVmb3JlLCBpZiBib3RoIGFyZ3VtZW50cyB3ZXJlIG9mIGludGVnZXIgdHlwZXNcbmFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IHdhcyBuZWdhdGl2ZSwgYW4gZXhjZXB0aW9uIHdhcyByYWlzZWQpLlxuXG5SYWlzaW5nIGBgMC4wYGAgdG8gYSBuZWdhdGl2ZSBwb3dlciByZXN1bHRzIGluIGFcbmBgWmVyb0RpdmlzaW9uRXJyb3JgYC4gUmFpc2luZyBhIG5lZ2F0aXZlIG51bWJlciB0byBhIGZyYWN0aW9uYWwgcG93ZXJcbnJlc3VsdHMgaW4gYSBgYFZhbHVlRXJyb3JgYC5cbicsCisgJ3JhaXNlJzogJ1xuVGhlIGBgcmFpc2VgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHJhaXNlX3N0bXQgOjo9ICJyYWlzZSIgW2V4cHJlc3Npb24gWyIsIiBleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbl1dXVxuXG5JZiBubyBleHByZXNzaW9ucyBhcmUgcHJlc2VudCwgYGByYWlzZWBgIHJlLXJhaXNlcyB0aGUgbGFzdCBleGNlcHRpb25cbnRoYXQgd2FzIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBzY29wZS4gIElmIG5vIGV4Y2VwdGlvbiBpcyBhY3RpdmUgaW5cbnRoZSBjdXJyZW50IHNjb3BlLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZCBpbmRpY2F0aW5nIHRoYXRcbnRoaXMgaXMgYW4gZXJyb3IgKGlmIHJ1bm5pbmcgdW5kZXIgSURMRSwgYSBgYFF1ZXVlLkVtcHR5YGAgZXhjZXB0aW9uXG5pcyByYWlzZWQgaW5zdGVhZCkuXG5cbk90aGVyd2lzZSwgYGByYWlzZWBgIGV2YWx1YXRlcyB0aGUgZXhwcmVzc2lvbnMgdG8gZ2V0IHRocmVlIG9iamVjdHMsXG51c2luZyBgYE5vbmVgYCBhcyB0aGUgdmFsdWUgb2Ygb21pdHRlZCBleHByZXNzaW9ucy4gIFRoZSBmaXJzdCB0d29cbm9iamVjdHMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSAqdHlwZSogYW5kICp2YWx1ZSogb2YgdGhlIGV4Y2VwdGlvbi5cblxuSWYgdGhlIGZpcnN0IG9iamVjdCBpcyBhbiBpbnN0YW5jZSwgdGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbiBpcyB0aGVcbmNsYXNzIG9mIHRoZSBpbnN0YW5jZSwgdGhlIGluc3RhbmNlIGl0c2VsZiBpcyB0aGUgdmFsdWUsIGFuZCB0aGVcbnNlY29uZCBvYmplY3QgbXVzdCBiZSBgYE5vbmVgYC5cblxuSWYgdGhlIGZpcnN0IG9iamVjdCBpcyBhIGNsYXNzLCBpdCBiZWNvbWVzIHRoZSB0eXBlIG9mIHRoZSBleGNlcHRpb24uXG5UaGUgc2Vjb25kIG9iamVjdCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgZXhjZXB0aW9uIHZhbHVlOiBJZiBpdCBpc1xuYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLCB0aGUgaW5zdGFuY2UgYmVjb21lcyB0aGUgZXhjZXB0aW9uIHZhbHVlLiBJZlxudGhlIHNlY29uZCBvYmplY3QgaXMgYSB0dXBsZSwgaXQgaXMgdXNlZCBhcyB0aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlXG5jbGFzcyBjb25zdHJ1Y3RvcjsgaWYgaXQgaXMgYGBOb25lYGAsIGFuIGVtcHR5IGFyZ3VtZW50IGxpc3QgaXMgdXNlZCxcbmFuZCBhbnkgb3RoZXIgb2JqZWN0IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgYXJndW1lbnQgdG8gdGhlXG5jb25zdHJ1Y3Rvci4gIFRoZSBpbnN0YW5jZSBzbyBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIGNvbnN0cnVjdG9yIGlzXG51c2VkIGFzIHRoZSBleGNlcHRpb24gdmFsdWUuXG5cbklmIGEgdGhpcmQgb2JqZWN0IGlzIHByZXNlbnQgYW5kIG5vdCBgYE5vbmVgYCwgaXQgbXVzdCBiZSBhIHRyYWNlYmFja1xub2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KiksIGFuZCBpdCBpc1xuc3Vic3RpdHV0ZWQgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBhcyB0aGUgcGxhY2Ugd2hlcmUgdGhlXG5leGNlcHRpb24gb2NjdXJyZWQuICBJZiB0aGUgdGhpcmQgb2JqZWN0IGlzIHByZXNlbnQgYW5kIG5vdCBhXG50cmFjZWJhY2sgb2JqZWN0IG9yIGBgTm9uZWBgLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC5cblRoZSB0aHJlZS1leHByZXNzaW9uIGZvcm0gb2YgYGByYWlzZWBgIGlzIHVzZWZ1bCB0byByZS1yYWlzZSBhblxuZXhjZXB0aW9uIHRyYW5zcGFyZW50bHkgaW4gYW4gZXhjZXB0IGNsYXVzZSwgYnV0IGBgcmFpc2VgYCB3aXRoIG5vXG5leHByZXNzaW9ucyBzaG91bGQgYmUgcHJlZmVycmVkIGlmIHRoZSBleGNlcHRpb24gdG8gYmUgcmUtcmFpc2VkIHdhc1xudGhlIG1vc3QgcmVjZW50bHkgYWN0aXZlIGV4Y2VwdGlvbiBpbiB0aGUgY3VycmVudCBzY29wZS5cblxuQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBleGNlcHRpb25zIGNhbiBiZSBmb3VuZCBpbiBzZWN0aW9uXG4qRXhjZXB0aW9ucyosIGFuZCBpbmZvcm1hdGlvbiBhYm91dCBoYW5kbGluZyBleGNlcHRpb25zIGlzIGluIHNlY3Rpb25cbipUaGUgdHJ5IHN0YXRlbWVudCouXG4nLAorICdyZXR1cm4nOiAnXG5UaGUgYGByZXR1cm5gYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICByZXR1cm5fc3RtdCA6Oj0gInJldHVybiIgW2V4cHJlc3Npb25fbGlzdF1cblxuYGByZXR1cm5gYCBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhIGZ1bmN0aW9uXG5kZWZpbml0aW9uLCBub3Qgd2l0aGluIGEgbmVzdGVkIGNsYXNzIGRlZmluaXRpb24uXG5cbklmIGFuIGV4cHJlc3Npb24gbGlzdCBpcyBwcmVzZW50LCBpdCBpcyBldmFsdWF0ZWQsIGVsc2UgYGBOb25lYGAgaXNcbnN1YnN0aXR1dGVkLlxuXG5gYHJldHVybmBgIGxlYXZlcyB0aGUgY3VycmVudCBmdW5jdGlvbiBjYWxsIHdpdGggdGhlIGV4cHJlc3Npb24gbGlzdFxuKG9yIGBgTm9uZWBgKSBhcyByZXR1cm4gdmFsdWUuXG5cbldoZW4gYGByZXR1cm5gYCBwYXNzZXMgY29udHJvbCBvdXQgb2YgYSBgYHRyeWBgIHN0YXRlbWVudCB3aXRoIGFcbmBgZmluYWxseWBgIGNsYXVzZSwgdGhhdCBgYGZpbmFsbHlgYCBjbGF1c2UgaXMgZXhlY3V0ZWQgYmVmb3JlIHJlYWxseVxubGVhdmluZyB0aGUgZnVuY3Rpb24uXG5cbkluIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uLCB0aGUgYGByZXR1cm5gYCBzdGF0ZW1lbnQgaXMgbm90IGFsbG93ZWQgdG9cbmluY2x1ZGUgYW4gYGBleHByZXNzaW9uX2xpc3RgYC4gIEluIHRoYXQgY29udGV4dCwgYSBiYXJlIGBgcmV0dXJuYGBcbmluZGljYXRlcyB0aGF0IHRoZSBnZW5lcmF0b3IgaXMgZG9uZSBhbmQgd2lsbCBjYXVzZSBgYFN0b3BJdGVyYXRpb25gYFxudG8gYmUgcmFpc2VkLlxuJywKKyAnc2VxdWVuY2UtdHlwZXMnOiAiXG5FbXVsYXRpbmcgY29udGFpbmVyIHR5cGVzXG4qKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBpbXBsZW1lbnQgY29udGFpbmVyIG9iamVjdHMuXG5Db250YWluZXJzIHVzdWFsbHkgYXJlIHNlcXVlbmNlcyAoc3VjaCBhcyBsaXN0cyBvciB0dXBsZXMpIG9yIG1hcHBpbmdzXG4obGlrZSBkaWN0aW9uYXJpZXMpLCBidXQgY2FuIHJlcHJlc2VudCBvdGhlciBjb250YWluZXJzIGFzIHdlbGwuICBUaGVcbmZpcnN0IHNldCBvZiBtZXRob2RzIGlzIHVzZWQgZWl0aGVyIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSBvciB0b1xuZW11bGF0ZSBhIG1hcHBpbmc7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZm9yIGEgc2VxdWVuY2UsIHRoZVxuYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyAqayogZm9yIHdoaWNoIGBgMCA8PSBrIDwgTmBgXG53aGVyZSAqTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yIHNsaWNlIG9iamVjdHMsIHdoaWNoXG5kZWZpbmUgYSByYW5nZSBvZiBpdGVtcy4gKEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIG1ldGhvZFxuYGBfX2dldHNsaWNlX18oKWBgIChzZWUgYmVsb3cpIGNhbiBhbHNvIGJlIGRlZmluZWQgdG8gaGFuZGxlIHNpbXBsZSxcbmJ1dCBub3QgZXh0ZW5kZWQgc2xpY2VzLikgSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0aGF0IG1hcHBpbmdzIHByb3ZpZGVcbnRoZSBtZXRob2RzIGBga2V5cygpYGAsIGBgdmFsdWVzKClgYCwgYGBpdGVtcygpYGAsIGBgaGFzX2tleSgpYGAsXG5gYGdldCgpYGAsIGBgY2xlYXIoKWBgLCBgYHNldGRlZmF1bHQoKWBgLCBgYGl0ZXJrZXlzKClgYCxcbmBgaXRlcnZhbHVlcygpYGAsIGBgaXRlcml0ZW1zKClgYCwgYGBwb3AoKWBgLCBgYHBvcGl0ZW0oKWBgLFxuYGBjb3B5KClgYCwgYW5kIGBgdXBkYXRlKClgYCBiZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob24nc1xuc3RhbmRhcmQgZGljdGlvbmFyeSBvYmplY3RzLiAgVGhlIGBgVXNlckRpY3RgYCBtb2R1bGUgcHJvdmlkZXMgYVxuYGBEaWN0TWl4aW5gYCBjbGFzcyB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzIGZyb20gYSBiYXNlIHNldCBvZlxuYGBfX2dldGl0ZW1fXygpYGAsIGBgX19zZXRpdGVtX18oKWBgLCBgYF9fZGVsaXRlbV9fKClgYCwgYW5kXG5gYGtleXMoKWBgLiBNdXRhYmxlIHNlcXVlbmNlcyBzaG91bGQgcHJvdmlkZSBtZXRob2RzIGBgYXBwZW5kKClgYCxcbmBgY291bnQoKWBgLCBgYGluZGV4KClgYCwgYGBleHRlbmQoKWBgLCBgYGluc2VydCgpYGAsIGBgcG9wKClgYCxcbmBgcmVtb3ZlKClgYCwgYGByZXZlcnNlKClgYCBhbmQgYGBzb3J0KClgYCwgbGlrZSBQeXRob24gc3RhbmRhcmQgbGlzdFxub2JqZWN0cy4gIEZpbmFsbHksIHNlcXVlbmNlIHR5cGVzIHNob3VsZCBpbXBsZW1lbnQgYWRkaXRpb24gKG1lYW5pbmdcbmNvbmNhdGVuYXRpb24pIGFuZCBtdWx0aXBsaWNhdGlvbiAobWVhbmluZyByZXBldGl0aW9uKSBieSBkZWZpbmluZyB0aGVcbm1ldGhvZHMgYGBfX2FkZF9fKClgYCwgYGBfX3JhZGRfXygpYGAsIGBgX19pYWRkX18oKWBgLCBgYF9fbXVsX18oKWBgLFxuYGBfX3JtdWxfXygpYGAgYW5kIGBgX19pbXVsX18oKWBgIGRlc2NyaWJlZCBiZWxvdzsgdGhleSBzaG91bGQgbm90XG5kZWZpbmUgYGBfX2NvZXJjZV9fKClgYCBvciBvdGhlciBudW1lcmljYWwgb3BlcmF0b3JzLiAgSXQgaXNcbnJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGVcbmBgX19jb250YWluc19fKClgYCBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZSBvZiB0aGUgYGBpbmBgXG5vcGVyYXRvcjsgZm9yIG1hcHBpbmdzLCBgYGluYGAgc2hvdWxkIGJlIGVxdWl2YWxlbnQgb2YgYGBoYXNfa2V5KClgYDtcbmZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlclxucmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZVxuYGBfX2l0ZXJfXygpYGAgbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCBpdGVyYXRpb24gdGhyb3VnaCB0aGVcbmNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCBgYF9faXRlcl9fKClgYCBzaG91bGQgYmUgdGhlIHNhbWUgYXNcbmBgaXRlcmtleXMoKWBgOyBmb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgaXRlcmF0ZSB0aHJvdWdoIHRoZSB2YWx1ZXMuXG5cbm9iamVjdC5fX2xlbl9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgbGVuKClgYC4gIFNob3VsZCByZXR1cm5cbiAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciBgYD49YGAgMC4gIEFsc28sIGFuIG9iamVjdFxuICAgdGhhdCBkb2Vzbid0IGRlZmluZSBhIGBgX19ub256ZXJvX18oKWBgIG1ldGhvZCBhbmQgd2hvc2VcbiAgIGBgX19sZW5fXygpYGAgbWV0aG9kIHJldHVybnMgemVybyBpcyBjb25zaWRlcmVkIHRvIGJlIGZhbHNlIGluIGFcbiAgIEJvb2xlYW4gY29udGV4dC5cblxub2JqZWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBldmFsdWF0aW9uIG9mIGBgc2VsZltrZXldYGAuIEZvciBzZXF1ZW5jZVxuICAgdHlwZXMsIHRoZSBhY2NlcHRlZCBrZXlzIHNob3VsZCBiZSBpbnRlZ2VycyBhbmQgc2xpY2Ugb2JqZWN0cy5cbiAgIE5vdGUgdGhhdCB0aGUgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZiBuZWdhdGl2ZSBpbmRleGVzIChpZiB0aGVcbiAgIGNsYXNzIHdpc2hlcyB0byBlbXVsYXRlIGEgc2VxdWVuY2UgdHlwZSkgaXMgdXAgdG8gdGhlXG4gICBgYF9fZ2V0aXRlbV9fKClgYCBtZXRob2QuIElmICprZXkqIGlzIG9mIGFuIGluYXBwcm9wcmlhdGUgdHlwZSxcbiAgIGBgVHlwZUVycm9yYGAgbWF5IGJlIHJhaXNlZDsgaWYgb2YgYSB2YWx1ZSBvdXRzaWRlIHRoZSBzZXQgb2ZcbiAgIGluZGV4ZXMgZm9yIHRoZSBzZXF1ZW5jZSAoYWZ0ZXIgYW55IHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2ZcbiAgIG5lZ2F0aXZlIHZhbHVlcyksIGBgSW5kZXhFcnJvcmBgIHNob3VsZCBiZSByYWlzZWQuIEZvciBtYXBwaW5nXG4gICB0eXBlcywgaWYgKmtleSogaXMgbWlzc2luZyAobm90IGluIHRoZSBjb250YWluZXIpLCBgYEtleUVycm9yYGBcbiAgIHNob3VsZCBiZSByYWlzZWQuXG5cbiAgIE5vdGU6IGBgZm9yYGAgbG9vcHMgZXhwZWN0IHRoYXQgYW4gYGBJbmRleEVycm9yYGAgd2lsbCBiZSByYWlzZWQgZm9yXG4gICAgIGlsbGVnYWwgaW5kZXhlcyB0byBhbGxvdyBwcm9wZXIgZGV0ZWN0aW9uIG9mIHRoZSBlbmQgb2YgdGhlXG4gICAgIHNlcXVlbmNlLlxuXG5vYmplY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBhc3NpZ25tZW50IHRvIGBgc2VsZltrZXldYGAuICBTYW1lIG5vdGUgYXMgZm9yXG4gICBgYF9fZ2V0aXRlbV9fKClgYC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmXG4gICB0aGUgb2JqZWN0cyBzdXBwb3J0IGNoYW5nZXMgdG8gdGhlIHZhbHVlcyBmb3Iga2V5cywgb3IgaWYgbmV3IGtleXNcbiAgIGNhbiBiZSBhZGRlZCwgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50cyBjYW4gYmUgcmVwbGFjZWQuICBUaGVcbiAgIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmUgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yXG4gICB0aGUgYGBfX2dldGl0ZW1fXygpYGAgbWV0aG9kLlxuXG5vYmplY3QuX19kZWxpdGVtX18oc2VsZiwga2V5KVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGRlbGV0aW9uIG9mIGBgc2VsZltrZXldYGAuICBTYW1lIG5vdGUgYXMgZm9yXG4gICBgYF9fZ2V0aXRlbV9fKClgYC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgZm9yIG1hcHBpbmdzIGlmXG4gICB0aGUgb2JqZWN0cyBzdXBwb3J0IHJlbW92YWwgb2Yga2V5cywgb3IgZm9yIHNlcXVlbmNlcyBpZiBlbGVtZW50c1xuICAgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGUgc2VxdWVuY2UuICBUaGUgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZVxuICAgcmFpc2VkIGZvciBpbXByb3BlciAqa2V5KiB2YWx1ZXMgYXMgZm9yIHRoZSBgYF9fZ2V0aXRlbV9fKClgYFxuICAgbWV0aG9kLlxuXG5vYmplY3QuX19pdGVyX18oc2VsZilcblxuICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gaXRlcmF0b3IgaXMgcmVxdWlyZWQgZm9yIGEgY29udGFpbmVyLlxuICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdCBjYW4gaXRlcmF0ZVxuICAgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lci4gIEZvciBtYXBwaW5ncywgaXQgc2hvdWxkXG4gICBpdGVyYXRlIG92ZXIgdGhlIGtleXMgb2YgdGhlIGNvbnRhaW5lciwgYW5kIHNob3VsZCBhbHNvIGJlIG1hZGVcbiAgIGF2YWlsYWJsZSBhcyB0aGUgbWV0aG9kIGBgaXRlcmtleXMoKWBgLlxuXG4gICBJdGVyYXRvciBvYmplY3RzIGFsc28gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2Q7IHRoZXkgYXJlXG4gICByZXF1aXJlZCB0byByZXR1cm4gdGhlbXNlbHZlcy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGl0ZXJhdG9yXG4gICBvYmplY3RzLCBzZWUgKkl0ZXJhdG9yIFR5cGVzKi5cblxub2JqZWN0Ll9fcmV2ZXJzZWRfXyhzZWxmKVxuXG4gICBDYWxsZWQgKGlmIHByZXNlbnQpIGJ5IHRoZSBgYHJldmVyc2VkKClgYCBidWlsdC1pbiB0byBpbXBsZW1lbnRcbiAgIHJldmVyc2UgaXRlcmF0aW9uLiAgSXQgc2hvdWxkIHJldHVybiBhIG5ldyBpdGVyYXRvciBvYmplY3QgdGhhdFxuICAgaXRlcmF0ZXMgb3ZlciBhbGwgdGhlIG9iamVjdHMgaW4gdGhlIGNvbnRhaW5lciBpbiByZXZlcnNlIG9yZGVyLlxuXG4gICBJZiB0aGUgYGBfX3JldmVyc2VkX18oKWBgIG1ldGhvZCBpcyBub3QgcHJvdmlkZWQsIHRoZVxuICAgYGByZXZlcnNlZCgpYGAgYnVpbHQtaW4gd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIHNlcXVlbmNlXG4gICBwcm90b2NvbCAoYGBfX2xlbl9fKClgYCBhbmQgYGBfX2dldGl0ZW1fXygpYGApLiAgT2JqZWN0cyB0aGF0XG4gICBzdXBwb3J0IHRoZSBzZXF1ZW5jZSBwcm90b2NvbCBzaG91bGQgb25seSBwcm92aWRlXG4gICBgYF9fcmV2ZXJzZWRfXygpYGAgaWYgdGhleSBjYW4gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzXG4gICBtb3JlIGVmZmljaWVudCB0aGFuIHRoZSBvbmUgcHJvdmlkZWQgYnkgYGByZXZlcnNlZCgpYGAuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNi5cblxuVGhlIG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMgKGBgaW5gYCBhbmQgYGBub3QgaW5gYCkgYXJlIG5vcm1hbGx5XG5pbXBsZW1lbnRlZCBhcyBhbiBpdGVyYXRpb24gdGhyb3VnaCBhIHNlcXVlbmNlLiAgSG93ZXZlciwgY29udGFpbmVyXG5vYmplY3RzIGNhbiBzdXBwbHkgdGhlIGZvbGxvd2luZyBzcGVjaWFsIG1ldGhvZCB3aXRoIGEgbW9yZSBlZmZpY2llbnRcbmltcGxlbWVudGF0aW9uLCB3aGljaCBhbHNvIGRvZXMgbm90IHJlcXVpcmUgdGhlIG9iamVjdCBiZSBhIHNlcXVlbmNlLlxuXG5vYmplY3QuX19jb250YWluc19fKHNlbGYsIGl0ZW0pXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycy4gIFNob3VsZCByZXR1cm4gdHJ1ZVxuICAgaWYgKml0ZW0qIGlzIGluICpzZWxmKiwgZmFsc2Ugb3RoZXJ3aXNlLiAgRm9yIG1hcHBpbmcgb2JqZWN0cywgdGhpc1xuICAgc2hvdWxkIGNvbnNpZGVyIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nIHJhdGhlciB0aGFuIHRoZSB2YWx1ZXMgb3JcbiAgIHRoZSBrZXktaXRlbSBwYWlycy5cblxuICAgRm9yIG9iamVjdHMgdGhhdCBkb24ndCBkZWZpbmUgYGBfX2NvbnRhaW5zX18oKWBgLCB0aGUgbWVtYmVyc2hpcFxuICAgdGVzdCBmaXJzdCB0cmllcyBpdGVyYXRpb24gdmlhIGBgX19pdGVyX18oKWBgLCB0aGVuIHRoZSBvbGRcbiAgIHNlcXVlbmNlIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgYGBfX2dldGl0ZW1fXygpYGAsIHNlZSAqdGhpc1xuICAgc2VjdGlvbiBpbiB0aGUgbGFuZ3VhZ2UgcmVmZXJlbmNlKi5cbiIsCisgJ3NoaWZ0aW5nJzogJ1xuU2hpZnRpbmcgb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgc2hpZnRpbmcgb3BlcmF0aW9ucyBoYXZlIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGFyaXRobWV0aWNcbm9wZXJhdGlvbnM6XG5cbiAgIHNoaWZ0X2V4cHIgOjo9IGFfZXhwciB8IHNoaWZ0X2V4cHIgKCAiPDwiIHwgIj4+IiApIGFfZXhwclxuXG5UaGVzZSBvcGVyYXRvcnMgYWNjZXB0IHBsYWluIG9yIGxvbmcgaW50ZWdlcnMgYXMgYXJndW1lbnRzLiAgVGhlXG5hcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgVGhleSBzaGlmdCB0aGUgZmlyc3RcbmFyZ3VtZW50IHRvIHRoZSBsZWZ0IG9yIHJpZ2h0IGJ5IHRoZSBudW1iZXIgb2YgYml0cyBnaXZlbiBieSB0aGVcbnNlY29uZCBhcmd1bWVudC5cblxuQSByaWdodCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIGRpdmlzaW9uIGJ5IGBgcG93KDIsIG4pYGAuICBBXG5sZWZ0IHNoaWZ0IGJ5ICpuKiBiaXRzIGlzIGRlZmluZWQgYXMgbXVsdGlwbGljYXRpb24gd2l0aCBgYHBvdygyLFxubilgYC4gIE5lZ2F0aXZlIHNoaWZ0IGNvdW50cyByYWlzZSBhIGBgVmFsdWVFcnJvcmBgIGV4Y2VwdGlvbi5cblxuTm90ZTogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSByaWdodC1oYW5kIG9wZXJhbmQgaXMgcmVxdWlyZWQgdG9cbiAgYmUgYXQgbW9zdCBgYHN5cy5tYXhzaXplYGAuICBJZiB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kIGlzIGxhcmdlclxuICB0aGFuIGBgc3lzLm1heHNpemVgYCBhbiBgYE92ZXJmbG93RXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLlxuJywKKyAnc2xpY2luZ3MnOiAnXG5TbGljaW5nc1xuKioqKioqKipcblxuQSBzbGljaW5nIHNlbGVjdHMgYSByYW5nZSBvZiBpdGVtcyBpbiBhIHNlcXVlbmNlIG9iamVjdCAoZS5nLiwgYVxuc3RyaW5nLCB0dXBsZSBvciBsaXN0KS4gIFNsaWNpbmdzIG1heSBiZSB1c2VkIGFzIGV4cHJlc3Npb25zIG9yIGFzXG50YXJnZXRzIGluIGFzc2lnbm1lbnQgb3IgYGBkZWxgYCBzdGF0ZW1lbnRzLiAgVGhlIHN5bnRheCBmb3IgYVxuc2xpY2luZzpcblxuICAgc2xpY2luZyAgICAgICAgICA6Oj0gc2ltcGxlX3NsaWNpbmcgfCBleHRlbmRlZF9zbGljaW5nXG4gICBzaW1wbGVfc2xpY2luZyAgIDo6PSBwcmltYXJ5ICJbIiBzaG9ydF9zbGljZSAiXSJcbiAgIGV4dGVuZGVkX3NsaWNpbmcgOjo9IHByaW1hcnkgIlsiIHNsaWNlX2xpc3QgIl0iXG4gICBzbGljZV9saXN0ICAgICAgIDo6PSBzbGljZV9pdGVtICgiLCIgc2xpY2VfaXRlbSkqIFsiLCJdXG4gICBzbGljZV9pdGVtICAgICAgIDo6PSBleHByZXNzaW9uIHwgcHJvcGVyX3NsaWNlIHwgZWxsaXBzaXNcbiAgIHByb3Blcl9zbGljZSAgICAgOjo9IHNob3J0X3NsaWNlIHwgbG9uZ19zbGljZVxuICAgc2hvcnRfc2xpY2UgICAgICA6Oj0gW2xvd2VyX2JvdW5kXSAiOiIgW3VwcGVyX2JvdW5kXVxuICAgbG9uZ19zbGljZSAgICAgICA6Oj0gc2hvcnRfc2xpY2UgIjoiIFtzdHJpZGVdXG4gICBsb3dlcl9ib3VuZCAgICAgIDo6PSBleHByZXNzaW9uXG4gICB1cHBlcl9ib3VuZCAgICAgIDo6PSBleHByZXNzaW9uXG4gICBzdHJpZGUgICAgICAgICAgIDo6PSBleHByZXNzaW9uXG4gICBlbGxpcHNpcyAgICAgICAgIDo6PSAiLi4uIlxuXG5UaGVyZSBpcyBhbWJpZ3VpdHkgaW4gdGhlIGZvcm1hbCBzeW50YXggaGVyZTogYW55dGhpbmcgdGhhdCBsb29rcyBsaWtlXG5hbiBleHByZXNzaW9uIGxpc3QgYWxzbyBsb29rcyBsaWtlIGEgc2xpY2UgbGlzdCwgc28gYW55IHN1YnNjcmlwdGlvblxuY2FuIGJlIGludGVycHJldGVkIGFzIGEgc2xpY2luZy4gIFJhdGhlciB0aGFuIGZ1cnRoZXIgY29tcGxpY2F0aW5nIHRoZVxuc3ludGF4LCB0aGlzIGlzIGRpc2FtYmlndWF0ZWQgYnkgZGVmaW5pbmcgdGhhdCBpbiB0aGlzIGNhc2UgdGhlXG5pbnRlcnByZXRhdGlvbiBhcyBhIHN1YnNjcmlwdGlvbiB0YWtlcyBwcmlvcml0eSBvdmVyIHRoZVxuaW50ZXJwcmV0YXRpb24gYXMgYSBzbGljaW5nICh0aGlzIGlzIHRoZSBjYXNlIGlmIHRoZSBzbGljZSBsaXN0XG5jb250YWlucyBubyBwcm9wZXIgc2xpY2Ugbm9yIGVsbGlwc2VzKS4gIFNpbWlsYXJseSwgd2hlbiB0aGUgc2xpY2Vcbmxpc3QgaGFzIGV4YWN0bHkgb25lIHNob3J0IHNsaWNlIGFuZCBubyB0cmFpbGluZyBjb21tYSwgdGhlXG5pbnRlcnByZXRhdGlvbiBhcyBhIHNpbXBsZSBzbGljaW5nIHRha2VzIHByaW9yaXR5IG92ZXIgdGhhdCBhcyBhblxuZXh0ZW5kZWQgc2xpY2luZy5cblxuVGhlIHNlbWFudGljcyBmb3IgYSBzaW1wbGUgc2xpY2luZyBhcmUgYXMgZm9sbG93cy4gIFRoZSBwcmltYXJ5IG11c3RcbmV2YWx1YXRlIHRvIGEgc2VxdWVuY2Ugb2JqZWN0LiAgVGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBleHByZXNzaW9ucyxcbmlmIHByZXNlbnQsIG11c3QgZXZhbHVhdGUgdG8gcGxhaW4gaW50ZWdlcnM7IGRlZmF1bHRzIGFyZSB6ZXJvIGFuZCB0aGVcbmBgc3lzLm1heGludGBgLCByZXNwZWN0aXZlbHkuICBJZiBlaXRoZXIgYm91bmQgaXMgbmVnYXRpdmUsIHRoZVxuc2VxdWVuY2VcJ3MgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiAgVGhlIHNsaWNpbmcgbm93IHNlbGVjdHMgYWxsIGl0ZW1zXG53aXRoIGluZGV4ICprKiBzdWNoIHRoYXQgYGBpIDw9IGsgPCBqYGAgd2hlcmUgKmkqIGFuZCAqaiogYXJlIHRoZVxuc3BlY2lmaWVkIGxvd2VyIGFuZCB1cHBlciBib3VuZHMuICBUaGlzIG1heSBiZSBhbiBlbXB0eSBzZXF1ZW5jZS4gIEl0XG5pcyBub3QgYW4gZXJyb3IgaWYgKmkqIG9yICpqKiBsaWUgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdmFsaWQgaW5kZXhlc1xuKHN1Y2ggaXRlbXMgZG9uXCd0IGV4aXN0IHNvIHRoZXkgYXJlblwndCBzZWxlY3RlZCkuXG5cblRoZSBzZW1hbnRpY3MgZm9yIGFuIGV4dGVuZGVkIHNsaWNpbmcgYXJlIGFzIGZvbGxvd3MuICBUaGUgcHJpbWFyeVxubXVzdCBldmFsdWF0ZSB0byBhIG1hcHBpbmcgb2JqZWN0LCBhbmQgaXQgaXMgaW5kZXhlZCB3aXRoIGEga2V5IHRoYXRcbmlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIHNsaWNlIGxpc3QsIGFzIGZvbGxvd3MuICBJZiB0aGUgc2xpY2UgbGlzdFxuY29udGFpbnMgYXQgbGVhc3Qgb25lIGNvbW1hLCB0aGUga2V5IGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGVcbmNvbnZlcnNpb24gb2YgdGhlIHNsaWNlIGl0ZW1zOyBvdGhlcndpc2UsIHRoZSBjb252ZXJzaW9uIG9mIHRoZSBsb25lXG5zbGljZSBpdGVtIGlzIHRoZSBrZXkuICBUaGUgY29udmVyc2lvbiBvZiBhIHNsaWNlIGl0ZW0gdGhhdCBpcyBhblxuZXhwcmVzc2lvbiBpcyB0aGF0IGV4cHJlc3Npb24uICBUaGUgY29udmVyc2lvbiBvZiBhbiBlbGxpcHNpcyBzbGljZVxuaXRlbSBpcyB0aGUgYnVpbHQtaW4gYGBFbGxpcHNpc2BgIG9iamVjdC4gIFRoZSBjb252ZXJzaW9uIG9mIGEgcHJvcGVyXG5zbGljZSBpcyBhIHNsaWNlIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopXG53aG9zZSBgYHN0YXJ0YGAsIGBgc3RvcGBgIGFuZCBgYHN0ZXBgYCBhdHRyaWJ1dGVzIGFyZSB0aGUgdmFsdWVzIG9mXG50aGUgZXhwcmVzc2lvbnMgZ2l2ZW4gYXMgbG93ZXIgYm91bmQsIHVwcGVyIGJvdW5kIGFuZCBzdHJpZGUsXG5yZXNwZWN0aXZlbHksIHN1YnN0aXR1dGluZyBgYE5vbmVgYCBmb3IgbWlzc2luZyBleHByZXNzaW9ucy5cbicsCisgJ3NwZWNpYWxhdHRycyc6ICdcblNwZWNpYWwgQXR0cmlidXRlc1xuKioqKioqKioqKioqKioqKioqXG5cblRoZSBpbXBsZW1lbnRhdGlvbiBhZGRzIGEgZmV3IHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXMgdG8gc2V2ZXJhbFxub2JqZWN0IHR5cGVzLCB3aGVyZSB0aGV5IGFyZSByZWxldmFudC4gIFNvbWUgb2YgdGhlc2UgYXJlIG5vdCByZXBvcnRlZFxuYnkgdGhlIGBgZGlyKClgYCBidWlsdC1pbiBmdW5jdGlvbi5cblxub2JqZWN0Ll9fZGljdF9fXG5cbiAgIEEgZGljdGlvbmFyeSBvciBvdGhlciBtYXBwaW5nIG9iamVjdCB1c2VkIHRvIHN0b3JlIGFuIG9iamVjdFwnc1xuICAgKHdyaXRhYmxlKSBhdHRyaWJ1dGVzLlxuXG5vYmplY3QuX19tZXRob2RzX19cblxuICAgRGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuMjogVXNlIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGRpcigpYGBcbiAgIHRvIGdldCBhIGxpc3Qgb2YgYW4gb2JqZWN0XCdzIGF0dHJpYnV0ZXMuIFRoaXMgYXR0cmlidXRlIGlzIG5vXG4gICBsb25nZXIgYXZhaWxhYmxlLlxuXG5vYmplY3QuX19tZW1iZXJzX19cblxuICAgRGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuMjogVXNlIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGRpcigpYGBcbiAgIHRvIGdldCBhIGxpc3Qgb2YgYW4gb2JqZWN0XCdzIGF0dHJpYnV0ZXMuIFRoaXMgYXR0cmlidXRlIGlzIG5vXG4gICBsb25nZXIgYXZhaWxhYmxlLlxuXG5pbnN0YW5jZS5fX2NsYXNzX19cblxuICAgVGhlIGNsYXNzIHRvIHdoaWNoIGEgY2xhc3MgaW5zdGFuY2UgYmVsb25ncy5cblxuY2xhc3MuX19iYXNlc19fXG5cbiAgIFRoZSB0dXBsZSBvZiBiYXNlIGNsYXNzZXMgb2YgYSBjbGFzcyBvYmplY3QuXG5cbmNsYXNzLl9fbmFtZV9fXG5cbiAgIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvciB0eXBlLlxuXG5UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIG9ubHkgc3VwcG9ydGVkIGJ5ICpuZXctc3R5bGUgY2xhc3MqZXMuXG5cbmNsYXNzLl9fbXJvX19cblxuICAgVGhpcyBhdHRyaWJ1dGUgaXMgYSB0dXBsZSBvZiBjbGFzc2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgd2hlblxuICAgbG9va2luZyBmb3IgYmFzZSBjbGFzc2VzIGR1cmluZyBtZXRob2QgcmVzb2x1dGlvbi5cblxuY2xhc3MubXJvKClcblxuICAgVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBtZXRhY2xhc3MgdG8gY3VzdG9taXplIHRoZVxuICAgbWV0aG9kIHJlc29sdXRpb24gb3JkZXIgZm9yIGl0cyBpbnN0YW5jZXMuICBJdCBpcyBjYWxsZWQgYXQgY2xhc3NcbiAgIGluc3RhbnRpYXRpb24sIGFuZCBpdHMgcmVzdWx0IGlzIHN0b3JlZCBpbiBgYF9fbXJvX19gYC5cblxuY2xhc3MuX19zdWJjbGFzc2VzX18oKVxuXG4gICBFYWNoIG5ldy1zdHlsZSBjbGFzcyBrZWVwcyBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIGl0c1xuICAgaW1tZWRpYXRlIHN1YmNsYXNzZXMuICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiBhbGwgdGhvc2VcbiAgIHJlZmVyZW5jZXMgc3RpbGwgYWxpdmUuIEV4YW1wbGU6XG5cbiAgICAgID4+PiBpbnQuX19zdWJjbGFzc2VzX18oKVxuICAgICAgWzx0eXBlIFwnYm9vbFwnPl1cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZXNlIHNwZWNpYWwgbWV0aG9kcyBtYXkgYmUgZm91bmQgaW5cbiAgICB0aGUgUHl0aG9uIFJlZmVyZW5jZSBNYW51YWwgKCpCYXNpYyBjdXN0b21pemF0aW9uKikuXG5cblsyXSBBcyBhIGNvbnNlcXVlbmNlLCB0aGUgbGlzdCBgYFsxLCAyXWBgIGlzIGNvbnNpZGVyZWQgZXF1YWwgdG9cbiAgICBgYFsxLjAsIDIuMF1gYCwgYW5kIHNpbWlsYXJseSBmb3IgdHVwbGVzLlxuXG5bM10gVGhleSBtdXN0IGhhdmUgc2luY2UgdGhlIHBhcnNlciBjYW5cJ3QgdGVsbCB0aGUgdHlwZSBvZiB0aGVcbiAgICBvcGVyYW5kcy5cblxuWzRdIENhc2VkIGNoYXJhY3RlcnMgYXJlIHRob3NlIHdpdGggZ2VuZXJhbCBjYXRlZ29yeSBwcm9wZXJ0eSBiZWluZ1xuICAgIG9uZSBvZiAiTHUiIChMZXR0ZXIsIHVwcGVyY2FzZSksICJMbCIgKExldHRlciwgbG93ZXJjYXNlKSwgb3IgIkx0IlxuICAgIChMZXR0ZXIsIHRpdGxlY2FzZSkuXG5cbls1XSBUbyBmb3JtYXQgb25seSBhIHR1cGxlIHlvdSBzaG91bGQgdGhlcmVmb3JlIHByb3ZpZGUgYSBzaW5nbGV0b25cbiAgICB0dXBsZSB3aG9zZSBvbmx5IGVsZW1lbnQgaXMgdGhlIHR1cGxlIHRvIGJlIGZvcm1hdHRlZC5cblxuWzZdIFRoZSBhZHZhbnRhZ2Ugb2YgbGVhdmluZyB0aGUgbmV3bGluZSBvbiBpcyB0aGF0IHJldHVybmluZyBhbiBlbXB0eVxuICAgIHN0cmluZyBpcyB0aGVuIGFuIHVuYW1iaWd1b3VzIEVPRiBpbmRpY2F0aW9uLiAgSXQgaXMgYWxzbyBwb3NzaWJsZVxuICAgIChpbiBjYXNlcyB3aGVyZSBpdCBtaWdodCBtYXR0ZXIsIGZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBtYWtlXG4gICAgYW4gZXhhY3QgY29weSBvZiBhIGZpbGUgd2hpbGUgc2Nhbm5pbmcgaXRzIGxpbmVzKSB0byB0ZWxsIHdoZXRoZXJcbiAgICB0aGUgbGFzdCBsaW5lIG9mIGEgZmlsZSBlbmRlZCBpbiBhIG5ld2xpbmUgb3Igbm90ICh5ZXMgdGhpc1xuICAgIGhhcHBlbnMhKS5cbicsCisgJ3NwZWNpYWxuYW1lcyc6ICdcblNwZWNpYWwgbWV0aG9kIG5hbWVzXG4qKioqKioqKioqKioqKioqKioqKlxuXG5BIGNsYXNzIGNhbiBpbXBsZW1lbnQgY2VydGFpbiBvcGVyYXRpb25zIHRoYXQgYXJlIGludm9rZWQgYnkgc3BlY2lhbFxuc3ludGF4IChzdWNoIGFzIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvciBzdWJzY3JpcHRpbmcgYW5kIHNsaWNpbmcpIGJ5XG5kZWZpbmluZyBtZXRob2RzIHdpdGggc3BlY2lhbCBuYW1lcy4gVGhpcyBpcyBQeXRob25cJ3MgYXBwcm9hY2ggdG9cbipvcGVyYXRvciBvdmVybG9hZGluZyosIGFsbG93aW5nIGNsYXNzZXMgdG8gZGVmaW5lIHRoZWlyIG93biBiZWhhdmlvclxud2l0aCByZXNwZWN0IHRvIGxhbmd1YWdlIG9wZXJhdG9ycy4gIEZvciBpbnN0YW5jZSwgaWYgYSBjbGFzcyBkZWZpbmVzXG5hIG1ldGhvZCBuYW1lZCBgYF9fZ2V0aXRlbV9fKClgYCwgYW5kIGBgeGBgIGlzIGFuIGluc3RhbmNlIG9mIHRoaXNcbmNsYXNzLCB0aGVuIGBgeFtpXWBgIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0byBgYHguX19nZXRpdGVtX18oaSlgYCBmb3Jcbm9sZC1zdHlsZSBjbGFzc2VzIGFuZCBgYHR5cGUoeCkuX19nZXRpdGVtX18oeCwgaSlgYCBmb3IgbmV3LXN0eWxlXG5jbGFzc2VzLiAgRXhjZXB0IHdoZXJlIG1lbnRpb25lZCwgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBhbiBvcGVyYXRpb25cbnJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuIG5vIGFwcHJvcHJpYXRlIG1ldGhvZCBpcyBkZWZpbmVkICh0eXBpY2FsbHlcbmBgQXR0cmlidXRlRXJyb3JgYCBvciBgYFR5cGVFcnJvcmBgKS5cblxuV2hlbiBpbXBsZW1lbnRpbmcgYSBjbGFzcyB0aGF0IGVtdWxhdGVzIGFueSBidWlsdC1pbiB0eXBlLCBpdCBpc1xuaW1wb3J0YW50IHRoYXQgdGhlIGVtdWxhdGlvbiBvbmx5IGJlIGltcGxlbWVudGVkIHRvIHRoZSBkZWdyZWUgdGhhdCBpdFxubWFrZXMgc2Vuc2UgZm9yIHRoZSBvYmplY3QgYmVpbmcgbW9kZWxsZWQuICBGb3IgZXhhbXBsZSwgc29tZVxuc2VxdWVuY2VzIG1heSB3b3JrIHdlbGwgd2l0aCByZXRyaWV2YWwgb2YgaW5kaXZpZHVhbCBlbGVtZW50cywgYnV0XG5leHRyYWN0aW5nIGEgc2xpY2UgbWF5IG5vdCBtYWtlIHNlbnNlLiAgKE9uZSBleGFtcGxlIG9mIHRoaXMgaXMgdGhlXG5gYE5vZGVMaXN0YGAgaW50ZXJmYWNlIGluIHRoZSBXM0NcJ3MgRG9jdW1lbnQgT2JqZWN0IE1vZGVsLilcblxuXG5CYXNpYyBjdXN0b21pemF0aW9uXG49PT09PT09PT09PT09PT09PT09XG5cbm9iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pXG5cbiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICBgYF9fbmV3X18oKWBgIGlzIGFcbiAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgYXMgc3VjaClcbiAgIHRoYXQgdGFrZXMgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIHdhcyByZXF1ZXN0ZWQgYXMgaXRzXG4gICBmaXJzdCBhcmd1bWVudC4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aG9zZSBwYXNzZWQgdG8gdGhlXG4gICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gIFRoZSByZXR1cm5cbiAgIHZhbHVlIG9mIGBgX19uZXdfXygpYGAgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICh1c3VhbGx5XG4gICBhbiBpbnN0YW5jZSBvZiAqY2xzKikuXG5cbiAgIFR5cGljYWwgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYnlcbiAgIGludm9raW5nIHRoZSBzdXBlcmNsYXNzXCdzIGBgX19uZXdfXygpYGAgbWV0aG9kIHVzaW5nXG4gICBgYHN1cGVyKGN1cnJlbnRjbGFzcywgY2xzKS5fX25ld19fKGNsc1ssIC4uLl0pYGAgd2l0aCBhcHByb3ByaWF0ZVxuICAgYXJndW1lbnRzIGFuZCB0aGVuIG1vZGlmeWluZyB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZSBhc1xuICAgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcgaXQuXG5cbiAgIElmIGBgX19uZXdfXygpYGAgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3XG4gICBpbnN0YW5jZVwncyBgYF9faW5pdF9fKClgYCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2VcbiAgIGBgX19pbml0X18oc2VsZlssIC4uLl0pYGAsIHdoZXJlICpzZWxmKiBpcyB0aGUgbmV3IGluc3RhbmNlIGFuZCB0aGVcbiAgIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdlcmUgcGFzc2VkIHRvIGBgX19uZXdfXygpYGAuXG5cbiAgIElmIGBgX19uZXdfXygpYGAgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzIGBgX19pbml0X18oKWBgIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLlxuXG4gICBgYF9fbmV3X18oKWBgIGlzIGludGVuZGVkIG1haW5seSB0byBhbGxvdyBzdWJjbGFzc2VzIG9mIGltbXV0YWJsZVxuICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgY3JlYXRpb24uICBJdFxuICAgaXMgYWxzbyBjb21tb25seSBvdmVycmlkZGVuIGluIGN1c3RvbSBtZXRhY2xhc3NlcyBpbiBvcmRlciB0b1xuICAgY3VzdG9taXplIGNsYXNzIGNyZWF0aW9uLlxuXG5vYmplY3QuX19pbml0X18oc2VsZlssIC4uLl0pXG5cbiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBjcmVhdGVkLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhvc2VcbiAgIHBhc3NlZCB0byB0aGUgY2xhc3MgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYW5cbiAgIGBgX19pbml0X18oKWBgIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgYGBfX2luaXRfXygpYGAgbWV0aG9kLFxuICAgaWYgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mXG4gICB0aGUgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZTsgZm9yIGV4YW1wbGU6XG4gICBgYEJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pYGAuICBBcyBhIHNwZWNpYWwgY29uc3RyYWludFxuICAgb24gY29uc3RydWN0b3JzLCBubyB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQ7IGRvaW5nIHNvIHdpbGwgY2F1c2UgYVxuICAgYGBUeXBlRXJyb3JgYCB0byBiZSByYWlzZWQgYXQgcnVudGltZS5cblxub2JqZWN0Ll9fZGVsX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzb1xuICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSBgYF9fZGVsX18oKWBgIG1ldGhvZCxcbiAgIHRoZSBkZXJpdmVkIGNsYXNzXCdzIGBgX19kZWxfXygpYGAgbWV0aG9kLCBpZiBhbnksIG11c3QgZXhwbGljaXRseVxuICAgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGRlbGV0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlXG4gICBpbnN0YW5jZS4gIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSAodGhvdWdoIG5vdCByZWNvbW1lbmRlZCEpIGZvclxuICAgdGhlIGBgX19kZWxfXygpYGAgbWV0aG9kIHRvIHBvc3Rwb25lIGRlc3RydWN0aW9uIG9mIHRoZSBpbnN0YW5jZSBieVxuICAgY3JlYXRpbmcgYSBuZXcgcmVmZXJlbmNlIHRvIGl0LiAgSXQgbWF5IHRoZW4gYmUgY2FsbGVkIGF0IGEgbGF0ZXJcbiAgIHRpbWUgd2hlbiB0aGlzIG5ldyByZWZlcmVuY2UgaXMgZGVsZXRlZC4gIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXRcbiAgIGBgX19kZWxfXygpYGAgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlblxuICAgdGhlIGludGVycHJldGVyIGV4aXRzLlxuXG4gICBOb3RlOiBgYGRlbCB4YGAgZG9lc25cJ3QgZGlyZWN0bHkgY2FsbCBgYHguX19kZWxfXygpYGAgLS0tIHRoZSBmb3JtZXJcbiAgICAgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciBgYHhgYCBieSBvbmUsIGFuZCB0aGUgbGF0dGVyXG4gICAgIGlzIG9ubHkgY2FsbGVkIHdoZW4gYGB4YGBcJ3MgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4gIFNvbWVcbiAgICAgY29tbW9uIHNpdHVhdGlvbnMgdGhhdCBtYXkgcHJldmVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuXG4gICAgIG9iamVjdCBmcm9tIGdvaW5nIHRvIHplcm8gaW5jbHVkZTogY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuXG4gICAgIG9iamVjdHMgKGUuZy4sIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9yIGEgdHJlZSBkYXRhIHN0cnVjdHVyZSB3aXRoXG4gICAgIHBhcmVudCBhbmQgY2hpbGQgcG9pbnRlcnMpOyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG9uIHRoZVxuICAgICBzdGFjayBmcmFtZSBvZiBhIGZ1bmN0aW9uIHRoYXQgY2F1Z2h0IGFuIGV4Y2VwdGlvbiAodGhlIHRyYWNlYmFja1xuICAgICBzdG9yZWQgaW4gYGBzeXMuZXhjX3RyYWNlYmFja2BgIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSk7IG9yXG4gICAgIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIHRoYXQgcmFpc2VkIGFuXG4gICAgIHVuaGFuZGxlZCBleGNlcHRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW5cbiAgICAgYGBzeXMubGFzdF90cmFjZWJhY2tgYCBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgVGhlIGZpcnN0XG4gICAgIHNpdHVhdGlvbiBjYW4gb25seSBiZSByZW1lZGllZCBieSBleHBsaWNpdGx5IGJyZWFraW5nIHRoZSBjeWNsZXM7XG4gICAgIHRoZSBsYXR0ZXIgdHdvIHNpdHVhdGlvbnMgY2FuIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgYGBOb25lYGAgaW5cbiAgICAgYGBzeXMuZXhjX3RyYWNlYmFja2BgIG9yIGBgc3lzLmxhc3RfdHJhY2ViYWNrYGAuICBDaXJjdWxhclxuICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCB3aGVuIHRoZSBvcHRpb24gY3ljbGVcbiAgICAgZGV0ZWN0b3IgaXMgZW5hYmxlZCAoaXRcJ3Mgb24gYnkgZGVmYXVsdCksIGJ1dCBjYW4gb25seSBiZSBjbGVhbmVkXG4gICAgIHVwIGlmIHRoZXJlIGFyZSBubyBQeXRob24tbGV2ZWwgYGBfX2RlbF9fKClgYCBtZXRob2RzIGludm9sdmVkLlxuICAgICBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGBgZ2NgYCBtb2R1bGUgZm9yIG1vcmVcbiAgICAgaW5mb3JtYXRpb24gYWJvdXQgaG93IGBgX19kZWxfXygpYGAgbWV0aG9kcyBhcmUgaGFuZGxlZCBieSB0aGVcbiAgICAgY3ljbGUgZGV0ZWN0b3IsIHBhcnRpY3VsYXJseSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGBgZ2FyYmFnZWBgXG4gICAgIHZhbHVlLlxuXG4gICBXYXJuaW5nOiBEdWUgdG8gdGhlIHByZWNhcmlvdXMgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCBgYF9fZGVsX18oKWBgXG4gICAgIG1ldGhvZHMgYXJlIGludm9rZWQsIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmcgdGhlaXIgZXhlY3V0aW9uXG4gICAgIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG8gYGBzeXMuc3RkZXJyYGAgaW5zdGVhZC5cbiAgICAgQWxzbywgd2hlbiBgYF9fZGVsX18oKWBgIGlzIGludm9rZWQgaW4gcmVzcG9uc2UgdG8gYSBtb2R1bGUgYmVpbmdcbiAgICAgZGVsZXRlZCAoZS5nLiwgd2hlbiBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0gaXMgZG9uZSksIG90aGVyXG4gICAgIGdsb2JhbHMgcmVmZXJlbmNlZCBieSB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgbWF5IGFscmVhZHkgaGF2ZVxuICAgICBiZWVuIGRlbGV0ZWQgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgdG9ybiBkb3duIChlLmcuIHRoZVxuICAgICBpbXBvcnQgbWFjaGluZXJ5IHNodXR0aW5nIGRvd24pLiAgRm9yIHRoaXMgcmVhc29uLCBgYF9fZGVsX18oKWBgXG4gICAgIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIG5lZWRlZCB0byBtYWludGFpblxuICAgICBleHRlcm5hbCBpbnZhcmlhbnRzLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuNSwgUHl0aG9uXG4gICAgIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSBzaW5nbGVcbiAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscyBhcmVcbiAgICAgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsIHRoaXMgbWF5XG4gICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgYXQgdGhlXG4gICAgIHRpbWUgd2hlbiB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgaXMgY2FsbGVkLlxuXG4gICBTZWUgYWxzbyB0aGUgKi1SKiBjb21tYW5kLWxpbmUgb3B0aW9uLlxuXG5vYmplY3QuX19yZXByX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IHRoZSBgYHJlcHIoKWBgIGJ1aWx0LWluIGZ1bmN0aW9uIGFuZCBieSBzdHJpbmdcbiAgIGNvbnZlcnNpb25zIChyZXZlcnNlIHF1b3RlcykgdG8gY29tcHV0ZSB0aGUgIm9mZmljaWFsIiBzdHJpbmdcbiAgIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpcyBzaG91bGQgbG9va1xuICAgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSBhblxuICAgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuIGFwcHJvcHJpYXRlIGVudmlyb25tZW50KS4gIElmXG4gICB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlIGZvcm0gYGA8Li4uc29tZSB1c2VmdWxcbiAgIGRlc2NyaXB0aW9uLi4uPmBgIHNob3VsZCBiZSByZXR1cm5lZC4gIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhXG4gICBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgYGBfX3JlcHJfXygpYGAgYnV0IG5vdFxuICAgYGBfX3N0cl9fKClgYCwgdGhlbiBgYF9fcmVwcl9fKClgYCBpcyBhbHNvIHVzZWQgd2hlbiBhbiAiaW5mb3JtYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgcmVxdWlyZWQuXG5cbiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlXG4gICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cblxub2JqZWN0Ll9fc3RyX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IHRoZSBgYHN0cigpYGAgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHRoZSBgYHByaW50YGBcbiAgIHN0YXRlbWVudCB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhblxuICAgb2JqZWN0LiAgVGhpcyBkaWZmZXJzIGZyb20gYGBfX3JlcHJfXygpYGAgaW4gdGhhdCBpdCBkb2VzIG5vdCBoYXZlXG4gICB0byBiZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uOiBhIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlXG4gICByZXByZXNlbnRhdGlvbiBtYXkgYmUgdXNlZCBpbnN0ZWFkLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYVxuICAgc3RyaW5nIG9iamVjdC5cblxub2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjEuXG5cbiAgIFRoZXNlIGFyZSB0aGUgc28tY2FsbGVkICJyaWNoIGNvbXBhcmlzb24iIG1ldGhvZHMsIGFuZCBhcmUgY2FsbGVkXG4gICBmb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgaW4gcHJlZmVyZW5jZSB0byBgYF9fY21wX18oKWBgIGJlbG93LiBUaGVcbiAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzXG4gICBmb2xsb3dzOiBgYHg8eWBgIGNhbGxzIGBgeC5fX2x0X18oeSlgYCwgYGB4PD15YGAgY2FsbHNcbiAgIGBgeC5fX2xlX18oeSlgYCwgYGB4PT15YGAgY2FsbHMgYGB4Ll9fZXFfXyh5KWBgLCBgYHghPXlgYCBhbmRcbiAgIGBgeDw+eWBgIGNhbGwgYGB4Ll9fbmVfXyh5KWBgLCBgYHg+eWBgIGNhbGxzIGBgeC5fX2d0X18oeSlgYCwgYW5kXG4gICBgYHg+PXlgYCBjYWxscyBgYHguX19nZV9fKHkpYGAuXG5cbiAgIEEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b25cbiAgIGBgTm90SW1wbGVtZW50ZWRgYCBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYVxuICAgZ2l2ZW4gcGFpciBvZiBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sIGBgRmFsc2VgYCBhbmQgYGBUcnVlYGAgYXJlXG4gICByZXR1cm5lZCBmb3IgYSBzdWNjZXNzZnVsIGNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuXG4gICByZXR1cm4gYW55IHZhbHVlLCBzbyBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGFcbiAgIEJvb2xlYW4gY29udGV4dCAoZS5nLiwgaW4gdGhlIGNvbmRpdGlvbiBvZiBhbiBgYGlmYGAgc3RhdGVtZW50KSxcbiAgIFB5dGhvbiB3aWxsIGNhbGwgYGBib29sKClgYCBvbiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXN1bHRcbiAgIGlzIHRydWUgb3IgZmFsc2UuXG5cbiAgIFRoZXJlIGFyZSBubyBpbXBsaWVkIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLlxuICAgVGhlIHRydXRoIG9mIGBgeD09eWBgIGRvZXMgbm90IGltcGx5IHRoYXQgYGB4IT15YGAgaXMgZmFsc2UuXG4gICBBY2NvcmRpbmdseSwgd2hlbiBkZWZpbmluZyBgYF9fZXFfXygpYGAsIG9uZSBzaG91bGQgYWxzbyBkZWZpbmVcbiAgIGBgX19uZV9fKClgYCBzbyB0aGF0IHRoZSBvcGVyYXRvcnMgd2lsbCBiZWhhdmUgYXMgZXhwZWN0ZWQuICBTZWVcbiAgIHRoZSBwYXJhZ3JhcGggb24gYGBfX2hhc2hfXygpYGAgZm9yIHNvbWUgaW1wb3J0YW50IG5vdGVzIG9uXG4gICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gY29tcGFyaXNvblxuICAgb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuXG5cbiAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgKHRvIGJlIHVzZWRcbiAgIHdoZW4gdGhlIGxlZnQgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIGJ1dCB0aGUgcmlnaHRcbiAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsIGBgX19sdF9fKClgYCBhbmQgYGBfX2d0X18oKWBgIGFyZSBlYWNoXG4gICBvdGhlclwncyByZWZsZWN0aW9uLCBgYF9fbGVfXygpYGAgYW5kIGBgX19nZV9fKClgYCBhcmUgZWFjaCBvdGhlclwnc1xuICAgcmVmbGVjdGlvbiwgYW5kIGBgX19lcV9fKClgYCBhbmQgYGBfX25lX18oKWBgIGFyZSB0aGVpciBvd25cbiAgIHJlZmxlY3Rpb24uXG5cbiAgIEFyZ3VtZW50cyB0byByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBhcmUgbmV2ZXIgY29lcmNlZC5cblxuICAgVG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBvcmRlcmluZyBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgcm9vdFxuICAgb3BlcmF0aW9uLCBzZWUgYGBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKWBgLlxuXG5vYmplY3QuX19jbXBfXyhzZWxmLCBvdGhlcilcblxuICAgQ2FsbGVkIGJ5IGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpZiByaWNoIGNvbXBhcmlzb24gKHNlZSBhYm92ZSkgaXNcbiAgIG5vdCBkZWZpbmVkLiAgU2hvdWxkIHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIgaWYgYGBzZWxmIDwgb3RoZXJgYCxcbiAgIHplcm8gaWYgYGBzZWxmID09IG90aGVyYGAsIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBgYHNlbGYgPiBvdGhlcmBgLlxuICAgSWYgbm8gYGBfX2NtcF9fKClgYCwgYGBfX2VxX18oKWBgIG9yIGBgX19uZV9fKClgYCBvcGVyYXRpb24gaXNcbiAgIGRlZmluZWQsIGNsYXNzIGluc3RhbmNlcyBhcmUgY29tcGFyZWQgYnkgb2JqZWN0IGlkZW50aXR5XG4gICAoImFkZHJlc3MiKS4gIFNlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiBgYF9faGFzaF9fKClgYCBmb3Igc29tZVxuICAgaW1wb3J0YW50IG5vdGVzIG9uIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbVxuICAgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy4gKE5vdGU6IHRoZVxuICAgcmVzdHJpY3Rpb24gdGhhdCBleGNlcHRpb25zIGFyZSBub3QgcHJvcGFnYXRlZCBieSBgYF9fY21wX18oKWBgIGhhc1xuICAgYmVlbiByZW1vdmVkIHNpbmNlIFB5dGhvbiAxLjUuKVxuXG5vYmplY3QuX19yY21wX18oc2VsZiwgb3RoZXIpXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjE6IE5vIGxvbmdlciBzdXBwb3J0ZWQuXG5cbm9iamVjdC5fX2hhc2hfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gYGBoYXNoKClgYCBhbmQgZm9yIG9wZXJhdGlvbnMgb25cbiAgIG1lbWJlcnMgb2YgaGFzaGVkIGNvbGxlY3Rpb25zIGluY2x1ZGluZyBgYHNldGBgLCBgYGZyb3plbnNldGBgLCBhbmRcbiAgIGBgZGljdGBgLiAgYGBfX2hhc2hfXygpYGAgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiAgVGhlIG9ubHlcbiAgIHJlcXVpcmVkIHByb3BlcnR5IGlzIHRoYXQgb2JqZWN0cyB3aGljaCBjb21wYXJlIGVxdWFsIGhhdmUgdGhlIHNhbWVcbiAgIGhhc2ggdmFsdWU7IGl0IGlzIGFkdmlzZWQgdG8gc29tZWhvdyBtaXggdG9nZXRoZXIgKGUuZy4gdXNpbmdcbiAgIGV4Y2x1c2l2ZSBvcikgdGhlIGhhc2ggdmFsdWVzIGZvciB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXRcbiAgIGFsc28gcGxheSBhIHBhcnQgaW4gY29tcGFyaXNvbiBvZiBvYmplY3RzLlxuXG4gICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhIGBgX19jbXBfXygpYGAgb3IgYGBfX2VxX18oKWBgIG1ldGhvZFxuICAgaXQgc2hvdWxkIG5vdCBkZWZpbmUgYSBgYF9faGFzaF9fKClgYCBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdFxuICAgZGVmaW5lcyBgYF9fY21wX18oKWBgIG9yIGBgX19lcV9fKClgYCBidXQgbm90IGBgX19oYXNoX18oKWBgLCBpdHNcbiAgIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgaW4gaGFzaGVkIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzc1xuICAgZGVmaW5lcyBtdXRhYmxlIG9iamVjdHMgYW5kIGltcGxlbWVudHMgYSBgYF9fY21wX18oKWBgIG9yXG4gICBgYF9fZXFfXygpYGAgbWV0aG9kLCBpdCBzaG91bGQgbm90IGltcGxlbWVudCBgYF9faGFzaF9fKClgYCwgc2luY2VcbiAgIGhhc2hhYmxlIGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb25zIHJlcXVpcmUgdGhhdCBhIG9iamVjdFwncyBoYXNoXG4gICB2YWx1ZSBpcyBpbW11dGFibGUgKGlmIHRoZSBvYmplY3RcJ3MgaGFzaCB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlXG4gICBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLlxuXG4gICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlIGBgX19jbXBfXygpYGAgYW5kIGBgX19oYXNoX18oKWBgIG1ldGhvZHNcbiAgIGJ5IGRlZmF1bHQ7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgd2l0aFxuICAgdGhlbXNlbHZlcykgYW5kIGBgeC5fX2hhc2hfXygpYGAgcmV0dXJucyBgYGlkKHgpYGAuXG5cbiAgIENsYXNzZXMgd2hpY2ggaW5oZXJpdCBhIGBgX19oYXNoX18oKWBgIG1ldGhvZCBmcm9tIGEgcGFyZW50IGNsYXNzXG4gICBidXQgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIGBgX19jbXBfXygpYGAgb3IgYGBfX2VxX18oKWBgIHN1Y2ggdGhhdFxuICAgdGhlIGhhc2ggdmFsdWUgcmV0dXJuZWQgaXMgbm8gbG9uZ2VyIGFwcHJvcHJpYXRlIChlLmcuIGJ5IHN3aXRjaGluZ1xuICAgdG8gYSB2YWx1ZS1iYXNlZCBjb25jZXB0IG9mIGVxdWFsaXR5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHRcbiAgIGlkZW50aXR5IGJhc2VkIGVxdWFsaXR5KSBjYW4gZXhwbGljaXRseSBmbGFnIHRoZW1zZWx2ZXMgYXMgYmVpbmdcbiAgIHVuaGFzaGFibGUgYnkgc2V0dGluZyBgYF9faGFzaF9fID0gTm9uZWBgIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLlxuICAgRG9pbmcgc28gbWVhbnMgdGhhdCBub3Qgb25seSB3aWxsIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgcmFpc2UgYW5cbiAgIGFwcHJvcHJpYXRlIGBgVHlwZUVycm9yYGAgd2hlbiBhIHByb2dyYW0gYXR0ZW1wdHMgdG8gcmV0cmlldmUgdGhlaXJcbiAgIGhhc2ggdmFsdWUsIGJ1dCB0aGV5IHdpbGwgYWxzbyBiZSBjb3JyZWN0bHkgaWRlbnRpZmllZCBhc1xuICAgdW5oYXNoYWJsZSB3aGVuIGNoZWNraW5nIGBgaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKWBgXG4gICAodW5saWtlIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZWlyIG93biBgYF9faGFzaF9fKClgYCB0byBleHBsaWNpdGx5XG4gICByYWlzZSBgYFR5cGVFcnJvcmBgKS5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogYGBfX2hhc2hfXygpYGAgbWF5IG5vdyBhbHNvIHJldHVybiBhIGxvbmdcbiAgIGludGVnZXIgb2JqZWN0OyB0aGUgMzItYml0IGludGVnZXIgaXMgdGhlbiBkZXJpdmVkIGZyb20gdGhlIGhhc2ggb2ZcbiAgIHRoYXQgb2JqZWN0LlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi42OiBgYF9faGFzaF9fYGAgbWF5IG5vdyBiZSBzZXQgdG8gYGBOb25lYGAgdG9cbiAgIGV4cGxpY2l0bHkgZmxhZyBpbnN0YW5jZXMgb2YgYSBjbGFzcyBhcyB1bmhhc2hhYmxlLlxuXG5vYmplY3QuX19ub256ZXJvX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0cnV0aCB2YWx1ZSB0ZXN0aW5nIGFuZCB0aGUgYnVpbHQtaW4gb3BlcmF0aW9uXG4gICBgYGJvb2woKWBgOyBzaG91bGQgcmV0dXJuIGBgRmFsc2VgYCBvciBgYFRydWVgYCwgb3IgdGhlaXIgaW50ZWdlclxuICAgZXF1aXZhbGVudHMgYGAwYGAgb3IgYGAxYGAuICBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLFxuICAgYGBfX2xlbl9fKClgYCBpcyBjYWxsZWQsIGlmIGl0IGlzIGRlZmluZWQsIGFuZCB0aGUgb2JqZWN0IGlzXG4gICBjb25zaWRlcmVkIHRydWUgaWYgaXRzIHJlc3VsdCBpcyBub256ZXJvLiBJZiBhIGNsYXNzIGRlZmluZXNcbiAgIG5laXRoZXIgYGBfX2xlbl9fKClgYCBub3IgYGBfX25vbnplcm9fXygpYGAsIGFsbCBpdHMgaW5zdGFuY2VzIGFyZVxuICAgY29uc2lkZXJlZCB0cnVlLlxuXG5vYmplY3QuX191bmljb2RlX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBgYHVuaWNvZGUoKWBgIGJ1aWx0LWluOyBzaG91bGQgcmV0dXJuIGEgVW5pY29kZVxuICAgb2JqZWN0LiBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCBzdHJpbmcgY29udmVyc2lvbiBpc1xuICAgYXR0ZW1wdGVkLCBhbmQgdGhlIHJlc3VsdCBvZiBzdHJpbmcgY29udmVyc2lvbiBpcyBjb252ZXJ0ZWQgdG9cbiAgIFVuaWNvZGUgdXNpbmcgdGhlIHN5c3RlbSBkZWZhdWx0IGVuY29kaW5nLlxuXG5cbkN1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGN1c3RvbWl6ZSB0aGUgbWVhbmluZyBvZlxuYXR0cmlidXRlIGFjY2VzcyAodXNlIG9mLCBhc3NpZ25tZW50IHRvLCBvciBkZWxldGlvbiBvZiBgYHgubmFtZWBgKVxuZm9yIGNsYXNzIGluc3RhbmNlcy5cblxub2JqZWN0Ll9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBsb29rdXAgaGFzIG5vdCBmb3VuZCB0aGUgYXR0cmlidXRlIGluIHRoZVxuICAgdXN1YWwgcGxhY2VzIChpLmUuIGl0IGlzIG5vdCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgbm9yIGlzIGl0IGZvdW5kXG4gICBpbiB0aGUgY2xhc3MgdHJlZSBmb3IgYGBzZWxmYGApLiAgYGBuYW1lYGAgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLlxuICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2VcbiAgIGFuIGBgQXR0cmlidXRlRXJyb3JgYCBleGNlcHRpb24uXG5cbiAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlIG5vcm1hbCBtZWNoYW5pc20sXG4gICBgYF9fZ2V0YXR0cl9fKClgYCBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgYXN5bW1ldHJ5XG4gICBiZXR3ZWVuIGBgX19nZXRhdHRyX18oKWBgIGFuZCBgYF9fc2V0YXR0cl9fKClgYC4pIFRoaXMgaXMgZG9uZSBib3RoXG4gICBmb3IgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSBgYF9fZ2V0YXR0cl9fKClgYFxuICAgd291bGQgaGF2ZSBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgTm90ZVxuICAgdGhhdCBhdCBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UgdG90YWwgY29udHJvbCBieVxuICAgbm90IGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoYnV0XG4gICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGVcbiAgIGBgX19nZXRhdHRyaWJ1dGVfXygpYGAgbWV0aG9kIGJlbG93IGZvciBhIHdheSB0byBhY3R1YWxseSBnZXQgdG90YWxcbiAgIGNvbnRyb2wgaW4gbmV3LXN0eWxlIGNsYXNzZXMuXG5cbm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlcblxuICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgVGhpcyBpcyBjYWxsZWRcbiAgIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBtZWNoYW5pc20gKGkuZS4gc3RvcmUgdGhlIHZhbHVlIGluIHRoZVxuICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAqdmFsdWUqIGlzIHRoZVxuICAgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gaXQuXG5cbiAgIElmIGBgX19zZXRhdHRyX18oKWBgIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGl0XG4gICBzaG91bGQgbm90IHNpbXBseSBleGVjdXRlIGBgc2VsZi5uYW1lID0gdmFsdWVgYCAtLS0gdGhpcyB3b3VsZFxuICAgY2F1c2UgYSByZWN1cnNpdmUgY2FsbCB0byBpdHNlbGYuICBJbnN0ZWFkLCBpdCBzaG91bGQgaW5zZXJ0IHRoZVxuICAgdmFsdWUgaW4gdGhlIGRpY3Rpb25hcnkgb2YgaW5zdGFuY2UgYXR0cmlidXRlcywgZS5nLixcbiAgIGBgc2VsZi5fX2RpY3RfX1tuYW1lXSA9IHZhbHVlYGAuICBGb3IgbmV3LXN0eWxlIGNsYXNzZXMsIHJhdGhlclxuICAgdGhhbiBhY2Nlc3NpbmcgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnksIGl0IHNob3VsZCBjYWxsIHRoZSBiYXNlXG4gICBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgZXhhbXBsZSxcbiAgIGBgb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKWBgLlxuXG5vYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgTGlrZSBgYF9fc2V0YXR0cl9fKClgYCBidXQgZm9yIGF0dHJpYnV0ZSBkZWxldGlvbiBpbnN0ZWFkIG9mXG4gICBhc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiBgYGRlbCBvYmoubmFtZWBgIGlzXG4gICBtZWFuaW5nZnVsIGZvciB0aGUgb2JqZWN0LlxuXG5cbk1vcmUgYXR0cmlidXRlIGFjY2VzcyBmb3IgbmV3LXN0eWxlIGNsYXNzZXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgdG8gbmV3LXN0eWxlIGNsYXNzZXMuXG5cbm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB1bmNvbmRpdGlvbmFsbHkgdG8gaW1wbGVtZW50IGF0dHJpYnV0ZSBhY2Nlc3NlcyBmb3JcbiAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXNcbiAgIGBgX19nZXRhdHRyX18oKWBgLCB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3NcbiAgIGBgX19nZXRhdHRyaWJ1dGVfXygpYGAgZWl0aGVyIGNhbGxzIGl0IGV4cGxpY2l0bHkgb3IgcmFpc2VzIGFuXG4gICBgYEF0dHJpYnV0ZUVycm9yYGAuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZClcbiAgIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbiBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLiBJbiBvcmRlclxuICAgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIGluIHRoaXMgbWV0aG9kLCBpdHMgaW1wbGVtZW50YXRpb25cbiAgIHNob3VsZCBhbHdheXMgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvXG4gICBhY2Nlc3MgYW55IGF0dHJpYnV0ZXMgaXQgbmVlZHMsIGZvciBleGFtcGxlLFxuICAgYGBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKWBgLlxuXG4gICBOb3RlOiBUaGlzIG1ldGhvZCBtYXkgc3RpbGwgYmUgYnlwYXNzZWQgd2hlbiBsb29raW5nIHVwIHNwZWNpYWwgbWV0aG9kc1xuICAgICBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhIGxhbmd1YWdlIHN5bnRheCBvclxuICAgICBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSAqU3BlY2lhbCBtZXRob2QgbG9va3VwIGZvciBuZXctc3R5bGVcbiAgICAgY2xhc3NlcyouXG5cblxuSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3NcbmNvbnRhaW5pbmcgdGhlIG1ldGhvZCAoYSBzby1jYWxsZWQgKmRlc2NyaXB0b3IqIGNsYXNzKSBhcHBlYXJzIGluIGFuXG4qb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgb3duZXJcJ3MgY2xhc3NcbmRpY3Rpb25hcnkgb3IgaW4gdGhlIGNsYXNzIGRpY3Rpb25hcnkgZm9yIG9uZSBvZiBpdHMgcGFyZW50cykuICBJbiB0aGVcbmV4YW1wbGVzIGJlbG93LCAidGhlIGF0dHJpYnV0ZSIgcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpc1xudGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyIGNsYXNzXCcgYGBfX2RpY3RfX2BgLlxuXG5vYmplY3QuX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXIpXG5cbiAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzIGF0dHJpYnV0ZVxuICAgYWNjZXNzKSBvciBvZiBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIChpbnN0YW5jZSBhdHRyaWJ1dGVcbiAgIGFjY2VzcykuICpvd25lciogaXMgYWx3YXlzIHRoZSBvd25lciBjbGFzcywgd2hpbGUgKmluc3RhbmNlKiBpcyB0aGVcbiAgIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwgb3IgYGBOb25lYGAgd2hlblxuICAgdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLiAgVGhpcyBtZXRob2Qgc2hvdWxkXG4gICByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuXG4gICBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLlxuXG5vYmplY3QuX19zZXRfXyhzZWxmLCBpbnN0YW5jZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZSBvd25lclxuICAgY2xhc3MgdG8gYSBuZXcgdmFsdWUsICp2YWx1ZSouXG5cbm9iamVjdC5fX2RlbGV0ZV9fKHNlbGYsIGluc3RhbmNlKVxuXG4gICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGVcbiAgIG93bmVyIGNsYXNzLlxuXG5cbkludm9raW5nIERlc2NyaXB0b3JzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5JbiBnZW5lcmFsLCBhIGRlc2NyaXB0b3IgaXMgYW4gb2JqZWN0IGF0dHJpYnV0ZSB3aXRoICJiaW5kaW5nXG5iZWhhdmlvciIsIG9uZSB3aG9zZSBhdHRyaWJ1dGUgYWNjZXNzIGhhcyBiZWVuIG92ZXJyaWRkZW4gYnkgbWV0aG9kc1xuaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9jb2w6ICBgYF9fZ2V0X18oKWBgLCBgYF9fc2V0X18oKWBgLCBhbmRcbmBgX19kZWxldGVfXygpYGAuIElmIGFueSBvZiB0aG9zZSBtZXRob2RzIGFyZSBkZWZpbmVkIGZvciBhbiBvYmplY3QsXG5pdCBpcyBzYWlkIHRvIGJlIGEgZGVzY3JpcHRvci5cblxuVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgdG8gZ2V0LCBzZXQsIG9yIGRlbGV0ZVxudGhlIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdFwncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsIGBgYS54YGAgaGFzIGFcbmxvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoIGBgYS5fX2RpY3RfX1tcJ3hcJ11gYCwgdGhlblxuYGB0eXBlKGEpLl9fZGljdF9fW1wneFwnXWBgLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgb2ZcbmBgdHlwZShhKWBgIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy5cblxuSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgb25lIG9mIHRoZVxuZGVzY3JpcHRvciBtZXRob2RzLCB0aGVuIFB5dGhvbiBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kXG5pbnZva2UgdGhlIGRlc2NyaXB0b3IgbWV0aG9kIGluc3RlYWQuICBXaGVyZSB0aGlzIG9jY3VycyBpbiB0aGVcbnByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgd2VyZSBkZWZpbmVkIGFuZFxuaG93IHRoZXkgd2VyZSBjYWxsZWQuICBOb3RlIHRoYXQgZGVzY3JpcHRvcnMgYXJlIG9ubHkgaW52b2tlZCBmb3IgbmV3XG5zdHlsZSBvYmplY3RzIG9yIGNsYXNzZXMgKG9uZXMgdGhhdCBzdWJjbGFzcyBgYG9iamVjdCgpYGAgb3JcbmBgdHlwZSgpYGApLlxuXG5UaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBpcyBhIGJpbmRpbmcsIGBgYS54YGAuXG5Ib3cgdGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gYGBhYGA6XG5cbkRpcmVjdCBDYWxsXG4gICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlIGRpcmVjdGx5XG4gICBpbnZva2VzIGEgZGVzY3JpcHRvciBtZXRob2Q6ICAgIGBgeC5fX2dldF9fKGEpYGAuXG5cbkluc3RhbmNlIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYSBuZXctc3R5bGUgb2JqZWN0IGluc3RhbmNlLCBgYGEueGBgIGlzIHRyYW5zZm9ybWVkXG4gICBpbnRvIHRoZSBjYWxsOiBgYHR5cGUoYSkuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oYSwgdHlwZShhKSlgYC5cblxuQ2xhc3MgQmluZGluZ1xuICAgSWYgYmluZGluZyB0byBhIG5ldy1zdHlsZSBjbGFzcywgYGBBLnhgYCBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZVxuICAgY2FsbDogYGBBLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKE5vbmUsIEEpYGAuXG5cblN1cGVyIEJpbmRpbmdcbiAgIElmIGBgYWBgIGlzIGFuIGluc3RhbmNlIG9mIGBgc3VwZXJgYCwgdGhlbiB0aGUgYmluZGluZyBgYHN1cGVyKEIsXG4gICBvYmopLm0oKWBgIHNlYXJjaGVzIGBgb2JqLl9fY2xhc3NfXy5fX21yb19fYGAgZm9yIHRoZSBiYXNlIGNsYXNzXG4gICBgYEFgYCBpbW1lZGlhdGVseSBwcmVjZWRpbmcgYGBCYGAgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVzY3JpcHRvclxuICAgd2l0aCB0aGUgY2FsbDogYGBBLl9fZGljdF9fW1wnbVwnXS5fX2dldF9fKG9iaiwgb2JqLl9fY2xhc3NfXylgYC5cblxuRm9yIGluc3RhbmNlIGJpbmRpbmdzLCB0aGUgcHJlY2VkZW5jZSBvZiBkZXNjcmlwdG9yIGludm9jYXRpb24gZGVwZW5kc1xub24gdGhlIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgZGVzY3JpcHRvciBjYW4gZGVmaW5lXG5hbnkgY29tYmluYXRpb24gb2YgYGBfX2dldF9fKClgYCwgYGBfX3NldF9fKClgYCBhbmQgYGBfX2RlbGV0ZV9fKClgYC5cbklmIGl0IGRvZXMgbm90IGRlZmluZSBgYF9fZ2V0X18oKWBgLCB0aGVuIGFjY2Vzc2luZyB0aGUgYXR0cmlidXRlIHdpbGxcbnJldHVybiB0aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZVxub2JqZWN0XCdzIGluc3RhbmNlIGRpY3Rpb25hcnkuICBJZiB0aGUgZGVzY3JpcHRvciBkZWZpbmVzIGBgX19zZXRfXygpYGBcbmFuZC9vciBgYF9fZGVsZXRlX18oKWBgLCBpdCBpcyBhIGRhdGEgZGVzY3JpcHRvcjsgaWYgaXQgZGVmaW5lc1xubmVpdGhlciwgaXQgaXMgYSBub24tZGF0YSBkZXNjcmlwdG9yLiAgTm9ybWFsbHksIGRhdGEgZGVzY3JpcHRvcnNcbmRlZmluZSBib3RoIGBgX19nZXRfXygpYGAgYW5kIGBgX19zZXRfXygpYGAsIHdoaWxlIG5vbi1kYXRhXG5kZXNjcmlwdG9ycyBoYXZlIGp1c3QgdGhlIGBgX19nZXRfXygpYGAgbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyB3aXRoXG5gYF9fc2V0X18oKWBgIGFuZCBgYF9fZ2V0X18oKWBgIGRlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uXG5pbiBhbiBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSW4gY29udHJhc3QsIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGNhbiBiZVxub3ZlcnJpZGRlbiBieSBpbnN0YW5jZXMuXG5cblB5dGhvbiBtZXRob2RzIChpbmNsdWRpbmcgYGBzdGF0aWNtZXRob2QoKWBgIGFuZCBgYGNsYXNzbWV0aG9kKClgYClcbmFyZSBpbXBsZW1lbnRlZCBhcyBub24tZGF0YSBkZXNjcmlwdG9ycy4gIEFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2FuXG5yZWRlZmluZSBhbmQgb3ZlcnJpZGUgbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGluZGl2aWR1YWwgaW5zdGFuY2VzIHRvXG5hY3F1aXJlIGJlaGF2aW9ycyB0aGF0IGRpZmZlciBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBjbGFzcy5cblxuVGhlIGBgcHJvcGVydHkoKWBgIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGFzIGEgZGF0YSBkZXNjcmlwdG9yLlxuQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIGEgcHJvcGVydHkuXG5cblxuX19zbG90c19fXG4tLS0tLS0tLS1cblxuQnkgZGVmYXVsdCwgaW5zdGFuY2VzIG9mIGJvdGggb2xkIGFuZCBuZXctc3R5bGUgY2xhc3NlcyBoYXZlIGFcbmRpY3Rpb25hcnkgZm9yIGF0dHJpYnV0ZSBzdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHNcbmhhdmluZyB2ZXJ5IGZldyBpbnN0YW5jZSB2YXJpYWJsZXMuICBUaGUgc3BhY2UgY29uc3VtcHRpb24gY2FuIGJlY29tZVxuYWN1dGUgd2hlbiBjcmVhdGluZyBsYXJnZSBudW1iZXJzIG9mIGluc3RhbmNlcy5cblxuVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgKl9fc2xvdHNfXyogaW4gYSBuZXctc3R5bGVcbmNsYXNzIGRlZmluaXRpb24uICBUaGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gdGFrZXMgYSBzZXF1ZW5jZSBvZlxuaW5zdGFuY2UgdmFyaWFibGVzIGFuZCByZXNlcnZlcyBqdXN0IGVub3VnaCBzcGFjZSBpbiBlYWNoIGluc3RhbmNlIHRvXG5ob2xkIGEgdmFsdWUgZm9yIGVhY2ggdmFyaWFibGUuICBTcGFjZSBpcyBzYXZlZCBiZWNhdXNlICpfX2RpY3RfXyogaXNcbm5vdCBjcmVhdGVkIGZvciBlYWNoIGluc3RhbmNlLlxuXG5fX3Nsb3RzX19cblxuICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsIGl0ZXJhYmxlLCBvciBzZXF1ZW5jZVxuICAgb2Ygc3RyaW5ncyB3aXRoIHZhcmlhYmxlIG5hbWVzIHVzZWQgYnkgaW5zdGFuY2VzLiAgSWYgZGVmaW5lZCBpbiBhXG4gICBuZXctc3R5bGUgY2xhc3MsICpfX3Nsb3RzX18qIHJlc2VydmVzIHNwYWNlIGZvciB0aGUgZGVjbGFyZWRcbiAgIHZhcmlhYmxlcyBhbmQgcHJldmVudHMgdGhlIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAqX19kaWN0X18qIGFuZFxuICAgKl9fd2Vha3JlZl9fKiBmb3IgZWFjaCBpbnN0YW5jZS5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG5Ob3RlcyBvbiB1c2luZyAqX19zbG90c19fKlxuXG4qIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICpfX2RpY3RfXypcbiAgYXR0cmlidXRlIG9mIHRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgYmUgYWNjZXNzaWJsZSwgc28gYSAqX19zbG90c19fKlxuICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy5cblxuKiBXaXRob3V0IGEgKl9fZGljdF9fKiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSBhc3NpZ25lZCBuZXdcbiAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICBBdHRlbXB0cyB0b1xuICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgYGBBdHRyaWJ1dGVFcnJvcmBgLiBJZlxuICBkeW5hbWljIGFzc2lnbm1lbnQgb2YgbmV3IHZhcmlhYmxlcyBpcyBkZXNpcmVkLCB0aGVuIGFkZFxuICBgYFwnX19kaWN0X19cJ2BgIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKlxuICBkZWNsYXJhdGlvbi5cblxuICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBhZGRpbmcgYGBcJ19fZGljdF9fXCdgYCB0byB0aGVcbiAgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gd291bGQgbm90IGVuYWJsZSB0aGUgYXNzaWdubWVudCBvZiBuZXdcbiAgYXR0cmlidXRlcyBub3Qgc3BlY2lmaWNhbGx5IGxpc3RlZCBpbiB0aGUgc2VxdWVuY2Ugb2YgaW5zdGFuY2VcbiAgdmFyaWFibGUgbmFtZXMuXG5cbiogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsIGNsYXNzZXMgZGVmaW5pbmdcbiAgKl9fc2xvdHNfXyogZG8gbm90IHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIHRvIGl0cyBpbnN0YW5jZXMuIElmIHdlYWtcbiAgcmVmZXJlbmNlIHN1cHBvcnQgaXMgbmVlZGVkLCB0aGVuIGFkZCBgYFwnX193ZWFrcmVmX19cJ2BgIHRvIHRoZVxuICBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKiBkZWNsYXJhdGlvbi5cblxuICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBhZGRpbmcgYGBcJ19fd2Vha3JlZl9fXCdgYCB0byB0aGVcbiAgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gd291bGQgbm90IGVuYWJsZSBzdXBwb3J0IGZvciB3ZWFrXG4gIHJlZmVyZW5jZXMuXG5cbiogKl9fc2xvdHNfXyogYXJlIGltcGxlbWVudGVkIGF0IHRoZSBjbGFzcyBsZXZlbCBieSBjcmVhdGluZ1xuICBkZXNjcmlwdG9ycyAoKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycyopIGZvciBlYWNoIHZhcmlhYmxlIG5hbWUuICBBc1xuICBhIHJlc3VsdCwgY2xhc3MgYXR0cmlidXRlcyBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yXG4gIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkIGJ5ICpfX3Nsb3RzX18qOyBvdGhlcndpc2UsIHRoZSBjbGFzc1xuICBhdHRyaWJ1dGUgd291bGQgb3ZlcndyaXRlIHRoZSBkZXNjcmlwdG9yIGFzc2lnbm1lbnQuXG5cbiogVGhlIGFjdGlvbiBvZiBhICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGNsYXNzXG4gIHdoZXJlIGl0IGlzIGRlZmluZWQuICBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyB3aWxsIGhhdmUgYSAqX19kaWN0X18qXG4gIHVubGVzcyB0aGV5IGFsc28gZGVmaW5lICpfX3Nsb3RzX18qICh3aGljaCBtdXN0IG9ubHkgY29udGFpbiBuYW1lc1xuICBvZiBhbnkgKmFkZGl0aW9uYWwqIHNsb3RzKS5cblxuKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MsIHRoZSBpbnN0YW5jZVxuICB2YXJpYWJsZSBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzIHNsb3QgaXMgaW5hY2Nlc3NpYmxlIChleGNlcHQgYnlcbiAgcmV0cmlldmluZyBpdHMgZGVzY3JpcHRvciBkaXJlY3RseSBmcm9tIHRoZSBiYXNlIGNsYXNzKS4gVGhpc1xuICByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluIHRoZSBmdXR1cmUsIGFcbiAgY2hlY2sgbWF5IGJlIGFkZGVkIHRvIHByZXZlbnQgdGhpcy5cblxuKiBOb25lbXB0eSAqX19zbG90c19fKiBkb2VzIG5vdCB3b3JrIGZvciBjbGFzc2VzIGRlcml2ZWQgZnJvbVxuICAidmFyaWFibGUtbGVuZ3RoIiBidWlsdC1pbiB0eXBlcyBzdWNoIGFzIGBgbG9uZ2BgLCBgYHN0cmBgIGFuZFxuICBgYHR1cGxlYGAuXG5cbiogQW55IG5vbi1zdHJpbmcgaXRlcmFibGUgbWF5IGJlIGFzc2lnbmVkIHRvICpfX3Nsb3RzX18qLiBNYXBwaW5ncyBtYXlcbiAgYWxzbyBiZSB1c2VkOyBob3dldmVyLCBpbiB0aGUgZnV0dXJlLCBzcGVjaWFsIG1lYW5pbmcgbWF5IGJlXG4gIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtleS5cblxuKiAqX19jbGFzc19fKiBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgdGhlIHNhbWVcbiAgKl9fc2xvdHNfXyouXG5cbiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNjogUHJldmlvdXNseSwgKl9fY2xhc3NfXyogYXNzaWdubWVudCByYWlzZWQgYW5cbiAgZXJyb3IgaWYgZWl0aGVyIG5ldyBvciBvbGQgY2xhc3MgaGFkICpfX3Nsb3RzX18qLlxuXG5cbkN1c3RvbWl6aW5nIGNsYXNzIGNyZWF0aW9uXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5CeSBkZWZhdWx0LCBuZXctc3R5bGUgY2xhc3NlcyBhcmUgY29uc3RydWN0ZWQgdXNpbmcgYGB0eXBlKClgYC4gQVxuY2xhc3MgZGVmaW5pdGlvbiBpcyByZWFkIGludG8gYSBzZXBhcmF0ZSBuYW1lc3BhY2UgYW5kIHRoZSB2YWx1ZSBvZlxuY2xhc3MgbmFtZSBpcyBib3VuZCB0byB0aGUgcmVzdWx0IG9mIGBgdHlwZShuYW1lLCBiYXNlcywgZGljdClgYC5cblxuV2hlbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpcyByZWFkLCBpZiAqX19tZXRhY2xhc3NfXyogaXMgZGVmaW5lZCB0aGVuXG50aGUgY2FsbGFibGUgYXNzaWduZWQgdG8gaXQgd2lsbCBiZSBjYWxsZWQgaW5zdGVhZCBvZiBgYHR5cGUoKWBgLiBUaGlzXG5hbGxvd3MgY2xhc3NlcyBvciBmdW5jdGlvbnMgdG8gYmUgd3JpdHRlbiB3aGljaCBtb25pdG9yIG9yIGFsdGVyIHRoZVxuY2xhc3MgY3JlYXRpb24gcHJvY2VzczpcblxuKiBNb2RpZnlpbmcgdGhlIGNsYXNzIGRpY3Rpb25hcnkgcHJpb3IgdG8gdGhlIGNsYXNzIGJlaW5nIGNyZWF0ZWQuXG5cbiogUmV0dXJuaW5nIGFuIGluc3RhbmNlIG9mIGFub3RoZXIgY2xhc3MgLS0gZXNzZW50aWFsbHkgcGVyZm9ybWluZyB0aGVcbiAgcm9sZSBvZiBhIGZhY3RvcnkgZnVuY3Rpb24uXG5cblRoZXNlIHN0ZXBzIHdpbGwgaGF2ZSB0byBiZSBwZXJmb3JtZWQgaW4gdGhlIG1ldGFjbGFzc1wncyBgYF9fbmV3X18oKWBgXG5tZXRob2QgLS0gYGB0eXBlLl9fbmV3X18oKWBgIGNhbiB0aGVuIGJlIGNhbGxlZCBmcm9tIHRoaXMgbWV0aG9kIHRvXG5jcmVhdGUgYSBjbGFzcyB3aXRoIGRpZmZlcmVudCBwcm9wZXJ0aWVzLiAgVGhpcyBleGFtcGxlIGFkZHMgYSBuZXdcbmVsZW1lbnQgdG8gdGhlIGNsYXNzIGRpY3Rpb25hcnkgYmVmb3JlIGNyZWF0aW5nIHRoZSBjbGFzczpcblxuICAgY2xhc3MgbWV0YWNscyh0eXBlKTpcbiAgICAgICBkZWYgX19uZXdfXyhtY3MsIG5hbWUsIGJhc2VzLCBkaWN0KTpcbiAgICAgICAgICAgZGljdFtcJ2Zvb1wnXSA9IFwnbWV0YWNscyB3YXMgaGVyZVwnXG4gICAgICAgICAgIHJldHVybiB0eXBlLl9fbmV3X18obWNzLCBuYW1lLCBiYXNlcywgZGljdClcblxuWW91IGNhbiBvZiBjb3Vyc2UgYWxzbyBvdmVycmlkZSBvdGhlciBjbGFzcyBtZXRob2RzIChvciBhZGQgbmV3XG5tZXRob2RzKTsgZm9yIGV4YW1wbGUgZGVmaW5pbmcgYSBjdXN0b20gYGBfX2NhbGxfXygpYGAgbWV0aG9kIGluIHRoZVxubWV0YWNsYXNzIGFsbG93cyBjdXN0b20gYmVoYXZpb3Igd2hlbiB0aGUgY2xhc3MgaXMgY2FsbGVkLCBlLmcuIG5vdFxuYWx3YXlzIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlLlxuXG5fX21ldGFjbGFzc19fXG5cbiAgIFRoaXMgdmFyaWFibGUgY2FuIGJlIGFueSBjYWxsYWJsZSBhY2NlcHRpbmcgYXJndW1lbnRzIGZvciBgYG5hbWVgYCxcbiAgIGBgYmFzZXNgYCwgYW5kIGBgZGljdGBgLiAgVXBvbiBjbGFzcyBjcmVhdGlvbiwgdGhlIGNhbGxhYmxlIGlzIHVzZWRcbiAgIGluc3RlYWQgb2YgdGhlIGJ1aWx0LWluIGBgdHlwZSgpYGAuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuMi5cblxuVGhlIGFwcHJvcHJpYXRlIG1ldGFjbGFzcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmb2xsb3dpbmcgcHJlY2VkZW5jZVxucnVsZXM6XG5cbiogSWYgYGBkaWN0W1wnX19tZXRhY2xhc3NfX1wnXWBgIGV4aXN0cywgaXQgaXMgdXNlZC5cblxuKiBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBiYXNlIGNsYXNzLCBpdHMgbWV0YWNsYXNzIGlzXG4gIHVzZWQgKHRoaXMgbG9va3MgZm9yIGEgKl9fY2xhc3NfXyogYXR0cmlidXRlIGZpcnN0IGFuZCBpZiBub3QgZm91bmQsXG4gIHVzZXMgaXRzIHR5cGUpLlxuXG4qIE90aGVyd2lzZSwgaWYgYSBnbG9iYWwgdmFyaWFibGUgbmFtZWQgX19tZXRhY2xhc3NfXyBleGlzdHMsIGl0IGlzXG4gIHVzZWQuXG5cbiogT3RoZXJ3aXNlLCB0aGUgb2xkLXN0eWxlLCBjbGFzc2ljIG1ldGFjbGFzcyAodHlwZXMuQ2xhc3NUeXBlKSBpc1xuICB1c2VkLlxuXG5UaGUgcG90ZW50aWFsIHVzZXMgZm9yIG1ldGFjbGFzc2VzIGFyZSBib3VuZGxlc3MuIFNvbWUgaWRlYXMgdGhhdCBoYXZlXG5iZWVuIGV4cGxvcmVkIGluY2x1ZGluZyBsb2dnaW5nLCBpbnRlcmZhY2UgY2hlY2tpbmcsIGF1dG9tYXRpY1xuZGVsZWdhdGlvbiwgYXV0b21hdGljIHByb3BlcnR5IGNyZWF0aW9uLCBwcm94aWVzLCBmcmFtZXdvcmtzLCBhbmRcbmF1dG9tYXRpYyByZXNvdXJjZSBsb2NraW5nL3N5bmNocm9uaXphdGlvbi5cblxuXG5DdXN0b21pemluZyBpbnN0YW5jZSBhbmQgc3ViY2xhc3MgY2hlY2tzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbk5ldyBpbiB2ZXJzaW9uIDIuNi5cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoZVxuYGBpc2luc3RhbmNlKClgYCBhbmQgYGBpc3N1YmNsYXNzKClgYCBidWlsdC1pbiBmdW5jdGlvbnMuXG5cbkluIHBhcnRpY3VsYXIsIHRoZSBtZXRhY2xhc3MgYGBhYmMuQUJDTWV0YWBgIGltcGxlbWVudHMgdGhlc2UgbWV0aG9kc1xuaW4gb3JkZXIgdG8gYWxsb3cgdGhlIGFkZGl0aW9uIG9mIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoQUJDcykgYXNcbiJ2aXJ0dWFsIGJhc2UgY2xhc3NlcyIgdG8gYW55IGNsYXNzIG9yIHR5cGUgKGluY2x1ZGluZyBidWlsdC1pblxudHlwZXMpLCBpbmNsdWRpbmcgb3RoZXIgQUJDcy5cblxuY2xhc3MuX19pbnN0YW5jZWNoZWNrX18oc2VsZiwgaW5zdGFuY2UpXG5cbiAgIFJldHVybiB0cnVlIGlmICppbnN0YW5jZSogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAoZGlyZWN0IG9yXG4gICBpbmRpcmVjdCkgaW5zdGFuY2Ugb2YgKmNsYXNzKi4gSWYgZGVmaW5lZCwgY2FsbGVkIHRvIGltcGxlbWVudFxuICAgYGBpc2luc3RhbmNlKGluc3RhbmNlLCBjbGFzcylgYC5cblxuY2xhc3MuX19zdWJjbGFzc2NoZWNrX18oc2VsZiwgc3ViY2xhc3MpXG5cbiAgIFJldHVybiB0cnVlIGlmICpzdWJjbGFzcyogc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSAoZGlyZWN0IG9yXG4gICBpbmRpcmVjdCkgc3ViY2xhc3Mgb2YgKmNsYXNzKi4gIElmIGRlZmluZWQsIGNhbGxlZCB0byBpbXBsZW1lbnRcbiAgIGBgaXNzdWJjbGFzcyhzdWJjbGFzcywgY2xhc3MpYGAuXG5cbk5vdGUgdGhhdCB0aGVzZSBtZXRob2RzIGFyZSBsb29rZWQgdXAgb24gdGhlIHR5cGUgKG1ldGFjbGFzcykgb2YgYVxuY2xhc3MuICBUaGV5IGNhbm5vdCBiZSBkZWZpbmVkIGFzIGNsYXNzIG1ldGhvZHMgaW4gdGhlIGFjdHVhbCBjbGFzcy5cblRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBsb29rdXAgb2Ygc3BlY2lhbCBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZFxub24gaW5zdGFuY2VzLCBvbmx5IGluIHRoaXMgY2FzZSB0aGUgaW5zdGFuY2UgaXMgaXRzZWxmIGEgY2xhc3MuXG5cblNlZSBhbHNvOlxuXG4gICAqKlBFUCAzMTE5KiogLSBJbnRyb2R1Y2luZyBBYnN0cmFjdCBCYXNlIENsYXNzZXNcbiAgICAgIEluY2x1ZGVzIHRoZSBzcGVjaWZpY2F0aW9uIGZvciBjdXN0b21pemluZyBgYGlzaW5zdGFuY2UoKWBgIGFuZFxuICAgICAgYGBpc3N1YmNsYXNzKClgYCBiZWhhdmlvciB0aHJvdWdoIGBgX19pbnN0YW5jZWNoZWNrX18oKWBgIGFuZFxuICAgICAgYGBfX3N1YmNsYXNzY2hlY2tfXygpYGAsIHdpdGggbW90aXZhdGlvbiBmb3IgdGhpcyBmdW5jdGlvbmFsaXR5XG4gICAgICBpbiB0aGUgY29udGV4dCBvZiBhZGRpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzIChzZWUgdGhlIGBgYWJjYGBcbiAgICAgIG1vZHVsZSkgdG8gdGhlIGxhbmd1YWdlLlxuXG5cbkVtdWxhdGluZyBjYWxsYWJsZSBvYmplY3RzXG49PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5vYmplY3QuX19jYWxsX18oc2VsZlssIGFyZ3MuLi5dKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgImNhbGxlZCIgYXMgYSBmdW5jdGlvbjsgaWYgdGhpcyBtZXRob2RcbiAgIGlzIGRlZmluZWQsIGBgeChhcmcxLCBhcmcyLCAuLi4pYGAgaXMgYSBzaG9ydGhhbmQgZm9yXG4gICBgYHguX19jYWxsX18oYXJnMSwgYXJnMiwgLi4uKWBgLlxuXG5cbkVtdWxhdGluZyBjb250YWluZXIgdHlwZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGltcGxlbWVudCBjb250YWluZXIgb2JqZWN0cy5cbkNvbnRhaW5lcnMgdXN1YWxseSBhcmUgc2VxdWVuY2VzIChzdWNoIGFzIGxpc3RzIG9yIHR1cGxlcykgb3IgbWFwcGluZ3NcbihsaWtlIGRpY3Rpb25hcmllcyksIGJ1dCBjYW4gcmVwcmVzZW50IG90aGVyIGNvbnRhaW5lcnMgYXMgd2VsbC4gIFRoZVxuZmlyc3Qgc2V0IG9mIG1ldGhvZHMgaXMgdXNlZCBlaXRoZXIgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIG9yIHRvXG5lbXVsYXRlIGEgbWFwcGluZzsgdGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBmb3IgYSBzZXF1ZW5jZSwgdGhlXG5hbGxvd2FibGUga2V5cyBzaG91bGQgYmUgdGhlIGludGVnZXJzICprKiBmb3Igd2hpY2ggYGAwIDw9IGsgPCBOYGBcbndoZXJlICpOKiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSwgb3Igc2xpY2Ugb2JqZWN0cywgd2hpY2hcbmRlZmluZSBhIHJhbmdlIG9mIGl0ZW1zLiAoRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCB0aGUgbWV0aG9kXG5gYF9fZ2V0c2xpY2VfXygpYGAgKHNlZSBiZWxvdykgY2FuIGFsc28gYmUgZGVmaW5lZCB0byBoYW5kbGUgc2ltcGxlLFxuYnV0IG5vdCBleHRlbmRlZCBzbGljZXMuKSBJdCBpcyBhbHNvIHJlY29tbWVuZGVkIHRoYXQgbWFwcGluZ3MgcHJvdmlkZVxudGhlIG1ldGhvZHMgYGBrZXlzKClgYCwgYGB2YWx1ZXMoKWBgLCBgYGl0ZW1zKClgYCwgYGBoYXNfa2V5KClgYCxcbmBgZ2V0KClgYCwgYGBjbGVhcigpYGAsIGBgc2V0ZGVmYXVsdCgpYGAsIGBgaXRlcmtleXMoKWBgLFxuYGBpdGVydmFsdWVzKClgYCwgYGBpdGVyaXRlbXMoKWBgLCBgYHBvcCgpYGAsIGBgcG9waXRlbSgpYGAsXG5gYGNvcHkoKWBgLCBhbmQgYGB1cGRhdGUoKWBgIGJlaGF2aW5nIHNpbWlsYXIgdG8gdGhvc2UgZm9yIFB5dGhvblwnc1xuc3RhbmRhcmQgZGljdGlvbmFyeSBvYmplY3RzLiAgVGhlIGBgVXNlckRpY3RgYCBtb2R1bGUgcHJvdmlkZXMgYVxuYGBEaWN0TWl4aW5gYCBjbGFzcyB0byBoZWxwIGNyZWF0ZSB0aG9zZSBtZXRob2RzIGZyb20gYSBiYXNlIHNldCBvZlxuYGBfX2dldGl0ZW1fXygpYGAsIGBgX19zZXRpdGVtX18oKWBgLCBgYF9fZGVsaXRlbV9fKClgYCwgYW5kXG5gYGtleXMoKWBgLiBNdXRhYmxlIHNlcXVlbmNlcyBzaG91bGQgcHJvdmlkZSBtZXRob2RzIGBgYXBwZW5kKClgYCxcbmBgY291bnQoKWBgLCBgYGluZGV4KClgYCwgYGBleHRlbmQoKWBgLCBgYGluc2VydCgpYGAsIGBgcG9wKClgYCxcbmBgcmVtb3ZlKClgYCwgYGByZXZlcnNlKClgYCBhbmQgYGBzb3J0KClgYCwgbGlrZSBQeXRob24gc3RhbmRhcmQgbGlzdFxub2JqZWN0cy4gIEZpbmFsbHksIHNlcXVlbmNlIHR5cGVzIHNob3VsZCBpbXBsZW1lbnQgYWRkaXRpb24gKG1lYW5pbmdcbmNvbmNhdGVuYXRpb24pIGFuZCBtdWx0aXBsaWNhdGlvbiAobWVhbmluZyByZXBldGl0aW9uKSBieSBkZWZpbmluZyB0aGVcbm1ldGhvZHMgYGBfX2FkZF9fKClgYCwgYGBfX3JhZGRfXygpYGAsIGBgX19pYWRkX18oKWBgLCBgYF9fbXVsX18oKWBgLFxuYGBfX3JtdWxfXygpYGAgYW5kIGBgX19pbXVsX18oKWBgIGRlc2NyaWJlZCBiZWxvdzsgdGhleSBzaG91bGQgbm90XG5kZWZpbmUgYGBfX2NvZXJjZV9fKClgYCBvciBvdGhlciBudW1lcmljYWwgb3BlcmF0b3JzLiAgSXQgaXNcbnJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGVcbmBgX19jb250YWluc19fKClgYCBtZXRob2QgdG8gYWxsb3cgZWZmaWNpZW50IHVzZSBvZiB0aGUgYGBpbmBgXG5vcGVyYXRvcjsgZm9yIG1hcHBpbmdzLCBgYGluYGAgc2hvdWxkIGJlIGVxdWl2YWxlbnQgb2YgYGBoYXNfa2V5KClgYDtcbmZvciBzZXF1ZW5jZXMsIGl0IHNob3VsZCBzZWFyY2ggdGhyb3VnaCB0aGUgdmFsdWVzLiAgSXQgaXMgZnVydGhlclxucmVjb21tZW5kZWQgdGhhdCBib3RoIG1hcHBpbmdzIGFuZCBzZXF1ZW5jZXMgaW1wbGVtZW50IHRoZVxuYGBfX2l0ZXJfXygpYGAgbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCBpdGVyYXRpb24gdGhyb3VnaCB0aGVcbmNvbnRhaW5lcjsgZm9yIG1hcHBpbmdzLCBgYF9faXRlcl9fKClgYCBzaG91bGQgYmUgdGhlIHNhbWUgYXNcbmBgaXRlcmtleXMoKWBgOyBmb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgaXRlcmF0ZSB0aHJvdWdoIHRoZSB2YWx1ZXMuXG5cbm9iamVjdC5fX2xlbl9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgbGVuKClgYC4gIFNob3VsZCByZXR1cm5cbiAgIHRoZSBsZW5ndGggb2YgdGhlIG9iamVjdCwgYW4gaW50ZWdlciBgYD49YGAgMC4gIEFsc28sIGFuIG9iamVjdFxuICAgdGhhdCBkb2VzblwndCBkZWZpbmUgYSBgYF9fbm9uemVyb19fKClgYCBtZXRob2QgYW5kIHdob3NlXG4gICBgYF9fbGVuX18oKWBgIG1ldGhvZCByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhXG4gICBCb29sZWFuIGNvbnRleHQuXG5cbm9iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiBgYHNlbGZba2V5XWBgLiBGb3Igc2VxdWVuY2VcbiAgIHR5cGVzLCB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlIG9iamVjdHMuXG4gICBOb3RlIHRoYXQgdGhlIHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2YgbmVnYXRpdmUgaW5kZXhlcyAoaWYgdGhlXG4gICBjbGFzcyB3aXNoZXMgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIHR5cGUpIGlzIHVwIHRvIHRoZVxuICAgYGBfX2dldGl0ZW1fXygpYGAgbWV0aG9kLiBJZiAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsXG4gICBgYFR5cGVFcnJvcmBgIG1heSBiZSByYWlzZWQ7IGlmIG9mIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2V0IG9mXG4gICBpbmRleGVzIGZvciB0aGUgc2VxdWVuY2UgKGFmdGVyIGFueSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mXG4gICBuZWdhdGl2ZSB2YWx1ZXMpLCBgYEluZGV4RXJyb3JgYCBzaG91bGQgYmUgcmFpc2VkLiBGb3IgbWFwcGluZ1xuICAgdHlwZXMsIGlmICprZXkqIGlzIG1pc3NpbmcgKG5vdCBpbiB0aGUgY29udGFpbmVyKSwgYGBLZXlFcnJvcmBgXG4gICBzaG91bGQgYmUgcmFpc2VkLlxuXG4gICBOb3RlOiBgYGZvcmBgIGxvb3BzIGV4cGVjdCB0aGF0IGFuIGBgSW5kZXhFcnJvcmBgIHdpbGwgYmUgcmFpc2VkIGZvclxuICAgICBpbGxlZ2FsIGluZGV4ZXMgdG8gYWxsb3cgcHJvcGVyIGRldGVjdGlvbiBvZiB0aGUgZW5kIG9mIHRoZVxuICAgICBzZXF1ZW5jZS5cblxub2JqZWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byBgYHNlbGZba2V5XWBgLiAgU2FtZSBub3RlIGFzIGZvclxuICAgYGBfX2dldGl0ZW1fXygpYGAuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yIGlmIG5ldyBrZXlzXG4gICBjYW4gYmUgYWRkZWQsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMgY2FuIGJlIHJlcGxhY2VkLiAgVGhlXG4gICBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvclxuICAgdGhlIGBgX19nZXRpdGVtX18oKWBgIG1ldGhvZC5cblxub2JqZWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiBgYHNlbGZba2V5XWBgLiAgU2FtZSBub3RlIGFzIGZvclxuICAgYGBfX2dldGl0ZW1fXygpYGAuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHNcbiAgIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNlcXVlbmNlLiAgVGhlIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmVcbiAgIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvciB0aGUgYGBfX2dldGl0ZW1fXygpYGBcbiAgIG1ldGhvZC5cblxub2JqZWN0Ll9faXRlcl9fKHNlbGYpXG5cbiAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGl0ZXJhdG9yIGlzIHJlcXVpcmVkIGZvciBhIGNvbnRhaW5lci5cbiAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXQgY2FuIGl0ZXJhdGVcbiAgIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0IHNob3VsZFxuICAgaXRlcmF0ZSBvdmVyIHRoZSBrZXlzIG9mIHRoZSBjb250YWluZXIsIGFuZCBzaG91bGQgYWxzbyBiZSBtYWRlXG4gICBhdmFpbGFibGUgYXMgdGhlIG1ldGhvZCBgYGl0ZXJrZXlzKClgYC5cblxuICAgSXRlcmF0b3Igb2JqZWN0cyBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kOyB0aGV5IGFyZVxuICAgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZW1zZWx2ZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBpdGVyYXRvclxuICAgb2JqZWN0cywgc2VlICpJdGVyYXRvciBUeXBlcyouXG5cbm9iamVjdC5fX3JldmVyc2VkX18oc2VsZilcblxuICAgQ2FsbGVkIChpZiBwcmVzZW50KSBieSB0aGUgYGByZXZlcnNlZCgpYGAgYnVpbHQtaW4gdG8gaW1wbGVtZW50XG4gICByZXZlcnNlIGl0ZXJhdGlvbi4gIEl0IHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXRcbiAgIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIgaW4gcmV2ZXJzZSBvcmRlci5cblxuICAgSWYgdGhlIGBgX19yZXZlcnNlZF9fKClgYCBtZXRob2QgaXMgbm90IHByb3ZpZGVkLCB0aGVcbiAgIGBgcmV2ZXJzZWQoKWBgIGJ1aWx0LWluIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBzZXF1ZW5jZVxuICAgcHJvdG9jb2wgKGBgX19sZW5fXygpYGAgYW5kIGBgX19nZXRpdGVtX18oKWBgKS4gIE9iamVjdHMgdGhhdFxuICAgc3VwcG9ydCB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgc2hvdWxkIG9ubHkgcHJvdmlkZVxuICAgYGBfX3JldmVyc2VkX18oKWBgIGlmIHRoZXkgY2FuIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBpc1xuICAgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb25lIHByb3ZpZGVkIGJ5IGBgcmV2ZXJzZWQoKWBgLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjYuXG5cblRoZSBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzIChgYGluYGAgYW5kIGBgbm90IGluYGApIGFyZSBub3JtYWxseVxuaW1wbGVtZW50ZWQgYXMgYW4gaXRlcmF0aW9uIHRocm91Z2ggYSBzZXF1ZW5jZS4gIEhvd2V2ZXIsIGNvbnRhaW5lclxub2JqZWN0cyBjYW4gc3VwcGx5IHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBtZXRob2Qgd2l0aCBhIG1vcmUgZWZmaWNpZW50XG5pbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxzbyBkb2VzIG5vdCByZXF1aXJlIHRoZSBvYmplY3QgYmUgYSBzZXF1ZW5jZS5cblxub2JqZWN0Ll9fY29udGFpbnNfXyhzZWxmLCBpdGVtKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMuICBTaG91bGQgcmV0dXJuIHRydWVcbiAgIGlmICppdGVtKiBpcyBpbiAqc2VsZiosIGZhbHNlIG90aGVyd2lzZS4gIEZvciBtYXBwaW5nIG9iamVjdHMsIHRoaXNcbiAgIHNob3VsZCBjb25zaWRlciB0aGUga2V5cyBvZiB0aGUgbWFwcGluZyByYXRoZXIgdGhhbiB0aGUgdmFsdWVzIG9yXG4gICB0aGUga2V5LWl0ZW0gcGFpcnMuXG5cbiAgIEZvciBvYmplY3RzIHRoYXQgZG9uXCd0IGRlZmluZSBgYF9fY29udGFpbnNfXygpYGAsIHRoZSBtZW1iZXJzaGlwXG4gICB0ZXN0IGZpcnN0IHRyaWVzIGl0ZXJhdGlvbiB2aWEgYGBfX2l0ZXJfXygpYGAsIHRoZW4gdGhlIG9sZFxuICAgc2VxdWVuY2UgaXRlcmF0aW9uIHByb3RvY29sIHZpYSBgYF9fZ2V0aXRlbV9fKClgYCwgc2VlICp0aGlzXG4gICBzZWN0aW9uIGluIHRoZSBsYW5ndWFnZSByZWZlcmVuY2UqLlxuXG5cbkFkZGl0aW9uYWwgbWV0aG9kcyBmb3IgZW11bGF0aW9uIG9mIHNlcXVlbmNlIHR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG9wdGlvbmFsIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZnVydGhlciBlbXVsYXRlXG5zZXF1ZW5jZSBvYmplY3RzLiAgSW1tdXRhYmxlIHNlcXVlbmNlcyBtZXRob2RzIHNob3VsZCBhdCBtb3N0IG9ubHlcbmRlZmluZSBgYF9fZ2V0c2xpY2VfXygpYGA7IG11dGFibGUgc2VxdWVuY2VzIG1pZ2h0IGRlZmluZSBhbGwgdGhyZWVcbm1ldGhvZHMuXG5cbm9iamVjdC5fX2dldHNsaWNlX18oc2VsZiwgaSwgailcblxuICAgRGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDIuMDogU3VwcG9ydCBzbGljZSBvYmplY3RzIGFzIHBhcmFtZXRlcnNcbiAgIHRvIHRoZSBgYF9fZ2V0aXRlbV9fKClgYCBtZXRob2QuIChIb3dldmVyLCBidWlsdC1pbiB0eXBlcyBpblxuICAgQ1B5dGhvbiBjdXJyZW50bHkgc3RpbGwgaW1wbGVtZW50IGBgX19nZXRzbGljZV9fKClgYC4gIFRoZXJlZm9yZSxcbiAgIHlvdSBoYXZlIHRvIG92ZXJyaWRlIGl0IGluIGRlcml2ZWQgY2xhc3NlcyB3aGVuIGltcGxlbWVudGluZ1xuICAgc2xpY2luZy4pXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiBgYHNlbGZbaTpqXWBgLiBUaGUgcmV0dXJuZWRcbiAgIG9iamVjdCBzaG91bGQgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyAqc2VsZiouICBOb3RlIHRoYXQgbWlzc2luZyAqaSpcbiAgIG9yICpqKiBpbiB0aGUgc2xpY2UgZXhwcmVzc2lvbiBhcmUgcmVwbGFjZWQgYnkgemVybyBvclxuICAgYGBzeXMubWF4aW50YGAsIHJlc3BlY3RpdmVseS4gIElmIG5lZ2F0aXZlIGluZGV4ZXMgYXJlIHVzZWQgaW4gdGhlXG4gICBzbGljZSwgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgaXMgYWRkZWQgdG8gdGhhdCBpbmRleC4gSWYgdGhlXG4gICBpbnN0YW5jZSBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGBgX19sZW5fXygpYGAgbWV0aG9kLCBhblxuICAgYGBBdHRyaWJ1dGVFcnJvcmBgIGlzIHJhaXNlZC4gTm8gZ3VhcmFudGVlIGlzIG1hZGUgdGhhdCBpbmRleGVzXG4gICBhZGp1c3RlZCB0aGlzIHdheSBhcmUgbm90IHN0aWxsIG5lZ2F0aXZlLiAgSW5kZXhlcyB3aGljaCBhcmVcbiAgIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZSBhcmUgbm90IG1vZGlmaWVkLiBJZiBub1xuICAgYGBfX2dldHNsaWNlX18oKWBgIGlzIGZvdW5kLCBhIHNsaWNlIG9iamVjdCBpcyBjcmVhdGVkIGluc3RlYWQsIGFuZFxuICAgcGFzc2VkIHRvIGBgX19nZXRpdGVtX18oKWBgIGluc3RlYWQuXG5cbm9iamVjdC5fX3NldHNsaWNlX18oc2VsZiwgaSwgaiwgc2VxdWVuY2UpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byBgYHNlbGZbaTpqXWBgLiBTYW1lIG5vdGVzIGZvciAqaSpcbiAgIGFuZCAqaiogYXMgZm9yIGBgX19nZXRzbGljZV9fKClgYC5cblxuICAgVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gSWYgbm8gYGBfX3NldHNsaWNlX18oKWBgIGlzIGZvdW5kLCBvclxuICAgZm9yIGV4dGVuZGVkIHNsaWNpbmcgb2YgdGhlIGZvcm0gYGBzZWxmW2k6ajprXWBgLCBhIHNsaWNlIG9iamVjdCBpc1xuICAgY3JlYXRlZCwgYW5kIHBhc3NlZCB0byBgYF9fc2V0aXRlbV9fKClgYCwgaW5zdGVhZCBvZlxuICAgYGBfX3NldHNsaWNlX18oKWBgIGJlaW5nIGNhbGxlZC5cblxub2JqZWN0Ll9fZGVsc2xpY2VfXyhzZWxmLCBpLCBqKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGRlbGV0aW9uIG9mIGBgc2VsZltpOmpdYGAuIFNhbWUgbm90ZXMgZm9yICppKlxuICAgYW5kICpqKiBhcyBmb3IgYGBfX2dldHNsaWNlX18oKWBgLiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBJZiBub1xuICAgYGBfX2RlbHNsaWNlX18oKWBgIGlzIGZvdW5kLCBvciBmb3IgZXh0ZW5kZWQgc2xpY2luZyBvZiB0aGUgZm9ybVxuICAgYGBzZWxmW2k6ajprXWBgLCBhIHNsaWNlIG9iamVjdCBpcyBjcmVhdGVkLCBhbmQgcGFzc2VkIHRvXG4gICBgYF9fZGVsaXRlbV9fKClgYCwgaW5zdGVhZCBvZiBgYF9fZGVsc2xpY2VfXygpYGAgYmVpbmcgY2FsbGVkLlxuXG5Ob3RpY2UgdGhhdCB0aGVzZSBtZXRob2RzIGFyZSBvbmx5IGludm9rZWQgd2hlbiBhIHNpbmdsZSBzbGljZSB3aXRoIGFcbnNpbmdsZSBjb2xvbiBpcyB1c2VkLCBhbmQgdGhlIHNsaWNlIG1ldGhvZCBpcyBhdmFpbGFibGUuICBGb3Igc2xpY2Vcbm9wZXJhdGlvbnMgaW52b2x2aW5nIGV4dGVuZGVkIHNsaWNlIG5vdGF0aW9uLCBvciBpbiBhYnNlbmNlIG9mIHRoZVxuc2xpY2UgbWV0aG9kcywgYGBfX2dldGl0ZW1fXygpYGAsIGBgX19zZXRpdGVtX18oKWBgIG9yXG5gYF9fZGVsaXRlbV9fKClgYCBpcyBjYWxsZWQgd2l0aCBhIHNsaWNlIG9iamVjdCBhcyBhcmd1bWVudC5cblxuVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlIGhvdyB0byBtYWtlIHlvdXIgcHJvZ3JhbSBvciBtb2R1bGVcbmNvbXBhdGlibGUgd2l0aCBlYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbiAoYXNzdW1pbmcgdGhhdCBtZXRob2RzXG5gYF9fZ2V0aXRlbV9fKClgYCwgYGBfX3NldGl0ZW1fXygpYGAgYW5kIGBgX19kZWxpdGVtX18oKWBgIHN1cHBvcnRcbnNsaWNlIG9iamVjdHMgYXMgYXJndW1lbnRzKTpcblxuICAgY2xhc3MgTXlDbGFzczpcbiAgICAgICAuLi5cbiAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOlxuICAgICAgICAgICAuLi5cbiAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaW5kZXgsIHZhbHVlKTpcbiAgICAgICAgICAgLi4uXG4gICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGluZGV4KTpcbiAgICAgICAgICAgLi4uXG5cbiAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDApOlxuICAgICAgICAgICAjIFRoZXkgd29uXCd0IGJlIGRlZmluZWQgaWYgdmVyc2lvbiBpcyBhdCBsZWFzdCAyLjAgZmluYWxcblxuICAgICAgICAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOlxuICAgICAgICAgICAgICAgcmV0dXJuIHNlbGZbbWF4KDAsIGkpOm1heCgwLCBqKTpdXG4gICAgICAgICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgaSwgaiwgc2VxKTpcbiAgICAgICAgICAgICAgIHNlbGZbbWF4KDAsIGkpOm1heCgwLCBqKTpdID0gc2VxXG4gICAgICAgICAgIGRlZiBfX2RlbHNsaWNlX18oc2VsZiwgaSwgaik6XG4gICAgICAgICAgICAgICBkZWwgc2VsZlttYXgoMCwgaSk6bWF4KDAsIGopOl1cbiAgICAgICAuLi5cblxuTm90ZSB0aGUgY2FsbHMgdG8gYGBtYXgoKWBgOyB0aGVzZSBhcmUgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgdGhlXG5oYW5kbGluZyBvZiBuZWdhdGl2ZSBpbmRpY2VzIGJlZm9yZSB0aGUgYGBfXypzbGljZV9fKClgYCBtZXRob2RzIGFyZVxuY2FsbGVkLiAgV2hlbiBuZWdhdGl2ZSBpbmRleGVzIGFyZSB1c2VkLCB0aGUgYGBfXyppdGVtX18oKWBgIG1ldGhvZHNcbnJlY2VpdmUgdGhlbSBhcyBwcm92aWRlZCwgYnV0IHRoZSBgYF9fKnNsaWNlX18oKWBgIG1ldGhvZHMgZ2V0IGFcbiJjb29rZWQiIGZvcm0gb2YgdGhlIGluZGV4IHZhbHVlcy4gIEZvciBlYWNoIG5lZ2F0aXZlIGluZGV4IHZhbHVlLCB0aGVcbmxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgaXMgYWRkZWQgdG8gdGhlIGluZGV4IGJlZm9yZSBjYWxsaW5nIHRoZSBtZXRob2Rcbih3aGljaCBtYXkgc3RpbGwgcmVzdWx0IGluIGEgbmVnYXRpdmUgaW5kZXgpOyB0aGlzIGlzIHRoZSBjdXN0b21hcnlcbmhhbmRsaW5nIG9mIG5lZ2F0aXZlIGluZGV4ZXMgYnkgdGhlIGJ1aWx0LWluIHNlcXVlbmNlIHR5cGVzLCBhbmQgdGhlXG5gYF9fKml0ZW1fXygpYGAgbWV0aG9kcyBhcmUgZXhwZWN0ZWQgdG8gZG8gdGhpcyBhcyB3ZWxsLiAgSG93ZXZlcixcbnNpbmNlIHRoZXkgc2hvdWxkIGFscmVhZHkgYmUgZG9pbmcgdGhhdCwgbmVnYXRpdmUgaW5kZXhlcyBjYW5ub3QgYmVcbnBhc3NlZCBpbjsgdGhleSBtdXN0IGJlIGNvbnN0cmFpbmVkIHRvIHRoZSBib3VuZHMgb2YgdGhlIHNlcXVlbmNlXG5iZWZvcmUgYmVpbmcgcGFzc2VkIHRvIHRoZSBgYF9fKml0ZW1fXygpYGAgbWV0aG9kcy4gQ2FsbGluZyBgYG1heCgwLFxuaSlgYCBjb252ZW5pZW50bHkgcmV0dXJucyB0aGUgcHJvcGVyIHZhbHVlLlxuXG5cbkVtdWxhdGluZyBudW1lcmljIHR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gZW11bGF0ZSBudW1lcmljIG9iamVjdHMuXG5NZXRob2RzIGNvcnJlc3BvbmRpbmcgdG8gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZVxucGFydGljdWxhciBraW5kIG9mIG51bWJlciBpbXBsZW1lbnRlZCAoZS5nLiwgYml0d2lzZSBvcGVyYXRpb25zIGZvclxubm9uLWludGVncmFsIG51bWJlcnMpIHNob3VsZCBiZSBsZWZ0IHVuZGVmaW5lZC5cblxub2JqZWN0Ll9fYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19zdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX211bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX21vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19wb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19sc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX194b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX29yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zIChgYCtgYCwgYGAtYGAsIGBgKmBgLCBgYC8vYGAsIGBgJWBgLCBgYGRpdm1vZCgpYGAsXG4gICBgYHBvdygpYGAsIGBgKipgYCwgYGA8PGBgLCBgYD4+YGAsIGBgJmBgLCBgYF5gYCwgYGB8YGApLiAgRm9yXG4gICBpbnN0YW5jZSwgdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gYGB4ICsgeWBgLCB3aGVyZSAqeCogaXMgYW5cbiAgIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBoYXMgYW4gYGBfX2FkZF9fKClgYCBtZXRob2QsXG4gICBgYHguX19hZGRfXyh5KWBgIGlzIGNhbGxlZC4gIFRoZSBgYF9fZGl2bW9kX18oKWBgIG1ldGhvZCBzaG91bGQgYmVcbiAgIHRoZSBlcXVpdmFsZW50IHRvIHVzaW5nIGBgX19mbG9vcmRpdl9fKClgYCBhbmQgYGBfX21vZF9fKClgYDsgaXRcbiAgIHNob3VsZCBub3QgYmUgcmVsYXRlZCB0byBgYF9fdHJ1ZWRpdl9fKClgYCAoZGVzY3JpYmVkIGJlbG93KS4gIE5vdGVcbiAgIHRoYXQgYGBfX3Bvd19fKClgYCBzaG91bGQgYmUgZGVmaW5lZCB0byBhY2NlcHQgYW4gb3B0aW9uYWwgdGhpcmRcbiAgIGFyZ3VtZW50IGlmIHRoZSB0ZXJuYXJ5IHZlcnNpb24gb2YgdGhlIGJ1aWx0LWluIGBgcG93KClgYCBmdW5jdGlvblxuICAgaXMgdG8gYmUgc3VwcG9ydGVkLlxuXG4gICBJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gd2l0aCB0aGVcbiAgIHN1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiBgYE5vdEltcGxlbWVudGVkYGAuXG5cbm9iamVjdC5fX2Rpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGUgZGl2aXNpb24gb3BlcmF0b3IgKGBgL2BgKSBpcyBpbXBsZW1lbnRlZCBieSB0aGVzZSBtZXRob2RzLiAgVGhlXG4gICBgYF9fdHJ1ZWRpdl9fKClgYCBtZXRob2QgaXMgdXNlZCB3aGVuIGBgX19mdXR1cmVfXy5kaXZpc2lvbmBgIGlzIGluXG4gICBlZmZlY3QsIG90aGVyd2lzZSBgYF9fZGl2X18oKWBgIGlzIHVzZWQuICBJZiBvbmx5IG9uZSBvZiB0aGVzZSB0d29cbiAgIG1ldGhvZHMgaXMgZGVmaW5lZCwgdGhlIG9iamVjdCB3aWxsIG5vdCBzdXBwb3J0IGRpdmlzaW9uIGluIHRoZVxuICAgYWx0ZXJuYXRlIGNvbnRleHQ7IGBgVHlwZUVycm9yYGAgd2lsbCBiZSByYWlzZWQgaW5zdGVhZC5cblxub2JqZWN0Ll9fcmFkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnN1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnRydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnBvd19fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmxzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnJzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmFuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnhvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcm9yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeSBhcml0aG1ldGljXG4gICBvcGVyYXRpb25zIChgYCtgYCwgYGAtYGAsIGBgKmBgLCBgYC9gYCwgYGAlYGAsIGBgZGl2bW9kKClgYCxcbiAgIGBgcG93KClgYCwgYGAqKmBgLCBgYDw8YGAsIGBgPj5gYCwgYGAmYGAsIGBgXmBgLCBgYHxgYCkgd2l0aFxuICAgcmVmbGVjdGVkIChzd2FwcGVkKSBvcGVyYW5kcy4gIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25seSBjYWxsZWQgaWZcbiAgIHRoZSBsZWZ0IG9wZXJhbmQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY29ycmVzcG9uZGluZyBvcGVyYXRpb24gYW5kXG4gICB0aGUgb3BlcmFuZHMgYXJlIG9mIGRpZmZlcmVudCB0eXBlcy4gWzJdIEZvciBpbnN0YW5jZSwgdG8gZXZhbHVhdGVcbiAgIHRoZSBleHByZXNzaW9uIGBgeCAtIHlgYCwgd2hlcmUgKnkqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdFxuICAgaGFzIGFuIGBgX19yc3ViX18oKWBgIG1ldGhvZCwgYGB5Ll9fcnN1Yl9fKHgpYGAgaXMgY2FsbGVkIGlmXG4gICBgYHguX19zdWJfXyh5KWBgIHJldHVybnMgKk5vdEltcGxlbWVudGVkKi5cblxuICAgTm90ZSB0aGF0IHRlcm5hcnkgYGBwb3coKWBgIHdpbGwgbm90IHRyeSBjYWxsaW5nIGBgX19ycG93X18oKWBgXG4gICAodGhlIGNvZXJjaW9uIHJ1bGVzIHdvdWxkIGJlY29tZSB0b28gY29tcGxpY2F0ZWQpLlxuXG4gICBOb3RlOiBJZiB0aGUgcmlnaHQgb3BlcmFuZFwncyB0eXBlIGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGxlZnQgb3BlcmFuZFwnc1xuICAgICB0eXBlIGFuZCB0aGF0IHN1YmNsYXNzIHByb3ZpZGVzIHRoZSByZWZsZWN0ZWQgbWV0aG9kIGZvciB0aGVcbiAgICAgb3BlcmF0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGxlZnQgb3BlcmFuZFwnc1xuICAgICBub24tcmVmbGVjdGVkIG1ldGhvZC4gIFRoaXMgYmVoYXZpb3IgYWxsb3dzIHN1YmNsYXNzZXMgdG9cbiAgICAgb3ZlcnJpZGUgdGhlaXIgYW5jZXN0b3JzXCcgb3BlcmF0aW9ucy5cblxub2JqZWN0Ll9faWFkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXN1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW11bF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXRydWVkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lmbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXBvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbm9iamVjdC5fX2lsc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lyc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lhbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2l4b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lvcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBhdWdtZW50ZWQgYXJpdGhtZXRpY1xuICAgYXNzaWdubWVudHMgKGBgKz1gYCwgYGAtPWBgLCBgYCo9YGAsIGBgLz1gYCwgYGAvLz1gYCwgYGAlPWBgLFxuICAgYGAqKj1gYCwgYGA8PD1gYCwgYGA+Pj1gYCwgYGAmPWBgLCBgYF49YGAsIGBgfD1gYCkuICBUaGVzZSBtZXRob2RzXG4gICBzaG91bGQgYXR0ZW1wdCB0byBkbyB0aGUgb3BlcmF0aW9uIGluLXBsYWNlIChtb2RpZnlpbmcgKnNlbGYqKSBhbmRcbiAgIHJldHVybiB0aGUgcmVzdWx0ICh3aGljaCBjb3VsZCBiZSwgYnV0IGRvZXMgbm90IGhhdmUgdG8gYmUsXG4gICAqc2VsZiopLiAgSWYgYSBzcGVjaWZpYyBtZXRob2QgaXMgbm90IGRlZmluZWQsIHRoZSBhdWdtZW50ZWRcbiAgIGFzc2lnbm1lbnQgZmFsbHMgYmFjayB0byB0aGUgbm9ybWFsIG1ldGhvZHMuICBGb3IgaW5zdGFuY2UsIHRvXG4gICBleGVjdXRlIHRoZSBzdGF0ZW1lbnQgYGB4ICs9IHlgYCwgd2hlcmUgKngqIGlzIGFuIGluc3RhbmNlIG9mIGFcbiAgIGNsYXNzIHRoYXQgaGFzIGFuIGBgX19pYWRkX18oKWBgIG1ldGhvZCwgYGB4Ll9faWFkZF9fKHkpYGAgaXNcbiAgIGNhbGxlZC4gIElmICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgZG9lcyBub3QgZGVmaW5lIGFcbiAgIGBgX19pYWRkX18oKWBgIG1ldGhvZCwgYGB4Ll9fYWRkX18oeSlgYCBhbmQgYGB5Ll9fcmFkZF9fKHgpYGAgYXJlXG4gICBjb25zaWRlcmVkLCBhcyB3aXRoIHRoZSBldmFsdWF0aW9uIG9mIGBgeCArIHlgYC5cblxub2JqZWN0Ll9fbmVnX18oc2VsZilcbm9iamVjdC5fX3Bvc19fKHNlbGYpXG5vYmplY3QuX19hYnNfXyhzZWxmKVxub2JqZWN0Ll9faW52ZXJ0X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgdW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIChgYC1gYCwgYGArYGAsXG4gICBgYGFicygpYGAgYW5kIGBgfmBgKS5cblxub2JqZWN0Ll9fY29tcGxleF9fKHNlbGYpXG5vYmplY3QuX19pbnRfXyhzZWxmKVxub2JqZWN0Ll9fbG9uZ19fKHNlbGYpXG5vYmplY3QuX19mbG9hdF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYGNvbXBsZXgoKWBgLFxuICAgYGBpbnQoKWBgLCBgYGxvbmcoKWBgLCBhbmQgYGBmbG9hdCgpYGAuICBTaG91bGQgcmV0dXJuIGEgdmFsdWUgb2ZcbiAgIHRoZSBhcHByb3ByaWF0ZSB0eXBlLlxuXG5vYmplY3QuX19vY3RfXyhzZWxmKVxub2JqZWN0Ll9faGV4X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zIGBgb2N0KClgYCBhbmQgYGBoZXgoKWBgLlxuICAgU2hvdWxkIHJldHVybiBhIHN0cmluZyB2YWx1ZS5cblxub2JqZWN0Ll9faW5kZXhfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGBgb3BlcmF0b3IuaW5kZXgoKWBgLiAgQWxzbyBjYWxsZWQgd2hlbmV2ZXJcbiAgIFB5dGhvbiBuZWVkcyBhbiBpbnRlZ2VyIG9iamVjdCAoc3VjaCBhcyBpbiBzbGljaW5nKS4gIE11c3QgcmV0dXJuXG4gICBhbiBpbnRlZ2VyIChpbnQgb3IgbG9uZykuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNS5cblxub2JqZWN0Ll9fY29lcmNlX18oc2VsZiwgb3RoZXIpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgIm1peGVkLW1vZGUiIG51bWVyaWMgYXJpdGhtZXRpYy4gIFNob3VsZCBlaXRoZXJcbiAgIHJldHVybiBhIDItdHVwbGUgY29udGFpbmluZyAqc2VsZiogYW5kICpvdGhlciogY29udmVydGVkIHRvIGFcbiAgIGNvbW1vbiBudW1lcmljIHR5cGUsIG9yIGBgTm9uZWBgIGlmIGNvbnZlcnNpb24gaXMgaW1wb3NzaWJsZS4gIFdoZW5cbiAgIHRoZSBjb21tb24gdHlwZSB3b3VsZCBiZSB0aGUgdHlwZSBvZiBgYG90aGVyYGAsIGl0IGlzIHN1ZmZpY2llbnQgdG9cbiAgIHJldHVybiBgYE5vbmVgYCwgc2luY2UgdGhlIGludGVycHJldGVyIHdpbGwgYWxzbyBhc2sgdGhlIG90aGVyXG4gICBvYmplY3QgdG8gYXR0ZW1wdCBhIGNvZXJjaW9uIChidXQgc29tZXRpbWVzLCBpZiB0aGUgaW1wbGVtZW50YXRpb25cbiAgIG9mIHRoZSBvdGhlciB0eXBlIGNhbm5vdCBiZSBjaGFuZ2VkLCBpdCBpcyB1c2VmdWwgdG8gZG8gdGhlXG4gICBjb252ZXJzaW9uIHRvIHRoZSBvdGhlciB0eXBlIGhlcmUpLiAgQSByZXR1cm4gdmFsdWUgb2ZcbiAgIGBgTm90SW1wbGVtZW50ZWRgYCBpcyBlcXVpdmFsZW50IHRvIHJldHVybmluZyBgYE5vbmVgYC5cblxuXG5Db2VyY2lvbiBydWxlc1xuPT09PT09PT09PT09PT1cblxuVGhpcyBzZWN0aW9uIHVzZWQgdG8gZG9jdW1lbnQgdGhlIHJ1bGVzIGZvciBjb2VyY2lvbi4gIEFzIHRoZSBsYW5ndWFnZVxuaGFzIGV2b2x2ZWQsIHRoZSBjb2VyY2lvbiBydWxlcyBoYXZlIGJlY29tZSBoYXJkIHRvIGRvY3VtZW50XG5wcmVjaXNlbHk7IGRvY3VtZW50aW5nIHdoYXQgb25lIHZlcnNpb24gb2Ygb25lIHBhcnRpY3VsYXJcbmltcGxlbWVudGF0aW9uIGRvZXMgaXMgdW5kZXNpcmFibGUuICBJbnN0ZWFkLCBoZXJlIGFyZSBzb21lIGluZm9ybWFsXG5ndWlkZWxpbmVzIHJlZ2FyZGluZyBjb2VyY2lvbi4gIEluIFB5dGhvbiAzLCBjb2VyY2lvbiB3aWxsIG5vdCBiZVxuc3VwcG9ydGVkLlxuXG4qIElmIHRoZSBsZWZ0IG9wZXJhbmQgb2YgYSAlIG9wZXJhdG9yIGlzIGEgc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0LFxuICBubyBjb2VyY2lvbiB0YWtlcyBwbGFjZSBhbmQgdGhlIHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdGlvbiBpc1xuICBpbnZva2VkIGluc3RlYWQuXG5cbiogSXQgaXMgbm8gbG9uZ2VyIHJlY29tbWVuZGVkIHRvIGRlZmluZSBhIGNvZXJjaW9uIG9wZXJhdGlvbi4gTWl4ZWQtXG4gIG1vZGUgb3BlcmF0aW9ucyBvbiB0eXBlcyB0aGF0IGRvblwndCBkZWZpbmUgY29lcmNpb24gcGFzcyB0aGVcbiAgb3JpZ2luYWwgYXJndW1lbnRzIHRvIHRoZSBvcGVyYXRpb24uXG5cbiogTmV3LXN0eWxlIGNsYXNzZXMgKHRob3NlIGRlcml2ZWQgZnJvbSBgYG9iamVjdGBgKSBuZXZlciBpbnZva2UgdGhlXG4gIGBgX19jb2VyY2VfXygpYGAgbWV0aG9kIGluIHJlc3BvbnNlIHRvIGEgYmluYXJ5IG9wZXJhdG9yOyB0aGUgb25seVxuICB0aW1lIGBgX19jb2VyY2VfXygpYGAgaXMgaW52b2tlZCBpcyB3aGVuIHRoZSBidWlsdC1pbiBmdW5jdGlvblxuICBgYGNvZXJjZSgpYGAgaXMgY2FsbGVkLlxuXG4qIEZvciBtb3N0IGludGVudHMgYW5kIHB1cnBvc2VzLCBhbiBvcGVyYXRvciB0aGF0IHJldHVybnNcbiAgYGBOb3RJbXBsZW1lbnRlZGBgIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgb25lIHRoYXQgaXMgbm90XG4gIGltcGxlbWVudGVkIGF0IGFsbC5cblxuKiBCZWxvdywgYGBfX29wX18oKWBgIGFuZCBgYF9fcm9wX18oKWBgIGFyZSB1c2VkIHRvIHNpZ25pZnkgdGhlXG4gIGdlbmVyaWMgbWV0aG9kIG5hbWVzIGNvcnJlc3BvbmRpbmcgdG8gYW4gb3BlcmF0b3I7IGBgX19pb3BfXygpYGAgaXNcbiAgdXNlZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgaW4tcGxhY2Ugb3BlcmF0b3IuICBGb3IgZXhhbXBsZSwgZm9yIHRoZVxuICBvcGVyYXRvciBcJ2BgK2BgXCcsIGBgX19hZGRfXygpYGAgYW5kIGBgX19yYWRkX18oKWBgIGFyZSB1c2VkIGZvciB0aGVcbiAgbGVmdCBhbmQgcmlnaHQgdmFyaWFudCBvZiB0aGUgYmluYXJ5IG9wZXJhdG9yLCBhbmQgYGBfX2lhZGRfXygpYGBcbiAgZm9yIHRoZSBpbi1wbGFjZSB2YXJpYW50LlxuXG4qIEZvciBvYmplY3RzICp4KiBhbmQgKnkqLCBmaXJzdCBgYHguX19vcF9fKHkpYGAgaXMgdHJpZWQuICBJZiB0aGlzIGlzXG4gIG5vdCBpbXBsZW1lbnRlZCBvciByZXR1cm5zIGBgTm90SW1wbGVtZW50ZWRgYCwgYGB5Ll9fcm9wX18oeClgYCBpc1xuICB0cmllZC4gIElmIHRoaXMgaXMgYWxzbyBub3QgaW1wbGVtZW50ZWQgb3IgcmV0dXJuc1xuICBgYE5vdEltcGxlbWVudGVkYGAsIGEgYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLiAgQnV0IHNlZVxuICB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjpcblxuKiBFeGNlcHRpb24gdG8gdGhlIHByZXZpb3VzIGl0ZW06IGlmIHRoZSBsZWZ0IG9wZXJhbmQgaXMgYW4gaW5zdGFuY2VcbiAgb2YgYSBidWlsdC1pbiB0eXBlIG9yIGEgbmV3LXN0eWxlIGNsYXNzLCBhbmQgdGhlIHJpZ2h0IG9wZXJhbmQgaXMgYW5cbiAgaW5zdGFuY2Ugb2YgYSBwcm9wZXIgc3ViY2xhc3Mgb2YgdGhhdCB0eXBlIG9yIGNsYXNzIGFuZCBvdmVycmlkZXNcbiAgdGhlIGJhc2VcJ3MgYGBfX3JvcF9fKClgYCBtZXRob2QsIHRoZSByaWdodCBvcGVyYW5kXCdzIGBgX19yb3BfXygpYGBcbiAgbWV0aG9kIGlzIHRyaWVkICpiZWZvcmUqIHRoZSBsZWZ0IG9wZXJhbmRcJ3MgYGBfX29wX18oKWBgIG1ldGhvZC5cblxuICBUaGlzIGlzIGRvbmUgc28gdGhhdCBhIHN1YmNsYXNzIGNhbiBjb21wbGV0ZWx5IG92ZXJyaWRlIGJpbmFyeVxuICBvcGVyYXRvcnMuIE90aGVyd2lzZSwgdGhlIGxlZnQgb3BlcmFuZFwncyBgYF9fb3BfXygpYGAgbWV0aG9kIHdvdWxkXG4gIGFsd2F5cyBhY2NlcHQgdGhlIHJpZ2h0IG9wZXJhbmQ6IHdoZW4gYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiBjbGFzc1xuICBpcyBleHBlY3RlZCwgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcyBvZiB0aGF0IGNsYXNzIGlzIGFsd2F5c1xuICBhY2NlcHRhYmxlLlxuXG4qIFdoZW4gZWl0aGVyIG9wZXJhbmQgdHlwZSBkZWZpbmVzIGEgY29lcmNpb24sIHRoaXMgY29lcmNpb24gaXMgY2FsbGVkXG4gIGJlZm9yZSB0aGF0IHR5cGVcJ3MgYGBfX29wX18oKWBgIG9yIGBgX19yb3BfXygpYGAgbWV0aG9kIGlzIGNhbGxlZCxcbiAgYnV0IG5vIHNvb25lci4gIElmIHRoZSBjb2VyY2lvbiByZXR1cm5zIGFuIG9iamVjdCBvZiBhIGRpZmZlcmVudFxuICB0eXBlIGZvciB0aGUgb3BlcmFuZCB3aG9zZSBjb2VyY2lvbiBpcyBpbnZva2VkLCBwYXJ0IG9mIHRoZSBwcm9jZXNzXG4gIGlzIHJlZG9uZSB1c2luZyB0aGUgbmV3IG9iamVjdC5cblxuKiBXaGVuIGFuIGluLXBsYWNlIG9wZXJhdG9yIChsaWtlIFwnYGArPWBgXCcpIGlzIHVzZWQsIGlmIHRoZSBsZWZ0XG4gIG9wZXJhbmQgaW1wbGVtZW50cyBgYF9faW9wX18oKWBgLCBpdCBpcyBpbnZva2VkIHdpdGhvdXQgYW55XG4gIGNvZXJjaW9uLiAgV2hlbiB0aGUgb3BlcmF0aW9uIGZhbGxzIGJhY2sgdG8gYGBfX29wX18oKWBgIGFuZC9vclxuICBgYF9fcm9wX18oKWBgLCB0aGUgbm9ybWFsIGNvZXJjaW9uIHJ1bGVzIGFwcGx5LlxuXG4qIEluIGBgeCArIHlgYCwgaWYgKngqIGlzIGEgc2VxdWVuY2UgdGhhdCBpbXBsZW1lbnRzIHNlcXVlbmNlXG4gIGNvbmNhdGVuYXRpb24sIHNlcXVlbmNlIGNvbmNhdGVuYXRpb24gaXMgaW52b2tlZC5cblxuKiBJbiBgYHggKiB5YGAsIGlmIG9uZSBvcGVyYW5kIGlzIGEgc2VxdWVuY2UgdGhhdCBpbXBsZW1lbnRzIHNlcXVlbmNlXG4gIHJlcGV0aXRpb24sIGFuZCB0aGUgb3RoZXIgaXMgYW4gaW50ZWdlciAoYGBpbnRgYCBvciBgYGxvbmdgYCksXG4gIHNlcXVlbmNlIHJlcGV0aXRpb24gaXMgaW52b2tlZC5cblxuKiBSaWNoIGNvbXBhcmlzb25zIChpbXBsZW1lbnRlZCBieSBtZXRob2RzIGBgX19lcV9fKClgYCBhbmQgc28gb24pXG4gIG5ldmVyIHVzZSBjb2VyY2lvbi4gIFRocmVlLXdheSBjb21wYXJpc29uIChpbXBsZW1lbnRlZCBieVxuICBgYF9fY21wX18oKWBgKSBkb2VzIHVzZSBjb2VyY2lvbiB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIGFzIG90aGVyXG4gIGJpbmFyeSBvcGVyYXRpb25zIHVzZSBpdC5cblxuKiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgdGhlIGJ1aWx0LWluIG51bWVyaWMgdHlwZXMgYGBpbnRgYCxcbiAgYGBsb25nYGAsIGBgZmxvYXRgYCwgYW5kIGBgY29tcGxleGBgIGRvIG5vdCB1c2UgY29lcmNpb24uIEFsbCB0aGVzZVxuICB0eXBlcyBpbXBsZW1lbnQgYSBgYF9fY29lcmNlX18oKWBgIG1ldGhvZCwgZm9yIHVzZSBieSB0aGUgYnVpbHQtaW5cbiAgYGBjb2VyY2UoKWBgIGZ1bmN0aW9uLlxuXG4gIENoYW5nZWQgaW4gdmVyc2lvbiAyLjcuXG5cblxuV2l0aCBTdGF0ZW1lbnQgQ29udGV4dCBNYW5hZ2Vyc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5OZXcgaW4gdmVyc2lvbiAyLjUuXG5cbkEgKmNvbnRleHQgbWFuYWdlciogaXMgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgcnVudGltZSBjb250ZXh0IHRvXG5iZSBlc3RhYmxpc2hlZCB3aGVuIGV4ZWN1dGluZyBhIGBgd2l0aGBgIHN0YXRlbWVudC4gVGhlIGNvbnRleHRcbm1hbmFnZXIgaGFuZGxlcyB0aGUgZW50cnkgaW50bywgYW5kIHRoZSBleGl0IGZyb20sIHRoZSBkZXNpcmVkIHJ1bnRpbWVcbmNvbnRleHQgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrIG9mIGNvZGUuICBDb250ZXh0IG1hbmFnZXJzIGFyZVxubm9ybWFsbHkgaW52b2tlZCB1c2luZyB0aGUgYGB3aXRoYGAgc3RhdGVtZW50IChkZXNjcmliZWQgaW4gc2VjdGlvblxuKlRoZSB3aXRoIHN0YXRlbWVudCopLCBidXQgY2FuIGFsc28gYmUgdXNlZCBieSBkaXJlY3RseSBpbnZva2luZyB0aGVpclxubWV0aG9kcy5cblxuVHlwaWNhbCB1c2VzIG9mIGNvbnRleHQgbWFuYWdlcnMgaW5jbHVkZSBzYXZpbmcgYW5kIHJlc3RvcmluZyB2YXJpb3VzXG5raW5kcyBvZiBnbG9iYWwgc3RhdGUsIGxvY2tpbmcgYW5kIHVubG9ja2luZyByZXNvdXJjZXMsIGNsb3Npbmcgb3BlbmVkXG5maWxlcywgZXRjLlxuXG5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBjb250ZXh0IG1hbmFnZXJzLCBzZWUgKkNvbnRleHQgTWFuYWdlciBUeXBlcyouXG5cbm9iamVjdC5fX2VudGVyX18oc2VsZilcblxuICAgRW50ZXIgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgYGB3aXRoYGBcbiAgIHN0YXRlbWVudCB3aWxsIGJpbmQgdGhpcyBtZXRob2RcJ3MgcmV0dXJuIHZhbHVlIHRvIHRoZSB0YXJnZXQocylcbiAgIHNwZWNpZmllZCBpbiB0aGUgYGBhc2BgIGNsYXVzZSBvZiB0aGUgc3RhdGVtZW50LCBpZiBhbnkuXG5cbm9iamVjdC5fX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0cmFjZWJhY2spXG5cbiAgIEV4aXQgdGhlIHJ1bnRpbWUgY29udGV4dCByZWxhdGVkIHRvIHRoaXMgb2JqZWN0LiBUaGUgcGFyYW1ldGVyc1xuICAgZGVzY3JpYmUgdGhlIGV4Y2VwdGlvbiB0aGF0IGNhdXNlZCB0aGUgY29udGV4dCB0byBiZSBleGl0ZWQuIElmIHRoZVxuICAgY29udGV4dCB3YXMgZXhpdGVkIHdpdGhvdXQgYW4gZXhjZXB0aW9uLCBhbGwgdGhyZWUgYXJndW1lbnRzIHdpbGxcbiAgIGJlIGBgTm9uZWBgLlxuXG4gICBJZiBhbiBleGNlcHRpb24gaXMgc3VwcGxpZWQsIGFuZCB0aGUgbWV0aG9kIHdpc2hlcyB0byBzdXBwcmVzcyB0aGVcbiAgIGV4Y2VwdGlvbiAoaS5lLiwgcHJldmVudCBpdCBmcm9tIGJlaW5nIHByb3BhZ2F0ZWQpLCBpdCBzaG91bGRcbiAgIHJldHVybiBhIHRydWUgdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHByb2Nlc3NlZFxuICAgbm9ybWFsbHkgdXBvbiBleGl0IGZyb20gdGhpcyBtZXRob2QuXG5cbiAgIE5vdGUgdGhhdCBgYF9fZXhpdF9fKClgYCBtZXRob2RzIHNob3VsZCBub3QgcmVyYWlzZSB0aGUgcGFzc2VkLWluXG4gICBleGNlcHRpb247IHRoaXMgaXMgdGhlIGNhbGxlclwncyByZXNwb25zaWJpbGl0eS5cblxuU2VlIGFsc286XG5cbiAgICoqUEVQIDAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4gICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uXG4gICAgICBgYHdpdGhgYCBzdGF0ZW1lbnQuXG5cblxuU3BlY2lhbCBtZXRob2QgbG9va3VwIGZvciBvbGQtc3R5bGUgY2xhc3Nlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5Gb3Igb2xkLXN0eWxlIGNsYXNzZXMsIHNwZWNpYWwgbWV0aG9kcyBhcmUgYWx3YXlzIGxvb2tlZCB1cCBpbiBleGFjdGx5XG50aGUgc2FtZSB3YXkgYXMgYW55IG90aGVyIG1ldGhvZCBvciBhdHRyaWJ1dGUuIFRoaXMgaXMgdGhlIGNhc2VcbnJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgbWV0aG9kIGlzIGJlaW5nIGxvb2tlZCB1cCBleHBsaWNpdGx5IGFzIGluXG5gYHguX19nZXRpdGVtX18oaSlgYCBvciBpbXBsaWNpdGx5IGFzIGluIGBgeFtpXWBgLlxuXG5UaGlzIGJlaGF2aW91ciBtZWFucyB0aGF0IHNwZWNpYWwgbWV0aG9kcyBtYXkgZXhoaWJpdCBkaWZmZXJlbnRcbmJlaGF2aW91ciBmb3IgZGlmZmVyZW50IGluc3RhbmNlcyBvZiBhIHNpbmdsZSBvbGQtc3R5bGUgY2xhc3MgaWYgdGhlXG5hcHByb3ByaWF0ZSBzcGVjaWFsIGF0dHJpYnV0ZXMgYXJlIHNldCBkaWZmZXJlbnRseTpcblxuICAgPj4+IGNsYXNzIEM6XG4gICAuLi4gICAgIHBhc3NcbiAgIC4uLlxuICAgPj4+IGMxID0gQygpXG4gICA+Pj4gYzIgPSBDKClcbiAgID4+PiBjMS5fX2xlbl9fID0gbGFtYmRhOiA1XG4gICA+Pj4gYzIuX19sZW5fXyA9IGxhbWJkYTogOVxuICAgPj4+IGxlbihjMSlcbiAgIDVcbiAgID4+PiBsZW4oYzIpXG4gICA5XG5cblxuU3BlY2lhbCBtZXRob2QgbG9va3VwIGZvciBuZXctc3R5bGUgY2xhc3Nlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5Gb3IgbmV3LXN0eWxlIGNsYXNzZXMsIGltcGxpY2l0IGludm9jYXRpb25zIG9mIHNwZWNpYWwgbWV0aG9kcyBhcmVcbm9ubHkgZ3VhcmFudGVlZCB0byB3b3JrIGNvcnJlY3RseSBpZiBkZWZpbmVkIG9uIGFuIG9iamVjdFwncyB0eXBlLCBub3RcbmluIHRoZSBvYmplY3RcJ3MgaW5zdGFuY2UgZGljdGlvbmFyeS4gIFRoYXQgYmVoYXZpb3VyIGlzIHRoZSByZWFzb24gd2h5XG50aGUgZm9sbG93aW5nIGNvZGUgcmFpc2VzIGFuIGV4Y2VwdGlvbiAodW5saWtlIHRoZSBlcXVpdmFsZW50IGV4YW1wbGVcbndpdGggb2xkLXN0eWxlIGNsYXNzZXMpOlxuXG4gICA+Pj4gY2xhc3MgQyhvYmplY3QpOlxuICAgLi4uICAgICBwYXNzXG4gICAuLi5cbiAgID4+PiBjID0gQygpXG4gICA+Pj4gYy5fX2xlbl9fID0gbGFtYmRhOiA1XG4gICA+Pj4gbGVuKGMpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4gICBUeXBlRXJyb3I6IG9iamVjdCBvZiB0eXBlIFwnQ1wnIGhhcyBubyBsZW4oKVxuXG5UaGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzIGJlaGF2aW91ciBsaWVzIHdpdGggYSBudW1iZXIgb2Ygc3BlY2lhbFxubWV0aG9kcyBzdWNoIGFzIGBgX19oYXNoX18oKWBgIGFuZCBgYF9fcmVwcl9fKClgYCB0aGF0IGFyZSBpbXBsZW1lbnRlZFxuYnkgYWxsIG9iamVjdHMsIGluY2x1ZGluZyB0eXBlIG9iamVjdHMuIElmIHRoZSBpbXBsaWNpdCBsb29rdXAgb2ZcbnRoZXNlIG1ldGhvZHMgdXNlZCB0aGUgY29udmVudGlvbmFsIGxvb2t1cCBwcm9jZXNzLCB0aGV5IHdvdWxkIGZhaWxcbndoZW4gaW52b2tlZCBvbiB0aGUgdHlwZSBvYmplY3QgaXRzZWxmOlxuXG4gICA+Pj4gMSAuX19oYXNoX18oKSA9PSBoYXNoKDEpXG4gICBUcnVlXG4gICA+Pj4gaW50Ll9faGFzaF9fKCkgPT0gaGFzaChpbnQpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4gICBUeXBlRXJyb3I6IGRlc2NyaXB0b3IgXCdfX2hhc2hfX1wnIG9mIFwnaW50XCcgb2JqZWN0IG5lZWRzIGFuIGFyZ3VtZW50XG5cbkluY29ycmVjdGx5IGF0dGVtcHRpbmcgdG8gaW52b2tlIGFuIHVuYm91bmQgbWV0aG9kIG9mIGEgY2xhc3MgaW4gdGhpc1xud2F5IGlzIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBcJ21ldGFjbGFzcyBjb25mdXNpb25cJywgYW5kIGlzIGF2b2lkZWRcbmJ5IGJ5cGFzc2luZyB0aGUgaW5zdGFuY2Ugd2hlbiBsb29raW5nIHVwIHNwZWNpYWwgbWV0aG9kczpcblxuICAgPj4+IHR5cGUoMSkuX19oYXNoX18oMSkgPT0gaGFzaCgxKVxuICAgVHJ1ZVxuICAgPj4+IHR5cGUoaW50KS5fX2hhc2hfXyhpbnQpID09IGhhc2goaW50KVxuICAgVHJ1ZVxuXG5JbiBhZGRpdGlvbiB0byBieXBhc3NpbmcgYW55IGluc3RhbmNlIGF0dHJpYnV0ZXMgaW4gdGhlIGludGVyZXN0IG9mXG5jb3JyZWN0bmVzcywgaW1wbGljaXQgc3BlY2lhbCBtZXRob2QgbG9va3VwIGdlbmVyYWxseSBhbHNvIGJ5cGFzc2VzXG50aGUgYGBfX2dldGF0dHJpYnV0ZV9fKClgYCBtZXRob2QgZXZlbiBvZiB0aGUgb2JqZWN0XCdzIG1ldGFjbGFzczpcblxuICAgPj4+IGNsYXNzIE1ldGEodHlwZSk6XG4gICAuLi4gICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpOlxuICAgLi4uICAgICAgIHByaW50ICJNZXRhY2xhc3MgZ2V0YXR0cmlidXRlIGludm9rZWQiXG4gICAuLi4gICAgICAgcmV0dXJuIHR5cGUuX19nZXRhdHRyaWJ1dGVfXygqYXJncylcbiAgIC4uLlxuICAgPj4+IGNsYXNzIEMob2JqZWN0KTpcbiAgIC4uLiAgICAgX19tZXRhY2xhc3NfXyA9IE1ldGFcbiAgIC4uLiAgICAgZGVmIF9fbGVuX18oc2VsZik6XG4gICAuLi4gICAgICAgICByZXR1cm4gMTBcbiAgIC4uLiAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpOlxuICAgLi4uICAgICAgICAgcHJpbnQgIkNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIlxuICAgLi4uICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKCphcmdzKVxuICAgLi4uXG4gICA+Pj4gYyA9IEMoKVxuICAgPj4+IGMuX19sZW5fXygpICAgICAgICAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgaW5zdGFuY2VcbiAgIENsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkXG4gICAxMFxuICAgPj4+IHR5cGUoYykuX19sZW5fXyhjKSAgICAgICAgICAjIEV4cGxpY2l0IGxvb2t1cCB2aWEgdHlwZVxuICAgTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkXG4gICAxMFxuICAgPj4+IGxlbihjKSAgICAgICAgICAgICAgICAgICAgICAjIEltcGxpY2l0IGxvb2t1cFxuICAgMTBcblxuQnlwYXNzaW5nIHRoZSBgYF9fZ2V0YXR0cmlidXRlX18oKWBgIG1hY2hpbmVyeSBpbiB0aGlzIGZhc2hpb25cbnByb3ZpZGVzIHNpZ25pZmljYW50IHNjb3BlIGZvciBzcGVlZCBvcHRpbWlzYXRpb25zIHdpdGhpbiB0aGVcbmludGVycHJldGVyLCBhdCB0aGUgY29zdCBvZiBzb21lIGZsZXhpYmlsaXR5IGluIHRoZSBoYW5kbGluZyBvZlxuc3BlY2lhbCBtZXRob2RzICh0aGUgc3BlY2lhbCBtZXRob2QgKm11c3QqIGJlIHNldCBvbiB0aGUgY2xhc3Mgb2JqZWN0XG5pdHNlbGYgaW4gb3JkZXIgdG8gYmUgY29uc2lzdGVudGx5IGludm9rZWQgYnkgdGhlIGludGVycHJldGVyKS5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBJdCAqaXMqIHBvc3NpYmxlIGluIHNvbWUgY2FzZXMgdG8gY2hhbmdlIGFuIG9iamVjdFwncyB0eXBlLCB1bmRlclxuICAgIGNlcnRhaW4gY29udHJvbGxlZCBjb25kaXRpb25zLiBJdCBnZW5lcmFsbHkgaXNuXCd0IGEgZ29vZCBpZGVhXG4gICAgdGhvdWdoLCBzaW5jZSBpdCBjYW4gbGVhZCB0byBzb21lIHZlcnkgc3RyYW5nZSBiZWhhdmlvdXIgaWYgaXQgaXNcbiAgICBoYW5kbGVkIGluY29ycmVjdGx5LlxuXG5bMl0gRm9yIG9wZXJhbmRzIG9mIHRoZSBzYW1lIHR5cGUsIGl0IGlzIGFzc3VtZWQgdGhhdCBpZiB0aGUgbm9uLVxuICAgIHJlZmxlY3RlZCBtZXRob2QgKHN1Y2ggYXMgYGBfX2FkZF9fKClgYCkgZmFpbHMgdGhlIG9wZXJhdGlvbiBpc1xuICAgIG5vdCBzdXBwb3J0ZWQsIHdoaWNoIGlzIHdoeSB0aGUgcmVmbGVjdGVkIG1ldGhvZCBpcyBub3QgY2FsbGVkLlxuJywKKyAnc3RyaW5nLW1ldGhvZHMnOiAnXG5TdHJpbmcgTWV0aG9kc1xuKioqKioqKioqKioqKipcblxuQmVsb3cgYXJlIGxpc3RlZCB0aGUgc3RyaW5nIG1ldGhvZHMgd2hpY2ggYm90aCA4LWJpdCBzdHJpbmdzIGFuZFxuVW5pY29kZSBvYmplY3RzIHN1cHBvcnQuICBTb21lIG9mIHRoZW0gYXJlIGFsc28gYXZhaWxhYmxlIG9uXG5gYGJ5dGVhcnJheWBgIG9iamVjdHMuXG5cbkluIGFkZGl0aW9uLCBQeXRob25cJ3Mgc3RyaW5ncyBzdXBwb3J0IHRoZSBzZXF1ZW5jZSB0eXBlIG1ldGhvZHNcbmRlc2NyaWJlZCBpbiB0aGUgKlNlcXVlbmNlIFR5cGVzIC0tLSBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlLFxuYnl0ZWFycmF5LCBidWZmZXIsIHhyYW5nZSogc2VjdGlvbi4gVG8gb3V0cHV0IGZvcm1hdHRlZCBzdHJpbmdzIHVzZVxudGVtcGxhdGUgc3RyaW5ncyBvciB0aGUgYGAlYGAgb3BlcmF0b3IgZGVzY3JpYmVkIGluIHRoZSAqU3RyaW5nXG5Gb3JtYXR0aW5nIE9wZXJhdGlvbnMqIHNlY3Rpb24uIEFsc28sIHNlZSB0aGUgYGByZWBgIG1vZHVsZSBmb3Igc3RyaW5nXG5mdW5jdGlvbnMgYmFzZWQgb24gcmVndWxhciBleHByZXNzaW9ucy5cblxuc3RyLmNhcGl0YWxpemUoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkXG4gICBhbmQgdGhlIHJlc3QgbG93ZXJjYXNlZC5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gUGFkZGluZyBpcyBkb25lXG4gICB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYSBzcGFjZSkuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyAqc3ViKlxuICAgaW4gdGhlIHJhbmdlIFsqc3RhcnQqLCAqZW5kKl0uICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmRcbiAgICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cblxuc3RyLmRlY29kZShbZW5jb2RpbmdbLCBlcnJvcnNdXSlcblxuICAgRGVjb2RlcyB0aGUgc3RyaW5nIHVzaW5nIHRoZSBjb2RlYyByZWdpc3RlcmVkIGZvciAqZW5jb2RpbmcqLlxuICAgKmVuY29kaW5nKiBkZWZhdWx0cyB0byB0aGUgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICAqZXJyb3JzKiBtYXlcbiAgIGJlIGdpdmVuIHRvIHNldCBhIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBUaGUgZGVmYXVsdCBpc1xuICAgYGBcJ3N0cmljdFwnYGAsIG1lYW5pbmcgdGhhdCBlbmNvZGluZyBlcnJvcnMgcmFpc2UgYGBVbmljb2RlRXJyb3JgYC5cbiAgIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgYGBcJ2lnbm9yZVwnYGAsIGBgXCdyZXBsYWNlXCdgYCBhbmQgYW55IG90aGVyXG4gICBuYW1lIHJlZ2lzdGVyZWQgdmlhIGBgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKClgYCwgc2VlIHNlY3Rpb24gKkNvZGVjXG4gICBCYXNlIENsYXNzZXMqLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFN1cHBvcnQgZm9yIG90aGVyIGVycm9yIGhhbmRsaW5nIHNjaGVtZXNcbiAgIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC5cblxuc3RyLmVuY29kZShbZW5jb2RpbmdbLCBlcnJvcnNdXSlcblxuICAgUmV0dXJuIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLiAgRGVmYXVsdCBlbmNvZGluZyBpcyB0aGVcbiAgIGN1cnJlbnQgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICAqZXJyb3JzKiBtYXkgYmUgZ2l2ZW4gdG8gc2V0IGFcbiAgIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBUaGUgZGVmYXVsdCBmb3IgKmVycm9ycyogaXNcbiAgIGBgXCdzdHJpY3RcJ2BgLCBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGFcbiAgIGBgVW5pY29kZUVycm9yYGAuICBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgXCdpZ25vcmVcJ2BgLFxuICAgYGBcJ3JlcGxhY2VcJ2BgLCBgYFwneG1sY2hhcnJlZnJlcGxhY2VcJ2BgLCBgYFwnYmFja3NsYXNocmVwbGFjZVwnYGAgYW5kXG4gICBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHZpYSBgYGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpYGAsIHNlZVxuICAgc2VjdGlvbiAqQ29kZWMgQmFzZSBDbGFzc2VzKi4gRm9yIGEgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MsIHNlZVxuICAgc2VjdGlvbiAqU3RhbmRhcmQgRW5jb2RpbmdzKi5cblxuICAgTmV3IGluIHZlcnNpb24gMi4wLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBgYFwneG1sY2hhcnJlZnJlcGxhY2VcJ2BgIGFuZFxuICAgYGBcJ2JhY2tzbGFzaHJlcGxhY2VcJ2BgIGFuZCBvdGhlciBlcnJvciBoYW5kbGluZyBzY2hlbWVzIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC5cblxuc3RyLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiBgYFRydWVgYCBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkICpzdWZmaXgqLFxuICAgb3RoZXJ3aXNlIHJldHVybiBgYEZhbHNlYGAuICAqc3VmZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mXG4gICBzdWZmaXhlcyB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXRcbiAgIHRoYXQgcG9zaXRpb24uICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBhdCB0aGF0XG4gICBwb3NpdGlvbi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogQWNjZXB0IHR1cGxlcyBhcyAqc3VmZml4Ki5cblxuc3RyLmV4cGFuZHRhYnMoW3RhYnNpemVdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgYWxsIHRhYiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZFxuICAgYnkgb25lIG9yIG1vcmUgc3BhY2VzLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sdW1uIGFuZCB0aGVcbiAgIGdpdmVuIHRhYiBzaXplLiAgVGFiIHBvc2l0aW9ucyBvY2N1ciBldmVyeSAqdGFic2l6ZSogY2hhcmFjdGVyc1xuICAgKGRlZmF1bHQgaXMgOCwgZ2l2aW5nIHRhYiBwb3NpdGlvbnMgYXQgY29sdW1ucyAwLCA4LCAxNiBhbmQgc28gb24pLlxuICAgVG8gZXhwYW5kIHRoZSBzdHJpbmcsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBzZXQgdG8gemVybyBhbmQgdGhlXG4gICBzdHJpbmcgaXMgZXhhbWluZWQgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlci4gIElmIHRoZSBjaGFyYWN0ZXIgaXMgYVxuICAgdGFiIChgYFxcdGBgKSwgb25lIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQgaW4gdGhlXG4gICByZXN1bHQgdW50aWwgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGVxdWFsIHRvIHRoZSBuZXh0IHRhYiBwb3NpdGlvbi5cbiAgIChUaGUgdGFiIGNoYXJhY3RlciBpdHNlbGYgaXMgbm90IGNvcGllZC4pICBJZiB0aGUgY2hhcmFjdGVyIGlzIGFcbiAgIG5ld2xpbmUgKGBgXFxuYGApIG9yIHJldHVybiAoYGBcXHJgYCksIGl0IGlzIGNvcGllZCBhbmQgdGhlIGN1cnJlbnRcbiAgIGNvbHVtbiBpcyByZXNldCB0byB6ZXJvLiAgQW55IG90aGVyIGNoYXJhY3RlciBpcyBjb3BpZWQgdW5jaGFuZ2VkXG4gICBhbmQgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGluY3JlbWVudGVkIGJ5IG9uZSByZWdhcmRsZXNzIG9mIGhvdyB0aGVcbiAgIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCB3aGVuIHByaW50ZWQuXG5cbiAgID4+PiBcJzAxXFx0MDEyXFx0MDEyM1xcdDAxMjM0XCcuZXhwYW5kdGFicygpXG4gICBcJzAxICAgICAgMDEyICAgICAwMTIzICAgIDAxMjM0XCdcbiAgID4+PiBcJzAxXFx0MDEyXFx0MDEyM1xcdDAxMjM0XCcuZXhwYW5kdGFicyg0KVxuICAgXCcwMSAgMDEyIDAxMjMgICAgMDEyMzRcJ1xuXG5zdHIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgZm91bmQsIHN1Y2ggdGhhdCAqc3ViKiBpcyBjb250YWluZWQgaW4gdGhlIHNsaWNlIGBgc1tzdGFydDplbmRdYGAuXG4gICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlXG4gICBub3RhdGlvbi4gIFJldHVybiBgYC0xYGAgaWYgKnN1YiogaXMgbm90IGZvdW5kLlxuXG4gICBOb3RlOiBUaGUgYGBmaW5kKClgYCBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb25seSBpZiB5b3UgbmVlZCB0byBrbm93IHRoZVxuICAgICBwb3NpdGlvbiBvZiAqc3ViKi4gIFRvIGNoZWNrIGlmICpzdWIqIGlzIGEgc3Vic3RyaW5nIG9yIG5vdCwgdXNlXG4gICAgIHRoZSBgYGluYGAgb3BlcmF0b3I6XG5cbiAgICAgICAgPj4+IFwnUHlcJyBpbiBcJ1B5dGhvblwnXG4gICAgICAgIFRydWVcblxuc3RyLmZvcm1hdCgqYXJncywgKiprd2FyZ3MpXG5cbiAgIFBlcmZvcm0gYSBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRpb24uICBUaGUgc3RyaW5nIG9uIHdoaWNoIHRoaXNcbiAgIG1ldGhvZCBpcyBjYWxsZWQgY2FuIGNvbnRhaW4gbGl0ZXJhbCB0ZXh0IG9yIHJlcGxhY2VtZW50IGZpZWxkc1xuICAgZGVsaW1pdGVkIGJ5IGJyYWNlcyBgYHt9YGAuICBFYWNoIHJlcGxhY2VtZW50IGZpZWxkIGNvbnRhaW5zIGVpdGhlclxuICAgdGhlIG51bWVyaWMgaW5kZXggb2YgYSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBvciB0aGUgbmFtZSBvZiBhXG4gICBrZXl3b3JkIGFyZ3VtZW50LiAgUmV0dXJucyBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBlYWNoXG4gICByZXBsYWNlbWVudCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlXG4gICBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LlxuXG4gICA+Pj4gIlRoZSBzdW0gb2YgMSArIDIgaXMgezB9Ii5mb3JtYXQoMSsyKVxuICAgXCdUaGUgc3VtIG9mIDEgKyAyIGlzIDNcJ1xuXG4gICBTZWUgKkZvcm1hdCBTdHJpbmcgU3ludGF4KiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFyaW91c1xuICAgZm9ybWF0dGluZyBvcHRpb25zIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBpbiBmb3JtYXQgc3RyaW5ncy5cblxuICAgVGhpcyBtZXRob2Qgb2Ygc3RyaW5nIGZvcm1hdHRpbmcgaXMgdGhlIG5ldyBzdGFuZGFyZCBpbiBQeXRob24gMyxcbiAgIGFuZCBzaG91bGQgYmUgcHJlZmVycmVkIHRvIHRoZSBgYCVgYCBmb3JtYXR0aW5nIGRlc2NyaWJlZCBpblxuICAgKlN0cmluZyBGb3JtYXR0aW5nIE9wZXJhdGlvbnMqIGluIG5ldyBjb2RlLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjYuXG5cbnN0ci5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBMaWtlIGBgZmluZCgpYGAsIGJ1dCByYWlzZSBgYFZhbHVlRXJyb3JgYCB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90XG4gICBmb3VuZC5cblxuc3RyLmlzYWxudW0oKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYW51bWVyaWMgYW5kXG4gICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNhbHBoYSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhYmV0aWMgYW5kXG4gICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNkaWdpdCgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGRpZ2l0cyBhbmQgdGhlcmUgaXNcbiAgIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5pc2xvd2VyKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZVxuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5pc3NwYWNlKClcblxuICAgUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmdcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXN0aXRsZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZWNhc2VkIHN0cmluZyBhbmQgdGhlcmUgaXMgYXRcbiAgIGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZvciBleGFtcGxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5XG4gICBmb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuXG4gICBSZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzdXBwZXIoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBbNF0gaW4gdGhlIHN0cmluZyBhcmUgdXBwZXJjYXNlXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmpvaW4oaXRlcmFibGUpXG5cbiAgIFJldHVybiBhIHN0cmluZyB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc3RyaW5ncyBpbiB0aGVcbiAgICppdGVyYWJsZSogKml0ZXJhYmxlKi4gIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBlbGVtZW50cyBpcyB0aGVcbiAgIHN0cmluZyBwcm92aWRpbmcgdGhpcyBtZXRob2QuXG5cbnN0ci5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIHRoZSBzdHJpbmcgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouXG4gICBQYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGFcbiAgIHNwYWNlKS4gIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3JcbiAgIGVxdWFsIHRvIGBgbGVuKHMpYGAuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIubG93ZXIoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkIGNoYXJhY3RlcnMgWzRdXG4gICBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmxzdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgcHJlZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLmxzdHJpcCgpXG4gICBcJ3NwYWNpb3VzICAgXCdcbiAgID4+PiBcJ3d3dy5leGFtcGxlLmNvbVwnLmxzdHJpcChcJ2Ntb3d6LlwnKVxuICAgXCdleGFtcGxlLmNvbVwnXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjIuMjogU3VwcG9ydCBmb3IgdGhlICpjaGFycyogYXJndW1lbnQuXG5cbnN0ci5wYXJ0aXRpb24oc2VwKVxuXG4gICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICpzZXAqLCBhbmQgcmV0dXJuIGFcbiAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxuICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90XG4gICBmb3VuZCwgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBzdHJpbmcgaXRzZWxmLCBmb2xsb3dlZCBieVxuICAgdHdvIGVtcHR5IHN0cmluZ3MuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNS5cblxuc3RyLnJlcGxhY2Uob2xkLCBuZXdbLCBjb3VudF0pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKm9sZCpcbiAgIHJlcGxhY2VkIGJ5ICpuZXcqLiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50ICpjb3VudCogaXMgZ2l2ZW4sIG9ubHlcbiAgIHRoZSBmaXJzdCAqY291bnQqIG9jY3VycmVuY2VzIGFyZSByZXBsYWNlZC5cblxuc3RyLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgZm91bmQsIHN1Y2ggdGhhdCAqc3ViKiBpcyBjb250YWluZWQgd2l0aGluIGBgc1tzdGFydDplbmRdYGAuXG4gICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlXG4gICBub3RhdGlvbi4gIFJldHVybiBgYC0xYGAgb24gZmFpbHVyZS5cblxuc3RyLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBMaWtlIGBgcmZpbmQoKWBgIGJ1dCByYWlzZXMgYGBWYWx1ZUVycm9yYGAgd2hlbiB0aGUgc3Vic3RyaW5nICpzdWIqXG4gICBpcyBub3QgZm91bmQuXG5cbnN0ci5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIHRoZSBzdHJpbmcgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLlxuICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhXG4gICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3JcbiAgIGVxdWFsIHRvIGBgbGVuKHMpYGAuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIucnBhcnRpdGlvbihzZXApXG5cbiAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhXG4gICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcbiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5ncywgZm9sbG93ZWQgYnlcbiAgIHRoZSBzdHJpbmcgaXRzZWxmLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbnN0ci5yc3BsaXQoW3NlcFssIG1heHNwbGl0XV0pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAqbWF4c3BsaXQqIHNwbGl0c1xuICAgYXJlIGRvbmUsIHRoZSAqcmlnaHRtb3N0KiBvbmVzLiAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvclxuICAgYGBOb25lYGAsIGFueSB3aGl0ZXNwYWNlIHN0cmluZyBpcyBhIHNlcGFyYXRvci4gIEV4Y2VwdCBmb3JcbiAgIHNwbGl0dGluZyBmcm9tIHRoZSByaWdodCwgYGByc3BsaXQoKWBgIGJlaGF2ZXMgbGlrZSBgYHNwbGl0KClgYFxuICAgd2hpY2ggaXMgZGVzY3JpYmVkIGluIGRldGFpbCBiZWxvdy5cblxuICAgTmV3IGluIHZlcnNpb24gMi40LlxuXG5zdHIucnN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRyYWlsaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgc3VmZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLnJzdHJpcCgpXG4gICBcJyAgIHNwYWNpb3VzXCdcbiAgID4+PiBcJ21pc3Npc3NpcHBpXCcucnN0cmlwKFwnaXB6XCcpXG4gICBcJ21pc3Npc3NcJ1xuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yLjI6IFN1cHBvcnQgZm9yIHRoZSAqY2hhcnMqIGFyZ3VtZW50LlxuXG5zdHIuc3BsaXQoW3NlcFssIG1heHNwbGl0XV0pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KlxuICAgc3BsaXRzIGFyZSBkb25lICh0aHVzLCB0aGUgbGlzdCB3aWxsIGhhdmUgYXQgbW9zdCBgYG1heHNwbGl0KzFgYFxuICAgZWxlbWVudHMpLiAgSWYgKm1heHNwbGl0KiBpcyBub3Qgc3BlY2lmaWVkIG9yIGBgLTFgYCwgdGhlbiB0aGVyZSBpc1xuICAgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBzcGxpdHMgKGFsbCBwb3NzaWJsZSBzcGxpdHMgYXJlIG1hZGUpLlxuXG4gICBJZiAqc2VwKiBpcyBnaXZlbiwgY29uc2VjdXRpdmUgZGVsaW1pdGVycyBhcmUgbm90IGdyb3VwZWQgdG9nZXRoZXJcbiAgIGFuZCBhcmUgZGVlbWVkIHRvIGRlbGltaXQgZW1wdHkgc3RyaW5ncyAoZm9yIGV4YW1wbGUsXG4gICBgYFwnMSwsMlwnLnNwbGl0KFwnLFwnKWBgIHJldHVybnMgYGBbXCcxXCcsIFwnXCcsIFwnMlwnXWBgKS4gIFRoZSAqc2VwKlxuICAgYXJndW1lbnQgbWF5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgY2hhcmFjdGVycyAoZm9yIGV4YW1wbGUsXG4gICBgYFwnMTw+Mjw+M1wnLnNwbGl0KFwnPD5cJylgYCByZXR1cm5zIGBgW1wnMVwnLCBcJzJcJywgXCczXCddYGApLiBTcGxpdHRpbmdcbiAgIGFuIGVtcHR5IHN0cmluZyB3aXRoIGEgc3BlY2lmaWVkIHNlcGFyYXRvciByZXR1cm5zIGBgW1wnXCddYGAuXG5cbiAgIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgYGBOb25lYGAsIGEgZGlmZmVyZW50IHNwbGl0dGluZ1xuICAgYWxnb3JpdGhtIGlzIGFwcGxpZWQ6IHJ1bnMgb2YgY29uc2VjdXRpdmUgd2hpdGVzcGFjZSBhcmUgcmVnYXJkZWRcbiAgIGFzIGEgc2luZ2xlIHNlcGFyYXRvciwgYW5kIHRoZSByZXN1bHQgd2lsbCBjb250YWluIG5vIGVtcHR5IHN0cmluZ3NcbiAgIGF0IHRoZSBzdGFydCBvciBlbmQgaWYgdGhlIHN0cmluZyBoYXMgbGVhZGluZyBvciB0cmFpbGluZ1xuICAgd2hpdGVzcGFjZS4gIENvbnNlcXVlbnRseSwgc3BsaXR0aW5nIGFuIGVtcHR5IHN0cmluZyBvciBhIHN0cmluZ1xuICAgY29uc2lzdGluZyBvZiBqdXN0IHdoaXRlc3BhY2Ugd2l0aCBhIGBgTm9uZWBgIHNlcGFyYXRvciByZXR1cm5zXG4gICBgYFtdYGAuXG5cbiAgIEZvciBleGFtcGxlLCBgYFwnIDEgIDIgICAzICBcJy5zcGxpdCgpYGAgcmV0dXJucyBgYFtcJzFcJywgXCcyXCcsIFwnM1wnXWBgLFxuICAgYW5kIGBgXCcgIDEgIDIgICAzICBcJy5zcGxpdChOb25lLCAxKWBgIHJldHVybnMgYGBbXCcxXCcsIFwnMiAgIDMgIFwnXWBgLlxuXG5zdHIuc3BsaXRsaW5lcyhba2VlcGVuZHNdKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgc3RyaW5nLCBicmVha2luZyBhdCBsaW5lXG4gICBib3VuZGFyaWVzLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSAqdW5pdmVyc2FsIG5ld2xpbmVzKiBhcHByb2FjaCB0b1xuICAgc3BsaXR0aW5nIGxpbmVzLiBMaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdFxuICAgdW5sZXNzICprZWVwZW5kcyogaXMgZ2l2ZW4gYW5kIHRydWUuXG5cbiAgIEZvciBleGFtcGxlLCBgYFwnYWIgY1xcblxcbmRlIGZnXFxya2xcXHJcXG5cJy5zcGxpdGxpbmVzKClgYCByZXR1cm5zXG4gICBgYFtcJ2FiIGNcJywgXCdcJywgXCdkZSBmZ1wnLCBcJ2tsXCddYGAsIHdoaWxlIHRoZSBzYW1lIGNhbGwgd2l0aFxuICAgYGBzcGxpdGxpbmVzKFRydWUpYGAgcmV0dXJucyBgYFtcJ2FiIGNcXG5cJywgXCdcXG5cJywgXCdkZSBmZ1xcclwnLFxuICAgXCdrbFxcclxcblwnXWBgLlxuXG4gICBVbmxpa2UgYGBzcGxpdCgpYGAgd2hlbiBhIGRlbGltaXRlciBzdHJpbmcgKnNlcCogaXMgZ2l2ZW4sIHRoaXNcbiAgIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgZm9yIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBhIHRlcm1pbmFsXG4gICBsaW5lIGJyZWFrIGRvZXMgbm90IHJlc3VsdCBpbiBhbiBleHRyYSBsaW5lLlxuXG5zdHIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSAqcHJlZml4Kiwgb3RoZXJ3aXNlXG4gICByZXR1cm4gYGBGYWxzZWBgLiAqcHJlZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHByZWZpeGVzIHRvIGxvb2tcbiAgIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBzdHJpbmcgYmVnaW5uaW5nIGF0IHRoYXRcbiAgIHBvc2l0aW9uLiAgV2l0aCBvcHRpb25hbCAqZW5kKiwgc3RvcCBjb21wYXJpbmcgc3RyaW5nIGF0IHRoYXRcbiAgIHBvc2l0aW9uLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi41OiBBY2NlcHQgdHVwbGVzIGFzICpwcmVmaXgqLlxuXG5zdHIuc3RyaXAoW2NoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG4gICBjaGFyYWN0ZXJzIHJlbW92ZWQuIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlXG4gICBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSByZW1vdmVkLiBJZiBvbWl0dGVkIG9yIGBgTm9uZWBgLCB0aGVcbiAgICpjaGFycyogYXJndW1lbnQgZGVmYXVsdHMgdG8gcmVtb3Zpbmcgd2hpdGVzcGFjZS4gVGhlICpjaGFycypcbiAgIGFyZ3VtZW50IGlzIG5vdCBhIHByZWZpeCBvciBzdWZmaXg7IHJhdGhlciwgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHNcbiAgIHZhbHVlcyBhcmUgc3RyaXBwZWQ6XG5cbiAgID4+PiBcJyAgIHNwYWNpb3VzICAgXCcuc3RyaXAoKVxuICAgXCdzcGFjaW91c1wnXG4gICA+Pj4gXCd3d3cuZXhhbXBsZS5jb21cJy5zdHJpcChcJ2Ntb3d6LlwnKVxuICAgXCdleGFtcGxlXCdcblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMi4yOiBTdXBwb3J0IGZvciB0aGUgKmNoYXJzKiBhcmd1bWVudC5cblxuc3RyLnN3YXBjYXNlKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdXBwZXJjYXNlIGNoYXJhY3RlcnMgY29udmVydGVkIHRvXG4gICBsb3dlcmNhc2UgYW5kIHZpY2UgdmVyc2EuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIudGl0bGUoKVxuXG4gICBSZXR1cm4gYSB0aXRsZWNhc2VkIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGVyZSB3b3JkcyBzdGFydCB3aXRoIGFuXG4gICB1cHBlcmNhc2UgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIGxvd2VyY2FzZS5cblxuICAgVGhlIGFsZ29yaXRobSB1c2VzIGEgc2ltcGxlIGxhbmd1YWdlLWluZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYVxuICAgd29yZCBhcyBncm91cHMgb2YgY29uc2VjdXRpdmUgbGV0dGVycy4gIFRoZSBkZWZpbml0aW9uIHdvcmtzIGluXG4gICBtYW55IGNvbnRleHRzIGJ1dCBpdCBtZWFucyB0aGF0IGFwb3N0cm9waGVzIGluIGNvbnRyYWN0aW9ucyBhbmRcbiAgIHBvc3Nlc3NpdmVzIGZvcm0gd29yZCBib3VuZGFyaWVzLCB3aGljaCBtYXkgbm90IGJlIHRoZSBkZXNpcmVkXG4gICByZXN1bHQ6XG5cbiAgICAgID4+PiAidGhleVwncmUgYmlsbFwncyBmcmllbmRzIGZyb20gdGhlIFVLIi50aXRsZSgpXG4gICAgICAiVGhleVwnUmUgQmlsbFwnUyBGcmllbmRzIEZyb20gVGhlIFVrIlxuXG4gICBBIHdvcmthcm91bmQgZm9yIGFwb3N0cm9waGVzIGNhbiBiZSBjb25zdHJ1Y3RlZCB1c2luZyByZWd1bGFyXG4gICBleHByZXNzaW9uczpcblxuICAgICAgPj4+IGltcG9ydCByZVxuICAgICAgPj4+IGRlZiB0aXRsZWNhc2Uocyk6XG4gICAgICAuLi4gICAgIHJldHVybiByZS5zdWIociJbQS1aYS16XSsoXCdbQS1aYS16XSspPyIsXG4gICAgICAuLi4gICAgICAgICAgICAgICAgICAgbGFtYmRhIG1vOiBtby5ncm91cCgwKVswXS51cHBlcigpICtcbiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vLmdyb3VwKDApWzE6XS5sb3dlcigpLFxuICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHMpXG4gICAgICAuLi5cbiAgICAgID4+PiB0aXRsZWNhc2UoInRoZXlcJ3JlIGJpbGxcJ3MgZnJpZW5kcy4iKVxuICAgICAgIlRoZXlcJ3JlIEJpbGxcJ3MgRnJpZW5kcy4iXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIudHJhbnNsYXRlKHRhYmxlWywgZGVsZXRlY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgYWxsIGNoYXJhY3RlcnMgb2NjdXJyaW5nIGluIHRoZVxuICAgb3B0aW9uYWwgYXJndW1lbnQgKmRlbGV0ZWNoYXJzKiBhcmUgcmVtb3ZlZCwgYW5kIHRoZSByZW1haW5pbmdcbiAgIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZSxcbiAgIHdoaWNoIG11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDI1Ni5cblxuICAgWW91IGNhbiB1c2UgdGhlIGBgbWFrZXRyYW5zKClgYCBoZWxwZXIgZnVuY3Rpb24gaW4gdGhlIGBgc3RyaW5nYGBcbiAgIG1vZHVsZSB0byBjcmVhdGUgYSB0cmFuc2xhdGlvbiB0YWJsZS4gRm9yIHN0cmluZyBvYmplY3RzLCBzZXQgdGhlXG4gICAqdGFibGUqIGFyZ3VtZW50IHRvIGBgTm9uZWBgIGZvciB0cmFuc2xhdGlvbnMgdGhhdCBvbmx5IGRlbGV0ZVxuICAgY2hhcmFjdGVyczpcblxuICAgPj4+IFwncmVhZCB0aGlzIHNob3J0IHRleHRcJy50cmFuc2xhdGUoTm9uZSwgXCdhZWlvdVwnKVxuICAgXCdyZCB0aHMgc2hydCB0eHRcJ1xuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjY6IFN1cHBvcnQgZm9yIGEgYGBOb25lYGAgKnRhYmxlKiBhcmd1bWVudC5cblxuICAgRm9yIFVuaWNvZGUgb2JqZWN0cywgdGhlIGBgdHJhbnNsYXRlKClgYCBtZXRob2QgZG9lcyBub3QgYWNjZXB0IHRoZVxuICAgb3B0aW9uYWwgKmRlbGV0ZWNoYXJzKiBhcmd1bWVudC4gIEluc3RlYWQsIGl0IHJldHVybnMgYSBjb3B5IG9mIHRoZVxuICAgKnMqIHdoZXJlIGFsbCBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBtYXBwZWQgdGhyb3VnaCB0aGUgZ2l2ZW5cbiAgIHRyYW5zbGF0aW9uIHRhYmxlIHdoaWNoIG11c3QgYmUgYSBtYXBwaW5nIG9mIFVuaWNvZGUgb3JkaW5hbHMgdG9cbiAgIFVuaWNvZGUgb3JkaW5hbHMsIFVuaWNvZGUgc3RyaW5ncyBvciBgYE5vbmVgYC4gVW5tYXBwZWQgY2hhcmFjdGVyc1xuICAgYXJlIGxlZnQgdW50b3VjaGVkLiBDaGFyYWN0ZXJzIG1hcHBlZCB0byBgYE5vbmVgYCBhcmUgZGVsZXRlZC5cbiAgIE5vdGUsIGEgbW9yZSBmbGV4aWJsZSBhcHByb2FjaCBpcyB0byBjcmVhdGUgYSBjdXN0b20gY2hhcmFjdGVyXG4gICBtYXBwaW5nIGNvZGVjIHVzaW5nIHRoZSBgYGNvZGVjc2BgIG1vZHVsZSAoc2VlIGBgZW5jb2RpbmdzLmNwMTI1MWBgXG4gICBmb3IgYW4gZXhhbXBsZSkuXG5cbnN0ci51cHBlcigpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2FzZWQgY2hhcmFjdGVycyBbNF1cbiAgIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuICBOb3RlIHRoYXQgYGBzdHIudXBwZXIoKS5pc3VwcGVyKClgYCBtaWdodFxuICAgYmUgYGBGYWxzZWBgIGlmIGBgc2BgIGNvbnRhaW5zIHVuY2FzZWQgY2hhcmFjdGVycyBvciBpZiB0aGUgVW5pY29kZVxuICAgY2F0ZWdvcnkgb2YgdGhlIHJlc3VsdGluZyBjaGFyYWN0ZXIocykgaXMgbm90ICJMdSIgKExldHRlcixcbiAgIHVwcGVyY2FzZSksIGJ1dCBlLmcuICJMdCIgKExldHRlciwgdGl0bGVjYXNlKS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci56ZmlsbCh3aWR0aClcblxuICAgUmV0dXJuIHRoZSBudW1lcmljIHN0cmluZyBsZWZ0IGZpbGxlZCB3aXRoIHplcm9zIGluIGEgc3RyaW5nIG9mXG4gICBsZW5ndGggKndpZHRoKi4gIEEgc2lnbiBwcmVmaXggaXMgaGFuZGxlZCBjb3JyZWN0bHkuICBUaGUgb3JpZ2luYWxcbiAgIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgYGxlbihzKWBgLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjIuMi5cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBwcmVzZW50IG9ubHkgb24gdW5pY29kZSBvYmplY3RzOlxuXG51bmljb2RlLmlzbnVtZXJpYygpXG5cbiAgIFJldHVybiBgYFRydWVgYCBpZiB0aGVyZSBhcmUgb25seSBudW1lcmljIGNoYXJhY3RlcnMgaW4gUyxcbiAgIGBgRmFsc2VgYCBvdGhlcndpc2UuIE51bWVyaWMgY2hhcmFjdGVycyBpbmNsdWRlIGRpZ2l0IGNoYXJhY3RlcnMsXG4gICBhbmQgYWxsIGNoYXJhY3RlcnMgdGhhdCBoYXZlIHRoZSBVbmljb2RlIG51bWVyaWMgdmFsdWUgcHJvcGVydHksXG4gICBlLmcuIFUrMjE1NSwgVlVMR0FSIEZSQUNUSU9OIE9ORSBGSUZUSC5cblxudW5pY29kZS5pc2RlY2ltYWwoKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlcmUgYXJlIG9ubHkgZGVjaW1hbCBjaGFyYWN0ZXJzIGluIFMsXG4gICBgYEZhbHNlYGAgb3RoZXJ3aXNlLiBEZWNpbWFsIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLFxuICAgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZm9ybSBkZWNpbWFsLXJhZGl4IG51bWJlcnMsXG4gICBlLmcuIFUrMDY2MCwgQVJBQklDLUlORElDIERJR0lUIFpFUk8uXG4nLAorICdzdHJpbmdzJzogJ1xuU3RyaW5nIGxpdGVyYWxzXG4qKioqKioqKioqKioqKipcblxuU3RyaW5nIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZyBsZXhpY2FsIGRlZmluaXRpb25zOlxuXG4gICBzdHJpbmdsaXRlcmFsICAgOjo9IFtzdHJpbmdwcmVmaXhdKHNob3J0c3RyaW5nIHwgbG9uZ3N0cmluZylcbiAgIHN0cmluZ3ByZWZpeCAgICA6Oj0gInIiIHwgInUiIHwgInVyIiB8ICJSIiB8ICJVIiB8ICJVUiIgfCAiVXIiIHwgInVSIlxuICAgICAgICAgICAgICAgICAgICB8ICJiIiB8ICJCIiB8ICJiciIgfCAiQnIiIHwgImJSIiB8ICJCUiJcbiAgIHNob3J0c3RyaW5nICAgICA6Oj0gIlwnIiBzaG9ydHN0cmluZ2l0ZW0qICJcJyIgfCBcJyJcJyBzaG9ydHN0cmluZ2l0ZW0qIFwnIlwnXG4gICBsb25nc3RyaW5nICAgICAgOjo9ICJcJ1wnXCciIGxvbmdzdHJpbmdpdGVtKiAiXCdcJ1wnIlxuICAgICAgICAgICAgICAgICAgfCBcJyIiIlwnIGxvbmdzdHJpbmdpdGVtKiBcJyIiIlwnXG4gICBzaG9ydHN0cmluZ2l0ZW0gOjo9IHNob3J0c3RyaW5nY2hhciB8IGVzY2FwZXNlcVxuICAgbG9uZ3N0cmluZ2l0ZW0gIDo6PSBsb25nc3RyaW5nY2hhciB8IGVzY2FwZXNlcVxuICAgc2hvcnRzdHJpbmdjaGFyIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCIgb3IgbmV3bGluZSBvciB0aGUgcXVvdGU+XG4gICBsb25nc3RyaW5nY2hhciAgOjo9IDxhbnkgc291cmNlIGNoYXJhY3RlciBleGNlcHQgIlxcIj5cbiAgIGVzY2FwZXNlcSAgICAgICA6Oj0gIlxcIiA8YW55IEFTQ0lJIGNoYXJhY3Rlcj5cblxuT25lIHN5bnRhY3RpYyByZXN0cmljdGlvbiBub3QgaW5kaWNhdGVkIGJ5IHRoZXNlIHByb2R1Y3Rpb25zIGlzIHRoYXRcbndoaXRlc3BhY2UgaXMgbm90IGFsbG93ZWQgYmV0d2VlbiB0aGUgYGBzdHJpbmdwcmVmaXhgYCBhbmQgdGhlIHJlc3Qgb2ZcbnRoZSBzdHJpbmcgbGl0ZXJhbC4gVGhlIHNvdXJjZSBjaGFyYWN0ZXIgc2V0IGlzIGRlZmluZWQgYnkgdGhlXG5lbmNvZGluZyBkZWNsYXJhdGlvbjsgaXQgaXMgQVNDSUkgaWYgbm8gZW5jb2RpbmcgZGVjbGFyYXRpb24gaXMgZ2l2ZW5cbmluIHRoZSBzb3VyY2UgZmlsZTsgc2VlIHNlY3Rpb24gKkVuY29kaW5nIGRlY2xhcmF0aW9ucyouXG5cbkluIHBsYWluIEVuZ2xpc2g6IFN0cmluZyBsaXRlcmFscyBjYW4gYmUgZW5jbG9zZWQgaW4gbWF0Y2hpbmcgc2luZ2xlXG5xdW90ZXMgKGBgXCdgYCkgb3IgZG91YmxlIHF1b3RlcyAoYGAiYGApLiAgVGhleSBjYW4gYWxzbyBiZSBlbmNsb3NlZCBpblxubWF0Y2hpbmcgZ3JvdXBzIG9mIHRocmVlIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzICh0aGVzZSBhcmUgZ2VuZXJhbGx5XG5yZWZlcnJlZCB0byBhcyAqdHJpcGxlLXF1b3RlZCBzdHJpbmdzKikuICBUaGUgYmFja3NsYXNoIChgYFxcYGApXG5jaGFyYWN0ZXIgaXMgdXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyB0aGF0IG90aGVyd2lzZSBoYXZlIGEgc3BlY2lhbFxubWVhbmluZywgc3VjaCBhcyBuZXdsaW5lLCBiYWNrc2xhc2ggaXRzZWxmLCBvciB0aGUgcXVvdGUgY2hhcmFjdGVyLlxuU3RyaW5nIGxpdGVyYWxzIG1heSBvcHRpb25hbGx5IGJlIHByZWZpeGVkIHdpdGggYSBsZXR0ZXIgYGBcJ3JcJ2BgIG9yXG5gYFwnUlwnYGA7IHN1Y2ggc3RyaW5ncyBhcmUgY2FsbGVkICpyYXcgc3RyaW5ncyogYW5kIHVzZSBkaWZmZXJlbnQgcnVsZXNcbmZvciBpbnRlcnByZXRpbmcgYmFja3NsYXNoIGVzY2FwZSBzZXF1ZW5jZXMuICBBIHByZWZpeCBvZiBgYFwndVwnYGAgb3JcbmBgXCdVXCdgYCBtYWtlcyB0aGUgc3RyaW5nIGEgVW5pY29kZSBzdHJpbmcuICBVbmljb2RlIHN0cmluZ3MgdXNlIHRoZVxuVW5pY29kZSBjaGFyYWN0ZXIgc2V0IGFzIGRlZmluZWQgYnkgdGhlIFVuaWNvZGUgQ29uc29ydGl1bSBhbmQgSVNPXG4xMDY0Ni4gIFNvbWUgYWRkaXRpb25hbCBlc2NhcGUgc2VxdWVuY2VzLCBkZXNjcmliZWQgYmVsb3csIGFyZVxuYXZhaWxhYmxlIGluIFVuaWNvZGUgc3RyaW5ncy4gQSBwcmVmaXggb2YgYGBcJ2JcJ2BgIG9yIGBgXCdCXCdgYCBpc1xuaWdub3JlZCBpbiBQeXRob24gMjsgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGxpdGVyYWwgc2hvdWxkIGJlY29tZSBhXG5ieXRlcyBsaXRlcmFsIGluIFB5dGhvbiAzIChlLmcuIHdoZW4gY29kZSBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZFxud2l0aCAydG8zKS4gIEEgYGBcJ3VcJ2BgIG9yIGBgXCdiXCdgYCBwcmVmaXggbWF5IGJlIGZvbGxvd2VkIGJ5IGFuIGBgXCdyXCdgYFxucHJlZml4LlxuXG5JbiB0cmlwbGUtcXVvdGVkIHN0cmluZ3MsIHVuZXNjYXBlZCBuZXdsaW5lcyBhbmQgcXVvdGVzIGFyZSBhbGxvd2VkXG4oYW5kIGFyZSByZXRhaW5lZCksIGV4Y2VwdCB0aGF0IHRocmVlIHVuZXNjYXBlZCBxdW90ZXMgaW4gYSByb3dcbnRlcm1pbmF0ZSB0aGUgc3RyaW5nLiAgKEEgInF1b3RlIiBpcyB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gb3BlbiB0aGVcbnN0cmluZywgaS5lLiBlaXRoZXIgYGBcJ2BgIG9yIGBgImBgLilcblxuVW5sZXNzIGFuIGBgXCdyXCdgYCBvciBgYFwnUlwnYGAgcHJlZml4IGlzIHByZXNlbnQsIGVzY2FwZSBzZXF1ZW5jZXMgaW5cbnN0cmluZ3MgYXJlIGludGVycHJldGVkIGFjY29yZGluZyB0byBydWxlcyBzaW1pbGFyIHRvIHRob3NlIHVzZWQgYnlcblN0YW5kYXJkIEMuICBUaGUgcmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZTpcblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBFc2NhcGUgU2VxdWVuY2UgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgfFxuKz09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09K1xufCBgYFxcbmV3bGluZWBgICAgICAgfCBJZ25vcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXFxcYGAgICAgICAgICAgICB8IEJhY2tzbGFzaCAoYGBcXGBgKSAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXFwnYGAgICAgICAgICAgICB8IFNpbmdsZSBxdW90ZSAoYGBcJ2BgKSAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXCJgYCAgICAgICAgICAgIHwgRG91YmxlIHF1b3RlIChgYCJgYCkgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxhYGAgICAgICAgICAgICB8IEFTQ0lJIEJlbGwgKEJFTCkgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcYmBgICAgICAgICAgICAgfCBBU0NJSSBCYWNrc3BhY2UgKEJTKSAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXGZgYCAgICAgICAgICAgIHwgQVNDSUkgRm9ybWZlZWQgKEZGKSAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxuYGAgICAgICAgICAgICB8IEFTQ0lJIExpbmVmZWVkIChMRikgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcTntuYW1lfWBgICAgICAgfCBDaGFyYWN0ZXIgbmFtZWQgKm5hbWUqIGluIHRoZSAgICAgfCAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgfCBVbmljb2RlIGRhdGFiYXNlIChVbmljb2RlIG9ubHkpICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXHJgYCAgICAgICAgICAgIHwgQVNDSUkgQ2FycmlhZ2UgUmV0dXJuIChDUikgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFx0YGAgICAgICAgICAgICB8IEFTQ0lJIEhvcml6b250YWwgVGFiIChUQUIpICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcdXh4eHhgYCAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCAxNi1iaXQgaGV4IHZhbHVlICAgfCAoMSkgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgfCAqeHh4eCogKFVuaWNvZGUgb25seSkgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXFV4eHh4eHh4eGBgICAgIHwgQ2hhcmFjdGVyIHdpdGggMzItYml0IGhleCB2YWx1ZSAgIHwgKDIpICAgICB8XG58ICAgICAgICAgICAgICAgICAgIHwgKnh4eHh4eHh4KiAoVW5pY29kZSBvbmx5KSAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFx2YGAgICAgICAgICAgICB8IEFTQ0lJIFZlcnRpY2FsIFRhYiAoVlQpICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcb29vYGAgICAgICAgICAgfCBDaGFyYWN0ZXIgd2l0aCBvY3RhbCB2YWx1ZSAqb29vKiAgfCAoMyw1KSAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXHhoaGBgICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggaGV4IHZhbHVlICpoaCogICAgIHwgKDQsNSkgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG5cbk5vdGVzOlxuXG4xLiBJbmRpdmlkdWFsIGNvZGUgdW5pdHMgd2hpY2ggZm9ybSBwYXJ0cyBvZiBhIHN1cnJvZ2F0ZSBwYWlyIGNhbiBiZVxuICAgZW5jb2RlZCB1c2luZyB0aGlzIGVzY2FwZSBzZXF1ZW5jZS5cblxuMi4gQW55IFVuaWNvZGUgY2hhcmFjdGVyIGNhbiBiZSBlbmNvZGVkIHRoaXMgd2F5LCBidXQgY2hhcmFjdGVyc1xuICAgb3V0c2lkZSB0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChCTVApIHdpbGwgYmUgZW5jb2RlZCB1c2luZyBhXG4gICBzdXJyb2dhdGUgcGFpciBpZiBQeXRob24gaXMgY29tcGlsZWQgdG8gdXNlIDE2LWJpdCBjb2RlIHVuaXRzICh0aGVcbiAgIGRlZmF1bHQpLiAgSW5kaXZpZHVhbCBjb2RlIHVuaXRzIHdoaWNoIGZvcm0gcGFydHMgb2YgYSBzdXJyb2dhdGVcbiAgIHBhaXIgY2FuIGJlIGVuY29kZWQgdXNpbmcgdGhpcyBlc2NhcGUgc2VxdWVuY2UuXG5cbjMuIEFzIGluIFN0YW5kYXJkIEMsIHVwIHRvIHRocmVlIG9jdGFsIGRpZ2l0cyBhcmUgYWNjZXB0ZWQuXG5cbjQuIFVubGlrZSBpbiBTdGFuZGFyZCBDLCBleGFjdGx5IHR3byBoZXggZGlnaXRzIGFyZSByZXF1aXJlZC5cblxuNS4gSW4gYSBzdHJpbmcgbGl0ZXJhbCwgaGV4YWRlY2ltYWwgYW5kIG9jdGFsIGVzY2FwZXMgZGVub3RlIHRoZSBieXRlXG4gICB3aXRoIHRoZSBnaXZlbiB2YWx1ZTsgaXQgaXMgbm90IG5lY2Vzc2FyeSB0aGF0IHRoZSBieXRlIGVuY29kZXMgYVxuICAgY2hhcmFjdGVyIGluIHRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldC4gSW4gYSBVbmljb2RlIGxpdGVyYWwsIHRoZXNlXG4gICBlc2NhcGVzIGRlbm90ZSBhIFVuaWNvZGUgY2hhcmFjdGVyIHdpdGggdGhlIGdpdmVuIHZhbHVlLlxuXG5Vbmxpa2UgU3RhbmRhcmQgQywgYWxsIHVucmVjb2duaXplZCBlc2NhcGUgc2VxdWVuY2VzIGFyZSBsZWZ0IGluIHRoZVxuc3RyaW5nIHVuY2hhbmdlZCwgaS5lLiwgKnRoZSBiYWNrc2xhc2ggaXMgbGVmdCBpbiB0aGUgc3RyaW5nKi4gIChUaGlzXG5iZWhhdmlvciBpcyB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmc6IGlmIGFuIGVzY2FwZSBzZXF1ZW5jZSBpcyBtaXN0eXBlZCxcbnRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIG1vcmUgZWFzaWx5IHJlY29nbml6ZWQgYXMgYnJva2VuLikgIEl0IGlzIGFsc29cbmltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgbWFya2VkIGFzICIoVW5pY29kZSBvbmx5KSJcbmluIHRoZSB0YWJsZSBhYm92ZSBmYWxsIGludG8gdGhlIGNhdGVnb3J5IG9mIHVucmVjb2duaXplZCBlc2NhcGVzIGZvclxubm9uLVVuaWNvZGUgc3RyaW5nIGxpdGVyYWxzLlxuXG5XaGVuIGFuIGBgXCdyXCdgYCBvciBgYFwnUlwnYGAgcHJlZml4IGlzIHByZXNlbnQsIGEgY2hhcmFjdGVyIGZvbGxvd2luZyBhXG5iYWNrc2xhc2ggaXMgaW5jbHVkZWQgaW4gdGhlIHN0cmluZyB3aXRob3V0IGNoYW5nZSwgYW5kICphbGxcbmJhY2tzbGFzaGVzIGFyZSBsZWZ0IGluIHRoZSBzdHJpbmcqLiAgRm9yIGV4YW1wbGUsIHRoZSBzdHJpbmcgbGl0ZXJhbFxuYGByIlxcbiJgYCBjb25zaXN0cyBvZiB0d28gY2hhcmFjdGVyczogYSBiYWNrc2xhc2ggYW5kIGEgbG93ZXJjYXNlXG5gYFwnblwnYGAuICBTdHJpbmcgcXVvdGVzIGNhbiBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2gsIGJ1dCB0aGVcbmJhY2tzbGFzaCByZW1haW5zIGluIHRoZSBzdHJpbmc7IGZvciBleGFtcGxlLCBgYHIiXFwiImBgIGlzIGEgdmFsaWRcbnN0cmluZyBsaXRlcmFsIGNvbnNpc3Rpbmcgb2YgdHdvIGNoYXJhY3RlcnM6IGEgYmFja3NsYXNoIGFuZCBhIGRvdWJsZVxucXVvdGU7IGBgciJcXCJgYCBpcyBub3QgYSB2YWxpZCBzdHJpbmcgbGl0ZXJhbCAoZXZlbiBhIHJhdyBzdHJpbmdcbmNhbm5vdCBlbmQgaW4gYW4gb2RkIG51bWJlciBvZiBiYWNrc2xhc2hlcykuICBTcGVjaWZpY2FsbHksICphIHJhd1xuc3RyaW5nIGNhbm5vdCBlbmQgaW4gYSBzaW5nbGUgYmFja3NsYXNoKiAoc2luY2UgdGhlIGJhY2tzbGFzaCB3b3VsZFxuZXNjYXBlIHRoZSBmb2xsb3dpbmcgcXVvdGUgY2hhcmFjdGVyKS4gIE5vdGUgYWxzbyB0aGF0IGEgc2luZ2xlXG5iYWNrc2xhc2ggZm9sbG93ZWQgYnkgYSBuZXdsaW5lIGlzIGludGVycHJldGVkIGFzIHRob3NlIHR3byBjaGFyYWN0ZXJzXG5hcyBwYXJ0IG9mIHRoZSBzdHJpbmcsICpub3QqIGFzIGEgbGluZSBjb250aW51YXRpb24uXG5cbldoZW4gYW4gYGBcJ3JcJ2BgIG9yIGBgXCdSXCdgYCBwcmVmaXggaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGFcbmBgXCd1XCdgYCBvciBgYFwnVVwnYGAgcHJlZml4LCB0aGVuIHRoZSBgYFxcdVhYWFhgYCBhbmQgYGBcXFVYWFhYWFhYWGBgXG5lc2NhcGUgc2VxdWVuY2VzIGFyZSBwcm9jZXNzZWQgd2hpbGUgICphbGwgb3RoZXIgYmFja3NsYXNoZXMgYXJlIGxlZnRcbmluIHRoZSBzdHJpbmcqLiBGb3IgZXhhbXBsZSwgdGhlIHN0cmluZyBsaXRlcmFsIGBgdXIiXFx1MDA2MlxcbiJgYFxuY29uc2lzdHMgb2YgdGhyZWUgVW5pY29kZSBjaGFyYWN0ZXJzOiBcJ0xBVElOIFNNQUxMIExFVFRFUiBCXCcsIFwnUkVWRVJTRVxuU09MSURVU1wnLCBhbmQgXCdMQVRJTiBTTUFMTCBMRVRURVIgTlwnLiBCYWNrc2xhc2hlcyBjYW4gYmUgZXNjYXBlZCB3aXRoXG5hIHByZWNlZGluZyBiYWNrc2xhc2g7IGhvd2V2ZXIsIGJvdGggcmVtYWluIGluIHRoZSBzdHJpbmcuICBBcyBhXG5yZXN1bHQsIGBgXFx1WFhYWGBgIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIG9ubHkgcmVjb2duaXplZCB3aGVuIHRoZXJlIGFyZVxuYW4gb2RkIG51bWJlciBvZiBiYWNrc2xhc2hlcy5cbicsCisgJ3N1YnNjcmlwdGlvbnMnOiAnXG5TdWJzY3JpcHRpb25zXG4qKioqKioqKioqKioqXG5cbkEgc3Vic2NyaXB0aW9uIHNlbGVjdHMgYW4gaXRlbSBvZiBhIHNlcXVlbmNlIChzdHJpbmcsIHR1cGxlIG9yIGxpc3QpXG5vciBtYXBwaW5nIChkaWN0aW9uYXJ5KSBvYmplY3Q6XG5cbiAgIHN1YnNjcmlwdGlvbiA6Oj0gcHJpbWFyeSAiWyIgZXhwcmVzc2lvbl9saXN0ICJdIlxuXG5UaGUgcHJpbWFyeSBtdXN0IGV2YWx1YXRlIHRvIGFuIG9iamVjdCBvZiBhIHNlcXVlbmNlIG9yIG1hcHBpbmcgdHlwZS5cblxuSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nLCB0aGUgZXhwcmVzc2lvbiBsaXN0IG11c3QgZXZhbHVhdGUgdG8gYW5cbm9iamVjdCB3aG9zZSB2YWx1ZSBpcyBvbmUgb2YgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcsIGFuZCB0aGVcbnN1YnNjcmlwdGlvbiBzZWxlY3RzIHRoZSB2YWx1ZSBpbiB0aGUgbWFwcGluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoYXRcbmtleS4gIChUaGUgZXhwcmVzc2lvbiBsaXN0IGlzIGEgdHVwbGUgZXhjZXB0IGlmIGl0IGhhcyBleGFjdGx5IG9uZVxuaXRlbS4pXG5cbklmIHRoZSBwcmltYXJ5IGlzIGEgc2VxdWVuY2UsIHRoZSBleHByZXNzaW9uIChsaXN0KSBtdXN0IGV2YWx1YXRlIHRvIGFcbnBsYWluIGludGVnZXIuICBJZiB0aGlzIHZhbHVlIGlzIG5lZ2F0aXZlLCB0aGUgbGVuZ3RoIG9mIHRoZSBzZXF1ZW5jZVxuaXMgYWRkZWQgdG8gaXQgKHNvIHRoYXQsIGUuZy4sIGBgeFstMV1gYCBzZWxlY3RzIHRoZSBsYXN0IGl0ZW0gb2ZcbmBgeGBgLikgIFRoZSByZXN1bHRpbmcgdmFsdWUgbXVzdCBiZSBhIG5vbm5lZ2F0aXZlIGludGVnZXIgbGVzcyB0aGFuXG50aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBzZXF1ZW5jZSwgYW5kIHRoZSBzdWJzY3JpcHRpb24gc2VsZWN0cyB0aGVcbml0ZW0gd2hvc2UgaW5kZXggaXMgdGhhdCB2YWx1ZSAoY291bnRpbmcgZnJvbSB6ZXJvKS5cblxuQSBzdHJpbmdcJ3MgaXRlbXMgYXJlIGNoYXJhY3RlcnMuICBBIGNoYXJhY3RlciBpcyBub3QgYSBzZXBhcmF0ZSBkYXRhXG50eXBlIGJ1dCBhIHN0cmluZyBvZiBleGFjdGx5IG9uZSBjaGFyYWN0ZXIuXG4nLAorICd0cnV0aCc6ICJcblRydXRoIFZhbHVlIFRlc3RpbmdcbioqKioqKioqKioqKioqKioqKipcblxuQW55IG9iamVjdCBjYW4gYmUgdGVzdGVkIGZvciB0cnV0aCB2YWx1ZSwgZm9yIHVzZSBpbiBhbiBgYGlmYGAgb3JcbmBgd2hpbGVgYCBjb25kaXRpb24gb3IgYXMgb3BlcmFuZCBvZiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zIGJlbG93LiBUaGVcbmZvbGxvd2luZyB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgZmFsc2U6XG5cbiogYGBOb25lYGBcblxuKiBgYEZhbHNlYGBcblxuKiB6ZXJvIG9mIGFueSBudW1lcmljIHR5cGUsIGZvciBleGFtcGxlLCBgYDBgYCwgYGAwTGBgLCBgYDAuMGBgLFxuICBgYDBqYGAuXG5cbiogYW55IGVtcHR5IHNlcXVlbmNlLCBmb3IgZXhhbXBsZSwgYGAnJ2BgLCBgYCgpYGAsIGBgW11gYC5cblxuKiBhbnkgZW1wdHkgbWFwcGluZywgZm9yIGV4YW1wbGUsIGBge31gYC5cblxuKiBpbnN0YW5jZXMgb2YgdXNlci1kZWZpbmVkIGNsYXNzZXMsIGlmIHRoZSBjbGFzcyBkZWZpbmVzIGFcbiAgYGBfX25vbnplcm9fXygpYGAgb3IgYGBfX2xlbl9fKClgYCBtZXRob2QsIHdoZW4gdGhhdCBtZXRob2QgcmV0dXJuc1xuICB0aGUgaW50ZWdlciB6ZXJvIG9yIGBgYm9vbGBgIHZhbHVlIGBgRmFsc2VgYC4gWzFdXG5cbkFsbCBvdGhlciB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgdHJ1ZSAtLS0gc28gb2JqZWN0cyBvZiBtYW55IHR5cGVzIGFyZVxuYWx3YXlzIHRydWUuXG5cbk9wZXJhdGlvbnMgYW5kIGJ1aWx0LWluIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYSBCb29sZWFuIHJlc3VsdCBhbHdheXNcbnJldHVybiBgYDBgYCBvciBgYEZhbHNlYGAgZm9yIGZhbHNlIGFuZCBgYDFgYCBvciBgYFRydWVgYCBmb3IgdHJ1ZSxcbnVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLiAoSW1wb3J0YW50IGV4Y2VwdGlvbjogdGhlIEJvb2xlYW4gb3BlcmF0aW9uc1xuYGBvcmBgIGFuZCBgYGFuZGBgIGFsd2F5cyByZXR1cm4gb25lIG9mIHRoZWlyIG9wZXJhbmRzLilcbiIsCisgJ3RyeSc6ICdcblRoZSBgYHRyeWBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBgYHRyeWBgIHN0YXRlbWVudCBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwIGNvZGVcbmZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHM6XG5cbiAgIHRyeV9zdG10ICA6Oj0gdHJ5MV9zdG10IHwgdHJ5Ml9zdG10XG4gICB0cnkxX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAoImV4Y2VwdCIgW2V4cHJlc3Npb24gWygiYXMiIHwgIiwiKSB0YXJnZXRdXSAiOiIgc3VpdGUpK1xuICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbiAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdXG4gICB0cnkyX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAiZmluYWxseSIgIjoiIHN1aXRlXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFB5dGhvbixcbmBgdHJ5YGAuLi5gYGV4Y2VwdGBgLi4uYGBmaW5hbGx5YGAgZGlkIG5vdCB3b3JrLiBgYHRyeWBgLi4uYGBleGNlcHRgYFxuaGFkIHRvIGJlIG5lc3RlZCBpbiBgYHRyeWBgLi4uYGBmaW5hbGx5YGAuXG5cblRoZSBgYGV4Y2VwdGBgIGNsYXVzZShzKSBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4Y2VwdGlvbiBoYW5kbGVycy4gV2hlblxubm8gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgYGB0cnlgYCBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzXG5leGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSBgYHRyeWBgIHN1aXRlLCBhIHNlYXJjaCBmb3JcbmFuIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIHN0YXJ0ZWQuICBUaGlzIHNlYXJjaCBpbnNwZWN0cyB0aGUgZXhjZXB0XG5jbGF1c2VzIGluIHR1cm4gdW50aWwgb25lIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLiAgQW5cbmV4cHJlc3Npb24tbGVzcyBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBtdXN0IGJlIGxhc3Q7IGl0IG1hdGNoZXNcbmFueSBleGNlcHRpb24uICBGb3IgYW4gZXhjZXB0IGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXRcbmV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLCBhbmQgdGhlIGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24gaWYgdGhlXG5yZXN1bHRpbmcgb2JqZWN0IGlzICJjb21wYXRpYmxlIiB3aXRoIHRoZSBleGNlcHRpb24uICBBbiBvYmplY3QgaXNcbmNvbXBhdGlibGUgd2l0aCBhbiBleGNlcHRpb24gaWYgaXQgaXMgdGhlIGNsYXNzIG9yIGEgYmFzZSBjbGFzcyBvZiB0aGVcbmV4Y2VwdGlvbiBvYmplY3QsIG9yIGEgdHVwbGUgY29udGFpbmluZyBhbiBpdGVtIGNvbXBhdGlibGUgd2l0aCB0aGVcbmV4Y2VwdGlvbi5cblxuSWYgbm8gZXhjZXB0IGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvblxuaGFuZGxlciBjb250aW51ZXMgaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uIHRoZSBpbnZvY2F0aW9uIHN0YWNrLlxuWzFdXG5cbklmIHRoZSBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gdGhlIGhlYWRlciBvZiBhbiBleGNlcHQgY2xhdXNlXG5yYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgYW5kXG5hIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvblxudGhlIGNhbGwgc3RhY2sgKGl0IGlzIHRyZWF0ZWQgYXMgaWYgdGhlIGVudGlyZSBgYHRyeWBgIHN0YXRlbWVudFxucmFpc2VkIHRoZSBleGNlcHRpb24pLlxuXG5XaGVuIGEgbWF0Y2hpbmcgZXhjZXB0IGNsYXVzZSBpcyBmb3VuZCwgdGhlIGV4Y2VwdGlvbiBpcyBhc3NpZ25lZCB0b1xudGhlIHRhcmdldCBzcGVjaWZpZWQgaW4gdGhhdCBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBhbmQgdGhlIGV4Y2VwdFxuY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLiAgQWxsIGV4Y2VwdCBjbGF1c2VzIG11c3QgaGF2ZSBhblxuZXhlY3V0YWJsZSBibG9jay4gIFdoZW4gdGhlIGVuZCBvZiB0aGlzIGJsb2NrIGlzIHJlYWNoZWQsIGV4ZWN1dGlvblxuY29udGludWVzIG5vcm1hbGx5IGFmdGVyIHRoZSBlbnRpcmUgdHJ5IHN0YXRlbWVudC4gIChUaGlzIG1lYW5zIHRoYXRcbmlmIHR3byBuZXN0ZWQgaGFuZGxlcnMgZXhpc3QgZm9yIHRoZSBzYW1lIGV4Y2VwdGlvbiwgYW5kIHRoZSBleGNlcHRpb25cbm9jY3VycyBpbiB0aGUgdHJ5IGNsYXVzZSBvZiB0aGUgaW5uZXIgaGFuZGxlciwgdGhlIG91dGVyIGhhbmRsZXIgd2lsbFxubm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLilcblxuQmVmb3JlIGFuIGV4Y2VwdCBjbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQsIGRldGFpbHMgYWJvdXQgdGhlXG5leGNlcHRpb24gYXJlIGFzc2lnbmVkIHRvIHRocmVlIHZhcmlhYmxlcyBpbiB0aGUgYGBzeXNgYCBtb2R1bGU6XG5gYHN5cy5leGNfdHlwZWBgIHJlY2VpdmVzIHRoZSBvYmplY3QgaWRlbnRpZnlpbmcgdGhlIGV4Y2VwdGlvbjtcbmBgc3lzLmV4Y192YWx1ZWBgIHJlY2VpdmVzIHRoZSBleGNlcHRpb25cJ3MgcGFyYW1ldGVyO1xuYGBzeXMuZXhjX3RyYWNlYmFja2BgIHJlY2VpdmVzIGEgdHJhY2ViYWNrIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZVxuc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKSBpZGVudGlmeWluZyB0aGUgcG9pbnQgaW4gdGhlIHByb2dyYW0gd2hlcmVcbnRoZSBleGNlcHRpb24gb2NjdXJyZWQuIFRoZXNlIGRldGFpbHMgYXJlIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlXG5gYHN5cy5leGNfaW5mbygpYGAgZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgYSB0dXBsZSBgYChleGNfdHlwZSxcbmV4Y192YWx1ZSwgZXhjX3RyYWNlYmFjaylgYC4gIFVzZSBvZiB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZXMgaXNcbmRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdGhpcyBmdW5jdGlvbiwgc2luY2UgdGhlaXIgdXNlIGlzIHVuc2FmZSBpbiBhXG50aHJlYWRlZCBwcm9ncmFtLiAgQXMgb2YgUHl0aG9uIDEuNSwgdGhlIHZhcmlhYmxlcyBhcmUgcmVzdG9yZWQgdG9cbnRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuIHJldHVybmluZyBmcm9tIGEgZnVuY3Rpb25cbnRoYXQgaGFuZGxlZCBhbiBleGNlcHRpb24uXG5cblRoZSBvcHRpb25hbCBgYGVsc2VgYCBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbCBmbG93cyBvZmZcbnRoZSBlbmQgb2YgdGhlIGBgdHJ5YGAgY2xhdXNlLiBbMl0gRXhjZXB0aW9ucyBpbiB0aGUgYGBlbHNlYGAgY2xhdXNlXG5hcmUgbm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBgYGV4Y2VwdGBgIGNsYXVzZXMuXG5cbklmIGBgZmluYWxseWBgIGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIFwnY2xlYW51cFwnIGhhbmRsZXIuICBUaGVcbmBgdHJ5YGAgY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55IGBgZXhjZXB0YGAgYW5kIGBgZWxzZWBgXG5jbGF1c2VzLiAgSWYgYW4gZXhjZXB0aW9uIG9jY3VycyBpbiBhbnkgb2YgdGhlIGNsYXVzZXMgYW5kIGlzIG5vdFxuaGFuZGxlZCwgdGhlIGV4Y2VwdGlvbiBpcyB0ZW1wb3JhcmlseSBzYXZlZC4gVGhlIGBgZmluYWxseWBgIGNsYXVzZSBpc1xuZXhlY3V0ZWQuICBJZiB0aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiwgaXQgaXMgcmUtcmFpc2VkIGF0IHRoZSBlbmRcbm9mIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UuIElmIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UgcmFpc2VzIGFub3RoZXJcbmV4Y2VwdGlvbiBvciBleGVjdXRlcyBhIGBgcmV0dXJuYGAgb3IgYGBicmVha2BgIHN0YXRlbWVudCwgdGhlIHNhdmVkXG5leGNlcHRpb24gaXMgZGlzY2FyZGVkOlxuXG4gICBkZWYgZigpOlxuICAgICAgIHRyeTpcbiAgICAgICAgICAgMS8wXG4gICAgICAgZmluYWxseTpcbiAgICAgICAgICAgcmV0dXJuIDQyXG5cbiAgID4+PiBmKClcbiAgIDQyXG5cblRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmdcbmV4ZWN1dGlvbiBvZiB0aGUgYGBmaW5hbGx5YGAgY2xhdXNlLlxuXG5XaGVuIGEgYGByZXR1cm5gYCwgYGBicmVha2BgIG9yIGBgY29udGludWVgYCBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgaW5cbnRoZSBgYHRyeWBgIHN1aXRlIG9mIGEgYGB0cnlgYC4uLmBgZmluYWxseWBgIHN0YXRlbWVudCwgdGhlXG5gYGZpbmFsbHlgYCBjbGF1c2UgaXMgYWxzbyBleGVjdXRlZCBcJ29uIHRoZSB3YXkgb3V0LlwnIEEgYGBjb250aW51ZWBgXG5zdGF0ZW1lbnQgaXMgaWxsZWdhbCBpbiB0aGUgYGBmaW5hbGx5YGAgY2xhdXNlLiAoVGhlIHJlYXNvbiBpcyBhXG5wcm9ibGVtIHdpdGggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gLS0tIHRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlXG5saWZ0ZWQgaW4gdGhlIGZ1dHVyZSkuXG5cbkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvblxuKkV4Y2VwdGlvbnMqLCBhbmQgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIGBgcmFpc2VgYCBzdGF0ZW1lbnQgdG9cbmdlbmVyYXRlIGV4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuJywKKyAndHlwZXMnOiAnXG5UaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHlcbioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5CZWxvdyBpcyBhIGxpc3Qgb2YgdGhlIHR5cGVzIHRoYXQgYXJlIGJ1aWx0IGludG8gUHl0aG9uLiAgRXh0ZW5zaW9uXG5tb2R1bGVzICh3cml0dGVuIGluIEMsIEphdmEsIG9yIG90aGVyIGxhbmd1YWdlcywgZGVwZW5kaW5nIG9uIHRoZVxuaW1wbGVtZW50YXRpb24pIGNhbiBkZWZpbmUgYWRkaXRpb25hbCB0eXBlcy4gIEZ1dHVyZSB2ZXJzaW9ucyBvZlxuUHl0aG9uIG1heSBhZGQgdHlwZXMgdG8gdGhlIHR5cGUgaGllcmFyY2h5IChlLmcuLCByYXRpb25hbCBudW1iZXJzLFxuZWZmaWNpZW50bHkgc3RvcmVkIGFycmF5cyBvZiBpbnRlZ2VycywgZXRjLikuXG5cblNvbWUgb2YgdGhlIHR5cGUgZGVzY3JpcHRpb25zIGJlbG93IGNvbnRhaW4gYSBwYXJhZ3JhcGggbGlzdGluZ1xuXCdzcGVjaWFsIGF0dHJpYnV0ZXMuXCcgIFRoZXNlIGFyZSBhdHRyaWJ1dGVzIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlXG5pbXBsZW1lbnRhdGlvbiBhbmQgYXJlIG5vdCBpbnRlbmRlZCBmb3IgZ2VuZXJhbCB1c2UuICBUaGVpciBkZWZpbml0aW9uXG5tYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuXG5cbk5vbmVcbiAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzXG4gICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbmFtZSBgYE5vbmVgYC5cbiAgIEl0IGlzIHVzZWQgdG8gc2lnbmlmeSB0aGUgYWJzZW5jZSBvZiBhIHZhbHVlIGluIG1hbnkgc2l0dWF0aW9ucyxcbiAgIGUuZy4sIGl0IGlzIHJldHVybmVkIGZyb20gZnVuY3Rpb25zIHRoYXQgZG9uXCd0IGV4cGxpY2l0bHkgcmV0dXJuXG4gICBhbnl0aGluZy4gSXRzIHRydXRoIHZhbHVlIGlzIGZhbHNlLlxuXG5Ob3RJbXBsZW1lbnRlZFxuICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXNcbiAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lXG4gICBgYE5vdEltcGxlbWVudGVkYGAuIE51bWVyaWMgbWV0aG9kcyBhbmQgcmljaCBjb21wYXJpc29uIG1ldGhvZHMgbWF5XG4gICByZXR1cm4gdGhpcyB2YWx1ZSBpZiB0aGV5IGRvIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgdGhlXG4gICBvcGVyYW5kcyBwcm92aWRlZC4gIChUaGUgaW50ZXJwcmV0ZXIgd2lsbCB0aGVuIHRyeSB0aGUgcmVmbGVjdGVkXG4gICBvcGVyYXRpb24sIG9yIHNvbWUgb3RoZXIgZmFsbGJhY2ssIGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0b3IuKSAgSXRzXG4gICB0cnV0aCB2YWx1ZSBpcyB0cnVlLlxuXG5FbGxpcHNpc1xuICAgVGhpcyB0eXBlIGhhcyBhIHNpbmdsZSB2YWx1ZS4gIFRoZXJlIGlzIGEgc2luZ2xlIG9iamVjdCB3aXRoIHRoaXNcbiAgIHZhbHVlLiBUaGlzIG9iamVjdCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBidWlsdC1pbiBuYW1lXG4gICBgYEVsbGlwc2lzYGAuIEl0IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHByZXNlbmNlIG9mIHRoZSBgYC4uLmBgXG4gICBzeW50YXggaW4gYSBzbGljZS4gIEl0cyB0cnV0aCB2YWx1ZSBpcyB0cnVlLlxuXG5gYG51bWJlcnMuTnVtYmVyYGBcbiAgIFRoZXNlIGFyZSBjcmVhdGVkIGJ5IG51bWVyaWMgbGl0ZXJhbHMgYW5kIHJldHVybmVkIGFzIHJlc3VsdHMgYnlcbiAgIGFyaXRobWV0aWMgb3BlcmF0b3JzIGFuZCBhcml0aG1ldGljIGJ1aWx0LWluIGZ1bmN0aW9ucy4gIE51bWVyaWNcbiAgIG9iamVjdHMgYXJlIGltbXV0YWJsZTsgb25jZSBjcmVhdGVkIHRoZWlyIHZhbHVlIG5ldmVyIGNoYW5nZXMuXG4gICBQeXRob24gbnVtYmVycyBhcmUgb2YgY291cnNlIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gbWF0aGVtYXRpY2FsXG4gICBudW1iZXJzLCBidXQgc3ViamVjdCB0byB0aGUgbGltaXRhdGlvbnMgb2YgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uXG4gICBpbiBjb21wdXRlcnMuXG5cbiAgIFB5dGhvbiBkaXN0aW5ndWlzaGVzIGJldHdlZW4gaW50ZWdlcnMsIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGFuZFxuICAgY29tcGxleCBudW1iZXJzOlxuXG4gICBgYG51bWJlcnMuSW50ZWdyYWxgYFxuICAgICAgVGhlc2UgcmVwcmVzZW50IGVsZW1lbnRzIGZyb20gdGhlIG1hdGhlbWF0aWNhbCBzZXQgb2YgaW50ZWdlcnNcbiAgICAgIChwb3NpdGl2ZSBhbmQgbmVnYXRpdmUpLlxuXG4gICAgICBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgaW50ZWdlcnM6XG5cbiAgICAgIFBsYWluIGludGVnZXJzXG4gICAgICAgICBUaGVzZSByZXByZXNlbnQgbnVtYmVycyBpbiB0aGUgcmFuZ2UgLTIxNDc0ODM2NDggdGhyb3VnaFxuICAgICAgICAgMjE0NzQ4MzY0Ny4gKFRoZSByYW5nZSBtYXkgYmUgbGFyZ2VyIG9uIG1hY2hpbmVzIHdpdGggYVxuICAgICAgICAgbGFyZ2VyIG5hdHVyYWwgd29yZCBzaXplLCBidXQgbm90IHNtYWxsZXIuKSAgV2hlbiB0aGUgcmVzdWx0XG4gICAgICAgICBvZiBhbiBvcGVyYXRpb24gd291bGQgZmFsbCBvdXRzaWRlIHRoaXMgcmFuZ2UsIHRoZSByZXN1bHQgaXNcbiAgICAgICAgIG5vcm1hbGx5IHJldHVybmVkIGFzIGEgbG9uZyBpbnRlZ2VyIChpbiBzb21lIGNhc2VzLCB0aGVcbiAgICAgICAgIGV4Y2VwdGlvbiBgYE92ZXJmbG93RXJyb3JgYCBpcyByYWlzZWQgaW5zdGVhZCkuICBGb3IgdGhlXG4gICAgICAgICBwdXJwb3NlIG9mIHNoaWZ0IGFuZCBtYXNrIG9wZXJhdGlvbnMsIGludGVnZXJzIGFyZSBhc3N1bWVkIHRvXG4gICAgICAgICBoYXZlIGEgYmluYXJ5LCAyXCdzIGNvbXBsZW1lbnQgbm90YXRpb24gdXNpbmcgMzIgb3IgbW9yZSBiaXRzLFxuICAgICAgICAgYW5kIGhpZGluZyBubyBiaXRzIGZyb20gdGhlIHVzZXIgKGkuZS4sIGFsbCA0Mjk0OTY3Mjk2XG4gICAgICAgICBkaWZmZXJlbnQgYml0IHBhdHRlcm5zIGNvcnJlc3BvbmQgdG8gZGlmZmVyZW50IHZhbHVlcykuXG5cbiAgICAgIExvbmcgaW50ZWdlcnNcbiAgICAgICAgIFRoZXNlIHJlcHJlc2VudCBudW1iZXJzIGluIGFuIHVubGltaXRlZCByYW5nZSwgc3ViamVjdCB0b1xuICAgICAgICAgYXZhaWxhYmxlICh2aXJ0dWFsKSBtZW1vcnkgb25seS4gIEZvciB0aGUgcHVycG9zZSBvZiBzaGlmdFxuICAgICAgICAgYW5kIG1hc2sgb3BlcmF0aW9ucywgYSBiaW5hcnkgcmVwcmVzZW50YXRpb24gaXMgYXNzdW1lZCwgYW5kXG4gICAgICAgICBuZWdhdGl2ZSBudW1iZXJzIGFyZSByZXByZXNlbnRlZCBpbiBhIHZhcmlhbnQgb2YgMlwnc1xuICAgICAgICAgY29tcGxlbWVudCB3aGljaCBnaXZlcyB0aGUgaWxsdXNpb24gb2YgYW4gaW5maW5pdGUgc3RyaW5nIG9mXG4gICAgICAgICBzaWduIGJpdHMgZXh0ZW5kaW5nIHRvIHRoZSBsZWZ0LlxuXG4gICAgICBCb29sZWFuc1xuICAgICAgICAgVGhlc2UgcmVwcmVzZW50IHRoZSB0cnV0aCB2YWx1ZXMgRmFsc2UgYW5kIFRydWUuICBUaGUgdHdvXG4gICAgICAgICBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgdmFsdWVzIEZhbHNlIGFuZCBUcnVlIGFyZSB0aGUgb25seVxuICAgICAgICAgQm9vbGVhbiBvYmplY3RzLiBUaGUgQm9vbGVhbiB0eXBlIGlzIGEgc3VidHlwZSBvZiBwbGFpblxuICAgICAgICAgaW50ZWdlcnMsIGFuZCBCb29sZWFuIHZhbHVlcyBiZWhhdmUgbGlrZSB0aGUgdmFsdWVzIDAgYW5kIDEsXG4gICAgICAgICByZXNwZWN0aXZlbHksIGluIGFsbW9zdCBhbGwgY29udGV4dHMsIHRoZSBleGNlcHRpb24gYmVpbmdcbiAgICAgICAgIHRoYXQgd2hlbiBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcsIHRoZSBzdHJpbmdzIGBgIkZhbHNlImBgIG9yXG4gICAgICAgICBgYCJUcnVlImBgIGFyZSByZXR1cm5lZCwgcmVzcGVjdGl2ZWx5LlxuXG4gICAgICBUaGUgcnVsZXMgZm9yIGludGVnZXIgcmVwcmVzZW50YXRpb24gYXJlIGludGVuZGVkIHRvIGdpdmUgdGhlXG4gICAgICBtb3N0IG1lYW5pbmdmdWwgaW50ZXJwcmV0YXRpb24gb2Ygc2hpZnQgYW5kIG1hc2sgb3BlcmF0aW9uc1xuICAgICAgaW52b2x2aW5nIG5lZ2F0aXZlIGludGVnZXJzIGFuZCB0aGUgbGVhc3Qgc3VycHJpc2VzIHdoZW5cbiAgICAgIHN3aXRjaGluZyBiZXR3ZWVuIHRoZSBwbGFpbiBhbmQgbG9uZyBpbnRlZ2VyIGRvbWFpbnMuICBBbnlcbiAgICAgIG9wZXJhdGlvbiwgaWYgaXQgeWllbGRzIGEgcmVzdWx0IGluIHRoZSBwbGFpbiBpbnRlZ2VyIGRvbWFpbixcbiAgICAgIHdpbGwgeWllbGQgdGhlIHNhbWUgcmVzdWx0IGluIHRoZSBsb25nIGludGVnZXIgZG9tYWluIG9yIHdoZW5cbiAgICAgIHVzaW5nIG1peGVkIG9wZXJhbmRzLiAgVGhlIHN3aXRjaCBiZXR3ZWVuIGRvbWFpbnMgaXMgdHJhbnNwYXJlbnRcbiAgICAgIHRvIHRoZSBwcm9ncmFtbWVyLlxuXG4gICBgYG51bWJlcnMuUmVhbGBgIChgYGZsb2F0YGApXG4gICAgICBUaGVzZSByZXByZXNlbnQgbWFjaGluZS1sZXZlbCBkb3VibGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50XG4gICAgICBudW1iZXJzLiBZb3UgYXJlIGF0IHRoZSBtZXJjeSBvZiB0aGUgdW5kZXJseWluZyBtYWNoaW5lXG4gICAgICBhcmNoaXRlY3R1cmUgKGFuZCBDIG9yIEphdmEgaW1wbGVtZW50YXRpb24pIGZvciB0aGUgYWNjZXB0ZWRcbiAgICAgIHJhbmdlIGFuZCBoYW5kbGluZyBvZiBvdmVyZmxvdy4gUHl0aG9uIGRvZXMgbm90IHN1cHBvcnQgc2luZ2xlLVxuICAgICAgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IG51bWJlcnM7IHRoZSBzYXZpbmdzIGluIHByb2Nlc3NvciBhbmRcbiAgICAgIG1lbW9yeSB1c2FnZSB0aGF0IGFyZSB1c3VhbGx5IHRoZSByZWFzb24gZm9yIHVzaW5nIHRoZXNlIGlzXG4gICAgICBkd2FyZmVkIGJ5IHRoZSBvdmVyaGVhZCBvZiB1c2luZyBvYmplY3RzIGluIFB5dGhvbiwgc28gdGhlcmUgaXNcbiAgICAgIG5vIHJlYXNvbiB0byBjb21wbGljYXRlIHRoZSBsYW5ndWFnZSB3aXRoIHR3byBraW5kcyBvZiBmbG9hdGluZ1xuICAgICAgcG9pbnQgbnVtYmVycy5cblxuICAgYGBudW1iZXJzLkNvbXBsZXhgYFxuICAgICAgVGhlc2UgcmVwcmVzZW50IGNvbXBsZXggbnVtYmVycyBhcyBhIHBhaXIgb2YgbWFjaGluZS1sZXZlbFxuICAgICAgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzLiAgVGhlIHNhbWUgY2F2ZWF0cyBhcHBseVxuICAgICAgYXMgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuIFRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgb2YgYVxuICAgICAgY29tcGxleCBudW1iZXIgYGB6YGAgY2FuIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSByZWFkLW9ubHlcbiAgICAgIGF0dHJpYnV0ZXMgYGB6LnJlYWxgYCBhbmQgYGB6LmltYWdgYC5cblxuU2VxdWVuY2VzXG4gICBUaGVzZSByZXByZXNlbnQgZmluaXRlIG9yZGVyZWQgc2V0cyBpbmRleGVkIGJ5IG5vbi1uZWdhdGl2ZVxuICAgbnVtYmVycy4gVGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgbGVuKClgYCByZXR1cm5zIHRoZSBudW1iZXIgb2ZcbiAgIGl0ZW1zIG9mIGEgc2VxdWVuY2UuIFdoZW4gdGhlIGxlbmd0aCBvZiBhIHNlcXVlbmNlIGlzICpuKiwgdGhlXG4gICBpbmRleCBzZXQgY29udGFpbnMgdGhlIG51bWJlcnMgMCwgMSwgLi4uLCAqbiotMS4gIEl0ZW0gKmkqIG9mXG4gICBzZXF1ZW5jZSAqYSogaXMgc2VsZWN0ZWQgYnkgYGBhW2ldYGAuXG5cbiAgIFNlcXVlbmNlcyBhbHNvIHN1cHBvcnQgc2xpY2luZzogYGBhW2k6al1gYCBzZWxlY3RzIGFsbCBpdGVtcyB3aXRoXG4gICBpbmRleCAqayogc3VjaCB0aGF0ICppKiBgYDw9YGAgKmsqIGBgPGBgICpqKi4gIFdoZW4gdXNlZCBhcyBhblxuICAgZXhwcmVzc2lvbiwgYSBzbGljZSBpcyBhIHNlcXVlbmNlIG9mIHRoZSBzYW1lIHR5cGUuICBUaGlzIGltcGxpZXNcbiAgIHRoYXQgdGhlIGluZGV4IHNldCBpcyByZW51bWJlcmVkIHNvIHRoYXQgaXQgc3RhcnRzIGF0IDAuXG5cbiAgIFNvbWUgc2VxdWVuY2VzIGFsc28gc3VwcG9ydCAiZXh0ZW5kZWQgc2xpY2luZyIgd2l0aCBhIHRoaXJkICJzdGVwIlxuICAgcGFyYW1ldGVyOiBgYGFbaTpqOmtdYGAgc2VsZWN0cyBhbGwgaXRlbXMgb2YgKmEqIHdpdGggaW5kZXggKngqXG4gICB3aGVyZSBgYHggPSBpICsgbiprYGAsICpuKiBgYD49YGAgYGAwYGAgYW5kICppKiBgYDw9YGAgKngqIGBgPGBgXG4gICAqaiouXG5cbiAgIFNlcXVlbmNlcyBhcmUgZGlzdGluZ3Vpc2hlZCBhY2NvcmRpbmcgdG8gdGhlaXIgbXV0YWJpbGl0eTpcblxuICAgSW1tdXRhYmxlIHNlcXVlbmNlc1xuICAgICAgQW4gb2JqZWN0IG9mIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlIGNhbm5vdCBjaGFuZ2Ugb25jZSBpdCBpc1xuICAgICAgY3JlYXRlZC4gIChJZiB0aGUgb2JqZWN0IGNvbnRhaW5zIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0cyxcbiAgICAgIHRoZXNlIG90aGVyIG9iamVjdHMgbWF5IGJlIG11dGFibGUgYW5kIG1heSBiZSBjaGFuZ2VkOyBob3dldmVyLFxuICAgICAgdGhlIGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBkaXJlY3RseSByZWZlcmVuY2VkIGJ5IGFuIGltbXV0YWJsZVxuICAgICAgb2JqZWN0IGNhbm5vdCBjaGFuZ2UuKVxuXG4gICAgICBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2VzOlxuXG4gICAgICBTdHJpbmdzXG4gICAgICAgICBUaGUgaXRlbXMgb2YgYSBzdHJpbmcgYXJlIGNoYXJhY3RlcnMuICBUaGVyZSBpcyBubyBzZXBhcmF0ZVxuICAgICAgICAgY2hhcmFjdGVyIHR5cGU7IGEgY2hhcmFjdGVyIGlzIHJlcHJlc2VudGVkIGJ5IGEgc3RyaW5nIG9mIG9uZVxuICAgICAgICAgaXRlbS4gQ2hhcmFjdGVycyByZXByZXNlbnQgKGF0IGxlYXN0KSA4LWJpdCBieXRlcy4gIFRoZVxuICAgICAgICAgYnVpbHQtaW4gZnVuY3Rpb25zIGBgY2hyKClgYCBhbmQgYGBvcmQoKWBgIGNvbnZlcnQgYmV0d2VlblxuICAgICAgICAgY2hhcmFjdGVycyBhbmQgbm9ubmVnYXRpdmUgaW50ZWdlcnMgcmVwcmVzZW50aW5nIHRoZSBieXRlXG4gICAgICAgICB2YWx1ZXMuICBCeXRlcyB3aXRoIHRoZSB2YWx1ZXMgMC0xMjcgdXN1YWxseSByZXByZXNlbnQgdGhlXG4gICAgICAgICBjb3JyZXNwb25kaW5nIEFTQ0lJIHZhbHVlcywgYnV0IHRoZSBpbnRlcnByZXRhdGlvbiBvZiB2YWx1ZXNcbiAgICAgICAgIGlzIHVwIHRvIHRoZSBwcm9ncmFtLiAgVGhlIHN0cmluZyBkYXRhIHR5cGUgaXMgYWxzbyB1c2VkIHRvXG4gICAgICAgICByZXByZXNlbnQgYXJyYXlzIG9mIGJ5dGVzLCBlLmcuLCB0byBob2xkIGRhdGEgcmVhZCBmcm9tIGFcbiAgICAgICAgIGZpbGUuXG5cbiAgICAgICAgIChPbiBzeXN0ZW1zIHdob3NlIG5hdGl2ZSBjaGFyYWN0ZXIgc2V0IGlzIG5vdCBBU0NJSSwgc3RyaW5nc1xuICAgICAgICAgbWF5IHVzZSBFQkNESUMgaW4gdGhlaXIgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24sIHByb3ZpZGVkIHRoZVxuICAgICAgICAgZnVuY3Rpb25zIGBgY2hyKClgYCBhbmQgYGBvcmQoKWBgIGltcGxlbWVudCBhIG1hcHBpbmcgYmV0d2VlblxuICAgICAgICAgQVNDSUkgYW5kIEVCQ0RJQywgYW5kIHN0cmluZyBjb21wYXJpc29uIHByZXNlcnZlcyB0aGUgQVNDSUlcbiAgICAgICAgIG9yZGVyLiBPciBwZXJoYXBzIHNvbWVvbmUgY2FuIHByb3Bvc2UgYSBiZXR0ZXIgcnVsZT8pXG5cbiAgICAgIFVuaWNvZGVcbiAgICAgICAgIFRoZSBpdGVtcyBvZiBhIFVuaWNvZGUgb2JqZWN0IGFyZSBVbmljb2RlIGNvZGUgdW5pdHMuICBBXG4gICAgICAgICBVbmljb2RlIGNvZGUgdW5pdCBpcyByZXByZXNlbnRlZCBieSBhIFVuaWNvZGUgb2JqZWN0IG9mIG9uZVxuICAgICAgICAgaXRlbSBhbmQgY2FuIGhvbGQgZWl0aGVyIGEgMTYtYml0IG9yIDMyLWJpdCB2YWx1ZVxuICAgICAgICAgcmVwcmVzZW50aW5nIGEgVW5pY29kZSBvcmRpbmFsICh0aGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhlXG4gICAgICAgICBvcmRpbmFsIGlzIGdpdmVuIGluIGBgc3lzLm1heHVuaWNvZGVgYCwgYW5kIGRlcGVuZHMgb24gaG93XG4gICAgICAgICBQeXRob24gaXMgY29uZmlndXJlZCBhdCBjb21waWxlIHRpbWUpLiAgU3Vycm9nYXRlIHBhaXJzIG1heVxuICAgICAgICAgYmUgcHJlc2VudCBpbiB0aGUgVW5pY29kZSBvYmplY3QsIGFuZCB3aWxsIGJlIHJlcG9ydGVkIGFzIHR3b1xuICAgICAgICAgc2VwYXJhdGUgaXRlbXMuICBUaGUgYnVpbHQtaW4gZnVuY3Rpb25zIGBgdW5pY2hyKClgYCBhbmRcbiAgICAgICAgIGBgb3JkKClgYCBjb252ZXJ0IGJldHdlZW4gY29kZSB1bml0cyBhbmQgbm9ubmVnYXRpdmUgaW50ZWdlcnNcbiAgICAgICAgIHJlcHJlc2VudGluZyB0aGUgVW5pY29kZSBvcmRpbmFscyBhcyBkZWZpbmVkIGluIHRoZSBVbmljb2RlXG4gICAgICAgICBTdGFuZGFyZCAzLjAuIENvbnZlcnNpb24gZnJvbSBhbmQgdG8gb3RoZXIgZW5jb2RpbmdzIGFyZVxuICAgICAgICAgcG9zc2libGUgdGhyb3VnaCB0aGUgVW5pY29kZSBtZXRob2QgYGBlbmNvZGUoKWBgIGFuZCB0aGVcbiAgICAgICAgIGJ1aWx0LWluIGZ1bmN0aW9uIGBgdW5pY29kZSgpYGAuXG5cbiAgICAgIFR1cGxlc1xuICAgICAgICAgVGhlIGl0ZW1zIG9mIGEgdHVwbGUgYXJlIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4gVHVwbGVzIG9mXG4gICAgICAgICB0d28gb3IgbW9yZSBpdGVtcyBhcmUgZm9ybWVkIGJ5IGNvbW1hLXNlcGFyYXRlZCBsaXN0cyBvZlxuICAgICAgICAgZXhwcmVzc2lvbnMuICBBIHR1cGxlIG9mIG9uZSBpdGVtIChhIFwnc2luZ2xldG9uXCcpIGNhbiBiZVxuICAgICAgICAgZm9ybWVkIGJ5IGFmZml4aW5nIGEgY29tbWEgdG8gYW4gZXhwcmVzc2lvbiAoYW4gZXhwcmVzc2lvbiBieVxuICAgICAgICAgaXRzZWxmIGRvZXMgbm90IGNyZWF0ZSBhIHR1cGxlLCBzaW5jZSBwYXJlbnRoZXNlcyBtdXN0IGJlXG4gICAgICAgICB1c2FibGUgZm9yIGdyb3VwaW5nIG9mIGV4cHJlc3Npb25zKS4gIEFuIGVtcHR5IHR1cGxlIGNhbiBiZVxuICAgICAgICAgZm9ybWVkIGJ5IGFuIGVtcHR5IHBhaXIgb2YgcGFyZW50aGVzZXMuXG5cbiAgIE11dGFibGUgc2VxdWVuY2VzXG4gICAgICBNdXRhYmxlIHNlcXVlbmNlcyBjYW4gYmUgY2hhbmdlZCBhZnRlciB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlXG4gICAgICBzdWJzY3JpcHRpb24gYW5kIHNsaWNpbmcgbm90YXRpb25zIGNhbiBiZSB1c2VkIGFzIHRoZSB0YXJnZXQgb2ZcbiAgICAgIGFzc2lnbm1lbnQgYW5kIGBgZGVsYGAgKGRlbGV0ZSkgc3RhdGVtZW50cy5cblxuICAgICAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gaW50cmluc2ljIG11dGFibGUgc2VxdWVuY2UgdHlwZXM6XG5cbiAgICAgIExpc3RzXG4gICAgICAgICBUaGUgaXRlbXMgb2YgYSBsaXN0IGFyZSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuICBMaXN0cyBhcmVcbiAgICAgICAgIGZvcm1lZCBieSBwbGFjaW5nIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMgaW5cbiAgICAgICAgIHNxdWFyZSBicmFja2V0cy4gKE5vdGUgdGhhdCB0aGVyZSBhcmUgbm8gc3BlY2lhbCBjYXNlcyBuZWVkZWRcbiAgICAgICAgIHRvIGZvcm0gbGlzdHMgb2YgbGVuZ3RoIDAgb3IgMS4pXG5cbiAgICAgIEJ5dGUgQXJyYXlzXG4gICAgICAgICBBIGJ5dGVhcnJheSBvYmplY3QgaXMgYSBtdXRhYmxlIGFycmF5LiBUaGV5IGFyZSBjcmVhdGVkIGJ5XG4gICAgICAgICB0aGUgYnVpbHQtaW4gYGBieXRlYXJyYXkoKWBgIGNvbnN0cnVjdG9yLiAgQXNpZGUgZnJvbSBiZWluZ1xuICAgICAgICAgbXV0YWJsZSAoYW5kIGhlbmNlIHVuaGFzaGFibGUpLCBieXRlIGFycmF5cyBvdGhlcndpc2UgcHJvdmlkZVxuICAgICAgICAgdGhlIHNhbWUgaW50ZXJmYWNlIGFuZCBmdW5jdGlvbmFsaXR5IGFzIGltbXV0YWJsZSBieXRlc1xuICAgICAgICAgb2JqZWN0cy5cblxuICAgICAgVGhlIGV4dGVuc2lvbiBtb2R1bGUgYGBhcnJheWBgIHByb3ZpZGVzIGFuIGFkZGl0aW9uYWwgZXhhbXBsZSBvZlxuICAgICAgYSBtdXRhYmxlIHNlcXVlbmNlIHR5cGUuXG5cblNldCB0eXBlc1xuICAgVGhlc2UgcmVwcmVzZW50IHVub3JkZXJlZCwgZmluaXRlIHNldHMgb2YgdW5pcXVlLCBpbW11dGFibGVcbiAgIG9iamVjdHMuIEFzIHN1Y2gsIHRoZXkgY2Fubm90IGJlIGluZGV4ZWQgYnkgYW55IHN1YnNjcmlwdC4gSG93ZXZlcixcbiAgIHRoZXkgY2FuIGJlIGl0ZXJhdGVkIG92ZXIsIGFuZCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBsZW4oKWBgXG4gICByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBzZXQuIENvbW1vbiB1c2VzIGZvciBzZXRzIGFyZSBmYXN0XG4gICBtZW1iZXJzaGlwIHRlc3RpbmcsIHJlbW92aW5nIGR1cGxpY2F0ZXMgZnJvbSBhIHNlcXVlbmNlLCBhbmRcbiAgIGNvbXB1dGluZyBtYXRoZW1hdGljYWwgb3BlcmF0aW9ucyBzdWNoIGFzIGludGVyc2VjdGlvbiwgdW5pb24sXG4gICBkaWZmZXJlbmNlLCBhbmQgc3ltbWV0cmljIGRpZmZlcmVuY2UuXG5cbiAgIEZvciBzZXQgZWxlbWVudHMsIHRoZSBzYW1lIGltbXV0YWJpbGl0eSBydWxlcyBhcHBseSBhcyBmb3JcbiAgIGRpY3Rpb25hcnkga2V5cy4gTm90ZSB0aGF0IG51bWVyaWMgdHlwZXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzIGZvclxuICAgbnVtZXJpYyBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCBgYDFgYCBhbmRcbiAgIGBgMS4wYGApLCBvbmx5IG9uZSBvZiB0aGVtIGNhbiBiZSBjb250YWluZWQgaW4gYSBzZXQuXG5cbiAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGludHJpbnNpYyBzZXQgdHlwZXM6XG5cbiAgIFNldHNcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBhIG11dGFibGUgc2V0LiBUaGV5IGFyZSBjcmVhdGVkIGJ5IHRoZSBidWlsdC1pblxuICAgICAgYGBzZXQoKWBgIGNvbnN0cnVjdG9yIGFuZCBjYW4gYmUgbW9kaWZpZWQgYWZ0ZXJ3YXJkcyBieSBzZXZlcmFsXG4gICAgICBtZXRob2RzLCBzdWNoIGFzIGBgYWRkKClgYC5cblxuICAgRnJvemVuIHNldHNcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBhbiBpbW11dGFibGUgc2V0LiAgVGhleSBhcmUgY3JlYXRlZCBieSB0aGVcbiAgICAgIGJ1aWx0LWluIGBgZnJvemVuc2V0KClgYCBjb25zdHJ1Y3Rvci4gIEFzIGEgZnJvemVuc2V0IGlzXG4gICAgICBpbW11dGFibGUgYW5kICpoYXNoYWJsZSosIGl0IGNhbiBiZSB1c2VkIGFnYWluIGFzIGFuIGVsZW1lbnQgb2ZcbiAgICAgIGFub3RoZXIgc2V0LCBvciBhcyBhIGRpY3Rpb25hcnkga2V5LlxuXG5NYXBwaW5nc1xuICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBzZXRzIG9mIG9iamVjdHMgaW5kZXhlZCBieSBhcmJpdHJhcnkgaW5kZXhcbiAgIHNldHMuIFRoZSBzdWJzY3JpcHQgbm90YXRpb24gYGBhW2tdYGAgc2VsZWN0cyB0aGUgaXRlbSBpbmRleGVkIGJ5XG4gICBgYGtgYCBmcm9tIHRoZSBtYXBwaW5nIGBgYWBgOyB0aGlzIGNhbiBiZSB1c2VkIGluIGV4cHJlc3Npb25zIGFuZFxuICAgYXMgdGhlIHRhcmdldCBvZiBhc3NpZ25tZW50cyBvciBgYGRlbGBgIHN0YXRlbWVudHMuIFRoZSBidWlsdC1pblxuICAgZnVuY3Rpb24gYGBsZW4oKWBgIHJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiBhIG1hcHBpbmcuXG5cbiAgIFRoZXJlIGlzIGN1cnJlbnRseSBhIHNpbmdsZSBpbnRyaW5zaWMgbWFwcGluZyB0eXBlOlxuXG4gICBEaWN0aW9uYXJpZXNcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgc2V0cyBvZiBvYmplY3RzIGluZGV4ZWQgYnkgbmVhcmx5XG4gICAgICBhcmJpdHJhcnkgdmFsdWVzLiAgVGhlIG9ubHkgdHlwZXMgb2YgdmFsdWVzIG5vdCBhY2NlcHRhYmxlIGFzXG4gICAgICBrZXlzIGFyZSB2YWx1ZXMgY29udGFpbmluZyBsaXN0cyBvciBkaWN0aW9uYXJpZXMgb3Igb3RoZXJcbiAgICAgIG11dGFibGUgdHlwZXMgdGhhdCBhcmUgY29tcGFyZWQgYnkgdmFsdWUgcmF0aGVyIHRoYW4gYnkgb2JqZWN0XG4gICAgICBpZGVudGl0eSwgdGhlIHJlYXNvbiBiZWluZyB0aGF0IHRoZSBlZmZpY2llbnQgaW1wbGVtZW50YXRpb24gb2ZcbiAgICAgIGRpY3Rpb25hcmllcyByZXF1aXJlcyBhIGtleVwncyBoYXNoIHZhbHVlIHRvIHJlbWFpbiBjb25zdGFudC5cbiAgICAgIE51bWVyaWMgdHlwZXMgdXNlZCBmb3Iga2V5cyBvYmV5IHRoZSBub3JtYWwgcnVsZXMgZm9yIG51bWVyaWNcbiAgICAgIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzIGNvbXBhcmUgZXF1YWwgKGUuZy4sIGBgMWBgIGFuZFxuICAgICAgYGAxLjBgYCkgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0byBpbmRleCB0aGUgc2FtZVxuICAgICAgZGljdGlvbmFyeSBlbnRyeS5cblxuICAgICAgRGljdGlvbmFyaWVzIGFyZSBtdXRhYmxlOyB0aGV5IGNhbiBiZSBjcmVhdGVkIGJ5IHRoZSBgYHsuLi59YGBcbiAgICAgIG5vdGF0aW9uIChzZWUgc2VjdGlvbiAqRGljdGlvbmFyeSBkaXNwbGF5cyopLlxuXG4gICAgICBUaGUgZXh0ZW5zaW9uIG1vZHVsZXMgYGBkYm1gYCwgYGBnZGJtYGAsIGFuZCBgYGJzZGRiYGAgcHJvdmlkZVxuICAgICAgYWRkaXRpb25hbCBleGFtcGxlcyBvZiBtYXBwaW5nIHR5cGVzLlxuXG5DYWxsYWJsZSB0eXBlc1xuICAgVGhlc2UgYXJlIHRoZSB0eXBlcyB0byB3aGljaCB0aGUgZnVuY3Rpb24gY2FsbCBvcGVyYXRpb24gKHNlZVxuICAgc2VjdGlvbiAqQ2FsbHMqKSBjYW4gYmUgYXBwbGllZDpcblxuICAgVXNlci1kZWZpbmVkIGZ1bmN0aW9uc1xuICAgICAgQSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IGlzIGNyZWF0ZWQgYnkgYSBmdW5jdGlvblxuICAgICAgZGVmaW5pdGlvbiAoc2VlIHNlY3Rpb24gKkZ1bmN0aW9uIGRlZmluaXRpb25zKikuICBJdCBzaG91bGQgYmVcbiAgICAgIGNhbGxlZCB3aXRoIGFuIGFyZ3VtZW50IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXNcbiAgICAgIGFzIHRoZSBmdW5jdGlvblwncyBmb3JtYWwgcGFyYW1ldGVyIGxpc3QuXG5cbiAgICAgIFNwZWNpYWwgYXR0cmlidXRlczpcblxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IEF0dHJpYnV0ZSAgICAgICAgICAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICs9PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09K1xuICAgICAgfCBgYGZ1bmNfZG9jYGAgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyBkb2N1bWVudGF0aW9uICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IHN0cmluZywgb3IgYGBOb25lYGAgaWYgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgdW5hdmFpbGFibGUgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBgYF9fZG9jX19gYCAgICAgICAgICAgICB8IEFub3RoZXIgd2F5IG9mIHNwZWxsaW5nICAgICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBmdW5jX2RvY2BgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBgYGZ1bmNfbmFtZWBgICAgICAgICAgICB8IFRoZSBmdW5jdGlvblwncyBuYW1lICAgICAgICAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IGBgX19uYW1lX19gYCAgICAgICAgICAgIHwgQW5vdGhlciB3YXkgb2Ygc3BlbGxpbmcgICAgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBgYGZ1bmNfbmFtZWBgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IGBgX19tb2R1bGVfX2BgICAgICAgICAgIHwgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvbiB3YXMgZGVmaW5lZCBpbiwgb3IgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgTm9uZWBgIGlmIHVuYXZhaWxhYmxlLiAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBmdW5jX2RlZmF1bHRzYGAgICAgICAgfCBBIHR1cGxlIGNvbnRhaW5pbmcgZGVmYXVsdCAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyZ3VtZW50IHZhbHVlcyBmb3IgdGhvc2UgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJndW1lbnRzIHRoYXQgaGF2ZSBkZWZhdWx0cywgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBvciBgYE5vbmVgYCBpZiBubyBhcmd1bWVudHMgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGhhdmUgYSBkZWZhdWx0IHZhbHVlICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBmdW5jX2NvZGVgYCAgICAgICAgICAgfCBUaGUgY29kZSBvYmplY3QgcmVwcmVzZW50aW5nICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoZSBjb21waWxlZCBmdW5jdGlvbiBib2R5LiAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBmdW5jX2dsb2JhbHNgYCAgICAgICAgfCBBIHJlZmVyZW5jZSB0byB0aGUgZGljdGlvbmFyeSAgIHwgUmVhZC1vbmx5ICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IHRoYXQgaG9sZHMgdGhlIGZ1bmN0aW9uXCdzICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGdsb2JhbCB2YXJpYWJsZXMgLS0tIHRoZSBnbG9iYWwgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgbmFtZXNwYWNlIG9mIHRoZSBtb2R1bGUgaW4gICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCB3aGljaCB0aGUgZnVuY3Rpb24gd2FzIGRlZmluZWQuIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IGBgZnVuY19kaWN0YGAgICAgICAgICAgIHwgVGhlIG5hbWVzcGFjZSBzdXBwb3J0aW5nICAgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmJpdHJhcnkgZnVuY3Rpb24gYXR0cmlidXRlcy4gIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IGBgZnVuY19jbG9zdXJlYGAgICAgICAgIHwgYGBOb25lYGAgb3IgYSB0dXBsZSBvZiBjZWxscyAgICB8IFJlYWQtb25seSAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGF0IGNvbnRhaW4gYmluZGluZ3MgZm9yIHRoZSAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uXCdzIGZyZWUgdmFyaWFibGVzLiAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG5cbiAgICAgIE1vc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgbGFiZWxsZWQgIldyaXRhYmxlIiBjaGVjayB0aGUgdHlwZSBvZiB0aGVcbiAgICAgIGFzc2lnbmVkIHZhbHVlLlxuXG4gICAgICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBgYGZ1bmNfbmFtZWBgIGlzIG5vdyB3cml0YWJsZS5cblxuICAgICAgRnVuY3Rpb24gb2JqZWN0cyBhbHNvIHN1cHBvcnQgZ2V0dGluZyBhbmQgc2V0dGluZyBhcmJpdHJhcnlcbiAgICAgIGF0dHJpYnV0ZXMsIHdoaWNoIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gYXR0YWNoIG1ldGFkYXRhXG4gICAgICB0byBmdW5jdGlvbnMuICBSZWd1bGFyIGF0dHJpYnV0ZSBkb3Qtbm90YXRpb24gaXMgdXNlZCB0byBnZXQgYW5kXG4gICAgICBzZXQgc3VjaCBhdHRyaWJ1dGVzLiAqTm90ZSB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9ubHlcbiAgICAgIHN1cHBvcnRzIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgb24gdXNlci1kZWZpbmVkIGZ1bmN0aW9ucy4gRnVuY3Rpb25cbiAgICAgIGF0dHJpYnV0ZXMgb24gYnVpbHQtaW4gZnVuY3Rpb25zIG1heSBiZSBzdXBwb3J0ZWQgaW4gdGhlXG4gICAgICBmdXR1cmUuKlxuXG4gICAgICBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGEgZnVuY3Rpb25cJ3MgZGVmaW5pdGlvbiBjYW4gYmVcbiAgICAgIHJldHJpZXZlZCBmcm9tIGl0cyBjb2RlIG9iamVjdDsgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBpbnRlcm5hbFxuICAgICAgdHlwZXMgYmVsb3cuXG5cbiAgIFVzZXItZGVmaW5lZCBtZXRob2RzXG4gICAgICBBIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGNvbWJpbmVzIGEgY2xhc3MsIGEgY2xhc3MgaW5zdGFuY2VcbiAgICAgIChvciBgYE5vbmVgYCkgYW5kIGFueSBjYWxsYWJsZSBvYmplY3QgKG5vcm1hbGx5IGEgdXNlci1kZWZpbmVkXG4gICAgICBmdW5jdGlvbikuXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6IGBgaW1fc2VsZmBgIGlzIHRoZSBjbGFzcyBpbnN0YW5jZVxuICAgICAgb2JqZWN0LCBgYGltX2Z1bmNgYCBpcyB0aGUgZnVuY3Rpb24gb2JqZWN0OyBgYGltX2NsYXNzYGAgaXMgdGhlXG4gICAgICBjbGFzcyBvZiBgYGltX3NlbGZgYCBmb3IgYm91bmQgbWV0aG9kcyBvciB0aGUgY2xhc3MgdGhhdCBhc2tlZFxuICAgICAgZm9yIHRoZSBtZXRob2QgZm9yIHVuYm91bmQgbWV0aG9kczsgYGBfX2RvY19fYGAgaXMgdGhlIG1ldGhvZFwnc1xuICAgICAgZG9jdW1lbnRhdGlvbiAoc2FtZSBhcyBgYGltX2Z1bmMuX19kb2NfX2BgKTsgYGBfX25hbWVfX2BgIGlzIHRoZVxuICAgICAgbWV0aG9kIG5hbWUgKHNhbWUgYXMgYGBpbV9mdW5jLl9fbmFtZV9fYGApOyBgYF9fbW9kdWxlX19gYCBpc1xuICAgICAgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGUgbWV0aG9kIHdhcyBkZWZpbmVkIGluLCBvciBgYE5vbmVgYCBpZlxuICAgICAgdW5hdmFpbGFibGUuXG5cbiAgICAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjI6IGBgaW1fc2VsZmBgIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGNsYXNzXG4gICAgICB0aGF0IGRlZmluZWQgdGhlIG1ldGhvZC5cblxuICAgICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNjogRm9yIFB5dGhvbiAzIGZvcndhcmQtY29tcGF0aWJpbGl0eSxcbiAgICAgIGBgaW1fZnVuY2BgIGlzIGFsc28gYXZhaWxhYmxlIGFzIGBgX19mdW5jX19gYCwgYW5kIGBgaW1fc2VsZmBgXG4gICAgICBhcyBgYF9fc2VsZl9fYGAuXG5cbiAgICAgIE1ldGhvZHMgYWxzbyBzdXBwb3J0IGFjY2Vzc2luZyAoYnV0IG5vdCBzZXR0aW5nKSB0aGUgYXJiaXRyYXJ5XG4gICAgICBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9uIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdC5cblxuICAgICAgVXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3RzIG1heSBiZSBjcmVhdGVkIHdoZW4gZ2V0dGluZyBhblxuICAgICAgYXR0cmlidXRlIG9mIGEgY2xhc3MgKHBlcmhhcHMgdmlhIGFuIGluc3RhbmNlIG9mIHRoYXQgY2xhc3MpLCBpZlxuICAgICAgdGhhdCBhdHRyaWJ1dGUgaXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0LCBhbiB1bmJvdW5kXG4gICAgICB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCwgb3IgYSBjbGFzcyBtZXRob2Qgb2JqZWN0LiBXaGVuIHRoZVxuICAgICAgYXR0cmlidXRlIGlzIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QsIGEgbmV3IG1ldGhvZCBvYmplY3RcbiAgICAgIGlzIG9ubHkgY3JlYXRlZCBpZiB0aGUgY2xhc3MgZnJvbSB3aGljaCBpdCBpcyBiZWluZyByZXRyaWV2ZWQgaXNcbiAgICAgIHRoZSBzYW1lIGFzLCBvciBhIGRlcml2ZWQgY2xhc3Mgb2YsIHRoZSBjbGFzcyBzdG9yZWQgaW4gdGhlXG4gICAgICBvcmlnaW5hbCBtZXRob2Qgb2JqZWN0OyBvdGhlcndpc2UsIHRoZSBvcmlnaW5hbCBtZXRob2Qgb2JqZWN0IGlzXG4gICAgICB1c2VkIGFzIGl0IGlzLlxuXG4gICAgICBXaGVuIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGFcbiAgICAgIHVzZXItZGVmaW5lZCBmdW5jdGlvbiBvYmplY3QgZnJvbSBhIGNsYXNzLCBpdHMgYGBpbV9zZWxmYGBcbiAgICAgIGF0dHJpYnV0ZSBpcyBgYE5vbmVgYCBhbmQgdGhlIG1ldGhvZCBvYmplY3QgaXMgc2FpZCB0byBiZVxuICAgICAgdW5ib3VuZC4gV2hlbiBvbmUgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGEgdXNlci1kZWZpbmVkXG4gICAgICBmdW5jdGlvbiBvYmplY3QgZnJvbSBhIGNsYXNzIHZpYSBvbmUgb2YgaXRzIGluc3RhbmNlcywgaXRzXG4gICAgICBgYGltX3NlbGZgYCBhdHRyaWJ1dGUgaXMgdGhlIGluc3RhbmNlLCBhbmQgdGhlIG1ldGhvZCBvYmplY3QgaXNcbiAgICAgIHNhaWQgdG8gYmUgYm91bmQuIEluIGVpdGhlciBjYXNlLCB0aGUgbmV3IG1ldGhvZFwncyBgYGltX2NsYXNzYGBcbiAgICAgIGF0dHJpYnV0ZSBpcyB0aGUgY2xhc3MgZnJvbSB3aGljaCB0aGUgcmV0cmlldmFsIHRha2VzIHBsYWNlLCBhbmRcbiAgICAgIGl0cyBgYGltX2Z1bmNgYCBhdHRyaWJ1dGUgaXMgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIG9iamVjdC5cblxuICAgICAgV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZ1xuICAgICAgYW5vdGhlciBtZXRob2Qgb2JqZWN0IGZyb20gYSBjbGFzcyBvciBpbnN0YW5jZSwgdGhlIGJlaGF2aW91ciBpc1xuICAgICAgdGhlIHNhbWUgYXMgZm9yIGEgZnVuY3Rpb24gb2JqZWN0LCBleGNlcHQgdGhhdCB0aGUgYGBpbV9mdW5jYGBcbiAgICAgIGF0dHJpYnV0ZSBvZiB0aGUgbmV3IGluc3RhbmNlIGlzIG5vdCB0aGUgb3JpZ2luYWwgbWV0aG9kIG9iamVjdFxuICAgICAgYnV0IGl0cyBgYGltX2Z1bmNgYCBhdHRyaWJ1dGUuXG5cbiAgICAgIFdoZW4gYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmcgYVxuICAgICAgY2xhc3MgbWV0aG9kIG9iamVjdCBmcm9tIGEgY2xhc3Mgb3IgaW5zdGFuY2UsIGl0cyBgYGltX3NlbGZgYFxuICAgICAgYXR0cmlidXRlIGlzIHRoZSBjbGFzcyBpdHNlbGYsIGFuZCBpdHMgYGBpbV9mdW5jYGAgYXR0cmlidXRlIGlzXG4gICAgICB0aGUgZnVuY3Rpb24gb2JqZWN0IHVuZGVybHlpbmcgdGhlIGNsYXNzIG1ldGhvZC5cblxuICAgICAgV2hlbiBhbiB1bmJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNhbGxlZCwgdGhlXG4gICAgICB1bmRlcmx5aW5nIGZ1bmN0aW9uIChgYGltX2Z1bmNgYCkgaXMgY2FsbGVkLCB3aXRoIHRoZVxuICAgICAgcmVzdHJpY3Rpb24gdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB0aGVcbiAgICAgIHByb3BlciBjbGFzcyAoYGBpbV9jbGFzc2BgKSBvciBvZiBhIGRlcml2ZWQgY2xhc3MgdGhlcmVvZi5cblxuICAgICAgV2hlbiBhIGJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNhbGxlZCwgdGhlXG4gICAgICB1bmRlcmx5aW5nIGZ1bmN0aW9uIChgYGltX2Z1bmNgYCkgaXMgY2FsbGVkLCBpbnNlcnRpbmcgdGhlIGNsYXNzXG4gICAgICBpbnN0YW5jZSAoYGBpbV9zZWxmYGApIGluIGZyb250IG9mIHRoZSBhcmd1bWVudCBsaXN0LiAgRm9yXG4gICAgICBpbnN0YW5jZSwgd2hlbiBgYENgYCBpcyBhIGNsYXNzIHdoaWNoIGNvbnRhaW5zIGEgZGVmaW5pdGlvbiBmb3JcbiAgICAgIGEgZnVuY3Rpb24gYGBmKClgYCwgYW5kIGBgeGBgIGlzIGFuIGluc3RhbmNlIG9mIGBgQ2BgLCBjYWxsaW5nXG4gICAgICBgYHguZigxKWBgIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgYEMuZih4LCAxKWBgLlxuXG4gICAgICBXaGVuIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgZGVyaXZlZCBmcm9tIGEgY2xhc3MgbWV0aG9kXG4gICAgICBvYmplY3QsIHRoZSAiY2xhc3MgaW5zdGFuY2UiIHN0b3JlZCBpbiBgYGltX3NlbGZgYCB3aWxsIGFjdHVhbGx5XG4gICAgICBiZSB0aGUgY2xhc3MgaXRzZWxmLCBzbyB0aGF0IGNhbGxpbmcgZWl0aGVyIGBgeC5mKDEpYGAgb3JcbiAgICAgIGBgQy5mKDEpYGAgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGBgZihDLDEpYGAgd2hlcmUgYGBmYGAgaXNcbiAgICAgIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uLlxuXG4gICAgICBOb3RlIHRoYXQgdGhlIHRyYW5zZm9ybWF0aW9uIGZyb20gZnVuY3Rpb24gb2JqZWN0IHRvICh1bmJvdW5kIG9yXG4gICAgICBib3VuZCkgbWV0aG9kIG9iamVjdCBoYXBwZW5zIGVhY2ggdGltZSB0aGUgYXR0cmlidXRlIGlzXG4gICAgICByZXRyaWV2ZWQgZnJvbSB0aGUgY2xhc3Mgb3IgaW5zdGFuY2UuIEluIHNvbWUgY2FzZXMsIGEgZnJ1aXRmdWxcbiAgICAgIG9wdGltaXphdGlvbiBpcyB0byBhc3NpZ24gdGhlIGF0dHJpYnV0ZSB0byBhIGxvY2FsIHZhcmlhYmxlIGFuZFxuICAgICAgY2FsbCB0aGF0IGxvY2FsIHZhcmlhYmxlLiBBbHNvIG5vdGljZSB0aGF0IHRoaXMgdHJhbnNmb3JtYXRpb25cbiAgICAgIG9ubHkgaGFwcGVucyBmb3IgdXNlci1kZWZpbmVkIGZ1bmN0aW9uczsgb3RoZXIgY2FsbGFibGUgb2JqZWN0c1xuICAgICAgKGFuZCBhbGwgbm9uLWNhbGxhYmxlIG9iamVjdHMpIGFyZSByZXRyaWV2ZWQgd2l0aG91dFxuICAgICAgdHJhbnNmb3JtYXRpb24uICBJdCBpcyBhbHNvIGltcG9ydGFudCB0byBub3RlIHRoYXQgdXNlci1kZWZpbmVkXG4gICAgICBmdW5jdGlvbnMgd2hpY2ggYXJlIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcyBpbnN0YW5jZSBhcmUgbm90XG4gICAgICBjb252ZXJ0ZWQgdG8gYm91bmQgbWV0aG9kczsgdGhpcyAqb25seSogaGFwcGVucyB3aGVuIHRoZVxuICAgICAgZnVuY3Rpb24gaXMgYW4gYXR0cmlidXRlIG9mIHRoZSBjbGFzcy5cblxuICAgR2VuZXJhdG9yIGZ1bmN0aW9uc1xuICAgICAgQSBmdW5jdGlvbiBvciBtZXRob2Qgd2hpY2ggdXNlcyB0aGUgYGB5aWVsZGBgIHN0YXRlbWVudCAoc2VlXG4gICAgICBzZWN0aW9uICpUaGUgeWllbGQgc3RhdGVtZW50KikgaXMgY2FsbGVkIGEgKmdlbmVyYXRvciBmdW5jdGlvbiouXG4gICAgICBTdWNoIGEgZnVuY3Rpb24sIHdoZW4gY2FsbGVkLCBhbHdheXMgcmV0dXJucyBhbiBpdGVyYXRvciBvYmplY3RcbiAgICAgIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uOiAgY2FsbGluZ1xuICAgICAgdGhlIGl0ZXJhdG9yXCdzIGBgbmV4dCgpYGAgbWV0aG9kIHdpbGwgY2F1c2UgdGhlIGZ1bmN0aW9uIHRvXG4gICAgICBleGVjdXRlIHVudGlsIGl0IHByb3ZpZGVzIGEgdmFsdWUgdXNpbmcgdGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQuXG4gICAgICBXaGVuIHRoZSBmdW5jdGlvbiBleGVjdXRlcyBhIGBgcmV0dXJuYGAgc3RhdGVtZW50IG9yIGZhbGxzIG9mZlxuICAgICAgdGhlIGVuZCwgYSBgYFN0b3BJdGVyYXRpb25gYCBleGNlcHRpb24gaXMgcmFpc2VkIGFuZCB0aGVcbiAgICAgIGl0ZXJhdG9yIHdpbGwgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHNldCBvZiB2YWx1ZXMgdG8gYmVcbiAgICAgIHJldHVybmVkLlxuXG4gICBCdWlsdC1pbiBmdW5jdGlvbnNcbiAgICAgIEEgYnVpbHQtaW4gZnVuY3Rpb24gb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYSBDIGZ1bmN0aW9uLlxuICAgICAgRXhhbXBsZXMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFyZSBgYGxlbigpYGAgYW5kIGBgbWF0aC5zaW4oKWBgXG4gICAgICAoYGBtYXRoYGAgaXMgYSBzdGFuZGFyZCBidWlsdC1pbiBtb2R1bGUpLiBUaGUgbnVtYmVyIGFuZCB0eXBlIG9mXG4gICAgICB0aGUgYXJndW1lbnRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBDIGZ1bmN0aW9uLiBTcGVjaWFsIHJlYWQtXG4gICAgICBvbmx5IGF0dHJpYnV0ZXM6IGBgX19kb2NfX2BgIGlzIHRoZSBmdW5jdGlvblwncyBkb2N1bWVudGF0aW9uXG4gICAgICBzdHJpbmcsIG9yIGBgTm9uZWBgIGlmIHVuYXZhaWxhYmxlOyBgYF9fbmFtZV9fYGAgaXMgdGhlXG4gICAgICBmdW5jdGlvblwncyBuYW1lOyBgYF9fc2VsZl9fYGAgaXMgc2V0IHRvIGBgTm9uZWBgIChidXQgc2VlIHRoZVxuICAgICAgbmV4dCBpdGVtKTsgYGBfX21vZHVsZV9fYGAgaXMgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0aGVcbiAgICAgIGZ1bmN0aW9uIHdhcyBkZWZpbmVkIGluIG9yIGBgTm9uZWBgIGlmIHVuYXZhaWxhYmxlLlxuXG4gICBCdWlsdC1pbiBtZXRob2RzXG4gICAgICBUaGlzIGlzIHJlYWxseSBhIGRpZmZlcmVudCBkaXNndWlzZSBvZiBhIGJ1aWx0LWluIGZ1bmN0aW9uLCB0aGlzXG4gICAgICB0aW1lIGNvbnRhaW5pbmcgYW4gb2JqZWN0IHBhc3NlZCB0byB0aGUgQyBmdW5jdGlvbiBhcyBhblxuICAgICAgaW1wbGljaXQgZXh0cmEgYXJndW1lbnQuICBBbiBleGFtcGxlIG9mIGEgYnVpbHQtaW4gbWV0aG9kIGlzXG4gICAgICBgYGFsaXN0LmFwcGVuZCgpYGAsIGFzc3VtaW5nICphbGlzdCogaXMgYSBsaXN0IG9iamVjdC4gSW4gdGhpc1xuICAgICAgY2FzZSwgdGhlIHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZSBgYF9fc2VsZl9fYGAgaXMgc2V0IHRvIHRoZVxuICAgICAgb2JqZWN0IGRlbm90ZWQgYnkgKmFsaXN0Ki5cblxuICAgQ2xhc3MgVHlwZXNcbiAgICAgIENsYXNzIHR5cGVzLCBvciAibmV3LXN0eWxlIGNsYXNzZXMsIiBhcmUgY2FsbGFibGUuICBUaGVzZVxuICAgICAgb2JqZWN0cyBub3JtYWxseSBhY3QgYXMgZmFjdG9yaWVzIGZvciBuZXcgaW5zdGFuY2VzIG9mXG4gICAgICB0aGVtc2VsdmVzLCBidXQgdmFyaWF0aW9ucyBhcmUgcG9zc2libGUgZm9yIGNsYXNzIHR5cGVzIHRoYXRcbiAgICAgIG92ZXJyaWRlIGBgX19uZXdfXygpYGAuICBUaGUgYXJndW1lbnRzIG9mIHRoZSBjYWxsIGFyZSBwYXNzZWQgdG9cbiAgICAgIGBgX19uZXdfXygpYGAgYW5kLCBpbiB0aGUgdHlwaWNhbCBjYXNlLCB0byBgYF9faW5pdF9fKClgYCB0b1xuICAgICAgaW5pdGlhbGl6ZSB0aGUgbmV3IGluc3RhbmNlLlxuXG4gICBDbGFzc2ljIENsYXNzZXNcbiAgICAgIENsYXNzIG9iamVjdHMgYXJlIGRlc2NyaWJlZCBiZWxvdy4gIFdoZW4gYSBjbGFzcyBvYmplY3QgaXNcbiAgICAgIGNhbGxlZCwgYSBuZXcgY2xhc3MgaW5zdGFuY2UgKGFsc28gZGVzY3JpYmVkIGJlbG93KSBpcyBjcmVhdGVkXG4gICAgICBhbmQgcmV0dXJuZWQuICBUaGlzIGltcGxpZXMgYSBjYWxsIHRvIHRoZSBjbGFzc1wncyBgYF9faW5pdF9fKClgYFxuICAgICAgbWV0aG9kIGlmIGl0IGhhcyBvbmUuICBBbnkgYXJndW1lbnRzIGFyZSBwYXNzZWQgb24gdG8gdGhlXG4gICAgICBgYF9faW5pdF9fKClgYCBtZXRob2QuICBJZiB0aGVyZSBpcyBubyBgYF9faW5pdF9fKClgYCBtZXRob2QsXG4gICAgICB0aGUgY2xhc3MgbXVzdCBiZSBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMuXG5cbiAgIENsYXNzIGluc3RhbmNlc1xuICAgICAgQ2xhc3MgaW5zdGFuY2VzIGFyZSBkZXNjcmliZWQgYmVsb3cuICBDbGFzcyBpbnN0YW5jZXMgYXJlXG4gICAgICBjYWxsYWJsZSBvbmx5IHdoZW4gdGhlIGNsYXNzIGhhcyBhIGBgX19jYWxsX18oKWBgIG1ldGhvZDtcbiAgICAgIGBgeChhcmd1bWVudHMpYGAgaXMgYSBzaG9ydGhhbmQgZm9yIGBgeC5fX2NhbGxfXyhhcmd1bWVudHMpYGAuXG5cbk1vZHVsZXNcbiAgIE1vZHVsZXMgYXJlIGltcG9ydGVkIGJ5IHRoZSBgYGltcG9ydGBgIHN0YXRlbWVudCAoc2VlIHNlY3Rpb24gKlRoZVxuICAgaW1wb3J0IHN0YXRlbWVudCopLiBBIG1vZHVsZSBvYmplY3QgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkIGJ5XG4gICBhIGRpY3Rpb25hcnkgb2JqZWN0ICh0aGlzIGlzIHRoZSBkaWN0aW9uYXJ5IHJlZmVyZW5jZWQgYnkgdGhlXG4gICBmdW5jX2dsb2JhbHMgYXR0cmlidXRlIG9mIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBtb2R1bGUpLlxuICAgQXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHRyYW5zbGF0ZWQgdG8gbG9va3VwcyBpbiB0aGlzIGRpY3Rpb25hcnksXG4gICBlLmcuLCBgYG0ueGBgIGlzIGVxdWl2YWxlbnQgdG8gYGBtLl9fZGljdF9fWyJ4Il1gYC4gQSBtb2R1bGUgb2JqZWN0XG4gICBkb2VzIG5vdCBjb250YWluIHRoZSBjb2RlIG9iamVjdCB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG1vZHVsZVxuICAgKHNpbmNlIGl0IGlzblwndCBuZWVkZWQgb25jZSB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSkuXG5cbiAgIEF0dHJpYnV0ZSBhc3NpZ25tZW50IHVwZGF0ZXMgdGhlIG1vZHVsZVwncyBuYW1lc3BhY2UgZGljdGlvbmFyeSxcbiAgIGUuZy4sIGBgbS54ID0gMWBgIGlzIGVxdWl2YWxlbnQgdG8gYGBtLl9fZGljdF9fWyJ4Il0gPSAxYGAuXG5cbiAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZTogYGBfX2RpY3RfX2BgIGlzIHRoZSBtb2R1bGVcJ3MgbmFtZXNwYWNlXG4gICBhcyBhIGRpY3Rpb25hcnkgb2JqZWN0LlxuXG4gICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEJlY2F1c2Ugb2YgdGhlIHdheSBDUHl0aG9uXG4gICBjbGVhcnMgbW9kdWxlIGRpY3Rpb25hcmllcywgdGhlIG1vZHVsZSBkaWN0aW9uYXJ5IHdpbGwgYmUgY2xlYXJlZFxuICAgd2hlbiB0aGUgbW9kdWxlIGZhbGxzIG91dCBvZiBzY29wZSBldmVuIGlmIHRoZSBkaWN0aW9uYXJ5IHN0aWxsIGhhc1xuICAgbGl2ZSByZWZlcmVuY2VzLiAgVG8gYXZvaWQgdGhpcywgY29weSB0aGUgZGljdGlvbmFyeSBvciBrZWVwIHRoZVxuICAgbW9kdWxlIGFyb3VuZCB3aGlsZSB1c2luZyBpdHMgZGljdGlvbmFyeSBkaXJlY3RseS5cblxuICAgUHJlZGVmaW5lZCAod3JpdGFibGUpIGF0dHJpYnV0ZXM6IGBgX19uYW1lX19gYCBpcyB0aGUgbW9kdWxlXCdzXG4gICBuYW1lOyBgYF9fZG9jX19gYCBpcyB0aGUgbW9kdWxlXCdzIGRvY3VtZW50YXRpb24gc3RyaW5nLCBvciBgYE5vbmVgYFxuICAgaWYgdW5hdmFpbGFibGU7IGBgX19maWxlX19gYCBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaFxuICAgdGhlIG1vZHVsZSB3YXMgbG9hZGVkLCBpZiBpdCB3YXMgbG9hZGVkIGZyb20gYSBmaWxlLiBUaGVcbiAgIGBgX19maWxlX19gYCBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnQgZm9yIEMgbW9kdWxlcyB0aGF0IGFyZVxuICAgc3RhdGljYWxseSBsaW5rZWQgaW50byB0aGUgaW50ZXJwcmV0ZXI7IGZvciBleHRlbnNpb24gbW9kdWxlc1xuICAgbG9hZGVkIGR5bmFtaWNhbGx5IGZyb20gYSBzaGFyZWQgbGlicmFyeSwgaXQgaXMgdGhlIHBhdGhuYW1lIG9mIHRoZVxuICAgc2hhcmVkIGxpYnJhcnkgZmlsZS5cblxuQ2xhc3Nlc1xuICAgQm90aCBjbGFzcyB0eXBlcyAobmV3LXN0eWxlIGNsYXNzZXMpIGFuZCBjbGFzcyBvYmplY3RzIChvbGQtXG4gICBzdHlsZS9jbGFzc2ljIGNsYXNzZXMpIGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBieSBjbGFzcyBkZWZpbml0aW9uc1xuICAgKHNlZSBzZWN0aW9uICpDbGFzcyBkZWZpbml0aW9ucyopLiAgQSBjbGFzcyBoYXMgYSBuYW1lc3BhY2VcbiAgIGltcGxlbWVudGVkIGJ5IGEgZGljdGlvbmFyeSBvYmplY3QuIENsYXNzIGF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZVxuICAgdHJhbnNsYXRlZCB0byBsb29rdXBzIGluIHRoaXMgZGljdGlvbmFyeSwgZS5nLiwgYGBDLnhgYCBpc1xuICAgdHJhbnNsYXRlZCB0byBgYEMuX19kaWN0X19bIngiXWBgIChhbHRob3VnaCBmb3IgbmV3LXN0eWxlIGNsYXNzZXNcbiAgIGluIHBhcnRpY3VsYXIgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIGhvb2tzIHdoaWNoIGFsbG93IGZvciBvdGhlclxuICAgbWVhbnMgb2YgbG9jYXRpbmcgYXR0cmlidXRlcykuIFdoZW4gdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIG5vdCBmb3VuZFxuICAgdGhlcmUsIHRoZSBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRpbnVlcyBpbiB0aGUgYmFzZSBjbGFzc2VzLiAgRm9yXG4gICBvbGQtc3R5bGUgY2xhc3NlcywgdGhlIHNlYXJjaCBpcyBkZXB0aC1maXJzdCwgbGVmdC10by1yaWdodCBpbiB0aGVcbiAgIG9yZGVyIG9mIG9jY3VycmVuY2UgaW4gdGhlIGJhc2UgY2xhc3MgbGlzdC4gTmV3LXN0eWxlIGNsYXNzZXMgdXNlXG4gICB0aGUgbW9yZSBjb21wbGV4IEMzIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyIHdoaWNoIGJlaGF2ZXMgY29ycmVjdGx5XG4gICBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiBcJ2RpYW1vbmRcJyBpbmhlcml0YW5jZSBzdHJ1Y3R1cmVzIHdoZXJlXG4gICB0aGVyZSBhcmUgbXVsdGlwbGUgaW5oZXJpdGFuY2UgcGF0aHMgbGVhZGluZyBiYWNrIHRvIGEgY29tbW9uXG4gICBhbmNlc3Rvci4gQWRkaXRpb25hbCBkZXRhaWxzIG9uIHRoZSBDMyBNUk8gdXNlZCBieSBuZXctc3R5bGVcbiAgIGNsYXNzZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBkb2N1bWVudGF0aW9uIGFjY29tcGFueWluZyB0aGUgMi4zXG4gICByZWxlYXNlIGF0IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb3dubG9hZC9yZWxlYXNlcy8yLjMvbXJvLy5cblxuICAgV2hlbiBhIGNsYXNzIGF0dHJpYnV0ZSByZWZlcmVuY2UgKGZvciBjbGFzcyBgYENgYCwgc2F5KSB3b3VsZCB5aWVsZFxuICAgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IG9yIGFuIHVuYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZFxuICAgb2JqZWN0IHdob3NlIGFzc29jaWF0ZWQgY2xhc3MgaXMgZWl0aGVyIGBgQ2BgIG9yIG9uZSBvZiBpdHMgYmFzZVxuICAgY2xhc3NlcywgaXQgaXMgdHJhbnNmb3JtZWQgaW50byBhbiB1bmJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2RcbiAgIG9iamVjdCB3aG9zZSBgYGltX2NsYXNzYGAgYXR0cmlidXRlIGlzIGBgQ2BgLiBXaGVuIGl0IHdvdWxkIHlpZWxkIGFcbiAgIGNsYXNzIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYSBib3VuZCB1c2VyLWRlZmluZWRcbiAgIG1ldGhvZCBvYmplY3Qgd2hvc2UgYGBpbV9zZWxmYGAgYXR0cmlidXRlIGlzIGBgQ2BgLiAgV2hlbiBpdCB3b3VsZFxuICAgeWllbGQgYSBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXQgaXMgdHJhbnNmb3JtZWQgaW50byB0aGUgb2JqZWN0XG4gICB3cmFwcGVkIGJ5IHRoZSBzdGF0aWMgbWV0aG9kIG9iamVjdC4gU2VlIHNlY3Rpb24gKkltcGxlbWVudGluZ1xuICAgRGVzY3JpcHRvcnMqIGZvciBhbm90aGVyIHdheSBpbiB3aGljaCBhdHRyaWJ1dGVzIHJldHJpZXZlZCBmcm9tIGFcbiAgIGNsYXNzIG1heSBkaWZmZXIgZnJvbSB0aG9zZSBhY3R1YWxseSBjb250YWluZWQgaW4gaXRzIGBgX19kaWN0X19gYFxuICAgKG5vdGUgdGhhdCBvbmx5IG5ldy1zdHlsZSBjbGFzc2VzIHN1cHBvcnQgZGVzY3JpcHRvcnMpLlxuXG4gICBDbGFzcyBhdHRyaWJ1dGUgYXNzaWdubWVudHMgdXBkYXRlIHRoZSBjbGFzc1wncyBkaWN0aW9uYXJ5LCBuZXZlclxuICAgdGhlIGRpY3Rpb25hcnkgb2YgYSBiYXNlIGNsYXNzLlxuXG4gICBBIGNsYXNzIG9iamVjdCBjYW4gYmUgY2FsbGVkIChzZWUgYWJvdmUpIHRvIHlpZWxkIGEgY2xhc3MgaW5zdGFuY2VcbiAgIChzZWUgYmVsb3cpLlxuXG4gICBTcGVjaWFsIGF0dHJpYnV0ZXM6IGBgX19uYW1lX19gYCBpcyB0aGUgY2xhc3MgbmFtZTsgYGBfX21vZHVsZV9fYGBcbiAgIGlzIHRoZSBtb2R1bGUgbmFtZSBpbiB3aGljaCB0aGUgY2xhc3Mgd2FzIGRlZmluZWQ7IGBgX19kaWN0X19gYCBpc1xuICAgdGhlIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgY2xhc3NcJ3MgbmFtZXNwYWNlOyBgYF9fYmFzZXNfX2BgIGlzIGFcbiAgIHR1cGxlIChwb3NzaWJseSBlbXB0eSBvciBhIHNpbmdsZXRvbikgY29udGFpbmluZyB0aGUgYmFzZSBjbGFzc2VzLFxuICAgaW4gdGhlIG9yZGVyIG9mIHRoZWlyIG9jY3VycmVuY2UgaW4gdGhlIGJhc2UgY2xhc3MgbGlzdDtcbiAgIGBgX19kb2NfX2BgIGlzIHRoZSBjbGFzc1wncyBkb2N1bWVudGF0aW9uIHN0cmluZywgb3IgTm9uZSBpZlxuICAgdW5kZWZpbmVkLlxuXG5DbGFzcyBpbnN0YW5jZXNcbiAgIEEgY2xhc3MgaW5zdGFuY2UgaXMgY3JlYXRlZCBieSBjYWxsaW5nIGEgY2xhc3Mgb2JqZWN0IChzZWUgYWJvdmUpLlxuICAgQSBjbGFzcyBpbnN0YW5jZSBoYXMgYSBuYW1lc3BhY2UgaW1wbGVtZW50ZWQgYXMgYSBkaWN0aW9uYXJ5IHdoaWNoXG4gICBpcyB0aGUgZmlyc3QgcGxhY2UgaW4gd2hpY2ggYXR0cmlidXRlIHJlZmVyZW5jZXMgYXJlIHNlYXJjaGVkLlxuICAgV2hlbiBhbiBhdHRyaWJ1dGUgaXMgbm90IGZvdW5kIHRoZXJlLCBhbmQgdGhlIGluc3RhbmNlXCdzIGNsYXNzIGhhc1xuICAgYW4gYXR0cmlidXRlIGJ5IHRoYXQgbmFtZSwgdGhlIHNlYXJjaCBjb250aW51ZXMgd2l0aCB0aGUgY2xhc3NcbiAgIGF0dHJpYnV0ZXMuICBJZiBhIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aGF0IGlzIGEgdXNlci1kZWZpbmVkXG4gICBmdW5jdGlvbiBvYmplY3Qgb3IgYW4gdW5ib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCB3aG9zZVxuICAgYXNzb2NpYXRlZCBjbGFzcyBpcyB0aGUgY2xhc3MgKGNhbGwgaXQgYGBDYGApIG9mIHRoZSBpbnN0YW5jZSBmb3JcbiAgIHdoaWNoIHRoZSBhdHRyaWJ1dGUgcmVmZXJlbmNlIHdhcyBpbml0aWF0ZWQgb3Igb25lIG9mIGl0cyBiYXNlcywgaXRcbiAgIGlzIHRyYW5zZm9ybWVkIGludG8gYSBib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCB3aG9zZVxuICAgYGBpbV9jbGFzc2BgIGF0dHJpYnV0ZSBpcyBgYENgYCBhbmQgd2hvc2UgYGBpbV9zZWxmYGAgYXR0cmlidXRlIGlzXG4gICB0aGUgaW5zdGFuY2UuIFN0YXRpYyBtZXRob2QgYW5kIGNsYXNzIG1ldGhvZCBvYmplY3RzIGFyZSBhbHNvXG4gICB0cmFuc2Zvcm1lZCwgYXMgaWYgdGhleSBoYWQgYmVlbiByZXRyaWV2ZWQgZnJvbSBjbGFzcyBgYENgYDsgc2VlXG4gICBhYm92ZSB1bmRlciAiQ2xhc3NlcyIuIFNlZSBzZWN0aW9uICpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqIGZvclxuICAgYW5vdGhlciB3YXkgaW4gd2hpY2ggYXR0cmlidXRlcyBvZiBhIGNsYXNzIHJldHJpZXZlZCB2aWEgaXRzXG4gICBpbnN0YW5jZXMgbWF5IGRpZmZlciBmcm9tIHRoZSBvYmplY3RzIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGVcbiAgIGNsYXNzXCdzIGBgX19kaWN0X19gYC4gSWYgbm8gY2xhc3MgYXR0cmlidXRlIGlzIGZvdW5kLCBhbmQgdGhlXG4gICBvYmplY3RcJ3MgY2xhc3MgaGFzIGEgYGBfX2dldGF0dHJfXygpYGAgbWV0aG9kLCB0aGF0IGlzIGNhbGxlZCB0b1xuICAgc2F0aXNmeSB0aGUgbG9va3VwLlxuXG4gICBBdHRyaWJ1dGUgYXNzaWdubWVudHMgYW5kIGRlbGV0aW9ucyB1cGRhdGUgdGhlIGluc3RhbmNlXCdzXG4gICBkaWN0aW9uYXJ5LCBuZXZlciBhIGNsYXNzXCdzIGRpY3Rpb25hcnkuICBJZiB0aGUgY2xhc3MgaGFzIGFcbiAgIGBgX19zZXRhdHRyX18oKWBgIG9yIGBgX19kZWxhdHRyX18oKWBgIG1ldGhvZCwgdGhpcyBpcyBjYWxsZWRcbiAgIGluc3RlYWQgb2YgdXBkYXRpbmcgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnkgZGlyZWN0bHkuXG5cbiAgIENsYXNzIGluc3RhbmNlcyBjYW4gcHJldGVuZCB0byBiZSBudW1iZXJzLCBzZXF1ZW5jZXMsIG9yIG1hcHBpbmdzXG4gICBpZiB0aGV5IGhhdmUgbWV0aG9kcyB3aXRoIGNlcnRhaW4gc3BlY2lhbCBuYW1lcy4gIFNlZSBzZWN0aW9uXG4gICAqU3BlY2lhbCBtZXRob2QgbmFtZXMqLlxuXG4gICBTcGVjaWFsIGF0dHJpYnV0ZXM6IGBgX19kaWN0X19gYCBpcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnk7XG4gICBgYF9fY2xhc3NfX2BgIGlzIHRoZSBpbnN0YW5jZVwncyBjbGFzcy5cblxuRmlsZXNcbiAgIEEgZmlsZSBvYmplY3QgcmVwcmVzZW50cyBhbiBvcGVuIGZpbGUuICBGaWxlIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnlcbiAgIHRoZSBgYG9wZW4oKWBgIGJ1aWx0LWluIGZ1bmN0aW9uLCBhbmQgYWxzbyBieSBgYG9zLnBvcGVuKClgYCxcbiAgIGBgb3MuZmRvcGVuKClgYCwgYW5kIHRoZSBgYG1ha2VmaWxlKClgYCBtZXRob2Qgb2Ygc29ja2V0IG9iamVjdHNcbiAgIChhbmQgcGVyaGFwcyBieSBvdGhlciBmdW5jdGlvbnMgb3IgbWV0aG9kcyBwcm92aWRlZCBieSBleHRlbnNpb25cbiAgIG1vZHVsZXMpLiAgVGhlIG9iamVjdHMgYGBzeXMuc3RkaW5gYCwgYGBzeXMuc3Rkb3V0YGAgYW5kXG4gICBgYHN5cy5zdGRlcnJgYCBhcmUgaW5pdGlhbGl6ZWQgdG8gZmlsZSBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlXG4gICBpbnRlcnByZXRlclwncyBzdGFuZGFyZCBpbnB1dCwgb3V0cHV0IGFuZCBlcnJvciBzdHJlYW1zLiAgU2VlICpGaWxlXG4gICBPYmplY3RzKiBmb3IgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBvZiBmaWxlIG9iamVjdHMuXG5cbkludGVybmFsIHR5cGVzXG4gICBBIGZldyB0eXBlcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIGludGVycHJldGVyIGFyZSBleHBvc2VkIHRvIHRoZVxuICAgdXNlci4gVGhlaXIgZGVmaW5pdGlvbnMgbWF5IGNoYW5nZSB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGVcbiAgIGludGVycHJldGVyLCBidXQgdGhleSBhcmUgbWVudGlvbmVkIGhlcmUgZm9yIGNvbXBsZXRlbmVzcy5cblxuICAgQ29kZSBvYmplY3RzXG4gICAgICBDb2RlIG9iamVjdHMgcmVwcmVzZW50ICpieXRlLWNvbXBpbGVkKiBleGVjdXRhYmxlIFB5dGhvbiBjb2RlLFxuICAgICAgb3IgKmJ5dGVjb2RlKi4gVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGNvZGUgb2JqZWN0IGFuZCBhXG4gICAgICBmdW5jdGlvbiBvYmplY3QgaXMgdGhhdCB0aGUgZnVuY3Rpb24gb2JqZWN0IGNvbnRhaW5zIGFuIGV4cGxpY2l0XG4gICAgICByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uXCdzIGdsb2JhbHMgKHRoZSBtb2R1bGUgaW4gd2hpY2ggaXQgd2FzXG4gICAgICBkZWZpbmVkKSwgd2hpbGUgYSBjb2RlIG9iamVjdCBjb250YWlucyBubyBjb250ZXh0OyBhbHNvIHRoZVxuICAgICAgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgZnVuY3Rpb24gb2JqZWN0LCBub3RcbiAgICAgIGluIHRoZSBjb2RlIG9iamVjdCAoYmVjYXVzZSB0aGV5IHJlcHJlc2VudCB2YWx1ZXMgY2FsY3VsYXRlZCBhdFxuICAgICAgcnVuLXRpbWUpLiAgVW5saWtlIGZ1bmN0aW9uIG9iamVjdHMsIGNvZGUgb2JqZWN0cyBhcmUgaW1tdXRhYmxlXG4gICAgICBhbmQgY29udGFpbiBubyByZWZlcmVuY2VzIChkaXJlY3RseSBvciBpbmRpcmVjdGx5KSB0byBtdXRhYmxlXG4gICAgICBvYmplY3RzLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiBgYGNvX25hbWVgYCBnaXZlcyB0aGUgZnVuY3Rpb25cbiAgICAgIG5hbWU7IGBgY29fYXJnY291bnRgYCBpcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4gICAgICAoaW5jbHVkaW5nIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzKTsgYGBjb19ubG9jYWxzYGAgaXMgdGhlXG4gICAgICBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIHVzZWQgYnkgdGhlIGZ1bmN0aW9uIChpbmNsdWRpbmdcbiAgICAgIGFyZ3VtZW50cyk7IGBgY29fdmFybmFtZXNgYCBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mXG4gICAgICB0aGUgbG9jYWwgdmFyaWFibGVzIChzdGFydGluZyB3aXRoIHRoZSBhcmd1bWVudCBuYW1lcyk7XG4gICAgICBgYGNvX2NlbGx2YXJzYGAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBsb2NhbFxuICAgICAgdmFyaWFibGVzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgbmVzdGVkIGZ1bmN0aW9ucztcbiAgICAgIGBgY29fZnJlZXZhcnNgYCBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGZyZWVcbiAgICAgIHZhcmlhYmxlczsgYGBjb19jb2RlYGAgaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBzZXF1ZW5jZSBvZlxuICAgICAgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zOyBgYGNvX2NvbnN0c2BgIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGVcbiAgICAgIGxpdGVyYWxzIHVzZWQgYnkgdGhlIGJ5dGVjb2RlOyBgYGNvX25hbWVzYGAgaXMgYSB0dXBsZVxuICAgICAgY29udGFpbmluZyB0aGUgbmFtZXMgdXNlZCBieSB0aGUgYnl0ZWNvZGU7IGBgY29fZmlsZW5hbWVgYCBpc1xuICAgICAgdGhlIGZpbGVuYW1lIGZyb20gd2hpY2ggdGhlIGNvZGUgd2FzIGNvbXBpbGVkO1xuICAgICAgYGBjb19maXJzdGxpbmVub2BgIGlzIHRoZSBmaXJzdCBsaW5lIG51bWJlciBvZiB0aGUgZnVuY3Rpb247XG4gICAgICBgYGNvX2xub3RhYmBgIGlzIGEgc3RyaW5nIGVuY29kaW5nIHRoZSBtYXBwaW5nIGZyb20gYnl0ZWNvZGVcbiAgICAgIG9mZnNldHMgdG8gbGluZSBudW1iZXJzIChmb3IgZGV0YWlscyBzZWUgdGhlIHNvdXJjZSBjb2RlIG9mIHRoZVxuICAgICAgaW50ZXJwcmV0ZXIpOyBgYGNvX3N0YWNrc2l6ZWBgIGlzIHRoZSByZXF1aXJlZCBzdGFjayBzaXplXG4gICAgICAoaW5jbHVkaW5nIGxvY2FsIHZhcmlhYmxlcyk7IGBgY29fZmxhZ3NgYCBpcyBhbiBpbnRlZ2VyIGVuY29kaW5nXG4gICAgICBhIG51bWJlciBvZiBmbGFncyBmb3IgdGhlIGludGVycHJldGVyLlxuXG4gICAgICBUaGUgZm9sbG93aW5nIGZsYWcgYml0cyBhcmUgZGVmaW5lZCBmb3IgYGBjb19mbGFnc2BgOiBiaXRcbiAgICAgIGBgMHgwNGBgIGlzIHNldCBpZiB0aGUgZnVuY3Rpb24gdXNlcyB0aGUgYGAqYXJndW1lbnRzYGAgc3ludGF4XG4gICAgICB0byBhY2NlcHQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50czsgYml0XG4gICAgICBgYDB4MDhgYCBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHVzZXMgdGhlIGBgKiprZXl3b3Jkc2BgIHN5bnRheFxuICAgICAgdG8gYWNjZXB0IGFyYml0cmFyeSBrZXl3b3JkIGFyZ3VtZW50czsgYml0IGBgMHgyMGBgIGlzIHNldCBpZlxuICAgICAgdGhlIGZ1bmN0aW9uIGlzIGEgZ2VuZXJhdG9yLlxuXG4gICAgICBGdXR1cmUgZmVhdHVyZSBkZWNsYXJhdGlvbnMgKGBgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydFxuICAgICAgZGl2aXNpb25gYCkgYWxzbyB1c2UgYml0cyBpbiBgYGNvX2ZsYWdzYGAgdG8gaW5kaWNhdGUgd2hldGhlciBhXG4gICAgICBjb2RlIG9iamVjdCB3YXMgY29tcGlsZWQgd2l0aCBhIHBhcnRpY3VsYXIgZmVhdHVyZSBlbmFibGVkOiBiaXRcbiAgICAgIGBgMHgyMDAwYGAgaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiB3YXMgY29tcGlsZWQgd2l0aCBmdXR1cmVcbiAgICAgIGRpdmlzaW9uIGVuYWJsZWQ7IGJpdHMgYGAweDEwYGAgYW5kIGBgMHgxMDAwYGAgd2VyZSB1c2VkIGluXG4gICAgICBlYXJsaWVyIHZlcnNpb25zIG9mIFB5dGhvbi5cblxuICAgICAgT3RoZXIgYml0cyBpbiBgYGNvX2ZsYWdzYGAgYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UuXG5cbiAgICAgIElmIGEgY29kZSBvYmplY3QgcmVwcmVzZW50cyBhIGZ1bmN0aW9uLCB0aGUgZmlyc3QgaXRlbSBpblxuICAgICAgYGBjb19jb25zdHNgYCBpcyB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmcgb2YgdGhlIGZ1bmN0aW9uLCBvclxuICAgICAgYGBOb25lYGAgaWYgdW5kZWZpbmVkLlxuXG4gICBGcmFtZSBvYmplY3RzXG4gICAgICBGcmFtZSBvYmplY3RzIHJlcHJlc2VudCBleGVjdXRpb24gZnJhbWVzLiAgVGhleSBtYXkgb2NjdXIgaW5cbiAgICAgIHRyYWNlYmFjayBvYmplY3RzIChzZWUgYmVsb3cpLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiBgYGZfYmFja2BgIGlzIHRvIHRoZSBwcmV2aW91c1xuICAgICAgc3RhY2sgZnJhbWUgKHRvd2FyZHMgdGhlIGNhbGxlciksIG9yIGBgTm9uZWBgIGlmIHRoaXMgaXMgdGhlXG4gICAgICBib3R0b20gc3RhY2sgZnJhbWU7IGBgZl9jb2RlYGAgaXMgdGhlIGNvZGUgb2JqZWN0IGJlaW5nIGV4ZWN1dGVkXG4gICAgICBpbiB0aGlzIGZyYW1lOyBgYGZfbG9jYWxzYGAgaXMgdGhlIGRpY3Rpb25hcnkgdXNlZCB0byBsb29rIHVwXG4gICAgICBsb2NhbCB2YXJpYWJsZXM7IGBgZl9nbG9iYWxzYGAgaXMgdXNlZCBmb3IgZ2xvYmFsIHZhcmlhYmxlcztcbiAgICAgIGBgZl9idWlsdGluc2BgIGlzIHVzZWQgZm9yIGJ1aWx0LWluIChpbnRyaW5zaWMpIG5hbWVzO1xuICAgICAgYGBmX3Jlc3RyaWN0ZWRgYCBpcyBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBmdW5jdGlvbiBpc1xuICAgICAgZXhlY3V0aW5nIGluIHJlc3RyaWN0ZWQgZXhlY3V0aW9uIG1vZGU7IGBgZl9sYXN0aWBgIGdpdmVzIHRoZVxuICAgICAgcHJlY2lzZSBpbnN0cnVjdGlvbiAodGhpcyBpcyBhbiBpbmRleCBpbnRvIHRoZSBieXRlY29kZSBzdHJpbmdcbiAgICAgIG9mIHRoZSBjb2RlIG9iamVjdCkuXG5cbiAgICAgIFNwZWNpYWwgd3JpdGFibGUgYXR0cmlidXRlczogYGBmX3RyYWNlYGAsIGlmIG5vdCBgYE5vbmVgYCwgaXMgYVxuICAgICAgZnVuY3Rpb24gY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBjb2RlIGxpbmUgKHRoaXMgaXNcbiAgICAgIHVzZWQgYnkgdGhlIGRlYnVnZ2VyKTsgYGBmX2V4Y190eXBlYGAsIGBgZl9leGNfdmFsdWVgYCxcbiAgICAgIGBgZl9leGNfdHJhY2ViYWNrYGAgcmVwcmVzZW50IHRoZSBsYXN0IGV4Y2VwdGlvbiByYWlzZWQgaW4gdGhlXG4gICAgICBwYXJlbnQgZnJhbWUgcHJvdmlkZWQgYW5vdGhlciBleGNlcHRpb24gd2FzIGV2ZXIgcmFpc2VkIGluIHRoZVxuICAgICAgY3VycmVudCBmcmFtZSAoaW4gYWxsIG90aGVyIGNhc2VzIHRoZXkgYXJlIE5vbmUpOyBgYGZfbGluZW5vYGBcbiAgICAgIGlzIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIG9mIHRoZSBmcmFtZSAtLS0gd3JpdGluZyB0byB0aGlzIGZyb21cbiAgICAgIHdpdGhpbiBhIHRyYWNlIGZ1bmN0aW9uIGp1bXBzIHRvIHRoZSBnaXZlbiBsaW5lIChvbmx5IGZvciB0aGVcbiAgICAgIGJvdHRvbS1tb3N0IGZyYW1lKS4gIEEgZGVidWdnZXIgY2FuIGltcGxlbWVudCBhIEp1bXAgY29tbWFuZFxuICAgICAgKGFrYSBTZXQgTmV4dCBTdGF0ZW1lbnQpIGJ5IHdyaXRpbmcgdG8gZl9saW5lbm8uXG5cbiAgIFRyYWNlYmFjayBvYmplY3RzXG4gICAgICBUcmFjZWJhY2sgb2JqZWN0cyByZXByZXNlbnQgYSBzdGFjayB0cmFjZSBvZiBhbiBleGNlcHRpb24uICBBXG4gICAgICB0cmFjZWJhY2sgb2JqZWN0IGlzIGNyZWF0ZWQgd2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLiAgV2hlbiB0aGVcbiAgICAgIHNlYXJjaCBmb3IgYW4gZXhjZXB0aW9uIGhhbmRsZXIgdW53aW5kcyB0aGUgZXhlY3V0aW9uIHN0YWNrLCBhdFxuICAgICAgZWFjaCB1bndvdW5kIGxldmVsIGEgdHJhY2ViYWNrIG9iamVjdCBpcyBpbnNlcnRlZCBpbiBmcm9udCBvZlxuICAgICAgdGhlIGN1cnJlbnQgdHJhY2ViYWNrLiAgV2hlbiBhbiBleGNlcHRpb24gaGFuZGxlciBpcyBlbnRlcmVkLFxuICAgICAgdGhlIHN0YWNrIHRyYWNlIGlzIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBwcm9ncmFtLiAoU2VlIHNlY3Rpb25cbiAgICAgICpUaGUgdHJ5IHN0YXRlbWVudCouKSBJdCBpcyBhY2Nlc3NpYmxlIGFzIGBgc3lzLmV4Y190cmFjZWJhY2tgYCxcbiAgICAgIGFuZCBhbHNvIGFzIHRoZSB0aGlyZCBpdGVtIG9mIHRoZSB0dXBsZSByZXR1cm5lZCBieVxuICAgICAgYGBzeXMuZXhjX2luZm8oKWBgLiAgVGhlIGxhdHRlciBpcyB0aGUgcHJlZmVycmVkIGludGVyZmFjZSxcbiAgICAgIHNpbmNlIGl0IHdvcmtzIGNvcnJlY3RseSB3aGVuIHRoZSBwcm9ncmFtIGlzIHVzaW5nIG11bHRpcGxlXG4gICAgICB0aHJlYWRzLiBXaGVuIHRoZSBwcm9ncmFtIGNvbnRhaW5zIG5vIHN1aXRhYmxlIGhhbmRsZXIsIHRoZVxuICAgICAgc3RhY2sgdHJhY2UgaXMgd3JpdHRlbiAobmljZWx5IGZvcm1hdHRlZCkgdG8gdGhlIHN0YW5kYXJkIGVycm9yXG4gICAgICBzdHJlYW07IGlmIHRoZSBpbnRlcnByZXRlciBpcyBpbnRlcmFjdGl2ZSwgaXQgaXMgYWxzbyBtYWRlXG4gICAgICBhdmFpbGFibGUgdG8gdGhlIHVzZXIgYXMgYGBzeXMubGFzdF90cmFjZWJhY2tgYC5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogYGB0Yl9uZXh0YGAgaXMgdGhlIG5leHQgbGV2ZWwgaW5cbiAgICAgIHRoZSBzdGFjayB0cmFjZSAodG93YXJkcyB0aGUgZnJhbWUgd2hlcmUgdGhlIGV4Y2VwdGlvblxuICAgICAgb2NjdXJyZWQpLCBvciBgYE5vbmVgYCBpZiB0aGVyZSBpcyBubyBuZXh0IGxldmVsOyBgYHRiX2ZyYW1lYGBcbiAgICAgIHBvaW50cyB0byB0aGUgZXhlY3V0aW9uIGZyYW1lIG9mIHRoZSBjdXJyZW50IGxldmVsO1xuICAgICAgYGB0Yl9saW5lbm9gYCBnaXZlcyB0aGUgbGluZSBudW1iZXIgd2hlcmUgdGhlIGV4Y2VwdGlvblxuICAgICAgb2NjdXJyZWQ7IGBgdGJfbGFzdGlgYCBpbmRpY2F0ZXMgdGhlIHByZWNpc2UgaW5zdHJ1Y3Rpb24uICBUaGVcbiAgICAgIGxpbmUgbnVtYmVyIGFuZCBsYXN0IGluc3RydWN0aW9uIGluIHRoZSB0cmFjZWJhY2sgbWF5IGRpZmZlclxuICAgICAgZnJvbSB0aGUgbGluZSBudW1iZXIgb2YgaXRzIGZyYW1lIG9iamVjdCBpZiB0aGUgZXhjZXB0aW9uXG4gICAgICBvY2N1cnJlZCBpbiBhIGBgdHJ5YGAgc3RhdGVtZW50IHdpdGggbm8gbWF0Y2hpbmcgZXhjZXB0IGNsYXVzZVxuICAgICAgb3Igd2l0aCBhIGZpbmFsbHkgY2xhdXNlLlxuXG4gICBTbGljZSBvYmplY3RzXG4gICAgICBTbGljZSBvYmplY3RzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBzbGljZXMgd2hlbiAqZXh0ZW5kZWQgc2xpY2VcbiAgICAgIHN5bnRheCogaXMgdXNlZC4gVGhpcyBpcyBhIHNsaWNlIHVzaW5nIHR3byBjb2xvbnMsIG9yIG11bHRpcGxlXG4gICAgICBzbGljZXMgb3IgZWxsaXBzZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcywgZS5nLiwgYGBhW2k6ajpzdGVwXWBgLFxuICAgICAgYGBhW2k6aiwgazpsXWBgLCBvciBgYGFbLi4uLCBpOmpdYGAuICBUaGV5IGFyZSBhbHNvIGNyZWF0ZWQgYnlcbiAgICAgIHRoZSBidWlsdC1pbiBgYHNsaWNlKClgYCBmdW5jdGlvbi5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogYGBzdGFydGBgIGlzIHRoZSBsb3dlciBib3VuZDtcbiAgICAgIGBgc3RvcGBgIGlzIHRoZSB1cHBlciBib3VuZDsgYGBzdGVwYGAgaXMgdGhlIHN0ZXAgdmFsdWU7IGVhY2ggaXNcbiAgICAgIGBgTm9uZWBgIGlmIG9taXR0ZWQuIFRoZXNlIGF0dHJpYnV0ZXMgY2FuIGhhdmUgYW55IHR5cGUuXG5cbiAgICAgIFNsaWNlIG9iamVjdHMgc3VwcG9ydCBvbmUgbWV0aG9kOlxuXG4gICAgICBzbGljZS5pbmRpY2VzKHNlbGYsIGxlbmd0aClcblxuICAgICAgICAgVGhpcyBtZXRob2QgdGFrZXMgYSBzaW5nbGUgaW50ZWdlciBhcmd1bWVudCAqbGVuZ3RoKiBhbmRcbiAgICAgICAgIGNvbXB1dGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBleHRlbmRlZCBzbGljZSB0aGF0IHRoZSBzbGljZVxuICAgICAgICAgb2JqZWN0IHdvdWxkIGRlc2NyaWJlIGlmIGFwcGxpZWQgdG8gYSBzZXF1ZW5jZSBvZiAqbGVuZ3RoKlxuICAgICAgICAgaXRlbXMuICBJdCByZXR1cm5zIGEgdHVwbGUgb2YgdGhyZWUgaW50ZWdlcnM7IHJlc3BlY3RpdmVseVxuICAgICAgICAgdGhlc2UgYXJlIHRoZSAqc3RhcnQqIGFuZCAqc3RvcCogaW5kaWNlcyBhbmQgdGhlICpzdGVwKiBvclxuICAgICAgICAgc3RyaWRlIGxlbmd0aCBvZiB0aGUgc2xpY2UuIE1pc3Npbmcgb3Igb3V0LW9mLWJvdW5kcyBpbmRpY2VzXG4gICAgICAgICBhcmUgaGFuZGxlZCBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggcmVndWxhciBzbGljZXMuXG5cbiAgICAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMy5cblxuICAgU3RhdGljIG1ldGhvZCBvYmplY3RzXG4gICAgICBTdGF0aWMgbWV0aG9kIG9iamVjdHMgcHJvdmlkZSBhIHdheSBvZiBkZWZlYXRpbmcgdGhlXG4gICAgICB0cmFuc2Zvcm1hdGlvbiBvZiBmdW5jdGlvbiBvYmplY3RzIHRvIG1ldGhvZCBvYmplY3RzIGRlc2NyaWJlZFxuICAgICAgYWJvdmUuIEEgc3RhdGljIG1ldGhvZCBvYmplY3QgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbnkgb3RoZXJcbiAgICAgIG9iamVjdCwgdXN1YWxseSBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0LiBXaGVuIGEgc3RhdGljXG4gICAgICBtZXRob2Qgb2JqZWN0IGlzIHJldHJpZXZlZCBmcm9tIGEgY2xhc3Mgb3IgYSBjbGFzcyBpbnN0YW5jZSwgdGhlXG4gICAgICBvYmplY3QgYWN0dWFsbHkgcmV0dXJuZWQgaXMgdGhlIHdyYXBwZWQgb2JqZWN0LCB3aGljaCBpcyBub3RcbiAgICAgIHN1YmplY3QgdG8gYW55IGZ1cnRoZXIgdHJhbnNmb3JtYXRpb24uIFN0YXRpYyBtZXRob2Qgb2JqZWN0cyBhcmVcbiAgICAgIG5vdCB0aGVtc2VsdmVzIGNhbGxhYmxlLCBhbHRob3VnaCB0aGUgb2JqZWN0cyB0aGV5IHdyYXAgdXN1YWxseVxuICAgICAgYXJlLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgdGhlIGJ1aWx0LWluXG4gICAgICBgYHN0YXRpY21ldGhvZCgpYGAgY29uc3RydWN0b3IuXG5cbiAgIENsYXNzIG1ldGhvZCBvYmplY3RzXG4gICAgICBBIGNsYXNzIG1ldGhvZCBvYmplY3QsIGxpa2UgYSBzdGF0aWMgbWV0aG9kIG9iamVjdCwgaXMgYSB3cmFwcGVyXG4gICAgICBhcm91bmQgYW5vdGhlciBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIHdheSBpbiB3aGljaCB0aGF0IG9iamVjdFxuICAgICAgaXMgcmV0cmlldmVkIGZyb20gY2xhc3NlcyBhbmQgY2xhc3MgaW5zdGFuY2VzLiBUaGUgYmVoYXZpb3VyIG9mXG4gICAgICBjbGFzcyBtZXRob2Qgb2JqZWN0cyB1cG9uIHN1Y2ggcmV0cmlldmFsIGlzIGRlc2NyaWJlZCBhYm92ZSxcbiAgICAgIHVuZGVyICJVc2VyLWRlZmluZWQgbWV0aG9kcyIuIENsYXNzIG1ldGhvZCBvYmplY3RzIGFyZSBjcmVhdGVkXG4gICAgICBieSB0aGUgYnVpbHQtaW4gYGBjbGFzc21ldGhvZCgpYGAgY29uc3RydWN0b3IuXG4nLAorICd0eXBlc2Z1bmN0aW9ucyc6ICdcbkZ1bmN0aW9uc1xuKioqKioqKioqXG5cbkZ1bmN0aW9uIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBUaGUgb25seVxub3BlcmF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0IGlzIHRvIGNhbGwgaXQ6IGBgZnVuYyhhcmd1bWVudC1saXN0KWBgLlxuXG5UaGVyZSBhcmUgcmVhbGx5IHR3byBmbGF2b3JzIG9mIGZ1bmN0aW9uIG9iamVjdHM6IGJ1aWx0LWluIGZ1bmN0aW9uc1xuYW5kIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuICBCb3RoIHN1cHBvcnQgdGhlIHNhbWUgb3BlcmF0aW9uICh0byBjYWxsXG50aGUgZnVuY3Rpb24pLCBidXQgdGhlIGltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudCwgaGVuY2UgdGhlXG5kaWZmZXJlbnQgb2JqZWN0IHR5cGVzLlxuXG5TZWUgKkZ1bmN0aW9uIGRlZmluaXRpb25zKiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicsCisgJ3R5cGVzbWFwcGluZyc6ICdcbk1hcHBpbmcgVHlwZXMgLS0tIGBgZGljdGBgXG4qKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BICptYXBwaW5nKiBvYmplY3QgbWFwcyAqaGFzaGFibGUqIHZhbHVlcyB0byBhcmJpdHJhcnkgb2JqZWN0cy5cbk1hcHBpbmdzIGFyZSBtdXRhYmxlIG9iamVjdHMuICBUaGVyZSBpcyBjdXJyZW50bHkgb25seSBvbmUgc3RhbmRhcmRcbm1hcHBpbmcgdHlwZSwgdGhlICpkaWN0aW9uYXJ5Ki4gIChGb3Igb3RoZXIgY29udGFpbmVycyBzZWUgdGhlIGJ1aWx0XG5pbiBgYGxpc3RgYCwgYGBzZXRgYCwgYW5kIGBgdHVwbGVgYCBjbGFzc2VzLCBhbmQgdGhlIGBgY29sbGVjdGlvbnNgYFxubW9kdWxlLilcblxuQSBkaWN0aW9uYXJ5XCdzIGtleXMgYXJlICphbG1vc3QqIGFyYml0cmFyeSB2YWx1ZXMuICBWYWx1ZXMgdGhhdCBhcmVcbm5vdCAqaGFzaGFibGUqLCB0aGF0IGlzLCB2YWx1ZXMgY29udGFpbmluZyBsaXN0cywgZGljdGlvbmFyaWVzIG9yXG5vdGhlciBtdXRhYmxlIHR5cGVzICh0aGF0IGFyZSBjb21wYXJlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBieSBvYmplY3RcbmlkZW50aXR5KSBtYXkgbm90IGJlIHVzZWQgYXMga2V5cy4gIE51bWVyaWMgdHlwZXMgdXNlZCBmb3Iga2V5cyBvYmV5XG50aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljIGNvbXBhcmlzb246IGlmIHR3byBudW1iZXJzIGNvbXBhcmUgZXF1YWxcbihzdWNoIGFzIGBgMWBgIGFuZCBgYDEuMGBgKSB0aGVuIHRoZXkgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHRvXG5pbmRleCB0aGUgc2FtZSBkaWN0aW9uYXJ5IGVudHJ5LiAgKE5vdGUgaG93ZXZlciwgdGhhdCBzaW5jZSBjb21wdXRlcnNcbnN0b3JlIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXMgYXBwcm94aW1hdGlvbnMgaXQgaXMgdXN1YWxseSB1bndpc2UgdG9cbnVzZSB0aGVtIGFzIGRpY3Rpb25hcnkga2V5cy4pXG5cbkRpY3Rpb25hcmllcyBjYW4gYmUgY3JlYXRlZCBieSBwbGFjaW5nIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2ZcbmBga2V5OiB2YWx1ZWBgIHBhaXJzIHdpdGhpbiBicmFjZXMsIGZvciBleGFtcGxlOiBgYHtcJ2phY2tcJzogNDA5OCxcblwnc2pvZXJkXCc6IDQxMjd9YGAgb3IgYGB7NDA5ODogXCdqYWNrXCcsIDQxMjc6IFwnc2pvZXJkXCd9YGAsIG9yIGJ5IHRoZVxuYGBkaWN0YGAgY29uc3RydWN0b3IuXG5cbmNsYXNzIGNsYXNzIGRpY3QoKiprd2FyZylcbmNsYXNzIGNsYXNzIGRpY3QobWFwcGluZywgKiprd2FyZylcbmNsYXNzIGNsYXNzIGRpY3QoaXRlcmFibGUsICoqa3dhcmcpXG5cbiAgIFJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IGluaXRpYWxpemVkIGZyb20gYW4gb3B0aW9uYWwgcG9zaXRpb25hbFxuICAgYXJndW1lbnQgYW5kIGEgcG9zc2libHkgZW1wdHkgc2V0IG9mIGtleXdvcmQgYXJndW1lbnRzLlxuXG4gICBJZiBubyBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuLCBhbiBlbXB0eSBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQuXG4gICBJZiBhIHBvc2l0aW9uYWwgYXJndW1lbnQgaXMgZ2l2ZW4gYW5kIGl0IGlzIGEgbWFwcGluZyBvYmplY3QsIGFcbiAgIGRpY3Rpb25hcnkgaXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIGtleS12YWx1ZSBwYWlycyBhcyB0aGUgbWFwcGluZ1xuICAgb2JqZWN0LiAgT3RoZXJ3aXNlLCB0aGUgcG9zaXRpb25hbCBhcmd1bWVudCBtdXN0IGJlIGFuICppdGVyYXRvcipcbiAgIG9iamVjdC4gIEVhY2ggaXRlbSBpbiB0aGUgaXRlcmFibGUgbXVzdCBpdHNlbGYgYmUgYW4gaXRlcmF0b3Igd2l0aFxuICAgZXhhY3RseSB0d28gb2JqZWN0cy4gIFRoZSBmaXJzdCBvYmplY3Qgb2YgZWFjaCBpdGVtIGJlY29tZXMgYSBrZXlcbiAgIGluIHRoZSBuZXcgZGljdGlvbmFyeSwgYW5kIHRoZSBzZWNvbmQgb2JqZWN0IHRoZSBjb3JyZXNwb25kaW5nXG4gICB2YWx1ZS4gIElmIGEga2V5IG9jY3VycyBtb3JlIHRoYW4gb25jZSwgdGhlIGxhc3QgdmFsdWUgZm9yIHRoYXQga2V5XG4gICBiZWNvbWVzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIHRoZSBuZXcgZGljdGlvbmFyeS5cblxuICAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIGdpdmVuLCB0aGUga2V5d29yZCBhcmd1bWVudHMgYW5kIHRoZWlyXG4gICB2YWx1ZXMgYXJlIGFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5IGNyZWF0ZWQgZnJvbSB0aGUgcG9zaXRpb25hbFxuICAgYXJndW1lbnQuICBJZiBhIGtleSBiZWluZyBhZGRlZCBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZSB2YWx1ZSBmcm9tXG4gICB0aGUga2V5d29yZCBhcmd1bWVudCByZXBsYWNlcyB0aGUgdmFsdWUgZnJvbSB0aGUgcG9zaXRpb25hbFxuICAgYXJndW1lbnQuXG5cbiAgIFRvIGlsbHVzdHJhdGUsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgYWxsIHJldHVybiBhIGRpY3Rpb25hcnkgZXF1YWxcbiAgIHRvIGBgeyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM31gYDpcblxuICAgICAgPj4+IGEgPSBkaWN0KG9uZT0xLCB0d289MiwgdGhyZWU9MylcbiAgICAgID4+PiBiID0ge1wnb25lXCc6IDEsIFwndHdvXCc6IDIsIFwndGhyZWVcJzogM31cbiAgICAgID4+PiBjID0gZGljdCh6aXAoW1wnb25lXCcsIFwndHdvXCcsIFwndGhyZWVcJ10sIFsxLCAyLCAzXSkpXG4gICAgICA+Pj4gZCA9IGRpY3QoWyhcJ3R3b1wnLCAyKSwgKFwnb25lXCcsIDEpLCAoXCd0aHJlZVwnLCAzKV0pXG4gICAgICA+Pj4gZSA9IGRpY3Qoe1wndGhyZWVcJzogMywgXCdvbmVcJzogMSwgXCd0d29cJzogMn0pXG4gICAgICA+Pj4gYSA9PSBiID09IGMgPT0gZCA9PSBlXG4gICAgICBUcnVlXG5cbiAgIFByb3ZpZGluZyBrZXl3b3JkIGFyZ3VtZW50cyBhcyBpbiB0aGUgZmlyc3QgZXhhbXBsZSBvbmx5IHdvcmtzIGZvclxuICAga2V5cyB0aGF0IGFyZSB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMuICBPdGhlcndpc2UsIGFueSB2YWxpZCBrZXlzXG4gICBjYW4gYmUgdXNlZC5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBidWlsZGluZyBhIGRpY3Rpb25hcnkgZnJvbVxuICAga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuXG5cbiAgIFRoZXNlIGFyZSB0aGUgb3BlcmF0aW9ucyB0aGF0IGRpY3Rpb25hcmllcyBzdXBwb3J0IChhbmQgdGhlcmVmb3JlLFxuICAgY3VzdG9tIG1hcHBpbmcgdHlwZXMgc2hvdWxkIHN1cHBvcnQgdG9vKTpcblxuICAgbGVuKGQpXG5cbiAgICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBkaWN0aW9uYXJ5ICpkKi5cblxuICAgZFtrZXldXG5cbiAgICAgIFJldHVybiB0aGUgaXRlbSBvZiAqZCogd2l0aCBrZXkgKmtleSouICBSYWlzZXMgYSBgYEtleUVycm9yYGAgaWZcbiAgICAgICprZXkqIGlzIG5vdCBpbiB0aGUgbWFwLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjU6IElmIGEgc3ViY2xhc3Mgb2YgZGljdCBkZWZpbmVzIGEgbWV0aG9kXG4gICAgICBgYF9fbWlzc2luZ19fKClgYCwgaWYgdGhlIGtleSAqa2V5KiBpcyBub3QgcHJlc2VudCwgdGhlXG4gICAgICBgYGRba2V5XWBgIG9wZXJhdGlvbiBjYWxscyB0aGF0IG1ldGhvZCB3aXRoIHRoZSBrZXkgKmtleSogYXNcbiAgICAgIGFyZ3VtZW50LiAgVGhlIGBgZFtrZXldYGAgb3BlcmF0aW9uIHRoZW4gcmV0dXJucyBvciByYWlzZXNcbiAgICAgIHdoYXRldmVyIGlzIHJldHVybmVkIG9yIHJhaXNlZCBieSB0aGUgYGBfX21pc3NpbmdfXyhrZXkpYGAgY2FsbFxuICAgICAgaWYgdGhlIGtleSBpcyBub3QgcHJlc2VudC4gTm8gb3RoZXIgb3BlcmF0aW9ucyBvciBtZXRob2RzIGludm9rZVxuICAgICAgYGBfX21pc3NpbmdfXygpYGAuIElmIGBgX19taXNzaW5nX18oKWBgIGlzIG5vdCBkZWZpbmVkLFxuICAgICAgYGBLZXlFcnJvcmBgIGlzIHJhaXNlZC4gIGBgX19taXNzaW5nX18oKWBgIG11c3QgYmUgYSBtZXRob2Q7IGl0XG4gICAgICBjYW5ub3QgYmUgYW4gaW5zdGFuY2UgdmFyaWFibGUuIEZvciBhbiBleGFtcGxlLCBzZWVcbiAgICAgIGBgY29sbGVjdGlvbnMuZGVmYXVsdGRpY3RgYC5cblxuICAgZFtrZXldID0gdmFsdWVcblxuICAgICAgU2V0IGBgZFtrZXldYGAgdG8gKnZhbHVlKi5cblxuICAgZGVsIGRba2V5XVxuXG4gICAgICBSZW1vdmUgYGBkW2tleV1gYCBmcm9tICpkKi4gIFJhaXNlcyBhIGBgS2V5RXJyb3JgYCBpZiAqa2V5KiBpc1xuICAgICAgbm90IGluIHRoZSBtYXAuXG5cbiAgIGtleSBpbiBkXG5cbiAgICAgIFJldHVybiBgYFRydWVgYCBpZiAqZCogaGFzIGEga2V5ICprZXkqLCBlbHNlIGBgRmFsc2VgYC5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG4gICBrZXkgbm90IGluIGRcblxuICAgICAgRXF1aXZhbGVudCB0byBgYG5vdCBrZXkgaW4gZGBgLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIGl0ZXIoZClcblxuICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgdGhlIGRpY3Rpb25hcnkuICBUaGlzIGlzIGFcbiAgICAgIHNob3J0Y3V0IGZvciBgYGl0ZXJrZXlzKClgYC5cblxuICAgY2xlYXIoKVxuXG4gICAgICBSZW1vdmUgYWxsIGl0ZW1zIGZyb20gdGhlIGRpY3Rpb25hcnkuXG5cbiAgIGNvcHkoKVxuXG4gICAgICBSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhlIGRpY3Rpb25hcnkuXG5cbiAgIGZyb21rZXlzKHNlcVssIHZhbHVlXSlcblxuICAgICAgQ3JlYXRlIGEgbmV3IGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gKnNlcSogYW5kIHZhbHVlcyBzZXQgdG9cbiAgICAgICp2YWx1ZSouXG5cbiAgICAgIGBgZnJvbWtleXMoKWBgIGlzIGEgY2xhc3MgbWV0aG9kIHRoYXQgcmV0dXJucyBhIG5ldyBkaWN0aW9uYXJ5LlxuICAgICAgKnZhbHVlKiBkZWZhdWx0cyB0byBgYE5vbmVgYC5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi4zLlxuXG4gICBnZXQoa2V5WywgZGVmYXVsdF0pXG5cbiAgICAgIFJldHVybiB0aGUgdmFsdWUgZm9yICprZXkqIGlmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCBlbHNlXG4gICAgICAqZGVmYXVsdCouIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4sIGl0IGRlZmF1bHRzIHRvIGBgTm9uZWBgLFxuICAgICAgc28gdGhhdCB0aGlzIG1ldGhvZCBuZXZlciByYWlzZXMgYSBgYEtleUVycm9yYGAuXG5cbiAgIGhhc19rZXkoa2V5KVxuXG4gICAgICBUZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgKmtleSogaW4gdGhlIGRpY3Rpb25hcnkuICBgYGhhc19rZXkoKWBgXG4gICAgICBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGBga2V5IGluIGRgYC5cblxuICAgaXRlbXMoKVxuXG4gICAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGxpc3Qgb2YgYGAoa2V5LCB2YWx1ZSlgYFxuICAgICAgcGFpcnMuXG5cbiAgICAgICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogS2V5cyBhbmQgdmFsdWVzIGFyZSBsaXN0ZWQgaW5cbiAgICAgIGFuIGFyYml0cmFyeSBvcmRlciB3aGljaCBpcyBub24tcmFuZG9tLCB2YXJpZXMgYWNyb3NzIFB5dGhvblxuICAgICAgaW1wbGVtZW50YXRpb25zLCBhbmQgZGVwZW5kcyBvbiB0aGUgZGljdGlvbmFyeVwncyBoaXN0b3J5IG9mXG4gICAgICBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMuXG5cbiAgICAgIElmIGBgaXRlbXMoKWBgLCBgYGtleXMoKWBgLCBgYHZhbHVlcygpYGAsIGBgaXRlcml0ZW1zKClgYCxcbiAgICAgIGBgaXRlcmtleXMoKWBgLCBhbmQgYGBpdGVydmFsdWVzKClgYCBhcmUgY2FsbGVkIHdpdGggbm9cbiAgICAgIGludGVydmVuaW5nIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRpY3Rpb25hcnksIHRoZSBsaXN0cyB3aWxsXG4gICAgICBkaXJlY3RseSBjb3JyZXNwb25kLiAgVGhpcyBhbGxvd3MgdGhlIGNyZWF0aW9uIG9mIGBgKHZhbHVlLFxuICAgICAga2V5KWBgIHBhaXJzIHVzaW5nIGBgemlwKClgYDogYGBwYWlycyA9IHppcChkLnZhbHVlcygpLFxuICAgICAgZC5rZXlzKCkpYGAuICBUaGUgc2FtZSByZWxhdGlvbnNoaXAgaG9sZHMgZm9yIHRoZSBgYGl0ZXJrZXlzKClgYFxuICAgICAgYW5kIGBgaXRlcnZhbHVlcygpYGAgbWV0aG9kczogYGBwYWlycyA9IHppcChkLml0ZXJ2YWx1ZXMoKSxcbiAgICAgIGQuaXRlcmtleXMoKSlgYCBwcm92aWRlcyB0aGUgc2FtZSB2YWx1ZSBmb3IgYGBwYWlyc2BgLiBBbm90aGVyXG4gICAgICB3YXkgdG8gY3JlYXRlIHRoZSBzYW1lIGxpc3QgaXMgYGBwYWlycyA9IFsodiwgaykgZm9yIChrLCB2KSBpblxuICAgICAgZC5pdGVyaXRlbXMoKV1gYC5cblxuICAgaXRlcml0ZW1zKClcblxuICAgICAgUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGRpY3Rpb25hcnlcJ3MgYGAoa2V5LCB2YWx1ZSlgYCBwYWlycy5cbiAgICAgIFNlZSB0aGUgbm90ZSBmb3IgYGBkaWN0Lml0ZW1zKClgYC5cblxuICAgICAgVXNpbmcgYGBpdGVyaXRlbXMoKWBgIHdoaWxlIGFkZGluZyBvciBkZWxldGluZyBlbnRyaWVzIGluIHRoZVxuICAgICAgZGljdGlvbmFyeSBtYXkgcmFpc2UgYSBgYFJ1bnRpbWVFcnJvcmBgIG9yIGZhaWwgdG8gaXRlcmF0ZSBvdmVyXG4gICAgICBhbGwgZW50cmllcy5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG4gICBpdGVya2V5cygpXG5cbiAgICAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBkaWN0aW9uYXJ5XCdzIGtleXMuICBTZWUgdGhlIG5vdGUgZm9yXG4gICAgICBgYGRpY3QuaXRlbXMoKWBgLlxuXG4gICAgICBVc2luZyBgYGl0ZXJrZXlzKClgYCB3aGlsZSBhZGRpbmcgb3IgZGVsZXRpbmcgZW50cmllcyBpbiB0aGVcbiAgICAgIGRpY3Rpb25hcnkgbWF5IHJhaXNlIGEgYGBSdW50aW1lRXJyb3JgYCBvciBmYWlsIHRvIGl0ZXJhdGUgb3ZlclxuICAgICAgYWxsIGVudHJpZXMuXG5cbiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMi5cblxuICAgaXRlcnZhbHVlcygpXG5cbiAgICAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBkaWN0aW9uYXJ5XCdzIHZhbHVlcy4gIFNlZSB0aGUgbm90ZVxuICAgICAgZm9yIGBgZGljdC5pdGVtcygpYGAuXG5cbiAgICAgIFVzaW5nIGBgaXRlcnZhbHVlcygpYGAgd2hpbGUgYWRkaW5nIG9yIGRlbGV0aW5nIGVudHJpZXMgaW4gdGhlXG4gICAgICBkaWN0aW9uYXJ5IG1heSByYWlzZSBhIGBgUnVudGltZUVycm9yYGAgb3IgZmFpbCB0byBpdGVyYXRlIG92ZXJcbiAgICAgIGFsbCBlbnRyaWVzLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIGtleXMoKVxuXG4gICAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGxpc3Qgb2Yga2V5cy4gIFNlZSB0aGUgbm90ZVxuICAgICAgZm9yIGBgZGljdC5pdGVtcygpYGAuXG5cbiAgIHBvcChrZXlbLCBkZWZhdWx0XSlcblxuICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJlbW92ZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgIGVsc2UgcmV0dXJuICpkZWZhdWx0Ki4gIElmICpkZWZhdWx0KiBpcyBub3QgZ2l2ZW4gYW5kICprZXkqIGlzXG4gICAgICBub3QgaW4gdGhlIGRpY3Rpb25hcnksIGEgYGBLZXlFcnJvcmBgIGlzIHJhaXNlZC5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi4zLlxuXG4gICBwb3BpdGVtKClcblxuICAgICAgUmVtb3ZlIGFuZCByZXR1cm4gYW4gYXJiaXRyYXJ5IGBgKGtleSwgdmFsdWUpYGAgcGFpciBmcm9tIHRoZVxuICAgICAgZGljdGlvbmFyeS5cblxuICAgICAgYGBwb3BpdGVtKClgYCBpcyB1c2VmdWwgdG8gZGVzdHJ1Y3RpdmVseSBpdGVyYXRlIG92ZXIgYVxuICAgICAgZGljdGlvbmFyeSwgYXMgb2Z0ZW4gdXNlZCBpbiBzZXQgYWxnb3JpdGhtcy4gIElmIHRoZSBkaWN0aW9uYXJ5XG4gICAgICBpcyBlbXB0eSwgY2FsbGluZyBgYHBvcGl0ZW0oKWBgIHJhaXNlcyBhIGBgS2V5RXJyb3JgYC5cblxuICAgc2V0ZGVmYXVsdChrZXlbLCBkZWZhdWx0XSlcblxuICAgICAgSWYgKmtleSogaXMgaW4gdGhlIGRpY3Rpb25hcnksIHJldHVybiBpdHMgdmFsdWUuICBJZiBub3QsIGluc2VydFxuICAgICAgKmtleSogd2l0aCBhIHZhbHVlIG9mICpkZWZhdWx0KiBhbmQgcmV0dXJuICpkZWZhdWx0Ki4gICpkZWZhdWx0KlxuICAgICAgZGVmYXVsdHMgdG8gYGBOb25lYGAuXG5cbiAgIHVwZGF0ZShbb3RoZXJdKVxuXG4gICAgICBVcGRhdGUgdGhlIGRpY3Rpb25hcnkgd2l0aCB0aGUga2V5L3ZhbHVlIHBhaXJzIGZyb20gKm90aGVyKixcbiAgICAgIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGtleXMuICBSZXR1cm4gYGBOb25lYGAuXG5cbiAgICAgIGBgdXBkYXRlKClgYCBhY2NlcHRzIGVpdGhlciBhbm90aGVyIGRpY3Rpb25hcnkgb2JqZWN0IG9yIGFuXG4gICAgICBpdGVyYWJsZSBvZiBrZXkvdmFsdWUgcGFpcnMgKGFzIHR1cGxlcyBvciBvdGhlciBpdGVyYWJsZXMgb2ZcbiAgICAgIGxlbmd0aCB0d28pLiAgSWYga2V5d29yZCBhcmd1bWVudHMgYXJlIHNwZWNpZmllZCwgdGhlIGRpY3Rpb25hcnlcbiAgICAgIGlzIHRoZW4gdXBkYXRlZCB3aXRoIHRob3NlIGtleS92YWx1ZSBwYWlyczogYGBkLnVwZGF0ZShyZWQ9MSxcbiAgICAgIGJsdWU9MilgYC5cblxuICAgICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogQWxsb3dlZCB0aGUgYXJndW1lbnQgdG8gYmUgYW4gaXRlcmFibGVcbiAgICAgIG9mIGtleS92YWx1ZSBwYWlycyBhbmQgYWxsb3dlZCBrZXl3b3JkIGFyZ3VtZW50cy5cblxuICAgdmFsdWVzKClcblxuICAgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgZGljdGlvbmFyeVwncyBsaXN0IG9mIHZhbHVlcy4gIFNlZSB0aGUgbm90ZVxuICAgICAgZm9yIGBgZGljdC5pdGVtcygpYGAuXG5cbiAgIHZpZXdpdGVtcygpXG5cbiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGl0ZW1zIChgYChrZXksIHZhbHVlKWBgXG4gICAgICBwYWlycykuICBTZWUgYmVsb3cgZm9yIGRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjcuXG5cbiAgIHZpZXdrZXlzKClcblxuICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnlcJ3Mga2V5cy4gIFNlZSBiZWxvdyBmb3JcbiAgICAgIGRvY3VtZW50YXRpb24gb2YgdmlldyBvYmplY3RzLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjcuXG5cbiAgIHZpZXd2YWx1ZXMoKVxuXG4gICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeVwncyB2YWx1ZXMuICBTZWUgYmVsb3cgZm9yXG4gICAgICBkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cy5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi43LlxuXG5cbkRpY3Rpb25hcnkgdmlldyBvYmplY3RzXG49PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgb2JqZWN0cyByZXR1cm5lZCBieSBgYGRpY3Qudmlld2tleXMoKWBgLCBgYGRpY3Qudmlld3ZhbHVlcygpYGAgYW5kXG5gYGRpY3Qudmlld2l0ZW1zKClgYCBhcmUgKnZpZXcgb2JqZWN0cyouICBUaGV5IHByb3ZpZGUgYSBkeW5hbWljIHZpZXdcbm9uIHRoZSBkaWN0aW9uYXJ5XCdzIGVudHJpZXMsIHdoaWNoIG1lYW5zIHRoYXQgd2hlbiB0aGUgZGljdGlvbmFyeVxuY2hhbmdlcywgdGhlIHZpZXcgcmVmbGVjdHMgdGhlc2UgY2hhbmdlcy5cblxuRGljdGlvbmFyeSB2aWV3cyBjYW4gYmUgaXRlcmF0ZWQgb3ZlciB0byB5aWVsZCB0aGVpciByZXNwZWN0aXZlIGRhdGEsXG5hbmQgc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3RzOlxuXG5sZW4oZGljdHZpZXcpXG5cbiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbml0ZXIoZGljdHZpZXcpXG5cbiAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzLCB2YWx1ZXMgb3IgaXRlbXMgKHJlcHJlc2VudGVkIGFzXG4gICB0dXBsZXMgb2YgYGAoa2V5LCB2YWx1ZSlgYCkgaW4gdGhlIGRpY3Rpb25hcnkuXG5cbiAgIEtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiBhbiBhcmJpdHJhcnkgb3JkZXIgd2hpY2ggaXNcbiAgIG5vbi1yYW5kb20sIHZhcmllcyBhY3Jvc3MgUHl0aG9uIGltcGxlbWVudGF0aW9ucywgYW5kIGRlcGVuZHMgb25cbiAgIHRoZSBkaWN0aW9uYXJ5XCdzIGhpc3Rvcnkgb2YgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zLiBJZiBrZXlzLFxuICAgdmFsdWVzIGFuZCBpdGVtcyB2aWV3cyBhcmUgaXRlcmF0ZWQgb3ZlciB3aXRoIG5vIGludGVydmVuaW5nXG4gICBtb2RpZmljYXRpb25zIHRvIHRoZSBkaWN0aW9uYXJ5LCB0aGUgb3JkZXIgb2YgaXRlbXMgd2lsbCBkaXJlY3RseVxuICAgY29ycmVzcG9uZC4gIFRoaXMgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBgYCh2YWx1ZSwga2V5KWBgIHBhaXJzXG4gICB1c2luZyBgYHppcCgpYGA6IGBgcGFpcnMgPSB6aXAoZC52YWx1ZXMoKSwgZC5rZXlzKCkpYGAuICBBbm90aGVyXG4gICB3YXkgdG8gY3JlYXRlIHRoZSBzYW1lIGxpc3QgaXMgYGBwYWlycyA9IFsodiwgaykgZm9yIChrLCB2KSBpblxuICAgZC5pdGVtcygpXWBgLlxuXG4gICBJdGVyYXRpbmcgdmlld3Mgd2hpbGUgYWRkaW5nIG9yIGRlbGV0aW5nIGVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnlcbiAgIG1heSByYWlzZSBhIGBgUnVudGltZUVycm9yYGAgb3IgZmFpbCB0byBpdGVyYXRlIG92ZXIgYWxsIGVudHJpZXMuXG5cbnggaW4gZGljdHZpZXdcblxuICAgUmV0dXJuIGBgVHJ1ZWBgIGlmICp4KiBpcyBpbiB0aGUgdW5kZXJseWluZyBkaWN0aW9uYXJ5XCdzIGtleXMsXG4gICB2YWx1ZXMgb3IgaXRlbXMgKGluIHRoZSBsYXR0ZXIgY2FzZSwgKngqIHNob3VsZCBiZSBhIGBgKGtleSxcbiAgIHZhbHVlKWBgIHR1cGxlKS5cblxuS2V5cyB2aWV3cyBhcmUgc2V0LWxpa2Ugc2luY2UgdGhlaXIgZW50cmllcyBhcmUgdW5pcXVlIGFuZCBoYXNoYWJsZS5cbklmIGFsbCB2YWx1ZXMgYXJlIGhhc2hhYmxlLCBzbyB0aGF0IChrZXksIHZhbHVlKSBwYWlycyBhcmUgdW5pcXVlIGFuZFxuaGFzaGFibGUsIHRoZW4gdGhlIGl0ZW1zIHZpZXcgaXMgYWxzbyBzZXQtbGlrZS4gIChWYWx1ZXMgdmlld3MgYXJlIG5vdFxudHJlYXRlZCBhcyBzZXQtbGlrZSBzaW5jZSB0aGUgZW50cmllcyBhcmUgZ2VuZXJhbGx5IG5vdCB1bmlxdWUuKSAgVGhlblxudGhlc2Ugc2V0IG9wZXJhdGlvbnMgYXJlIGF2YWlsYWJsZSAoIm90aGVyIiByZWZlcnMgZWl0aGVyIHRvIGFub3RoZXJcbnZpZXcgb3IgYSBzZXQpOlxuXG5kaWN0dmlldyAmIG90aGVyXG5cbiAgIFJldHVybiB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBkaWN0dmlldyBhbmQgdGhlIG90aGVyIG9iamVjdCBhcyBhXG4gICBuZXcgc2V0LlxuXG5kaWN0dmlldyB8IG90aGVyXG5cbiAgIFJldHVybiB0aGUgdW5pb24gb2YgdGhlIGRpY3R2aWV3IGFuZCB0aGUgb3RoZXIgb2JqZWN0IGFzIGEgbmV3IHNldC5cblxuZGljdHZpZXcgLSBvdGhlclxuXG4gICBSZXR1cm4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZGljdHZpZXcgYW5kIHRoZSBvdGhlciBvYmplY3RcbiAgIChhbGwgZWxlbWVudHMgaW4gKmRpY3R2aWV3KiB0aGF0IGFyZW5cJ3QgaW4gKm90aGVyKikgYXMgYSBuZXcgc2V0LlxuXG5kaWN0dmlldyBeIG90aGVyXG5cbiAgIFJldHVybiB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2UgKGFsbCBlbGVtZW50cyBlaXRoZXIgaW4gKmRpY3R2aWV3KlxuICAgb3IgKm90aGVyKiwgYnV0IG5vdCBpbiBib3RoKSBvZiB0aGUgZGljdHZpZXcgYW5kIHRoZSBvdGhlciBvYmplY3RcbiAgIGFzIGEgbmV3IHNldC5cblxuQW4gZXhhbXBsZSBvZiBkaWN0aW9uYXJ5IHZpZXcgdXNhZ2U6XG5cbiAgID4+PiBkaXNoZXMgPSB7XCdlZ2dzXCc6IDIsIFwnc2F1c2FnZVwnOiAxLCBcJ2JhY29uXCc6IDEsIFwnc3BhbVwnOiA1MDB9XG4gICA+Pj4ga2V5cyA9IGRpc2hlcy52aWV3a2V5cygpXG4gICA+Pj4gdmFsdWVzID0gZGlzaGVzLnZpZXd2YWx1ZXMoKVxuXG4gICA+Pj4gIyBpdGVyYXRpb25cbiAgID4+PiBuID0gMFxuICAgPj4+IGZvciB2YWwgaW4gdmFsdWVzOlxuICAgLi4uICAgICBuICs9IHZhbFxuICAgPj4+IHByaW50KG4pXG4gICA1MDRcblxuICAgPj4+ICMga2V5cyBhbmQgdmFsdWVzIGFyZSBpdGVyYXRlZCBvdmVyIGluIHRoZSBzYW1lIG9yZGVyXG4gICA+Pj4gbGlzdChrZXlzKVxuICAgW1wnZWdnc1wnLCBcJ2JhY29uXCcsIFwnc2F1c2FnZVwnLCBcJ3NwYW1cJ11cbiAgID4+PiBsaXN0KHZhbHVlcylcbiAgIFsyLCAxLCAxLCA1MDBdXG5cbiAgID4+PiAjIHZpZXcgb2JqZWN0cyBhcmUgZHluYW1pYyBhbmQgcmVmbGVjdCBkaWN0IGNoYW5nZXNcbiAgID4+PiBkZWwgZGlzaGVzW1wnZWdnc1wnXVxuICAgPj4+IGRlbCBkaXNoZXNbXCdzYXVzYWdlXCddXG4gICA+Pj4gbGlzdChrZXlzKVxuICAgW1wnc3BhbVwnLCBcJ2JhY29uXCddXG5cbiAgID4+PiAjIHNldCBvcGVyYXRpb25zXG4gICA+Pj4ga2V5cyAmIHtcJ2VnZ3NcJywgXCdiYWNvblwnLCBcJ3NhbGFkXCd9XG4gICB7XCdiYWNvblwnfVxuJywKKyAndHlwZXNtZXRob2RzJzogJ1xuTWV0aG9kc1xuKioqKioqKlxuXG5NZXRob2RzIGFyZSBmdW5jdGlvbnMgdGhhdCBhcmUgY2FsbGVkIHVzaW5nIHRoZSBhdHRyaWJ1dGUgbm90YXRpb24uXG5UaGVyZSBhcmUgdHdvIGZsYXZvcnM6IGJ1aWx0LWluIG1ldGhvZHMgKHN1Y2ggYXMgYGBhcHBlbmQoKWBgIG9uXG5saXN0cykgYW5kIGNsYXNzIGluc3RhbmNlIG1ldGhvZHMuICBCdWlsdC1pbiBtZXRob2RzIGFyZSBkZXNjcmliZWRcbndpdGggdGhlIHR5cGVzIHRoYXQgc3VwcG9ydCB0aGVtLlxuXG5UaGUgaW1wbGVtZW50YXRpb24gYWRkcyB0d28gc3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlcyB0byBjbGFzc1xuaW5zdGFuY2UgbWV0aG9kczogYGBtLmltX3NlbGZgYCBpcyB0aGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBtZXRob2Rcbm9wZXJhdGVzLCBhbmQgYGBtLmltX2Z1bmNgYCBpcyB0aGUgZnVuY3Rpb24gaW1wbGVtZW50aW5nIHRoZSBtZXRob2QuXG5DYWxsaW5nIGBgbShhcmctMSwgYXJnLTIsIC4uLiwgYXJnLW4pYGAgaXMgY29tcGxldGVseSBlcXVpdmFsZW50IHRvXG5jYWxsaW5nIGBgbS5pbV9mdW5jKG0uaW1fc2VsZiwgYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKWBgLlxuXG5DbGFzcyBpbnN0YW5jZSBtZXRob2RzIGFyZSBlaXRoZXIgKmJvdW5kKiBvciAqdW5ib3VuZCosIHJlZmVycmluZyB0b1xud2hldGhlciB0aGUgbWV0aG9kIHdhcyBhY2Nlc3NlZCB0aHJvdWdoIGFuIGluc3RhbmNlIG9yIGEgY2xhc3MsXG5yZXNwZWN0aXZlbHkuICBXaGVuIGEgbWV0aG9kIGlzIHVuYm91bmQsIGl0cyBgYGltX3NlbGZgYCBhdHRyaWJ1dGVcbndpbGwgYmUgYGBOb25lYGAgYW5kIGlmIGNhbGxlZCwgYW4gZXhwbGljaXQgYGBzZWxmYGAgb2JqZWN0IG11c3QgYmVcbnBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQuICBJbiB0aGlzIGNhc2UsIGBgc2VsZmBgIG11c3QgYmUgYW5cbmluc3RhbmNlIG9mIHRoZSB1bmJvdW5kIG1ldGhvZFwncyBjbGFzcyAob3IgYSBzdWJjbGFzcyBvZiB0aGF0IGNsYXNzKSxcbm90aGVyd2lzZSBhIGBgVHlwZUVycm9yYGAgaXMgcmFpc2VkLlxuXG5MaWtlIGZ1bmN0aW9uIG9iamVjdHMsIG1ldGhvZHMgb2JqZWN0cyBzdXBwb3J0IGdldHRpbmcgYXJiaXRyYXJ5XG5hdHRyaWJ1dGVzLiBIb3dldmVyLCBzaW5jZSBtZXRob2QgYXR0cmlidXRlcyBhcmUgYWN0dWFsbHkgc3RvcmVkIG9uXG50aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QgKGBgbWV0aC5pbV9mdW5jYGApLCBzZXR0aW5nIG1ldGhvZFxuYXR0cmlidXRlcyBvbiBlaXRoZXIgYm91bmQgb3IgdW5ib3VuZCBtZXRob2RzIGlzIGRpc2FsbG93ZWQuXG5BdHRlbXB0aW5nIHRvIHNldCBhbiBhdHRyaWJ1dGUgb24gYSBtZXRob2QgcmVzdWx0cyBpbiBhblxuYGBBdHRyaWJ1dGVFcnJvcmBgIGJlaW5nIHJhaXNlZC4gIEluIG9yZGVyIHRvIHNldCBhIG1ldGhvZCBhdHRyaWJ1dGUsXG55b3UgbmVlZCB0byBleHBsaWNpdGx5IHNldCBpdCBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3Q6XG5cbiAgID4+PiBjbGFzcyBDOlxuICAgLi4uICAgICBkZWYgbWV0aG9kKHNlbGYpOlxuICAgLi4uICAgICAgICAgcGFzc1xuICAgLi4uXG4gICA+Pj4gYyA9IEMoKVxuICAgPj4+IGMubWV0aG9kLndob2FtaSA9IFwnbXkgbmFtZSBpcyBtZXRob2RcJyAgIyBjYW5cJ3Qgc2V0IG9uIHRoZSBtZXRob2RcbiAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT5cbiAgIEF0dHJpYnV0ZUVycm9yOiBcJ2luc3RhbmNlbWV0aG9kXCcgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgXCd3aG9hbWlcJ1xuICAgPj4+IGMubWV0aG9kLmltX2Z1bmMud2hvYW1pID0gXCdteSBuYW1lIGlzIG1ldGhvZFwnXG4gICA+Pj4gYy5tZXRob2Qud2hvYW1pXG4gICBcJ215IG5hbWUgaXMgbWV0aG9kXCdcblxuU2VlICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuJywKKyAndHlwZXNtb2R1bGVzJzogIlxuTW9kdWxlc1xuKioqKioqKlxuXG5UaGUgb25seSBzcGVjaWFsIG9wZXJhdGlvbiBvbiBhIG1vZHVsZSBpcyBhdHRyaWJ1dGUgYWNjZXNzOlxuYGBtLm5hbWVgYCwgd2hlcmUgKm0qIGlzIGEgbW9kdWxlIGFuZCAqbmFtZSogYWNjZXNzZXMgYSBuYW1lIGRlZmluZWRcbmluICptKidzIHN5bWJvbCB0YWJsZS4gTW9kdWxlIGF0dHJpYnV0ZXMgY2FuIGJlIGFzc2lnbmVkIHRvLiAgKE5vdGVcbnRoYXQgdGhlIGBgaW1wb3J0YGAgc3RhdGVtZW50IGlzIG5vdCwgc3RyaWN0bHkgc3BlYWtpbmcsIGFuIG9wZXJhdGlvblxub24gYSBtb2R1bGUgb2JqZWN0OyBgYGltcG9ydCBmb29gYCBkb2VzIG5vdCByZXF1aXJlIGEgbW9kdWxlIG9iamVjdFxubmFtZWQgKmZvbyogdG8gZXhpc3QsIHJhdGhlciBpdCByZXF1aXJlcyBhbiAoZXh0ZXJuYWwpICpkZWZpbml0aW9uKlxuZm9yIGEgbW9kdWxlIG5hbWVkICpmb28qIHNvbWV3aGVyZS4pXG5cbkEgc3BlY2lhbCBhdHRyaWJ1dGUgb2YgZXZlcnkgbW9kdWxlIGlzIGBgX19kaWN0X19gYC4gVGhpcyBpcyB0aGVcbmRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLiBNb2RpZnlpbmcgdGhpc1xuZGljdGlvbmFyeSB3aWxsIGFjdHVhbGx5IGNoYW5nZSB0aGUgbW9kdWxlJ3Mgc3ltYm9sIHRhYmxlLCBidXQgZGlyZWN0XG5hc3NpZ25tZW50IHRvIHRoZSBgYF9fZGljdF9fYGAgYXR0cmlidXRlIGlzIG5vdCBwb3NzaWJsZSAoeW91IGNhblxud3JpdGUgYGBtLl9fZGljdF9fWydhJ10gPSAxYGAsIHdoaWNoIGRlZmluZXMgYGBtLmFgYCB0byBiZSBgYDFgYCwgYnV0XG55b3UgY2FuJ3Qgd3JpdGUgYGBtLl9fZGljdF9fID0ge31gYCkuICBNb2RpZnlpbmcgYGBfX2RpY3RfX2BgIGRpcmVjdGx5XG5pcyBub3QgcmVjb21tZW5kZWQuXG5cbk1vZHVsZXMgYnVpbHQgaW50byB0aGUgaW50ZXJwcmV0ZXIgYXJlIHdyaXR0ZW4gbGlrZSB0aGlzOiBgYDxtb2R1bGVcbidzeXMnIChidWlsdC1pbik+YGAuICBJZiBsb2FkZWQgZnJvbSBhIGZpbGUsIHRoZXkgYXJlIHdyaXR0ZW4gYXNcbmBgPG1vZHVsZSAnb3MnIGZyb20gJy91c3IvbG9jYWwvbGliL3B5dGhvblguWS9vcy5weWMnPmBgLlxuIiwKKyAndHlwZXNzZXEnOiAnXG5TZXF1ZW5jZSBUeXBlcyAtLS0gYGBzdHJgYCwgYGB1bmljb2RlYGAsIGBgbGlzdGBgLCBgYHR1cGxlYGAsIGBgYnl0ZWFycmF5YGAsIGBgYnVmZmVyYGAsIGBgeHJhbmdlYGBcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGVyZSBhcmUgc2V2ZW4gc2VxdWVuY2UgdHlwZXM6IHN0cmluZ3MsIFVuaWNvZGUgc3RyaW5ncywgbGlzdHMsXG50dXBsZXMsIGJ5dGVhcnJheXMsIGJ1ZmZlcnMsIGFuZCB4cmFuZ2Ugb2JqZWN0cy5cblxuRm9yIG90aGVyIGNvbnRhaW5lcnMgc2VlIHRoZSBidWlsdCBpbiBgYGRpY3RgYCBhbmQgYGBzZXRgYCBjbGFzc2VzLFxuYW5kIHRoZSBgYGNvbGxlY3Rpb25zYGAgbW9kdWxlLlxuXG5TdHJpbmcgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4gaW4gc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXM6IGBgXCd4eXp6eVwnYGAsXG5gYCJmcm9ib3p6ImBgLiAgU2VlICpTdHJpbmcgbGl0ZXJhbHMqIGZvciBtb3JlIGFib3V0IHN0cmluZyBsaXRlcmFscy5cblVuaWNvZGUgc3RyaW5ncyBhcmUgbXVjaCBsaWtlIHN0cmluZ3MsIGJ1dCBhcmUgc3BlY2lmaWVkIGluIHRoZSBzeW50YXhcbnVzaW5nIGEgcHJlY2VkaW5nIGBgXCd1XCdgYCBjaGFyYWN0ZXI6IGBgdVwnYWJjXCdgYCwgYGB1ImRlZiJgYC4gSW5cbmFkZGl0aW9uIHRvIHRoZSBmdW5jdGlvbmFsaXR5IGRlc2NyaWJlZCBoZXJlLCB0aGVyZSBhcmUgYWxzbyBzdHJpbmctXG5zcGVjaWZpYyBtZXRob2RzIGRlc2NyaWJlZCBpbiB0aGUgKlN0cmluZyBNZXRob2RzKiBzZWN0aW9uLiBMaXN0cyBhcmVcbmNvbnN0cnVjdGVkIHdpdGggc3F1YXJlIGJyYWNrZXRzLCBzZXBhcmF0aW5nIGl0ZW1zIHdpdGggY29tbWFzOiBgYFthLFxuYiwgY11gYC4gVHVwbGVzIGFyZSBjb25zdHJ1Y3RlZCBieSB0aGUgY29tbWEgb3BlcmF0b3IgKG5vdCB3aXRoaW5cbnNxdWFyZSBicmFja2V0cyksIHdpdGggb3Igd2l0aG91dCBlbmNsb3NpbmcgcGFyZW50aGVzZXMsIGJ1dCBhbiBlbXB0eVxudHVwbGUgbXVzdCBoYXZlIHRoZSBlbmNsb3NpbmcgcGFyZW50aGVzZXMsIHN1Y2ggYXMgYGBhLCBiLCBjYGAgb3JcbmBgKClgYC4gIEEgc2luZ2xlIGl0ZW0gdHVwbGUgbXVzdCBoYXZlIGEgdHJhaWxpbmcgY29tbWEsIHN1Y2ggYXNcbmBgKGQsKWBgLlxuXG5CeXRlYXJyYXkgb2JqZWN0cyBhcmUgY3JlYXRlZCB3aXRoIHRoZSBidWlsdC1pbiBmdW5jdGlvblxuYGBieXRlYXJyYXkoKWBgLlxuXG5CdWZmZXIgb2JqZWN0cyBhcmUgbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBieSBQeXRob24gc3ludGF4LCBidXQgY2FuIGJlXG5jcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgYnVmZmVyKClgYC4gIFRoZXkgZG9uXCd0XG5zdXBwb3J0IGNvbmNhdGVuYXRpb24gb3IgcmVwZXRpdGlvbi5cblxuT2JqZWN0cyBvZiB0eXBlIHhyYW5nZSBhcmUgc2ltaWxhciB0byBidWZmZXJzIGluIHRoYXQgdGhlcmUgaXMgbm9cbnNwZWNpZmljIHN5bnRheCB0byBjcmVhdGUgdGhlbSwgYnV0IHRoZXkgYXJlIGNyZWF0ZWQgdXNpbmcgdGhlXG5gYHhyYW5nZSgpYGAgZnVuY3Rpb24uICBUaGV5IGRvblwndCBzdXBwb3J0IHNsaWNpbmcsIGNvbmNhdGVuYXRpb24gb3JcbnJlcGV0aXRpb24sIGFuZCB1c2luZyBgYGluYGAsIGBgbm90IGluYGAsIGBgbWluKClgYCBvciBgYG1heCgpYGAgb25cbnRoZW0gaXMgaW5lZmZpY2llbnQuXG5cbk1vc3Qgc2VxdWVuY2UgdHlwZXMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMuICBUaGUgYGBpbmBgIGFuZFxuYGBub3QgaW5gYCBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdGllcyBhcyB0aGUgY29tcGFyaXNvblxub3BlcmF0aW9ucy4gIFRoZSBgYCtgYCBhbmQgYGAqYGAgb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5IGFzXG50aGUgY29ycmVzcG9uZGluZyBudW1lcmljIG9wZXJhdGlvbnMuIFszXSBBZGRpdGlvbmFsIG1ldGhvZHMgYXJlXG5wcm92aWRlZCBmb3IgKk11dGFibGUgU2VxdWVuY2UgVHlwZXMqLlxuXG5UaGlzIHRhYmxlIGxpc3RzIHRoZSBzZXF1ZW5jZSBvcGVyYXRpb25zIHNvcnRlZCBpbiBhc2NlbmRpbmcgcHJpb3JpdHlcbihvcGVyYXRpb25zIGluIHRoZSBzYW1lIGJveCBoYXZlIHRoZSBzYW1lIHByaW9yaXR5KS4gIEluIHRoZSB0YWJsZSxcbipzKiBhbmQgKnQqIGFyZSBzZXF1ZW5jZXMgb2YgdGhlIHNhbWUgdHlwZTsgKm4qLCAqaSogYW5kICpqKiBhcmVcbmludGVnZXJzOlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IE9wZXJhdGlvbiAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT0rXG58IGBgeCBpbiBzYGAgICAgICAgICB8IGBgVHJ1ZWBgIGlmIGFuIGl0ZW0gb2YgKnMqIGlzICAgIHwgKDEpICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSBgYEZhbHNlYGAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgeCBub3QgaW4gc2BgICAgICB8IGBgRmFsc2VgYCBpZiBhbiBpdGVtIG9mICpzKiBpcyAgIHwgKDEpICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8IGVxdWFsIHRvICp4KiwgZWxzZSBgYFRydWVgYCAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgcyArIHRgYCAgICAgICAgICB8IHRoZSBjb25jYXRlbmF0aW9uIG9mICpzKiBhbmQgKnQqIHwgKDYpICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgcyAqIG4sIG4gKiBzYGAgICB8ICpuKiBzaGFsbG93IGNvcGllcyBvZiAqcyogICAgICAgIHwgKDIpICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8IGNvbmNhdGVuYXRlZCAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgc1tpXWBgICAgICAgICAgICB8ICppKnRoIGl0ZW0gb2YgKnMqLCBvcmlnaW4gMCAgICAgIHwgKDMpICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgc1tpOmpdYGAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgIHwgKDMpKDQpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgc1tpOmo6a11gYCAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogICAgIHwgKDMpKDUpICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8IHdpdGggc3RlcCAqayogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgbGVuKHMpYGAgICAgICAgICB8IGxlbmd0aCBvZiAqcyogICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgbWluKHMpYGAgICAgICAgICB8IHNtYWxsZXN0IGl0ZW0gb2YgKnMqICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgbWF4KHMpYGAgICAgICAgICB8IGxhcmdlc3QgaXRlbSBvZiAqcyogICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgcy5pbmRleChpKWBgICAgICB8IGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2YgIHwgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8ICppKiBpbiAqcyogICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG58IGBgcy5jb3VudChpKWBgICAgICB8IHRvdGFsIG51bWJlciBvZiBvY2N1cmVuY2VzIG9mICAgIHwgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICB8ICppKiBpbiAqcyogICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rXG5cblNlcXVlbmNlIHR5cGVzIGFsc28gc3VwcG9ydCBjb21wYXJpc29ucy4gSW4gcGFydGljdWxhciwgdHVwbGVzIGFuZFxubGlzdHMgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IGJ5IGNvbXBhcmluZyBjb3JyZXNwb25kaW5nXG5lbGVtZW50cy4gVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGV2ZXJ5IGVsZW1lbnQgbXVzdCBjb21wYXJlXG5lcXVhbCBhbmQgdGhlIHR3byBzZXF1ZW5jZXMgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCBoYXZlIHRoZSBzYW1lXG5sZW5ndGguIChGb3IgZnVsbCBkZXRhaWxzIHNlZSAqQ29tcGFyaXNvbnMqIGluIHRoZSBsYW5ndWFnZVxucmVmZXJlbmNlLilcblxuTm90ZXM6XG5cbjEuIFdoZW4gKnMqIGlzIGEgc3RyaW5nIG9yIFVuaWNvZGUgc3RyaW5nIG9iamVjdCB0aGUgYGBpbmBgIGFuZCBgYG5vdFxuICAgaW5gYCBvcGVyYXRpb25zIGFjdCBsaWtlIGEgc3Vic3RyaW5nIHRlc3QuICBJbiBQeXRob24gdmVyc2lvbnNcbiAgIGJlZm9yZSAyLjMsICp4KiBoYWQgdG8gYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDEuIEluIFB5dGhvbiAyLjMgYW5kXG4gICBiZXlvbmQsICp4KiBtYXkgYmUgYSBzdHJpbmcgb2YgYW55IGxlbmd0aC5cblxuMi4gVmFsdWVzIG9mICpuKiBsZXNzIHRoYW4gYGAwYGAgYXJlIHRyZWF0ZWQgYXMgYGAwYGAgKHdoaWNoIHlpZWxkcyBhblxuICAgZW1wdHkgc2VxdWVuY2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyAqcyopLiAgTm90ZSBhbHNvIHRoYXQgdGhlIGNvcGllc1xuICAgYXJlIHNoYWxsb3c7IG5lc3RlZCBzdHJ1Y3R1cmVzIGFyZSBub3QgY29waWVkLiAgVGhpcyBvZnRlbiBoYXVudHNcbiAgIG5ldyBQeXRob24gcHJvZ3JhbW1lcnM7IGNvbnNpZGVyOlxuXG4gICA+Pj4gbGlzdHMgPSBbW11dICogM1xuICAgPj4+IGxpc3RzXG4gICBbW10sIFtdLCBbXV1cbiAgID4+PiBsaXN0c1swXS5hcHBlbmQoMylcbiAgID4+PiBsaXN0c1xuICAgW1szXSwgWzNdLCBbM11dXG5cbiAgIFdoYXQgaGFzIGhhcHBlbmVkIGlzIHRoYXQgYGBbW11dYGAgaXMgYSBvbmUtZWxlbWVudCBsaXN0IGNvbnRhaW5pbmdcbiAgIGFuIGVtcHR5IGxpc3QsIHNvIGFsbCB0aHJlZSBlbGVtZW50cyBvZiBgYFtbXV0gKiAzYGAgYXJlIChwb2ludGVyc1xuICAgdG8pIHRoaXMgc2luZ2xlIGVtcHR5IGxpc3QuICBNb2RpZnlpbmcgYW55IG9mIHRoZSBlbGVtZW50cyBvZlxuICAgYGBsaXN0c2BgIG1vZGlmaWVzIHRoaXMgc2luZ2xlIGxpc3QuIFlvdSBjYW4gY3JlYXRlIGEgbGlzdCBvZlxuICAgZGlmZmVyZW50IGxpc3RzIHRoaXMgd2F5OlxuXG4gICA+Pj4gbGlzdHMgPSBbW10gZm9yIGkgaW4gcmFuZ2UoMyldXG4gICA+Pj4gbGlzdHNbMF0uYXBwZW5kKDMpXG4gICA+Pj4gbGlzdHNbMV0uYXBwZW5kKDUpXG4gICA+Pj4gbGlzdHNbMl0uYXBwZW5kKDcpXG4gICA+Pj4gbGlzdHNcbiAgIFtbM10sIFs1XSwgWzddXVxuXG4zLiBJZiAqaSogb3IgKmoqIGlzIG5lZ2F0aXZlLCB0aGUgaW5kZXggaXMgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGVcbiAgIHN0cmluZzogYGBsZW4ocykgKyBpYGAgb3IgYGBsZW4ocykgKyBqYGAgaXMgc3Vic3RpdHV0ZWQuICBCdXQgbm90ZVxuICAgdGhhdCBgYC0wYGAgaXMgc3RpbGwgYGAwYGAuXG5cbjQuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzIGRlZmluZWQgYXMgdGhlIHNlcXVlbmNlIG9mXG4gICBpdGVtcyB3aXRoIGluZGV4ICprKiBzdWNoIHRoYXQgYGBpIDw9IGsgPCBqYGAuICBJZiAqaSogb3IgKmoqIGlzXG4gICBncmVhdGVyIHRoYW4gYGBsZW4ocylgYCwgdXNlIGBgbGVuKHMpYGAuICBJZiAqaSogaXMgb21pdHRlZCBvclxuICAgYGBOb25lYGAsIHVzZSBgYDBgYC4gIElmICpqKiBpcyBvbWl0dGVkIG9yIGBgTm9uZWBgLCB1c2VcbiAgIGBgbGVuKHMpYGAuICBJZiAqaSogaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICpqKiwgdGhlIHNsaWNlIGlzXG4gICBlbXB0eS5cblxuNS4gVGhlIHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogd2l0aCBzdGVwICprKiBpcyBkZWZpbmVkIGFzIHRoZVxuICAgc2VxdWVuY2Ugb2YgaXRlbXMgd2l0aCBpbmRleCAgYGB4ID0gaSArIG4qa2BgIHN1Y2ggdGhhdCBgYDAgPD0gbiA8XG4gICAoai1pKS9rYGAuICBJbiBvdGhlciB3b3JkcywgdGhlIGluZGljZXMgYXJlIGBgaWBgLCBgYGkra2BgLFxuICAgYGBpKzIqa2BgLCBgYGkrMyprYGAgYW5kIHNvIG9uLCBzdG9wcGluZyB3aGVuICpqKiBpcyByZWFjaGVkIChidXRcbiAgIG5ldmVyIGluY2x1ZGluZyAqaiopLiAgSWYgKmkqIG9yICpqKiBpcyBncmVhdGVyIHRoYW4gYGBsZW4ocylgYCxcbiAgIHVzZSBgYGxlbihzKWBgLiAgSWYgKmkqIG9yICpqKiBhcmUgb21pdHRlZCBvciBgYE5vbmVgYCwgdGhleSBiZWNvbWVcbiAgICJlbmQiIHZhbHVlcyAod2hpY2ggZW5kIGRlcGVuZHMgb24gdGhlIHNpZ24gb2YgKmsqKS4gIE5vdGUsICprKlxuICAgY2Fubm90IGJlIHplcm8uIElmICprKiBpcyBgYE5vbmVgYCwgaXQgaXMgdHJlYXRlZCBsaWtlIGBgMWBgLlxuXG42LiAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIElmICpzKiBhbmQgKnQqIGFyZSBib3RoIHN0cmluZ3MsXG4gICBzb21lIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMgc3VjaCBhcyBDUHl0aG9uIGNhbiB1c3VhbGx5IHBlcmZvcm0gYW5cbiAgIGluLXBsYWNlIG9wdGltaXphdGlvbiBmb3IgYXNzaWdubWVudHMgb2YgdGhlIGZvcm0gYGBzID0gcyArIHRgYCBvclxuICAgYGBzICs9IHRgYC4gIFdoZW4gYXBwbGljYWJsZSwgdGhpcyBvcHRpbWl6YXRpb24gbWFrZXMgcXVhZHJhdGljXG4gICBydW4tdGltZSBtdWNoIGxlc3MgbGlrZWx5LiAgVGhpcyBvcHRpbWl6YXRpb24gaXMgYm90aCB2ZXJzaW9uIGFuZFxuICAgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiAgRm9yIHBlcmZvcm1hbmNlIHNlbnNpdGl2ZSBjb2RlLCBpdCBpc1xuICAgcHJlZmVyYWJsZSB0byB1c2UgdGhlIGBgc3RyLmpvaW4oKWBgIG1ldGhvZCB3aGljaCBhc3N1cmVzXG4gICBjb25zaXN0ZW50IGxpbmVhciBjb25jYXRlbmF0aW9uIHBlcmZvcm1hbmNlIGFjcm9zcyB2ZXJzaW9ucyBhbmRcbiAgIGltcGxlbWVudGF0aW9ucy5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogRm9ybWVybHksIHN0cmluZyBjb25jYXRlbmF0aW9uIG5ldmVyXG4gICBvY2N1cnJlZCBpbi1wbGFjZS5cblxuXG5TdHJpbmcgTWV0aG9kc1xuPT09PT09PT09PT09PT1cblxuQmVsb3cgYXJlIGxpc3RlZCB0aGUgc3RyaW5nIG1ldGhvZHMgd2hpY2ggYm90aCA4LWJpdCBzdHJpbmdzIGFuZFxuVW5pY29kZSBvYmplY3RzIHN1cHBvcnQuICBTb21lIG9mIHRoZW0gYXJlIGFsc28gYXZhaWxhYmxlIG9uXG5gYGJ5dGVhcnJheWBgIG9iamVjdHMuXG5cbkluIGFkZGl0aW9uLCBQeXRob25cJ3Mgc3RyaW5ncyBzdXBwb3J0IHRoZSBzZXF1ZW5jZSB0eXBlIG1ldGhvZHNcbmRlc2NyaWJlZCBpbiB0aGUgKlNlcXVlbmNlIFR5cGVzIC0tLSBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlLFxuYnl0ZWFycmF5LCBidWZmZXIsIHhyYW5nZSogc2VjdGlvbi4gVG8gb3V0cHV0IGZvcm1hdHRlZCBzdHJpbmdzIHVzZVxudGVtcGxhdGUgc3RyaW5ncyBvciB0aGUgYGAlYGAgb3BlcmF0b3IgZGVzY3JpYmVkIGluIHRoZSAqU3RyaW5nXG5Gb3JtYXR0aW5nIE9wZXJhdGlvbnMqIHNlY3Rpb24uIEFsc28sIHNlZSB0aGUgYGByZWBgIG1vZHVsZSBmb3Igc3RyaW5nXG5mdW5jdGlvbnMgYmFzZWQgb24gcmVndWxhciBleHByZXNzaW9ucy5cblxuc3RyLmNhcGl0YWxpemUoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgY2hhcmFjdGVyIGNhcGl0YWxpemVkXG4gICBhbmQgdGhlIHJlc3QgbG93ZXJjYXNlZC5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5jZW50ZXIod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiBjZW50ZXJlZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi4gUGFkZGluZyBpcyBkb25lXG4gICB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYSBzcGFjZSkuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIuY291bnQoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyAqc3ViKlxuICAgaW4gdGhlIHJhbmdlIFsqc3RhcnQqLCAqZW5kKl0uICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmRcbiAgICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi5cblxuc3RyLmRlY29kZShbZW5jb2RpbmdbLCBlcnJvcnNdXSlcblxuICAgRGVjb2RlcyB0aGUgc3RyaW5nIHVzaW5nIHRoZSBjb2RlYyByZWdpc3RlcmVkIGZvciAqZW5jb2RpbmcqLlxuICAgKmVuY29kaW5nKiBkZWZhdWx0cyB0byB0aGUgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICAqZXJyb3JzKiBtYXlcbiAgIGJlIGdpdmVuIHRvIHNldCBhIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBUaGUgZGVmYXVsdCBpc1xuICAgYGBcJ3N0cmljdFwnYGAsIG1lYW5pbmcgdGhhdCBlbmNvZGluZyBlcnJvcnMgcmFpc2UgYGBVbmljb2RlRXJyb3JgYC5cbiAgIE90aGVyIHBvc3NpYmxlIHZhbHVlcyBhcmUgYGBcJ2lnbm9yZVwnYGAsIGBgXCdyZXBsYWNlXCdgYCBhbmQgYW55IG90aGVyXG4gICBuYW1lIHJlZ2lzdGVyZWQgdmlhIGBgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKClgYCwgc2VlIHNlY3Rpb24gKkNvZGVjXG4gICBCYXNlIENsYXNzZXMqLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFN1cHBvcnQgZm9yIG90aGVyIGVycm9yIGhhbmRsaW5nIHNjaGVtZXNcbiAgIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC5cblxuc3RyLmVuY29kZShbZW5jb2RpbmdbLCBlcnJvcnNdXSlcblxuICAgUmV0dXJuIGFuIGVuY29kZWQgdmVyc2lvbiBvZiB0aGUgc3RyaW5nLiAgRGVmYXVsdCBlbmNvZGluZyBpcyB0aGVcbiAgIGN1cnJlbnQgZGVmYXVsdCBzdHJpbmcgZW5jb2RpbmcuICAqZXJyb3JzKiBtYXkgYmUgZ2l2ZW4gdG8gc2V0IGFcbiAgIGRpZmZlcmVudCBlcnJvciBoYW5kbGluZyBzY2hlbWUuICBUaGUgZGVmYXVsdCBmb3IgKmVycm9ycyogaXNcbiAgIGBgXCdzdHJpY3RcJ2BgLCBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGFcbiAgIGBgVW5pY29kZUVycm9yYGAuICBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgXCdpZ25vcmVcJ2BgLFxuICAgYGBcJ3JlcGxhY2VcJ2BgLCBgYFwneG1sY2hhcnJlZnJlcGxhY2VcJ2BgLCBgYFwnYmFja3NsYXNocmVwbGFjZVwnYGAgYW5kXG4gICBhbnkgb3RoZXIgbmFtZSByZWdpc3RlcmVkIHZpYSBgYGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpYGAsIHNlZVxuICAgc2VjdGlvbiAqQ29kZWMgQmFzZSBDbGFzc2VzKi4gRm9yIGEgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MsIHNlZVxuICAgc2VjdGlvbiAqU3RhbmRhcmQgRW5jb2RpbmdzKi5cblxuICAgTmV3IGluIHZlcnNpb24gMi4wLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBgYFwneG1sY2hhcnJlZnJlcGxhY2VcJ2BgIGFuZFxuICAgYGBcJ2JhY2tzbGFzaHJlcGxhY2VcJ2BgIGFuZCBvdGhlciBlcnJvciBoYW5kbGluZyBzY2hlbWVzIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBrZXl3b3JkIGFyZ3VtZW50cyBhZGRlZC5cblxuc3RyLmVuZHN3aXRoKHN1ZmZpeFssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiBgYFRydWVgYCBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCB0aGUgc3BlY2lmaWVkICpzdWZmaXgqLFxuICAgb3RoZXJ3aXNlIHJldHVybiBgYEZhbHNlYGAuICAqc3VmZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mXG4gICBzdWZmaXhlcyB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBiZWdpbm5pbmcgYXRcbiAgIHRoYXQgcG9zaXRpb24uICBXaXRoIG9wdGlvbmFsICplbmQqLCBzdG9wIGNvbXBhcmluZyBhdCB0aGF0XG4gICBwb3NpdGlvbi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogQWNjZXB0IHR1cGxlcyBhcyAqc3VmZml4Ki5cblxuc3RyLmV4cGFuZHRhYnMoW3RhYnNpemVdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgYWxsIHRhYiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZFxuICAgYnkgb25lIG9yIG1vcmUgc3BhY2VzLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgY29sdW1uIGFuZCB0aGVcbiAgIGdpdmVuIHRhYiBzaXplLiAgVGFiIHBvc2l0aW9ucyBvY2N1ciBldmVyeSAqdGFic2l6ZSogY2hhcmFjdGVyc1xuICAgKGRlZmF1bHQgaXMgOCwgZ2l2aW5nIHRhYiBwb3NpdGlvbnMgYXQgY29sdW1ucyAwLCA4LCAxNiBhbmQgc28gb24pLlxuICAgVG8gZXhwYW5kIHRoZSBzdHJpbmcsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBzZXQgdG8gemVybyBhbmQgdGhlXG4gICBzdHJpbmcgaXMgZXhhbWluZWQgY2hhcmFjdGVyIGJ5IGNoYXJhY3Rlci4gIElmIHRoZSBjaGFyYWN0ZXIgaXMgYVxuICAgdGFiIChgYFxcdGBgKSwgb25lIG9yIG1vcmUgc3BhY2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQgaW4gdGhlXG4gICByZXN1bHQgdW50aWwgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGVxdWFsIHRvIHRoZSBuZXh0IHRhYiBwb3NpdGlvbi5cbiAgIChUaGUgdGFiIGNoYXJhY3RlciBpdHNlbGYgaXMgbm90IGNvcGllZC4pICBJZiB0aGUgY2hhcmFjdGVyIGlzIGFcbiAgIG5ld2xpbmUgKGBgXFxuYGApIG9yIHJldHVybiAoYGBcXHJgYCksIGl0IGlzIGNvcGllZCBhbmQgdGhlIGN1cnJlbnRcbiAgIGNvbHVtbiBpcyByZXNldCB0byB6ZXJvLiAgQW55IG90aGVyIGNoYXJhY3RlciBpcyBjb3BpZWQgdW5jaGFuZ2VkXG4gICBhbmQgdGhlIGN1cnJlbnQgY29sdW1uIGlzIGluY3JlbWVudGVkIGJ5IG9uZSByZWdhcmRsZXNzIG9mIGhvdyB0aGVcbiAgIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCB3aGVuIHByaW50ZWQuXG5cbiAgID4+PiBcJzAxXFx0MDEyXFx0MDEyM1xcdDAxMjM0XCcuZXhwYW5kdGFicygpXG4gICBcJzAxICAgICAgMDEyICAgICAwMTIzICAgIDAxMjM0XCdcbiAgID4+PiBcJzAxXFx0MDEyXFx0MDEyM1xcdDAxMjM0XCcuZXhwYW5kdGFicyg0KVxuICAgXCcwMSAgMDEyIDAxMjMgICAgMDEyMzRcJ1xuXG5zdHIuZmluZChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgZm91bmQsIHN1Y2ggdGhhdCAqc3ViKiBpcyBjb250YWluZWQgaW4gdGhlIHNsaWNlIGBgc1tzdGFydDplbmRdYGAuXG4gICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlXG4gICBub3RhdGlvbi4gIFJldHVybiBgYC0xYGAgaWYgKnN1YiogaXMgbm90IGZvdW5kLlxuXG4gICBOb3RlOiBUaGUgYGBmaW5kKClgYCBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgb25seSBpZiB5b3UgbmVlZCB0byBrbm93IHRoZVxuICAgICBwb3NpdGlvbiBvZiAqc3ViKi4gIFRvIGNoZWNrIGlmICpzdWIqIGlzIGEgc3Vic3RyaW5nIG9yIG5vdCwgdXNlXG4gICAgIHRoZSBgYGluYGAgb3BlcmF0b3I6XG5cbiAgICAgICAgPj4+IFwnUHlcJyBpbiBcJ1B5dGhvblwnXG4gICAgICAgIFRydWVcblxuc3RyLmZvcm1hdCgqYXJncywgKiprd2FyZ3MpXG5cbiAgIFBlcmZvcm0gYSBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRpb24uICBUaGUgc3RyaW5nIG9uIHdoaWNoIHRoaXNcbiAgIG1ldGhvZCBpcyBjYWxsZWQgY2FuIGNvbnRhaW4gbGl0ZXJhbCB0ZXh0IG9yIHJlcGxhY2VtZW50IGZpZWxkc1xuICAgZGVsaW1pdGVkIGJ5IGJyYWNlcyBgYHt9YGAuICBFYWNoIHJlcGxhY2VtZW50IGZpZWxkIGNvbnRhaW5zIGVpdGhlclxuICAgdGhlIG51bWVyaWMgaW5kZXggb2YgYSBwb3NpdGlvbmFsIGFyZ3VtZW50LCBvciB0aGUgbmFtZSBvZiBhXG4gICBrZXl3b3JkIGFyZ3VtZW50LiAgUmV0dXJucyBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aGVyZSBlYWNoXG4gICByZXBsYWNlbWVudCBmaWVsZCBpcyByZXBsYWNlZCB3aXRoIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlXG4gICBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LlxuXG4gICA+Pj4gIlRoZSBzdW0gb2YgMSArIDIgaXMgezB9Ii5mb3JtYXQoMSsyKVxuICAgXCdUaGUgc3VtIG9mIDEgKyAyIGlzIDNcJ1xuXG4gICBTZWUgKkZvcm1hdCBTdHJpbmcgU3ludGF4KiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgdmFyaW91c1xuICAgZm9ybWF0dGluZyBvcHRpb25zIHRoYXQgY2FuIGJlIHNwZWNpZmllZCBpbiBmb3JtYXQgc3RyaW5ncy5cblxuICAgVGhpcyBtZXRob2Qgb2Ygc3RyaW5nIGZvcm1hdHRpbmcgaXMgdGhlIG5ldyBzdGFuZGFyZCBpbiBQeXRob24gMyxcbiAgIGFuZCBzaG91bGQgYmUgcHJlZmVycmVkIHRvIHRoZSBgYCVgYCBmb3JtYXR0aW5nIGRlc2NyaWJlZCBpblxuICAgKlN0cmluZyBGb3JtYXR0aW5nIE9wZXJhdGlvbnMqIGluIG5ldyBjb2RlLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjYuXG5cbnN0ci5pbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBMaWtlIGBgZmluZCgpYGAsIGJ1dCByYWlzZSBgYFZhbHVlRXJyb3JgYCB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90XG4gICBmb3VuZC5cblxuc3RyLmlzYWxudW0oKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYW51bWVyaWMgYW5kXG4gICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNhbHBoYSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGFscGhhYmV0aWMgYW5kXG4gICB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNkaWdpdCgpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgYXJlIGRpZ2l0cyBhbmQgdGhlcmUgaXNcbiAgIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5pc2xvd2VyKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlIGxvd2VyY2FzZVxuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5pc3NwYWNlKClcblxuICAgUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmdcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXN0aXRsZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgaXMgYSB0aXRsZWNhc2VkIHN0cmluZyBhbmQgdGhlcmUgaXMgYXRcbiAgIGxlYXN0IG9uZSBjaGFyYWN0ZXIsIGZvciBleGFtcGxlIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIG1heSBvbmx5XG4gICBmb2xsb3cgdW5jYXNlZCBjaGFyYWN0ZXJzIGFuZCBsb3dlcmNhc2UgY2hhcmFjdGVycyBvbmx5IGNhc2VkIG9uZXMuXG4gICBSZXR1cm4gZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzdXBwZXIoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2FzZWQgY2hhcmFjdGVycyBbNF0gaW4gdGhlIHN0cmluZyBhcmUgdXBwZXJjYXNlXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNhc2VkIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmpvaW4oaXRlcmFibGUpXG5cbiAgIFJldHVybiBhIHN0cmluZyB3aGljaCBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgc3RyaW5ncyBpbiB0aGVcbiAgICppdGVyYWJsZSogKml0ZXJhYmxlKi4gIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBlbGVtZW50cyBpcyB0aGVcbiAgIHN0cmluZyBwcm92aWRpbmcgdGhpcyBtZXRob2QuXG5cbnN0ci5sanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIHRoZSBzdHJpbmcgbGVmdCBqdXN0aWZpZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouXG4gICBQYWRkaW5nIGlzIGRvbmUgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGFcbiAgIHNwYWNlKS4gIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3JcbiAgIGVxdWFsIHRvIGBgbGVuKHMpYGAuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIubG93ZXIoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkIGNoYXJhY3RlcnMgWzRdXG4gICBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmxzdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBsZWFkaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgcHJlZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLmxzdHJpcCgpXG4gICBcJ3NwYWNpb3VzICAgXCdcbiAgID4+PiBcJ3d3dy5leGFtcGxlLmNvbVwnLmxzdHJpcChcJ2Ntb3d6LlwnKVxuICAgXCdleGFtcGxlLmNvbVwnXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjIuMjogU3VwcG9ydCBmb3IgdGhlICpjaGFycyogYXJndW1lbnQuXG5cbnN0ci5wYXJ0aXRpb24oc2VwKVxuXG4gICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICpzZXAqLCBhbmQgcmV0dXJuIGFcbiAgIDMtdHVwbGUgY29udGFpbmluZyB0aGUgcGFydCBiZWZvcmUgdGhlIHNlcGFyYXRvciwgdGhlIHNlcGFyYXRvclxuICAgaXRzZWxmLCBhbmQgdGhlIHBhcnQgYWZ0ZXIgdGhlIHNlcGFyYXRvci4gIElmIHRoZSBzZXBhcmF0b3IgaXMgbm90XG4gICBmb3VuZCwgcmV0dXJuIGEgMy10dXBsZSBjb250YWluaW5nIHRoZSBzdHJpbmcgaXRzZWxmLCBmb2xsb3dlZCBieVxuICAgdHdvIGVtcHR5IHN0cmluZ3MuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNS5cblxuc3RyLnJlcGxhY2Uob2xkLCBuZXdbLCBjb3VudF0pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKm9sZCpcbiAgIHJlcGxhY2VkIGJ5ICpuZXcqLiAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50ICpjb3VudCogaXMgZ2l2ZW4sIG9ubHlcbiAgIHRoZSBmaXJzdCAqY291bnQqIG9jY3VycmVuY2VzIGFyZSByZXBsYWNlZC5cblxuc3RyLnJmaW5kKHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiB0aGUgc3RyaW5nIHdoZXJlIHN1YnN0cmluZyAqc3ViKiBpc1xuICAgZm91bmQsIHN1Y2ggdGhhdCAqc3ViKiBpcyBjb250YWluZWQgd2l0aGluIGBgc1tzdGFydDplbmRdYGAuXG4gICBPcHRpb25hbCBhcmd1bWVudHMgKnN0YXJ0KiBhbmQgKmVuZCogYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlXG4gICBub3RhdGlvbi4gIFJldHVybiBgYC0xYGAgb24gZmFpbHVyZS5cblxuc3RyLnJpbmRleChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBMaWtlIGBgcmZpbmQoKWBgIGJ1dCByYWlzZXMgYGBWYWx1ZUVycm9yYGAgd2hlbiB0aGUgc3Vic3RyaW5nICpzdWIqXG4gICBpcyBub3QgZm91bmQuXG5cbnN0ci5yanVzdCh3aWR0aFssIGZpbGxjaGFyXSlcblxuICAgUmV0dXJuIHRoZSBzdHJpbmcgcmlnaHQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLlxuICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhXG4gICBzcGFjZSkuIFRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3JcbiAgIGVxdWFsIHRvIGBgbGVuKHMpYGAuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yIHRoZSAqZmlsbGNoYXIqIGFyZ3VtZW50LlxuXG5zdHIucnBhcnRpdGlvbihzZXApXG5cbiAgIFNwbGl0IHRoZSBzdHJpbmcgYXQgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhXG4gICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcbiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0d28gZW1wdHkgc3RyaW5ncywgZm9sbG93ZWQgYnlcbiAgIHRoZSBzdHJpbmcgaXRzZWxmLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbnN0ci5yc3BsaXQoW3NlcFssIG1heHNwbGl0XV0pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gSWYgKm1heHNwbGl0KiBpcyBnaXZlbiwgYXQgbW9zdCAqbWF4c3BsaXQqIHNwbGl0c1xuICAgYXJlIGRvbmUsIHRoZSAqcmlnaHRtb3N0KiBvbmVzLiAgSWYgKnNlcCogaXMgbm90IHNwZWNpZmllZCBvclxuICAgYGBOb25lYGAsIGFueSB3aGl0ZXNwYWNlIHN0cmluZyBpcyBhIHNlcGFyYXRvci4gIEV4Y2VwdCBmb3JcbiAgIHNwbGl0dGluZyBmcm9tIHRoZSByaWdodCwgYGByc3BsaXQoKWBgIGJlaGF2ZXMgbGlrZSBgYHNwbGl0KClgYFxuICAgd2hpY2ggaXMgZGVzY3JpYmVkIGluIGRldGFpbCBiZWxvdy5cblxuICAgTmV3IGluIHZlcnNpb24gMi40LlxuXG5zdHIucnN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRyYWlsaW5nIGNoYXJhY3RlcnMgcmVtb3ZlZC4gIFRoZVxuICAgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZVxuICAgcmVtb3ZlZC4gIElmIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZSAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvXG4gICByZW1vdmluZyB3aGl0ZXNwYWNlLiAgVGhlICpjaGFycyogYXJndW1lbnQgaXMgbm90IGEgc3VmZml4OyByYXRoZXIsXG4gICBhbGwgY29tYmluYXRpb25zIG9mIGl0cyB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLnJzdHJpcCgpXG4gICBcJyAgIHNwYWNpb3VzXCdcbiAgID4+PiBcJ21pc3Npc3NpcHBpXCcucnN0cmlwKFwnaXB6XCcpXG4gICBcJ21pc3Npc3NcJ1xuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yLjI6IFN1cHBvcnQgZm9yIHRoZSAqY2hhcnMqIGFyZ3VtZW50LlxuXG5zdHIuc3BsaXQoW3NlcFssIG1heHNwbGl0XV0pXG5cbiAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcsIHVzaW5nICpzZXAqIGFzIHRoZVxuICAgZGVsaW1pdGVyIHN0cmluZy4gIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KlxuICAgc3BsaXRzIGFyZSBkb25lICh0aHVzLCB0aGUgbGlzdCB3aWxsIGhhdmUgYXQgbW9zdCBgYG1heHNwbGl0KzFgYFxuICAgZWxlbWVudHMpLiAgSWYgKm1heHNwbGl0KiBpcyBub3Qgc3BlY2lmaWVkIG9yIGBgLTFgYCwgdGhlbiB0aGVyZSBpc1xuICAgbm8gbGltaXQgb24gdGhlIG51bWJlciBvZiBzcGxpdHMgKGFsbCBwb3NzaWJsZSBzcGxpdHMgYXJlIG1hZGUpLlxuXG4gICBJZiAqc2VwKiBpcyBnaXZlbiwgY29uc2VjdXRpdmUgZGVsaW1pdGVycyBhcmUgbm90IGdyb3VwZWQgdG9nZXRoZXJcbiAgIGFuZCBhcmUgZGVlbWVkIHRvIGRlbGltaXQgZW1wdHkgc3RyaW5ncyAoZm9yIGV4YW1wbGUsXG4gICBgYFwnMSwsMlwnLnNwbGl0KFwnLFwnKWBgIHJldHVybnMgYGBbXCcxXCcsIFwnXCcsIFwnMlwnXWBgKS4gIFRoZSAqc2VwKlxuICAgYXJndW1lbnQgbWF5IGNvbnNpc3Qgb2YgbXVsdGlwbGUgY2hhcmFjdGVycyAoZm9yIGV4YW1wbGUsXG4gICBgYFwnMTw+Mjw+M1wnLnNwbGl0KFwnPD5cJylgYCByZXR1cm5zIGBgW1wnMVwnLCBcJzJcJywgXCczXCddYGApLiBTcGxpdHRpbmdcbiAgIGFuIGVtcHR5IHN0cmluZyB3aXRoIGEgc3BlY2lmaWVkIHNlcGFyYXRvciByZXR1cm5zIGBgW1wnXCddYGAuXG5cbiAgIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgYGBOb25lYGAsIGEgZGlmZmVyZW50IHNwbGl0dGluZ1xuICAgYWxnb3JpdGhtIGlzIGFwcGxpZWQ6IHJ1bnMgb2YgY29uc2VjdXRpdmUgd2hpdGVzcGFjZSBhcmUgcmVnYXJkZWRcbiAgIGFzIGEgc2luZ2xlIHNlcGFyYXRvciwgYW5kIHRoZSByZXN1bHQgd2lsbCBjb250YWluIG5vIGVtcHR5IHN0cmluZ3NcbiAgIGF0IHRoZSBzdGFydCBvciBlbmQgaWYgdGhlIHN0cmluZyBoYXMgbGVhZGluZyBvciB0cmFpbGluZ1xuICAgd2hpdGVzcGFjZS4gIENvbnNlcXVlbnRseSwgc3BsaXR0aW5nIGFuIGVtcHR5IHN0cmluZyBvciBhIHN0cmluZ1xuICAgY29uc2lzdGluZyBvZiBqdXN0IHdoaXRlc3BhY2Ugd2l0aCBhIGBgTm9uZWBgIHNlcGFyYXRvciByZXR1cm5zXG4gICBgYFtdYGAuXG5cbiAgIEZvciBleGFtcGxlLCBgYFwnIDEgIDIgICAzICBcJy5zcGxpdCgpYGAgcmV0dXJucyBgYFtcJzFcJywgXCcyXCcsIFwnM1wnXWBgLFxuICAgYW5kIGBgXCcgIDEgIDIgICAzICBcJy5zcGxpdChOb25lLCAxKWBgIHJldHVybnMgYGBbXCcxXCcsIFwnMiAgIDMgIFwnXWBgLlxuXG5zdHIuc3BsaXRsaW5lcyhba2VlcGVuZHNdKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSBsaW5lcyBpbiB0aGUgc3RyaW5nLCBicmVha2luZyBhdCBsaW5lXG4gICBib3VuZGFyaWVzLiBUaGlzIG1ldGhvZCB1c2VzIHRoZSAqdW5pdmVyc2FsIG5ld2xpbmVzKiBhcHByb2FjaCB0b1xuICAgc3BsaXR0aW5nIGxpbmVzLiBMaW5lIGJyZWFrcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdFxuICAgdW5sZXNzICprZWVwZW5kcyogaXMgZ2l2ZW4gYW5kIHRydWUuXG5cbiAgIEZvciBleGFtcGxlLCBgYFwnYWIgY1xcblxcbmRlIGZnXFxya2xcXHJcXG5cJy5zcGxpdGxpbmVzKClgYCByZXR1cm5zXG4gICBgYFtcJ2FiIGNcJywgXCdcJywgXCdkZSBmZ1wnLCBcJ2tsXCddYGAsIHdoaWxlIHRoZSBzYW1lIGNhbGwgd2l0aFxuICAgYGBzcGxpdGxpbmVzKFRydWUpYGAgcmV0dXJucyBgYFtcJ2FiIGNcXG5cJywgXCdcXG5cJywgXCdkZSBmZ1xcclwnLFxuICAgXCdrbFxcclxcblwnXWBgLlxuXG4gICBVbmxpa2UgYGBzcGxpdCgpYGAgd2hlbiBhIGRlbGltaXRlciBzdHJpbmcgKnNlcCogaXMgZ2l2ZW4sIHRoaXNcbiAgIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IGxpc3QgZm9yIHRoZSBlbXB0eSBzdHJpbmcsIGFuZCBhIHRlcm1pbmFsXG4gICBsaW5lIGJyZWFrIGRvZXMgbm90IHJlc3VsdCBpbiBhbiBleHRyYSBsaW5lLlxuXG5zdHIuc3RhcnRzd2l0aChwcmVmaXhbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSAqcHJlZml4Kiwgb3RoZXJ3aXNlXG4gICByZXR1cm4gYGBGYWxzZWBgLiAqcHJlZml4KiBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHByZWZpeGVzIHRvIGxvb2tcbiAgIGZvci4gIFdpdGggb3B0aW9uYWwgKnN0YXJ0KiwgdGVzdCBzdHJpbmcgYmVnaW5uaW5nIGF0IHRoYXRcbiAgIHBvc2l0aW9uLiAgV2l0aCBvcHRpb25hbCAqZW5kKiwgc3RvcCBjb21wYXJpbmcgc3RyaW5nIGF0IHRoYXRcbiAgIHBvc2l0aW9uLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi41OiBBY2NlcHQgdHVwbGVzIGFzICpwcmVmaXgqLlxuXG5zdHIuc3RyaXAoW2NoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG4gICBjaGFyYWN0ZXJzIHJlbW92ZWQuIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgdGhlXG4gICBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSByZW1vdmVkLiBJZiBvbWl0dGVkIG9yIGBgTm9uZWBgLCB0aGVcbiAgICpjaGFycyogYXJndW1lbnQgZGVmYXVsdHMgdG8gcmVtb3Zpbmcgd2hpdGVzcGFjZS4gVGhlICpjaGFycypcbiAgIGFyZ3VtZW50IGlzIG5vdCBhIHByZWZpeCBvciBzdWZmaXg7IHJhdGhlciwgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHNcbiAgIHZhbHVlcyBhcmUgc3RyaXBwZWQ6XG5cbiAgID4+PiBcJyAgIHNwYWNpb3VzICAgXCcuc3RyaXAoKVxuICAgXCdzcGFjaW91c1wnXG4gICA+Pj4gXCd3d3cuZXhhbXBsZS5jb21cJy5zdHJpcChcJ2Ntb3d6LlwnKVxuICAgXCdleGFtcGxlXCdcblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMi4yOiBTdXBwb3J0IGZvciB0aGUgKmNoYXJzKiBhcmd1bWVudC5cblxuc3RyLnN3YXBjYXNlKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggdXBwZXJjYXNlIGNoYXJhY3RlcnMgY29udmVydGVkIHRvXG4gICBsb3dlcmNhc2UgYW5kIHZpY2UgdmVyc2EuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIudGl0bGUoKVxuXG4gICBSZXR1cm4gYSB0aXRsZWNhc2VkIHZlcnNpb24gb2YgdGhlIHN0cmluZyB3aGVyZSB3b3JkcyBzdGFydCB3aXRoIGFuXG4gICB1cHBlcmNhc2UgY2hhcmFjdGVyIGFuZCB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMgYXJlIGxvd2VyY2FzZS5cblxuICAgVGhlIGFsZ29yaXRobSB1c2VzIGEgc2ltcGxlIGxhbmd1YWdlLWluZGVwZW5kZW50IGRlZmluaXRpb24gb2YgYVxuICAgd29yZCBhcyBncm91cHMgb2YgY29uc2VjdXRpdmUgbGV0dGVycy4gIFRoZSBkZWZpbml0aW9uIHdvcmtzIGluXG4gICBtYW55IGNvbnRleHRzIGJ1dCBpdCBtZWFucyB0aGF0IGFwb3N0cm9waGVzIGluIGNvbnRyYWN0aW9ucyBhbmRcbiAgIHBvc3Nlc3NpdmVzIGZvcm0gd29yZCBib3VuZGFyaWVzLCB3aGljaCBtYXkgbm90IGJlIHRoZSBkZXNpcmVkXG4gICByZXN1bHQ6XG5cbiAgICAgID4+PiAidGhleVwncmUgYmlsbFwncyBmcmllbmRzIGZyb20gdGhlIFVLIi50aXRsZSgpXG4gICAgICAiVGhleVwnUmUgQmlsbFwnUyBGcmllbmRzIEZyb20gVGhlIFVrIlxuXG4gICBBIHdvcmthcm91bmQgZm9yIGFwb3N0cm9waGVzIGNhbiBiZSBjb25zdHJ1Y3RlZCB1c2luZyByZWd1bGFyXG4gICBleHByZXNzaW9uczpcblxuICAgICAgPj4+IGltcG9ydCByZVxuICAgICAgPj4+IGRlZiB0aXRsZWNhc2Uocyk6XG4gICAgICAuLi4gICAgIHJldHVybiByZS5zdWIociJbQS1aYS16XSsoXCdbQS1aYS16XSspPyIsXG4gICAgICAuLi4gICAgICAgICAgICAgICAgICAgbGFtYmRhIG1vOiBtby5ncm91cCgwKVswXS51cHBlcigpICtcbiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vLmdyb3VwKDApWzE6XS5sb3dlcigpLFxuICAgICAgLi4uICAgICAgICAgICAgICAgICAgIHMpXG4gICAgICAuLi5cbiAgICAgID4+PiB0aXRsZWNhc2UoInRoZXlcJ3JlIGJpbGxcJ3MgZnJpZW5kcy4iKVxuICAgICAgIlRoZXlcJ3JlIEJpbGxcJ3MgRnJpZW5kcy4iXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIudHJhbnNsYXRlKHRhYmxlWywgZGVsZXRlY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgYWxsIGNoYXJhY3RlcnMgb2NjdXJyaW5nIGluIHRoZVxuICAgb3B0aW9uYWwgYXJndW1lbnQgKmRlbGV0ZWNoYXJzKiBhcmUgcmVtb3ZlZCwgYW5kIHRoZSByZW1haW5pbmdcbiAgIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlbiB0cmFuc2xhdGlvbiB0YWJsZSxcbiAgIHdoaWNoIG11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDI1Ni5cblxuICAgWW91IGNhbiB1c2UgdGhlIGBgbWFrZXRyYW5zKClgYCBoZWxwZXIgZnVuY3Rpb24gaW4gdGhlIGBgc3RyaW5nYGBcbiAgIG1vZHVsZSB0byBjcmVhdGUgYSB0cmFuc2xhdGlvbiB0YWJsZS4gRm9yIHN0cmluZyBvYmplY3RzLCBzZXQgdGhlXG4gICAqdGFibGUqIGFyZ3VtZW50IHRvIGBgTm9uZWBgIGZvciB0cmFuc2xhdGlvbnMgdGhhdCBvbmx5IGRlbGV0ZVxuICAgY2hhcmFjdGVyczpcblxuICAgPj4+IFwncmVhZCB0aGlzIHNob3J0IHRleHRcJy50cmFuc2xhdGUoTm9uZSwgXCdhZWlvdVwnKVxuICAgXCdyZCB0aHMgc2hydCB0eHRcJ1xuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjY6IFN1cHBvcnQgZm9yIGEgYGBOb25lYGAgKnRhYmxlKiBhcmd1bWVudC5cblxuICAgRm9yIFVuaWNvZGUgb2JqZWN0cywgdGhlIGBgdHJhbnNsYXRlKClgYCBtZXRob2QgZG9lcyBub3QgYWNjZXB0IHRoZVxuICAgb3B0aW9uYWwgKmRlbGV0ZWNoYXJzKiBhcmd1bWVudC4gIEluc3RlYWQsIGl0IHJldHVybnMgYSBjb3B5IG9mIHRoZVxuICAgKnMqIHdoZXJlIGFsbCBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBtYXBwZWQgdGhyb3VnaCB0aGUgZ2l2ZW5cbiAgIHRyYW5zbGF0aW9uIHRhYmxlIHdoaWNoIG11c3QgYmUgYSBtYXBwaW5nIG9mIFVuaWNvZGUgb3JkaW5hbHMgdG9cbiAgIFVuaWNvZGUgb3JkaW5hbHMsIFVuaWNvZGUgc3RyaW5ncyBvciBgYE5vbmVgYC4gVW5tYXBwZWQgY2hhcmFjdGVyc1xuICAgYXJlIGxlZnQgdW50b3VjaGVkLiBDaGFyYWN0ZXJzIG1hcHBlZCB0byBgYE5vbmVgYCBhcmUgZGVsZXRlZC5cbiAgIE5vdGUsIGEgbW9yZSBmbGV4aWJsZSBhcHByb2FjaCBpcyB0byBjcmVhdGUgYSBjdXN0b20gY2hhcmFjdGVyXG4gICBtYXBwaW5nIGNvZGVjIHVzaW5nIHRoZSBgYGNvZGVjc2BgIG1vZHVsZSAoc2VlIGBgZW5jb2RpbmdzLmNwMTI1MWBgXG4gICBmb3IgYW4gZXhhbXBsZSkuXG5cbnN0ci51cHBlcigpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIGFsbCB0aGUgY2FzZWQgY2hhcmFjdGVycyBbNF1cbiAgIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuICBOb3RlIHRoYXQgYGBzdHIudXBwZXIoKS5pc3VwcGVyKClgYCBtaWdodFxuICAgYmUgYGBGYWxzZWBgIGlmIGBgc2BgIGNvbnRhaW5zIHVuY2FzZWQgY2hhcmFjdGVycyBvciBpZiB0aGUgVW5pY29kZVxuICAgY2F0ZWdvcnkgb2YgdGhlIHJlc3VsdGluZyBjaGFyYWN0ZXIocykgaXMgbm90ICJMdSIgKExldHRlcixcbiAgIHVwcGVyY2FzZSksIGJ1dCBlLmcuICJMdCIgKExldHRlciwgdGl0bGVjYXNlKS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci56ZmlsbCh3aWR0aClcblxuICAgUmV0dXJuIHRoZSBudW1lcmljIHN0cmluZyBsZWZ0IGZpbGxlZCB3aXRoIHplcm9zIGluIGEgc3RyaW5nIG9mXG4gICBsZW5ndGggKndpZHRoKi4gIEEgc2lnbiBwcmVmaXggaXMgaGFuZGxlZCBjb3JyZWN0bHkuICBUaGUgb3JpZ2luYWxcbiAgIHN0cmluZyBpcyByZXR1cm5lZCBpZiAqd2lkdGgqIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBgYGxlbihzKWBgLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjIuMi5cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBwcmVzZW50IG9ubHkgb24gdW5pY29kZSBvYmplY3RzOlxuXG51bmljb2RlLmlzbnVtZXJpYygpXG5cbiAgIFJldHVybiBgYFRydWVgYCBpZiB0aGVyZSBhcmUgb25seSBudW1lcmljIGNoYXJhY3RlcnMgaW4gUyxcbiAgIGBgRmFsc2VgYCBvdGhlcndpc2UuIE51bWVyaWMgY2hhcmFjdGVycyBpbmNsdWRlIGRpZ2l0IGNoYXJhY3RlcnMsXG4gICBhbmQgYWxsIGNoYXJhY3RlcnMgdGhhdCBoYXZlIHRoZSBVbmljb2RlIG51bWVyaWMgdmFsdWUgcHJvcGVydHksXG4gICBlLmcuIFUrMjE1NSwgVlVMR0FSIEZSQUNUSU9OIE9ORSBGSUZUSC5cblxudW5pY29kZS5pc2RlY2ltYWwoKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlcmUgYXJlIG9ubHkgZGVjaW1hbCBjaGFyYWN0ZXJzIGluIFMsXG4gICBgYEZhbHNlYGAgb3RoZXJ3aXNlLiBEZWNpbWFsIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLFxuICAgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gZm9ybSBkZWNpbWFsLXJhZGl4IG51bWJlcnMsXG4gICBlLmcuIFUrMDY2MCwgQVJBQklDLUlORElDIERJR0lUIFpFUk8uXG5cblxuU3RyaW5nIEZvcm1hdHRpbmcgT3BlcmF0aW9uc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5TdHJpbmcgYW5kIFVuaWNvZGUgb2JqZWN0cyBoYXZlIG9uZSB1bmlxdWUgYnVpbHQtaW4gb3BlcmF0aW9uOiB0aGVcbmBgJWBgIG9wZXJhdG9yIChtb2R1bG8pLiAgVGhpcyBpcyBhbHNvIGtub3duIGFzIHRoZSBzdHJpbmdcbipmb3JtYXR0aW5nKiBvciAqaW50ZXJwb2xhdGlvbiogb3BlcmF0b3IuICBHaXZlbiBgYGZvcm1hdCAlIHZhbHVlc2BgXG4od2hlcmUgKmZvcm1hdCogaXMgYSBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QpLCBgYCVgYCBjb252ZXJzaW9uXG5zcGVjaWZpY2F0aW9ucyBpbiAqZm9ybWF0KiBhcmUgcmVwbGFjZWQgd2l0aCB6ZXJvIG9yIG1vcmUgZWxlbWVudHMgb2Zcbip2YWx1ZXMqLiAgVGhlIGVmZmVjdCBpcyBzaW1pbGFyIHRvIHRoZSB1c2luZyBgYHNwcmludGYoKWBgIGluIHRoZSBDXG5sYW5ndWFnZS4gIElmICpmb3JtYXQqIGlzIGEgVW5pY29kZSBvYmplY3QsIG9yIGlmIGFueSBvZiB0aGUgb2JqZWN0c1xuYmVpbmcgY29udmVydGVkIHVzaW5nIHRoZSBgYCVzYGAgY29udmVyc2lvbiBhcmUgVW5pY29kZSBvYmplY3RzLCB0aGVcbnJlc3VsdCB3aWxsIGFsc28gYmUgYSBVbmljb2RlIG9iamVjdC5cblxuSWYgKmZvcm1hdCogcmVxdWlyZXMgYSBzaW5nbGUgYXJndW1lbnQsICp2YWx1ZXMqIG1heSBiZSBhIHNpbmdsZSBub24tXG50dXBsZSBvYmplY3QuIFs1XSAgT3RoZXJ3aXNlLCAqdmFsdWVzKiBtdXN0IGJlIGEgdHVwbGUgd2l0aCBleGFjdGx5XG50aGUgbnVtYmVyIG9mIGl0ZW1zIHNwZWNpZmllZCBieSB0aGUgZm9ybWF0IHN0cmluZywgb3IgYSBzaW5nbGVcbm1hcHBpbmcgb2JqZWN0IChmb3IgZXhhbXBsZSwgYSBkaWN0aW9uYXJ5KS5cblxuQSBjb252ZXJzaW9uIHNwZWNpZmllciBjb250YWlucyB0d28gb3IgbW9yZSBjaGFyYWN0ZXJzIGFuZCBoYXMgdGhlXG5mb2xsb3dpbmcgY29tcG9uZW50cywgd2hpY2ggbXVzdCBvY2N1ciBpbiB0aGlzIG9yZGVyOlxuXG4xLiBUaGUgYGBcJyVcJ2BgIGNoYXJhY3Rlciwgd2hpY2ggbWFya3MgdGhlIHN0YXJ0IG9mIHRoZSBzcGVjaWZpZXIuXG5cbjIuIE1hcHBpbmcga2V5IChvcHRpb25hbCksIGNvbnNpc3Rpbmcgb2YgYSBwYXJlbnRoZXNpc2VkIHNlcXVlbmNlIG9mXG4gICBjaGFyYWN0ZXJzIChmb3IgZXhhbXBsZSwgYGAoc29tZW5hbWUpYGApLlxuXG4zLiBDb252ZXJzaW9uIGZsYWdzIChvcHRpb25hbCksIHdoaWNoIGFmZmVjdCB0aGUgcmVzdWx0IG9mIHNvbWVcbiAgIGNvbnZlcnNpb24gdHlwZXMuXG5cbjQuIE1pbmltdW0gZmllbGQgd2lkdGggKG9wdGlvbmFsKS4gIElmIHNwZWNpZmllZCBhcyBhbiBgYFwnKlwnYGBcbiAgIChhc3RlcmlzayksIHRoZSBhY3R1YWwgd2lkdGggaXMgcmVhZCBmcm9tIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlXG4gICB0dXBsZSBpbiAqdmFsdWVzKiwgYW5kIHRoZSBvYmplY3QgdG8gY29udmVydCBjb21lcyBhZnRlciB0aGVcbiAgIG1pbmltdW0gZmllbGQgd2lkdGggYW5kIG9wdGlvbmFsIHByZWNpc2lvbi5cblxuNS4gUHJlY2lzaW9uIChvcHRpb25hbCksIGdpdmVuIGFzIGEgYGBcJy5cJ2BgIChkb3QpIGZvbGxvd2VkIGJ5IHRoZVxuICAgcHJlY2lzaW9uLiAgSWYgc3BlY2lmaWVkIGFzIGBgXCcqXCdgYCAoYW4gYXN0ZXJpc2spLCB0aGUgYWN0dWFsIHdpZHRoXG4gICBpcyByZWFkIGZyb20gdGhlIG5leHQgZWxlbWVudCBvZiB0aGUgdHVwbGUgaW4gKnZhbHVlcyosIGFuZCB0aGVcbiAgIHZhbHVlIHRvIGNvbnZlcnQgY29tZXMgYWZ0ZXIgdGhlIHByZWNpc2lvbi5cblxuNi4gTGVuZ3RoIG1vZGlmaWVyIChvcHRpb25hbCkuXG5cbjcuIENvbnZlcnNpb24gdHlwZS5cblxuV2hlbiB0aGUgcmlnaHQgYXJndW1lbnQgaXMgYSBkaWN0aW9uYXJ5IChvciBvdGhlciBtYXBwaW5nIHR5cGUpLCB0aGVuXG50aGUgZm9ybWF0cyBpbiB0aGUgc3RyaW5nICptdXN0KiBpbmNsdWRlIGEgcGFyZW50aGVzaXNlZCBtYXBwaW5nIGtleVxuaW50byB0aGF0IGRpY3Rpb25hcnkgaW5zZXJ0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGBgXCclXCdgYCBjaGFyYWN0ZXIuXG5UaGUgbWFwcGluZyBrZXkgc2VsZWN0cyB0aGUgdmFsdWUgdG8gYmUgZm9ybWF0dGVkIGZyb20gdGhlIG1hcHBpbmcuXG5Gb3IgZXhhbXBsZTpcblxuPj4+IHByaW50IFwnJShsYW5ndWFnZSlzIGhhcyAlKG51bWJlcikwM2QgcXVvdGUgdHlwZXMuXCcgJSBcXFxuLi4uICAgICAgIHsibGFuZ3VhZ2UiOiAiUHl0aG9uIiwgIm51bWJlciI6IDJ9XG5QeXRob24gaGFzIDAwMiBxdW90ZSB0eXBlcy5cblxuSW4gdGhpcyBjYXNlIG5vIGBgKmBgIHNwZWNpZmllcnMgbWF5IG9jY3VyIGluIGEgZm9ybWF0IChzaW5jZSB0aGV5XG5yZXF1aXJlIGEgc2VxdWVudGlhbCBwYXJhbWV0ZXIgbGlzdCkuXG5cblRoZSBjb252ZXJzaW9uIGZsYWcgY2hhcmFjdGVycyBhcmU6XG5cbistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgRmxhZyAgICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbnwgYGBcJyNcJ2BgICAgfCBUaGUgdmFsdWUgY29udmVyc2lvbiB3aWxsIHVzZSB0aGUgImFsdGVybmF0ZSBmb3JtIiAod2hlcmUgZGVmaW5lZCAgICAgfFxufCAgICAgICAgICAgfCBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYFwnMFwnYGAgICB8IFRoZSBjb252ZXJzaW9uIHdpbGwgYmUgemVybyBwYWRkZWQgZm9yIG51bWVyaWMgdmFsdWVzLiAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgXCctXCdgYCAgIHwgVGhlIGNvbnZlcnRlZCB2YWx1ZSBpcyBsZWZ0IGFkanVzdGVkIChvdmVycmlkZXMgdGhlIGBgXCcwXCdgYCAgICAgICAgICAgfFxufCAgICAgICAgICAgfCBjb252ZXJzaW9uIGlmIGJvdGggYXJlIGdpdmVuKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYFwnIFwnYGAgICB8IChhIHNwYWNlKSBBIGJsYW5rIHNob3VsZCBiZSBsZWZ0IGJlZm9yZSBhIHBvc2l0aXZlIG51bWJlciAob3IgZW1wdHkgICB8XG58ICAgICAgICAgICB8IHN0cmluZykgcHJvZHVjZWQgYnkgYSBzaWduZWQgY29udmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgXCcrXCdgYCAgIHwgQSBzaWduIGNoYXJhY3RlciAoYGBcJytcJ2BgIG9yIGBgXCctXCdgYCkgd2lsbCBwcmVjZWRlIHRoZSBjb252ZXJzaW9uICAgICB8XG58ICAgICAgICAgICB8IChvdmVycmlkZXMgYSAic3BhY2UiIGZsYWcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbkEgbGVuZ3RoIG1vZGlmaWVyIChgYGhgYCwgYGBsYGAsIG9yIGBgTGBgKSBtYXkgYmUgcHJlc2VudCwgYnV0IGlzXG5pZ25vcmVkIGFzIGl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIFB5dGhvbiAtLSBzbyBlLmcuIGBgJWxkYGAgaXNcbmlkZW50aWNhbCB0byBgYCVkYGAuXG5cblRoZSBjb252ZXJzaW9uIHR5cGVzIGFyZTpcblxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBDb252ZXJzaW9uICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgfFxuKz09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09K1xufCBgYFwnZFwnYGAgICAgICB8IFNpZ25lZCBpbnRlZ2VyIGRlY2ltYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdpXCdgYCAgICAgIHwgU2lnbmVkIGludGVnZXIgZGVjaW1hbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ29cJ2BgICAgICAgfCBTaWduZWQgb2N0YWwgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgxKSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwndVwnYGAgICAgICB8IE9ic29sZXRlIHR5cGUgLS0gaXQgaXMgaWRlbnRpY2FsIHRvIGBgXCdkXCdgYC4gICAgICAgICAgfCAoNykgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ3hcJ2BgICAgICAgfCBTaWduZWQgaGV4YWRlY2ltYWwgKGxvd2VyY2FzZSkuICAgICAgICAgICAgICAgICAgICAgICB8ICgyKSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnWFwnYGAgICAgICB8IFNpZ25lZCBoZXhhZGVjaW1hbCAodXBwZXJjYXNlKS4gICAgICAgICAgICAgICAgICAgICAgIHwgKDIpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdlXCdgYCAgICAgIHwgRmxvYXRpbmcgcG9pbnQgZXhwb25lbnRpYWwgZm9ybWF0IChsb3dlcmNhc2UpLiAgICAgICAgfCAoMykgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ0VcJ2BgICAgICAgfCBGbG9hdGluZyBwb2ludCBleHBvbmVudGlhbCBmb3JtYXQgKHVwcGVyY2FzZSkuICAgICAgICB8ICgzKSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnZlwnYGAgICAgICB8IEZsb2F0aW5nIHBvaW50IGRlY2ltYWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgIHwgKDMpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdGXCdgYCAgICAgIHwgRmxvYXRpbmcgcG9pbnQgZGVjaW1hbCBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgfCAoMykgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ2dcJ2BgICAgICAgfCBGbG9hdGluZyBwb2ludCBmb3JtYXQuIFVzZXMgbG93ZXJjYXNlIGV4cG9uZW50aWFsICAgICB8ICg0KSAgICAgfFxufCAgICAgICAgICAgICAgfCBmb3JtYXQgaWYgZXhwb25lbnQgaXMgbGVzcyB0aGFuIC00IG9yIG5vdCBsZXNzIHRoYW4gICB8ICAgICAgICAgfFxufCAgICAgICAgICAgICAgfCBwcmVjaXNpb24sIGRlY2ltYWwgZm9ybWF0IG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnR1wnYGAgICAgICB8IEZsb2F0aW5nIHBvaW50IGZvcm1hdC4gVXNlcyB1cHBlcmNhc2UgZXhwb25lbnRpYWwgICAgIHwgKDQpICAgICB8XG58ICAgICAgICAgICAgICB8IGZvcm1hdCBpZiBleHBvbmVudCBpcyBsZXNzIHRoYW4gLTQgb3Igbm90IGxlc3MgdGhhbiAgIHwgICAgICAgICB8XG58ICAgICAgICAgICAgICB8IHByZWNpc2lvbiwgZGVjaW1hbCBmb3JtYXQgb3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdjXCdgYCAgICAgIHwgU2luZ2xlIGNoYXJhY3RlciAoYWNjZXB0cyBpbnRlZ2VyIG9yIHNpbmdsZSBjaGFyYWN0ZXIgfCAgICAgICAgIHxcbnwgICAgICAgICAgICAgIHwgc3RyaW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ3JcJ2BgICAgICAgfCBTdHJpbmcgKGNvbnZlcnRzIGFueSBQeXRob24gb2JqZWN0IHVzaW5nICpyZXByKCkqKS4gICB8ICg1KSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnc1wnYGAgICAgICB8IFN0cmluZyAoY29udmVydHMgYW55IFB5dGhvbiBvYmplY3QgdXNpbmcgYGBzdHIoKWBgKS4gIHwgKDYpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCclXCdgYCAgICAgIHwgTm8gYXJndW1lbnQgaXMgY29udmVydGVkLCByZXN1bHRzIGluIGEgYGBcJyVcJ2BgICAgICAgICB8ICAgICAgICAgfFxufCAgICAgICAgICAgICAgfCBjaGFyYWN0ZXIgaW4gdGhlIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuXG5Ob3RlczpcblxuMS4gVGhlIGFsdGVybmF0ZSBmb3JtIGNhdXNlcyBhIGxlYWRpbmcgemVybyAoYGBcJzBcJ2BgKSB0byBiZSBpbnNlcnRlZFxuICAgYmV0d2VlbiBsZWZ0LWhhbmQgcGFkZGluZyBhbmQgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIG51bWJlciBpZiB0aGVcbiAgIGxlYWRpbmcgY2hhcmFjdGVyIG9mIHRoZSByZXN1bHQgaXMgbm90IGFscmVhZHkgYSB6ZXJvLlxuXG4yLiBUaGUgYWx0ZXJuYXRlIGZvcm0gY2F1c2VzIGEgbGVhZGluZyBgYFwnMHhcJ2BgIG9yIGBgXCcwWFwnYGAgKGRlcGVuZGluZ1xuICAgb24gd2hldGhlciB0aGUgYGBcJ3hcJ2BgIG9yIGBgXCdYXCdgYCBmb3JtYXQgd2FzIHVzZWQpIHRvIGJlIGluc2VydGVkXG4gICBiZXR3ZWVuIGxlZnQtaGFuZCBwYWRkaW5nIGFuZCB0aGUgZm9ybWF0dGluZyBvZiB0aGUgbnVtYmVyIGlmIHRoZVxuICAgbGVhZGluZyBjaGFyYWN0ZXIgb2YgdGhlIHJlc3VsdCBpcyBub3QgYWxyZWFkeSBhIHplcm8uXG5cbjMuIFRoZSBhbHRlcm5hdGUgZm9ybSBjYXVzZXMgdGhlIHJlc3VsdCB0byBhbHdheXMgY29udGFpbiBhIGRlY2ltYWxcbiAgIHBvaW50LCBldmVuIGlmIG5vIGRpZ2l0cyBmb2xsb3cgaXQuXG5cbiAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbFxuICAgcG9pbnQgYW5kIGRlZmF1bHRzIHRvIDYuXG5cbjQuIFRoZSBhbHRlcm5hdGUgZm9ybSBjYXVzZXMgdGhlIHJlc3VsdCB0byBhbHdheXMgY29udGFpbiBhIGRlY2ltYWxcbiAgIHBvaW50LCBhbmQgdHJhaWxpbmcgemVyb2VzIGFyZSBub3QgcmVtb3ZlZCBhcyB0aGV5IHdvdWxkIG90aGVyd2lzZVxuICAgYmUuXG5cbiAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cyBiZWZvcmVcbiAgIGFuZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBhbmQgZGVmYXVsdHMgdG8gNi5cblxuNS4gVGhlIGBgJXJgYCBjb252ZXJzaW9uIHdhcyBhZGRlZCBpbiBQeXRob24gMi4wLlxuXG4gICBUaGUgcHJlY2lzaW9uIGRldGVybWluZXMgdGhlIG1heGltYWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXNlZC5cblxuNi4gSWYgdGhlIG9iamVjdCBvciBmb3JtYXQgcHJvdmlkZWQgaXMgYSBgYHVuaWNvZGVgYCBzdHJpbmcsIHRoZVxuICAgcmVzdWx0aW5nIHN0cmluZyB3aWxsIGFsc28gYmUgYGB1bmljb2RlYGAuXG5cbiAgIFRoZSBwcmVjaXNpb24gZGV0ZXJtaW5lcyB0aGUgbWF4aW1hbCBudW1iZXIgb2YgY2hhcmFjdGVycyB1c2VkLlxuXG43LiBTZWUgKipQRVAgMjM3KiouXG5cblNpbmNlIFB5dGhvbiBzdHJpbmdzIGhhdmUgYW4gZXhwbGljaXQgbGVuZ3RoLCBgYCVzYGAgY29udmVyc2lvbnMgZG9cbm5vdCBhc3N1bWUgdGhhdCBgYFwnXFwwXCdgYCBpcyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjc6IGBgJWZgYCBjb252ZXJzaW9ucyBmb3IgbnVtYmVycyB3aG9zZSBhYnNvbHV0ZVxudmFsdWUgaXMgb3ZlciAxZTUwIGFyZSBubyBsb25nZXIgcmVwbGFjZWQgYnkgYGAlZ2BgIGNvbnZlcnNpb25zLlxuXG5BZGRpdGlvbmFsIHN0cmluZyBvcGVyYXRpb25zIGFyZSBkZWZpbmVkIGluIHN0YW5kYXJkIG1vZHVsZXNcbmBgc3RyaW5nYGAgYW5kIGBgcmVgYC5cblxuXG5YUmFuZ2UgVHlwZVxuPT09PT09PT09PT1cblxuVGhlIGBgeHJhbmdlYGAgdHlwZSBpcyBhbiBpbW11dGFibGUgc2VxdWVuY2Ugd2hpY2ggaXMgY29tbW9ubHkgdXNlZFxuZm9yIGxvb3BpbmcuICBUaGUgYWR2YW50YWdlIG9mIHRoZSBgYHhyYW5nZWBgIHR5cGUgaXMgdGhhdCBhblxuYGB4cmFuZ2VgYCBvYmplY3Qgd2lsbCBhbHdheXMgdGFrZSB0aGUgc2FtZSBhbW91bnQgb2YgbWVtb3J5LCBub1xubWF0dGVyIHRoZSBzaXplIG9mIHRoZSByYW5nZSBpdCByZXByZXNlbnRzLiAgVGhlcmUgYXJlIG5vIGNvbnNpc3RlbnRcbnBlcmZvcm1hbmNlIGFkdmFudGFnZXMuXG5cblhSYW5nZSBvYmplY3RzIGhhdmUgdmVyeSBsaXR0bGUgYmVoYXZpb3I6IHRoZXkgb25seSBzdXBwb3J0IGluZGV4aW5nLFxuaXRlcmF0aW9uLCBhbmQgdGhlIGBgbGVuKClgYCBmdW5jdGlvbi5cblxuXG5NdXRhYmxlIFNlcXVlbmNlIFR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09XG5cbkxpc3QgYW5kIGBgYnl0ZWFycmF5YGAgb2JqZWN0cyBzdXBwb3J0IGFkZGl0aW9uYWwgb3BlcmF0aW9ucyB0aGF0XG5hbGxvdyBpbi1wbGFjZSBtb2RpZmljYXRpb24gb2YgdGhlIG9iamVjdC4gT3RoZXIgbXV0YWJsZSBzZXF1ZW5jZVxudHlwZXMgKHdoZW4gYWRkZWQgdG8gdGhlIGxhbmd1YWdlKSBzaG91bGQgYWxzbyBzdXBwb3J0IHRoZXNlXG5vcGVyYXRpb25zLiBTdHJpbmdzIGFuZCB0dXBsZXMgYXJlIGltbXV0YWJsZSBzZXF1ZW5jZSB0eXBlczogc3VjaFxub2JqZWN0cyBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSBjcmVhdGVkLiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlXG5kZWZpbmVkIG9uIG11dGFibGUgc2VxdWVuY2UgdHlwZXMgKHdoZXJlICp4KiBpcyBhbiBhcmJpdHJhcnkgb2JqZWN0KTpcblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IE9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICB8IFJlc3VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTm90ZXMgICAgICAgICAgICAgICAgIHxcbis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09K1xufCBgYHNbaV0gPSB4YGAgICAgICAgICAgICAgICAgICAgfCBpdGVtICppKiBvZiAqcyogaXMgcmVwbGFjZWQgYnkgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICp4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHNbaTpqXSA9IHRgYCAgICAgICAgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIGlzICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRoZSBjb250ZW50cyBvZiB0aGUgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXRlcmFibGUgKnQqICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgZGVsIHNbaTpqXWBgICAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2k6al0gPSBbXWBgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHNbaTpqOmtdID0gdGBgICAgICAgICAgICAgICAgfCB0aGUgZWxlbWVudHMgb2YgYGBzW2k6ajprXWBgIGFyZSB8ICgxKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcGxhY2VkIGJ5IHRob3NlIG9mICp0KiAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYGRlbCBzW2k6ajprXWBgICAgICAgICAgICAgICAgfCByZW1vdmVzIHRoZSBlbGVtZW50cyBvZiAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1tpOmo6a11gYCBmcm9tIHRoZSBsaXN0ICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuYXBwZW5kKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tsZW4ocyk6bGVuKHMpXSA9ICAgICB8ICgyKSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFt4XWBgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuZXh0ZW5kKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tsZW4ocyk6bGVuKHMpXSA9IHhgYCB8ICgzKSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLmNvdW50KHgpYGAgICAgICAgICAgICAgICAgIHwgcmV0dXJuIG51bWJlciBvZiAqaSpcJ3MgZm9yIHdoaWNoIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBzW2ldID09IHhgYCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5pbmRleCh4WywgaVssIGpdXSlgYCAgICAgICB8IHJldHVybiBzbWFsbGVzdCAqayogc3VjaCB0aGF0ICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBzW2tdID09IHhgYCBhbmQgYGBpIDw9IGsgPCBqYGAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5pbnNlcnQoaSwgeClgYCAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2k6aV0gPSBbeF1gYCAgICAgICAgIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMucG9wKFtpXSlgYCAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgeCA9IHNbaV07IGRlbCBzW2ldOyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldHVybiB4YGAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMucmVtb3ZlKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgZGVsIHNbcy5pbmRleCh4KV1gYCAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnJldmVyc2UoKWBgICAgICAgICAgICAgICAgIHwgcmV2ZXJzZXMgdGhlIGl0ZW1zIG9mICpzKiBpbiAgICAgfCAoNykgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnNvcnQoW2NtcFssIGtleVssICAgICAgICAgIHwgc29ydCB0aGUgaXRlbXMgb2YgKnMqIGluIHBsYWNlICAgfCAoNykoOCkoOSkoMTApICAgICAgICAgfFxufCByZXZlcnNlXV1dKWBgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuTm90ZXM6XG5cbjEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyAgcmVwbGFjaW5nLlxuXG4yLiBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gaGFzIGhpc3RvcmljYWxseSBhY2NlcHRlZCBtdWx0aXBsZVxuICAgcGFyYW1ldGVycyBhbmQgaW1wbGljaXRseSBqb2luZWQgdGhlbSBpbnRvIGEgdHVwbGU7IHRoaXMgbm8gbG9uZ2VyXG4gICB3b3JrcyBpbiBQeXRob24gMi4wLiAgVXNlIG9mIHRoaXMgbWlzZmVhdHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkXG4gICBzaW5jZSBQeXRob24gMS40LlxuXG4zLiAqeCogY2FuIGJlIGFueSBpdGVyYWJsZSBvYmplY3QuXG5cbjQuIFJhaXNlcyBgYFZhbHVlRXJyb3JgYCB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLiBXaGVuIGEgbmVnYXRpdmVcbiAgIGluZGV4IGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIG9yIHRoaXJkIHBhcmFtZXRlciB0byB0aGUgYGBpbmRleCgpYGBcbiAgIG1ldGhvZCwgdGhlIGxpc3QgbGVuZ3RoIGlzIGFkZGVkLCBhcyBmb3Igc2xpY2UgaW5kaWNlcy4gIElmIGl0IGlzXG4gICBzdGlsbCBuZWdhdGl2ZSwgaXQgaXMgdHJ1bmNhdGVkIHRvIHplcm8sIGFzIGZvciBzbGljZSBpbmRpY2VzLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBgYGluZGV4KClgYCBkaWRuXCd0IGhhdmVcbiAgIGFyZ3VtZW50cyBmb3Igc3BlY2lmeWluZyBzdGFydCBhbmQgc3RvcCBwb3NpdGlvbnMuXG5cbjUuIFdoZW4gYSBuZWdhdGl2ZSBpbmRleCBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byB0aGVcbiAgIGBgaW5zZXJ0KClgYCBtZXRob2QsIHRoZSBsaXN0IGxlbmd0aCBpcyBhZGRlZCwgYXMgZm9yIHNsaWNlXG4gICBpbmRpY2VzLiAgSWYgaXQgaXMgc3RpbGwgbmVnYXRpdmUsIGl0IGlzIHRydW5jYXRlZCB0byB6ZXJvLCBhcyBmb3JcbiAgIHNsaWNlIGluZGljZXMuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksIGFsbCBuZWdhdGl2ZSBpbmRpY2VzIHdlcmVcbiAgIHRydW5jYXRlZCB0byB6ZXJvLlxuXG42LiBUaGUgYGBwb3AoKWBgIG1ldGhvZCBpcyBvbmx5IHN1cHBvcnRlZCBieSB0aGUgbGlzdCBhbmQgYXJyYXkgdHlwZXMuXG4gICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvIGBgLTFgYCwgc28gdGhhdCBieSBkZWZhdWx0XG4gICB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLlxuXG43LiBUaGUgYGBzb3J0KClgYCBhbmQgYGByZXZlcnNlKClgYCBtZXRob2RzIG1vZGlmeSB0aGUgbGlzdCBpbiBwbGFjZVxuICAgZm9yIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiBzb3J0aW5nIG9yIHJldmVyc2luZyBhIGxhcmdlIGxpc3QuICBUb1xuICAgcmVtaW5kIHlvdSB0aGF0IHRoZXkgb3BlcmF0ZSBieSBzaWRlIGVmZmVjdCwgdGhleSBkb25cJ3QgcmV0dXJuIHRoZVxuICAgc29ydGVkIG9yIHJldmVyc2VkIGxpc3QuXG5cbjguIFRoZSBgYHNvcnQoKWBgIG1ldGhvZCB0YWtlcyBvcHRpb25hbCBhcmd1bWVudHMgZm9yIGNvbnRyb2xsaW5nIHRoZVxuICAgY29tcGFyaXNvbnMuXG5cbiAgICpjbXAqIHNwZWNpZmllcyBhIGN1c3RvbSBjb21wYXJpc29uIGZ1bmN0aW9uIG9mIHR3byBhcmd1bWVudHMgKGxpc3RcbiAgIGl0ZW1zKSB3aGljaCBzaG91bGQgcmV0dXJuIGEgbmVnYXRpdmUsIHplcm8gb3IgcG9zaXRpdmUgbnVtYmVyXG4gICBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgZmlyc3QgYXJndW1lbnQgaXMgY29uc2lkZXJlZCBzbWFsbGVyIHRoYW4sXG4gICBlcXVhbCB0bywgb3IgbGFyZ2VyIHRoYW4gdGhlIHNlY29uZCBhcmd1bWVudDogYGBjbXA9bGFtYmRhIHgseTpcbiAgIGNtcCh4Lmxvd2VyKCksIHkubG93ZXIoKSlgYC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBgTm9uZWBgLlxuXG4gICAqa2V5KiBzcGVjaWZpZXMgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgdGhhdCBpcyB1c2VkIHRvIGV4dHJhY3RcbiAgIGEgY29tcGFyaXNvbiBrZXkgZnJvbSBlYWNoIGxpc3QgZWxlbWVudDogYGBrZXk9c3RyLmxvd2VyYGAuICBUaGVcbiAgIGRlZmF1bHQgdmFsdWUgaXMgYGBOb25lYGAuXG5cbiAgICpyZXZlcnNlKiBpcyBhIGJvb2xlYW4gdmFsdWUuICBJZiBzZXQgdG8gYGBUcnVlYGAsIHRoZW4gdGhlIGxpc3RcbiAgIGVsZW1lbnRzIGFyZSBzb3J0ZWQgYXMgaWYgZWFjaCBjb21wYXJpc29uIHdlcmUgcmV2ZXJzZWQuXG5cbiAgIEluIGdlbmVyYWwsIHRoZSAqa2V5KiBhbmQgKnJldmVyc2UqIGNvbnZlcnNpb24gcHJvY2Vzc2VzIGFyZSBtdWNoXG4gICBmYXN0ZXIgdGhhbiBzcGVjaWZ5aW5nIGFuIGVxdWl2YWxlbnQgKmNtcCogZnVuY3Rpb24uICBUaGlzIGlzXG4gICBiZWNhdXNlICpjbXAqIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBmb3IgZWFjaCBsaXN0IGVsZW1lbnQgd2hpbGVcbiAgICprZXkqIGFuZCAqcmV2ZXJzZSogdG91Y2ggZWFjaCBlbGVtZW50IG9ubHkgb25jZS4gIFVzZVxuICAgYGBmdW5jdG9vbHMuY21wX3RvX2tleSgpYGAgdG8gY29udmVydCBhbiBvbGQtc3R5bGUgKmNtcCogZnVuY3Rpb25cbiAgIHRvIGEgKmtleSogZnVuY3Rpb24uXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFN1cHBvcnQgZm9yIGBgTm9uZWBgIGFzIGFuIGVxdWl2YWxlbnQgdG9cbiAgIG9taXR0aW5nICpjbXAqIHdhcyBhZGRlZC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogU3VwcG9ydCBmb3IgKmtleSogYW5kICpyZXZlcnNlKiB3YXMgYWRkZWQuXG5cbjkuIFN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuMywgdGhlIGBgc29ydCgpYGAgbWV0aG9kIGlzIGd1YXJhbnRlZWQgdG8gYmVcbiAgIHN0YWJsZS4gIEEgc29ydCBpcyBzdGFibGUgaWYgaXQgZ3VhcmFudGVlcyBub3QgdG8gY2hhbmdlIHRoZVxuICAgcmVsYXRpdmUgb3JkZXIgb2YgZWxlbWVudHMgdGhhdCBjb21wYXJlIGVxdWFsIC0tLSB0aGlzIGlzIGhlbHBmdWxcbiAgIGZvciBzb3J0aW5nIGluIG11bHRpcGxlIHBhc3NlcyAoZm9yIGV4YW1wbGUsIHNvcnQgYnkgZGVwYXJ0bWVudCxcbiAgIHRoZW4gYnkgc2FsYXJ5IGdyYWRlKS5cblxuMTAuICoqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogV2hpbGUgYSBsaXN0IGlzIGJlaW5nIHNvcnRlZCxcbiAgICB0aGUgZWZmZWN0IG9mIGF0dGVtcHRpbmcgdG8gbXV0YXRlLCBvciBldmVuIGluc3BlY3QsIHRoZSBsaXN0IGlzXG4gICAgdW5kZWZpbmVkLiAgVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIDIuMyBhbmQgbmV3ZXIgbWFrZXMgdGhlXG4gICAgbGlzdCBhcHBlYXIgZW1wdHkgZm9yIHRoZSBkdXJhdGlvbiwgYW5kIHJhaXNlcyBgYFZhbHVlRXJyb3JgYCBpZlxuICAgIGl0IGNhbiBkZXRlY3QgdGhhdCB0aGUgbGlzdCBoYXMgYmVlbiBtdXRhdGVkIGR1cmluZyBhIHNvcnQuXG4nLAorICd0eXBlc3NlcS1tdXRhYmxlJzogIlxuTXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuKioqKioqKioqKioqKioqKioqKioqKlxuXG5MaXN0IGFuZCBgYGJ5dGVhcnJheWBgIG9iamVjdHMgc3VwcG9ydCBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgdGhhdFxuYWxsb3cgaW4tcGxhY2UgbW9kaWZpY2F0aW9uIG9mIHRoZSBvYmplY3QuIE90aGVyIG11dGFibGUgc2VxdWVuY2VcbnR5cGVzICh3aGVuIGFkZGVkIHRvIHRoZSBsYW5ndWFnZSkgc2hvdWxkIGFsc28gc3VwcG9ydCB0aGVzZVxub3BlcmF0aW9ucy4gU3RyaW5ncyBhbmQgdHVwbGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2UgdHlwZXM6IHN1Y2hcbm9iamVjdHMgY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgY3JlYXRlZC4gVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZVxuZGVmaW5lZCBvbiBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzICh3aGVyZSAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCk6XG5cbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PStcbnwgYGBzW2ldID0geGBgICAgICAgICAgICAgICAgICAgIHwgaXRlbSAqaSogb2YgKnMqIGlzIHJlcGxhY2VkIGJ5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzW2k6al0gPSB0YGAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiBpcyAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgdGhlICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0ZXJhYmxlICp0KiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYGRlbCBzW2k6al1gYCAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tpOmpdID0gW11gYCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzW2k6ajprXSA9IHRgYCAgICAgICAgICAgICAgIHwgdGhlIGVsZW1lbnRzIG9mIGBgc1tpOmo6a11gYCBhcmUgfCAoMSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aG9zZSBvZiAqdCogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBkZWwgc1tpOmo6a11gYCAgICAgICAgICAgICAgIHwgcmVtb3ZlcyB0aGUgZWxlbWVudHMgb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgYHNbaTpqOmtdYGAgZnJvbSB0aGUgbGlzdCAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLmFwcGVuZCh4KWBgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHNbbGVuKHMpOmxlbihzKV0gPSAgICAgfCAoMikgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbeF1gYCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLmV4dGVuZCh4KWBgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHNbbGVuKHMpOmxlbihzKV0gPSB4YGAgfCAoMykgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5jb3VudCh4KWBgICAgICAgICAgICAgICAgICB8IHJldHVybiBudW1iZXIgb2YgKmkqJ3MgZm9yIHdoaWNoIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBzW2ldID09IHhgYCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5pbmRleCh4WywgaVssIGpdXSlgYCAgICAgICB8IHJldHVybiBzbWFsbGVzdCAqayogc3VjaCB0aGF0ICAgIHwgKDQpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBzW2tdID09IHhgYCBhbmQgYGBpIDw9IGsgPCBqYGAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5pbnNlcnQoaSwgeClgYCAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2k6aV0gPSBbeF1gYCAgICAgICAgIHwgKDUpICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMucG9wKFtpXSlgYCAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgeCA9IHNbaV07IGRlbCBzW2ldOyAgICB8ICg2KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJldHVybiB4YGAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMucmVtb3ZlKHgpYGAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgZGVsIHNbcy5pbmRleCh4KV1gYCAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnJldmVyc2UoKWBgICAgICAgICAgICAgICAgIHwgcmV2ZXJzZXMgdGhlIGl0ZW1zIG9mICpzKiBpbiAgICAgfCAoNykgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwbGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnNvcnQoW2NtcFssIGtleVssICAgICAgICAgIHwgc29ydCB0aGUgaXRlbXMgb2YgKnMqIGluIHBsYWNlICAgfCAoNykoOCkoOSkoMTApICAgICAgICAgfFxufCByZXZlcnNlXV1dKWBgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuTm90ZXM6XG5cbjEuICp0KiBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBzbGljZSBpdCBpcyAgcmVwbGFjaW5nLlxuXG4yLiBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gaGFzIGhpc3RvcmljYWxseSBhY2NlcHRlZCBtdWx0aXBsZVxuICAgcGFyYW1ldGVycyBhbmQgaW1wbGljaXRseSBqb2luZWQgdGhlbSBpbnRvIGEgdHVwbGU7IHRoaXMgbm8gbG9uZ2VyXG4gICB3b3JrcyBpbiBQeXRob24gMi4wLiAgVXNlIG9mIHRoaXMgbWlzZmVhdHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkXG4gICBzaW5jZSBQeXRob24gMS40LlxuXG4zLiAqeCogY2FuIGJlIGFueSBpdGVyYWJsZSBvYmplY3QuXG5cbjQuIFJhaXNlcyBgYFZhbHVlRXJyb3JgYCB3aGVuICp4KiBpcyBub3QgZm91bmQgaW4gKnMqLiBXaGVuIGEgbmVnYXRpdmVcbiAgIGluZGV4IGlzIHBhc3NlZCBhcyB0aGUgc2Vjb25kIG9yIHRoaXJkIHBhcmFtZXRlciB0byB0aGUgYGBpbmRleCgpYGBcbiAgIG1ldGhvZCwgdGhlIGxpc3QgbGVuZ3RoIGlzIGFkZGVkLCBhcyBmb3Igc2xpY2UgaW5kaWNlcy4gIElmIGl0IGlzXG4gICBzdGlsbCBuZWdhdGl2ZSwgaXQgaXMgdHJ1bmNhdGVkIHRvIHplcm8sIGFzIGZvciBzbGljZSBpbmRpY2VzLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBgYGluZGV4KClgYCBkaWRuJ3QgaGF2ZVxuICAgYXJndW1lbnRzIGZvciBzcGVjaWZ5aW5nIHN0YXJ0IGFuZCBzdG9wIHBvc2l0aW9ucy5cblxuNS4gV2hlbiBhIG5lZ2F0aXZlIGluZGV4IGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvIHRoZVxuICAgYGBpbnNlcnQoKWBgIG1ldGhvZCwgdGhlIGxpc3QgbGVuZ3RoIGlzIGFkZGVkLCBhcyBmb3Igc2xpY2VcbiAgIGluZGljZXMuICBJZiBpdCBpcyBzdGlsbCBuZWdhdGl2ZSwgaXQgaXMgdHJ1bmNhdGVkIHRvIHplcm8sIGFzIGZvclxuICAgc2xpY2UgaW5kaWNlcy5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYWxsIG5lZ2F0aXZlIGluZGljZXMgd2VyZVxuICAgdHJ1bmNhdGVkIHRvIHplcm8uXG5cbjYuIFRoZSBgYHBvcCgpYGAgbWV0aG9kIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IHRoZSBsaXN0IGFuZCBhcnJheSB0eXBlcy5cbiAgIFRoZSBvcHRpb25hbCBhcmd1bWVudCAqaSogZGVmYXVsdHMgdG8gYGAtMWBgLCBzbyB0aGF0IGJ5IGRlZmF1bHRcbiAgIHRoZSBsYXN0IGl0ZW0gaXMgcmVtb3ZlZCBhbmQgcmV0dXJuZWQuXG5cbjcuIFRoZSBgYHNvcnQoKWBgIGFuZCBgYHJldmVyc2UoKWBgIG1ldGhvZHMgbW9kaWZ5IHRoZSBsaXN0IGluIHBsYWNlXG4gICBmb3IgZWNvbm9teSBvZiBzcGFjZSB3aGVuIHNvcnRpbmcgb3IgcmV2ZXJzaW5nIGEgbGFyZ2UgbGlzdC4gIFRvXG4gICByZW1pbmQgeW91IHRoYXQgdGhleSBvcGVyYXRlIGJ5IHNpZGUgZWZmZWN0LCB0aGV5IGRvbid0IHJldHVybiB0aGVcbiAgIHNvcnRlZCBvciByZXZlcnNlZCBsaXN0LlxuXG44LiBUaGUgYGBzb3J0KClgYCBtZXRob2QgdGFrZXMgb3B0aW9uYWwgYXJndW1lbnRzIGZvciBjb250cm9sbGluZyB0aGVcbiAgIGNvbXBhcmlzb25zLlxuXG4gICAqY21wKiBzcGVjaWZpZXMgYSBjdXN0b20gY29tcGFyaXNvbiBmdW5jdGlvbiBvZiB0d28gYXJndW1lbnRzIChsaXN0XG4gICBpdGVtcykgd2hpY2ggc2hvdWxkIHJldHVybiBhIG5lZ2F0aXZlLCB6ZXJvIG9yIHBvc2l0aXZlIG51bWJlclxuICAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGNvbnNpZGVyZWQgc21hbGxlciB0aGFuLFxuICAgZXF1YWwgdG8sIG9yIGxhcmdlciB0aGFuIHRoZSBzZWNvbmQgYXJndW1lbnQ6IGBgY21wPWxhbWJkYSB4LHk6XG4gICBjbXAoeC5sb3dlcigpLCB5Lmxvd2VyKCkpYGAuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYE5vbmVgYC5cblxuICAgKmtleSogc3BlY2lmaWVzIGEgZnVuY3Rpb24gb2Ygb25lIGFyZ3VtZW50IHRoYXQgaXMgdXNlZCB0byBleHRyYWN0XG4gICBhIGNvbXBhcmlzb24ga2V5IGZyb20gZWFjaCBsaXN0IGVsZW1lbnQ6IGBga2V5PXN0ci5sb3dlcmBgLiAgVGhlXG4gICBkZWZhdWx0IHZhbHVlIGlzIGBgTm9uZWBgLlxuXG4gICAqcmV2ZXJzZSogaXMgYSBib29sZWFuIHZhbHVlLiAgSWYgc2V0IHRvIGBgVHJ1ZWBgLCB0aGVuIHRoZSBsaXN0XG4gICBlbGVtZW50cyBhcmUgc29ydGVkIGFzIGlmIGVhY2ggY29tcGFyaXNvbiB3ZXJlIHJldmVyc2VkLlxuXG4gICBJbiBnZW5lcmFsLCB0aGUgKmtleSogYW5kICpyZXZlcnNlKiBjb252ZXJzaW9uIHByb2Nlc3NlcyBhcmUgbXVjaFxuICAgZmFzdGVyIHRoYW4gc3BlY2lmeWluZyBhbiBlcXVpdmFsZW50ICpjbXAqIGZ1bmN0aW9uLiAgVGhpcyBpc1xuICAgYmVjYXVzZSAqY21wKiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGVhY2ggbGlzdCBlbGVtZW50IHdoaWxlXG4gICAqa2V5KiBhbmQgKnJldmVyc2UqIHRvdWNoIGVhY2ggZWxlbWVudCBvbmx5IG9uY2UuICBVc2VcbiAgIGBgZnVuY3Rvb2xzLmNtcF90b19rZXkoKWBgIHRvIGNvbnZlcnQgYW4gb2xkLXN0eWxlICpjbXAqIGZ1bmN0aW9uXG4gICB0byBhICprZXkqIGZ1bmN0aW9uLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBgYE5vbmVgYCBhcyBhbiBlcXVpdmFsZW50IHRvXG4gICBvbWl0dGluZyAqY21wKiB3YXMgYWRkZWQuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yICprZXkqIGFuZCAqcmV2ZXJzZSogd2FzIGFkZGVkLlxuXG45LiBTdGFydGluZyB3aXRoIFB5dGhvbiAyLjMsIHRoZSBgYHNvcnQoKWBgIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlXG4gICBzdGFibGUuICBBIHNvcnQgaXMgc3RhYmxlIGlmIGl0IGd1YXJhbnRlZXMgbm90IHRvIGNoYW5nZSB0aGVcbiAgIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgY29tcGFyZSBlcXVhbCAtLS0gdGhpcyBpcyBoZWxwZnVsXG4gICBmb3Igc29ydGluZyBpbiBtdWx0aXBsZSBwYXNzZXMgKGZvciBleGFtcGxlLCBzb3J0IGJ5IGRlcGFydG1lbnQsXG4gICB0aGVuIGJ5IHNhbGFyeSBncmFkZSkuXG5cbjEwLiAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFdoaWxlIGEgbGlzdCBpcyBiZWluZyBzb3J0ZWQsXG4gICAgdGhlIGVmZmVjdCBvZiBhdHRlbXB0aW5nIHRvIG11dGF0ZSwgb3IgZXZlbiBpbnNwZWN0LCB0aGUgbGlzdCBpc1xuICAgIHVuZGVmaW5lZC4gIFRoZSBDIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiAyLjMgYW5kIG5ld2VyIG1ha2VzIHRoZVxuICAgIGxpc3QgYXBwZWFyIGVtcHR5IGZvciB0aGUgZHVyYXRpb24sIGFuZCByYWlzZXMgYGBWYWx1ZUVycm9yYGAgaWZcbiAgICBpdCBjYW4gZGV0ZWN0IHRoYXQgdGhlIGxpc3QgaGFzIGJlZW4gbXV0YXRlZCBkdXJpbmcgYSBzb3J0LlxuIiwKKyAndW5hcnknOiAnXG5VbmFyeSBhcml0aG1ldGljIGFuZCBiaXR3aXNlIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BbGwgdW5hcnkgYXJpdGhtZXRpYyBhbmQgYml0d2lzZSBvcGVyYXRpb25zIGhhdmUgdGhlIHNhbWUgcHJpb3JpdHk6XG5cbiAgIHVfZXhwciA6Oj0gcG93ZXIgfCAiLSIgdV9leHByIHwgIisiIHVfZXhwciB8ICJ+IiB1X2V4cHJcblxuVGhlIHVuYXJ5IGBgLWBgIChtaW51cykgb3BlcmF0b3IgeWllbGRzIHRoZSBuZWdhdGlvbiBvZiBpdHMgbnVtZXJpY1xuYXJndW1lbnQuXG5cblRoZSB1bmFyeSBgYCtgYCAocGx1cykgb3BlcmF0b3IgeWllbGRzIGl0cyBudW1lcmljIGFyZ3VtZW50IHVuY2hhbmdlZC5cblxuVGhlIHVuYXJ5IGBgfmBgIChpbnZlcnQpIG9wZXJhdG9yIHlpZWxkcyB0aGUgYml0d2lzZSBpbnZlcnNpb24gb2YgaXRzXG5wbGFpbiBvciBsb25nIGludGVnZXIgYXJndW1lbnQuICBUaGUgYml0d2lzZSBpbnZlcnNpb24gb2YgYGB4YGAgaXNcbmRlZmluZWQgYXMgYGAtKHgrMSlgYC4gIEl0IG9ubHkgYXBwbGllcyB0byBpbnRlZ3JhbCBudW1iZXJzLlxuXG5JbiBhbGwgdGhyZWUgY2FzZXMsIGlmIHRoZSBhcmd1bWVudCBkb2VzIG5vdCBoYXZlIHRoZSBwcm9wZXIgdHlwZSwgYVxuYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLlxuJywKKyAnd2hpbGUnOiAnXG5UaGUgYGB3aGlsZWBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGBgd2hpbGVgYCBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgcmVwZWF0ZWQgZXhlY3V0aW9uIGFzIGxvbmcgYXMgYW5cbmV4cHJlc3Npb24gaXMgdHJ1ZTpcblxuICAgd2hpbGVfc3RtdCA6Oj0gIndoaWxlIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cblRoaXMgcmVwZWF0ZWRseSB0ZXN0cyB0aGUgZXhwcmVzc2lvbiBhbmQsIGlmIGl0IGlzIHRydWUsIGV4ZWN1dGVzIHRoZVxuZmlyc3Qgc3VpdGU7IGlmIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlICh3aGljaCBtYXkgYmUgdGhlIGZpcnN0IHRpbWVcbml0IGlzIHRlc3RlZCkgdGhlIHN1aXRlIG9mIHRoZSBgYGVsc2VgYCBjbGF1c2UsIGlmIHByZXNlbnQsIGlzXG5leGVjdXRlZCBhbmQgdGhlIGxvb3AgdGVybWluYXRlcy5cblxuQSBgYGJyZWFrYGAgc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSB0ZXJtaW5hdGVzIHRoZSBsb29wXG53aXRob3V0IGV4ZWN1dGluZyB0aGUgYGBlbHNlYGAgY2xhdXNlXCdzIHN1aXRlLiAgQSBgYGNvbnRpbnVlYGBcbnN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgc2tpcHMgdGhlIHJlc3Qgb2YgdGhlIHN1aXRlIGFuZFxuZ29lcyBiYWNrIHRvIHRlc3RpbmcgdGhlIGV4cHJlc3Npb24uXG4nLAorICd3aXRoJzogJ1xuVGhlIGBgd2l0aGBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKlxuXG5OZXcgaW4gdmVyc2lvbiAyLjUuXG5cblRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byB3cmFwIHRoZSBleGVjdXRpb24gb2YgYSBibG9jayB3aXRoXG5tZXRob2RzIGRlZmluZWQgYnkgYSBjb250ZXh0IG1hbmFnZXIgKHNlZSBzZWN0aW9uICpXaXRoIFN0YXRlbWVudFxuQ29udGV4dCBNYW5hZ2VycyopLiBUaGlzIGFsbG93cyBjb21tb25cbmBgdHJ5YGAuLi5gYGV4Y2VwdGBgLi4uYGBmaW5hbGx5YGAgdXNhZ2UgcGF0dGVybnMgdG8gYmUgZW5jYXBzdWxhdGVkXG5mb3IgY29udmVuaWVudCByZXVzZS5cblxuICAgd2l0aF9zdG10IDo6PSAid2l0aCIgd2l0aF9pdGVtICgiLCIgd2l0aF9pdGVtKSogIjoiIHN1aXRlXG4gICB3aXRoX2l0ZW0gOjo9IGV4cHJlc3Npb24gWyJhcyIgdGFyZ2V0XVxuXG5UaGUgZXhlY3V0aW9uIG9mIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgd2l0aCBvbmUgIml0ZW0iIHByb2NlZWRzIGFzXG5mb2xsb3dzOlxuXG4xLiBUaGUgY29udGV4dCBleHByZXNzaW9uICh0aGUgZXhwcmVzc2lvbiBnaXZlbiBpbiB0aGUgYGB3aXRoX2l0ZW1gYClcbiAgIGlzIGV2YWx1YXRlZCB0byBvYnRhaW4gYSBjb250ZXh0IG1hbmFnZXIuXG5cbjIuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgYGBfX2V4aXRfXygpYGAgaXMgbG9hZGVkIGZvciBsYXRlciB1c2UuXG5cbjMuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgYGBfX2VudGVyX18oKWBgIG1ldGhvZCBpcyBpbnZva2VkLlxuXG40LiBJZiBhIHRhcmdldCB3YXMgaW5jbHVkZWQgaW4gdGhlIGBgd2l0aGBgIHN0YXRlbWVudCwgdGhlIHJldHVyblxuICAgdmFsdWUgZnJvbSBgYF9fZW50ZXJfXygpYGAgaXMgYXNzaWduZWQgdG8gaXQuXG5cbiAgIE5vdGU6IFRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgZ3VhcmFudGVlcyB0aGF0IGlmIHRoZSBgYF9fZW50ZXJfXygpYGBcbiAgICAgbWV0aG9kIHJldHVybnMgd2l0aG91dCBhbiBlcnJvciwgdGhlbiBgYF9fZXhpdF9fKClgYCB3aWxsIGFsd2F5c1xuICAgICBiZSBjYWxsZWQuIFRodXMsIGlmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGFzc2lnbm1lbnQgdG8gdGhlXG4gICAgIHRhcmdldCBsaXN0LCBpdCB3aWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgYW4gZXJyb3Igb2NjdXJyaW5nXG4gICAgIHdpdGhpbiB0aGUgc3VpdGUgd291bGQgYmUuIFNlZSBzdGVwIDYgYmVsb3cuXG5cbjUuIFRoZSBzdWl0ZSBpcyBleGVjdXRlZC5cblxuNi4gVGhlIGNvbnRleHQgbWFuYWdlclwncyBgYF9fZXhpdF9fKClgYCBtZXRob2QgaXMgaW52b2tlZC4gSWYgYW5cbiAgIGV4Y2VwdGlvbiBjYXVzZWQgdGhlIHN1aXRlIHRvIGJlIGV4aXRlZCwgaXRzIHR5cGUsIHZhbHVlLCBhbmRcbiAgIHRyYWNlYmFjayBhcmUgcGFzc2VkIGFzIGFyZ3VtZW50cyB0byBgYF9fZXhpdF9fKClgYC4gT3RoZXJ3aXNlLFxuICAgdGhyZWUgYGBOb25lYGAgYXJndW1lbnRzIGFyZSBzdXBwbGllZC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZHVlIHRvIGFuIGV4Y2VwdGlvbiwgYW5kIHRoZSByZXR1cm4gdmFsdWVcbiAgIGZyb20gdGhlIGBgX19leGl0X18oKWBgIG1ldGhvZCB3YXMgZmFsc2UsIHRoZSBleGNlcHRpb24gaXNcbiAgIHJlcmFpc2VkLiBJZiB0aGUgcmV0dXJuIHZhbHVlIHdhcyB0cnVlLCB0aGUgZXhjZXB0aW9uIGlzXG4gICBzdXBwcmVzc2VkLCBhbmQgZXhlY3V0aW9uIGNvbnRpbnVlcyB3aXRoIHRoZSBzdGF0ZW1lbnQgZm9sbG93aW5nXG4gICB0aGUgYGB3aXRoYGAgc3RhdGVtZW50LlxuXG4gICBJZiB0aGUgc3VpdGUgd2FzIGV4aXRlZCBmb3IgYW55IHJlYXNvbiBvdGhlciB0aGFuIGFuIGV4Y2VwdGlvbiwgdGhlXG4gICByZXR1cm4gdmFsdWUgZnJvbSBgYF9fZXhpdF9fKClgYCBpcyBpZ25vcmVkLCBhbmQgZXhlY3V0aW9uIHByb2NlZWRzXG4gICBhdCB0aGUgbm9ybWFsIGxvY2F0aW9uIGZvciB0aGUga2luZCBvZiBleGl0IHRoYXQgd2FzIHRha2VuLlxuXG5XaXRoIG1vcmUgdGhhbiBvbmUgaXRlbSwgdGhlIGNvbnRleHQgbWFuYWdlcnMgYXJlIHByb2Nlc3NlZCBhcyBpZlxubXVsdGlwbGUgYGB3aXRoYGAgc3RhdGVtZW50cyB3ZXJlIG5lc3RlZDpcblxuICAgd2l0aCBBKCkgYXMgYSwgQigpIGFzIGI6XG4gICAgICAgc3VpdGVcblxuaXMgZXF1aXZhbGVudCB0b1xuXG4gICB3aXRoIEEoKSBhcyBhOlxuICAgICAgIHdpdGggQigpIGFzIGI6XG4gICAgICAgICAgIHN1aXRlXG5cbk5vdGU6IEluIFB5dGhvbiAyLjUsIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQgaXMgb25seSBhbGxvd2VkIHdoZW4gdGhlXG4gIGBgd2l0aF9zdGF0ZW1lbnRgYCBmZWF0dXJlIGhhcyBiZWVuIGVuYWJsZWQuICBJdCBpcyBhbHdheXMgZW5hYmxlZFxuICBpbiBQeXRob24gMi42LlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi43OiBTdXBwb3J0IGZvciBtdWx0aXBsZSBjb250ZXh0IGV4cHJlc3Npb25zLlxuXG5TZWUgYWxzbzpcblxuICAgKipQRVAgMDM0MyoqIC0gVGhlICJ3aXRoIiBzdGF0ZW1lbnRcbiAgICAgIFRoZSBzcGVjaWZpY2F0aW9uLCBiYWNrZ3JvdW5kLCBhbmQgZXhhbXBsZXMgZm9yIHRoZSBQeXRob25cbiAgICAgIGBgd2l0aGBgIHN0YXRlbWVudC5cbicsCisgJ3lpZWxkJzogJ1xuVGhlIGBgeWllbGRgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIHlpZWxkX3N0bXQgOjo9IHlpZWxkX2V4cHJlc3Npb25cblxuVGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQgaXMgb25seSB1c2VkIHdoZW4gZGVmaW5pbmcgYSBnZW5lcmF0b3JcbmZ1bmN0aW9uLCBhbmQgaXMgb25seSB1c2VkIGluIHRoZSBib2R5IG9mIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24uXG5Vc2luZyBhIGBgeWllbGRgYCBzdGF0ZW1lbnQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uIGlzIHN1ZmZpY2llbnQgdG9cbmNhdXNlIHRoYXQgZGVmaW5pdGlvbiB0byBjcmVhdGUgYSBnZW5lcmF0b3IgZnVuY3Rpb24gaW5zdGVhZCBvZiBhXG5ub3JtYWwgZnVuY3Rpb24uXG5cbldoZW4gYSBnZW5lcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkLCBpdCByZXR1cm5zIGFuIGl0ZXJhdG9yIGtub3duIGFzIGFcbmdlbmVyYXRvciBpdGVyYXRvciwgb3IgbW9yZSBjb21tb25seSwgYSBnZW5lcmF0b3IuICBUaGUgYm9keSBvZiB0aGVcbmdlbmVyYXRvciBmdW5jdGlvbiBpcyBleGVjdXRlZCBieSBjYWxsaW5nIHRoZSBnZW5lcmF0b3JcJ3MgYGBuZXh0KClgYFxubWV0aG9kIHJlcGVhdGVkbHkgdW50aWwgaXQgcmFpc2VzIGFuIGV4Y2VwdGlvbi5cblxuV2hlbiBhIGBgeWllbGRgYCBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQsIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhdG9yIGlzXG5mcm96ZW4gYW5kIHRoZSB2YWx1ZSBvZiBgYGV4cHJlc3Npb25fbGlzdGBgIGlzIHJldHVybmVkIHRvXG5gYG5leHQoKWBgXCdzIGNhbGxlci4gIEJ5ICJmcm96ZW4iIHdlIG1lYW4gdGhhdCBhbGwgbG9jYWwgc3RhdGUgaXNcbnJldGFpbmVkLCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgYmluZGluZ3Mgb2YgbG9jYWwgdmFyaWFibGVzLCB0aGVcbmluc3RydWN0aW9uIHBvaW50ZXIsIGFuZCB0aGUgaW50ZXJuYWwgZXZhbHVhdGlvbiBzdGFjazogZW5vdWdoXG5pbmZvcm1hdGlvbiBpcyBzYXZlZCBzbyB0aGF0IHRoZSBuZXh0IHRpbWUgYGBuZXh0KClgYCBpcyBpbnZva2VkLCB0aGVcbmZ1bmN0aW9uIGNhbiBwcm9jZWVkIGV4YWN0bHkgYXMgaWYgdGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQgd2VyZSBqdXN0XG5hbm90aGVyIGV4dGVybmFsIGNhbGwuXG5cbkFzIG9mIFB5dGhvbiB2ZXJzaW9uIDIuNSwgdGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQgaXMgbm93IGFsbG93ZWQgaW5cbnRoZSBgYHRyeWBgIGNsYXVzZSBvZiBhIGBgdHJ5YGAgLi4uICBgYGZpbmFsbHlgYCBjb25zdHJ1Y3QuICBJZiB0aGVcbmdlbmVyYXRvciBpcyBub3QgcmVzdW1lZCBiZWZvcmUgaXQgaXMgZmluYWxpemVkIChieSByZWFjaGluZyBhIHplcm9cbnJlZmVyZW5jZSBjb3VudCBvciBieSBiZWluZyBnYXJiYWdlIGNvbGxlY3RlZCksIHRoZSBnZW5lcmF0b3ItXG5pdGVyYXRvclwncyBgYGNsb3NlKClgYCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQsIGFsbG93aW5nIGFueSBwZW5kaW5nXG5gYGZpbmFsbHlgYCBjbGF1c2VzIHRvIGV4ZWN1dGUuXG5cbkZvciBmdWxsIGRldGFpbHMgb2YgYGB5aWVsZGBgIHNlbWFudGljcywgcmVmZXIgdG8gdGhlICpZaWVsZFxuZXhwcmVzc2lvbnMqIHNlY3Rpb24uXG5cbk5vdGU6IEluIFB5dGhvbiAyLjIsIHRoZSBgYHlpZWxkYGAgc3RhdGVtZW50IHdhcyBvbmx5IGFsbG93ZWQgd2hlbiB0aGVcbiAgYGBnZW5lcmF0b3JzYGAgZmVhdHVyZSBoYXMgYmVlbiBlbmFibGVkLiAgVGhpcyBgYF9fZnV0dXJlX19gYCBpbXBvcnRcbiAgc3RhdGVtZW50IHdhcyB1c2VkIHRvIGVuYWJsZSB0aGUgZmVhdHVyZTpcblxuICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnNcblxuU2VlIGFsc286XG5cbiAgICoqUEVQIDAyNTUqKiAtIFNpbXBsZSBHZW5lcmF0b3JzXG4gICAgICBUaGUgcHJvcG9zYWwgZm9yIGFkZGluZyBnZW5lcmF0b3JzIGFuZCB0aGUgYGB5aWVsZGBgIHN0YXRlbWVudFxuICAgICAgdG8gUHl0aG9uLlxuXG4gICAqKlBFUCAwMzQyKiogLSBDb3JvdXRpbmVzIHZpYSBFbmhhbmNlZCBHZW5lcmF0b3JzXG4gICAgICBUaGUgcHJvcG9zYWwgdGhhdCwgYW1vbmcgb3RoZXIgZ2VuZXJhdG9yIGVuaGFuY2VtZW50cywgcHJvcG9zZWRcbiAgICAgIGFsbG93aW5nIGBgeWllbGRgYCB0byBhcHBlYXIgaW5zaWRlIGEgYGB0cnlgYCAuLi4gYGBmaW5hbGx5YGBcbiAgICAgIGJsb2NrLlxuJ30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS90b3BpY3MucHljIGIvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL3RvcGljcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1YTdlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS90b3BpY3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS90b3BpY3MucHlvIGIvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL3RvcGljcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1YTdlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS90b3BpY3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcXVvcHJpLnB5IGIvbGliL3B5dGhvbjIuNy9xdW9wcmkucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODc4OGFmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcXVvcHJpLnB5CkBAIC0wLDAgKzEsMjM3IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIkNvbnZlcnNpb25zIHRvL2Zyb20gcXVvdGVkLXByaW50YWJsZSB0cmFuc3BvcnQgZW5jb2RpbmcgYXMgcGVyIFJGQyAxNTIxLiIiIgorCisjIChEZWMgMTk5MSB2ZXJzaW9uKS4KKworX19hbGxfXyA9IFsiZW5jb2RlIiwgImRlY29kZSIsICJlbmNvZGVzdHJpbmciLCAiZGVjb2Rlc3RyaW5nIl0KKworRVNDQVBFID0gJz0nCitNQVhMSU5FU0laRSA9IDc2CitIRVggPSAnMDEyMzQ1Njc4OUFCQ0RFRicKK0VNUFRZU1RSSU5HID0gJycKKwordHJ5OgorICAgIGZyb20gYmluYXNjaWkgaW1wb3J0IGEyYl9xcCwgYjJhX3FwCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgYTJiX3FwID0gTm9uZQorICAgIGIyYV9xcCA9IE5vbmUKKworCitkZWYgbmVlZHNxdW90aW5nKGMsIHF1b3RldGFicywgaGVhZGVyKToKKyAgICAiIiJEZWNpZGUgd2hldGhlciBhIHBhcnRpY3VsYXIgY2hhcmFjdGVyIG5lZWRzIHRvIGJlIHF1b3RlZC4KKworICAgIFRoZSAncXVvdGV0YWJzJyBmbGFnIGluZGljYXRlcyB3aGV0aGVyIGVtYmVkZGVkIHRhYnMgYW5kIHNwYWNlcyBzaG91bGQgYmUKKyAgICBxdW90ZWQuICBOb3RlIHRoYXQgbGluZS1lbmRpbmcgdGFicyBhbmQgc3BhY2VzIGFyZSBhbHdheXMgZW5jb2RlZCwgYXMgcGVyCisgICAgUkZDIDE1MjEuCisgICAgIiIiCisgICAgaWYgYyBpbiAnIFx0JzoKKyAgICAgICAgcmV0dXJuIHF1b3RldGFicworICAgICMgaWYgaGVhZGVyLCB3ZSBoYXZlIHRvIGVzY2FwZSBfIGJlY2F1c2UgXyBpcyB1c2VkIHRvIGVzY2FwZSBzcGFjZQorICAgIGlmIGMgPT0gJ18nOgorICAgICAgICByZXR1cm4gaGVhZGVyCisgICAgcmV0dXJuIGMgPT0gRVNDQVBFIG9yIG5vdCAoJyAnIDw9IGMgPD0gJ34nKQorCitkZWYgcXVvdGUoYyk6CisgICAgIiIiUXVvdGUgYSBzaW5nbGUgY2hhcmFjdGVyLiIiIgorICAgIGkgPSBvcmQoYykKKyAgICByZXR1cm4gRVNDQVBFICsgSEVYW2kvLzE2XSArIEhFWFtpJTE2XQorCisKKworZGVmIGVuY29kZShpbnB1dCwgb3V0cHV0LCBxdW90ZXRhYnMsIGhlYWRlciA9IDApOgorICAgICIiIlJlYWQgJ2lucHV0JywgYXBwbHkgcXVvdGVkLXByaW50YWJsZSBlbmNvZGluZywgYW5kIHdyaXRlIHRvICdvdXRwdXQnLgorCisgICAgJ2lucHV0JyBhbmQgJ291dHB1dCcgYXJlIGZpbGVzIHdpdGggcmVhZGxpbmUoKSBhbmQgd3JpdGUoKSBtZXRob2RzLgorICAgIFRoZSAncXVvdGV0YWJzJyBmbGFnIGluZGljYXRlcyB3aGV0aGVyIGVtYmVkZGVkIHRhYnMgYW5kIHNwYWNlcyBzaG91bGQgYmUKKyAgICBxdW90ZWQuICBOb3RlIHRoYXQgbGluZS1lbmRpbmcgdGFicyBhbmQgc3BhY2VzIGFyZSBhbHdheXMgZW5jb2RlZCwgYXMgcGVyCisgICAgUkZDIDE1MjEuCisgICAgVGhlICdoZWFkZXInIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgd2UgYXJlIGVuY29kaW5nIHNwYWNlcyBhcyBfIGFzIHBlcgorICAgIFJGQyAxNTIyLgorICAgICIiIgorCisgICAgaWYgYjJhX3FwIGlzIG5vdCBOb25lOgorICAgICAgICBkYXRhID0gaW5wdXQucmVhZCgpCisgICAgICAgIG9kYXRhID0gYjJhX3FwKGRhdGEsIHF1b3RldGFicyA9IHF1b3RldGFicywgaGVhZGVyID0gaGVhZGVyKQorICAgICAgICBvdXRwdXQud3JpdGUob2RhdGEpCisgICAgICAgIHJldHVybgorCisgICAgZGVmIHdyaXRlKHMsIG91dHB1dD1vdXRwdXQsIGxpbmVFbmQ9J1xuJyk6CisgICAgICAgICMgUkZDIDE1MjEgcmVxdWlyZXMgdGhhdCB0aGUgbGluZSBlbmRpbmcgaW4gYSBzcGFjZSBvciB0YWIgbXVzdCBoYXZlCisgICAgICAgICMgdGhhdCB0cmFpbGluZyBjaGFyYWN0ZXIgZW5jb2RlZC4KKyAgICAgICAgaWYgcyBhbmQgc1stMTpdIGluICcgXHQnOgorICAgICAgICAgICAgb3V0cHV0LndyaXRlKHNbOi0xXSArIHF1b3RlKHNbLTFdKSArIGxpbmVFbmQpCisgICAgICAgIGVsaWYgcyA9PSAnLic6CisgICAgICAgICAgICBvdXRwdXQud3JpdGUocXVvdGUocykgKyBsaW5lRW5kKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0cHV0LndyaXRlKHMgKyBsaW5lRW5kKQorCisgICAgcHJldmxpbmUgPSBOb25lCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGlucHV0LnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBvdXRsaW5lID0gW10KKyAgICAgICAgIyBTdHJpcCBvZmYgYW55IHJlYWRsaW5lIGluZHVjZWQgdHJhaWxpbmcgbmV3bGluZQorICAgICAgICBzdHJpcHBlZCA9ICcnCisgICAgICAgIGlmIGxpbmVbLTE6XSA9PSAnXG4nOgorICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgc3RyaXBwZWQgPSAnXG4nCisgICAgICAgICMgQ2FsY3VsYXRlIHRoZSB1bi1sZW5ndGgtbGltaXRlZCBlbmNvZGVkIGxpbmUKKyAgICAgICAgZm9yIGMgaW4gbGluZToKKyAgICAgICAgICAgIGlmIG5lZWRzcXVvdGluZyhjLCBxdW90ZXRhYnMsIGhlYWRlcik6CisgICAgICAgICAgICAgICAgYyA9IHF1b3RlKGMpCisgICAgICAgICAgICBpZiBoZWFkZXIgYW5kIGMgPT0gJyAnOgorICAgICAgICAgICAgICAgIG91dGxpbmUuYXBwZW5kKCdfJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3V0bGluZS5hcHBlbmQoYykKKyAgICAgICAgIyBGaXJzdCwgd3JpdGUgb3V0IHRoZSBwcmV2aW91cyBsaW5lCisgICAgICAgIGlmIHByZXZsaW5lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd3JpdGUocHJldmxpbmUpCisgICAgICAgICMgTm93IHNlZSBpZiB3ZSBuZWVkIGFueSBzb2Z0IGxpbmUgYnJlYWtzIGJlY2F1c2Ugb2YgUkZDLWltcG9zZWQKKyAgICAgICAgIyBsZW5ndGggbGltaXRhdGlvbnMuICBUaGVuIGRvIHRoZSB0aGlzbGluZS0+cHJldmxpbmUgZGFuY2UuCisgICAgICAgIHRoaXNsaW5lID0gRU1QVFlTVFJJTkcuam9pbihvdXRsaW5lKQorICAgICAgICB3aGlsZSBsZW4odGhpc2xpbmUpID4gTUFYTElORVNJWkU6CisgICAgICAgICAgICAjIERvbid0IGZvcmdldCB0byBpbmNsdWRlIHRoZSBzb2Z0IGxpbmUgYnJlYWsgYD0nIHNpZ24gaW4gdGhlCisgICAgICAgICAgICAjIGxlbmd0aCBjYWxjdWxhdGlvbiEKKyAgICAgICAgICAgIHdyaXRlKHRoaXNsaW5lWzpNQVhMSU5FU0laRS0xXSwgbGluZUVuZD0nPVxuJykKKyAgICAgICAgICAgIHRoaXNsaW5lID0gdGhpc2xpbmVbTUFYTElORVNJWkUtMTpdCisgICAgICAgICMgV3JpdGUgb3V0IHRoZSBjdXJyZW50IGxpbmUKKyAgICAgICAgcHJldmxpbmUgPSB0aGlzbGluZQorICAgICMgV3JpdGUgb3V0IHRoZSBsYXN0IGxpbmUsIHdpdGhvdXQgYSB0cmFpbGluZyBuZXdsaW5lCisgICAgaWYgcHJldmxpbmUgaXMgbm90IE5vbmU6CisgICAgICAgIHdyaXRlKHByZXZsaW5lLCBsaW5lRW5kPXN0cmlwcGVkKQorCitkZWYgZW5jb2Rlc3RyaW5nKHMsIHF1b3RldGFicyA9IDAsIGhlYWRlciA9IDApOgorICAgIGlmIGIyYV9xcCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIGIyYV9xcChzLCBxdW90ZXRhYnMgPSBxdW90ZXRhYnMsIGhlYWRlciA9IGhlYWRlcikKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICBpbmZwID0gU3RyaW5nSU8ocykKKyAgICBvdXRmcCA9IFN0cmluZ0lPKCkKKyAgICBlbmNvZGUoaW5mcCwgb3V0ZnAsIHF1b3RldGFicywgaGVhZGVyKQorICAgIHJldHVybiBvdXRmcC5nZXR2YWx1ZSgpCisKKworCitkZWYgZGVjb2RlKGlucHV0LCBvdXRwdXQsIGhlYWRlciA9IDApOgorICAgICIiIlJlYWQgJ2lucHV0JywgYXBwbHkgcXVvdGVkLXByaW50YWJsZSBkZWNvZGluZywgYW5kIHdyaXRlIHRvICdvdXRwdXQnLgorICAgICdpbnB1dCcgYW5kICdvdXRwdXQnIGFyZSBmaWxlcyB3aXRoIHJlYWRsaW5lKCkgYW5kIHdyaXRlKCkgbWV0aG9kcy4KKyAgICBJZiAnaGVhZGVyJyBpcyB0cnVlLCBkZWNvZGUgdW5kZXJzY29yZSBhcyBzcGFjZSAocGVyIFJGQyAxNTIyKS4iIiIKKworICAgIGlmIGEyYl9xcCBpcyBub3QgTm9uZToKKyAgICAgICAgZGF0YSA9IGlucHV0LnJlYWQoKQorICAgICAgICBvZGF0YSA9IGEyYl9xcChkYXRhLCBoZWFkZXIgPSBoZWFkZXIpCisgICAgICAgIG91dHB1dC53cml0ZShvZGF0YSkKKyAgICAgICAgcmV0dXJuCisKKyAgICBuZXcgPSAnJworICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBpbnB1dC5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgICAgICBpLCBuID0gMCwgbGVuKGxpbmUpCisgICAgICAgIGlmIG4gPiAwIGFuZCBsaW5lW24tMV0gPT0gJ1xuJzoKKyAgICAgICAgICAgIHBhcnRpYWwgPSAwOyBuID0gbi0xCisgICAgICAgICAgICAjIFN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgICAgIHdoaWxlIG4gPiAwIGFuZCBsaW5lW24tMV0gaW4gIiBcdFxyIjoKKyAgICAgICAgICAgICAgICBuID0gbi0xCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJ0aWFsID0gMQorICAgICAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgICAgIGMgPSBsaW5lW2ldCisgICAgICAgICAgICBpZiBjID09ICdfJyBhbmQgaGVhZGVyOgorICAgICAgICAgICAgICAgIG5ldyA9IG5ldyArICcgJzsgaSA9IGkrMQorICAgICAgICAgICAgZWxpZiBjICE9IEVTQ0FQRToKKyAgICAgICAgICAgICAgICBuZXcgPSBuZXcgKyBjOyBpID0gaSsxCisgICAgICAgICAgICBlbGlmIGkrMSA9PSBuIGFuZCBub3QgcGFydGlhbDoKKyAgICAgICAgICAgICAgICBwYXJ0aWFsID0gMTsgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgaSsxIDwgbiBhbmQgbGluZVtpKzFdID09IEVTQ0FQRToKKyAgICAgICAgICAgICAgICBuZXcgPSBuZXcgKyBFU0NBUEU7IGkgPSBpKzIKKyAgICAgICAgICAgIGVsaWYgaSsyIDwgbiBhbmQgaXNoZXgobGluZVtpKzFdKSBhbmQgaXNoZXgobGluZVtpKzJdKToKKyAgICAgICAgICAgICAgICBuZXcgPSBuZXcgKyBjaHIodW5oZXgobGluZVtpKzE6aSszXSkpOyBpID0gaSszCisgICAgICAgICAgICBlbHNlOiAjIEJhZCBlc2NhcGUgc2VxdWVuY2UgLS0gbGVhdmUgaXQgaW4KKyAgICAgICAgICAgICAgICBuZXcgPSBuZXcgKyBjOyBpID0gaSsxCisgICAgICAgIGlmIG5vdCBwYXJ0aWFsOgorICAgICAgICAgICAgb3V0cHV0LndyaXRlKG5ldyArICdcbicpCisgICAgICAgICAgICBuZXcgPSAnJworICAgIGlmIG5ldzoKKyAgICAgICAgb3V0cHV0LndyaXRlKG5ldykKKworZGVmIGRlY29kZXN0cmluZyhzLCBoZWFkZXIgPSAwKToKKyAgICBpZiBhMmJfcXAgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBhMmJfcXAocywgaGVhZGVyID0gaGVhZGVyKQorICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgIGluZnAgPSBTdHJpbmdJTyhzKQorICAgIG91dGZwID0gU3RyaW5nSU8oKQorICAgIGRlY29kZShpbmZwLCBvdXRmcCwgaGVhZGVyID0gaGVhZGVyKQorICAgIHJldHVybiBvdXRmcC5nZXR2YWx1ZSgpCisKKworCisjIE90aGVyIGhlbHBlciBmdW5jdGlvbnMKK2RlZiBpc2hleChjKToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgY2hhcmFjdGVyICdjJyBpcyBhIGhleGFkZWNpbWFsIGRpZ2l0LiIiIgorICAgIHJldHVybiAnMCcgPD0gYyA8PSAnOScgb3IgJ2EnIDw9IGMgPD0gJ2YnIG9yICdBJyA8PSBjIDw9ICdGJworCitkZWYgdW5oZXgocyk6CisgICAgIiIiR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIGEgaGV4YWRlY2ltYWwgbnVtYmVyLiIiIgorICAgIGJpdHMgPSAwCisgICAgZm9yIGMgaW4gczoKKyAgICAgICAgaWYgJzAnIDw9IGMgPD0gJzknOgorICAgICAgICAgICAgaSA9IG9yZCgnMCcpCisgICAgICAgIGVsaWYgJ2EnIDw9IGMgPD0gJ2YnOgorICAgICAgICAgICAgaSA9IG9yZCgnYScpLTEwCisgICAgICAgIGVsaWYgJ0EnIDw9IGMgPD0gJ0YnOgorICAgICAgICAgICAgaSA9IG9yZCgnQScpLTEwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBicmVhaworICAgICAgICBiaXRzID0gYml0cyoxNiArIChvcmQoYykgLSBpKQorICAgIHJldHVybiBiaXRzCisKKworCitkZWYgbWFpbigpOgorICAgIGltcG9ydCBzeXMKKyAgICBpbXBvcnQgZ2V0b3B0CisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICd0ZCcpCisgICAgZXhjZXB0IGdldG9wdC5lcnJvciwgbXNnOgorICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLnN0ZGVycgorICAgICAgICBwcmludCBtc2cKKyAgICAgICAgcHJpbnQgInVzYWdlOiBxdW9wcmkgWy10IHwgLWRdIFtmaWxlXSAuLi4iCisgICAgICAgIHByaW50ICItdDogcXVvdGUgdGFicyIKKyAgICAgICAgcHJpbnQgIi1kOiBkZWNvZGU7IGRlZmF1bHQgZW5jb2RlIgorICAgICAgICBzeXMuZXhpdCgyKQorICAgIGRlY28gPSAwCisgICAgdGFicyA9IDAKKyAgICBmb3IgbywgYSBpbiBvcHRzOgorICAgICAgICBpZiBvID09ICctdCc6IHRhYnMgPSAxCisgICAgICAgIGlmIG8gPT0gJy1kJzogZGVjbyA9IDEKKyAgICBpZiB0YWJzIGFuZCBkZWNvOgorICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLnN0ZGVycgorICAgICAgICBwcmludCAiLXQgYW5kIC1kIGFyZSBtdXR1YWxseSBleGNsdXNpdmUiCisgICAgICAgIHN5cy5leGl0KDIpCisgICAgaWYgbm90IGFyZ3M6IGFyZ3MgPSBbJy0nXQorICAgIHN0cyA9IDAKKyAgICBmb3IgZmlsZSBpbiBhcmdzOgorICAgICAgICBpZiBmaWxlID09ICctJzoKKyAgICAgICAgICAgIGZwID0gc3lzLnN0ZGluCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnAgPSBvcGVuKGZpbGUpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIiVzOiBjYW4ndCBvcGVuICglcylcbiIgJSAoZmlsZSwgbXNnKSkKKyAgICAgICAgICAgICAgICBzdHMgPSAxCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgZGVjbzoKKyAgICAgICAgICAgIGRlY29kZShmcCwgc3lzLnN0ZG91dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVuY29kZShmcCwgc3lzLnN0ZG91dCwgdGFicykKKyAgICAgICAgaWYgZnAgaXMgbm90IHN5cy5zdGRpbjoKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICBpZiBzdHM6CisgICAgICAgIHN5cy5leGl0KHN0cykKKworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3F1b3ByaS5weWMgYi9saWIvcHl0aG9uMi43L3F1b3ByaS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4NzNjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcXVvcHJpLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3F1b3ByaS5weW8gYi9saWIvcHl0aG9uMi43L3F1b3ByaS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4NzNjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcXVvcHJpLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3JhbmRvbS5weSBiL2xpYi9weXRob24yLjcvcmFuZG9tLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDRhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3JhbmRvbS5weQpAQCAtMCwwICsxLDkwNCBAQAorIiIiUmFuZG9tIHZhcmlhYmxlIGdlbmVyYXRvcnMuCisKKyAgICBpbnRlZ2VycworICAgIC0tLS0tLS0tCisgICAgICAgICAgIHVuaWZvcm0gd2l0aGluIHJhbmdlCisKKyAgICBzZXF1ZW5jZXMKKyAgICAtLS0tLS0tLS0KKyAgICAgICAgICAgcGljayByYW5kb20gZWxlbWVudAorICAgICAgICAgICBwaWNrIHJhbmRvbSBzYW1wbGUKKyAgICAgICAgICAgZ2VuZXJhdGUgcmFuZG9tIHBlcm11dGF0aW9uCisKKyAgICBkaXN0cmlidXRpb25zIG9uIHRoZSByZWFsIGxpbmU6CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgIHVuaWZvcm0KKyAgICAgICAgICAgdHJpYW5ndWxhcgorICAgICAgICAgICBub3JtYWwgKEdhdXNzaWFuKQorICAgICAgICAgICBsb2dub3JtYWwKKyAgICAgICAgICAgbmVnYXRpdmUgZXhwb25lbnRpYWwKKyAgICAgICAgICAgZ2FtbWEKKyAgICAgICAgICAgYmV0YQorICAgICAgICAgICBwYXJldG8KKyAgICAgICAgICAgV2VpYnVsbAorCisgICAgZGlzdHJpYnV0aW9ucyBvbiB0aGUgY2lyY2xlIChhbmdsZXMgMCB0byAycGkpCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgIGNpcmN1bGFyIHVuaWZvcm0KKyAgICAgICAgICAgdm9uIE1pc2VzCisKK0dlbmVyYWwgbm90ZXMgb24gdGhlIHVuZGVybHlpbmcgTWVyc2VubmUgVHdpc3RlciBjb3JlIGdlbmVyYXRvcjoKKworKiBUaGUgcGVyaW9kIGlzIDIqKjE5OTM3LTEuCisqIEl0IGlzIG9uZSBvZiB0aGUgbW9zdCBleHRlbnNpdmVseSB0ZXN0ZWQgZ2VuZXJhdG9ycyBpbiBleGlzdGVuY2UuCisqIFdpdGhvdXQgYSBkaXJlY3Qgd2F5IHRvIGNvbXB1dGUgTiBzdGVwcyBmb3J3YXJkLCB0aGUgc2VtYW50aWNzIG9mCisgIGp1bXBhaGVhZChuKSBhcmUgd2Vha2VuZWQgdG8gc2ltcGx5IGp1bXAgdG8gYW5vdGhlciBkaXN0YW50IHN0YXRlIGFuZCByZWx5CisgIG9uIHRoZSBsYXJnZSBwZXJpb2QgdG8gYXZvaWQgb3ZlcmxhcHBpbmcgc2VxdWVuY2VzLgorKiBUaGUgcmFuZG9tKCkgbWV0aG9kIGlzIGltcGxlbWVudGVkIGluIEMsIGV4ZWN1dGVzIGluIGEgc2luZ2xlIFB5dGhvbiBzdGVwLAorICBhbmQgaXMsIHRoZXJlZm9yZSwgdGhyZWFkc2FmZS4KKworIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4gYXMgX3dhcm4KK2Zyb20gdHlwZXMgaW1wb3J0IE1ldGhvZFR5cGUgYXMgX01ldGhvZFR5cGUsIEJ1aWx0aW5NZXRob2RUeXBlIGFzIF9CdWlsdGluTWV0aG9kVHlwZQorZnJvbSBtYXRoIGltcG9ydCBsb2cgYXMgX2xvZywgZXhwIGFzIF9leHAsIHBpIGFzIF9waSwgZSBhcyBfZSwgY2VpbCBhcyBfY2VpbAorZnJvbSBtYXRoIGltcG9ydCBzcXJ0IGFzIF9zcXJ0LCBhY29zIGFzIF9hY29zLCBjb3MgYXMgX2Nvcywgc2luIGFzIF9zaW4KK2Zyb20gb3MgaW1wb3J0IHVyYW5kb20gYXMgX3VyYW5kb20KK2Zyb20gYmluYXNjaWkgaW1wb3J0IGhleGxpZnkgYXMgX2hleGxpZnkKK2ltcG9ydCBoYXNobGliIGFzIF9oYXNobGliCisKK19fYWxsX18gPSBbIlJhbmRvbSIsInNlZWQiLCJyYW5kb20iLCJ1bmlmb3JtIiwicmFuZGludCIsImNob2ljZSIsInNhbXBsZSIsCisgICAgICAgICAgICJyYW5kcmFuZ2UiLCJzaHVmZmxlIiwibm9ybWFsdmFyaWF0ZSIsImxvZ25vcm12YXJpYXRlIiwKKyAgICAgICAgICAgImV4cG92YXJpYXRlIiwidm9ubWlzZXN2YXJpYXRlIiwiZ2FtbWF2YXJpYXRlIiwidHJpYW5ndWxhciIsCisgICAgICAgICAgICJnYXVzcyIsImJldGF2YXJpYXRlIiwicGFyZXRvdmFyaWF0ZSIsIndlaWJ1bGx2YXJpYXRlIiwKKyAgICAgICAgICAgImdldHN0YXRlIiwic2V0c3RhdGUiLCJqdW1wYWhlYWQiLCAiV2ljaG1hbm5IaWxsIiwgImdldHJhbmRiaXRzIiwKKyAgICAgICAgICAgIlN5c3RlbVJhbmRvbSJdCisKK05WX01BR0lDQ09OU1QgPSA0ICogX2V4cCgtMC41KS9fc3FydCgyLjApCitUV09QSSA9IDIuMCpfcGkKK0xPRzQgPSBfbG9nKDQuMCkKK1NHX01BR0lDQ09OU1QgPSAxLjAgKyBfbG9nKDQuNSkKK0JQRiA9IDUzICAgICAgICAjIE51bWJlciBvZiBiaXRzIGluIGEgZmxvYXQKK1JFQ0lQX0JQRiA9IDIqKi1CUEYKKworCisjIFRyYW5zbGF0ZWQgYnkgR3VpZG8gdmFuIFJvc3N1bSBmcm9tIEMgc291cmNlIHByb3ZpZGVkIGJ5CisjIEFkcmlhbiBCYWRkZWxleS4gIEFkYXB0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIgZm9yIHVzZSB3aXRoCisjIHRoZSBNZXJzZW5uZSBUd2lzdGVyICBhbmQgb3MudXJhbmRvbSgpIGNvcmUgZ2VuZXJhdG9ycy4KKworaW1wb3J0IF9yYW5kb20KKworY2xhc3MgUmFuZG9tKF9yYW5kb20uUmFuZG9tKToKKyAgICAiIiJSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBiYXNlIGNsYXNzIHVzZWQgYnkgYm91bmQgbW9kdWxlIGZ1bmN0aW9ucy4KKworICAgIFVzZWQgdG8gaW5zdGFudGlhdGUgaW5zdGFuY2VzIG9mIFJhbmRvbSB0byBnZXQgZ2VuZXJhdG9ycyB0aGF0IGRvbid0CisgICAgc2hhcmUgc3RhdGUuICBFc3BlY2lhbGx5IHVzZWZ1bCBmb3IgbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMsIGNyZWF0aW5nCisgICAgYSBkaWZmZXJlbnQgaW5zdGFuY2Ugb2YgUmFuZG9tIGZvciBlYWNoIHRocmVhZCwgYW5kIHVzaW5nIHRoZSBqdW1wYWhlYWQoKQorICAgIG1ldGhvZCB0byBlbnN1cmUgdGhhdCB0aGUgZ2VuZXJhdGVkIHNlcXVlbmNlcyBzZWVuIGJ5IGVhY2ggdGhyZWFkIGRvbid0CisgICAgb3ZlcmxhcC4KKworICAgIENsYXNzIFJhbmRvbSBjYW4gYWxzbyBiZSBzdWJjbGFzc2VkIGlmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBiYXNpYworICAgIGdlbmVyYXRvciBvZiB5b3VyIG93biBkZXZpc2luZzogaW4gdGhhdCBjYXNlLCBvdmVycmlkZSB0aGUgZm9sbG93aW5nCisgICAgbWV0aG9kczogcmFuZG9tKCksIHNlZWQoKSwgZ2V0c3RhdGUoKSwgc2V0c3RhdGUoKSBhbmQganVtcGFoZWFkKCkuCisgICAgT3B0aW9uYWxseSwgaW1wbGVtZW50IGEgZ2V0cmFuZGJpdHMoKSBtZXRob2Qgc28gdGhhdCByYW5kcmFuZ2UoKSBjYW4gY292ZXIKKyAgICBhcmJpdHJhcmlseSBsYXJnZSByYW5nZXMuCisKKyAgICAiIiIKKworICAgIFZFUlNJT04gPSAzICAgICAjIHVzZWQgYnkgZ2V0c3RhdGUvc2V0c3RhdGUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4PU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGFuIGluc3RhbmNlLgorCisgICAgICAgIE9wdGlvbmFsIGFyZ3VtZW50IHggY29udHJvbHMgc2VlZGluZywgYXMgZm9yIFJhbmRvbS5zZWVkKCkuCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYuc2VlZCh4KQorICAgICAgICBzZWxmLmdhdXNzX25leHQgPSBOb25lCisKKyAgICBkZWYgc2VlZChzZWxmLCBhPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGludGVybmFsIHN0YXRlIGZyb20gaGFzaGFibGUgb2JqZWN0LgorCisgICAgICAgIE5vbmUgb3Igbm8gYXJndW1lbnQgc2VlZHMgZnJvbSBjdXJyZW50IHRpbWUgb3IgZnJvbSBhbiBvcGVyYXRpbmcKKyAgICAgICAgc3lzdGVtIHNwZWNpZmljIHJhbmRvbW5lc3Mgc291cmNlIGlmIGF2YWlsYWJsZS4KKworICAgICAgICBJZiBhIGlzIG5vdCBOb25lIG9yIGFuIGludCBvciBsb25nLCBoYXNoKGEpIGlzIHVzZWQgaW5zdGVhZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgYSBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGEgPSBsb25nKF9oZXhsaWZ5KF91cmFuZG9tKDE2KSksIDE2KQorICAgICAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgICAgICBhID0gbG9uZyh0aW1lLnRpbWUoKSAqIDI1NikgIyB1c2UgZnJhY3Rpb25hbCBzZWNvbmRzCisKKyAgICAgICAgc3VwZXIoUmFuZG9tLCBzZWxmKS5zZWVkKGEpCisgICAgICAgIHNlbGYuZ2F1c3NfbmV4dCA9IE5vbmUKKworICAgIGRlZiBnZXRzdGF0ZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGludGVybmFsIHN0YXRlOyBjYW4gYmUgcGFzc2VkIHRvIHNldHN0YXRlKCkgbGF0ZXIuIiIiCisgICAgICAgIHJldHVybiBzZWxmLlZFUlNJT04sIHN1cGVyKFJhbmRvbSwgc2VsZikuZ2V0c3RhdGUoKSwgc2VsZi5nYXVzc19uZXh0CisKKyAgICBkZWYgc2V0c3RhdGUoc2VsZiwgc3RhdGUpOgorICAgICAgICAiIiJSZXN0b3JlIGludGVybmFsIHN0YXRlIGZyb20gb2JqZWN0IHJldHVybmVkIGJ5IGdldHN0YXRlKCkuIiIiCisgICAgICAgIHZlcnNpb24gPSBzdGF0ZVswXQorICAgICAgICBpZiB2ZXJzaW9uID09IDM6CisgICAgICAgICAgICB2ZXJzaW9uLCBpbnRlcm5hbHN0YXRlLCBzZWxmLmdhdXNzX25leHQgPSBzdGF0ZQorICAgICAgICAgICAgc3VwZXIoUmFuZG9tLCBzZWxmKS5zZXRzdGF0ZShpbnRlcm5hbHN0YXRlKQorICAgICAgICBlbGlmIHZlcnNpb24gPT0gMjoKKyAgICAgICAgICAgIHZlcnNpb24sIGludGVybmFsc3RhdGUsIHNlbGYuZ2F1c3NfbmV4dCA9IHN0YXRlCisgICAgICAgICAgICAjIEluIHZlcnNpb24gMiwgdGhlIHN0YXRlIHdhcyBzYXZlZCBhcyBzaWduZWQgaW50cywgd2hpY2ggY2F1c2VzCisgICAgICAgICAgICAjICAgaW5jb25zaXN0ZW5jaWVzIGJldHdlZW4gMzIvNjQtYml0IHN5c3RlbXMuIFRoZSBzdGF0ZSBpcworICAgICAgICAgICAgIyAgIHJlYWxseSB1bnNpZ25lZCAzMi1iaXQgaW50cywgc28gd2UgY29udmVydCBuZWdhdGl2ZSBpbnRzIGZyb20KKyAgICAgICAgICAgICMgICB2ZXJzaW9uIDIgdG8gcG9zaXRpdmUgbG9uZ3MgZm9yIHZlcnNpb24gMy4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbnRlcm5hbHN0YXRlID0gdHVwbGUoIGxvbmcoeCkgJSAoMioqMzIpIGZvciB4IGluIGludGVybmFsc3RhdGUgKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBlCisgICAgICAgICAgICBzdXBlcihSYW5kb20sIHNlbGYpLnNldHN0YXRlKGludGVybmFsc3RhdGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdGF0ZSB3aXRoIHZlcnNpb24gJXMgcGFzc2VkIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJhbmRvbS5zZXRzdGF0ZSgpIG9mIHZlcnNpb24gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24sIHNlbGYuVkVSU0lPTikpCisKKyAgICBkZWYganVtcGFoZWFkKHNlbGYsIG4pOgorICAgICAgICAiIiJDaGFuZ2UgdGhlIGludGVybmFsIHN0YXRlIHRvIG9uZSB0aGF0IGlzIGxpa2VseSBmYXIgYXdheQorICAgICAgICBmcm9tIHRoZSBjdXJyZW50IHN0YXRlLiAgVGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgaW4gUHkzLngsCisgICAgICAgIHNvIGl0IGlzIGJldHRlciB0byBzaW1wbHkgcmVzZWVkLgorICAgICAgICAiIiIKKyAgICAgICAgIyBUaGUgc3VwZXIuanVtcGFoZWFkKCkgbWV0aG9kIHVzZXMgc2h1ZmZsaW5nIHRvIGNoYW5nZSBzdGF0ZSwKKyAgICAgICAgIyBzbyBpdCBuZWVkcyBhIGxhcmdlIGFuZCAiaW50ZXJlc3RpbmciIG4gdG8gd29yayB3aXRoLiAgSGVyZSwKKyAgICAgICAgIyB3ZSB1c2UgaGFzaGluZyB0byBjcmVhdGUgYSBsYXJnZSBuIGZvciB0aGUgc2h1ZmZsZS4KKyAgICAgICAgcyA9IHJlcHIobikgKyByZXByKHNlbGYuZ2V0c3RhdGUoKSkKKyAgICAgICAgbiA9IGludChfaGFzaGxpYi5uZXcoJ3NoYTUxMicsIHMpLmhleGRpZ2VzdCgpLCAxNikKKyAgICAgICAgc3VwZXIoUmFuZG9tLCBzZWxmKS5qdW1wYWhlYWQobikKKworIyMgLS0tLSBNZXRob2RzIGJlbG93IHRoaXMgcG9pbnQgZG8gbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiB3aGVuCisjIyAtLS0tIHN1YmNsYXNzaW5nIGZvciB0aGUgcHVycG9zZSBvZiB1c2luZyBhIGRpZmZlcmVudCBjb3JlIGdlbmVyYXRvci4KKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGlja2xlIHN1cHBvcnQgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6ICMgZm9yIHBpY2tsZQorICAgICAgICByZXR1cm4gc2VsZi5nZXRzdGF0ZSgpCisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKTogICMgZm9yIHBpY2tsZQorICAgICAgICBzZWxmLnNldHN0YXRlKHN0YXRlKQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKCksIHNlbGYuZ2V0c3RhdGUoKQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBpbnRlZ2VyIG1ldGhvZHMgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiByYW5kcmFuZ2Uoc2VsZiwgc3RhcnQsIHN0b3A9Tm9uZSwgc3RlcD0xLCBpbnQ9aW50LCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICBtYXh3aWR0aD0xTDw8QlBGKToKKyAgICAgICAgIiIiQ2hvb3NlIGEgcmFuZG9tIGl0ZW0gZnJvbSByYW5nZShzdGFydCwgc3RvcFssIHN0ZXBdKS4KKworICAgICAgICBUaGlzIGZpeGVzIHRoZSBwcm9ibGVtIHdpdGggcmFuZGludCgpIHdoaWNoIGluY2x1ZGVzIHRoZQorICAgICAgICBlbmRwb2ludDsgaW4gUHl0aG9uIHRoaXMgaXMgdXN1YWxseSBub3Qgd2hhdCB5b3Ugd2FudC4KKyAgICAgICAgRG8gbm90IHN1cHBseSB0aGUgJ2ludCcsICdkZWZhdWx0JywgYW5kICdtYXh3aWR0aCcgYXJndW1lbnRzLgorICAgICAgICAiIiIKKworICAgICAgICAjIFRoaXMgY29kZSBpcyBhIGJpdCBtZXNzeSB0byBtYWtlIGl0IGZhc3QgZm9yIHRoZQorICAgICAgICAjIGNvbW1vbiBjYXNlIHdoaWxlIHN0aWxsIGRvaW5nIGFkZXF1YXRlIGVycm9yIGNoZWNraW5nLgorICAgICAgICBpc3RhcnQgPSBpbnQoc3RhcnQpCisgICAgICAgIGlmIGlzdGFydCAhPSBzdGFydDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJub24taW50ZWdlciBhcmcgMSBmb3IgcmFuZHJhbmdlKCkiCisgICAgICAgIGlmIHN0b3AgaXMgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIGlzdGFydCA+IDA6CisgICAgICAgICAgICAgICAgaWYgaXN0YXJ0ID49IG1heHdpZHRoOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmFuZGJlbG93KGlzdGFydCkKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50KHNlbGYucmFuZG9tKCkgKiBpc3RhcnQpCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZW1wdHkgcmFuZ2UgZm9yIHJhbmRyYW5nZSgpIgorCisgICAgICAgICMgc3RvcCBhcmd1bWVudCBzdXBwbGllZC4KKyAgICAgICAgaXN0b3AgPSBpbnQoc3RvcCkKKyAgICAgICAgaWYgaXN0b3AgIT0gc3RvcDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJub24taW50ZWdlciBzdG9wIGZvciByYW5kcmFuZ2UoKSIKKyAgICAgICAgd2lkdGggPSBpc3RvcCAtIGlzdGFydAorICAgICAgICBpZiBzdGVwID09IDEgYW5kIHdpZHRoID4gMDoKKyAgICAgICAgICAgICMgTm90ZSB0aGF0CisgICAgICAgICAgICAjICAgICBpbnQoaXN0YXJ0ICsgc2VsZi5yYW5kb20oKSp3aWR0aCkKKyAgICAgICAgICAgICMgaW5zdGVhZCB3b3VsZCBiZSBpbmNvcnJlY3QuICBGb3IgZXhhbXBsZSwgY29uc2lkZXIgaXN0YXJ0CisgICAgICAgICAgICAjID0gLTIgYW5kIGlzdG9wID0gMC4gIFRoZW4gdGhlIGd1dHMgd291bGQgYmUgaW4KKyAgICAgICAgICAgICMgLTIuMCB0byAwLjAgZXhjbHVzaXZlIG9uIGJvdGggZW5kcyAoaWdub3JpbmcgdGhhdCByYW5kb20oKQorICAgICAgICAgICAgIyBtaWdodCByZXR1cm4gMC4wKSwgYW5kIGJlY2F1c2UgaW50KCkgdHJ1bmNhdGVzIHRvd2FyZCAwLCB0aGUKKyAgICAgICAgICAgICMgZmluYWwgcmVzdWx0IHdvdWxkIGJlIC0xIG9yIDAgKGluc3RlYWQgb2YgLTIgb3IgLTEpLgorICAgICAgICAgICAgIyAgICAgaXN0YXJ0ICsgaW50KHNlbGYucmFuZG9tKCkqd2lkdGgpCisgICAgICAgICAgICAjIHdvdWxkIGFsc28gYmUgaW5jb3JyZWN0LCBmb3IgYSBzdWJ0bGVyIHJlYXNvbjogIHRoZSBSSFMKKyAgICAgICAgICAgICMgY2FuIHJldHVybiBhIGxvbmcsIGFuZCB0aGVuIHJhbmRyYW5nZSgpIHdvdWxkIGFsc28gcmV0dXJuCisgICAgICAgICAgICAjIGEgbG9uZywgYnV0IHdlJ3JlIHN1cHBvc2VkIHRvIHJldHVybiBhbiBpbnQgKGZvciBiYWNrd2FyZAorICAgICAgICAgICAgIyBjb21wYXRpYmlsaXR5KS4KKworICAgICAgICAgICAgaWYgd2lkdGggPj0gbWF4d2lkdGg6CisgICAgICAgICAgICAgICAgcmV0dXJuIGludChpc3RhcnQgKyBzZWxmLl9yYW5kYmVsb3cod2lkdGgpKQorICAgICAgICAgICAgcmV0dXJuIGludChpc3RhcnQgKyBpbnQoc2VsZi5yYW5kb20oKSp3aWR0aCkpCisgICAgICAgIGlmIHN0ZXAgPT0gMToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKCkgKCVkLCVkLCAlZCkiICUgKGlzdGFydCwgaXN0b3AsIHdpZHRoKQorCisgICAgICAgICMgTm9uLXVuaXQgc3RlcCBhcmd1bWVudCBzdXBwbGllZC4KKyAgICAgICAgaXN0ZXAgPSBpbnQoc3RlcCkKKyAgICAgICAgaWYgaXN0ZXAgIT0gc3RlcDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJub24taW50ZWdlciBzdGVwIGZvciByYW5kcmFuZ2UoKSIKKyAgICAgICAgaWYgaXN0ZXAgPiAwOgorICAgICAgICAgICAgbiA9ICh3aWR0aCArIGlzdGVwIC0gMSkgLy8gaXN0ZXAKKyAgICAgICAgZWxpZiBpc3RlcCA8IDA6CisgICAgICAgICAgICBuID0gKHdpZHRoICsgaXN0ZXAgKyAxKSAvLyBpc3RlcAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInplcm8gc3RlcCBmb3IgcmFuZHJhbmdlKCkiCisKKyAgICAgICAgaWYgbiA8PSAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImVtcHR5IHJhbmdlIGZvciByYW5kcmFuZ2UoKSIKKworICAgICAgICBpZiBuID49IG1heHdpZHRoOgorICAgICAgICAgICAgcmV0dXJuIGlzdGFydCArIGlzdGVwKnNlbGYuX3JhbmRiZWxvdyhuKQorICAgICAgICByZXR1cm4gaXN0YXJ0ICsgaXN0ZXAqaW50KHNlbGYucmFuZG9tKCkgKiBuKQorCisgICAgZGVmIHJhbmRpbnQoc2VsZiwgYSwgYik6CisgICAgICAgICIiIlJldHVybiByYW5kb20gaW50ZWdlciBpbiByYW5nZSBbYSwgYl0sIGluY2x1ZGluZyBib3RoIGVuZCBwb2ludHMuCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiBzZWxmLnJhbmRyYW5nZShhLCBiKzEpCisKKyAgICBkZWYgX3JhbmRiZWxvdyhzZWxmLCBuLCBfbG9nPV9sb2csIGludD1pbnQsIF9tYXh3aWR0aD0xTDw8QlBGLAorICAgICAgICAgICAgICAgICAgIF9NZXRob2Q9X01ldGhvZFR5cGUsIF9CdWlsdGluTWV0aG9kPV9CdWlsdGluTWV0aG9kVHlwZSk6CisgICAgICAgICIiIlJldHVybiBhIHJhbmRvbSBpbnQgaW4gdGhlIHJhbmdlIFswLG4pCisKKyAgICAgICAgSGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBuIGhhcyBtb3JlIGJpdHMgdGhhbiByZXR1cm5lZAorICAgICAgICBieSBhIHNpbmdsZSBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIGdlbmVyYXRvci4KKyAgICAgICAgIiIiCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZ2V0cmFuZGJpdHMgPSBzZWxmLmdldHJhbmRiaXRzCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgT25seSBjYWxsIHNlbGYuZ2V0cmFuZGJpdHMgaWYgdGhlIG9yaWdpbmFsIHJhbmRvbSgpIGJ1aWx0aW4gbWV0aG9kCisgICAgICAgICAgICAjIGhhcyBub3QgYmVlbiBvdmVycmlkZGVuIG9yIGlmIGEgbmV3IGdldHJhbmRiaXRzKCkgd2FzIHN1cHBsaWVkLgorICAgICAgICAgICAgIyBUaGlzIGFzc3VyZXMgdGhhdCB0aGUgdHdvIG1ldGhvZHMgY29ycmVzcG9uZC4KKyAgICAgICAgICAgIGlmIHR5cGUoc2VsZi5yYW5kb20pIGlzIF9CdWlsdGluTWV0aG9kIG9yIHR5cGUoZ2V0cmFuZGJpdHMpIGlzIF9NZXRob2Q6CisgICAgICAgICAgICAgICAgayA9IGludCgxLjAwMDAxICsgX2xvZyhuLTEsIDIuMCkpICAgIyAyKiprID4gbi0xID4gMioqKGstMikKKyAgICAgICAgICAgICAgICByID0gZ2V0cmFuZGJpdHMoaykKKyAgICAgICAgICAgICAgICB3aGlsZSByID49IG46CisgICAgICAgICAgICAgICAgICAgIHIgPSBnZXRyYW5kYml0cyhrKQorICAgICAgICAgICAgICAgIHJldHVybiByCisgICAgICAgIGlmIG4gPj0gX21heHdpZHRoOgorICAgICAgICAgICAgX3dhcm4oIlVuZGVybHlpbmcgcmFuZG9tKCkgZ2VuZXJhdG9yIGRvZXMgbm90IHN1cHBseSBcbiIKKyAgICAgICAgICAgICAgICAiZW5vdWdoIGJpdHMgdG8gY2hvb3NlIGZyb20gYSBwb3B1bGF0aW9uIHJhbmdlIHRoaXMgbGFyZ2UiKQorICAgICAgICByZXR1cm4gaW50KHNlbGYucmFuZG9tKCkgKiBuKQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBzZXF1ZW5jZSBtZXRob2RzICAtLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgY2hvaWNlKHNlbGYsIHNlcSk6CisgICAgICAgICIiIkNob29zZSBhIHJhbmRvbSBlbGVtZW50IGZyb20gYSBub24tZW1wdHkgc2VxdWVuY2UuIiIiCisgICAgICAgIHJldHVybiBzZXFbaW50KHNlbGYucmFuZG9tKCkgKiBsZW4oc2VxKSldICAjIHJhaXNlcyBJbmRleEVycm9yIGlmIHNlcSBpcyBlbXB0eQorCisgICAgZGVmIHNodWZmbGUoc2VsZiwgeCwgcmFuZG9tPU5vbmUsIGludD1pbnQpOgorICAgICAgICAiIiJ4LCByYW5kb209cmFuZG9tLnJhbmRvbSAtPiBzaHVmZmxlIGxpc3QgeCBpbiBwbGFjZTsgcmV0dXJuIE5vbmUuCisKKyAgICAgICAgT3B0aW9uYWwgYXJnIHJhbmRvbSBpcyBhIDAtYXJndW1lbnQgZnVuY3Rpb24gcmV0dXJuaW5nIGEgcmFuZG9tCisgICAgICAgIGZsb2F0IGluIFswLjAsIDEuMCk7IGJ5IGRlZmF1bHQsIHRoZSBzdGFuZGFyZCByYW5kb20ucmFuZG9tLgorICAgICAgICAiIiIKKworICAgICAgICBpZiByYW5kb20gaXMgTm9uZToKKyAgICAgICAgICAgIHJhbmRvbSA9IHNlbGYucmFuZG9tCisgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHhyYW5nZSgxLCBsZW4oeCkpKToKKyAgICAgICAgICAgICMgcGljayBhbiBlbGVtZW50IGluIHhbOmkrMV0gd2l0aCB3aGljaCB0byBleGNoYW5nZSB4W2ldCisgICAgICAgICAgICBqID0gaW50KHJhbmRvbSgpICogKGkrMSkpCisgICAgICAgICAgICB4W2ldLCB4W2pdID0geFtqXSwgeFtpXQorCisgICAgZGVmIHNhbXBsZShzZWxmLCBwb3B1bGF0aW9uLCBrKToKKyAgICAgICAgIiIiQ2hvb3NlcyBrIHVuaXF1ZSByYW5kb20gZWxlbWVudHMgZnJvbSBhIHBvcHVsYXRpb24gc2VxdWVuY2UuCisKKyAgICAgICAgUmV0dXJucyBhIG5ldyBsaXN0IGNvbnRhaW5pbmcgZWxlbWVudHMgZnJvbSB0aGUgcG9wdWxhdGlvbiB3aGlsZQorICAgICAgICBsZWF2aW5nIHRoZSBvcmlnaW5hbCBwb3B1bGF0aW9uIHVuY2hhbmdlZC4gIFRoZSByZXN1bHRpbmcgbGlzdCBpcworICAgICAgICBpbiBzZWxlY3Rpb24gb3JkZXIgc28gdGhhdCBhbGwgc3ViLXNsaWNlcyB3aWxsIGFsc28gYmUgdmFsaWQgcmFuZG9tCisgICAgICAgIHNhbXBsZXMuICBUaGlzIGFsbG93cyByYWZmbGUgd2lubmVycyAodGhlIHNhbXBsZSkgdG8gYmUgcGFydGl0aW9uZWQKKyAgICAgICAgaW50byBncmFuZCBwcml6ZSBhbmQgc2Vjb25kIHBsYWNlIHdpbm5lcnMgKHRoZSBzdWJzbGljZXMpLgorCisgICAgICAgIE1lbWJlcnMgb2YgdGhlIHBvcHVsYXRpb24gbmVlZCBub3QgYmUgaGFzaGFibGUgb3IgdW5pcXVlLiAgSWYgdGhlCisgICAgICAgIHBvcHVsYXRpb24gY29udGFpbnMgcmVwZWF0cywgdGhlbiBlYWNoIG9jY3VycmVuY2UgaXMgYSBwb3NzaWJsZQorICAgICAgICBzZWxlY3Rpb24gaW4gdGhlIHNhbXBsZS4KKworICAgICAgICBUbyBjaG9vc2UgYSBzYW1wbGUgaW4gYSByYW5nZSBvZiBpbnRlZ2VycywgdXNlIHhyYW5nZSBhcyBhbiBhcmd1bWVudC4KKyAgICAgICAgVGhpcyBpcyBlc3BlY2lhbGx5IGZhc3QgYW5kIHNwYWNlIGVmZmljaWVudCBmb3Igc2FtcGxpbmcgZnJvbSBhCisgICAgICAgIGxhcmdlIHBvcHVsYXRpb246ICAgc2FtcGxlKHhyYW5nZSgxMDAwMDAwMCksIDYwKQorICAgICAgICAiIiIKKworICAgICAgICAjIFNhbXBsaW5nIHdpdGhvdXQgcmVwbGFjZW1lbnQgZW50YWlscyB0cmFja2luZyBlaXRoZXIgcG90ZW50aWFsCisgICAgICAgICMgc2VsZWN0aW9ucyAodGhlIHBvb2wpIGluIGEgbGlzdCBvciBwcmV2aW91cyBzZWxlY3Rpb25zIGluIGEgc2V0LgorCisgICAgICAgICMgV2hlbiB0aGUgbnVtYmVyIG9mIHNlbGVjdGlvbnMgaXMgc21hbGwgY29tcGFyZWQgdG8gdGhlCisgICAgICAgICMgcG9wdWxhdGlvbiwgdGhlbiB0cmFja2luZyBzZWxlY3Rpb25zIGlzIGVmZmljaWVudCwgcmVxdWlyaW5nCisgICAgICAgICMgb25seSBhIHNtYWxsIHNldCBhbmQgYW4gb2NjYXNpb25hbCByZXNlbGVjdGlvbi4gIEZvcgorICAgICAgICAjIGEgbGFyZ2VyIG51bWJlciBvZiBzZWxlY3Rpb25zLCB0aGUgcG9vbCB0cmFja2luZyBtZXRob2QgaXMKKyAgICAgICAgIyBwcmVmZXJyZWQgc2luY2UgdGhlIGxpc3QgdGFrZXMgbGVzcyBzcGFjZSB0aGFuIHRoZQorICAgICAgICAjIHNldCBhbmQgaXQgZG9lc24ndCBzdWZmZXIgZnJvbSBmcmVxdWVudCByZXNlbGVjdGlvbnMuCisKKyAgICAgICAgbiA9IGxlbihwb3B1bGF0aW9uKQorICAgICAgICBpZiBub3QgMCA8PSBrIDw9IG46CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzYW1wbGUgbGFyZ2VyIHRoYW4gcG9wdWxhdGlvbiIpCisgICAgICAgIHJhbmRvbSA9IHNlbGYucmFuZG9tCisgICAgICAgIF9pbnQgPSBpbnQKKyAgICAgICAgcmVzdWx0ID0gW05vbmVdICogaworICAgICAgICBzZXRzaXplID0gMjEgICAgICAgICMgc2l6ZSBvZiBhIHNtYWxsIHNldCBtaW51cyBzaXplIG9mIGFuIGVtcHR5IGxpc3QKKyAgICAgICAgaWYgayA+IDU6CisgICAgICAgICAgICBzZXRzaXplICs9IDQgKiogX2NlaWwoX2xvZyhrICogMywgNCkpICMgdGFibGUgc2l6ZSBmb3IgYmlnIHNldHMKKyAgICAgICAgaWYgbiA8PSBzZXRzaXplIG9yIGhhc2F0dHIocG9wdWxhdGlvbiwgImtleXMiKToKKyAgICAgICAgICAgICMgQW4gbi1sZW5ndGggbGlzdCBpcyBzbWFsbGVyIHRoYW4gYSBrLWxlbmd0aCBzZXQsIG9yIHRoaXMgaXMgYQorICAgICAgICAgICAgIyBtYXBwaW5nIHR5cGUgc28gdGhlIG90aGVyIGFsZ29yaXRobSB3b3VsZG4ndCB3b3JrLgorICAgICAgICAgICAgcG9vbCA9IGxpc3QocG9wdWxhdGlvbikKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShrKTogICAgICAgICAjIGludmFyaWFudDogIG5vbi1zZWxlY3RlZCBhdCBbMCxuLWkpCisgICAgICAgICAgICAgICAgaiA9IF9pbnQocmFuZG9tKCkgKiAobi1pKSkKKyAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBwb29sW2pdCisgICAgICAgICAgICAgICAgcG9vbFtqXSA9IHBvb2xbbi1pLTFdICAgIyBtb3ZlIG5vbi1zZWxlY3RlZCBpdGVtIGludG8gdmFjYW5jeQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gc2V0KCkKKyAgICAgICAgICAgICAgICBzZWxlY3RlZF9hZGQgPSBzZWxlY3RlZC5hZGQKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoayk6CisgICAgICAgICAgICAgICAgICAgIGogPSBfaW50KHJhbmRvbSgpICogbikKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgaiBpbiBzZWxlY3RlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSBfaW50KHJhbmRvbSgpICogbikKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYWRkKGopCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHBvcHVsYXRpb25bal0KKyAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBLZXlFcnJvcik6ICAgIyBoYW5kbGUgKGF0IGxlYXN0KSBzZXRzCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwb3B1bGF0aW9uLCBsaXN0KToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zYW1wbGUodHVwbGUocG9wdWxhdGlvbiksIGspCisgICAgICAgIHJldHVybiByZXN1bHQKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVhbC12YWx1ZWQgZGlzdHJpYnV0aW9ucyAgLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdW5pZm9ybShzZWxmLCBhLCBiKToKKyAgICAgICAgIkdldCBhIHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIFthLCBiKSBvciBbYSwgYl0gZGVwZW5kaW5nIG9uIHJvdW5kaW5nLiIKKyAgICAgICAgcmV0dXJuIGEgKyAoYi1hKSAqIHNlbGYucmFuZG9tKCkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHJpYW5ndWxhciAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHRyaWFuZ3VsYXIoc2VsZiwgbG93PTAuMCwgaGlnaD0xLjAsIG1vZGU9Tm9uZSk6CisgICAgICAgICIiIlRyaWFuZ3VsYXIgZGlzdHJpYnV0aW9uLgorCisgICAgICAgIENvbnRpbnVvdXMgZGlzdHJpYnV0aW9uIGJvdW5kZWQgYnkgZ2l2ZW4gbG93ZXIgYW5kIHVwcGVyIGxpbWl0cywKKyAgICAgICAgYW5kIGhhdmluZyBhIGdpdmVuIG1vZGUgdmFsdWUgaW4tYmV0d2Vlbi4KKworICAgICAgICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RyaWFuZ3VsYXJfZGlzdHJpYnV0aW9uCisKKyAgICAgICAgIiIiCisgICAgICAgIHUgPSBzZWxmLnJhbmRvbSgpCisgICAgICAgIGMgPSAwLjUgaWYgbW9kZSBpcyBOb25lIGVsc2UgKG1vZGUgLSBsb3cpIC8gKGhpZ2ggLSBsb3cpCisgICAgICAgIGlmIHUgPiBjOgorICAgICAgICAgICAgdSA9IDEuMCAtIHUKKyAgICAgICAgICAgIGMgPSAxLjAgLSBjCisgICAgICAgICAgICBsb3csIGhpZ2ggPSBoaWdoLCBsb3cKKyAgICAgICAgcmV0dXJuIGxvdyArIChoaWdoIC0gbG93KSAqICh1ICogYykgKiogMC41CisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIG5vcm1hbCBkaXN0cmlidXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBub3JtYWx2YXJpYXRlKHNlbGYsIG11LCBzaWdtYSk6CisgICAgICAgICIiIk5vcm1hbCBkaXN0cmlidXRpb24uCisKKyAgICAgICAgbXUgaXMgdGhlIG1lYW4sIGFuZCBzaWdtYSBpcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uLgorCisgICAgICAgICIiIgorICAgICAgICAjIG11ID0gbWVhbiwgc2lnbWEgPSBzdGFuZGFyZCBkZXZpYXRpb24KKworICAgICAgICAjIFVzZXMgS2luZGVybWFuIGFuZCBNb25haGFuIG1ldGhvZC4gUmVmZXJlbmNlOiBLaW5kZXJtYW4sCisgICAgICAgICMgQS5KLiBhbmQgTW9uYWhhbiwgSi5GLiwgIkNvbXB1dGVyIGdlbmVyYXRpb24gb2YgcmFuZG9tCisgICAgICAgICMgdmFyaWFibGVzIHVzaW5nIHRoZSByYXRpbyBvZiB1bmlmb3JtIGRldmlhdGVzIiwgQUNNIFRyYW5zCisgICAgICAgICMgTWF0aCBTb2Z0d2FyZSwgMywgKDE5NzcpLCBwcDI1Ny0yNjAuCisKKyAgICAgICAgcmFuZG9tID0gc2VsZi5yYW5kb20KKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHUxID0gcmFuZG9tKCkKKyAgICAgICAgICAgIHUyID0gMS4wIC0gcmFuZG9tKCkKKyAgICAgICAgICAgIHogPSBOVl9NQUdJQ0NPTlNUKih1MS0wLjUpL3UyCisgICAgICAgICAgICB6eiA9IHoqei80LjAKKyAgICAgICAgICAgIGlmIHp6IDw9IC1fbG9nKHUyKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gbXUgKyB6KnNpZ21hCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIGxvZ25vcm1hbCBkaXN0cmlidXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBsb2dub3JtdmFyaWF0ZShzZWxmLCBtdSwgc2lnbWEpOgorICAgICAgICAiIiJMb2cgbm9ybWFsIGRpc3RyaWJ1dGlvbi4KKworICAgICAgICBJZiB5b3UgdGFrZSB0aGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgdGhpcyBkaXN0cmlidXRpb24sIHlvdSdsbCBnZXQgYQorICAgICAgICBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggbWVhbiBtdSBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIHNpZ21hLgorICAgICAgICBtdSBjYW4gaGF2ZSBhbnkgdmFsdWUsIGFuZCBzaWdtYSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gX2V4cChzZWxmLm5vcm1hbHZhcmlhdGUobXUsIHNpZ21hKSkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZXhwb3ZhcmlhdGUoc2VsZiwgbGFtYmQpOgorICAgICAgICAiIiJFeHBvbmVudGlhbCBkaXN0cmlidXRpb24uCisKKyAgICAgICAgbGFtYmQgaXMgMS4wIGRpdmlkZWQgYnkgdGhlIGRlc2lyZWQgbWVhbi4gIEl0IHNob3VsZCBiZQorICAgICAgICBub256ZXJvLiAgKFRoZSBwYXJhbWV0ZXIgd291bGQgYmUgY2FsbGVkICJsYW1iZGEiLCBidXQgdGhhdCBpcworICAgICAgICBhIHJlc2VydmVkIHdvcmQgaW4gUHl0aG9uLikgIFJldHVybmVkIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8KKyAgICAgICAgcG9zaXRpdmUgaW5maW5pdHkgaWYgbGFtYmQgaXMgcG9zaXRpdmUsIGFuZCBmcm9tIG5lZ2F0aXZlCisgICAgICAgIGluZmluaXR5IHRvIDAgaWYgbGFtYmQgaXMgbmVnYXRpdmUuCisKKyAgICAgICAgIiIiCisgICAgICAgICMgbGFtYmQ6IHJhdGUgbGFtYmQgPSAxL21lYW4KKyAgICAgICAgIyAoJ2xhbWJkYScgaXMgYSBQeXRob24gcmVzZXJ2ZWQgd29yZCkKKworICAgICAgICAjIHdlIHVzZSAxLXJhbmRvbSgpIGluc3RlYWQgb2YgcmFuZG9tKCkgdG8gcHJlY2x1ZGUgdGhlCisgICAgICAgICMgcG9zc2liaWxpdHkgb2YgdGFraW5nIHRoZSBsb2cgb2YgemVyby4KKyAgICAgICAgcmV0dXJuIC1fbG9nKDEuMCAtIHNlbGYucmFuZG9tKCkpL2xhbWJkCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHZvbiBNaXNlcyBkaXN0cmlidXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB2b25taXNlc3ZhcmlhdGUoc2VsZiwgbXUsIGthcHBhKToKKyAgICAgICAgIiIiQ2lyY3VsYXIgZGF0YSBkaXN0cmlidXRpb24uCisKKyAgICAgICAgbXUgaXMgdGhlIG1lYW4gYW5nbGUsIGV4cHJlc3NlZCBpbiByYWRpYW5zIGJldHdlZW4gMCBhbmQgMipwaSwgYW5kCisgICAgICAgIGthcHBhIGlzIHRoZSBjb25jZW50cmF0aW9uIHBhcmFtZXRlciwgd2hpY2ggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IKKyAgICAgICAgZXF1YWwgdG8gemVyby4gIElmIGthcHBhIGlzIGVxdWFsIHRvIHplcm8sIHRoaXMgZGlzdHJpYnV0aW9uIHJlZHVjZXMKKyAgICAgICAgdG8gYSB1bmlmb3JtIHJhbmRvbSBhbmdsZSBvdmVyIHRoZSByYW5nZSAwIHRvIDIqcGkuCisKKyAgICAgICAgIiIiCisgICAgICAgICMgbXU6ICAgIG1lYW4gYW5nbGUgKGluIHJhZGlhbnMgYmV0d2VlbiAwIGFuZCAyKnBpKQorICAgICAgICAjIGthcHBhOiBjb25jZW50cmF0aW9uIHBhcmFtZXRlciBrYXBwYSAoPj0gMCkKKyAgICAgICAgIyBpZiBrYXBwYSA9IDAgZ2VuZXJhdGUgdW5pZm9ybSByYW5kb20gYW5nbGUKKworICAgICAgICAjIEJhc2VkIHVwb24gYW4gYWxnb3JpdGhtIHB1Ymxpc2hlZCBpbjogRmlzaGVyLCBOLkkuLAorICAgICAgICAjICJTdGF0aXN0aWNhbCBBbmFseXNpcyBvZiBDaXJjdWxhciBEYXRhIiwgQ2FtYnJpZGdlCisgICAgICAgICMgVW5pdmVyc2l0eSBQcmVzcywgMTk5My4KKworICAgICAgICAjIFRoYW5rcyB0byBNYWdudXMgS2Vzc2xlciBmb3IgYSBjb3JyZWN0aW9uIHRvIHRoZQorICAgICAgICAjIGltcGxlbWVudGF0aW9uIG9mIHN0ZXAgNC4KKworICAgICAgICByYW5kb20gPSBzZWxmLnJhbmRvbQorICAgICAgICBpZiBrYXBwYSA8PSAxZS02OgorICAgICAgICAgICAgcmV0dXJuIFRXT1BJICogcmFuZG9tKCkKKworICAgICAgICBzID0gMC41IC8ga2FwcGEKKyAgICAgICAgciA9IHMgKyBfc3FydCgxLjAgKyBzICogcykKKworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdTEgPSByYW5kb20oKQorICAgICAgICAgICAgeiA9IF9jb3MoX3BpICogdTEpCisKKyAgICAgICAgICAgIGQgPSB6IC8gKHIgKyB6KQorICAgICAgICAgICAgdTIgPSByYW5kb20oKQorICAgICAgICAgICAgaWYgdTIgPCAxLjAgLSBkICogZCBvciB1MiA8PSAoMS4wIC0gZCkgKiBfZXhwKGQpOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgcSA9IDEuMCAvIHIKKyAgICAgICAgZiA9IChxICsgeikgLyAoMS4wICsgcSAqIHopCisgICAgICAgIHUzID0gcmFuZG9tKCkKKyAgICAgICAgaWYgdTMgPiAwLjU6CisgICAgICAgICAgICB0aGV0YSA9IChtdSArIF9hY29zKGYpKSAlIFRXT1BJCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0aGV0YSA9IChtdSAtIF9hY29zKGYpKSAlIFRXT1BJCisKKyAgICAgICAgcmV0dXJuIHRoZXRhCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIGdhbW1hIGRpc3RyaWJ1dGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGdhbW1hdmFyaWF0ZShzZWxmLCBhbHBoYSwgYmV0YSk6CisgICAgICAgICIiIkdhbW1hIGRpc3RyaWJ1dGlvbi4gIE5vdCB0aGUgZ2FtbWEgZnVuY3Rpb24hCisKKyAgICAgICAgQ29uZGl0aW9ucyBvbiB0aGUgcGFyYW1ldGVycyBhcmUgYWxwaGEgPiAwIGFuZCBiZXRhID4gMC4KKworICAgICAgICBUaGUgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIGlzOgorCisgICAgICAgICAgICAgICAgICAgIHggKiogKGFscGhhIC0gMSkgKiBtYXRoLmV4cCgteCAvIGJldGEpCisgICAgICAgICAgcGRmKHgpID0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgbWF0aC5nYW1tYShhbHBoYSkgKiBiZXRhICoqIGFscGhhCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBhbHBoYSA+IDAsIGJldGEgPiAwLCBtZWFuIGlzIGFscGhhKmJldGEsIHZhcmlhbmNlIGlzIGFscGhhKmJldGEqKjIKKworICAgICAgICAjIFdhcm5pbmc6IGEgZmV3IG9sZGVyIHNvdXJjZXMgZGVmaW5lIHRoZSBnYW1tYSBkaXN0cmlidXRpb24gaW4gdGVybXMKKyAgICAgICAgIyBvZiBhbHBoYSA+IC0xLjAKKyAgICAgICAgaWYgYWxwaGEgPD0gMC4wIG9yIGJldGEgPD0gMC4wOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ2dhbW1hdmFyaWF0ZTogYWxwaGEgYW5kIGJldGEgbXVzdCBiZSA+IDAuMCcKKworICAgICAgICByYW5kb20gPSBzZWxmLnJhbmRvbQorICAgICAgICBpZiBhbHBoYSA+IDEuMDoKKworICAgICAgICAgICAgIyBVc2VzIFIuQy5ILiBDaGVuZywgIlRoZSBnZW5lcmF0aW9uIG9mIEdhbW1hCisgICAgICAgICAgICAjIHZhcmlhYmxlcyB3aXRoIG5vbi1pbnRlZ3JhbCBzaGFwZSBwYXJhbWV0ZXJzIiwKKyAgICAgICAgICAgICMgQXBwbGllZCBTdGF0aXN0aWNzLCAoMTk3NyksIDI2LCBOby4gMSwgcDcxLTc0CisKKyAgICAgICAgICAgIGFpbnYgPSBfc3FydCgyLjAgKiBhbHBoYSAtIDEuMCkKKyAgICAgICAgICAgIGJiYiA9IGFscGhhIC0gTE9HNAorICAgICAgICAgICAgY2NjID0gYWxwaGEgKyBhaW52CisKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgdTEgPSByYW5kb20oKQorICAgICAgICAgICAgICAgIGlmIG5vdCAxZS03IDwgdTEgPCAuOTk5OTk5OToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB1MiA9IDEuMCAtIHJhbmRvbSgpCisgICAgICAgICAgICAgICAgdiA9IF9sb2codTEvKDEuMC11MSkpL2FpbnYKKyAgICAgICAgICAgICAgICB4ID0gYWxwaGEqX2V4cCh2KQorICAgICAgICAgICAgICAgIHogPSB1MSp1MSp1MgorICAgICAgICAgICAgICAgIHIgPSBiYmIrY2NjKnYteAorICAgICAgICAgICAgICAgIGlmIHIgKyBTR19NQUdJQ0NPTlNUIC0gNC41KnogPj0gMC4wIG9yIHIgPj0gX2xvZyh6KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggKiBiZXRhCisKKyAgICAgICAgZWxpZiBhbHBoYSA9PSAxLjA6CisgICAgICAgICAgICAjIGV4cG92YXJpYXRlKDEpCisgICAgICAgICAgICB1ID0gcmFuZG9tKCkKKyAgICAgICAgICAgIHdoaWxlIHUgPD0gMWUtNzoKKyAgICAgICAgICAgICAgICB1ID0gcmFuZG9tKCkKKyAgICAgICAgICAgIHJldHVybiAtX2xvZyh1KSAqIGJldGEKKworICAgICAgICBlbHNlOiAgICMgYWxwaGEgaXMgYmV0d2VlbiAwIGFuZCAxIChleGNsdXNpdmUpCisKKyAgICAgICAgICAgICMgVXNlcyBBTEdPUklUSE0gR1Mgb2YgU3RhdGlzdGljYWwgQ29tcHV0aW5nIC0gS2VubmVkeSAmIEdlbnRsZQorCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHUgPSByYW5kb20oKQorICAgICAgICAgICAgICAgIGIgPSAoX2UgKyBhbHBoYSkvX2UKKyAgICAgICAgICAgICAgICBwID0gYip1CisgICAgICAgICAgICAgICAgaWYgcCA8PSAxLjA6CisgICAgICAgICAgICAgICAgICAgIHggPSBwICoqICgxLjAvYWxwaGEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgeCA9IC1fbG9nKChiLXApL2FscGhhKQorICAgICAgICAgICAgICAgIHUxID0gcmFuZG9tKCkKKyAgICAgICAgICAgICAgICBpZiBwID4gMS4wOgorICAgICAgICAgICAgICAgICAgICBpZiB1MSA8PSB4ICoqIChhbHBoYSAtIDEuMCk6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgdTEgPD0gX2V4cCgteCk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZXR1cm4geCAqIGJldGEKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gR2F1c3MgKGZhc3RlciBhbHRlcm5hdGl2ZSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBnYXVzcyhzZWxmLCBtdSwgc2lnbWEpOgorICAgICAgICAiIiJHYXVzc2lhbiBkaXN0cmlidXRpb24uCisKKyAgICAgICAgbXUgaXMgdGhlIG1lYW4sIGFuZCBzaWdtYSBpcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uLiAgVGhpcyBpcworICAgICAgICBzbGlnaHRseSBmYXN0ZXIgdGhhbiB0aGUgbm9ybWFsdmFyaWF0ZSgpIGZ1bmN0aW9uLgorCisgICAgICAgIE5vdCB0aHJlYWQtc2FmZSB3aXRob3V0IGEgbG9jayBhcm91bmQgY2FsbHMuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBXaGVuIHggYW5kIHkgYXJlIHR3byB2YXJpYWJsZXMgZnJvbSBbMCwgMSksIHVuaWZvcm1seQorICAgICAgICAjIGRpc3RyaWJ1dGVkLCB0aGVuCisgICAgICAgICMKKyAgICAgICAgIyAgICBjb3MoMipwaSp4KSpzcXJ0KC0yKmxvZygxLXkpKQorICAgICAgICAjICAgIHNpbigyKnBpKngpKnNxcnQoLTIqbG9nKDEteSkpCisgICAgICAgICMKKyAgICAgICAgIyBhcmUgdHdvICppbmRlcGVuZGVudCogdmFyaWFibGVzIHdpdGggbm9ybWFsIGRpc3RyaWJ1dGlvbgorICAgICAgICAjIChtdSA9IDAsIHNpZ21hID0gMSkuCisgICAgICAgICMgKExhbWJlcnQgTWVlcnRlbnMpCisgICAgICAgICMgKGNvcnJlY3RlZCB2ZXJzaW9uOyBidWcgZGlzY292ZXJlZCBieSBNaWtlIE1pbGxlciwgZml4ZWQgYnkgTE0pCisKKyAgICAgICAgIyBNdWx0aXRocmVhZGluZyBub3RlOiBXaGVuIHR3byB0aHJlYWRzIGNhbGwgdGhpcyBmdW5jdGlvbgorICAgICAgICAjIHNpbXVsdGFuZW91c2x5LCBpdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXkgd2lsbCByZWNlaXZlIHRoZQorICAgICAgICAjIHNhbWUgcmV0dXJuIHZhbHVlLiAgVGhlIHdpbmRvdyBpcyB2ZXJ5IHNtYWxsIHRob3VnaC4gIFRvCisgICAgICAgICMgYXZvaWQgdGhpcywgeW91IGhhdmUgdG8gdXNlIGEgbG9jayBhcm91bmQgYWxsIGNhbGxzLiAgKEkKKyAgICAgICAgIyBkaWRuJ3Qgd2FudCB0byBzbG93IHRoaXMgZG93biBpbiB0aGUgc2VyaWFsIGNhc2UgYnkgdXNpbmcgYQorICAgICAgICAjIGxvY2sgaGVyZS4pCisKKyAgICAgICAgcmFuZG9tID0gc2VsZi5yYW5kb20KKyAgICAgICAgeiA9IHNlbGYuZ2F1c3NfbmV4dAorICAgICAgICBzZWxmLmdhdXNzX25leHQgPSBOb25lCisgICAgICAgIGlmIHogaXMgTm9uZToKKyAgICAgICAgICAgIHgycGkgPSByYW5kb20oKSAqIFRXT1BJCisgICAgICAgICAgICBnMnJhZCA9IF9zcXJ0KC0yLjAgKiBfbG9nKDEuMCAtIHJhbmRvbSgpKSkKKyAgICAgICAgICAgIHogPSBfY29zKHgycGkpICogZzJyYWQKKyAgICAgICAgICAgIHNlbGYuZ2F1c3NfbmV4dCA9IF9zaW4oeDJwaSkgKiBnMnJhZAorCisgICAgICAgIHJldHVybiBtdSArIHoqc2lnbWEKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gYmV0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyMgU2VlCisjIyBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tYnVncy1saXN0LzIwMDEtSmFudWFyeS8wMDM3NTIuaHRtbAorIyMgZm9yIEl2YW4gRnJvaG5lJ3MgaW5zaWdodGZ1bCBhbmFseXNpcyBvZiB3aHkgdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uOgorIyMKKyMjICAgIGRlZiBiZXRhdmFyaWF0ZShzZWxmLCBhbHBoYSwgYmV0YSk6CisjIyAgICAgICAgIyBEaXNjcmV0ZSBFdmVudCBTaW11bGF0aW9uIGluIEMsIHBwIDg3LTg4LgorIyMKKyMjICAgICAgICB5ID0gc2VsZi5leHBvdmFyaWF0ZShhbHBoYSkKKyMjICAgICAgICB6ID0gc2VsZi5leHBvdmFyaWF0ZSgxLjAvYmV0YSkKKyMjICAgICAgICByZXR1cm4gei8oeSt6KQorIyMKKyMjIHdhcyBkZWFkIHdyb25nLCBhbmQgaG93IGl0IHByb2JhYmx5IGdvdCB0aGF0IHdheS4KKworICAgIGRlZiBiZXRhdmFyaWF0ZShzZWxmLCBhbHBoYSwgYmV0YSk6CisgICAgICAgICIiIkJldGEgZGlzdHJpYnV0aW9uLgorCisgICAgICAgIENvbmRpdGlvbnMgb24gdGhlIHBhcmFtZXRlcnMgYXJlIGFscGhhID4gMCBhbmQgYmV0YSA+IDAuCisgICAgICAgIFJldHVybmVkIHZhbHVlcyByYW5nZSBiZXR3ZWVuIDAgYW5kIDEuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBUaGlzIHZlcnNpb24gZHVlIHRvIEphbm5lIFNpbmtrb25lbiwgYW5kIG1hdGNoZXMgYWxsIHRoZSBzdGQKKyAgICAgICAgIyB0ZXh0cyAoZS5nLiwgS251dGggVm9sIDIgRWQgMyBwZyAxMzQgInRoZSBiZXRhIGRpc3RyaWJ1dGlvbiIpLgorICAgICAgICB5ID0gc2VsZi5nYW1tYXZhcmlhdGUoYWxwaGEsIDEuKQorICAgICAgICBpZiB5ID09IDA6CisgICAgICAgICAgICByZXR1cm4gMC4wCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4geSAvICh5ICsgc2VsZi5nYW1tYXZhcmlhdGUoYmV0YSwgMS4pKQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBQYXJldG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBwYXJldG92YXJpYXRlKHNlbGYsIGFscGhhKToKKyAgICAgICAgIiIiUGFyZXRvIGRpc3RyaWJ1dGlvbi4gIGFscGhhIGlzIHRoZSBzaGFwZSBwYXJhbWV0ZXIuIiIiCisgICAgICAgICMgSmFpbiwgcGcuIDQ5NQorCisgICAgICAgIHUgPSAxLjAgLSBzZWxmLnJhbmRvbSgpCisgICAgICAgIHJldHVybiAxLjAgLyBwb3codSwgMS4wL2FscGhhKQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBXZWlidWxsIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgd2VpYnVsbHZhcmlhdGUoc2VsZiwgYWxwaGEsIGJldGEpOgorICAgICAgICAiIiJXZWlidWxsIGRpc3RyaWJ1dGlvbi4KKworICAgICAgICBhbHBoYSBpcyB0aGUgc2NhbGUgcGFyYW1ldGVyIGFuZCBiZXRhIGlzIHRoZSBzaGFwZSBwYXJhbWV0ZXIuCisKKyAgICAgICAgIiIiCisgICAgICAgICMgSmFpbiwgcGcuIDQ5OTsgYnVnIGZpeCBjb3VydGVzeSBCaWxsIEFybXMKKworICAgICAgICB1ID0gMS4wIC0gc2VsZi5yYW5kb20oKQorICAgICAgICByZXR1cm4gYWxwaGEgKiBwb3coLV9sb2codSksIDEuMC9iZXRhKQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBXaWNobWFubi1IaWxsIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgV2ljaG1hbm5IaWxsKFJhbmRvbSk6CisKKyAgICBWRVJTSU9OID0gMSAgICAgIyB1c2VkIGJ5IGdldHN0YXRlL3NldHN0YXRlCisKKyAgICBkZWYgc2VlZChzZWxmLCBhPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGludGVybmFsIHN0YXRlIGZyb20gaGFzaGFibGUgb2JqZWN0LgorCisgICAgICAgIE5vbmUgb3Igbm8gYXJndW1lbnQgc2VlZHMgZnJvbSBjdXJyZW50IHRpbWUgb3IgZnJvbSBhbiBvcGVyYXRpbmcKKyAgICAgICAgc3lzdGVtIHNwZWNpZmljIHJhbmRvbW5lc3Mgc291cmNlIGlmIGF2YWlsYWJsZS4KKworICAgICAgICBJZiBhIGlzIG5vdCBOb25lIG9yIGFuIGludCBvciBsb25nLCBoYXNoKGEpIGlzIHVzZWQgaW5zdGVhZC4KKworICAgICAgICBJZiBhIGlzIGFuIGludCBvciBsb25nLCBhIGlzIHVzZWQgZGlyZWN0bHkuICBEaXN0aW5jdCB2YWx1ZXMgYmV0d2VlbgorICAgICAgICAwIGFuZCAyNzgxNDQzMTQ4NjU3NUwgaW5jbHVzaXZlIGFyZSBndWFyYW50ZWVkIHRvIHlpZWxkIGRpc3RpbmN0CisgICAgICAgIGludGVybmFsIHN0YXRlcyAodGhpcyBndWFyYW50ZWUgaXMgc3BlY2lmaWMgdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgV2ljaG1hbm4tSGlsbCBnZW5lcmF0b3IpLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBhIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYSA9IGxvbmcoX2hleGxpZnkoX3VyYW5kb20oMTYpKSwgMTYpCisgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICAgICAgICAgIGEgPSBsb25nKHRpbWUudGltZSgpICogMjU2KSAjIHVzZSBmcmFjdGlvbmFsIHNlY29uZHMKKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhLCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICBhID0gaGFzaChhKQorCisgICAgICAgIGEsIHggPSBkaXZtb2QoYSwgMzAyNjgpCisgICAgICAgIGEsIHkgPSBkaXZtb2QoYSwgMzAzMDYpCisgICAgICAgIGEsIHogPSBkaXZtb2QoYSwgMzAzMjIpCisgICAgICAgIHNlbGYuX3NlZWQgPSBpbnQoeCkrMSwgaW50KHkpKzEsIGludCh6KSsxCisKKyAgICAgICAgc2VsZi5nYXVzc19uZXh0ID0gTm9uZQorCisgICAgZGVmIHJhbmRvbShzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBuZXh0IHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLjAsIDEuMCkuIiIiCisKKyAgICAgICAgIyBXaWNobWFuLUhpbGwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCisgICAgICAgICMKKyAgICAgICAgIyBXaWNobWFubiwgQi4gQS4gJiBIaWxsLCBJLiBELiAoMTk4MikKKyAgICAgICAgIyBBbGdvcml0aG0gQVMgMTgzOgorICAgICAgICAjIEFuIGVmZmljaWVudCBhbmQgcG9ydGFibGUgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisgICAgICAgICMgQXBwbGllZCBTdGF0aXN0aWNzIDMxICgxOTgyKSAxODgtMTkwCisgICAgICAgICMKKyAgICAgICAgIyBzZWUgYWxzbzoKKyAgICAgICAgIyAgICAgICAgQ29ycmVjdGlvbiB0byBBbGdvcml0aG0gQVMgMTgzCisgICAgICAgICMgICAgICAgIEFwcGxpZWQgU3RhdGlzdGljcyAzMyAoMTk4NCkgMTIzCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICAgTWNMZW9kLCBBLiBJLiAoMTk4NSkKKyAgICAgICAgIyAgICAgICAgQSByZW1hcmsgb24gQWxnb3JpdGhtIEFTIDE4MworICAgICAgICAjICAgICAgICBBcHBsaWVkIFN0YXRpc3RpY3MgMzQgKDE5ODUpLDE5OC0yMDAKKworICAgICAgICAjIFRoaXMgcGFydCBpcyB0aHJlYWQtdW5zYWZlOgorICAgICAgICAjIEJFR0lOIENSSVRJQ0FMIFNFQ1RJT04KKyAgICAgICAgeCwgeSwgeiA9IHNlbGYuX3NlZWQKKyAgICAgICAgeCA9ICgxNzEgKiB4KSAlIDMwMjY5CisgICAgICAgIHkgPSAoMTcyICogeSkgJSAzMDMwNworICAgICAgICB6ID0gKDE3MCAqIHopICUgMzAzMjMKKyAgICAgICAgc2VsZi5fc2VlZCA9IHgsIHksIHoKKyAgICAgICAgIyBFTkQgQ1JJVElDQUwgU0VDVElPTgorCisgICAgICAgICMgTm90ZTogIG9uIGEgcGxhdGZvcm0gdXNpbmcgSUVFRS03NTQgZG91YmxlIGFyaXRobWV0aWMsIHRoaXMgY2FuCisgICAgICAgICMgbmV2ZXIgcmV0dXJuIDAuMCAoYXNzZXJ0ZWQgYnkgVGltOyBwcm9vZiB0b28gbG9uZyBmb3IgYSBjb21tZW50KS4KKyAgICAgICAgcmV0dXJuICh4LzMwMjY5LjAgKyB5LzMwMzA3LjAgKyB6LzMwMzIzLjApICUgMS4wCisKKyAgICBkZWYgZ2V0c3RhdGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBpbnRlcm5hbCBzdGF0ZTsgY2FuIGJlIHBhc3NlZCB0byBzZXRzdGF0ZSgpIGxhdGVyLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5WRVJTSU9OLCBzZWxmLl9zZWVkLCBzZWxmLmdhdXNzX25leHQKKworICAgIGRlZiBzZXRzdGF0ZShzZWxmLCBzdGF0ZSk6CisgICAgICAgICIiIlJlc3RvcmUgaW50ZXJuYWwgc3RhdGUgZnJvbSBvYmplY3QgcmV0dXJuZWQgYnkgZ2V0c3RhdGUoKS4iIiIKKyAgICAgICAgdmVyc2lvbiA9IHN0YXRlWzBdCisgICAgICAgIGlmIHZlcnNpb24gPT0gMToKKyAgICAgICAgICAgIHZlcnNpb24sIHNlbGYuX3NlZWQsIHNlbGYuZ2F1c3NfbmV4dCA9IHN0YXRlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdGF0ZSB3aXRoIHZlcnNpb24gJXMgcGFzc2VkIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJhbmRvbS5zZXRzdGF0ZSgpIG9mIHZlcnNpb24gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZlcnNpb24sIHNlbGYuVkVSU0lPTikpCisKKyAgICBkZWYganVtcGFoZWFkKHNlbGYsIG4pOgorICAgICAgICAiIiJBY3QgYXMgaWYgbiBjYWxscyB0byByYW5kb20oKSB3ZXJlIG1hZGUsIGJ1dCBxdWlja2x5LgorCisgICAgICAgIG4gaXMgYW4gaW50LCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMC4KKworICAgICAgICBFeGFtcGxlIHVzZTogIElmIHlvdSBoYXZlIDIgdGhyZWFkcyBhbmQga25vdyB0aGF0IGVhY2ggd2lsbAorICAgICAgICBjb25zdW1lIG5vIG1vcmUgdGhhbiBhIG1pbGxpb24gcmFuZG9tIG51bWJlcnMsIGNyZWF0ZSB0d28gUmFuZG9tCisgICAgICAgIG9iamVjdHMgcjEgYW5kIHIyLCB0aGVuIGRvCisgICAgICAgICAgICByMi5zZXRzdGF0ZShyMS5nZXRzdGF0ZSgpKQorICAgICAgICAgICAgcjIuanVtcGFoZWFkKDEwMDAwMDApCisgICAgICAgIFRoZW4gcjEgYW5kIHIyIHdpbGwgdXNlIGd1YXJhbnRlZWQtZGlzam9pbnQgc2VnbWVudHMgb2YgdGhlIGZ1bGwKKyAgICAgICAgcGVyaW9kLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBub3QgbiA+PSAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibiBtdXN0IGJlID49IDAiKQorICAgICAgICB4LCB5LCB6ID0gc2VsZi5fc2VlZAorICAgICAgICB4ID0gaW50KHggKiBwb3coMTcxLCBuLCAzMDI2OSkpICUgMzAyNjkKKyAgICAgICAgeSA9IGludCh5ICogcG93KDE3MiwgbiwgMzAzMDcpKSAlIDMwMzA3CisgICAgICAgIHogPSBpbnQoeiAqIHBvdygxNzAsIG4sIDMwMzIzKSkgJSAzMDMyMworICAgICAgICBzZWxmLl9zZWVkID0geCwgeSwgegorCisgICAgZGVmIF9fd2hzZWVkKHNlbGYsIHg9MCwgeT0wLCB6PTApOgorICAgICAgICAiIiJTZXQgdGhlIFdpY2htYW5uLUhpbGwgc2VlZCBmcm9tICh4LCB5LCB6KS4KKworICAgICAgICBUaGVzZSBtdXN0IGJlIGludGVnZXJzIGluIHRoZSByYW5nZSBbMCwgMjU2KS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbm90IHR5cGUoeCkgPT0gdHlwZSh5KSA9PSB0eXBlKHopID09IGludDoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignc2VlZHMgbXVzdCBiZSBpbnRlZ2VycycpCisgICAgICAgIGlmIG5vdCAoMCA8PSB4IDwgMjU2IGFuZCAwIDw9IHkgPCAyNTYgYW5kIDAgPD0geiA8IDI1Nik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdzZWVkcyBtdXN0IGJlIGluIHJhbmdlKDAsIDI1NiknKQorICAgICAgICBpZiAwID09IHggPT0geSA9PSB6OgorICAgICAgICAgICAgIyBJbml0aWFsaXplIGZyb20gY3VycmVudCB0aW1lCisgICAgICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICAgICAgdCA9IGxvbmcodGltZS50aW1lKCkgKiAyNTYpCisgICAgICAgICAgICB0ID0gaW50KCh0JjB4ZmZmZmZmKSBeICh0Pj4yNCkpCisgICAgICAgICAgICB0LCB4ID0gZGl2bW9kKHQsIDI1NikKKyAgICAgICAgICAgIHQsIHkgPSBkaXZtb2QodCwgMjU2KQorICAgICAgICAgICAgdCwgeiA9IGRpdm1vZCh0LCAyNTYpCisgICAgICAgICMgWmVybyBpcyBhIHBvb3Igc2VlZCwgc28gc3Vic3RpdHV0ZSAxCisgICAgICAgIHNlbGYuX3NlZWQgPSAoeCBvciAxLCB5IG9yIDEsIHogb3IgMSkKKworICAgICAgICBzZWxmLmdhdXNzX25leHQgPSBOb25lCisKKyAgICBkZWYgd2hzZWVkKHNlbGYsIGE9Tm9uZSk6CisgICAgICAgICIiIlNlZWQgZnJvbSBoYXNoYWJsZSBvYmplY3QncyBoYXNoIGNvZGUuCisKKyAgICAgICAgTm9uZSBvciBubyBhcmd1bWVudCBzZWVkcyBmcm9tIGN1cnJlbnQgdGltZS4gIEl0IGlzIG5vdCBndWFyYW50ZWVkCisgICAgICAgIHRoYXQgb2JqZWN0cyB3aXRoIGRpc3RpbmN0IGhhc2ggY29kZXMgbGVhZCB0byBkaXN0aW5jdCBpbnRlcm5hbAorICAgICAgICBzdGF0ZXMuCisKKyAgICAgICAgVGhpcyBpcyBvYnNvbGV0ZSwgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgc2VlZCByb3V0aW5lCisgICAgICAgIHVzZWQgcHJpb3IgdG8gUHl0aG9uIDIuMS4gIFVzZSB0aGUgLnNlZWQoKSBtZXRob2QgaW5zdGVhZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgYSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fX3doc2VlZCgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYSA9IGhhc2goYSkKKyAgICAgICAgYSwgeCA9IGRpdm1vZChhLCAyNTYpCisgICAgICAgIGEsIHkgPSBkaXZtb2QoYSwgMjU2KQorICAgICAgICBhLCB6ID0gZGl2bW9kKGEsIDI1NikKKyAgICAgICAgeCA9ICh4ICsgYSkgJSAyNTYgb3IgMQorICAgICAgICB5ID0gKHkgKyBhKSAlIDI1NiBvciAxCisgICAgICAgIHogPSAoeiArIGEpICUgMjU2IG9yIDEKKyAgICAgICAgc2VsZi5fX3doc2VlZCh4LCB5LCB6KQorCisjIyAtLS0tLS0tLS0tLS0tLS0gT3BlcmF0aW5nIFN5c3RlbSBSYW5kb20gU291cmNlICAtLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgU3lzdGVtUmFuZG9tKFJhbmRvbSk6CisgICAgIiIiQWx0ZXJuYXRlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHVzaW5nIHNvdXJjZXMgcHJvdmlkZWQKKyAgICBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSAoc3VjaCBhcyAvZGV2L3VyYW5kb20gb24gVW5peCBvcgorICAgIENyeXB0R2VuUmFuZG9tIG9uIFdpbmRvd3MpLgorCisgICAgIE5vdCBhdmFpbGFibGUgb24gYWxsIHN5c3RlbXMgKHNlZSBvcy51cmFuZG9tKCkgZm9yIGRldGFpbHMpLgorICAgICIiIgorCisgICAgZGVmIHJhbmRvbShzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBuZXh0IHJhbmRvbSBudW1iZXIgaW4gdGhlIHJhbmdlIFswLjAsIDEuMCkuIiIiCisgICAgICAgIHJldHVybiAobG9uZyhfaGV4bGlmeShfdXJhbmRvbSg3KSksIDE2KSA+PiAzKSAqIFJFQ0lQX0JQRgorCisgICAgZGVmIGdldHJhbmRiaXRzKHNlbGYsIGspOgorICAgICAgICAiIiJnZXRyYW5kYml0cyhrKSAtPiB4LiAgR2VuZXJhdGVzIGEgbG9uZyBpbnQgd2l0aCBrIHJhbmRvbSBiaXRzLiIiIgorICAgICAgICBpZiBrIDw9IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdudW1iZXIgb2YgYml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJykKKyAgICAgICAgaWYgayAhPSBpbnQoayk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ251bWJlciBvZiBiaXRzIHNob3VsZCBiZSBhbiBpbnRlZ2VyJykKKyAgICAgICAgYnl0ZXMgPSAoayArIDcpIC8vIDggICAgICAgICAgICAgICAgICAgICMgYml0cyAvIDggYW5kIHJvdW5kZWQgdXAKKyAgICAgICAgeCA9IGxvbmcoX2hleGxpZnkoX3VyYW5kb20oYnl0ZXMpKSwgMTYpCisgICAgICAgIHJldHVybiB4ID4+IChieXRlcyAqIDggLSBrKSAgICAgICAgICAgICAjIHRyaW0gZXhjZXNzIGJpdHMKKworICAgIGRlZiBfc3R1YihzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgIlN0dWIgbWV0aG9kLiAgTm90IHVzZWQgZm9yIGEgc3lzdGVtIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiIKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBzZWVkID0ganVtcGFoZWFkID0gX3N0dWIKKworICAgIGRlZiBfbm90aW1wbGVtZW50ZWQoc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICJNZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZm9yIGEgc3lzdGVtIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignU3lzdGVtIGVudHJvcHkgc291cmNlIGRvZXMgbm90IGhhdmUgc3RhdGUuJykKKyAgICBnZXRzdGF0ZSA9IHNldHN0YXRlID0gX25vdGltcGxlbWVudGVkCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHRlc3QgcHJvZ3JhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgX3Rlc3RfZ2VuZXJhdG9yKG4sIGZ1bmMsIGFyZ3MpOgorICAgIGltcG9ydCB0aW1lCisgICAgcHJpbnQgbiwgJ3RpbWVzJywgZnVuYy5fX25hbWVfXworICAgIHRvdGFsID0gMC4wCisgICAgc3FzdW0gPSAwLjAKKyAgICBzbWFsbGVzdCA9IDFlMTAKKyAgICBsYXJnZXN0ID0gLTFlMTAKKyAgICB0MCA9IHRpbWUudGltZSgpCisgICAgZm9yIGkgaW4gcmFuZ2Uobik6CisgICAgICAgIHggPSBmdW5jKCphcmdzKQorICAgICAgICB0b3RhbCArPSB4CisgICAgICAgIHNxc3VtID0gc3FzdW0gKyB4KngKKyAgICAgICAgc21hbGxlc3QgPSBtaW4oeCwgc21hbGxlc3QpCisgICAgICAgIGxhcmdlc3QgPSBtYXgoeCwgbGFyZ2VzdCkKKyAgICB0MSA9IHRpbWUudGltZSgpCisgICAgcHJpbnQgcm91bmQodDEtdDAsIDMpLCAnc2VjLCcsCisgICAgYXZnID0gdG90YWwvbgorICAgIHN0ZGRldiA9IF9zcXJ0KHNxc3VtL24gLSBhdmcqYXZnKQorICAgIHByaW50ICdhdmcgJWcsIHN0ZGRldiAlZywgbWluICVnLCBtYXggJWcnICUgXAorICAgICAgICAgICAgICAoYXZnLCBzdGRkZXYsIHNtYWxsZXN0LCBsYXJnZXN0KQorCisKK2RlZiBfdGVzdChOPTIwMDApOgorICAgIF90ZXN0X2dlbmVyYXRvcihOLCByYW5kb20sICgpKQorICAgIF90ZXN0X2dlbmVyYXRvcihOLCBub3JtYWx2YXJpYXRlLCAoMC4wLCAxLjApKQorICAgIF90ZXN0X2dlbmVyYXRvcihOLCBsb2dub3JtdmFyaWF0ZSwgKDAuMCwgMS4wKSkKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgdm9ubWlzZXN2YXJpYXRlLCAoMC4wLCAxLjApKQorICAgIF90ZXN0X2dlbmVyYXRvcihOLCBnYW1tYXZhcmlhdGUsICgwLjAxLCAxLjApKQorICAgIF90ZXN0X2dlbmVyYXRvcihOLCBnYW1tYXZhcmlhdGUsICgwLjEsIDEuMCkpCisgICAgX3Rlc3RfZ2VuZXJhdG9yKE4sIGdhbW1hdmFyaWF0ZSwgKDAuMSwgMi4wKSkKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgZ2FtbWF2YXJpYXRlLCAoMC41LCAxLjApKQorICAgIF90ZXN0X2dlbmVyYXRvcihOLCBnYW1tYXZhcmlhdGUsICgwLjksIDEuMCkpCisgICAgX3Rlc3RfZ2VuZXJhdG9yKE4sIGdhbW1hdmFyaWF0ZSwgKDEuMCwgMS4wKSkKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgZ2FtbWF2YXJpYXRlLCAoMi4wLCAxLjApKQorICAgIF90ZXN0X2dlbmVyYXRvcihOLCBnYW1tYXZhcmlhdGUsICgyMC4wLCAxLjApKQorICAgIF90ZXN0X2dlbmVyYXRvcihOLCBnYW1tYXZhcmlhdGUsICgyMDAuMCwgMS4wKSkKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgZ2F1c3MsICgwLjAsIDEuMCkpCisgICAgX3Rlc3RfZ2VuZXJhdG9yKE4sIGJldGF2YXJpYXRlLCAoMy4wLCAzLjApKQorICAgIF90ZXN0X2dlbmVyYXRvcihOLCB0cmlhbmd1bGFyLCAoMC4wLCAxLjAsIDEuMC8zLjApKQorCisjIENyZWF0ZSBvbmUgaW5zdGFuY2UsIHNlZWRlZCBmcm9tIGN1cnJlbnQgdGltZSwgYW5kIGV4cG9ydCBpdHMgbWV0aG9kcworIyBhcyBtb2R1bGUtbGV2ZWwgZnVuY3Rpb25zLiAgVGhlIGZ1bmN0aW9ucyBzaGFyZSBzdGF0ZSBhY3Jvc3MgYWxsIHVzZXMKKyMoYm90aCBpbiB0aGUgdXNlcidzIGNvZGUgYW5kIGluIHRoZSBQeXRob24gbGlicmFyaWVzKSwgYnV0IHRoYXQncyBmaW5lCisjIGZvciBtb3N0IHByb2dyYW1zIGFuZCBpcyBlYXNpZXIgZm9yIHRoZSBjYXN1YWwgdXNlciB0aGFuIG1ha2luZyB0aGVtCisjIGluc3RhbnRpYXRlIHRoZWlyIG93biBSYW5kb20oKSBpbnN0YW5jZS4KKworX2luc3QgPSBSYW5kb20oKQorc2VlZCA9IF9pbnN0LnNlZWQKK3JhbmRvbSA9IF9pbnN0LnJhbmRvbQordW5pZm9ybSA9IF9pbnN0LnVuaWZvcm0KK3RyaWFuZ3VsYXIgPSBfaW5zdC50cmlhbmd1bGFyCityYW5kaW50ID0gX2luc3QucmFuZGludAorY2hvaWNlID0gX2luc3QuY2hvaWNlCityYW5kcmFuZ2UgPSBfaW5zdC5yYW5kcmFuZ2UKK3NhbXBsZSA9IF9pbnN0LnNhbXBsZQorc2h1ZmZsZSA9IF9pbnN0LnNodWZmbGUKK25vcm1hbHZhcmlhdGUgPSBfaW5zdC5ub3JtYWx2YXJpYXRlCitsb2dub3JtdmFyaWF0ZSA9IF9pbnN0LmxvZ25vcm12YXJpYXRlCitleHBvdmFyaWF0ZSA9IF9pbnN0LmV4cG92YXJpYXRlCit2b25taXNlc3ZhcmlhdGUgPSBfaW5zdC52b25taXNlc3ZhcmlhdGUKK2dhbW1hdmFyaWF0ZSA9IF9pbnN0LmdhbW1hdmFyaWF0ZQorZ2F1c3MgPSBfaW5zdC5nYXVzcworYmV0YXZhcmlhdGUgPSBfaW5zdC5iZXRhdmFyaWF0ZQorcGFyZXRvdmFyaWF0ZSA9IF9pbnN0LnBhcmV0b3ZhcmlhdGUKK3dlaWJ1bGx2YXJpYXRlID0gX2luc3Qud2VpYnVsbHZhcmlhdGUKK2dldHN0YXRlID0gX2luc3QuZ2V0c3RhdGUKK3NldHN0YXRlID0gX2luc3Quc2V0c3RhdGUKK2p1bXBhaGVhZCA9IF9pbnN0Lmp1bXBhaGVhZAorZ2V0cmFuZGJpdHMgPSBfaW5zdC5nZXRyYW5kYml0cworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmFuZG9tLnB5YyBiL2xpYi9weXRob24yLjcvcmFuZG9tLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDI3M2FkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yYW5kb20ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmFuZG9tLnB5byBiL2xpYi9weXRob24yLjcvcmFuZG9tLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDI3M2FkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yYW5kb20ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmUucHkgYi9saWIvcHl0aG9uMi43L3JlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYjVkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3JlLnB5CkBAIC0wLDAgKzEsMzI0IEBACisjCisjIFNlY3JldCBMYWJzJyBSZWd1bGFyIEV4cHJlc3Npb24gRW5naW5lCisjCisjIHJlLWNvbXBhdGlibGUgaW50ZXJmYWNlIGZvciB0aGUgc3JlIG1hdGNoaW5nIGVuZ2luZQorIworIyBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBieSBTZWNyZXQgTGFicyBBQi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgdmVyc2lvbiBvZiB0aGUgU1JFIGxpYnJhcnkgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgQ05SSSdzCisjIFB5dGhvbiAxLjYgbGljZW5zZS4gIEZvciBhbnkgb3RoZXIgdXNlLCBwbGVhc2UgY29udGFjdCBTZWNyZXQgTGFicworIyBBQiAoaW5mb0BweXRob253YXJlLmNvbSkuCisjCisjIFBvcnRpb25zIG9mIHRoaXMgZW5naW5lIGhhdmUgYmVlbiBkZXZlbG9wZWQgaW4gY29vcGVyYXRpb24gd2l0aAorIyBDTlJJLiAgSGV3bGV0dC1QYWNrYXJkIHByb3ZpZGVkIGZ1bmRpbmcgZm9yIDEuNiBpbnRlZ3JhdGlvbiBhbmQKKyMgb3RoZXIgY29tcGF0aWJpbGl0eSB3b3JrLgorIworCityIiIiU3VwcG9ydCBmb3IgcmVndWxhciBleHByZXNzaW9ucyAoUkUpLgorCitUaGlzIG1vZHVsZSBwcm92aWRlcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgb3BlcmF0aW9ucyBzaW1pbGFyIHRvCit0aG9zZSBmb3VuZCBpbiBQZXJsLiAgSXQgc3VwcG9ydHMgYm90aCA4LWJpdCBhbmQgVW5pY29kZSBzdHJpbmdzOyBib3RoCit0aGUgcGF0dGVybiBhbmQgdGhlIHN0cmluZ3MgYmVpbmcgcHJvY2Vzc2VkIGNhbiBjb250YWluIG51bGwgYnl0ZXMgYW5kCitjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIFVTIEFTQ0lJIHJhbmdlLgorCitSZWd1bGFyIGV4cHJlc3Npb25zIGNhbiBjb250YWluIGJvdGggc3BlY2lhbCBhbmQgb3JkaW5hcnkgY2hhcmFjdGVycy4KK01vc3Qgb3JkaW5hcnkgY2hhcmFjdGVycywgbGlrZSAiQSIsICJhIiwgb3IgIjAiLCBhcmUgdGhlIHNpbXBsZXN0CityZWd1bGFyIGV4cHJlc3Npb25zOyB0aGV5IHNpbXBseSBtYXRjaCB0aGVtc2VsdmVzLiAgWW91IGNhbgorY29uY2F0ZW5hdGUgb3JkaW5hcnkgY2hhcmFjdGVycywgc28gbGFzdCBtYXRjaGVzIHRoZSBzdHJpbmcgJ2xhc3QnLgorCitUaGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZToKKyAgICAiLiIgICAgICBNYXRjaGVzIGFueSBjaGFyYWN0ZXIgZXhjZXB0IGEgbmV3bGluZS4KKyAgICAiXiIgICAgICBNYXRjaGVzIHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLgorICAgICIkIiAgICAgIE1hdGNoZXMgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIG9yIGp1c3QgYmVmb3JlIHRoZSBuZXdsaW5lIGF0CisgICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICAgICIqIiAgICAgIE1hdGNoZXMgMCBvciBtb3JlIChncmVlZHkpIHJlcGV0aXRpb25zIG9mIHRoZSBwcmVjZWRpbmcgUkUuCisgICAgICAgICAgICAgR3JlZWR5IG1lYW5zIHRoYXQgaXQgd2lsbCBtYXRjaCBhcyBtYW55IHJlcGV0aXRpb25zIGFzIHBvc3NpYmxlLgorICAgICIrIiAgICAgIE1hdGNoZXMgMSBvciBtb3JlIChncmVlZHkpIHJlcGV0aXRpb25zIG9mIHRoZSBwcmVjZWRpbmcgUkUuCisgICAgIj8iICAgICAgTWF0Y2hlcyAwIG9yIDEgKGdyZWVkeSkgb2YgdGhlIHByZWNlZGluZyBSRS4KKyAgICAqPywrPyw/PyBOb24tZ3JlZWR5IHZlcnNpb25zIG9mIHRoZSBwcmV2aW91cyB0aHJlZSBzcGVjaWFsIGNoYXJhY3RlcnMuCisgICAge20sbn0gICAgTWF0Y2hlcyBmcm9tIG0gdG8gbiByZXBldGl0aW9ucyBvZiB0aGUgcHJlY2VkaW5nIFJFLgorICAgIHttLG59PyAgIE5vbi1ncmVlZHkgdmVyc2lvbiBvZiB0aGUgYWJvdmUuCisgICAgIlxcIiAgICAgRWl0aGVyIGVzY2FwZXMgc3BlY2lhbCBjaGFyYWN0ZXJzIG9yIHNpZ25hbHMgYSBzcGVjaWFsIHNlcXVlbmNlLgorICAgIFtdICAgICAgIEluZGljYXRlcyBhIHNldCBvZiBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgIEEgIl4iIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW5kaWNhdGVzIGEgY29tcGxlbWVudGluZyBzZXQuCisgICAgInwiICAgICAgQXxCLCBjcmVhdGVzIGFuIFJFIHRoYXQgd2lsbCBtYXRjaCBlaXRoZXIgQSBvciBCLgorICAgICguLi4pICAgIE1hdGNoZXMgdGhlIFJFIGluc2lkZSB0aGUgcGFyZW50aGVzZXMuCisgICAgICAgICAgICAgVGhlIGNvbnRlbnRzIGNhbiBiZSByZXRyaWV2ZWQgb3IgbWF0Y2hlZCBsYXRlciBpbiB0aGUgc3RyaW5nLgorICAgICg/aUxtc3V4KSBTZXQgdGhlIEksIEwsIE0sIFMsIFUsIG9yIFggZmxhZyBmb3IgdGhlIFJFIChzZWUgYmVsb3cpLgorICAgICg/Oi4uLikgIE5vbi1ncm91cGluZyB2ZXJzaW9uIG9mIHJlZ3VsYXIgcGFyZW50aGVzZXMuCisgICAgKD9QPG5hbWU+Li4uKSBUaGUgc3Vic3RyaW5nIG1hdGNoZWQgYnkgdGhlIGdyb3VwIGlzIGFjY2Vzc2libGUgYnkgbmFtZS4KKyAgICAoP1A9bmFtZSkgICAgIE1hdGNoZXMgdGhlIHRleHQgbWF0Y2hlZCBlYXJsaWVyIGJ5IHRoZSBncm91cCBuYW1lZCBuYW1lLgorICAgICg/Iy4uLikgIEEgY29tbWVudDsgaWdub3JlZC4KKyAgICAoPz0uLi4pICBNYXRjaGVzIGlmIC4uLiBtYXRjaGVzIG5leHQsIGJ1dCBkb2Vzbid0IGNvbnN1bWUgdGhlIHN0cmluZy4KKyAgICAoPyEuLi4pICBNYXRjaGVzIGlmIC4uLiBkb2Vzbid0IG1hdGNoIG5leHQuCisgICAgKD88PS4uLikgTWF0Y2hlcyBpZiBwcmVjZWRlZCBieSAuLi4gKG11c3QgYmUgZml4ZWQgbGVuZ3RoKS4KKyAgICAoPzwhLi4uKSBNYXRjaGVzIGlmIG5vdCBwcmVjZWRlZCBieSAuLi4gKG11c3QgYmUgZml4ZWQgbGVuZ3RoKS4KKyAgICAoPyhpZC9uYW1lKXllc3xubykgTWF0Y2hlcyB5ZXMgcGF0dGVybiBpZiB0aGUgZ3JvdXAgd2l0aCBpZC9uYW1lIG1hdGNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgIHRoZSAob3B0aW9uYWwpIG5vIHBhdHRlcm4gb3RoZXJ3aXNlLgorCitUaGUgc3BlY2lhbCBzZXF1ZW5jZXMgY29uc2lzdCBvZiAiXFwiIGFuZCBhIGNoYXJhY3RlciBmcm9tIHRoZSBsaXN0CitiZWxvdy4gIElmIHRoZSBvcmRpbmFyeSBjaGFyYWN0ZXIgaXMgbm90IG9uIHRoZSBsaXN0LCB0aGVuIHRoZQorcmVzdWx0aW5nIFJFIHdpbGwgbWF0Y2ggdGhlIHNlY29uZCBjaGFyYWN0ZXIuCisgICAgXG51bWJlciAgTWF0Y2hlcyB0aGUgY29udGVudHMgb2YgdGhlIGdyb3VwIG9mIHRoZSBzYW1lIG51bWJlci4KKyAgICBcQSAgICAgICBNYXRjaGVzIG9ubHkgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcuCisgICAgXFogICAgICAgTWF0Y2hlcyBvbmx5IGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgICBcYiAgICAgICBNYXRjaGVzIHRoZSBlbXB0eSBzdHJpbmcsIGJ1dCBvbmx5IGF0IHRoZSBzdGFydCBvciBlbmQgb2YgYSB3b3JkLgorICAgIFxCICAgICAgIE1hdGNoZXMgdGhlIGVtcHR5IHN0cmluZywgYnV0IG5vdCBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgd29yZC4KKyAgICBcZCAgICAgICBNYXRjaGVzIGFueSBkZWNpbWFsIGRpZ2l0OyBlcXVpdmFsZW50IHRvIHRoZSBzZXQgWzAtOV0uCisgICAgXEQgICAgICAgTWF0Y2hlcyBhbnkgbm9uLWRpZ2l0IGNoYXJhY3RlcjsgZXF1aXZhbGVudCB0byB0aGUgc2V0IFteMC05XS4KKyAgICBccyAgICAgICBNYXRjaGVzIGFueSB3aGl0ZXNwYWNlIGNoYXJhY3RlcjsgZXF1aXZhbGVudCB0byBbIFx0XG5cclxmXHZdLgorICAgIFxTICAgICAgIE1hdGNoZXMgYW55IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcjsgZXF1aXYuIHRvIFteIFx0XG5cclxmXHZdLgorICAgIFx3ICAgICAgIE1hdGNoZXMgYW55IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXI7IGVxdWl2YWxlbnQgdG8gW2EtekEtWjAtOV9dLgorICAgICAgICAgICAgIFdpdGggTE9DQUxFLCBpdCB3aWxsIG1hdGNoIHRoZSBzZXQgWzAtOV9dIHBsdXMgY2hhcmFjdGVycyBkZWZpbmVkCisgICAgICAgICAgICAgYXMgbGV0dGVycyBmb3IgdGhlIGN1cnJlbnQgbG9jYWxlLgorICAgIFxXICAgICAgIE1hdGNoZXMgdGhlIGNvbXBsZW1lbnQgb2YgXHcuCisgICAgXFwgICAgICAgTWF0Y2hlcyBhIGxpdGVyYWwgYmFja3NsYXNoLgorCitUaGlzIG1vZHVsZSBleHBvcnRzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgorICAgIG1hdGNoICAgIE1hdGNoIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gdGhlIGJlZ2lubmluZyBvZiBhIHN0cmluZy4KKyAgICBzZWFyY2ggICBTZWFyY2ggYSBzdHJpbmcgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIHBhdHRlcm4uCisgICAgc3ViICAgICAgU3Vic3RpdHV0ZSBvY2N1cnJlbmNlcyBvZiBhIHBhdHRlcm4gZm91bmQgaW4gYSBzdHJpbmcuCisgICAgc3VibiAgICAgU2FtZSBhcyBzdWIsIGJ1dCBhbHNvIHJldHVybiB0aGUgbnVtYmVyIG9mIHN1YnN0aXR1dGlvbnMgbWFkZS4KKyAgICBzcGxpdCAgICBTcGxpdCBhIHN0cmluZyBieSB0aGUgb2NjdXJyZW5jZXMgb2YgYSBwYXR0ZXJuLgorICAgIGZpbmRhbGwgIEZpbmQgYWxsIG9jY3VycmVuY2VzIG9mIGEgcGF0dGVybiBpbiBhIHN0cmluZy4KKyAgICBmaW5kaXRlciBSZXR1cm4gYW4gaXRlcmF0b3IgeWllbGRpbmcgYSBtYXRjaCBvYmplY3QgZm9yIGVhY2ggbWF0Y2guCisgICAgY29tcGlsZSAgQ29tcGlsZSBhIHBhdHRlcm4gaW50byBhIFJlZ2V4T2JqZWN0LgorICAgIHB1cmdlICAgIENsZWFyIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gY2FjaGUuCisgICAgZXNjYXBlICAgQmFja3NsYXNoIGFsbCBub24tYWxwaGFudW1lcmljcyBpbiBhIHN0cmluZy4KKworU29tZSBvZiB0aGUgZnVuY3Rpb25zIGluIHRoaXMgbW9kdWxlIHRha2VzIGZsYWdzIGFzIG9wdGlvbmFsIHBhcmFtZXRlcnM6CisgICAgSSAgSUdOT1JFQ0FTRSAgUGVyZm9ybSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoaW5nLgorICAgIEwgIExPQ0FMRSAgICAgIE1ha2UgXHcsIFxXLCBcYiwgXEIsIGRlcGVuZGVudCBvbiB0aGUgY3VycmVudCBsb2NhbGUuCisgICAgTSAgTVVMVElMSU5FICAgIl4iIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBsaW5lcyAoYWZ0ZXIgYSBuZXdsaW5lKQorICAgICAgICAgICAgICAgICAgIGFzIHdlbGwgYXMgdGhlIHN0cmluZy4KKyAgICAgICAgICAgICAgICAgICAiJCIgbWF0Y2hlcyB0aGUgZW5kIG9mIGxpbmVzIChiZWZvcmUgYSBuZXdsaW5lKSBhcyB3ZWxsCisgICAgICAgICAgICAgICAgICAgYXMgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgorICAgIFMgIERPVEFMTCAgICAgICIuIiBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgYXQgYWxsLCBpbmNsdWRpbmcgdGhlIG5ld2xpbmUuCisgICAgWCAgVkVSQk9TRSAgICAgSWdub3JlIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIGZvciBuaWNlciBsb29raW5nIFJFJ3MuCisgICAgVSAgVU5JQ09ERSAgICAgTWFrZSBcdywgXFcsIFxiLCBcQiwgZGVwZW5kZW50IG9uIHRoZSBVbmljb2RlIGxvY2FsZS4KKworVGhpcyBtb2R1bGUgYWxzbyBkZWZpbmVzIGFuIGV4Y2VwdGlvbiAnZXJyb3InLgorCisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IHNyZV9jb21waWxlCitpbXBvcnQgc3JlX3BhcnNlCisKKyMgcHVibGljIHN5bWJvbHMKK19fYWxsX18gPSBbICJtYXRjaCIsICJzZWFyY2giLCAic3ViIiwgInN1Ym4iLCAic3BsaXQiLCAiZmluZGFsbCIsCisgICAgImNvbXBpbGUiLCAicHVyZ2UiLCAidGVtcGxhdGUiLCAiZXNjYXBlIiwgIkkiLCAiTCIsICJNIiwgIlMiLCAiWCIsCisgICAgIlUiLCAiSUdOT1JFQ0FTRSIsICJMT0NBTEUiLCAiTVVMVElMSU5FIiwgIkRPVEFMTCIsICJWRVJCT1NFIiwKKyAgICAiVU5JQ09ERSIsICJlcnJvciIgXQorCitfX3ZlcnNpb25fXyA9ICIyLjIuMSIKKworIyBmbGFncworSSA9IElHTk9SRUNBU0UgPSBzcmVfY29tcGlsZS5TUkVfRkxBR19JR05PUkVDQVNFICMgaWdub3JlIGNhc2UKK0wgPSBMT0NBTEUgPSBzcmVfY29tcGlsZS5TUkVfRkxBR19MT0NBTEUgIyBhc3N1bWUgY3VycmVudCA4LWJpdCBsb2NhbGUKK1UgPSBVTklDT0RFID0gc3JlX2NvbXBpbGUuU1JFX0ZMQUdfVU5JQ09ERSAjIGFzc3VtZSB1bmljb2RlIGxvY2FsZQorTSA9IE1VTFRJTElORSA9IHNyZV9jb21waWxlLlNSRV9GTEFHX01VTFRJTElORSAjIG1ha2UgYW5jaG9ycyBsb29rIGZvciBuZXdsaW5lCitTID0gRE9UQUxMID0gc3JlX2NvbXBpbGUuU1JFX0ZMQUdfRE9UQUxMICMgbWFrZSBkb3QgbWF0Y2ggbmV3bGluZQorWCA9IFZFUkJPU0UgPSBzcmVfY29tcGlsZS5TUkVfRkxBR19WRVJCT1NFICMgaWdub3JlIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzCisKKyMgc3JlIGV4dGVuc2lvbnMgKGV4cGVyaW1lbnRhbCwgZG9uJ3QgcmVseSBvbiB0aGVzZSkKK1QgPSBURU1QTEFURSA9IHNyZV9jb21waWxlLlNSRV9GTEFHX1RFTVBMQVRFICMgZGlzYWJsZSBiYWNrdHJhY2tpbmcKK0RFQlVHID0gc3JlX2NvbXBpbGUuU1JFX0ZMQUdfREVCVUcgIyBkdW1wIHBhdHRlcm4gYWZ0ZXIgY29tcGlsYXRpb24KKworIyBzcmUgZXhjZXB0aW9uCitlcnJvciA9IHNyZV9jb21waWxlLmVycm9yCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcHVibGljIGludGVyZmFjZQorCitkZWYgbWF0Y2gocGF0dGVybiwgc3RyaW5nLCBmbGFncz0wKToKKyAgICAiIiJUcnkgdG8gYXBwbHkgdGhlIHBhdHRlcm4gYXQgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcsIHJldHVybmluZworICAgIGEgbWF0Y2ggb2JqZWN0LCBvciBOb25lIGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4iIiIKKyAgICByZXR1cm4gX2NvbXBpbGUocGF0dGVybiwgZmxhZ3MpLm1hdGNoKHN0cmluZykKKworZGVmIHNlYXJjaChwYXR0ZXJuLCBzdHJpbmcsIGZsYWdzPTApOgorICAgICIiIlNjYW4gdGhyb3VnaCBzdHJpbmcgbG9va2luZyBmb3IgYSBtYXRjaCB0byB0aGUgcGF0dGVybiwgcmV0dXJuaW5nCisgICAgYSBtYXRjaCBvYmplY3QsIG9yIE5vbmUgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLiIiIgorICAgIHJldHVybiBfY29tcGlsZShwYXR0ZXJuLCBmbGFncykuc2VhcmNoKHN0cmluZykKKworZGVmIHN1YihwYXR0ZXJuLCByZXBsLCBzdHJpbmcsIGNvdW50PTAsIGZsYWdzPTApOgorICAgICIiIlJldHVybiB0aGUgc3RyaW5nIG9idGFpbmVkIGJ5IHJlcGxhY2luZyB0aGUgbGVmdG1vc3QKKyAgICBub24tb3ZlcmxhcHBpbmcgb2NjdXJyZW5jZXMgb2YgdGhlIHBhdHRlcm4gaW4gc3RyaW5nIGJ5IHRoZQorICAgIHJlcGxhY2VtZW50IHJlcGwuICByZXBsIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYSBjYWxsYWJsZTsKKyAgICBpZiBhIHN0cmluZywgYmFja3NsYXNoIGVzY2FwZXMgaW4gaXQgYXJlIHByb2Nlc3NlZC4gIElmIGl0IGlzCisgICAgYSBjYWxsYWJsZSwgaXQncyBwYXNzZWQgdGhlIG1hdGNoIG9iamVjdCBhbmQgbXVzdCByZXR1cm4KKyAgICBhIHJlcGxhY2VtZW50IHN0cmluZyB0byBiZSB1c2VkLiIiIgorICAgIHJldHVybiBfY29tcGlsZShwYXR0ZXJuLCBmbGFncykuc3ViKHJlcGwsIHN0cmluZywgY291bnQpCisKK2RlZiBzdWJuKHBhdHRlcm4sIHJlcGwsIHN0cmluZywgY291bnQ9MCwgZmxhZ3M9MCk6CisgICAgIiIiUmV0dXJuIGEgMi10dXBsZSBjb250YWluaW5nIChuZXdfc3RyaW5nLCBudW1iZXIpLgorICAgIG5ld19zdHJpbmcgaXMgdGhlIHN0cmluZyBvYnRhaW5lZCBieSByZXBsYWNpbmcgdGhlIGxlZnRtb3N0CisgICAgbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHRoZSBwYXR0ZXJuIGluIHRoZSBzb3VyY2UKKyAgICBzdHJpbmcgYnkgdGhlIHJlcGxhY2VtZW50IHJlcGwuICBudW1iZXIgaXMgdGhlIG51bWJlciBvZgorICAgIHN1YnN0aXR1dGlvbnMgdGhhdCB3ZXJlIG1hZGUuIHJlcGwgY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBhCisgICAgY2FsbGFibGU7IGlmIGEgc3RyaW5nLCBiYWNrc2xhc2ggZXNjYXBlcyBpbiBpdCBhcmUgcHJvY2Vzc2VkLgorICAgIElmIGl0IGlzIGEgY2FsbGFibGUsIGl0J3MgcGFzc2VkIHRoZSBtYXRjaCBvYmplY3QgYW5kIG11c3QKKyAgICByZXR1cm4gYSByZXBsYWNlbWVudCBzdHJpbmcgdG8gYmUgdXNlZC4iIiIKKyAgICByZXR1cm4gX2NvbXBpbGUocGF0dGVybiwgZmxhZ3MpLnN1Ym4ocmVwbCwgc3RyaW5nLCBjb3VudCkKKworZGVmIHNwbGl0KHBhdHRlcm4sIHN0cmluZywgbWF4c3BsaXQ9MCwgZmxhZ3M9MCk6CisgICAgIiIiU3BsaXQgdGhlIHNvdXJjZSBzdHJpbmcgYnkgdGhlIG9jY3VycmVuY2VzIG9mIHRoZSBwYXR0ZXJuLAorICAgIHJldHVybmluZyBhIGxpc3QgY29udGFpbmluZyB0aGUgcmVzdWx0aW5nIHN1YnN0cmluZ3MuIiIiCisgICAgcmV0dXJuIF9jb21waWxlKHBhdHRlcm4sIGZsYWdzKS5zcGxpdChzdHJpbmcsIG1heHNwbGl0KQorCitkZWYgZmluZGFsbChwYXR0ZXJuLCBzdHJpbmcsIGZsYWdzPTApOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIG5vbi1vdmVybGFwcGluZyBtYXRjaGVzIGluIHRoZSBzdHJpbmcuCisKKyAgICBJZiBvbmUgb3IgbW9yZSBncm91cHMgYXJlIHByZXNlbnQgaW4gdGhlIHBhdHRlcm4sIHJldHVybiBhCisgICAgbGlzdCBvZiBncm91cHM7IHRoaXMgd2lsbCBiZSBhIGxpc3Qgb2YgdHVwbGVzIGlmIHRoZSBwYXR0ZXJuCisgICAgaGFzIG1vcmUgdGhhbiBvbmUgZ3JvdXAuCisKKyAgICBFbXB0eSBtYXRjaGVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0LiIiIgorICAgIHJldHVybiBfY29tcGlsZShwYXR0ZXJuLCBmbGFncykuZmluZGFsbChzdHJpbmcpCisKK2lmIHN5cy5oZXh2ZXJzaW9uID49IDB4MDIwMjAwMDA6CisgICAgX19hbGxfXy5hcHBlbmQoImZpbmRpdGVyIikKKyAgICBkZWYgZmluZGl0ZXIocGF0dGVybiwgc3RyaW5nLCBmbGFncz0wKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIG5vbi1vdmVybGFwcGluZyBtYXRjaGVzIGluIHRoZQorICAgICAgICBzdHJpbmcuICBGb3IgZWFjaCBtYXRjaCwgdGhlIGl0ZXJhdG9yIHJldHVybnMgYSBtYXRjaCBvYmplY3QuCisKKyAgICAgICAgRW1wdHkgbWF0Y2hlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC4iIiIKKyAgICAgICAgcmV0dXJuIF9jb21waWxlKHBhdHRlcm4sIGZsYWdzKS5maW5kaXRlcihzdHJpbmcpCisKK2RlZiBjb21waWxlKHBhdHRlcm4sIGZsYWdzPTApOgorICAgICJDb21waWxlIGEgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4sIHJldHVybmluZyBhIHBhdHRlcm4gb2JqZWN0LiIKKyAgICByZXR1cm4gX2NvbXBpbGUocGF0dGVybiwgZmxhZ3MpCisKK2RlZiBwdXJnZSgpOgorICAgICJDbGVhciB0aGUgcmVndWxhciBleHByZXNzaW9uIGNhY2hlIgorICAgIF9jYWNoZS5jbGVhcigpCisgICAgX2NhY2hlX3JlcGwuY2xlYXIoKQorCitkZWYgdGVtcGxhdGUocGF0dGVybiwgZmxhZ3M9MCk6CisgICAgIkNvbXBpbGUgYSB0ZW1wbGF0ZSBwYXR0ZXJuLCByZXR1cm5pbmcgYSBwYXR0ZXJuIG9iamVjdCIKKyAgICByZXR1cm4gX2NvbXBpbGUocGF0dGVybiwgZmxhZ3N8VCkKKworX2FscGhhbnVtID0gZnJvemVuc2V0KAorICAgICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSIpCisKK2RlZiBlc2NhcGUocGF0dGVybik6CisgICAgIkVzY2FwZSBhbGwgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGluIHBhdHRlcm4uIgorICAgIHMgPSBsaXN0KHBhdHRlcm4pCisgICAgYWxwaGFudW0gPSBfYWxwaGFudW0KKyAgICBmb3IgaSwgYyBpbiBlbnVtZXJhdGUocGF0dGVybik6CisgICAgICAgIGlmIGMgbm90IGluIGFscGhhbnVtOgorICAgICAgICAgICAgaWYgYyA9PSAiXDAwMCI6CisgICAgICAgICAgICAgICAgc1tpXSA9ICJcXDAwMCIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc1tpXSA9ICJcXCIgKyBjCisgICAgcmV0dXJuIHBhdHRlcm5bOjBdLmpvaW4ocykKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbnRlcm5hbHMKKworX2NhY2hlID0ge30KK19jYWNoZV9yZXBsID0ge30KKworX3BhdHRlcm5fdHlwZSA9IHR5cGUoc3JlX2NvbXBpbGUuY29tcGlsZSgiIiwgMCkpCisKK19NQVhDQUNIRSA9IDEwMAorCitkZWYgX2NvbXBpbGUoKmtleSk6CisgICAgIyBpbnRlcm5hbDogY29tcGlsZSBwYXR0ZXJuCisgICAgY2FjaGVrZXkgPSAodHlwZShrZXlbMF0pLCkgKyBrZXkKKyAgICBwID0gX2NhY2hlLmdldChjYWNoZWtleSkKKyAgICBpZiBwIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gcAorICAgIHBhdHRlcm4sIGZsYWdzID0ga2V5CisgICAgaWYgaXNpbnN0YW5jZShwYXR0ZXJuLCBfcGF0dGVybl90eXBlKToKKyAgICAgICAgaWYgZmxhZ3M6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdDYW5ub3QgcHJvY2VzcyBmbGFncyBhcmd1bWVudCB3aXRoIGEgY29tcGlsZWQgcGF0dGVybicpCisgICAgICAgIHJldHVybiBwYXR0ZXJuCisgICAgaWYgbm90IHNyZV9jb21waWxlLmlzc3RyaW5nKHBhdHRlcm4pOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJmaXJzdCBhcmd1bWVudCBtdXN0IGJlIHN0cmluZyBvciBjb21waWxlZCBwYXR0ZXJuIgorICAgIHRyeToKKyAgICAgICAgcCA9IHNyZV9jb21waWxlLmNvbXBpbGUocGF0dGVybiwgZmxhZ3MpCisgICAgZXhjZXB0IGVycm9yLCB2OgorICAgICAgICByYWlzZSBlcnJvciwgdiAjIGludmFsaWQgZXhwcmVzc2lvbgorICAgIGlmIGxlbihfY2FjaGUpID49IF9NQVhDQUNIRToKKyAgICAgICAgX2NhY2hlLmNsZWFyKCkKKyAgICBfY2FjaGVbY2FjaGVrZXldID0gcAorICAgIHJldHVybiBwCisKK2RlZiBfY29tcGlsZV9yZXBsKCprZXkpOgorICAgICMgaW50ZXJuYWw6IGNvbXBpbGUgcmVwbGFjZW1lbnQgcGF0dGVybgorICAgIHAgPSBfY2FjaGVfcmVwbC5nZXQoa2V5KQorICAgIGlmIHAgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBwCisgICAgcmVwbCwgcGF0dGVybiA9IGtleQorICAgIHRyeToKKyAgICAgICAgcCA9IHNyZV9wYXJzZS5wYXJzZV90ZW1wbGF0ZShyZXBsLCBwYXR0ZXJuKQorICAgIGV4Y2VwdCBlcnJvciwgdjoKKyAgICAgICAgcmFpc2UgZXJyb3IsIHYgIyBpbnZhbGlkIGV4cHJlc3Npb24KKyAgICBpZiBsZW4oX2NhY2hlX3JlcGwpID49IF9NQVhDQUNIRToKKyAgICAgICAgX2NhY2hlX3JlcGwuY2xlYXIoKQorICAgIF9jYWNoZV9yZXBsW2tleV0gPSBwCisgICAgcmV0dXJuIHAKKworZGVmIF9leHBhbmQocGF0dGVybiwgbWF0Y2gsIHRlbXBsYXRlKToKKyAgICAjIGludGVybmFsOiBtYXRjaC5leHBhbmQgaW1wbGVtZW50YXRpb24gaG9vaworICAgIHRlbXBsYXRlID0gc3JlX3BhcnNlLnBhcnNlX3RlbXBsYXRlKHRlbXBsYXRlLCBwYXR0ZXJuKQorICAgIHJldHVybiBzcmVfcGFyc2UuZXhwYW5kX3RlbXBsYXRlKHRlbXBsYXRlLCBtYXRjaCkKKworZGVmIF9zdWJ4KHBhdHRlcm4sIHRlbXBsYXRlKToKKyAgICAjIGludGVybmFsOiBwYXR0ZXJuLnN1Yi9zdWJuIGltcGxlbWVudGF0aW9uIGhlbHBlcgorICAgIHRlbXBsYXRlID0gX2NvbXBpbGVfcmVwbCh0ZW1wbGF0ZSwgcGF0dGVybikKKyAgICBpZiBub3QgdGVtcGxhdGVbMF0gYW5kIGxlbih0ZW1wbGF0ZVsxXSkgPT0gMToKKyAgICAgICAgIyBsaXRlcmFsIHJlcGxhY2VtZW50CisgICAgICAgIHJldHVybiB0ZW1wbGF0ZVsxXVswXQorICAgIGRlZiBmaWx0ZXIobWF0Y2gsIHRlbXBsYXRlPXRlbXBsYXRlKToKKyAgICAgICAgcmV0dXJuIHNyZV9wYXJzZS5leHBhbmRfdGVtcGxhdGUodGVtcGxhdGUsIG1hdGNoKQorICAgIHJldHVybiBmaWx0ZXIKKworIyByZWdpc3RlciBteXNlbGYgZm9yIHBpY2tsaW5nCisKK2ltcG9ydCBjb3B5X3JlZworCitkZWYgX3BpY2tsZShwKToKKyAgICByZXR1cm4gX2NvbXBpbGUsIChwLnBhdHRlcm4sIHAuZmxhZ3MpCisKK2NvcHlfcmVnLnBpY2tsZShfcGF0dGVybl90eXBlLCBfcGlja2xlLCBfY29tcGlsZSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBleHBlcmltZW50YWwgc3R1ZmYgKHNlZSBweXRob24tZGV2IGRpc2N1c3Npb25zIGZvciBkZXRhaWxzKQorCitjbGFzcyBTY2FubmVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZXhpY29uLCBmbGFncz0wKToKKyAgICAgICAgZnJvbSBzcmVfY29uc3RhbnRzIGltcG9ydCBCUkFOQ0gsIFNVQlBBVFRFUk4KKyAgICAgICAgc2VsZi5sZXhpY29uID0gbGV4aWNvbgorICAgICAgICAjIGNvbWJpbmUgcGhyYXNlcyBpbnRvIGEgY29tcG91bmQgcGF0dGVybgorICAgICAgICBwID0gW10KKyAgICAgICAgcyA9IHNyZV9wYXJzZS5QYXR0ZXJuKCkKKyAgICAgICAgcy5mbGFncyA9IGZsYWdzCisgICAgICAgIGZvciBwaHJhc2UsIGFjdGlvbiBpbiBsZXhpY29uOgorICAgICAgICAgICAgcC5hcHBlbmQoc3JlX3BhcnNlLlN1YlBhdHRlcm4ocywgWworICAgICAgICAgICAgICAgIChTVUJQQVRURVJOLCAobGVuKHApKzEsIHNyZV9wYXJzZS5wYXJzZShwaHJhc2UsIGZsYWdzKSkpLAorICAgICAgICAgICAgICAgIF0pKQorICAgICAgICBzLmdyb3VwcyA9IGxlbihwKSsxCisgICAgICAgIHAgPSBzcmVfcGFyc2UuU3ViUGF0dGVybihzLCBbKEJSQU5DSCwgKE5vbmUsIHApKV0pCisgICAgICAgIHNlbGYuc2Nhbm5lciA9IHNyZV9jb21waWxlLmNvbXBpbGUocCkKKyAgICBkZWYgc2NhbihzZWxmLCBzdHJpbmcpOgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBhcHBlbmQgPSByZXN1bHQuYXBwZW5kCisgICAgICAgIG1hdGNoID0gc2VsZi5zY2FubmVyLnNjYW5uZXIoc3RyaW5nKS5tYXRjaAorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbSA9IG1hdGNoKCkKKyAgICAgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBqID0gbS5lbmQoKQorICAgICAgICAgICAgaWYgaSA9PSBqOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBhY3Rpb24gPSBzZWxmLmxleGljb25bbS5sYXN0aW5kZXgtMV1bMV0KKyAgICAgICAgICAgIGlmIGhhc2F0dHIoYWN0aW9uLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgICAgICBzZWxmLm1hdGNoID0gbQorICAgICAgICAgICAgICAgIGFjdGlvbiA9IGFjdGlvbihzZWxmLCBtLmdyb3VwKCkpCisgICAgICAgICAgICBpZiBhY3Rpb24gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgYXBwZW5kKGFjdGlvbikKKyAgICAgICAgICAgIGkgPSBqCisgICAgICAgIHJldHVybiByZXN1bHQsIHN0cmluZ1tpOl0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmUucHljIGIvbGliL3B5dGhvbjIuNy9yZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4NWFiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmUucHlvIGIvbGliL3B5dGhvbjIuNy9yZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk4NWFiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmVwci5weSBiL2xpYi9weXRob24yLjcvcmVwci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI2Y2MzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yZXByLnB5CkBAIC0wLDAgKzEsMTMyIEBACisiIiJSZWRvIHRoZSBidWlsdGluIHJlcHIoKSAocmVwcmVzZW50YXRpb24pIGJ1dCB3aXRoIGxpbWl0cyBvbiBtb3N0IHNpemVzLiIiIgorCitfX2FsbF9fID0gWyJSZXByIiwicmVwciJdCisKK2ltcG9ydCBfX2J1aWx0aW5fXworZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlzbGljZQorCitjbGFzcyBSZXByOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm1heGxldmVsID0gNgorICAgICAgICBzZWxmLm1heHR1cGxlID0gNgorICAgICAgICBzZWxmLm1heGxpc3QgPSA2CisgICAgICAgIHNlbGYubWF4YXJyYXkgPSA1CisgICAgICAgIHNlbGYubWF4ZGljdCA9IDQKKyAgICAgICAgc2VsZi5tYXhzZXQgPSA2CisgICAgICAgIHNlbGYubWF4ZnJvemVuc2V0ID0gNgorICAgICAgICBzZWxmLm1heGRlcXVlID0gNgorICAgICAgICBzZWxmLm1heHN0cmluZyA9IDMwCisgICAgICAgIHNlbGYubWF4bG9uZyA9IDQwCisgICAgICAgIHNlbGYubWF4b3RoZXIgPSAyMAorCisgICAgZGVmIHJlcHIoc2VsZiwgeCk6CisgICAgICAgIHJldHVybiBzZWxmLnJlcHIxKHgsIHNlbGYubWF4bGV2ZWwpCisKKyAgICBkZWYgcmVwcjEoc2VsZiwgeCwgbGV2ZWwpOgorICAgICAgICB0eXBlbmFtZSA9IHR5cGUoeCkuX19uYW1lX18KKyAgICAgICAgaWYgJyAnIGluIHR5cGVuYW1lOgorICAgICAgICAgICAgcGFydHMgPSB0eXBlbmFtZS5zcGxpdCgpCisgICAgICAgICAgICB0eXBlbmFtZSA9ICdfJy5qb2luKHBhcnRzKQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdyZXByXycgKyB0eXBlbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCAncmVwcl8nICsgdHlwZW5hbWUpKHgsIGxldmVsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9IF9fYnVpbHRpbl9fLnJlcHIoeCkKKyAgICAgICAgICAgIGlmIGxlbihzKSA+IHNlbGYubWF4b3RoZXI6CisgICAgICAgICAgICAgICAgaSA9IG1heCgwLCAoc2VsZi5tYXhvdGhlci0zKS8vMikKKyAgICAgICAgICAgICAgICBqID0gbWF4KDAsIHNlbGYubWF4b3RoZXItMy1pKQorICAgICAgICAgICAgICAgIHMgPSBzWzppXSArICcuLi4nICsgc1tsZW4ocyktajpdCisgICAgICAgICAgICByZXR1cm4gcworCisgICAgZGVmIF9yZXByX2l0ZXJhYmxlKHNlbGYsIHgsIGxldmVsLCBsZWZ0LCByaWdodCwgbWF4aXRlciwgdHJhaWw9JycpOgorICAgICAgICBuID0gbGVuKHgpCisgICAgICAgIGlmIGxldmVsIDw9IDAgYW5kIG46CisgICAgICAgICAgICBzID0gJy4uLicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld2xldmVsID0gbGV2ZWwgLSAxCisgICAgICAgICAgICByZXByMSA9IHNlbGYucmVwcjEKKyAgICAgICAgICAgIHBpZWNlcyA9IFtyZXByMShlbGVtLCBuZXdsZXZlbCkgZm9yIGVsZW0gaW4gaXNsaWNlKHgsIG1heGl0ZXIpXQorICAgICAgICAgICAgaWYgbiA+IG1heGl0ZXI6ICBwaWVjZXMuYXBwZW5kKCcuLi4nKQorICAgICAgICAgICAgcyA9ICcsICcuam9pbihwaWVjZXMpCisgICAgICAgICAgICBpZiBuID09IDEgYW5kIHRyYWlsOiAgcmlnaHQgPSB0cmFpbCArIHJpZ2h0CisgICAgICAgIHJldHVybiAnJXMlcyVzJyAlIChsZWZ0LCBzLCByaWdodCkKKworICAgIGRlZiByZXByX3R1cGxlKHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlcHJfaXRlcmFibGUoeCwgbGV2ZWwsICcoJywgJyknLCBzZWxmLm1heHR1cGxlLCAnLCcpCisKKyAgICBkZWYgcmVwcl9saXN0KHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlcHJfaXRlcmFibGUoeCwgbGV2ZWwsICdbJywgJ10nLCBzZWxmLm1heGxpc3QpCisKKyAgICBkZWYgcmVwcl9hcnJheShzZWxmLCB4LCBsZXZlbCk6CisgICAgICAgIGhlYWRlciA9ICJhcnJheSgnJXMnLCBbIiAlIHgudHlwZWNvZGUKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlcHJfaXRlcmFibGUoeCwgbGV2ZWwsIGhlYWRlciwgJ10pJywgc2VsZi5tYXhhcnJheSkKKworICAgIGRlZiByZXByX3NldChzZWxmLCB4LCBsZXZlbCk6CisgICAgICAgIHggPSBfcG9zc2libHlfc29ydGVkKHgpCisgICAgICAgIHJldHVybiBzZWxmLl9yZXByX2l0ZXJhYmxlKHgsIGxldmVsLCAnc2V0KFsnLCAnXSknLCBzZWxmLm1heHNldCkKKworICAgIGRlZiByZXByX2Zyb3plbnNldChzZWxmLCB4LCBsZXZlbCk6CisgICAgICAgIHggPSBfcG9zc2libHlfc29ydGVkKHgpCisgICAgICAgIHJldHVybiBzZWxmLl9yZXByX2l0ZXJhYmxlKHgsIGxldmVsLCAnZnJvemVuc2V0KFsnLCAnXSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1heGZyb3plbnNldCkKKworICAgIGRlZiByZXByX2RlcXVlKHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlcHJfaXRlcmFibGUoeCwgbGV2ZWwsICdkZXF1ZShbJywgJ10pJywgc2VsZi5tYXhkZXF1ZSkKKworICAgIGRlZiByZXByX2RpY3Qoc2VsZiwgeCwgbGV2ZWwpOgorICAgICAgICBuID0gbGVuKHgpCisgICAgICAgIGlmIG4gPT0gMDogcmV0dXJuICd7fScKKyAgICAgICAgaWYgbGV2ZWwgPD0gMDogcmV0dXJuICd7Li4ufScKKyAgICAgICAgbmV3bGV2ZWwgPSBsZXZlbCAtIDEKKyAgICAgICAgcmVwcjEgPSBzZWxmLnJlcHIxCisgICAgICAgIHBpZWNlcyA9IFtdCisgICAgICAgIGZvciBrZXkgaW4gaXNsaWNlKF9wb3NzaWJseV9zb3J0ZWQoeCksIHNlbGYubWF4ZGljdCk6CisgICAgICAgICAgICBrZXlyZXByID0gcmVwcjEoa2V5LCBuZXdsZXZlbCkKKyAgICAgICAgICAgIHZhbHJlcHIgPSByZXByMSh4W2tleV0sIG5ld2xldmVsKQorICAgICAgICAgICAgcGllY2VzLmFwcGVuZCgnJXM6ICVzJyAlIChrZXlyZXByLCB2YWxyZXByKSkKKyAgICAgICAgaWYgbiA+IHNlbGYubWF4ZGljdDogcGllY2VzLmFwcGVuZCgnLi4uJykKKyAgICAgICAgcyA9ICcsICcuam9pbihwaWVjZXMpCisgICAgICAgIHJldHVybiAneyVzfScgJSAocywpCisKKyAgICBkZWYgcmVwcl9zdHIoc2VsZiwgeCwgbGV2ZWwpOgorICAgICAgICBzID0gX19idWlsdGluX18ucmVwcih4WzpzZWxmLm1heHN0cmluZ10pCisgICAgICAgIGlmIGxlbihzKSA+IHNlbGYubWF4c3RyaW5nOgorICAgICAgICAgICAgaSA9IG1heCgwLCAoc2VsZi5tYXhzdHJpbmctMykvLzIpCisgICAgICAgICAgICBqID0gbWF4KDAsIHNlbGYubWF4c3RyaW5nLTMtaSkKKyAgICAgICAgICAgIHMgPSBfX2J1aWx0aW5fXy5yZXByKHhbOmldICsgeFtsZW4oeCktajpdKQorICAgICAgICAgICAgcyA9IHNbOmldICsgJy4uLicgKyBzW2xlbihzKS1qOl0KKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiByZXByX2xvbmcoc2VsZiwgeCwgbGV2ZWwpOgorICAgICAgICBzID0gX19idWlsdGluX18ucmVwcih4KSAjIFhYWCBIb3BlIHRoaXMgaXNuJ3QgdG9vIHNsb3cuLi4KKyAgICAgICAgaWYgbGVuKHMpID4gc2VsZi5tYXhsb25nOgorICAgICAgICAgICAgaSA9IG1heCgwLCAoc2VsZi5tYXhsb25nLTMpLy8yKQorICAgICAgICAgICAgaiA9IG1heCgwLCBzZWxmLm1heGxvbmctMy1pKQorICAgICAgICAgICAgcyA9IHNbOmldICsgJy4uLicgKyBzW2xlbihzKS1qOl0KKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiByZXByX2luc3RhbmNlKHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcyA9IF9fYnVpbHRpbl9fLnJlcHIoeCkKKyAgICAgICAgICAgICMgQnVncyBpbiB4Ll9fcmVwcl9fKCkgY2FuIGNhdXNlIGFyYml0cmFyeQorICAgICAgICAgICAgIyBleGNlcHRpb25zIC0tIHRoZW4gbWFrZSB1cCBzb21ldGhpbmcKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHJldHVybiAnPCVzIGluc3RhbmNlIGF0ICV4PicgJSAoeC5fX2NsYXNzX18uX19uYW1lX18sIGlkKHgpKQorICAgICAgICBpZiBsZW4ocykgPiBzZWxmLm1heHN0cmluZzoKKyAgICAgICAgICAgIGkgPSBtYXgoMCwgKHNlbGYubWF4c3RyaW5nLTMpLy8yKQorICAgICAgICAgICAgaiA9IG1heCgwLCBzZWxmLm1heHN0cmluZy0zLWkpCisgICAgICAgICAgICBzID0gc1s6aV0gKyAnLi4uJyArIHNbbGVuKHMpLWo6XQorICAgICAgICByZXR1cm4gcworCisKK2RlZiBfcG9zc2libHlfc29ydGVkKHgpOgorICAgICMgU2luY2Ugbm90IGFsbCBzZXF1ZW5jZXMgb2YgaXRlbXMgY2FuIGJlIHNvcnRlZCBhbmQgY29tcGFyaXNvbgorICAgICMgZnVuY3Rpb25zIG1heSByYWlzZSBhcmJpdHJhcnkgZXhjZXB0aW9ucywgcmV0dXJuIGFuIHVuc29ydGVkCisgICAgIyBzZXF1ZW5jZSBpbiB0aGF0IGNhc2UuCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gc29ydGVkKHgpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcmV0dXJuIGxpc3QoeCkKKworYVJlcHIgPSBSZXByKCkKK3JlcHIgPSBhUmVwci5yZXByCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3JlcHIucHljIGIvbGliL3B5dGhvbjIuNy9yZXByLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGVmZjYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yZXByLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3JlcHIucHlvIGIvbGliL3B5dGhvbjIuNy9yZXByLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGVmZjYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yZXByLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3JleGVjLnB5IGIvbGliL3B5dGhvbjIuNy9yZXhlYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQ2MTUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yZXhlYy5weQpAQCAtMCwwICsxLDU4OCBAQAorIiIiUmVzdHJpY3RlZCBleGVjdXRpb24gZmFjaWxpdGllcy4KKworVGhlIGNsYXNzIFJFeGVjIGV4cG9ydHMgbWV0aG9kcyByX2V4ZWMoKSwgcl9ldmFsKCksIHJfZXhlY2ZpbGUoKSwgYW5kCityX2ltcG9ydCgpLCB3aGljaCBjb3JyZXNwb25kIHJvdWdobHkgdG8gdGhlIGJ1aWx0LWluIG9wZXJhdGlvbnMKK2V4ZWMsIGV2YWwoKSwgZXhlY2ZpbGUoKSBhbmQgaW1wb3J0LCBidXQgZXhlY3V0aW5nIHRoZSBjb2RlIGluIGFuCitlbnZpcm9ubWVudCB0aGF0IG9ubHkgZXhwb3NlcyB0aG9zZSBidWlsdC1pbiBvcGVyYXRpb25zIHRoYXQgYXJlCitkZWVtZWQgc2FmZS4gIFRvIHRoaXMgZW5kLCBhIG1vZGVzdCBjb2xsZWN0aW9uIG9mICdmYWtlJyBtb2R1bGVzIGlzCitjcmVhdGVkIHdoaWNoIG1pbWljcyB0aGUgc3RhbmRhcmQgbW9kdWxlcyBieSB0aGUgc2FtZSBuYW1lcy4gIEl0IGlzIGEKK3BvbGljeSBkZWNpc2lvbiB3aGljaCBidWlsdC1pbiBtb2R1bGVzIGFuZCBvcGVyYXRpb25zIGFyZSBtYWRlCithdmFpbGFibGU7IHRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgcmVhc29uYWJsZSBkZWZhdWx0LCBidXQgZGVyaXZlZAorY2xhc3NlcyBjYW4gY2hhbmdlIHRoZSBwb2xpY2llcyBlLmcuIGJ5IG92ZXJyaWRpbmcgb3IgZXh0ZW5kaW5nIGNsYXNzCit2YXJpYWJsZXMgbGlrZSBva19idWlsdGluX21vZHVsZXMgb3IgbWV0aG9kcyBsaWtlIG1ha2Vfc3lzKCkuCisKK1hYWCBUbyBkbzoKKy0gcl9vcGVuIHNob3VsZCBhbGxvdyB3cml0aW5nIHRtcCBkaXIKKy0gcl9leGVjIGV0Yy4gd2l0aCBleHBsaWNpdCBnbG9iYWxzL2xvY2Fscz8gKFVzZSByZXhlYygiZXhlYyAuLi4gaW4gLi4uIik/KQorCisiIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIHJleGVjIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworCitpbXBvcnQgc3lzCitpbXBvcnQgX19idWlsdGluX18KK2ltcG9ydCBvcworaW1wb3J0IGlob29rcworaW1wb3J0IGltcAorCitfX2FsbF9fID0gWyJSRXhlYyJdCisKK2NsYXNzIEZpbGVCYXNlOgorCisgICAgb2tfZmlsZV9tZXRob2RzID0gKCdmaWxlbm8nLCAnZmx1c2gnLCAnaXNhdHR5JywgJ3JlYWQnLCAncmVhZGxpbmUnLAorICAgICAgICAgICAgJ3JlYWRsaW5lcycsICdzZWVrJywgJ3RlbGwnLCAnd3JpdGUnLCAnd3JpdGVsaW5lcycsICd4cmVhZGxpbmVzJywKKyAgICAgICAgICAgICdfX2l0ZXJfXycpCisKKworY2xhc3MgRmlsZVdyYXBwZXIoRmlsZUJhc2UpOgorCisgICAgIyBYWFggVGhpcyBpcyBqdXN0IGxpa2UgYSBCYXN0aW9uIC0tIHNob3VsZCB1c2UgdGhhdCEKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmKToKKyAgICAgICAgZm9yIG0gaW4gc2VsZi5va19maWxlX21ldGhvZHM6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCBtKSBhbmQgaGFzYXR0cihmLCBtKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG0sIGdldGF0dHIoZiwgbSkpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZmx1c2goKQorCisKK1RFTVBMQVRFID0gIiIiCitkZWYgJXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLm1vZCwgc2VsZi5uYW1lKS4lcygqYXJncykKKyIiIgorCitjbGFzcyBGaWxlRGVsZWdhdGUoRmlsZUJhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZCwgbmFtZSk6CisgICAgICAgIHNlbGYubW9kID0gbW9kCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgIGZvciBtIGluIEZpbGVCYXNlLm9rX2ZpbGVfbWV0aG9kcyArICgnY2xvc2UnLCk6CisgICAgICAgIGV4ZWMgVEVNUExBVEUgJSAobSwgbSkKKworCitjbGFzcyBSSG9va3MoaWhvb2tzLkhvb2tzKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICMgSGFja3MgdG8gc3VwcG9ydCBib3RoIG9sZCBhbmQgbmV3IGludGVyZmFjZXM6CisgICAgICAgICMgb2xkIGludGVyZmFjZSB3YXMgUkhvb2tzKHJleGVjWywgdmVyYm9zZV0pCisgICAgICAgICMgbmV3IGludGVyZmFjZSBpcyBSSG9va3MoW3ZlcmJvc2VdKQorICAgICAgICB2ZXJib3NlID0gMAorICAgICAgICByZXhlYyA9IE5vbmUKKyAgICAgICAgaWYgYXJncyBhbmQgdHlwZShhcmdzWy0xXSkgPT0gdHlwZSgwKToKKyAgICAgICAgICAgIHZlcmJvc2UgPSBhcmdzWy0xXQorICAgICAgICAgICAgYXJncyA9IGFyZ3NbOi0xXQorICAgICAgICBpZiBhcmdzIGFuZCBoYXNhdHRyKGFyZ3NbMF0sICdfX2NsYXNzX18nKToKKyAgICAgICAgICAgIHJleGVjID0gYXJnc1swXQorICAgICAgICAgICAgYXJncyA9IGFyZ3NbMTpdCisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJ0b28gbWFueSBhcmd1bWVudHMiCisgICAgICAgIGlob29rcy5Ib29rcy5fX2luaXRfXyhzZWxmLCB2ZXJib3NlKQorICAgICAgICBzZWxmLnJleGVjID0gcmV4ZWMKKworICAgIGRlZiBzZXRfcmV4ZWMoc2VsZiwgcmV4ZWMpOgorICAgICAgICAjIENhbGxlZCBieSBSRXhlYyBpbnN0YW5jZSB0byBjb21wbGV0ZSBpbml0aWFsaXphdGlvbgorICAgICAgICBzZWxmLnJleGVjID0gcmV4ZWMKKworICAgIGRlZiBnZXRfc3VmZml4ZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJleGVjLmdldF9zdWZmaXhlcygpCisKKyAgICBkZWYgaXNfYnVpbHRpbihzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmV4ZWMuaXNfYnVpbHRpbihuYW1lKQorCisgICAgZGVmIGluaXRfYnVpbHRpbihzZWxmLCBuYW1lKToKKyAgICAgICAgbSA9IF9faW1wb3J0X18obmFtZSkKKyAgICAgICAgcmV0dXJuIHNlbGYucmV4ZWMuY29weV9leGNlcHQobSwgKCkpCisKKyAgICBkZWYgaW5pdF9mcm96ZW4oc2VsZiwgbmFtZSk6IHJhaXNlIFN5c3RlbUVycm9yLCAiZG9uJ3QgdXNlIHRoaXMiCisgICAgZGVmIGxvYWRfc291cmNlKHNlbGYsICphcmdzKTogcmFpc2UgU3lzdGVtRXJyb3IsICJkb24ndCB1c2UgdGhpcyIKKyAgICBkZWYgbG9hZF9jb21waWxlZChzZWxmLCAqYXJncyk6IHJhaXNlIFN5c3RlbUVycm9yLCAiZG9uJ3QgdXNlIHRoaXMiCisgICAgZGVmIGxvYWRfcGFja2FnZShzZWxmLCAqYXJncyk6IHJhaXNlIFN5c3RlbUVycm9yLCAiZG9uJ3QgdXNlIHRoaXMiCisKKyAgICBkZWYgbG9hZF9keW5hbWljKHNlbGYsIG5hbWUsIGZpbGVuYW1lLCBmaWxlKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmV4ZWMubG9hZF9keW5hbWljKG5hbWUsIGZpbGVuYW1lLCBmaWxlKQorCisgICAgZGVmIGFkZF9tb2R1bGUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLnJleGVjLmFkZF9tb2R1bGUobmFtZSkKKworICAgIGRlZiBtb2R1bGVzX2RpY3Qoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJleGVjLm1vZHVsZXMKKworICAgIGRlZiBkZWZhdWx0X3BhdGgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJleGVjLm1vZHVsZXNbJ3N5cyddLnBhdGgKKworCisjIFhYWCBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorUk1vZHVsZUxvYWRlciA9IGlob29rcy5GYW5jeU1vZHVsZUxvYWRlcgorUk1vZHVsZUltcG9ydGVyID0gaWhvb2tzLk1vZHVsZUltcG9ydGVyCisKKworY2xhc3MgUkV4ZWMoaWhvb2tzLl9WZXJib3NlKToKKyAgICAiIiJCYXNpYyByZXN0cmljdGVkIGV4ZWN1dGlvbiBmcmFtZXdvcmsuCisKKyAgICBDb2RlIGV4ZWN1dGVkIGluIHRoaXMgcmVzdHJpY3RlZCBlbnZpcm9ubWVudCB3aWxsIG9ubHkgaGF2ZSBhY2Nlc3MgdG8KKyAgICBtb2R1bGVzIGFuZCBmdW5jdGlvbnMgdGhhdCBhcmUgZGVlbWVkIHNhZmU7IHlvdSBjYW4gc3ViY2xhc3MgUkV4ZWMgdG8KKyAgICBhZGQgb3IgcmVtb3ZlIGNhcGFiaWxpdGllcyBhcyBkZXNpcmVkLgorCisgICAgVGhlIFJFeGVjIGNsYXNzIGNhbiBwcmV2ZW50IGNvZGUgZnJvbSBwZXJmb3JtaW5nIHVuc2FmZSBvcGVyYXRpb25zIGxpa2UKKyAgICByZWFkaW5nIG9yIHdyaXRpbmcgZGlzayBmaWxlcywgb3IgdXNpbmcgVENQL0lQIHNvY2tldHMuICBIb3dldmVyLCBpdCBkb2VzCisgICAgbm90IHByb3RlY3QgYWdhaW5zdCBjb2RlIHVzaW5nIGV4dHJlbWVseSBsYXJnZSBhbW91bnRzIG9mIG1lbW9yeSBvcgorICAgIHByb2Nlc3NvciB0aW1lLgorCisgICAgIiIiCisKKyAgICBva19wYXRoID0gdHVwbGUoc3lzLnBhdGgpICAgICAgICAgICAjIFRoYXQncyBhIHBvbGljeSBkZWNpc2lvbgorCisgICAgb2tfYnVpbHRpbl9tb2R1bGVzID0gKCdhdWRpb29wJywgJ2FycmF5JywgJ2JpbmFzY2lpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NtYXRoJywgJ2Vycm5vJywgJ2ltYWdlb3AnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFyc2hhbCcsICdtYXRoJywgJ21kNScsICdvcGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJzZXInLCAnc2VsZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYScsICdfc3JlJywgJ3N0cm9wJywgJ3N0cnVjdCcsICd0aW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ193ZWFrcmVmJykKKworICAgIG9rX3Bvc2l4X25hbWVzID0gKCdlcnJvcicsICdmc3RhdCcsICdsaXN0ZGlyJywgJ2xzdGF0JywgJ3JlYWRsaW5rJywKKyAgICAgICAgICAgICAgICAgICAgICAnc3RhdCcsICd0aW1lcycsICd1bmFtZScsICdnZXRwaWQnLCAnZ2V0cHBpZCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2dldGN3ZCcsICdnZXR1aWQnLCAnZ2V0Z2lkJywgJ2dldGV1aWQnLCAnZ2V0ZWdpZCcpCisKKyAgICBva19zeXNfbmFtZXMgPSAoJ2J5dGVvcmRlcicsICdjb3B5cmlnaHQnLCAnZXhpdCcsICdnZXRkZWZhdWx0ZW5jb2RpbmcnLAorICAgICAgICAgICAgICAgICAgICAnZ2V0cmVmY291bnQnLCAnaGV4dmVyc2lvbicsICdtYXhpbnQnLCAnbWF4dW5pY29kZScsCisgICAgICAgICAgICAgICAgICAgICdwbGF0Zm9ybScsICdwczEnLCAncHMyJywgJ3ZlcnNpb24nLCAndmVyc2lvbl9pbmZvJykKKworICAgIG5va19idWlsdGluX25hbWVzID0gKCdvcGVuJywgJ2ZpbGUnLCAncmVsb2FkJywgJ19faW1wb3J0X18nKQorCisgICAgb2tfZmlsZV90eXBlcyA9IChpbXAuQ19FWFRFTlNJT04sIGltcC5QWV9TT1VSQ0UpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9va3MgPSBOb25lLCB2ZXJib3NlID0gMCk6CisgICAgICAgICIiIlJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIFJFeGVjIGNsYXNzLgorCisgICAgICAgIFRoZSBob29rcyBwYXJhbWV0ZXIgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIFJIb29rcyBjbGFzcyBvciBhIHN1YmNsYXNzCisgICAgICAgIG9mIGl0LiAgSWYgaXQgaXMgb21pdHRlZCBvciBOb25lLCB0aGUgZGVmYXVsdCBSSG9va3MgY2xhc3MgaXMKKyAgICAgICAgaW5zdGFudGlhdGVkLgorCisgICAgICAgIFdoZW5ldmVyIHRoZSBSRXhlYyBtb2R1bGUgc2VhcmNoZXMgZm9yIGEgbW9kdWxlIChldmVuIGEgYnVpbHQtaW4gb25lKQorICAgICAgICBvciByZWFkcyBhIG1vZHVsZSdzIGNvZGUsIGl0IGRvZXNuJ3QgYWN0dWFsbHkgZ28gb3V0IHRvIHRoZSBmaWxlCisgICAgICAgIHN5c3RlbSBpdHNlbGYuICBSYXRoZXIsIGl0IGNhbGxzIG1ldGhvZHMgb2YgYW4gUkhvb2tzIGluc3RhbmNlIHRoYXQKKyAgICAgICAgd2FzIHBhc3NlZCB0byBvciBjcmVhdGVkIGJ5IGl0cyBjb25zdHJ1Y3Rvci4gIChBY3R1YWxseSwgdGhlIFJFeGVjCisgICAgICAgIG9iamVjdCBkb2Vzbid0IG1ha2UgdGhlc2UgY2FsbHMgLS0tIHRoZXkgYXJlIG1hZGUgYnkgYSBtb2R1bGUgbG9hZGVyCisgICAgICAgIG9iamVjdCB0aGF0J3MgcGFydCBvZiB0aGUgUkV4ZWMgb2JqZWN0LiAgVGhpcyBhbGxvd3MgYW5vdGhlciBsZXZlbCBvZgorICAgICAgICBmbGV4aWJpbGl0eSwgd2hpY2ggY2FuIGJlIHVzZWZ1bCB3aGVuIGNoYW5naW5nIHRoZSBtZWNoYW5pY3Mgb2YKKyAgICAgICAgaW1wb3J0IHdpdGhpbiB0aGUgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4pCisKKyAgICAgICAgQnkgcHJvdmlkaW5nIGFuIGFsdGVybmF0ZSBSSG9va3Mgb2JqZWN0LCB3ZSBjYW4gY29udHJvbCB0aGUgZmlsZQorICAgICAgICBzeXN0ZW0gYWNjZXNzZXMgbWFkZSB0byBpbXBvcnQgYSBtb2R1bGUsIHdpdGhvdXQgY2hhbmdpbmcgdGhlCisgICAgICAgIGFjdHVhbCBhbGdvcml0aG0gdGhhdCBjb250cm9scyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhvc2UgYWNjZXNzZXMgYXJlCisgICAgICAgIG1hZGUuICBGb3IgaW5zdGFuY2UsIHdlIGNvdWxkIHN1YnN0aXR1dGUgYW4gUkhvb2tzIG9iamVjdCB0aGF0CisgICAgICAgIHBhc3NlcyBhbGwgZmlsZXN5c3RlbSByZXF1ZXN0cyB0byBhIGZpbGUgc2VydmVyIGVsc2V3aGVyZSwgdmlhIHNvbWUKKyAgICAgICAgUlBDIG1lY2hhbmlzbSBzdWNoIGFzIElMVS4gIEdyYWlsJ3MgYXBwbGV0IGxvYWRlciB1c2VzIHRoaXMgdG8gc3VwcG9ydAorICAgICAgICBpbXBvcnRpbmcgYXBwbGV0cyBmcm9tIGEgVVJMIGZvciBhIGRpcmVjdG9yeS4KKworICAgICAgICBJZiB0aGUgdmVyYm9zZSBwYXJhbWV0ZXIgaXMgdHJ1ZSwgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgb3V0cHV0IG1heSBiZQorICAgICAgICBzZW50IHRvIHN0YW5kYXJkIG91dHB1dC4KKworICAgICAgICAiIiIKKworICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJUaGlzIGNvZGUgaXMgbm90IHNlY3VyZSBpbiBQeXRob24gMi4yIGFuZCBsYXRlciIKKworICAgICAgICBpaG9va3MuX1ZlcmJvc2UuX19pbml0X18oc2VsZiwgdmVyYm9zZSkKKyAgICAgICAgIyBYWFggVGhlcmUncyBhIGNpcmN1bGFyIHJlZmVyZW5jZSBoZXJlOgorICAgICAgICBzZWxmLmhvb2tzID0gaG9va3Mgb3IgUkhvb2tzKHZlcmJvc2UpCisgICAgICAgIHNlbGYuaG9va3Muc2V0X3JleGVjKHNlbGYpCisgICAgICAgIHNlbGYubW9kdWxlcyA9IHt9CisgICAgICAgIHNlbGYub2tfZHluYW1pY19tb2R1bGVzID0gc2VsZi5va19idWlsdGluX21vZHVsZXMKKyAgICAgICAgbGlzdCA9IFtdCisgICAgICAgIGZvciBtbmFtZSBpbiBzZWxmLm9rX2J1aWx0aW5fbW9kdWxlczoKKyAgICAgICAgICAgIGlmIG1uYW1lIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lczoKKyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChtbmFtZSkKKyAgICAgICAgc2VsZi5va19idWlsdGluX21vZHVsZXMgPSB0dXBsZShsaXN0KQorICAgICAgICBzZWxmLnNldF90cnVzdGVkX3BhdGgoKQorICAgICAgICBzZWxmLm1ha2VfYnVpbHRpbigpCisgICAgICAgIHNlbGYubWFrZV9pbml0aWFsX21vZHVsZXMoKQorICAgICAgICAjIG1ha2Vfc3lzIG11c3QgYmUgbGFzdCBiZWNhdXNlIGl0IGFkZHMgdGhlIGFscmVhZHkgY3JlYXRlZAorICAgICAgICAjIG1vZHVsZXMgdG8gaXRzIGJ1aWx0aW5fbW9kdWxlX25hbWVzCisgICAgICAgIHNlbGYubWFrZV9zeXMoKQorICAgICAgICBzZWxmLmxvYWRlciA9IFJNb2R1bGVMb2FkZXIoc2VsZi5ob29rcywgdmVyYm9zZSkKKyAgICAgICAgc2VsZi5pbXBvcnRlciA9IFJNb2R1bGVJbXBvcnRlcihzZWxmLmxvYWRlciwgdmVyYm9zZSkKKworICAgIGRlZiBzZXRfdHJ1c3RlZF9wYXRoKHNlbGYpOgorICAgICAgICAjIFNldCB0aGUgcGF0aCBmcm9tIHdoaWNoIGR5bmFtaWMgbW9kdWxlcyBtYXkgYmUgbG9hZGVkLgorICAgICAgICAjIFRob3NlIGR5bmFtaWMgbW9kdWxlcyBtdXN0IGFsc28gb2NjdXIgaW4gb2tfYnVpbHRpbl9tb2R1bGVzCisgICAgICAgIHNlbGYudHJ1c3RlZF9wYXRoID0gZmlsdGVyKG9zLnBhdGguaXNhYnMsIHN5cy5wYXRoKQorCisgICAgZGVmIGxvYWRfZHluYW1pYyhzZWxmLCBuYW1lLCBmaWxlbmFtZSwgZmlsZSk6CisgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYub2tfZHluYW1pY19tb2R1bGVzOgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJ1bnRydXN0ZWQgZHluYW1pYyBtb2R1bGU6ICVzIiAlIG5hbWUKKyAgICAgICAgaWYgbmFtZSBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgIHNyYyA9IHN5cy5tb2R1bGVzW25hbWVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzcmMgPSBpbXAubG9hZF9keW5hbWljKG5hbWUsIGZpbGVuYW1lLCBmaWxlKQorICAgICAgICBkc3QgPSBzZWxmLmNvcHlfZXhjZXB0KHNyYywgW10pCisgICAgICAgIHJldHVybiBkc3QKKworICAgIGRlZiBtYWtlX2luaXRpYWxfbW9kdWxlcyhzZWxmKToKKyAgICAgICAgc2VsZi5tYWtlX21haW4oKQorICAgICAgICBzZWxmLm1ha2Vfb3NuYW1lKCkKKworICAgICMgSGVscGVycyBmb3IgUkhvb2tzCisKKyAgICBkZWYgZ2V0X3N1ZmZpeGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gW2l0ZW0gICAjIChzdWZmLCBtb2RlLCB0eXBlKQorICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIGltcC5nZXRfc3VmZml4ZXMoKQorICAgICAgICAgICAgICAgIGlmIGl0ZW1bMl0gaW4gc2VsZi5va19maWxlX3R5cGVzXQorCisgICAgZGVmIGlzX2J1aWx0aW4oc2VsZiwgbW5hbWUpOgorICAgICAgICByZXR1cm4gbW5hbWUgaW4gc2VsZi5va19idWlsdGluX21vZHVsZXMKKworICAgICMgVGhlIG1ha2VfKiBtZXRob2RzIGNyZWF0ZSBzcGVjaWZpYyBidWlsdC1pbiBtb2R1bGVzCisKKyAgICBkZWYgbWFrZV9idWlsdGluKHNlbGYpOgorICAgICAgICBtID0gc2VsZi5jb3B5X2V4Y2VwdChfX2J1aWx0aW5fXywgc2VsZi5ub2tfYnVpbHRpbl9uYW1lcykKKyAgICAgICAgbS5fX2ltcG9ydF9fID0gc2VsZi5yX2ltcG9ydAorICAgICAgICBtLnJlbG9hZCA9IHNlbGYucl9yZWxvYWQKKyAgICAgICAgbS5vcGVuID0gbS5maWxlID0gc2VsZi5yX29wZW4KKworICAgIGRlZiBtYWtlX21haW4oc2VsZik6CisgICAgICAgIHNlbGYuYWRkX21vZHVsZSgnX19tYWluX18nKQorCisgICAgZGVmIG1ha2Vfb3NuYW1lKHNlbGYpOgorICAgICAgICBvc25hbWUgPSBvcy5uYW1lCisgICAgICAgIHNyYyA9IF9faW1wb3J0X18ob3NuYW1lKQorICAgICAgICBkc3QgPSBzZWxmLmNvcHlfb25seShzcmMsIHNlbGYub2tfcG9zaXhfbmFtZXMpCisgICAgICAgIGRzdC5lbnZpcm9uID0gZSA9IHt9CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG9zLmVudmlyb24uaXRlbXMoKToKKyAgICAgICAgICAgIGVba2V5XSA9IHZhbHVlCisKKyAgICBkZWYgbWFrZV9zeXMoc2VsZik6CisgICAgICAgIG0gPSBzZWxmLmNvcHlfb25seShzeXMsIHNlbGYub2tfc3lzX25hbWVzKQorICAgICAgICBtLm1vZHVsZXMgPSBzZWxmLm1vZHVsZXMKKyAgICAgICAgbS5hcmd2ID0gWydSRVNUUklDVEVEJ10KKyAgICAgICAgbS5wYXRoID0gbWFwKE5vbmUsIHNlbGYub2tfcGF0aCkKKyAgICAgICAgbS5leGNfaW5mbyA9IHNlbGYucl9leGNfaW5mbworICAgICAgICBtID0gc2VsZi5tb2R1bGVzWydzeXMnXQorICAgICAgICBsID0gc2VsZi5tb2R1bGVzLmtleXMoKSArIGxpc3Qoc2VsZi5va19idWlsdGluX21vZHVsZXMpCisgICAgICAgIGwuc29ydCgpCisgICAgICAgIG0uYnVpbHRpbl9tb2R1bGVfbmFtZXMgPSB0dXBsZShsKQorCisgICAgIyBUaGUgY29weV8qIG1ldGhvZHMgY29weSBleGlzdGluZyBtb2R1bGVzIHdpdGggc29tZSBjaGFuZ2VzCisKKyAgICBkZWYgY29weV9leGNlcHQoc2VsZiwgc3JjLCBleGNlcHRpb25zKToKKyAgICAgICAgZHN0ID0gc2VsZi5jb3B5X25vbmUoc3JjKQorICAgICAgICBmb3IgbmFtZSBpbiBkaXIoc3JjKToKKyAgICAgICAgICAgIHNldGF0dHIoZHN0LCBuYW1lLCBnZXRhdHRyKHNyYywgbmFtZSkpCisgICAgICAgIGZvciBuYW1lIGluIGV4Y2VwdGlvbnM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVsYXR0cihkc3QsIG5hbWUpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gZHN0CisKKyAgICBkZWYgY29weV9vbmx5KHNlbGYsIHNyYywgbmFtZXMpOgorICAgICAgICBkc3QgPSBzZWxmLmNvcHlfbm9uZShzcmMpCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihzcmMsIG5hbWUpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNldGF0dHIoZHN0LCBuYW1lLCB2YWx1ZSkKKyAgICAgICAgcmV0dXJuIGRzdAorCisgICAgZGVmIGNvcHlfbm9uZShzZWxmLCBzcmMpOgorICAgICAgICBtID0gc2VsZi5hZGRfbW9kdWxlKHNyYy5fX25hbWVfXykKKyAgICAgICAgbS5fX2RvY19fID0gc3JjLl9fZG9jX18KKyAgICAgICAgcmV0dXJuIG0KKworICAgICMgQWRkIGEgbW9kdWxlIC0tIHJldHVybiBhbiBleGlzdGluZyBtb2R1bGUgb3IgY3JlYXRlIG9uZQorCisgICAgZGVmIGFkZF9tb2R1bGUoc2VsZiwgbW5hbWUpOgorICAgICAgICBtID0gc2VsZi5tb2R1bGVzLmdldChtbmFtZSkKKyAgICAgICAgaWYgbSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5tb2R1bGVzW21uYW1lXSA9IG0gPSBzZWxmLmhvb2tzLm5ld19tb2R1bGUobW5hbWUpCisgICAgICAgIG0uX19idWlsdGluc19fID0gc2VsZi5tb2R1bGVzWydfX2J1aWx0aW5fXyddCisgICAgICAgIHJldHVybiBtCisKKyAgICAjIFRoZSByKiBtZXRob2RzIGFyZSBwdWJsaWMgaW50ZXJmYWNlcworCisgICAgZGVmIHJfZXhlYyhzZWxmLCBjb2RlKToKKyAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIHdpdGhpbiBhIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuCisKKyAgICAgICAgVGhlIGNvZGUgcGFyYW1ldGVyIG11c3QgZWl0aGVyIGJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUKKyAgICAgICAgbGluZXMgb2YgUHl0aG9uIGNvZGUsIG9yIGEgY29tcGlsZWQgY29kZSBvYmplY3QsIHdoaWNoIHdpbGwgYmUKKyAgICAgICAgZXhlY3V0ZWQgaW4gdGhlIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQncyBfX21haW5fXyBtb2R1bGUuCisKKyAgICAgICAgIiIiCisgICAgICAgIG0gPSBzZWxmLmFkZF9tb2R1bGUoJ19fbWFpbl9fJykKKyAgICAgICAgZXhlYyBjb2RlIGluIG0uX19kaWN0X18KKworICAgIGRlZiByX2V2YWwoc2VsZiwgY29kZSk6CisgICAgICAgICIiIkV2YWx1YXRlIGNvZGUgd2l0aGluIGEgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4KKworICAgICAgICBUaGUgY29kZSBwYXJhbWV0ZXIgbXVzdCBlaXRoZXIgYmUgYSBzdHJpbmcgY29udGFpbmluZyBhIFB5dGhvbgorICAgICAgICBleHByZXNzaW9uLCBvciBhIGNvbXBpbGVkIGNvZGUgb2JqZWN0LCB3aGljaCB3aWxsIGJlIGV2YWx1YXRlZCBpbgorICAgICAgICB0aGUgcmVzdHJpY3RlZCBlbnZpcm9ubWVudCdzIF9fbWFpbl9fIG1vZHVsZS4gIFRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgICAgZXhwcmVzc2lvbiBvciBjb2RlIG9iamVjdCB3aWxsIGJlIHJldHVybmVkLgorCisgICAgICAgICIiIgorICAgICAgICBtID0gc2VsZi5hZGRfbW9kdWxlKCdfX21haW5fXycpCisgICAgICAgIHJldHVybiBldmFsKGNvZGUsIG0uX19kaWN0X18pCisKKyAgICBkZWYgcl9leGVjZmlsZShzZWxmLCBmaWxlKToKKyAgICAgICAgIiIiRXhlY3V0ZSB0aGUgUHl0aG9uIGNvZGUgaW4gdGhlIGZpbGUgaW4gdGhlIHJlc3RyaWN0ZWQKKyAgICAgICAgZW52aXJvbm1lbnQncyBfX21haW5fXyBtb2R1bGUuCisKKyAgICAgICAgIiIiCisgICAgICAgIG0gPSBzZWxmLmFkZF9tb2R1bGUoJ19fbWFpbl9fJykKKyAgICAgICAgZXhlY2ZpbGUoZmlsZSwgbS5fX2RpY3RfXykKKworICAgIGRlZiByX2ltcG9ydChzZWxmLCBtbmFtZSwgZ2xvYmFscz17fSwgbG9jYWxzPXt9LCBmcm9tbGlzdD1bXSk6CisgICAgICAgICIiIkltcG9ydCBhIG1vZHVsZSwgcmFpc2luZyBhbiBJbXBvcnRFcnJvciBleGNlcHRpb24gaWYgdGhlIG1vZHVsZQorICAgICAgICBpcyBjb25zaWRlcmVkIHVuc2FmZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBpbXBsaWNpdGx5IGNhbGxlZCBieSBjb2RlIGV4ZWN1dGluZyBpbiB0aGUKKyAgICAgICAgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4gIE92ZXJyaWRpbmcgdGhpcyBtZXRob2QgaW4gYSBzdWJjbGFzcyBpcworICAgICAgICB1c2VkIHRvIGNoYW5nZSB0aGUgcG9saWNpZXMgZW5mb3JjZWQgYnkgYSByZXN0cmljdGVkIGVudmlyb25tZW50LgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5pbXBvcnRlci5pbXBvcnRfbW9kdWxlKG1uYW1lLCBnbG9iYWxzLCBsb2NhbHMsIGZyb21saXN0KQorCisgICAgZGVmIHJfcmVsb2FkKHNlbGYsIG0pOgorICAgICAgICAiIiJSZWxvYWQgdGhlIG1vZHVsZSBvYmplY3QsIHJlLXBhcnNpbmcgYW5kIHJlLWluaXRpYWxpemluZyBpdC4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBpbXBsaWNpdGx5IGNhbGxlZCBieSBjb2RlIGV4ZWN1dGluZyBpbiB0aGUKKyAgICAgICAgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4gIE92ZXJyaWRpbmcgdGhpcyBtZXRob2QgaW4gYSBzdWJjbGFzcyBpcworICAgICAgICB1c2VkIHRvIGNoYW5nZSB0aGUgcG9saWNpZXMgZW5mb3JjZWQgYnkgYSByZXN0cmljdGVkIGVudmlyb25tZW50LgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5pbXBvcnRlci5yZWxvYWQobSkKKworICAgIGRlZiByX3VubG9hZChzZWxmLCBtKToKKyAgICAgICAgIiIiVW5sb2FkIHRoZSBtb2R1bGUuCisKKyAgICAgICAgUmVtb3ZlcyBpdCBmcm9tIHRoZSByZXN0cmljdGVkIGVudmlyb25tZW50J3Mgc3lzLm1vZHVsZXMgZGljdGlvbmFyeS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBpbXBsaWNpdGx5IGNhbGxlZCBieSBjb2RlIGV4ZWN1dGluZyBpbiB0aGUKKyAgICAgICAgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4gIE92ZXJyaWRpbmcgdGhpcyBtZXRob2QgaW4gYSBzdWJjbGFzcyBpcworICAgICAgICB1c2VkIHRvIGNoYW5nZSB0aGUgcG9saWNpZXMgZW5mb3JjZWQgYnkgYSByZXN0cmljdGVkIGVudmlyb25tZW50LgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5pbXBvcnRlci51bmxvYWQobSkKKworICAgICMgVGhlIHNfKiBtZXRob2RzIGFyZSBzaW1pbGFyIGJ1dCBhbHNvIHN3YXAgc3Rke2luLG91dCxlcnJ9CisKKyAgICBkZWYgbWFrZV9kZWxlZ2F0ZV9maWxlcyhzZWxmKToKKyAgICAgICAgcyA9IHNlbGYubW9kdWxlc1snc3lzJ10KKyAgICAgICAgc2VsZi5kZWxlZ2F0ZV9zdGRpbiA9IEZpbGVEZWxlZ2F0ZShzLCAnc3RkaW4nKQorICAgICAgICBzZWxmLmRlbGVnYXRlX3N0ZG91dCA9IEZpbGVEZWxlZ2F0ZShzLCAnc3Rkb3V0JykKKyAgICAgICAgc2VsZi5kZWxlZ2F0ZV9zdGRlcnIgPSBGaWxlRGVsZWdhdGUocywgJ3N0ZGVycicpCisgICAgICAgIHNlbGYucmVzdHJpY3RlZF9zdGRpbiA9IEZpbGVXcmFwcGVyKHN5cy5zdGRpbikKKyAgICAgICAgc2VsZi5yZXN0cmljdGVkX3N0ZG91dCA9IEZpbGVXcmFwcGVyKHN5cy5zdGRvdXQpCisgICAgICAgIHNlbGYucmVzdHJpY3RlZF9zdGRlcnIgPSBGaWxlV3JhcHBlcihzeXMuc3RkZXJyKQorCisgICAgZGVmIHNldF9maWxlcyhzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ3NhdmVfc3RkaW4nKToKKyAgICAgICAgICAgIHNlbGYuc2F2ZV9maWxlcygpCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdkZWxlZ2F0ZV9zdGRpbicpOgorICAgICAgICAgICAgc2VsZi5tYWtlX2RlbGVnYXRlX2ZpbGVzKCkKKyAgICAgICAgcyA9IHNlbGYubW9kdWxlc1snc3lzJ10KKyAgICAgICAgcy5zdGRpbiA9IHNlbGYucmVzdHJpY3RlZF9zdGRpbgorICAgICAgICBzLnN0ZG91dCA9IHNlbGYucmVzdHJpY3RlZF9zdGRvdXQKKyAgICAgICAgcy5zdGRlcnIgPSBzZWxmLnJlc3RyaWN0ZWRfc3RkZXJyCisgICAgICAgIHN5cy5zdGRpbiA9IHNlbGYuZGVsZWdhdGVfc3RkaW4KKyAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYuZGVsZWdhdGVfc3Rkb3V0CisgICAgICAgIHN5cy5zdGRlcnIgPSBzZWxmLmRlbGVnYXRlX3N0ZGVycgorCisgICAgZGVmIHJlc2V0X2ZpbGVzKHNlbGYpOgorICAgICAgICBzZWxmLnJlc3RvcmVfZmlsZXMoKQorICAgICAgICBzID0gc2VsZi5tb2R1bGVzWydzeXMnXQorICAgICAgICBzZWxmLnJlc3RyaWN0ZWRfc3RkaW4gPSBzLnN0ZGluCisgICAgICAgIHNlbGYucmVzdHJpY3RlZF9zdGRvdXQgPSBzLnN0ZG91dAorICAgICAgICBzZWxmLnJlc3RyaWN0ZWRfc3RkZXJyID0gcy5zdGRlcnIKKworCisgICAgZGVmIHNhdmVfZmlsZXMoc2VsZik6CisgICAgICAgIHNlbGYuc2F2ZV9zdGRpbiA9IHN5cy5zdGRpbgorICAgICAgICBzZWxmLnNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLnNhdmVfc3RkZXJyID0gc3lzLnN0ZGVycgorCisgICAgZGVmIHJlc3RvcmVfZmlsZXMoc2VsZik6CisgICAgICAgIHN5cy5zdGRpbiA9IHNlbGYuc2F2ZV9zdGRpbgorICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5zYXZlX3N0ZG91dAorICAgICAgICBzeXMuc3RkZXJyID0gc2VsZi5zYXZlX3N0ZGVycgorCisgICAgZGVmIHNfYXBwbHkoc2VsZiwgZnVuYywgYXJncz0oKSwga3c9e30pOgorICAgICAgICBzZWxmLnNhdmVfZmlsZXMoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNldF9maWxlcygpCisgICAgICAgICAgICByID0gZnVuYygqYXJncywgKiprdykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVzdG9yZV9maWxlcygpCisgICAgICAgIHJldHVybiByCisKKyAgICBkZWYgc19leGVjKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiRXhlY3V0ZSBjb2RlIHdpdGhpbiBhIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuCisKKyAgICAgICAgU2ltaWxhciB0byB0aGUgcl9leGVjKCkgbWV0aG9kLCBidXQgdGhlIGNvZGUgd2lsbCBiZSBncmFudGVkIGFjY2VzcworICAgICAgICB0byByZXN0cmljdGVkIHZlcnNpb25zIG9mIHRoZSBzdGFuZGFyZCBJL08gc3RyZWFtcyBzeXMuc3RkaW4sCisgICAgICAgIHN5cy5zdGRlcnIsIGFuZCBzeXMuc3Rkb3V0LgorCisgICAgICAgIFRoZSBjb2RlIHBhcmFtZXRlciBtdXN0IGVpdGhlciBiZSBhIHN0cmluZyBjb250YWluaW5nIG9uZSBvciBtb3JlCisgICAgICAgIGxpbmVzIG9mIFB5dGhvbiBjb2RlLCBvciBhIGNvbXBpbGVkIGNvZGUgb2JqZWN0LCB3aGljaCB3aWxsIGJlCisgICAgICAgIGV4ZWN1dGVkIGluIHRoZSByZXN0cmljdGVkIGVudmlyb25tZW50J3MgX19tYWluX18gbW9kdWxlLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zX2FwcGx5KHNlbGYucl9leGVjLCBhcmdzKQorCisgICAgZGVmIHNfZXZhbChzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkV2YWx1YXRlIGNvZGUgd2l0aGluIGEgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4KKworICAgICAgICBTaW1pbGFyIHRvIHRoZSByX2V2YWwoKSBtZXRob2QsIGJ1dCB0aGUgY29kZSB3aWxsIGJlIGdyYW50ZWQgYWNjZXNzCisgICAgICAgIHRvIHJlc3RyaWN0ZWQgdmVyc2lvbnMgb2YgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW1zIHN5cy5zdGRpbiwKKyAgICAgICAgc3lzLnN0ZGVyciwgYW5kIHN5cy5zdGRvdXQuCisKKyAgICAgICAgVGhlIGNvZGUgcGFyYW1ldGVyIG11c3QgZWl0aGVyIGJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBQeXRob24KKyAgICAgICAgZXhwcmVzc2lvbiwgb3IgYSBjb21waWxlZCBjb2RlIG9iamVjdCwgd2hpY2ggd2lsbCBiZSBldmFsdWF0ZWQgaW4KKyAgICAgICAgdGhlIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQncyBfX21haW5fXyBtb2R1bGUuICBUaGUgdmFsdWUgb2YgdGhlCisgICAgICAgIGV4cHJlc3Npb24gb3IgY29kZSBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc19hcHBseShzZWxmLnJfZXZhbCwgYXJncykKKworICAgIGRlZiBzX2V4ZWNmaWxlKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiRXhlY3V0ZSB0aGUgUHl0aG9uIGNvZGUgaW4gdGhlIGZpbGUgaW4gdGhlIHJlc3RyaWN0ZWQKKyAgICAgICAgZW52aXJvbm1lbnQncyBfX21haW5fXyBtb2R1bGUuCisKKyAgICAgICAgU2ltaWxhciB0byB0aGUgcl9leGVjZmlsZSgpIG1ldGhvZCwgYnV0IHRoZSBjb2RlIHdpbGwgYmUgZ3JhbnRlZAorICAgICAgICBhY2Nlc3MgdG8gcmVzdHJpY3RlZCB2ZXJzaW9ucyBvZiB0aGUgc3RhbmRhcmQgSS9PIHN0cmVhbXMgc3lzLnN0ZGluLAorICAgICAgICBzeXMuc3RkZXJyLCBhbmQgc3lzLnN0ZG91dC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc19hcHBseShzZWxmLnJfZXhlY2ZpbGUsIGFyZ3MpCisKKyAgICBkZWYgc19pbXBvcnQoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJJbXBvcnQgYSBtb2R1bGUsIHJhaXNpbmcgYW4gSW1wb3J0RXJyb3IgZXhjZXB0aW9uIGlmIHRoZSBtb2R1bGUKKyAgICAgICAgaXMgY29uc2lkZXJlZCB1bnNhZmUuCisKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgaW1wbGljaXRseSBjYWxsZWQgYnkgY29kZSBleGVjdXRpbmcgaW4gdGhlCisgICAgICAgIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuICBPdmVycmlkaW5nIHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3MgaXMKKyAgICAgICAgdXNlZCB0byBjaGFuZ2UgdGhlIHBvbGljaWVzIGVuZm9yY2VkIGJ5IGEgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4KKworICAgICAgICBTaW1pbGFyIHRvIHRoZSByX2ltcG9ydCgpIG1ldGhvZCwgYnV0IGhhcyBhY2Nlc3MgdG8gcmVzdHJpY3RlZAorICAgICAgICB2ZXJzaW9ucyBvZiB0aGUgc3RhbmRhcmQgSS9PIHN0cmVhbXMgc3lzLnN0ZGluLCBzeXMuc3RkZXJyLCBhbmQKKyAgICAgICAgc3lzLnN0ZG91dC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc19hcHBseShzZWxmLnJfaW1wb3J0LCBhcmdzKQorCisgICAgZGVmIHNfcmVsb2FkKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiUmVsb2FkIHRoZSBtb2R1bGUgb2JqZWN0LCByZS1wYXJzaW5nIGFuZCByZS1pbml0aWFsaXppbmcgaXQuCisKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgaW1wbGljaXRseSBjYWxsZWQgYnkgY29kZSBleGVjdXRpbmcgaW4gdGhlCisgICAgICAgIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuICBPdmVycmlkaW5nIHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3MgaXMKKyAgICAgICAgdXNlZCB0byBjaGFuZ2UgdGhlIHBvbGljaWVzIGVuZm9yY2VkIGJ5IGEgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4KKworICAgICAgICBTaW1pbGFyIHRvIHRoZSByX3JlbG9hZCgpIG1ldGhvZCwgYnV0IGhhcyBhY2Nlc3MgdG8gcmVzdHJpY3RlZAorICAgICAgICB2ZXJzaW9ucyBvZiB0aGUgc3RhbmRhcmQgSS9PIHN0cmVhbXMgc3lzLnN0ZGluLCBzeXMuc3RkZXJyLCBhbmQKKyAgICAgICAgc3lzLnN0ZG91dC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc19hcHBseShzZWxmLnJfcmVsb2FkLCBhcmdzKQorCisgICAgZGVmIHNfdW5sb2FkKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiVW5sb2FkIHRoZSBtb2R1bGUuCisKKyAgICAgICAgUmVtb3ZlcyBpdCBmcm9tIHRoZSByZXN0cmljdGVkIGVudmlyb25tZW50J3Mgc3lzLm1vZHVsZXMgZGljdGlvbmFyeS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBpbXBsaWNpdGx5IGNhbGxlZCBieSBjb2RlIGV4ZWN1dGluZyBpbiB0aGUKKyAgICAgICAgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4gIE92ZXJyaWRpbmcgdGhpcyBtZXRob2QgaW4gYSBzdWJjbGFzcyBpcworICAgICAgICB1c2VkIHRvIGNoYW5nZSB0aGUgcG9saWNpZXMgZW5mb3JjZWQgYnkgYSByZXN0cmljdGVkIGVudmlyb25tZW50LgorCisgICAgICAgIFNpbWlsYXIgdG8gdGhlIHJfdW5sb2FkKCkgbWV0aG9kLCBidXQgaGFzIGFjY2VzcyB0byByZXN0cmljdGVkCisgICAgICAgIHZlcnNpb25zIG9mIHRoZSBzdGFuZGFyZCBJL08gc3RyZWFtcyBzeXMuc3RkaW4sIHN5cy5zdGRlcnIsIGFuZAorICAgICAgICBzeXMuc3Rkb3V0LgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zX2FwcGx5KHNlbGYucl91bmxvYWQsIGFyZ3MpCisKKyAgICAjIFJlc3RyaWN0ZWQgb3BlbiguLi4pCisKKyAgICBkZWYgcl9vcGVuKHNlbGYsIGZpbGUsIG1vZGU9J3InLCBidWY9LTEpOgorICAgICAgICAiIiJNZXRob2QgY2FsbGVkIHdoZW4gb3BlbigpIGlzIGNhbGxlZCBpbiB0aGUgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4KKworICAgICAgICBUaGUgYXJndW1lbnRzIGFyZSBpZGVudGljYWwgdG8gdGhvc2Ugb2YgdGhlIG9wZW4oKSBmdW5jdGlvbiwgYW5kIGEKKyAgICAgICAgZmlsZSBvYmplY3QgKG9yIGEgY2xhc3MgaW5zdGFuY2UgY29tcGF0aWJsZSB3aXRoIGZpbGUgb2JqZWN0cykKKyAgICAgICAgc2hvdWxkIGJlIHJldHVybmVkLiAgUkV4ZWMncyBkZWZhdWx0IGJlaGF2aW91ciBpcyBhbGxvdyBvcGVuaW5nCisgICAgICAgIGFueSBmaWxlIGZvciByZWFkaW5nLCBidXQgZm9yYmlkZGluZyBhbnkgYXR0ZW1wdCB0byB3cml0ZSBhIGZpbGUuCisKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgaW1wbGljaXRseSBjYWxsZWQgYnkgY29kZSBleGVjdXRpbmcgaW4gdGhlCisgICAgICAgIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuICBPdmVycmlkaW5nIHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3MgaXMKKyAgICAgICAgdXNlZCB0byBjaGFuZ2UgdGhlIHBvbGljaWVzIGVuZm9yY2VkIGJ5IGEgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4KKworICAgICAgICAiIiIKKyAgICAgICAgbW9kZSA9IHN0cihtb2RlKQorICAgICAgICBpZiBtb2RlIG5vdCBpbiAoJ3InLCAncmInKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJjYW4ndCBvcGVuIGZpbGVzIGZvciB3cml0aW5nIGluIHJlc3RyaWN0ZWQgbW9kZSIKKyAgICAgICAgcmV0dXJuIG9wZW4oZmlsZSwgbW9kZSwgYnVmKQorCisgICAgIyBSZXN0cmljdGVkIHZlcnNpb24gb2Ygc3lzLmV4Y19pbmZvKCkKKworICAgIGRlZiByX2V4Y19pbmZvKHNlbGYpOgorICAgICAgICB0eSwgdmEsIHRyID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgdHIgPSBOb25lCisgICAgICAgIHJldHVybiB0eSwgdmEsIHRyCisKKworZGVmIHRlc3QoKToKKyAgICBpbXBvcnQgZ2V0b3B0LCB0cmFjZWJhY2sKKyAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICd2dDonKQorICAgIHZlcmJvc2UgPSAwCisgICAgdHJ1c3RlZCA9IFtdCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyA9PSAnLXYnOgorICAgICAgICAgICAgdmVyYm9zZSA9IHZlcmJvc2UrMQorICAgICAgICBpZiBvID09ICctdCc6CisgICAgICAgICAgICB0cnVzdGVkLmFwcGVuZChhKQorICAgIHIgPSBSRXhlYyh2ZXJib3NlPXZlcmJvc2UpCisgICAgaWYgdHJ1c3RlZDoKKyAgICAgICAgci5va19idWlsdGluX21vZHVsZXMgPSByLm9rX2J1aWx0aW5fbW9kdWxlcyArIHR1cGxlKHRydXN0ZWQpCisgICAgaWYgYXJnczoKKyAgICAgICAgci5tb2R1bGVzWydzeXMnXS5hcmd2ID0gYXJncworICAgICAgICByLm1vZHVsZXNbJ3N5cyddLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguZGlybmFtZShhcmdzWzBdKSkKKyAgICBlbHNlOgorICAgICAgICByLm1vZHVsZXNbJ3N5cyddLnBhdGguaW5zZXJ0KDAsICIiKQorICAgIGZwID0gc3lzLnN0ZGluCisgICAgaWYgYXJncyBhbmQgYXJnc1swXSAhPSAnLSc6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwID0gb3BlbihhcmdzWzBdKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICAgICAgcHJpbnQgIiVzOiBjYW4ndCBvcGVuIGZpbGUgJXIiICUgKHN5cy5hcmd2WzBdLCBhcmdzWzBdKQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICBpZiBmcC5pc2F0dHkoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHJlYWRsaW5lCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaW1wb3J0IGNvZGUKKyAgICAgICAgY2xhc3MgUmVzdHJpY3RlZENvbnNvbGUoY29kZS5JbnRlcmFjdGl2ZUNvbnNvbGUpOgorICAgICAgICAgICAgZGVmIHJ1bmNvZGUoc2VsZiwgY28pOgorICAgICAgICAgICAgICAgIHNlbGYubG9jYWxzWydfX2J1aWx0aW5zX18nXSA9IHIubW9kdWxlc1snX19idWlsdGluX18nXQorICAgICAgICAgICAgICAgIHIuc19hcHBseShjb2RlLkludGVyYWN0aXZlQ29uc29sZS5ydW5jb2RlLCAoc2VsZiwgY28pKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBSZXN0cmljdGVkQ29uc29sZShyLm1vZHVsZXNbJ19fbWFpbl9fJ10uX19kaWN0X18pLmludGVyYWN0KCkKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQsIG46CisgICAgICAgICAgICByZXR1cm4gbgorICAgIGVsc2U6CisgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBjID0gY29tcGlsZSh0ZXh0LCBmcC5uYW1lLCAnZXhlYycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHIuc19leGVjKGMpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCBuOgorICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICByZXR1cm4gMQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgc3lzLmV4aXQodGVzdCgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9yZXhlYy5weWMgYi9saWIvcHl0aG9uMi43L3JleGVjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWQwOWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yZXhlYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9yZXhlYy5weW8gYi9saWIvcHl0aG9uMi43L3JleGVjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWQwOWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yZXhlYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9yZmM4MjIucHkgYi9saWIvcHl0aG9uMi43L3JmYzgyMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjVkOGRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yZmM4MjIucHkKQEAgLTAsMCArMSwxMDExIEBACisiIiJSRkMgMjgyMiBtZXNzYWdlIG1hbmlwdWxhdGlvbi4KKworTm90ZTogVGhpcyBpcyBvbmx5IGEgdmVyeSByb3VnaCBza2V0Y2ggb2YgYSBmdWxsIFJGQy04MjIgcGFyc2VyOyBpbiBwYXJ0aWN1bGFyCit0aGUgdG9rZW5pemluZyBvZiBhZGRyZXNzZXMgZG9lcyBub3QgYWRoZXJlIHRvIGFsbCB0aGUgcXVvdGluZyBydWxlcy4KKworTm90ZTogUkZDIDI4MjIgaXMgYSBsb25nIGF3YWl0ZWQgdXBkYXRlIHRvIFJGQyA4MjIuICBUaGlzIG1vZHVsZSBzaG91bGQKK2NvbmZvcm0gdG8gUkZDIDI4MjIsIGFuZCBpcyB0aHVzIG1pcy1uYW1lZCAoaXQncyBub3Qgd29ydGggcmVuYW1pbmcgaXQpLiAgU29tZQorZWZmb3J0IGF0IFJGQyAyODIyIHVwZGF0ZXMgaGF2ZSBiZWVuIG1hZGUsIGJ1dCBhIHRob3JvdWdoIGF1ZGl0IGhhcyBub3QgYmVlbgorcGVyZm9ybWVkLiAgQ29uc2lkZXIgYW55IFJGQyAyODIyIG5vbi1jb25mb3JtYW5jZSB0byBiZSBhIGJ1Zy4KKworICAgIFJGQyAyODIyOiBodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMjgyMi5odG1sCisgICAgUkZDIDgyMiA6IGh0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmM4MjIuaHRtbCAob2Jzb2xldGUpCisKK0RpcmVjdGlvbnMgZm9yIHVzZToKKworVG8gY3JlYXRlIGEgTWVzc2FnZSBvYmplY3Q6IGZpcnN0IG9wZW4gYSBmaWxlLCBlLmcuOgorCisgIGZwID0gb3BlbihmaWxlLCAncicpCisKK1lvdSBjYW4gdXNlIGFueSBvdGhlciBsZWdhbCB3YXkgb2YgZ2V0dGluZyBhbiBvcGVuIGZpbGUgb2JqZWN0LCBlLmcuIHVzZQorc3lzLnN0ZGluIG9yIGNhbGwgb3MucG9wZW4oKS4gIFRoZW4gcGFzcyB0aGUgb3BlbiBmaWxlIG9iamVjdCB0byB0aGUgTWVzc2FnZSgpCitjb25zdHJ1Y3RvcjoKKworICBtID0gTWVzc2FnZShmcCkKKworVGhpcyBjbGFzcyBjYW4gd29yayB3aXRoIGFueSBpbnB1dCBvYmplY3QgdGhhdCBzdXBwb3J0cyBhIHJlYWRsaW5lIG1ldGhvZC4gIElmCit0aGUgaW5wdXQgb2JqZWN0IGhhcyBzZWVrIGFuZCB0ZWxsIGNhcGFiaWxpdHksIHRoZSByZXdpbmRib2R5IG1ldGhvZCB3aWxsCit3b3JrOyBhbHNvIGlsbGVnYWwgbGluZXMgd2lsbCBiZSBwdXNoZWQgYmFjayBvbnRvIHRoZSBpbnB1dCBzdHJlYW0uICBJZiB0aGUKK2lucHV0IG9iamVjdCBsYWNrcyBzZWVrIGJ1dCBoYXMgYW4gYHVucmVhZCcgbWV0aG9kIHRoYXQgY2FuIHB1c2ggYmFjayBhIGxpbmUKK29mIGlucHV0LCBNZXNzYWdlIHdpbGwgdXNlIHRoYXQgdG8gcHVzaCBiYWNrIGlsbGVnYWwgbGluZXMuICBUaHVzIHRoaXMgY2xhc3MKK2NhbiBiZSB1c2VkIHRvIHBhcnNlIG1lc3NhZ2VzIGNvbWluZyBmcm9tIGEgYnVmZmVyZWQgc3RyZWFtLgorCitUaGUgb3B0aW9uYWwgYHNlZWthYmxlJyBhcmd1bWVudCBpcyBwcm92aWRlZCBhcyBhIHdvcmthcm91bmQgZm9yIGNlcnRhaW4gc3RkaW8KK2xpYnJhcmllcyBpbiB3aGljaCB0ZWxsKCkgZGlzY2FyZHMgYnVmZmVyZWQgZGF0YSBiZWZvcmUgZGlzY292ZXJpbmcgdGhhdCB0aGUKK2xzZWVrKCkgc3lzdGVtIGNhbGwgZG9lc24ndCB3b3JrLiAgRm9yIG1heGltdW0gcG9ydGFiaWxpdHksIHlvdSBzaG91bGQgc2V0IHRoZQorc2Vla2FibGUgYXJndW1lbnQgdG8gemVybyB0byBwcmV2ZW50IHRoYXQgaW5pdGlhbCBcY29kZXt0ZWxsfSB3aGVuIHBhc3NpbmcgaW4KK2FuIHVuc2Vla2FibGUgb2JqZWN0IHN1Y2ggYXMgYSBmaWxlIG9iamVjdCBjcmVhdGVkIGZyb20gYSBzb2NrZXQgb2JqZWN0LiAgSWYKK2l0IGlzIDEgb24gZW50cnkgLS0gd2hpY2ggaXQgaXMgYnkgZGVmYXVsdCAtLSB0aGUgdGVsbCgpIG1ldGhvZCBvZiB0aGUgb3BlbgorZmlsZSBvYmplY3QgaXMgY2FsbGVkIG9uY2U7IGlmIHRoaXMgcmFpc2VzIGFuIGV4Y2VwdGlvbiwgc2Vla2FibGUgaXMgcmVzZXQgdG8KKzAuICBGb3Igb3RoZXIgbm9uemVybyB2YWx1ZXMgb2Ygc2Vla2FibGUsIHRoaXMgdGVzdCBpcyBub3QgbWFkZS4KKworVG8gZ2V0IHRoZSB0ZXh0IG9mIGEgcGFydGljdWxhciBoZWFkZXIgdGhlcmUgYXJlIHNldmVyYWwgbWV0aG9kczoKKworICBzdHIgPSBtLmdldGhlYWRlcihuYW1lKQorICBzdHIgPSBtLmdldHJhd2hlYWRlcihuYW1lKQorCit3aGVyZSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIsIGUuZy4gJ1N1YmplY3QnLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdAorZ2V0aGVhZGVyKCkgc3RyaXBzIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCB3aGlsZSBnZXRyYXdoZWFkZXIoKQorZG9lc24ndC4gIEJvdGggZnVuY3Rpb25zIHJldGFpbiBlbWJlZGRlZCB3aGl0ZXNwYWNlIChpbmNsdWRpbmcgbmV3bGluZXMpCitleGFjdGx5IGFzIHRoZXkgYXJlIHNwZWNpZmllZCBpbiB0aGUgaGVhZGVyLCBhbmQgbGVhdmUgdGhlIGNhc2Ugb2YgdGhlIHRleHQKK3VuY2hhbmdlZC4KKworRm9yIGFkZHJlc3NlcyBhbmQgYWRkcmVzcyBsaXN0cyB0aGVyZSBhcmUgZnVuY3Rpb25zCisKKyAgcmVhbG5hbWUsIG1haWxhZGRyZXNzID0gbS5nZXRhZGRyKG5hbWUpCisgIGxpc3QgPSBtLmdldGFkZHJsaXN0KG5hbWUpCisKK3doZXJlIHRoZSBsYXR0ZXIgcmV0dXJucyBhIGxpc3Qgb2YgKHJlYWxuYW1lLCBtYWlsYWRkcikgdHVwbGVzLgorCitUaGVyZSBpcyBhbHNvIGEgbWV0aG9kCisKKyAgdGltZSA9IG0uZ2V0ZGF0ZShuYW1lKQorCit3aGljaCBwYXJzZXMgYSBEYXRlLWxpa2UgZmllbGQgYW5kIHJldHVybnMgYSB0aW1lLWNvbXBhdGlibGUgdHVwbGUsCitpLmUuIGEgdHVwbGUgc3VjaCBhcyByZXR1cm5lZCBieSB0aW1lLmxvY2FsdGltZSgpIG9yIGFjY2VwdGVkIGJ5Cit0aW1lLm1rdGltZSgpLgorCitTZWUgdGhlIGNsYXNzIGRlZmluaXRpb24gZm9yIGxvd2VyIGxldmVsIGFjY2VzcyBtZXRob2RzLgorCitUaGVyZSBhcmUgYWxzbyBzb21lIHV0aWxpdHkgZnVuY3Rpb25zIGhlcmUuCisiIiIKKyMgQ2xlYW51cCBhbmQgZXh0ZW5zaW9ucyBieSBFcmljIFMuIFJheW1vbmQgPGVzckB0aHlyc3VzLmNvbT4KKworaW1wb3J0IHRpbWUKKworZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJpbiAzLngsIHJmYzgyMiBoYXMgYmVlbiByZW1vdmVkIGluIGZhdm9yIG9mIHRoZSBlbWFpbCBwYWNrYWdlIiwKKyAgICAgICAgIHN0YWNrbGV2ZWw9MikKKworX19hbGxfXyA9IFsiTWVzc2FnZSIsIkFkZHJlc3NMaXN0IiwicGFyc2VkYXRlIiwicGFyc2VkYXRlX3R6IiwibWt0aW1lX3R6Il0KKworX2JsYW5rbGluZXMgPSAoJ1xyXG4nLCAnXG4nKSAgICAgICAgICAgICMgT3B0aW1pemF0aW9uIGZvciBpc2xhc3QoKQorCisKK2NsYXNzIE1lc3NhZ2U6CisgICAgIiIiUmVwcmVzZW50cyBhIHNpbmdsZSBSRkMgMjgyMi1jb21wbGlhbnQgbWVzc2FnZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCwgc2Vla2FibGUgPSAxKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSB0aGUgY2xhc3MgaW5zdGFuY2UgYW5kIHJlYWQgdGhlIGhlYWRlcnMuIiIiCisgICAgICAgIGlmIHNlZWthYmxlID09IDE6CisgICAgICAgICAgICAjIEV4ZXJjaXNlIHRlbGwoKSB0byBtYWtlIHN1cmUgaXQgd29ya3MKKyAgICAgICAgICAgICMgKGFuZCB0aGVuIGFzc3VtZSBzZWVrKCkgd29ya3MsIHRvbykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmcC50ZWxsKCkKKyAgICAgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgICAgIHNlZWthYmxlID0gMAorICAgICAgICBzZWxmLmZwID0gZnAKKyAgICAgICAgc2VsZi5zZWVrYWJsZSA9IHNlZWthYmxlCisgICAgICAgIHNlbGYuc3RhcnRvZmhlYWRlcnMgPSBOb25lCisgICAgICAgIHNlbGYuc3RhcnRvZmJvZHkgPSBOb25lCisgICAgICAgICMKKyAgICAgICAgaWYgc2VsZi5zZWVrYWJsZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0b2ZoZWFkZXJzID0gc2VsZi5mcC50ZWxsKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuc2Vla2FibGUgPSAwCisgICAgICAgICMKKyAgICAgICAgc2VsZi5yZWFkaGVhZGVycygpCisgICAgICAgICMKKyAgICAgICAgaWYgc2VsZi5zZWVrYWJsZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0b2Zib2R5ID0gc2VsZi5mcC50ZWxsKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuc2Vla2FibGUgPSAwCisKKyAgICBkZWYgcmV3aW5kYm9keShzZWxmKToKKyAgICAgICAgIiIiUmV3aW5kIHRoZSBmaWxlIHRvIHRoZSBzdGFydCBvZiB0aGUgYm9keSAoaWYgc2Vla2FibGUpLiIiIgorICAgICAgICBpZiBub3Qgc2VsZi5zZWVrYWJsZToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJ1bnNlZWthYmxlIGZpbGUiCisgICAgICAgIHNlbGYuZnAuc2VlayhzZWxmLnN0YXJ0b2Zib2R5KQorCisgICAgZGVmIHJlYWRoZWFkZXJzKHNlbGYpOgorICAgICAgICAiIiJSZWFkIGhlYWRlciBsaW5lcy4KKworICAgICAgICBSZWFkIGhlYWRlciBsaW5lcyB1cCB0byB0aGUgZW50aXJlbHkgYmxhbmsgbGluZSB0aGF0IHRlcm1pbmF0ZXMgdGhlbS4KKyAgICAgICAgVGhlIChub3JtYWxseSBibGFuaykgbGluZSB0aGF0IGVuZHMgdGhlIGhlYWRlcnMgaXMgc2tpcHBlZCwgYnV0IG5vdAorICAgICAgICBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuZWQgbGlzdC4gIElmIGEgbm9uLWhlYWRlciBsaW5lIGVuZHMgdGhlIGhlYWRlcnMsCisgICAgICAgICh3aGljaCBpcyBhbiBlcnJvciksIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBiYWNrc3BhY2Ugb3ZlciBpdDsgaXQgaXMKKyAgICAgICAgbmV2ZXIgaW5jbHVkZWQgaW4gdGhlIHJldHVybmVkIGxpc3QuCisKKyAgICAgICAgVGhlIHZhcmlhYmxlIHNlbGYuc3RhdHVzIGlzIHNldCB0byB0aGUgZW1wdHkgc3RyaW5nIGlmIGFsbCB3ZW50IHdlbGwsCisgICAgICAgIG90aGVyd2lzZSBpdCBpcyBhbiBlcnJvciBtZXNzYWdlLiAgVGhlIHZhcmlhYmxlIHNlbGYuaGVhZGVycyBpcyBhCisgICAgICAgIGNvbXBsZXRlbHkgdW5pbnRlcnByZXRlZCBsaXN0IG9mIGxpbmVzIGNvbnRhaW5lZCBpbiB0aGUgaGVhZGVyIChzbworICAgICAgICBwcmludGluZyB0aGVtIHdpbGwgcmVwcm9kdWNlIHRoZSBoZWFkZXIgZXhhY3RseSBhcyBpdCBhcHBlYXJzIGluIHRoZQorICAgICAgICBmaWxlKS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZGljdCA9IHt9CisgICAgICAgIHNlbGYudW5peGZyb20gPSAnJworICAgICAgICBzZWxmLmhlYWRlcnMgPSBsc3QgPSBbXQorICAgICAgICBzZWxmLnN0YXR1cyA9ICcnCisgICAgICAgIGhlYWRlcnNlZW4gPSAiIgorICAgICAgICBmaXJzdGxpbmUgPSAxCisgICAgICAgIHN0YXJ0b2ZsaW5lID0gdW5yZWFkID0gdGVsbCA9IE5vbmUKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLmZwLCAndW5yZWFkJyk6CisgICAgICAgICAgICB1bnJlYWQgPSBzZWxmLmZwLnVucmVhZAorICAgICAgICBlbGlmIHNlbGYuc2Vla2FibGU6CisgICAgICAgICAgICB0ZWxsID0gc2VsZi5mcC50ZWxsCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBpZiB0ZWxsOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRvZmxpbmUgPSB0ZWxsKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRvZmxpbmUgPSB0ZWxsID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlZWthYmxlID0gMAorICAgICAgICAgICAgbGluZSA9IHNlbGYuZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSAnRU9GIGluIGhlYWRlcnMnCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICMgU2tpcCB1bml4IEZyb20gbmFtZSB0aW1lIGxpbmVzCisgICAgICAgICAgICBpZiBmaXJzdGxpbmUgYW5kIGxpbmUuc3RhcnRzd2l0aCgnRnJvbSAnKToKKyAgICAgICAgICAgICAgICBzZWxmLnVuaXhmcm9tID0gc2VsZi51bml4ZnJvbSArIGxpbmUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmlyc3RsaW5lID0gMAorICAgICAgICAgICAgaWYgaGVhZGVyc2VlbiBhbmQgbGluZVswXSBpbiAnIFx0JzoKKyAgICAgICAgICAgICAgICAjIEl0J3MgYSBjb250aW51YXRpb24gbGluZS4KKyAgICAgICAgICAgICAgICBsc3QuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICAgICAgeCA9IChzZWxmLmRpY3RbaGVhZGVyc2Vlbl0gKyAiXG4gIiArIGxpbmUuc3RyaXAoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmRpY3RbaGVhZGVyc2Vlbl0gPSB4LnN0cmlwKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBzZWxmLmlzY29tbWVudChsaW5lKToKKyAgICAgICAgICAgICAgICAjIEl0J3MgYSBjb21tZW50LiAgSWdub3JlIGl0LgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHNlbGYuaXNsYXN0KGxpbmUpOgorICAgICAgICAgICAgICAgICMgTm90ZSEgTm8gcHVzaGJhY2sgaGVyZSEgIFRoZSBkZWxpbWl0ZXIgbGluZSBnZXRzIGVhdGVuLgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBoZWFkZXJzZWVuID0gc2VsZi5pc2hlYWRlcihsaW5lKQorICAgICAgICAgICAgaWYgaGVhZGVyc2VlbjoKKyAgICAgICAgICAgICAgICAjIEl0J3MgYSBsZWdhbCBoZWFkZXIgbGluZSwgc2F2ZSBpdC4KKyAgICAgICAgICAgICAgICBsc3QuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi5kaWN0W2hlYWRlcnNlZW5dID0gbGluZVtsZW4oaGVhZGVyc2VlbikrMTpdLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEl0J3Mgbm90IGEgaGVhZGVyIGxpbmU7IHRocm93IGl0IGJhY2sgYW5kIHN0b3AgaGVyZS4KKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kaWN0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9ICdObyBoZWFkZXJzJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gJ05vbi1oZWFkZXIgbGluZSB3aGVyZSBoZWFkZXIgZXhwZWN0ZWQnCisgICAgICAgICAgICAgICAgIyBUcnkgdG8gdW5kbyB0aGUgcmVhZC4KKyAgICAgICAgICAgICAgICBpZiB1bnJlYWQ6CisgICAgICAgICAgICAgICAgICAgIHVucmVhZChsaW5lKQorICAgICAgICAgICAgICAgIGVsaWYgdGVsbDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHN0YXJ0b2ZsaW5lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gc2VsZi5zdGF0dXMgKyAnOyBiYWQgc2VlaycKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIGlzaGVhZGVyKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJEZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuIGxpbmUgaXMgYSBsZWdhbCBoZWFkZXIuCisKKyAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgaGVhZGVyIG5hbWUsIHN1aXRhYmx5IGNhbm9uaWNhbGl6ZWQuCisgICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gdXNlIE1lc3NhZ2UgcGFyc2luZyBvbiB0YWdnZWQKKyAgICAgICAgZGF0YSBpbiBSRkMgMjgyMi1saWtlIGZvcm1hdHMgd2l0aCBzcGVjaWFsIGhlYWRlciBmb3JtYXRzLgorICAgICAgICAiIiIKKyAgICAgICAgaSA9IGxpbmUuZmluZCgnOicpCisgICAgICAgIGlmIGkgPiAwOgorICAgICAgICAgICAgcmV0dXJuIGxpbmVbOmldLmxvd2VyKCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBpc2xhc3Qoc2VsZiwgbGluZSk6CisgICAgICAgICIiIkRldGVybWluZSB3aGV0aGVyIGEgbGluZSBpcyBhIGxlZ2FsIGVuZCBvZiBSRkMgMjgyMiBoZWFkZXJzLgorCisgICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgeW91ciBhcHBsaWNhdGlvbiB3YW50cyB0byBiZW5kIHRoZQorICAgICAgICBydWxlcywgZS5nLiB0byBzdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBvciB0byByZWNvZ25pemUgTUggdGVtcGxhdGUKKyAgICAgICAgc2VwYXJhdG9ycyAoJy0tLS0tLS0tJykuICBGb3IgY29udmVuaWVuY2UgKGUuZy4gZm9yIGNvZGUgcmVhZGluZyBmcm9tCisgICAgICAgIHNvY2tldHMpIGEgbGluZSBjb25zaXN0aW5nIG9mIFxcclxcbiBhbHNvIG1hdGNoZXMuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gbGluZSBpbiBfYmxhbmtsaW5lcworCisgICAgZGVmIGlzY29tbWVudChzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiRGV0ZXJtaW5lIHdoZXRoZXIgYSBsaW5lIHNob3VsZCBiZSBza2lwcGVkIGVudGlyZWx5LgorCisgICAgICAgIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4gb3JkZXIgdG8gdXNlIE1lc3NhZ2UgcGFyc2luZyBvbiB0YWdnZWQKKyAgICAgICAgZGF0YSBpbiBSRkMgMjgyMi1saWtlIGZvcm1hdHMgdGhhdCBzdXBwb3J0IGVtYmVkZGVkIGNvbW1lbnRzIG9yCisgICAgICAgIGZyZWUtdGV4dCBkYXRhLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZ2V0YWxsbWF0Y2hpbmdoZWFkZXJzKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJGaW5kIGFsbCBoZWFkZXIgbGluZXMgbWF0Y2hpbmcgYSBnaXZlbiBoZWFkZXIgbmFtZS4KKworICAgICAgICBMb29rIHRocm91Z2ggdGhlIGxpc3Qgb2YgaGVhZGVycyBhbmQgZmluZCBhbGwgbGluZXMgbWF0Y2hpbmcgYSBnaXZlbgorICAgICAgICBoZWFkZXIgbmFtZSAoYW5kIHRoZWlyIGNvbnRpbnVhdGlvbiBsaW5lcykuICBBIGxpc3Qgb2YgdGhlIGxpbmVzIGlzCisgICAgICAgIHJldHVybmVkLCB3aXRob3V0IGludGVycHJldGF0aW9uLiAgSWYgdGhlIGhlYWRlciBkb2VzIG5vdCBvY2N1ciwgYW4KKyAgICAgICAgZW1wdHkgbGlzdCBpcyByZXR1cm5lZC4gIElmIHRoZSBoZWFkZXIgb2NjdXJzIG11bHRpcGxlIHRpbWVzLCBhbGwKKyAgICAgICAgb2NjdXJyZW5jZXMgYXJlIHJldHVybmVkLiAgQ2FzZSBpcyBub3QgaW1wb3J0YW50IGluIHRoZSBoZWFkZXIgbmFtZS4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkgKyAnOicKKyAgICAgICAgbiA9IGxlbihuYW1lKQorICAgICAgICBsc3QgPSBbXQorICAgICAgICBoaXQgPSAwCisgICAgICAgIGZvciBsaW5lIGluIHNlbGYuaGVhZGVyczoKKyAgICAgICAgICAgIGlmIGxpbmVbOm5dLmxvd2VyKCkgPT0gbmFtZToKKyAgICAgICAgICAgICAgICBoaXQgPSAxCisgICAgICAgICAgICBlbGlmIG5vdCBsaW5lWzoxXS5pc3NwYWNlKCk6CisgICAgICAgICAgICAgICAgaGl0ID0gMAorICAgICAgICAgICAgaWYgaGl0OgorICAgICAgICAgICAgICAgIGxzdC5hcHBlbmQobGluZSkKKyAgICAgICAgcmV0dXJuIGxzdAorCisgICAgZGVmIGdldGZpcnN0bWF0Y2hpbmdoZWFkZXIoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkdldCB0aGUgZmlyc3QgaGVhZGVyIGxpbmUgbWF0Y2hpbmcgbmFtZS4KKworICAgICAgICBUaGlzIGlzIHNpbWlsYXIgdG8gZ2V0YWxsbWF0Y2hpbmdoZWFkZXJzLCBidXQgaXQgcmV0dXJucyBvbmx5IHRoZQorICAgICAgICBmaXJzdCBtYXRjaGluZyBoZWFkZXIgKGFuZCBpdHMgY29udGludWF0aW9uIGxpbmVzKS4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkgKyAnOicKKyAgICAgICAgbiA9IGxlbihuYW1lKQorICAgICAgICBsc3QgPSBbXQorICAgICAgICBoaXQgPSAwCisgICAgICAgIGZvciBsaW5lIGluIHNlbGYuaGVhZGVyczoKKyAgICAgICAgICAgIGlmIGhpdDoKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZVs6MV0uaXNzcGFjZSgpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBsaW5lWzpuXS5sb3dlcigpID09IG5hbWU6CisgICAgICAgICAgICAgICAgaGl0ID0gMQorICAgICAgICAgICAgaWYgaGl0OgorICAgICAgICAgICAgICAgIGxzdC5hcHBlbmQobGluZSkKKyAgICAgICAgcmV0dXJuIGxzdAorCisgICAgZGVmIGdldHJhd2hlYWRlcihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiQSBoaWdoZXItbGV2ZWwgaW50ZXJmYWNlIHRvIGdldGZpcnN0bWF0Y2hpbmdoZWFkZXIoKS4KKworICAgICAgICBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbGl0ZXJhbCB0ZXh0IG9mIHRoZSBoZWFkZXIgYnV0IHdpdGggdGhlCisgICAgICAgIGtleXdvcmQgc3RyaXBwZWQuICBBbGwgbGVhZGluZywgdHJhaWxpbmcgYW5kIGVtYmVkZGVkIHdoaXRlc3BhY2UgaXMKKyAgICAgICAga2VwdCBpbiB0aGUgc3RyaW5nLCBob3dldmVyLiAgUmV0dXJuIE5vbmUgaWYgdGhlIGhlYWRlciBkb2VzIG5vdAorICAgICAgICBvY2N1ci4KKyAgICAgICAgIiIiCisKKyAgICAgICAgbHN0ID0gc2VsZi5nZXRmaXJzdG1hdGNoaW5naGVhZGVyKG5hbWUpCisgICAgICAgIGlmIG5vdCBsc3Q6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBsc3RbMF0gPSBsc3RbMF1bbGVuKG5hbWUpICsgMTpdCisgICAgICAgIHJldHVybiAnJy5qb2luKGxzdCkKKworICAgIGRlZiBnZXRoZWFkZXIoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgIiIiR2V0IHRoZSBoZWFkZXIgdmFsdWUgZm9yIGEgbmFtZS4KKworICAgICAgICBUaGlzIGlzIHRoZSBub3JtYWwgaW50ZXJmYWNlOiBpdCByZXR1cm5zIGEgc3RyaXBwZWQgdmVyc2lvbiBvZiB0aGUKKyAgICAgICAgaGVhZGVyIHZhbHVlIGZvciBhIGdpdmVuIGhlYWRlciBuYW1lLCBvciBOb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisgICAgICAgIFRoaXMgdXNlcyB0aGUgZGljdGlvbmFyeSB2ZXJzaW9uIHdoaWNoIGZpbmRzIHRoZSAqbGFzdCogc3VjaCBoZWFkZXIuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5kaWN0LmdldChuYW1lLmxvd2VyKCksIGRlZmF1bHQpCisgICAgZ2V0ID0gZ2V0aGVhZGVyCisKKyAgICBkZWYgZ2V0aGVhZGVycyhzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiR2V0IGFsbCB2YWx1ZXMgZm9yIGEgaGVhZGVyLgorCisgICAgICAgIFRoaXMgcmV0dXJucyBhIGxpc3Qgb2YgdmFsdWVzIGZvciBoZWFkZXJzIGdpdmVuIG1vcmUgdGhhbiBvbmNlOyBlYWNoCisgICAgICAgIHZhbHVlIGluIHRoZSByZXN1bHQgbGlzdCBpcyBzdHJpcHBlZCBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIHJlc3VsdCBvZgorICAgICAgICBnZXRoZWFkZXIoKS4gIElmIHRoZSBoZWFkZXIgaXMgbm90IGdpdmVuLCByZXR1cm4gYW4gZW1wdHkgbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGN1cnJlbnQgPSAnJworICAgICAgICBoYXZlX2hlYWRlciA9IDAKKyAgICAgICAgZm9yIHMgaW4gc2VsZi5nZXRhbGxtYXRjaGluZ2hlYWRlcnMobmFtZSk6CisgICAgICAgICAgICBpZiBzWzBdLmlzc3BhY2UoKToKKyAgICAgICAgICAgICAgICBpZiBjdXJyZW50OgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gIiVzXG4gJXMiICUgKGN1cnJlbnQsIHMuc3RyaXAoKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gcy5zdHJpcCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGhhdmVfaGVhZGVyOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGN1cnJlbnQpCisgICAgICAgICAgICAgICAgY3VycmVudCA9IHNbcy5maW5kKCI6IikgKyAxOl0uc3RyaXAoKQorICAgICAgICAgICAgICAgIGhhdmVfaGVhZGVyID0gMQorICAgICAgICBpZiBoYXZlX2hlYWRlcjoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY3VycmVudCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGdldGFkZHIoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkdldCBhIHNpbmdsZSBhZGRyZXNzIGZyb20gYSBoZWFkZXIsIGFzIGEgdHVwbGUuCisKKyAgICAgICAgQW4gZXhhbXBsZSByZXR1cm4gdmFsdWU6CisgICAgICAgICgnR3VpZG8gdmFuIFJvc3N1bScsICdndWlkb0Bjd2kubmwnKQorICAgICAgICAiIiIKKyAgICAgICAgIyBOZXcsIGJ5IEJlbiBFc2NvdG8KKyAgICAgICAgYWxpc3QgPSBzZWxmLmdldGFkZHJsaXN0KG5hbWUpCisgICAgICAgIGlmIGFsaXN0OgorICAgICAgICAgICAgcmV0dXJuIGFsaXN0WzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKE5vbmUsIE5vbmUpCisKKyAgICBkZWYgZ2V0YWRkcmxpc3Qoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkdldCBhIGxpc3Qgb2YgYWRkcmVzc2VzIGZyb20gYSBoZWFkZXIuCisKKyAgICAgICAgUmV0cmlldmVzIGEgbGlzdCBvZiBhZGRyZXNzZXMgZnJvbSBhIGhlYWRlciwgd2hlcmUgZWFjaCBhZGRyZXNzIGlzIGEKKyAgICAgICAgdHVwbGUgYXMgcmV0dXJuZWQgYnkgZ2V0YWRkcigpLiAgU2NhbnMgYWxsIG5hbWVkIGhlYWRlcnMsIHNvIGl0IHdvcmtzCisgICAgICAgIHByb3Blcmx5IHdpdGggbXVsdGlwbGUgVG86IG9yIENjOiBoZWFkZXJzIGZvciBleGFtcGxlLgorICAgICAgICAiIiIKKyAgICAgICAgcmF3ID0gW10KKyAgICAgICAgZm9yIGggaW4gc2VsZi5nZXRhbGxtYXRjaGluZ2hlYWRlcnMobmFtZSk6CisgICAgICAgICAgICBpZiBoWzBdIGluICcgXHQnOgorICAgICAgICAgICAgICAgIHJhdy5hcHBlbmQoaCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgcmF3OgorICAgICAgICAgICAgICAgICAgICByYXcuYXBwZW5kKCcsICcpCisgICAgICAgICAgICAgICAgaSA9IGguZmluZCgnOicpCisgICAgICAgICAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGFkZHIgPSBoW2krMTpdCisgICAgICAgICAgICAgICAgcmF3LmFwcGVuZChhZGRyKQorICAgICAgICBhbGxhZGRycyA9ICcnLmpvaW4ocmF3KQorICAgICAgICBhID0gQWRkcmVzc0xpc3QoYWxsYWRkcnMpCisgICAgICAgIHJldHVybiBhLmFkZHJlc3NsaXN0CisKKyAgICBkZWYgZ2V0ZGF0ZShzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiUmV0cmlldmUgYSBkYXRlIGZpZWxkIGZyb20gYSBoZWFkZXIuCisKKyAgICAgICAgUmV0cmlldmVzIGEgZGF0ZSBmaWVsZCBmcm9tIHRoZSBuYW1lZCBoZWFkZXIsIHJldHVybmluZyBhIHR1cGxlCisgICAgICAgIGNvbXBhdGlibGUgd2l0aCB0aW1lLm1rdGltZSgpLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IHNlbGZbbmFtZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHBhcnNlZGF0ZShkYXRhKQorCisgICAgZGVmIGdldGRhdGVfdHooc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHJpZXZlIGEgZGF0ZSBmaWVsZCBmcm9tIGEgaGVhZGVyIGFzIGEgMTAtdHVwbGUuCisKKyAgICAgICAgVGhlIGZpcnN0IDkgZWxlbWVudHMgbWFrZSB1cCBhIHR1cGxlIGNvbXBhdGlibGUgd2l0aCB0aW1lLm1rdGltZSgpLAorICAgICAgICBhbmQgdGhlIDEwdGggaXMgdGhlIG9mZnNldCBvZiB0aGUgcG9zdGVyJ3MgdGltZSB6b25lIGZyb20gR01UL1VUQy4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmW25hbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBwYXJzZWRhdGVfdHooZGF0YSkKKworCisgICAgIyBBY2Nlc3MgYXMgYSBkaWN0aW9uYXJ5IChvbmx5IGZpbmRzICpsYXN0KiBoZWFkZXIgb2YgZWFjaCB0eXBlKToKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIG51bWJlciBvZiBoZWFkZXJzIGluIGEgbWVzc2FnZS4iIiIKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmRpY3QpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkdldCBhIHNwZWNpZmljIGhlYWRlciwgYXMgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRpY3RbbmFtZS5sb3dlcigpXQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgIiIiU2V0IHRoZSB2YWx1ZSBvZiBhIGhlYWRlci4KKworICAgICAgICBOb3RlOiBUaGlzIGlzIG5vdCBhIHBlcmZlY3QgaW52ZXJzaW9uIG9mIF9fZ2V0aXRlbV9fLCBiZWNhdXNlIGFueQorICAgICAgICBjaGFuZ2VkIGhlYWRlcnMgZ2V0IHN0dWNrIGF0IHRoZSBlbmQgb2YgdGhlIHJhdy1oZWFkZXJzIGxpc3QgcmF0aGVyCisgICAgICAgIHRoYW4gd2hlcmUgdGhlIGFsdGVyZWQgaGVhZGVyIHdhcy4KKyAgICAgICAgIiIiCisgICAgICAgIGRlbCBzZWxmW25hbWVdICMgV29uJ3QgZmFpbCBpZiBpdCBkb2Vzbid0IGV4aXN0CisgICAgICAgIHNlbGYuZGljdFtuYW1lLmxvd2VyKCldID0gdmFsdWUKKyAgICAgICAgdGV4dCA9IG5hbWUgKyAiOiAiICsgdmFsdWUKKyAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdCgiXG4iKToKKyAgICAgICAgICAgIHNlbGYuaGVhZGVycy5hcHBlbmQobGluZSArICJcbiIpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkRlbGV0ZSBhbGwgb2NjdXJyZW5jZXMgb2YgYSBzcGVjaWZpYyBoZWFkZXIsIGlmIGl0IGlzIHByZXNlbnQuIiIiCisgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgaWYgbm90IG5hbWUgaW4gc2VsZi5kaWN0OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGRlbCBzZWxmLmRpY3RbbmFtZV0KKyAgICAgICAgbmFtZSA9IG5hbWUgKyAnOicKKyAgICAgICAgbiA9IGxlbihuYW1lKQorICAgICAgICBsc3QgPSBbXQorICAgICAgICBoaXQgPSAwCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmhlYWRlcnMpKToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmhlYWRlcnNbaV0KKyAgICAgICAgICAgIGlmIGxpbmVbOm5dLmxvd2VyKCkgPT0gbmFtZToKKyAgICAgICAgICAgICAgICBoaXQgPSAxCisgICAgICAgICAgICBlbGlmIG5vdCBsaW5lWzoxXS5pc3NwYWNlKCk6CisgICAgICAgICAgICAgICAgaGl0ID0gMAorICAgICAgICAgICAgaWYgaGl0OgorICAgICAgICAgICAgICAgIGxzdC5hcHBlbmQoaSkKKyAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQobHN0KToKKyAgICAgICAgICAgIGRlbCBzZWxmLmhlYWRlcnNbaV0KKworICAgIGRlZiBzZXRkZWZhdWx0KHNlbGYsIG5hbWUsIGRlZmF1bHQ9IiIpOgorICAgICAgICBsb3dlcm5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgaWYgbG93ZXJuYW1lIGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRpY3RbbG93ZXJuYW1lXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGV4dCA9IG5hbWUgKyAiOiAiICsgZGVmYXVsdAorICAgICAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdCgiXG4iKToKKyAgICAgICAgICAgICAgICBzZWxmLmhlYWRlcnMuYXBwZW5kKGxpbmUgKyAiXG4iKQorICAgICAgICAgICAgc2VsZi5kaWN0W2xvd2VybmFtZV0gPSBkZWZhdWx0CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorCisgICAgZGVmIGhhc19rZXkoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkRldGVybWluZSB3aGV0aGVyIGEgbWVzc2FnZSBjb250YWlucyB0aGUgbmFtZWQgaGVhZGVyLiIiIgorICAgICAgICByZXR1cm4gbmFtZS5sb3dlcigpIGluIHNlbGYuZGljdAorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiRGV0ZXJtaW5lIHdoZXRoZXIgYSBtZXNzYWdlIGNvbnRhaW5zIHRoZSBuYW1lZCBoZWFkZXIuIiIiCisgICAgICAgIHJldHVybiBuYW1lLmxvd2VyKCkgaW4gc2VsZi5kaWN0CisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBpdGVyKHNlbGYuZGljdCkKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAiIiJHZXQgYWxsIG9mIGEgbWVzc2FnZSdzIGhlYWRlciBmaWVsZCBuYW1lcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZGljdC5rZXlzKCkKKworICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgICIiIkdldCBhbGwgb2YgYSBtZXNzYWdlJ3MgaGVhZGVyIGZpZWxkIHZhbHVlcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZGljdC52YWx1ZXMoKQorCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICAiIiJHZXQgYWxsIG9mIGEgbWVzc2FnZSdzIGhlYWRlcnMuCisKKyAgICAgICAgUmV0dXJucyBhIGxpc3Qgb2YgbmFtZSwgdmFsdWUgdHVwbGVzLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZGljdC5pdGVtcygpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oc2VsZi5oZWFkZXJzKQorCisKKyMgVXRpbGl0eSBmdW5jdGlvbnMKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKworIyBYWFggU2hvdWxkIGZpeCB1bnF1b3RlKCkgYW5kIHF1b3RlKCkgdG8gYmUgcmVhbGx5IGNvbmZvcm1hbnQuCisjIFhYWCBUaGUgaW52ZXJzZXMgb2YgdGhlIHBhcnNlIGZ1bmN0aW9ucyBtYXkgYWxzbyBiZSB1c2VmdWwuCisKKworZGVmIHVucXVvdGUocyk6CisgICAgIiIiUmVtb3ZlIHF1b3RlcyBmcm9tIGEgc3RyaW5nLiIiIgorICAgIGlmIGxlbihzKSA+IDE6CisgICAgICAgIGlmIHMuc3RhcnRzd2l0aCgnIicpIGFuZCBzLmVuZHN3aXRoKCciJyk6CisgICAgICAgICAgICByZXR1cm4gc1sxOi0xXS5yZXBsYWNlKCdcXFxcJywgJ1xcJykucmVwbGFjZSgnXFwiJywgJyInKQorICAgICAgICBpZiBzLnN0YXJ0c3dpdGgoJzwnKSBhbmQgcy5lbmRzd2l0aCgnPicpOgorICAgICAgICAgICAgcmV0dXJuIHNbMTotMV0KKyAgICByZXR1cm4gcworCisKK2RlZiBxdW90ZShzKToKKyAgICAiIiJBZGQgcXVvdGVzIGFyb3VuZCBhIHN0cmluZy4iIiIKKyAgICByZXR1cm4gcy5yZXBsYWNlKCdcXCcsICdcXFxcJykucmVwbGFjZSgnIicsICdcXCInKQorCisKK2RlZiBwYXJzZWFkZHIoYWRkcmVzcyk6CisgICAgIiIiUGFyc2UgYW4gYWRkcmVzcyBpbnRvIGEgKHJlYWxuYW1lLCBtYWlsYWRkcikgdHVwbGUuIiIiCisgICAgYSA9IEFkZHJlc3NMaXN0KGFkZHJlc3MpCisgICAgbHN0ID0gYS5hZGRyZXNzbGlzdAorICAgIGlmIG5vdCBsc3Q6CisgICAgICAgIHJldHVybiAoTm9uZSwgTm9uZSkKKyAgICByZXR1cm4gbHN0WzBdCisKKworY2xhc3MgQWRkcmxpc3RDbGFzczoKKyAgICAiIiJBZGRyZXNzIHBhcnNlciBjbGFzcyBieSBCZW4gRXNjb3RvLgorCisgICAgVG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgY2xhc3MgZG9lcywgaXQgaGVscHMgdG8gaGF2ZSBhIGNvcHkgb2YKKyAgICBSRkMgMjgyMiBpbiBmcm9udCBvZiB5b3UuCisKKyAgICBodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMjgyMi5odG1sCisKKyAgICBOb3RlOiB0aGlzIGNsYXNzIGludGVyZmFjZSBpcyBkZXByZWNhdGVkIGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorICAgIFVzZSByZmM4MjIuQWRkcmVzc0xpc3QgaW5zdGVhZC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWVsZCk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2UuCisKKyAgICAgICAgYGZpZWxkJyBpcyBhbiB1bnBhcnNlZCBhZGRyZXNzIGhlYWRlciBmaWVsZCwgY29udGFpbmluZyBvbmUgb3IgbW9yZQorICAgICAgICBhZGRyZXNzZXMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnNwZWNpYWxzID0gJygpPD5ALDo7LlwiW10nCisgICAgICAgIHNlbGYucG9zID0gMAorICAgICAgICBzZWxmLkxXUyA9ICcgXHQnCisgICAgICAgIHNlbGYuQ1IgPSAnXHJcbicKKyAgICAgICAgc2VsZi5hdG9tZW5kcyA9IHNlbGYuc3BlY2lhbHMgKyBzZWxmLkxXUyArIHNlbGYuQ1IKKyAgICAgICAgIyBOb3RlIHRoYXQgUkZDIDI4MjIgbm93IHNwZWNpZmllcyBgLicgYXMgb2JzLXBocmFzZSwgbWVhbmluZyB0aGF0IGl0CisgICAgICAgICMgaXMgb2Jzb2xldGUgc3ludGF4LiAgUkZDIDI4MjIgcmVxdWlyZXMgdGhhdCB3ZSByZWNvZ25pemUgb2Jzb2xldGUKKyAgICAgICAgIyBzeW50YXgsIHNvIGFsbG93IGRvdHMgaW4gcGhyYXNlcy4KKyAgICAgICAgc2VsZi5waHJhc2VlbmRzID0gc2VsZi5hdG9tZW5kcy5yZXBsYWNlKCcuJywgJycpCisgICAgICAgIHNlbGYuZmllbGQgPSBmaWVsZAorICAgICAgICBzZWxmLmNvbW1lbnRsaXN0ID0gW10KKworICAgIGRlZiBnb3RvbmV4dChzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGFkZHJlc3MuIiIiCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5MV1MgKyAnXG5ccic6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgPSBzZWxmLnBvcyArIDEKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJygnOgorICAgICAgICAgICAgICAgIHNlbGYuY29tbWVudGxpc3QuYXBwZW5kKHNlbGYuZ2V0Y29tbWVudCgpKQorICAgICAgICAgICAgZWxzZTogYnJlYWsKKworICAgIGRlZiBnZXRhZGRybGlzdChzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgYWxsIGFkZHJlc3Nlcy4KKworICAgICAgICBSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIGFsbCBvZiB0aGUgYWRkcmVzc2VzLgorICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgYWQgPSBzZWxmLmdldGFkZHJlc3MoKQorICAgICAgICB3aGlsZSBhZDoKKyAgICAgICAgICAgIHJlc3VsdCArPSBhZAorICAgICAgICAgICAgYWQgPSBzZWxmLmdldGFkZHJlc3MoKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZ2V0YWRkcmVzcyhzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgdGhlIG5leHQgYWRkcmVzcy4iIiIKKyAgICAgICAgc2VsZi5jb21tZW50bGlzdCA9IFtdCisgICAgICAgIHNlbGYuZ290b25leHQoKQorCisgICAgICAgIG9sZHBvcyA9IHNlbGYucG9zCisgICAgICAgIG9sZGNsID0gc2VsZi5jb21tZW50bGlzdAorICAgICAgICBwbGlzdCA9IHNlbGYuZ2V0cGhyYXNlbGlzdCgpCisKKyAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisgICAgICAgIHJldHVybmxpc3QgPSBbXQorCisgICAgICAgIGlmIHNlbGYucG9zID49IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgICMgQmFkIGVtYWlsIGFkZHJlc3MgdGVjaG5pY2FsbHksIG5vIGRvbWFpbi4KKyAgICAgICAgICAgIGlmIHBsaXN0OgorICAgICAgICAgICAgICAgIHJldHVybmxpc3QgPSBbKCcgJy5qb2luKHNlbGYuY29tbWVudGxpc3QpLCBwbGlzdFswXSldCisKKyAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiAnLkAnOgorICAgICAgICAgICAgIyBlbWFpbCBhZGRyZXNzIGlzIGp1c3QgYW4gYWRkcnNwZWMKKyAgICAgICAgICAgICMgdGhpcyBpc24ndCB2ZXJ5IGVmZmljaWVudCBzaW5jZSB3ZSBzdGFydCBvdmVyCisgICAgICAgICAgICBzZWxmLnBvcyA9IG9sZHBvcworICAgICAgICAgICAgc2VsZi5jb21tZW50bGlzdCA9IG9sZGNsCisgICAgICAgICAgICBhZGRyc3BlYyA9IHNlbGYuZ2V0YWRkcnNwZWMoKQorICAgICAgICAgICAgcmV0dXJubGlzdCA9IFsoJyAnLmpvaW4oc2VsZi5jb21tZW50bGlzdCksIGFkZHJzcGVjKV0KKworICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICc6JzoKKyAgICAgICAgICAgICMgYWRkcmVzcyBpcyBhIGdyb3VwCisgICAgICAgICAgICByZXR1cm5saXN0ID0gW10KKworICAgICAgICAgICAgZmllbGRsZW4gPSBsZW4oc2VsZi5maWVsZCkKKyAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICAgICAgICAgIGlmIHNlbGYucG9zIDwgZmllbGRsZW4gYW5kIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICc7JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHJldHVybmxpc3QgPSByZXR1cm5saXN0ICsgc2VsZi5nZXRhZGRyZXNzKCkKKworICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICc8JzoKKyAgICAgICAgICAgICMgQWRkcmVzcyBpcyBhIHBocmFzZSB0aGVuIGEgcm91dGUgYWRkcgorICAgICAgICAgICAgcm91dGVhZGRyID0gc2VsZi5nZXRyb3V0ZWFkZHIoKQorCisgICAgICAgICAgICBpZiBzZWxmLmNvbW1lbnRsaXN0OgorICAgICAgICAgICAgICAgIHJldHVybmxpc3QgPSBbKCcgJy5qb2luKHBsaXN0KSArICcgKCcgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAnLmpvaW4oc2VsZi5jb21tZW50bGlzdCkgKyAnKScsIHJvdXRlYWRkcildCisgICAgICAgICAgICBlbHNlOiByZXR1cm5saXN0ID0gWygnICcuam9pbihwbGlzdCksIHJvdXRlYWRkcildCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHBsaXN0OgorICAgICAgICAgICAgICAgIHJldHVybmxpc3QgPSBbKCcgJy5qb2luKHNlbGYuY29tbWVudGxpc3QpLCBwbGlzdFswXSldCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuc3BlY2lhbHM6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorCisgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICBpZiBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKSBhbmQgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJywnOgorICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICByZXR1cm4gcmV0dXJubGlzdAorCisgICAgZGVmIGdldHJvdXRlYWRkcihzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgYSByb3V0ZSBhZGRyZXNzIChSZXR1cm4tcGF0aCB2YWx1ZSkuCisKKyAgICAgICAgVGhpcyBtZXRob2QganVzdCBza2lwcyBhbGwgdGhlIHJvdXRlIHN0dWZmIGFuZCByZXR1cm5zIHRoZSBhZGRyc3BlYy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdICE9ICc8JzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGV4cGVjdHJvdXRlID0gMAorICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICBhZGxpc3QgPSAiIgorICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIGV4cGVjdHJvdXRlOgorICAgICAgICAgICAgICAgIHNlbGYuZ2V0ZG9tYWluKCkKKyAgICAgICAgICAgICAgICBleHBlY3Ryb3V0ZSA9IDAKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJz4nOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnQCc6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgICAgIGV4cGVjdHJvdXRlID0gMQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnOic6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhZGxpc3QgPSBzZWxmLmdldGFkZHJzcGVjKCkKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuZ290b25leHQoKQorCisgICAgICAgIHJldHVybiBhZGxpc3QKKworICAgIGRlZiBnZXRhZGRyc3BlYyhzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgYW4gUkZDIDI4MjIgYWRkci1zcGVjLiIiIgorICAgICAgICBhc2xpc3QgPSBbXQorCisgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcuJzoKKyAgICAgICAgICAgICAgICBhc2xpc3QuYXBwZW5kKCcuJykKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICciJzoKKyAgICAgICAgICAgICAgICBhc2xpc3QuYXBwZW5kKCciJXMiJyAlIHNlbGYuZ2V0cXVvdGUoKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5hdG9tZW5kczoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZTogYXNsaXN0LmFwcGVuZChzZWxmLmdldGF0b20oKSkKKyAgICAgICAgICAgIHNlbGYuZ290b25leHQoKQorCisgICAgICAgIGlmIHNlbGYucG9zID49IGxlbihzZWxmLmZpZWxkKSBvciBzZWxmLmZpZWxkW3NlbGYucG9zXSAhPSAnQCc6CisgICAgICAgICAgICByZXR1cm4gJycuam9pbihhc2xpc3QpCisKKyAgICAgICAgYXNsaXN0LmFwcGVuZCgnQCcpCisgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisgICAgICAgIHJldHVybiAnJy5qb2luKGFzbGlzdCkgKyBzZWxmLmdldGRvbWFpbigpCisKKyAgICBkZWYgZ2V0ZG9tYWluKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIGNvbXBsZXRlIGRvbWFpbiBuYW1lIGZyb20gYW4gYWRkcmVzcy4iIiIKKyAgICAgICAgc2RsaXN0ID0gW10KKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLkxXUzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcoJzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbW1lbnRsaXN0LmFwcGVuZChzZWxmLmdldGNvbW1lbnQoKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJ1snOgorICAgICAgICAgICAgICAgIHNkbGlzdC5hcHBlbmQoc2VsZi5nZXRkb21haW5saXRlcmFsKCkpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcuJzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICAgICAgc2RsaXN0LmFwcGVuZCgnLicpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuYXRvbWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6IHNkbGlzdC5hcHBlbmQoc2VsZi5nZXRhdG9tKCkpCisgICAgICAgIHJldHVybiAnJy5qb2luKHNkbGlzdCkKKworICAgIGRlZiBnZXRkZWxpbWl0ZWQoc2VsZiwgYmVnaW5jaGFyLCBlbmRjaGFycywgYWxsb3djb21tZW50cyA9IDEpOgorICAgICAgICAiIiJQYXJzZSBhIGhlYWRlciBmcmFnbWVudCBkZWxpbWl0ZWQgYnkgc3BlY2lhbCBjaGFyYWN0ZXJzLgorCisgICAgICAgIGBiZWdpbmNoYXInIGlzIHRoZSBzdGFydCBjaGFyYWN0ZXIgZm9yIHRoZSBmcmFnbWVudC4gIElmIHNlbGYgaXMgbm90CisgICAgICAgIGxvb2tpbmcgYXQgYW4gaW5zdGFuY2Ugb2YgYGJlZ2luY2hhcicgdGhlbiBnZXRkZWxpbWl0ZWQgcmV0dXJucyB0aGUKKyAgICAgICAgZW1wdHkgc3RyaW5nLgorCisgICAgICAgIGBlbmRjaGFycycgaXMgYSBzZXF1ZW5jZSBvZiBhbGxvd2FibGUgZW5kLWRlbGltaXRpbmcgY2hhcmFjdGVycy4KKyAgICAgICAgUGFyc2luZyBzdG9wcyB3aGVuIG9uZSBvZiB0aGVzZSBpcyBlbmNvdW50ZXJlZC4KKworICAgICAgICBJZiBgYWxsb3djb21tZW50cycgaXMgbm9uLXplcm8sIGVtYmVkZGVkIFJGQyAyODIyIGNvbW1lbnRzIGFyZSBhbGxvd2VkCisgICAgICAgIHdpdGhpbiB0aGUgcGFyc2VkIGZyYWdtZW50LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gIT0gYmVnaW5jaGFyOgorICAgICAgICAgICAgcmV0dXJuICcnCisKKyAgICAgICAgc2xpc3QgPSBbJyddCisgICAgICAgIHF1b3RlID0gMAorICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgcXVvdGUgPT0gMToKKyAgICAgICAgICAgICAgICBzbGlzdC5hcHBlbmQoc2VsZi5maWVsZFtzZWxmLnBvc10pCisgICAgICAgICAgICAgICAgcXVvdGUgPSAwCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIGVuZGNoYXJzOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBhbGxvd2NvbW1lbnRzIGFuZCBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnKCc6CisgICAgICAgICAgICAgICAgc2xpc3QuYXBwZW5kKHNlbGYuZ2V0Y29tbWVudCgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICAgICAjIGhhdmUgYWxyZWFkeSBhZHZhbmNlZCBwb3MgZnJvbSBnZXRjb21tZW50CisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICdcXCc6CisgICAgICAgICAgICAgICAgcXVvdGUgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNsaXN0LmFwcGVuZChzZWxmLmZpZWxkW3NlbGYucG9zXSkKKyAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKworICAgICAgICByZXR1cm4gJycuam9pbihzbGlzdCkKKworICAgIGRlZiBnZXRxdW90ZShzZWxmKToKKyAgICAgICAgIiIiR2V0IGEgcXVvdGUtZGVsaW1pdGVkIGZyYWdtZW50IGZyb20gc2VsZidzIGZpZWxkLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXRkZWxpbWl0ZWQoJyInLCAnIlxyJywgMCkKKworICAgIGRlZiBnZXRjb21tZW50KHNlbGYpOgorICAgICAgICAiIiJHZXQgYSBwYXJlbnRoZXNpcy1kZWxpbWl0ZWQgZnJhZ21lbnQgZnJvbSBzZWxmJ3MgZmllbGQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldGRlbGltaXRlZCgnKCcsICcpXHInLCAxKQorCisgICAgZGVmIGdldGRvbWFpbmxpdGVyYWwoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGFuIFJGQyAyODIyIGRvbWFpbi1saXRlcmFsLiIiIgorICAgICAgICByZXR1cm4gJ1slc10nICUgc2VsZi5nZXRkZWxpbWl0ZWQoJ1snLCAnXVxyJywgMCkKKworICAgIGRlZiBnZXRhdG9tKHNlbGYsIGF0b21lbmRzPU5vbmUpOgorICAgICAgICAiIiJQYXJzZSBhbiBSRkMgMjgyMiBhdG9tLgorCisgICAgICAgIE9wdGlvbmFsIGF0b21lbmRzIHNwZWNpZmllcyBhIGRpZmZlcmVudCBzZXQgb2YgZW5kIHRva2VuIGRlbGltaXRlcnMKKyAgICAgICAgKHRoZSBkZWZhdWx0IGlzIHRvIHVzZSBzZWxmLmF0b21lbmRzKS4gIFRoaXMgaXMgdXNlZCBlLmcuIGluCisgICAgICAgIGdldHBocmFzZWxpc3QoKSBzaW5jZSBwaHJhc2UgZW5kaW5ncyBtdXN0IG5vdCBpbmNsdWRlIHRoZSBgLicgKHdoaWNoCisgICAgICAgIGlzIGxlZ2FsIGluIHBocmFzZXMpLiIiIgorICAgICAgICBhdG9tbGlzdCA9IFsnJ10KKyAgICAgICAgaWYgYXRvbWVuZHMgaXMgTm9uZToKKyAgICAgICAgICAgIGF0b21lbmRzID0gc2VsZi5hdG9tZW5kcworCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gYXRvbWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6IGF0b21saXN0LmFwcGVuZChzZWxmLmZpZWxkW3NlbGYucG9zXSkKKyAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKworICAgICAgICByZXR1cm4gJycuam9pbihhdG9tbGlzdCkKKworICAgIGRlZiBnZXRwaHJhc2VsaXN0KHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhIHNlcXVlbmNlIG9mIFJGQyAyODIyIHBocmFzZXMuCisKKyAgICAgICAgQSBwaHJhc2UgaXMgYSBzZXF1ZW5jZSBvZiB3b3Jkcywgd2hpY2ggYXJlIGluIHR1cm4gZWl0aGVyIFJGQyAyODIyCisgICAgICAgIGF0b21zIG9yIHF1b3RlZC1zdHJpbmdzLiAgUGhyYXNlcyBhcmUgY2Fub25pY2FsaXplZCBieSBzcXVlZXppbmcgYWxsCisgICAgICAgIHJ1bnMgb2YgY29udGludW91cyB3aGl0ZXNwYWNlIGludG8gb25lIHNwYWNlLgorICAgICAgICAiIiIKKyAgICAgICAgcGxpc3QgPSBbXQorCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5MV1M6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnIic6CisgICAgICAgICAgICAgICAgcGxpc3QuYXBwZW5kKHNlbGYuZ2V0cXVvdGUoKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJygnOgorICAgICAgICAgICAgICAgIHNlbGYuY29tbWVudGxpc3QuYXBwZW5kKHNlbGYuZ2V0Y29tbWVudCgpKQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLnBocmFzZWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGxpc3QuYXBwZW5kKHNlbGYuZ2V0YXRvbShzZWxmLnBocmFzZWVuZHMpKQorCisgICAgICAgIHJldHVybiBwbGlzdAorCitjbGFzcyBBZGRyZXNzTGlzdChBZGRybGlzdENsYXNzKToKKyAgICAiIiJBbiBBZGRyZXNzTGlzdCBlbmNhcHN1bGF0ZXMgYSBsaXN0IG9mIHBhcnNlZCBSRkMgMjgyMiBhZGRyZXNzZXMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpZWxkKToKKyAgICAgICAgQWRkcmxpc3RDbGFzcy5fX2luaXRfXyhzZWxmLCBmaWVsZCkKKyAgICAgICAgaWYgZmllbGQ6CisgICAgICAgICAgICBzZWxmLmFkZHJlc3NsaXN0ID0gc2VsZi5nZXRhZGRybGlzdCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFkZHJlc3NsaXN0ID0gW10KKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuYWRkcmVzc2xpc3QpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIsICIuam9pbihtYXAoZHVtcF9hZGRyZXNzX3BhaXIsIHNlbGYuYWRkcmVzc2xpc3QpKQorCisgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAjIFNldCB1bmlvbgorICAgICAgICBuZXdhZGRyID0gQWRkcmVzc0xpc3QoTm9uZSkKKyAgICAgICAgbmV3YWRkci5hZGRyZXNzbGlzdCA9IHNlbGYuYWRkcmVzc2xpc3RbOl0KKyAgICAgICAgZm9yIHggaW4gb3RoZXIuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICBpZiBub3QgeCBpbiBzZWxmLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgICAgIG5ld2FkZHIuYWRkcmVzc2xpc3QuYXBwZW5kKHgpCisgICAgICAgIHJldHVybiBuZXdhZGRyCisKKyAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAjIFNldCB1bmlvbiwgaW4tcGxhY2UKKyAgICAgICAgZm9yIHggaW4gb3RoZXIuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICBpZiBub3QgeCBpbiBzZWxmLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgICAgIHNlbGYuYWRkcmVzc2xpc3QuYXBwZW5kKHgpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICMgU2V0IGRpZmZlcmVuY2UKKyAgICAgICAgbmV3YWRkciA9IEFkZHJlc3NMaXN0KE5vbmUpCisgICAgICAgIGZvciB4IGluIHNlbGYuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICBpZiBub3QgeCBpbiBvdGhlci5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgICAgICBuZXdhZGRyLmFkZHJlc3NsaXN0LmFwcGVuZCh4KQorICAgICAgICByZXR1cm4gbmV3YWRkcgorCisgICAgZGVmIF9faXN1Yl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIyBTZXQgZGlmZmVyZW5jZSwgaW4tcGxhY2UKKyAgICAgICAgZm9yIHggaW4gb3RoZXIuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICBpZiB4IGluIHNlbGYuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRyZXNzbGlzdC5yZW1vdmUoeCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICMgTWFrZSBpbmRleGluZywgc2xpY2VzLCBhbmQgJ2luJyB3b3JrCisgICAgICAgIHJldHVybiBzZWxmLmFkZHJlc3NsaXN0W2luZGV4XQorCitkZWYgZHVtcF9hZGRyZXNzX3BhaXIocGFpcik6CisgICAgIiIiRHVtcCBhIChuYW1lLCBhZGRyZXNzKSBwYWlyIGluIGEgY2Fub25pY2FsaXplZCBmb3JtLiIiIgorICAgIGlmIHBhaXJbMF06CisgICAgICAgIHJldHVybiAnIicgKyBwYWlyWzBdICsgJyIgPCcgKyBwYWlyWzFdICsgJz4nCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHBhaXJbMV0KKworIyBQYXJzZSBhIGRhdGUgZmllbGQKKworX21vbnRobmFtZXMgPSBbJ2phbicsICdmZWInLCAnbWFyJywgJ2FwcicsICdtYXknLCAnanVuJywgJ2p1bCcsCisgICAgICAgICAgICAgICAnYXVnJywgJ3NlcCcsICdvY3QnLCAnbm92JywgJ2RlYycsCisgICAgICAgICAgICAgICAnamFudWFyeScsICdmZWJydWFyeScsICdtYXJjaCcsICdhcHJpbCcsICdtYXknLCAnanVuZScsICdqdWx5JywKKyAgICAgICAgICAgICAgICdhdWd1c3QnLCAnc2VwdGVtYmVyJywgJ29jdG9iZXInLCAnbm92ZW1iZXInLCAnZGVjZW1iZXInXQorX2RheW5hbWVzID0gWydtb24nLCAndHVlJywgJ3dlZCcsICd0aHUnLCAnZnJpJywgJ3NhdCcsICdzdW4nXQorCisjIFRoZSB0aW1lem9uZSB0YWJsZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBtaWxpdGFyeSB0aW1lIHpvbmVzIGRlZmluZWQKKyMgaW4gUkZDODIyLCBvdGhlciB0aGFuIFouICBBY2NvcmRpbmcgdG8gUkZDMTEyMywgdGhlIGRlc2NyaXB0aW9uIGluCisjIFJGQzgyMiBnZXRzIHRoZSBzaWducyB3cm9uZywgc28gd2UgY2FuJ3QgcmVseSBvbiBhbnkgc3VjaCB0aW1lCisjIHpvbmVzLiAgUkZDMTEyMyByZWNvbW1lbmRzIHRoYXQgbnVtZXJpYyB0aW1lem9uZSBpbmRpY2F0b3JzIGJlIHVzZWQKKyMgaW5zdGVhZCBvZiB0aW1lem9uZSBuYW1lcy4KKworX3RpbWV6b25lcyA9IHsnVVQnOjAsICdVVEMnOjAsICdHTVQnOjAsICdaJzowLAorICAgICAgICAgICAgICAnQVNUJzogLTQwMCwgJ0FEVCc6IC0zMDAsICAjIEF0bGFudGljICh1c2VkIGluIENhbmFkYSkKKyAgICAgICAgICAgICAgJ0VTVCc6IC01MDAsICdFRFQnOiAtNDAwLCAgIyBFYXN0ZXJuCisgICAgICAgICAgICAgICdDU1QnOiAtNjAwLCAnQ0RUJzogLTUwMCwgICMgQ2VudHJhbAorICAgICAgICAgICAgICAnTVNUJzogLTcwMCwgJ01EVCc6IC02MDAsICAjIE1vdW50YWluCisgICAgICAgICAgICAgICdQU1QnOiAtODAwLCAnUERUJzogLTcwMCAgICMgUGFjaWZpYworICAgICAgICAgICAgICB9CisKKworZGVmIHBhcnNlZGF0ZV90eihkYXRhKToKKyAgICAiIiJDb252ZXJ0IGEgZGF0ZSBzdHJpbmcgdG8gYSB0aW1lIHR1cGxlLgorCisgICAgQWNjb3VudHMgZm9yIG1pbGl0YXJ5IHRpbWV6b25lcy4KKyAgICAiIiIKKyAgICBpZiBub3QgZGF0YToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBkYXRhID0gZGF0YS5zcGxpdCgpCisgICAgaWYgZGF0YVswXVstMV0gaW4gKCcsJywgJy4nKSBvciBkYXRhWzBdLmxvd2VyKCkgaW4gX2RheW5hbWVzOgorICAgICAgICAjIFRoZXJlJ3MgYSBkYXluYW1lIGhlcmUuIFNraXAgaXQKKyAgICAgICAgZGVsIGRhdGFbMF0KKyAgICBlbHNlOgorICAgICAgICAjIG5vIHNwYWNlIGFmdGVyIHRoZSAid2Vla2RheSwiPworICAgICAgICBpID0gZGF0YVswXS5yZmluZCgnLCcpCisgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgIGRhdGFbMF0gPSBkYXRhWzBdW2krMTpdCisgICAgaWYgbGVuKGRhdGEpID09IDM6ICMgUkZDIDg1MCBkYXRlLCBkZXByZWNhdGVkCisgICAgICAgIHN0dWZmID0gZGF0YVswXS5zcGxpdCgnLScpCisgICAgICAgIGlmIGxlbihzdHVmZikgPT0gMzoKKyAgICAgICAgICAgIGRhdGEgPSBzdHVmZiArIGRhdGFbMTpdCisgICAgaWYgbGVuKGRhdGEpID09IDQ6CisgICAgICAgIHMgPSBkYXRhWzNdCisgICAgICAgIGkgPSBzLmZpbmQoJysnKQorICAgICAgICBpZiBpID4gMDoKKyAgICAgICAgICAgIGRhdGFbMzpdID0gW3NbOmldLCBzW2krMTpdXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YS5hcHBlbmQoJycpICMgRHVtbXkgdHoKKyAgICBpZiBsZW4oZGF0YSkgPCA1OgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGRhdGEgPSBkYXRhWzo1XQorICAgIFtkZCwgbW0sIHl5LCB0bSwgdHpdID0gZGF0YQorICAgIG1tID0gbW0ubG93ZXIoKQorICAgIGlmIG5vdCBtbSBpbiBfbW9udGhuYW1lczoKKyAgICAgICAgZGQsIG1tID0gbW0sIGRkLmxvd2VyKCkKKyAgICAgICAgaWYgbm90IG1tIGluIF9tb250aG5hbWVzOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBtbSA9IF9tb250aG5hbWVzLmluZGV4KG1tKSsxCisgICAgaWYgbW0gPiAxMjogbW0gPSBtbSAtIDEyCisgICAgaWYgZGRbLTFdID09ICcsJzoKKyAgICAgICAgZGQgPSBkZFs6LTFdCisgICAgaSA9IHl5LmZpbmQoJzonKQorICAgIGlmIGkgPiAwOgorICAgICAgICB5eSwgdG0gPSB0bSwgeXkKKyAgICBpZiB5eVstMV0gPT0gJywnOgorICAgICAgICB5eSA9IHl5WzotMV0KKyAgICBpZiBub3QgeXlbMF0uaXNkaWdpdCgpOgorICAgICAgICB5eSwgdHogPSB0eiwgeXkKKyAgICBpZiB0bVstMV0gPT0gJywnOgorICAgICAgICB0bSA9IHRtWzotMV0KKyAgICB0bSA9IHRtLnNwbGl0KCc6JykKKyAgICBpZiBsZW4odG0pID09IDI6CisgICAgICAgIFt0aGgsIHRtbV0gPSB0bQorICAgICAgICB0c3MgPSAnMCcKKyAgICBlbGlmIGxlbih0bSkgPT0gMzoKKyAgICAgICAgW3RoaCwgdG1tLCB0c3NdID0gdG0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHRyeToKKyAgICAgICAgeXkgPSBpbnQoeXkpCisgICAgICAgIGRkID0gaW50KGRkKQorICAgICAgICB0aGggPSBpbnQodGhoKQorICAgICAgICB0bW0gPSBpbnQodG1tKQorICAgICAgICB0c3MgPSBpbnQodHNzKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHR6b2Zmc2V0ID0gTm9uZQorICAgIHR6ID0gdHoudXBwZXIoKQorICAgIGlmIHR6IGluIF90aW1lem9uZXM6CisgICAgICAgIHR6b2Zmc2V0ID0gX3RpbWV6b25lc1t0el0KKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0em9mZnNldCA9IGludCh0eikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgIyBDb252ZXJ0IGEgdGltZXpvbmUgb2Zmc2V0IGludG8gc2Vjb25kcyA7IC0wNTAwIC0+IC0xODAwMAorICAgIGlmIHR6b2Zmc2V0OgorICAgICAgICBpZiB0em9mZnNldCA8IDA6CisgICAgICAgICAgICB0enNpZ24gPSAtMQorICAgICAgICAgICAgdHpvZmZzZXQgPSAtdHpvZmZzZXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR6c2lnbiA9IDEKKyAgICAgICAgdHpvZmZzZXQgPSB0enNpZ24gKiAoICh0em9mZnNldC8vMTAwKSozNjAwICsgKHR6b2Zmc2V0ICUgMTAwKSo2MCkKKyAgICByZXR1cm4gKHl5LCBtbSwgZGQsIHRoaCwgdG1tLCB0c3MsIDAsIDEsIDAsIHR6b2Zmc2V0KQorCisKK2RlZiBwYXJzZWRhdGUoZGF0YSk6CisgICAgIiIiQ29udmVydCBhIHRpbWUgc3RyaW5nIHRvIGEgdGltZSB0dXBsZS4iIiIKKyAgICB0ID0gcGFyc2VkYXRlX3R6KGRhdGEpCisgICAgaWYgdCBpcyBOb25lOgorICAgICAgICByZXR1cm4gdAorICAgIHJldHVybiB0Wzo5XQorCisKK2RlZiBta3RpbWVfdHooZGF0YSk6CisgICAgIiIiVHVybiBhIDEwLXR1cGxlIGFzIHJldHVybmVkIGJ5IHBhcnNlZGF0ZV90eigpIGludG8gYSBVVEMgdGltZXN0YW1wLiIiIgorICAgIGlmIGRhdGFbOV0gaXMgTm9uZToKKyAgICAgICAgIyBObyB6b25lIGluZm8sIHNvIGxvY2FsdGltZSBpcyBiZXR0ZXIgYXNzdW1wdGlvbiB0aGFuIEdNVAorICAgICAgICByZXR1cm4gdGltZS5ta3RpbWUoZGF0YVs6OF0gKyAoLTEsKSkKKyAgICBlbHNlOgorICAgICAgICB0ID0gdGltZS5ta3RpbWUoZGF0YVs6OF0gKyAoMCwpKQorICAgICAgICByZXR1cm4gdCAtIGRhdGFbOV0gLSB0aW1lLnRpbWV6b25lCisKK2RlZiBmb3JtYXRkYXRlKHRpbWV2YWw9Tm9uZSk6CisgICAgIiIiUmV0dXJucyB0aW1lIGZvcm1hdCBwcmVmZXJyZWQgZm9yIEludGVybmV0IHN0YW5kYXJkcy4KKworICAgIFN1biwgMDYgTm92IDE5OTQgMDg6NDk6MzcgR01UICA7IFJGQyA4MjIsIHVwZGF0ZWQgYnkgUkZDIDExMjMKKworICAgIEFjY29yZGluZyB0byBSRkMgMTEyMywgZGF5IGFuZCBtb250aCBuYW1lcyBtdXN0IGFsd2F5cyBiZSBpbgorICAgIEVuZ2xpc2guICBJZiBub3QgZm9yIHRoYXQsIHRoaXMgY29kZSBjb3VsZCB1c2Ugc3RyZnRpbWUoKS4gIEl0CisgICAgY2FuJ3QgYmVjYXVzZSBzdHJmdGltZSgpIGhvbm9ycyB0aGUgbG9jYWxlIGFuZCBjb3VsZCBnZW5lcmF0ZWQKKyAgICBub24tRW5nbGlzaCBuYW1lcy4KKyAgICAiIiIKKyAgICBpZiB0aW1ldmFsIGlzIE5vbmU6CisgICAgICAgIHRpbWV2YWwgPSB0aW1lLnRpbWUoKQorICAgIHRpbWV2YWwgPSB0aW1lLmdtdGltZSh0aW1ldmFsKQorICAgIHJldHVybiAiJXMsICUwMmQgJXMgJTA0ZCAlMDJkOiUwMmQ6JTAyZCBHTVQiICUgKAorICAgICAgICAgICAgKCJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCIsICJTdW4iKVt0aW1ldmFsWzZdXSwKKyAgICAgICAgICAgIHRpbWV2YWxbMl0sCisgICAgICAgICAgICAoIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKKyAgICAgICAgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiKVt0aW1ldmFsWzFdLTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1ldmFsWzBdLCB0aW1ldmFsWzNdLCB0aW1ldmFsWzRdLCB0aW1ldmFsWzVdKQorCisKKyMgV2hlbiB1c2VkIGFzIHNjcmlwdCwgcnVuIGEgc21hbGwgdGVzdCBwcm9ncmFtLgorIyBUaGUgZmlyc3QgY29tbWFuZCBsaW5lIGFyZ3VtZW50IG11c3QgYmUgYSBmaWxlbmFtZSBjb250YWluaW5nIG9uZQorIyBtZXNzYWdlIGluIFJGQy04MjIgZm9ybWF0LgorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBzeXMsIG9zCisgICAgZmlsZSA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uWydIT01FJ10sICdNYWlsL2luYm94LzEnKQorICAgIGlmIHN5cy5hcmd2WzE6XTogZmlsZSA9IHN5cy5hcmd2WzFdCisgICAgZiA9IG9wZW4oZmlsZSwgJ3InKQorICAgIG0gPSBNZXNzYWdlKGYpCisgICAgcHJpbnQgJ0Zyb206JywgbS5nZXRhZGRyKCdmcm9tJykKKyAgICBwcmludCAnVG86JywgbS5nZXRhZGRybGlzdCgndG8nKQorICAgIHByaW50ICdTdWJqZWN0OicsIG0uZ2V0aGVhZGVyKCdzdWJqZWN0JykKKyAgICBwcmludCAnRGF0ZTonLCBtLmdldGhlYWRlcignZGF0ZScpCisgICAgZGF0ZSA9IG0uZ2V0ZGF0ZV90eignZGF0ZScpCisgICAgdHogPSBkYXRlWy0xXQorICAgIGRhdGUgPSB0aW1lLmxvY2FsdGltZShta3RpbWVfdHooZGF0ZSkpCisgICAgaWYgZGF0ZToKKyAgICAgICAgcHJpbnQgJ1BhcnNlZERhdGU6JywgdGltZS5hc2N0aW1lKGRhdGUpLAorICAgICAgICBoaG1tc3MgPSB0egorICAgICAgICBoaG1tLCBzcyA9IGRpdm1vZChoaG1tc3MsIDYwKQorICAgICAgICBoaCwgbW0gPSBkaXZtb2QoaGhtbSwgNjApCisgICAgICAgIHByaW50ICIlKzAzZCUwMmQiICUgKGhoLCBtbSksCisgICAgICAgIGlmIHNzOiBwcmludCAiLiUwMmQiICUgc3MsCisgICAgICAgIHByaW50CisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgJ1BhcnNlZERhdGU6JywgTm9uZQorICAgIG0ucmV3aW5kYm9keSgpCisgICAgbiA9IDAKKyAgICB3aGlsZSBmLnJlYWRsaW5lKCk6CisgICAgICAgIG4gKz0gMQorICAgIHByaW50ICdMaW5lczonLCBuCisgICAgcHJpbnQgJy0nKjcwCisgICAgcHJpbnQgJ2xlbiA9JywgbGVuKG0pCisgICAgaWYgJ0RhdGUnIGluIG06IHByaW50ICdEYXRlID0nLCBtWydEYXRlJ10KKyAgICBpZiAnWC1Ob25zZW5zZScgaW4gbTogcGFzcworICAgIHByaW50ICdrZXlzID0nLCBtLmtleXMoKQorICAgIHByaW50ICd2YWx1ZXMgPScsIG0udmFsdWVzKCkKKyAgICBwcmludCAnaXRlbXMgPScsIG0uaXRlbXMoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9yZmM4MjIucHljIGIvbGliL3B5dGhvbjIuNy9yZmM4MjIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjlmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3JmYzgyMi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9yZmM4MjIucHlvIGIvbGliL3B5dGhvbjIuNy9yZmM4MjIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYjlmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3JmYzgyMi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ybGNvbXBsZXRlci5weSBiL2xpYi9weXRob24yLjcvcmxjb21wbGV0ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2YzU5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmxjb21wbGV0ZXIucHkKQEAgLTAsMCArMSwxNjYgQEAKKyIiIldvcmQgY29tcGxldGlvbiBmb3IgR05VIHJlYWRsaW5lLgorCitUaGUgY29tcGxldGVyIGNvbXBsZXRlcyBrZXl3b3JkcywgYnVpbHQtaW5zIGFuZCBnbG9iYWxzIGluIGEgc2VsZWN0YWJsZQorbmFtZXNwYWNlICh3aGljaCBkZWZhdWx0cyB0byBfX21haW5fXyk7IHdoZW4gY29tcGxldGluZyBOQU1FLk5BTUUuLi4sIGl0CitldmFsdWF0ZXMgKCEpIHRoZSBleHByZXNzaW9uIHVwIHRvIHRoZSBsYXN0IGRvdCBhbmQgY29tcGxldGVzIGl0cyBhdHRyaWJ1dGVzLgorCitJdCdzIHZlcnkgY29vbCB0byBkbyAiaW1wb3J0IHN5cyIgdHlwZSAic3lzLiIsIGhpdCB0aGUgY29tcGxldGlvbiBrZXkgKHR3aWNlKSwKK2FuZCBzZWUgdGhlIGxpc3Qgb2YgbmFtZXMgZGVmaW5lZCBieSB0aGUgc3lzIG1vZHVsZSEKKworVGlwOiB0byB1c2UgdGhlIHRhYiBrZXkgYXMgdGhlIGNvbXBsZXRpb24ga2V5LCBjYWxsCisKKyAgICByZWFkbGluZS5wYXJzZV9hbmRfYmluZCgidGFiOiBjb21wbGV0ZSIpCisKK05vdGVzOgorCistIEV4Y2VwdGlvbnMgcmFpc2VkIGJ5IHRoZSBjb21wbGV0ZXIgZnVuY3Rpb24gYXJlICppZ25vcmVkKiAoYW5kIGdlbmVyYWxseSBjYXVzZQorICB0aGUgY29tcGxldGlvbiB0byBmYWlsKS4gIFRoaXMgaXMgYSBmZWF0dXJlIC0tIHNpbmNlIHJlYWRsaW5lIHNldHMgdGhlIHR0eQorICBkZXZpY2UgaW4gcmF3IChvciBjYnJlYWspIG1vZGUsIHByaW50aW5nIGEgdHJhY2ViYWNrIHdvdWxkbid0IHdvcmsgd2VsbAorICB3aXRob3V0IHNvbWUgY29tcGxpY2F0ZWQgaG9vcGxhIHRvIHNhdmUsIHJlc2V0IGFuZCByZXN0b3JlIHRoZSB0dHkgc3RhdGUuCisKKy0gVGhlIGV2YWx1YXRpb24gb2YgdGhlIE5BTUUuTkFNRS4uLiBmb3JtIG1heSBjYXVzZSBhcmJpdHJhcnkgYXBwbGljYXRpb24KKyAgZGVmaW5lZCBjb2RlIHRvIGJlIGV4ZWN1dGVkIGlmIGFuIG9iamVjdCB3aXRoIGEgX19nZXRhdHRyX18gaG9vayBpcyBmb3VuZC4KKyAgU2luY2UgaXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBhcHBsaWNhdGlvbiAob3IgdGhlIHVzZXIpIHRvIGVuYWJsZSB0aGlzCisgIGZlYXR1cmUsIEkgY29uc2lkZXIgdGhpcyBhbiBhY2NlcHRhYmxlIHJpc2suICBNb3JlIGNvbXBsaWNhdGVkIGV4cHJlc3Npb25zCisgIChlLmcuIGZ1bmN0aW9uIGNhbGxzIG9yIGluZGV4aW5nIG9wZXJhdGlvbnMpIGFyZSAqbm90KiBldmFsdWF0ZWQuCisKKy0gR05VIHJlYWRsaW5lIGlzIGFsc28gdXNlZCBieSB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zIGlucHV0KCkgYW5kCityYXdfaW5wdXQoKSwgYW5kIHRodXMgdGhlc2UgYWxzbyBiZW5lZml0L3N1ZmZlciBmcm9tIHRoZSBjb21wbGV0ZXIKK2ZlYXR1cmVzLiAgQ2xlYXJseSBhbiBpbnRlcmFjdGl2ZSBhcHBsaWNhdGlvbiBjYW4gYmVuZWZpdCBieQorc3BlY2lmeWluZyBpdHMgb3duIGNvbXBsZXRlciBmdW5jdGlvbiBhbmQgdXNpbmcgcmF3X2lucHV0KCkgZm9yIGFsbAoraXRzIGlucHV0LgorCistIFdoZW4gdGhlIG9yaWdpbmFsIHN0ZGluIGlzIG5vdCBhIHR0eSBkZXZpY2UsIEdOVSByZWFkbGluZSBpcyBuZXZlcgorICB1c2VkLCBhbmQgdGhpcyBtb2R1bGUgKGFuZCB0aGUgcmVhZGxpbmUgbW9kdWxlKSBhcmUgc2lsZW50bHkgaW5hY3RpdmUuCisKKyIiIgorCitpbXBvcnQgX19idWlsdGluX18KK2ltcG9ydCBfX21haW5fXworCitfX2FsbF9fID0gWyJDb21wbGV0ZXIiXQorCitjbGFzcyBDb21wbGV0ZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWVzcGFjZSA9IE5vbmUpOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgY29tcGxldGVyIGZvciB0aGUgY29tbWFuZCBsaW5lLgorCisgICAgICAgIENvbXBsZXRlcihbbmFtZXNwYWNlXSkgLT4gY29tcGxldGVyIGluc3RhbmNlLgorCisgICAgICAgIElmIHVuc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBuYW1lc3BhY2Ugd2hlcmUgY29tcGxldGlvbnMgYXJlIHBlcmZvcm1lZAorICAgICAgICBpcyBfX21haW5fXyAodGVjaG5pY2FsbHksIF9fbWFpbl9fLl9fZGljdF9fKS4gTmFtZXNwYWNlcyBzaG91bGQgYmUKKyAgICAgICAgZ2l2ZW4gYXMgZGljdGlvbmFyaWVzLgorCisgICAgICAgIENvbXBsZXRlciBpbnN0YW5jZXMgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGNvbXBsZXRpb24gbWVjaGFuaXNtIG9mCisgICAgICAgIHJlYWRsaW5lIHZpYSB0aGUgc2V0X2NvbXBsZXRlcigpIGNhbGw6CisKKyAgICAgICAgcmVhZGxpbmUuc2V0X2NvbXBsZXRlcihDb21wbGV0ZXIobXlfbmFtZXNwYWNlKS5jb21wbGV0ZSkKKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbmFtZXNwYWNlIGFuZCBub3QgaXNpbnN0YW5jZShuYW1lc3BhY2UsIGRpY3QpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCduYW1lc3BhY2UgbXVzdCBiZSBhIGRpY3Rpb25hcnknCisKKyAgICAgICAgIyBEb24ndCBiaW5kIHRvIG5hbWVzcGFjZSBxdWl0ZSB5ZXQsIGJ1dCBmbGFnIHdoZXRoZXIgdGhlIHVzZXIgd2FudHMgYQorICAgICAgICAjIHNwZWNpZmljIG5hbWVzcGFjZSBvciB0byB1c2UgX19tYWluX18uX19kaWN0X18uIFRoaXMgd2lsbCBhbGxvdyB1cworICAgICAgICAjIHRvIGJpbmQgdG8gX19tYWluX18uX19kaWN0X18gYXQgY29tcGxldGlvbiB0aW1lLCBub3Qgbm93LgorICAgICAgICBpZiBuYW1lc3BhY2UgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudXNlX21haW5fbnMgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnVzZV9tYWluX25zID0gMAorICAgICAgICAgICAgc2VsZi5uYW1lc3BhY2UgPSBuYW1lc3BhY2UKKworICAgIGRlZiBjb21wbGV0ZShzZWxmLCB0ZXh0LCBzdGF0ZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBwb3NzaWJsZSBjb21wbGV0aW9uIGZvciAndGV4dCcuCisKKyAgICAgICAgVGhpcyBpcyBjYWxsZWQgc3VjY2Vzc2l2ZWx5IHdpdGggc3RhdGUgPT0gMCwgMSwgMiwgLi4uIHVudGlsIGl0CisgICAgICAgIHJldHVybnMgTm9uZS4gIFRoZSBjb21wbGV0aW9uIHNob3VsZCBiZWdpbiB3aXRoICd0ZXh0Jy4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi51c2VfbWFpbl9uczoKKyAgICAgICAgICAgIHNlbGYubmFtZXNwYWNlID0gX19tYWluX18uX19kaWN0X18KKworICAgICAgICBpZiBzdGF0ZSA9PSAwOgorICAgICAgICAgICAgaWYgIi4iIGluIHRleHQ6CisgICAgICAgICAgICAgICAgc2VsZi5tYXRjaGVzID0gc2VsZi5hdHRyX21hdGNoZXModGV4dCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5tYXRjaGVzID0gc2VsZi5nbG9iYWxfbWF0Y2hlcyh0ZXh0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5tYXRjaGVzW3N0YXRlXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX2NhbGxhYmxlX3Bvc3RmaXgoc2VsZiwgdmFsLCB3b3JkKToKKyAgICAgICAgaWYgaGFzYXR0cih2YWwsICdfX2NhbGxfXycpOgorICAgICAgICAgICAgd29yZCA9IHdvcmQgKyAiKCIKKyAgICAgICAgcmV0dXJuIHdvcmQKKworICAgIGRlZiBnbG9iYWxfbWF0Y2hlcyhzZWxmLCB0ZXh0KToKKyAgICAgICAgIiIiQ29tcHV0ZSBtYXRjaGVzIHdoZW4gdGV4dCBpcyBhIHNpbXBsZSBuYW1lLgorCisgICAgICAgIFJldHVybiBhIGxpc3Qgb2YgYWxsIGtleXdvcmRzLCBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIG5hbWVzIGN1cnJlbnRseQorICAgICAgICBkZWZpbmVkIGluIHNlbGYubmFtZXNwYWNlIHRoYXQgbWF0Y2guCisKKyAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBrZXl3b3JkCisgICAgICAgIG1hdGNoZXMgPSBbXQorICAgICAgICBuID0gbGVuKHRleHQpCisgICAgICAgIGZvciB3b3JkIGluIGtleXdvcmQua3dsaXN0OgorICAgICAgICAgICAgaWYgd29yZFs6bl0gPT0gdGV4dDoKKyAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCh3b3JkKQorICAgICAgICBmb3IgbnNwYWNlIGluIFtfX2J1aWx0aW5fXy5fX2RpY3RfXywgc2VsZi5uYW1lc3BhY2VdOgorICAgICAgICAgICAgZm9yIHdvcmQsIHZhbCBpbiBuc3BhY2UuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiB3b3JkWzpuXSA9PSB0ZXh0IGFuZCB3b3JkICE9ICJfX2J1aWx0aW5zX18iOgorICAgICAgICAgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZChzZWxmLl9jYWxsYWJsZV9wb3N0Zml4KHZhbCwgd29yZCkpCisgICAgICAgIHJldHVybiBtYXRjaGVzCisKKyAgICBkZWYgYXR0cl9tYXRjaGVzKHNlbGYsIHRleHQpOgorICAgICAgICAiIiJDb21wdXRlIG1hdGNoZXMgd2hlbiB0ZXh0IGNvbnRhaW5zIGEgZG90LgorCisgICAgICAgIEFzc3VtaW5nIHRoZSB0ZXh0IGlzIG9mIHRoZSBmb3JtIE5BTUUuTkFNRS4uLi5bTkFNRV0sIGFuZCBpcworICAgICAgICBldmFsdWF0YWJsZSBpbiBzZWxmLm5hbWVzcGFjZSwgaXQgd2lsbCBiZSBldmFsdWF0ZWQgYW5kIGl0cyBhdHRyaWJ1dGVzCisgICAgICAgIChhcyByZXZlYWxlZCBieSBkaXIoKSkgYXJlIHVzZWQgYXMgcG9zc2libGUgY29tcGxldGlvbnMuICAoRm9yIGNsYXNzCisgICAgICAgIGluc3RhbmNlcywgY2xhc3MgbWVtYmVycyBhcmUgYWxzbyBjb25zaWRlcmVkLikKKworICAgICAgICBXQVJOSU5HOiB0aGlzIGNhbiBzdGlsbCBpbnZva2UgYXJiaXRyYXJ5IEMgY29kZSwgaWYgYW4gb2JqZWN0CisgICAgICAgIHdpdGggYSBfX2dldGF0dHJfXyBob29rIGlzIGV2YWx1YXRlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIG0gPSByZS5tYXRjaChyIihcdysoXC5cdyspKilcLihcdyopIiwgdGV4dCkKKyAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgZXhwciwgYXR0ciA9IG0uZ3JvdXAoMSwgMykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGhpc29iamVjdCA9IGV2YWwoZXhwciwgc2VsZi5uYW1lc3BhY2UpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICAjIGdldCB0aGUgY29udGVudCBvZiB0aGUgb2JqZWN0LCBleGNlcHQgX19idWlsdGluc19fCisgICAgICAgIHdvcmRzID0gZGlyKHRoaXNvYmplY3QpCisgICAgICAgIGlmICJfX2J1aWx0aW5zX18iIGluIHdvcmRzOgorICAgICAgICAgICAgd29yZHMucmVtb3ZlKCJfX2J1aWx0aW5zX18iKQorCisgICAgICAgIGlmIGhhc2F0dHIodGhpc29iamVjdCwgJ19fY2xhc3NfXycpOgorICAgICAgICAgICAgd29yZHMuYXBwZW5kKCdfX2NsYXNzX18nKQorICAgICAgICAgICAgd29yZHMuZXh0ZW5kKGdldF9jbGFzc19tZW1iZXJzKHRoaXNvYmplY3QuX19jbGFzc19fKSkKKyAgICAgICAgbWF0Y2hlcyA9IFtdCisgICAgICAgIG4gPSBsZW4oYXR0cikKKyAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6CisgICAgICAgICAgICBpZiB3b3JkWzpuXSA9PSBhdHRyIGFuZCBoYXNhdHRyKHRoaXNvYmplY3QsIHdvcmQpOgorICAgICAgICAgICAgICAgIHZhbCA9IGdldGF0dHIodGhpc29iamVjdCwgd29yZCkKKyAgICAgICAgICAgICAgICB3b3JkID0gc2VsZi5fY2FsbGFibGVfcG9zdGZpeCh2YWwsICIlcy4lcyIgJSAoZXhwciwgd29yZCkpCisgICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQod29yZCkKKyAgICAgICAgcmV0dXJuIG1hdGNoZXMKKworZGVmIGdldF9jbGFzc19tZW1iZXJzKGtsYXNzKToKKyAgICByZXQgPSBkaXIoa2xhc3MpCisgICAgaWYgaGFzYXR0cihrbGFzcywnX19iYXNlc19fJyk6CisgICAgICAgIGZvciBiYXNlIGluIGtsYXNzLl9fYmFzZXNfXzoKKyAgICAgICAgICAgIHJldCA9IHJldCArIGdldF9jbGFzc19tZW1iZXJzKGJhc2UpCisgICAgcmV0dXJuIHJldAorCit0cnk6CisgICAgaW1wb3J0IHJlYWRsaW5lCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICByZWFkbGluZS5zZXRfY29tcGxldGVyKENvbXBsZXRlcigpLmNvbXBsZXRlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ybGNvbXBsZXRlci5weWMgYi9saWIvcHl0aG9uMi43L3JsY29tcGxldGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTNiYzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ybGNvbXBsZXRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ybGNvbXBsZXRlci5weW8gYi9saWIvcHl0aG9uMi43L3JsY29tcGxldGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTNiYzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ybGNvbXBsZXRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9yb2JvdHBhcnNlci5weSBiL2xpYi9weXRob24yLjcvcm9ib3RwYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyMjg2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcm9ib3RwYXJzZXIucHkKQEAgLTAsMCArMSwyMjIgQEAKKyIiIiByb2JvdHBhcnNlci5weQorCisgICAgQ29weXJpZ2h0IChDKSAyMDAwICBCYXN0aWFuIEtsZWluZWlkYW0KKworICAgIFlvdSBjYW4gY2hvb3NlIGJldHdlZW4gdHdvIGxpY2Vuc2VzIHdoZW4gdXNpbmcgdGhpcyBwYWNrYWdlOgorICAgIDEpIEdOVSBHUEx2MgorICAgIDIpIFBTRiBsaWNlbnNlIGZvciBQeXRob24gMi4yCisKKyAgICBUaGUgcm9ib3RzLnR4dCBFeGNsdXNpb24gUHJvdG9jb2wgaXMgaW1wbGVtZW50ZWQgYXMgc3BlY2lmaWVkIGluCisgICAgaHR0cDovL2luZm8ud2ViY3Jhd2xlci5jb20vbWFrL3Byb2plY3RzL3JvYm90cy9ub3JvYm90cy1yZmMuaHRtbAorIiIiCitpbXBvcnQgdXJscGFyc2UKK2ltcG9ydCB1cmxsaWIKKworX19hbGxfXyA9IFsiUm9ib3RGaWxlUGFyc2VyIl0KKworCitjbGFzcyBSb2JvdEZpbGVQYXJzZXI6CisgICAgIiIiIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBzZXQgb2YgbWV0aG9kcyB0byByZWFkLCBwYXJzZSBhbmQgYW5zd2VyCisgICAgcXVlc3Rpb25zIGFib3V0IGEgc2luZ2xlIHJvYm90cy50eHQgZmlsZS4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybD0nJyk6CisgICAgICAgIHNlbGYuZW50cmllcyA9IFtdCisgICAgICAgIHNlbGYuZGVmYXVsdF9lbnRyeSA9IE5vbmUKKyAgICAgICAgc2VsZi5kaXNhbGxvd19hbGwgPSBGYWxzZQorICAgICAgICBzZWxmLmFsbG93X2FsbCA9IEZhbHNlCisgICAgICAgIHNlbGYuc2V0X3VybCh1cmwpCisgICAgICAgIHNlbGYubGFzdF9jaGVja2VkID0gMAorCisgICAgZGVmIG10aW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSB0aW1lIHRoZSByb2JvdHMudHh0IGZpbGUgd2FzIGxhc3QgZmV0Y2hlZC4KKworICAgICAgICBUaGlzIGlzIHVzZWZ1bCBmb3IgbG9uZy1ydW5uaW5nIHdlYiBzcGlkZXJzIHRoYXQgbmVlZCB0bworICAgICAgICBjaGVjayBmb3IgbmV3IHJvYm90cy50eHQgZmlsZXMgcGVyaW9kaWNhbGx5LgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5sYXN0X2NoZWNrZWQKKworICAgIGRlZiBtb2RpZmllZChzZWxmKToKKyAgICAgICAgIiIiU2V0cyB0aGUgdGltZSB0aGUgcm9ib3RzLnR4dCBmaWxlIHdhcyBsYXN0IGZldGNoZWQgdG8gdGhlCisgICAgICAgIGN1cnJlbnQgdGltZS4KKworICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgc2VsZi5sYXN0X2NoZWNrZWQgPSB0aW1lLnRpbWUoKQorCisgICAgZGVmIHNldF91cmwoc2VsZiwgdXJsKToKKyAgICAgICAgIiIiU2V0cyB0aGUgVVJMIHJlZmVycmluZyB0byBhIHJvYm90cy50eHQgZmlsZS4iIiIKKyAgICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICAgICAgc2VsZi5ob3N0LCBzZWxmLnBhdGggPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpWzE6M10KKworICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICAiIiJSZWFkcyB0aGUgcm9ib3RzLnR4dCBVUkwgYW5kIGZlZWRzIGl0IHRvIHRoZSBwYXJzZXIuIiIiCisgICAgICAgIG9wZW5lciA9IFVSTG9wZW5lcigpCisgICAgICAgIGYgPSBvcGVuZXIub3BlbihzZWxmLnVybCkKKyAgICAgICAgbGluZXMgPSBbbGluZS5zdHJpcCgpIGZvciBsaW5lIGluIGZdCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmVycmNvZGUgPSBvcGVuZXIuZXJyY29kZQorICAgICAgICBpZiBzZWxmLmVycmNvZGUgaW4gKDQwMSwgNDAzKToKKyAgICAgICAgICAgIHNlbGYuZGlzYWxsb3dfYWxsID0gVHJ1ZQorICAgICAgICBlbGlmIHNlbGYuZXJyY29kZSA+PSA0MDA6CisgICAgICAgICAgICBzZWxmLmFsbG93X2FsbCA9IFRydWUKKyAgICAgICAgZWxpZiBzZWxmLmVycmNvZGUgPT0gMjAwIGFuZCBsaW5lczoKKyAgICAgICAgICAgIHNlbGYucGFyc2UobGluZXMpCisKKyAgICBkZWYgX2FkZF9lbnRyeShzZWxmLCBlbnRyeSk6CisgICAgICAgIGlmICIqIiBpbiBlbnRyeS51c2VyYWdlbnRzOgorICAgICAgICAgICAgIyB0aGUgZGVmYXVsdCBlbnRyeSBpcyBjb25zaWRlcmVkIGxhc3QKKyAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdF9lbnRyeSBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgdGhlIGZpcnN0IGRlZmF1bHQgZW50cnkgd2lucworICAgICAgICAgICAgICAgIHNlbGYuZGVmYXVsdF9lbnRyeSA9IGVudHJ5CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmVudHJpZXMuYXBwZW5kKGVudHJ5KQorCisgICAgZGVmIHBhcnNlKHNlbGYsIGxpbmVzKToKKyAgICAgICAgIiIicGFyc2UgdGhlIGlucHV0IGxpbmVzIGZyb20gYSByb2JvdHMudHh0IGZpbGUuCisgICAgICAgICAgIFdlIGFsbG93IHRoYXQgYSB1c2VyLWFnZW50OiBsaW5lIGlzIG5vdCBwcmVjZWRlZCBieQorICAgICAgICAgICBvbmUgb3IgbW9yZSBibGFuayBsaW5lcy4iIiIKKyAgICAgICAgIyBzdGF0ZXM6CisgICAgICAgICMgICAwOiBzdGFydCBzdGF0ZQorICAgICAgICAjICAgMTogc2F3IHVzZXItYWdlbnQgbGluZQorICAgICAgICAjICAgMjogc2F3IGFuIGFsbG93IG9yIGRpc2FsbG93IGxpbmUKKyAgICAgICAgc3RhdGUgPSAwCisgICAgICAgIGxpbmVudW1iZXIgPSAwCisgICAgICAgIGVudHJ5ID0gRW50cnkoKQorCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgbGluZW51bWJlciArPSAxCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBpZiBzdGF0ZSA9PSAxOgorICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IEVudHJ5KCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwCisgICAgICAgICAgICAgICAgZWxpZiBzdGF0ZSA9PSAyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9hZGRfZW50cnkoZW50cnkpCisgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0gRW50cnkoKQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDAKKyAgICAgICAgICAgICMgcmVtb3ZlIG9wdGlvbmFsIGNvbW1lbnQgYW5kIHN0cmlwIGxpbmUKKyAgICAgICAgICAgIGkgPSBsaW5lLmZpbmQoJyMnKQorICAgICAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzppXQorICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNwbGl0KCc6JywgMSkKKyAgICAgICAgICAgIGlmIGxlbihsaW5lKSA9PSAyOgorICAgICAgICAgICAgICAgIGxpbmVbMF0gPSBsaW5lWzBdLnN0cmlwKCkubG93ZXIoKQorICAgICAgICAgICAgICAgIGxpbmVbMV0gPSB1cmxsaWIudW5xdW90ZShsaW5lWzFdLnN0cmlwKCkpCisgICAgICAgICAgICAgICAgaWYgbGluZVswXSA9PSAidXNlci1hZ2VudCI6CisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXRlID09IDI6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9hZGRfZW50cnkoZW50cnkpCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IEVudHJ5KCkKKyAgICAgICAgICAgICAgICAgICAgZW50cnkudXNlcmFnZW50cy5hcHBlbmQobGluZVsxXSkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAxCisgICAgICAgICAgICAgICAgZWxpZiBsaW5lWzBdID09ICJkaXNhbGxvdyI6CisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXRlICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5ydWxlbGluZXMuYXBwZW5kKFJ1bGVMaW5lKGxpbmVbMV0sIEZhbHNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMgorICAgICAgICAgICAgICAgIGVsaWYgbGluZVswXSA9PSAiYWxsb3ciOgorICAgICAgICAgICAgICAgICAgICBpZiBzdGF0ZSAhPSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucnVsZWxpbmVzLmFwcGVuZChSdWxlTGluZShsaW5lWzFdLCBUcnVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMgorICAgICAgICBpZiBzdGF0ZSA9PSAyOgorICAgICAgICAgICAgc2VsZi5fYWRkX2VudHJ5KGVudHJ5KQorCisKKyAgICBkZWYgY2FuX2ZldGNoKHNlbGYsIHVzZXJhZ2VudCwgdXJsKToKKyAgICAgICAgIiIidXNpbmcgdGhlIHBhcnNlZCByb2JvdHMudHh0IGRlY2lkZSBpZiB1c2VyYWdlbnQgY2FuIGZldGNoIHVybCIiIgorICAgICAgICBpZiBzZWxmLmRpc2FsbG93X2FsbDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLmFsbG93X2FsbDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgc2VhcmNoIGZvciBnaXZlbiB1c2VyIGFnZW50IG1hdGNoZXMKKyAgICAgICAgIyB0aGUgZmlyc3QgbWF0Y2ggY291bnRzCisgICAgICAgIHBhcnNlZF91cmwgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmxsaWIudW5xdW90ZSh1cmwpKQorICAgICAgICB1cmwgPSB1cmxwYXJzZS51cmx1bnBhcnNlKCgnJywgJycsIHBhcnNlZF91cmwucGF0aCwKKyAgICAgICAgICAgIHBhcnNlZF91cmwucGFyYW1zLCBwYXJzZWRfdXJsLnF1ZXJ5LCBwYXJzZWRfdXJsLmZyYWdtZW50KSkKKyAgICAgICAgdXJsID0gdXJsbGliLnF1b3RlKHVybCkKKyAgICAgICAgaWYgbm90IHVybDoKKyAgICAgICAgICAgIHVybCA9ICIvIgorICAgICAgICBmb3IgZW50cnkgaW4gc2VsZi5lbnRyaWVzOgorICAgICAgICAgICAgaWYgZW50cnkuYXBwbGllc190byh1c2VyYWdlbnQpOgorICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5hbGxvd2FuY2UodXJsKQorICAgICAgICAjIHRyeSB0aGUgZGVmYXVsdCBlbnRyeSBsYXN0CisgICAgICAgIGlmIHNlbGYuZGVmYXVsdF9lbnRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlZmF1bHRfZW50cnkuYWxsb3dhbmNlKHVybCkKKyAgICAgICAgIyBhZ2VudCBub3QgZm91bmQgPT0+IGFjY2VzcyBncmFudGVkCisgICAgICAgIHJldHVybiBUcnVlCisKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJycuam9pbihbc3RyKGVudHJ5KSArICJcbiIgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllc10pCisKKworY2xhc3MgUnVsZUxpbmU6CisgICAgIiIiQSBydWxlIGxpbmUgaXMgYSBzaW5nbGUgIkFsbG93OiIgKGFsbG93YW5jZT09VHJ1ZSkgb3IgIkRpc2FsbG93OiIKKyAgICAgICAoYWxsb3dhbmNlPT1GYWxzZSkgZm9sbG93ZWQgYnkgYSBwYXRoLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBhbGxvd2FuY2UpOgorICAgICAgICBpZiBwYXRoID09ICcnIGFuZCBub3QgYWxsb3dhbmNlOgorICAgICAgICAgICAgIyBhbiBlbXB0eSB2YWx1ZSBtZWFucyBhbGxvdyBhbGwKKyAgICAgICAgICAgIGFsbG93YW5jZSA9IFRydWUKKyAgICAgICAgc2VsZi5wYXRoID0gdXJsbGliLnF1b3RlKHBhdGgpCisgICAgICAgIHNlbGYuYWxsb3dhbmNlID0gYWxsb3dhbmNlCisKKyAgICBkZWYgYXBwbGllc190byhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLnBhdGggPT0gIioiIG9yIGZpbGVuYW1lLnN0YXJ0c3dpdGgoc2VsZi5wYXRoKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi5hbGxvd2FuY2UgYW5kICJBbGxvdyIgb3IgIkRpc2FsbG93IikgKyAiOiAiICsgc2VsZi5wYXRoCisKKworY2xhc3MgRW50cnk6CisgICAgIiIiQW4gZW50cnkgaGFzIG9uZSBvciBtb3JlIHVzZXItYWdlbnRzIGFuZCB6ZXJvIG9yIG1vcmUgcnVsZWxpbmVzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnVzZXJhZ2VudHMgPSBbXQorICAgICAgICBzZWxmLnJ1bGVsaW5lcyA9IFtdCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0ID0gW10KKyAgICAgICAgZm9yIGFnZW50IGluIHNlbGYudXNlcmFnZW50czoKKyAgICAgICAgICAgIHJldC5leHRlbmQoWyJVc2VyLWFnZW50OiAiLCBhZ2VudCwgIlxuIl0pCisgICAgICAgIGZvciBsaW5lIGluIHNlbGYucnVsZWxpbmVzOgorICAgICAgICAgICAgcmV0LmV4dGVuZChbc3RyKGxpbmUpLCAiXG4iXSkKKyAgICAgICAgcmV0dXJuICcnLmpvaW4ocmV0KQorCisgICAgZGVmIGFwcGxpZXNfdG8oc2VsZiwgdXNlcmFnZW50KToKKyAgICAgICAgIiIiY2hlY2sgaWYgdGhpcyBlbnRyeSBhcHBsaWVzIHRvIHRoZSBzcGVjaWZpZWQgYWdlbnQiIiIKKyAgICAgICAgIyBzcGxpdCB0aGUgbmFtZSB0b2tlbiBhbmQgbWFrZSBpdCBsb3dlciBjYXNlCisgICAgICAgIHVzZXJhZ2VudCA9IHVzZXJhZ2VudC5zcGxpdCgiLyIpWzBdLmxvd2VyKCkKKyAgICAgICAgZm9yIGFnZW50IGluIHNlbGYudXNlcmFnZW50czoKKyAgICAgICAgICAgIGlmIGFnZW50ID09ICcqJzoKKyAgICAgICAgICAgICAgICAjIHdlIGhhdmUgdGhlIGNhdGNoLWFsbCBhZ2VudAorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBhZ2VudCA9IGFnZW50Lmxvd2VyKCkKKyAgICAgICAgICAgIGlmIGFnZW50IGluIHVzZXJhZ2VudDoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBhbGxvd2FuY2Uoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiIiJQcmVjb25kaXRpb25zOgorICAgICAgICAtIG91ciBhZ2VudCBhcHBsaWVzIHRvIHRoaXMgZW50cnkKKyAgICAgICAgLSBmaWxlbmFtZSBpcyBVUkwgZGVjb2RlZCIiIgorICAgICAgICBmb3IgbGluZSBpbiBzZWxmLnJ1bGVsaW5lczoKKyAgICAgICAgICAgIGlmIGxpbmUuYXBwbGllc190byhmaWxlbmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUuYWxsb3dhbmNlCisgICAgICAgIHJldHVybiBUcnVlCisKK2NsYXNzIFVSTG9wZW5lcih1cmxsaWIuRmFuY3lVUkxvcGVuZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHVybGxpYi5GYW5jeVVSTG9wZW5lci5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi5lcnJjb2RlID0gMjAwCisKKyAgICBkZWYgcHJvbXB0X3VzZXJfcGFzc3dkKHNlbGYsIGhvc3QsIHJlYWxtKToKKyAgICAgICAgIyMgSWYgcm9ib3RzLnR4dCBmaWxlIGlzIGFjY2Vzc2libGUgb25seSB3aXRoIGEgcGFzc3dvcmQsCisgICAgICAgICMjIHdlIGFjdCBhcyBpZiB0aGUgZmlsZSB3YXNuJ3QgdGhlcmUuCisgICAgICAgIHJldHVybiBOb25lLCBOb25lCisKKyAgICBkZWYgaHR0cF9lcnJvcl9kZWZhdWx0KHNlbGYsIHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycyk6CisgICAgICAgIHNlbGYuZXJyY29kZSA9IGVycmNvZGUKKyAgICAgICAgcmV0dXJuIHVybGxpYi5GYW5jeVVSTG9wZW5lci5odHRwX2Vycm9yX2RlZmF1bHQoc2VsZiwgdXJsLCBmcCwgZXJyY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybXNnLCBoZWFkZXJzKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9yb2JvdHBhcnNlci5weWMgYi9saWIvcHl0aG9uMi43L3JvYm90cGFyc2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJmN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yb2JvdHBhcnNlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9yb2JvdHBhcnNlci5weW8gYi9saWIvcHl0aG9uMi43L3JvYm90cGFyc2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJmN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yb2JvdHBhcnNlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ydW5weS5weSBiL2xpYi9weXRob24yLjcvcnVucHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkN2NjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcnVucHkucHkKQEAgLTAsMCArMSwyNzggQEAKKyIiInJ1bnB5LnB5IC0gbG9jYXRpbmcgYW5kIHJ1bm5pbmcgUHl0aG9uIGNvZGUgdXNpbmcgdGhlIG1vZHVsZSBuYW1lc3BhY2UKKworUHJvdmlkZXMgc3VwcG9ydCBmb3IgbG9jYXRpbmcgYW5kIHJ1bm5pbmcgUHl0aG9uIHNjcmlwdHMgdXNpbmcgdGhlIFB5dGhvbgorbW9kdWxlIG5hbWVzcGFjZSBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgZmlsZXN5c3RlbS4KKworVGhpcyBhbGxvd3MgUHl0aG9uIGNvZGUgdG8gcGxheSBuaWNlbHkgd2l0aCBub24tZmlsZXN5c3RlbSBiYXNlZCBQRVAgMzAyCitpbXBvcnRlcnMgd2hlbiBsb2NhdGluZyBzdXBwb3J0IHNjcmlwdHMgYXMgd2VsbCBhcyB3aGVuIGltcG9ydGluZyBtb2R1bGVzLgorIiIiCisjIFdyaXR0ZW4gYnkgTmljayBDb2dobGFuIDxuY29naGxhbiBhdCBnbWFpbC5jb20+CisjICAgIHRvIGltcGxlbWVudCBQRVAgMzM4IChFeGVjdXRpbmcgTW9kdWxlcyBhcyBTY3JpcHRzKQorCitpbXBvcnQgc3lzCitpbXBvcnQgaW1wCitmcm9tIHBrZ3V0aWwgaW1wb3J0IHJlYWRfY29kZQordHJ5OgorICAgIGZyb20gaW1wIGltcG9ydCBnZXRfbG9hZGVyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBwa2d1dGlsIGltcG9ydCBnZXRfbG9hZGVyCisKK19fYWxsX18gPSBbCisgICAgInJ1bl9tb2R1bGUiLCAicnVuX3BhdGgiLAorXQorCitjbGFzcyBfVGVtcE1vZHVsZShvYmplY3QpOgorICAgICIiIlRlbXBvcmFyaWx5IHJlcGxhY2UgYSBtb2R1bGUgaW4gc3lzLm1vZHVsZXMgd2l0aCBhbiBlbXB0eSBuYW1lc3BhY2UiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kX25hbWUpOgorICAgICAgICBzZWxmLm1vZF9uYW1lID0gbW9kX25hbWUKKyAgICAgICAgc2VsZi5tb2R1bGUgPSBpbXAubmV3X21vZHVsZShtb2RfbmFtZSkKKyAgICAgICAgc2VsZi5fc2F2ZWRfbW9kdWxlID0gW10KKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIG1vZF9uYW1lID0gc2VsZi5tb2RfbmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9zYXZlZF9tb2R1bGUuYXBwZW5kKHN5cy5tb2R1bGVzW21vZF9uYW1lXSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzeXMubW9kdWxlc1ttb2RfbmFtZV0gPSBzZWxmLm1vZHVsZQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5fc2F2ZWRfbW9kdWxlOgorICAgICAgICAgICAgc3lzLm1vZHVsZXNbc2VsZi5tb2RfbmFtZV0gPSBzZWxmLl9zYXZlZF9tb2R1bGVbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tzZWxmLm1vZF9uYW1lXQorICAgICAgICBzZWxmLl9zYXZlZF9tb2R1bGUgPSBbXQorCitjbGFzcyBfTW9kaWZpZWRBcmd2MChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBzZWxmLl9zYXZlZF92YWx1ZSA9IHNlbGYuX3NlbnRpbmVsID0gb2JqZWN0KCkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3NhdmVkX3ZhbHVlIGlzIG5vdCBzZWxmLl9zZW50aW5lbDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQWxyZWFkeSBwcmVzZXJ2aW5nIHNhdmVkIHZhbHVlIikKKyAgICAgICAgc2VsZi5fc2F2ZWRfdmFsdWUgPSBzeXMuYXJndlswXQorICAgICAgICBzeXMuYXJndlswXSA9IHNlbGYudmFsdWUKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYudmFsdWUgPSBzZWxmLl9zZW50aW5lbAorICAgICAgICBzeXMuYXJndlswXSA9IHNlbGYuX3NhdmVkX3ZhbHVlCisKK2RlZiBfcnVuX2NvZGUoY29kZSwgcnVuX2dsb2JhbHMsIGluaXRfZ2xvYmFscz1Ob25lLAorICAgICAgICAgICAgICBtb2RfbmFtZT1Ob25lLCBtb2RfZm5hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgbW9kX2xvYWRlcj1Ob25lLCBwa2dfbmFtZT1Ob25lKToKKyAgICAiIiJIZWxwZXIgdG8gcnVuIGNvZGUgaW4gbm9taW5hdGVkIG5hbWVzcGFjZSIiIgorICAgIGlmIGluaXRfZ2xvYmFscyBpcyBub3QgTm9uZToKKyAgICAgICAgcnVuX2dsb2JhbHMudXBkYXRlKGluaXRfZ2xvYmFscykKKyAgICBydW5fZ2xvYmFscy51cGRhdGUoX19uYW1lX18gPSBtb2RfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgX19maWxlX18gPSBtb2RfZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIF9fbG9hZGVyX18gPSBtb2RfbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBfX3BhY2thZ2VfXyA9IHBrZ19uYW1lKQorICAgIGV4ZWMgY29kZSBpbiBydW5fZ2xvYmFscworICAgIHJldHVybiBydW5fZ2xvYmFscworCitkZWYgX3J1bl9tb2R1bGVfY29kZShjb2RlLCBpbml0X2dsb2JhbHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgbW9kX25hbWU9Tm9uZSwgbW9kX2ZuYW1lPU5vbmUsCisgICAgICAgICAgICAgICAgICAgIG1vZF9sb2FkZXI9Tm9uZSwgcGtnX25hbWU9Tm9uZSk6CisgICAgIiIiSGVscGVyIHRvIHJ1biBjb2RlIGluIG5ldyBuYW1lc3BhY2Ugd2l0aCBzeXMgbW9kaWZpZWQiIiIKKyAgICB3aXRoIF9UZW1wTW9kdWxlKG1vZF9uYW1lKSBhcyB0ZW1wX21vZHVsZSwgX01vZGlmaWVkQXJndjAobW9kX2ZuYW1lKToKKyAgICAgICAgbW9kX2dsb2JhbHMgPSB0ZW1wX21vZHVsZS5tb2R1bGUuX19kaWN0X18KKyAgICAgICAgX3J1bl9jb2RlKGNvZGUsIG1vZF9nbG9iYWxzLCBpbml0X2dsb2JhbHMsCisgICAgICAgICAgICAgICAgICBtb2RfbmFtZSwgbW9kX2ZuYW1lLCBtb2RfbG9hZGVyLCBwa2dfbmFtZSkKKyAgICAjIENvcHkgdGhlIGdsb2JhbHMgb2YgdGhlIHRlbXBvcmFyeSBtb2R1bGUsIGFzIHRoZXkKKyAgICAjIG1heSBiZSBjbGVhcmVkIHdoZW4gdGhlIHRlbXBvcmFyeSBtb2R1bGUgZ29lcyBhd2F5CisgICAgcmV0dXJuIG1vZF9nbG9iYWxzLmNvcHkoKQorCisKKyMgVGhpcyBoZWxwZXIgaXMgbmVlZGVkIGR1ZSB0byBhIG1pc3NpbmcgY29tcG9uZW50IGluIHRoZSBQRVAgMzAyCisjIGxvYWRlciBwcm90b2NvbCAoc3BlY2lmaWNhbGx5LCAiZ2V0X2ZpbGVuYW1lIiBpcyBub24tc3RhbmRhcmQpCisjIFNpbmNlIHdlIGNhbid0IGludHJvZHVjZSBuZXcgZmVhdHVyZXMgaW4gbWFpbnRlbmFuY2UgcmVsZWFzZXMsCisjIHN1cHBvcnQgd2FzIGFkZGVkIHRvIHppcGltcG9ydGVyIHVuZGVyIHRoZSBuYW1lICdfZ2V0X2ZpbGVuYW1lJworZGVmIF9nZXRfZmlsZW5hbWUobG9hZGVyLCBtb2RfbmFtZSk6CisgICAgZm9yIGF0dHIgaW4gKCJnZXRfZmlsZW5hbWUiLCAiX2dldF9maWxlbmFtZSIpOgorICAgICAgICBtZXRoID0gZ2V0YXR0cihsb2FkZXIsIGF0dHIsIE5vbmUpCisgICAgICAgIGlmIG1ldGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gbWV0aChtb2RfbmFtZSkKKyAgICByZXR1cm4gTm9uZQorCisjIEhlbHBlciB0byBnZXQgdGhlIGxvYWRlciwgY29kZSBhbmQgZmlsZW5hbWUgZm9yIGEgbW9kdWxlCitkZWYgX2dldF9tb2R1bGVfZGV0YWlscyhtb2RfbmFtZSk6CisgICAgbG9hZGVyID0gZ2V0X2xvYWRlcihtb2RfbmFtZSkKKyAgICBpZiBsb2FkZXIgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIk5vIG1vZHVsZSBuYW1lZCAlcyIgJSBtb2RfbmFtZSkKKyAgICBpZiBsb2FkZXIuaXNfcGFja2FnZShtb2RfbmFtZSk6CisgICAgICAgIGlmIG1vZF9uYW1lID09ICJfX21haW5fXyIgb3IgbW9kX25hbWUuZW5kc3dpdGgoIi5fX21haW5fXyIpOgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkNhbm5vdCB1c2UgcGFja2FnZSBhcyBfX21haW5fXyBtb2R1bGUiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwa2dfbWFpbl9uYW1lID0gbW9kX25hbWUgKyAiLl9fbWFpbl9fIgorICAgICAgICAgICAgcmV0dXJuIF9nZXRfbW9kdWxlX2RldGFpbHMocGtnX21haW5fbmFtZSkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlOgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoKCIlczsgJXIgaXMgYSBwYWNrYWdlIGFuZCBjYW5ub3QgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIGRpcmVjdGx5IGV4ZWN1dGVkIikgJShlLCBtb2RfbmFtZSkpCisgICAgY29kZSA9IGxvYWRlci5nZXRfY29kZShtb2RfbmFtZSkKKyAgICBpZiBjb2RlIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJObyBjb2RlIG9iamVjdCBhdmFpbGFibGUgZm9yICVzIiAlIG1vZF9uYW1lKQorICAgIGZpbGVuYW1lID0gX2dldF9maWxlbmFtZShsb2FkZXIsIG1vZF9uYW1lKQorICAgIHJldHVybiBtb2RfbmFtZSwgbG9hZGVyLCBjb2RlLCBmaWxlbmFtZQorCisKK2RlZiBfZ2V0X21haW5fbW9kdWxlX2RldGFpbHMoKToKKyAgICAjIEhlbHBlciB0aGF0IGdpdmVzIGEgbmljZXIgZXJyb3IgbWVzc2FnZSB3aGVuIGF0dGVtcHRpbmcgdG8KKyAgICAjIGV4ZWN1dGUgYSB6aXBmaWxlIG9yIGRpcmVjdG9yeSBieSBpbnZva2luZyBfX21haW5fXy5weQorICAgIG1haW5fbmFtZSA9ICJfX21haW5fXyIKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBfZ2V0X21vZHVsZV9kZXRhaWxzKG1haW5fbmFtZSkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3IgYXMgZXhjOgorICAgICAgICBpZiBtYWluX25hbWUgaW4gc3RyKGV4Yyk6CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiY2FuJ3QgZmluZCAlciBtb2R1bGUgaW4gJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYWluX25hbWUsIHN5cy5wYXRoWzBdKSkKKyAgICAgICAgcmFpc2UKKworIyBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIC1tIHN3aXRjaCBhbmQgZGlyZWN0CisjIGV4ZWN1dGlvbiBvZiB6aXBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYW5kIGlzIGRlbGliZXJhdGVseSBrZXB0IHByaXZhdGUuCisjIFRoaXMgYXZvaWRzIGEgcmVwZWF0IG9mIHRoZSBzaXR1YXRpb24gd2hlcmUgcnVuX21vZHVsZSgpIG5vIGxvbmdlciBtZXQgdGhlCisjIG5lZWRzIG9mIG1haW5tb2R1bGUuYywgYnV0IGNvdWxkbid0IGJlIGNoYW5nZWQgYmVjYXVzZSBpdCB3YXMgcHVibGljCitkZWYgX3J1bl9tb2R1bGVfYXNfbWFpbihtb2RfbmFtZSwgYWx0ZXJfYXJndj1UcnVlKToKKyAgICAiIiJSdW5zIHRoZSBkZXNpZ25hdGVkIG1vZHVsZSBpbiB0aGUgX19tYWluX18gbmFtZXNwYWNlCisKKyAgICAgICBOb3RlIHRoYXQgdGhlIGV4ZWN1dGVkIG1vZHVsZSB3aWxsIGhhdmUgZnVsbCBhY2Nlc3MgdG8gdGhlCisgICAgICAgX19tYWluX18gbmFtZXNwYWNlLiBJZiB0aGlzIGlzIG5vdCBkZXNpcmFibGUsIHRoZSBydW5fbW9kdWxlKCkKKyAgICAgICBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCB0byBydW4gdGhlIG1vZHVsZSBjb2RlIGluIGEgZnJlc2ggbmFtZXNwYWNlLgorCisgICAgICAgQXQgdGhlIHZlcnkgbGVhc3QsIHRoZXNlIHZhcmlhYmxlcyBpbiBfX21haW5fXyB3aWxsIGJlIG92ZXJ3cml0dGVuOgorICAgICAgICAgICBfX25hbWVfXworICAgICAgICAgICBfX2ZpbGVfXworICAgICAgICAgICBfX2xvYWRlcl9fCisgICAgICAgICAgIF9fcGFja2FnZV9fCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBpZiBhbHRlcl9hcmd2IG9yIG1vZF9uYW1lICE9ICJfX21haW5fXyI6ICMgaS5lLiAtbSBzd2l0Y2gKKyAgICAgICAgICAgIG1vZF9uYW1lLCBsb2FkZXIsIGNvZGUsIGZuYW1lID0gX2dldF9tb2R1bGVfZGV0YWlscyhtb2RfbmFtZSkKKyAgICAgICAgZWxzZTogICAgICAgICAgIyBpLmUuIGRpcmVjdG9yeSBvciB6aXBmaWxlIGV4ZWN1dGlvbgorICAgICAgICAgICAgbW9kX25hbWUsIGxvYWRlciwgY29kZSwgZm5hbWUgPSBfZ2V0X21haW5fbW9kdWxlX2RldGFpbHMoKQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvciBhcyBleGM6CisgICAgICAgIG1zZyA9ICIlczogJXMiICUgKHN5cy5leGVjdXRhYmxlLCBzdHIoZXhjKSkKKyAgICAgICAgc3lzLmV4aXQobXNnKQorICAgIHBrZ19uYW1lID0gbW9kX25hbWUucnBhcnRpdGlvbignLicpWzBdCisgICAgbWFpbl9nbG9iYWxzID0gc3lzLm1vZHVsZXNbIl9fbWFpbl9fIl0uX19kaWN0X18KKyAgICBpZiBhbHRlcl9hcmd2OgorICAgICAgICBzeXMuYXJndlswXSA9IGZuYW1lCisgICAgcmV0dXJuIF9ydW5fY29kZShjb2RlLCBtYWluX2dsb2JhbHMsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAiX19tYWluX18iLCBmbmFtZSwgbG9hZGVyLCBwa2dfbmFtZSkKKworZGVmIHJ1bl9tb2R1bGUobW9kX25hbWUsIGluaXRfZ2xvYmFscz1Ob25lLAorICAgICAgICAgICAgICAgcnVuX25hbWU9Tm9uZSwgYWx0ZXJfc3lzPUZhbHNlKToKKyAgICAiIiJFeGVjdXRlIGEgbW9kdWxlJ3MgY29kZSB3aXRob3V0IGltcG9ydGluZyBpdAorCisgICAgICAgUmV0dXJucyB0aGUgcmVzdWx0aW5nIHRvcCBsZXZlbCBuYW1lc3BhY2UgZGljdGlvbmFyeQorICAgICIiIgorICAgIG1vZF9uYW1lLCBsb2FkZXIsIGNvZGUsIGZuYW1lID0gX2dldF9tb2R1bGVfZGV0YWlscyhtb2RfbmFtZSkKKyAgICBpZiBydW5fbmFtZSBpcyBOb25lOgorICAgICAgICBydW5fbmFtZSA9IG1vZF9uYW1lCisgICAgcGtnX25hbWUgPSBtb2RfbmFtZS5ycGFydGl0aW9uKCcuJylbMF0KKyAgICBpZiBhbHRlcl9zeXM6CisgICAgICAgIHJldHVybiBfcnVuX21vZHVsZV9jb2RlKGNvZGUsIGluaXRfZ2xvYmFscywgcnVuX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLCBsb2FkZXIsIHBrZ19uYW1lKQorICAgIGVsc2U6CisgICAgICAgICMgTGVhdmUgdGhlIHN5cyBtb2R1bGUgYWxvbmUKKyAgICAgICAgcmV0dXJuIF9ydW5fY29kZShjb2RlLCB7fSwgaW5pdF9nbG9iYWxzLCBydW5fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwgbG9hZGVyLCBwa2dfbmFtZSkKKworCisjIFhYWCAobmNvZ2hsYW4pOiBQZXJoYXBzIGV4cG9zZSB0aGUgQyBBUEkgZnVuY3Rpb24KKyMgYXMgaW1wLmdldF9pbXBvcnRlciBpbnN0ZWFkIG9mIHJlaW1wbGVtZW50aW5nIGl0IGluIFB5dGhvbj8KK2RlZiBfZ2V0X2ltcG9ydGVyKHBhdGhfbmFtZSk6CisgICAgIiIiUHl0aG9uIHZlcnNpb24gb2YgUHlJbXBvcnRfR2V0SW1wb3J0ZXIgQyBBUEkgZnVuY3Rpb24iIiIKKyAgICBjYWNoZSA9IHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlCisgICAgdHJ5OgorICAgICAgICBpbXBvcnRlciA9IGNhY2hlW3BhdGhfbmFtZV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICMgTm90IHlldCBjYWNoZWQuIEZsYWcgYXMgdXNpbmcgdGhlCisgICAgICAgICMgc3RhbmRhcmQgbWFjaGluZXJ5IHVudGlsIHdlIGZpbmlzaAorICAgICAgICAjIGNoZWNraW5nIHRoZSBob29rcworICAgICAgICBjYWNoZVtwYXRoX25hbWVdID0gTm9uZQorICAgICAgICBmb3IgaG9vayBpbiBzeXMucGF0aF9ob29rczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnRlciA9IGhvb2socGF0aF9uYW1lKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBUaGUgZm9sbG93aW5nIGNoZWNrIGxvb2tzIGEgYml0IG9kZC4gVGhlIHRyaWNrIGlzIHRoYXQKKyAgICAgICAgICAgICMgTnVsbEltcG9ydGVyIHJhaXNlcyBJbXBvcnRFcnJvciBpZiB0aGUgc3VwcGxpZWQgcGF0aCBpcyBhCisgICAgICAgICAgICAjICp2YWxpZCogZGlyZWN0b3J5IGVudHJ5IChhbmQgaGVuY2UgYWJsZSB0byBiZSBoYW5kbGVkCisgICAgICAgICAgICAjIGJ5IHRoZSBzdGFuZGFyZCBpbXBvcnQgbWFjaGluZXJ5KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydGVyID0gaW1wLk51bGxJbXBvcnRlcihwYXRoX25hbWUpCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgY2FjaGVbcGF0aF9uYW1lXSA9IGltcG9ydGVyCisgICAgcmV0dXJuIGltcG9ydGVyCisKK2RlZiBfZ2V0X2NvZGVfZnJvbV9maWxlKGZuYW1lKToKKyAgICAjIENoZWNrIGZvciBhIGNvbXBpbGVkIGZpbGUgZmlyc3QKKyAgICB3aXRoIG9wZW4oZm5hbWUsICJyYiIpIGFzIGY6CisgICAgICAgIGNvZGUgPSByZWFkX2NvZGUoZikKKyAgICBpZiBjb2RlIGlzIE5vbmU6CisgICAgICAgICMgVGhhdCBkaWRuJ3Qgd29yaywgc28gdHJ5IGl0IGFzIG5vcm1hbCBzb3VyY2UgY29kZQorICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICJyVSIpIGFzIGY6CisgICAgICAgICAgICBjb2RlID0gY29tcGlsZShmLnJlYWQoKSwgZm5hbWUsICdleGVjJykKKyAgICByZXR1cm4gY29kZQorCitkZWYgcnVuX3BhdGgocGF0aF9uYW1lLCBpbml0X2dsb2JhbHM9Tm9uZSwgcnVuX25hbWU9Tm9uZSk6CisgICAgIiIiRXhlY3V0ZSBjb2RlIGxvY2F0ZWQgYXQgdGhlIHNwZWNpZmllZCBmaWxlc3lzdGVtIGxvY2F0aW9uCisKKyAgICAgICBSZXR1cm5zIHRoZSByZXN1bHRpbmcgdG9wIGxldmVsIG5hbWVzcGFjZSBkaWN0aW9uYXJ5CisKKyAgICAgICBUaGUgZmlsZSBwYXRoIG1heSByZWZlciBkaXJlY3RseSB0byBhIFB5dGhvbiBzY3JpcHQgKGkuZS4KKyAgICAgICBvbmUgdGhhdCBjb3VsZCBiZSBkaXJlY3RseSBleGVjdXRlZCB3aXRoIGV4ZWNmaWxlKSBvciBlbHNlCisgICAgICAgaXQgbWF5IHJlZmVyIHRvIGEgemlwZmlsZSBvciBkaXJlY3RvcnkgY29udGFpbmluZyBhIHRvcAorICAgICAgIGxldmVsIF9fbWFpbl9fLnB5IHNjcmlwdC4KKyAgICAiIiIKKyAgICBpZiBydW5fbmFtZSBpcyBOb25lOgorICAgICAgICBydW5fbmFtZSA9ICI8cnVuX3BhdGg+IgorICAgIGltcG9ydGVyID0gX2dldF9pbXBvcnRlcihwYXRoX25hbWUpCisgICAgaWYgaXNpbnN0YW5jZShpbXBvcnRlciwgaW1wLk51bGxJbXBvcnRlcik6CisgICAgICAgICMgTm90IGEgdmFsaWQgc3lzLnBhdGggZW50cnksIHNvIHJ1biB0aGUgY29kZSBkaXJlY3RseQorICAgICAgICAjIGV4ZWNmaWxlKCkgZG9lc24ndCBoZWxwIGFzIHdlIHdhbnQgdG8gYWxsb3cgY29tcGlsZWQgZmlsZXMKKyAgICAgICAgY29kZSA9IF9nZXRfY29kZV9mcm9tX2ZpbGUocGF0aF9uYW1lKQorICAgICAgICByZXR1cm4gX3J1bl9tb2R1bGVfY29kZShjb2RlLCBpbml0X2dsb2JhbHMsIHJ1bl9uYW1lLCBwYXRoX25hbWUpCisgICAgZWxzZToKKyAgICAgICAgIyBJbXBvcnRlciBpcyBkZWZpbmVkIGZvciBwYXRoLCBzbyBhZGQgaXQgdG8KKyAgICAgICAgIyB0aGUgc3RhcnQgb2Ygc3lzLnBhdGgKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHBhdGhfbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBIZXJlJ3Mgd2hlcmUgdGhpbmdzIGFyZSBhIGxpdHRsZSBkaWZmZXJlbnQgZnJvbSB0aGUgcnVuX21vZHVsZQorICAgICAgICAgICAgIyBjYXNlLiBUaGVyZSwgd2Ugb25seSBoYWQgdG8gcmVwbGFjZSB0aGUgbW9kdWxlIGluIHN5cyB3aGlsZSB0aGUKKyAgICAgICAgICAgICMgY29kZSB3YXMgcnVubmluZyBhbmQgZG9pbmcgc28gd2FzIHNvbWV3aGF0IG9wdGlvbmFsLiBIZXJlLCB3ZQorICAgICAgICAgICAgIyBoYXZlIG5vIGNob2ljZSBhbmQgd2UgaGF2ZSB0byByZW1vdmUgaXQgZXZlbiB3aGlsZSB3ZSByZWFkIHRoZQorICAgICAgICAgICAgIyBjb2RlLiBJZiB3ZSBkb24ndCBkbyB0aGlzLCBhIF9fbG9hZGVyX18gYXR0cmlidXRlIGluIHRoZQorICAgICAgICAgICAgIyBleGlzdGluZyBfX21haW5fXyBtb2R1bGUgbWF5IHByZXZlbnQgbG9jYXRpb24gb2YgdGhlIG5ldyBtb2R1bGUuCisgICAgICAgICAgICBtYWluX25hbWUgPSAiX19tYWluX18iCisgICAgICAgICAgICBzYXZlZF9tYWluID0gc3lzLm1vZHVsZXNbbWFpbl9uYW1lXQorICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21haW5fbmFtZV0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtb2RfbmFtZSwgbG9hZGVyLCBjb2RlLCBmbmFtZSA9IF9nZXRfbWFpbl9tb2R1bGVfZGV0YWlscygpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHN5cy5tb2R1bGVzW21haW5fbmFtZV0gPSBzYXZlZF9tYWluCisgICAgICAgICAgICBwa2dfbmFtZSA9ICIiCisgICAgICAgICAgICB3aXRoIF9UZW1wTW9kdWxlKHJ1bl9uYW1lKSBhcyB0ZW1wX21vZHVsZSwgXAorICAgICAgICAgICAgICAgICBfTW9kaWZpZWRBcmd2MChwYXRoX25hbWUpOgorICAgICAgICAgICAgICAgIG1vZF9nbG9iYWxzID0gdGVtcF9tb2R1bGUubW9kdWxlLl9fZGljdF9fCisgICAgICAgICAgICAgICAgcmV0dXJuIF9ydW5fY29kZShjb2RlLCBtb2RfZ2xvYmFscywgaW5pdF9nbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX25hbWUsIGZuYW1lLCBsb2FkZXIsIHBrZ19uYW1lKS5jb3B5KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMucGF0aC5yZW1vdmUocGF0aF9uYW1lKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgIyBSdW4gdGhlIG1vZHVsZSBzcGVjaWZpZWQgYXMgdGhlIG5leHQgY29tbWFuZCBsaW5lIGFyZ3VtZW50CisgICAgaWYgbGVuKHN5cy5hcmd2KSA8IDI6CisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJObyBtb2R1bGUgc3BlY2lmaWVkIGZvciBleGVjdXRpb24iCisgICAgZWxzZToKKyAgICAgICAgZGVsIHN5cy5hcmd2WzBdICMgTWFrZSB0aGUgcmVxdWVzdGVkIG1vZHVsZSBzeXMuYXJndlswXQorICAgICAgICBfcnVuX21vZHVsZV9hc19tYWluKHN5cy5hcmd2WzBdKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ydW5weS5weWMgYi9saWIvcHl0aG9uMi43L3J1bnB5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2ZjNmFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ydW5weS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ydW5weS5weW8gYi9saWIvcHl0aG9uMi43L3J1bnB5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2ZjNmFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ydW5weS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zY2hlZC5weSBiL2xpYi9weXRob24yLjcvc2NoZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2NDZhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2NoZWQucHkKQEAgLTAsMCArMSwxMzQgQEAKKyIiIkEgZ2VuZXJhbGx5IHVzZWZ1bCBldmVudCBzY2hlZHVsZXIgY2xhc3MuCisKK0VhY2ggaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBtYW5hZ2VzIGl0cyBvd24gcXVldWUuCitObyBtdWx0aS10aHJlYWRpbmcgaXMgaW1wbGllZDsgeW91IGFyZSBzdXBwb3NlZCB0byBoYWNrIHRoYXQKK3lvdXJzZWxmLCBvciB1c2UgYSBzaW5nbGUgaW5zdGFuY2UgcGVyIGFwcGxpY2F0aW9uLgorCitFYWNoIGluc3RhbmNlIGlzIHBhcmFtZXRyaXplZCB3aXRoIHR3byBmdW5jdGlvbnMsIG9uZSB0aGF0IGlzCitzdXBwb3NlZCB0byByZXR1cm4gdGhlIGN1cnJlbnQgdGltZSwgb25lIHRoYXQgaXMgc3VwcG9zZWQgdG8KK2ltcGxlbWVudCBhIGRlbGF5LiAgWW91IGNhbiBpbXBsZW1lbnQgcmVhbC10aW1lIHNjaGVkdWxpbmcgYnkKK3N1YnN0aXR1dGluZyB0aW1lIGFuZCBzbGVlcCBmcm9tIGJ1aWx0LWluIG1vZHVsZSB0aW1lLCBvciB5b3UgY2FuCitpbXBsZW1lbnQgc2ltdWxhdGVkIHRpbWUgYnkgd3JpdGluZyB5b3VyIG93biBmdW5jdGlvbnMuICBUaGlzIGNhbgorYWxzbyBiZSB1c2VkIHRvIGludGVncmF0ZSBzY2hlZHVsaW5nIHdpdGggU1REV0lOIGV2ZW50czsgdGhlIGRlbGF5CitmdW5jdGlvbiBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgcXVldWUuICBUaW1lIGNhbiBiZSBleHByZXNzZWQgYXMKK2ludGVnZXJzIG9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMsIGFzIGxvbmcgYXMgaXQgaXMgY29uc2lzdGVudC4KKworRXZlbnRzIGFyZSBzcGVjaWZpZWQgYnkgdHVwbGVzICh0aW1lLCBwcmlvcml0eSwgYWN0aW9uLCBhcmd1bWVudCkuCitBcyBpbiBVTklYLCBsb3dlciBwcmlvcml0eSBudW1iZXJzIG1lYW4gaGlnaGVyIHByaW9yaXR5OyBpbiB0aGlzCit3YXkgdGhlIHF1ZXVlIGNhbiBiZSBtYWludGFpbmVkIGFzIGEgcHJpb3JpdHkgcXVldWUuICBFeGVjdXRpb24gb2YgdGhlCitldmVudCBtZWFucyBjYWxsaW5nIHRoZSBhY3Rpb24gZnVuY3Rpb24sIHBhc3NpbmcgaXQgdGhlIGFyZ3VtZW50CitzZXF1ZW5jZSBpbiAiYXJndW1lbnQiIChyZW1lbWJlciB0aGF0IGluIFB5dGhvbiwgbXVsdGlwbGUgZnVuY3Rpb24KK2FyZ3VtZW50cyBhcmUgYmUgcGFja2VkIGluIGEgc2VxdWVuY2UpLgorVGhlIGFjdGlvbiBmdW5jdGlvbiBtYXkgYmUgYW4gaW5zdGFuY2UgbWV0aG9kIHNvIGl0CitoYXMgYW5vdGhlciB3YXkgdG8gcmVmZXJlbmNlIHByaXZhdGUgZGF0YSAoYmVzaWRlcyBnbG9iYWwgdmFyaWFibGVzKS4KKyIiIgorCisjIFhYWCBUaGUgdGltZWZ1bmMgYW5kIGRlbGF5ZnVuYyBzaG91bGQgaGF2ZSBiZWVuIGRlZmluZWQgYXMgbWV0aG9kcworIyBYWFggc28geW91IGNhbiBkZWZpbmUgbmV3IGtpbmRzIG9mIHNjaGVkdWxlcnMgdXNpbmcgc3ViY2xhc3NpbmcKKyMgWFhYIGluc3RlYWQgb2YgaGF2aW5nIHRvIGRlZmluZSBhIG1vZHVsZSBvciBjbGFzcyBqdXN0IHRvIGhvbGQKKyMgWFhYIHRoZSBnbG9iYWwgc3RhdGUgb2YgeW91ciBwYXJ0aWN1bGFyIHRpbWUgYW5kIGRlbGF5IGZ1bmN0aW9ucy4KKworaW1wb3J0IGhlYXBxCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCisKK19fYWxsX18gPSBbInNjaGVkdWxlciJdCisKK0V2ZW50ID0gbmFtZWR0dXBsZSgnRXZlbnQnLCAndGltZSwgcHJpb3JpdHksIGFjdGlvbiwgYXJndW1lbnQnKQorCitjbGFzcyBzY2hlZHVsZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpbWVmdW5jLCBkZWxheWZ1bmMpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlLCBwYXNzaW5nIHRoZSB0aW1lIGFuZCBkZWxheQorICAgICAgICBmdW5jdGlvbnMiIiIKKyAgICAgICAgc2VsZi5fcXVldWUgPSBbXQorICAgICAgICBzZWxmLnRpbWVmdW5jID0gdGltZWZ1bmMKKyAgICAgICAgc2VsZi5kZWxheWZ1bmMgPSBkZWxheWZ1bmMKKworICAgIGRlZiBlbnRlcmFicyhzZWxmLCB0aW1lLCBwcmlvcml0eSwgYWN0aW9uLCBhcmd1bWVudCk6CisgICAgICAgICIiIkVudGVyIGEgbmV3IGV2ZW50IGluIHRoZSBxdWV1ZSBhdCBhbiBhYnNvbHV0ZSB0aW1lLgorCisgICAgICAgIFJldHVybnMgYW4gSUQgZm9yIHRoZSBldmVudCB3aGljaCBjYW4gYmUgdXNlZCB0byByZW1vdmUgaXQsCisgICAgICAgIGlmIG5lY2Vzc2FyeS4KKworICAgICAgICAiIiIKKyAgICAgICAgZXZlbnQgPSBFdmVudCh0aW1lLCBwcmlvcml0eSwgYWN0aW9uLCBhcmd1bWVudCkKKyAgICAgICAgaGVhcHEuaGVhcHB1c2goc2VsZi5fcXVldWUsIGV2ZW50KQorICAgICAgICByZXR1cm4gZXZlbnQgIyBUaGUgSUQKKworICAgIGRlZiBlbnRlcihzZWxmLCBkZWxheSwgcHJpb3JpdHksIGFjdGlvbiwgYXJndW1lbnQpOgorICAgICAgICAiIiJBIHZhcmlhbnQgdGhhdCBzcGVjaWZpZXMgdGhlIHRpbWUgYXMgYSByZWxhdGl2ZSB0aW1lLgorCisgICAgICAgIFRoaXMgaXMgYWN0dWFsbHkgdGhlIG1vcmUgY29tbW9ubHkgdXNlZCBpbnRlcmZhY2UuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRpbWUgPSBzZWxmLnRpbWVmdW5jKCkgKyBkZWxheQorICAgICAgICByZXR1cm4gc2VsZi5lbnRlcmFicyh0aW1lLCBwcmlvcml0eSwgYWN0aW9uLCBhcmd1bWVudCkKKworICAgIGRlZiBjYW5jZWwoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiJSZW1vdmUgYW4gZXZlbnQgZnJvbSB0aGUgcXVldWUuCisKKyAgICAgICAgVGhpcyBtdXN0IGJlIHByZXNlbnRlZCB0aGUgSUQgYXMgcmV0dXJuZWQgYnkgZW50ZXIoKS4KKyAgICAgICAgSWYgdGhlIGV2ZW50IGlzIG5vdCBpbiB0aGUgcXVldWUsIHRoaXMgcmFpc2VzIFZhbHVlRXJyb3IuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3F1ZXVlLnJlbW92ZShldmVudCkKKyAgICAgICAgaGVhcHEuaGVhcGlmeShzZWxmLl9xdWV1ZSkKKworICAgIGRlZiBlbXB0eShzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgd2hldGhlciB0aGUgcXVldWUgaXMgZW1wdHkuIiIiCisgICAgICAgIHJldHVybiBub3Qgc2VsZi5fcXVldWUKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICIiIkV4ZWN1dGUgZXZlbnRzIHVudGlsIHRoZSBxdWV1ZSBpcyBlbXB0eS4KKworICAgICAgICBXaGVuIHRoZXJlIGlzIGEgcG9zaXRpdmUgZGVsYXkgdW50aWwgdGhlIGZpcnN0IGV2ZW50LCB0aGUKKyAgICAgICAgZGVsYXkgZnVuY3Rpb24gaXMgY2FsbGVkIGFuZCB0aGUgZXZlbnQgaXMgbGVmdCBpbiB0aGUgcXVldWU7CisgICAgICAgIG90aGVyd2lzZSwgdGhlIGV2ZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWUgYW5kIGV4ZWN1dGVkCisgICAgICAgIChpdHMgYWN0aW9uIGZ1bmN0aW9uIGlzIGNhbGxlZCwgcGFzc2luZyBpdCB0aGUgYXJndW1lbnQpLiAgSWYKKyAgICAgICAgdGhlIGRlbGF5IGZ1bmN0aW9uIHJldHVybnMgcHJlbWF0dXJlbHksIGl0IGlzIHNpbXBseQorICAgICAgICByZXN0YXJ0ZWQuCisKKyAgICAgICAgSXQgaXMgbGVnYWwgZm9yIGJvdGggdGhlIGRlbGF5IGZ1bmN0aW9uIGFuZCB0aGUgYWN0aW9uCisgICAgICAgIGZ1bmN0aW9uIHRvIG1vZGlmeSB0aGUgcXVldWUgb3IgdG8gcmFpc2UgYW4gZXhjZXB0aW9uOworICAgICAgICBleGNlcHRpb25zIGFyZSBub3QgY2F1Z2h0IGJ1dCB0aGUgc2NoZWR1bGVyJ3Mgc3RhdGUgcmVtYWlucworICAgICAgICB3ZWxsLWRlZmluZWQgc28gcnVuKCkgbWF5IGJlIGNhbGxlZCBhZ2Fpbi4KKworICAgICAgICBBIHF1ZXN0aW9uYWJsZSBoYWNrIGlzIGFkZGVkIHRvIGFsbG93IG90aGVyIHRocmVhZHMgdG8gcnVuOgorICAgICAgICBqdXN0IGFmdGVyIGFuIGV2ZW50IGlzIGV4ZWN1dGVkLCBhIGRlbGF5IG9mIDAgaXMgZXhlY3V0ZWQsIHRvCisgICAgICAgIGF2b2lkIG1vbm9wb2xpemluZyB0aGUgQ1BVIHdoZW4gb3RoZXIgdGhyZWFkcyBhcmUgYWxzbworICAgICAgICBydW5uYWJsZS4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBsb2NhbGl6ZSB2YXJpYWJsZSBhY2Nlc3MgdG8gbWluaW1pemUgb3ZlcmhlYWQKKyAgICAgICAgIyBhbmQgdG8gaW1wcm92ZSB0aHJlYWQgc2FmZXR5CisgICAgICAgIHEgPSBzZWxmLl9xdWV1ZQorICAgICAgICBkZWxheWZ1bmMgPSBzZWxmLmRlbGF5ZnVuYworICAgICAgICB0aW1lZnVuYyA9IHNlbGYudGltZWZ1bmMKKyAgICAgICAgcG9wID0gaGVhcHEuaGVhcHBvcAorICAgICAgICB3aGlsZSBxOgorICAgICAgICAgICAgdGltZSwgcHJpb3JpdHksIGFjdGlvbiwgYXJndW1lbnQgPSBjaGVja2VkX2V2ZW50ID0gcVswXQorICAgICAgICAgICAgbm93ID0gdGltZWZ1bmMoKQorICAgICAgICAgICAgaWYgbm93IDwgdGltZToKKyAgICAgICAgICAgICAgICBkZWxheWZ1bmModGltZSAtIG5vdykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXZlbnQgPSBwb3AocSkKKyAgICAgICAgICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSBldmVudCB3YXMgbm90IHJlbW92ZWQgb3IgYWx0ZXJlZAorICAgICAgICAgICAgICAgICMgYnkgYW5vdGhlciB0aHJlYWQgYWZ0ZXIgd2UgbGFzdCBsb29rZWQgYXQgcVswXS4KKyAgICAgICAgICAgICAgICBpZiBldmVudCBpcyBjaGVja2VkX2V2ZW50OgorICAgICAgICAgICAgICAgICAgICBhY3Rpb24oKmFyZ3VtZW50KQorICAgICAgICAgICAgICAgICAgICBkZWxheWZ1bmMoMCkgICAjIExldCBvdGhlciB0aHJlYWRzIHJ1bgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGhlYXBxLmhlYXBwdXNoKHEsIGV2ZW50KQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHF1ZXVlKHNlbGYpOgorICAgICAgICAiIiJBbiBvcmRlcmVkIGxpc3Qgb2YgdXBjb21pbmcgZXZlbnRzLgorCisgICAgICAgIEV2ZW50cyBhcmUgbmFtZWQgdHVwbGVzIHdpdGggZmllbGRzIGZvcjoKKyAgICAgICAgICAgIHRpbWUsIHByaW9yaXR5LCBhY3Rpb24sIGFyZ3VtZW50cworCisgICAgICAgICIiIgorICAgICAgICAjIFVzZSBoZWFwcSB0byBzb3J0IHRoZSBxdWV1ZSByYXRoZXIgdGhhbiB1c2luZyAnc29ydGVkKHNlbGYuX3F1ZXVlKScuCisgICAgICAgICMgV2l0aCBoZWFwcSwgdHdvIGV2ZW50cyBzY2hlZHVsZWQgYXQgdGhlIHNhbWUgdGltZSB3aWxsIHNob3cgaW4KKyAgICAgICAgIyB0aGUgYWN0dWFsIG9yZGVyIHRoZXkgd291bGQgYmUgcmV0cmlldmVkLgorICAgICAgICBldmVudHMgPSBzZWxmLl9xdWV1ZVs6XQorICAgICAgICByZXR1cm4gbWFwKGhlYXBxLmhlYXBwb3AsIFtldmVudHNdKmxlbihldmVudHMpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zY2hlZC5weWMgYi9saWIvcHl0aG9uMi43L3NjaGVkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjZjOTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zY2hlZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zY2hlZC5weW8gYi9saWIvcHl0aG9uMi43L3NjaGVkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjZjOTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zY2hlZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zZXRzLnB5IGIvbGliL3B5dGhvbjIuNy9zZXRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMzFhMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NldHMucHkKQEAgLTAsMCArMSw1NTcgQEAKKyIiIkNsYXNzZXMgdG8gcmVwcmVzZW50IGFyYml0cmFyeSBzZXRzIChpbmNsdWRpbmcgc2V0cyBvZiBzZXRzKS4KKworVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBzZXRzIHVzaW5nIGRpY3Rpb25hcmllcyB3aG9zZSB2YWx1ZXMgYXJlCitpZ25vcmVkLiAgVGhlIHVzdWFsIG9wZXJhdGlvbnMgKHVuaW9uLCBpbnRlcnNlY3Rpb24sIGRlbGV0aW9uLCBldGMuKQorYXJlIHByb3ZpZGVkIGFzIGJvdGggbWV0aG9kcyBhbmQgb3BlcmF0b3JzLgorCitJbXBvcnRhbnQ6IHNldHMgYXJlIG5vdCBzZXF1ZW5jZXMhICBXaGlsZSB0aGV5IHN1cHBvcnQgJ3ggaW4gcycsCisnbGVuKHMpJywgYW5kICdmb3IgeCBpbiBzJywgbm9uZSBvZiB0aG9zZSBvcGVyYXRpb25zIGFyZSB1bmlxdWUgZm9yCitzZXF1ZW5jZXM7IGZvciBleGFtcGxlLCBtYXBwaW5ncyBzdXBwb3J0IGFsbCB0aHJlZSBhcyB3ZWxsLiAgVGhlCitjaGFyYWN0ZXJpc3RpYyBvcGVyYXRpb24gZm9yIHNlcXVlbmNlcyBpcyBzdWJzY3JpcHRpbmcgd2l0aCBzbWFsbAoraW50ZWdlcnM6IHNbaV0sIGZvciBpIGluIHJhbmdlKGxlbihzKSkuICBTZXRzIGRvbid0IHN1cHBvcnQKK3N1YnNjcmlwdGluZyBhdCBhbGwuICBBbHNvLCBzZXF1ZW5jZXMgYWxsb3cgbXVsdGlwbGUgb2NjdXJyZW5jZXMgYW5kCit0aGVpciBlbGVtZW50cyBoYXZlIGEgZGVmaW5pdGUgb3JkZXI7IHNldHMgb24gdGhlIG90aGVyIGhhbmQgZG9uJ3QKK3JlY29yZCBtdWx0aXBsZSBvY2N1cnJlbmNlcyBhbmQgZG9uJ3QgcmVtZW1iZXIgdGhlIG9yZGVyIG9mIGVsZW1lbnQKK2luc2VydGlvbiAod2hpY2ggaXMgd2h5IHRoZXkgZG9uJ3Qgc3VwcG9ydCBzW2ldKS4KKworVGhlIGZvbGxvd2luZyBjbGFzc2VzIGFyZSBwcm92aWRlZDoKKworQmFzZVNldCAtLSBBbGwgdGhlIG9wZXJhdGlvbnMgY29tbW9uIHRvIGJvdGggbXV0YWJsZSBhbmQgaW1tdXRhYmxlCisgICAgc2V0cy4gVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcywgbm90IG1lYW50IHRvIGJlIGRpcmVjdGx5CisgICAgaW5zdGFudGlhdGVkLgorCitTZXQgLS0gTXV0YWJsZSBzZXRzLCBzdWJjbGFzcyBvZiBCYXNlU2V0OyBub3QgaGFzaGFibGUuCisKK0ltbXV0YWJsZVNldCAtLSBJbW11dGFibGUgc2V0cywgc3ViY2xhc3Mgb2YgQmFzZVNldDsgaGFzaGFibGUuCisgICAgQW4gaXRlcmFibGUgYXJndW1lbnQgaXMgbWFuZGF0b3J5IHRvIGNyZWF0ZSBhbiBJbW11dGFibGVTZXQuCisKK19UZW1wb3JhcmlseUltbXV0YWJsZVNldCAtLSBBIHdyYXBwZXIgYXJvdW5kIGEgU2V0LCBoYXNoYWJsZSwKKyAgICBnaXZpbmcgdGhlIHNhbWUgaGFzaCB2YWx1ZSBhcyB0aGUgaW1tdXRhYmxlIHNldCBlcXVpdmFsZW50CisgICAgd291bGQgaGF2ZS4gIERvIG5vdCB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseS4KKworT25seSBoYXNoYWJsZSBvYmplY3RzIGNhbiBiZSBhZGRlZCB0byBhIFNldC4gSW4gcGFydGljdWxhciwgeW91IGNhbm5vdAorcmVhbGx5IGFkZCBhIFNldCBhcyBhbiBlbGVtZW50IHRvIGFub3RoZXIgU2V0OyBpZiB5b3UgdHJ5LCB3aGF0IGlzCithY3R1YWxseSBhZGRlZCBpcyBhbiBJbW11dGFibGVTZXQgYnVpbHQgZnJvbSBpdCAoaXQgY29tcGFyZXMgZXF1YWwgdG8KK3RoZSBvbmUgeW91IHRyaWVkIGFkZGluZykuCisKK1doZW4geW91IGFzayBpZiBgeCBpbiB5JyB3aGVyZSB4IGlzIGEgU2V0IGFuZCB5IGlzIGEgU2V0IG9yCitJbW11dGFibGVTZXQsIHggaXMgd3JhcHBlZCBpbnRvIGEgX1RlbXBvcmFyaWx5SW1tdXRhYmxlU2V0IHosIGFuZAord2hhdCdzIHRlc3RlZCBpcyBhY3R1YWxseSBgeiBpbiB5Jy4KKworIiIiCisKKyMgQ29kZSBoaXN0b3J5OgorIworIyAtIEdyZWcgVi4gV2lsc29uIHdyb3RlIHRoZSBmaXJzdCB2ZXJzaW9uLCB1c2luZyBhIGRpZmZlcmVudCBhcHByb2FjaAorIyAgIHRvIHRoZSBtdXRhYmxlL2ltbXV0YWJsZSBwcm9ibGVtLCBhbmQgaW5oZXJpdGluZyBmcm9tIGRpY3QuCisjCisjIC0gQWxleCBNYXJ0ZWxsaSBtb2RpZmllZCBHcmVnJ3MgdmVyc2lvbiB0byBpbXBsZW1lbnQgdGhlIGN1cnJlbnQKKyMgICBTZXQvSW1tdXRhYmxlU2V0IGFwcHJvYWNoLCBhbmQgbWFrZSB0aGUgZGF0YSBhbiBhdHRyaWJ1dGUuCisjCisjIC0gR3VpZG8gdmFuIFJvc3N1bSByZXdyb3RlIG11Y2ggb2YgdGhlIGNvZGUsIG1hZGUgc29tZSBBUEkgY2hhbmdlcywKKyMgICBhbmQgY2xlYW5lZCB1cCB0aGUgZG9jc3RyaW5ncy4KKyMKKyMgLSBSYXltb25kIEhldHRpbmdlciBhZGRlZCBhIG51bWJlciBvZiBzcGVlZHVwcyBhbmQgb3RoZXIKKyMgICBpbXByb3ZlbWVudHMuCisKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBpZmlsdGVyLCBpZmlsdGVyZmFsc2UKKworX19hbGxfXyA9IFsnQmFzZVNldCcsICdTZXQnLCAnSW1tdXRhYmxlU2V0J10KKworaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy53YXJuKCJ0aGUgc2V0cyBtb2R1bGUgaXMgZGVwcmVjYXRlZCIsIERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIpCisKK2NsYXNzIEJhc2VTZXQob2JqZWN0KToKKyAgICAiIiJDb21tb24gYmFzZSBjbGFzcyBmb3IgbXV0YWJsZSBhbmQgaW1tdXRhYmxlIHNldHMuIiIiCisKKyAgICBfX3Nsb3RzX18gPSBbJ19kYXRhJ10KKworICAgICMgQ29uc3RydWN0b3IKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIiIiVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcy4iIiIKKyAgICAgICAgIyBEb24ndCBjYWxsIHRoaXMgZnJvbSBhIGNvbmNyZXRlIHN1YmNsYXNzIQorICAgICAgICBpZiBzZWxmLl9fY2xhc3NfXyBpcyBCYXNlU2V0OgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAoIkJhc2VTZXQgaXMgYW4gYWJzdHJhY3QgY2xhc3MuICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlIFNldCBvciBJbW11dGFibGVTZXQuIikKKworICAgICMgU3RhbmRhcmQgcHJvdG9jb2xzOiBfX2xlbl9fLCBfX3JlcHJfXywgX19zdHJfXywgX19pdGVyX18KKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiBhIHNldC4iIiIKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9kYXRhKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2V0LgorCisgICAgICAgIFRoaXMgbG9va3MgbGlrZSAnU2V0KFs8bGlzdCBvZiBlbGVtZW50cz5dKScuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fcmVwcigpCisKKyAgICAjIF9fc3RyX18gaXMgdGhlIHNhbWUgYXMgX19yZXByX18KKyAgICBfX3N0cl9fID0gX19yZXByX18KKworICAgIGRlZiBfcmVwcihzZWxmLCBzb3J0ZWQ9RmFsc2UpOgorICAgICAgICBlbGVtZW50cyA9IHNlbGYuX2RhdGEua2V5cygpCisgICAgICAgIGlmIHNvcnRlZDoKKyAgICAgICAgICAgIGVsZW1lbnRzLnNvcnQoKQorICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGVsZW1lbnRzKQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgZWxlbWVudHMgb3IgYSBzZXQuCisKKyAgICAgICAgVGhpcyBpcyB0aGUga2V5cyBpdGVyYXRvciBmb3IgdGhlIHVuZGVybHlpbmcgZGljdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9kYXRhLml0ZXJrZXlzKCkKKworICAgICMgVGhyZWUtd2F5IGNvbXBhcmlzb24gaXMgbm90IHN1cHBvcnRlZC4gIEhvd2V2ZXIsIGJlY2F1c2UgX19lcV9fIGlzCisgICAgIyB0cmllZCBiZWZvcmUgX19jbXBfXywgaWYgU2V0IHggPT0gU2V0IHksIHguX19lcV9fKHkpIHJldHVybnMgVHJ1ZSBhbmQKKyAgICAjIHRoZW4gY21wKHgsIHkpIHJldHVybnMgMCAoUHl0aG9uIGRvZXNuJ3QgYWN0dWFsbHkgY2FsbCBfX2NtcF9fIGluIHRoaXMKKyAgICAjIGNhc2UpLgorCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJjYW4ndCBjb21wYXJlIHNldHMgdXNpbmcgY21wKCkiCisKKyAgICAjIEVxdWFsaXR5IGNvbXBhcmlzb25zIHVzaW5nIHRoZSB1bmRlcmx5aW5nIGRpY3RzLiAgTWl4ZWQtdHlwZSBjb21wYXJpc29ucworICAgICMgYXJlIGFsbG93ZWQgaGVyZSwgd2hlcmUgU2V0ID09IHogZm9yIG5vbi1TZXQgeiBhbHdheXMgcmV0dXJucyBGYWxzZSwKKyAgICAjIGFuZCBTZXQgIT0geiBhbHdheXMgVHJ1ZS4gIFRoaXMgYWxsb3dzIGV4cHJlc3Npb25zIGxpa2UgInggaW4geSIgdG8KKyAgICAjIGdpdmUgdGhlIGV4cGVjdGVkIHJlc3VsdCB3aGVuIHkgaXMgYSBzZXF1ZW5jZSBvZiBtaXhlZCB0eXBlcywgbm90CisgICAgIyByYWlzaW5nIGEgcG9pbnRsZXNzIFR5cGVFcnJvciBqdXN0IGJlY2F1c2UgeSBjb250YWlucyBhIFNldCwgb3IgeCBpcworICAgICMgYSBTZXQgYW5kIHkgY29udGFpbidzIGEgbm9uLXNldCAoImluIiBpbnZva2VzIG9ubHkgX19lcV9fKS4KKyAgICAjIFN1YnRsZTogIGl0IHdvdWxkIGJlIG5pY2VyIGlmIF9fZXFfXyBhbmQgX19uZV9fIGNvdWxkIHJldHVybgorICAgICMgTm90SW1wbGVtZW50ZWQgaW5zdGVhZCBvZiBUcnVlIG9yIEZhbHNlLiAgVGhlbiB0aGUgb3RoZXIgY29tcGFyYW5kCisgICAgIyB3b3VsZCBnZXQgYSBjaGFuY2UgdG8gZGV0ZXJtaW5lIHRoZSByZXN1bHQsIGFuZCBpZiB0aGUgb3RoZXIgY29tcGFyYW5kCisgICAgIyBhbHNvIHJldHVybmVkIE5vdEltcGxlbWVudGVkIHRoZW4gaXQgd291bGQgZmFsbCBiYWNrIHRvIG9iamVjdCBhZGRyZXNzCisgICAgIyBjb21wYXJpc29uICh3aGljaCB3b3VsZCBhbHdheXMgcmV0dXJuIEZhbHNlIGZvciBfX2VxX18gYW5kIGFsd2F5cworICAgICMgVHJ1ZSBmb3IgX19uZV9fKS4gIEhvd2V2ZXIsIHRoYXQgZG9lc24ndCB3b3JrLCBiZWNhdXNlIHRoaXMgdHlwZQorICAgICMgKmFsc28qIGltcGxlbWVudHMgX19jbXBfXzogIGlmLCBlLmcuLCBfX2VxX18gcmV0dXJucyBOb3RJbXBsZW1lbnRlZCwKKyAgICAjIFB5dGhvbiB0cmllcyBfX2NtcF9fIG5leHQsIGFuZCB0aGUgX19jbXBfXyBoZXJlIHRoZW4gcmFpc2VzIFR5cGVFcnJvci4KKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBCYXNlU2V0KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYXRhID09IG90aGVyLl9kYXRhCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBCYXNlU2V0KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYXRhICE9IG90aGVyLl9kYXRhCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgIyBDb3B5aW5nIG9wZXJhdGlvbnMKKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgYSBzZXQuIiIiCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX19jbGFzc19fKCkKKyAgICAgICAgcmVzdWx0Ll9kYXRhLnVwZGF0ZShzZWxmLl9kYXRhKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBfX2NvcHlfXyA9IGNvcHkgIyBGb3IgdGhlIGNvcHkgbW9kdWxlCisKKyAgICBkZWYgX19kZWVwY29weV9fKHNlbGYsIG1lbW8pOgorICAgICAgICAiIiJSZXR1cm4gYSBkZWVwIGNvcHkgb2YgYSBzZXQ7IHVzZWQgYnkgY29weSBtb2R1bGUuIiIiCisgICAgICAgICMgVGhpcyBwcmUtY3JlYXRlcyB0aGUgcmVzdWx0IGFuZCBpbnNlcnRzIGl0IGluIHRoZSBtZW1vCisgICAgICAgICMgZWFybHksIGluIGNhc2UgdGhlIGRlZXAgY29weSByZWN1cnNlcyBpbnRvIGFub3RoZXIgcmVmZXJlbmNlCisgICAgICAgICMgdG8gdGhpcyBzYW1lIHNldC4gIEEgc2V0IGNhbid0IGJlIGFuIGVsZW1lbnQgb2YgaXRzZWxmLCBidXQKKyAgICAgICAgIyBpdCBjYW4gY2VydGFpbmx5IGNvbnRhaW4gYW4gb2JqZWN0IHRoYXQgaGFzIGEgcmVmZXJlbmNlIHRvCisgICAgICAgICMgaXRzZWxmLgorICAgICAgICBmcm9tIGNvcHkgaW1wb3J0IGRlZXBjb3B5CisgICAgICAgIHJlc3VsdCA9IHNlbGYuX19jbGFzc19fKCkKKyAgICAgICAgbWVtb1tpZChzZWxmKV0gPSByZXN1bHQKKyAgICAgICAgZGF0YSA9IHJlc3VsdC5fZGF0YQorICAgICAgICB2YWx1ZSA9IFRydWUKKyAgICAgICAgZm9yIGVsdCBpbiBzZWxmOgorICAgICAgICAgICAgZGF0YVtkZWVwY29weShlbHQsIG1lbW8pXSA9IHZhbHVlCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICMgU3RhbmRhcmQgc2V0IG9wZXJhdGlvbnM6IHVuaW9uLCBpbnRlcnNlY3Rpb24sIGJvdGggZGlmZmVyZW5jZXMuCisgICAgIyBFYWNoIGhhcyBhbiBvcGVyYXRvciB2ZXJzaW9uIChlLmcuIF9fb3JfXywgaW52b2tlZCB3aXRoIHwpIGFuZCBhCisgICAgIyBtZXRob2QgdmVyc2lvbiAoZS5nLiB1bmlvbikuCisgICAgIyBTdWJ0bGU6ICBFYWNoIHBhaXIgcmVxdWlyZXMgZGlzdGluY3QgY29kZSBzbyB0aGF0IHRoZSBvdXRjb21lIGlzCisgICAgIyBjb3JyZWN0IHdoZW4gdGhlIHR5cGUgb2Ygb3RoZXIgaXNuJ3Qgc3VpdGFibGUuICBGb3IgZXhhbXBsZSwgaWYKKyAgICAjIHdlIGRpZCAidW5pb24gPSBfX29yX18iIGluc3RlYWQsIHRoZW4gU2V0KCkudW5pb24oMykgd291bGQgcmV0dXJuCisgICAgIyBOb3RJbXBsZW1lbnRlZCBpbnN0ZWFkIG9mIHJhaXNpbmcgVHlwZUVycm9yIChhbGJlaXQgdGhhdCAqd2h5KiBpdAorICAgICMgcmFpc2VzIFR5cGVFcnJvciBhcy1pcyBpcyBhbHNvIGEgYml0IHN1YnRsZSkuCisKKyAgICBkZWYgX19vcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB1bmlvbiBvZiB0d28gc2V0cyBhcyBhIG5ldyBzZXQuCisKKyAgICAgICAgKEkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGVpdGhlciBzZXQuKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEJhc2VTZXQpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBzZWxmLnVuaW9uKG90aGVyKQorCisgICAgZGVmIHVuaW9uKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB1bmlvbiBvZiB0d28gc2V0cyBhcyBhIG5ldyBzZXQuCisKKyAgICAgICAgKEkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGVpdGhlciBzZXQuKQorICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fX2NsYXNzX18oc2VsZikKKyAgICAgICAgcmVzdWx0Ll91cGRhdGUob3RoZXIpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LgorCisgICAgICAgIChJLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBib3RoIHNldHMuKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEJhc2VTZXQpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBzZWxmLmludGVyc2VjdGlvbihvdGhlcikKKworICAgIGRlZiBpbnRlcnNlY3Rpb24oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGludGVyc2VjdGlvbiBvZiB0d28gc2V0cyBhcyBhIG5ldyBzZXQuCisKKyAgICAgICAgKEkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGJvdGggc2V0cy4pCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6CisgICAgICAgICAgICBvdGhlciA9IFNldChvdGhlcikKKyAgICAgICAgaWYgbGVuKHNlbGYpIDw9IGxlbihvdGhlcik6CisgICAgICAgICAgICBsaXR0bGUsIGJpZyA9IHNlbGYsIG90aGVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsaXR0bGUsIGJpZyA9IG90aGVyLCBzZWxmCisgICAgICAgIGNvbW1vbiA9IGlmaWx0ZXIoYmlnLl9kYXRhLl9fY29udGFpbnNfXywgbGl0dGxlKQorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oY29tbW9uKQorCisgICAgZGVmIF9feG9yX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIG9mIHR3byBzZXRzIGFzIGEgbmV3IHNldC4KKworICAgICAgICAoSS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gZXhhY3RseSBvbmUgb2YgdGhlIHNldHMuKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEJhc2VTZXQpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBzZWxmLnN5bW1ldHJpY19kaWZmZXJlbmNlKG90aGVyKQorCisgICAgZGVmIHN5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiB0d28gc2V0cyBhcyBhIG5ldyBzZXQuCisKKyAgICAgICAgKEkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGV4YWN0bHkgb25lIG9mIHRoZSBzZXRzLikKKyAgICAgICAgIiIiCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX19jbGFzc19fKCkKKyAgICAgICAgZGF0YSA9IHJlc3VsdC5fZGF0YQorICAgICAgICB2YWx1ZSA9IFRydWUKKyAgICAgICAgc2VsZmRhdGEgPSBzZWxmLl9kYXRhCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG90aGVyZGF0YSA9IG90aGVyLl9kYXRhCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIG90aGVyZGF0YSA9IFNldChvdGhlcikuX2RhdGEKKyAgICAgICAgZm9yIGVsdCBpbiBpZmlsdGVyZmFsc2Uob3RoZXJkYXRhLl9fY29udGFpbnNfXywgc2VsZmRhdGEpOgorICAgICAgICAgICAgZGF0YVtlbHRdID0gdmFsdWUKKyAgICAgICAgZm9yIGVsdCBpbiBpZmlsdGVyZmFsc2Uoc2VsZmRhdGEuX19jb250YWluc19fLCBvdGhlcmRhdGEpOgorICAgICAgICAgICAgZGF0YVtlbHRdID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmICBfX3N1Yl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBkaWZmZXJlbmNlIG9mIHR3byBzZXRzIGFzIGEgbmV3IFNldC4KKworICAgICAgICAoSS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gdGhpcyBzZXQgYW5kIG5vdCBpbiB0aGUgb3RoZXIuKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEJhc2VTZXQpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBzZWxmLmRpZmZlcmVuY2Uob3RoZXIpCisKKyAgICBkZWYgZGlmZmVyZW5jZShzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlJldHVybiB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc2V0cyBhcyBhIG5ldyBTZXQuCisKKyAgICAgICAgKEkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIHRoaXMgc2V0IGFuZCBub3QgaW4gdGhlIG90aGVyLikKKyAgICAgICAgIiIiCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX19jbGFzc19fKCkKKyAgICAgICAgZGF0YSA9IHJlc3VsdC5fZGF0YQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvdGhlcmRhdGEgPSBvdGhlci5fZGF0YQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBvdGhlcmRhdGEgPSBTZXQob3RoZXIpLl9kYXRhCisgICAgICAgIHZhbHVlID0gVHJ1ZQorICAgICAgICBmb3IgZWx0IGluIGlmaWx0ZXJmYWxzZShvdGhlcmRhdGEuX19jb250YWluc19fLCBzZWxmKToKKyAgICAgICAgICAgIGRhdGFbZWx0XSA9IHZhbHVlCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICMgTWVtYmVyc2hpcCB0ZXN0CisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGVsZW1lbnQpOgorICAgICAgICAiIiJSZXBvcnQgd2hldGhlciBhbiBlbGVtZW50IGlzIGEgbWVtYmVyIG9mIGEgc2V0LgorCisgICAgICAgIChDYWxsZWQgaW4gcmVzcG9uc2UgdG8gdGhlIGV4cHJlc3Npb24gYGVsZW1lbnQgaW4gc2VsZicuKQorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgaW4gc2VsZi5fZGF0YQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgdHJhbnNmb3JtID0gZ2V0YXR0cihlbGVtZW50LCAiX19hc190ZW1wb3JhcmlseV9pbW11dGFibGVfXyIsIE5vbmUpCisgICAgICAgICAgICBpZiB0cmFuc2Zvcm0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSAjIHJlLXJhaXNlIHRoZSBUeXBlRXJyb3IgZXhjZXB0aW9uIHdlIGNhdWdodAorICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybSgpIGluIHNlbGYuX2RhdGEKKworICAgICMgU3Vic2V0IGFuZCBzdXBlcnNldCB0ZXN0CisKKyAgICBkZWYgaXNzdWJzZXQoc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJSZXBvcnQgd2hldGhlciBhbm90aGVyIHNldCBjb250YWlucyB0aGlzIHNldC4iIiIKKyAgICAgICAgc2VsZi5fYmluYXJ5X3Nhbml0eV9jaGVjayhvdGhlcikKKyAgICAgICAgaWYgbGVuKHNlbGYpID4gbGVuKG90aGVyKTogICMgRmFzdCBjaGVjayBmb3Igb2J2aW91cyBjYXNlcworICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBlbHQgaW4gaWZpbHRlcmZhbHNlKG90aGVyLl9kYXRhLl9fY29udGFpbnNfXywgc2VsZik6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBpc3N1cGVyc2V0KHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmVwb3J0IHdoZXRoZXIgdGhpcyBzZXQgY29udGFpbnMgYW5vdGhlciBzZXQuIiIiCisgICAgICAgIHNlbGYuX2JpbmFyeV9zYW5pdHlfY2hlY2sob3RoZXIpCisgICAgICAgIGlmIGxlbihzZWxmKSA8IGxlbihvdGhlcik6ICAjIEZhc3QgY2hlY2sgZm9yIG9idmlvdXMgY2FzZXMKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmb3IgZWx0IGluIGlmaWx0ZXJmYWxzZShzZWxmLl9kYXRhLl9fY29udGFpbnNfXywgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAjIEluZXF1YWxpdHkgY29tcGFyaXNvbnMgdXNpbmcgdGhlIGlzLXN1YnNldCByZWxhdGlvbi4KKyAgICBfX2xlX18gPSBpc3N1YnNldAorICAgIF9fZ2VfXyA9IGlzc3VwZXJzZXQKKworICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICBzZWxmLl9iaW5hcnlfc2FuaXR5X2NoZWNrKG90aGVyKQorICAgICAgICByZXR1cm4gbGVuKHNlbGYpIDwgbGVuKG90aGVyKSBhbmQgc2VsZi5pc3N1YnNldChvdGhlcikKKworICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICBzZWxmLl9iaW5hcnlfc2FuaXR5X2NoZWNrKG90aGVyKQorICAgICAgICByZXR1cm4gbGVuKHNlbGYpID4gbGVuKG90aGVyKSBhbmQgc2VsZi5pc3N1cGVyc2V0KG90aGVyKQorCisgICAgIyBXZSBpbmhlcml0IG9iamVjdC5fX2hhc2hfXywgc28gd2UgbXVzdCBkZW55IHRoaXMgZXhwbGljaXRseQorICAgIF9faGFzaF9fID0gTm9uZQorCisgICAgIyBBc3NvcnRlZCBoZWxwZXJzCisKKyAgICBkZWYgX2JpbmFyeV9zYW5pdHlfY2hlY2soc2VsZiwgb3RoZXIpOgorICAgICAgICAjIENoZWNrIHRoYXQgdGhlIG90aGVyIGFyZ3VtZW50IHRvIGEgYmluYXJ5IG9wZXJhdGlvbiBpcyBhbHNvCisgICAgICAgICMgYSBzZXQsIHJhaXNpbmcgYSBUeXBlRXJyb3Igb3RoZXJ3aXNlLgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJCaW5hcnkgb3BlcmF0aW9uIG9ubHkgcGVybWl0dGVkIGJldHdlZW4gc2V0cyIKKworICAgIGRlZiBfY29tcHV0ZV9oYXNoKHNlbGYpOgorICAgICAgICAjIENhbGN1bGF0ZSBoYXNoIGNvZGUgZm9yIGEgc2V0IGJ5IHhvcidpbmcgdGhlIGhhc2ggY29kZXMgb2YKKyAgICAgICAgIyB0aGUgZWxlbWVudHMuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgaGFzaCBjb2RlIGRvZXMgbm90IGRlcGVuZAorICAgICAgICAjIG9uIHRoZSBvcmRlciBpbiB3aGljaCBlbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlIHNldC4gIFRoaXMgaXMKKyAgICAgICAgIyBub3QgY2FsbGVkIF9faGFzaF9fIGJlY2F1c2UgYSBCYXNlU2V0IHNob3VsZCBub3QgYmUgaGFzaGFibGU7CisgICAgICAgICMgb25seSBhbiBJbW11dGFibGVTZXQgaXMgaGFzaGFibGUuCisgICAgICAgIHJlc3VsdCA9IDAKKyAgICAgICAgZm9yIGVsdCBpbiBzZWxmOgorICAgICAgICAgICAgcmVzdWx0IF49IGhhc2goZWx0KQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX3VwZGF0ZShzZWxmLCBpdGVyYWJsZSk6CisgICAgICAgICMgVGhlIG1haW4gbG9vcCBmb3IgdXBkYXRlKCkgYW5kIHRoZSBzdWJjbGFzcyBfX2luaXRfXygpIG1ldGhvZHMuCisgICAgICAgIGRhdGEgPSBzZWxmLl9kYXRhCisKKyAgICAgICAgIyBVc2UgdGhlIGZhc3QgdXBkYXRlKCkgbWV0aG9kIHdoZW4gYSBkaWN0aW9uYXJ5IGlzIGF2YWlsYWJsZS4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVyYWJsZSwgQmFzZVNldCk6CisgICAgICAgICAgICBkYXRhLnVwZGF0ZShpdGVyYWJsZS5fZGF0YSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHZhbHVlID0gVHJ1ZQorCisgICAgICAgIGlmIHR5cGUoaXRlcmFibGUpIGluIChsaXN0LCB0dXBsZSwgeHJhbmdlKToKKyAgICAgICAgICAgICMgT3B0aW1pemVkOiB3ZSBrbm93IHRoYXQgX19pdGVyX18oKSBhbmQgbmV4dCgpIGNhbid0CisgICAgICAgICAgICAjIHJhaXNlIFR5cGVFcnJvciwgc28gd2UgY2FuIG1vdmUgJ3RyeTonIG91dCBvZiB0aGUgbG9vcC4KKyAgICAgICAgICAgIGl0ID0gaXRlcihpdGVyYWJsZSkKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbZWxlbWVudF0gPSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBnZXRhdHRyKGVsZW1lbnQsICJfX2FzX2ltbXV0YWJsZV9fIiwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdHJhbnNmb3JtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSAjIHJlLXJhaXNlIHRoZSBUeXBlRXJyb3IgZXhjZXB0aW9uIHdlIGNhdWdodAorICAgICAgICAgICAgICAgICAgICBkYXRhW3RyYW5zZm9ybSgpXSA9IHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFNhZmU6IG9ubHkgY2F0Y2ggVHlwZUVycm9yIHdoZXJlIGludGVuZGVkCisgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRhdGFbZWxlbWVudF0gPSB2YWx1ZQorICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9IGdldGF0dHIoZWxlbWVudCwgIl9fYXNfaW1tdXRhYmxlX18iLCBOb25lKQorICAgICAgICAgICAgICAgICAgICBpZiB0cmFuc2Zvcm0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlICMgcmUtcmFpc2UgdGhlIFR5cGVFcnJvciBleGNlcHRpb24gd2UgY2F1Z2h0CisgICAgICAgICAgICAgICAgICAgIGRhdGFbdHJhbnNmb3JtKCldID0gdmFsdWUKKworCitjbGFzcyBJbW11dGFibGVTZXQoQmFzZVNldCk6CisgICAgIiIiSW1tdXRhYmxlIHNldCBjbGFzcy4iIiIKKworICAgIF9fc2xvdHNfXyA9IFsnX2hhc2hjb2RlJ10KKworICAgICMgQmFzZVNldCArIGhhc2hpbmcKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdGVyYWJsZT1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGFuIGltbXV0YWJsZSBzZXQgZnJvbSBhbiBvcHRpb25hbCBpdGVyYWJsZS4iIiIKKyAgICAgICAgc2VsZi5faGFzaGNvZGUgPSBOb25lCisgICAgICAgIHNlbGYuX2RhdGEgPSB7fQorICAgICAgICBpZiBpdGVyYWJsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3VwZGF0ZShpdGVyYWJsZSkKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5faGFzaGNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gc2VsZi5fY29tcHV0ZV9oYXNoKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2hjb2RlCisKKyAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZGF0YSwgc2VsZi5faGFzaGNvZGUKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICBzZWxmLl9kYXRhLCBzZWxmLl9oYXNoY29kZSA9IHN0YXRlCisKK2NsYXNzIFNldChCYXNlU2V0KToKKyAgICAiIiIgTXV0YWJsZSBzZXQgY2xhc3MuIiIiCisKKyAgICBfX3Nsb3RzX18gPSBbXQorCisgICAgIyBCYXNlU2V0ICsgb3BlcmF0aW9ucyByZXF1aXJpbmcgbXV0YWJpbGl0eTsgbm8gaGFzaGluZworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZXJhYmxlPU5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBzZXQgZnJvbSBhbiBvcHRpb25hbCBpdGVyYWJsZS4iIiIKKyAgICAgICAgc2VsZi5fZGF0YSA9IHt9CisgICAgICAgIGlmIGl0ZXJhYmxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fdXBkYXRlKGl0ZXJhYmxlKQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgIyBnZXRzdGF0ZSdzIHJlc3VsdHMgYXJlIGlnbm9yZWQgaWYgaXQgaXMgbm90CisgICAgICAgIHJldHVybiBzZWxmLl9kYXRhLAorCisgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fZGF0YSwgPSBkYXRhCisKKyAgICAjIEluLXBsYWNlIHVuaW9uLCBpbnRlcnNlY3Rpb24sIGRpZmZlcmVuY2VzLgorICAgICMgU3VidGxlOiAgVGhlIHh5el91cGRhdGUoKSBmdW5jdGlvbnMgZGVsaWJlcmF0ZWx5IHJldHVybiBOb25lLAorICAgICMgYXMgZG8gYWxsIG11dGF0aW5nIG9wZXJhdGlvbnMgb24gYnVpbHQtaW4gY29udGFpbmVyIHR5cGVzLgorICAgICMgVGhlIF9feHl6X18gc3BlbGxpbmdzIGhhdmUgdG8gcmV0dXJuIHNlbGYsIHRob3VnaC4KKworICAgIGRlZiBfX2lvcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiVXBkYXRlIGEgc2V0IHdpdGggdGhlIHVuaW9uIG9mIGl0c2VsZiBhbmQgYW5vdGhlci4iIiIKKyAgICAgICAgc2VsZi5fYmluYXJ5X3Nhbml0eV9jaGVjayhvdGhlcikKKyAgICAgICAgc2VsZi5fZGF0YS51cGRhdGUob3RoZXIuX2RhdGEpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgdW5pb25fdXBkYXRlKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiVXBkYXRlIGEgc2V0IHdpdGggdGhlIHVuaW9uIG9mIGl0c2VsZiBhbmQgYW5vdGhlci4iIiIKKyAgICAgICAgc2VsZi5fdXBkYXRlKG90aGVyKQorCisgICAgZGVmIF9faWFuZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiVXBkYXRlIGEgc2V0IHdpdGggdGhlIGludGVyc2VjdGlvbiBvZiBpdHNlbGYgYW5kIGFub3RoZXIuIiIiCisgICAgICAgIHNlbGYuX2JpbmFyeV9zYW5pdHlfY2hlY2sob3RoZXIpCisgICAgICAgIHNlbGYuX2RhdGEgPSAoc2VsZiAmIG90aGVyKS5fZGF0YQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGludGVyc2VjdGlvbl91cGRhdGUoc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJVcGRhdGUgYSBzZXQgd2l0aCB0aGUgaW50ZXJzZWN0aW9uIG9mIGl0c2VsZiBhbmQgYW5vdGhlci4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6CisgICAgICAgICAgICBzZWxmICY9IG90aGVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9kYXRhID0gKHNlbGYuaW50ZXJzZWN0aW9uKG90aGVyKSkuX2RhdGEKKworICAgIGRlZiBfX2l4b3JfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiBpdHNlbGYgYW5kIGFub3RoZXIuIiIiCisgICAgICAgIHNlbGYuX2JpbmFyeV9zYW5pdHlfY2hlY2sob3RoZXIpCisgICAgICAgIHNlbGYuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKG90aGVyKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiBpdHNlbGYgYW5kIGFub3RoZXIuIiIiCisgICAgICAgIGRhdGEgPSBzZWxmLl9kYXRhCisgICAgICAgIHZhbHVlID0gVHJ1ZQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6CisgICAgICAgICAgICBvdGhlciA9IFNldChvdGhlcikKKyAgICAgICAgaWYgc2VsZiBpcyBvdGhlcjoKKyAgICAgICAgICAgIHNlbGYuY2xlYXIoKQorICAgICAgICBmb3IgZWx0IGluIG90aGVyOgorICAgICAgICAgICAgaWYgZWx0IGluIGRhdGE6CisgICAgICAgICAgICAgICAgZGVsIGRhdGFbZWx0XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkYXRhW2VsdF0gPSB2YWx1ZQorCisgICAgZGVmIF9faXN1Yl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmVtb3ZlIGFsbCBlbGVtZW50cyBvZiBhbm90aGVyIHNldCBmcm9tIHRoaXMgc2V0LiIiIgorICAgICAgICBzZWxmLl9iaW5hcnlfc2FuaXR5X2NoZWNrKG90aGVyKQorICAgICAgICBzZWxmLmRpZmZlcmVuY2VfdXBkYXRlKG90aGVyKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGRpZmZlcmVuY2VfdXBkYXRlKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmVtb3ZlIGFsbCBlbGVtZW50cyBvZiBhbm90aGVyIHNldCBmcm9tIHRoaXMgc2V0LiIiIgorICAgICAgICBkYXRhID0gc2VsZi5fZGF0YQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6CisgICAgICAgICAgICBvdGhlciA9IFNldChvdGhlcikKKyAgICAgICAgaWYgc2VsZiBpcyBvdGhlcjoKKyAgICAgICAgICAgIHNlbGYuY2xlYXIoKQorICAgICAgICBmb3IgZWx0IGluIGlmaWx0ZXIoZGF0YS5fX2NvbnRhaW5zX18sIG90aGVyKToKKyAgICAgICAgICAgIGRlbCBkYXRhW2VsdF0KKworICAgICMgUHl0aG9uIGRpY3QtbGlrZSBtYXNzIG11dGF0aW9uczogdXBkYXRlLCBjbGVhcgorCisgICAgZGVmIHVwZGF0ZShzZWxmLCBpdGVyYWJsZSk6CisgICAgICAgICIiIkFkZCBhbGwgdmFsdWVzIGZyb20gYW4gaXRlcmFibGUgKHN1Y2ggYXMgYSBsaXN0IG9yIGZpbGUpLiIiIgorICAgICAgICBzZWxmLl91cGRhdGUoaXRlcmFibGUpCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgICIiIlJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSB0aGlzIHNldC4iIiIKKyAgICAgICAgc2VsZi5fZGF0YS5jbGVhcigpCisKKyAgICAjIFNpbmdsZS1lbGVtZW50IG11dGF0aW9uczogYWRkLCByZW1vdmUsIGRpc2NhcmQKKworICAgIGRlZiBhZGQoc2VsZiwgZWxlbWVudCk6CisgICAgICAgICIiIkFkZCBhbiBlbGVtZW50IHRvIGEgc2V0LgorCisgICAgICAgIFRoaXMgaGFzIG5vIGVmZmVjdCBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IHByZXNlbnQuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9kYXRhW2VsZW1lbnRdID0gVHJ1ZQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgdHJhbnNmb3JtID0gZ2V0YXR0cihlbGVtZW50LCAiX19hc19pbW11dGFibGVfXyIsIE5vbmUpCisgICAgICAgICAgICBpZiB0cmFuc2Zvcm0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSAjIHJlLXJhaXNlIHRoZSBUeXBlRXJyb3IgZXhjZXB0aW9uIHdlIGNhdWdodAorICAgICAgICAgICAgc2VsZi5fZGF0YVt0cmFuc2Zvcm0oKV0gPSBUcnVlCisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGVsZW1lbnQpOgorICAgICAgICAiIiJSZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgc2V0OyBpdCBtdXN0IGJlIGEgbWVtYmVyLgorCisgICAgICAgIElmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgcmFpc2UgYSBLZXlFcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBzZWxmLl9kYXRhW2VsZW1lbnRdCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBnZXRhdHRyKGVsZW1lbnQsICJfX2FzX3RlbXBvcmFyaWx5X2ltbXV0YWJsZV9fIiwgTm9uZSkKKyAgICAgICAgICAgIGlmIHRyYW5zZm9ybSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlICMgcmUtcmFpc2UgdGhlIFR5cGVFcnJvciBleGNlcHRpb24gd2UgY2F1Z2h0CisgICAgICAgICAgICBkZWwgc2VsZi5fZGF0YVt0cmFuc2Zvcm0oKV0KKworICAgIGRlZiBkaXNjYXJkKHNlbGYsIGVsZW1lbnQpOgorICAgICAgICAiIiJSZW1vdmUgYW4gZWxlbWVudCBmcm9tIGEgc2V0IGlmIGl0IGlzIGEgbWVtYmVyLgorCisgICAgICAgIElmIHRoZSBlbGVtZW50IGlzIG5vdCBhIG1lbWJlciwgZG8gbm90aGluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucmVtb3ZlKGVsZW1lbnQpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBwb3Aoc2VsZik6CisgICAgICAgICIiIlJlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSBzZXQgZWxlbWVudC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEucG9waXRlbSgpWzBdCisKKyAgICBkZWYgX19hc19pbW11dGFibGVfXyhzZWxmKToKKyAgICAgICAgIyBSZXR1cm4gYSBjb3B5IG9mIHNlbGYgYXMgYW4gaW1tdXRhYmxlIHNldAorICAgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0KHNlbGYpCisKKyAgICBkZWYgX19hc190ZW1wb3JhcmlseV9pbW11dGFibGVfXyhzZWxmKToKKyAgICAgICAgIyBSZXR1cm4gc2VsZiB3cmFwcGVkIGluIGEgdGVtcG9yYXJpbHkgaW1tdXRhYmxlIHNldAorICAgICAgICByZXR1cm4gX1RlbXBvcmFyaWx5SW1tdXRhYmxlU2V0KHNlbGYpCisKKworY2xhc3MgX1RlbXBvcmFyaWx5SW1tdXRhYmxlU2V0KEJhc2VTZXQpOgorICAgICMgV3JhcCBhIG11dGFibGUgc2V0IGFzIGlmIGl0IHdhcyB0ZW1wb3JhcmlseSBpbW11dGFibGUuCisgICAgIyBUaGlzIG9ubHkgc3VwcGxpZXMgaGFzaGluZyBhbmQgZXF1YWxpdHkgY29tcGFyaXNvbnMuCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2V0KToKKyAgICAgICAgc2VsZi5fc2V0ID0gc2V0CisgICAgICAgIHNlbGYuX2RhdGEgPSBzZXQuX2RhdGEgICMgTmVlZGVkIGJ5IEltbXV0YWJsZVNldC5fX2VxX18oKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc2V0Ll9jb21wdXRlX2hhc2goKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zZXRzLnB5YyBiL2xpYi9weXRob24yLjcvc2V0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5ZGYwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2V0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zZXRzLnB5byBiL2xpYi9weXRob24yLjcvc2V0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5ZGYwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2V0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zZ21sbGliLnB5IGIvbGliL3B5dGhvbjIuNy9zZ21sbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNGIyNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NnbWxsaWIucHkKQEAgLTAsMCArMSw1NTMgQEAKKyIiIkEgcGFyc2VyIGZvciBTR01MLCB1c2luZyB0aGUgZGVyaXZlZCBjbGFzcyBhcyBhIHN0YXRpYyBEVEQuIiIiCisKKyMgWFhYIFRoaXMgb25seSBzdXBwb3J0cyB0aG9zZSBTR01MIGZlYXR1cmVzIHVzZWQgYnkgSFRNTC4KKworIyBYWFggVGhlcmUgc2hvdWxkIGJlIGEgd2F5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gUENEQVRBIChwYXJzZWQKKyMgY2hhcmFjdGVyIGRhdGEgLS0gdGhlIG5vcm1hbCBjYXNlKSwgUkNEQVRBIChyZXBsYWNlYWJsZSBjaGFyYWN0ZXIKKyMgZGF0YSAtLSBvbmx5IGNoYXIgYW5kIGVudGl0eSByZWZlcmVuY2VzIGFuZCBlbmQgdGFncyBhcmUgc3BlY2lhbCkKKyMgYW5kIENEQVRBIChjaGFyYWN0ZXIgZGF0YSAtLSBvbmx5IGVuZCB0YWdzIGFyZSBzcGVjaWFsKS4gIFJDREFUQSBpcworIyBub3Qgc3VwcG9ydGVkIGF0IGFsbC4KKworCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSBzZ21sbGliIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAiLAorICAgICAgICAgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKK2ltcG9ydCBtYXJrdXBiYXNlCitpbXBvcnQgcmUKKworX19hbGxfXyA9IFsiU0dNTFBhcnNlciIsICJTR01MUGFyc2VFcnJvciJdCisKKyMgUmVndWxhciBleHByZXNzaW9ucyB1c2VkIGZvciBwYXJzaW5nCisKK2ludGVyZXN0aW5nID0gcmUuY29tcGlsZSgnWyY8XScpCitpbmNvbXBsZXRlID0gcmUuY29tcGlsZSgnJihbYS16QS1aXVthLXpBLVowLTldKnwjWzAtOV0qKT98JworICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwoW2EtekEtWl1bXjw+XSp8JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8oW2EtekEtWl1bXjw+XSopP3wnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIVtePD5dKik/JykKKworZW50aXR5cmVmID0gcmUuY29tcGlsZSgnJihbYS16QS1aXVstLmEtekEtWjAtOV0qKVteYS16QS1aMC05XScpCitjaGFycmVmID0gcmUuY29tcGlsZSgnJiMoWzAtOV0rKVteMC05XScpCisKK3N0YXJ0dGFnb3BlbiA9IHJlLmNvbXBpbGUoJzxbPmEtekEtWl0nKQorc2hvcnR0YWdvcGVuID0gcmUuY29tcGlsZSgnPFthLXpBLVpdWy0uYS16QS1aMC05XSovJykKK3Nob3J0dGFnID0gcmUuY29tcGlsZSgnPChbYS16QS1aXVstLmEtekEtWjAtOV0qKS8oW14vXSopLycpCitwaWNsb3NlID0gcmUuY29tcGlsZSgnPicpCitlbmRicmFja2V0ID0gcmUuY29tcGlsZSgnWzw+XScpCit0YWdmaW5kID0gcmUuY29tcGlsZSgnW2EtekEtWl1bLV8uYS16QS1aMC05XSonKQorYXR0cmZpbmQgPSByZS5jb21waWxlKAorICAgIHInXHMqKFthLXpBLVpfXVstOi5hLXpBLVpfMC05XSopKFxzKj1ccyonCisgICAgcicoXCdbXlwnXSpcJ3wiW14iXSoifFtdW1wtYS16QS1aMC05Li8sOjsrKiU/ISYkXChcKV8jPX5cJyJAXSopKT8nKQorCisKK2NsYXNzIFNHTUxQYXJzZUVycm9yKFJ1bnRpbWVFcnJvcik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCBmb3IgYWxsIHBhcnNlIGVycm9ycy4iIiIKKyAgICBwYXNzCisKKworIyBTR01MIHBhcnNlciBiYXNlIGNsYXNzIC0tIGZpbmQgdGFncyBhbmQgY2FsbCBoYW5kbGVyIGZ1bmN0aW9ucy4KKyMgVXNhZ2U6IHAgPSBTR01MUGFyc2VyKCk7IHAuZmVlZChkYXRhKTsgLi4uOyBwLmNsb3NlKCkuCisjIFRoZSBkdGQgaXMgZGVmaW5lZCBieSBkZXJpdmluZyBhIGNsYXNzIHdoaWNoIGRlZmluZXMgbWV0aG9kcworIyB3aXRoIHNwZWNpYWwgbmFtZXMgdG8gaGFuZGxlIHRhZ3M6IHN0YXJ0X2ZvbyBhbmQgZW5kX2ZvbyB0byBoYW5kbGUKKyMgPGZvbz4gYW5kIDwvZm9vPiwgcmVzcGVjdGl2ZWx5LCBvciBkb19mb28gdG8gaGFuZGxlIDxmb28+IGJ5IGl0c2VsZi4KKyMgKFRhZ3MgYXJlIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlIGZvciB0aGlzIHB1cnBvc2UuKSAgVGhlIGRhdGEKKyMgYmV0d2VlbiB0YWdzIGlzIHBhc3NlZCB0byB0aGUgcGFyc2VyIGJ5IGNhbGxpbmcgc2VsZi5oYW5kbGVfZGF0YSgpCisjIHdpdGggc29tZSBkYXRhIGFzIGFyZ3VtZW50ICh0aGUgZGF0YSBtYXkgYmUgc3BsaXQgdXAgaW4gYXJiaXRyYXJ5CisjIGNodW5rcykuICBFbnRpdHkgcmVmZXJlbmNlcyBhcmUgcGFzc2VkIGJ5IGNhbGxpbmcKKyMgc2VsZi5oYW5kbGVfZW50aXR5cmVmKCkgd2l0aCB0aGUgZW50aXR5IHJlZmVyZW5jZSBhcyBhcmd1bWVudC4KKworY2xhc3MgU0dNTFBhcnNlcihtYXJrdXBiYXNlLlBhcnNlckJhc2UpOgorICAgICMgRGVmaW5pdGlvbiBvZiBlbnRpdGllcyAtLSBkZXJpdmVkIGNsYXNzZXMgbWF5IG92ZXJyaWRlCisgICAgZW50aXR5X29yX2NoYXJyZWYgPSByZS5jb21waWxlKCcmKD86JworICAgICAgJyhbYS16QS1aXVstLmEtekEtWjAtOV0qKXwjKFswLTldKyknCisgICAgICAnKSg7PyknKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcmJvc2U9MCk6CisgICAgICAgICIiIkluaXRpYWxpemUgYW5kIHJlc2V0IHRoaXMgaW5zdGFuY2UuIiIiCisgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgc2VsZi5yZXNldCgpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgICIiIlJlc2V0IHRoaXMgaW5zdGFuY2UuIExvc2VzIGFsbCB1bnByb2Nlc3NlZCBkYXRhLiIiIgorICAgICAgICBzZWxmLl9fc3RhcnR0YWdfdGV4dCA9IE5vbmUKKyAgICAgICAgc2VsZi5yYXdkYXRhID0gJycKKyAgICAgICAgc2VsZi5zdGFjayA9IFtdCisgICAgICAgIHNlbGYubGFzdHRhZyA9ICc/Pz8nCisgICAgICAgIHNlbGYubm9tb3JldGFncyA9IDAKKyAgICAgICAgc2VsZi5saXRlcmFsID0gMAorICAgICAgICBtYXJrdXBiYXNlLlBhcnNlckJhc2UucmVzZXQoc2VsZikKKworICAgIGRlZiBzZXRub21vcmV0YWdzKHNlbGYpOgorICAgICAgICAiIiJFbnRlciBsaXRlcmFsIG1vZGUgKENEQVRBKSB0aWxsIEVPRi4KKworICAgICAgICBJbnRlbmRlZCBmb3IgZGVyaXZlZCBjbGFzc2VzIG9ubHkuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm5vbW9yZXRhZ3MgPSBzZWxmLmxpdGVyYWwgPSAxCisKKyAgICBkZWYgc2V0bGl0ZXJhbChzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkVudGVyIGxpdGVyYWwgbW9kZSAoQ0RBVEEpLgorCisgICAgICAgIEludGVuZGVkIGZvciBkZXJpdmVkIGNsYXNzZXMgb25seS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubGl0ZXJhbCA9IDEKKworICAgIGRlZiBmZWVkKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiJGZWVkIHNvbWUgZGF0YSB0byB0aGUgcGFyc2VyLgorCisgICAgICAgIENhbGwgdGhpcyBhcyBvZnRlbiBhcyB5b3Ugd2FudCwgd2l0aCBhcyBsaXR0bGUgb3IgYXMgbXVjaCB0ZXh0CisgICAgICAgIGFzIHlvdSB3YW50IChtYXkgaW5jbHVkZSAnXG4nKS4gIChUaGlzIGp1c3Qgc2F2ZXMgdGhlIHRleHQsCisgICAgICAgIGFsbCB0aGUgcHJvY2Vzc2luZyBpcyBkb25lIGJ5IGdvYWhlYWQoKS4pCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYucmF3ZGF0YSA9IHNlbGYucmF3ZGF0YSArIGRhdGEKKyAgICAgICAgc2VsZi5nb2FoZWFkKDApCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkhhbmRsZSB0aGUgcmVtYWluaW5nIGRhdGEuIiIiCisgICAgICAgIHNlbGYuZ29haGVhZCgxKQorCisgICAgZGVmIGVycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICByYWlzZSBTR01MUGFyc2VFcnJvcihtZXNzYWdlKQorCisgICAgIyBJbnRlcm5hbCAtLSBoYW5kbGUgZGF0YSBhcyBmYXIgYXMgcmVhc29uYWJsZS4gIE1heSBsZWF2ZSBzdGF0ZQorICAgICMgYW5kIGRhdGEgdG8gYmUgcHJvY2Vzc2VkIGJ5IGEgc3Vic2VxdWVudCBjYWxsLiAgSWYgJ2VuZCcgaXMKKyAgICAjIHRydWUsIGZvcmNlIGhhbmRsaW5nIGFsbCBkYXRhIGFzIGlmIGZvbGxvd2VkIGJ5IEVPRiBtYXJrZXIuCisgICAgZGVmIGdvYWhlYWQoc2VsZiwgZW5kKToKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBpID0gMAorICAgICAgICBuID0gbGVuKHJhd2RhdGEpCisgICAgICAgIHdoaWxlIGkgPCBuOgorICAgICAgICAgICAgaWYgc2VsZi5ub21vcmV0YWdzOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpOm5dKQorICAgICAgICAgICAgICAgIGkgPSBuCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG1hdGNoID0gaW50ZXJlc3Rpbmcuc2VhcmNoKHJhd2RhdGEsIGkpCisgICAgICAgICAgICBpZiBtYXRjaDogaiA9IG1hdGNoLnN0YXJ0KCkKKyAgICAgICAgICAgIGVsc2U6IGogPSBuCisgICAgICAgICAgICBpZiBpIDwgajoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaTpqXSkKKyAgICAgICAgICAgIGkgPSBqCisgICAgICAgICAgICBpZiBpID09IG46IGJyZWFrCisgICAgICAgICAgICBpZiByYXdkYXRhW2ldID09ICc8JzoKKyAgICAgICAgICAgICAgICBpZiBzdGFydHRhZ29wZW4ubWF0Y2gocmF3ZGF0YSwgaSk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX3N0YXJ0dGFnKGkpCisgICAgICAgICAgICAgICAgICAgIGlmIGsgPCAwOiBicmVhaworICAgICAgICAgICAgICAgICAgICBpID0gaworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHJhd2RhdGEuc3RhcnRzd2l0aCgiPC8iLCBpKToKKyAgICAgICAgICAgICAgICAgICAgayA9IHNlbGYucGFyc2VfZW5kdGFnKGkpCisgICAgICAgICAgICAgICAgICAgIGlmIGsgPCAwOiBicmVhaworICAgICAgICAgICAgICAgICAgICBpID0gaworICAgICAgICAgICAgICAgICAgICBzZWxmLmxpdGVyYWwgPSAwCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgc2VsZi5saXRlcmFsOgorICAgICAgICAgICAgICAgICAgICBpZiBuID4gKGkgKyAxKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoIjwiKQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBpbmNvbXBsZXRlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHJhd2RhdGEuc3RhcnRzd2l0aCgiPCEtLSIsIGkpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBTdHJpY3RseSBzcGVha2luZywgYSBjb21tZW50IGlzIC0tLiotLQorICAgICAgICAgICAgICAgICAgICAgICAgIyB3aXRoaW4gYSBkZWNsYXJhdGlvbiB0YWcgPCEuLi4+LgorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBiZSByZW1vdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIyBhbmQgY29tbWVudHMgaGFuZGxlZCBvbmx5IGluIHBhcnNlX2RlY2xhcmF0aW9uLgorICAgICAgICAgICAgICAgICAgICBrID0gc2VsZi5wYXJzZV9jb21tZW50KGkpCisgICAgICAgICAgICAgICAgICAgIGlmIGsgPCAwOiBicmVhaworICAgICAgICAgICAgICAgICAgICBpID0gaworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHJhd2RhdGEuc3RhcnRzd2l0aCgiPD8iLCBpKToKKyAgICAgICAgICAgICAgICAgICAgayA9IHNlbGYucGFyc2VfcGkoaSkKKyAgICAgICAgICAgICAgICAgICAgaWYgayA8IDA6IGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGkgPSBpK2sKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiByYXdkYXRhLnN0YXJ0c3dpdGgoIjwhIiwgaSk6CisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBzb21lIHNvcnQgb2YgZGVjbGFyYXRpb247IGluICJIVE1MIGFzCisgICAgICAgICAgICAgICAgICAgICMgZGVwbG95ZWQsIiB0aGlzIHNob3VsZCBvbmx5IGJlIHRoZSBkb2N1bWVudCB0eXBlCisgICAgICAgICAgICAgICAgICAgICMgZGVjbGFyYXRpb24gKCI8IURPQ1RZUEUgaHRtbC4uLj4iKS4KKyAgICAgICAgICAgICAgICAgICAgayA9IHNlbGYucGFyc2VfZGVjbGFyYXRpb24oaSkKKyAgICAgICAgICAgICAgICAgICAgaWYgayA8IDA6IGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGkgPSBrCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHJhd2RhdGFbaV0gPT0gJyYnOgorICAgICAgICAgICAgICAgIGlmIHNlbGYubGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2ldKQorICAgICAgICAgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbWF0Y2ggPSBjaGFycmVmLm1hdGNoKHJhd2RhdGEsIGkpCisgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9jaGFycmVmKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGkgPSBtYXRjaC5lbmQoMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmF3ZGF0YVtpLTFdICE9ICc7JzogaSA9IGktMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIG1hdGNoID0gZW50aXR5cmVmLm1hdGNoKHJhd2RhdGEsIGkpCisgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lbnRpdHlyZWYobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaSA9IG1hdGNoLmVuZCgwKQorICAgICAgICAgICAgICAgICAgICBpZiByYXdkYXRhW2ktMV0gIT0gJzsnOiBpID0gaS0xCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoJ25laXRoZXIgPCBub3IgJiA/PycpCisgICAgICAgICAgICAjIFdlIGdldCBoZXJlIG9ubHkgaWYgaW5jb21wbGV0ZSBtYXRjaGVzIGJ1dAorICAgICAgICAgICAgIyBub3RoaW5nIGVsc2UKKyAgICAgICAgICAgIG1hdGNoID0gaW5jb21wbGV0ZS5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpXSkKKyAgICAgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGogPSBtYXRjaC5lbmQoMCkKKyAgICAgICAgICAgIGlmIGogPT0gbjoKKyAgICAgICAgICAgICAgICBicmVhayAjIFJlYWxseSBpbmNvbXBsZXRlCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaTpqXSkKKyAgICAgICAgICAgIGkgPSBqCisgICAgICAgICMgZW5kIHdoaWxlCisgICAgICAgIGlmIGVuZCBhbmQgaSA8IG46CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaTpuXSkKKyAgICAgICAgICAgIGkgPSBuCisgICAgICAgIHNlbGYucmF3ZGF0YSA9IHJhd2RhdGFbaTpdCisgICAgICAgICMgWFhYIGlmIGVuZDogY2hlY2sgZm9yIGVtcHR5IHN0YWNrCisKKyAgICAjIEV4dGVuc2lvbnMgZm9yIHRoZSBET0NUWVBFIHNjYW5uZXI6CisgICAgX2RlY2xfb3RoZXJjaGFycyA9ICc9JworCisgICAgIyBJbnRlcm5hbCAtLSBwYXJzZSBwcm9jZXNzaW5nIGluc3RyLCByZXR1cm4gbGVuZ3RoIG9yIC0xIGlmIG5vdCB0ZXJtaW5hdGVkCisgICAgZGVmIHBhcnNlX3BpKHNlbGYsIGkpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGlmIHJhd2RhdGFbaTppKzJdICE9ICc8Pyc6CisgICAgICAgICAgICBzZWxmLmVycm9yKCd1bmV4cGVjdGVkIGNhbGwgdG8gcGFyc2VfcGkoKScpCisgICAgICAgIG1hdGNoID0gcGljbG9zZS5zZWFyY2gocmF3ZGF0YSwgaSsyKQorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgaiA9IG1hdGNoLnN0YXJ0KDApCisgICAgICAgIHNlbGYuaGFuZGxlX3BpKHJhd2RhdGFbaSsyOiBqXSkKKyAgICAgICAgaiA9IG1hdGNoLmVuZCgwKQorICAgICAgICByZXR1cm4gai1pCisKKyAgICBkZWYgZ2V0X3N0YXJ0dGFnX3RleHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fc3RhcnR0YWdfdGV4dAorCisgICAgIyBJbnRlcm5hbCAtLSBoYW5kbGUgc3RhcnR0YWcsIHJldHVybiBsZW5ndGggb3IgLTEgaWYgbm90IHRlcm1pbmF0ZWQKKyAgICBkZWYgcGFyc2Vfc3RhcnR0YWcoc2VsZiwgaSk6CisgICAgICAgIHNlbGYuX19zdGFydHRhZ190ZXh0ID0gTm9uZQorICAgICAgICBzdGFydF9wb3MgPSBpCisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgaWYgc2hvcnR0YWdvcGVuLm1hdGNoKHJhd2RhdGEsIGkpOgorICAgICAgICAgICAgIyBTR01MIHNob3J0aGFuZDogPHRhZy9kYXRhLyA9PSA8dGFnPmRhdGE8L3RhZz4KKyAgICAgICAgICAgICMgWFhYIENhbiBkYXRhIGNvbnRhaW4gJi4uLiAoZW50aXR5IG9yIGNoYXIgcmVmcyk/CisgICAgICAgICAgICAjIFhYWCBDYW4gZGF0YSBjb250YWluIDwgb3IgPiAodGFnIGNoYXJhY3RlcnMpPworICAgICAgICAgICAgIyBYWFggQ2FuIHRoZXJlIGJlIHdoaXRlc3BhY2UgYmVmb3JlIHRoZSBmaXJzdCAvPworICAgICAgICAgICAgbWF0Y2ggPSBzaG9ydHRhZy5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgdGFnLCBkYXRhID0gbWF0Y2guZ3JvdXAoMSwgMikKKyAgICAgICAgICAgIHNlbGYuX19zdGFydHRhZ190ZXh0ID0gJzwlcy8nICUgdGFnCisgICAgICAgICAgICB0YWcgPSB0YWcubG93ZXIoKQorICAgICAgICAgICAgayA9IG1hdGNoLmVuZCgwKQorICAgICAgICAgICAgc2VsZi5maW5pc2hfc2hvcnR0YWcodGFnLCBkYXRhKQorICAgICAgICAgICAgc2VsZi5fX3N0YXJ0dGFnX3RleHQgPSByYXdkYXRhW3N0YXJ0X3BvczptYXRjaC5lbmQoMSkgKyAxXQorICAgICAgICAgICAgcmV0dXJuIGsKKyAgICAgICAgIyBYWFggVGhlIGZvbGxvd2luZyBzaG91bGQgc2tpcCBtYXRjaGluZyBxdW90ZXMgKCcgb3IgIikKKyAgICAgICAgIyBBcyBhIHNob3J0Y3V0IHdheSB0byBleGl0LCB0aGlzIGlzbid0IHNvIGJhZCwgYnV0IHNob3VsZG4ndAorICAgICAgICAjIGJlIHVzZWQgdG8gbG9jYXRlIHRoZSBhY3R1YWwgZW5kIG9mIHRoZSBzdGFydCB0YWcgc2luY2UgdGhlCisgICAgICAgICMgPCBvciA+IGNoYXJhY3RlcnMgbWF5IGJlIGVtYmVkZGVkIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZS4KKyAgICAgICAgbWF0Y2ggPSBlbmRicmFja2V0LnNlYXJjaChyYXdkYXRhLCBpKzEpCisgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBqID0gbWF0Y2guc3RhcnQoMCkKKyAgICAgICAgIyBOb3cgcGFyc2UgdGhlIGRhdGEgYmV0d2VlbiBpKzEgYW5kIGogaW50byBhIHRhZyBhbmQgYXR0cnMKKyAgICAgICAgYXR0cnMgPSBbXQorICAgICAgICBpZiByYXdkYXRhW2k6aSsyXSA9PSAnPD4nOgorICAgICAgICAgICAgIyBTR01MIHNob3J0aGFuZDogPD4gPT0gPGxhc3Qgb3BlbiB0YWcgc2Vlbj4KKyAgICAgICAgICAgIGsgPSBqCisgICAgICAgICAgICB0YWcgPSBzZWxmLmxhc3R0YWcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hdGNoID0gdGFnZmluZC5tYXRjaChyYXdkYXRhLCBpKzEpCisgICAgICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICAgICAgc2VsZi5lcnJvcigndW5leHBlY3RlZCBjYWxsIHRvIHBhcnNlX3N0YXJ0dGFnJykKKyAgICAgICAgICAgIGsgPSBtYXRjaC5lbmQoMCkKKyAgICAgICAgICAgIHRhZyA9IHJhd2RhdGFbaSsxOmtdLmxvd2VyKCkKKyAgICAgICAgICAgIHNlbGYubGFzdHRhZyA9IHRhZworICAgICAgICB3aGlsZSBrIDwgajoKKyAgICAgICAgICAgIG1hdGNoID0gYXR0cmZpbmQubWF0Y2gocmF3ZGF0YSwgaykKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaDogYnJlYWsKKyAgICAgICAgICAgIGF0dHJuYW1lLCByZXN0LCBhdHRydmFsdWUgPSBtYXRjaC5ncm91cCgxLCAyLCAzKQorICAgICAgICAgICAgaWYgbm90IHJlc3Q6CisgICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gYXR0cm5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgKGF0dHJ2YWx1ZVs6MV0gPT0gIiciID09IGF0dHJ2YWx1ZVstMTpdIG9yCisgICAgICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZVs6MV0gPT0gJyInID09IGF0dHJ2YWx1ZVstMTpdKToKKyAgICAgICAgICAgICAgICAgICAgIyBzdHJpcCBxdW90ZXMKKyAgICAgICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gYXR0cnZhbHVlWzE6LTFdCisgICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gc2VsZi5lbnRpdHlfb3JfY2hhcnJlZi5zdWIoCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbnZlcnRfcmVmLCBhdHRydmFsdWUpCisgICAgICAgICAgICBhdHRycy5hcHBlbmQoKGF0dHJuYW1lLmxvd2VyKCksIGF0dHJ2YWx1ZSkpCisgICAgICAgICAgICBrID0gbWF0Y2guZW5kKDApCisgICAgICAgIGlmIHJhd2RhdGFbal0gPT0gJz4nOgorICAgICAgICAgICAgaiA9IGorMQorICAgICAgICBzZWxmLl9fc3RhcnR0YWdfdGV4dCA9IHJhd2RhdGFbc3RhcnRfcG9zOmpdCisgICAgICAgIHNlbGYuZmluaXNoX3N0YXJ0dGFnKHRhZywgYXR0cnMpCisgICAgICAgIHJldHVybiBqCisKKyAgICAjIEludGVybmFsIC0tIGNvbnZlcnQgZW50aXR5IG9yIGNoYXJhY3RlciByZWZlcmVuY2UKKyAgICBkZWYgX2NvbnZlcnRfcmVmKHNlbGYsIG1hdGNoKToKKyAgICAgICAgaWYgbWF0Y2guZ3JvdXAoMik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb252ZXJ0X2NoYXJyZWYobWF0Y2guZ3JvdXAoMikpIG9yIFwKKyAgICAgICAgICAgICAgICAnJiMlcyVzJyAlIG1hdGNoLmdyb3VwcygpWzE6XQorICAgICAgICBlbGlmIG1hdGNoLmdyb3VwKDMpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29udmVydF9lbnRpdHlyZWYobWF0Y2guZ3JvdXAoMSkpIG9yIFwKKyAgICAgICAgICAgICAgICAnJiVzOycgJSBtYXRjaC5ncm91cCgxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICcmJXMnICUgbWF0Y2guZ3JvdXAoMSkKKworICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgZW5kdGFnCisgICAgZGVmIHBhcnNlX2VuZHRhZyhzZWxmLCBpKToKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBtYXRjaCA9IGVuZGJyYWNrZXQuc2VhcmNoKHJhd2RhdGEsIGkrMSkKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGogPSBtYXRjaC5zdGFydCgwKQorICAgICAgICB0YWcgPSByYXdkYXRhW2krMjpqXS5zdHJpcCgpLmxvd2VyKCkKKyAgICAgICAgaWYgcmF3ZGF0YVtqXSA9PSAnPic6CisgICAgICAgICAgICBqID0gaisxCisgICAgICAgIHNlbGYuZmluaXNoX2VuZHRhZyh0YWcpCisgICAgICAgIHJldHVybiBqCisKKyAgICAjIEludGVybmFsIC0tIGZpbmlzaCBwYXJzaW5nIG9mIDx0YWcvZGF0YS8gKHNhbWUgYXMgPHRhZz5kYXRhPC90YWc+KQorICAgIGRlZiBmaW5pc2hfc2hvcnR0YWcoc2VsZiwgdGFnLCBkYXRhKToKKyAgICAgICAgc2VsZi5maW5pc2hfc3RhcnR0YWcodGFnLCBbXSkKKyAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShkYXRhKQorICAgICAgICBzZWxmLmZpbmlzaF9lbmR0YWcodGFnKQorCisgICAgIyBJbnRlcm5hbCAtLSBmaW5pc2ggcHJvY2Vzc2luZyBvZiBzdGFydCB0YWcKKyAgICAjIFJldHVybiAtMSBmb3IgdW5rbm93biB0YWcsIDAgZm9yIG9wZW4tb25seSB0YWcsIDEgZm9yIGJhbGFuY2VkIHRhZworICAgIGRlZiBmaW5pc2hfc3RhcnR0YWcoc2VsZiwgdGFnLCBhdHRycyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZiwgJ3N0YXJ0XycgKyB0YWcpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdkb18nICsgdGFnKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYudW5rbm93bl9zdGFydHRhZyh0YWcsIGF0dHJzKQorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9zdGFydHRhZyh0YWcsIG1ldGhvZCwgYXR0cnMpCisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RhY2suYXBwZW5kKHRhZykKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX3N0YXJ0dGFnKHRhZywgbWV0aG9kLCBhdHRycykKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAjIEludGVybmFsIC0tIGZpbmlzaCBwcm9jZXNzaW5nIG9mIGVuZCB0YWcKKyAgICBkZWYgZmluaXNoX2VuZHRhZyhzZWxmLCB0YWcpOgorICAgICAgICBpZiBub3QgdGFnOgorICAgICAgICAgICAgZm91bmQgPSBsZW4oc2VsZi5zdGFjaykgLSAxCisgICAgICAgICAgICBpZiBmb3VuZCA8IDA6CisgICAgICAgICAgICAgICAgc2VsZi51bmtub3duX2VuZHRhZyh0YWcpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB0YWcgbm90IGluIHNlbGYuc3RhY2s6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdlbmRfJyArIHRhZykKKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5rbm93bl9lbmR0YWcodGFnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0X3VuYmFsYW5jZWQodGFnKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZm91bmQgPSBsZW4oc2VsZi5zdGFjaykKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGZvdW5kKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0YWNrW2ldID09IHRhZzogZm91bmQgPSBpCisgICAgICAgIHdoaWxlIGxlbihzZWxmLnN0YWNrKSA+IGZvdW5kOgorICAgICAgICAgICAgdGFnID0gc2VsZi5zdGFja1stMV0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdlbmRfJyArIHRhZykKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBOb25lCisgICAgICAgICAgICBpZiBtZXRob2Q6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZW5kdGFnKHRhZywgbWV0aG9kKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnVua25vd25fZW5kdGFnKHRhZykKKyAgICAgICAgICAgIGRlbCBzZWxmLnN0YWNrWy0xXQorCisgICAgIyBPdmVycmlkYWJsZSAtLSBoYW5kbGUgc3RhcnQgdGFnCisgICAgZGVmIGhhbmRsZV9zdGFydHRhZyhzZWxmLCB0YWcsIG1ldGhvZCwgYXR0cnMpOgorICAgICAgICBtZXRob2QoYXR0cnMpCisKKyAgICAjIE92ZXJyaWRhYmxlIC0tIGhhbmRsZSBlbmQgdGFnCisgICAgZGVmIGhhbmRsZV9lbmR0YWcoc2VsZiwgdGFnLCBtZXRob2QpOgorICAgICAgICBtZXRob2QoKQorCisgICAgIyBFeGFtcGxlIC0tIHJlcG9ydCBhbiB1bmJhbGFuY2VkIDwvLi4uPiB0YWcuCisgICAgZGVmIHJlcG9ydF91bmJhbGFuY2VkKHNlbGYsIHRhZyk6CisgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICcqKiogVW5iYWxhbmNlZCA8LycgKyB0YWcgKyAnPicKKyAgICAgICAgICAgIHByaW50ICcqKiogU3RhY2s6Jywgc2VsZi5zdGFjaworCisgICAgZGVmIGNvbnZlcnRfY2hhcnJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiQ29udmVydCBjaGFyYWN0ZXIgcmVmZXJlbmNlLCBtYXkgYmUgb3ZlcnJpZGRlbi4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbiA9IGludChuYW1lKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgMCA8PSBuIDw9IDEyNzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByZXR1cm4gc2VsZi5jb252ZXJ0X2NvZGVwb2ludChuKQorCisgICAgZGVmIGNvbnZlcnRfY29kZXBvaW50KHNlbGYsIGNvZGVwb2ludCk6CisgICAgICAgIHJldHVybiBjaHIoY29kZXBvaW50KQorCisgICAgZGVmIGhhbmRsZV9jaGFycmVmKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJIYW5kbGUgY2hhcmFjdGVyIHJlZmVyZW5jZSwgbm8gbmVlZCB0byBvdmVycmlkZS4iIiIKKyAgICAgICAgcmVwbGFjZW1lbnQgPSBzZWxmLmNvbnZlcnRfY2hhcnJlZihuYW1lKQorICAgICAgICBpZiByZXBsYWNlbWVudCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi51bmtub3duX2NoYXJyZWYobmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmVwbGFjZW1lbnQpCisKKyAgICAjIERlZmluaXRpb24gb2YgZW50aXRpZXMgLS0gZGVyaXZlZCBjbGFzc2VzIG1heSBvdmVycmlkZQorICAgIGVudGl0eWRlZnMgPSBcCisgICAgICAgICAgICB7J2x0JzogJzwnLCAnZ3QnOiAnPicsICdhbXAnOiAnJicsICdxdW90JzogJyInLCAnYXBvcyc6ICdcJyd9CisKKyAgICBkZWYgY29udmVydF9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkNvbnZlcnQgZW50aXR5IHJlZmVyZW5jZXMuCisKKyAgICAgICAgQXMgYW4gYWx0ZXJuYXRpdmUgdG8gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZDsgb25lIGNhbiB0YWlsb3IgdGhlCisgICAgICAgIHJlc3VsdHMgYnkgc2V0dGluZyB1cCB0aGUgc2VsZi5lbnRpdHlkZWZzIG1hcHBpbmcgYXBwcm9wcmlhdGVseS4KKyAgICAgICAgIiIiCisgICAgICAgIHRhYmxlID0gc2VsZi5lbnRpdHlkZWZzCisgICAgICAgIGlmIG5hbWUgaW4gdGFibGU6CisgICAgICAgICAgICByZXR1cm4gdGFibGVbbmFtZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgZGVmIGhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkhhbmRsZSBlbnRpdHkgcmVmZXJlbmNlcywgbm8gbmVlZCB0byBvdmVycmlkZS4iIiIKKyAgICAgICAgcmVwbGFjZW1lbnQgPSBzZWxmLmNvbnZlcnRfZW50aXR5cmVmKG5hbWUpCisgICAgICAgIGlmIHJlcGxhY2VtZW50IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnVua25vd25fZW50aXR5cmVmKG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJlcGxhY2VtZW50KQorCisgICAgIyBFeGFtcGxlIC0tIGhhbmRsZSBkYXRhLCBzaG91bGQgYmUgb3ZlcnJpZGRlbgorICAgIGRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgcGFzcworCisgICAgIyBFeGFtcGxlIC0tIGhhbmRsZSBjb21tZW50LCBjb3VsZCBiZSBvdmVycmlkZGVuCisgICAgZGVmIGhhbmRsZV9jb21tZW50KHNlbGYsIGRhdGEpOgorICAgICAgICBwYXNzCisKKyAgICAjIEV4YW1wbGUgLS0gaGFuZGxlIGRlY2xhcmF0aW9uLCBjb3VsZCBiZSBvdmVycmlkZGVuCisgICAgZGVmIGhhbmRsZV9kZWNsKHNlbGYsIGRlY2wpOgorICAgICAgICBwYXNzCisKKyAgICAjIEV4YW1wbGUgLS0gaGFuZGxlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIGNvdWxkIGJlIG92ZXJyaWRkZW4KKyAgICBkZWYgaGFuZGxlX3BpKHNlbGYsIGRhdGEpOgorICAgICAgICBwYXNzCisKKyAgICAjIFRvIGJlIG92ZXJyaWRkZW4gLS0gaGFuZGxlcnMgZm9yIHVua25vd24gb2JqZWN0cworICAgIGRlZiB1bmtub3duX3N0YXJ0dGFnKHNlbGYsIHRhZywgYXR0cnMpOiBwYXNzCisgICAgZGVmIHVua25vd25fZW5kdGFnKHNlbGYsIHRhZyk6IHBhc3MKKyAgICBkZWYgdW5rbm93bl9jaGFycmVmKHNlbGYsIHJlZik6IHBhc3MKKyAgICBkZWYgdW5rbm93bl9lbnRpdHlyZWYoc2VsZiwgcmVmKTogcGFzcworCisKK2NsYXNzIFRlc3RTR01MUGFyc2VyKFNHTUxQYXJzZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcmJvc2U9MCk6CisgICAgICAgIHNlbGYudGVzdGRhdGEgPSAiIgorICAgICAgICBTR01MUGFyc2VyLl9faW5pdF9fKHNlbGYsIHZlcmJvc2UpCisKKyAgICBkZWYgaGFuZGxlX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYudGVzdGRhdGEgPSBzZWxmLnRlc3RkYXRhICsgZGF0YQorICAgICAgICBpZiBsZW4ocmVwcihzZWxmLnRlc3RkYXRhKSkgPj0gNzA6CisgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYudGVzdGRhdGEKKyAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgIHNlbGYudGVzdGRhdGEgPSAiIgorICAgICAgICAgICAgcHJpbnQgJ2RhdGE6JywgcmVwcihkYXRhKQorCisgICAgZGVmIGhhbmRsZV9jb21tZW50KHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgciA9IHJlcHIoZGF0YSkKKyAgICAgICAgaWYgbGVuKHIpID4gNjg6CisgICAgICAgICAgICByID0gcls6MzJdICsgJy4uLicgKyByWy0zMjpdCisgICAgICAgIHByaW50ICdjb21tZW50OicsIHIKKworICAgIGRlZiB1bmtub3duX3N0YXJ0dGFnKHNlbGYsIHRhZywgYXR0cnMpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgaWYgbm90IGF0dHJzOgorICAgICAgICAgICAgcHJpbnQgJ3N0YXJ0IHRhZzogPCcgKyB0YWcgKyAnPicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICdzdGFydCB0YWc6IDwnICsgdGFnLAorICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGF0dHJzOgorICAgICAgICAgICAgICAgIHByaW50IG5hbWUgKyAnPScgKyAnIicgKyB2YWx1ZSArICciJywKKyAgICAgICAgICAgIHByaW50ICc+JworCisgICAgZGVmIHVua25vd25fZW5kdGFnKHNlbGYsIHRhZyk6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBwcmludCAnZW5kIHRhZzogPC8nICsgdGFnICsgJz4nCisKKyAgICBkZWYgdW5rbm93bl9lbnRpdHlyZWYoc2VsZiwgcmVmKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHByaW50ICcqKiogdW5rbm93biBlbnRpdHkgcmVmOiAmJyArIHJlZiArICc7JworCisgICAgZGVmIHVua25vd25fY2hhcnJlZihzZWxmLCByZWYpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgcHJpbnQgJyoqKiB1bmtub3duIGNoYXIgcmVmOiAmIycgKyByZWYgKyAnOycKKworICAgIGRlZiB1bmtub3duX2RlY2woc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBwcmludCAnKioqIHVua25vd24gZGVjbDogWycgKyBkYXRhICsgJ10nCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIFNHTUxQYXJzZXIuY2xvc2Uoc2VsZikKKyAgICAgICAgc2VsZi5mbHVzaCgpCisKKworZGVmIHRlc3QoYXJncyA9IE5vbmUpOgorICAgIGltcG9ydCBzeXMKKworICAgIGlmIGFyZ3MgaXMgTm9uZToKKyAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorCisgICAgaWYgYXJncyBhbmQgYXJnc1swXSA9PSAnLXMnOgorICAgICAgICBhcmdzID0gYXJnc1sxOl0KKyAgICAgICAga2xhc3MgPSBTR01MUGFyc2VyCisgICAgZWxzZToKKyAgICAgICAga2xhc3MgPSBUZXN0U0dNTFBhcnNlcgorCisgICAgaWYgYXJnczoKKyAgICAgICAgZmlsZSA9IGFyZ3NbMF0KKyAgICBlbHNlOgorICAgICAgICBmaWxlID0gJ3Rlc3QuaHRtbCcKKworICAgIGlmIGZpbGUgPT0gJy0nOgorICAgICAgICBmID0gc3lzLnN0ZGluCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4oZmlsZSwgJ3InKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICAgICAgcHJpbnQgZmlsZSwgIjoiLCBtc2cKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBkYXRhID0gZi5yZWFkKCkKKyAgICBpZiBmIGlzIG5vdCBzeXMuc3RkaW46CisgICAgICAgIGYuY2xvc2UoKQorCisgICAgeCA9IGtsYXNzKCkKKyAgICBmb3IgYyBpbiBkYXRhOgorICAgICAgICB4LmZlZWQoYykKKyAgICB4LmNsb3NlKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zZ21sbGliLnB5YyBiL2xpYi9weXRob24yLjcvc2dtbGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0YmI1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2dtbGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zZ21sbGliLnB5byBiL2xpYi9weXRob24yLjcvc2dtbGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0YmI1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2dtbGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zaGEucHkgYi9saWIvcHl0aG9uMi43L3NoYS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWRkZThkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zaGEucHkKQEAgLTAsMCArMSwxNSBAQAorIyAkSWQkCisjCisjICBDb3B5cmlnaHQgKEMpIDIwMDUgICBHcmVnb3J5IFAuIFNtaXRoIChncmVnQGtyeXB0by5vcmcpCisjICBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3Mud2FybigidGhlIHNoYSBtb2R1bGUgaXMgZGVwcmVjYXRlZDsgdXNlIHRoZSBoYXNobGliIG1vZHVsZSBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisKK2Zyb20gaGFzaGxpYiBpbXBvcnQgc2hhMSBhcyBzaGEKK25ldyA9IHNoYQorCitibG9ja3NpemUgPSAxICAgICAgICAjIGxlZ2FjeSB2YWx1ZSAod3JvbmcgaW4gYW55IHVzZWZ1bCBzZW5zZSkKK2RpZ2VzdF9zaXplID0gMjAKK2RpZ2VzdHNpemUgPSAyMApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zaGEucHljIGIvbGliL3B5dGhvbjIuNy9zaGEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwN2ZkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NoYS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zaGEucHlvIGIvbGliL3B5dGhvbjIuNy9zaGEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwN2ZkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NoYS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zaGVsdmUucHkgYi9saWIvcHl0aG9uMi43L3NoZWx2ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGNiYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zaGVsdmUucHkKQEAgLTAsMCArMSwyMzkgQEAKKyIiIk1hbmFnZSBzaGVsdmVzIG9mIHBpY2tsZWQgb2JqZWN0cy4KKworQSAic2hlbGYiIGlzIGEgcGVyc2lzdGVudCwgZGljdGlvbmFyeS1saWtlIG9iamVjdC4gIFRoZSBkaWZmZXJlbmNlCit3aXRoIGRibSBkYXRhYmFzZXMgaXMgdGhhdCB0aGUgdmFsdWVzIChub3QgdGhlIGtleXMhKSBpbiBhIHNoZWxmIGNhbgorYmUgZXNzZW50aWFsbHkgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzIC0tIGFueXRoaW5nIHRoYXQgdGhlICJwaWNrbGUiCittb2R1bGUgY2FuIGhhbmRsZS4gIFRoaXMgaW5jbHVkZXMgbW9zdCBjbGFzcyBpbnN0YW5jZXMsIHJlY3Vyc2l2ZSBkYXRhCit0eXBlcywgYW5kIG9iamVjdHMgY29udGFpbmluZyBsb3RzIG9mIHNoYXJlZCBzdWItb2JqZWN0cy4gIFRoZSBrZXlzCithcmUgb3JkaW5hcnkgc3RyaW5ncy4KKworVG8gc3VtbWFyaXplIHRoZSBpbnRlcmZhY2UgKGtleSBpcyBhIHN0cmluZywgZGF0YSBpcyBhbiBhcmJpdHJhcnkKK29iamVjdCk6CisKKyAgICAgICAgaW1wb3J0IHNoZWx2ZQorICAgICAgICBkID0gc2hlbHZlLm9wZW4oZmlsZW5hbWUpICMgb3Blbiwgd2l0aCAoZylkYm0gZmlsZW5hbWUgLS0gbm8gc3VmZml4CisKKyAgICAgICAgZFtrZXldID0gZGF0YSAgICMgc3RvcmUgZGF0YSBhdCBrZXkgKG92ZXJ3cml0ZXMgb2xkIGRhdGEgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdXNpbmcgYW4gZXhpc3Rpbmcga2V5KQorICAgICAgICBkYXRhID0gZFtrZXldICAgIyByZXRyaWV2ZSBhIENPUFkgb2YgdGhlIGRhdGEgYXQga2V5IChyYWlzZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBLZXlFcnJvciBpZiBubyBzdWNoIGtleSkgLS0gTk9URSB0aGF0IHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYWNjZXNzIHJldHVybnMgYSAqY29weSogb2YgdGhlIGVudHJ5IQorICAgICAgICBkZWwgZFtrZXldICAgICAgIyBkZWxldGUgZGF0YSBzdG9yZWQgYXQga2V5IChyYWlzZXMgS2V5RXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbm8gc3VjaCBrZXkpCisgICAgICAgIGZsYWcgPSBkLmhhc19rZXkoa2V5KSAgICMgdHJ1ZSBpZiB0aGUga2V5IGV4aXN0czsgc2FtZSBhcyAia2V5IGluIGQiCisgICAgICAgIGxpc3QgPSBkLmtleXMoKSAjIGEgbGlzdCBvZiBhbGwgZXhpc3Rpbmcga2V5cyAoc2xvdyEpCisKKyAgICAgICAgZC5jbG9zZSgpICAgICAgICMgY2xvc2UgaXQKKworRGVwZW5kZW50IG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwgY2xvc2luZyBhIHBlcnNpc3RlbnQgZGljdGlvbmFyeSBtYXkKK29yIG1heSBub3QgYmUgbmVjZXNzYXJ5IHRvIGZsdXNoIGNoYW5nZXMgdG8gZGlzay4KKworTm9ybWFsbHksIGRba2V5XSByZXR1cm5zIGEgQ09QWSBvZiB0aGUgZW50cnkuICBUaGlzIG5lZWRzIGNhcmUgd2hlbgorbXV0YWJsZSBlbnRyaWVzIGFyZSBtdXRhdGVkOiBmb3IgZXhhbXBsZSwgaWYgZFtrZXldIGlzIGEgbGlzdCwKKyAgICAgICAgZFtrZXldLmFwcGVuZChhbml0ZW0pCitkb2VzIE5PVCBtb2RpZnkgdGhlIGVudHJ5IGRba2V5XSBpdHNlbGYsIGFzIHN0b3JlZCBpbiB0aGUgcGVyc2lzdGVudAorbWFwcGluZyAtLSBpdCBvbmx5IG1vZGlmaWVzIHRoZSBjb3B5LCB3aGljaCBpcyB0aGVuIGltbWVkaWF0ZWx5CitkaXNjYXJkZWQsIHNvIHRoYXQgdGhlIGFwcGVuZCBoYXMgTk8gZWZmZWN0IHdoYXRzb2V2ZXIuICBUbyBhcHBlbmQgYW4KK2l0ZW0gdG8gZFtrZXldIGluIGEgd2F5IHRoYXQgd2lsbCBhZmZlY3QgdGhlIHBlcnNpc3RlbnQgbWFwcGluZywgdXNlOgorICAgICAgICBkYXRhID0gZFtrZXldCisgICAgICAgIGRhdGEuYXBwZW5kKGFuaXRlbSkKKyAgICAgICAgZFtrZXldID0gZGF0YQorCitUbyBhdm9pZCB0aGUgcHJvYmxlbSB3aXRoIG11dGFibGUgZW50cmllcywgeW91IG1heSBwYXNzIHRoZSBrZXl3b3JkCithcmd1bWVudCB3cml0ZWJhY2s9VHJ1ZSBpbiB0aGUgY2FsbCB0byBzaGVsdmUub3Blbi4gIFdoZW4geW91IHVzZToKKyAgICAgICAgZCA9IHNoZWx2ZS5vcGVuKGZpbGVuYW1lLCB3cml0ZWJhY2s9VHJ1ZSkKK3RoZW4gZCBrZWVwcyBhIGNhY2hlIG9mIGFsbCBlbnRyaWVzIHlvdSBhY2Nlc3MsIGFuZCB3cml0ZXMgdGhlbSBhbGwgYmFjawordG8gdGhlIHBlcnNpc3RlbnQgbWFwcGluZyB3aGVuIHlvdSBjYWxsIGQuY2xvc2UoKS4gIFRoaXMgZW5zdXJlcyB0aGF0CitzdWNoIHVzYWdlIGFzIGRba2V5XS5hcHBlbmQoYW5pdGVtKSB3b3JrcyBhcyBpbnRlbmRlZC4KKworSG93ZXZlciwgdXNpbmcga2V5d29yZCBhcmd1bWVudCB3cml0ZWJhY2s9VHJ1ZSBtYXkgY29uc3VtZSB2YXN0IGFtb3VudAorb2YgbWVtb3J5IGZvciB0aGUgY2FjaGUsIGFuZCBpdCBtYXkgbWFrZSBkLmNsb3NlKCkgdmVyeSBzbG93LCBpZiB5b3UKK2FjY2VzcyBtYW55IG9mIGQncyBlbnRyaWVzIGFmdGVyIG9wZW5pbmcgaXQgaW4gdGhpcyB3YXk6IGQgaGFzIG5vIHdheSB0bworY2hlY2sgd2hpY2ggb2YgdGhlIGVudHJpZXMgeW91IGFjY2VzcyBhcmUgbXV0YWJsZSBhbmQvb3Igd2hpY2ggb25lcyB5b3UKK2FjdHVhbGx5IG11dGF0ZSwgc28gaXQgbXVzdCBjYWNoZSwgYW5kIHdyaXRlIGJhY2sgYXQgY2xvc2UsIGFsbCBvZiB0aGUKK2VudHJpZXMgdGhhdCB5b3UgYWNjZXNzLiAgWW91IGNhbiBjYWxsIGQuc3luYygpIHRvIHdyaXRlIGJhY2sgYWxsIHRoZQorZW50cmllcyBpbiB0aGUgY2FjaGUsIGFuZCBlbXB0eSB0aGUgY2FjaGUgKGQuc3luYygpIGFsc28gc3luY2hyb25pemVzCit0aGUgcGVyc2lzdGVudCBkaWN0aW9uYXJ5IG9uIGRpc2ssIGlmIGZlYXNpYmxlKS4KKyIiIgorCisjIFRyeSB1c2luZyBjUGlja2xlIGFuZCBjU3RyaW5nSU8gaWYgYXZhaWxhYmxlLgorCit0cnk6CisgICAgZnJvbSBjUGlja2xlIGltcG9ydCBQaWNrbGVyLCBVbnBpY2tsZXIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIHBpY2tsZSBpbXBvcnQgUGlja2xlciwgVW5waWNrbGVyCisKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitpbXBvcnQgVXNlckRpY3QKKworX19hbGxfXyA9IFsiU2hlbGYiLCJCc2REYlNoZWxmIiwiRGJmaWxlbmFtZVNoZWxmIiwib3BlbiJdCisKK2NsYXNzIF9DbG9zZWREaWN0KFVzZXJEaWN0LkRpY3RNaXhpbik6CisgICAgJ01hcmtlciBmb3IgYSBjbG9zZWQgZGljdC4gIEFjY2VzcyBhdHRlbXB0cyByYWlzZSBhIFZhbHVlRXJyb3IuJworCisgICAgZGVmIGNsb3NlZChzZWxmLCAqYXJncyk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ludmFsaWQgb3BlcmF0aW9uIG9uIGNsb3NlZCBzaGVsZicpCisgICAgX19nZXRpdGVtX18gPSBfX3NldGl0ZW1fXyA9IF9fZGVsaXRlbV9fID0ga2V5cyA9IGNsb3NlZAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJzxDbG9zZWQgRGljdGlvbmFyeT4nCisKK2NsYXNzIFNoZWxmKFVzZXJEaWN0LkRpY3RNaXhpbik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3Igc2hlbGYgaW1wbGVtZW50YXRpb25zLgorCisgICAgVGhpcyBpcyBpbml0aWFsaXplZCB3aXRoIGEgZGljdGlvbmFyeS1saWtlIG9iamVjdC4KKyAgICBTZWUgdGhlIG1vZHVsZSdzIF9fZG9jX18gc3RyaW5nIGZvciBhbiBvdmVydmlldyBvZiB0aGUgaW50ZXJmYWNlLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpY3QsIHByb3RvY29sPU5vbmUsIHdyaXRlYmFjaz1GYWxzZSk6CisgICAgICAgIHNlbGYuZGljdCA9IGRpY3QKKyAgICAgICAgaWYgcHJvdG9jb2wgaXMgTm9uZToKKyAgICAgICAgICAgIHByb3RvY29sID0gMAorICAgICAgICBzZWxmLl9wcm90b2NvbCA9IHByb3RvY29sCisgICAgICAgIHNlbGYud3JpdGViYWNrID0gd3JpdGViYWNrCisgICAgICAgIHNlbGYuY2FjaGUgPSB7fQorCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRpY3Qua2V5cygpCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmRpY3QpCisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuZGljdAorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuZGljdAorCisgICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgIGlmIGtleSBpbiBzZWxmLmRpY3Q6CisgICAgICAgICAgICByZXR1cm4gc2VsZltrZXldCisgICAgICAgIHJldHVybiBkZWZhdWx0CisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmNhY2hlW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgZiA9IFN0cmluZ0lPKHNlbGYuZGljdFtrZXldKQorICAgICAgICAgICAgdmFsdWUgPSBVbnBpY2tsZXIoZikubG9hZCgpCisgICAgICAgICAgICBpZiBzZWxmLndyaXRlYmFjazoKKyAgICAgICAgICAgICAgICBzZWxmLmNhY2hlW2tleV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgaWYgc2VsZi53cml0ZWJhY2s6CisgICAgICAgICAgICBzZWxmLmNhY2hlW2tleV0gPSB2YWx1ZQorICAgICAgICBmID0gU3RyaW5nSU8oKQorICAgICAgICBwID0gUGlja2xlcihmLCBzZWxmLl9wcm90b2NvbCkKKyAgICAgICAgcC5kdW1wKHZhbHVlKQorICAgICAgICBzZWxmLmRpY3Rba2V5XSA9IGYuZ2V0dmFsdWUoKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIGRlbCBzZWxmLmRpY3Rba2V5XQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZi5jYWNoZVtrZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5zeW5jKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kaWN0LmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIENhdGNoIGVycm9ycyB0aGF0IG1heSBoYXBwZW4gd2hlbiBjbG9zZSBpcyBjYWxsZWQgZnJvbSBfX2RlbF9fCisgICAgICAgICMgYmVjYXVzZSBDUHl0aG9uIGlzIGluIGludGVycHJldGVyIHNodXRkb3duLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRpY3QgPSBfQ2xvc2VkRGljdCgpCisgICAgICAgIGV4Y2VwdCAoTmFtZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5kaWN0ID0gTm9uZQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICd3cml0ZWJhY2snKToKKyAgICAgICAgICAgICMgX19pbml0X18gZGlkbid0IHN1Y2NlZWQsIHNvIGRvbid0IGJvdGhlciBjbG9zaW5nCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgc3luYyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi53cml0ZWJhY2sgYW5kIHNlbGYuY2FjaGU6CisgICAgICAgICAgICBzZWxmLndyaXRlYmFjayA9IEZhbHNlCisgICAgICAgICAgICBmb3Iga2V5LCBlbnRyeSBpbiBzZWxmLmNhY2hlLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IGVudHJ5CisgICAgICAgICAgICBzZWxmLndyaXRlYmFjayA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuY2FjaGUgPSB7fQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuZGljdCwgJ3N5bmMnKToKKyAgICAgICAgICAgIHNlbGYuZGljdC5zeW5jKCkKKworCitjbGFzcyBCc2REYlNoZWxmKFNoZWxmKToKKyAgICAiIiJTaGVsZiBpbXBsZW1lbnRhdGlvbiB1c2luZyB0aGUgIkJTRCIgZGIgaW50ZXJmYWNlLgorCisgICAgVGhpcyBhZGRzIG1ldGhvZHMgZmlyc3QoKSwgbmV4dCgpLCBwcmV2aW91cygpLCBsYXN0KCkgYW5kCisgICAgc2V0X2xvY2F0aW9uKCkgdGhhdCBoYXZlIG5vIGNvdW50ZXJwYXJ0IGluIFtnXWRibSBkYXRhYmFzZXMuCisKKyAgICBUaGUgYWN0dWFsIGRhdGFiYXNlIG11c3QgYmUgb3BlbmVkIHVzaW5nIG9uZSBvZiB0aGUgImJzZGRiIgorICAgIG1vZHVsZXMgIm9wZW4iIHJvdXRpbmVzIChpLmUuIGJzZGRiLmhhc2hvcGVuLCBic2RkYi5idG9wZW4gb3IKKyAgICBic2RkYi5ybm9wZW4pIGFuZCBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorCisgICAgU2VlIHRoZSBtb2R1bGUncyBfX2RvY19fIHN0cmluZyBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGludGVyZmFjZS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaWN0LCBwcm90b2NvbD1Ob25lLCB3cml0ZWJhY2s9RmFsc2UpOgorICAgICAgICBTaGVsZi5fX2luaXRfXyhzZWxmLCBkaWN0LCBwcm90b2NvbCwgd3JpdGViYWNrKQorCisgICAgZGVmIHNldF9sb2NhdGlvbihzZWxmLCBrZXkpOgorICAgICAgICAoa2V5LCB2YWx1ZSkgPSBzZWxmLmRpY3Quc2V0X2xvY2F0aW9uKGtleSkKKyAgICAgICAgZiA9IFN0cmluZ0lPKHZhbHVlKQorICAgICAgICByZXR1cm4gKGtleSwgVW5waWNrbGVyKGYpLmxvYWQoKSkKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAoa2V5LCB2YWx1ZSkgPSBzZWxmLmRpY3QubmV4dCgpCisgICAgICAgIGYgPSBTdHJpbmdJTyh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIChrZXksIFVucGlja2xlcihmKS5sb2FkKCkpCisKKyAgICBkZWYgcHJldmlvdXMoc2VsZik6CisgICAgICAgIChrZXksIHZhbHVlKSA9IHNlbGYuZGljdC5wcmV2aW91cygpCisgICAgICAgIGYgPSBTdHJpbmdJTyh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIChrZXksIFVucGlja2xlcihmKS5sb2FkKCkpCisKKyAgICBkZWYgZmlyc3Qoc2VsZik6CisgICAgICAgIChrZXksIHZhbHVlKSA9IHNlbGYuZGljdC5maXJzdCgpCisgICAgICAgIGYgPSBTdHJpbmdJTyh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIChrZXksIFVucGlja2xlcihmKS5sb2FkKCkpCisKKyAgICBkZWYgbGFzdChzZWxmKToKKyAgICAgICAgKGtleSwgdmFsdWUpID0gc2VsZi5kaWN0Lmxhc3QoKQorICAgICAgICBmID0gU3RyaW5nSU8odmFsdWUpCisgICAgICAgIHJldHVybiAoa2V5LCBVbnBpY2tsZXIoZikubG9hZCgpKQorCisKK2NsYXNzIERiZmlsZW5hbWVTaGVsZihTaGVsZik6CisgICAgIiIiU2hlbGYgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlICJhbnlkYm0iIGdlbmVyaWMgZGJtIGludGVyZmFjZS4KKworICAgIFRoaXMgaXMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZmlsZW5hbWUgZm9yIHRoZSBkYm0gZGF0YWJhc2UuCisgICAgU2VlIHRoZSBtb2R1bGUncyBfX2RvY19fIHN0cmluZyBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGludGVyZmFjZS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgZmxhZz0nYycsIHByb3RvY29sPU5vbmUsIHdyaXRlYmFjaz1GYWxzZSk6CisgICAgICAgIGltcG9ydCBhbnlkYm0KKyAgICAgICAgU2hlbGYuX19pbml0X18oc2VsZiwgYW55ZGJtLm9wZW4oZmlsZW5hbWUsIGZsYWcpLCBwcm90b2NvbCwgd3JpdGViYWNrKQorCisKK2RlZiBvcGVuKGZpbGVuYW1lLCBmbGFnPSdjJywgcHJvdG9jb2w9Tm9uZSwgd3JpdGViYWNrPUZhbHNlKToKKyAgICAiIiJPcGVuIGEgcGVyc2lzdGVudCBkaWN0aW9uYXJ5IGZvciByZWFkaW5nIGFuZCB3cml0aW5nLgorCisgICAgVGhlIGZpbGVuYW1lIHBhcmFtZXRlciBpcyB0aGUgYmFzZSBmaWxlbmFtZSBmb3IgdGhlIHVuZGVybHlpbmcKKyAgICBkYXRhYmFzZS4gIEFzIGEgc2lkZS1lZmZlY3QsIGFuIGV4dGVuc2lvbiBtYXkgYmUgYWRkZWQgdG8gdGhlCisgICAgZmlsZW5hbWUgYW5kIG1vcmUgdGhhbiBvbmUgZmlsZSBtYXkgYmUgY3JlYXRlZC4gIFRoZSBvcHRpb25hbCBmbGFnCisgICAgcGFyYW1ldGVyIGhhcyB0aGUgc2FtZSBpbnRlcnByZXRhdGlvbiBhcyB0aGUgZmxhZyBwYXJhbWV0ZXIgb2YKKyAgICBhbnlkYm0ub3BlbigpLiBUaGUgb3B0aW9uYWwgcHJvdG9jb2wgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUKKyAgICB2ZXJzaW9uIG9mIHRoZSBwaWNrbGUgcHJvdG9jb2wgKDAsIDEsIG9yIDIpLgorCisgICAgU2VlIHRoZSBtb2R1bGUncyBfX2RvY19fIHN0cmluZyBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGludGVyZmFjZS4KKyAgICAiIiIKKworICAgIHJldHVybiBEYmZpbGVuYW1lU2hlbGYoZmlsZW5hbWUsIGZsYWcsIHByb3RvY29sLCB3cml0ZWJhY2spCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NoZWx2ZS5weWMgYi9saWIvcHl0aG9uMi43L3NoZWx2ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjYmYxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2hlbHZlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NoZWx2ZS5weW8gYi9saWIvcHl0aG9uMi43L3NoZWx2ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjYmYxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2hlbHZlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NobGV4LnB5IGIvbGliL3B5dGhvbjIuNy9zaGxleC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2M4YWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zaGxleC5weQpAQCAtMCwwICsxLDI5MiBAQAorIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQorIiIiQSBsZXhpY2FsIGFuYWx5emVyIGNsYXNzIGZvciBzaW1wbGUgc2hlbGwtbGlrZSBzeW50YXhlcy4iIiIKKworIyBNb2R1bGUgYW5kIGRvY3VtZW50YXRpb24gYnkgRXJpYyBTLiBSYXltb25kLCAyMSBEZWMgMTk5OAorIyBJbnB1dCBzdGFja2luZyBhbmQgZXJyb3IgbWVzc2FnZSBjbGVhbnVwIGFkZGVkIGJ5IEVTUiwgTWFyY2ggMjAwMAorIyBwdXNoX3NvdXJjZSgpIGFuZCBwb3Bfc291cmNlKCkgbWFkZSBleHBsaWNpdCBieSBFU1IsIEphbnVhcnkgMjAwMS4KKyMgUG9zaXggY29tcGxpYW5jZSwgc3BsaXQoKSwgc3RyaW5nIGFyZ3VtZW50cywgYW5kCisjIGl0ZXJhdG9yIGludGVyZmFjZSBieSBHdXN0YXZvIE5pZW1leWVyLCBBcHJpbCAyMDAzLgorCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHN5cworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKKwordHJ5OgorICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK19fYWxsX18gPSBbInNobGV4IiwgInNwbGl0Il0KKworY2xhc3Mgc2hsZXg6CisgICAgIkEgbGV4aWNhbCBhbmFseXplciBjbGFzcyBmb3Igc2ltcGxlIHNoZWxsLWxpa2Ugc3ludGF4ZXMuIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbnN0cmVhbT1Ob25lLCBpbmZpbGU9Tm9uZSwgcG9zaXg9RmFsc2UpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGluc3RyZWFtLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGluc3RyZWFtID0gU3RyaW5nSU8oaW5zdHJlYW0pCisgICAgICAgIGlmIGluc3RyZWFtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5pbnN0cmVhbSA9IGluc3RyZWFtCisgICAgICAgICAgICBzZWxmLmluZmlsZSA9IGluZmlsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5pbnN0cmVhbSA9IHN5cy5zdGRpbgorICAgICAgICAgICAgc2VsZi5pbmZpbGUgPSBOb25lCisgICAgICAgIHNlbGYucG9zaXggPSBwb3NpeAorICAgICAgICBpZiBwb3NpeDoKKyAgICAgICAgICAgIHNlbGYuZW9mID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lb2YgPSAnJworICAgICAgICBzZWxmLmNvbW1lbnRlcnMgPSAnIycKKyAgICAgICAgc2VsZi53b3JkY2hhcnMgPSAoJ2FiY2RmZWdoaWprbG1ub3BxcnN0dXZ3eHl6JworICAgICAgICAgICAgICAgICAgICAgICAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5XycpCisgICAgICAgIGlmIHNlbGYucG9zaXg6CisgICAgICAgICAgICBzZWxmLndvcmRjaGFycyArPSAoJ9/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vj5+vv8/f7/JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICfAwcLDxMXGx8jJysvMzc7P0NHS09TV1tjZ2tvc3d4nKQorICAgICAgICBzZWxmLndoaXRlc3BhY2UgPSAnIFx0XHJcbicKKyAgICAgICAgc2VsZi53aGl0ZXNwYWNlX3NwbGl0ID0gRmFsc2UKKyAgICAgICAgc2VsZi5xdW90ZXMgPSAnXCciJworICAgICAgICBzZWxmLmVzY2FwZSA9ICdcXCcKKyAgICAgICAgc2VsZi5lc2NhcGVkcXVvdGVzID0gJyInCisgICAgICAgIHNlbGYuc3RhdGUgPSAnICcKKyAgICAgICAgc2VsZi5wdXNoYmFjayA9IGRlcXVlKCkKKyAgICAgICAgc2VsZi5saW5lbm8gPSAxCisgICAgICAgIHNlbGYuZGVidWcgPSAwCisgICAgICAgIHNlbGYudG9rZW4gPSAnJworICAgICAgICBzZWxmLmZpbGVzdGFjayA9IGRlcXVlKCkKKyAgICAgICAgc2VsZi5zb3VyY2UgPSBOb25lCisgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICBwcmludCAnc2hsZXg6IHJlYWRpbmcgZnJvbSAlcywgbGluZSAlZCcgXAorICAgICAgICAgICAgICAgICAgJSAoc2VsZi5pbnN0cmVhbSwgc2VsZi5saW5lbm8pCisKKyAgICBkZWYgcHVzaF90b2tlbihzZWxmLCB0b2spOgorICAgICAgICAiUHVzaCBhIHRva2VuIG9udG8gdGhlIHN0YWNrIHBvcHBlZCBieSB0aGUgZ2V0X3Rva2VuIG1ldGhvZCIKKyAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOgorICAgICAgICAgICAgcHJpbnQgInNobGV4OiBwdXNoaW5nIHRva2VuICIgKyByZXByKHRvaykKKyAgICAgICAgc2VsZi5wdXNoYmFjay5hcHBlbmRsZWZ0KHRvaykKKworICAgIGRlZiBwdXNoX3NvdXJjZShzZWxmLCBuZXdzdHJlYW0sIG5ld2ZpbGU9Tm9uZSk6CisgICAgICAgICJQdXNoIGFuIGlucHV0IHNvdXJjZSBvbnRvIHRoZSBsZXhlcidzIGlucHV0IHNvdXJjZSBzdGFjay4iCisgICAgICAgIGlmIGlzaW5zdGFuY2UobmV3c3RyZWFtLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIG5ld3N0cmVhbSA9IFN0cmluZ0lPKG5ld3N0cmVhbSkKKyAgICAgICAgc2VsZi5maWxlc3RhY2suYXBwZW5kbGVmdCgoc2VsZi5pbmZpbGUsIHNlbGYuaW5zdHJlYW0sIHNlbGYubGluZW5vKSkKKyAgICAgICAgc2VsZi5pbmZpbGUgPSBuZXdmaWxlCisgICAgICAgIHNlbGYuaW5zdHJlYW0gPSBuZXdzdHJlYW0KKyAgICAgICAgc2VsZi5saW5lbm8gPSAxCisgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICBpZiBuZXdmaWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHByaW50ICdzaGxleDogcHVzaGluZyB0byBmaWxlICVzJyAlIChzZWxmLmluZmlsZSwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICdzaGxleDogcHVzaGluZyB0byBzdHJlYW0gJXMnICUgKHNlbGYuaW5zdHJlYW0sKQorCisgICAgZGVmIHBvcF9zb3VyY2Uoc2VsZik6CisgICAgICAgICJQb3AgdGhlIGlucHV0IHNvdXJjZSBzdGFjay4iCisgICAgICAgIHNlbGYuaW5zdHJlYW0uY2xvc2UoKQorICAgICAgICAoc2VsZi5pbmZpbGUsIHNlbGYuaW5zdHJlYW0sIHNlbGYubGluZW5vKSA9IHNlbGYuZmlsZXN0YWNrLnBvcGxlZnQoKQorICAgICAgICBpZiBzZWxmLmRlYnVnOgorICAgICAgICAgICAgcHJpbnQgJ3NobGV4OiBwb3BwaW5nIHRvICVzLCBsaW5lICVkJyBcCisgICAgICAgICAgICAgICAgICAlIChzZWxmLmluc3RyZWFtLCBzZWxmLmxpbmVubykKKyAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJworCisgICAgZGVmIGdldF90b2tlbihzZWxmKToKKyAgICAgICAgIkdldCBhIHRva2VuIGZyb20gdGhlIGlucHV0IHN0cmVhbSAob3IgZnJvbSBzdGFjayBpZiBpdCdzIG5vbmVtcHR5KSIKKyAgICAgICAgaWYgc2VsZi5wdXNoYmFjazoKKyAgICAgICAgICAgIHRvayA9IHNlbGYucHVzaGJhY2sucG9wbGVmdCgpCisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDE6CisgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBwb3BwaW5nIHRva2VuICIgKyByZXByKHRvaykKKyAgICAgICAgICAgIHJldHVybiB0b2sKKyAgICAgICAgIyBObyBwdXNoYmFjay4gIEdldCBhIHRva2VuLgorICAgICAgICByYXcgPSBzZWxmLnJlYWRfdG9rZW4oKQorICAgICAgICAjIEhhbmRsZSBpbmNsdXNpb25zCisgICAgICAgIGlmIHNlbGYuc291cmNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd2hpbGUgcmF3ID09IHNlbGYuc291cmNlOgorICAgICAgICAgICAgICAgIHNwZWMgPSBzZWxmLnNvdXJjZWhvb2soc2VsZi5yZWFkX3Rva2VuKCkpCisgICAgICAgICAgICAgICAgaWYgc3BlYzoKKyAgICAgICAgICAgICAgICAgICAgKG5ld2ZpbGUsIG5ld3N0cmVhbSkgPSBzcGVjCisgICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaF9zb3VyY2UobmV3c3RyZWFtLCBuZXdmaWxlKQorICAgICAgICAgICAgICAgIHJhdyA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgIyBNYXliZSB3ZSBnb3QgRU9GIGluc3RlYWQ/CisgICAgICAgIHdoaWxlIHJhdyA9PSBzZWxmLmVvZjoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmZpbGVzdGFjazoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5lb2YKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5wb3Bfc291cmNlKCkKKyAgICAgICAgICAgICAgICByYXcgPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgICMgTmVpdGhlciBpbmNsdXNpb24gbm9yIEVPRgorICAgICAgICBpZiBzZWxmLmRlYnVnID49IDE6CisgICAgICAgICAgICBpZiByYXcgIT0gc2VsZi5lb2Y6CisgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiB0b2tlbj0iICsgcmVwcihyYXcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogdG9rZW49RU9GIgorICAgICAgICByZXR1cm4gcmF3CisKKyAgICBkZWYgcmVhZF90b2tlbihzZWxmKToKKyAgICAgICAgcXVvdGVkID0gRmFsc2UKKyAgICAgICAgZXNjYXBlZHN0YXRlID0gJyAnCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBuZXh0Y2hhciA9IHNlbGYuaW5zdHJlYW0ucmVhZCgxKQorICAgICAgICAgICAgaWYgbmV4dGNoYXIgPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAzOgorICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogaW4gc3RhdGUiLCByZXByKHNlbGYuc3RhdGUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgIkkgc2VlIGNoYXJhY3RlcjoiLCByZXByKG5leHRjaGFyKQorICAgICAgICAgICAgaWYgc2VsZi5zdGF0ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSAnJyAgICAgICAgIyBwYXN0IGVuZCBvZiBmaWxlCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSAnICc6CisgICAgICAgICAgICAgICAgaWYgbm90IG5leHRjaGFyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gTm9uZSAgIyBlbmQgb2YgZmlsZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53aGl0ZXNwYWNlOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDI6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IEkgc2VlIHdoaXRlc3BhY2UgaW4gd2hpdGVzcGFjZSBzdGF0ZSIKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLmNvbW1lbnRlcnM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0ucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5wb3NpeCBhbmQgbmV4dGNoYXIgaW4gc2VsZi5lc2NhcGU6CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRzdGF0ZSA9ICdhJworICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKKyAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYud29yZGNoYXJzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdhJworICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi5xdW90ZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBvc2l4OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBuZXh0Y2hhcgorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi53aGl0ZXNwYWNlX3NwbGl0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdhJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBuZXh0Y2hhcgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRva2VuIG9yIChzZWxmLnBvc2l4IGFuZCBxdW90ZWQpOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSBpbiBzZWxmLnF1b3RlczoKKyAgICAgICAgICAgICAgICBxdW90ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgbm90IG5leHRjaGFyOiAgICAgICMgZW5kIG9mIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBJIHNlZSBFT0YgaW4gcXVvdGVzIHN0YXRlIgorICAgICAgICAgICAgICAgICAgICAjIFhYWCB3aGF0IGVycm9yIHNob3VsZCBiZSByYWlzZWQgaGVyZT8KKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIk5vIGNsb3NpbmcgcXVvdGF0aW9uIgorICAgICAgICAgICAgICAgIGlmIG5leHRjaGFyID09IHNlbGYuc3RhdGU6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBvc2l4OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnYScKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYuZXNjYXBlIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlIGluIHNlbGYuZXNjYXBlZHF1b3RlczoKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZHN0YXRlID0gc2VsZi5zdGF0ZQorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCisgICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgaW4gc2VsZi5lc2NhcGU6CisgICAgICAgICAgICAgICAgaWYgbm90IG5leHRjaGFyOiAgICAgICMgZW5kIG9mIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBJIHNlZSBFT0YgaW4gZXNjYXBlIHN0YXRlIgorICAgICAgICAgICAgICAgICAgICAjIFhYWCB3aGF0IGVycm9yIHNob3VsZCBiZSByYWlzZWQgaGVyZT8KKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIk5vIGVzY2FwZWQgY2hhcmFjdGVyIgorICAgICAgICAgICAgICAgICMgSW4gcG9zaXggc2hlbGxzLCBvbmx5IHRoZSBxdW90ZSBpdHNlbGYgb3IgdGhlIGVzY2FwZQorICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIG1heSBiZSBlc2NhcGVkIHdpdGhpbiBxdW90ZXMuCisgICAgICAgICAgICAgICAgaWYgZXNjYXBlZHN0YXRlIGluIHNlbGYucXVvdGVzIGFuZCBcCisgICAgICAgICAgICAgICAgICAgbmV4dGNoYXIgIT0gc2VsZi5zdGF0ZSBhbmQgbmV4dGNoYXIgIT0gZXNjYXBlZHN0YXRlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIHNlbGYuc3RhdGUKKyAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gc2VsZi50b2tlbiArIG5leHRjaGFyCisgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IGVzY2FwZWRzdGF0ZQorICAgICAgICAgICAgZWxpZiBzZWxmLnN0YXRlID09ICdhJzoKKyAgICAgICAgICAgICAgICBpZiBub3QgbmV4dGNoYXI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBOb25lICAgIyBlbmQgb2YgZmlsZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53aGl0ZXNwYWNlOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDI6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IEkgc2VlIHdoaXRlc3BhY2UgaW4gd29yZCBzdGF0ZSIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJworICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRva2VuIG9yIChzZWxmLnBvc2l4IGFuZCBxdW90ZWQpOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYuY29tbWVudGVyczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0cmVhbS5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyAxCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucG9zaXg6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRva2VuIG9yIChzZWxmLnBvc2l4IGFuZCBxdW90ZWQpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYucXVvdGVzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYuZXNjYXBlOgorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkc3RhdGUgPSAnYScKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyCisgICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLndvcmRjaGFycyBvciBuZXh0Y2hhciBpbiBzZWxmLnF1b3RlcyBcCisgICAgICAgICAgICAgICAgICAgIG9yIHNlbGYud2hpdGVzcGFjZV9zcGxpdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaGJhY2suYXBwZW5kbGVmdChuZXh0Y2hhcikKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBJIHNlZSBwdW5jdHVhdGlvbiBpbiB3b3JkIHN0YXRlIgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJyAnCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW46CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICMgZW1pdCBjdXJyZW50IHRva2VuCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICByZXN1bHQgPSBzZWxmLnRva2VuCisgICAgICAgIHNlbGYudG9rZW4gPSAnJworICAgICAgICBpZiBzZWxmLnBvc2l4IGFuZCBub3QgcXVvdGVkIGFuZCByZXN1bHQgPT0gJyc6CisgICAgICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgIGlmIHNlbGYuZGVidWcgPiAxOgorICAgICAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogcmF3IHRva2VuPSIgKyByZXByKHJlc3VsdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiByYXcgdG9rZW49RU9GIgorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgc291cmNlaG9vayhzZWxmLCBuZXdmaWxlKToKKyAgICAgICAgIkhvb2sgY2FsbGVkIG9uIGEgZmlsZW5hbWUgdG8gYmUgc291cmNlZC4iCisgICAgICAgIGlmIG5ld2ZpbGVbMF0gPT0gJyInOgorICAgICAgICAgICAgbmV3ZmlsZSA9IG5ld2ZpbGVbMTotMV0KKyAgICAgICAgIyBUaGlzIGltcGxlbWVudHMgY3BwLWxpa2Ugc2VtYW50aWNzIGZvciByZWxhdGl2ZS1wYXRoIGluY2x1c2lvbi4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmluZmlsZSwgYmFzZXN0cmluZykgYW5kIG5vdCBvcy5wYXRoLmlzYWJzKG5ld2ZpbGUpOgorICAgICAgICAgICAgbmV3ZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc2VsZi5pbmZpbGUpLCBuZXdmaWxlKQorICAgICAgICByZXR1cm4gKG5ld2ZpbGUsIG9wZW4obmV3ZmlsZSwgInIiKSkKKworICAgIGRlZiBlcnJvcl9sZWFkZXIoc2VsZiwgaW5maWxlPU5vbmUsIGxpbmVubz1Ob25lKToKKyAgICAgICAgIkVtaXQgYSBDLWNvbXBpbGVyLWxpa2UsIEVtYWNzLWZyaWVuZGx5IGVycm9yLW1lc3NhZ2UgbGVhZGVyLiIKKyAgICAgICAgaWYgaW5maWxlIGlzIE5vbmU6CisgICAgICAgICAgICBpbmZpbGUgPSBzZWxmLmluZmlsZQorICAgICAgICBpZiBsaW5lbm8gaXMgTm9uZToKKyAgICAgICAgICAgIGxpbmVubyA9IHNlbGYubGluZW5vCisgICAgICAgIHJldHVybiAiXCIlc1wiLCBsaW5lICVkOiAiICUgKGluZmlsZSwgbGluZW5vKQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHRva2VuID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICBpZiB0b2tlbiA9PSBzZWxmLmVvZjoKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmV0dXJuIHRva2VuCisKK2RlZiBzcGxpdChzLCBjb21tZW50cz1GYWxzZSwgcG9zaXg9VHJ1ZSk6CisgICAgbGV4ID0gc2hsZXgocywgcG9zaXg9cG9zaXgpCisgICAgbGV4LndoaXRlc3BhY2Vfc3BsaXQgPSBUcnVlCisgICAgaWYgbm90IGNvbW1lbnRzOgorICAgICAgICBsZXguY29tbWVudGVycyA9ICcnCisgICAgcmV0dXJuIGxpc3QobGV4KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGlmIGxlbihzeXMuYXJndikgPT0gMToKKyAgICAgICAgbGV4ZXIgPSBzaGxleCgpCisgICAgZWxzZToKKyAgICAgICAgZmlsZSA9IHN5cy5hcmd2WzFdCisgICAgICAgIGxleGVyID0gc2hsZXgob3BlbihmaWxlKSwgZmlsZSkKKyAgICB3aGlsZSAxOgorICAgICAgICB0dCA9IGxleGVyLmdldF90b2tlbigpCisgICAgICAgIGlmIHR0OgorICAgICAgICAgICAgcHJpbnQgIlRva2VuOiAiICsgcmVwcih0dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NobGV4LnB5YyBiL2xpYi9weXRob24yLjcvc2hsZXgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMDllZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NobGV4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NobGV4LnB5byBiL2xpYi9weXRob24yLjcvc2hsZXgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMDllZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NobGV4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NodXRpbC5weSBiL2xpYi9weXRob24yLjcvc2h1dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMDgwMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NodXRpbC5weQpAQCAtMCwwICsxLDU1NiBAQAorIiIiVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGNvcHlpbmcgYW5kIGFyY2hpdmluZyBmaWxlcyBhbmQgZGlyZWN0b3J5IHRyZWVzLgorCitYWFggVGhlIGZ1bmN0aW9ucyBoZXJlIGRvbid0IGNvcHkgdGhlIHJlc291cmNlIGZvcmsgb3Igb3RoZXIgbWV0YWRhdGEgb24gTWFjLgorCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc3RhdAorZnJvbSBvcy5wYXRoIGltcG9ydCBhYnNwYXRoCitpbXBvcnQgZm5tYXRjaAoraW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgZXJybm8KKwordHJ5OgorICAgIGZyb20gcHdkIGltcG9ydCBnZXRwd25hbQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGdldHB3bmFtID0gTm9uZQorCit0cnk6CisgICAgZnJvbSBncnAgaW1wb3J0IGdldGdybmFtCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZ2V0Z3JuYW0gPSBOb25lCisKK19fYWxsX18gPSBbImNvcHlmaWxlb2JqIiwgImNvcHlmaWxlIiwgImNvcHltb2RlIiwgImNvcHlzdGF0IiwgImNvcHkiLCAiY29weTIiLAorICAgICAgICAgICAiY29weXRyZWUiLCAibW92ZSIsICJybXRyZWUiLCAiRXJyb3IiLCAiU3BlY2lhbEZpbGVFcnJvciIsCisgICAgICAgICAgICJFeGVjRXJyb3IiLCAibWFrZV9hcmNoaXZlIiwgImdldF9hcmNoaXZlX2Zvcm1hdHMiLAorICAgICAgICAgICAicmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQiLCAidW5yZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdCIsCisgICAgICAgICAgICJpZ25vcmVfcGF0dGVybnMiXQorCitjbGFzcyBFcnJvcihFbnZpcm9ubWVudEVycm9yKToKKyAgICBwYXNzCisKK2NsYXNzIFNwZWNpYWxGaWxlRXJyb3IoRW52aXJvbm1lbnRFcnJvcik6CisgICAgIiIiUmFpc2VkIHdoZW4gdHJ5aW5nIHRvIGRvIGEga2luZCBvZiBvcGVyYXRpb24gKGUuZy4gY29weWluZykgd2hpY2ggaXMKKyAgICBub3Qgc3VwcG9ydGVkIG9uIGEgc3BlY2lhbCBmaWxlIChlLmcuIGEgbmFtZWQgcGlwZSkiIiIKKworY2xhc3MgRXhlY0Vycm9yKEVudmlyb25tZW50RXJyb3IpOgorICAgICIiIlJhaXNlZCB3aGVuIGEgY29tbWFuZCBjb3VsZCBub3QgYmUgZXhlY3V0ZWQiIiIKKwordHJ5OgorICAgIFdpbmRvd3NFcnJvcgorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBXaW5kb3dzRXJyb3IgPSBOb25lCisKK2RlZiBjb3B5ZmlsZW9iaihmc3JjLCBmZHN0LCBsZW5ndGg9MTYqMTAyNCk6CisgICAgIiIiY29weSBkYXRhIGZyb20gZmlsZS1saWtlIG9iamVjdCBmc3JjIHRvIGZpbGUtbGlrZSBvYmplY3QgZmRzdCIiIgorICAgIHdoaWxlIDE6CisgICAgICAgIGJ1ZiA9IGZzcmMucmVhZChsZW5ndGgpCisgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICBicmVhaworICAgICAgICBmZHN0LndyaXRlKGJ1ZikKKworZGVmIF9zYW1lZmlsZShzcmMsIGRzdCk6CisgICAgIyBNYWNpbnRvc2gsIFVuaXguCisgICAgaWYgaGFzYXR0cihvcy5wYXRoLCAnc2FtZWZpbGUnKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguc2FtZWZpbGUoc3JjLCBkc3QpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIEFsbCBvdGhlciBwbGF0Zm9ybXM6IGNoZWNrIGZvciBzYW1lIHBhdGhuYW1lLgorICAgIHJldHVybiAob3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLmFic3BhdGgoc3JjKSkgPT0KKyAgICAgICAgICAgIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKGRzdCkpKQorCitkZWYgY29weWZpbGUoc3JjLCBkc3QpOgorICAgICIiIkNvcHkgZGF0YSBmcm9tIHNyYyB0byBkc3QiIiIKKyAgICBpZiBfc2FtZWZpbGUoc3JjLCBkc3QpOgorICAgICAgICByYWlzZSBFcnJvcigiYCVzYCBhbmQgYCVzYCBhcmUgdGhlIHNhbWUgZmlsZSIgJSAoc3JjLCBkc3QpKQorCisgICAgZm9yIGZuIGluIFtzcmMsIGRzdF06CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN0ID0gb3Muc3RhdChmbikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAjIEZpbGUgbW9zdCBsaWtlbHkgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgWFhYIFdoYXQgYWJvdXQgb3RoZXIgc3BlY2lhbCBmaWxlcz8gKHNvY2tldHMsIGRldmljZXMuLi4pCisgICAgICAgICAgICBpZiBzdGF0LlNfSVNGSUZPKHN0LnN0X21vZGUpOgorICAgICAgICAgICAgICAgIHJhaXNlIFNwZWNpYWxGaWxlRXJyb3IoImAlc2AgaXMgYSBuYW1lZCBwaXBlIiAlIGZuKQorCisgICAgd2l0aCBvcGVuKHNyYywgJ3JiJykgYXMgZnNyYzoKKyAgICAgICAgd2l0aCBvcGVuKGRzdCwgJ3diJykgYXMgZmRzdDoKKyAgICAgICAgICAgIGNvcHlmaWxlb2JqKGZzcmMsIGZkc3QpCisKK2RlZiBjb3B5bW9kZShzcmMsIGRzdCk6CisgICAgIiIiQ29weSBtb2RlIGJpdHMgZnJvbSBzcmMgdG8gZHN0IiIiCisgICAgaWYgaGFzYXR0cihvcywgJ2NobW9kJyk6CisgICAgICAgIHN0ID0gb3Muc3RhdChzcmMpCisgICAgICAgIG1vZGUgPSBzdGF0LlNfSU1PREUoc3Quc3RfbW9kZSkKKyAgICAgICAgb3MuY2htb2QoZHN0LCBtb2RlKQorCitkZWYgY29weXN0YXQoc3JjLCBkc3QpOgorICAgICIiIkNvcHkgYWxsIHN0YXQgaW5mbyAobW9kZSBiaXRzLCBhdGltZSwgbXRpbWUsIGZsYWdzKSBmcm9tIHNyYyB0byBkc3QiIiIKKyAgICBzdCA9IG9zLnN0YXQoc3JjKQorICAgIG1vZGUgPSBzdGF0LlNfSU1PREUoc3Quc3RfbW9kZSkKKyAgICBpZiBoYXNhdHRyKG9zLCAndXRpbWUnKToKKyAgICAgICAgb3MudXRpbWUoZHN0LCAoc3Quc3RfYXRpbWUsIHN0LnN0X210aW1lKSkKKyAgICBpZiBoYXNhdHRyKG9zLCAnY2htb2QnKToKKyAgICAgICAgb3MuY2htb2QoZHN0LCBtb2RlKQorICAgIGlmIGhhc2F0dHIob3MsICdjaGZsYWdzJykgYW5kIGhhc2F0dHIoc3QsICdzdF9mbGFncycpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5jaGZsYWdzKGRzdCwgc3Quc3RfZmxhZ3MpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCB3aHk6CisgICAgICAgICAgICBmb3IgZXJyIGluICdFT1BOT1RTVVBQJywgJ0VOT1RTVVAnOgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoZXJybm8sIGVycikgYW5kIHdoeS5lcnJubyA9PSBnZXRhdHRyKGVycm5vLCBlcnIpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorCitkZWYgY29weShzcmMsIGRzdCk6CisgICAgIiIiQ29weSBkYXRhIGFuZCBtb2RlIGJpdHMgKCJjcCBzcmMgZHN0IikuCisKKyAgICBUaGUgZGVzdGluYXRpb24gbWF5IGJlIGEgZGlyZWN0b3J5LgorCisgICAgIiIiCisgICAgaWYgb3MucGF0aC5pc2Rpcihkc3QpOgorICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZHN0LCBvcy5wYXRoLmJhc2VuYW1lKHNyYykpCisgICAgY29weWZpbGUoc3JjLCBkc3QpCisgICAgY29weW1vZGUoc3JjLCBkc3QpCisKK2RlZiBjb3B5MihzcmMsIGRzdCk6CisgICAgIiIiQ29weSBkYXRhIGFuZCBhbGwgc3RhdCBpbmZvICgiY3AgLXAgc3JjIGRzdCIpLgorCisgICAgVGhlIGRlc3RpbmF0aW9uIG1heSBiZSBhIGRpcmVjdG9yeS4KKworICAgICIiIgorICAgIGlmIG9zLnBhdGguaXNkaXIoZHN0KToKKyAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGRzdCwgb3MucGF0aC5iYXNlbmFtZShzcmMpKQorICAgIGNvcHlmaWxlKHNyYywgZHN0KQorICAgIGNvcHlzdGF0KHNyYywgZHN0KQorCitkZWYgaWdub3JlX3BhdHRlcm5zKCpwYXR0ZXJucyk6CisgICAgIiIiRnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyBjb3B5dHJlZSgpIGlnbm9yZSBwYXJhbWV0ZXIuCisKKyAgICBQYXR0ZXJucyBpcyBhIHNlcXVlbmNlIG9mIGdsb2Itc3R5bGUgcGF0dGVybnMKKyAgICB0aGF0IGFyZSB1c2VkIHRvIGV4Y2x1ZGUgZmlsZXMiIiIKKyAgICBkZWYgX2lnbm9yZV9wYXR0ZXJucyhwYXRoLCBuYW1lcyk6CisgICAgICAgIGlnbm9yZWRfbmFtZXMgPSBbXQorICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKKyAgICAgICAgICAgIGlnbm9yZWRfbmFtZXMuZXh0ZW5kKGZubWF0Y2guZmlsdGVyKG5hbWVzLCBwYXR0ZXJuKSkKKyAgICAgICAgcmV0dXJuIHNldChpZ25vcmVkX25hbWVzKQorICAgIHJldHVybiBfaWdub3JlX3BhdHRlcm5zCisKK2RlZiBjb3B5dHJlZShzcmMsIGRzdCwgc3ltbGlua3M9RmFsc2UsIGlnbm9yZT1Ob25lKToKKyAgICAiIiJSZWN1cnNpdmVseSBjb3B5IGEgZGlyZWN0b3J5IHRyZWUgdXNpbmcgY29weTIoKS4KKworICAgIFRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkgbXVzdCBub3QgYWxyZWFkeSBleGlzdC4KKyAgICBJZiBleGNlcHRpb24ocykgb2NjdXIsIGFuIEVycm9yIGlzIHJhaXNlZCB3aXRoIGEgbGlzdCBvZiByZWFzb25zLgorCisgICAgSWYgdGhlIG9wdGlvbmFsIHN5bWxpbmtzIGZsYWcgaXMgdHJ1ZSwgc3ltYm9saWMgbGlua3MgaW4gdGhlCisgICAgc291cmNlIHRyZWUgcmVzdWx0IGluIHN5bWJvbGljIGxpbmtzIGluIHRoZSBkZXN0aW5hdGlvbiB0cmVlOyBpZgorICAgIGl0IGlzIGZhbHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGVzIHBvaW50ZWQgdG8gYnkgc3ltYm9saWMKKyAgICBsaW5rcyBhcmUgY29waWVkLgorCisgICAgVGhlIG9wdGlvbmFsIGlnbm9yZSBhcmd1bWVudCBpcyBhIGNhbGxhYmxlLiBJZiBnaXZlbiwgaXQKKyAgICBpcyBjYWxsZWQgd2l0aCB0aGUgYHNyY2AgcGFyYW1ldGVyLCB3aGljaCBpcyB0aGUgZGlyZWN0b3J5CisgICAgYmVpbmcgdmlzaXRlZCBieSBjb3B5dHJlZSgpLCBhbmQgYG5hbWVzYCB3aGljaCBpcyB0aGUgbGlzdCBvZgorICAgIGBzcmNgIGNvbnRlbnRzLCBhcyByZXR1cm5lZCBieSBvcy5saXN0ZGlyKCk6CisKKyAgICAgICAgY2FsbGFibGUoc3JjLCBuYW1lcykgLT4gaWdub3JlZF9uYW1lcworCisgICAgU2luY2UgY29weXRyZWUoKSBpcyBjYWxsZWQgcmVjdXJzaXZlbHksIHRoZSBjYWxsYWJsZSB3aWxsIGJlCisgICAgY2FsbGVkIG9uY2UgZm9yIGVhY2ggZGlyZWN0b3J5IHRoYXQgaXMgY29waWVkLiBJdCByZXR1cm5zIGEKKyAgICBsaXN0IG9mIG5hbWVzIHJlbGF0aXZlIHRvIHRoZSBgc3JjYCBkaXJlY3RvcnkgdGhhdCBzaG91bGQKKyAgICBub3QgYmUgY29waWVkLgorCisgICAgWFhYIENvbnNpZGVyIHRoaXMgZXhhbXBsZSBjb2RlIHJhdGhlciB0aGFuIHRoZSB1bHRpbWF0ZSB0b29sLgorCisgICAgIiIiCisgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHNyYykKKyAgICBpZiBpZ25vcmUgaXMgbm90IE5vbmU6CisgICAgICAgIGlnbm9yZWRfbmFtZXMgPSBpZ25vcmUoc3JjLCBuYW1lcykKKyAgICBlbHNlOgorICAgICAgICBpZ25vcmVkX25hbWVzID0gc2V0KCkKKworICAgIG9zLm1ha2VkaXJzKGRzdCkKKyAgICBlcnJvcnMgPSBbXQorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBpZiBuYW1lIGluIGlnbm9yZWRfbmFtZXM6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBzcmNuYW1lID0gb3MucGF0aC5qb2luKHNyYywgbmFtZSkKKyAgICAgICAgZHN0bmFtZSA9IG9zLnBhdGguam9pbihkc3QsIG5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHN5bWxpbmtzIGFuZCBvcy5wYXRoLmlzbGluayhzcmNuYW1lKToKKyAgICAgICAgICAgICAgICBsaW5rdG8gPSBvcy5yZWFkbGluayhzcmNuYW1lKQorICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsobGlua3RvLCBkc3RuYW1lKQorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKHNyY25hbWUpOgorICAgICAgICAgICAgICAgIGNvcHl0cmVlKHNyY25hbWUsIGRzdG5hbWUsIHN5bWxpbmtzLCBpZ25vcmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgV2lsbCByYWlzZSBhIFNwZWNpYWxGaWxlRXJyb3IgZm9yIHVuc3VwcG9ydGVkIGZpbGUgdHlwZXMKKyAgICAgICAgICAgICAgICBjb3B5MihzcmNuYW1lLCBkc3RuYW1lKQorICAgICAgICAjIGNhdGNoIHRoZSBFcnJvciBmcm9tIHRoZSByZWN1cnNpdmUgY29weXRyZWUgc28gdGhhdCB3ZSBjYW4KKyAgICAgICAgIyBjb250aW51ZSB3aXRoIG90aGVyIGZpbGVzCisgICAgICAgIGV4Y2VwdCBFcnJvciwgZXJyOgorICAgICAgICAgICAgZXJyb3JzLmV4dGVuZChlcnIuYXJnc1swXSkKKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIHdoeToKKyAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoKHNyY25hbWUsIGRzdG5hbWUsIHN0cih3aHkpKSkKKyAgICB0cnk6CisgICAgICAgIGNvcHlzdGF0KHNyYywgZHN0KQorICAgIGV4Y2VwdCBPU0Vycm9yLCB3aHk6CisgICAgICAgIGlmIFdpbmRvd3NFcnJvciBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZSh3aHksIFdpbmRvd3NFcnJvcik6CisgICAgICAgICAgICAjIENvcHlpbmcgZmlsZSBhY2Nlc3MgdGltZXMgbWF5IGZhaWwgb24gV2luZG93cworICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgoc3JjLCBkc3QsIHN0cih3aHkpKSkKKyAgICBpZiBlcnJvcnM6CisgICAgICAgIHJhaXNlIEVycm9yLCBlcnJvcnMKKworZGVmIHJtdHJlZShwYXRoLCBpZ25vcmVfZXJyb3JzPUZhbHNlLCBvbmVycm9yPU5vbmUpOgorICAgICIiIlJlY3Vyc2l2ZWx5IGRlbGV0ZSBhIGRpcmVjdG9yeSB0cmVlLgorCisgICAgSWYgaWdub3JlX2Vycm9ycyBpcyBzZXQsIGVycm9ycyBhcmUgaWdub3JlZDsgb3RoZXJ3aXNlLCBpZiBvbmVycm9yCisgICAgaXMgc2V0LCBpdCBpcyBjYWxsZWQgdG8gaGFuZGxlIHRoZSBlcnJvciB3aXRoIGFyZ3VtZW50cyAoZnVuYywKKyAgICBwYXRoLCBleGNfaW5mbykgd2hlcmUgZnVuYyBpcyBvcy5saXN0ZGlyLCBvcy5yZW1vdmUsIG9yIG9zLnJtZGlyOworICAgIHBhdGggaXMgdGhlIGFyZ3VtZW50IHRvIHRoYXQgZnVuY3Rpb24gdGhhdCBjYXVzZWQgaXQgdG8gZmFpbDsgYW5kCisgICAgZXhjX2luZm8gaXMgYSB0dXBsZSByZXR1cm5lZCBieSBzeXMuZXhjX2luZm8oKS4gIElmIGlnbm9yZV9lcnJvcnMKKyAgICBpcyBmYWxzZSBhbmQgb25lcnJvciBpcyBOb25lLCBhbiBleGNlcHRpb24gaXMgcmFpc2VkLgorCisgICAgIiIiCisgICAgaWYgaWdub3JlX2Vycm9yczoKKyAgICAgICAgZGVmIG9uZXJyb3IoKmFyZ3MpOgorICAgICAgICAgICAgcGFzcworICAgIGVsaWYgb25lcnJvciBpcyBOb25lOgorICAgICAgICBkZWYgb25lcnJvcigqYXJncyk6CisgICAgICAgICAgICByYWlzZQorICAgIHRyeToKKyAgICAgICAgaWYgb3MucGF0aC5pc2xpbmsocGF0aCk6CisgICAgICAgICAgICAjIHN5bWxpbmtzIHRvIGRpcmVjdG9yaWVzIGFyZSBmb3JiaWRkZW4sIHNlZSBidWcgIzE2NjkKKyAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoIkNhbm5vdCBjYWxsIHJtdHJlZSBvbiBhIHN5bWJvbGljIGxpbmsiKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBvbmVycm9yKG9zLnBhdGguaXNsaW5rLCBwYXRoLCBzeXMuZXhjX2luZm8oKSkKKyAgICAgICAgIyBjYW4ndCBjb250aW51ZSBldmVuIGlmIG9uZXJyb3IgaG9vayByZXR1cm5zCisgICAgICAgIHJldHVybgorICAgIG5hbWVzID0gW10KKyAgICB0cnk6CisgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihwYXRoKQorICAgIGV4Y2VwdCBvcy5lcnJvciwgZXJyOgorICAgICAgICBvbmVycm9yKG9zLmxpc3RkaXIsIHBhdGgsIHN5cy5leGNfaW5mbygpKQorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihwYXRoLCBuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2RlID0gb3MubHN0YXQoZnVsbG5hbWUpLnN0X21vZGUKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgbW9kZSA9IDAKKyAgICAgICAgaWYgc3RhdC5TX0lTRElSKG1vZGUpOgorICAgICAgICAgICAgcm10cmVlKGZ1bGxuYW1lLCBpZ25vcmVfZXJyb3JzLCBvbmVycm9yKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShmdWxsbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIG9uZXJyb3Iob3MucmVtb3ZlLCBmdWxsbmFtZSwgc3lzLmV4Y19pbmZvKCkpCisgICAgdHJ5OgorICAgICAgICBvcy5ybWRpcihwYXRoKQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgb25lcnJvcihvcy5ybWRpciwgcGF0aCwgc3lzLmV4Y19pbmZvKCkpCisKKworZGVmIF9iYXNlbmFtZShwYXRoKToKKyAgICAjIEEgYmFzZW5hbWUoKSB2YXJpYW50IHdoaWNoIGZpcnN0IHN0cmlwcyB0aGUgdHJhaWxpbmcgc2xhc2gsIGlmIHByZXNlbnQuCisgICAgIyBUaHVzIHdlIGFsd2F5cyBnZXQgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoLCBldmVuIGZvciBkaXJlY3Rvcmllcy4KKyAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShwYXRoLnJzdHJpcChvcy5wYXRoLnNlcCkpCisKK2RlZiBtb3ZlKHNyYywgZHN0KToKKyAgICAiIiJSZWN1cnNpdmVseSBtb3ZlIGEgZmlsZSBvciBkaXJlY3RvcnkgdG8gYW5vdGhlciBsb2NhdGlvbi4gVGhpcyBpcworICAgIHNpbWlsYXIgdG8gdGhlIFVuaXggIm12IiBjb21tYW5kLgorCisgICAgSWYgdGhlIGRlc3RpbmF0aW9uIGlzIGEgZGlyZWN0b3J5IG9yIGEgc3ltbGluayB0byBhIGRpcmVjdG9yeSwgdGhlIHNvdXJjZQorICAgIGlzIG1vdmVkIGluc2lkZSB0aGUgZGlyZWN0b3J5LiBUaGUgZGVzdGluYXRpb24gcGF0aCBtdXN0IG5vdCBhbHJlYWR5CisgICAgZXhpc3QuCisKKyAgICBJZiB0aGUgZGVzdGluYXRpb24gYWxyZWFkeSBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeSwgaXQgbWF5IGJlCisgICAgb3ZlcndyaXR0ZW4gZGVwZW5kaW5nIG9uIG9zLnJlbmFtZSgpIHNlbWFudGljcy4KKworICAgIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBvbiBvdXIgY3VycmVudCBmaWxlc3lzdGVtLCB0aGVuIHJlbmFtZSgpIGlzIHVzZWQuCisgICAgT3RoZXJ3aXNlLCBzcmMgaXMgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiBhbmQgdGhlbiByZW1vdmVkLgorICAgIEEgbG90IG1vcmUgY291bGQgYmUgZG9uZSBoZXJlLi4uICBBIGxvb2sgYXQgYSBtdi5jIHNob3dzIGEgbG90IG9mCisgICAgdGhlIGlzc3VlcyB0aGlzIGltcGxlbWVudGF0aW9uIGdsb3NzZXMgb3Zlci4KKworICAgICIiIgorICAgIHJlYWxfZHN0ID0gZHN0CisgICAgaWYgb3MucGF0aC5pc2Rpcihkc3QpOgorICAgICAgICBpZiBfc2FtZWZpbGUoc3JjLCBkc3QpOgorICAgICAgICAgICAgIyBXZSBtaWdodCBiZSBvbiBhIGNhc2UgaW5zZW5zaXRpdmUgZmlsZXN5c3RlbSwKKyAgICAgICAgICAgICMgcGVyZm9ybSB0aGUgcmVuYW1lIGFueXdheS4KKyAgICAgICAgICAgIG9zLnJlbmFtZShzcmMsIGRzdCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHJlYWxfZHN0ID0gb3MucGF0aC5qb2luKGRzdCwgX2Jhc2VuYW1lKHNyYykpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlYWxfZHN0KToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAiRGVzdGluYXRpb24gcGF0aCAnJXMnIGFscmVhZHkgZXhpc3RzIiAlIHJlYWxfZHN0CisgICAgdHJ5OgorICAgICAgICBvcy5yZW5hbWUoc3JjLCByZWFsX2RzdCkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzcmMpOgorICAgICAgICAgICAgaWYgX2Rlc3RpbnNyYyhzcmMsIGRzdCk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJDYW5ub3QgbW92ZSBhIGRpcmVjdG9yeSAnJXMnIGludG8gaXRzZWxmICclcycuIiAlIChzcmMsIGRzdCkKKyAgICAgICAgICAgIGNvcHl0cmVlKHNyYywgcmVhbF9kc3QsIHN5bWxpbmtzPVRydWUpCisgICAgICAgICAgICBybXRyZWUoc3JjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29weTIoc3JjLCByZWFsX2RzdCkKKyAgICAgICAgICAgIG9zLnVubGluayhzcmMpCisKK2RlZiBfZGVzdGluc3JjKHNyYywgZHN0KToKKyAgICBzcmMgPSBhYnNwYXRoKHNyYykKKyAgICBkc3QgPSBhYnNwYXRoKGRzdCkKKyAgICBpZiBub3Qgc3JjLmVuZHN3aXRoKG9zLnBhdGguc2VwKToKKyAgICAgICAgc3JjICs9IG9zLnBhdGguc2VwCisgICAgaWYgbm90IGRzdC5lbmRzd2l0aChvcy5wYXRoLnNlcCk6CisgICAgICAgIGRzdCArPSBvcy5wYXRoLnNlcAorICAgIHJldHVybiBkc3Quc3RhcnRzd2l0aChzcmMpCisKK2RlZiBfZ2V0X2dpZChuYW1lKToKKyAgICAiIiJSZXR1cm5zIGEgZ2lkLCBnaXZlbiBhIGdyb3VwIG5hbWUuIiIiCisgICAgaWYgZ2V0Z3JuYW0gaXMgTm9uZSBvciBuYW1lIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBOb25lCisgICAgdHJ5OgorICAgICAgICByZXN1bHQgPSBnZXRncm5hbShuYW1lKQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIHJlc3VsdFsyXQorICAgIHJldHVybiBOb25lCisKK2RlZiBfZ2V0X3VpZChuYW1lKToKKyAgICAiIiJSZXR1cm5zIGFuIHVpZCwgZ2l2ZW4gYSB1c2VyIG5hbWUuIiIiCisgICAgaWYgZ2V0cHduYW0gaXMgTm9uZSBvciBuYW1lIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBOb25lCisgICAgdHJ5OgorICAgICAgICByZXN1bHQgPSBnZXRwd25hbShuYW1lKQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIHJlc3VsdFsyXQorICAgIHJldHVybiBOb25lCisKK2RlZiBfbWFrZV90YXJiYWxsKGJhc2VfbmFtZSwgYmFzZV9kaXIsIGNvbXByZXNzPSJnemlwIiwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsCisgICAgICAgICAgICAgICAgICBvd25lcj1Ob25lLCBncm91cD1Ob25lLCBsb2dnZXI9Tm9uZSk6CisgICAgIiIiQ3JlYXRlIGEgKHBvc3NpYmx5IGNvbXByZXNzZWQpIHRhciBmaWxlIGZyb20gYWxsIHRoZSBmaWxlcyB1bmRlcgorICAgICdiYXNlX2RpcicuCisKKyAgICAnY29tcHJlc3MnIG11c3QgYmUgImd6aXAiICh0aGUgZGVmYXVsdCksICJiemlwMiIsIG9yIE5vbmUuCisKKyAgICAnb3duZXInIGFuZCAnZ3JvdXAnIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhbiBvd25lciBhbmQgYSBncm91cCBmb3IgdGhlCisgICAgYXJjaGl2ZSB0aGF0IGlzIGJlaW5nIGJ1aWx0LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjdXJyZW50IG93bmVyIGFuZCBncm91cAorICAgIHdpbGwgYmUgdXNlZC4KKworICAgIFRoZSBvdXRwdXQgdGFyIGZpbGUgd2lsbCBiZSBuYW1lZCAnYmFzZV9uYW1lJyArICAiLnRhciIsIHBvc3NpYmx5IHBsdXMKKyAgICB0aGUgYXBwcm9wcmlhdGUgY29tcHJlc3Npb24gZXh0ZW5zaW9uICgiLmd6Iiwgb3IgIi5iejIiKS4KKworICAgIFJldHVybnMgdGhlIG91dHB1dCBmaWxlbmFtZS4KKyAgICAiIiIKKyAgICB0YXJfY29tcHJlc3Npb24gPSB7J2d6aXAnOiAnZ3onLCAnYnppcDInOiAnYnoyJywgTm9uZTogJyd9CisgICAgY29tcHJlc3NfZXh0ID0geydnemlwJzogJy5neicsICdiemlwMic6ICcuYnoyJ30KKworICAgICMgZmxhZ3MgZm9yIGNvbXByZXNzaW9uIHByb2dyYW0sIGVhY2ggZWxlbWVudCBvZiBsaXN0IHdpbGwgYmUgYW4gYXJndW1lbnQKKyAgICBpZiBjb21wcmVzcyBpcyBub3QgTm9uZSBhbmQgY29tcHJlc3Mgbm90IGluIGNvbXByZXNzX2V4dC5rZXlzKCk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgKCJiYWQgdmFsdWUgZm9yICdjb21wcmVzcyc6IG11c3QgYmUgTm9uZSwgJ2d6aXAnIG9yICdiemlwMiciKQorCisgICAgYXJjaGl2ZV9uYW1lID0gYmFzZV9uYW1lICsgJy50YXInICsgY29tcHJlc3NfZXh0LmdldChjb21wcmVzcywgJycpCisgICAgYXJjaGl2ZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoYXJjaGl2ZV9uYW1lKQorCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGFyY2hpdmVfZGlyKToKKyAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNyZWF0aW5nICVzIiwgYXJjaGl2ZV9kaXIpCisgICAgICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAgICAgb3MubWFrZWRpcnMoYXJjaGl2ZV9kaXIpCisKKworICAgICMgY3JlYXRpbmcgdGhlIHRhcmJhbGwKKyAgICBpbXBvcnQgdGFyZmlsZSAgIyBsYXRlIGltcG9ydCBzbyBQeXRob24gYnVpbGQgaXRzZWxmIGRvZXNuJ3QgYnJlYWsKKworICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKKyAgICAgICAgbG9nZ2VyLmluZm8oJ0NyZWF0aW5nIHRhciBhcmNoaXZlJykKKworICAgIHVpZCA9IF9nZXRfdWlkKG93bmVyKQorICAgIGdpZCA9IF9nZXRfZ2lkKGdyb3VwKQorCisgICAgZGVmIF9zZXRfdWlkX2dpZCh0YXJpbmZvKToKKyAgICAgICAgaWYgZ2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdGFyaW5mby5naWQgPSBnaWQKKyAgICAgICAgICAgIHRhcmluZm8uZ25hbWUgPSBncm91cAorICAgICAgICBpZiB1aWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0YXJpbmZvLnVpZCA9IHVpZAorICAgICAgICAgICAgdGFyaW5mby51bmFtZSA9IG93bmVyCisgICAgICAgIHJldHVybiB0YXJpbmZvCisKKyAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGFyY2hpdmVfbmFtZSwgJ3d8JXMnICUgdGFyX2NvbXByZXNzaW9uW2NvbXByZXNzXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFyLmFkZChiYXNlX2RpciwgZmlsdGVyPV9zZXRfdWlkX2dpZCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICByZXR1cm4gYXJjaGl2ZV9uYW1lCisKK2RlZiBfY2FsbF9leHRlcm5hbF96aXAoYmFzZV9kaXIsIHppcF9maWxlbmFtZSwgdmVyYm9zZT1GYWxzZSwgZHJ5X3J1bj1GYWxzZSk6CisgICAgIyBYWFggc2VlIGlmIHdlIHdhbnQgdG8ga2VlcCBhbiBleHRlcm5hbCBjYWxsIGhlcmUKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICB6aXBvcHRpb25zID0gIi1yIgorICAgIGVsc2U6CisgICAgICAgIHppcG9wdGlvbnMgPSAiLXJxIgorICAgIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXhlY0Vycm9yCisgICAgZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduCisgICAgdHJ5OgorICAgICAgICBzcGF3bihbInppcCIsIHppcG9wdGlvbnMsIHppcF9maWxlbmFtZSwgYmFzZV9kaXJdLCBkcnlfcnVuPWRyeV9ydW4pCisgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvcjoKKyAgICAgICAgIyBYWFggcmVhbGx5IHNob3VsZCBkaXN0aW5ndWlzaCBiZXR3ZWVuICJjb3VsZG4ndCBmaW5kCisgICAgICAgICMgZXh0ZXJuYWwgJ3ppcCcgY29tbWFuZCIgYW5kICJ6aXAgZmFpbGVkIi4KKyAgICAgICAgcmFpc2UgRXhlY0Vycm9yLCBcCisgICAgICAgICAgICAoInVuYWJsZSB0byBjcmVhdGUgemlwIGZpbGUgJyVzJzogIgorICAgICAgICAgICAgImNvdWxkIG5laXRoZXIgaW1wb3J0IHRoZSAnemlwZmlsZScgbW9kdWxlIG5vciAiCisgICAgICAgICAgICAiZmluZCBhIHN0YW5kYWxvbmUgemlwIHV0aWxpdHkiKSAlIHppcF9maWxlbmFtZQorCitkZWYgX21ha2VfemlwZmlsZShiYXNlX25hbWUsIGJhc2VfZGlyLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwgbG9nZ2VyPU5vbmUpOgorICAgICIiIkNyZWF0ZSBhIHppcCBmaWxlIGZyb20gYWxsIHRoZSBmaWxlcyB1bmRlciAnYmFzZV9kaXInLgorCisgICAgVGhlIG91dHB1dCB6aXAgZmlsZSB3aWxsIGJlIG5hbWVkICdiYXNlX25hbWUnICsgIi56aXAiLiAgVXNlcyBlaXRoZXIgdGhlCisgICAgInppcGZpbGUiIFB5dGhvbiBtb2R1bGUgKGlmIGF2YWlsYWJsZSkgb3IgdGhlIEluZm9aSVAgInppcCIgdXRpbGl0eQorICAgIChpZiBpbnN0YWxsZWQgYW5kIGZvdW5kIG9uIHRoZSBkZWZhdWx0IHNlYXJjaCBwYXRoKS4gIElmIG5laXRoZXIgdG9vbCBpcworICAgIGF2YWlsYWJsZSwgcmFpc2VzIEV4ZWNFcnJvci4gIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCB6aXAKKyAgICBmaWxlLgorICAgICIiIgorICAgIHppcF9maWxlbmFtZSA9IGJhc2VfbmFtZSArICIuemlwIgorICAgIGFyY2hpdmVfZGlyID0gb3MucGF0aC5kaXJuYW1lKGJhc2VfbmFtZSkKKworICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhhcmNoaXZlX2Rpcik6CisgICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJjcmVhdGluZyAlcyIsIGFyY2hpdmVfZGlyKQorICAgICAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgICAgIG9zLm1ha2VkaXJzKGFyY2hpdmVfZGlyKQorCisgICAgIyBJZiB6aXBmaWxlIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlLCB0cnkgc3Bhd25pbmcgYW4gZXh0ZXJuYWwgJ3ppcCcKKyAgICAjIGNvbW1hbmQuCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgemlwZmlsZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgemlwZmlsZSA9IE5vbmUKKworICAgIGlmIHppcGZpbGUgaXMgTm9uZToKKyAgICAgICAgX2NhbGxfZXh0ZXJuYWxfemlwKGJhc2VfZGlyLCB6aXBfZmlsZW5hbWUsIHZlcmJvc2UsIGRyeV9ydW4pCisgICAgZWxzZToKKyAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbG9nZ2VyLmluZm8oImNyZWF0aW5nICclcycgYW5kIGFkZGluZyAnJXMnIHRvIGl0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHppcF9maWxlbmFtZSwgYmFzZV9kaXIpCisKKyAgICAgICAgaWYgbm90IGRyeV9ydW46CisgICAgICAgICAgICB6aXAgPSB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGVuYW1lLCAidyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb249emlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICAgICAgICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoYmFzZV9kaXIpOgorICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKGRpcnBhdGgsIG5hbWUpKQorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHppcC53cml0ZShwYXRoLCBwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbG9nZ2VyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJhZGRpbmcgJyVzJyIsIHBhdGgpCisgICAgICAgICAgICB6aXAuY2xvc2UoKQorCisgICAgcmV0dXJuIHppcF9maWxlbmFtZQorCitfQVJDSElWRV9GT1JNQVRTID0geworICAgICdnenRhcic6IChfbWFrZV90YXJiYWxsLCBbKCdjb21wcmVzcycsICdnemlwJyldLCAiZ3ppcCdlZCB0YXItZmlsZSIpLAorICAgICdienRhcic6IChfbWFrZV90YXJiYWxsLCBbKCdjb21wcmVzcycsICdiemlwMicpXSwgImJ6aXAyJ2VkIHRhci1maWxlIiksCisgICAgJ3Rhcic6ICAgKF9tYWtlX3RhcmJhbGwsIFsoJ2NvbXByZXNzJywgTm9uZSldLCAidW5jb21wcmVzc2VkIHRhciBmaWxlIiksCisgICAgJ3ppcCc6ICAgKF9tYWtlX3ppcGZpbGUsIFtdLCJaSVAgZmlsZSIpCisgICAgfQorCitkZWYgZ2V0X2FyY2hpdmVfZm9ybWF0cygpOgorICAgICIiIlJldHVybnMgYSBsaXN0IG9mIHN1cHBvcnRlZCBmb3JtYXRzIGZvciBhcmNoaXZpbmcgYW5kIHVuYXJjaGl2aW5nLgorCisgICAgRWFjaCBlbGVtZW50IG9mIHRoZSByZXR1cm5lZCBzZXF1ZW5jZSBpcyBhIHR1cGxlIChuYW1lLCBkZXNjcmlwdGlvbikKKyAgICAiIiIKKyAgICBmb3JtYXRzID0gWyhuYW1lLCByZWdpc3RyeVsyXSkgZm9yIG5hbWUsIHJlZ2lzdHJ5IGluCisgICAgICAgICAgICAgICBfQVJDSElWRV9GT1JNQVRTLml0ZW1zKCldCisgICAgZm9ybWF0cy5zb3J0KCkKKyAgICByZXR1cm4gZm9ybWF0cworCitkZWYgcmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQobmFtZSwgZnVuY3Rpb24sIGV4dHJhX2FyZ3M9Tm9uZSwgZGVzY3JpcHRpb249JycpOgorICAgICIiIlJlZ2lzdGVycyBhbiBhcmNoaXZlIGZvcm1hdC4KKworICAgIG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGZvcm1hdC4gZnVuY3Rpb24gaXMgdGhlIGNhbGxhYmxlIHRoYXQgd2lsbCBiZQorICAgIHVzZWQgdG8gY3JlYXRlIGFyY2hpdmVzLiBJZiBwcm92aWRlZCwgZXh0cmFfYXJncyBpcyBhIHNlcXVlbmNlIG9mCisgICAgKG5hbWUsIHZhbHVlKSB0dXBsZXMgdGhhdCB3aWxsIGJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gdGhlIGNhbGxhYmxlLgorICAgIGRlc2NyaXB0aW9uIGNhbiBiZSBwcm92aWRlZCB0byBkZXNjcmliZSB0aGUgZm9ybWF0LCBhbmQgd2lsbCBiZSByZXR1cm5lZAorICAgIGJ5IHRoZSBnZXRfYXJjaGl2ZV9mb3JtYXRzKCkgZnVuY3Rpb24uCisgICAgIiIiCisgICAgaWYgZXh0cmFfYXJncyBpcyBOb25lOgorICAgICAgICBleHRyYV9hcmdzID0gW10KKyAgICBpZiBub3QgaXNpbnN0YW5jZShmdW5jdGlvbiwgY29sbGVjdGlvbnMuQ2FsbGFibGUpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RoZSAlcyBvYmplY3QgaXMgbm90IGNhbGxhYmxlJyAlIGZ1bmN0aW9uKQorICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dHJhX2FyZ3MsICh0dXBsZSwgbGlzdCkpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4dHJhX2FyZ3MgbmVlZHMgdG8gYmUgYSBzZXF1ZW5jZScpCisgICAgZm9yIGVsZW1lbnQgaW4gZXh0cmFfYXJnczoKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZWxlbWVudCwgKHR1cGxlLCBsaXN0KSkgb3IgbGVuKGVsZW1lbnQpICE9MiA6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4dHJhX2FyZ3MgZWxlbWVudHMgYXJlIDogKGFyZ19uYW1lLCB2YWx1ZSknKQorCisgICAgX0FSQ0hJVkVfRk9STUFUU1tuYW1lXSA9IChmdW5jdGlvbiwgZXh0cmFfYXJncywgZGVzY3JpcHRpb24pCisKK2RlZiB1bnJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0KG5hbWUpOgorICAgIGRlbCBfQVJDSElWRV9GT1JNQVRTW25hbWVdCisKK2RlZiBtYWtlX2FyY2hpdmUoYmFzZV9uYW1lLCBmb3JtYXQsIHJvb3RfZGlyPU5vbmUsIGJhc2VfZGlyPU5vbmUsIHZlcmJvc2U9MCwKKyAgICAgICAgICAgICAgICAgZHJ5X3J1bj0wLCBvd25lcj1Ob25lLCBncm91cD1Ob25lLCBsb2dnZXI9Tm9uZSk6CisgICAgIiIiQ3JlYXRlIGFuIGFyY2hpdmUgZmlsZSAoZWcuIHppcCBvciB0YXIpLgorCisgICAgJ2Jhc2VfbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLCBtaW51cyBhbnkgZm9ybWF0LXNwZWNpZmljCisgICAgZXh0ZW5zaW9uOyAnZm9ybWF0JyBpcyB0aGUgYXJjaGl2ZSBmb3JtYXQ6IG9uZSBvZiAiemlwIiwgInRhciIsICJienRhciIKKyAgICBvciAiZ3p0YXIiLgorCisgICAgJ3Jvb3RfZGlyJyBpcyBhIGRpcmVjdG9yeSB0aGF0IHdpbGwgYmUgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZQorICAgIGFyY2hpdmU7IGllLiB3ZSB0eXBpY2FsbHkgY2hkaXIgaW50byAncm9vdF9kaXInIGJlZm9yZSBjcmVhdGluZyB0aGUKKyAgICBhcmNoaXZlLiAgJ2Jhc2VfZGlyJyBpcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHdlIHN0YXJ0IGFyY2hpdmluZyBmcm9tOworICAgIGllLiAnYmFzZV9kaXInIHdpbGwgYmUgdGhlIGNvbW1vbiBwcmVmaXggb2YgYWxsIGZpbGVzIGFuZAorICAgIGRpcmVjdG9yaWVzIGluIHRoZSBhcmNoaXZlLiAgJ3Jvb3RfZGlyJyBhbmQgJ2Jhc2VfZGlyJyBib3RoIGRlZmF1bHQKKyAgICB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhcmNoaXZlIGZpbGUuCisKKyAgICAnb3duZXInIGFuZCAnZ3JvdXAnIGFyZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YXIgYXJjaGl2ZS4gQnkgZGVmYXVsdCwKKyAgICB1c2VzIHRoZSBjdXJyZW50IG93bmVyIGFuZCBncm91cC4KKyAgICAiIiIKKyAgICBzYXZlX2N3ZCA9IG9zLmdldGN3ZCgpCisgICAgaWYgcm9vdF9kaXIgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiY2hhbmdpbmcgaW50byAnJXMnIiwgcm9vdF9kaXIpCisgICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguYWJzcGF0aChiYXNlX25hbWUpCisgICAgICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAgICAgb3MuY2hkaXIocm9vdF9kaXIpCisKKyAgICBpZiBiYXNlX2RpciBpcyBOb25lOgorICAgICAgICBiYXNlX2RpciA9IG9zLmN1cmRpcgorCisgICAga3dhcmdzID0geydkcnlfcnVuJzogZHJ5X3J1biwgJ2xvZ2dlcic6IGxvZ2dlcn0KKworICAgIHRyeToKKyAgICAgICAgZm9ybWF0X2luZm8gPSBfQVJDSElWRV9GT1JNQVRTW2Zvcm1hdF0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bmtub3duIGFyY2hpdmUgZm9ybWF0ICclcyciICUgZm9ybWF0CisKKyAgICBmdW5jID0gZm9ybWF0X2luZm9bMF0KKyAgICBmb3IgYXJnLCB2YWwgaW4gZm9ybWF0X2luZm9bMV06CisgICAgICAgIGt3YXJnc1thcmddID0gdmFsCisKKyAgICBpZiBmb3JtYXQgIT0gJ3ppcCc6CisgICAgICAgIGt3YXJnc1snb3duZXInXSA9IG93bmVyCisgICAgICAgIGt3YXJnc1snZ3JvdXAnXSA9IGdyb3VwCisKKyAgICB0cnk6CisgICAgICAgIGZpbGVuYW1lID0gZnVuYyhiYXNlX25hbWUsIGJhc2VfZGlyLCAqKmt3YXJncykKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiByb290X2RpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoImNoYW5naW5nIGJhY2sgdG8gJyVzJyIsIHNhdmVfY3dkKQorICAgICAgICAgICAgb3MuY2hkaXIoc2F2ZV9jd2QpCisKKyAgICByZXR1cm4gZmlsZW5hbWUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2h1dGlsLnB5YyBiL2xpYi9weXRob24yLjcvc2h1dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTRjZjcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zaHV0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2h1dGlsLnB5byBiL2xpYi9weXRob24yLjcvc2h1dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTRjZjcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zaHV0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2l0ZS1wYWNrYWdlcy9SRUFETUUgYi9saWIvcHl0aG9uMi43L3NpdGUtcGFja2FnZXMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3M2Y2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NpdGUtcGFja2FnZXMvUkVBRE1FCkBAIC0wLDAgKzEsMiBAQAorVGhpcyBkaXJlY3RvcnkgZXhpc3RzIHNvIHRoYXQgM3JkIHBhcnR5IHBhY2thZ2VzIGNhbiBiZSBpbnN0YWxsZWQKK2hlcmUuICBSZWFkIHRoZSBzb3VyY2UgZm9yIHNpdGUucHkgZm9yIG1vcmUgZGV0YWlscy4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2l0ZS5weSBiL2xpYi9weXRob24yLjcvc2l0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWIwYWU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zaXRlLnB5CkBAIC0wLDAgKzEsNjAwIEBACisiIiJBcHBlbmQgbW9kdWxlIHNlYXJjaCBwYXRocyBmb3IgdGhpcmQtcGFydHkgcGFja2FnZXMgdG8gc3lzLnBhdGguCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVGhpcyBtb2R1bGUgaXMgYXV0b21hdGljYWxseSBpbXBvcnRlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24uICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworSW4gZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24gKHVwIHRvIDEuNWEzKSwgc2NyaXB0cyBvciBtb2R1bGVzIHRoYXQKK25lZWRlZCB0byB1c2Ugc2l0ZS1zcGVjaWZpYyBtb2R1bGVzIHdvdWxkIHBsYWNlIGBgaW1wb3J0IHNpdGUnJworc29tZXdoZXJlIG5lYXIgdGhlIHRvcCBvZiB0aGVpciBjb2RlLiAgQmVjYXVzZSBvZiB0aGUgYXV0b21hdGljCitpbXBvcnQsIHRoaXMgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSAoYnV0IGNvZGUgdGhhdCBkb2VzIGl0IHN0aWxsCit3b3JrcykuCisKK1RoaXMgd2lsbCBhcHBlbmQgc2l0ZS1zcGVjaWZpYyBwYXRocyB0byB0aGUgbW9kdWxlIHNlYXJjaCBwYXRoLiAgT24KK1VuaXggKGluY2x1ZGluZyBNYWMgT1NYKSwgaXQgc3RhcnRzIHdpdGggc3lzLnByZWZpeCBhbmQKK3N5cy5leGVjX3ByZWZpeCAoaWYgZGlmZmVyZW50KSBhbmQgYXBwZW5kcworbGliL3B5dGhvbjx2ZXJzaW9uPi9zaXRlLXBhY2thZ2VzIGFzIHdlbGwgYXMgbGliL3NpdGUtcHl0aG9uLgorT24gb3RoZXIgcGxhdGZvcm1zIChzdWNoIGFzIFdpbmRvd3MpLCBpdCB0cmllcyBlYWNoIG9mIHRoZQorcHJlZml4ZXMgZGlyZWN0bHksIGFzIHdlbGwgYXMgd2l0aCBsaWIvc2l0ZS1wYWNrYWdlcyBhcHBlbmRlZC4gIFRoZQorcmVzdWx0aW5nIGRpcmVjdG9yaWVzLCBpZiB0aGV5IGV4aXN0LCBhcmUgYXBwZW5kZWQgdG8gc3lzLnBhdGgsIGFuZAorYWxzbyBpbnNwZWN0ZWQgZm9yIHBhdGggY29uZmlndXJhdGlvbiBmaWxlcy4KKworQSBwYXRoIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBhIGZpbGUgd2hvc2UgbmFtZSBoYXMgdGhlIGZvcm0KKzxwYWNrYWdlPi5wdGg7IGl0cyBjb250ZW50cyBhcmUgYWRkaXRpb25hbCBkaXJlY3RvcmllcyAob25lIHBlciBsaW5lKQordG8gYmUgYWRkZWQgdG8gc3lzLnBhdGguICBOb24tZXhpc3RpbmcgZGlyZWN0b3JpZXMgKG9yCitub24tZGlyZWN0b3JpZXMpIGFyZSBuZXZlciBhZGRlZCB0byBzeXMucGF0aDsgbm8gZGlyZWN0b3J5IGlzIGFkZGVkIHRvCitzeXMucGF0aCBtb3JlIHRoYW4gb25jZS4gIEJsYW5rIGxpbmVzIGFuZCBsaW5lcyBiZWdpbm5pbmcgd2l0aAorJyMnIGFyZSBza2lwcGVkLiBMaW5lcyBzdGFydGluZyB3aXRoICdpbXBvcnQnIGFyZSBleGVjdXRlZC4KKworRm9yIGV4YW1wbGUsIHN1cHBvc2Ugc3lzLnByZWZpeCBhbmQgc3lzLmV4ZWNfcHJlZml4IGFyZSBzZXQgdG8KKy91c3IvbG9jYWwgYW5kIHRoZXJlIGlzIGEgZGlyZWN0b3J5IC91c3IvbG9jYWwvbGliL3B5dGhvbjIuNS9zaXRlLXBhY2thZ2VzCit3aXRoIHRocmVlIHN1YmRpcmVjdG9yaWVzLCBmb28sIGJhciBhbmQgc3BhbSwgYW5kIHR3byBwYXRoCitjb25maWd1cmF0aW9uIGZpbGVzLCBmb28ucHRoIGFuZCBiYXIucHRoLiAgQXNzdW1lIGZvby5wdGggY29udGFpbnMgdGhlCitmb2xsb3dpbmc6CisKKyAgIyBmb28gcGFja2FnZSBjb25maWd1cmF0aW9uCisgIGZvbworICBiYXIKKyAgYmxldGNoCisKK2FuZCBiYXIucHRoIGNvbnRhaW5zOgorCisgICMgYmFyIHBhY2thZ2UgY29uZmlndXJhdGlvbgorICBiYXIKKworVGhlbiB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzIGFyZSBhZGRlZCB0byBzeXMucGF0aCwgaW4gdGhpcyBvcmRlcjoKKworICAvdXNyL2xvY2FsL2xpYi9weXRob24yLjUvc2l0ZS1wYWNrYWdlcy9iYXIKKyAgL3Vzci9sb2NhbC9saWIvcHl0aG9uMi41L3NpdGUtcGFja2FnZXMvZm9vCisKK05vdGUgdGhhdCBibGV0Y2ggaXMgb21pdHRlZCBiZWNhdXNlIGl0IGRvZXNuJ3QgZXhpc3Q7IGJhciBwcmVjZWRlcyBmb28KK2JlY2F1c2UgYmFyLnB0aCBjb21lcyBhbHBoYWJldGljYWxseSBiZWZvcmUgZm9vLnB0aDsgYW5kIHNwYW0gaXMKK29taXR0ZWQgYmVjYXVzZSBpdCBpcyBub3QgbWVudGlvbmVkIGluIGVpdGhlciBwYXRoIGNvbmZpZ3VyYXRpb24gZmlsZS4KKworQWZ0ZXIgdGhlc2UgcGF0aCBtYW5pcHVsYXRpb25zLCBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gaW1wb3J0IGEgbW9kdWxlCituYW1lZCBzaXRlY3VzdG9taXplLCB3aGljaCBjYW4gcGVyZm9ybSBhcmJpdHJhcnkgYWRkaXRpb25hbAorc2l0ZS1zcGVjaWZpYyBjdXN0b21pemF0aW9ucy4gIElmIHRoaXMgaW1wb3J0IGZhaWxzIHdpdGggYW4KK0ltcG9ydEVycm9yIGV4Y2VwdGlvbiwgaXQgaXMgc2lsZW50bHkgaWdub3JlZC4KKworIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IF9fYnVpbHRpbl9fCitpbXBvcnQgdHJhY2ViYWNrCisKKyMgUHJlZml4ZXMgZm9yIHNpdGUtcGFja2FnZXM7IGFkZCBhZGRpdGlvbmFsIHByZWZpeGVzIGxpa2UgL3Vzci9sb2NhbCBoZXJlCitQUkVGSVhFUyA9IFtzeXMucHJlZml4LCBzeXMuZXhlY19wcmVmaXhdCisjIEVuYWJsZSBwZXIgdXNlciBzaXRlLXBhY2thZ2VzIGRpcmVjdG9yeQorIyBzZXQgaXQgdG8gRmFsc2UgdG8gZGlzYWJsZSB0aGUgZmVhdHVyZSBvciBUcnVlIHRvIGZvcmNlIHRoZSBmZWF0dXJlCitFTkFCTEVfVVNFUl9TSVRFID0gTm9uZQorCisjIGZvciBkaXN0dXRpbHMuY29tbWFuZHMuaW5zdGFsbAorIyBUaGVzZSB2YWx1ZXMgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSBnZXR1c2VyYmFzZSgpIGFuZCBnZXR1c2Vyc2l0ZXBhY2thZ2VzKCkKKyMgZnVuY3Rpb25zLCB0aHJvdWdoIHRoZSBtYWluKCkgZnVuY3Rpb24gd2hlbiBQeXRob24gc3RhcnRzLgorVVNFUl9TSVRFID0gTm9uZQorVVNFUl9CQVNFID0gTm9uZQorCisKK2RlZiBtYWtlcGF0aCgqcGF0aHMpOgorICAgIGRpciA9IG9zLnBhdGguam9pbigqcGF0aHMpCisgICAgdHJ5OgorICAgICAgICBkaXIgPSBvcy5wYXRoLmFic3BhdGgoZGlyKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIGRpciwgb3MucGF0aC5ub3JtY2FzZShkaXIpCisKKworZGVmIGFic19fZmlsZV9fKCk6CisgICAgIiIiU2V0IGFsbCBtb2R1bGUnIF9fZmlsZV9fIGF0dHJpYnV0ZSB0byBhbiBhYnNvbHV0ZSBwYXRoIiIiCisgICAgZm9yIG0gaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6CisgICAgICAgIGlmIGhhc2F0dHIobSwgJ19fbG9hZGVyX18nKToKKyAgICAgICAgICAgIGNvbnRpbnVlICAgIyBkb24ndCBtZXNzIHdpdGggYSBQRVAgMzAyLXN1cHBsaWVkIF9fZmlsZV9fCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG0uX19maWxlX18gPSBvcy5wYXRoLmFic3BhdGgobS5fX2ZpbGVfXykKKyAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgT1NFcnJvcik6CisgICAgICAgICAgICBwYXNzCisKKworZGVmIHJlbW92ZWR1cHBhdGhzKCk6CisgICAgIiIiIFJlbW92ZSBkdXBsaWNhdGUgZW50cmllcyBmcm9tIHN5cy5wYXRoIGFsb25nIHdpdGggbWFraW5nIHRoZW0KKyAgICBhYnNvbHV0ZSIiIgorICAgICMgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGluaXRpYWwgcGF0aCBwcm92aWRlZCBieSB0aGUgaW50ZXJwcmV0ZXIgY29udGFpbnMKKyAgICAjIG9ubHkgYWJzb2x1dGUgcGF0aG5hbWVzLCBldmVuIGlmIHdlJ3JlIHJ1bm5pbmcgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5LgorICAgIEwgPSBbXQorICAgIGtub3duX3BhdGhzID0gc2V0KCkKKyAgICBmb3IgZGlyIGluIHN5cy5wYXRoOgorICAgICAgICAjIEZpbHRlciBvdXQgZHVwbGljYXRlIHBhdGhzIChvbiBjYXNlLWluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtcyBhbHNvCisgICAgICAgICMgaWYgdGhleSBvbmx5IGRpZmZlciBpbiBjYXNlKTsgdHVybiByZWxhdGl2ZSBwYXRocyBpbnRvIGFic29sdXRlCisgICAgICAgICMgcGF0aHMuCisgICAgICAgIGRpciwgZGlyY2FzZSA9IG1ha2VwYXRoKGRpcikKKyAgICAgICAgaWYgbm90IGRpcmNhc2UgaW4ga25vd25fcGF0aHM6CisgICAgICAgICAgICBMLmFwcGVuZChkaXIpCisgICAgICAgICAgICBrbm93bl9wYXRocy5hZGQoZGlyY2FzZSkKKyAgICBzeXMucGF0aFs6XSA9IEwKKyAgICByZXR1cm4ga25vd25fcGF0aHMKKworCitkZWYgX2luaXRfcGF0aGluZm8oKToKKyAgICAiIiJSZXR1cm4gYSBzZXQgY29udGFpbmluZyBhbGwgZXhpc3RpbmcgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBzeXMucGF0aCIiIgorICAgIGQgPSBzZXQoKQorICAgIGZvciBkaXIgaW4gc3lzLnBhdGg6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlyKToKKyAgICAgICAgICAgICAgICBkaXIsIGRpcmNhc2UgPSBtYWtlcGF0aChkaXIpCisgICAgICAgICAgICAgICAgZC5hZGQoZGlyY2FzZSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgcmV0dXJuIGQKKworCitkZWYgYWRkcGFja2FnZShzaXRlZGlyLCBuYW1lLCBrbm93bl9wYXRocyk6CisgICAgIiIiUHJvY2VzcyBhIC5wdGggZmlsZSB3aXRoaW4gdGhlIHNpdGUtcGFja2FnZXMgZGlyZWN0b3J5OgorICAgICAgIEZvciBlYWNoIGxpbmUgaW4gdGhlIGZpbGUsIGVpdGhlciBjb21iaW5lIGl0IHdpdGggc2l0ZWRpciB0byBhIHBhdGgKKyAgICAgICBhbmQgYWRkIHRoYXQgdG8ga25vd25fcGF0aHMsIG9yIGV4ZWN1dGUgaXQgaWYgaXQgc3RhcnRzIHdpdGggJ2ltcG9ydCAnLgorICAgICIiIgorICAgIGlmIGtub3duX3BhdGhzIGlzIE5vbmU6CisgICAgICAgIF9pbml0X3BhdGhpbmZvKCkKKyAgICAgICAgcmVzZXQgPSAxCisgICAgZWxzZToKKyAgICAgICAgcmVzZXQgPSAwCisgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oc2l0ZWRpciwgbmFtZSkKKyAgICB0cnk6CisgICAgICAgIGYgPSBvcGVuKGZ1bGxuYW1lLCAiclUiKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICByZXR1cm4KKyAgICB3aXRoIGY6CisgICAgICAgIGZvciBuLCBsaW5lIGluIGVudW1lcmF0ZShmKToKKyAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiIyIpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCgiaW1wb3J0ICIsICJpbXBvcnRcdCIpKToKKyAgICAgICAgICAgICAgICAgICAgZXhlYyBsaW5lCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKKyAgICAgICAgICAgICAgICBkaXIsIGRpcmNhc2UgPSBtYWtlcGF0aChzaXRlZGlyLCBsaW5lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBkaXJjYXNlIGluIGtub3duX3BhdGhzIGFuZCBvcy5wYXRoLmV4aXN0cyhkaXIpOgorICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5hcHBlbmQoZGlyKQorICAgICAgICAgICAgICAgICAgICBrbm93bl9wYXRocy5hZGQoZGlyY2FzZSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgorICAgICAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkVycm9yIHByb2Nlc3NpbmcgbGluZSB7OmR9IG9mIHt9OlxuIi5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgIG4rMSwgZnVsbG5hbWUpCisgICAgICAgICAgICAgICAgZm9yIHJlY29yZCBpbiB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbigqc3lzLmV4Y19pbmZvKCkpOgorICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiByZWNvcmQuc3BsaXRsaW5lcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAnICAnK2xpbmUKKyAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJcblJlbWFpbmRlciBvZiBmaWxlIGlnbm9yZWQiCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICBpZiByZXNldDoKKyAgICAgICAga25vd25fcGF0aHMgPSBOb25lCisgICAgcmV0dXJuIGtub3duX3BhdGhzCisKKworZGVmIGFkZHNpdGVkaXIoc2l0ZWRpciwga25vd25fcGF0aHM9Tm9uZSk6CisgICAgIiIiQWRkICdzaXRlZGlyJyBhcmd1bWVudCB0byBzeXMucGF0aCBpZiBtaXNzaW5nIGFuZCBoYW5kbGUgLnB0aCBmaWxlcyBpbgorICAgICdzaXRlZGlyJyIiIgorICAgIGlmIGtub3duX3BhdGhzIGlzIE5vbmU6CisgICAgICAgIGtub3duX3BhdGhzID0gX2luaXRfcGF0aGluZm8oKQorICAgICAgICByZXNldCA9IDEKKyAgICBlbHNlOgorICAgICAgICByZXNldCA9IDAKKyAgICBzaXRlZGlyLCBzaXRlZGlyY2FzZSA9IG1ha2VwYXRoKHNpdGVkaXIpCisgICAgaWYgbm90IHNpdGVkaXJjYXNlIGluIGtub3duX3BhdGhzOgorICAgICAgICBzeXMucGF0aC5hcHBlbmQoc2l0ZWRpcikgICAgICAgICMgQWRkIHBhdGggY29tcG9uZW50CisgICAgdHJ5OgorICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoc2l0ZWRpcikKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIHJldHVybgorICAgIGRvdHB0aCA9IG9zLmV4dHNlcCArICJwdGgiCisgICAgbmFtZXMgPSBbbmFtZSBmb3IgbmFtZSBpbiBuYW1lcyBpZiBuYW1lLmVuZHN3aXRoKGRvdHB0aCldCisgICAgZm9yIG5hbWUgaW4gc29ydGVkKG5hbWVzKToKKyAgICAgICAgYWRkcGFja2FnZShzaXRlZGlyLCBuYW1lLCBrbm93bl9wYXRocykKKyAgICBpZiByZXNldDoKKyAgICAgICAga25vd25fcGF0aHMgPSBOb25lCisgICAgcmV0dXJuIGtub3duX3BhdGhzCisKKworZGVmIGNoZWNrX2VuYWJsZXVzZXJzaXRlKCk6CisgICAgIiIiQ2hlY2sgaWYgdXNlciBzaXRlIGRpcmVjdG9yeSBpcyBzYWZlIGZvciBpbmNsdXNpb24KKworICAgIFRoZSBmdW5jdGlvbiB0ZXN0cyBmb3IgdGhlIGNvbW1hbmQgbGluZSBmbGFnIChpbmNsdWRpbmcgZW52aXJvbm1lbnQgdmFyKSwKKyAgICBwcm9jZXNzIHVpZC9naWQgZXF1YWwgdG8gZWZmZWN0aXZlIHVpZC9naWQuCisKKyAgICBOb25lOiBEaXNhYmxlZCBmb3Igc2VjdXJpdHkgcmVhc29ucworICAgIEZhbHNlOiBEaXNhYmxlZCBieSB1c2VyIChjb21tYW5kIGxpbmUgb3B0aW9uKQorICAgIFRydWU6IFNhZmUgYW5kIGVuYWJsZWQKKyAgICAiIiIKKyAgICBpZiBzeXMuZmxhZ3Mubm9fdXNlcl9zaXRlOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIGhhc2F0dHIob3MsICJnZXR1aWQiKSBhbmQgaGFzYXR0cihvcywgImdldGV1aWQiKToKKyAgICAgICAgIyBjaGVjayBwcm9jZXNzIHVpZCA9PSBlZmZlY3RpdmUgdWlkCisgICAgICAgIGlmIG9zLmdldGV1aWQoKSAhPSBvcy5nZXR1aWQoKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgaWYgaGFzYXR0cihvcywgImdldGdpZCIpIGFuZCBoYXNhdHRyKG9zLCAiZ2V0ZWdpZCIpOgorICAgICAgICAjIGNoZWNrIHByb2Nlc3MgZ2lkID09IGVmZmVjdGl2ZSBnaWQKKyAgICAgICAgaWYgb3MuZ2V0ZWdpZCgpICE9IG9zLmdldGdpZCgpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIHJldHVybiBUcnVlCisKK2RlZiBnZXR1c2VyYmFzZSgpOgorICAgICIiIlJldHVybnMgdGhlIGB1c2VyIGJhc2VgIGRpcmVjdG9yeSBwYXRoLgorCisgICAgVGhlIGB1c2VyIGJhc2VgIGRpcmVjdG9yeSBjYW4gYmUgdXNlZCB0byBzdG9yZSBkYXRhLiBJZiB0aGUgZ2xvYmFsCisgICAgdmFyaWFibGUgYGBVU0VSX0JBU0VgYCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyBzZXQKKyAgICBpdC4KKyAgICAiIiIKKyAgICBnbG9iYWwgVVNFUl9CQVNFCisgICAgaWYgVVNFUl9CQVNFIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gVVNFUl9CQVNFCisgICAgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9jb25maWdfdmFyCisgICAgVVNFUl9CQVNFID0gZ2V0X2NvbmZpZ192YXIoJ3VzZXJiYXNlJykKKyAgICByZXR1cm4gVVNFUl9CQVNFCisKK2RlZiBnZXR1c2Vyc2l0ZXBhY2thZ2VzKCk6CisgICAgIiIiUmV0dXJucyB0aGUgdXNlci1zcGVjaWZpYyBzaXRlLXBhY2thZ2VzIGRpcmVjdG9yeSBwYXRoLgorCisgICAgSWYgdGhlIGdsb2JhbCB2YXJpYWJsZSBgYFVTRVJfU0lURWBgIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQsIHRoaXMKKyAgICBmdW5jdGlvbiB3aWxsIGFsc28gc2V0IGl0LgorICAgICIiIgorICAgIGdsb2JhbCBVU0VSX1NJVEUKKyAgICB1c2VyX2Jhc2UgPSBnZXR1c2VyYmFzZSgpICMgdGhpcyB3aWxsIGFsc28gc2V0IFVTRVJfQkFTRQorCisgICAgaWYgVVNFUl9TSVRFIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gVVNFUl9TSVRFCisKKyAgICBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BhdGgKKyAgICBpbXBvcnQgb3MKKworICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9jb25maWdfdmFyCisgICAgICAgIGlmIGdldF9jb25maWdfdmFyKCdQWVRIT05GUkFNRVdPUksnKToKKyAgICAgICAgICAgIFVTRVJfU0lURSA9IGdldF9wYXRoKCdwdXJlbGliJywgJ29zeF9mcmFtZXdvcmtfdXNlcicpCisgICAgICAgICAgICByZXR1cm4gVVNFUl9TSVRFCisKKyAgICBVU0VSX1NJVEUgPSBnZXRfcGF0aCgncHVyZWxpYicsICclc191c2VyJyAlIG9zLm5hbWUpCisgICAgcmV0dXJuIFVTRVJfU0lURQorCitkZWYgYWRkdXNlcnNpdGVwYWNrYWdlcyhrbm93bl9wYXRocyk6CisgICAgIiIiQWRkIGEgcGVyIHVzZXIgc2l0ZS1wYWNrYWdlIHRvIHN5cy5wYXRoCisKKyAgICBFYWNoIHVzZXIgaGFzIGl0cyBvd24gcHl0aG9uIGRpcmVjdG9yeSB3aXRoIHNpdGUtcGFja2FnZXMgaW4gdGhlCisgICAgaG9tZSBkaXJlY3RvcnkuCisgICAgIiIiCisgICAgIyBnZXQgdGhlIHBlciB1c2VyIHNpdGUtcGFja2FnZSBwYXRoCisgICAgIyB0aGlzIGNhbGwgd2lsbCBhbHNvIG1ha2Ugc3VyZSBVU0VSX0JBU0UgYW5kIFVTRVJfU0lURSBhcmUgc2V0CisgICAgdXNlcl9zaXRlID0gZ2V0dXNlcnNpdGVwYWNrYWdlcygpCisKKyAgICBpZiBFTkFCTEVfVVNFUl9TSVRFIGFuZCBvcy5wYXRoLmlzZGlyKHVzZXJfc2l0ZSk6CisgICAgICAgIGFkZHNpdGVkaXIodXNlcl9zaXRlLCBrbm93bl9wYXRocykKKyAgICByZXR1cm4ga25vd25fcGF0aHMKKworZGVmIGdldHNpdGVwYWNrYWdlcygpOgorICAgICIiIlJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcgYWxsIGdsb2JhbCBzaXRlLXBhY2thZ2VzIGRpcmVjdG9yaWVzCisgICAgKGFuZCBwb3NzaWJseSBzaXRlLXB5dGhvbikuCisKKyAgICBGb3IgZWFjaCBkaXJlY3RvcnkgcHJlc2VudCBpbiB0aGUgZ2xvYmFsIGBgUFJFRklYRVNgYCwgdGhpcyBmdW5jdGlvbgorICAgIHdpbGwgZmluZCBpdHMgYHNpdGUtcGFja2FnZXNgIHN1YmRpcmVjdG9yeSBkZXBlbmRpbmcgb24gdGhlIHN5c3RlbQorICAgIGVudmlyb25tZW50LCBhbmQgd2lsbCByZXR1cm4gYSBsaXN0IG9mIGZ1bGwgcGF0aHMuCisgICAgIiIiCisgICAgc2l0ZXBhY2thZ2VzID0gW10KKyAgICBzZWVuID0gc2V0KCkKKworICAgIGZvciBwcmVmaXggaW4gUFJFRklYRVM6CisgICAgICAgIGlmIG5vdCBwcmVmaXggb3IgcHJlZml4IGluIHNlZW46CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBzZWVuLmFkZChwcmVmaXgpCisKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnb3MyZW14JywgJ3Jpc2NvcycpOgorICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZChvcy5wYXRoLmpvaW4ocHJlZml4LCAiTGliIiwgInNpdGUtcGFja2FnZXMiKSkKKyAgICAgICAgZWxpZiBvcy5zZXAgPT0gJy8nOgorICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZChvcy5wYXRoLmpvaW4ocHJlZml4LCAibGliIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uIiArIHN5cy52ZXJzaW9uWzozXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2l0ZS1wYWNrYWdlcyIpKQorICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZChvcy5wYXRoLmpvaW4ocHJlZml4LCAibGliIiwgInNpdGUtcHl0aG9uIikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaXRlcGFja2FnZXMuYXBwZW5kKHByZWZpeCkKKyAgICAgICAgICAgIHNpdGVwYWNrYWdlcy5hcHBlbmQob3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsICJzaXRlLXBhY2thZ2VzIikpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgICAgICMgZm9yIGZyYW1ld29yayBidWlsZHMgKm9ubHkqIHdlIGFkZCB0aGUgc3RhbmRhcmQgQXBwbGUKKyAgICAgICAgICAgICMgbG9jYXRpb25zLgorICAgICAgICAgICAgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9jb25maWdfdmFyCisgICAgICAgICAgICBmcmFtZXdvcmsgPSBnZXRfY29uZmlnX3ZhcigiUFlUSE9ORlJBTUVXT1JLIikKKyAgICAgICAgICAgIGlmIGZyYW1ld29yazoKKyAgICAgICAgICAgICAgICBzaXRlcGFja2FnZXMuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKCIvTGlicmFyeSIsIGZyYW1ld29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbls6M10sICJzaXRlLXBhY2thZ2VzIikpCisgICAgcmV0dXJuIHNpdGVwYWNrYWdlcworCitkZWYgYWRkc2l0ZXBhY2thZ2VzKGtub3duX3BhdGhzKToKKyAgICAiIiJBZGQgc2l0ZS1wYWNrYWdlcyAoYW5kIHBvc3NpYmx5IHNpdGUtcHl0aG9uKSB0byBzeXMucGF0aCIiIgorICAgIGZvciBzaXRlZGlyIGluIGdldHNpdGVwYWNrYWdlcygpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHNpdGVkaXIpOgorICAgICAgICAgICAgYWRkc2l0ZWRpcihzaXRlZGlyLCBrbm93bl9wYXRocykKKworICAgIHJldHVybiBrbm93bl9wYXRocworCitkZWYgc2V0QkVHSU5MSUJQQVRIKCk6CisgICAgIiIiVGhlIE9TLzIgRU1YIHBvcnQgaGFzIG9wdGlvbmFsIGV4dGVuc2lvbiBtb2R1bGVzIHRoYXQgZG8gZG91YmxlIGR1dHkKKyAgICBhcyBETExzIChhbmQgbXVzdCB1c2UgdGhlIC5ETEwgZmlsZSBleHRlbnNpb24pIGZvciBvdGhlciBleHRlbnNpb25zLgorICAgIFRoZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIG5lZWRzIHRvIGJlIGFtZW5kZWQgc28gdGhlc2Ugd2lsbCBiZSBmb3VuZAorICAgIGR1cmluZyBtb2R1bGUgaW1wb3J0LiAgVXNlIEJFR0lOTElCUEFUSCBzbyB0aGF0IHRoZXNlIGFyZSBhdCB0aGUgc3RhcnQKKyAgICBvZiB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aC4KKworICAgICIiIgorICAgIGRsbHBhdGggPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgIkxpYiIsICJsaWItZHlubG9hZCIpCisgICAgbGlicGF0aCA9IG9zLmVudmlyb25bJ0JFR0lOTElCUEFUSCddLnNwbGl0KCc7JykKKyAgICBpZiBsaWJwYXRoWy0xXToKKyAgICAgICAgbGlicGF0aC5hcHBlbmQoZGxscGF0aCkKKyAgICBlbHNlOgorICAgICAgICBsaWJwYXRoWy0xXSA9IGRsbHBhdGgKKyAgICBvcy5lbnZpcm9uWydCRUdJTkxJQlBBVEgnXSA9ICc7Jy5qb2luKGxpYnBhdGgpCisKKworZGVmIHNldHF1aXQoKToKKyAgICAiIiJEZWZpbmUgbmV3IGJ1aWx0aW5zICdxdWl0JyBhbmQgJ2V4aXQnLgorCisgICAgVGhlc2UgYXJlIG9iamVjdHMgd2hpY2ggbWFrZSB0aGUgaW50ZXJwcmV0ZXIgZXhpdCB3aGVuIGNhbGxlZC4KKyAgICBUaGUgcmVwciBvZiBlYWNoIG9iamVjdCBjb250YWlucyBhIGhpbnQgYXQgaG93IGl0IHdvcmtzLgorCisgICAgIiIiCisgICAgaWYgb3Muc2VwID09ICc6JzoKKyAgICAgICAgZW9mID0gJ0NtZC1RJworICAgIGVsaWYgb3Muc2VwID09ICdcXCc6CisgICAgICAgIGVvZiA9ICdDdHJsLVogcGx1cyBSZXR1cm4nCisgICAgZWxzZToKKyAgICAgICAgZW9mID0gJ0N0cmwtRCAoaS5lLiBFT0YpJworCisgICAgY2xhc3MgUXVpdHRlcihvYmplY3QpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAnVXNlICVzKCkgb3IgJXMgdG8gZXhpdCcgJSAoc2VsZi5uYW1lLCBlb2YpCisgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBjb2RlPU5vbmUpOgorICAgICAgICAgICAgIyBTaGVsbHMgbGlrZSBJRExFIGNhdGNoIHRoZSBTeXN0ZW1FeGl0LCBidXQgbGlzdGVuIHdoZW4gdGhlaXIKKyAgICAgICAgICAgICMgc3RkaW4gd3JhcHBlciBpcyBjbG9zZWQuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGluLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KGNvZGUpCisgICAgX19idWlsdGluX18ucXVpdCA9IFF1aXR0ZXIoJ3F1aXQnKQorICAgIF9fYnVpbHRpbl9fLmV4aXQgPSBRdWl0dGVyKCdleGl0JykKKworCitjbGFzcyBfUHJpbnRlcihvYmplY3QpOgorICAgICIiImludGVyYWN0aXZlIHByb21wdCBvYmplY3RzIGZvciBwcmludGluZyB0aGUgbGljZW5zZSB0ZXh0LCBhIGxpc3Qgb2YKKyAgICBjb250cmlidXRvcnMgYW5kIHRoZSBjb3B5cmlnaHQgbm90aWNlLiIiIgorCisgICAgTUFYTElORVMgPSAyMworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGRhdGEsIGZpbGVzPSgpLCBkaXJzPSgpKToKKyAgICAgICAgc2VsZi5fX25hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuX19kYXRhID0gZGF0YQorICAgICAgICBzZWxmLl9fZmlsZXMgPSBmaWxlcworICAgICAgICBzZWxmLl9fZGlycyA9IGRpcnMKKyAgICAgICAgc2VsZi5fX2xpbmVzID0gTm9uZQorCisgICAgZGVmIF9fc2V0dXAoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX19saW5lczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBkYXRhID0gTm9uZQorICAgICAgICBmb3IgZGlyIGluIHNlbGYuX19kaXJzOgorICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIHNlbGYuX19maWxlczoKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihkaXIsIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnAgPSBmaWxlKGZpbGVuYW1lLCAiclUiKQorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9fZGF0YQorICAgICAgICBzZWxmLl9fbGluZXMgPSBkYXRhLnNwbGl0KCdcbicpCisgICAgICAgIHNlbGYuX19saW5lY250ID0gbGVuKHNlbGYuX19saW5lcykKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fX3NldHVwKCkKKyAgICAgICAgaWYgbGVuKHNlbGYuX19saW5lcykgPD0gc2VsZi5NQVhMSU5FUzoKKyAgICAgICAgICAgIHJldHVybiAiXG4iLmpvaW4oc2VsZi5fX2xpbmVzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJUeXBlICVzKCkgdG8gc2VlIHRoZSBmdWxsICVzIHRleHQiICUgKChzZWxmLl9fbmFtZSwpKjIpCisKKyAgICBkZWYgX19jYWxsX18oc2VsZik6CisgICAgICAgIHNlbGYuX19zZXR1cCgpCisgICAgICAgIHByb21wdCA9ICdIaXQgUmV0dXJuIGZvciBtb3JlLCBvciBxIChhbmQgUmV0dXJuKSB0byBxdWl0OiAnCisgICAgICAgIGxpbmVubyA9IDAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsaW5lbm8sIGxpbmVubyArIHNlbGYuTUFYTElORVMpOgorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLl9fbGluZXNbaV0KKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpbmVubyArPSBzZWxmLk1BWExJTkVTCisgICAgICAgICAgICAgICAga2V5ID0gTm9uZQorICAgICAgICAgICAgICAgIHdoaWxlIGtleSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBrZXkgPSByYXdfaW5wdXQocHJvbXB0KQorICAgICAgICAgICAgICAgICAgICBpZiBrZXkgbm90IGluICgnJywgJ3EnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ3EnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCitkZWYgc2V0Y29weXJpZ2h0KCk6CisgICAgIiIiU2V0ICdjb3B5cmlnaHQnIGFuZCAnY3JlZGl0cycgaW4gX19idWlsdGluX18iIiIKKyAgICBfX2J1aWx0aW5fXy5jb3B5cmlnaHQgPSBfUHJpbnRlcigiY29weXJpZ2h0Iiwgc3lzLmNvcHlyaWdodCkKKyAgICBpZiBzeXMucGxhdGZvcm1bOjRdID09ICdqYXZhJzoKKyAgICAgICAgX19idWlsdGluX18uY3JlZGl0cyA9IF9QcmludGVyKAorICAgICAgICAgICAgImNyZWRpdHMiLAorICAgICAgICAgICAgIkp5dGhvbiBpcyBtYWludGFpbmVkIGJ5IHRoZSBKeXRob24gZGV2ZWxvcGVycyAod3d3Lmp5dGhvbi5vcmcpLiIpCisgICAgZWxzZToKKyAgICAgICAgX19idWlsdGluX18uY3JlZGl0cyA9IF9QcmludGVyKCJjcmVkaXRzIiwgIiIiXAorICAgIFRoYW5rcyB0byBDV0ksIENOUkksIEJlT3Blbi5jb20sIFpvcGUgQ29ycG9yYXRpb24gYW5kIGEgY2FzdCBvZiB0aG91c2FuZHMKKyAgICBmb3Igc3VwcG9ydGluZyBQeXRob24gZGV2ZWxvcG1lbnQuICBTZWUgd3d3LnB5dGhvbi5vcmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiIiKQorICAgIGhlcmUgPSBvcy5wYXRoLmRpcm5hbWUob3MuX19maWxlX18pCisgICAgX19idWlsdGluX18ubGljZW5zZSA9IF9QcmludGVyKAorICAgICAgICAibGljZW5zZSIsICJTZWUgaHR0cDovL3d3dy5weXRob24ub3JnLyUuM3MvbGljZW5zZS5odG1sIiAlIHN5cy52ZXJzaW9uLAorICAgICAgICBbIkxJQ0VOU0UudHh0IiwgIkxJQ0VOU0UiXSwKKyAgICAgICAgW29zLnBhdGguam9pbihoZXJlLCBvcy5wYXJkaXIpLCBoZXJlLCBvcy5jdXJkaXJdKQorCisKK2NsYXNzIF9IZWxwZXIob2JqZWN0KToKKyAgICAiIiJEZWZpbmUgdGhlIGJ1aWx0aW4gJ2hlbHAnLgorICAgIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCBweWRvYy5oZWxwICh3aXRoIGEgdHdpc3QpLgorCisgICAgIiIiCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiVHlwZSBoZWxwKCkgZm9yIGludGVyYWN0aXZlIGhlbHAsICIgXAorICAgICAgICAgICAgICAgIm9yIGhlbHAob2JqZWN0KSBmb3IgaGVscCBhYm91dCBvYmplY3QuIgorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgaW1wb3J0IHB5ZG9jCisgICAgICAgIHJldHVybiBweWRvYy5oZWxwKCphcmdzLCAqKmt3ZHMpCisKK2RlZiBzZXRoZWxwZXIoKToKKyAgICBfX2J1aWx0aW5fXy5oZWxwID0gX0hlbHBlcigpCisKK2RlZiBhbGlhc21iY3MoKToKKyAgICAiIiJPbiBXaW5kb3dzLCBzb21lIGRlZmF1bHQgZW5jb2RpbmdzIGFyZSBub3QgcHJvdmlkZWQgYnkgUHl0aG9uLAorICAgIHdoaWxlIHRoZXkgYXJlIGFsd2F5cyBhdmFpbGFibGUgYXMgIm1iY3MiIGluIGVhY2ggbG9jYWxlLiBNYWtlCisgICAgdGhlbSB1c2FibGUgYnkgYWxpYXNpbmcgdG8gIm1iY3MiIGluIHN1Y2ggYSBjYXNlLiIiIgorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICBpbXBvcnQgbG9jYWxlLCBjb2RlY3MKKyAgICAgICAgZW5jID0gbG9jYWxlLmdldGRlZmF1bHRsb2NhbGUoKVsxXQorICAgICAgICBpZiBlbmMuc3RhcnRzd2l0aCgnY3AnKTogICAgICAgICAgICAjICJjcCoqKiIgPworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvZGVjcy5sb29rdXAoZW5jKQorICAgICAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgICAgIGltcG9ydCBlbmNvZGluZ3MKKyAgICAgICAgICAgICAgICBlbmNvZGluZ3MuX2NhY2hlW2VuY10gPSBlbmNvZGluZ3MuX3Vua25vd24KKyAgICAgICAgICAgICAgICBlbmNvZGluZ3MuYWxpYXNlcy5hbGlhc2VzW2VuY10gPSAnbWJjcycKKworZGVmIHNldGVuY29kaW5nKCk6CisgICAgIiIiU2V0IHRoZSBzdHJpbmcgZW5jb2RpbmcgdXNlZCBieSB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbi4gIFRoZQorICAgIGRlZmF1bHQgaXMgJ2FzY2lpJywgYnV0IGlmIHlvdSdyZSB3aWxsaW5nIHRvIGV4cGVyaW1lbnQsIHlvdSBjYW4KKyAgICBjaGFuZ2UgdGhpcy4iIiIKKyAgICBlbmNvZGluZyA9ICJhc2NpaSIgIyBEZWZhdWx0IHZhbHVlIHNldCBieSBfUHlVbmljb2RlX0luaXQoKQorICAgIGlmIDA6CisgICAgICAgICMgRW5hYmxlIHRvIHN1cHBvcnQgbG9jYWxlIGF3YXJlIGRlZmF1bHQgc3RyaW5nIGVuY29kaW5ncy4KKyAgICAgICAgaW1wb3J0IGxvY2FsZQorICAgICAgICBsb2MgPSBsb2NhbGUuZ2V0ZGVmYXVsdGxvY2FsZSgpCisgICAgICAgIGlmIGxvY1sxXToKKyAgICAgICAgICAgIGVuY29kaW5nID0gbG9jWzFdCisgICAgaWYgMDoKKyAgICAgICAgIyBFbmFibGUgdG8gc3dpdGNoIG9mZiBzdHJpbmcgdG8gVW5pY29kZSBjb2VyY2lvbiBhbmQgaW1wbGljaXQKKyAgICAgICAgIyBVbmljb2RlIHRvIHN0cmluZyBjb252ZXJzaW9uLgorICAgICAgICBlbmNvZGluZyA9ICJ1bmRlZmluZWQiCisgICAgaWYgZW5jb2RpbmcgIT0gImFzY2lpIjoKKyAgICAgICAgIyBPbiBOb24tVW5pY29kZSBidWlsZHMgdGhpcyB3aWxsIHJhaXNlIGFuIEF0dHJpYnV0ZUVycm9yLi4uCisgICAgICAgIHN5cy5zZXRkZWZhdWx0ZW5jb2RpbmcoZW5jb2RpbmcpICMgTmVlZHMgUHl0aG9uIFVuaWNvZGUgYnVpbGQgIQorCisKK2RlZiBleGVjc2l0ZWN1c3RvbWl6ZSgpOgorICAgICIiIlJ1biBjdXN0b20gc2l0ZSBzcGVjaWZpYyBjb2RlLCBpZiBhdmFpbGFibGUuIiIiCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgc2l0ZWN1c3RvbWl6ZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIGlmIHN5cy5mbGFncy52ZXJib3NlOgorICAgICAgICAgICAgc3lzLmV4Y2VwdGhvb2soKnN5cy5leGNfaW5mbygpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCBcCisgICAgICAgICAgICAgICAgIidpbXBvcnQgc2l0ZWN1c3RvbWl6ZScgZmFpbGVkOyB1c2UgLXYgZm9yIHRyYWNlYmFjayIKKworCitkZWYgZXhlY3VzZXJjdXN0b21pemUoKToKKyAgICAiIiJSdW4gY3VzdG9tIHVzZXIgc3BlY2lmaWMgY29kZSwgaWYgYXZhaWxhYmxlLiIiIgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHVzZXJjdXN0b21pemUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBpZiBzeXMuZmxhZ3MudmVyYm9zZToKKyAgICAgICAgICAgIHN5cy5leGNlcHRob29rKCpzeXMuZXhjX2luZm8oKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50Pj5zeXMuc3RkZXJyLCBcCisgICAgICAgICAgICAgICAgIidpbXBvcnQgdXNlcmN1c3RvbWl6ZScgZmFpbGVkOyB1c2UgLXYgZm9yIHRyYWNlYmFjayIKKworCitkZWYgbWFpbigpOgorICAgIGdsb2JhbCBFTkFCTEVfVVNFUl9TSVRFCisKKyAgICBhYnNfX2ZpbGVfXygpCisgICAga25vd25fcGF0aHMgPSByZW1vdmVkdXBwYXRocygpCisgICAgaWYgRU5BQkxFX1VTRVJfU0lURSBpcyBOb25lOgorICAgICAgICBFTkFCTEVfVVNFUl9TSVRFID0gY2hlY2tfZW5hYmxldXNlcnNpdGUoKQorICAgIGtub3duX3BhdGhzID0gYWRkdXNlcnNpdGVwYWNrYWdlcyhrbm93bl9wYXRocykKKyAgICBrbm93bl9wYXRocyA9IGFkZHNpdGVwYWNrYWdlcyhrbm93bl9wYXRocykKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ29zMmVteCc6CisgICAgICAgIHNldEJFR0lOTElCUEFUSCgpCisgICAgc2V0cXVpdCgpCisgICAgc2V0Y29weXJpZ2h0KCkKKyAgICBzZXRoZWxwZXIoKQorICAgIGFsaWFzbWJjcygpCisgICAgc2V0ZW5jb2RpbmcoKQorICAgIGV4ZWNzaXRlY3VzdG9taXplKCkKKyAgICBpZiBFTkFCTEVfVVNFUl9TSVRFOgorICAgICAgICBleGVjdXNlcmN1c3RvbWl6ZSgpCisgICAgIyBSZW1vdmUgc3lzLnNldGRlZmF1bHRlbmNvZGluZygpIHNvIHRoYXQgdXNlcnMgY2Fubm90IGNoYW5nZSB0aGUKKyAgICAjIGVuY29kaW5nIGFmdGVyIGluaXRpYWxpemF0aW9uLiAgVGhlIHRlc3QgZm9yIHByZXNlbmNlIGlzIG5lZWRlZCB3aGVuCisgICAgIyB0aGlzIG1vZHVsZSBpcyBydW4gYXMgYSBzY3JpcHQsIGJlY2F1c2UgdGhpcyBjb2RlIGlzIGV4ZWN1dGVkIHR3aWNlLgorICAgIGlmIGhhc2F0dHIoc3lzLCAic2V0ZGVmYXVsdGVuY29kaW5nIik6CisgICAgICAgIGRlbCBzeXMuc2V0ZGVmYXVsdGVuY29kaW5nCisKK21haW4oKQorCitkZWYgX3NjcmlwdCgpOgorICAgIGhlbHAgPSAiIiJcCisgICAgJXMgWy0tdXNlci1iYXNlXSBbLS11c2VyLXNpdGVdCisKKyAgICBXaXRob3V0IGFyZ3VtZW50cyBwcmludCBzb21lIHVzZWZ1bCBpbmZvcm1hdGlvbgorICAgIFdpdGggYXJndW1lbnRzIHByaW50IHRoZSB2YWx1ZSBvZiBVU0VSX0JBU0UgYW5kL29yIFVTRVJfU0lURSBzZXBhcmF0ZWQKKyAgICBieSAnJXMnLgorCisgICAgRXhpdCBjb2RlcyB3aXRoIC0tdXNlci1iYXNlIG9yIC0tdXNlci1zaXRlOgorICAgICAgMCAtIHVzZXIgc2l0ZSBkaXJlY3RvcnkgaXMgZW5hYmxlZAorICAgICAgMSAtIHVzZXIgc2l0ZSBkaXJlY3RvcnkgaXMgZGlzYWJsZWQgYnkgdXNlcgorICAgICAgMiAtIHVzZXMgc2l0ZSBkaXJlY3RvcnkgaXMgZGlzYWJsZWQgYnkgc3VwZXIgdXNlcgorICAgICAgICAgIG9yIGZvciBzZWN1cml0eSByZWFzb25zCisgICAgID4yIC0gdW5rbm93biBlcnJvcgorICAgICIiIgorICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKyAgICBpZiBub3QgYXJnczoKKyAgICAgICAgcHJpbnQgInN5cy5wYXRoID0gWyIKKyAgICAgICAgZm9yIGRpciBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgIHByaW50ICIgICAgJXIsIiAlIChkaXIsKQorICAgICAgICBwcmludCAiXSIKKyAgICAgICAgcHJpbnQgIlVTRVJfQkFTRTogJXIgKCVzKSIgJSAoVVNFUl9CQVNFLAorICAgICAgICAgICAgImV4aXN0cyIgaWYgb3MucGF0aC5pc2RpcihVU0VSX0JBU0UpIGVsc2UgImRvZXNuJ3QgZXhpc3QiKQorICAgICAgICBwcmludCAiVVNFUl9TSVRFOiAlciAoJXMpIiAlIChVU0VSX1NJVEUsCisgICAgICAgICAgICAiZXhpc3RzIiBpZiBvcy5wYXRoLmlzZGlyKFVTRVJfU0lURSkgZWxzZSAiZG9lc24ndCBleGlzdCIpCisgICAgICAgIHByaW50ICJFTkFCTEVfVVNFUl9TSVRFOiAlciIgJSAgRU5BQkxFX1VTRVJfU0lURQorICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgYnVmZmVyID0gW10KKyAgICBpZiAnLS11c2VyLWJhc2UnIGluIGFyZ3M6CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoVVNFUl9CQVNFKQorICAgIGlmICctLXVzZXItc2l0ZScgaW4gYXJnczoKKyAgICAgICAgYnVmZmVyLmFwcGVuZChVU0VSX1NJVEUpCisKKyAgICBpZiBidWZmZXI6CisgICAgICAgIHByaW50IG9zLnBhdGhzZXAuam9pbihidWZmZXIpCisgICAgICAgIGlmIEVOQUJMRV9VU0VSX1NJVEU6CisgICAgICAgICAgICBzeXMuZXhpdCgwKQorICAgICAgICBlbGlmIEVOQUJMRV9VU0VSX1NJVEUgaXMgRmFsc2U6CisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICBlbGlmIEVOQUJMRV9VU0VSX1NJVEUgaXMgTm9uZToKKyAgICAgICAgICAgIHN5cy5leGl0KDIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzeXMuZXhpdCgzKQorICAgIGVsc2U6CisgICAgICAgIGltcG9ydCB0ZXh0d3JhcAorICAgICAgICBwcmludCB0ZXh0d3JhcC5kZWRlbnQoaGVscCAlIChzeXMuYXJndlswXSwgb3MucGF0aHNlcCkpCisgICAgICAgIHN5cy5leGl0KDEwKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF9zY3JpcHQoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zaXRlLnB5YyBiL2xpYi9weXRob24yLjcvc2l0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjZWMzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2l0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zaXRlLnB5byBiL2xpYi9weXRob24yLjcvc2l0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJjZWMzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2l0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zbXRwZC5weSBiL2xpYi9weXRob24yLjcvc210cGQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjRkMjA4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc210cGQucHkKQEAgLTAsMCArMSw1NTUgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIkFuIFJGQyAyODIxIHNtdHAgcHJveHkuCisKK1VzYWdlOiAlKHByb2dyYW0pcyBbb3B0aW9uc10gW2xvY2FsaG9zdDpsb2NhbHBvcnQgW3JlbW90ZWhvc3Q6cmVtb3RlcG9ydF1dCisKK09wdGlvbnM6CisKKyAgICAtLW5vc2V0dWlkCisgICAgLW4KKyAgICAgICAgVGhpcyBwcm9ncmFtIGdlbmVyYWxseSB0cmllcyB0byBzZXR1aWQgYG5vYm9keScsIHVubGVzcyB0aGlzIGZsYWcgaXMKKyAgICAgICAgc2V0LiAgVGhlIHNldHVpZCBjYWxsIHdpbGwgZmFpbCBpZiB0aGlzIHByb2dyYW0gaXMgbm90IHJ1biBhcyByb290IChpbgorICAgICAgICB3aGljaCBjYXNlLCB1c2UgdGhpcyBmbGFnKS4KKworICAgIC0tdmVyc2lvbgorICAgIC1WCisgICAgICAgIFByaW50IHRoZSB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdC4KKworICAgIC0tY2xhc3MgY2xhc3NuYW1lCisgICAgLWMgY2xhc3NuYW1lCisgICAgICAgIFVzZSBgY2xhc3NuYW1lJyBhcyB0aGUgY29uY3JldGUgU01UUCBwcm94eSBjbGFzcy4gIFVzZXMgYFB1cmVQcm94eScgYnkKKyAgICAgICAgZGVmYXVsdC4KKworICAgIC0tZGVidWcKKyAgICAtZAorICAgICAgICBUdXJuIG9uIGRlYnVnZ2luZyBwcmludHMuCisKKyAgICAtLWhlbHAKKyAgICAtaAorICAgICAgICBQcmludCB0aGlzIG1lc3NhZ2UgYW5kIGV4aXQuCisKK1ZlcnNpb246ICUoX192ZXJzaW9uX18pcworCitJZiBsb2NhbGhvc3QgaXMgbm90IGdpdmVuIHRoZW4gYGxvY2FsaG9zdCcgaXMgdXNlZCwgYW5kIGlmIGxvY2FscG9ydCBpcyBub3QKK2dpdmVuIHRoZW4gODAyNSBpcyB1c2VkLiAgSWYgcmVtb3RlaG9zdCBpcyBub3QgZ2l2ZW4gdGhlbiBgbG9jYWxob3N0JyBpcyB1c2VkLAorYW5kIGlmIHJlbW90ZXBvcnQgaXMgbm90IGdpdmVuLCB0aGVuIDI1IGlzIHVzZWQuCisiIiIKKworIyBPdmVydmlldzoKKyMKKyMgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIG1pbmltYWwgU01UUCBwcm90b2NvbCBhcyBkZWZpbmVkIGluIFJGQyA4MjEuICBJdAorIyBoYXMgYSBoaWVyYXJjaHkgb2YgY2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhlIGJhY2tlbmQgZnVuY3Rpb25hbGl0eSBmb3IgdGhlCisjIHNtdHBkLiAgQSBudW1iZXIgb2YgY2xhc3NlcyBhcmUgcHJvdmlkZWQ6CisjCisjICAgU01UUFNlcnZlciAtIHRoZSBiYXNlIGNsYXNzIGZvciB0aGUgYmFja2VuZC4gIFJhaXNlcyBOb3RJbXBsZW1lbnRlZEVycm9yCisjICAgaWYgeW91IHRyeSB0byB1c2UgaXQuCisjCisjICAgRGVidWdnaW5nU2VydmVyIC0gc2ltcGx5IHByaW50cyBlYWNoIG1lc3NhZ2UgaXQgcmVjZWl2ZXMgb24gc3Rkb3V0LgorIworIyAgIFB1cmVQcm94eSAtIFByb3hpZXMgYWxsIG1lc3NhZ2VzIHRvIGEgcmVhbCBzbXRwZCB3aGljaCBkb2VzIGZpbmFsCisjICAgZGVsaXZlcnkuICBPbmUga25vd24gcHJvYmxlbSB3aXRoIHRoaXMgY2xhc3MgaXMgdGhhdCBpdCBkb2Vzbid0IGhhbmRsZQorIyAgIFNNVFAgZXJyb3JzIGZyb20gdGhlIGJhY2tlbmQgc2VydmVyIGF0IGFsbC4gIFRoaXMgc2hvdWxkIGJlIGZpeGVkCisjICAgKGNvbnRyaWJ1dGlvbnMgYXJlIHdlbGNvbWUhKS4KKyMKKyMgICBNYWlsbWFuUHJveHkgLSBBbiBleHBlcmltZW50YWwgaGFjayB0byB3b3JrIHdpdGggR05VIE1haWxtYW4KKyMgICA8d3d3Lmxpc3Qub3JnPi4gIFVzaW5nIHRoaXMgc2VydmVyIGFzIHlvdXIgcmVhbCBpbmNvbWluZyBzbXRwZCwgeW91cgorIyAgIG1haWxob3N0IHdpbGwgYXV0b21hdGljYWxseSByZWNvZ25pemUgYW5kIGFjY2VwdCBtYWlsIGRlc3RpbmVkIHRvIE1haWxtYW4KKyMgICBsaXN0cyB3aGVuIHRob3NlIGxpc3RzIGFyZSBjcmVhdGVkLiAgRXZlcnkgbWVzc2FnZSBub3QgZGVzdGluZWQgZm9yIGEgbGlzdAorIyAgIGdldHMgZm9yd2FyZGVkIHRvIGEgcmVhbCBiYWNrZW5kIHNtdHBkLCBhcyB3aXRoIFB1cmVQcm94eS4gIEFnYWluLCBlcnJvcnMKKyMgICBhcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5IHlldC4KKyMKKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHNjcmlwdCByZXF1aXJlcyBQeXRob24gMi4wCisjCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3IDxiYXJyeUBweXRob24ub3JnPgorIworIyBUT0RPOgorIworIyAtIHN1cHBvcnQgbWFpbGJveCBkZWxpdmVyeQorIyAtIGFsaWFzIGZpbGVzCisjIC0gRVNNVFAKKyMgLSBoYW5kbGUgZXJyb3IgY29kZXMgZnJvbSB0aGUgYmFja2VuZCBzbXRwZAorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBlcnJubworaW1wb3J0IGdldG9wdAoraW1wb3J0IHRpbWUKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBhc3luY29yZQoraW1wb3J0IGFzeW5jaGF0CisKK19fYWxsX18gPSBbIlNNVFBTZXJ2ZXIiLCJEZWJ1Z2dpbmdTZXJ2ZXIiLCJQdXJlUHJveHkiLCJNYWlsbWFuUHJveHkiXQorCitwcm9ncmFtID0gc3lzLmFyZ3ZbMF0KK19fdmVyc2lvbl9fID0gJ1B5dGhvbiBTTVRQIHByb3h5IHZlcnNpb24gMC4yJworCisKK2NsYXNzIERldm51bGw6CisgICAgZGVmIHdyaXRlKHNlbGYsIG1zZyk6IHBhc3MKKyAgICBkZWYgZmx1c2goc2VsZik6IHBhc3MKKworCitERUJVR1NUUkVBTSA9IERldm51bGwoKQorTkVXTElORSA9ICdcbicKK0VNUFRZU1RSSU5HID0gJycKK0NPTU1BU1BBQ0UgPSAnLCAnCisKKworZGVmIHVzYWdlKGNvZGUsIG1zZz0nJyk6CisgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgX19kb2NfXyAlIGdsb2JhbHMoKQorICAgIGlmIG1zZzoKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgbXNnCisgICAgc3lzLmV4aXQoY29kZSkKKworCitjbGFzcyBTTVRQQ2hhbm5lbChhc3luY2hhdC5hc3luY19jaGF0KToKKyAgICBDT01NQU5EID0gMAorICAgIERBVEEgPSAxCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyLCBjb25uLCBhZGRyKToKKyAgICAgICAgYXN5bmNoYXQuYXN5bmNfY2hhdC5fX2luaXRfXyhzZWxmLCBjb25uKQorICAgICAgICBzZWxmLl9fc2VydmVyID0gc2VydmVyCisgICAgICAgIHNlbGYuX19jb25uID0gY29ubgorICAgICAgICBzZWxmLl9fYWRkciA9IGFkZHIKKyAgICAgICAgc2VsZi5fX2xpbmUgPSBbXQorICAgICAgICBzZWxmLl9fc3RhdGUgPSBzZWxmLkNPTU1BTkQKKyAgICAgICAgc2VsZi5fX2dyZWV0aW5nID0gMAorICAgICAgICBzZWxmLl9fbWFpbGZyb20gPSBOb25lCisgICAgICAgIHNlbGYuX19yY3B0dG9zID0gW10KKyAgICAgICAgc2VsZi5fX2RhdGEgPSAnJworICAgICAgICBzZWxmLl9fZnFkbiA9IHNvY2tldC5nZXRmcWRuKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fX3BlZXIgPSBjb25uLmdldHBlZXJuYW1lKCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgorICAgICAgICAgICAgIyBhIHJhY2UgY29uZGl0aW9uICBtYXkgb2NjdXIgaWYgdGhlIG90aGVyIGVuZCBpcyBjbG9zaW5nCisgICAgICAgICAgICAjIGJlZm9yZSB3ZSBjYW4gZ2V0IHRoZSBwZWVybmFtZQorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICBpZiBlcnJbMF0gIT0gZXJybm8uRU5PVENPTk46CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ1BlZXI6JywgcmVwcihzZWxmLl9fcGVlcikKKyAgICAgICAgc2VsZi5wdXNoKCcyMjAgJXMgJXMnICUgKHNlbGYuX19mcWRuLCBfX3ZlcnNpb25fXykpCisgICAgICAgIHNlbGYuc2V0X3Rlcm1pbmF0b3IoJ1xyXG4nKQorCisgICAgIyBPdmVycmlkZXMgYmFzZSBjbGFzcyBmb3IgY29udmVuaWVuY2UKKyAgICBkZWYgcHVzaChzZWxmLCBtc2cpOgorICAgICAgICBhc3luY2hhdC5hc3luY19jaGF0LnB1c2goc2VsZiwgbXNnICsgJ1xyXG4nKQorCisgICAgIyBJbXBsZW1lbnRhdGlvbiBvZiBiYXNlIGNsYXNzIGFic3RyYWN0IG1ldGhvZAorICAgIGRlZiBjb2xsZWN0X2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX19saW5lLmFwcGVuZChkYXRhKQorCisgICAgIyBJbXBsZW1lbnRhdGlvbiBvZiBiYXNlIGNsYXNzIGFic3RyYWN0IG1ldGhvZAorICAgIGRlZiBmb3VuZF90ZXJtaW5hdG9yKHNlbGYpOgorICAgICAgICBsaW5lID0gRU1QVFlTVFJJTkcuam9pbihzZWxmLl9fbGluZSkKKyAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICdEYXRhOicsIHJlcHIobGluZSkKKyAgICAgICAgc2VsZi5fX2xpbmUgPSBbXQorICAgICAgICBpZiBzZWxmLl9fc3RhdGUgPT0gc2VsZi5DT01NQU5EOgorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDAgRXJyb3I6IGJhZCBzeW50YXgnKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgbWV0aG9kID0gTm9uZQorICAgICAgICAgICAgaSA9IGxpbmUuZmluZCgnICcpCisgICAgICAgICAgICBpZiBpIDwgMDoKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gbGluZS51cHBlcigpCisgICAgICAgICAgICAgICAgYXJnID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gbGluZVs6aV0udXBwZXIoKQorICAgICAgICAgICAgICAgIGFyZyA9IGxpbmVbaSsxOl0uc3RyaXAoKQorICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLCAnc210cF8nICsgY29tbWFuZCwgTm9uZSkKKyAgICAgICAgICAgIGlmIG5vdCBtZXRob2Q6CisgICAgICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDIgRXJyb3I6IGNvbW1hbmQgIiVzIiBub3QgaW1wbGVtZW50ZWQnICUgY29tbWFuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG1ldGhvZChhcmcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuX19zdGF0ZSAhPSBzZWxmLkRBVEE6CisgICAgICAgICAgICAgICAgc2VsZi5wdXNoKCc0NTEgSW50ZXJuYWwgY29uZnVzaW9uJykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICMgUmVtb3ZlIGV4dHJhbmVvdXMgY2FycmlhZ2UgcmV0dXJucyBhbmQgZGUtdHJhbnNwYXJlbmN5IGFjY29yZGluZworICAgICAgICAgICAgIyB0byBSRkMgODIxLCBTZWN0aW9uIDQuNS4yLgorICAgICAgICAgICAgZGF0YSA9IFtdCisgICAgICAgICAgICBmb3IgdGV4dCBpbiBsaW5lLnNwbGl0KCdcclxuJyk6CisgICAgICAgICAgICAgICAgaWYgdGV4dCBhbmQgdGV4dFswXSA9PSAnLic6CisgICAgICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKHRleHRbMTpdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKHRleHQpCisgICAgICAgICAgICBzZWxmLl9fZGF0YSA9IE5FV0xJTkUuam9pbihkYXRhKQorICAgICAgICAgICAgc3RhdHVzID0gc2VsZi5fX3NlcnZlci5wcm9jZXNzX21lc3NhZ2Uoc2VsZi5fX3BlZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fbWFpbGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fcmNwdHRvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19kYXRhKQorICAgICAgICAgICAgc2VsZi5fX3JjcHR0b3MgPSBbXQorICAgICAgICAgICAgc2VsZi5fX21haWxmcm9tID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fX3N0YXRlID0gc2VsZi5DT01NQU5ECisgICAgICAgICAgICBzZWxmLnNldF90ZXJtaW5hdG9yKCdcclxuJykKKyAgICAgICAgICAgIGlmIG5vdCBzdGF0dXM6CisgICAgICAgICAgICAgICAgc2VsZi5wdXNoKCcyNTAgT2snKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnB1c2goc3RhdHVzKQorCisgICAgIyBTTVRQIGFuZCBFU01UUCBjb21tYW5kcworICAgIGRlZiBzbXRwX0hFTE8oc2VsZiwgYXJnKToKKyAgICAgICAgaWYgbm90IGFyZzoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAxIFN5bnRheDogSEVMTyBob3N0bmFtZScpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fX2dyZWV0aW5nOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDMgRHVwbGljYXRlIEhFTE8vRUhMTycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fZ3JlZXRpbmcgPSBhcmcKKyAgICAgICAgICAgIHNlbGYucHVzaCgnMjUwICVzJyAlIHNlbGYuX19mcWRuKQorCisgICAgZGVmIHNtdHBfTk9PUChzZWxmLCBhcmcpOgorICAgICAgICBpZiBhcmc6CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMSBTeW50YXg6IE5PT1AnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wdXNoKCcyNTAgT2snKQorCisgICAgZGVmIHNtdHBfUVVJVChzZWxmLCBhcmcpOgorICAgICAgICAjIGFyZ3MgaXMgaWdub3JlZAorICAgICAgICBzZWxmLnB1c2goJzIyMSBCeWUnKQorICAgICAgICBzZWxmLmNsb3NlX3doZW5fZG9uZSgpCisKKyAgICAjIGZhY3RvcmVkCisgICAgZGVmIF9fZ2V0YWRkcihzZWxmLCBrZXl3b3JkLCBhcmcpOgorICAgICAgICBhZGRyZXNzID0gTm9uZQorICAgICAgICBrZXlsZW4gPSBsZW4oa2V5d29yZCkKKyAgICAgICAgaWYgYXJnWzprZXlsZW5dLnVwcGVyKCkgPT0ga2V5d29yZDoKKyAgICAgICAgICAgIGFkZHJlc3MgPSBhcmdba2V5bGVuOl0uc3RyaXAoKQorICAgICAgICAgICAgaWYgbm90IGFkZHJlc3M6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZiBhZGRyZXNzWzBdID09ICc8JyBhbmQgYWRkcmVzc1stMV0gPT0gJz4nIGFuZCBhZGRyZXNzICE9ICc8Pic6CisgICAgICAgICAgICAgICAgIyBBZGRyZXNzZXMgY2FuIGJlIGluIHRoZSBmb3JtIDxwZXJzb25AZG9tLmNvbT4gYnV0IHdhdGNoIG91dAorICAgICAgICAgICAgICAgICMgZm9yIG51bGwgYWRkcmVzcywgZS5nLiA8PgorICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzWzE6LTFdCisgICAgICAgIHJldHVybiBhZGRyZXNzCisKKyAgICBkZWYgc210cF9NQUlMKHNlbGYsIGFyZyk6CisgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnPT09PiBNQUlMJywgYXJnCisgICAgICAgIGFkZHJlc3MgPSBzZWxmLl9fZ2V0YWRkcignRlJPTTonLCBhcmcpIGlmIGFyZyBlbHNlIE5vbmUKKyAgICAgICAgaWYgbm90IGFkZHJlc3M6CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMSBTeW50YXg6IE1BSUwgRlJPTTo8YWRkcmVzcz4nKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuX19tYWlsZnJvbToKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAzIEVycm9yOiBuZXN0ZWQgTUFJTCBjb21tYW5kJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9fbWFpbGZyb20gPSBhZGRyZXNzCisgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnc2VuZGVyOicsIHNlbGYuX19tYWlsZnJvbQorICAgICAgICBzZWxmLnB1c2goJzI1MCBPaycpCisKKyAgICBkZWYgc210cF9SQ1BUKHNlbGYsIGFyZyk6CisgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnPT09PiBSQ1BUJywgYXJnCisgICAgICAgIGlmIG5vdCBzZWxmLl9fbWFpbGZyb206CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMyBFcnJvcjogbmVlZCBNQUlMIGNvbW1hbmQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGFkZHJlc3MgPSBzZWxmLl9fZ2V0YWRkcignVE86JywgYXJnKSBpZiBhcmcgZWxzZSBOb25lCisgICAgICAgIGlmIG5vdCBhZGRyZXNzOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDEgU3ludGF4OiBSQ1BUIFRPOiA8YWRkcmVzcz4nKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX19yY3B0dG9zLmFwcGVuZChhZGRyZXNzKQorICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ3JlY2lwczonLCBzZWxmLl9fcmNwdHRvcworICAgICAgICBzZWxmLnB1c2goJzI1MCBPaycpCisKKyAgICBkZWYgc210cF9SU0VUKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIGFyZzoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAxIFN5bnRheDogUlNFVCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBSZXNldHMgdGhlIHNlbmRlciwgcmVjaXBpZW50cywgYW5kIGRhdGEsIGJ1dCBub3QgdGhlIGdyZWV0aW5nCisgICAgICAgIHNlbGYuX19tYWlsZnJvbSA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3JjcHR0b3MgPSBbXQorICAgICAgICBzZWxmLl9fZGF0YSA9ICcnCisgICAgICAgIHNlbGYuX19zdGF0ZSA9IHNlbGYuQ09NTUFORAorICAgICAgICBzZWxmLnB1c2goJzI1MCBPaycpCisKKyAgICBkZWYgc210cF9EQVRBKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9fcmNwdHRvczoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAzIEVycm9yOiBuZWVkIFJDUFQgY29tbWFuZCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgYXJnOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDEgU3ludGF4OiBEQVRBJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9fc3RhdGUgPSBzZWxmLkRBVEEKKyAgICAgICAgc2VsZi5zZXRfdGVybWluYXRvcignXHJcbi5cclxuJykKKyAgICAgICAgc2VsZi5wdXNoKCczNTQgRW5kIGRhdGEgd2l0aCA8Q1I+PExGPi48Q1I+PExGPicpCisKKworY2xhc3MgU01UUFNlcnZlcihhc3luY29yZS5kaXNwYXRjaGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jYWxhZGRyLCByZW1vdGVhZGRyKToKKyAgICAgICAgc2VsZi5fbG9jYWxhZGRyID0gbG9jYWxhZGRyCisgICAgICAgIHNlbGYuX3JlbW90ZWFkZHIgPSByZW1vdGVhZGRyCisgICAgICAgIGFzeW5jb3JlLmRpc3BhdGNoZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jcmVhdGVfc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICAgICAjIHRyeSB0byByZS11c2UgYSBzZXJ2ZXIgcG9ydCBpZiBwb3NzaWJsZQorICAgICAgICAgICAgc2VsZi5zZXRfcmV1c2VfYWRkcigpCisgICAgICAgICAgICBzZWxmLmJpbmQobG9jYWxhZGRyKQorICAgICAgICAgICAgc2VsZi5saXN0ZW4oNSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgIyBjbGVhbnVwIGFzeW5jb3JlLnNvY2tldF9tYXAgYmVmb3JlIHJhaXNpbmcKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCBcCisgICAgICAgICAgICAgICAgICAnJXMgc3RhcnRlZCBhdCAlc1xuXHRMb2NhbCBhZGRyOiAlc1xuXHRSZW1vdGUgYWRkcjolcycgJSAoCisgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHRpbWUuY3RpbWUodGltZS50aW1lKCkpLAorICAgICAgICAgICAgICAgIGxvY2FsYWRkciwgcmVtb3RlYWRkcikKKworICAgIGRlZiBoYW5kbGVfYWNjZXB0KHNlbGYpOgorICAgICAgICBwYWlyID0gc2VsZi5hY2NlcHQoKQorICAgICAgICBpZiBwYWlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29ubiwgYWRkciA9IHBhaXIKKyAgICAgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnSW5jb21pbmcgY29ubmVjdGlvbiBmcm9tICVzJyAlIHJlcHIoYWRkcikKKyAgICAgICAgICAgIGNoYW5uZWwgPSBTTVRQQ2hhbm5lbChzZWxmLCBjb25uLCBhZGRyKQorCisgICAgIyBBUEkgZm9yICJkb2luZyBzb21ldGhpbmcgdXNlZnVsIHdpdGggdGhlIG1lc3NhZ2UiCisgICAgZGVmIHByb2Nlc3NfbWVzc2FnZShzZWxmLCBwZWVyLCBtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSk6CisgICAgICAgICIiIk92ZXJyaWRlIHRoaXMgYWJzdHJhY3QgbWV0aG9kIHRvIGhhbmRsZSBtZXNzYWdlcyBmcm9tIHRoZSBjbGllbnQuCisKKyAgICAgICAgcGVlciBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgKGlwYWRkciwgcG9ydCkgb2YgdGhlIGNsaWVudCB0aGF0IG1hZGUgdGhlCisgICAgICAgIHNvY2tldCBjb25uZWN0aW9uIHRvIG91ciBzbXRwIHBvcnQuCisKKyAgICAgICAgbWFpbGZyb20gaXMgdGhlIHJhdyBhZGRyZXNzIHRoZSBjbGllbnQgY2xhaW1zIHRoZSBtZXNzYWdlIGlzIGNvbWluZworICAgICAgICBmcm9tLgorCisgICAgICAgIHJjcHR0b3MgaXMgYSBsaXN0IG9mIHJhdyBhZGRyZXNzZXMgdGhlIGNsaWVudCB3aXNoZXMgdG8gZGVsaXZlciB0aGUKKyAgICAgICAgbWVzc2FnZSB0by4KKworICAgICAgICBkYXRhIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVudGlyZSBmdWxsIHRleHQgb2YgdGhlIG1lc3NhZ2UsCisgICAgICAgIGhlYWRlcnMgKGlmIHN1cHBsaWVkKSBhbmQgYWxsLiAgSXQgaGFzIGJlZW4gYGRlLXRyYW5zcGFyZW5jaWVkJworICAgICAgICBhY2NvcmRpbmcgdG8gUkZDIDgyMSwgU2VjdGlvbiA0LjUuMi4gIEluIG90aGVyIHdvcmRzLCBhIGxpbmUKKyAgICAgICAgY29udGFpbmluZyBhIGAuJyBmb2xsb3dlZCBieSBvdGhlciB0ZXh0IGhhcyBoYWQgdGhlIGxlYWRpbmcgZG90CisgICAgICAgIHJlbW92ZWQuCisKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIE5vbmUsIGZvciBhIG5vcm1hbCBgMjUwIE9rJyByZXNwb25zZTsKKyAgICAgICAgb3RoZXJ3aXNlIGl0IHJldHVybnMgdGhlIGRlc2lyZWQgcmVzcG9uc2Ugc3RyaW5nIGluIFJGQyA4MjEgZm9ybWF0LgorCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworY2xhc3MgRGVidWdnaW5nU2VydmVyKFNNVFBTZXJ2ZXIpOgorICAgICMgRG8gc29tZXRoaW5nIHdpdGggdGhlIGdhdGhlcmVkIG1lc3NhZ2UKKyAgICBkZWYgcHJvY2Vzc19tZXNzYWdlKHNlbGYsIHBlZXIsIG1haWxmcm9tLCByY3B0dG9zLCBkYXRhKToKKyAgICAgICAgaW5oZWFkZXJzID0gMQorICAgICAgICBsaW5lcyA9IGRhdGEuc3BsaXQoJ1xuJykKKyAgICAgICAgcHJpbnQgJy0tLS0tLS0tLS0gTUVTU0FHRSBGT0xMT1dTIC0tLS0tLS0tLS0nCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgIyBoZWFkZXJzIGZpcnN0CisgICAgICAgICAgICBpZiBpbmhlYWRlcnMgYW5kIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHByaW50ICdYLVBlZXI6JywgcGVlclswXQorICAgICAgICAgICAgICAgIGluaGVhZGVycyA9IDAKKyAgICAgICAgICAgIHByaW50IGxpbmUKKyAgICAgICAgcHJpbnQgJy0tLS0tLS0tLS0tLSBFTkQgTUVTU0FHRSAtLS0tLS0tLS0tLS0nCisKKworY2xhc3MgUHVyZVByb3h5KFNNVFBTZXJ2ZXIpOgorICAgIGRlZiBwcm9jZXNzX21lc3NhZ2Uoc2VsZiwgcGVlciwgbWFpbGZyb20sIHJjcHR0b3MsIGRhdGEpOgorICAgICAgICBsaW5lcyA9IGRhdGEuc3BsaXQoJ1xuJykKKyAgICAgICAgIyBMb29rIGZvciB0aGUgbGFzdCBoZWFkZXIKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaSArPSAxCisgICAgICAgIGxpbmVzLmluc2VydChpLCAnWC1QZWVyOiAlcycgJSBwZWVyWzBdKQorICAgICAgICBkYXRhID0gTkVXTElORS5qb2luKGxpbmVzKQorICAgICAgICByZWZ1c2VkID0gc2VsZi5fZGVsaXZlcihtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSkKKyAgICAgICAgIyBUQkQ6IHdoYXQgdG8gZG8gd2l0aCByZWZ1c2VkIGFkZHJlc3Nlcz8KKyAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICd3ZSBnb3Qgc29tZSByZWZ1c2FsczonLCByZWZ1c2VkCisKKyAgICBkZWYgX2RlbGl2ZXIoc2VsZiwgbWFpbGZyb20sIHJjcHR0b3MsIGRhdGEpOgorICAgICAgICBpbXBvcnQgc210cGxpYgorICAgICAgICByZWZ1c2VkID0ge30KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcyA9IHNtdHBsaWIuU01UUCgpCisgICAgICAgICAgICBzLmNvbm5lY3Qoc2VsZi5fcmVtb3RlYWRkclswXSwgc2VsZi5fcmVtb3RlYWRkclsxXSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWZ1c2VkID0gcy5zZW5kbWFpbChtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5xdWl0KCkKKyAgICAgICAgZXhjZXB0IHNtdHBsaWIuU01UUFJlY2lwaWVudHNSZWZ1c2VkLCBlOgorICAgICAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICdnb3QgU01UUFJlY2lwaWVudHNSZWZ1c2VkJworICAgICAgICAgICAgcmVmdXNlZCA9IGUucmVjaXBpZW50cworICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgc210cGxpYi5TTVRQRXhjZXB0aW9uKSwgZToKKyAgICAgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnZ290JywgZS5fX2NsYXNzX18KKyAgICAgICAgICAgICMgQWxsIHJlY2lwaWVudHMgd2VyZSByZWZ1c2VkLiAgSWYgdGhlIGV4Y2VwdGlvbiBoYWQgYW4gYXNzb2NpYXRlZAorICAgICAgICAgICAgIyBlcnJvciBjb2RlLCB1c2UgaXQuICBPdGhlcndpc2UsZmFrZSBpdCB3aXRoIGEgbm9uLXRyaWdnZXJpbmcKKyAgICAgICAgICAgICMgZXhjZXB0aW9uIGNvZGUuCisgICAgICAgICAgICBlcnJjb2RlID0gZ2V0YXR0cihlLCAnc210cF9jb2RlJywgLTEpCisgICAgICAgICAgICBlcnJtc2cgPSBnZXRhdHRyKGUsICdzbXRwX2Vycm9yJywgJ2lnbm9yZScpCisgICAgICAgICAgICBmb3IgciBpbiByY3B0dG9zOgorICAgICAgICAgICAgICAgIHJlZnVzZWRbcl0gPSAoZXJyY29kZSwgZXJybXNnKQorICAgICAgICByZXR1cm4gcmVmdXNlZAorCisKK2NsYXNzIE1haWxtYW5Qcm94eShQdXJlUHJveHkpOgorICAgIGRlZiBwcm9jZXNzX21lc3NhZ2Uoc2VsZiwgcGVlciwgbWFpbGZyb20sIHJjcHR0b3MsIGRhdGEpOgorICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgZnJvbSBNYWlsbWFuIGltcG9ydCBVdGlscworICAgICAgICBmcm9tIE1haWxtYW4gaW1wb3J0IE1lc3NhZ2UKKyAgICAgICAgZnJvbSBNYWlsbWFuIGltcG9ydCBNYWlsTGlzdAorICAgICAgICAjIElmIHRoZSBtZXNzYWdlIGlzIHRvIGEgTWFpbG1hbiBtYWlsaW5nIGxpc3QsIHRoZW4gd2UnbGwgaW52b2tlIHRoZQorICAgICAgICAjIE1haWxtYW4gc2NyaXB0IGRpcmVjdGx5LCB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIHJlYWwgc210cGQuCisgICAgICAgICMgT3RoZXJ3aXNlIHdlJ2xsIGZvcndhcmQgaXQgdG8gdGhlIGxvY2FsIHByb3h5IGZvciBkaXNwb3NpdGlvbi4KKyAgICAgICAgbGlzdG5hbWVzID0gW10KKyAgICAgICAgZm9yIHJjcHQgaW4gcmNwdHRvczoKKyAgICAgICAgICAgIGxvY2FsID0gcmNwdC5sb3dlcigpLnNwbGl0KCdAJylbMF0KKyAgICAgICAgICAgICMgV2UgYWxsb3cgdGhlIGZvbGxvd2luZyB2YXJpYXRpb25zIG9uIHRoZSB0aGVtZQorICAgICAgICAgICAgIyAgIGxpc3RuYW1lCisgICAgICAgICAgICAjICAgbGlzdG5hbWUtYWRtaW4KKyAgICAgICAgICAgICMgICBsaXN0bmFtZS1vd25lcgorICAgICAgICAgICAgIyAgIGxpc3RuYW1lLXJlcXVlc3QKKyAgICAgICAgICAgICMgICBsaXN0bmFtZS1qb2luCisgICAgICAgICAgICAjICAgbGlzdG5hbWUtbGVhdmUKKyAgICAgICAgICAgIHBhcnRzID0gbG9jYWwuc3BsaXQoJy0nKQorICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA+IDI6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxpc3RuYW1lID0gcGFydHNbMF0KKyAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMjoKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gcGFydHNbMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29tbWFuZCA9ICcnCisgICAgICAgICAgICBpZiBub3QgVXRpbHMubGlzdF9leGlzdHMobGlzdG5hbWUpIG9yIGNvbW1hbmQgbm90IGluICgKKyAgICAgICAgICAgICAgICAgICAgJycsICdhZG1pbicsICdvd25lcicsICdyZXF1ZXN0JywgJ2pvaW4nLCAnbGVhdmUnKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbGlzdG5hbWVzLmFwcGVuZCgocmNwdCwgbGlzdG5hbWUsIGNvbW1hbmQpKQorICAgICAgICAjIFJlbW92ZSBhbGwgbGlzdCByZWNpcGllbnRzIGZyb20gcmNwdHRvcyBhbmQgZm9yd2FyZCB3aGF0IHdlJ3JlIG5vdAorICAgICAgICAjIGdvaW5nIHRvIHRha2UgY2FyZSBvZiBvdXJzZWx2ZXMuICBMaW5lYXIgcmVtb3ZhbCBzaG91bGQgYmUgZmluZQorICAgICAgICAjIHNpbmNlIHdlIGRvbid0IGV4cGVjdCBhIGxhcmdlIG51bWJlciBvZiByZWNpcGllbnRzLgorICAgICAgICBmb3IgcmNwdCwgbGlzdG5hbWUsIGNvbW1hbmQgaW4gbGlzdG5hbWVzOgorICAgICAgICAgICAgcmNwdHRvcy5yZW1vdmUocmNwdCkKKyAgICAgICAgIyBJZiB0aGVyZSdzIGFueSBub24tbGlzdCBkZXN0aW5lZCByZWNpcGllbnRzIGxlZnQsCisgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnZm9yd2FyZGluZyByZWNpcHM6JywgJyAnLmpvaW4ocmNwdHRvcykKKyAgICAgICAgaWYgcmNwdHRvczoKKyAgICAgICAgICAgIHJlZnVzZWQgPSBzZWxmLl9kZWxpdmVyKG1haWxmcm9tLCByY3B0dG9zLCBkYXRhKQorICAgICAgICAgICAgIyBUQkQ6IHdoYXQgdG8gZG8gd2l0aCByZWZ1c2VkIGFkZHJlc3Nlcz8KKyAgICAgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnd2UgZ290IHJlZnVzYWxzOicsIHJlZnVzZWQKKyAgICAgICAgIyBOb3cgZGVsaXZlciBkaXJlY3RseSB0byB0aGUgbGlzdCBjb21tYW5kcworICAgICAgICBtbGlzdHMgPSB7fQorICAgICAgICBzID0gU3RyaW5nSU8oZGF0YSkKKyAgICAgICAgbXNnID0gTWVzc2FnZS5NZXNzYWdlKHMpCisgICAgICAgICMgVGhlc2UgaGVhZGVycyBhcmUgcmVxdWlyZWQgZm9yIHRoZSBwcm9wZXIgZXhlY3V0aW9uIG9mIE1haWxtYW4uICBBbGwKKyAgICAgICAgIyBNVEFzIGluIGV4aXN0ZW5jZSBzZWVtIHRvIGFkZCB0aGVzZSBpZiB0aGUgb3JpZ2luYWwgbWVzc2FnZSBkb2Vzbid0CisgICAgICAgICMgaGF2ZSB0aGVtLgorICAgICAgICBpZiBub3QgbXNnLmdldGhlYWRlcignZnJvbScpOgorICAgICAgICAgICAgbXNnWydGcm9tJ10gPSBtYWlsZnJvbQorICAgICAgICBpZiBub3QgbXNnLmdldGhlYWRlcignZGF0ZScpOgorICAgICAgICAgICAgbXNnWydEYXRlJ10gPSB0aW1lLmN0aW1lKHRpbWUudGltZSgpKQorICAgICAgICBmb3IgcmNwdCwgbGlzdG5hbWUsIGNvbW1hbmQgaW4gbGlzdG5hbWVzOgorICAgICAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICdzZW5kaW5nIG1lc3NhZ2UgdG8nLCByY3B0CisgICAgICAgICAgICBtbGlzdCA9IG1saXN0cy5nZXQobGlzdG5hbWUpCisgICAgICAgICAgICBpZiBub3QgbWxpc3Q6CisgICAgICAgICAgICAgICAgbWxpc3QgPSBNYWlsTGlzdC5NYWlsTGlzdChsaXN0bmFtZSwgbG9jaz0wKQorICAgICAgICAgICAgICAgIG1saXN0c1tsaXN0bmFtZV0gPSBtbGlzdAorICAgICAgICAgICAgIyBkaXNwYXRjaCBvbiB0aGUgdHlwZSBvZiBjb21tYW5kCisgICAgICAgICAgICBpZiBjb21tYW5kID09ICcnOgorICAgICAgICAgICAgICAgICMgcG9zdAorICAgICAgICAgICAgICAgIG1zZy5FbnF1ZXVlKG1saXN0LCB0b2xpc3Q9MSkKKyAgICAgICAgICAgIGVsaWYgY29tbWFuZCA9PSAnYWRtaW4nOgorICAgICAgICAgICAgICAgIG1zZy5FbnF1ZXVlKG1saXN0LCB0b2FkbWluPTEpCisgICAgICAgICAgICBlbGlmIGNvbW1hbmQgPT0gJ293bmVyJzoKKyAgICAgICAgICAgICAgICBtc2cuRW5xdWV1ZShtbGlzdCwgdG9vd25lcj0xKQorICAgICAgICAgICAgZWxpZiBjb21tYW5kID09ICdyZXF1ZXN0JzoKKyAgICAgICAgICAgICAgICBtc2cuRW5xdWV1ZShtbGlzdCwgdG9yZXF1ZXN0PTEpCisgICAgICAgICAgICBlbGlmIGNvbW1hbmQgaW4gKCdqb2luJywgJ2xlYXZlJyk6CisgICAgICAgICAgICAgICAgIyBUQkQ6IHRoaXMgaXMgYSBoYWNrIQorICAgICAgICAgICAgICAgIGlmIGNvbW1hbmQgPT0gJ2pvaW4nOgorICAgICAgICAgICAgICAgICAgICBtc2dbJ1N1YmplY3QnXSA9ICdzdWJzY3JpYmUnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbXNnWydTdWJqZWN0J10gPSAndW5zdWJzY3JpYmUnCisgICAgICAgICAgICAgICAgbXNnLkVucXVldWUobWxpc3QsIHRvcmVxdWVzdD0xKQorCisKK2NsYXNzIE9wdGlvbnM6CisgICAgc2V0dWlkID0gMQorICAgIGNsYXNzbmFtZSA9ICdQdXJlUHJveHknCisKKworZGVmIHBhcnNlYXJncygpOgorICAgIGdsb2JhbCBERUJVR1NUUkVBTQorICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoCisgICAgICAgICAgICBzeXMuYXJndlsxOl0sICduVmhjOmQnLAorICAgICAgICAgICAgWydjbGFzcz0nLCAnbm9zZXR1aWQnLCAndmVyc2lvbicsICdoZWxwJywgJ2RlYnVnJ10pCisgICAgZXhjZXB0IGdldG9wdC5lcnJvciwgZToKKyAgICAgICAgdXNhZ2UoMSwgZSkKKworICAgIG9wdGlvbnMgPSBPcHRpb25zKCkKKyAgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKKyAgICAgICAgaWYgb3B0IGluICgnLWgnLCAnLS1oZWxwJyk6CisgICAgICAgICAgICB1c2FnZSgwKQorICAgICAgICBlbGlmIG9wdCBpbiAoJy1WJywgJy0tdmVyc2lvbicpOgorICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgX192ZXJzaW9uX18KKyAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgICAgIGVsaWYgb3B0IGluICgnLW4nLCAnLS1ub3NldHVpZCcpOgorICAgICAgICAgICAgb3B0aW9ucy5zZXR1aWQgPSAwCisgICAgICAgIGVsaWYgb3B0IGluICgnLWMnLCAnLS1jbGFzcycpOgorICAgICAgICAgICAgb3B0aW9ucy5jbGFzc25hbWUgPSBhcmcKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctZCcsICctLWRlYnVnJyk6CisgICAgICAgICAgICBERUJVR1NUUkVBTSA9IHN5cy5zdGRlcnIKKworICAgICMgcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIGFyZ3VtZW50cworICAgIGlmIGxlbihhcmdzKSA8IDE6CisgICAgICAgIGxvY2Fsc3BlYyA9ICdsb2NhbGhvc3Q6ODAyNScKKyAgICAgICAgcmVtb3Rlc3BlYyA9ICdsb2NhbGhvc3Q6MjUnCisgICAgZWxpZiBsZW4oYXJncykgPCAyOgorICAgICAgICBsb2NhbHNwZWMgPSBhcmdzWzBdCisgICAgICAgIHJlbW90ZXNwZWMgPSAnbG9jYWxob3N0OjI1JworICAgIGVsaWYgbGVuKGFyZ3MpIDwgMzoKKyAgICAgICAgbG9jYWxzcGVjID0gYXJnc1swXQorICAgICAgICByZW1vdGVzcGVjID0gYXJnc1sxXQorICAgIGVsc2U6CisgICAgICAgIHVzYWdlKDEsICdJbnZhbGlkIGFyZ3VtZW50czogJXMnICUgQ09NTUFTUEFDRS5qb2luKGFyZ3MpKQorCisgICAgIyBzcGxpdCBpbnRvIGhvc3QvcG9ydCBwYWlycworICAgIGkgPSBsb2NhbHNwZWMuZmluZCgnOicpCisgICAgaWYgaSA8IDA6CisgICAgICAgIHVzYWdlKDEsICdCYWQgbG9jYWwgc3BlYzogJXMnICUgbG9jYWxzcGVjKQorICAgIG9wdGlvbnMubG9jYWxob3N0ID0gbG9jYWxzcGVjWzppXQorICAgIHRyeToKKyAgICAgICAgb3B0aW9ucy5sb2NhbHBvcnQgPSBpbnQobG9jYWxzcGVjW2krMTpdKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICB1c2FnZSgxLCAnQmFkIGxvY2FsIHBvcnQ6ICVzJyAlIGxvY2Fsc3BlYykKKyAgICBpID0gcmVtb3Rlc3BlYy5maW5kKCc6JykKKyAgICBpZiBpIDwgMDoKKyAgICAgICAgdXNhZ2UoMSwgJ0JhZCByZW1vdGUgc3BlYzogJXMnICUgcmVtb3Rlc3BlYykKKyAgICBvcHRpb25zLnJlbW90ZWhvc3QgPSByZW1vdGVzcGVjWzppXQorICAgIHRyeToKKyAgICAgICAgb3B0aW9ucy5yZW1vdGVwb3J0ID0gaW50KHJlbW90ZXNwZWNbaSsxOl0pCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHVzYWdlKDEsICdCYWQgcmVtb3RlIHBvcnQ6ICVzJyAlIHJlbW90ZXNwZWMpCisgICAgcmV0dXJuIG9wdGlvbnMKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG9wdGlvbnMgPSBwYXJzZWFyZ3MoKQorICAgICMgQmVjb21lIG5vYm9keQorICAgIGNsYXNzbmFtZSA9IG9wdGlvbnMuY2xhc3NuYW1lCisgICAgaWYgIi4iIGluIGNsYXNzbmFtZToKKyAgICAgICAgbGFzdGRvdCA9IGNsYXNzbmFtZS5yZmluZCgiLiIpCisgICAgICAgIG1vZCA9IF9faW1wb3J0X18oY2xhc3NuYW1lWzpsYXN0ZG90XSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWyIiXSkKKyAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lW2xhc3Rkb3QrMTpdCisgICAgZWxzZToKKyAgICAgICAgaW1wb3J0IF9fbWFpbl9fIGFzIG1vZAorICAgIGNsYXNzXyA9IGdldGF0dHIobW9kLCBjbGFzc25hbWUpCisgICAgcHJveHkgPSBjbGFzc18oKG9wdGlvbnMubG9jYWxob3N0LCBvcHRpb25zLmxvY2FscG9ydCksCisgICAgICAgICAgICAgICAgICAgKG9wdGlvbnMucmVtb3RlaG9zdCwgb3B0aW9ucy5yZW1vdGVwb3J0KSkKKyAgICBpZiBvcHRpb25zLnNldHVpZDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHB3ZAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBcCisgICAgICAgICAgICAgICAgICAnQ2Fubm90IGltcG9ydCBtb2R1bGUgInB3ZCI7IHRyeSBydW5uaW5nIHdpdGggLW4gb3B0aW9uLicKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIG5vYm9keSA9IHB3ZC5nZXRwd25hbSgnbm9ib2R5JylbMl0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3Muc2V0dWlkKG5vYm9keSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVQRVJNOiByYWlzZQorICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgXAorICAgICAgICAgICAgICAgICAgJ0Nhbm5vdCBzZXR1aWQgIm5vYm9keSI7IHRyeSBydW5uaW5nIHdpdGggLW4gb3B0aW9uLicKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgdHJ5OgorICAgICAgICBhc3luY29yZS5sb29wKCkKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc210cGQucHljIGIvbGliL3B5dGhvbjIuNy9zbXRwZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRhMzc0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc210cGQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc210cGQucHlvIGIvbGliL3B5dGhvbjIuNy9zbXRwZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRhMzc0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc210cGQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc210cGxpYi5weSBiL2xpYi9weXRob24yLjcvc210cGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMzIxM2IzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zbXRwbGliLnB5CkBAIC0wLDAgKzEsODU4IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKycnJ1NNVFAvRVNNVFAgY2xpZW50IGNsYXNzLgorCitUaGlzIHNob3VsZCBmb2xsb3cgUkZDIDgyMSAoU01UUCksIFJGQyAxODY5IChFU01UUCksIFJGQyAyNTU0IChTTVRQCitBdXRoZW50aWNhdGlvbikgYW5kIFJGQyAyNDg3IChTZWN1cmUgU01UUCBvdmVyIFRMUykuCisKK05vdGVzOgorCitQbGVhc2UgcmVtZW1iZXIsIHdoZW4gZG9pbmcgRVNNVFAsIHRoYXQgdGhlIG5hbWVzIG9mIHRoZSBTTVRQIHNlcnZpY2UKK2V4dGVuc2lvbnMgYXJlIE5PVCB0aGUgc2FtZSB0aGluZyBhcyB0aGUgb3B0aW9uIGtleXdvcmRzIGZvciB0aGUgUkNQVAorYW5kIE1BSUwgY29tbWFuZHMhCisKK0V4YW1wbGU6CisKKyAgPj4+IGltcG9ydCBzbXRwbGliCisgID4+PiBzPXNtdHBsaWIuU01UUCgibG9jYWxob3N0IikKKyAgPj4+IHByaW50IHMuaGVscCgpCisgIFRoaXMgaXMgU2VuZG1haWwgdmVyc2lvbiA4LjguNAorICBUb3BpY3M6CisgICAgICBIRUxPICAgIEVITE8gICAgTUFJTCAgICBSQ1BUICAgIERBVEEKKyAgICAgIFJTRVQgICAgTk9PUCAgICBRVUlUICAgIEhFTFAgICAgVlJGWQorICAgICAgRVhQTiAgICBWRVJCICAgIEVUUk4gICAgRFNOCisgIEZvciBtb3JlIGluZm8gdXNlICJIRUxQIDx0b3BpYz4iLgorICBUbyByZXBvcnQgYnVncyBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VuZCBlbWFpbCB0bworICAgICAgc2VuZG1haWwtYnVnc0BzZW5kbWFpbC5vcmcuCisgIEZvciBsb2NhbCBpbmZvcm1hdGlvbiBzZW5kIGVtYWlsIHRvIFBvc3RtYXN0ZXIgYXQgeW91ciBzaXRlLgorICBFbmQgb2YgSEVMUCBpbmZvCisgID4+PiBzLnB1dGNtZCgidnJmeSIsInNvbWVvbmVAaGVyZSIpCisgID4+PiBzLmdldHJlcGx5KCkKKyAgKDI1MCwgIlNvbWVib2R5IE92ZXJIZXJlIDxzb21lYm9keUBoZXJlLm15Lm9yZz4iKQorICA+Pj4gcy5xdWl0KCkKKycnJworCisjIEF1dGhvcjogVGhlIERyYWdvbiBEZSBNb25zeW5lIDxkcmFnb25kbUBpbnRlZ3JhbC5vcmc+CisjIEVTTVRQIHN1cHBvcnQsIHRlc3QgY29kZSBhbmQgZG9jIGZpeGVzIGFkZGVkIGJ5CisjICAgICBFcmljIFMuIFJheW1vbmQgPGVzckB0aHlyc3VzLmNvbT4KKyMgQmV0dGVyIFJGQyA4MjEgY29tcGxpYW5jZSAoTUFJTCBhbmQgUkNQVCwgYW5kIENSTEYgaW4gZGF0YSkKKyMgICAgIGJ5IENhcmV5IEV2YW5zIDxjLmV2YW5zQGNsZWFyLm5ldC5uej4sIGZvciBwaWNreSBtYWlsIHNlcnZlcnMuCisjIFJGQyAyNTU0IChhdXRoZW50aWNhdGlvbikgc3VwcG9ydCBieSBHZXJoYXJkIEhhZXJpbmcgPGdlcmhhcmRAYmlnZm9vdC5kZT4uCisjCisjIFRoaXMgd2FzIG1vZGlmaWVkIGZyb20gdGhlIFB5dGhvbiAxLjUgbGlicmFyeSBIVFRQIGxpYi4KKworaW1wb3J0IHNvY2tldAoraW1wb3J0IHJlCitpbXBvcnQgZW1haWwudXRpbHMKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCBobWFjCitmcm9tIGVtYWlsLmJhc2U2NG1pbWUgaW1wb3J0IGVuY29kZSBhcyBlbmNvZGVfYmFzZTY0Citmcm9tIHN5cyBpbXBvcnQgc3RkZXJyCisKK19fYWxsX18gPSBbIlNNVFBFeGNlcHRpb24iLCAiU01UUFNlcnZlckRpc2Nvbm5lY3RlZCIsICJTTVRQUmVzcG9uc2VFeGNlcHRpb24iLAorICAgICAgICAgICAiU01UUFNlbmRlclJlZnVzZWQiLCAiU01UUFJlY2lwaWVudHNSZWZ1c2VkIiwgIlNNVFBEYXRhRXJyb3IiLAorICAgICAgICAgICAiU01UUENvbm5lY3RFcnJvciIsICJTTVRQSGVsb0Vycm9yIiwgIlNNVFBBdXRoZW50aWNhdGlvbkVycm9yIiwKKyAgICAgICAgICAgInF1b3RlYWRkciIsICJxdW90ZWRhdGEiLCAiU01UUCJdCisKK1NNVFBfUE9SVCA9IDI1CitTTVRQX1NTTF9QT1JUID0gNDY1CitDUkxGID0gIlxyXG4iCisKK09MRFNUWUxFX0FVVEggPSByZS5jb21waWxlKHIiYXV0aD0oLiopIiwgcmUuSSkKKworCisjIEV4Y2VwdGlvbiBjbGFzc2VzIHVzZWQgYnkgdGhpcyBtb2R1bGUuCitjbGFzcyBTTVRQRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIGV4Y2VwdGlvbnMgcmFpc2VkIGJ5IHRoaXMgbW9kdWxlLiIiIgorCitjbGFzcyBTTVRQU2VydmVyRGlzY29ubmVjdGVkKFNNVFBFeGNlcHRpb24pOgorICAgICIiIk5vdCBjb25uZWN0ZWQgdG8gYW55IFNNVFAgc2VydmVyLgorCisgICAgVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gdGhlIHNlcnZlciB1bmV4cGVjdGVkbHkgZGlzY29ubmVjdHMsCisgICAgb3Igd2hlbiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdXNlIHRoZSBTTVRQIGluc3RhbmNlIGJlZm9yZQorICAgIGNvbm5lY3RpbmcgaXQgdG8gYSBzZXJ2ZXIuCisgICAgIiIiCisKK2NsYXNzIFNNVFBSZXNwb25zZUV4Y2VwdGlvbihTTVRQRXhjZXB0aW9uKToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBhbGwgZXhjZXB0aW9ucyB0aGF0IGluY2x1ZGUgYW4gU01UUCBlcnJvciBjb2RlLgorCisgICAgVGhlc2UgZXhjZXB0aW9ucyBhcmUgZ2VuZXJhdGVkIGluIHNvbWUgaW5zdGFuY2VzIHdoZW4gdGhlIFNNVFAKKyAgICBzZXJ2ZXIgcmV0dXJucyBhbiBlcnJvciBjb2RlLiAgVGhlIGVycm9yIGNvZGUgaXMgc3RvcmVkIGluIHRoZQorICAgIGBzbXRwX2NvZGUnIGF0dHJpYnV0ZSBvZiB0aGUgZXJyb3IsIGFuZCB0aGUgYHNtdHBfZXJyb3InIGF0dHJpYnV0ZQorICAgIGlzIHNldCB0byB0aGUgZXJyb3IgbWVzc2FnZS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2RlLCBtc2cpOgorICAgICAgICBzZWxmLnNtdHBfY29kZSA9IGNvZGUKKyAgICAgICAgc2VsZi5zbXRwX2Vycm9yID0gbXNnCisgICAgICAgIHNlbGYuYXJncyA9IChjb2RlLCBtc2cpCisKK2NsYXNzIFNNVFBTZW5kZXJSZWZ1c2VkKFNNVFBSZXNwb25zZUV4Y2VwdGlvbik6CisgICAgIiIiU2VuZGVyIGFkZHJlc3MgcmVmdXNlZC4KKworICAgIEluIGFkZGl0aW9uIHRvIHRoZSBhdHRyaWJ1dGVzIHNldCBieSBvbiBhbGwgU01UUFJlc3BvbnNlRXhjZXB0aW9uCisgICAgZXhjZXB0aW9ucywgdGhpcyBzZXRzIGBzZW5kZXInIHRvIHRoZSBzdHJpbmcgdGhhdCB0aGUgU01UUCByZWZ1c2VkLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvZGUsIG1zZywgc2VuZGVyKToKKyAgICAgICAgc2VsZi5zbXRwX2NvZGUgPSBjb2RlCisgICAgICAgIHNlbGYuc210cF9lcnJvciA9IG1zZworICAgICAgICBzZWxmLnNlbmRlciA9IHNlbmRlcgorICAgICAgICBzZWxmLmFyZ3MgPSAoY29kZSwgbXNnLCBzZW5kZXIpCisKK2NsYXNzIFNNVFBSZWNpcGllbnRzUmVmdXNlZChTTVRQRXhjZXB0aW9uKToKKyAgICAiIiJBbGwgcmVjaXBpZW50IGFkZHJlc3NlcyByZWZ1c2VkLgorCisgICAgVGhlIGVycm9ycyBmb3IgZWFjaCByZWNpcGllbnQgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgYXR0cmlidXRlCisgICAgJ3JlY2lwaWVudHMnLCB3aGljaCBpcyBhIGRpY3Rpb25hcnkgb2YgZXhhY3RseSB0aGUgc2FtZSBzb3J0IGFzCisgICAgU01UUC5zZW5kbWFpbCgpIHJldHVybnMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVjaXBpZW50cyk6CisgICAgICAgIHNlbGYucmVjaXBpZW50cyA9IHJlY2lwaWVudHMKKyAgICAgICAgc2VsZi5hcmdzID0gKHJlY2lwaWVudHMsKQorCisKK2NsYXNzIFNNVFBEYXRhRXJyb3IoU01UUFJlc3BvbnNlRXhjZXB0aW9uKToKKyAgICAiIiJUaGUgU01UUCBzZXJ2ZXIgZGlkbid0IGFjY2VwdCB0aGUgZGF0YS4iIiIKKworY2xhc3MgU01UUENvbm5lY3RFcnJvcihTTVRQUmVzcG9uc2VFeGNlcHRpb24pOgorICAgICIiIkVycm9yIGR1cmluZyBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQuIiIiCisKK2NsYXNzIFNNVFBIZWxvRXJyb3IoU01UUFJlc3BvbnNlRXhjZXB0aW9uKToKKyAgICAiIiJUaGUgc2VydmVyIHJlZnVzZWQgb3VyIEhFTE8gcmVwbHkuIiIiCisKK2NsYXNzIFNNVFBBdXRoZW50aWNhdGlvbkVycm9yKFNNVFBSZXNwb25zZUV4Y2VwdGlvbik6CisgICAgIiIiQXV0aGVudGljYXRpb24gZXJyb3IuCisKKyAgICBNb3N0IHByb2JhYmx5IHRoZSBzZXJ2ZXIgZGlkbid0IGFjY2VwdCB0aGUgdXNlcm5hbWUvcGFzc3dvcmQKKyAgICBjb21iaW5hdGlvbiBwcm92aWRlZC4KKyAgICAiIiIKKworCitkZWYgcXVvdGVhZGRyKGFkZHIpOgorICAgICIiIlF1b3RlIGEgc3Vic2V0IG9mIHRoZSBlbWFpbCBhZGRyZXNzZXMgZGVmaW5lZCBieSBSRkMgODIxLgorCisgICAgU2hvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGFueXRoaW5nIHJmYzgyMi5wYXJzZWFkZHIgY2FuIGhhbmRsZS4KKyAgICAiIiIKKyAgICBtID0gKE5vbmUsIE5vbmUpCisgICAgdHJ5OgorICAgICAgICBtID0gZW1haWwudXRpbHMucGFyc2VhZGRyKGFkZHIpWzFdCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBwYXNzCisgICAgaWYgbSA9PSAoTm9uZSwgTm9uZSk6ICAjIEluZGljYXRlcyBwYXJzZSBmYWlsdXJlIG9yIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICMgc29tZXRoaW5nIHdlaXJkIGhlcmUuLiBwdW50IC1kZG0KKyAgICAgICAgcmV0dXJuICI8JXM+IiAlIGFkZHIKKyAgICBlbGlmIG0gaXMgTm9uZToKKyAgICAgICAgIyB0aGUgc2VuZGVyIHdhbnRzIGFuIGVtcHR5IHJldHVybiBhZGRyZXNzCisgICAgICAgIHJldHVybiAiPD4iCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICI8JXM+IiAlIG0KKworZGVmIF9hZGRyX29ubHkoYWRkcnN0cmluZyk6CisgICAgZGlzcGxheW5hbWUsIGFkZHIgPSBlbWFpbC51dGlscy5wYXJzZWFkZHIoYWRkcnN0cmluZykKKyAgICBpZiAoZGlzcGxheW5hbWUsIGFkZHIpID09ICgnJywgJycpOgorICAgICAgICAjIHBhcnNlYWRkciBjb3VsZG4ndCBwYXJzZSBpdCwgc28gdXNlIGl0IGFzIGlzLgorICAgICAgICByZXR1cm4gYWRkcnN0cmluZworICAgIHJldHVybiBhZGRyCisKK2RlZiBxdW90ZWRhdGEoZGF0YSk6CisgICAgIiIiUXVvdGUgZGF0YSBmb3IgZW1haWwuCisKKyAgICBEb3VibGUgbGVhZGluZyAnLicsIGFuZCBjaGFuZ2UgVW5peCBuZXdsaW5lICdcXG4nLCBvciBNYWMgJ1xccicgaW50bworICAgIEludGVybmV0IENSTEYgZW5kLW9mLWxpbmUuCisgICAgIiIiCisgICAgcmV0dXJuIHJlLnN1YihyJyg/bSleXC4nLCAnLi4nLAorICAgICAgICByZS5zdWIocicoPzpcclxufFxufFxyKD8hXG4pKScsIENSTEYsIGRhdGEpKQorCisKK3RyeToKKyAgICBpbXBvcnQgc3NsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX2hhdmVfc3NsID0gRmFsc2UKK2Vsc2U6CisgICAgY2xhc3MgU1NMRmFrZUZpbGU6CisgICAgICAgICIiIkEgZmFrZSBmaWxlIGxpa2Ugb2JqZWN0IHRoYXQgcmVhbGx5IHdyYXBzIGEgU1NMT2JqZWN0LgorCisgICAgICAgIEl0IG9ubHkgc3VwcG9ydHMgd2hhdCBpcyBuZWVkZWQgaW4gc210cGxpYi4KKyAgICAgICAgIiIiCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzc2xvYmopOgorICAgICAgICAgICAgc2VsZi5zc2xvYmogPSBzc2xvYmoKKworICAgICAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgICAgICBzdHIgPSAiIgorICAgICAgICAgICAgY2hyID0gTm9uZQorICAgICAgICAgICAgd2hpbGUgY2hyICE9ICJcbiI6CisgICAgICAgICAgICAgICAgY2hyID0gc2VsZi5zc2xvYmoucmVhZCgxKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjaHI6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc3RyICs9IGNocgorICAgICAgICAgICAgcmV0dXJuIHN0cgorCisgICAgICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgICAgIHBhc3MKKworICAgIF9oYXZlX3NzbCA9IFRydWUKKworY2xhc3MgU01UUDoKKyAgICAiIiJUaGlzIGNsYXNzIG1hbmFnZXMgYSBjb25uZWN0aW9uIHRvIGFuIFNNVFAgb3IgRVNNVFAgc2VydmVyLgorICAgIFNNVFAgT2JqZWN0czoKKyAgICAgICAgU01UUCBvYmplY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgorICAgICAgICAgICAgaGVsb19yZXNwCisgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbWVzc2FnZSBnaXZlbiBieSB0aGUgc2VydmVyIGluIHJlc3BvbnNlIHRvIHRoZQorICAgICAgICAgICAgICAgIG1vc3QgcmVjZW50IEhFTE8gY29tbWFuZC4KKworICAgICAgICAgICAgZWhsb19yZXNwCisgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgbWVzc2FnZSBnaXZlbiBieSB0aGUgc2VydmVyIGluIHJlc3BvbnNlIHRvIHRoZQorICAgICAgICAgICAgICAgIG1vc3QgcmVjZW50IEVITE8gY29tbWFuZC4gVGhpcyBpcyB1c3VhbGx5IG11bHRpbGluZS4KKworICAgICAgICAgICAgZG9lc19lc210cAorICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBUcnVlIHZhbHVlIF9hZnRlciB5b3UgZG8gYW4gRUhMTyBjb21tYW5kXywgaWYgdGhlCisgICAgICAgICAgICAgICAgc2VydmVyIHN1cHBvcnRzIEVTTVRQLgorCisgICAgICAgICAgICBlc210cF9mZWF0dXJlcworICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBkaWN0aW9uYXJ5LCB3aGljaCwgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyBFU01UUCwKKyAgICAgICAgICAgICAgICB3aWxsIF9hZnRlciB5b3UgZG8gYW4gRUhMTyBjb21tYW5kXywgY29udGFpbiB0aGUgbmFtZXMgb2YgdGhlCisgICAgICAgICAgICAgICAgU01UUCBzZXJ2aWNlIGV4dGVuc2lvbnMgdGhpcyBzZXJ2ZXIgc3VwcG9ydHMsIGFuZCB0aGVpcgorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgKGlmIGFueSkuCisKKyAgICAgICAgICAgICAgICBOb3RlLCBhbGwgZXh0ZW5zaW9uIG5hbWVzIGFyZSBtYXBwZWQgdG8gbG93ZXIgY2FzZSBpbiB0aGUKKyAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5LgorCisgICAgICAgIFNlZSBlYWNoIG1ldGhvZCdzIGRvY3N0cmluZ3MgZm9yIGRldGFpbHMuICBJbiBnZW5lcmFsLCB0aGVyZSBpcyBhCisgICAgICAgIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lIHRvIHBlcmZvcm0gZWFjaCBTTVRQIGNvbW1hbmQuICBUaGVyZSBpcyBhbHNvIGEKKyAgICAgICAgbWV0aG9kIGNhbGxlZCAnc2VuZG1haWwnIHRoYXQgd2lsbCBkbyBhbiBlbnRpcmUgbWFpbCB0cmFuc2FjdGlvbi4KKyAgICAgICAgIiIiCisgICAgZGVidWdsZXZlbCA9IDAKKyAgICBmaWxlID0gTm9uZQorICAgIGhlbG9fcmVzcCA9IE5vbmUKKyAgICBlaGxvX21zZyA9ICJlaGxvIgorICAgIGVobG9fcmVzcCA9IE5vbmUKKyAgICBkb2VzX2VzbXRwID0gMAorICAgIGRlZmF1bHRfcG9ydCA9IFNNVFBfUE9SVAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9JycsIHBvcnQ9MCwgbG9jYWxfaG9zdG5hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlLgorCisgICAgICAgIElmIHNwZWNpZmllZCwgYGhvc3QnIGlzIHRoZSBuYW1lIG9mIHRoZSByZW1vdGUgaG9zdCB0byB3aGljaCB0bworICAgICAgICBjb25uZWN0LiAgSWYgc3BlY2lmaWVkLCBgcG9ydCcgc3BlY2lmaWVzIHRoZSBwb3J0IHRvIHdoaWNoIHRvIGNvbm5lY3QuCisgICAgICAgIEJ5IGRlZmF1bHQsIHNtdHBsaWIuU01UUF9QT1JUIGlzIHVzZWQuICBJZiBhIGhvc3QgaXMgc3BlY2lmaWVkIHRoZQorICAgICAgICBjb25uZWN0IG1ldGhvZCBpcyBjYWxsZWQsIGFuZCBpZiBpdCByZXR1cm5zIGFueXRoaW5nIG90aGVyIHRoYW4KKyAgICAgICAgYSBzdWNjZXNzIGNvZGUgYW4gU01UUENvbm5lY3RFcnJvciBpcyByYWlzZWQuICBJZiBzcGVjaWZpZWQsCisgICAgICAgIGBsb2NhbF9ob3N0bmFtZWAgaXMgdXNlZCBhcyB0aGUgRlFETiBvZiB0aGUgbG9jYWwgaG9zdC4gIEJ5IGRlZmF1bHQsCisgICAgICAgIHRoZSBsb2NhbCBob3N0bmFtZSBpcyBmb3VuZCB1c2luZyBzb2NrZXQuZ2V0ZnFkbigpLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIHNlbGYuZXNtdHBfZmVhdHVyZXMgPSB7fQorICAgICAgICBpZiBob3N0OgorICAgICAgICAgICAgKGNvZGUsIG1zZykgPSBzZWxmLmNvbm5lY3QoaG9zdCwgcG9ydCkKKyAgICAgICAgICAgIGlmIGNvZGUgIT0gMjIwOgorICAgICAgICAgICAgICAgIHJhaXNlIFNNVFBDb25uZWN0RXJyb3IoY29kZSwgbXNnKQorICAgICAgICBpZiBsb2NhbF9ob3N0bmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYubG9jYWxfaG9zdG5hbWUgPSBsb2NhbF9ob3N0bmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBSRkMgMjgyMSBzYXlzIHdlIHNob3VsZCB1c2UgdGhlIGZxZG4gaW4gdGhlIEVITE8vSEVMTyB2ZXJiLCBhbmQKKyAgICAgICAgICAgICMgaWYgdGhhdCBjYW4ndCBiZSBjYWxjdWxhdGVkLCB0aGF0IHdlIHNob3VsZCB1c2UgYSBkb21haW4gbGl0ZXJhbAorICAgICAgICAgICAgIyBpbnN0ZWFkIChlc3NlbnRpYWxseSBhbiBlbmNvZGVkIElQIGFkZHJlc3MgbGlrZSBbQS5CLkMuRF0pLgorICAgICAgICAgICAgZnFkbiA9IHNvY2tldC5nZXRmcWRuKCkKKyAgICAgICAgICAgIGlmICcuJyBpbiBmcWRuOgorICAgICAgICAgICAgICAgIHNlbGYubG9jYWxfaG9zdG5hbWUgPSBmcWRuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgV2UgY2FuJ3QgZmluZCBhbiBmcWRuIGhvc3RuYW1lLCBzbyB1c2UgYSBkb21haW4gbGl0ZXJhbAorICAgICAgICAgICAgICAgIGFkZHIgPSAnMTI3LjAuMC4xJworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBzZWxmLmxvY2FsX2hvc3RuYW1lID0gJ1slc10nICUgYWRkcgorCisgICAgZGVmIHNldF9kZWJ1Z2xldmVsKHNlbGYsIGRlYnVnbGV2ZWwpOgorICAgICAgICAiIiJTZXQgdGhlIGRlYnVnIG91dHB1dCBsZXZlbC4KKworICAgICAgICBBIG5vbi1mYWxzZSB2YWx1ZSByZXN1bHRzIGluIGRlYnVnIG1lc3NhZ2VzIGZvciBjb25uZWN0aW9uIGFuZCBmb3IgYWxsCisgICAgICAgIG1lc3NhZ2VzIHNlbnQgdG8gYW5kIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlci4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5kZWJ1Z2xldmVsID0gZGVidWdsZXZlbAorCisgICAgZGVmIF9nZXRfc29ja2V0KHNlbGYsIGhvc3QsIHBvcnQsIHRpbWVvdXQpOgorICAgICAgICAjIFRoaXMgbWFrZXMgaXQgc2ltcGxlciBmb3IgU01UUF9TU0wgdG8gdXNlIHRoZSBTTVRQIGNvbm5lY3QgY29kZQorICAgICAgICAjIGFuZCBqdXN0IGFsdGVyIHRoZSBzb2NrZXQgY29ubmVjdGlvbiBiaXQuCisgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICBwcmludD4+c3RkZXJyLCAnY29ubmVjdDonLCAoaG9zdCwgcG9ydCkKKyAgICAgICAgcmV0dXJuIHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoaG9zdCwgcG9ydCksIHRpbWVvdXQpCisKKyAgICBkZWYgY29ubmVjdChzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTApOgorICAgICAgICAiIiJDb25uZWN0IHRvIGEgaG9zdCBvbiBhIGdpdmVuIHBvcnQuCisKKyAgICAgICAgSWYgdGhlIGhvc3RuYW1lIGVuZHMgd2l0aCBhIGNvbG9uIChgOicpIGZvbGxvd2VkIGJ5IGEgbnVtYmVyLCBhbmQKKyAgICAgICAgdGhlcmUgaXMgbm8gcG9ydCBzcGVjaWZpZWQsIHRoYXQgc3VmZml4IHdpbGwgYmUgc3RyaXBwZWQgb2ZmIGFuZCB0aGUKKyAgICAgICAgbnVtYmVyIGludGVycHJldGVkIGFzIHRoZSBwb3J0IG51bWJlciB0byB1c2UuCisKKyAgICAgICAgTm90ZTogVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBpbnZva2VkIGJ5IF9faW5pdF9fLCBpZiBhIGhvc3QgaXMKKyAgICAgICAgc3BlY2lmaWVkIGR1cmluZyBpbnN0YW50aWF0aW9uLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgcG9ydCBhbmQgKGhvc3QuZmluZCgnOicpID09IGhvc3QucmZpbmQoJzonKSk6CisgICAgICAgICAgICBpID0gaG9zdC5yZmluZCgnOicpCisgICAgICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICAgICAgaG9zdCwgcG9ydCA9IGhvc3RbOmldLCBob3N0W2kgKyAxOl0KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQocG9ydCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmVycm9yLCAibm9ubnVtZXJpYyBwb3J0IgorICAgICAgICBpZiBub3QgcG9ydDoKKyAgICAgICAgICAgIHBvcnQgPSBzZWxmLmRlZmF1bHRfcG9ydAorICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgcHJpbnQ+PnN0ZGVyciwgJ2Nvbm5lY3Q6JywgKGhvc3QsIHBvcnQpCisgICAgICAgIHNlbGYuc29jayA9IHNlbGYuX2dldF9zb2NrZXQoaG9zdCwgcG9ydCwgc2VsZi50aW1lb3V0KQorICAgICAgICAoY29kZSwgbXNnKSA9IHNlbGYuZ2V0cmVwbHkoKQorICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgcHJpbnQ+PnN0ZGVyciwgImNvbm5lY3Q6IiwgbXNnCisgICAgICAgIHJldHVybiAoY29kZSwgbXNnKQorCisgICAgZGVmIHNlbmQoc2VsZiwgc3RyKToKKyAgICAgICAgIiIiU2VuZCBgc3RyJyB0byB0aGUgc2VydmVyLiIiIgorICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgcHJpbnQ+PnN0ZGVyciwgJ3NlbmQ6JywgcmVwcihzdHIpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ3NvY2snKSBhbmQgc2VsZi5zb2NrOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc29jay5zZW5kYWxsKHN0cikKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmFpc2UgU01UUFNlcnZlckRpc2Nvbm5lY3RlZCgnU2VydmVyIG5vdCBjb25uZWN0ZWQnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU01UUFNlcnZlckRpc2Nvbm5lY3RlZCgncGxlYXNlIHJ1biBjb25uZWN0KCkgZmlyc3QnKQorCisgICAgZGVmIHB1dGNtZChzZWxmLCBjbWQsIGFyZ3M9IiIpOgorICAgICAgICAiIiJTZW5kIGEgY29tbWFuZCB0byB0aGUgc2VydmVyLiIiIgorICAgICAgICBpZiBhcmdzID09ICIiOgorICAgICAgICAgICAgc3RyID0gJyVzJXMnICUgKGNtZCwgQ1JMRikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0ciA9ICclcyAlcyVzJyAlIChjbWQsIGFyZ3MsIENSTEYpCisgICAgICAgIHNlbGYuc2VuZChzdHIpCisKKyAgICBkZWYgZ2V0cmVwbHkoc2VsZik6CisgICAgICAgICIiIkdldCBhIHJlcGx5IGZyb20gdGhlIHNlcnZlci4KKworICAgICAgICBSZXR1cm5zIGEgdHVwbGUgY29uc2lzdGluZyBvZjoKKworICAgICAgICAgIC0gc2VydmVyIHJlc3BvbnNlIGNvZGUgKGUuZy4gJzI1MCcsIG9yIHN1Y2gsIGlmIGFsbCBnb2VzIHdlbGwpCisgICAgICAgICAgICBOb3RlOiByZXR1cm5zIC0xIGlmIGl0IGNhbid0IHJlYWQgcmVzcG9uc2UgY29kZS4KKworICAgICAgICAgIC0gc2VydmVyIHJlc3BvbnNlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHJlc3BvbnNlIGNvZGUgKG11bHRpbGluZQorICAgICAgICAgICAgcmVzcG9uc2VzIGFyZSBjb252ZXJ0ZWQgdG8gYSBzaW5nbGUsIG11bHRpbGluZSBzdHJpbmcpLgorCisgICAgICAgIFJhaXNlcyBTTVRQU2VydmVyRGlzY29ubmVjdGVkIGlmIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQuCisgICAgICAgICIiIgorICAgICAgICByZXNwID0gW10KKyAgICAgICAgaWYgc2VsZi5maWxlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmZpbGUgPSBzZWxmLnNvY2subWFrZWZpbGUoJ3JiJykKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICByYWlzZSBTTVRQU2VydmVyRGlzY29ubmVjdGVkKCJDb25uZWN0aW9uIHVuZXhwZWN0ZWRseSBjbG9zZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RyKGUpKQorICAgICAgICAgICAgaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICByYWlzZSBTTVRQU2VydmVyRGlzY29ubmVjdGVkKCJDb25uZWN0aW9uIHVuZXhwZWN0ZWRseSBjbG9zZWQiKQorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgICAgICBwcmludD4+c3RkZXJyLCAncmVwbHk6JywgcmVwcihsaW5lKQorICAgICAgICAgICAgcmVzcC5hcHBlbmQobGluZVs0Ol0uc3RyaXAoKSkKKyAgICAgICAgICAgIGNvZGUgPSBsaW5lWzozXQorICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBlcnJvciBjb2RlIGlzIHN5bnRhY3RpY2FsbHkgY29ycmVjdC4KKyAgICAgICAgICAgICMgRG9uJ3QgYXR0ZW1wdCB0byByZWFkIGEgY29udGludWF0aW9uIGxpbmUgaWYgaXQgaXMgYnJva2VuLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGVycmNvZGUgPSBpbnQoY29kZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGVycmNvZGUgPSAtMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAjIENoZWNrIGlmIG11bHRpbGluZSByZXNwb25zZS4KKyAgICAgICAgICAgIGlmIGxpbmVbMzo0XSAhPSAiLSI6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBlcnJtc2cgPSAiXG4iLmpvaW4ocmVzcCkKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgIHByaW50Pj5zdGRlcnIsICdyZXBseTogcmV0Y29kZSAoJXMpOyBNc2c6ICVzJyAlIChlcnJjb2RlLCBlcnJtc2cpCisgICAgICAgIHJldHVybiBlcnJjb2RlLCBlcnJtc2cKKworICAgIGRlZiBkb2NtZChzZWxmLCBjbWQsIGFyZ3M9IiIpOgorICAgICAgICAiIiJTZW5kIGEgY29tbWFuZCwgYW5kIHJldHVybiBpdHMgcmVzcG9uc2UgY29kZS4iIiIKKyAgICAgICAgc2VsZi5wdXRjbWQoY21kLCBhcmdzKQorICAgICAgICByZXR1cm4gc2VsZi5nZXRyZXBseSgpCisKKyAgICAjIHN0ZCBzbXRwIGNvbW1hbmRzCisgICAgZGVmIGhlbG8oc2VsZiwgbmFtZT0nJyk6CisgICAgICAgICIiIlNNVFAgJ2hlbG8nIGNvbW1hbmQuCisgICAgICAgIEhvc3RuYW1lIHRvIHNlbmQgZm9yIHRoaXMgY29tbWFuZCBkZWZhdWx0cyB0byB0aGUgRlFETiBvZiB0aGUgbG9jYWwKKyAgICAgICAgaG9zdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucHV0Y21kKCJoZWxvIiwgbmFtZSBvciBzZWxmLmxvY2FsX2hvc3RuYW1lKQorICAgICAgICAoY29kZSwgbXNnKSA9IHNlbGYuZ2V0cmVwbHkoKQorICAgICAgICBzZWxmLmhlbG9fcmVzcCA9IG1zZworICAgICAgICByZXR1cm4gKGNvZGUsIG1zZykKKworICAgIGRlZiBlaGxvKHNlbGYsIG5hbWU9JycpOgorICAgICAgICAiIiIgU01UUCAnZWhsbycgY29tbWFuZC4KKyAgICAgICAgSG9zdG5hbWUgdG8gc2VuZCBmb3IgdGhpcyBjb21tYW5kIGRlZmF1bHRzIHRvIHRoZSBGUUROIG9mIHRoZSBsb2NhbAorICAgICAgICBob3N0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5lc210cF9mZWF0dXJlcyA9IHt9CisgICAgICAgIHNlbGYucHV0Y21kKHNlbGYuZWhsb19tc2csIG5hbWUgb3Igc2VsZi5sb2NhbF9ob3N0bmFtZSkKKyAgICAgICAgKGNvZGUsIG1zZykgPSBzZWxmLmdldHJlcGx5KCkKKyAgICAgICAgIyBBY2NvcmRpbmcgdG8gUkZDMTg2OSBzb21lIChiYWRseSB3cml0dGVuKQorICAgICAgICAjIE1UQSdzIHdpbGwgZGlzY29ubmVjdCBvbiBhbiBlaGxvLiBUb3NzIGFuIGV4Y2VwdGlvbiBpZgorICAgICAgICAjIHRoYXQgaGFwcGVucyAtZGRtCisgICAgICAgIGlmIGNvZGUgPT0gLTEgYW5kIGxlbihtc2cpID09IDA6CisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlIFNNVFBTZXJ2ZXJEaXNjb25uZWN0ZWQoIlNlcnZlciBub3QgY29ubmVjdGVkIikKKyAgICAgICAgc2VsZi5laGxvX3Jlc3AgPSBtc2cKKyAgICAgICAgaWYgY29kZSAhPSAyNTA6CisgICAgICAgICAgICByZXR1cm4gKGNvZGUsIG1zZykKKyAgICAgICAgc2VsZi5kb2VzX2VzbXRwID0gMQorICAgICAgICAjcGFyc2UgdGhlIGVobG8gcmVzcG9uc2UgLWRkbQorICAgICAgICByZXNwID0gc2VsZi5laGxvX3Jlc3Auc3BsaXQoJ1xuJykKKyAgICAgICAgZGVsIHJlc3BbMF0KKyAgICAgICAgZm9yIGVhY2ggaW4gcmVzcDoKKyAgICAgICAgICAgICMgVG8gYmUgYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoIGFzIG1hbnkgU01UUCBzZXJ2ZXJzIGFzIHBvc3NpYmxlLAorICAgICAgICAgICAgIyB3ZSBoYXZlIHRvIHRha2UgdGhlIG9sZC1zdHlsZSBhdXRoIGFkdmVydGlzZW1lbnQgaW50byBhY2NvdW50LAorICAgICAgICAgICAgIyBiZWNhdXNlOgorICAgICAgICAgICAgIyAxKSBFbHNlIG91ciBTTVRQIGZlYXR1cmUgcGFyc2VyIGdldHMgY29uZnVzZWQuCisgICAgICAgICAgICAjIDIpIFRoZXJlIGFyZSBzb21lIHNlcnZlcnMgdGhhdCBvbmx5IGFkdmVydGlzZSB0aGUgYXV0aCBtZXRob2RzIHdlCisgICAgICAgICAgICAjICAgIHN1cHBvcnQgdXNpbmcgdGhlIG9sZCBzdHlsZS4KKyAgICAgICAgICAgIGF1dGhfbWF0Y2ggPSBPTERTVFlMRV9BVVRILm1hdGNoKGVhY2gpCisgICAgICAgICAgICBpZiBhdXRoX21hdGNoOgorICAgICAgICAgICAgICAgICMgVGhpcyBkb2Vzbid0IHJlbW92ZSBkdXBsaWNhdGVzLCBidXQgdGhhdCdzIG5vIHByb2JsZW0KKyAgICAgICAgICAgICAgICBzZWxmLmVzbXRwX2ZlYXR1cmVzWyJhdXRoIl0gPSBzZWxmLmVzbXRwX2ZlYXR1cmVzLmdldCgiYXV0aCIsICIiKSBcCisgICAgICAgICAgICAgICAgICAgICAgICArICIgIiArIGF1dGhfbWF0Y2guZ3JvdXBzKDApWzBdCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBSRkMgMTg2OSByZXF1aXJlcyBhIHNwYWNlIGJldHdlZW4gZWhsbyBrZXl3b3JkIGFuZCBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgIyBJdCdzIGFjdHVhbGx5IHN0cmljdGVyLCBpbiB0aGF0IG9ubHkgc3BhY2VzIGFyZSBhbGxvd2VkIGJldHdlZW4KKyAgICAgICAgICAgICMgcGFyYW1ldGVycywgYnV0IHdlcmUgbm90IGdvaW5nIHRvIGNoZWNrIGZvciB0aGF0IGhlcmUuICBOb3RlCisgICAgICAgICAgICAjIHRoYXQgdGhlIHNwYWNlIGlzbid0IHByZXNlbnQgaWYgdGhlcmUgYXJlIG5vIHBhcmFtZXRlcnMuCisgICAgICAgICAgICBtID0gcmUubWF0Y2gocicoP1A8ZmVhdHVyZT5bQS1aYS16MC05XVtBLVphLXowLTlcLV0qKSA/JywgZWFjaCkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgZmVhdHVyZSA9IG0uZ3JvdXAoImZlYXR1cmUiKS5sb3dlcigpCisgICAgICAgICAgICAgICAgcGFyYW1zID0gbS5zdHJpbmdbbS5lbmQoImZlYXR1cmUiKTpdLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBmZWF0dXJlID09ICJhdXRoIjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lc210cF9mZWF0dXJlc1tmZWF0dXJlXSA9IHNlbGYuZXNtdHBfZmVhdHVyZXMuZ2V0KGZlYXR1cmUsICIiKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICIgKyBwYXJhbXMKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVzbXRwX2ZlYXR1cmVzW2ZlYXR1cmVdID0gcGFyYW1zCisgICAgICAgIHJldHVybiAoY29kZSwgbXNnKQorCisgICAgZGVmIGhhc19leHRuKHNlbGYsIG9wdCk6CisgICAgICAgICIiIkRvZXMgdGhlIHNlcnZlciBzdXBwb3J0IGEgZ2l2ZW4gU01UUCBzZXJ2aWNlIGV4dGVuc2lvbj8iIiIKKyAgICAgICAgcmV0dXJuIG9wdC5sb3dlcigpIGluIHNlbGYuZXNtdHBfZmVhdHVyZXMKKworICAgIGRlZiBoZWxwKHNlbGYsIGFyZ3M9JycpOgorICAgICAgICAiIiJTTVRQICdoZWxwJyBjb21tYW5kLgorICAgICAgICBSZXR1cm5zIGhlbHAgdGV4dCBmcm9tIHNlcnZlci4iIiIKKyAgICAgICAgc2VsZi5wdXRjbWQoImhlbHAiLCBhcmdzKQorICAgICAgICByZXR1cm4gc2VsZi5nZXRyZXBseSgpWzFdCisKKyAgICBkZWYgcnNldChzZWxmKToKKyAgICAgICAgIiIiU01UUCAncnNldCcgY29tbWFuZCAtLSByZXNldHMgc2Vzc2lvbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZG9jbWQoInJzZXQiKQorCisgICAgZGVmIG5vb3Aoc2VsZik6CisgICAgICAgICIiIlNNVFAgJ25vb3AnIGNvbW1hbmQgLS0gZG9lc24ndCBkbyBhbnl0aGluZyA6PiIiIgorICAgICAgICByZXR1cm4gc2VsZi5kb2NtZCgibm9vcCIpCisKKyAgICBkZWYgbWFpbChzZWxmLCBzZW5kZXIsIG9wdGlvbnM9W10pOgorICAgICAgICAiIiJTTVRQICdtYWlsJyBjb21tYW5kIC0tIGJlZ2lucyBtYWlsIHhmZXIgc2Vzc2lvbi4iIiIKKyAgICAgICAgb3B0aW9ubGlzdCA9ICcnCisgICAgICAgIGlmIG9wdGlvbnMgYW5kIHNlbGYuZG9lc19lc210cDoKKyAgICAgICAgICAgIG9wdGlvbmxpc3QgPSAnICcgKyAnICcuam9pbihvcHRpb25zKQorICAgICAgICBzZWxmLnB1dGNtZCgibWFpbCIsICJGUk9NOiVzJXMiICUgKHF1b3RlYWRkcihzZW5kZXIpLCBvcHRpb25saXN0KSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0cmVwbHkoKQorCisgICAgZGVmIHJjcHQoc2VsZiwgcmVjaXAsIG9wdGlvbnM9W10pOgorICAgICAgICAiIiJTTVRQICdyY3B0JyBjb21tYW5kIC0tIGluZGljYXRlcyAxIHJlY2lwaWVudCBmb3IgdGhpcyBtYWlsLiIiIgorICAgICAgICBvcHRpb25saXN0ID0gJycKKyAgICAgICAgaWYgb3B0aW9ucyBhbmQgc2VsZi5kb2VzX2VzbXRwOgorICAgICAgICAgICAgb3B0aW9ubGlzdCA9ICcgJyArICcgJy5qb2luKG9wdGlvbnMpCisgICAgICAgIHNlbGYucHV0Y21kKCJyY3B0IiwgIlRPOiVzJXMiICUgKHF1b3RlYWRkcihyZWNpcCksIG9wdGlvbmxpc3QpKQorICAgICAgICByZXR1cm4gc2VsZi5nZXRyZXBseSgpCisKKyAgICBkZWYgZGF0YShzZWxmLCBtc2cpOgorICAgICAgICAiIiJTTVRQICdEQVRBJyBjb21tYW5kIC0tIHNlbmRzIG1lc3NhZ2UgZGF0YSB0byBzZXJ2ZXIuCisKKyAgICAgICAgQXV0b21hdGljYWxseSBxdW90ZXMgbGluZXMgYmVnaW5uaW5nIHdpdGggYSBwZXJpb2QgcGVyIHJmYzgyMS4KKyAgICAgICAgUmFpc2VzIFNNVFBEYXRhRXJyb3IgaWYgdGhlcmUgaXMgYW4gdW5leHBlY3RlZCByZXBseSB0byB0aGUKKyAgICAgICAgREFUQSBjb21tYW5kOyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhpcyBtZXRob2QgaXMgdGhlIGZpbmFsCisgICAgICAgIHJlc3BvbnNlIGNvZGUgcmVjZWl2ZWQgd2hlbiB0aGUgYWxsIGRhdGEgaXMgc2VudC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucHV0Y21kKCJkYXRhIikKKyAgICAgICAgKGNvZGUsIHJlcGwpID0gc2VsZi5nZXRyZXBseSgpCisgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICBwcmludD4+c3RkZXJyLCAiZGF0YToiLCAoY29kZSwgcmVwbCkKKyAgICAgICAgaWYgY29kZSAhPSAzNTQ6CisgICAgICAgICAgICByYWlzZSBTTVRQRGF0YUVycm9yKGNvZGUsIHJlcGwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBxID0gcXVvdGVkYXRhKG1zZykKKyAgICAgICAgICAgIGlmIHFbLTI6XSAhPSBDUkxGOgorICAgICAgICAgICAgICAgIHEgPSBxICsgQ1JMRgorICAgICAgICAgICAgcSA9IHEgKyAiLiIgKyBDUkxGCisgICAgICAgICAgICBzZWxmLnNlbmQocSkKKyAgICAgICAgICAgIChjb2RlLCBtc2cpID0gc2VsZi5nZXRyZXBseSgpCisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgICAgIHByaW50Pj5zdGRlcnIsICJkYXRhOiIsIChjb2RlLCBtc2cpCisgICAgICAgICAgICByZXR1cm4gKGNvZGUsIG1zZykKKworICAgIGRlZiB2ZXJpZnkoc2VsZiwgYWRkcmVzcyk6CisgICAgICAgICIiIlNNVFAgJ3ZlcmlmeScgY29tbWFuZCAtLSBjaGVja3MgZm9yIGFkZHJlc3MgdmFsaWRpdHkuIiIiCisgICAgICAgIHNlbGYucHV0Y21kKCJ2cmZ5IiwgX2FkZHJfb25seShhZGRyZXNzKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0cmVwbHkoKQorICAgICMgYS5rLmEuCisgICAgdnJmeSA9IHZlcmlmeQorCisgICAgZGVmIGV4cG4oc2VsZiwgYWRkcmVzcyk6CisgICAgICAgICIiIlNNVFAgJ2V4cG4nIGNvbW1hbmQgLS0gZXhwYW5kcyBhIG1haWxpbmcgbGlzdC4iIiIKKyAgICAgICAgc2VsZi5wdXRjbWQoImV4cG4iLCBfYWRkcl9vbmx5KGFkZHJlc3MpKQorICAgICAgICByZXR1cm4gc2VsZi5nZXRyZXBseSgpCisKKyAgICAjIHNvbWUgdXNlZnVsIG1ldGhvZHMKKworICAgIGRlZiBlaGxvX29yX2hlbG9faWZfbmVlZGVkKHNlbGYpOgorICAgICAgICAiIiJDYWxsIHNlbGYuZWhsbygpIGFuZC9vciBzZWxmLmhlbG8oKSBpZiBuZWVkZWQuCisKKyAgICAgICAgSWYgdGhlcmUgaGFzIGJlZW4gbm8gcHJldmlvdXMgRUhMTyBvciBIRUxPIGNvbW1hbmQgdGhpcyBzZXNzaW9uLCB0aGlzCisgICAgICAgIG1ldGhvZCB0cmllcyBFU01UUCBFSExPIGZpcnN0LgorCisgICAgICAgIFRoaXMgbWV0aG9kIG1heSByYWlzZSB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6CisKKyAgICAgICAgIFNNVFBIZWxvRXJyb3IgICAgICAgICAgICBUaGUgc2VydmVyIGRpZG4ndCByZXBseSBwcm9wZXJseSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoZWxvIGdyZWV0aW5nLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5oZWxvX3Jlc3AgaXMgTm9uZSBhbmQgc2VsZi5laGxvX3Jlc3AgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIG5vdCAoMjAwIDw9IHNlbGYuZWhsbygpWzBdIDw9IDI5OSk6CisgICAgICAgICAgICAgICAgKGNvZGUsIHJlc3ApID0gc2VsZi5oZWxvKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgKDIwMCA8PSBjb2RlIDw9IDI5OSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFNNVFBIZWxvRXJyb3IoY29kZSwgcmVzcCkKKworICAgIGRlZiBsb2dpbihzZWxmLCB1c2VyLCBwYXNzd29yZCk6CisgICAgICAgICIiIkxvZyBpbiBvbiBhbiBTTVRQIHNlcnZlciB0aGF0IHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uLgorCisgICAgICAgIFRoZSBhcmd1bWVudHMgYXJlOgorICAgICAgICAgICAgLSB1c2VyOiAgICAgVGhlIHVzZXIgbmFtZSB0byBhdXRoZW50aWNhdGUgd2l0aC4KKyAgICAgICAgICAgIC0gcGFzc3dvcmQ6IFRoZSBwYXNzd29yZCBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uLgorCisgICAgICAgIElmIHRoZXJlIGhhcyBiZWVuIG5vIHByZXZpb3VzIEVITE8gb3IgSEVMTyBjb21tYW5kIHRoaXMgc2Vzc2lvbiwgdGhpcworICAgICAgICBtZXRob2QgdHJpZXMgRVNNVFAgRUhMTyBmaXJzdC4KKworICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBub3JtYWxseSBpZiB0aGUgYXV0aGVudGljYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisKKyAgICAgICAgVGhpcyBtZXRob2QgbWF5IHJhaXNlIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKKworICAgICAgICAgU01UUEhlbG9FcnJvciAgICAgICAgICAgIFRoZSBzZXJ2ZXIgZGlkbid0IHJlcGx5IHByb3Blcmx5IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGhlbG8gZ3JlZXRpbmcuCisgICAgICAgICBTTVRQQXV0aGVudGljYXRpb25FcnJvciAgVGhlIHNlcnZlciBkaWRuJ3QgYWNjZXB0IHRoZSB1c2VybmFtZS8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCBjb21iaW5hdGlvbi4KKyAgICAgICAgIFNNVFBFeGNlcHRpb24gICAgICAgICAgICBObyBzdWl0YWJsZSBhdXRoZW50aWNhdGlvbiBtZXRob2Qgd2FzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQuCisgICAgICAgICIiIgorCisgICAgICAgIGRlZiBlbmNvZGVfY3JhbV9tZDUoY2hhbGxlbmdlLCB1c2VyLCBwYXNzd29yZCk6CisgICAgICAgICAgICBjaGFsbGVuZ2UgPSBiYXNlNjQuZGVjb2Rlc3RyaW5nKGNoYWxsZW5nZSkKKyAgICAgICAgICAgIHJlc3BvbnNlID0gdXNlciArICIgIiArIGhtYWMuSE1BQyhwYXNzd29yZCwgY2hhbGxlbmdlKS5oZXhkaWdlc3QoKQorICAgICAgICAgICAgcmV0dXJuIGVuY29kZV9iYXNlNjQocmVzcG9uc2UsIGVvbD0iIikKKworICAgICAgICBkZWYgZW5jb2RlX3BsYWluKHVzZXIsIHBhc3N3b3JkKToKKyAgICAgICAgICAgIHJldHVybiBlbmNvZGVfYmFzZTY0KCJcMCVzXDAlcyIgJSAodXNlciwgcGFzc3dvcmQpLCBlb2w9IiIpCisKKworICAgICAgICBBVVRIX1BMQUlOID0gIlBMQUlOIgorICAgICAgICBBVVRIX0NSQU1fTUQ1ID0gIkNSQU0tTUQ1IgorICAgICAgICBBVVRIX0xPR0lOID0gIkxPR0lOIgorCisgICAgICAgIHNlbGYuZWhsb19vcl9oZWxvX2lmX25lZWRlZCgpCisKKyAgICAgICAgaWYgbm90IHNlbGYuaGFzX2V4dG4oImF1dGgiKToKKyAgICAgICAgICAgIHJhaXNlIFNNVFBFeGNlcHRpb24oIlNNVFAgQVVUSCBleHRlbnNpb24gbm90IHN1cHBvcnRlZCBieSBzZXJ2ZXIuIikKKworICAgICAgICAjIEF1dGhlbnRpY2F0aW9uIG1ldGhvZHMgdGhlIHNlcnZlciBzdXBwb3J0czoKKyAgICAgICAgYXV0aGxpc3QgPSBzZWxmLmVzbXRwX2ZlYXR1cmVzWyJhdXRoIl0uc3BsaXQoKQorCisgICAgICAgICMgTGlzdCBvZiBhdXRoZW50aWNhdGlvbiBtZXRob2RzIHdlIHN1cHBvcnQ6IGZyb20gcHJlZmVycmVkIHRvCisgICAgICAgICMgbGVzcyBwcmVmZXJyZWQgbWV0aG9kcy4gRXhjZXB0IGZvciB0aGUgcHVycG9zZSBvZiB0ZXN0aW5nIHRoZSB3ZWFrZXIKKyAgICAgICAgIyBvbmVzLCB3ZSBwcmVmZXIgc3Ryb25nZXIgbWV0aG9kcyBsaWtlIENSQU0tTUQ1OgorICAgICAgICBwcmVmZXJyZWRfYXV0aHMgPSBbQVVUSF9DUkFNX01ENSwgQVVUSF9QTEFJTiwgQVVUSF9MT0dJTl0KKworICAgICAgICAjIERldGVybWluZSB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHdlJ2xsIHVzZQorICAgICAgICBhdXRobWV0aG9kID0gTm9uZQorICAgICAgICBmb3IgbWV0aG9kIGluIHByZWZlcnJlZF9hdXRoczoKKyAgICAgICAgICAgIGlmIG1ldGhvZCBpbiBhdXRobGlzdDoKKyAgICAgICAgICAgICAgICBhdXRobWV0aG9kID0gbWV0aG9kCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBhdXRobWV0aG9kID09IEFVVEhfQ1JBTV9NRDU6CisgICAgICAgICAgICAoY29kZSwgcmVzcCkgPSBzZWxmLmRvY21kKCJBVVRIIiwgQVVUSF9DUkFNX01ENSkKKyAgICAgICAgICAgIGlmIGNvZGUgPT0gNTAzOgorICAgICAgICAgICAgICAgICMgNTAzID09ICdFcnJvcjogYWxyZWFkeSBhdXRoZW50aWNhdGVkJworICAgICAgICAgICAgICAgIHJldHVybiAoY29kZSwgcmVzcCkKKyAgICAgICAgICAgIChjb2RlLCByZXNwKSA9IHNlbGYuZG9jbWQoZW5jb2RlX2NyYW1fbWQ1KHJlc3AsIHVzZXIsIHBhc3N3b3JkKSkKKyAgICAgICAgZWxpZiBhdXRobWV0aG9kID09IEFVVEhfUExBSU46CisgICAgICAgICAgICAoY29kZSwgcmVzcCkgPSBzZWxmLmRvY21kKCJBVVRIIiwKKyAgICAgICAgICAgICAgICBBVVRIX1BMQUlOICsgIiAiICsgZW5jb2RlX3BsYWluKHVzZXIsIHBhc3N3b3JkKSkKKyAgICAgICAgZWxpZiBhdXRobWV0aG9kID09IEFVVEhfTE9HSU46CisgICAgICAgICAgICAoY29kZSwgcmVzcCkgPSBzZWxmLmRvY21kKCJBVVRIIiwKKyAgICAgICAgICAgICAgICAiJXMgJXMiICUgKEFVVEhfTE9HSU4sIGVuY29kZV9iYXNlNjQodXNlciwgZW9sPSIiKSkpCisgICAgICAgICAgICBpZiBjb2RlICE9IDMzNDoKKyAgICAgICAgICAgICAgICByYWlzZSBTTVRQQXV0aGVudGljYXRpb25FcnJvcihjb2RlLCByZXNwKQorICAgICAgICAgICAgKGNvZGUsIHJlc3ApID0gc2VsZi5kb2NtZChlbmNvZGVfYmFzZTY0KHBhc3N3b3JkLCBlb2w9IiIpKQorICAgICAgICBlbGlmIGF1dGhtZXRob2QgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFNNVFBFeGNlcHRpb24oIk5vIHN1aXRhYmxlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBmb3VuZC4iKQorICAgICAgICBpZiBjb2RlIG5vdCBpbiAoMjM1LCA1MDMpOgorICAgICAgICAgICAgIyAyMzUgPT0gJ0F1dGhlbnRpY2F0aW9uIHN1Y2Nlc3NmdWwnCisgICAgICAgICAgICAjIDUwMyA9PSAnRXJyb3I6IGFscmVhZHkgYXV0aGVudGljYXRlZCcKKyAgICAgICAgICAgIHJhaXNlIFNNVFBBdXRoZW50aWNhdGlvbkVycm9yKGNvZGUsIHJlc3ApCisgICAgICAgIHJldHVybiAoY29kZSwgcmVzcCkKKworICAgIGRlZiBzdGFydHRscyhzZWxmLCBrZXlmaWxlPU5vbmUsIGNlcnRmaWxlPU5vbmUpOgorICAgICAgICAiIiJQdXRzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBTTVRQIHNlcnZlciBpbnRvIFRMUyBtb2RlLgorCisgICAgICAgIElmIHRoZXJlIGhhcyBiZWVuIG5vIHByZXZpb3VzIEVITE8gb3IgSEVMTyBjb21tYW5kIHRoaXMgc2Vzc2lvbiwgdGhpcworICAgICAgICBtZXRob2QgdHJpZXMgRVNNVFAgRUhMTyBmaXJzdC4KKworICAgICAgICBJZiB0aGUgc2VydmVyIHN1cHBvcnRzIFRMUywgdGhpcyB3aWxsIGVuY3J5cHQgdGhlIHJlc3Qgb2YgdGhlIFNNVFAKKyAgICAgICAgc2Vzc2lvbi4gSWYgeW91IHByb3ZpZGUgdGhlIGtleWZpbGUgYW5kIGNlcnRmaWxlIHBhcmFtZXRlcnMsCisgICAgICAgIHRoZSBpZGVudGl0eSBvZiB0aGUgU01UUCBzZXJ2ZXIgYW5kIGNsaWVudCBjYW4gYmUgY2hlY2tlZC4gVGhpcywKKyAgICAgICAgaG93ZXZlciwgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBzb2NrZXQgbW9kdWxlIHJlYWxseSBjaGVja3MgdGhlCisgICAgICAgIGNlcnRpZmljYXRlcy4KKworICAgICAgICBUaGlzIG1ldGhvZCBtYXkgcmFpc2UgdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorCisgICAgICAgICBTTVRQSGVsb0Vycm9yICAgICAgICAgICAgVGhlIHNlcnZlciBkaWRuJ3QgcmVwbHkgcHJvcGVybHkgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaGVsbyBncmVldGluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZWhsb19vcl9oZWxvX2lmX25lZWRlZCgpCisgICAgICAgIGlmIG5vdCBzZWxmLmhhc19leHRuKCJzdGFydHRscyIpOgorICAgICAgICAgICAgcmFpc2UgU01UUEV4Y2VwdGlvbigiU1RBUlRUTFMgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQgYnkgc2VydmVyLiIpCisgICAgICAgIChyZXNwLCByZXBseSkgPSBzZWxmLmRvY21kKCJTVEFSVFRMUyIpCisgICAgICAgIGlmIHJlc3AgPT0gMjIwOgorICAgICAgICAgICAgaWYgbm90IF9oYXZlX3NzbDoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIk5vIFNTTCBzdXBwb3J0IGluY2x1ZGVkIGluIHRoaXMgUHl0aG9uIikKKyAgICAgICAgICAgIHNlbGYuc29jayA9IHNzbC53cmFwX3NvY2tldChzZWxmLnNvY2ssIGtleWZpbGUsIGNlcnRmaWxlKQorICAgICAgICAgICAgc2VsZi5maWxlID0gU1NMRmFrZUZpbGUoc2VsZi5zb2NrKQorICAgICAgICAgICAgIyBSRkMgMzIwNzoKKyAgICAgICAgICAgICMgVGhlIGNsaWVudCBNVVNUIGRpc2NhcmQgYW55IGtub3dsZWRnZSBvYnRhaW5lZCBmcm9tCisgICAgICAgICAgICAjIHRoZSBzZXJ2ZXIsIHN1Y2ggYXMgdGhlIGxpc3Qgb2YgU01UUCBzZXJ2aWNlIGV4dGVuc2lvbnMsCisgICAgICAgICAgICAjIHdoaWNoIHdhcyBub3Qgb2J0YWluZWQgZnJvbSB0aGUgVExTIG5lZ290aWF0aW9uIGl0c2VsZi4KKyAgICAgICAgICAgIHNlbGYuaGVsb19yZXNwID0gTm9uZQorICAgICAgICAgICAgc2VsZi5laGxvX3Jlc3AgPSBOb25lCisgICAgICAgICAgICBzZWxmLmVzbXRwX2ZlYXR1cmVzID0ge30KKyAgICAgICAgICAgIHNlbGYuZG9lc19lc210cCA9IDAKKyAgICAgICAgcmV0dXJuIChyZXNwLCByZXBseSkKKworICAgIGRlZiBzZW5kbWFpbChzZWxmLCBmcm9tX2FkZHIsIHRvX2FkZHJzLCBtc2csIG1haWxfb3B0aW9ucz1bXSwKKyAgICAgICAgICAgICAgICAgcmNwdF9vcHRpb25zPVtdKToKKyAgICAgICAgIiIiVGhpcyBjb21tYW5kIHBlcmZvcm1zIGFuIGVudGlyZSBtYWlsIHRyYW5zYWN0aW9uLgorCisgICAgICAgIFRoZSBhcmd1bWVudHMgYXJlOgorICAgICAgICAgICAgLSBmcm9tX2FkZHIgICAgOiBUaGUgYWRkcmVzcyBzZW5kaW5nIHRoaXMgbWFpbC4KKyAgICAgICAgICAgIC0gdG9fYWRkcnMgICAgIDogQSBsaXN0IG9mIGFkZHJlc3NlcyB0byBzZW5kIHRoaXMgbWFpbCB0by4gIEEgYmFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgd2lsbCBiZSB0cmVhdGVkIGFzIGEgbGlzdCB3aXRoIDEgYWRkcmVzcy4KKyAgICAgICAgICAgIC0gbXNnICAgICAgICAgIDogVGhlIG1lc3NhZ2UgdG8gc2VuZC4KKyAgICAgICAgICAgIC0gbWFpbF9vcHRpb25zIDogTGlzdCBvZiBFU01UUCBvcHRpb25zIChzdWNoIGFzIDhiaXRtaW1lKSBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haWwgY29tbWFuZC4KKyAgICAgICAgICAgIC0gcmNwdF9vcHRpb25zIDogTGlzdCBvZiBFU01UUCBvcHRpb25zIChzdWNoIGFzIERTTiBjb21tYW5kcykgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCB0aGUgcmNwdCBjb21tYW5kcy4KKworICAgICAgICBJZiB0aGVyZSBoYXMgYmVlbiBubyBwcmV2aW91cyBFSExPIG9yIEhFTE8gY29tbWFuZCB0aGlzIHNlc3Npb24sIHRoaXMKKyAgICAgICAgbWV0aG9kIHRyaWVzIEVTTVRQIEVITE8gZmlyc3QuICBJZiB0aGUgc2VydmVyIGRvZXMgRVNNVFAsIG1lc3NhZ2Ugc2l6ZQorICAgICAgICBhbmQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIG9wdGlvbnMgd2lsbCBiZSBwYXNzZWQgdG8gaXQuICBJZiBFSExPCisgICAgICAgIGZhaWxzLCBIRUxPIHdpbGwgYmUgdHJpZWQgYW5kIEVTTVRQIG9wdGlvbnMgc3VwcHJlc3NlZC4KKworICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiBub3JtYWxseSBpZiB0aGUgbWFpbCBpcyBhY2NlcHRlZCBmb3IgYXQgbGVhc3QKKyAgICAgICAgb25lIHJlY2lwaWVudC4gIEl0IHJldHVybnMgYSBkaWN0aW9uYXJ5LCB3aXRoIG9uZSBlbnRyeSBmb3IgZWFjaAorICAgICAgICByZWNpcGllbnQgdGhhdCB3YXMgcmVmdXNlZC4gIEVhY2ggZW50cnkgY29udGFpbnMgYSB0dXBsZSBvZiB0aGUgU01UUAorICAgICAgICBlcnJvciBjb2RlIGFuZCB0aGUgYWNjb21wYW55aW5nIGVycm9yIG1lc3NhZ2Ugc2VudCBieSB0aGUgc2VydmVyLgorCisgICAgICAgIFRoaXMgbWV0aG9kIG1heSByYWlzZSB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6CisKKyAgICAgICAgIFNNVFBIZWxvRXJyb3IgICAgICAgICAgVGhlIHNlcnZlciBkaWRuJ3QgcmVwbHkgcHJvcGVybHkgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGhlbG8gZ3JlZXRpbmcuCisgICAgICAgICBTTVRQUmVjaXBpZW50c1JlZnVzZWQgIFRoZSBzZXJ2ZXIgcmVqZWN0ZWQgQUxMIHJlY2lwaWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vIG1haWwgd2FzIHNlbnQpLgorICAgICAgICAgU01UUFNlbmRlclJlZnVzZWQgICAgICBUaGUgc2VydmVyIGRpZG4ndCBhY2NlcHQgdGhlIGZyb21fYWRkci4KKyAgICAgICAgIFNNVFBEYXRhRXJyb3IgICAgICAgICAgVGhlIHNlcnZlciByZXBsaWVkIHdpdGggYW4gdW5leHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciBjb2RlIChvdGhlciB0aGFuIGEgcmVmdXNhbCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHJlY2lwaWVudCkuCisKKyAgICAgICAgTm90ZTogdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBvcGVuIGV2ZW4gYWZ0ZXIgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4KKworICAgICAgICBFeGFtcGxlOgorCisgICAgICAgICA+Pj4gaW1wb3J0IHNtdHBsaWIKKyAgICAgICAgID4+PiBzPXNtdHBsaWIuU01UUCgibG9jYWxob3N0IikKKyAgICAgICAgID4+PiB0b2xpc3Q9WyJvbmVAb25lLm9yZyIsInR3b0B0d28ub3JnIiwidGhyZWVAdGhyZWUub3JnIiwiZm91ckBmb3VyLm9yZyJdCisgICAgICAgICA+Pj4gbXNnID0gJycnXFwKKyAgICAgICAgIC4uLiBGcm9tOiBNZUBteS5vcmcKKyAgICAgICAgIC4uLiBTdWJqZWN0OiB0ZXN0aW4nLi4uCisgICAgICAgICAuLi4KKyAgICAgICAgIC4uLiBUaGlzIGlzIGEgdGVzdCAnJycKKyAgICAgICAgID4+PiBzLnNlbmRtYWlsKCJtZUBteS5vcmciLHRvbGlzdCxtc2cpCisgICAgICAgICB7ICJ0aHJlZUB0aHJlZS5vcmciIDogKCA1NTAgLCJVc2VyIHVua25vd24iICkgfQorICAgICAgICAgPj4+IHMucXVpdCgpCisKKyAgICAgICAgSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSBtZXNzYWdlIHdhcyBhY2NlcHRlZCBmb3IgZGVsaXZlcnkgdG8gdGhyZWUKKyAgICAgICAgb2YgdGhlIGZvdXIgYWRkcmVzc2VzLCBhbmQgb25lIHdhcyByZWplY3RlZCwgd2l0aCB0aGUgZXJyb3IgY29kZQorICAgICAgICA1NTAuICBJZiBhbGwgYWRkcmVzc2VzIGFyZSBhY2NlcHRlZCwgdGhlbiB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIGFuCisgICAgICAgIGVtcHR5IGRpY3Rpb25hcnkuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZWhsb19vcl9oZWxvX2lmX25lZWRlZCgpCisgICAgICAgIGVzbXRwX29wdHMgPSBbXQorICAgICAgICBpZiBzZWxmLmRvZXNfZXNtdHA6CisgICAgICAgICAgICAjIEhtbW0/IHdoYXQncyB0aGlzPyAtZGRtCisgICAgICAgICAgICAjIHNlbGYuZXNtdHBfZmVhdHVyZXNbJzdiaXQnXT0iIgorICAgICAgICAgICAgaWYgc2VsZi5oYXNfZXh0bignc2l6ZScpOgorICAgICAgICAgICAgICAgIGVzbXRwX29wdHMuYXBwZW5kKCJzaXplPSVkIiAlIGxlbihtc2cpKQorICAgICAgICAgICAgZm9yIG9wdGlvbiBpbiBtYWlsX29wdGlvbnM6CisgICAgICAgICAgICAgICAgZXNtdHBfb3B0cy5hcHBlbmQob3B0aW9uKQorCisgICAgICAgIChjb2RlLCByZXNwKSA9IHNlbGYubWFpbChmcm9tX2FkZHIsIGVzbXRwX29wdHMpCisgICAgICAgIGlmIGNvZGUgIT0gMjUwOgorICAgICAgICAgICAgc2VsZi5yc2V0KCkKKyAgICAgICAgICAgIHJhaXNlIFNNVFBTZW5kZXJSZWZ1c2VkKGNvZGUsIHJlc3AsIGZyb21fYWRkcikKKyAgICAgICAgc2VuZGVycnMgPSB7fQorICAgICAgICBpZiBpc2luc3RhbmNlKHRvX2FkZHJzLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHRvX2FkZHJzID0gW3RvX2FkZHJzXQorICAgICAgICBmb3IgZWFjaCBpbiB0b19hZGRyczoKKyAgICAgICAgICAgIChjb2RlLCByZXNwKSA9IHNlbGYucmNwdChlYWNoLCByY3B0X29wdGlvbnMpCisgICAgICAgICAgICBpZiAoY29kZSAhPSAyNTApIGFuZCAoY29kZSAhPSAyNTEpOgorICAgICAgICAgICAgICAgIHNlbmRlcnJzW2VhY2hdID0gKGNvZGUsIHJlc3ApCisgICAgICAgIGlmIGxlbihzZW5kZXJycykgPT0gbGVuKHRvX2FkZHJzKToKKyAgICAgICAgICAgICMgdGhlIHNlcnZlciByZWZ1c2VkIGFsbCBvdXIgcmVjaXBpZW50cworICAgICAgICAgICAgc2VsZi5yc2V0KCkKKyAgICAgICAgICAgIHJhaXNlIFNNVFBSZWNpcGllbnRzUmVmdXNlZChzZW5kZXJycykKKyAgICAgICAgKGNvZGUsIHJlc3ApID0gc2VsZi5kYXRhKG1zZykKKyAgICAgICAgaWYgY29kZSAhPSAyNTA6CisgICAgICAgICAgICBzZWxmLnJzZXQoKQorICAgICAgICAgICAgcmFpc2UgU01UUERhdGFFcnJvcihjb2RlLCByZXNwKQorICAgICAgICAjaWYgd2UgZ290IGhlcmUgdGhlbiBzb21lYm9keSBnb3Qgb3VyIG1haWwKKyAgICAgICAgcmV0dXJuIHNlbmRlcnJzCisKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIFNNVFAgc2VydmVyLiIiIgorICAgICAgICBpZiBzZWxmLmZpbGU6CisgICAgICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQorICAgICAgICBzZWxmLmZpbGUgPSBOb25lCisgICAgICAgIGlmIHNlbGYuc29jazoKKyAgICAgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCisgICAgICAgIHNlbGYuc29jayA9IE5vbmUKKworCisgICAgZGVmIHF1aXQoc2VsZik6CisgICAgICAgICIiIlRlcm1pbmF0ZSB0aGUgU01UUCBzZXNzaW9uLiIiIgorICAgICAgICByZXMgPSBzZWxmLmRvY21kKCJxdWl0IikKKyAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgIHJldHVybiByZXMKKworaWYgX2hhdmVfc3NsOgorCisgICAgY2xhc3MgU01UUF9TU0woU01UUCk6CisgICAgICAgICIiIiBUaGlzIGlzIGEgc3ViY2xhc3MgZGVyaXZlZCBmcm9tIFNNVFAgdGhhdCBjb25uZWN0cyBvdmVyIGFuIFNTTCBlbmNyeXB0ZWQKKyAgICAgICAgc29ja2V0ICh0byB1c2UgdGhpcyBjbGFzcyB5b3UgbmVlZCBhIHNvY2tldCBtb2R1bGUgdGhhdCB3YXMgY29tcGlsZWQgd2l0aCBTU0wKKyAgICAgICAgc3VwcG9ydCkuIElmIGhvc3QgaXMgbm90IHNwZWNpZmllZCwgJycgKHRoZSBsb2NhbCBob3N0KSBpcyB1c2VkLiBJZiBwb3J0IGlzCisgICAgICAgIG9taXR0ZWQsIHRoZSBzdGFuZGFyZCBTTVRQLW92ZXItU1NMIHBvcnQgKDQ2NSkgaXMgdXNlZC4ga2V5ZmlsZSBhbmQgY2VydGZpbGUKKyAgICAgICAgYXJlIGFsc28gb3B0aW9uYWwgLSB0aGV5IGNhbiBjb250YWluIGEgUEVNIGZvcm1hdHRlZCBwcml2YXRlIGtleSBhbmQKKyAgICAgICAgY2VydGlmaWNhdGUgY2hhaW4gZmlsZSBmb3IgdGhlIFNTTCBjb25uZWN0aW9uLgorICAgICAgICAiIiIKKworICAgICAgICBkZWZhdWx0X3BvcnQgPSBTTVRQX1NTTF9QT1JUCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9JycsIHBvcnQ9MCwgbG9jYWxfaG9zdG5hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIGtleWZpbGU9Tm9uZSwgY2VydGZpbGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VUKToKKyAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IGtleWZpbGUKKyAgICAgICAgICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0ZmlsZQorICAgICAgICAgICAgU01UUC5fX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0LCBsb2NhbF9ob3N0bmFtZSwgdGltZW91dCkKKworICAgICAgICBkZWYgX2dldF9zb2NrZXQoc2VsZiwgaG9zdCwgcG9ydCwgdGltZW91dCk6CisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgICAgIHByaW50Pj5zdGRlcnIsICdjb25uZWN0OicsIChob3N0LCBwb3J0KQorICAgICAgICAgICAgbmV3X3NvY2tldCA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoaG9zdCwgcG9ydCksIHRpbWVvdXQpCisgICAgICAgICAgICBuZXdfc29ja2V0ID0gc3NsLndyYXBfc29ja2V0KG5ld19zb2NrZXQsIHNlbGYua2V5ZmlsZSwgc2VsZi5jZXJ0ZmlsZSkKKyAgICAgICAgICAgIHNlbGYuZmlsZSA9IFNTTEZha2VGaWxlKG5ld19zb2NrZXQpCisgICAgICAgICAgICByZXR1cm4gbmV3X3NvY2tldAorCisgICAgX19hbGxfXy5hcHBlbmQoIlNNVFBfU1NMIikKKworIworIyBMTVRQIGV4dGVuc2lvbgorIworTE1UUF9QT1JUID0gMjAwMworCitjbGFzcyBMTVRQKFNNVFApOgorICAgICIiIkxNVFAgLSBMb2NhbCBNYWlsIFRyYW5zZmVyIFByb3RvY29sCisKKyAgICBUaGUgTE1UUCBwcm90b2NvbCwgd2hpY2ggaXMgdmVyeSBzaW1pbGFyIHRvIEVTTVRQLCBpcyBoZWF2aWx5IGJhc2VkCisgICAgb24gdGhlIHN0YW5kYXJkIFNNVFAgY2xpZW50LiBJdCdzIGNvbW1vbiB0byB1c2UgVW5peCBzb2NrZXRzIGZvciBMTVRQLAorICAgIHNvIG91ciBjb25uZWN0KCkgbWV0aG9kIG11c3Qgc3VwcG9ydCB0aGF0IGFzIHdlbGwgYXMgYSByZWd1bGFyCisgICAgaG9zdDpwb3J0IHNlcnZlci4gVG8gc3BlY2lmeSBhIFVuaXggc29ja2V0LCB5b3UgbXVzdCB1c2UgYW4gYWJzb2x1dGUKKyAgICBwYXRoIGFzIHRoZSBob3N0LCBzdGFydGluZyB3aXRoIGEgJy8nLgorCisgICAgQXV0aGVudGljYXRpb24gaXMgc3VwcG9ydGVkLCB1c2luZyB0aGUgcmVndWxhciBTTVRQIG1lY2hhbmlzbS4gV2hlbgorICAgIHVzaW5nIGEgVW5peCBzb2NrZXQsIExNVFAgZ2VuZXJhbGx5IGRvbid0IHN1cHBvcnQgb3IgcmVxdWlyZSBhbnkKKyAgICBhdXRoZW50aWNhdGlvbiwgYnV0IHlvdXIgbWlsZWFnZSBtaWdodCB2YXJ5LiIiIgorCisgICAgZWhsb19tc2cgPSAibGhsbyIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PScnLCBwb3J0PUxNVFBfUE9SVCwgbG9jYWxfaG9zdG5hbWU9Tm9uZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2UuIiIiCisgICAgICAgIFNNVFAuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgbG9jYWxfaG9zdG5hbWUpCisKKyAgICBkZWYgY29ubmVjdChzZWxmLCBob3N0PSdsb2NhbGhvc3QnLCBwb3J0PTApOgorICAgICAgICAiIiJDb25uZWN0IHRvIHRoZSBMTVRQIGRhZW1vbiwgb24gZWl0aGVyIGEgVW5peCBvciBhIFRDUCBzb2NrZXQuIiIiCisgICAgICAgIGlmIGhvc3RbMF0gIT0gJy8nOgorICAgICAgICAgICAgcmV0dXJuIFNNVFAuY29ubmVjdChzZWxmLCBob3N0LCBwb3J0KQorCisgICAgICAgICMgSGFuZGxlIFVuaXgtZG9tYWluIHNvY2tldHMuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgIHNlbGYuc29jay5jb25uZWN0KGhvc3QpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgICAgIHByaW50Pj5zdGRlcnIsICdjb25uZWN0IGZhaWw6JywgaG9zdAorICAgICAgICAgICAgaWYgc2VsZi5zb2NrOgorICAgICAgICAgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLnNvY2sgPSBOb25lCisgICAgICAgICAgICByYWlzZQorICAgICAgICAoY29kZSwgbXNnKSA9IHNlbGYuZ2V0cmVwbHkoKQorICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgcHJpbnQ+PnN0ZGVyciwgImNvbm5lY3Q6IiwgbXNnCisgICAgICAgIHJldHVybiAoY29kZSwgbXNnKQorCisKKyMgVGVzdCB0aGUgc2VuZG1haWwgbWV0aG9kLCB3aGljaCB0ZXN0cyBtb3N0IG9mIHRoZSBvdGhlcnMuCisjIE5vdGU6IFRoaXMgYWx3YXlzIHNlbmRzIHRvIGxvY2FsaG9zdC4KK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHN5cworCisgICAgZGVmIHByb21wdChwcm9tcHQpOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHByb21wdCArICI6ICIpCisgICAgICAgIHJldHVybiBzeXMuc3RkaW4ucmVhZGxpbmUoKS5zdHJpcCgpCisKKyAgICBmcm9tYWRkciA9IHByb21wdCgiRnJvbSIpCisgICAgdG9hZGRycyA9IHByb21wdCgiVG8iKS5zcGxpdCgnLCcpCisgICAgcHJpbnQgIkVudGVyIG1lc3NhZ2UsIGVuZCB3aXRoIF5EOiIKKyAgICBtc2cgPSAnJworICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG1zZyA9IG1zZyArIGxpbmUKKyAgICBwcmludCAiTWVzc2FnZSBsZW5ndGggaXMgJWQiICUgbGVuKG1zZykKKworICAgIHNlcnZlciA9IFNNVFAoJ2xvY2FsaG9zdCcpCisgICAgc2VydmVyLnNldF9kZWJ1Z2xldmVsKDEpCisgICAgc2VydmVyLnNlbmRtYWlsKGZyb21hZGRyLCB0b2FkZHJzLCBtc2cpCisgICAgc2VydmVyLnF1aXQoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zbXRwbGliLnB5YyBiL2xpYi9weXRob24yLjcvc210cGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiYzI2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc210cGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zbXRwbGliLnB5byBiL2xpYi9weXRob24yLjcvc210cGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiYzI2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc210cGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zbmRoZHIucHkgYi9saWIvcHl0aG9uMi43L3NuZGhkci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzJkNmI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zbmRoZHIucHkKQEAgLTAsMCArMSwyMjggQEAKKyIiIlJvdXRpbmVzIHRvIGhlbHAgcmVjb2duaXppbmcgc291bmQgZmlsZXMuCisKK0Z1bmN0aW9uIHdoYXRoZHIoKSByZWNvZ25pemVzIHZhcmlvdXMgdHlwZXMgb2Ygc291bmQgZmlsZSBoZWFkZXJzLgorSXQgdW5kZXJzdGFuZHMgYWxtb3N0IGFsbCBoZWFkZXJzIHRoYXQgU09YIGNhbiBkZWNvZGUuCisKK1RoZSByZXR1cm4gdHVwbGUgY29udGFpbnMgdGhlIGZvbGxvd2luZyBpdGVtcywgaW4gdGhpcyBvcmRlcjoKKy0gZmlsZSB0eXBlIChhcyBTT1ggdW5kZXJzdGFuZHMgaXQpCistIHNhbXBsaW5nIHJhdGUgKDAgaWYgdW5rbm93biBvciBoYXJkIHRvIGRlY29kZSkKKy0gbnVtYmVyIG9mIGNoYW5uZWxzICgwIGlmIHVua25vd24gb3IgaGFyZCB0byBkZWNvZGUpCistIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIGZpbGUgKC0xIGlmIHVua25vd24gb3IgaGFyZCB0byBkZWNvZGUpCistIG51bWJlciBvZiBiaXRzL3NhbXBsZSwgb3IgJ1UnIGZvciBVLUxBVywgb3IgJ0EnIGZvciBBLUxBVworCitJZiB0aGUgZmlsZSBkb2Vzbid0IGhhdmUgYSByZWNvZ25pemFibGUgdHlwZSwgaXQgcmV0dXJucyBOb25lLgorSWYgdGhlIGZpbGUgY2FuJ3QgYmUgb3BlbmVkLCBJT0Vycm9yIGlzIHJhaXNlZC4KKworVG8gY29tcHV0ZSB0aGUgdG90YWwgdGltZSwgZGl2aWRlIHRoZSBudW1iZXIgb2YgZnJhbWVzIGJ5IHRoZQorc2FtcGxpbmcgcmF0ZSAoYSBmcmFtZSBjb250YWlucyBhIHNhbXBsZSBmb3IgZWFjaCBjaGFubmVsKS4KKworRnVuY3Rpb24gd2hhdCgpIGNhbGxzIHdoYXRoZHIoKS4gIChJdCB1c2VkIHRvIGFsc28gdXNlIHNvbWUKK2hldXJpc3RpY3MgZm9yIHJhdyBkYXRhLCBidXQgdGhpcyBkb2Vzbid0IHdvcmsgdmVyeSB3ZWxsLikKKworRmluYWxseSwgdGhlIGZ1bmN0aW9uIHRlc3QoKSBpcyBhIHNpbXBsZSBtYWluIHByb2dyYW0gdGhhdCBjYWxscword2hhdCgpIGZvciBhbGwgZmlsZXMgbWVudGlvbmVkIG9uIHRoZSBhcmd1bWVudCBsaXN0LiAgRm9yIGRpcmVjdG9yeQorYXJndW1lbnRzIGl0IGNhbGxzIHdoYXQoKSBmb3IgYWxsIGZpbGVzIGluIHRoYXQgZGlyZWN0b3J5LiAgRGVmYXVsdAorYXJndW1lbnQgaXMgIi4iICh0ZXN0aW5nIGFsbCBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkpLiAgVGhlCitvcHRpb24gLXIgdGVsbHMgaXQgdG8gcmVjdXJzZSBkb3duIGRpcmVjdG9yaWVzIGZvdW5kIGluc2lkZQorZXhwbGljaXRseSBnaXZlbiBkaXJlY3Rvcmllcy4KKyIiIgorCisjIFRoZSBmaWxlIHN0cnVjdHVyZSBpcyB0b3AtZG93biBleGNlcHQgdGhhdCB0aGUgdGVzdCBwcm9ncmFtIGFuZCBpdHMKKyMgc3Vicm91dGluZSBjb21lIGxhc3QuCisKK19fYWxsX18gPSBbIndoYXQiLCJ3aGF0aGRyIl0KKworZGVmIHdoYXQoZmlsZW5hbWUpOgorICAgICIiIkd1ZXNzIHRoZSB0eXBlIG9mIGEgc291bmQgZmlsZSIiIgorICAgIHJlcyA9IHdoYXRoZHIoZmlsZW5hbWUpCisgICAgcmV0dXJuIHJlcworCisKK2RlZiB3aGF0aGRyKGZpbGVuYW1lKToKKyAgICAiIiJSZWNvZ25pemUgc291bmQgaGVhZGVycyIiIgorICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAncmInKQorICAgIGggPSBmLnJlYWQoNTEyKQorICAgIGZvciB0ZiBpbiB0ZXN0czoKKyAgICAgICAgcmVzID0gdGYoaCwgZikKKyAgICAgICAgaWYgcmVzOgorICAgICAgICAgICAgcmV0dXJuIHJlcworICAgIHJldHVybiBOb25lCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworIyBTdWJyb3V0aW5lcyBwZXIgc291bmQgaGVhZGVyIHR5cGUgIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCit0ZXN0cyA9IFtdCisKK2RlZiB0ZXN0X2FpZmMoaCwgZik6CisgICAgaW1wb3J0IGFpZmMKKyAgICBpZiBoWzo0XSAhPSAnRk9STSc6CisgICAgICAgIHJldHVybiBOb25lCisgICAgaWYgaFs4OjEyXSA9PSAnQUlGQyc6CisgICAgICAgIGZtdCA9ICdhaWZjJworICAgIGVsaWYgaFs4OjEyXSA9PSAnQUlGRic6CisgICAgICAgIGZtdCA9ICdhaWZmJworICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisgICAgZi5zZWVrKDApCisgICAgdHJ5OgorICAgICAgICBhID0gYWlmYy5vcGVuZnAoZiwgJ3InKQorICAgIGV4Y2VwdCAoRU9GRXJyb3IsIGFpZmMuRXJyb3IpOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiAoZm10LCBhLmdldGZyYW1lcmF0ZSgpLCBhLmdldG5jaGFubmVscygpLCBcCisgICAgICAgICAgICBhLmdldG5mcmFtZXMoKSwgOCphLmdldHNhbXB3aWR0aCgpKQorCit0ZXN0cy5hcHBlbmQodGVzdF9haWZjKQorCisKK2RlZiB0ZXN0X2F1KGgsIGYpOgorICAgIGlmIGhbOjRdID09ICcuc25kJzoKKyAgICAgICAgZiA9IGdldF9sb25nX2JlCisgICAgZWxpZiBoWzo0XSBpbiAoJ1wwZHMuJywgJ2Rucy4nKToKKyAgICAgICAgZiA9IGdldF9sb25nX2xlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICB0eXBlID0gJ2F1JworICAgIGhkcl9zaXplID0gZihoWzQ6OF0pCisgICAgZGF0YV9zaXplID0gZihoWzg6MTJdKQorICAgIGVuY29kaW5nID0gZihoWzEyOjE2XSkKKyAgICByYXRlID0gZihoWzE2OjIwXSkKKyAgICBuY2hhbm5lbHMgPSBmKGhbMjA6MjRdKQorICAgIHNhbXBsZV9zaXplID0gMSAjIGRlZmF1bHQKKyAgICBpZiBlbmNvZGluZyA9PSAxOgorICAgICAgICBzYW1wbGVfYml0cyA9ICdVJworICAgIGVsaWYgZW5jb2RpbmcgPT0gMjoKKyAgICAgICAgc2FtcGxlX2JpdHMgPSA4CisgICAgZWxpZiBlbmNvZGluZyA9PSAzOgorICAgICAgICBzYW1wbGVfYml0cyA9IDE2CisgICAgICAgIHNhbXBsZV9zaXplID0gMgorICAgIGVsc2U6CisgICAgICAgIHNhbXBsZV9iaXRzID0gJz8nCisgICAgZnJhbWVfc2l6ZSA9IHNhbXBsZV9zaXplICogbmNoYW5uZWxzCisgICAgcmV0dXJuIHR5cGUsIHJhdGUsIG5jaGFubmVscywgZGF0YV9zaXplLy9mcmFtZV9zaXplLCBzYW1wbGVfYml0cworCit0ZXN0cy5hcHBlbmQodGVzdF9hdSkKKworCitkZWYgdGVzdF9oY29tKGgsIGYpOgorICAgIGlmIGhbNjU6NjldICE9ICdGU1NEJyBvciBoWzEyODoxMzJdICE9ICdIQ09NJzoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBkaXZpc29yID0gZ2V0X2xvbmdfYmUoaFsxMjgrMTY6MTI4KzIwXSkKKyAgICByZXR1cm4gJ2hjb20nLCAyMjA1MC8vZGl2aXNvciwgMSwgLTEsIDgKKwordGVzdHMuYXBwZW5kKHRlc3RfaGNvbSkKKworCitkZWYgdGVzdF92b2MoaCwgZik6CisgICAgaWYgaFs6MjBdICE9ICdDcmVhdGl2ZSBWb2ljZSBGaWxlXDAzMic6CisgICAgICAgIHJldHVybiBOb25lCisgICAgc2JzZWVrID0gZ2V0X3Nob3J0X2xlKGhbMjA6MjJdKQorICAgIHJhdGUgPSAwCisgICAgaWYgMCA8PSBzYnNlZWsgPCA1MDAgYW5kIGhbc2JzZWVrXSA9PSAnXDEnOgorICAgICAgICByYXRlY29kZSA9IG9yZChoW3Nic2Vlays0XSkKKyAgICAgICAgcmF0ZSA9IGludCgxMDAwMDAwLjAgLyAoMjU2IC0gcmF0ZWNvZGUpKQorICAgIHJldHVybiAndm9jJywgcmF0ZSwgMSwgLTEsIDgKKwordGVzdHMuYXBwZW5kKHRlc3Rfdm9jKQorCisKK2RlZiB0ZXN0X3dhdihoLCBmKToKKyAgICAjICdSSUZGJyA8bGVuPiAnV0FWRScgJ2ZtdCAnIDxsZW4+CisgICAgaWYgaFs6NF0gIT0gJ1JJRkYnIG9yIGhbODoxMl0gIT0gJ1dBVkUnIG9yIGhbMTI6MTZdICE9ICdmbXQgJzoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBzdHlsZSA9IGdldF9zaG9ydF9sZShoWzIwOjIyXSkKKyAgICBuY2hhbm5lbHMgPSBnZXRfc2hvcnRfbGUoaFsyMjoyNF0pCisgICAgcmF0ZSA9IGdldF9sb25nX2xlKGhbMjQ6MjhdKQorICAgIHNhbXBsZV9iaXRzID0gZ2V0X3Nob3J0X2xlKGhbMzQ6MzZdKQorICAgIHJldHVybiAnd2F2JywgcmF0ZSwgbmNoYW5uZWxzLCAtMSwgc2FtcGxlX2JpdHMKKwordGVzdHMuYXBwZW5kKHRlc3Rfd2F2KQorCisKK2RlZiB0ZXN0XzhzdngoaCwgZik6CisgICAgaWYgaFs6NF0gIT0gJ0ZPUk0nIG9yIGhbODoxMl0gIT0gJzhTVlgnOgorICAgICAgICByZXR1cm4gTm9uZQorICAgICMgU2hvdWxkIGRlY29kZSBpdCB0byBnZXQgI2NoYW5uZWxzIC0tIGFzc3VtZSBhbHdheXMgMQorICAgIHJldHVybiAnOHN2eCcsIDAsIDEsIDAsIDgKKwordGVzdHMuYXBwZW5kKHRlc3RfOHN2eCkKKworCitkZWYgdGVzdF9zbmR0KGgsIGYpOgorICAgIGlmIGhbOjVdID09ICdTT1VORCc6CisgICAgICAgIG5zYW1wbGVzID0gZ2V0X2xvbmdfbGUoaFs4OjEyXSkKKyAgICAgICAgcmF0ZSA9IGdldF9zaG9ydF9sZShoWzIwOjIyXSkKKyAgICAgICAgcmV0dXJuICdzbmR0JywgcmF0ZSwgMSwgbnNhbXBsZXMsIDgKKwordGVzdHMuYXBwZW5kKHRlc3Rfc25kdCkKKworCitkZWYgdGVzdF9zbmRyKGgsIGYpOgorICAgIGlmIGhbOjJdID09ICdcMFwwJzoKKyAgICAgICAgcmF0ZSA9IGdldF9zaG9ydF9sZShoWzI6NF0pCisgICAgICAgIGlmIDQwMDAgPD0gcmF0ZSA8PSAyNTAwMDoKKyAgICAgICAgICAgIHJldHVybiAnc25kcicsIHJhdGUsIDEsIC0xLCA4CisKK3Rlc3RzLmFwcGVuZCh0ZXN0X3NuZHIpCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyMgU3Vicm91dGluZXMgdG8gZXh0cmFjdCBudW1iZXJzIGZyb20gc3RyaW5ncyAjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCitkZWYgZ2V0X2xvbmdfYmUocyk6CisgICAgcmV0dXJuIChvcmQoc1swXSk8PDI0KSB8IChvcmQoc1sxXSk8PDE2KSB8IChvcmQoc1syXSk8PDgpIHwgb3JkKHNbM10pCisKK2RlZiBnZXRfbG9uZ19sZShzKToKKyAgICByZXR1cm4gKG9yZChzWzNdKTw8MjQpIHwgKG9yZChzWzJdKTw8MTYpIHwgKG9yZChzWzFdKTw8OCkgfCBvcmQoc1swXSkKKworZGVmIGdldF9zaG9ydF9iZShzKToKKyAgICByZXR1cm4gKG9yZChzWzBdKTw8OCkgfCBvcmQoc1sxXSkKKworZGVmIGdldF9zaG9ydF9sZShzKToKKyAgICByZXR1cm4gKG9yZChzWzFdKTw8OCkgfCBvcmQoc1swXSkKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisjIFNtYWxsIHRlc3QgcHJvZ3JhbSAjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisKK2RlZiB0ZXN0KCk6CisgICAgaW1wb3J0IHN5cworICAgIHJlY3Vyc2l2ZSA9IDAKKyAgICBpZiBzeXMuYXJndlsxOl0gYW5kIHN5cy5hcmd2WzFdID09ICctcic6CisgICAgICAgIGRlbCBzeXMuYXJndlsxOjJdCisgICAgICAgIHJlY3Vyc2l2ZSA9IDEKKyAgICB0cnk6CisgICAgICAgIGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgICAgIHRlc3RhbGwoc3lzLmFyZ3ZbMTpdLCByZWN1cnNpdmUsIDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ZXN0YWxsKFsnLiddLCByZWN1cnNpdmUsIDEpCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdcbltJbnRlcnJ1cHRlZF1cbicpCisgICAgICAgIHN5cy5leGl0KDEpCisKK2RlZiB0ZXN0YWxsKGxpc3QsIHJlY3Vyc2l2ZSwgdG9wbGV2ZWwpOgorICAgIGltcG9ydCBzeXMKKyAgICBpbXBvcnQgb3MKKyAgICBmb3IgZmlsZW5hbWUgaW4gbGlzdDoKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmaWxlbmFtZSk6CisgICAgICAgICAgICBwcmludCBmaWxlbmFtZSArICcvOicsCisgICAgICAgICAgICBpZiByZWN1cnNpdmUgb3IgdG9wbGV2ZWw6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3JlY3Vyc2luZyBkb3duOicKKyAgICAgICAgICAgICAgICBpbXBvcnQgZ2xvYgorICAgICAgICAgICAgICAgIG5hbWVzID0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihmaWxlbmFtZSwgJyonKSkKKyAgICAgICAgICAgICAgICB0ZXN0YWxsKG5hbWVzLCByZWN1cnNpdmUsIDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICcqKiogZGlyZWN0b3J5ICh1c2UgLXIpICoqKicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50IGZpbGVuYW1lICsgJzonLAorICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcHJpbnQgd2hhdChmaWxlbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHByaW50ICcqKiogbm90IGZvdW5kICoqKicKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc25kaGRyLnB5YyBiL2xpYi9weXRob24yLjcvc25kaGRyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDk0MWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zbmRoZHIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc25kaGRyLnB5byBiL2xpYi9weXRob24yLjcvc25kaGRyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDk0MWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zbmRoZHIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc29ja2V0LnB5IGIvbGliL3B5dGhvbjIuNy9zb2NrZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjMDRmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc29ja2V0LnB5CkBAIC0wLDAgKzEsNTczIEBACisjIFdyYXBwZXIgbW9kdWxlIGZvciBfc29ja2V0LCBwcm92aWRpbmcgc29tZSBhZGRpdGlvbmFsIGZhY2lsaXRpZXMKKyMgaW1wbGVtZW50ZWQgaW4gUHl0aG9uLgorCisiIiJcCitUaGlzIG1vZHVsZSBwcm92aWRlcyBzb2NrZXQgb3BlcmF0aW9ucyBhbmQgc29tZSByZWxhdGVkIGZ1bmN0aW9ucy4KK09uIFVuaXgsIGl0IHN1cHBvcnRzIElQIChJbnRlcm5ldCBQcm90b2NvbCkgYW5kIFVuaXggZG9tYWluIHNvY2tldHMuCitPbiBvdGhlciBzeXN0ZW1zLCBpdCBvbmx5IHN1cHBvcnRzIElQLiBGdW5jdGlvbnMgc3BlY2lmaWMgZm9yIGEKK3NvY2tldCBhcmUgYXZhaWxhYmxlIGFzIG1ldGhvZHMgb2YgdGhlIHNvY2tldCBvYmplY3QuCisKK0Z1bmN0aW9uczoKKworc29ja2V0KCkgLS0gY3JlYXRlIGEgbmV3IHNvY2tldCBvYmplY3QKK3NvY2tldHBhaXIoKSAtLSBjcmVhdGUgYSBwYWlyIG9mIG5ldyBzb2NrZXQgb2JqZWN0cyBbKl0KK2Zyb21mZCgpIC0tIGNyZWF0ZSBhIHNvY2tldCBvYmplY3QgZnJvbSBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBbKl0KK2dldGhvc3RuYW1lKCkgLS0gcmV0dXJuIHRoZSBjdXJyZW50IGhvc3RuYW1lCitnZXRob3N0YnluYW1lKCkgLS0gbWFwIGEgaG9zdG5hbWUgdG8gaXRzIElQIG51bWJlcgorZ2V0aG9zdGJ5YWRkcigpIC0tIG1hcCBhbiBJUCBudW1iZXIgb3IgaG9zdG5hbWUgdG8gRE5TIGluZm8KK2dldHNlcnZieW5hbWUoKSAtLSBtYXAgYSBzZXJ2aWNlIG5hbWUgYW5kIGEgcHJvdG9jb2wgbmFtZSB0byBhIHBvcnQgbnVtYmVyCitnZXRwcm90b2J5bmFtZSgpIC0tIG1hcCBhIHByb3RvY29sIG5hbWUgKGUuZy4gJ3RjcCcpIHRvIGEgbnVtYmVyCitudG9ocygpLCBudG9obCgpIC0tIGNvbnZlcnQgMTYsIDMyIGJpdCBpbnQgZnJvbSBuZXR3b3JrIHRvIGhvc3QgYnl0ZSBvcmRlcgoraHRvbnMoKSwgaHRvbmwoKSAtLSBjb252ZXJ0IDE2LCAzMiBiaXQgaW50IGZyb20gaG9zdCB0byBuZXR3b3JrIGJ5dGUgb3JkZXIKK2luZXRfYXRvbigpIC0tIGNvbnZlcnQgSVAgYWRkciBzdHJpbmcgKDEyMy40NS42Ny44OSkgdG8gMzItYml0IHBhY2tlZCBmb3JtYXQKK2luZXRfbnRvYSgpIC0tIGNvbnZlcnQgMzItYml0IHBhY2tlZCBmb3JtYXQgSVAgdG8gc3RyaW5nICgxMjMuNDUuNjcuODkpCitzc2woKSAtLSBzZWN1cmUgc29ja2V0IGxheWVyIHN1cHBvcnQgKG9ubHkgYXZhaWxhYmxlIGlmIGNvbmZpZ3VyZWQpCitzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSAtLSBnZXQgdGhlIGRlZmF1bHQgdGltZW91dCB2YWx1ZQorc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KCkgLS0gc2V0IHRoZSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUKK2NyZWF0ZV9jb25uZWN0aW9uKCkgLS0gY29ubmVjdHMgdG8gYW4gYWRkcmVzcywgd2l0aCBhbiBvcHRpb25hbCB0aW1lb3V0IGFuZAorICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBzb3VyY2UgYWRkcmVzcy4KKworIFsqXSBub3QgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXMhCisKK1NwZWNpYWwgb2JqZWN0czoKKworU29ja2V0VHlwZSAtLSB0eXBlIG9iamVjdCBmb3Igc29ja2V0IG9iamVjdHMKK2Vycm9yIC0tIGV4Y2VwdGlvbiByYWlzZWQgZm9yIEkvTyBlcnJvcnMKK2hhc19pcHY2IC0tIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBpZiBJUHY2IGlzIHN1cHBvcnRlZAorCitJbnRlZ2VyIGNvbnN0YW50czoKKworQUZfSU5FVCwgQUZfVU5JWCAtLSBzb2NrZXQgZG9tYWlucyAoZmlyc3QgYXJndW1lbnQgdG8gc29ja2V0KCkgY2FsbCkKK1NPQ0tfU1RSRUFNLCBTT0NLX0RHUkFNLCBTT0NLX1JBVyAtLSBzb2NrZXQgdHlwZXMgKHNlY29uZCBhcmd1bWVudCkKKworTWFueSBvdGhlciBjb25zdGFudHMgbWF5IGJlIGRlZmluZWQ7IHRoZXNlIG1heSBiZSB1c2VkIGluIGNhbGxzIHRvCit0aGUgc2V0c29ja29wdCgpIGFuZCBnZXRzb2Nrb3B0KCkgbWV0aG9kcy4KKyIiIgorCitpbXBvcnQgX3NvY2tldAorZnJvbSBfc29ja2V0IGltcG9ydCAqCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgcGFydGlhbAorZnJvbSB0eXBlcyBpbXBvcnQgTWV0aG9kVHlwZQorCit0cnk6CisgICAgaW1wb3J0IF9zc2wKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIG5vIFNTTCBzdXBwb3J0CisgICAgcGFzcworZWxzZToKKyAgICBkZWYgc3NsKHNvY2ssIGtleWZpbGU9Tm9uZSwgY2VydGZpbGU9Tm9uZSk6CisgICAgICAgICMgd2UgZG8gYW4gaW50ZXJuYWwgaW1wb3J0IGhlcmUgYmVjYXVzZSB0aGUgc3NsCisgICAgICAgICMgbW9kdWxlIGltcG9ydHMgdGhlIHNvY2tldCBtb2R1bGUKKyAgICAgICAgaW1wb3J0IHNzbCBhcyBfcmVhbHNzbAorICAgICAgICB3YXJuaW5ncy53YXJuKCJzb2NrZXQuc3NsKCkgaXMgZGVwcmVjYXRlZC4gIFVzZSBzc2wud3JhcF9zb2NrZXQoKSBpbnN0ZWFkLiIsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHJldHVybiBfcmVhbHNzbC5zc2x3cmFwX3NpbXBsZShzb2NrLCBrZXlmaWxlLCBjZXJ0ZmlsZSkKKworICAgICMgd2UgbmVlZCB0byBpbXBvcnQgdGhlIHNhbWUgY29uc3RhbnRzIHdlIHVzZWQgdG8uLi4KKyAgICBmcm9tIF9zc2wgaW1wb3J0IFNTTEVycm9yIGFzIHNzbGVycm9yCisgICAgZnJvbSBfc3NsIGltcG9ydCBcCisgICAgICAgICBSQU5EX2FkZCwgXAorICAgICAgICAgUkFORF9lZ2QsIFwKKyAgICAgICAgIFJBTkRfc3RhdHVzLCBcCisgICAgICAgICBTU0xfRVJST1JfWkVST19SRVRVUk4sIFwKKyAgICAgICAgIFNTTF9FUlJPUl9XQU5UX1JFQUQsIFwKKyAgICAgICAgIFNTTF9FUlJPUl9XQU5UX1dSSVRFLCBcCisgICAgICAgICBTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUCwgXAorICAgICAgICAgU1NMX0VSUk9SX1NZU0NBTEwsIFwKKyAgICAgICAgIFNTTF9FUlJPUl9TU0wsIFwKKyAgICAgICAgIFNTTF9FUlJPUl9XQU5UX0NPTk5FQ1QsIFwKKyAgICAgICAgIFNTTF9FUlJPUl9FT0YsIFwKKyAgICAgICAgIFNTTF9FUlJPUl9JTlZBTElEX0VSUk9SX0NPREUKKworaW1wb3J0IG9zLCBzeXMsIHdhcm5pbmdzCisKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCit0cnk6CisgICAgaW1wb3J0IGVycm5vCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZXJybm8gPSBOb25lCitFQkFERiA9IGdldGF0dHIoZXJybm8sICdFQkFERicsIDkpCitFSU5UUiA9IGdldGF0dHIoZXJybm8sICdFSU5UUicsIDQpCisKK19fYWxsX18gPSBbImdldGZxZG4iLCAiY3JlYXRlX2Nvbm5lY3Rpb24iXQorX19hbGxfXy5leHRlbmQob3MuX2dldF9leHBvcnRzX2xpc3QoX3NvY2tldCkpCisKKworX3JlYWxzb2NrZXQgPSBzb2NrZXQKKworIyBXU0EgZXJyb3IgY29kZXMKK2lmIHN5cy5wbGF0Zm9ybS5sb3dlcigpLnN0YXJ0c3dpdGgoIndpbiIpOgorICAgIGVycm9yVGFiID0ge30KKyAgICBlcnJvclRhYlsxMDAwNF0gPSAiVGhlIG9wZXJhdGlvbiB3YXMgaW50ZXJydXB0ZWQuIgorICAgIGVycm9yVGFiWzEwMDA5XSA9ICJBIGJhZCBmaWxlIGhhbmRsZSB3YXMgcGFzc2VkLiIKKyAgICBlcnJvclRhYlsxMDAxM10gPSAiUGVybWlzc2lvbiBkZW5pZWQuIgorICAgIGVycm9yVGFiWzEwMDE0XSA9ICJBIGZhdWx0IG9jY3VycmVkIG9uIHRoZSBuZXR3b3JrPz8iICMgV1NBRUZBVUxUCisgICAgZXJyb3JUYWJbMTAwMjJdID0gIkFuIGludmFsaWQgb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQuIgorICAgIGVycm9yVGFiWzEwMDM1XSA9ICJUaGUgc29ja2V0IG9wZXJhdGlvbiB3b3VsZCBibG9jayIKKyAgICBlcnJvclRhYlsxMDAzNl0gPSAiQSBibG9ja2luZyBvcGVyYXRpb24gaXMgYWxyZWFkeSBpbiBwcm9ncmVzcy4iCisgICAgZXJyb3JUYWJbMTAwNDhdID0gIlRoZSBuZXR3b3JrIGFkZHJlc3MgaXMgaW4gdXNlLiIKKyAgICBlcnJvclRhYlsxMDA1NF0gPSAiVGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4gcmVzZXQuIgorICAgIGVycm9yVGFiWzEwMDU4XSA9ICJUaGUgbmV0d29yayBoYXMgYmVlbiBzaHV0IGRvd24uIgorICAgIGVycm9yVGFiWzEwMDYwXSA9ICJUaGUgb3BlcmF0aW9uIHRpbWVkIG91dC4iCisgICAgZXJyb3JUYWJbMTAwNjFdID0gIkNvbm5lY3Rpb24gcmVmdXNlZC4iCisgICAgZXJyb3JUYWJbMTAwNjNdID0gIlRoZSBuYW1lIGlzIHRvbyBsb25nLiIKKyAgICBlcnJvclRhYlsxMDA2NF0gPSAiVGhlIGhvc3QgaXMgZG93bi4iCisgICAgZXJyb3JUYWJbMTAwNjVdID0gIlRoZSBob3N0IGlzIHVucmVhY2hhYmxlLiIKKyAgICBfX2FsbF9fLmFwcGVuZCgiZXJyb3JUYWIiKQorCisKKworZGVmIGdldGZxZG4obmFtZT0nJyk6CisgICAgIiIiR2V0IGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZSBmcm9tIG5hbWUuCisKKyAgICBBbiBlbXB0eSBhcmd1bWVudCBpcyBpbnRlcnByZXRlZCBhcyBtZWFuaW5nIHRoZSBsb2NhbCBob3N0LgorCisgICAgRmlyc3QgdGhlIGhvc3RuYW1lIHJldHVybmVkIGJ5IGdldGhvc3RieWFkZHIoKSBpcyBjaGVja2VkLCB0aGVuCisgICAgcG9zc2libHkgZXhpc3RpbmcgYWxpYXNlcy4gSW4gY2FzZSBubyBGUUROIGlzIGF2YWlsYWJsZSwgaG9zdG5hbWUKKyAgICBmcm9tIGdldGhvc3RuYW1lKCkgaXMgcmV0dXJuZWQuCisgICAgIiIiCisgICAgbmFtZSA9IG5hbWUuc3RyaXAoKQorICAgIGlmIG5vdCBuYW1lIG9yIG5hbWUgPT0gJzAuMC4wLjAnOgorICAgICAgICBuYW1lID0gZ2V0aG9zdG5hbWUoKQorICAgIHRyeToKKyAgICAgICAgaG9zdG5hbWUsIGFsaWFzZXMsIGlwYWRkcnMgPSBnZXRob3N0YnlhZGRyKG5hbWUpCisgICAgZXhjZXB0IGVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgYWxpYXNlcy5pbnNlcnQoMCwgaG9zdG5hbWUpCisgICAgICAgIGZvciBuYW1lIGluIGFsaWFzZXM6CisgICAgICAgICAgICBpZiAnLicgaW4gbmFtZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9IGhvc3RuYW1lCisgICAgcmV0dXJuIG5hbWUKKworCitfc29ja2V0bWV0aG9kcyA9ICgKKyAgICAnYmluZCcsICdjb25uZWN0JywgJ2Nvbm5lY3RfZXgnLCAnZmlsZW5vJywgJ2xpc3RlbicsCisgICAgJ2dldHBlZXJuYW1lJywgJ2dldHNvY2tuYW1lJywgJ2dldHNvY2tvcHQnLCAnc2V0c29ja29wdCcsCisgICAgJ3NlbmRhbGwnLCAnc2V0YmxvY2tpbmcnLAorICAgICdzZXR0aW1lb3V0JywgJ2dldHRpbWVvdXQnLCAnc2h1dGRvd24nKQorCitpZiBvcy5uYW1lID09ICJudCI6CisgICAgX3NvY2tldG1ldGhvZHMgPSBfc29ja2V0bWV0aG9kcyArICgnaW9jdGwnLCkKKworaWYgc3lzLnBsYXRmb3JtID09ICJyaXNjb3MiOgorICAgIF9zb2NrZXRtZXRob2RzID0gX3NvY2tldG1ldGhvZHMgKyAoJ3NsZWVwdGFza3cnLCkKKworIyBBbGwgdGhlIG1ldGhvZCBuYW1lcyB0aGF0IG11c3QgYmUgZGVsZWdhdGVkIHRvIGVpdGhlciB0aGUgcmVhbCBzb2NrZXQKKyMgb2JqZWN0IG9yIHRoZSBfY2xvc2Vkc29ja2V0IG9iamVjdC4KK19kZWxlZ2F0ZV9tZXRob2RzID0gKCJyZWN2IiwgInJlY3Zmcm9tIiwgInJlY3ZfaW50byIsICJyZWN2ZnJvbV9pbnRvIiwKKyAgICAgICAgICAgICAgICAgICAgICJzZW5kIiwgInNlbmR0byIpCisKK2NsYXNzIF9jbG9zZWRzb2NrZXQob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbXQorICAgIGRlZiBfZHVtbXkoKmFyZ3MpOgorICAgICAgICByYWlzZSBlcnJvcihFQkFERiwgJ0JhZCBmaWxlIGRlc2NyaXB0b3InKQorICAgICMgQWxsIF9kZWxlZ2F0ZV9tZXRob2RzIG11c3QgYWxzbyBiZSBpbml0aWFsaXplZCBoZXJlLgorICAgIHNlbmQgPSByZWN2ID0gcmVjdl9pbnRvID0gc2VuZHRvID0gcmVjdmZyb20gPSByZWN2ZnJvbV9pbnRvID0gX2R1bW15CisgICAgX19nZXRhdHRyX18gPSBfZHVtbXkKKworIyBXcmFwcGVyIGFyb3VuZCBwbGF0Zm9ybSBzb2NrZXQgb2JqZWN0cy4gVGhpcyBpbXBsZW1lbnRzCisjIGEgcGxhdGZvcm0taW5kZXBlbmRlbnQgZHVwKCkgZnVuY3Rpb25hbGl0eS4gVGhlCisjIGltcGxlbWVudGF0aW9uIGN1cnJlbnRseSByZWxpZXMgb24gcmVmZXJlbmNlIGNvdW50aW5nCisjIHRvIGNsb3NlIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuCitjbGFzcyBfc29ja2V0b2JqZWN0KG9iamVjdCk6CisKKyAgICBfX2RvY19fID0gX3JlYWxzb2NrZXQuX19kb2NfXworCisgICAgX19zbG90c19fID0gWyJfc29jayIsICJfX3dlYWtyZWZfXyJdICsgbGlzdChfZGVsZWdhdGVfbWV0aG9kcykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmYW1pbHk9QUZfSU5FVCwgdHlwZT1TT0NLX1NUUkVBTSwgcHJvdG89MCwgX3NvY2s9Tm9uZSk6CisgICAgICAgIGlmIF9zb2NrIGlzIE5vbmU6CisgICAgICAgICAgICBfc29jayA9IF9yZWFsc29ja2V0KGZhbWlseSwgdHlwZSwgcHJvdG8pCisgICAgICAgIHNlbGYuX3NvY2sgPSBfc29jaworICAgICAgICBmb3IgbWV0aG9kIGluIF9kZWxlZ2F0ZV9tZXRob2RzOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBtZXRob2QsIGdldGF0dHIoX3NvY2ssIG1ldGhvZCkpCisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgX2Nsb3NlZHNvY2tldD1fY2xvc2Vkc29ja2V0LAorICAgICAgICAgICAgICBfZGVsZWdhdGVfbWV0aG9kcz1fZGVsZWdhdGVfbWV0aG9kcywgc2V0YXR0cj1zZXRhdHRyKToKKyAgICAgICAgIyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgcmVmZXJlbmNlIGFueSBnbG9iYWxzLiBTZWUgaXNzdWUgIzgwODE2NC4KKyAgICAgICAgc2VsZi5fc29jayA9IF9jbG9zZWRzb2NrZXQoKQorICAgICAgICBkdW1teSA9IHNlbGYuX3NvY2suX2R1bW15CisgICAgICAgIGZvciBtZXRob2QgaW4gX2RlbGVnYXRlX21ldGhvZHM6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG1ldGhvZCwgZHVtbXkpCisgICAgY2xvc2UuX19kb2NfXyA9IF9yZWFsc29ja2V0LmNsb3NlLl9fZG9jX18KKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIHNvY2ssIGFkZHIgPSBzZWxmLl9zb2NrLmFjY2VwdCgpCisgICAgICAgIHJldHVybiBfc29ja2V0b2JqZWN0KF9zb2NrPXNvY2spLCBhZGRyCisgICAgYWNjZXB0Ll9fZG9jX18gPSBfcmVhbHNvY2tldC5hY2NlcHQuX19kb2NfXworCisgICAgZGVmIGR1cChzZWxmKToKKyAgICAgICAgIiIiZHVwKCkgLT4gc29ja2V0IG9iamVjdAorCisgICAgICAgIFJldHVybiBhIG5ldyBzb2NrZXQgb2JqZWN0IGNvbm5lY3RlZCB0byB0aGUgc2FtZSBzeXN0ZW0gcmVzb3VyY2UuIiIiCisgICAgICAgIHJldHVybiBfc29ja2V0b2JqZWN0KF9zb2NrPXNlbGYuX3NvY2spCisKKyAgICBkZWYgbWFrZWZpbGUoc2VsZiwgbW9kZT0ncicsIGJ1ZnNpemU9LTEpOgorICAgICAgICAiIiJtYWtlZmlsZShbbW9kZVssIGJ1ZnNpemVdXSkgLT4gZmlsZSBvYmplY3QKKworICAgICAgICBSZXR1cm4gYSByZWd1bGFyIGZpbGUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNvY2tldC4gIFRoZSBtb2RlCisgICAgICAgIGFuZCBidWZzaXplIGFyZ3VtZW50cyBhcmUgYXMgZm9yIHRoZSBidWlsdC1pbiBvcGVuKCkgZnVuY3Rpb24uIiIiCisgICAgICAgIHJldHVybiBfZmlsZW9iamVjdChzZWxmLl9zb2NrLCBtb2RlLCBidWZzaXplKQorCisgICAgZmFtaWx5ID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IHNlbGYuX3NvY2suZmFtaWx5LCBkb2M9InRoZSBzb2NrZXQgZmFtaWx5IikKKyAgICB0eXBlID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IHNlbGYuX3NvY2sudHlwZSwgZG9jPSJ0aGUgc29ja2V0IHR5cGUiKQorICAgIHByb3RvID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IHNlbGYuX3NvY2sucHJvdG8sIGRvYz0idGhlIHNvY2tldCBwcm90b2NvbCIpCisKK2RlZiBtZXRoKG5hbWUsc2VsZiwqYXJncyk6CisgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fc29jayxuYW1lKSgqYXJncykKKworZm9yIF9tIGluIF9zb2NrZXRtZXRob2RzOgorICAgIHAgPSBwYXJ0aWFsKG1ldGgsX20pCisgICAgcC5fX25hbWVfXyA9IF9tCisgICAgcC5fX2RvY19fID0gZ2V0YXR0cihfcmVhbHNvY2tldCxfbSkuX19kb2NfXworICAgIG0gPSBNZXRob2RUeXBlKHAsTm9uZSxfc29ja2V0b2JqZWN0KQorICAgIHNldGF0dHIoX3NvY2tldG9iamVjdCxfbSxtKQorCitzb2NrZXQgPSBTb2NrZXRUeXBlID0gX3NvY2tldG9iamVjdAorCitjbGFzcyBfZmlsZW9iamVjdChvYmplY3QpOgorICAgICIiIkZhdXggZmlsZSBvYmplY3QgYXR0YWNoZWQgdG8gYSBzb2NrZXQgb2JqZWN0LiIiIgorCisgICAgZGVmYXVsdF9idWZzaXplID0gODE5MgorICAgIG5hbWUgPSAiPHNvY2tldD4iCisKKyAgICBfX3Nsb3RzX18gPSBbIm1vZGUiLCAiYnVmc2l6ZSIsICJzb2Z0c3BhY2UiLAorICAgICAgICAgICAgICAgICAjICJjbG9zZWQiIGlzIGEgcHJvcGVydHksIHNlZSBiZWxvdworICAgICAgICAgICAgICAgICAiX3NvY2siLCAiX3JidWZzaXplIiwgIl93YnVmc2l6ZSIsICJfcmJ1ZiIsICJfd2J1ZiIsICJfd2J1Zl9sZW4iLAorICAgICAgICAgICAgICAgICAiX2Nsb3NlIl0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NrLCBtb2RlPSdyYicsIGJ1ZnNpemU9LTEsIGNsb3NlPUZhbHNlKToKKyAgICAgICAgc2VsZi5fc29jayA9IHNvY2sKKyAgICAgICAgc2VsZi5tb2RlID0gbW9kZSAjIE5vdCBhY3R1YWxseSB1c2VkIGluIHRoaXMgdmVyc2lvbgorICAgICAgICBpZiBidWZzaXplIDwgMDoKKyAgICAgICAgICAgIGJ1ZnNpemUgPSBzZWxmLmRlZmF1bHRfYnVmc2l6ZQorICAgICAgICBzZWxmLmJ1ZnNpemUgPSBidWZzaXplCisgICAgICAgIHNlbGYuc29mdHNwYWNlID0gRmFsc2UKKyAgICAgICAgIyBfcmJ1ZnNpemUgaXMgdGhlIHN1Z2dlc3RlZCByZWN2IGJ1ZmZlciBzaXplLiAgSXQgaXMgKnN0cmljdGx5KgorICAgICAgICAjIG9iZXllZCB3aXRoaW4gcmVhZGxpbmUoKSBmb3IgcmVjdiBjYWxscy4gIElmIGl0IGlzIGxhcmdlciB0aGFuCisgICAgICAgICMgZGVmYXVsdF9idWZzaXplIGl0IHdpbGwgYmUgdXNlZCBmb3IgcmVjdiBjYWxscyB3aXRoaW4gcmVhZCgpLgorICAgICAgICBpZiBidWZzaXplID09IDA6CisgICAgICAgICAgICBzZWxmLl9yYnVmc2l6ZSA9IDEKKyAgICAgICAgZWxpZiBidWZzaXplID09IDE6CisgICAgICAgICAgICBzZWxmLl9yYnVmc2l6ZSA9IHNlbGYuZGVmYXVsdF9idWZzaXplCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9yYnVmc2l6ZSA9IGJ1ZnNpemUKKyAgICAgICAgc2VsZi5fd2J1ZnNpemUgPSBidWZzaXplCisgICAgICAgICMgV2UgdXNlIFN0cmluZ0lPIGZvciB0aGUgcmVhZCBidWZmZXIgdG8gYXZvaWQgaG9sZGluZyBhIGxpc3QKKyAgICAgICAgIyBvZiB2YXJpb3VzbHkgc2l6ZWQgc3RyaW5nIG9iamVjdHMgd2hpY2ggaGF2ZSBiZWVuIGtub3duIHRvCisgICAgICAgICMgZnJhZ21lbnQgdGhlIGhlYXAgZHVlIHRvIGhvdyB0aGV5IGFyZSBtYWxsb2MoKWVkIGFuZCBvZnRlbgorICAgICAgICAjIHJlYWxsb2MoKWVkIGRvd24gbXVjaCBzbWFsbGVyIHRoYW4gdGhlaXIgb3JpZ2luYWwgYWxsb2NhdGlvbi4KKyAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fd2J1ZiA9IFtdICMgQSBsaXN0IG9mIHN0cmluZ3MKKyAgICAgICAgc2VsZi5fd2J1Zl9sZW4gPSAwCisgICAgICAgIHNlbGYuX2Nsb3NlID0gY2xvc2UKKworICAgIGRlZiBfZ2V0Y2xvc2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc29jayBpcyBOb25lCisgICAgY2xvc2VkID0gcHJvcGVydHkoX2dldGNsb3NlZCwgZG9jPSJUcnVlIGlmIHRoZSBmaWxlIGlzIGNsb3NlZCIpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX3NvY2s6CisgICAgICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBzZWxmLl9jbG9zZToKKyAgICAgICAgICAgICAgICBzZWxmLl9zb2NrLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuX3NvY2sgPSBOb25lCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICMgY2xvc2UoKSBtYXkgZmFpbCBpZiBfX2luaXRfXyBkaWRuJ3QgY29tcGxldGUKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fd2J1ZjoKKyAgICAgICAgICAgIGRhdGEgPSAiIi5qb2luKHNlbGYuX3didWYpCisgICAgICAgICAgICBzZWxmLl93YnVmID0gW10KKyAgICAgICAgICAgIHNlbGYuX3didWZfbGVuID0gMAorICAgICAgICAgICAgYnVmZmVyX3NpemUgPSBtYXgoc2VsZi5fcmJ1ZnNpemUsIHNlbGYuZGVmYXVsdF9idWZzaXplKQorICAgICAgICAgICAgZGF0YV9zaXplID0gbGVuKGRhdGEpCisgICAgICAgICAgICB3cml0ZV9vZmZzZXQgPSAwCisgICAgICAgICAgICB2aWV3ID0gbWVtb3J5dmlldyhkYXRhKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdoaWxlIHdyaXRlX29mZnNldCA8IGRhdGFfc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc29jay5zZW5kYWxsKHZpZXdbd3JpdGVfb2Zmc2V0OndyaXRlX29mZnNldCtidWZmZXJfc2l6ZV0pCisgICAgICAgICAgICAgICAgICAgIHdyaXRlX29mZnNldCArPSBidWZmZXJfc2l6ZQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiB3cml0ZV9vZmZzZXQgPCBkYXRhX3NpemU6CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlciA9IGRhdGFbd3JpdGVfb2Zmc2V0Ol0KKyAgICAgICAgICAgICAgICAgICAgZGVsIHZpZXcsIGRhdGEgICMgZXhwbGljaXQgZnJlZQorICAgICAgICAgICAgICAgICAgICBzZWxmLl93YnVmLmFwcGVuZChyZW1haW5kZXIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3didWZfbGVuID0gbGVuKHJlbWFpbmRlcikKKworICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zb2NrLmZpbGVubygpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgIGRhdGEgPSBzdHIoZGF0YSkgIyBYWFggU2hvdWxkIHJlYWxseSByZWplY3Qgbm9uLXN0cmluZyBub24tYnVmZmVycworICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl93YnVmLmFwcGVuZChkYXRhKQorICAgICAgICBzZWxmLl93YnVmX2xlbiArPSBsZW4oZGF0YSkKKyAgICAgICAgaWYgKHNlbGYuX3didWZzaXplID09IDAgb3IKKyAgICAgICAgICAgIChzZWxmLl93YnVmc2l6ZSA9PSAxIGFuZCAnXG4nIGluIGRhdGEpIG9yCisgICAgICAgICAgICAoc2VsZi5fd2J1ZnNpemUgPiAxIGFuZCBzZWxmLl93YnVmX2xlbiA+PSBzZWxmLl93YnVmc2l6ZSkpOgorICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisKKyAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBsaXN0KToKKyAgICAgICAgIyBYWFggV2UgY291bGQgZG8gYmV0dGVyIGhlcmUgZm9yIHZlcnkgbG9uZyBsaXN0cworICAgICAgICAjIFhYWCBTaG91bGQgcmVhbGx5IHJlamVjdCBub24tc3RyaW5nIG5vbi1idWZmZXJzCisgICAgICAgIGxpbmVzID0gZmlsdGVyKE5vbmUsIG1hcChzdHIsIGxpc3QpKQorICAgICAgICBzZWxmLl93YnVmX2xlbiArPSBzdW0obWFwKGxlbiwgbGluZXMpKQorICAgICAgICBzZWxmLl93YnVmLmV4dGVuZChsaW5lcykKKyAgICAgICAgaWYgKHNlbGYuX3didWZzaXplIDw9IDEgb3IKKyAgICAgICAgICAgIHNlbGYuX3didWZfbGVuID49IHNlbGYuX3didWZzaXplKToKKyAgICAgICAgICAgIHNlbGYuZmx1c2goKQorCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT0tMSk6CisgICAgICAgICMgVXNlIG1heCwgZGlzYWxsb3cgdGlueSByZWFkcyBpbiBhIGxvb3AgYXMgdGhleSBhcmUgdmVyeSBpbmVmZmljaWVudC4KKyAgICAgICAgIyBXZSBuZXZlciBsZWF2ZSByZWFkKCkgd2l0aCBhbnkgbGVmdG92ZXIgZGF0YSBmcm9tIGEgbmV3IHJlY3YoKSBjYWxsCisgICAgICAgICMgaW4gb3VyIGludGVybmFsIGJ1ZmZlci4KKyAgICAgICAgcmJ1ZnNpemUgPSBtYXgoc2VsZi5fcmJ1ZnNpemUsIHNlbGYuZGVmYXVsdF9idWZzaXplKQorICAgICAgICAjIE91ciB1c2Ugb2YgU3RyaW5nSU8gcmF0aGVyIHRoYW4gbGlzdHMgb2Ygc3RyaW5nIG9iamVjdHMgcmV0dXJuZWQgYnkKKyAgICAgICAgIyByZWN2KCkgbWluaW1pemVzIG1lbW9yeSB1c2FnZSBhbmQgZnJhZ21lbnRhdGlvbiB0aGF0IG9jY3VycyB3aGVuCisgICAgICAgICMgcmJ1ZnNpemUgaXMgbGFyZ2UgY29tcGFyZWQgdG8gdGhlIHR5cGljYWwgcmV0dXJuIHZhbHVlIG9mIHJlY3YoKS4KKyAgICAgICAgYnVmID0gc2VsZi5fcmJ1ZgorICAgICAgICBidWYuc2VlaygwLCAyKSAgIyBzZWVrIGVuZAorICAgICAgICBpZiBzaXplIDwgMDoKKyAgICAgICAgICAgICMgUmVhZCB1bnRpbCBFT0YKKyAgICAgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTygpICAjIHJlc2V0IF9yYnVmLiAgd2UgY29uc3VtZSBpdCB2aWEgYnVmLgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9zb2NrLnJlY3YocmJ1ZnNpemUpCisgICAgICAgICAgICAgICAgZXhjZXB0IGVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gPT0gRUlOVFI6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGJ1Zi53cml0ZShkYXRhKQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5nZXR2YWx1ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFJlYWQgdW50aWwgc2l6ZSBieXRlcyBvciBFT0Ygc2Vlbiwgd2hpY2hldmVyIGNvbWVzIGZpcnN0CisgICAgICAgICAgICBidWZfbGVuID0gYnVmLnRlbGwoKQorICAgICAgICAgICAgaWYgYnVmX2xlbiA+PSBzaXplOgorICAgICAgICAgICAgICAgICMgQWxyZWFkeSBoYXZlIHNpemUgYnl0ZXMgaW4gb3VyIGJ1ZmZlcj8gIEV4dHJhY3QgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICBidWYuc2VlaygwKQorICAgICAgICAgICAgICAgIHJ2ID0gYnVmLnJlYWQoc2l6ZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIHNlbGYuX3JidWYud3JpdGUoYnVmLnJlYWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcnYKKworICAgICAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKCkgICMgcmVzZXQgX3JidWYuICB3ZSBjb25zdW1lIGl0IHZpYSBidWYuCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGxlZnQgPSBzaXplIC0gYnVmX2xlbgorICAgICAgICAgICAgICAgICMgcmVjdigpIHdpbGwgbWFsbG9jIHRoZSBhbW91bnQgb2YgbWVtb3J5IGdpdmVuIGFzIGl0cworICAgICAgICAgICAgICAgICMgcGFyYW1ldGVyIGV2ZW4gdGhvdWdoIGl0IG9mdGVuIHJldHVybnMgbXVjaCBsZXNzIGRhdGEKKyAgICAgICAgICAgICAgICAjIHRoYW4gdGhhdC4gIFRoZSByZXR1cm5lZCBkYXRhIHN0cmluZyBpcyBzaG9ydCBsaXZlZAorICAgICAgICAgICAgICAgICMgYXMgd2UgY29weSBpdCBpbnRvIGEgU3RyaW5nSU8gYW5kIGZyZWUgaXQuICBUaGlzIGF2b2lkcworICAgICAgICAgICAgICAgICMgZnJhZ21lbnRhdGlvbiBpc3N1ZXMgb24gbWFueSBwbGF0Zm9ybXMuCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fc29jay5yZWN2KGxlZnQpCisgICAgICAgICAgICAgICAgZXhjZXB0IGVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gPT0gRUlOVFI6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG4gPSBsZW4oZGF0YSkKKyAgICAgICAgICAgICAgICBpZiBuID09IHNpemUgYW5kIG5vdCBidWZfbGVuOgorICAgICAgICAgICAgICAgICAgICAjIFNob3J0Y3V0LiAgQXZvaWQgYnVmZmVyIGRhdGEgY29waWVzIHdoZW46CisgICAgICAgICAgICAgICAgICAgICMgLSBXZSBoYXZlIG5vIGRhdGEgaW4gb3VyIGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgIyBBTkQKKyAgICAgICAgICAgICAgICAgICAgIyAtIE91ciBjYWxsIHRvIHJlY3YgcmV0dXJuZWQgZXhhY3RseSB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyAgIG51bWJlciBvZiBieXRlcyB3ZSB3ZXJlIGFza2VkIHRvIHJlYWQuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgICAgICAgICAgaWYgbiA9PSBsZWZ0OgorICAgICAgICAgICAgICAgICAgICBidWYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgZGVsIGRhdGEgICMgZXhwbGljaXQgZnJlZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGFzc2VydCBuIDw9IGxlZnQsICJyZWN2KCVkKSByZXR1cm5lZCAlZCBieXRlcyIgJSAobGVmdCwgbikKKyAgICAgICAgICAgICAgICBidWYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICBidWZfbGVuICs9IG4KKyAgICAgICAgICAgICAgICBkZWwgZGF0YSAgIyBleHBsaWNpdCBmcmVlCisgICAgICAgICAgICAgICAgI2Fzc2VydCBidWZfbGVuID09IGJ1Zi50ZWxsKCkKKyAgICAgICAgICAgIHJldHVybiBidWYuZ2V0dmFsdWUoKQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9LTEpOgorICAgICAgICBidWYgPSBzZWxmLl9yYnVmCisgICAgICAgIGJ1Zi5zZWVrKDAsIDIpICAjIHNlZWsgZW5kCisgICAgICAgIGlmIGJ1Zi50ZWxsKCkgPiAwOgorICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGJ1ZmZlcgorICAgICAgICAgICAgYnVmLnNlZWsoMCkKKyAgICAgICAgICAgIGJsaW5lID0gYnVmLnJlYWRsaW5lKHNpemUpCisgICAgICAgICAgICBpZiBibGluZS5lbmRzd2l0aCgnXG4nKSBvciBsZW4oYmxpbmUpID09IHNpemU6CisgICAgICAgICAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9yYnVmLndyaXRlKGJ1Zi5yZWFkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGJsaW5lCisgICAgICAgICAgICBkZWwgYmxpbmUKKyAgICAgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgICAgICAjIFJlYWQgdW50aWwgXG4gb3IgRU9GLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QKKyAgICAgICAgICAgIGlmIHNlbGYuX3JidWZzaXplIDw9IDE6CisgICAgICAgICAgICAgICAgIyBTcGVlZCB1cCB1bmJ1ZmZlcmVkIGNhc2UKKyAgICAgICAgICAgICAgICBidWYuc2VlaygwKQorICAgICAgICAgICAgICAgIGJ1ZmZlcnMgPSBbYnVmLnJlYWQoKV0KKyAgICAgICAgICAgICAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8oKSAgIyByZXNldCBfcmJ1Zi4gIHdlIGNvbnN1bWUgaXQgdmlhIGJ1Zi4KKyAgICAgICAgICAgICAgICBkYXRhID0gTm9uZQorICAgICAgICAgICAgICAgIHJlY3YgPSBzZWxmLl9zb2NrLnJlY3YKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBkYXRhICE9ICJcbiI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlY3YoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzLmFwcGVuZChkYXRhKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgZXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSB0cnkuLmV4Y2VwdCB0byBjYXRjaCBFSU5UUiB3YXMgbW92ZWQgb3V0c2lkZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICMgcmVjdiBsb29wIHRvIGF2b2lkIHRoZSBwZXIgYnl0ZSBvdmVyaGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGUuYXJnc1swXSA9PSBFSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiIuam9pbihidWZmZXJzKQorCisgICAgICAgICAgICBidWYuc2VlaygwLCAyKSAgIyBzZWVrIGVuZAorICAgICAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKCkgICMgcmVzZXQgX3JidWYuICB3ZSBjb25zdW1lIGl0IHZpYSBidWYuCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX3NvY2sucmVjdihzZWxmLl9yYnVmc2l6ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgZXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUuYXJnc1swXSA9PSBFSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgbmwgPSBkYXRhLmZpbmQoJ1xuJykKKyAgICAgICAgICAgICAgICBpZiBubCA+PSAwOgorICAgICAgICAgICAgICAgICAgICBubCArPSAxCisgICAgICAgICAgICAgICAgICAgIGJ1Zi53cml0ZShkYXRhWzpubF0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JidWYud3JpdGUoZGF0YVtubDpdKQorICAgICAgICAgICAgICAgICAgICBkZWwgZGF0YQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGJ1Zi53cml0ZShkYXRhKQorICAgICAgICAgICAgcmV0dXJuIGJ1Zi5nZXR2YWx1ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFJlYWQgdW50aWwgc2l6ZSBieXRlcyBvciBcbiBvciBFT0Ygc2Vlbiwgd2hpY2hldmVyIGNvbWVzIGZpcnN0CisgICAgICAgICAgICBidWYuc2VlaygwLCAyKSAgIyBzZWVrIGVuZAorICAgICAgICAgICAgYnVmX2xlbiA9IGJ1Zi50ZWxsKCkKKyAgICAgICAgICAgIGlmIGJ1Zl9sZW4gPj0gc2l6ZToKKyAgICAgICAgICAgICAgICBidWYuc2VlaygwKQorICAgICAgICAgICAgICAgIHJ2ID0gYnVmLnJlYWQoc2l6ZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIHNlbGYuX3JidWYud3JpdGUoYnVmLnJlYWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcnYKKyAgICAgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTygpICAjIHJlc2V0IF9yYnVmLiAgd2UgY29uc3VtZSBpdCB2aWEgYnVmLgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9zb2NrLnJlY3Yoc2VsZi5fcmJ1ZnNpemUpCisgICAgICAgICAgICAgICAgZXhjZXB0IGVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gPT0gRUlOVFI6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGxlZnQgPSBzaXplIC0gYnVmX2xlbgorICAgICAgICAgICAgICAgICMgZGlkIHdlIGp1c3QgcmVjZWl2ZSBhIG5ld2xpbmU/CisgICAgICAgICAgICAgICAgbmwgPSBkYXRhLmZpbmQoJ1xuJywgMCwgbGVmdCkKKyAgICAgICAgICAgICAgICBpZiBubCA+PSAwOgorICAgICAgICAgICAgICAgICAgICBubCArPSAxCisgICAgICAgICAgICAgICAgICAgICMgc2F2ZSB0aGUgZXhjZXNzIGRhdGEgdG8gX3JidWYKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmJ1Zi53cml0ZShkYXRhW25sOl0pCisgICAgICAgICAgICAgICAgICAgIGlmIGJ1Zl9sZW46CisgICAgICAgICAgICAgICAgICAgICAgICBidWYud3JpdGUoZGF0YVs6bmxdKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgU2hvcnRjdXQuICBBdm9pZCBkYXRhIGNvcHkgdGhyb3VnaCBidWYgd2hlbiByZXR1cm5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYSBzdWJzdHJpbmcgb2Ygb3VyIGZpcnN0IHJlY3YoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhWzpubF0KKyAgICAgICAgICAgICAgICBuID0gbGVuKGRhdGEpCisgICAgICAgICAgICAgICAgaWYgbiA9PSBzaXplIGFuZCBub3QgYnVmX2xlbjoKKyAgICAgICAgICAgICAgICAgICAgIyBTaG9ydGN1dC4gIEF2b2lkIGRhdGEgY29weSB0aHJvdWdoIGJ1ZiB3aGVuCisgICAgICAgICAgICAgICAgICAgICMgcmV0dXJuaW5nIGV4YWN0bHkgYWxsIG9mIG91ciBmaXJzdCByZWN2KCkuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgICAgICAgICAgaWYgbiA+PSBsZWZ0OgorICAgICAgICAgICAgICAgICAgICBidWYud3JpdGUoZGF0YVs6bGVmdF0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JidWYud3JpdGUoZGF0YVtsZWZ0Ol0pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgYnVmLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgYnVmX2xlbiArPSBuCisgICAgICAgICAgICAgICAgI2Fzc2VydCBidWZfbGVuID09IGJ1Zi50ZWxsKCkKKyAgICAgICAgICAgIHJldHVybiBidWYuZ2V0dmFsdWUoKQorCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmLCBzaXplaGludD0wKToKKyAgICAgICAgdG90YWwgPSAwCisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGxpc3QuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICB0b3RhbCArPSBsZW4obGluZSkKKyAgICAgICAgICAgIGlmIHNpemVoaW50IGFuZCB0b3RhbCA+PSBzaXplaGludDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gbGlzdAorCisgICAgIyBJdGVyYXRvciBwcm90b2NvbHMKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICByZXR1cm4gbGluZQorCitfR0xPQkFMX0RFRkFVTFRfVElNRU9VVCA9IG9iamVjdCgpCisKK2RlZiBjcmVhdGVfY29ubmVjdGlvbihhZGRyZXNzLCB0aW1lb3V0PV9HTE9CQUxfREVGQVVMVF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzPU5vbmUpOgorICAgICIiIkNvbm5lY3QgdG8gKmFkZHJlc3MqIGFuZCByZXR1cm4gdGhlIHNvY2tldCBvYmplY3QuCisKKyAgICBDb252ZW5pZW5jZSBmdW5jdGlvbi4gIENvbm5lY3QgdG8gKmFkZHJlc3MqIChhIDItdHVwbGUgYGAoaG9zdCwKKyAgICBwb3J0KWBgKSBhbmQgcmV0dXJuIHRoZSBzb2NrZXQgb2JqZWN0LiAgUGFzc2luZyB0aGUgb3B0aW9uYWwKKyAgICAqdGltZW91dCogcGFyYW1ldGVyIHdpbGwgc2V0IHRoZSB0aW1lb3V0IG9uIHRoZSBzb2NrZXQgaW5zdGFuY2UKKyAgICBiZWZvcmUgYXR0ZW1wdGluZyB0byBjb25uZWN0LiAgSWYgbm8gKnRpbWVvdXQqIGlzIHN1cHBsaWVkLCB0aGUKKyAgICBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IHNldHRpbmcgcmV0dXJuZWQgYnkgOmZ1bmM6YGdldGRlZmF1bHR0aW1lb3V0YAorICAgIGlzIHVzZWQuICBJZiAqc291cmNlX2FkZHJlc3MqIGlzIHNldCBpdCBtdXN0IGJlIGEgdHVwbGUgb2YgKGhvc3QsIHBvcnQpCisgICAgZm9yIHRoZSBzb2NrZXQgdG8gYmluZCBhcyBhIHNvdXJjZSBhZGRyZXNzIGJlZm9yZSBtYWtpbmcgdGhlIGNvbm5lY3Rpb24uCisgICAgQW4gaG9zdCBvZiAnJyBvciBwb3J0IDAgdGVsbHMgdGhlIE9TIHRvIHVzZSB0aGUgZGVmYXVsdC4KKyAgICAiIiIKKworICAgIGhvc3QsIHBvcnQgPSBhZGRyZXNzCisgICAgZXJyID0gTm9uZQorICAgIGZvciByZXMgaW4gZ2V0YWRkcmluZm8oaG9zdCwgcG9ydCwgMCwgU09DS19TVFJFQU0pOgorICAgICAgICBhZiwgc29ja3R5cGUsIHByb3RvLCBjYW5vbm5hbWUsIHNhID0gcmVzCisgICAgICAgIHNvY2sgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQoYWYsIHNvY2t0eXBlLCBwcm90bykKKyAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IF9HTE9CQUxfREVGQVVMVF9USU1FT1VUOgorICAgICAgICAgICAgICAgIHNvY2suc2V0dGltZW91dCh0aW1lb3V0KQorICAgICAgICAgICAgaWYgc291cmNlX2FkZHJlc3M6CisgICAgICAgICAgICAgICAgc29jay5iaW5kKHNvdXJjZV9hZGRyZXNzKQorICAgICAgICAgICAgc29jay5jb25uZWN0KHNhKQorICAgICAgICAgICAgcmV0dXJuIHNvY2sKKworICAgICAgICBleGNlcHQgZXJyb3IgYXMgXzoKKyAgICAgICAgICAgIGVyciA9IF8KKyAgICAgICAgICAgIGlmIHNvY2sgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc29jay5jbG9zZSgpCisKKyAgICBpZiBlcnIgaXMgbm90IE5vbmU6CisgICAgICAgIHJhaXNlIGVycgorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIGVycm9yKCJnZXRhZGRyaW5mbyByZXR1cm5zIGFuIGVtcHR5IGxpc3QiKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zb2NrZXQucHljIGIvbGliL3B5dGhvbjIuNy9zb2NrZXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkODhmMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NvY2tldC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zb2NrZXQucHlvIGIvbGliL3B5dGhvbjIuNy9zb2NrZXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzBlZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NvY2tldC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZWYyYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvX19pbml0X18ucHkKQEAgLTAsMCArMSwyNCBAQAorIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCisjIHB5c3FsaXRlMi9fX2luaXRfXy5weTogdGhlIHB5c3FsaXRlMiBwYWNrYWdlLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2Zyb20gZGJhcGkyIGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTgwOGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTgwOGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvZGJhcGkyLnB5IGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL2RiYXBpMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGE3OThiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL2RiYXBpMi5weQpAQCAtMCwwICsxLDg4IEBACisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCisjIHB5c3FsaXRlMi9kYmFwaTIucHk6IHRoZSBEQi1BUEkgMi4wIGludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgdGltZQorCitmcm9tIF9zcWxpdGUzIGltcG9ydCAqCisKK3BhcmFtc3R5bGUgPSAicW1hcmsiCisKK3RocmVhZHNhZmV0eSA9IDEKKworYXBpbGV2ZWwgPSAiMi4wIgorCitEYXRlID0gZGF0ZXRpbWUuZGF0ZQorCitUaW1lID0gZGF0ZXRpbWUudGltZQorCitUaW1lc3RhbXAgPSBkYXRldGltZS5kYXRldGltZQorCitkZWYgRGF0ZUZyb21UaWNrcyh0aWNrcyk6CisgICAgcmV0dXJuIERhdGUoKnRpbWUubG9jYWx0aW1lKHRpY2tzKVs6M10pCisKK2RlZiBUaW1lRnJvbVRpY2tzKHRpY2tzKToKKyAgICByZXR1cm4gVGltZSgqdGltZS5sb2NhbHRpbWUodGlja3MpWzM6Nl0pCisKK2RlZiBUaW1lc3RhbXBGcm9tVGlja3ModGlja3MpOgorICAgIHJldHVybiBUaW1lc3RhbXAoKnRpbWUubG9jYWx0aW1lKHRpY2tzKVs6Nl0pCisKK3ZlcnNpb25faW5mbyA9IHR1cGxlKFtpbnQoeCkgZm9yIHggaW4gdmVyc2lvbi5zcGxpdCgiLiIpXSkKK3NxbGl0ZV92ZXJzaW9uX2luZm8gPSB0dXBsZShbaW50KHgpIGZvciB4IGluIHNxbGl0ZV92ZXJzaW9uLnNwbGl0KCIuIildKQorCitCaW5hcnkgPSBidWZmZXIKKworZGVmIHJlZ2lzdGVyX2FkYXB0ZXJzX2FuZF9jb252ZXJ0ZXJzKCk6CisgICAgZGVmIGFkYXB0X2RhdGUodmFsKToKKyAgICAgICAgcmV0dXJuIHZhbC5pc29mb3JtYXQoKQorCisgICAgZGVmIGFkYXB0X2RhdGV0aW1lKHZhbCk6CisgICAgICAgIHJldHVybiB2YWwuaXNvZm9ybWF0KCIgIikKKworICAgIGRlZiBjb252ZXJ0X2RhdGUodmFsKToKKyAgICAgICAgcmV0dXJuIGRhdGV0aW1lLmRhdGUoKm1hcChpbnQsIHZhbC5zcGxpdCgiLSIpKSkKKworICAgIGRlZiBjb252ZXJ0X3RpbWVzdGFtcCh2YWwpOgorICAgICAgICBkYXRlcGFydCwgdGltZXBhcnQgPSB2YWwuc3BsaXQoIiAiKQorICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gbWFwKGludCwgZGF0ZXBhcnQuc3BsaXQoIi0iKSkKKyAgICAgICAgdGltZXBhcnRfZnVsbCA9IHRpbWVwYXJ0LnNwbGl0KCIuIikKKyAgICAgICAgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMgPSBtYXAoaW50LCB0aW1lcGFydF9mdWxsWzBdLnNwbGl0KCI6IikpCisgICAgICAgIGlmIGxlbih0aW1lcGFydF9mdWxsKSA9PSAyOgorICAgICAgICAgICAgbWljcm9zZWNvbmRzID0gaW50KCd7OjA8Ni42fScuZm9ybWF0KHRpbWVwYXJ0X2Z1bGxbMV0uZGVjb2RlKCkpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWljcm9zZWNvbmRzID0gMAorCisgICAgICAgIHZhbCA9IGRhdGV0aW1lLmRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWNyb3NlY29uZHMpCisgICAgICAgIHJldHVybiB2YWwKKworCisgICAgcmVnaXN0ZXJfYWRhcHRlcihkYXRldGltZS5kYXRlLCBhZGFwdF9kYXRlKQorICAgIHJlZ2lzdGVyX2FkYXB0ZXIoZGF0ZXRpbWUuZGF0ZXRpbWUsIGFkYXB0X2RhdGV0aW1lKQorICAgIHJlZ2lzdGVyX2NvbnZlcnRlcigiZGF0ZSIsIGNvbnZlcnRfZGF0ZSkKKyAgICByZWdpc3Rlcl9jb252ZXJ0ZXIoInRpbWVzdGFtcCIsIGNvbnZlcnRfdGltZXN0YW1wKQorCityZWdpc3Rlcl9hZGFwdGVyc19hbmRfY29udmVydGVycygpCisKKyMgQ2xlYW4gdXAgbmFtZXNwYWNlCisKK2RlbChyZWdpc3Rlcl9hZGFwdGVyc19hbmRfY29udmVydGVycykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy9kYmFwaTIucHljIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL2RiYXBpMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4NDZmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9kYmFwaTIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy9kYmFwaTIucHlvIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL2RiYXBpMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4NDZmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9kYmFwaTIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy9kdW1wLnB5IGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL2R1bXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjNWVmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9kdW1wLnB5CkBAIC0wLDAgKzEsNzAgQEAKKyMgTWltaWMgdGhlIHNxbGl0ZTMgY29uc29sZSBzaGVsbCdzIC5kdW1wIGNvbW1hbmQKKyMgQXV0aG9yOiBQYXVsIEtpcHBlcyA8a2lwcGVzcEBnbWFpbC5jb20+CisKKyMgRXZlcnkgaWRlbnRpZmllciBpbiBzcWwgaXMgcXVvdGVkIGJhc2VkIG9uIGEgY29tbWVudCBpbiBzcWxpdGUKKyMgZG9jdW1lbnRhdGlvbiAiU1FMaXRlIGFkZHMgbmV3IGtleXdvcmRzIGZyb20gdGltZSB0byB0aW1lIHdoZW4gaXQKKyMgdGFrZXMgb24gbmV3IGZlYXR1cmVzLiBTbyB0byBwcmV2ZW50IHlvdXIgY29kZSBmcm9tIGJlaW5nIGJyb2tlbiBieQorIyBmdXR1cmUgZW5oYW5jZW1lbnRzLCB5b3Ugc2hvdWxkIG5vcm1hbGx5IHF1b3RlIGFueSBpZGVudGlmaWVyIHRoYXQKKyMgaXMgYW4gRW5nbGlzaCBsYW5ndWFnZSB3b3JkLCBldmVuIGlmIHlvdSBkbyBub3QgaGF2ZSB0by4iCisKK2RlZiBfaXRlcmR1bXAoY29ubmVjdGlvbik6CisgICAgIiIiCisgICAgUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZHVtcCBvZiB0aGUgZGF0YWJhc2UgaW4gYW4gU1FMIHRleHQgZm9ybWF0LgorCisgICAgVXNlZCB0byBwcm9kdWNlIGFuIFNRTCBkdW1wIG9mIHRoZSBkYXRhYmFzZS4gIFVzZWZ1bCB0byBzYXZlIGFuIGluLW1lbW9yeQorICAgIGRhdGFiYXNlIGZvciBsYXRlciByZXN0b3JhdGlvbi4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBjYWxsZWQKKyAgICBkaXJlY3RseSBidXQgaW5zdGVhZCBjYWxsZWQgZnJvbSB0aGUgQ29ubmVjdGlvbiBtZXRob2QsIGl0ZXJkdW1wKCkuCisgICAgIiIiCisKKyAgICBjdSA9IGNvbm5lY3Rpb24uY3Vyc29yKCkKKyAgICB5aWVsZCgnQkVHSU4gVFJBTlNBQ1RJT047JykKKworICAgICMgc3FsaXRlX21hc3RlciB0YWJsZSBjb250YWlucyB0aGUgU1FMIENSRUFURSBzdGF0ZW1lbnRzIGZvciB0aGUgZGF0YWJhc2UuCisgICAgcSA9ICIiIgorICAgICAgICBTRUxFQ1QgIm5hbWUiLCAidHlwZSIsICJzcWwiCisgICAgICAgIEZST00gInNxbGl0ZV9tYXN0ZXIiCisgICAgICAgICAgICBXSEVSRSAic3FsIiBOT1QgTlVMTCBBTkQKKyAgICAgICAgICAgICJ0eXBlIiA9PSAndGFibGUnCisgICAgICAgICAgICBPUkRFUiBCWSAibmFtZSIKKyAgICAgICAgIiIiCisgICAgc2NoZW1hX3JlcyA9IGN1LmV4ZWN1dGUocSkKKyAgICBmb3IgdGFibGVfbmFtZSwgdHlwZSwgc3FsIGluIHNjaGVtYV9yZXMuZmV0Y2hhbGwoKToKKyAgICAgICAgaWYgdGFibGVfbmFtZSA9PSAnc3FsaXRlX3NlcXVlbmNlJzoKKyAgICAgICAgICAgIHlpZWxkKCdERUxFVEUgRlJPTSAic3FsaXRlX3NlcXVlbmNlIjsnKQorICAgICAgICBlbGlmIHRhYmxlX25hbWUgPT0gJ3NxbGl0ZV9zdGF0MSc6CisgICAgICAgICAgICB5aWVsZCgnQU5BTFlaRSAic3FsaXRlX21hc3RlciI7JykKKyAgICAgICAgZWxpZiB0YWJsZV9uYW1lLnN0YXJ0c3dpdGgoJ3NxbGl0ZV8nKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICMgTk9URTogVmlydHVhbCB0YWJsZSBzdXBwb3J0IG5vdCBpbXBsZW1lbnRlZAorICAgICAgICAjZWxpZiBzcWwuc3RhcnRzd2l0aCgnQ1JFQVRFIFZJUlRVQUwgVEFCTEUnKToKKyAgICAgICAgIyAgICBxdGFibGUgPSB0YWJsZV9uYW1lLnJlcGxhY2UoIiciLCAiJyciKQorICAgICAgICAjICAgIHlpZWxkKCJJTlNFUlQgSU5UTyBzcWxpdGVfbWFzdGVyKHR5cGUsbmFtZSx0YmxfbmFtZSxyb290cGFnZSxzcWwpIlwKKyAgICAgICAgIyAgICAgICAgIlZBTFVFUygndGFibGUnLCd7MH0nLCd7MH0nLDAsJ3sxfScpOyIuZm9ybWF0KAorICAgICAgICAjICAgICAgICBxdGFibGUsCisgICAgICAgICMgICAgICAgIHNxbC5yZXBsYWNlKCInJyIpKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHlpZWxkKCclczsnICUgc3FsKQorCisgICAgICAgICMgQnVpbGQgdGhlIGluc2VydCBzdGF0ZW1lbnQgZm9yIGVhY2ggcm93IG9mIHRoZSBjdXJyZW50IHRhYmxlCisgICAgICAgIHRhYmxlX25hbWVfaWRlbnQgPSB0YWJsZV9uYW1lLnJlcGxhY2UoJyInLCAnIiInKQorICAgICAgICByZXMgPSBjdS5leGVjdXRlKCdQUkFHTUEgdGFibGVfaW5mbygiezB9IiknLmZvcm1hdCh0YWJsZV9uYW1lX2lkZW50KSkKKyAgICAgICAgY29sdW1uX25hbWVzID0gW3N0cih0YWJsZV9pbmZvWzFdKSBmb3IgdGFibGVfaW5mbyBpbiByZXMuZmV0Y2hhbGwoKV0KKyAgICAgICAgcSA9ICIiIlNFTEVDVCAnSU5TRVJUIElOVE8gInswfSIgVkFMVUVTKHsxfSknIEZST00gInswfSI7IiIiLmZvcm1hdCgKKyAgICAgICAgICAgIHRhYmxlX25hbWVfaWRlbnQsCisgICAgICAgICAgICAiLCIuam9pbigiIiInfHxxdW90ZSgiezB9Iil8fCciIiIuZm9ybWF0KGNvbC5yZXBsYWNlKCciJywgJyIiJykpIGZvciBjb2wgaW4gY29sdW1uX25hbWVzKSkKKyAgICAgICAgcXVlcnlfcmVzID0gY3UuZXhlY3V0ZShxKQorICAgICAgICBmb3Igcm93IGluIHF1ZXJ5X3JlczoKKyAgICAgICAgICAgIHlpZWxkKCIlczsiICUgcm93WzBdKQorCisgICAgIyBOb3cgd2hlbiB0aGUgdHlwZSBpcyAnaW5kZXgnLCAndHJpZ2dlcicsIG9yICd2aWV3JworICAgIHEgPSAiIiIKKyAgICAgICAgU0VMRUNUICJuYW1lIiwgInR5cGUiLCAic3FsIgorICAgICAgICBGUk9NICJzcWxpdGVfbWFzdGVyIgorICAgICAgICAgICAgV0hFUkUgInNxbCIgTk9UIE5VTEwgQU5ECisgICAgICAgICAgICAidHlwZSIgSU4gKCdpbmRleCcsICd0cmlnZ2VyJywgJ3ZpZXcnKQorICAgICAgICAiIiIKKyAgICBzY2hlbWFfcmVzID0gY3UuZXhlY3V0ZShxKQorICAgIGZvciBuYW1lLCB0eXBlLCBzcWwgaW4gc2NoZW1hX3Jlcy5mZXRjaGFsbCgpOgorICAgICAgICB5aWVsZCgnJXM7JyAlIHNxbCkKKworICAgIHlpZWxkKCdDT01NSVQ7JykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy9kdW1wLnB5YyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9kdW1wLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTRlMDFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL2R1bXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy9kdW1wLnB5byBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9kdW1wLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTRlMDFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL2R1bXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkN2E3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkN2E3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kYmFwaS5weSBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2RiYXBpLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNTZkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kYmFwaS5weQpAQCAtMCwwICsxLDg4OSBAQAorIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCisjIHB5c3FsaXRlMi90ZXN0L2RiYXBpLnB5OiB0ZXN0cyBmb3IgREItQVBJIGNvbXBsaWFuY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworaW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKKworY2xhc3MgTW9kdWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBDaGVja0FQSUxldmVsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNxbGl0ZS5hcGlsZXZlbCwgIjIuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImFwaWxldmVsIGlzICVzLCBzaG91bGQgYmUgMi4wIiAlIHNxbGl0ZS5hcGlsZXZlbCkKKworICAgIGRlZiBDaGVja1RocmVhZFNhZmV0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcWxpdGUudGhyZWFkc2FmZXR5LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRzYWZldHkgaXMgJWQsIHNob3VsZCBiZSAxIiAlIHNxbGl0ZS50aHJlYWRzYWZldHkpCisKKyAgICBkZWYgQ2hlY2tQYXJhbVN0eWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNxbGl0ZS5wYXJhbXN0eWxlLCAicW1hcmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbXN0eWxlIGlzICclcycsIHNob3VsZCBiZSAncW1hcmsnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlLnBhcmFtc3R5bGUpCisKKyAgICBkZWYgQ2hlY2tXYXJuaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuV2FybmluZywgU3RhbmRhcmRFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiV2FybmluZyBpcyBub3QgYSBzdWJjbGFzcyBvZiBTdGFuZGFyZEVycm9yIikKKworICAgIGRlZiBDaGVja0Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuRXJyb3IsIFN0YW5kYXJkRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIFN0YW5kYXJkRXJyb3IiKQorCisgICAgZGVmIENoZWNrSW50ZXJmYWNlRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlcmZhY2VFcnJvciwgc3FsaXRlLkVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcmZhY2VFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tEYXRhYmFzZUVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuRGF0YWJhc2VFcnJvciwgc3FsaXRlLkVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhYmFzZUVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIEVycm9yIikKKworICAgIGRlZiBDaGVja0RhdGFFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLkRhdGFFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGFFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKKworICAgIGRlZiBDaGVja09wZXJhdGlvbmFsRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uYWxFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKKworICAgIGRlZiBDaGVja0ludGVncml0eUVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZWdyaXR5RXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlZ3JpdHlFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKKworICAgIGRlZiBDaGVja0ludGVybmFsRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlcm5hbEVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJuYWxFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKKworICAgIGRlZiBDaGVja1Byb2dyYW1taW5nRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbW1pbmdFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKKworICAgIGRlZiBDaGVja05vdFN1cHBvcnRlZEVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuTm90U3VwcG9ydGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOb3RTdXBwb3J0ZWRFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKKworY2xhc3MgQ29ubmVjdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY3ggPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjdSA9IHNlbGYuY3guY3Vyc29yKCkKKyAgICAgICAgY3UuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB0ZXh0KSIpCisgICAgICAgIGN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiZm9vIiwpKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmN4LmNsb3NlKCkKKworICAgIGRlZiBDaGVja0NvbW1pdChzZWxmKToKKyAgICAgICAgc2VsZi5jeC5jb21taXQoKQorCisgICAgZGVmIENoZWNrQ29tbWl0QWZ0ZXJOb0NoYW5nZXMoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBBIGNvbW1pdCBzaG91bGQgYWxzbyB3b3JrIHdoZW4gbm8gY2hhbmdlcyB3ZXJlIG1hZGUgdG8gdGhlIGRhdGFiYXNlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jeC5jb21taXQoKQorICAgICAgICBzZWxmLmN4LmNvbW1pdCgpCisKKyAgICBkZWYgQ2hlY2tSb2xsYmFjayhzZWxmKToKKyAgICAgICAgc2VsZi5jeC5yb2xsYmFjaygpCisKKyAgICBkZWYgQ2hlY2tSb2xsYmFja0FmdGVyTm9DaGFuZ2VzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQSByb2xsYmFjayBzaG91bGQgYWxzbyB3b3JrIHdoZW4gbm8gY2hhbmdlcyB3ZXJlIG1hZGUgdG8gdGhlIGRhdGFiYXNlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jeC5yb2xsYmFjaygpCisgICAgICAgIHNlbGYuY3gucm9sbGJhY2soKQorCisgICAgZGVmIENoZWNrQ3Vyc29yKHNlbGYpOgorICAgICAgICBjdSA9IHNlbGYuY3guY3Vyc29yKCkKKworICAgIGRlZiBDaGVja0ZhaWxlZE9wZW4oc2VsZik6CisgICAgICAgIFlPVV9DQU5OT1RfT1BFTl9USElTID0gIi9mb28vYmFyL2JsYS8yMzUzNC9teWRiLmRiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdChZT1VfQ0FOTk9UX09QRU5fVEhJUykKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY3guY2xvc2UoKQorCisgICAgZGVmIENoZWNrRXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgIyBPcHRpb25hbCBEQi1BUEkgZXh0ZW5zaW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guV2FybmluZywgc3FsaXRlLldhcm5pbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5FcnJvciwgc3FsaXRlLkVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guSW50ZXJmYWNlRXJyb3IsIHNxbGl0ZS5JbnRlcmZhY2VFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4LkRhdGFiYXNlRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guRGF0YUVycm9yLCBzcWxpdGUuRGF0YUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5JbnRlZ3JpdHlFcnJvciwgc3FsaXRlLkludGVncml0eUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guSW50ZXJuYWxFcnJvciwgc3FsaXRlLkludGVybmFsRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5Qcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4Lk5vdFN1cHBvcnRlZEVycm9yLCBzcWxpdGUuTm90U3VwcG9ydGVkRXJyb3IpCisKK2NsYXNzIEN1cnNvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY3ggPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBzZWxmLmN1ID0gc2VsZi5jeC5jdXJzb3IoKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCwgaW5jb21lIG51bWJlcikiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiZm9vIiwpKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmNsb3NlKCkKKyAgICAgICAgc2VsZi5jeC5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTm9BcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZUlsbGVnYWxTcWwoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IGFzZGYiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZVRvb011Y2hTcWwoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IDUrNDsgc2VsZWN0IDQrNSIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFdhcm5pbmciKQorICAgICAgICBleGNlcHQgc3FsaXRlLldhcm5pbmc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVUb29NdWNoU3FsMihzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgNSs0OyAtLSBmb28gYmFyIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVUb29NdWNoU3FsMyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCIiIgorICAgICAgICAgICAgc2VsZWN0IDUrNDsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIGZvbworICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICIiIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVXcm9uZ1NxbEFyZyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKDQyKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBWYWx1ZUVycm9yIikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnSW50KHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiLCAoNDIsKSkKKworICAgIGRlZiBDaGVja0V4ZWN1dGVBcmdGbG9hdChzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsICgyNTAwLjMyLCkpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnU3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiSHVnbyIsKSkKKworICAgIGRlZiBDaGVja0V4ZWN1dGVBcmdTdHJpbmdXaXRoWmVyb0J5dGUoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgKCJIdVx4MDBnbyIsKSkKKworICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBpZD0/IiwgKHNlbGYuY3UubGFzdHJvd2lkLCkpCisgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgIkh1XHgwMGdvIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVXcm9uZ05vT2ZBcmdzMShzZWxmKToKKyAgICAgICAgIyB0b28gbWFueSBwYXJhbWV0ZXJzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICgxNywgIkVnb24iKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlV3JvbmdOb09mQXJnczIoc2VsZik6CisgICAgICAgICMgdG9vIGxpdHRsZSBwYXJhbWV0ZXJzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nTm9PZkFyZ3MzKHNlbGYpOgorICAgICAgICAjIG5vIHBhcmFtZXRlcnMsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0V4ZWN1dGVQYXJhbUxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9PyIsIFsiZm9vIl0pCisgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlUGFyYW1TZXF1ZW5jZShzZWxmKToKKyAgICAgICAgY2xhc3MgTChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBhc3NlcnQgeCA9PSAwCisgICAgICAgICAgICAgICAgcmV0dXJuICJmb28iCisKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT0/IiwgTCgpKQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIiwgeyJuYW1lIjogImZvbyJ9KQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nX01hcHBpbmcoc2VsZik6CisgICAgICAgICMgVGVzdCBvbmx5IHdvcmtzIHdpdGggUHl0aG9uIDIuNSBvciBsYXRlcgorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDUsIDApOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgY2xhc3MgRChkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIgorCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUiLCBEKCkpCisgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmdUb29MaXR0bGVBcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIGFuZCBpZD06aWQiLCB7Im5hbWUiOiAiZm9vIn0pCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nTm9BcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmdVbm5hbWVkKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPT8iLCB7Im5hbWUiOiAiZm9vIn0pCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrQ2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY3UuY2xvc2UoKQorCisgICAgZGVmIENoZWNrUm93Y291bnRFeGVjdXRlKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInVwZGF0ZSB0ZXN0IHNldCBuYW1lPSdiYXInIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAyKQorCisgICAgZGVmIENoZWNrUm93Y291bnRTZWxlY3Qoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBweXNxbGl0ZSBkb2VzIG5vdCBrbm93IHRoZSByb3djb3VudCBvZiBTRUxFQ1Qgc3RhdGVtZW50cywgYmVjYXVzZSB3ZQorICAgICAgICBkb24ndCBmZXRjaCBhbGwgcm93cyBhZnRlciBleGVjdXRpbmcgdGhlIHNlbGVjdCBzdGF0ZW1lbnQuIFRoZSByb3djb3VudAorICAgICAgICBoYXMgdGh1cyB0byBiZSAtMS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IDUgdW5pb24gc2VsZWN0IDYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3Uucm93Y291bnQsIC0xKQorCisgICAgZGVmIENoZWNrUm93Y291bnRFeGVjdXRlbWFueShzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKD8pIiwgWygxLCksICgyLCksICgzLCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3Uucm93Y291bnQsIDMpCisKKyAgICBkZWYgQ2hlY2tUb3RhbENoYW5nZXMoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIGlmIHNlbGYuY3gudG90YWxfY2hhbmdlcyA8IDI6CisgICAgICAgICAgICBzZWxmLmZhaWwoInRvdGFsIGNoYW5nZXMgcmVwb3J0ZWQgd3JvbmcgdmFsdWUiKQorCisgICAgIyBDaGVja3MgZm9yIGV4ZWN1dGVtYW55OgorICAgICMgU2VxdWVuY2VzIGFyZSByZXF1aXJlZCBieSB0aGUgREItQVBJLCBpdGVyYXRvcnMKKyAgICAjIGVuaGFuY2VtZW50cyBpbiBweXNxbGl0ZS4KKworICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55U2VxdWVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgWyh4LCkgZm9yIHggaW4gcmFuZ2UoMTAwLCAxMTApXSkKKworICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55SXRlcmF0b3Ioc2VsZik6CisgICAgICAgIGNsYXNzIE15SXRlcjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlID0gNQorCisgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnZhbHVlID09IDEwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSArPSAxCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2VsZi52YWx1ZSwpCisKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCBNeUl0ZXIoKSkKKworICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55R2VuZXJhdG9yKHNlbGYpOgorICAgICAgICBkZWYgbXlnZW4oKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgICAgIHlpZWxkIChpLCkKKworICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIG15Z2VuKCkpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueVdyb25nU3FsQXJnKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KDQyLCBbKDMsKV0pCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFZhbHVlRXJyb3IiKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJhaXNlZCB3cm9uZyBleGNlcHRpb24uIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55U2VsZWN0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJzZWxlY3QgPyIsIFsoMywpXSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJhaXNlZCB3cm9uZyBleGNlcHRpb24uIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55Tm90SXRlcmFibGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgNDIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFR5cGVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHByaW50ICJyYWlzZWQiLCBlLl9fY2xhc3NfXworICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCisKKyAgICBkZWYgQ2hlY2tGZXRjaEl0ZXIoc2VsZik6CisgICAgICAgICMgT3B0aW9uYWwgREItQVBJIGV4dGVuc2lvbi4KKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIiwgKDUsKSkKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIiwgKDYsKSkKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgaWQgZnJvbSB0ZXN0IG9yZGVyIGJ5IGlkIikKKyAgICAgICAgbHN0ID0gW10KKyAgICAgICAgZm9yIHJvdyBpbiBzZWxmLmN1OgorICAgICAgICAgICAgbHN0LmFwcGVuZChyb3dbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0WzBdLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdFsxXSwgNikKKworICAgIGRlZiBDaGVja0ZldGNob25lKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCisgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdywgTm9uZSkKKworICAgIGRlZiBDaGVja0ZldGNob25lTm9TdGF0ZW1lbnQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY3guY3Vyc29yKCkKKyAgICAgICAgcm93ID0gY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3csIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tBcnJheVNpemUoc2VsZik6CisgICAgICAgICMgbXVzdCBkZWZhdWx0IG90IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LmFycmF5c2l6ZSwgMSkKKworICAgICAgICAjIG5vdyBzZXQgdG8gMgorICAgICAgICBzZWxmLmN1LmFycmF5c2l6ZSA9IDIKKworICAgICAgICAjIG5vdyBtYWtlIHRoZSBxdWVyeSByZXR1cm4gMyByb3dzCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdBJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnQicpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ0MnKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IikKKyAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaG1hbnkoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDIpCisKKyAgICBkZWYgQ2hlY2tGZXRjaG1hbnkoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IikKKyAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaG1hbnkoMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQorICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNobWFueSgxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBbXSkKKworICAgIGRlZiBDaGVja0ZldGNobWFueUt3QXJnKHNlbGYpOgorICAgICAgICAiIiJDaGVja3MgaWYgZmV0Y2htYW55IHdvcmtzIHdpdGgga2V5d29yZCBhcmd1bWVudHMiIiIKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNobWFueShzaXplPTEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKKworICAgIGRlZiBDaGVja0ZldGNoYWxsKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQorICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFtdKQorCisgICAgZGVmIENoZWNrU2V0aW5wdXRzaXplcyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5zZXRpbnB1dHNpemVzKFszLCA0LCA1XSkKKworICAgIGRlZiBDaGVja1NldG91dHB1dHNpemUoc2VsZik6CisgICAgICAgIHNlbGYuY3Uuc2V0b3V0cHV0c2l6ZSg1LCAwKQorCisgICAgZGVmIENoZWNrU2V0b3V0cHV0c2l6ZU5vQ29sdW1uKHNlbGYpOgorICAgICAgICBzZWxmLmN1LnNldG91dHB1dHNpemUoNDIpCisKKyAgICBkZWYgQ2hlY2tDdXJzb3JDb25uZWN0aW9uKHNlbGYpOgorICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5jb25uZWN0aW9uLCBzZWxmLmN4KQorCisgICAgZGVmIENoZWNrV3JvbmdDdXJzb3JDYWxsYWJsZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVmIGYoKTogcGFzcworICAgICAgICAgICAgY3VyID0gc2VsZi5jeC5jdXJzb3IoZikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVHlwZUVycm9yIikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFZhbHVlRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ3Vyc29yV3JvbmdDbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vOiBwYXNzCisgICAgICAgIGZvbyA9IEZvbygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ciA9IHNxbGl0ZS5DdXJzb3IoZm9vKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBWYWx1ZUVycm9yIikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhpcyB0ZXN0IHJlcXVpcmVzIHRocmVhZGluZy4nKQorY2xhc3MgVGhyZWFkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCwgYmluIGJpbmFyeSwgcmF0aW8gbnVtYmVyLCB0cyB0aW1lc3RhbXApIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tDb25DdXJzb3Ioc2VsZik6CisgICAgICAgIGRlZiBydW4oY29uLCBlcnJvcnMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY29uIjogc2VsZi5jb24sICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ29uQ29tbWl0KHNlbGYpOgorICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb24uY29tbWl0KCkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0NvblJvbGxiYWNrKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb24ucm9sbGJhY2soKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY29uIjogc2VsZi5jb24sICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ29uQ2xvc2Uoc2VsZik6CisgICAgICAgIGRlZiBydW4oY29uLCBlcnJvcnMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbi5jbG9zZSgpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjb24iOiBzZWxmLmNvbiwgImVycm9ycyI6IGVycm9yc30pCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQorICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCisKKyAgICBkZWYgQ2hlY2tDdXJJbXBsaWNpdEJlZ2luKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdhJykiKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY3VyIjogc2VsZi5jdXIsICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ3VyQ2xvc2Uoc2VsZik6CisgICAgICAgIGRlZiBydW4oY3VyLCBlcnJvcnMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGN1ci5jbG9zZSgpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjdXIiOiBzZWxmLmN1ciwgImVycm9ycyI6IGVycm9yc30pCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQorICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCisKKyAgICBkZWYgQ2hlY2tDdXJFeGVjdXRlKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IikKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnYScpIikKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY3VyIjogc2VsZi5jdXIsICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ3VySXRlck5leHQoc2VsZik6CisgICAgICAgIGRlZiBydW4oY3VyLCBlcnJvcnMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2EnKSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImN1ciI6IHNlbGYuY3VyLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworY2xhc3MgQ29uc3RydWN0b3JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIENoZWNrRGF0ZShzZWxmKToKKyAgICAgICAgZCA9IHNxbGl0ZS5EYXRlKDIwMDQsIDEwLCAyOCkKKworICAgIGRlZiBDaGVja1RpbWUoc2VsZik6CisgICAgICAgIHQgPSBzcWxpdGUuVGltZSgxMiwgMzksIDM1KQorCisgICAgZGVmIENoZWNrVGltZXN0YW1wKHNlbGYpOgorICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMTAsIDI4LCAxMiwgMzksIDM1KQorCisgICAgZGVmIENoZWNrRGF0ZUZyb21UaWNrcyhzZWxmKToKKyAgICAgICAgZCA9IHNxbGl0ZS5EYXRlRnJvbVRpY2tzKDQyKQorCisgICAgZGVmIENoZWNrVGltZUZyb21UaWNrcyhzZWxmKToKKyAgICAgICAgdCA9IHNxbGl0ZS5UaW1lRnJvbVRpY2tzKDQyKQorCisgICAgZGVmIENoZWNrVGltZXN0YW1wRnJvbVRpY2tzKHNlbGYpOgorICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXBGcm9tVGlja3MoNDIpCisKKyAgICBkZWYgQ2hlY2tCaW5hcnkoc2VsZik6CisgICAgICAgIGIgPSBzcWxpdGUuQmluYXJ5KGNocigwKSArICInIikKKworY2xhc3MgRXh0ZW5zaW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBDaGVja1NjcmlwdFN0cmluZ1NxbChzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCIiIgorICAgICAgICAgICAgLS0gYmxhIGJsYQorICAgICAgICAgICAgLyogYSBzdHVwaWQgY29tbWVudCAqLworICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGEoaSk7CisgICAgICAgICAgICBpbnNlcnQgaW50byBhKGkpIHZhbHVlcyAoNSk7CisgICAgICAgICAgICAiIiIpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIGEiKQorICAgICAgICByZXMgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgNSkKKworICAgIGRlZiBDaGVja1NjcmlwdFN0cmluZ1VuaWNvZGUoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZXNjcmlwdCh1IiIiCisgICAgICAgICAgICBjcmVhdGUgdGFibGUgYShpKTsKKyAgICAgICAgICAgIGluc2VydCBpbnRvIGEoaSkgdmFsdWVzICg1KTsKKyAgICAgICAgICAgIHNlbGVjdCBpIGZyb20gYTsKKyAgICAgICAgICAgIGRlbGV0ZSBmcm9tIGE7CisgICAgICAgICAgICBpbnNlcnQgaW50byBhKGkpIHZhbHVlcyAoNik7CisgICAgICAgICAgICAiIiIpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIGEiKQorICAgICAgICByZXMgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgNikKKworICAgIGRlZiBDaGVja1NjcmlwdFN5bnRheEVycm9yKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgcmFpc2VkID0gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQoImNyZWF0ZSB0YWJsZSB0ZXN0KHgpOyBhc2RmOyBjcmVhdGUgdGFibGUgdGVzdDIoeCkiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3I6CisgICAgICAgICAgICByYWlzZWQgPSBUcnVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFpc2VkLCBUcnVlLCAic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiIpCisKKyAgICBkZWYgQ2hlY2tTY3JpcHRFcnJvck5vcm1hbChzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIHJhaXNlZCA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdChzYWRmc2FkZmRzYSk7IHNlbGVjdCBmb28gZnJvbSBodXJ6OyIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlZCA9IFRydWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYWlzZWQsIFRydWUsICJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIikKKworICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25FeGVjdXRlKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IDUiKS5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCA1LCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGUiKQorCisgICAgZGVmIENoZWNrQ29ubmVjdGlvbkV4ZWN1dGVtYW55KHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKSIpCisgICAgICAgIGNvbi5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoPykiLCBbKDMsKSwgKDQsKV0pCisgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKCJzZWxlY3QgZm9vIGZyb20gdGVzdCBvcmRlciBieSBmb28iKS5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdWzBdLCAzLCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVtYW55IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMV1bMF0sIDQsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZW1hbnkiKQorCisgICAgZGVmIENoZWNrQ29ubmVjdGlvbkV4ZWN1dGVzY3JpcHQoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdChmb28pOyBpbnNlcnQgaW50byB0ZXN0KGZvbykgdmFsdWVzICg1KTsiKQorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IGZvbyBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCA1LCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVzY3JpcHQiKQorCitjbGFzcyBDbG9zZWRDb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0Nsb3NlZENvbkN1cnNvcihzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tDbG9zZWRDb25Db21taXQoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5jb21taXQoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ2xvc2VkQ29uUm9sbGJhY2soc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5yb2xsYmFjaygpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tDbG9zZWRDdXJFeGVjdXRlKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgY29uLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCA0IikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKworICAgIGRlZiBDaGVja0Nsb3NlZENyZWF0ZUZ1bmN0aW9uKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICBkZWYgZih4KTogcmV0dXJuIDE3CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5jcmVhdGVfZnVuY3Rpb24oImZvbyIsIDEsIGYpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tDbG9zZWRDcmVhdGVBZ2dyZWdhdGUoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5jbG9zZSgpCisgICAgICAgIGNsYXNzIEFnZzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgc3RlcChzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgZmluYWxpemUoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDE3CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5jcmVhdGVfYWdncmVnYXRlKCJmb28iLCAxLCBBZ2cpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tDbG9zZWRTZXRBdXRob3JpemVyKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICBkZWYgYXV0aG9yaXplcigqYXJncyk6CisgICAgICAgICAgICByZXR1cm4gc3FsaXRlLkRFTlkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLnNldF9hdXRob3JpemVyKGF1dGhvcml6ZXIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tDbG9zZWRTZXRQcm9ncmVzc0NhbGxiYWNrKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICBkZWYgcHJvZ3Jlc3MoKTogcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIocHJvZ3Jlc3MsIDEwMCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKworICAgIGRlZiBDaGVja0Nsb3NlZENhbGwoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbigpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisKK2NsYXNzIENsb3NlZEN1clRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrQ2xvc2VkKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmNsb3NlKCkKKworICAgICAgICBmb3IgbWV0aG9kX25hbWUgaW4gKCJleGVjdXRlIiwgImV4ZWN1dGVtYW55IiwgImV4ZWN1dGVzY3JpcHQiLCAiZmV0Y2hhbGwiLCAiZmV0Y2htYW55IiwgImZldGNob25lIik6CisgICAgICAgICAgICBpZiBtZXRob2RfbmFtZSBpbiAoImV4ZWN1dGUiLCAiZXhlY3V0ZXNjcmlwdCIpOgorICAgICAgICAgICAgICAgIHBhcmFtcyA9ICgic2VsZWN0IDQgdW5pb24gc2VsZWN0IDUiLCkKKyAgICAgICAgICAgIGVsaWYgbWV0aG9kX25hbWUgPT0gImV4ZWN1dGVtYW55IjoKKyAgICAgICAgICAgICAgICBwYXJhbXMgPSAoImluc2VydCBpbnRvIGZvbyhiYXIpIHZhbHVlcyAoPykiLCBbKDMsKSwgKDQsKV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhcmFtcyA9IFtdCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKGN1ciwgbWV0aG9kX25hbWUpCisKKyAgICAgICAgICAgICAgICBtZXRob2QoKnBhcmFtcykKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3I6IG1ldGhvZCAiICsgbWV0aG9kX25hbWUpCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvcjogIiArIG1ldGhvZF9uYW1lKQorCitkZWYgc3VpdGUoKToKKyAgICBtb2R1bGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoTW9kdWxlVGVzdHMsICJDaGVjayIpCisgICAgY29ubmVjdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25uZWN0aW9uVGVzdHMsICJDaGVjayIpCisgICAgY3Vyc29yX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEN1cnNvclRlc3RzLCAiQ2hlY2siKQorICAgIHRocmVhZF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShUaHJlYWRUZXN0cywgIkNoZWNrIikKKyAgICBjb25zdHJ1Y3Rvcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25zdHJ1Y3RvclRlc3RzLCAiQ2hlY2siKQorICAgIGV4dF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShFeHRlbnNpb25UZXN0cywgIkNoZWNrIikKKyAgICBjbG9zZWRfY29uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENsb3NlZENvblRlc3RzLCAiQ2hlY2siKQorICAgIGNsb3NlZF9jdXJfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ2xvc2VkQ3VyVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgobW9kdWxlX3N1aXRlLCBjb25uZWN0aW9uX3N1aXRlLCBjdXJzb3Jfc3VpdGUsIHRocmVhZF9zdWl0ZSwgY29uc3RydWN0b3Jfc3VpdGUsIGV4dF9zdWl0ZSwgY2xvc2VkX2Nvbl9zdWl0ZSwgY2xvc2VkX2N1cl9zdWl0ZSkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2RiYXBpLnB5YyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2RiYXBpLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTkzYTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZGJhcGkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2RiYXBpLnB5byBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2RiYXBpLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2QyOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZGJhcGkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2R1bXAucHkgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kdW1wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZGU4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kdW1wLnB5CkBAIC0wLDAgKzEsODMgQEAKKyMgQXV0aG9yOiBQYXVsIEtpcHBlcyA8a2lwcGVzcEBnbWFpbC5jb20+CisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCisKK2NsYXNzIER1bXBUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmN4ID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgc2VsZi5jdSA9IHNlbGYuY3guY3Vyc29yKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jeC5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tUYWJsZUR1bXAoc2VsZik6CisgICAgICAgIGV4cGVjdGVkX3NxbHMgPSBbCisgICAgICAgICAgICAgICAgIiIiQ1JFQVRFIFRBQkxFICJpbmRleCIoImluZGV4IiBibG9iKTsiIiIKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIiIiSU5TRVJUIElOVE8gImluZGV4IiBWQUxVRVMoWCcwMScpOyIiIgorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAiIiJDUkVBVEUgVEFCTEUgInF1b3RlZCIidGFibGUiKCJxdW90ZWQiImZpZWxkIiB0ZXh0KTsiIiIKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIiIiSU5TRVJUIElOVE8gInF1b3RlZCIidGFibGUiIFZBTFVFUygncXVvdGVkJyd2YWx1ZScpOyIiIgorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAiQ1JFQVRFIFRBQkxFIHQxKGlkIGludGVnZXIgcHJpbWFyeSBrZXksIHMxIHRleHQsICIgXAorICAgICAgICAgICAgICAgICJ0MV9pMSBpbnRlZ2VyIG5vdCBudWxsLCBpMiBpbnRlZ2VyLCB1bmlxdWUgKHMxKSwgIiBcCisgICAgICAgICAgICAgICAgImNvbnN0cmFpbnQgdDFfaWR4MSB1bmlxdWUgKGkyKSk7IgorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gXCJ0MVwiIFZBTFVFUygxLCdmb28nLDEwLDIwKTsiCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICJJTlNFUlQgSU5UTyBcInQxXCIgVkFMVUVTKDIsJ2ZvbzInLDMwLDMwKTsiCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgIHUiSU5TRVJUIElOVE8gXCJ0MVwiIFZBTFVFUygzLCdmXHhjM1x4YjYnLDQwLDEwKTsiCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICJDUkVBVEUgVEFCTEUgdDIoaWQgaW50ZWdlciwgdDJfaTEgaW50ZWdlciwgIiBcCisgICAgICAgICAgICAgICAgInQyX2kyIGludGVnZXIsIHByaW1hcnkga2V5IChpZCksIiBcCisgICAgICAgICAgICAgICAgImZvcmVpZ24ga2V5KHQyX2kxKSByZWZlcmVuY2VzIHQxKHQxX2kxKSk7IgorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAiQ1JFQVRFIFRSSUdHRVIgdHJpZ2dlcl8xIHVwZGF0ZSBvZiB0MV9pMSBvbiB0MSAiIFwKKyAgICAgICAgICAgICAgICAiYmVnaW4gIiBcCisgICAgICAgICAgICAgICAgInVwZGF0ZSB0MiBzZXQgdDJfaTEgPSBuZXcudDFfaTEgd2hlcmUgdDJfaTEgPSBvbGQudDFfaTE7ICIgXAorICAgICAgICAgICAgICAgICJlbmQ7IgorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAiQ1JFQVRFIFZJRVcgdjEgYXMgc2VsZWN0ICogZnJvbSB0MSBsZWZ0IGpvaW4gdDIgIiBcCisgICAgICAgICAgICAgICAgInVzaW5nIChpZCk7IgorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgW3NlbGYuY3UuZXhlY3V0ZShzKSBmb3IgcyBpbiBleHBlY3RlZF9zcWxzXQorICAgICAgICBpID0gc2VsZi5jeC5pdGVyZHVtcCgpCisgICAgICAgIGFjdHVhbF9zcWxzID0gW3MgZm9yIHMgaW4gaV0KKyAgICAgICAgZXhwZWN0ZWRfc3FscyA9IFsnQkVHSU4gVFJBTlNBQ1RJT047J10gKyBleHBlY3RlZF9zcWxzICsgXAorICAgICAgICAgICAgWydDT01NSVQ7J10KKyAgICAgICAgW3NlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfc3Fsc1tpXSwgYWN0dWFsX3NxbHNbaV0pCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGV4cGVjdGVkX3NxbHMpKV0KKworICAgIGRlZiBDaGVja1Vub3JkZXJhYmxlUm93KHNlbGYpOgorICAgICAgICAjIGl0ZXJkdW1wKCkgc2hvdWxkIGJlIGFibGUgdG8gY29wZSB3aXRoIHVub3JkZXJhYmxlIHJvdyB0eXBlcyAoaXNzdWUgIzE1NTQ1KQorICAgICAgICBjbGFzcyBVbm9yZGVyYWJsZVJvdzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjdXJzb3IsIHJvdyk6CisgICAgICAgICAgICAgICAgc2VsZi5yb3cgPSByb3cKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucm93W2luZGV4XQorICAgICAgICBzZWxmLmN4LnJvd19mYWN0b3J5ID0gVW5vcmRlcmFibGVSb3cKKyAgICAgICAgQ1JFQVRFX0FMUEhBID0gIiIiQ1JFQVRFIFRBQkxFICJhbHBoYSIgKCJvbmUiKTsiIiIKKyAgICAgICAgQ1JFQVRFX0JFVEEgPSAiIiJDUkVBVEUgVEFCTEUgImJldGEiICgidHdvIik7IiIiCisgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgIkJFR0lOIFRSQU5TQUNUSU9OOyIsCisgICAgICAgICAgICBDUkVBVEVfQUxQSEEsCisgICAgICAgICAgICBDUkVBVEVfQkVUQSwKKyAgICAgICAgICAgICJDT01NSVQ7IgorICAgICAgICAgICAgXQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoQ1JFQVRFX0JFVEEpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZShDUkVBVEVfQUxQSEEpCisgICAgICAgIGdvdCA9IGxpc3Qoc2VsZi5jeC5pdGVyZHVtcCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisKK2RlZiBzdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUodW5pdHRlc3QubWFrZVN1aXRlKER1bXBUZXN0cywgIkNoZWNrIikpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2R1bXAucHljIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZHVtcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3ODA3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2R1bXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2R1bXAucHlvIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZHVtcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3ODA3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2R1bXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODU0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5CkBAIC0wLDAgKzEsMjQ0IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvZmFjdG9yeS5weTogdGVzdHMgZm9yIHRoZSB2YXJpb3VzIGZhY3RvcmllcyBpbiBweXNxbGl0ZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworY2xhc3MgTXlDb25uZWN0aW9uKHNxbGl0ZS5Db25uZWN0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc3FsaXRlLkNvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorCitkZWYgZGljdF9mYWN0b3J5KGN1cnNvciwgcm93KToKKyAgICBkID0ge30KKyAgICBmb3IgaWR4LCBjb2wgaW4gZW51bWVyYXRlKGN1cnNvci5kZXNjcmlwdGlvbik6CisgICAgICAgIGRbY29sWzBdXSA9IHJvd1tpZHhdCisgICAgcmV0dXJuIGQKKworY2xhc3MgTXlDdXJzb3Ioc3FsaXRlLkN1cnNvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNxbGl0ZS5DdXJzb3IuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLnJvd19mYWN0b3J5ID0gZGljdF9mYWN0b3J5CisKK2NsYXNzIENvbm5lY3Rpb25GYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBmYWN0b3J5PU15Q29ubmVjdGlvbikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrSXNJbnN0YW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi5jb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15Q29ubmVjdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAiY29ubmVjdGlvbiBpcyBub3QgaW5zdGFuY2Ugb2YgTXlDb25uZWN0aW9uIikKKworY2xhc3MgQ3Vyc29yRmFjdG9yeVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrSXNJbnN0YW5jZShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKGZhY3Rvcnk9TXlDdXJzb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlDdXJzb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgImN1cnNvciBpcyBub3QgaW5zdGFuY2Ugb2YgTXlDdXJzb3IiKQorCitjbGFzcyBSb3dGYWN0b3J5VGVzdHNCYWNrd2FyZHNDb21wYXQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorCisgICAgZGVmIENoZWNrSXNQcm9kdWNlZEJ5RmFjdG9yeShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKGZhY3Rvcnk9TXlDdXJzb3IpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgNCs1IGFzIGZvbyIpCisgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdCksCisgICAgICAgICAgICAgICAgICAgICAgICAicm93IGlzIG5vdCBpbnN0YW5jZSBvZiBkaWN0IikKKyAgICAgICAgY3VyLmNsb3NlKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCitjbGFzcyBSb3dGYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorCisgICAgZGVmIENoZWNrQ3VzdG9tRmFjdG9yeShzZWxmKToKKyAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBsYW1iZGEgY3VyLCByb3c6IGxpc3Qocm93KQorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSwgMiIpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uocm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyb3cgaXMgbm90IGluc3RhbmNlIG9mIGxpc3QiKQorCisgICAgZGVmIENoZWNrU3FsaXRlUm93SW5kZXgoc2VsZik6CisgICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdworICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlLlJvdyksCisgICAgICAgICAgICAgICAgICAgICAgICAicm93IGlzIG5vdCBpbnN0YW5jZSBvZiBzcWxpdGUuUm93IikKKworICAgICAgICBjb2wxLCBjb2wyID0gcm93WyJhIl0sIHJvd1siYiJdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2wxID09IDEsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnYSciKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMiA9PSAyLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKKworICAgICAgICBjb2wxLCBjb2wyID0gcm93WyJBIl0sIHJvd1siQiJdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2wxID09IDEsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnQSciKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMiA9PSAyLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0InIikKKworICAgICAgICBjb2wxLCBjb2wyID0gcm93WzBdLCByb3dbMV0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDEgPT0gMSwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDIgPT0gMiwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAxIikKKworICAgIGRlZiBDaGVja1NxbGl0ZVJvd0l0ZXIoc2VsZik6CisgICAgICAgICIiIkNoZWNrcyBpZiB0aGUgcm93IG9iamVjdCBpcyBpdGVyYWJsZSIiIgorICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQorICAgICAgICBmb3IgY29sIGluIHJvdzoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja1NxbGl0ZVJvd0FzVHVwbGUoc2VsZik6CisgICAgICAgICIiIkNoZWNrcyBpZiB0aGUgcm93IG9iamVjdCBjYW4gYmUgY29udmVydGVkIHRvIGEgdHVwbGUiIiIKKyAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CisgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKKyAgICAgICAgdCA9IHR1cGxlKHJvdykKKworICAgIGRlZiBDaGVja1NxbGl0ZVJvd0FzRGljdChzZWxmKToKKyAgICAgICAgIiIiQ2hlY2tzIGlmIHRoZSByb3cgb2JqZWN0IGNhbiBiZSBjb3JyZWN0bHkgY29udmVydGVkIHRvIGEgZGljdGlvbmFyeSIiIgorICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQorICAgICAgICBkID0gZGljdChyb3cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsiYSJdLCByb3dbImEiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWyJiIl0sIHJvd1siYiJdKQorCisgICAgZGVmIENoZWNrU3FsaXRlUm93SGFzaENtcChzZWxmKToKKyAgICAgICAgIiIiQ2hlY2tzIGlmIHRoZSByb3cgb2JqZWN0IGNvbXBhcmVzIGFuZCBoYXNoZXMgY29ycmVjdGx5IiIiCisgICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdworICAgICAgICByb3dfMSA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKKyAgICAgICAgcm93XzIgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCisgICAgICAgIHJvd18zID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMyBhcyBiIikuZmV0Y2hvbmUoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyb3dfMSA9PSByb3dfMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJvd18xID09IHJvd18yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocm93XzIgIT0gcm93XzMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyb3dfMSAhPSByb3dfMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyb3dfMSAhPSByb3dfMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyb3dfMiA9PSByb3dfMykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd18xLCByb3dfMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHJvd18xKSwgaGFzaChyb3dfMikpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocm93XzEsIHJvd18zKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGhhc2gocm93XzEpLCBoYXNoKHJvd18zKSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCitjbGFzcyBUZXh0RmFjdG9yeVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgIGRlZiBDaGVja1VuaWNvZGUoc2VsZik6CisgICAgICAgIGF1c3RyaWEgPSB1bmljb2RlKCLWc3RlcnJlaWNoIiwgImxhdGluMSIpCisgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyb3dbMF0pID09IHVuaWNvZGUsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHVuaWNvZGUiKQorCisgICAgZGVmIENoZWNrU3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBzdHIKKyAgICAgICAgYXVzdHJpYSA9IHVuaWNvZGUoItZzdGVycmVpY2giLCAibGF0aW4xIikKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJvd1swXSkgPT0gc3RyLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSBzdHIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocm93WzBdID09IGF1c3RyaWEuZW5jb2RlKCJ1dGYtOCIpLCAiY29sdW1uIG11c3QgZXF1YWwgb3JpZ2luYWwgZGF0YSBpbiBVVEYtOCIpCisKKyAgICBkZWYgQ2hlY2tDdXN0b20oc2VsZik6CisgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGxhbWJkYSB4OiB1bmljb2RlKHgsICJ1dGYtOCIsICJpZ25vcmUiKQorICAgICAgICBhdXN0cmlhID0gdW5pY29kZSgi1nN0ZXJyZWljaCIsICJsYXRpbjEiKQorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLmVuY29kZSgibGF0aW4xIiksKSkuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyb3dbMF0pID09IHVuaWNvZGUsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHVuaWNvZGUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocm93WzBdLmVuZHN3aXRoKHUicmVpY2giKSwgImNvbHVtbiBtdXN0IGNvbnRhaW4gb3JpZ2luYWwgZGF0YSIpCisKKyAgICBkZWYgQ2hlY2tPcHRpbWl6ZWRVbmljb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBzcWxpdGUuT3B0aW1pemVkVW5pY29kZQorICAgICAgICBhdXN0cmlhID0gdW5pY29kZSgi1nN0ZXJyZWljaCIsICJsYXRpbjEiKQorICAgICAgICBnZXJtYW55ID0gdW5pY29kZSgiRGV1dGNobGFuZCIpCisgICAgICAgIGFfcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCisgICAgICAgIGRfcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoZ2VybWFueSwpKS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGFfcm93WzBdKSA9PSB1bmljb2RlLCAidHlwZSBvZiBub24tQVNDSUkgcm93IG11c3QgYmUgdW5pY29kZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGRfcm93WzBdKSA9PSBzdHIsICJ0eXBlIG9mIEFTQ0lJLW9ubHkgcm93IG11c3QgYmUgc3RyIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCitjbGFzcyBUZXh0RmFjdG9yeVRlc3RzV2l0aEVtYmVkZGVkWmVyb0J5dGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKHZhbHVlIHRleHQpIikKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCAodmFsdWUpIHZhbHVlcyAoPykiLCAoImFceDAwYiIsKSkKKworICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKKyAgICAgICAgIyB0ZXh0X2ZhY3RvcnkgZGVmYXVsdHMgdG8gdW5pY29kZQorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgdmFsdWUgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocm93WzBdKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJhXHgwMGIiKQorCisgICAgZGVmIENoZWNrQ3VzdG9tKHNlbGYpOgorICAgICAgICAjIEEgY3VzdG9tIGZhY3Rvcnkgc2hvdWxkIHJlY2VpdmUgYW4gc3RyIGFyZ3VtZW50CisgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGxhbWJkYSB4OiB4CisgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCB2YWx1ZSBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShyb3dbMF0pLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiYVx4MDBiIikKKworICAgIGRlZiBDaGVja09wdGltaXplZFVuaWNvZGVBc1N0cmluZyhzZWxmKToKKyAgICAgICAgIyBBU0NJSSAtPiBzdHIgYXJndW1lbnQKKyAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlLk9wdGltaXplZFVuaWNvZGUKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IHZhbHVlIGZyb20gdGVzdCIpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKHJvd1swXSksIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJhXHgwMGIiKQorCisgICAgZGVmIENoZWNrT3B0aW1pemVkVW5pY29kZUFzVW5pY29kZShzZWxmKToKKyAgICAgICAgIyBOb24tQVNDSUkgLT4gdW5pY29kZSBhcmd1bWVudAorICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBzcWxpdGUuT3B0aW1pemVkVW5pY29kZQorICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCAodmFsdWUpIHZhbHVlcyAoPykiLCAodSfkXDD2JywpKQorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgdmFsdWUgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocm93WzBdKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHUi5Fx4MDD2IikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCitkZWYgc3VpdGUoKToKKyAgICBjb25uZWN0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbm5lY3Rpb25GYWN0b3J5VGVzdHMsICJDaGVjayIpCisgICAgY3Vyc29yX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEN1cnNvckZhY3RvcnlUZXN0cywgIkNoZWNrIikKKyAgICByb3dfc3VpdGVfY29tcGF0ID0gdW5pdHRlc3QubWFrZVN1aXRlKFJvd0ZhY3RvcnlUZXN0c0JhY2t3YXJkc0NvbXBhdCwgIkNoZWNrIikKKyAgICByb3dfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoUm93RmFjdG9yeVRlc3RzLCAiQ2hlY2siKQorICAgIHRleHRfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoVGV4dEZhY3RvcnlUZXN0cywgIkNoZWNrIikKKyAgICB0ZXh0X3plcm9fYnl0ZXNfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoVGV4dEZhY3RvcnlUZXN0c1dpdGhFbWJlZGRlZFplcm9CeXRlcywgIkNoZWNrIikKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChjb25uZWN0aW9uX3N1aXRlLCBjdXJzb3Jfc3VpdGUsIHJvd19zdWl0ZV9jb21wYXQsIHJvd19zdWl0ZSwgdGV4dF9zdWl0ZSwgdGV4dF96ZXJvX2J5dGVzX3N1aXRlKSkKKworZGVmIHRlc3QoKToKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weWMgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmNlNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weW8gYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmNlNDU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvaG9va3MucHkgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9ob29rcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmZhZTEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvaG9va3MucHkKQEAgLTAsMCArMSwyMDcgQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvdGVzdC9ob29rcy5weTogdGVzdHMgZm9yIHZhcmlvdXMgU1FMaXRlLXNwZWNpZmljIGhvb2tzCisjCisjIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitpbXBvcnQgb3MsIHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworY2xhc3MgQ29sbGF0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tDcmVhdGVDb2xsYXRpb25Ob3RDYWxsYWJsZShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIlgiLCA0MikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVHlwZUVycm9yIikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAicGFyYW1ldGVyIG11c3QgYmUgY2FsbGFibGUiKQorCisgICAgZGVmIENoZWNrQ3JlYXRlQ29sbGF0aW9uTm90QXNjaWkoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJjb2xs5CIsIGNtcCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvciwgZToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0NvbGxhdGlvbklzVXNlZChzZWxmKToKKyAgICAgICAgaWYgc3FsaXRlLnZlcnNpb25faW5mbyA8ICgzLCAyLCAxKTogICMgb2xkIFNRTGl0ZSB2ZXJzaW9ucyBjcmFzaCBvbiB0aGlzIHRlc3QKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBkZWYgbXljb2xsKHgsIHkpOgorICAgICAgICAgICAgIyByZXZlcnNlIG9yZGVyCisgICAgICAgICAgICByZXR1cm4gLWNtcCh4LCB5KQorCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBteWNvbGwpCisgICAgICAgIHNxbCA9ICIiIgorICAgICAgICAgICAgc2VsZWN0IHggZnJvbSAoCisgICAgICAgICAgICBzZWxlY3QgJ2EnIGFzIHgKKyAgICAgICAgICAgIHVuaW9uCisgICAgICAgICAgICBzZWxlY3QgJ2InIGFzIHgKKyAgICAgICAgICAgIHVuaW9uCisgICAgICAgICAgICBzZWxlY3QgJ2MnIGFzIHgKKyAgICAgICAgICAgICkgb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbAorICAgICAgICAgICAgIiIiCisgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKHNxbCkuZmV0Y2hhbGwoKQorICAgICAgICBpZiByZXN1bHRbMF1bMF0gIT0gImMiIG9yIHJlc3VsdFsxXVswXSAhPSAiYiIgb3IgcmVzdWx0WzJdWzBdICE9ICJhIjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgidGhlIGV4cGVjdGVkIG9yZGVyIHdhcyBub3QgcmV0dXJuZWQiKQorCisgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBOb25lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZShzcWwpLmZldGNoYWxsKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXS5sb3dlcigpLCAibm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2U6IG15Y29sbCIpCisKKyAgICBkZWYgQ2hlY2tDb2xsYXRpb25SZXR1cm5zTGFyZ2VJbnRlZ2VyKHNlbGYpOgorICAgICAgICBkZWYgbXljb2xsKHgsIHkpOgorICAgICAgICAgICAgIyByZXZlcnNlIG9yZGVyCisgICAgICAgICAgICByZXR1cm4gLSgoeCA+IHkpIC0gKHggPCB5KSkgKiAyKiozMgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbXljb2xsKQorICAgICAgICBzcWwgPSAiIiIKKyAgICAgICAgICAgIHNlbGVjdCB4IGZyb20gKAorICAgICAgICAgICAgc2VsZWN0ICdhJyBhcyB4CisgICAgICAgICAgICB1bmlvbgorICAgICAgICAgICAgc2VsZWN0ICdiJyBhcyB4CisgICAgICAgICAgICB1bmlvbgorICAgICAgICAgICAgc2VsZWN0ICdjJyBhcyB4CisgICAgICAgICAgICApIG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwKKyAgICAgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZShzcWwpLmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFsoJ2MnLCksICgnYicsKSwgKCdhJywpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9InRoZSBleHBlY3RlZCBvcmRlciB3YXMgbm90IHJldHVybmVkIikKKworICAgIGRlZiBDaGVja0NvbGxhdGlvblJlZ2lzdGVyVHdpY2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZWdpc3RlciB0d28gZGlmZmVyZW50IGNvbGxhdGlvbiBmdW5jdGlvbnMgdW5kZXIgdGhlIHNhbWUgbmFtZS4KKyAgICAgICAgVmVyaWZ5IHRoYXQgdGhlIGxhc3Qgb25lIGlzIGFjdHVhbGx5IHVzZWQuCisgICAgICAgICIiIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgY21wKQorICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbGFtYmRhIHgsIHk6IC1jbXAoeCwgeSkpCisgICAgICAgIHJlc3VsdCA9IGNvbi5leGVjdXRlKCIiIgorICAgICAgICAgICAgc2VsZWN0IHggZnJvbSAoc2VsZWN0ICdhJyBhcyB4IHVuaW9uIHNlbGVjdCAnYicgYXMgeCkgb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbAorICAgICAgICAgICAgIiIiKS5mZXRjaGFsbCgpCisgICAgICAgIGlmIHJlc3VsdFswXVswXSAhPSAnYicgb3IgcmVzdWx0WzFdWzBdICE9ICdhJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgY29sbGF0aW9uIGZ1bmN0aW9uIGlzIHVzZWQiKQorCisgICAgZGVmIENoZWNrRGVyZWdpc3RlckNvbGxhdGlvbihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlZ2lzdGVyIGEgY29sbGF0aW9uLCB0aGVuIGRlcmVnaXN0ZXIgaXQuIE1ha2Ugc3VyZSBhbiBlcnJvciBpcyByYWlzZWQgaWYgd2UgdHJ5CisgICAgICAgIHRvIHVzZSBpdC4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBjbXApCisgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJteWNvbGwiLCBOb25lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uZXhlY3V0ZSgic2VsZWN0ICdhJyBhcyB4IHVuaW9uIHNlbGVjdCAnYicgYXMgeCBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBub3QgZS5hcmdzWzBdLnN0YXJ0c3dpdGgoIm5vIHN1Y2ggY29sbGF0aW9uIHNlcXVlbmNlIik6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyBPcGVyYXRpb25hbEVycm9yIHJhaXNlZCIpCisKK2NsYXNzIFByb2dyZXNzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBDaGVja1Byb2dyZXNzSGFuZGxlclVzZWQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUZXN0IHRoYXQgdGhlIHByb2dyZXNzIGhhbmRsZXIgaXMgaW52b2tlZCBvbmNlIGl0IGlzIHNldC4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KKyAgICAgICAgZGVmIHByb2dyZXNzKCk6CisgICAgICAgICAgICBwcm9ncmVzc19jYWxscy5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKKyAgICAgICAgY29uLmV4ZWN1dGUoIiIiCisgICAgICAgICAgICBjcmVhdGUgdGFibGUgZm9vKGEsIGIpCisgICAgICAgICAgICAiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm9ncmVzc19jYWxscykKKworCisgICAgZGVmIENoZWNrT3Bjb2RlQ291bnQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUZXN0IHRoYXQgdGhlIG9wY29kZSBhcmd1bWVudCBpcyByZXNwZWN0ZWQuCisgICAgICAgICIiIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCisgICAgICAgIGRlZiBwcm9ncmVzcygpOgorICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIocHJvZ3Jlc3MsIDEpCisgICAgICAgIGN1cnMgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgY3Vycy5leGVjdXRlKCIiIgorICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGZvbyAoYSwgYikKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgZmlyc3RfY291bnQgPSBsZW4ocHJvZ3Jlc3NfY2FsbHMpCisgICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KKyAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAyKQorICAgICAgICBjdXJzLmV4ZWN1dGUoIiIiCisgICAgICAgICAgICBjcmVhdGUgdGFibGUgYmFyIChhLCBiKQorICAgICAgICAgICAgIiIiKQorICAgICAgICBzZWNvbmRfY291bnQgPSBsZW4ocHJvZ3Jlc3NfY2FsbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaXJzdF9jb3VudCA+IHNlY29uZF9jb3VudCkKKworICAgIGRlZiBDaGVja0NhbmNlbE9wZXJhdGlvbihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRlc3QgdGhhdCByZXR1cm5pbmcgYSBub24temVybyB2YWx1ZSBzdG9wcyB0aGUgb3BlcmF0aW9uIGluIHByb2dyZXNzLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgcHJvZ3Jlc3NfY2FsbHMgPSBbXQorICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKKyAgICAgICAgICAgIHByb2dyZXNzX2NhbGxzLmFwcGVuZChOb25lKQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQorICAgICAgICBjdXJzID0gY29uLmN1cnNvcigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsCisgICAgICAgICAgICBjdXJzLmV4ZWN1dGUsCisgICAgICAgICAgICAiY3JlYXRlIHRhYmxlIGJhciAoYSwgYikiKQorCisgICAgZGVmIENoZWNrQ2xlYXJIYW5kbGVyKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdCB0aGF0IHNldHRpbmcgdGhlIHByb2dyZXNzIGhhbmRsZXIgdG8gTm9uZSBjbGVhcnMgdGhlIHByZXZpb3VzbHkgc2V0IGhhbmRsZXIuCisgICAgICAgICIiIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBhY3Rpb24gPSBbXQorICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKKyAgICAgICAgICAgIGFjdGlvbi5hcHBlbmQoMSkKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKKyAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKE5vbmUsIDEpCisgICAgICAgIGNvbi5leGVjdXRlKCJzZWxlY3QgMSB1bmlvbiBzZWxlY3QgMiB1bmlvbiBzZWxlY3QgMyIpLmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYWN0aW9uKSwgMCwgInByb2dyZXNzIGhhbmRsZXIgd2FzIG5vdCBjbGVhcmVkIikKKworZGVmIHN1aXRlKCk6CisgICAgY29sbGF0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbGxhdGlvblRlc3RzLCAiQ2hlY2siKQorICAgIHByb2dyZXNzX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFByb2dyZXNzVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY29sbGF0aW9uX3N1aXRlLCBwcm9ncmVzc19zdWl0ZSkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2hvb2tzLnB5YyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2hvb2tzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTZkMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvaG9va3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2hvb2tzLnB5byBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2hvb2tzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTZkMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvaG9va3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3B5MjV0ZXN0cy5weSBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3B5MjV0ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmQzYzBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvcHkyNXRlc3RzLnB5CkBAIC0wLDAgKzEsODAgQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvdGVzdC9yZWdyZXNzaW9uLnB5OiBweXNxbGl0ZSByZWdyZXNzaW9uIHRlc3RzCisjCisjIENvcHlyaWdodCAoQykgMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworZGlkX3JvbGxiYWNrID0gRmFsc2UKKworY2xhc3MgTXlDb25uZWN0aW9uKHNxbGl0ZS5Db25uZWN0aW9uKToKKyAgICBkZWYgcm9sbGJhY2soc2VsZik6CisgICAgICAgIGdsb2JhbCBkaWRfcm9sbGJhY2sKKyAgICAgICAgZGlkX3JvbGxiYWNrID0gVHJ1ZQorICAgICAgICBzcWxpdGUuQ29ubmVjdGlvbi5yb2xsYmFjayhzZWxmKQorCitjbGFzcyBDb250ZXh0VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZ2xvYmFsIGRpZF9yb2xsYmFjaworICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGZhY3Rvcnk9TXlDb25uZWN0aW9uKQorICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChjIHVuaXF1ZSkiKQorICAgICAgICBkaWRfcm9sbGJhY2sgPSBGYWxzZQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tDb250ZXh0TWFuYWdlcihzZWxmKToKKyAgICAgICAgIiIiQ2FuIHRoZSBjb25uZWN0aW9uIGJlIHVzZWQgYXMgYSBjb250ZXh0IG1hbmFnZXIgYXQgYWxsPyIiIgorICAgICAgICB3aXRoIHNlbGYuY29uOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrQ29udGV4dE1hbmFnZXJDb21taXQoc2VsZik6CisgICAgICAgICIiIklzIGEgY29tbWl0IGNhbGxlZCBpbiB0aGUgY29udGV4dCBtYW5hZ2VyPyIiIgorICAgICAgICB3aXRoIHNlbGYuY29uOgorICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChjKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY29uLnJvbGxiYWNrKCkKKyAgICAgICAgY291bnQgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgY291bnQoKikgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCAxKQorCisgICAgZGVmIENoZWNrQ29udGV4dE1hbmFnZXJSb2xsYmFjayhzZWxmKToKKyAgICAgICAgIiIiSXMgYSByb2xsYmFjayBjYWxsZWQgaW4gdGhlIGNvbnRleHQgbWFuYWdlcj8iIiIKKyAgICAgICAgZ2xvYmFsIGRpZF9yb2xsYmFjaworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpZF9yb2xsYmFjaywgRmFsc2UpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggc2VsZi5jb246CisgICAgICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChjKSB2YWx1ZXMgKDQpIikKKyAgICAgICAgICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGMpIHZhbHVlcyAoNCkiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkludGVncml0eUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpZF9yb2xsYmFjaywgVHJ1ZSkKKworZGVmIHN1aXRlKCk6CisgICAgY3R4X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbnRleHRUZXN0cywgIkNoZWNrIikKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChjdHhfc3VpdGUsKSkKKworZGVmIHRlc3QoKToKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvcHkyNXRlc3RzLnB5YyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3B5MjV0ZXN0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljZDA0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3B5MjV0ZXN0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvcHkyNXRlc3RzLnB5byBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3B5MjV0ZXN0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljZDA0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3B5MjV0ZXN0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weSBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzOWQ1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKQEAgLTAsMCArMSwzMjQgQEAKKyMtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvdGVzdC9yZWdyZXNzaW9uLnB5OiBweXNxbGl0ZSByZWdyZXNzaW9uIHRlc3RzCisjCisjIENvcHlyaWdodCAoQykgMjAwNi0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCisKK2NsYXNzIFJlZ3Jlc3Npb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja1ByYWdtYVVzZXJWZXJzaW9uKHNlbGYpOgorICAgICAgICAjIFRoaXMgdXNlZCB0byBjcmFzaCBweXNxbGl0ZSBiZWNhdXNlIHRoaXMgcHJhZ21hIGNvbW1hbmQgcmV0dXJucyBOVUxMIGZvciB0aGUgY29sdW1uIG5hbWUKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInByYWdtYSB1c2VyX3ZlcnNpb24iKQorCisgICAgZGVmIENoZWNrUHJhZ21hU2NoZW1hVmVyc2lvbihzZWxmKToKKyAgICAgICAgIyBUaGlzIHN0aWxsIGNyYXNoZWQgcHlzcWxpdGUgPD0gMi4yLjEKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9DT0xOQU1FUykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJwcmFnbWEgc2NoZW1hX3ZlcnNpb24iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgY3VyLmNsb3NlKCkKKyAgICAgICAgICAgIGNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tTdGF0ZW1lbnRSZXNldChzZWxmKToKKyAgICAgICAgIyBweXNxbGl0ZSAyLjEuMCB0byAyLjIuMCBoYXZlIHRoZSBwcm9ibGVtIHRoYXQgbm90IGFsbCBzdGF0ZW1lbnRzIGFyZQorICAgICAgICAjIHJlc2V0IGJlZm9yZSBhIHJvbGxiYWNrLCBidXQgb25seSB0aG9zZSB0aGF0IGFyZSBzdGlsbCBpbiB0aGUKKyAgICAgICAgIyBzdGF0ZW1lbnQgY2FjaGUuIFRoZSBvdGhlcnMgYXJlIG5vdCBhY2Nlc3NpYmxlIGZyb20gdGhlIGNvbm5lY3Rpb24gb2JqZWN0LgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBjYWNoZWRfc3RhdGVtZW50cz01KQorICAgICAgICBjdXJzb3JzID0gW2Nvbi5jdXJzb3IoKSBmb3IgeCBpbiB4cmFuZ2UoNSldCisgICAgICAgIGN1cnNvcnNbMF0uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoeCkiKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBjdXJzb3JzWzBdLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KHgpIHZhbHVlcyAoPykiLCBbKHgsKSBmb3IgeCBpbiB4cmFuZ2UoMTApXSkKKworICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgIGN1cnNvcnNbaV0uZXhlY3V0ZSgiICIgKiBpICsgInNlbGVjdCB4IGZyb20gdGVzdCIpCisKKyAgICAgICAgY29uLnJvbGxiYWNrKCkKKworICAgIGRlZiBDaGVja0NvbHVtbk5hbWVXaXRoU3BhY2VzKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgnc2VsZWN0IDEgYXMgImZvbyBiYXIgW2RhdGV0aW1lXSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1ci5kZXNjcmlwdGlvblswXVswXSwgImZvbyBiYXIiKQorCisgICAgICAgIGN1ci5leGVjdXRlKCdzZWxlY3QgMSBhcyAiZm9vIGJheiInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1ci5kZXNjcmlwdGlvblswXVswXSwgImZvbyBiYXoiKQorCisgICAgZGVmIENoZWNrU3RhdGVtZW50RmluYWxpemF0aW9uT25DbG9zZURiKHNlbGYpOgorICAgICAgICAjIHB5c3FsaXRlIHZlcnNpb25zIDw9IDIuMy4zIG9ubHkgZmluYWxpemVkIHN0YXRlbWVudHMgaW4gdGhlIHN0YXRlbWVudAorICAgICAgICAjIGNhY2hlIHdoZW4gY2xvc2luZyB0aGUgZGF0YWJhc2UuIHN0YXRlbWVudHMgdGhhdCB3ZXJlIHN0aWxsCisgICAgICAgICMgcmVmZXJlbmNlZCBpbiBjdXJzb3JzIHdlcmVuJ3QgY2xvc2VkIGFuIGNvdWxkIHByb3Zva2UgIgorICAgICAgICAjICJPcGVyYXRpb25hbEVycm9yOiBVbmFibGUgdG8gY2xvc2UgZHVlIHRvIHVuZmluYWxpc2VkIHN0YXRlbWVudHMiLgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjdXJzb3JzID0gW10KKyAgICAgICAgIyBkZWZhdWx0IHN0YXRlbWVudCBjYWNoZSBzaXplIGlzIDEwMAorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDUpOgorICAgICAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgICAgICBjdXJzb3JzLmFwcGVuZChjdXIpCisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IDEgeCB1bmlvbiBzZWxlY3QgIiArIHN0cihpKSkKKyAgICAgICAgY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja09uQ29uZmxpY3RSb2xsYmFjayhzZWxmKToKKyAgICAgICAgaWYgc3FsaXRlLnNxbGl0ZV92ZXJzaW9uX2luZm8gPCAoMywgMiwgMik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oeCwgdW5pcXVlKHgpIG9uIGNvbmZsaWN0IHJvbGxiYWNrKSIpCisgICAgICAgIGNvbi5leGVjdXRlKCJpbnNlcnQgaW50byBmb28oeCkgdmFsdWVzICgxKSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5leGVjdXRlKCJpbnNlcnQgaW50byBmb28oeCkgdmFsdWVzICgxKSIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuRGF0YWJhc2VFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyh4KSB2YWx1ZXMgKDIpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLmNvbW1pdCgpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicHlzcWxpdGUga25ldyBub3RoaW5nIGFib3V0IHRoZSBpbXBsaWNpdCBST0xMQkFDSyIpCisKKyAgICBkZWYgQ2hlY2tXb3JrYXJvdW5kRm9yQnVnZ3lTcWxpdGVUcmFuc2ZlckJpbmRpbmdzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgcHlzcWxpdGUgd291bGQgY3Jhc2ggd2l0aCBvbGRlciBTUUxpdGUgdmVyc2lvbnMgdW5sZXNzCisgICAgICAgIGEgd29ya2Fyb3VuZCBpcyBpbXBsZW1lbnRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYmFyKSIpCisgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImRyb3AgdGFibGUgZm9vIikKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyhiYXIpIikKKworICAgIGRlZiBDaGVja0VtcHR5U3RhdGVtZW50KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgcHlzcWxpdGUgdXNlZCB0byBzZWdmYXVsdCB3aXRoIFNRTGl0ZSB2ZXJzaW9ucyAzLjUueC4gVGhlc2UgcmV0dXJuIE5VTEwKKyAgICAgICAgZm9yICJuby1vcGVyYXRpb24iIHN0YXRlbWVudHMKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoIiIpCisKKyAgICBkZWYgQ2hlY2tVbmljb2RlQ29ubmVjdChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFdpdGggcHlzcWxpdGUgMi40LjAgeW91IG5lZWRlZCB0byB1c2UgYSBzdHJpbmcgb3IgYSBBUFNXIGNvbm5lY3Rpb24KKyAgICAgICAgb2JqZWN0IGZvciBvcGVuaW5nIGRhdGFiYXNlIGNvbm5lY3Rpb25zLgorCisgICAgICAgIEZvcm1lcmx5LCBib3RoIGJ5dGVzdHJpbmdzIGFuZCB1bmljb2RlIHN0cmluZ3MgdXNlZCB0byB3b3JrLgorCisgICAgICAgIExldCdzIG1ha2Ugc3VyZSB1bmljb2RlIHN0cmluZ3Mgd29yayBpbiB0aGUgZnV0dXJlLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QodSI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tUeXBlTWFwVXNhZ2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBweXNxbGl0ZSB1bnRpbCAyLjQuMSBkaWQgbm90IHJlYnVpbGQgdGhlIHJvd19jYXN0X21hcCB3aGVuIHJlY29tcGlsaW5nCisgICAgICAgIGEgc3RhdGVtZW50LiBUaGlzIHRlc3QgZXhoaWJpdHMgdGhlIHByb2JsZW0uCisgICAgICAgICIiIgorICAgICAgICBTRUxFQ1QgPSAic2VsZWN0ICogZnJvbSBmb28iCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCisgICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKGJhciB0aW1lc3RhbXApIikKKyAgICAgICAgY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyhiYXIpIHZhbHVlcyAoPykiLCAoZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCksKSkKKyAgICAgICAgY29uLmV4ZWN1dGUoU0VMRUNUKQorICAgICAgICBjb24uZXhlY3V0ZSgiZHJvcCB0YWJsZSBmb28iKQorICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyhiYXIgaW50ZWdlcikiKQorICAgICAgICBjb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gZm9vKGJhcikgdmFsdWVzICg1KSIpCisgICAgICAgIGNvbi5leGVjdXRlKFNFTEVDVCkKKworICAgIGRlZiBDaGVja1JlZ2lzdGVyQWRhcHRlcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFNlZSBpc3N1ZSAzMzEyLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzcWxpdGUucmVnaXN0ZXJfYWRhcHRlciwge30sIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tTZXRJc29sYXRpb25MZXZlbChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFNlZSBpc3N1ZSAzMzEyLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBzZXRhdHRyLCBjb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpc29sYXRpb25fbGV2ZWwiLCB1Ilx4ZTkiKQorCisgICAgZGVmIENoZWNrQ3Vyc29yQ29uc3RydWN0b3JDYWxsQ2hlY2soc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBWZXJpZmllcyB0aGF0IGN1cnNvciBtZXRob2RzIGNoZWNrIHdldGhlciBiYXNlIGNsYXNzIF9faW5pdF9fIHdhcyBjYWxsZWQuCisgICAgICAgICIiIgorICAgICAgICBjbGFzcyBDdXJzb3Ioc3FsaXRlLkN1cnNvcik6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY29uKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gQ3Vyc29yKGNvbikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCA0KzUiKS5mZXRjaGFsbCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKworICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25Db25zdHJ1Y3RvckNhbGxDaGVjayhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFZlcmlmaWVzIHRoYXQgY29ubmVjdGlvbiBtZXRob2RzIGNoZWNrIHdldGhlciBiYXNlIGNsYXNzIF9faW5pdF9fIHdhcyBjYWxsZWQuCisgICAgICAgICIiIgorICAgICAgICBjbGFzcyBDb25uZWN0aW9uKHNxbGl0ZS5Db25uZWN0aW9uKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY29uID0gQ29ubmVjdGlvbigiOm1lbW9yeToiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ3Vyc29yUmVnaXN0cmF0aW9uKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVmVyaWZpZXMgdGhhdCBzdWJjbGFzc2VkIGN1cnNvciBjbGFzc2VzIGFyZSBjb3JyZWN0bHkgcmVnaXN0ZXJlZCB3aXRoCisgICAgICAgIHRoZSBjb25uZWN0aW9uIG9iamVjdCwgdG9vLiAgKGZldGNoLWFjcm9zcy1yb2xsYmFjayBwcm9ibGVtKQorICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgQ29ubmVjdGlvbihzcWxpdGUuQ29ubmVjdGlvbik6CisgICAgICAgICAgICBkZWYgY3Vyc29yKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBDdXJzb3Ioc2VsZikKKworICAgICAgICBjbGFzcyBDdXJzb3Ioc3FsaXRlLkN1cnNvcik6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY29uKToKKyAgICAgICAgICAgICAgICBzcWxpdGUuQ3Vyc29yLl9faW5pdF9fKHNlbGYsIGNvbikKKworICAgICAgICBjb24gPSBDb25uZWN0aW9uKCI6bWVtb3J5OiIpCisgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyh4KSIpCisgICAgICAgIGN1ci5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gZm9vKHgpIHZhbHVlcyAoPykiLCBbKDMsKSwgKDQsKSwgKDUsKV0pCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgeCBmcm9tIGZvbyIpCisgICAgICAgIGNvbi5yb2xsYmFjaygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5mZXRjaGFsbCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBJbnRlcmZhY2VFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuSW50ZXJmYWNlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIEludGVyZmFjZUVycm9yIikKKworICAgIGRlZiBDaGVja0F1dG9Db21taXQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBWZXJpZmllcyB0aGF0IGNyZWF0aW5nIGEgY29ubmVjdGlvbiBpbiBhdXRvY29tbWl0IG1vZGUgd29ya3MuCisgICAgICAgIDIuNS4zIGludHJvZHVjZWQgYSByZWdyZXNzaW9uIHNvIHRoYXQgdGhlc2UgY291bGQgbm8gbG9uZ2VyCisgICAgICAgIGJlIGNyZWF0ZWQuCisgICAgICAgICIiIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBpc29sYXRpb25fbGV2ZWw9Tm9uZSkKKworICAgIGRlZiBDaGVja1ByYWdtYUF1dG9jb21taXQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBWZXJpZmllcyB0aGF0IHJ1bm5pbmcgYSBQUkFHTUEgc3RhdGVtZW50IHRoYXQgZG9lcyBhbiBhdXRvY29tbWl0IGRvZXMKKyAgICAgICAgd29yay4gVGhpcyBkaWQgbm90IHdvcmsgaW4gMi41LjMvMi41LjQuCisgICAgICAgICIiIgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyhiYXIpIikKKyAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyhiYXIpIHZhbHVlcyAoNSkiKQorCisgICAgICAgIGN1ci5leGVjdXRlKCJwcmFnbWEgcGFnZV9zaXplIikKKyAgICAgICAgcm93ID0gY3VyLmZldGNob25lKCkKKworICAgIGRlZiBDaGVja1NldERpY3Qoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTc0NzgKKworICAgICAgICBJdCB3YXMgcG9zc2libGUgdG8gc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyIGNhbGxiYWNrcyB0aGF0IGNvdWxkIG5vdCBiZQorICAgICAgICBoYXNoZWQuIFJldHVybiBjb2RlcyBvZiBQeURpY3RfU2V0SXRlbSB3ZXJlIG5vdCBjaGVja2VkIHByb3Blcmx5LgorICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgTm90SGFzaGFibGU6CisgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoKQorICAgICAgICB2YXIgPSBOb3RIYXNoYWJsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uLCB2YXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSwgdmFyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuY29uLnNldF9hdXRob3JpemVyLCB2YXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5jb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIsIHZhcikKKworICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25DYWxsKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2FsbCBhIGNvbm5lY3Rpb24gd2l0aCBhIG5vbi1zdHJpbmcgU1FMIHJlcXVlc3Q6IGNoZWNrIGVycm9yIGhhbmRsaW5nCisgICAgICAgIG9mIHRoZSBzdGF0ZW1lbnQgY29uc3RydWN0b3IuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuV2FybmluZywgc2VsZi5jb24sIDEpCisKKyAgICBkZWYgQ2hlY2tSZWN1cnNpdmVDdXJzb3JVc2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTA4MTEKKworICAgICAgICBSZWN1cnNpdmVseSB1c2luZyBhIGN1cnNvciwgc3VjaCBhcyB3aGVuIHJldXNpbmcgaXQgZnJvbSBhIGdlbmVyYXRvciBsZWQgdG8gc2VnZmF1bHRzLgorICAgICAgICBOb3cgd2UgY2F0Y2ggcmVjdXJzaXZlIGN1cnNvciB1c2FnZSBhbmQgcmFpc2UgYSBQcm9ncmFtbWluZ0Vycm9yLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBhIChiYXIpIikKKyAgICAgICAgY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBiIChiYXopIikKKworICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gYSAoYmFyKSB2YWx1ZXMgKD8pIiwgKDEsKSkKKyAgICAgICAgICAgIHlpZWxkIDEKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yKToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gYiAoYmF6KSB2YWx1ZXMgKD8pIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGksKSBmb3IgaSBpbiBmb28oKSkpCisKKyAgICBkZWYgQ2hlY2tDb252ZXJ0VGltZXN0YW1wTWljcm9zZWNvbmRQYWRkaW5nKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE0NzIwCisKKyAgICAgICAgVGhlIG1pY3Jvc2Vjb25kIHBhcnNpbmcgb2YgY29udmVydF90aW1lc3RhbXAoKSBzaG91bGQgcGFkIHdpdGggemVyb3MsCisgICAgICAgIHNpbmNlIHRoZSBtaWNyb3NlY29uZCBzdHJpbmcgIjQ1NiIgYWN0dWFsbHkgcmVwcmVzZW50cyAiNDU2MDAwIi4KKyAgICAgICAgIiIiCisKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCisgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgiQ1JFQVRFIFRBQkxFIHQgKHggVElNRVNUQU1QKSIpCisKKyAgICAgICAgIyBNaWNyb3NlY29uZHMgc2hvdWxkIGJlIDQ1NjAwMAorICAgICAgICBjdXIuZXhlY3V0ZSgiSU5TRVJUIElOVE8gdCAoeCkgVkFMVUVTICgnMjAxMi0wNC0wNCAxNTowNjowMC40NTYnKSIpCisKKyAgICAgICAgIyBNaWNyb3NlY29uZHMgc2hvdWxkIGJlIHRydW5jYXRlZCB0byAxMjM0NTYKKyAgICAgICAgY3VyLmV4ZWN1dGUoIklOU0VSVCBJTlRPIHQgKHgpIFZBTFVFUyAoJzIwMTItMDQtMDQgMTU6MDY6MDAuMTIzNDU2Nzg5JykiKQorCisgICAgICAgIGN1ci5leGVjdXRlKCJTRUxFQ1QgKiBGUk9NIHQiKQorICAgICAgICB2YWx1ZXMgPSBbeFswXSBmb3IgeCBpbiBjdXIuZmV0Y2hhbGwoKV0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgWworICAgICAgICAgICAgZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMiwgNCwgNCwgMTUsIDYsIDAsIDQ1NjAwMCksCisgICAgICAgICAgICBkYXRldGltZS5kYXRldGltZSgyMDEyLCA0LCA0LCAxNSwgNiwgMCwgMTIzNDU2KSwKKyAgICAgICAgXSkKKworCitkZWYgc3VpdGUoKToKKyAgICByZWdyZXNzaW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFJlZ3Jlc3Npb25UZXN0cywgIkNoZWNrIikKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChyZWdyZXNzaW9uX3N1aXRlLCkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHljIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExOGE1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHlvIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTExOGE1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weSBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzMyMjUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5CkBAIC0wLDAgKzEsMjA1IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvdHJhbnNhY3Rpb25zLnB5OiB0ZXN0cyB0cmFuc2FjdGlvbnMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcywgdW5pdHRlc3QKK2ltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQorCitkZWYgZ2V0X2RiX3BhdGgoKToKKyAgICByZXR1cm4gInNxbGl0ZV90ZXN0ZGIiCisKK2NsYXNzIFRyYW5zYWN0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKGdldF9kYl9wYXRoKCkpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuY29uMSA9IHNxbGl0ZS5jb25uZWN0KGdldF9kYl9wYXRoKCksIHRpbWVvdXQ9MC4xKQorICAgICAgICBzZWxmLmN1cjEgPSBzZWxmLmNvbjEuY3Vyc29yKCkKKworICAgICAgICBzZWxmLmNvbjIgPSBzcWxpdGUuY29ubmVjdChnZXRfZGJfcGF0aCgpLCB0aW1lb3V0PTAuMSkKKyAgICAgICAgc2VsZi5jdXIyID0gc2VsZi5jb24yLmN1cnNvcigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyMS5jbG9zZSgpCisgICAgICAgIHNlbGYuY29uMS5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5jdXIyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24yLmNsb3NlKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51bmxpbmsoZ2V0X2RiX3BhdGgoKSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tETUxkb2VzQXV0b0NvbW1pdEJlZm9yZShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdDIoaikiKQorICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKKyAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKKworICAgIGRlZiBDaGVja0luc2VydFN0YXJ0c1RyYW5zYWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDApCisKKyAgICBkZWYgQ2hlY2tVcGRhdGVTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY29uMS5jb21taXQoKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgidXBkYXRlIHRlc3Qgc2V0IGk9NiIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgNSkKKworICAgIGRlZiBDaGVja0RlbGV0ZVN0YXJ0c1RyYW5zYWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jb24xLmNvbW1pdCgpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCisKKyAgICBkZWYgQ2hlY2tSZXBsYWNlU3RhcnRzVHJhbnNhY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICBzZWxmLmNvbjEuY29tbWl0KCkKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoInJlcGxhY2UgaW50byB0ZXN0KGkpIHZhbHVlcyAoNikiKQorICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKKyAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMF1bMF0sIDUpCisKKyAgICBkZWYgQ2hlY2tUb2dnbGVBdXRvQ29tbWl0KHNlbGYpOgorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jb24xLmlzb2xhdGlvbl9sZXZlbCA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsLCBOb25lKQorICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKKyAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKKworICAgICAgICBzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsID0gIkRFRkVSUkVEIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29uMS5pc29sYXRpb25fbGV2ZWwgLCAiREVGRVJSRUQiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCisKKyAgICBkZWYgQ2hlY2tSYWlzZVRpbWVvdXQoc2VsZik6CisgICAgICAgIGlmIHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDIsIDIpOgorICAgICAgICAgICAgIyBUaGlzIHdpbGwgZmFpbCAoaGFuZykgb24gZWFybGllciB2ZXJzaW9ucyBvZiBzcWxpdGUuCisgICAgICAgICAgICAjIERldGVybWluZSBleGFjdCB2ZXJzaW9uIGl0IHdhcyBmaXhlZC4gMy4yLjEgaGFuZ3MuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tMb2NraW5nKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhpcyB0ZXN0cyB0aGUgaW1wcm92ZWQgY29uY3VycmVuY3kgd2l0aCBweXNxbGl0ZSAyLjMuNC4gWW91IG5lZWRlZAorICAgICAgICB0byByb2xsIGJhY2sgY29uMiBiZWZvcmUgeW91IGNvdWxkIGNvbW1pdCBjb24xLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc3FsaXRlLnNxbGl0ZV92ZXJzaW9uX2luZm8gPCAoMywgMiwgMik6CisgICAgICAgICAgICAjIFRoaXMgd2lsbCBmYWlsIChoYW5nKSBvbiBlYXJsaWVyIHZlcnNpb25zIG9mIHNxbGl0ZS4KKyAgICAgICAgICAgICMgRGV0ZXJtaW5lIGV4YWN0IHZlcnNpb24gaXQgd2FzIGZpeGVkLiAzLjIuMSBoYW5ncy4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgIyBOTyBzZWxmLmNvbjIucm9sbGJhY2soKSBIRVJFISEhCisgICAgICAgIHNlbGYuY29uMS5jb21taXQoKQorCisgICAgZGVmIENoZWNrUm9sbGJhY2tDdXJzb3JDb25zaXN0ZW5jeShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrcyBpZiBjdXJzb3JzIG9uIHRoZSBjb25uZWN0aW9uIGFyZSBzZXQgaW50byBhICJyZXNldCIgc3RhdGUKKyAgICAgICAgd2hlbiBhIHJvbGxiYWNrIGlzIGRvbmUgb24gdGhlIGNvbm5lY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHgpIikKKyAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg1KSIpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgMSB1bmlvbiBzZWxlY3QgMiB1bmlvbiBzZWxlY3QgMyIpCisKKyAgICAgICAgY29uLnJvbGxiYWNrKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmZldGNoYWxsKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiSW50ZXJmYWNlRXJyb3Igc2hvdWxkIGhhdmUgYmVlbiByYWlzZWQiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkludGVyZmFjZUVycm9yLCBlOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkludGVyZmFjZUVycm9yIHNob3VsZCBoYXZlIGJlZW4gcmFpc2VkIikKKworY2xhc3MgU3BlY2lhbENvbW1hbmRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKworICAgIGRlZiBDaGVja1ZhY3V1bShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJ2YWN1dW0iKQorCisgICAgZGVmIENoZWNrRHJvcFRhYmxlKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImRyb3AgdGFibGUgdGVzdCIpCisKKyAgICBkZWYgQ2hlY2tQcmFnbWEoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgicHJhZ21hIGNvdW50X2NoYW5nZXM9MSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCitkZWYgc3VpdGUoKToKKyAgICBkZWZhdWx0X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRyYW5zYWN0aW9uVGVzdHMsICJDaGVjayIpCisgICAgc3BlY2lhbF9jb21tYW5kX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFNwZWNpYWxDb21tYW5kVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoZGVmYXVsdF9zdWl0ZSwgc3BlY2lhbF9jb21tYW5kX3N1aXRlKSkKKworZGVmIHRlc3QoKToKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5YyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxNjNhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdHJhbnNhY3Rpb25zLnB5byBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUxNjNhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdHlwZXMucHkgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC90eXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWFiMzliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKQEAgLTAsMCArMSw0MTggQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvdGVzdC90eXBlcy5weTogdGVzdHMgZm9yIHR5cGUgY29udmVyc2lvbiBhbmQgZGV0ZWN0aW9uCisjCisjIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCit0cnk6CisgICAgaW1wb3J0IHpsaWIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB6bGliID0gTm9uZQorCisKK2NsYXNzIFNxbGl0ZVR5cGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSBpbnRlZ2VyLCBzIHZhcmNoYXIsIGYgbnVtYmVyLCBiIGJsb2IpIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tTdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QocykgdmFsdWVzICg/KSIsICh1ItZzdGVycmVpY2giLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBzIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHUi1nN0ZXJyZWljaCIpCisKKyAgICBkZWYgQ2hlY2tTbWFsbEludChzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIDQyKQorCisgICAgZGVmIENoZWNrTGFyZ2VJbnQoc2VsZik6CisgICAgICAgIG51bSA9IDIqKjQwCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsIChudW0sKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgbnVtKQorCisgICAgZGVmIENoZWNrRmxvYXQoc2VsZik6CisgICAgICAgIHZhbCA9IDMuMTQKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZiBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCB2YWwpCisKKyAgICBkZWYgQ2hlY2tCbG9iKHNlbGYpOgorICAgICAgICB2YWwgPSBidWZmZXIoIkd1Z2xodXBmIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChiKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYiBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCB2YWwpCisKKyAgICBkZWYgQ2hlY2tVbmljb2RlRXhlY3V0ZShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSh1InNlbGVjdCAn1nN0ZXJyZWljaCciKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCB1ItZzdGVycmVpY2giKQorCisgICAgZGVmIENoZWNrTm9uVXRmOF9EZWZhdWx0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgPyIsIChjaHIoMTUwKSwpKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrTm9uVXRmOF9UZXh0RmFjdG9yeVN0cmluZyhzZWxmKToKKyAgICAgICAgb3JpZ190ZXh0X2ZhY3RvcnkgPSBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3RyCisgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgPyIsIChjaHIoMTUwKSwpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gb3JpZ190ZXh0X2ZhY3RvcnkKKworICAgIGRlZiBDaGVja05vblV0ZjhfVGV4dEZhY3RvcnlPcHRpbWl6ZWRVbmljb2RlKHNlbGYpOgorICAgICAgICBvcmlnX3RleHRfZmFjdG9yeSA9IHNlbGYuY29uLnRleHRfZmFjdG9yeQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlLk9wdGltaXplZFVuaWNvZGUKKyAgICAgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgPyIsIChjaHIoMTUwKSwpKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gb3JpZ190ZXh0X2ZhY3RvcnkKKworY2xhc3MgRGVjbFR5cGVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGNsYXNzIEZvbzoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIF92YWwpOgorICAgICAgICAgICAgc2VsZi52YWwgPSBfdmFsCisKKyAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIERlY2xUeXBlc1Rlc3RzLkZvbyk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICAgICAgaWYgc2VsZi52YWwgPT0gb3RoZXIudmFsOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgZGVmIF9fY29uZm9ybV9fKHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgICAgIGlmIHByb3RvY29sIGlzIHNxbGl0ZS5QcmVwYXJlUHJvdG9jb2w6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gIjwlcz4iICUgc2VsZi52YWwKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBkZXRlY3RfdHlwZXM9c3FsaXRlLlBBUlNFX0RFQ0xUWVBFUykKKyAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpIGludCwgcyBzdHIsIGYgZmxvYXQsIGIgYm9vbCwgdSB1bmljb2RlLCBmb28gZm9vLCBiaW4gYmxvYiwgbjEgbnVtYmVyLCBuMiBudW1iZXIoNSkpIikKKworICAgICAgICAjIG92ZXJyaWRlIGZsb2F0LCBtYWtlIHRoZW0gYWx3YXlzIHJldHVybiB0aGUgc2FtZSBudW1iZXIKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkZMT0FUIl0gPSBsYW1iZGEgeDogNDcuMgorCisgICAgICAgICMgYW5kIGltcGxlbWVudCB0d28gY3VzdG9tIG9uZXMKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkJPT0wiXSA9IGxhbWJkYSB4OiBib29sKGludCh4KSkKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkZPTyJdID0gRGVjbFR5cGVzVGVzdHMuRm9vCisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJXUk9ORyJdID0gbGFtYmRhIHg6ICJXUk9ORyIKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIk5VTUJFUiJdID0gZmxvYXQKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGTE9BVCJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siQk9PTCJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRk9PIl0KKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJOVU1CRVIiXQorICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKKyAgICAgICAgIyBkZWZhdWx0CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QocykgdmFsdWVzICg/KSIsICgiZm9vIiwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCdzZWxlY3QgcyBhcyAicyBbV1JPTkddIiBmcm9tIHRlc3QnKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKKworICAgIGRlZiBDaGVja1NtYWxsSW50KHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIDQyKQorCisgICAgZGVmIENoZWNrTGFyZ2VJbnQoc2VsZik6CisgICAgICAgICMgZGVmYXVsdAorICAgICAgICBudW0gPSAyKio0MAorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCAobnVtLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIG51bSkKKworICAgIGRlZiBDaGVja0Zsb2F0KHNlbGYpOgorICAgICAgICAjIGN1c3RvbQorICAgICAgICB2YWwgPSAzLjE0CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZikgdmFsdWVzICg/KSIsICh2YWwsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGYgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgNDcuMikKKworICAgIGRlZiBDaGVja0Jvb2woc2VsZik6CisgICAgICAgICMgY3VzdG9tCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsIChGYWxzZSwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYiBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBGYWxzZSkKKworICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChiKSB2YWx1ZXMgKD8pIiwgKFRydWUsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGIgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgVHJ1ZSkKKworICAgIGRlZiBDaGVja1VuaWNvZGUoc2VsZik6CisgICAgICAgICMgZGVmYXVsdAorICAgICAgICB2YWwgPSB1Ilx4ZDZzdGVycmVpY2giCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodSkgdmFsdWVzICg/KSIsICh2YWwsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHUgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgdmFsKQorCisgICAgZGVmIENoZWNrRm9vKHNlbGYpOgorICAgICAgICB2YWwgPSBEZWNsVHlwZXNUZXN0cy5Gb28oImJsYSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZm9vKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgZm9vIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHZhbCkKKworICAgIGRlZiBDaGVja1Vuc3VwcG9ydGVkU2VxKHNlbGYpOgorICAgICAgICBjbGFzcyBCYXI6IHBhc3MKKyAgICAgICAgdmFsID0gQmFyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gSW50ZXJmYWNlRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkludGVyZmFjZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBJbnRlcmZhY2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tVbnN1cHBvcnRlZERpY3Qoc2VsZik6CisgICAgICAgIGNsYXNzIEJhcjogcGFzcworICAgICAgICB2YWwgPSBCYXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoOnZhbCkiLCB7InZhbCI6IHZhbH0pCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBJbnRlcmZhY2VFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuSW50ZXJmYWNlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIEludGVyZmFjZUVycm9yIikKKworICAgIGRlZiBDaGVja0Jsb2Ioc2VsZik6CisgICAgICAgICMgZGVmYXVsdAorICAgICAgICB2YWwgPSBidWZmZXIoIkd1Z2xodXBmIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChiaW4pIHZhbHVlcyAoPykiLCAodmFsLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBiaW4gZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgdmFsKQorCisgICAgZGVmIENoZWNrTnVtYmVyMShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuMSkgdmFsdWVzICg1KSIpCisgICAgICAgIHZhbHVlID0gc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IG4xIGZyb20gdGVzdCIpLmZldGNob25lKClbMF0KKyAgICAgICAgIyBpZiB0aGUgY29udmVydGVyIGlzIG5vdCB1c2VkLCBpdCdzIGFuIGludCBpbnN0ZWFkIG9mIGEgZmxvYXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbHVlKSwgZmxvYXQpCisKKyAgICBkZWYgQ2hlY2tOdW1iZXIyKHNlbGYpOgorICAgICAgICAiIiJDaGVja3Mgd2V0aGVyIGNvbnZlcnRlciBuYW1lcyBhcmUgY3V0IG9mZiBhdCAnKCcgY2hhcmFjdGVycyIiIgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG4yKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgdmFsdWUgPSBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgbjIgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKVswXQorICAgICAgICAjIGlmIHRoZSBjb252ZXJ0ZXIgaXMgbm90IHVzZWQsIGl0J3MgYW4gaW50IGluc3RlYWQgb2YgYSBmbG9hdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWUpLCBmbG9hdCkKKworY2xhc3MgQ29sTmFtZXNUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfQ09MTkFNRVMpCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoeCBmb28pIikKKworICAgICAgICBzcWxpdGUuY29udmVydGVyc1siRk9PIl0gPSBsYW1iZGEgeDogIlslc10iICUgeAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siQkFSIl0gPSBsYW1iZGEgeDogIjwlcz4iICUgeAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siRVhDIl0gPSBsYW1iZGEgeDogNSAvLyAwCisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCMUIxIl0gPSBsYW1iZGEgeDogIk1BUktFUiIKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGT08iXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkJBUiJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRVhDIl0KKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCMUIxIl0KKyAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tEZWNsVHlwZU5vdFVzZWQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBBc3N1cmVzIHRoYXQgdGhlIGRlY2xhcmVkIHR5cGUgaXMgbm90IHVzZWQgd2hlbiBQQVJTRV9ERUNMVFlQRVMKKyAgICAgICAgaXMgbm90IHNldC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsICgieHh4IiwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgeCBmcm9tIHRlc3QiKQorICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAieHh4IikKKworICAgIGRlZiBDaGVja05vbmUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoeCkgdmFsdWVzICg/KSIsIChOb25lLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB4IGZyb20gdGVzdCIpCisgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tDb2xOYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHgpIHZhbHVlcyAoPykiLCAoInh4eCIsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgnc2VsZWN0IHggYXMgInggW2Jhcl0iIGZyb20gdGVzdCcpCisgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsICI8eHh4PiIpCisKKyAgICAgICAgIyBDaGVjayBpZiB0aGUgc3RyaXBwaW5nIG9mIGNvbG5hbWVzIHdvcmtzLiBFdmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdAorICAgICAgICAjIHdoaXRlc3BhY2Ugc2hvdWxkIGJlIHN0cmlwcGVkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3VyLmRlc2NyaXB0aW9uWzBdWzBdLCAieCIpCisKKyAgICBkZWYgQ2hlY2tDYXNlSW5Db252ZXJ0ZXJOYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCIiInNlbGVjdCAnb3RoZXInIGFzICJ4IFtiMWIxXVwiIiIiKQorICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAiTUFSS0VSIikKKworICAgIGRlZiBDaGVja0N1cnNvckRlc2NyaXB0aW9uTm9Sb3coc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBjdXJzb3IuZGVzY3JpcHRpb24gc2hvdWxkIGF0IGxlYXN0IHByb3ZpZGUgdGhlIGNvbHVtbiBuYW1lKHMpLCBldmVuIGlmCisgICAgICAgIG5vIHJvdyByZXR1cm5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCAqIGZyb20gdGVzdCB3aGVyZSAwID0gMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdXIuZGVzY3JpcHRpb25bMF1bMF0sICJ4IikKKworY2xhc3MgT2JqZWN0QWRhcHRhdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgY2FzdChvYmopOgorICAgICAgICByZXR1cm4gZmxvYXQob2JqKQorICAgIGNhc3QgPSBzdGF0aWNtZXRob2QoY2FzdCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc3FsaXRlLmFkYXB0ZXJzW2ludF0KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBzcWxpdGUucmVnaXN0ZXJfYWRhcHRlcihpbnQsIE9iamVjdEFkYXB0YXRpb25UZXN0cy5jYXN0KQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbCBzcWxpdGUuYWRhcHRlcnNbKGludCwgc3FsaXRlLlByZXBhcmVQcm90b2NvbCldCisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrQ2FzdGVySXNVc2VkKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgPyIsICg0LCkpCisgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIGZsb2F0KQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCitjbGFzcyBCaW5hcnlDb252ZXJ0ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGNvbnZlcnQocyk6CisgICAgICAgIHJldHVybiB6bGliLmRlY29tcHJlc3MocykKKyAgICBjb252ZXJ0ID0gc3RhdGljbWV0aG9kKGNvbnZlcnQpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9DT0xOQU1FUykKKyAgICAgICAgc3FsaXRlLnJlZ2lzdGVyX2NvbnZlcnRlcigiYmluIiwgQmluYXJ5Q29udmVydGVyVGVzdHMuY29udmVydCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrQmluYXJ5SW5wdXRGb3JDb252ZXJ0ZXIoc2VsZik6CisgICAgICAgIHRlc3RkYXRhID0gImFiY2RlZmciICogMTAKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5jb24uZXhlY3V0ZSgnc2VsZWN0ID8gYXMgInggW2Jpbl0iJywgKGJ1ZmZlcih6bGliLmNvbXByZXNzKHRlc3RkYXRhKSksKSkuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RkYXRhLCByZXN1bHQpCisKK2NsYXNzIERhdGVUaW1lVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBkZXRlY3RfdHlwZXM9c3FsaXRlLlBBUlNFX0RFQ0xUWVBFUykKKyAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChkIGRhdGUsIHRzIHRpbWVzdGFtcCkiKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja1NxbGl0ZURhdGUoc2VsZik6CisgICAgICAgIGQgPSBzcWxpdGUuRGF0ZSgyMDA0LCAyLCAxNCkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChkKSB2YWx1ZXMgKD8pIiwgKGQsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGQgZnJvbSB0ZXN0IikKKyAgICAgICAgZDIgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZDIpCisKKyAgICBkZWYgQ2hlY2tTcWxpdGVUaW1lc3RhbXAoc2VsZik6CisgICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAyLCAxNCwgNywgMTUsIDApCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodHMpIHZhbHVlcyAoPykiLCAodHMsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHRzIGZyb20gdGVzdCIpCisgICAgICAgIHRzMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cywgdHMyKQorCisgICAgZGVmIENoZWNrU3FsVGltZXN0YW1wKHNlbGYpOgorICAgICAgICAjIFRoZSBkYXRlIGZ1bmN0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgaW4gU1FMaXRlIHZlcnNpb24gMy4xIG9yIGxhdGVyCisgICAgICAgIGlmIHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDEpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBTUUxpdGUncyBjdXJyZW50X3RpbWVzdGFtcCB1c2VzIFVUQyB0aW1lLCB3aGlsZSBkYXRldGltZS5kYXRldGltZS5ub3coKSB1c2VzIGxvY2FsIHRpbWUuCisgICAgICAgIG5vdyA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodHMpIHZhbHVlcyAoY3VycmVudF90aW1lc3RhbXApIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHRzIGZyb20gdGVzdCIpCisgICAgICAgIHRzID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodHMpLCBkYXRldGltZS5kYXRldGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy55ZWFyLCBub3cueWVhcikKKworICAgIGRlZiBDaGVja0RhdGVUaW1lU3ViU2Vjb25kcyhzZWxmKToKKyAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wKDIwMDQsIDIsIDE0LCA3LCAxNSwgMCwgNTAwMDAwKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKD8pIiwgKHRzLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQorICAgICAgICB0czIgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMsIHRzMikKKworICAgIGRlZiBDaGVja0RhdGVUaW1lU3ViU2Vjb25kc0Zsb2F0aW5nUG9pbnQoc2VsZik6CisgICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAyLCAxNCwgNywgMTUsIDAsIDUxMDI0MSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0cykgdmFsdWVzICg/KSIsICh0cywpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdHMgZnJvbSB0ZXN0IikKKyAgICAgICAgdHMyID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLCB0czIpCisKK2RlZiBzdWl0ZSgpOgorICAgIHNxbGl0ZV90eXBlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFNxbGl0ZVR5cGVUZXN0cywgIkNoZWNrIikKKyAgICBkZWNsdHlwZXNfdHlwZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShEZWNsVHlwZXNUZXN0cywgIkNoZWNrIikKKyAgICBjb2xuYW1lc190eXBlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbE5hbWVzVGVzdHMsICJDaGVjayIpCisgICAgYWRhcHRhdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShPYmplY3RBZGFwdGF0aW9uVGVzdHMsICJDaGVjayIpCisgICAgYmluX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEJpbmFyeUNvbnZlcnRlclRlc3RzLCAiQ2hlY2siKQorICAgIGRhdGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRGF0ZVRpbWVUZXN0cywgIkNoZWNrIikKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChzcWxpdGVfdHlwZV9zdWl0ZSwgZGVjbHR5cGVzX3R5cGVfc3VpdGUsIGNvbG5hbWVzX3R5cGVfc3VpdGUsIGFkYXB0YXRpb25fc3VpdGUsIGJpbl9zdWl0ZSwgZGF0ZV9zdWl0ZSkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3R5cGVzLnB5YyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3R5cGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU3MmVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdHlwZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3R5cGVzLnB5byBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3R5cGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU3MmVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdHlwZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNDgxMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CkBAIC0wLDAgKzEsNDY3IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weTogdGVzdHMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYW5kCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZXMuCisjCisjIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQorCitkZWYgZnVuY19yZXR1cm50ZXh0KCk6CisgICAgcmV0dXJuICJmb28iCitkZWYgZnVuY19yZXR1cm51bmljb2RlKCk6CisgICAgcmV0dXJuIHUiYmFyIgorZGVmIGZ1bmNfcmV0dXJuaW50KCk6CisgICAgcmV0dXJuIDQyCitkZWYgZnVuY19yZXR1cm5mbG9hdCgpOgorICAgIHJldHVybiAzLjE0CitkZWYgZnVuY19yZXR1cm5udWxsKCk6CisgICAgcmV0dXJuIE5vbmUKK2RlZiBmdW5jX3JldHVybmJsb2IoKToKKyAgICByZXR1cm4gYnVmZmVyKCJibG9iIikKK2RlZiBmdW5jX3JldHVybmxvbmdsb25nKCk6CisgICAgcmV0dXJuIDE8PDMxCitkZWYgZnVuY19yYWlzZWV4Y2VwdGlvbigpOgorICAgIDUgLy8gMAorCitkZWYgZnVuY19pc3N0cmluZyh2KToKKyAgICByZXR1cm4gdHlwZSh2KSBpcyB1bmljb2RlCitkZWYgZnVuY19pc2ludCh2KToKKyAgICByZXR1cm4gdHlwZSh2KSBpcyBpbnQKK2RlZiBmdW5jX2lzZmxvYXQodik6CisgICAgcmV0dXJuIHR5cGUodikgaXMgZmxvYXQKK2RlZiBmdW5jX2lzbm9uZSh2KToKKyAgICByZXR1cm4gdHlwZSh2KSBpcyB0eXBlKE5vbmUpCitkZWYgZnVuY19pc2Jsb2Iodik6CisgICAgcmV0dXJuIHR5cGUodikgaXMgYnVmZmVyCitkZWYgZnVuY19pc2xvbmdsb25nKHYpOgorICAgIHJldHVybiBpc2luc3RhbmNlKHYsIChpbnQsIGxvbmcpKSBhbmQgdiA+PSAxPDwzMQorCitjbGFzcyBBZ2dyTm9TdGVwOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gMQorCitjbGFzcyBBZ2dyTm9GaW5hbGl6ZToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBzdGVwKHNlbGYsIHgpOgorICAgICAgICBwYXNzCisKK2NsYXNzIEFnZ3JFeGNlcHRpb25JbkluaXQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICA1IC8vIDAKKworICAgIGRlZiBzdGVwKHNlbGYsIHgpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZmluYWxpemUoc2VsZik6CisgICAgICAgIHBhc3MKKworY2xhc3MgQWdnckV4Y2VwdGlvbkluU3RlcDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBzdGVwKHNlbGYsIHgpOgorICAgICAgICA1IC8vIDAKKworICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIDQyCisKK2NsYXNzIEFnZ3JFeGNlcHRpb25JbkZpbmFsaXplOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHN0ZXAoc2VsZiwgeCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgNSAvLyAwCisKK2NsYXNzIEFnZ3JDaGVja1R5cGU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbCA9IE5vbmUKKworICAgIGRlZiBzdGVwKHNlbGYsIHdoaWNoVHlwZSwgdmFsKToKKyAgICAgICAgdGhlVHlwZSA9IHsic3RyIjogdW5pY29kZSwgImludCI6IGludCwgImZsb2F0IjogZmxvYXQsICJOb25lIjogdHlwZShOb25lKSwgImJsb2IiOiBidWZmZXJ9CisgICAgICAgIHNlbGYudmFsID0gaW50KHRoZVR5cGVbd2hpY2hUeXBlXSBpcyB0eXBlKHZhbCkpCisKKyAgICBkZWYgZmluYWxpemUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbAorCitjbGFzcyBBZ2dyU3VtOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWwgPSAwLjAKKworICAgIGRlZiBzdGVwKHNlbGYsIHZhbCk6CisgICAgICAgIHNlbGYudmFsICs9IHZhbAorCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWwKKworY2xhc3MgRnVuY3Rpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm50ZXh0IiwgMCwgZnVuY19yZXR1cm50ZXh0KQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybnVuaWNvZGUiLCAwLCBmdW5jX3JldHVybnVuaWNvZGUpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJuaW50IiwgMCwgZnVuY19yZXR1cm5pbnQpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJuZmxvYXQiLCAwLCBmdW5jX3JldHVybmZsb2F0KQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybm51bGwiLCAwLCBmdW5jX3JldHVybm51bGwpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJuYmxvYiIsIDAsIGZ1bmNfcmV0dXJuYmxvYikKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5sb25nbG9uZyIsIDAsIGZ1bmNfcmV0dXJubG9uZ2xvbmcpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmFpc2VleGNlcHRpb24iLCAwLCBmdW5jX3JhaXNlZXhjZXB0aW9uKQorCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNzdHJpbmciLCAxLCBmdW5jX2lzc3RyaW5nKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzaW50IiwgMSwgZnVuY19pc2ludCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2Zsb2F0IiwgMSwgZnVuY19pc2Zsb2F0KQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzbm9uZSIsIDEsIGZ1bmNfaXNub25lKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzYmxvYiIsIDEsIGZ1bmNfaXNibG9iKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzbG9uZ2xvbmciLCAxLCBmdW5jX2lzbG9uZ2xvbmcpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja0Z1bmNFcnJvck9uQ3JlYXRlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImJsYSIsIC0xMDAsIGxhbWJkYSB4OiAyKngpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrRnVuY1JlZkNvdW50KHNlbGYpOgorICAgICAgICBkZWYgZ2V0ZnVuYygpOgorICAgICAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgcmV0dXJuIGYKKyAgICAgICAgZiA9IGdldGZ1bmMoKQorICAgICAgICBnbG9iYWxzKClbImZvbyJdID0gZgorICAgICAgICAjIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmVmdGVzdCIsIDAsIGdldGZ1bmMoKSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZWZ0ZXN0IiwgMCwgZikKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZWZ0ZXN0KCkiKQorCisgICAgZGVmIENoZWNrRnVuY1JldHVyblRleHQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJudGV4dCgpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAiZm9vIikKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5Vbmljb2RlKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnVuaWNvZGUoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgdSJiYXIiKQorCisgICAgZGVmIENoZWNrRnVuY1JldHVybkludChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5pbnQoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCA0MikKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5GbG9hdChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5mbG9hdCgpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIGZsb2F0KQorICAgICAgICBpZiB2YWwgPCAzLjEzOSBvciB2YWwgPiAzLjE0MToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgdmFsdWUiKQorCisgICAgZGVmIENoZWNrRnVuY1JldHVybk51bGwoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJubnVsbCgpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIHR5cGUoTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCBOb25lKQorCisgICAgZGVmIENoZWNrRnVuY1JldHVybkJsb2Ioc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuYmxvYigpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbCksIGJ1ZmZlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIGJ1ZmZlcigiYmxvYiIpKQorCisgICAgZGVmIENoZWNrRnVuY1JldHVybkxvbmdMb25nKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmxvbmdsb25nKCkiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMTw8MzEpCisKKyAgICBkZWYgQ2hlY2tGdW5jRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJhaXNlZXhjZXB0aW9uKCkiKQorICAgICAgICAgICAgY3VyLmZldGNob25lKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgJ3VzZXItZGVmaW5lZCBmdW5jdGlvbiByYWlzZWQgZXhjZXB0aW9uJykKKworICAgIGRlZiBDaGVja1BhcmFtU3RyaW5nKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzc3RyaW5nKD8pIiwgKCJmb28iLCkpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrUGFyYW1JbnQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNpbnQoPykiLCAoNDIsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tQYXJhbUZsb2F0KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzZmxvYXQoPykiLCAoMy4xNCwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja1BhcmFtTm9uZShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc25vbmUoPykiLCAoTm9uZSwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja1BhcmFtQmxvYihzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2Jsb2IoPykiLCAoYnVmZmVyKCJibG9iIiksKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tQYXJhbUxvbmdMb25nKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzbG9uZ2xvbmcoPykiLCAoMTw8NDIsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCisKK2NsYXNzIEFnZ3JlZ2F0ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoIiIiCisgICAgICAgICAgICBjcmVhdGUgdGFibGUgdGVzdCgKKyAgICAgICAgICAgICAgICB0IHRleHQsCisgICAgICAgICAgICAgICAgaSBpbnRlZ2VyLAorICAgICAgICAgICAgICAgIGYgZmxvYXQsCisgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICBiIGJsb2IKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAiIiIpCisgICAgICAgIGN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHQsIGksIGYsIG4sIGIpIHZhbHVlcyAoPywgPywgPywgPywgPykiLAorICAgICAgICAgICAgKCJmb28iLCA1LCAzLjE0LCBOb25lLCBidWZmZXIoImJsb2IiKSwpKQorCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoIm5vc3RlcCIsIDEsIEFnZ3JOb1N0ZXApCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoIm5vZmluYWxpemUiLCAxLCBBZ2dyTm9GaW5hbGl6ZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZXhjSW5pdCIsIDEsIEFnZ3JFeGNlcHRpb25JbkluaXQpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImV4Y1N0ZXAiLCAxLCBBZ2dyRXhjZXB0aW9uSW5TdGVwKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJleGNGaW5hbGl6ZSIsIDEsIEFnZ3JFeGNlcHRpb25JbkZpbmFsaXplKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJjaGVja1R5cGUiLCAyLCBBZ2dyQ2hlY2tUeXBlKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJteXN1bSIsIDEsIEFnZ3JTdW0pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICNzZWxmLmN1ci5jbG9zZSgpCisgICAgICAgICNzZWxmLmNvbi5jbG9zZSgpCisgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0FnZ3JFcnJvck9uQ3JlYXRlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImJsYSIsIC0xMDAsIEFnZ3JTdW0pCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrQWdnck5vU3RlcChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBub3N0ZXAodCkgZnJvbSB0ZXN0IikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIEF0dHJpYnV0ZUVycm9yIikKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sICJBZ2dyTm9TdGVwIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJ3N0ZXAnIikKKworICAgIGRlZiBDaGVja0FnZ3JOb0ZpbmFsaXplKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG5vZmluYWxpemUodCkgZnJvbSB0ZXN0IikKKyAgICAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ2ZpbmFsaXplJyBtZXRob2QgcmFpc2VkIGVycm9yIikKKworICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkluaXQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjSW5pdCh0KSBmcm9tIHRlc3QiKQorICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnX19pbml0X18nIG1ldGhvZCByYWlzZWQgZXJyb3IiKQorCisgICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluU3RlcChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNTdGVwKHQpIGZyb20gdGVzdCIpCisgICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdzdGVwJyBtZXRob2QgcmFpc2VkIGVycm9yIikKKworICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkZpbmFsaXplKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y0ZpbmFsaXplKHQpIGZyb20gdGVzdCIpCisgICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdmaW5hbGl6ZScgbWV0aG9kIHJhaXNlZCBlcnJvciIpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbVN0cihzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ3N0cicsID8pIiwgKCJmb28iLCkpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1JbnQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdpbnQnLCA/KSIsICg0MiwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtRmxvYXQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdmbG9hdCcsID8pIiwgKDMuMTQsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbU5vbmUoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdOb25lJywgPykiLCAoTm9uZSwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtQmxvYihzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2Jsb2InLCA/KSIsIChidWZmZXIoImJsb2IiKSwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja0FnZ3JDaGVja0FnZ3JTdW0oc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgY3VyLmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCBbKDEwLCksICgyMCwpLCAoMzAsKV0pCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgbXlzdW0oaSkgZnJvbSB0ZXN0IikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDYwKQorCitjbGFzcyBBdXRob3JpemVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKKyAgICAgICAgaWYgYWN0aW9uICE9IHNxbGl0ZS5TUUxJVEVfU0VMRUNUOgorICAgICAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfREVOWQorICAgICAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgorICAgICAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfREVOWQorICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9PSworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHNlbGYuY29uLmV4ZWN1dGVzY3JpcHQoIiIiCisgICAgICAgICAgICBjcmVhdGUgdGFibGUgdDEgKGMxLCBjMik7CisgICAgICAgICAgICBjcmVhdGUgdGFibGUgdDIgKGMxLCBjMik7CisgICAgICAgICAgICBpbnNlcnQgaW50byB0MSAoYzEsIGMyKSB2YWx1ZXMgKDEsIDIpOworICAgICAgICAgICAgaW5zZXJ0IGludG8gdDIgKGMxLCBjMikgdmFsdWVzICg0LCA1KTsKKyAgICAgICAgICAgICIiIikKKworICAgICAgICAjIEZvciBvdXIgc2VjdXJpdHkgdGVzdDoKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGMyIGZyb20gdDIiKQorCisgICAgICAgIHNlbGYuY29uLnNldF9hdXRob3JpemVyKHNlbGYuYXV0aG9yaXplcl9jYikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfdGFibGVfYWNjZXNzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHQyIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5EYXRhYmFzZUVycm9yLCBlOgorICAgICAgICAgICAgaWYgbm90IGUuYXJnc1swXS5lbmRzd2l0aCgicHJvaGliaXRlZCIpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIHRleHQ6ICVzIiAlIGUuYXJnc1swXSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBleGNlcHRpb24gZHVlIHRvIG1pc3NpbmcgcHJpdmlsZWdlcyIpCisKKyAgICBkZWYgdGVzdF9jb2x1bW5fYWNjZXNzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgYzIgZnJvbSB0MSIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuRGF0YWJhc2VFcnJvciwgZToKKyAgICAgICAgICAgIGlmIG5vdCBlLmFyZ3NbMF0uZW5kc3dpdGgoInByb2hpYml0ZWQiKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGV4Y2VwdGlvbiB0ZXh0OiAlcyIgJSBlLmFyZ3NbMF0pCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIGR1ZSB0byBtaXNzaW5nIHByaXZpbGVnZXMiKQorCitjbGFzcyBBdXRob3JpemVyUmFpc2VFeGNlcHRpb25UZXN0cyhBdXRob3JpemVyVGVzdHMpOgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKKyAgICAgICAgaWYgYWN0aW9uICE9IHNxbGl0ZS5TUUxJVEVfU0VMRUNUOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9PSworCitjbGFzcyBBdXRob3JpemVySWxsZWdhbFR5cGVUZXN0cyhBdXRob3JpemVyVGVzdHMpOgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKKyAgICAgICAgaWYgYWN0aW9uICE9IHNxbGl0ZS5TUUxJVEVfU0VMRUNUOgorICAgICAgICAgICAgcmV0dXJuIDAuMAorICAgICAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgorICAgICAgICAgICAgcmV0dXJuIDAuMAorICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9PSworCitjbGFzcyBBdXRob3JpemVyTGFyZ2VJbnRlZ2VyVGVzdHMoQXV0aG9yaXplclRlc3RzKToKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CisgICAgICAgIGlmIGFjdGlvbiAhPSBzcWxpdGUuU1FMSVRFX1NFTEVDVDoKKyAgICAgICAgICAgIHJldHVybiAyKiozMgorICAgICAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgorICAgICAgICAgICAgcmV0dXJuIDIqKjMyCisgICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX09LCisKKworZGVmIHN1aXRlKCk6CisgICAgZnVuY3Rpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRnVuY3Rpb25UZXN0cywgIkNoZWNrIikKKyAgICBhZ2dyZWdhdGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQWdncmVnYXRlVGVzdHMsICJDaGVjayIpCisgICAgYXV0aG9yaXplcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVyVGVzdHMpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoCisgICAgICAgICAgICBmdW5jdGlvbl9zdWl0ZSwKKyAgICAgICAgICAgIGFnZ3JlZ2F0ZV9zdWl0ZSwKKyAgICAgICAgICAgIGF1dGhvcml6ZXJfc3VpdGUsCisgICAgICAgICAgICB1bml0dGVzdC5tYWtlU3VpdGUoQXV0aG9yaXplclJhaXNlRXhjZXB0aW9uVGVzdHMpLAorICAgICAgICAgICAgdW5pdHRlc3QubWFrZVN1aXRlKEF1dGhvcml6ZXJJbGxlZ2FsVHlwZVRlc3RzKSwKKyAgICAgICAgICAgIHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVyTGFyZ2VJbnRlZ2VyVGVzdHMpLAorICAgICAgICApKQorCitkZWYgdGVzdCgpOgorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5YyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Mzk5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5byBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Mzk5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NyZS5weSBiL2xpYi9weXRob24yLjcvc3JlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDU3NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NyZS5weQpAQCAtMCwwICsxLDEzIEBACisiIiJUaGlzIGZpbGUgaXMgb25seSByZXRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCitJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIHNyZSB3YXMgbW92ZWQgdG8gcmUgaW4gdmVyc2lvbiAyLjUuCisiIiIKKworaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy53YXJuKCJUaGUgc3JlIG1vZHVsZSBpcyBkZXByZWNhdGVkLCBwbGVhc2UgaW1wb3J0IHJlLiIsCisgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKKworZnJvbSByZSBpbXBvcnQgKgorZnJvbSByZSBpbXBvcnQgX19hbGxfXworCisjIG9sZCBwaWNrbGVzIGV4cGVjdCB0aGUgX2NvbXBpbGUoKSByZWNvbnN0cnVjdG9yIGluIHRoaXMgbW9kdWxlCitmcm9tIHJlIGltcG9ydCBfY29tcGlsZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcmUucHljIGIvbGliL3B5dGhvbjIuNy9zcmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjA4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NyZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcmUucHlvIGIvbGliL3B5dGhvbjIuNy9zcmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYjA4MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NyZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcmVfY29tcGlsZS5weSBiL2xpYi9weXRob24yLjcvc3JlX2NvbXBpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NkYTJiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3JlX2NvbXBpbGUucHkKQEAgLTAsMCArMSw1MjUgQEAKKyMKKyMgU2VjcmV0IExhYnMnIFJlZ3VsYXIgRXhwcmVzc2lvbiBFbmdpbmUKKyMKKyMgY29udmVydCB0ZW1wbGF0ZSB0byBpbnRlcm5hbCBmb3JtYXQKKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk3LTIwMDEgYnkgU2VjcmV0IExhYnMgQUIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBTZWUgdGhlIHNyZS5weSBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24uCisjCisKKyIiIkludGVybmFsIHN1cHBvcnQgbW9kdWxlIGZvciBzcmUiIiIKKworaW1wb3J0IF9zcmUsIHN5cworaW1wb3J0IHNyZV9wYXJzZQorZnJvbSBzcmVfY29uc3RhbnRzIGltcG9ydCAqCitmcm9tIF9zcmUgaW1wb3J0IE1BWFJFUEVBVAorCithc3NlcnQgX3NyZS5NQUdJQyA9PSBNQUdJQywgIlNSRSBtb2R1bGUgbWlzbWF0Y2giCisKK2lmIF9zcmUuQ09ERVNJWkUgPT0gMjoKKyAgICBNQVhDT0RFID0gNjU1MzUKK2Vsc2U6CisgICAgTUFYQ09ERSA9IDB4RkZGRkZGRkZMCisKK2RlZiBfaWRlbnRpdHlmdW5jdGlvbih4KToKKyAgICByZXR1cm4geAorCitfTElURVJBTF9DT0RFUyA9IHNldChbTElURVJBTCwgTk9UX0xJVEVSQUxdKQorX1JFUEVBVElOR19DT0RFUyA9IHNldChbUkVQRUFULCBNSU5fUkVQRUFULCBNQVhfUkVQRUFUXSkKK19TVUNDRVNTX0NPREVTID0gc2V0KFtTVUNDRVNTLCBGQUlMVVJFXSkKK19BU1NFUlRfQ09ERVMgPSBzZXQoW0FTU0VSVCwgQVNTRVJUX05PVF0pCisKK2RlZiBfY29tcGlsZShjb2RlLCBwYXR0ZXJuLCBmbGFncyk6CisgICAgIyBpbnRlcm5hbDogY29tcGlsZSBhIChzdWIpcGF0dGVybgorICAgIGVtaXQgPSBjb2RlLmFwcGVuZAorICAgIF9sZW4gPSBsZW4KKyAgICBMSVRFUkFMX0NPREVTID0gX0xJVEVSQUxfQ09ERVMKKyAgICBSRVBFQVRJTkdfQ09ERVMgPSBfUkVQRUFUSU5HX0NPREVTCisgICAgU1VDQ0VTU19DT0RFUyA9IF9TVUNDRVNTX0NPREVTCisgICAgQVNTRVJUX0NPREVTID0gX0FTU0VSVF9DT0RFUworICAgIGZvciBvcCwgYXYgaW4gcGF0dGVybjoKKyAgICAgICAgaWYgb3AgaW4gTElURVJBTF9DT0RFUzoKKyAgICAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfSUdOT1JFQ0FTRToKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbT1BfSUdOT1JFW29wXV0pCisgICAgICAgICAgICAgICAgZW1pdChfc3JlLmdldGxvd2VyKGF2LCBmbGFncykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCisgICAgICAgICAgICAgICAgZW1pdChhdikKKyAgICAgICAgZWxpZiBvcCBpcyBJTjoKKyAgICAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfSUdOT1JFQ0FTRToKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbT1BfSUdOT1JFW29wXV0pCisgICAgICAgICAgICAgICAgZGVmIGZpeHVwKGxpdGVyYWwsIGZsYWdzPWZsYWdzKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zcmUuZ2V0bG93ZXIobGl0ZXJhbCwgZmxhZ3MpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCisgICAgICAgICAgICAgICAgZml4dXAgPSBfaWRlbnRpdHlmdW5jdGlvbgorICAgICAgICAgICAgc2tpcCA9IF9sZW4oY29kZSk7IGVtaXQoMCkKKyAgICAgICAgICAgIF9jb21waWxlX2NoYXJzZXQoYXYsIGZsYWdzLCBjb2RlLCBmaXh1cCkKKyAgICAgICAgICAgIGNvZGVbc2tpcF0gPSBfbGVuKGNvZGUpIC0gc2tpcAorICAgICAgICBlbGlmIG9wIGlzIEFOWToKKyAgICAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfRE9UQUxMOgorICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tBTllfQUxMXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW0FOWV0pCisgICAgICAgIGVsaWYgb3AgaW4gUkVQRUFUSU5HX0NPREVTOgorICAgICAgICAgICAgaWYgZmxhZ3MgJiBTUkVfRkxBR19URU1QTEFURToKKyAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgImludGVybmFsOiB1bnN1cHBvcnRlZCB0ZW1wbGF0ZSBvcGVyYXRvciIKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbUkVQRUFUXSkKKyAgICAgICAgICAgICAgICBza2lwID0gX2xlbihjb2RlKTsgZW1pdCgwKQorICAgICAgICAgICAgICAgIGVtaXQoYXZbMF0pCisgICAgICAgICAgICAgICAgZW1pdChhdlsxXSkKKyAgICAgICAgICAgICAgICBfY29tcGlsZShjb2RlLCBhdlsyXSwgZmxhZ3MpCisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW1NVQ0NFU1NdKQorICAgICAgICAgICAgICAgIGNvZGVbc2tpcF0gPSBfbGVuKGNvZGUpIC0gc2tpcAorICAgICAgICAgICAgZWxpZiBfc2ltcGxlKGF2KSBhbmQgb3AgaXMgbm90IFJFUEVBVDoKKyAgICAgICAgICAgICAgICBpZiBvcCBpcyBNQVhfUkVQRUFUOgorICAgICAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbUkVQRUFUX09ORV0pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW01JTl9SRVBFQVRfT05FXSkKKyAgICAgICAgICAgICAgICBza2lwID0gX2xlbihjb2RlKTsgZW1pdCgwKQorICAgICAgICAgICAgICAgIGVtaXQoYXZbMF0pCisgICAgICAgICAgICAgICAgZW1pdChhdlsxXSkKKyAgICAgICAgICAgICAgICBfY29tcGlsZShjb2RlLCBhdlsyXSwgZmxhZ3MpCisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW1NVQ0NFU1NdKQorICAgICAgICAgICAgICAgIGNvZGVbc2tpcF0gPSBfbGVuKGNvZGUpIC0gc2tpcAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbUkVQRUFUXSkKKyAgICAgICAgICAgICAgICBza2lwID0gX2xlbihjb2RlKTsgZW1pdCgwKQorICAgICAgICAgICAgICAgIGVtaXQoYXZbMF0pCisgICAgICAgICAgICAgICAgZW1pdChhdlsxXSkKKyAgICAgICAgICAgICAgICBfY29tcGlsZShjb2RlLCBhdlsyXSwgZmxhZ3MpCisgICAgICAgICAgICAgICAgY29kZVtza2lwXSA9IF9sZW4oY29kZSkgLSBza2lwCisgICAgICAgICAgICAgICAgaWYgb3AgaXMgTUFYX1JFUEVBVDoKKyAgICAgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW01BWF9VTlRJTF0pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW01JTl9VTlRJTF0pCisgICAgICAgIGVsaWYgb3AgaXMgU1VCUEFUVEVSTjoKKyAgICAgICAgICAgIGlmIGF2WzBdOgorICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tNQVJLXSkKKyAgICAgICAgICAgICAgICBlbWl0KChhdlswXS0xKSoyKQorICAgICAgICAgICAgIyBfY29tcGlsZV9pbmZvKGNvZGUsIGF2WzFdLCBmbGFncykKKyAgICAgICAgICAgIF9jb21waWxlKGNvZGUsIGF2WzFdLCBmbGFncykKKyAgICAgICAgICAgIGlmIGF2WzBdOgorICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tNQVJLXSkKKyAgICAgICAgICAgICAgICBlbWl0KChhdlswXS0xKSoyKzEpCisgICAgICAgIGVsaWYgb3AgaW4gU1VDQ0VTU19DT0RFUzoKKyAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCisgICAgICAgIGVsaWYgb3AgaW4gQVNTRVJUX0NPREVTOgorICAgICAgICAgICAgZW1pdChPUENPREVTW29wXSkKKyAgICAgICAgICAgIHNraXAgPSBfbGVuKGNvZGUpOyBlbWl0KDApCisgICAgICAgICAgICBpZiBhdlswXSA+PSAwOgorICAgICAgICAgICAgICAgIGVtaXQoMCkgIyBsb29rIGFoZWFkCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvLCBoaSA9IGF2WzFdLmdldHdpZHRoKCkKKyAgICAgICAgICAgICAgICBpZiBsbyAhPSBoaToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJsb29rLWJlaGluZCByZXF1aXJlcyBmaXhlZC13aWR0aCBwYXR0ZXJuIgorICAgICAgICAgICAgICAgIGVtaXQobG8pICMgbG9vayBiZWhpbmQKKyAgICAgICAgICAgIF9jb21waWxlKGNvZGUsIGF2WzFdLCBmbGFncykKKyAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tTVUNDRVNTXSkKKyAgICAgICAgICAgIGNvZGVbc2tpcF0gPSBfbGVuKGNvZGUpIC0gc2tpcAorICAgICAgICBlbGlmIG9wIGlzIENBTEw6CisgICAgICAgICAgICBlbWl0KE9QQ09ERVNbb3BdKQorICAgICAgICAgICAgc2tpcCA9IF9sZW4oY29kZSk7IGVtaXQoMCkKKyAgICAgICAgICAgIF9jb21waWxlKGNvZGUsIGF2LCBmbGFncykKKyAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tTVUNDRVNTXSkKKyAgICAgICAgICAgIGNvZGVbc2tpcF0gPSBfbGVuKGNvZGUpIC0gc2tpcAorICAgICAgICBlbGlmIG9wIGlzIEFUOgorICAgICAgICAgICAgZW1pdChPUENPREVTW29wXSkKKyAgICAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfTVVMVElMSU5FOgorICAgICAgICAgICAgICAgIGF2ID0gQVRfTVVMVElMSU5FLmdldChhdiwgYXYpCisgICAgICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0xPQ0FMRToKKyAgICAgICAgICAgICAgICBhdiA9IEFUX0xPQ0FMRS5nZXQoYXYsIGF2KQorICAgICAgICAgICAgZWxpZiBmbGFncyAmIFNSRV9GTEFHX1VOSUNPREU6CisgICAgICAgICAgICAgICAgYXYgPSBBVF9VTklDT0RFLmdldChhdiwgYXYpCisgICAgICAgICAgICBlbWl0KEFUQ09ERVNbYXZdKQorICAgICAgICBlbGlmIG9wIGlzIEJSQU5DSDoKKyAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCisgICAgICAgICAgICB0YWlsID0gW10KKyAgICAgICAgICAgIHRhaWxhcHBlbmQgPSB0YWlsLmFwcGVuZAorICAgICAgICAgICAgZm9yIGF2IGluIGF2WzFdOgorICAgICAgICAgICAgICAgIHNraXAgPSBfbGVuKGNvZGUpOyBlbWl0KDApCisgICAgICAgICAgICAgICAgIyBfY29tcGlsZV9pbmZvKGNvZGUsIGF2LCBmbGFncykKKyAgICAgICAgICAgICAgICBfY29tcGlsZShjb2RlLCBhdiwgZmxhZ3MpCisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW0pVTVBdKQorICAgICAgICAgICAgICAgIHRhaWxhcHBlbmQoX2xlbihjb2RlKSk7IGVtaXQoMCkKKyAgICAgICAgICAgICAgICBjb2RlW3NraXBdID0gX2xlbihjb2RlKSAtIHNraXAKKyAgICAgICAgICAgIGVtaXQoMCkgIyBlbmQgb2YgYnJhbmNoCisgICAgICAgICAgICBmb3IgdGFpbCBpbiB0YWlsOgorICAgICAgICAgICAgICAgIGNvZGVbdGFpbF0gPSBfbGVuKGNvZGUpIC0gdGFpbAorICAgICAgICBlbGlmIG9wIGlzIENBVEVHT1JZOgorICAgICAgICAgICAgZW1pdChPUENPREVTW29wXSkKKyAgICAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfTE9DQUxFOgorICAgICAgICAgICAgICAgIGF2ID0gQ0hfTE9DQUxFW2F2XQorICAgICAgICAgICAgZWxpZiBmbGFncyAmIFNSRV9GTEFHX1VOSUNPREU6CisgICAgICAgICAgICAgICAgYXYgPSBDSF9VTklDT0RFW2F2XQorICAgICAgICAgICAgZW1pdChDSENPREVTW2F2XSkKKyAgICAgICAgZWxpZiBvcCBpcyBHUk9VUFJFRjoKKyAgICAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfSUdOT1JFQ0FTRToKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbT1BfSUdOT1JFW29wXV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCisgICAgICAgICAgICBlbWl0KGF2LTEpCisgICAgICAgIGVsaWYgb3AgaXMgR1JPVVBSRUZfRVhJU1RTOgorICAgICAgICAgICAgZW1pdChPUENPREVTW29wXSkKKyAgICAgICAgICAgIGVtaXQoYXZbMF0tMSkKKyAgICAgICAgICAgIHNraXB5ZXMgPSBfbGVuKGNvZGUpOyBlbWl0KDApCisgICAgICAgICAgICBfY29tcGlsZShjb2RlLCBhdlsxXSwgZmxhZ3MpCisgICAgICAgICAgICBpZiBhdlsyXToKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbSlVNUF0pCisgICAgICAgICAgICAgICAgc2tpcG5vID0gX2xlbihjb2RlKTsgZW1pdCgwKQorICAgICAgICAgICAgICAgIGNvZGVbc2tpcHllc10gPSBfbGVuKGNvZGUpIC0gc2tpcHllcyArIDEKKyAgICAgICAgICAgICAgICBfY29tcGlsZShjb2RlLCBhdlsyXSwgZmxhZ3MpCisgICAgICAgICAgICAgICAgY29kZVtza2lwbm9dID0gX2xlbihjb2RlKSAtIHNraXBubworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb2RlW3NraXB5ZXNdID0gX2xlbihjb2RlKSAtIHNraXB5ZXMgKyAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAoInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZSIsIG9wKQorCitkZWYgX2NvbXBpbGVfY2hhcnNldChjaGFyc2V0LCBmbGFncywgY29kZSwgZml4dXA9Tm9uZSk6CisgICAgIyBjb21waWxlIGNoYXJzZXQgc3VicHJvZ3JhbQorICAgIGVtaXQgPSBjb2RlLmFwcGVuZAorICAgIGlmIGZpeHVwIGlzIE5vbmU6CisgICAgICAgIGZpeHVwID0gX2lkZW50aXR5ZnVuY3Rpb24KKyAgICBmb3Igb3AsIGF2IGluIF9vcHRpbWl6ZV9jaGFyc2V0KGNoYXJzZXQsIGZpeHVwKToKKyAgICAgICAgZW1pdChPUENPREVTW29wXSkKKyAgICAgICAgaWYgb3AgaXMgTkVHQVRFOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICBlbWl0KGZpeHVwKGF2KSkKKyAgICAgICAgZWxpZiBvcCBpcyBSQU5HRToKKyAgICAgICAgICAgIGVtaXQoZml4dXAoYXZbMF0pKQorICAgICAgICAgICAgZW1pdChmaXh1cChhdlsxXSkpCisgICAgICAgIGVsaWYgb3AgaXMgQ0hBUlNFVDoKKyAgICAgICAgICAgIGNvZGUuZXh0ZW5kKGF2KQorICAgICAgICBlbGlmIG9wIGlzIEJJR0NIQVJTRVQ6CisgICAgICAgICAgICBjb2RlLmV4dGVuZChhdikKKyAgICAgICAgZWxpZiBvcCBpcyBDQVRFR09SWToKKyAgICAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfTE9DQUxFOgorICAgICAgICAgICAgICAgIGVtaXQoQ0hDT0RFU1tDSF9MT0NBTEVbYXZdXSkKKyAgICAgICAgICAgIGVsaWYgZmxhZ3MgJiBTUkVfRkxBR19VTklDT0RFOgorICAgICAgICAgICAgICAgIGVtaXQoQ0hDT0RFU1tDSF9VTklDT0RFW2F2XV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVtaXQoQ0hDT0RFU1thdl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgImludGVybmFsOiB1bnN1cHBvcnRlZCBzZXQgb3BlcmF0b3IiCisgICAgZW1pdChPUENPREVTW0ZBSUxVUkVdKQorCitkZWYgX29wdGltaXplX2NoYXJzZXQoY2hhcnNldCwgZml4dXApOgorICAgICMgaW50ZXJuYWw6IG9wdGltaXplIGNoYXJhY3RlciBzZXQKKyAgICBvdXQgPSBbXQorICAgIG91dGFwcGVuZCA9IG91dC5hcHBlbmQKKyAgICBjaGFybWFwID0gWzBdKjI1NgorICAgIHRyeToKKyAgICAgICAgZm9yIG9wLCBhdiBpbiBjaGFyc2V0OgorICAgICAgICAgICAgaWYgb3AgaXMgTkVHQVRFOgorICAgICAgICAgICAgICAgIG91dGFwcGVuZCgob3AsIGF2KSkKKyAgICAgICAgICAgIGVsaWYgb3AgaXMgTElURVJBTDoKKyAgICAgICAgICAgICAgICBjaGFybWFwW2ZpeHVwKGF2KV0gPSAxCisgICAgICAgICAgICBlbGlmIG9wIGlzIFJBTkdFOgorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGZpeHVwKGF2WzBdKSwgZml4dXAoYXZbMV0pKzEpOgorICAgICAgICAgICAgICAgICAgICBjaGFybWFwW2ldID0gMQorICAgICAgICAgICAgZWxpZiBvcCBpcyBDQVRFR09SWToKKyAgICAgICAgICAgICAgICAjIFhYWDogY291bGQgYXBwZW5kIHRvIGNoYXJtYXAgdGFpbAorICAgICAgICAgICAgICAgIHJldHVybiBjaGFyc2V0ICMgY2Fubm90IGNvbXByZXNzCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICMgY2hhcmFjdGVyIHNldCBjb250YWlucyB1bmljb2RlIGNoYXJhY3RlcnMKKyAgICAgICAgcmV0dXJuIF9vcHRpbWl6ZV91bmljb2RlKGNoYXJzZXQsIGZpeHVwKQorICAgICMgY29tcHJlc3MgY2hhcmFjdGVyIG1hcAorICAgIGkgPSBwID0gbiA9IDAKKyAgICBydW5zID0gW10KKyAgICBydW5zYXBwZW5kID0gcnVucy5hcHBlbmQKKyAgICBmb3IgYyBpbiBjaGFybWFwOgorICAgICAgICBpZiBjOgorICAgICAgICAgICAgaWYgbiA9PSAwOgorICAgICAgICAgICAgICAgIHAgPSBpCisgICAgICAgICAgICBuID0gbiArIDEKKyAgICAgICAgZWxpZiBuOgorICAgICAgICAgICAgcnVuc2FwcGVuZCgocCwgbikpCisgICAgICAgICAgICBuID0gMAorICAgICAgICBpID0gaSArIDEKKyAgICBpZiBuOgorICAgICAgICBydW5zYXBwZW5kKChwLCBuKSkKKyAgICBpZiBsZW4ocnVucykgPD0gMjoKKyAgICAgICAgIyB1c2UgbGl0ZXJhbC9yYW5nZQorICAgICAgICBmb3IgcCwgbiBpbiBydW5zOgorICAgICAgICAgICAgaWYgbiA9PSAxOgorICAgICAgICAgICAgICAgIG91dGFwcGVuZCgoTElURVJBTCwgcCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG91dGFwcGVuZCgoUkFOR0UsIChwLCBwK24tMSkpKQorICAgICAgICBpZiBsZW4ob3V0KSA8IGxlbihjaGFyc2V0KToKKyAgICAgICAgICAgIHJldHVybiBvdXQKKyAgICBlbHNlOgorICAgICAgICAjIHVzZSBiaXRtYXAKKyAgICAgICAgZGF0YSA9IF9ta19iaXRtYXAoY2hhcm1hcCkKKyAgICAgICAgb3V0YXBwZW5kKChDSEFSU0VULCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIG91dAorICAgIHJldHVybiBjaGFyc2V0CisKK2RlZiBfbWtfYml0bWFwKGJpdHMpOgorICAgIGRhdGEgPSBbXQorICAgIGRhdGFhcHBlbmQgPSBkYXRhLmFwcGVuZAorICAgIGlmIF9zcmUuQ09ERVNJWkUgPT0gMjoKKyAgICAgICAgc3RhcnQgPSAoMSwgMCkKKyAgICBlbHNlOgorICAgICAgICBzdGFydCA9ICgxTCwgMEwpCisgICAgbSwgdiA9IHN0YXJ0CisgICAgZm9yIGMgaW4gYml0czoKKyAgICAgICAgaWYgYzoKKyAgICAgICAgICAgIHYgPSB2ICsgbQorICAgICAgICBtID0gbSArIG0KKyAgICAgICAgaWYgbSA+IE1BWENPREU6CisgICAgICAgICAgICBkYXRhYXBwZW5kKHYpCisgICAgICAgICAgICBtLCB2ID0gc3RhcnQKKyAgICByZXR1cm4gZGF0YQorCisjIFRvIHJlcHJlc2VudCBhIGJpZyBjaGFyc2V0LCBmaXJzdCBhIGJpdG1hcCBvZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUKKyMgc2V0IGlzIGNvbnN0cnVjdGVkLiBUaGVuLCB0aGlzIGJpdG1hcCBpcyBzbGljZWQgaW50byBjaHVua3Mgb2YgMjU2CisjIGNoYXJhY3RlcnMsIGR1cGxpY2F0ZSBjaHVua3MgYXJlIGVsaW1pbmF0ZWQsIGFuZCBlYWNoIGNodW5rIGlzCisjIGdpdmVuIGEgbnVtYmVyLiBJbiB0aGUgY29tcGlsZWQgZXhwcmVzc2lvbiwgdGhlIGNoYXJzZXQgaXMKKyMgcmVwcmVzZW50ZWQgYnkgYSAxNi1iaXQgd29yZCBzZXF1ZW5jZSwgY29uc2lzdGluZyBvZiBvbmUgd29yZCBmb3IKKyMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgY2h1bmtzLCBhIHNlcXVlbmNlIG9mIDI1NiBieXRlcyAoMTI4IHdvcmRzKQorIyBvZiBjaHVuayBudW1iZXJzIGluZGV4ZWQgYnkgdGhlaXIgb3JpZ2luYWwgY2h1bmsgcG9zaXRpb24sIGFuZCBhCisjIHNlcXVlbmNlIG9mIGNodW5rcyAoMTYgd29yZHMgZWFjaCkuCisKKyMgQ29tcHJlc3Npb24gaXMgbm9ybWFsbHkgZ29vZDogaW4gYSB0eXBpY2FsIGNoYXJzZXQsIGxhcmdlIHJhbmdlcyBvZgorIyBVbmljb2RlIHdpbGwgYmUgZWl0aGVyIGNvbXBsZXRlbHkgZXhjbHVkZWQgKGUuZy4gaWYgb25seSBjeXJpbGxpYworIyBsZXR0ZXJzIGFyZSB0byBiZSBtYXRjaGVkKSwgb3IgY29tcGxldGVseSBpbmNsdWRlZCAoZS5nLiBpZiBsYXJnZQorIyBzdWJyYW5nZXMgb2YgS2FuamkgbWF0Y2gpLiBUaGVzZSByYW5nZXMgd2lsbCBiZSByZXByZXNlbnRlZCBieQorIyBjaHVua3Mgb2YgYWxsIG9uZS1iaXRzIG9yIGFsbCB6ZXJvLWJpdHMuCisKKyMgTWF0Y2hpbmcgY2FuIGJlIGFsc28gZG9uZSBlZmZpY2llbnRseTogdGhlIG1vcmUgc2lnbmlmaWNhbnQgYnl0ZSBvZgorIyB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgaXMgYW4gaW5kZXggaW50byB0aGUgY2h1bmsgbnVtYmVyLCBhbmQgdGhlCisjIGxlc3Mgc2lnbmlmaWNhbnQgYnl0ZSBpcyBhIGJpdCBpbmRleCBpbiB0aGUgY2h1bmsgKGp1c3QgbGlrZSB0aGUKKyMgQ0hBUlNFVCBtYXRjaGluZykuCisKKyMgSW4gVUNTLTQgbW9kZSwgdGhlIEJJR0NIQVJTRVQgb3Bjb2RlIHN0aWxsIHN1cHBvcnRzIG9ubHkgc3Vic2V0cworIyBvZiB0aGUgYmFzaWMgbXVsdGlsaW5ndWFsIHBsYW5lOyBhbiBlZmZpY2llbnQgcmVwcmVzZW50YXRpb24KKyMgZm9yIGFsbCBvZiBVVEYtMTYgaGFzIG5vdCB5ZXQgYmVlbiBkZXZlbG9wZWQuIFRoaXMgbWVhbnMsCisjIGluIHBhcnRpY3VsYXIsIHRoYXQgbmVnYXRlZCBjaGFyc2V0cyBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMKKyMgYmlnY2hhcnNldHMuCisKK2RlZiBfb3B0aW1pemVfdW5pY29kZShjaGFyc2V0LCBmaXh1cCk6CisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgYXJyYXkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHJldHVybiBjaGFyc2V0CisgICAgY2hhcm1hcCA9IFswXSo2NTUzNgorICAgIG5lZ2F0ZSA9IDAKKyAgICB0cnk6CisgICAgICAgIGZvciBvcCwgYXYgaW4gY2hhcnNldDoKKyAgICAgICAgICAgIGlmIG9wIGlzIE5FR0FURToKKyAgICAgICAgICAgICAgICBuZWdhdGUgPSAxCisgICAgICAgICAgICBlbGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgY2hhcm1hcFtmaXh1cChhdildID0gMQorICAgICAgICAgICAgZWxpZiBvcCBpcyBSQU5HRToKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoZml4dXAoYXZbMF0pLCBmaXh1cChhdlsxXSkrMSk6CisgICAgICAgICAgICAgICAgICAgIGNoYXJtYXBbaV0gPSAxCisgICAgICAgICAgICBlbGlmIG9wIGlzIENBVEVHT1JZOgorICAgICAgICAgICAgICAgICMgWFhYOiBjb3VsZCBleHBhbmQgY2F0ZWdvcnkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhcnNldCAjIGNhbm5vdCBjb21wcmVzcworICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAjIG5vbi1CTVAgY2hhcmFjdGVycworICAgICAgICByZXR1cm4gY2hhcnNldAorICAgIGlmIG5lZ2F0ZToKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgIT0gNjU1MzU6CisgICAgICAgICAgICAjIFhYWDogbmVnYXRpb24gZG9lcyBub3Qgd29yayB3aXRoIGJpZyBjaGFyc2V0cworICAgICAgICAgICAgcmV0dXJuIGNoYXJzZXQKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDY1NTM2KToKKyAgICAgICAgICAgIGNoYXJtYXBbaV0gPSBub3QgY2hhcm1hcFtpXQorICAgIGNvbXBzID0ge30KKyAgICBtYXBwaW5nID0gWzBdKjI1NgorICAgIGJsb2NrID0gMAorICAgIGRhdGEgPSBbXQorICAgIGZvciBpIGluIHhyYW5nZSgyNTYpOgorICAgICAgICBjaHVuayA9IHR1cGxlKGNoYXJtYXBbaSoyNTY6KGkrMSkqMjU2XSkKKyAgICAgICAgbmV3ID0gY29tcHMuc2V0ZGVmYXVsdChjaHVuaywgYmxvY2spCisgICAgICAgIG1hcHBpbmdbaV0gPSBuZXcKKyAgICAgICAgaWYgbmV3ID09IGJsb2NrOgorICAgICAgICAgICAgYmxvY2sgPSBibG9jayArIDEKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhICsgX21rX2JpdG1hcChjaHVuaykKKyAgICBoZWFkZXIgPSBbYmxvY2tdCisgICAgaWYgX3NyZS5DT0RFU0laRSA9PSAyOgorICAgICAgICBjb2RlID0gJ0gnCisgICAgZWxzZToKKyAgICAgICAgY29kZSA9ICdJJworICAgICMgQ29udmVydCBibG9jayBpbmRpY2VzIHRvIGJ5dGUgYXJyYXkgb2YgMjU2IGJ5dGVzCisgICAgbWFwcGluZyA9IGFycmF5LmFycmF5KCdiJywgbWFwcGluZykudG9zdHJpbmcoKQorICAgICMgQ29udmVydCBieXRlIGFycmF5IHRvIHdvcmQgYXJyYXkKKyAgICBtYXBwaW5nID0gYXJyYXkuYXJyYXkoY29kZSwgbWFwcGluZykKKyAgICBhc3NlcnQgbWFwcGluZy5pdGVtc2l6ZSA9PSBfc3JlLkNPREVTSVpFCisgICAgaGVhZGVyID0gaGVhZGVyICsgbWFwcGluZy50b2xpc3QoKQorICAgIGRhdGFbMDowXSA9IGhlYWRlcgorICAgIHJldHVybiBbKEJJR0NIQVJTRVQsIGRhdGEpXQorCitkZWYgX3NpbXBsZShhdik6CisgICAgIyBjaGVjayBpZiBhdiBpcyBhICJzaW1wbGUiIG9wZXJhdG9yCisgICAgbG8sIGhpID0gYXZbMl0uZ2V0d2lkdGgoKQorICAgIGlmIGxvID09IDAgYW5kIGhpID09IE1BWFJFUEVBVDoKKyAgICAgICAgcmFpc2UgZXJyb3IsICJub3RoaW5nIHRvIHJlcGVhdCIKKyAgICByZXR1cm4gbG8gPT0gaGkgPT0gMSBhbmQgYXZbMl1bMF1bMF0gIT0gU1VCUEFUVEVSTgorCitkZWYgX2NvbXBpbGVfaW5mbyhjb2RlLCBwYXR0ZXJuLCBmbGFncyk6CisgICAgIyBpbnRlcm5hbDogY29tcGlsZSBhbiBpbmZvIGJsb2NrLiAgaW4gdGhlIGN1cnJlbnQgdmVyc2lvbiwKKyAgICAjIHRoaXMgY29udGFpbnMgbWluL21heCBwYXR0ZXJuIHdpZHRoLCBhbmQgYW4gb3B0aW9uYWwgbGl0ZXJhbAorICAgICMgcHJlZml4IG9yIGEgY2hhcmFjdGVyIG1hcAorICAgIGxvLCBoaSA9IHBhdHRlcm4uZ2V0d2lkdGgoKQorICAgIGlmIGxvID09IDA6CisgICAgICAgIHJldHVybiAjIG5vdCB3b3J0aCBpdAorICAgICMgbG9vayBmb3IgYSBsaXRlcmFsIHByZWZpeAorICAgIHByZWZpeCA9IFtdCisgICAgcHJlZml4YXBwZW5kID0gcHJlZml4LmFwcGVuZAorICAgIHByZWZpeF9za2lwID0gMAorICAgIGNoYXJzZXQgPSBbXSAjIG5vdCB1c2VkCisgICAgY2hhcnNldGFwcGVuZCA9IGNoYXJzZXQuYXBwZW5kCisgICAgaWYgbm90IChmbGFncyAmIFNSRV9GTEFHX0lHTk9SRUNBU0UpOgorICAgICAgICAjIGxvb2sgZm9yIGxpdGVyYWwgcHJlZml4CisgICAgICAgIGZvciBvcCwgYXYgaW4gcGF0dGVybi5kYXRhOgorICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKKyAgICAgICAgICAgICAgICBpZiBsZW4ocHJlZml4KSA9PSBwcmVmaXhfc2tpcDoKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4X3NraXAgPSBwcmVmaXhfc2tpcCArIDEKKyAgICAgICAgICAgICAgICBwcmVmaXhhcHBlbmQoYXYpCisgICAgICAgICAgICBlbGlmIG9wIGlzIFNVQlBBVFRFUk4gYW5kIGxlbihhdlsxXSkgPT0gMToKKyAgICAgICAgICAgICAgICBvcCwgYXYgPSBhdlsxXVswXQorICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgICAgIHByZWZpeGFwcGVuZChhdikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAjIGlmIG5vIHByZWZpeCwgbG9vayBmb3IgY2hhcnNldCBwcmVmaXgKKyAgICAgICAgaWYgbm90IHByZWZpeCBhbmQgcGF0dGVybi5kYXRhOgorICAgICAgICAgICAgb3AsIGF2ID0gcGF0dGVybi5kYXRhWzBdCisgICAgICAgICAgICBpZiBvcCBpcyBTVUJQQVRURVJOIGFuZCBhdlsxXToKKyAgICAgICAgICAgICAgICBvcCwgYXYgPSBhdlsxXVswXQorICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgICAgIGNoYXJzZXRhcHBlbmQoKG9wLCBhdikpCisgICAgICAgICAgICAgICAgZWxpZiBvcCBpcyBCUkFOQ0g6CisgICAgICAgICAgICAgICAgICAgIGMgPSBbXQorICAgICAgICAgICAgICAgICAgICBjYXBwZW5kID0gYy5hcHBlbmQKKyAgICAgICAgICAgICAgICAgICAgZm9yIHAgaW4gYXZbMV06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgb3AsIGF2ID0gcFswXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBwZW5kKChvcCwgYXYpKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldCA9IGMKKyAgICAgICAgICAgIGVsaWYgb3AgaXMgQlJBTkNIOgorICAgICAgICAgICAgICAgIGMgPSBbXQorICAgICAgICAgICAgICAgIGNhcHBlbmQgPSBjLmFwcGVuZAorICAgICAgICAgICAgICAgIGZvciBwIGluIGF2WzFdOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIG9wLCBhdiA9IHBbMF0KKyAgICAgICAgICAgICAgICAgICAgaWYgb3AgaXMgTElURVJBTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHBlbmQoKG9wLCBhdikpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjCisgICAgICAgICAgICBlbGlmIG9wIGlzIElOOgorICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBhdgorIyMgICAgIGlmIHByZWZpeDoKKyMjICAgICAgICAgcHJpbnQgIioqKiBQUkVGSVgiLCBwcmVmaXgsIHByZWZpeF9za2lwCisjIyAgICAgaWYgY2hhcnNldDoKKyMjICAgICAgICAgcHJpbnQgIioqKiBDSEFSU0VUIiwgY2hhcnNldAorICAgICMgYWRkIGFuIGluZm8gYmxvY2sKKyAgICBlbWl0ID0gY29kZS5hcHBlbmQKKyAgICBlbWl0KE9QQ09ERVNbSU5GT10pCisgICAgc2tpcCA9IGxlbihjb2RlKTsgZW1pdCgwKQorICAgICMgbGl0ZXJhbCBmbGFnCisgICAgbWFzayA9IDAKKyAgICBpZiBwcmVmaXg6CisgICAgICAgIG1hc2sgPSBTUkVfSU5GT19QUkVGSVgKKyAgICAgICAgaWYgbGVuKHByZWZpeCkgPT0gcHJlZml4X3NraXAgPT0gbGVuKHBhdHRlcm4uZGF0YSk6CisgICAgICAgICAgICBtYXNrID0gbWFzayArIFNSRV9JTkZPX0xJVEVSQUwKKyAgICBlbGlmIGNoYXJzZXQ6CisgICAgICAgIG1hc2sgPSBtYXNrICsgU1JFX0lORk9fQ0hBUlNFVAorICAgIGVtaXQobWFzaykKKyAgICAjIHBhdHRlcm4gbGVuZ3RoCisgICAgaWYgbG8gPCBNQVhDT0RFOgorICAgICAgICBlbWl0KGxvKQorICAgIGVsc2U6CisgICAgICAgIGVtaXQoTUFYQ09ERSkKKyAgICAgICAgcHJlZml4ID0gcHJlZml4WzpNQVhDT0RFXQorICAgIGlmIGhpIDwgTUFYQ09ERToKKyAgICAgICAgZW1pdChoaSkKKyAgICBlbHNlOgorICAgICAgICBlbWl0KDApCisgICAgIyBhZGQgbGl0ZXJhbCBwcmVmaXgKKyAgICBpZiBwcmVmaXg6CisgICAgICAgIGVtaXQobGVuKHByZWZpeCkpICMgbGVuZ3RoCisgICAgICAgIGVtaXQocHJlZml4X3NraXApICMgc2tpcAorICAgICAgICBjb2RlLmV4dGVuZChwcmVmaXgpCisgICAgICAgICMgZ2VuZXJhdGUgb3ZlcmxhcCB0YWJsZQorICAgICAgICB0YWJsZSA9IFstMV0gKyAoWzBdKmxlbihwcmVmaXgpKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKHByZWZpeCkpOgorICAgICAgICAgICAgdGFibGVbaSsxXSA9IHRhYmxlW2ldKzEKKyAgICAgICAgICAgIHdoaWxlIHRhYmxlW2krMV0gPiAwIGFuZCBwcmVmaXhbaV0gIT0gcHJlZml4W3RhYmxlW2krMV0tMV06CisgICAgICAgICAgICAgICAgdGFibGVbaSsxXSA9IHRhYmxlW3RhYmxlW2krMV0tMV0rMQorICAgICAgICBjb2RlLmV4dGVuZCh0YWJsZVsxOl0pICMgZG9uJ3Qgc3RvcmUgZmlyc3QgZW50cnkKKyAgICBlbGlmIGNoYXJzZXQ6CisgICAgICAgIF9jb21waWxlX2NoYXJzZXQoY2hhcnNldCwgZmxhZ3MsIGNvZGUpCisgICAgY29kZVtza2lwXSA9IGxlbihjb2RlKSAtIHNraXAKKwordHJ5OgorICAgIHVuaWNvZGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgU1RSSU5HX1RZUEVTID0gKHR5cGUoIiIpLCkKK2Vsc2U6CisgICAgU1RSSU5HX1RZUEVTID0gKHR5cGUoIiIpLCB0eXBlKHVuaWNvZGUoIiIpKSkKKworZGVmIGlzc3RyaW5nKG9iaik6CisgICAgZm9yIHRwIGluIFNUUklOR19UWVBFUzoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIHRwKToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgcmV0dXJuIDAKKworZGVmIF9jb2RlKHAsIGZsYWdzKToKKworICAgIGZsYWdzID0gcC5wYXR0ZXJuLmZsYWdzIHwgZmxhZ3MKKyAgICBjb2RlID0gW10KKworICAgICMgY29tcGlsZSBpbmZvIGJsb2NrCisgICAgX2NvbXBpbGVfaW5mbyhjb2RlLCBwLCBmbGFncykKKworICAgICMgY29tcGlsZSB0aGUgcGF0dGVybgorICAgIF9jb21waWxlKGNvZGUsIHAuZGF0YSwgZmxhZ3MpCisKKyAgICBjb2RlLmFwcGVuZChPUENPREVTW1NVQ0NFU1NdKQorCisgICAgcmV0dXJuIGNvZGUKKworZGVmIGNvbXBpbGUocCwgZmxhZ3M9MCk6CisgICAgIyBpbnRlcm5hbDogY29udmVydCBwYXR0ZXJuIGxpc3QgdG8gaW50ZXJuYWwgZm9ybWF0CisKKyAgICBpZiBpc3N0cmluZyhwKToKKyAgICAgICAgcGF0dGVybiA9IHAKKyAgICAgICAgcCA9IHNyZV9wYXJzZS5wYXJzZShwLCBmbGFncykKKyAgICBlbHNlOgorICAgICAgICBwYXR0ZXJuID0gTm9uZQorCisgICAgY29kZSA9IF9jb2RlKHAsIGZsYWdzKQorCisgICAgIyBwcmludCBjb2RlCisKKyAgICAjIFhYWDogPGZsPiBnZXQgcmlkIG9mIHRoaXMgbGltaXRhdGlvbiEKKyAgICBpZiBwLnBhdHRlcm4uZ3JvdXBzID4gMTAwOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKKyAgICAgICAgICAgICJzb3JyeSwgYnV0IHRoaXMgdmVyc2lvbiBvbmx5IHN1cHBvcnRzIDEwMCBuYW1lZCBncm91cHMiCisgICAgICAgICAgICApCisKKyAgICAjIG1hcCBpbiBlaXRoZXIgZGlyZWN0aW9uCisgICAgZ3JvdXBpbmRleCA9IHAucGF0dGVybi5ncm91cGRpY3QKKyAgICBpbmRleGdyb3VwID0gW05vbmVdICogcC5wYXR0ZXJuLmdyb3VwcworICAgIGZvciBrLCBpIGluIGdyb3VwaW5kZXguaXRlbXMoKToKKyAgICAgICAgaW5kZXhncm91cFtpXSA9IGsKKworICAgIHJldHVybiBfc3JlLmNvbXBpbGUoCisgICAgICAgIHBhdHRlcm4sIGZsYWdzIHwgcC5wYXR0ZXJuLmZsYWdzLCBjb2RlLAorICAgICAgICBwLnBhdHRlcm4uZ3JvdXBzLTEsCisgICAgICAgIGdyb3VwaW5kZXgsIGluZGV4Z3JvdXAKKyAgICAgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcmVfY29tcGlsZS5weWMgYi9saWIvcHl0aG9uMi43L3NyZV9jb21waWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWQxMTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcmVfY29tcGlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcmVfY29tcGlsZS5weW8gYi9saWIvcHl0aG9uMi43L3NyZV9jb21waWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmFjNjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcmVfY29tcGlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcmVfY29uc3RhbnRzLnB5IGIvbGliL3B5dGhvbjIuNy9zcmVfY29uc3RhbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMTc1ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NyZV9jb25zdGFudHMucHkKQEAgLTAsMCArMSwyNTkgQEAKKyMKKyMgU2VjcmV0IExhYnMnIFJlZ3VsYXIgRXhwcmVzc2lvbiBFbmdpbmUKKyMKKyMgdmFyaW91cyBzeW1ib2xzIHVzZWQgYnkgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBlbmdpbmUuCisjIHJ1biB0aGlzIHNjcmlwdCB0byB1cGRhdGUgdGhlIF9zcmUgaW5jbHVkZSBmaWxlcyEKKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgYnkgU2VjcmV0IExhYnMgQUIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBTZWUgdGhlIHNyZS5weSBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24uCisjCisKKyIiIkludGVybmFsIHN1cHBvcnQgbW9kdWxlIGZvciBzcmUiIiIKKworIyB1cGRhdGUgd2hlbiBjb25zdGFudHMgYXJlIGFkZGVkIG9yIHJlbW92ZWQKKworTUFHSUMgPSAyMDAzMTAxNworCitmcm9tIF9zcmUgaW1wb3J0IE1BWFJFUEVBVAorCisjIFNSRSBzdGFuZGFyZCBleGNlcHRpb24gKGFjY2VzcyBhcyBzcmUuZXJyb3IpCisjIHNob3VsZCB0aGlzIHJlYWxseSBiZSBoZXJlPworCitjbGFzcyBlcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworIyBvcGVyYXRvcnMKKworRkFJTFVSRSA9ICJmYWlsdXJlIgorU1VDQ0VTUyA9ICJzdWNjZXNzIgorCitBTlkgPSAiYW55IgorQU5ZX0FMTCA9ICJhbnlfYWxsIgorQVNTRVJUID0gImFzc2VydCIKK0FTU0VSVF9OT1QgPSAiYXNzZXJ0X25vdCIKK0FUID0gImF0IgorQklHQ0hBUlNFVCA9ICJiaWdjaGFyc2V0IgorQlJBTkNIID0gImJyYW5jaCIKK0NBTEwgPSAiY2FsbCIKK0NBVEVHT1JZID0gImNhdGVnb3J5IgorQ0hBUlNFVCA9ICJjaGFyc2V0IgorR1JPVVBSRUYgPSAiZ3JvdXByZWYiCitHUk9VUFJFRl9JR05PUkUgPSAiZ3JvdXByZWZfaWdub3JlIgorR1JPVVBSRUZfRVhJU1RTID0gImdyb3VwcmVmX2V4aXN0cyIKK0lOID0gImluIgorSU5fSUdOT1JFID0gImluX2lnbm9yZSIKK0lORk8gPSAiaW5mbyIKK0pVTVAgPSAianVtcCIKK0xJVEVSQUwgPSAibGl0ZXJhbCIKK0xJVEVSQUxfSUdOT1JFID0gImxpdGVyYWxfaWdub3JlIgorTUFSSyA9ICJtYXJrIgorTUFYX1JFUEVBVCA9ICJtYXhfcmVwZWF0IgorTUFYX1VOVElMID0gIm1heF91bnRpbCIKK01JTl9SRVBFQVQgPSAibWluX3JlcGVhdCIKK01JTl9VTlRJTCA9ICJtaW5fdW50aWwiCitORUdBVEUgPSAibmVnYXRlIgorTk9UX0xJVEVSQUwgPSAibm90X2xpdGVyYWwiCitOT1RfTElURVJBTF9JR05PUkUgPSAibm90X2xpdGVyYWxfaWdub3JlIgorUkFOR0UgPSAicmFuZ2UiCitSRVBFQVQgPSAicmVwZWF0IgorUkVQRUFUX09ORSA9ICJyZXBlYXRfb25lIgorU1VCUEFUVEVSTiA9ICJzdWJwYXR0ZXJuIgorTUlOX1JFUEVBVF9PTkUgPSAibWluX3JlcGVhdF9vbmUiCisKKyMgcG9zaXRpb25zCitBVF9CRUdJTk5JTkcgPSAiYXRfYmVnaW5uaW5nIgorQVRfQkVHSU5OSU5HX0xJTkUgPSAiYXRfYmVnaW5uaW5nX2xpbmUiCitBVF9CRUdJTk5JTkdfU1RSSU5HID0gImF0X2JlZ2lubmluZ19zdHJpbmciCitBVF9CT1VOREFSWSA9ICJhdF9ib3VuZGFyeSIKK0FUX05PTl9CT1VOREFSWSA9ICJhdF9ub25fYm91bmRhcnkiCitBVF9FTkQgPSAiYXRfZW5kIgorQVRfRU5EX0xJTkUgPSAiYXRfZW5kX2xpbmUiCitBVF9FTkRfU1RSSU5HID0gImF0X2VuZF9zdHJpbmciCitBVF9MT0NfQk9VTkRBUlkgPSAiYXRfbG9jX2JvdW5kYXJ5IgorQVRfTE9DX05PTl9CT1VOREFSWSA9ICJhdF9sb2Nfbm9uX2JvdW5kYXJ5IgorQVRfVU5JX0JPVU5EQVJZID0gImF0X3VuaV9ib3VuZGFyeSIKK0FUX1VOSV9OT05fQk9VTkRBUlkgPSAiYXRfdW5pX25vbl9ib3VuZGFyeSIKKworIyBjYXRlZ29yaWVzCitDQVRFR09SWV9ESUdJVCA9ICJjYXRlZ29yeV9kaWdpdCIKK0NBVEVHT1JZX05PVF9ESUdJVCA9ICJjYXRlZ29yeV9ub3RfZGlnaXQiCitDQVRFR09SWV9TUEFDRSA9ICJjYXRlZ29yeV9zcGFjZSIKK0NBVEVHT1JZX05PVF9TUEFDRSA9ICJjYXRlZ29yeV9ub3Rfc3BhY2UiCitDQVRFR09SWV9XT1JEID0gImNhdGVnb3J5X3dvcmQiCitDQVRFR09SWV9OT1RfV09SRCA9ICJjYXRlZ29yeV9ub3Rfd29yZCIKK0NBVEVHT1JZX0xJTkVCUkVBSyA9ICJjYXRlZ29yeV9saW5lYnJlYWsiCitDQVRFR09SWV9OT1RfTElORUJSRUFLID0gImNhdGVnb3J5X25vdF9saW5lYnJlYWsiCitDQVRFR09SWV9MT0NfV09SRCA9ICJjYXRlZ29yeV9sb2Nfd29yZCIKK0NBVEVHT1JZX0xPQ19OT1RfV09SRCA9ICJjYXRlZ29yeV9sb2Nfbm90X3dvcmQiCitDQVRFR09SWV9VTklfRElHSVQgPSAiY2F0ZWdvcnlfdW5pX2RpZ2l0IgorQ0FURUdPUllfVU5JX05PVF9ESUdJVCA9ICJjYXRlZ29yeV91bmlfbm90X2RpZ2l0IgorQ0FURUdPUllfVU5JX1NQQUNFID0gImNhdGVnb3J5X3VuaV9zcGFjZSIKK0NBVEVHT1JZX1VOSV9OT1RfU1BBQ0UgPSAiY2F0ZWdvcnlfdW5pX25vdF9zcGFjZSIKK0NBVEVHT1JZX1VOSV9XT1JEID0gImNhdGVnb3J5X3VuaV93b3JkIgorQ0FURUdPUllfVU5JX05PVF9XT1JEID0gImNhdGVnb3J5X3VuaV9ub3Rfd29yZCIKK0NBVEVHT1JZX1VOSV9MSU5FQlJFQUsgPSAiY2F0ZWdvcnlfdW5pX2xpbmVicmVhayIKK0NBVEVHT1JZX1VOSV9OT1RfTElORUJSRUFLID0gImNhdGVnb3J5X3VuaV9ub3RfbGluZWJyZWFrIgorCitPUENPREVTID0gWworCisgICAgIyBmYWlsdXJlPTAgc3VjY2Vzcz0xIChqdXN0IGJlY2F1c2UgaXQgbG9va3MgYmV0dGVyIHRoYXQgd2F5IDotKQorICAgIEZBSUxVUkUsIFNVQ0NFU1MsCisKKyAgICBBTlksIEFOWV9BTEwsCisgICAgQVNTRVJULCBBU1NFUlRfTk9ULAorICAgIEFULAorICAgIEJSQU5DSCwKKyAgICBDQUxMLAorICAgIENBVEVHT1JZLAorICAgIENIQVJTRVQsIEJJR0NIQVJTRVQsCisgICAgR1JPVVBSRUYsIEdST1VQUkVGX0VYSVNUUywgR1JPVVBSRUZfSUdOT1JFLAorICAgIElOLCBJTl9JR05PUkUsCisgICAgSU5GTywKKyAgICBKVU1QLAorICAgIExJVEVSQUwsIExJVEVSQUxfSUdOT1JFLAorICAgIE1BUkssCisgICAgTUFYX1VOVElMLAorICAgIE1JTl9VTlRJTCwKKyAgICBOT1RfTElURVJBTCwgTk9UX0xJVEVSQUxfSUdOT1JFLAorICAgIE5FR0FURSwKKyAgICBSQU5HRSwKKyAgICBSRVBFQVQsCisgICAgUkVQRUFUX09ORSwKKyAgICBTVUJQQVRURVJOLAorICAgIE1JTl9SRVBFQVRfT05FCisKK10KKworQVRDT0RFUyA9IFsKKyAgICBBVF9CRUdJTk5JTkcsIEFUX0JFR0lOTklOR19MSU5FLCBBVF9CRUdJTk5JTkdfU1RSSU5HLCBBVF9CT1VOREFSWSwKKyAgICBBVF9OT05fQk9VTkRBUlksIEFUX0VORCwgQVRfRU5EX0xJTkUsIEFUX0VORF9TVFJJTkcsCisgICAgQVRfTE9DX0JPVU5EQVJZLCBBVF9MT0NfTk9OX0JPVU5EQVJZLCBBVF9VTklfQk9VTkRBUlksCisgICAgQVRfVU5JX05PTl9CT1VOREFSWQorXQorCitDSENPREVTID0gWworICAgIENBVEVHT1JZX0RJR0lULCBDQVRFR09SWV9OT1RfRElHSVQsIENBVEVHT1JZX1NQQUNFLAorICAgIENBVEVHT1JZX05PVF9TUEFDRSwgQ0FURUdPUllfV09SRCwgQ0FURUdPUllfTk9UX1dPUkQsCisgICAgQ0FURUdPUllfTElORUJSRUFLLCBDQVRFR09SWV9OT1RfTElORUJSRUFLLCBDQVRFR09SWV9MT0NfV09SRCwKKyAgICBDQVRFR09SWV9MT0NfTk9UX1dPUkQsIENBVEVHT1JZX1VOSV9ESUdJVCwgQ0FURUdPUllfVU5JX05PVF9ESUdJVCwKKyAgICBDQVRFR09SWV9VTklfU1BBQ0UsIENBVEVHT1JZX1VOSV9OT1RfU1BBQ0UsIENBVEVHT1JZX1VOSV9XT1JELAorICAgIENBVEVHT1JZX1VOSV9OT1RfV09SRCwgQ0FURUdPUllfVU5JX0xJTkVCUkVBSywKKyAgICBDQVRFR09SWV9VTklfTk9UX0xJTkVCUkVBSworXQorCitkZWYgbWFrZWRpY3QobGlzdCk6CisgICAgZCA9IHt9CisgICAgaSA9IDAKKyAgICBmb3IgaXRlbSBpbiBsaXN0OgorICAgICAgICBkW2l0ZW1dID0gaQorICAgICAgICBpID0gaSArIDEKKyAgICByZXR1cm4gZAorCitPUENPREVTID0gbWFrZWRpY3QoT1BDT0RFUykKK0FUQ09ERVMgPSBtYWtlZGljdChBVENPREVTKQorQ0hDT0RFUyA9IG1ha2VkaWN0KENIQ09ERVMpCisKKyMgcmVwbGFjZW1lbnQgb3BlcmF0aW9ucyBmb3IgImlnbm9yZSBjYXNlIiBtb2RlCitPUF9JR05PUkUgPSB7CisgICAgR1JPVVBSRUY6IEdST1VQUkVGX0lHTk9SRSwKKyAgICBJTjogSU5fSUdOT1JFLAorICAgIExJVEVSQUw6IExJVEVSQUxfSUdOT1JFLAorICAgIE5PVF9MSVRFUkFMOiBOT1RfTElURVJBTF9JR05PUkUKK30KKworQVRfTVVMVElMSU5FID0geworICAgIEFUX0JFR0lOTklORzogQVRfQkVHSU5OSU5HX0xJTkUsCisgICAgQVRfRU5EOiBBVF9FTkRfTElORQorfQorCitBVF9MT0NBTEUgPSB7CisgICAgQVRfQk9VTkRBUlk6IEFUX0xPQ19CT1VOREFSWSwKKyAgICBBVF9OT05fQk9VTkRBUlk6IEFUX0xPQ19OT05fQk9VTkRBUlkKK30KKworQVRfVU5JQ09ERSA9IHsKKyAgICBBVF9CT1VOREFSWTogQVRfVU5JX0JPVU5EQVJZLAorICAgIEFUX05PTl9CT1VOREFSWTogQVRfVU5JX05PTl9CT1VOREFSWQorfQorCitDSF9MT0NBTEUgPSB7CisgICAgQ0FURUdPUllfRElHSVQ6IENBVEVHT1JZX0RJR0lULAorICAgIENBVEVHT1JZX05PVF9ESUdJVDogQ0FURUdPUllfTk9UX0RJR0lULAorICAgIENBVEVHT1JZX1NQQUNFOiBDQVRFR09SWV9TUEFDRSwKKyAgICBDQVRFR09SWV9OT1RfU1BBQ0U6IENBVEVHT1JZX05PVF9TUEFDRSwKKyAgICBDQVRFR09SWV9XT1JEOiBDQVRFR09SWV9MT0NfV09SRCwKKyAgICBDQVRFR09SWV9OT1RfV09SRDogQ0FURUdPUllfTE9DX05PVF9XT1JELAorICAgIENBVEVHT1JZX0xJTkVCUkVBSzogQ0FURUdPUllfTElORUJSRUFLLAorICAgIENBVEVHT1JZX05PVF9MSU5FQlJFQUs6IENBVEVHT1JZX05PVF9MSU5FQlJFQUsKK30KKworQ0hfVU5JQ09ERSA9IHsKKyAgICBDQVRFR09SWV9ESUdJVDogQ0FURUdPUllfVU5JX0RJR0lULAorICAgIENBVEVHT1JZX05PVF9ESUdJVDogQ0FURUdPUllfVU5JX05PVF9ESUdJVCwKKyAgICBDQVRFR09SWV9TUEFDRTogQ0FURUdPUllfVU5JX1NQQUNFLAorICAgIENBVEVHT1JZX05PVF9TUEFDRTogQ0FURUdPUllfVU5JX05PVF9TUEFDRSwKKyAgICBDQVRFR09SWV9XT1JEOiBDQVRFR09SWV9VTklfV09SRCwKKyAgICBDQVRFR09SWV9OT1RfV09SRDogQ0FURUdPUllfVU5JX05PVF9XT1JELAorICAgIENBVEVHT1JZX0xJTkVCUkVBSzogQ0FURUdPUllfVU5JX0xJTkVCUkVBSywKKyAgICBDQVRFR09SWV9OT1RfTElORUJSRUFLOiBDQVRFR09SWV9VTklfTk9UX0xJTkVCUkVBSworfQorCisjIGZsYWdzCitTUkVfRkxBR19URU1QTEFURSA9IDEgIyB0ZW1wbGF0ZSBtb2RlIChkaXNhYmxlIGJhY2t0cmFja2luZykKK1NSRV9GTEFHX0lHTk9SRUNBU0UgPSAyICMgY2FzZSBpbnNlbnNpdGl2ZQorU1JFX0ZMQUdfTE9DQUxFID0gNCAjIGhvbm91ciBzeXN0ZW0gbG9jYWxlCitTUkVfRkxBR19NVUxUSUxJTkUgPSA4ICMgdHJlYXQgdGFyZ2V0IGFzIG11bHRpbGluZSBzdHJpbmcKK1NSRV9GTEFHX0RPVEFMTCA9IDE2ICMgdHJlYXQgdGFyZ2V0IGFzIGEgc2luZ2xlIHN0cmluZworU1JFX0ZMQUdfVU5JQ09ERSA9IDMyICMgdXNlIHVuaWNvZGUgbG9jYWxlCitTUkVfRkxBR19WRVJCT1NFID0gNjQgIyBpZ25vcmUgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMKK1NSRV9GTEFHX0RFQlVHID0gMTI4ICMgZGVidWdnaW5nCisKKyMgZmxhZ3MgZm9yIElORk8gcHJpbWl0aXZlCitTUkVfSU5GT19QUkVGSVggPSAxICMgaGFzIHByZWZpeAorU1JFX0lORk9fTElURVJBTCA9IDIgIyBlbnRpcmUgcGF0dGVybiBpcyBsaXRlcmFsIChnaXZlbiBieSBwcmVmaXgpCitTUkVfSU5GT19DSEFSU0VUID0gNCAjIHBhdHRlcm4gc3RhcnRzIHdpdGggY2hhcmFjdGVyIGZyb20gZ2l2ZW4gc2V0CisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgZGVmIGR1bXAoZiwgZCwgcHJlZml4KToKKyAgICAgICAgaXRlbXMgPSBkLml0ZW1zKCkKKyAgICAgICAgaXRlbXMuc29ydChrZXk9bGFtYmRhIGE6IGFbMV0pCisgICAgICAgIGZvciBrLCB2IGluIGl0ZW1zOgorICAgICAgICAgICAgZi53cml0ZSgiI2RlZmluZSAlc18lcyAlc1xuIiAlIChwcmVmaXgsIGsudXBwZXIoKSwgdikpCisgICAgZiA9IG9wZW4oInNyZV9jb25zdGFudHMuaCIsICJ3IikKKyAgICBmLndyaXRlKCIiIlwKKy8qCisgKiBTZWNyZXQgTGFicycgUmVndWxhciBFeHByZXNzaW9uIEVuZ2luZQorICoKKyAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGluZyBlbmdpbmUKKyAqCisgKiBOT1RFOiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHNyZV9jb25zdGFudHMucHkuICBJZiB5b3UgbmVlZAorICogdG8gY2hhbmdlIGFueXRoaW5nIGluIGhlcmUsIGVkaXQgc3JlX2NvbnN0YW50cy5weSBhbmQgcnVuIGl0LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAxIGJ5IFNlY3JldCBMYWJzIEFCLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBTZWUgdGhlIF9zcmUuYyBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24uCisgKi8KKworIiIiKQorCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfTUFHSUMgJWRcbiIgJSBNQUdJQykKKworICAgIGR1bXAoZiwgT1BDT0RFUywgIlNSRV9PUCIpCisgICAgZHVtcChmLCBBVENPREVTLCAiU1JFIikKKyAgICBkdW1wKGYsIENIQ09ERVMsICJTUkUiKQorCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfRkxBR19URU1QTEFURSAlZFxuIiAlIFNSRV9GTEFHX1RFTVBMQVRFKQorICAgIGYud3JpdGUoIiNkZWZpbmUgU1JFX0ZMQUdfSUdOT1JFQ0FTRSAlZFxuIiAlIFNSRV9GTEFHX0lHTk9SRUNBU0UpCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfRkxBR19MT0NBTEUgJWRcbiIgJSBTUkVfRkxBR19MT0NBTEUpCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfRkxBR19NVUxUSUxJTkUgJWRcbiIgJSBTUkVfRkxBR19NVUxUSUxJTkUpCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfRkxBR19ET1RBTEwgJWRcbiIgJSBTUkVfRkxBR19ET1RBTEwpCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfRkxBR19VTklDT0RFICVkXG4iICUgU1JFX0ZMQUdfVU5JQ09ERSkKKyAgICBmLndyaXRlKCIjZGVmaW5lIFNSRV9GTEFHX1ZFUkJPU0UgJWRcbiIgJSBTUkVfRkxBR19WRVJCT1NFKQorCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfSU5GT19QUkVGSVggJWRcbiIgJSBTUkVfSU5GT19QUkVGSVgpCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfSU5GT19MSVRFUkFMICVkXG4iICUgU1JFX0lORk9fTElURVJBTCkKKyAgICBmLndyaXRlKCIjZGVmaW5lIFNSRV9JTkZPX0NIQVJTRVQgJWRcbiIgJSBTUkVfSU5GT19DSEFSU0VUKQorCisgICAgZi5jbG9zZSgpCisgICAgcHJpbnQgImRvbmUiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NyZV9jb25zdGFudHMucHljIGIvbGliL3B5dGhvbjIuNy9zcmVfY29uc3RhbnRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGRjZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcmVfY29uc3RhbnRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NyZV9jb25zdGFudHMucHlvIGIvbGliL3B5dGhvbjIuNy9zcmVfY29uc3RhbnRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGRjZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcmVfY29uc3RhbnRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NyZV9wYXJzZS5weSBiL2xpYi9weXRob24yLjcvc3JlX3BhcnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZjhjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NyZV9wYXJzZS5weQpAQCAtMCwwICsxLDgwMyBAQAorIworIyBTZWNyZXQgTGFicycgUmVndWxhciBFeHByZXNzaW9uIEVuZ2luZQorIworIyBjb252ZXJ0IHJlLXN0eWxlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBzcmUgcGF0dGVybgorIworIyBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwMSBieSBTZWNyZXQgTGFicyBBQi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFNlZSB0aGUgc3JlLnB5IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZCByZWRpc3RyaWJ1dGlvbi4KKyMKKworIiIiSW50ZXJuYWwgc3VwcG9ydCBtb2R1bGUgZm9yIHNyZSIiIgorCisjIFhYWDogc2hvdyBzdHJpbmcgb2Zmc2V0IGFuZCBvZmZlbmRpbmcgY2hhcmFjdGVyIGZvciBhbGwgZXJyb3JzCisKK2ltcG9ydCBzeXMKKworZnJvbSBzcmVfY29uc3RhbnRzIGltcG9ydCAqCitmcm9tIF9zcmUgaW1wb3J0IE1BWFJFUEVBVAorCitTUEVDSUFMX0NIQVJTID0gIi5cXFt7KCkqKz9eJHwiCitSRVBFQVRfQ0hBUlMgPSAiKis/eyIKKworRElHSVRTID0gc2V0KCIwMTIzNDU2Nzg5IikKKworT0NURElHSVRTID0gc2V0KCIwMTIzNDU2NyIpCitIRVhESUdJVFMgPSBzZXQoIjAxMjM0NTY3ODlhYmNkZWZBQkNERUYiKQorCitXSElURVNQQUNFID0gc2V0KCIgXHRcblxyXHZcZiIpCisKK0VTQ0FQRVMgPSB7CisgICAgciJcYSI6IChMSVRFUkFMLCBvcmQoIlxhIikpLAorICAgIHIiXGIiOiAoTElURVJBTCwgb3JkKCJcYiIpKSwKKyAgICByIlxmIjogKExJVEVSQUwsIG9yZCgiXGYiKSksCisgICAgciJcbiI6IChMSVRFUkFMLCBvcmQoIlxuIikpLAorICAgIHIiXHIiOiAoTElURVJBTCwgb3JkKCJcciIpKSwKKyAgICByIlx0IjogKExJVEVSQUwsIG9yZCgiXHQiKSksCisgICAgciJcdiI6IChMSVRFUkFMLCBvcmQoIlx2IikpLAorICAgIHIiXFwiOiAoTElURVJBTCwgb3JkKCJcXCIpKQorfQorCitDQVRFR09SSUVTID0geworICAgIHIiXEEiOiAoQVQsIEFUX0JFR0lOTklOR19TVFJJTkcpLCAjIHN0YXJ0IG9mIHN0cmluZworICAgIHIiXGIiOiAoQVQsIEFUX0JPVU5EQVJZKSwKKyAgICByIlxCIjogKEFULCBBVF9OT05fQk9VTkRBUlkpLAorICAgIHIiXGQiOiAoSU4sIFsoQ0FURUdPUlksIENBVEVHT1JZX0RJR0lUKV0pLAorICAgIHIiXEQiOiAoSU4sIFsoQ0FURUdPUlksIENBVEVHT1JZX05PVF9ESUdJVCldKSwKKyAgICByIlxzIjogKElOLCBbKENBVEVHT1JZLCBDQVRFR09SWV9TUEFDRSldKSwKKyAgICByIlxTIjogKElOLCBbKENBVEVHT1JZLCBDQVRFR09SWV9OT1RfU1BBQ0UpXSksCisgICAgciJcdyI6IChJTiwgWyhDQVRFR09SWSwgQ0FURUdPUllfV09SRCldKSwKKyAgICByIlxXIjogKElOLCBbKENBVEVHT1JZLCBDQVRFR09SWV9OT1RfV09SRCldKSwKKyAgICByIlxaIjogKEFULCBBVF9FTkRfU1RSSU5HKSwgIyBlbmQgb2Ygc3RyaW5nCit9CisKK0ZMQUdTID0geworICAgICMgc3RhbmRhcmQgZmxhZ3MKKyAgICAiaSI6IFNSRV9GTEFHX0lHTk9SRUNBU0UsCisgICAgIkwiOiBTUkVfRkxBR19MT0NBTEUsCisgICAgIm0iOiBTUkVfRkxBR19NVUxUSUxJTkUsCisgICAgInMiOiBTUkVfRkxBR19ET1RBTEwsCisgICAgIngiOiBTUkVfRkxBR19WRVJCT1NFLAorICAgICMgZXh0ZW5zaW9ucworICAgICJ0IjogU1JFX0ZMQUdfVEVNUExBVEUsCisgICAgInUiOiBTUkVfRkxBR19VTklDT0RFLAorfQorCitjbGFzcyBQYXR0ZXJuOgorICAgICMgbWFzdGVyIHBhdHRlcm4gb2JqZWN0LiAga2VlcHMgdHJhY2sgb2YgZ2xvYmFsIGF0dHJpYnV0ZXMKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZmxhZ3MgPSAwCisgICAgICAgIHNlbGYub3BlbiA9IFtdCisgICAgICAgIHNlbGYuZ3JvdXBzID0gMQorICAgICAgICBzZWxmLmdyb3VwZGljdCA9IHt9CisgICAgZGVmIG9wZW5ncm91cChzZWxmLCBuYW1lPU5vbmUpOgorICAgICAgICBnaWQgPSBzZWxmLmdyb3VwcworICAgICAgICBzZWxmLmdyb3VwcyA9IGdpZCArIDEKKyAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9naWQgPSBzZWxmLmdyb3VwZGljdC5nZXQobmFtZSwgTm9uZSkKKyAgICAgICAgICAgIGlmIG9naWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICgicmVkZWZpbml0aW9uIG9mIGdyb3VwIG5hbWUgJXMgYXMgZ3JvdXAgJWQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXMgZ3JvdXAgJWQiICUgKHJlcHIobmFtZSksIGdpZCwgIG9naWQpKQorICAgICAgICAgICAgc2VsZi5ncm91cGRpY3RbbmFtZV0gPSBnaWQKKyAgICAgICAgc2VsZi5vcGVuLmFwcGVuZChnaWQpCisgICAgICAgIHJldHVybiBnaWQKKyAgICBkZWYgY2xvc2Vncm91cChzZWxmLCBnaWQpOgorICAgICAgICBzZWxmLm9wZW4ucmVtb3ZlKGdpZCkKKyAgICBkZWYgY2hlY2tncm91cChzZWxmLCBnaWQpOgorICAgICAgICByZXR1cm4gZ2lkIDwgc2VsZi5ncm91cHMgYW5kIGdpZCBub3QgaW4gc2VsZi5vcGVuCisKK2NsYXNzIFN1YlBhdHRlcm46CisgICAgIyBhIHN1YnBhdHRlcm4sIGluIGludGVybWVkaWF0ZSBmb3JtCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdHRlcm4sIGRhdGE9Tm9uZSk6CisgICAgICAgIHNlbGYucGF0dGVybiA9IHBhdHRlcm4KKyAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgZGF0YSA9IFtdCisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKyAgICAgICAgc2VsZi53aWR0aCA9IE5vbmUKKyAgICBkZWYgZHVtcChzZWxmLCBsZXZlbD0wKToKKyAgICAgICAgbmwgPSAxCisgICAgICAgIHNlcXR5cGVzID0gdHlwZSgoKSksIHR5cGUoW10pCisgICAgICAgIGZvciBvcCwgYXYgaW4gc2VsZi5kYXRhOgorICAgICAgICAgICAgcHJpbnQgbGV2ZWwqIiAgIiArIG9wLDsgbmwgPSAwCisgICAgICAgICAgICBpZiBvcCA9PSAiaW4iOgorICAgICAgICAgICAgICAgICMgbWVtYmVyIHN1Ymxhbmd1YWdlCisgICAgICAgICAgICAgICAgcHJpbnQ7IG5sID0gMQorICAgICAgICAgICAgICAgIGZvciBvcCwgYSBpbiBhdjoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgKGxldmVsKzEpKiIgICIgKyBvcCwgYQorICAgICAgICAgICAgZWxpZiBvcCA9PSAiYnJhbmNoIjoKKyAgICAgICAgICAgICAgICBwcmludDsgbmwgPSAxCisgICAgICAgICAgICAgICAgaSA9IDAKKyAgICAgICAgICAgICAgICBmb3IgYSBpbiBhdlsxXToKKyAgICAgICAgICAgICAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBsZXZlbCoiICAiICsgIm9yIgorICAgICAgICAgICAgICAgICAgICBhLmR1bXAobGV2ZWwrMSk7IG5sID0gMQorICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgIGVsaWYgdHlwZShhdikgaW4gc2VxdHlwZXM6CisgICAgICAgICAgICAgICAgZm9yIGEgaW4gYXY6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYSwgU3ViUGF0dGVybik6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgbmw6IHByaW50CisgICAgICAgICAgICAgICAgICAgICAgICBhLmR1bXAobGV2ZWwrMSk7IG5sID0gMQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgYSwgOyBubCA9IDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgYXYsIDsgbmwgPSAwCisgICAgICAgICAgICBpZiBub3Qgbmw6IHByaW50CisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gcmVwcihzZWxmLmRhdGEpCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5kYXRhKQorICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgIGRlbCBzZWxmLmRhdGFbaW5kZXhdCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShpbmRleCwgc2xpY2UpOgorICAgICAgICAgICAgcmV0dXJuIFN1YlBhdHRlcm4oc2VsZi5wYXR0ZXJuLCBzZWxmLmRhdGFbaW5kZXhdKQorICAgICAgICByZXR1cm4gc2VsZi5kYXRhW2luZGV4XQorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBpbmRleCwgY29kZSk6CisgICAgICAgIHNlbGYuZGF0YVtpbmRleF0gPSBjb2RlCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgY29kZSk6CisgICAgICAgIHNlbGYuZGF0YS5pbnNlcnQoaW5kZXgsIGNvZGUpCisgICAgZGVmIGFwcGVuZChzZWxmLCBjb2RlKToKKyAgICAgICAgc2VsZi5kYXRhLmFwcGVuZChjb2RlKQorICAgIGRlZiBnZXR3aWR0aChzZWxmKToKKyAgICAgICAgIyBkZXRlcm1pbmUgdGhlIHdpZHRoIChtaW4sIG1heCkgZm9yIHRoaXMgc3VicGF0dGVybgorICAgICAgICBpZiBzZWxmLndpZHRoOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYud2lkdGgKKyAgICAgICAgbG8gPSBoaSA9IDBMCisgICAgICAgIFVOSVRDT0RFUyA9IChBTlksIFJBTkdFLCBJTiwgTElURVJBTCwgTk9UX0xJVEVSQUwsIENBVEVHT1JZKQorICAgICAgICBSRVBFQVRDT0RFUyA9IChNSU5fUkVQRUFULCBNQVhfUkVQRUFUKQorICAgICAgICBmb3Igb3AsIGF2IGluIHNlbGYuZGF0YToKKyAgICAgICAgICAgIGlmIG9wIGlzIEJSQU5DSDoKKyAgICAgICAgICAgICAgICBpID0gc3lzLm1heGludAorICAgICAgICAgICAgICAgIGogPSAwCisgICAgICAgICAgICAgICAgZm9yIGF2IGluIGF2WzFdOgorICAgICAgICAgICAgICAgICAgICBsLCBoID0gYXYuZ2V0d2lkdGgoKQorICAgICAgICAgICAgICAgICAgICBpID0gbWluKGksIGwpCisgICAgICAgICAgICAgICAgICAgIGogPSBtYXgoaiwgaCkKKyAgICAgICAgICAgICAgICBsbyA9IGxvICsgaQorICAgICAgICAgICAgICAgIGhpID0gaGkgKyBqCisgICAgICAgICAgICBlbGlmIG9wIGlzIENBTEw6CisgICAgICAgICAgICAgICAgaSwgaiA9IGF2LmdldHdpZHRoKCkKKyAgICAgICAgICAgICAgICBsbyA9IGxvICsgaQorICAgICAgICAgICAgICAgIGhpID0gaGkgKyBqCisgICAgICAgICAgICBlbGlmIG9wIGlzIFNVQlBBVFRFUk46CisgICAgICAgICAgICAgICAgaSwgaiA9IGF2WzFdLmdldHdpZHRoKCkKKyAgICAgICAgICAgICAgICBsbyA9IGxvICsgaQorICAgICAgICAgICAgICAgIGhpID0gaGkgKyBqCisgICAgICAgICAgICBlbGlmIG9wIGluIFJFUEVBVENPREVTOgorICAgICAgICAgICAgICAgIGksIGogPSBhdlsyXS5nZXR3aWR0aCgpCisgICAgICAgICAgICAgICAgbG8gPSBsbyArIGxvbmcoaSkgKiBhdlswXQorICAgICAgICAgICAgICAgIGhpID0gaGkgKyBsb25nKGopICogYXZbMV0KKyAgICAgICAgICAgIGVsaWYgb3AgaW4gVU5JVENPREVTOgorICAgICAgICAgICAgICAgIGxvID0gbG8gKyAxCisgICAgICAgICAgICAgICAgaGkgPSBoaSArIDEKKyAgICAgICAgICAgIGVsaWYgb3AgPT0gU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLndpZHRoID0gaW50KG1pbihsbywgc3lzLm1heGludCkpLCBpbnQobWluKGhpLCBzeXMubWF4aW50KSkKKyAgICAgICAgcmV0dXJuIHNlbGYud2lkdGgKKworY2xhc3MgVG9rZW5pemVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJpbmcpOgorICAgICAgICBzZWxmLnN0cmluZyA9IHN0cmluZworICAgICAgICBzZWxmLmluZGV4ID0gMAorICAgICAgICBzZWxmLl9fbmV4dCgpCisgICAgZGVmIF9fbmV4dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pbmRleCA+PSBsZW4oc2VsZi5zdHJpbmcpOgorICAgICAgICAgICAgc2VsZi5uZXh0ID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGNoYXIgPSBzZWxmLnN0cmluZ1tzZWxmLmluZGV4XQorICAgICAgICBpZiBjaGFyWzBdID09ICJcXCI6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYyA9IHNlbGYuc3RyaW5nW3NlbGYuaW5kZXggKyAxXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJib2d1cyBlc2NhcGUgKGVuZCBvZiBsaW5lKSIKKyAgICAgICAgICAgIGNoYXIgPSBjaGFyICsgYworICAgICAgICBzZWxmLmluZGV4ID0gc2VsZi5pbmRleCArIGxlbihjaGFyKQorICAgICAgICBzZWxmLm5leHQgPSBjaGFyCisgICAgZGVmIG1hdGNoKHNlbGYsIGNoYXIsIHNraXA9MSk6CisgICAgICAgIGlmIGNoYXIgPT0gc2VsZi5uZXh0OgorICAgICAgICAgICAgaWYgc2tpcDoKKyAgICAgICAgICAgICAgICBzZWxmLl9fbmV4dCgpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICByZXR1cm4gMAorICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIHRoaXMgPSBzZWxmLm5leHQKKyAgICAgICAgc2VsZi5fX25leHQoKQorICAgICAgICByZXR1cm4gdGhpcworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbmRleCwgc2VsZi5uZXh0CisgICAgZGVmIHNlZWsoc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLmluZGV4LCBzZWxmLm5leHQgPSBpbmRleAorCitkZWYgaXNpZGVudChjaGFyKToKKyAgICByZXR1cm4gImEiIDw9IGNoYXIgPD0gInoiIG9yICJBIiA8PSBjaGFyIDw9ICJaIiBvciBjaGFyID09ICJfIgorCitkZWYgaXNkaWdpdChjaGFyKToKKyAgICByZXR1cm4gIjAiIDw9IGNoYXIgPD0gIjkiCisKK2RlZiBpc25hbWUobmFtZSk6CisgICAgIyBjaGVjayB0aGF0IGdyb3VwIG5hbWUgaXMgYSB2YWxpZCBzdHJpbmcKKyAgICBpZiBub3QgaXNpZGVudChuYW1lWzBdKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZm9yIGNoYXIgaW4gbmFtZVsxOl06CisgICAgICAgIGlmIG5vdCBpc2lkZW50KGNoYXIpIGFuZCBub3QgaXNkaWdpdChjaGFyKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCisKK2RlZiBfY2xhc3NfZXNjYXBlKHNvdXJjZSwgZXNjYXBlKToKKyAgICAjIGhhbmRsZSBlc2NhcGUgY29kZSBpbnNpZGUgY2hhcmFjdGVyIGNsYXNzCisgICAgY29kZSA9IEVTQ0FQRVMuZ2V0KGVzY2FwZSkKKyAgICBpZiBjb2RlOgorICAgICAgICByZXR1cm4gY29kZQorICAgIGNvZGUgPSBDQVRFR09SSUVTLmdldChlc2NhcGUpCisgICAgaWYgY29kZSBhbmQgY29kZVswXSA9PSBJTjoKKyAgICAgICAgcmV0dXJuIGNvZGUKKyAgICB0cnk6CisgICAgICAgIGMgPSBlc2NhcGVbMToyXQorICAgICAgICBpZiBjID09ICJ4IjoKKyAgICAgICAgICAgICMgaGV4YWRlY2ltYWwgZXNjYXBlIChleGFjdGx5IHR3byBkaWdpdHMpCisgICAgICAgICAgICB3aGlsZSBzb3VyY2UubmV4dCBpbiBIRVhESUdJVFMgYW5kIGxlbihlc2NhcGUpIDwgNDoKKyAgICAgICAgICAgICAgICBlc2NhcGUgPSBlc2NhcGUgKyBzb3VyY2UuZ2V0KCkKKyAgICAgICAgICAgIGVzY2FwZSA9IGVzY2FwZVsyOl0KKyAgICAgICAgICAgIGlmIGxlbihlc2NhcGUpICE9IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJib2d1cyBlc2NhcGU6ICVzIiAlIHJlcHIoIlxcIiArIGVzY2FwZSkKKyAgICAgICAgICAgIHJldHVybiBMSVRFUkFMLCBpbnQoZXNjYXBlLCAxNikgJiAweGZmCisgICAgICAgIGVsaWYgYyBpbiBPQ1RESUdJVFM6CisgICAgICAgICAgICAjIG9jdGFsIGVzY2FwZSAodXAgdG8gdGhyZWUgZGlnaXRzKQorICAgICAgICAgICAgd2hpbGUgc291cmNlLm5leHQgaW4gT0NURElHSVRTIGFuZCBsZW4oZXNjYXBlKSA8IDQ6CisgICAgICAgICAgICAgICAgZXNjYXBlID0gZXNjYXBlICsgc291cmNlLmdldCgpCisgICAgICAgICAgICBlc2NhcGUgPSBlc2NhcGVbMTpdCisgICAgICAgICAgICByZXR1cm4gTElURVJBTCwgaW50KGVzY2FwZSwgOCkgJiAweGZmCisgICAgICAgIGVsaWYgYyBpbiBESUdJVFM6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgImJvZ3VzIGVzY2FwZTogJXMiICUgcmVwcihlc2NhcGUpCisgICAgICAgIGlmIGxlbihlc2NhcGUpID09IDI6CisgICAgICAgICAgICByZXR1cm4gTElURVJBTCwgb3JkKGVzY2FwZVsxXSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIHJhaXNlIGVycm9yLCAiYm9ndXMgZXNjYXBlOiAlcyIgJSByZXByKGVzY2FwZSkKKworZGVmIF9lc2NhcGUoc291cmNlLCBlc2NhcGUsIHN0YXRlKToKKyAgICAjIGhhbmRsZSBlc2NhcGUgY29kZSBpbiBleHByZXNzaW9uCisgICAgY29kZSA9IENBVEVHT1JJRVMuZ2V0KGVzY2FwZSkKKyAgICBpZiBjb2RlOgorICAgICAgICByZXR1cm4gY29kZQorICAgIGNvZGUgPSBFU0NBUEVTLmdldChlc2NhcGUpCisgICAgaWYgY29kZToKKyAgICAgICAgcmV0dXJuIGNvZGUKKyAgICB0cnk6CisgICAgICAgIGMgPSBlc2NhcGVbMToyXQorICAgICAgICBpZiBjID09ICJ4IjoKKyAgICAgICAgICAgICMgaGV4YWRlY2ltYWwgZXNjYXBlCisgICAgICAgICAgICB3aGlsZSBzb3VyY2UubmV4dCBpbiBIRVhESUdJVFMgYW5kIGxlbihlc2NhcGUpIDwgNDoKKyAgICAgICAgICAgICAgICBlc2NhcGUgPSBlc2NhcGUgKyBzb3VyY2UuZ2V0KCkKKyAgICAgICAgICAgIGlmIGxlbihlc2NhcGUpICE9IDQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIGludChlc2NhcGVbMjpdLCAxNikgJiAweGZmCisgICAgICAgIGVsaWYgYyA9PSAiMCI6CisgICAgICAgICAgICAjIG9jdGFsIGVzY2FwZQorICAgICAgICAgICAgd2hpbGUgc291cmNlLm5leHQgaW4gT0NURElHSVRTIGFuZCBsZW4oZXNjYXBlKSA8IDQ6CisgICAgICAgICAgICAgICAgZXNjYXBlID0gZXNjYXBlICsgc291cmNlLmdldCgpCisgICAgICAgICAgICByZXR1cm4gTElURVJBTCwgaW50KGVzY2FwZVsxOl0sIDgpICYgMHhmZgorICAgICAgICBlbGlmIGMgaW4gRElHSVRTOgorICAgICAgICAgICAgIyBvY3RhbCBlc2NhcGUgKm9yKiBkZWNpbWFsIGdyb3VwIHJlZmVyZW5jZSAoc2lnaCkKKyAgICAgICAgICAgIGlmIHNvdXJjZS5uZXh0IGluIERJR0lUUzoKKyAgICAgICAgICAgICAgICBlc2NhcGUgPSBlc2NhcGUgKyBzb3VyY2UuZ2V0KCkKKyAgICAgICAgICAgICAgICBpZiAoZXNjYXBlWzFdIGluIE9DVERJR0lUUyBhbmQgZXNjYXBlWzJdIGluIE9DVERJR0lUUyBhbmQKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLm5leHQgaW4gT0NURElHSVRTKToKKyAgICAgICAgICAgICAgICAgICAgIyBnb3QgdGhyZWUgb2N0YWwgZGlnaXRzOyB0aGlzIGlzIGFuIG9jdGFsIGVzY2FwZQorICAgICAgICAgICAgICAgICAgICBlc2NhcGUgPSBlc2NhcGUgKyBzb3VyY2UuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIGludChlc2NhcGVbMTpdLCA4KSAmIDB4ZmYKKyAgICAgICAgICAgICMgbm90IGFuIG9jdGFsIGVzY2FwZSwgc28gdGhpcyBpcyBhIGdyb3VwIHJlZmVyZW5jZQorICAgICAgICAgICAgZ3JvdXAgPSBpbnQoZXNjYXBlWzE6XSkKKyAgICAgICAgICAgIGlmIGdyb3VwIDwgc3RhdGUuZ3JvdXBzOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzdGF0ZS5jaGVja2dyb3VwKGdyb3VwKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJjYW5ub3QgcmVmZXIgdG8gb3BlbiBncm91cCIKKyAgICAgICAgICAgICAgICByZXR1cm4gR1JPVVBSRUYsIGdyb3VwCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIGlmIGxlbihlc2NhcGUpID09IDI6CisgICAgICAgICAgICByZXR1cm4gTElURVJBTCwgb3JkKGVzY2FwZVsxXSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIHJhaXNlIGVycm9yLCAiYm9ndXMgZXNjYXBlOiAlcyIgJSByZXByKGVzY2FwZSkKKworZGVmIF9wYXJzZV9zdWIoc291cmNlLCBzdGF0ZSwgbmVzdGVkPTEpOgorICAgICMgcGFyc2UgYW4gYWx0ZXJuYXRpb246IGF8YnxjCisKKyAgICBpdGVtcyA9IFtdCisgICAgaXRlbXNhcHBlbmQgPSBpdGVtcy5hcHBlbmQKKyAgICBzb3VyY2VtYXRjaCA9IHNvdXJjZS5tYXRjaAorICAgIHdoaWxlIDE6CisgICAgICAgIGl0ZW1zYXBwZW5kKF9wYXJzZShzb3VyY2UsIHN0YXRlKSkKKyAgICAgICAgaWYgc291cmNlbWF0Y2goInwiKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIG5vdCBuZXN0ZWQ6CisgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBub3Qgc291cmNlLm5leHQgb3Igc291cmNlbWF0Y2goIikiLCAwKToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgInBhdHRlcm4gbm90IHByb3Blcmx5IGNsb3NlZCIKKworICAgIGlmIGxlbihpdGVtcykgPT0gMToKKyAgICAgICAgcmV0dXJuIGl0ZW1zWzBdCisKKyAgICBzdWJwYXR0ZXJuID0gU3ViUGF0dGVybihzdGF0ZSkKKyAgICBzdWJwYXR0ZXJuYXBwZW5kID0gc3VicGF0dGVybi5hcHBlbmQKKworICAgICMgY2hlY2sgaWYgYWxsIGl0ZW1zIHNoYXJlIGEgY29tbW9uIHByZWZpeAorICAgIHdoaWxlIDE6CisgICAgICAgIHByZWZpeCA9IE5vbmUKKyAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgICAgICAgICBpZiBub3QgaXRlbToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgcHJlZml4IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcHJlZml4ID0gaXRlbVswXQorICAgICAgICAgICAgZWxpZiBpdGVtWzBdICE9IHByZWZpeDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBhbGwgc3ViaXRlbXMgc3RhcnQgd2l0aCBhIGNvbW1vbiAicHJlZml4Ii4KKyAgICAgICAgICAgICMgbW92ZSBpdCBvdXQgb2YgdGhlIGJyYW5jaAorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgICAgICAgICAgICAgZGVsIGl0ZW1bMF0KKyAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQocHJlZml4KQorICAgICAgICAgICAgY29udGludWUgIyBjaGVjayBuZXh0IG9uZQorICAgICAgICBicmVhaworCisgICAgIyBjaGVjayBpZiB0aGUgYnJhbmNoIGNhbiBiZSByZXBsYWNlZCBieSBhIGNoYXJhY3RlciBzZXQKKyAgICBmb3IgaXRlbSBpbiBpdGVtczoKKyAgICAgICAgaWYgbGVuKGl0ZW0pICE9IDEgb3IgaXRlbVswXVswXSAhPSBMSVRFUkFMOgorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICAjIHdlIGNhbiBzdG9yZSB0aGlzIGFzIGEgY2hhcmFjdGVyIHNldCBpbnN0ZWFkIG9mIGEKKyAgICAgICAgIyBicmFuY2ggKHRoZSBjb21waWxlciBtYXkgb3B0aW1pemUgdGhpcyBldmVuIG1vcmUpCisgICAgICAgIHNldCA9IFtdCisgICAgICAgIHNldGFwcGVuZCA9IHNldC5hcHBlbmQKKyAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgICAgICAgICBzZXRhcHBlbmQoaXRlbVswXSkKKyAgICAgICAgc3VicGF0dGVybmFwcGVuZCgoSU4sIHNldCkpCisgICAgICAgIHJldHVybiBzdWJwYXR0ZXJuCisKKyAgICBzdWJwYXR0ZXJuLmFwcGVuZCgoQlJBTkNILCAoTm9uZSwgaXRlbXMpKSkKKyAgICByZXR1cm4gc3VicGF0dGVybgorCitkZWYgX3BhcnNlX3N1Yl9jb25kKHNvdXJjZSwgc3RhdGUsIGNvbmRncm91cCk6CisgICAgaXRlbV95ZXMgPSBfcGFyc2Uoc291cmNlLCBzdGF0ZSkKKyAgICBpZiBzb3VyY2UubWF0Y2goInwiKToKKyAgICAgICAgaXRlbV9ubyA9IF9wYXJzZShzb3VyY2UsIHN0YXRlKQorICAgICAgICBpZiBzb3VyY2UubWF0Y2goInwiKToKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiY29uZGl0aW9uYWwgYmFja3JlZiB3aXRoIG1vcmUgdGhhbiB0d28gYnJhbmNoZXMiCisgICAgZWxzZToKKyAgICAgICAgaXRlbV9ubyA9IE5vbmUKKyAgICBpZiBzb3VyY2UubmV4dCBhbmQgbm90IHNvdXJjZS5tYXRjaCgiKSIsIDApOgorICAgICAgICByYWlzZSBlcnJvciwgInBhdHRlcm4gbm90IHByb3Blcmx5IGNsb3NlZCIKKyAgICBzdWJwYXR0ZXJuID0gU3ViUGF0dGVybihzdGF0ZSkKKyAgICBzdWJwYXR0ZXJuLmFwcGVuZCgoR1JPVVBSRUZfRVhJU1RTLCAoY29uZGdyb3VwLCBpdGVtX3llcywgaXRlbV9ubykpKQorICAgIHJldHVybiBzdWJwYXR0ZXJuCisKK19QQVRURVJORU5ERVJTID0gc2V0KCJ8KSIpCitfQVNTRVJUQ0hBUlMgPSBzZXQoIj0hPCIpCitfTE9PS0JFSElOREFTU0VSVENIQVJTID0gc2V0KCI9ISIpCitfUkVQRUFUQ09ERVMgPSBzZXQoW01JTl9SRVBFQVQsIE1BWF9SRVBFQVRdKQorCitkZWYgX3BhcnNlKHNvdXJjZSwgc3RhdGUpOgorICAgICMgcGFyc2UgYSBzaW1wbGUgcGF0dGVybgorICAgIHN1YnBhdHRlcm4gPSBTdWJQYXR0ZXJuKHN0YXRlKQorCisgICAgIyBwcmVjb21wdXRlIGNvbnN0YW50cyBpbnRvIGxvY2FsIHZhcmlhYmxlcworICAgIHN1YnBhdHRlcm5hcHBlbmQgPSBzdWJwYXR0ZXJuLmFwcGVuZAorICAgIHNvdXJjZWdldCA9IHNvdXJjZS5nZXQKKyAgICBzb3VyY2VtYXRjaCA9IHNvdXJjZS5tYXRjaAorICAgIF9sZW4gPSBsZW4KKyAgICBQQVRURVJORU5ERVJTID0gX1BBVFRFUk5FTkRFUlMKKyAgICBBU1NFUlRDSEFSUyA9IF9BU1NFUlRDSEFSUworICAgIExPT0tCRUhJTkRBU1NFUlRDSEFSUyA9IF9MT09LQkVISU5EQVNTRVJUQ0hBUlMKKyAgICBSRVBFQVRDT0RFUyA9IF9SRVBFQVRDT0RFUworCisgICAgd2hpbGUgMToKKworICAgICAgICBpZiBzb3VyY2UubmV4dCBpbiBQQVRURVJORU5ERVJTOgorICAgICAgICAgICAgYnJlYWsgIyBlbmQgb2Ygc3VicGF0dGVybgorICAgICAgICB0aGlzID0gc291cmNlZ2V0KCkKKyAgICAgICAgaWYgdGhpcyBpcyBOb25lOgorICAgICAgICAgICAgYnJlYWsgIyBlbmQgb2YgcGF0dGVybgorCisgICAgICAgIGlmIHN0YXRlLmZsYWdzICYgU1JFX0ZMQUdfVkVSQk9TRToKKyAgICAgICAgICAgICMgc2tpcCB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cworICAgICAgICAgICAgaWYgdGhpcyBpbiBXSElURVNQQUNFOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiB0aGlzID09ICIjIjoKKyAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICB0aGlzID0gc291cmNlZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGhpcyBpbiAoTm9uZSwgIlxuIik6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgdGhpcyBhbmQgdGhpc1swXSBub3QgaW4gU1BFQ0lBTF9DSEFSUzoKKyAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoKExJVEVSQUwsIG9yZCh0aGlzKSkpCisKKyAgICAgICAgZWxpZiB0aGlzID09ICJbIjoKKyAgICAgICAgICAgICMgY2hhcmFjdGVyIHNldAorICAgICAgICAgICAgc2V0ID0gW10KKyAgICAgICAgICAgIHNldGFwcGVuZCA9IHNldC5hcHBlbmQKKyMjICAgICAgICAgIGlmIHNvdXJjZW1hdGNoKCI6Iik6CisjIyAgICAgICAgICAgICAgcGFzcyAjIGhhbmRsZSBjaGFyYWN0ZXIgY2xhc3NlcworICAgICAgICAgICAgaWYgc291cmNlbWF0Y2goIl4iKToKKyAgICAgICAgICAgICAgICBzZXRhcHBlbmQoKE5FR0FURSwgTm9uZSkpCisgICAgICAgICAgICAjIGNoZWNrIHJlbWFpbmluZyBjaGFyYWN0ZXJzCisgICAgICAgICAgICBzdGFydCA9IHNldFs6XQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB0aGlzID0gc291cmNlZ2V0KCkKKyAgICAgICAgICAgICAgICBpZiB0aGlzID09ICJdIiBhbmQgc2V0ICE9IHN0YXJ0OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgdGhpcyBhbmQgdGhpc1swXSA9PSAiXFwiOgorICAgICAgICAgICAgICAgICAgICBjb2RlMSA9IF9jbGFzc19lc2NhcGUoc291cmNlLCB0aGlzKQorICAgICAgICAgICAgICAgIGVsaWYgdGhpczoKKyAgICAgICAgICAgICAgICAgICAgY29kZTEgPSBMSVRFUkFMLCBvcmQodGhpcykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVuZXhwZWN0ZWQgZW5kIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiIKKyAgICAgICAgICAgICAgICBpZiBzb3VyY2VtYXRjaCgiLSIpOgorICAgICAgICAgICAgICAgICAgICAjIHBvdGVudGlhbCByYW5nZQorICAgICAgICAgICAgICAgICAgICB0aGlzID0gc291cmNlZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGhpcyA9PSAiXSI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjb2RlMVswXSBpcyBJTjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlMSA9IGNvZGUxWzFdWzBdCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRhcHBlbmQoY29kZTEpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRhcHBlbmQoKExJVEVSQUwsIG9yZCgiLSIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsaWYgdGhpczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoaXNbMF0gPT0gIlxcIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlMiA9IF9jbGFzc19lc2NhcGUoc291cmNlLCB0aGlzKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlMiA9IExJVEVSQUwsIG9yZCh0aGlzKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29kZTFbMF0gIT0gTElURVJBTCBvciBjb2RlMlswXSAhPSBMSVRFUkFMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiYmFkIGNoYXJhY3RlciByYW5nZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvID0gY29kZTFbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhpID0gY29kZTJbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhpIDwgbG86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJiYWQgY2hhcmFjdGVyIHJhbmdlIgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXBwZW5kKChSQU5HRSwgKGxvLCBoaSkpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bmV4cGVjdGVkIGVuZCBvZiByZWd1bGFyIGV4cHJlc3Npb24iCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgY29kZTFbMF0gaXMgSU46CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlMSA9IGNvZGUxWzFdWzBdCisgICAgICAgICAgICAgICAgICAgIHNldGFwcGVuZChjb2RlMSkKKworICAgICAgICAgICAgIyBYWFg6IDxmbD4gc2hvdWxkIG1vdmUgc2V0IG9wdGltaXphdGlvbiB0byBjb21waWxlciEKKyAgICAgICAgICAgIGlmIF9sZW4oc2V0KT09MSBhbmQgc2V0WzBdWzBdIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgc3VicGF0dGVybmFwcGVuZChzZXRbMF0pICMgb3B0aW1pemF0aW9uCisgICAgICAgICAgICBlbGlmIF9sZW4oc2V0KT09MiBhbmQgc2V0WzBdWzBdIGlzIE5FR0FURSBhbmQgc2V0WzFdWzBdIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgc3VicGF0dGVybmFwcGVuZCgoTk9UX0xJVEVSQUwsIHNldFsxXVsxXSkpICMgb3B0aW1pemF0aW9uCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgWFhYOiA8Zmw+IHNob3VsZCBhZGQgY2hhcm1hcCBvcHRpbWl6YXRpb24gaGVyZQorICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoKElOLCBzZXQpKQorCisgICAgICAgIGVsaWYgdGhpcyBhbmQgdGhpc1swXSBpbiBSRVBFQVRfQ0hBUlM6CisgICAgICAgICAgICAjIHJlcGVhdCBwcmV2aW91cyBpdGVtCisgICAgICAgICAgICBpZiB0aGlzID09ICI/IjoKKyAgICAgICAgICAgICAgICBtaW4sIG1heCA9IDAsIDEKKyAgICAgICAgICAgIGVsaWYgdGhpcyA9PSAiKiI6CisgICAgICAgICAgICAgICAgbWluLCBtYXggPSAwLCBNQVhSRVBFQVQKKworICAgICAgICAgICAgZWxpZiB0aGlzID09ICIrIjoKKyAgICAgICAgICAgICAgICBtaW4sIG1heCA9IDEsIE1BWFJFUEVBVAorICAgICAgICAgICAgZWxpZiB0aGlzID09ICJ7IjoKKyAgICAgICAgICAgICAgICBpZiBzb3VyY2UubmV4dCA9PSAifSI6CisgICAgICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoKExJVEVSQUwsIG9yZCh0aGlzKSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaGVyZSA9IHNvdXJjZS50ZWxsKCkKKyAgICAgICAgICAgICAgICBtaW4sIG1heCA9IDAsIE1BWFJFUEVBVAorICAgICAgICAgICAgICAgIGxvID0gaGkgPSAiIgorICAgICAgICAgICAgICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIERJR0lUUzoKKyAgICAgICAgICAgICAgICAgICAgbG8gPSBsbyArIHNvdXJjZS5nZXQoKQorICAgICAgICAgICAgICAgIGlmIHNvdXJjZW1hdGNoKCIsIik6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIERJR0lUUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpID0gaGkgKyBzb3VyY2VnZXQoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGhpID0gbG8KKyAgICAgICAgICAgICAgICBpZiBub3Qgc291cmNlbWF0Y2goIn0iKToKKyAgICAgICAgICAgICAgICAgICAgc3VicGF0dGVybmFwcGVuZCgoTElURVJBTCwgb3JkKHRoaXMpKSkKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLnNlZWsoaGVyZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBsbzoKKyAgICAgICAgICAgICAgICAgICAgbWluID0gaW50KGxvKQorICAgICAgICAgICAgICAgICAgICBpZiBtaW4gPj0gTUFYUkVQRUFUOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcigidGhlIHJlcGV0aXRpb24gbnVtYmVyIGlzIHRvbyBsYXJnZSIpCisgICAgICAgICAgICAgICAgaWYgaGk6CisgICAgICAgICAgICAgICAgICAgIG1heCA9IGludChoaSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbWF4ID49IE1BWFJFUEVBVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoInRoZSByZXBldGl0aW9uIG51bWJlciBpcyB0b28gbGFyZ2UiKQorICAgICAgICAgICAgICAgICAgICBpZiBtYXggPCBtaW46CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcigiYmFkIHJlcGVhdCBpbnRlcnZhbCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAibm90IHN1cHBvcnRlZCIKKyAgICAgICAgICAgICMgZmlndXJlIG91dCB3aGljaCBpdGVtIHRvIHJlcGVhdAorICAgICAgICAgICAgaWYgc3VicGF0dGVybjoKKyAgICAgICAgICAgICAgICBpdGVtID0gc3VicGF0dGVyblstMTpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGl0ZW0gPSBOb25lCisgICAgICAgICAgICBpZiBub3QgaXRlbSBvciAoX2xlbihpdGVtKSA9PSAxIGFuZCBpdGVtWzBdWzBdID09IEFUKToKKyAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgIm5vdGhpbmcgdG8gcmVwZWF0IgorICAgICAgICAgICAgaWYgaXRlbVswXVswXSBpbiBSRVBFQVRDT0RFUzoKKyAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgIm11bHRpcGxlIHJlcGVhdCIKKyAgICAgICAgICAgIGlmIHNvdXJjZW1hdGNoKCI/Iik6CisgICAgICAgICAgICAgICAgc3VicGF0dGVyblstMV0gPSAoTUlOX1JFUEVBVCwgKG1pbiwgbWF4LCBpdGVtKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3VicGF0dGVyblstMV0gPSAoTUFYX1JFUEVBVCwgKG1pbiwgbWF4LCBpdGVtKSkKKworICAgICAgICBlbGlmIHRoaXMgPT0gIi4iOgorICAgICAgICAgICAgc3VicGF0dGVybmFwcGVuZCgoQU5ZLCBOb25lKSkKKworICAgICAgICBlbGlmIHRoaXMgPT0gIigiOgorICAgICAgICAgICAgZ3JvdXAgPSAxCisgICAgICAgICAgICBuYW1lID0gTm9uZQorICAgICAgICAgICAgY29uZGdyb3VwID0gTm9uZQorICAgICAgICAgICAgaWYgc291cmNlbWF0Y2goIj8iKToKKyAgICAgICAgICAgICAgICBncm91cCA9IDAKKyAgICAgICAgICAgICAgICAjIG9wdGlvbnMKKyAgICAgICAgICAgICAgICBpZiBzb3VyY2VtYXRjaCgiUCIpOgorICAgICAgICAgICAgICAgICAgICAjIHB5dGhvbiBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgIGlmIHNvdXJjZW1hdGNoKCI8Iik6CisgICAgICAgICAgICAgICAgICAgICAgICAjIG5hbWVkIGdyb3VwOiBza2lwIGZvcndhcmQgdG8gZW5kIG9mIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIgorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyID0gc291cmNlZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGFyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW50ZXJtaW5hdGVkIG5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hhciA9PSAiPiI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyBjaGFyCisgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yKCJtaXNzaW5nIGdyb3VwIG5hbWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzbmFtZShuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcigiYmFkIGNoYXJhY3RlciBpbiBncm91cCBuYW1lICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBzb3VyY2VtYXRjaCgiPSIpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBuYW1lZCBiYWNrcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciA9IHNvdXJjZWdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hhciBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVudGVybWluYXRlZCBuYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoYXIgPT0gIikiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgY2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IoIm1pc3NpbmcgZ3JvdXAgbmFtZSIpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNuYW1lKG5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yKCJiYWQgY2hhcmFjdGVyIGluIGJhY2tyZWYgZ3JvdXAgbmFtZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVyIiAlIG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBnaWQgPSBzdGF0ZS5ncm91cGRpY3QuZ2V0KG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBnaWQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVua25vd24gZ3JvdXAgbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoKEdST1VQUkVGLCBnaWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgPSBzb3VyY2VnZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hhciBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW5leHBlY3RlZCBlbmQgb2YgcGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW5rbm93biBzcGVjaWZpZXI6ID9QJXMiICUgY2hhcgorICAgICAgICAgICAgICAgIGVsaWYgc291cmNlbWF0Y2goIjoiKToKKyAgICAgICAgICAgICAgICAgICAgIyBub24tY2FwdHVyaW5nIGdyb3VwCisgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gMgorICAgICAgICAgICAgICAgIGVsaWYgc291cmNlbWF0Y2goIiMiKToKKyAgICAgICAgICAgICAgICAgICAgIyBjb21tZW50CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzb3VyY2UubmV4dCBpcyBOb25lIG9yIHNvdXJjZS5uZXh0ID09ICIpIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNvdXJjZW1hdGNoKCIpIik6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVuYmFsYW5jZWQgcGFyZW50aGVzaXMiCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxpZiBzb3VyY2UubmV4dCBpbiBBU1NFUlRDSEFSUzoKKyAgICAgICAgICAgICAgICAgICAgIyBsb29rYWhlYWQgYXNzZXJ0aW9ucworICAgICAgICAgICAgICAgICAgICBjaGFyID0gc291cmNlZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgZGlyID0gMQorICAgICAgICAgICAgICAgICAgICBpZiBjaGFyID09ICI8IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNvdXJjZS5uZXh0IG5vdCBpbiBMT09LQkVISU5EQVNTRVJUQ0hBUlM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJzeW50YXggZXJyb3IiCisgICAgICAgICAgICAgICAgICAgICAgICBkaXIgPSAtMSAjIGxvb2tiZWhpbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgPSBzb3VyY2VnZXQoKQorICAgICAgICAgICAgICAgICAgICBwID0gX3BhcnNlX3N1Yihzb3VyY2UsIHN0YXRlKQorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc291cmNlbWF0Y2goIikiKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW5iYWxhbmNlZCBwYXJlbnRoZXNpcyIKKyAgICAgICAgICAgICAgICAgICAgaWYgY2hhciA9PSAiPSI6CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXR0ZXJuYXBwZW5kKChBU1NFUlQsIChkaXIsIHApKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoKEFTU0VSVF9OT1QsIChkaXIsIHApKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbGlmIHNvdXJjZW1hdGNoKCIoIik6CisgICAgICAgICAgICAgICAgICAgICMgY29uZGl0aW9uYWwgYmFja3JlZmVyZW5jZSBncm91cAorICAgICAgICAgICAgICAgICAgICBjb25kbmFtZSA9ICIiCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyID0gc291cmNlZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoYXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVudGVybWluYXRlZCBuYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hhciA9PSAiKSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRuYW1lID0gY29uZG5hbWUgKyBjaGFyCisgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gMgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgY29uZG5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcigibWlzc2luZyBncm91cCBuYW1lIikKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNuYW1lKGNvbmRuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRncm91cCA9IHN0YXRlLmdyb3VwZGljdC5nZXQoY29uZG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjb25kZ3JvdXAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVua25vd24gZ3JvdXAgbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kZ3JvdXAgPSBpbnQoY29uZG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgImJhZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGZsYWdzCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzb3VyY2UubmV4dCBpbiBGTEFHUzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW5leHBlY3RlZCBlbmQgb2YgcGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgc291cmNlLm5leHQgaW4gRkxBR1M6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5mbGFncyA9IHN0YXRlLmZsYWdzIHwgRkxBR1Nbc291cmNlZ2V0KCldCisgICAgICAgICAgICBpZiBncm91cDoKKyAgICAgICAgICAgICAgICAjIHBhcnNlIGdyb3VwIGNvbnRlbnRzCisgICAgICAgICAgICAgICAgaWYgZ3JvdXAgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgIyBhbm9ueW1vdXMgZ3JvdXAKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBzdGF0ZS5vcGVuZ3JvdXAobmFtZSkKKyAgICAgICAgICAgICAgICBpZiBjb25kZ3JvdXA6CisgICAgICAgICAgICAgICAgICAgIHAgPSBfcGFyc2Vfc3ViX2NvbmQoc291cmNlLCBzdGF0ZSwgY29uZGdyb3VwKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHAgPSBfcGFyc2Vfc3ViKHNvdXJjZSwgc3RhdGUpCisgICAgICAgICAgICAgICAgaWYgbm90IHNvdXJjZW1hdGNoKCIpIik6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW5iYWxhbmNlZCBwYXJlbnRoZXNpcyIKKyAgICAgICAgICAgICAgICBpZiBncm91cCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuY2xvc2Vncm91cChncm91cCkKKyAgICAgICAgICAgICAgICBzdWJwYXR0ZXJuYXBwZW5kKChTVUJQQVRURVJOLCAoZ3JvdXAsIHApKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICAgICAgY2hhciA9IHNvdXJjZWdldCgpCisgICAgICAgICAgICAgICAgICAgIGlmIGNoYXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW5leHBlY3RlZCBlbmQgb2YgcGF0dGVybiIKKyAgICAgICAgICAgICAgICAgICAgaWYgY2hhciA9PSAiKSI6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVua25vd24gZXh0ZW5zaW9uIgorCisgICAgICAgIGVsaWYgdGhpcyA9PSAiXiI6CisgICAgICAgICAgICBzdWJwYXR0ZXJuYXBwZW5kKChBVCwgQVRfQkVHSU5OSU5HKSkKKworICAgICAgICBlbGlmIHRoaXMgPT0gIiQiOgorICAgICAgICAgICAgc3VicGF0dGVybi5hcHBlbmQoKEFULCBBVF9FTkQpKQorCisgICAgICAgIGVsaWYgdGhpcyBhbmQgdGhpc1swXSA9PSAiXFwiOgorICAgICAgICAgICAgY29kZSA9IF9lc2NhcGUoc291cmNlLCB0aGlzLCBzdGF0ZSkKKyAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoY29kZSkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJwYXJzZXIgZXJyb3IiCisKKyAgICByZXR1cm4gc3VicGF0dGVybgorCitkZWYgcGFyc2Uoc3RyLCBmbGFncz0wLCBwYXR0ZXJuPU5vbmUpOgorICAgICMgcGFyc2UgJ3JlJyBwYXR0ZXJuIGludG8gbGlzdCBvZiAob3Bjb2RlLCBhcmd1bWVudCkgdHVwbGVzCisKKyAgICBzb3VyY2UgPSBUb2tlbml6ZXIoc3RyKQorCisgICAgaWYgcGF0dGVybiBpcyBOb25lOgorICAgICAgICBwYXR0ZXJuID0gUGF0dGVybigpCisgICAgcGF0dGVybi5mbGFncyA9IGZsYWdzCisgICAgcGF0dGVybi5zdHIgPSBzdHIKKworICAgIHAgPSBfcGFyc2Vfc3ViKHNvdXJjZSwgcGF0dGVybiwgMCkKKworICAgIHRhaWwgPSBzb3VyY2UuZ2V0KCkKKyAgICBpZiB0YWlsID09ICIpIjoKKyAgICAgICAgcmFpc2UgZXJyb3IsICJ1bmJhbGFuY2VkIHBhcmVudGhlc2lzIgorICAgIGVsaWYgdGFpbDoKKyAgICAgICAgcmFpc2UgZXJyb3IsICJib2d1cyBjaGFyYWN0ZXJzIGF0IGVuZCBvZiByZWd1bGFyIGV4cHJlc3Npb24iCisKKyAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0RFQlVHOgorICAgICAgICBwLmR1bXAoKQorCisgICAgaWYgbm90IChmbGFncyAmIFNSRV9GTEFHX1ZFUkJPU0UpIGFuZCBwLnBhdHRlcm4uZmxhZ3MgJiBTUkVfRkxBR19WRVJCT1NFOgorICAgICAgICAjIHRoZSBWRVJCT1NFIGZsYWcgd2FzIHN3aXRjaGVkIG9uIGluc2lkZSB0aGUgcGF0dGVybi4gIHRvIGJlCisgICAgICAgICMgb24gdGhlIHNhZmUgc2lkZSwgd2UnbGwgcGFyc2UgdGhlIHdob2xlIHRoaW5nIGFnYWluLi4uCisgICAgICAgIHJldHVybiBwYXJzZShzdHIsIHAucGF0dGVybi5mbGFncykKKworICAgIHJldHVybiBwCisKK2RlZiBwYXJzZV90ZW1wbGF0ZShzb3VyY2UsIHBhdHRlcm4pOgorICAgICMgcGFyc2UgJ3JlJyByZXBsYWNlbWVudCBzdHJpbmcgaW50byBsaXN0IG9mIGxpdGVyYWxzIGFuZAorICAgICMgZ3JvdXAgcmVmZXJlbmNlcworICAgIHMgPSBUb2tlbml6ZXIoc291cmNlKQorICAgIHNnZXQgPSBzLmdldAorICAgIHAgPSBbXQorICAgIGEgPSBwLmFwcGVuZAorICAgIGRlZiBsaXRlcmFsKGxpdGVyYWwsIHA9cCwgcGFwcGVuZD1hKToKKyAgICAgICAgaWYgcCBhbmQgcFstMV1bMF0gaXMgTElURVJBTDoKKyAgICAgICAgICAgIHBbLTFdID0gTElURVJBTCwgcFstMV1bMV0gKyBsaXRlcmFsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXBwZW5kKChMSVRFUkFMLCBsaXRlcmFsKSkKKyAgICBzZXAgPSBzb3VyY2VbOjBdCisgICAgaWYgdHlwZShzZXApIGlzIHR5cGUoIiIpOgorICAgICAgICBtYWtlY2hhciA9IGNocgorICAgIGVsc2U6CisgICAgICAgIG1ha2VjaGFyID0gdW5pY2hyCisgICAgd2hpbGUgMToKKyAgICAgICAgdGhpcyA9IHNnZXQoKQorICAgICAgICBpZiB0aGlzIGlzIE5vbmU6CisgICAgICAgICAgICBicmVhayAjIGVuZCBvZiByZXBsYWNlbWVudCBzdHJpbmcKKyAgICAgICAgaWYgdGhpcyBhbmQgdGhpc1swXSA9PSAiXFwiOgorICAgICAgICAgICAgIyBncm91cAorICAgICAgICAgICAgYyA9IHRoaXNbMToyXQorICAgICAgICAgICAgaWYgYyA9PSAiZyI6CisgICAgICAgICAgICAgICAgbmFtZSA9ICIiCisgICAgICAgICAgICAgICAgaWYgcy5tYXRjaCgiPCIpOgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciA9IHNnZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hhciBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW50ZXJtaW5hdGVkIGdyb3VwIG5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGFyID09ICI+IjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyBjaGFyCisgICAgICAgICAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAibWlzc2luZyBncm91cCBuYW1lIgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpbnQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgaW5kZXggPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJuZWdhdGl2ZSBncm91cCBudW1iZXIiCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc25hbWUobmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgImJhZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwYXR0ZXJuLmdyb3VwaW5kZXhbbmFtZV0KKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvciwgInVua25vd24gZ3JvdXAgbmFtZSIKKyAgICAgICAgICAgICAgICBhKChNQVJLLCBpbmRleCkpCisgICAgICAgICAgICBlbGlmIGMgPT0gIjAiOgorICAgICAgICAgICAgICAgIGlmIHMubmV4dCBpbiBPQ1RESUdJVFM6CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPSB0aGlzICsgc2dldCgpCisgICAgICAgICAgICAgICAgICAgIGlmIHMubmV4dCBpbiBPQ1RESUdJVFM6CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzID0gdGhpcyArIHNnZXQoKQorICAgICAgICAgICAgICAgIGxpdGVyYWwobWFrZWNoYXIoaW50KHRoaXNbMTpdLCA4KSAmIDB4ZmYpKQorICAgICAgICAgICAgZWxpZiBjIGluIERJR0lUUzoKKyAgICAgICAgICAgICAgICBpc29jdGFsID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiBzLm5leHQgaW4gRElHSVRTOgorICAgICAgICAgICAgICAgICAgICB0aGlzID0gdGhpcyArIHNnZXQoKQorICAgICAgICAgICAgICAgICAgICBpZiAoYyBpbiBPQ1RESUdJVFMgYW5kIHRoaXNbMl0gaW4gT0NURElHSVRTIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgcy5uZXh0IGluIE9DVERJR0lUUyk6CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzID0gdGhpcyArIHNnZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgaXNvY3RhbCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpdGVyYWwobWFrZWNoYXIoaW50KHRoaXNbMTpdLCA4KSAmIDB4ZmYpKQorICAgICAgICAgICAgICAgIGlmIG5vdCBpc29jdGFsOgorICAgICAgICAgICAgICAgICAgICBhKChNQVJLLCBpbnQodGhpc1sxOl0pKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0aGlzID0gbWFrZWNoYXIoRVNDQVBFU1t0aGlzXVsxXSkKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBsaXRlcmFsKHRoaXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsaXRlcmFsKHRoaXMpCisgICAgIyBjb252ZXJ0IHRlbXBsYXRlIHRvIGdyb3VwcyBhbmQgbGl0ZXJhbHMgbGlzdHMKKyAgICBpID0gMAorICAgIGdyb3VwcyA9IFtdCisgICAgZ3JvdXBzYXBwZW5kID0gZ3JvdXBzLmFwcGVuZAorICAgIGxpdGVyYWxzID0gW05vbmVdICogbGVuKHApCisgICAgZm9yIGMsIHMgaW4gcDoKKyAgICAgICAgaWYgYyBpcyBNQVJLOgorICAgICAgICAgICAgZ3JvdXBzYXBwZW5kKChpLCBzKSkKKyAgICAgICAgICAgICMgbGl0ZXJhbFtpXSBpcyBhbHJlYWR5IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxpdGVyYWxzW2ldID0gcworICAgICAgICBpID0gaSArIDEKKyAgICByZXR1cm4gZ3JvdXBzLCBsaXRlcmFscworCitkZWYgZXhwYW5kX3RlbXBsYXRlKHRlbXBsYXRlLCBtYXRjaCk6CisgICAgZyA9IG1hdGNoLmdyb3VwCisgICAgc2VwID0gbWF0Y2guc3RyaW5nWzowXQorICAgIGdyb3VwcywgbGl0ZXJhbHMgPSB0ZW1wbGF0ZQorICAgIGxpdGVyYWxzID0gbGl0ZXJhbHNbOl0KKyAgICB0cnk6CisgICAgICAgIGZvciBpbmRleCwgZ3JvdXAgaW4gZ3JvdXBzOgorICAgICAgICAgICAgbGl0ZXJhbHNbaW5kZXhdID0gcyA9IGcoZ3JvdXApCisgICAgICAgICAgICBpZiBzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bm1hdGNoZWQgZ3JvdXAiCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIHJhaXNlIGVycm9yLCAiaW52YWxpZCBncm91cCByZWZlcmVuY2UiCisgICAgcmV0dXJuIHNlcC5qb2luKGxpdGVyYWxzKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcmVfcGFyc2UucHljIGIvbGliL3B5dGhvbjIuNy9zcmVfcGFyc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MTM4NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NyZV9wYXJzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcmVfcGFyc2UucHlvIGIvbGliL3B5dGhvbjIuNy9zcmVfcGFyc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MTM4NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NyZV9wYXJzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zc2wucHkgYi9saWIvcHl0aG9uMi43L3NzbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjliOWQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zc2wucHkKQEAgLTAsMCArMSw0NzkgQEAKKyMgV3JhcHBlciBtb2R1bGUgZm9yIF9zc2wsIHByb3ZpZGluZyBzb21lIGFkZGl0aW9uYWwgZmFjaWxpdGllcworIyBpbXBsZW1lbnRlZCBpbiBQeXRob24uICBXcml0dGVuIGJ5IEJpbGwgSmFuc3Nlbi4KKworIiIiXAorVGhpcyBtb2R1bGUgcHJvdmlkZXMgc29tZSBtb3JlIFB5dGhvbmljIHN1cHBvcnQgZm9yIFNTTC4KKworT2JqZWN0IHR5cGVzOgorCisgIFNTTFNvY2tldCAtLSBzdWJ0eXBlIG9mIHNvY2tldC5zb2NrZXQgd2hpY2ggZG9lcyBTU0wgb3ZlciB0aGUgc29ja2V0CisKK0V4Y2VwdGlvbnM6CisKKyAgU1NMRXJyb3IgLS0gZXhjZXB0aW9uIHJhaXNlZCBmb3IgSS9PIGVycm9ycworCitGdW5jdGlvbnM6CisKKyAgY2VydF90aW1lX3RvX3NlY29uZHMgLS0gY29udmVydCB0aW1lIHN0cmluZyB1c2VkIGZvciBjZXJ0aWZpY2F0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICBub3RCZWZvcmUgYW5kIG5vdEFmdGVyIGZ1bmN0aW9ucyB0byBpbnRlZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgcGFzdCB0aGUgRXBvY2ggKHRoZSB0aW1lIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBmcm9tIHRpbWUudGltZSgpKQorCisgIGZldGNoX3NlcnZlcl9jZXJ0aWZpY2F0ZSAoSE9TVCwgUE9SVCkgLS0gZmV0Y2ggdGhlIGNlcnRpZmljYXRlIHByb3ZpZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBzZXJ2ZXIgcnVubmluZyBvbiBIT1NUIGF0IHBvcnQgUE9SVC4gIE5vCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb24gb2YgdGhlIGNlcnRpZmljYXRlIGlzIHBlcmZvcm1lZC4KKworSW50ZWdlciBjb25zdGFudHM6CisKK1NTTF9FUlJPUl9aRVJPX1JFVFVSTgorU1NMX0VSUk9SX1dBTlRfUkVBRAorU1NMX0VSUk9SX1dBTlRfV1JJVEUKK1NTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQCitTU0xfRVJST1JfU1lTQ0FMTAorU1NMX0VSUk9SX1NTTAorU1NMX0VSUk9SX1dBTlRfQ09OTkVDVAorCitTU0xfRVJST1JfRU9GCitTU0xfRVJST1JfSU5WQUxJRF9FUlJPUl9DT0RFCisKK1RoZSBmb2xsb3dpbmcgZ3JvdXAgZGVmaW5lIGNlcnRpZmljYXRlIHJlcXVpcmVtZW50cyB0aGF0IG9uZSBzaWRlIGlzCithbGxvd2luZy9yZXF1aXJpbmcgZnJvbSB0aGUgb3RoZXIgc2lkZToKKworQ0VSVF9OT05FIC0gbm8gY2VydGlmaWNhdGVzIGZyb20gdGhlIG90aGVyIHNpZGUgYXJlIHJlcXVpcmVkIChvciB3aWxsCisgICAgICAgICAgICBiZSBsb29rZWQgYXQgaWYgcHJvdmlkZWQpCitDRVJUX09QVElPTkFMIC0gY2VydGlmaWNhdGVzIGFyZSBub3QgcmVxdWlyZWQsIGJ1dCBpZiBwcm92aWRlZCB3aWxsIGJlCisgICAgICAgICAgICAgICAgdmFsaWRhdGVkLCBhbmQgaWYgdmFsaWRhdGlvbiBmYWlscywgdGhlIGNvbm5lY3Rpb24gd2lsbAorICAgICAgICAgICAgICAgIGFsc28gZmFpbAorQ0VSVF9SRVFVSVJFRCAtIGNlcnRpZmljYXRlcyBhcmUgcmVxdWlyZWQsIGFuZCB3aWxsIGJlIHZhbGlkYXRlZCwgYW5kCisgICAgICAgICAgICAgICAgaWYgdmFsaWRhdGlvbiBmYWlscywgdGhlIGNvbm5lY3Rpb24gd2lsbCBhbHNvIGZhaWwKKworVGhlIGZvbGxvd2luZyBjb25zdGFudHMgaWRlbnRpZnkgdmFyaW91cyBTU0wgcHJvdG9jb2wgdmFyaWFudHM6CisKK1BST1RPQ09MX1NTTHYyCitQUk9UT0NPTF9TU0x2MworUFJPVE9DT0xfU1NMdjIzCitQUk9UT0NPTF9UTFN2MQorIiIiCisKK2ltcG9ydCB0ZXh0d3JhcAorCitpbXBvcnQgX3NzbCAgICAgICAgICAgICAjIGlmIHdlIGNhbid0IGltcG9ydCBpdCwgbGV0IHRoZSBlcnJvciBwcm9wYWdhdGUKKworZnJvbSBfc3NsIGltcG9ydCBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSLCBPUEVOU1NMX1ZFUlNJT05fSU5GTywgT1BFTlNTTF9WRVJTSU9OCitmcm9tIF9zc2wgaW1wb3J0IFNTTEVycm9yCitmcm9tIF9zc2wgaW1wb3J0IENFUlRfTk9ORSwgQ0VSVF9PUFRJT05BTCwgQ0VSVF9SRVFVSVJFRAorZnJvbSBfc3NsIGltcG9ydCBSQU5EX3N0YXR1cywgUkFORF9lZ2QsIFJBTkRfYWRkCitmcm9tIF9zc2wgaW1wb3J0IFwKKyAgICAgU1NMX0VSUk9SX1pFUk9fUkVUVVJOLCBcCisgICAgIFNTTF9FUlJPUl9XQU5UX1JFQUQsIFwKKyAgICAgU1NMX0VSUk9SX1dBTlRfV1JJVEUsIFwKKyAgICAgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVAsIFwKKyAgICAgU1NMX0VSUk9SX1NZU0NBTEwsIFwKKyAgICAgU1NMX0VSUk9SX1NTTCwgXAorICAgICBTU0xfRVJST1JfV0FOVF9DT05ORUNULCBcCisgICAgIFNTTF9FUlJPUl9FT0YsIFwKKyAgICAgU1NMX0VSUk9SX0lOVkFMSURfRVJST1JfQ09ERQorZnJvbSBfc3NsIGltcG9ydCBQUk9UT0NPTF9TU0x2MywgUFJPVE9DT0xfU1NMdjIzLCBQUk9UT0NPTF9UTFN2MQorX1BST1RPQ09MX05BTUVTID0geworICAgIFBST1RPQ09MX1RMU3YxOiAiVExTdjEiLAorICAgIFBST1RPQ09MX1NTTHYyMzogIlNTTHYyMyIsCisgICAgUFJPVE9DT0xfU1NMdjM6ICJTU0x2MyIsCit9Cit0cnk6CisgICAgZnJvbSBfc3NsIGltcG9ydCBQUk9UT0NPTF9TU0x2MgorICAgIF9TU0x2Ml9JRl9FWElTVFMgPSBQUk9UT0NPTF9TU0x2MgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF9TU0x2Ml9JRl9FWElTVFMgPSBOb25lCitlbHNlOgorICAgIF9QUk9UT0NPTF9OQU1FU1tQUk9UT0NPTF9TU0x2Ml0gPSAiU1NMdjIiCisKK2Zyb20gc29ja2V0IGltcG9ydCBzb2NrZXQsIF9maWxlb2JqZWN0LCBfZGVsZWdhdGVfbWV0aG9kcywgZXJyb3IgYXMgc29ja2V0X2Vycm9yCitmcm9tIHNvY2tldCBpbXBvcnQgZ2V0bmFtZWluZm8gYXMgX2dldG5hbWVpbmZvCitpbXBvcnQgYmFzZTY0ICAgICAgICAjIGZvciBERVItdG8tUEVNIHRyYW5zbGF0aW9uCitpbXBvcnQgZXJybm8KKworIyBEaXNhYmxlIHdlYWsgb3IgaW5zZWN1cmUgY2lwaGVycyBieSBkZWZhdWx0CisjIChPcGVuU1NMJ3MgZGVmYXVsdCBzZXR0aW5nIGlzICdERUZBVUxUOiFhTlVMTDohZU5VTEwnKQorX0RFRkFVTFRfQ0lQSEVSUyA9ICdERUZBVUxUOiFhTlVMTDohZU5VTEw6IUxPVzohRVhQT1JUOiFTU0x2MicKKworCitjbGFzcyBTU0xTb2NrZXQoc29ja2V0KToKKworICAgICIiIlRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHN1YnR5cGUgb2Ygc29ja2V0LnNvY2tldCB0aGF0IHdyYXBzCisgICAgdGhlIHVuZGVybHlpbmcgT1Mgc29ja2V0IGluIGFuIFNTTCBjb250ZXh0IHdoZW4gbmVjZXNzYXJ5LCBhbmQKKyAgICBwcm92aWRlcyByZWFkIGFuZCB3cml0ZSBtZXRob2RzIG92ZXIgdGhhdCBjaGFubmVsLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2ssIGtleWZpbGU9Tm9uZSwgY2VydGZpbGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgc2VydmVyX3NpZGU9RmFsc2UsIGNlcnRfcmVxcz1DRVJUX05PTkUsCisgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPVBST1RPQ09MX1NTTHYyMywgY2FfY2VydHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgc3VwcHJlc3NfcmFnZ2VkX2VvZnM9VHJ1ZSwgY2lwaGVycz1Ob25lKToKKyAgICAgICAgc29ja2V0Ll9faW5pdF9fKHNlbGYsIF9zb2NrPXNvY2suX3NvY2spCisgICAgICAgICMgVGhlIGluaXRpYWxpemVyIGZvciBzb2NrZXQgb3ZlcnJpZGVzIHRoZSBtZXRob2RzIHNlbmQoKSwgcmVjdigpLCBldGMuCisgICAgICAgICMgaW4gdGhlIGluc3RhbmNjZSwgd2hpY2ggd2UgZG9uJ3QgbmVlZCAtLSBidXQgd2Ugd2FudCB0byBwcm92aWRlIHRoZQorICAgICAgICAjIG1ldGhvZHMgZGVmaW5lZCBpbiBTU0xTb2NrZXQuCisgICAgICAgIGZvciBhdHRyIGluIF9kZWxlZ2F0ZV9tZXRob2RzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlbGF0dHIoc2VsZiwgYXR0cikKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWYgY2lwaGVycyBpcyBOb25lIGFuZCBzc2xfdmVyc2lvbiAhPSBfU1NMdjJfSUZfRVhJU1RTOgorICAgICAgICAgICAgY2lwaGVycyA9IF9ERUZBVUxUX0NJUEhFUlMKKworICAgICAgICBpZiBjZXJ0ZmlsZSBhbmQgbm90IGtleWZpbGU6CisgICAgICAgICAgICBrZXlmaWxlID0gY2VydGZpbGUKKyAgICAgICAgIyBzZWUgaWYgaXQncyBjb25uZWN0ZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc29ja2V0LmdldHBlZXJuYW1lKHNlbGYpCisgICAgICAgIGV4Y2VwdCBzb2NrZXRfZXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT1RDT05OOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAjIG5vLCBubyBjb25uZWN0aW9uIHlldAorICAgICAgICAgICAgc2VsZi5fY29ubmVjdGVkID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuX3NzbG9iaiA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgeWVzLCBjcmVhdGUgdGhlIFNTTCBvYmplY3QKKyAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3RlZCA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuX3NzbG9iaiA9IF9zc2wuc3Nsd3JhcChzZWxmLl9zb2NrLCBzZXJ2ZXJfc2lkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlmaWxlLCBjZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXMsIHNzbF92ZXJzaW9uLCBjYV9jZXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJzKQorICAgICAgICAgICAgaWYgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q6CisgICAgICAgICAgICAgICAgc2VsZi5kb19oYW5kc2hha2UoKQorICAgICAgICBzZWxmLmtleWZpbGUgPSBrZXlmaWxlCisgICAgICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0ZmlsZQorICAgICAgICBzZWxmLmNlcnRfcmVxcyA9IGNlcnRfcmVxcworICAgICAgICBzZWxmLnNzbF92ZXJzaW9uID0gc3NsX3ZlcnNpb24KKyAgICAgICAgc2VsZi5jYV9jZXJ0cyA9IGNhX2NlcnRzCisgICAgICAgIHNlbGYuY2lwaGVycyA9IGNpcGhlcnMKKyAgICAgICAgc2VsZi5kb19oYW5kc2hha2Vfb25fY29ubmVjdCA9IGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0CisgICAgICAgIHNlbGYuc3VwcHJlc3NfcmFnZ2VkX2VvZnMgPSBzdXBwcmVzc19yYWdnZWRfZW9mcworICAgICAgICBzZWxmLl9tYWtlZmlsZV9yZWZzID0gMAorCisgICAgZGVmIHJlYWQoc2VsZiwgbGVuPTEwMjQpOgorCisgICAgICAgICIiIlJlYWQgdXAgdG8gTEVOIGJ5dGVzIGFuZCByZXR1cm4gdGhlbS4KKyAgICAgICAgUmV0dXJuIHplcm8tbGVuZ3RoIHN0cmluZyBvbiBFT0YuIiIiCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NzbG9iai5yZWFkKGxlbikKKyAgICAgICAgZXhjZXB0IFNTTEVycm9yLCB4OgorICAgICAgICAgICAgaWYgeC5hcmdzWzBdID09IFNTTF9FUlJPUl9FT0YgYW5kIHNlbGYuc3VwcHJlc3NfcmFnZ2VkX2VvZnM6CisgICAgICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisKKyAgICAgICAgIiIiV3JpdGUgREFUQSB0byB0aGUgdW5kZXJseWluZyBTU0wgY2hhbm5lbC4gIFJldHVybnMKKyAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIG9mIERBVEEgYWN0dWFsbHkgdHJhbnNtaXR0ZWQuIiIiCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NzbG9iai53cml0ZShkYXRhKQorCisgICAgZGVmIGdldHBlZXJjZXJ0KHNlbGYsIGJpbmFyeV9mb3JtPUZhbHNlKToKKworICAgICAgICAiIiJSZXR1cm5zIGEgZm9ybWF0dGVkIHZlcnNpb24gb2YgdGhlIGRhdGEgaW4gdGhlCisgICAgICAgIGNlcnRpZmljYXRlIHByb3ZpZGVkIGJ5IHRoZSBvdGhlciBlbmQgb2YgdGhlIFNTTCBjaGFubmVsLgorICAgICAgICBSZXR1cm4gTm9uZSBpZiBubyBjZXJ0aWZpY2F0ZSB3YXMgcHJvdmlkZWQsIHt9IGlmIGEKKyAgICAgICAgY2VydGlmaWNhdGUgd2FzIHByb3ZpZGVkLCBidXQgbm90IHZhbGlkYXRlZC4iIiIKKworICAgICAgICByZXR1cm4gc2VsZi5fc3Nsb2JqLnBlZXJfY2VydGlmaWNhdGUoYmluYXJ5X2Zvcm0pCisKKyAgICBkZWYgY2lwaGVyKHNlbGYpOgorCisgICAgICAgIGlmIG5vdCBzZWxmLl9zc2xvYmo6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NzbG9iai5jaXBoZXIoKQorCisgICAgZGVmIHNlbmQoc2VsZiwgZGF0YSwgZmxhZ3M9MCk6CisgICAgICAgIGlmIHNlbGYuX3NzbG9iajoKKyAgICAgICAgICAgIGlmIGZsYWdzICE9IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIm5vbi16ZXJvIGZsYWdzIG5vdCBhbGxvd2VkIGluIGNhbGxzIHRvIHNlbmQoKSBvbiAlcyIgJQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXykKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB2ID0gc2VsZi5fc3Nsb2JqLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgZXhjZXB0IFNTTEVycm9yLCB4OgorICAgICAgICAgICAgICAgICAgICBpZiB4LmFyZ3NbMF0gPT0gU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICAgICAgICAgIGVsaWYgeC5hcmdzWzBdID09IFNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zb2NrLnNlbmQoZGF0YSwgZmxhZ3MpCisKKyAgICBkZWYgc2VuZHRvKHNlbGYsIGRhdGEsIGZsYWdzX29yX2FkZHIsIGFkZHI9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuX3NzbG9iajoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInNlbmR0byBub3QgYWxsb3dlZCBvbiBpbnN0YW5jZXMgb2YgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18pCisgICAgICAgIGVsaWYgYWRkciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NvY2suc2VuZHRvKGRhdGEsIGZsYWdzX29yX2FkZHIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc29jay5zZW5kdG8oZGF0YSwgZmxhZ3Nfb3JfYWRkciwgYWRkcikKKworICAgIGRlZiBzZW5kYWxsKHNlbGYsIGRhdGEsIGZsYWdzPTApOgorICAgICAgICBpZiBzZWxmLl9zc2xvYmo6CisgICAgICAgICAgICBpZiBmbGFncyAhPSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJub24temVybyBmbGFncyBub3QgYWxsb3dlZCBpbiBjYWxscyB0byBzZW5kYWxsKCkgb24gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18pCisgICAgICAgICAgICBhbW91bnQgPSBsZW4oZGF0YSkKKyAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICAgICAgd2hpbGUgKGNvdW50IDwgYW1vdW50KToKKyAgICAgICAgICAgICAgICB2ID0gc2VsZi5zZW5kKGRhdGFbY291bnQ6XSkKKyAgICAgICAgICAgICAgICBjb3VudCArPSB2CisgICAgICAgICAgICByZXR1cm4gYW1vdW50CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc29ja2V0LnNlbmRhbGwoc2VsZiwgZGF0YSwgZmxhZ3MpCisKKyAgICBkZWYgcmVjdihzZWxmLCBidWZsZW49MTAyNCwgZmxhZ3M9MCk6CisgICAgICAgIGlmIHNlbGYuX3NzbG9iajoKKyAgICAgICAgICAgIGlmIGZsYWdzICE9IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIm5vbi16ZXJvIGZsYWdzIG5vdCBhbGxvd2VkIGluIGNhbGxzIHRvIHJlY3YoKSBvbiAlcyIgJQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJlYWQoYnVmbGVuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NvY2sucmVjdihidWZsZW4sIGZsYWdzKQorCisgICAgZGVmIHJlY3ZfaW50byhzZWxmLCBidWZmZXIsIG5ieXRlcz1Ob25lLCBmbGFncz0wKToKKyAgICAgICAgaWYgYnVmZmVyIGFuZCAobmJ5dGVzIGlzIE5vbmUpOgorICAgICAgICAgICAgbmJ5dGVzID0gbGVuKGJ1ZmZlcikKKyAgICAgICAgZWxpZiBuYnl0ZXMgaXMgTm9uZToKKyAgICAgICAgICAgIG5ieXRlcyA9IDEwMjQKKyAgICAgICAgaWYgc2VsZi5fc3Nsb2JqOgorICAgICAgICAgICAgaWYgZmxhZ3MgIT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgIm5vbi16ZXJvIGZsYWdzIG5vdCBhbGxvd2VkIGluIGNhbGxzIHRvIHJlY3ZfaW50bygpIG9uICVzIiAlCisgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXykKKyAgICAgICAgICAgIHRtcF9idWZmZXIgPSBzZWxmLnJlYWQobmJ5dGVzKQorICAgICAgICAgICAgdiA9IGxlbih0bXBfYnVmZmVyKQorICAgICAgICAgICAgYnVmZmVyWzp2XSA9IHRtcF9idWZmZXIKKyAgICAgICAgICAgIHJldHVybiB2CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc29jay5yZWN2X2ludG8oYnVmZmVyLCBuYnl0ZXMsIGZsYWdzKQorCisgICAgZGVmIHJlY3Zmcm9tKHNlbGYsIGJ1Zmxlbj0xMDI0LCBmbGFncz0wKToKKyAgICAgICAgaWYgc2VsZi5fc3Nsb2JqOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVjdmZyb20gbm90IGFsbG93ZWQgb24gaW5zdGFuY2VzIG9mICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NvY2sucmVjdmZyb20oYnVmbGVuLCBmbGFncykKKworICAgIGRlZiByZWN2ZnJvbV9pbnRvKHNlbGYsIGJ1ZmZlciwgbmJ5dGVzPU5vbmUsIGZsYWdzPTApOgorICAgICAgICBpZiBzZWxmLl9zc2xvYmo6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZWN2ZnJvbV9pbnRvIG5vdCBhbGxvd2VkIG9uIGluc3RhbmNlcyBvZiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zb2NrLnJlY3Zmcm9tX2ludG8oYnVmZmVyLCBuYnl0ZXMsIGZsYWdzKQorCisgICAgZGVmIHBlbmRpbmcoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3NzbG9iajoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zc2xvYmoucGVuZGluZygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIHVud3JhcChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fc3Nsb2JqOgorICAgICAgICAgICAgcyA9IHNlbGYuX3NzbG9iai5zaHV0ZG93bigpCisgICAgICAgICAgICBzZWxmLl9zc2xvYmogPSBOb25lCisgICAgICAgICAgICByZXR1cm4gcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiTm8gU1NMIHdyYXBwZXIgYXJvdW5kICIgKyBzdHIoc2VsZikpCisKKyAgICBkZWYgc2h1dGRvd24oc2VsZiwgaG93KToKKyAgICAgICAgc2VsZi5fc3Nsb2JqID0gTm9uZQorICAgICAgICBzb2NrZXQuc2h1dGRvd24oc2VsZiwgaG93KQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9tYWtlZmlsZV9yZWZzIDwgMToKKyAgICAgICAgICAgIHNlbGYuX3NzbG9iaiA9IE5vbmUKKyAgICAgICAgICAgIHNvY2tldC5jbG9zZShzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyAtPSAxCisKKyAgICBkZWYgZG9faGFuZHNoYWtlKHNlbGYpOgorCisgICAgICAgICIiIlBlcmZvcm0gYSBUTFMvU1NMIGhhbmRzaGFrZS4iIiIKKworICAgICAgICBzZWxmLl9zc2xvYmouZG9faGFuZHNoYWtlKCkKKworICAgIGRlZiBfcmVhbF9jb25uZWN0KHNlbGYsIGFkZHIsIHJldHVybl9lcnJubyk6CisgICAgICAgICMgSGVyZSB3ZSBhc3N1bWUgdGhhdCB0aGUgc29ja2V0IGlzIGNsaWVudC1zaWRlLCBhbmQgbm90CisgICAgICAgICMgY29ubmVjdGVkIGF0IHRoZSB0aW1lIG9mIHRoZSBjYWxsLiAgV2UgY29ubmVjdCBpdCwgdGhlbiB3cmFwIGl0LgorICAgICAgICBpZiBzZWxmLl9jb25uZWN0ZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJhdHRlbXB0IHRvIGNvbm5lY3QgYWxyZWFkeS1jb25uZWN0ZWQgU1NMU29ja2V0ISIpCisgICAgICAgIHNlbGYuX3NzbG9iaiA9IF9zc2wuc3Nsd3JhcChzZWxmLl9zb2NrLCBGYWxzZSwgc2VsZi5rZXlmaWxlLCBzZWxmLmNlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jZXJ0X3JlcXMsIHNlbGYuc3NsX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhX2NlcnRzLCBzZWxmLmNpcGhlcnMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHJldHVybl9lcnJubzoKKyAgICAgICAgICAgICAgICByYyA9IHNvY2tldC5jb25uZWN0X2V4KHNlbGYsIGFkZHIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJjID0gTm9uZQorICAgICAgICAgICAgICAgIHNvY2tldC5jb25uZWN0KHNlbGYsIGFkZHIpCisgICAgICAgICAgICBpZiBub3QgcmM6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5kb19oYW5kc2hha2Vfb25fY29ubmVjdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kb19oYW5kc2hha2UoKQorICAgICAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3RlZCA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiByYworICAgICAgICBleGNlcHQgc29ja2V0X2Vycm9yOgorICAgICAgICAgICAgc2VsZi5fc3Nsb2JqID0gTm9uZQorICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBjb25uZWN0KHNlbGYsIGFkZHIpOgorICAgICAgICAiIiJDb25uZWN0cyB0byByZW1vdGUgQUREUiwgYW5kIHRoZW4gd3JhcHMgdGhlIGNvbm5lY3Rpb24gaW4KKyAgICAgICAgYW4gU1NMIGNoYW5uZWwuIiIiCisgICAgICAgIHNlbGYuX3JlYWxfY29ubmVjdChhZGRyLCBGYWxzZSkKKworICAgIGRlZiBjb25uZWN0X2V4KHNlbGYsIGFkZHIpOgorICAgICAgICAiIiJDb25uZWN0cyB0byByZW1vdGUgQUREUiwgYW5kIHRoZW4gd3JhcHMgdGhlIGNvbm5lY3Rpb24gaW4KKyAgICAgICAgYW4gU1NMIGNoYW5uZWwuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9yZWFsX2Nvbm5lY3QoYWRkciwgVHJ1ZSkKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisKKyAgICAgICAgIiIiQWNjZXB0cyBhIG5ldyBjb25uZWN0aW9uIGZyb20gYSByZW1vdGUgY2xpZW50LCBhbmQgcmV0dXJucworICAgICAgICBhIHR1cGxlIGNvbnRhaW5pbmcgdGhhdCBuZXcgY29ubmVjdGlvbiB3cmFwcGVkIHdpdGggYSBzZXJ2ZXItc2lkZQorICAgICAgICBTU0wgY2hhbm5lbCwgYW5kIHRoZSBhZGRyZXNzIG9mIHRoZSByZW1vdGUgY2xpZW50LiIiIgorCisgICAgICAgIG5ld3NvY2ssIGFkZHIgPSBzb2NrZXQuYWNjZXB0KHNlbGYpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiAoU1NMU29ja2V0KG5ld3NvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlmaWxlPXNlbGYua2V5ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRmaWxlPXNlbGYuY2VydGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfc2lkZT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNlbGYuY2VydF9yZXFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c2VsZi5zc2xfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPXNlbGYuY2FfY2VydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJzPXNlbGYuY2lwaGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PXNlbGYuZG9faGFuZHNoYWtlX29uX2Nvbm5lY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc19yYWdnZWRfZW9mcz1zZWxmLnN1cHByZXNzX3JhZ2dlZF9lb2ZzKSwKKyAgICAgICAgICAgICAgICAgICAgYWRkcikKKyAgICAgICAgZXhjZXB0IHNvY2tldF9lcnJvciBhcyBlOgorICAgICAgICAgICAgbmV3c29jay5jbG9zZSgpCisgICAgICAgICAgICByYWlzZSBlCisKKyAgICBkZWYgbWFrZWZpbGUoc2VsZiwgbW9kZT0ncicsIGJ1ZnNpemU9LTEpOgorCisgICAgICAgICIiIk1ha2UgYW5kIHJldHVybiBhIGZpbGUtbGlrZSBvYmplY3QgdGhhdAorICAgICAgICB3b3JrcyB3aXRoIHRoZSBTU0wgY29ubmVjdGlvbi4gIEp1c3QgdXNlIHRoZSBjb2RlCisgICAgICAgIGZyb20gdGhlIHNvY2tldCBtb2R1bGUuIiIiCisKKyAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyArPSAxCisgICAgICAgICMgY2xvc2U9VHJ1ZSBzbyBhcyB0byBkZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCB3aGVuIGRvbmUgd2l0aAorICAgICAgICAjIHRoZSBmaWxlLWxpa2Ugb2JqZWN0LgorICAgICAgICByZXR1cm4gX2ZpbGVvYmplY3Qoc2VsZiwgbW9kZSwgYnVmc2l6ZSwgY2xvc2U9VHJ1ZSkKKworCisKK2RlZiB3cmFwX3NvY2tldChzb2NrLCBrZXlmaWxlPU5vbmUsIGNlcnRmaWxlPU5vbmUsCisgICAgICAgICAgICAgICAgc2VydmVyX3NpZGU9RmFsc2UsIGNlcnRfcmVxcz1DRVJUX05PTkUsCisgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249UFJPVE9DT0xfU1NMdjIzLCBjYV9jZXJ0cz1Ob25lLAorICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PVRydWUsCisgICAgICAgICAgICAgICAgc3VwcHJlc3NfcmFnZ2VkX2VvZnM9VHJ1ZSwgY2lwaGVycz1Ob25lKToKKworICAgIHJldHVybiBTU0xTb2NrZXQoc29jaywga2V5ZmlsZT1rZXlmaWxlLCBjZXJ0ZmlsZT1jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9zaWRlPXNlcnZlcl9zaWRlLCBjZXJ0X3JlcXM9Y2VydF9yZXFzLAorICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c3NsX3ZlcnNpb24sIGNhX2NlcnRzPWNhX2NlcnRzLAorICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9ZG9faGFuZHNoYWtlX29uX2Nvbm5lY3QsCisgICAgICAgICAgICAgICAgICAgICBzdXBwcmVzc19yYWdnZWRfZW9mcz1zdXBwcmVzc19yYWdnZWRfZW9mcywKKyAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9Y2lwaGVycykKKworCisjIHNvbWUgdXRpbGl0eSBmdW5jdGlvbnMKKworZGVmIGNlcnRfdGltZV90b19zZWNvbmRzKGNlcnRfdGltZSk6CisKKyAgICAiIiJUYWtlcyBhIGRhdGUtdGltZSBzdHJpbmcgaW4gc3RhbmRhcmQgQVNOMV9wcmludCBmb3JtCisgICAgKCJNT04gREFZIDI0SE9VUjpNSU5VVEU6U0VDIFlFQVIgVElNRVpPTkUiKSBhbmQgcmV0dXJuCisgICAgYSBQeXRob24gdGltZSB2YWx1ZSBpbiBzZWNvbmRzIHBhc3QgdGhlIGVwb2NoLiIiIgorCisgICAgaW1wb3J0IHRpbWUKKyAgICByZXR1cm4gdGltZS5ta3RpbWUodGltZS5zdHJwdGltZShjZXJ0X3RpbWUsICIlYiAlZCAlSDolTTolUyAlWSBHTVQiKSkKKworUEVNX0hFQURFUiA9ICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0iCitQRU1fRk9PVEVSID0gIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iCisKK2RlZiBERVJfY2VydF90b19QRU1fY2VydChkZXJfY2VydF9ieXRlcyk6CisKKyAgICAiIiJUYWtlcyBhIGNlcnRpZmljYXRlIGluIGJpbmFyeSBERVIgZm9ybWF0IGFuZCByZXR1cm5zIHRoZQorICAgIFBFTSB2ZXJzaW9uIG9mIGl0IGFzIGEgc3RyaW5nLiIiIgorCisgICAgaWYgaGFzYXR0cihiYXNlNjQsICdzdGFuZGFyZF9iNjRlbmNvZGUnKToKKyAgICAgICAgIyBwcmVmZXJyZWQgYmVjYXVzZSBvbGRlciBBUEkgZ2V0cyBsaW5lLWxlbmd0aCB3cm9uZworICAgICAgICBmID0gYmFzZTY0LnN0YW5kYXJkX2I2NGVuY29kZShkZXJfY2VydF9ieXRlcykKKyAgICAgICAgcmV0dXJuIChQRU1fSEVBREVSICsgJ1xuJyArCisgICAgICAgICAgICAgICAgdGV4dHdyYXAuZmlsbChmLCA2NCkgKyAnXG4nICsKKyAgICAgICAgICAgICAgICBQRU1fRk9PVEVSICsgJ1xuJykKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gKFBFTV9IRUFERVIgKyAnXG4nICsKKyAgICAgICAgICAgICAgICBiYXNlNjQuZW5jb2Rlc3RyaW5nKGRlcl9jZXJ0X2J5dGVzKSArCisgICAgICAgICAgICAgICAgUEVNX0ZPT1RFUiArICdcbicpCisKK2RlZiBQRU1fY2VydF90b19ERVJfY2VydChwZW1fY2VydF9zdHJpbmcpOgorCisgICAgIiIiVGFrZXMgYSBjZXJ0aWZpY2F0ZSBpbiBBU0NJSSBQRU0gZm9ybWF0IGFuZCByZXR1cm5zIHRoZQorICAgIERFUi1lbmNvZGVkIHZlcnNpb24gb2YgaXQgYXMgYSBieXRlIHNlcXVlbmNlIiIiCisKKyAgICBpZiBub3QgcGVtX2NlcnRfc3RyaW5nLnN0YXJ0c3dpdGgoUEVNX0hFQURFUik6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgUEVNIGVuY29kaW5nOyBtdXN0IHN0YXJ0IHdpdGggJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgJSBQRU1fSEVBREVSKQorICAgIGlmIG5vdCBwZW1fY2VydF9zdHJpbmcuc3RyaXAoKS5lbmRzd2l0aChQRU1fRk9PVEVSKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBQRU0gZW5jb2Rpbmc7IG11c3QgZW5kIHdpdGggJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgJSBQRU1fRk9PVEVSKQorICAgIGQgPSBwZW1fY2VydF9zdHJpbmcuc3RyaXAoKVtsZW4oUEVNX0hFQURFUik6LWxlbihQRU1fRk9PVEVSKV0KKyAgICByZXR1cm4gYmFzZTY0LmRlY29kZXN0cmluZyhkKQorCitkZWYgZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShhZGRyLCBzc2xfdmVyc2lvbj1QUk9UT0NPTF9TU0x2MywgY2FfY2VydHM9Tm9uZSk6CisKKyAgICAiIiJSZXRyaWV2ZSB0aGUgY2VydGlmaWNhdGUgZnJvbSB0aGUgc2VydmVyIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcywKKyAgICBhbmQgcmV0dXJuIGl0IGFzIGEgUEVNLWVuY29kZWQgc3RyaW5nLgorICAgIElmICdjYV9jZXJ0cycgaXMgc3BlY2lmaWVkLCB2YWxpZGF0ZSB0aGUgc2VydmVyIGNlcnQgYWdhaW5zdCBpdC4KKyAgICBJZiAnc3NsX3ZlcnNpb24nIGlzIHNwZWNpZmllZCwgdXNlIGl0IGluIHRoZSBjb25uZWN0aW9uIGF0dGVtcHQuIiIiCisKKyAgICBob3N0LCBwb3J0ID0gYWRkcgorICAgIGlmIChjYV9jZXJ0cyBpcyBub3QgTm9uZSk6CisgICAgICAgIGNlcnRfcmVxcyA9IENFUlRfUkVRVUlSRUQKKyAgICBlbHNlOgorICAgICAgICBjZXJ0X3JlcXMgPSBDRVJUX05PTkUKKyAgICBzID0gd3JhcF9zb2NrZXQoc29ja2V0KCksIHNzbF92ZXJzaW9uPXNzbF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9Y2VydF9yZXFzLCBjYV9jZXJ0cz1jYV9jZXJ0cykKKyAgICBzLmNvbm5lY3QoYWRkcikKKyAgICBkZXJjZXJ0ID0gcy5nZXRwZWVyY2VydChUcnVlKQorICAgIHMuY2xvc2UoKQorICAgIHJldHVybiBERVJfY2VydF90b19QRU1fY2VydChkZXJjZXJ0KQorCitkZWYgZ2V0X3Byb3RvY29sX25hbWUocHJvdG9jb2xfY29kZSk6CisgICAgcmV0dXJuIF9QUk9UT0NPTF9OQU1FUy5nZXQocHJvdG9jb2xfY29kZSwgJzx1bmtub3duPicpCisKKworIyBhIHJlcGxhY2VtZW50IGZvciB0aGUgb2xkIHNvY2tldC5zc2wgZnVuY3Rpb24KKworZGVmIHNzbHdyYXBfc2ltcGxlKHNvY2ssIGtleWZpbGU9Tm9uZSwgY2VydGZpbGU9Tm9uZSk6CisKKyAgICAiIiJBIHJlcGxhY2VtZW50IGZvciB0aGUgb2xkIHNvY2tldC5zc2wgZnVuY3Rpb24uICBEZXNpZ25lZAorICAgIGZvciBjb21wYWJpbGl0eSB3aXRoIFB5dGhvbiAyLjUgYW5kIGVhcmxpZXIuICBXaWxsIGRpc2FwcGVhciBpbgorICAgIFB5dGhvbiAzLjAuIiIiCisKKyAgICBpZiBoYXNhdHRyKHNvY2ssICJfc29jayIpOgorICAgICAgICBzb2NrID0gc29jay5fc29jaworCisgICAgc3NsX3NvY2sgPSBfc3NsLnNzbHdyYXAoc29jaywgMCwga2V5ZmlsZSwgY2VydGZpbGUsIENFUlRfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UT0NPTF9TU0x2MjMsIE5vbmUpCisgICAgdHJ5OgorICAgICAgICBzb2NrLmdldHBlZXJuYW1lKCkKKyAgICBleGNlcHQgc29ja2V0X2Vycm9yOgorICAgICAgICAjIG5vLCBubyBjb25uZWN0aW9uIHlldAorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgIyB5ZXMsIGRvIHRoZSBoYW5kc2hha2UKKyAgICAgICAgc3NsX3NvY2suZG9faGFuZHNoYWtlKCkKKworICAgIHJldHVybiBzc2xfc29jawpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zc2wucHljIGIvbGliL3B5dGhvbjIuNy9zc2wucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzhhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NzbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zc2wucHlvIGIvbGliL3B5dGhvbjIuNy9zc2wucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzhhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NzbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdGF0LnB5IGIvbGliL3B5dGhvbjIuNy9zdGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZWQ1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N0YXQucHkKQEAgLTAsMCArMSw5NiBAQAorIiIiQ29uc3RhbnRzL2Z1bmN0aW9ucyBmb3IgaW50ZXJwcmV0aW5nIHJlc3VsdHMgb2Ygb3Muc3RhdCgpIGFuZCBvcy5sc3RhdCgpLgorCitTdWdnZXN0ZWQgdXNhZ2U6IGZyb20gc3RhdCBpbXBvcnQgKgorIiIiCisKKyMgSW5kaWNlcyBmb3Igc3RhdCBzdHJ1Y3QgbWVtYmVycyBpbiB0aGUgdHVwbGUgcmV0dXJuZWQgYnkgb3Muc3RhdCgpCisKK1NUX01PREUgID0gMAorU1RfSU5PICAgPSAxCitTVF9ERVYgICA9IDIKK1NUX05MSU5LID0gMworU1RfVUlEICAgPSA0CitTVF9HSUQgICA9IDUKK1NUX1NJWkUgID0gNgorU1RfQVRJTUUgPSA3CitTVF9NVElNRSA9IDgKK1NUX0NUSU1FID0gOQorCisjIEV4dHJhY3QgYml0cyBmcm9tIHRoZSBtb2RlCisKK2RlZiBTX0lNT0RFKG1vZGUpOgorICAgIHJldHVybiBtb2RlICYgMDc3NzcKKworZGVmIFNfSUZNVChtb2RlKToKKyAgICByZXR1cm4gbW9kZSAmIDAxNzAwMDAKKworIyBDb25zdGFudHMgdXNlZCBhcyBTX0lGTVQoKSBmb3IgdmFyaW91cyBmaWxlIHR5cGVzCisjIChub3QgYWxsIGFyZSBpbXBsZW1lbnRlZCBvbiBhbGwgc3lzdGVtcykKKworU19JRkRJUiAgPSAwMDQwMDAwCitTX0lGQ0hSICA9IDAwMjAwMDAKK1NfSUZCTEsgID0gMDA2MDAwMAorU19JRlJFRyAgPSAwMTAwMDAwCitTX0lGSUZPICA9IDAwMTAwMDAKK1NfSUZMTksgID0gMDEyMDAwMAorU19JRlNPQ0sgPSAwMTQwMDAwCisKKyMgRnVuY3Rpb25zIHRvIHRlc3QgZm9yIGVhY2ggZmlsZSB0eXBlCisKK2RlZiBTX0lTRElSKG1vZGUpOgorICAgIHJldHVybiBTX0lGTVQobW9kZSkgPT0gU19JRkRJUgorCitkZWYgU19JU0NIUihtb2RlKToKKyAgICByZXR1cm4gU19JRk1UKG1vZGUpID09IFNfSUZDSFIKKworZGVmIFNfSVNCTEsobW9kZSk6CisgICAgcmV0dXJuIFNfSUZNVChtb2RlKSA9PSBTX0lGQkxLCisKK2RlZiBTX0lTUkVHKG1vZGUpOgorICAgIHJldHVybiBTX0lGTVQobW9kZSkgPT0gU19JRlJFRworCitkZWYgU19JU0ZJRk8obW9kZSk6CisgICAgcmV0dXJuIFNfSUZNVChtb2RlKSA9PSBTX0lGSUZPCisKK2RlZiBTX0lTTE5LKG1vZGUpOgorICAgIHJldHVybiBTX0lGTVQobW9kZSkgPT0gU19JRkxOSworCitkZWYgU19JU1NPQ0sobW9kZSk6CisgICAgcmV0dXJuIFNfSUZNVChtb2RlKSA9PSBTX0lGU09DSworCisjIE5hbWVzIGZvciBwZXJtaXNzaW9uIGJpdHMKKworU19JU1VJRCA9IDA0MDAwCitTX0lTR0lEID0gMDIwMDAKK1NfRU5GTVQgPSBTX0lTR0lECitTX0lTVlRYID0gMDEwMDAKK1NfSVJFQUQgPSAwMDQwMAorU19JV1JJVEUgPSAwMDIwMAorU19JRVhFQyA9IDAwMTAwCitTX0lSV1hVID0gMDA3MDAKK1NfSVJVU1IgPSAwMDQwMAorU19JV1VTUiA9IDAwMjAwCitTX0lYVVNSID0gMDAxMDAKK1NfSVJXWEcgPSAwMDA3MAorU19JUkdSUCA9IDAwMDQwCitTX0lXR1JQID0gMDAwMjAKK1NfSVhHUlAgPSAwMDAxMAorU19JUldYTyA9IDAwMDA3CitTX0lST1RIID0gMDAwMDQKK1NfSVdPVEggPSAwMDAwMgorU19JWE9USCA9IDAwMDAxCisKKyMgTmFtZXMgZm9yIGZpbGUgZmxhZ3MKKworVUZfTk9EVU1QICAgID0gMHgwMDAwMDAwMQorVUZfSU1NVVRBQkxFID0gMHgwMDAwMDAwMgorVUZfQVBQRU5EICAgID0gMHgwMDAwMDAwNAorVUZfT1BBUVVFICAgID0gMHgwMDAwMDAwOAorVUZfTk9VTkxJTksgID0gMHgwMDAwMDAxMAorVUZfQ09NUFJFU1NFRCA9IDB4MDAwMDAwMjAgICMgT1MgWDogZmlsZSBpcyBoZnMtY29tcHJlc3NlZAorVUZfSElEREVOICAgID0gMHgwMDAwODAwMCAgICMgT1MgWDogZmlsZSBzaG91bGQgbm90IGJlIGRpc3BsYXllZAorU0ZfQVJDSElWRUQgID0gMHgwMDAxMDAwMAorU0ZfSU1NVVRBQkxFID0gMHgwMDAyMDAwMAorU0ZfQVBQRU5EICAgID0gMHgwMDA0MDAwMAorU0ZfTk9VTkxJTksgID0gMHgwMDEwMDAwMAorU0ZfU05BUFNIT1QgID0gMHgwMDIwMDAwMApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdGF0LnB5YyBiL2xpYi9weXRob24yLjcvc3RhdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyZDE2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RhdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdGF0LnB5byBiL2xpYi9weXRob24yLjcvc3RhdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyZDE2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RhdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdGF0dmZzLnB5IGIvbGliL3B5dGhvbjIuNy9zdGF0dmZzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NzI0MjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N0YXR2ZnMucHkKQEAgLTAsMCArMSwxOCBAQAorIiIiQ29uc3RhbnRzIGZvciBpbnRlcnByZXRpbmcgdGhlIHJlc3VsdHMgb2Ygb3Muc3RhdHZmcygpIGFuZCBvcy5mc3RhdHZmcygpLiIiIgorZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJ0aGUgc3RhdHZmcyBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKKyMgSW5kaWNlcyBmb3Igc3RhdHZmcyBzdHJ1Y3QgbWVtYmVycyBpbiB0aGUgdHVwbGUgcmV0dXJuZWQgYnkKKyMgb3Muc3RhdHZmcygpIGFuZCBvcy5mc3RhdHZmcygpLgorCitGX0JTSVpFICAgPSAwICAgICAgICAgICAjIFByZWZlcnJlZCBmaWxlIHN5c3RlbSBibG9jayBzaXplCitGX0ZSU0laRSAgPSAxICAgICAgICAgICAjIEZ1bmRhbWVudGFsIGZpbGUgc3lzdGVtIGJsb2NrIHNpemUKK0ZfQkxPQ0tTICA9IDIgICAgICAgICAgICMgVG90YWwgbnVtYmVyIG9mIGZpbGUgc3lzdGVtIGJsb2NrcyAoRlJTSVpFKQorRl9CRlJFRSAgID0gMyAgICAgICAgICAgIyBUb3RhbCBudW1iZXIgb2YgZnJlZSBibG9ja3MKK0ZfQkFWQUlMICA9IDQgICAgICAgICAgICMgRnJlZSBibG9ja3MgYXZhaWxhYmxlIHRvIG5vbi1zdXBlcnVzZXIKK0ZfRklMRVMgICA9IDUgICAgICAgICAgICMgVG90YWwgbnVtYmVyIG9mIGZpbGUgbm9kZXMKK0ZfRkZSRUUgICA9IDYgICAgICAgICAgICMgVG90YWwgbnVtYmVyIG9mIGZyZWUgZmlsZSBub2RlcworRl9GQVZBSUwgID0gNyAgICAgICAgICAgIyBGcmVlIG5vZGVzIGF2YWlsYWJsZSB0byBub24tc3VwZXJ1c2VyCitGX0ZMQUcgICAgPSA4ICAgICAgICAgICAjIEZsYWdzIChzZWUgeW91ciBsb2NhbCBzdGF0dmZzIG1hbiBwYWdlKQorRl9OQU1FTUFYID0gOSAgICAgICAgICAgIyBNYXhpbXVtIGZpbGUgbmFtZSBsZW5ndGgKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RhdHZmcy5weWMgYi9saWIvcHl0aG9uMi43L3N0YXR2ZnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDQwOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N0YXR2ZnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RhdHZmcy5weW8gYi9saWIvcHl0aG9uMi43L3N0YXR2ZnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDQwOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N0YXR2ZnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RyaW5nLnB5IGIvbGliL3B5dGhvbjIuNy9zdHJpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyNzgwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RyaW5nLnB5CkBAIC0wLDAgKzEsNjQyIEBACisiIiJBIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIG9wZXJhdGlvbnMgKG1vc3QgYXJlIG5vIGxvbmdlciB1c2VkKS4KKworV2FybmluZzogbW9zdCBvZiB0aGUgY29kZSB5b3Ugc2VlIGhlcmUgaXNuJ3Qgbm9ybWFsbHkgdXNlZCBub3dhZGF5cy4KK0JlZ2lubmluZyB3aXRoIFB5dGhvbiAxLjYsIG1hbnkgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBhcworbWV0aG9kcyBvbiB0aGUgc3RhbmRhcmQgc3RyaW5nIG9iamVjdC4gVGhleSB1c2VkIHRvIGJlIGltcGxlbWVudGVkIGJ5CithIGJ1aWx0LWluIG1vZHVsZSBjYWxsZWQgc3Ryb3AsIGJ1dCBzdHJvcCBpcyBub3cgb2Jzb2xldGUgaXRzZWxmLgorCitQdWJsaWMgbW9kdWxlIHZhcmlhYmxlczoKKword2hpdGVzcGFjZSAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgd2hpdGVzcGFjZQorbG93ZXJjYXNlIC0tIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGNoYXJhY3RlcnMgY29uc2lkZXJlZCBsb3dlcmNhc2UgbGV0dGVycwordXBwZXJjYXNlIC0tIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGNoYXJhY3RlcnMgY29uc2lkZXJlZCB1cHBlcmNhc2UgbGV0dGVycworbGV0dGVycyAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgbGV0dGVycworZGlnaXRzIC0tIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGNoYXJhY3RlcnMgY29uc2lkZXJlZCBkZWNpbWFsIGRpZ2l0cworaGV4ZGlnaXRzIC0tIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGNoYXJhY3RlcnMgY29uc2lkZXJlZCBoZXhhZGVjaW1hbCBkaWdpdHMKK29jdGRpZ2l0cyAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgb2N0YWwgZGlnaXRzCitwdW5jdHVhdGlvbiAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgcHVuY3R1YXRpb24KK3ByaW50YWJsZSAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgcHJpbnRhYmxlCisKKyIiIgorCisjIFNvbWUgc3RyaW5ncyBmb3IgY3R5cGUtc3R5bGUgY2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uCit3aGl0ZXNwYWNlID0gJyBcdFxuXHJcdlxmJworbG93ZXJjYXNlID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwordXBwZXJjYXNlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworbGV0dGVycyA9IGxvd2VyY2FzZSArIHVwcGVyY2FzZQorYXNjaWlfbG93ZXJjYXNlID0gbG93ZXJjYXNlCithc2NpaV91cHBlcmNhc2UgPSB1cHBlcmNhc2UKK2FzY2lpX2xldHRlcnMgPSBhc2NpaV9sb3dlcmNhc2UgKyBhc2NpaV91cHBlcmNhc2UKK2RpZ2l0cyA9ICcwMTIzNDU2Nzg5JworaGV4ZGlnaXRzID0gZGlnaXRzICsgJ2FiY2RlZicgKyAnQUJDREVGJworb2N0ZGlnaXRzID0gJzAxMjM0NTY3JworcHVuY3R1YXRpb24gPSAiIiIhIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xdXl9ge3x9fiIiIgorcHJpbnRhYmxlID0gZGlnaXRzICsgbGV0dGVycyArIHB1bmN0dWF0aW9uICsgd2hpdGVzcGFjZQorCisjIENhc2UgY29udmVyc2lvbiBoZWxwZXJzCisjIFVzZSBzdHIgdG8gY29udmVydCBVbmljb2RlIGxpdGVyYWwgaW4gY2FzZSBvZiAtVQorbCA9IG1hcChjaHIsIHhyYW5nZSgyNTYpKQorX2lkbWFwID0gc3RyKCcnKS5qb2luKGwpCitkZWwgbAorCisjIEZ1bmN0aW9ucyB3aGljaCBhcmVuJ3QgYXZhaWxhYmxlIGFzIHN0cmluZyBtZXRob2RzLgorCisjIENhcGl0YWxpemUgdGhlIHdvcmRzIGluIGEgc3RyaW5nLCBlLmcuICIgYUJjICBkRWYgIiAtPiAiQWJjIERlZiIuCitkZWYgY2Fwd29yZHMocywgc2VwPU5vbmUpOgorICAgICIiImNhcHdvcmRzKHMgWyxzZXBdKSAtPiBzdHJpbmcKKworICAgIFNwbGl0IHRoZSBhcmd1bWVudCBpbnRvIHdvcmRzIHVzaW5nIHNwbGl0LCBjYXBpdGFsaXplIGVhY2gKKyAgICB3b3JkIHVzaW5nIGNhcGl0YWxpemUsIGFuZCBqb2luIHRoZSBjYXBpdGFsaXplZCB3b3JkcyB1c2luZworICAgIGpvaW4uICBJZiB0aGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHNlcCBpcyBhYnNlbnQgb3IgTm9uZSwKKyAgICBydW5zIG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgc3BhY2UKKyAgICBhbmQgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhcmUgcmVtb3ZlZCwgb3RoZXJ3aXNlCisgICAgc2VwIGlzIHVzZWQgdG8gc3BsaXQgYW5kIGpvaW4gdGhlIHdvcmRzLgorCisgICAgIiIiCisgICAgcmV0dXJuIChzZXAgb3IgJyAnKS5qb2luKHguY2FwaXRhbGl6ZSgpIGZvciB4IGluIHMuc3BsaXQoc2VwKSkKKworCisjIENvbnN0cnVjdCBhIHRyYW5zbGF0aW9uIHN0cmluZworX2lkbWFwTCA9IE5vbmUKK2RlZiBtYWtldHJhbnMoZnJvbXN0ciwgdG9zdHIpOgorICAgICIiIm1ha2V0cmFucyhmcm0sIHRvKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIHRyYW5zbGF0aW9uIHRhYmxlIChhIHN0cmluZyBvZiAyNTYgYnl0ZXMgbG9uZykKKyAgICBzdWl0YWJsZSBmb3IgdXNlIGluIHN0cmluZy50cmFuc2xhdGUuICBUaGUgc3RyaW5ncyBmcm0gYW5kIHRvCisgICAgbXVzdCBiZSBvZiB0aGUgc2FtZSBsZW5ndGguCisKKyAgICAiIiIKKyAgICBpZiBsZW4oZnJvbXN0cikgIT0gbGVuKHRvc3RyKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm1ha2V0cmFucyBhcmd1bWVudHMgbXVzdCBoYXZlIHNhbWUgbGVuZ3RoIgorICAgIGdsb2JhbCBfaWRtYXBMCisgICAgaWYgbm90IF9pZG1hcEw6CisgICAgICAgIF9pZG1hcEwgPSBsaXN0KF9pZG1hcCkKKyAgICBMID0gX2lkbWFwTFs6XQorICAgIGZyb21zdHIgPSBtYXAob3JkLCBmcm9tc3RyKQorICAgIGZvciBpIGluIHJhbmdlKGxlbihmcm9tc3RyKSk6CisgICAgICAgIExbZnJvbXN0cltpXV0gPSB0b3N0cltpXQorICAgIHJldHVybiAnJy5qb2luKEwpCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaW1wb3J0IHJlIGFzIF9yZQorCitjbGFzcyBfbXVsdGltYXA6CisgICAgIiIiSGVscGVyIGNsYXNzIGZvciBjb21iaW5pbmcgbXVsdGlwbGUgbWFwcGluZ3MuCisKKyAgICBVc2VkIGJ5IC57c2FmZV8sfXN1YnN0aXR1dGUoKSB0byBjb21iaW5lIHRoZSBtYXBwaW5nIGFuZCBrZXl3b3JkCisgICAgYXJndW1lbnRzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcmltYXJ5LCBzZWNvbmRhcnkpOgorICAgICAgICBzZWxmLl9wcmltYXJ5ID0gcHJpbWFyeQorICAgICAgICBzZWxmLl9zZWNvbmRhcnkgPSBzZWNvbmRhcnkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJpbWFyeVtrZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zZWNvbmRhcnlba2V5XQorCisKK2NsYXNzIF9UZW1wbGF0ZU1ldGFjbGFzcyh0eXBlKToKKyAgICBwYXR0ZXJuID0gciIiIgorICAgICUoZGVsaW0pcyg/OgorICAgICAgKD9QPGVzY2FwZWQ+JShkZWxpbSlzKSB8ICAgIyBFc2NhcGUgc2VxdWVuY2Ugb2YgdHdvIGRlbGltaXRlcnMKKyAgICAgICg/UDxuYW1lZD4lKGlkKXMpICAgICAgfCAgICMgZGVsaW1pdGVyIGFuZCBhIFB5dGhvbiBpZGVudGlmaWVyCisgICAgICB7KD9QPGJyYWNlZD4lKGlkKXMpfSAgIHwgICAjIGRlbGltaXRlciBhbmQgYSBicmFjZWQgaWRlbnRpZmllcgorICAgICAgKD9QPGludmFsaWQ+KSAgICAgICAgICAgICAgIyBPdGhlciBpbGwtZm9ybWVkIGRlbGltaXRlciBleHBycworICAgICkKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhjbHMsIG5hbWUsIGJhc2VzLCBkY3QpOgorICAgICAgICBzdXBlcihfVGVtcGxhdGVNZXRhY2xhc3MsIGNscykuX19pbml0X18obmFtZSwgYmFzZXMsIGRjdCkKKyAgICAgICAgaWYgJ3BhdHRlcm4nIGluIGRjdDoKKyAgICAgICAgICAgIHBhdHRlcm4gPSBjbHMucGF0dGVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0dGVybiA9IF9UZW1wbGF0ZU1ldGFjbGFzcy5wYXR0ZXJuICUgeworICAgICAgICAgICAgICAgICdkZWxpbScgOiBfcmUuZXNjYXBlKGNscy5kZWxpbWl0ZXIpLAorICAgICAgICAgICAgICAgICdpZCcgICAgOiBjbHMuaWRwYXR0ZXJuLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2xzLnBhdHRlcm4gPSBfcmUuY29tcGlsZShwYXR0ZXJuLCBfcmUuSUdOT1JFQ0FTRSB8IF9yZS5WRVJCT1NFKQorCisKK2NsYXNzIFRlbXBsYXRlOgorICAgICIiIkEgc3RyaW5nIGNsYXNzIGZvciBzdXBwb3J0aW5nICQtc3Vic3RpdHV0aW9ucy4iIiIKKyAgICBfX21ldGFjbGFzc19fID0gX1RlbXBsYXRlTWV0YWNsYXNzCisKKyAgICBkZWxpbWl0ZXIgPSAnJCcKKyAgICBpZHBhdHRlcm4gPSByJ1tfYS16XVtfYS16MC05XSonCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVtcGxhdGUpOgorICAgICAgICBzZWxmLnRlbXBsYXRlID0gdGVtcGxhdGUKKworICAgICMgU2VhcmNoIGZvciAkJCwgJGlkZW50aWZpZXIsICR7aWRlbnRpZmllcn0sIGFuZCBhbnkgYmFyZSAkJ3MKKworICAgIGRlZiBfaW52YWxpZChzZWxmLCBtbyk6CisgICAgICAgIGkgPSBtby5zdGFydCgnaW52YWxpZCcpCisgICAgICAgIGxpbmVzID0gc2VsZi50ZW1wbGF0ZVs6aV0uc3BsaXRsaW5lcyhUcnVlKQorICAgICAgICBpZiBub3QgbGluZXM6CisgICAgICAgICAgICBjb2xubyA9IDEKKyAgICAgICAgICAgIGxpbmVubyA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbG5vID0gaSAtIGxlbignJy5qb2luKGxpbmVzWzotMV0pKQorICAgICAgICAgICAgbGluZW5vID0gbGVuKGxpbmVzKQorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkIHBsYWNlaG9sZGVyIGluIHN0cmluZzogbGluZSAlZCwgY29sICVkJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbmVubywgY29sbm8pKQorCisgICAgZGVmIHN1YnN0aXR1dGUoc2VsZiwgKmFyZ3MsICoqa3dzKToKKyAgICAgICAgaWYgbGVuKGFyZ3MpID4gMToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHMnKQorICAgICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgIG1hcHBpbmcgPSBrd3MKKyAgICAgICAgZWxpZiBrd3M6CisgICAgICAgICAgICBtYXBwaW5nID0gX211bHRpbWFwKGt3cywgYXJnc1swXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hcHBpbmcgPSBhcmdzWzBdCisgICAgICAgICMgSGVscGVyIGZ1bmN0aW9uIGZvciAuc3ViKCkKKyAgICAgICAgZGVmIGNvbnZlcnQobW8pOgorICAgICAgICAgICAgIyBDaGVjayB0aGUgbW9zdCBjb21tb24gcGF0aCBmaXJzdC4KKyAgICAgICAgICAgIG5hbWVkID0gbW8uZ3JvdXAoJ25hbWVkJykgb3IgbW8uZ3JvdXAoJ2JyYWNlZCcpCisgICAgICAgICAgICBpZiBuYW1lZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB2YWwgPSBtYXBwaW5nW25hbWVkXQorICAgICAgICAgICAgICAgICMgV2UgdXNlIHRoaXMgaWRpb20gaW5zdGVhZCBvZiBzdHIoKSBiZWNhdXNlIHRoZSBsYXR0ZXIgd2lsbAorICAgICAgICAgICAgICAgICMgZmFpbCBpZiB2YWwgaXMgYSBVbmljb2RlIGNvbnRhaW5pbmcgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSAodmFsLCkKKyAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdlc2NhcGVkJykgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsaW1pdGVyCisgICAgICAgICAgICBpZiBtby5ncm91cCgnaW52YWxpZCcpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuX2ludmFsaWQobW8pCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbnJlY29nbml6ZWQgbmFtZWQgZ3JvdXAgaW4gcGF0dGVybicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0dGVybikKKyAgICAgICAgcmV0dXJuIHNlbGYucGF0dGVybi5zdWIoY29udmVydCwgc2VsZi50ZW1wbGF0ZSkKKworICAgIGRlZiBzYWZlX3N1YnN0aXR1dGUoc2VsZiwgKmFyZ3MsICoqa3dzKToKKyAgICAgICAgaWYgbGVuKGFyZ3MpID4gMToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVG9vIG1hbnkgcG9zaXRpb25hbCBhcmd1bWVudHMnKQorICAgICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgIG1hcHBpbmcgPSBrd3MKKyAgICAgICAgZWxpZiBrd3M6CisgICAgICAgICAgICBtYXBwaW5nID0gX211bHRpbWFwKGt3cywgYXJnc1swXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hcHBpbmcgPSBhcmdzWzBdCisgICAgICAgICMgSGVscGVyIGZ1bmN0aW9uIGZvciAuc3ViKCkKKyAgICAgICAgZGVmIGNvbnZlcnQobW8pOgorICAgICAgICAgICAgbmFtZWQgPSBtby5ncm91cCgnbmFtZWQnKQorICAgICAgICAgICAgaWYgbmFtZWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAjIFdlIHVzZSB0aGlzIGlkaW9tIGluc3RlYWQgb2Ygc3RyKCkgYmVjYXVzZSB0aGUgbGF0dGVyCisgICAgICAgICAgICAgICAgICAgICMgd2lsbCBmYWlsIGlmIHZhbCBpcyBhIFVuaWNvZGUgY29udGFpbmluZyBub24tQVNDSUkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSAobWFwcGluZ1tuYW1lZF0sKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsaW1pdGVyICsgbmFtZWQKKyAgICAgICAgICAgIGJyYWNlZCA9IG1vLmdyb3VwKCdicmFjZWQnKQorICAgICAgICAgICAgaWYgYnJhY2VkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSAobWFwcGluZ1ticmFjZWRdLCkKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRlbGltaXRlciArICd7JyArIGJyYWNlZCArICd9JworICAgICAgICAgICAgaWYgbW8uZ3JvdXAoJ2VzY2FwZWQnKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWxpbWl0ZXIKKyAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdpbnZhbGlkJykgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsaW1pdGVyCisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbnJlY29nbml6ZWQgbmFtZWQgZ3JvdXAgaW4gcGF0dGVybicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0dGVybikKKyAgICAgICAgcmV0dXJuIHNlbGYucGF0dGVybi5zdWIoY29udmVydCwgc2VsZi50ZW1wbGF0ZSkKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE5PVEU6IEV2ZXJ5dGhpbmcgYmVsb3cgaGVyZSBpcyBkZXByZWNhdGVkLiAgVXNlIHN0cmluZyBtZXRob2RzIGluc3RlYWQuCisjIFRoaXMgc3R1ZmYgd2lsbCBnbyBhd2F5IGluIFB5dGhvbiAzLjAuCisKKyMgQmFja3dhcmQgY29tcGF0aWJsZSBuYW1lcyBmb3IgZXhjZXB0aW9ucworaW5kZXhfZXJyb3IgPSBWYWx1ZUVycm9yCithdG9pX2Vycm9yID0gVmFsdWVFcnJvcgorYXRvZl9lcnJvciA9IFZhbHVlRXJyb3IKK2F0b2xfZXJyb3IgPSBWYWx1ZUVycm9yCisKKyMgY29udmVydCBVUFBFUiBDQVNFIGxldHRlcnMgdG8gbG93ZXIgY2FzZQorZGVmIGxvd2VyKHMpOgorICAgICIiImxvd2VyKHMpIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KKworICAgICIiIgorICAgIHJldHVybiBzLmxvd2VyKCkKKworIyBDb252ZXJ0IGxvd2VyIGNhc2UgbGV0dGVycyB0byBVUFBFUiBDQVNFCitkZWYgdXBwZXIocyk6CisgICAgIiIidXBwZXIocykgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMudXBwZXIoKQorCisjIFN3YXAgbG93ZXIgY2FzZSBsZXR0ZXJzIGFuZCBVUFBFUiBDQVNFCitkZWYgc3dhcGNhc2Uocyk6CisgICAgIiIic3dhcGNhc2UocykgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyB3aXRoIHVwcGVyIGNhc2UgY2hhcmFjdGVycworICAgIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYW5kIHZpY2UgdmVyc2EuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5zd2FwY2FzZSgpCisKKyMgU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgdGFicyBhbmQgc3BhY2VzCitkZWYgc3RyaXAocywgY2hhcnM9Tm9uZSk6CisgICAgIiIic3RyaXAocyBbLGNoYXJzXSkgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nCisgICAgd2hpdGVzcGFjZSByZW1vdmVkLgorICAgIElmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC4KKyAgICBJZiBjaGFycyBpcyB1bmljb2RlLCBTIHdpbGwgYmUgY29udmVydGVkIHRvIHVuaWNvZGUgYmVmb3JlIHN0cmlwcGluZy4KKworICAgICIiIgorICAgIHJldHVybiBzLnN0cmlwKGNoYXJzKQorCisjIFN0cmlwIGxlYWRpbmcgdGFicyBhbmQgc3BhY2VzCitkZWYgbHN0cmlwKHMsIGNoYXJzPU5vbmUpOgorICAgICIiImxzdHJpcChzIFssY2hhcnNdKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuCisgICAgSWYgY2hhcnMgaXMgZ2l2ZW4gYW5kIG5vdCBOb25lLCByZW1vdmUgY2hhcmFjdGVycyBpbiBjaGFycyBpbnN0ZWFkLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMubHN0cmlwKGNoYXJzKQorCisjIFN0cmlwIHRyYWlsaW5nIHRhYnMgYW5kIHNwYWNlcworZGVmIHJzdHJpcChzLCBjaGFycz1Ob25lKToKKyAgICAiIiJyc3RyaXAocyBbLGNoYXJzXSkgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZC4KKyAgICBJZiBjaGFycyBpcyBnaXZlbiBhbmQgbm90IE5vbmUsIHJlbW92ZSBjaGFyYWN0ZXJzIGluIGNoYXJzIGluc3RlYWQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5yc3RyaXAoY2hhcnMpCisKKworIyBTcGxpdCBhIHN0cmluZyBpbnRvIGEgbGlzdCBvZiBzcGFjZS90YWItc2VwYXJhdGVkIHdvcmRzCitkZWYgc3BsaXQocywgc2VwPU5vbmUsIG1heHNwbGl0PS0xKToKKyAgICAiIiJzcGxpdChzIFssc2VwIFssbWF4c3BsaXRdXSkgLT4gbGlzdCBvZiBzdHJpbmdzCisKKyAgICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nIHMsIHVzaW5nIHNlcCBhcyB0aGUKKyAgICBkZWxpbWl0ZXIgc3RyaW5nLiAgSWYgbWF4c3BsaXQgaXMgZ2l2ZW4sIHNwbGl0cyBhdCBubyBtb3JlIHRoYW4KKyAgICBtYXhzcGxpdCBwbGFjZXMgKHJlc3VsdGluZyBpbiBhdCBtb3N0IG1heHNwbGl0KzEgd29yZHMpLiAgSWYgc2VwCisgICAgaXMgbm90IHNwZWNpZmllZCBvciBpcyBOb25lLCBhbnkgd2hpdGVzcGFjZSBzdHJpbmcgaXMgYSBzZXBhcmF0b3IuCisKKyAgICAoc3BsaXQgYW5kIHNwbGl0ZmllbGRzIGFyZSBzeW5vbnltb3VzKQorCisgICAgIiIiCisgICAgcmV0dXJuIHMuc3BsaXQoc2VwLCBtYXhzcGxpdCkKK3NwbGl0ZmllbGRzID0gc3BsaXQKKworIyBTcGxpdCBhIHN0cmluZyBpbnRvIGEgbGlzdCBvZiBzcGFjZS90YWItc2VwYXJhdGVkIHdvcmRzCitkZWYgcnNwbGl0KHMsIHNlcD1Ob25lLCBtYXhzcGxpdD0tMSk6CisgICAgIiIicnNwbGl0KHMgWyxzZXAgWyxtYXhzcGxpdF1dKSAtPiBsaXN0IG9mIHN0cmluZ3MKKworICAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcgcywgdXNpbmcgc2VwIGFzIHRoZQorICAgIGRlbGltaXRlciBzdHJpbmcsIHN0YXJ0aW5nIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZyBhbmQgd29ya2luZworICAgIHRvIHRoZSBmcm9udC4gIElmIG1heHNwbGl0IGlzIGdpdmVuLCBhdCBtb3N0IG1heHNwbGl0IHNwbGl0cyBhcmUKKyAgICBkb25lLiBJZiBzZXAgaXMgbm90IHNwZWNpZmllZCBvciBpcyBOb25lLCBhbnkgd2hpdGVzcGFjZSBzdHJpbmcKKyAgICBpcyBhIHNlcGFyYXRvci4KKyAgICAiIiIKKyAgICByZXR1cm4gcy5yc3BsaXQoc2VwLCBtYXhzcGxpdCkKKworIyBKb2luIGZpZWxkcyB3aXRoIG9wdGlvbmFsIHNlcGFyYXRvcgorZGVmIGpvaW4od29yZHMsIHNlcCA9ICcgJyk6CisgICAgIiIiam9pbihsaXN0IFssc2VwXSkgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBzdHJpbmcgY29tcG9zZWQgb2YgdGhlIHdvcmRzIGluIGxpc3QsIHdpdGgKKyAgICBpbnRlcnZlbmluZyBvY2N1cnJlbmNlcyBvZiBzZXAuICBUaGUgZGVmYXVsdCBzZXBhcmF0b3IgaXMgYQorICAgIHNpbmdsZSBzcGFjZS4KKworICAgIChqb2luZmllbGRzIGFuZCBqb2luIGFyZSBzeW5vbnltb3VzKQorCisgICAgIiIiCisgICAgcmV0dXJuIHNlcC5qb2luKHdvcmRzKQoram9pbmZpZWxkcyA9IGpvaW4KKworIyBGaW5kIHN1YnN0cmluZywgcmFpc2UgZXhjZXB0aW9uIGlmIG5vdCBmb3VuZAorZGVmIGluZGV4KHMsICphcmdzKToKKyAgICAiIiJpbmRleChzLCBzdWIgWyxzdGFydCBbLGVuZF1dKSAtPiBpbnQKKworICAgIExpa2UgZmluZCBidXQgcmFpc2VzIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdCBmb3VuZC4KKworICAgICIiIgorICAgIHJldHVybiBzLmluZGV4KCphcmdzKQorCisjIEZpbmQgbGFzdCBzdWJzdHJpbmcsIHJhaXNlIGV4Y2VwdGlvbiBpZiBub3QgZm91bmQKK2RlZiByaW5kZXgocywgKmFyZ3MpOgorICAgICIiInJpbmRleChzLCBzdWIgWyxzdGFydCBbLGVuZF1dKSAtPiBpbnQKKworICAgIExpa2UgcmZpbmQgYnV0IHJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QgZm91bmQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5yaW5kZXgoKmFyZ3MpCisKKyMgQ291bnQgbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZworZGVmIGNvdW50KHMsICphcmdzKToKKyAgICAiIiJjb3VudChzLCBzdWJbLCBzdGFydFssZW5kXV0pIC0+IGludAorCisgICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nIHN1YiBpbiBzdHJpbmcKKyAgICBzW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUKKyAgICBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi4KKworICAgICIiIgorICAgIHJldHVybiBzLmNvdW50KCphcmdzKQorCisjIEZpbmQgc3Vic3RyaW5nLCByZXR1cm4gLTEgaWYgbm90IGZvdW5kCitkZWYgZmluZChzLCAqYXJncyk6CisgICAgIiIiZmluZChzLCBzdWIgWyxzdGFydCBbLGVuZF1dKSAtPiBpbgorCisgICAgUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gcyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLAorICAgIHN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBzW3N0YXJ0LGVuZF0uICBPcHRpb25hbAorICAgIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi4KKworICAgIFJldHVybiAtMSBvbiBmYWlsdXJlLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMuZmluZCgqYXJncykKKworIyBGaW5kIGxhc3Qgc3Vic3RyaW5nLCByZXR1cm4gLTEgaWYgbm90IGZvdW5kCitkZWYgcmZpbmQocywgKmFyZ3MpOgorICAgICIiInJmaW5kKHMsIHN1YiBbLHN0YXJ0IFssZW5kXV0pIC0+IGludAorCisgICAgUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIHMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCwKKyAgICBzdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gc1tzdGFydCxlbmRdLiAgT3B0aW9uYWwKKyAgICBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uCisKKyAgICBSZXR1cm4gLTEgb24gZmFpbHVyZS4KKworICAgICIiIgorICAgIHJldHVybiBzLnJmaW5kKCphcmdzKQorCisjIGZvciBhIGJpdCBvZiBzcGVlZAorX2Zsb2F0ID0gZmxvYXQKK19pbnQgPSBpbnQKK19sb25nID0gbG9uZworCisjIENvbnZlcnQgc3RyaW5nIHRvIGZsb2F0CitkZWYgYXRvZihzKToKKyAgICAiIiJhdG9mKHMpIC0+IGZsb2F0CisKKyAgICBSZXR1cm4gdGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nIHMuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX2Zsb2F0KHMpCisKKworIyBDb252ZXJ0IHN0cmluZyB0byBpbnRlZ2VyCitkZWYgYXRvaShzICwgYmFzZT0xMCk6CisgICAgIiIiYXRvaShzIFssYmFzZV0pIC0+IGludAorCisgICAgUmV0dXJuIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgcyBpbiB0aGUgZ2l2ZW4KKyAgICBiYXNlLCB3aGljaCBkZWZhdWx0cyB0byAxMC4gIFRoZSBzdHJpbmcgcyBtdXN0IGNvbnNpc3Qgb2Ygb25lCisgICAgb3IgbW9yZSBkaWdpdHMsIHBvc3NpYmx5IHByZWNlZGVkIGJ5IGEgc2lnbi4gIElmIGJhc2UgaXMgMCwgaXQKKyAgICBpcyBjaG9zZW4gZnJvbSB0aGUgbGVhZGluZyBjaGFyYWN0ZXJzIG9mIHMsIDAgZm9yIG9jdGFsLCAweCBvcgorICAgIDBYIGZvciBoZXhhZGVjaW1hbC4gIElmIGJhc2UgaXMgMTYsIGEgcHJlY2VkaW5nIDB4IG9yIDBYIGlzCisgICAgYWNjZXB0ZWQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX2ludChzLCBiYXNlKQorCisKKyMgQ29udmVydCBzdHJpbmcgdG8gbG9uZyBpbnRlZ2VyCitkZWYgYXRvbChzLCBiYXNlPTEwKToKKyAgICAiIiJhdG9sKHMgWyxiYXNlXSkgLT4gbG9uZworCisgICAgUmV0dXJuIHRoZSBsb25nIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHN0cmluZyBzIGluIHRoZQorICAgIGdpdmVuIGJhc2UsIHdoaWNoIGRlZmF1bHRzIHRvIDEwLiAgVGhlIHN0cmluZyBzIG11c3QgY29uc2lzdAorICAgIG9mIG9uZSBvciBtb3JlIGRpZ2l0cywgcG9zc2libHkgcHJlY2VkZWQgYnkgYSBzaWduLiAgSWYgYmFzZQorICAgIGlzIDAsIGl0IGlzIGNob3NlbiBmcm9tIHRoZSBsZWFkaW5nIGNoYXJhY3RlcnMgb2YgcywgMCBmb3IKKyAgICBvY3RhbCwgMHggb3IgMFggZm9yIGhleGFkZWNpbWFsLiAgSWYgYmFzZSBpcyAxNiwgYSBwcmVjZWRpbmcKKyAgICAweCBvciAwWCBpcyBhY2NlcHRlZC4gIEEgdHJhaWxpbmcgTCBvciBsIGlzIG5vdCBhY2NlcHRlZCwKKyAgICB1bmxlc3MgYmFzZSBpcyAwLgorCisgICAgIiIiCisgICAgcmV0dXJuIF9sb25nKHMsIGJhc2UpCisKKworIyBMZWZ0LWp1c3RpZnkgYSBzdHJpbmcKK2RlZiBsanVzdChzLCB3aWR0aCwgKmFyZ3MpOgorICAgICIiImxqdXN0KHMsIHdpZHRoWywgZmlsbGNoYXJdKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGxlZnQtanVzdGlmaWVkIHZlcnNpb24gb2YgcywgaW4gYSBmaWVsZCBvZiB0aGUKKyAgICBzcGVjaWZpZWQgd2lkdGgsIHBhZGRlZCB3aXRoIHNwYWNlcyBhcyBuZWVkZWQuICBUaGUgc3RyaW5nIGlzCisgICAgbmV2ZXIgdHJ1bmNhdGVkLiAgSWYgc3BlY2lmaWVkIHRoZSBmaWxsY2hhciBpcyB1c2VkIGluc3RlYWQgb2Ygc3BhY2VzLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMubGp1c3Qod2lkdGgsICphcmdzKQorCisjIFJpZ2h0LWp1c3RpZnkgYSBzdHJpbmcKK2RlZiByanVzdChzLCB3aWR0aCwgKmFyZ3MpOgorICAgICIiInJqdXN0KHMsIHdpZHRoWywgZmlsbGNoYXJdKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIHJpZ2h0LWp1c3RpZmllZCB2ZXJzaW9uIG9mIHMsIGluIGEgZmllbGQgb2YgdGhlCisgICAgc3BlY2lmaWVkIHdpZHRoLCBwYWRkZWQgd2l0aCBzcGFjZXMgYXMgbmVlZGVkLiAgVGhlIHN0cmluZyBpcworICAgIG5ldmVyIHRydW5jYXRlZC4gIElmIHNwZWNpZmllZCB0aGUgZmlsbGNoYXIgaXMgdXNlZCBpbnN0ZWFkIG9mIHNwYWNlcy4KKworICAgICIiIgorICAgIHJldHVybiBzLnJqdXN0KHdpZHRoLCAqYXJncykKKworIyBDZW50ZXIgYSBzdHJpbmcKK2RlZiBjZW50ZXIocywgd2lkdGgsICphcmdzKToKKyAgICAiIiJjZW50ZXIocywgd2lkdGhbLCBmaWxsY2hhcl0pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY2VudGVyIHZlcnNpb24gb2YgcywgaW4gYSBmaWVsZCBvZiB0aGUgc3BlY2lmaWVkCisgICAgd2lkdGguIHBhZGRlZCB3aXRoIHNwYWNlcyBhcyBuZWVkZWQuICBUaGUgc3RyaW5nIGlzIG5ldmVyCisgICAgdHJ1bmNhdGVkLiAgSWYgc3BlY2lmaWVkIHRoZSBmaWxsY2hhciBpcyB1c2VkIGluc3RlYWQgb2Ygc3BhY2VzLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMuY2VudGVyKHdpZHRoLCAqYXJncykKKworIyBaZXJvLWZpbGwgYSBudW1iZXIsIGUuZy4sICgxMiwgMykgLS0+ICcwMTInIGFuZCAoLTMsIDMpIC0tPiAnLTAzJworIyBEZWNhZGVudCBmZWF0dXJlOiB0aGUgYXJndW1lbnQgbWF5IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyCisjIChVc2Ugb2YgdGhpcyBpcyBkZXByZWNhdGVkOyBpdCBzaG91bGQgYmUgYSBzdHJpbmcgYXMgd2l0aCBsanVzdCBjLnMuKQorZGVmIHpmaWxsKHgsIHdpZHRoKToKKyAgICAiIiJ6ZmlsbCh4LCB3aWR0aCkgLT4gc3RyaW5nCisKKyAgICBQYWQgYSBudW1lcmljIHN0cmluZyB4IHdpdGggemVyb3Mgb24gdGhlIGxlZnQsIHRvIGZpbGwgYSBmaWVsZAorICAgIG9mIHRoZSBzcGVjaWZpZWQgd2lkdGguICBUaGUgc3RyaW5nIHggaXMgbmV2ZXIgdHJ1bmNhdGVkLgorCisgICAgIiIiCisgICAgaWYgbm90IGlzaW5zdGFuY2UoeCwgYmFzZXN0cmluZyk6CisgICAgICAgIHggPSByZXByKHgpCisgICAgcmV0dXJuIHguemZpbGwod2lkdGgpCisKKyMgRXhwYW5kIHRhYnMgaW4gYSBzdHJpbmcuCisjIERvZXNuJ3QgdGFrZSBub24tcHJpbnRpbmcgY2hhcnMgaW50byBhY2NvdW50LCBidXQgZG9lcyB1bmRlcnN0YW5kIFxuLgorZGVmIGV4cGFuZHRhYnMocywgdGFic2l6ZT04KToKKyAgICAiIiJleHBhbmR0YWJzKHMgWyx0YWJzaXplXSkgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyB3aXRoIGFsbCB0YWIgY2hhcmFjdGVycyByZXBsYWNlZAorICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2Ygc3BhY2VzLCBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQKKyAgICBjb2x1bW4sIGFuZCB0aGUgdGFic2l6ZSAoZGVmYXVsdCA4KS4KKworICAgICIiIgorICAgIHJldHVybiBzLmV4cGFuZHRhYnModGFic2l6ZSkKKworIyBDaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGhyb3VnaCBsb29rLXVwIHRhYmxlLgorZGVmIHRyYW5zbGF0ZShzLCB0YWJsZSwgZGVsZXRpb25zPSIiKToKKyAgICAiIiJ0cmFuc2xhdGUocyx0YWJsZSBbLGRlbGV0aW9uc10pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMsIHdoZXJlIGFsbCBjaGFyYWN0ZXJzIG9jY3VycmluZworICAgIGluIHRoZSBvcHRpb25hbCBhcmd1bWVudCBkZWxldGlvbnMgYXJlIHJlbW92ZWQsIGFuZCB0aGUKKyAgICByZW1haW5pbmcgY2hhcmFjdGVycyBoYXZlIGJlZW4gbWFwcGVkIHRocm91Z2ggdGhlIGdpdmVuCisgICAgdHJhbnNsYXRpb24gdGFibGUsIHdoaWNoIG11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDI1Ni4gIFRoZQorICAgIGRlbGV0aW9ucyBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCBmb3IgVW5pY29kZSBzdHJpbmdzLgorCisgICAgIiIiCisgICAgaWYgZGVsZXRpb25zIG9yIHRhYmxlIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBzLnRyYW5zbGF0ZSh0YWJsZSwgZGVsZXRpb25zKQorICAgIGVsc2U6CisgICAgICAgICMgQWRkIHNbOjBdIHNvIHRoYXQgaWYgcyBpcyBVbmljb2RlIGFuZCB0YWJsZSBpcyBhbiA4LWJpdCBzdHJpbmcsCisgICAgICAgICMgdGFibGUgaXMgY29udmVydGVkIHRvIFVuaWNvZGUuICBUaGlzIG1lYW5zIHRoYXQgdGFibGUgKmNhbm5vdCoKKyAgICAgICAgIyBiZSBhIGRpY3Rpb25hcnkgLS0gZm9yIHRoYXQgZmVhdHVyZSwgdXNlIHUudHJhbnNsYXRlKCkgZGlyZWN0bHkuCisgICAgICAgIHJldHVybiBzLnRyYW5zbGF0ZSh0YWJsZSArIHNbOjBdKQorCisjIENhcGl0YWxpemUgYSBzdHJpbmcsIGUuZy4gImFCYyAgZEVmIiAtPiAiQWJjICBkZWYiLgorZGVmIGNhcGl0YWxpemUocyk6CisgICAgIiIiY2FwaXRhbGl6ZShzKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIHdpdGggb25seSBpdHMgZmlyc3QgY2hhcmFjdGVyCisgICAgY2FwaXRhbGl6ZWQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5jYXBpdGFsaXplKCkKKworIyBTdWJzdHJpbmcgcmVwbGFjZW1lbnQgKGdsb2JhbCkKK2RlZiByZXBsYWNlKHMsIG9sZCwgbmV3LCBtYXhyZXBsYWNlPS0xKToKKyAgICAiIiJyZXBsYWNlIChzdHIsIG9sZCwgbmV3WywgbWF4cmVwbGFjZV0pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiBzdHJpbmcgc3RyIHdpdGggYWxsIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZworICAgIG9sZCByZXBsYWNlZCBieSBuZXcuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBtYXhyZXBsYWNlIGlzCisgICAgZ2l2ZW4sIG9ubHkgdGhlIGZpcnN0IG1heHJlcGxhY2Ugb2NjdXJyZW5jZXMgYXJlIHJlcGxhY2VkLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMucmVwbGFjZShvbGQsIG5ldywgbWF4cmVwbGFjZSkKKworCisjIFRyeSBpbXBvcnRpbmcgb3B0aW9uYWwgYnVpbHQtaW4gbW9kdWxlICJzdHJvcCIgLS0gaWYgaXQgZXhpc3RzLAorIyBpdCByZWRlZmluZXMgc29tZSBzdHJpbmcgb3BlcmF0aW9ucyB0aGF0IGFyZSAxMDAtMTAwMCB0aW1lcyBmYXN0ZXIuCisjIEl0IGFsc28gZGVmaW5lcyB2YWx1ZXMgZm9yIHdoaXRlc3BhY2UsIGxvd2VyY2FzZSBhbmQgdXBwZXJjYXNlCisjIHRoYXQgbWF0Y2ggPGN0eXBlLmg+J3MgZGVmaW5pdGlvbnMuCisKK3RyeToKKyAgICBmcm9tIHN0cm9wIGltcG9ydCBtYWtldHJhbnMsIGxvd2VyY2FzZSwgdXBwZXJjYXNlLCB3aGl0ZXNwYWNlCisgICAgbGV0dGVycyA9IGxvd2VyY2FzZSArIHVwcGVyY2FzZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSB0aGUgb3JpZ2luYWwgdmVyc2lvbnMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHRoZSBGb3JtYXR0ZXIgY2xhc3MKKyMgc2VlIFBFUCAzMTAxIGZvciBkZXRhaWxzIGFuZCBwdXJwb3NlIG9mIHRoaXMgY2xhc3MKKworIyBUaGUgaGFyZCBwYXJ0cyBhcmUgcmV1c2VkIGZyb20gdGhlIEMgaW1wbGVtZW50YXRpb24uICBUaGV5J3JlIGV4cG9zZWQgYXMgIl8iCisjIHByZWZpeGVkIG1ldGhvZHMgb2Ygc3RyIGFuZCB1bmljb2RlLgorCisjIFRoZSBvdmVyYWxsIHBhcnNlciBpcyBpbXBsZW1lbnRlZCBpbiBzdHIuX2Zvcm1hdHRlcl9wYXJzZXIuCisjIFRoZSBmaWVsZCBuYW1lIHBhcnNlciBpcyBpbXBsZW1lbnRlZCBpbiBzdHIuX2Zvcm1hdHRlcl9maWVsZF9uYW1lX3NwbGl0CisKK2NsYXNzIEZvcm1hdHRlcihvYmplY3QpOgorICAgIGRlZiBmb3JtYXQoc2VsZiwgZm9ybWF0X3N0cmluZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmZvcm1hdChmb3JtYXRfc3RyaW5nLCBhcmdzLCBrd2FyZ3MpCisKKyAgICBkZWYgdmZvcm1hdChzZWxmLCBmb3JtYXRfc3RyaW5nLCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICB1c2VkX2FyZ3MgPSBzZXQoKQorICAgICAgICByZXN1bHQgPSBzZWxmLl92Zm9ybWF0KGZvcm1hdF9zdHJpbmcsIGFyZ3MsIGt3YXJncywgdXNlZF9hcmdzLCAyKQorICAgICAgICBzZWxmLmNoZWNrX3VudXNlZF9hcmdzKHVzZWRfYXJncywgYXJncywga3dhcmdzKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX3Zmb3JtYXQoc2VsZiwgZm9ybWF0X3N0cmluZywgYXJncywga3dhcmdzLCB1c2VkX2FyZ3MsIHJlY3Vyc2lvbl9kZXB0aCk6CisgICAgICAgIGlmIHJlY3Vyc2lvbl9kZXB0aCA8IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdNYXggc3RyaW5nIHJlY3Vyc2lvbiBleGNlZWRlZCcpCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciBsaXRlcmFsX3RleHQsIGZpZWxkX25hbWUsIGZvcm1hdF9zcGVjLCBjb252ZXJzaW9uIGluIFwKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlKGZvcm1hdF9zdHJpbmcpOgorCisgICAgICAgICAgICAjIG91dHB1dCB0aGUgbGl0ZXJhbCB0ZXh0CisgICAgICAgICAgICBpZiBsaXRlcmFsX3RleHQ6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaXRlcmFsX3RleHQpCisKKyAgICAgICAgICAgICMgaWYgdGhlcmUncyBhIGZpZWxkLCBvdXRwdXQgaXQKKyAgICAgICAgICAgIGlmIGZpZWxkX25hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyB0aGlzIGlzIHNvbWUgbWFya3VwLCBmaW5kIHRoZSBvYmplY3QgYW5kIGRvCisgICAgICAgICAgICAgICAgIyAgdGhlIGZvcm1hdHRpbmcKKworICAgICAgICAgICAgICAgICMgZ2l2ZW4gdGhlIGZpZWxkX25hbWUsIGZpbmQgdGhlIG9iamVjdCBpdCByZWZlcmVuY2VzCisgICAgICAgICAgICAgICAgIyAgYW5kIHRoZSBhcmd1bWVudCBpdCBjYW1lIGZyb20KKyAgICAgICAgICAgICAgICBvYmosIGFyZ191c2VkID0gc2VsZi5nZXRfZmllbGQoZmllbGRfbmFtZSwgYXJncywga3dhcmdzKQorICAgICAgICAgICAgICAgIHVzZWRfYXJncy5hZGQoYXJnX3VzZWQpCisKKyAgICAgICAgICAgICAgICAjIGRvIGFueSBjb252ZXJzaW9uIG9uIHRoZSByZXN1bHRpbmcgb2JqZWN0CisgICAgICAgICAgICAgICAgb2JqID0gc2VsZi5jb252ZXJ0X2ZpZWxkKG9iaiwgY29udmVyc2lvbikKKworICAgICAgICAgICAgICAgICMgZXhwYW5kIHRoZSBmb3JtYXQgc3BlYywgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgZm9ybWF0X3NwZWMgPSBzZWxmLl92Zm9ybWF0KGZvcm1hdF9zcGVjLCBhcmdzLCBrd2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRfYXJncywgcmVjdXJzaW9uX2RlcHRoLTEpCisKKyAgICAgICAgICAgICAgICAjIGZvcm1hdCB0aGUgb2JqZWN0IGFuZCBhcHBlbmQgdG8gdGhlIHJlc3VsdAorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VsZi5mb3JtYXRfZmllbGQob2JqLCBmb3JtYXRfc3BlYykpCisKKyAgICAgICAgcmV0dXJuICcnLmpvaW4ocmVzdWx0KQorCisKKyAgICBkZWYgZ2V0X3ZhbHVlKHNlbGYsIGtleSwgYXJncywga3dhcmdzKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgIHJldHVybiBhcmdzW2tleV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBrd2FyZ3Nba2V5XQorCisKKyAgICBkZWYgY2hlY2tfdW51c2VkX2FyZ3Moc2VsZiwgdXNlZF9hcmdzLCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICBwYXNzCisKKworICAgIGRlZiBmb3JtYXRfZmllbGQoc2VsZiwgdmFsdWUsIGZvcm1hdF9zcGVjKToKKyAgICAgICAgcmV0dXJuIGZvcm1hdCh2YWx1ZSwgZm9ybWF0X3NwZWMpCisKKworICAgIGRlZiBjb252ZXJ0X2ZpZWxkKHNlbGYsIHZhbHVlLCBjb252ZXJzaW9uKToKKyAgICAgICAgIyBkbyBhbnkgY29udmVyc2lvbiBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdAorICAgICAgICBpZiBjb252ZXJzaW9uIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKyAgICAgICAgZWxpZiBjb252ZXJzaW9uID09ICdzJzoKKyAgICAgICAgICAgIHJldHVybiBzdHIodmFsdWUpCisgICAgICAgIGVsaWYgY29udmVyc2lvbiA9PSAncic6CisgICAgICAgICAgICByZXR1cm4gcmVwcih2YWx1ZSkKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5rbm93biBjb252ZXJzaW9uIHNwZWNpZmllciB7MCFzfSIuZm9ybWF0KGNvbnZlcnNpb24pKQorCisKKyAgICAjIHJldHVybnMgYW4gaXRlcmFibGUgdGhhdCBjb250YWlucyB0dXBsZXMgb2YgdGhlIGZvcm06CisgICAgIyAobGl0ZXJhbF90ZXh0LCBmaWVsZF9uYW1lLCBmb3JtYXRfc3BlYywgY29udmVyc2lvbikKKyAgICAjIGxpdGVyYWxfdGV4dCBjYW4gYmUgemVybyBsZW5ndGgKKyAgICAjIGZpZWxkX25hbWUgY2FuIGJlIE5vbmUsIGluIHdoaWNoIGNhc2UgdGhlcmUncyBubworICAgICMgIG9iamVjdCB0byBmb3JtYXQgYW5kIG91dHB1dAorICAgICMgaWYgZmllbGRfbmFtZSBpcyBub3QgTm9uZSwgaXQgaXMgbG9va2VkIHVwLCBmb3JtYXR0ZWQKKyAgICAjICB3aXRoIGZvcm1hdF9zcGVjIGFuZCBjb252ZXJzaW9uIGFuZCB0aGVuIHVzZWQKKyAgICBkZWYgcGFyc2Uoc2VsZiwgZm9ybWF0X3N0cmluZyk6CisgICAgICAgIHJldHVybiBmb3JtYXRfc3RyaW5nLl9mb3JtYXR0ZXJfcGFyc2VyKCkKKworCisgICAgIyBnaXZlbiBhIGZpZWxkX25hbWUsIGZpbmQgdGhlIG9iamVjdCBpdCByZWZlcmVuY2VzLgorICAgICMgIGZpZWxkX25hbWU6ICAgdGhlIGZpZWxkIGJlaW5nIGxvb2tlZCB1cCwgZS5nLiAiMC5uYW1lIgorICAgICMgICAgICAgICAgICAgICAgIG9yICJsb29rdXBbM10iCisgICAgIyAgdXNlZF9hcmdzOiAgICBhIHNldCBvZiB3aGljaCBhcmdzIGhhdmUgYmVlbiB1c2VkCisgICAgIyAgYXJncywga3dhcmdzOiBhcyBwYXNzZWQgaW4gdG8gdmZvcm1hdAorICAgIGRlZiBnZXRfZmllbGQoc2VsZiwgZmllbGRfbmFtZSwgYXJncywga3dhcmdzKToKKyAgICAgICAgZmlyc3QsIHJlc3QgPSBmaWVsZF9uYW1lLl9mb3JtYXR0ZXJfZmllbGRfbmFtZV9zcGxpdCgpCisKKyAgICAgICAgb2JqID0gc2VsZi5nZXRfdmFsdWUoZmlyc3QsIGFyZ3MsIGt3YXJncykKKworICAgICAgICAjIGxvb3AgdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgZmllbGRfbmFtZSwgZG9pbmcKKyAgICAgICAgIyAgZ2V0YXR0ciBvciBnZXRpdGVtIGFzIG5lZWRlZAorICAgICAgICBmb3IgaXNfYXR0ciwgaSBpbiByZXN0OgorICAgICAgICAgICAgaWYgaXNfYXR0cjoKKyAgICAgICAgICAgICAgICBvYmogPSBnZXRhdHRyKG9iaiwgaSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2JqID0gb2JqW2ldCisKKyAgICAgICAgcmV0dXJuIG9iaiwgZmlyc3QKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RyaW5nLnB5YyBiL2xpYi9weXRob24yLjcvc3RyaW5nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDNkMTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdHJpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RyaW5nLnB5byBiL2xpYi9weXRob24yLjcvc3RyaW5nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDNkMTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdHJpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RyaW5nb2xkLnB5IGIvbGliL3B5dGhvbjIuNy9zdHJpbmdvbGQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmZTM4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RyaW5nb2xkLnB5CkBAIC0wLDAgKzEsNDMyIEBACisjIG1vZHVsZSAnc3RyaW5nJyAtLSBBIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIG9wZXJhdGlvbnMKKworIyBXYXJuaW5nOiBtb3N0IG9mIHRoZSBjb2RlIHlvdSBzZWUgaGVyZSBpc24ndCBub3JtYWxseSB1c2VkIG5vd2FkYXlzLiAgV2l0aAorIyBQeXRob24gMS42LCBtYW55IG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYXMgbWV0aG9kcyBvbiB0aGUKKyMgc3RhbmRhcmQgc3RyaW5nIG9iamVjdC4gVGhleSB1c2VkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgYnVpbHQtaW4gbW9kdWxlCisjIGNhbGxlZCBzdHJvcCwgYnV0IHN0cm9wIGlzIG5vdyBvYnNvbGV0ZSBpdHNlbGYuCisKKyIiIkNvbW1vbiBzdHJpbmcgbWFuaXB1bGF0aW9ucy4KKworUHVibGljIG1vZHVsZSB2YXJpYWJsZXM6CisKK3doaXRlc3BhY2UgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIHdoaXRlc3BhY2UKK2xvd2VyY2FzZSAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgbG93ZXJjYXNlIGxldHRlcnMKK3VwcGVyY2FzZSAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgdXBwZXJjYXNlIGxldHRlcnMKK2xldHRlcnMgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIGxldHRlcnMKK2RpZ2l0cyAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgZGVjaW1hbCBkaWdpdHMKK2hleGRpZ2l0cyAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgaGV4YWRlY2ltYWwgZGlnaXRzCitvY3RkaWdpdHMgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIG9jdGFsIGRpZ2l0cworCisiIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIHN0cmluZ29sZCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKKyMgU29tZSBzdHJpbmdzIGZvciBjdHlwZS1zdHlsZSBjaGFyYWN0ZXIgY2xhc3NpZmljYXRpb24KK3doaXRlc3BhY2UgPSAnIFx0XG5cclx2XGYnCitsb3dlcmNhc2UgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCit1cHBlcmNhc2UgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCitsZXR0ZXJzID0gbG93ZXJjYXNlICsgdXBwZXJjYXNlCitkaWdpdHMgPSAnMDEyMzQ1Njc4OScKK2hleGRpZ2l0cyA9IGRpZ2l0cyArICdhYmNkZWYnICsgJ0FCQ0RFRicKK29jdGRpZ2l0cyA9ICcwMTIzNDU2NycKKworIyBDYXNlIGNvbnZlcnNpb24gaGVscGVycworX2lkbWFwID0gJycKK2ZvciBpIGluIHJhbmdlKDI1Nik6IF9pZG1hcCA9IF9pZG1hcCArIGNocihpKQorZGVsIGkKKworIyBCYWNrd2FyZCBjb21wYXRpYmxlIG5hbWVzIGZvciBleGNlcHRpb25zCitpbmRleF9lcnJvciA9IFZhbHVlRXJyb3IKK2F0b2lfZXJyb3IgPSBWYWx1ZUVycm9yCithdG9mX2Vycm9yID0gVmFsdWVFcnJvcgorYXRvbF9lcnJvciA9IFZhbHVlRXJyb3IKKworIyBjb252ZXJ0IFVQUEVSIENBU0UgbGV0dGVycyB0byBsb3dlciBjYXNlCitkZWYgbG93ZXIocyk6CisgICAgIiIibG93ZXIocykgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMubG93ZXIoKQorCisjIENvbnZlcnQgbG93ZXIgY2FzZSBsZXR0ZXJzIHRvIFVQUEVSIENBU0UKK2RlZiB1cHBlcihzKToKKyAgICAiIiJ1cHBlcihzKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy51cHBlcigpCisKKyMgU3dhcCBsb3dlciBjYXNlIGxldHRlcnMgYW5kIFVQUEVSIENBU0UKK2RlZiBzd2FwY2FzZShzKToKKyAgICAiIiJzd2FwY2FzZShzKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIHdpdGggdXBwZXIgY2FzZSBjaGFyYWN0ZXJzCisgICAgY29udmVydGVkIHRvIGxvd2VyY2FzZSBhbmQgdmljZSB2ZXJzYS4KKworICAgICIiIgorICAgIHJldHVybiBzLnN3YXBjYXNlKCkKKworIyBTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB0YWJzIGFuZCBzcGFjZXMKK2RlZiBzdHJpcChzKToKKyAgICAiIiJzdHJpcChzKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIHdpdGggbGVhZGluZyBhbmQgdHJhaWxpbmcKKyAgICB3aGl0ZXNwYWNlIHJlbW92ZWQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5zdHJpcCgpCisKKyMgU3RyaXAgbGVhZGluZyB0YWJzIGFuZCBzcGFjZXMKK2RlZiBsc3RyaXAocyk6CisgICAgIiIibHN0cmlwKHMpIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgd2l0aCBsZWFkaW5nIHdoaXRlc3BhY2UgcmVtb3ZlZC4KKworICAgICIiIgorICAgIHJldHVybiBzLmxzdHJpcCgpCisKKyMgU3RyaXAgdHJhaWxpbmcgdGFicyBhbmQgc3BhY2VzCitkZWYgcnN0cmlwKHMpOgorICAgICIiInJzdHJpcChzKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIHdpdGggdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgIHJlbW92ZWQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5yc3RyaXAoKQorCisKKyMgU3BsaXQgYSBzdHJpbmcgaW50byBhIGxpc3Qgb2Ygc3BhY2UvdGFiLXNlcGFyYXRlZCB3b3JkcworZGVmIHNwbGl0KHMsIHNlcD1Ob25lLCBtYXhzcGxpdD0wKToKKyAgICAiIiJzcGxpdChzdHIgWyxzZXAgWyxtYXhzcGxpdF1dKSAtPiBsaXN0IG9mIHN0cmluZ3MKKworICAgIFJldHVybiBhIGxpc3Qgb2YgdGhlIHdvcmRzIGluIHRoZSBzdHJpbmcgcywgdXNpbmcgc2VwIGFzIHRoZQorICAgIGRlbGltaXRlciBzdHJpbmcuICBJZiBtYXhzcGxpdCBpcyBub256ZXJvLCBzcGxpdHMgaW50byBhdCBtb3N0CisgICAgbWF4c3BsaXQgd29yZHMgSWYgc2VwIGlzIG5vdCBzcGVjaWZpZWQsIGFueSB3aGl0ZXNwYWNlIHN0cmluZworICAgIGlzIGEgc2VwYXJhdG9yLiAgTWF4c3BsaXQgZGVmYXVsdHMgdG8gMC4KKworICAgIChzcGxpdCBhbmQgc3BsaXRmaWVsZHMgYXJlIHN5bm9ueW1vdXMpCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5zcGxpdChzZXAsIG1heHNwbGl0KQorc3BsaXRmaWVsZHMgPSBzcGxpdAorCisjIEpvaW4gZmllbGRzIHdpdGggb3B0aW9uYWwgc2VwYXJhdG9yCitkZWYgam9pbih3b3Jkcywgc2VwID0gJyAnKToKKyAgICAiIiJqb2luKGxpc3QgWyxzZXBdKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIHN0cmluZyBjb21wb3NlZCBvZiB0aGUgd29yZHMgaW4gbGlzdCwgd2l0aAorICAgIGludGVydmVuaW5nIG9jY3VycmVuY2VzIG9mIHNlcC4gIFRoZSBkZWZhdWx0IHNlcGFyYXRvciBpcyBhCisgICAgc2luZ2xlIHNwYWNlLgorCisgICAgKGpvaW5maWVsZHMgYW5kIGpvaW4gYXJlIHN5bm9ueW1vdXMpCisKKyAgICAiIiIKKyAgICByZXR1cm4gc2VwLmpvaW4od29yZHMpCitqb2luZmllbGRzID0gam9pbgorCisjIGZvciBhIGxpdHRsZSBiaXQgb2Ygc3BlZWQKK19hcHBseSA9IGFwcGx5CisKKyMgRmluZCBzdWJzdHJpbmcsIHJhaXNlIGV4Y2VwdGlvbiBpZiBub3QgZm91bmQKK2RlZiBpbmRleChzLCAqYXJncyk6CisgICAgIiIiaW5kZXgocywgc3ViIFssc3RhcnQgWyxlbmRdXSkgLT4gaW50CisKKyAgICBMaWtlIGZpbmQgYnV0IHJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QgZm91bmQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX2FwcGx5KHMuaW5kZXgsIGFyZ3MpCisKKyMgRmluZCBsYXN0IHN1YnN0cmluZywgcmFpc2UgZXhjZXB0aW9uIGlmIG5vdCBmb3VuZAorZGVmIHJpbmRleChzLCAqYXJncyk6CisgICAgIiIicmluZGV4KHMsIHN1YiBbLHN0YXJ0IFssZW5kXV0pIC0+IGludAorCisgICAgTGlrZSByZmluZCBidXQgcmFpc2VzIFZhbHVlRXJyb3Igd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdCBmb3VuZC4KKworICAgICIiIgorICAgIHJldHVybiBfYXBwbHkocy5yaW5kZXgsIGFyZ3MpCisKKyMgQ291bnQgbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZworZGVmIGNvdW50KHMsICphcmdzKToKKyAgICAiIiJjb3VudChzLCBzdWJbLCBzdGFydFssZW5kXV0pIC0+IGludAorCisgICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nIHN1YiBpbiBzdHJpbmcKKyAgICBzW3N0YXJ0OmVuZF0uICBPcHRpb25hbCBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUKKyAgICBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi4KKworICAgICIiIgorICAgIHJldHVybiBfYXBwbHkocy5jb3VudCwgYXJncykKKworIyBGaW5kIHN1YnN0cmluZywgcmV0dXJuIC0xIGlmIG5vdCBmb3VuZAorZGVmIGZpbmQocywgKmFyZ3MpOgorICAgICIiImZpbmQocywgc3ViIFssc3RhcnQgWyxlbmRdXSkgLT4gaW4KKworICAgIFJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCwKKyAgICBzdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gc1tzdGFydCxlbmRdLiAgT3B0aW9uYWwKKyAgICBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uCisKKyAgICBSZXR1cm4gLTEgb24gZmFpbHVyZS4KKworICAgICIiIgorICAgIHJldHVybiBfYXBwbHkocy5maW5kLCBhcmdzKQorCisjIEZpbmQgbGFzdCBzdWJzdHJpbmcsIHJldHVybiAtMSBpZiBub3QgZm91bmQKK2RlZiByZmluZChzLCAqYXJncyk6CisgICAgIiIicmZpbmQocywgc3ViIFssc3RhcnQgWyxlbmRdXSkgLT4gaW50CisKKyAgICBSZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gcyB3aGVyZSBzdWJzdHJpbmcgc3ViIGlzIGZvdW5kLAorICAgIHN1Y2ggdGhhdCBzdWIgaXMgY29udGFpbmVkIHdpdGhpbiBzW3N0YXJ0LGVuZF0uICBPcHRpb25hbAorICAgIGFyZ3VtZW50cyBzdGFydCBhbmQgZW5kIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZSBub3RhdGlvbi4KKworICAgIFJldHVybiAtMSBvbiBmYWlsdXJlLgorCisgICAgIiIiCisgICAgcmV0dXJuIF9hcHBseShzLnJmaW5kLCBhcmdzKQorCisjIGZvciBhIGJpdCBvZiBzcGVlZAorX2Zsb2F0ID0gZmxvYXQKK19pbnQgPSBpbnQKK19sb25nID0gbG9uZworX1N0cmluZ1R5cGUgPSB0eXBlKCcnKQorCisjIENvbnZlcnQgc3RyaW5nIHRvIGZsb2F0CitkZWYgYXRvZihzKToKKyAgICAiIiJhdG9mKHMpIC0+IGZsb2F0CisKKyAgICBSZXR1cm4gdGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nIHMuCisKKyAgICAiIiIKKyAgICBpZiB0eXBlKHMpID09IF9TdHJpbmdUeXBlOgorICAgICAgICByZXR1cm4gX2Zsb2F0KHMpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdhcmd1bWVudCAxOiBleHBlY3RlZCBzdHJpbmcsICVzIGZvdW5kJyAlCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKHMpLl9fbmFtZV9fKQorCisjIENvbnZlcnQgc3RyaW5nIHRvIGludGVnZXIKK2RlZiBhdG9pKCphcmdzKToKKyAgICAiIiJhdG9pKHMgWyxiYXNlXSkgLT4gaW50CisKKyAgICBSZXR1cm4gdGhlIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHN0cmluZyBzIGluIHRoZSBnaXZlbgorICAgIGJhc2UsIHdoaWNoIGRlZmF1bHRzIHRvIDEwLiAgVGhlIHN0cmluZyBzIG11c3QgY29uc2lzdCBvZiBvbmUKKyAgICBvciBtb3JlIGRpZ2l0cywgcG9zc2libHkgcHJlY2VkZWQgYnkgYSBzaWduLiAgSWYgYmFzZSBpcyAwLCBpdAorICAgIGlzIGNob3NlbiBmcm9tIHRoZSBsZWFkaW5nIGNoYXJhY3RlcnMgb2YgcywgMCBmb3Igb2N0YWwsIDB4IG9yCisgICAgMFggZm9yIGhleGFkZWNpbWFsLiAgSWYgYmFzZSBpcyAxNiwgYSBwcmVjZWRpbmcgMHggb3IgMFggaXMKKyAgICBhY2NlcHRlZC4KKworICAgICIiIgorICAgIHRyeToKKyAgICAgICAgcyA9IGFyZ3NbMF0KKyAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdmdW5jdGlvbiByZXF1aXJlcyBhdCBsZWFzdCAxIGFyZ3VtZW50OiAlZCBnaXZlbicgJQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGFyZ3MpKQorICAgICMgRG9uJ3QgY2F0Y2ggdHlwZSBlcnJvciByZXN1bHRpbmcgZnJvbSB0b28gbWFueSBhcmd1bWVudHMgdG8gaW50KCkuICBUaGUKKyAgICAjIGVycm9yIG1lc3NhZ2UgaXNuJ3QgY29tcGF0aWJsZSBidXQgdGhlIGVycm9yIHR5cGUgaXMsIGFuZCB0aGlzIGZ1bmN0aW9uCisgICAgIyBpcyBjb21wbGljYXRlZCBlbm91Z2ggYWxyZWFkeS4KKyAgICBpZiB0eXBlKHMpID09IF9TdHJpbmdUeXBlOgorICAgICAgICByZXR1cm4gX2FwcGx5KF9pbnQsIGFyZ3MpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdhcmd1bWVudCAxOiBleHBlY3RlZCBzdHJpbmcsICVzIGZvdW5kJyAlCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKHMpLl9fbmFtZV9fKQorCisKKyMgQ29udmVydCBzdHJpbmcgdG8gbG9uZyBpbnRlZ2VyCitkZWYgYXRvbCgqYXJncyk6CisgICAgIiIiYXRvbChzIFssYmFzZV0pIC0+IGxvbmcKKworICAgIFJldHVybiB0aGUgbG9uZyBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgcyBpbiB0aGUKKyAgICBnaXZlbiBiYXNlLCB3aGljaCBkZWZhdWx0cyB0byAxMC4gIFRoZSBzdHJpbmcgcyBtdXN0IGNvbnNpc3QKKyAgICBvZiBvbmUgb3IgbW9yZSBkaWdpdHMsIHBvc3NpYmx5IHByZWNlZGVkIGJ5IGEgc2lnbi4gIElmIGJhc2UKKyAgICBpcyAwLCBpdCBpcyBjaG9zZW4gZnJvbSB0aGUgbGVhZGluZyBjaGFyYWN0ZXJzIG9mIHMsIDAgZm9yCisgICAgb2N0YWwsIDB4IG9yIDBYIGZvciBoZXhhZGVjaW1hbC4gIElmIGJhc2UgaXMgMTYsIGEgcHJlY2VkaW5nCisgICAgMHggb3IgMFggaXMgYWNjZXB0ZWQuICBBIHRyYWlsaW5nIEwgb3IgbCBpcyBub3QgYWNjZXB0ZWQsCisgICAgdW5sZXNzIGJhc2UgaXMgMC4KKworICAgICIiIgorICAgIHRyeToKKyAgICAgICAgcyA9IGFyZ3NbMF0KKyAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdmdW5jdGlvbiByZXF1aXJlcyBhdCBsZWFzdCAxIGFyZ3VtZW50OiAlZCBnaXZlbicgJQorICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGFyZ3MpKQorICAgICMgRG9uJ3QgY2F0Y2ggdHlwZSBlcnJvciByZXN1bHRpbmcgZnJvbSB0b28gbWFueSBhcmd1bWVudHMgdG8gbG9uZygpLiAgVGhlCisgICAgIyBlcnJvciBtZXNzYWdlIGlzbid0IGNvbXBhdGlibGUgYnV0IHRoZSBlcnJvciB0eXBlIGlzLCBhbmQgdGhpcyBmdW5jdGlvbgorICAgICMgaXMgY29tcGxpY2F0ZWQgZW5vdWdoIGFscmVhZHkuCisgICAgaWYgdHlwZShzKSA9PSBfU3RyaW5nVHlwZToKKyAgICAgICAgcmV0dXJuIF9hcHBseShfbG9uZywgYXJncykKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2FyZ3VtZW50IDE6IGV4cGVjdGVkIHN0cmluZywgJXMgZm91bmQnICUKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUocykuX19uYW1lX18pCisKKworIyBMZWZ0LWp1c3RpZnkgYSBzdHJpbmcKK2RlZiBsanVzdChzLCB3aWR0aCk6CisgICAgIiIibGp1c3Qocywgd2lkdGgpIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgbGVmdC1qdXN0aWZpZWQgdmVyc2lvbiBvZiBzLCBpbiBhIGZpZWxkIG9mIHRoZQorICAgIHNwZWNpZmllZCB3aWR0aCwgcGFkZGVkIHdpdGggc3BhY2VzIGFzIG5lZWRlZC4gIFRoZSBzdHJpbmcgaXMKKyAgICBuZXZlciB0cnVuY2F0ZWQuCisKKyAgICAiIiIKKyAgICBuID0gd2lkdGggLSBsZW4ocykKKyAgICBpZiBuIDw9IDA6IHJldHVybiBzCisgICAgcmV0dXJuIHMgKyAnICcqbgorCisjIFJpZ2h0LWp1c3RpZnkgYSBzdHJpbmcKK2RlZiByanVzdChzLCB3aWR0aCk6CisgICAgIiIicmp1c3Qocywgd2lkdGgpIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgcmlnaHQtanVzdGlmaWVkIHZlcnNpb24gb2YgcywgaW4gYSBmaWVsZCBvZiB0aGUKKyAgICBzcGVjaWZpZWQgd2lkdGgsIHBhZGRlZCB3aXRoIHNwYWNlcyBhcyBuZWVkZWQuICBUaGUgc3RyaW5nIGlzCisgICAgbmV2ZXIgdHJ1bmNhdGVkLgorCisgICAgIiIiCisgICAgbiA9IHdpZHRoIC0gbGVuKHMpCisgICAgaWYgbiA8PSAwOiByZXR1cm4gcworICAgIHJldHVybiAnICcqbiArIHMKKworIyBDZW50ZXIgYSBzdHJpbmcKK2RlZiBjZW50ZXIocywgd2lkdGgpOgorICAgICIiImNlbnRlcihzLCB3aWR0aCkgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjZW50ZXIgdmVyc2lvbiBvZiBzLCBpbiBhIGZpZWxkIG9mIHRoZSBzcGVjaWZpZWQKKyAgICB3aWR0aC4gcGFkZGVkIHdpdGggc3BhY2VzIGFzIG5lZWRlZC4gIFRoZSBzdHJpbmcgaXMgbmV2ZXIKKyAgICB0cnVuY2F0ZWQuCisKKyAgICAiIiIKKyAgICBuID0gd2lkdGggLSBsZW4ocykKKyAgICBpZiBuIDw9IDA6IHJldHVybiBzCisgICAgaGFsZiA9IG4vMgorICAgIGlmIG4lMiBhbmQgd2lkdGglMjoKKyAgICAgICAgIyBUaGlzIGVuc3VyZXMgdGhhdCBjZW50ZXIoY2VudGVyKHMsIGkpLCBqKSA9IGNlbnRlcihzLCBqKQorICAgICAgICBoYWxmID0gaGFsZisxCisgICAgcmV0dXJuICcgJypoYWxmICsgIHMgKyAnICcqKG4taGFsZikKKworIyBaZXJvLWZpbGwgYSBudW1iZXIsIGUuZy4sICgxMiwgMykgLS0+ICcwMTInIGFuZCAoLTMsIDMpIC0tPiAnLTAzJworIyBEZWNhZGVudCBmZWF0dXJlOiB0aGUgYXJndW1lbnQgbWF5IGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyCisjIChVc2Ugb2YgdGhpcyBpcyBkZXByZWNhdGVkOyBpdCBzaG91bGQgYmUgYSBzdHJpbmcgYXMgd2l0aCBsanVzdCBjLnMuKQorZGVmIHpmaWxsKHgsIHdpZHRoKToKKyAgICAiIiJ6ZmlsbCh4LCB3aWR0aCkgLT4gc3RyaW5nCisKKyAgICBQYWQgYSBudW1lcmljIHN0cmluZyB4IHdpdGggemVyb3Mgb24gdGhlIGxlZnQsIHRvIGZpbGwgYSBmaWVsZAorICAgIG9mIHRoZSBzcGVjaWZpZWQgd2lkdGguICBUaGUgc3RyaW5nIHggaXMgbmV2ZXIgdHJ1bmNhdGVkLgorCisgICAgIiIiCisgICAgaWYgdHlwZSh4KSA9PSB0eXBlKCcnKTogcyA9IHgKKyAgICBlbHNlOiBzID0gcmVwcih4KQorICAgIG4gPSBsZW4ocykKKyAgICBpZiBuID49IHdpZHRoOiByZXR1cm4gcworICAgIHNpZ24gPSAnJworICAgIGlmIHNbMF0gaW4gKCctJywgJysnKToKKyAgICAgICAgc2lnbiwgcyA9IHNbMF0sIHNbMTpdCisgICAgcmV0dXJuIHNpZ24gKyAnMCcqKHdpZHRoLW4pICsgcworCisjIEV4cGFuZCB0YWJzIGluIGEgc3RyaW5nLgorIyBEb2Vzbid0IHRha2Ugbm9uLXByaW50aW5nIGNoYXJzIGludG8gYWNjb3VudCwgYnV0IGRvZXMgdW5kZXJzdGFuZCBcbi4KK2RlZiBleHBhbmR0YWJzKHMsIHRhYnNpemU9OCk6CisgICAgIiIiZXhwYW5kdGFicyhzIFssdGFic2l6ZV0pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgd2l0aCBhbGwgdGFiIGNoYXJhY3RlcnMgcmVwbGFjZWQKKyAgICBieSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIHNwYWNlcywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50CisgICAgY29sdW1uLCBhbmQgdGhlIHRhYnNpemUgKGRlZmF1bHQgOCkuCisKKyAgICAiIiIKKyAgICByZXMgPSBsaW5lID0gJycKKyAgICBmb3IgYyBpbiBzOgorICAgICAgICBpZiBjID09ICdcdCc6CisgICAgICAgICAgICBjID0gJyAnKih0YWJzaXplIC0gbGVuKGxpbmUpICUgdGFic2l6ZSkKKyAgICAgICAgbGluZSA9IGxpbmUgKyBjCisgICAgICAgIGlmIGMgPT0gJ1xuJzoKKyAgICAgICAgICAgIHJlcyA9IHJlcyArIGxpbmUKKyAgICAgICAgICAgIGxpbmUgPSAnJworICAgIHJldHVybiByZXMgKyBsaW5lCisKKyMgQ2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRocm91Z2ggbG9vay11cCB0YWJsZS4KK2RlZiB0cmFuc2xhdGUocywgdGFibGUsIGRlbGV0aW9ucz0iIik6CisgICAgIiIidHJhbnNsYXRlKHMsdGFibGUgWyxkZWxldGVjaGFyc10pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMsIHdoZXJlIGFsbCBjaGFyYWN0ZXJzIG9jY3VycmluZworICAgIGluIHRoZSBvcHRpb25hbCBhcmd1bWVudCBkZWxldGVjaGFycyBhcmUgcmVtb3ZlZCwgYW5kIHRoZQorICAgIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBtYXBwZWQgdGhyb3VnaCB0aGUgZ2l2ZW4KKyAgICB0cmFuc2xhdGlvbiB0YWJsZSwgd2hpY2ggbXVzdCBiZSBhIHN0cmluZyBvZiBsZW5ndGggMjU2LgorCisgICAgIiIiCisgICAgcmV0dXJuIHMudHJhbnNsYXRlKHRhYmxlLCBkZWxldGlvbnMpCisKKyMgQ2FwaXRhbGl6ZSBhIHN0cmluZywgZS5nLiAiYUJjICBkRWYiIC0+ICJBYmMgIGRlZiIuCitkZWYgY2FwaXRhbGl6ZShzKToKKyAgICAiIiJjYXBpdGFsaXplKHMpIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgd2l0aCBvbmx5IGl0cyBmaXJzdCBjaGFyYWN0ZXIKKyAgICBjYXBpdGFsaXplZC4KKworICAgICIiIgorICAgIHJldHVybiBzLmNhcGl0YWxpemUoKQorCisjIENhcGl0YWxpemUgdGhlIHdvcmRzIGluIGEgc3RyaW5nLCBlLmcuICIgYUJjICBkRWYgIiAtPiAiQWJjIERlZiIuCitkZWYgY2Fwd29yZHMocywgc2VwPU5vbmUpOgorICAgICIiImNhcHdvcmRzKHMsIFtzZXBdKSAtPiBzdHJpbmcKKworICAgIFNwbGl0IHRoZSBhcmd1bWVudCBpbnRvIHdvcmRzIHVzaW5nIHNwbGl0LCBjYXBpdGFsaXplIGVhY2gKKyAgICB3b3JkIHVzaW5nIGNhcGl0YWxpemUsIGFuZCBqb2luIHRoZSBjYXBpdGFsaXplZCB3b3JkcyB1c2luZworICAgIGpvaW4uIE5vdGUgdGhhdCB0aGlzIHJlcGxhY2VzIHJ1bnMgb2Ygd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGJ5CisgICAgYSBzaW5nbGUgc3BhY2UuCisKKyAgICAiIiIKKyAgICByZXR1cm4gam9pbihtYXAoY2FwaXRhbGl6ZSwgcy5zcGxpdChzZXApKSwgc2VwIG9yICcgJykKKworIyBDb25zdHJ1Y3QgYSB0cmFuc2xhdGlvbiBzdHJpbmcKK19pZG1hcEwgPSBOb25lCitkZWYgbWFrZXRyYW5zKGZyb21zdHIsIHRvc3RyKToKKyAgICAiIiJtYWtldHJhbnMoZnJtLCB0bykgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSB0cmFuc2xhdGlvbiB0YWJsZSAoYSBzdHJpbmcgb2YgMjU2IGJ5dGVzIGxvbmcpCisgICAgc3VpdGFibGUgZm9yIHVzZSBpbiBzdHJpbmcudHJhbnNsYXRlLiAgVGhlIHN0cmluZ3MgZnJtIGFuZCB0bworICAgIG11c3QgYmUgb2YgdGhlIHNhbWUgbGVuZ3RoLgorCisgICAgIiIiCisgICAgaWYgbGVuKGZyb21zdHIpICE9IGxlbih0b3N0cik6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtYWtldHJhbnMgYXJndW1lbnRzIG11c3QgaGF2ZSBzYW1lIGxlbmd0aCIKKyAgICBnbG9iYWwgX2lkbWFwTAorICAgIGlmIG5vdCBfaWRtYXBMOgorICAgICAgICBfaWRtYXBMID0gbGlzdChfaWRtYXApCisgICAgTCA9IF9pZG1hcExbOl0KKyAgICBmcm9tc3RyID0gbWFwKG9yZCwgZnJvbXN0cikKKyAgICBmb3IgaSBpbiByYW5nZShsZW4oZnJvbXN0cikpOgorICAgICAgICBMW2Zyb21zdHJbaV1dID0gdG9zdHJbaV0KKyAgICByZXR1cm4gam9pbihMLCAiIikKKworIyBTdWJzdHJpbmcgcmVwbGFjZW1lbnQgKGdsb2JhbCkKK2RlZiByZXBsYWNlKHMsIG9sZCwgbmV3LCBtYXhzcGxpdD0wKToKKyAgICAiIiJyZXBsYWNlIChzdHIsIG9sZCwgbmV3WywgbWF4c3BsaXRdKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2Ygc3RyaW5nIHN0ciB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcKKyAgICBvbGQgcmVwbGFjZWQgYnkgbmV3LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgbWF4c3BsaXQgaXMKKyAgICBnaXZlbiwgb25seSB0aGUgZmlyc3QgbWF4c3BsaXQgb2NjdXJyZW5jZXMgYXJlIHJlcGxhY2VkLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMucmVwbGFjZShvbGQsIG5ldywgbWF4c3BsaXQpCisKKworIyBYWFg6IHRyYW5zaXRpb25hbAorIworIyBJZiBzdHJpbmcgb2JqZWN0cyBkbyBub3QgaGF2ZSBtZXRob2RzLCB0aGVuIHdlIG5lZWQgdG8gdXNlIHRoZSBvbGQgc3RyaW5nLnB5CisjIGxpYnJhcnksIHdoaWNoIHVzZXMgc3Ryb3AgZm9yIG1hbnkgbW9yZSB0aGluZ3MgdGhhbiBqdXN0IHRoZSBmZXcgb3V0bGluZWQKKyMgYmVsb3cuCit0cnk6CisgICAgJycudXBwZXIKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICBmcm9tIHN0cmluZ29sZCBpbXBvcnQgKgorCisjIFRyeSBpbXBvcnRpbmcgb3B0aW9uYWwgYnVpbHQtaW4gbW9kdWxlICJzdHJvcCIgLS0gaWYgaXQgZXhpc3RzLAorIyBpdCByZWRlZmluZXMgc29tZSBzdHJpbmcgb3BlcmF0aW9ucyB0aGF0IGFyZSAxMDAtMTAwMCB0aW1lcyBmYXN0ZXIuCisjIEl0IGFsc28gZGVmaW5lcyB2YWx1ZXMgZm9yIHdoaXRlc3BhY2UsIGxvd2VyY2FzZSBhbmQgdXBwZXJjYXNlCisjIHRoYXQgbWF0Y2ggPGN0eXBlLmg+J3MgZGVmaW5pdGlvbnMuCisKK3RyeToKKyAgICBmcm9tIHN0cm9wIGltcG9ydCBtYWtldHJhbnMsIGxvd2VyY2FzZSwgdXBwZXJjYXNlLCB3aGl0ZXNwYWNlCisgICAgbGV0dGVycyA9IGxvd2VyY2FzZSArIHVwcGVyY2FzZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzZSB0aGUgb3JpZ2luYWwgdmVyc2lvbnMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RyaW5nb2xkLnB5YyBiL2xpYi9weXRob24yLjcvc3RyaW5nb2xkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjUzYmRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdHJpbmdvbGQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RyaW5nb2xkLnB5byBiL2xpYi9weXRob24yLjcvc3RyaW5nb2xkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjUzYmRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdHJpbmdvbGQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RyaW5ncHJlcC5weSBiL2xpYi9weXRob24yLjcvc3RyaW5ncHJlcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQ5ZGQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdHJpbmdwcmVwLnB5CkBAIC0wLDAgKzEsMjcyIEBACisjIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgbWtzdHJpbmdwcmVwLnB5LiBETyBOT1QgRURJVC4KKyIiIkxpYnJhcnkgdGhhdCBleHBvc2VzIHZhcmlvdXMgdGFibGVzIGZvdW5kIGluIHRoZSBTdHJpbmdQcmVwIFJGQyAzNDU0LgorCitUaGVyZSBhcmUgdHdvIGtpbmRzIG9mIHRhYmxlczogc2V0cywgZm9yIHdoaWNoIGEgbWVtYmVyIHRlc3QgaXMgcHJvdmlkZWQsCithbmQgbWFwcGluZ3MsIGZvciB3aGljaCBhIG1hcHBpbmcgZnVuY3Rpb24gaXMgcHJvdmlkZWQuCisiIiIKKworZnJvbSB1bmljb2RlZGF0YSBpbXBvcnQgdWNkXzNfMl8wIGFzIHVuaWNvZGVkYXRhCisKK2Fzc2VydCB1bmljb2RlZGF0YS51bmlkYXRhX3ZlcnNpb24gPT0gJzMuMi4wJworCitkZWYgaW5fdGFibGVfYTEoY29kZSk6CisgICAgaWYgdW5pY29kZWRhdGEuY2F0ZWdvcnkoY29kZSkgIT0gJ0NuJzogcmV0dXJuIEZhbHNlCisgICAgYyA9IG9yZChjb2RlKQorICAgIGlmIDB4RkREMCA8PSBjIDwgMHhGREYwOiByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gKGMgJiAweEZGRkYpIG5vdCBpbiAoMHhGRkZFLCAweEZGRkYpCisKKworYjFfc2V0ID0gc2V0KFsxNzMsIDg0NywgNjE1MCwgNjE1NSwgNjE1NiwgNjE1NywgODIwMywgODIwNCwgODIwNSwgODI4OCwgNjUyNzldICsgcmFuZ2UoNjUwMjQsNjUwNDApKQorZGVmIGluX3RhYmxlX2IxKGNvZGUpOgorICAgIHJldHVybiBvcmQoY29kZSkgaW4gYjFfc2V0CisKKworYjNfZXhjZXB0aW9ucyA9IHsKKzB4YjU6dSdcdTAzYmMnLCAweGRmOnUnc3MnLCAweDEzMDp1J2lcdTAzMDcnLCAweDE0OTp1J1x1MDJiY24nLAorMHgxN2Y6dSdzJywgMHgxZjA6dSdqXHUwMzBjJywgMHgzNDU6dSdcdTAzYjknLCAweDM3YTp1JyBcdTAzYjknLAorMHgzOTA6dSdcdTAzYjlcdTAzMDhcdTAzMDEnLCAweDNiMDp1J1x1MDNjNVx1MDMwOFx1MDMwMScsIDB4M2MyOnUnXHUwM2MzJywgMHgzZDA6dSdcdTAzYjInLAorMHgzZDE6dSdcdTAzYjgnLCAweDNkMjp1J1x1MDNjNScsIDB4M2QzOnUnXHUwM2NkJywgMHgzZDQ6dSdcdTAzY2InLAorMHgzZDU6dSdcdTAzYzYnLCAweDNkNjp1J1x1MDNjMCcsIDB4M2YwOnUnXHUwM2JhJywgMHgzZjE6dSdcdTAzYzEnLAorMHgzZjI6dSdcdTAzYzMnLCAweDNmNTp1J1x1MDNiNScsIDB4NTg3OnUnXHUwNTY1XHUwNTgyJywgMHgxZTk2OnUnaFx1MDMzMScsCisweDFlOTc6dSd0XHUwMzA4JywgMHgxZTk4OnUnd1x1MDMwYScsIDB4MWU5OTp1J3lcdTAzMGEnLCAweDFlOWE6dSdhXHUwMmJlJywKKzB4MWU5Yjp1J1x1MWU2MScsIDB4MWY1MDp1J1x1MDNjNVx1MDMxMycsIDB4MWY1Mjp1J1x1MDNjNVx1MDMxM1x1MDMwMCcsIDB4MWY1NDp1J1x1MDNjNVx1MDMxM1x1MDMwMScsCisweDFmNTY6dSdcdTAzYzVcdTAzMTNcdTAzNDInLCAweDFmODA6dSdcdTFmMDBcdTAzYjknLCAweDFmODE6dSdcdTFmMDFcdTAzYjknLCAweDFmODI6dSdcdTFmMDJcdTAzYjknLAorMHgxZjgzOnUnXHUxZjAzXHUwM2I5JywgMHgxZjg0OnUnXHUxZjA0XHUwM2I5JywgMHgxZjg1OnUnXHUxZjA1XHUwM2I5JywgMHgxZjg2OnUnXHUxZjA2XHUwM2I5JywKKzB4MWY4Nzp1J1x1MWYwN1x1MDNiOScsIDB4MWY4ODp1J1x1MWYwMFx1MDNiOScsIDB4MWY4OTp1J1x1MWYwMVx1MDNiOScsIDB4MWY4YTp1J1x1MWYwMlx1MDNiOScsCisweDFmOGI6dSdcdTFmMDNcdTAzYjknLCAweDFmOGM6dSdcdTFmMDRcdTAzYjknLCAweDFmOGQ6dSdcdTFmMDVcdTAzYjknLCAweDFmOGU6dSdcdTFmMDZcdTAzYjknLAorMHgxZjhmOnUnXHUxZjA3XHUwM2I5JywgMHgxZjkwOnUnXHUxZjIwXHUwM2I5JywgMHgxZjkxOnUnXHUxZjIxXHUwM2I5JywgMHgxZjkyOnUnXHUxZjIyXHUwM2I5JywKKzB4MWY5Mzp1J1x1MWYyM1x1MDNiOScsIDB4MWY5NDp1J1x1MWYyNFx1MDNiOScsIDB4MWY5NTp1J1x1MWYyNVx1MDNiOScsIDB4MWY5Njp1J1x1MWYyNlx1MDNiOScsCisweDFmOTc6dSdcdTFmMjdcdTAzYjknLCAweDFmOTg6dSdcdTFmMjBcdTAzYjknLCAweDFmOTk6dSdcdTFmMjFcdTAzYjknLCAweDFmOWE6dSdcdTFmMjJcdTAzYjknLAorMHgxZjliOnUnXHUxZjIzXHUwM2I5JywgMHgxZjljOnUnXHUxZjI0XHUwM2I5JywgMHgxZjlkOnUnXHUxZjI1XHUwM2I5JywgMHgxZjllOnUnXHUxZjI2XHUwM2I5JywKKzB4MWY5Zjp1J1x1MWYyN1x1MDNiOScsIDB4MWZhMDp1J1x1MWY2MFx1MDNiOScsIDB4MWZhMTp1J1x1MWY2MVx1MDNiOScsIDB4MWZhMjp1J1x1MWY2Mlx1MDNiOScsCisweDFmYTM6dSdcdTFmNjNcdTAzYjknLCAweDFmYTQ6dSdcdTFmNjRcdTAzYjknLCAweDFmYTU6dSdcdTFmNjVcdTAzYjknLCAweDFmYTY6dSdcdTFmNjZcdTAzYjknLAorMHgxZmE3OnUnXHUxZjY3XHUwM2I5JywgMHgxZmE4OnUnXHUxZjYwXHUwM2I5JywgMHgxZmE5OnUnXHUxZjYxXHUwM2I5JywgMHgxZmFhOnUnXHUxZjYyXHUwM2I5JywKKzB4MWZhYjp1J1x1MWY2M1x1MDNiOScsIDB4MWZhYzp1J1x1MWY2NFx1MDNiOScsIDB4MWZhZDp1J1x1MWY2NVx1MDNiOScsIDB4MWZhZTp1J1x1MWY2Nlx1MDNiOScsCisweDFmYWY6dSdcdTFmNjdcdTAzYjknLCAweDFmYjI6dSdcdTFmNzBcdTAzYjknLCAweDFmYjM6dSdcdTAzYjFcdTAzYjknLCAweDFmYjQ6dSdcdTAzYWNcdTAzYjknLAorMHgxZmI2OnUnXHUwM2IxXHUwMzQyJywgMHgxZmI3OnUnXHUwM2IxXHUwMzQyXHUwM2I5JywgMHgxZmJjOnUnXHUwM2IxXHUwM2I5JywgMHgxZmJlOnUnXHUwM2I5JywKKzB4MWZjMjp1J1x1MWY3NFx1MDNiOScsIDB4MWZjMzp1J1x1MDNiN1x1MDNiOScsIDB4MWZjNDp1J1x1MDNhZVx1MDNiOScsIDB4MWZjNjp1J1x1MDNiN1x1MDM0MicsCisweDFmYzc6dSdcdTAzYjdcdTAzNDJcdTAzYjknLCAweDFmY2M6dSdcdTAzYjdcdTAzYjknLCAweDFmZDI6dSdcdTAzYjlcdTAzMDhcdTAzMDAnLCAweDFmZDM6dSdcdTAzYjlcdTAzMDhcdTAzMDEnLAorMHgxZmQ2OnUnXHUwM2I5XHUwMzQyJywgMHgxZmQ3OnUnXHUwM2I5XHUwMzA4XHUwMzQyJywgMHgxZmUyOnUnXHUwM2M1XHUwMzA4XHUwMzAwJywgMHgxZmUzOnUnXHUwM2M1XHUwMzA4XHUwMzAxJywKKzB4MWZlNDp1J1x1MDNjMVx1MDMxMycsIDB4MWZlNjp1J1x1MDNjNVx1MDM0MicsIDB4MWZlNzp1J1x1MDNjNVx1MDMwOFx1MDM0MicsIDB4MWZmMjp1J1x1MWY3Y1x1MDNiOScsCisweDFmZjM6dSdcdTAzYzlcdTAzYjknLCAweDFmZjQ6dSdcdTAzY2VcdTAzYjknLCAweDFmZjY6dSdcdTAzYzlcdTAzNDInLCAweDFmZjc6dSdcdTAzYzlcdTAzNDJcdTAzYjknLAorMHgxZmZjOnUnXHUwM2M5XHUwM2I5JywgMHgyMGE4OnUncnMnLCAweDIxMDI6dSdjJywgMHgyMTAzOnUnXHhiMGMnLAorMHgyMTA3OnUnXHUwMjViJywgMHgyMTA5OnUnXHhiMGYnLCAweDIxMGI6dSdoJywgMHgyMTBjOnUnaCcsCisweDIxMGQ6dSdoJywgMHgyMTEwOnUnaScsIDB4MjExMTp1J2knLCAweDIxMTI6dSdsJywKKzB4MjExNTp1J24nLCAweDIxMTY6dSdubycsIDB4MjExOTp1J3AnLCAweDIxMWE6dSdxJywKKzB4MjExYjp1J3InLCAweDIxMWM6dSdyJywgMHgyMTFkOnUncicsIDB4MjEyMDp1J3NtJywKKzB4MjEyMTp1J3RlbCcsIDB4MjEyMjp1J3RtJywgMHgyMTI0OnUneicsIDB4MjEyODp1J3onLAorMHgyMTJjOnUnYicsIDB4MjEyZDp1J2MnLCAweDIxMzA6dSdlJywgMHgyMTMxOnUnZicsCisweDIxMzM6dSdtJywgMHgyMTNlOnUnXHUwM2IzJywgMHgyMTNmOnUnXHUwM2MwJywgMHgyMTQ1OnUnZCcsCisweDMzNzE6dSdocGEnLCAweDMzNzM6dSdhdScsIDB4MzM3NTp1J292JywgMHgzMzgwOnUncGEnLAorMHgzMzgxOnUnbmEnLCAweDMzODI6dSdcdTAzYmNhJywgMHgzMzgzOnUnbWEnLCAweDMzODQ6dSdrYScsCisweDMzODU6dSdrYicsIDB4MzM4Njp1J21iJywgMHgzMzg3OnUnZ2InLCAweDMzOGE6dSdwZicsCisweDMzOGI6dSduZicsIDB4MzM4Yzp1J1x1MDNiY2YnLCAweDMzOTA6dSdoeicsIDB4MzM5MTp1J2toeicsCisweDMzOTI6dSdtaHonLCAweDMzOTM6dSdnaHonLCAweDMzOTQ6dSd0aHonLCAweDMzYTk6dSdwYScsCisweDMzYWE6dSdrcGEnLCAweDMzYWI6dSdtcGEnLCAweDMzYWM6dSdncGEnLCAweDMzYjQ6dSdwdicsCisweDMzYjU6dSdudicsIDB4MzNiNjp1J1x1MDNiY3YnLCAweDMzYjc6dSdtdicsIDB4MzNiODp1J2t2JywKKzB4MzNiOTp1J212JywgMHgzM2JhOnUncHcnLCAweDMzYmI6dSdudycsIDB4MzNiYzp1J1x1MDNiY3cnLAorMHgzM2JkOnUnbXcnLCAweDMzYmU6dSdrdycsIDB4MzNiZjp1J213JywgMHgzM2MwOnUna1x1MDNjOScsCisweDMzYzE6dSdtXHUwM2M5JywgMHgzM2MzOnUnYnEnLCAweDMzYzY6dSdjXHUyMjE1a2cnLCAweDMzYzc6dSdjby4nLAorMHgzM2M4OnUnZGInLCAweDMzYzk6dSdneScsIDB4MzNjYjp1J2hwJywgMHgzM2NkOnUna2snLAorMHgzM2NlOnUna20nLCAweDMzZDc6dSdwaCcsIDB4MzNkOTp1J3BwbScsIDB4MzNkYTp1J3ByJywKKzB4MzNkYzp1J3N2JywgMHgzM2RkOnUnd2InLCAweGZiMDA6dSdmZicsIDB4ZmIwMTp1J2ZpJywKKzB4ZmIwMjp1J2ZsJywgMHhmYjAzOnUnZmZpJywgMHhmYjA0OnUnZmZsJywgMHhmYjA1OnUnc3QnLAorMHhmYjA2OnUnc3QnLCAweGZiMTM6dSdcdTA1NzRcdTA1NzYnLCAweGZiMTQ6dSdcdTA1NzRcdTA1NjUnLCAweGZiMTU6dSdcdTA1NzRcdTA1NmInLAorMHhmYjE2OnUnXHUwNTdlXHUwNTc2JywgMHhmYjE3OnUnXHUwNTc0XHUwNTZkJywgMHgxZDQwMDp1J2EnLCAweDFkNDAxOnUnYicsCisweDFkNDAyOnUnYycsIDB4MWQ0MDM6dSdkJywgMHgxZDQwNDp1J2UnLCAweDFkNDA1OnUnZicsCisweDFkNDA2OnUnZycsIDB4MWQ0MDc6dSdoJywgMHgxZDQwODp1J2knLCAweDFkNDA5OnUnaicsCisweDFkNDBhOnUnaycsIDB4MWQ0MGI6dSdsJywgMHgxZDQwYzp1J20nLCAweDFkNDBkOnUnbicsCisweDFkNDBlOnUnbycsIDB4MWQ0MGY6dSdwJywgMHgxZDQxMDp1J3EnLCAweDFkNDExOnUncicsCisweDFkNDEyOnUncycsIDB4MWQ0MTM6dSd0JywgMHgxZDQxNDp1J3UnLCAweDFkNDE1OnUndicsCisweDFkNDE2OnUndycsIDB4MWQ0MTc6dSd4JywgMHgxZDQxODp1J3knLCAweDFkNDE5OnUneicsCisweDFkNDM0OnUnYScsIDB4MWQ0MzU6dSdiJywgMHgxZDQzNjp1J2MnLCAweDFkNDM3OnUnZCcsCisweDFkNDM4OnUnZScsIDB4MWQ0Mzk6dSdmJywgMHgxZDQzYTp1J2cnLCAweDFkNDNiOnUnaCcsCisweDFkNDNjOnUnaScsIDB4MWQ0M2Q6dSdqJywgMHgxZDQzZTp1J2snLCAweDFkNDNmOnUnbCcsCisweDFkNDQwOnUnbScsIDB4MWQ0NDE6dSduJywgMHgxZDQ0Mjp1J28nLCAweDFkNDQzOnUncCcsCisweDFkNDQ0OnUncScsIDB4MWQ0NDU6dSdyJywgMHgxZDQ0Njp1J3MnLCAweDFkNDQ3OnUndCcsCisweDFkNDQ4OnUndScsIDB4MWQ0NDk6dSd2JywgMHgxZDQ0YTp1J3cnLCAweDFkNDRiOnUneCcsCisweDFkNDRjOnUneScsIDB4MWQ0NGQ6dSd6JywgMHgxZDQ2ODp1J2EnLCAweDFkNDY5OnUnYicsCisweDFkNDZhOnUnYycsIDB4MWQ0NmI6dSdkJywgMHgxZDQ2Yzp1J2UnLCAweDFkNDZkOnUnZicsCisweDFkNDZlOnUnZycsIDB4MWQ0NmY6dSdoJywgMHgxZDQ3MDp1J2knLCAweDFkNDcxOnUnaicsCisweDFkNDcyOnUnaycsIDB4MWQ0NzM6dSdsJywgMHgxZDQ3NDp1J20nLCAweDFkNDc1OnUnbicsCisweDFkNDc2OnUnbycsIDB4MWQ0Nzc6dSdwJywgMHgxZDQ3ODp1J3EnLCAweDFkNDc5OnUncicsCisweDFkNDdhOnUncycsIDB4MWQ0N2I6dSd0JywgMHgxZDQ3Yzp1J3UnLCAweDFkNDdkOnUndicsCisweDFkNDdlOnUndycsIDB4MWQ0N2Y6dSd4JywgMHgxZDQ4MDp1J3knLCAweDFkNDgxOnUneicsCisweDFkNDljOnUnYScsIDB4MWQ0OWU6dSdjJywgMHgxZDQ5Zjp1J2QnLCAweDFkNGEyOnUnZycsCisweDFkNGE1OnUnaicsIDB4MWQ0YTY6dSdrJywgMHgxZDRhOTp1J24nLCAweDFkNGFhOnUnbycsCisweDFkNGFiOnUncCcsIDB4MWQ0YWM6dSdxJywgMHgxZDRhZTp1J3MnLCAweDFkNGFmOnUndCcsCisweDFkNGIwOnUndScsIDB4MWQ0YjE6dSd2JywgMHgxZDRiMjp1J3cnLCAweDFkNGIzOnUneCcsCisweDFkNGI0OnUneScsIDB4MWQ0YjU6dSd6JywgMHgxZDRkMDp1J2EnLCAweDFkNGQxOnUnYicsCisweDFkNGQyOnUnYycsIDB4MWQ0ZDM6dSdkJywgMHgxZDRkNDp1J2UnLCAweDFkNGQ1OnUnZicsCisweDFkNGQ2OnUnZycsIDB4MWQ0ZDc6dSdoJywgMHgxZDRkODp1J2knLCAweDFkNGQ5OnUnaicsCisweDFkNGRhOnUnaycsIDB4MWQ0ZGI6dSdsJywgMHgxZDRkYzp1J20nLCAweDFkNGRkOnUnbicsCisweDFkNGRlOnUnbycsIDB4MWQ0ZGY6dSdwJywgMHgxZDRlMDp1J3EnLCAweDFkNGUxOnUncicsCisweDFkNGUyOnUncycsIDB4MWQ0ZTM6dSd0JywgMHgxZDRlNDp1J3UnLCAweDFkNGU1OnUndicsCisweDFkNGU2OnUndycsIDB4MWQ0ZTc6dSd4JywgMHgxZDRlODp1J3knLCAweDFkNGU5OnUneicsCisweDFkNTA0OnUnYScsIDB4MWQ1MDU6dSdiJywgMHgxZDUwNzp1J2QnLCAweDFkNTA4OnUnZScsCisweDFkNTA5OnUnZicsIDB4MWQ1MGE6dSdnJywgMHgxZDUwZDp1J2onLCAweDFkNTBlOnUnaycsCisweDFkNTBmOnUnbCcsIDB4MWQ1MTA6dSdtJywgMHgxZDUxMTp1J24nLCAweDFkNTEyOnUnbycsCisweDFkNTEzOnUncCcsIDB4MWQ1MTQ6dSdxJywgMHgxZDUxNjp1J3MnLCAweDFkNTE3OnUndCcsCisweDFkNTE4OnUndScsIDB4MWQ1MTk6dSd2JywgMHgxZDUxYTp1J3cnLCAweDFkNTFiOnUneCcsCisweDFkNTFjOnUneScsIDB4MWQ1Mzg6dSdhJywgMHgxZDUzOTp1J2InLCAweDFkNTNiOnUnZCcsCisweDFkNTNjOnUnZScsIDB4MWQ1M2Q6dSdmJywgMHgxZDUzZTp1J2cnLCAweDFkNTQwOnUnaScsCisweDFkNTQxOnUnaicsIDB4MWQ1NDI6dSdrJywgMHgxZDU0Mzp1J2wnLCAweDFkNTQ0OnUnbScsCisweDFkNTQ2OnUnbycsIDB4MWQ1NGE6dSdzJywgMHgxZDU0Yjp1J3QnLCAweDFkNTRjOnUndScsCisweDFkNTRkOnUndicsIDB4MWQ1NGU6dSd3JywgMHgxZDU0Zjp1J3gnLCAweDFkNTUwOnUneScsCisweDFkNTZjOnUnYScsIDB4MWQ1NmQ6dSdiJywgMHgxZDU2ZTp1J2MnLCAweDFkNTZmOnUnZCcsCisweDFkNTcwOnUnZScsIDB4MWQ1NzE6dSdmJywgMHgxZDU3Mjp1J2cnLCAweDFkNTczOnUnaCcsCisweDFkNTc0OnUnaScsIDB4MWQ1NzU6dSdqJywgMHgxZDU3Njp1J2snLCAweDFkNTc3OnUnbCcsCisweDFkNTc4OnUnbScsIDB4MWQ1Nzk6dSduJywgMHgxZDU3YTp1J28nLCAweDFkNTdiOnUncCcsCisweDFkNTdjOnUncScsIDB4MWQ1N2Q6dSdyJywgMHgxZDU3ZTp1J3MnLCAweDFkNTdmOnUndCcsCisweDFkNTgwOnUndScsIDB4MWQ1ODE6dSd2JywgMHgxZDU4Mjp1J3cnLCAweDFkNTgzOnUneCcsCisweDFkNTg0OnUneScsIDB4MWQ1ODU6dSd6JywgMHgxZDVhMDp1J2EnLCAweDFkNWExOnUnYicsCisweDFkNWEyOnUnYycsIDB4MWQ1YTM6dSdkJywgMHgxZDVhNDp1J2UnLCAweDFkNWE1OnUnZicsCisweDFkNWE2OnUnZycsIDB4MWQ1YTc6dSdoJywgMHgxZDVhODp1J2knLCAweDFkNWE5OnUnaicsCisweDFkNWFhOnUnaycsIDB4MWQ1YWI6dSdsJywgMHgxZDVhYzp1J20nLCAweDFkNWFkOnUnbicsCisweDFkNWFlOnUnbycsIDB4MWQ1YWY6dSdwJywgMHgxZDViMDp1J3EnLCAweDFkNWIxOnUncicsCisweDFkNWIyOnUncycsIDB4MWQ1YjM6dSd0JywgMHgxZDViNDp1J3UnLCAweDFkNWI1OnUndicsCisweDFkNWI2OnUndycsIDB4MWQ1Yjc6dSd4JywgMHgxZDViODp1J3knLCAweDFkNWI5OnUneicsCisweDFkNWQ0OnUnYScsIDB4MWQ1ZDU6dSdiJywgMHgxZDVkNjp1J2MnLCAweDFkNWQ3OnUnZCcsCisweDFkNWQ4OnUnZScsIDB4MWQ1ZDk6dSdmJywgMHgxZDVkYTp1J2cnLCAweDFkNWRiOnUnaCcsCisweDFkNWRjOnUnaScsIDB4MWQ1ZGQ6dSdqJywgMHgxZDVkZTp1J2snLCAweDFkNWRmOnUnbCcsCisweDFkNWUwOnUnbScsIDB4MWQ1ZTE6dSduJywgMHgxZDVlMjp1J28nLCAweDFkNWUzOnUncCcsCisweDFkNWU0OnUncScsIDB4MWQ1ZTU6dSdyJywgMHgxZDVlNjp1J3MnLCAweDFkNWU3OnUndCcsCisweDFkNWU4OnUndScsIDB4MWQ1ZTk6dSd2JywgMHgxZDVlYTp1J3cnLCAweDFkNWViOnUneCcsCisweDFkNWVjOnUneScsIDB4MWQ1ZWQ6dSd6JywgMHgxZDYwODp1J2EnLCAweDFkNjA5OnUnYicsCisweDFkNjBhOnUnYycsIDB4MWQ2MGI6dSdkJywgMHgxZDYwYzp1J2UnLCAweDFkNjBkOnUnZicsCisweDFkNjBlOnUnZycsIDB4MWQ2MGY6dSdoJywgMHgxZDYxMDp1J2knLCAweDFkNjExOnUnaicsCisweDFkNjEyOnUnaycsIDB4MWQ2MTM6dSdsJywgMHgxZDYxNDp1J20nLCAweDFkNjE1OnUnbicsCisweDFkNjE2OnUnbycsIDB4MWQ2MTc6dSdwJywgMHgxZDYxODp1J3EnLCAweDFkNjE5OnUncicsCisweDFkNjFhOnUncycsIDB4MWQ2MWI6dSd0JywgMHgxZDYxYzp1J3UnLCAweDFkNjFkOnUndicsCisweDFkNjFlOnUndycsIDB4MWQ2MWY6dSd4JywgMHgxZDYyMDp1J3knLCAweDFkNjIxOnUneicsCisweDFkNjNjOnUnYScsIDB4MWQ2M2Q6dSdiJywgMHgxZDYzZTp1J2MnLCAweDFkNjNmOnUnZCcsCisweDFkNjQwOnUnZScsIDB4MWQ2NDE6dSdmJywgMHgxZDY0Mjp1J2cnLCAweDFkNjQzOnUnaCcsCisweDFkNjQ0OnUnaScsIDB4MWQ2NDU6dSdqJywgMHgxZDY0Njp1J2snLCAweDFkNjQ3OnUnbCcsCisweDFkNjQ4OnUnbScsIDB4MWQ2NDk6dSduJywgMHgxZDY0YTp1J28nLCAweDFkNjRiOnUncCcsCisweDFkNjRjOnUncScsIDB4MWQ2NGQ6dSdyJywgMHgxZDY0ZTp1J3MnLCAweDFkNjRmOnUndCcsCisweDFkNjUwOnUndScsIDB4MWQ2NTE6dSd2JywgMHgxZDY1Mjp1J3cnLCAweDFkNjUzOnUneCcsCisweDFkNjU0OnUneScsIDB4MWQ2NTU6dSd6JywgMHgxZDY3MDp1J2EnLCAweDFkNjcxOnUnYicsCisweDFkNjcyOnUnYycsIDB4MWQ2NzM6dSdkJywgMHgxZDY3NDp1J2UnLCAweDFkNjc1OnUnZicsCisweDFkNjc2OnUnZycsIDB4MWQ2Nzc6dSdoJywgMHgxZDY3ODp1J2knLCAweDFkNjc5OnUnaicsCisweDFkNjdhOnUnaycsIDB4MWQ2N2I6dSdsJywgMHgxZDY3Yzp1J20nLCAweDFkNjdkOnUnbicsCisweDFkNjdlOnUnbycsIDB4MWQ2N2Y6dSdwJywgMHgxZDY4MDp1J3EnLCAweDFkNjgxOnUncicsCisweDFkNjgyOnUncycsIDB4MWQ2ODM6dSd0JywgMHgxZDY4NDp1J3UnLCAweDFkNjg1OnUndicsCisweDFkNjg2OnUndycsIDB4MWQ2ODc6dSd4JywgMHgxZDY4ODp1J3knLCAweDFkNjg5OnUneicsCisweDFkNmE4OnUnXHUwM2IxJywgMHgxZDZhOTp1J1x1MDNiMicsIDB4MWQ2YWE6dSdcdTAzYjMnLCAweDFkNmFiOnUnXHUwM2I0JywKKzB4MWQ2YWM6dSdcdTAzYjUnLCAweDFkNmFkOnUnXHUwM2I2JywgMHgxZDZhZTp1J1x1MDNiNycsIDB4MWQ2YWY6dSdcdTAzYjgnLAorMHgxZDZiMDp1J1x1MDNiOScsIDB4MWQ2YjE6dSdcdTAzYmEnLCAweDFkNmIyOnUnXHUwM2JiJywgMHgxZDZiMzp1J1x1MDNiYycsCisweDFkNmI0OnUnXHUwM2JkJywgMHgxZDZiNTp1J1x1MDNiZScsIDB4MWQ2YjY6dSdcdTAzYmYnLCAweDFkNmI3OnUnXHUwM2MwJywKKzB4MWQ2Yjg6dSdcdTAzYzEnLCAweDFkNmI5OnUnXHUwM2I4JywgMHgxZDZiYTp1J1x1MDNjMycsIDB4MWQ2YmI6dSdcdTAzYzQnLAorMHgxZDZiYzp1J1x1MDNjNScsIDB4MWQ2YmQ6dSdcdTAzYzYnLCAweDFkNmJlOnUnXHUwM2M3JywgMHgxZDZiZjp1J1x1MDNjOCcsCisweDFkNmMwOnUnXHUwM2M5JywgMHgxZDZkMzp1J1x1MDNjMycsIDB4MWQ2ZTI6dSdcdTAzYjEnLCAweDFkNmUzOnUnXHUwM2IyJywKKzB4MWQ2ZTQ6dSdcdTAzYjMnLCAweDFkNmU1OnUnXHUwM2I0JywgMHgxZDZlNjp1J1x1MDNiNScsIDB4MWQ2ZTc6dSdcdTAzYjYnLAorMHgxZDZlODp1J1x1MDNiNycsIDB4MWQ2ZTk6dSdcdTAzYjgnLCAweDFkNmVhOnUnXHUwM2I5JywgMHgxZDZlYjp1J1x1MDNiYScsCisweDFkNmVjOnUnXHUwM2JiJywgMHgxZDZlZDp1J1x1MDNiYycsIDB4MWQ2ZWU6dSdcdTAzYmQnLCAweDFkNmVmOnUnXHUwM2JlJywKKzB4MWQ2ZjA6dSdcdTAzYmYnLCAweDFkNmYxOnUnXHUwM2MwJywgMHgxZDZmMjp1J1x1MDNjMScsIDB4MWQ2ZjM6dSdcdTAzYjgnLAorMHgxZDZmNDp1J1x1MDNjMycsIDB4MWQ2ZjU6dSdcdTAzYzQnLCAweDFkNmY2OnUnXHUwM2M1JywgMHgxZDZmNzp1J1x1MDNjNicsCisweDFkNmY4OnUnXHUwM2M3JywgMHgxZDZmOTp1J1x1MDNjOCcsIDB4MWQ2ZmE6dSdcdTAzYzknLCAweDFkNzBkOnUnXHUwM2MzJywKKzB4MWQ3MWM6dSdcdTAzYjEnLCAweDFkNzFkOnUnXHUwM2IyJywgMHgxZDcxZTp1J1x1MDNiMycsIDB4MWQ3MWY6dSdcdTAzYjQnLAorMHgxZDcyMDp1J1x1MDNiNScsIDB4MWQ3MjE6dSdcdTAzYjYnLCAweDFkNzIyOnUnXHUwM2I3JywgMHgxZDcyMzp1J1x1MDNiOCcsCisweDFkNzI0OnUnXHUwM2I5JywgMHgxZDcyNTp1J1x1MDNiYScsIDB4MWQ3MjY6dSdcdTAzYmInLCAweDFkNzI3OnUnXHUwM2JjJywKKzB4MWQ3Mjg6dSdcdTAzYmQnLCAweDFkNzI5OnUnXHUwM2JlJywgMHgxZDcyYTp1J1x1MDNiZicsIDB4MWQ3MmI6dSdcdTAzYzAnLAorMHgxZDcyYzp1J1x1MDNjMScsIDB4MWQ3MmQ6dSdcdTAzYjgnLCAweDFkNzJlOnUnXHUwM2MzJywgMHgxZDcyZjp1J1x1MDNjNCcsCisweDFkNzMwOnUnXHUwM2M1JywgMHgxZDczMTp1J1x1MDNjNicsIDB4MWQ3MzI6dSdcdTAzYzcnLCAweDFkNzMzOnUnXHUwM2M4JywKKzB4MWQ3MzQ6dSdcdTAzYzknLCAweDFkNzQ3OnUnXHUwM2MzJywgMHgxZDc1Njp1J1x1MDNiMScsIDB4MWQ3NTc6dSdcdTAzYjInLAorMHgxZDc1ODp1J1x1MDNiMycsIDB4MWQ3NTk6dSdcdTAzYjQnLCAweDFkNzVhOnUnXHUwM2I1JywgMHgxZDc1Yjp1J1x1MDNiNicsCisweDFkNzVjOnUnXHUwM2I3JywgMHgxZDc1ZDp1J1x1MDNiOCcsIDB4MWQ3NWU6dSdcdTAzYjknLCAweDFkNzVmOnUnXHUwM2JhJywKKzB4MWQ3NjA6dSdcdTAzYmInLCAweDFkNzYxOnUnXHUwM2JjJywgMHgxZDc2Mjp1J1x1MDNiZCcsIDB4MWQ3NjM6dSdcdTAzYmUnLAorMHgxZDc2NDp1J1x1MDNiZicsIDB4MWQ3NjU6dSdcdTAzYzAnLCAweDFkNzY2OnUnXHUwM2MxJywgMHgxZDc2Nzp1J1x1MDNiOCcsCisweDFkNzY4OnUnXHUwM2MzJywgMHgxZDc2OTp1J1x1MDNjNCcsIDB4MWQ3NmE6dSdcdTAzYzUnLCAweDFkNzZiOnUnXHUwM2M2JywKKzB4MWQ3NmM6dSdcdTAzYzcnLCAweDFkNzZkOnUnXHUwM2M4JywgMHgxZDc2ZTp1J1x1MDNjOScsIDB4MWQ3ODE6dSdcdTAzYzMnLAorMHgxZDc5MDp1J1x1MDNiMScsIDB4MWQ3OTE6dSdcdTAzYjInLCAweDFkNzkyOnUnXHUwM2IzJywgMHgxZDc5Mzp1J1x1MDNiNCcsCisweDFkNzk0OnUnXHUwM2I1JywgMHgxZDc5NTp1J1x1MDNiNicsIDB4MWQ3OTY6dSdcdTAzYjcnLCAweDFkNzk3OnUnXHUwM2I4JywKKzB4MWQ3OTg6dSdcdTAzYjknLCAweDFkNzk5OnUnXHUwM2JhJywgMHgxZDc5YTp1J1x1MDNiYicsIDB4MWQ3OWI6dSdcdTAzYmMnLAorMHgxZDc5Yzp1J1x1MDNiZCcsIDB4MWQ3OWQ6dSdcdTAzYmUnLCAweDFkNzllOnUnXHUwM2JmJywgMHgxZDc5Zjp1J1x1MDNjMCcsCisweDFkN2EwOnUnXHUwM2MxJywgMHgxZDdhMTp1J1x1MDNiOCcsIDB4MWQ3YTI6dSdcdTAzYzMnLCAweDFkN2EzOnUnXHUwM2M0JywKKzB4MWQ3YTQ6dSdcdTAzYzUnLCAweDFkN2E1OnUnXHUwM2M2JywgMHgxZDdhNjp1J1x1MDNjNycsIDB4MWQ3YTc6dSdcdTAzYzgnLAorMHgxZDdhODp1J1x1MDNjOScsIDB4MWQ3YmI6dSdcdTAzYzMnLCB9CisKK2RlZiBtYXBfdGFibGVfYjMoY29kZSk6CisgICAgciA9IGIzX2V4Y2VwdGlvbnMuZ2V0KG9yZChjb2RlKSkKKyAgICBpZiByIGlzIG5vdCBOb25lOiByZXR1cm4gcgorICAgIHJldHVybiBjb2RlLmxvd2VyKCkKKworCitkZWYgbWFwX3RhYmxlX2IyKGEpOgorICAgIGFsID0gbWFwX3RhYmxlX2IzKGEpCisgICAgYiA9IHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgiTkZLQyIsIGFsKQorICAgIGJsID0gdSIiLmpvaW4oW21hcF90YWJsZV9iMyhjaCkgZm9yIGNoIGluIGJdKQorICAgIGMgPSB1bmljb2RlZGF0YS5ub3JtYWxpemUoIk5GS0MiLCBibCkKKyAgICBpZiBiICE9IGM6CisgICAgICAgIHJldHVybiBjCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGFsCisKKworZGVmIGluX3RhYmxlX2MxMShjb2RlKToKKyAgICByZXR1cm4gY29kZSA9PSB1IiAiCisKKworZGVmIGluX3RhYmxlX2MxMihjb2RlKToKKyAgICByZXR1cm4gdW5pY29kZWRhdGEuY2F0ZWdvcnkoY29kZSkgPT0gIlpzIiBhbmQgY29kZSAhPSB1IiAiCisKK2RlZiBpbl90YWJsZV9jMTFfYzEyKGNvZGUpOgorICAgIHJldHVybiB1bmljb2RlZGF0YS5jYXRlZ29yeShjb2RlKSA9PSAiWnMiCisKKworZGVmIGluX3RhYmxlX2MyMShjb2RlKToKKyAgICByZXR1cm4gb3JkKGNvZGUpIDwgMTI4IGFuZCB1bmljb2RlZGF0YS5jYXRlZ29yeShjb2RlKSA9PSAiQ2MiCisKK2MyMl9zcGVjaWFscyA9IHNldChbMTc1NywgMTgwNywgNjE1OCwgODIwNCwgODIwNSwgODIzMiwgODIzMywgNjUyNzldICsgcmFuZ2UoODI4OCw4MjkyKSArIHJhbmdlKDgyOTgsODMwNCkgKyByYW5nZSg2NTUyOSw2NTUzMykgKyByYW5nZSgxMTkxNTUsMTE5MTYzKSkKK2RlZiBpbl90YWJsZV9jMjIoY29kZSk6CisgICAgYyA9IG9yZChjb2RlKQorICAgIGlmIGMgPCAxMjg6IHJldHVybiBGYWxzZQorICAgIGlmIHVuaWNvZGVkYXRhLmNhdGVnb3J5KGNvZGUpID09ICJDYyI6IHJldHVybiBUcnVlCisgICAgcmV0dXJuIGMgaW4gYzIyX3NwZWNpYWxzCisKK2RlZiBpbl90YWJsZV9jMjFfYzIyKGNvZGUpOgorICAgIHJldHVybiB1bmljb2RlZGF0YS5jYXRlZ29yeShjb2RlKSA9PSAiQ2MiIG9yIFwKKyAgICAgICAgICAgb3JkKGNvZGUpIGluIGMyMl9zcGVjaWFscworCisKK2RlZiBpbl90YWJsZV9jMyhjb2RlKToKKyAgICByZXR1cm4gdW5pY29kZWRhdGEuY2F0ZWdvcnkoY29kZSkgPT0gIkNvIgorCisKK2RlZiBpbl90YWJsZV9jNChjb2RlKToKKyAgICBjID0gb3JkKGNvZGUpCisgICAgaWYgYyA8IDB4RkREMDogcmV0dXJuIEZhbHNlCisgICAgaWYgYyA8IDB4RkRGMDogcmV0dXJuIFRydWUKKyAgICByZXR1cm4gKG9yZChjb2RlKSAmIDB4RkZGRikgaW4gKDB4RkZGRSwgMHhGRkZGKQorCisKK2RlZiBpbl90YWJsZV9jNShjb2RlKToKKyAgICByZXR1cm4gdW5pY29kZWRhdGEuY2F0ZWdvcnkoY29kZSkgPT0gIkNzIgorCisKK2M2X3NldCA9IHNldChyYW5nZSg2NTUyOSw2NTUzNCkpCitkZWYgaW5fdGFibGVfYzYoY29kZSk6CisgICAgcmV0dXJuIG9yZChjb2RlKSBpbiBjNl9zZXQKKworCitjN19zZXQgPSBzZXQocmFuZ2UoMTIyNzIsMTIyODQpKQorZGVmIGluX3RhYmxlX2M3KGNvZGUpOgorICAgIHJldHVybiBvcmQoY29kZSkgaW4gYzdfc2V0CisKKworYzhfc2V0ID0gc2V0KFs4MzIsIDgzMywgODIwNiwgODIwN10gKyByYW5nZSg4MjM0LDgyMzkpICsgcmFuZ2UoODI5OCw4MzA0KSkKK2RlZiBpbl90YWJsZV9jOChjb2RlKToKKyAgICByZXR1cm4gb3JkKGNvZGUpIGluIGM4X3NldAorCisKK2M5X3NldCA9IHNldChbOTE3NTA1XSArIHJhbmdlKDkxNzUzNiw5MTc2MzIpKQorZGVmIGluX3RhYmxlX2M5KGNvZGUpOgorICAgIHJldHVybiBvcmQoY29kZSkgaW4gYzlfc2V0CisKKworZGVmIGluX3RhYmxlX2QxKGNvZGUpOgorICAgIHJldHVybiB1bmljb2RlZGF0YS5iaWRpcmVjdGlvbmFsKGNvZGUpIGluICgiUiIsIkFMIikKKworCitkZWYgaW5fdGFibGVfZDIoY29kZSk6CisgICAgcmV0dXJuIHVuaWNvZGVkYXRhLmJpZGlyZWN0aW9uYWwoY29kZSkgPT0gIkwiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0cmluZ3ByZXAucHljIGIvbGliL3B5dGhvbjIuNy9zdHJpbmdwcmVwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmRmYTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdHJpbmdwcmVwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0cmluZ3ByZXAucHlvIGIvbGliL3B5dGhvbjIuNy9zdHJpbmdwcmVwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWViMGZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdHJpbmdwcmVwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0cnVjdC5weSBiL2xpYi9weXRob24yLjcvc3RydWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjIzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N0cnVjdC5weQpAQCAtMCwwICsxLDMgQEAKK2Zyb20gX3N0cnVjdCBpbXBvcnQgKgorZnJvbSBfc3RydWN0IGltcG9ydCBfY2xlYXJjYWNoZQorZnJvbSBfc3RydWN0IGltcG9ydCBfX2RvY19fCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0cnVjdC5weWMgYi9saWIvcHl0aG9uMi43L3N0cnVjdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4NGUwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RydWN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0cnVjdC5weW8gYi9saWIvcHl0aG9uMi43L3N0cnVjdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI4NGUwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RydWN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N1YnByb2Nlc3MucHkgYi9saWIvcHl0aG9uMi43L3N1YnByb2Nlc3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5ZjlhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3VicHJvY2Vzcy5weQpAQCAtMCwwICsxLDE2MDIgQEAKKyMgc3VicHJvY2VzcyAtIFN1YnByb2Nlc3NlcyB3aXRoIGFjY2Vzc2libGUgSS9PIHN0cmVhbXMKKyMKKyMgRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBtb2R1bGUsIHNlZSBQRVAgMzI0LgorIworIyBUaGlzIG1vZHVsZSBzaG91bGQgcmVtYWluIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4yLCBzZWUgUEVQIDI5MS4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgYnkgUGV0ZXIgQXN0cmFuZCA8YXN0cmFuZEBseXNhdG9yLmxpdS5zZT4KKyMKKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorIyBTZWUgaHR0cDovL3d3dy5weXRob24ub3JnLzIuNC9saWNlbnNlIGZvciBsaWNlbnNpbmcgZGV0YWlscy4KKworciIiInN1YnByb2Nlc3MgLSBTdWJwcm9jZXNzZXMgd2l0aCBhY2Nlc3NpYmxlIEkvTyBzdHJlYW1zCisKK1RoaXMgbW9kdWxlIGFsbG93cyB5b3UgdG8gc3Bhd24gcHJvY2Vzc2VzLCBjb25uZWN0IHRvIHRoZWlyCitpbnB1dC9vdXRwdXQvZXJyb3IgcGlwZXMsIGFuZCBvYnRhaW4gdGhlaXIgcmV0dXJuIGNvZGVzLiAgVGhpcyBtb2R1bGUKK2ludGVuZHMgdG8gcmVwbGFjZSBzZXZlcmFsIG90aGVyLCBvbGRlciBtb2R1bGVzIGFuZCBmdW5jdGlvbnMsIGxpa2U6CisKK29zLnN5c3RlbQorb3Muc3Bhd24qCitvcy5wb3BlbioKK3BvcGVuMi4qCitjb21tYW5kcy4qCisKK0luZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgc3VicHJvY2VzcyBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGVzZQorbW9kdWxlcyBhbmQgZnVuY3Rpb25zIGNhbiBiZSBmb3VuZCBiZWxvdy4KKworCisKK1VzaW5nIHRoZSBzdWJwcm9jZXNzIG1vZHVsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09CitUaGlzIG1vZHVsZSBkZWZpbmVzIG9uZSBjbGFzcyBjYWxsZWQgUG9wZW46CisKK2NsYXNzIFBvcGVuKGFyZ3MsIGJ1ZnNpemU9MCwgZXhlY3V0YWJsZT1Ob25lLAorICAgICAgICAgICAgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsIHN0ZGVycj1Ob25lLAorICAgICAgICAgICAgcHJlZXhlY19mbj1Ob25lLCBjbG9zZV9mZHM9RmFsc2UsIHNoZWxsPUZhbHNlLAorICAgICAgICAgICAgY3dkPU5vbmUsIGVudj1Ob25lLCB1bml2ZXJzYWxfbmV3bGluZXM9RmFsc2UsCisgICAgICAgICAgICBzdGFydHVwaW5mbz1Ob25lLCBjcmVhdGlvbmZsYWdzPTApOgorCisKK0FyZ3VtZW50cyBhcmU6CisKK2FyZ3Mgc2hvdWxkIGJlIGEgc3RyaW5nLCBvciBhIHNlcXVlbmNlIG9mIHByb2dyYW0gYXJndW1lbnRzLiAgVGhlCitwcm9ncmFtIHRvIGV4ZWN1dGUgaXMgbm9ybWFsbHkgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGFyZ3Mgc2VxdWVuY2Ugb3IKK3N0cmluZywgYnV0IGNhbiBiZSBleHBsaWNpdGx5IHNldCBieSB1c2luZyB0aGUgZXhlY3V0YWJsZSBhcmd1bWVudC4KKworT24gVU5JWCwgd2l0aCBzaGVsbD1GYWxzZSAoZGVmYXVsdCk6IEluIHRoaXMgY2FzZSwgdGhlIFBvcGVuIGNsYXNzCit1c2VzIG9zLmV4ZWN2cCgpIHRvIGV4ZWN1dGUgdGhlIGNoaWxkIHByb2dyYW0uICBhcmdzIHNob3VsZCBub3JtYWxseQorYmUgYSBzZXF1ZW5jZS4gIEEgc3RyaW5nIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNlcXVlbmNlIHdpdGggdGhlIHN0cmluZworYXMgdGhlIG9ubHkgaXRlbSAodGhlIHByb2dyYW0gdG8gZXhlY3V0ZSkuCisKK09uIFVOSVgsIHdpdGggc2hlbGw9VHJ1ZTogSWYgYXJncyBpcyBhIHN0cmluZywgaXQgc3BlY2lmaWVzIHRoZQorY29tbWFuZCBzdHJpbmcgdG8gZXhlY3V0ZSB0aHJvdWdoIHRoZSBzaGVsbC4gIElmIGFyZ3MgaXMgYSBzZXF1ZW5jZSwKK3RoZSBmaXJzdCBpdGVtIHNwZWNpZmllcyB0aGUgY29tbWFuZCBzdHJpbmcsIGFuZCBhbnkgYWRkaXRpb25hbCBpdGVtcword2lsbCBiZSB0cmVhdGVkIGFzIGFkZGl0aW9uYWwgc2hlbGwgYXJndW1lbnRzLgorCitPbiBXaW5kb3dzOiB0aGUgUG9wZW4gY2xhc3MgdXNlcyBDcmVhdGVQcm9jZXNzKCkgdG8gZXhlY3V0ZSB0aGUgY2hpbGQKK3Byb2dyYW0sIHdoaWNoIG9wZXJhdGVzIG9uIHN0cmluZ3MuICBJZiBhcmdzIGlzIGEgc2VxdWVuY2UsIGl0IHdpbGwgYmUKK2NvbnZlcnRlZCB0byBhIHN0cmluZyB1c2luZyB0aGUgbGlzdDJjbWRsaW5lIG1ldGhvZC4gIFBsZWFzZSBub3RlIHRoYXQKK25vdCBhbGwgTVMgV2luZG93cyBhcHBsaWNhdGlvbnMgaW50ZXJwcmV0IHRoZSBjb21tYW5kIGxpbmUgdGhlIHNhbWUKK3dheTogVGhlIGxpc3QyY21kbGluZSBpcyBkZXNpZ25lZCBmb3IgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBzYW1lCitydWxlcyBhcyB0aGUgTVMgQyBydW50aW1lLgorCitidWZzaXplLCBpZiBnaXZlbiwgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQKK3RvIHRoZSBidWlsdC1pbiBvcGVuKCkgZnVuY3Rpb246IDAgbWVhbnMgdW5idWZmZXJlZCwgMSBtZWFucyBsaW5lCitidWZmZXJlZCwgYW55IG90aGVyIHBvc2l0aXZlIHZhbHVlIG1lYW5zIHVzZSBhIGJ1ZmZlciBvZgorKGFwcHJveGltYXRlbHkpIHRoYXQgc2l6ZS4gIEEgbmVnYXRpdmUgYnVmc2l6ZSBtZWFucyB0byB1c2UgdGhlIHN5c3RlbQorZGVmYXVsdCwgd2hpY2ggdXN1YWxseSBtZWFucyBmdWxseSBidWZmZXJlZC4gIFRoZSBkZWZhdWx0IHZhbHVlIGZvcgorYnVmc2l6ZSBpcyAwICh1bmJ1ZmZlcmVkKS4KKworc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyIHNwZWNpZnkgdGhlIGV4ZWN1dGVkIHByb2dyYW1zJyBzdGFuZGFyZAoraW5wdXQsIHN0YW5kYXJkIG91dHB1dCBhbmQgc3RhbmRhcmQgZXJyb3IgZmlsZSBoYW5kbGVzLCByZXNwZWN0aXZlbHkuCitWYWxpZCB2YWx1ZXMgYXJlIFBJUEUsIGFuIGV4aXN0aW5nIGZpbGUgZGVzY3JpcHRvciAoYSBwb3NpdGl2ZQoraW50ZWdlciksIGFuIGV4aXN0aW5nIGZpbGUgb2JqZWN0LCBhbmQgTm9uZS4gIFBJUEUgaW5kaWNhdGVzIHRoYXQgYQorbmV3IHBpcGUgdG8gdGhlIGNoaWxkIHNob3VsZCBiZSBjcmVhdGVkLiAgV2l0aCBOb25lLCBubyByZWRpcmVjdGlvbgord2lsbCBvY2N1cjsgdGhlIGNoaWxkJ3MgZmlsZSBoYW5kbGVzIHdpbGwgYmUgaW5oZXJpdGVkIGZyb20gdGhlCitwYXJlbnQuICBBZGRpdGlvbmFsbHksIHN0ZGVyciBjYW4gYmUgU1RET1VULCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUKK3N0ZGVyciBkYXRhIGZyb20gdGhlIGFwcGxpY2F0aW9ucyBzaG91bGQgYmUgY2FwdHVyZWQgaW50byB0aGUgc2FtZQorZmlsZSBoYW5kbGUgYXMgZm9yIHN0ZG91dC4KKworSWYgcHJlZXhlY19mbiBpcyBzZXQgdG8gYSBjYWxsYWJsZSBvYmplY3QsIHRoaXMgb2JqZWN0IHdpbGwgYmUgY2FsbGVkCitpbiB0aGUgY2hpbGQgcHJvY2VzcyBqdXN0IGJlZm9yZSB0aGUgY2hpbGQgaXMgZXhlY3V0ZWQuCisKK0lmIGNsb3NlX2ZkcyBpcyB0cnVlLCBhbGwgZmlsZSBkZXNjcmlwdG9ycyBleGNlcHQgMCwgMSBhbmQgMiB3aWxsIGJlCitjbG9zZWQgYmVmb3JlIHRoZSBjaGlsZCBwcm9jZXNzIGlzIGV4ZWN1dGVkLgorCitpZiBzaGVsbCBpcyB0cnVlLCB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgd2lsbCBiZSBleGVjdXRlZCB0aHJvdWdoIHRoZQorc2hlbGwuCisKK0lmIGN3ZCBpcyBub3QgTm9uZSwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgY2hhbmdlZCB0byBjd2QKK2JlZm9yZSB0aGUgY2hpbGQgaXMgZXhlY3V0ZWQuCisKK0lmIGVudiBpcyBub3QgTm9uZSwgaXQgZGVmaW5lcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgbmV3Citwcm9jZXNzLgorCitJZiB1bml2ZXJzYWxfbmV3bGluZXMgaXMgdHJ1ZSwgdGhlIGZpbGUgb2JqZWN0cyBzdGRvdXQgYW5kIHN0ZGVyciBhcmUKK29wZW5lZCBhcyBhIHRleHQgZmlsZXMsIGJ1dCBsaW5lcyBtYXkgYmUgdGVybWluYXRlZCBieSBhbnkgb2YgJ1xuJywKK3RoZSBVbml4IGVuZC1vZi1saW5lIGNvbnZlbnRpb24sICdccicsIHRoZSBNYWNpbnRvc2ggY29udmVudGlvbiBvcgorJ1xyXG4nLCB0aGUgV2luZG93cyBjb252ZW50aW9uLiAgQWxsIG9mIHRoZXNlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucworYXJlIHNlZW4gYXMgJ1xuJyBieSB0aGUgUHl0aG9uIHByb2dyYW0uICBOb3RlOiBUaGlzIGZlYXR1cmUgaXMgb25seQorYXZhaWxhYmxlIGlmIFB5dGhvbiBpcyBidWlsdCB3aXRoIHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQgKHRoZQorZGVmYXVsdCkuICBBbHNvLCB0aGUgbmV3bGluZXMgYXR0cmlidXRlIG9mIHRoZSBmaWxlIG9iamVjdHMgc3Rkb3V0LAorc3RkaW4gYW5kIHN0ZGVyciBhcmUgbm90IHVwZGF0ZWQgYnkgdGhlIGNvbW11bmljYXRlKCkgbWV0aG9kLgorCitUaGUgc3RhcnR1cGluZm8gYW5kIGNyZWF0aW9uZmxhZ3MsIGlmIGdpdmVuLCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKK3VuZGVybHlpbmcgQ3JlYXRlUHJvY2VzcygpIGZ1bmN0aW9uLiAgVGhleSBjYW4gc3BlY2lmeSB0aGluZ3Mgc3VjaCBhcworYXBwZWFyYW5jZSBvZiB0aGUgbWFpbiB3aW5kb3cgYW5kIHByaW9yaXR5IGZvciB0aGUgbmV3IHByb2Nlc3MuCisoV2luZG93cyBvbmx5KQorCisKK1RoaXMgbW9kdWxlIGFsc28gZGVmaW5lcyBzb21lIHNob3J0Y3V0IGZ1bmN0aW9uczoKKworY2FsbCgqcG9wZW5hcmdzLCAqKmt3YXJncyk6CisgICAgUnVuIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMuICBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLCB0aGVuCisgICAgcmV0dXJuIHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZS4KKworICAgIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgUG9wZW4gY29uc3RydWN0b3IuICBFeGFtcGxlOgorCisgICAgcmV0Y29kZSA9IGNhbGwoWyJscyIsICItbCJdKQorCitjaGVja19jYWxsKCpwb3BlbmFyZ3MsICoqa3dhcmdzKToKKyAgICBSdW4gY29tbWFuZCB3aXRoIGFyZ3VtZW50cy4gIFdhaXQgZm9yIGNvbW1hbmQgdG8gY29tcGxldGUuICBJZiB0aGUKKyAgICBleGl0IGNvZGUgd2FzIHplcm8gdGhlbiByZXR1cm4sIG90aGVyd2lzZSByYWlzZQorICAgIENhbGxlZFByb2Nlc3NFcnJvci4gIFRoZSBDYWxsZWRQcm9jZXNzRXJyb3Igb2JqZWN0IHdpbGwgaGF2ZSB0aGUKKyAgICByZXR1cm4gY29kZSBpbiB0aGUgcmV0dXJuY29kZSBhdHRyaWJ1dGUuCisKKyAgICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlIFBvcGVuIGNvbnN0cnVjdG9yLiAgRXhhbXBsZToKKworICAgIGNoZWNrX2NhbGwoWyJscyIsICItbCJdKQorCitjaGVja19vdXRwdXQoKnBvcGVuYXJncywgKiprd2FyZ3MpOgorICAgIFJ1biBjb21tYW5kIHdpdGggYXJndW1lbnRzIGFuZCByZXR1cm4gaXRzIG91dHB1dCBhcyBhIGJ5dGUgc3RyaW5nLgorCisgICAgSWYgdGhlIGV4aXQgY29kZSB3YXMgbm9uLXplcm8gaXQgcmFpc2VzIGEgQ2FsbGVkUHJvY2Vzc0Vycm9yLiAgVGhlCisgICAgQ2FsbGVkUHJvY2Vzc0Vycm9yIG9iamVjdCB3aWxsIGhhdmUgdGhlIHJldHVybiBjb2RlIGluIHRoZSByZXR1cm5jb2RlCisgICAgYXR0cmlidXRlIGFuZCBvdXRwdXQgaW4gdGhlIG91dHB1dCBhdHRyaWJ1dGUuCisKKyAgICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlIFBvcGVuIGNvbnN0cnVjdG9yLiAgRXhhbXBsZToKKworICAgIG91dHB1dCA9IGNoZWNrX291dHB1dChbImxzIiwgIi1sIiwgIi9kZXYvbnVsbCJdKQorCisKK0V4Y2VwdGlvbnMKKy0tLS0tLS0tLS0KK0V4Y2VwdGlvbnMgcmFpc2VkIGluIHRoZSBjaGlsZCBwcm9jZXNzLCBiZWZvcmUgdGhlIG5ldyBwcm9ncmFtIGhhcworc3RhcnRlZCB0byBleGVjdXRlLCB3aWxsIGJlIHJlLXJhaXNlZCBpbiB0aGUgcGFyZW50LiAgQWRkaXRpb25hbGx5LAordGhlIGV4Y2VwdGlvbiBvYmplY3Qgd2lsbCBoYXZlIG9uZSBleHRyYSBhdHRyaWJ1dGUgY2FsbGVkCisnY2hpbGRfdHJhY2ViYWNrJywgd2hpY2ggaXMgYSBzdHJpbmcgY29udGFpbmluZyB0cmFjZWJhY2sgaW5mb3JtYXRpb24KK2Zyb20gdGhlIGNoaWxkcyBwb2ludCBvZiB2aWV3LgorCitUaGUgbW9zdCBjb21tb24gZXhjZXB0aW9uIHJhaXNlZCBpcyBPU0Vycm9yLiAgVGhpcyBvY2N1cnMsIGZvcgorZXhhbXBsZSwgd2hlbiB0cnlpbmcgdG8gZXhlY3V0ZSBhIG5vbi1leGlzdGVudCBmaWxlLiAgQXBwbGljYXRpb25zCitzaG91bGQgcHJlcGFyZSBmb3IgT1NFcnJvcnMuCisKK0EgVmFsdWVFcnJvciB3aWxsIGJlIHJhaXNlZCBpZiBQb3BlbiBpcyBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cy4KKworY2hlY2tfY2FsbCgpIGFuZCBjaGVja19vdXRwdXQoKSB3aWxsIHJhaXNlIENhbGxlZFByb2Nlc3NFcnJvciwgaWYgdGhlCitjYWxsZWQgcHJvY2VzcyByZXR1cm5zIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUuCisKKworU2VjdXJpdHkKKy0tLS0tLS0tCitVbmxpa2Ugc29tZSBvdGhlciBwb3BlbiBmdW5jdGlvbnMsIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBuZXZlciBjYWxsCisvYmluL3NoIGltcGxpY2l0bHkuICBUaGlzIG1lYW5zIHRoYXQgYWxsIGNoYXJhY3RlcnMsIGluY2x1ZGluZyBzaGVsbAorbWV0YWNoYXJhY3RlcnMsIGNhbiBzYWZlbHkgYmUgcGFzc2VkIHRvIGNoaWxkIHByb2Nlc3Nlcy4KKworCitQb3BlbiBvYmplY3RzCis9PT09PT09PT09PT09CitJbnN0YW5jZXMgb2YgdGhlIFBvcGVuIGNsYXNzIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCitwb2xsKCkKKyAgICBDaGVjayBpZiBjaGlsZCBwcm9jZXNzIGhhcyB0ZXJtaW5hdGVkLiAgUmV0dXJucyByZXR1cm5jb2RlCisgICAgYXR0cmlidXRlLgorCit3YWl0KCkKKyAgICBXYWl0IGZvciBjaGlsZCBwcm9jZXNzIHRvIHRlcm1pbmF0ZS4gIFJldHVybnMgcmV0dXJuY29kZSBhdHRyaWJ1dGUuCisKK2NvbW11bmljYXRlKGlucHV0PU5vbmUpCisgICAgSW50ZXJhY3Qgd2l0aCBwcm9jZXNzOiBTZW5kIGRhdGEgdG8gc3RkaW4uICBSZWFkIGRhdGEgZnJvbSBzdGRvdXQKKyAgICBhbmQgc3RkZXJyLCB1bnRpbCBlbmQtb2YtZmlsZSBpcyByZWFjaGVkLiAgV2FpdCBmb3IgcHJvY2VzcyB0bworICAgIHRlcm1pbmF0ZS4gIFRoZSBvcHRpb25hbCBpbnB1dCBhcmd1bWVudCBzaG91bGQgYmUgYSBzdHJpbmcgdG8gYmUKKyAgICBzZW50IHRvIHRoZSBjaGlsZCBwcm9jZXNzLCBvciBOb25lLCBpZiBubyBkYXRhIHNob3VsZCBiZSBzZW50IHRvCisgICAgdGhlIGNoaWxkLgorCisgICAgY29tbXVuaWNhdGUoKSByZXR1cm5zIGEgdHVwbGUgKHN0ZG91dCwgc3RkZXJyKS4KKworICAgIE5vdGU6IFRoZSBkYXRhIHJlYWQgaXMgYnVmZmVyZWQgaW4gbWVtb3J5LCBzbyBkbyBub3QgdXNlIHRoaXMKKyAgICBtZXRob2QgaWYgdGhlIGRhdGEgc2l6ZSBpcyBsYXJnZSBvciB1bmxpbWl0ZWQuCisKK1RoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgYWxzbyBhdmFpbGFibGU6CisKK3N0ZGluCisgICAgSWYgdGhlIHN0ZGluIGFyZ3VtZW50IGlzIFBJUEUsIHRoaXMgYXR0cmlidXRlIGlzIGEgZmlsZSBvYmplY3QKKyAgICB0aGF0IHByb3ZpZGVzIGlucHV0IHRvIHRoZSBjaGlsZCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBpdCBpcyBOb25lLgorCitzdGRvdXQKKyAgICBJZiB0aGUgc3Rkb3V0IGFyZ3VtZW50IGlzIFBJUEUsIHRoaXMgYXR0cmlidXRlIGlzIGEgZmlsZSBvYmplY3QKKyAgICB0aGF0IHByb3ZpZGVzIG91dHB1dCBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBpdCBpcworICAgIE5vbmUuCisKK3N0ZGVycgorICAgIElmIHRoZSBzdGRlcnIgYXJndW1lbnQgaXMgUElQRSwgdGhpcyBhdHRyaWJ1dGUgaXMgZmlsZSBvYmplY3QgdGhhdAorICAgIHByb3ZpZGVzIGVycm9yIG91dHB1dCBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzLiAgT3RoZXJ3aXNlLCBpdCBpcworICAgIE5vbmUuCisKK3BpZAorICAgIFRoZSBwcm9jZXNzIElEIG9mIHRoZSBjaGlsZCBwcm9jZXNzLgorCityZXR1cm5jb2RlCisgICAgVGhlIGNoaWxkIHJldHVybiBjb2RlLiAgQSBOb25lIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBwcm9jZXNzCisgICAgaGFzbid0IHRlcm1pbmF0ZWQgeWV0LiAgQSBuZWdhdGl2ZSB2YWx1ZSAtTiBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAgICBjaGlsZCB3YXMgdGVybWluYXRlZCBieSBzaWduYWwgTiAoVU5JWCBvbmx5KS4KKworCitSZXBsYWNpbmcgb2xkZXIgZnVuY3Rpb25zIHdpdGggdGhlIHN1YnByb2Nlc3MgbW9kdWxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJbiB0aGlzIHNlY3Rpb24sICJhID09PiBiIiBtZWFucyB0aGF0IGIgY2FuIGJlIHVzZWQgYXMgYSByZXBsYWNlbWVudAorZm9yIGEuCisKK05vdGU6IEFsbCBmdW5jdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGZhaWwgKG1vcmUgb3IgbGVzcykgc2lsZW50bHkgaWYKK3RoZSBleGVjdXRlZCBwcm9ncmFtIGNhbm5vdCBiZSBmb3VuZDsgdGhpcyBtb2R1bGUgcmFpc2VzIGFuIE9TRXJyb3IKK2V4Y2VwdGlvbi4KKworSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlcywgd2UgYXNzdW1lIHRoYXQgdGhlIHN1YnByb2Nlc3MgbW9kdWxlIGlzCitpbXBvcnRlZCB3aXRoICJmcm9tIHN1YnByb2Nlc3MgaW1wb3J0ICoiLgorCisKK1JlcGxhY2luZyAvYmluL3NoIHNoZWxsIGJhY2txdW90ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitvdXRwdXQ9YG15Y21kIG15YXJnYAorPT0+CitvdXRwdXQgPSBQb3BlbihbIm15Y21kIiwgIm15YXJnIl0sIHN0ZG91dD1QSVBFKS5jb21tdW5pY2F0ZSgpWzBdCisKKworUmVwbGFjaW5nIHNoZWxsIHBpcGUgbGluZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorb3V0cHV0PWBkbWVzZyB8IGdyZXAgaGRhYAorPT0+CitwMSA9IFBvcGVuKFsiZG1lc2ciXSwgc3Rkb3V0PVBJUEUpCitwMiA9IFBvcGVuKFsiZ3JlcCIsICJoZGEiXSwgc3RkaW49cDEuc3Rkb3V0LCBzdGRvdXQ9UElQRSkKK291dHB1dCA9IHAyLmNvbW11bmljYXRlKClbMF0KKworCitSZXBsYWNpbmcgb3Muc3lzdGVtKCkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RzID0gb3Muc3lzdGVtKCJteWNtZCIgKyAiIG15YXJnIikKKz09PgorcCA9IFBvcGVuKCJteWNtZCIgKyAiIG15YXJnIiwgc2hlbGw9VHJ1ZSkKK3BpZCwgc3RzID0gb3Mud2FpdHBpZChwLnBpZCwgMCkKKworTm90ZToKKworKiBDYWxsaW5nIHRoZSBwcm9ncmFtIHRocm91Z2ggdGhlIHNoZWxsIGlzIHVzdWFsbHkgbm90IHJlcXVpcmVkLgorCisqIEl0J3MgZWFzaWVyIHRvIGxvb2sgYXQgdGhlIHJldHVybmNvZGUgYXR0cmlidXRlIHRoYW4gdGhlCisgIGV4aXRzdGF0dXMuCisKK0EgbW9yZSByZWFsLXdvcmxkIGV4YW1wbGUgd291bGQgbG9vayBsaWtlIHRoaXM6CisKK3RyeToKKyAgICByZXRjb2RlID0gY2FsbCgibXljbWQiICsgIiBteWFyZyIsIHNoZWxsPVRydWUpCisgICAgaWYgcmV0Y29kZSA8IDA6CisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkNoaWxkIHdhcyB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCIsIC1yZXRjb2RlCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiQ2hpbGQgcmV0dXJuZWQiLCByZXRjb2RlCitleGNlcHQgT1NFcnJvciwgZToKKyAgICBwcmludCA+PnN5cy5zdGRlcnIsICJFeGVjdXRpb24gZmFpbGVkOiIsIGUKKworCitSZXBsYWNpbmcgb3Muc3Bhd24qCistLS0tLS0tLS0tLS0tLS0tLS0tCitQX05PV0FJVCBleGFtcGxlOgorCitwaWQgPSBvcy5zcGF3bmxwKG9zLlBfTk9XQUlULCAiL2Jpbi9teWNtZCIsICJteWNtZCIsICJteWFyZyIpCis9PT4KK3BpZCA9IFBvcGVuKFsiL2Jpbi9teWNtZCIsICJteWFyZyJdKS5waWQKKworCitQX1dBSVQgZXhhbXBsZToKKworcmV0Y29kZSA9IG9zLnNwYXdubHAob3MuUF9XQUlULCAiL2Jpbi9teWNtZCIsICJteWNtZCIsICJteWFyZyIpCis9PT4KK3JldGNvZGUgPSBjYWxsKFsiL2Jpbi9teWNtZCIsICJteWFyZyJdKQorCisKK1ZlY3RvciBleGFtcGxlOgorCitvcy5zcGF3bnZwKG9zLlBfTk9XQUlULCBwYXRoLCBhcmdzKQorPT0+CitQb3BlbihbcGF0aF0gKyBhcmdzWzE6XSkKKworCitFbnZpcm9ubWVudCBleGFtcGxlOgorCitvcy5zcGF3bmxwZShvcy5QX05PV0FJVCwgIi9iaW4vbXljbWQiLCAibXljbWQiLCAibXlhcmciLCBlbnYpCis9PT4KK1BvcGVuKFsiL2Jpbi9teWNtZCIsICJteWFyZyJdLCBlbnY9eyJQQVRIIjogIi91c3IvYmluIn0pCisKKworUmVwbGFjaW5nIG9zLnBvcGVuKgorLS0tLS0tLS0tLS0tLS0tLS0tLQorcGlwZSA9IG9zLnBvcGVuKCJjbWQiLCBtb2RlPSdyJywgYnVmc2l6ZSkKKz09PgorcGlwZSA9IFBvcGVuKCJjbWQiLCBzaGVsbD1UcnVlLCBidWZzaXplPWJ1ZnNpemUsIHN0ZG91dD1QSVBFKS5zdGRvdXQKKworcGlwZSA9IG9zLnBvcGVuKCJjbWQiLCBtb2RlPSd3JywgYnVmc2l6ZSkKKz09PgorcGlwZSA9IFBvcGVuKCJjbWQiLCBzaGVsbD1UcnVlLCBidWZzaXplPWJ1ZnNpemUsIHN0ZGluPVBJUEUpLnN0ZGluCisKKworKGNoaWxkX3N0ZGluLCBjaGlsZF9zdGRvdXQpID0gb3MucG9wZW4yKCJjbWQiLCBtb2RlLCBidWZzaXplKQorPT0+CitwID0gUG9wZW4oImNtZCIsIHNoZWxsPVRydWUsIGJ1ZnNpemU9YnVmc2l6ZSwKKyAgICAgICAgICBzdGRpbj1QSVBFLCBzdGRvdXQ9UElQRSwgY2xvc2VfZmRzPVRydWUpCisoY2hpbGRfc3RkaW4sIGNoaWxkX3N0ZG91dCkgPSAocC5zdGRpbiwgcC5zdGRvdXQpCisKKworKGNoaWxkX3N0ZGluLAorIGNoaWxkX3N0ZG91dCwKKyBjaGlsZF9zdGRlcnIpID0gb3MucG9wZW4zKCJjbWQiLCBtb2RlLCBidWZzaXplKQorPT0+CitwID0gUG9wZW4oImNtZCIsIHNoZWxsPVRydWUsIGJ1ZnNpemU9YnVmc2l6ZSwKKyAgICAgICAgICBzdGRpbj1QSVBFLCBzdGRvdXQ9UElQRSwgc3RkZXJyPVBJUEUsIGNsb3NlX2Zkcz1UcnVlKQorKGNoaWxkX3N0ZGluLAorIGNoaWxkX3N0ZG91dCwKKyBjaGlsZF9zdGRlcnIpID0gKHAuc3RkaW4sIHAuc3Rkb3V0LCBwLnN0ZGVycikKKworCisoY2hpbGRfc3RkaW4sIGNoaWxkX3N0ZG91dF9hbmRfc3RkZXJyKSA9IG9zLnBvcGVuNCgiY21kIiwgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUpCis9PT4KK3AgPSBQb3BlbigiY21kIiwgc2hlbGw9VHJ1ZSwgYnVmc2l6ZT1idWZzaXplLAorICAgICAgICAgIHN0ZGluPVBJUEUsIHN0ZG91dD1QSVBFLCBzdGRlcnI9U1RET1VULCBjbG9zZV9mZHM9VHJ1ZSkKKyhjaGlsZF9zdGRpbiwgY2hpbGRfc3Rkb3V0X2FuZF9zdGRlcnIpID0gKHAuc3RkaW4sIHAuc3Rkb3V0KQorCitPbiBVbml4LCBvcy5wb3BlbjIsIG9zLnBvcGVuMyBhbmQgb3MucG9wZW40IGFsc28gYWNjZXB0IGEgc2VxdWVuY2UgYXMKK3RoZSBjb21tYW5kIHRvIGV4ZWN1dGUsIGluIHdoaWNoIGNhc2UgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkCitkaXJlY3RseSB0byB0aGUgcHJvZ3JhbSB3aXRob3V0IHNoZWxsIGludGVydmVudGlvbi4gIFRoaXMgdXNhZ2UgY2FuIGJlCityZXBsYWNlZCBhcyBmb2xsb3dzOgorCisoY2hpbGRfc3RkaW4sIGNoaWxkX3N0ZG91dCkgPSBvcy5wb3BlbjIoWyIvYmluL2xzIiwgIi1sIl0sIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSkKKz09PgorcCA9IFBvcGVuKFsiL2Jpbi9scyIsICItbCJdLCBidWZzaXplPWJ1ZnNpemUsIHN0ZGluPVBJUEUsIHN0ZG91dD1QSVBFKQorKGNoaWxkX3N0ZGluLCBjaGlsZF9zdGRvdXQpID0gKHAuc3RkaW4sIHAuc3Rkb3V0KQorCitSZXR1cm4gY29kZSBoYW5kbGluZyB0cmFuc2xhdGVzIGFzIGZvbGxvd3M6CisKK3BpcGUgPSBvcy5wb3BlbigiY21kIiwgJ3cnKQorLi4uCityYyA9IHBpcGUuY2xvc2UoKQoraWYgcmMgaXMgbm90IE5vbmUgYW5kIHJjICUgMjU2OgorICAgIHByaW50ICJUaGVyZSB3ZXJlIHNvbWUgZXJyb3JzIgorPT0+Citwcm9jZXNzID0gUG9wZW4oImNtZCIsICd3Jywgc2hlbGw9VHJ1ZSwgc3RkaW49UElQRSkKKy4uLgorcHJvY2Vzcy5zdGRpbi5jbG9zZSgpCitpZiBwcm9jZXNzLndhaXQoKSAhPSAwOgorICAgIHByaW50ICJUaGVyZSB3ZXJlIHNvbWUgZXJyb3JzIgorCisKK1JlcGxhY2luZyBwb3BlbjIuKgorLS0tLS0tLS0tLS0tLS0tLS0tCisoY2hpbGRfc3Rkb3V0LCBjaGlsZF9zdGRpbikgPSBwb3BlbjIucG9wZW4yKCJzb21lc3RyaW5nIiwgYnVmc2l6ZSwgbW9kZSkKKz09PgorcCA9IFBvcGVuKFsic29tZXN0cmluZyJdLCBzaGVsbD1UcnVlLCBidWZzaXplPWJ1ZnNpemUKKyAgICAgICAgICBzdGRpbj1QSVBFLCBzdGRvdXQ9UElQRSwgY2xvc2VfZmRzPVRydWUpCisoY2hpbGRfc3Rkb3V0LCBjaGlsZF9zdGRpbikgPSAocC5zdGRvdXQsIHAuc3RkaW4pCisKK09uIFVuaXgsIHBvcGVuMiBhbHNvIGFjY2VwdHMgYSBzZXF1ZW5jZSBhcyB0aGUgY29tbWFuZCB0byBleGVjdXRlLCBpbgord2hpY2ggY2FzZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIHByb2dyYW0gd2l0aG91dAorc2hlbGwgaW50ZXJ2ZW50aW9uLiAgVGhpcyB1c2FnZSBjYW4gYmUgcmVwbGFjZWQgYXMgZm9sbG93czoKKworKGNoaWxkX3N0ZG91dCwgY2hpbGRfc3RkaW4pID0gcG9wZW4yLnBvcGVuMihbIm15Y21kIiwgIm15YXJnIl0sIGJ1ZnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUpCis9PT4KK3AgPSBQb3BlbihbIm15Y21kIiwgIm15YXJnIl0sIGJ1ZnNpemU9YnVmc2l6ZSwKKyAgICAgICAgICBzdGRpbj1QSVBFLCBzdGRvdXQ9UElQRSwgY2xvc2VfZmRzPVRydWUpCisoY2hpbGRfc3Rkb3V0LCBjaGlsZF9zdGRpbikgPSAocC5zdGRvdXQsIHAuc3RkaW4pCisKK1RoZSBwb3BlbjIuUG9wZW4zIGFuZCBwb3BlbjIuUG9wZW40IGJhc2ljYWxseSB3b3JrcyBhcyBzdWJwcm9jZXNzLlBvcGVuLAorZXhjZXB0IHRoYXQ6CisKKyogc3VicHJvY2Vzcy5Qb3BlbiByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHRoZSBleGVjdXRpb24gZmFpbHMKKyogdGhlIGNhcHR1cmVzdGRlcnIgYXJndW1lbnQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3RkZXJyIGFyZ3VtZW50LgorKiBzdGRpbj1QSVBFIGFuZCBzdGRvdXQ9UElQRSBtdXN0IGJlIHNwZWNpZmllZC4KKyogcG9wZW4yIGNsb3NlcyBhbGwgZmlsZWRlc2NyaXB0b3JzIGJ5IGRlZmF1bHQsIGJ1dCB5b3UgaGF2ZSB0byBzcGVjaWZ5CisgIGNsb3NlX2Zkcz1UcnVlIHdpdGggc3VicHJvY2Vzcy5Qb3Blbi4KKyIiIgorCitpbXBvcnQgc3lzCittc3dpbmRvd3MgPSAoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIpCisKK2ltcG9ydCBvcworaW1wb3J0IHR5cGVzCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgZ2MKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBlcnJubworCisjIEV4Y2VwdGlvbiBjbGFzc2VzIHVzZWQgYnkgdGhpcyBtb2R1bGUuCitjbGFzcyBDYWxsZWRQcm9jZXNzRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJUaGlzIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBhIHByb2Nlc3MgcnVuIGJ5IGNoZWNrX2NhbGwoKSBvcgorICAgIGNoZWNrX291dHB1dCgpIHJldHVybnMgYSBub24temVybyBleGl0IHN0YXR1cy4KKyAgICBUaGUgZXhpdCBzdGF0dXMgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHJldHVybmNvZGUgYXR0cmlidXRlOworICAgIGNoZWNrX291dHB1dCgpIHdpbGwgYWxzbyBzdG9yZSB0aGUgb3V0cHV0IGluIHRoZSBvdXRwdXQgYXR0cmlidXRlLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXR1cm5jb2RlLCBjbWQsIG91dHB1dD1Ob25lKToKKyAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gcmV0dXJuY29kZQorICAgICAgICBzZWxmLmNtZCA9IGNtZAorICAgICAgICBzZWxmLm91dHB1dCA9IG91dHB1dAorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkNvbW1hbmQgJyVzJyByZXR1cm5lZCBub24temVybyBleGl0IHN0YXR1cyAlZCIgJSAoc2VsZi5jbWQsIHNlbGYucmV0dXJuY29kZSkKKworCitpZiBtc3dpbmRvd3M6CisgICAgaW1wb3J0IHRocmVhZGluZworICAgIGltcG9ydCBtc3ZjcnQKKyAgICBpbXBvcnQgX3N1YnByb2Nlc3MKKyAgICBjbGFzcyBTVEFSVFVQSU5GTzoKKyAgICAgICAgZHdGbGFncyA9IDAKKyAgICAgICAgaFN0ZElucHV0ID0gTm9uZQorICAgICAgICBoU3RkT3V0cHV0ID0gTm9uZQorICAgICAgICBoU3RkRXJyb3IgPSBOb25lCisgICAgICAgIHdTaG93V2luZG93ID0gMAorICAgIGNsYXNzIHB5d2ludHlwZXM6CisgICAgICAgIGVycm9yID0gSU9FcnJvcgorZWxzZToKKyAgICBpbXBvcnQgc2VsZWN0CisgICAgX2hhc19wb2xsID0gaGFzYXR0cihzZWxlY3QsICdwb2xsJykKKyAgICBpbXBvcnQgZmNudGwKKyAgICBpbXBvcnQgcGlja2xlCisKKyAgICAjIFdoZW4gc2VsZWN0IG9yIHBvbGwgaGFzIGluZGljYXRlZCB0aGF0IHRoZSBmaWxlIGlzIHdyaXRhYmxlLAorICAgICMgd2UgY2FuIHdyaXRlIHVwIHRvIF9QSVBFX0JVRiBieXRlcyB3aXRob3V0IHJpc2sgb2YgYmxvY2tpbmcuCisgICAgIyBQT1NJWCBkZWZpbmVzIFBJUEVfQlVGIGFzID49IDUxMi4KKyAgICBfUElQRV9CVUYgPSBnZXRhdHRyKHNlbGVjdCwgJ1BJUEVfQlVGJywgNTEyKQorCisKK19fYWxsX18gPSBbIlBvcGVuIiwgIlBJUEUiLCAiU1RET1VUIiwgImNhbGwiLCAiY2hlY2tfY2FsbCIsCisgICAgICAgICAgICJjaGVja19vdXRwdXQiLCAiQ2FsbGVkUHJvY2Vzc0Vycm9yIl0KKworaWYgbXN3aW5kb3dzOgorICAgIGZyb20gX3N1YnByb2Nlc3MgaW1wb3J0IChDUkVBVEVfTkVXX0NPTlNPTEUsIENSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1REX0lOUFVUX0hBTkRMRSwgU1REX09VVFBVVF9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNURF9FUlJPUl9IQU5ETEUsIFNXX0hJREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVJURl9VU0VTVERIQU5ETEVTLCBTVEFSVEZfVVNFU0hPV1dJTkRPVykKKworICAgIF9fYWxsX18uZXh0ZW5kKFsiQ1JFQVRFX05FV19DT05TT0xFIiwgIkNSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCIsCisgICAgICAgICAgICAgICAgICAgICJTVERfSU5QVVRfSEFORExFIiwgIlNURF9PVVRQVVRfSEFORExFIiwKKyAgICAgICAgICAgICAgICAgICAgIlNURF9FUlJPUl9IQU5ETEUiLCAiU1dfSElERSIsCisgICAgICAgICAgICAgICAgICAgICJTVEFSVEZfVVNFU1RESEFORExFUyIsICJTVEFSVEZfVVNFU0hPV1dJTkRPVyJdKQordHJ5OgorICAgIE1BWEZEID0gb3Muc3lzY29uZigiU0NfT1BFTl9NQVgiKQorZXhjZXB0OgorICAgIE1BWEZEID0gMjU2CisKK19hY3RpdmUgPSBbXQorCitkZWYgX2NsZWFudXAoKToKKyAgICBmb3IgaW5zdCBpbiBfYWN0aXZlWzpdOgorICAgICAgICByZXMgPSBpbnN0Ll9pbnRlcm5hbF9wb2xsKF9kZWFkc3RhdGU9c3lzLm1heGludCkKKyAgICAgICAgaWYgcmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIF9hY3RpdmUucmVtb3ZlKGluc3QpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFRoaXMgY2FuIGhhcHBlbiBpZiB0d28gdGhyZWFkcyBjcmVhdGUgYSBuZXcgUG9wZW4gaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgIyBJdCdzIGhhcm1sZXNzIHRoYXQgaXQgd2FzIGFscmVhZHkgcmVtb3ZlZCwgc28gaWdub3JlLgorICAgICAgICAgICAgICAgIHBhc3MKKworUElQRSA9IC0xCitTVERPVVQgPSAtMgorCisKK2RlZiBfZWludHJfcmV0cnlfY2FsbChmdW5jLCAqYXJncyk6CisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MpCisgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcikgYXMgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHJhaXNlCisKKworIyBYWFggVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHVzZWQgYnkgbXVsdGlwcm9jZXNzaW5nIGFuZCB0aGUgdGVzdCBzdWl0ZSwKKyMgYnV0IGl0J3MgaGVyZSBzbyB0aGF0IGl0IGNhbiBiZSBpbXBvcnRlZCB3aGVuIFB5dGhvbiBpcyBjb21waWxlZCB3aXRob3V0CisjIHRocmVhZHMuCisKK2RlZiBfYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHJlcHJvZHVjaW5nIHRoZSBjdXJyZW50CisgICAgc2V0dGluZ3MgaW4gc3lzLmZsYWdzIGFuZCBzeXMud2Fybm9wdGlvbnMuIiIiCisgICAgZmxhZ19vcHRfbWFwID0geworICAgICAgICAnZGVidWcnOiAnZCcsCisgICAgICAgICMgJ2luc3BlY3QnOiAnaScsCisgICAgICAgICMgJ2ludGVyYWN0aXZlJzogJ2knLAorICAgICAgICAnb3B0aW1pemUnOiAnTycsCisgICAgICAgICdkb250X3dyaXRlX2J5dGVjb2RlJzogJ0InLAorICAgICAgICAnbm9fdXNlcl9zaXRlJzogJ3MnLAorICAgICAgICAnbm9fc2l0ZSc6ICdTJywKKyAgICAgICAgJ2lnbm9yZV9lbnZpcm9ubWVudCc6ICdFJywKKyAgICAgICAgJ3ZlcmJvc2UnOiAndicsCisgICAgICAgICdieXRlc193YXJuaW5nJzogJ2InLAorICAgICAgICAnaGFzaF9yYW5kb21pemF0aW9uJzogJ1InLAorICAgICAgICAncHkza193YXJuaW5nJzogJzMnLAorICAgIH0KKyAgICBhcmdzID0gW10KKyAgICBmb3IgZmxhZywgb3B0IGluIGZsYWdfb3B0X21hcC5pdGVtcygpOgorICAgICAgICB2ID0gZ2V0YXR0cihzeXMuZmxhZ3MsIGZsYWcpCisgICAgICAgIGlmIHYgPiAwOgorICAgICAgICAgICAgYXJncy5hcHBlbmQoJy0nICsgb3B0ICogdikKKyAgICBmb3Igb3B0IGluIHN5cy53YXJub3B0aW9uczoKKyAgICAgICAgYXJncy5hcHBlbmQoJy1XJyArIG9wdCkKKyAgICByZXR1cm4gYXJncworCisKK2RlZiBjYWxsKCpwb3BlbmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiJSdW4gY29tbWFuZCB3aXRoIGFyZ3VtZW50cy4gIFdhaXQgZm9yIGNvbW1hbmQgdG8gY29tcGxldGUsIHRoZW4KKyAgICByZXR1cm4gdGhlIHJldHVybmNvZGUgYXR0cmlidXRlLgorCisgICAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBQb3BlbiBjb25zdHJ1Y3Rvci4gIEV4YW1wbGU6CisKKyAgICByZXRjb2RlID0gY2FsbChbImxzIiwgIi1sIl0pCisgICAgIiIiCisgICAgcmV0dXJuIFBvcGVuKCpwb3BlbmFyZ3MsICoqa3dhcmdzKS53YWl0KCkKKworCitkZWYgY2hlY2tfY2FsbCgqcG9wZW5hcmdzLCAqKmt3YXJncyk6CisgICAgIiIiUnVuIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMuICBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLiAgSWYKKyAgICB0aGUgZXhpdCBjb2RlIHdhcyB6ZXJvIHRoZW4gcmV0dXJuLCBvdGhlcndpc2UgcmFpc2UKKyAgICBDYWxsZWRQcm9jZXNzRXJyb3IuICBUaGUgQ2FsbGVkUHJvY2Vzc0Vycm9yIG9iamVjdCB3aWxsIGhhdmUgdGhlCisgICAgcmV0dXJuIGNvZGUgaW4gdGhlIHJldHVybmNvZGUgYXR0cmlidXRlLgorCisgICAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBQb3BlbiBjb25zdHJ1Y3Rvci4gIEV4YW1wbGU6CisKKyAgICBjaGVja19jYWxsKFsibHMiLCAiLWwiXSkKKyAgICAiIiIKKyAgICByZXRjb2RlID0gY2FsbCgqcG9wZW5hcmdzLCAqKmt3YXJncykKKyAgICBpZiByZXRjb2RlOgorICAgICAgICBjbWQgPSBrd2FyZ3MuZ2V0KCJhcmdzIikKKyAgICAgICAgaWYgY21kIGlzIE5vbmU6CisgICAgICAgICAgICBjbWQgPSBwb3BlbmFyZ3NbMF0KKyAgICAgICAgcmFpc2UgQ2FsbGVkUHJvY2Vzc0Vycm9yKHJldGNvZGUsIGNtZCkKKyAgICByZXR1cm4gMAorCisKK2RlZiBjaGVja19vdXRwdXQoKnBvcGVuYXJncywgKiprd2FyZ3MpOgorICAgIHIiIiJSdW4gY29tbWFuZCB3aXRoIGFyZ3VtZW50cyBhbmQgcmV0dXJuIGl0cyBvdXRwdXQgYXMgYSBieXRlIHN0cmluZy4KKworICAgIElmIHRoZSBleGl0IGNvZGUgd2FzIG5vbi16ZXJvIGl0IHJhaXNlcyBhIENhbGxlZFByb2Nlc3NFcnJvci4gIFRoZQorICAgIENhbGxlZFByb2Nlc3NFcnJvciBvYmplY3Qgd2lsbCBoYXZlIHRoZSByZXR1cm4gY29kZSBpbiB0aGUgcmV0dXJuY29kZQorICAgIGF0dHJpYnV0ZSBhbmQgb3V0cHV0IGluIHRoZSBvdXRwdXQgYXR0cmlidXRlLgorCisgICAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBQb3BlbiBjb25zdHJ1Y3Rvci4gIEV4YW1wbGU6CisKKyAgICA+Pj4gY2hlY2tfb3V0cHV0KFsibHMiLCAiLWwiLCAiL2Rldi9udWxsIl0pCisgICAgJ2Nydy1ydy1ydy0gMSByb290IHJvb3QgMSwgMyBPY3QgMTggIDIwMDcgL2Rldi9udWxsXG4nCisKKyAgICBUaGUgc3Rkb3V0IGFyZ3VtZW50IGlzIG5vdCBhbGxvd2VkIGFzIGl0IGlzIHVzZWQgaW50ZXJuYWxseS4KKyAgICBUbyBjYXB0dXJlIHN0YW5kYXJkIGVycm9yIGluIHRoZSByZXN1bHQsIHVzZSBzdGRlcnI9U1RET1VULgorCisgICAgPj4+IGNoZWNrX291dHB1dChbIi9iaW4vc2giLCAiLWMiLAorICAgIC4uLiAgICAgICAgICAgICAgICJscyAtbCBub25fZXhpc3RlbnRfZmlsZSA7IGV4aXQgMCJdLAorICAgIC4uLiAgICAgICAgICAgICAgc3RkZXJyPVNURE9VVCkKKyAgICAnbHM6IG5vbl9leGlzdGVudF9maWxlOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XG4nCisgICAgIiIiCisgICAgaWYgJ3N0ZG91dCcgaW4ga3dhcmdzOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdzdGRvdXQgYXJndW1lbnQgbm90IGFsbG93ZWQsIGl0IHdpbGwgYmUgb3ZlcnJpZGRlbi4nKQorICAgIHByb2Nlc3MgPSBQb3BlbihzdGRvdXQ9UElQRSwgKnBvcGVuYXJncywgKiprd2FyZ3MpCisgICAgb3V0cHV0LCB1bnVzZWRfZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgcmV0Y29kZSA9IHByb2Nlc3MucG9sbCgpCisgICAgaWYgcmV0Y29kZToKKyAgICAgICAgY21kID0ga3dhcmdzLmdldCgiYXJncyIpCisgICAgICAgIGlmIGNtZCBpcyBOb25lOgorICAgICAgICAgICAgY21kID0gcG9wZW5hcmdzWzBdCisgICAgICAgIHJhaXNlIENhbGxlZFByb2Nlc3NFcnJvcihyZXRjb2RlLCBjbWQsIG91dHB1dD1vdXRwdXQpCisgICAgcmV0dXJuIG91dHB1dAorCisKK2RlZiBsaXN0MmNtZGxpbmUoc2VxKToKKyAgICAiIiIKKyAgICBUcmFuc2xhdGUgYSBzZXF1ZW5jZSBvZiBhcmd1bWVudHMgaW50byBhIGNvbW1hbmQgbGluZQorICAgIHN0cmluZywgdXNpbmcgdGhlIHNhbWUgcnVsZXMgYXMgdGhlIE1TIEMgcnVudGltZToKKworICAgIDEpIEFyZ3VtZW50cyBhcmUgZGVsaW1pdGVkIGJ5IHdoaXRlIHNwYWNlLCB3aGljaCBpcyBlaXRoZXIgYQorICAgICAgIHNwYWNlIG9yIGEgdGFiLgorCisgICAgMikgQSBzdHJpbmcgc3Vycm91bmRlZCBieSBkb3VibGUgcXVvdGF0aW9uIG1hcmtzIGlzCisgICAgICAgaW50ZXJwcmV0ZWQgYXMgYSBzaW5nbGUgYXJndW1lbnQsIHJlZ2FyZGxlc3Mgb2Ygd2hpdGUgc3BhY2UKKyAgICAgICBjb250YWluZWQgd2l0aGluLiAgQSBxdW90ZWQgc3RyaW5nIGNhbiBiZSBlbWJlZGRlZCBpbiBhbgorICAgICAgIGFyZ3VtZW50LgorCisgICAgMykgQSBkb3VibGUgcXVvdGF0aW9uIG1hcmsgcHJlY2VkZWQgYnkgYSBiYWNrc2xhc2ggaXMKKyAgICAgICBpbnRlcnByZXRlZCBhcyBhIGxpdGVyYWwgZG91YmxlIHF1b3RhdGlvbiBtYXJrLgorCisgICAgNCkgQmFja3NsYXNoZXMgYXJlIGludGVycHJldGVkIGxpdGVyYWxseSwgdW5sZXNzIHRoZXkKKyAgICAgICBpbW1lZGlhdGVseSBwcmVjZWRlIGEgZG91YmxlIHF1b3RhdGlvbiBtYXJrLgorCisgICAgNSkgSWYgYmFja3NsYXNoZXMgaW1tZWRpYXRlbHkgcHJlY2VkZSBhIGRvdWJsZSBxdW90YXRpb24gbWFyaywKKyAgICAgICBldmVyeSBwYWlyIG9mIGJhY2tzbGFzaGVzIGlzIGludGVycHJldGVkIGFzIGEgbGl0ZXJhbAorICAgICAgIGJhY2tzbGFzaC4gIElmIHRoZSBudW1iZXIgb2YgYmFja3NsYXNoZXMgaXMgb2RkLCB0aGUgbGFzdAorICAgICAgIGJhY2tzbGFzaCBlc2NhcGVzIHRoZSBuZXh0IGRvdWJsZSBxdW90YXRpb24gbWFyayBhcworICAgICAgIGRlc2NyaWJlZCBpbiBydWxlIDMuCisgICAgIiIiCisKKyAgICAjIFNlZQorICAgICMgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5LzE3dzV5a2Z0LmFzcHgKKyAgICAjIG9yIHNlYXJjaCBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tIGZvcgorICAgICMgIlBhcnNpbmcgQysrIENvbW1hbmQtTGluZSBBcmd1bWVudHMiCisgICAgcmVzdWx0ID0gW10KKyAgICBuZWVkcXVvdGUgPSBGYWxzZQorICAgIGZvciBhcmcgaW4gc2VxOgorICAgICAgICBic19idWYgPSBbXQorCisgICAgICAgICMgQWRkIGEgc3BhY2UgdG8gc2VwYXJhdGUgdGhpcyBhcmd1bWVudCBmcm9tIHRoZSBvdGhlcnMKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnICcpCisKKyAgICAgICAgbmVlZHF1b3RlID0gKCIgIiBpbiBhcmcpIG9yICgiXHQiIGluIGFyZykgb3Igbm90IGFyZworICAgICAgICBpZiBuZWVkcXVvdGU6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCciJykKKworICAgICAgICBmb3IgYyBpbiBhcmc6CisgICAgICAgICAgICBpZiBjID09ICdcXCc6CisgICAgICAgICAgICAgICAgIyBEb24ndCBrbm93IGlmIHdlIG5lZWQgdG8gZG91YmxlIHlldC4KKyAgICAgICAgICAgICAgICBic19idWYuYXBwZW5kKGMpCisgICAgICAgICAgICBlbGlmIGMgPT0gJyInOgorICAgICAgICAgICAgICAgICMgRG91YmxlIGJhY2tzbGFzaGVzLgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ1xcJyAqIGxlbihic19idWYpKjIpCisgICAgICAgICAgICAgICAgYnNfYnVmID0gW10KKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdcXCInKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIE5vcm1hbCBjaGFyCisgICAgICAgICAgICAgICAgaWYgYnNfYnVmOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKGJzX2J1ZikKKyAgICAgICAgICAgICAgICAgICAgYnNfYnVmID0gW10KKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGMpCisKKyAgICAgICAgIyBBZGQgcmVtYWluaW5nIGJhY2tzbGFzaGVzLCBpZiBhbnkuCisgICAgICAgIGlmIGJzX2J1ZjoKKyAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoYnNfYnVmKQorCisgICAgICAgIGlmIG5lZWRxdW90ZToKKyAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoYnNfYnVmKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnIicpCisKKyAgICByZXR1cm4gJycuam9pbihyZXN1bHQpCisKKworY2xhc3MgUG9wZW4ob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJncywgYnVmc2l6ZT0wLCBleGVjdXRhYmxlPU5vbmUsCisgICAgICAgICAgICAgICAgIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwKKyAgICAgICAgICAgICAgICAgcHJlZXhlY19mbj1Ob25lLCBjbG9zZV9mZHM9RmFsc2UsIHNoZWxsPUZhbHNlLAorICAgICAgICAgICAgICAgICBjd2Q9Tm9uZSwgZW52PU5vbmUsIHVuaXZlcnNhbF9uZXdsaW5lcz1GYWxzZSwKKyAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm89Tm9uZSwgY3JlYXRpb25mbGFncz0wKToKKyAgICAgICAgIiIiQ3JlYXRlIG5ldyBQb3BlbiBpbnN0YW5jZS4iIiIKKyAgICAgICAgX2NsZWFudXAoKQorCisgICAgICAgIHNlbGYuX2NoaWxkX2NyZWF0ZWQgPSBGYWxzZQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShidWZzaXplLCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImJ1ZnNpemUgbXVzdCBiZSBhbiBpbnRlZ2VyIikKKworICAgICAgICBpZiBtc3dpbmRvd3M6CisgICAgICAgICAgICBpZiBwcmVleGVjX2ZuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInByZWV4ZWNfZm4gaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybXMiKQorICAgICAgICAgICAgaWYgY2xvc2VfZmRzIGFuZCAoc3RkaW4gaXMgbm90IE5vbmUgb3Igc3Rkb3V0IGlzIG5vdCBOb25lIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnIgaXMgbm90IE5vbmUpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNsb3NlX2ZkcyBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtcyBpZiB5b3UgcmVkaXJlY3Qgc3RkaW4vc3Rkb3V0L3N0ZGVyciIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFBPU0lYCisgICAgICAgICAgICBpZiBzdGFydHVwaW5mbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdGFydHVwaW5mbyBpcyBvbmx5IHN1cHBvcnRlZCBvbiBXaW5kb3dzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybXMiKQorICAgICAgICAgICAgaWYgY3JlYXRpb25mbGFncyAhPSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNyZWF0aW9uZmxhZ3MgaXMgb25seSBzdXBwb3J0ZWQgb24gV2luZG93cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm1zIikKKworICAgICAgICBzZWxmLnN0ZGluID0gTm9uZQorICAgICAgICBzZWxmLnN0ZG91dCA9IE5vbmUKKyAgICAgICAgc2VsZi5zdGRlcnIgPSBOb25lCisgICAgICAgIHNlbGYucGlkID0gTm9uZQorICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBOb25lCisgICAgICAgIHNlbGYudW5pdmVyc2FsX25ld2xpbmVzID0gdW5pdmVyc2FsX25ld2xpbmVzCisKKyAgICAgICAgIyBJbnB1dCBhbmQgb3V0cHV0IG9iamVjdHMuIFRoZSBnZW5lcmFsIHByaW5jaXBsZSBpcyBsaWtlCisgICAgICAgICMgdGhpczoKKyAgICAgICAgIworICAgICAgICAjIFBhcmVudCAgICAgICAgICAgICAgICAgICBDaGlsZAorICAgICAgICAjIC0tLS0tLSAgICAgICAgICAgICAgICAgICAtLS0tLQorICAgICAgICAjIHAyY3dyaXRlICAgLS0tc3RkaW4tLS0+ICBwMmNyZWFkCisgICAgICAgICMgYzJwcmVhZCAgICA8LS1zdGRvdXQtLS0gIGMycHdyaXRlCisgICAgICAgICMgZXJycmVhZCAgICA8LS1zdGRlcnItLS0gIGVycndyaXRlCisgICAgICAgICMKKyAgICAgICAgIyBPbiBQT1NJWCwgdGhlIGNoaWxkIG9iamVjdHMgYXJlIGZpbGUgZGVzY3JpcHRvcnMuICBPbgorICAgICAgICAjIFdpbmRvd3MsIHRoZXNlIGFyZSBXaW5kb3dzIGZpbGUgaGFuZGxlcy4gIFRoZSBwYXJlbnQgb2JqZWN0cworICAgICAgICAjIGFyZSBmaWxlIGRlc2NyaXB0b3JzIG9uIGJvdGggcGxhdGZvcm1zLiAgVGhlIHBhcmVudCBvYmplY3RzCisgICAgICAgICMgYXJlIE5vbmUgd2hlbiBub3QgdXNpbmcgUElQRXMuIFRoZSBjaGlsZCBvYmplY3RzIGFyZSBOb25lCisgICAgICAgICMgd2hlbiBub3QgcmVkaXJlY3RpbmcuCisKKyAgICAgICAgKHAyY3JlYWQsIHAyY3dyaXRlLAorICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCisgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSkgPSBzZWxmLl9nZXRfaGFuZGxlcyhzdGRpbiwgc3Rkb3V0LCBzdGRlcnIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fZXhlY3V0ZV9jaGlsZChhcmdzLCBleGVjdXRhYmxlLCBwcmVleGVjX2ZuLCBjbG9zZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZCwgZW52LCB1bml2ZXJzYWxfbmV3bGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvLCBjcmVhdGlvbmZsYWdzLCBzaGVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICMgUHJlc2VydmUgb3JpZ2luYWwgZXhjZXB0aW9uIGluIGNhc2Ugb3MuY2xvc2UgcmFpc2VzLgorICAgICAgICAgICAgZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RyYWNlID0gc3lzLmV4Y19pbmZvKCkKKworICAgICAgICAgICAgdG9fY2xvc2UgPSBbXQorICAgICAgICAgICAgIyBPbmx5IGNsb3NlIHRoZSBwaXBlcyB3ZSBjcmVhdGVkLgorICAgICAgICAgICAgaWYgc3RkaW4gPT0gUElQRToKKyAgICAgICAgICAgICAgICB0b19jbG9zZS5leHRlbmQoKHAyY3JlYWQsIHAyY3dyaXRlKSkKKyAgICAgICAgICAgIGlmIHN0ZG91dCA9PSBQSVBFOgorICAgICAgICAgICAgICAgIHRvX2Nsb3NlLmV4dGVuZCgoYzJwcmVhZCwgYzJwd3JpdGUpKQorICAgICAgICAgICAgaWYgc3RkZXJyID09IFBJUEU6CisgICAgICAgICAgICAgICAgdG9fY2xvc2UuZXh0ZW5kKChlcnJyZWFkLCBlcnJ3cml0ZSkpCisKKyAgICAgICAgICAgIGZvciBmZCBpbiB0b19jbG9zZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHJhaXNlIGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190cmFjZQorCisgICAgICAgIGlmIG1zd2luZG93czoKKyAgICAgICAgICAgIGlmIHAyY3dyaXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHAyY3dyaXRlID0gbXN2Y3J0Lm9wZW5fb3NmaGFuZGxlKHAyY3dyaXRlLkRldGFjaCgpLCAwKQorICAgICAgICAgICAgaWYgYzJwcmVhZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjMnByZWFkID0gbXN2Y3J0Lm9wZW5fb3NmaGFuZGxlKGMycHJlYWQuRGV0YWNoKCksIDApCisgICAgICAgICAgICBpZiBlcnJyZWFkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGVycnJlYWQgPSBtc3ZjcnQub3Blbl9vc2ZoYW5kbGUoZXJycmVhZC5EZXRhY2goKSwgMCkKKworICAgICAgICBpZiBwMmN3cml0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc3RkaW4gPSBvcy5mZG9wZW4ocDJjd3JpdGUsICd3YicsIGJ1ZnNpemUpCisgICAgICAgIGlmIGMycHJlYWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiB1bml2ZXJzYWxfbmV3bGluZXM6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQgPSBvcy5mZG9wZW4oYzJwcmVhZCwgJ3JVJywgYnVmc2l6ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQgPSBvcy5mZG9wZW4oYzJwcmVhZCwgJ3JiJywgYnVmc2l6ZSkKKyAgICAgICAgaWYgZXJycmVhZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHVuaXZlcnNhbF9uZXdsaW5lczoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZGVyciA9IG9zLmZkb3BlbihlcnJyZWFkLCAnclUnLCBidWZzaXplKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZGVyciA9IG9zLmZkb3BlbihlcnJyZWFkLCAncmInLCBidWZzaXplKQorCisKKyAgICBkZWYgX3RyYW5zbGF0ZV9uZXdsaW5lcyhzZWxmLCBkYXRhKToKKyAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiXHJcbiIsICJcbiIpCisgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlxyIiwgIlxuIikKKyAgICAgICAgcmV0dXJuIGRhdGEKKworCisgICAgZGVmIF9fZGVsX18oc2VsZiwgX21heGludD1zeXMubWF4aW50LCBfYWN0aXZlPV9hY3RpdmUpOgorICAgICAgICAjIElmIF9faW5pdF9fIGhhc24ndCBoYWQgYSBjaGFuY2UgdG8gZXhlY3V0ZSAoZS5nLiBpZiBpdAorICAgICAgICAjIHdhcyBwYXNzZWQgYW4gdW5kZWNsYXJlZCBrZXl3b3JkIGFyZ3VtZW50KSwgd2UgZG9uJ3QKKyAgICAgICAgIyBoYXZlIGEgX2NoaWxkX2NyZWF0ZWQgYXR0cmlidXRlIGF0IGFsbC4KKyAgICAgICAgaWYgbm90IGdldGF0dHIoc2VsZiwgJ19jaGlsZF9jcmVhdGVkJywgRmFsc2UpOgorICAgICAgICAgICAgIyBXZSBkaWRuJ3QgZ2V0IHRvIHN1Y2Nlc3NmdWxseSBjcmVhdGUgYSBjaGlsZCBwcm9jZXNzLgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgSW4gY2FzZSB0aGUgY2hpbGQgaGFzbid0IGJlZW4gd2FpdGVkIG9uLCBjaGVjayBpZiBpdCdzIGRvbmUuCisgICAgICAgIHNlbGYuX2ludGVybmFsX3BvbGwoX2RlYWRzdGF0ZT1fbWF4aW50KQorICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZSBhbmQgX2FjdGl2ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgQ2hpbGQgaXMgc3RpbGwgcnVubmluZywga2VlcCB1cyBhbGl2ZSB1bnRpbCB3ZSBjYW4gd2FpdCBvbiBpdC4KKyAgICAgICAgICAgIF9hY3RpdmUuYXBwZW5kKHNlbGYpCisKKworICAgIGRlZiBjb21tdW5pY2F0ZShzZWxmLCBpbnB1dD1Ob25lKToKKyAgICAgICAgIiIiSW50ZXJhY3Qgd2l0aCBwcm9jZXNzOiBTZW5kIGRhdGEgdG8gc3RkaW4uICBSZWFkIGRhdGEgZnJvbQorICAgICAgICBzdGRvdXQgYW5kIHN0ZGVyciwgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4gIFdhaXQgZm9yCisgICAgICAgIHByb2Nlc3MgdG8gdGVybWluYXRlLiAgVGhlIG9wdGlvbmFsIGlucHV0IGFyZ3VtZW50IHNob3VsZCBiZSBhCisgICAgICAgIHN0cmluZyB0byBiZSBzZW50IHRvIHRoZSBjaGlsZCBwcm9jZXNzLCBvciBOb25lLCBpZiBubyBkYXRhCisgICAgICAgIHNob3VsZCBiZSBzZW50IHRvIHRoZSBjaGlsZC4KKworICAgICAgICBjb21tdW5pY2F0ZSgpIHJldHVybnMgYSB0dXBsZSAoc3Rkb3V0LCBzdGRlcnIpLiIiIgorCisgICAgICAgICMgT3B0aW1pemF0aW9uOiBJZiB3ZSBhcmUgb25seSB1c2luZyBvbmUgcGlwZSwgb3Igbm8gcGlwZSBhdAorICAgICAgICAjIGFsbCwgdXNpbmcgc2VsZWN0KCkgb3IgdGhyZWFkcyBpcyB1bm5lY2Vzc2FyeS4KKyAgICAgICAgaWYgW3NlbGYuc3RkaW4sIHNlbGYuc3Rkb3V0LCBzZWxmLnN0ZGVycl0uY291bnQoTm9uZSkgPj0gMjoKKyAgICAgICAgICAgIHN0ZG91dCA9IE5vbmUKKyAgICAgICAgICAgIHN0ZGVyciA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkaW46CisgICAgICAgICAgICAgICAgaWYgaW5wdXQ6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4ud3JpdGUoaW5wdXQpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVQSVBFIGFuZCBlLmVycm5vICE9IGVycm5vLkVJTlZBTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4uY2xvc2UoKQorICAgICAgICAgICAgZWxpZiBzZWxmLnN0ZG91dDoKKyAgICAgICAgICAgICAgICBzdGRvdXQgPSBfZWludHJfcmV0cnlfY2FsbChzZWxmLnN0ZG91dC5yZWFkKQorICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LmNsb3NlKCkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5zdGRlcnI6CisgICAgICAgICAgICAgICAgc3RkZXJyID0gX2VpbnRyX3JldHJ5X2NhbGwoc2VsZi5zdGRlcnIucmVhZCkKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZGVyci5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLndhaXQoKQorICAgICAgICAgICAgcmV0dXJuIChzdGRvdXQsIHN0ZGVycikKKworICAgICAgICByZXR1cm4gc2VsZi5fY29tbXVuaWNhdGUoaW5wdXQpCisKKworICAgIGRlZiBwb2xsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faW50ZXJuYWxfcG9sbCgpCisKKworICAgIGlmIG1zd2luZG93czoKKyAgICAgICAgIworICAgICAgICAjIFdpbmRvd3MgbWV0aG9kcworICAgICAgICAjCisgICAgICAgIGRlZiBfZ2V0X2hhbmRsZXMoc2VsZiwgc3RkaW4sIHN0ZG91dCwgc3RkZXJyKToKKyAgICAgICAgICAgICIiIkNvbnN0cnVjdCBhbmQgcmV0dXJuIHR1cGxlIHdpdGggSU8gb2JqZWN0czoKKyAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLCBjMnByZWFkLCBjMnB3cml0ZSwgZXJycmVhZCwgZXJyd3JpdGUKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgaWYgc3RkaW4gaXMgTm9uZSBhbmQgc3Rkb3V0IGlzIE5vbmUgYW5kIHN0ZGVyciBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiAoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkKKworICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUgPSBOb25lLCBOb25lCisgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSA9IE5vbmUsIE5vbmUKKyAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlID0gTm9uZSwgTm9uZQorCisgICAgICAgICAgICBpZiBzdGRpbiBpcyBOb25lOgorICAgICAgICAgICAgICAgIHAyY3JlYWQgPSBfc3VicHJvY2Vzcy5HZXRTdGRIYW5kbGUoX3N1YnByb2Nlc3MuU1REX0lOUFVUX0hBTkRMRSkKKyAgICAgICAgICAgICAgICBpZiBwMmNyZWFkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHAyY3JlYWQsIF8gPSBfc3VicHJvY2Vzcy5DcmVhdGVQaXBlKE5vbmUsIDApCisgICAgICAgICAgICBlbGlmIHN0ZGluID09IFBJUEU6CisgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUgPSBfc3VicHJvY2Vzcy5DcmVhdGVQaXBlKE5vbmUsIDApCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3RkaW4sIGludCk6CisgICAgICAgICAgICAgICAgcDJjcmVhZCA9IG1zdmNydC5nZXRfb3NmaGFuZGxlKHN0ZGluKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEFzc3VtaW5nIGZpbGUtbGlrZSBvYmplY3QKKyAgICAgICAgICAgICAgICBwMmNyZWFkID0gbXN2Y3J0LmdldF9vc2ZoYW5kbGUoc3RkaW4uZmlsZW5vKCkpCisgICAgICAgICAgICBwMmNyZWFkID0gc2VsZi5fbWFrZV9pbmhlcml0YWJsZShwMmNyZWFkKQorCisgICAgICAgICAgICBpZiBzdGRvdXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjMnB3cml0ZSA9IF9zdWJwcm9jZXNzLkdldFN0ZEhhbmRsZShfc3VicHJvY2Vzcy5TVERfT1VUUFVUX0hBTkRMRSkKKyAgICAgICAgICAgICAgICBpZiBjMnB3cml0ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBfLCBjMnB3cml0ZSA9IF9zdWJwcm9jZXNzLkNyZWF0ZVBpcGUoTm9uZSwgMCkKKyAgICAgICAgICAgIGVsaWYgc3Rkb3V0ID09IFBJUEU6CisgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUgPSBfc3VicHJvY2Vzcy5DcmVhdGVQaXBlKE5vbmUsIDApCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3Rkb3V0LCBpbnQpOgorICAgICAgICAgICAgICAgIGMycHdyaXRlID0gbXN2Y3J0LmdldF9vc2ZoYW5kbGUoc3Rkb3V0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEFzc3VtaW5nIGZpbGUtbGlrZSBvYmplY3QKKyAgICAgICAgICAgICAgICBjMnB3cml0ZSA9IG1zdmNydC5nZXRfb3NmaGFuZGxlKHN0ZG91dC5maWxlbm8oKSkKKyAgICAgICAgICAgIGMycHdyaXRlID0gc2VsZi5fbWFrZV9pbmhlcml0YWJsZShjMnB3cml0ZSkKKworICAgICAgICAgICAgaWYgc3RkZXJyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBfc3VicHJvY2Vzcy5HZXRTdGRIYW5kbGUoX3N1YnByb2Nlc3MuU1REX0VSUk9SX0hBTkRMRSkKKyAgICAgICAgICAgICAgICBpZiBlcnJ3cml0ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBfLCBlcnJ3cml0ZSA9IF9zdWJwcm9jZXNzLkNyZWF0ZVBpcGUoTm9uZSwgMCkKKyAgICAgICAgICAgIGVsaWYgc3RkZXJyID09IFBJUEU6CisgICAgICAgICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUgPSBfc3VicHJvY2Vzcy5DcmVhdGVQaXBlKE5vbmUsIDApCisgICAgICAgICAgICBlbGlmIHN0ZGVyciA9PSBTVERPVVQ6CisgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBjMnB3cml0ZQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN0ZGVyciwgaW50KToKKyAgICAgICAgICAgICAgICBlcnJ3cml0ZSA9IG1zdmNydC5nZXRfb3NmaGFuZGxlKHN0ZGVycikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBtc3ZjcnQuZ2V0X29zZmhhbmRsZShzdGRlcnIuZmlsZW5vKCkpCisgICAgICAgICAgICBlcnJ3cml0ZSA9IHNlbGYuX21ha2VfaW5oZXJpdGFibGUoZXJyd3JpdGUpCisKKyAgICAgICAgICAgIHJldHVybiAocDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlLAorICAgICAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSkKKworCisgICAgICAgIGRlZiBfbWFrZV9pbmhlcml0YWJsZShzZWxmLCBoYW5kbGUpOgorICAgICAgICAgICAgIiIiUmV0dXJuIGEgZHVwbGljYXRlIG9mIGhhbmRsZSwgd2hpY2ggaXMgaW5oZXJpdGFibGUiIiIKKyAgICAgICAgICAgIHJldHVybiBfc3VicHJvY2Vzcy5EdXBsaWNhdGVIYW5kbGUoX3N1YnByb2Nlc3MuR2V0Q3VycmVudFByb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLCBfc3VicHJvY2Vzcy5HZXRDdXJyZW50UHJvY2VzcygpLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3VicHJvY2Vzcy5EVVBMSUNBVEVfU0FNRV9BQ0NFU1MpCisKKworICAgICAgICBkZWYgX2ZpbmRfdzl4cG9wZW4oc2VsZik6CisgICAgICAgICAgICAiIiJGaW5kIGFuZCByZXR1cm4gYWJzb2x1dCBwYXRoIHRvIHc5eHBvcGVuLmV4ZSIiIgorICAgICAgICAgICAgdzl4cG9wZW4gPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKF9zdWJwcm9jZXNzLkdldE1vZHVsZUZpbGVOYW1lKDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3OXhwb3Blbi5leGUiKQorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHc5eHBvcGVuKToKKyAgICAgICAgICAgICAgICAjIEVlZWsgLSBmaWxlLW5vdC1mb3VuZCAtIHBvc3NpYmx5IGFuIGVtYmVkZGluZworICAgICAgICAgICAgICAgICMgc2l0dWF0aW9uIC0gc2VlIGlmIHdlIGNhbiBsb2NhdGUgaXQgaW4gc3lzLmV4ZWNfcHJlZml4CisgICAgICAgICAgICAgICAgdzl4cG9wZW4gPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHN5cy5leGVjX3ByZWZpeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInc5eHBvcGVuLmV4ZSIpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHc5eHBvcGVuKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgbG9jYXRlIHc5eHBvcGVuLmV4ZSwgd2hpY2ggaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWRlZCBmb3IgUG9wZW4gdG8gd29yayB3aXRoIHlvdXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNoZWxsIG9yIHBsYXRmb3JtLiIpCisgICAgICAgICAgICByZXR1cm4gdzl4cG9wZW4KKworCisgICAgICAgIGRlZiBfZXhlY3V0ZV9jaGlsZChzZWxmLCBhcmdzLCBleGVjdXRhYmxlLCBwcmVleGVjX2ZuLCBjbG9zZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsIGVudiwgdW5pdmVyc2FsX25ld2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8sIGNyZWF0aW9uZmxhZ3MsIHNoZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKToKKyAgICAgICAgICAgICIiIkV4ZWN1dGUgcHJvZ3JhbSAoTVMgV2luZG93cyB2ZXJzaW9uKSIiIgorCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhcmdzLCB0eXBlcy5TdHJpbmdUeXBlcyk6CisgICAgICAgICAgICAgICAgYXJncyA9IGxpc3QyY21kbGluZShhcmdzKQorCisgICAgICAgICAgICAjIFByb2Nlc3Mgc3RhcnR1cCBkZXRhaWxzCisgICAgICAgICAgICBpZiBzdGFydHVwaW5mbyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvID0gU1RBUlRVUElORk8oKQorICAgICAgICAgICAgaWYgTm9uZSBub3QgaW4gKHAyY3JlYWQsIGMycHdyaXRlLCBlcnJ3cml0ZSk6CisgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8uZHdGbGFncyB8PSBfc3VicHJvY2Vzcy5TVEFSVEZfVVNFU1RESEFORExFUworICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvLmhTdGRJbnB1dCA9IHAyY3JlYWQKKyAgICAgICAgICAgICAgICBzdGFydHVwaW5mby5oU3RkT3V0cHV0ID0gYzJwd3JpdGUKKyAgICAgICAgICAgICAgICBzdGFydHVwaW5mby5oU3RkRXJyb3IgPSBlcnJ3cml0ZQorCisgICAgICAgICAgICBpZiBzaGVsbDoKKyAgICAgICAgICAgICAgICBzdGFydHVwaW5mby5kd0ZsYWdzIHw9IF9zdWJwcm9jZXNzLlNUQVJURl9VU0VTSE9XV0lORE9XCisgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8ud1Nob3dXaW5kb3cgPSBfc3VicHJvY2Vzcy5TV19ISURFCisgICAgICAgICAgICAgICAgY29tc3BlYyA9IG9zLmVudmlyb24uZ2V0KCJDT01TUEVDIiwgImNtZC5leGUiKQorICAgICAgICAgICAgICAgIGFyZ3MgPSAne30gL2MgInt9IicuZm9ybWF0IChjb21zcGVjLCBhcmdzKQorICAgICAgICAgICAgICAgIGlmIChfc3VicHJvY2Vzcy5HZXRWZXJzaW9uKCkgPj0gMHg4MDAwMDAwMCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShjb21zcGVjKS5sb3dlcigpID09ICJjb21tYW5kLmNvbSIpOgorICAgICAgICAgICAgICAgICAgICAjIFdpbjl4LCBvciB1c2luZyBjb21tYW5kLmNvbSBvbiBOVC4gV2UgbmVlZCB0bworICAgICAgICAgICAgICAgICAgICAjIHVzZSB0aGUgdzl4cG9wZW4gaW50ZXJtZWRpYXRlIHByb2dyYW0uIEZvciBtb3JlCisgICAgICAgICAgICAgICAgICAgICMgaW5mb3JtYXRpb24sIHNlZSBLQiBRMTUwOTU2CisgICAgICAgICAgICAgICAgICAgICMgKGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMDExMTA1MDg0MDAyL2h0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20vc3VwcG9ydC9rYi9hcnRpY2xlcy9RMTUwLzkvNTYuYXNwKQorICAgICAgICAgICAgICAgICAgICB3OXhwb3BlbiA9IHNlbGYuX2ZpbmRfdzl4cG9wZW4oKQorICAgICAgICAgICAgICAgICAgICBhcmdzID0gJyIlcyIgJXMnICUgKHc5eHBvcGVuLCBhcmdzKQorICAgICAgICAgICAgICAgICAgICAjIE5vdCBwYXNzaW5nIENSRUFURV9ORVdfQ09OU09MRSBoYXMgYmVlbiBrbm93biB0bworICAgICAgICAgICAgICAgICAgICAjIGNhdXNlIHJhbmRvbSBmYWlsdXJlcyBvbiB3aW45eC4gIFNwZWNpZmljYWxseSBhCisgICAgICAgICAgICAgICAgICAgICMgZGlhbG9nOiAiWW91ciBwcm9ncmFtIGFjY2Vzc2VkIG1lbSBjdXJyZW50bHkgaW4KKyAgICAgICAgICAgICAgICAgICAgIyB1c2UgYXQgeHh4IiBhbmQgYSBob3BlZnVsIHdhcm5pbmcgYWJvdXQgdGhlCisgICAgICAgICAgICAgICAgICAgICMgc3RhYmlsaXR5IG9mIHlvdXIgc3lzdGVtLiAgQ29zdCBpcyBDdHJsK0Mgd29udAorICAgICAgICAgICAgICAgICAgICAjIGtpbGwgY2hpbGRyZW4uCisgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uZmxhZ3MgfD0gX3N1YnByb2Nlc3MuQ1JFQVRFX05FV19DT05TT0xFCisKKyAgICAgICAgICAgICMgU3RhcnQgdGhlIHByb2Nlc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBocCwgaHQsIHBpZCwgdGlkID0gX3N1YnByb2Nlc3MuQ3JlYXRlUHJvY2VzcyhleGVjdXRhYmxlLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHNwZWNpYWwgc2VjdXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KG5vdCBjbG9zZV9mZHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8pCisgICAgICAgICAgICBleGNlcHQgcHl3aW50eXBlcy5lcnJvciwgZToKKyAgICAgICAgICAgICAgICAjIFRyYW5zbGF0ZSBweXdpbnR5cGVzLmVycm9yIHRvIFdpbmRvd3NFcnJvciwgd2hpY2ggaXMKKyAgICAgICAgICAgICAgICAjIGEgc3ViY2xhc3Mgb2YgT1NFcnJvci4gIEZJWE1FOiBXZSBzaG91bGQgcmVhbGx5CisgICAgICAgICAgICAgICAgIyB0cmFuc2xhdGUgZXJybm8gdXNpbmcgX3N5c19lcnJsaXN0IChvciBzaW1pbGFyKSwgYnV0CisgICAgICAgICAgICAgICAgIyBob3cgY2FuIHRoaXMgYmUgZG9uZSBmcm9tIFB5dGhvbj8KKyAgICAgICAgICAgICAgICByYWlzZSBXaW5kb3dzRXJyb3IoKmUuYXJncykKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgIyBDaGlsZCBpcyBsYXVuY2hlZC4gQ2xvc2UgdGhlIHBhcmVudCdzIGNvcHkgb2YgdGhvc2UgcGlwZQorICAgICAgICAgICAgICAgICMgaGFuZGxlcyB0aGF0IG9ubHkgdGhlIGNoaWxkIHNob3VsZCBoYXZlIG9wZW4uICBZb3UgbmVlZAorICAgICAgICAgICAgICAgICMgdG8gbWFrZSBzdXJlIHRoYXQgbm8gaGFuZGxlcyB0byB0aGUgd3JpdGUgZW5kIG9mIHRoZQorICAgICAgICAgICAgICAgICMgb3V0cHV0IHBpcGUgYXJlIG1haW50YWluZWQgaW4gdGhpcyBwcm9jZXNzIG9yIGVsc2UgdGhlCisgICAgICAgICAgICAgICAgIyBwaXBlIHdpbGwgbm90IGNsb3NlIHdoZW4gdGhlIGNoaWxkIHByb2Nlc3MgZXhpdHMgYW5kIHRoZQorICAgICAgICAgICAgICAgICMgUmVhZEZpbGUgd2lsbCBoYW5nLgorICAgICAgICAgICAgICAgIGlmIHAyY3JlYWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHAyY3JlYWQuQ2xvc2UoKQorICAgICAgICAgICAgICAgIGlmIGMycHdyaXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBjMnB3cml0ZS5DbG9zZSgpCisgICAgICAgICAgICAgICAgaWYgZXJyd3JpdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGVycndyaXRlLkNsb3NlKCkKKworICAgICAgICAgICAgIyBSZXRhaW4gdGhlIHByb2Nlc3MgaGFuZGxlLCBidXQgY2xvc2UgdGhlIHRocmVhZCBoYW5kbGUKKyAgICAgICAgICAgIHNlbGYuX2NoaWxkX2NyZWF0ZWQgPSBUcnVlCisgICAgICAgICAgICBzZWxmLl9oYW5kbGUgPSBocAorICAgICAgICAgICAgc2VsZi5waWQgPSBwaWQKKyAgICAgICAgICAgIGh0LkNsb3NlKCkKKworICAgICAgICBkZWYgX2ludGVybmFsX3BvbGwoc2VsZiwgX2RlYWRzdGF0ZT1Ob25lLAorICAgICAgICAgICAgICAgIF9XYWl0Rm9yU2luZ2xlT2JqZWN0PV9zdWJwcm9jZXNzLldhaXRGb3JTaW5nbGVPYmplY3QsCisgICAgICAgICAgICAgICAgX1dBSVRfT0JKRUNUXzA9X3N1YnByb2Nlc3MuV0FJVF9PQkpFQ1RfMCwKKyAgICAgICAgICAgICAgICBfR2V0RXhpdENvZGVQcm9jZXNzPV9zdWJwcm9jZXNzLkdldEV4aXRDb2RlUHJvY2Vzcyk6CisgICAgICAgICAgICAiIiJDaGVjayBpZiBjaGlsZCBwcm9jZXNzIGhhcyB0ZXJtaW5hdGVkLiAgUmV0dXJucyByZXR1cm5jb2RlCisgICAgICAgICAgICBhdHRyaWJ1dGUuCisKKyAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBfX2RlbF9fLCBzbyBpdCBjYW4gb25seSByZWZlciB0byBvYmplY3RzCisgICAgICAgICAgICBpbiBpdHMgbG9jYWwgc2NvcGUuCisKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgX1dhaXRGb3JTaW5nbGVPYmplY3Qoc2VsZi5faGFuZGxlLCAwKSA9PSBfV0FJVF9PQkpFQ1RfMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gX0dldEV4aXRDb2RlUHJvY2VzcyhzZWxmLl9oYW5kbGUpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCisKKworICAgICAgICBkZWYgd2FpdChzZWxmKToKKyAgICAgICAgICAgICIiIldhaXQgZm9yIGNoaWxkIHByb2Nlc3MgdG8gdGVybWluYXRlLiAgUmV0dXJucyByZXR1cm5jb2RlCisgICAgICAgICAgICBhdHRyaWJ1dGUuIiIiCisgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBfc3VicHJvY2Vzcy5XYWl0Rm9yU2luZ2xlT2JqZWN0KHNlbGYuX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdWJwcm9jZXNzLklORklOSVRFKQorICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IF9zdWJwcm9jZXNzLkdldEV4aXRDb2RlUHJvY2VzcyhzZWxmLl9oYW5kbGUpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCisKKworICAgICAgICBkZWYgX3JlYWRlcnRocmVhZChzZWxmLCBmaCwgYnVmZmVyKToKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoZmgucmVhZCgpKQorCisKKyAgICAgICAgZGVmIF9jb21tdW5pY2F0ZShzZWxmLCBpbnB1dCk6CisgICAgICAgICAgICBzdGRvdXQgPSBOb25lICMgUmV0dXJuCisgICAgICAgICAgICBzdGRlcnIgPSBOb25lICMgUmV0dXJuCisKKyAgICAgICAgICAgIGlmIHNlbGYuc3Rkb3V0OgorICAgICAgICAgICAgICAgIHN0ZG91dCA9IFtdCisgICAgICAgICAgICAgICAgc3Rkb3V0X3RocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuX3JlYWRlcnRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShzZWxmLnN0ZG91dCwgc3Rkb3V0KSkKKyAgICAgICAgICAgICAgICBzdGRvdXRfdGhyZWFkLnNldERhZW1vbihUcnVlKQorICAgICAgICAgICAgICAgIHN0ZG91dF90aHJlYWQuc3RhcnQoKQorICAgICAgICAgICAgaWYgc2VsZi5zdGRlcnI6CisgICAgICAgICAgICAgICAgc3RkZXJyID0gW10KKyAgICAgICAgICAgICAgICBzdGRlcnJfdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5fcmVhZGVydGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHNlbGYuc3RkZXJyLCBzdGRlcnIpKQorICAgICAgICAgICAgICAgIHN0ZGVycl90aHJlYWQuc2V0RGFlbW9uKFRydWUpCisgICAgICAgICAgICAgICAgc3RkZXJyX3RocmVhZC5zdGFydCgpCisKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkaW46CisgICAgICAgICAgICAgICAgaWYgaW5wdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4ud3JpdGUoaW5wdXQpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVQSVBFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgc2VsZi5zdGRpbi5jbG9zZSgpCisKKyAgICAgICAgICAgIGlmIHNlbGYuc3Rkb3V0OgorICAgICAgICAgICAgICAgIHN0ZG91dF90aHJlYWQuam9pbigpCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGVycjoKKyAgICAgICAgICAgICAgICBzdGRlcnJfdGhyZWFkLmpvaW4oKQorCisgICAgICAgICAgICAjIEFsbCBkYXRhIGV4Y2hhbmdlZC4gIFRyYW5zbGF0ZSBsaXN0cyBpbnRvIHN0cmluZ3MuCisgICAgICAgICAgICBpZiBzdGRvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc3Rkb3V0WzBdCisgICAgICAgICAgICBpZiBzdGRlcnIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc3RkZXJyID0gc3RkZXJyWzBdCisKKyAgICAgICAgICAgICMgVHJhbnNsYXRlIG5ld2xpbmVzLCBpZiByZXF1ZXN0ZWQuICBXZSBjYW5ub3QgbGV0IHRoZSBmaWxlCisgICAgICAgICAgICAjIG9iamVjdCBkbyB0aGUgdHJhbnNsYXRpb246IEl0IGlzIGJhc2VkIG9uIHN0ZGlvLCB3aGljaCBpcworICAgICAgICAgICAgIyBpbXBvc3NpYmxlIHRvIGNvbWJpbmUgd2l0aCBzZWxlY3QgKHVubGVzcyBmb3JjaW5nIG5vCisgICAgICAgICAgICAjIGJ1ZmZlcmluZykuCisgICAgICAgICAgICBpZiBzZWxmLnVuaXZlcnNhbF9uZXdsaW5lcyBhbmQgaGFzYXR0cihmaWxlLCAnbmV3bGluZXMnKToKKyAgICAgICAgICAgICAgICBpZiBzdGRvdXQ6CisgICAgICAgICAgICAgICAgICAgIHN0ZG91dCA9IHNlbGYuX3RyYW5zbGF0ZV9uZXdsaW5lcyhzdGRvdXQpCisgICAgICAgICAgICAgICAgaWYgc3RkZXJyOgorICAgICAgICAgICAgICAgICAgICBzdGRlcnIgPSBzZWxmLl90cmFuc2xhdGVfbmV3bGluZXMoc3RkZXJyKQorCisgICAgICAgICAgICBzZWxmLndhaXQoKQorICAgICAgICAgICAgcmV0dXJuIChzdGRvdXQsIHN0ZGVycikKKworICAgICAgICBkZWYgc2VuZF9zaWduYWwoc2VsZiwgc2lnKToKKyAgICAgICAgICAgICIiIlNlbmQgYSBzaWduYWwgdG8gdGhlIHByb2Nlc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgaWYgc2lnID09IHNpZ25hbC5TSUdURVJNOgorICAgICAgICAgICAgICAgIHNlbGYudGVybWluYXRlKCkKKyAgICAgICAgICAgIGVsaWYgc2lnID09IHNpZ25hbC5DVFJMX0NfRVZFTlQ6CisgICAgICAgICAgICAgICAgb3Mua2lsbChzZWxmLnBpZCwgc2lnbmFsLkNUUkxfQ19FVkVOVCkKKyAgICAgICAgICAgIGVsaWYgc2lnID09IHNpZ25hbC5DVFJMX0JSRUFLX0VWRU5UOgorICAgICAgICAgICAgICAgIG9zLmtpbGwoc2VsZi5waWQsIHNpZ25hbC5DVFJMX0JSRUFLX0VWRU5UKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbnN1cHBvcnRlZCBzaWduYWw6IHt9Ii5mb3JtYXQoc2lnKSkKKworICAgICAgICBkZWYgdGVybWluYXRlKHNlbGYpOgorICAgICAgICAgICAgIiIiVGVybWluYXRlcyB0aGUgcHJvY2VzcworICAgICAgICAgICAgIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX3N1YnByb2Nlc3MuVGVybWluYXRlUHJvY2VzcyhzZWxmLl9oYW5kbGUsIDEpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICMgRVJST1JfQUNDRVNTX0RFTklFRCAod2luZXJyb3IgNSkgaXMgcmVjZWl2ZWQgd2hlbiB0aGUKKyAgICAgICAgICAgICAgICAjIHByb2Nlc3MgYWxyZWFkeSBkaWVkLgorICAgICAgICAgICAgICAgIGlmIGUud2luZXJyb3IgIT0gNToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICByYyA9IF9zdWJwcm9jZXNzLkdldEV4aXRDb2RlUHJvY2VzcyhzZWxmLl9oYW5kbGUpCisgICAgICAgICAgICAgICAgaWYgcmMgPT0gX3N1YnByb2Nlc3MuU1RJTExfQUNUSVZFOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IHJjCisKKyAgICAgICAga2lsbCA9IHRlcm1pbmF0ZQorCisgICAgZWxzZToKKyAgICAgICAgIworICAgICAgICAjIFBPU0lYIG1ldGhvZHMKKyAgICAgICAgIworICAgICAgICBkZWYgX2dldF9oYW5kbGVzKHNlbGYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVycik6CisgICAgICAgICAgICAiIiJDb25zdHJ1Y3QgYW5kIHJldHVybiB0dXBsZSB3aXRoIElPIG9iamVjdHM6CisgICAgICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSwgYzJwcmVhZCwgYzJwd3JpdGUsIGVycnJlYWQsIGVycndyaXRlCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlID0gTm9uZSwgTm9uZQorICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUgPSBOb25lLCBOb25lCisgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSA9IE5vbmUsIE5vbmUKKworICAgICAgICAgICAgaWYgc3RkaW4gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIHN0ZGluID09IFBJUEU6CisgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUgPSBzZWxmLnBpcGVfY2xvZXhlYygpCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3RkaW4sIGludCk6CisgICAgICAgICAgICAgICAgcDJjcmVhZCA9IHN0ZGluCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQXNzdW1pbmcgZmlsZS1saWtlIG9iamVjdAorICAgICAgICAgICAgICAgIHAyY3JlYWQgPSBzdGRpbi5maWxlbm8oKQorCisgICAgICAgICAgICBpZiBzdGRvdXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIHN0ZG91dCA9PSBQSVBFOgorICAgICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlID0gc2VsZi5waXBlX2Nsb2V4ZWMoKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN0ZG91dCwgaW50KToKKyAgICAgICAgICAgICAgICBjMnB3cml0ZSA9IHN0ZG91dAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEFzc3VtaW5nIGZpbGUtbGlrZSBvYmplY3QKKyAgICAgICAgICAgICAgICBjMnB3cml0ZSA9IHN0ZG91dC5maWxlbm8oKQorCisgICAgICAgICAgICBpZiBzdGRlcnIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIHN0ZGVyciA9PSBQSVBFOgorICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlID0gc2VsZi5waXBlX2Nsb2V4ZWMoKQorICAgICAgICAgICAgZWxpZiBzdGRlcnIgPT0gU1RET1VUOgorICAgICAgICAgICAgICAgIGVycndyaXRlID0gYzJwd3JpdGUKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzdGRlcnIsIGludCk6CisgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBzdGRlcnIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBzdGRlcnIuZmlsZW5vKCkKKworICAgICAgICAgICAgcmV0dXJuIChwMmNyZWFkLCBwMmN3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCisgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKQorCisKKyAgICAgICAgZGVmIF9zZXRfY2xvZXhlY19mbGFnKHNlbGYsIGZkLCBjbG9leGVjPVRydWUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsb2V4ZWNfZmxhZyA9IGZjbnRsLkZEX0NMT0VYRUMKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBjbG9leGVjX2ZsYWcgPSAxCisKKyAgICAgICAgICAgIG9sZCA9IGZjbnRsLmZjbnRsKGZkLCBmY250bC5GX0dFVEZEKQorICAgICAgICAgICAgaWYgY2xvZXhlYzoKKyAgICAgICAgICAgICAgICBmY250bC5mY250bChmZCwgZmNudGwuRl9TRVRGRCwgb2xkIHwgY2xvZXhlY19mbGFnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmY250bC5mY250bChmZCwgZmNudGwuRl9TRVRGRCwgb2xkICYgfmNsb2V4ZWNfZmxhZykKKworCisgICAgICAgIGRlZiBwaXBlX2Nsb2V4ZWMoc2VsZik6CisgICAgICAgICAgICAiIiJDcmVhdGUgYSBwaXBlIHdpdGggRkRzIHNldCBDTE9FWEVDLiIiIgorICAgICAgICAgICAgIyBQaXBlcycgRkRzIGFyZSBzZXQgQ0xPRVhFQyBieSBkZWZhdWx0IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0aGVtCisgICAgICAgICAgICAjIHRvIGJlIGluaGVyaXRlZCBieSBvdGhlciBzdWJwcm9jZXNzZXM6IHRoZSBDTE9FWEVDIGZsYWcgaXMgcmVtb3ZlZAorICAgICAgICAgICAgIyBmcm9tIHRoZSBjaGlsZCdzIEZEcyBieSBfZHVwMigpLCBiZXR3ZWVuIGZvcmsoKSBhbmQgZXhlYygpLgorICAgICAgICAgICAgIyBUaGlzIGlzIG5vdCBhdG9taWM6IHdlIHdvdWxkIG5lZWQgdGhlIHBpcGUyKCkgc3lzY2FsbCBmb3IgdGhhdC4KKyAgICAgICAgICAgIHIsIHcgPSBvcy5waXBlKCkKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbG9leGVjX2ZsYWcocikKKyAgICAgICAgICAgIHNlbGYuX3NldF9jbG9leGVjX2ZsYWcodykKKyAgICAgICAgICAgIHJldHVybiByLCB3CisKKworICAgICAgICBkZWYgX2Nsb3NlX2ZkcyhzZWxmLCBidXQpOgorICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgJ2Nsb3NlcmFuZ2UnKToKKyAgICAgICAgICAgICAgICBvcy5jbG9zZXJhbmdlKDMsIGJ1dCkKKyAgICAgICAgICAgICAgICBvcy5jbG9zZXJhbmdlKGJ1dCArIDEsIE1BWEZEKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMywgTUFYRkQpOgorICAgICAgICAgICAgICAgICAgICBpZiBpID09IGJ1dDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKGkpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworCisgICAgICAgIGRlZiBfZXhlY3V0ZV9jaGlsZChzZWxmLCBhcmdzLCBleGVjdXRhYmxlLCBwcmVleGVjX2ZuLCBjbG9zZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsIGVudiwgdW5pdmVyc2FsX25ld2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8sIGNyZWF0aW9uZmxhZ3MsIHNoZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKToKKyAgICAgICAgICAgICIiIkV4ZWN1dGUgcHJvZ3JhbSAoUE9TSVggdmVyc2lvbikiIiIKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmdzLCB0eXBlcy5TdHJpbmdUeXBlcyk6CisgICAgICAgICAgICAgICAgYXJncyA9IFthcmdzXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhcmdzID0gbGlzdChhcmdzKQorCisgICAgICAgICAgICBpZiBzaGVsbDoKKyAgICAgICAgICAgICAgICBhcmdzID0gWyIvYmluL3NoIiwgIi1jIl0gKyBhcmdzCisgICAgICAgICAgICAgICAgaWYgZXhlY3V0YWJsZToKKyAgICAgICAgICAgICAgICAgICAgYXJnc1swXSA9IGV4ZWN1dGFibGUKKworICAgICAgICAgICAgaWYgZXhlY3V0YWJsZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBhcmdzWzBdCisKKyAgICAgICAgICAgICMgRm9yIHRyYW5zZmVycmluZyBwb3NzaWJsZSBleGVjIGZhaWx1cmUgZnJvbSBjaGlsZCB0byBwYXJlbnQKKyAgICAgICAgICAgICMgVGhlIGZpcnN0IGNoYXIgc3BlY2lmaWVzIHRoZSBleGNlcHRpb24gdHlwZTogMCBtZWFucworICAgICAgICAgICAgIyBPU0Vycm9yLCAxIG1lYW5zIHNvbWUgb3RoZXIgZXJyb3IuCisgICAgICAgICAgICBlcnJwaXBlX3JlYWQsIGVycnBpcGVfd3JpdGUgPSBzZWxmLnBpcGVfY2xvZXhlYygpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBnY193YXNfZW5hYmxlZCA9IGdjLmlzZW5hYmxlZCgpCisgICAgICAgICAgICAgICAgICAgICMgRGlzYWJsZSBnYyB0byBhdm9pZCBidWcgd2hlcmUgZ2MgLT4gZmlsZV9kZWFsbG9jIC0+CisgICAgICAgICAgICAgICAgICAgICMgd3JpdGUgdG8gc3RkZXJyIC0+IGhhbmcuICBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTMzNgorICAgICAgICAgICAgICAgICAgICBnYy5kaXNhYmxlKCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5waWQgPSBvcy5mb3JrKCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZ2Nfd2FzX2VuYWJsZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2MuZW5hYmxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NoaWxkX2NyZWF0ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucGlkID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAjIENoaWxkCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDbG9zZSBwYXJlbnQncyBwaXBlIGVuZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBwMmN3cml0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UocDJjd3JpdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYzJwcmVhZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoYzJwcmVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcnJyZWFkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShlcnJyZWFkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKGVycnBpcGVfcmVhZCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2hlbiBkdXBpbmcgZmRzLCBpZiB0aGVyZSBhcmlzZXMgYSBzaXR1YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdoZXJlIG9uZSBvZiB0aGUgZmRzIGlzIGVpdGhlciAwLCAxIG9yIDIsIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpcyBwb3NzaWJsZSB0aGF0IGl0IGlzIG92ZXJ3cml0dGVuICgjMTI2MDcpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGMycHdyaXRlID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMycHdyaXRlID0gb3MuZHVwKGMycHdyaXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVycndyaXRlID09IDAgb3IgZXJyd3JpdGUgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBvcy5kdXAoZXJyd3JpdGUpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIER1cCBmZHMgZm9yIGNoaWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIF9kdXAyKGEsIGIpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGR1cDIoKSByZW1vdmVzIHRoZSBDTE9FWEVDIGZsYWcgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2UgbXVzdCBkbyBpdCBvdXJzZWx2ZXMgaWYgZHVwMigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd291bGQgYmUgYSBuby1vcCAoaXNzdWUgIzEwODA2KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYSA9PSBiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2V0X2Nsb2V4ZWNfZmxhZyhhLCBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuZHVwMihhLCBiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdXAyKHAyY3JlYWQsIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1cDIoYzJwd3JpdGUsIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1cDIoZXJyd3JpdGUsIDIpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENsb3NlIHBpcGUgZmRzLiAgTWFrZSBzdXJlIHdlIGRvbid0IGNsb3NlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2FtZSBmZCBtb3JlIHRoYW4gb25jZSwgb3Igc3RhbmRhcmQgZmRzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlZCA9IHsgTm9uZSB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZkIGluIFtwMmNyZWFkLCBjMnB3cml0ZSwgZXJyd3JpdGVdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmZCBub3QgaW4gY2xvc2VkIGFuZCBmZCA+IDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlZC5hZGQoZmQpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENsb3NlIGFsbCBvdGhlciBmZHMsIGlmIGFza2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNsb3NlX2ZkczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY2xvc2VfZmRzKGJ1dD1lcnJwaXBlX3dyaXRlKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY3dkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5jaGRpcihjd2QpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBwcmVleGVjX2ZuOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVleGVjX2ZuKCkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVudiBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5leGVjdnAoZXhlY3V0YWJsZSwgYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5leGVjdnBlKGV4ZWN1dGFibGUsIGFyZ3MsIGVudikKKworICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y190eXBlLCBleGNfdmFsdWUsIHRiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNhdmUgdGhlIHRyYWNlYmFjayBhbmQgYXR0YWNoIGl0IHRvIHRoZSBleGNlcHRpb24gb2JqZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjX2xpbmVzID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb24oZXhjX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y192YWx1ZS5jaGlsZF90cmFjZWJhY2sgPSAnJy5qb2luKGV4Y19saW5lcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy53cml0ZShlcnJwaXBlX3dyaXRlLCBwaWNrbGUuZHVtcHMoZXhjX3ZhbHVlKSkKKworICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGV4aXRjb2RlIHdvbid0IGJlIHJlcG9ydGVkIHRvIGFwcGxpY2F0aW9ucywgc28gaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgcmVhbGx5IGRvZXNuJ3QgbWF0dGVyIHdoYXQgd2UgcmV0dXJuLgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoMjU1KQorCisgICAgICAgICAgICAgICAgICAgICMgUGFyZW50CisgICAgICAgICAgICAgICAgICAgIGlmIGdjX3dhc19lbmFibGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgZ2MuZW5hYmxlKCkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICAjIGJlIHN1cmUgdGhlIEZEIGlzIGNsb3NlZCBubyBtYXR0ZXIgd2hhdAorICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShlcnJwaXBlX3dyaXRlKQorCisgICAgICAgICAgICAgICAgaWYgcDJjcmVhZCBpcyBub3QgTm9uZSBhbmQgcDJjd3JpdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKHAyY3JlYWQpCisgICAgICAgICAgICAgICAgaWYgYzJwd3JpdGUgaXMgbm90IE5vbmUgYW5kIGMycHJlYWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKGMycHdyaXRlKQorICAgICAgICAgICAgICAgIGlmIGVycndyaXRlIGlzIG5vdCBOb25lIGFuZCBlcnJyZWFkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShlcnJ3cml0ZSkKKworICAgICAgICAgICAgICAgICMgV2FpdCBmb3IgZXhlYyB0byBmYWlsIG9yIHN1Y2NlZWQ7IHBvc3NpYmx5IHJhaXNpbmcgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgIyBFeGNlcHRpb24gbGltaXRlZCB0byAxTQorICAgICAgICAgICAgICAgIGRhdGEgPSBfZWludHJfcmV0cnlfY2FsbChvcy5yZWFkLCBlcnJwaXBlX3JlYWQsIDEwNDg1NzYpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICMgYmUgc3VyZSB0aGUgRkQgaXMgY2xvc2VkIG5vIG1hdHRlciB3aGF0CisgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJycGlwZV9yZWFkKQorCisgICAgICAgICAgICBpZiBkYXRhICE9ICIiOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgX2VpbnRyX3JldHJ5X2NhbGwob3Mud2FpdHBpZCwgc2VsZi5waWQsIDApCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQ0hJTEQ6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGNoaWxkX2V4Y2VwdGlvbiA9IHBpY2tsZS5sb2FkcyhkYXRhKQorICAgICAgICAgICAgICAgIHJhaXNlIGNoaWxkX2V4Y2VwdGlvbgorCisKKyAgICAgICAgZGVmIF9oYW5kbGVfZXhpdHN0YXR1cyhzZWxmLCBzdHMsIF9XSUZTSUdOQUxFRD1vcy5XSUZTSUdOQUxFRCwKKyAgICAgICAgICAgICAgICBfV1RFUk1TSUc9b3MuV1RFUk1TSUcsIF9XSUZFWElURUQ9b3MuV0lGRVhJVEVELAorICAgICAgICAgICAgICAgIF9XRVhJVFNUQVRVUz1vcy5XRVhJVFNUQVRVUyk6CisgICAgICAgICAgICAjIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCAoaW5kaXJlY3RseSkgYnkgX19kZWxfXywgc28gaXQgY2Fubm90CisgICAgICAgICAgICAjIHJlZmVyIHRvIGFueXRoaW5nIG91dHNpZGUgb2YgaXRzIGxvY2FsIHNjb3BlLiIiIgorICAgICAgICAgICAgaWYgX1dJRlNJR05BTEVEKHN0cyk6CisgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gLV9XVEVSTVNJRyhzdHMpCisgICAgICAgICAgICBlbGlmIF9XSUZFWElURUQoc3RzKToKKyAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBfV0VYSVRTVEFUVVMoc3RzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlVua25vd24gY2hpbGQgZXhpdCBzdGF0dXMhIikKKworCisgICAgICAgIGRlZiBfaW50ZXJuYWxfcG9sbChzZWxmLCBfZGVhZHN0YXRlPU5vbmUsIF93YWl0cGlkPW9zLndhaXRwaWQsCisgICAgICAgICAgICAgICAgX1dOT0hBTkc9b3MuV05PSEFORywgX29zX2Vycm9yPW9zLmVycm9yLCBfRUNISUxEPWVycm5vLkVDSElMRCk6CisgICAgICAgICAgICAiIiJDaGVjayBpZiBjaGlsZCBwcm9jZXNzIGhhcyB0ZXJtaW5hdGVkLiAgUmV0dXJucyByZXR1cm5jb2RlCisgICAgICAgICAgICBhdHRyaWJ1dGUuCisKKyAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBfX2RlbF9fLCBzbyBpdCBjYW5ub3QgcmVmZXJlbmNlIGFueXRoaW5nCisgICAgICAgICAgICBvdXRzaWRlIG9mIHRoZSBsb2NhbCBzY29wZSAobm9yIGNhbiBhbnkgbWV0aG9kcyBpdCBjYWxscykuCisKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwaWQsIHN0cyA9IF93YWl0cGlkKHNlbGYucGlkLCBfV05PSEFORykKKyAgICAgICAgICAgICAgICAgICAgaWYgcGlkID09IHNlbGYucGlkOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX2V4aXRzdGF0dXMoc3RzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBfb3NfZXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgX2RlYWRzdGF0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IF9kZWFkc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBfRUNISUxEOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGhhcHBlbnMgaWYgU0lHQ0xEIGlzIHNldCB0byBiZSBpZ25vcmVkIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAjIHdhaXRpbmcgZm9yIGNoaWxkIHByb2Nlc3NlcyBoYXMgb3RoZXJ3aXNlIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzYWJsZWQgZm9yIG91ciBwcm9jZXNzLiAgVGhpcyBjaGlsZCBpcyBkZWFkLCB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBjYW4ndCBnZXQgdGhlIHN0YXR1cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE1NzU2CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSAwCisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCisKKworICAgICAgICBkZWYgd2FpdChzZWxmKToKKyAgICAgICAgICAgICIiIldhaXQgZm9yIGNoaWxkIHByb2Nlc3MgdG8gdGVybWluYXRlLiAgUmV0dXJucyByZXR1cm5jb2RlCisgICAgICAgICAgICBhdHRyaWJ1dGUuIiIiCisgICAgICAgICAgICB3aGlsZSBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBpZCwgc3RzID0gX2VpbnRyX3JldHJ5X2NhbGwob3Mud2FpdHBpZCwgc2VsZi5waWQsIDApCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQ0hJTEQ6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaGFwcGVucyBpZiBTSUdDTEQgaXMgc2V0IHRvIGJlIGlnbm9yZWQgb3Igd2FpdGluZworICAgICAgICAgICAgICAgICAgICAjIGZvciBjaGlsZCBwcm9jZXNzZXMgaGFzIG90aGVyd2lzZSBiZWVuIGRpc2FibGVkIGZvciBvdXIKKyAgICAgICAgICAgICAgICAgICAgIyBwcm9jZXNzLiAgVGhpcyBjaGlsZCBpcyBkZWFkLCB3ZSBjYW4ndCBnZXQgdGhlIHN0YXR1cy4KKyAgICAgICAgICAgICAgICAgICAgcGlkID0gc2VsZi5waWQKKyAgICAgICAgICAgICAgICAgICAgc3RzID0gMAorICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhlIHBpZCBhbmQgbG9vcCBhcyB3YWl0cGlkIGhhcyBiZWVuIGtub3duIHRvIHJldHVybgorICAgICAgICAgICAgICAgICMgMCBldmVuIHdpdGhvdXQgV05PSEFORyBpbiBvZGQgc2l0dWF0aW9ucy4gIGlzc3VlMTQzOTYuCisgICAgICAgICAgICAgICAgaWYgcGlkID09IHNlbGYucGlkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVfZXhpdHN0YXR1cyhzdHMpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCisKKworICAgICAgICBkZWYgX2NvbW11bmljYXRlKHNlbGYsIGlucHV0KToKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkaW46CisgICAgICAgICAgICAgICAgIyBGbHVzaCBzdGRpbyBidWZmZXIuICBUaGlzIG1pZ2h0IGJsb2NrLCBpZiB0aGUgdXNlciBoYXMKKyAgICAgICAgICAgICAgICAjIGJlZW4gd3JpdGluZyB0byAuc3RkaW4gaW4gYW4gdW5jb250cm9sbGVkIGZhc2hpb24uCisgICAgICAgICAgICAgICAgc2VsZi5zdGRpbi5mbHVzaCgpCisgICAgICAgICAgICAgICAgaWYgbm90IGlucHV0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLmNsb3NlKCkKKworICAgICAgICAgICAgaWYgX2hhc19wb2xsOgorICAgICAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gc2VsZi5fY29tbXVuaWNhdGVfd2l0aF9wb2xsKGlucHV0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHNlbGYuX2NvbW11bmljYXRlX3dpdGhfc2VsZWN0KGlucHV0KQorCisgICAgICAgICAgICAjIEFsbCBkYXRhIGV4Y2hhbmdlZC4gIFRyYW5zbGF0ZSBsaXN0cyBpbnRvIHN0cmluZ3MuCisgICAgICAgICAgICBpZiBzdGRvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc3Rkb3V0ID0gJycuam9pbihzdGRvdXQpCisgICAgICAgICAgICBpZiBzdGRlcnIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc3RkZXJyID0gJycuam9pbihzdGRlcnIpCisKKyAgICAgICAgICAgICMgVHJhbnNsYXRlIG5ld2xpbmVzLCBpZiByZXF1ZXN0ZWQuICBXZSBjYW5ub3QgbGV0IHRoZSBmaWxlCisgICAgICAgICAgICAjIG9iamVjdCBkbyB0aGUgdHJhbnNsYXRpb246IEl0IGlzIGJhc2VkIG9uIHN0ZGlvLCB3aGljaCBpcworICAgICAgICAgICAgIyBpbXBvc3NpYmxlIHRvIGNvbWJpbmUgd2l0aCBzZWxlY3QgKHVubGVzcyBmb3JjaW5nIG5vCisgICAgICAgICAgICAjIGJ1ZmZlcmluZykuCisgICAgICAgICAgICBpZiBzZWxmLnVuaXZlcnNhbF9uZXdsaW5lcyBhbmQgaGFzYXR0cihmaWxlLCAnbmV3bGluZXMnKToKKyAgICAgICAgICAgICAgICBpZiBzdGRvdXQ6CisgICAgICAgICAgICAgICAgICAgIHN0ZG91dCA9IHNlbGYuX3RyYW5zbGF0ZV9uZXdsaW5lcyhzdGRvdXQpCisgICAgICAgICAgICAgICAgaWYgc3RkZXJyOgorICAgICAgICAgICAgICAgICAgICBzdGRlcnIgPSBzZWxmLl90cmFuc2xhdGVfbmV3bGluZXMoc3RkZXJyKQorCisgICAgICAgICAgICBzZWxmLndhaXQoKQorICAgICAgICAgICAgcmV0dXJuIChzdGRvdXQsIHN0ZGVycikKKworCisgICAgICAgIGRlZiBfY29tbXVuaWNhdGVfd2l0aF9wb2xsKHNlbGYsIGlucHV0KToKKyAgICAgICAgICAgIHN0ZG91dCA9IE5vbmUgIyBSZXR1cm4KKyAgICAgICAgICAgIHN0ZGVyciA9IE5vbmUgIyBSZXR1cm4KKyAgICAgICAgICAgIGZkMmZpbGUgPSB7fQorICAgICAgICAgICAgZmQyb3V0cHV0ID0ge30KKworICAgICAgICAgICAgcG9sbGVyID0gc2VsZWN0LnBvbGwoKQorICAgICAgICAgICAgZGVmIHJlZ2lzdGVyX2FuZF9hcHBlbmQoZmlsZV9vYmosIGV2ZW50bWFzayk6CisgICAgICAgICAgICAgICAgcG9sbGVyLnJlZ2lzdGVyKGZpbGVfb2JqLmZpbGVubygpLCBldmVudG1hc2spCisgICAgICAgICAgICAgICAgZmQyZmlsZVtmaWxlX29iai5maWxlbm8oKV0gPSBmaWxlX29iagorCisgICAgICAgICAgICBkZWYgY2xvc2VfdW5yZWdpc3Rlcl9hbmRfcmVtb3ZlKGZkKToKKyAgICAgICAgICAgICAgICBwb2xsZXIudW5yZWdpc3RlcihmZCkKKyAgICAgICAgICAgICAgICBmZDJmaWxlW2ZkXS5jbG9zZSgpCisgICAgICAgICAgICAgICAgZmQyZmlsZS5wb3AoZmQpCisKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkaW4gYW5kIGlucHV0OgorICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2FuZF9hcHBlbmQoc2VsZi5zdGRpbiwgc2VsZWN0LlBPTExPVVQpCisKKyAgICAgICAgICAgIHNlbGVjdF9QT0xMSU5fUE9MTFBSSSA9IHNlbGVjdC5QT0xMSU4gfCBzZWxlY3QuUE9MTFBSSQorICAgICAgICAgICAgaWYgc2VsZi5zdGRvdXQ6CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJfYW5kX2FwcGVuZChzZWxmLnN0ZG91dCwgc2VsZWN0X1BPTExJTl9QT0xMUFJJKQorICAgICAgICAgICAgICAgIGZkMm91dHB1dFtzZWxmLnN0ZG91dC5maWxlbm8oKV0gPSBzdGRvdXQgPSBbXQorICAgICAgICAgICAgaWYgc2VsZi5zdGRlcnI6CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJfYW5kX2FwcGVuZChzZWxmLnN0ZGVyciwgc2VsZWN0X1BPTExJTl9QT0xMUFJJKQorICAgICAgICAgICAgICAgIGZkMm91dHB1dFtzZWxmLnN0ZGVyci5maWxlbm8oKV0gPSBzdGRlcnIgPSBbXQorCisgICAgICAgICAgICBpbnB1dF9vZmZzZXQgPSAwCisgICAgICAgICAgICB3aGlsZSBmZDJmaWxlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVhZHkgPSBwb2xsZXIucG9sbCgpCisgICAgICAgICAgICAgICAgZXhjZXB0IHNlbGVjdC5lcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS5hcmdzWzBdID09IGVycm5vLkVJTlRSOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICAgICAgICAgIGZvciBmZCwgbW9kZSBpbiByZWFkeToKKyAgICAgICAgICAgICAgICAgICAgaWYgbW9kZSAmIHNlbGVjdC5QT0xMT1VUOgorICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBpbnB1dFtpbnB1dF9vZmZzZXQgOiBpbnB1dF9vZmZzZXQgKyBfUElQRV9CVUZdCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfb2Zmc2V0ICs9IG9zLndyaXRlKGZkLCBjaHVuaykKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FUElQRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VfdW5yZWdpc3Rlcl9hbmRfcmVtb3ZlKGZkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlucHV0X29mZnNldCA+PSBsZW4oaW5wdXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV91bnJlZ2lzdGVyX2FuZF9yZW1vdmUoZmQpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbW9kZSAmIHNlbGVjdF9QT0xMSU5fUE9MTFBSSToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBvcy5yZWFkKGZkLCA0MDk2KQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VfdW5yZWdpc3Rlcl9hbmRfcmVtb3ZlKGZkKQorICAgICAgICAgICAgICAgICAgICAgICAgZmQyb3V0cHV0W2ZkXS5hcHBlbmQoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSWdub3JlIGhhbmcgdXAgb3IgZXJyb3JzLgorICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VfdW5yZWdpc3Rlcl9hbmRfcmVtb3ZlKGZkKQorCisgICAgICAgICAgICByZXR1cm4gKHN0ZG91dCwgc3RkZXJyKQorCisKKyAgICAgICAgZGVmIF9jb21tdW5pY2F0ZV93aXRoX3NlbGVjdChzZWxmLCBpbnB1dCk6CisgICAgICAgICAgICByZWFkX3NldCA9IFtdCisgICAgICAgICAgICB3cml0ZV9zZXQgPSBbXQorICAgICAgICAgICAgc3Rkb3V0ID0gTm9uZSAjIFJldHVybgorICAgICAgICAgICAgc3RkZXJyID0gTm9uZSAjIFJldHVybgorCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGluIGFuZCBpbnB1dDoKKyAgICAgICAgICAgICAgICB3cml0ZV9zZXQuYXBwZW5kKHNlbGYuc3RkaW4pCisgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dDoKKyAgICAgICAgICAgICAgICByZWFkX3NldC5hcHBlbmQoc2VsZi5zdGRvdXQpCisgICAgICAgICAgICAgICAgc3Rkb3V0ID0gW10KKyAgICAgICAgICAgIGlmIHNlbGYuc3RkZXJyOgorICAgICAgICAgICAgICAgIHJlYWRfc2V0LmFwcGVuZChzZWxmLnN0ZGVycikKKyAgICAgICAgICAgICAgICBzdGRlcnIgPSBbXQorCisgICAgICAgICAgICBpbnB1dF9vZmZzZXQgPSAwCisgICAgICAgICAgICB3aGlsZSByZWFkX3NldCBvciB3cml0ZV9zZXQ6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBybGlzdCwgd2xpc3QsIHhsaXN0ID0gc2VsZWN0LnNlbGVjdChyZWFkX3NldCwgd3JpdGVfc2V0LCBbXSkKKyAgICAgICAgICAgICAgICBleGNlcHQgc2VsZWN0LmVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gPT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdGRpbiBpbiB3bGlzdDoKKyAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBpbnB1dFtpbnB1dF9vZmZzZXQgOiBpbnB1dF9vZmZzZXQgKyBfUElQRV9CVUZdCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX3dyaXR0ZW4gPSBvcy53cml0ZShzZWxmLnN0ZGluLmZpbGVubygpLCBjaHVuaykKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRVBJUEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGRpbi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfc2V0LnJlbW92ZShzZWxmLnN0ZGluKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfb2Zmc2V0ICs9IGJ5dGVzX3dyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlucHV0X29mZnNldCA+PSBsZW4oaW5wdXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4uY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3NldC5yZW1vdmUoc2VsZi5zdGRpbikKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuc3Rkb3V0IGluIHJsaXN0OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gb3MucmVhZChzZWxmLnN0ZG91dC5maWxlbm8oKSwgMTAyNCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZGF0YSA9PSAiIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0LmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfc2V0LnJlbW92ZShzZWxmLnN0ZG91dCkKKyAgICAgICAgICAgICAgICAgICAgc3Rkb3V0LmFwcGVuZChkYXRhKQorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdGRlcnIgaW4gcmxpc3Q6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBvcy5yZWFkKHNlbGYuc3RkZXJyLmZpbGVubygpLCAxMDI0KQorICAgICAgICAgICAgICAgICAgICBpZiBkYXRhID09ICIiOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGRlcnIuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9zZXQucmVtb3ZlKHNlbGYuc3RkZXJyKQorICAgICAgICAgICAgICAgICAgICBzdGRlcnIuYXBwZW5kKGRhdGEpCisKKyAgICAgICAgICAgIHJldHVybiAoc3Rkb3V0LCBzdGRlcnIpCisKKworICAgICAgICBkZWYgc2VuZF9zaWduYWwoc2VsZiwgc2lnKToKKyAgICAgICAgICAgICIiIlNlbmQgYSBzaWduYWwgdG8gdGhlIHByb2Nlc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgb3Mua2lsbChzZWxmLnBpZCwgc2lnKQorCisgICAgICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgICAgICAiIiJUZXJtaW5hdGUgdGhlIHByb2Nlc3Mgd2l0aCBTSUdURVJNCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHNlbGYuc2VuZF9zaWduYWwoc2lnbmFsLlNJR1RFUk0pCisKKyAgICAgICAgZGVmIGtpbGwoc2VsZik6CisgICAgICAgICAgICAiIiJLaWxsIHRoZSBwcm9jZXNzIHdpdGggU0lHS0lMTAorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBzZWxmLnNlbmRfc2lnbmFsKHNpZ25hbC5TSUdLSUxMKQorCisKK2RlZiBfZGVtb19wb3NpeCgpOgorICAgICMKKyAgICAjIEV4YW1wbGUgMTogU2ltcGxlIHJlZGlyZWN0aW9uOiBHZXQgcHJvY2VzcyBsaXN0CisgICAgIworICAgIHBsaXN0ID0gUG9wZW4oWyJwcyJdLCBzdGRvdXQ9UElQRSkuY29tbXVuaWNhdGUoKVswXQorICAgIHByaW50ICJQcm9jZXNzIGxpc3Q6IgorICAgIHByaW50IHBsaXN0CisKKyAgICAjCisgICAgIyBFeGFtcGxlIDI6IENoYW5nZSB1aWQgYmVmb3JlIGV4ZWN1dGluZyBjaGlsZAorICAgICMKKyAgICBpZiBvcy5nZXR1aWQoKSA9PSAwOgorICAgICAgICBwID0gUG9wZW4oWyJpZCJdLCBwcmVleGVjX2ZuPWxhbWJkYTogb3Muc2V0dWlkKDEwMCkpCisgICAgICAgIHAud2FpdCgpCisKKyAgICAjCisgICAgIyBFeGFtcGxlIDM6IENvbm5lY3Rpbmcgc2V2ZXJhbCBzdWJwcm9jZXNzZXMKKyAgICAjCisgICAgcHJpbnQgIkxvb2tpbmcgZm9yICdoZGEnLi4uIgorICAgIHAxID0gUG9wZW4oWyJkbWVzZyJdLCBzdGRvdXQ9UElQRSkKKyAgICBwMiA9IFBvcGVuKFsiZ3JlcCIsICJoZGEiXSwgc3RkaW49cDEuc3Rkb3V0LCBzdGRvdXQ9UElQRSkKKyAgICBwcmludCByZXByKHAyLmNvbW11bmljYXRlKClbMF0pCisKKyAgICAjCisgICAgIyBFeGFtcGxlIDQ6IENhdGNoIGV4ZWN1dGlvbiBlcnJvcgorICAgICMKKyAgICBwcmludAorICAgIHByaW50ICJUcnlpbmcgYSB3ZWlyZCBmaWxlLi4uIgorICAgIHRyeToKKyAgICAgICAgcHJpbnQgUG9wZW4oWyIvdGhpcy9wYXRoL2RvZXMvbm90L2V4aXN0Il0pLmNvbW11bmljYXRlKCkKKyAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICBwcmludCAiVGhlIGZpbGUgZGlkbid0IGV4aXN0LiAgSSB0aG91Z2h0IHNvLi4uIgorICAgICAgICAgICAgcHJpbnQgIkNoaWxkIHRyYWNlYmFjazoiCisgICAgICAgICAgICBwcmludCBlLmNoaWxkX3RyYWNlYmFjaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgIkVycm9yIiwgZS5lcnJubworICAgIGVsc2U6CisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkdvc2guICBObyBlcnJvci4iCisKKworZGVmIF9kZW1vX3dpbmRvd3MoKToKKyAgICAjCisgICAgIyBFeGFtcGxlIDE6IENvbm5lY3Rpbmcgc2V2ZXJhbCBzdWJwcm9jZXNzZXMKKyAgICAjCisgICAgcHJpbnQgIkxvb2tpbmcgZm9yICdQUk9NUFQnIGluIHNldCBvdXRwdXQuLi4iCisgICAgcDEgPSBQb3Blbigic2V0Iiwgc3Rkb3V0PVBJUEUsIHNoZWxsPVRydWUpCisgICAgcDIgPSBQb3BlbignZmluZCAiUFJPTVBUIicsIHN0ZGluPXAxLnN0ZG91dCwgc3Rkb3V0PVBJUEUpCisgICAgcHJpbnQgcmVwcihwMi5jb21tdW5pY2F0ZSgpWzBdKQorCisgICAgIworICAgICMgRXhhbXBsZSAyOiBTaW1wbGUgZXhlY3V0aW9uIG9mIHByb2dyYW0KKyAgICAjCisgICAgcHJpbnQgIkV4ZWN1dGluZyBjYWxjLi4uIgorICAgIHAgPSBQb3BlbigiY2FsYyIpCisgICAgcC53YWl0KCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGlmIG1zd2luZG93czoKKyAgICAgICAgX2RlbW9fd2luZG93cygpCisgICAgZWxzZToKKyAgICAgICAgX2RlbW9fcG9zaXgoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdWJwcm9jZXNzLnB5YyBiL2xpYi9weXRob24yLjcvc3VicHJvY2Vzcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljNzM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3VicHJvY2Vzcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdWJwcm9jZXNzLnB5byBiL2xpYi9weXRob24yLjcvc3VicHJvY2Vzcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljNzM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3VicHJvY2Vzcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdW5hdS5weSBiL2xpYi9weXRob24yLjcvc3VuYXUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0ZDhjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3VuYXUucHkKQEAgLTAsMCArMSw0NzUgQEAKKyIiIlN0dWZmIHRvIHBhcnNlIFN1biBhbmQgTmVYVCBhdWRpbyBmaWxlcy4KKworQW4gYXVkaW8gZmlsZSBjb25zaXN0cyBvZiBhIGhlYWRlciBmb2xsb3dlZCBieSB0aGUgZGF0YS4gIFRoZSBzdHJ1Y3R1cmUKK29mIHRoZSBoZWFkZXIgaXMgYXMgZm9sbG93cy4KKworICAgICAgICArLS0tLS0tLS0tLS0tLS0tKworICAgICAgICB8IG1hZ2ljIHdvcmQgICAgfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tKworICAgICAgICB8IGhlYWRlciBzaXplICAgfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tKworICAgICAgICB8IGRhdGEgc2l6ZSAgICAgfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tKworICAgICAgICB8IGVuY29kaW5nICAgICAgfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tKworICAgICAgICB8IHNhbXBsZSByYXRlICAgfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tKworICAgICAgICB8ICMgb2YgY2hhbm5lbHMgfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tKworICAgICAgICB8IGluZm8gICAgICAgICAgfAorICAgICAgICB8ICAgICAgICAgICAgICAgfAorICAgICAgICArLS0tLS0tLS0tLS0tLS0tKworCitUaGUgbWFnaWMgd29yZCBjb25zaXN0cyBvZiB0aGUgNCBjaGFyYWN0ZXJzICcuc25kJy4gIEFwYXJ0IGZyb20gdGhlCitpbmZvIGZpZWxkLCBhbGwgaGVhZGVyIGZpZWxkcyBhcmUgNCBieXRlcyBpbiBzaXplLiAgVGhleSBhcmUgYWxsCiszMi1iaXQgdW5zaWduZWQgaW50ZWdlcnMgZW5jb2RlZCBpbiBiaWctZW5kaWFuIGJ5dGUgb3JkZXIuCisKK1RoZSBoZWFkZXIgc2l6ZSByZWFsbHkgZ2l2ZXMgdGhlIHN0YXJ0IG9mIHRoZSBkYXRhLgorVGhlIGRhdGEgc2l6ZSBpcyB0aGUgcGh5c2ljYWwgc2l6ZSBvZiB0aGUgZGF0YS4gIEZyb20gdGhlIG90aGVyCitwYXJhbWV0ZXJzIHRoZSBudW1iZXIgb2YgZnJhbWVzIGNhbiBiZSBjYWxjdWxhdGVkLgorVGhlIGVuY29kaW5nIGdpdmVzIHRoZSB3YXkgaW4gd2hpY2ggYXVkaW8gc2FtcGxlcyBhcmUgZW5jb2RlZC4KK1Bvc3NpYmxlIHZhbHVlcyBhcmUgbGlzdGVkIGJlbG93LgorVGhlIGluZm8gZmllbGQgY3VycmVudGx5IGNvbnNpc3RzIG9mIGFuIEFTQ0lJIHN0cmluZyBnaXZpbmcgYQoraHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGF1ZGlvIGZpbGUuICBUaGUgaW5mbyBmaWVsZCBpcworcGFkZGVkIHdpdGggTlVMIGJ5dGVzIHRvIHRoZSBoZWFkZXIgc2l6ZS4KKworVXNhZ2UuCisKK1JlYWRpbmcgYXVkaW8gZmlsZXM6CisgICAgICAgIGYgPSBzdW5hdS5vcGVuKGZpbGUsICdyJykKK3doZXJlIGZpbGUgaXMgZWl0aGVyIHRoZSBuYW1lIG9mIGEgZmlsZSBvciBhbiBvcGVuIGZpbGUgcG9pbnRlci4KK1RoZSBvcGVuIGZpbGUgcG9pbnRlciBtdXN0IGhhdmUgbWV0aG9kcyByZWFkKCksIHNlZWsoKSwgYW5kIGNsb3NlKCkuCitXaGVuIHRoZSBzZXRwb3MoKSBhbmQgcmV3aW5kKCkgbWV0aG9kcyBhcmUgbm90IHVzZWQsIHRoZSBzZWVrKCkKK21ldGhvZCBpcyBub3QgIG5lY2Vzc2FyeS4KKworVGhpcyByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEgY2xhc3Mgd2l0aCB0aGUgZm9sbG93aW5nIHB1YmxpYyBtZXRob2RzOgorICAgICAgICBnZXRuY2hhbm5lbHMoKSAgLS0gcmV0dXJucyBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgKDEgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtb25vLCAyIGZvciBzdGVyZW8pCisgICAgICAgIGdldHNhbXB3aWR0aCgpICAtLSByZXR1cm5zIHNhbXBsZSB3aWR0aCBpbiBieXRlcworICAgICAgICBnZXRmcmFtZXJhdGUoKSAgLS0gcmV0dXJucyBzYW1wbGluZyBmcmVxdWVuY3kKKyAgICAgICAgZ2V0bmZyYW1lcygpICAgIC0tIHJldHVybnMgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcworICAgICAgICBnZXRjb21wdHlwZSgpICAgLS0gcmV0dXJucyBjb21wcmVzc2lvbiB0eXBlICgnTk9ORScgb3IgJ1VMQVcnKQorICAgICAgICBnZXRjb21wbmFtZSgpICAgLS0gcmV0dXJucyBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2lvbiB0eXBlICgnbm90IGNvbXByZXNzZWQnIG1hdGNoZXMgJ05PTkUnKQorICAgICAgICBnZXRwYXJhbXMoKSAgICAgLS0gcmV0dXJucyBhIHR1cGxlIGNvbnNpc3Rpbmcgb2YgYWxsIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUgaW4gdGhlIGFib3ZlIG9yZGVyCisgICAgICAgIGdldG1hcmtlcnMoKSAgICAtLSByZXR1cm5zIE5vbmUgKGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWZjIG1vZHVsZSkKKyAgICAgICAgZ2V0bWFyayhpZCkgICAgIC0tIHJhaXNlcyBhbiBlcnJvciBzaW5jZSB0aGUgbWFyayBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3QgKGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGFpZmMgbW9kdWxlKQorICAgICAgICByZWFkZnJhbWVzKG4pICAgLS0gcmV0dXJucyBhdCBtb3N0IG4gZnJhbWVzIG9mIGF1ZGlvCisgICAgICAgIHJld2luZCgpICAgICAgICAtLSByZXdpbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXVkaW8gc3RyZWFtCisgICAgICAgIHNldHBvcyhwb3MpICAgICAtLSBzZWVrIHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KKyAgICAgICAgdGVsbCgpICAgICAgICAgIC0tIHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbgorICAgICAgICBjbG9zZSgpICAgICAgICAgLS0gY2xvc2UgdGhlIGluc3RhbmNlIChtYWtlIGl0IHVudXNhYmxlKQorVGhlIHBvc2l0aW9uIHJldHVybmVkIGJ5IHRlbGwoKSBhbmQgdGhlIHBvc2l0aW9uIGdpdmVuIHRvIHNldHBvcygpCithcmUgY29tcGF0aWJsZSBhbmQgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggdGhlIGFjdHVhbCBwb3NpdGlvbiBpbiB0aGUKK2ZpbGUuCitUaGUgY2xvc2UoKSBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgY2xhc3MgaW5zdGFuY2UKK2lzIGRlc3Ryb3llZC4KKworV3JpdGluZyBhdWRpbyBmaWxlczoKKyAgICAgICAgZiA9IHN1bmF1Lm9wZW4oZmlsZSwgJ3cnKQord2hlcmUgZmlsZSBpcyBlaXRoZXIgdGhlIG5hbWUgb2YgYSBmaWxlIG9yIGFuIG9wZW4gZmlsZSBwb2ludGVyLgorVGhlIG9wZW4gZmlsZSBwb2ludGVyIG11c3QgaGF2ZSBtZXRob2RzIHdyaXRlKCksIHRlbGwoKSwgc2VlaygpLCBhbmQKK2Nsb3NlKCkuCisKK1RoaXMgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHdpdGggdGhlIGZvbGxvd2luZyBwdWJsaWMgbWV0aG9kczoKKyAgICAgICAgc2V0bmNoYW5uZWxzKG4pIC0tIHNldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgIHNldHNhbXB3aWR0aChuKSAtLSBzZXQgdGhlIHNhbXBsZSB3aWR0aAorICAgICAgICBzZXRmcmFtZXJhdGUobikgLS0gc2V0IHRoZSBmcmFtZSByYXRlCisgICAgICAgIHNldG5mcmFtZXMobikgICAtLSBzZXQgdGhlIG51bWJlciBvZiBmcmFtZXMKKyAgICAgICAgc2V0Y29tcHR5cGUodHlwZSwgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tIHNldCB0aGUgY29tcHJlc3Npb24gdHlwZSBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBodW1hbi1yZWFkYWJsZSBjb21wcmVzc2lvbiB0eXBlCisgICAgICAgIHNldHBhcmFtcyh0dXBsZSktLSBzZXQgYWxsIHBhcmFtZXRlcnMgYXQgb25jZQorICAgICAgICB0ZWxsKCkgICAgICAgICAgLS0gcmV0dXJuIGN1cnJlbnQgcG9zaXRpb24gaW4gb3V0cHV0IGZpbGUKKyAgICAgICAgd3JpdGVmcmFtZXNyYXcoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdyaXRlIGF1ZGlvIGZyYW1lcyB3aXRob3V0IHBhdGhpbmcgdXAgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGhlYWRlcgorICAgICAgICB3cml0ZWZyYW1lcyhkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgLS0gd3JpdGUgYXVkaW8gZnJhbWVzIGFuZCBwYXRjaCB1cCB0aGUgZmlsZSBoZWFkZXIKKyAgICAgICAgY2xvc2UoKSAgICAgICAgIC0tIHBhdGNoIHVwIHRoZSBmaWxlIGhlYWRlciBhbmQgY2xvc2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZmlsZQorWW91IHNob3VsZCBzZXQgdGhlIHBhcmFtZXRlcnMgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZWZyYW1lc3JhdyBvcgord3JpdGVmcmFtZXMuICBUaGUgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldCwKK2J1dCB3aGVuIGl0IGlzIHNldCB0byB0aGUgY29ycmVjdCB2YWx1ZSwgdGhlIGhlYWRlciBkb2VzIG5vdCBoYXZlIHRvCitiZSBwYXRjaGVkIHVwLgorSXQgaXMgYmVzdCB0byBmaXJzdCBzZXQgYWxsIHBhcmFtZXRlcnMsIHBlcmhhcHMgcG9zc2libHkgdGhlCitjb21wcmVzc2lvbiB0eXBlLCBhbmQgdGhlbiB3cml0ZSBhdWRpbyBmcmFtZXMgdXNpbmcgd3JpdGVmcmFtZXNyYXcuCitXaGVuIGFsbCBmcmFtZXMgaGF2ZSBiZWVuIHdyaXR0ZW4sIGVpdGhlciBjYWxsIHdyaXRlZnJhbWVzKCcnKSBvcgorY2xvc2UoKSB0byBwYXRjaCB1cCB0aGUgc2l6ZXMgaW4gdGhlIGhlYWRlci4KK1RoZSBjbG9zZSgpIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBjbGFzcyBpbnN0YW5jZQoraXMgZGVzdHJveWVkLgorIiIiCisKKyMgZnJvbSA8bXVsdGltZWRpYS9hdWRpb19maWxlaGRyLmg+CitBVURJT19GSUxFX01BR0lDID0gMHgyZTczNmU2NAorQVVESU9fRklMRV9FTkNPRElOR19NVUxBV184ID0gMQorQVVESU9fRklMRV9FTkNPRElOR19MSU5FQVJfOCA9IDIKK0FVRElPX0ZJTEVfRU5DT0RJTkdfTElORUFSXzE2ID0gMworQVVESU9fRklMRV9FTkNPRElOR19MSU5FQVJfMjQgPSA0CitBVURJT19GSUxFX0VOQ09ESU5HX0xJTkVBUl8zMiA9IDUKK0FVRElPX0ZJTEVfRU5DT0RJTkdfRkxPQVQgPSA2CitBVURJT19GSUxFX0VOQ09ESU5HX0RPVUJMRSA9IDcKK0FVRElPX0ZJTEVfRU5DT0RJTkdfQURQQ01fRzcyMSA9IDIzCitBVURJT19GSUxFX0VOQ09ESU5HX0FEUENNX0c3MjIgPSAyNAorQVVESU9fRklMRV9FTkNPRElOR19BRFBDTV9HNzIzXzMgPSAyNQorQVVESU9fRklMRV9FTkNPRElOR19BRFBDTV9HNzIzXzUgPSAyNgorQVVESU9fRklMRV9FTkNPRElOR19BTEFXXzggPSAyNworCisjIGZyb20gPG11bHRpbWVkaWEvYXVkaW9faGRyLmg+CitBVURJT19VTktOT1dOX1NJWkUgPSAweEZGRkZGRkZGTCAgICAgICAgIyAoKHVuc2lnbmVkKSh+MCkpCisKK19zaW1wbGVfZW5jb2RpbmdzID0gW0FVRElPX0ZJTEVfRU5DT0RJTkdfTVVMQVdfOCwKKyAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZJTEVfRU5DT0RJTkdfTElORUFSXzgsCisgICAgICAgICAgICAgICAgICAgICBBVURJT19GSUxFX0VOQ09ESU5HX0xJTkVBUl8xNiwKKyAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZJTEVfRU5DT0RJTkdfTElORUFSXzI0LAorICAgICAgICAgICAgICAgICAgICAgQVVESU9fRklMRV9FTkNPRElOR19MSU5FQVJfMzIsCisgICAgICAgICAgICAgICAgICAgICBBVURJT19GSUxFX0VOQ09ESU5HX0FMQVdfOF0KKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2RlZiBfcmVhZF91MzIoZmlsZSk6CisgICAgeCA9IDBMCisgICAgZm9yIGkgaW4gcmFuZ2UoNCk6CisgICAgICAgIGJ5dGUgPSBmaWxlLnJlYWQoMSkKKyAgICAgICAgaWYgYnl0ZSA9PSAnJzoKKyAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgICAgIHggPSB4KjI1NiArIG9yZChieXRlKQorICAgIHJldHVybiB4CisKK2RlZiBfd3JpdGVfdTMyKGZpbGUsIHgpOgorICAgIGRhdGEgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKDQpOgorICAgICAgICBkLCBtID0gZGl2bW9kKHgsIDI1NikKKyAgICAgICAgZGF0YS5pbnNlcnQoMCwgbSkKKyAgICAgICAgeCA9IGQKKyAgICBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAgICAgZmlsZS53cml0ZShjaHIoaW50KGRhdGFbaV0pKSkKKworY2xhc3MgQXVfcmVhZDoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmKToKKyAgICAgICAgaWYgdHlwZShmKSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgIGltcG9ydCBfX2J1aWx0aW5fXworICAgICAgICAgICAgZiA9IF9fYnVpbHRpbl9fLm9wZW4oZiwgJ3JiJykKKyAgICAgICAgc2VsZi5pbml0ZnAoZikKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9maWxlOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgaW5pdGZwKHNlbGYsIGZpbGUpOgorICAgICAgICBzZWxmLl9maWxlID0gZmlsZQorICAgICAgICBzZWxmLl9zb3VuZHBvcyA9IDAKKyAgICAgICAgbWFnaWMgPSBpbnQoX3JlYWRfdTMyKGZpbGUpKQorICAgICAgICBpZiBtYWdpYyAhPSBBVURJT19GSUxFX01BR0lDOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdiYWQgbWFnaWMgbnVtYmVyJworICAgICAgICBzZWxmLl9oZHJfc2l6ZSA9IGludChfcmVhZF91MzIoZmlsZSkpCisgICAgICAgIGlmIHNlbGYuX2hkcl9zaXplIDwgMjQ6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2hlYWRlciBzaXplIHRvbyBzbWFsbCcKKyAgICAgICAgaWYgc2VsZi5faGRyX3NpemUgPiAxMDA6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2hlYWRlciBzaXplIHJpZGljdWxvdXNseSBsYXJnZScKKyAgICAgICAgc2VsZi5fZGF0YV9zaXplID0gX3JlYWRfdTMyKGZpbGUpCisgICAgICAgIGlmIHNlbGYuX2RhdGFfc2l6ZSAhPSBBVURJT19VTktOT1dOX1NJWkU6CisgICAgICAgICAgICBzZWxmLl9kYXRhX3NpemUgPSBpbnQoc2VsZi5fZGF0YV9zaXplKQorICAgICAgICBzZWxmLl9lbmNvZGluZyA9IGludChfcmVhZF91MzIoZmlsZSkpCisgICAgICAgIGlmIHNlbGYuX2VuY29kaW5nIG5vdCBpbiBfc2ltcGxlX2VuY29kaW5nczoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnZW5jb2Rpbmcgbm90ICh5ZXQpIHN1cHBvcnRlZCcKKyAgICAgICAgaWYgc2VsZi5fZW5jb2RpbmcgaW4gKEFVRElPX0ZJTEVfRU5DT0RJTkdfTVVMQVdfOCwKKyAgICAgICAgICAgICAgICAgIEFVRElPX0ZJTEVfRU5DT0RJTkdfQUxBV184KToKKyAgICAgICAgICAgIHNlbGYuX3NhbXB3aWR0aCA9IDIKKyAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IDEKKyAgICAgICAgZWxpZiBzZWxmLl9lbmNvZGluZyA9PSBBVURJT19GSUxFX0VOQ09ESU5HX0xJTkVBUl84OgorICAgICAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gc2VsZi5fc2FtcHdpZHRoID0gMQorICAgICAgICBlbGlmIHNlbGYuX2VuY29kaW5nID09IEFVRElPX0ZJTEVfRU5DT0RJTkdfTElORUFSXzE2OgorICAgICAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gc2VsZi5fc2FtcHdpZHRoID0gMgorICAgICAgICBlbGlmIHNlbGYuX2VuY29kaW5nID09IEFVRElPX0ZJTEVfRU5DT0RJTkdfTElORUFSXzI0OgorICAgICAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gc2VsZi5fc2FtcHdpZHRoID0gMworICAgICAgICBlbGlmIHNlbGYuX2VuY29kaW5nID09IEFVRElPX0ZJTEVfRU5DT0RJTkdfTElORUFSXzMyOgorICAgICAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gc2VsZi5fc2FtcHdpZHRoID0gNAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICd1bmtub3duIGVuY29kaW5nJworICAgICAgICBzZWxmLl9mcmFtZXJhdGUgPSBpbnQoX3JlYWRfdTMyKGZpbGUpKQorICAgICAgICBzZWxmLl9uY2hhbm5lbHMgPSBpbnQoX3JlYWRfdTMyKGZpbGUpKQorICAgICAgICBzZWxmLl9mcmFtZXNpemUgPSBzZWxmLl9mcmFtZXNpemUgKiBzZWxmLl9uY2hhbm5lbHMKKyAgICAgICAgaWYgc2VsZi5faGRyX3NpemUgPiAyNDoKKyAgICAgICAgICAgIHNlbGYuX2luZm8gPSBmaWxlLnJlYWQoc2VsZi5faGRyX3NpemUgLSAyNCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLl9pbmZvKSk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5faW5mb1tpXSA9PSAnXDAnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbmZvID0gc2VsZi5faW5mb1s6aV0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2luZm8gPSAnJworCisgICAgZGVmIGdldGZwKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZQorCisgICAgZGVmIGdldG5jaGFubmVscyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25jaGFubmVscworCisgICAgZGVmIGdldHNhbXB3aWR0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NhbXB3aWR0aAorCisgICAgZGVmIGdldGZyYW1lcmF0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZyYW1lcmF0ZQorCisgICAgZGVmIGdldG5mcmFtZXMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2RhdGFfc2l6ZSA9PSBBVURJT19VTktOT1dOX1NJWkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fVU5LTk9XTl9TSVpFCisgICAgICAgIGlmIHNlbGYuX2VuY29kaW5nIGluIF9zaW1wbGVfZW5jb2RpbmdzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGFfc2l6ZSAvIHNlbGYuX2ZyYW1lc2l6ZQorICAgICAgICByZXR1cm4gMCAgICAgICAgICAgICAgICAjIFhYWC0tbXVzdCBkbyBzb21lIGFyaXRobWV0aWMgaGVyZQorCisgICAgZGVmIGdldGNvbXB0eXBlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9lbmNvZGluZyA9PSBBVURJT19GSUxFX0VOQ09ESU5HX01VTEFXXzg6CisgICAgICAgICAgICByZXR1cm4gJ1VMQVcnCisgICAgICAgIGVsaWYgc2VsZi5fZW5jb2RpbmcgPT0gQVVESU9fRklMRV9FTkNPRElOR19BTEFXXzg6CisgICAgICAgICAgICByZXR1cm4gJ0FMQVcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ05PTkUnCisKKyAgICBkZWYgZ2V0Y29tcG5hbWUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2VuY29kaW5nID09IEFVRElPX0ZJTEVfRU5DT0RJTkdfTVVMQVdfODoKKyAgICAgICAgICAgIHJldHVybiAnQ0NJVFQgRy43MTEgdS1sYXcnCisgICAgICAgIGVsaWYgc2VsZi5fZW5jb2RpbmcgPT0gQVVESU9fRklMRV9FTkNPRElOR19BTEFXXzg6CisgICAgICAgICAgICByZXR1cm4gJ0NDSVRUIEcuNzExIEEtbGF3JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdub3QgY29tcHJlc3NlZCcKKworICAgIGRlZiBnZXRwYXJhbXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmdldG5jaGFubmVscygpLCBzZWxmLmdldHNhbXB3aWR0aCgpLCBcCisgICAgICAgICAgICAgICAgICBzZWxmLmdldGZyYW1lcmF0ZSgpLCBzZWxmLmdldG5mcmFtZXMoKSwgXAorICAgICAgICAgICAgICAgICAgc2VsZi5nZXRjb21wdHlwZSgpLCBzZWxmLmdldGNvbXBuYW1lKCkKKworICAgIGRlZiBnZXRtYXJrZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGdldG1hcmsoc2VsZiwgaWQpOgorICAgICAgICByYWlzZSBFcnJvciwgJ25vIG1hcmtzJworCisgICAgZGVmIHJlYWRmcmFtZXMoc2VsZiwgbmZyYW1lcyk6CisgICAgICAgIGlmIHNlbGYuX2VuY29kaW5nIGluIF9zaW1wbGVfZW5jb2RpbmdzOgorICAgICAgICAgICAgaWYgbmZyYW1lcyA9PSBBVURJT19VTktOT1dOX1NJWkU6CisgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2ZpbGUucmVhZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9maWxlLnJlYWQobmZyYW1lcyAqIHNlbGYuX2ZyYW1lc2l6ZSAqIHNlbGYuX25jaGFubmVscykKKyAgICAgICAgICAgIGlmIHNlbGYuX2VuY29kaW5nID09IEFVRElPX0ZJTEVfRU5DT0RJTkdfTVVMQVdfODoKKyAgICAgICAgICAgICAgICBpbXBvcnQgYXVkaW9vcAorICAgICAgICAgICAgICAgIGRhdGEgPSBhdWRpb29wLnVsYXcybGluKGRhdGEsIHNlbGYuX3NhbXB3aWR0aCkKKyAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgIHJldHVybiBOb25lICAgICAgICAgICAgICMgWFhYLS1ub3QgaW1wbGVtZW50ZWQgeWV0CisKKyAgICBkZWYgcmV3aW5kKHNlbGYpOgorICAgICAgICBzZWxmLl9zb3VuZHBvcyA9IDAKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHNlbGYuX2hkcl9zaXplKQorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zb3VuZHBvcworCisgICAgZGVmIHNldHBvcyhzZWxmLCBwb3MpOgorICAgICAgICBpZiBwb3MgPCAwIG9yIHBvcyA+IHNlbGYuZ2V0bmZyYW1lcygpOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdwb3NpdGlvbiBub3QgaW4gcmFuZ2UnCisgICAgICAgIHNlbGYuX2ZpbGUuc2Vlayhwb3MgKiBzZWxmLl9mcmFtZXNpemUgKyBzZWxmLl9oZHJfc2l6ZSkKKyAgICAgICAgc2VsZi5fc291bmRwb3MgPSBwb3MKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZSA9IE5vbmUKKworY2xhc3MgQXVfd3JpdGU6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZik6CisgICAgICAgIGlmIHR5cGUoZikgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICBpbXBvcnQgX19idWlsdGluX18KKyAgICAgICAgICAgIGYgPSBfX2J1aWx0aW5fXy5vcGVuKGYsICd3YicpCisgICAgICAgIHNlbGYuaW5pdGZwKGYpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZmlsZToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGluaXRmcChzZWxmLCBmaWxlKToKKyAgICAgICAgc2VsZi5fZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5fZnJhbWVyYXRlID0gMAorICAgICAgICBzZWxmLl9uY2hhbm5lbHMgPSAwCisgICAgICAgIHNlbGYuX3NhbXB3aWR0aCA9IDAKKyAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gMAorICAgICAgICBzZWxmLl9uZnJhbWVzID0gQVVESU9fVU5LTk9XTl9TSVpFCisgICAgICAgIHNlbGYuX25mcmFtZXN3cml0dGVuID0gMAorICAgICAgICBzZWxmLl9kYXRhd3JpdHRlbiA9IDAKKyAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCA9IDAKKyAgICAgICAgc2VsZi5faW5mbyA9ICcnCisgICAgICAgIHNlbGYuX2NvbXB0eXBlID0gJ1VMQVcnICMgZGVmYXVsdCBpcyBVLWxhdworCisgICAgZGVmIHNldG5jaGFubmVscyhzZWxmLCBuY2hhbm5lbHMpOgorICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBpZiBuY2hhbm5lbHMgbm90IGluICgxLCAyLCA0KToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnb25seSAxLCAyLCBvciA0IGNoYW5uZWxzIHN1cHBvcnRlZCcKKyAgICAgICAgc2VsZi5fbmNoYW5uZWxzID0gbmNoYW5uZWxzCisKKyAgICBkZWYgZ2V0bmNoYW5uZWxzKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fbmNoYW5uZWxzOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdudW1iZXIgb2YgY2hhbm5lbHMgbm90IHNldCcKKyAgICAgICAgcmV0dXJuIHNlbGYuX25jaGFubmVscworCisgICAgZGVmIHNldHNhbXB3aWR0aChzZWxmLCBzYW1wd2lkdGgpOgorICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBpZiBzYW1wd2lkdGggbm90IGluICgxLCAyLCA0KToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnYmFkIHNhbXBsZSB3aWR0aCcKKyAgICAgICAgc2VsZi5fc2FtcHdpZHRoID0gc2FtcHdpZHRoCisKKyAgICBkZWYgZ2V0c2FtcHdpZHRoKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZnJhbWVyYXRlOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdzYW1wbGUgd2lkdGggbm90IHNwZWNpZmllZCcKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NhbXB3aWR0aAorCisgICAgZGVmIHNldGZyYW1lcmF0ZShzZWxmLCBmcmFtZXJhdGUpOgorICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBzZWxmLl9mcmFtZXJhdGUgPSBmcmFtZXJhdGUKKworICAgIGRlZiBnZXRmcmFtZXJhdGUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9mcmFtZXJhdGU6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2ZyYW1lIHJhdGUgbm90IHNldCcKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZyYW1lcmF0ZQorCisgICAgZGVmIHNldG5mcmFtZXMoc2VsZiwgbmZyYW1lcyk6CisgICAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY2hhbmdlIHBhcmFtZXRlcnMgYWZ0ZXIgc3RhcnRpbmcgdG8gd3JpdGUnCisgICAgICAgIGlmIG5mcmFtZXMgPCAwOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICcjIG9mIGZyYW1lcyBjYW5ub3QgYmUgbmVnYXRpdmUnCisgICAgICAgIHNlbGYuX25mcmFtZXMgPSBuZnJhbWVzCisKKyAgICBkZWYgZ2V0bmZyYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25mcmFtZXN3cml0dGVuCisKKyAgICBkZWYgc2V0Y29tcHR5cGUoc2VsZiwgdHlwZSwgbmFtZSk6CisgICAgICAgIGlmIHR5cGUgaW4gKCdOT05FJywgJ1VMQVcnKToKKyAgICAgICAgICAgIHNlbGYuX2NvbXB0eXBlID0gdHlwZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICd1bmtub3duIGNvbXByZXNzaW9uIHR5cGUnCisKKyAgICBkZWYgZ2V0Y29tcHR5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb21wdHlwZQorCisgICAgZGVmIGdldGNvbXBuYW1lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jb21wdHlwZSA9PSAnVUxBVyc6CisgICAgICAgICAgICByZXR1cm4gJ0NDSVRUIEcuNzExIHUtbGF3JworICAgICAgICBlbGlmIHNlbGYuX2NvbXB0eXBlID09ICdBTEFXJzoKKyAgICAgICAgICAgIHJldHVybiAnQ0NJVFQgRy43MTEgQS1sYXcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ25vdCBjb21wcmVzc2VkJworCisgICAgZGVmIHNldHBhcmFtcyhzZWxmLCBwYXJhbXMpOgorICAgICAgICBuY2hhbm5lbHMsIHNhbXB3aWR0aCwgZnJhbWVyYXRlLCBuZnJhbWVzLCBjb21wdHlwZSwgY29tcG5hbWUgPSBwYXJhbXMKKyAgICAgICAgc2VsZi5zZXRuY2hhbm5lbHMobmNoYW5uZWxzKQorICAgICAgICBzZWxmLnNldHNhbXB3aWR0aChzYW1wd2lkdGgpCisgICAgICAgIHNlbGYuc2V0ZnJhbWVyYXRlKGZyYW1lcmF0ZSkKKyAgICAgICAgc2VsZi5zZXRuZnJhbWVzKG5mcmFtZXMpCisgICAgICAgIHNlbGYuc2V0Y29tcHR5cGUoY29tcHR5cGUsIGNvbXBuYW1lKQorCisgICAgZGVmIGdldHBhcmFtcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0bmNoYW5uZWxzKCksIHNlbGYuZ2V0c2FtcHdpZHRoKCksIFwKKyAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0ZnJhbWVyYXRlKCksIHNlbGYuZ2V0bmZyYW1lcygpLCBcCisgICAgICAgICAgICAgICAgICBzZWxmLmdldGNvbXB0eXBlKCksIHNlbGYuZ2V0Y29tcG5hbWUoKQorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uZnJhbWVzd3JpdHRlbgorCisgICAgZGVmIHdyaXRlZnJhbWVzcmF3KHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9lbnN1cmVfaGVhZGVyX3dyaXR0ZW4oKQorICAgICAgICBuZnJhbWVzID0gbGVuKGRhdGEpIC8gc2VsZi5fZnJhbWVzaXplCisgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlID09ICdVTEFXJzoKKyAgICAgICAgICAgIGltcG9ydCBhdWRpb29wCisgICAgICAgICAgICBkYXRhID0gYXVkaW9vcC5saW4ydWxhdyhkYXRhLCBzZWxmLl9zYW1wd2lkdGgpCisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoZGF0YSkKKyAgICAgICAgc2VsZi5fbmZyYW1lc3dyaXR0ZW4gPSBzZWxmLl9uZnJhbWVzd3JpdHRlbiArIG5mcmFtZXMKKyAgICAgICAgc2VsZi5fZGF0YXdyaXR0ZW4gPSBzZWxmLl9kYXRhd3JpdHRlbiArIGxlbihkYXRhKQorCisgICAgZGVmIHdyaXRlZnJhbWVzKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLndyaXRlZnJhbWVzcmF3KGRhdGEpCisgICAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuICE9IHNlbGYuX25mcmFtZXMgb3IgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCAhPSBzZWxmLl9kYXRhd3JpdHRlbjoKKyAgICAgICAgICAgIHNlbGYuX3BhdGNoaGVhZGVyKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fZW5zdXJlX2hlYWRlcl93cml0dGVuKCkKKyAgICAgICAgaWYgc2VsZi5fbmZyYW1lc3dyaXR0ZW4gIT0gc2VsZi5fbmZyYW1lcyBvciBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9kYXRhbGVuZ3RoICE9IHNlbGYuX2RhdGF3cml0dGVuOgorICAgICAgICAgICAgc2VsZi5fcGF0Y2hoZWFkZXIoKQorICAgICAgICBzZWxmLl9maWxlLmZsdXNoKCkKKyAgICAgICAgc2VsZi5fZmlsZSA9IE5vbmUKKworICAgICMKKyAgICAjIHByaXZhdGUgbWV0aG9kcworICAgICMKKworICAgIGRlZiBfZW5zdXJlX2hlYWRlcl93cml0dGVuKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fbmZyYW1lc3dyaXR0ZW46CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fbmNoYW5uZWxzOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnIyBvZiBjaGFubmVscyBub3Qgc3BlY2lmaWVkJworICAgICAgICAgICAgaWYgbm90IHNlbGYuX3NhbXB3aWR0aDoKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3NhbXBsZSB3aWR0aCBub3Qgc3BlY2lmaWVkJworICAgICAgICAgICAgaWYgbm90IHNlbGYuX2ZyYW1lcmF0ZToKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2ZyYW1lIHJhdGUgbm90IHNwZWNpZmllZCcKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcigpCisKKyAgICBkZWYgX3dyaXRlX2hlYWRlcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgPT0gJ05PTkUnOgorICAgICAgICAgICAgaWYgc2VsZi5fc2FtcHdpZHRoID09IDE6CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBBVURJT19GSUxFX0VOQ09ESU5HX0xJTkVBUl84CisgICAgICAgICAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gMQorICAgICAgICAgICAgZWxpZiBzZWxmLl9zYW1wd2lkdGggPT0gMjoKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IEFVRElPX0ZJTEVfRU5DT0RJTkdfTElORUFSXzE2CisgICAgICAgICAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gMgorICAgICAgICAgICAgZWxpZiBzZWxmLl9zYW1wd2lkdGggPT0gNDoKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IEFVRElPX0ZJTEVfRU5DT0RJTkdfTElORUFSXzMyCisgICAgICAgICAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gNAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2ludGVybmFsIGVycm9yJworICAgICAgICBlbGlmIHNlbGYuX2NvbXB0eXBlID09ICdVTEFXJzoKKyAgICAgICAgICAgIGVuY29kaW5nID0gQVVESU9fRklMRV9FTkNPRElOR19NVUxBV184CisgICAgICAgICAgICBzZWxmLl9mcmFtZXNpemUgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2ludGVybmFsIGVycm9yJworICAgICAgICBzZWxmLl9mcmFtZXNpemUgPSBzZWxmLl9mcmFtZXNpemUgKiBzZWxmLl9uY2hhbm5lbHMKKyAgICAgICAgX3dyaXRlX3UzMihzZWxmLl9maWxlLCBBVURJT19GSUxFX01BR0lDKQorICAgICAgICBoZWFkZXJfc2l6ZSA9IDI1ICsgbGVuKHNlbGYuX2luZm8pCisgICAgICAgIGhlYWRlcl9zaXplID0gKGhlYWRlcl9zaXplICsgNykgJiB+NworICAgICAgICBfd3JpdGVfdTMyKHNlbGYuX2ZpbGUsIGhlYWRlcl9zaXplKQorICAgICAgICBpZiBzZWxmLl9uZnJhbWVzID09IEFVRElPX1VOS05PV05fU0laRToKKyAgICAgICAgICAgIGxlbmd0aCA9IEFVRElPX1VOS05PV05fU0laRQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5fbmZyYW1lcyAqIHNlbGYuX2ZyYW1lc2l6ZQorICAgICAgICBfd3JpdGVfdTMyKHNlbGYuX2ZpbGUsIGxlbmd0aCkKKyAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCA9IGxlbmd0aAorICAgICAgICBfd3JpdGVfdTMyKHNlbGYuX2ZpbGUsIGVuY29kaW5nKQorICAgICAgICBfd3JpdGVfdTMyKHNlbGYuX2ZpbGUsIHNlbGYuX2ZyYW1lcmF0ZSkKKyAgICAgICAgX3dyaXRlX3UzMihzZWxmLl9maWxlLCBzZWxmLl9uY2hhbm5lbHMpCisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoc2VsZi5faW5mbykKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnXDAnKihoZWFkZXJfc2l6ZSAtIGxlbihzZWxmLl9pbmZvKSAtIDI0KSkKKworICAgIGRlZiBfcGF0Y2hoZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUuc2Vlayg4KQorICAgICAgICBfd3JpdGVfdTMyKHNlbGYuX2ZpbGUsIHNlbGYuX2RhdGF3cml0dGVuKQorICAgICAgICBzZWxmLl9kYXRhbGVuZ3RoID0gc2VsZi5fZGF0YXdyaXR0ZW4KKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKDAsIDIpCisKK2RlZiBvcGVuKGYsIG1vZGU9Tm9uZSk6CisgICAgaWYgbW9kZSBpcyBOb25lOgorICAgICAgICBpZiBoYXNhdHRyKGYsICdtb2RlJyk6CisgICAgICAgICAgICBtb2RlID0gZi5tb2RlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2RlID0gJ3JiJworICAgIGlmIG1vZGUgaW4gKCdyJywgJ3JiJyk6CisgICAgICAgIHJldHVybiBBdV9yZWFkKGYpCisgICAgZWxpZiBtb2RlIGluICgndycsICd3YicpOgorICAgICAgICByZXR1cm4gQXVfd3JpdGUoZikKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBFcnJvciwgIm1vZGUgbXVzdCBiZSAncicsICdyYicsICd3Jywgb3IgJ3diJyIKKworb3BlbmZwID0gb3BlbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdW5hdS5weWMgYi9saWIvcHl0aG9uMi43L3N1bmF1LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzlmMjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdW5hdS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdW5hdS5weW8gYi9saWIvcHl0aG9uMi43L3N1bmF1LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzlmMjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdW5hdS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdW5hdWRpby5weSBiL2xpYi9weXRob24yLjcvc3VuYXVkaW8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkNzMzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3VuYXVkaW8ucHkKQEAgLTAsMCArMSw0OSBAQAorIiIiSW50ZXJwcmV0IHN1biBhdWRpbyBoZWFkZXJzLiIiIgorZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJ0aGUgc3VuYXVkaW8gbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMDsgIgorICAgICAgICAgInVzZSB0aGUgc3VuYXUgbW9kdWxlIGluc3RlYWQiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworCitNQUdJQyA9ICcuc25kJworCitjbGFzcyBlcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitkZWYgZ2V0X2xvbmdfYmUocyk6CisgICAgIiIiQ29udmVydCBhIDQtY2hhciB2YWx1ZSB0byBpbnRlZ2VyLiIiIgorICAgIHJldHVybiAob3JkKHNbMF0pPDwyNCkgfCAob3JkKHNbMV0pPDwxNikgfCAob3JkKHNbMl0pPDw4KSB8IG9yZChzWzNdKQorCisKK2RlZiBnZXRoZHIoZnApOgorICAgICIiIlJlYWQgYSBzb3VuZCBoZWFkZXIgZnJvbSBhbiBvcGVuIGZpbGUuIiIiCisgICAgaWYgZnAucmVhZCg0KSAhPSBNQUdJQzoKKyAgICAgICAgcmFpc2UgZXJyb3IsICdnZXRoZHI6IGJhZCBtYWdpYyB3b3JkJworICAgIGhkcl9zaXplID0gZ2V0X2xvbmdfYmUoZnAucmVhZCg0KSkKKyAgICBkYXRhX3NpemUgPSBnZXRfbG9uZ19iZShmcC5yZWFkKDQpKQorICAgIGVuY29kaW5nID0gZ2V0X2xvbmdfYmUoZnAucmVhZCg0KSkKKyAgICBzYW1wbGVfcmF0ZSA9IGdldF9sb25nX2JlKGZwLnJlYWQoNCkpCisgICAgY2hhbm5lbHMgPSBnZXRfbG9uZ19iZShmcC5yZWFkKDQpKQorICAgIGV4Y2VzcyA9IGhkcl9zaXplIC0gMjQKKyAgICBpZiBleGNlc3MgPCAwOgorICAgICAgICByYWlzZSBlcnJvciwgJ2dldGhkcjogYmFkIGhkcl9zaXplJworICAgIGlmIGV4Y2VzcyA+IDA6CisgICAgICAgIGluZm8gPSBmcC5yZWFkKGV4Y2VzcykKKyAgICBlbHNlOgorICAgICAgICBpbmZvID0gJycKKyAgICByZXR1cm4gKGRhdGFfc2l6ZSwgZW5jb2RpbmcsIHNhbXBsZV9yYXRlLCBjaGFubmVscywgaW5mbykKKworCitkZWYgcHJpbnRoZHIoZmlsZSk6CisgICAgIiIiUmVhZCBhbmQgcHJpbnQgdGhlIHNvdW5kIGhlYWRlciBvZiBhIG5hbWVkIGZpbGUuIiIiCisgICAgaGRyID0gZ2V0aGRyKG9wZW4oZmlsZSwgJ3InKSkKKyAgICBkYXRhX3NpemUsIGVuY29kaW5nLCBzYW1wbGVfcmF0ZSwgY2hhbm5lbHMsIGluZm8gPSBoZHIKKyAgICB3aGlsZSBpbmZvWy0xOl0gPT0gJ1wwJzoKKyAgICAgICAgaW5mbyA9IGluZm9bOi0xXQorICAgIHByaW50ICdGaWxlIG5hbWU6ICAnLCBmaWxlCisgICAgcHJpbnQgJ0RhdGEgc2l6ZTogICcsIGRhdGFfc2l6ZQorICAgIHByaW50ICdFbmNvZGluZzogICAnLCBlbmNvZGluZworICAgIHByaW50ICdTYW1wbGUgcmF0ZTonLCBzYW1wbGVfcmF0ZQorICAgIHByaW50ICdDaGFubmVsczogICAnLCBjaGFubmVscworICAgIHByaW50ICdJbmZvOiAgICAgICAnLCByZXByKGluZm8pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N1bmF1ZGlvLnB5YyBiL2xpYi9weXRob24yLjcvc3VuYXVkaW8ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOWJiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N1bmF1ZGlvLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N1bmF1ZGlvLnB5byBiL2xpYi9weXRob24yLjcvc3VuYXVkaW8ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOWJiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N1bmF1ZGlvLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N5bWJvbC5weSBiL2xpYi9weXRob24yLjcvc3ltYm9sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI0ZDRlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N5bWJvbC5weQpAQCAtMCwwICsxLDExNCBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiJOb24tdGVybWluYWwgc3ltYm9scyBvZiBQeXRob24gZ3JhbW1hciAoZnJvbSAiZ3JhbWluaXQuaCIpLiIiIgorCisjICBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQ7IHBsZWFzZSBkb24ndCBtdWNrIGl0IHVwIQorIworIyAgVG8gdXBkYXRlIHRoZSBzeW1ib2xzIGluIHRoaXMgZmlsZSwgJ2NkJyB0byB0aGUgdG9wIGRpcmVjdG9yeSBvZgorIyAgdGhlIHB5dGhvbiBzb3VyY2UgdHJlZSBhZnRlciBidWlsZGluZyB0aGUgaW50ZXJwcmV0ZXIgYW5kIHJ1bjoKKyMKKyMgICAgLi9weXRob24gTGliL3N5bWJvbC5weQorCisjLS1zdGFydCBjb25zdGFudHMtLQorc2luZ2xlX2lucHV0ID0gMjU2CitmaWxlX2lucHV0ID0gMjU3CitldmFsX2lucHV0ID0gMjU4CitkZWNvcmF0b3IgPSAyNTkKK2RlY29yYXRvcnMgPSAyNjAKK2RlY29yYXRlZCA9IDI2MQorZnVuY2RlZiA9IDI2MgorcGFyYW1ldGVycyA9IDI2MwordmFyYXJnc2xpc3QgPSAyNjQKK2ZwZGVmID0gMjY1CitmcGxpc3QgPSAyNjYKK3N0bXQgPSAyNjcKK3NpbXBsZV9zdG10ID0gMjY4CitzbWFsbF9zdG10ID0gMjY5CitleHByX3N0bXQgPSAyNzAKK2F1Z2Fzc2lnbiA9IDI3MQorcHJpbnRfc3RtdCA9IDI3MgorZGVsX3N0bXQgPSAyNzMKK3Bhc3Nfc3RtdCA9IDI3NAorZmxvd19zdG10ID0gMjc1CiticmVha19zdG10ID0gMjc2Citjb250aW51ZV9zdG10ID0gMjc3CityZXR1cm5fc3RtdCA9IDI3OAoreWllbGRfc3RtdCA9IDI3OQorcmFpc2Vfc3RtdCA9IDI4MAoraW1wb3J0X3N0bXQgPSAyODEKK2ltcG9ydF9uYW1lID0gMjgyCitpbXBvcnRfZnJvbSA9IDI4MworaW1wb3J0X2FzX25hbWUgPSAyODQKK2RvdHRlZF9hc19uYW1lID0gMjg1CitpbXBvcnRfYXNfbmFtZXMgPSAyODYKK2RvdHRlZF9hc19uYW1lcyA9IDI4NworZG90dGVkX25hbWUgPSAyODgKK2dsb2JhbF9zdG10ID0gMjg5CitleGVjX3N0bXQgPSAyOTAKK2Fzc2VydF9zdG10ID0gMjkxCitjb21wb3VuZF9zdG10ID0gMjkyCitpZl9zdG10ID0gMjkzCit3aGlsZV9zdG10ID0gMjk0Citmb3Jfc3RtdCA9IDI5NQordHJ5X3N0bXQgPSAyOTYKK3dpdGhfc3RtdCA9IDI5Nword2l0aF9pdGVtID0gMjk4CitleGNlcHRfY2xhdXNlID0gMjk5CitzdWl0ZSA9IDMwMAordGVzdGxpc3Rfc2FmZSA9IDMwMQorb2xkX3Rlc3QgPSAzMDIKK29sZF9sYW1iZGVmID0gMzAzCit0ZXN0ID0gMzA0Citvcl90ZXN0ID0gMzA1CithbmRfdGVzdCA9IDMwNgorbm90X3Rlc3QgPSAzMDcKK2NvbXBhcmlzb24gPSAzMDgKK2NvbXBfb3AgPSAzMDkKK2V4cHIgPSAzMTAKK3hvcl9leHByID0gMzExCithbmRfZXhwciA9IDMxMgorc2hpZnRfZXhwciA9IDMxMworYXJpdGhfZXhwciA9IDMxNAordGVybSA9IDMxNQorZmFjdG9yID0gMzE2Citwb3dlciA9IDMxNworYXRvbSA9IDMxOAorbGlzdG1ha2VyID0gMzE5Cit0ZXN0bGlzdF9jb21wID0gMzIwCitsYW1iZGVmID0gMzIxCit0cmFpbGVyID0gMzIyCitzdWJzY3JpcHRsaXN0ID0gMzIzCitzdWJzY3JpcHQgPSAzMjQKK3NsaWNlb3AgPSAzMjUKK2V4cHJsaXN0ID0gMzI2Cit0ZXN0bGlzdCA9IDMyNworZGljdG9yc2V0bWFrZXIgPSAzMjgKK2NsYXNzZGVmID0gMzI5CithcmdsaXN0ID0gMzMwCithcmd1bWVudCA9IDMzMQorbGlzdF9pdGVyID0gMzMyCitsaXN0X2ZvciA9IDMzMworbGlzdF9pZiA9IDMzNAorY29tcF9pdGVyID0gMzM1Citjb21wX2ZvciA9IDMzNgorY29tcF9pZiA9IDMzNwordGVzdGxpc3QxID0gMzM4CitlbmNvZGluZ19kZWNsID0gMzM5Cit5aWVsZF9leHByID0gMzQwCisjLS1lbmQgY29uc3RhbnRzLS0KKworc3ltX25hbWUgPSB7fQorZm9yIF9uYW1lLCBfdmFsdWUgaW4gZ2xvYmFscygpLml0ZW1zKCk6CisgICAgaWYgdHlwZShfdmFsdWUpIGlzIHR5cGUoMCk6CisgICAgICAgIHN5bV9uYW1lW192YWx1ZV0gPSBfbmFtZQorCisKK2RlZiBtYWluKCk6CisgICAgaW1wb3J0IHN5cworICAgIGltcG9ydCB0b2tlbgorICAgIGlmIGxlbihzeXMuYXJndikgPT0gMToKKyAgICAgICAgc3lzLmFyZ3YgPSBzeXMuYXJndiArIFsiSW5jbHVkZS9ncmFtaW5pdC5oIiwgIkxpYi9zeW1ib2wucHkiXQorICAgIHRva2VuLm1haW4oKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zeW1ib2wucHljIGIvbGliL3B5dGhvbjIuNy9zeW1ib2wucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDBmOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N5bWJvbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zeW1ib2wucHlvIGIvbGliL3B5dGhvbjIuNy9zeW1ib2wucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDBmOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N5bWJvbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zeW10YWJsZS5weSBiL2xpYi9weXRob24yLjcvc3ltdGFibGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3M2Y1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3ltdGFibGUucHkKQEAgLTAsMCArMSwyNDIgQEAKKyIiIkludGVyZmFjZSB0byB0aGUgY29tcGlsZXIncyBpbnRlcm5hbCBzeW1ib2wgdGFibGVzIiIiCisKK2ltcG9ydCBfc3ltdGFibGUKK2Zyb20gX3N5bXRhYmxlIGltcG9ydCAoVVNFLCBERUZfR0xPQkFMLCBERUZfTE9DQUwsIERFRl9QQVJBTSwKKyAgICAgREVGX0lNUE9SVCwgREVGX0JPVU5ELCBPUFRfSU1QT1JUX1NUQVIsIE9QVF9FWEVDLCBPUFRfQkFSRV9FWEVDLAorICAgICBTQ09QRV9PRkYsIFNDT1BFX01BU0ssIEZSRUUsIEdMT0JBTF9JTVBMSUNJVCwgR0xPQkFMX0VYUExJQ0lULCBDRUxMLCBMT0NBTCkKKworaW1wb3J0IHdlYWtyZWYKKworX19hbGxfXyA9IFsic3ltdGFibGUiLCAiU3ltYm9sVGFibGUiLCAiQ2xhc3MiLCAiRnVuY3Rpb24iLCAiU3ltYm9sIl0KKworZGVmIHN5bXRhYmxlKGNvZGUsIGZpbGVuYW1lLCBjb21waWxlX3R5cGUpOgorICAgIHJhdyA9IF9zeW10YWJsZS5zeW10YWJsZShjb2RlLCBmaWxlbmFtZSwgY29tcGlsZV90eXBlKQorICAgIGZvciB0b3AgaW4gcmF3Lml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgaWYgdG9wLm5hbWUgPT0gJ3RvcCc6CisgICAgICAgICAgICBicmVhaworICAgIHJldHVybiBfbmV3U3ltYm9sVGFibGUodG9wLCBmaWxlbmFtZSkKKworY2xhc3MgU3ltYm9sVGFibGVGYWN0b3J5OgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fX21lbW8gPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkoKQorCisgICAgZGVmIG5ldyhzZWxmLCB0YWJsZSwgZmlsZW5hbWUpOgorICAgICAgICBpZiB0YWJsZS50eXBlID09IF9zeW10YWJsZS5UWVBFX0ZVTkNUSU9OOgorICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uKHRhYmxlLCBmaWxlbmFtZSkKKyAgICAgICAgaWYgdGFibGUudHlwZSA9PSBfc3ltdGFibGUuVFlQRV9DTEFTUzoKKyAgICAgICAgICAgIHJldHVybiBDbGFzcyh0YWJsZSwgZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBTeW1ib2xUYWJsZSh0YWJsZSwgZmlsZW5hbWUpCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgdGFibGUsIGZpbGVuYW1lKToKKyAgICAgICAga2V5ID0gdGFibGUsIGZpbGVuYW1lCisgICAgICAgIG9iaiA9IHNlbGYuX19tZW1vLmdldChrZXksIE5vbmUpCisgICAgICAgIGlmIG9iaiBpcyBOb25lOgorICAgICAgICAgICAgb2JqID0gc2VsZi5fX21lbW9ba2V5XSA9IHNlbGYubmV3KHRhYmxlLCBmaWxlbmFtZSkKKyAgICAgICAgcmV0dXJuIG9iagorCitfbmV3U3ltYm9sVGFibGUgPSBTeW1ib2xUYWJsZUZhY3RvcnkoKQorCisKK2NsYXNzIFN5bWJvbFRhYmxlKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmF3X3RhYmxlLCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYuX3RhYmxlID0gcmF3X3RhYmxlCisgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5fc3ltYm9scyA9IHt9CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX19jbGFzc19fID09IFN5bWJvbFRhYmxlOgorICAgICAgICAgICAga2luZCA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBraW5kID0gIiVzICIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGlmIHNlbGYuX3RhYmxlLm5hbWUgPT0gImdsb2JhbCI6CisgICAgICAgICAgICByZXR1cm4gIjx7MH1TeW1ib2xUYWJsZSBmb3IgbW9kdWxlIHsxfT4iLmZvcm1hdChraW5kLCBzZWxmLl9maWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiPHswfVN5bWJvbFRhYmxlIGZvciB7MX0gaW4gezJ9PiIuZm9ybWF0KGtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90YWJsZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZW5hbWUpCisKKyAgICBkZWYgZ2V0X3R5cGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3RhYmxlLnR5cGUgPT0gX3N5bXRhYmxlLlRZUEVfTU9EVUxFOgorICAgICAgICAgICAgcmV0dXJuICJtb2R1bGUiCisgICAgICAgIGlmIHNlbGYuX3RhYmxlLnR5cGUgPT0gX3N5bXRhYmxlLlRZUEVfRlVOQ1RJT046CisgICAgICAgICAgICByZXR1cm4gImZ1bmN0aW9uIgorICAgICAgICBpZiBzZWxmLl90YWJsZS50eXBlID09IF9zeW10YWJsZS5UWVBFX0NMQVNTOgorICAgICAgICAgICAgcmV0dXJuICJjbGFzcyIKKyAgICAgICAgYXNzZXJ0IHNlbGYuX3RhYmxlLnR5cGUgaW4gKDEsIDIsIDMpLCBcCisgICAgICAgICAgICAgICAidW5leHBlY3RlZCB0eXBlOiB7MH0iLmZvcm1hdChzZWxmLl90YWJsZS50eXBlKQorCisgICAgZGVmIGdldF9pZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RhYmxlLmlkCisKKyAgICBkZWYgZ2V0X25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90YWJsZS5uYW1lCisKKyAgICBkZWYgZ2V0X2xpbmVubyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RhYmxlLmxpbmVubworCisgICAgZGVmIGlzX29wdGltaXplZChzZWxmKToKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFibGUudHlwZSA9PSBfc3ltdGFibGUuVFlQRV9GVU5DVElPTgorICAgICAgICAgICAgICAgICAgICBhbmQgbm90IHNlbGYuX3RhYmxlLm9wdGltaXplZCkKKworICAgIGRlZiBpc19uZXN0ZWQoc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYmxlLm5lc3RlZCkKKworICAgIGRlZiBoYXNfY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYmxlLmNoaWxkcmVuKQorCisgICAgZGVmIGhhc19leGVjKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgc2NvcGUgdXNlcyBleGVjIiIiCisgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYmxlLm9wdGltaXplZCAmIChPUFRfRVhFQyB8IE9QVF9CQVJFX0VYRUMpKQorCisgICAgZGVmIGhhc19pbXBvcnRfc3RhcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIHNjb3BlIHVzZXMgaW1wb3J0ICoiIiIKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFibGUub3B0aW1pemVkICYgT1BUX0lNUE9SVF9TVEFSKQorCisgICAgZGVmIGdldF9pZGVudGlmaWVycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RhYmxlLnN5bWJvbHMua2V5cygpCisKKyAgICBkZWYgbG9va3VwKHNlbGYsIG5hbWUpOgorICAgICAgICBzeW0gPSBzZWxmLl9zeW1ib2xzLmdldChuYW1lKQorICAgICAgICBpZiBzeW0gaXMgTm9uZToKKyAgICAgICAgICAgIGZsYWdzID0gc2VsZi5fdGFibGUuc3ltYm9sc1tuYW1lXQorICAgICAgICAgICAgbmFtZXNwYWNlcyA9IHNlbGYuX19jaGVja19jaGlsZHJlbihuYW1lKQorICAgICAgICAgICAgc3ltID0gc2VsZi5fc3ltYm9sc1tuYW1lXSA9IFN5bWJvbChuYW1lLCBmbGFncywgbmFtZXNwYWNlcykKKyAgICAgICAgcmV0dXJuIHN5bQorCisgICAgZGVmIGdldF9zeW1ib2xzKHNlbGYpOgorICAgICAgICByZXR1cm4gW3NlbGYubG9va3VwKGlkZW50KSBmb3IgaWRlbnQgaW4gc2VsZi5nZXRfaWRlbnRpZmllcnMoKV0KKworICAgIGRlZiBfX2NoZWNrX2NoaWxkcmVuKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gW19uZXdTeW1ib2xUYWJsZShzdCwgc2VsZi5fZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgZm9yIHN0IGluIHNlbGYuX3RhYmxlLmNoaWxkcmVuCisgICAgICAgICAgICAgICAgaWYgc3QubmFtZSA9PSBuYW1lXQorCisgICAgZGVmIGdldF9jaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIFtfbmV3U3ltYm9sVGFibGUoc3QsIHNlbGYuX2ZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGZvciBzdCBpbiBzZWxmLl90YWJsZS5jaGlsZHJlbl0KKworCitjbGFzcyBGdW5jdGlvbihTeW1ib2xUYWJsZSk6CisKKyAgICAjIERlZmF1bHQgdmFsdWVzIGZvciBpbnN0YW5jZSB2YXJpYWJsZXMKKyAgICBfX3BhcmFtcyA9IE5vbmUKKyAgICBfX2xvY2FscyA9IE5vbmUKKyAgICBfX2ZyZWVzID0gTm9uZQorICAgIF9fZ2xvYmFscyA9IE5vbmUKKworICAgIGRlZiBfX2lkZW50c19tYXRjaGluZyhzZWxmLCB0ZXN0X2Z1bmMpOgorICAgICAgICByZXR1cm4gdHVwbGUoW2lkZW50IGZvciBpZGVudCBpbiBzZWxmLmdldF9pZGVudGlmaWVycygpCisgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9mdW5jKHNlbGYuX3RhYmxlLnN5bWJvbHNbaWRlbnRdKV0pCisKKyAgICBkZWYgZ2V0X3BhcmFtZXRlcnMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX19wYXJhbXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX19wYXJhbXMgPSBzZWxmLl9faWRlbnRzX21hdGNoaW5nKGxhbWJkYSB4OnggJiBERUZfUEFSQU0pCisgICAgICAgIHJldHVybiBzZWxmLl9fcGFyYW1zCisKKyAgICBkZWYgZ2V0X2xvY2FscyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fX2xvY2FscyBpcyBOb25lOgorICAgICAgICAgICAgbG9jcyA9IChMT0NBTCwgQ0VMTCkKKyAgICAgICAgICAgIHRlc3QgPSBsYW1iZGEgeDogKCh4ID4+IFNDT1BFX09GRikgJiBTQ09QRV9NQVNLKSBpbiBsb2NzCisgICAgICAgICAgICBzZWxmLl9fbG9jYWxzID0gc2VsZi5fX2lkZW50c19tYXRjaGluZyh0ZXN0KQorICAgICAgICByZXR1cm4gc2VsZi5fX2xvY2FscworCisgICAgZGVmIGdldF9nbG9iYWxzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9fZ2xvYmFscyBpcyBOb25lOgorICAgICAgICAgICAgZ2xvYiA9IChHTE9CQUxfSU1QTElDSVQsIEdMT0JBTF9FWFBMSUNJVCkKKyAgICAgICAgICAgIHRlc3QgPSBsYW1iZGEgeDooKHggPj4gU0NPUEVfT0ZGKSAmIFNDT1BFX01BU0spIGluIGdsb2IKKyAgICAgICAgICAgIHNlbGYuX19nbG9iYWxzID0gc2VsZi5fX2lkZW50c19tYXRjaGluZyh0ZXN0KQorICAgICAgICByZXR1cm4gc2VsZi5fX2dsb2JhbHMKKworICAgIGRlZiBnZXRfZnJlZXMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX19mcmVlcyBpcyBOb25lOgorICAgICAgICAgICAgaXNfZnJlZSA9IGxhbWJkYSB4OigoeCA+PiBTQ09QRV9PRkYpICYgU0NPUEVfTUFTSykgPT0gRlJFRQorICAgICAgICAgICAgc2VsZi5fX2ZyZWVzID0gc2VsZi5fX2lkZW50c19tYXRjaGluZyhpc19mcmVlKQorICAgICAgICByZXR1cm4gc2VsZi5fX2ZyZWVzCisKKworY2xhc3MgQ2xhc3MoU3ltYm9sVGFibGUpOgorCisgICAgX19tZXRob2RzID0gTm9uZQorCisgICAgZGVmIGdldF9tZXRob2RzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9fbWV0aG9kcyBpcyBOb25lOgorICAgICAgICAgICAgZCA9IHt9CisgICAgICAgICAgICBmb3Igc3QgaW4gc2VsZi5fdGFibGUuY2hpbGRyZW46CisgICAgICAgICAgICAgICAgZFtzdC5uYW1lXSA9IDEKKyAgICAgICAgICAgIHNlbGYuX19tZXRob2RzID0gdHVwbGUoZCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19tZXRob2RzCisKKworY2xhc3MgU3ltYm9sKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZmxhZ3MsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgICAgIHNlbGYuX19uYW1lID0gbmFtZQorICAgICAgICBzZWxmLl9fZmxhZ3MgPSBmbGFncworICAgICAgICBzZWxmLl9fc2NvcGUgPSAoZmxhZ3MgPj4gU0NPUEVfT0ZGKSAmIFNDT1BFX01BU0sgIyBsaWtlIFB5U1RfR2V0U2NvcGUoKQorICAgICAgICBzZWxmLl9fbmFtZXNwYWNlcyA9IG5hbWVzcGFjZXMgb3IgKCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8c3ltYm9sIHswIXJ9PiIuZm9ybWF0KHNlbGYuX19uYW1lKQorCisgICAgZGVmIGdldF9uYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX25hbWUKKworICAgIGRlZiBpc19yZWZlcmVuY2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9fZmxhZ3MgJiBfc3ltdGFibGUuVVNFKQorCisgICAgZGVmIGlzX3BhcmFtZXRlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX2ZsYWdzICYgREVGX1BBUkFNKQorCisgICAgZGVmIGlzX2dsb2JhbChzZWxmKToKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX3Njb3BlIGluIChHTE9CQUxfSU1QTElDSVQsIEdMT0JBTF9FWFBMSUNJVCkpCisKKyAgICBkZWYgaXNfZGVjbGFyZWRfZ2xvYmFsKHNlbGYpOgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9fc2NvcGUgPT0gR0xPQkFMX0VYUExJQ0lUKQorCisgICAgZGVmIGlzX2xvY2FsKHNlbGYpOgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9fZmxhZ3MgJiBERUZfQk9VTkQpCisKKyAgICBkZWYgaXNfZnJlZShzZWxmKToKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX3Njb3BlID09IEZSRUUpCisKKyAgICBkZWYgaXNfaW1wb3J0ZWQoc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYuX19mbGFncyAmIERFRl9JTVBPUlQpCisKKyAgICBkZWYgaXNfYXNzaWduZWQoc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYuX19mbGFncyAmIERFRl9MT0NBTCkKKworICAgIGRlZiBpc19uYW1lc3BhY2Uoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdHJ1ZSBpZiBuYW1lIGJpbmRpbmcgaW50cm9kdWNlcyBuZXcgbmFtZXNwYWNlLgorCisgICAgICAgIElmIHRoZSBuYW1lIGlzIHVzZWQgYXMgdGhlIHRhcmdldCBvZiBhIGZ1bmN0aW9uIG9yIGNsYXNzCisgICAgICAgIHN0YXRlbWVudCwgdGhpcyB3aWxsIGJlIHRydWUuCisKKyAgICAgICAgTm90ZSB0aGF0IGEgc2luZ2xlIG5hbWUgY2FuIGJlIGJvdW5kIHRvIG11bHRpcGxlIG9iamVjdHMuICBJZgorICAgICAgICBpc19uYW1lc3BhY2UoKSBpcyB0cnVlLCB0aGUgbmFtZSBtYXkgYWxzbyBiZSBib3VuZCB0byBvdGhlcgorICAgICAgICBvYmplY3RzLCBsaWtlIGFuIGludCBvciBsaXN0LCB0aGF0IGRvZXMgbm90IGludHJvZHVjZSBhIG5ldworICAgICAgICBuYW1lc3BhY2UuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9fbmFtZXNwYWNlcykKKworICAgIGRlZiBnZXRfbmFtZXNwYWNlcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBuYW1lc3BhY2VzIGJvdW5kIHRvIHRoaXMgbmFtZSIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX25hbWVzcGFjZXMKKworICAgIGRlZiBnZXRfbmFtZXNwYWNlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBzaW5nbGUgbmFtZXNwYWNlIGJvdW5kIHRvIHRoaXMgbmFtZS4KKworICAgICAgICBSYWlzZXMgVmFsdWVFcnJvciBpZiB0aGUgbmFtZSBpcyBib3VuZCB0byBtdWx0aXBsZSBuYW1lc3BhY2VzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGVuKHNlbGYuX19uYW1lc3BhY2VzKSAhPSAxOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5hbWUgaXMgYm91bmQgdG8gbXVsdGlwbGUgbmFtZXNwYWNlcyIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lc3BhY2VzWzBdCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaW1wb3J0IG9zLCBzeXMKKyAgICBzcmMgPSBvcGVuKHN5cy5hcmd2WzBdKS5yZWFkKCkKKyAgICBtb2QgPSBzeW10YWJsZShzcmMsIG9zLnBhdGguc3BsaXQoc3lzLmFyZ3ZbMF0pWzFdLCAiZXhlYyIpCisgICAgZm9yIGlkZW50IGluIG1vZC5nZXRfaWRlbnRpZmllcnMoKToKKyAgICAgICAgaW5mbyA9IG1vZC5sb29rdXAoaWRlbnQpCisgICAgICAgIHByaW50IGluZm8sIGluZm8uaXNfbG9jYWwoKSwgaW5mby5pc19uYW1lc3BhY2UoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zeW10YWJsZS5weWMgYi9saWIvcHl0aG9uMi43L3N5bXRhYmxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGU3MDEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zeW10YWJsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zeW10YWJsZS5weW8gYi9saWIvcHl0aG9uMi43L3N5bXRhYmxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQ3Mjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zeW10YWJsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zeXNjb25maWcucHkgYi9saWIvcHl0aG9uMi43L3N5c2NvbmZpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGRiZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zeXNjb25maWcucHkKQEAgLTAsMCArMSw2NTIgQEAKKyIiIlByb3ZpZGUgYWNjZXNzIHRvIFB5dGhvbidzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisKKyIiIgoraW1wb3J0IHN5cworaW1wb3J0IG9zCitmcm9tIG9zLnBhdGggaW1wb3J0IHBhcmRpciwgcmVhbHBhdGgKKworX0lOU1RBTExfU0NIRU1FUyA9IHsKKyAgICAncG9zaXhfcHJlZml4JzogeworICAgICAgICAnc3RkbGliJzogJ3tiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3BsYXRzdGRsaWInOiAne3BsYXRiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3B1cmVsaWInOiAne2Jhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICdwbGF0bGliJzogJ3twbGF0YmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzJywKKyAgICAgICAgJ2luY2x1ZGUnOiAne2Jhc2V9L2luY2x1ZGUvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3BsYXRpbmNsdWRlJzogJ3twbGF0YmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH0nLAorICAgICAgICAnc2NyaXB0cyc6ICd7YmFzZX0vYmluJywKKyAgICAgICAgJ2RhdGEnOiAne2Jhc2V9JywKKyAgICAgICAgfSwKKyAgICAncG9zaXhfaG9tZSc6IHsKKyAgICAgICAgJ3N0ZGxpYic6ICd7YmFzZX0vbGliL3B5dGhvbicsCisgICAgICAgICdwbGF0c3RkbGliJzogJ3tiYXNlfS9saWIvcHl0aG9uJywKKyAgICAgICAgJ3B1cmVsaWInOiAne2Jhc2V9L2xpYi9weXRob24nLAorICAgICAgICAncGxhdGxpYic6ICd7YmFzZX0vbGliL3B5dGhvbicsCisgICAgICAgICdpbmNsdWRlJzogJ3tiYXNlfS9pbmNsdWRlL3B5dGhvbicsCisgICAgICAgICdwbGF0aW5jbHVkZSc6ICd7YmFzZX0vaW5jbHVkZS9weXRob24nLAorICAgICAgICAnc2NyaXB0cyc6ICd7YmFzZX0vYmluJywKKyAgICAgICAgJ2RhdGEnICAgOiAne2Jhc2V9JywKKyAgICAgICAgfSwKKyAgICAnbnQnOiB7CisgICAgICAgICdzdGRsaWInOiAne2Jhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0nLAorICAgICAgICAncGxhdHN0ZGxpYic6ICd7YmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdwdXJlbGliJzogJ3tiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3BsYXRsaWInOiAne2Jhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0nLAorICAgICAgICAnaW5jbHVkZSc6ICd7YmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH0nLAorICAgICAgICAncGxhdGluY2x1ZGUnOiAne2Jhc2V9L2luY2x1ZGUvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3NjcmlwdHMnOiAne2Jhc2V9L2JpbicsCisgICAgICAgICdkYXRhJyAgIDogJ3tiYXNlfScsCisgICAgICAgIH0sCisgICAgJ29zMic6IHsKKyAgICAgICAgJ3N0ZGxpYic6ICd7YmFzZX0vTGliJywKKyAgICAgICAgJ3BsYXRzdGRsaWInOiAne2Jhc2V9L0xpYicsCisgICAgICAgICdwdXJlbGliJzogJ3tiYXNlfS9MaWIvc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICdwbGF0bGliJzogJ3tiYXNlfS9MaWIvc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICdpbmNsdWRlJzogJ3tiYXNlfS9JbmNsdWRlJywKKyAgICAgICAgJ3BsYXRpbmNsdWRlJzogJ3tiYXNlfS9JbmNsdWRlJywKKyAgICAgICAgJ3NjcmlwdHMnOiAne2Jhc2V9L1NjcmlwdHMnLAorICAgICAgICAnZGF0YScgICA6ICd7YmFzZX0nLAorICAgICAgICB9LAorICAgICdvczJfaG9tZSc6IHsKKyAgICAgICAgJ3N0ZGxpYic6ICd7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0nLAorICAgICAgICAncGxhdHN0ZGxpYic6ICd7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0nLAorICAgICAgICAncHVyZWxpYic6ICd7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICdwbGF0bGliJzogJ3t1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzJywKKyAgICAgICAgJ2luY2x1ZGUnOiAne3VzZXJiYXNlfS9pbmNsdWRlL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdzY3JpcHRzJzogJ3t1c2VyYmFzZX0vYmluJywKKyAgICAgICAgJ2RhdGEnICAgOiAne3VzZXJiYXNlfScsCisgICAgICAgIH0sCisgICAgJ250X3VzZXInOiB7CisgICAgICAgICdzdGRsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3BsYXRzdGRsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3B1cmVsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3BsYXRsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ2luY2x1ZGUnOiAne3VzZXJiYXNlfS9pbmNsdWRlL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdzY3JpcHRzJzogJ3t1c2VyYmFzZX0vYmluJywKKyAgICAgICAgJ2RhdGEnICAgOiAne3VzZXJiYXNlfScsCisgICAgICAgIH0sCisgICAgJ3Bvc2l4X3VzZXInOiB7CisgICAgICAgICdzdGRsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3BsYXRzdGRsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3B1cmVsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMnLAorICAgICAgICAncGxhdGxpYic6ICd7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICdpbmNsdWRlJzogJ3t1c2VyYmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH0nLAorICAgICAgICAnc2NyaXB0cyc6ICd7dXNlcmJhc2V9L2JpbicsCisgICAgICAgICdkYXRhJyAgIDogJ3t1c2VyYmFzZX0nLAorICAgICAgICB9LAorICAgICdvc3hfZnJhbWV3b3JrX3VzZXInOiB7CisgICAgICAgICdzdGRsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9uJywKKyAgICAgICAgJ3BsYXRzdGRsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9uJywKKyAgICAgICAgJ3B1cmVsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9uL3NpdGUtcGFja2FnZXMnLAorICAgICAgICAncGxhdGxpYic6ICd7dXNlcmJhc2V9L2xpYi9weXRob24vc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICdpbmNsdWRlJzogJ3t1c2VyYmFzZX0vaW5jbHVkZScsCisgICAgICAgICdzY3JpcHRzJzogJ3t1c2VyYmFzZX0vYmluJywKKyAgICAgICAgJ2RhdGEnICAgOiAne3VzZXJiYXNlfScsCisgICAgICAgIH0sCisgICAgfQorCitfU0NIRU1FX0tFWVMgPSAoJ3N0ZGxpYicsICdwbGF0c3RkbGliJywgJ3B1cmVsaWInLCAncGxhdGxpYicsICdpbmNsdWRlJywKKyAgICAgICAgICAgICAgICAnc2NyaXB0cycsICdkYXRhJykKK19QWV9WRVJTSU9OID0gc3lzLnZlcnNpb24uc3BsaXQoKVswXQorX1BZX1ZFUlNJT05fU0hPUlQgPSBzeXMudmVyc2lvbls6M10KK19QWV9WRVJTSU9OX1NIT1JUX05PX0RPVCA9IF9QWV9WRVJTSU9OWzBdICsgX1BZX1ZFUlNJT05bMl0KK19QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5wcmVmaXgpCitfRVhFQ19QUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjX3ByZWZpeCkKK19DT05GSUdfVkFSUyA9IE5vbmUKK19VU0VSX0JBU0UgPSBOb25lCisKK2RlZiBfc2FmZV9yZWFscGF0aChwYXRoKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiByZWFscGF0aChwYXRoKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICByZXR1cm4gcGF0aAorCitpZiBzeXMuZXhlY3V0YWJsZToKKyAgICBfUFJPSkVDVF9CQVNFID0gb3MucGF0aC5kaXJuYW1lKF9zYWZlX3JlYWxwYXRoKHN5cy5leGVjdXRhYmxlKSkKK2Vsc2U6CisgICAgIyBzeXMuZXhlY3V0YWJsZSBjYW4gYmUgZW1wdHkgaWYgYXJndlswXSBoYXMgYmVlbiBjaGFuZ2VkIGFuZCBQeXRob24gaXMKKyAgICAjIHVuYWJsZSB0byByZXRyaWV2ZSB0aGUgcmVhbCBwcm9ncmFtIG5hbWUKKyAgICBfUFJPSkVDVF9CQVNFID0gX3NhZmVfcmVhbHBhdGgob3MuZ2V0Y3dkKCkpCisKK2lmIG9zLm5hbWUgPT0gIm50IiBhbmQgInBjYnVpbGQiIGluIF9QUk9KRUNUX0JBU0VbLTg6XS5sb3dlcigpOgorICAgIF9QUk9KRUNUX0JBU0UgPSBfc2FmZV9yZWFscGF0aChvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgcGFyZGlyKSkKKyMgUEMvVlM3LjEKK2lmIG9zLm5hbWUgPT0gIm50IiBhbmQgIlxccGNcXHYiIGluIF9QUk9KRUNUX0JBU0VbLTEwOl0ubG93ZXIoKToKKyAgICBfUFJPSkVDVF9CQVNFID0gX3NhZmVfcmVhbHBhdGgob3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsIHBhcmRpciwgcGFyZGlyKSkKKyMgUEMvQU1ENjQKK2lmIG9zLm5hbWUgPT0gIm50IiBhbmQgIlxccGNidWlsZFxcYW1kNjQiIGluIF9QUk9KRUNUX0JBU0VbLTE0Ol0ubG93ZXIoKToKKyAgICBfUFJPSkVDVF9CQVNFID0gX3NhZmVfcmVhbHBhdGgob3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsIHBhcmRpciwgcGFyZGlyKSkKKworIyBzZXQgZm9yIGNyb3NzIGJ1aWxkcworaWYgIl9QWVRIT05fUFJPSkVDVF9CQVNFIiBpbiBvcy5lbnZpcm9uOgorICAgICMgdGhlIGJ1aWxkIGRpcmVjdG9yeSBmb3IgcG9zaXggYnVpbGRzCisgICAgX1BST0pFQ1RfQkFTRSA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5hYnNwYXRoKCIuIikpCitkZWYgaXNfcHl0aG9uX2J1aWxkKCk6CisgICAgZm9yIGZuIGluICgiU2V0dXAuZGlzdCIsICJTZXR1cC5sb2NhbCIpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oX1BST0pFQ1RfQkFTRSwgIk1vZHVsZXMiLCBmbikpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworX1BZVEhPTl9CVUlMRCA9IGlzX3B5dGhvbl9idWlsZCgpCisKK2lmIF9QWVRIT05fQlVJTEQ6CisgICAgZm9yIHNjaGVtZSBpbiAoJ3Bvc2l4X3ByZWZpeCcsICdwb3NpeF9ob21lJyk6CisgICAgICAgIF9JTlNUQUxMX1NDSEVNRVNbc2NoZW1lXVsnaW5jbHVkZSddID0gJ3tzcmNkaXJ9L0luY2x1ZGUnCisgICAgICAgIF9JTlNUQUxMX1NDSEVNRVNbc2NoZW1lXVsncGxhdGluY2x1ZGUnXSA9ICd7cHJvamVjdGJhc2V9JworCisgICAgIyBHQ0MobWluZ3cpIHVzZSBwb3NpeCBidWlsZCBzeXN0ZW0KKyAgICBpZiBvcy5uYW1lID09ICJudCIgYW5kIHN5cy52ZXJzaW9uLmZpbmQoJ0dDQycpID49IDA6CisgICAgICAgIF9JTlNUQUxMX1NDSEVNRVNbJ250J11bJ2luY2x1ZGUnXSA9ICd7c3JjZGlyfS9JbmNsdWRlJworICAgICAgICBfSU5TVEFMTF9TQ0hFTUVTWydudCddWydwbGF0aW5jbHVkZSddID0gJ3twcm9qZWN0YmFzZX0nCisKK2RlZiBfc3Vic3RfdmFycyhzLCBsb2NhbF92YXJzKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBzLmZvcm1hdCgqKmxvY2FsX3ZhcnMpCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gcy5mb3JtYXQoKipvcy5lbnZpcm9uKQorICAgICAgICBleGNlcHQgS2V5RXJyb3IsIHZhcjoKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCd7JXN9JyAlIHZhcikKKworZGVmIF9leHRlbmRfZGljdCh0YXJnZXRfZGljdCwgb3RoZXJfZGljdCk6CisgICAgdGFyZ2V0X2tleXMgPSB0YXJnZXRfZGljdC5rZXlzKCkKKyAgICBmb3Iga2V5LCB2YWx1ZSBpbiBvdGhlcl9kaWN0Lml0ZW1zKCk6CisgICAgICAgIGlmIGtleSBpbiB0YXJnZXRfa2V5czoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHRhcmdldF9kaWN0W2tleV0gPSB2YWx1ZQorCitkZWYgX2V4cGFuZF92YXJzKHNjaGVtZSwgdmFycyk6CisgICAgcmVzID0ge30KKyAgICBpZiB2YXJzIGlzIE5vbmU6CisgICAgICAgIHZhcnMgPSB7fQorICAgIF9leHRlbmRfZGljdCh2YXJzLCBnZXRfY29uZmlnX3ZhcnMoKSkKKworICAgIGZvciBrZXksIHZhbHVlIGluIF9JTlNUQUxMX1NDSEVNRVNbc2NoZW1lXS5pdGVtcygpOgorICAgICAgICBpZiBvcy5uYW1lIGluICgncG9zaXgnLCAnbnQnKToKKyAgICAgICAgICAgIHZhbHVlID0gb3MucGF0aC5leHBhbmR1c2VyKHZhbHVlKQorICAgICAgICByZXNba2V5XSA9IG9zLnBhdGgubm9ybXBhdGgoX3N1YnN0X3ZhcnModmFsdWUsIHZhcnMpKQorICAgIHJldHVybiByZXMKKworZGVmIF9nZXRfZGVmYXVsdF9zY2hlbWUoKToKKyAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICMgdGhlIGRlZmF1bHQgc2NoZW1lIGZvciBwb3NpeCBpcyBwb3NpeF9wcmVmaXgKKyAgICAgICAgcmV0dXJuICdwb3NpeF9wcmVmaXgnCisgICAgcmV0dXJuIG9zLm5hbWUKKworZGVmIF9nZXR1c2VyYmFzZSgpOgorICAgIGVudl9iYXNlID0gb3MuZW52aXJvbi5nZXQoIlBZVEhPTlVTRVJCQVNFIiwgTm9uZSkKKyAgICBkZWYgam9pbnVzZXIoKmFyZ3MpOgorICAgICAgICByZXR1cm4gb3MucGF0aC5leHBhbmR1c2VyKG9zLnBhdGguam9pbigqYXJncykpCisKKyAgICAjIHdoYXQgYWJvdXQgJ29zMmVteCcsICdyaXNjb3MnID8KKyAgICBpZiBvcy5uYW1lID09ICJudCI6CisgICAgICAgIGJhc2UgPSBvcy5lbnZpcm9uLmdldCgiQVBQREFUQSIpIG9yICJ+IgorICAgICAgICByZXR1cm4gZW52X2Jhc2UgaWYgZW52X2Jhc2UgZWxzZSBqb2ludXNlcihiYXNlLCAiUHl0aG9uIikKKworICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgZnJhbWV3b3JrID0gZ2V0X2NvbmZpZ192YXIoIlBZVEhPTkZSQU1FV09SSyIpCisgICAgICAgIGlmIGZyYW1ld29yazoKKyAgICAgICAgICAgIHJldHVybiBlbnZfYmFzZSBpZiBlbnZfYmFzZSBlbHNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2ludXNlcigifiIsICJMaWJyYXJ5IiwgZnJhbWV3b3JrLCAiJWQuJWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHN5cy52ZXJzaW9uX2luZm9bOjJdKSkKKworICAgIHJldHVybiBlbnZfYmFzZSBpZiBlbnZfYmFzZSBlbHNlIGpvaW51c2VyKCJ+IiwgIi5sb2NhbCIpCisKKworZGVmIF9wYXJzZV9tYWtlZmlsZShmaWxlbmFtZSwgdmFycz1Ob25lKToKKyAgICAiIiJQYXJzZSBhIE1ha2VmaWxlLXN0eWxlIGZpbGUuCisKKyAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBuYW1lL3ZhbHVlIHBhaXJzIGlzIHJldHVybmVkLiAgSWYgYW4KKyAgICBvcHRpb25hbCBkaWN0aW9uYXJ5IGlzIHBhc3NlZCBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpdCBpcworICAgIHVzZWQgaW5zdGVhZCBvZiBhIG5ldyBkaWN0aW9uYXJ5LgorICAgICIiIgorICAgIGltcG9ydCByZQorICAgICMgUmVnZXhlcyBuZWVkZWQgZm9yIHBhcnNpbmcgTWFrZWZpbGUgKGFuZCBzaW1pbGFyIHN5bnRheGVzLAorICAgICMgbGlrZSBvbGQtc3R5bGUgU2V0dXAgZmlsZXMpLgorICAgIF92YXJpYWJsZV9yeCA9IHJlLmNvbXBpbGUoIihbYS16QS1aXVthLXpBLVowLTlfXSspXHMqPVxzKiguKikiKQorICAgIF9maW5kdmFyMV9yeCA9IHJlLmNvbXBpbGUociJcJFwoKFtBLVphLXpdW0EtWmEtejAtOV9dKilcKSIpCisgICAgX2ZpbmR2YXIyX3J4ID0gcmUuY29tcGlsZShyIlwkeyhbQS1aYS16XVtBLVphLXowLTlfXSopfSIpCisKKyAgICBpZiB2YXJzIGlzIE5vbmU6CisgICAgICAgIHZhcnMgPSB7fQorICAgIGRvbmUgPSB7fQorICAgIG5vdGRvbmUgPSB7fQorCisgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmOgorICAgICAgICBsaW5lcyA9IGYucmVhZGxpbmVzKCkKKworICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJyMnKSBvciBsaW5lLnN0cmlwKCkgPT0gJyc6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBtID0gX3ZhcmlhYmxlX3J4Lm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBuLCB2ID0gbS5ncm91cCgxLCAyKQorICAgICAgICAgICAgdiA9IHYuc3RyaXAoKQorICAgICAgICAgICAgIyBgJCQnIGlzIGEgbGl0ZXJhbCBgJCcgaW4gbWFrZQorICAgICAgICAgICAgdG1wdiA9IHYucmVwbGFjZSgnJCQnLCAnJykKKworICAgICAgICAgICAgaWYgIiQiIGluIHRtcHY6CisgICAgICAgICAgICAgICAgbm90ZG9uZVtuXSA9IHYKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB2ID0gaW50KHYpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgaW5zZXJ0IGxpdGVyYWwgYCQnCisgICAgICAgICAgICAgICAgICAgIGRvbmVbbl0gPSB2LnJlcGxhY2UoJyQkJywgJyQnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRvbmVbbl0gPSB2CisKKyAgICAjIGRvIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZQorICAgIHdoaWxlIG5vdGRvbmU6CisgICAgICAgIGZvciBuYW1lIGluIG5vdGRvbmUua2V5cygpOgorICAgICAgICAgICAgdmFsdWUgPSBub3Rkb25lW25hbWVdCisgICAgICAgICAgICBtID0gX2ZpbmR2YXIxX3J4LnNlYXJjaCh2YWx1ZSkgb3IgX2ZpbmR2YXIyX3J4LnNlYXJjaCh2YWx1ZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgbiA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBuIGluIGRvbmU6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzdHIoZG9uZVtuXSkKKyAgICAgICAgICAgICAgICBlbGlmIG4gaW4gbm90ZG9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBnZXQgaXQgb24gYSBzdWJzZXF1ZW50IHJvdW5kCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gRmFsc2UKKyAgICAgICAgICAgICAgICBlbGlmIG4gaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgICAgICAgICAgIyBkbyBpdCBsaWtlIG1ha2U6IGZhbGwgYmFjayB0byBlbnZpcm9ubWVudAorICAgICAgICAgICAgICAgICAgICBpdGVtID0gb3MuZW52aXJvbltuXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRvbmVbbl0gPSBpdGVtID0gIiIKKyAgICAgICAgICAgICAgICBpZiBmb3VuZDoKKyAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSB2YWx1ZVttLmVuZCgpOl0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVs6bS5zdGFydCgpXSArIGl0ZW0gKyBhZnRlcgorICAgICAgICAgICAgICAgICAgICBpZiAiJCIgaW4gYWZ0ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBub3Rkb25lW25hbWVdID0gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeTogdmFsdWUgPSBpbnQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lW25hbWVdID0gdmFsdWUuc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lW25hbWVdID0gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBub3Rkb25lW25hbWVdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgYm9ndXMgdmFyaWFibGUgcmVmZXJlbmNlOyBqdXN0IGRyb3AgaXQgc2luY2Ugd2UgY2FuJ3QgZGVhbAorICAgICAgICAgICAgICAgIGRlbCBub3Rkb25lW25hbWVdCisgICAgIyBzdHJpcCBzcHVyaW91cyBzcGFjZXMKKyAgICBmb3IgaywgdiBpbiBkb25lLml0ZW1zKCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uodiwgc3RyKToKKyAgICAgICAgICAgIGRvbmVba10gPSB2LnN0cmlwKCkKKworICAgICMgc2F2ZSB0aGUgcmVzdWx0cyBpbiB0aGUgZ2xvYmFsIGRpY3Rpb25hcnkKKyAgICB2YXJzLnVwZGF0ZShkb25lKQorICAgIHJldHVybiB2YXJzCisKKworZGVmIF9nZXRfbWFrZWZpbGVfZmlsZW5hbWUoKToKKyAgICBpZiBfUFlUSE9OX0JVSUxEOgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsICJNYWtlZmlsZSIpCisgICAgcmV0dXJuIG9zLnBhdGguam9pbihnZXRfcGF0aCgncGxhdHN0ZGxpYicpLCAiY29uZmlnIiwgIk1ha2VmaWxlIikKKworZGVmIF9nZW5lcmF0ZV9wb3NpeF92YXJzKCk6CisgICAgIiIiR2VuZXJhdGUgdGhlIFB5dGhvbiBtb2R1bGUgY29udGFpbmluZyBidWlsZC10aW1lIHZhcmlhYmxlcy4iIiIKKyAgICBpbXBvcnQgcHByaW50CisgICAgdmFycyA9IHt9CisgICAgIyBsb2FkIHRoZSBpbnN0YWxsZWQgTWFrZWZpbGU6CisgICAgbWFrZWZpbGUgPSBfZ2V0X21ha2VmaWxlX2ZpbGVuYW1lKCkKKyAgICB0cnk6CisgICAgICAgIF9wYXJzZV9tYWtlZmlsZShtYWtlZmlsZSwgdmFycykKKyAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgbXNnID0gImludmFsaWQgUHl0aG9uIGluc3RhbGxhdGlvbjogdW5hYmxlIHRvIG9wZW4gJXMiICUgbWFrZWZpbGUKKyAgICAgICAgaWYgaGFzYXR0cihlLCAic3RyZXJyb3IiKToKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICIgKCVzKSIgJSBlLnN0cmVycm9yCisgICAgICAgIHJhaXNlIElPRXJyb3IobXNnKQorCisgICAgIyBsb2FkIHRoZSBpbnN0YWxsZWQgcHljb25maWcuaDoKKyAgICBjb25maWdfaCA9IGdldF9jb25maWdfaF9maWxlbmFtZSgpCisgICAgdHJ5OgorICAgICAgICB3aXRoIG9wZW4oY29uZmlnX2gpIGFzIGY6CisgICAgICAgICAgICBwYXJzZV9jb25maWdfaChmLCB2YXJzKQorICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICBtc2cgPSAiaW52YWxpZCBQeXRob24gaW5zdGFsbGF0aW9uOiB1bmFibGUgdG8gb3BlbiAlcyIgJSBjb25maWdfaAorICAgICAgICBpZiBoYXNhdHRyKGUsICJzdHJlcnJvciIpOgorICAgICAgICAgICAgbXNnID0gbXNnICsgIiAoJXMpIiAlIGUuc3RyZXJyb3IKKyAgICAgICAgcmFpc2UgSU9FcnJvcihtc2cpCisKKyAgICAjIE9uIEFJWCwgdGhlcmUgYXJlIHdyb25nIHBhdGhzIHRvIHRoZSBsaW5rZXIgc2NyaXB0cyBpbiB0aGUgTWFrZWZpbGUKKyAgICAjIC0tIHRoZXNlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgUHl0aG9uIHNvdXJjZSwgYnV0IHdoZW4gaW5zdGFsbGVkCisgICAgIyB0aGUgc2NyaXB0cyBhcmUgaW4gYW5vdGhlciBkaXJlY3RvcnkuCisgICAgaWYgX1BZVEhPTl9CVUlMRDoKKyAgICAgICAgdmFyc1snTERTSEFSRUQnXSA9IHZhcnNbJ0JMRFNIQVJFRCddCisKKyAgICAjIFRoZXJlJ3MgYSBjaGlja2VuLWFuZC1lZ2cgc2l0dWF0aW9uIG9uIE9TIFggd2l0aCByZWdhcmRzIHRvIHRoZQorICAgICMgX3N5c2NvbmZpZ2RhdGEgbW9kdWxlIGFmdGVyIHRoZSBjaGFuZ2VzIGludHJvZHVjZWQgYnkgIzE1Mjk4OgorICAgICMgZ2V0X2NvbmZpZ192YXJzKCkgaXMgY2FsbGVkIGJ5IGdldF9wbGF0Zm9ybSgpIGFzIHBhcnQgb2YgdGhlCisgICAgIyBgbWFrZSBweWJ1aWxkZGlyLnR4dGAgdGFyZ2V0IC0tIHdoaWNoIGlzIGEgcHJlY3Vyc29yIHRvIHRoZQorICAgICMgX3N5c2NvbmZpZ2RhdGEucHkgbW9kdWxlIGJlaW5nIGNvbnN0cnVjdGVkLiAgVW5mb3J0dW5hdGVseSwKKyAgICAjIGdldF9jb25maWdfdmFycygpIGV2ZW50dWFsbHkgY2FsbHMgX2luaXRfcG9zaXgoKSwgd2hpY2ggYXR0ZW1wdHMKKyAgICAjIHRvIGltcG9ydCBfc3lzY29uZmlnZGF0YSwgd2hpY2ggd2Ugd29uJ3QgaGF2ZSBidWlsdCB5ZXQuICBJbiBvcmRlcgorICAgICMgZm9yIF9pbml0X3Bvc2l4KCkgdG8gd29yaywgaWYgd2UncmUgb24gRGFyd2luLCBqdXN0IG1vY2sgdXAgdGhlCisgICAgIyBfc3lzY29uZmlnZGF0YSBtb2R1bGUgbWFudWFsbHkgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlIGJ1aWxkIHZhcnMuCisgICAgIyBUaGlzIGlzIG1vcmUgdGhhbiBzdWZmaWNpZW50IGZvciBlbnN1cmluZyB0aGUgc3Vic2VxdWVudCBjYWxsIHRvCisgICAgIyBnZXRfcGxhdGZvcm0oKSBzdWNjZWVkcy4KKyAgICBuYW1lID0gJ19zeXNjb25maWdkYXRhJworICAgIGlmICdkYXJ3aW4nIGluIHN5cy5wbGF0Zm9ybToKKyAgICAgICAgaW1wb3J0IGltcAorICAgICAgICBtb2R1bGUgPSBpbXAubmV3X21vZHVsZShuYW1lKQorICAgICAgICBtb2R1bGUuYnVpbGRfdGltZV92YXJzID0gdmFycworICAgICAgICBzeXMubW9kdWxlc1tuYW1lXSA9IG1vZHVsZQorCisgICAgcHlidWlsZGRpciA9ICdidWlsZC9saWIuJXMtJXMnICUgKGdldF9wbGF0Zm9ybSgpLCBzeXMudmVyc2lvbls6M10pCisgICAgaWYgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgIHB5YnVpbGRkaXIgKz0gJy1weWRlYnVnJworICAgIHRyeToKKyAgICAgICAgb3MubWFrZWRpcnMocHlidWlsZGRpcikKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGRlc3RmaWxlID0gb3MucGF0aC5qb2luKHB5YnVpbGRkaXIsIG5hbWUgKyAnLnB5JykKKworICAgIHdpdGggb3BlbihkZXN0ZmlsZSwgJ3diJykgYXMgZjoKKyAgICAgICAgZi53cml0ZSgnIyBzeXN0ZW0gY29uZmlndXJhdGlvbiBnZW5lcmF0ZWQgYW5kIHVzZWQgYnknCisgICAgICAgICAgICAgICAgJyB0aGUgc3lzY29uZmlnIG1vZHVsZVxuJykKKyAgICAgICAgZi53cml0ZSgnYnVpbGRfdGltZV92YXJzID0gJykKKyAgICAgICAgcHByaW50LnBwcmludCh2YXJzLCBzdHJlYW09ZikKKworICAgICMgQ3JlYXRlIGZpbGUgdXNlZCBmb3Igc3lzLnBhdGggZml4dXAgLS0gc2VlIE1vZHVsZXMvZ2V0cGF0aC5jCisgICAgd2l0aCBvcGVuKCdweWJ1aWxkZGlyLnR4dCcsICd3JykgYXMgZjoKKyAgICAgICAgZi53cml0ZShweWJ1aWxkZGlyKQorCitkZWYgX2luaXRfcG9zaXgodmFycyk6CisgICAgIiIiSW5pdGlhbGl6ZSB0aGUgbW9kdWxlIGFzIGFwcHJvcHJpYXRlIGZvciBQT1NJWCBzeXN0ZW1zLiIiIgorICAgICMgX3N5c2NvbmZpZ2RhdGEgaXMgZ2VuZXJhdGVkIGF0IGJ1aWxkIHRpbWUsIHNlZSBfZ2VuZXJhdGVfcG9zaXhfdmFycygpCisgICAgZnJvbSBfc3lzY29uZmlnZGF0YSBpbXBvcnQgYnVpbGRfdGltZV92YXJzCisgICAgdmFycy51cGRhdGUoYnVpbGRfdGltZV92YXJzKQorCitkZWYgX2luaXRfbm9uX3Bvc2l4KHZhcnMpOgorICAgICIiIkluaXRpYWxpemUgdGhlIG1vZHVsZSBhcyBhcHByb3ByaWF0ZSBmb3IgTlQiIiIKKyAgICAjIHNldCBiYXNpYyBpbnN0YWxsIGRpcmVjdG9yaWVzCisgICAgdmFyc1snTElCREVTVCddID0gZ2V0X3BhdGgoJ3N0ZGxpYicpCisgICAgdmFyc1snQklOTElCREVTVCddID0gZ2V0X3BhdGgoJ3BsYXRzdGRsaWInKQorICAgIHZhcnNbJ0lOQ0xVREVQWSddID0gZ2V0X3BhdGgoJ2luY2x1ZGUnKQorICAgIHZhcnNbJ1NPJ10gPSAnLnB5ZCcKKyAgICB2YXJzWydFWEUnXSA9ICcuZXhlJworICAgIHZhcnNbJ1ZFUlNJT04nXSA9IF9QWV9WRVJTSU9OX1NIT1JUX05PX0RPVAorICAgIHZhcnNbJ0JJTkRJUiddID0gb3MucGF0aC5kaXJuYW1lKF9zYWZlX3JlYWxwYXRoKHN5cy5leGVjdXRhYmxlKSkKKworIworIyBwdWJsaWMgQVBJcworIworCisKK2RlZiBwYXJzZV9jb25maWdfaChmcCwgdmFycz1Ob25lKToKKyAgICAiIiJQYXJzZSBhIGNvbmZpZy5oLXN0eWxlIGZpbGUuCisKKyAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBuYW1lL3ZhbHVlIHBhaXJzIGlzIHJldHVybmVkLiAgSWYgYW4KKyAgICBvcHRpb25hbCBkaWN0aW9uYXJ5IGlzIHBhc3NlZCBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpdCBpcworICAgIHVzZWQgaW5zdGVhZCBvZiBhIG5ldyBkaWN0aW9uYXJ5LgorICAgICIiIgorICAgIGltcG9ydCByZQorICAgIGlmIHZhcnMgaXMgTm9uZToKKyAgICAgICAgdmFycyA9IHt9CisgICAgZGVmaW5lX3J4ID0gcmUuY29tcGlsZSgiI2RlZmluZSAoW0EtWl1bQS1aYS16MC05X10rKSAoLiopXG4iKQorICAgIHVuZGVmX3J4ID0gcmUuY29tcGlsZSgiL1sqXSAjdW5kZWYgKFtBLVpdW0EtWmEtejAtOV9dKykgWypdL1xuIikKKworICAgIHdoaWxlIFRydWU6CisgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgbSA9IGRlZmluZV9yeC5tYXRjaChsaW5lKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgbiwgdiA9IG0uZ3JvdXAoMSwgMikKKyAgICAgICAgICAgIHRyeTogdiA9IGludCh2KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgICAgIHZhcnNbbl0gPSB2CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtID0gdW5kZWZfcngubWF0Y2gobGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgdmFyc1ttLmdyb3VwKDEpXSA9IDAKKyAgICByZXR1cm4gdmFycworCitkZWYgZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKCk6CisgICAgIiIiUmV0dXJucyB0aGUgcGF0aCBvZiBweWNvbmZpZy5oLiIiIgorICAgIGlmIF9QWVRIT05fQlVJTEQ6CisgICAgICAgICMgR0NDKG1pbmd3KTogb3MubmFtZSBpcyAibnQiIGJ1dCBidWlsZCBzeXN0ZW0gaXMgcG9zaXgKKyAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiIGFuZCBzeXMudmVyc2lvbi5maW5kKCdHQ0MnKSA8IDA6CisgICAgICAgICAgICBpbmNfZGlyID0gb3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsICJQQyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbmNfZGlyID0gX1BST0pFQ1RfQkFTRQorICAgIGVsc2U6CisgICAgICAgIGluY19kaXIgPSBnZXRfcGF0aCgncGxhdGluY2x1ZGUnKQorICAgIHJldHVybiBvcy5wYXRoLmpvaW4oaW5jX2RpciwgJ3B5Y29uZmlnLmgnKQorCitkZWYgZ2V0X3NjaGVtZV9uYW1lcygpOgorICAgICIiIlJldHVybnMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBzY2hlbWVzIG5hbWVzLiIiIgorICAgIHNjaGVtZXMgPSBfSU5TVEFMTF9TQ0hFTUVTLmtleXMoKQorICAgIHNjaGVtZXMuc29ydCgpCisgICAgcmV0dXJuIHR1cGxlKHNjaGVtZXMpCisKK2RlZiBnZXRfcGF0aF9uYW1lcygpOgorICAgICIiIlJldHVybnMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBwYXRocyBuYW1lcy4iIiIKKyAgICByZXR1cm4gX1NDSEVNRV9LRVlTCisKK2RlZiBnZXRfcGF0aHMoc2NoZW1lPV9nZXRfZGVmYXVsdF9zY2hlbWUoKSwgdmFycz1Ob25lLCBleHBhbmQ9VHJ1ZSk6CisgICAgIiIiUmV0dXJucyBhIG1hcHBpbmcgY29udGFpbmluZyBhbiBpbnN0YWxsIHNjaGVtZS4KKworICAgIGBgc2NoZW1lYGAgaXMgdGhlIGluc3RhbGwgc2NoZW1lIG5hbWUuIElmIG5vdCBwcm92aWRlZCwgaXQgd2lsbAorICAgIHJldHVybiB0aGUgZGVmYXVsdCBzY2hlbWUgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorICAgICIiIgorICAgIGlmIGV4cGFuZDoKKyAgICAgICAgcmV0dXJuIF9leHBhbmRfdmFycyhzY2hlbWUsIHZhcnMpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIF9JTlNUQUxMX1NDSEVNRVNbc2NoZW1lXQorCitkZWYgZ2V0X3BhdGgobmFtZSwgc2NoZW1lPV9nZXRfZGVmYXVsdF9zY2hlbWUoKSwgdmFycz1Ob25lLCBleHBhbmQ9VHJ1ZSk6CisgICAgIiIiUmV0dXJucyBhIHBhdGggY29ycmVzcG9uZGluZyB0byB0aGUgc2NoZW1lLgorCisgICAgYGBzY2hlbWVgYCBpcyB0aGUgaW5zdGFsbCBzY2hlbWUgbmFtZS4KKyAgICAiIiIKKyAgICByZXR1cm4gZ2V0X3BhdGhzKHNjaGVtZSwgdmFycywgZXhwYW5kKVtuYW1lXQorCitkZWYgZ2V0X2NvbmZpZ192YXJzKCphcmdzKToKKyAgICAiIiJXaXRoIG5vIGFyZ3VtZW50cywgcmV0dXJuIGEgZGljdGlvbmFyeSBvZiBhbGwgY29uZmlndXJhdGlvbgorICAgIHZhcmlhYmxlcyByZWxldmFudCBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCisKKyAgICBPbiBVbml4LCB0aGlzIG1lYW5zIGV2ZXJ5IHZhcmlhYmxlIGRlZmluZWQgaW4gUHl0aG9uJ3MgaW5zdGFsbGVkIE1ha2VmaWxlOworICAgIE9uIFdpbmRvd3MgYW5kIE1hYyBPUyBpdCdzIGEgbXVjaCBzbWFsbGVyIHNldC4KKworICAgIFdpdGggYXJndW1lbnRzLCByZXR1cm4gYSBsaXN0IG9mIHZhbHVlcyB0aGF0IHJlc3VsdCBmcm9tIGxvb2tpbmcgdXAKKyAgICBlYWNoIGFyZ3VtZW50IGluIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGRpY3Rpb25hcnkuCisgICAgIiIiCisgICAgaW1wb3J0IHJlCisgICAgZ2xvYmFsIF9DT05GSUdfVkFSUworICAgIGlmIF9DT05GSUdfVkFSUyBpcyBOb25lOgorICAgICAgICBfQ09ORklHX1ZBUlMgPSB7fQorICAgICAgICAjIE5vcm1hbGl6ZWQgdmVyc2lvbnMgb2YgcHJlZml4IGFuZCBleGVjX3ByZWZpeCBhcmUgaGFuZHkgdG8gaGF2ZTsKKyAgICAgICAgIyBpbiBmYWN0LCB0aGVzZSBhcmUgdGhlIHN0YW5kYXJkIHZlcnNpb25zIHVzZWQgbW9zdCBwbGFjZXMgaW4gdGhlCisgICAgICAgICMgRGlzdHV0aWxzLgorICAgICAgICBfQ09ORklHX1ZBUlNbJ3ByZWZpeCddID0gX1BSRUZJWAorICAgICAgICBfQ09ORklHX1ZBUlNbJ2V4ZWNfcHJlZml4J10gPSBfRVhFQ19QUkVGSVgKKyAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uJ10gPSBfUFlfVkVSU0lPTgorICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb25fc2hvcnQnXSA9IF9QWV9WRVJTSU9OX1NIT1JUCisgICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbl9ub2RvdCddID0gX1BZX1ZFUlNJT05bMF0gKyBfUFlfVkVSU0lPTlsyXQorICAgICAgICBfQ09ORklHX1ZBUlNbJ2Jhc2UnXSA9IF9QUkVGSVgKKyAgICAgICAgX0NPTkZJR19WQVJTWydwbGF0YmFzZSddID0gX0VYRUNfUFJFRklYCisgICAgICAgIF9DT05GSUdfVkFSU1sncHJvamVjdGJhc2UnXSA9IF9QUk9KRUNUX0JBU0UKKworICAgICAgICAjIEdDQyhtaW5ndykgdXNlIHBvc2l4IGJ1aWxkIHN5c3RlbQorICAgICAgICBwb3NpeF9idWlsZCA9IE5vbmUKKyAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAgICAgcG9zaXhfYnVpbGQgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBvcy5uYW1lIGluICgnbnQnLCAnb3MyJyk6CisgICAgICAgICAgICAgICAgaWYgc3lzLnZlcnNpb24uZmluZCgnR0NDJykgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgcG9zaXhfYnVpbGQgPSBUcnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcG9zaXhfYnVpbGQgPSBGYWxzZQorICAgICAgICBpZiBwb3NpeF9idWlsZCA9PSBGYWxzZToKKyAgICAgICAgICAgIF9pbml0X25vbl9wb3NpeChfQ09ORklHX1ZBUlMpCisgICAgICAgIGlmIHBvc2l4X2J1aWxkID09IFRydWU6CisgICAgICAgICAgICBfaW5pdF9wb3NpeChfQ09ORklHX1ZBUlMpCisKKyAgICAgICAgIyBTZXR0aW5nICd1c2VyYmFzZScgaXMgZG9uZSBiZWxvdyB0aGUgY2FsbCB0byB0aGUKKyAgICAgICAgIyBpbml0IGZ1bmN0aW9uIHRvIGVuYWJsZSB1c2luZyAnZ2V0X2NvbmZpZ192YXInIGluCisgICAgICAgICMgdGhlIGluaXQtZnVuY3Rpb24uCisgICAgICAgIF9DT05GSUdfVkFSU1sndXNlcmJhc2UnXSA9IF9nZXR1c2VyYmFzZSgpCisKKyAgICAgICAgaWYgJ3NyY2Rpcicgbm90IGluIF9DT05GSUdfVkFSUzoKKyAgICAgICAgICAgIF9DT05GSUdfVkFSU1snc3JjZGlyJ10gPSBfUFJPSkVDVF9CQVNFCisKKyAgICAgICAgIyBDb252ZXJ0IHNyY2RpciBpbnRvIGFuIGFic29sdXRlIHBhdGggaWYgaXQgYXBwZWFycyBuZWNlc3NhcnkuCisgICAgICAgICMgTm9ybWFsbHkgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJ1aWxkIGRpcmVjdG9yeS4gIEhvd2V2ZXIsIGR1cmluZworICAgICAgICAjIHRlc3RpbmcsIGZvciBleGFtcGxlLCB3ZSBtaWdodCBiZSBydW5uaW5nIGEgbm9uLWluc3RhbGxlZCBweXRob24KKyAgICAgICAgIyBmcm9tIGEgZGlmZmVyZW50IGRpcmVjdG9yeS4KKyAgICAgICAgaWYgX1BZVEhPTl9CVUlMRCBhbmQgcG9zaXhfYnVpbGQgPT0gVHJ1ZToKKyAgICAgICAgICAgIGJhc2UgPSBfUFJPSkVDVF9CQVNFCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIGN3ZCA9IE5vbmUKKyAgICAgICAgICAgIGlmIChub3Qgb3MucGF0aC5pc2FicyhfQ09ORklHX1ZBUlNbJ3NyY2RpciddKSBhbmQKKyAgICAgICAgICAgICAgICBiYXNlICE9IGN3ZCk6CisgICAgICAgICAgICAgICAgIyBzcmNkaXIgaXMgcmVsYXRpdmUgYW5kIHdlIGFyZSBub3QgaW4gdGhlIHNhbWUgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgIyBhcyB0aGUgZXhlY3V0YWJsZS4gQXNzdW1lIGV4ZWN1dGFibGUgaXMgaW4gdGhlIGJ1aWxkCisgICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkgYW5kIG1ha2Ugc3JjZGlyIGFic29sdXRlLgorICAgICAgICAgICAgICAgIHNyY2RpciA9IG9zLnBhdGguam9pbihiYXNlLCBfQ09ORklHX1ZBUlNbJ3NyY2RpciddKQorICAgICAgICAgICAgICAgIF9DT05GSUdfVkFSU1snc3JjZGlyJ10gPSBvcy5wYXRoLm5vcm1wYXRoKHNyY2RpcikKKworICAgICAgICAjIE9TIFggcGxhdGZvcm1zIHJlcXVpcmUgc3BlY2lhbCBjdXN0b21pemF0aW9uIHRvIGhhbmRsZQorICAgICAgICAjIG11bHRpLWFyY2hpdGVjdHVyZSwgbXVsdGktb3MtdmVyc2lvbiBpbnN0YWxsZXJzCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIGltcG9ydCBfb3N4X3N1cHBvcnQKKyAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5jdXN0b21pemVfY29uZmlnX3ZhcnMoX0NPTkZJR19WQVJTKQorCisgICAgaWYgYXJnczoKKyAgICAgICAgdmFscyA9IFtdCisgICAgICAgIGZvciBuYW1lIGluIGFyZ3M6CisgICAgICAgICAgICB2YWxzLmFwcGVuZChfQ09ORklHX1ZBUlMuZ2V0KG5hbWUpKQorICAgICAgICByZXR1cm4gdmFscworICAgIGVsc2U6CisgICAgICAgIHJldHVybiBfQ09ORklHX1ZBUlMKKworZGVmIGdldF9jb25maWdfdmFyKG5hbWUpOgorICAgICIiIlJldHVybiB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgdmFyaWFibGUgdXNpbmcgdGhlIGRpY3Rpb25hcnkgcmV0dXJuZWQgYnkKKyAgICAnZ2V0X2NvbmZpZ192YXJzKCknLgorCisgICAgRXF1aXZhbGVudCB0byBnZXRfY29uZmlnX3ZhcnMoKS5nZXQobmFtZSkKKyAgICAiIiIKKyAgICByZXR1cm4gZ2V0X2NvbmZpZ192YXJzKCkuZ2V0KG5hbWUpCisKK2RlZiBnZXRfcGxhdGZvcm0oKToKKyAgICAiIiJSZXR1cm4gYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorCisgICAgVGhpcyBpcyB1c2VkIG1haW5seSB0byBkaXN0aW5ndWlzaCBwbGF0Zm9ybS1zcGVjaWZpYyBidWlsZCBkaXJlY3RvcmllcyBhbmQKKyAgICBwbGF0Zm9ybS1zcGVjaWZpYyBidWlsdCBkaXN0cmlidXRpb25zLiAgVHlwaWNhbGx5IGluY2x1ZGVzIHRoZSBPUyBuYW1lCisgICAgYW5kIHZlcnNpb24gYW5kIHRoZSBhcmNoaXRlY3R1cmUgKGFzIHN1cHBsaWVkIGJ5ICdvcy51bmFtZSgpJyksCisgICAgYWx0aG91Z2ggdGhlIGV4YWN0IGluZm9ybWF0aW9uIGluY2x1ZGVkIGRlcGVuZHMgb24gdGhlIE9TOyBlZy4gZm9yIElSSVgKKyAgICB0aGUgYXJjaGl0ZWN0dXJlIGlzbid0IHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgKElSSVggb25seSBydW5zIG9uIFNHSQorICAgIGhhcmR3YXJlKSwgYnV0IGZvciBMaW51eCB0aGUga2VybmVsIHZlcnNpb24gaXNuJ3QgcGFydGljdWxhcmx5CisgICAgaW1wb3J0YW50LgorCisgICAgRXhhbXBsZXMgb2YgcmV0dXJuZWQgdmFsdWVzOgorICAgICAgIGxpbnV4LWk1ODYKKyAgICAgICBsaW51eC1hbHBoYSAoPykKKyAgICAgICBzb2xhcmlzLTIuNi1zdW40dQorICAgICAgIGlyaXgtNS4zCisgICAgICAgaXJpeDY0LTYuMgorCisgICAgV2luZG93cyB3aWxsIHJldHVybiBvbmUgb2Y6CisgICAgICAgd2luLWFtZDY0ICg2NGJpdCBXaW5kb3dzIG9uIEFNRDY0IChha2EgeDg2XzY0LCBJbnRlbDY0LCBFTTY0VCwgZXRjKQorICAgICAgIHdpbi1pYTY0ICg2NGJpdCBXaW5kb3dzIG9uIEl0YW5pdW0pCisgICAgICAgd2luMzIgKGFsbCBvdGhlcnMgLSBzcGVjaWZpY2FsbHksIHN5cy5wbGF0Zm9ybSBpcyByZXR1cm5lZCkKKworICAgIEZvciBvdGhlciBub24tUE9TSVggcGxhdGZvcm1zLCBjdXJyZW50bHkganVzdCByZXR1cm5zICdzeXMucGxhdGZvcm0nLgorICAgICIiIgorICAgIGltcG9ydCByZQorICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgIyBzbmlmZiBzeXMudmVyc2lvbiBmb3IgYXJjaGl0ZWN0dXJlLgorICAgICAgICBwcmVmaXggPSAiIGJpdCAoIgorICAgICAgICBpID0gc3lzLnZlcnNpb24uZmluZChwcmVmaXgpCisgICAgICAgIGlmIGkgPT0gLTE6CisgICAgICAgICAgICByZXR1cm4gc3lzLnBsYXRmb3JtCisgICAgICAgIGogPSBzeXMudmVyc2lvbi5maW5kKCIpIiwgaSkKKyAgICAgICAgbG9vayA9IHN5cy52ZXJzaW9uW2krbGVuKHByZWZpeCk6al0ubG93ZXIoKQorICAgICAgICBpZiBsb29rID09ICdhbWQ2NCc6CisgICAgICAgICAgICByZXR1cm4gJ3dpbi1hbWQ2NCcKKyAgICAgICAgaWYgbG9vayA9PSAnaXRhbml1bSc6CisgICAgICAgICAgICByZXR1cm4gJ3dpbi1pYTY0JworICAgICAgICByZXR1cm4gc3lzLnBsYXRmb3JtCisKKyAgICAjIFNldCBmb3IgY3Jvc3MgYnVpbGRzIGV4cGxpY2l0bHkKKyAgICBpZiAiX1BZVEhPTl9IT1NUX1BMQVRGT1JNIiBpbiBvcy5lbnZpcm9uOgorICAgICAgICByZXR1cm4gb3MuZW52aXJvblsiX1BZVEhPTl9IT1NUX1BMQVRGT1JNIl0KKworICAgIGlmIG9zLm5hbWUgIT0gInBvc2l4IiBvciBub3QgaGFzYXR0cihvcywgJ3VuYW1lJyk6CisgICAgICAgICMgWFhYIHdoYXQgYWJvdXQgdGhlIGFyY2hpdGVjdHVyZT8gTlQgaXMgSW50ZWwgb3IgQWxwaGEsCisgICAgICAgICMgTWFjIE9TIGlzIE02OGsgb3IgUFBDLCBldGMuCisgICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0KKworICAgICMgVHJ5IHRvIGRpc3Rpbmd1aXNoIHZhcmlvdXMgZmxhdm91cnMgb2YgVW5peAorICAgIG9zbmFtZSwgaG9zdCwgcmVsZWFzZSwgdmVyc2lvbiwgbWFjaGluZSA9IG9zLnVuYW1lKCkKKworICAgICMgQ29udmVydCB0aGUgT1MgbmFtZSB0byBsb3dlcmNhc2UsIHJlbW92ZSAnLycgY2hhcmFjdGVycworICAgICMgKHRvIGFjY29tbW9kYXRlIEJTRC9PUyksIGFuZCB0cmFuc2xhdGUgc3BhY2VzIChmb3IgIlBvd2VyIE1hY2ludG9zaCIpCisgICAgb3NuYW1lID0gb3NuYW1lLmxvd2VyKCkucmVwbGFjZSgnLycsICcnKQorICAgIG1hY2hpbmUgPSBtYWNoaW5lLnJlcGxhY2UoJyAnLCAnXycpCisgICAgbWFjaGluZSA9IG1hY2hpbmUucmVwbGFjZSgnLycsICctJykKKworICAgIGlmIG9zbmFtZVs6NV0gPT0gImxpbnV4IjoKKyAgICAgICAgIyBBdCBsZWFzdCBvbiBMaW51eC9JbnRlbCwgJ21hY2hpbmUnIGlzIHRoZSBwcm9jZXNzb3IgLS0KKyAgICAgICAgIyBpMzg2LCBldGMuCisgICAgICAgICMgWFhYIHdoYXQgYWJvdXQgQWxwaGEsIFNQQVJDLCBldGM/CisgICAgICAgIHJldHVybiAgIiVzLSVzIiAlIChvc25hbWUsIG1hY2hpbmUpCisgICAgZWxpZiBvc25hbWVbOjVdID09ICJzdW5vcyI6CisgICAgICAgIGlmIHJlbGVhc2VbMF0gPj0gIjUiOiAgICAgICAgICAgIyBTdW5PUyA1ID09IFNvbGFyaXMgMgorICAgICAgICAgICAgb3NuYW1lID0gInNvbGFyaXMiCisgICAgICAgICAgICByZWxlYXNlID0gIiVkLiVzIiAlIChpbnQocmVsZWFzZVswXSkgLSAzLCByZWxlYXNlWzI6XSkKKyAgICAgICAgICAgICMgV2UgY2FuJ3QgdXNlICJwbGF0Zm9ybS5hcmNoaXRlY3R1cmUoKVswXSIgYmVjYXVzZSBhCisgICAgICAgICAgICAjIGJvb3RzdHJhcCBwcm9ibGVtLiBXZSB1c2UgYSBkaWN0IHRvIGdldCBhbiBlcnJvcgorICAgICAgICAgICAgIyBpZiBzb21lIHN1c3BpY2lvdXMgaGFwcGVucy4KKyAgICAgICAgICAgIGJpdG5lc3MgPSB7MjE0NzQ4MzY0NzoiMzJiaXQiLCA5MjIzMzcyMDM2ODU0Nzc1ODA3OiI2NGJpdCJ9CisgICAgICAgICAgICBtYWNoaW5lICs9ICIuJXMiICUgYml0bmVzc1tzeXMubWF4aW50XQorICAgICAgICAjIGZhbGwgdGhyb3VnaCB0byBzdGFuZGFyZCBvc25hbWUtcmVsZWFzZS1tYWNoaW5lIHJlcHJlc2VudGF0aW9uCisgICAgZWxpZiBvc25hbWVbOjRdID09ICJpcml4IjogICAgICAgICAgICAgICMgY291bGQgYmUgImlyaXg2NCIhCisgICAgICAgIHJldHVybiAiJXMtJXMiICUgKG9zbmFtZSwgcmVsZWFzZSkKKyAgICBlbGlmIG9zbmFtZVs6M10gPT0gImFpeCI6CisgICAgICAgIHJldHVybiAiJXMtJXMuJXMiICUgKG9zbmFtZSwgdmVyc2lvbiwgcmVsZWFzZSkKKyAgICBlbGlmIG9zbmFtZVs6Nl0gPT0gImN5Z3dpbiI6CisgICAgICAgIG9zbmFtZSA9ICJjeWd3aW4iCisgICAgICAgIHJlbF9yZSA9IHJlLmNvbXBpbGUgKHInW1xkLl0rJykKKyAgICAgICAgbSA9IHJlbF9yZS5tYXRjaChyZWxlYXNlKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgcmVsZWFzZSA9IG0uZ3JvdXAoKQorICAgIGVsaWYgb3NuYW1lWzo2XSA9PSAiZGFyd2luIjoKKyAgICAgICAgaW1wb3J0IF9vc3hfc3VwcG9ydAorICAgICAgICBvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUgPSBfb3N4X3N1cHBvcnQuZ2V0X3BsYXRmb3JtX29zeCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NvbmZpZ192YXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbmFtZSwgcmVsZWFzZSwgbWFjaGluZSkKKworICAgIHJldHVybiAiJXMtJXMtJXMiICUgKG9zbmFtZSwgcmVsZWFzZSwgbWFjaGluZSkKKworCitkZWYgZ2V0X3B5dGhvbl92ZXJzaW9uKCk6CisgICAgcmV0dXJuIF9QWV9WRVJTSU9OX1NIT1JUCisKKworZGVmIF9wcmludF9kaWN0KHRpdGxlLCBkYXRhKToKKyAgICBmb3IgaW5kZXgsIChrZXksIHZhbHVlKSBpbiBlbnVtZXJhdGUoc29ydGVkKGRhdGEuaXRlbXMoKSkpOgorICAgICAgICBpZiBpbmRleCA9PSAwOgorICAgICAgICAgICAgcHJpbnQgJyVzOiAnICUgKHRpdGxlKQorICAgICAgICBwcmludCAnXHQlcyA9ICIlcyInICUgKGtleSwgdmFsdWUpCisKKworZGVmIF9tYWluKCk6CisgICAgIiIiRGlzcGxheSBhbGwgaW5mb3JtYXRpb24gc3lzY29uZmlnIGRldGFpbnMuIiIiCisgICAgaWYgJy0tZ2VuZXJhdGUtcG9zaXgtdmFycycgaW4gc3lzLmFyZ3Y6CisgICAgICAgIF9nZW5lcmF0ZV9wb3NpeF92YXJzKCkKKyAgICAgICAgcmV0dXJuCisgICAgcHJpbnQgJ1BsYXRmb3JtOiAiJXMiJyAlIGdldF9wbGF0Zm9ybSgpCisgICAgcHJpbnQgJ1B5dGhvbiB2ZXJzaW9uOiAiJXMiJyAlIGdldF9weXRob25fdmVyc2lvbigpCisgICAgcHJpbnQgJ0N1cnJlbnQgaW5zdGFsbGF0aW9uIHNjaGVtZTogIiVzIicgJSBfZ2V0X2RlZmF1bHRfc2NoZW1lKCkKKyAgICBwcmludAorICAgIF9wcmludF9kaWN0KCdQYXRocycsIGdldF9wYXRocygpKQorICAgIHByaW50CisgICAgX3ByaW50X2RpY3QoJ1ZhcmlhYmxlcycsIGdldF9jb25maWdfdmFycygpKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgX21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zeXNjb25maWcucHljIGIvbGliL3B5dGhvbjIuNy9zeXNjb25maWcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZGQ0MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N5c2NvbmZpZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zeXNjb25maWcucHlvIGIvbGliL3B5dGhvbjIuNy9zeXNjb25maWcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZGQ0MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N5c2NvbmZpZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90YWJuYW5ueS5weSBiL2xpYi9weXRob24yLjcvdGFibmFubnkucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzY2NjVhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGFibmFubnkucHkKQEAgLTAsMCArMSwzMjkgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiVGhlIFRhYiBOYW5ueSBkZXNwaXNlcyBhbWJpZ3VvdXMgaW5kZW50YXRpb24uICBTaGUga25vd3Mgbm8gbWVyY3kuCisKK3RhYm5hbm55IC0tIERldGVjdGlvbiBvZiBhbWJpZ3VvdXMgaW5kZW50YXRpb24KKworRm9yIHRoZSB0aW1lIGJlaW5nIHRoaXMgbW9kdWxlIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBhcyBhIHNjcmlwdC4KK0hvd2V2ZXIgaXQgaXMgcG9zc2libGUgdG8gaW1wb3J0IGl0IGludG8gYW4gSURFIGFuZCB1c2UgdGhlIGZ1bmN0aW9uCitjaGVjaygpIGRlc2NyaWJlZCBiZWxvdy4KKworV2FybmluZzogVGhlIEFQSSBwcm92aWRlZCBieSB0aGlzIG1vZHVsZSBpcyBsaWtlbHkgdG8gY2hhbmdlIGluIGZ1dHVyZQorcmVsZWFzZXM7IHN1Y2ggY2hhbmdlcyBtYXkgbm90IGJlIGJhY2t3YXJkIGNvbXBhdGlibGUuCisiIiIKKworIyBSZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYnkgVGltIFBldGVycywgMTUgQXByaWwgMTk5OC4KKworIyBYWFggTm90ZTogdGhpcyBpcyBub3cgYSBzdGFuZGFyZCBsaWJyYXJ5IG1vZHVsZS4KKyMgWFhYIFRoZSBBUEkgbmVlZHMgdG8gdW5kZXJnbyBjaGFuZ2VzIGhvd2V2ZXI7IHRoZSBjdXJyZW50IGNvZGUgaXMgdG9vCisjIFhYWCBzY3JpcHQtbGlrZS4gIFRoaXMgd2lsbCBiZSBhZGRyZXNzZWQgbGF0ZXIuCisKK19fdmVyc2lvbl9fID0gIjYiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGdldG9wdAoraW1wb3J0IHRva2VuaXplCitpZiBub3QgaGFzYXR0cih0b2tlbml6ZSwgJ05MJyk6CisgICAgcmFpc2UgVmFsdWVFcnJvcigidG9rZW5pemUuTkwgZG9lc24ndCBleGlzdCAtLSB0b2tlbml6ZSBtb2R1bGUgdG9vIG9sZCIpCisKK19fYWxsX18gPSBbImNoZWNrIiwgIk5hbm55TmFnIiwgInByb2Nlc3NfdG9rZW5zIl0KKwordmVyYm9zZSA9IDAKK2ZpbGVuYW1lX29ubHkgPSAwCisKK2RlZiBlcnJwcmludCgqYXJncyk6CisgICAgc2VwID0gIiIKKyAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoc2VwICsgc3RyKGFyZykpCisgICAgICAgIHNlcCA9ICIgIgorICAgIHN5cy5zdGRlcnIud3JpdGUoIlxuIikKKworZGVmIG1haW4oKToKKyAgICBnbG9iYWwgdmVyYm9zZSwgZmlsZW5hbWVfb25seQorICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAicXYiKQorICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKKyAgICAgICAgZXJycHJpbnQobXNnKQorICAgICAgICByZXR1cm4KKyAgICBmb3IgbywgYSBpbiBvcHRzOgorICAgICAgICBpZiBvID09ICctcSc6CisgICAgICAgICAgICBmaWxlbmFtZV9vbmx5ID0gZmlsZW5hbWVfb25seSArIDEKKyAgICAgICAgaWYgbyA9PSAnLXYnOgorICAgICAgICAgICAgdmVyYm9zZSA9IHZlcmJvc2UgKyAxCisgICAgaWYgbm90IGFyZ3M6CisgICAgICAgIGVycnByaW50KCJVc2FnZToiLCBzeXMuYXJndlswXSwgIlstdl0gZmlsZV9vcl9kaXJlY3RvcnkgLi4uIikKKyAgICAgICAgcmV0dXJuCisgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICBjaGVjayhhcmcpCisKK2NsYXNzIE5hbm55TmFnKEV4Y2VwdGlvbik6CisgICAgIiIiCisgICAgUmFpc2VkIGJ5IHRva2VuZWF0ZXIoKSBpZiBkZXRlY3RpbmcgYW4gYW1iaWd1b3VzIGluZGVudC4KKyAgICBDYXB0dXJlZCBhbmQgaGFuZGxlZCBpbiBjaGVjaygpLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lbm8sIG1zZywgbGluZSk6CisgICAgICAgIHNlbGYubGluZW5vLCBzZWxmLm1zZywgc2VsZi5saW5lID0gbGluZW5vLCBtc2csIGxpbmUKKyAgICBkZWYgZ2V0X2xpbmVubyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGluZW5vCisgICAgZGVmIGdldF9tc2coc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1zZworICAgIGRlZiBnZXRfbGluZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGluZQorCitkZWYgY2hlY2soZmlsZSk6CisgICAgIiIiY2hlY2soZmlsZV9vcl9kaXIpCisKKyAgICBJZiBmaWxlX29yX2RpciBpcyBhIGRpcmVjdG9yeSBhbmQgbm90IGEgc3ltYm9saWMgbGluaywgdGhlbiByZWN1cnNpdmVseQorICAgIGRlc2NlbmQgdGhlIGRpcmVjdG9yeSB0cmVlIG5hbWVkIGJ5IGZpbGVfb3JfZGlyLCBjaGVja2luZyBhbGwgLnB5IGZpbGVzCisgICAgYWxvbmcgdGhlIHdheS4gSWYgZmlsZV9vcl9kaXIgaXMgYW4gb3JkaW5hcnkgUHl0aG9uIHNvdXJjZSBmaWxlLCBpdCBpcworICAgIGNoZWNrZWQgZm9yIHdoaXRlc3BhY2UgcmVsYXRlZCBwcm9ibGVtcy4gVGhlIGRpYWdub3N0aWMgbWVzc2FnZXMgYXJlCisgICAgd3JpdHRlbiB0byBzdGFuZGFyZCBvdXRwdXQgdXNpbmcgdGhlIHByaW50IHN0YXRlbWVudC4KKyAgICAiIiIKKworICAgIGlmIG9zLnBhdGguaXNkaXIoZmlsZSkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhmaWxlKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIlcjogbGlzdGluZyBkaXJlY3RvcnkiICUgKGZpbGUsKQorICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZmlsZSkKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihmaWxlLCBuYW1lKQorICAgICAgICAgICAgaWYgKG9zLnBhdGguaXNkaXIoZnVsbG5hbWUpIGFuZAorICAgICAgICAgICAgICAgIG5vdCBvcy5wYXRoLmlzbGluayhmdWxsbmFtZSkgb3IKKyAgICAgICAgICAgICAgICBvcy5wYXRoLm5vcm1jYXNlKG5hbWVbLTM6XSkgPT0gIi5weSIpOgorICAgICAgICAgICAgICAgIGNoZWNrKGZ1bGxuYW1lKQorICAgICAgICByZXR1cm4KKworICAgIHRyeToKKyAgICAgICAgZiA9IG9wZW4oZmlsZSkKKyAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICBlcnJwcmludCgiJXI6IEkvTyBFcnJvcjogJXMiICUgKGZpbGUsIG1zZykpCisgICAgICAgIHJldHVybgorCisgICAgaWYgdmVyYm9zZSA+IDE6CisgICAgICAgIHByaW50ICJjaGVja2luZyAlciAuLi4iICUgZmlsZQorCisgICAgdHJ5OgorICAgICAgICBwcm9jZXNzX3Rva2Vucyh0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoZi5yZWFkbGluZSkpCisKKyAgICBleGNlcHQgdG9rZW5pemUuVG9rZW5FcnJvciwgbXNnOgorICAgICAgICBlcnJwcmludCgiJXI6IFRva2VuIEVycm9yOiAlcyIgJSAoZmlsZSwgbXNnKSkKKyAgICAgICAgcmV0dXJuCisKKyAgICBleGNlcHQgSW5kZW50YXRpb25FcnJvciwgbXNnOgorICAgICAgICBlcnJwcmludCgiJXI6IEluZGVudGF0aW9uIEVycm9yOiAlcyIgJSAoZmlsZSwgbXNnKSkKKyAgICAgICAgcmV0dXJuCisKKyAgICBleGNlcHQgTmFubnlOYWcsIG5hZzoKKyAgICAgICAgYmFkbGluZSA9IG5hZy5nZXRfbGluZW5vKCkKKyAgICAgICAgbGluZSA9IG5hZy5nZXRfbGluZSgpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXI6ICoqKiBMaW5lICVkOiB0cm91YmxlIGluIHRhYiBjaXR5ISAqKioiICUgKGZpbGUsIGJhZGxpbmUpCisgICAgICAgICAgICBwcmludCAib2ZmZW5kaW5nIGxpbmU6ICVyIiAlIChsaW5lLCkKKyAgICAgICAgICAgIHByaW50IG5hZy5nZXRfbXNnKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmICcgJyBpbiBmaWxlOiBmaWxlID0gJyInICsgZmlsZSArICciJworICAgICAgICAgICAgaWYgZmlsZW5hbWVfb25seTogcHJpbnQgZmlsZQorICAgICAgICAgICAgZWxzZTogcHJpbnQgZmlsZSwgYmFkbGluZSwgcmVwcihsaW5lKQorICAgICAgICByZXR1cm4KKworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICIlcjogQ2xlYW4gYmlsbCBvZiBoZWFsdGguIiAlIChmaWxlLCkKKworY2xhc3MgV2hpdGVzcGFjZToKKyAgICAjIHRoZSBjaGFyYWN0ZXJzIHVzZWQgZm9yIHNwYWNlIGFuZCB0YWIKKyAgICBTLCBUID0gJyBcdCcKKworICAgICMgbWVtYmVyczoKKyAgICAjICAgcmF3CisgICAgIyAgICAgICB0aGUgb3JpZ2luYWwgc3RyaW5nCisgICAgIyAgIG4KKyAgICAjICAgICAgIHRoZSBudW1iZXIgb2YgbGVhZGluZyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgaW4gcmF3CisgICAgIyAgIG50CisgICAgIyAgICAgICB0aGUgbnVtYmVyIG9mIHRhYnMgaW4gcmF3WzpuXQorICAgICMgICBub3JtCisgICAgIyAgICAgICB0aGUgbm9ybWFsIGZvcm0gYXMgYSBwYWlyIChjb3VudCwgdHJhaWxpbmcpLCB3aGVyZToKKyAgICAjICAgICAgIGNvdW50CisgICAgIyAgICAgICAgICAgYSB0dXBsZSBzdWNoIHRoYXQgcmF3WzpuXSBjb250YWlucyBjb3VudFtpXQorICAgICMgICAgICAgICAgIGluc3RhbmNlcyBvZiBTICogaSArIFQKKyAgICAjICAgICAgIHRyYWlsaW5nCisgICAgIyAgICAgICAgICAgdGhlIG51bWJlciBvZiB0cmFpbGluZyBzcGFjZXMgaW4gcmF3WzpuXQorICAgICMgICAgICAgSXQncyBBIFRoZW9yZW0gdGhhdCBtLmluZGVudF9sZXZlbCh0KSA9PQorICAgICMgICAgICAgbi5pbmRlbnRfbGV2ZWwodCkgZm9yIGFsbCB0ID49IDEgaWZmIG0ubm9ybSA9PSBuLm5vcm0uCisgICAgIyAgIGlzX3NpbXBsZQorICAgICMgICAgICAgdHJ1ZSBpZmYgcmF3WzpuXSBpcyBvZiB0aGUgZm9ybSAoVCopKFMqKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdzKToKKyAgICAgICAgc2VsZi5yYXcgID0gd3MKKyAgICAgICAgUywgVCA9IFdoaXRlc3BhY2UuUywgV2hpdGVzcGFjZS5UCisgICAgICAgIGNvdW50ID0gW10KKyAgICAgICAgYiA9IG4gPSBudCA9IDAKKyAgICAgICAgZm9yIGNoIGluIHNlbGYucmF3OgorICAgICAgICAgICAgaWYgY2ggPT0gUzoKKyAgICAgICAgICAgICAgICBuID0gbiArIDEKKyAgICAgICAgICAgICAgICBiID0gYiArIDEKKyAgICAgICAgICAgIGVsaWYgY2ggPT0gVDoKKyAgICAgICAgICAgICAgICBuID0gbiArIDEKKyAgICAgICAgICAgICAgICBudCA9IG50ICsgMQorICAgICAgICAgICAgICAgIGlmIGIgPj0gbGVuKGNvdW50KToKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIFswXSAqIChiIC0gbGVuKGNvdW50KSArIDEpCisgICAgICAgICAgICAgICAgY291bnRbYl0gPSBjb3VudFtiXSArIDEKKyAgICAgICAgICAgICAgICBiID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLm4gICAgPSBuCisgICAgICAgIHNlbGYubnQgICA9IG50CisgICAgICAgIHNlbGYubm9ybSA9IHR1cGxlKGNvdW50KSwgYgorICAgICAgICBzZWxmLmlzX3NpbXBsZSA9IGxlbihjb3VudCkgPD0gMQorCisgICAgIyByZXR1cm4gbGVuZ3RoIG9mIGxvbmdlc3QgY29udGlndW91cyBydW4gb2Ygc3BhY2VzICh3aGV0aGVyIG9yIG5vdAorICAgICMgcHJlY2VkaW5nIGEgdGFiKQorICAgIGRlZiBsb25nZXN0X3J1bl9vZl9zcGFjZXMoc2VsZik6CisgICAgICAgIGNvdW50LCB0cmFpbGluZyA9IHNlbGYubm9ybQorICAgICAgICByZXR1cm4gbWF4KGxlbihjb3VudCktMSwgdHJhaWxpbmcpCisKKyAgICBkZWYgaW5kZW50X2xldmVsKHNlbGYsIHRhYnNpemUpOgorICAgICAgICAjIGNvdW50LCBpbCA9IHNlbGYubm9ybQorICAgICAgICAjIGZvciBpIGluIHJhbmdlKGxlbihjb3VudCkpOgorICAgICAgICAjICAgIGlmIGNvdW50W2ldOgorICAgICAgICAjICAgICAgICBpbCA9IGlsICsgKGkvdGFic2l6ZSArIDEpKnRhYnNpemUgKiBjb3VudFtpXQorICAgICAgICAjIHJldHVybiBpbAorCisgICAgICAgICMgcXVpY2tlcjoKKyAgICAgICAgIyBpbCA9IHRyYWlsaW5nICsgc3VtIChpL3RzICsgMSkqdHMqY291bnRbaV0gPQorICAgICAgICAjIHRyYWlsaW5nICsgdHMgKiBzdW0gKGkvdHMgKyAxKSpjb3VudFtpXSA9CisgICAgICAgICMgdHJhaWxpbmcgKyB0cyAqIHN1bSBpL3RzKmNvdW50W2ldICsgY291bnRbaV0gPQorICAgICAgICAjIHRyYWlsaW5nICsgdHMgKiBbKHN1bSBpL3RzKmNvdW50W2ldKSArIChzdW0gY291bnRbaV0pXSA9CisgICAgICAgICMgdHJhaWxpbmcgKyB0cyAqIFsoc3VtIGkvdHMqY291bnRbaV0pICsgbnVtX3RhYnNdCisgICAgICAgICMgYW5kIG5vdGUgdGhhdCBpL3RzKmNvdW50W2ldIGlzIDAgd2hlbiBpIDwgdHMKKworICAgICAgICBjb3VudCwgdHJhaWxpbmcgPSBzZWxmLm5vcm0KKyAgICAgICAgaWwgPSAwCisgICAgICAgIGZvciBpIGluIHJhbmdlKHRhYnNpemUsIGxlbihjb3VudCkpOgorICAgICAgICAgICAgaWwgPSBpbCArIGkvdGFic2l6ZSAqIGNvdW50W2ldCisgICAgICAgIHJldHVybiB0cmFpbGluZyArIHRhYnNpemUgKiAoaWwgKyBzZWxmLm50KQorCisgICAgIyByZXR1cm4gdHJ1ZSBpZmYgc2VsZi5pbmRlbnRfbGV2ZWwodCkgPT0gb3RoZXIuaW5kZW50X2xldmVsKHQpCisgICAgIyBmb3IgYWxsIHQgPj0gMQorICAgIGRlZiBlcXVhbChzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLm5vcm0gPT0gb3RoZXIubm9ybQorCisgICAgIyByZXR1cm4gYSBsaXN0IG9mIHR1cGxlcyAodHMsIGkxLCBpMikgc3VjaCB0aGF0CisgICAgIyBpMSA9PSBzZWxmLmluZGVudF9sZXZlbCh0cykgIT0gb3RoZXIuaW5kZW50X2xldmVsKHRzKSA9PSBpMi4KKyAgICAjIEludGVuZGVkIHRvIGJlIHVzZWQgYWZ0ZXIgbm90IHNlbGYuZXF1YWwob3RoZXIpIGlzIGtub3duLCBpbiB3aGljaAorICAgICMgY2FzZSBpdCB3aWxsIHJldHVybiBhdCBsZWFzdCBvbmUgd2l0bmVzc2luZyB0YWIgc2l6ZS4KKyAgICBkZWYgbm90X2VxdWFsX3dpdG5lc3Moc2VsZiwgb3RoZXIpOgorICAgICAgICBuID0gbWF4KHNlbGYubG9uZ2VzdF9ydW5fb2Zfc3BhY2VzKCksCisgICAgICAgICAgICAgICAgb3RoZXIubG9uZ2VzdF9ydW5fb2Zfc3BhY2VzKCkpICsgMQorICAgICAgICBhID0gW10KKyAgICAgICAgZm9yIHRzIGluIHJhbmdlKDEsIG4rMSk6CisgICAgICAgICAgICBpZiBzZWxmLmluZGVudF9sZXZlbCh0cykgIT0gb3RoZXIuaW5kZW50X2xldmVsKHRzKToKKyAgICAgICAgICAgICAgICBhLmFwcGVuZCggKHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmRlbnRfbGV2ZWwodHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuaW5kZW50X2xldmVsKHRzKSkgKQorICAgICAgICByZXR1cm4gYQorCisgICAgIyBSZXR1cm4gVHJ1ZSBpZmYgc2VsZi5pbmRlbnRfbGV2ZWwodCkgPCBvdGhlci5pbmRlbnRfbGV2ZWwodCkKKyAgICAjIGZvciBhbGwgdCA+PSAxLgorICAgICMgVGhlIGFsZ29yaXRobSBpcyBkdWUgdG8gVmluY2VudCBCcm9tYW4uCisgICAgIyBFYXN5IHRvIHByb3ZlIGl0J3MgY29ycmVjdC4KKyAgICAjIFhYWHBvc3QgdGhhdC4KKyAgICAjIFRyaXZpYWwgdG8gcHJvdmUgbiBpcyBzaGFycCAoY29uc2lkZXIgVCB2cyBTVCkuCisgICAgIyBVbmtub3duIHdoZXRoZXIgdGhlcmUncyBhIGZhc3RlciBnZW5lcmFsIHdheS4gIEkgc3VzcGVjdGVkIHNvIGF0CisgICAgIyBmaXJzdCwgYnV0IG5vIGxvbmdlci4KKyAgICAjIEZvciB0aGUgc3BlY2lhbCAoYnV0IGNvbW1vbiEpIGNhc2Ugd2hlcmUgTSBhbmQgTiBhcmUgYm90aCBvZiB0aGUKKyAgICAjIGZvcm0gKFQqKShTKiksIE0ubGVzcyhOKSBpZmYgTS5sZW4oKSA8IE4ubGVuKCkgYW5kCisgICAgIyBNLm51bV90YWJzKCkgPD0gTi5udW1fdGFicygpLiBQcm9vZiBpcyBlYXN5IGJ1dCBraW5kYSBsb25nLXdpbmRlZC4KKyAgICAjIFhYWHdyaXRlIHRoYXQgdXAuCisgICAgIyBOb3RlIHRoYXQgTSBpcyBvZiB0aGUgZm9ybSAoVCopKFMqKSBpZmYgbGVuKE0ubm9ybVswXSkgPD0gMS4KKyAgICBkZWYgbGVzcyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHNlbGYubiA+PSBvdGhlci5uOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIHNlbGYuaXNfc2ltcGxlIGFuZCBvdGhlci5pc19zaW1wbGU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5udCA8PSBvdGhlci5udAorICAgICAgICBuID0gbWF4KHNlbGYubG9uZ2VzdF9ydW5fb2Zfc3BhY2VzKCksCisgICAgICAgICAgICAgICAgb3RoZXIubG9uZ2VzdF9ydW5fb2Zfc3BhY2VzKCkpICsgMQorICAgICAgICAjIHRoZSBzZWxmLm4gPj0gb3RoZXIubiB0ZXN0IGFscmVhZHkgZGlkIGl0IGZvciB0cz0xCisgICAgICAgIGZvciB0cyBpbiByYW5nZSgyLCBuKzEpOgorICAgICAgICAgICAgaWYgc2VsZi5pbmRlbnRfbGV2ZWwodHMpID49IG90aGVyLmluZGVudF9sZXZlbCh0cyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAjIHJldHVybiBhIGxpc3Qgb2YgdHVwbGVzICh0cywgaTEsIGkyKSBzdWNoIHRoYXQKKyAgICAjIGkxID09IHNlbGYuaW5kZW50X2xldmVsKHRzKSA+PSBvdGhlci5pbmRlbnRfbGV2ZWwodHMpID09IGkyLgorICAgICMgSW50ZW5kZWQgdG8gYmUgdXNlZCBhZnRlciBub3Qgc2VsZi5sZXNzKG90aGVyKSBpcyBrbm93biwgaW4gd2hpY2gKKyAgICAjIGNhc2UgaXQgd2lsbCByZXR1cm4gYXQgbGVhc3Qgb25lIHdpdG5lc3NpbmcgdGFiIHNpemUuCisgICAgZGVmIG5vdF9sZXNzX3dpdG5lc3Moc2VsZiwgb3RoZXIpOgorICAgICAgICBuID0gbWF4KHNlbGYubG9uZ2VzdF9ydW5fb2Zfc3BhY2VzKCksCisgICAgICAgICAgICAgICAgb3RoZXIubG9uZ2VzdF9ydW5fb2Zfc3BhY2VzKCkpICsgMQorICAgICAgICBhID0gW10KKyAgICAgICAgZm9yIHRzIGluIHJhbmdlKDEsIG4rMSk6CisgICAgICAgICAgICBpZiBzZWxmLmluZGVudF9sZXZlbCh0cykgPj0gb3RoZXIuaW5kZW50X2xldmVsKHRzKToKKyAgICAgICAgICAgICAgICBhLmFwcGVuZCggKHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmRlbnRfbGV2ZWwodHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuaW5kZW50X2xldmVsKHRzKSkgKQorICAgICAgICByZXR1cm4gYQorCitkZWYgZm9ybWF0X3dpdG5lc3Nlcyh3KToKKyAgICBmaXJzdHMgPSBtYXAobGFtYmRhIHR1cDogc3RyKHR1cFswXSksIHcpCisgICAgcHJlZml4ID0gImF0IHRhYiBzaXplIgorICAgIGlmIGxlbih3KSA+IDE6CisgICAgICAgIHByZWZpeCA9IHByZWZpeCArICJzIgorICAgIHJldHVybiBwcmVmaXggKyAiICIgKyAnLCAnLmpvaW4oZmlyc3RzKQorCitkZWYgcHJvY2Vzc190b2tlbnModG9rZW5zKToKKyAgICBJTkRFTlQgPSB0b2tlbml6ZS5JTkRFTlQKKyAgICBERURFTlQgPSB0b2tlbml6ZS5ERURFTlQKKyAgICBORVdMSU5FID0gdG9rZW5pemUuTkVXTElORQorICAgIEpVTksgPSB0b2tlbml6ZS5DT01NRU5ULCB0b2tlbml6ZS5OTAorICAgIGluZGVudHMgPSBbV2hpdGVzcGFjZSgiIildCisgICAgY2hlY2tfZXF1YWwgPSAwCisKKyAgICBmb3IgKHR5cGUsIHRva2VuLCBzdGFydCwgZW5kLCBsaW5lKSBpbiB0b2tlbnM6CisgICAgICAgIGlmIHR5cGUgPT0gTkVXTElORToKKyAgICAgICAgICAgICMgYSBwcm9ncmFtIHN0YXRlbWVudCwgb3IgRU5ETUFSS0VSLCB3aWxsIGV2ZW50dWFsbHkgZm9sbG93LAorICAgICAgICAgICAgIyBhZnRlciBzb21lIChwb3NzaWJseSBlbXB0eSkgcnVuIG9mIHRva2VucyBvZiB0aGUgZm9ybQorICAgICAgICAgICAgIyAgICAgKE5MIHwgQ09NTUVOVCkqIChJTkRFTlQgfCBERURFTlQrKT8KKyAgICAgICAgICAgICMgSWYgYW4gSU5ERU5UIGFwcGVhcnMsIHNldHRpbmcgY2hlY2tfZXF1YWwgaXMgd3JvbmcsIGFuZCB3aWxsCisgICAgICAgICAgICAjIGJlIHVuZG9uZSB3aGVuIHdlIHNlZSB0aGUgSU5ERU5ULgorICAgICAgICAgICAgY2hlY2tfZXF1YWwgPSAxCisKKyAgICAgICAgZWxpZiB0eXBlID09IElOREVOVDoKKyAgICAgICAgICAgIGNoZWNrX2VxdWFsID0gMAorICAgICAgICAgICAgdGhpc2d1eSA9IFdoaXRlc3BhY2UodG9rZW4pCisgICAgICAgICAgICBpZiBub3QgaW5kZW50c1stMV0ubGVzcyh0aGlzZ3V5KToKKyAgICAgICAgICAgICAgICB3aXRuZXNzID0gaW5kZW50c1stMV0ubm90X2xlc3Nfd2l0bmVzcyh0aGlzZ3V5KQorICAgICAgICAgICAgICAgIG1zZyA9ICJpbmRlbnQgbm90IGdyZWF0ZXIgZS5nLiAiICsgZm9ybWF0X3dpdG5lc3Nlcyh3aXRuZXNzKQorICAgICAgICAgICAgICAgIHJhaXNlIE5hbm55TmFnKHN0YXJ0WzBdLCBtc2csIGxpbmUpCisgICAgICAgICAgICBpbmRlbnRzLmFwcGVuZCh0aGlzZ3V5KQorCisgICAgICAgIGVsaWYgdHlwZSA9PSBERURFTlQ6CisgICAgICAgICAgICAjIHRoZXJlJ3Mgbm90aGluZyB3ZSBuZWVkIHRvIGNoZWNrIGhlcmUhICB3aGF0J3MgaW1wb3J0YW50IGlzCisgICAgICAgICAgICAjIHRoYXQgd2hlbiB0aGUgcnVuIG9mIERFREVOVHMgZW5kcywgdGhlIGluZGVudGF0aW9uIG9mIHRoZQorICAgICAgICAgICAgIyBwcm9ncmFtIHN0YXRlbWVudCAob3IgRU5ETUFSS0VSKSB0aGF0IHRyaWdnZXJlZCB0aGUgcnVuIGlzCisgICAgICAgICAgICAjIGVxdWFsIHRvIHdoYXQncyBsZWZ0IGF0IHRoZSB0b3Agb2YgdGhlIGluZGVudHMgc3RhY2sKKworICAgICAgICAgICAgIyBPdWNoISAgVGhpcyBhc3NlcnQgdHJpZ2dlcnMgaWYgdGhlIGxhc3QgbGluZSBvZiB0aGUgc291cmNlCisgICAgICAgICAgICAjIGlzIGluZGVudGVkICphbmQqIGxhY2tzIGEgbmV3bGluZSAtLSB0aGVuIERFREVOVHMgcG9wIG91dAorICAgICAgICAgICAgIyBvZiB0aGluIGFpci4KKyAgICAgICAgICAgICMgYXNzZXJ0IGNoZWNrX2VxdWFsICAjIGVsc2Ugbm8gZWFybGllciBORVdMSU5FLCBvciBhbiBlYXJsaWVyIElOREVOVAorICAgICAgICAgICAgY2hlY2tfZXF1YWwgPSAxCisKKyAgICAgICAgICAgIGRlbCBpbmRlbnRzWy0xXQorCisgICAgICAgIGVsaWYgY2hlY2tfZXF1YWwgYW5kIHR5cGUgbm90IGluIEpVTks6CisgICAgICAgICAgICAjIHRoaXMgaXMgdGhlIGZpcnN0ICJyZWFsIHRva2VuIiBmb2xsb3dpbmcgYSBORVdMSU5FLCBzbyBpdAorICAgICAgICAgICAgIyBtdXN0IGJlIHRoZSBmaXJzdCB0b2tlbiBvZiB0aGUgbmV4dCBwcm9ncmFtIHN0YXRlbWVudCwgb3IgYW4KKyAgICAgICAgICAgICMgRU5ETUFSS0VSOyB0aGUgImxpbmUiIGFyZ3VtZW50IGV4cG9zZXMgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZQorICAgICAgICAgICAgIyBmb3IgdGhpcyBzdGF0ZW1lbnQ7IGluIHRoZSBjYXNlIG9mIEVORE1BUktFUiwgbGluZSBpcyBhbiBlbXB0eQorICAgICAgICAgICAgIyBzdHJpbmcsIHNvIHdpbGwgcHJvcGVybHkgbWF0Y2ggdGhlIGVtcHR5IHN0cmluZyB3aXRoIHdoaWNoIHRoZQorICAgICAgICAgICAgIyAiaW5kZW50cyIgc3RhY2sgd2FzIHNlZWRlZAorICAgICAgICAgICAgY2hlY2tfZXF1YWwgPSAwCisgICAgICAgICAgICB0aGlzZ3V5ID0gV2hpdGVzcGFjZShsaW5lKQorICAgICAgICAgICAgaWYgbm90IGluZGVudHNbLTFdLmVxdWFsKHRoaXNndXkpOgorICAgICAgICAgICAgICAgIHdpdG5lc3MgPSBpbmRlbnRzWy0xXS5ub3RfZXF1YWxfd2l0bmVzcyh0aGlzZ3V5KQorICAgICAgICAgICAgICAgIG1zZyA9ICJpbmRlbnQgbm90IGVxdWFsIGUuZy4gIiArIGZvcm1hdF93aXRuZXNzZXMod2l0bmVzcykKKyAgICAgICAgICAgICAgICByYWlzZSBOYW5ueU5hZyhzdGFydFswXSwgbXNnLCBsaW5lKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RhYm5hbm55LnB5YyBiL2xpYi9weXRob24yLjcvdGFibmFubnkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MGEyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RhYm5hbm55LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RhYm5hbm55LnB5byBiL2xpYi9weXRob24yLjcvdGFibmFubnkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MGEyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RhYm5hbm55LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RhcmZpbGUucHkgYi9saWIvcHl0aG9uMi43L3RhcmZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhNmU4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGFyZmlsZS5weQpAQCAtMCwwICsxLDI1OTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdGFyZmlsZS5weQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29weXJpZ2h0IChDKSAyMDAyIExhcnMgR3VzdORiZWwgPGxhcnNAZ3VzdGFlYmVsLmRlPgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBQZXJtaXNzaW9uICBpcyAgaGVyZWJ5IGdyYW50ZWQsICBmcmVlICBvZiBjaGFyZ2UsICB0byAgYW55IHBlcnNvbgorIyBvYnRhaW5pbmcgYSAgY29weSBvZiAgdGhpcyBzb2Z0d2FyZSAgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgorIyBmaWxlcyAgKHRoZSAgIlNvZnR3YXJlIiksICB0byAgIGRlYWwgIGluICB0aGUgIFNvZnR3YXJlICAgd2l0aG91dAorIyByZXN0cmljdGlvbiwgIGluY2x1ZGluZyAgd2l0aG91dCBsaW1pdGF0aW9uICB0aGUgIHJpZ2h0cyB0byAgdXNlLAorIyBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorIyBjb3BpZXMgIG9mICB0aGUgIFNvZnR3YXJlLCAgYW5kIHRvICBwZXJtaXQgIHBlcnNvbnMgIHRvICB3aG9tIHRoZQorIyBTb2Z0d2FyZSAgaXMgIGZ1cm5pc2hlZCAgdG8gIGRvICBzbywgIHN1YmplY3QgIHRvICB0aGUgIGZvbGxvd2luZworIyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0ICBub3RpY2UgYW5kIHRoaXMgIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsICBiZQorIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyAgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSAgS0lORCwKKyMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgIEJVVCBOT1QgTElNSVRFRCBUTyAgVEhFIFdBUlJBTlRJRVMKKyMgT0YgIE1FUkNIQU5UQUJJTElUWSwgIEZJVE5FU1MgICBGT1IgIEEgIFBBUlRJQ1VMQVIgICBQVVJQT1NFICBBTkQKKyMgTk9OSU5GUklOR0VNRU5ULiAgSU4gIE5PICBFVkVOVCBTSEFMTCAgVEhFICBBVVRIT1JTICBPUiBDT1BZUklHSFQKKyMgSE9MREVSUyAgQkUgTElBQkxFICBGT1IgQU5ZICBDTEFJTSwgREFNQUdFUyAgT1IgT1RIRVIgIExJQUJJTElUWSwKKyMgV0hFVEhFUiAgSU4gQU4gIEFDVElPTiBPRiAgQ09OVFJBQ1QsIFRPUlQgIE9SIE9USEVSV0lTRSwgIEFSSVNJTkcKKyMgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorIyBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisjCisiIiJSZWFkIGZyb20gYW5kIHdyaXRlIHRvIHRhciBmb3JtYXQgYXJjaGl2ZXMuCisiIiIKKworX192ZXJzaW9uX18gPSAiJFJldmlzaW9uOiA4NTIxMyAkIgorIyAkU291cmNlJAorCit2ZXJzaW9uICAgICA9ICIwLjkuMCIKK19fYXV0aG9yX18gID0gIkxhcnMgR3VzdORiZWwgKGxhcnNAZ3VzdGFlYmVsLmRlKSIKK19fZGF0ZV9fICAgID0gIiREYXRlJCIKK19fY3ZzaWRfXyAgID0gIiRJZCQiCitfX2NyZWRpdHNfXyA9ICJHdXN0YXZvIE5pZW1leWVyLCBOaWVscyBHdXN05GJlbCwgUmljaGFyZCBUb3duc2VuZC4iCisKKyMtLS0tLS0tLS0KKyMgSW1wb3J0cworIy0tLS0tLS0tLQoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3RhdAoraW1wb3J0IGVycm5vCitpbXBvcnQgdGltZQoraW1wb3J0IHN0cnVjdAoraW1wb3J0IGNvcHkKK2ltcG9ydCByZQoraW1wb3J0IG9wZXJhdG9yCisKK3RyeToKKyAgICBpbXBvcnQgZ3JwLCBwd2QKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBncnAgPSBwd2QgPSBOb25lCisKKyMgZnJvbSB0YXJmaWxlIGltcG9ydCAqCitfX2FsbF9fID0gWyJUYXJGaWxlIiwgIlRhckluZm8iLCAiaXNfdGFyZmlsZSIsICJUYXJFcnJvciJdCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdGFyIGNvbnN0YW50cworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTlVMID0gIlwwIiAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBudWxsIGNoYXJhY3RlcgorQkxPQ0tTSVpFID0gNTEyICAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrcworUkVDT1JEU0laRSA9IEJMT0NLU0laRSAqIDIwICAgICAjIGxlbmd0aCBvZiByZWNvcmRzCitHTlVfTUFHSUMgPSAidXN0YXIgIFwwIiAgICAgICAgICMgbWFnaWMgZ251IHRhciBzdHJpbmcKK1BPU0lYX01BR0lDID0gInVzdGFyXHgwMDAwIiAgICAgIyBtYWdpYyBwb3NpeCB0YXIgc3RyaW5nCisKK0xFTkdUSF9OQU1FID0gMTAwICAgICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiBhIGZpbGVuYW1lCitMRU5HVEhfTElOSyA9IDEwMCAgICAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBsaW5rbmFtZQorTEVOR1RIX1BSRUZJWCA9IDE1NSAgICAgICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBwcmVmaXggZmllbGQKKworUkVHVFlQRSA9ICIwIiAgICAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZQorQVJFR1RZUEUgPSAiXDAiICAgICAgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZQorTE5LVFlQRSA9ICIxIiAgICAgICAgICAgICAgICAgICAjIGxpbmsgKGluc2lkZSB0YXJmaWxlKQorU1lNVFlQRSA9ICIyIiAgICAgICAgICAgICAgICAgICAjIHN5bWJvbGljIGxpbmsKK0NIUlRZUEUgPSAiMyIgICAgICAgICAgICAgICAgICAgIyBjaGFyYWN0ZXIgc3BlY2lhbCBkZXZpY2UKK0JMS1RZUEUgPSAiNCIgICAgICAgICAgICAgICAgICAgIyBibG9jayBzcGVjaWFsIGRldmljZQorRElSVFlQRSA9ICI1IiAgICAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeQorRklGT1RZUEUgPSAiNiIgICAgICAgICAgICAgICAgICAjIGZpZm8gc3BlY2lhbCBkZXZpY2UKK0NPTlRUWVBFID0gIjciICAgICAgICAgICAgICAgICAgIyBjb250aWd1b3VzIGZpbGUKKworR05VVFlQRV9MT05HTkFNRSA9ICJMIiAgICAgICAgICAjIEdOVSB0YXIgbG9uZ25hbWUKK0dOVVRZUEVfTE9OR0xJTksgPSAiSyIgICAgICAgICAgIyBHTlUgdGFyIGxvbmdsaW5rCitHTlVUWVBFX1NQQVJTRSA9ICJTIiAgICAgICAgICAgICMgR05VIHRhciBzcGFyc2UgZmlsZQorCitYSERUWVBFID0gIngiICAgICAgICAgICAgICAgICAgICMgUE9TSVguMS0yMDAxIGV4dGVuZGVkIGhlYWRlcgorWEdMVFlQRSA9ICJnIiAgICAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMjAwMSBnbG9iYWwgaGVhZGVyCitTT0xBUklTX1hIRFRZUEUgPSAiWCIgICAgICAgICAgICMgU29sYXJpcyBleHRlbmRlZCBoZWFkZXIKKworVVNUQVJfRk9STUFUID0gMCAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMTk4OCAodXN0YXIpIGZvcm1hdAorR05VX0ZPUk1BVCA9IDEgICAgICAgICAgICAgICAgICAjIEdOVSB0YXIgZm9ybWF0CitQQVhfRk9STUFUID0gMiAgICAgICAgICAgICAgICAgICMgUE9TSVguMS0yMDAxIChwYXgpIGZvcm1hdAorREVGQVVMVF9GT1JNQVQgPSBHTlVfRk9STUFUCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgdGFyZmlsZSBjb25zdGFudHMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRmlsZSB0eXBlcyB0aGF0IHRhcmZpbGUgc3VwcG9ydHM6CitTVVBQT1JURURfVFlQRVMgPSAoUkVHVFlQRSwgQVJFR1RZUEUsIExOS1RZUEUsCisgICAgICAgICAgICAgICAgICAgU1lNVFlQRSwgRElSVFlQRSwgRklGT1RZUEUsCisgICAgICAgICAgICAgICAgICAgQ09OVFRZUEUsIENIUlRZUEUsIEJMS1RZUEUsCisgICAgICAgICAgICAgICAgICAgR05VVFlQRV9MT05HTkFNRSwgR05VVFlQRV9MT05HTElOSywKKyAgICAgICAgICAgICAgICAgICBHTlVUWVBFX1NQQVJTRSkKKworIyBGaWxlIHR5cGVzIHRoYXQgd2lsbCBiZSB0cmVhdGVkIGFzIGEgcmVndWxhciBmaWxlLgorUkVHVUxBUl9UWVBFUyA9IChSRUdUWVBFLCBBUkVHVFlQRSwKKyAgICAgICAgICAgICAgICAgQ09OVFRZUEUsIEdOVVRZUEVfU1BBUlNFKQorCisjIEZpbGUgdHlwZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUgR05VIHRhciBmb3JtYXQuCitHTlVfVFlQRVMgPSAoR05VVFlQRV9MT05HTkFNRSwgR05VVFlQRV9MT05HTElOSywKKyAgICAgICAgICAgICBHTlVUWVBFX1NQQVJTRSkKKworIyBGaWVsZHMgZnJvbSBhIHBheCBoZWFkZXIgdGhhdCBvdmVycmlkZSBhIFRhckluZm8gYXR0cmlidXRlLgorUEFYX0ZJRUxEUyA9ICgicGF0aCIsICJsaW5rcGF0aCIsICJzaXplIiwgIm10aW1lIiwKKyAgICAgICAgICAgICAgInVpZCIsICJnaWQiLCAidW5hbWUiLCAiZ25hbWUiKQorCisjIEZpZWxkcyBpbiBhIHBheCBoZWFkZXIgdGhhdCBhcmUgbnVtYmVycywgYWxsIG90aGVyIGZpZWxkcworIyBhcmUgdHJlYXRlZCBhcyBzdHJpbmdzLgorUEFYX05VTUJFUl9GSUVMRFMgPSB7CisgICAgImF0aW1lIjogZmxvYXQsCisgICAgImN0aW1lIjogZmxvYXQsCisgICAgIm10aW1lIjogZmxvYXQsCisgICAgInVpZCI6IGludCwKKyAgICAiZ2lkIjogaW50LAorICAgICJzaXplIjogaW50Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQml0cyB1c2VkIGluIHRoZSBtb2RlIGZpZWxkLCB2YWx1ZXMgaW4gb2N0YWwuCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitTX0lGTE5LID0gMDEyMDAwMCAgICAgICAgIyBzeW1ib2xpYyBsaW5rCitTX0lGUkVHID0gMDEwMDAwMCAgICAgICAgIyByZWd1bGFyIGZpbGUKK1NfSUZCTEsgPSAwMDYwMDAwICAgICAgICAjIGJsb2NrIGRldmljZQorU19JRkRJUiA9IDAwNDAwMDAgICAgICAgICMgZGlyZWN0b3J5CitTX0lGQ0hSID0gMDAyMDAwMCAgICAgICAgIyBjaGFyYWN0ZXIgZGV2aWNlCitTX0lGSUZPID0gMDAxMDAwMCAgICAgICAgIyBmaWZvCisKK1RTVUlEICAgPSAwNDAwMCAgICAgICAgICAjIHNldCBVSUQgb24gZXhlY3V0aW9uCitUU0dJRCAgID0gMDIwMDAgICAgICAgICAgIyBzZXQgR0lEIG9uIGV4ZWN1dGlvbgorVFNWVFggICA9IDAxMDAwICAgICAgICAgICMgcmVzZXJ2ZWQKKworVFVSRUFEICA9IDA0MDAgICAgICAgICAgICMgcmVhZCBieSBvd25lcgorVFVXUklURSA9IDAyMDAgICAgICAgICAgICMgd3JpdGUgYnkgb3duZXIKK1RVRVhFQyAgPSAwMTAwICAgICAgICAgICAjIGV4ZWN1dGUvc2VhcmNoIGJ5IG93bmVyCitUR1JFQUQgID0gMDA0MCAgICAgICAgICAgIyByZWFkIGJ5IGdyb3VwCitUR1dSSVRFID0gMDAyMCAgICAgICAgICAgIyB3cml0ZSBieSBncm91cAorVEdFWEVDICA9IDAwMTAgICAgICAgICAgICMgZXhlY3V0ZS9zZWFyY2ggYnkgZ3JvdXAKK1RPUkVBRCAgPSAwMDA0ICAgICAgICAgICAjIHJlYWQgYnkgb3RoZXIKK1RPV1JJVEUgPSAwMDAyICAgICAgICAgICAjIHdyaXRlIGJ5IG90aGVyCitUT0VYRUMgID0gMDAwMSAgICAgICAgICAgIyBleGVjdXRlL3NlYXJjaCBieSBvdGhlcgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGluaXRpYWxpemF0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFTkNPRElORyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQoraWYgRU5DT0RJTkcgaXMgTm9uZToKKyAgICBFTkNPRElORyA9IHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNvbWUgdXNlZnVsIGZ1bmN0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgc3RuKHMsIGxlbmd0aCk6CisgICAgIiIiQ29udmVydCBhIHB5dGhvbiBzdHJpbmcgdG8gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJ1ZmZlci4KKyAgICAiIiIKKyAgICByZXR1cm4gc1s6bGVuZ3RoXSArIChsZW5ndGggLSBsZW4ocykpICogTlVMCisKK2RlZiBudHMocyk6CisgICAgIiIiQ29udmVydCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgZmllbGQgdG8gYSBweXRob24gc3RyaW5nLgorICAgICIiIgorICAgICMgVXNlIHRoZSBzdHJpbmcgdXAgdG8gdGhlIGZpcnN0IG51bGwgY2hhci4KKyAgICBwID0gcy5maW5kKCJcMCIpCisgICAgaWYgcCA9PSAtMToKKyAgICAgICAgcmV0dXJuIHMKKyAgICByZXR1cm4gc1s6cF0KKworZGVmIG50aShzKToKKyAgICAiIiJDb252ZXJ0IGEgbnVtYmVyIGZpZWxkIHRvIGEgcHl0aG9uIG51bWJlci4KKyAgICAiIiIKKyAgICAjIFRoZXJlIGFyZSB0d28gcG9zc2libGUgZW5jb2RpbmdzIGZvciBhIG51bWJlciBmaWVsZCwgc2VlCisgICAgIyBpdG4oKSBiZWxvdy4KKyAgICBpZiBzWzBdICE9IGNocigwMjAwKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbiA9IGludChudHMocykgb3IgIjAiLCA4KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEludmFsaWRIZWFkZXJFcnJvcigiaW52YWxpZCBoZWFkZXIiKQorICAgIGVsc2U6CisgICAgICAgIG4gPSAwTAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKHMpIC0gMSk6CisgICAgICAgICAgICBuIDw8PSA4CisgICAgICAgICAgICBuICs9IG9yZChzW2kgKyAxXSkKKyAgICByZXR1cm4gbgorCitkZWYgaXRuKG4sIGRpZ2l0cz04LCBmb3JtYXQ9REVGQVVMVF9GT1JNQVQpOgorICAgICIiIkNvbnZlcnQgYSBweXRob24gbnVtYmVyIHRvIGEgbnVtYmVyIGZpZWxkLgorICAgICIiIgorICAgICMgUE9TSVggMTAwMy4xLTE5ODggcmVxdWlyZXMgbnVtYmVycyB0byBiZSBlbmNvZGVkIGFzIGEgc3RyaW5nIG9mCisgICAgIyBvY3RhbCBkaWdpdHMgZm9sbG93ZWQgYnkgYSBudWxsLWJ5dGUsIHRoaXMgYWxsb3dzIHZhbHVlcyB1cCB0bworICAgICMgKDgqKihkaWdpdHMtMSkpLTEuIEdOVSB0YXIgYWxsb3dzIHN0b3JpbmcgbnVtYmVycyBncmVhdGVyIHRoYW4KKyAgICAjIHRoYXQgaWYgbmVjZXNzYXJ5LiBBIGxlYWRpbmcgMDIwMCBieXRlIGluZGljYXRlcyB0aGlzIHBhcnRpY3VsYXIKKyAgICAjIGVuY29kaW5nLCB0aGUgZm9sbG93aW5nIGRpZ2l0cy0xIGJ5dGVzIGFyZSBhIGJpZy1lbmRpYW4KKyAgICAjIHJlcHJlc2VudGF0aW9uLiBUaGlzIGFsbG93cyB2YWx1ZXMgdXAgdG8gKDI1NioqKGRpZ2l0cy0xKSktMS4KKyAgICBpZiAwIDw9IG4gPCA4ICoqIChkaWdpdHMgLSAxKToKKyAgICAgICAgcyA9ICIlMCpvIiAlIChkaWdpdHMgLSAxLCBuKSArIE5VTAorICAgIGVsc2U6CisgICAgICAgIGlmIGZvcm1hdCAhPSBHTlVfRk9STUFUIG9yIG4gPj0gMjU2ICoqIChkaWdpdHMgLSAxKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm92ZXJmbG93IGluIG51bWJlciBmaWVsZCIpCisKKyAgICAgICAgaWYgbiA8IDA6CisgICAgICAgICAgICAjIFhYWCBXZSBtaW1pYyBHTlUgdGFyJ3MgYmVoYXZpb3VyIHdpdGggbmVnYXRpdmUgbnVtYmVycywKKyAgICAgICAgICAgICMgdGhpcyBjb3VsZCByYWlzZSBPdmVyZmxvd0Vycm9yLgorICAgICAgICAgICAgbiA9IHN0cnVjdC51bnBhY2soIkwiLCBzdHJ1Y3QucGFjaygibCIsIG4pKVswXQorCisgICAgICAgIHMgPSAiIgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoZGlnaXRzIC0gMSk6CisgICAgICAgICAgICBzID0gY2hyKG4gJiAwMzc3KSArIHMKKyAgICAgICAgICAgIG4gPj49IDgKKyAgICAgICAgcyA9IGNocigwMjAwKSArIHMKKyAgICByZXR1cm4gcworCitkZWYgdXRzKHMsIGVuY29kaW5nLCBlcnJvcnMpOgorICAgICIiIkNvbnZlcnQgYSB1bmljb2RlIG9iamVjdCB0byBhIHN0cmluZy4KKyAgICAiIiIKKyAgICBpZiBlcnJvcnMgPT0gInV0Zi04IjoKKyAgICAgICAgIyBBbiBleHRyYSBlcnJvciBoYW5kbGVyIHNpbWlsYXIgdG8gdGhlIC1vIGludmFsaWQ9VVRGLTggb3B0aW9uCisgICAgICAgICMgaW4gUE9TSVguMS0yMDAxLiBSZXBsYWNlIHVudHJhbnNsYXRhYmxlIGNoYXJhY3RlcnMgd2l0aCB0aGVpcgorICAgICAgICAjIFVURi04IHJlcHJlc2VudGF0aW9uLgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gcy5lbmNvZGUoZW5jb2RpbmcsICJzdHJpY3QiKQorICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICAgICAgeCA9IFtdCisgICAgICAgICAgICBmb3IgYyBpbiBzOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgeC5hcHBlbmQoYy5lbmNvZGUoZW5jb2RpbmcsICJzdHJpY3QiKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICAgICAgICAgICAgICB4LmFwcGVuZChjLmVuY29kZSgidXRmOCIpKQorICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4oeCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcy5lbmNvZGUoZW5jb2RpbmcsIGVycm9ycykKKworZGVmIGNhbGNfY2hrc3VtcyhidWYpOgorICAgICIiIkNhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gZm9yIGEgbWVtYmVyJ3MgaGVhZGVyIGJ5IHN1bW1pbmcgdXAgYWxsCisgICAgICAgY2hhcmFjdGVycyBleGNlcHQgZm9yIHRoZSBjaGtzdW0gZmllbGQgd2hpY2ggaXMgdHJlYXRlZCBhcyBpZgorICAgICAgIGl0IHdhcyBmaWxsZWQgd2l0aCBzcGFjZXMuIEFjY29yZGluZyB0byB0aGUgR05VIHRhciBzb3VyY2VzLAorICAgICAgIHNvbWUgdGFycyAoU3VuIGFuZCBOZVhUKSBjYWxjdWxhdGUgY2hrc3VtIHdpdGggc2lnbmVkIGNoYXIsCisgICAgICAgd2hpY2ggd2lsbCBiZSBkaWZmZXJlbnQgaWYgdGhlcmUgYXJlIGNoYXJzIGluIHRoZSBidWZmZXIgd2l0aAorICAgICAgIHRoZSBoaWdoIGJpdCBzZXQuIFNvIHdlIGNhbGN1bGF0ZSB0d28gY2hlY2tzdW1zLCB1bnNpZ25lZCBhbmQKKyAgICAgICBzaWduZWQuCisgICAgIiIiCisgICAgdW5zaWduZWRfY2hrc3VtID0gMjU2ICsgc3VtKHN0cnVjdC51bnBhY2soIjE0OEIiLCBidWZbOjE0OF0pICsgc3RydWN0LnVucGFjaygiMzU2QiIsIGJ1ZlsxNTY6NTEyXSkpCisgICAgc2lnbmVkX2Noa3N1bSA9IDI1NiArIHN1bShzdHJ1Y3QudW5wYWNrKCIxNDhiIiwgYnVmWzoxNDhdKSArIHN0cnVjdC51bnBhY2soIjM1NmIiLCBidWZbMTU2OjUxMl0pKQorICAgIHJldHVybiB1bnNpZ25lZF9jaGtzdW0sIHNpZ25lZF9jaGtzdW0KKworZGVmIGNvcHlmaWxlb2JqKHNyYywgZHN0LCBsZW5ndGg9Tm9uZSk6CisgICAgIiIiQ29weSBsZW5ndGggYnl0ZXMgZnJvbSBmaWxlb2JqIHNyYyB0byBmaWxlb2JqIGRzdC4KKyAgICAgICBJZiBsZW5ndGggaXMgTm9uZSwgY29weSB0aGUgZW50aXJlIGNvbnRlbnQuCisgICAgIiIiCisgICAgaWYgbGVuZ3RoID09IDA6CisgICAgICAgIHJldHVybgorICAgIGlmIGxlbmd0aCBpcyBOb25lOgorICAgICAgICBzaHV0aWwuY29weWZpbGVvYmooc3JjLCBkc3QpCisgICAgICAgIHJldHVybgorCisgICAgQlVGU0laRSA9IDE2ICogMTAyNAorICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGxlbmd0aCwgQlVGU0laRSkKKyAgICBmb3IgYiBpbiB4cmFuZ2UoYmxvY2tzKToKKyAgICAgICAgYnVmID0gc3JjLnJlYWQoQlVGU0laRSkKKyAgICAgICAgaWYgbGVuKGJ1ZikgPCBCVUZTSVpFOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiZW5kIG9mIGZpbGUgcmVhY2hlZCIpCisgICAgICAgIGRzdC53cml0ZShidWYpCisKKyAgICBpZiByZW1haW5kZXIgIT0gMDoKKyAgICAgICAgYnVmID0gc3JjLnJlYWQocmVtYWluZGVyKQorICAgICAgICBpZiBsZW4oYnVmKSA8IHJlbWFpbmRlcjoKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImVuZCBvZiBmaWxlIHJlYWNoZWQiKQorICAgICAgICBkc3Qud3JpdGUoYnVmKQorICAgIHJldHVybgorCitmaWxlbW9kZV90YWJsZSA9ICgKKyAgICAoKFNfSUZMTkssICAgICAgImwiKSwKKyAgICAgKFNfSUZSRUcsICAgICAgIi0iKSwKKyAgICAgKFNfSUZCTEssICAgICAgImIiKSwKKyAgICAgKFNfSUZESVIsICAgICAgImQiKSwKKyAgICAgKFNfSUZDSFIsICAgICAgImMiKSwKKyAgICAgKFNfSUZJRk8sICAgICAgInAiKSksCisKKyAgICAoKFRVUkVBRCwgICAgICAgInIiKSwpLAorICAgICgoVFVXUklURSwgICAgICAidyIpLCksCisgICAgKChUVUVYRUN8VFNVSUQsICJzIiksCisgICAgIChUU1VJRCwgICAgICAgICJTIiksCisgICAgIChUVUVYRUMsICAgICAgICJ4IikpLAorCisgICAgKChUR1JFQUQsICAgICAgICJyIiksKSwKKyAgICAoKFRHV1JJVEUsICAgICAgInciKSwpLAorICAgICgoVEdFWEVDfFRTR0lELCAicyIpLAorICAgICAoVFNHSUQsICAgICAgICAiUyIpLAorICAgICAoVEdFWEVDLCAgICAgICAieCIpKSwKKworICAgICgoVE9SRUFELCAgICAgICAiciIpLCksCisgICAgKChUT1dSSVRFLCAgICAgICJ3IiksKSwKKyAgICAoKFRPRVhFQ3xUU1ZUWCwgInQiKSwKKyAgICAgKFRTVlRYLCAgICAgICAgIlQiKSwKKyAgICAgKFRPRVhFQywgICAgICAgIngiKSkKKykKKworZGVmIGZpbGVtb2RlKG1vZGUpOgorICAgICIiIkNvbnZlcnQgYSBmaWxlJ3MgbW9kZSB0byBhIHN0cmluZyBvZiB0aGUgZm9ybQorICAgICAgIC1yd3hyd3hyd3guCisgICAgICAgVXNlZCBieSBUYXJGaWxlLmxpc3QoKQorICAgICIiIgorICAgIHBlcm0gPSBbXQorICAgIGZvciB0YWJsZSBpbiBmaWxlbW9kZV90YWJsZToKKyAgICAgICAgZm9yIGJpdCwgY2hhciBpbiB0YWJsZToKKyAgICAgICAgICAgIGlmIG1vZGUgJiBiaXQgPT0gYml0OgorICAgICAgICAgICAgICAgIHBlcm0uYXBwZW5kKGNoYXIpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBlcm0uYXBwZW5kKCItIikKKyAgICByZXR1cm4gIiIuam9pbihwZXJtKQorCitjbGFzcyBUYXJFcnJvcihFeGNlcHRpb24pOgorICAgICIiIkJhc2UgZXhjZXB0aW9uLiIiIgorICAgIHBhc3MKK2NsYXNzIEV4dHJhY3RFcnJvcihUYXJFcnJvcik6CisgICAgIiIiR2VuZXJhbCBleGNlcHRpb24gZm9yIGV4dHJhY3QgZXJyb3JzLiIiIgorICAgIHBhc3MKK2NsYXNzIFJlYWRFcnJvcihUYXJFcnJvcik6CisgICAgIiIiRXhjZXB0aW9uIGZvciB1bnJlYWRibGUgdGFyIGFyY2hpdmVzLiIiIgorICAgIHBhc3MKK2NsYXNzIENvbXByZXNzaW9uRXJyb3IoVGFyRXJyb3IpOgorICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5hdmFpbGFibGUgY29tcHJlc3Npb24gbWV0aG9kcy4iIiIKKyAgICBwYXNzCitjbGFzcyBTdHJlYW1FcnJvcihUYXJFcnJvcik6CisgICAgIiIiRXhjZXB0aW9uIGZvciB1bnN1cHBvcnRlZCBvcGVyYXRpb25zIG9uIHN0cmVhbS1saWtlIFRhckZpbGVzLiIiIgorICAgIHBhc3MKK2NsYXNzIEhlYWRlckVycm9yKFRhckVycm9yKToKKyAgICAiIiJCYXNlIGV4Y2VwdGlvbiBmb3IgaGVhZGVyIGVycm9ycy4iIiIKKyAgICBwYXNzCitjbGFzcyBFbXB0eUhlYWRlckVycm9yKEhlYWRlckVycm9yKToKKyAgICAiIiJFeGNlcHRpb24gZm9yIGVtcHR5IGhlYWRlcnMuIiIiCisgICAgcGFzcworY2xhc3MgVHJ1bmNhdGVkSGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgorICAgICIiIkV4Y2VwdGlvbiBmb3IgdHJ1bmNhdGVkIGhlYWRlcnMuIiIiCisgICAgcGFzcworY2xhc3MgRU9GSGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgorICAgICIiIkV4Y2VwdGlvbiBmb3IgZW5kIG9mIGZpbGUgaGVhZGVycy4iIiIKKyAgICBwYXNzCitjbGFzcyBJbnZhbGlkSGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgorICAgICIiIkV4Y2VwdGlvbiBmb3IgaW52YWxpZCBoZWFkZXJzLiIiIgorICAgIHBhc3MKK2NsYXNzIFN1YnNlcXVlbnRIZWFkZXJFcnJvcihIZWFkZXJFcnJvcik6CisgICAgIiIiRXhjZXB0aW9uIGZvciBtaXNzaW5nIGFuZCBpbnZhbGlkIGV4dGVuZGVkIGhlYWRlcnMuIiIiCisgICAgcGFzcworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGludGVybmFsIHN0cmVhbSBpbnRlcmZhY2UKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NsYXNzIF9Mb3dMZXZlbEZpbGU6CisgICAgIiIiTG93LWxldmVsIGZpbGUgb2JqZWN0LiBTdXBwb3J0cyByZWFkaW5nIGFuZCB3cml0aW5nLgorICAgICAgIEl0IGlzIHVzZWQgaW5zdGVhZCBvZiBhIHJlZ3VsYXIgZmlsZSBvYmplY3QgZm9yIHN0cmVhbWluZworICAgICAgIGFjY2Vzcy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2RlKToKKyAgICAgICAgbW9kZSA9IHsKKyAgICAgICAgICAgICJyIjogb3MuT19SRE9OTFksCisgICAgICAgICAgICAidyI6IG9zLk9fV1JPTkxZIHwgb3MuT19DUkVBVCB8IG9zLk9fVFJVTkMsCisgICAgICAgIH1bbW9kZV0KKyAgICAgICAgaWYgaGFzYXR0cihvcywgIk9fQklOQVJZIik6CisgICAgICAgICAgICBtb2RlIHw9IG9zLk9fQklOQVJZCisgICAgICAgIHNlbGYuZmQgPSBvcy5vcGVuKG5hbWUsIG1vZGUsIDA2NjYpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIG9zLmNsb3NlKHNlbGYuZmQpCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIG9zLnJlYWQoc2VsZi5mZCwgc2l6ZSkKKworICAgIGRlZiB3cml0ZShzZWxmLCBzKToKKyAgICAgICAgb3Mud3JpdGUoc2VsZi5mZCwgcykKKworY2xhc3MgX1N0cmVhbToKKyAgICAiIiJDbGFzcyB0aGF0IHNlcnZlcyBhcyBhbiBhZGFwdGVyIGJldHdlZW4gVGFyRmlsZSBhbmQKKyAgICAgICBhIHN0cmVhbS1saWtlIG9iamVjdC4gIFRoZSBzdHJlYW0tbGlrZSBvYmplY3Qgb25seQorICAgICAgIG5lZWRzIHRvIGhhdmUgYSByZWFkKCkgb3Igd3JpdGUoKSBtZXRob2QgYW5kIGlzIGFjY2Vzc2VkCisgICAgICAgYmxvY2t3aXNlLiAgVXNlIG9mIGd6aXAgb3IgYnppcDIgY29tcHJlc3Npb24gaXMgcG9zc2libGUuCisgICAgICAgQSBzdHJlYW0tbGlrZSBvYmplY3QgY291bGQgYmUgZm9yIGV4YW1wbGU6IHN5cy5zdGRpbiwKKyAgICAgICBzeXMuc3Rkb3V0LCBhIHNvY2tldCwgYSB0YXBlIGRldmljZSBldGMuCisKKyAgICAgICBfU3RyZWFtIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb25seSBpbnRlcm5hbGx5LgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZGUsIGNvbXB0eXBlLCBmaWxlb2JqLCBidWZzaXplKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgX1N0cmVhbSBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9leHRmaWxlb2JqID0gVHJ1ZQorICAgICAgICBpZiBmaWxlb2JqIGlzIE5vbmU6CisgICAgICAgICAgICBmaWxlb2JqID0gX0xvd0xldmVsRmlsZShuYW1lLCBtb2RlKQorICAgICAgICAgICAgc2VsZi5fZXh0ZmlsZW9iaiA9IEZhbHNlCisKKyAgICAgICAgaWYgY29tcHR5cGUgPT0gJyonOgorICAgICAgICAgICAgIyBFbmFibGUgdHJhbnNwYXJlbnQgY29tcHJlc3Npb24gZGV0ZWN0aW9uIGZvciB0aGUKKyAgICAgICAgICAgICMgc3RyZWFtIGludGVyZmFjZQorICAgICAgICAgICAgZmlsZW9iaiA9IF9TdHJlYW1Qcm94eShmaWxlb2JqKQorICAgICAgICAgICAgY29tcHR5cGUgPSBmaWxlb2JqLmdldGNvbXB0eXBlKCkKKworICAgICAgICBzZWxmLm5hbWUgICAgID0gbmFtZSBvciAiIgorICAgICAgICBzZWxmLm1vZGUgICAgID0gbW9kZQorICAgICAgICBzZWxmLmNvbXB0eXBlID0gY29tcHR5cGUKKyAgICAgICAgc2VsZi5maWxlb2JqICA9IGZpbGVvYmoKKyAgICAgICAgc2VsZi5idWZzaXplICA9IGJ1ZnNpemUKKyAgICAgICAgc2VsZi5idWYgICAgICA9ICIiCisgICAgICAgIHNlbGYucG9zICAgICAgPSAwTAorICAgICAgICBzZWxmLmNsb3NlZCAgID0gRmFsc2UKKworICAgICAgICBpZiBjb21wdHlwZSA9PSAiZ3oiOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCB6bGliCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigiemxpYiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIpCisgICAgICAgICAgICBzZWxmLnpsaWIgPSB6bGliCisgICAgICAgICAgICBzZWxmLmNyYyA9IHpsaWIuY3JjMzIoIiIpICYgMHhmZmZmZmZmZkwKKyAgICAgICAgICAgIGlmIG1vZGUgPT0gInIiOgorICAgICAgICAgICAgICAgIHNlbGYuX2luaXRfcmVhZF9neigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2luaXRfd3JpdGVfZ3ooKQorCisgICAgICAgIGlmIGNvbXB0eXBlID09ICJiejIiOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBiejIKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJiejIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQorICAgICAgICAgICAgaWYgbW9kZSA9PSAiciI6CisgICAgICAgICAgICAgICAgc2VsZi5kYnVmID0gIiIKKyAgICAgICAgICAgICAgICBzZWxmLmNtcCA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmNtcCA9IGJ6Mi5CWjJDb21wcmVzc29yKCkKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICJjbG9zZWQiKSBhbmQgbm90IHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgX2luaXRfd3JpdGVfZ3ooc2VsZik6CisgICAgICAgICIiIkluaXRpYWxpemUgZm9yIHdyaXRpbmcgd2l0aCBnemlwIGNvbXByZXNzaW9uLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jbXAgPSBzZWxmLnpsaWIuY29tcHJlc3NvYmooOSwgc2VsZi56bGliLkRFRkxBVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi56bGliLk1BWF9XQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi56bGliLkRFRl9NRU1fTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgICAgIHRpbWVzdGFtcCA9IHN0cnVjdC5wYWNrKCI8TCIsIGxvbmcodGltZS50aW1lKCkpKQorICAgICAgICBzZWxmLl9fd3JpdGUoIlwwMzdcMjEzXDAxMFwwMTAlc1wwMDJcMzc3IiAlIHRpbWVzdGFtcCkKKyAgICAgICAgaWYgdHlwZShzZWxmLm5hbWUpIGlzIHVuaWNvZGU6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSBzZWxmLm5hbWUuZW5jb2RlKCJpc28tODg1OS0xIiwgInJlcGxhY2UiKQorICAgICAgICBpZiBzZWxmLm5hbWUuZW5kc3dpdGgoIi5neiIpOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gc2VsZi5uYW1lWzotM10KKyAgICAgICAgc2VsZi5fX3dyaXRlKHNlbGYubmFtZSArIE5VTCkKKworICAgIGRlZiB3cml0ZShzZWxmLCBzKToKKyAgICAgICAgIiIiV3JpdGUgc3RyaW5nIHMgdG8gdGhlIHN0cmVhbS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY29tcHR5cGUgPT0gImd6IjoKKyAgICAgICAgICAgIHNlbGYuY3JjID0gc2VsZi56bGliLmNyYzMyKHMsIHNlbGYuY3JjKSAmIDB4ZmZmZmZmZmZMCisgICAgICAgIHNlbGYucG9zICs9IGxlbihzKQorICAgICAgICBpZiBzZWxmLmNvbXB0eXBlICE9ICJ0YXIiOgorICAgICAgICAgICAgcyA9IHNlbGYuY21wLmNvbXByZXNzKHMpCisgICAgICAgIHNlbGYuX193cml0ZShzKQorCisgICAgZGVmIF9fd3JpdGUoc2VsZiwgcyk6CisgICAgICAgICIiIldyaXRlIHN0cmluZyBzIHRvIHRoZSBzdHJlYW0gaWYgYSB3aG9sZSBuZXcgYmxvY2sKKyAgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgd3JpdHRlbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYnVmICs9IHMKKyAgICAgICAgd2hpbGUgbGVuKHNlbGYuYnVmKSA+IHNlbGYuYnVmc2l6ZToKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzZWxmLmJ1Zls6c2VsZi5idWZzaXplXSkKKyAgICAgICAgICAgIHNlbGYuYnVmID0gc2VsZi5idWZbc2VsZi5idWZzaXplOl0KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIF9TdHJlYW0gb2JqZWN0LiBObyBvcGVyYXRpb24gc2hvdWxkIGJlCisgICAgICAgICAgIGRvbmUgb24gaXQgYWZ0ZXJ3YXJkcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2VsZi5tb2RlID09ICJ3IiBhbmQgc2VsZi5jb21wdHlwZSAhPSAidGFyIjoKKyAgICAgICAgICAgIHNlbGYuYnVmICs9IHNlbGYuY21wLmZsdXNoKCkKKworICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInciIGFuZCBzZWxmLmJ1ZjoKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzZWxmLmJ1ZikKKyAgICAgICAgICAgIHNlbGYuYnVmID0gIiIKKyAgICAgICAgICAgIGlmIHNlbGYuY29tcHR5cGUgPT0gImd6IjoKKyAgICAgICAgICAgICAgICAjIFRoZSBuYXRpdmUgemxpYiBjcmMgaXMgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIsIGJ1dAorICAgICAgICAgICAgICAgICMgdGhlIFB5dGhvbiB3cmFwcGVyIGltcGxpY2l0bHkgY2FzdHMgdGhhdCB0byBhIHNpZ25lZCBDCisgICAgICAgICAgICAgICAgIyBsb25nLiAgU28sIG9uIGEgMzItYml0IGJveCBzZWxmLmNyYyBtYXkgImxvb2sgbmVnYXRpdmUiLAorICAgICAgICAgICAgICAgICMgd2hpbGUgdGhlIHNhbWUgY3JjIG9uIGEgNjQtYml0IGJveCBtYXkgImxvb2sgcG9zaXRpdmUiLgorICAgICAgICAgICAgICAgICMgVG8gYXZvaWQgaXJrc29tZSB3YXJuaW5ncyBmcm9tIHRoZSBgc3RydWN0YCBtb2R1bGUsIGZvcmNlCisgICAgICAgICAgICAgICAgIyBpdCB0byBsb29rIHBvc2l0aXZlIG9uIGFsbCBib3hlcy4KKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc3RydWN0LnBhY2soIjxMIiwgc2VsZi5jcmMgJiAweGZmZmZmZmZmTCkpCisgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHN0cnVjdC5wYWNrKCI8TCIsIHNlbGYucG9zICYgMHhmZmZmRkZGRkwpKQorCisgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgorICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKKworICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKKworICAgIGRlZiBfaW5pdF9yZWFkX2d6KHNlbGYpOgorICAgICAgICAiIiJJbml0aWFsaXplIGZvciByZWFkaW5nIGEgZ3ppcCBjb21wcmVzc2VkIGZpbGVvYmouCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNtcCA9IHNlbGYuemxpYi5kZWNvbXByZXNzb2JqKC1zZWxmLnpsaWIuTUFYX1dCSVRTKQorICAgICAgICBzZWxmLmRidWYgPSAiIgorCisgICAgICAgICMgdGFrZW4gZnJvbSBnemlwLkd6aXBGaWxlIHdpdGggc29tZSBhbHRlcmF0aW9ucworICAgICAgICBpZiBzZWxmLl9fcmVhZCgyKSAhPSAiXDAzN1wyMTMiOgorICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBnemlwIGZpbGUiKQorICAgICAgICBpZiBzZWxmLl9fcmVhZCgxKSAhPSAiXDAxMCI6CisgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJ1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiBtZXRob2QiKQorCisgICAgICAgIGZsYWcgPSBvcmQoc2VsZi5fX3JlYWQoMSkpCisgICAgICAgIHNlbGYuX19yZWFkKDYpCisKKyAgICAgICAgaWYgZmxhZyAmIDQ6CisgICAgICAgICAgICB4bGVuID0gb3JkKHNlbGYuX19yZWFkKDEpKSArIDI1NiAqIG9yZChzZWxmLl9fcmVhZCgxKSkKKyAgICAgICAgICAgIHNlbGYucmVhZCh4bGVuKQorICAgICAgICBpZiBmbGFnICYgODoKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYuX19yZWFkKDEpCisgICAgICAgICAgICAgICAgaWYgbm90IHMgb3IgcyA9PSBOVUw6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGZsYWcgJiAxNjoKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYuX19yZWFkKDEpCisgICAgICAgICAgICAgICAgaWYgbm90IHMgb3IgcyA9PSBOVUw6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGZsYWcgJiAyOgorICAgICAgICAgICAgc2VsZi5fX3JlYWQoMikKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHN0cmVhbSdzIGZpbGUgcG9pbnRlciBwb3NpdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnBvcworCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zPTApOgorICAgICAgICAiIiJTZXQgdGhlIHN0cmVhbSdzIGZpbGUgcG9pbnRlciB0byBwb3MuIE5lZ2F0aXZlIHNlZWtpbmcKKyAgICAgICAgICAgaXMgZm9yYmlkZGVuLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgcG9zIC0gc2VsZi5wb3MgPj0gMDoKKyAgICAgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKHBvcyAtIHNlbGYucG9zLCBzZWxmLmJ1ZnNpemUpCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoYmxvY2tzKToKKyAgICAgICAgICAgICAgICBzZWxmLnJlYWQoc2VsZi5idWZzaXplKQorICAgICAgICAgICAgc2VsZi5yZWFkKHJlbWFpbmRlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFN0cmVhbUVycm9yKCJzZWVraW5nIGJhY2t3YXJkcyBpcyBub3QgYWxsb3dlZCIpCisgICAgICAgIHJldHVybiBzZWxmLnBvcworCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IHNpemUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KKyAgICAgICAgICAgSWYgc2l6ZSBpcyBub3QgZGVmaW5lZCwgcmV0dXJuIGFsbCBieXRlcyBvZiB0aGUgc3RyZWFtCisgICAgICAgICAgIHVwIHRvIEVPRi4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHQgPSBbXQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBidWYgPSBzZWxmLl9yZWFkKHNlbGYuYnVmc2l6ZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHQuYXBwZW5kKGJ1ZikKKyAgICAgICAgICAgIGJ1ZiA9ICIiLmpvaW4odCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX3JlYWQoc2l6ZSkKKyAgICAgICAgc2VsZi5wb3MgKz0gbGVuKGJ1ZikKKyAgICAgICAgcmV0dXJuIGJ1ZgorCisgICAgZGVmIF9yZWFkKHNlbGYsIHNpemUpOgorICAgICAgICAiIiJSZXR1cm4gc2l6ZSBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNvbXB0eXBlID09ICJ0YXIiOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19yZWFkKHNpemUpCisKKyAgICAgICAgYyA9IGxlbihzZWxmLmRidWYpCisgICAgICAgIHQgPSBbc2VsZi5kYnVmXQorICAgICAgICB3aGlsZSBjIDwgc2l6ZToKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX19yZWFkKHNlbGYuYnVmc2l6ZSkKKyAgICAgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmNtcC5kZWNvbXByZXNzKGJ1ZikKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigiaW52YWxpZCBjb21wcmVzc2VkIGRhdGEiKQorICAgICAgICAgICAgdC5hcHBlbmQoYnVmKQorICAgICAgICAgICAgYyArPSBsZW4oYnVmKQorICAgICAgICB0ID0gIiIuam9pbih0KQorICAgICAgICBzZWxmLmRidWYgPSB0W3NpemU6XQorICAgICAgICByZXR1cm4gdFs6c2l6ZV0KKworICAgIGRlZiBfX3JlYWQoc2VsZiwgc2l6ZSk6CisgICAgICAgICIiIlJldHVybiBzaXplIGJ5dGVzIGZyb20gc3RyZWFtLiBJZiBpbnRlcm5hbCBidWZmZXIgaXMgZW1wdHksCisgICAgICAgICAgIHJlYWQgYW5vdGhlciBibG9jayBmcm9tIHRoZSBzdHJlYW0uCisgICAgICAgICIiIgorICAgICAgICBjID0gbGVuKHNlbGYuYnVmKQorICAgICAgICB0ID0gW3NlbGYuYnVmXQorICAgICAgICB3aGlsZSBjIDwgc2l6ZToKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKHNlbGYuYnVmc2l6ZSkKKyAgICAgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHQuYXBwZW5kKGJ1ZikKKyAgICAgICAgICAgIGMgKz0gbGVuKGJ1ZikKKyAgICAgICAgdCA9ICIiLmpvaW4odCkKKyAgICAgICAgc2VsZi5idWYgPSB0W3NpemU6XQorICAgICAgICByZXR1cm4gdFs6c2l6ZV0KKyMgY2xhc3MgX1N0cmVhbQorCitjbGFzcyBfU3RyZWFtUHJveHkob2JqZWN0KToKKyAgICAiIiJTbWFsbCBwcm94eSBjbGFzcyB0aGF0IGVuYWJsZXMgdHJhbnNwYXJlbnQgY29tcHJlc3Npb24KKyAgICAgICBkZXRlY3Rpb24gZm9yIHRoZSBTdHJlYW0gaW50ZXJmYWNlIChtb2RlICdyfConKS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqKToKKyAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagorICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLnJlYWQgPSBzZWxmLmZpbGVvYmoucmVhZAorICAgICAgICByZXR1cm4gc2VsZi5idWYKKworICAgIGRlZiBnZXRjb21wdHlwZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5idWYuc3RhcnRzd2l0aCgiXDAzN1wyMTNcMDEwIik6CisgICAgICAgICAgICByZXR1cm4gImd6IgorICAgICAgICBpZiBzZWxmLmJ1ZlswOjNdID09ICJCWmgiIGFuZCBzZWxmLmJ1Zls0OjEwXSA9PSAiMUFZJlNZIjoKKyAgICAgICAgICAgIHJldHVybiAiYnoyIgorICAgICAgICByZXR1cm4gInRhciIKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKKyMgY2xhc3MgU3RyZWFtUHJveHkKKworY2xhc3MgX0JaMlByb3h5KG9iamVjdCk6CisgICAgIiIiU21hbGwgcHJveHkgY2xhc3MgdGhhdCBlbmFibGVzIGV4dGVybmFsIGZpbGUgb2JqZWN0CisgICAgICAgc3VwcG9ydCBmb3IgInI6YnoyIiBhbmQgInc6YnoyIiBtb2Rlcy4gVGhpcyBpcyBhY3R1YWxseQorICAgICAgIGEgd29ya2Fyb3VuZCBmb3IgYSBsaW1pdGF0aW9uIGluIGJ6MiBtb2R1bGUncyBCWjJGaWxlCisgICAgICAgY2xhc3Mgd2hpY2ggKHVubGlrZSBnemlwLkd6aXBGaWxlKSBoYXMgbm8gc3VwcG9ydCBmb3IKKyAgICAgICBhIGZpbGUgb2JqZWN0IGFyZ3VtZW50LgorICAgICIiIgorCisgICAgYmxvY2tzaXplID0gMTYgKiAxMDI0CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaiwgbW9kZSk6CisgICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKKyAgICAgICAgc2VsZi5tb2RlID0gbW9kZQorICAgICAgICBzZWxmLm5hbWUgPSBnZXRhdHRyKHNlbGYuZmlsZW9iaiwgIm5hbWUiLCBOb25lKQorICAgICAgICBzZWxmLmluaXQoKQorCisgICAgZGVmIGluaXQoc2VsZik6CisgICAgICAgIGltcG9ydCBiejIKKyAgICAgICAgc2VsZi5wb3MgPSAwCisgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiciI6CisgICAgICAgICAgICBzZWxmLmJ6Mm9iaiA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQorICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYnVmID0gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYnoyb2JqID0gYnoyLkJaMkNvbXByZXNzb3IoKQorCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6CisgICAgICAgIGIgPSBbc2VsZi5idWZdCisgICAgICAgIHggPSBsZW4oc2VsZi5idWYpCisgICAgICAgIHdoaWxlIHggPCBzaXplOgorICAgICAgICAgICAgcmF3ID0gc2VsZi5maWxlb2JqLnJlYWQoc2VsZi5ibG9ja3NpemUpCisgICAgICAgICAgICBpZiBub3QgcmF3OgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBkYXRhID0gc2VsZi5iejJvYmouZGVjb21wcmVzcyhyYXcpCisgICAgICAgICAgICBiLmFwcGVuZChkYXRhKQorICAgICAgICAgICAgeCArPSBsZW4oZGF0YSkKKyAgICAgICAgc2VsZi5idWYgPSAiIi5qb2luKGIpCisKKyAgICAgICAgYnVmID0gc2VsZi5idWZbOnNpemVdCisgICAgICAgIHNlbGYuYnVmID0gc2VsZi5idWZbc2l6ZTpdCisgICAgICAgIHNlbGYucG9zICs9IGxlbihidWYpCisgICAgICAgIHJldHVybiBidWYKKworICAgIGRlZiBzZWVrKHNlbGYsIHBvcyk6CisgICAgICAgIGlmIHBvcyA8IHNlbGYucG9zOgorICAgICAgICAgICAgc2VsZi5pbml0KCkKKyAgICAgICAgc2VsZi5yZWFkKHBvcyAtIHNlbGYucG9zKQorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBvcworCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnBvcyArPSBsZW4oZGF0YSkKKyAgICAgICAgcmF3ID0gc2VsZi5iejJvYmouY29tcHJlc3MoZGF0YSkKKyAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHJhdykKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5tb2RlID09ICJ3IjoKKyAgICAgICAgICAgIHJhdyA9IHNlbGYuYnoyb2JqLmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShyYXcpCisjIGNsYXNzIF9CWjJQcm94eQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4dHJhY3Rpb24gZmlsZSBvYmplY3QKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NsYXNzIF9GaWxlSW5GaWxlKG9iamVjdCk6CisgICAgIiIiQSB0aGluIHdyYXBwZXIgYXJvdW5kIGFuIGV4aXN0aW5nIGZpbGUgb2JqZWN0IHRoYXQKKyAgICAgICBwcm92aWRlcyBhIHBhcnQgb2YgaXRzIGRhdGEgYXMgYW4gaW5kaXZpZHVhbCBmaWxlCisgICAgICAgb2JqZWN0LgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmosIG9mZnNldCwgc2l6ZSwgc3BhcnNlPU5vbmUpOgorICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCisgICAgICAgIHNlbGYub2Zmc2V0ID0gb2Zmc2V0CisgICAgICAgIHNlbGYuc2l6ZSA9IHNpemUKKyAgICAgICAgc2VsZi5zcGFyc2UgPSBzcGFyc2UKKyAgICAgICAgc2VsZi5wb3NpdGlvbiA9IDAKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnBvc2l0aW9uCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3NpdGlvbik6CisgICAgICAgICIiIlNlZWsgdG8gYSBwb3NpdGlvbiBpbiB0aGUgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucG9zaXRpb24gPSBwb3NpdGlvbgorCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT1Ob25lKToKKyAgICAgICAgIiIiUmVhZCBkYXRhIGZyb20gdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBzaXplID0gc2VsZi5zaXplIC0gc2VsZi5wb3NpdGlvbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2l6ZSA9IG1pbihzaXplLCBzZWxmLnNpemUgLSBzZWxmLnBvc2l0aW9uKQorCisgICAgICAgIGlmIHNlbGYuc3BhcnNlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZWFkbm9ybWFsKHNpemUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZWFkc3BhcnNlKHNpemUpCisKKyAgICBkZWYgcmVhZG5vcm1hbChzZWxmLCBzaXplKToKKyAgICAgICAgIiIiUmVhZCBvcGVyYXRpb24gZm9yIHJlZ3VsYXIgZmlsZXMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCArIHNlbGYucG9zaXRpb24pCisgICAgICAgIHNlbGYucG9zaXRpb24gKz0gc2l6ZQorICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqLnJlYWQoc2l6ZSkKKworICAgIGRlZiByZWFkc3BhcnNlKHNlbGYsIHNpemUpOgorICAgICAgICAiIiJSZWFkIG9wZXJhdGlvbiBmb3Igc3BhcnNlIGZpbGVzLgorICAgICAgICAiIiIKKyAgICAgICAgZGF0YSA9IFtdCisgICAgICAgIHdoaWxlIHNpemUgPiAwOgorICAgICAgICAgICAgYnVmID0gc2VsZi5yZWFkc3BhcnNlc2VjdGlvbihzaXplKQorICAgICAgICAgICAgaWYgbm90IGJ1ZjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2l6ZSAtPSBsZW4oYnVmKQorICAgICAgICAgICAgZGF0YS5hcHBlbmQoYnVmKQorICAgICAgICByZXR1cm4gIiIuam9pbihkYXRhKQorCisgICAgZGVmIHJlYWRzcGFyc2VzZWN0aW9uKHNlbGYsIHNpemUpOgorICAgICAgICAiIiJSZWFkIGEgc2luZ2xlIHNlY3Rpb24gb2YgYSBzcGFyc2UgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlY3Rpb24gPSBzZWxmLnNwYXJzZS5maW5kKHNlbGYucG9zaXRpb24pCisKKyAgICAgICAgaWYgc2VjdGlvbiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICIiCisKKyAgICAgICAgc2l6ZSA9IG1pbihzaXplLCBzZWN0aW9uLm9mZnNldCArIHNlY3Rpb24uc2l6ZSAtIHNlbGYucG9zaXRpb24pCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWN0aW9uLCBfZGF0YSk6CisgICAgICAgICAgICByZWFscG9zID0gc2VjdGlvbi5yZWFscG9zICsgc2VsZi5wb3NpdGlvbiAtIHNlY3Rpb24ub2Zmc2V0CisgICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCArIHJlYWxwb3MpCisgICAgICAgICAgICBzZWxmLnBvc2l0aW9uICs9IHNpemUKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmoucmVhZChzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiArPSBzaXplCisgICAgICAgICAgICByZXR1cm4gTlVMICogc2l6ZQorI2NsYXNzIF9GaWxlSW5GaWxlCisKKworY2xhc3MgRXhGaWxlT2JqZWN0KG9iamVjdCk6CisgICAgIiIiRmlsZS1saWtlIG9iamVjdCBmb3IgcmVhZGluZyBhbiBhcmNoaXZlIG1lbWJlci4KKyAgICAgICBJcyByZXR1cm5lZCBieSBUYXJGaWxlLmV4dHJhY3RmaWxlKCkuCisgICAgIiIiCisgICAgYmxvY2tzaXplID0gMTAyNAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmZpbGUsIHRhcmluZm8pOgorICAgICAgICBzZWxmLmZpbGVvYmogPSBfRmlsZUluRmlsZSh0YXJmaWxlLmZpbGVvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8ub2Zmc2V0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cih0YXJpbmZvLCAic3BhcnNlIiwgTm9uZSkpCisgICAgICAgIHNlbGYubmFtZSA9IHRhcmluZm8ubmFtZQorICAgICAgICBzZWxmLm1vZGUgPSAiciIKKyAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQorICAgICAgICBzZWxmLnNpemUgPSB0YXJpbmZvLnNpemUKKworICAgICAgICBzZWxmLnBvc2l0aW9uID0gMAorICAgICAgICBzZWxmLmJ1ZmZlciA9ICIiCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplPU5vbmUpOgorICAgICAgICAiIiJSZWFkIGF0IG1vc3Qgc2l6ZSBieXRlcyBmcm9tIHRoZSBmaWxlLiBJZiBzaXplIGlzIG5vdAorICAgICAgICAgICBwcmVzZW50IG9yIE5vbmUsIHJlYWQgYWxsIGRhdGEgdW50aWwgRU9GIGlzIHJlYWNoZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKQorCisgICAgICAgIGJ1ZiA9ICIiCisgICAgICAgIGlmIHNlbGYuYnVmZmVyOgorICAgICAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuYnVmZmVyCisgICAgICAgICAgICAgICAgc2VsZi5idWZmZXIgPSAiIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmJ1ZmZlcls6c2l6ZV0KKyAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IHNlbGYuYnVmZmVyW3NpemU6XQorCisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIGJ1ZiArPSBzZWxmLmZpbGVvYmoucmVhZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBidWYgKz0gc2VsZi5maWxlb2JqLnJlYWQoc2l6ZSAtIGxlbihidWYpKQorCisgICAgICAgIHNlbGYucG9zaXRpb24gKz0gbGVuKGJ1ZikKKyAgICAgICAgcmV0dXJuIGJ1ZgorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9LTEpOgorICAgICAgICAiIiJSZWFkIG9uZSBlbnRpcmUgbGluZSBmcm9tIHRoZSBmaWxlLiBJZiBzaXplIGlzIHByZXNlbnQKKyAgICAgICAgICAgYW5kIG5vbi1uZWdhdGl2ZSwgcmV0dXJuIGEgc3RyaW5nIHdpdGggYXQgbW9zdCB0aGF0CisgICAgICAgICAgIHNpemUsIHdoaWNoIG1heSBiZSBhbiBpbmNvbXBsZXRlIGxpbmUuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKQorCisgICAgICAgIGlmICJcbiIgaW4gc2VsZi5idWZmZXI6CisgICAgICAgICAgICBwb3MgPSBzZWxmLmJ1ZmZlci5maW5kKCJcbiIpICsgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnVmZmVycyA9IFtzZWxmLmJ1ZmZlcl0KKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoc2VsZi5ibG9ja3NpemUpCisgICAgICAgICAgICAgICAgYnVmZmVycy5hcHBlbmQoYnVmKQorICAgICAgICAgICAgICAgIGlmIG5vdCBidWYgb3IgIlxuIiBpbiBidWY6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gIiIuam9pbihidWZmZXJzKQorICAgICAgICAgICAgICAgICAgICBwb3MgPSBzZWxmLmJ1ZmZlci5maW5kKCJcbiIpICsgMQorICAgICAgICAgICAgICAgICAgICBpZiBwb3MgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gbmV3bGluZSBmb3VuZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGxlbihzZWxmLmJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBzaXplICE9IC0xOgorICAgICAgICAgICAgcG9zID0gbWluKHNpemUsIHBvcykKKworICAgICAgICBidWYgPSBzZWxmLmJ1ZmZlcls6cG9zXQorICAgICAgICBzZWxmLmJ1ZmZlciA9IHNlbGYuYnVmZmVyW3BvczpdCisgICAgICAgIHNlbGYucG9zaXRpb24gKz0gbGVuKGJ1ZikKKyAgICAgICAgcmV0dXJuIGJ1ZgorCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCB3aXRoIGFsbCByZW1haW5pbmcgbGluZXMuCisgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmUpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpCisKKyAgICAgICAgcmV0dXJuIHNlbGYucG9zaXRpb24KKworICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlPW9zLlNFRUtfU0VUKToKKyAgICAgICAgIiIiU2VlayB0byBhIHBvc2l0aW9uIGluIHRoZSBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIikKKworICAgICAgICBpZiB3aGVuY2UgPT0gb3MuU0VFS19TRVQ6CisgICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gbWluKG1heChwb3MsIDApLCBzZWxmLnNpemUpCisgICAgICAgIGVsaWYgd2hlbmNlID09IG9zLlNFRUtfQ1VSOgorICAgICAgICAgICAgaWYgcG9zIDwgMDoKKyAgICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gbWF4KHNlbGYucG9zaXRpb24gKyBwb3MsIDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtaW4oc2VsZi5wb3NpdGlvbiArIHBvcywgc2VsZi5zaXplKQorICAgICAgICBlbGlmIHdoZW5jZSA9PSBvcy5TRUVLX0VORDoKKyAgICAgICAgICAgIHNlbGYucG9zaXRpb24gPSBtYXgobWluKHNlbGYuc2l6ZSArIHBvcywgc2VsZi5zaXplKSwgMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgYXJndW1lbnQiKQorCisgICAgICAgIHNlbGYuYnVmZmVyID0gIiIKKyAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5wb3NpdGlvbikKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIGZpbGUgb2JqZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICIiIkdldCBhbiBpdGVyYXRvciBvdmVyIHRoZSBmaWxlJ3MgbGluZXMuCisgICAgICAgICIiIgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHlpZWxkIGxpbmUKKyNjbGFzcyBFeEZpbGVPYmplY3QKKworIy0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeHBvcnRlZCBDbGFzc2VzCisjLS0tLS0tLS0tLS0tLS0tLS0tCitjbGFzcyBUYXJJbmZvKG9iamVjdCk6CisgICAgIiIiSW5mb3JtYXRpb25hbCBjbGFzcyB3aGljaCBob2xkcyB0aGUgZGV0YWlscyBhYm91dCBhbgorICAgICAgIGFyY2hpdmUgbWVtYmVyIGdpdmVuIGJ5IGEgdGFyIGhlYWRlciBibG9jay4KKyAgICAgICBUYXJJbmZvIG9iamVjdHMgYXJlIHJldHVybmVkIGJ5IFRhckZpbGUuZ2V0bWVtYmVyKCksCisgICAgICAgVGFyRmlsZS5nZXRtZW1iZXJzKCkgYW5kIFRhckZpbGUuZ2V0dGFyaW5mbygpIGFuZCBhcmUKKyAgICAgICB1c3VhbGx5IGNyZWF0ZWQgaW50ZXJuYWxseS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPSIiKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVGFySW5mbyBvYmplY3QuIG5hbWUgaXMgdGhlIG9wdGlvbmFsIG5hbWUKKyAgICAgICAgICAgb2YgdGhlIG1lbWJlci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUgICAgICAgICMgbWVtYmVyIG5hbWUKKyAgICAgICAgc2VsZi5tb2RlID0gMDY0NCAgICAgICAgIyBmaWxlIHBlcm1pc3Npb25zCisgICAgICAgIHNlbGYudWlkID0gMCAgICAgICAgICAgICMgdXNlciBpZAorICAgICAgICBzZWxmLmdpZCA9IDAgICAgICAgICAgICAjIGdyb3VwIGlkCisgICAgICAgIHNlbGYuc2l6ZSA9IDAgICAgICAgICAgICMgZmlsZSBzaXplCisgICAgICAgIHNlbGYubXRpbWUgPSAwICAgICAgICAgICMgbW9kaWZpY2F0aW9uIHRpbWUKKyAgICAgICAgc2VsZi5jaGtzdW0gPSAwICAgICAgICAgIyBoZWFkZXIgY2hlY2tzdW0KKyAgICAgICAgc2VsZi50eXBlID0gUkVHVFlQRSAgICAgIyBtZW1iZXIgdHlwZQorICAgICAgICBzZWxmLmxpbmtuYW1lID0gIiIgICAgICAjIGxpbmsgbmFtZQorICAgICAgICBzZWxmLnVuYW1lID0gIiIgICAgICAgICAjIHVzZXIgbmFtZQorICAgICAgICBzZWxmLmduYW1lID0gIiIgICAgICAgICAjIGdyb3VwIG5hbWUKKyAgICAgICAgc2VsZi5kZXZtYWpvciA9IDAgICAgICAgIyBkZXZpY2UgbWFqb3IgbnVtYmVyCisgICAgICAgIHNlbGYuZGV2bWlub3IgPSAwICAgICAgICMgZGV2aWNlIG1pbm9yIG51bWJlcgorCisgICAgICAgIHNlbGYub2Zmc2V0ID0gMCAgICAgICAgICMgdGhlIHRhciBoZWFkZXIgc3RhcnRzIGhlcmUKKyAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IDAgICAgIyB0aGUgZmlsZSdzIGRhdGEgc3RhcnRzIGhlcmUKKworICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0ge30gICAjIHBheCBoZWFkZXIgaW5mb3JtYXRpb24KKworICAgICMgSW4gcGF4IGhlYWRlcnMgdGhlICJuYW1lIiBhbmQgImxpbmtuYW1lIiBmaWVsZCBhcmUgY2FsbGVkCisgICAgIyAicGF0aCIgYW5kICJsaW5rcGF0aCIuCisgICAgZGVmIF9nZXRwYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lCisgICAgZGVmIF9zZXRwYXRoKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgcGF0aCA9IHByb3BlcnR5KF9nZXRwYXRoLCBfc2V0cGF0aCkKKworICAgIGRlZiBfZ2V0bGlua3BhdGgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxpbmtuYW1lCisgICAgZGVmIF9zZXRsaW5rcGF0aChzZWxmLCBsaW5rbmFtZSk6CisgICAgICAgIHNlbGYubGlua25hbWUgPSBsaW5rbmFtZQorICAgIGxpbmtwYXRoID0gcHJvcGVydHkoX2dldGxpbmtwYXRoLCBfc2V0bGlua3BhdGgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPCVzICVyIGF0ICUjeD4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLHNlbGYubmFtZSxpZChzZWxmKSkKKworICAgIGRlZiBnZXRfaW5mbyhzZWxmLCBlbmNvZGluZywgZXJyb3JzKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBUYXJJbmZvJ3MgYXR0cmlidXRlcyBhcyBhIGRpY3Rpb25hcnkuCisgICAgICAgICIiIgorICAgICAgICBpbmZvID0geworICAgICAgICAgICAgIm5hbWUiOiAgICAgc2VsZi5uYW1lLAorICAgICAgICAgICAgIm1vZGUiOiAgICAgc2VsZi5tb2RlICYgMDc3NzcsCisgICAgICAgICAgICAidWlkIjogICAgICBzZWxmLnVpZCwKKyAgICAgICAgICAgICJnaWQiOiAgICAgIHNlbGYuZ2lkLAorICAgICAgICAgICAgInNpemUiOiAgICAgc2VsZi5zaXplLAorICAgICAgICAgICAgIm10aW1lIjogICAgc2VsZi5tdGltZSwKKyAgICAgICAgICAgICJjaGtzdW0iOiAgIHNlbGYuY2hrc3VtLAorICAgICAgICAgICAgInR5cGUiOiAgICAgc2VsZi50eXBlLAorICAgICAgICAgICAgImxpbmtuYW1lIjogc2VsZi5saW5rbmFtZSwKKyAgICAgICAgICAgICJ1bmFtZSI6ICAgIHNlbGYudW5hbWUsCisgICAgICAgICAgICAiZ25hbWUiOiAgICBzZWxmLmduYW1lLAorICAgICAgICAgICAgImRldm1ham9yIjogc2VsZi5kZXZtYWpvciwKKyAgICAgICAgICAgICJkZXZtaW5vciI6IHNlbGYuZGV2bWlub3IKKyAgICAgICAgfQorCisgICAgICAgIGlmIGluZm9bInR5cGUiXSA9PSBESVJUWVBFIGFuZCBub3QgaW5mb1sibmFtZSJdLmVuZHN3aXRoKCIvIik6CisgICAgICAgICAgICBpbmZvWyJuYW1lIl0gKz0gIi8iCisKKyAgICAgICAgZm9yIGtleSBpbiAoIm5hbWUiLCAibGlua25hbWUiLCAidW5hbWUiLCAiZ25hbWUiKToKKyAgICAgICAgICAgIGlmIHR5cGUoaW5mb1trZXldKSBpcyB1bmljb2RlOgorICAgICAgICAgICAgICAgIGluZm9ba2V5XSA9IGluZm9ba2V5XS5lbmNvZGUoZW5jb2RpbmcsIGVycm9ycykKKworICAgICAgICByZXR1cm4gaW5mbworCisgICAgZGVmIHRvYnVmKHNlbGYsIGZvcm1hdD1ERUZBVUxUX0ZPUk1BVCwgZW5jb2Rpbmc9RU5DT0RJTkcsIGVycm9ycz0ic3RyaWN0Iik6CisgICAgICAgICIiIlJldHVybiBhIHRhciBoZWFkZXIgYXMgYSBzdHJpbmcgb2YgNTEyIGJ5dGUgYmxvY2tzLgorICAgICAgICAiIiIKKyAgICAgICAgaW5mbyA9IHNlbGYuZ2V0X2luZm8oZW5jb2RpbmcsIGVycm9ycykKKworICAgICAgICBpZiBmb3JtYXQgPT0gVVNUQVJfRk9STUFUOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX3VzdGFyX2hlYWRlcihpbmZvKQorICAgICAgICBlbGlmIGZvcm1hdCA9PSBHTlVfRk9STUFUOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX2dudV9oZWFkZXIoaW5mbykKKyAgICAgICAgZWxpZiBmb3JtYXQgPT0gUEFYX0ZPUk1BVDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV9wYXhfaGVhZGVyKGluZm8sIGVuY29kaW5nLCBlcnJvcnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGZvcm1hdCIpCisKKyAgICBkZWYgY3JlYXRlX3VzdGFyX2hlYWRlcihzZWxmLCBpbmZvKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSB1c3RhciBoZWFkZXIgYmxvY2suCisgICAgICAgICIiIgorICAgICAgICBpbmZvWyJtYWdpYyJdID0gUE9TSVhfTUFHSUMKKworICAgICAgICBpZiBsZW4oaW5mb1sibGlua25hbWUiXSkgPiBMRU5HVEhfTElOSzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImxpbmtuYW1lIGlzIHRvbyBsb25nIikKKworICAgICAgICBpZiBsZW4oaW5mb1sibmFtZSJdKSA+IExFTkdUSF9OQU1FOgorICAgICAgICAgICAgaW5mb1sicHJlZml4Il0sIGluZm9bIm5hbWUiXSA9IHNlbGYuX3Bvc2l4X3NwbGl0X25hbWUoaW5mb1sibmFtZSJdKQorCisgICAgICAgIHJldHVybiBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCkKKworICAgIGRlZiBjcmVhdGVfZ251X2hlYWRlcihzZWxmLCBpbmZvKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSBHTlUgaGVhZGVyIGJsb2NrIHNlcXVlbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgaW5mb1sibWFnaWMiXSA9IEdOVV9NQUdJQworCisgICAgICAgIGJ1ZiA9ICIiCisgICAgICAgIGlmIGxlbihpbmZvWyJsaW5rbmFtZSJdKSA+IExFTkdUSF9MSU5LOgorICAgICAgICAgICAgYnVmICs9IHNlbGYuX2NyZWF0ZV9nbnVfbG9uZ19oZWFkZXIoaW5mb1sibGlua25hbWUiXSwgR05VVFlQRV9MT05HTElOSykKKworICAgICAgICBpZiBsZW4oaW5mb1sibmFtZSJdKSA+IExFTkdUSF9OQU1FOgorICAgICAgICAgICAgYnVmICs9IHNlbGYuX2NyZWF0ZV9nbnVfbG9uZ19oZWFkZXIoaW5mb1sibmFtZSJdLCBHTlVUWVBFX0xPTkdOQU1FKQorCisgICAgICAgIHJldHVybiBidWYgKyBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIEdOVV9GT1JNQVQpCisKKyAgICBkZWYgY3JlYXRlX3BheF9oZWFkZXIoc2VsZiwgaW5mbywgZW5jb2RpbmcsIGVycm9ycyk6CisgICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgdXN0YXIgaGVhZGVyIGJsb2NrLiBJZiBpdCBjYW5ub3QgYmUKKyAgICAgICAgICAgcmVwcmVzZW50ZWQgdGhpcyB3YXksIHByZXBlbmQgYSBwYXggZXh0ZW5kZWQgaGVhZGVyIHNlcXVlbmNlCisgICAgICAgICAgIHdpdGggc3VwcGxlbWVudCBpbmZvcm1hdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQworICAgICAgICBwYXhfaGVhZGVycyA9IHNlbGYucGF4X2hlYWRlcnMuY29weSgpCisKKyAgICAgICAgIyBUZXN0IHN0cmluZyBmaWVsZHMgZm9yIHZhbHVlcyB0aGF0IGV4Y2VlZCB0aGUgZmllbGQgbGVuZ3RoIG9yIGNhbm5vdAorICAgICAgICAjIGJlIHJlcHJlc2VudGVkIGluIEFTQ0lJIGVuY29kaW5nLgorICAgICAgICBmb3IgbmFtZSwgaG5hbWUsIGxlbmd0aCBpbiAoCisgICAgICAgICAgICAgICAgKCJuYW1lIiwgInBhdGgiLCBMRU5HVEhfTkFNRSksICgibGlua25hbWUiLCAibGlua3BhdGgiLCBMRU5HVEhfTElOSyksCisgICAgICAgICAgICAgICAgKCJ1bmFtZSIsICJ1bmFtZSIsIDMyKSwgKCJnbmFtZSIsICJnbmFtZSIsIDMyKSk6CisKKyAgICAgICAgICAgIGlmIGhuYW1lIGluIHBheF9oZWFkZXJzOgorICAgICAgICAgICAgICAgICMgVGhlIHBheCBoZWFkZXIgaGFzIHByaW9yaXR5LgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHZhbCA9IGluZm9bbmFtZV0uZGVjb2RlKGVuY29kaW5nLCBlcnJvcnMpCisKKyAgICAgICAgICAgICMgVHJ5IHRvIGVuY29kZSB0aGUgc3RyaW5nIGFzIEFTQ0lJLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbC5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbaG5hbWVdID0gdmFsCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgbGVuKGluZm9bbmFtZV0pID4gbGVuZ3RoOgorICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW2huYW1lXSA9IHZhbAorCisgICAgICAgICMgVGVzdCBudW1iZXIgZmllbGRzIGZvciB2YWx1ZXMgdGhhdCBleGNlZWQgdGhlIGZpZWxkIGxpbWl0IG9yIHZhbHVlcworICAgICAgICAjIHRoYXQgbGlrZSB0byBiZSBzdG9yZWQgYXMgZmxvYXQuCisgICAgICAgIGZvciBuYW1lLCBkaWdpdHMgaW4gKCgidWlkIiwgOCksICgiZ2lkIiwgOCksICgic2l6ZSIsIDEyKSwgKCJtdGltZSIsIDEyKSk6CisgICAgICAgICAgICBpZiBuYW1lIGluIHBheF9oZWFkZXJzOgorICAgICAgICAgICAgICAgICMgVGhlIHBheCBoZWFkZXIgaGFzIHByaW9yaXR5LiBBdm9pZCBvdmVyZmxvdy4KKyAgICAgICAgICAgICAgICBpbmZvW25hbWVdID0gMAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHZhbCA9IGluZm9bbmFtZV0KKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IHZhbCA8IDggKiogKGRpZ2l0cyAtIDEpIG9yIGlzaW5zdGFuY2UodmFsLCBmbG9hdCk6CisgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbbmFtZV0gPSB1bmljb2RlKHZhbCkKKyAgICAgICAgICAgICAgICBpbmZvW25hbWVdID0gMAorCisgICAgICAgICMgQ3JlYXRlIGEgcGF4IGV4dGVuZGVkIGhlYWRlciBpZiBuZWNlc3NhcnkuCisgICAgICAgIGlmIHBheF9oZWFkZXJzOgorICAgICAgICAgICAgYnVmID0gc2VsZi5fY3JlYXRlX3BheF9nZW5lcmljX2hlYWRlcihwYXhfaGVhZGVycykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJ1ZiA9ICIiCisKKyAgICAgICAgcmV0dXJuIGJ1ZiArIHNlbGYuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFUKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGNyZWF0ZV9wYXhfZ2xvYmFsX2hlYWRlcihjbHMsIHBheF9oZWFkZXJzKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSBwYXggZ2xvYmFsIGhlYWRlciBibG9jayBzZXF1ZW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIocGF4X2hlYWRlcnMsIHR5cGU9WEdMVFlQRSkKKworICAgIGRlZiBfcG9zaXhfc3BsaXRfbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiU3BsaXQgYSBuYW1lIGxvbmdlciB0aGFuIDEwMCBjaGFycyBpbnRvIGEgcHJlZml4CisgICAgICAgICAgIGFuZCBhIG5hbWUgcGFydC4KKyAgICAgICAgIiIiCisgICAgICAgIHByZWZpeCA9IG5hbWVbOkxFTkdUSF9QUkVGSVggKyAxXQorICAgICAgICB3aGlsZSBwcmVmaXggYW5kIHByZWZpeFstMV0gIT0gIi8iOgorICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KKworICAgICAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KTpdCisgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCisKKyAgICAgICAgaWYgbm90IHByZWZpeCBvciBsZW4obmFtZSkgPiBMRU5HVEhfTkFNRToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5hbWUgaXMgdG9vIGxvbmciKQorICAgICAgICByZXR1cm4gcHJlZml4LCBuYW1lCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9jcmVhdGVfaGVhZGVyKGluZm8sIGZvcm1hdCk6CisgICAgICAgICIiIlJldHVybiBhIGhlYWRlciBibG9jay4gaW5mbyBpcyBhIGRpY3Rpb25hcnkgd2l0aCBmaWxlCisgICAgICAgICAgIGluZm9ybWF0aW9uLCBmb3JtYXQgbXVzdCBiZSBvbmUgb2YgdGhlICpfRk9STUFUIGNvbnN0YW50cy4KKyAgICAgICAgIiIiCisgICAgICAgIHBhcnRzID0gWworICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJuYW1lIiwgIiIpLCAxMDApLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJtb2RlIiwgMCkgJiAwNzc3NywgOCwgZm9ybWF0KSwKKyAgICAgICAgICAgIGl0bihpbmZvLmdldCgidWlkIiwgMCksIDgsIGZvcm1hdCksCisgICAgICAgICAgICBpdG4oaW5mby5nZXQoImdpZCIsIDApLCA4LCBmb3JtYXQpLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJzaXplIiwgMCksIDEyLCBmb3JtYXQpLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJtdGltZSIsIDApLCAxMiwgZm9ybWF0KSwKKyAgICAgICAgICAgICIgICAgICAgICIsICMgY2hlY2tzdW0gZmllbGQKKyAgICAgICAgICAgIGluZm8uZ2V0KCJ0eXBlIiwgUkVHVFlQRSksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoImxpbmtuYW1lIiwgIiIpLCAxMDApLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJtYWdpYyIsIFBPU0lYX01BR0lDKSwgOCksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoInVuYW1lIiwgIiIpLCAzMiksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoImduYW1lIiwgIiIpLCAzMiksCisgICAgICAgICAgICBpdG4oaW5mby5nZXQoImRldm1ham9yIiwgMCksIDgsIGZvcm1hdCksCisgICAgICAgICAgICBpdG4oaW5mby5nZXQoImRldm1pbm9yIiwgMCksIDgsIGZvcm1hdCksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoInByZWZpeCIsICIiKSwgMTU1KQorICAgICAgICBdCisKKyAgICAgICAgYnVmID0gc3RydWN0LnBhY2soIiVkcyIgJSBCTE9DS1NJWkUsICIiLmpvaW4ocGFydHMpKQorICAgICAgICBjaGtzdW0gPSBjYWxjX2Noa3N1bXMoYnVmWy1CTE9DS1NJWkU6XSlbMF0KKyAgICAgICAgYnVmID0gYnVmWzotMzY0XSArICIlMDZvXDAiICUgY2hrc3VtICsgYnVmWy0zNTc6XQorICAgICAgICByZXR1cm4gYnVmCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9jcmVhdGVfcGF5bG9hZChwYXlsb2FkKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzdHJpbmcgcGF5bG9hZCBmaWxsZWQgd2l0aCB6ZXJvIGJ5dGVzCisgICAgICAgICAgIHVwIHRvIHRoZSBuZXh0IDUxMiBieXRlIGJvcmRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGxlbihwYXlsb2FkKSwgQkxPQ0tTSVpFKQorICAgICAgICBpZiByZW1haW5kZXIgPiAwOgorICAgICAgICAgICAgcGF5bG9hZCArPSAoQkxPQ0tTSVpFIC0gcmVtYWluZGVyKSAqIE5VTAorICAgICAgICByZXR1cm4gcGF5bG9hZAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGNscywgbmFtZSwgdHlwZSk6CisgICAgICAgICIiIlJldHVybiBhIEdOVVRZUEVfTE9OR05BTUUgb3IgR05VVFlQRV9MT05HTElOSyBzZXF1ZW5jZQorICAgICAgICAgICBmb3IgbmFtZS4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgKz0gTlVMCisKKyAgICAgICAgaW5mbyA9IHt9CisgICAgICAgIGluZm9bIm5hbWUiXSA9ICIuLy4vQExvbmdMaW5rIgorICAgICAgICBpbmZvWyJ0eXBlIl0gPSB0eXBlCisgICAgICAgIGluZm9bInNpemUiXSA9IGxlbihuYW1lKQorICAgICAgICBpbmZvWyJtYWdpYyJdID0gR05VX01BR0lDCisKKyAgICAgICAgIyBjcmVhdGUgZXh0ZW5kZWQgaGVhZGVyICsgbmFtZSBibG9ja3MuCisgICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFUKSArIFwKKyAgICAgICAgICAgICAgICBjbHMuX2NyZWF0ZV9wYXlsb2FkKG5hbWUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIoY2xzLCBwYXhfaGVhZGVycywgdHlwZT1YSERUWVBFKToKKyAgICAgICAgIiIiUmV0dXJuIGEgUE9TSVguMS0yMDAxIGV4dGVuZGVkIG9yIGdsb2JhbCBoZWFkZXIgc2VxdWVuY2UKKyAgICAgICAgICAgdGhhdCBjb250YWlucyBhIGxpc3Qgb2Yga2V5d29yZCwgdmFsdWUgcGFpcnMuIFRoZSB2YWx1ZXMKKyAgICAgICAgICAgbXVzdCBiZSB1bmljb2RlIG9iamVjdHMuCisgICAgICAgICIiIgorICAgICAgICByZWNvcmRzID0gW10KKyAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHBheF9oZWFkZXJzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAga2V5d29yZCA9IGtleXdvcmQuZW5jb2RlKCJ1dGY4IikKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZW5jb2RlKCJ1dGY4IikKKyAgICAgICAgICAgIGwgPSBsZW4oa2V5d29yZCkgKyBsZW4odmFsdWUpICsgMyAgICMgJyAnICsgJz0nICsgJ1xuJworICAgICAgICAgICAgbiA9IHAgPSAwCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIG4gPSBsICsgbGVuKHN0cihwKSkKKyAgICAgICAgICAgICAgICBpZiBuID09IHA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcCA9IG4KKyAgICAgICAgICAgIHJlY29yZHMuYXBwZW5kKCIlZCAlcz0lc1xuIiAlIChwLCBrZXl3b3JkLCB2YWx1ZSkpCisgICAgICAgIHJlY29yZHMgPSAiIi5qb2luKHJlY29yZHMpCisKKyAgICAgICAgIyBXZSB1c2UgYSBoYXJkY29kZWQgIi4vLi9AUGF4SGVhZGVyIiBuYW1lIGxpa2Ugc3RhciBkb2VzCisgICAgICAgICMgaW5zdGVhZCBvZiB0aGUgb25lIHRoYXQgUE9TSVggcmVjb21tZW5kcy4KKyAgICAgICAgaW5mbyA9IHt9CisgICAgICAgIGluZm9bIm5hbWUiXSA9ICIuLy4vQFBheEhlYWRlciIKKyAgICAgICAgaW5mb1sidHlwZSJdID0gdHlwZQorICAgICAgICBpbmZvWyJzaXplIl0gPSBsZW4ocmVjb3JkcykKKyAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCisKKyAgICAgICAgIyBDcmVhdGUgcGF4IGhlYWRlciArIHJlY29yZCBibG9ja3MuCisgICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFUKSArIFwKKyAgICAgICAgICAgICAgICBjbHMuX2NyZWF0ZV9wYXlsb2FkKHJlY29yZHMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbWJ1ZihjbHMsIGJ1Zik6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0IGZyb20gYSA1MTIgYnl0ZSBzdHJpbmcgYnVmZmVyLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGVuKGJ1ZikgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIEVtcHR5SGVhZGVyRXJyb3IoImVtcHR5IGhlYWRlciIpCisgICAgICAgIGlmIGxlbihidWYpICE9IEJMT0NLU0laRToKKyAgICAgICAgICAgIHJhaXNlIFRydW5jYXRlZEhlYWRlckVycm9yKCJ0cnVuY2F0ZWQgaGVhZGVyIikKKyAgICAgICAgaWYgYnVmLmNvdW50KE5VTCkgPT0gQkxPQ0tTSVpFOgorICAgICAgICAgICAgcmFpc2UgRU9GSGVhZGVyRXJyb3IoImVuZCBvZiBmaWxlIGhlYWRlciIpCisKKyAgICAgICAgY2hrc3VtID0gbnRpKGJ1ZlsxNDg6MTU2XSkKKyAgICAgICAgaWYgY2hrc3VtIG5vdCBpbiBjYWxjX2Noa3N1bXMoYnVmKToKKyAgICAgICAgICAgIHJhaXNlIEludmFsaWRIZWFkZXJFcnJvcigiYmFkIGNoZWNrc3VtIikKKworICAgICAgICBvYmogPSBjbHMoKQorICAgICAgICBvYmouYnVmID0gYnVmCisgICAgICAgIG9iai5uYW1lID0gbnRzKGJ1ZlswOjEwMF0pCisgICAgICAgIG9iai5tb2RlID0gbnRpKGJ1ZlsxMDA6MTA4XSkKKyAgICAgICAgb2JqLnVpZCA9IG50aShidWZbMTA4OjExNl0pCisgICAgICAgIG9iai5naWQgPSBudGkoYnVmWzExNjoxMjRdKQorICAgICAgICBvYmouc2l6ZSA9IG50aShidWZbMTI0OjEzNl0pCisgICAgICAgIG9iai5tdGltZSA9IG50aShidWZbMTM2OjE0OF0pCisgICAgICAgIG9iai5jaGtzdW0gPSBjaGtzdW0KKyAgICAgICAgb2JqLnR5cGUgPSBidWZbMTU2OjE1N10KKyAgICAgICAgb2JqLmxpbmtuYW1lID0gbnRzKGJ1ZlsxNTc6MjU3XSkKKyAgICAgICAgb2JqLnVuYW1lID0gbnRzKGJ1ZlsyNjU6Mjk3XSkKKyAgICAgICAgb2JqLmduYW1lID0gbnRzKGJ1ZlsyOTc6MzI5XSkKKyAgICAgICAgb2JqLmRldm1ham9yID0gbnRpKGJ1ZlszMjk6MzM3XSkKKyAgICAgICAgb2JqLmRldm1pbm9yID0gbnRpKGJ1ZlszMzc6MzQ1XSkKKyAgICAgICAgcHJlZml4ID0gbnRzKGJ1ZlszNDU6NTAwXSkKKworICAgICAgICAjIE9sZCBWNyB0YXIgZm9ybWF0IHJlcHJlc2VudHMgYSBkaXJlY3RvcnkgYXMgYSByZWd1bGFyCisgICAgICAgICMgZmlsZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2guCisgICAgICAgIGlmIG9iai50eXBlID09IEFSRUdUWVBFIGFuZCBvYmoubmFtZS5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgb2JqLnR5cGUgPSBESVJUWVBFCisKKyAgICAgICAgIyBSZW1vdmUgcmVkdW5kYW50IHNsYXNoZXMgZnJvbSBkaXJlY3Rvcmllcy4KKyAgICAgICAgaWYgb2JqLmlzZGlyKCk6CisgICAgICAgICAgICBvYmoubmFtZSA9IG9iai5uYW1lLnJzdHJpcCgiLyIpCisKKyAgICAgICAgIyBSZWNvbnN0cnVjdCBhIHVzdGFyIGxvbmduYW1lLgorICAgICAgICBpZiBwcmVmaXggYW5kIG9iai50eXBlIG5vdCBpbiBHTlVfVFlQRVM6CisgICAgICAgICAgICBvYmoubmFtZSA9IHByZWZpeCArICIvIiArIG9iai5uYW1lCisgICAgICAgIHJldHVybiBvYmoKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tdGFyZmlsZShjbHMsIHRhcmZpbGUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgVGFySW5mbyBvYmplY3QgZnJvbSBUYXJGaWxlIG9iamVjdAorICAgICAgICAgICB0YXJmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgYnVmID0gdGFyZmlsZS5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQorICAgICAgICBvYmogPSBjbHMuZnJvbWJ1ZihidWYpCisgICAgICAgIG9iai5vZmZzZXQgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpIC0gQkxPQ0tTSVpFCisgICAgICAgIHJldHVybiBvYmouX3Byb2NfbWVtYmVyKHRhcmZpbGUpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRoZSBmb2xsb3dpbmcgYXJlIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBhCisgICAgIyBtZW1iZXIuIFRoZSBlbnRyeSBwb2ludCBpcyBfcHJvY19tZW1iZXIoKSB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhCisgICAgIyBzdWJjbGFzcyB0byBhZGQgY3VzdG9tIF9wcm9jXyooKSBtZXRob2RzLiBBIF9wcm9jXyooKSBtZXRob2QgTVVTVAorICAgICMgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcKKyAgICAjIG9wZXJhdGlvbnM6CisgICAgIyAxLiBTZXQgc2VsZi5vZmZzZXRfZGF0YSB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzIGJlZ2luLAorICAgICMgICAgaWYgdGhlcmUgaXMgZGF0YSB0aGF0IGZvbGxvd3MuCisgICAgIyAyLiBTZXQgdGFyZmlsZS5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBuZXh0IG1lbWJlcidzIGhlYWRlciB3aWxsCisgICAgIyAgICBiZWdpbi4KKyAgICAjIDMuIFJldHVybiBzZWxmIG9yIGFub3RoZXIgdmFsaWQgVGFySW5mbyBvYmplY3QuCisgICAgZGVmIF9wcm9jX21lbWJlcihzZWxmLCB0YXJmaWxlKToKKyAgICAgICAgIiIiQ2hvb3NlIHRoZSByaWdodCBwcm9jZXNzaW5nIG1ldGhvZCBkZXBlbmRpbmcgb24KKyAgICAgICAgICAgdGhlIHR5cGUgYW5kIGNhbGwgaXQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnR5cGUgaW4gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkspOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfZ251bG9uZyh0YXJmaWxlKQorICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBHTlVUWVBFX1NQQVJTRToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX3NwYXJzZSh0YXJmaWxlKQorICAgICAgICBlbGlmIHNlbGYudHlwZSBpbiAoWEhEVFlQRSwgWEdMVFlQRSwgU09MQVJJU19YSERUWVBFKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX3BheCh0YXJmaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfYnVpbHRpbih0YXJmaWxlKQorCisgICAgZGVmIF9wcm9jX2J1aWx0aW4oc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIlByb2Nlc3MgYSBidWlsdGluIHR5cGUgb3IgYW4gdW5rbm93biB0eXBlIHdoaWNoCisgICAgICAgICAgIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpCisgICAgICAgIG9mZnNldCA9IHNlbGYub2Zmc2V0X2RhdGEKKyAgICAgICAgaWYgc2VsZi5pc3JlZygpIG9yIHNlbGYudHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgorICAgICAgICAgICAgIyBTa2lwIHRoZSBmb2xsb3dpbmcgZGF0YSBibG9ja3MuCisgICAgICAgICAgICBvZmZzZXQgKz0gc2VsZi5fYmxvY2soc2VsZi5zaXplKQorICAgICAgICB0YXJmaWxlLm9mZnNldCA9IG9mZnNldAorCisgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IHdpdGggc2F2ZWQgZ2xvYmFsCisgICAgICAgICMgaGVhZGVyIGluZm9ybWF0aW9uLgorICAgICAgICBzZWxmLl9hcHBseV9wYXhfaW5mbyh0YXJmaWxlLnBheF9oZWFkZXJzLCB0YXJmaWxlLmVuY29kaW5nLCB0YXJmaWxlLmVycm9ycykKKworICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9wcm9jX2dudWxvbmcoc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIlByb2Nlc3MgdGhlIGJsb2NrcyB0aGF0IGhvbGQgYSBHTlUgbG9uZ25hbWUKKyAgICAgICAgICAgb3IgbG9uZ2xpbmsgbWVtYmVyLgorICAgICAgICAiIiIKKyAgICAgICAgYnVmID0gdGFyZmlsZS5maWxlb2JqLnJlYWQoc2VsZi5fYmxvY2soc2VsZi5zaXplKSkKKworICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlciBhbmQgcHJvY2VzcyBpdC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV4dCA9IHNlbGYuZnJvbXRhcmZpbGUodGFyZmlsZSkKKyAgICAgICAgZXhjZXB0IEhlYWRlckVycm9yOgorICAgICAgICAgICAgcmFpc2UgU3Vic2VxdWVudEhlYWRlckVycm9yKCJtaXNzaW5nIG9yIGJhZCBzdWJzZXF1ZW50IGhlYWRlciIpCisKKyAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3QgZnJvbSB0aGUgbmV4dCBoZWFkZXIgd2l0aAorICAgICAgICAjIHRoZSBsb25nbmFtZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgbmV4dC5vZmZzZXQgPSBzZWxmLm9mZnNldAorICAgICAgICBpZiBzZWxmLnR5cGUgPT0gR05VVFlQRV9MT05HTkFNRToKKyAgICAgICAgICAgIG5leHQubmFtZSA9IG50cyhidWYpCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IEdOVVRZUEVfTE9OR0xJTks6CisgICAgICAgICAgICBuZXh0LmxpbmtuYW1lID0gbnRzKGJ1ZikKKworICAgICAgICByZXR1cm4gbmV4dAorCisgICAgZGVmIF9wcm9jX3NwYXJzZShzZWxmLCB0YXJmaWxlKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIEdOVSBzcGFyc2UgaGVhZGVyIHBsdXMgZXh0cmEgaGVhZGVycy4KKyAgICAgICAgIiIiCisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmCisgICAgICAgIHNwID0gX3JpbmdidWZmZXIoKQorICAgICAgICBwb3MgPSAzODYKKyAgICAgICAgbGFzdHBvcyA9IDBMCisgICAgICAgIHJlYWxwb3MgPSAwTAorICAgICAgICAjIFRoZXJlIGFyZSA0IHBvc3NpYmxlIHNwYXJzZSBzdHJ1Y3RzIGluIHRoZQorICAgICAgICAjIGZpcnN0IGhlYWRlci4KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDQpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9mZnNldCA9IG50aShidWZbcG9zOnBvcyArIDEyXSkKKyAgICAgICAgICAgICAgICBudW1ieXRlcyA9IG50aShidWZbcG9zICsgMTI6cG9zICsgMjRdKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6CisgICAgICAgICAgICAgICAgc3AuYXBwZW5kKF9ob2xlKGxhc3Rwb3MsIG9mZnNldCAtIGxhc3Rwb3MpKQorICAgICAgICAgICAgc3AuYXBwZW5kKF9kYXRhKG9mZnNldCwgbnVtYnl0ZXMsIHJlYWxwb3MpKQorICAgICAgICAgICAgcmVhbHBvcyArPSBudW1ieXRlcworICAgICAgICAgICAgbGFzdHBvcyA9IG9mZnNldCArIG51bWJ5dGVzCisgICAgICAgICAgICBwb3MgKz0gMjQKKworICAgICAgICBpc2V4dGVuZGVkID0gb3JkKGJ1Zls0ODJdKQorICAgICAgICBvcmlnc2l6ZSA9IG50aShidWZbNDgzOjQ5NV0pCisKKyAgICAgICAgIyBJZiB0aGUgaXNleHRlbmRlZCBmbGFnIGlzIGdpdmVuLAorICAgICAgICAjIHRoZXJlIGFyZSBleHRyYSBoZWFkZXJzIHRvIHByb2Nlc3MuCisgICAgICAgIHdoaWxlIGlzZXh0ZW5kZWQgPT0gMToKKyAgICAgICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKKyAgICAgICAgICAgIHBvcyA9IDAKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMSk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBudGkoYnVmW3Bvczpwb3MgKyAxMl0pCisgICAgICAgICAgICAgICAgICAgIG51bWJ5dGVzID0gbnRpKGJ1Zltwb3MgKyAxMjpwb3MgKyAyNF0pCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgb2Zmc2V0ID4gbGFzdHBvczoKKyAgICAgICAgICAgICAgICAgICAgc3AuYXBwZW5kKF9ob2xlKGxhc3Rwb3MsIG9mZnNldCAtIGxhc3Rwb3MpKQorICAgICAgICAgICAgICAgIHNwLmFwcGVuZChfZGF0YShvZmZzZXQsIG51bWJ5dGVzLCByZWFscG9zKSkKKyAgICAgICAgICAgICAgICByZWFscG9zICs9IG51bWJ5dGVzCisgICAgICAgICAgICAgICAgbGFzdHBvcyA9IG9mZnNldCArIG51bWJ5dGVzCisgICAgICAgICAgICAgICAgcG9zICs9IDI0CisgICAgICAgICAgICBpc2V4dGVuZGVkID0gb3JkKGJ1Zls1MDRdKQorCisgICAgICAgIGlmIGxhc3Rwb3MgPCBvcmlnc2l6ZToKKyAgICAgICAgICAgIHNwLmFwcGVuZChfaG9sZShsYXN0cG9zLCBvcmlnc2l6ZSAtIGxhc3Rwb3MpKQorCisgICAgICAgIHNlbGYuc3BhcnNlID0gc3AKKworICAgICAgICBzZWxmLm9mZnNldF9kYXRhID0gdGFyZmlsZS5maWxlb2JqLnRlbGwoKQorICAgICAgICB0YXJmaWxlLm9mZnNldCA9IHNlbGYub2Zmc2V0X2RhdGEgKyBzZWxmLl9ibG9jayhzZWxmLnNpemUpCisgICAgICAgIHNlbGYuc2l6ZSA9IG9yaWdzaXplCisKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfcHJvY19wYXgoc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIlByb2Nlc3MgYW4gZXh0ZW5kZWQgb3IgZ2xvYmFsIGhlYWRlciBhcyBkZXNjcmliZWQgaW4KKyAgICAgICAgICAgUE9TSVguMS0yMDAxLgorICAgICAgICAiIiIKKyAgICAgICAgIyBSZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24uCisgICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkpCisKKyAgICAgICAgIyBBIHBheCBoZWFkZXIgc3RvcmVzIHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbiBmb3IgZWl0aGVyCisgICAgICAgICMgdGhlIGZvbGxvd2luZyBmaWxlIChleHRlbmRlZCkgb3IgYWxsIGZvbGxvd2luZyBmaWxlcworICAgICAgICAjIChnbG9iYWwpLgorICAgICAgICBpZiBzZWxmLnR5cGUgPT0gWEdMVFlQRToKKyAgICAgICAgICAgIHBheF9oZWFkZXJzID0gdGFyZmlsZS5wYXhfaGVhZGVycworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF4X2hlYWRlcnMgPSB0YXJmaWxlLnBheF9oZWFkZXJzLmNvcHkoKQorCisgICAgICAgICMgUGFyc2UgcGF4IGhlYWRlciBpbmZvcm1hdGlvbi4gQSByZWNvcmQgbG9va3MgbGlrZSB0aGF0OgorICAgICAgICAjICIlZCAlcz0lc1xuIiAlIChsZW5ndGgsIGtleXdvcmQsIHZhbHVlKS4gbGVuZ3RoIGlzIHRoZSBzaXplCisgICAgICAgICMgb2YgdGhlIGNvbXBsZXRlIHJlY29yZCBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYgYW5kCisgICAgICAgICMgdGhlIG5ld2xpbmUuIGtleXdvcmQgYW5kIHZhbHVlIGFyZSBib3RoIFVURi04IGVuY29kZWQgc3RyaW5ncy4KKyAgICAgICAgcmVnZXggPSByZS5jb21waWxlKHIiKFxkKykgKFtePV0rKT0iLCByZS5VKQorICAgICAgICBwb3MgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBtYXRjaCA9IHJlZ2V4Lm1hdGNoKGJ1ZiwgcG9zKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGxlbmd0aCwga2V5d29yZCA9IG1hdGNoLmdyb3VwcygpCisgICAgICAgICAgICBsZW5ndGggPSBpbnQobGVuZ3RoKQorICAgICAgICAgICAgdmFsdWUgPSBidWZbbWF0Y2guZW5kKDIpICsgMTptYXRjaC5zdGFydCgxKSArIGxlbmd0aCAtIDFdCisKKyAgICAgICAgICAgIGtleXdvcmQgPSBrZXl3b3JkLmRlY29kZSgidXRmOCIpCisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmRlY29kZSgidXRmOCIpCisKKyAgICAgICAgICAgIHBheF9oZWFkZXJzW2tleXdvcmRdID0gdmFsdWUKKyAgICAgICAgICAgIHBvcyArPSBsZW5ndGgKKworICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlci4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV4dCA9IHNlbGYuZnJvbXRhcmZpbGUodGFyZmlsZSkKKyAgICAgICAgZXhjZXB0IEhlYWRlckVycm9yOgorICAgICAgICAgICAgcmFpc2UgU3Vic2VxdWVudEhlYWRlckVycm9yKCJtaXNzaW5nIG9yIGJhZCBzdWJzZXF1ZW50IGhlYWRlciIpCisKKyAgICAgICAgaWYgc2VsZi50eXBlIGluIChYSERUWVBFLCBTT0xBUklTX1hIRFRZUEUpOgorICAgICAgICAgICAgIyBQYXRjaCB0aGUgVGFySW5mbyBvYmplY3Qgd2l0aCB0aGUgZXh0ZW5kZWQgaGVhZGVyIGluZm8uCisgICAgICAgICAgICBuZXh0Ll9hcHBseV9wYXhfaW5mbyhwYXhfaGVhZGVycywgdGFyZmlsZS5lbmNvZGluZywgdGFyZmlsZS5lcnJvcnMpCisgICAgICAgICAgICBuZXh0Lm9mZnNldCA9IHNlbGYub2Zmc2V0CisKKyAgICAgICAgICAgIGlmICJzaXplIiBpbiBwYXhfaGVhZGVyczoKKyAgICAgICAgICAgICAgICAjIElmIHRoZSBleHRlbmRlZCBoZWFkZXIgcmVwbGFjZXMgdGhlIHNpemUgZmllbGQsCisgICAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRvIHJlY2FsY3VsYXRlIHRoZSBvZmZzZXQgd2hlcmUgdGhlIG5leHQKKyAgICAgICAgICAgICAgICAjIGhlYWRlciBzdGFydHMuCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dC5vZmZzZXRfZGF0YQorICAgICAgICAgICAgICAgIGlmIG5leHQuaXNyZWcoKSBvciBuZXh0LnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IG5leHQuX2Jsb2NrKG5leHQuc2l6ZSkKKyAgICAgICAgICAgICAgICB0YXJmaWxlLm9mZnNldCA9IG9mZnNldAorCisgICAgICAgIHJldHVybiBuZXh0CisKKyAgICBkZWYgX2FwcGx5X3BheF9pbmZvKHNlbGYsIHBheF9oZWFkZXJzLCBlbmNvZGluZywgZXJyb3JzKToKKyAgICAgICAgIiIiUmVwbGFjZSBmaWVsZHMgd2l0aCBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24gZnJvbSBhIHByZXZpb3VzCisgICAgICAgICAgIHBheCBleHRlbmRlZCBvciBnbG9iYWwgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHBheF9oZWFkZXJzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYga2V5d29yZCBub3QgaW4gUEFYX0ZJRUxEUzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBrZXl3b3JkID09ICJwYXRoIjoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJzdHJpcCgiLyIpCisKKyAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gUEFYX05VTUJFUl9GSUVMRFM6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFBBWF9OVU1CRVJfRklFTERTW2tleXdvcmRdKHZhbHVlKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB1dHModmFsdWUsIGVuY29kaW5nLCBlcnJvcnMpCisKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwga2V5d29yZCwgdmFsdWUpCisKKyAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHBheF9oZWFkZXJzLmNvcHkoKQorCisgICAgZGVmIF9ibG9jayhzZWxmLCBjb3VudCk6CisgICAgICAgICIiIlJvdW5kIHVwIGEgYnl0ZSBjb3VudCBieSBCTE9DS1NJWkUgYW5kIHJldHVybiBpdCwKKyAgICAgICAgICAgZS5nLiBfYmxvY2soODM0KSA9PiAxMDI0LgorICAgICAgICAiIiIKKyAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QoY291bnQsIEJMT0NLU0laRSkKKyAgICAgICAgaWYgcmVtYWluZGVyOgorICAgICAgICAgICAgYmxvY2tzICs9IDEKKyAgICAgICAgcmV0dXJuIGJsb2NrcyAqIEJMT0NLU0laRQorCisgICAgZGVmIGlzcmVnKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlIGluIFJFR1VMQVJfVFlQRVMKKyAgICBkZWYgaXNmaWxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pc3JlZygpCisgICAgZGVmIGlzZGlyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IERJUlRZUEUKKyAgICBkZWYgaXNzeW0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gU1lNVFlQRQorICAgIGRlZiBpc2xuayhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBMTktUWVBFCisgICAgZGVmIGlzY2hyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IENIUlRZUEUKKyAgICBkZWYgaXNibGsoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gQkxLVFlQRQorICAgIGRlZiBpc2ZpZm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gRklGT1RZUEUKKyAgICBkZWYgaXNzcGFyc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gR05VVFlQRV9TUEFSU0UKKyAgICBkZWYgaXNkZXYoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGUgaW4gKENIUlRZUEUsIEJMS1RZUEUsIEZJRk9UWVBFKQorIyBjbGFzcyBUYXJJbmZvCisKK2NsYXNzIFRhckZpbGUob2JqZWN0KToKKyAgICAiIiJUaGUgVGFyRmlsZSBDbGFzcyBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGFyIGFyY2hpdmVzLgorICAgICIiIgorCisgICAgZGVidWcgPSAwICAgICAgICAgICAgICAgICAgICMgTWF5IGJlIHNldCBmcm9tIDAgKG5vIG1zZ3MpIHRvIDMgKGFsbCBtc2dzKQorCisgICAgZGVyZWZlcmVuY2UgPSBGYWxzZSAgICAgICAgICMgSWYgdHJ1ZSwgYWRkIGNvbnRlbnQgb2YgbGlua2VkIGZpbGUgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGFyIGZpbGUsIGVsc2UgdGhlIGxpbmsuCisKKyAgICBpZ25vcmVfemVyb3MgPSBGYWxzZSAgICAgICAgIyBJZiB0cnVlLCBza2lwcyBlbXB0eSBvciBpbnZhbGlkIGJsb2NrcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb250aW51ZXMgcHJvY2Vzc2luZy4KKworICAgIGVycm9ybGV2ZWwgPSAxICAgICAgICAgICAgICAjIElmIDAsIGZhdGFsIGVycm9ycyBvbmx5IGFwcGVhciBpbiBkZWJ1ZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1lc3NhZ2VzIChpZiBkZWJ1ZyA+PSAwKS4gSWYgPiAwLCBlcnJvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmUgcGFzc2VkIHRvIHRoZSBjYWxsZXIgYXMgZXhjZXB0aW9ucy4KKworICAgIGZvcm1hdCA9IERFRkFVTFRfRk9STUFUICAgICAjIFRoZSBmb3JtYXQgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYW4gYXJjaGl2ZS4KKworICAgIGVuY29kaW5nID0gRU5DT0RJTkcgICAgICAgICAjIEVuY29kaW5nIGZvciA4LWJpdCBjaGFyYWN0ZXIgc3RyaW5ncy4KKworICAgIGVycm9ycyA9IE5vbmUgICAgICAgICAgICAgICAjIEVycm9yIGhhbmRsZXIgZm9yIHVuaWNvZGUgY29udmVyc2lvbi4KKworICAgIHRhcmluZm8gPSBUYXJJbmZvICAgICAgICAgICAjIFRoZSBkZWZhdWx0IFRhckluZm8gY2xhc3MgdG8gdXNlLgorCisgICAgZmlsZW9iamVjdCA9IEV4RmlsZU9iamVjdCAgICMgVGhlIGRlZmF1bHQgRXhGaWxlT2JqZWN0IGNsYXNzIHRvIHVzZS4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPU5vbmUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGZvcm1hdD1Ob25lLAorICAgICAgICAgICAgdGFyaW5mbz1Ob25lLCBkZXJlZmVyZW5jZT1Ob25lLCBpZ25vcmVfemVyb3M9Tm9uZSwgZW5jb2Rpbmc9Tm9uZSwKKyAgICAgICAgICAgIGVycm9ycz1Ob25lLCBwYXhfaGVhZGVycz1Ob25lLCBkZWJ1Zz1Ob25lLCBlcnJvcmxldmVsPU5vbmUpOgorICAgICAgICAiIiJPcGVuIGFuICh1bmNvbXByZXNzZWQpIHRhciBhcmNoaXZlIGBuYW1lJy4gYG1vZGUnIGlzIGVpdGhlciAncicgdG8KKyAgICAgICAgICAgcmVhZCBmcm9tIGFuIGV4aXN0aW5nIGFyY2hpdmUsICdhJyB0byBhcHBlbmQgZGF0YSB0byBhbiBleGlzdGluZworICAgICAgICAgICBmaWxlIG9yICd3JyB0byBjcmVhdGUgYSBuZXcgZmlsZSBvdmVyd3JpdGluZyBhbiBleGlzdGluZyBvbmUuIGBtb2RlJworICAgICAgICAgICBkZWZhdWx0cyB0byAncicuCisgICAgICAgICAgIElmIGBmaWxlb2JqJyBpcyBnaXZlbiwgaXQgaXMgdXNlZCBmb3IgcmVhZGluZyBvciB3cml0aW5nIGRhdGEuIElmIGl0CisgICAgICAgICAgIGNhbiBiZSBkZXRlcm1pbmVkLCBgbW9kZScgaXMgb3ZlcnJpZGRlbiBieSBgZmlsZW9iaidzIG1vZGUuCisgICAgICAgICAgIGBmaWxlb2JqJyBpcyBub3QgY2xvc2VkLCB3aGVuIFRhckZpbGUgaXMgY2xvc2VkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciKQorICAgICAgICBzZWxmLm1vZGUgPSBtb2RlCisgICAgICAgIHNlbGYuX21vZGUgPSB7InIiOiAicmIiLCAiYSI6ICJyK2IiLCAidyI6ICJ3YiJ9W21vZGVdCisKKyAgICAgICAgaWYgbm90IGZpbGVvYmo6CisgICAgICAgICAgICBpZiBzZWxmLm1vZGUgPT0gImEiIGFuZCBub3Qgb3MucGF0aC5leGlzdHMobmFtZSk6CisgICAgICAgICAgICAgICAgIyBDcmVhdGUgbm9uZXhpc3RlbnQgZmlsZXMgaW4gYXBwZW5kIG1vZGUuCisgICAgICAgICAgICAgICAgc2VsZi5tb2RlID0gInciCisgICAgICAgICAgICAgICAgc2VsZi5fbW9kZSA9ICJ3YiIKKyAgICAgICAgICAgIGZpbGVvYmogPSBibHRuX29wZW4obmFtZSwgc2VsZi5fbW9kZSkKKyAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lIGFuZCBoYXNhdHRyKGZpbGVvYmosICJuYW1lIik6CisgICAgICAgICAgICAgICAgbmFtZSA9IGZpbGVvYmoubmFtZQorICAgICAgICAgICAgaWYgaGFzYXR0cihmaWxlb2JqLCAibW9kZSIpOgorICAgICAgICAgICAgICAgIHNlbGYuX21vZGUgPSBmaWxlb2JqLm1vZGUKKyAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBUcnVlCisgICAgICAgIHNlbGYubmFtZSA9IG9zLnBhdGguYWJzcGF0aChuYW1lKSBpZiBuYW1lIGVsc2UgTm9uZQorICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCisKKyAgICAgICAgIyBJbml0IGF0dHJpYnV0ZXMuCisgICAgICAgIGlmIGZvcm1hdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZm9ybWF0ID0gZm9ybWF0CisgICAgICAgIGlmIHRhcmluZm8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnRhcmluZm8gPSB0YXJpbmZvCisgICAgICAgIGlmIGRlcmVmZXJlbmNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5kZXJlZmVyZW5jZSA9IGRlcmVmZXJlbmNlCisgICAgICAgIGlmIGlnbm9yZV96ZXJvcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaWdub3JlX3plcm9zID0gaWdub3JlX3plcm9zCisgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisKKyAgICAgICAgaWYgZXJyb3JzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKKyAgICAgICAgZWxpZiBtb2RlID09ICJyIjoKKyAgICAgICAgICAgIHNlbGYuZXJyb3JzID0gInV0Zi04IgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lcnJvcnMgPSAic3RyaWN0IgorCisgICAgICAgIGlmIHBheF9oZWFkZXJzIGlzIG5vdCBOb25lIGFuZCBzZWxmLmZvcm1hdCA9PSBQQVhfRk9STUFUOgorICAgICAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHBheF9oZWFkZXJzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0ge30KKworICAgICAgICBpZiBkZWJ1ZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVidWcgPSBkZWJ1ZworICAgICAgICBpZiBlcnJvcmxldmVsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5lcnJvcmxldmVsID0gZXJyb3JsZXZlbAorCisgICAgICAgICMgSW5pdCBkYXRhc3RydWN0dXJlcy4KKyAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQorICAgICAgICBzZWxmLm1lbWJlcnMgPSBbXSAgICAgICAjIGxpc3Qgb2YgbWVtYmVycyBhcyBUYXJJbmZvIG9iamVjdHMKKyAgICAgICAgc2VsZi5fbG9hZGVkID0gRmFsc2UgICAgIyBmbGFnIGlmIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkCisgICAgICAgIHNlbGYub2Zmc2V0ID0gc2VsZi5maWxlb2JqLnRlbGwoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGFyY2hpdmUgZmlsZQorICAgICAgICBzZWxmLmlub2RlcyA9IHt9ICAgICAgICAjIGRpY3Rpb25hcnkgY2FjaGluZyB0aGUgaW5vZGVzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXJjaGl2ZSBtZW1iZXJzIGFscmVhZHkgYWRkZWQKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInIiOgorICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCisgICAgICAgICAgICAgICAgc2VsZi5maXJzdG1lbWJlciA9IHNlbGYubmV4dCgpCisKKyAgICAgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiYSI6CisgICAgICAgICAgICAgICAgIyBNb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUsCisgICAgICAgICAgICAgICAgIyBiZWZvcmUgdGhlIGZpcnN0IGVtcHR5IGJsb2NrLgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJpbmZvLmZyb210YXJmaWxlKHNlbGYpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKHRhcmluZm8pCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFT0ZIZWFkZXJFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEhlYWRlckVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKHN0cihlKSkKKworICAgICAgICAgICAgaWYgc2VsZi5tb2RlIGluICJhdyI6CisgICAgICAgICAgICAgICAgc2VsZi5fbG9hZGVkID0gVHJ1ZQorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5wYXhfaGVhZGVyczoKKyAgICAgICAgICAgICAgICAgICAgYnVmID0gc2VsZi50YXJpbmZvLmNyZWF0ZV9wYXhfZ2xvYmFsX2hlYWRlcihzZWxmLnBheF9oZWFkZXJzLmNvcHkoKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gbGVuKGJ1ZikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQorICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBfZ2V0cG9zaXgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmZvcm1hdCA9PSBVU1RBUl9GT1JNQVQKKyAgICBkZWYgX3NldHBvc2l4KHNlbGYsIHZhbHVlKToKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIHdhcm5pbmdzLndhcm4oInVzZSB0aGUgZm9ybWF0IGF0dHJpYnV0ZSBpbnN0ZWFkIiwgRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgIDIpCisgICAgICAgIGlmIHZhbHVlOgorICAgICAgICAgICAgc2VsZi5mb3JtYXQgPSBVU1RBUl9GT1JNQVQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZm9ybWF0ID0gR05VX0ZPUk1BVAorICAgIHBvc2l4ID0gcHJvcGVydHkoX2dldHBvc2l4LCBfc2V0cG9zaXgpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIEJlbG93IGFyZSB0aGUgY2xhc3NtZXRob2RzIHdoaWNoIGFjdCBhcyBhbHRlcm5hdGUgY29uc3RydWN0b3JzIHRvIHRoZQorICAgICMgVGFyRmlsZSBjbGFzcy4gVGhlIG9wZW4oKSBtZXRob2QgaXMgdGhlIG9ubHkgb25lIHRoYXQgaXMgbmVlZGVkIGZvcgorICAgICMgcHVibGljIHVzZTsgaXQgaXMgdGhlICJzdXBlciItY29uc3RydWN0b3IgYW5kIGlzIGFibGUgdG8gc2VsZWN0IGFuCisgICAgIyBhZGVxdWF0ZSAic3ViIi1jb25zdHJ1Y3RvciBmb3IgYSBwYXJ0aWN1bGFyIGNvbXByZXNzaW9uIHVzaW5nIHRoZSBtYXBwaW5nCisgICAgIyBmcm9tIE9QRU5fTUVUSC4KKyAgICAjCisgICAgIyBUaGlzIGNvbmNlcHQgYWxsb3dzIG9uZSB0byBzdWJjbGFzcyBUYXJGaWxlIHdpdGhvdXQgbG9zaW5nIHRoZSBjb21mb3J0IG9mCisgICAgIyB0aGUgc3VwZXItY29uc3RydWN0b3IuIEEgc3ViLWNvbnN0cnVjdG9yIGlzIHJlZ2lzdGVyZWQgYW5kIG1hZGUgYXZhaWxhYmxlCisgICAgIyBieSBhZGRpbmcgaXQgdG8gdGhlIG1hcHBpbmcgaW4gT1BFTl9NRVRILgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIG9wZW4oY2xzLCBuYW1lPU5vbmUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGJ1ZnNpemU9UkVDT1JEU0laRSwgKiprd2FyZ3MpOgorICAgICAgICAiIiJPcGVuIGEgdGFyIGFyY2hpdmUgZm9yIHJlYWRpbmcsIHdyaXRpbmcgb3IgYXBwZW5kaW5nLiBSZXR1cm4KKyAgICAgICAgICAgYW4gYXBwcm9wcmlhdGUgVGFyRmlsZSBjbGFzcy4KKworICAgICAgICAgICBtb2RlOgorICAgICAgICAgICAncicgb3IgJ3I6Kicgb3BlbiBmb3IgcmVhZGluZyB3aXRoIHRyYW5zcGFyZW50IGNvbXByZXNzaW9uCisgICAgICAgICAgICdyOicgICAgICAgICBvcGVuIGZvciByZWFkaW5nIGV4Y2x1c2l2ZWx5IHVuY29tcHJlc3NlZAorICAgICAgICAgICAncjpneicgICAgICAgb3BlbiBmb3IgcmVhZGluZyB3aXRoIGd6aXAgY29tcHJlc3Npb24KKyAgICAgICAgICAgJ3I6YnoyJyAgICAgIG9wZW4gZm9yIHJlYWRpbmcgd2l0aCBiemlwMiBjb21wcmVzc2lvbgorICAgICAgICAgICAnYScgb3IgJ2E6JyAgb3BlbiBmb3IgYXBwZW5kaW5nLCBjcmVhdGluZyB0aGUgZmlsZSBpZiBuZWNlc3NhcnkKKyAgICAgICAgICAgJ3cnIG9yICd3OicgIG9wZW4gZm9yIHdyaXRpbmcgd2l0aG91dCBjb21wcmVzc2lvbgorICAgICAgICAgICAndzpneicgICAgICAgb3BlbiBmb3Igd3JpdGluZyB3aXRoIGd6aXAgY29tcHJlc3Npb24KKyAgICAgICAgICAgJ3c6YnoyJyAgICAgIG9wZW4gZm9yIHdyaXRpbmcgd2l0aCBiemlwMiBjb21wcmVzc2lvbgorCisgICAgICAgICAgICdyfConICAgICAgICBvcGVuIGEgc3RyZWFtIG9mIHRhciBibG9ja3Mgd2l0aCB0cmFuc3BhcmVudCBjb21wcmVzc2lvbgorICAgICAgICAgICAncnwnICAgICAgICAgb3BlbiBhbiB1bmNvbXByZXNzZWQgc3RyZWFtIG9mIHRhciBibG9ja3MgZm9yIHJlYWRpbmcKKyAgICAgICAgICAgJ3J8Z3onICAgICAgIG9wZW4gYSBnemlwIGNvbXByZXNzZWQgc3RyZWFtIG9mIHRhciBibG9ja3MKKyAgICAgICAgICAgJ3J8YnoyJyAgICAgIG9wZW4gYSBiemlwMiBjb21wcmVzc2VkIHN0cmVhbSBvZiB0YXIgYmxvY2tzCisgICAgICAgICAgICd3fCcgICAgICAgICBvcGVuIGFuIHVuY29tcHJlc3NlZCBzdHJlYW0gZm9yIHdyaXRpbmcKKyAgICAgICAgICAgJ3d8Z3onICAgICAgIG9wZW4gYSBnemlwIGNvbXByZXNzZWQgc3RyZWFtIGZvciB3cml0aW5nCisgICAgICAgICAgICd3fGJ6MicgICAgICBvcGVuIGEgYnppcDIgY29tcHJlc3NlZCBzdHJlYW0gZm9yIHdyaXRpbmcKKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbm90IG5hbWUgYW5kIG5vdCBmaWxlb2JqOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm90aGluZyB0byBvcGVuIikKKworICAgICAgICBpZiBtb2RlIGluICgiciIsICJyOioiKToKKyAgICAgICAgICAgICMgRmluZCBvdXQgd2hpY2ggKm9wZW4oKSBpcyBhcHByb3ByaWF0ZSBmb3Igb3BlbmluZyB0aGUgZmlsZS4KKyAgICAgICAgICAgIGZvciBjb21wdHlwZSBpbiBjbHMuT1BFTl9NRVRIOgorICAgICAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKGNscywgY2xzLk9QRU5fTUVUSFtjb21wdHlwZV0pCisgICAgICAgICAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2F2ZWRfcG9zID0gZmlsZW9iai50ZWxsKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKG5hbWUsICJyIiwgZmlsZW9iaiwgKiprd2FyZ3MpCisgICAgICAgICAgICAgICAgZXhjZXB0IChSZWFkRXJyb3IsIENvbXByZXNzaW9uRXJyb3IpLCBlOgorICAgICAgICAgICAgICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKHNhdmVkX3BvcykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigiZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIHN1Y2Nlc3NmdWxseSIpCisKKyAgICAgICAgZWxpZiAiOiIgaW4gbW9kZToKKyAgICAgICAgICAgIGZpbGVtb2RlLCBjb21wdHlwZSA9IG1vZGUuc3BsaXQoIjoiLCAxKQorICAgICAgICAgICAgZmlsZW1vZGUgPSBmaWxlbW9kZSBvciAiciIKKyAgICAgICAgICAgIGNvbXB0eXBlID0gY29tcHR5cGUgb3IgInRhciIKKworICAgICAgICAgICAgIyBTZWxlY3QgdGhlICpvcGVuKCkgZnVuY3Rpb24gYWNjb3JkaW5nIHRvCisgICAgICAgICAgICAjIGdpdmVuIGNvbXByZXNzaW9uLgorICAgICAgICAgICAgaWYgY29tcHR5cGUgaW4gY2xzLk9QRU5fTUVUSDoKKyAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihjbHMsIGNscy5PUEVOX01FVEhbY29tcHR5cGVdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGUgJXIiICUgY29tcHR5cGUpCisgICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCBmaWxlbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCisKKyAgICAgICAgZWxpZiAifCIgaW4gbW9kZToKKyAgICAgICAgICAgIGZpbGVtb2RlLCBjb21wdHlwZSA9IG1vZGUuc3BsaXQoInwiLCAxKQorICAgICAgICAgICAgZmlsZW1vZGUgPSBmaWxlbW9kZSBvciAiciIKKyAgICAgICAgICAgIGNvbXB0eXBlID0gY29tcHR5cGUgb3IgInRhciIKKworICAgICAgICAgICAgaWYgZmlsZW1vZGUgbm90IGluICJydyI6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndyciKQorCisgICAgICAgICAgICB0ID0gY2xzKG5hbWUsIGZpbGVtb2RlLAorICAgICAgICAgICAgICAgICAgICBfU3RyZWFtKG5hbWUsIGZpbGVtb2RlLCBjb21wdHlwZSwgZmlsZW9iaiwgYnVmc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzKQorICAgICAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCisgICAgICAgICAgICByZXR1cm4gdAorCisgICAgICAgIGVsaWYgbW9kZSBpbiAiYXciOgorICAgICAgICAgICAgcmV0dXJuIGNscy50YXJvcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQorCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuZGlzY2VybmlibGUgbW9kZSIpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgdGFyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgIiIiT3BlbiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciKQorICAgICAgICByZXR1cm4gY2xzKG5hbWUsIG1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGd6b3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGNvbXByZXNzbGV2ZWw9OSwgKiprd2FyZ3MpOgorICAgICAgICAiIiJPcGVuIGd6aXAgY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCisgICAgICAgICAgIEFwcGVuZGluZyBpcyBub3QgYWxsb3dlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJ3IjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgZ3ppcAorICAgICAgICAgICAgZ3ppcC5HemlwRmlsZQorICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJnemlwIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKKworICAgICAgICBpZiBmaWxlb2JqIGlzIE5vbmU6CisgICAgICAgICAgICBmaWxlb2JqID0gYmx0bl9vcGVuKG5hbWUsIG1vZGUgKyAiYiIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdCA9IGNscy50YXJvcGVuKG5hbWUsIG1vZGUsCisgICAgICAgICAgICAgICAgZ3ppcC5HemlwRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsLCBmaWxlb2JqKSwKKyAgICAgICAgICAgICAgICAqKmt3YXJncykKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoIm5vdCBhIGd6aXAgZmlsZSIpCisgICAgICAgIHQuX2V4dGZpbGVvYmogPSBGYWxzZQorICAgICAgICByZXR1cm4gdAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGJ6Mm9wZW4oY2xzLCBuYW1lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBjb21wcmVzc2xldmVsPTksICoqa3dhcmdzKToKKyAgICAgICAgIiIiT3BlbiBiemlwMiBjb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KKyAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicnciOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndycuIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgYnoyCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoImJ6MiBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIpCisKKyAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZpbGVvYmogPSBfQloyUHJveHkoZmlsZW9iaiwgbW9kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpbGVvYmogPSBiejIuQloyRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsPWNvbXByZXNzbGV2ZWwpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdCA9IGNscy50YXJvcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQorICAgICAgICBleGNlcHQgKElPRXJyb3IsIEVPRkVycm9yKToKKyAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigibm90IGEgYnppcDIgZmlsZSIpCisgICAgICAgIHQuX2V4dGZpbGVvYmogPSBGYWxzZQorICAgICAgICByZXR1cm4gdAorCisgICAgIyBBbGwgKm9wZW4oKSBtZXRob2RzIGFyZSByZWdpc3RlcmVkIGhlcmUuCisgICAgT1BFTl9NRVRIID0geworICAgICAgICAidGFyIjogInRhcm9wZW4iLCAgICMgdW5jb21wcmVzc2VkIHRhcgorICAgICAgICAiZ3oiOiAgImd6b3BlbiIsICAgICMgZ3ppcCBjb21wcmVzc2VkIHRhcgorICAgICAgICAiYnoyIjogImJ6Mm9wZW4iICAgICMgYnppcDIgY29tcHJlc3NlZCB0YXIKKyAgICB9CisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRoZSBwdWJsaWMgbWV0aG9kcyB3aGljaCBUYXJGaWxlIHByb3ZpZGVzOgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgVGFyRmlsZS4gSW4gd3JpdGUtbW9kZSwgdHdvIGZpbmlzaGluZyB6ZXJvIGJsb2NrcyBhcmUKKyAgICAgICAgICAgYXBwZW5kZWQgdG8gdGhlIGFyY2hpdmUuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHNlbGYubW9kZSBpbiAiYXciOgorICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKE5VTCAqIChCTE9DS1NJWkUgKiAyKSkKKyAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IChCTE9DS1NJWkUgKiAyKQorICAgICAgICAgICAgIyBmaWxsIHVwIHRoZSBlbmQgd2l0aCB6ZXJvLWJsb2NrcworICAgICAgICAgICAgIyAobGlrZSBvcHRpb24gLWIyMCBmb3IgdGFyIGRvZXMpCisgICAgICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChzZWxmLm9mZnNldCwgUkVDT1JEU0laRSkKKyAgICAgICAgICAgIGlmIHJlbWFpbmRlciA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKE5VTCAqIChSRUNPUkRTSVpFIC0gcmVtYWluZGVyKSkKKworICAgICAgICBpZiBub3Qgc2VsZi5fZXh0ZmlsZW9iajoKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCisgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQorCisgICAgZGVmIGdldG1lbWJlcihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgVGFySW5mbyBvYmplY3QgZm9yIG1lbWJlciBgbmFtZScuIElmIGBuYW1lJyBjYW4gbm90IGJlCisgICAgICAgICAgIGZvdW5kIGluIHRoZSBhcmNoaXZlLCBLZXlFcnJvciBpcyByYWlzZWQuIElmIGEgbWVtYmVyIG9jY3VycyBtb3JlCisgICAgICAgICAgIHRoYW4gb25jZSBpbiB0aGUgYXJjaGl2ZSwgaXRzIGxhc3Qgb2NjdXJyZW5jZSBpcyBhc3N1bWVkIHRvIGJlIHRoZQorICAgICAgICAgICBtb3N0IHVwLXRvLWRhdGUgdmVyc2lvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHRhcmluZm8gPSBzZWxmLl9nZXRtZW1iZXIobmFtZSkKKyAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoImZpbGVuYW1lICVyIG5vdCBmb3VuZCIgJSBuYW1lKQorICAgICAgICByZXR1cm4gdGFyaW5mbworCisgICAgZGVmIGdldG1lbWJlcnMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSBhcyBhIGxpc3Qgb2YgVGFySW5mbyBvYmplY3RzLiBUaGUKKyAgICAgICAgICAgbGlzdCBoYXMgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIG1lbWJlcnMgaW4gdGhlIGFyY2hpdmUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVjaygpCisgICAgICAgIGlmIG5vdCBzZWxmLl9sb2FkZWQ6ICAgICMgaWYgd2Ugd2FudCB0byBvYnRhaW4gYSBsaXN0IG9mCisgICAgICAgICAgICBzZWxmLl9sb2FkKCkgICAgICAgICMgYWxsIG1lbWJlcnMsIHdlIGZpcnN0IGhhdmUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzY2FuIHRoZSB3aG9sZSBhcmNoaXZlLgorICAgICAgICByZXR1cm4gc2VsZi5tZW1iZXJzCisKKyAgICBkZWYgZ2V0bmFtZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbWVtYmVycyBvZiB0aGUgYXJjaGl2ZSBhcyBhIGxpc3Qgb2YgdGhlaXIgbmFtZXMuIEl0IGhhcworICAgICAgICAgICB0aGUgc2FtZSBvcmRlciBhcyB0aGUgbGlzdCByZXR1cm5lZCBieSBnZXRtZW1iZXJzKCkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gW3RhcmluZm8ubmFtZSBmb3IgdGFyaW5mbyBpbiBzZWxmLmdldG1lbWJlcnMoKV0KKworICAgIGRlZiBnZXR0YXJpbmZvKHNlbGYsIG5hbWU9Tm9uZSwgYXJjbmFtZT1Ob25lLCBmaWxlb2JqPU5vbmUpOgorICAgICAgICAiIiJDcmVhdGUgYSBUYXJJbmZvIG9iamVjdCBmb3IgZWl0aGVyIHRoZSBmaWxlIGBuYW1lJyBvciB0aGUgZmlsZQorICAgICAgICAgICBvYmplY3QgYGZpbGVvYmonICh1c2luZyBvcy5mc3RhdCBvbiBpdHMgZmlsZSBkZXNjcmlwdG9yKS4gWW91IGNhbgorICAgICAgICAgICBtb2RpZnkgc29tZSBvZiB0aGUgVGFySW5mbydzIGF0dHJpYnV0ZXMgYmVmb3JlIHlvdSBhZGQgaXQgdXNpbmcKKyAgICAgICAgICAgYWRkZmlsZSgpLiBJZiBnaXZlbiwgYGFyY25hbWUnIHNwZWNpZmllcyBhbiBhbHRlcm5hdGl2ZSBuYW1lIGZvciB0aGUKKyAgICAgICAgICAgZmlsZSBpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrKCJhdyIpCisKKyAgICAgICAgIyBXaGVuIGZpbGVvYmogaXMgZ2l2ZW4sIHJlcGxhY2UgbmFtZSBieQorICAgICAgICAjIGZpbGVvYmoncyByZWFsIG5hbWUuCisgICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CisgICAgICAgICAgICBuYW1lID0gZmlsZW9iai5uYW1lCisKKyAgICAgICAgIyBCdWlsZGluZyB0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIGluIHRoZSBhcmNoaXZlLgorICAgICAgICAjIEJhY2t3YXJkIHNsYXNoZXMgYXJlIGNvbnZlcnRlZCB0byBmb3J3YXJkIHNsYXNoZXMsCisgICAgICAgICMgQWJzb2x1dGUgcGF0aHMgYXJlIHR1cm5lZCB0byByZWxhdGl2ZSBwYXRocy4KKyAgICAgICAgaWYgYXJjbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgYXJjbmFtZSA9IG5hbWUKKyAgICAgICAgZHJ2LCBhcmNuYW1lID0gb3MucGF0aC5zcGxpdGRyaXZlKGFyY25hbWUpCisgICAgICAgIGFyY25hbWUgPSBhcmNuYW1lLnJlcGxhY2Uob3Muc2VwLCAiLyIpCisgICAgICAgIGFyY25hbWUgPSBhcmNuYW1lLmxzdHJpcCgiLyIpCisKKyAgICAgICAgIyBOb3csIGZpbGwgdGhlIFRhckluZm8gb2JqZWN0IHdpdGgKKyAgICAgICAgIyBpbmZvcm1hdGlvbiBzcGVjaWZpYyBmb3IgdGhlIGZpbGUuCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmluZm8oKQorICAgICAgICB0YXJpbmZvLnRhcmZpbGUgPSBzZWxmCisKKyAgICAgICAgIyBVc2Ugb3Muc3RhdCBvciBvcy5sc3RhdCwgZGVwZW5kaW5nIG9uIHBsYXRmb3JtCisgICAgICAgICMgYW5kIGlmIHN5bWxpbmtzIHNoYWxsIGJlIHJlc29sdmVkLgorICAgICAgICBpZiBmaWxlb2JqIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAibHN0YXQiKSBhbmQgbm90IHNlbGYuZGVyZWZlcmVuY2U6CisgICAgICAgICAgICAgICAgc3RhdHJlcyA9IG9zLmxzdGF0KG5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXRyZXMgPSBvcy5zdGF0KG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGF0cmVzID0gb3MuZnN0YXQoZmlsZW9iai5maWxlbm8oKSkKKyAgICAgICAgbGlua25hbWUgPSAiIgorCisgICAgICAgIHN0bWQgPSBzdGF0cmVzLnN0X21vZGUKKyAgICAgICAgaWYgc3RhdC5TX0lTUkVHKHN0bWQpOgorICAgICAgICAgICAgaW5vZGUgPSAoc3RhdHJlcy5zdF9pbm8sIHN0YXRyZXMuc3RfZGV2KQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZGVyZWZlcmVuY2UgYW5kIHN0YXRyZXMuc3RfbmxpbmsgPiAxIGFuZCBcCisgICAgICAgICAgICAgICAgICAgIGlub2RlIGluIHNlbGYuaW5vZGVzIGFuZCBhcmNuYW1lICE9IHNlbGYuaW5vZGVzW2lub2RlXToKKyAgICAgICAgICAgICAgICAjIElzIGl0IGEgaGFyZGxpbmsgdG8gYW4gYWxyZWFkeQorICAgICAgICAgICAgICAgICMgYXJjaGl2ZWQgZmlsZT8KKyAgICAgICAgICAgICAgICB0eXBlID0gTE5LVFlQRQorICAgICAgICAgICAgICAgIGxpbmtuYW1lID0gc2VsZi5pbm9kZXNbaW5vZGVdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgVGhlIGlub2RlIGlzIGFkZGVkIG9ubHkgaWYgaXRzIHZhbGlkLgorICAgICAgICAgICAgICAgICMgRm9yIHdpbjMyIGl0IGlzIGFsd2F5cyAwLgorICAgICAgICAgICAgICAgIHR5cGUgPSBSRUdUWVBFCisgICAgICAgICAgICAgICAgaWYgaW5vZGVbMF06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5vZGVzW2lub2RlXSA9IGFyY25hbWUKKyAgICAgICAgZWxpZiBzdGF0LlNfSVNESVIoc3RtZCk6CisgICAgICAgICAgICB0eXBlID0gRElSVFlQRQorICAgICAgICBlbGlmIHN0YXQuU19JU0ZJRk8oc3RtZCk6CisgICAgICAgICAgICB0eXBlID0gRklGT1RZUEUKKyAgICAgICAgZWxpZiBzdGF0LlNfSVNMTksoc3RtZCk6CisgICAgICAgICAgICB0eXBlID0gU1lNVFlQRQorICAgICAgICAgICAgbGlua25hbWUgPSBvcy5yZWFkbGluayhuYW1lKQorICAgICAgICBlbGlmIHN0YXQuU19JU0NIUihzdG1kKToKKyAgICAgICAgICAgIHR5cGUgPSBDSFJUWVBFCisgICAgICAgIGVsaWYgc3RhdC5TX0lTQkxLKHN0bWQpOgorICAgICAgICAgICAgdHlwZSA9IEJMS1RZUEUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBGaWxsIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIGFsbAorICAgICAgICAjIGluZm9ybWF0aW9uIHdlIGNhbiBnZXQuCisgICAgICAgIHRhcmluZm8ubmFtZSA9IGFyY25hbWUKKyAgICAgICAgdGFyaW5mby5tb2RlID0gc3RtZAorICAgICAgICB0YXJpbmZvLnVpZCA9IHN0YXRyZXMuc3RfdWlkCisgICAgICAgIHRhcmluZm8uZ2lkID0gc3RhdHJlcy5zdF9naWQKKyAgICAgICAgaWYgdHlwZSA9PSBSRUdUWVBFOgorICAgICAgICAgICAgdGFyaW5mby5zaXplID0gc3RhdHJlcy5zdF9zaXplCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXJpbmZvLnNpemUgPSAwTAorICAgICAgICB0YXJpbmZvLm10aW1lID0gc3RhdHJlcy5zdF9tdGltZQorICAgICAgICB0YXJpbmZvLnR5cGUgPSB0eXBlCisgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBsaW5rbmFtZQorICAgICAgICBpZiBwd2Q6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFyaW5mby51bmFtZSA9IHB3ZC5nZXRwd3VpZCh0YXJpbmZvLnVpZClbMF0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIGdycDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YXJpbmZvLmduYW1lID0gZ3JwLmdldGdyZ2lkKHRhcmluZm8uZ2lkKVswXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBpZiB0eXBlIGluIChDSFJUWVBFLCBCTEtUWVBFKToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJtYWpvciIpIGFuZCBoYXNhdHRyKG9zLCAibWlub3IiKToKKyAgICAgICAgICAgICAgICB0YXJpbmZvLmRldm1ham9yID0gb3MubWFqb3Ioc3RhdHJlcy5zdF9yZGV2KQorICAgICAgICAgICAgICAgIHRhcmluZm8uZGV2bWlub3IgPSBvcy5taW5vcihzdGF0cmVzLnN0X3JkZXYpCisgICAgICAgIHJldHVybiB0YXJpbmZvCisKKyAgICBkZWYgbGlzdChzZWxmLCB2ZXJib3NlPVRydWUpOgorICAgICAgICAiIiJQcmludCBhIHRhYmxlIG9mIGNvbnRlbnRzIHRvIHN5cy5zdGRvdXQuIElmIGB2ZXJib3NlJyBpcyBGYWxzZSwgb25seQorICAgICAgICAgICB0aGUgbmFtZXMgb2YgdGhlIG1lbWJlcnMgYXJlIHByaW50ZWQuIElmIGl0IGlzIFRydWUsIGFuIGBscyAtbCctbGlrZQorICAgICAgICAgICBvdXRwdXQgaXMgcHJvZHVjZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVjaygpCisKKyAgICAgICAgZm9yIHRhcmluZm8gaW4gc2VsZjoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgZmlsZW1vZGUodGFyaW5mby5tb2RlKSwKKyAgICAgICAgICAgICAgICBwcmludCAiJXMvJXMiICUgKHRhcmluZm8udW5hbWUgb3IgdGFyaW5mby51aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLmduYW1lIG9yIHRhcmluZm8uZ2lkKSwKKyAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmlzY2hyKCkgb3IgdGFyaW5mby5pc2JsaygpOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiJTEwcyIgJSAoIiVkLCVkIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh0YXJpbmZvLmRldm1ham9yLCB0YXJpbmZvLmRldm1pbm9yKSksCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiUxMGQiICUgdGFyaW5mby5zaXplLAorICAgICAgICAgICAgICAgIHByaW50ICIlZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAlIHRpbWUubG9jYWx0aW1lKHRhcmluZm8ubXRpbWUpWzo2XSwKKworICAgICAgICAgICAgcHJpbnQgdGFyaW5mby5uYW1lICsgKCIvIiBpZiB0YXJpbmZvLmlzZGlyKCkgZWxzZSAiIiksCisKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiLT4iLCB0YXJpbmZvLmxpbmtuYW1lLAorICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uaXNsbmsoKToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgImxpbmsgdG8iLCB0YXJpbmZvLmxpbmtuYW1lLAorICAgICAgICAgICAgcHJpbnQKKworICAgIGRlZiBhZGQoc2VsZiwgbmFtZSwgYXJjbmFtZT1Ob25lLCByZWN1cnNpdmU9VHJ1ZSwgZXhjbHVkZT1Ob25lLCBmaWx0ZXI9Tm9uZSk6CisgICAgICAgICIiIkFkZCB0aGUgZmlsZSBgbmFtZScgdG8gdGhlIGFyY2hpdmUuIGBuYW1lJyBtYXkgYmUgYW55IHR5cGUgb2YgZmlsZQorICAgICAgICAgICAoZGlyZWN0b3J5LCBmaWZvLCBzeW1ib2xpYyBsaW5rLCBldGMuKS4gSWYgZ2l2ZW4sIGBhcmNuYW1lJworICAgICAgICAgICBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhlIGZpbGUgaW4gdGhlIGFyY2hpdmUuCisgICAgICAgICAgIERpcmVjdG9yaWVzIGFyZSBhZGRlZCByZWN1cnNpdmVseSBieSBkZWZhdWx0LiBUaGlzIGNhbiBiZSBhdm9pZGVkIGJ5CisgICAgICAgICAgIHNldHRpbmcgYHJlY3Vyc2l2ZScgdG8gRmFsc2UuIGBleGNsdWRlJyBpcyBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkCisgICAgICAgICAgIHJldHVybiBUcnVlIGZvciBlYWNoIGZpbGVuYW1lIHRvIGJlIGV4Y2x1ZGVkLiBgZmlsdGVyJyBpcyBhIGZ1bmN0aW9uCisgICAgICAgICAgIHRoYXQgZXhwZWN0cyBhIFRhckluZm8gb2JqZWN0IGFyZ3VtZW50IGFuZCByZXR1cm5zIHRoZSBjaGFuZ2VkCisgICAgICAgICAgIFRhckluZm8gb2JqZWN0LCBpZiBpdCByZXR1cm5zIE5vbmUgdGhlIFRhckluZm8gb2JqZWN0IHdpbGwgYmUKKyAgICAgICAgICAgZXhjbHVkZWQgZnJvbSB0aGUgYXJjaGl2ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrKCJhdyIpCisKKyAgICAgICAgaWYgYXJjbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgYXJjbmFtZSA9IG5hbWUKKworICAgICAgICAjIEV4Y2x1ZGUgcGF0aG5hbWVzLgorICAgICAgICBpZiBleGNsdWRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJ1c2UgdGhlIGZpbHRlciBhcmd1bWVudCBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgICAgICAgICAgaWYgZXhjbHVkZShuYW1lKToKKyAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgInRhcmZpbGU6IEV4Y2x1ZGVkICVyIiAlIG5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBTa2lwIGlmIHNvbWVib2R5IHRyaWVzIHRvIGFyY2hpdmUgdGhlIGFyY2hpdmUuLi4KKyAgICAgICAgaWYgc2VsZi5uYW1lIGlzIG5vdCBOb25lIGFuZCBvcy5wYXRoLmFic3BhdGgobmFtZSkgPT0gc2VsZi5uYW1lOgorICAgICAgICAgICAgc2VsZi5fZGJnKDIsICJ0YXJmaWxlOiBTa2lwcGVkICVyIiAlIG5hbWUpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLl9kYmcoMSwgbmFtZSkKKworICAgICAgICAjIENyZWF0ZSBhIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIGZpbGUuCisgICAgICAgIHRhcmluZm8gPSBzZWxmLmdldHRhcmluZm8obmFtZSwgYXJjbmFtZSkKKworICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6IFVuc3VwcG9ydGVkIHR5cGUgJXIiICUgbmFtZSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgQ2hhbmdlIG9yIGV4Y2x1ZGUgdGhlIFRhckluZm8gb2JqZWN0LgorICAgICAgICBpZiBmaWx0ZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0YXJpbmZvID0gZmlsdGVyKHRhcmluZm8pCisgICAgICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICJ0YXJmaWxlOiBFeGNsdWRlZCAlciIgJSBuYW1lKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgQXBwZW5kIHRoZSB0YXIgaGVhZGVyIGFuZCBkYXRhIHRvIHRoZSBhcmNoaXZlLgorICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCk6CisgICAgICAgICAgICB3aXRoIGJsdG5fb3BlbihuYW1lLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkZmlsZSh0YXJpbmZvLCBmKQorCisgICAgICAgIGVsaWYgdGFyaW5mby5pc2RpcigpOgorICAgICAgICAgICAgc2VsZi5hZGRmaWxlKHRhcmluZm8pCisgICAgICAgICAgICBpZiByZWN1cnNpdmU6CisgICAgICAgICAgICAgICAgZm9yIGYgaW4gb3MubGlzdGRpcihuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGQob3MucGF0aC5qb2luKG5hbWUsIGYpLCBvcy5wYXRoLmpvaW4oYXJjbmFtZSwgZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlLCBleGNsdWRlLCBmaWx0ZXIpCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYWRkZmlsZSh0YXJpbmZvKQorCisgICAgZGVmIGFkZGZpbGUoc2VsZiwgdGFyaW5mbywgZmlsZW9iaj1Ob25lKToKKyAgICAgICAgIiIiQWRkIHRoZSBUYXJJbmZvIG9iamVjdCBgdGFyaW5mbycgdG8gdGhlIGFyY2hpdmUuIElmIGBmaWxlb2JqJyBpcworICAgICAgICAgICBnaXZlbiwgdGFyaW5mby5zaXplIGJ5dGVzIGFyZSByZWFkIGZyb20gaXQgYW5kIGFkZGVkIHRvIHRoZSBhcmNoaXZlLgorICAgICAgICAgICBZb3UgY2FuIGNyZWF0ZSBUYXJJbmZvIG9iamVjdHMgdXNpbmcgZ2V0dGFyaW5mbygpLgorICAgICAgICAgICBPbiBXaW5kb3dzIHBsYXRmb3JtcywgYGZpbGVvYmonIHNob3VsZCBhbHdheXMgYmUgb3BlbmVkIHdpdGggbW9kZQorICAgICAgICAgICAncmInIHRvIGF2b2lkIGlycml0YXRpb24gYWJvdXQgdGhlIGZpbGUgc2l6ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrKCJhdyIpCisKKyAgICAgICAgdGFyaW5mbyA9IGNvcHkuY29weSh0YXJpbmZvKQorCisgICAgICAgIGJ1ZiA9IHRhcmluZm8udG9idWYoc2VsZi5mb3JtYXQsIHNlbGYuZW5jb2RpbmcsIHNlbGYuZXJyb3JzKQorICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQorICAgICAgICBzZWxmLm9mZnNldCArPSBsZW4oYnVmKQorCisgICAgICAgICMgSWYgdGhlcmUncyBkYXRhIHRvIGZvbGxvdywgYXBwZW5kIGl0LgorICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29weWZpbGVvYmooZmlsZW9iaiwgc2VsZi5maWxlb2JqLCB0YXJpbmZvLnNpemUpCisgICAgICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZCh0YXJpbmZvLnNpemUsIEJMT0NLU0laRSkKKyAgICAgICAgICAgIGlmIHJlbWFpbmRlciA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKE5VTCAqIChCTE9DS1NJWkUgLSByZW1haW5kZXIpKQorICAgICAgICAgICAgICAgIGJsb2NrcyArPSAxCisgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBibG9ja3MgKiBCTE9DS1NJWkUKKworICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKHRhcmluZm8pCisKKyAgICBkZWYgZXh0cmFjdGFsbChzZWxmLCBwYXRoPSIuIiwgbWVtYmVycz1Ob25lKToKKyAgICAgICAgIiIiRXh0cmFjdCBhbGwgbWVtYmVycyBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKKyAgICAgICAgICAgZGlyZWN0b3J5IGFuZCBzZXQgb3duZXIsIG1vZGlmaWNhdGlvbiB0aW1lIGFuZCBwZXJtaXNzaW9ucyBvbgorICAgICAgICAgICBkaXJlY3RvcmllcyBhZnRlcndhcmRzLiBgcGF0aCcgc3BlY2lmaWVzIGEgZGlmZmVyZW50IGRpcmVjdG9yeQorICAgICAgICAgICB0byBleHRyYWN0IHRvLiBgbWVtYmVycycgaXMgb3B0aW9uYWwgYW5kIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlCisgICAgICAgICAgIGxpc3QgcmV0dXJuZWQgYnkgZ2V0bWVtYmVycygpLgorICAgICAgICAiIiIKKyAgICAgICAgZGlyZWN0b3JpZXMgPSBbXQorCisgICAgICAgIGlmIG1lbWJlcnMgaXMgTm9uZToKKyAgICAgICAgICAgIG1lbWJlcnMgPSBzZWxmCisKKyAgICAgICAgZm9yIHRhcmluZm8gaW4gbWVtYmVyczoKKyAgICAgICAgICAgIGlmIHRhcmluZm8uaXNkaXIoKToKKyAgICAgICAgICAgICAgICAjIEV4dHJhY3QgZGlyZWN0b3JpZXMgd2l0aCBhIHNhZmUgbW9kZS4KKyAgICAgICAgICAgICAgICBkaXJlY3Rvcmllcy5hcHBlbmQodGFyaW5mbykKKyAgICAgICAgICAgICAgICB0YXJpbmZvID0gY29weS5jb3B5KHRhcmluZm8pCisgICAgICAgICAgICAgICAgdGFyaW5mby5tb2RlID0gMDcwMAorICAgICAgICAgICAgc2VsZi5leHRyYWN0KHRhcmluZm8sIHBhdGgpCisKKyAgICAgICAgIyBSZXZlcnNlIHNvcnQgZGlyZWN0b3JpZXMuCisgICAgICAgIGRpcmVjdG9yaWVzLnNvcnQoa2V5PW9wZXJhdG9yLmF0dHJnZXR0ZXIoJ25hbWUnKSkKKyAgICAgICAgZGlyZWN0b3JpZXMucmV2ZXJzZSgpCisKKyAgICAgICAgIyBTZXQgY29ycmVjdCBvd25lciwgbXRpbWUgYW5kIGZpbGVtb2RlIG9uIGRpcmVjdG9yaWVzLgorICAgICAgICBmb3IgdGFyaW5mbyBpbiBkaXJlY3RvcmllczoKKyAgICAgICAgICAgIGRpcnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgdGFyaW5mby5uYW1lKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY2hvd24odGFyaW5mbywgZGlycGF0aCkKKyAgICAgICAgICAgICAgICBzZWxmLnV0aW1lKHRhcmluZm8sIGRpcnBhdGgpCisgICAgICAgICAgICAgICAgc2VsZi5jaG1vZCh0YXJpbmZvLCBkaXJwYXRoKQorICAgICAgICAgICAgZXhjZXB0IEV4dHJhY3RFcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmVycm9ybGV2ZWwgPiAxOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMiICUgZSkKKworICAgIGRlZiBleHRyYWN0KHNlbGYsIG1lbWJlciwgcGF0aD0iIik6CisgICAgICAgICIiIkV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwKKyAgICAgICAgICAgdXNpbmcgaXRzIGZ1bGwgbmFtZS4gSXRzIGZpbGUgaW5mb3JtYXRpb24gaXMgZXh0cmFjdGVkIGFzIGFjY3VyYXRlbHkKKyAgICAgICAgICAgYXMgcG9zc2libGUuIGBtZW1iZXInIG1heSBiZSBhIGZpbGVuYW1lIG9yIGEgVGFySW5mbyBvYmplY3QuIFlvdSBjYW4KKyAgICAgICAgICAgc3BlY2lmeSBhIGRpZmZlcmVudCBkaXJlY3RvcnkgdXNpbmcgYHBhdGgnLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2hlY2soInIiKQorCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVtYmVyLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLmdldG1lbWJlcihtZW1iZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXJpbmZvID0gbWVtYmVyCisKKyAgICAgICAgIyBQcmVwYXJlIHRoZSBsaW5rIHRhcmdldCBmb3IgbWFrZWxpbmsoKS4KKyAgICAgICAgaWYgdGFyaW5mby5pc2xuaygpOgorICAgICAgICAgICAgdGFyaW5mby5fbGlua190YXJnZXQgPSBvcy5wYXRoLmpvaW4ocGF0aCwgdGFyaW5mby5saW5rbmFtZSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9leHRyYWN0X21lbWJlcih0YXJpbmZvLCBvcy5wYXRoLmpvaW4ocGF0aCwgdGFyaW5mby5uYW1lKSkKKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CisgICAgICAgICAgICBpZiBzZWxmLmVycm9ybGV2ZWwgPiAwOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGUuZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiAlcyIgJSBlLnN0cmVycm9yKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMgJXIiICUgKGUuc3RyZXJyb3IsIGUuZmlsZW5hbWUpKQorICAgICAgICBleGNlcHQgRXh0cmFjdEVycm9yLCBlOgorICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmxldmVsID4gMToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6ICVzIiAlIGUpCisKKyAgICBkZWYgZXh0cmFjdGZpbGUoc2VsZiwgbWVtYmVyKToKKyAgICAgICAgIiIiRXh0cmFjdCBhIG1lbWJlciBmcm9tIHRoZSBhcmNoaXZlIGFzIGEgZmlsZSBvYmplY3QuIGBtZW1iZXInIG1heSBiZQorICAgICAgICAgICBhIGZpbGVuYW1lIG9yIGEgVGFySW5mbyBvYmplY3QuIElmIGBtZW1iZXInIGlzIGEgcmVndWxhciBmaWxlLCBhCisgICAgICAgICAgIGZpbGUtbGlrZSBvYmplY3QgaXMgcmV0dXJuZWQuIElmIGBtZW1iZXInIGlzIGEgbGluaywgYSBmaWxlLWxpa2UKKyAgICAgICAgICAgb2JqZWN0IGlzIGNvbnN0cnVjdGVkIGZyb20gdGhlIGxpbmsncyB0YXJnZXQuIElmIGBtZW1iZXInIGlzIG5vbmUgb2YKKyAgICAgICAgICAgdGhlIGFib3ZlLCBOb25lIGlzIHJldHVybmVkLgorICAgICAgICAgICBUaGUgZmlsZS1saWtlIG9iamVjdCBpcyByZWFkLW9ubHkgYW5kIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgbWV0aG9kczogcmVhZCgpLCByZWFkbGluZSgpLCByZWFkbGluZXMoKSwgc2VlaygpIGFuZCB0ZWxsKCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrKCJyIikKKworICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5nZXRtZW1iZXIobWVtYmVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgorCisgICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmplY3Qoc2VsZiwgdGFyaW5mbykKKworICAgICAgICBlbGlmIHRhcmluZm8udHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgorICAgICAgICAgICAgIyBJZiBhIG1lbWJlcidzIHR5cGUgaXMgdW5rbm93biwgaXQgaXMgdHJlYXRlZCBhcyBhCisgICAgICAgICAgICAjIHJlZ3VsYXIgZmlsZS4KKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmplY3Qoc2VsZiwgdGFyaW5mbykKKworICAgICAgICBlbGlmIHRhcmluZm8uaXNsbmsoKSBvciB0YXJpbmZvLmlzc3ltKCk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZmlsZW9iaiwgX1N0cmVhbSk6CisgICAgICAgICAgICAgICAgIyBBIHNtYWxsIGJ1dCB1Z2x5IHdvcmthcm91bmQgZm9yIHRoZSBjYXNlIHRoYXQgc29tZW9uZSB0cmllcworICAgICAgICAgICAgICAgICMgdG8gZXh0cmFjdCBhIChzeW0pbGluayBhcyBhIGZpbGUtb2JqZWN0IGZyb20gYSBub24tc2Vla2FibGUKKyAgICAgICAgICAgICAgICAjIHN0cmVhbSBvZiB0YXIgYmxvY2tzLgorICAgICAgICAgICAgICAgIHJhaXNlIFN0cmVhbUVycm9yKCJjYW5ub3QgZXh0cmFjdCAoc3ltKWxpbmsgYXMgZmlsZSBvYmplY3QiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEEgKHN5bSlsaW5rJ3MgZmlsZSBvYmplY3QgaXMgaXRzIHRhcmdldCdzIGZpbGUgb2JqZWN0LgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmV4dHJhY3RmaWxlKHNlbGYuX2ZpbmRfbGlua190YXJnZXQodGFyaW5mbykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIElmIHRoZXJlJ3Mgbm8gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lbWJlciAoZGlyZWN0b3J5LCBjaHJkZXYsCisgICAgICAgICAgICAjIGJsa2RldiwgZXRjLiksIHJldHVybiBOb25lIGluc3RlYWQgb2YgYSBmaWxlIG9iamVjdC4KKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX2V4dHJhY3RfbWVtYmVyKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJFeHRyYWN0IHRoZSBUYXJJbmZvIG9iamVjdCB0YXJpbmZvIHRvIGEgcGh5c2ljYWwKKyAgICAgICAgICAgZmlsZSBjYWxsZWQgdGFyZ2V0cGF0aC4KKyAgICAgICAgIiIiCisgICAgICAgICMgRmV0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZvciB0aGUgZ2l2ZW4gbmFtZQorICAgICAgICAjIGFuZCBidWlsZCB0aGUgZGVzdGluYXRpb24gcGF0aG5hbWUsIHJlcGxhY2luZworICAgICAgICAjIGZvcndhcmQgc2xhc2hlcyB0byBwbGF0Zm9ybSBzcGVjaWZpYyBzZXBhcmF0b3JzLgorICAgICAgICB0YXJnZXRwYXRoID0gdGFyZ2V0cGF0aC5yc3RyaXAoIi8iKQorICAgICAgICB0YXJnZXRwYXRoID0gdGFyZ2V0cGF0aC5yZXBsYWNlKCIvIiwgb3Muc2VwKQorCisgICAgICAgICMgQ3JlYXRlIGFsbCB1cHBlciBkaXJlY3Rvcmllcy4KKyAgICAgICAgdXBwZXJkaXJzID0gb3MucGF0aC5kaXJuYW1lKHRhcmdldHBhdGgpCisgICAgICAgIGlmIHVwcGVyZGlycyBhbmQgbm90IG9zLnBhdGguZXhpc3RzKHVwcGVyZGlycyk6CisgICAgICAgICAgICAjIENyZWF0ZSBkaXJlY3RvcmllcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgYXJjaGl2ZSB3aXRoCisgICAgICAgICAgICAjIGRlZmF1bHQgcGVybWlzc2lvbnMuCisgICAgICAgICAgICBvcy5tYWtlZGlycyh1cHBlcmRpcnMpCisKKyAgICAgICAgaWYgdGFyaW5mby5pc2xuaygpIG9yIHRhcmluZm8uaXNzeW0oKToKKyAgICAgICAgICAgIHNlbGYuX2RiZygxLCAiJXMgLT4gJXMiICUgKHRhcmluZm8ubmFtZSwgdGFyaW5mby5saW5rbmFtZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9kYmcoMSwgdGFyaW5mby5uYW1lKQorCisgICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKToKKyAgICAgICAgICAgIHNlbGYubWFrZWZpbGUodGFyaW5mbywgdGFyZ2V0cGF0aCkKKyAgICAgICAgZWxpZiB0YXJpbmZvLmlzZGlyKCk6CisgICAgICAgICAgICBzZWxmLm1ha2VkaXIodGFyaW5mbywgdGFyZ2V0cGF0aCkKKyAgICAgICAgZWxpZiB0YXJpbmZvLmlzZmlmbygpOgorICAgICAgICAgICAgc2VsZi5tYWtlZmlmbyh0YXJpbmZvLCB0YXJnZXRwYXRoKQorICAgICAgICBlbGlmIHRhcmluZm8uaXNjaHIoKSBvciB0YXJpbmZvLmlzYmxrKCk6CisgICAgICAgICAgICBzZWxmLm1ha2VkZXYodGFyaW5mbywgdGFyZ2V0cGF0aCkKKyAgICAgICAgZWxpZiB0YXJpbmZvLmlzbG5rKCkgb3IgdGFyaW5mby5pc3N5bSgpOgorICAgICAgICAgICAgc2VsZi5tYWtlbGluayh0YXJpbmZvLCB0YXJnZXRwYXRoKQorICAgICAgICBlbGlmIHRhcmluZm8udHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgorICAgICAgICAgICAgc2VsZi5tYWtldW5rbm93bih0YXJpbmZvLCB0YXJnZXRwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5tYWtlZmlsZSh0YXJpbmZvLCB0YXJnZXRwYXRoKQorCisgICAgICAgIHNlbGYuY2hvd24odGFyaW5mbywgdGFyZ2V0cGF0aCkKKyAgICAgICAgaWYgbm90IHRhcmluZm8uaXNzeW0oKToKKyAgICAgICAgICAgIHNlbGYuY2htb2QodGFyaW5mbywgdGFyZ2V0cGF0aCkKKyAgICAgICAgICAgIHNlbGYudXRpbWUodGFyaW5mbywgdGFyZ2V0cGF0aCkKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgQmVsb3cgYXJlIHRoZSBkaWZmZXJlbnQgZmlsZSBtZXRob2RzLiBUaGV5IGFyZSBjYWxsZWQgdmlhCisgICAgIyBfZXh0cmFjdF9tZW1iZXIoKSB3aGVuIGV4dHJhY3QoKSBpcyBjYWxsZWQuIFRoZXkgY2FuIGJlIHJlcGxhY2VkIGluIGEKKyAgICAjIHN1YmNsYXNzIHRvIGltcGxlbWVudCBvdGhlciBmdW5jdGlvbmFsaXR5LgorCisgICAgZGVmIG1ha2VkaXIoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CisgICAgICAgICIiIk1ha2UgYSBkaXJlY3RvcnkgY2FsbGVkIHRhcmdldHBhdGguCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFVzZSBhIHNhZmUgbW9kZSBmb3IgdGhlIGRpcmVjdG9yeSwgdGhlIHJlYWwgbW9kZSBpcyBzZXQKKyAgICAgICAgICAgICMgbGF0ZXIgaW4gX2V4dHJhY3RfbWVtYmVyKCkuCisgICAgICAgICAgICBvcy5ta2Rpcih0YXJnZXRwYXRoLCAwNzAwKQorICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgbWFrZWZpbGUoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CisgICAgICAgICIiIk1ha2UgYSBmaWxlIGNhbGxlZCB0YXJnZXRwYXRoLgorICAgICAgICAiIiIKKyAgICAgICAgc291cmNlID0gc2VsZi5leHRyYWN0ZmlsZSh0YXJpbmZvKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIGJsdG5fb3Blbih0YXJnZXRwYXRoLCAid2IiKSBhcyB0YXJnZXQ6CisgICAgICAgICAgICAgICAgY29weWZpbGVvYmooc291cmNlLCB0YXJnZXQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb3VyY2UuY2xvc2UoKQorCisgICAgZGVmIG1ha2V1bmtub3duKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJNYWtlIGEgZmlsZSBmcm9tIGEgVGFySW5mbyBvYmplY3Qgd2l0aCBhbiB1bmtub3duIHR5cGUKKyAgICAgICAgICAgYXQgdGFyZ2V0cGF0aC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubWFrZWZpbGUodGFyaW5mbywgdGFyZ2V0cGF0aCkKKyAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiBVbmtub3duIGZpbGUgdHlwZSAlciwgIiBcCisgICAgICAgICAgICAgICAgICAgICAiZXh0cmFjdGVkIGFzIHJlZ3VsYXIgZmlsZS4iICUgdGFyaW5mby50eXBlKQorCisgICAgZGVmIG1ha2VmaWZvKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJNYWtlIGEgZmlmbyBjYWxsZWQgdGFyZ2V0cGF0aC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGhhc2F0dHIob3MsICJta2ZpZm8iKToKKyAgICAgICAgICAgIG9zLm1rZmlmbyh0YXJnZXRwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJmaWZvIG5vdCBzdXBwb3J0ZWQgYnkgc3lzdGVtIikKKworICAgIGRlZiBtYWtlZGV2KHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJNYWtlIGEgY2hhcmFjdGVyIG9yIGJsb2NrIGRldmljZSBjYWxsZWQgdGFyZ2V0cGF0aC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAibWtub2QiKSBvciBub3QgaGFzYXR0cihvcywgIm1ha2VkZXYiKToKKyAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigic3BlY2lhbCBkZXZpY2VzIG5vdCBzdXBwb3J0ZWQgYnkgc3lzdGVtIikKKworICAgICAgICBtb2RlID0gdGFyaW5mby5tb2RlCisgICAgICAgIGlmIHRhcmluZm8uaXNibGsoKToKKyAgICAgICAgICAgIG1vZGUgfD0gc3RhdC5TX0lGQkxLCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2RlIHw9IHN0YXQuU19JRkNIUgorCisgICAgICAgIG9zLm1rbm9kKHRhcmdldHBhdGgsIG1vZGUsCisgICAgICAgICAgICAgICAgIG9zLm1ha2VkZXYodGFyaW5mby5kZXZtYWpvciwgdGFyaW5mby5kZXZtaW5vcikpCisKKyAgICBkZWYgbWFrZWxpbmsoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CisgICAgICAgICIiIk1ha2UgYSAoc3ltYm9saWMpIGxpbmsgY2FsbGVkIHRhcmdldHBhdGguIElmIGl0IGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICAgICAgKHBsYXRmb3JtIGxpbWl0YXRpb24pLCB3ZSB0cnkgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIHJlZmVyZW5jZWQgZmlsZQorICAgICAgICAgIGluc3RlYWQgb2YgYSBsaW5rLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKSBhbmQgaGFzYXR0cihvcywgImxpbmsiKToKKyAgICAgICAgICAgICMgRm9yIHN5c3RlbXMgdGhhdCBzdXBwb3J0IHN5bWJvbGljIGFuZCBoYXJkIGxpbmtzLgorICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGgubGV4aXN0cyh0YXJnZXRwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHRhcmdldHBhdGgpCisgICAgICAgICAgICAgICAgb3Muc3ltbGluayh0YXJpbmZvLmxpbmtuYW1lLCB0YXJnZXRwYXRoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFNlZSBleHRyYWN0KCkuCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGFyaW5mby5fbGlua190YXJnZXQpOgorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmxleGlzdHModGFyZ2V0cGF0aCk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsodGFyZ2V0cGF0aCkKKyAgICAgICAgICAgICAgICAgICAgb3MubGluayh0YXJpbmZvLl9saW5rX3RhcmdldCwgdGFyZ2V0cGF0aCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9leHRyYWN0X21lbWJlcihzZWxmLl9maW5kX2xpbmtfdGFyZ2V0KHRhcmluZm8pLCB0YXJnZXRwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2V4dHJhY3RfbWVtYmVyKHNlbGYuX2ZpbmRfbGlua190YXJnZXQodGFyaW5mbyksIHRhcmdldHBhdGgpCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJ1bmFibGUgdG8gcmVzb2x2ZSBsaW5rIGluc2lkZSBhcmNoaXZlIikKKworICAgIGRlZiBjaG93bihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKKyAgICAgICAgIiIiU2V0IG93bmVyIG9mIHRhcmdldHBhdGggYWNjb3JkaW5nIHRvIHRhcmluZm8uCisgICAgICAgICIiIgorICAgICAgICBpZiBwd2QgYW5kIGhhc2F0dHIob3MsICJnZXRldWlkIikgYW5kIG9zLmdldGV1aWQoKSA9PSAwOgorICAgICAgICAgICAgIyBXZSBoYXZlIHRvIGJlIHJvb3QgdG8gZG8gc28uCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZyA9IGdycC5nZXRncm5hbSh0YXJpbmZvLmduYW1lKVsyXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGcgPSB0YXJpbmZvLmdpZAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHUgPSBwd2QuZ2V0cHduYW0odGFyaW5mby51bmFtZSlbMl0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICB1ID0gdGFyaW5mby51aWQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmlzc3ltKCkgYW5kIGhhc2F0dHIob3MsICJsY2hvd24iKToKKyAgICAgICAgICAgICAgICAgICAgb3MubGNob3duKHRhcmdldHBhdGgsIHUsIGcpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICJvczJlbXgiOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2hvd24odGFyZ2V0cGF0aCwgdSwgZykKKyAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigiY291bGQgbm90IGNoYW5nZSBvd25lciIpCisKKyAgICBkZWYgY2htb2Qoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CisgICAgICAgICIiIlNldCBmaWxlIHBlcm1pc3Npb25zIG9mIHRhcmdldHBhdGggYWNjb3JkaW5nIHRvIHRhcmluZm8uCisgICAgICAgICIiIgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAnY2htb2QnKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5jaG1vZCh0YXJnZXRwYXRoLCB0YXJpbmZvLm1vZGUpCisgICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciwgZToKKyAgICAgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImNvdWxkIG5vdCBjaGFuZ2UgbW9kZSIpCisKKyAgICBkZWYgdXRpbWUoc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CisgICAgICAgICIiIlNldCBtb2RpZmljYXRpb24gdGltZSBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICd1dGltZScpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnV0aW1lKHRhcmdldHBhdGgsICh0YXJpbmZvLm10aW1lLCB0YXJpbmZvLm10aW1lKSkKKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CisgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImNvdWxkIG5vdCBjaGFuZ2UgbW9kaWZpY2F0aW9uIHRpbWUiKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBtZW1iZXIgb2YgdGhlIGFyY2hpdmUgYXMgYSBUYXJJbmZvIG9iamVjdCwgd2hlbgorICAgICAgICAgICBUYXJGaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZy4gUmV0dXJuIE5vbmUgaWYgdGhlcmUgaXMgbm8gbW9yZQorICAgICAgICAgICBhdmFpbGFibGUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVjaygicmEiKQorICAgICAgICBpZiBzZWxmLmZpcnN0bWVtYmVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbSA9IHNlbGYuZmlyc3RtZW1iZXIKKyAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCisgICAgICAgICAgICByZXR1cm4gbQorCisgICAgICAgICMgUmVhZCB0aGUgbmV4dCBibG9jay4KKyAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5vZmZzZXQpCisgICAgICAgIHRhcmluZm8gPSBOb25lCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyaW5mby5mcm9tdGFyZmlsZShzZWxmKQorICAgICAgICAgICAgZXhjZXB0IEVPRkhlYWRlckVycm9yLCBlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaWdub3JlX3plcm9zOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMiwgIjB4JVg6ICVzIiAlIChzZWxmLm9mZnNldCwgZSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZXhjZXB0IEludmFsaWRIZWFkZXJFcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmlnbm9yZV96ZXJvczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICIweCVYOiAlcyIgJSAoc2VsZi5vZmZzZXQsIGUpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYub2Zmc2V0ID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcihzdHIoZSkpCisgICAgICAgICAgICBleGNlcHQgRW1wdHlIZWFkZXJFcnJvcjoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLm9mZnNldCA9PSAwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoImVtcHR5IGZpbGUiKQorICAgICAgICAgICAgZXhjZXB0IFRydW5jYXRlZEhlYWRlckVycm9yLCBlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYub2Zmc2V0ID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcihzdHIoZSkpCisgICAgICAgICAgICBleGNlcHQgU3Vic2VxdWVudEhlYWRlckVycm9yLCBlOgorICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcihzdHIoZSkpCisgICAgICAgICAgICBicmVhaworCisgICAgICAgIGlmIHRhcmluZm8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLm1lbWJlcnMuYXBwZW5kKHRhcmluZm8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9sb2FkZWQgPSBUcnVlCisKKyAgICAgICAgcmV0dXJuIHRhcmluZm8KKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgTGl0dGxlIGhlbHBlciBtZXRob2RzOgorCisgICAgZGVmIF9nZXRtZW1iZXIoc2VsZiwgbmFtZSwgdGFyaW5mbz1Ob25lLCBub3JtYWxpemU9RmFsc2UpOgorICAgICAgICAiIiJGaW5kIGFuIGFyY2hpdmUgbWVtYmVyIGJ5IG5hbWUgZnJvbSBib3R0b20gdG8gdG9wLgorICAgICAgICAgICBJZiB0YXJpbmZvIGlzIGdpdmVuLCBpdCBpcyB1c2VkIGFzIHRoZSBzdGFydGluZyBwb2ludC4KKyAgICAgICAgIiIiCisgICAgICAgICMgRW5zdXJlIHRoYXQgYWxsIG1lbWJlcnMgaGF2ZSBiZWVuIGxvYWRlZC4KKyAgICAgICAgbWVtYmVycyA9IHNlbGYuZ2V0bWVtYmVycygpCisKKyAgICAgICAgIyBMaW1pdCB0aGUgbWVtYmVyIHNlYXJjaCBsaXN0IHVwIHRvIHRhcmluZm8uCisgICAgICAgIGlmIHRhcmluZm8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBtZW1iZXJzID0gbWVtYmVyc1s6bWVtYmVycy5pbmRleCh0YXJpbmZvKV0KKworICAgICAgICBpZiBub3JtYWxpemU6CisgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5ub3JtcGF0aChuYW1lKQorCisgICAgICAgIGZvciBtZW1iZXIgaW4gcmV2ZXJzZWQobWVtYmVycyk6CisgICAgICAgICAgICBpZiBub3JtYWxpemU6CisgICAgICAgICAgICAgICAgbWVtYmVyX25hbWUgPSBvcy5wYXRoLm5vcm1wYXRoKG1lbWJlci5uYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtZW1iZXJfbmFtZSA9IG1lbWJlci5uYW1lCisKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gbWVtYmVyX25hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlcgorCisgICAgZGVmIF9sb2FkKHNlbGYpOgorICAgICAgICAiIiJSZWFkIHRocm91Z2ggdGhlIGVudGlyZSBhcmNoaXZlIGZpbGUgYW5kIGxvb2sgZm9yIHJlYWRhYmxlCisgICAgICAgICAgIG1lbWJlcnMuCisgICAgICAgICIiIgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYubmV4dCgpCisgICAgICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5fbG9hZGVkID0gVHJ1ZQorCisgICAgZGVmIF9jaGVjayhzZWxmLCBtb2RlPU5vbmUpOgorICAgICAgICAiIiJDaGVjayBpZiBUYXJGaWxlIGlzIHN0aWxsIG9wZW4sIGFuZCBpZiB0aGUgb3BlcmF0aW9uJ3MgbW9kZQorICAgICAgICAgICBjb3JyZXNwb25kcyB0byBUYXJGaWxlJ3MgbW9kZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiJXMgaXMgY2xvc2VkIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fKQorICAgICAgICBpZiBtb2RlIGlzIG5vdCBOb25lIGFuZCBzZWxmLm1vZGUgbm90IGluIG1vZGU6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJiYWQgb3BlcmF0aW9uIGZvciBtb2RlICVyIiAlIHNlbGYubW9kZSkKKworICAgIGRlZiBfZmluZF9saW5rX3RhcmdldChzZWxmLCB0YXJpbmZvKToKKyAgICAgICAgIiIiRmluZCB0aGUgdGFyZ2V0IG1lbWJlciBvZiBhIHN5bWxpbmsgb3IgaGFyZGxpbmsgbWVtYmVyIGluIHRoZQorICAgICAgICAgICBhcmNoaXZlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgorICAgICAgICAgICAgIyBBbHdheXMgc2VhcmNoIHRoZSBlbnRpcmUgYXJjaGl2ZS4KKyAgICAgICAgICAgIGxpbmtuYW1lID0gIi8iLmpvaW4oZmlsdGVyKE5vbmUsIChvcy5wYXRoLmRpcm5hbWUodGFyaW5mby5uYW1lKSwgdGFyaW5mby5saW5rbmFtZSkpKQorICAgICAgICAgICAgbGltaXQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFNlYXJjaCB0aGUgYXJjaGl2ZSBiZWZvcmUgdGhlIGxpbmssIGJlY2F1c2UgYSBoYXJkIGxpbmsgaXMKKyAgICAgICAgICAgICMganVzdCBhIHJlZmVyZW5jZSB0byBhbiBhbHJlYWR5IGFyY2hpdmVkIGZpbGUuCisgICAgICAgICAgICBsaW5rbmFtZSA9IHRhcmluZm8ubGlua25hbWUKKyAgICAgICAgICAgIGxpbWl0ID0gdGFyaW5mbworCisgICAgICAgIG1lbWJlciA9IHNlbGYuX2dldG1lbWJlcihsaW5rbmFtZSwgdGFyaW5mbz1saW1pdCwgbm9ybWFsaXplPVRydWUpCisgICAgICAgIGlmIG1lbWJlciBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoImxpbmtuYW1lICVyIG5vdCBmb3VuZCIgJSBsaW5rbmFtZSkKKyAgICAgICAgcmV0dXJuIG1lbWJlcgorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAiIiJQcm92aWRlIGFuIGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX2xvYWRlZDoKKyAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYubWVtYmVycykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBUYXJJdGVyKHNlbGYpCisKKyAgICBkZWYgX2RiZyhzZWxmLCBsZXZlbCwgbXNnKToKKyAgICAgICAgIiIiV3JpdGUgZGVidWdnaW5nIG91dHB1dCB0byBzeXMuc3RkZXJyLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGV2ZWwgPD0gc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZworCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2soKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICBpZiB0eXBlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQW4gZXhjZXB0aW9uIG9jY3VycmVkLiBXZSBtdXN0IG5vdCBjYWxsIGNsb3NlKCkgYmVjYXVzZQorICAgICAgICAgICAgIyBpdCB3b3VsZCB0cnkgdG8gd3JpdGUgZW5kLW9mLWFyY2hpdmUgYmxvY2tzIGFuZCBwYWRkaW5nLgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQorIyBjbGFzcyBUYXJGaWxlCisKK2NsYXNzIFRhckl0ZXI6CisgICAgIiIiSXRlcmF0b3IgQ2xhc3MuCisKKyAgICAgICBmb3IgdGFyaW5mbyBpbiBUYXJGaWxlKC4uLik6CisgICAgICAgICAgIHN1aXRlLi4uCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckl0ZXIgb2JqZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi50YXJmaWxlID0gdGFyZmlsZQorICAgICAgICBzZWxmLmluZGV4ID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGl0ZXJhdG9yIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBpdGVtIHVzaW5nIFRhckZpbGUncyBuZXh0KCkgbWV0aG9kLgorICAgICAgICAgICBXaGVuIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkLCBzZXQgVGFyRmlsZSBhcyBfbG9hZGVkLgorICAgICAgICAiIiIKKyAgICAgICAgIyBGaXggZm9yIFNGICMxMTAwNDI5OiBVbmRlciByYXJlIGNpcmN1bXN0YW5jZXMgaXQgY2FuCisgICAgICAgICMgaGFwcGVuIHRoYXQgZ2V0bWVtYmVycygpIGlzIGNhbGxlZCBkdXJpbmcgaXRlcmF0aW9uLAorICAgICAgICAjIHdoaWNoIHdpbGwgY2F1c2UgVGFySXRlciB0byBzdG9wIHByZW1hdHVyZWx5LgorCisgICAgICAgIGlmIHNlbGYuaW5kZXggPT0gMCBhbmQgc2VsZi50YXJmaWxlLmZpcnN0bWVtYmVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyZmlsZS5uZXh0KCkKKyAgICAgICAgZWxpZiBzZWxmLmluZGV4IDwgbGVuKHNlbGYudGFyZmlsZS5tZW1iZXJzKToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubWVtYmVyc1tzZWxmLmluZGV4XQorICAgICAgICBlbGlmIG5vdCBzZWxmLnRhcmZpbGUuX2xvYWRlZDoKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubmV4dCgpCisgICAgICAgICAgICBpZiBub3QgdGFyaW5mbzoKKyAgICAgICAgICAgICAgICBzZWxmLnRhcmZpbGUuX2xvYWRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHNlbGYuaW5kZXggKz0gMQorICAgICAgICByZXR1cm4gdGFyaW5mbworCisjIEhlbHBlciBjbGFzc2VzIGZvciBzcGFyc2UgZmlsZSBzdXBwb3J0CitjbGFzcyBfc2VjdGlvbjoKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBfZGF0YSBhbmQgX2hvbGUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9mZnNldCwgc2l6ZSk6CisgICAgICAgIHNlbGYub2Zmc2V0ID0gb2Zmc2V0CisgICAgICAgIHNlbGYuc2l6ZSA9IHNpemUKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIG9mZnNldCk6CisgICAgICAgIHJldHVybiBzZWxmLm9mZnNldCA8PSBvZmZzZXQgPCBzZWxmLm9mZnNldCArIHNlbGYuc2l6ZQorCitjbGFzcyBfZGF0YShfc2VjdGlvbik6CisgICAgIiIiUmVwcmVzZW50IGEgZGF0YSBzZWN0aW9uIGluIGEgc3BhcnNlIGZpbGUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9mZnNldCwgc2l6ZSwgcmVhbHBvcyk6CisgICAgICAgIF9zZWN0aW9uLl9faW5pdF9fKHNlbGYsIG9mZnNldCwgc2l6ZSkKKyAgICAgICAgc2VsZi5yZWFscG9zID0gcmVhbHBvcworCitjbGFzcyBfaG9sZShfc2VjdGlvbik6CisgICAgIiIiUmVwcmVzZW50IGEgaG9sZSBzZWN0aW9uIGluIGEgc3BhcnNlIGZpbGUuCisgICAgIiIiCisgICAgcGFzcworCitjbGFzcyBfcmluZ2J1ZmZlcihsaXN0KToKKyAgICAiIiJSaW5nYnVmZmVyIGNsYXNzIHdoaWNoIGluY3JlYXNlcyBwZXJmb3JtYW5jZQorICAgICAgIG92ZXIgYSByZWd1bGFyIGxpc3QuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmlkeCA9IDAKKyAgICBkZWYgZmluZChzZWxmLCBvZmZzZXQpOgorICAgICAgICBpZHggPSBzZWxmLmlkeAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaXRlbSA9IHNlbGZbaWR4XQorICAgICAgICAgICAgaWYgb2Zmc2V0IGluIGl0ZW06CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlkeCArPSAxCisgICAgICAgICAgICBpZiBpZHggPT0gbGVuKHNlbGYpOgorICAgICAgICAgICAgICAgIGlkeCA9IDAKKyAgICAgICAgICAgIGlmIGlkeCA9PSBzZWxmLmlkeDoKKyAgICAgICAgICAgICAgICAjIEVuZCBvZiBGaWxlCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgc2VsZi5pZHggPSBpZHgKKyAgICAgICAgcmV0dXJuIGl0ZW0KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB6aXBmaWxlIGNvbXBhdGlibGUgVGFyRmlsZSBjbGFzcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVEFSX1BMQUlOID0gMCAgICAgICAgICAgIyB6aXBmaWxlLlpJUF9TVE9SRUQKK1RBUl9HWklQUEVEID0gOCAgICAgICAgICMgemlwZmlsZS5aSVBfREVGTEFURUQKK2NsYXNzIFRhckZpbGVDb21wYXQ6CisgICAgIiIiVGFyRmlsZSBjbGFzcyBjb21wYXRpYmxlIHdpdGggc3RhbmRhcmQgbW9kdWxlIHppcGZpbGUncworICAgICAgIFppcEZpbGUgY2xhc3MuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIG1vZGU9InIiLCBjb21wcmVzc2lvbj1UQVJfUExBSU4pOgorICAgICAgICBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaworICAgICAgICB3YXJucHkzaygidGhlIFRhckZpbGVDb21wYXQgY2xhc3MgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwKKyAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIpCisgICAgICAgIGlmIGNvbXByZXNzaW9uID09IFRBUl9QTEFJTjoKKyAgICAgICAgICAgIHNlbGYudGFyZmlsZSA9IFRhckZpbGUudGFyb3BlbihmaWxlLCBtb2RlKQorICAgICAgICBlbGlmIGNvbXByZXNzaW9uID09IFRBUl9HWklQUEVEOgorICAgICAgICAgICAgc2VsZi50YXJmaWxlID0gVGFyRmlsZS5nem9wZW4oZmlsZSwgbW9kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24gY29tcHJlc3Npb24gY29uc3RhbnQiKQorICAgICAgICBpZiBtb2RlWzA6MV0gPT0gInIiOgorICAgICAgICAgICAgbWVtYmVycyA9IHNlbGYudGFyZmlsZS5nZXRtZW1iZXJzKCkKKyAgICAgICAgICAgIGZvciBtIGluIG1lbWJlcnM6CisgICAgICAgICAgICAgICAgbS5maWxlbmFtZSA9IG0ubmFtZQorICAgICAgICAgICAgICAgIG0uZmlsZV9zaXplID0gbS5zaXplCisgICAgICAgICAgICAgICAgbS5kYXRlX3RpbWUgPSB0aW1lLmdtdGltZShtLm10aW1lKVs6Nl0KKyAgICBkZWYgbmFtZWxpc3Qoc2VsZik6CisgICAgICAgIHJldHVybiBtYXAobGFtYmRhIG06IG0ubmFtZSwgc2VsZi5pbmZvbGlzdCgpKQorICAgIGRlZiBpbmZvbGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIGZpbHRlcihsYW1iZGEgbTogbS50eXBlIGluIFJFR1VMQVJfVFlQRVMsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi50YXJmaWxlLmdldG1lbWJlcnMoKSkKKyAgICBkZWYgcHJpbnRkaXIoc2VsZik6CisgICAgICAgIHNlbGYudGFyZmlsZS5saXN0KCkKKyAgICBkZWYgdGVzdHppcChzZWxmKToKKyAgICAgICAgcmV0dXJuCisgICAgZGVmIGdldGluZm8oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLnRhcmZpbGUuZ2V0bWVtYmVyKG5hbWUpCisgICAgZGVmIHJlYWQoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLnRhcmZpbGUuZXh0cmFjdGZpbGUoc2VsZi50YXJmaWxlLmdldG1lbWJlcihuYW1lKSkucmVhZCgpCisgICAgZGVmIHdyaXRlKHNlbGYsIGZpbGVuYW1lLCBhcmNuYW1lPU5vbmUsIGNvbXByZXNzX3R5cGU9Tm9uZSk6CisgICAgICAgIHNlbGYudGFyZmlsZS5hZGQoZmlsZW5hbWUsIGFyY25hbWUpCisgICAgZGVmIHdyaXRlc3RyKHNlbGYsIHppbmZvLCBieXRlcyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBpbXBvcnQgY2FsZW5kYXIKKyAgICAgICAgdGluZm8gPSBUYXJJbmZvKHppbmZvLmZpbGVuYW1lKQorICAgICAgICB0aW5mby5zaXplID0gbGVuKGJ5dGVzKQorICAgICAgICB0aW5mby5tdGltZSA9IGNhbGVuZGFyLnRpbWVnbSh6aW5mby5kYXRlX3RpbWUpCisgICAgICAgIHNlbGYudGFyZmlsZS5hZGRmaWxlKHRpbmZvLCBTdHJpbmdJTyhieXRlcykpCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLnRhcmZpbGUuY2xvc2UoKQorI2NsYXNzIFRhckZpbGVDb21wYXQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGV4cG9ydGVkIGZ1bmN0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWYgaXNfdGFyZmlsZShuYW1lKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBuYW1lIHBvaW50cyB0byBhIHRhciBhcmNoaXZlIHRoYXQgd2UKKyAgICAgICBhcmUgYWJsZSB0byBoYW5kbGUsIGVsc2UgcmV0dXJuIEZhbHNlLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgdCA9IG9wZW4obmFtZSkKKyAgICAgICAgdC5jbG9zZSgpCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZXhjZXB0IFRhckVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKworYmx0bl9vcGVuID0gb3Blbgorb3BlbiA9IFRhckZpbGUub3BlbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90YXJmaWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGFyZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5NmMwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGFyZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90YXJmaWxlLnB5byBiL2xpYi9weXRob24yLjcvdGFyZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM5NmMwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGFyZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZWxuZXRsaWIucHkgYi9saWIvcHl0aG9uMi43L3RlbG5ldGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjdlOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZWxuZXRsaWIucHkKQEAgLTAsMCArMSw3ODcgQEAKK3IiIiJURUxORVQgY2xpZW50IGNsYXNzLgorCitCYXNlZCBvbiBSRkMgODU0OiBURUxORVQgUHJvdG9jb2wgU3BlY2lmaWNhdGlvbiwgYnkgSi4gUG9zdGVsIGFuZAorSi4gUmV5bm9sZHMKKworRXhhbXBsZToKKworPj4+IGZyb20gdGVsbmV0bGliIGltcG9ydCBUZWxuZXQKKz4+PiB0biA9IFRlbG5ldCgnd3d3LnB5dGhvbi5vcmcnLCA3OSkgICAjIGNvbm5lY3QgdG8gZmluZ2VyIHBvcnQKKz4+PiB0bi53cml0ZSgnZ3VpZG9cclxuJykKKz4+PiBwcmludCB0bi5yZWFkX2FsbCgpCitMb2dpbiAgICAgICBOYW1lICAgICAgICAgICAgICAgVFRZICAgICAgICAgSWRsZSAgICBXaGVuICAgIFdoZXJlCitndWlkbyAgICBHdWlkbyB2YW4gUm9zc3VtICAgICAgcHRzLzIgICAgICAgIDxEZWMgIDIgMTE6MTA+IHNuYWcuY25yaS5yZXN0b24uLgorCis+Pj4KKworTm90ZSB0aGF0IHJlYWRfYWxsKCkgd29uJ3QgcmVhZCB1bnRpbCBlb2YgLS0gaXQganVzdCByZWFkcyBzb21lIGRhdGEKKy0tIGJ1dCBpdCBndWFyYW50ZWVzIHRvIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUgdW5sZXNzIEVPRiBpcyBoaXQuCisKK0l0IGlzIHBvc3NpYmxlIHRvIHBhc3MgYSBUZWxuZXQgb2JqZWN0IHRvIHNlbGVjdC5zZWxlY3QoKSBpbiBvcmRlciB0bword2FpdCB1bnRpbCBtb3JlIGRhdGEgaXMgYXZhaWxhYmxlLiAgTm90ZSB0aGF0IGluIHRoaXMgY2FzZSwKK3JlYWRfZWFnZXIoKSBtYXkgcmV0dXJuICcnIGV2ZW4gaWYgdGhlcmUgd2FzIGRhdGEgb24gdGhlIHNvY2tldCwKK2JlY2F1c2UgdGhlIHByb3RvY29sIG5lZ290aWF0aW9uIG1heSBoYXZlIGVhdGVuIHRoZSBkYXRhLiAgVGhpcyBpcyB3aHkKK0VPRkVycm9yIGlzIG5lZWRlZCBpbiBzb21lIGNhc2VzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gIm5vIGRhdGEiIGFuZAorImNvbm5lY3Rpb24gY2xvc2VkIiAoc2luY2UgdGhlIHNvY2tldCBhbHNvIGFwcGVhcnMgcmVhZHkgZm9yIHJlYWRpbmcKK3doZW4gaXQgaXMgY2xvc2VkKS4KKworVG8gZG86CistIG9wdGlvbiBuZWdvdGlhdGlvbgorLSB0aW1lb3V0IHNob3VsZCBiZSBpbnRyaW5zaWMgdG8gdGhlIGNvbm5lY3Rpb24gb2JqZWN0IGluc3RlYWQgb2YgYW4KKyAgb3B0aW9uIG9uIG9uZSBvZiB0aGUgcmVhZCBjYWxscyBvbmx5CisKKyIiIgorCisKKyMgSW1wb3J0ZWQgbW9kdWxlcworaW1wb3J0IGVycm5vCitpbXBvcnQgc3lzCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc2VsZWN0CisKK19fYWxsX18gPSBbIlRlbG5ldCJdCisKKyMgVHVuYWJsZSBwYXJhbWV0ZXJzCitERUJVR0xFVkVMID0gMAorCisjIFRlbG5ldCBwcm90b2NvbCBkZWZhdWx0cworVEVMTkVUX1BPUlQgPSAyMworCisjIFRlbG5ldCBwcm90b2NvbCBjaGFyYWN0ZXJzIChkb24ndCBjaGFuZ2UpCitJQUMgID0gY2hyKDI1NSkgIyAiSW50ZXJwcmV0IEFzIENvbW1hbmQiCitET05UID0gY2hyKDI1NCkKK0RPICAgPSBjaHIoMjUzKQorV09OVCA9IGNocigyNTIpCitXSUxMID0gY2hyKDI1MSkKK3RoZU5VTEwgPSBjaHIoMCkKKworU0UgID0gY2hyKDI0MCkgICMgU3VibmVnb3RpYXRpb24gRW5kCitOT1AgPSBjaHIoMjQxKSAgIyBObyBPcGVyYXRpb24KK0RNICA9IGNocigyNDIpICAjIERhdGEgTWFyaworQlJLID0gY2hyKDI0MykgICMgQnJlYWsKK0lQICA9IGNocigyNDQpICAjIEludGVycnVwdCBwcm9jZXNzCitBTyAgPSBjaHIoMjQ1KSAgIyBBYm9ydCBvdXRwdXQKK0FZVCA9IGNocigyNDYpICAjIEFyZSBZb3UgVGhlcmUKK0VDICA9IGNocigyNDcpICAjIEVyYXNlIENoYXJhY3RlcgorRUwgID0gY2hyKDI0OCkgICMgRXJhc2UgTGluZQorR0EgID0gY2hyKDI0OSkgICMgR28gQWhlYWQKK1NCID0gIGNocigyNTApICAjIFN1Ym5lZ290aWF0aW9uIEJlZ2luCisKKworIyBUZWxuZXQgcHJvdG9jb2wgb3B0aW9ucyBjb2RlIChkb24ndCBjaGFuZ2UpCisjIFRoZXNlIG9uZXMgYWxsIGNvbWUgZnJvbSBhcnBhL3RlbG5ldC5oCitCSU5BUlkgPSBjaHIoMCkgIyA4LWJpdCBkYXRhIHBhdGgKK0VDSE8gPSBjaHIoMSkgIyBlY2hvCitSQ1AgPSBjaHIoMikgIyBwcmVwYXJlIHRvIHJlY29ubmVjdAorU0dBID0gY2hyKDMpICMgc3VwcHJlc3MgZ28gYWhlYWQKK05BTVMgPSBjaHIoNCkgIyBhcHByb3hpbWF0ZSBtZXNzYWdlIHNpemUKK1NUQVRVUyA9IGNocig1KSAjIGdpdmUgc3RhdHVzCitUTSA9IGNocig2KSAjIHRpbWluZyBtYXJrCitSQ1RFID0gY2hyKDcpICMgcmVtb3RlIGNvbnRyb2xsZWQgdHJhbnNtaXNzaW9uIGFuZCBlY2hvCitOQU9MID0gY2hyKDgpICMgbmVnb3RpYXRlIGFib3V0IG91dHB1dCBsaW5lIHdpZHRoCitOQU9QID0gY2hyKDkpICMgbmVnb3RpYXRlIGFib3V0IG91dHB1dCBwYWdlIHNpemUKK05BT0NSRCA9IGNocigxMCkgIyBuZWdvdGlhdGUgYWJvdXQgQ1IgZGlzcG9zaXRpb24KK05BT0hUUyA9IGNocigxMSkgIyBuZWdvdGlhdGUgYWJvdXQgaG9yaXpvbnRhbCB0YWJzdG9wcworTkFPSFREID0gY2hyKDEyKSAjIG5lZ290aWF0ZSBhYm91dCBob3Jpem9udGFsIHRhYiBkaXNwb3NpdGlvbgorTkFPRkZEID0gY2hyKDEzKSAjIG5lZ290aWF0ZSBhYm91dCBmb3JtZmVlZCBkaXNwb3NpdGlvbgorTkFPVlRTID0gY2hyKDE0KSAjIG5lZ290aWF0ZSBhYm91dCB2ZXJ0aWNhbCB0YWIgc3RvcHMKK05BT1ZURCA9IGNocigxNSkgIyBuZWdvdGlhdGUgYWJvdXQgdmVydGljYWwgdGFiIGRpc3Bvc2l0aW9uCitOQU9MRkQgPSBjaHIoMTYpICMgbmVnb3RpYXRlIGFib3V0IG91dHB1dCBMRiBkaXNwb3NpdGlvbgorWEFTQ0lJID0gY2hyKDE3KSAjIGV4dGVuZGVkIGFzY2lpIGNoYXJhY3RlciBzZXQKK0xPR09VVCA9IGNocigxOCkgIyBmb3JjZSBsb2dvdXQKK0JNID0gY2hyKDE5KSAjIGJ5dGUgbWFjcm8KK0RFVCA9IGNocigyMCkgIyBkYXRhIGVudHJ5IHRlcm1pbmFsCitTVVBEVVAgPSBjaHIoMjEpICMgc3VwZHVwIHByb3RvY29sCitTVVBEVVBPVVRQVVQgPSBjaHIoMjIpICMgc3VwZHVwIG91dHB1dAorU05ETE9DID0gY2hyKDIzKSAjIHNlbmQgbG9jYXRpb24KK1RUWVBFID0gY2hyKDI0KSAjIHRlcm1pbmFsIHR5cGUKK0VPUiA9IGNocigyNSkgIyBlbmQgb3IgcmVjb3JkCitUVUlEID0gY2hyKDI2KSAjIFRBQ0FDUyB1c2VyIGlkZW50aWZpY2F0aW9uCitPVVRNUksgPSBjaHIoMjcpICMgb3V0cHV0IG1hcmtpbmcKK1RUWUxPQyA9IGNocigyOCkgIyB0ZXJtaW5hbCBsb2NhdGlvbiBudW1iZXIKK1ZUMzI3MFJFR0lNRSA9IGNocigyOSkgIyAzMjcwIHJlZ2ltZQorWDNQQUQgPSBjaHIoMzApICMgWC4zIFBBRAorTkFXUyA9IGNocigzMSkgIyB3aW5kb3cgc2l6ZQorVFNQRUVEID0gY2hyKDMyKSAjIHRlcm1pbmFsIHNwZWVkCitMRkxPVyA9IGNocigzMykgIyByZW1vdGUgZmxvdyBjb250cm9sCitMSU5FTU9ERSA9IGNocigzNCkgIyBMaW5lbW9kZSBvcHRpb24KK1hESVNQTE9DID0gY2hyKDM1KSAjIFggRGlzcGxheSBMb2NhdGlvbgorT0xEX0VOVklST04gPSBjaHIoMzYpICMgT2xkIC0gRW52aXJvbm1lbnQgdmFyaWFibGVzCitBVVRIRU5USUNBVElPTiA9IGNocigzNykgIyBBdXRoZW50aWNhdGUKK0VOQ1JZUFQgPSBjaHIoMzgpICMgRW5jcnlwdGlvbiBvcHRpb24KK05FV19FTlZJUk9OID0gY2hyKDM5KSAjIE5ldyAtIEVudmlyb25tZW50IHZhcmlhYmxlcworIyB0aGUgZm9sbG93aW5nIG9uZXMgY29tZSBmcm9tCisjIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvdGVsbmV0LW9wdGlvbnMKKyMgVW5mb3J0dW5hdGVseSwgdGhhdCBkb2N1bWVudCBkb2VzIG5vdCBhc3NpZ24gaWRlbnRpZmllcnMKKyMgdG8gYWxsIG9mIHRoZW0sIHNvIHdlIGFyZSBtYWtpbmcgdGhlbSB1cAorVE4zMjcwRSA9IGNocig0MCkgIyBUTjMyNzBFCitYQVVUSCA9IGNocig0MSkgIyBYQVVUSAorQ0hBUlNFVCA9IGNocig0MikgIyBDSEFSU0VUCitSU1AgPSBjaHIoNDMpICMgVGVsbmV0IFJlbW90ZSBTZXJpYWwgUG9ydAorQ09NX1BPUlRfT1BUSU9OID0gY2hyKDQ0KSAjIENvbSBQb3J0IENvbnRyb2wgT3B0aW9uCitTVVBQUkVTU19MT0NBTF9FQ0hPID0gY2hyKDQ1KSAjIFRlbG5ldCBTdXBwcmVzcyBMb2NhbCBFY2hvCitUTFMgPSBjaHIoNDYpICMgVGVsbmV0IFN0YXJ0IFRMUworS0VSTUlUID0gY2hyKDQ3KSAjIEtFUk1JVAorU0VORF9VUkwgPSBjaHIoNDgpICMgU0VORC1VUkwKK0ZPUldBUkRfWCA9IGNocig0OSkgIyBGT1JXQVJEX1gKK1BSQUdNQV9MT0dPTiA9IGNocigxMzgpICMgVEVMT1BUIFBSQUdNQSBMT0dPTgorU1NQSV9MT0dPTiA9IGNocigxMzkpICMgVEVMT1BUIFNTUEkgTE9HT04KK1BSQUdNQV9IRUFSVEJFQVQgPSBjaHIoMTQwKSAjIFRFTE9QVCBQUkFHTUEgSEVBUlRCRUFUCitFWE9QTCA9IGNocigyNTUpICMgRXh0ZW5kZWQtT3B0aW9ucy1MaXN0CitOT09QVCA9IGNocigwKQorCitjbGFzcyBUZWxuZXQ6CisKKyAgICAiIiJUZWxuZXQgaW50ZXJmYWNlIGNsYXNzLgorCisgICAgQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY29ubmVjdGlvbiB0byBhIHRlbG5ldAorICAgIHNlcnZlci4gIFRoZSBpbnN0YW5jZSBpcyBpbml0aWFsbHkgbm90IGNvbm5lY3RlZDsgdGhlIG9wZW4oKQorICAgIG1ldGhvZCBtdXN0IGJlIHVzZWQgdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbi4gIEFsdGVybmF0aXZlbHksIHRoZQorICAgIGhvc3QgbmFtZSBhbmQgb3B0aW9uYWwgcG9ydCBudW1iZXIgY2FuIGJlIHBhc3NlZCB0byB0aGUKKyAgICBjb25zdHJ1Y3RvciwgdG9vLgorCisgICAgRG9uJ3QgdHJ5IHRvIHJlb3BlbiBhbiBhbHJlYWR5IGNvbm5lY3RlZCBpbnN0YW5jZS4KKworICAgIFRoaXMgY2xhc3MgaGFzIG1hbnkgcmVhZF8qKCkgbWV0aG9kcy4gIE5vdGUgdGhhdCBzb21lIG9mIHRoZW0KKyAgICByYWlzZSBFT0ZFcnJvciB3aGVuIHRoZSBlbmQgb2YgdGhlIGNvbm5lY3Rpb24gaXMgcmVhZCwgYmVjYXVzZQorICAgIHRoZXkgY2FuIHJldHVybiBhbiBlbXB0eSBzdHJpbmcgZm9yIG90aGVyIHJlYXNvbnMuICBTZWUgdGhlCisgICAgaW5kaXZpZHVhbCBkb2Mgc3RyaW5ncy4KKworICAgIHJlYWRfdW50aWwoZXhwZWN0ZWQsIFt0aW1lb3V0XSkKKyAgICAgICAgUmVhZCB1bnRpbCB0aGUgZXhwZWN0ZWQgc3RyaW5nIGhhcyBiZWVuIHNlZW4sIG9yIGEgdGltZW91dCBpcworICAgICAgICBoaXQgKGRlZmF1bHQgaXMgbm8gdGltZW91dCk7IG1heSBibG9jay4KKworICAgIHJlYWRfYWxsKCkKKyAgICAgICAgUmVhZCBhbGwgZGF0YSB1bnRpbCBFT0Y7IG1heSBibG9jay4KKworICAgIHJlYWRfc29tZSgpCisgICAgICAgIFJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUgb3IgRU9GOyBtYXkgYmxvY2suCisKKyAgICByZWFkX3ZlcnlfZWFnZXIoKQorICAgICAgICBSZWFkIGFsbCBkYXRhIGF2YWlsYWJsZSBhbHJlYWR5IHF1ZXVlZCBvciBvbiB0aGUgc29ja2V0LAorICAgICAgICB3aXRob3V0IGJsb2NraW5nLgorCisgICAgcmVhZF9lYWdlcigpCisgICAgICAgIFJlYWQgZWl0aGVyIGRhdGEgYWxyZWFkeSBxdWV1ZWQgb3Igc29tZSBkYXRhIGF2YWlsYWJsZSBvbiB0aGUKKyAgICAgICAgc29ja2V0LCB3aXRob3V0IGJsb2NraW5nLgorCisgICAgcmVhZF9sYXp5KCkKKyAgICAgICAgUmVhZCBhbGwgZGF0YSBpbiB0aGUgcmF3IHF1ZXVlIChwcm9jZXNzaW5nIGl0IGZpcnN0KSwgd2l0aG91dAorICAgICAgICBkb2luZyBhbnkgc29ja2V0IEkvTy4KKworICAgIHJlYWRfdmVyeV9sYXp5KCkKKyAgICAgICAgUmVhZHMgYWxsIGRhdGEgaW4gdGhlIGNvb2tlZCBxdWV1ZSwgd2l0aG91dCBkb2luZyBhbnkgc29ja2V0CisgICAgICAgIEkvTy4KKworICAgIHJlYWRfc2JfZGF0YSgpCisgICAgICAgIFJlYWRzIGF2YWlsYWJsZSBkYXRhIGJldHdlZW4gU0IgLi4uIFNFIHNlcXVlbmNlLiBEb24ndCBibG9jay4KKworICAgIHNldF9vcHRpb25fbmVnb3RpYXRpb25fY2FsbGJhY2soY2FsbGJhY2spCisgICAgICAgIEVhY2ggdGltZSBhIHRlbG5ldCBvcHRpb24gaXMgcmVhZCBvbiB0aGUgaW5wdXQgZmxvdywgdGhpcyBjYWxsYmFjaworICAgICAgICAoaWYgc2V0KSBpcyBjYWxsZWQgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgOgorICAgICAgICBjYWxsYmFjayh0ZWxuZXQgc29ja2V0LCBjb21tYW5kLCBvcHRpb24pCisgICAgICAgICAgICBvcHRpb24gd2lsbCBiZSBjaHIoMCkgd2hlbiB0aGVyZSBpcyBubyBvcHRpb24uCisgICAgICAgIE5vIG90aGVyIGFjdGlvbiBpcyBkb25lIGFmdGVyd2FyZHMgYnkgdGVsbmV0bGliLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD1Ob25lLCBwb3J0PTAsCisgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VUKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuCisKKyAgICAgICAgV2hlbiBjYWxsZWQgd2l0aG91dCBhcmd1bWVudHMsIGNyZWF0ZSBhbiB1bmNvbm5lY3RlZCBpbnN0YW5jZS4KKyAgICAgICAgV2l0aCBhIGhvc3RuYW1lIGFyZ3VtZW50LCBpdCBjb25uZWN0cyB0aGUgaW5zdGFuY2U7IHBvcnQgbnVtYmVyCisgICAgICAgIGFuZCB0aW1lb3V0IGFyZSBvcHRpb25hbC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZGVidWdsZXZlbCA9IERFQlVHTEVWRUwKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKKyAgICAgICAgc2VsZi5zb2NrID0gTm9uZQorICAgICAgICBzZWxmLnJhd3EgPSAnJworICAgICAgICBzZWxmLmlyYXdxID0gMAorICAgICAgICBzZWxmLmNvb2tlZHEgPSAnJworICAgICAgICBzZWxmLmVvZiA9IDAKKyAgICAgICAgc2VsZi5pYWNzZXEgPSAnJyAjIEJ1ZmZlciBmb3IgSUFDIHNlcXVlbmNlLgorICAgICAgICBzZWxmLnNiID0gMCAjIGZsYWcgZm9yIFNCIGFuZCBTRSBzZXF1ZW5jZS4KKyAgICAgICAgc2VsZi5zYmRhdGFxID0gJycKKyAgICAgICAgc2VsZi5vcHRpb25fY2FsbGJhY2sgPSBOb25lCisgICAgICAgIHNlbGYuX2hhc19wb2xsID0gaGFzYXR0cihzZWxlY3QsICdwb2xsJykKKyAgICAgICAgaWYgaG9zdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYub3Blbihob3N0LCBwb3J0LCB0aW1lb3V0KQorCisgICAgZGVmIG9wZW4oc2VsZiwgaG9zdCwgcG9ydD0wLCB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCk6CisgICAgICAgICIiIkNvbm5lY3QgdG8gYSBob3N0LgorCisgICAgICAgIFRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIHBvcnQgbnVtYmVyLCB3aGljaAorICAgICAgICBkZWZhdWx0cyB0byB0aGUgc3RhbmRhcmQgdGVsbmV0IHBvcnQgKDIzKS4KKworICAgICAgICBEb24ndCB0cnkgdG8gcmVvcGVuIGFuIGFscmVhZHkgY29ubmVjdGVkIGluc3RhbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5lb2YgPSAwCisgICAgICAgIGlmIG5vdCBwb3J0OgorICAgICAgICAgICAgcG9ydCA9IFRFTE5FVF9QT1JUCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoaG9zdCwgcG9ydCksIHRpbWVvdXQpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgIiIiRGVzdHJ1Y3RvciAtLSBjbG9zZSB0aGUgY29ubmVjdGlvbi4iIiIKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgbXNnKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICAiIiJQcmludCBhIGRlYnVnIG1lc3NhZ2UsIHdoZW4gdGhlIGRlYnVnIGxldmVsIGlzID4gMC4KKworICAgICAgICBJZiBleHRyYSBhcmd1bWVudHMgYXJlIHByZXNlbnQsIHRoZXkgYXJlIHN1YnN0aXR1dGVkIGluIHRoZQorICAgICAgICBtZXNzYWdlIHVzaW5nIHRoZSBzdGFuZGFyZCBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRvci4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgIHByaW50ICdUZWxuZXQoJXMsJXMpOicgJSAoc2VsZi5ob3N0LCBzZWxmLnBvcnQpLAorICAgICAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgICAgICBwcmludCBtc2cgJSBhcmdzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50IG1zZworCisgICAgZGVmIHNldF9kZWJ1Z2xldmVsKHNlbGYsIGRlYnVnbGV2ZWwpOgorICAgICAgICAiIiJTZXQgdGhlIGRlYnVnIGxldmVsLgorCisgICAgICAgIFRoZSBoaWdoZXIgaXQgaXMsIHRoZSBtb3JlIGRlYnVnIG91dHB1dCB5b3UgZ2V0IChvbiBzeXMuc3Rkb3V0KS4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5kZWJ1Z2xldmVsID0gZGVidWdsZXZlbAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgY29ubmVjdGlvbi4iIiIKKyAgICAgICAgaWYgc2VsZi5zb2NrOgorICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKyAgICAgICAgc2VsZi5zb2NrID0gMAorICAgICAgICBzZWxmLmVvZiA9IDEKKyAgICAgICAgc2VsZi5pYWNzZXEgPSAnJworICAgICAgICBzZWxmLnNiID0gMAorCisgICAgZGVmIGdldF9zb2NrZXQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgc29ja2V0IG9iamVjdCB1c2VkIGludGVybmFsbHkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNvY2sKKworICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgZmlsZW5vKCkgb2YgdGhlIHNvY2tldCBvYmplY3QgdXNlZCBpbnRlcm5hbGx5LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5zb2NrLmZpbGVubygpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYnVmZmVyKToKKyAgICAgICAgIiIiV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHNvY2tldCwgZG91YmxpbmcgYW55IElBQyBjaGFyYWN0ZXJzLgorCisgICAgICAgIENhbiBibG9jayBpZiB0aGUgY29ubmVjdGlvbiBpcyBibG9ja2VkLiAgTWF5IHJhaXNlCisgICAgICAgIHNvY2tldC5lcnJvciBpZiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIElBQyBpbiBidWZmZXI6CisgICAgICAgICAgICBidWZmZXIgPSBidWZmZXIucmVwbGFjZShJQUMsIElBQytJQUMpCisgICAgICAgIHNlbGYubXNnKCJzZW5kICVyIiwgYnVmZmVyKQorICAgICAgICBzZWxmLnNvY2suc2VuZGFsbChidWZmZXIpCisKKyAgICBkZWYgcmVhZF91bnRpbChzZWxmLCBtYXRjaCwgdGltZW91dD1Ob25lKToKKyAgICAgICAgIiIiUmVhZCB1bnRpbCBhIGdpdmVuIHN0cmluZyBpcyBlbmNvdW50ZXJlZCBvciB1bnRpbCB0aW1lb3V0LgorCisgICAgICAgIFdoZW4gbm8gbWF0Y2ggaXMgZm91bmQsIHJldHVybiB3aGF0ZXZlciBpcyBhdmFpbGFibGUgaW5zdGVhZCwKKyAgICAgICAgcG9zc2libHkgdGhlIGVtcHR5IHN0cmluZy4gIFJhaXNlIEVPRkVycm9yIGlmIHRoZSBjb25uZWN0aW9uCisgICAgICAgIGlzIGNsb3NlZCBhbmQgbm8gY29va2VkIGRhdGEgaXMgYXZhaWxhYmxlLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9oYXNfcG9sbDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX3VudGlsX3dpdGhfcG9sbChtYXRjaCwgdGltZW91dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX3VudGlsX3dpdGhfc2VsZWN0KG1hdGNoLCB0aW1lb3V0KQorCisgICAgZGVmIF9yZWFkX3VudGlsX3dpdGhfcG9sbChzZWxmLCBtYXRjaCwgdGltZW91dCk6CisgICAgICAgICIiIlJlYWQgdW50aWwgYSBnaXZlbiBzdHJpbmcgaXMgZW5jb3VudGVyZWQgb3IgdW50aWwgdGltZW91dC4KKworICAgICAgICBUaGlzIG1ldGhvZCB1c2VzIHNlbGVjdC5wb2xsKCkgdG8gaW1wbGVtZW50IHRoZSB0aW1lb3V0LgorICAgICAgICAiIiIKKyAgICAgICAgbiA9IGxlbihtYXRjaCkKKyAgICAgICAgY2FsbF90aW1lb3V0ID0gdGltZW91dAorICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZnJvbSB0aW1lIGltcG9ydCB0aW1lCisgICAgICAgICAgICB0aW1lX3N0YXJ0ID0gdGltZSgpCisgICAgICAgIHNlbGYucHJvY2Vzc19yYXdxKCkKKyAgICAgICAgaSA9IHNlbGYuY29va2VkcS5maW5kKG1hdGNoKQorICAgICAgICBpZiBpIDwgMDoKKyAgICAgICAgICAgIHBvbGxlciA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgICAgIHBvbGxfaW5fb3JfcHJpb3JpdHlfZmxhZ3MgPSBzZWxlY3QuUE9MTElOIHwgc2VsZWN0LlBPTExQUkkKKyAgICAgICAgICAgIHBvbGxlci5yZWdpc3RlcihzZWxmLCBwb2xsX2luX29yX3ByaW9yaXR5X2ZsYWdzKQorICAgICAgICAgICAgd2hpbGUgaSA8IDAgYW5kIG5vdCBzZWxmLmVvZjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlYWR5ID0gcG9sbGVyLnBvbGwoY2FsbF90aW1lb3V0KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzZWxlY3QuZXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZCA9IHRpbWUoKSAtIHRpbWVfc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3RpbWVvdXQgPSB0aW1lb3V0LWVsYXBzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgZm9yIGZkLCBtb2RlIGluIHJlYWR5OgorICAgICAgICAgICAgICAgICAgICBpZiBtb2RlICYgcG9sbF9pbl9vcl9wcmlvcml0eV9mbGFnczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBtYXgoMCwgbGVuKHNlbGYuY29va2VkcSktbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsbF9yYXdxKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19yYXdxKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBzZWxmLmNvb2tlZHEuZmluZChtYXRjaCwgaSkKKyAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBlbGFwc2VkID0gdGltZSgpIC0gdGltZV9zdGFydAorICAgICAgICAgICAgICAgICAgICBpZiBlbGFwc2VkID49IHRpbWVvdXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBjYWxsX3RpbWVvdXQgPSB0aW1lb3V0LWVsYXBzZWQKKyAgICAgICAgICAgIHBvbGxlci51bnJlZ2lzdGVyKHNlbGYpCisgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgIGkgPSBpICsgbgorICAgICAgICAgICAgYnVmID0gc2VsZi5jb29rZWRxWzppXQorICAgICAgICAgICAgc2VsZi5jb29rZWRxID0gc2VsZi5jb29rZWRxW2k6XQorICAgICAgICAgICAgcmV0dXJuIGJ1ZgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkX3ZlcnlfbGF6eSgpCisKKyAgICBkZWYgX3JlYWRfdW50aWxfd2l0aF9zZWxlY3Qoc2VsZiwgbWF0Y2gsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICIiIlJlYWQgdW50aWwgYSBnaXZlbiBzdHJpbmcgaXMgZW5jb3VudGVyZWQgb3IgdW50aWwgdGltZW91dC4KKworICAgICAgICBUaGUgdGltZW91dCBpcyBpbXBsZW1lbnRlZCB1c2luZyBzZWxlY3Quc2VsZWN0KCkuCisgICAgICAgICIiIgorICAgICAgICBuID0gbGVuKG1hdGNoKQorICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgIGkgPSBzZWxmLmNvb2tlZHEuZmluZChtYXRjaCkKKyAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgaSA9IGkrbgorICAgICAgICAgICAgYnVmID0gc2VsZi5jb29rZWRxWzppXQorICAgICAgICAgICAgc2VsZi5jb29rZWRxID0gc2VsZi5jb29rZWRxW2k6XQorICAgICAgICAgICAgcmV0dXJuIGJ1ZgorICAgICAgICBzX3JlcGx5ID0gKFtzZWxmXSwgW10sIFtdKQorICAgICAgICBzX2FyZ3MgPSBzX3JlcGx5CisgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzX2FyZ3MgPSBzX2FyZ3MgKyAodGltZW91dCwpCisgICAgICAgICAgICBmcm9tIHRpbWUgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgIHRpbWVfc3RhcnQgPSB0aW1lKCkKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuZW9mIGFuZCBzZWxlY3Quc2VsZWN0KCpzX2FyZ3MpID09IHNfcmVwbHk6CisgICAgICAgICAgICBpID0gbWF4KDAsIGxlbihzZWxmLmNvb2tlZHEpLW4pCisgICAgICAgICAgICBzZWxmLmZpbGxfcmF3cSgpCisgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgICAgICBpID0gc2VsZi5jb29rZWRxLmZpbmQobWF0Y2gsIGkpCisgICAgICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICAgICAgaSA9IGkrbgorICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuY29va2VkcVs6aV0KKyAgICAgICAgICAgICAgICBzZWxmLmNvb2tlZHEgPSBzZWxmLmNvb2tlZHFbaTpdCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZgorICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBlbGFwc2VkID0gdGltZSgpIC0gdGltZV9zdGFydAorICAgICAgICAgICAgICAgIGlmIGVsYXBzZWQgPj0gdGltZW91dDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzX2FyZ3MgPSBzX3JlcGx5ICsgKHRpbWVvdXQtZWxhcHNlZCwpCisgICAgICAgIHJldHVybiBzZWxmLnJlYWRfdmVyeV9sYXp5KCkKKworICAgIGRlZiByZWFkX2FsbChzZWxmKToKKyAgICAgICAgIiIiUmVhZCBhbGwgZGF0YSB1bnRpbCBFT0Y7IGJsb2NrIHVudGlsIGNvbm5lY3Rpb24gY2xvc2VkLiIiIgorICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLmVvZjoKKyAgICAgICAgICAgIHNlbGYuZmlsbF9yYXdxKCkKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc19yYXdxKCkKKyAgICAgICAgYnVmID0gc2VsZi5jb29rZWRxCisgICAgICAgIHNlbGYuY29va2VkcSA9ICcnCisgICAgICAgIHJldHVybiBidWYKKworICAgIGRlZiByZWFkX3NvbWUoc2VsZik6CisgICAgICAgICIiIlJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUgb2YgY29va2VkIGRhdGEgdW5sZXNzIEVPRiBpcyBoaXQuCisKKyAgICAgICAgUmV0dXJuICcnIGlmIEVPRiBpcyBoaXQuICBCbG9jayBpZiBubyBkYXRhIGlzIGltbWVkaWF0ZWx5CisgICAgICAgIGF2YWlsYWJsZS4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5wcm9jZXNzX3Jhd3EoKQorICAgICAgICB3aGlsZSBub3Qgc2VsZi5jb29rZWRxIGFuZCBub3Qgc2VsZi5lb2Y6CisgICAgICAgICAgICBzZWxmLmZpbGxfcmF3cSgpCisgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgIGJ1ZiA9IHNlbGYuY29va2VkcQorICAgICAgICBzZWxmLmNvb2tlZHEgPSAnJworICAgICAgICByZXR1cm4gYnVmCisKKyAgICBkZWYgcmVhZF92ZXJ5X2VhZ2VyKHNlbGYpOgorICAgICAgICAiIiJSZWFkIGV2ZXJ5dGhpbmcgdGhhdCdzIHBvc3NpYmxlIHdpdGhvdXQgYmxvY2tpbmcgaW4gSS9PIChlYWdlcikuCisKKyAgICAgICAgUmFpc2UgRU9GRXJyb3IgaWYgY29ubmVjdGlvbiBjbG9zZWQgYW5kIG5vIGNvb2tlZCBkYXRhCisgICAgICAgIGF2YWlsYWJsZS4gIFJldHVybiAnJyBpZiBubyBjb29rZWQgZGF0YSBhdmFpbGFibGUgb3RoZXJ3aXNlLgorICAgICAgICBEb24ndCBibG9jayB1bmxlc3MgaW4gdGhlIG1pZHN0IG9mIGFuIElBQyBzZXF1ZW5jZS4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5wcm9jZXNzX3Jhd3EoKQorICAgICAgICB3aGlsZSBub3Qgc2VsZi5lb2YgYW5kIHNlbGYuc29ja19hdmFpbCgpOgorICAgICAgICAgICAgc2VsZi5maWxsX3Jhd3EoKQorICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3Jhd3EoKQorICAgICAgICByZXR1cm4gc2VsZi5yZWFkX3ZlcnlfbGF6eSgpCisKKyAgICBkZWYgcmVhZF9lYWdlcihzZWxmKToKKyAgICAgICAgIiIiUmVhZCByZWFkaWx5IGF2YWlsYWJsZSBkYXRhLgorCisgICAgICAgIFJhaXNlIEVPRkVycm9yIGlmIGNvbm5lY3Rpb24gY2xvc2VkIGFuZCBubyBjb29rZWQgZGF0YQorICAgICAgICBhdmFpbGFibGUuICBSZXR1cm4gJycgaWYgbm8gY29va2VkIGRhdGEgYXZhaWxhYmxlIG90aGVyd2lzZS4KKyAgICAgICAgRG9uJ3QgYmxvY2sgdW5sZXNzIGluIHRoZSBtaWRzdCBvZiBhbiBJQUMgc2VxdWVuY2UuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucHJvY2Vzc19yYXdxKCkKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuY29va2VkcSBhbmQgbm90IHNlbGYuZW9mIGFuZCBzZWxmLnNvY2tfYXZhaWwoKToKKyAgICAgICAgICAgIHNlbGYuZmlsbF9yYXdxKCkKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc19yYXdxKCkKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZF92ZXJ5X2xhenkoKQorCisgICAgZGVmIHJlYWRfbGF6eShzZWxmKToKKyAgICAgICAgIiIiUHJvY2VzcyBhbmQgcmV0dXJuIGRhdGEgdGhhdCdzIGFscmVhZHkgaW4gdGhlIHF1ZXVlcyAobGF6eSkuCisKKyAgICAgICAgUmFpc2UgRU9GRXJyb3IgaWYgY29ubmVjdGlvbiBjbG9zZWQgYW5kIG5vIGRhdGEgYXZhaWxhYmxlLgorICAgICAgICBSZXR1cm4gJycgaWYgbm8gY29va2VkIGRhdGEgYXZhaWxhYmxlIG90aGVyd2lzZS4gIERvbid0IGJsb2NrCisgICAgICAgIHVubGVzcyBpbiB0aGUgbWlkc3Qgb2YgYW4gSUFDIHNlcXVlbmNlLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgIHJldHVybiBzZWxmLnJlYWRfdmVyeV9sYXp5KCkKKworICAgIGRlZiByZWFkX3ZlcnlfbGF6eShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFueSBkYXRhIGF2YWlsYWJsZSBpbiB0aGUgY29va2VkIHF1ZXVlICh2ZXJ5IGxhenkpLgorCisgICAgICAgIFJhaXNlIEVPRkVycm9yIGlmIGNvbm5lY3Rpb24gY2xvc2VkIGFuZCBubyBkYXRhIGF2YWlsYWJsZS4KKyAgICAgICAgUmV0dXJuICcnIGlmIG5vIGNvb2tlZCBkYXRhIGF2YWlsYWJsZSBvdGhlcndpc2UuICBEb24ndCBibG9jay4KKworICAgICAgICAiIiIKKyAgICAgICAgYnVmID0gc2VsZi5jb29rZWRxCisgICAgICAgIHNlbGYuY29va2VkcSA9ICcnCisgICAgICAgIGlmIG5vdCBidWYgYW5kIHNlbGYuZW9mIGFuZCBub3Qgc2VsZi5yYXdxOgorICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IsICd0ZWxuZXQgY29ubmVjdGlvbiBjbG9zZWQnCisgICAgICAgIHJldHVybiBidWYKKworICAgIGRlZiByZWFkX3NiX2RhdGEoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbnkgZGF0YSBhdmFpbGFibGUgaW4gdGhlIFNCIC4uLiBTRSBxdWV1ZS4KKworICAgICAgICBSZXR1cm4gJycgaWYgbm8gU0IgLi4uIFNFIGF2YWlsYWJsZS4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkCisgICAgICAgIGFmdGVyIHNlZWluZyBhIFNCIG9yIFNFIGNvbW1hbmQuIFdoZW4gYSBuZXcgU0IgY29tbWFuZCBpcworICAgICAgICBmb3VuZCwgb2xkIHVucmVhZCBTQiBkYXRhIHdpbGwgYmUgZGlzY2FyZGVkLiBEb24ndCBibG9jay4KKworICAgICAgICAiIiIKKyAgICAgICAgYnVmID0gc2VsZi5zYmRhdGFxCisgICAgICAgIHNlbGYuc2JkYXRhcSA9ICcnCisgICAgICAgIHJldHVybiBidWYKKworICAgIGRlZiBzZXRfb3B0aW9uX25lZ290aWF0aW9uX2NhbGxiYWNrKHNlbGYsIGNhbGxiYWNrKToKKyAgICAgICAgIiIiUHJvdmlkZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCBhZnRlciBlYWNoIHJlY2VpcHQgb2YgYSB0ZWxuZXQgb3B0aW9uLiIiIgorICAgICAgICBzZWxmLm9wdGlvbl9jYWxsYmFjayA9IGNhbGxiYWNrCisKKyAgICBkZWYgcHJvY2Vzc19yYXdxKHNlbGYpOgorICAgICAgICAiIiJUcmFuc2ZlciBmcm9tIHJhdyBxdWV1ZSB0byBjb29rZWQgcXVldWUuCisKKyAgICAgICAgU2V0IHNlbGYuZW9mIHdoZW4gY29ubmVjdGlvbiBpcyBjbG9zZWQuICBEb24ndCBibG9jayB1bmxlc3MgaW4KKyAgICAgICAgdGhlIG1pZHN0IG9mIGFuIElBQyBzZXF1ZW5jZS4KKworICAgICAgICAiIiIKKyAgICAgICAgYnVmID0gWycnLCAnJ10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgc2VsZi5yYXdxOgorICAgICAgICAgICAgICAgIGMgPSBzZWxmLnJhd3FfZ2V0Y2hhcigpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuaWFjc2VxOgorICAgICAgICAgICAgICAgICAgICBpZiBjID09IHRoZU5VTEw6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiBjID09ICJcMDIxIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmIGMgIT0gSUFDOgorICAgICAgICAgICAgICAgICAgICAgICAgYnVmW3NlbGYuc2JdID0gYnVmW3NlbGYuc2JdICsgYworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaWFjc2VxICs9IGMKKyAgICAgICAgICAgICAgICBlbGlmIGxlbihzZWxmLmlhY3NlcSkgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgIyAnSUFDOiBJQUMgQ01EIFtPUFRJT04gb25seSBmb3IgV0lMTC9XT05UL0RPL0RPTlRdJworICAgICAgICAgICAgICAgICAgICBpZiBjIGluIChETywgRE9OVCwgV0lMTCwgV09OVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlhY3NlcSArPSBjCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaWFjc2VxID0gJycKKyAgICAgICAgICAgICAgICAgICAgaWYgYyA9PSBJQUM6CisgICAgICAgICAgICAgICAgICAgICAgICBidWZbc2VsZi5zYl0gPSBidWZbc2VsZi5zYl0gKyBjCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjID09IFNCOiAjIFNCIC4uLiBTRSBzdGFydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNiID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2JkYXRhcSA9ICcnCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGMgPT0gU0U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zYiA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNiZGF0YXEgPSBzZWxmLnNiZGF0YXEgKyBidWZbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbMV0gPSAnJworICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5vcHRpb25fY2FsbGJhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDYWxsYmFjayBpcyBzdXBwb3NlZCB0byBsb29rIGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBzYmRhdGFxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25fY2FsbGJhY2soc2VsZi5zb2NrLCBjLCBOT09QVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBXZSBjYW4ndCBvZmZlciBhdXRvbWF0aWMgcHJvY2Vzc2luZyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3Vib3B0aW9ucy4gQWxhcywgd2Ugc2hvdWxkIG5vdCBnZXQgYW55CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bmxlc3Mgd2UgZGlkIGEgV0lMTC9ETyBiZWZvcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tc2coJ0lBQyAlZCBub3QgcmVjb2duaXplZCcgJSBvcmQoYykpCisgICAgICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5pYWNzZXEpID09IDI6CisgICAgICAgICAgICAgICAgICAgIGNtZCA9IHNlbGYuaWFjc2VxWzFdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaWFjc2VxID0gJycKKyAgICAgICAgICAgICAgICAgICAgb3B0ID0gYworICAgICAgICAgICAgICAgICAgICBpZiBjbWQgaW4gKERPLCBET05UKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubXNnKCdJQUMgJXMgJWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9PSBETyBhbmQgJ0RPJyBvciAnRE9OVCcsIG9yZChvcHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5vcHRpb25fY2FsbGJhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25fY2FsbGJhY2soc2VsZi5zb2NrLCBjbWQsIG9wdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrLnNlbmRhbGwoSUFDICsgV09OVCArIG9wdCkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBjbWQgaW4gKFdJTEwsIFdPTlQpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tc2coJ0lBQyAlcyAlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kID09IFdJTEwgYW5kICdXSUxMJyBvciAnV09OVCcsIG9yZChvcHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5vcHRpb25fY2FsbGJhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25fY2FsbGJhY2soc2VsZi5zb2NrLCBjbWQsIG9wdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrLnNlbmRhbGwoSUFDICsgRE9OVCArIG9wdCkKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOiAjIHJhaXNlZCBieSBzZWxmLnJhd3FfZ2V0Y2hhcigpCisgICAgICAgICAgICBzZWxmLmlhY3NlcSA9ICcnICMgUmVzZXQgb24gRU9GCisgICAgICAgICAgICBzZWxmLnNiID0gMAorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmNvb2tlZHEgPSBzZWxmLmNvb2tlZHEgKyBidWZbMF0KKyAgICAgICAgc2VsZi5zYmRhdGFxID0gc2VsZi5zYmRhdGFxICsgYnVmWzFdCisKKyAgICBkZWYgcmF3cV9nZXRjaGFyKHNlbGYpOgorICAgICAgICAiIiJHZXQgbmV4dCBjaGFyIGZyb20gcmF3IHF1ZXVlLgorCisgICAgICAgIEJsb2NrIGlmIG5vIGRhdGEgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLiAgUmFpc2UgRU9GRXJyb3IKKyAgICAgICAgd2hlbiBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYucmF3cToKKyAgICAgICAgICAgIHNlbGYuZmlsbF9yYXdxKCkKKyAgICAgICAgICAgIGlmIHNlbGYuZW9mOgorICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgICAgIGMgPSBzZWxmLnJhd3Fbc2VsZi5pcmF3cV0KKyAgICAgICAgc2VsZi5pcmF3cSA9IHNlbGYuaXJhd3EgKyAxCisgICAgICAgIGlmIHNlbGYuaXJhd3EgPj0gbGVuKHNlbGYucmF3cSk6CisgICAgICAgICAgICBzZWxmLnJhd3EgPSAnJworICAgICAgICAgICAgc2VsZi5pcmF3cSA9IDAKKyAgICAgICAgcmV0dXJuIGMKKworICAgIGRlZiBmaWxsX3Jhd3Eoc2VsZik6CisgICAgICAgICIiIkZpbGwgcmF3IHF1ZXVlIGZyb20gZXhhY3RseSBvbmUgcmVjdigpIHN5c3RlbSBjYWxsLgorCisgICAgICAgIEJsb2NrIGlmIG5vIGRhdGEgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLiAgU2V0IHNlbGYuZW9mIHdoZW4KKyAgICAgICAgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuaXJhd3EgPj0gbGVuKHNlbGYucmF3cSk6CisgICAgICAgICAgICBzZWxmLnJhd3EgPSAnJworICAgICAgICAgICAgc2VsZi5pcmF3cSA9IDAKKyAgICAgICAgIyBUaGUgYnVmZmVyIHNpemUgc2hvdWxkIGJlIGZhaXJseSBzbWFsbCBzbyBhcyB0byBhdm9pZCBxdWFkcmF0aWMKKyAgICAgICAgIyBiZWhhdmlvciBpbiBwcm9jZXNzX3Jhd3EoKSBhYm92ZQorICAgICAgICBidWYgPSBzZWxmLnNvY2sucmVjdig1MCkKKyAgICAgICAgc2VsZi5tc2coInJlY3YgJXIiLCBidWYpCisgICAgICAgIHNlbGYuZW9mID0gKG5vdCBidWYpCisgICAgICAgIHNlbGYucmF3cSA9IHNlbGYucmF3cSArIGJ1ZgorCisgICAgZGVmIHNvY2tfYXZhaWwoc2VsZik6CisgICAgICAgICIiIlRlc3Qgd2hldGhlciBkYXRhIGlzIGF2YWlsYWJsZSBvbiB0aGUgc29ja2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZWN0LnNlbGVjdChbc2VsZl0sIFtdLCBbXSwgMCkgPT0gKFtzZWxmXSwgW10sIFtdKQorCisgICAgZGVmIGludGVyYWN0KHNlbGYpOgorICAgICAgICAiIiJJbnRlcmFjdGlvbiBmdW5jdGlvbiwgZW11bGF0ZXMgYSB2ZXJ5IGR1bWIgdGVsbmV0IGNsaWVudC4iIiIKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgICAgICAgICBzZWxmLm10X2ludGVyYWN0KCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgcmZkLCB3ZmQsIHhmZCA9IHNlbGVjdC5zZWxlY3QoW3NlbGYsIHN5cy5zdGRpbl0sIFtdLCBbXSkKKyAgICAgICAgICAgIGlmIHNlbGYgaW4gcmZkOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHNlbGYucmVhZF9lYWdlcigpCisgICAgICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnKioqIENvbm5lY3Rpb24gY2xvc2VkIGJ5IHJlbW90ZSBob3N0ICoqKicKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiB0ZXh0OgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHRleHQpCisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgaWYgc3lzLnN0ZGluIGluIHJmZDoKKyAgICAgICAgICAgICAgICBsaW5lID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKGxpbmUpCisKKyAgICBkZWYgbXRfaW50ZXJhY3Qoc2VsZik6CisgICAgICAgICIiIk11bHRpdGhyZWFkZWQgdmVyc2lvbiBvZiBpbnRlcmFjdCgpLiIiIgorICAgICAgICBpbXBvcnQgdGhyZWFkCisgICAgICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKHNlbGYubGlzdGVuZXIsICgpKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2VsZi53cml0ZShsaW5lKQorCisgICAgZGVmIGxpc3RlbmVyKHNlbGYpOgorICAgICAgICAiIiJIZWxwZXIgZm9yIG10X2ludGVyYWN0KCkgLS0gdGhpcyBleGVjdXRlcyBpbiB0aGUgb3RoZXIgdGhyZWFkLiIiIgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJlYWRfZWFnZXIoKQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIHByaW50ICcqKiogQ29ubmVjdGlvbiBjbG9zZWQgYnkgcmVtb3RlIGhvc3QgKioqJworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGRhdGEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorCisgICAgZGVmIGV4cGVjdChzZWxmLCBsaXN0LCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiJSZWFkIHVudGlsIG9uZSBmcm9tIGEgbGlzdCBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbnMgbWF0Y2hlcy4KKworICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgaXMgYSBsaXN0IG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGVpdGhlcgorICAgICAgICBjb21waWxlZCAocmUuUmVnZXhPYmplY3QgaW5zdGFuY2VzKSBvciB1bmNvbXBpbGVkIChzdHJpbmdzKS4KKyAgICAgICAgVGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBpcyBhIHRpbWVvdXQsIGluIHNlY29uZHM7IGRlZmF1bHQKKyAgICAgICAgaXMgbm8gdGltZW91dC4KKworICAgICAgICBSZXR1cm4gYSB0dXBsZSBvZiB0aHJlZSBpdGVtczogdGhlIGluZGV4IGluIHRoZSBsaXN0IG9mIHRoZQorICAgICAgICBmaXJzdCByZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzOyB0aGUgbWF0Y2ggb2JqZWN0CisgICAgICAgIHJldHVybmVkOyBhbmQgdGhlIHRleHQgcmVhZCB1cCB0aWxsIGFuZCBpbmNsdWRpbmcgdGhlIG1hdGNoLgorCisgICAgICAgIElmIEVPRiBpcyByZWFkIGFuZCBubyB0ZXh0IHdhcyByZWFkLCByYWlzZSBFT0ZFcnJvci4KKyAgICAgICAgT3RoZXJ3aXNlLCB3aGVuIG5vdGhpbmcgbWF0Y2hlcywgcmV0dXJuICgtMSwgTm9uZSwgdGV4dCkgd2hlcmUKKyAgICAgICAgdGV4dCBpcyB0aGUgdGV4dCByZWNlaXZlZCBzbyBmYXIgKG1heSBiZSB0aGUgZW1wdHkgc3RyaW5nIGlmIGEKKyAgICAgICAgdGltZW91dCBoYXBwZW5lZCkuCisKKyAgICAgICAgSWYgYSByZWd1bGFyIGV4cHJlc3Npb24gZW5kcyB3aXRoIGEgZ3JlZWR5IG1hdGNoIChlLmcuICcuKicpCisgICAgICAgIG9yIGlmIG1vcmUgdGhhbiBvbmUgZXhwcmVzc2lvbiBjYW4gbWF0Y2ggdGhlIHNhbWUgaW5wdXQsIHRoZQorICAgICAgICByZXN1bHRzIGFyZSB1bmRldGVybWluaXN0aWMsIGFuZCBtYXkgZGVwZW5kIG9uIHRoZSBJL08gdGltaW5nLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9oYXNfcG9sbDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9leHBlY3Rfd2l0aF9wb2xsKGxpc3QsIHRpbWVvdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZXhwZWN0X3dpdGhfc2VsZWN0KGxpc3QsIHRpbWVvdXQpCisKKyAgICBkZWYgX2V4cGVjdF93aXRoX3BvbGwoc2VsZiwgZXhwZWN0X2xpc3QsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICIiIlJlYWQgdW50aWwgb25lIGZyb20gYSBsaXN0IG9mIGEgcmVndWxhciBleHByZXNzaW9ucyBtYXRjaGVzLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHVzZXMgc2VsZWN0LnBvbGwoKSB0byBpbXBsZW1lbnQgdGhlIHRpbWVvdXQuCisgICAgICAgICIiIgorICAgICAgICByZSA9IE5vbmUKKyAgICAgICAgZXhwZWN0X2xpc3QgPSBleHBlY3RfbGlzdFs6XQorICAgICAgICBpbmRpY2VzID0gcmFuZ2UobGVuKGV4cGVjdF9saXN0KSkKKyAgICAgICAgZm9yIGkgaW4gaW5kaWNlczoKKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKGV4cGVjdF9saXN0W2ldLCAic2VhcmNoIik6CisgICAgICAgICAgICAgICAgaWYgbm90IHJlOiBpbXBvcnQgcmUKKyAgICAgICAgICAgICAgICBleHBlY3RfbGlzdFtpXSA9IHJlLmNvbXBpbGUoZXhwZWN0X2xpc3RbaV0pCisgICAgICAgIGNhbGxfdGltZW91dCA9IHRpbWVvdXQKKyAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZyb20gdGltZSBpbXBvcnQgdGltZQorICAgICAgICAgICAgdGltZV9zdGFydCA9IHRpbWUoKQorICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgIG0gPSBOb25lCisgICAgICAgIGZvciBpIGluIGluZGljZXM6CisgICAgICAgICAgICBtID0gZXhwZWN0X2xpc3RbaV0uc2VhcmNoKHNlbGYuY29va2VkcSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgZSA9IG0uZW5kKCkKKyAgICAgICAgICAgICAgICB0ZXh0ID0gc2VsZi5jb29rZWRxWzplXQorICAgICAgICAgICAgICAgIHNlbGYuY29va2VkcSA9IHNlbGYuY29va2VkcVtlOl0KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgIHBvbGxlciA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgICAgIHBvbGxfaW5fb3JfcHJpb3JpdHlfZmxhZ3MgPSBzZWxlY3QuUE9MTElOIHwgc2VsZWN0LlBPTExQUkkKKyAgICAgICAgICAgIHBvbGxlci5yZWdpc3RlcihzZWxmLCBwb2xsX2luX29yX3ByaW9yaXR5X2ZsYWdzKQorICAgICAgICAgICAgd2hpbGUgbm90IG0gYW5kIG5vdCBzZWxmLmVvZjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlYWR5ID0gcG9sbGVyLnBvbGwoY2FsbF90aW1lb3V0KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzZWxlY3QuZXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZCA9IHRpbWUoKSAtIHRpbWVfc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX3RpbWVvdXQgPSB0aW1lb3V0LWVsYXBzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgZm9yIGZkLCBtb2RlIGluIHJlYWR5OgorICAgICAgICAgICAgICAgICAgICBpZiBtb2RlICYgcG9sbF9pbl9vcl9wcmlvcml0eV9mbGFnczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsbF9yYXdxKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19yYXdxKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIGluZGljZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSA9IGV4cGVjdF9saXN0W2ldLnNlYXJjaChzZWxmLmNvb2tlZHEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG0uZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHNlbGYuY29va2VkcVs6ZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb29rZWRxID0gc2VsZi5jb29rZWRxW2U6XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGVsYXBzZWQgPSB0aW1lKCkgLSB0aW1lX3N0YXJ0CisgICAgICAgICAgICAgICAgICAgIGlmIGVsYXBzZWQgPj0gdGltZW91dDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGNhbGxfdGltZW91dCA9IHRpbWVvdXQtZWxhcHNlZAorICAgICAgICAgICAgcG9sbGVyLnVucmVnaXN0ZXIoc2VsZikKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIHJldHVybiAoaSwgbSwgdGV4dCkKKyAgICAgICAgdGV4dCA9IHNlbGYucmVhZF92ZXJ5X2xhenkoKQorICAgICAgICBpZiBub3QgdGV4dCBhbmQgc2VsZi5lb2Y6CisgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICByZXR1cm4gKC0xLCBOb25lLCB0ZXh0KQorCisgICAgZGVmIF9leHBlY3Rfd2l0aF9zZWxlY3Qoc2VsZiwgbGlzdCwgdGltZW91dD1Ob25lKToKKyAgICAgICAgIiIiUmVhZCB1bnRpbCBvbmUgZnJvbSBhIGxpc3Qgb2YgYSByZWd1bGFyIGV4cHJlc3Npb25zIG1hdGNoZXMuCisKKyAgICAgICAgVGhlIHRpbWVvdXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgc2VsZWN0LnNlbGVjdCgpLgorICAgICAgICAiIiIKKyAgICAgICAgcmUgPSBOb25lCisgICAgICAgIGxpc3QgPSBsaXN0WzpdCisgICAgICAgIGluZGljZXMgPSByYW5nZShsZW4obGlzdCkpCisgICAgICAgIGZvciBpIGluIGluZGljZXM6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihsaXN0W2ldLCAic2VhcmNoIik6CisgICAgICAgICAgICAgICAgaWYgbm90IHJlOiBpbXBvcnQgcmUKKyAgICAgICAgICAgICAgICBsaXN0W2ldID0gcmUuY29tcGlsZShsaXN0W2ldKQorICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZnJvbSB0aW1lIGltcG9ydCB0aW1lCisgICAgICAgICAgICB0aW1lX3N0YXJ0ID0gdGltZSgpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgICAgICBmb3IgaSBpbiBpbmRpY2VzOgorICAgICAgICAgICAgICAgIG0gPSBsaXN0W2ldLnNlYXJjaChzZWxmLmNvb2tlZHEpCisgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgZSA9IG0uZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHNlbGYuY29va2VkcVs6ZV0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb29rZWRxID0gc2VsZi5jb29rZWRxW2U6XQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGksIG0sIHRleHQpCisgICAgICAgICAgICBpZiBzZWxmLmVvZjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBlbGFwc2VkID0gdGltZSgpIC0gdGltZV9zdGFydAorICAgICAgICAgICAgICAgIGlmIGVsYXBzZWQgPj0gdGltZW91dDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzX2FyZ3MgPSAoW3NlbGYuZmlsZW5vKCldLCBbXSwgW10sIHRpbWVvdXQtZWxhcHNlZCkKKyAgICAgICAgICAgICAgICByLCB3LCB4ID0gc2VsZWN0LnNlbGVjdCgqc19hcmdzKQorICAgICAgICAgICAgICAgIGlmIG5vdCByOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2VsZi5maWxsX3Jhd3EoKQorICAgICAgICB0ZXh0ID0gc2VsZi5yZWFkX3ZlcnlfbGF6eSgpCisgICAgICAgIGlmIG5vdCB0ZXh0IGFuZCBzZWxmLmVvZjoKKyAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgICAgIHJldHVybiAoLTEsIE5vbmUsIHRleHQpCisKKworZGVmIHRlc3QoKToKKyAgICAiIiJUZXN0IHByb2dyYW0gZm9yIHRlbG5ldGxpYi4KKworICAgIFVzYWdlOiBweXRob24gdGVsbmV0bGliLnB5IFstZF0gLi4uIFtob3N0IFtwb3J0XV0KKworICAgIERlZmF1bHQgaG9zdCBpcyBsb2NhbGhvc3Q7IGRlZmF1bHQgcG9ydCBpcyAyMy4KKworICAgICIiIgorICAgIGRlYnVnbGV2ZWwgPSAwCisgICAgd2hpbGUgc3lzLmFyZ3ZbMTpdIGFuZCBzeXMuYXJndlsxXSA9PSAnLWQnOgorICAgICAgICBkZWJ1Z2xldmVsID0gZGVidWdsZXZlbCsxCisgICAgICAgIGRlbCBzeXMuYXJndlsxXQorICAgIGhvc3QgPSAnbG9jYWxob3N0JworICAgIGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgaG9zdCA9IHN5cy5hcmd2WzFdCisgICAgcG9ydCA9IDAKKyAgICBpZiBzeXMuYXJndlsyOl06CisgICAgICAgIHBvcnRzdHIgPSBzeXMuYXJndlsyXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwb3J0ID0gaW50KHBvcnRzdHIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcG9ydCA9IHNvY2tldC5nZXRzZXJ2YnluYW1lKHBvcnRzdHIsICd0Y3AnKQorICAgIHRuID0gVGVsbmV0KCkKKyAgICB0bi5zZXRfZGVidWdsZXZlbChkZWJ1Z2xldmVsKQorICAgIHRuLm9wZW4oaG9zdCwgcG9ydCwgdGltZW91dD0wLjUpCisgICAgdG4uaW50ZXJhY3QoKQorICAgIHRuLmNsb3NlKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVsbmV0bGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVsbmV0bGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQ4OTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZWxuZXRsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVsbmV0bGliLnB5byBiL2xpYi9weXRob24yLjcvdGVsbmV0bGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQ4OTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZWxuZXRsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVtcGZpbGUucHkgYi9saWIvcHl0aG9uMi43L3RlbXBmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyZGRiYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RlbXBmaWxlLnB5CkBAIC0wLDAgKzEsNjE4IEBACisiIiJUZW1wb3JhcnkgZmlsZXMuCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGdlbmVyaWMsIGxvdy0gYW5kIGhpZ2gtbGV2ZWwgaW50ZXJmYWNlcyBmb3IKK2NyZWF0aW5nIHRlbXBvcmFyeSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuICBUaGUgaW50ZXJmYWNlcyBsaXN0ZWQKK2FzICJzYWZlIiBqdXN0IGJlbG93IGNhbiBiZSB1c2VkIHdpdGhvdXQgZmVhciBvZiByYWNlIGNvbmRpdGlvbnMuCitUaG9zZSBsaXN0ZWQgYXMgInVuc2FmZSIgY2Fubm90LCBhbmQgYXJlIHByb3ZpZGVkIGZvciBiYWNrd2FyZAorY29tcGF0aWJpbGl0eSBvbmx5LgorCitUaGlzIG1vZHVsZSBhbHNvIHByb3ZpZGVzIHNvbWUgZGF0YSBpdGVtcyB0byB0aGUgdXNlcjoKKworICBUTVBfTUFYICAtIG1heGltdW0gbnVtYmVyIG9mIG5hbWVzIHRoYXQgd2lsbCBiZSB0cmllZCBiZWZvcmUKKyAgICAgICAgICAgICBnaXZpbmcgdXAuCisgIHRlbXBsYXRlIC0gdGhlIGRlZmF1bHQgcHJlZml4IGZvciBhbGwgdGVtcG9yYXJ5IG5hbWVzLgorICAgICAgICAgICAgIFlvdSBtYXkgY2hhbmdlIHRoaXMgdG8gY29udHJvbCB0aGUgZGVmYXVsdCBwcmVmaXguCisgIHRlbXBkaXIgIC0gSWYgdGhpcyBpcyBzZXQgdG8gYSBzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCB1c2Ugb2YKKyAgICAgICAgICAgICBhbnkgcm91dGluZSBmcm9tIHRoaXMgbW9kdWxlLCBpdCB3aWxsIGJlIGNvbnNpZGVyZWQgYXMKKyAgICAgICAgICAgICBhbm90aGVyIGNhbmRpZGF0ZSBsb2NhdGlvbiB0byBzdG9yZSB0ZW1wb3JhcnkgZmlsZXMuCisiIiIKKworX19hbGxfXyA9IFsKKyAgICAiTmFtZWRUZW1wb3JhcnlGaWxlIiwgIlRlbXBvcmFyeUZpbGUiLCAjIGhpZ2ggbGV2ZWwgc2FmZSBpbnRlcmZhY2VzCisgICAgIlNwb29sZWRUZW1wb3JhcnlGaWxlIiwKKyAgICAibWtzdGVtcCIsICJta2R0ZW1wIiwgICAgICAgICAgICAgICAgICAjIGxvdyBsZXZlbCBzYWZlIGludGVyZmFjZXMKKyAgICAibWt0ZW1wIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRlcHJlY2F0ZWQgdW5zYWZlIGludGVyZmFjZQorICAgICJUTVBfTUFYIiwgImdldHRlbXBwcmVmaXgiLCAgICAgICAgICAgICMgY29uc3RhbnRzCisgICAgInRlbXBkaXIiLCAiZ2V0dGVtcGRpciIKKyAgIF0KKworCisjIEltcG9ydHMuCisKK2ltcG9ydCBpbyBhcyBfaW8KK2ltcG9ydCBvcyBhcyBfb3MKK2ltcG9ydCBlcnJubyBhcyBfZXJybm8KK2Zyb20gcmFuZG9tIGltcG9ydCBSYW5kb20gYXMgX1JhbmRvbQorCit0cnk6CisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPIGFzIF9TdHJpbmdJTworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPIGFzIF9TdHJpbmdJTworCit0cnk6CisgICAgaW1wb3J0IGZjbnRsIGFzIF9mY250bAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGRlZiBfc2V0X2Nsb2V4ZWMoZmQpOgorICAgICAgICBwYXNzCitlbHNlOgorICAgIGRlZiBfc2V0X2Nsb2V4ZWMoZmQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmbGFncyA9IF9mY250bC5mY250bChmZCwgX2ZjbnRsLkZfR0VURkQsIDApCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBmbGFncyByZWFkIHN1Y2Nlc3NmdWxseSwgbW9kaWZ5CisgICAgICAgICAgICBmbGFncyB8PSBfZmNudGwuRkRfQ0xPRVhFQworICAgICAgICAgICAgX2ZjbnRsLmZjbnRsKGZkLCBfZmNudGwuRl9TRVRGRCwgZmxhZ3MpCisKKwordHJ5OgorICAgIGltcG9ydCB0aHJlYWQgYXMgX3RocmVhZAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBkdW1teV90aHJlYWQgYXMgX3RocmVhZAorX2FsbG9jYXRlX2xvY2sgPSBfdGhyZWFkLmFsbG9jYXRlX2xvY2sKKworX3RleHRfb3BlbmZsYWdzID0gX29zLk9fUkRXUiB8IF9vcy5PX0NSRUFUIHwgX29zLk9fRVhDTAoraWYgaGFzYXR0cihfb3MsICdPX05PSU5IRVJJVCcpOgorICAgIF90ZXh0X29wZW5mbGFncyB8PSBfb3MuT19OT0lOSEVSSVQKK2lmIGhhc2F0dHIoX29zLCAnT19OT0ZPTExPVycpOgorICAgIF90ZXh0X29wZW5mbGFncyB8PSBfb3MuT19OT0ZPTExPVworCitfYmluX29wZW5mbGFncyA9IF90ZXh0X29wZW5mbGFncworaWYgaGFzYXR0cihfb3MsICdPX0JJTkFSWScpOgorICAgIF9iaW5fb3BlbmZsYWdzIHw9IF9vcy5PX0JJTkFSWQorCitpZiBoYXNhdHRyKF9vcywgJ1RNUF9NQVgnKToKKyAgICBUTVBfTUFYID0gX29zLlRNUF9NQVgKK2Vsc2U6CisgICAgVE1QX01BWCA9IDEwMDAwCisKK3RlbXBsYXRlID0gInRtcCIKKworIyBJbnRlcm5hbCByb3V0aW5lcy4KKworX29uY2VfbG9jayA9IF9hbGxvY2F0ZV9sb2NrKCkKKworaWYgaGFzYXR0cihfb3MsICJsc3RhdCIpOgorICAgIF9zdGF0ID0gX29zLmxzdGF0CitlbGlmIGhhc2F0dHIoX29zLCAic3RhdCIpOgorICAgIF9zdGF0ID0gX29zLnN0YXQKK2Vsc2U6CisgICAgIyBGYWxsYmFjay4gIEFsbCB3ZSBuZWVkIGlzIHNvbWV0aGluZyB0aGF0IHJhaXNlcyBvcy5lcnJvciBpZiB0aGUKKyAgICAjIGZpbGUgZG9lc24ndCBleGlzdC4KKyAgICBkZWYgX3N0YXQoZm4pOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmbikKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICByYWlzZSBfb3MuZXJyb3IKKyAgICAgICAgZi5jbG9zZSgpCisKK2RlZiBfZXhpc3RzKGZuKToKKyAgICB0cnk6CisgICAgICAgIF9zdGF0KGZuKQorICAgIGV4Y2VwdCBfb3MuZXJyb3I6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBUcnVlCisKK2NsYXNzIF9SYW5kb21OYW1lU2VxdWVuY2U6CisgICAgIiIiQW4gaW5zdGFuY2Ugb2YgX1JhbmRvbU5hbWVTZXF1ZW5jZSBnZW5lcmF0ZXMgYW4gZW5kbGVzcworICAgIHNlcXVlbmNlIG9mIHVucHJlZGljdGFibGUgc3RyaW5ncyB3aGljaCBjYW4gc2FmZWx5IGJlIGluY29ycG9yYXRlZAorICAgIGludG8gZmlsZSBuYW1lcy4gIEVhY2ggc3RyaW5nIGlzIHNpeCBjaGFyYWN0ZXJzIGxvbmcuICBNdWx0aXBsZQorICAgIHRocmVhZHMgY2FuIHNhZmVseSB1c2UgdGhlIHNhbWUgaW5zdGFuY2UgYXQgdGhlIHNhbWUgdGltZS4KKworICAgIF9SYW5kb21OYW1lU2VxdWVuY2UgaXMgYW4gaXRlcmF0b3IuIiIiCisKKyAgICBjaGFyYWN0ZXJzID0gKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIgKworICAgICAgICAgICAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIiArCisgICAgICAgICAgICAgICAgICAiMDEyMzQ1Njc4OV8iKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm11dGV4ID0gX2FsbG9jYXRlX2xvY2soKQorICAgICAgICBzZWxmLm5vcm1jYXNlID0gX29zLnBhdGgubm9ybWNhc2UKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBybmcoc2VsZik6CisgICAgICAgIGN1cl9waWQgPSBfb3MuZ2V0cGlkKCkKKyAgICAgICAgaWYgY3VyX3BpZCAhPSBnZXRhdHRyKHNlbGYsICdfcm5nX3BpZCcsIE5vbmUpOgorICAgICAgICAgICAgc2VsZi5fcm5nID0gX1JhbmRvbSgpCisgICAgICAgICAgICBzZWxmLl9ybmdfcGlkID0gY3VyX3BpZAorICAgICAgICByZXR1cm4gc2VsZi5fcm5nCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgbSA9IHNlbGYubXV0ZXgKKyAgICAgICAgYyA9IHNlbGYuY2hhcmFjdGVycworICAgICAgICBjaG9vc2UgPSBzZWxmLnJuZy5jaG9pY2UKKworICAgICAgICBtLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsZXR0ZXJzID0gW2Nob29zZShjKSBmb3IgZHVtbXkgaW4gIjEyMzQ1NiJdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBtLnJlbGVhc2UoKQorCisgICAgICAgIHJldHVybiBzZWxmLm5vcm1jYXNlKCcnLmpvaW4obGV0dGVycykpCisKK2RlZiBfY2FuZGlkYXRlX3RlbXBkaXJfbGlzdCgpOgorICAgICIiIkdlbmVyYXRlIGEgbGlzdCBvZiBjYW5kaWRhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzIHdoaWNoCisgICAgX2dldF9kZWZhdWx0X3RlbXBkaXIgd2lsbCB0cnkuIiIiCisKKyAgICBkaXJsaXN0ID0gW10KKworICAgICMgRmlyc3QsIHRyeSB0aGUgZW52aXJvbm1lbnQuCisgICAgZm9yIGVudm5hbWUgaW4gJ1RNUERJUicsICdURU1QJywgJ1RNUCc6CisgICAgICAgIGRpcm5hbWUgPSBfb3MuZ2V0ZW52KGVudm5hbWUpCisgICAgICAgIGlmIGRpcm5hbWU6IGRpcmxpc3QuYXBwZW5kKGRpcm5hbWUpCisKKyAgICAjIEZhaWxpbmcgdGhhdCwgdHJ5IE9TLXNwZWNpZmljIGxvY2F0aW9ucy4KKyAgICBpZiBfb3MubmFtZSA9PSAncmlzY29zJzoKKyAgICAgICAgZGlybmFtZSA9IF9vcy5nZXRlbnYoJ1dpbXAkU2NyYXBEaXInKQorICAgICAgICBpZiBkaXJuYW1lOiBkaXJsaXN0LmFwcGVuZChkaXJuYW1lKQorICAgIGVsaWYgX29zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgZGlybGlzdC5leHRlbmQoWyByJ2M6XHRlbXAnLCByJ2M6XHRtcCcsIHInXHRlbXAnLCByJ1x0bXAnIF0pCisgICAgZWxzZToKKyAgICAgICAgZGlybGlzdC5leHRlbmQoWyAnL3RtcCcsICcvdmFyL3RtcCcsICcvdXNyL3RtcCcgXSkKKworICAgICMgQXMgYSBsYXN0IHJlc29ydCwgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICAgIHRyeToKKyAgICAgICAgZGlybGlzdC5hcHBlbmQoX29zLmdldGN3ZCgpKQorICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIF9vcy5lcnJvcik6CisgICAgICAgIGRpcmxpc3QuYXBwZW5kKF9vcy5jdXJkaXIpCisKKyAgICByZXR1cm4gZGlybGlzdAorCitkZWYgX2dldF9kZWZhdWx0X3RlbXBkaXIoKToKKyAgICAiIiJDYWxjdWxhdGUgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IHRvIHVzZSBmb3IgdGVtcG9yYXJ5IGZpbGVzLgorICAgIFRoaXMgcm91dGluZSBzaG91bGQgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4KKworICAgIFdlIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCBhIGNhbmRpZGF0ZSB0ZW1wIGRpciBpcyB1c2FibGUgYnkKKyAgICB0cnlpbmcgdG8gY3JlYXRlIGFuZCB3cml0ZSB0byBhIGZpbGUgaW4gdGhhdCBkaXJlY3RvcnkuICBJZiB0aGlzCisgICAgaXMgc3VjY2Vzc2Z1bCwgdGhlIHRlc3QgZmlsZSBpcyBkZWxldGVkLiAgVG8gcHJldmVudCBkZW5pYWwgb2YKKyAgICBzZXJ2aWNlLCB0aGUgbmFtZSBvZiB0aGUgdGVzdCBmaWxlIG11c3QgYmUgcmFuZG9taXplZC4iIiIKKworICAgIG5hbWVyID0gX1JhbmRvbU5hbWVTZXF1ZW5jZSgpCisgICAgZGlybGlzdCA9IF9jYW5kaWRhdGVfdGVtcGRpcl9saXN0KCkKKyAgICBmbGFncyA9IF90ZXh0X29wZW5mbGFncworCisgICAgZm9yIGRpciBpbiBkaXJsaXN0OgorICAgICAgICBpZiBkaXIgIT0gX29zLmN1cmRpcjoKKyAgICAgICAgICAgIGRpciA9IF9vcy5wYXRoLm5vcm1jYXNlKF9vcy5wYXRoLmFic3BhdGgoZGlyKSkKKyAgICAgICAgIyBUcnkgb25seSBhIGZldyBuYW1lcyBwZXIgZGlyZWN0b3J5LgorICAgICAgICBmb3Igc2VxIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgbmFtZSA9IG5hbWVyLm5leHQoKQorICAgICAgICAgICAgZmlsZW5hbWUgPSBfb3MucGF0aC5qb2luKGRpciwgbmFtZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmZCA9IF9vcy5vcGVuKGZpbGVuYW1lLCBmbGFncywgMG82MDApCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIF9pby5vcGVuKGZkLCAnd2InLCBjbG9zZWZkPUZhbHNlKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcC53cml0ZShiJ2JsYXQnKQorICAgICAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICAgICAgX29zLmNsb3NlKGZkKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIF9vcy51bmxpbmsoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRpcgorICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBJT0Vycm9yKSBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGUuYXJnc1swXSAhPSBfZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgICAgICAgICBicmVhayAjIG5vIHBvaW50IHRyeWluZyBtb3JlIG5hbWVzIGluIHRoaXMgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgcGFzcworICAgIHJhaXNlIElPRXJyb3IsIChfZXJybm8uRU5PRU5ULAorICAgICAgICAgICAgICAgICAgICAoIk5vIHVzYWJsZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvdW5kIGluICVzIiAlIGRpcmxpc3QpKQorCitfbmFtZV9zZXF1ZW5jZSA9IE5vbmUKKworZGVmIF9nZXRfY2FuZGlkYXRlX25hbWVzKCk6CisgICAgIiIiQ29tbW9uIHNldHVwIHNlcXVlbmNlIGZvciBhbGwgdXNlci1jYWxsYWJsZSBpbnRlcmZhY2VzLiIiIgorCisgICAgZ2xvYmFsIF9uYW1lX3NlcXVlbmNlCisgICAgaWYgX25hbWVfc2VxdWVuY2UgaXMgTm9uZToKKyAgICAgICAgX29uY2VfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgX25hbWVfc2VxdWVuY2UgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBfbmFtZV9zZXF1ZW5jZSA9IF9SYW5kb21OYW1lU2VxdWVuY2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX29uY2VfbG9jay5yZWxlYXNlKCkKKyAgICByZXR1cm4gX25hbWVfc2VxdWVuY2UKKworCitkZWYgX21rc3RlbXBfaW5uZXIoZGlyLCBwcmUsIHN1ZiwgZmxhZ3MpOgorICAgICIiIkNvZGUgY29tbW9uIHRvIG1rc3RlbXAsIFRlbXBvcmFyeUZpbGUsIGFuZCBOYW1lZFRlbXBvcmFyeUZpbGUuIiIiCisKKyAgICBuYW1lcyA9IF9nZXRfY2FuZGlkYXRlX25hbWVzKCkKKworICAgIGZvciBzZXEgaW4geHJhbmdlKFRNUF9NQVgpOgorICAgICAgICBuYW1lID0gbmFtZXMubmV4dCgpCisgICAgICAgIGZpbGUgPSBfb3MucGF0aC5qb2luKGRpciwgcHJlICsgbmFtZSArIHN1ZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmQgPSBfb3Mub3BlbihmaWxlLCBmbGFncywgMDYwMCkKKyAgICAgICAgICAgIF9zZXRfY2xvZXhlYyhmZCkKKyAgICAgICAgICAgIHJldHVybiAoZmQsIF9vcy5wYXRoLmFic3BhdGgoZmlsZSkpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBfZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlICMgdHJ5IGFnYWluCisgICAgICAgICAgICByYWlzZQorCisgICAgcmFpc2UgSU9FcnJvciwgKF9lcnJuby5FRVhJU1QsICJObyB1c2FibGUgdGVtcG9yYXJ5IGZpbGUgbmFtZSBmb3VuZCIpCisKKworIyBVc2VyIHZpc2libGUgaW50ZXJmYWNlcy4KKworZGVmIGdldHRlbXBwcmVmaXgoKToKKyAgICAiIiJBY2Nlc3NvciBmb3IgdGVtcGRpci50ZW1wbGF0ZS4iIiIKKyAgICByZXR1cm4gdGVtcGxhdGUKKwordGVtcGRpciA9IE5vbmUKKworZGVmIGdldHRlbXBkaXIoKToKKyAgICAiIiJBY2Nlc3NvciBmb3IgdGVtcGZpbGUudGVtcGRpci4iIiIKKyAgICBnbG9iYWwgdGVtcGRpcgorICAgIGlmIHRlbXBkaXIgaXMgTm9uZToKKyAgICAgICAgX29uY2VfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgdGVtcGRpciBpcyBOb25lOgorICAgICAgICAgICAgICAgIHRlbXBkaXIgPSBfZ2V0X2RlZmF1bHRfdGVtcGRpcigpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBfb25jZV9sb2NrLnJlbGVhc2UoKQorICAgIHJldHVybiB0ZW1wZGlyCisKK2RlZiBta3N0ZW1wKHN1ZmZpeD0iIiwgcHJlZml4PXRlbXBsYXRlLCBkaXI9Tm9uZSwgdGV4dD1GYWxzZSk6CisgICAgIiIiVXNlci1jYWxsYWJsZSBmdW5jdGlvbiB0byBjcmVhdGUgYW5kIHJldHVybiBhIHVuaXF1ZSB0ZW1wb3JhcnkKKyAgICBmaWxlLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHBhaXIgKGZkLCBuYW1lKSB3aGVyZSBmZCBpcyB0aGUKKyAgICBmaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgb3Mub3BlbiwgYW5kIG5hbWUgaXMgdGhlIGZpbGVuYW1lLgorCisgICAgSWYgJ3N1ZmZpeCcgaXMgc3BlY2lmaWVkLCB0aGUgZmlsZSBuYW1lIHdpbGwgZW5kIHdpdGggdGhhdCBzdWZmaXgsCisgICAgb3RoZXJ3aXNlIHRoZXJlIHdpbGwgYmUgbm8gc3VmZml4LgorCisgICAgSWYgJ3ByZWZpeCcgaXMgc3BlY2lmaWVkLCB0aGUgZmlsZSBuYW1lIHdpbGwgYmVnaW4gd2l0aCB0aGF0IHByZWZpeCwKKyAgICBvdGhlcndpc2UgYSBkZWZhdWx0IHByZWZpeCBpcyB1c2VkLgorCisgICAgSWYgJ2RpcicgaXMgc3BlY2lmaWVkLCB0aGUgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhhdCBkaXJlY3RvcnksCisgICAgb3RoZXJ3aXNlIGEgZGVmYXVsdCBkaXJlY3RvcnkgaXMgdXNlZC4KKworICAgIElmICd0ZXh0JyBpcyBzcGVjaWZpZWQgYW5kIHRydWUsIHRoZSBmaWxlIGlzIG9wZW5lZCBpbiB0ZXh0CisgICAgbW9kZS4gIEVsc2UgKHRoZSBkZWZhdWx0KSB0aGUgZmlsZSBpcyBvcGVuZWQgaW4gYmluYXJ5IG1vZGUuICBPbgorICAgIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIHRoaXMgbWFrZXMgbm8gZGlmZmVyZW5jZS4KKworICAgIFRoZSBmaWxlIGlzIHJlYWRhYmxlIGFuZCB3cml0YWJsZSBvbmx5IGJ5IHRoZSBjcmVhdGluZyB1c2VyIElELgorICAgIElmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHVzZXMgcGVybWlzc2lvbiBiaXRzIHRvIGluZGljYXRlIHdoZXRoZXIgYQorICAgIGZpbGUgaXMgZXhlY3V0YWJsZSwgdGhlIGZpbGUgaXMgZXhlY3V0YWJsZSBieSBubyBvbmUuIFRoZSBmaWxlCisgICAgZGVzY3JpcHRvciBpcyBub3QgaW5oZXJpdGVkIGJ5IGNoaWxkcmVuIG9mIHRoaXMgcHJvY2Vzcy4KKworICAgIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIGZpbGUgd2hlbiBkb25lIHdpdGggaXQuCisgICAgIiIiCisKKyAgICBpZiBkaXIgaXMgTm9uZToKKyAgICAgICAgZGlyID0gZ2V0dGVtcGRpcigpCisKKyAgICBpZiB0ZXh0OgorICAgICAgICBmbGFncyA9IF90ZXh0X29wZW5mbGFncworICAgIGVsc2U6CisgICAgICAgIGZsYWdzID0gX2Jpbl9vcGVuZmxhZ3MKKworICAgIHJldHVybiBfbWtzdGVtcF9pbm5lcihkaXIsIHByZWZpeCwgc3VmZml4LCBmbGFncykKKworCitkZWYgbWtkdGVtcChzdWZmaXg9IiIsIHByZWZpeD10ZW1wbGF0ZSwgZGlyPU5vbmUpOgorICAgICIiIlVzZXItY2FsbGFibGUgZnVuY3Rpb24gdG8gY3JlYXRlIGFuZCByZXR1cm4gYSB1bmlxdWUgdGVtcG9yYXJ5CisgICAgZGlyZWN0b3J5LiAgVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgcGF0aG5hbWUgb2YgdGhlIGRpcmVjdG9yeS4KKworICAgIEFyZ3VtZW50cyBhcmUgYXMgZm9yIG1rc3RlbXAsIGV4Y2VwdCB0aGF0IHRoZSAndGV4dCcgYXJndW1lbnQgaXMKKyAgICBub3QgYWNjZXB0ZWQuCisKKyAgICBUaGUgZGlyZWN0b3J5IGlzIHJlYWRhYmxlLCB3cml0YWJsZSwgYW5kIHNlYXJjaGFibGUgb25seSBieSB0aGUKKyAgICBjcmVhdGluZyB1c2VyLgorCisgICAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBkZWxldGluZyB0aGUgZGlyZWN0b3J5IHdoZW4gZG9uZSB3aXRoIGl0LgorICAgICIiIgorCisgICAgaWYgZGlyIGlzIE5vbmU6CisgICAgICAgIGRpciA9IGdldHRlbXBkaXIoKQorCisgICAgbmFtZXMgPSBfZ2V0X2NhbmRpZGF0ZV9uYW1lcygpCisKKyAgICBmb3Igc2VxIGluIHhyYW5nZShUTVBfTUFYKToKKyAgICAgICAgbmFtZSA9IG5hbWVzLm5leHQoKQorICAgICAgICBmaWxlID0gX29zLnBhdGguam9pbihkaXIsIHByZWZpeCArIG5hbWUgKyBzdWZmaXgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9vcy5ta2RpcihmaWxlLCAwNzAwKQorICAgICAgICAgICAgcmV0dXJuIGZpbGUKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vID09IF9lcnJuby5FRVhJU1Q6CisgICAgICAgICAgICAgICAgY29udGludWUgIyB0cnkgYWdhaW4KKyAgICAgICAgICAgIHJhaXNlCisKKyAgICByYWlzZSBJT0Vycm9yLCAoX2Vycm5vLkVFWElTVCwgIk5vIHVzYWJsZSB0ZW1wb3JhcnkgZGlyZWN0b3J5IG5hbWUgZm91bmQiKQorCitkZWYgbWt0ZW1wKHN1ZmZpeD0iIiwgcHJlZml4PXRlbXBsYXRlLCBkaXI9Tm9uZSk6CisgICAgIiIiVXNlci1jYWxsYWJsZSBmdW5jdGlvbiB0byByZXR1cm4gYSB1bmlxdWUgdGVtcG9yYXJ5IGZpbGUgbmFtZS4gIFRoZQorICAgIGZpbGUgaXMgbm90IGNyZWF0ZWQuCisKKyAgICBBcmd1bWVudHMgYXJlIGFzIGZvciBta3N0ZW1wLCBleGNlcHQgdGhhdCB0aGUgJ3RleHQnIGFyZ3VtZW50IGlzCisgICAgbm90IGFjY2VwdGVkLgorCisgICAgVGhpcyBmdW5jdGlvbiBpcyB1bnNhZmUgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4gIFRoZSBmaWxlIG5hbWUKKyAgICByZWZlcnMgdG8gYSBmaWxlIHRoYXQgZGlkIG5vdCBleGlzdCBhdCBzb21lIHBvaW50LCBidXQgYnkgdGhlIHRpbWUKKyAgICB5b3UgZ2V0IGFyb3VuZCB0byBjcmVhdGluZyBpdCwgc29tZW9uZSBlbHNlIG1heSBoYXZlIGJlYXRlbiB5b3UgdG8KKyAgICB0aGUgcHVuY2guCisgICAgIiIiCisKKyMjICAgIGZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4gYXMgX3dhcm4KKyMjICAgIF93YXJuKCJta3RlbXAgaXMgYSBwb3RlbnRpYWwgc2VjdXJpdHkgcmlzayB0byB5b3VyIHByb2dyYW0iLAorIyMgICAgICAgICAgUnVudGltZVdhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKworICAgIGlmIGRpciBpcyBOb25lOgorICAgICAgICBkaXIgPSBnZXR0ZW1wZGlyKCkKKworICAgIG5hbWVzID0gX2dldF9jYW5kaWRhdGVfbmFtZXMoKQorICAgIGZvciBzZXEgaW4geHJhbmdlKFRNUF9NQVgpOgorICAgICAgICBuYW1lID0gbmFtZXMubmV4dCgpCisgICAgICAgIGZpbGUgPSBfb3MucGF0aC5qb2luKGRpciwgcHJlZml4ICsgbmFtZSArIHN1ZmZpeCkKKyAgICAgICAgaWYgbm90IF9leGlzdHMoZmlsZSk6CisgICAgICAgICAgICByZXR1cm4gZmlsZQorCisgICAgcmFpc2UgSU9FcnJvciwgKF9lcnJuby5FRVhJU1QsICJObyB1c2FibGUgdGVtcG9yYXJ5IGZpbGVuYW1lIGZvdW5kIikKKworCitjbGFzcyBfVGVtcG9yYXJ5RmlsZVdyYXBwZXI6CisgICAgIiIiVGVtcG9yYXJ5IGZpbGUgd3JhcHBlcgorCisgICAgVGhpcyBjbGFzcyBwcm92aWRlcyBhIHdyYXBwZXIgYXJvdW5kIGZpbGVzIG9wZW5lZCBmb3IKKyAgICB0ZW1wb3JhcnkgdXNlLiAgSW4gcGFydGljdWxhciwgaXQgc2Vla3MgdG8gYXV0b21hdGljYWxseQorICAgIHJlbW92ZSB0aGUgZmlsZSB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgbmFtZSwgZGVsZXRlPVRydWUpOgorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5jbG9zZV9jYWxsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmRlbGV0ZSA9IGRlbGV0ZQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAjIEF0dHJpYnV0ZSBsb29rdXBzIGFyZSBkZWxlZ2F0ZWQgdG8gdGhlIHVuZGVybHlpbmcgZmlsZQorICAgICAgICAjIGFuZCBjYWNoZWQgZm9yIG5vbi1udW1lcmljIHJlc3VsdHMKKyAgICAgICAgIyAoaS5lLiBtZXRob2RzIGFyZSBjYWNoZWQsIGNsb3NlZCBhbmQgZnJpZW5kcyBhcmUgbm90KQorICAgICAgICBmaWxlID0gc2VsZi5fX2RpY3RfX1snZmlsZSddCisgICAgICAgIGEgPSBnZXRhdHRyKGZpbGUsIG5hbWUpCisgICAgICAgIGlmIG5vdCBpc3N1YmNsYXNzKHR5cGUoYSksIHR5cGUoMCkpOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBhKQorICAgICAgICByZXR1cm4gYQorCisgICAgIyBUaGUgdW5kZXJseWluZyBfX2VudGVyX18gbWV0aG9kIHJldHVybnMgdGhlIHdyb25nIG9iamVjdAorICAgICMgKHNlbGYuZmlsZSkgc28gb3ZlcnJpZGUgaXQgdG8gcmV0dXJuIHRoZSB3cmFwcGVyCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgc2VsZi5maWxlLl9fZW50ZXJfXygpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAjIE5UIHByb3ZpZGVzIGRlbGV0ZS1vbi1jbG9zZSBhcyBhIHByaW1pdGl2ZSwgc28gd2UgZG9uJ3QgbmVlZAorICAgICMgdGhlIHdyYXBwZXIgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4gIFdlIHN0aWxsIHVzZSBpdCBzbyB0aGF0CisgICAgIyBmaWxlLm5hbWUgaXMgdXNlZnVsIChpLmUuIG5vdCAiKGZkb3BlbikiKSB3aXRoIE5hbWVkVGVtcG9yYXJ5RmlsZS4KKyAgICBpZiBfb3MubmFtZSAhPSAnbnQnOgorICAgICAgICAjIENhY2hlIHRoZSB1bmxpbmtlciBzbyB3ZSBkb24ndCBnZXQgc3B1cmlvdXMgZXJyb3JzIGF0CisgICAgICAgICMgc2h1dGRvd24gd2hlbiB0aGUgbW9kdWxlLWxldmVsICJvcyIgaXMgTm9uZSdkIG91dC4gIE5vdGUKKyAgICAgICAgIyB0aGF0IHRoaXMgbXVzdCBiZSByZWZlcmVuY2VkIGFzIHNlbGYudW5saW5rLCBiZWNhdXNlIHRoZQorICAgICAgICAjIG5hbWUgVGVtcG9yYXJ5RmlsZVdyYXBwZXIgbWF5IGFsc28gZ2V0IE5vbmUnZCBvdXQgYmVmb3JlCisgICAgICAgICMgX19kZWxfXyBpcyBjYWxsZWQuCisgICAgICAgIHVubGluayA9IF9vcy51bmxpbmsKKworICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jbG9zZV9jYWxsZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZV9jYWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmRlbGV0ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmxpbmsoc2VsZi5uYW1lKQorCisgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICAgICAgIyBOZWVkIHRvIHRyYXAgX19leGl0X18gYXMgd2VsbCB0byBlbnN1cmUgdGhlIGZpbGUgZ2V0cworICAgICAgICAjIGRlbGV0ZWQgd2hlbiB1c2VkIGluIGEgd2l0aCBzdGF0ZW1lbnQKKyAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4YywgdmFsdWUsIHRiKToKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmlsZS5fX2V4aXRfXyhleGMsIHZhbHVlLCB0YikKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIGVsc2U6CisgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGMsIHZhbHVlLCB0Yik6CisgICAgICAgICAgICBzZWxmLmZpbGUuX19leGl0X18oZXhjLCB2YWx1ZSwgdGIpCisKKworZGVmIE5hbWVkVGVtcG9yYXJ5RmlsZShtb2RlPSd3K2InLCBidWZzaXplPS0xLCBzdWZmaXg9IiIsCisgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD10ZW1wbGF0ZSwgZGlyPU5vbmUsIGRlbGV0ZT1UcnVlKToKKyAgICAiIiJDcmVhdGUgYW5kIHJldHVybiBhIHRlbXBvcmFyeSBmaWxlLgorICAgIEFyZ3VtZW50czoKKyAgICAncHJlZml4JywgJ3N1ZmZpeCcsICdkaXInIC0tIGFzIGZvciBta3N0ZW1wLgorICAgICdtb2RlJyAtLSB0aGUgbW9kZSBhcmd1bWVudCB0byBvcy5mZG9wZW4gKGRlZmF1bHQgIncrYiIpLgorICAgICdidWZzaXplJyAtLSB0aGUgYnVmZmVyIHNpemUgYXJndW1lbnQgdG8gb3MuZmRvcGVuIChkZWZhdWx0IC0xKS4KKyAgICAnZGVsZXRlJyAtLSB3aGV0aGVyIHRoZSBmaWxlIGlzIGRlbGV0ZWQgb24gY2xvc2UgKGRlZmF1bHQgVHJ1ZSkuCisgICAgVGhlIGZpbGUgaXMgY3JlYXRlZCBhcyBta3N0ZW1wKCkgd291bGQgZG8gaXQuCisKKyAgICBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgZmlsZS1saWtlIGludGVyZmFjZTsgdGhlIG5hbWUgb2YgdGhlIGZpbGUKKyAgICBpcyBhY2Nlc3NpYmxlIGFzIGZpbGUubmFtZS4gIFRoZSBmaWxlIHdpbGwgYmUgYXV0b21hdGljYWxseSBkZWxldGVkCisgICAgd2hlbiBpdCBpcyBjbG9zZWQgdW5sZXNzIHRoZSAnZGVsZXRlJyBhcmd1bWVudCBpcyBzZXQgdG8gRmFsc2UuCisgICAgIiIiCisKKyAgICBpZiBkaXIgaXMgTm9uZToKKyAgICAgICAgZGlyID0gZ2V0dGVtcGRpcigpCisKKyAgICBpZiAnYicgaW4gbW9kZToKKyAgICAgICAgZmxhZ3MgPSBfYmluX29wZW5mbGFncworICAgIGVsc2U6CisgICAgICAgIGZsYWdzID0gX3RleHRfb3BlbmZsYWdzCisKKyAgICAjIFNldHRpbmcgT19URU1QT1JBUlkgaW4gdGhlIGZsYWdzIGNhdXNlcyB0aGUgT1MgdG8gZGVsZXRlCisgICAgIyB0aGUgZmlsZSB3aGVuIGl0IGlzIGNsb3NlZC4gIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQgYnkgV2luZG93cy4KKyAgICBpZiBfb3MubmFtZSA9PSAnbnQnIGFuZCBkZWxldGU6CisgICAgICAgIGZsYWdzIHw9IF9vcy5PX1RFTVBPUkFSWQorCisgICAgKGZkLCBuYW1lKSA9IF9ta3N0ZW1wX2lubmVyKGRpciwgcHJlZml4LCBzdWZmaXgsIGZsYWdzKQorICAgIGZpbGUgPSBfb3MuZmRvcGVuKGZkLCBtb2RlLCBidWZzaXplKQorICAgIHJldHVybiBfVGVtcG9yYXJ5RmlsZVdyYXBwZXIoZmlsZSwgbmFtZSwgZGVsZXRlKQorCitpZiBfb3MubmFtZSAhPSAncG9zaXgnIG9yIF9vcy5zeXMucGxhdGZvcm0gPT0gJ2N5Z3dpbic6CisgICAgIyBPbiBub24tUE9TSVggYW5kIEN5Z3dpbiBzeXN0ZW1zLCBhc3N1bWUgdGhhdCB3ZSBjYW5ub3QgdW5saW5rIGEgZmlsZQorICAgICMgd2hpbGUgaXQgaXMgb3Blbi4KKyAgICBUZW1wb3JhcnlGaWxlID0gTmFtZWRUZW1wb3JhcnlGaWxlCisKK2Vsc2U6CisgICAgZGVmIFRlbXBvcmFyeUZpbGUobW9kZT0ndytiJywgYnVmc2l6ZT0tMSwgc3VmZml4PSIiLAorICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD10ZW1wbGF0ZSwgZGlyPU5vbmUpOgorICAgICAgICAiIiJDcmVhdGUgYW5kIHJldHVybiBhIHRlbXBvcmFyeSBmaWxlLgorICAgICAgICBBcmd1bWVudHM6CisgICAgICAgICdwcmVmaXgnLCAnc3VmZml4JywgJ2RpcicgLS0gYXMgZm9yIG1rc3RlbXAuCisgICAgICAgICdtb2RlJyAtLSB0aGUgbW9kZSBhcmd1bWVudCB0byBvcy5mZG9wZW4gKGRlZmF1bHQgIncrYiIpLgorICAgICAgICAnYnVmc2l6ZScgLS0gdGhlIGJ1ZmZlciBzaXplIGFyZ3VtZW50IHRvIG9zLmZkb3BlbiAoZGVmYXVsdCAtMSkuCisgICAgICAgIFRoZSBmaWxlIGlzIGNyZWF0ZWQgYXMgbWtzdGVtcCgpIHdvdWxkIGRvIGl0LgorCisgICAgICAgIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSBmaWxlLWxpa2UgaW50ZXJmYWNlLiAgVGhlIGZpbGUgaGFzIG5vCisgICAgICAgIG5hbWUsIGFuZCB3aWxsIGNlYXNlIHRvIGV4aXN0IHdoZW4gaXQgaXMgY2xvc2VkLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBkaXIgaXMgTm9uZToKKyAgICAgICAgICAgIGRpciA9IGdldHRlbXBkaXIoKQorCisgICAgICAgIGlmICdiJyBpbiBtb2RlOgorICAgICAgICAgICAgZmxhZ3MgPSBfYmluX29wZW5mbGFncworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmxhZ3MgPSBfdGV4dF9vcGVuZmxhZ3MKKworICAgICAgICAoZmQsIG5hbWUpID0gX21rc3RlbXBfaW5uZXIoZGlyLCBwcmVmaXgsIHN1ZmZpeCwgZmxhZ3MpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9vcy51bmxpbmsobmFtZSkKKyAgICAgICAgICAgIHJldHVybiBfb3MuZmRvcGVuKGZkLCBtb2RlLCBidWZzaXplKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBfb3MuY2xvc2UoZmQpCisgICAgICAgICAgICByYWlzZQorCitjbGFzcyBTcG9vbGVkVGVtcG9yYXJ5RmlsZToKKyAgICAiIiJUZW1wb3JhcnkgZmlsZSB3cmFwcGVyLCBzcGVjaWFsaXplZCB0byBzd2l0Y2ggZnJvbQorICAgIFN0cmluZ0lPIHRvIGEgcmVhbCBmaWxlIHdoZW4gaXQgZXhjZWVkcyBhIGNlcnRhaW4gc2l6ZSBvcgorICAgIHdoZW4gYSBmaWxlbm8gaXMgbmVlZGVkLgorICAgICIiIgorICAgIF9yb2xsZWQgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1heF9zaXplPTAsIG1vZGU9J3crYicsIGJ1ZnNpemU9LTEsCisgICAgICAgICAgICAgICAgIHN1ZmZpeD0iIiwgcHJlZml4PXRlbXBsYXRlLCBkaXI9Tm9uZSk6CisgICAgICAgIHNlbGYuX2ZpbGUgPSBfU3RyaW5nSU8oKQorICAgICAgICBzZWxmLl9tYXhfc2l6ZSA9IG1heF9zaXplCisgICAgICAgIHNlbGYuX3JvbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuX1RlbXBvcmFyeUZpbGVBcmdzID0gKG1vZGUsIGJ1ZnNpemUsIHN1ZmZpeCwgcHJlZml4LCBkaXIpCisKKyAgICBkZWYgX2NoZWNrKHNlbGYsIGZpbGUpOgorICAgICAgICBpZiBzZWxmLl9yb2xsZWQ6IHJldHVybgorICAgICAgICBtYXhfc2l6ZSA9IHNlbGYuX21heF9zaXplCisgICAgICAgIGlmIG1heF9zaXplIGFuZCBmaWxlLnRlbGwoKSA+IG1heF9zaXplOgorICAgICAgICAgICAgc2VsZi5yb2xsb3ZlcigpCisKKyAgICBkZWYgcm9sbG92ZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3JvbGxlZDogcmV0dXJuCisgICAgICAgIGZpbGUgPSBzZWxmLl9maWxlCisgICAgICAgIG5ld2ZpbGUgPSBzZWxmLl9maWxlID0gVGVtcG9yYXJ5RmlsZSgqc2VsZi5fVGVtcG9yYXJ5RmlsZUFyZ3MpCisgICAgICAgIGRlbCBzZWxmLl9UZW1wb3JhcnlGaWxlQXJncworCisgICAgICAgIG5ld2ZpbGUud3JpdGUoZmlsZS5nZXR2YWx1ZSgpKQorICAgICAgICBuZXdmaWxlLnNlZWsoZmlsZS50ZWxsKCksIDApCisKKyAgICAgICAgc2VsZi5fcm9sbGVkID0gVHJ1ZQorCisgICAgIyBUaGUgbWV0aG9kIGNhY2hpbmcgdHJpY2sgZnJvbSBOYW1lZFRlbXBvcmFyeUZpbGUKKyAgICAjIHdvbid0IHdvcmsgaGVyZSwgYmVjYXVzZSBfZmlsZSBtYXkgY2hhbmdlIGZyb20gYQorICAgICMgX1N0cmluZ0lPIGluc3RhbmNlIHRvIGEgcmVhbCBmaWxlLiBTbyB3ZSBsaXN0CisgICAgIyBhbGwgdGhlIG1ldGhvZHMgZGlyZWN0bHkuCisKKyAgICAjIENvbnRleHQgbWFuYWdlbWVudCBwcm90b2NvbAorICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2ZpbGUuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IGVudGVyIGNvbnRleHQgd2l0aCBjbG9zZWQgZmlsZSIpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjLCB2YWx1ZSwgdGIpOgorICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKKworICAgICMgZmlsZSBwcm90b2NvbAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUuX19pdGVyX18oKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjbG9zZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlLmNsb3NlZAorCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgc2VsZi5yb2xsb3ZlcigpCisgICAgICAgIHJldHVybiBzZWxmLl9maWxlLmZpbGVubygpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUuZmx1c2goKQorCisgICAgZGVmIGlzYXR0eShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUuaXNhdHR5KCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBtb2RlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5tb2RlCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9UZW1wb3JhcnlGaWxlQXJnc1swXQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maWxlLm5hbWUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5uZXh0CisKKyAgICBkZWYgcmVhZChzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlLnJlYWQoKmFyZ3MpCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5yZWFkbGluZSgqYXJncykKKworICAgIGRlZiByZWFkbGluZXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5yZWFkbGluZXMoKmFyZ3MpCisKKyAgICBkZWYgc2VlayhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX2ZpbGUuc2VlaygqYXJncykKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBzb2Z0c3BhY2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlLnNvZnRzcGFjZQorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlLnRlbGwoKQorCisgICAgZGVmIHRydW5jYXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLnRydW5jYXRlKCkKKworICAgIGRlZiB3cml0ZShzZWxmLCBzKToKKyAgICAgICAgZmlsZSA9IHNlbGYuX2ZpbGUKKyAgICAgICAgcnYgPSBmaWxlLndyaXRlKHMpCisgICAgICAgIHNlbGYuX2NoZWNrKGZpbGUpCisgICAgICAgIHJldHVybiBydgorCisgICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgaXRlcmFibGUpOgorICAgICAgICBmaWxlID0gc2VsZi5fZmlsZQorICAgICAgICBydiA9IGZpbGUud3JpdGVsaW5lcyhpdGVyYWJsZSkKKyAgICAgICAgc2VsZi5fY2hlY2soZmlsZSkKKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgeHJlYWRsaW5lcyhzZWxmLCAqYXJncyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maWxlLnhyZWFkbGluZXMoKmFyZ3MpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYuX2ZpbGUucmVhZGxpbmVzKCphcmdzKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVtcGZpbGUucHljIGIvbGliL3B5dGhvbjIuNy90ZW1wZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzMWY4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVtcGZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVtcGZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZW1wZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUzMWY4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVtcGZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC8xODV0ZXN0LmRiIGIvbGliL3B5dGhvbjIuNy90ZXN0LzE4NXRlc3QuZGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRjYjVlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC8xODV0ZXN0LmRiCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9TaW5lLTEwMDBIei0zMDBtcy5haWYgYi9saWIvcHl0aG9uMi43L3Rlc3QvU2luZS0xMDAwSHotMzAwbXMuYWlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDhmNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvU2luZS0xMDAwSHotMzAwbXMuYWlmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvdGVzdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTMwNTRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKKyMgRHVtbXkgZmlsZSB0byBtYWtlIHRoaXMgZGlyZWN0b3J5IGEgcGFja2FnZS4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZWQ2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZWQ2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9hdWRpb3Rlc3QuYXUgYi9saWIvcHl0aG9uMi43L3Rlc3QvYXVkaW90ZXN0LmF1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NmIwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYXVkaW90ZXN0LmF1CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9hdXRvdGVzdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC9hdXRvdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWMyMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2F1dG90ZXN0LnB5CkBAIC0wLDAgKzEsNiBAQAorIyBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJ1bm5pbmcgcmVncnRlc3QucHkgZnJvbSB0aGUgY21kbGluZS4KKyMgSXQgY2FuIGJlIGVzcGVjaWFsbHkgaGFuZHkgaWYgeW91J3JlIGluIGFuIGludGVyYWN0aXZlIHNoZWxsLCBlLmcuLAorIyBmcm9tIHRlc3QgaW1wb3J0IGF1dG90ZXN0LgorCitmcm9tIHRlc3QgaW1wb3J0IHJlZ3J0ZXN0CityZWdydGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9hdXRvdGVzdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvYXV0b3Rlc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODViNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYXV0b3Rlc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9hdXRvdGVzdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvYXV0b3Rlc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODViNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYXV0b3Rlc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9iYWRfY29kaW5nLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZF9jb2RpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxYjBhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRfY29kaW5nLnB5CkBAIC0wLDAgKzEgQEAKKyMgLSotIGNvZGluZzogdWZ0LTggLSotCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYmFkX2NvZGluZzIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkX2NvZGluZzIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5MDFiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRfY29kaW5nMi5weQpAQCAtMCwwICsxLDIgQEAKK++7vyNjb2Rpbmc6IHV0ZjgKK3ByaW50ICfmiJEnCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYmFkY2VydC5wZW0gYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkY2VydC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxOTE0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRjZXJ0LnBlbQpAQCAtMCwwICsxLDM2IEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlDWHdJQkFBS0JnUUM4ZGRyaG0rTHV0QnZqWWNRbG5IMjFQUElzZUoxSlZHMkhNbU4yQ21aazJZdWtPKzlMCitvcGRKaFR2YkdmRWowRFFzMUlFOE0ra1RVeU9tdUtmVnJGTUt3dFZlQ0pwaHJBbmhvejdUWU91TEJTcXQ3bFZICitmaGkvVndvdkVTSmxhQk9wK1dNbmZoY2R1UEVZSFl4LzZjblZhcElrWm5MdDMwenUydW0rRHpBOWpRSURBUUFCCitBb0dCQUswRlpwYUtqNlduSlpOMFJxaGhLK2dndEJXd0JuYzBVL296Z0t6MmoxczNmc1NoWWVpR3RXNkNLNW5VCitEMWRaNXd6aGJHVGhJN0xpT1hEdlJ1Y2M5bjd2VWdpMGFscVBRL1BGb2RQeEFOL2VFWWttWFE3VzJrN3p3c0RBCitJVUswS1Voa3RRYkx1OHFGL204cU04NmJhOXk5LzlZa1h1UWJaM0NPbDVhaFRacmhBa0VBMzAxUDA4Ukt2M0tNCitvWG5HVTJVSFR1SjFNQUQyaE9yUHhqRDQvd3hBLzM5RVdHOWJaY3piSnlnZ0I0Ukh1MEkzTk9TRmpBbTNIUW0wCitBTk91NVFLOW93SkJBTmdPZUxmTk5jRjRwcCtVaWtSRnF4azVoVUxxUkFXelZ4VnJXZTg1RmxQbTBWVm1IYmIvCitsb2lmN21xalU4bzFqVGQvTE03UkQ5ZjJ1c1p5RTJwc2F3OENRUUNOTGhrcFgzS081a0tKbVM5TjdKTVpTYzRqCitvb2c1OHllWU84QkJxS0t6cHVnMExYdVF1bHRZdjJLNHZlYUlPMDRpTDlWTGU1ejlTL1ExamFDSEJCdVhBa0VBCit6OGdqR29pMUFPcDZQQkJMWk5zbmNDdmNWLzBhQysxc2U0SHhUTm8yK2R1S1NEbmJxK2xqcU9NK0U3b2RVK05xCitld3ZJV09HLy9lOGZzc2QwbXEzSHl3SkJBSjhsL2M4R1ZtcnBGVHg4ci9uWjJQeXlqdDNkSDF3aWRvb0RYWVNWCitxNkdiZjQxTGxvNXNZQXRteGRuZFRMQVN1SEtlY2FjVGdaVmh5MEZyeVpwTEtyVT0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK0p1c3QgYmFkIGNlcnQgZGF0YQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJQ1h3SUJBQUtCZ1FDOGRkcmhtK0x1dEJ2alljUWxuSDIxUFBJc2VKMUpWRzJITW1OMkNtWmsyWXVrTys5TAorb3BkSmhUdmJHZkVqMERRczFJRThNK2tUVXlPbXVLZlZyRk1Ld3RWZUNKcGhyQW5ob3o3VFlPdUxCU3F0N2xWSAorZmhpL1Z3b3ZFU0psYUJPcCtXTW5maGNkdVBFWUhZeC82Y25WYXBJa1puTHQzMHp1MnVtK0R6QTlqUUlEQVFBQgorQW9HQkFLMEZacGFLajZXbkpaTjBScWhoSytnZ3RCV3dCbmMwVS9vemdLejJqMXMzZnNTaFllaUd0VzZDSzVuVQorRDFkWjV3emhiR1RoSTdMaU9YRHZSdWNjOW43dlVnaTBhbHFQUS9QRm9kUHhBTi9lRVlrbVhRN1cyazd6d3NEQQorSVVLMEtVaGt0UWJMdThxRi9tOHFNODZiYTl5OS85WWtYdVFiWjNDT2w1YWhUWnJoQWtFQTMwMVAwOFJLdjNLTQorb1huR1UyVUhUdUoxTUFEMmhPclB4akQ0L3d4QS8zOUVXRzliWmN6Ykp5Z2dCNFJIdTBJM05PU0ZqQW0zSFFtMAorQU5PdTVRSzlvd0pCQU5nT2VMZk5OY0Y0cHArVWlrUkZxeGs1aFVMcVJBV3pWeFZyV2U4NUZsUG0wVlZtSGJiLworbG9pZjdtcWpVOG8xalRkL0xNN1JEOWYydXNaeUUycHNhdzhDUVFDTkxoa3BYM0tPNWtLSm1TOU43Sk1aU2M0agorb29nNTh5ZVlPOEJCcUtLenB1ZzBMWHVRdWx0WXYySzR2ZWFJTzA0aUw5VkxlNXo5Uy9RMWphQ0hCQnVYQWtFQQorejhnakdvaTFBT3A2UEJCTFpOc25jQ3ZjVi8wYUMrMXNlNEh4VE5vMitkdUtTRG5icStsanFPTStFN29kVStOcQorZXd2SVdPRy8vZThmc3NkMG1xM0h5d0pCQUo4bC9jOEdWbXJwRlR4OHIvbloyUHl5anQzZEgxd2lkb29EWFlTVgorcTZHYmY0MUxsbzVzWUF0bXhkbmRUTEFTdUhLZWNhY1RnWlZoeTBGcnlacExLclU9CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitKdXN0IGJhZCBjZXJ0IGRhdGEKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9iYWRrZXkucGVtIGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZGtleS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4YTk1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRrZXkucGVtCkBAIC0wLDAgKzEsNDAgQEAKKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK0JhZCBLZXksIHRob3VnaCB0aGUgY2VydCBzaG91bGQgYmUgT0sKKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNwekNDQWhDZ0F3SUJBZ0lKQVArcVN0djFjSUdOTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdKTVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0JNSVJHVnNZWGRoY21VeEV6QVJCZ05WQkFjVENsZHBiRzFwYm1kMGIyNHgKK0l6QWhCZ05WQkFvVEdsQjVkR2h2YmlCVGIyWjBkMkZ5WlNCR2IzVnVaR0YwYVc5dU1Rd3dDZ1lEVlFRTEV3TlQKK1Uwd3hIekFkQmdOVkJBTVRGbk52YldWdFlXTm9hVzVsTG5CNWRHaHZiaTV2Y21jd0hoY05NRGN3T0RJM01UWTEKK05EVXdXaGNOTVRNd01qRTJNVFkxTkRVd1dqQ0JpVEVMTUFrR0ExVUVCaE1DVlZNeEVUQVBCZ05WQkFnVENFUmwKK2JHRjNZWEpsTVJNd0VRWURWUVFIRXdwWGFXeHRhVzVuZEc5dU1TTXdJUVlEVlFRS0V4cFFlWFJvYjI0Z1UyOW0KK2RIZGhjbVVnUm05MWJtUmhkR2x2YmpFTU1Bb0dBMVVFQ3hNRFUxTk1NUjh3SFFZRFZRUURFeFp6YjIxbGJXRmoKK2FHbHVaUzV3ZVhSb2IyNHViM0puTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDOGRkcmgKK20rTHV0QnZqWWNRbG5IMjFQUElzZUoxSlZHMkhNbU4yQ21aazJZdWtPKzlMb3BkSmhUdmJHZkVqMERRczFJRTgKK00ra1RVeU9tdUtmVnJGTUt3dFZlQ0pwaHJBbmhvejdUWU91TEJTcXQ3bFZIZmhpL1Z3b3ZFU0psYUJPcCtXTW4KK2ZoY2R1UEVZSFl4LzZjblZhcElrWm5MdDMwenUydW0rRHpBOWpRSURBUUFCb3hVd0V6QVJCZ2xnaGtnQmh2aEMKK0FRRUVCQU1DQmtBd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ1lFQUY0UTVCVnFtQ09MdjFuOGplL0p3OUs2NjlWWGIKKzA4aHlHelFoa2VtRUJZUWQ2ZnpROUEvMVp6SGtKS2IxUDZ5cmVPTFNFaDRLY3hZUHlyTFJDMWxsOG5yNU9sQ3gKK0NNaEtrVG5SNnFCc2ROVjBYdGRVMitOMjVocVcrTWE0WmVxc04vaWlKVkNHTk9aR252UXV2Q0FHV0Y4K0ovZi8KK2lIa0M2Z0dkQkpob2dzND0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK0JhZCBLZXksIHRob3VnaCB0aGUgY2VydCBzaG91bGQgYmUgT0sKKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNwekNDQWhDZ0F3SUJBZ0lKQVArcVN0djFjSUdOTUEwR0NTcUdTSWIzRFFFQkJRVUFNSUdKTVFzd0NRWUQKK1ZRUUdFd0pWVXpFUk1BOEdBMVVFQ0JNSVJHVnNZWGRoY21VeEV6QVJCZ05WQkFjVENsZHBiRzFwYm1kMGIyNHgKK0l6QWhCZ05WQkFvVEdsQjVkR2h2YmlCVGIyWjBkMkZ5WlNCR2IzVnVaR0YwYVc5dU1Rd3dDZ1lEVlFRTEV3TlQKK1Uwd3hIekFkQmdOVkJBTVRGbk52YldWdFlXTm9hVzVsTG5CNWRHaHZiaTV2Y21jd0hoY05NRGN3T0RJM01UWTEKK05EVXdXaGNOTVRNd01qRTJNVFkxTkRVd1dqQ0JpVEVMTUFrR0ExVUVCaE1DVlZNeEVUQVBCZ05WQkFnVENFUmwKK2JHRjNZWEpsTVJNd0VRWURWUVFIRXdwWGFXeHRhVzVuZEc5dU1TTXdJUVlEVlFRS0V4cFFlWFJvYjI0Z1UyOW0KK2RIZGhjbVVnUm05MWJtUmhkR2x2YmpFTU1Bb0dBMVVFQ3hNRFUxTk1NUjh3SFFZRFZRUURFeFp6YjIxbGJXRmoKK2FHbHVaUzV3ZVhSb2IyNHViM0puTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDOGRkcmgKK20rTHV0QnZqWWNRbG5IMjFQUElzZUoxSlZHMkhNbU4yQ21aazJZdWtPKzlMb3BkSmhUdmJHZkVqMERRczFJRTgKK00ra1RVeU9tdUtmVnJGTUt3dFZlQ0pwaHJBbmhvejdUWU91TEJTcXQ3bFZIZmhpL1Z3b3ZFU0psYUJPcCtXTW4KK2ZoY2R1UEVZSFl4LzZjblZhcElrWm5MdDMwenUydW0rRHpBOWpRSURBUUFCb3hVd0V6QVJCZ2xnaGtnQmh2aEMKK0FRRUVCQU1DQmtBd0RRWUpLb1pJaHZjTkFRRUZCUUFEZ1lFQUY0UTVCVnFtQ09MdjFuOGplL0p3OUs2NjlWWGIKKzA4aHlHelFoa2VtRUJZUWQ2ZnpROUEvMVp6SGtKS2IxUDZ5cmVPTFNFaDRLY3hZUHlyTFJDMWxsOG5yNU9sQ3gKK0NNaEtrVG5SNnFCc2ROVjBYdGRVMitOMjVocVcrTWE0WmVxc04vaWlKVkNHTk9aR252UXV2Q0FHV0Y4K0ovZi8KK2lIa0M2Z0dkQkpob2dzND0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlMy5weSBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWM4NDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9mdXR1cmUzLnB5CkBAIC0wLDAgKzEsMTAgQEAKKyIiIlRoaXMgaXMgYSB0ZXN0IiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcmVzdGVkX3Nub3BlcworCitkZWYgZih4KToKKyAgICBkZWYgZyh5KToKKyAgICAgICAgcmV0dXJuIHggKyB5CisgICAgcmV0dXJuIGcKKworcmVzdWx0ID0gZigyKSg0KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9mdXR1cmU0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9mdXR1cmU0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjRjOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTQucHkKQEAgLTAsMCArMSwxMCBAQAorIiIiVGhpcyBpcyBhIHRlc3QiIiIKK2ltcG9ydCBfX2Z1dHVyZV9fCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMKKworZGVmIGYoeCk6CisgICAgZGVmIGcoeSk6CisgICAgICAgIHJldHVybiB4ICsgeQorICAgIHJldHVybiBnCisKK3Jlc3VsdCA9IGYoMikoNCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlNS5weSBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlNS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTdlNWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9mdXR1cmU1LnB5CkBAIC0wLDAgKzEsMTIgQEAKKyIiIlRoaXMgaXMgYSB0ZXN0IiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMKK2ltcG9ydCBmb28KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcworCisKK2RlZiBmKHgpOgorICAgIGRlZiBnKHkpOgorICAgICAgICByZXR1cm4geCArIHkKKyAgICByZXR1cm4gZworCityZXN1bHQgPSBmKDIpKDQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTYucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4YjU1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlNi5weQpAQCAtMCwwICsxLDEwIEBACisiIiJUaGlzIGlzIGEgdGVzdCIiIgorInRoaXMgaXNuJ3QgYSBkb2Mgc3RyaW5nIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzCisKK2RlZiBmKHgpOgorICAgIGRlZiBnKHkpOgorICAgICAgICByZXR1cm4geCArIHkKKyAgICByZXR1cm4gZworCityZXN1bHQgPSBmKDIpKDQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTcucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxZGIyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlNy5weQpAQCAtMCwwICsxLDExIEBACisiIiJUaGlzIGlzIGEgdGVzdCIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXM7IGltcG9ydCBzdHJpbmc7IGZyb20gX19mdXR1cmVfXyBpbXBvcnQgXAorICAgICBuZXN0ZWRfc2NvcGVzCisKK2RlZiBmKHgpOgorICAgIGRlZiBnKHkpOgorICAgICAgICByZXR1cm4geCArIHkKKyAgICByZXR1cm4gZworCityZXN1bHQgPSBmKDIpKDQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTgucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2N2IwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlOC5weQpAQCAtMCwwICsxLDEwIEBACisiIiJUaGlzIGlzIGEgdGVzdCIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0ICoKKworZGVmIGYoeCk6CisgICAgZGVmIGcoeSk6CisgICAgICAgIHJldHVybiB4ICsgeQorICAgIHJldHVybiBnCisKK3ByaW50IGYoMikoNCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlOS5weSBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlOS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGNlMzJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9mdXR1cmU5LnB5CkBAIC0wLDAgKzEsMTAgQEAKKyIiIlRoaXMgaXMgYSB0ZXN0IiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcywgYnJhY2VzCisKK2RlZiBmKHgpOgorICAgIGRlZiBnKHkpOgorICAgICAgICByZXR1cm4geCArIHkKKyAgICByZXR1cm4gZworCitwcmludCBmKDIpKDQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X25vY2FyZXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X25vY2FyZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlYzllYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfbm9jYXJldC5weQpAQCAtMCwwICsxLDIgQEAKK2RlZiBmKHgpOgorICAgIFt4IGZvciB4IGluIHhdID0geApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2J1ZmZlcl90ZXN0cy5weSBiL2xpYi9weXRob24yLjcvdGVzdC9idWZmZXJfdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkOGE1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9idWZmZXJfdGVzdHMucHkKQEAgLTAsMCArMSwyMDYgQEAKKyMgVGVzdHMgdGhhdCB3b3JrIGZvciBib3RoIGJ5dGVzIGFuZCBidWZmZXIgb2JqZWN0cy4KKyMgU2VlIFBFUCAzMTM3LgorCitpbXBvcnQgc3RydWN0CitpbXBvcnQgc3lzCisKK2NsYXNzIE1peGluQnl0ZXNCdWZmZXJDb21tb25UZXN0cyhvYmplY3QpOgorICAgICIiIlRlc3RzIHRoYXQgd29yayBmb3IgYm90aCBieXRlcyBhbmQgYnVmZmVyIG9iamVjdHMuCisgICAgU2VlIFBFUCAzMTM3LgorICAgICIiIgorCisgICAgZGVmIG1hcnNoYWwoc2VsZiwgeCk6CisgICAgICAgICIiIkNvbnZlcnQgeCBpbnRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGVzZSB0ZXN0cy4iIiIKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCd0ZXN0IGNsYXNzIG11c3QgcHJvdmlkZSBhIG1hcnNoYWwgbWV0aG9kJykKKworICAgIGRlZiB0ZXN0X2lzbG93ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInJykuaXNsb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInYScpLmlzbG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidBJykuaXNsb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJ1xuJykuaXNsb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInYWJjJykuaXNsb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJ2FCYycpLmlzbG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ2FiY1xuJykuaXNsb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2FiYycpLmlzbG93ZXIsIDQyKQorCisgICAgZGVmIHRlc3RfaXN1cHBlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYicnKS5pc3VwcGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInYScpLmlzdXBwZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ0EnKS5pc3VwcGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInXG4nKS5pc3VwcGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYidBQkMnKS5pc3VwcGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInQWJDJykuaXN1cHBlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInQUJDXG4nKS5pc3VwcGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInYWJjJykuaXN1cHBlciwgNDIpCisKKyAgICBkZWYgdGVzdF9pc3RpdGxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJycpLmlzdGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidhJykuaXN0aXRsZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInQScpLmlzdGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidcbicpLmlzdGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ0EgVGl0bGVjYXNlZCBMaW5lJykuaXN0aXRsZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInQVxuVGl0bGVjYXNlZCBMaW5lJykuaXN0aXRsZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInQSBUaXRsZWNhc2VkLCBMaW5lJykuaXN0aXRsZSgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJ05vdCBhIGNhcGl0YWxpemVkIFN0cmluZycpLmlzdGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidOb3RcdGEgVGl0bGVjYXNlIFN0cmluZycpLmlzdGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidOb3QtLWEgVGl0bGVjYXNlIFN0cmluZycpLmlzdGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidOT1QnKS5pc3RpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInYWJjJykuaXN0aXRsZSwgNDIpCisKKyAgICBkZWYgdGVzdF9pc3NwYWNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJycpLmlzc3BhY2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidhJykuaXNzcGFjZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInICcpLmlzc3BhY2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ1x0JykuaXNzcGFjZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInXHInKS5pc3NwYWNlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYidcbicpLmlzc3BhY2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJyBcdFxyXG4nKS5pc3NwYWNlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInIFx0XHJcbmEnKS5pc3NwYWNlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInYWJjJykuaXNzcGFjZSwgNDIpCisKKyAgICBkZWYgdGVzdF9pc2FscGhhKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJycpLmlzYWxwaGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ2EnKS5pc2FscGhhKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYidBJykuaXNhbHBoYSgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJ1xuJykuaXNhbHBoYSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInYWJjJykuaXNhbHBoYSgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJ2FCYzEyMycpLmlzYWxwaGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidhYmNcbicpLmlzYWxwaGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5pc2FscGhhLCA0MikKKworICAgIGRlZiB0ZXN0X2lzYWxudW0oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInJykuaXNhbG51bSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInYScpLmlzYWxudW0oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ0EnKS5pc2FsbnVtKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInXG4nKS5pc2FsbnVtKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYicxMjNhYmM0NTYnKS5pc2FsbnVtKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYidhMWIzYycpLmlzYWxudW0oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidhQmMwMDAgJykuaXNhbG51bSgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJ2FiY1xuJykuaXNhbG51bSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2FiYycpLmlzYWxudW0sIDQyKQorCisgICAgZGVmIHRlc3RfaXNkaWdpdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYicnKS5pc2RpZ2l0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInYScpLmlzZGlnaXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJzAnKS5pc2RpZ2l0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYicwMTIzNDU2Nzg5JykuaXNkaWdpdCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJzAxMjM0NTY3ODlhJykuaXNkaWdpdCgpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInYWJjJykuaXNkaWdpdCwgNDIpCisKKyAgICBkZWYgdGVzdF9sb3dlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2hlbGxvJywgc2VsZi5tYXJzaGFsKGInSGVMTG8nKS5sb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInaGVsbG8nLCBzZWxmLm1hcnNoYWwoYidoZWxsbycpLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInaGVsbG8nKS5sb3dlciwgNDIpCisKKyAgICBkZWYgdGVzdF91cHBlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ0hFTExPJywgc2VsZi5tYXJzaGFsKGInSGVMTG8nKS51cHBlcigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInSEVMTE8nLCBzZWxmLm1hcnNoYWwoYidIRUxMTycpLnVwcGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInaGVsbG8nKS51cHBlciwgNDIpCisKKyAgICBkZWYgdGVzdF9jYXBpdGFsaXplKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInIGhlbGxvICcsIHNlbGYubWFyc2hhbChiJyBoZWxsbyAnKS5jYXBpdGFsaXplKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidIZWxsbyAnLCBzZWxmLm1hcnNoYWwoYidIZWxsbyAnKS5jYXBpdGFsaXplKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidIZWxsbyAnLCBzZWxmLm1hcnNoYWwoYidoZWxsbyAnKS5jYXBpdGFsaXplKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidBYWFhJywgc2VsZi5tYXJzaGFsKGInYWFhYScpLmNhcGl0YWxpemUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ0FhYWEnLCBzZWxmLm1hcnNoYWwoYidBYUFhJykuY2FwaXRhbGl6ZSgpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInaGVsbG8nKS5jYXBpdGFsaXplLCA0MikKKworICAgIGRlZiB0ZXN0X2xqdXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjICAgICAgICcsIHNlbGYubWFyc2hhbChiJ2FiYycpLmxqdXN0KDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2FiYyAgICcsIHNlbGYubWFyc2hhbChiJ2FiYycpLmxqdXN0KDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjJywgc2VsZi5tYXJzaGFsKGInYWJjJykubGp1c3QoMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidhYmMnLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5sanVzdCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2FiYyoqKioqKionLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5sanVzdCgxMCwgJyonKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5sanVzdCkKKworICAgIGRlZiB0ZXN0X3JqdXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInICAgICAgIGFiYycsIHNlbGYubWFyc2hhbChiJ2FiYycpLnJqdXN0KDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJyAgIGFiYycsIHNlbGYubWFyc2hhbChiJ2FiYycpLnJqdXN0KDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjJywgc2VsZi5tYXJzaGFsKGInYWJjJykucmp1c3QoMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidhYmMnLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5yanVzdCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJyoqKioqKiphYmMnLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5yanVzdCgxMCwgJyonKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5yanVzdCkKKworICAgIGRlZiB0ZXN0X2NlbnRlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJyAgIGFiYyAgICAnLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5jZW50ZXIoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInIGFiYyAgJywgc2VsZi5tYXJzaGFsKGInYWJjJykuY2VudGVyKDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjJywgc2VsZi5tYXJzaGFsKGInYWJjJykuY2VudGVyKDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjJywgc2VsZi5tYXJzaGFsKGInYWJjJykuY2VudGVyKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInKioqYWJjKioqKicsIHNlbGYubWFyc2hhbChiJ2FiYycpLmNlbnRlcigxMCwgJyonKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5jZW50ZXIpCisKKyAgICBkZWYgdGVzdF9zd2FwY2FzZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2hFbGxPIENvTVB1VEVyUycsCisgICAgICAgICAgICBzZWxmLm1hcnNoYWwoYidIZUxMbyBjT21wVXRlUnMnKS5zd2FwY2FzZSgpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInaGVsbG8nKS5zd2FwY2FzZSwgNDIpCisKKyAgICBkZWYgdGVzdF96ZmlsbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJzEyMycsIHNlbGYubWFyc2hhbChiJzEyMycpLnpmaWxsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInMTIzJywgc2VsZi5tYXJzaGFsKGInMTIzJykuemZpbGwoMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicwMTIzJywgc2VsZi5tYXJzaGFsKGInMTIzJykuemZpbGwoNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicrMTIzJywgc2VsZi5tYXJzaGFsKGInKzEyMycpLnpmaWxsKDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInKzEyMycsIHNlbGYubWFyc2hhbChiJysxMjMnKS56ZmlsbCg0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJyswMTIzJywgc2VsZi5tYXJzaGFsKGInKzEyMycpLnpmaWxsKDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInLTEyMycsIHNlbGYubWFyc2hhbChiJy0xMjMnKS56ZmlsbCgzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJy0xMjMnLCBzZWxmLm1hcnNoYWwoYictMTIzJykuemZpbGwoNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYictMDEyMycsIHNlbGYubWFyc2hhbChiJy0xMjMnKS56ZmlsbCg1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJzAwMCcsIHNlbGYubWFyc2hhbChiJycpLnpmaWxsKDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInMzQnLCBzZWxmLm1hcnNoYWwoYiczNCcpLnpmaWxsKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInMDAzNCcsIHNlbGYubWFyc2hhbChiJzM0JykuemZpbGwoNCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1hcnNoYWwoYicxMjMnKS56ZmlsbCkKKworICAgIGRlZiB0ZXN0X2V4cGFuZHRhYnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidhYmNccmFiICAgICAgZGVmXG5nICAgICAgIGhpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcnNoYWwoYidhYmNccmFiXHRkZWZcbmdcdGhpJykuZXhwYW5kdGFicygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInYWJjXHJhYlx0ZGVmXG5nXHRoaScpLmV4cGFuZHRhYnMoOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidhYmNccmFiICBkZWZcbmcgICBoaScsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInYWJjXHJhYlx0ZGVmXG5nXHRoaScpLmV4cGFuZHRhYnMoNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidhYmNcclxuYWIgIGRlZlxuZyAgIGhpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcnNoYWwoYidhYmNcclxuYWJcdGRlZlxuZ1x0aGknKS5leHBhbmR0YWJzKDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInYWJjXHJhYlx0ZGVmXG5nXHRoaScpLmV4cGFuZHRhYnMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2FiY1xyYWIgICAgICBkZWZcbmcgICAgICAgaGknLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFyc2hhbChiJ2FiY1xyYWJcdGRlZlxuZ1x0aGknKS5leHBhbmR0YWJzKDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjXHJcbmFiXHJcbmRlZlxuZ1xyXG5oaScsCisgICAgICAgICAgICBzZWxmLm1hcnNoYWwoYidhYmNcclxuYWJcclxuZGVmXG5nXHJcbmhpJykuZXhwYW5kdGFicyg0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJyAgYVxuIGInLCBzZWxmLm1hcnNoYWwoYicgXHRhXG5cdGInKS5leHBhbmR0YWJzKDEpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInaGVsbG8nKS5leHBhbmR0YWJzLCA0MiwgNDIpCisgICAgICAgICMgVGhpcyB0ZXN0IGlzIG9ubHkgdmFsaWQgd2hlbiBzaXplb2YoaW50KSA9PSBzaXplb2Yodm9pZCopID09IDQuCisgICAgICAgIGlmIHN5cy5tYXhpbnQgPCAoMSA8PCAzMikgYW5kIHN0cnVjdC5jYWxjc2l6ZSgnUCcpID09IDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInXHRhXG5cdGInKS5leHBhbmR0YWJzLCBzeXMubWF4aW50KQorCisgICAgZGVmIHRlc3RfdGl0bGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicgSGVsbG8gJywgc2VsZi5tYXJzaGFsKGInIGhlbGxvICcpLnRpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidIZWxsbyAnLCBzZWxmLm1hcnNoYWwoYidoZWxsbyAnKS50aXRsZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInSGVsbG8gJywgc2VsZi5tYXJzaGFsKGInSGVsbG8gJykudGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ0Zvcm1hdCBUaGlzIEFzIFRpdGxlIFN0cmluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInZk9yTWFUIHRoSXMgYVMgdGl0TGUgU3RyaW5nJykudGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ0Zvcm1hdCxUaGlzLUFzKlRpdGxlO1N0cmluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInZk9yTWFULHRoSXMtYVMqdGl0TGU7U3RyaW5nJykudGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ0dldGludCcsIHNlbGYubWFyc2hhbChiJ2dldEludCcpLnRpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInaGVsbG8nKS50aXRsZSwgNDIpCisKKyAgICBkZWYgdGVzdF9zcGxpdGxpbmVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtiJ2FiYycsIGInZGVmJywgYicnLCBiJ2doaSddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFyc2hhbChiJ2FiY1xuZGVmXG5ccmdoaScpLnNwbGl0bGluZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbYidhYmMnLCBiJ2RlZicsIGInJywgYidnaGknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcnNoYWwoYidhYmNcbmRlZlxuXHJcbmdoaScpLnNwbGl0bGluZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbYidhYmMnLCBiJ2RlZicsIGInZ2hpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInYWJjXG5kZWZcclxuZ2hpJykuc3BsaXRsaW5lcygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtiJ2FiYycsIGInZGVmJywgYidnaGknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcnNoYWwoYidhYmNcbmRlZlxyXG5naGlcbicpLnNwbGl0bGluZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbYidhYmMnLCBiJ2RlZicsIGInZ2hpJywgYicnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcnNoYWwoYidhYmNcbmRlZlxyXG5naGlcblxyJykuc3BsaXRsaW5lcygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtiJycsIGInYWJjJywgYidkZWYnLCBiJ2doaScsIGInJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInXG5hYmNcbmRlZlxyXG5naGlcblxyJykuc3BsaXRsaW5lcygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtiJ1xuJywgYidhYmNcbicsIGInZGVmXHJcbicsIGInZ2hpXG4nLCBiJ1xyJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInXG5hYmNcbmRlZlxyXG5naGlcblxyJykuc3BsaXRsaW5lcygxKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2FiYycpLnNwbGl0bGluZXMsIDQyLCA0MikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9idWZmZXJfdGVzdHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L2J1ZmZlcl90ZXN0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0MjYxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9idWZmZXJfdGVzdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9idWZmZXJfdGVzdHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L2J1ZmZlcl90ZXN0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0MjYxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9idWZmZXJfdGVzdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jZmdwYXJzZXIuMSBiL2xpYi9weXRob24yLjcvdGVzdC9jZmdwYXJzZXIuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzg3ZjUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2NmZ3BhcnNlci4xCkBAIC0wLDAgKzEsMiBAQAorW0ZvbyBCYXJdCitmb289bmV3YmFyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2hlY2tfc291bmRjYXJkLnZicyBiL2xpYi9weXRob24yLjcvdGVzdC9jaGVja19zb3VuZGNhcmQudmJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjE4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2hlY2tfc291bmRjYXJkLnZicwpAQCAtMCwwICsxLDEzIEBACityZW0gQ2hlY2sgZm9yIGEgd29ya2luZyBzb3VuZC1jYXJkIC0gZXhpdCB3aXRoIDAgaWYgT0ssIDEgb3RoZXJ3aXNlLgorc2V0IHdtaSA9IEdldE9iamVjdCgid2lubWdtdHM6IikKK3NldCBzY3MgPSB3bWkuSW5zdGFuY2VzT2YoIndpbjMyX3NvdW5kZGV2aWNlIikKK2ZvciBlYWNoIHNjIGluIHNjcworICAgc2V0IHN0YXR1cyA9IHNjLlByb3BlcnRpZXNfKCJTdGF0dXMiKQorICAgd3NjcmlwdC5FY2hvKHNjLlByb3BlcnRpZXNfKCJOYW1lIikgKyAiLyIgKyBzdGF0dXMpCisgICBpZiBzdGF0dXMgPSAiT0siIHRoZW4KKyAgICAgICB3c2NyaXB0LlF1aXQgMCByZW0gbm9ybWFsIGV4aXQKKyAgIGVuZCBpZgorbmV4dAorcmVtIE5vIHNvdW5kIGNhcmQgZm91bmQgLSBleGl0IHdpdGggc3RhdHVzIGNvZGUgb2YgMQord3NjcmlwdC5RdWl0IDEKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9iaWc1LXV0ZjgudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9iaWc1LXV0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYTUzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2JpZzUtdXRmOC50eHQKQEAgLTAsMCArMSw5IEBACivlpoLkvZXlnKggUHl0aG9uIOS4reS9v+eUqOaXouacieeahCBDIGxpYnJhcnk/CivjgIDlnKjos4foqIrnp5HmioDlv6vpgJ/nmbzlsZXnmoTku4rlpKksIOmWi+eZvOWPiua4rOippui7n+mrlOeahOmAn+W6puaYr+S4jeWuueW/veimlueahAor6Kqy6aGMLiDngrrliqDlv6vplovnmbzlj4rmuKzoqabnmoTpgJ/luqYsIOaIkeWAkeS+v+W4uOW4jOacm+iDveWIqeeUqOS4gOS6m+W3sumWi+eZvOWlveeahAorbGlicmFyeSwg5Lim5pyJ5LiA5YCLIGZhc3QgcHJvdG90eXBpbmcg55qEIHByb2dyYW1taW5nIGxhbmd1YWdlIOWPrwor5L6b5L2/55SoLiDnm67liY3mnInoqLHoqLHlpJrlpJrnmoQgbGlicmFyeSDmmK/ku6UgQyDlr6vmiJAsIOiAjCBQeXRob24g5piv5LiA5YCLCitmYXN0IHByb3RvdHlwaW5nIOeahCBwcm9ncmFtbWluZyBsYW5ndWFnZS4g5pWF5oiR5YCR5biM5pyb6IO95bCH5pei5pyJ55qECitDIGxpYnJhcnkg5ou/5YiwIFB5dGhvbiDnmoTnkrDlooPkuK3muKzoqablj4rmlbTlkIguIOWFtuS4reacgOS4u+imgeS5n+aYr+aIkeWAkeaJgAor6KaB6KiO6KuW55qE5ZWP6aGM5bCx5pivOgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2JpZzUudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9iaWc1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQyNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9iaWc1LnR4dApAQCAtMCwwICsxLDkgQEAKK6ZwpvOmYiBQeXRob24gpKSoz6XOrEqms6q6IEMgbGlicmFyeT8KK6FApmK46rBUrOyn3qfWs3S1b65pqrqktaTRLCC2fbVvpM60+rjVs27F6aq6s3Sr16xPpKOuZam/tfiqugorvdLDRC4grLClW6fWtn21b6TOtPq41aq6s3Sr1ywgp9qtzKtLsWCnxrHmr+CnUaXOpECox6R3tn21b6ZuqroKK2xpYnJhcnksIKjDprOkQK3TIGZhc3QgcHJvdG90eXBpbmcgqrogcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgpWkKK6jRqM+lzi4gpdirZaazs1yzXKZopmiquiBsaWJyYXJ5IKxPpUggQyC8Z6aoLCCm0yBQeXRob24grE+kQK3TCitmYXN0IHByb3RvdHlwaW5nIKq6IHByb2dyYW1taW5nIGxhbmd1YWdlLiCsR6farcynxrHmr+CxTqxKprOqugorQyBsaWJyYXJ5IK6zqOwgUHl0aG9uIKq6wPS50qSktPq41aTOvuOmWC4gqOSkpLPMpUStbqRdrE+n2q3MqdIKK61usFG916q6sN3DRLROrE86CisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvYmlnNWhrc2NzLXV0ZjgudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9iaWc1aGtzY3MtdXRmOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc0NGNlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvYmlnNWhrc2NzLXV0ZjgudHh0CkBAIC0wLDAgKzEsMiBAQAor8KCEjMSa6bWu572T5rSGCivDisOKzITDqiDDqsOqzIQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvYmlnNWhrc2NzLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvYmlnNWhrc2NzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWM0MmIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9iaWc1aGtzY3MudHh0CkBAIC0wLDAgKzEsMiBAQAoriEWIXIpzi9qN2AoriGaIYoinIIiniKMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvY3A5NDktdXRmOC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2NwOTQ5LXV0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NTVlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2NwOTQ5LXV0ZjgudHh0CkBAIC0wLDAgKzEsOSBAQAor65ig67Cp6rCB7ZWYIO2OsuyLnOy9nOudvAorCivjia/jia/rgqkhISDlm6DkuZ3mnIjtjKjrr6TrppTqtogg4pOh4pOW7ZuAwr/Cv8K/IOq4jeuSmSDik5Trjqgg44mvLiAuCivkup7smIHik5TriqXtmrkgLiAuIC4gLiDshJzsmrjrpIQg646Q7ZWZ5LmZIOWutu2bgCAhICEgIeOFoC7jhaAKK+2dkO2dkO2dkCDjhLHjhLHjhLHimIbjhaBf44WgIOyWtOumqCDtg7jsvbDquJAg646M7J2RIOy5keS5neuTpOS5mSDjia/rk5zquJAKK+yEpOumjCDlrrbtm4AgLiAuIC4gLiDqtbTslaDsiYwg4pOU6raIIOKToeummOOJseq4kCDlm6Dku4Hlt53vpoHkuK3quYzsprwKK+yZgOySgO2bgCAhICEg5Lqe7JiB4pOUIOWutuuKpeq2iCDimIbkuIrqtIAg7JeG64ql6raI64qlIOS6nuuKpeuSiO2bgCDquIDslaDrk7QKK+KToeugpOuTgOS5nSDsi4DtkpTsiLTtm4Ag7Ja066aoIOWboOS7geW3ne+mgeS4reyLgeKRqOuTpOyVnCEhIOOJr+OJr+uCqeKZoSDijJLijJIqCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvY3A5NDkudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9jcDk0OS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1NDlhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvY3A5NDkudHh0CkBAIC0wLDAgKzEsOSBAQAorjGO55rCix88gvIS9w8TdtvMKKworqMCowLOzISEg7NfO+urFxtCS5pBwscUgqN6o08RSoq+ir6KvILHgipYgqNG1syCowC4gLgor5Ky/tajRtMnIwiAuIC4gLiAuILytv++37yC1r8fQ6+AgyqvEUiAhICEgIaTQLqTQCivI5cjlyOUgpKGkoaShodmk0F+k0CC+7pCKIMXLxOKDTyC1rsDAIK9ozvq16evgIKjAteWDTworvLOQaiDKq8RSIC4gLiAuIC4gsby+1ppmIKjRscUgqN6QdKjCg08g7Nfs0vS55fzx6bHuo44KK7/NvqzEUiAhICEg5Ky/tajRIMqrtMmxxSCh2d++sPwgvvi0ybHFtMkg5Ky0ybXYxFIgsdu+1orbCiuo3rfBteDO+iCaw8e0vaTEUiC+7pCKIOzX7NL0ueX88emaxKjvtemd2iEhIKjAqMCzs6K9IKHSodIqCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZXVjX2ppc3gwMjEzLXV0ZjgudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9ldWNfamlzeDAyMTMtdXRmOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1NmEyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZXVjX2ppc3gwMjEzLXV0ZjgudHh0CkBAIC0wLDAgKzEsOCBAQAorUHl0aG9uIOOBrumWi+eZuuOBr+OAgTE5OTAg5bm044GU44KN44GL44KJ6ZaL5aeL44GV44KM44Gm44GE44G+44GZ44CCCivplovnmbrogIXjga4gR3VpZG8gdmFuIFJvc3N1bSDjga/mlZnogrLnlKjjga7jg5fjg63jgrDjg6njg5/jg7PjgrDoqIDoqp7jgIxBQkPjgI3jga7plovnmbrjgavlj4LliqDjgZfjgabjgYTjgb7jgZfjgZ/jgYzjgIFBQkMg44Gv5a6f55So5LiK44Gu55uu55qE44Gr44Gv44GC44G+44KK6YGp44GX44Gm44GE44G+44Gb44KT44Gn44GX44Gf44CCCivjgZPjga7jgZ/jgoHjgIFHdWlkbyDjga/jgojjgorlrp/nlKjnmoTjgarjg5fjg63jgrDjg6njg5/jg7PjgrDoqIDoqp7jga7plovnmbrjgpLplovlp4vjgZfjgIHoi7Hlm70gQkJTIOaUvumAgeOBruOCs+ODoeODh+OCo+eVque1hOOAjOODouODs+ODhuOCoyDjg5HjgqTjgr3jg7PjgI3jga7jg5XjgqHjg7PjgafjgYLjgosgR3VpZG8g44Gv44GT44Gu6KiA6Kqe44KS44CMUHl0aG9u44CN44Go5ZCN44Gl44GR44G+44GX44Gf44CCCivjgZPjga7jgojjgYbjgarog4zmma/jgYvjgonnlJ/jgb7jgozjgZ8gUHl0aG9uIOOBruiogOiqnuioreioiOOBr+OAgeOAjOOCt+ODs+ODl+ODq+OAjeOBp+OAjOe/kuW+l+OBjOWuueaYk+OAjeOBqOOBhOOBhuebruaomeOBq+mHjeeCueOBjOe9ruOBi+OCjOOBpuOBhOOBvuOBmeOAggor5aSa44GP44Gu44K544Kv44Oq44OX44OI57O76KiA6Kqe44Gn44Gv44Om44O844K244Gu55uu5YWI44Gu5Yip5L6/5oCn44KS5YSq5YWI44GX44Gm6Imy44CF44Gq5qmf6IO944KS6KiA6Kqe6KaB57Sg44Go44GX44Gm5Y+W44KK5YWl44KM44KL5aC05ZCI44GM5aSa44GE44Gu44Gn44GZ44GM44CBUHl0aG9uIOOBp+OBr+OBneOBhuOBhOOBo+OBn+Wwj+e0sOW3peOBjOi/veWKoOOBleOCjOOCi+OBk+OBqOOBr+OBguOBvuOCiuOBguOCiuOBvuOBm+OCk+OAggor6KiA6Kqe6Ieq5L2T44Gu5qmf6IO944Gv5pyA5bCP6ZmQ44Gr5oq844GV44GI44CB5b+F6KaB44Gq5qmf6IO944Gv5ouh5by144Oi44K444Ol44O844Or44Go44GX44Gm6L+95Yqg44GZ44KL44CB44Go44GE44GG44Gu44GMIFB5dGhvbiDjga7jg53jg6rjgrfjg7zjgafjgZnjgIIKKwor44OO44GL44KaIOODiOOCmiDjg4jjgq3vqLbvqLkg8KGatPCqjowg6bqA6b2B8KmbsApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9ldWNfamlzeDAyMTMudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9ldWNfamlzeDAyMTMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTkyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2V1Y19qaXN4MDIxMy50eHQKQEAgLTAsMCArMSw4IEBACitQeXRob24gpM6zq8ivpM+hojE5OTAgx6+ktKTtpKuk6bOru8+ktaTspMakpKTepLmhowors6vIr7zUpM4gR3VpZG8gdmFuIFJvc3N1bSCkz7a1sOnN0aTOpdel7aWwpeml36XzpbC4wLjsodZBQkOh16TOs6vIr6TLu7Kyw6S3pMakpKTepLekv6SsoaJBQkMgpM+8ws3RvuWkzszcxaqky6TPpKKk3qTqxaykt6TGpKSk3qS7pPOkx6S3pL+howorpLOkzqS/pOGhokd1aWRvIKTPpOik6rzCzdHFqqTKpdel7aWwpeml36XzpbC4wLjspM6zq8ivpPKzq7vPpLehorHRufEgQkJTIMr8wfekzqWzpeGlx6WjyNbByKHWpeKl86XGpaMgpdGlpKW9pfOh16TOpdWloaXzpMekoqTrIEd1aWRvIKTPpLOkzrjAuOyk8qHWUHl0aG9uodekyMy+pMWksaTepLekv6GjCiuks6TOpOikpqTKx9i3yqSrpOnAuKTepOykvyBQeXRob24gpM64wLjswN+316TPoaKh1qW3pfOl16Xrodekx6HWvazGwKSszcaw16HXpMikpKSmzNzJuKTLvcXFwKSsw9akq6TspMakpKTepLmhoworwr+kr6TOpbmlr6XqpdelyLfPuMC47KTHpM+l5qG8pbakzszcwOikzs34ytjAraTyzaXA6KS3pMa/p6G5pMq1oce9pPK4wLjszdfBx6TIpLekxrzopOrG/qTspOu+7LnnpKzCv6SkpM6kx6S5pKyholB5dGhvbiCkx6TPpL2kpqSkpMOkv76uutm5qaSsxMmyw6S1pOyk66SzpMikz6SipN6k6qSipOqk3qS7pPOhoworuMC47Lyrws6kzrWhx72kz7rHvq64wqTLsqGktaSooaLJrM3XpMq1oce9pM+zyMSlpeKluKXlobyl66TIpLekxsTJssOkuaTroaKkyKSkpKakzqSsIFB5dGhvbiCkzqXdpeqlt6G8pMekuaGjCisKK6XOpPcgpf4gpcilra+sr9ogz+OP/tggj/7Uj/7oj/zWCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2V1Y19qcC11dGY4LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZXVjX2pwLXV0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjMyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2V1Y19qcC11dGY4LnR4dApAQCAtMCwwICsxLDcgQEAKK1B5dGhvbiDjga7plovnmbrjga/jgIExOTkwIOW5tOOBlOOCjeOBi+OCiemWi+Wni+OBleOCjOOBpuOBhOOBvuOBmeOAggor6ZaL55m66ICF44GuIEd1aWRvIHZhbiBSb3NzdW0g44Gv5pWZ6IKy55So44Gu44OX44Ot44Kw44Op44Of44Oz44Kw6KiA6Kqe44CMQUJD44CN44Gu6ZaL55m644Gr5Y+C5Yqg44GX44Gm44GE44G+44GX44Gf44GM44CBQUJDIOOBr+Wun+eUqOS4iuOBruebrueahOOBq+OBr+OBguOBvuOCiumBqeOBl+OBpuOBhOOBvuOBm+OCk+OBp+OBl+OBn+OAggor44GT44Gu44Gf44KB44CBR3VpZG8g44Gv44KI44KK5a6f55So55qE44Gq44OX44Ot44Kw44Op44Of44Oz44Kw6KiA6Kqe44Gu6ZaL55m644KS6ZaL5aeL44GX44CB6Iux5Zu9IEJCUyDmlL7pgIHjga7jgrPjg6Hjg4fjgqPnlarntYTjgIzjg6Ljg7Pjg4bjgqMg44OR44Kk44K944Oz44CN44Gu44OV44Kh44Oz44Gn44GC44KLIEd1aWRvIOOBr+OBk+OBruiogOiqnuOCkuOAjFB5dGhvbuOAjeOBqOWQjeOBpeOBkeOBvuOBl+OBn+OAggor44GT44Gu44KI44GG44Gq6IOM5pmv44GL44KJ55Sf44G+44KM44GfIFB5dGhvbiDjga7oqIDoqp7oqK3oqIjjga/jgIHjgIzjgrfjg7Pjg5fjg6vjgI3jgafjgIznv5LlvpfjgYzlrrnmmJPjgI3jgajjgYTjgYbnm67mqJnjgavph43ngrnjgYznva7jgYvjgozjgabjgYTjgb7jgZnjgIIKK+WkmuOBj+OBruOCueOCr+ODquODl+ODiOezu+iogOiqnuOBp+OBr+ODpuODvOOCtuOBruebruWFiOOBruWIqeS+v+aAp+OCkuWEquWFiOOBl+OBpuiJsuOAheOBquapn+iDveOCkuiogOiqnuimgee0oOOBqOOBl+OBpuWPluOCiuWFpeOCjOOCi+WgtOWQiOOBjOWkmuOBhOOBruOBp+OBmeOBjOOAgVB5dGhvbiDjgafjga/jgZ3jgYbjgYTjgaPjgZ/lsI/ntLDlt6XjgYzov73liqDjgZXjgozjgovjgZPjgajjga/jgYLjgb7jgorjgYLjgorjgb7jgZvjgpPjgIIKK+iogOiqnuiHquS9k+OBruapn+iDveOBr+acgOWwj+mZkOOBq+aKvOOBleOBiOOAgeW/heimgeOBquapn+iDveOBr+aLoeW8teODouOCuOODpeODvOODq+OBqOOBl+OBpui/veWKoOOBmeOCi+OAgeOBqOOBhOOBhuOBruOBjCBQeXRob24g44Gu44Od44Oq44K344O844Gn44GZ44CCCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZXVjX2pwLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZXVjX2pwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGE2YjVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9ldWNfanAudHh0CkBAIC0wLDAgKzEsNyBAQAorUHl0aG9uIKTOs6vIr6TPoaIxOTkwIMevpLSk7aSrpOmzq7vPpLWk7KTGpKSk3qS5oaMKK7OryK+81KTOIEd1aWRvIHZhbiBSb3NzdW0gpM+2tbDpzdGkzqXXpe2lsKXppd+l86WwuMC47KHWQUJDodekzrOryK+ky7uyssOkt6TGpKSk3qS3pL+krKGiQUJDIKTPvMLN0b7lpM7M3MWqpMukz6SipN6k6sWspLekxqSkpN6ku6TzpMekt6S/oaMKK6SzpM6kv6ThoaJHdWlkbyCkz6TopOq8ws3RxaqkyqXXpe2lsKXppd+l86WwuMC47KTOs6vIr6Tys6u7z6S3oaKx0bnxIEJCUyDK/MH3pM6ls6Xhpcelo8jWwcih1qXipfOlxqWjIKXRpaSlvaXzodekzqXVpaGl86THpKKk6yBHdWlkbyCkz6SzpM64wLjspPKh1lB5dGhvbqHXpMjMvqTFpLGk3qS3pL+howorpLOkzqTopKakysfYt8qkq6TpwLik3qTspL8gUHl0aG9uIKTOuMC47MDft9ekz6Giodalt6Xzpdel66HXpMeh1r2sxsCkrM3GsNeh16TIpKSkpszcybiky73FxcCkrMPWpKuk7KTGpKSk3qS5oaMKK8K/pK+kzqW5pa+l6qXXpci3z7jAuOykx6TPpeahvKW2pM7M3MDopM7N+MrYwK2k8s2lwOikt6TGv6ehuaTKtaHHvaTyuMC47M3XwcekyKS3pMa86KTqxv6k7KTrvuy556Sswr+kpKTOpMekuaSsoaJQeXRob24gpMekz6S9pKakpKTDpL++rrrZuamkrMTJssOktaTspOuks6TIpM+koqTepOqkoqTqpN6ku6TzoaMKK7jAuOy8q8LOpM61oce9pM+6x76uuMKky7KhpLWkqKGiyazN16TKtaHHvaTPs8jEpaXipbil5aG8peukyKS3pMbEybLDpLmk66GipMikpKSmpM6krCBQeXRob24gpM6l3aXqpbehvKTHpLmhoworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2V1Y19rci11dGY4LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZXVjX2tyLXV0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YzM3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2V1Y19rci11dGY4LnR4dApAQCAtMCwwICsxLDcgQEAKK+KXjiDtjIzsnbTsjawoUHl0aG9uKeydgCDrsLDsmrDquLAg7Im96rOgLCDqsJXroKXtlZwg7ZSE66Gc6re4656Y67CNIOyWuOyWtOyeheuLiOuLpC4g7YyM7J207I2s7J2ACivtmqjsnKjsoIHsnbgg6rOg7IiY7KSAIOuNsOydtO2EsCDqtazsobDsmYAg6rCE64uo7ZWY7KeA66eMIO2aqOycqOyggeyduCDqsJ3ssrTsp4DtlqXtlITroZzqt7jrnpjrsI3snYQKK+yngOybkO2VqeuLiOuLpC4g7YyM7J207I2s7J2YIOyasOyVhCjlhKrpm4Up7ZWcIOusuOuyleqzvCDrj5nsoIEg7YOA7J207ZWRLCDqt7jrpqzqs6Ag7J247YSw7ZSE66as7YyFCivtmZjqsr3snYAg7YyM7J207I2s7J2EIOyKpO2BrOumve2MheqzvCDsl6zrn6wg67aE7JW87JeQ7ISc7JmAIOuMgOu2gOu2hOydmCDtlIzrnqvtj7zsl5DshJzsnZgg67mg66W4CivslaDtlIzrpqzsvIDsnbTshZgg6rCc67Cc7J2EIO2VoCDsiJgg7J6I64qUIOydtOyDgeyggeyduCDslrjslrTroZwg66eM65Ok7Ja07KSN64uI64ukLgorCivimIbssqvqsIDrgZ06IOuCoOyVhOudvCDsk5Tsk5Tsk6l+IOuLge2BvCEg65y96riI7JeG7J20IOyghO2ZpeuLiOuLpC4g67eBLiDqt7jrn7DqsbAg7J2O64ukLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9ldWNfa3IudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9ldWNfa3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OGRkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2V1Y19rci50eHQKQEAgLTAsMCArMSw3IEBACiuh3SDGxMDMveMoUHl0aG9uKcC6ILnov+yx4iC9sbDtLCCwrbfCx9Egx8G3zrHXt6G51iC+8L7uwNS0z7TZLiDGxMDMvePAugoryL/AssD7wM4gsO289sHYILWlwMzFzSCxuMG2v80gsKO03MfPwfa4uCDIv8CywPvAziCwtMO8wfbH4sfBt86x17ehudbAuworwfa/+MfVtM+02S4gxsTAzL3jwMcgv+y+xijp0OS6KcfRILmuuf2w+iC1v8D7IMW4wMzHziwgsde4rrDtIMDOxc3HwbiuxsMKK8ivsObAuiDGxMDMvePAuyC9usWpuLPGw7D6IL+pt68gutC+37+hvK2/zSC067rOutDAxyDHw7enxvu/obytwMcguvy4pQorvtbHw7iuxMnAzLzHILCzud/AuyDH0iC89iDA1rTCIMDMu/PA+8DOIL7wvu63ziC4uLXpvu7B3bTPtNkuCisKK6HZw7mwobOhOiCzr77GtvMgpNSktqTQpNSk1KS2pNCk1L6xfiCk1KSkpNKkt8WtISCk1KSopNGkt7HdvvjAzCDA/KTUpL6kyKSytM+02S4gpNSksqTOpKouILHXt7GwxSCk1KS3pNGktLTZLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYjE4MDMwLXV0ZjgudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYjE4MDMwLXV0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNjBkMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2diMTgwMzAtdXRmOC50eHQKQEAgLTAsMCArMSwxNSBAQAorUHl0aG9u77yI5rS+5qOu77yJ6K+t6KiA5piv5LiA56eN5Yqf6IO95by65aSn6ICM5a6M5ZaE55qE6YCa55So5Z6L6K6h566X5py656iL5bqP6K6+6K6h6K+t6KiA77yMCivlt7Lnu4/lhbfmnInljYHlpJrlubTnmoTlj5HlsZXljoblj7LvvIzmiJDnhp/kuJTnqLPlrprjgILov5nnp43or63oqIDlhbfmnInpnZ7luLjnroDmjbfogIzmuIXmmbAKK+eahOivreazleeJueeCue+8jOmAguWQiOWujOaIkOWQhOenjemrmOWxguS7u+WKoe+8jOWHoOS5juWPr+S7peWcqOaJgOacieeahOaTjeS9nOezu+e7n+S4rQor6L+Q6KGM44CC6L+Z56eN6K+t6KiA566A5Y2V6ICM5by65aSn77yM6YCC5ZCI5ZCE56eN5Lq65aOr5a2m5Lmg5L2/55So44CC55uu5YmN77yM5Z+65LqO6L+ZCivnp43or63oqIDnmoTnm7jlhbPmioDmnK/mraPlnKjpo57pgJ/nmoTlj5HlsZXvvIznlKjmiLfmlbDph4/mgKXliafmianlpKfvvIznm7jlhbPnmoTotYTmupDpnZ7luLjlpJrjgIIKK+WmguS9leWcqCBQeXRob24g5Lit5L2/55So5pei5pyJ55qEIEMgbGlicmFyeT8KK+OAgOWcqOizh+ioiuenkeaKgOW/q+mAn+eZvOWxleeahOS7iuWkqSwg6ZaL55m85Y+K5ris6Kmm6Luf6auU55qE6YCf5bqm5piv5LiN5a655b+96KaW55qECivoqrLpoYwuIOeCuuWKoOW/q+mWi+eZvOWPiua4rOippueahOmAn+W6piwg5oiR5YCR5L6/5bi45biM5pyb6IO95Yip55So5LiA5Lqb5bey6ZaL55m85aW955qECitsaWJyYXJ5LCDkuKbmnInkuIDlgIsgZmFzdCBwcm90b3R5cGluZyDnmoQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ug5Y+vCivkvpvkvb/nlKguIOebruWJjeacieioseioseWkmuWkmueahCBsaWJyYXJ5IOaYr+S7pSBDIOWvq+aIkCwg6ICMIFB5dGhvbiDmmK/kuIDlgIsKK2Zhc3QgcHJvdG90eXBpbmcg55qEIHByb2dyYW1taW5nIGxhbmd1YWdlLiDmlYXmiJHlgJHluIzmnJvog73lsIfml6LmnInnmoQKK0MgbGlicmFyeSDmi7/liLAgUHl0aG9uIOeahOeSsOWig+S4rea4rOippuWPiuaVtOWQiC4g5YW25Lit5pyA5Li76KaB5Lmf5piv5oiR5YCR5omACivopoHoqI7oq5bnmoTllY/poYzlsLHmmK86CivtjIzsnbTsjazsnYAg6rCV66Cl7ZWcIOq4sOuKpeydhCDsp4Dri4wg67KU7JqpIOy7tO2TqO2EsCDtlITroZzqt7jrnpjrsI0g7Ja47Ja064ukLgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2diMTgwMzAudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYjE4MDMwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDFmNmRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYjE4MDMwLnR4dApAQCAtMCwwICsxLDE1IEBACitQeXRob26jqMXJya2jqdPv0dTKx9K71ta5psTcx7+087b4zerJxrXEzajTw9DNvMbL47v6s8zQ8snovMbT79HUo6wKK9LRvq2+39PQyq624MTqtcS3otW5wPrKt6Oss8nK7MfSzsi2qKGj1eLW1tPv0dS+39PQt8ezo7zyvd22+MflzvoKK7XE0++3qMzYteOjrMrKus/N6rPJuPfW1rjfsuPIzs7xo6y8uLr1v8nS1NTay/nT0LXEstnX98+1zbPW0Aor1MvQ0KGj1eLW1tPv0dS88rWltvjHv7Tzo6zKyrrPuPfW1sjLyr/Rp8+wyrnTw6GjxL/HsKOsu/nT2tXiCivW1tPv0dS1xM/gudi8vMr11f3U2rfJy9m1xLei1bmjrNPDu6fK/cG/vLG+58CptPOjrM/gudi1xNfK1LS3x7OjtuChoworyOe6ztTaIFB5dGhvbiDW0Mq508O8yNPQtcQgQyBsaWJyYXJ5PworoaHU2tlZ042/xry8v+zL2bBs1bm1xL3xzOwsIOlfsGy8sJx51Ifcm/N3tcTL2bbIyseyu8jduvbSlbXECivVbu59LiCe6bzTv+zpX7BsvLCcedSHtcTL2bbILCDO0oKDseOzo8+jzfvE3MD708PSu9Cp0tHpX7BsusO1xAorbGlicmFyeSwggUvT0NK7goAgZmFzdCBwcm90b3R5cGluZyC1xCBwcm9ncmFtbWluZyBsYW5ndWFnZSC/yQoruanKudPDLiDEv8ew09DUU9RTtuC24LXEIGxpYnJhcnkgysfS1CBDIIyRs8ksILb4IFB5dGhvbiDKx9K7goAKK2Zhc3QgcHJvdG90eXBpbmcgtcQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuILnKztKCg8+jzfvE3IyivMjT0LXECitDIGxpYnJhcnkgxMO1vSBQeXRob24gtcStaL6z1tCcedSHvLDV+7rPLiDG5NbQ1+7W99Kq0rLKx87SgoPL+Qor0qrTkdWTtcSGlu59vs3KxzoKK4M1xzGDM5ozgzKxMYMzlTEggjfRNoMwjDSDNoQzIII4iTWCOPs2gzOVNSCDM9UxgjmBNSCDMP05gzOGMCCDNNwzgzX2N4M1lzUggzX5NYMwkTmCOIM5gjn8M4Mw8DQggzLrOYMy6zWCOYM5LgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2diMjMxMi11dGY4LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2IyMzEyLXV0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYjdkOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2diMjMxMi11dGY4LnR4dApAQCAtMCwwICsxLDYgQEAKK1B5dGhvbu+8iOa0vuajru+8ieivreiogOaYr+S4gOenjeWKn+iDveW8uuWkp+iAjOWujOWWhOeahOmAmueUqOWei+iuoeeul+acuueoi+W6j+iuvuiuoeivreiogO+8jAor5bey57uP5YW35pyJ5Y2B5aSa5bm055qE5Y+R5bGV5Y6G5Y+y77yM5oiQ54af5LiU56iz5a6a44CC6L+Z56eN6K+t6KiA5YW35pyJ6Z2e5bi4566A5o236ICM5riF5pmwCivnmoTor63ms5XnibnngrnvvIzpgILlkIjlrozmiJDlkITnp43pq5jlsYLku7vliqHvvIzlh6DkuY7lj6/ku6XlnKjmiYDmnInnmoTmk43kvZzns7vnu5/kuK0KK+i/kOihjOOAgui/meenjeivreiogOeugOWNleiAjOW8uuWkp++8jOmAguWQiOWQhOenjeS6uuWjq+WtpuS5oOS9v+eUqOOAguebruWJje+8jOWfuuS6jui/mQor56eN6K+t6KiA55qE55u45YWz5oqA5pyv5q2j5Zyo6aOe6YCf55qE5Y+R5bGV77yM55So5oi35pWw6YeP5oCl5Ymn5omp5aSn77yM55u45YWz55qE6LWE5rqQ6Z2e5bi45aSa44CCCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2IyMzEyLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2IyMzEyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTM2YWMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYjIzMTIudHh0CkBAIC0wLDAgKzEsNiBAQAorUHl0aG9uo6jFycmto6nT79HUysfSu9bWuabE3Me/tPO2+M3qyca1xM2o08PQzbzGy+O7+rPM0PLJ6LzG0+/R1KOsCivS0b6tvt/T0MqutuDE6rXEt6LVucD6yrejrLPJyuzH0s7Itqiho9Xi1tbT79HUvt/T0LfHs6O88r3dtvjH5c76Ciu1xNPvt6jM2LXjo6zKyrrPzeqzybj31ta437LjyM7O8aOsvLi69b/J0tTU2sv509C1xLLZ1/fPtc2z1tAKK9TL0NCho9Xi1tbT79HUvPK1pbb4x7+086Osysq6z7j31tbIy8q/0afPsMq508Oho8S/x7CjrLv509rV4gor1tbT79HUtcTP4LnYvLzK9dX91Nq3ycvZtcS3otW5o6zTw7unyv3Bv7yxvufAqbTzo6zP4LnYtcTXytS0t8ezo7bgoaMKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYmstdXRmOC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2diay11dGY4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWJiZDMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYmstdXRmOC50eHQKQEAgLTAsMCArMSwxNCBAQAorUHl0aG9u77yI5rS+5qOu77yJ6K+t6KiA5piv5LiA56eN5Yqf6IO95by65aSn6ICM5a6M5ZaE55qE6YCa55So5Z6L6K6h566X5py656iL5bqP6K6+6K6h6K+t6KiA77yMCivlt7Lnu4/lhbfmnInljYHlpJrlubTnmoTlj5HlsZXljoblj7LvvIzmiJDnhp/kuJTnqLPlrprjgILov5nnp43or63oqIDlhbfmnInpnZ7luLjnroDmjbfogIzmuIXmmbAKK+eahOivreazleeJueeCue+8jOmAguWQiOWujOaIkOWQhOenjemrmOWxguS7u+WKoe+8jOWHoOS5juWPr+S7peWcqOaJgOacieeahOaTjeS9nOezu+e7n+S4rQor6L+Q6KGM44CC6L+Z56eN6K+t6KiA566A5Y2V6ICM5by65aSn77yM6YCC5ZCI5ZCE56eN5Lq65aOr5a2m5Lmg5L2/55So44CC55uu5YmN77yM5Z+65LqO6L+ZCivnp43or63oqIDnmoTnm7jlhbPmioDmnK/mraPlnKjpo57pgJ/nmoTlj5HlsZXvvIznlKjmiLfmlbDph4/mgKXliafmianlpKfvvIznm7jlhbPnmoTotYTmupDpnZ7luLjlpJrjgIIKK+WmguS9leWcqCBQeXRob24g5Lit5L2/55So5pei5pyJ55qEIEMgbGlicmFyeT8KK+OAgOWcqOizh+ioiuenkeaKgOW/q+mAn+eZvOWxleeahOS7iuWkqSwg6ZaL55m85Y+K5ris6Kmm6Luf6auU55qE6YCf5bqm5piv5LiN5a655b+96KaW55qECivoqrLpoYwuIOeCuuWKoOW/q+mWi+eZvOWPiua4rOippueahOmAn+W6piwg5oiR5YCR5L6/5bi45biM5pyb6IO95Yip55So5LiA5Lqb5bey6ZaL55m85aW955qECitsaWJyYXJ5LCDkuKbmnInkuIDlgIsgZmFzdCBwcm90b3R5cGluZyDnmoQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ug5Y+vCivkvpvkvb/nlKguIOebruWJjeacieioseioseWkmuWkmueahCBsaWJyYXJ5IOaYr+S7pSBDIOWvq+aIkCwg6ICMIFB5dGhvbiDmmK/kuIDlgIsKK2Zhc3QgcHJvdG90eXBpbmcg55qEIHByb2dyYW1taW5nIGxhbmd1YWdlLiDmlYXmiJHlgJHluIzmnJvog73lsIfml6LmnInnmoQKK0MgbGlicmFyeSDmi7/liLAgUHl0aG9uIOeahOeSsOWig+S4rea4rOippuWPiuaVtOWQiC4g5YW25Lit5pyA5Li76KaB5Lmf5piv5oiR5YCR5omACivopoHoqI7oq5bnmoTllY/poYzlsLHmmK86CisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2JrLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2JrLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzg4ZjhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYmsudHh0CkBAIC0wLDAgKzEsMTQgQEAKK1B5dGhvbqOoxcnJraOp0+/R1MrH0rvW1rmmxNzHv7TztvjN6snGtcTNqNPD0M28xsvju/qzzNDyyei8xtPv0dSjrAor0tG+rb7f09DKrrbgxOq1xLei1bnA+sq3o6yzycrsx9LOyLaooaPV4tbW0+/R1L7f09C3x7OjvPK93bb4x+XO+gortcTT77eozNi146Osysq6z83qs8m499bWuN+y48jOzvGjrLy4uvW/ydLU1NrL+dPQtcSy2df3z7XNs9bQCivUy9DQoaPV4tbW0+/R1LzytaW2+Me/tPOjrMrKus+499bWyMvKv9Gnz7DKudPDoaPEv8ewo6y7+dPa1eIKK9bW0+/R1LXEz+C52Ly8yvXV/dTat8nL2bXEt6LVuaOs08O7p8r9wb+8sb7nwKm086Osz+C52LXE18rUtLfHs6O24KGjCivI57rO1NogUHl0aG9uINbQyrnTw7zI09C1xCBDIGxpYnJhcnk/CiuhodTa2VnTjb/GvLy/7MvZsGzVubXEvfHM7Cwg6V+wbLywnHnUh9yb83e1xMvZtsjKx7K7yN269tKVtcQKK9Vu7n0uIJ7pvNO/7OlfsGy8sJx51Ie1xMvZtsgsIM7SgoOx47Ojz6PN+8TcwPvTw9K70KnS0elfsGy6w7XECitsaWJyYXJ5LCCBS9PQ0ruCgCBmYXN0IHByb3RvdHlwaW5nILXEIHByb2dyYW1taW5nIGxhbmd1YWdlIL/JCiu5qcq508MuIMS/x7DT0NRT1FO24LbgtcQgbGlicmFyeSDKx9LUIEMgjJGzySwgtvggUHl0aG9uIMrH0ruCgAorZmFzdCBwcm90b3R5cGluZyC1xCBwcm9ncmFtbWluZyBsYW5ndWFnZS4gucrO0oKDz6PN+8TcjKK8yNPQtcQKK0MgbGlicmFyeSDEw7W9IFB5dGhvbiC1xK1ovrPW0Jx51Ie8sNX7us8uIMbk1tDX7tb30qrSssrHztKCg8v5CivSqtOR1ZO1xIaW7n2+zcrHOgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2h6LXV0ZjgudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9oei11dGY4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzExNzM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9oei11dGY4LnR4dApAQCAtMCwwICsxLDIgQEAKK1RoaXMgc2VudGVuY2UgaXMgaW4gQVNDSUkuCitUaGUgbmV4dCBzZW50ZW5jZSBpcyBpbiBHQi7lt7HmiYDkuI3mrLLvvIzli7/mlr3mlrzkurrjgIJCeWUuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2h6LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvaHoudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ODJkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2h6LnR4dApAQCAtMCwwICsxLDIgQEAKK1RoaXMgc2VudGVuY2UgaXMgaW4gQVNDSUkuCitUaGUgbmV4dCBzZW50ZW5jZSBpcyBpbiBHQi5+ezw6S3kyO1N7IyxOcEopbDZISyEjfn1CeWUuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2lzbzIwMjJfanAtdXRmOC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2lzbzIwMjJfanAtdXRmOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc2MzI1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvaXNvMjAyMl9qcC11dGY4LnR4dApAQCAtMCwwICsxLDcgQEAKK1B5dGhvbiDjga7plovnmbrjga/jgIExOTkwIOW5tOOBlOOCjeOBi+OCiemWi+Wni+OBleOCjOOBpuOBhOOBvuOBmeOAggor6ZaL55m66ICF44GuIEd1aWRvIHZhbiBSb3NzdW0g44Gv5pWZ6IKy55So44Gu44OX44Ot44Kw44Op44Of44Oz44Kw6KiA6Kqe44CMQUJD44CN44Gu6ZaL55m644Gr5Y+C5Yqg44GX44Gm44GE44G+44GX44Gf44GM44CBQUJDIOOBr+Wun+eUqOS4iuOBruebrueahOOBq+OBr+OBguOBvuOCiumBqeOBl+OBpuOBhOOBvuOBm+OCk+OBp+OBl+OBn+OAggor44GT44Gu44Gf44KB44CBR3VpZG8g44Gv44KI44KK5a6f55So55qE44Gq44OX44Ot44Kw44Op44Of44Oz44Kw6KiA6Kqe44Gu6ZaL55m644KS6ZaL5aeL44GX44CB6Iux5Zu9IEJCUyDmlL7pgIHjga7jgrPjg6Hjg4fjgqPnlarntYTjgIzjg6Ljg7Pjg4bjgqMg44OR44Kk44K944Oz44CN44Gu44OV44Kh44Oz44Gn44GC44KLIEd1aWRvIOOBr+OBk+OBruiogOiqnuOCkuOAjFB5dGhvbuOAjeOBqOWQjeOBpeOBkeOBvuOBl+OBn+OAggor44GT44Gu44KI44GG44Gq6IOM5pmv44GL44KJ55Sf44G+44KM44GfIFB5dGhvbiDjga7oqIDoqp7oqK3oqIjjga/jgIHjgIzjgrfjg7Pjg5fjg6vjgI3jgafjgIznv5LlvpfjgYzlrrnmmJPjgI3jgajjgYTjgYbnm67mqJnjgavph43ngrnjgYznva7jgYvjgozjgabjgYTjgb7jgZnjgIIKK+WkmuOBj+OBruOCueOCr+ODquODl+ODiOezu+iogOiqnuOBp+OBr+ODpuODvOOCtuOBruebruWFiOOBruWIqeS+v+aAp+OCkuWEquWFiOOBl+OBpuiJsuOAheOBquapn+iDveOCkuiogOiqnuimgee0oOOBqOOBl+OBpuWPluOCiuWFpeOCjOOCi+WgtOWQiOOBjOWkmuOBhOOBruOBp+OBmeOBjOOAgVB5dGhvbiDjgafjga/jgZ3jgYbjgYTjgaPjgZ/lsI/ntLDlt6XjgYzov73liqDjgZXjgozjgovjgZPjgajjga/jgYLjgb7jgorjgYLjgorjgb7jgZvjgpPjgIIKK+iogOiqnuiHquS9k+OBruapn+iDveOBr+acgOWwj+mZkOOBq+aKvOOBleOBiOOAgeW/heimgeOBquapn+iDveOBr+aLoeW8teODouOCuOODpeODvOODq+OBqOOBl+OBpui/veWKoOOBmeOCi+OAgeOBqOOBhOOBhuOBruOBjCBQeXRob24g44Gu44Od44Oq44K344O844Gn44GZ44CCCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvaXNvMjAyMl9qcC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2lzbzIwMjJfanAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMzk4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2lzbzIwMjJfanAudHh0CkBAIC0wLDAgKzEsNyBAQAorUHl0aG9uIBskQiROMytILyRPISIbKEIxOTkwIBskQkcvJDQkbSQrJGkzKztPJDUkbCRGJCQkXiQ5ISMbKEIKKxskQjMrSC88VCROGyhCIEd1aWRvIHZhbiBSb3NzdW0gGyRCJE82NTBpTVEkTiVXJW0lMCVpJV8lcyUwOEA4bCFWGyhCQUJDGyRCIVckTjMrSC8kSzsyMkMkNyRGJCQkXiQ3JD8kLCEiGyhCQUJDIBskQiRPPEJNUT5lJE5MXEUqJEskTyQiJF4kakUsJDckRiQkJF4kOyRzJEckNyQ/ISMbKEIKKxskQiQzJE4kPyRhISIbKEJHdWlkbyAbJEIkTyRoJGo8Qk1RRSokSiVXJW0lMCVpJV8lcyUwOEA4bCROMytILyRyMys7TyQ3ISIxUTlxGyhCIEJCUyAbJEJKfEF3JE4lMyVhJUclI0hWQUghViViJXMlRiUjGyhCIBskQiVRJSQlPSVzIVckTiVVJSElcyRHJCIkaxsoQiBHdWlkbyAbJEIkTyQzJE44QDhsJHIhVhsoQlB5dGhvbhskQiFXJEhMPiRFJDEkXiQ3JD8hIxsoQgorGyRCJDMkTiRoJCYkSkdYN0okKyRpQDgkXiRsJD8bKEIgUHl0aG9uIBskQiROOEA4bEBfN1ckTyEiIVYlNyVzJVclayFXJEchVj0sRkAkLE1GMFchVyRIJCQkJkxcSTgkSz1FRUAkLENWJCskbCRGJCQkXiQ5ISMbKEIKKxskQkI/JC8kTiU5JS8laiVXJUg3TzhAOGwkRyRPJWYhPCU2JE5MXEBoJE5NeEpYQC0kck0lQGgkNyRGPychOSRKNSFHPSRyOEA4bE1XQUckSCQ3JEY8aCRqRn4kbCRrPmw5ZyQsQj8kJCROJEckOSQsISIbKEJQeXRob24gGyRCJEckTyQ9JCYkJCRDJD8+LjpZOSkkLERJMkMkNSRsJGskMyRIJE8kIiReJGokIiRqJF4kOyRzISMbKEIKKxskQjhAOGw8K0JOJE41IUc9JE86Rz4uOEIkSzIhJDUkKCEiSSxNVyRKNSFHPSRPM0hEJSViJTglZSE8JWskSCQ3JEZESTJDJDkkayEiJEgkJCQmJE4kLBsoQiBQeXRob24gGyRCJE4lXSVqJTchPCRHJDkhIxsoQgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2lzbzIwMjJfa3ItdXRmOC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2lzbzIwMjJfa3ItdXRmOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjOWQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvaXNvMjAyMl9rci11dGY4LnR4dApAQCAtMCwwICsxLDcgQEAKK+KXjiDtjIzsnbTsjawoUHl0aG9uKeydgCDrsLDsmrDquLAg7Im96rOgLCDqsJXroKXtlZwg7ZSE66Gc6re4656Y67CNIOyWuOyWtOyeheuLiOuLpC4g7YyM7J207I2s7J2ACivtmqjsnKjsoIHsnbgg6rOg7IiY7KSAIOuNsOydtO2EsCDqtazsobDsmYAg6rCE64uo7ZWY7KeA66eMIO2aqOycqOyggeyduCDqsJ3ssrTsp4DtlqXtlITroZzqt7jrnpjrsI3snYQKK+yngOybkO2VqeuLiOuLpC4g7YyM7J207I2s7J2YIOyasOyVhCjlhKrpm4Up7ZWcIOusuOuyleqzvCDrj5nsoIEg7YOA7J207ZWRLCDqt7jrpqzqs6Ag7J247YSw7ZSE66as7YyFCivtmZjqsr3snYAg7YyM7J207I2s7J2EIOyKpO2BrOumve2MheqzvCDsl6zrn6wg67aE7JW87JeQ7ISc7JmAIOuMgOu2gOu2hOydmCDtlIzrnqvtj7zsl5DshJzsnZgg67mg66W4CivslaDtlIzrpqzsvIDsnbTshZgg6rCc67Cc7J2EIO2VoCDsiJgg7J6I64qUIOydtOyDgeyggeyduCDslrjslrTroZwg66eM65Ok7Ja07KSN64uI64ukLgorCivimIbssqvqsIDrgZ06IOuCoOyVhOudvCDsk6l+IO2BvCEg6riI7JeG7J20IOyghOuLiOuLpC4g6re465+w6rGwIOuLpC4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvaXNvMjAyMl9rci50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2lzbzIwMjJfa3IudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZWNlMjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2lzbzIwMjJfa3IudHh0CkBAIC0wLDAgKzEsNyBAQAorGyQpQw4hXQ8gDkZEQEw9Yw8oUHl0aG9uKQ5AOg8gDjloP2wxYg8gDj0xMG0PLCAOMC03QkdRDyAOR0E3TjFXNyE5Vg8gDj5wPm5AVDRPNFkPLiAORkRATD1jQDoPCisOSD9AMkB7QE4PIA4wbTx2QVgPIA41JUBMRU0PIA4xOEE2P00PIA4wIzRcR09Bdjg4DyAOSD9AMkB7QE4PIA4wNEM8QXZHYkdBN04xVzchOVZAOw8KKw5Bdj94R1U0TzRZDy4gDkZEQEw9Y0BHDyAOP2w+Rg8oDmlQZDoPKQ5HUQ8gDjkuOX0weg8gDjU/QHsPIA5FOEBMR04PLCAOMVc4LjBtDyAOQE5FTUdBOC5GQw8KKw5ILzBmQDoPIA5GREBMPWNAOw8gDj06RSk4M0ZDMHoPIA4/KTcvDyAOOlA+Xz8hPC0/TQ8gDjRrOk46UEBHDyAOR0M3J0Z7PyE8LUBHDyAOOnw4JQ8KKw4+VkdDOC5ESUBMPEcPIA4wMzlfQDsPIA5HUg8gDjx2DyAOQFY0Qg8gDkBMO3NAe0BODyAOPnA+bjdODyAOODg1aT5uQV00TzRZDy4KKworDiFZQzkwITMhDzogDjMvPkY2cw8gDj4xD34gDkUtDyEgDjFdPnhATA8gDkB8NE80WQ8uIA4xVzcxMEUPIA40WQ8uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2pvaGFiLXV0ZjgudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9qb2hhYi11dGY4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU1ZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9qb2hhYi11dGY4LnR4dApAQCAtMCwwICsxLDkgQEAKK+uYoOuwqeqwge2VmCDtjrLsi5zsvZzrnbwKKwor44mv44mv64KpISEg5Zug5Lmd5pyI7Yyo66+k66aU6raIIOKToeKTlu2bgMK/wr/CvyDquI3rkpkg4pOU646oIOOJry4gLgor5Lqe7JiB4pOU64ql7Zq5IC4gLiAuIC4g7ISc7Jq466SEIOuOkO2VmeS5mSDlrrbtm4AgISAhICHjhaAu44WgCivtnZDtnZDtnZAg44Sx44Sx44Sx4piG44WgX+OFoCDslrTrpqgg7YO47L2w6riQIOuOjOydkSDsuZHkuZ3rk6TkuZkg44mv65Oc6riQCivshKTrpowg5a627ZuAIC4gLiAuIC4g6rW07JWg7ImMIOKTlOq2iCDik6HrppjjibHquJAg5Zug5LuB5bed76aB5Lit6rmM7Ka8CivsmYDskoDtm4AgISAhIOS6nuyYgeKTlCDlrrbriqXqtogg4piG5LiK6rSAIOyXhuuKpeq2iOuKpSDkup7riqXrkojtm4Ag6riA7JWg65O0Civik6HroKTrk4DkuZ0g7IuA7ZKU7Ii07ZuAIOyWtOumqCDlm6Dku4Hlt53vpoHkuK3si4Hikajrk6TslZwhISDjia/jia/rgqnimaEg4oyS4oySKgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2pvaGFiLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3Mvam9oYWIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Nzc4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2pvaGFiLnR4dApAQCAtMCwwICsxLDkgQEAKK5mxpHeIYtBhIM1cr6HFqZxhCisKK9zA3MCQcyEhIPFn4pzwVcyBo4mfhYqhINze3NPSetmv2a/ZryCLd5bTINzRlYEg3MAuIC4KK+08tXfc0ZN30nMgLiAuIC4gLiCs4baJnqEglWXQYvDgIOA70nogISAhICGHQS6HQQor02HTYdNhIIhBiEGIQdlph0Ffh0EgtOGfmiDIocXBi3oglWG3dyDDl+Kcl2nw4CDcwJdhi3oKK6zpn3og4DvSeiAuIC4gLiAuIIqJtIGuuiDc0YqhINzen4ncwot6IPFn8WL1Se388+mMYbuaCiu1wbKh0nogISAhIO08tXfc0SDgO5N3iqEg2WnqvonFILT0k3eKoZN3IO08k3eWwdJ6IItptIGXegor3N6dYZdB4pwgr4HOoa6h0nogtOGfmiDxZ/Fi9Unt/PPpr4Lc75dptHohISDcwNzAkHPZvSDZYtliKgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL3NoaWZ0X2ppcy11dGY4LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3Mvc2hpZnRfamlzLXV0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjMyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL3NoaWZ0X2ppcy11dGY4LnR4dApAQCAtMCwwICsxLDcgQEAKK1B5dGhvbiDjga7plovnmbrjga/jgIExOTkwIOW5tOOBlOOCjeOBi+OCiemWi+Wni+OBleOCjOOBpuOBhOOBvuOBmeOAggor6ZaL55m66ICF44GuIEd1aWRvIHZhbiBSb3NzdW0g44Gv5pWZ6IKy55So44Gu44OX44Ot44Kw44Op44Of44Oz44Kw6KiA6Kqe44CMQUJD44CN44Gu6ZaL55m644Gr5Y+C5Yqg44GX44Gm44GE44G+44GX44Gf44GM44CBQUJDIOOBr+Wun+eUqOS4iuOBruebrueahOOBq+OBr+OBguOBvuOCiumBqeOBl+OBpuOBhOOBvuOBm+OCk+OBp+OBl+OBn+OAggor44GT44Gu44Gf44KB44CBR3VpZG8g44Gv44KI44KK5a6f55So55qE44Gq44OX44Ot44Kw44Op44Of44Oz44Kw6KiA6Kqe44Gu6ZaL55m644KS6ZaL5aeL44GX44CB6Iux5Zu9IEJCUyDmlL7pgIHjga7jgrPjg6Hjg4fjgqPnlarntYTjgIzjg6Ljg7Pjg4bjgqMg44OR44Kk44K944Oz44CN44Gu44OV44Kh44Oz44Gn44GC44KLIEd1aWRvIOOBr+OBk+OBruiogOiqnuOCkuOAjFB5dGhvbuOAjeOBqOWQjeOBpeOBkeOBvuOBl+OBn+OAggor44GT44Gu44KI44GG44Gq6IOM5pmv44GL44KJ55Sf44G+44KM44GfIFB5dGhvbiDjga7oqIDoqp7oqK3oqIjjga/jgIHjgIzjgrfjg7Pjg5fjg6vjgI3jgafjgIznv5LlvpfjgYzlrrnmmJPjgI3jgajjgYTjgYbnm67mqJnjgavph43ngrnjgYznva7jgYvjgozjgabjgYTjgb7jgZnjgIIKK+WkmuOBj+OBruOCueOCr+ODquODl+ODiOezu+iogOiqnuOBp+OBr+ODpuODvOOCtuOBruebruWFiOOBruWIqeS+v+aAp+OCkuWEquWFiOOBl+OBpuiJsuOAheOBquapn+iDveOCkuiogOiqnuimgee0oOOBqOOBl+OBpuWPluOCiuWFpeOCjOOCi+WgtOWQiOOBjOWkmuOBhOOBruOBp+OBmeOBjOOAgVB5dGhvbiDjgafjga/jgZ3jgYbjgYTjgaPjgZ/lsI/ntLDlt6XjgYzov73liqDjgZXjgozjgovjgZPjgajjga/jgYLjgb7jgorjgYLjgorjgb7jgZvjgpPjgIIKK+iogOiqnuiHquS9k+OBruapn+iDveOBr+acgOWwj+mZkOOBq+aKvOOBleOBiOOAgeW/heimgeOBquapn+iDveOBr+aLoeW8teODouOCuOODpeODvOODq+OBqOOBl+OBpui/veWKoOOBmeOCi+OAgeOBqOOBhOOBhuOBruOBjCBQeXRob24g44Gu44Od44Oq44K344O844Gn44GZ44CCCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3Mvc2hpZnRfamlzLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3Mvc2hpZnRfamlzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGI3NjBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9zaGlmdF9qaXMudHh0CkBAIC0wLDAgKzEsNyBAQAorUHl0aG9uIILMikqUrYLNgUExOTkwIJROgrKC64KpgueKSo5ugrOC6oLEgqKC3IK3gUIKK4pKlK2O0oLMIEd1aWRvIHZhbiBSb3NzdW0ggs2Ls4jnl3CCzIN2g42DT4OJg36Dk4NPjL6M6oF1QUJDgXaCzIpKlK2CyY5RicGCtYLEgqKC3IK1gr2CqoFBQUJDIILNjsCXcI/jgsyW2pNJgsmCzYKggtyC6JNLgrWCxIKigtyCuYLxgsWCtYK9gUIKK4KxgsyCvYLfgUFHdWlkbyCCzYLmguiOwJdwk0mCyIN2g42DT4OJg36Dk4NPjL6M6oLMikqUrYLwikqOboK1gUGJcI2RIEJCUyCV+pGXgsyDUoOBg2aDQpTUkWeBdYOCg5ODZYNCIINwg0ODXIOTgXaCzIN0g0CDk4LFgqCC6SBHdWlkbyCCzYKxgsyMvozqgvCBdVB5dGhvboF2gsaWvILDgq+C3IK1gr2BQgorgrGCzILmgqSCyJR3jGmCqYLnkLaC3ILqgr0gUHl0aG9uIILMjL6M6pDdjHaCzYFBgXWDVoOTg3aDi4F2gsWBdY9Lk76CqpdliNWBdoLGgqKCpJbalVeCyY9kk1+CqpJ1gqmC6oLEgqKC3IK3gUIKK5G9gq2CzINYg06DioN2g2eMboy+jOqCxYLNg4aBW4NVgsyW2pDmgsyXmJXWkKuC8JdEkOaCtYLEkEaBWILIi0CUXILwjL6M6pd2kWaCxoK1gsSO5oLok/yC6oLpj+qNh4Kqkb2CooLMgsWCt4KqgUFQeXRob24ggsWCzYK7gqSCooLBgr2PrI3XjUiCqpLHicGCs4LqgumCsYLGgs2CoILcguiCoILogtyCuYLxgUIKK4y+jOqOqZHMgsyLQJRcgs2NxY+sjMCCyYmfgrOCpoFBlUuXdoLIi0CUXILNimeSo4OCg1eDhYFbg4uCxoK1gsSSx4nBgreC6YFBgsaCooKkgsyCqiBQeXRob24ggsyDfIOKg1aBW4LFgreBQgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL3NoaWZ0X2ppc3gwMjEzLXV0ZjgudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy11dGY4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTU2YTJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy11dGY4LnR4dApAQCAtMCwwICsxLDggQEAKK1B5dGhvbiDjga7plovnmbrjga/jgIExOTkwIOW5tOOBlOOCjeOBi+OCiemWi+Wni+OBleOCjOOBpuOBhOOBvuOBmeOAggor6ZaL55m66ICF44GuIEd1aWRvIHZhbiBSb3NzdW0g44Gv5pWZ6IKy55So44Gu44OX44Ot44Kw44Op44Of44Oz44Kw6KiA6Kqe44CMQUJD44CN44Gu6ZaL55m644Gr5Y+C5Yqg44GX44Gm44GE44G+44GX44Gf44GM44CBQUJDIOOBr+Wun+eUqOS4iuOBruebrueahOOBq+OBr+OBguOBvuOCiumBqeOBl+OBpuOBhOOBvuOBm+OCk+OBp+OBl+OBn+OAggor44GT44Gu44Gf44KB44CBR3VpZG8g44Gv44KI44KK5a6f55So55qE44Gq44OX44Ot44Kw44Op44Of44Oz44Kw6KiA6Kqe44Gu6ZaL55m644KS6ZaL5aeL44GX44CB6Iux5Zu9IEJCUyDmlL7pgIHjga7jgrPjg6Hjg4fjgqPnlarntYTjgIzjg6Ljg7Pjg4bjgqMg44OR44Kk44K944Oz44CN44Gu44OV44Kh44Oz44Gn44GC44KLIEd1aWRvIOOBr+OBk+OBruiogOiqnuOCkuOAjFB5dGhvbuOAjeOBqOWQjeOBpeOBkeOBvuOBl+OBn+OAggor44GT44Gu44KI44GG44Gq6IOM5pmv44GL44KJ55Sf44G+44KM44GfIFB5dGhvbiDjga7oqIDoqp7oqK3oqIjjga/jgIHjgIzjgrfjg7Pjg5fjg6vjgI3jgafjgIznv5LlvpfjgYzlrrnmmJPjgI3jgajjgYTjgYbnm67mqJnjgavph43ngrnjgYznva7jgYvjgozjgabjgYTjgb7jgZnjgIIKK+WkmuOBj+OBruOCueOCr+ODquODl+ODiOezu+iogOiqnuOBp+OBr+ODpuODvOOCtuOBruebruWFiOOBruWIqeS+v+aAp+OCkuWEquWFiOOBl+OBpuiJsuOAheOBquapn+iDveOCkuiogOiqnuimgee0oOOBqOOBl+OBpuWPluOCiuWFpeOCjOOCi+WgtOWQiOOBjOWkmuOBhOOBruOBp+OBmeOBjOOAgVB5dGhvbiDjgafjga/jgZ3jgYbjgYTjgaPjgZ/lsI/ntLDlt6XjgYzov73liqDjgZXjgozjgovjgZPjgajjga/jgYLjgb7jgorjgYLjgorjgb7jgZvjgpPjgIIKK+iogOiqnuiHquS9k+OBruapn+iDveOBr+acgOWwj+mZkOOBq+aKvOOBleOBiOOAgeW/heimgeOBquapn+iDveOBr+aLoeW8teODouOCuOODpeODvOODq+OBqOOBl+OBpui/veWKoOOBmeOCi+OAgeOBqOOBhOOBhuOBruOBjCBQeXRob24g44Gu44Od44Oq44K344O844Gn44GZ44CCCisKK+ODjuOBi+OCmiDjg4jjgpog44OI44Kt76i276i5IPChmrTwqo6MIOm6gOm9gfCpm7AKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjOWVmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMudHh0CkBAIC0wLDAgKzEsOCBAQAorUHl0aG9uIILMikqUrYLNgUExOTkwIJROgrKC64KpgueKSo5ugrOC6oLEgqKC3IK3gUIKK4pKlK2O0oLMIEd1aWRvIHZhbiBSb3NzdW0ggs2Ls4jnl3CCzIN2g42DT4OJg36Dk4NPjL6M6oF1QUJDgXaCzIpKlK2CyY5RicGCtYLEgqKC3IK1gr2CqoFBQUJDIILNjsCXcI/jgsyW2pNJgsmCzYKggtyC6JNLgrWCxIKigtyCuYLxgsWCtYK9gUIKK4KxgsyCvYLfgUFHdWlkbyCCzYLmguiOwJdwk0mCyIN2g42DT4OJg36Dk4NPjL6M6oLMikqUrYLwikqOboK1gUGJcI2RIEJCUyCV+pGXgsyDUoOBg2aDQpTUkWeBdYOCg5ODZYNCIINwg0ODXIOTgXaCzIN0g0CDk4LFgqCC6SBHdWlkbyCCzYKxgsyMvozqgvCBdVB5dGhvboF2gsaWvILDgq+C3IK1gr2BQgorgrGCzILmgqSCyJR3jGmCqYLnkLaC3ILqgr0gUHl0aG9uIILMjL6M6pDdjHaCzYFBgXWDVoOTg3aDi4F2gsWBdY9Lk76CqpdliNWBdoLGgqKCpJbalVeCyY9kk1+CqpJ1gqmC6oLEgqKC3IK3gUIKK5G9gq2CzINYg06DioN2g2eMboy+jOqCxYLNg4aBW4NVgsyW2pDmgsyXmJXWkKuC8JdEkOaCtYLEkEaBWILIi0CUXILwjL6M6pd2kWaCxoK1gsSO5oLok/yC6oLpj+qNh4Kqkb2CooLMgsWCt4KqgUFQeXRob24ggsWCzYK7gqSCooLBgr2PrI3XjUiCqpLHicGCs4LqgumCsYLGgs2CoILcguiCoILogtyCuYLxgUIKK4y+jOqOqZHMgsyLQJRcgs2NxY+sjMCCyYmfgrOCpoFBlUuXdoLIi0CUXILNimeSo4OCg1eDhYFbg4uCxoK1gsSSx4nBgreC6YFBgsaCooKkgsyCqiBQeXRob24ggsyDfIOKg1aBW4LFgreBQgorCiuDbYL1IIOeIINng0yIS4h5IJiD/NYg/NL85vvUCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY21hdGhfdGVzdGNhc2VzLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jbWF0aF90ZXN0Y2FzZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNTkzODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY21hdGhfdGVzdGNhc2VzLnR4dApAQCAtMCwwICsxLDIzNjUgQEAKKy0tIFRlc3RjYXNlcyBmb3IgZnVuY3Rpb25zIGluIGNtYXRoLgorLS0KKy0tIEVhY2ggbGluZSB0YWtlcyB0aGUgZm9ybToKKy0tCistLSA8dGVzdGlkPiA8ZnVuY3Rpb24+IDxpbnB1dF92YWx1ZT4gLT4gPG91dHB1dF92YWx1ZT4gPGZsYWdzPgorLS0KKy0tIHdoZXJlOgorLS0KKy0tICAgPHRlc3RpZD4gaXMgYSBzaG9ydCBuYW1lIGlkZW50aWZ5aW5nIHRoZSB0ZXN0LAorLS0KKy0tICAgPGZ1bmN0aW9uPiBpcyB0aGUgZnVuY3Rpb24gdG8gYmUgdGVzdGVkIChleHAsIGNvcywgYXNpbmgsIC4uLiksCistLQorLS0gICA8aW5wdXRfdmFsdWU+IGlzIGEgcGFpciBvZiBmbG9hdHMgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UKKy0tICAgICByZXByZXNlbnRpbmcgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIG9mIGEgY29tcGxleCBudW1iZXIsIGFuZAorLS0KKy0tICAgPG91dHB1dF92YWx1ZT4gaXMgdGhlIGV4cGVjdGVkIChpZGVhbCkgb3V0cHV0IHZhbHVlLCBhZ2FpbgorLS0gICAgIHJlcHJlc2VudGVkIGFzIGEgcGFpciBvZiBmbG9hdHMuCistLQorLS0gICA8ZmxhZ3M+IGlzIGEgbGlzdCBvZiB0aGUgZmxvYXRpbmctcG9pbnQgZmxhZ3MgcmVxdWlyZWQgYnkgQzk5CistLQorLS0gVGhlIHBvc3NpYmxlIGZsYWdzIGFyZToKKy0tCistLSAgIGRpdmlkZS1ieS16ZXJvIDogcmFpc2VkIHdoZW4gYSBmaW5pdGUgaW5wdXQgZ2l2ZXMgYQorLS0gICAgIG1hdGhlbWF0aWNhbGx5IGluZmluaXRlIHJlc3VsdC4KKy0tCistLSAgIG92ZXJmbG93IDogcmFpc2VkIHdoZW4gYSBmaW5pdGUgaW5wdXQgZ2l2ZXMgYSBmaW5pdGUgcmVzdWx0IHdob3NlCistLSAgICAgcmVhbCBvciBpbWFnaW5hcnkgcGFydCBpcyB0b28gbGFyZ2UgdG8gZml0IGluIHRoZSB1c3VhbCByYW5nZQorLS0gICAgIG9mIGFuIElFRUUgNzU0IGRvdWJsZS4KKy0tCistLSAgIGludmFsaWQgOiByYWlzZWQgZm9yIGludmFsaWQgaW5wdXRzLgorLS0KKy0tICAgaWdub3JlLXJlYWwtc2lnbiA6IGluZGljYXRlcyB0aGF0IHRoZSBzaWduIG9mIHRoZSByZWFsIHBhcnQgb2YKKy0tICAgICB0aGUgcmVzdWx0IGlzIHVuc3BlY2lmaWVkOyBpZiB0aGUgcmVhbCBwYXJ0IG9mIHRoZSByZXN1bHQgaXMKKy0tICAgICBnaXZlbiBhcyBpbmYsIHRoZW4gYm90aCAtaW5mIGFuZCBpbmYgc2hvdWxkIGJlIGFjY2VwdGVkIGFzCistLSAgICAgY29ycmVjdC4KKy0tCistLSAgIGlnbm9yZS1pbWFnLXNpZ24gOiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2lnbiBvZiB0aGUgaW1hZ2luYXJ5IHBhcnQKKy0tICAgICBvZiB0aGUgcmVzdWx0IGlzIHVuc3BlY2lmaWVkLgorLS0KKy0tIEZsYWdzIG1heSBhcHBlYXIgaW4gYW55IG9yZGVyLgorLS0KKy0tIExpbmVzIGJlZ2lubmluZyB3aXRoICctLScgKGxpa2UgdGhpcyBvbmUpIHN0YXJ0IGEgY29tbWVudCwgYW5kIGFyZQorLS0gaWdub3JlZC4gIEJsYW5rIGxpbmVzLCBvciBsaW5lcyBjb250YWluaW5nIG9ubHkgd2hpdGVzcGFjZSwgYXJlIGFsc28KKy0tIGlnbm9yZWQuCisKKy0tIFRoZSBtYWpvcml0eSBvZiB0aGUgdmFsdWVzIGJlbG93IHdlcmUgY29tcHV0ZWQgd2l0aCB0aGUgaGVscCBvZgorLS0gdmVyc2lvbiAyLjMgb2YgdGhlIE1QRlIgbGlicmFyeSBmb3IgbXVsdGlwbGUtcHJlY2lzaW9uCistLSBmbG9hdGluZy1wb2ludCBjb21wdXRhdGlvbnMgd2l0aCBjb3JyZWN0IHJvdW5kaW5nLiAgQWxsIG91dHB1dAorLS0gdmFsdWVzIGluIHRoaXMgZmlsZSBhcmUgKG1vZHVsbyB5ZXQtdG8tYmUtZGlzY292ZXJlZCBidWdzKQorLS0gY29ycmVjdGx5IHJvdW5kZWQsIHByb3ZpZGVkIHRoYXQgZWFjaCBpbnB1dCBhbmQgb3V0cHV0IGRlY2ltYWwKKy0tIGZsb2F0aW5nLXBvaW50IHZhbHVlIGJlbG93IGlzIGludGVycHJldGVkIGFzIGEgcmVwcmVzZW50YXRpb24gb2YKKy0tIHRoZSBjb3JyZXNwb25kaW5nIG5lYXJlc3QgSUVFRSA3NTQgZG91YmxlLXByZWNpc2lvbiB2YWx1ZS4gIFNlZSB0aGUKKy0tIE1QRlIgaG9tZXBhZ2UgYXQgaHR0cDovL3d3dy5tcGZyLm9yZyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKy0tIE1QRlIgcHJvamVjdC4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gYWNvczogSW52ZXJzZSBjb3NpbmUgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tIHplcm9zCithY29zMDAwMCBhY29zIDAuMCAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2Fjb3MwMDAxIGFjb3MgMC4wIC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYWNvczAwMDIgYWNvcyAtMC4wIDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorYWNvczAwMDMgYWNvcyAtMC4wIC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorCistLSBicmFuY2ggcG9pbnRzOiArLy0xCithY29zMDAxMCBhY29zIDEuMCAwLjAgLT4gMC4wIC0wLjAKK2Fjb3MwMDExIGFjb3MgMS4wIC0wLjAgLT4gMC4wIDAuMAorYWNvczAwMTIgYWNvcyAtMS4wIDAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgLTAuMAorYWNvczAwMTMgYWNvcyAtMS4wIC0wLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIDAuMAorCistLSB2YWx1ZXMgYWxvbmcgYm90aCBzaWRlcyBvZiByZWFsIGF4aXMKK2Fjb3MwMDIwIGFjb3MgLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorYWNvczAwMjEgYWNvcyAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithY29zMDAyMiBhY29zIC0xZS0zMDUgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithY29zMDAyMyBhY29zIC0xZS0zMDUgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithY29zMDAyNCBhY29zIC0xZS0xNTAgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithY29zMDAyNSBhY29zIC0xZS0xNTAgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithY29zMDAyNiBhY29zIC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjggLTAuMAorYWNvczAwMjcgYWNvcyAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2OCAwLjAKK2Fjb3MwMDI4IGFjb3MgLTAuMDAxIDAuMCAtPiAxLjU3MTc5NjMyNjk2MTU2MzQgLTAuMAorYWNvczAwMjkgYWNvcyAtMC4wMDEgLTAuMCAtPiAxLjU3MTc5NjMyNjk2MTU2MzQgMC4wCithY29zMDAzMCBhY29zIC0wLjU3ODk5OTk5OTk5OTk5OTk2IDAuMCAtPiAyLjE4ODI5Nzk4MTYxMjA2NjcgLTAuMAorYWNvczAwMzEgYWNvcyAtMC41Nzg5OTk5OTk5OTk5OTk5NiAtMC4wIC0+IDIuMTg4Mjk3OTgxNjEyMDY2NyAwLjAKK2Fjb3MwMDMyIGFjb3MgLTAuOTk5OTk5OTk5OTk5OTk5ODkgMC4wIC0+IDMuMTQxNTkyNjM4Njg4NjMxOSAtMC4wCithY29zMDAzMyBhY29zIC0wLjk5OTk5OTk5OTk5OTk5OTg5IC0wLjAgLT4gMy4xNDE1OTI2Mzg2ODg2MzE5IDAuMAorYWNvczAwMzQgYWNvcyAtMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgLTIuMTA3MzQyNDI1NTQ0NzAxNGUtMDgKK2Fjb3MwMDM1IGFjb3MgLTEuMDAwMDAwMDAwMDAwMDAwMiAtMC4wIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSAyLjEwNzM0MjQyNTU0NDcwMTRlLTA4CithY29zMDAzNiBhY29zIC0xLjAwMDk5OTk5OTk5OTk5OTkgMC4wIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSAtMC4wNDQ3MTc2MzM2MDgzMDY4NDkKK2Fjb3MwMDM3IGFjb3MgLTEuMDAwOTk5OTk5OTk5OTk5OSAtMC4wIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSAwLjA0NDcxNzYzMzYwODMwNjg0OQorYWNvczAwMzggYWNvcyAtMi4wIDAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgLTEuMzE2OTU3ODk2OTI0ODE2OAorYWNvczAwMzkgYWNvcyAtMi4wIC0wLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIDEuMzE2OTU3ODk2OTI0ODE2OAorYWNvczAwNDAgYWNvcyAtMjMuMCAwLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIC0zLjgyODE2ODQ3MTMzMzEwMTIKK2Fjb3MwMDQxIGFjb3MgLTIzLjAgLTAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgMy44MjgxNjg0NzEzMzMxMDEyCithY29zMDA0MiBhY29zIC0xMDAwMDAwMDAwMDAwMDAwMC4wIDAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgLTM3LjUzNDUwODY2ODQ2NDY3NAorYWNvczAwNDMgYWNvcyAtMTAwMDAwMDAwMDAwMDAwMDAuMCAtMC4wIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSAzNy41MzQ1MDg2Njg0NjQ2NzQKK2Fjb3MwMDQ0IGFjb3MgLTkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IDAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgLTM0Ni4wODA5MTExMjk2NjY3OQorYWNvczAwNDUgYWNvcyAtOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLTAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgMzQ2LjA4MDkxMTEyOTY2Njc5CithY29zMDA0NiBhY29zIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIC02ODkuMTY2MDg5OTg1Nzc5NjUKK2Fjb3MwMDQ3IGFjb3MgLTEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0wLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIDY4OS4xNjYwODk5ODU3Nzk2NQorYWNvczAwNDggYWNvcyA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2Fjb3MwMDQ5IGFjb3MgOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithY29zMDA1MCBhY29zIDFlLTMwNSAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2Fjb3MwMDUxIGFjb3MgMWUtMzA1IC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYWNvczAwNTIgYWNvcyAxZS0xNTAgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithY29zMDA1MyBhY29zIDFlLTE1MCAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2Fjb3MwMDU0IGFjb3MgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2Fjb3MwMDU1IGFjb3MgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2Fjb3MwMDU2IGFjb3MgMC4wMDEgMC4wIC0+IDEuNTY5Nzk2MzI2NjI4MjMgLTAuMAorYWNvczAwNTcgYWNvcyAwLjAwMSAtMC4wIC0+IDEuNTY5Nzk2MzI2NjI4MjMgMC4wCithY29zMDA1OCBhY29zIDAuNTc4OTk5OTk5OTk5OTk5OTYgMC4wIC0+IDAuOTUzMjk0NjcxOTc3NzI2NTUgLTAuMAorYWNvczAwNTkgYWNvcyAwLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gMC45NTMyOTQ2NzE5Nzc3MjY1NSAwLjAKK2Fjb3MwMDYwIGFjb3MgMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAgLT4gMS40OTAxMTYxMTkzODQ3NjU2ZS0wOCAtMC4wCithY29zMDA2MSBhY29zIDAuOTk5OTk5OTk5OTk5OTk5ODkgLTAuMCAtPiAxLjQ5MDExNjExOTM4NDc2NTZlLTA4IDAuMAorYWNvczAwNjIgYWNvcyAxLjAwMDAwMDAwMDAwMDAwMDIgMC4wIC0+IDAuMCAtMi4xMDczNDI0MjU1NDQ3MDE0ZS0wOAorYWNvczAwNjMgYWNvcyAxLjAwMDAwMDAwMDAwMDAwMDIgLTAuMCAtPiAwLjAgMi4xMDczNDI0MjU1NDQ3MDE0ZS0wOAorYWNvczAwNjQgYWNvcyAxLjAwMDk5OTk5OTk5OTk5OTkgMC4wIC0+IDAuMCAtMC4wNDQ3MTc2MzM2MDgzMDY4NDkKK2Fjb3MwMDY1IGFjb3MgMS4wMDA5OTk5OTk5OTk5OTk5IC0wLjAgLT4gMC4wIDAuMDQ0NzE3NjMzNjA4MzA2ODQ5CithY29zMDA2NiBhY29zIDIuMCAwLjAgLT4gMC4wIC0xLjMxNjk1Nzg5NjkyNDgxNjgKK2Fjb3MwMDY3IGFjb3MgMi4wIC0wLjAgLT4gMC4wIDEuMzE2OTU3ODk2OTI0ODE2OAorYWNvczAwNjggYWNvcyAyMy4wIDAuMCAtPiAwLjAgLTMuODI4MTY4NDcxMzMzMTAxMgorYWNvczAwNjkgYWNvcyAyMy4wIC0wLjAgLT4gMC4wIDMuODI4MTY4NDcxMzMzMTAxMgorYWNvczAwNzAgYWNvcyAxMDAwMDAwMDAwMDAwMDAwMC4wIDAuMCAtPiAwLjAgLTM3LjUzNDUwODY2ODQ2NDY3NAorYWNvczAwNzEgYWNvcyAxMDAwMDAwMDAwMDAwMDAwMC4wIC0wLjAgLT4gMC4wIDM3LjUzNDUwODY2ODQ2NDY3NAorYWNvczAwNzIgYWNvcyA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAwLjAgLT4gMC4wIC0zNDYuMDgwOTExMTI5NjY2NzkKK2Fjb3MwMDczIGFjb3MgOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLTAuMCAtPiAwLjAgMzQ2LjA4MDkxMTEyOTY2Njc5CithY29zMDA3NCBhY29zIDEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IDAuMCAtPiAwLjAgLTY4OS4xNjYwODk5ODU3Nzk2NQorYWNvczAwNzUgYWNvcyAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtMC4wIC0+IDAuMCA2ODkuMTY2MDg5OTg1Nzc5NjUKKworLS0gcmFuZG9tIGlucHV0cworYWNvczAxMDAgYWNvcyAtMy4zMzA3MTEzMzI0NTk2NjgyIC0xMC43MzIwMDc1MzA4NjMyNjYgLT4gMS44NzA2MDg1Njk0NDgyMzM5IDMuMTEzOTg2ODA2NTU0NjEzCithY29zMDEwMSBhY29zIC0yODYzLjk1Mjk5MTc0MzI5MSAtMjY4MTAxMzMxNS4yNTcxMjM5IC0+IDEuNTcwNzk3Mzk1MDMwMTY5OSAyMi40MDI2MDc4NDMyNzQ3NTgKK2Fjb3MwMTAyIGFjb3MgLTAuMzMwNzI2Mzk3OTMyMjAwODggLTAuODUwNTU0NjQ2NTgyNTMwNTUgLT4gMS44MjE5NDI2ODk1OTIyNjAxIDAuNzkyNTAxNjY3MjkzMTE5NjYKK2Fjb3MwMTAzIGFjb3MgLTIuNTcyMjMyNTg0MjA5NzgwMiAtMTIuNzAzOTQwODA5ODIxNTc0IC0+IDEuNzY5OTk0MjQxMzEwNzQwOCAzLjI1NjUxNzAxNTY1MjczMjUKK2Fjb3MwMTA0IGFjb3MgLTQyLjQ5NTIzMzc4NTQ1OTU4MyAtMC41NDAzOTMyMDc1MTMzNzE2MSAtPiAzLjEyODg3MzI1NzMxNTMzMDQgNC40NDI0ODE1NTE5NzM1NjAxCithY29zMDEwNSBhY29zIC0xLjEzNjM4MTg2MjU4NTY0MDEgOTY0MS4xMzI1NDk4NjMwMzc2IC0+IDEuNTcwOTE0MTk0ODgyMDA0OSAtOS44NjY5NDEwNTUzMjU0Mjg0CithY29zMDEwNiBhY29zIC0yLjQzOTg0MjY4MjQxNTc4NjZlLTExIDAuMzMwMDIwNTE4OTAyNjYxNjUgLT4gMS41NzA3OTYzMjY4MTgwNjYgLTAuMzI0MzA1NzgwNDE1Nzg2NjcKK2Fjb3MwMTA3IGFjb3MgLTEuMzUyMTM0MDQyODE4NjU1MiAyLjkzNjk3Mzc5MTIwNzY3NzIgLT4gMS45ODQ5MDU5MTkyMzM5MzM4IC0xLjg4MjI4OTM2NzQxMTc5NDIKK2Fjb3MwMTA4IGFjb3MgLTEuODI3MzY0NzA2NDc3OTE1IDEuMDM1NTQ1OTIzMjE0NzU1NyAtPiAyLjU3MzIyNDYzMDc5NjAwMzIgLTEuNDA5MDY4ODI2Nzg1NDk2OQorYWNvczAxMDkgYWNvcyAtMC4yNTk3ODM3MzcwNjQwMzU0NiAxMC4wOTcxMjY2OTE4NTgzMyAtPiAxLjU5NjM5NDAzODYzNzgzMDYgLTMuMDA4MTY3MzA1MDE5NjA2MworYWNvczAxMTAgYWNvcyAwLjMzNTYxNzc4NDcxMDcyNTUxIC00NTg3MzUwLjY4MjM5OTkxMTggLT4gMS41NzA3OTYyNTM2MzMzMjUxIDE2LjAzMTk2MDQwMjU3OTUzOQorYWNvczAxMTEgYWNvcyAwLjQ5MTMzNDQ0NjEwOTk4NDQ1IC0wLjgwNzE0MjIzNjI5OTAwMTUgLT4gMS4xOTA4NzYxNzEyODAxNzg4IDAuNzg1NzMzNDU4MTMxODc4NjcKK2Fjb3MwMTEyIGFjb3MgMC40MjE5NjczNDUwNzgyMzk3NCAtMi40ODEyOTY1NDMxNzQ1MTE1IC0+IDEuNDE0MDkxMTg2MTAwNjkyIDEuNjUxNzA3MjYwOTg4MTcyCithY29zMDExMyBhY29zIDIuOTYxNDI2MjEwMTAwNjU1IC0yMTkuMDMyOTU2OTUyNDg2NjQgLT4gMS41NTcyNzY4MzE5ODIyNzc4IDYuMDgyNDY1OTg4NTgyNzMwNAorYWNvczAxMTQgYWNvcyAyLjg4NjIwOTA2MzY1MjY0MSAtMjAuMzgwMTEyMDcyMjA2MDYgLT4gMS40MzAyNzY1MjUyMjk3ODg5IDMuNzE4MjAxODUzMTQ3NjQyCithY29zMDExNSBhY29zIDAuNDE4MDU2ODA3NTI3NjUwOSAxLjQ4MzM0MzM5OTA4MjM0ODQgLT4gMS4zMzkzODM0NTU4MzAzMDQyIC0xLjIwNzk4NDc3NTgzMDE1NzYKK2Fjb3MwMTE2IGFjb3MgNTIuMzc2MTExNDA1OTI0NzE4IDAuMDEzOTMwNDI5MDAxOTQxMDAxIC0+IDAuMDAwMjY2MDE3NjE4MDQwMjQxODggLTQuNjUxNTA2NjY5MTIwNDcxNAorYWNvczAxMTcgYWNvcyA0MTYzNzk0ODM4Ny42MjU5NjkgMS41NjM0MTgyOTI4OTQwNDEgLT4gMy43NTQ3OTE4NTA3ODgzNTQ4ZS0xMSAtMjUuMTQ1NDI0OTg5ODA5MzgxCithY29zMDExOCBhY29zIDAuMDYxMjI2NjU5MTIyMjQ5NTI2IDAuODQ0NzIzNDM5NDYxNTE1NCAtPiAxLjUyNDAyODAzMDYzNjczMTUgLTAuNzY3OTE3OTg5NzExNDA4MTIKK2Fjb3MwMTE5IGFjb3MgMi40NDgwNDY2NDIwNDQyOTU5ZSsyNiAwLjE4MDAyMzM5MjAxMzg0NjYyIC0+IDcuMzUzNzU2NjIwNTY0Nzk4ZS0yOCAtNjEuNDU1NjUwMDE1OTk2Mzc2CisKKy0tIHZhbHVlcyBuZWFyIGluZmluaXR5CithY29zMDIwMCBhY29zIDEuNjIwNjg2MDUxODY4MzAyMWUrMzA4IDEuMDMwODQyNjIyNjI4NTI4M2UrMzA4IC0+IDAuNTY2NTA4MjYwOTM4MjYyMjMgLTcxMC41NDIwNjg3NDI0MTU2MQorYWNvczAyMDEgYWNvcyAxLjIwNjc3MzU4NzUwNzAwNjJlKzMwOCAtMS4zNDI5MTczNzI0MzkwMjc2ZSszMDggLT4gMC44Mzg3NDM2OTM5MDg2NDg4OSA3MTAuNDgwMTc3OTQwMjc0OTgKK2Fjb3MwMjAyIGFjb3MgLTcuNDEzMDE0NTEzMjU0OTA0N2UrMzA3IDEuMTc1OTEzMDU0MzkyNzY0NWUrMzA4IC0+IDIuMTMzMjcyOTM0NjQ3ODUzNiAtNzEwLjIxODcxMTE1Njk4NzUyCithY29zMDIwMyBhY29zIC04LjYzMjk0MjY0NDIyNTcyNDllKzMwNyAtMS4yMzE2MjgyOTUyMTg0MTMzZSszMDggLT4gMi4xODIxNTExMDMyNDQ0ODM4IDcxMC4yOTc1MjE0NTY5NzE0OAorYWNvczAyMDQgYWNvcyAwLjAgMS40Mjg5NzEzODU1ODQ5NzQ2ZSszMDggLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC03MTAuMjQ2MzEwNjk3Mzg5OTYKK2Fjb3MwMjA1IGFjb3MgLTAuMCAxLjMxNTM1MjQ1NDU5ODc0MzJlKzMwOCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTcxMC4xNjM0NjA0Nzg3NTM5CithY29zMDIwNiBhY29zIDAuMCAtOS42MjI5MDM3NjY5MjY5MzIxZSszMDcgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDcwOS44NTA5MTY3OTU3MzY5MQorYWNvczAyMDcgYWNvcyAtMC4wIC00Ljk3ODM2MTY0MjExMDcwODhlKzMwNyAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgNzA5LjE5MTg3MTU3OTExMjMzCithY29zMDIwOCBhY29zIDEuMzkzNzU0MTkyNTczOTM4OWUrMzA4IDAuMCAtPiAwLjAgLTcxMC4yMjEzNTY3ODcwNzI2NAorYWNvczAyMDkgYWNvcyA5LjEzNjIzODg5NjczNzE1MzZlKzMwNyAtMC4wIC0+IDAuMCA3MDkuNzk5MDE5NTMxMjQ2MTMKK2Fjb3MwMjEwIGFjb3MgLTEuMzQ1NzM2MTIyMDY5NzQzNmUrMzA4IDAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgLTcxMC4xODYyOTY5ODg3MTg0OAorYWNvczAyMTEgYWNvcyAtNS40Njk5MDkwMDU2MTQ0Mjg0ZSszMDcgLTAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgNzA5LjI4NjAzMjcxMDg1NjQ5CithY29zMDIxMiBhY29zIDEuNTg4MDcxNjkzMjM1ODkwMWUrMzA4IDUuNTYzODQwMTI1MjMzOTkyOSAtPiAzLjUwMzUxOTQ4Nzc3Mzg3M2UtMzA4IC03MTAuMzUxODc2MzMxNDA1ODMKK2Fjb3MwMjEzIGFjb3MgMS4yNDk3MjExNjYzNDYzMTY0ZSszMDggLTMuMDQ1NjQ3NzcxNzkxMTAyNCAtPiAyLjQzNzA2MTg0NTMxOTc0ODZlLTMwOCA3MTAuMTEyMjc2MjgyMjM0MTIKK2Fjb3MwMjE0IGFjb3MgLTkuOTAxNjIyNDAwNjAyOTUyOGUrMzA3IDQuOTU3MDQyNzM0MDc4OTA1NiAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgLTcwOS44Nzk0NjkzNTIyOTQ2OAorYWNvczAyMTUgYWNvcyAtMS41ODU0MDcxMDY2ODc0MTM5ZSszMDggLTQuNDIzMzU3Nzc0MTQ5Nzc4MyAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgNzEwLjM1MDE5NzA0NjcyMDA0CithY29zMDIxNiBhY29zIDkuMzY3NDYyMzA4MzY0NzYyOCAxLjUyMDk1NTkwNTE4Nzc5NzllKzMwOCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTcxMC4zMDg2OTQ4NDQ5MTA4NgorYWNvczAyMTcgYWNvcyA4LjE3NzM4MzIwMjE3ODQzODMgLTYuNjA5MzQ0NTc5NTAwMDA1NmUrMzA3IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiA3MDkuNDc1MjU1MjIyNzc5MgorYWNvczAyMTggYWNvcyAtMy4xODQ1OTM1MDAwNjY1MTA0IDEuNTc2ODg1NjM5NjY1MDg5M2UrMzA4IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtNzEwLjM0NDgwNzYxMDQyNjg3CithY29zMDIxOSBhY29zIC0xLjA1NzczMDM4ODA5NTM5MDMgLTYuNDU3NDYyNjgxNTczNTYxM2UrMzA3IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiA3MDkuNDUyMDA3MTk2NjIwNDYKKworLS0gdmFsdWVzIG5lYXIgMAorYWNvczAyMjAgYWNvcyAxLjg1NjY5ODY5NzA3MTQwNDVlLTMyMCAzLjE4NjcyMzQxNTY3NjA0MDJlLTMyMSAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTMuMTg2NzIzNDE1Njc2MDQwMmUtMzIxCithY29zMDIyMSBhY29zIDcuOTA1MDUwMzMzNDU5OTQ0N2UtMzIzIC04Ljg5MzE4MTYyNTE0MjQzNzhlLTMyMyAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgOC44OTMxODE2MjUxNDI0Mzc4ZS0zMjMKK2Fjb3MwMjIyIGFjb3MgLTQuNDQ2NTkwODEyNTcxMjE4OWUtMzIzIDIuNDY1NDA2NTA5NzIyMjcyN2UtMzExIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMi40NjU0MDY1MDk3MjIyNzI3ZS0zMTEKK2Fjb3MwMjIzIGFjb3MgLTYuMTAxNjkxNjQwODE5MjYxOWUtMzExIC0yLjQ3MDMyODIyOTIwNjIzMjdlLTMyMyAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMi40NzAzMjgyMjkyMDYyMzI3ZS0zMjMKK2Fjb3MwMjI0IGFjb3MgMC4wIDMuNDMwNTc4MzYyMTg0MjcyOWUtMzExIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMy40MzA1NzgzNjIxODQyNzI5ZS0zMTEKK2Fjb3MwMjI1IGFjb3MgLTAuMCAxLjYxMTc0MDk0OTg2MzMxNDVlLTMxOSAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTEuNjExNzQwOTQ5ODYzMzE0NWUtMzE5CithY29zMDIyNiBhY29zIDAuMCAtNC45OTAwNjMwMjI5OTY1OTAxZS0zMjIgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDQuOTkwMDYzMDIyOTk2NTkwMWUtMzIyCithY29zMDIyNyBhY29zIC0wLjAgLTQuNDg4OTI3OTIxMDU5MjgxOGUtMzExIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiA0LjQ4ODkyNzkyMTA1OTI4MThlLTMxMQorYWNvczAyMjggYWNvcyA1LjMyOTc2Nzg2ODE0NzcyMTRlLTMxMiAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2Fjb3MwMjI5IGFjb3MgNi4yMDczNDI1ODk3MjExNjE0ZS0zMTMgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithY29zMDIzMCBhY29zIC00Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2Fjb3MwMjMxIGFjb3MgLTEuNzEwNzUxNzA1Mjg5OTAwM2UtMzE4IC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorCistLSBzcGVjaWFsIHZhbHVlcworYWNvczEwMDAgYWNvcyAwLjAgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithY29zMTAwMSBhY29zIDAuMCAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2Fjb3MxMDAyIGFjb3MgLTAuMCAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2Fjb3MxMDAzIGFjb3MgLTAuMCAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2Fjb3MxMDA0IGFjb3MgMC4wIG5hbiAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgbmFuCithY29zMTAwNSBhY29zIC0wLjAgbmFuIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiBuYW4KK2Fjb3MxMDA2IGFjb3MgLTIuMyBpbmYgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC1pbmYKK2Fjb3MxMDA3IGFjb3MgLTAuMCBpbmYgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC1pbmYKK2Fjb3MxMDA4IGFjb3MgMC4wIGluZiAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLWluZgorYWNvczEwMDkgYWNvcyAyLjMgaW5mIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtaW5mCithY29zMTAxMCBhY29zIC0yLjMgbmFuIC0+IG5hbiBuYW4KK2Fjb3MxMDExIGFjb3MgMi4zIG5hbiAtPiBuYW4gbmFuCithY29zMTAxMiBhY29zIC1pbmYgMi4zIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSAtaW5mCithY29zMTAxMyBhY29zIC1pbmYgMC4wIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSAtaW5mCithY29zMTAxNCBhY29zIGluZiAyLjMgLT4gMC4wIC1pbmYKK2Fjb3MxMDE1IGFjb3MgaW5mIDAuMCAtPiAwLjAgLWluZgorYWNvczEwMTYgYWNvcyAtaW5mIGluZiAtPiAyLjM1NjE5NDQ5MDE5MjM0NDggLWluZgorYWNvczEwMTcgYWNvcyBpbmYgaW5mIC0+IDAuNzg1Mzk4MTYzMzk3NDQ4MjggLWluZgorYWNvczEwMTggYWNvcyBpbmYgbmFuIC0+IG5hbiBpbmYgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUtaW1hZy1zaWduCithY29zMTAxOSBhY29zIC1pbmYgbmFuIC0+IG5hbiBpbmYgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS1pbWFnLXNpZ24KK2Fjb3MxMDIwIGFjb3MgbmFuIDAuMCAtPiBuYW4gbmFuCithY29zMTAyMSBhY29zIG5hbiAyLjMgLT4gbmFuIG5hbgorYWNvczEwMjIgYWNvcyBuYW4gaW5mIC0+IG5hbiAtaW5mCithY29zMTAyMyBhY29zIG5hbiBuYW4gLT4gbmFuIG5hbgorYWNvczEwMjQgYWNvcyAtMi4zIC1pbmYgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IGluZgorYWNvczEwMjUgYWNvcyAtMC4wIC1pbmYgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IGluZgorYWNvczEwMjYgYWNvcyAwLjAgLWluZiAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgaW5mCithY29zMTAyNyBhY29zIDIuMyAtaW5mIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiBpbmYKK2Fjb3MxMDI4IGFjb3MgLWluZiAtMi4zIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSBpbmYKK2Fjb3MxMDI5IGFjb3MgLWluZiAtMC4wIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSBpbmYKK2Fjb3MxMDMwIGFjb3MgaW5mIC0yLjMgLT4gMC4wIGluZgorYWNvczEwMzEgYWNvcyBpbmYgLTAuMCAtPiAwLjAgaW5mCithY29zMTAzMiBhY29zIC1pbmYgLWluZiAtPiAyLjM1NjE5NDQ5MDE5MjM0NDggaW5mCithY29zMTAzMyBhY29zIGluZiAtaW5mIC0+IDAuNzg1Mzk4MTYzMzk3NDQ4MjggaW5mCithY29zMTAzNCBhY29zIG5hbiAtMC4wIC0+IG5hbiBuYW4KK2Fjb3MxMDM1IGFjb3MgbmFuIC0yLjMgLT4gbmFuIG5hbgorYWNvczEwMzYgYWNvcyBuYW4gLWluZiAtPiBuYW4gaW5mCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGFjb3NoOiBJbnZlcnNlIGh5cGVyYm9saWMgY29zaW5lIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSB6ZXJvcworYWNvc2gwMDAwIGFjb3NoIDAuMCAwLjAgLT4gMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDAxIGFjb3NoIDAuMCAtMC4wIC0+IDAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAwMDIgYWNvc2ggLTAuMCAwLjAgLT4gMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDAzIGFjb3NoIC0wLjAgLTAuMCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorCistLSBicmFuY2ggcG9pbnRzOiArLy0xCithY29zaDAwMTAgYWNvc2ggMS4wIDAuMCAtPiAwLjAgMC4wCithY29zaDAwMTEgYWNvc2ggMS4wIC0wLjAgLT4gMC4wIC0wLjAKK2Fjb3NoMDAxMiBhY29zaCAtMS4wIDAuMCAtPiAwLjAgMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDAwMTMgYWNvc2ggLTEuMCAtMC4wIC0+IDAuMCAtMy4xNDE1OTI2NTM1ODk3OTMxCisKKy0tIHZhbHVlcyBhbG9uZyBib3RoIHNpZGVzIG9mIHJlYWwgYXhpcworYWNvc2gwMDIwIGFjb3NoIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAgLT4gMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDIxIGFjb3NoIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtMC4wIC0+IDAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAwMjIgYWNvc2ggLTFlLTMwNSAwLjAgLT4gMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDIzIGFjb3NoIC0xZS0zMDUgLTAuMCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDI0IGFjb3NoIC0xZS0xNTAgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDAyNSBhY29zaCAtMWUtMTUwIC0wLjAgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDAyNiBhY29zaCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gMC4wIDEuNTcwNzk2MzI2Nzk0ODk2OAorYWNvc2gwMDI3IGFjb3NoIC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0wLjAgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjgKK2Fjb3NoMDAyOCBhY29zaCAtMC4wMDEgMC4wIC0+IDAuMCAxLjU3MTc5NjMyNjk2MTU2MzQKK2Fjb3NoMDAyOSBhY29zaCAtMC4wMDEgLTAuMCAtPiAwLjAgLTEuNTcxNzk2MzI2OTYxNTYzNAorYWNvc2gwMDMwIGFjb3NoIC0wLjU3ODk5OTk5OTk5OTk5OTk2IDAuMCAtPiAwLjAgMi4xODgyOTc5ODE2MTIwNjY3CithY29zaDAwMzEgYWNvc2ggLTAuNTc4OTk5OTk5OTk5OTk5OTYgLTAuMCAtPiAwLjAgLTIuMTg4Mjk3OTgxNjEyMDY2NworYWNvc2gwMDMyIGFjb3NoIC0wLjk5OTk5OTk5OTk5OTk5OTg5IDAuMCAtPiAwLjAgMy4xNDE1OTI2Mzg2ODg2MzE5CithY29zaDAwMzMgYWNvc2ggLTAuOTk5OTk5OTk5OTk5OTk5ODkgLTAuMCAtPiAwLjAgLTMuMTQxNTkyNjM4Njg4NjMxOQorYWNvc2gwMDM0IGFjb3NoIC0xLjAwMDAwMDAwMDAwMDAwMDIgMC4wIC0+IDIuMTA3MzQyNDI1NTQ0NzAxNGUtMDggMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDAwMzUgYWNvc2ggLTEuMDAwMDAwMDAwMDAwMDAwMiAtMC4wIC0+IDIuMTA3MzQyNDI1NTQ0NzAxNGUtMDggLTMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDM2IGFjb3NoIC0xLjAwMDk5OTk5OTk5OTk5OTkgMC4wIC0+IDAuMDQ0NzE3NjMzNjA4MzA2ODQ5IDMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDM3IGFjb3NoIC0xLjAwMDk5OTk5OTk5OTk5OTkgLTAuMCAtPiAwLjA0NDcxNzYzMzYwODMwNjg0OSAtMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDAwMzggYWNvc2ggLTIuMCAwLjAgLT4gMS4zMTY5NTc4OTY5MjQ4MTY4IDMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDM5IGFjb3NoIC0yLjAgLTAuMCAtPiAxLjMxNjk1Nzg5NjkyNDgxNjggLTMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDQwIGFjb3NoIC0yMy4wIDAuMCAtPiAzLjgyODE2ODQ3MTMzMzEwMTIgMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDAwNDEgYWNvc2ggLTIzLjAgLTAuMCAtPiAzLjgyODE2ODQ3MTMzMzEwMTIgLTMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDQyIGFjb3NoIC0xMDAwMDAwMDAwMDAwMDAwMC4wIDAuMCAtPiAzNy41MzQ1MDg2Njg0NjQ2NzQgMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDAwNDMgYWNvc2ggLTEwMDAwMDAwMDAwMDAwMDAwLjAgLTAuMCAtPiAzNy41MzQ1MDg2Njg0NjQ2NzQgLTMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDQ0IGFjb3NoIC05Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAwLjAgLT4gMzQ2LjA4MDkxMTEyOTY2Njc5IDMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDQ1IGFjb3NoIC05Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtMC4wIC0+IDM0Ni4wODA5MTExMjk2NjY3OSAtMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDAwNDYgYWNvc2ggLTEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IDAuMCAtPiA2ODkuMTY2MDg5OTg1Nzc5NjUgMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDAwNDcgYWNvc2ggLTEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0wLjAgLT4gNjg5LjE2NjA4OTk4NTc3OTY1IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMDA0OCBhY29zaCA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAgLT4gMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDQ5IGFjb3NoIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDA1MCBhY29zaCAxZS0zMDUgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDA1MSBhY29zaCAxZS0zMDUgLTAuMCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDUyIGFjb3NoIDFlLTE1MCAwLjAgLT4gMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDUzIGFjb3NoIDFlLTE1MCAtMC4wIC0+IDAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAwNTQgYWNvc2ggOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDU1IGFjb3NoIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDU2IGFjb3NoIDAuMDAxIDAuMCAtPiAwLjAgMS41Njk3OTYzMjY2MjgyMworYWNvc2gwMDU3IGFjb3NoIDAuMDAxIC0wLjAgLT4gMC4wIC0xLjU2OTc5NjMyNjYyODIzCithY29zaDAwNTggYWNvc2ggMC41Nzg5OTk5OTk5OTk5OTk5NiAwLjAgLT4gMC4wIDAuOTUzMjk0NjcxOTc3NzI2NTUKK2Fjb3NoMDA1OSBhY29zaCAwLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gMC4wIC0wLjk1MzI5NDY3MTk3NzcyNjU1CithY29zaDAwNjAgYWNvc2ggMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAgLT4gMC4wIDEuNDkwMTE2MTE5Mzg0NzY1NmUtMDgKK2Fjb3NoMDA2MSBhY29zaCAwLjk5OTk5OTk5OTk5OTk5OTg5IC0wLjAgLT4gMC4wIC0xLjQ5MDExNjExOTM4NDc2NTZlLTA4CithY29zaDAwNjIgYWNvc2ggMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiAyLjEwNzM0MjQyNTU0NDcwMTRlLTA4IDAuMAorYWNvc2gwMDYzIGFjb3NoIDEuMDAwMDAwMDAwMDAwMDAwMiAtMC4wIC0+IDIuMTA3MzQyNDI1NTQ0NzAxNGUtMDggLTAuMAorYWNvc2gwMDY0IGFjb3NoIDEuMDAwOTk5OTk5OTk5OTk5OSAwLjAgLT4gMC4wNDQ3MTc2MzM2MDgzMDY4NDkgMC4wCithY29zaDAwNjUgYWNvc2ggMS4wMDA5OTk5OTk5OTk5OTk5IC0wLjAgLT4gMC4wNDQ3MTc2MzM2MDgzMDY4NDkgLTAuMAorYWNvc2gwMDY2IGFjb3NoIDIuMCAwLjAgLT4gMS4zMTY5NTc4OTY5MjQ4MTY4IDAuMAorYWNvc2gwMDY3IGFjb3NoIDIuMCAtMC4wIC0+IDEuMzE2OTU3ODk2OTI0ODE2OCAtMC4wCithY29zaDAwNjggYWNvc2ggMjMuMCAwLjAgLT4gMy44MjgxNjg0NzEzMzMxMDEyIDAuMAorYWNvc2gwMDY5IGFjb3NoIDIzLjAgLTAuMCAtPiAzLjgyODE2ODQ3MTMzMzEwMTIgLTAuMAorYWNvc2gwMDcwIGFjb3NoIDEwMDAwMDAwMDAwMDAwMDAwLjAgMC4wIC0+IDM3LjUzNDUwODY2ODQ2NDY3NCAwLjAKK2Fjb3NoMDA3MSBhY29zaCAxMDAwMDAwMDAwMDAwMDAwMC4wIC0wLjAgLT4gMzcuNTM0NTA4NjY4NDY0Njc0IC0wLjAKK2Fjb3NoMDA3MiBhY29zaCA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAwLjAgLT4gMzQ2LjA4MDkxMTEyOTY2Njc5IDAuMAorYWNvc2gwMDczIGFjb3NoIDkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0wLjAgLT4gMzQ2LjA4MDkxMTEyOTY2Njc5IC0wLjAKK2Fjb3NoMDA3NCBhY29zaCAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gNjg5LjE2NjA4OTk4NTc3OTY1IDAuMAorYWNvc2gwMDc1IGFjb3NoIDEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0wLjAgLT4gNjg5LjE2NjA4OTk4NTc3OTY1IC0wLjAKKworLS0gcmFuZG9tIGlucHV0cworYWNvc2gwMTAwIGFjb3NoIC0xLjQzMjg1ODk1ODEyNTA4NDMgLTEuODM3MDM0Nzc3NTU1ODMwOSAtPiAxLjU1MjY5NjI2NDY1NDk1ODcgLTIuMTkwMjUwMTY4NDM1Nzg2CithY29zaDAxMDEgYWNvc2ggLTAuMzEwNzU4MTkxNTYyMjA5NTcgLTEuMDc3MjU1NTc4NjgzOTI5NyAtPiAwLjk1MTM5MTY4Mjg2MTkzNzA5IC0xLjc4MTIyMjgwODk2MzY0NzkKK2Fjb3NoMDEwMiBhY29zaCAtMS45MDQ0Nzc2NTc4MDcwNDUzIC0yMC40ODUzNzAxNTg5MzIxMjQgLT4gMy43MTc3NDExMDg4OTMyMzU5IC0xLjY2MzM4ODg3NDU4NjEyMjcKK2Fjb3NoMDEwMyBhY29zaCAtMC4wNzU2NDI1MDYwMDA4NTg3NDIgLTIxOTY1OTc2MzIwLjg3MzA1MSAtPiAyNC41MDU5MDc3NDI4ODE5OTEgLTEuNTcwNzk2MzI2Nzk4MzQwMgorYWNvc2gwMTA0IGFjb3NoIC0xLjYxNjIyNzExODEwNTYzMDcgLTMuMDM2OTM0MzQ1ODY5NjA5OSAtPiAxLjk0MDcwNTcyNjI4NjEyMjcgLTIuMDQyOTU0OTQ2MTc1MDIwOQorYWNvc2gwMTA1IGFjb3NoIC0wLjMxMDM3ODAyODAyOTgwNjMgMC4wMDAxODA1NDg4MDAxODA3ODk4NyAtPiAwLjAwMDE4OTkyODc3MDU4NzYxNDE2IDEuODg2Mzg2OTk1MDk2NzI4CithY29zaDAxMDYgYWNvc2ggLTkxNTk0Njg3NTEuNTg5NzY1NSA1LjgwMTQ3NDc2NjQyNzM2NDkgLT4gMjMuNjMxMjAxMTk3OTU5MTkzIDMuMTQxNTkyNjUyOTU2NDA3OAorYWNvc2gwMTA3IGFjb3NoIC0wLjAzNzczOTE1NzU1MDkzMzg4NCAwLjIxODQxMzU3NDkzNTEwNzA1IC0+IDAuMjE2ODU4NDQ5NjA2MDI0ODggMS42MDc2NzM1MTMzNDQ5NDAyCithY29zaDAxMDggYWNvc2ggLTgyMjU5OTEuMDUwODM5NDI5NyAwLjI4MzE4NTQzMDA4OTEzNjQ0IC0+IDE2LjYxNTk1NjUyMDQyMDI4NyAzLjE0MTU5MjYxOTE2NDEwMTkKK2Fjb3NoMDEwOSBhY29zaCAtMzUuNjIwMDcwNTAyMzAyNjM5IDAuMzEzMDMyMzcwMDUwMTUgLT4gNC4yNjU4OTgwMDA2OTQzOTY1IDMuMTMyODAxMzI1NTU0MTg3MworYWNvc2gwMTEwIGFjb3NoIDk2LjcyOTkzOTkwNjgyMDkxNyAtMC4wMjkzNDUyMjgzNzIzNjUzMzQgLT4gNS4yNjUwNDM0Nzc1ODYzNTQ4IC0wLjAwMDMwMzM4ODk1ODY2OTcyODQzCithY29zaDAxMTEgYWNvc2ggMC41OTY1NjAyNDAwNzk2NjQ5MSAtMi4wNDEyMjk0NjU0MTYzOTc4IC0+IDEuNDkyMzAwMjAyNDI4NzgzNSAtMS4zMTI1Njg0MjE5MDAzMzgKK2Fjb3NoMDExMiBhY29zaCAxMDkuMjkzODQxMTI2Nzc4MjggLTAuMDAwMTU0NTQ4NjMwNjE1MzM4MTIgLT4gNS4zODcxNjYyOTYxNTQ1NDc3IC0xLjQxNDEyNDUxNTQwNjEyMTRlLTA2CithY29zaDAxMTMgYWNvc2ggOC42NzA1NjUxOTY5MzYxNTk3IC0zLjY3MjM2MzE2NDk3ODc0NjUgLT4gMi45MzM2MTgwOTU4MzYzNTQ1IC0wLjQwMjY3MzYyMDMxODcyODYxCithY29zaDAxMTQgYWNvc2ggMS44MTAxNjQ2NDQ1MDUyNjg2IC0wLjAxMjM0NTEzMjcyMTg1NTQ3OCAtPiAxLjE5OTcxNDg1NjYyODU3NjkgLTAuMDA4MTgxMzkxMjc2MDE1MDI2NQorYWNvc2gwMTE1IGFjb3NoIDUyLjU2ODk3MTk1MDI1Mjg4IDAuMDAxMTEzOTE2MDY1OTg1NDQzIC0+IDQuNjU1MTgyNzYyMjI2NDEzNSAyLjExOTM0NDU4NzIwNDAzMDdlLTA1CithY29zaDAxMTYgYWNvc2ggMC4yODMzNjc4NjE2NDIxNDczOSAzNTU2NDM5OTI0NTcuNDA0ODUgLT4gMjcuMjkwMzQzMjI2ODE2NTI4IDEuNTcwNzk2MzI2Nzk0MDk5OQorYWNvc2gwMTE3IGFjb3NoIDAuNzM4NzY2MjEyOTE5MTE0MzcgMi44ODI4NTk0NTQxMTA0MzIyZS0yMCAtPiA0LjI3NzQ4MjA5NzgxNTkwNjdlLTIwIDAuNzM5NTU4NDU4MzY4Mjc5MjcKK2Fjb3NoMDExOCBhY29zaCAwLjAyNTg2NTQ3MTc4MTcxODg3OCAzNzEyNTc0NjA2NDMxOC40OTIgLT4gMzEuOTM4NDc4OTg5NDE4MDEyIDEuNTcwNzk2MzI2Nzk0ODk1OQorYWNvc2gwMTE5IGFjb3NoIDIuMjA0NzM1MzUxMTc4MDEzMiAwLjA3NDcxMjI0ODE0MzQ4OTI3MSAtPiAxLjQyODY0MDMyNDg2OTgwMjEgMC4wMzc5OTc5MDQ5NzE2MjY1OTgKKworLS0gdmFsdWVzIG5lYXIgaW5maW5pdHkKK2Fjb3NoMDIwMCBhY29zaCA4LjE1NDg1OTI4NzY0Njc3ODVlKzMwNyA5LjA5NDM3NzkzMzU5NTExMjhlKzMwNyAtPiA3MTAuMDg5NDQ2MjA4MDA2MDUgMC44Mzk4MTE2NTQyNTQ3ODk1NAorYWNvc2gwMjAxIGFjb3NoIDEuNDIzNzIyOTY4MDk3MjUzMWUrMzA4IC0xLjAzMzY5NjY2MTc4NzQ4NThlKzMwOCAtPiA3MTAuNDU0MzMzMTA5NDc1OSAtMC42Mjc5OTcyODc2MzQ4NzU1CithY29zaDAyMDIgYWNvc2ggLTEuNTAxNDUyNjg5OTczODkzOWUrMzA4IDEuNTY3MDcwMDM3ODQ0ODc5MmUrMzA4IC0+IDcxMC42NjQyMDcwNjc5NTQ2NCAyLjMzNDgxMzcyOTkxMDY2OTcKK2Fjb3NoMDIwMyBhY29zaCAtMS4wOTM5MDQwMzc1MjEzOTI4ZSszMDggLTEuMDQxNjk2MDM1MTEyNzk3OGUrMzA4IC0+IDcxMC4zMDE4Mjg2MzExNTg4NiAtMi4zODA2MzYxNDc3ODcwMjcKK2Fjb3NoMDIwNCBhY29zaCAwLjAgMS40NzYwNjI0MzM1NTk1ODhlKzMwOCAtPiA3MTAuMjc4NzMzODQ3MTY5MjkgMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAyMDUgYWNvc2ggLTAuMCA2LjIwNzcyMTAzMjYyMjEwOTRlKzMwNyAtPiA3MDkuNDEyNTY0NTc0ODQ3NjkgMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAyMDYgYWNvc2ggMC4wIC0xLjU2MjE4OTk5MDk5NjgzMDhlKzMwOCAtPiA3MTAuMzM1NDQ0NDk5OTA3MzQgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjA3IGFjb3NoIC0wLjAgLTguMzU1NjYyNDgzMzgzOTEyMmUrMzA3IC0+IDcwOS43MDk3MTAxODA0ODMxNyAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAyMDggYWNvc2ggMS4zMDY3MDc5NzUyNDk5MzQyZSszMDggMC4wIC0+IDcxMC4xNTY4NjY4MDEwNzIyOCAwLjAKK2Fjb3NoMDIwOSBhY29zaCAxLjU2NTM2NDAzNDAyMTQwMjZlKzMwOCAtMC4wIC0+IDcxMC4zMzc0NzQyMjkyNjcwNiAtMC4wCithY29zaDAyMTAgYWNvc2ggLTYuOTAxMTM3NTk5MjI5MDYzNmUrMzA3IDAuMCAtPiA3MDkuNTE4NDU2OTk3MTk5MjIgMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDAyMTEgYWNvc2ggLTkuOTUzOTU3NjgwOTkyNjk3M2UrMzA3IC0wLjAgLT4gNzA5Ljg4NDc0MDk1ODcwMTg1IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMDIxMiBhY29zaCA3LjY0NDk1OTg1MTg5MTQ5MjVlKzMwNyA5LjU3MDY1NDA3NjgyNjgzNTggLT4gNzA5LjYyMDgxNzMxNzU0ODAyIDEuMjUxODkwNjkxNjc2OTM0NWUtMzA3CithY29zaDAyMTMgYWNvc2ggNS40MzI1NDEwOTcyNjAyMTk3ZSszMDcgLTcuODA2NDgwNzgxNjUyMjcwNiAtPiA3MDkuMjc5MTc3NzI3OTI1IC0xLjQzNjk4NTEzMTI0NzE5NzRlLTMwNworYWNvc2gwMjE0IGFjb3NoIC0xLjE1MjM2MjYxMTIzNjA0NjVlKzMwOCA3LjA2MTc1MTAwMzg4NjkzMzYgLT4gNzEwLjAzMTE3MDEwMjE2OTA5IDMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMjE1IGFjb3NoIC0xLjE2ODUwMjc3ODY4NjI1OTllKzMwOCAtNS4xNTY4NTU4MzU3OTI1NjI1IC0+IDcxMC4wNDUwNzkwNzU3MTQxNyAtMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDAyMTYgYWNvc2ggMy4wMjM2MzcwMzM5Nzg4NzIxIDEuNzUwMzI0ODcyMDA5NjQxN2UrMzA4IC0+IDcxMC40NDkxNTcyMzQ1ODA2NCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDIxNyBhY29zaCA2LjYxMDgwMDc5MjYwMzExNDkgLTkuMTQ2OTk2ODIyNTgwNjE0OWUrMzA3IC0+IDcwOS44MDAxOTYzMzkwMzMyOCAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAyMTggYWNvc2ggLTUuMTA5NjI2MjkwNTYyMzk1OSA2LjQ0ODQ5MjY3ODU0MTIzOTVlKzMwNyAtPiA3MDkuNDUwNjE3MTM5OTc5NzMgMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAyMTkgYWNvc2ggLTIuODA4MDkyMDYwODczNTg0NiAtMS43NzE2MTE4ODM2NTE5MzY4ZSszMDggLT4gNzEwLjQ2MTI0NTYyMzYzNDQ1IC0xLjU3MDc5NjMyNjc5NDg5NjYKKworLS0gdmFsdWVzIG5lYXIgMAorYWNvc2gwMjIwIGFjb3NoIDQuNTU2MDUzMDMyNjY5OTMwNGUtMzE3IDcuMzA0ODk4OTEyMTQzNjY1N2UtMzE4IC0+IDcuMzA0ODk4OTEyMTQzNjY1N2UtMzE4IDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjIxIGFjb3NoIDQuODc1NDI3NDEzMzU4NTMzMWUtMzE0IC05Ljg0Njk3OTQ4OTc2ODQxOTllLTMxNSAtPiA5Ljg0Njk3OTQ4OTc2ODQxOTllLTMxNSAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAyMjIgYWNvc2ggLTQuNjc0ODg3NjAwOTk2MDA5N2UtMzEyIDkuNzkwMDM0Mjg4NzU1NzYwNmUtMzE4IC0+IDkuNzkwMDM0Mjg4NzU1NzYwNmUtMzE4IDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjIzIGFjb3NoIC00LjMxMzY4NzE1MzgzOTkyMzZlLTMyMCAtNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjMgLT4gNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjMgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjI0IGFjb3NoIDAuMCA0LjM0MzEwMTM4NjY0OTY3NzRlLTMxNCAtPiA0LjM0MzEwMTM4NjY0OTY3NzRlLTMxNCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDIyNSBhY29zaCAtMC4wIDYuMDE0NzMzNDMzNTgyOTE4NGUtMzE3IC0+IDYuMDE0NzMzNDMzNTgyOTE4NGUtMzE3IDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjI2IGFjb3NoIDAuMCAtMS4yODgwMjkxMzg3MDgxMjk3ZS0zMjAgLT4gMS4yODgwMjkxMzg3MDgxMjk3ZS0zMjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjI3IGFjb3NoIC0wLjAgLTEuNDQwMTU2Mzk3NjUzNDYyMWUtMzE3IC0+IDEuNDQwMTU2Mzk3NjUzNDYyMWUtMzE3IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDIyOCBhY29zaCAxLjM2ODk2ODA1NzA4NjMwOTFlLTMxMyAwLjAgLT4gMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjI5IGFjb3NoIDEuNTMwNDM0Njg5MzQ5NDM3MWUtMzEyIC0wLjAgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDIzMCBhY29zaCAtMy43NDUwMTc1OTU0NzY2NDg4ZS0zMjAgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDIzMSBhY29zaCAtOC40MjUwNTYzMDgwODg1ODAxZS0zMTEgLTAuMCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorCistLSBzcGVjaWFsIHZhbHVlcworYWNvc2gxMDAwIGFjb3NoIDAuMCAwLjAgLT4gMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gxMDAxIGFjb3NoIC0wLjAgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMTAwMiBhY29zaCAwLjAgaW5mIC0+IGluZiAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMTAwMyBhY29zaCAyLjMgaW5mIC0+IGluZiAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMTAwNCBhY29zaCAtMC4wIGluZiAtPiBpbmYgMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDEwMDUgYWNvc2ggLTIuMyBpbmYgLT4gaW5mIDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gxMDA2IGFjb3NoIDAuMCBuYW4gLT4gbmFuIG5hbgorYWNvc2gxMDA3IGFjb3NoIDIuMyBuYW4gLT4gbmFuIG5hbgorYWNvc2gxMDA4IGFjb3NoIC0wLjAgbmFuIC0+IG5hbiBuYW4KK2Fjb3NoMTAwOSBhY29zaCAtMi4zIG5hbiAtPiBuYW4gbmFuCithY29zaDEwMTAgYWNvc2ggLWluZiAwLjAgLT4gaW5mIDMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gxMDExIGFjb3NoIC1pbmYgMi4zIC0+IGluZiAzLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMTAxMiBhY29zaCBpbmYgMC4wIC0+IGluZiAwLjAKK2Fjb3NoMTAxMyBhY29zaCBpbmYgMi4zIC0+IGluZiAwLjAKK2Fjb3NoMTAxNCBhY29zaCAtaW5mIGluZiAtPiBpbmYgMi4zNTYxOTQ0OTAxOTIzNDQ4CithY29zaDEwMTUgYWNvc2ggaW5mIGluZiAtPiBpbmYgMC43ODUzOTgxNjMzOTc0NDgyOAorYWNvc2gxMDE2IGFjb3NoIGluZiBuYW4gLT4gaW5mIG5hbgorYWNvc2gxMDE3IGFjb3NoIC1pbmYgbmFuIC0+IGluZiBuYW4KK2Fjb3NoMTAxOCBhY29zaCBuYW4gMC4wIC0+IG5hbiBuYW4KK2Fjb3NoMTAxOSBhY29zaCBuYW4gMi4zIC0+IG5hbiBuYW4KK2Fjb3NoMTAyMCBhY29zaCBuYW4gaW5mIC0+IGluZiBuYW4KK2Fjb3NoMTAyMSBhY29zaCBuYW4gbmFuIC0+IG5hbiBuYW4KK2Fjb3NoMTAyMiBhY29zaCAwLjAgLTAuMCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gxMDIzIGFjb3NoIC0wLjAgLTAuMCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gxMDI0IGFjb3NoIDAuMCAtaW5mIC0+IGluZiAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDEwMjUgYWNvc2ggMi4zIC1pbmYgLT4gaW5mIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMTAyNiBhY29zaCAtMC4wIC1pbmYgLT4gaW5mIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMTAyNyBhY29zaCAtMi4zIC1pbmYgLT4gaW5mIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMTAyOCBhY29zaCAtaW5mIC0wLjAgLT4gaW5mIC0zLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMTAyOSBhY29zaCAtaW5mIC0yLjMgLT4gaW5mIC0zLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMTAzMCBhY29zaCBpbmYgLTAuMCAtPiBpbmYgLTAuMAorYWNvc2gxMDMxIGFjb3NoIGluZiAtMi4zIC0+IGluZiAtMC4wCithY29zaDEwMzIgYWNvc2ggLWluZiAtaW5mIC0+IGluZiAtMi4zNTYxOTQ0OTAxOTIzNDQ4CithY29zaDEwMzMgYWNvc2ggaW5mIC1pbmYgLT4gaW5mIC0wLjc4NTM5ODE2MzM5NzQ0ODI4CithY29zaDEwMzQgYWNvc2ggbmFuIC0wLjAgLT4gbmFuIG5hbgorYWNvc2gxMDM1IGFjb3NoIG5hbiAtMi4zIC0+IG5hbiBuYW4KK2Fjb3NoMTAzNiBhY29zaCBuYW4gLWluZiAtPiBpbmYgbmFuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBhc2luOiBJbnZlcnNlIHNpbmUgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSB6ZXJvcworYXNpbjAwMDAgYXNpbiAwLjAgMC4wIC0+IDAuMCAwLjAKK2FzaW4wMDAxIGFzaW4gMC4wIC0wLjAgLT4gMC4wIC0wLjAKK2FzaW4wMDAyIGFzaW4gLTAuMCAwLjAgLT4gLTAuMCAwLjAKK2FzaW4wMDAzIGFzaW4gLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorCistLSBicmFuY2ggcG9pbnRzOiArLy0xCithc2luMDAxMCBhc2luIDEuMCAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXNpbjAwMTEgYXNpbiAxLjAgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorYXNpbjAwMTIgYXNpbiAtMS4wIDAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXNpbjAwMTMgYXNpbiAtMS4wIC0wLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCisKKy0tIHZhbHVlcyBhbG9uZyBib3RoIHNpZGVzIG9mIHJlYWwgYXhpcworYXNpbjAwMjAgYXNpbiAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wIC0+IC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAKK2FzaW4wMDIxIGFzaW4gLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAgLT4gLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAKK2FzaW4wMDIyIGFzaW4gLTFlLTMwNSAwLjAgLT4gLTFlLTMwNSAwLjAKK2FzaW4wMDIzIGFzaW4gLTFlLTMwNSAtMC4wIC0+IC0xZS0zMDUgLTAuMAorYXNpbjAwMjQgYXNpbiAtMWUtMTUwIDAuMCAtPiAtMWUtMTUwIDAuMAorYXNpbjAwMjUgYXNpbiAtMWUtMTUwIC0wLjAgLT4gLTFlLTE1MCAtMC4wCithc2luMDAyNiBhc2luIC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IDAuMCAtPiAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAKK2FzaW4wMDI3IGFzaW4gLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMCAtPiAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMC4wCithc2luMDAyOCBhc2luIC0wLjAwMSAwLjAgLT4gLTAuMDAxMDAwMDAwMTY2NjY2NzQxNiAwLjAKK2FzaW4wMDI5IGFzaW4gLTAuMDAxIC0wLjAgLT4gLTAuMDAxMDAwMDAwMTY2NjY2NzQxNiAtMC4wCithc2luMDAzMCBhc2luIC0wLjU3ODk5OTk5OTk5OTk5OTk2IDAuMCAtPiAtMC42MTc1MDE2NTQ4MTcxNzAwMSAwLjAKK2FzaW4wMDMxIGFzaW4gLTAuNTc4OTk5OTk5OTk5OTk5OTYgLTAuMCAtPiAtMC42MTc1MDE2NTQ4MTcxNzAwMSAtMC4wCithc2luMDAzMiBhc2luIC0wLjk5OTk5OTk5OTk5OTk5OTg5IDAuMCAtPiAtMS41NzA3OTYzMTE4OTM3MzU0IDAuMAorYXNpbjAwMzMgYXNpbiAtMC45OTk5OTk5OTk5OTk5OTk4OSAtMC4wIC0+IC0xLjU3MDc5NjMxMTg5MzczNTQgLTAuMAorYXNpbjAwMzQgYXNpbiAtMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDIuMTA3MzQyNDI1NTQ0NzAxNGUtMDgKK2FzaW4wMDM1IGFzaW4gLTEuMDAwMDAwMDAwMDAwMDAwMiAtMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTIuMTA3MzQyNDI1NTQ0NzAxNGUtMDgKK2FzaW4wMDM2IGFzaW4gLTEuMDAwOTk5OTk5OTk5OTk5OSAwLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAwLjA0NDcxNzYzMzYwODMwNjg0OQorYXNpbjAwMzcgYXNpbiAtMS4wMDA5OTk5OTk5OTk5OTk5IC0wLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wNDQ3MTc2MzM2MDgzMDY4NDkKK2FzaW4wMDM4IGFzaW4gLTIuMCAwLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAxLjMxNjk1Nzg5NjkyNDgxNjgKK2FzaW4wMDM5IGFzaW4gLTIuMCAtMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTEuMzE2OTU3ODk2OTI0ODE2OAorYXNpbjAwNDAgYXNpbiAtMjMuMCAwLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAzLjgyODE2ODQ3MTMzMzEwMTIKK2FzaW4wMDQxIGFzaW4gLTIzLjAgLTAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC0zLjgyODE2ODQ3MTMzMzEwMTIKK2FzaW4wMDQyIGFzaW4gLTEwMDAwMDAwMDAwMDAwMDAwLjAgMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgMzcuNTM0NTA4NjY4NDY0Njc0Cithc2luMDA0MyBhc2luIC0xMDAwMDAwMDAwMDAwMDAwMC4wIC0wLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMzcuNTM0NTA4NjY4NDY0Njc0Cithc2luMDA0NCBhc2luIC05Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAwLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAzNDYuMDgwOTExMTI5NjY2NzkKK2FzaW4wMDQ1IGFzaW4gLTkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0wLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMzQ2LjA4MDkxMTEyOTY2Njc5Cithc2luMDA0NiBhc2luIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiA2ODkuMTY2MDg5OTg1Nzc5NjUKK2FzaW4wMDQ3IGFzaW4gLTEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0wLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtNjg5LjE2NjA4OTk4NTc3OTY1Cithc2luMDA0OCBhc2luIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IDAuMCAtPiA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAKK2FzaW4wMDQ5IGFzaW4gOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMCAtPiA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtMC4wCithc2luMDA1MCBhc2luIDFlLTMwNSAwLjAgLT4gMWUtMzA1IDAuMAorYXNpbjAwNTEgYXNpbiAxZS0zMDUgLTAuMCAtPiAxZS0zMDUgLTAuMAorYXNpbjAwNTIgYXNpbiAxZS0xNTAgMC4wIC0+IDFlLTE1MCAwLjAKK2FzaW4wMDUzIGFzaW4gMWUtMTUwIC0wLjAgLT4gMWUtMTUwIC0wLjAKK2FzaW4wMDU0IGFzaW4gOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAKK2FzaW4wMDU1IGFzaW4gOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMC4wIC0+IDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMAorYXNpbjAwNTYgYXNpbiAwLjAwMSAwLjAgLT4gMC4wMDEwMDAwMDAxNjY2NjY3NDE2IDAuMAorYXNpbjAwNTcgYXNpbiAwLjAwMSAtMC4wIC0+IDAuMDAxMDAwMDAwMTY2NjY2NzQxNiAtMC4wCithc2luMDA1OCBhc2luIDAuNTc4OTk5OTk5OTk5OTk5OTYgMC4wIC0+IDAuNjE3NTAxNjU0ODE3MTcwMDEgMC4wCithc2luMDA1OSBhc2luIDAuNTc4OTk5OTk5OTk5OTk5OTYgLTAuMCAtPiAwLjYxNzUwMTY1NDgxNzE3MDAxIC0wLjAKK2FzaW4wMDYwIGFzaW4gMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAgLT4gMS41NzA3OTYzMTE4OTM3MzU0IDAuMAorYXNpbjAwNjEgYXNpbiAwLjk5OTk5OTk5OTk5OTk5OTg5IC0wLjAgLT4gMS41NzA3OTYzMTE4OTM3MzU0IC0wLjAKK2FzaW4wMDYyIGFzaW4gMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMi4xMDczNDI0MjU1NDQ3MDE0ZS0wOAorYXNpbjAwNjMgYXNpbiAxLjAwMDAwMDAwMDAwMDAwMDIgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTIuMTA3MzQyNDI1NTQ0NzAxNGUtMDgKK2FzaW4wMDY0IGFzaW4gMS4wMDA5OTk5OTk5OTk5OTk5IDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wNDQ3MTc2MzM2MDgzMDY4NDkKK2FzaW4wMDY1IGFzaW4gMS4wMDA5OTk5OTk5OTk5OTk5IC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjA0NDcxNzYzMzYwODMwNjg0OQorYXNpbjAwNjYgYXNpbiAyLjAgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAxLjMxNjk1Nzg5NjkyNDgxNjgKK2FzaW4wMDY3IGFzaW4gMi4wIC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0xLjMxNjk1Nzg5NjkyNDgxNjgKK2FzaW4wMDY4IGFzaW4gMjMuMCAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDMuODI4MTY4NDcxMzMzMTAxMgorYXNpbjAwNjkgYXNpbiAyMy4wIC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0zLjgyODE2ODQ3MTMzMzEwMTIKK2FzaW4wMDcwIGFzaW4gMTAwMDAwMDAwMDAwMDAwMDAuMCAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDM3LjUzNDUwODY2ODQ2NDY3NAorYXNpbjAwNzEgYXNpbiAxMDAwMDAwMDAwMDAwMDAwMC4wIC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0zNy41MzQ1MDg2Njg0NjQ2NzQKK2FzaW4wMDcyIGFzaW4gOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAzNDYuMDgwOTExMTI5NjY2NzkKK2FzaW4wMDczIGFzaW4gOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTM0Ni4wODA5MTExMjk2NjY3OQorYXNpbjAwNzQgYXNpbiAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDY4OS4xNjYwODk5ODU3Nzk2NQorYXNpbjAwNzUgYXNpbiAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtNjg5LjE2NjA4OTk4NTc3OTY1CisKKy0tIHJhbmRvbSBpbnB1dHMKK2FzaW4wMTAwIGFzaW4gLTEuNTk3OTU1NTgzNTA4NjA4MyAtMC4xNTAwMzAwOTgxNDU5NTI0NyAtPiAtMS40NTE1MzY5NTU3NDA1Nzg4IC0xLjA1NDQ0NzYzOTk3OTA4MjMKK2FzaW4wMTAxIGFzaW4gLTAuNTc0ODgyMjU4OTUzMTc2NzkgLTkuNjA4MDM5NzgzODk1Mjc0M2UtMTMgLT4gLTAuNjEyNDYwMjQ0NjA0MTI4NTEgLTEuMTc0MjM4MDA1NDAwNDAzZS0xMgorYXNpbjAxMDIgYXNpbiAtMy42NTA4MDg3OTMwNTE2MjQ5IC0wLjM2MDI3NTI3MDkzMjIwMTUyIC0+IC0xLjQ2ODU4OTA2MDUzMDU4NzQgLTEuOTc0MjI3MzAwNzE1MjAzOAorYXNpbjAxMDMgYXNpbiAtMS41MjM4NjU5NzkyMzI2ODE5IC0xLjEzNjA4MTM1MTY5OTYzNjQgLT4gLTAuODYwODAwNTE2OTExNDcyNzUgLTEuMzIyMzc0MjIwNTY4OTE5NQorYXNpbjAxMDQgYXNpbiAtMTU5Mi4wNjM5MDQ1NTU1MzA2IC0wLjcyMzYyNDI3OTM1MDE4MjM2IC0+IC0xLjU3MDM0MTgwNzExNzUxNzkgLTguMDY1OTMzNjkxODcyOTIyOAorYXNpbjAxMDUgYXNpbiAtMC4xOTgzNTQ3MTM3MTMxMjAxOSA0LjIxMzE1MDg0MTY2OTc3MDkgLT4gLTAuMDQ1Nzc3ODMxMDE5OTM1MTQ5IDIuMTQ2MTczMjc1MTkzMzE3MQorYXNpbjAxMDYgYXNpbiAtMS45MTg0NzEwNTQ0MzAyMTMgMC40MDYwMzMwNTA3OTc3OTIzNCAtPiAtMS4zMzAxMzk2NTg1NzkxNTU2IDEuMzAyNjM2NDIzMTQ5ODEKK2FzaW4wMTA3IGFzaW4gLTI1NDQ5NS4wMTYyMzM3MzY0MiAwLjcxMDg0NDE0NDM0NDcwODIyIC0+IC0xLjU3MDc5MzUzMzYzOTQzNTkgMTMuMTQwMTgzNzEyNzYyMzIxCithc2luMDEwOCBhc2luIC0wLjMxMzE1ODgyNzE1NjkxMTU3IDMuOTY0Nzk5NDI4ODQyOTg2NiAtPiAtMC4wNzY0NTA0MDM4NDA5MTYwMDQgMi4wODg5NzYyMTM4NzEzNDU3Cithc2luMDEwOSBhc2luIC0wLjkwMDE3MDY0Mjg0NzIwODE2IDEuMjUzMDY1OTQ4NTkwNzEwNSAtPiAtMC41MzQ2NjUwOTc0MTk0MzQ0NyAxLjE3MDI4MTE1NTc1NzcKK2FzaW4wMTEwIGFzaW4gMi4xNjE1MTgxNjk2NTcxMDc1IC0wLjE0MDU4NjQ3NDg4MjI5NTIzIC0+IDEuNDk3NjE2NjMyMzg5Njg3MSAtMS40MDg1ODExMDM5MzM0NjA0Cithc2luMDExMSBhc2luIDEuMjEwNDc0OTIxMDcwNzc5NSAtMC44NTczMjQ4NDQ4NTI5ODk5OSAtPiAwLjgzOTEzMDcxNTg4MzQzOTI0IC0xLjA2ODE3MTkyNTA1MjU5MDEKK2FzaW4wMTEyIGFzaW4gMS43MDU5NzMzMTg1MTI4ODkxIC0wLjg0MDMyOTY2MzczMTU2NTgxIC0+IDEuMDUxMDkwMDgxNTgxNjIyOSAtMS4yOTY3OTc5NzkxMzYxNjUyCithc2luMDExMyBhc2luIDkuOTEzNzA4NTAxNzI5MDY4NyAtMS40NjA4MzgzOTcwMjUwODkzIC0+IDEuNDIzNzcwNDgyMDEyODg5MSAtMi45OTU0MTQ2Nzc1NjA2ODYKK2FzaW4wMTE0IGFzaW4gMTE3LjEyMzQ0NzUxMDQxNDk1IC01NDUzOTA4MDkxLjUzMzQwMTUgLT4gMi4xNDc1MTQxNDExMzkyMDEyZS0wOCAtMjMuMTEyNzQ1NDUwMjE3MDY2Cithc2luMDExNSBhc2luIDAuMDgxMDQxMTg3Nzk4MDI5MjI3IDAuMDY3MDU0MzQ5ODYwMTczMTk2IC0+IDAuMDgwOTQ2Nzg2ODU2NzcxODEzIDAuMDY3MjIzOTkxMDYwNjM5Njk4Cithc2luMDExNiBhc2luIDQ2LjYzNTQ3MjMyMjA0OTk0OSAyLjM4MzUxOTA3MTgwNTY2NzggLT4gMS41MTk3MTk0OTQwMDEwNzc5IDQuNTM2Njk4OTYwMDk3MjA4MworYXNpbjAxMTcgYXNpbiAzOTA3LjA2ODc5NjExMjcxMDUgMTkuMTQ0MDIxODg2MzkwMTgxIC0+IDEuNTY1ODk2NTIzMzA4MzIzNSA4Ljk2MzcwMTg3MTU5MjQyMTcKK2FzaW4wMTE4IGFzaW4gMS4wODg5MzEyMzIyMzA4MjczIDUwOS4wMTU3Nzg4MzU1NDc2OCAtPiAwLjAwMjEzOTI4MDM4MTc4MjkzMTYgNi45MjU2Mjk0NDk0NTI0NzA2Cithc2luMDExOSBhc2luIDAuMTA4NTE1MTgyNzc1MDkyMjQgMS41NjEyNTEwOTA4MjE3NDc2IC0+IDAuMDU4NDkxMDE0MjQzOTAyNjIxIDEuMjI5NzA3NTcyNTYyMTMyNworCistLSB2YWx1ZXMgbmVhciBpbmZpbml0eQorYXNpbjAyMDAgYXNpbiAxLjUyMzAyNDE5OTg4MjE0OTllKzMwOCA1LjU3MDcyMjg5OTQwODQ1MjVlKzMwNyAtPiAxLjIyMDE0NDYzNzA4OTIwNjggNzEwLjM3MjgzNDg2NTM1OTY2Cithc2luMDIwMSBhc2luIDguMTMzNDMxNzY5ODY3MjIwNGUrMzA3IC05LjIyNDk0MjUxOTc4NzI0NTFlKzMwNyAtPiAwLjcyMjU5OTkxMjg0MDIwMDQyIC03MTAuMDk2MjQ1MzA0OTAyNgorYXNpbjAyMDIgYXNpbiAtOS45MTM4NTA2NjU5MjQxNzY4ZSszMDcgNi43MDE1NDQ1MjY0MzQ5OTVlKzMwNyAtPiAtMC45NzYzNzUxMTc0MjE5NDU5NCA3MTAuMDY4ODc0ODY2NzEzNzEKK2FzaW4wMjAzIGFzaW4gLTEuNDE0MTI5ODg2ODE3Mzg0MmUrMzA4IC01LjQwMTUwNTEzNDUxNDE5MWUrMzA3IC0+IC0xLjIwNTkzMTkwNTUxNjA1ODcgLTcxMC4zMDM5NjQ3ODk1NDYyOAorYXNpbjAyMDQgYXNpbiAwLjAgOS4xNjE4MDkyOTc3ODk3NDMxZSszMDcgLT4gMC4wIDcwOS44MDE4MTQ0MTA1MDU5MworYXNpbjAyMDUgYXNpbiAtMC4wIDYuODA2NDM0MjU1MTkzOTc1NWUrMzA3IC0+IC0wLjAgNzA5LjUwNDYzOTEwODUzNDg5Cithc2luMDIwNiBhc2luIDAuMCAtNi40OTk3NTE2NDU0Nzk4MjE1ZSszMDcgLT4gMC4wIC03MDkuNDU4NTM0Njk3NTE1OTIKK2FzaW4wMjA3IGFzaW4gLTAuMCAtMS42NzY3NDQ5MDUzMzQ1MjQyZSszMDggLT4gLTAuMCAtNzEwLjQwNjIxMDE4MDMwMjIKK2FzaW4wMjA4IGFzaW4gNS40MjQyNzQ5OTU3Mzc4OTE2ZSszMDcgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiA3MDkuMjc3NjU0OTc4ODg5MDIKK2FzaW4wMjA5IGFzaW4gOS41MzQyMTQ1MTIxMTY0NzQ5ZSszMDcgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTcwOS44NDE2NTc1ODU5NTkwNworYXNpbjAyMTAgYXNpbiAtNy4wNDQ1Njk4MDA2MjAxODQ3ZSszMDcgMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgNzA5LjUzOTAyNzgwODcyMTM2Cithc2luMDIxMSBhc2luIC0xLjAwMTYwMjU1Njk3Njk3MDZlKzMwOCAtMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTcwOS44OTA5NTcwOTY5Nzg4MQorYXNpbjAyMTIgYXNpbiAxLjY1NTIyMDM3Nzg4NzcyMDRlKzMwOCAwLjQ4NzYxNTQzMzM2MjQ5NDkxIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiA3MTAuMzkzMjg5OTgxNTM0NzQKK2FzaW4wMjEzIGFzaW4gMS4yNDg1NzEyODMwMzg0ODY5ZSszMDggLTQuMzQ4OTMxMTE2MTI3ODg5OSAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTcxMC4xMTEzNTU3NDY3Nzg2Cithc2luMDIxNCBhc2luIC0xLjUxMTc4NDI4MTMzNTMxMjVlKzMwOCA1LjEyMzQ1MjY2NjEwMjQzNCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDcxMC4zMDI2NDY0MTkyMzAzMQorYXNpbjAyMTUgYXNpbiAtMS4zMTY3NjM0MzEzMDA4MDE2ZSszMDggLTAuNTI5Mzk2Nzk3OTM1Mjg5ODIgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtNzEwLjE2NDUzMjYwMjM5NzY4Cithc2luMDIxNiBhc2luIDAuODA4NDM5MjkxNzY5ODU5MDcgMS4wMTUwODUxODI3NzY3ODc2ZSszMDggLT4gNy45NjQyNTA3Mzk2MTEzODc1ZS0zMDkgNzA5LjkwNDMyODM1NTYxNjM3Cithc2luMDIxNyBhc2luIDguMjU0NDgwOTgyOTY4MDkwMSAtMS43NDIzNTQ4MTQwNTM5NDc0ZSszMDggLT4gNC43Mzc1NDMwNzQ2ODY1NzMzZS0zMDggLTcxMC40NDQ1OTMzNjI0MjE2NAorYXNpbjAyMTggYXNpbiAtNS4yNDk5MDAwMTE4ODI0Mjk1IDQuNjY1NTU3ODk3NzUxMjIxNGUrMzA3IC0+IC0xLjEyNTI0NTkyNDkxMTMyOTJlLTMwNyA3MDkuMTI2OTc4MTQ5MTEwMworYXNpbjAyMTkgYXNpbiAtNS45OTA0NzgyNzYwODMzNDMzIC00LjczMTU2ODkzMTQ3ODExNjNlKzMwNyAtPiAtMS4yNjYwNjU5NDE5Mzk0NjM3ZS0zMDcgLTcwOS4xNDEwMjc1NzUyMjMxMgorCistLSBzcGVjaWFsIHZhbHVlcworYXNpbjEwMDAgYXNpbiAtMC4wIDAuMCAtPiAtMC4wIDAuMAorYXNpbjEwMDEgYXNpbiAwLjAgMC4wIC0+IDAuMCAwLjAKK2FzaW4xMDAyIGFzaW4gLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorYXNpbjEwMDMgYXNpbiAwLjAgLTAuMCAtPiAwLjAgLTAuMAorYXNpbjEwMDQgYXNpbiAtaW5mIDAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IGluZgorYXNpbjEwMDUgYXNpbiAtaW5mIDIuMjk5OTk5OTk5OTk5OTk5OCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IGluZgorYXNpbjEwMDYgYXNpbiBuYW4gMC4wIC0+IG5hbiBuYW4KK2FzaW4xMDA3IGFzaW4gbmFuIDIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuCithc2luMTAwOCBhc2luIC0wLjAgaW5mIC0+IC0wLjAgaW5mCithc2luMTAwOSBhc2luIC0yLjI5OTk5OTk5OTk5OTk5OTggaW5mIC0+IC0wLjAgaW5mCithc2luMTAxMCBhc2luIC1pbmYgaW5mIC0+IC0wLjc4NTM5ODE2MzM5NzQ0ODI4IGluZgorYXNpbjEwMTEgYXNpbiBuYW4gaW5mIC0+IG5hbiBpbmYKK2FzaW4xMDEyIGFzaW4gLTAuMCBuYW4gLT4gLTAuMCBuYW4KK2FzaW4xMDEzIGFzaW4gLTIuMjk5OTk5OTk5OTk5OTk5OCBuYW4gLT4gbmFuIG5hbgorYXNpbjEwMTQgYXNpbiAtaW5mIG5hbiAtPiBuYW4gaW5mIGlnbm9yZS1pbWFnLXNpZ24KK2FzaW4xMDE1IGFzaW4gbmFuIG5hbiAtPiBuYW4gbmFuCithc2luMTAxNiBhc2luIGluZiAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IGluZgorYXNpbjEwMTcgYXNpbiBpbmYgMi4yOTk5OTk5OTk5OTk5OTk4IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiBpbmYKK2FzaW4xMDE4IGFzaW4gMC4wIGluZiAtPiAwLjAgaW5mCithc2luMTAxOSBhc2luIDIuMjk5OTk5OTk5OTk5OTk5OCBpbmYgLT4gMC4wIGluZgorYXNpbjEwMjAgYXNpbiBpbmYgaW5mIC0+IDAuNzg1Mzk4MTYzMzk3NDQ4MjggaW5mCithc2luMTAyMSBhc2luIDAuMCBuYW4gLT4gMC4wIG5hbgorYXNpbjEwMjIgYXNpbiAyLjI5OTk5OTk5OTk5OTk5OTggbmFuIC0+IG5hbiBuYW4KK2FzaW4xMDIzIGFzaW4gaW5mIG5hbiAtPiBuYW4gaW5mIGlnbm9yZS1pbWFnLXNpZ24KK2FzaW4xMDI0IGFzaW4gaW5mIC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC1pbmYKK2FzaW4xMDI1IGFzaW4gaW5mIC0yLjI5OTk5OTk5OTk5OTk5OTggLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC1pbmYKK2FzaW4xMDI2IGFzaW4gbmFuIC0wLjAgLT4gbmFuIG5hbgorYXNpbjEwMjcgYXNpbiBuYW4gLTIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuCithc2luMTAyOCBhc2luIDAuMCAtaW5mIC0+IDAuMCAtaW5mCithc2luMTAyOSBhc2luIDIuMjk5OTk5OTk5OTk5OTk5OCAtaW5mIC0+IDAuMCAtaW5mCithc2luMTAzMCBhc2luIGluZiAtaW5mIC0+IDAuNzg1Mzk4MTYzMzk3NDQ4MjggLWluZgorYXNpbjEwMzEgYXNpbiBuYW4gLWluZiAtPiBuYW4gLWluZgorYXNpbjEwMzIgYXNpbiAtaW5mIC0wLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtaW5mCithc2luMTAzMyBhc2luIC1pbmYgLTIuMjk5OTk5OTk5OTk5OTk5OCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC1pbmYKK2FzaW4xMDM0IGFzaW4gLTAuMCAtaW5mIC0+IC0wLjAgLWluZgorYXNpbjEwMzUgYXNpbiAtMi4yOTk5OTk5OTk5OTk5OTk4IC1pbmYgLT4gLTAuMCAtaW5mCithc2luMTAzNiBhc2luIC1pbmYgLWluZiAtPiAtMC43ODUzOTgxNjMzOTc0NDgyOCAtaW5mCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBhc2luaDogSW52ZXJzZSBoeXBlcmJvbGljIHNpbmUgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSB6ZXJvcworYXNpbmgwMDAwIGFzaW5oIDAuMCAwLjAgLT4gMC4wIDAuMAorYXNpbmgwMDAxIGFzaW5oIDAuMCAtMC4wIC0+IDAuMCAtMC4wCithc2luaDAwMDIgYXNpbmggLTAuMCAwLjAgLT4gLTAuMCAwLjAKK2FzaW5oMDAwMyBhc2luaCAtMC4wIC0wLjAgLT4gLTAuMCAtMC4wCisKKy0tIGJyYW5jaCBwb2ludHM6ICsvLWkKK2FzaW5oMDAxMCBhc2luaCAwLjAgMS4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDAxMSBhc2luaCAwLjAgLTEuMCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDEyIGFzaW5oIC0wLjAgMS4wIC0+IC0wLjAgMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwMTMgYXNpbmggLTAuMCAtMS4wIC0+IC0wLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorCistLSB2YWx1ZXMgYWxvbmcgYm90aCBzaWRlcyBvZiBpbWFnaW5hcnkgYXhpcworYXNpbmgwMDIwIGFzaW5oIDAuMCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLT4gMC4wIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNAorYXNpbmgwMDIxIGFzaW5oIC0wLjAgLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0+IC0wLjAgLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0Cithc2luaDAwMjIgYXNpbmggMC4wIC0xZS0zMDUgLT4gMC4wIC0xZS0zMDUKK2FzaW5oMDAyMyBhc2luaCAtMC4wIC0xZS0zMDUgLT4gLTAuMCAtMWUtMzA1Cithc2luaDAwMjQgYXNpbmggMC4wIC0xZS0xNTAgLT4gMC4wIC0xZS0xNTAKK2FzaW5oMDAyNSBhc2luaCAtMC4wIC0xZS0xNTAgLT4gLTAuMCAtMWUtMTUwCithc2luaDAwMjYgYXNpbmggMC4wIC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0+IDAuMCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNworYXNpbmgwMDI3IGFzaW5oIC0wLjAgLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLT4gLTAuMCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNworYXNpbmgwMDI4IGFzaW5oIDAuMCAtMC4wMDEgLT4gMC4wIC0wLjAwMTAwMDAwMDE2NjY2Njc0MTYKK2FzaW5oMDAyOSBhc2luaCAtMC4wIC0wLjAwMSAtPiAtMC4wIC0wLjAwMTAwMDAwMDE2NjY2Njc0MTYKK2FzaW5oMDAzMCBhc2luaCAwLjAgLTAuNTc4OTk5OTk5OTk5OTk5OTYgLT4gMC4wIC0wLjYxNzUwMTY1NDgxNzE3MDAxCithc2luaDAwMzEgYXNpbmggLTAuMCAtMC41Nzg5OTk5OTk5OTk5OTk5NiAtPiAtMC4wIC0wLjYxNzUwMTY1NDgxNzE3MDAxCithc2luaDAwMzIgYXNpbmggMC4wIC0wLjk5OTk5OTk5OTk5OTk5OTg5IC0+IDAuMCAtMS41NzA3OTYzMTE4OTM3MzU0Cithc2luaDAwMzMgYXNpbmggLTAuMCAtMC45OTk5OTk5OTk5OTk5OTk4OSAtPiAtMC4wIC0xLjU3MDc5NjMxMTg5MzczNTQKK2FzaW5oMDAzNCBhc2luaCAwLjAgLTEuMDAwMDAwMDAwMDAwMDAwMiAtPiAyLjEwNzM0MjQyNTU0NDcwMTRlLTA4IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDAzNSBhc2luaCAtMC4wIC0xLjAwMDAwMDAwMDAwMDAwMDIgLT4gLTIuMTA3MzQyNDI1NTQ0NzAxNGUtMDggLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDM2IGFzaW5oIDAuMCAtMS4wMDA5OTk5OTk5OTk5OTk5IC0+IDAuMDQ0NzE3NjMzNjA4MzA2ODQ5IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDAzNyBhc2luaCAtMC4wIC0xLjAwMDk5OTk5OTk5OTk5OTkgLT4gLTAuMDQ0NzE3NjMzNjA4MzA2ODQ5IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDAzOCBhc2luaCAwLjAgLTIuMCAtPiAxLjMxNjk1Nzg5NjkyNDgxNjggLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDM5IGFzaW5oIC0wLjAgLTIuMCAtPiAtMS4zMTY5NTc4OTY5MjQ4MTY4IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA0MCBhc2luaCAwLjAgLTIwLjAgLT4gMy42ODgyNTM4NjczNjEyOTY2IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA0MSBhc2luaCAtMC4wIC0yMC4wIC0+IC0zLjY4ODI1Mzg2NzM2MTI5NjYgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDQyIGFzaW5oIDAuMCAtMTAwMDAwMDAwMDAwMDAwMDAuMCAtPiAzNy41MzQ1MDg2Njg0NjQ2NzQgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDQzIGFzaW5oIC0wLjAgLTEwMDAwMDAwMDAwMDAwMDAwLjAgLT4gLTM3LjUzNDUwODY2ODQ2NDY3NCAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNDQgYXNpbmggMC4wIC05Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtPiAzNDYuMDgwOTExMTI5NjY2NzkgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDQ1IGFzaW5oIC0wLjAgLTkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0+IC0zNDYuMDgwOTExMTI5NjY2NzkgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDQ2IGFzaW5oIDAuMCAtMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLT4gNjg5LjE2NjA4OTk4NTc3OTY1IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA0NyBhc2luaCAtMC4wIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtPiAtNjg5LjE2NjA4OTk4NTc3OTY1IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA0OCBhc2luaCAwLjAgOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLT4gMC4wIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0Cithc2luaDAwNDkgYXNpbmggLTAuMCA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtPiAtMC4wIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0Cithc2luaDAwNTAgYXNpbmggMC4wIDFlLTMwNSAtPiAwLjAgMWUtMzA1Cithc2luaDAwNTEgYXNpbmggLTAuMCAxZS0zMDUgLT4gLTAuMCAxZS0zMDUKK2FzaW5oMDA1MiBhc2luaCAwLjAgMWUtMTUwIC0+IDAuMCAxZS0xNTAKK2FzaW5oMDA1MyBhc2luaCAtMC4wIDFlLTE1MCAtPiAtMC4wIDFlLTE1MAorYXNpbmgwMDU0IGFzaW5oIDAuMCA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0+IDAuMCA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3Cithc2luaDAwNTUgYXNpbmggLTAuMCA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0+IC0wLjAgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNworYXNpbmgwMDU2IGFzaW5oIDAuMCAwLjAwMSAtPiAwLjAgMC4wMDEwMDAwMDAxNjY2NjY3NDE2Cithc2luaDAwNTcgYXNpbmggLTAuMCAwLjAwMSAtPiAtMC4wIDAuMDAxMDAwMDAwMTY2NjY2NzQxNgorYXNpbmgwMDU4IGFzaW5oIDAuMCAwLjU3ODk5OTk5OTk5OTk5OTk2IC0+IDAuMCAwLjYxNzUwMTY1NDgxNzE3MDAxCithc2luaDAwNTkgYXNpbmggLTAuMCAwLjU3ODk5OTk5OTk5OTk5OTk2IC0+IC0wLjAgMC42MTc1MDE2NTQ4MTcxNzAwMQorYXNpbmgwMDYwIGFzaW5oIDAuMCAwLjk5OTk5OTk5OTk5OTk5OTg5IC0+IDAuMCAxLjU3MDc5NjMxMTg5MzczNTQKK2FzaW5oMDA2MSBhc2luaCAtMC4wIDAuOTk5OTk5OTk5OTk5OTk5ODkgLT4gLTAuMCAxLjU3MDc5NjMxMTg5MzczNTQKK2FzaW5oMDA2MiBhc2luaCAwLjAgMS4wMDAwMDAwMDAwMDAwMDAyIC0+IDIuMTA3MzQyNDI1NTQ0NzAxNGUtMDggMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNjMgYXNpbmggLTAuMCAxLjAwMDAwMDAwMDAwMDAwMDIgLT4gLTIuMTA3MzQyNDI1NTQ0NzAxNGUtMDggMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNjQgYXNpbmggMC4wIDEuMDAwOTk5OTk5OTk5OTk5OSAtPiAwLjA0NDcxNzYzMzYwODMwNjg0OSAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA2NSBhc2luaCAtMC4wIDEuMDAwOTk5OTk5OTk5OTk5OSAtPiAtMC4wNDQ3MTc2MzM2MDgzMDY4NDkgMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNjYgYXNpbmggMC4wIDIuMCAtPiAxLjMxNjk1Nzg5NjkyNDgxNjggMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNjcgYXNpbmggLTAuMCAyLjAgLT4gLTEuMzE2OTU3ODk2OTI0ODE2OCAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA2OCBhc2luaCAwLjAgMjAuMCAtPiAzLjY4ODI1Mzg2NzM2MTI5NjYgMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNjkgYXNpbmggLTAuMCAyMC4wIC0+IC0zLjY4ODI1Mzg2NzM2MTI5NjYgMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNzAgYXNpbmggMC4wIDEwMDAwMDAwMDAwMDAwMDAwLjAgLT4gMzcuNTM0NTA4NjY4NDY0Njc0IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDcxIGFzaW5oIC0wLjAgMTAwMDAwMDAwMDAwMDAwMDAuMCAtPiAtMzcuNTM0NTA4NjY4NDY0Njc0IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDcyIGFzaW5oIDAuMCA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtPiAzNDYuMDgwOTExMTI5NjY2NzkgMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNzMgYXNpbmggLTAuMCA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtPiAtMzQ2LjA4MDkxMTEyOTY2Njc5IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDc0IGFzaW5oIDAuMCAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtPiA2ODkuMTY2MDg5OTg1Nzc5NjUgMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNzUgYXNpbmggLTAuMCAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtPiAtNjg5LjE2NjA4OTk4NTc3OTY1IDEuNTcwNzk2MzI2Nzk0ODk2NgorCistLSByYW5kb20gaW5wdXRzCithc2luaDAxMDAgYXNpbmggLTAuNTk0NjQwMjg1MzcxMDQyMyAtMC4wNDQ1MDY1NDg5MTAwMDAxNDUgLT4gLTAuNTY0NTk3NzUzOTI2NTMwMjIgLTAuMDM4MjU2MjIxNDQxNTM2MzU2Cithc2luaDAxMDEgYXNpbmggLTAuMTkzNTM5NTgwNDYxODA5MTYgLTAuMDE3NDg5NjI0NzkzMTkzNDU0IC0+IC0wLjE5MjM3OTI2ODA0MTk2NjUxIC0wLjAxNzE3MTc0MTg5NTMzNjc5MgorYXNpbmgwMTAyIGFzaW5oIC0wLjAzMzExNzU4NTEzODk1NTg5MyAtOC41MjU2NDE0MDE1OTMzNzU3IC0+IC0yLjgzMjc3NTgzNDg2NTA5NjkgLTEuNTY2ODg0ODc5MTA5MjQxMQorYXNpbmgwMTAzIGFzaW5oIC0xLjUxODQwNDMxODQwMzU3MTYgLTAuNzM0OTEyNDUzMzkwNzMyNzUgLT4gLTEuMjcxNTg5MTQxOTc2NDAwNSAtMC4zOTIwNDYyNDQwODU0MjM1NQorYXNpbmgwMTA0IGFzaW5oIC0wLjYwNzE2MTIwMjcxMjA4ODE4IC0wLjI4OTAwNzQzOTU4NDM2NTQyIC0+IC0wLjU5MTE5Mjk5NDIxMTg3MjMyIC0wLjI0NzQ1OTMxNjc4MTE4MTM1Cithc2luaDAxMDUgYXNpbmggLTAuMDIzNzE3Nzg2NTExMjQyOSAyLjg4MzI2MDEwNTIxNjYzMTMgLT4gLTEuNzIwNTgyMDc3MjQxMzIzNiAxLjU2MjAyNjE3MDI5NjMwOTQKK2FzaW5oMDEwNiBhc2luaCAtMi4zOTA2ODEyMzQyNzQzOTc5IDIuNjM0OTIxNjg0ODU3NDAxMyAtPiAtMS45NjA5NjM2MjQ5NDQ1MTI0IDAuODE0MjE0MjY2MDU3NDcwNgorYXNpbmgwMTA3IGFzaW5oIC0wLjAwMjc2MDUwMTk3ODc2MjA1MTcgMTgzLjg1NTg4NDc2NTUwNTU1IC0+IC01LjkwNzI5MjAwMDU0NDUwNjYgMS41NzA3ODEzMTIwODQ3ODcxCithc2luaDAxMDggYXNpbmggLTAuOTkwODM2NjExNjQ0MDQ3MTMgMC4wMjgwMDY3OTcwNTE2MTc2NDggLT4gLTAuODc1MDE4NTI1MTI4Mzk5NSAwLjAxOTg5NDA5OTYxNTk5NDY1MworYXNpbmgwMTA5IGFzaW5oIC0zLjAzNjI5NTE5Mzc5ODYzOTMgMC44NjM3NzI2Njc1ODUwNDg2NyAtPiAtMS44NjM2MDMwNzE0Njg1MjIxIDAuMjY0NzUwNTg4NTk5NTAxNjgKK2FzaW5oMDExMCBhc2luaCAwLjM0NDM4NDY0NTM2MTUyNzY5IC0wLjcxNjAzNzkwMTc0ODg1MDI5IC0+IDAuNDM5ODU0MTU2OTA3MzQxNjQgLTAuNzEwMTUwMzc0MDkyOTQzMjQKK2FzaW5oMDExMSBhc2luaCA0LjQ5MjUxMjQ0MTM4NzYyNTYgLTYwNjA0NTk1MzUyLjg3MTYxMyAtPiAyNS41MjA3ODM3Mzg2MTIwNzggLTEuNTcwNzk2MzI2NzIwNzY4MworYXNpbmgwMTEyIGFzaW5oIDIuMzIxMzk5MTQyODE3MDMzNyAtNy41NDU5NjY3MDA3MzA3MjU4IC0+IDIuNzU2MDQ2NDk5MzQ1MTY0MyAtMS4yNzAwNzMyMTA4NTYxMTcKK2FzaW5oMDExMyBhc2luaCAwLjIxMjkxOTM5NzQxNjgyMDI4IC0xLjI3MjA0Mjg4MTQ3ODQ0MDggLT4gMC43NzI3NTA4ODEzNzMzODI2NiAtMS4zMTgyMDk5MjUwODk2ODk1Cithc2luaDAxMTQgYXNpbmggNi42NDQ3MzU5Mzc5NDU1OTU3IC0wLjk3MTk2MTkxNjY2OTQ2OTk2IC0+IDIuNjAyODMwNjk1MTM5NjcyIC0wLjE0MzY4MjQ3NDEyMzE5OTY1Cithc2luaDAxMTUgYXNpbmggNy4xMzI2MjU2NjU1MDgzNzQ2IDIuMTUxNjM2MDQ1MjcwNjg1NyAtPiAyLjcwNTExNDYzNzQzNjcyMTIgMC4yOTA1MTcwMTY2OTcyNzU4MQorYXNpbmgwMTE2IGFzaW5oIDAuMTg4NDY1NTA5MDUwNjM0NDIgMy40NzA1MzQ4NTg1MzM5ODMyIC0+IDEuOTE3Njk3ODc1Nzk5Mjk2IDEuNTE0MTU1NTkzMzQ3OTI0Cithc2luaDAxMTcgYXNpbmggMC4xOTA2NTA3NTMwMzI4MTU5OCAwLjI2MjE2ODE0NTQ4MjIyMDEyIC0+IDAuMTk2MDMwNTA3ODU5MzI0NzQgMC4yNjAxMzQyMjgwOTYxNDExNworYXNpbmgwMTE4IGFzaW5oIDIuMDI0MjAwNDY2NTczOTcxOSAwLjcwNTEwMjgxNjQ3NDk1Nzg3IC0+IDEuNDk3MDM2NjIxMjg5NjAwMiAwLjMwNTI2MDA3MjAwNDgxNDUzCithc2luaDAxMTkgYXNpbmggMzcuMzM2NTk2NDYxNTc2MDU3IDcxNy4yOTE1NzM5MTY3ODIzNCAtPiA3LjI2OTk4MTk5Nzk0NTI5NCAxLjUxODc5MTAyMTk1NzYwMzMKKworLS0gdmFsdWVzIG5lYXIgaW5maW5pdHkKK2FzaW5oMDIwMCBhc2luaCAxLjA3NjA1MTc1MDA4NzQ1NDFlKzMwOCAxLjE0OTc3ODYyNDEyNDAxNjdlKzMwOCAtPiA3MTAuMzQzNDYwNTU2NTE4MTUgMC44MTg1MDkzNjk2MTc5MzQ3NQorYXNpbmgwMjAxIGFzaW5oIDEuMTc4NDgzOTMyODg0NTUyOWUrMzA4IC0xLjY0Nzg0Mjk1ODY3MTY2MzhlKzMwOCAtPiA3MTAuNTk1MzYyNTU3ODM2NzggLTAuOTQ5OTYzMTE3MzU2MDc2OTcKK2FzaW5oMDIwMiBhc2luaCAtNC44Nzc3NjgyMjQ4OTA5MTkzZSszMDcgMS40MTAzNzM2MjE3NTM4NDc0ZSszMDggLT4gLTcxMC4yODk3MDE0NzM3Njk5MiAxLjIzNzgyMzk1MTkwOTY0NDMKK2FzaW5oMDIwMyBhc2luaCAtMS4yODMyNDc4OTAzMjMzMTA4ZSszMDggLTEuNTczMjM5MjYxMzE1NTY5OGUrMzA4IC0+IC03MTAuNTk3NTAxNjQyOTA3NDUgLTAuODg2NTcxODE0MzkzMjI0NTIKK2FzaW5oMDIwNCBhc2luaCAwLjAgNi44NDMxMzgzODU2MzQ1MzcyZSszMDcgLT4gNzA5LjUxMDAxNzE4NDQ0NjA0IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMjA1IGFzaW5oIC0wLjAgOC42MDE4MjI0MzIyMzgwNTFlKzMwNyAtPiAtNzA5LjczODc0NDgyMTI2Njg5IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMjA2IGFzaW5oIDAuMCAtNS41Njk4Mzk2MDY3MzAzNzgyZSszMDcgLT4gNzA5LjMwNDEzNjk4NzMzNzQyIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDIwNyBhc2luaCAtMC4wIC03LjE1MDc3Nzc3MzQ2MjE4MDRlKzMwNyAtPiAtNzA5LjU1Mzk5MTg2MDAyNzA1IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDIwOCBhc2luaCAxLjYwMjUxMzYxMTAwMTkzNDllKzMwOCAwLjAgLT4gNzEwLjM2MDkyOTIyNjEwNzYgMC4wCithc2luaDAyMDkgYXNpbmggMS4zOTI3ODE5ODU4MjM5MTE0ZSszMDggLTAuMCAtPiA3MTAuMjIwNjU4OTk4MzI4OTkgLTAuMAorYXNpbmgwMjEwIGFzaW5oIC02LjA0NDI5OTQwNTYyMTA5OTVlKzMwNyAwLjAgLT4gLTcwOS4zODU4ODYzMTA1NzYyMSAwLjAKK2FzaW5oMDIxMSBhc2luaCAtMS4yNzc1MjcxOTc5MDQyNjM0ZSszMDggLTAuMCAtPiAtNzEwLjEzNDI4MjE1NTUzOTcyIC0wLjAKK2FzaW5oMDIxMiBhc2luaCAxLjA2ODc0OTYyNjAyNjg0ODllKzMwOCAxLjAyNTU2MTU2OTk0NzY5NjEgLT4gNzA5Ljk1NTg0NTIxNDA3ODQxIDkuNTk1OTAxMDg4MjY3OTA5M2UtMzA5Cithc2luaDAyMTMgYXNpbmggMS4wMDUwOTY3MzMzMzcwOTYyZSszMDggLTAuODc2Njg5NzAxMTczMzM0MzMgLT4gNzA5Ljg5NDQzOTYxMTY4MTgzIC04LjcyMjQ0MTA1NTYyNDI4ODJlLTMwOQorYXNpbmgwMjE0IGFzaW5oIC01LjcxNjE0NTI4MTQ4NjIzOTJlKzMwNyA4LjIzNzc4MDg0MTM0NTAxMjIgLT4gLTcwOS4zMzAwNjU0MDYxMTE2NiAxLjQ0MTE0MjY2NDQ1MDExMTZlLTMwNworYXNpbmgwMjE1IGFzaW5oIC04LjIwMDkwNDA3Mjc2NTMzMTVlKzMwNyAtNi40MDc0MDk1MjY2NTQ5NzYgLT4gLTcwOS42OTEwMTUxMzA3MDEwOSAtNy44MTMwNTI2NDYxNTEwMDg4ZS0zMDgKK2FzaW5oMDIxNiBhc2luaCA2LjQyMzkzNjg0OTY0ODM5ODIgMS42MzY1OTkwODIxNTUxNDI3ZSszMDggLT4gNzEwLjM4MTk3NjE4MTAxMjg3IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMjE3IGFzaW5oIDUuNDcyOTExMTQyMzMxNTg4MiAtMS4xMjI3MjM3NDM4MTQ0MjExZSszMDggLT4gNzEwLjAwNTExMzQ2OTgzNTQ2IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDIxOCBhc2luaCAtOC4zNDU1ODE4Mjk3NDEyNzIzIDEuNDQzMTcyMDIwMTgyMDE5ZSszMDggLT4gLTcxMC4yNTYxOTkzMDU1MTgxOCAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDIxOSBhc2luaCAtMi42MDQ5NzI2MjMwMzcyNDQxIC0xLjc5NTIyOTExNDQwMjI3MDJlKzMwOCAtPiAtNzEwLjQ3NDQ4ODQ3Njg1NjQ0IC0xLjU3MDc5NjMyNjc5NDg5NjYKKworLS0gdmFsdWVzIG5lYXIgMAorYXNpbmgwMjIwIGFzaW5oIDEuMjk0MDExMzMzOTY2NDA4OGUtMzE0IDYuOTE2OTE5MDQxNzc3NDUxNmUtMzIzIC0+IDEuMjk0MDExMzMzOTY2NDA4OGUtMzE0IDYuOTE2OTE5MDQxNzc3NDUxNmUtMzIzCithc2luaDAyMjEgYXNpbmggMi4zODQ4NDc4ODYzODc0NjQ5ZS0zMTUgLTMuMTkwNzY1NTAyNTcxNzcxN2UtMzEwIC0+IDIuMzg0ODQ3ODg2Mzg3NDY0OWUtMzE1IC0zLjE5MDc2NTUwMjU3MTc3MTdlLTMxMAorYXNpbmgwMjIyIGFzaW5oIC0zLjAwOTc2NDM2Nzk2NDE2MjJlLTMxNiA0LjY5MzYyMzYzNTQ5MTg0MjJlLTMyMiAtPiAtMy4wMDk3NjQzNjc5NjQxNjIyZS0zMTYgNC42OTM2MjM2MzU0OTE4NDIyZS0zMjIKK2FzaW5oMDIyMyBhc2luaCAtMS43ODc5OTcwODc3NTU3NTFlLTMwOCAtOC41NjE5NjIyODM0OTAyMzQxZS0zMTAgLT4gLTEuNzg3OTk3MDg3NzU1NzUxZS0zMDggLTguNTYxOTYyMjgzNDkwMjM0MWUtMzEwCithc2luaDAyMjQgYXNpbmggMC4wIDEuMjQ5MTQzMzQ0ODQyNzMyNWUtMzE0IC0+IDAuMCAxLjI0OTE0MzM0NDg0MjczMjVlLTMxNAorYXNpbmgwMjI1IGFzaW5oIC0wLjAgMi41MDI0MDcyMTU0NTM4MDYyZS0zMDggLT4gLTAuMCAyLjUwMjQwNzIxNTQ1MzgwNjJlLTMwOAorYXNpbmgwMjI2IGFzaW5oIDAuMCAtMi45NjQzOTM4NzUwNDc0NzkzZS0zMjMgLT4gMC4wIC0yLjk2NDM5Mzg3NTA0NzQ3OTNlLTMyMworYXNpbmgwMjI3IGFzaW5oIC0wLjAgLTIuOTM5NjkwNTkyNzU1NDE2OWUtMzIwIC0+IC0wLjAgLTIuOTM5NjkwNTkyNzU1NDE2OWUtMzIwCithc2luaDAyMjggYXNpbmggNS42NDA0MjkzMDAyOTM1OWUtMzE3IDAuMCAtPiA1LjY0MDQyOTMwMDI5MzU5ZS0zMTcgMC4wCithc2luaDAyMjkgYXNpbmggMy4zODMzOTExODY2NTk2MDY4ZS0zMTggLTAuMCAtPiAzLjM4MzM5MTE4NjY1OTYwNjhlLTMxOCAtMC4wCithc2luaDAyMzAgYXNpbmggLTQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0IDAuMCAtPiAtNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjQgMC4wCithc2luaDAyMzEgYXNpbmggLTIuMjIxMTM3OTIyNzk5NDg0NWUtMzA4IC0wLjAgLT4gLTIuMjIxMTM3OTIyNzk5NDg0NWUtMzA4IC0wLjAKKworLS0gc3BlY2lhbCB2YWx1ZXMKK2FzaW5oMTAwMCBhc2luaCAwLjAgMC4wIC0+IDAuMCAwLjAKK2FzaW5oMTAwMSBhc2luaCAwLjAgLTAuMCAtPiAwLjAgLTAuMAorYXNpbmgxMDAyIGFzaW5oIC0wLjAgMC4wIC0+IC0wLjAgMC4wCithc2luaDEwMDMgYXNpbmggLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorYXNpbmgxMDA0IGFzaW5oIDAuMCBpbmYgLT4gaW5mIDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgxMDA1IGFzaW5oIDIuMyBpbmYgLT4gaW5mIDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgxMDA2IGFzaW5oIDAuMCBuYW4gLT4gbmFuIG5hbgorYXNpbmgxMDA3IGFzaW5oIDIuMyBuYW4gLT4gbmFuIG5hbgorYXNpbmgxMDA4IGFzaW5oIGluZiAwLjAgLT4gaW5mIDAuMAorYXNpbmgxMDA5IGFzaW5oIGluZiAyLjMgLT4gaW5mIDAuMAorYXNpbmgxMDEwIGFzaW5oIGluZiBpbmYgLT4gaW5mIDAuNzg1Mzk4MTYzMzk3NDQ4MjgKK2FzaW5oMTAxMSBhc2luaCBpbmYgbmFuIC0+IGluZiBuYW4KK2FzaW5oMTAxMiBhc2luaCBuYW4gMC4wIC0+IG5hbiAwLjAKK2FzaW5oMTAxMyBhc2luaCBuYW4gMi4zIC0+IG5hbiBuYW4KK2FzaW5oMTAxNCBhc2luaCBuYW4gaW5mIC0+IGluZiBuYW4gICAgICAgICAgICAgICAgICAgICAgaWdub3JlLXJlYWwtc2lnbgorYXNpbmgxMDE1IGFzaW5oIG5hbiBuYW4gLT4gbmFuIG5hbgorYXNpbmgxMDE2IGFzaW5oIDAuMCAtaW5mIC0+IGluZiAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDEwMTcgYXNpbmggMi4zIC1pbmYgLT4gaW5mIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMTAxOCBhc2luaCBpbmYgLTAuMCAtPiBpbmYgLTAuMAorYXNpbmgxMDE5IGFzaW5oIGluZiAtMi4zIC0+IGluZiAtMC4wCithc2luaDEwMjAgYXNpbmggaW5mIC1pbmYgLT4gaW5mIC0wLjc4NTM5ODE2MzM5NzQ0ODI4Cithc2luaDEwMjEgYXNpbmggbmFuIC0wLjAgLT4gbmFuIC0wLjAKK2FzaW5oMTAyMiBhc2luaCBuYW4gLTIuMyAtPiBuYW4gbmFuCithc2luaDEwMjMgYXNpbmggbmFuIC1pbmYgLT4gaW5mIG5hbiAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS1yZWFsLXNpZ24KK2FzaW5oMTAyNCBhc2luaCAtMC4wIC1pbmYgLT4gLWluZiAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDEwMjUgYXNpbmggLTIuMyAtaW5mIC0+IC1pbmYgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgxMDI2IGFzaW5oIC0wLjAgbmFuIC0+IG5hbiBuYW4KK2FzaW5oMTAyNyBhc2luaCAtMi4zIG5hbiAtPiBuYW4gbmFuCithc2luaDEwMjggYXNpbmggLWluZiAtMC4wIC0+IC1pbmYgLTAuMAorYXNpbmgxMDI5IGFzaW5oIC1pbmYgLTIuMyAtPiAtaW5mIC0wLjAKK2FzaW5oMTAzMCBhc2luaCAtaW5mIC1pbmYgLT4gLWluZiAtMC43ODUzOTgxNjMzOTc0NDgyOAorYXNpbmgxMDMxIGFzaW5oIC1pbmYgbmFuIC0+IC1pbmYgbmFuCithc2luaDEwMzIgYXNpbmggLTAuMCBpbmYgLT4gLWluZiAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMTAzMyBhc2luaCAtMi4zIGluZiAtPiAtaW5mIDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgxMDM0IGFzaW5oIC1pbmYgMC4wIC0+IC1pbmYgMC4wCithc2luaDEwMzUgYXNpbmggLWluZiAyLjMgLT4gLWluZiAwLjAKK2FzaW5oMTAzNiBhc2luaCAtaW5mIGluZiAtPiAtaW5mIDAuNzg1Mzk4MTYzMzk3NDQ4MjgKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGF0YW46IEludmVyc2UgdGFuZ2VudCAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tIHplcm9zCithdGFuMDAwMCBhdGFuIDAuMCAwLjAgLT4gMC4wIDAuMAorYXRhbjAwMDEgYXRhbiAwLjAgLTAuMCAtPiAwLjAgLTAuMAorYXRhbjAwMDIgYXRhbiAtMC4wIDAuMCAtPiAtMC4wIDAuMAorYXRhbjAwMDMgYXRhbiAtMC4wIC0wLjAgLT4gLTAuMCAtMC4wCisKKy0tIHZhbHVlcyBhbG9uZyBib3RoIHNpZGVzIG9mIGltYWdpbmFyeSBheGlzCithdGFuMDAxMCBhdGFuIDAuMCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLT4gMC4wIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNAorYXRhbjAwMTEgYXRhbiAtMC4wIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtPiAtMC4wIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNAorYXRhbjAwMTIgYXRhbiAwLjAgLTFlLTMwNSAtPiAwLjAgLTFlLTMwNQorYXRhbjAwMTMgYXRhbiAtMC4wIC0xZS0zMDUgLT4gLTAuMCAtMWUtMzA1CithdGFuMDAxNCBhdGFuIDAuMCAtMWUtMTUwIC0+IDAuMCAtMWUtMTUwCithdGFuMDAxNSBhdGFuIC0wLjAgLTFlLTE1MCAtPiAtMC4wIC0xZS0xNTAKK2F0YW4wMDE2IGF0YW4gMC4wIC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0+IDAuMCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNworYXRhbjAwMTcgYXRhbiAtMC4wIC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0+IC0wLjAgLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcKK2F0YW4wMDE4IGF0YW4gMC4wIC0wLjAwMSAtPiAwLjAgLTAuMDAxMDAwMDAwMzMzMzMzNTMzMworYXRhbjAwMTkgYXRhbiAtMC4wIC0wLjAwMSAtPiAtMC4wIC0wLjAwMTAwMDAwMDMzMzMzMzUzMzMKK2F0YW4wMDIwIGF0YW4gMC4wIC0wLjU3ODk5OTk5OTk5OTk5OTk2IC0+IDAuMCAtMC42NjA5NTcwOTAyODY2MzAzCithdGFuMDAyMSBhdGFuIC0wLjAgLTAuNTc4OTk5OTk5OTk5OTk5OTYgLT4gLTAuMCAtMC42NjA5NTcwOTAyODY2MzAzCithdGFuMDAyMiBhdGFuIDAuMCAtMC45OTk5OTk5OTk5OTk5OTk4OSAtPiAwLjAgLTE4LjcxNDk3Mzg3NTExODUyNAorYXRhbjAwMjMgYXRhbiAtMC4wIC0wLjk5OTk5OTk5OTk5OTk5OTg5IC0+IC0wLjAgLTE4LjcxNDk3Mzg3NTExODUyNAorYXRhbjAwMjQgYXRhbiAwLjAgLTEuMDAwMDAwMDAwMDAwMDAwMiAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTE4LjM2ODQwMDI4NDgzODU1CithdGFuMDAyNSBhdGFuIC0wLjAgLTEuMDAwMDAwMDAwMDAwMDAwMiAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC0xOC4zNjg0MDAyODQ4Mzg1NQorYXRhbjAwMjYgYXRhbiAwLjAgLTEuMDAwOTk5OTk5OTk5OTk5OSAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTMuODAwNzAxMTY3MjkxOTIxOAorYXRhbjAwMjcgYXRhbiAtMC4wIC0xLjAwMDk5OTk5OTk5OTk5OTkgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMy44MDA3MDExNjcyOTE5MjE4CithdGFuMDAyOCBhdGFuIDAuMCAtMi4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC41NDkzMDYxNDQzMzQwNTQ4OQorYXRhbjAwMjkgYXRhbiAtMC4wIC0yLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMC41NDkzMDYxNDQzMzQwNTQ4OQorYXRhbjAwMzAgYXRhbiAwLjAgLTIwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjA1MDA0MTcyOTI3ODQ5MTI2NQorYXRhbjAwMzEgYXRhbiAtMC4wIC0yMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTAuMDUwMDQxNzI5Mjc4NDkxMjY1CithdGFuMDAzMiBhdGFuIDAuMCAtMTAwMDAwMDAwMDAwMDAwMDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcKK2F0YW4wMDMzIGF0YW4gLTAuMCAtMTAwMDAwMDAwMDAwMDAwMDAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3CithdGFuMDAzNCBhdGFuIDAuMCAtOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0xZS0xNTAKK2F0YW4wMDM1IGF0YW4gLTAuMCAtOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMWUtMTUwCithdGFuMDAzNiBhdGFuIDAuMCAtMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC05Ljk5OTk5OTk5OTk5OTk5OTllLTMwMAorYXRhbjAwMzcgYXRhbiAtMC4wIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC05Ljk5OTk5OTk5OTk5OTk5OTllLTMwMAorYXRhbjAwMzggYXRhbiAwLjAgOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLT4gMC4wIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0CithdGFuMDAzOSBhdGFuIC0wLjAgOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLT4gLTAuMCA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNAorYXRhbjAwNDAgYXRhbiAwLjAgMWUtMzA1IC0+IDAuMCAxZS0zMDUKK2F0YW4wMDQxIGF0YW4gLTAuMCAxZS0zMDUgLT4gLTAuMCAxZS0zMDUKK2F0YW4wMDQyIGF0YW4gMC4wIDFlLTE1MCAtPiAwLjAgMWUtMTUwCithdGFuMDA0MyBhdGFuIC0wLjAgMWUtMTUwIC0+IC0wLjAgMWUtMTUwCithdGFuMDA0NCBhdGFuIDAuMCA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0+IDAuMCA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3CithdGFuMDA0NSBhdGFuIC0wLjAgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtPiAtMC4wIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcKK2F0YW4wMDQ2IGF0YW4gMC4wIDAuMDAxIC0+IDAuMCAwLjAwMTAwMDAwMDMzMzMzMzUzMzMKK2F0YW4wMDQ3IGF0YW4gLTAuMCAwLjAwMSAtPiAtMC4wIDAuMDAxMDAwMDAwMzMzMzMzNTMzMworYXRhbjAwNDggYXRhbiAwLjAgMC41Nzg5OTk5OTk5OTk5OTk5NiAtPiAwLjAgMC42NjA5NTcwOTAyODY2MzAzCithdGFuMDA0OSBhdGFuIC0wLjAgMC41Nzg5OTk5OTk5OTk5OTk5NiAtPiAtMC4wIDAuNjYwOTU3MDkwMjg2NjMwMworYXRhbjAwNTAgYXRhbiAwLjAgMC45OTk5OTk5OTk5OTk5OTk4OSAtPiAwLjAgMTguNzE0OTczODc1MTE4NTI0CithdGFuMDA1MSBhdGFuIC0wLjAgMC45OTk5OTk5OTk5OTk5OTk4OSAtPiAtMC4wIDE4LjcxNDk3Mzg3NTExODUyNAorYXRhbjAwNTIgYXRhbiAwLjAgMS4wMDAwMDAwMDAwMDAwMDAyIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAxOC4zNjg0MDAyODQ4Mzg1NQorYXRhbjAwNTMgYXRhbiAtMC4wIDEuMDAwMDAwMDAwMDAwMDAwMiAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDE4LjM2ODQwMDI4NDgzODU1CithdGFuMDA1NCBhdGFuIDAuMCAxLjAwMDk5OTk5OTk5OTk5OTkgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDMuODAwNzAxMTY3MjkxOTIxOAorYXRhbjAwNTUgYXRhbiAtMC4wIDEuMDAwOTk5OTk5OTk5OTk5OSAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDMuODAwNzAxMTY3MjkxOTIxOAorYXRhbjAwNTYgYXRhbiAwLjAgMi4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjU0OTMwNjE0NDMzNDA1NDg5CithdGFuMDA1NyBhdGFuIC0wLjAgMi4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgMC41NDkzMDYxNDQzMzQwNTQ4OQorYXRhbjAwNTggYXRhbiAwLjAgMjAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wNTAwNDE3MjkyNzg0OTEyNjUKK2F0YW4wMDU5IGF0YW4gLTAuMCAyMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgMC4wNTAwNDE3MjkyNzg0OTEyNjUKK2F0YW4wMDYwIGF0YW4gMC4wIDEwMDAwMDAwMDAwMDAwMDAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcKK2F0YW4wMDYxIGF0YW4gLTAuMCAxMDAwMDAwMDAwMDAwMDAwMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNworYXRhbjAwNjIgYXRhbiAwLjAgOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDFlLTE1MAorYXRhbjAwNjMgYXRhbiAtMC4wIDkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgMWUtMTUwCithdGFuMDA2NCBhdGFuIDAuMCAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgOS45OTk5OTk5OTk5OTk5OTk5ZS0zMDAKK2F0YW4wMDY1IGF0YW4gLTAuMCAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDkuOTk5OTk5OTk5OTk5OTk5OWUtMzAwCisKKy0tIHJhbmRvbSBpbnB1dHMKK2F0YW4wMTAwIGF0YW4gLTAuMzI1Mzg4NzM2NjEwNjAyMTQgLTEuNTUzMDQ2MTU1MDQxMjU3OCAtPiAtMS4zNjgyNzI4NDI3NTU0MjI3IC0wLjY5NDUxNDAxNTk4NzYyMDQxCithdGFuMDEwMSBhdGFuIC0wLjQ1ODYzMzkzNDk1MTk3OTI5IC00Nzk5LjE3NDcwOTQ5MDM1OTQgLT4gLTEuNTcwNzk2MzA2ODgyMDYyMyAtMC4wMDAyMDgzNjkxNjA1MDYzNjE0NQorYXRhbjAxMDIgYXRhbiAtOC4zMDA2OTk5Njg1OTc2MTYyIC0yLjY3ODg4OTAyNTE3OTA5MzggLT4gLTEuNDYxOTg2Mjc3MTgxMDE5OSAtMC4wMzQ4MTE2Njk2NTMzMjc4MjYKK2F0YW4wMTAzIGF0YW4gLTEuODgzNjMwNzY4Mjk4NTMxNCAtMS4xNDQxOTc2NjM4ODYxNzcxIC0+IC0xLjE4Mzk5ODQzNzA4NzE2MTIgLTAuMjA2MzA5NTYxNTczMTI3OTYKK2F0YW4wMTA0IGF0YW4gLTAuMDAwNjMyMzA0ODI0MDc0OTE2NjkgLTQuOTMxMjUyMDk2MTgyOTQ4NSAtPiAtMS41NzA3NjkyMDkzMjIzMTQ3IC0wLjIwNTYzODY3NzQzMDA4MzA0CithdGFuMDEwNSBhdGFuIC0wLjg0Mjc4MTM3MTUwMDY1OTQ2IDE3OTAxMi4zNzQ5MzE0Njk5NyAtPiAtMS41NzA3OTYzMjY3Njg1OTY5IDUuNTg2MjA1OTgzNjQyNTI3MmUtMDYKK2F0YW4wMTA2IGF0YW4gLTAuOTU0ODc4NTM5ODQwNDkyODcgMTQuMzExMzM0NTM5ODg2MTc3IC0+IC0xLjU2NjEzMjI4NTk0MzQ1NjEgMC4wNjk2NzYwMjQ1MjYyMzIwMDUKK2F0YW4wMTA3IGF0YW4gLTEuMzUxMzI1MjUzOTY2MzIzOSA2LjA1MDA3MjcwMjE2MzIxOThlLTA4IC0+IC0wLjkzMzcxNjc2MzE1MjIwOTc1IDIuMTQwODAwMjY5NzQyNjU2ZS0wOAorYXRhbjAxMDggYXRhbiAtMC4yMDU2NjI1NDQ1ODU5NTc5NSAwLjExOTMzNzcxOTQ0MTU5ODIzIC0+IC0wLjIwNTU2NDYzNzExMTc0OTE2IDAuMTE0OTM0MDUzODcxNDE3MzIKK2F0YW4wMTA5IGF0YW4gLTAuNTg1NjM3MTg3OTU0MDg1NTkgMC42NDQzODk2NTQyMzIxMjg2OCAtPiAtMC42ODM2MTA4OTMwMDIzMzEyNCAwLjQ2NzU5NzYyNzUxODAwMjQ5CithdGFuMDExMCBhdGFuIDQ4LjQ3OTI2Nzc1MTk0ODI5MiAtNzguMzg2MzgyNDYwMTEyNTQzIC0+IDEuNTY1MDg4ODc3MDkxMDUyMyAtMC4wMDkyMjc2ODExMzczMjk3NTg0CithdGFuMDExMSBhdGFuIDEuMDU3NTM3MzkxNDA1NjA2MSAtMC43NTk4ODAxMjM3NzI5Njk4NyAtPiAwLjk0NDMwODg2NzIyMDQzNTk0IC0wLjMxOTE1Njk4MTI2NzAzMTE4CithdGFuMDExMiBhdGFuIDQ0NDQ4MTAuNDMxNDY3NzIwMyAtMC41NjU1MzQwNDU5Mzk0MjU1OCAtPiAxLjU3MDc5NjEwMTgxMzQyMzEgLTIuODYyNTQ0NjQzNzcwMTkwOWUtMTQKK2F0YW4wMTEzIGF0YW4gMC4wMTAxMDE0MDUwODI1MjAwMDkgLTAuMDMyOTMyNjY4NTUwMjgyNDc4IC0+IDAuMDEwMTEyMDI2NzY2NDYzMzQgLTAuMDMyOTQxMjE0Nzc2ODM0OTk2CithdGFuMDExNCBhdGFuIDEuNTM1MzU4NTMwMDE1NDkxMSAtMi4xOTQ3MDk5MzQ2Nzk2NTE5IC0+IDEuMzQwMDMxMDczOTIwNjM5NCAtMC4yOTk5NjAwMzYwNzQ0OTA0NQorYXRhbjAxMTUgYXRhbiAwLjIxODY5NDU3MDU1NjcwODgyIDkuOTkxNTY4NDI1NDAwNzA5MyAtPiAxLjU2ODU4NDYwNzg4NzY0NDQgMC4xMDAzNzE2ODgxNzU5NDM5CithdGFuMDExNiBhdGFuIDAuMTc3ODMyOTAxNTAyNDY4MzYgMC4wNjQzMzQ2ODk4NjM2NTA5NTcgLT4gMC4xNzY2ODcyODA2NDI4NjI3NyAwLjA2MjQzNTgwODcyODg3Mzg0NgorYXRhbjAxMTcgYXRhbiAxNS43NTc0NzQwODc2MTU5MTggMzgzLjU3MjYyMTQyNTM0IC0+IDEuNTcwNjg5NDA2MDM2OTYyMSAwLjAwMjYwMjY4MTcyNzg4MjY2MDMKK2F0YW4wMTE4IGF0YW4gMTAuNTg3MDE3NDA4NTMzMzE3IDAuMjE3MjAyMzgwODE4NDM0MzggLT4gMS40NzY2NTk0NjgxMzM2MjM2IDAuMDAxOTE5OTA5NzM4MzAxMDA2MQorYXRhbjAxMTkgYXRhbiAwLjg2MDI2MDc4Njc4NzgxMjA0IDAuMTIzMDE0ODYwOTM1OTUwMiAtPiAwLjcxNDcyNTkzMjI1MzQ5MjkgMC4wNzA1NTEyMjE5NTQyODY2MDUKKworLS0gdmFsdWVzIG5lYXIgaW5maW5pdHkKK2F0YW4wMjAwIGF0YW4gNy44NzY0Mzk3MDExMTk1Nzk4ZSszMDcgOC4xNjQ3OTIxMTM3NzQ2MzA4ZSszMDcgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDYuMzQzOTQ0NjkzOTYwNDQ5M2UtMzA5CithdGFuMDIwMSBhdGFuIDEuNTg3MzY5ODY5NjEzMTQ4N2UrMzA4IC0xLjA3ODAzNjc0MjI5NjA2NDFlKzMwOCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTIuOTI3OTMwOTM2ODUzMDc4MWUtMzA5CithdGFuMDIwMiBhdGFuIC0xLjU4NDQ1NTE4NjQ4MjU4MzRlKzMwOCAxLjAyOTA2NTc4MDkwOTg2NzVlKzMwOCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDIuODgyOTYxNDczNjk2MTQxN2UtMzA5CithdGFuMDIwMyBhdGFuIC0xLjMxNjg3OTI1NjI1MjQwMzJlKzMwOCAtOS4wODg0MzIzNDE2MTQ4MjVlKzMwNyAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC0zLjU0OTkzNzMwNTczOTAwNTZlLTMwOQorYXRhbjAyMDQgYXRhbiAwLjAgMS4wMzYwNDY1NzQyMjU4MzM3ZSszMDggLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDkuNjUyMDc1NzM1NTY0NjAxOGUtMzA5CithdGFuMDIwNSBhdGFuIC0wLjAgMS4wMDQ1MDYzMjEwMzczMTk2ZSszMDggLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiA5Ljk1NTEzODk0NzkyOTUwM2UtMzA5CithdGFuMDIwNiBhdGFuIDAuMCAtOS41MTU1Mjk2NzE1NzYzNjk2ZSszMDcgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0xLjA1MDkxMzY0ODAyMDExOGUtMzA4CithdGFuMDIwNyBhdGFuIC0wLjAgLTEuNTU2NTcwMDQ5MDQ5NjUwMWUrMzA4IC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTYuNDI0MzgxNjExNDE4OTA3MWUtMzA5CithdGFuMDIwOCBhdGFuIDEuMjk1NjMzOTM4OTUyNTI0NGUrMzA4IDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithdGFuMDIwOSBhdGFuIDEuNDQwODEyNjI0Mzc3MjE1MWUrMzA4IC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2F0YW4wMjEwIGF0YW4gLTEuMDYzMTc4NjQ2MTkzNjQxN2UrMzA4IDAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjAyMTEgYXRhbiAtMS4wNTE2MDU2OTY0MTcxMDY5ZSszMDggLTAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2F0YW4wMjEyIGF0YW4gMS4yMzYxNjIzMTk2MDM4MzhlKzMwOCA0LjY4Mjc5NTM0OTYyNDI5MzYgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjAyMTMgYXRhbiA3LjAwMDUxNjQ3Mjg5NzIxOGUrMzA3IC01Ljg2MzE2MDgwMTc4NDQxNjMgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2F0YW4wMjE0IGF0YW4gLTEuNTA1MzQ0NDAwMzMzODUwOGUrMzA4IDUuMTE5OTE5NzI2ODQyMDMxMyAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjAyMTUgYXRhbiAtMS4zOTkxNzI1MTgxNDcyNTllKzMwOCAtMy41Njg3NzY2NDcyOTEzNjczIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorYXRhbjAyMTYgYXRhbiA4LjEyNTI4MzMwNzA4MDMwMjEgNi4yNzgyOTUzOTE3MzQzODIyZSszMDcgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDEuNTkyNzg5MDI1NjkwODU2NGUtMzA4CithdGFuMDIxNyBhdGFuIDIuODAzNDI4NTk0NzUxNTE2NyAtMS4zMzc4MDQ5Nzc1NzUzODc4ZSszMDggLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC03LjQ3NDkzMTA3NTYyMTk1NjJlLTMwOQorYXRhbjAyMTggYXRhbiAtMS40MDczNTA5OTg4OTc0OTUzIDEuNjc3NjM4MTc4NTk2ODM1NWUrMzA4IC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgNS45NjA3NjA4NjQ2MzY0NTY5ZS0zMDkKK2F0YW4wMjE5IGF0YW4gLTIuNzEzNTU1MTUyNzU5MjExOSAtMS4yODE1Njc0NDU1MjU3MzhlKzMwOCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC03LjgwMjk0NDc3Mjc1NjUzMjZlLTMwOQorCistLSBpbWFnaW5hcnkgcGFydCA9ICsvLTEsIHJlYWwgcGFydCB0aW55CithdGFuMDMwMCBhdGFuIC0xZS0xNTAgLTEuMCAtPiAtMC43ODUzOTgxNjMzOTc0NDgyOCAtMTczLjA0MDQ1NTU2NDgzMzM5CithdGFuMDMwMSBhdGFuIDFlLTE1NSAxLjAgLT4gMC43ODUzOTgxNjMzOTc0NDgyOCAxNzguNzk2OTE4Mjk3MzE4NTEKK2F0YW4wMzAyIGF0YW4gOS45OTk5OTk5OTk5OTk5OTk5ZS0xNjEgLTEuMCAtPiAwLjc4NTM5ODE2MzM5NzQ0ODI4IC0xODQuNTUzMzgxMDI5ODAzNjMKK2F0YW4wMzAzIGF0YW4gLTFlLTE2NSAxLjAgLT4gLTAuNzg1Mzk4MTYzMzk3NDQ4MjggMTkwLjMwOTg0Mzc2MjI4ODc1CithdGFuMDMwNCBhdGFuIC05Ljk5OTg4ODY3MTgyNjgzMDFlLTMyMSAtMS4wIC0+IC0wLjc4NTM5ODE2MzM5NzQ0ODI4IC0zNjguNzYwMTk0MDM1NzY2OTIKKworLS0gc3BlY2lhbCB2YWx1ZXMKK2F0YW4xMDAwIGF0YW4gLTAuMCAwLjAgLT4gLTAuMCAwLjAKK2F0YW4xMDAxIGF0YW4gbmFuIDAuMCAtPiBuYW4gMC4wCithdGFuMTAwMiBhdGFuIC0wLjAgMS4wIC0+IC0wLjAgaW5mIGRpdmlkZS1ieS16ZXJvCithdGFuMTAwMyBhdGFuIC1pbmYgMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithdGFuMTAwNCBhdGFuIC1pbmYgMi4yOTk5OTk5OTk5OTk5OTk4IC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithdGFuMTAwNSBhdGFuIG5hbiAyLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbgorYXRhbjEwMDYgYXRhbiAtMC4wIGluZiAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjEwMDcgYXRhbiAtMi4yOTk5OTk5OTk5OTk5OTk4IGluZiAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjEwMDggYXRhbiAtaW5mIGluZiAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjEwMDkgYXRhbiBuYW4gaW5mIC0+IG5hbiAwLjAKK2F0YW4xMDEwIGF0YW4gLTAuMCBuYW4gLT4gbmFuIG5hbgorYXRhbjEwMTEgYXRhbiAtMi4yOTk5OTk5OTk5OTk5OTk4IG5hbiAtPiBuYW4gbmFuCithdGFuMTAxMiBhdGFuIC1pbmYgbmFuIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgMC4wIGlnbm9yZS1pbWFnLXNpZ24KK2F0YW4xMDEzIGF0YW4gbmFuIG5hbiAtPiBuYW4gbmFuCithdGFuMTAxNCBhdGFuIDAuMCAwLjAgLT4gMC4wIDAuMAorYXRhbjEwMTUgYXRhbiAwLjAgMS4wIC0+IDAuMCBpbmYgZGl2aWRlLWJ5LXplcm8KK2F0YW4xMDE2IGF0YW4gaW5mIDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithdGFuMTAxNyBhdGFuIGluZiAyLjI5OTk5OTk5OTk5OTk5OTggLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjEwMTggYXRhbiAwLjAgaW5mIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2F0YW4xMDE5IGF0YW4gMi4yOTk5OTk5OTk5OTk5OTk4IGluZiAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithdGFuMTAyMCBhdGFuIGluZiBpbmYgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjEwMjEgYXRhbiAwLjAgbmFuIC0+IG5hbiBuYW4KK2F0YW4xMDIyIGF0YW4gMi4yOTk5OTk5OTk5OTk5OTk4IG5hbiAtPiBuYW4gbmFuCithdGFuMTAyMyBhdGFuIGluZiBuYW4gLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMCBpZ25vcmUtaW1hZy1zaWduCithdGFuMTAyNCBhdGFuIDAuMCAtMC4wIC0+IDAuMCAtMC4wCithdGFuMTAyNSBhdGFuIG5hbiAtMC4wIC0+IG5hbiAtMC4wCithdGFuMTAyNiBhdGFuIDAuMCAtMS4wIC0+IDAuMCAtaW5mIGRpdmlkZS1ieS16ZXJvCithdGFuMTAyNyBhdGFuIGluZiAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithdGFuMTAyOCBhdGFuIGluZiAtMi4yOTk5OTk5OTk5OTk5OTk4IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithdGFuMTAyOSBhdGFuIG5hbiAtMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4KK2F0YW4xMDMwIGF0YW4gMC4wIC1pbmYgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2F0YW4xMDMxIGF0YW4gMi4yOTk5OTk5OTk5OTk5OTk4IC1pbmYgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2F0YW4xMDMyIGF0YW4gaW5mIC1pbmYgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2F0YW4xMDMzIGF0YW4gbmFuIC1pbmYgLT4gbmFuIC0wLjAKK2F0YW4xMDM0IGF0YW4gLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorYXRhbjEwMzUgYXRhbiAtMC4wIC0xLjAgLT4gLTAuMCAtaW5mIGRpdmlkZS1ieS16ZXJvCithdGFuMTAzNiBhdGFuIC1pbmYgLTAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2F0YW4xMDM3IGF0YW4gLWluZiAtMi4yOTk5OTk5OTk5OTk5OTk4IC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorYXRhbjEwMzggYXRhbiAtMC4wIC1pbmYgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithdGFuMTAzOSBhdGFuIC0yLjI5OTk5OTk5OTk5OTk5OTggLWluZiAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2F0YW4xMDQwIGF0YW4gLWluZiAtaW5mIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gYXRhbmg6IEludmVyc2UgaHlwZXJib2xpYyB0YW5nZW50IC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gemVyb3MKK2F0YW5oMDAwMCBhdGFuaCAwLjAgMC4wIC0+IDAuMCAwLjAKK2F0YW5oMDAwMSBhdGFuaCAwLjAgLTAuMCAtPiAwLjAgLTAuMAorYXRhbmgwMDAyIGF0YW5oIC0wLjAgMC4wIC0+IC0wLjAgMC4wCithdGFuaDAwMDMgYXRhbmggLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorCistLSB2YWx1ZXMgYWxvbmcgYm90aCBzaWRlcyBvZiByZWFsIGF4aXMKK2F0YW5oMDAxMCBhdGFuaCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wIC0+IC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAKK2F0YW5oMDAxMSBhdGFuaCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMCAtPiAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMAorYXRhbmgwMDEyIGF0YW5oIC0xZS0zMDUgMC4wIC0+IC0xZS0zMDUgMC4wCithdGFuaDAwMTMgYXRhbmggLTFlLTMwNSAtMC4wIC0+IC0xZS0zMDUgLTAuMAorYXRhbmgwMDE0IGF0YW5oIC0xZS0xNTAgMC4wIC0+IC0xZS0xNTAgMC4wCithdGFuaDAwMTUgYXRhbmggLTFlLTE1MCAtMC4wIC0+IC0xZS0xNTAgLTAuMAorYXRhbmgwMDE2IGF0YW5oIC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IDAuMCAtPiAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAKK2F0YW5oMDAxNyBhdGFuaCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMC4wIC0+IC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0wLjAKK2F0YW5oMDAxOCBhdGFuaCAtMC4wMDEgMC4wIC0+IC0wLjAwMTAwMDAwMDMzMzMzMzUzMzMgMC4wCithdGFuaDAwMTkgYXRhbmggLTAuMDAxIC0wLjAgLT4gLTAuMDAxMDAwMDAwMzMzMzMzNTMzMyAtMC4wCithdGFuaDAwMjAgYXRhbmggLTAuNTc4OTk5OTk5OTk5OTk5OTYgMC4wIC0+IC0wLjY2MDk1NzA5MDI4NjYzMDMgMC4wCithdGFuaDAwMjEgYXRhbmggLTAuNTc4OTk5OTk5OTk5OTk5OTYgLTAuMCAtPiAtMC42NjA5NTcwOTAyODY2MzAzIC0wLjAKK2F0YW5oMDAyMiBhdGFuaCAtMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAgLT4gLTE4LjcxNDk3Mzg3NTExODUyNCAwLjAKK2F0YW5oMDAyMyBhdGFuaCAtMC45OTk5OTk5OTk5OTk5OTk4OSAtMC4wIC0+IC0xOC43MTQ5NzM4NzUxMTg1MjQgLTAuMAorYXRhbmgwMDI0IGF0YW5oIC0xLjAwMDAwMDAwMDAwMDAwMDIgMC4wIC0+IC0xOC4zNjg0MDAyODQ4Mzg1NSAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDAyNSBhdGFuaCAtMS4wMDAwMDAwMDAwMDAwMDAyIC0wLjAgLT4gLTE4LjM2ODQwMDI4NDgzODU1IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDAyNiBhdGFuaCAtMS4wMDA5OTk5OTk5OTk5OTk5IDAuMCAtPiAtMy44MDA3MDExNjcyOTE5MjE4IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDI3IGF0YW5oIC0xLjAwMDk5OTk5OTk5OTk5OTkgLTAuMCAtPiAtMy44MDA3MDExNjcyOTE5MjE4IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDAyOCBhdGFuaCAtMi4wIDAuMCAtPiAtMC41NDkzMDYxNDQzMzQwNTQ4OSAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDAyOSBhdGFuaCAtMi4wIC0wLjAgLT4gLTAuNTQ5MzA2MTQ0MzM0MDU0ODkgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDMwIGF0YW5oIC0yMy4wIDAuMCAtPiAtMC4wNDM1MDU2ODg0OTQ4MTQ4ODQgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwMzEgYXRhbmggLTIzLjAgLTAuMCAtPiAtMC4wNDM1MDU2ODg0OTQ4MTQ4ODQgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDMyIGF0YW5oIC0xMDAwMDAwMDAwMDAwMDAwMC4wIDAuMCAtPiAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDAzMyBhdGFuaCAtMTAwMDAwMDAwMDAwMDAwMDAuMCAtMC4wIC0+IC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDAzNCBhdGFuaCAtOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgMC4wIC0+IC0xZS0xNTAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwMzUgYXRhbmggLTkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0wLjAgLT4gLTFlLTE1MCAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwMzYgYXRhbmggLTEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IDAuMCAtPiAtOS45OTk5OTk5OTk5OTk5OTk5ZS0zMDAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwMzcgYXRhbmggLTEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0wLjAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OWUtMzAwIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDAzOCBhdGFuaCA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAgLT4gOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wCithdGFuaDAwMzkgYXRhbmggOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMCAtPiA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtMC4wCithdGFuaDAwNDAgYXRhbmggMWUtMzA1IDAuMCAtPiAxZS0zMDUgMC4wCithdGFuaDAwNDEgYXRhbmggMWUtMzA1IC0wLjAgLT4gMWUtMzA1IC0wLjAKK2F0YW5oMDA0MiBhdGFuaCAxZS0xNTAgMC4wIC0+IDFlLTE1MCAwLjAKK2F0YW5oMDA0MyBhdGFuaCAxZS0xNTAgLTAuMCAtPiAxZS0xNTAgLTAuMAorYXRhbmgwMDQ0IGF0YW5oIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMC4wIC0+IDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMC4wCithdGFuaDAwNDUgYXRhbmggOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMC4wIC0+IDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMAorYXRhbmgwMDQ2IGF0YW5oIDAuMDAxIDAuMCAtPiAwLjAwMTAwMDAwMDMzMzMzMzUzMzMgMC4wCithdGFuaDAwNDcgYXRhbmggMC4wMDEgLTAuMCAtPiAwLjAwMTAwMDAwMDMzMzMzMzUzMzMgLTAuMAorYXRhbmgwMDQ4IGF0YW5oIDAuNTc4OTk5OTk5OTk5OTk5OTYgMC4wIC0+IDAuNjYwOTU3MDkwMjg2NjMwMyAwLjAKK2F0YW5oMDA0OSBhdGFuaCAwLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gMC42NjA5NTcwOTAyODY2MzAzIC0wLjAKK2F0YW5oMDA1MCBhdGFuaCAwLjk5OTk5OTk5OTk5OTk5OTg5IDAuMCAtPiAxOC43MTQ5NzM4NzUxMTg1MjQgMC4wCithdGFuaDAwNTEgYXRhbmggMC45OTk5OTk5OTk5OTk5OTk4OSAtMC4wIC0+IDE4LjcxNDk3Mzg3NTExODUyNCAtMC4wCithdGFuaDAwNTIgYXRhbmggMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiAxOC4zNjg0MDAyODQ4Mzg1NSAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDA1MyBhdGFuaCAxLjAwMDAwMDAwMDAwMDAwMDIgLTAuMCAtPiAxOC4zNjg0MDAyODQ4Mzg1NSAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwNTQgYXRhbmggMS4wMDA5OTk5OTk5OTk5OTk5IDAuMCAtPiAzLjgwMDcwMTE2NzI5MTkyMTggMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwNTUgYXRhbmggMS4wMDA5OTk5OTk5OTk5OTk5IC0wLjAgLT4gMy44MDA3MDExNjcyOTE5MjE4IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDA1NiBhdGFuaCAyLjAgMC4wIC0+IDAuNTQ5MzA2MTQ0MzM0MDU0ODkgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwNTcgYXRhbmggMi4wIC0wLjAgLT4gMC41NDkzMDYxNDQzMzQwNTQ4OSAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwNTggYXRhbmggMjMuMCAwLjAgLT4gMC4wNDM1MDU2ODg0OTQ4MTQ4ODQgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwNTkgYXRhbmggMjMuMCAtMC4wIC0+IDAuMDQzNTA1Njg4NDk0ODE0ODg0IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDA2MCBhdGFuaCAxMDAwMDAwMDAwMDAwMDAwMC4wIDAuMCAtPiA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDYxIGF0YW5oIDEwMDAwMDAwMDAwMDAwMDAwLjAgLTAuMCAtPiA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDA2MiBhdGFuaCA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAwLjAgLT4gMWUtMTUwIDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDYzIGF0YW5oIDkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0wLjAgLT4gMWUtMTUwIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDA2NCBhdGFuaCAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gOS45OTk5OTk5OTk5OTk5OTk5ZS0zMDAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwNjUgYXRhbmggMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLTAuMCAtPiA5Ljk5OTk5OTk5OTk5OTk5OTllLTMwMCAtMS41NzA3OTYzMjY3OTQ4OTY2CisKKy0tIHJhbmRvbSBpbnB1dHMKK2F0YW5oMDEwMCBhdGFuaCAtMC41NDQ2MDkyNTk4MDYzMzUwMSAtMC41NDAzODA1MDEyNjcyMTAyNyAtPiAtMC40MTk4NDI2NTgwODQ0Njk3NCAtMC42MDM1NDE1MzkzODM1MjgyOAorYXRhbmgwMTAxIGF0YW5oIC0xLjY5MzQ2MTQyNjk4MjkwNTEgLTAuNDg4MDczODYxMDgxMTM2MjEgLT4gLTAuNTg1OTI3NjkxMDIyNDMyODEgLTEuMzUzNzgzNzQ3MDk3NTg5OAorYXRhbmgwMTAyIGF0YW5oIC0xLjM0NjcyOTM5ODU1MDEyMDcgLTAuNDc4NjgzNTQ4OTUzOTU4NzYgLT4gLTAuNjk5NjE2MjQzNzA3MDk5ODUgLTEuMTk5NDQ1MDE1NjU3MDA3NgorYXRhbmgwMTAzIGF0YW5oIC01LjYxNDIyMzI0MTg5ODQ4ODggLTU0NDU1MTYxMy4zOTMwNzcwMiAtPiAtMS44OTMyNjU3NTUwOTI1NzQ0ZS0xNyAtMS41NzA3OTYzMjQ5NTg1MjM1CithdGFuaDAxMDQgYXRhbmggLTAuMDExODQxNDYwMzgxMjYzNjUxIC0zLjI1OTk3ODg5OTgyMzM4NSAtPiAtMC4wMDEwMTgzOTM2NTQ3NDA1MTg4IC0xLjI3MzE2MTQwMjA3NDM4MzgKK2F0YW5oMDEwNSBhdGFuaCAtMC4wMDczMzQ1NzM2OTUwMDI5NTMyIDAuMzU4MjE5NDk2NzA5MjIyNDggLT4gLTAuMDA2NTAwNDg2OTAyNDY4MjQ2NiAwLjM0Mzk5MzU5OTcxOTIwODk1CithdGFuaDAxMDYgYXRhbmggLTEzLjg2Njc4MjI0NDMyMDAxNCAwLjk1NDExMjk1NDU4NjAyNzMgLT4gLTAuMDcxODk2ODUyMDU1MDU4ODk5IDEuNTY1ODMyMjcwNDYzMTQwOQorYXRhbmgwMTA3IGF0YW5oIC03MDguNTk5NjQ5ODI3ODA3NzUgMjEuOTg0ODAyMTU5MjY2Njc1IC0+IC0wLjAwMTQwOTg3NzkwNzQxODk3NDEgMS41NzA3NTI1ODQyODM4OTU5CithdGFuaDAxMDggYXRhbmggLTMwLjkxNjgzMjA3NjAzMDYwMiAxLjM2OTE4OTcxMzg4Mjk4NDMgLT4gLTAuMDMyMjkyNjgyMDQ1NzQzNjc2IDEuNTY5MzY1MjA5NDg0NzExNQorYXRhbmgwMTA5IGF0YW5oIC0wLjU3NDYxODA2MzM5ODYxNzU0IDAuMjk1MzQ3OTc0NDM5MTMwNjMgLT4gLTAuNTY0Njc0NjQ0NzI0ODI3NjUgMC4zOTYxNTYxMjgyNDE3MjYyNQorYXRhbmgwMTEwIGF0YW5oIDAuNDAwODkyNDY3Mzc0MTU2ODUgLTEuNjMyMjg1OTg0MzAwNjU5IC0+IDAuMTA2MzgzMjcwNzg5MDYwOCAtMS4wNDAyODIxMzM1MzI2NDgyCithdGFuaDAxMTEgYXRhbmggMjExOS42MTY3Njg4MjYyMTc2IC0xLjUzODM2NTM0MzczNzcyNDJlKzE3IC0+IDguOTU2NTAwODUxODM4MjA0OWUtMzIgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMTEyIGF0YW5oIDc1Ni44NjAxNzg1MDk0MTY0MSAtNi42MDY0MDg3MTMzMjIzODE3IC0+IDAuMDAxMzIxMTQ4MTEzNjgyMDA0NiAtMS41NzA3ODQ3OTQ4NzAyMjM0CithdGFuaDAxMTMgYXRhbmggNC4wNDkwNjE3NzE4MDQxNjAyIC0yLjU3ODQ0NTY3OTEwNDA2NTJlLTEyIC0+IDAuMjUyMTg0MjU1Mzg1NTM2MTggLTEuNTcwNzk2MzI2Nzk0NzI5MQorYXRhbmgwMTE0IGF0YW5oIDEwLjU4OTI1NDk1NzE3MzUyMyAtMC4xMzk1NjM5MTE0OTYyNDUwOSAtPiAwLjA5NDcwMDg5MDI4MjE5NzY2NCAtMS41Njk1NDA3MTQwMjE3NjIzCithdGFuaDAxMTUgYXRhbmggMS4wMTcxMTg3NTUzMTYwNDk5IDAuNzA3NjYxMTM0NjUzNTQwMTkgLT4gMC41NTI2MDI1MTk3NTM2Nzc5MSAwLjk2NjE5NzExMTE2NjQxNjgyCithdGFuaDAxMTYgYXRhbmggMC4wMzE2NDU1MDI1Mjc3NTA4NDkgMC4wNjczMTk5ODM3MjY1NDQzOTQgLT4gMC4wMzE1MTMwMTgzNDQwODY3NDIgMC4wNjcyODU0Mzc2NzA1NDkwMzYKK2F0YW5oMDExNyBhdGFuaCAwLjEzNjcwMTc3NjI0OTk0NTE3IDAuNDMyNDAwODkzNjE4NTc5NDcgLT4gMC4xMTUzODkzMzE1MTAxNzI1MyAwLjQxMzkyMDA4MTQ1MzM2MjEyCithdGFuaDAxMTggYXRhbmggMC42NDE3Mzg5OTI0MzU5NjY4OCAyLjkwMDg1Nzc2ODY2OTUyNTYgLT4gMC4wNjU2ODAxNDI0MjQxMzQ0MDUgMS4yNTE4NTM1NzI0MDUzOTIxCithdGFuaDAxMTkgYXRhbmggMC4xOTMxMzgxMzUyODAyNTk0MiAzOC43OTk2MTkxNTA3NDE4NjkgLT4gMC4wMDAxMjgyMDc2NTkxNzM2NjY0NCAxLjU0NTAyOTIyMDI4MjM2MTIKKworLS0gdmFsdWVzIG5lYXIgaW5maW5pdHkKK2F0YW5oMDIwMCBhdGFuaCA1LjMyNDI2NDY4MzEzNDc5NTRlKzMwNyAxLjM3NDAzOTYwODAwODQxNTNlKzMwOCAtPiAyLjQ1MTkyNTM2MTY2OTU1NzZlLTMwOSAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIwMSBhdGFuaCAxLjE1ODcwMTY0MTI0MTM1OGUrMzA4IC02LjU1NzkyNjg4NzMzNzU4NTNlKzMwNyAtPiA2LjUzNjUzNzUyNjc3OTUwOThlLTMwOSAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMDIgYXRhbmggLTEuMzQzNTMyNTczNTc2MjI0N2UrMzA4IDkuODk0NzM2OTI1OTYwMTU0N2UrMzA3IC0+IC00LjgyNTY2ODA5MDY1ODk5NTZlLTMwOSAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIwMyBhdGFuaCAtMS40MzU5ODU3NTIyNTk4OTQyZSszMDggLTkuNDcwMTIwNDcwMjM5MTAwNGUrMzA3IC0+IC00Ljg1MzEyODIyNjI4NzI2NDVlLTMwOSAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMDQgYXRhbmggMC4wIDUuNjYxNDE4MTA2ODA5ODQ5N2UrMzA3IC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIwNSBhdGFuaCAtMC4wIDYuOTgxMzIxMjcyMTQ1MDEzOWUrMzA3IC0+IC0wLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMDYgYXRhbmggMC4wIC03LjQ5NzA2MTMwNjAzMTE0NTNlKzMwNyAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMjA3IGF0YW5oIC0wLjAgLTEuNTI4MDYwMTg4MDMxNDA2OGUrMzA4IC0+IC0wLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMjA4IGF0YW5oIDguMjIxOTQ3MjMzNjAwMDc0NWUrMzA3IDAuMCAtPiAxLjIxNjI1Njg5MzM5NTQ4MTNlLTMwOCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIwOSBhdGFuaCAxLjQ4MTE1MTk2MTcyODA4OTllKzMwOCAtMC4wIC0+IDYuNzUxNTAxNzA4Mzk1MTMyNWUtMzA5IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIxMCBhdGFuaCAtMS4yMjgyMDE2MjYzNTk4Nzg1ZSszMDggMC4wIC0+IC04LjE0MTk4NTYzNjA1Mzc2MTVlLTMwOSAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIxMSBhdGFuaCAtMS4wNjE2NDI3NzYwMTU0NDI2ZSszMDggLTAuMCAtPiAtOS40MTkzNjQyMzk5NDg5NTYzZS0zMDkgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMjEyIGF0YW5oIDEuMjk3MTUzNjUxMDE4MDY4MmUrMzA4IDUuMjg0Nzk0ODQ1MjMzMzI5MyAtPiA3LjcwOTE4Njk1MTA5OTgzMjhlLTMwOSAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIxMyBhdGFuaCAxLjE4NDk4NjA5Nzc0MTE4NTFlKzMwOCAtNy45NzgxOTA2NDQ3NDU5OTQ5IC0+IDguNDM4OTE3NTY5NjMzOTAxNGUtMzA5IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIxNCBhdGFuaCAtMS40MDI5OTY5NDIyNTg2NjM1ZSszMDggMC45Mzg5MTk4NjU0MzY2MzM3NSAtPiAtNy4xMjc1OTkyODMyMTgwNzNlLTMwOSAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIxNSBhdGFuaCAtNC43NTA4MDk4OTEyMjQ4MjExZSszMDcgLTguMjcwMjQyMTI0NzAzOTkwOCAtPiAtMi4xMDQ5MDQyNjQ1Mjc4MDQzZS0zMDggLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMjE2IGF0YW5oIDguMjY4MDc0MjExNTc2OTk5OCA4LjExNTM4OTg0MTA5MTgwNjVlKzMwNyAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMTcgYXRhbmggMS4yNTc1MzI1MTQ2MjE4ODg1IC0xLjQ3NDY2NzkxNDc2NjE2NDllKzMwOCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMjE4IGF0YW5oIC0yLjQ2MTg4MDM2ODIzMTA4OTkgMS4zNzgxNTIyNzE3MDA1NTY4ZSszMDggLT4gLTAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIxOSBhdGFuaCAtNC4wOTUyMzg2Njk0Nzg4MTEyIC0xLjIzMTA4MzM3NjM1MzcwM2UrMzA4IC0+IC0wLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorCistLSB2YWx1ZXMgbmVhciAwCithdGFuaDAyMjAgYXRhbmggMy44MDE3NTYzNjU5ODExNjI4ZS0zMTQgMi42NjM1NDg0MjM5MDc0MzE5ZS0zMTIgLT4gMy44MDE3NTYzNjU5ODExNjI4ZS0zMTQgMi42NjM1NDg0MjM5MDc0MzE5ZS0zMTIKK2F0YW5oMDIyMSBhdGFuaCAxLjczOTExMTA3MzM2MTE4NzhlLTMyMSAtNC4zNTQ3ODAwNjcyNTQxNDE5ZS0zMTMgLT4gMS43MzkxMTEwNzMzNjExODc4ZS0zMjEgLTQuMzU0NzgwMDY3MjU0MTQxOWUtMzEzCithdGFuaDAyMjIgYXRhbmggLTUuOTY1NjgxNjA4MTMyNTA3OGUtMzE3IDkuOTY5MjI1MzU1NTQxNjI2M2UtMzEzIC0+IC01Ljk2NTY4MTYwODEzMjUwNzhlLTMxNyA5Ljk2OTIyNTM1NTU0MTYyNjNlLTMxMworYXRhbmgwMjIzIGF0YW5oIC02LjU2MDY2NzExNzg0MDAyMzllLTMxMyAtMi4xNjgwOTM2NDA2MzU3MzM1ZS0zMDkgLT4gLTYuNTYwNjY3MTE3ODQwMDIzOWUtMzEzIC0yLjE2ODA5MzY0MDYzNTczMzVlLTMwOQorYXRhbmgwMjI0IGF0YW5oIDAuMCAyLjUyMzA5NDQ0MDE4MjA3NzllLTMxOSAtPiAwLjAgMi41MjMwOTQ0NDAxODIwNzc5ZS0zMTkKK2F0YW5oMDIyNSBhdGFuaCAtMC4wIDUuNjA2NjU2OTQ5MDA2NDY1OGUtMzIwIC0+IC0wLjAgNS42MDY2NTY5NDkwMDY0NjU4ZS0zMjAKK2F0YW5oMDIyNiBhdGFuaCAwLjAgLTIuNDIyMjQ4NzI0OTQ2ODM3N2UtMzE3IC0+IDAuMCAtMi40MjIyNDg3MjQ5NDY4Mzc3ZS0zMTcKK2F0YW5oMDIyNyBhdGFuaCAtMC4wIC0zLjA4NjExMDEwODkyMDYwMzdlLTMxNiAtPiAtMC4wIC0zLjA4NjExMDEwODkyMDYwMzdlLTMxNgorYXRhbmgwMjI4IGF0YW5oIDMuMTIxOTIyMjg4NDM5Mzk4NmUtMzEwIDAuMCAtPiAzLjEyMTkyMjI4ODQzOTM5ODZlLTMxMCAwLjAKK2F0YW5oMDIyOSBhdGFuaCA5Ljg5MjYzMzc1NjQ5NzYxOTZlLTMwOSAtMC4wIC0+IDkuODkyNjMzNzU2NDk3NjE5NmUtMzA5IC0wLjAKK2F0YW5oMDIzMCBhdGFuaCAtMS41NDYyNTM1MDkyOTE4MTU0ZS0zMTIgMC4wIC0+IC0xLjU0NjI1MzUwOTI5MTgxNTRlLTMxMiAwLjAKK2F0YW5oMDIzMSBhdGFuaCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMCAtPiAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMAorCistLSByZWFsIHBhcnQgPSArLy0xLCBpbWFnaW5hcnkgcGFydCB0aW55CithdGFuaDAzMDAgYXRhbmggMS4wIDFlLTE1MyAtPiAxNzYuNDk0MzMzMjA0MzI0NDggMC43ODUzOTgxNjMzOTc0NDgyOAorYXRhbmgwMzAxIGF0YW5oIDEuMCA5Ljk5OTk5OTk5OTk5OTk5OTdlLTE1NSAtPiAxNzcuNjQ1NjI1NzUwODIxNDkgMC43ODUzOTgxNjMzOTc0NDgyOAorYXRhbmgwMzAyIGF0YW5oIC0xLjAgMWUtMTYxIC0+IC0xODUuNzA0NjczNTc2MzAwNjUgMC43ODUzOTgxNjMzOTc0NDgyOAorYXRhbmgwMzAzIGF0YW5oIDEuMCAtMWUtMTY1IC0+IDE5MC4zMDk4NDM3NjIyODg3NSAtMC43ODUzOTgxNjMzOTc0NDgyOAorYXRhbmgwMzA0IGF0YW5oIC0xLjAgLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0+IC0zNzIuMjIwMDM1OTYwNjkwNjEgLTAuNzg1Mzk4MTYzMzk3NDQ4MjgKKworLS0gc3BlY2lhbCB2YWx1ZXMKK2F0YW5oMTAwMCBhdGFuaCAwLjAgMC4wIC0+IDAuMCAwLjAKK2F0YW5oMTAwMSBhdGFuaCAwLjAgbmFuIC0+IDAuMCBuYW4KK2F0YW5oMTAwMiBhdGFuaCAxLjAgMC4wIC0+IGluZiAwLjAgICAgICAgICAgICAgICAgICAgICAgZGl2aWRlLWJ5LXplcm8KK2F0YW5oMTAwMyBhdGFuaCAwLjAgaW5mIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAwNCBhdGFuaCAyLjMgaW5mIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAwNSBhdGFuaCAyLjMgbmFuIC0+IG5hbiBuYW4KK2F0YW5oMTAwNiBhdGFuaCBpbmYgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAwNyBhdGFuaCBpbmYgMi4zIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAwOCBhdGFuaCBpbmYgaW5mIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAwOSBhdGFuaCBpbmYgbmFuIC0+IDAuMCBuYW4KK2F0YW5oMTAxMCBhdGFuaCBuYW4gMC4wIC0+IG5hbiBuYW4KK2F0YW5oMTAxMSBhdGFuaCBuYW4gMi4zIC0+IG5hbiBuYW4KK2F0YW5oMTAxMiBhdGFuaCBuYW4gaW5mIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYgICAgICAgaWdub3JlLXJlYWwtc2lnbgorYXRhbmgxMDEzIGF0YW5oIG5hbiBuYW4gLT4gbmFuIG5hbgorYXRhbmgxMDE0IGF0YW5oIDAuMCAtMC4wIC0+IDAuMCAtMC4wCithdGFuaDEwMTUgYXRhbmggMS4wIC0wLjAgLT4gaW5mIC0wLjAgICAgICAgICAgICAgICAgICAgIGRpdmlkZS1ieS16ZXJvCithdGFuaDEwMTYgYXRhbmggMC4wIC1pbmYgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAxNyBhdGFuaCAyLjMgLWluZiAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgxMDE4IGF0YW5oIGluZiAtMC4wIC0+IDAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMTkgYXRhbmggaW5mIC0yLjMgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAyMCBhdGFuaCBpbmYgLWluZiAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgxMDIxIGF0YW5oIG5hbiAtMC4wIC0+IG5hbiBuYW4KK2F0YW5oMTAyMiBhdGFuaCBuYW4gLTIuMyAtPiBuYW4gbmFuCithdGFuaDEwMjMgYXRhbmggbmFuIC1pbmYgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYgICAgIGlnbm9yZS1yZWFsLXNpZ24KK2F0YW5oMTAyNCBhdGFuaCAtMC4wIC0wLjAgLT4gLTAuMCAtMC4wCithdGFuaDEwMjUgYXRhbmggLTAuMCBuYW4gLT4gLTAuMCBuYW4KK2F0YW5oMTAyNiBhdGFuaCAtMS4wIC0wLjAgLT4gLWluZiAtMC4wICAgICAgICAgICAgICAgICAgZGl2aWRlLWJ5LXplcm8KK2F0YW5oMTAyNyBhdGFuaCAtMC4wIC1pbmYgLT4gLTAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMjggYXRhbmggLTIuMyAtaW5mIC0+IC0wLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgxMDI5IGF0YW5oIC0yLjMgbmFuIC0+IG5hbiBuYW4KK2F0YW5oMTAzMCBhdGFuaCAtaW5mIC0wLjAgLT4gLTAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMzEgYXRhbmggLWluZiAtMi4zIC0+IC0wLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgxMDMyIGF0YW5oIC1pbmYgLWluZiAtPiAtMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAzMyBhdGFuaCAtaW5mIG5hbiAtPiAtMC4wIG5hbgorYXRhbmgxMDM0IGF0YW5oIC0wLjAgMC4wIC0+IC0wLjAgMC4wCithdGFuaDEwMzUgYXRhbmggLTEuMCAwLjAgLT4gLWluZiAwLjAgICAgICAgICAgICAgICAgICAgIGRpdmlkZS1ieS16ZXJvCithdGFuaDEwMzYgYXRhbmggLTAuMCBpbmYgLT4gLTAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAzNyBhdGFuaCAtMi4zIGluZiAtPiAtMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgxMDM4IGF0YW5oIC1pbmYgMC4wIC0+IC0wLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMzkgYXRhbmggLWluZiAyLjMgLT4gLTAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTA0MCBhdGFuaCAtaW5mIGluZiAtPiAtMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGxvZzogTmF0dXJhbCBsb2dhcml0aG0gLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbG9nMDAwMCBsb2cgMS4wIDAuMCAtPiAwLjAgMC4wCitsb2cwMDAxIGxvZyAxLjAgLTAuMCAtPiAwLjAgLTAuMAorbG9nMDAwMiBsb2cgLTEuMCAwLjAgLT4gMC4wIDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAwMyBsb2cgLTEuMCAtMC4wIC0+IDAuMCAtMy4xNDE1OTI2NTM1ODk3OTMxCistLSB2YWx1ZXMgYWxvbmcgYm90aCBzaWRlcyBvZiByZWFsIGF4aXMKK2xvZzAwMTAgbG9nIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAgLT4gLTc0My43NDY5MjQ3NDA4MjEzMyAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMTEgbG9nIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtMC4wIC0+IC03NDMuNzQ2OTI0NzQwODIxMzMgLTMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAxMiBsb2cgLTFlLTMwNSAwLjAgLT4gLTcwMi4yODg0NTMzNjMxODM5OCAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMTMgbG9nIC0xZS0zMDUgLTAuMCAtPiAtNzAyLjI4ODQ1MzM2MzE4Mzk4IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMTQgbG9nIC0xZS0xNTAgMC4wIC0+IC0zNDUuMzg3NzYzOTQ5MTA2ODQgMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDE1IGxvZyAtMWUtMTUwIC0wLjAgLT4gLTM0NS4zODc3NjM5NDkxMDY4NCAtMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDE2IGxvZyAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gLTM2Ljg0MTM2MTQ4NzkwNDczNCAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMTcgbG9nIC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0wLjAgLT4gLTM2Ljg0MTM2MTQ4NzkwNDczNCAtMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDE4IGxvZyAtMC4wMDEgMC4wIC0+IC02LjkwNzc1NTI3ODk4MjEzNjggMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDE5IGxvZyAtMC4wMDEgLTAuMCAtPiAtNi45MDc3NTUyNzg5ODIxMzY4IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMjAgbG9nIC0wLjU3ODk5OTk5OTk5OTk5OTk2IDAuMCAtPiAtMC41NDY0NTI4MDE0MDkxNDE4OCAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMjEgbG9nIC0wLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gLTAuNTQ2NDUyODAxNDA5MTQxODggLTMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAyMiBsb2cgLTAuOTk5OTk5OTk5OTk5OTk5ODkgMC4wIC0+IC0xLjExMDIyMzAyNDYyNTE1NjVlLTE2IDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAyMyBsb2cgLTAuOTk5OTk5OTk5OTk5OTk5ODkgLTAuMCAtPiAtMS4xMTAyMjMwMjQ2MjUxNTY1ZS0xNiAtMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDI0IGxvZyAtMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiAyLjIyMDQ0NjA0OTI1MDMxMjhlLTE2IDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAyNSBsb2cgLTEuMDAwMDAwMDAwMDAwMDAwMiAtMC4wIC0+IDIuMjIwNDQ2MDQ5MjUwMzEyOGUtMTYgLTMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAyNiBsb2cgLTEuMDAwOTk5OTk5OTk5OTk5OSAwLjAgLT4gMC4wMDA5OTk1MDAzMzMwODM0MjMyMSAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMjcgbG9nIC0xLjAwMDk5OTk5OTk5OTk5OTkgLTAuMCAtPiAwLjAwMDk5OTUwMDMzMzA4MzQyMzIxIC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMjggbG9nIC0yLjAgMC4wIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MjkgMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDI5IGxvZyAtMi4wIC0wLjAgLT4gMC42OTMxNDcxODA1NTk5NDUyOSAtMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDMwIGxvZyAtMjMuMCAwLjAgLT4gMy4xMzU0OTQyMTU5MjkxNDk3IDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAzMSBsb2cgLTIzLjAgLTAuMCAtPiAzLjEzNTQ5NDIxNTkyOTE0OTcgLTMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAzMiBsb2cgLTEwMDAwMDAwMDAwMDAwMDAwLjAgMC4wIC0+IDM2Ljg0MTM2MTQ4NzkwNDczNCAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMzMgbG9nIC0xMDAwMDAwMDAwMDAwMDAwMC4wIC0wLjAgLT4gMzYuODQxMzYxNDg3OTA0NzM0IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMzQgbG9nIC05Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAwLjAgLT4gMzQ1LjM4Nzc2Mzk0OTEwNjg0IDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAzNSBsb2cgLTkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0wLjAgLT4gMzQ1LjM4Nzc2Mzk0OTEwNjg0IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMzYgbG9nIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gNjg4LjQ3Mjk0MjgwNTIxOTY1IDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAzNyBsb2cgLTEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0wLjAgLT4gNjg4LjQ3Mjk0MjgwNTIxOTY1IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMzggbG9nIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IDAuMCAtPiAtNzQzLjc0NjkyNDc0MDgyMTMzIDAuMAorbG9nMDAzOSBsb2cgOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMCAtPiAtNzQzLjc0NjkyNDc0MDgyMTMzIC0wLjAKK2xvZzAwNDAgbG9nIDFlLTMwNSAwLjAgLT4gLTcwMi4yODg0NTMzNjMxODM5OCAwLjAKK2xvZzAwNDEgbG9nIDFlLTMwNSAtMC4wIC0+IC03MDIuMjg4NDUzMzYzMTgzOTggLTAuMAorbG9nMDA0MiBsb2cgMWUtMTUwIDAuMCAtPiAtMzQ1LjM4Nzc2Mzk0OTEwNjg0IDAuMAorbG9nMDA0MyBsb2cgMWUtMTUwIC0wLjAgLT4gLTM0NS4zODc3NjM5NDkxMDY4NCAtMC4wCitsb2cwMDQ0IGxvZyA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IDAuMCAtPiAtMzYuODQxMzYxNDg3OTA0NzM0IDAuMAorbG9nMDA0NSBsb2cgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMC4wIC0+IC0zNi44NDEzNjE0ODc5MDQ3MzQgLTAuMAorbG9nMDA0NiBsb2cgMC4wMDEgMC4wIC0+IC02LjkwNzc1NTI3ODk4MjEzNjggMC4wCitsb2cwMDQ3IGxvZyAwLjAwMSAtMC4wIC0+IC02LjkwNzc1NTI3ODk4MjEzNjggLTAuMAorbG9nMDA0OCBsb2cgMC41Nzg5OTk5OTk5OTk5OTk5NiAwLjAgLT4gLTAuNTQ2NDUyODAxNDA5MTQxODggMC4wCitsb2cwMDQ5IGxvZyAwLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gLTAuNTQ2NDUyODAxNDA5MTQxODggLTAuMAorbG9nMDA1MCBsb2cgMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAgLT4gLTEuMTEwMjIzMDI0NjI1MTU2NWUtMTYgMC4wCitsb2cwMDUxIGxvZyAwLjk5OTk5OTk5OTk5OTk5OTg5IC0wLjAgLT4gLTEuMTEwMjIzMDI0NjI1MTU2NWUtMTYgLTAuMAorbG9nMDA1MiBsb2cgMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiAyLjIyMDQ0NjA0OTI1MDMxMjhlLTE2IDAuMAorbG9nMDA1MyBsb2cgMS4wMDAwMDAwMDAwMDAwMDAyIC0wLjAgLT4gMi4yMjA0NDYwNDkyNTAzMTI4ZS0xNiAtMC4wCitsb2cwMDU0IGxvZyAxLjAwMDk5OTk5OTk5OTk5OTkgMC4wIC0+IDAuMDAwOTk5NTAwMzMzMDgzNDIzMjEgMC4wCitsb2cwMDU1IGxvZyAxLjAwMDk5OTk5OTk5OTk5OTkgLTAuMCAtPiAwLjAwMDk5OTUwMDMzMzA4MzQyMzIxIC0wLjAKK2xvZzAwNTYgbG9nIDIuMCAwLjAgLT4gMC42OTMxNDcxODA1NTk5NDUyOSAwLjAKK2xvZzAwNTcgbG9nIDIuMCAtMC4wIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MjkgLTAuMAorbG9nMDA1OCBsb2cgMjMuMCAwLjAgLT4gMy4xMzU0OTQyMTU5MjkxNDk3IDAuMAorbG9nMDA1OSBsb2cgMjMuMCAtMC4wIC0+IDMuMTM1NDk0MjE1OTI5MTQ5NyAtMC4wCitsb2cwMDYwIGxvZyAxMDAwMDAwMDAwMDAwMDAwMC4wIDAuMCAtPiAzNi44NDEzNjE0ODc5MDQ3MzQgMC4wCitsb2cwMDYxIGxvZyAxMDAwMDAwMDAwMDAwMDAwMC4wIC0wLjAgLT4gMzYuODQxMzYxNDg3OTA0NzM0IC0wLjAKK2xvZzAwNjIgbG9nIDkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IDAuMCAtPiAzNDUuMzg3NzYzOTQ5MTA2ODQgMC4wCitsb2cwMDYzIGxvZyA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtMC4wIC0+IDM0NS4zODc3NjM5NDkxMDY4NCAtMC4wCitsb2cwMDY0IGxvZyAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gNjg4LjQ3Mjk0MjgwNTIxOTY1IDAuMAorbG9nMDA2NSBsb2cgMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLTAuMCAtPiA2ODguNDcyOTQyODA1MjE5NjUgLTAuMAorCistLSByYW5kb20gaW5wdXRzCitsb2cwMDY2IGxvZyAtMS45ODMwNDU0OTQ1MTg2MTkxZS0xNiAtMi4wMzM0NDQ4MDI1NjczMzQ2IC0+IDAuNzA5NzMxMzAxOTQzMjk4MDMgLTEuNTcwNzk2MzI2Nzk0ODk2OAorbG9nMDA2NyBsb2cgLTAuOTY3NDU4NTMwMjQ3NDE4NTcgLTAuODQ5OTU4MTYyMjgyOTk2OTIgLT4gMC4yNTI5MjgxMTM5ODcyMjM4NyAtMi40MjA3NTcwNDM4NTM2OTA1Citsb2cwMDY4IGxvZyAtMC4xNjAzNjQ0MzEzOTQ4NDE4IC0wLjI5Mjk5NDIxMTEwNDE4MzUgLT4gLTEuMDk2NTg1Nzg3MjQyNzM3NCAtMi4wNzE1ODcwODU5OTcxNDE5Citsb2cwMDY5IGxvZyAtMC4xNTkxNzkxMzE2ODQzODY5OSAtMC4yNTIzODc5OTI1MTEzMjE3NyAtPiAtMS4yMDkzNDc3MzEzMjQ5OTAxIC0yLjEzMzQ3ODQyMzIwMzM4NjMKK2xvZzAwNzAgbG9nIC0wLjY4OTA3ODE4NTM1MDc4ODAyIC0zLjA2OTMxMDU4NTM0NzYzNDYgLT4gMS4xNDYwMzk4NjI5MTg0NTY1IC0xLjc5MTY0MDM4MTM5MTMyMTEKK2xvZzAwNzEgbG9nIC0xNy4yNjgxMzM0NDc1NjU1ODkgNi44MTY1MTIwMDE0NjA0NzU2IC0+IDIuOTIxMjY5NDQ2NTk3NDgzNiAyLjc2NTYyNDUwODE2MDMxNjQKK2xvZzAwNzIgbG9nIC0xLjcxNTM4OTQ0Nzk2OTAzMjggMjYuNDM0MDU1MzcyODAyNjM2IC0+IDMuMjc2NzU0Mjk1MzcxODAwMyAxLjYzNTU5ODYyNzYzNDE3MzQKK2xvZzAwNzMgbG9nIC04LjA0NTY3OTQ2NDg5MzY1NzhlLTA2IDAuMTk3MjI3NTgwNTc1NzAyMDggLT4gLTEuNjIzMzk2OTg0ODI5NjA3NSAxLjU3MDgzNzEyMDY4MTAxMDEKK2xvZzAwNzQgbG9nIC0yLjQzMDY0NDI2OTEzMjMxNzMgMC42ODQ2OTE5NzUwNzAwOTk2IC0+IDAuOTI2MzM1OTIwMDE5Njk1ODkgMi44NjcwMTYwNTc2NzE4MzMxCitsb2cwMDc1IGxvZyAtMy41NDg4MDQ5MjUwODg4MTk0IDAuNDUzMjQwNDA2NDMxODUyNTQgLT4gMS4yNzQ3MDA4Mzc0MjU2NDI2IDMuMDE0NTY0MDAwNzg4NTExMQorbG9nMDA3NiBsb2cgMC4xODQxODUxNjg1MTUxMDE4OSAtMC4yNjA2MjUxODgzNjIxMjYxNyAtPiAtMS4xNDIxMjg3MTIxOTQwMzQ0IC0wLjk1NTU4NDQwODQxMTgzNDM0Citsb2cwMDc3IGxvZyAyLjcxMjQ4Mzc3OTU2MzgzOTkgLTEzLjE0ODc2OTA2NzEzMzM4NyAtPiAyLjU5NzE2NTk5NzU3MDY4MDIgLTEuMzY3MzU4MzA0NTIwOTQzOQorbG9nMDA3OCBsb2cgMy42NTIxMjc1NDc2MTY5MTQ5ZS0xMyAtMy43ODIwNTQzMDIzMTcwNjczZS0wNSAtPiAtMTAuMTgyNjU4MTM2NzQxNTY5IC0xLjU3MDc5NjMxNzEzODQzMTYKK2xvZzAwNzkgbG9nIDUuMDg3NzU0NTgxMzg2MjIzOSAtMS4yODM0OTc4MzI2Nzg2ODUyIC0+IDEuNjU3Njg1NjIxMzA3NjMyOCAtMC4yNDcxMTU4MzQ5NzczODQ4NQorbG9nMDA4MCBsb2cgMC4yNjQ3Nzk4NjgwODQ2MTUxMiAtMC42NzY1OTAwMTE5NDE4NzQyOSAtPiAtMC4zMTk0NDA4NTIwNzk5OTk3MyAtMS4xOTc3NzM2NzE5ODcxMjEKK2xvZzAwODEgbG9nIDAuMDAxNDc1NDI2MTM5ODA3MTk2MiA1LjM1MTQ2OTE2MDgyMDU0NDIgLT4gMS42NzczNzExNzA3MTUzODI5IDEuNTcwNTIwNjIxOTI2MTgwMgorbG9nMDA4MiBsb2cgMC4yOTY2NzMzNDQ2MjE1Nzg4NSAwLjAwMDIwMDU2MDQ1MDQyNTg0Nzk1IC0+IC0xLjIxNTEyMzM2NjcwNzk1ODggMC4wMDA2NzYwMzExNDE2ODY4OTIwNAorbG9nMDA4MyBsb2cgMC44MjEwNDIzMzY3MTA5OTQyNSAzLjkwMDUzODcxMzAxMzMxMDIgLT4gMS4zODI3OTE4OTY1Mjk5NTkzIDEuMzYzMzMwNDcwMTg0ODM2MworbG9nMDA4NCBsb2cgMC4yNzI2ODEzNTM1ODE4MDY2NyAxMjQuNDIwODgxMTA5NDU4MDQgLT4gNC44MjM2NzI0MjIzNTU5MjI5IDEuNTY4NjA0NzI1ODc4OTAxNQorbG9nMDA4NSBsb2cgMC4wMDI2Mjg2OTU5MTY4MjY3NDg1IDAuNDc3OTU4MDgxODA1NzMwMTMgLT4gLTAuNzM4MjE3MTIxMzc4MDkxMjYgMS41NjUyOTY1MzYwOTYwMDg3CisKKy0tIHZhbHVlcyBuZWFyIGluZmluaXR5Citsb2cwMTAwIGxvZyAxLjA1MTIwMjU3NDQwMDMxNzJlKzMwOCA3LjI2MjE2Njk3NTA2NjQ2MTFlKzMwNyAtPiA3MDkuNDQxMjM5Njc4MTQ0OTQgMC42MDQ1NTQzNDA0ODMzMjk2OAorbG9nMDEwMSBsb2cgNS41MzQ0MjQ5MDM0MzcyMTI2ZSszMDcgLTEuMjE1NTg1OTE1ODQzMTI3NWUrMzA4IC0+IDcwOS40ODU2MjMwMDM0NTY3OSAtMS4xNDM1NTMwNTY3MTc5NzMKK2xvZzAxMDIgbG9nIC0xLjMxNTU1NzU0MDM0Njk0MDhlKzMwOCAxLjE2MTA3OTM1NDE2NjM4NjRlKzMwOCAtPiA3MDkuNzU4NDc4MDk1NDY0MjggMi40MTg0ODc5NjUwNDk3NAorbG9nMDEwMyBsb2cgLTEuNjMyMzY2NzIwOTczMjM1ZSszMDggLTEuNTQyOTk0NDYyMTE0NDhlKzMwOCAtPiA3MTAuMDA1NDUyMzY1MTU1ODYgLTIuMzg0MzMyNjAyODQ1NTA4NworbG9nMDEwNCBsb2cgMC4wIDUuOTQ0OTI3NjY5MjMyNzcxMmUrMzA3IC0+IDcwOC42NzYxNjE5MTI1ODUyNiAxLjU3MDc5NjMyNjc5NDg5NjYKK2xvZzAxMDUgbG9nIC0wLjAgMS4xMjAxODUwNDU5MDI1NjkyZSszMDggLT4gNzA5LjMwOTcwMjUzMzM4MTcxIDEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMDEwNiBsb2cgMC4wIC0xLjYyMTQyMjU5MzM0NjY1MjhlKzMwOCAtPiA3MDkuNjc5NTEyNTUwMTA4NiAtMS41NzA3OTYzMjY3OTQ4OTY2Citsb2cwMTA3IGxvZyAtMC4wIC0xLjc0NTMyNjk3OTE1OTEwNThlKzMwOCAtPiA3MDkuNzUzMTUwNTYwODczNzkgLTEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMDEwOCBsb2cgMS40NDA4NjA1Nzc2MDE0MjhlKzMwOCAwLjAgLT4gNzA5LjU2MTQ0OTIwMDU4MjYyIDAuMAorbG9nMDEwOSBsb2cgMS4zOTE1MTUxNzYxNDgyODJlKzMwOCAtMC4wIC0+IDcwOS41MjY2MDE4NTA0MTMyNyAtMC4wCitsb2cwMTEwIGxvZyAtMS4yMDEzNTQ0MDEyOTUyOTZlKzMwOCAwLjAgLT4gNzA5LjM3OTY1ODIzMDIzOTU2IDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDExMSBsb2cgLTEuNjcwNDMzNzgyNTk3NjgwNGUrMzA4IC0wLjAgLT4gNzA5LjcwOTI5MTk4NDkyMzk5IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAxMTIgbG9nIDcuMjI3Njk3NDY1NTE5MDIyM2UrMzA3IDcuOTQ4Nzk3MTEzNjkxNjQgLT4gNzA4Ljg3MTU0NDA2NTEyMTA0IDEuMDk5NzY4OTMwNzg1MDQ1OGUtMzA3Citsb2cwMTEzIGxvZyAxLjEyMDc4NTk1OTM3MTYwNzZlKzMwOCAtNi4xOTU2MjAwODY4MjIxMTQ3IC0+IDcwOS4zMTAyMzg4MzA4MDEwNCAtNS41Mjc5MjQ0MzEwODAzMjg2ZS0zMDgKK2xvZzAxMTQgbG9nIC00LjY2Nzg5MzM4NzQ0NzEwNDVlKzMwNyA5Ljk0NzEwNzg5MzIyMDM4MiAtPiA3MDguNDM0MzMxNDI0MzEzODggMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMTE1IGxvZyAtMS41MTA4MDEyNDUzOTUwMTQyZSszMDggLTUuMzExNzE5NzE3OTM3NTYxOSAtPiA3MDkuNjA4ODQ4Nzc4MzUwMDggLTMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDExNiBsb2cgNy40OTAzNzUwODcxNTA0NDM1IDEuNTMyMDcwMzc3NjYyNjM1MmUrMzA4IC0+IDcwOS42MjI4Mjg2NTA4NTEzNyAxLjU3MDc5NjMyNjc5NDg5NjYKK2xvZzAxMTcgbG9nIDUuOTc2MDMyNTUyNTY1NDc3OCAtOC4wMTQ5NDczOTk3MzQ5MTIzZSszMDcgLT4gNzA4Ljk3NDkzMTc3MjQ4Mzk2IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2xvZzAxMTggbG9nIC03Ljg4MDE5NDIwNjM4NjYyOSAxLjc4NjE4NDU4MTQ3Njc0NDFlKzMwOCAtPiA3MDkuNzc2MjkwNDY4MzcxMzcgMS41NzA3OTYzMjY3OTQ4OTY2Citsb2cwMTE5IGxvZyAtOS44ODY0Mzg5OTM4NTI4NjUgLTYuMTkyMzU3ODEwODA3NDdlKzMwNyAtPiA3MDguNzE2OTM5NDY5NzczMDIgLTEuNTcwNzk2MzI2Nzk0ODk2NgorCistLSB2YWx1ZXMgbmVhciAwCitsb2cwMTIwIGxvZyAyLjI5OTY4Njc1NzkyMjc3NzllLTMwOCA2Ljc4NjE4NDA3NzA5MzkxMjVlLTMxMiAtPiAtNzA4LjM2MzQzNTY3NzE3MzkyIDAuMDAwMjk1MDkxNjYyMjMzMzk4MTUKK2xvZzAxMjEgbG9nIDYuOTE2OTE5MDQxNzc3NDUxNmUtMzIzIC05LjA0MTQwMTMxODg5NDgxMThlLTMyMiAtPiAtNzM5LjIyNzY2Nzk2NDY4Mzg2IC0xLjQ5NDQ0MjMyMTAwMDE2NjkKK2xvZzAxMjIgbG9nIC0xLjUzNzgwNjQ5NjI5MTQwMTFlLTMxNiAxLjgyNDM2MjgzODkzNTQ2MzVlLTMxMCAtPiAtNzEzLjIwMDE0ODAzMTQyOTY1IDEuNTcwNzk3MTY5NzIyODg0MgorbG9nMDEyMyBsb2cgLTIuMzMxOTg5ODQ4MzcwNjgzN2UtMzIxIC0yLjIzNTg3NjM5NDE4NjYzNzFlLTMxMyAtPiAtNzE5LjkwNDUwMDgzMzI1MjIgLTEuNTcwNzk2MzM3MjI0NzY2Citsb2cwMTI0IGxvZyAwLjAgMy44NzI3NzAxMDEwODExMjFlLTMxNSAtPiAtNzIzLjk2MDMzNDI1Mzc0NDAxIDEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMDEyNSBsb2cgLTAuMCA5LjYzNDI4MDA5MzkwNDMwNzZlLTMyMiAtPiAtNzM5LjE2NzA3MjM2MjgxNzUyIDEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMDEyNiBsb2cgMC4wIC0yLjI2NjA5OTM5MzQyNzgzNGUtMzA4IC0+IC03MDguMzc4MTQ4NjE3NTc5NjUgLTEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMDEyNyBsb2cgLTAuMCAtMi4xMTg0Njk1NjczNzY2NjI2ZS0zMTUgLT4gLTcyNC41NjM2MTAzNjczMTgxMiAtMS41NzA3OTYzMjY3OTQ4OTY2Citsb2cwMTI4IGxvZyAxLjEzNjM1MDk4NTQzNDg2NzFlLTMyMiAwLjAgLT4gLTc0MS4zMDQ1Nzc3MDU0NTIwNiAwLjAKK2xvZzAxMjkgbG9nIDMuNTU3MjcyNjUwMDU2OTc1MWUtMzIyIC0wLjAgLT4gLTc0MC4xNjM0MDU4MDIzNjUyMiAtMC4wCitsb2cwMTMwIGxvZyAtMi4zNjk2MDcxMDc0MDQwNTkzZS0zMTAgMC4wIC0+IC03MTIuOTM4NjU0NjY0MjE2NDEgMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMTMxIGxvZyAtMi44MTMyODM4OTcyNjY5MzRlLTMxNyAtMC4wIC0+IC03MjguODg1MTIyMDMxMzg4NjIgLTMuMTQxNTkyNjUzNTg5NzkzMQorCistLSB2YWx1ZXMgbmVhciB0aGUgdW5pdCBjaXJjbGUKK2xvZzAyMDAgbG9nIC0wLjU5OTk5OTk5OTk5OTk5OTk4IDAuODAwMDAwMDAwMDAwMDAwMDQgLT4gMi4yMjA0NDYwNDkyNTAzMTMyZS0xNyAyLjIxNDI5NzQzNTU4ODE4MDgKK2xvZzAyMDEgbG9nIDAuNzk5OTk5OTk5OTk5OTk5OTMgMC42MDAwMDAwMDAwMDAwMDAwOSAtPiA2LjE2Mjk3NTgyMjAzOTE1NDdlLTMzIDAuNjQzNTAxMTA4NzkzMjg0NDgKKworLS0gc3BlY2lhbCB2YWx1ZXMKK2xvZzEwMDAgbG9nIC0wLjAgMC4wIC0+IC1pbmYgMy4xNDE1OTI2NTM1ODk3OTMxICAgICAgICAgZGl2aWRlLWJ5LXplcm8KK2xvZzEwMDEgbG9nIDAuMCAwLjAgLT4gLWluZiAwLjAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aWRlLWJ5LXplcm8KK2xvZzEwMDIgbG9nIDAuMCBpbmYgLT4gaW5mIDEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMTAwMyBsb2cgMi4zIGluZiAtPiBpbmYgMS41NzA3OTYzMjY3OTQ4OTY2Citsb2cxMDA0IGxvZyAtMC4wIGluZiAtPiBpbmYgMS41NzA3OTYzMjY3OTQ4OTY2Citsb2cxMDA1IGxvZyAtMi4zIGluZiAtPiBpbmYgMS41NzA3OTYzMjY3OTQ4OTY2Citsb2cxMDA2IGxvZyAwLjAgbmFuIC0+IG5hbiBuYW4KK2xvZzEwMDcgbG9nIDIuMyBuYW4gLT4gbmFuIG5hbgorbG9nMTAwOCBsb2cgLTAuMCBuYW4gLT4gbmFuIG5hbgorbG9nMTAwOSBsb2cgLTIuMyBuYW4gLT4gbmFuIG5hbgorbG9nMTAxMCBsb2cgLWluZiAwLjAgLT4gaW5mIDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMTAxMSBsb2cgLWluZiAyLjMgLT4gaW5mIDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMTAxMiBsb2cgaW5mIDAuMCAtPiBpbmYgMC4wCitsb2cxMDEzIGxvZyBpbmYgMi4zIC0+IGluZiAwLjAKK2xvZzEwMTQgbG9nIC1pbmYgaW5mIC0+IGluZiAyLjM1NjE5NDQ5MDE5MjM0NDgKK2xvZzEwMTUgbG9nIGluZiBpbmYgLT4gaW5mIDAuNzg1Mzk4MTYzMzk3NDQ4MjgKK2xvZzEwMTYgbG9nIGluZiBuYW4gLT4gaW5mIG5hbgorbG9nMTAxNyBsb2cgLWluZiBuYW4gLT4gaW5mIG5hbgorbG9nMTAxOCBsb2cgbmFuIDAuMCAtPiBuYW4gbmFuCitsb2cxMDE5IGxvZyBuYW4gMi4zIC0+IG5hbiBuYW4KK2xvZzEwMjAgbG9nIG5hbiBpbmYgLT4gaW5mIG5hbgorbG9nMTAyMSBsb2cgbmFuIG5hbiAtPiBuYW4gbmFuCitsb2cxMDIyIGxvZyAtMC4wIC0wLjAgLT4gLWluZiAtMy4xNDE1OTI2NTM1ODk3OTMxICAgICAgIGRpdmlkZS1ieS16ZXJvCitsb2cxMDIzIGxvZyAwLjAgLTAuMCAtPiAtaW5mIC0wLjAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlkZS1ieS16ZXJvCitsb2cxMDI0IGxvZyAwLjAgLWluZiAtPiBpbmYgLTEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMTAyNSBsb2cgMi4zIC1pbmYgLT4gaW5mIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2xvZzEwMjYgbG9nIC0wLjAgLWluZiAtPiBpbmYgLTEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMTAyNyBsb2cgLTIuMyAtaW5mIC0+IGluZiAtMS41NzA3OTYzMjY3OTQ4OTY2Citsb2cxMDI4IGxvZyAtaW5mIC0wLjAgLT4gaW5mIC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzEwMjkgbG9nIC1pbmYgLTIuMyAtPiBpbmYgLTMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMTAzMCBsb2cgaW5mIC0wLjAgLT4gaW5mIC0wLjAKK2xvZzEwMzEgbG9nIGluZiAtMi4zIC0+IGluZiAtMC4wCitsb2cxMDMyIGxvZyAtaW5mIC1pbmYgLT4gaW5mIC0yLjM1NjE5NDQ5MDE5MjM0NDgKK2xvZzEwMzMgbG9nIGluZiAtaW5mIC0+IGluZiAtMC43ODUzOTgxNjMzOTc0NDgyOAorbG9nMTAzNCBsb2cgbmFuIC0wLjAgLT4gbmFuIG5hbgorbG9nMTAzNSBsb2cgbmFuIC0yLjMgLT4gbmFuIG5hbgorbG9nMTAzNiBsb2cgbmFuIC1pbmYgLT4gaW5mIG5hbgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gbG9nMTA6IExvZ2FyaXRobSBiYXNlIDEwIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbG9ndDAwMDAgbG9nMTAgMS4wIDAuMCAtPiAwLjAgMC4wCitsb2d0MDAwMSBsb2cxMCAxLjAgLTAuMCAtPiAwLjAgLTAuMAorbG9ndDAwMDIgbG9nMTAgLTEuMCAwLjAgLT4gMC4wIDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMDMgbG9nMTAgLTEuMCAtMC4wIC0+IDAuMCAtMS4zNjQzNzYzNTM4NDE4NDE0CistLSB2YWx1ZXMgYWxvbmcgYm90aCBzaWRlcyBvZiByZWFsIGF4aXMKK2xvZ3QwMDEwIGxvZzEwIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAgLT4gLTMyMy4wMDUxODUzNDc0NTE4IDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMTEgbG9nMTAgLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAgLT4gLTMyMy4wMDUxODUzNDc0NTE4IC0xLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDEyIGxvZzEwIC0xZS0zMDUgMC4wIC0+IC0zMDUuMCAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDEzIGxvZzEwIC0xZS0zMDUgLTAuMCAtPiAtMzA1LjAgLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMTQgbG9nMTAgLTFlLTE1MCAwLjAgLT4gLTE1MC4wIDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMTUgbG9nMTAgLTFlLTE1MCAtMC4wIC0+IC0xNTAuMCAtMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAxNiBsb2cxMCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gLTE2LjAgMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAxNyBsb2cxMCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMC4wIC0+IC0xNi4wIC0xLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDE4IGxvZzEwIC0wLjAwMSAwLjAgLT4gLTMuMCAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDE5IGxvZzEwIC0wLjAwMSAtMC4wIC0+IC0zLjAgLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMjAgbG9nMTAgLTAuNTc4OTk5OTk5OTk5OTk5OTYgMC4wIC0+IC0wLjIzNzMyMTQzNjI3MjU2MzgzIDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMjEgbG9nMTAgLTAuNTc4OTk5OTk5OTk5OTk5OTYgLTAuMCAtPiAtMC4yMzczMjE0MzYyNzI1NjM4MyAtMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAyMiBsb2cxMCAtMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAgLT4gLTQuODIxNjM3MzMyNzY2NDM2ZS0xNyAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDIzIGxvZzEwIC0wLjk5OTk5OTk5OTk5OTk5OTg5IC0wLjAgLT4gLTQuODIxNjM3MzMyNzY2NDM2ZS0xNyAtMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAyNCBsb2cxMCAtMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiA5LjY0MzI3NDY2NTUzMjg2OTZlLTE3IDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMjUgbG9nMTAgLTEuMDAwMDAwMDAwMDAwMDAwMiAtMC4wIC0+IDkuNjQzMjc0NjY1NTMyODY5NmUtMTcgLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMjYgbG9nMTAgLTEuMDAwOTk5OTk5OTk5OTk5OSAwLjAgLT4gMC4wMDA0MzQwNzc0NzkzMTg1OTI5IDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMjcgbG9nMTAgLTEuMDAwOTk5OTk5OTk5OTk5OSAtMC4wIC0+IDAuMDAwNDM0MDc3NDc5MzE4NTkyOSAtMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAyOCBsb2cxMCAtMi4wIDAuMCAtPiAwLjMwMTAyOTk5NTY2Mzk4MTIgMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAyOSBsb2cxMCAtMi4wIC0wLjAgLT4gMC4zMDEwMjk5OTU2NjM5ODEyIC0xLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDMwIGxvZzEwIC0yMy4wIDAuMCAtPiAxLjM2MTcyNzgzNjAxNzU5MjggMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAzMSBsb2cxMCAtMjMuMCAtMC4wIC0+IDEuMzYxNzI3ODM2MDE3NTkyOCAtMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAzMiBsb2cxMCAtMTAwMDAwMDAwMDAwMDAwMDAuMCAwLjAgLT4gMTYuMCAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDMzIGxvZzEwIC0xMDAwMDAwMDAwMDAwMDAwMC4wIC0wLjAgLT4gMTYuMCAtMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAzNCBsb2cxMCAtOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgMC4wIC0+IDE1MC4wIDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMzUgbG9nMTAgLTkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0wLjAgLT4gMTUwLjAgLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMzYgbG9nMTAgLTEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IDAuMCAtPiAyOTkuMCAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDM3IGxvZzEwIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtMC4wIC0+IDI5OS4wIC0xLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDM4IGxvZzEwIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IDAuMCAtPiAtMzIzLjAwNTE4NTM0NzQ1MTggMC4wCitsb2d0MDAzOSBsb2cxMCA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtMC4wIC0+IC0zMjMuMDA1MTg1MzQ3NDUxOCAtMC4wCitsb2d0MDA0MCBsb2cxMCAxZS0zMDUgMC4wIC0+IC0zMDUuMCAwLjAKK2xvZ3QwMDQxIGxvZzEwIDFlLTMwNSAtMC4wIC0+IC0zMDUuMCAtMC4wCitsb2d0MDA0MiBsb2cxMCAxZS0xNTAgMC4wIC0+IC0xNTAuMCAwLjAKK2xvZ3QwMDQzIGxvZzEwIDFlLTE1MCAtMC4wIC0+IC0xNTAuMCAtMC4wCitsb2d0MDA0NCBsb2cxMCA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IDAuMCAtPiAtMTYuMCAwLjAKK2xvZ3QwMDQ1IGxvZzEwIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMCAtPiAtMTYuMCAtMC4wCitsb2d0MDA0NiBsb2cxMCAwLjAwMSAwLjAgLT4gLTMuMCAwLjAKK2xvZ3QwMDQ3IGxvZzEwIDAuMDAxIC0wLjAgLT4gLTMuMCAtMC4wCitsb2d0MDA0OCBsb2cxMCAwLjU3ODk5OTk5OTk5OTk5OTk2IDAuMCAtPiAtMC4yMzczMjE0MzYyNzI1NjM4MyAwLjAKK2xvZ3QwMDQ5IGxvZzEwIDAuNTc4OTk5OTk5OTk5OTk5OTYgLTAuMCAtPiAtMC4yMzczMjE0MzYyNzI1NjM4MyAtMC4wCitsb2d0MDA1MCBsb2cxMCAwLjk5OTk5OTk5OTk5OTk5OTg5IDAuMCAtPiAtNC44MjE2MzczMzI3NjY0MzZlLTE3IDAuMAorbG9ndDAwNTEgbG9nMTAgMC45OTk5OTk5OTk5OTk5OTk4OSAtMC4wIC0+IC00LjgyMTYzNzMzMjc2NjQzNmUtMTcgLTAuMAorbG9ndDAwNTIgbG9nMTAgMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiA5LjY0MzI3NDY2NTUzMjg2OTZlLTE3IDAuMAorbG9ndDAwNTMgbG9nMTAgMS4wMDAwMDAwMDAwMDAwMDAyIC0wLjAgLT4gOS42NDMyNzQ2NjU1MzI4Njk2ZS0xNyAtMC4wCitsb2d0MDA1NCBsb2cxMCAxLjAwMDk5OTk5OTk5OTk5OTkgMC4wIC0+IDAuMDAwNDM0MDc3NDc5MzE4NTkyOSAwLjAKK2xvZ3QwMDU1IGxvZzEwIDEuMDAwOTk5OTk5OTk5OTk5OSAtMC4wIC0+IDAuMDAwNDM0MDc3NDc5MzE4NTkyOSAtMC4wCitsb2d0MDA1NiBsb2cxMCAyLjAgMC4wIC0+IDAuMzAxMDI5OTk1NjYzOTgxMiAwLjAKK2xvZ3QwMDU3IGxvZzEwIDIuMCAtMC4wIC0+IDAuMzAxMDI5OTk1NjYzOTgxMiAtMC4wCitsb2d0MDA1OCBsb2cxMCAyMy4wIDAuMCAtPiAxLjM2MTcyNzgzNjAxNzU5MjggMC4wCitsb2d0MDA1OSBsb2cxMCAyMy4wIC0wLjAgLT4gMS4zNjE3Mjc4MzYwMTc1OTI4IC0wLjAKK2xvZ3QwMDYwIGxvZzEwIDEwMDAwMDAwMDAwMDAwMDAwLjAgMC4wIC0+IDE2LjAgMC4wCitsb2d0MDA2MSBsb2cxMCAxMDAwMDAwMDAwMDAwMDAwMC4wIC0wLjAgLT4gMTYuMCAtMC4wCitsb2d0MDA2MiBsb2cxMCA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAwLjAgLT4gMTUwLjAgMC4wCitsb2d0MDA2MyBsb2cxMCA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtMC4wIC0+IDE1MC4wIC0wLjAKK2xvZ3QwMDY0IGxvZzEwIDEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IDAuMCAtPiAyOTkuMCAwLjAKK2xvZ3QwMDY1IGxvZzEwIDEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0wLjAgLT4gMjk5LjAgLTAuMAorCistLSByYW5kb20gaW5wdXRzCitsb2d0MDA2NiBsb2cxMCAtMS45ODMwNDU0OTQ1MTg2MTkxZS0xNiAtMi4wMzM0NDQ4MDI1NjczMzQ2IC0+IDAuMzA4MjMyMzg4MDY3OTg1MDMgLTAuNjgyMTg4MTc2OTIwOTIwNzEKK2xvZ3QwMDY3IGxvZzEwIC0wLjk2NzQ1ODUzMDI0NzQxODU3IC0wLjg0OTk1ODE2MjI4Mjk5NjkyIC0+IDAuMTA5ODQ1Mjg0MjIyODQ4MDIgLTEuMDUxMzIxNDI2MTc0MDg2Citsb2d0MDA2OCBsb2cxMCAtMC4xNjAzNjQ0MzEzOTQ4NDE4IC0wLjI5Mjk5NDIxMTEwNDE4MzUgLT4gLTAuNDc2MjQxMTU2MzMzMDU0MTkgLTAuODk5Njc4ODQwMjMwNTk1OTcKK2xvZ3QwMDY5IGxvZzEwIC0wLjE1OTE3OTEzMTY4NDM4Njk5IC0wLjI1MjM4Nzk5MjUxMTMyMTc3IC0+IC0wLjUyNTIxMzA0NjQxNjY1OTU2IC0wLjkyNjU1NzkwNjQ1Njg4MTE5Citsb2d0MDA3MCBsb2cxMCAtMC42ODkwNzgxODUzNTA3ODgwMiAtMy4wNjkzMTA1ODUzNDc2MzQ2IC0+IDAuNDk3NzE4Nzg4NTA2NjQ0OCAtMC43NzgwOTk1MzExOTMyODgyMworbG9ndDAwNzEgbG9nMTAgLTE3LjI2ODEzMzQ0NzU2NTU4OSA2LjgxNjUxMjAwMTQ2MDQ3NTYgLT4gMS4yNjg2OTEyMDA4MDk4NTM0IDEuMjAxMDk1NDYyOTEwNDIwMgorbG9ndDAwNzIgbG9nMTAgLTEuNzE1Mzg5NDQ3OTY5MDMyOCAyNi40MzQwNTUzNzI4MDI2MzYgLT4gMS40MjMwNzYzMDkwMzI3NTEgMC43MTAzMzE0NTg1OTAwNTMwOQorbG9ndDAwNzMgbG9nMTAgLTguMDQ1Njc5NDY0ODkzNjU3OGUtMDYgMC4xOTcyMjc1ODA1NzU3MDIwOCAtPiAtMC43MDUwMzIzNTI0NDk4NzU2MSAwLjY4MjIwNTg5MzQ4MDU1NTE2Citsb2d0MDA3NCBsb2cxMCAtMi40MzA2NDQyNjkxMzIzMTczIDAuNjg0NjkxOTc1MDcwMDk5NiAtPiAwLjQwMjMwMjU3ODQ1MzMyNTk1IDEuMjQ1MTI5MjUzMzc0ODkyMworbG9ndDAwNzUgbG9nMTAgLTMuNTQ4ODA0OTI1MDg4ODE5NCAwLjQ1MzI0MDQwNjQzMTg1MjU0IC0+IDAuNTUzNTk1NTM5NzcxNDEwNjMgMS4zMDkyMDg1MTA4ODY2NDA1Citsb2d0MDA3NiBsb2cxMCAwLjE4NDE4NTE2ODUxNTEwMTg5IC0wLjI2MDYyNTE4ODM2MjEyNjE3IC0+IC0wLjQ5NjAyMDE5NzMyOTEzNjM4IC0wLjQxNTAwNTAzNTU2NjA0MzAxCitsb2d0MDA3NyBsb2cxMCAyLjcxMjQ4Mzc3OTU2MzgzOTkgLTEzLjE0ODc2OTA2NzEzMzM4NyAtPiAxLjEyNzkzNDg2MTMzMTcwMDggLTAuNTkzODM2MTY2NDM4MDMyMTYKK2xvZ3QwMDc4IGxvZzEwIDMuNjUyMTI3NTQ3NjE2OTE0OWUtMTMgLTMuNzgyMDU0MzAyMzE3MDY3M2UtMDUgLT4gLTQuNDIyMjcyMjM5ODk0MTExMiAtMC42ODIxODgxNzI3MjcxNzExNAorbG9ndDAwNzkgbG9nMTAgNS4wODc3NTQ1ODEzODYyMjM5IC0xLjI4MzQ5NzgzMjY3ODY4NTIgLT4gMC43MTk5MjM3MTgwNjQyNjg0NyAtMC4xMDczMjEwNDM1MjE1OTI4MworbG9ndDAwODAgbG9nMTAgMC4yNjQ3Nzk4NjgwODQ2MTUxMiAtMC42NzY1OTAwMTE5NDE4NzQyOSAtPiAtMC4xMzg3MzEzOTkzNTI4MTY4MSAtMC41MjAxODY0OTYzMTMwMDIyOQorbG9ndDAwODEgbG9nMTAgMC4wMDE0NzU0MjYxMzk4MDcxOTYyIDUuMzUxNDY5MTYwODIwNTQ0MiAtPiAwLjcyODQ3MzA0MzU0NTI4ODE5IDAuNjgyMDY4NDM5ODE3ODAzMworbG9ndDAwODIgbG9nMTAgMC4yOTY2NzMzNDQ2MjE1Nzg4NSAwLjAwMDIwMDU2MDQ1MDQyNTg0Nzk1IC0+IC0wLjUyNzcyMTM3Mjk5Mjk2ODA2IDAuMDAwMjkzNTk2NTk0NDI5MzcyNjEKK2xvZ3QwMDgzIGxvZzEwIDAuODIxMDQyMzM2NzEwOTk0MjUgMy45MDA1Mzg3MTMwMTMzMTAyIC0+IDAuNjAwNTM4ODkwMjgzNDkzNjEgMC41OTIwODY5MDAyMTE4NDAxOAorbG9ndDAwODQgbG9nMTAgMC4yNzI2ODEzNTM1ODE4MDY2NyAxMjQuNDIwODgxMTA5NDU4MDQgLT4gMi4wOTQ4OTQzMTU1MzgwNjkgMC42ODEyMzYzNzY3MzY1Njk4OQorbG9ndDAwODUgbG9nMTAgMC4wMDI2Mjg2OTU5MTY4MjY3NDg1IDAuNDc3OTU4MDgxODA1NzMwMTMgLT4gLTAuMzIwNjAzNjIyMjYxMDA4MTQgMC42Nzk3OTk2NDgxNjg3NzA4MQorCistLSB2YWx1ZXMgbmVhciBpbmZpbml0eQorbG9ndDAxMDAgbG9nMTAgMS4wNTEyMDI1NzQ0MDAzMTcyZSszMDggNy4yNjIxNjY5NzUwNjY0NjExZSszMDcgLT4gMzA4LjEwNjQxNTYyNjgyMDY1IDAuMjYyNTU0NjE0MDgyNTY5NzUKK2xvZ3QwMTAxIGxvZzEwIDUuNTM0NDI0OTAzNDM3MjEyNmUrMzA3IC0xLjIxNTU4NTkxNTg0MzEyNzVlKzMwOCAtPiAzMDguMTI1NjkxMDYwMDkyMDkgLTAuNDk2NjM4NzgyMjk2MjEyCitsb2d0MDEwMiBsb2cxMCAtMS4zMTU1NTc1NDAzNDY5NDA4ZSszMDggMS4xNjEwNzkzNTQxNjYzODY0ZSszMDggLT4gMzA4LjI0NDE5MDUyMDkxMDE5IDEuMDUwMzM1OTc3NzcwNTI2NgorbG9ndDAxMDMgbG9nMTAgLTEuNjMyMzY2NzIwOTczMjM1ZSszMDggLTEuNTQyOTk0NDYyMTE0NDhlKzMwOCAtPiAzMDguMzUxNDUwMDgzNDA5MyAtMS4wMzU1MDI0OTI0Mzc4MjIyCitsb2d0MDEwNCBsb2cxMCAwLjAgNS45NDQ5Mjc2NjkyMzI3NzEyZSszMDcgLT4gMzA3Ljc3NDE0NjU3NTAxMTE3IDAuNjgyMTg4MTc2OTIwOTIwNzEKK2xvZ3QwMTA1IGxvZzEwIC0wLjAgMS4xMjAxODUwNDU5MDI1NjkyZSszMDggLT4gMzA4LjA0OTI4OTc3MDY4NDY1IDAuNjgyMTg4MTc2OTIwOTIwNzEKK2xvZ3QwMTA2IGxvZzEwIDAuMCAtMS42MjE0MjI1OTMzNDY2NTI4ZSszMDggLT4gMzA4LjIwOTg5NjIyMDMwMTc0IC0wLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MDEwNyBsb2cxMCAtMC4wIC0xLjc0NTMyNjk3OTE1OTEwNThlKzMwOCAtPiAzMDguMjQxODc2ODAyMDM1MzkgLTAuNjgyMTg4MTc2OTIwOTIwNzEKK2xvZ3QwMTA4IGxvZzEwIDEuNDQwODYwNTc3NjAxNDI4ZSszMDggMC4wIC0+IDMwOC4xNTg2MjE5NTkwODc1NSAwLjAKK2xvZ3QwMTA5IGxvZzEwIDEuMzkxNTE1MTc2MTQ4MjgyZSszMDggLTAuMCAtPiAzMDguMTQzNDg3OTQ3MjAwMDcgLTAuMAorbG9ndDAxMTAgbG9nMTAgLTEuMjAxMzU0NDAxMjk1Mjk2ZSszMDggMC4wIC0+IDMwOC4wNzk2NzExNDM4MDc3MyAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMTExIGxvZzEwIC0xLjY3MDQzMzc4MjU5NzY4MDRlKzMwOCAtMC4wIC0+IDMwOC4yMjI4MjkyNjQ1MTYyNCAtMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDExMiBsb2cxMCA3LjIyNzY5NzQ2NTUxOTAyMjNlKzMwNyA3Ljk0ODc5NzExMzY5MTY0IC0+IDMwNy44NTg5OTk5NjU3MTk5MyA0Ljc3NjIzNTc4MDA4NTg0NjNlLTMwOAorbG9ndDAxMTMgbG9nMTAgMS4xMjA3ODU5NTkzNzE2MDc2ZSszMDggLTYuMTk1NjIwMDg2ODIyMTE0NyAtPiAzMDguMDQ5NTIyNjgxNjk0NTUgLTIuNDAwNzQ3MDc2Nzk2MzU5N2UtMzA4Citsb2d0MDExNCBsb2cxMCAtNC42Njc4OTMzODc0NDcxMDQ1ZSszMDcgOS45NDcxMDc4OTMyMjAzODIgLT4gMzA3LjY2OTEyMDkyODM5OTAyIDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAxMTUgbG9nMTAgLTEuNTEwODAxMjQ1Mzk1MDE0MmUrMzA4IC01LjMxMTcxOTcxNzkzNzU2MTkgLT4gMzA4LjE3OTIwNzMzNDE1NjUgLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAxMTYgbG9nMTAgNy40OTAzNzUwODcxNTA0NDM1IDEuNTMyMDcwMzc3NjYyNjM1MmUrMzA4IC0+IDMwOC4xODUyNzg3MTU2NDE1NyAwLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MDExNyBsb2cxMCA1Ljk3NjAzMjU1MjU2NTQ3NzggLTguMDE0OTQ3Mzk5NzM0OTEyM2UrMzA3IC0+IDMwNy45MDM5MDA2NzY1MjQyNCAtMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDAxMTggbG9nMTAgLTcuODgwMTk0MjA2Mzg2NjI5IDEuNzg2MTg0NTgxNDc2NzQ0MWUrMzA4IC0+IDMwOC4yNTE5MjYzMzYxNzMzMSAwLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MDExOSBsb2cxMCAtOS44ODY0Mzg5OTM4NTI4NjUgLTYuMTkyMzU3ODEwODA3NDdlKzMwNyAtPiAzMDcuNzkxODU2MDQzMDgzMzggLTAuNjgyMTg4MTc2OTIwOTIwNzEKKworLS0gdmFsdWVzIG5lYXIgMAorbG9ndDAxMjAgbG9nMTAgMi4yOTk2ODY3NTc5MjI3Nzc5ZS0zMDggNi43ODYxODQwNzcwOTM5MTI1ZS0zMTIgLT4gLTMwNy42MzgzMzEyOTY2MjU3MiAwLjAwMDEyODE1NjY4MDU2MzYyMzA1Citsb2d0MDEyMSBsb2cxMCA2LjkxNjkxOTA0MTc3NzQ1MTZlLTMyMyAtOS4wNDE0MDEzMTg4OTQ4MTE4ZS0zMjIgLT4gLTMyMS4wNDI0OTcwNjcyNzE0OCAtMC42NDkwMjgwNTM1MzMwNjA1OQorbG9ndDAxMjIgbG9nMTAgLTEuNTM3ODA2NDk2MjkxNDAxMWUtMzE2IDEuODI0MzYyODM4OTM1NDYzNWUtMzEwIC0+IC0zMDkuNzM4ODg4NzgyNjMyMjIgMC42ODIxODg1NDI5OTk4OTQyOQorbG9ndDAxMjMgbG9nMTAgLTIuMzMxOTg5ODQ4MzcwNjgzN2UtMzIxIC0yLjIzNTg3NjM5NDE4NjYzNzFlLTMxMyAtPiAtMzEyLjY1MDU1MjIwOTE5NjQxIC0wLjY4MjE4ODE4MTQ1MDU1NTM4Citsb2d0MDEyNCBsb2cxMCAwLjAgMy44NzI3NzAxMDEwODExMjFlLTMxNSAtPiAtMzE0LjQxMTk3ODI4MzIzNDc2IDAuNjgyMTg4MTc2OTIwOTIwNzEKK2xvZ3QwMTI1IGxvZzEwIC0wLjAgOS42MzQyODAwOTM5MDQzMDc2ZS0zMjIgLT4gLTMyMS4wMTYxODA3MzE3NTMzMSAwLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MDEyNiBsb2cxMCAwLjAgLTIuMjY2MDk5MzkzNDI3ODM0ZS0zMDggLT4gLTMwNy42NDQ3MjEwNDU0NTY0OSAtMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDAxMjcgbG9nMTAgLTAuMCAtMi4xMTg0Njk1NjczNzY2NjI2ZS0zMTUgLT4gLTMxNC42NzM5Nzc3NzA0MjQwNyAtMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDAxMjggbG9nMTAgMS4xMzYzNTA5ODU0MzQ4NjcxZS0zMjIgMC4wIC0+IC0zMjEuOTQ0NDg3NTA3MDk4MTkgMC4wCitsb2d0MDEyOSBsb2cxMCAzLjU1NzI3MjY1MDA1Njk3NTFlLTMyMiAtMC4wIC0+IC0zMjEuNDQ4ODgyODQ2Njg0NTEgLTAuMAorbG9ndDAxMzAgbG9nMTAgLTIuMzY5NjA3MTA3NDA0MDU5M2UtMzEwIDAuMCAtPiAtMzA5LjYyNTMyMzY1NjE5NzIyIDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAxMzEgbG9nMTAgLTIuODEzMjgzODk3MjY2OTM0ZS0zMTcgLTAuMCAtPiAtMzE2LjU1MDc4NjQzOTYxMDQyIC0xLjM2NDM3NjM1Mzg0MTg0MTQKKworLS0gdmFsdWVzIG5lYXIgdGhlIHVuaXQgY2lyY2xlCitsb2d0MDIwMCBsb2cxMCAtMC41OTk5OTk5OTk5OTk5OTk5OCAwLjgwMDAwMDAwMDAwMDAwMDA0IC0+IDkuNjQzMjc0NjY1NTMyODcwOWUtMTggMC45NjE2NTcxNTc1Njg0NjgxNQorbG9ndDAyMDEgbG9nMTAgMC43OTk5OTk5OTk5OTk5OTk5MyAwLjYwMDAwMDAwMDAwMDAwMDA5IC0+IDIuNjc2NTQ2MzkxNjE0NzYyMmUtMzMgMC4yNzk0Njg5ODA2NDc1NDc2CisKKy0tIHNwZWNpYWwgdmFsdWVzCitsb2d0MTAwMCBsb2cxMCAtMC4wIDAuMCAtPiAtaW5mIDEuMzY0Mzc2MzUzODQxODQxNCAgICAgICAgIGRpdmlkZS1ieS16ZXJvCitsb2d0MTAwMSBsb2cxMCAwLjAgMC4wIC0+IC1pbmYgMC4wICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlkZS1ieS16ZXJvCitsb2d0MTAwMiBsb2cxMCAwLjAgaW5mIC0+IGluZiAwLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MTAwMyBsb2cxMCAyLjMgaW5mIC0+IGluZiAwLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MTAwNCBsb2cxMCAtMC4wIGluZiAtPiBpbmYgMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDEwMDUgbG9nMTAgLTIuMyBpbmYgLT4gaW5mIDAuNjgyMTg4MTc2OTIwOTIwNzEKK2xvZ3QxMDA2IGxvZzEwIDAuMCBuYW4gLT4gbmFuIG5hbgorbG9ndDEwMDcgbG9nMTAgMi4zIG5hbiAtPiBuYW4gbmFuCitsb2d0MTAwOCBsb2cxMCAtMC4wIG5hbiAtPiBuYW4gbmFuCitsb2d0MTAwOSBsb2cxMCAtMi4zIG5hbiAtPiBuYW4gbmFuCitsb2d0MTAxMCBsb2cxMCAtaW5mIDAuMCAtPiBpbmYgMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MTAxMSBsb2cxMCAtaW5mIDIuMyAtPiBpbmYgMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MTAxMiBsb2cxMCBpbmYgMC4wIC0+IGluZiAwLjAKK2xvZ3QxMDEzIGxvZzEwIGluZiAyLjMgLT4gaW5mIDAuMAorbG9ndDEwMTQgbG9nMTAgLWluZiBpbmYgLT4gaW5mIDEuMDIzMjgyMjY1MzgxMzgxMQorbG9ndDEwMTUgbG9nMTAgaW5mIGluZiAtPiBpbmYgMC4zNDEwOTQwODg0NjA0NjAzNQorbG9ndDEwMTYgbG9nMTAgaW5mIG5hbiAtPiBpbmYgbmFuCitsb2d0MTAxNyBsb2cxMCAtaW5mIG5hbiAtPiBpbmYgbmFuCitsb2d0MTAxOCBsb2cxMCBuYW4gMC4wIC0+IG5hbiBuYW4KK2xvZ3QxMDE5IGxvZzEwIG5hbiAyLjMgLT4gbmFuIG5hbgorbG9ndDEwMjAgbG9nMTAgbmFuIGluZiAtPiBpbmYgbmFuCitsb2d0MTAyMSBsb2cxMCBuYW4gbmFuIC0+IG5hbiBuYW4KK2xvZ3QxMDIyIGxvZzEwIC0wLjAgLTAuMCAtPiAtaW5mIC0xLjM2NDM3NjM1Mzg0MTg0MTQgICAgICAgZGl2aWRlLWJ5LXplcm8KK2xvZ3QxMDIzIGxvZzEwIDAuMCAtMC4wIC0+IC1pbmYgLTAuMCAgICAgICAgICAgICAgICAgICAgICAgZGl2aWRlLWJ5LXplcm8KK2xvZ3QxMDI0IGxvZzEwIDAuMCAtaW5mIC0+IGluZiAtMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDEwMjUgbG9nMTAgMi4zIC1pbmYgLT4gaW5mIC0wLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MTAyNiBsb2cxMCAtMC4wIC1pbmYgLT4gaW5mIC0wLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MTAyNyBsb2cxMCAtMi4zIC1pbmYgLT4gaW5mIC0wLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MTAyOCBsb2cxMCAtaW5mIC0wLjAgLT4gaW5mIC0xLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QxMDI5IGxvZzEwIC1pbmYgLTIuMyAtPiBpbmYgLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDEwMzAgbG9nMTAgaW5mIC0wLjAgLT4gaW5mIC0wLjAKK2xvZ3QxMDMxIGxvZzEwIGluZiAtMi4zIC0+IGluZiAtMC4wCitsb2d0MTAzMiBsb2cxMCAtaW5mIC1pbmYgLT4gaW5mIC0xLjAyMzI4MjI2NTM4MTM4MTEKK2xvZ3QxMDMzIGxvZzEwIGluZiAtaW5mIC0+IGluZiAtMC4zNDEwOTQwODg0NjA0NjAzNQorbG9ndDEwMzQgbG9nMTAgbmFuIC0wLjAgLT4gbmFuIG5hbgorbG9ndDEwMzUgbG9nMTAgbmFuIC0yLjMgLT4gbmFuIG5hbgorbG9ndDEwMzYgbG9nMTAgbmFuIC1pbmYgLT4gaW5mIG5hbgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBzcXJ0OiBTcXVhcmUgcm9vdCAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gemVyb3MKK3NxcnQwMDAwIHNxcnQgMC4wIDAuMCAtPiAwLjAgMC4wCitzcXJ0MDAwMSBzcXJ0IDAuMCAtMC4wIC0+IDAuMCAtMC4wCitzcXJ0MDAwMiBzcXJ0IC0wLjAgMC4wIC0+IDAuMCAwLjAKK3NxcnQwMDAzIHNxcnQgLTAuMCAtMC4wIC0+IDAuMCAtMC4wCisKKy0tIHZhbHVlcyBhbG9uZyBib3RoIHNpZGVzIG9mIHJlYWwgYXhpcworc3FydDAwMTAgc3FydCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wIC0+IDAuMCAzLjE0MzQ1NTU2OTQwNTI1NzZlLTE2Mgorc3FydDAwMTEgc3FydCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMCAtPiAwLjAgLTMuMTQzNDU1NTY5NDA1MjU3NmUtMTYyCitzcXJ0MDAxMiBzcXJ0IC0xZS0zMDUgMC4wIC0+IDAuMCAzLjE2MjI3NzY2MDE2ODM3OTFlLTE1Mworc3FydDAwMTMgc3FydCAtMWUtMzA1IC0wLjAgLT4gMC4wIC0zLjE2MjI3NzY2MDE2ODM3OTFlLTE1Mworc3FydDAwMTQgc3FydCAtMWUtMTUwIDAuMCAtPiAwLjAgOS45OTk5OTk5OTk5OTk5OTk2ZS03Ngorc3FydDAwMTUgc3FydCAtMWUtMTUwIC0wLjAgLT4gMC4wIC05Ljk5OTk5OTk5OTk5OTk5OTZlLTc2CitzcXJ0MDAxNiBzcXJ0IC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IDAuMCAtPiAwLjAgMWUtMDgKK3NxcnQwMDE3IHNxcnQgLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMCAtPiAwLjAgLTFlLTA4CitzcXJ0MDAxOCBzcXJ0IC0wLjAwMSAwLjAgLT4gMC4wIDAuMDMxNjIyNzc2NjAxNjgzNzkxCitzcXJ0MDAxOSBzcXJ0IC0wLjAwMSAtMC4wIC0+IDAuMCAtMC4wMzE2MjI3NzY2MDE2ODM3OTEKK3NxcnQwMDIwIHNxcnQgLTAuNTc4OTk5OTk5OTk5OTk5OTYgMC4wIC0+IDAuMCAwLjc2MDkyMDQ5NTE4OTg3MTkzCitzcXJ0MDAyMSBzcXJ0IC0wLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gMC4wIC0wLjc2MDkyMDQ5NTE4OTg3MTkzCitzcXJ0MDAyMiBzcXJ0IC0wLjk5OTk5OTk5OTk5OTk5OTg5IDAuMCAtPiAwLjAgMC45OTk5OTk5OTk5OTk5OTk4OQorc3FydDAwMjMgc3FydCAtMC45OTk5OTk5OTk5OTk5OTk4OSAtMC4wIC0+IDAuMCAtMC45OTk5OTk5OTk5OTk5OTk4OQorc3FydDAwMjQgc3FydCAtMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiAwLjAgMS4wCitzcXJ0MDAyNSBzcXJ0IC0xLjAwMDAwMDAwMDAwMDAwMDIgLTAuMCAtPiAwLjAgLTEuMAorc3FydDAwMjYgc3FydCAtMS4wMDA5OTk5OTk5OTk5OTk5IDAuMCAtPiAwLjAgMS4wMDA0OTk4NzUwNjI0NjEKK3NxcnQwMDI3IHNxcnQgLTEuMDAwOTk5OTk5OTk5OTk5OSAtMC4wIC0+IDAuMCAtMS4wMDA0OTk4NzUwNjI0NjEKK3NxcnQwMDI4IHNxcnQgLTIuMCAwLjAgLT4gMC4wIDEuNDE0MjEzNTYyMzczMDk1MQorc3FydDAwMjkgc3FydCAtMi4wIC0wLjAgLT4gMC4wIC0xLjQxNDIxMzU2MjM3MzA5NTEKK3NxcnQwMDMwIHNxcnQgLTIzLjAgMC4wIC0+IDAuMCA0Ljc5NTgzMTUyMzMxMjcxOTEKK3NxcnQwMDMxIHNxcnQgLTIzLjAgLTAuMCAtPiAwLjAgLTQuNzk1ODMxNTIzMzEyNzE5MQorc3FydDAwMzIgc3FydCAtMTAwMDAwMDAwMDAwMDAwMDAuMCAwLjAgLT4gMC4wIDEwMDAwMDAwMC4wCitzcXJ0MDAzMyBzcXJ0IC0xMDAwMDAwMDAwMDAwMDAwMC4wIC0wLjAgLT4gMC4wIC0xMDAwMDAwMDAuMAorc3FydDAwMzQgc3FydCAtOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgMC4wIC0+IDAuMCA5Ljk5OTk5OTk5OTk5OTk5OTNlKzc0CitzcXJ0MDAzNSBzcXJ0IC05Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtMC4wIC0+IDAuMCAtOS45OTk5OTk5OTk5OTk5OTkzZSs3NAorc3FydDAwMzYgc3FydCAtMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgMC4wIC0+IDAuMCAzLjE2MjI3NzY2MDE2ODM3OTZlKzE0OQorc3FydDAwMzcgc3FydCAtMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLTAuMCAtPiAwLjAgLTMuMTYyMjc3NjYwMTY4Mzc5NmUrMTQ5CitzcXJ0MDAzOCBzcXJ0IDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IDAuMCAtPiAzLjE0MzQ1NTU2OTQwNTI1NzZlLTE2MiAwLjAKK3NxcnQwMDM5IHNxcnQgOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMCAtPiAzLjE0MzQ1NTU2OTQwNTI1NzZlLTE2MiAtMC4wCitzcXJ0MDA0MCBzcXJ0IDFlLTMwNSAwLjAgLT4gMy4xNjIyNzc2NjAxNjgzNzkxZS0xNTMgMC4wCitzcXJ0MDA0MSBzcXJ0IDFlLTMwNSAtMC4wIC0+IDMuMTYyMjc3NjYwMTY4Mzc5MWUtMTUzIC0wLjAKK3NxcnQwMDQyIHNxcnQgMWUtMTUwIDAuMCAtPiA5Ljk5OTk5OTk5OTk5OTk5OTZlLTc2IDAuMAorc3FydDAwNDMgc3FydCAxZS0xNTAgLTAuMCAtPiA5Ljk5OTk5OTk5OTk5OTk5OTZlLTc2IC0wLjAKK3NxcnQwMDQ0IHNxcnQgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gMWUtMDggMC4wCitzcXJ0MDA0NSBzcXJ0IDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMCAtPiAxZS0wOCAtMC4wCitzcXJ0MDA0NiBzcXJ0IDAuMDAxIDAuMCAtPiAwLjAzMTYyMjc3NjYwMTY4Mzc5MSAwLjAKK3NxcnQwMDQ3IHNxcnQgMC4wMDEgLTAuMCAtPiAwLjAzMTYyMjc3NjYwMTY4Mzc5MSAtMC4wCitzcXJ0MDA0OCBzcXJ0IDAuNTc4OTk5OTk5OTk5OTk5OTYgMC4wIC0+IDAuNzYwOTIwNDk1MTg5ODcxOTMgMC4wCitzcXJ0MDA0OSBzcXJ0IDAuNTc4OTk5OTk5OTk5OTk5OTYgLTAuMCAtPiAwLjc2MDkyMDQ5NTE4OTg3MTkzIC0wLjAKK3NxcnQwMDUwIHNxcnQgMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAgLT4gMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAKK3NxcnQwMDUxIHNxcnQgMC45OTk5OTk5OTk5OTk5OTk4OSAtMC4wIC0+IDAuOTk5OTk5OTk5OTk5OTk5ODkgLTAuMAorc3FydDAwNTIgc3FydCAxLjAwMDAwMDAwMDAwMDAwMDIgMC4wIC0+IDEuMCAwLjAKK3NxcnQwMDUzIHNxcnQgMS4wMDAwMDAwMDAwMDAwMDAyIC0wLjAgLT4gMS4wIC0wLjAKK3NxcnQwMDU0IHNxcnQgMS4wMDA5OTk5OTk5OTk5OTk5IDAuMCAtPiAxLjAwMDQ5OTg3NTA2MjQ2MSAwLjAKK3NxcnQwMDU1IHNxcnQgMS4wMDA5OTk5OTk5OTk5OTk5IC0wLjAgLT4gMS4wMDA0OTk4NzUwNjI0NjEgLTAuMAorc3FydDAwNTYgc3FydCAyLjAgMC4wIC0+IDEuNDE0MjEzNTYyMzczMDk1MSAwLjAKK3NxcnQwMDU3IHNxcnQgMi4wIC0wLjAgLT4gMS40MTQyMTM1NjIzNzMwOTUxIC0wLjAKK3NxcnQwMDU4IHNxcnQgMjMuMCAwLjAgLT4gNC43OTU4MzE1MjMzMTI3MTkxIDAuMAorc3FydDAwNTkgc3FydCAyMy4wIC0wLjAgLT4gNC43OTU4MzE1MjMzMTI3MTkxIC0wLjAKK3NxcnQwMDYwIHNxcnQgMTAwMDAwMDAwMDAwMDAwMDAuMCAwLjAgLT4gMTAwMDAwMDAwLjAgMC4wCitzcXJ0MDA2MSBzcXJ0IDEwMDAwMDAwMDAwMDAwMDAwLjAgLTAuMCAtPiAxMDAwMDAwMDAuMCAtMC4wCitzcXJ0MDA2MiBzcXJ0IDkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IDAuMCAtPiA5Ljk5OTk5OTk5OTk5OTk5OTNlKzc0IDAuMAorc3FydDAwNjMgc3FydCA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtMC4wIC0+IDkuOTk5OTk5OTk5OTk5OTk5M2UrNzQgLTAuMAorc3FydDAwNjQgc3FydCAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gMy4xNjIyNzc2NjAxNjgzNzk2ZSsxNDkgMC4wCitzcXJ0MDA2NSBzcXJ0IDEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0wLjAgLT4gMy4xNjIyNzc2NjAxNjgzNzk2ZSsxNDkgLTAuMAorCistLSByYW5kb20gaW5wdXRzCitzcXJ0MDEwMCBzcXJ0IC0wLjM0MjUyNTQyNTQxNTQ5OTEzIC0yMjMwMzk4ODAuMTUwNzYyMTEgLT4gMTA1NjAuMzAwMTgwNTg3NTkyIC0xMDU2MC4zMDAxOTY4MDUxOTIKK3NxcnQwMTAxIHNxcnQgLTAuODg3OTA3OTEzOTMwMTg5MDkgLTUuMzMwNzc1MTczMDgyNzQwMiAtPiAxLjUwMjcxNTQ2MTM2ODkwMDQgLTEuNzczNzE0MDg5NjM0MzI5MQorc3FydDAxMDIgc3FydCAtMTEzOTE2Ljg5MjkxMzEwNzY3IC0wLjAxODE0MzM3NDYyNjE1Mzg1OCAtPiAyLjY4Nzc4MTc4NzUzNTExNzhlLTA1IC0zMzcuNTE1NzY2OTEwMzg5NTIKK3NxcnQwMTAzIHNxcnQgLTAuNjMxODcxNzIzODYxOTcxMjEgLTAuMjYyOTM5MTMzNjY2MTc2OTQgLT4gMC4xNjIwNTcwNzQ5NTI2NjE1MyAtMC44MTEyNTQ3MTkxODc2MTk3MQorc3FydDAxMDQgc3FydCAtMC4wNTgxODUxNjkzMDg5MDYyMTUgLTIuMzU0ODMxMjk5MDQzMDk5MSAtPiAxLjA3MTc2NjAzNDI0MjAwNzIgLTEuMDk4NTc1MjU5ODA4Njk2Ngorc3FydDAxMDUgc3FydCAtMS4wNTgwNTg0NzY1OTM1ODk2IDAuMTQ0MDAzMTkyNTkxNTE3MzYgLT4gMC4wNjk4Mzc0ODkyNzAxMTEyNDIgMS4wMzA5ODc3NTUyNjI0NjgKK3NxcnQwMTA2IHNxcnQgLTEuMTY2NzU5NTk0NzUwNDkzMiAwLjExMTU5NzExNDczOTUzNjc4IC0+IDAuMDUxNTk4NTMxMzE5MzE1MjUxIDEuMDgxMzk4MTcwNTExMTIyOQorc3FydDAxMDcgc3FydCAtMC41MTIzNzI4NDExNDQ5OTA2IDAuMDI2MTc1NDMzNjQ4MzM5MDg1IC0+IDAuMDE4Mjc4MDI2MjYyNDE4NzE4IDAuNzE2MDM1NTYyOTM1OTc2MTQKK3NxcnQwMTA4IHNxcnQgLTMuNzQ1MzQwMDA2MDA2NzIyOCAxLjA5NDY1MDAzMTQ4MDk2MzUgLT4gMC4yNzk5MDA4ODU0MTY5MjQ5OCAxLjk1NTQyNDM4MTQ3NDIzNjcKK3NxcnQwMTA5IHNxcnQgLTAuMDAyNzczNjEyMTU3NTA5NzY3MyAxLjAzNjc5NDMwMDA4Mzk4MTcgLT4gMC43MTkwMzU2MDMzODcxOTE3NSAwLjcyMDk2MTcyNjUxMjUwNTQ1CitzcXJ0MDExMCBzcXJ0IDE1MDEuMjU1OTY5OTQ1MzE4OCAtMS4xOTk3MzI1MjA3MjgzNTg5IC0+IDM4Ljc0NjA0NzY2NDczMDk1OSAtMC4wMTU0ODE5OTg3MjAzNTUwMjQKK3NxcnQwMTExIHNxcnQgMS40ODMwMDc1MzI2ODUwNTc4IC0wLjY0MTAwODc4NDM2NzU1MzQ5IC0+IDEuMjQ0NzEyODE1NzQxMDk2IC0wLjI1NzQ5MjY0MjU4NDM0NTg0CitzcXJ0MDExMiBzcXJ0IDAuMDk1Mzk1NjE4NDk5NzM0NjAyIC0wLjQ4MjI2NTY1NzAxNjM5NTk1IC0+IDAuNTQxNzU5MDQwNTM0NzI4NzkgLTAuNDQ1MDkyMzk0MzQyMzE1NTEKK3NxcnQwMTEzIHNxcnQgMC41MDEwOTE4NTY4MTg2MzI3NyAtMC41NDA1NDAzNzM3OTg5MjU2MSAtPiAwLjc4NjgxNzk4NTgzMzIzODcgLTAuMzQzNDk3NzIzNDQ1MjA5NzkKK3NxcnQwMTE0IHNxcnQgMC45ODc3OTgwNzU5NTM2Nzg5NyAtMC4wMDAxOTg0ODc1ODQzNzIyNTE5MSAtPiAwLjk5Mzg4MDMxNzcwNjY1MTUzIC05Ljk4NTQ4NzIyNzk5MjE5NjhlLTA1CitzcXJ0MDExNSBzcXJ0IDExLjg0NTQ3MjM4MDc5MjI1OSAwLjAwMTAwNTExMDQ1ODE1MDY3NjEgLT4gMy40NDE3MjUyMDcyMzQ1Mzk3IDAuMDAwMTQ2MDE4NDA2MTIzNDY0NTEKK3NxcnQwMTE2IHNxcnQgMi4zNTU4MjQ5Njg2NzM1OTc1IDAuMjU2MDUxNTczNzE3NDQ0MDMgLT4gMS41MzcxMjc4NDc3Mzg2NjQ3IDAuMDgzMjg4OTY0NTc1NzYxNDA0CitzcXJ0MDExNyBzcXJ0IDAuNzc1ODQ4OTQxMjMxNTkwOTggMS4wNDk2NDIwNjI3MDE2MDc2IC0+IDEuMDIwMDc0NDM4NjM5MDg4NSAwLjUxNDQ5Mjg3NTY4NzU2NTUyCitzcXJ0MDExOCBzcXJ0IDEuODk2MTcxNTY2OTYwNDg5MyAwLjM0OTQwNzkzNDY3MTU4ODU0IC0+IDEuMzgyNzk5MTc4MTQxMTYxNSAwLjEyNjM0MDgwOTM1MDY2OTAyCitzcXJ0MDExOSBzcXJ0IDAuOTYwMjUzNzgzMTY1NjU4MDEgMC42OTU3MzIyNDg2MDE0MDUxNSAtPiAxLjAzNTg3MTAzNDIyMDk5OTggMC4zMzU4MTk5MTY1ODA5MzQ1NworCistLSB2YWx1ZXMgbmVhciAwCitzcXJ0MDEyMCBzcXJ0IDcuMzU3NzkzODM2NTA4Njg2NmUtMzEzIDguMTE4MTQwODQ2NTExMjc0M2UtMzE5IC0+IDguNTc3NzU4MzUzMTU0MzUxNmUtMTU3IDQuNzMyMDg3NjM0MjUxMTY4ZS0xNjMKK3NxcnQwMTIxIHNxcnQgMS4yNDA2ODgzODc0ODkyMTA4ZS0zMTAgLTUuMTIxMDEzMzMyNDI2OTc3NmUtMzEyIC0+IDEuMTE0MDk5MDA1NzQ2ODA1MmUtMTU1IC0yLjI5ODI3NTY5NDUzNDk5NzNlLTE1Nworc3FydDAxMjIgc3FydCAtNy4xMTQ1NDUzMDAxMTM5NTAyZS0zMjIgMi45NTYxMzc5MjQ0NzAzNzM1ZS0zMTQgLT4gMS4yMTU3NTg1ODA3NDgwMjg2ZS0xNTcgMS4yMTU3NTg2MTAwMDc3MjQyZS0xNTcKK3NxcnQwMTIzIHNxcnQgLTQuOTk2MzI0NDIwNjgwMTIxOGUtMzE0IC04LjQ3MTg0MjQ0MjM2OTAyMjdlLTMxOSAtPiAxLjg5NTA1ODIzMTI1NDA0MzdlLTE2MiAtMi4yMzUyNDU5NDE5NTc4OTcxZS0xNTcKK3NxcnQwMTI0IHNxcnQgMC4wIDcuNjk5NTUzNjA5Mzg1MTk1ZS0zMTggLT4gMS45NjIwODQ4MTA3Nzk3NDc2ZS0xNTkgMS45NjIwODQ4MTA3Nzk3NDc2ZS0xNTkKK3NxcnQwMTI1IHNxcnQgLTAuMCAzLjM5MDA4MjY2MDY0OTk0MTVlLTMwOSAtPiA0LjExNzA4Nzk2Mzk5MjIzMjdlLTE1NSA0LjExNzA4Nzk2Mzk5MjIzMjdlLTE1NQorc3FydDAxMjYgc3FydCAwLjAgLTkuODkwNzk4OTc3MjI1MDgyOGUtMzE5IC0+IDcuMDMyMzUzNDM4NjUyMzQyZS0xNjAgLTcuMDMyMzUzNDM4NjUyMzQyZS0xNjAKK3NxcnQwMTI3IHNxcnQgLTAuMCAtMS4zNzIyOTM5MzY3NTkwOTA4ZS0zMTUgLT4gMi42MTk0NDA3MTk2NTY2NzAyZS0xNTggLTIuNjE5NDQwNzE5NjU2NjcwMmUtMTU4CitzcXJ0MDEyOCBzcXJ0IDcuOTA1MDUwMzMzNDU5OTQ0N2UtMzIzIDAuMCAtPiA4Ljg5MTAzNDk5Nzk0MDMwOTllLTE2MiAwLjAKK3NxcnQwMTI5IHNxcnQgMS44NjIzMjQxNzY4MzQ5NDg2ZS0zMDkgLTAuMCAtPiA0LjMxNTQ2NTQxNzM1MDY1NzllLTE1NSAtMC4wCitzcXJ0MDEzMCBzcXJ0IC0yLjY2NTk3MTEzNDQ5OTg4N2UtMzA4IDAuMCAtPiAwLjAgMS42MzI3ODAxODU2MDM2NDkxZS0xNTQKK3NxcnQwMTMxIHNxcnQgLTEuNTQ3NzA2NjY5NDQ2NzI0NWUtMzEwIC0wLjAgLT4gMC4wIC0xLjI0NDA2ODU5NTE1MzMwNzdlLTE1NQorCistLSBpbnB1dHMgd2hvc2UgYWJzb2x1dGUgdmFsdWUgb3ZlcmZsb3dzCitzcXJ0MDE0MCBzcXJ0IDEuNjk5OTk5OTk5OTk5OTk5OWUrMzA4IC0xLjY5OTk5OTk5OTk5OTk5OTllKzMwOCAtPiAxLjQzMjUwODgyMzAxNTQ1NzNlKzE1NCAtNS45MzM2NDU4MjcxMjEyMjA3ZSsxNTMKK3NxcnQwMTQxIHNxcnQgLTEuNzk3ZSszMDggLTkuOTk5OTk5OTk5OTk5OTk5OWUrMzA2IC0+IDMuNzI4NDQ3NjQzMjA1NzMwN2UrMTUyIC0xLjM0MTA0MDY4OTk4MDI5MDFlKzE1NAorCistLSBzcGVjaWFsIHZhbHVlcworc3FydDEwMDAgc3FydCAwLjAgMC4wIC0+IDAuMCAwLjAKK3NxcnQxMDAxIHNxcnQgLTAuMCAwLjAgLT4gMC4wIDAuMAorc3FydDEwMDIgc3FydCAwLjAgaW5mIC0+IGluZiBpbmYKK3NxcnQxMDAzIHNxcnQgMi4zIGluZiAtPiBpbmYgaW5mCitzcXJ0MTAwNCBzcXJ0IGluZiBpbmYgLT4gaW5mIGluZgorc3FydDEwMDUgc3FydCAtMC4wIGluZiAtPiBpbmYgaW5mCitzcXJ0MTAwNiBzcXJ0IC0yLjMgaW5mIC0+IGluZiBpbmYKK3NxcnQxMDA3IHNxcnQgLWluZiBpbmYgLT4gaW5mIGluZgorc3FydDEwMDggc3FydCBuYW4gaW5mIC0+IGluZiBpbmYKK3NxcnQxMDA5IHNxcnQgMC4wIG5hbiAtPiBuYW4gbmFuCitzcXJ0MTAxMCBzcXJ0IDIuMyBuYW4gLT4gbmFuIG5hbgorc3FydDEwMTEgc3FydCAtMC4wIG5hbiAtPiBuYW4gbmFuCitzcXJ0MTAxMiBzcXJ0IC0yLjMgbmFuIC0+IG5hbiBuYW4KK3NxcnQxMDEzIHNxcnQgLWluZiAwLjAgLT4gMC4wIGluZgorc3FydDEwMTQgc3FydCAtaW5mIDIuMyAtPiAwLjAgaW5mCitzcXJ0MTAxNSBzcXJ0IGluZiAwLjAgLT4gaW5mIDAuMAorc3FydDEwMTYgc3FydCBpbmYgMi4zIC0+IGluZiAwLjAKK3NxcnQxMDE3IHNxcnQgLWluZiBuYW4gLT4gbmFuIGluZiAgICAgICBpZ25vcmUtaW1hZy1zaWduCitzcXJ0MTAxOCBzcXJ0IGluZiBuYW4gLT4gaW5mIG5hbgorc3FydDEwMTkgc3FydCBuYW4gMC4wIC0+IG5hbiBuYW4KK3NxcnQxMDIwIHNxcnQgbmFuIDIuMyAtPiBuYW4gbmFuCitzcXJ0MTAyMSBzcXJ0IG5hbiBuYW4gLT4gbmFuIG5hbgorc3FydDEwMjIgc3FydCAwLjAgLTAuMCAtPiAwLjAgLTAuMAorc3FydDEwMjMgc3FydCAtMC4wIC0wLjAgLT4gMC4wIC0wLjAKK3NxcnQxMDI0IHNxcnQgMC4wIC1pbmYgLT4gaW5mIC1pbmYKK3NxcnQxMDI1IHNxcnQgMi4zIC1pbmYgLT4gaW5mIC1pbmYKK3NxcnQxMDI2IHNxcnQgaW5mIC1pbmYgLT4gaW5mIC1pbmYKK3NxcnQxMDI3IHNxcnQgLTAuMCAtaW5mIC0+IGluZiAtaW5mCitzcXJ0MTAyOCBzcXJ0IC0yLjMgLWluZiAtPiBpbmYgLWluZgorc3FydDEwMjkgc3FydCAtaW5mIC1pbmYgLT4gaW5mIC1pbmYKK3NxcnQxMDMwIHNxcnQgbmFuIC1pbmYgLT4gaW5mIC1pbmYKK3NxcnQxMDMxIHNxcnQgLWluZiAtMC4wIC0+IDAuMCAtaW5mCitzcXJ0MTAzMiBzcXJ0IC1pbmYgLTIuMyAtPiAwLjAgLWluZgorc3FydDEwMzMgc3FydCBpbmYgLTAuMCAtPiBpbmYgLTAuMAorc3FydDEwMzQgc3FydCBpbmYgLTIuMyAtPiBpbmYgLTAuMAorc3FydDEwMzUgc3FydCBuYW4gLTAuMCAtPiBuYW4gbmFuCitzcXJ0MTAzNiBzcXJ0IG5hbiAtMi4zIC0+IG5hbiBuYW4KKworCistLSBGb3IgZXhwLCBjb3NoLCBzaW5oLCB0YW5oIHdlIGxpbWl0IHRlc3RzIHRvIGFyZ3VtZW50cyB3aG9zZQorLS0gaW1hZ2luYXJ5IHBhcnQgaXMgbGVzcyB0aGFuIDEwIGluIGFic29sdXRlIHZhbHVlOiAgbW9zdCBtYXRoCistLSBsaWJyYXJpZXMgaGF2ZSBwb29yIGFjY3VyYWN5IGZvciAocmVhbCkgc2luZSBhbmQgY29zaW5lIGZvcgorLS0gbGFyZ2UgYXJndW1lbnRzLCBhbmQgdGhlIGFjY3VyYWN5IG9mIHRoZXNlIGNvbXBsZXggZnVuY3Rpb25zCistLSBzdWZmZXIgY29ycmVzcG9uZGluZ2x5LgorLS0KKy0tIFNpbWlsYXJseSwgZm9yIGNvcywgc2luIGFuZCB0YW4gd2UgbGltaXQgdGVzdHMgdG8gYXJndW1lbnRzCistLSB3aXRoIHJlbGF0aXZlbHkgc21hbGwgcmVhbCBwYXJ0LgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGV4cDogRXhwb25lbnRpYWwgZnVuY3Rpb24gLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gemVyb3MKK2V4cDAwMDAgZXhwIDAuMCAwLjAgLT4gMS4wIDAuMAorZXhwMDAwMSBleHAgMC4wIC0wLjAgLT4gMS4wIC0wLjAKK2V4cDAwMDIgZXhwIC0wLjAgMC4wIC0+IDEuMCAwLjAKK2V4cDAwMDMgZXhwIC0wLjAgLTAuMCAtPiAxLjAgLTAuMAorCistLSByYW5kb20gaW5wdXRzCitleHAwMDA0IGV4cCAtMTcuOTU3MzU5MDA5NTY0Njg0IC0xLjEwODYxMzg5NTc5NTI3NCAtPiA3LjA4NjkyOTI1NzYyMjY2MTFlLTA5IC0xLjQyMjU5MjkyMDIzNzc4MzNlLTA4CitleHAwMDA1IGV4cCAtMS40NDU2MTQ5NjYzMzY4NjQyZS0xNSAtMC43NTM1OTgxNzMzMTc3MjIzOSAtPiAwLjcyOTIzMTQ4MzIzOTE3OTk3IC0wLjY4NDI2NzA4NTE3NDE5MDMzCitleHAwMDA2IGV4cCAtMC43NjAwODY1NDg4MzUxMjY2MSAtMC40NjY1NzIzNTQ4MDEwNTAxOSAtPiAwLjQxNzY0MzkzMTA5OTI4NjY2IC0wLjIxMDM1MTA4Mzk2NzkyODU0CitleHAwMDA3IGV4cCAtNS43MDcxNjE0Njk3NzM1NzMxIC0yLjM3NDQxNjE4MTgxMTU4MTZlLTExIC0+IDAuMDAzMzIyMDg5MDI0MjA2ODM1NiAtNy44ODgwMjE5MzY0OTUzNTc4ZS0xNAorZXhwMDAwOCBleHAgLTAuNDY1Mzk4MTMyNzkyNzA5NyAtNS4yMjM2NzA2NjY3NDQ1NTg3ZS0yMSAtPiAwLjYyNzg4NTA3Mzc4MjE2NjYzIC0zLjI3OTg2NDg0MjAwMjY0NjhlLTIxCitleHAwMDA5IGV4cCAtMy4yNDQ0NTY1MjQyMjk1NTE4IDEuMTUzNTYyNTMwNDI0Mzk1OSAtPiAwLjAxNTc5OTkzNjkzMTQ1NzY0MSAwLjAzNTY0NDk1MDM4MDAyNDc0OQorZXhwMDAxMCBleHAgLTMuMDY1MTQ1NjMzNzk3NzcyNyAwLjg3NzY1MDg2NTMyMzkxODc4IC0+IDAuMDI5ODA1NTk1NjI5ODU1OTUzIDAuMDM1ODgyNzc1MTgwODU1NjY5CitleHAwMDExIGV4cCAtMC4xMTA4MDgyMzc1MzIzMzkyNiAwLjk2NDg2Mzg2MzAwODczMTA2IC0+IDAuNTA5NzkxMTI1MzQzNzYzMTQgMC43MzU3NTUxMjQxOTU2MTU2MgorZXhwMDAxMiBleHAgLTIuNTYyOTcyMjU5ODkyODY0OCAwLjAxOTYzNjIzNTc1NDcwODA3OSAtPiAwLjA3NzA2MDQ1Mjg1MzkxNzM5NyAwLjAwMTUxMzM3MTczNDExMzc2ODQKK2V4cDAwMTMgZXhwIC0zLjMyMDE3MDk5NTc5ODMzNTdlLTEwIDEuMjY4NDAxNzM0NDQ4NzI2OCAtPiAwLjI5NzgwNjk5ODU1NDM0ODg5IDAuOTU0NjI2MTAwMDc2ODkxODYKK2V4cDAwMTQgZXhwIDAuODg3NjcyNzYwNTc5OTMyNzIgLTAuMTg5NTM0MjI5ODY4OTU1NTcgLT4gMi4zODU5NjI0MDQ5ODU4MDk1IC0wLjQ1NzcxNTU5MTMyMDQ0NDI2CitleHAwMDE1IGV4cCAxLjU3MzgzMzM0ODY3OTQ3NDIgLTIuMjU3NjgwMzA3NTU0NDMyOGUtMTEgLT4gNC44MjUxMDkxMTMyNDU4NjU0IC0xLjA4OTM1NTM4MjY3NzY2MjNlLTEwCitleHAwMDE2IGV4cCAxLjY0MDg3MDIzNDE4MTM3OTUgLTEuNDM4ODc5NDg0MzgwODM3IC0+IDAuNjc4NjczMzU5MDY4OTA0OCAtNS4xMTQ4Mjg0MTczMTY4ODI1CitleHAwMDE3IGV4cCAxLjgyMDI3OTQyNDIwMjAzMyAtMC4wMjA4MTIwNDAzNzA3ODU3MjIgLT4gNi4xNzIyNDYyODk2NDIwOTAyIC0wLjEyODQ3NTU4ODg0MzUwNTEKK2V4cDAwMTggZXhwIDEuNzI3Mzk2NTczNTk0NTg3MyAtMC42MTE0MDYyMTMyODk1NDk0NyAtPiA0LjYwNjc5MzE4OTg3OTk5NzYgLTMuMjI5NDI2NzY5NDQ0MTMwOAorZXhwMDAxOSBleHAgMi41NjA2MDM0MzA2ODYyOTk1IDAuMDk4MTUzMTM2MDA4NDM1NTA0IC0+IDEyLjg4MTMyNTg4OTk2NjYyOSAxLjI2ODQxODQ4MTI4NjQ0OTQKK2V4cDAwMjAgZXhwIDEwLjI4MDM2ODYxOTQ4MzAyOSAzLjQ1NjQ2MjI1NTk3NDg1MzUgLT4gLTI3NzIxLjI4MzMyMTU1MTUwMiAtOTAyOC45NjYzMjE1NTY4ODM1CitleHAwMDIxIGV4cCAxLjEwNDAwNzQwNTEyOTc0MWUtMTU1IDAuMjEyNTg4MDMwNjczMTcyNzggLT4gMC45Nzc0ODgxMzkzMzUzMTc2NCAwLjIxMDk5MDM3MjkwNTQ0NDc4CitleHAwMDIyIGV4cCAwLjAyNzM2NDc3NzgwOTI5NTE3MiAwLjAwMDU5MjI2NjAzNTAwNjIzMzYzIC0+IDEuMDI3NzQyNDUxODQ1MTg3NiAwLjAwMDYwODY5NzAxODEzNDY1NzkKK2V4cDAwMjMgZXhwIDAuOTQzNTYzMTM0MjkyNTUyNDUgMy40MTg1MzA0NjM1MTg1OTIgLT4gLTIuNDcxMjI4NTY5NTM0NjE5NCAtMC43MDI0MjY1NDkwMDIxODM0OQorCistLSBjYXNlcyB3aGVyZSBleHAoeikgcmVwcmVzZW50YWJsZSwgZXhwKHoucmVhbCkgbm90CitleHAwMDMwIGV4cCA3MTAuMCAwLjc4NTAwMDAwMDAwMDAwMDAzIC0+IDEuNTgwMzAxNjkwOTYzNzE1OGUrMzA4IDEuNTc5MDQzNzU1MTgwNjkxMWUrMzA4CitleHAwMDMxIGV4cCA3MTAuMCAtMC43ODUwMDAwMDAwMDAwMDAwMyAtPiAxLjU4MDMwMTY5MDk2MzcxNThlKzMwOCAtMS41NzkwNDM3NTUxODA2OTExZSszMDgKKworLS0gdmFsdWVzIGZvciB3aGljaCBleHAoeCkgaXMgc3Vibm9ybWFsLCBvciB1bmRlcmZsb3dzIHRvIDAKK2V4cDAwNDAgZXhwIC03MzUuMCAwLjc4NTAwMDAwMDAwMDAwMDAzIC0+IDQuMzk3Njc4MzEzNjMyOTM1NWUtMzIwIDQuMzk0MjE5ODU0MTEyMDQ2OGUtMzIwCitleHAwMDQxIGV4cCAtNzM1LjAgLTIuMzU1OTk5OTk5OTk5OTk5OSAtPiAtNC4zOTUyMDc5ODU0MDM3MjkzZS0zMjAgLTQuMzk2NjkwMTgyMzQxMjUzZS0zMjAKK2V4cDAwNDIgZXhwIC03NDUuMCAwLjAgLT4gNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjQgMC4wCitleHAwMDQzIGV4cCAtNzQ1LjAgMC43IC0+IDAuMCAwLjAKK2V4cDAwNDQgZXhwIC03NDUuMCAyLjEgLT4gLTAuMCAwLjAKK2V4cDAwNDUgZXhwIC03NDUuMCAzLjcgLT4gLTAuMCAtMC4wCitleHAwMDQ2IGV4cCAtNzQ1LjAgNS4zIC0+IDAuMCAtMC4wCisKKy0tIHZhbHVlcyBmb3Igd2hpY2ggZXhwKHopIG92ZXJmbG93cworZXhwMDA1MCBleHAgNzEwLjAgMC4wIC0+IGluZiAwLjAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdworZXhwMDA1MSBleHAgNzExLjAgMC43IC0+IGluZiBpbmYgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdworZXhwMDA1MiBleHAgNzEwLjAgMS41IC0+IDEuNTgwMjY1MzgyOTg1NzM3NmUrMzA3IGluZiAgICBvdmVyZmxvdworZXhwMDA1MyBleHAgNzEwLjAgMS42IC0+IC02LjUyMzE1Nzk5OTU1MDEzNzJlKzMwNiBpbmYgICBvdmVyZmxvdworZXhwMDA1NCBleHAgNzEwLjAgMi44IC0+IC1pbmYgNy40ODM2MTc3NDE3NDQ4NTI4ZSszMDcgICBvdmVyZmxvdworCistLSBzcGVjaWFsIHZhbHVlcworZXhwMTAwMCBleHAgMC4wIDAuMCAtPiAxLjAgMC4wCitleHAxMDAxIGV4cCAtMC4wIDAuMCAtPiAxLjAgMC4wCitleHAxMDAyIGV4cCAwLjAgaW5mIC0+IG5hbiBuYW4gICAgICAgICAgaW52YWxpZAorZXhwMTAwMyBleHAgMi4zIGluZiAtPiBuYW4gbmFuICAgICAgICAgIGludmFsaWQKK2V4cDEwMDQgZXhwIC0wLjAgaW5mIC0+IG5hbiBuYW4gICAgICAgICBpbnZhbGlkCitleHAxMDA1IGV4cCAtMi4zIGluZiAtPiBuYW4gbmFuICAgICAgICAgaW52YWxpZAorZXhwMTAwNiBleHAgMC4wIG5hbiAtPiBuYW4gbmFuCitleHAxMDA3IGV4cCAyLjMgbmFuIC0+IG5hbiBuYW4KK2V4cDEwMDggZXhwIC0wLjAgbmFuIC0+IG5hbiBuYW4KK2V4cDEwMDkgZXhwIC0yLjMgbmFuIC0+IG5hbiBuYW4KK2V4cDEwMTAgZXhwIC1pbmYgMC4wIC0+IDAuMCAwLjAKK2V4cDEwMTEgZXhwIC1pbmYgMS40IC0+IDAuMCAwLjAKK2V4cDEwMTIgZXhwIC1pbmYgMi44IC0+IC0wLjAgMC4wCitleHAxMDEzIGV4cCAtaW5mIDQuMiAtPiAtMC4wIC0wLjAKK2V4cDEwMTQgZXhwIC1pbmYgNS42IC0+IDAuMCAtMC4wCitleHAxMDE1IGV4cCAtaW5mIDcuMCAtPiAwLjAgMC4wCitleHAxMDE2IGV4cCBpbmYgMC4wIC0+IGluZiAwLjAKK2V4cDEwMTcgZXhwIGluZiAxLjQgLT4gaW5mIGluZgorZXhwMTAxOCBleHAgaW5mIDIuOCAtPiAtaW5mIGluZgorZXhwMTAxOSBleHAgaW5mIDQuMiAtPiAtaW5mIC1pbmYKK2V4cDEwMjAgZXhwIGluZiA1LjYgLT4gaW5mIC1pbmYKK2V4cDEwMjEgZXhwIGluZiA3LjAgLT4gaW5mIGluZgorZXhwMTAyMiBleHAgLWluZiBpbmYgLT4gMC4wIDAuMCAgICAgICAgIGlnbm9yZS1yZWFsLXNpZ24gaWdub3JlLWltYWctc2lnbgorZXhwMTAyMyBleHAgaW5mIGluZiAtPiBpbmYgbmFuICAgICAgICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorZXhwMTAyNCBleHAgLWluZiBuYW4gLT4gMC4wIDAuMCAgICAgICAgIGlnbm9yZS1yZWFsLXNpZ24gaWdub3JlLWltYWctc2lnbgorZXhwMTAyNSBleHAgaW5mIG5hbiAtPiBpbmYgbmFuICAgICAgICAgIGlnbm9yZS1yZWFsLXNpZ24KK2V4cDEwMjYgZXhwIG5hbiAwLjAgLT4gbmFuIDAuMAorZXhwMTAyNyBleHAgbmFuIDIuMyAtPiBuYW4gbmFuCitleHAxMDI4IGV4cCBuYW4gaW5mIC0+IG5hbiBuYW4KK2V4cDEwMjkgZXhwIG5hbiBuYW4gLT4gbmFuIG5hbgorZXhwMTAzMCBleHAgMC4wIC0wLjAgLT4gMS4wIC0wLjAKK2V4cDEwMzEgZXhwIC0wLjAgLTAuMCAtPiAxLjAgLTAuMAorZXhwMTAzMiBleHAgMC4wIC1pbmYgLT4gbmFuIG5hbiAgICAgICAgIGludmFsaWQKK2V4cDEwMzMgZXhwIDIuMyAtaW5mIC0+IG5hbiBuYW4gICAgICAgICBpbnZhbGlkCitleHAxMDM0IGV4cCAtMC4wIC1pbmYgLT4gbmFuIG5hbiAgICAgICAgaW52YWxpZAorZXhwMTAzNSBleHAgLTIuMyAtaW5mIC0+IG5hbiBuYW4gICAgICAgIGludmFsaWQKK2V4cDEwMzYgZXhwIC1pbmYgLTAuMCAtPiAwLjAgLTAuMAorZXhwMTAzNyBleHAgLWluZiAtMS40IC0+IDAuMCAtMC4wCitleHAxMDM4IGV4cCAtaW5mIC0yLjggLT4gLTAuMCAtMC4wCitleHAxMDM5IGV4cCAtaW5mIC00LjIgLT4gLTAuMCAwLjAKK2V4cDEwNDAgZXhwIC1pbmYgLTUuNiAtPiAwLjAgMC4wCitleHAxMDQxIGV4cCAtaW5mIC03LjAgLT4gMC4wIC0wLjAKK2V4cDEwNDIgZXhwIGluZiAtMC4wIC0+IGluZiAtMC4wCitleHAxMDQzIGV4cCBpbmYgLTEuNCAtPiBpbmYgLWluZgorZXhwMTA0NCBleHAgaW5mIC0yLjggLT4gLWluZiAtaW5mCitleHAxMDQ1IGV4cCBpbmYgLTQuMiAtPiAtaW5mIGluZgorZXhwMTA0NiBleHAgaW5mIC01LjYgLT4gaW5mIGluZgorZXhwMTA0NyBleHAgaW5mIC03LjAgLT4gaW5mIC1pbmYKK2V4cDEwNDggZXhwIC1pbmYgLWluZiAtPiAwLjAgMC4wICAgICAgICBpZ25vcmUtcmVhbC1zaWduIGlnbm9yZS1pbWFnLXNpZ24KK2V4cDEwNDkgZXhwIGluZiAtaW5mIC0+IGluZiBuYW4gICAgICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK2V4cDEwNTAgZXhwIG5hbiAtMC4wIC0+IG5hbiAtMC4wCitleHAxMDUxIGV4cCBuYW4gLTIuMyAtPiBuYW4gbmFuCitleHAxMDUyIGV4cCBuYW4gLWluZiAtPiBuYW4gbmFuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGNvc2g6IEh5cGVyYm9saWMgQ29zaW5lIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSB6ZXJvcworY29zaDAwMDAgY29zaCAwLjAgMC4wIC0+IDEuMCAwLjAKK2Nvc2gwMDAxIGNvc2ggMC4wIC0wLjAgLT4gMS4wIC0wLjAKK2Nvc2gwMDAyIGNvc2ggLTAuMCAwLjAgLT4gMS4wIC0wLjAKK2Nvc2gwMDAzIGNvc2ggLTAuMCAtMC4wIC0+IDEuMCAwLjAKKworLS0gcmFuZG9tIGlucHV0cworY29zaDAwMDQgY29zaCAtMC44NTM5NTI2NDI5NzQxNDI1MyAtOC44NTUzNzU2MTQ4NjcxOTU4IC0+IC0xLjE2ODQzNDAzNDgwMjExODUgMC41MTg0MjE5NTM1OTc4NzQzNQorY29zaDAwMDUgY29zaCAtMTkuNTg0OTA0MjM3MjExMjIzIC0wLjA2NjU4MjYyNzk5NDkwNjE3NyAtPiAxNTk4MTY4MTIuMjMzMzY5OTIgMTA2NTY3NzYuMDUwNDA2MjQ2Citjb3NoMDAwNiBjb3NoIC0wLjExMDcyNjE4NDAxMTMwNzcyIC0xLjQ4NDgyMDIxNTA3MzI0NyAtPiAwLjA4NjM5NzE2NDc0NDk0OTUwMyAwLjExMDU0Mjc1NjM3NzE3Mjg0Citjb3NoMDAwNyBjb3NoIC0zLjQ3NjQ4NDAyNTA2ODE3NTIgLTAuNDg0NDAzNDgyODgyNzUyNzYgLT4gMTQuMzI1OTMxOTU1MTkwODQ0IDcuNTI0MjA1MzU0ODczNzk1NQorY29zaDAwMDggY29zaCAtMC41MjA0NzA2MzYwNDUyNDYwMiAtMC4zNjAzODA1MzgyNzc1NTg1IC0+IDEuMDY1Mzk0MDM1NDY4MzgwMiAwLjE5MTkzMjkzNjA2MjUyNDczCitjb3NoMDAwOSBjb3NoIC0xLjM5NTE4OTYyOTc1OTk1IDAuMDA3NDczODYwNDcwMDcwMjkwNiAtPiAyLjE0MTcwMzEwMjcyMzU5NjkgLTAuMDE0MTU1MTg3MTIyOTYzMDgKK2Nvc2gwMDEwIGNvc2ggLTAuMzcxMDcwNjQ3NTc2NTM1NDEgMC4xNDcyODA4NTMwNzg1NjYwOSAtPiAxLjA1ODA2MDE0OTY3NzY5OTEgLTAuMDU1NzEyNTMxOTY0NTY4NTg3Citjb3NoMDAxMSBjb3NoIC01Ljg0NzAyMDA5NTg3Mzk2NTMgNC4wMDIxNzIyMzg4MzM2MjkyIC0+IC0xMTIuODYyMjA2Njc2MTgyODUgMTMxLjI0NzM0MDMzNTQ1MDEzCitjb3NoMDAxMiBjb3NoIC0wLjE3MDAyNjE0NDQ4NTE4ODMgMC45NzE2NzU0MDEzNTM1NDUxMyAtPiAwLjU3MjA4NzQ4MjUzNTc3OTQ2IC0wLjE0MTA5MDQ4MjAyNDAyMDMKK2Nvc2gwMDEzIGNvc2ggLTAuNDQwNDIzOTc5MDI2NDg3ODMgMS4wOTA0NzkxOTY0MTM5NzQyIC0+IDAuNTA3NjAzMjIzOTMwNTgxMzMgLTAuNDAzMzM5NjY2NTIwMTA4MTYKK2Nvc2gwMDE0IGNvc2ggMC4wNTIyNjc1NTI0OTE4NjcyOTkgLTMuODg4OTAxMTQzMDY0NDE3NCAtPiAtMC43MzQ1MjMwMzQxNDYzOTI5NyAwLjAzNTU0MDcwNDgzMzUzNzEzNAorY29zaDAwMTUgY29zaCAwLjk4MDAwNzY0MTc3MTI3NDUzIC0xLjI1NDg4MjkyNDc3ODQwOTcgLT4gMC40NzIyMDc0NzM0MTQxNjE0MiAtMS4wODc5NDIxNDMyMTgwMzE2Citjb3NoMDAxNiBjb3NoIDAuMDgzNTk0NzAxMjIyNjQ0MDA4IC0wLjg4ODQ3ODk5OTMwMTgxMjg0IC0+IDAuNjMyNzk3ODI0MTkzMTI2MTMgLTAuMDY0OTU0NTY2ODE2MDAyMjg1Citjb3NoMDAxNyBjb3NoIDEuMzgxNzM1MzE3ODM3NzYgLTAuNDMxODUwNDA4MTY3MzIyMjkgLT4gMS45MjIxNjYzMzc0NjcxNjQ3IC0wLjc4MDczODMwODU4ODQ5MzQ3Citjb3NoMDAxOCBjb3NoIDAuNTczMTU2ODExMjAxNDg0NjUgLTAuMjIyNTU3NjA5NTEwMjc5NDIgLT4gMS4xMzk5NzMzMTI1MTczMDA0IC0wLjEzMzU1MTIzNDM2MDU5NTYKK2Nvc2gwMDE5IGNvc2ggMS44ODgyNTEyMzMzMDYyMzQ3IDQuNTAyNDkzMjE4MjM4Mzc5NyAtPiAtMC43MDQxNjAyMDY1MzYyNjkxIC0zLjE1NzM4MjIxMzE5NjQ2MTUKK2Nvc2gwMDIwIGNvc2ggMC41NjE4MjE5MjA2ODU4MzE3IDAuOTI2MjA0NTIxMjk1NzUzNDggLT4gMC42OTgyMjM4MDQwNTM3ODM4MSAwLjQ3MzA5MDY3NDcxMDU0NTIyCitjb3NoMDAyMSBjb3NoIDAuNTQzNjE0NDI4NDcwNjI1OTEgMC42NDE3NjQ4MzU4MzAxODQ2MiAtPiAwLjkyMjM0NDYyMDc0MTkzNDkxIDAuMzQxNjc5MDY0OTU4NDU1MDEKK2Nvc2gwMDIyIGNvc2ggMC4wMDE0Nzc3NDAzMTA3OTIwMzMxIDEuMzY4MjAyODEyMjY3NzY2MSAtPiAwLjIwMTIxMDY5NjM4OTk1NDkgMC4wMDE0NDc1MTgxMzc4NjMyMTkKK2Nvc2gwMDIzIGNvc2ggMi4yMTg4ODU5NDQzNjM1MDEgMi4wMDE1NzI3Mzk1ODgzNjg3IC0+IC0xLjk0Mjk0MzIxMDgxOTY4IDQuMTI5MDI2OTE3NjA4MzE5NgorCistLSBsYXJnZSByZWFsIHBhcnQKK2Nvc2gwMDMwIGNvc2ggNzEwLjUgMi4zNTE5OTk5OTk5OTk5OTk5IC0+IC0xLjI5Njc0NjUyMzkzNTU5OThlKzMwOCAxLjMwNzY3MDc5MDg4NTczMzNlKzMwOAorY29zaDAwMzEgY29zaCAtNzEwLjUgMC42OTk5OTk5OTk5OTk5OTk5NiAtPiAxLjQwODU0NjYzODEzOTI0OTllKzMwOCAtMS4xODY0MDI0NjY2NDUwMjM5ZSszMDgKKworLS0gc3BlY2lhbCB2YWx1ZXMKK2Nvc2gxMDAwIGNvc2ggMC4wIDAuMCAtPiAxLjAgMC4wCitjb3NoMTAwMSBjb3NoIDAuMCBpbmYgLT4gbmFuIDAuMCAgICAgICAgaW52YWxpZCBpZ25vcmUtaW1hZy1zaWduCitjb3NoMTAwMiBjb3NoIDAuMCBuYW4gLT4gbmFuIDAuMCAgICAgICAgaWdub3JlLWltYWctc2lnbgorY29zaDEwMDMgY29zaCAyLjMgaW5mIC0+IG5hbiBuYW4gICAgICAgIGludmFsaWQKK2Nvc2gxMDA0IGNvc2ggMi4zIG5hbiAtPiBuYW4gbmFuCitjb3NoMTAwNSBjb3NoIGluZiAwLjAgLT4gaW5mIDAuMAorY29zaDEwMDYgY29zaCBpbmYgMS40IC0+IGluZiBpbmYKK2Nvc2gxMDA3IGNvc2ggaW5mIDIuOCAtPiAtaW5mIGluZgorY29zaDEwMDggY29zaCBpbmYgNC4yIC0+IC1pbmYgLWluZgorY29zaDEwMDkgY29zaCBpbmYgNS42IC0+IGluZiAtaW5mCitjb3NoMTAxMCBjb3NoIGluZiA3LjAgLT4gaW5mIGluZgorY29zaDEwMTEgY29zaCBpbmYgaW5mIC0+IGluZiBuYW4gICAgICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorY29zaDEwMTIgY29zaCBpbmYgbmFuIC0+IGluZiBuYW4KK2Nvc2gxMDEzIGNvc2ggbmFuIDAuMCAtPiBuYW4gMC4wICAgICAgICBpZ25vcmUtaW1hZy1zaWduCitjb3NoMTAxNCBjb3NoIG5hbiAyLjMgLT4gbmFuIG5hbgorY29zaDEwMTUgY29zaCBuYW4gaW5mIC0+IG5hbiBuYW4KK2Nvc2gxMDE2IGNvc2ggbmFuIG5hbiAtPiBuYW4gbmFuCitjb3NoMTAxNyBjb3NoIDAuMCAtMC4wIC0+IDEuMCAtMC4wCitjb3NoMTAxOCBjb3NoIDAuMCAtaW5mIC0+IG5hbiAwLjAgICAgICAgaW52YWxpZCBpZ25vcmUtaW1hZy1zaWduCitjb3NoMTAxOSBjb3NoIDIuMyAtaW5mIC0+IG5hbiBuYW4gICAgICAgaW52YWxpZAorY29zaDEwMjAgY29zaCBpbmYgLTAuMCAtPiBpbmYgLTAuMAorY29zaDEwMjEgY29zaCBpbmYgLTEuNCAtPiBpbmYgLWluZgorY29zaDEwMjIgY29zaCBpbmYgLTIuOCAtPiAtaW5mIC1pbmYKK2Nvc2gxMDIzIGNvc2ggaW5mIC00LjIgLT4gLWluZiBpbmYKK2Nvc2gxMDI0IGNvc2ggaW5mIC01LjYgLT4gaW5mIGluZgorY29zaDEwMjUgY29zaCBpbmYgLTcuMCAtPiBpbmYgLWluZgorY29zaDEwMjYgY29zaCBpbmYgLWluZiAtPiBpbmYgbmFuICAgICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorY29zaDEwMjcgY29zaCBuYW4gLTAuMCAtPiBuYW4gMC4wICAgICAgIGlnbm9yZS1pbWFnLXNpZ24KK2Nvc2gxMDI4IGNvc2ggbmFuIC0yLjMgLT4gbmFuIG5hbgorY29zaDEwMjkgY29zaCBuYW4gLWluZiAtPiBuYW4gbmFuCitjb3NoMTAzMCBjb3NoIC0wLjAgLTAuMCAtPiAxLjAgMC4wCitjb3NoMTAzMSBjb3NoIC0wLjAgLWluZiAtPiBuYW4gMC4wICAgICAgaW52YWxpZCBpZ25vcmUtaW1hZy1zaWduCitjb3NoMTAzMiBjb3NoIC0wLjAgbmFuIC0+IG5hbiAwLjAgICAgICAgaWdub3JlLWltYWctc2lnbgorY29zaDEwMzMgY29zaCAtMi4zIC1pbmYgLT4gbmFuIG5hbiAgICAgIGludmFsaWQKK2Nvc2gxMDM0IGNvc2ggLTIuMyBuYW4gLT4gbmFuIG5hbgorY29zaDEwMzUgY29zaCAtaW5mIC0wLjAgLT4gaW5mIDAuMAorY29zaDEwMzYgY29zaCAtaW5mIC0xLjQgLT4gaW5mIGluZgorY29zaDEwMzcgY29zaCAtaW5mIC0yLjggLT4gLWluZiBpbmYKK2Nvc2gxMDM4IGNvc2ggLWluZiAtNC4yIC0+IC1pbmYgLWluZgorY29zaDEwMzkgY29zaCAtaW5mIC01LjYgLT4gaW5mIC1pbmYKK2Nvc2gxMDQwIGNvc2ggLWluZiAtNy4wIC0+IGluZiBpbmYKK2Nvc2gxMDQxIGNvc2ggLWluZiAtaW5mIC0+IGluZiBuYW4gICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK2Nvc2gxMDQyIGNvc2ggLWluZiBuYW4gLT4gaW5mIG5hbgorY29zaDEwNDMgY29zaCAtMC4wIDAuMCAtPiAxLjAgLTAuMAorY29zaDEwNDQgY29zaCAtMC4wIGluZiAtPiBuYW4gMC4wICAgICAgIGludmFsaWQgaWdub3JlLWltYWctc2lnbgorY29zaDEwNDUgY29zaCAtMi4zIGluZiAtPiBuYW4gbmFuICAgICAgIGludmFsaWQKK2Nvc2gxMDQ2IGNvc2ggLWluZiAwLjAgLT4gaW5mIC0wLjAKK2Nvc2gxMDQ3IGNvc2ggLWluZiAxLjQgLT4gaW5mIC1pbmYKK2Nvc2gxMDQ4IGNvc2ggLWluZiAyLjggLT4gLWluZiAtaW5mCitjb3NoMTA0OSBjb3NoIC1pbmYgNC4yIC0+IC1pbmYgaW5mCitjb3NoMTA1MCBjb3NoIC1pbmYgNS42IC0+IGluZiBpbmYKK2Nvc2gxMDUxIGNvc2ggLWluZiA3LjAgLT4gaW5mIC1pbmYKK2Nvc2gxMDUyIGNvc2ggLWluZiBpbmYgLT4gaW5mIG5hbiAgICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHNpbmg6IEh5cGVyYm9saWMgU2luZSAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tIHplcm9zCitzaW5oMDAwMCBzaW5oIDAuMCAwLjAgLT4gMC4wIDAuMAorc2luaDAwMDEgc2luaCAwLjAgLTAuMCAtPiAwLjAgLTAuMAorc2luaDAwMDIgc2luaCAtMC4wIDAuMCAtPiAtMC4wIDAuMAorc2luaDAwMDMgc2luaCAtMC4wIC0wLjAgLT4gLTAuMCAtMC4wCisKKy0tIHJhbmRvbSBpbnB1dHMKK3NpbmgwMDA0IHNpbmggLTE3LjI4MjU4ODA5MTQ2Mjc0MiAtMC4zODE4Nzk0ODY5NDEwMzU0NiAtPiAtMTQ4NjczODYuODU3MjQ4Mzk2IC01OTcwNjQ4LjY1NTM1MTY2MzkKK3NpbmgwMDA1IHNpbmggLTM0My45MTk3MTIwMzE0MzIwOCAtNS4wMTcyODY4ODc3NzcxNTI1ZS0yMiAtPiAtMS4xNTE4NjkxNzc2NTIxNzM1ZSsxNDkgLTUuNzc5MjU4MTIxNDY4OTAyMWUrMTI3CitzaW5oMDAwNiBzaW5oIC0xNC4xNzgxMjIyNTMzMDA5MjIgLTEuOTM4NzE1NzU3OTM1MTI5MyAtPiAyNTg0NDAuMzc5MDkwMzQ4MjYgLTY3MDQ1Mi41ODUwMDk0NjQ0MQorc2luaDAwMDcgc2luaCAtMS4wMzQzODEwNTgxNjg2MjM5IC0xLjA5NzAyMzUyNjYzNjk5MDUgLT4gLTAuNTYwNzA4NTgyNzgwOTI3MzkgLTEuNDA5ODg4MzI1ODA0NjY5Nworc2luaDAwMDggc2luaCAtMC4wNjYxMjY1NjE0MTYzNjgyMDQgLTAuMDcwNDYxNTg0MTY5OTYxODcyIC0+IC0wLjA2NjAxMDU1ODcwMDkzODEyNCAtMC4wNzA1NTcyNzY3Mzg2Mzc1NDIKK3NpbmgwMDA5IHNpbmggLTAuMzc2MzAxNDkxNTAzMDg0ODQgMy4zNjIxNzM0NjkyMTYyMTczIC0+IDAuMzc1OTExMTgxMTkzMzI2MTcgLTAuMjM0NDcxMTU5MjYzNjkzODMKK3NpbmgwMDEwIHNpbmggLTAuMDQ5OTQxOTYwOTc4NjcwMDU1IDAuNDAzMjM3NjcwMjA0MTQ2MjUgLT4gLTAuMDQ1OTU1NDgyMTM2MzI5MDA5IDAuMzkyODg3ODQ5NDQzMDY0Ngorc2luaDAwMTEgc2luaCAtMTYuNjQ3ODUyNjAzOTAzNzE1IDAuMDAyNjg1MjIxOTEyOTA4MjA5OCAtPiAtODQ5MjU2Ni41NzM5MzgyNTYxIDIyODA0LjQ4MDY3MTEzMzU2Mgorc2luaDAwMTIgc2luaCAtMS40NzY2MjUzMTQzMDM2OTQgMC44OTQ3Mzc3MzExNjY4MzM4NiAtPiAtMS4yOTgyOTQzMzM0MzgyMjI0IDEuNzk2NjU5MzM2Nzc5MTIwNAorc2luaDAwMTMgc2luaCAtNDIyLjM2NDI5NTc3NTU2OTEzIDAuMTAzNjY2MzQ1MDIzMDc5MTIgLT4gLTEuMzQwMDMyMTAwODkyMDA0NGUrMTgzIDEuMzk0MTYwMDk0ODA0NTU5OWUrMTgyCitzaW5oMDAxNCBzaW5oIDAuMDkxMDgzNDA3NDU2NDE5ODEgLTAuNDA0MDgyMjc0MTYwNzAzNTMgLT4gMC4wODM4NjM3MjQ4MDIyMzc5MDIgLTAuMzk0ODA3MTY1NTM5MzU2MDIKK3NpbmgwMDE1IHNpbmggMi4wMzYwNjQxMzIwNjczODYgLTIuNjgzMTcyOTk2MTM4NjIzOSAtPiAtMy4zNzYyMTEyNDM2MzE3NSAtMS43MjM4NjgzMzAwMDI4MTcKK3NpbmgwMDE2IHNpbmggMi41NjE2NzE3MjIzMDYzMzE3IC0wLjAwNzg5Nzg0OTg2MjI3MTc3NjcgLT4gNi40Mzk5NDE1ODUzODE1ODY5IC0wLjA1MTQ3MjI2NDQwMDcyMjEzMworc2luaDAwMTcgc2luaCAwLjMzNjgwNDAxMTk4NTE4OCAtNi41NjU0NjIyOTcxNjQ5MzM3IC0+IDAuMzI5NjI0OTkzMDc1NzQ1NzggLTAuMjk0NDkxNzAxNTk5OTUxOTcKK3NpbmgwMDE4IHNpbmggMC4yMzc3NDYwMzc1NTY0OTY5MyAtMC45MjQ2NzE5NTc5OTIzMjA0OSAtPiAwLjE0NDQ5ODM5NDkwNjAzMzg5IC0wLjgyMTA5NDQ5MDUzNTU2NzkzCitzaW5oMDAxOSBzaW5oIDAuMDAxMTM4ODI3MzU0MTQ2NTQ5NCAxLjk2NzYxOTY4ODI5NDk4NTUgLT4gLTAuMDAwNDQwMTQ2MDUzODk2MzQ5OTkgMC45MjIyOTM5ODQwNzA5ODgwNgorc2luaDAwMjAgc2luaCAzLjI0NDM4NzAxMDU2NjM3NTkgMC44MDU0Mjg3NTU5NjE2ODk1IC0+IDguODcwMjg5MDc3ODUyNzQyNiA5LjI2MTA3NDg1OTcwNDIxOTYKK3NpbmgwMDIxIHNpbmggMC4wNDA2Mjg5MDg4NTcwNTQ3MzggMC4wOTgyMDYzOTExOTA5NDQ5NTggLT4gMC4wNDA0NDQyNjg0MTY3MTIzMyAwLjA5ODEyOTU0NDczOTcwNzM5Mgorc2luaDAwMjIgc2luaCA0LjcyNTIyODM5MTgyMTc2OTZlLTMwIDkuMTE5ODE1NTY0MjY1NjY5NyAtPiAtNC41MDcxOTgwNTYxNjQ0NDA0ZS0zMCAwLjMwMDI1NzMwNzAxNjYxNzEzCitzaW5oMDAyMyBzaW5oIDAuMDQzNzEzNjkzNjc4NDIwMDY4IDAuMjI1MTI1NDk4ODc1MzI2NTcgLT4gMC4wNDI2MjQxOTg2NzM0MTY3MTMgMC4yMjM0NDIwMTIzMTIxNzk2MQorCistLSBsYXJnZSByZWFsIHBhcnQKK3NpbmgwMDMwIHNpbmggNzEwLjUgLTIuMzk5OTk5OTk5OTk5OTk5OSAtPiAtMS4zNTc5OTcwNTY0ODg1OTE5ZSszMDggLTEuMjQzOTQ0NzA5MDc3OThlKzMwOAorc2luaDAwMzEgc2luaCAtNzEwLjUgMC44MDAwMDAwMDAwMDAwMDAwNCAtPiAtMS4yODMwNjcxNjAxNzM1MTY0ZSszMDggMS4zMjEwOTU0MTkzOTk3Njc4ZSszMDgKKworLS0gc3BlY2lhbCB2YWx1ZXMKK3NpbmgxMDAwIHNpbmggMC4wIDAuMCAtPiAwLjAgMC4wCitzaW5oMTAwMSBzaW5oIDAuMCBpbmYgLT4gMC4wIG5hbiAgICAgICAgaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCitzaW5oMTAwMiBzaW5oIDAuMCBuYW4gLT4gMC4wIG5hbiAgICAgICAgaWdub3JlLXJlYWwtc2lnbgorc2luaDEwMDMgc2luaCAyLjMgaW5mIC0+IG5hbiBuYW4gICAgICAgIGludmFsaWQKK3NpbmgxMDA0IHNpbmggMi4zIG5hbiAtPiBuYW4gbmFuCitzaW5oMTAwNSBzaW5oIGluZiAwLjAgLT4gaW5mIDAuMAorc2luaDEwMDYgc2luaCBpbmYgMS40IC0+IGluZiBpbmYKK3NpbmgxMDA3IHNpbmggaW5mIDIuOCAtPiAtaW5mIGluZgorc2luaDEwMDggc2luaCBpbmYgNC4yIC0+IC1pbmYgLWluZgorc2luaDEwMDkgc2luaCBpbmYgNS42IC0+IGluZiAtaW5mCitzaW5oMTAxMCBzaW5oIGluZiA3LjAgLT4gaW5mIGluZgorc2luaDEwMTEgc2luaCBpbmYgaW5mIC0+IGluZiBuYW4gICAgICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorc2luaDEwMTIgc2luaCBpbmYgbmFuIC0+IGluZiBuYW4gICAgICAgIGlnbm9yZS1yZWFsLXNpZ24KK3NpbmgxMDEzIHNpbmggbmFuIDAuMCAtPiBuYW4gMC4wCitzaW5oMTAxNCBzaW5oIG5hbiAyLjMgLT4gbmFuIG5hbgorc2luaDEwMTUgc2luaCBuYW4gaW5mIC0+IG5hbiBuYW4KK3NpbmgxMDE2IHNpbmggbmFuIG5hbiAtPiBuYW4gbmFuCitzaW5oMTAxNyBzaW5oIDAuMCAtMC4wIC0+IDAuMCAtMC4wCitzaW5oMTAxOCBzaW5oIDAuMCAtaW5mIC0+IDAuMCBuYW4gICAgICAgaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCitzaW5oMTAxOSBzaW5oIDIuMyAtaW5mIC0+IG5hbiBuYW4gICAgICAgaW52YWxpZAorc2luaDEwMjAgc2luaCBpbmYgLTAuMCAtPiBpbmYgLTAuMAorc2luaDEwMjEgc2luaCBpbmYgLTEuNCAtPiBpbmYgLWluZgorc2luaDEwMjIgc2luaCBpbmYgLTIuOCAtPiAtaW5mIC1pbmYKK3NpbmgxMDIzIHNpbmggaW5mIC00LjIgLT4gLWluZiBpbmYKK3NpbmgxMDI0IHNpbmggaW5mIC01LjYgLT4gaW5mIGluZgorc2luaDEwMjUgc2luaCBpbmYgLTcuMCAtPiBpbmYgLWluZgorc2luaDEwMjYgc2luaCBpbmYgLWluZiAtPiBpbmYgbmFuICAgICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorc2luaDEwMjcgc2luaCBuYW4gLTAuMCAtPiBuYW4gLTAuMAorc2luaDEwMjggc2luaCBuYW4gLTIuMyAtPiBuYW4gbmFuCitzaW5oMTAyOSBzaW5oIG5hbiAtaW5mIC0+IG5hbiBuYW4KK3NpbmgxMDMwIHNpbmggLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorc2luaDEwMzEgc2luaCAtMC4wIC1pbmYgLT4gMC4wIG5hbiAgICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorc2luaDEwMzIgc2luaCAtMC4wIG5hbiAtPiAwLjAgbmFuICAgICAgIGlnbm9yZS1yZWFsLXNpZ24KK3NpbmgxMDMzIHNpbmggLTIuMyAtaW5mIC0+IG5hbiBuYW4gICAgICBpbnZhbGlkCitzaW5oMTAzNCBzaW5oIC0yLjMgbmFuIC0+IG5hbiBuYW4KK3NpbmgxMDM1IHNpbmggLWluZiAtMC4wIC0+IC1pbmYgLTAuMAorc2luaDEwMzYgc2luaCAtaW5mIC0xLjQgLT4gLWluZiAtaW5mCitzaW5oMTAzNyBzaW5oIC1pbmYgLTIuOCAtPiBpbmYgLWluZgorc2luaDEwMzggc2luaCAtaW5mIC00LjIgLT4gaW5mIGluZgorc2luaDEwMzkgc2luaCAtaW5mIC01LjYgLT4gLWluZiBpbmYKK3NpbmgxMDQwIHNpbmggLWluZiAtNy4wIC0+IC1pbmYgLWluZgorc2luaDEwNDEgc2luaCAtaW5mIC1pbmYgLT4gaW5mIG5hbiAgICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorc2luaDEwNDIgc2luaCAtaW5mIG5hbiAtPiBpbmYgbmFuICAgICAgIGlnbm9yZS1yZWFsLXNpZ24KK3NpbmgxMDQzIHNpbmggLTAuMCAwLjAgLT4gLTAuMCAwLjAKK3NpbmgxMDQ0IHNpbmggLTAuMCBpbmYgLT4gMC4wIG5hbiAgICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK3NpbmgxMDQ1IHNpbmggLTIuMyBpbmYgLT4gbmFuIG5hbiAgICAgICBpbnZhbGlkCitzaW5oMTA0NiBzaW5oIC1pbmYgMC4wIC0+IC1pbmYgMC4wCitzaW5oMTA0NyBzaW5oIC1pbmYgMS40IC0+IC1pbmYgaW5mCitzaW5oMTA0OCBzaW5oIC1pbmYgMi44IC0+IGluZiBpbmYKK3NpbmgxMDQ5IHNpbmggLWluZiA0LjIgLT4gaW5mIC1pbmYKK3NpbmgxMDUwIHNpbmggLWluZiA1LjYgLT4gLWluZiAtaW5mCitzaW5oMTA1MSBzaW5oIC1pbmYgNy4wIC0+IC1pbmYgaW5mCitzaW5oMTA1MiBzaW5oIC1pbmYgaW5mIC0+IGluZiBuYW4gICAgICAgaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSB0YW5oOiBIeXBlcmJvbGljIFRhbmdlbnQgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSB6ZXJvcwordGFuaDAwMDAgdGFuaCAwLjAgMC4wIC0+IDAuMCAwLjAKK3RhbmgwMDAxIHRhbmggMC4wIC0wLjAgLT4gMC4wIC0wLjAKK3RhbmgwMDAyIHRhbmggLTAuMCAwLjAgLT4gLTAuMCAwLjAKK3RhbmgwMDAzIHRhbmggLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorCistLSByYW5kb20gaW5wdXRzCit0YW5oMDAwNCB0YW5oIC0yMS4yMDA1MDA0NTA2NjQ5OTMgLTEuNjk3MDcyOTQ4MDM0Mjk5NiAtPiAtMS4wIDEuOTI0MTM1MjM0NDg0OTM5OWUtMTkKK3RhbmgwMDA1IHRhbmggLTAuMzQxNTg3NzE1MDQyNTE5MjggLTguMDg0ODUwNDk1MTc0NzEzMSAtPiAtMi4xMjM3MTEyMjU4NTU2MTMgMS4yODI3NTI2NzgyMDI2MDA2Cit0YW5oMDAwNiB0YW5oIC0xNS40NTQxNDQ3MjUxOTM2ODkgLTAuMjM2MTk1ODIyODgyNjU2MTcgLT4gLTAuOTk5OTk5OTk5OTk5OTMyODMgLTMuNDMzNjY4NDI0ODI2MDAzNmUtMTQKK3RhbmgwMDA3IHRhbmggLTcuNjEwMzE2MzExOTY2MTk1MiAtMC43ODAyNzQ4MzIwMzA3MDA4IC0+IC0wLjk5OTk5OTk5NDk3MjE5NDM4IC00LjkwNjQ4NDUzNDM3NTU0MzdlLTA3Cit0YW5oMDAwOCB0YW5oIC0wLjE1Mzc0NzE3MjM1NzkyMTI5IC0wLjYzNTEwODYzMjczMDYxMzggLT4gLTAuMjMyNDYwODE3MDM1NjE4NjkgLTAuNzEwODM0Njc0MzM5MTAyMTkKK3RhbmgwMDA5IHRhbmggLTAuNDkxMDExMTU0NzQzOTI0NjUgMC4wOTcyMzAwMTI2NDg4NjMwMSAtPiAtMC40NTg0NDQ0NTcxNTQ5MjEzMyAwLjA3NzE5MTE1ODU0MTgwNTg4OAordGFuaDAwMTAgdGFuaCAtMC4xMDY5MDYxMjE1NzY2NDQ5MSAyLjg2MTYxMjgwMDg1NjM5NSAtPiAtMC4xMTUxOTc2MTYyNjI1NzM1OCAtMC4yODQwMDQ4ODM1NTY0NzUwNwordGFuaDAwMTEgdGFuaCAtMC45MTUwNTc3NDE5MjA2NjcwMiAxLjU0MzExNzQ1OTc3MjcwMDcgLT4gLTEuMzgxMTA5ODkzMDY4MTE0IDAuMDI1MTYwODE5NjYzNzA5MzU2Cit0YW5oMDAxMiB0YW5oIC0wLjA1NzQzMzM2NzA5Mzc5MjIyMyAwLjM1NDkxMTU5NTQxMjQ2NDU5IC0+IC0wLjA2NTIyMDQ5OTA0NjY5Njk1MyAwLjM2OTIxNzg4MzMyMzY5NDk4Cit0YW5oMDAxMyB0YW5oIC0xLjM1NDA0MTg2MjEyMzM1MTQgMC4xODk2OTQxNTY0MjI0MjUzNSAtPiAtMC44ODIzNTY0Mjg2MTE1MTM4NyAwLjA0Mzc2NDA2OTk4NDQxMTcyMQordGFuaDAwMTQgdGFuaCAwLjk0ODY0NzgzOTYxMDAzNTI5IC0wLjExMzMzNjg5NTc4ODY3NzE3IC0+IDAuNzQzNDg0MDE4NjE4NjEzNjggLTAuMDUxMjcxMDQyNTQzODU1MjIxCit0YW5oMDAxNSB0YW5oIDEuOTU5MTY5ODEzMzg0NTQ4OCAtMC4wMDI5NjU0NDQ0OTA0NTc4MzM5IC0+IDAuOTYxMDI3MDc3Njk2ODEzNSAtMC4wMDAyMjY2NDI0MDA0OTIxMjkzMwordGFuaDAwMTYgdGFuaCAxLjA5NDk3MTU3OTY2NjkxOTcgLTAuMjQ3MDY2NDI4NTM5ODQ0NTYgLT4gMC44MTYzNjU3NDUwMTM2OTM4NiAtMC4wODc3Njc0MzY5MTQxNDk5NTQKK3RhbmgwMDE3IHRhbmggNTc3MDQyOC4yMTEzNzMxMDQ3IC0zLjcxNjA1ODAzMzk4MzMxNjUgLT4gMS4wIC0wLjAKK3RhbmgwMDE4IHRhbmggMS41NTc2NzgyMzIxMzk5NjI5IC0xLjAzNTc5NDM3ODc5NjY0NjggLT4gMS4wNDAzMDAyMzg0ODk1Mzg4IC0wLjA4MTEyNjM0Nzg5NDY3MTQ2MwordGFuaDAwMTkgdGFuaCAwLjYyMzc4NTM2MjMwNTUyOTYxIDIuMzQ3MTM5MzU3OTU2MDIxNiAtPiAwLjg1NTgyNDk5MjM4OTYwMzYzIC0wLjUzNTY5NDczNjQ2ODQyODY5Cit0YW5oMDAyMCB0YW5oIDE3LjQwMDYyODYwMjUwODAyNSA5LjM5ODcwNTk1MzM4NDE5NzkgLT4gMC45OTk5OTk5OTk5OTk5OTg0NSAtOC4wMTc1ODY3NzIwNTMwODMyZS0xNwordGFuaDAwMjEgdGFuaCAwLjE1MDI2MTc3NTA5ODcxODk2IDAuNTA2MzAzNDkxNTk1MDU0NzIgLT4gMC4xOTM2NzUzNjU3MTgyNzc2OCAwLjUzODQ5ODQ3ODU4ODUzNjYxCit0YW5oMDAyMiB0YW5oIDAuNTc0MzM5Nzc1MzA3MTExNjcgMS4wMDcxNjA0NTQ2MjY1NjI3IC0+IDEuMDg1Nzg0ODE1OTI2Mjg0NCAwLjY5MTM5MjEzOTU1ODcyMjE0Cit0YW5oMDAyMyB0YW5oIDAuMTYyOTExODE1MDA0NDk0NTYgMC4wMDY5NzI4MTAyNDE1Njc1NDQgLT4gMC4xNjE0OTMzNTkwNzU1MTE1NyAwLjAwNjc5MTA3NzI5MDM0Njc4MTcKKworLS0gbGFyZ2UgcmVhbCBwYXJ0Cit0YW5oMDAzMCB0YW5oIDcxMCAwLjEzIC0+IDEuMCAwLjAKK3RhbmgwMDMxIHRhbmggLTcxMSA3LjQwMDAwMDAwMDAwMDAwMDQgLT4gLTEuMCAwLjAKK3RhbmgwMDMyIHRhbmggMTAwMCAtMi4zMTk5OTk5OTk5OTk5OTk4IC0+IDEuMCAwLjAKK3RhbmgwMDMzIHRhbmggLTEuMDAwMDAwMDAwMDAwMDAwMWUrMzAwIC05LjY2OTk5OTk5OTk5OTk5OTkgLT4gLTEuMCAtMC4wCisKKy0tc3BlY2lhbCB2YWx1ZXMKK3RhbmgxMDAwIHRhbmggMC4wIDAuMCAtPiAwLjAgMC4wCit0YW5oMTAwMSB0YW5oIDAuMCBpbmYgLT4gbmFuIG5hbiAgICAgICAgaW52YWxpZAordGFuaDEwMDIgdGFuaCAyLjMgaW5mIC0+IG5hbiBuYW4gICAgICAgIGludmFsaWQKK3RhbmgxMDAzIHRhbmggMC4wIG5hbiAtPiBuYW4gbmFuCit0YW5oMTAwNCB0YW5oIDIuMyBuYW4gLT4gbmFuIG5hbgordGFuaDEwMDUgdGFuaCBpbmYgMC4wIC0+IDEuMCAwLjAKK3RhbmgxMDA2IHRhbmggaW5mIDAuNyAtPiAxLjAgMC4wCit0YW5oMTAwNyB0YW5oIGluZiAxLjQgLT4gMS4wIDAuMAordGFuaDEwMDggdGFuaCBpbmYgMi4xIC0+IDEuMCAtMC4wCit0YW5oMTAwOSB0YW5oIGluZiAyLjggLT4gMS4wIC0wLjAKK3RhbmgxMDEwIHRhbmggaW5mIDMuNSAtPiAxLjAgMC4wCit0YW5oMTAxMSB0YW5oIGluZiBpbmYgLT4gMS4wIDAuMCAgICAgICAgaWdub3JlLWltYWctc2lnbgordGFuaDEwMTIgdGFuaCBpbmYgbmFuIC0+IDEuMCAwLjAgICAgICAgIGlnbm9yZS1pbWFnLXNpZ24KK3RhbmgxMDEzIHRhbmggbmFuIDAuMCAtPiBuYW4gMC4wCit0YW5oMTAxNCB0YW5oIG5hbiAyLjMgLT4gbmFuIG5hbgordGFuaDEwMTUgdGFuaCBuYW4gaW5mIC0+IG5hbiBuYW4KK3RhbmgxMDE2IHRhbmggbmFuIG5hbiAtPiBuYW4gbmFuCit0YW5oMTAxNyB0YW5oIDAuMCAtMC4wIC0+IDAuMCAtMC4wCit0YW5oMTAxOCB0YW5oIDAuMCAtaW5mIC0+IG5hbiBuYW4gICAgICAgaW52YWxpZAordGFuaDEwMTkgdGFuaCAyLjMgLWluZiAtPiBuYW4gbmFuICAgICAgIGludmFsaWQKK3RhbmgxMDIwIHRhbmggaW5mIC0wLjAgLT4gMS4wIC0wLjAKK3RhbmgxMDIxIHRhbmggaW5mIC0wLjcgLT4gMS4wIC0wLjAKK3RhbmgxMDIyIHRhbmggaW5mIC0xLjQgLT4gMS4wIC0wLjAKK3RhbmgxMDIzIHRhbmggaW5mIC0yLjEgLT4gMS4wIDAuMAordGFuaDEwMjQgdGFuaCBpbmYgLTIuOCAtPiAxLjAgMC4wCit0YW5oMTAyNSB0YW5oIGluZiAtMy41IC0+IDEuMCAtMC4wCit0YW5oMTAyNiB0YW5oIGluZiAtaW5mIC0+IDEuMCAwLjAgICAgICAgaWdub3JlLWltYWctc2lnbgordGFuaDEwMjcgdGFuaCBuYW4gLTAuMCAtPiBuYW4gLTAuMAordGFuaDEwMjggdGFuaCBuYW4gLTIuMyAtPiBuYW4gbmFuCit0YW5oMTAyOSB0YW5oIG5hbiAtaW5mIC0+IG5hbiBuYW4KK3RhbmgxMDMwIHRhbmggLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAordGFuaDEwMzEgdGFuaCAtMC4wIC1pbmYgLT4gbmFuIG5hbiAgICAgIGludmFsaWQKK3RhbmgxMDMyIHRhbmggLTIuMyAtaW5mIC0+IG5hbiBuYW4gICAgICBpbnZhbGlkCit0YW5oMTAzMyB0YW5oIC0wLjAgbmFuIC0+IG5hbiBuYW4KK3RhbmgxMDM0IHRhbmggLTIuMyBuYW4gLT4gbmFuIG5hbgordGFuaDEwMzUgdGFuaCAtaW5mIC0wLjAgLT4gLTEuMCAtMC4wCit0YW5oMTAzNiB0YW5oIC1pbmYgLTAuNyAtPiAtMS4wIC0wLjAKK3RhbmgxMDM3IHRhbmggLWluZiAtMS40IC0+IC0xLjAgLTAuMAordGFuaDEwMzggdGFuaCAtaW5mIC0yLjEgLT4gLTEuMCAwLjAKK3RhbmgxMDM5IHRhbmggLWluZiAtMi44IC0+IC0xLjAgMC4wCit0YW5oMTA0MCB0YW5oIC1pbmYgLTMuNSAtPiAtMS4wIC0wLjAKK3RhbmgxMDQxIHRhbmggLWluZiAtaW5mIC0+IC0xLjAgMC4wICAgICBpZ25vcmUtaW1hZy1zaWduCit0YW5oMTA0MiB0YW5oIC1pbmYgbmFuIC0+IC0xLjAgMC4wICAgICAgaWdub3JlLWltYWctc2lnbgordGFuaDEwNDMgdGFuaCAtMC4wIDAuMCAtPiAtMC4wIDAuMAordGFuaDEwNDQgdGFuaCAtMC4wIGluZiAtPiBuYW4gbmFuICAgICAgIGludmFsaWQKK3RhbmgxMDQ1IHRhbmggLTIuMyBpbmYgLT4gbmFuIG5hbiAgICAgICBpbnZhbGlkCit0YW5oMTA0NiB0YW5oIC1pbmYgMC4wIC0+IC0xLjAgMC4wCit0YW5oMTA0NyB0YW5oIC1pbmYgMC43IC0+IC0xLjAgMC4wCit0YW5oMTA0OCB0YW5oIC1pbmYgMS40IC0+IC0xLjAgMC4wCit0YW5oMTA0OSB0YW5oIC1pbmYgMi4xIC0+IC0xLjAgLTAuMAordGFuaDEwNTAgdGFuaCAtaW5mIDIuOCAtPiAtMS4wIC0wLjAKK3RhbmgxMDUxIHRhbmggLWluZiAzLjUgLT4gLTEuMCAwLjAKK3RhbmgxMDUyIHRhbmggLWluZiBpbmYgLT4gLTEuMCAwLjAgICAgICBpZ25vcmUtaW1hZy1zaWduCisKKworLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGNvczogQ29zaW5lIC0tCistLS0tLS0tLS0tLS0tLS0tLQorCistLSB6ZXJvcworY29zMDAwMCBjb3MgMC4wIDAuMCAtPiAxLjAgLTAuMAorY29zMDAwMSBjb3MgMC4wIC0wLjAgLT4gMS4wIDAuMAorY29zMDAwMiBjb3MgLTAuMCAwLjAgLT4gMS4wIDAuMAorY29zMDAwMyBjb3MgLTAuMCAtMC4wIC0+IDEuMCAtMC4wCisKKy0tIHJhbmRvbSBpbnB1dHMKK2NvczAwMDQgY29zIC0yLjA2ODkxOTQ2OTIwNzMwMzQgLTAuMDAxNjgwMjE4MTc1MTczNDMxMyAtPiAtMC40Nzc3NzgyNzIwODU2MTQ2OSAtMC4wMDE0NzYwNDAxNTAxNjk1OTcxCitjb3MwMDA1IGNvcyAtMC40MjA5NjI3MzE4MTc3OTc3IC0xLjgyMzg1MTY3NzQyNTgwMjcgLT4gMi45MDEwNDAyMjAxNDQ0MTA4IC0xLjIzMjkyMDcwNDIzMjk2MTcKK2NvczAwMDYgY29zIC0xLjk0MDIxODE2MzA2OTQ1NTcgLTIuOTc1MTg1NzM5Mjg5MTIxNyAtPiAtMy41NDY1NDU5Mjk3OTcwOTg1IC05LjExMTkxNjM1ODYyODIyNDgKK2NvczAwMDcgY29zIC0zLjMxMTgzMjAyOTAxOTE2MTYgLTAuODc4NzEzMDI5MDkyODYxNDIgLT4gLTEuMzkxMTUyODYzNjU2NTQ5OCAwLjE2ODc4MTQxNTE3MzkxNzAxCitjb3MwMDA4IGNvcyAtNC45NTQwNDA0NjIzMzc2ODcyIC0wLjU3OTQ5MjMyMjM5MDI2ODI3IC0+IDAuMjgwNjI0NDU1ODY1NTIwNjUgMC41OTQ2Nzg2MTMwODUwODAwOAorY29zMDAwOSBjb3MgLTAuNDUzNzQ1ODQzMTYyNDUwMjYgMS4zOTUwMjgzNDQ4MzczOTM1IC0+IDEuOTI0NzY2NTU3NDI5MDU3OCAwLjgzMDA0NTcyMjA0NzYxMTA3Citjb3MwMDEwIGNvcyAtMC40MjU3ODE3MjA0MDE3Njg0MyAxLjI3MTU4ODE2MTU0MTMwNDkgLT4gMS43NTE3MTYxNDU5NDg5MTQ4IDAuNjc4NjM5MDI2OTczNjMzMzIKK2NvczAwMTEgY29zIC0wLjEzODYyOTg1MzU0MzAwMTM2IDAuNDM1ODc2MzU4Nzc2NzAzMjggLT4gMS4wODU5ODgwMjkwMzYxOTEyIDAuMDYyMTU3NTQ4MTQ2NjcyMjcyCitjb3MwMDEyIGNvcyAtMC4xMTA3MzIyMTMwODk2NjU4NCA5LjkzODQwODIzMDczMjY0NzVlLTE1IC0+IDAuOTkzODc1NDUwNDA3MjI5NDcgMS4wOTgyNTQzMjY0MDY1NDc5ZS0xNQorY29zMDAxMyBjb3MgLTEuNTAyNzYzMzY2MjA1NDYyM2UtMDcgMC4wMDY5NjY4MDYwMjQ5OTU1NDk4IC0+IDEuMDAwMDI0MjY4MjkxMjQxMiAxLjA0Njk1NDU1NjU2NjA5OTVlLTA5Citjb3MwMDE0IGNvcyA0Ljk3Mjg2NDU0OTA1MDMwNTIgLTAuMDAwMjc0Nzk4MDg4NjA5NTI4MjIgLT4gMC4yNTc1NDAxMTczMTk3NTUwMSAtMC4wMDAyNjU1Mjg0OTU0OTA4MzE4NgorY29zMDAxNSBjb3MgNy44MTk2OTMwMzQ4NjcxOSAtMC43OTYyMTUyMzQ0NTg3ODc4MyAtPiAwLjA0NTczNDg4MjUwMTU4NTA2MyAwLjg4MjUzMTM5OTMzMDgyOTkxCitjb3MwMDE2IGNvcyAwLjEzMjcyNDIxODgwNzY2NzE2IC0wLjc0NjY4NDQ1MzA4NzE4MjAxIC0+IDEuMjgwNjAxMjI0NDQzMjg0NyAwLjEwODI1MzczMjY3NDM3MDA1Citjb3MwMDE3IGNvcyA0LjIzOTY1MjE5ODU5NzMyNzQgLTIuMjE3ODg0ODM4MDg4NDg4MSAtPiAtMi4xMTY1MTE3MDU3MDU2ODU1IC00LjA0MTY0OTI0NDQ2NDE0MDEKK2NvczAwMTggY29zIDEuMTYyMjIwNjYyNDkyNzI5NiAtMC41MDQwMDExNTQ2MTE5NzA4MSAtPiAwLjQ0ODg0MDcyNjEzMzcwMzc5IDAuNDgyMzQ2OTkxNTAzNDMxOAorY29zMDAxOSBjb3MgMS42Mjg3NzI4NjQ2MjA4ODRlLTA4IDAuNTgyMDU3MDU0Mjg5NzkyODIgLT4gMS4xNzQyMzE5OTk1NzkxNDM1IC0xLjAwMjQ4Mzk0ODE5NTY2MDRlLTA4Citjb3MwMDIwIGNvcyAyLjYzODUyMTI2MDYxMTEyNDEgMi45ODg2MTA3MTAwOTM3Mjk2IC0+IC04LjcyMDk0NzU5MjcxNjE0MTcgLTQuNzc0ODM1MjEwNzE5OTc5NgorY29zMDAyMSBjb3MgNC44MDQ4Mzc1MjYzNzc1MjU2IDAuMDA2MjI0ODg1Mjg5ODUxNTY1OCAtPiAwLjA5MjMxODcwMjAxNTg0NjI0MyAwLjAwNjE5ODM0MzA0MjIzMDYxNDIKK2NvczAwMjIgY29zIDcuOTkxNDUxNTQzMzg1ODUxNSAwLjcxNjU5OTY2NjE1NTAxNDM2IC0+IC0wLjE3Mzc1NDM5OTA2OTM2NTY2IC0wLjc3MjE3MDQzNTI3Mjk0NTgyCitjb3MwMDIzIGNvcyAwLjQ1MTI0MzUxMTUyNTQwMjI2IDEuNjk5MjY5Mzk5MzgxMjE1OCAtPiAyLjU0MzQ3Nzk0ODk3MjIzNyAtMS4xNTI4MTkzNjk0ODc1NDc3CisKKy0tIHNwZWNpYWwgdmFsdWVzCitjb3MxMDAwIGNvcyAtMC4wIDAuMCAtPiAxLjAgMC4wCitjb3MxMDAxIGNvcyAtaW5mIDAuMCAtPiBuYW4gMC4wIGludmFsaWQgaWdub3JlLWltYWctc2lnbgorY29zMTAwMiBjb3MgbmFuIDAuMCAtPiBuYW4gMC4wIGlnbm9yZS1pbWFnLXNpZ24KK2NvczEwMDMgY29zIC1pbmYgMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4gaW52YWxpZAorY29zMTAwNCBjb3MgbmFuIDIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuCitjb3MxMDA1IGNvcyAtMC4wIGluZiAtPiBpbmYgMC4wCitjb3MxMDA2IGNvcyAtMS4zOTk5OTk5OTk5OTk5OTk5IGluZiAtPiBpbmYgaW5mCitjb3MxMDA3IGNvcyAtMi43OTk5OTk5OTk5OTk5OTk4IGluZiAtPiAtaW5mIGluZgorY29zMTAwOCBjb3MgLTQuMjAwMDAwMDAwMDAwMDAwMiBpbmYgLT4gLWluZiAtaW5mCitjb3MxMDA5IGNvcyAtNS41OTk5OTk5OTk5OTk5OTk2IGluZiAtPiBpbmYgLWluZgorY29zMTAxMCBjb3MgLTcuMCBpbmYgLT4gaW5mIGluZgorY29zMTAxMSBjb3MgLWluZiBpbmYgLT4gaW5mIG5hbiBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK2NvczEwMTIgY29zIG5hbiBpbmYgLT4gaW5mIG5hbgorY29zMTAxMyBjb3MgLTAuMCBuYW4gLT4gbmFuIDAuMCBpZ25vcmUtaW1hZy1zaWduCitjb3MxMDE0IGNvcyAtMi4yOTk5OTk5OTk5OTk5OTk4IG5hbiAtPiBuYW4gbmFuCitjb3MxMDE1IGNvcyAtaW5mIG5hbiAtPiBuYW4gbmFuCitjb3MxMDE2IGNvcyBuYW4gbmFuIC0+IG5hbiBuYW4KK2NvczEwMTcgY29zIDAuMCAwLjAgLT4gMS4wIC0wLjAKK2NvczEwMTggY29zIGluZiAwLjAgLT4gbmFuIDAuMCBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KK2NvczEwMTkgY29zIGluZiAyLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbiBpbnZhbGlkCitjb3MxMDIwIGNvcyAwLjAgaW5mIC0+IGluZiAtMC4wCitjb3MxMDIxIGNvcyAxLjM5OTk5OTk5OTk5OTk5OTkgaW5mIC0+IGluZiAtaW5mCitjb3MxMDIyIGNvcyAyLjc5OTk5OTk5OTk5OTk5OTggaW5mIC0+IC1pbmYgLWluZgorY29zMTAyMyBjb3MgNC4yMDAwMDAwMDAwMDAwMDAyIGluZiAtPiAtaW5mIGluZgorY29zMTAyNCBjb3MgNS41OTk5OTk5OTk5OTk5OTk2IGluZiAtPiBpbmYgaW5mCitjb3MxMDI1IGNvcyA3LjAgaW5mIC0+IGluZiAtaW5mCitjb3MxMDI2IGNvcyBpbmYgaW5mIC0+IGluZiBuYW4gaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCitjb3MxMDI3IGNvcyAwLjAgbmFuIC0+IG5hbiAwLjAgaWdub3JlLWltYWctc2lnbgorY29zMTAyOCBjb3MgMi4yOTk5OTk5OTk5OTk5OTk4IG5hbiAtPiBuYW4gbmFuCitjb3MxMDI5IGNvcyBpbmYgbmFuIC0+IG5hbiBuYW4KK2NvczEwMzAgY29zIDAuMCAtMC4wIC0+IDEuMCAwLjAKK2NvczEwMzEgY29zIGluZiAtMC4wIC0+IG5hbiAwLjAgaW52YWxpZCBpZ25vcmUtaW1hZy1zaWduCitjb3MxMDMyIGNvcyBuYW4gLTAuMCAtPiBuYW4gMC4wIGlnbm9yZS1pbWFnLXNpZ24KK2NvczEwMzMgY29zIGluZiAtMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4gaW52YWxpZAorY29zMTAzNCBjb3MgbmFuIC0yLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbgorY29zMTAzNSBjb3MgMC4wIC1pbmYgLT4gaW5mIDAuMAorY29zMTAzNiBjb3MgMS4zOTk5OTk5OTk5OTk5OTk5IC1pbmYgLT4gaW5mIGluZgorY29zMTAzNyBjb3MgMi43OTk5OTk5OTk5OTk5OTk4IC1pbmYgLT4gLWluZiBpbmYKK2NvczEwMzggY29zIDQuMjAwMDAwMDAwMDAwMDAwMiAtaW5mIC0+IC1pbmYgLWluZgorY29zMTAzOSBjb3MgNS41OTk5OTk5OTk5OTk5OTk2IC1pbmYgLT4gaW5mIC1pbmYKK2NvczEwNDAgY29zIDcuMCAtaW5mIC0+IGluZiBpbmYKK2NvczEwNDEgY29zIGluZiAtaW5mIC0+IGluZiBuYW4gaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCitjb3MxMDQyIGNvcyBuYW4gLWluZiAtPiBpbmYgbmFuCitjb3MxMDQzIGNvcyAtMC4wIC0wLjAgLT4gMS4wIC0wLjAKK2NvczEwNDQgY29zIC1pbmYgLTAuMCAtPiBuYW4gMC4wIGludmFsaWQgaWdub3JlLWltYWctc2lnbgorY29zMTA0NSBjb3MgLWluZiAtMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4gaW52YWxpZAorY29zMTA0NiBjb3MgLTAuMCAtaW5mIC0+IGluZiAtMC4wCitjb3MxMDQ3IGNvcyAtMS4zOTk5OTk5OTk5OTk5OTk5IC1pbmYgLT4gaW5mIC1pbmYKK2NvczEwNDggY29zIC0yLjc5OTk5OTk5OTk5OTk5OTggLWluZiAtPiAtaW5mIC1pbmYKK2NvczEwNDkgY29zIC00LjIwMDAwMDAwMDAwMDAwMDIgLWluZiAtPiAtaW5mIGluZgorY29zMTA1MCBjb3MgLTUuNTk5OTk5OTk5OTk5OTk5NiAtaW5mIC0+IGluZiBpbmYKK2NvczEwNTEgY29zIC03LjAgLWluZiAtPiBpbmYgLWluZgorY29zMTA1MiBjb3MgLWluZiAtaW5mIC0+IGluZiBuYW4gaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCisKKworLS0tLS0tLS0tLS0tLS0tCistLSBzaW46IFNpbmUgLS0KKy0tLS0tLS0tLS0tLS0tLQorCistLSB6ZXJvcworc2luMDAwMCBzaW4gMC4wIDAuMCAtPiAwLjAgMC4wCitzaW4wMDAxIHNpbiAwLjAgLTAuMCAtPiAwLjAgLTAuMAorc2luMDAwMiBzaW4gLTAuMCAwLjAgLT4gLTAuMCAwLjAKK3NpbjAwMDMgc2luIC0wLjAgLTAuMCAtPiAtMC4wIC0wLjAKKworLS0gcmFuZG9tIGlucHV0cworc2luMDAwNCBzaW4gLTAuMTg2OTE4MjkxNjMxNjM3NTkgLTAuNzQzODg3NDE5ODU1MDcwMzQgLT4gLTAuMjM5NjYzNjczMzc3MzQ0NCAtMC44MDAyMzIzMTEwMTg1Njc1MQorc2luMDAwNSBzaW4gLTAuNDUxMjc0NTM3MDI0NTkxNTggLTQ2MS44MTMzOTkyMDcxNjE2NCAtPiAtNy45NzIyMjk5MzMxMDc3ODc3ZSsxOTkgLTEuNjQ1MDIwNTgxMTAwNDYyOGUrMjAwCitzaW4wMDA2IHNpbiAtMC40NzY2OTIyODM0NTc2ODkyMSAtMi43MzY5OTM2NTY0OTg3NTE0IC0+IC0zLjU1NzIzODAyMjI2NzEyNCAtNi44MzA4MDMwNzcxMjI2NjE1CitzaW4wMDA3IHNpbiAtMC4zMTAyNDI4NTUyNTk1MDg1NyAtMS40ODY5MjE5OTM5MTg4Mjk2IC0+IC0wLjcwOTcyNjc2MDQ3MTc1MjA5IC0xLjk5ODUwMjk2MzU0MjY4MzkKK3NpbjAwMDggc2luIC00LjQxOTQ1NzM0MDcwMjU2MDggLTEuNDA1OTk5MjEwOTg5Mjg4IC0+IDIuMDcwMjQ4MDgwMDgwMjY4NSAwLjU1MzYyMjUwNzkyMTgwNjAxCitzaW4wMDA5IHNpbiAtMS43ODEwODMyMDQ2NDM0ODk4ZS0wNSAwLjAwMTY0Mzk1NTUzODQzNzkwODMgLT4gLTEuNzgxMDg1NjExMzE4NTI2MWUtMDUgMC4wMDE2NDM5NTYyNzg2NjY4Mzc1CitzaW4wMDEwIHNpbiAtMC44MjAwMDE3ODc0ODk3NjY2IDAuNjE3MjQ4NzY4ODc3NzE5MjkgLT4gLTAuODc0OTA3ODE5NTk0ODg2NSAwLjQ0ODM1Mjk1NTUwOTg3NzU4CitzaW4wMDExIHNpbiAtMS40NTM2NTAyODA2MTA3MTE0IDAuNjM5OTg1NzU1MzQxNTA0MTUgLT4gLTEuMjAzNTcwOTkyOTQzNzY3OSAwLjA4MDAxMjE4NzQ4OTE2MzcwOAorc2luMDAxMiBzaW4gLTIuMjY1MzQxMjE1NTUwNjA3OSAwLjEzMTcyNzYwNjg1NTgzNzI5IC0+IC0wLjc3NTAyMDkzODA5MTkwNDMxIC0wLjA4NDU1NDQyNjg2ODIyOTUzMgorc2luMDAxMyBzaW4gLTAuMDI2MTM5ODMwNjk0OTE4NTggMC4xODQwNDc2NjU5Nzc3NjA3MyAtPiAtMC4wMjY1ODA3Nzg4NjMxMjc5NDMgMC4xODUwMjUyNTM5NjczNTY0Mgorc2luMDAxNCBzaW4gMS41NzQzMDY1MDAxMDU0NjE3IC0wLjUzMTI1NTc0MjcyNjQyMDI5IC0+IDEuMTQ0NDU5NjMzMjA5MjcyNSAwLjAwMTk1Mzc1OTgwOTkzNTIwNzcKK3NpbjAwMTUgc2luIDcuMzgzMzEwMTc5MTI4MzI4OWUtMjAgLTAuMTY0NTMyMjEzMjQyMzYyMTcgLT4gNy40ODM0NzIwNjc0Mzc5NDI5ZS0yMCAtMC4xNjUyNzU1NTY0NjQ2NjkxNQorc2luMDAxNiBzaW4gMC4zNDc2MzgzNDY0MTI1NDAzOCAtMi44Mzc3NDE2NDIxMDg5NTY1IC0+IDIuOTE4ODgzNTQxNTA0NjYzIC04LjAwMDI3MTgwNTMyNTAyMjQKK3NpbjAwMTcgc2luIDAuMDc3MTA1Nzg1MTgwNDIxNTYzIC0wLjA5MDA1NjAyNzMxNjIwMDY3NCAtPiAwLjA3NzM0MTk3MzgxNDQ3MTMwNCAtMC4wODk5MDk4NjkzODA1MjQ1ODcKK3NpbjAwMTggc2luIDMuOTA2MzIyNzc5ODE0MjMyOWUtMTcgLTAuMDU5NTQwOTg2NTQyOTU1MjQgLT4gMy45MTMyNDkwMzQ4OTU2NTEyZS0xNyAtMC4wNTk1NzYxNzI4NTk4MzczNTEKK3NpbjAwMTkgc2luIDAuNTczMzM5MTc5MzI1NDQ1OTggOC43Nzg1MjIxNDMwNTk0Njk2ZS0wNiAtPiAwLjU0MjQ0MDI5MzM4MzAyOTM1IDcuMzc0Nzg2OTEyNTMwMTM2OGUtMDYKK3NpbjAwMjAgc2luIDAuMDI0ODYxNzIyODE2NTEzMTY5IDAuMzMwNDQ2MjA3NTYxMTg1MTUgLT4gMC4wMjYyMjg4MDEzNjk2NTEgMC4zMzYzODg5NjcxNTcwNjg5CitzaW4wMDIxIHNpbiAxLjQzNDI3MjczODc0OTI2NzEgMC44MTM2MTg4OTc5MDI4NDM0NyAtPiAxLjMzNzA5NjAwNjA5NDc5MjMgMC4xMjMzNjEzNzk2MTM4NzE2Mworc2luMDAyMiBzaW4gMS4xNTE4MDg3MzU0NDAzNzI1IDQuODU5NzIzNTk2NjE1MDU1OCAtPiA1OC45MTkxNDE5ODk2MDMwNDEgMjYuMjM3MDAzNDAzNzU4ODUyCitzaW4wMDIzIHNpbiAwLjAwMDg3NzczMDc4NDA2NjQ5MTkyIDM0Ljc5MjM3OTIxMTMxMjA5NSAtPiA1NjU1NDgxNDU1NjkuMzgyNDUgNjQ0MzI5Njg1ODIyNzAwLjYyCisKKy0tIHNwZWNpYWwgdmFsdWVzCitzaW4xMDAwIHNpbiAtMC4wIDAuMCAtPiAtMC4wIDAuMAorc2luMTAwMSBzaW4gLWluZiAwLjAgLT4gbmFuIDAuMCBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KK3NpbjEwMDIgc2luIG5hbiAwLjAgLT4gbmFuIDAuMCBpZ25vcmUtaW1hZy1zaWduCitzaW4xMDAzIHNpbiAtaW5mIDIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuIGludmFsaWQKK3NpbjEwMDQgc2luIG5hbiAyLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbgorc2luMTAwNSBzaW4gLTAuMCBpbmYgLT4gLTAuMCBpbmYKK3NpbjEwMDYgc2luIC0xLjM5OTk5OTk5OTk5OTk5OTkgaW5mIC0+IC1pbmYgaW5mCitzaW4xMDA3IHNpbiAtMi43OTk5OTk5OTk5OTk5OTk4IGluZiAtPiAtaW5mIC1pbmYKK3NpbjEwMDggc2luIC00LjIwMDAwMDAwMDAwMDAwMDIgaW5mIC0+IGluZiAtaW5mCitzaW4xMDA5IHNpbiAtNS41OTk5OTk5OTk5OTk5OTk2IGluZiAtPiBpbmYgaW5mCitzaW4xMDEwIHNpbiAtNy4wIGluZiAtPiAtaW5mIGluZgorc2luMTAxMSBzaW4gLWluZiBpbmYgLT4gbmFuIGluZiBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KK3NpbjEwMTIgc2luIG5hbiBpbmYgLT4gbmFuIGluZiBpZ25vcmUtaW1hZy1zaWduCitzaW4xMDEzIHNpbiAtMC4wIG5hbiAtPiAtMC4wIG5hbgorc2luMTAxNCBzaW4gLTIuMjk5OTk5OTk5OTk5OTk5OCBuYW4gLT4gbmFuIG5hbgorc2luMTAxNSBzaW4gLWluZiBuYW4gLT4gbmFuIG5hbgorc2luMTAxNiBzaW4gbmFuIG5hbiAtPiBuYW4gbmFuCitzaW4xMDE3IHNpbiAwLjAgMC4wIC0+IDAuMCAwLjAKK3NpbjEwMTggc2luIGluZiAwLjAgLT4gbmFuIDAuMCBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KK3NpbjEwMTkgc2luIGluZiAyLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbiBpbnZhbGlkCitzaW4xMDIwIHNpbiAwLjAgaW5mIC0+IDAuMCBpbmYKK3NpbjEwMjEgc2luIDEuMzk5OTk5OTk5OTk5OTk5OSBpbmYgLT4gaW5mIGluZgorc2luMTAyMiBzaW4gMi43OTk5OTk5OTk5OTk5OTk4IGluZiAtPiBpbmYgLWluZgorc2luMTAyMyBzaW4gNC4yMDAwMDAwMDAwMDAwMDAyIGluZiAtPiAtaW5mIC1pbmYKK3NpbjEwMjQgc2luIDUuNTk5OTk5OTk5OTk5OTk5NiBpbmYgLT4gLWluZiBpbmYKK3NpbjEwMjUgc2luIDcuMCBpbmYgLT4gaW5mIGluZgorc2luMTAyNiBzaW4gaW5mIGluZiAtPiBuYW4gaW5mIGludmFsaWQgaWdub3JlLWltYWctc2lnbgorc2luMTAyNyBzaW4gMC4wIG5hbiAtPiAwLjAgbmFuCitzaW4xMDI4IHNpbiAyLjI5OTk5OTk5OTk5OTk5OTggbmFuIC0+IG5hbiBuYW4KK3NpbjEwMjkgc2luIGluZiBuYW4gLT4gbmFuIG5hbgorc2luMTAzMCBzaW4gMC4wIC0wLjAgLT4gMC4wIC0wLjAKK3NpbjEwMzEgc2luIGluZiAtMC4wIC0+IG5hbiAwLjAgaW52YWxpZCBpZ25vcmUtaW1hZy1zaWduCitzaW4xMDMyIHNpbiBuYW4gLTAuMCAtPiBuYW4gMC4wIGlnbm9yZS1pbWFnLXNpZ24KK3NpbjEwMzMgc2luIGluZiAtMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4gaW52YWxpZAorc2luMTAzNCBzaW4gbmFuIC0yLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbgorc2luMTAzNSBzaW4gMC4wIC1pbmYgLT4gMC4wIC1pbmYKK3NpbjEwMzYgc2luIDEuMzk5OTk5OTk5OTk5OTk5OSAtaW5mIC0+IGluZiAtaW5mCitzaW4xMDM3IHNpbiAyLjc5OTk5OTk5OTk5OTk5OTggLWluZiAtPiBpbmYgaW5mCitzaW4xMDM4IHNpbiA0LjIwMDAwMDAwMDAwMDAwMDIgLWluZiAtPiAtaW5mIGluZgorc2luMTAzOSBzaW4gNS41OTk5OTk5OTk5OTk5OTk2IC1pbmYgLT4gLWluZiAtaW5mCitzaW4xMDQwIHNpbiA3LjAgLWluZiAtPiBpbmYgLWluZgorc2luMTA0MSBzaW4gaW5mIC1pbmYgLT4gbmFuIGluZiBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KK3NpbjEwNDIgc2luIG5hbiAtaW5mIC0+IG5hbiBpbmYgaWdub3JlLWltYWctc2lnbgorc2luMTA0MyBzaW4gLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorc2luMTA0NCBzaW4gLWluZiAtMC4wIC0+IG5hbiAwLjAgaW52YWxpZCBpZ25vcmUtaW1hZy1zaWduCitzaW4xMDQ1IHNpbiAtaW5mIC0yLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbiBpbnZhbGlkCitzaW4xMDQ2IHNpbiAtMC4wIC1pbmYgLT4gLTAuMCAtaW5mCitzaW4xMDQ3IHNpbiAtMS4zOTk5OTk5OTk5OTk5OTk5IC1pbmYgLT4gLWluZiAtaW5mCitzaW4xMDQ4IHNpbiAtMi43OTk5OTk5OTk5OTk5OTk4IC1pbmYgLT4gLWluZiBpbmYKK3NpbjEwNDkgc2luIC00LjIwMDAwMDAwMDAwMDAwMDIgLWluZiAtPiBpbmYgaW5mCitzaW4xMDUwIHNpbiAtNS41OTk5OTk5OTk5OTk5OTk2IC1pbmYgLT4gaW5mIC1pbmYKK3NpbjEwNTEgc2luIC03LjAgLWluZiAtPiAtaW5mIC1pbmYKK3NpbjEwNTIgc2luIC1pbmYgLWluZiAtPiBuYW4gaW5mIGludmFsaWQgaWdub3JlLWltYWctc2lnbgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLQorLS0gdGFuOiBUYW5nZW50IC0tCistLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gemVyb3MKK3RhbjAwMDAgdGFuIDAuMCAwLjAgLT4gMC4wIDAuMAordGFuMDAwMSB0YW4gMC4wIC0wLjAgLT4gMC4wIC0wLjAKK3RhbjAwMDIgdGFuIC0wLjAgMC4wIC0+IC0wLjAgMC4wCit0YW4wMDAzIHRhbiAtMC4wIC0wLjAgLT4gLTAuMCAtMC4wCisKKy0tIHJhbmRvbSBpbnB1dHMKK3RhbjAwMDQgdGFuIC0wLjU2Mzc4NTYxODMzODYxMDc0IC0xLjcxMTAyNzYyMzcxODc2NjRlKzczIC0+IC0wLjAgLTEuMAordGFuMDAwNSB0YW4gLTMuNTQ1MTYzMzk5MzQ3MTkxNWUtMTIgLTIuODU1NDcxODYzNTY0MDU5IC0+IC00LjY2MjI0NDEzMDQ4ODk1NzVlLTE0IC0wLjk5MzQwMjczODQzMDkzOTUxCit0YW4wMDA2IHRhbiAtMi41MDI0NDI3MTk2Mzg2OTYgLTAuMjY3NDIyMzQzOTA1MDQyMjEgLT4gMC42NjczNTIxNTI1Mjk5NDk5NSAtMC4zOTA3ODk5NzkzNTQyMDk1NgordGFuMDAwNyB0YW4gLTAuODc2Mzk1OTc3MjAzNzEzNjUgLTU1LjU4NjIyNTUyMzI4MDIwNiAtPiAtMS4wMjg1MjY0NTY1OTQ4MTc2ZS00OCAtMS4wCit0YW4wMDA4IHRhbiAtMC4wMTU3ODM4Njk1OTY0MjcyNDMgLTUyMC4wNTk0NDQzNjAzOTI3MiAtPiAtMC4wIC0xLjAKK3RhbjAwMDkgdGFuIC0wLjg0NjQzNTQ5OTkwNzI1MTY0IDIuMDc0OTA5NzkzNTM5NjM0MyAtPiAtMC4wMzE0MTI2NjE2NzY5NTk1NzMgMS4wMDMzNTQ4NDc5NTI2NzY0Cit0YW4wMDEwIHRhbiAtMC40MzYxMzc5MjI0ODU1OTY0NiA4LjEwODI3NDE2Mjk0NTgwNTkgLT4gLTEuMzg3OTg0ODQ0NDY0NDU5M2UtMDcgMC45OTk5OTk4ODM0NDIyNDAxMQordGFuMDAxMSB0YW4gLTEuMDgyMDkwNjM2NzgzMzExNCAwLjI4NTcxODY4OTkyNDgwMjQ4IC0+IC0xLjM2MjI0ODU3Mzc5MzY1MzYgMC45OTA4OTI2OTM3Nzk3MTI0NQordGFuMDAxMiB0YW4gLTEuMTQ3Nzg1OTU4MDIyMDA4NCAxLjkwMjE2MzcwMDI3MDgwNDEgLT4gLTAuMDM0MzQ4NDUwMDQyMDcxMTk2IDEuMDI5Mzk1NDA5NzkwMTY4NwordGFuMDAxMyB0YW4gLTAuMTI0NjU1NDMxNzY5NTM0MDkgMy4wNjA2ODUxMDE2MzQ0ODE1ZS0wNSAtPiAtMC4xMjUzMDUxNDI5MDM4NzM0MyAzLjEwODc0MjA3Njk5NDU0NzllLTA1Cit0YW4wMDE0IHRhbiAzLjc1ODI4NDg3MTc1MjUzNDMgLTY5Mjc4NzAyMC40NDAzODkzOSAtPiAwLjAgLTEuMAordGFuMDAxNSB0YW4gMi4yMzIxOTY3NjU1MTQyMTc2ZS0wNiAtMTAuMDkwMDY5NDIzMDA4MTY5IC0+IDEuNTM2OTg0NjEyMDYyMjY0M2UtMTQgLTAuOTk5OTk5OTk2NTU3MjM3NTkKK3RhbjAwMTYgdGFuIDAuODgzNzExNzIzOTAyNDUwMTIgLTEuMTYzNTA1MzYzMDEzMjgyMyAtPiAwLjE5NzA1MDE3MTE4NjI1ODg5IC0xLjAxOTY0NTIyODA4NDMxMjkKK3RhbjAwMTcgdGFuIDIuMTM0NzQxNDIzMTg0OTI2NyAtMS45MzExMzM5OTYwNDE2ODMxIC0+IC0wLjAzODY2MzU3NjkxNTk4MjUyNCAtMS4wMTc0Mzk5OTkzOTgwNzc4Cit0YW4wMDE4IHRhbiA1LjkwMjc5NDUyNTU4OTk5NzQgLTIuMTU3NDE5NTY4NDYwNzEzNWUtMTgzIC0+IC0wLjM5OTg2NTkxNTM5MjgxNDk2IC0yLjUwMjM3NTMxNjc5NzY5MTVlLTE4MwordGFuMDAxOSB0YW4gMC40NDgxMTQ4OTQ5MDgwNTM2MiA2ODMyMTYwNzU2NzAuMDc1NTYgLT4gMC4wIDEuMAordGFuMDAyMCB0YW4gNC4xNDU5NzY2Mzk2MDY4MzI1IDEyLjUyMzAxNzIwNTYwNTc1NiAtPiAyLjQwMjI1MTQ3NTg5ODgwNjhlLTExIDEuMDAwMDAwMDAwMDExMjQ5OQordGFuMDAyMSB0YW4gMS43ODA5NjE3OTY4NDQzMjcyIDEuNTA1MjM4MTcwMjg1MzM3OSAtPiAtMC4wNDQwNjYyMjIxMTg5NDY5MDMgMS4wOTMyNjg0NTE3NzAyNzc4Cit0YW4wMDIyIHRhbiAxLjE2MTUzMTM5MDA4ODA1NzcgMS43OTU2Mjk4NzI4NjQ3MTA3IC0+IDAuMDQxNzkzMTg2ODI2MzkwMzYyIDEuMDM3NTMzOTU0NjAzNDc5MgordGFuMDAyMyB0YW4gMC4wNjcwMTQ3Nzk0Nzc5MDg5NDUgNS44NTE3MzYxNTc3NDU3MDk3IC0+IDIuMjA4ODYzOTc1NDgwMDAzNGUtMDYgMC45OTk5ODM2MTgyNDIwMDYxCisKKy0tIHNwZWNpYWwgdmFsdWVzCit0YW4xMDAwIHRhbiAtMC4wIDAuMCAtPiAtMC4wIDAuMAordGFuMTAwMSB0YW4gLWluZiAwLjAgLT4gbmFuIG5hbiBpbnZhbGlkCit0YW4xMDAyIHRhbiAtaW5mIDIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuIGludmFsaWQKK3RhbjEwMDMgdGFuIG5hbiAwLjAgLT4gbmFuIG5hbgordGFuMTAwNCB0YW4gbmFuIDIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuCit0YW4xMDA1IHRhbiAtMC4wIGluZiAtPiAtMC4wIDEuMAordGFuMTAwNiB0YW4gLTAuNjk5OTk5OTk5OTk5OTk5OTYgaW5mIC0+IC0wLjAgMS4wCit0YW4xMDA3IHRhbiAtMS4zOTk5OTk5OTk5OTk5OTk5IGluZiAtPiAtMC4wIDEuMAordGFuMTAwOCB0YW4gLTIuMTAwMDAwMDAwMDAwMDAwMSBpbmYgLT4gMC4wIDEuMAordGFuMTAwOSB0YW4gLTIuNzk5OTk5OTk5OTk5OTk5OCBpbmYgLT4gMC4wIDEuMAordGFuMTAxMCB0YW4gLTMuNSBpbmYgLT4gLTAuMCAxLjAKK3RhbjEwMTEgdGFuIC1pbmYgaW5mIC0+IC0wLjAgMS4wIGlnbm9yZS1yZWFsLXNpZ24KK3RhbjEwMTIgdGFuIG5hbiBpbmYgLT4gLTAuMCAxLjAgaWdub3JlLXJlYWwtc2lnbgordGFuMTAxMyB0YW4gLTAuMCBuYW4gLT4gLTAuMCBuYW4KK3RhbjEwMTQgdGFuIC0yLjI5OTk5OTk5OTk5OTk5OTggbmFuIC0+IG5hbiBuYW4KK3RhbjEwMTUgdGFuIC1pbmYgbmFuIC0+IG5hbiBuYW4KK3RhbjEwMTYgdGFuIG5hbiBuYW4gLT4gbmFuIG5hbgordGFuMTAxNyB0YW4gMC4wIDAuMCAtPiAwLjAgMC4wCit0YW4xMDE4IHRhbiBpbmYgMC4wIC0+IG5hbiBuYW4gaW52YWxpZAordGFuMTAxOSB0YW4gaW5mIDIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuIGludmFsaWQKK3RhbjEwMjAgdGFuIDAuMCBpbmYgLT4gMC4wIDEuMAordGFuMTAyMSB0YW4gMC42OTk5OTk5OTk5OTk5OTk5NiBpbmYgLT4gMC4wIDEuMAordGFuMTAyMiB0YW4gMS4zOTk5OTk5OTk5OTk5OTk5IGluZiAtPiAwLjAgMS4wCit0YW4xMDIzIHRhbiAyLjEwMDAwMDAwMDAwMDAwMDEgaW5mIC0+IC0wLjAgMS4wCit0YW4xMDI0IHRhbiAyLjc5OTk5OTk5OTk5OTk5OTggaW5mIC0+IC0wLjAgMS4wCit0YW4xMDI1IHRhbiAzLjUgaW5mIC0+IDAuMCAxLjAKK3RhbjEwMjYgdGFuIGluZiBpbmYgLT4gLTAuMCAxLjAgaWdub3JlLXJlYWwtc2lnbgordGFuMTAyNyB0YW4gMC4wIG5hbiAtPiAwLjAgbmFuCit0YW4xMDI4IHRhbiAyLjI5OTk5OTk5OTk5OTk5OTggbmFuIC0+IG5hbiBuYW4KK3RhbjEwMjkgdGFuIGluZiBuYW4gLT4gbmFuIG5hbgordGFuMTAzMCB0YW4gMC4wIC0wLjAgLT4gMC4wIC0wLjAKK3RhbjEwMzEgdGFuIGluZiAtMC4wIC0+IG5hbiBuYW4gaW52YWxpZAordGFuMTAzMiB0YW4gaW5mIC0yLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbiBpbnZhbGlkCit0YW4xMDMzIHRhbiBuYW4gLTAuMCAtPiBuYW4gbmFuCit0YW4xMDM0IHRhbiBuYW4gLTIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuCit0YW4xMDM1IHRhbiAwLjAgLWluZiAtPiAwLjAgLTEuMAordGFuMTAzNiB0YW4gMC42OTk5OTk5OTk5OTk5OTk5NiAtaW5mIC0+IDAuMCAtMS4wCit0YW4xMDM3IHRhbiAxLjM5OTk5OTk5OTk5OTk5OTkgLWluZiAtPiAwLjAgLTEuMAordGFuMTAzOCB0YW4gMi4xMDAwMDAwMDAwMDAwMDAxIC1pbmYgLT4gLTAuMCAtMS4wCit0YW4xMDM5IHRhbiAyLjc5OTk5OTk5OTk5OTk5OTggLWluZiAtPiAtMC4wIC0xLjAKK3RhbjEwNDAgdGFuIDMuNSAtaW5mIC0+IDAuMCAtMS4wCit0YW4xMDQxIHRhbiBpbmYgLWluZiAtPiAtMC4wIC0xLjAgaWdub3JlLXJlYWwtc2lnbgordGFuMTA0MiB0YW4gbmFuIC1pbmYgLT4gLTAuMCAtMS4wIGlnbm9yZS1yZWFsLXNpZ24KK3RhbjEwNDMgdGFuIC0wLjAgLTAuMCAtPiAtMC4wIC0wLjAKK3RhbjEwNDQgdGFuIC1pbmYgLTAuMCAtPiBuYW4gbmFuIGludmFsaWQKK3RhbjEwNDUgdGFuIC1pbmYgLTIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuIGludmFsaWQKK3RhbjEwNDYgdGFuIC0wLjAgLWluZiAtPiAtMC4wIC0xLjAKK3RhbjEwNDcgdGFuIC0wLjY5OTk5OTk5OTk5OTk5OTk2IC1pbmYgLT4gLTAuMCAtMS4wCit0YW4xMDQ4IHRhbiAtMS4zOTk5OTk5OTk5OTk5OTk5IC1pbmYgLT4gLTAuMCAtMS4wCit0YW4xMDQ5IHRhbiAtMi4xMDAwMDAwMDAwMDAwMDAxIC1pbmYgLT4gMC4wIC0xLjAKK3RhbjEwNTAgdGFuIC0yLjc5OTk5OTk5OTk5OTk5OTggLWluZiAtPiAwLjAgLTEuMAordGFuMTA1MSB0YW4gLTMuNSAtaW5mIC0+IC0wLjAgLTEuMAordGFuMTA1MiB0YW4gLWluZiAtaW5mIC0+IC0wLjAgLTEuMCBpZ25vcmUtcmVhbC1zaWduCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSByZWN0OiBDb252ZXJzaW9uIGZyb20gcG9sYXIgY29vcmRpbmF0ZXMgdG8gcmVjdGFuZ3VsYXIgY29vcmRpbmF0ZXMgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0KKy0tIEZvciBjbWF0aC5yZWN0LCB3ZSBjYW4gdXNlIHRoZSBzYW1lIHRlc3RjYXNlIHN5bnRheCBhcyBmb3IgdGhlCistLSBjb21wbGV4IC0+IGNvbXBsZXggZnVuY3Rpb25zIGFib3ZlLCBidXQgaGVyZSB0aGUgaW5wdXQgYXJndW1lbnRzCistLSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBwYWlyIG9mIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgcmF0aGVyCistLSB0aGFuIHRoZSByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgb2YgYSBjb21wbGV4IG51bWJlci4KKy0tCistLSBIZXJlIGFyZSB0aGUgJ3NwaXJpdCBvZiBDOTknIHJ1bGVzIGZvciByZWN0LiAgRmlyc3QsIHRoZSBzaG9ydAorLS0gdmVyc2lvbjoKKy0tCistLSAgICByZWN0KHgsIHQpID0gZXhwKGxvZyh4KStpdCkgZm9yIHBvc2l0aXZlLXNpZ25lZCB4CistLSAgICByZWN0KHgsIHQpID0gLWV4cChsb2coLXgpK2l0KSBmb3IgbmVnYXRpdmUtc2lnbmVkIHgKKy0tICAgIHJlY3QobmFuLCB0KSA9IGV4cChuYW4gKyBpdCksIGV4Y2VwdCB0aGF0IGluIHJlY3QobmFuLCArLTApIHRoZQorLS0gICAgICBzaWduIG9mIHRoZSBpbWFnaW5hcnkgcGFydCBpcyB1bnNwZWNpZmllZC4KKy0tCistLSBhbmQgbm93IHRoZSBsb25nIHZlcnNpb246CistLQorLS0gICByZWN0KHgsIC10KSA9IGNvbmoocmVjdCh4LCB0KSkgZm9yIGFsbCB4IGFuZCB0CistLSAgIHJlY3QoLXgsIHQpID0gLXJlY3QoeCwgdCkgZm9yIGFsbCB4IGFuZCB0CistLSAgIHJlY3QoKzAsICswKSByZXR1cm5zICswICsgaTAKKy0tICAgcmVjdCgrMCwgaW5mKSByZXR1cm5zICstIDAgKy0gaTAsIHdoZXJlIHRoZSBzaWducyBvZiB0aGUgcmVhbCBhbmQKKy0tICAgICBpbWFnaW5hcnkgcGFydHMgYXJlIHVuc3BlY2lmaWVkLgorLS0gICByZWN0KHgsIGluZikgcmV0dXJucyBOYU4gKyBpIE5hTiBhbmQgcmFpc2VzIHRoZSAiaW52YWxpZCIKKy0tICAgICBmbG9hdGluZy1wb2ludCBleGNlcHRpb24sIGZvciBmaW5pdGUgbm9uemVybyB4LgorLS0gICByZWN0KGluZiwgaW5mKSByZXR1cm5zICstaW5mICsgaSBOYU4gYW5kIHJhaXNlcyB0aGUgImludmFsaWQiCistLSAgICAgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9uICh3aGVyZSB0aGUgc2lnbiBvZiB0aGUgcmVhbCBwYXJ0IG9mIHRoZQorLS0gICAgIHJlc3VsdCBpcyB1bnNwZWNpZmllZCkuCistLSAgIHJlY3QoaW5mLCArMCkgcmV0dXJucyBpbmYraTAKKy0tICAgcmVjdChpbmYsIHgpIHJldHVybnMgaW5mKmNpcyh4KSwgZm9yIGZpbml0ZSBub256ZXJvIHgKKy0tICAgcmVjdChpbmYsIE5hTikgcmV0dXJucyArLWluZitpIE5hTiwgd2hlcmUgdGhlIHNpZ24gb2YgdGhlIHJlYWwgcGFydAorLS0gICAgIG9mIHRoZSByZXN1bHQgaXMgdW5zcGVjaWZpZWQuCistLSAgIHJlY3QoTmFOLCB4KSByZXR1cm5zIE5hTiArIGkgTmFOIGZvciBhbGwgbm9uemVybyBudW1iZXJzIChpbmNsdWRpbmcKKy0tICAgICBpbmZpbml0aWVzKSB4CistLSAgIHJlY3QoTmFOLCAwKSByZXR1cm5zIE5hTiArLSBpMCwgd2hlcmUgdGhlIHNpZ24gb2YgdGhlIGltYWdpbmFyeQorLS0gICAgIHBhcnQgaXMgdW5zcGVjaWZpZWQKKy0tICAgcmVjdChOYU4sIE5hTikgcmV0dXJucyBOYU4gKyBpIE5hTgorLS0gICByZWN0KHgsIE5hTikgcmV0dXJucyBOYU4gKyBpIE5hTiBmb3IgZmluaXRlIG5vbnplcm8geAorLS0gICByZWN0KCswLCBOYU4pIHJldHVybiArLTAgKy0gaTAsIHdoZXJlIHRoZSBzaWducyBvZiB0aGUgcmVhbCBhbmQKKy0tICAgICBpbWFnaW5hcnkgcGFydHMgYXJlIHVuc3BlY2lmaWVkLgorCistLSBzcGVjaWFsIHZhbHVlcworcmVjdDEwMDAgcmVjdCAwLjAgMC4wIC0+IDAuMCAwLjAKK3JlY3QxMDAxIHJlY3QgMC4wIGluZiAtPiAwLjAgMC4wICAgICAgICBpZ25vcmUtcmVhbC1zaWduIGlnbm9yZS1pbWFnLXNpZ24KK3JlY3QxMDAyIHJlY3QgMi4zIGluZiAtPiBuYW4gbmFuICAgICAgICBpbnZhbGlkCityZWN0MTAwMyByZWN0IGluZiBpbmYgLT4gaW5mIG5hbiAgICAgICAgaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCityZWN0MTAwNCByZWN0IGluZiAwLjAgLT4gaW5mIDAuMAorcmVjdDEwMDUgcmVjdCBpbmYgMS40IC0+IGluZiBpbmYKK3JlY3QxMDA2IHJlY3QgaW5mIDIuOCAtPiAtaW5mIGluZgorcmVjdDEwMDcgcmVjdCBpbmYgNC4yIC0+IC1pbmYgLWluZgorcmVjdDEwMDggcmVjdCBpbmYgNS42IC0+IGluZiAtaW5mCityZWN0MTAwOSByZWN0IGluZiA3LjAgLT4gaW5mIGluZgorcmVjdDEwMTAgcmVjdCBuYW4gMC4wIC0+IG5hbiAwLjAgICAgICAgIGlnbm9yZS1pbWFnLXNpZ24KK3JlY3QxMDExIHJlY3QgbmFuIDIuMyAtPiBuYW4gbmFuCityZWN0MTAxMiByZWN0IG5hbiBpbmYgLT4gbmFuIG5hbgorcmVjdDEwMTMgcmVjdCBuYW4gbmFuIC0+IG5hbiBuYW4KK3JlY3QxMDE0IHJlY3QgaW5mIG5hbiAtPiBpbmYgbmFuICAgICAgICBpZ25vcmUtcmVhbC1zaWduCityZWN0MTAxNSByZWN0IDIuMyBuYW4gLT4gbmFuIG5hbgorcmVjdDEwMTYgcmVjdCAwLjAgbmFuIC0+IDAuMCAwLjAgICAgICAgIGlnbm9yZS1yZWFsLXNpZ24gaWdub3JlLWltYWctc2lnbgorcmVjdDEwMTcgcmVjdCAwLjAgLTAuMCAtPiAwLjAgLTAuMAorcmVjdDEwMTggcmVjdCAwLjAgLWluZiAtPiAwLjAgMC4wICAgICAgIGlnbm9yZS1yZWFsLXNpZ24gaWdub3JlLWltYWctc2lnbgorcmVjdDEwMTkgcmVjdCAyLjMgLWluZiAtPiBuYW4gbmFuICAgICAgIGludmFsaWQKK3JlY3QxMDIwIHJlY3QgaW5mIC1pbmYgLT4gaW5mIG5hbiAgICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK3JlY3QxMDIxIHJlY3QgaW5mIC0wLjAgLT4gaW5mIC0wLjAKK3JlY3QxMDIyIHJlY3QgaW5mIC0xLjQgLT4gaW5mIC1pbmYKK3JlY3QxMDIzIHJlY3QgaW5mIC0yLjggLT4gLWluZiAtaW5mCityZWN0MTAyNCByZWN0IGluZiAtNC4yIC0+IC1pbmYgaW5mCityZWN0MTAyNSByZWN0IGluZiAtNS42IC0+IGluZiBpbmYKK3JlY3QxMDI2IHJlY3QgaW5mIC03LjAgLT4gaW5mIC1pbmYKK3JlY3QxMDI3IHJlY3QgbmFuIC0wLjAgLT4gbmFuIDAuMCAgICAgICBpZ25vcmUtaW1hZy1zaWduCityZWN0MTAyOCByZWN0IG5hbiAtMi4zIC0+IG5hbiBuYW4KK3JlY3QxMDI5IHJlY3QgbmFuIC1pbmYgLT4gbmFuIG5hbgorcmVjdDEwMzAgcmVjdCAtMC4wIDAuMCAtPiAtMC4wIC0wLjAKK3JlY3QxMDMxIHJlY3QgLTAuMCBpbmYgLT4gMC4wIDAuMCAgICAgICBpZ25vcmUtcmVhbC1zaWduIGlnbm9yZS1pbWFnLXNpZ24KK3JlY3QxMDMyIHJlY3QgLTIuMyBpbmYgLT4gbmFuIG5hbiAgICAgICBpbnZhbGlkCityZWN0MTAzMyByZWN0IC1pbmYgaW5mIC0+IC1pbmYgbmFuICAgICAgaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCityZWN0MTAzNCByZWN0IC1pbmYgMC4wIC0+IC1pbmYgLTAuMAorcmVjdDEwMzUgcmVjdCAtaW5mIDEuNCAtPiAtaW5mIC1pbmYKK3JlY3QxMDM2IHJlY3QgLWluZiAyLjggLT4gaW5mIC1pbmYKK3JlY3QxMDM3IHJlY3QgLWluZiA0LjIgLT4gaW5mIGluZgorcmVjdDEwMzggcmVjdCAtaW5mIDUuNiAtPiAtaW5mIGluZgorcmVjdDEwMzkgcmVjdCAtaW5mIDcuMCAtPiAtaW5mIC1pbmYKK3JlY3QxMDQwIHJlY3QgLWluZiBuYW4gLT4gaW5mIG5hbiAgICAgICBpZ25vcmUtcmVhbC1zaWduCityZWN0MTA0MSByZWN0IC0yLjMgbmFuIC0+IG5hbiBuYW4KK3JlY3QxMDQyIHJlY3QgLTAuMCBuYW4gLT4gMC4wIDAuMCAgICAgICBpZ25vcmUtcmVhbC1zaWduIGlnbm9yZS1pbWFnLXNpZ24KK3JlY3QxMDQzIHJlY3QgLTAuMCAtMC4wIC0+IC0wLjAgMC4wCityZWN0MTA0NCByZWN0IC0wLjAgLWluZiAtPiAwLjAgMC4wICAgICAgaWdub3JlLXJlYWwtc2lnbiBpZ25vcmUtaW1hZy1zaWduCityZWN0MTA0NSByZWN0IC0yLjMgLWluZiAtPiBuYW4gbmFuICAgICAgaW52YWxpZAorcmVjdDEwNDYgcmVjdCAtaW5mIC1pbmYgLT4gLWluZiBuYW4gICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorcmVjdDEwNDcgcmVjdCAtaW5mIC0wLjAgLT4gLWluZiAwLjAKK3JlY3QxMDQ4IHJlY3QgLWluZiAtMS40IC0+IC1pbmYgaW5mCityZWN0MTA0OSByZWN0IC1pbmYgLTIuOCAtPiBpbmYgaW5mCityZWN0MTA1MCByZWN0IC1pbmYgLTQuMiAtPiBpbmYgLWluZgorcmVjdDEwNTEgcmVjdCAtaW5mIC01LjYgLT4gLWluZiAtaW5mCityZWN0MTA1MiByZWN0IC1pbmYgLTcuMCAtPiAtaW5mIGluZgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBwb2xhcjogQ29udmVyc2lvbiBmcm9tIHJlY3Rhbmd1bGFyIGNvb3JkaW5hdGVzIHRvIHBvbGFyIGNvb3JkaW5hdGVzIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLQorLS0gRm9yIGNtYXRoLnBvbGFyLCB3ZSBjYW4gdXNlIHRoZSBzYW1lIHRlc3RjYXNlIHN5bnRheCBhcyBmb3IgdGhlCistLSBjb21wbGV4IC0+IGNvbXBsZXggZnVuY3Rpb25zIGFib3ZlLCBidXQgaGVyZSB0aGUgb3V0cHV0IGFyZ3VtZW50cworLS0gc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGEgcGFpciBvZiBmbG9hdGluZy1wb2ludCBudW1iZXJzIHJhdGhlcgorLS0gdGhhbiB0aGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIG9mIGEgY29tcGxleCBudW1iZXIuCistLQorLS0gQW5uZXggRyBvZiB0aGUgQzk5IHN0YW5kYXJkIGRlc2NyaWJlcyBmdWxseSBib3RoIHRoZSByZWFsIGFuZAorLS0gaW1hZ2luYXJ5IHBhcnRzIG9mIHBvbGFyIChhcyBjYWJzIGFuZCBjYXJnLCByZXNwZWN0aXZlbHksIHdoaWNoIGluIHR1cm4KKy0tIGFyZSBkZWZpbmVkIGluIHRlcm1zIG9mIHRoZSBmdW5jdGlvbnMgaHlwb3QgYW5kIGF0YW4yKS4KKworLS0gb3ZlcmZsb3cKK3BvbGFyMDEwMCBwb2xhciAxLjRlMzA4IDEuNGUzMDggLT4gaW5mIDAuNzg1Mzk4MTYzMzk3NDQ4MjggICAgICBvdmVyZmxvdworCistLSBzcGVjaWFsIHZhbHVlcworcG9sYXIxMDAwIHBvbGFyIDAuMCAwLjAgLT4gMC4wIDAuMAorcG9sYXIxMDAxIHBvbGFyIDAuMCAtMC4wIC0+IDAuMCAtMC4wCitwb2xhcjEwMDIgcG9sYXIgLTAuMCAwLjAgLT4gMC4wIDMuMTQxNTkyNjUzNTg5NzkzMQorcG9sYXIxMDAzIHBvbGFyIC0wLjAgLTAuMCAtPiAwLjAgLTMuMTQxNTkyNjUzNTg5NzkzMQorcG9sYXIxMDA0IHBvbGFyIGluZiAwLjAgLT4gaW5mIDAuMAorcG9sYXIxMDA1IHBvbGFyIGluZiAyLjMgLT4gaW5mIDAuMAorcG9sYXIxMDA2IHBvbGFyIGluZiBpbmYgLT4gaW5mIDAuNzg1Mzk4MTYzMzk3NDQ4MjgKK3BvbGFyMTAwNyBwb2xhciAyLjMgaW5mIC0+IGluZiAxLjU3MDc5NjMyNjc5NDg5NjYKK3BvbGFyMTAwOCBwb2xhciAwLjAgaW5mIC0+IGluZiAxLjU3MDc5NjMyNjc5NDg5NjYKK3BvbGFyMTAwOSBwb2xhciAtMC4wIGluZiAtPiBpbmYgMS41NzA3OTYzMjY3OTQ4OTY2Citwb2xhcjEwMTAgcG9sYXIgLTIuMyBpbmYgLT4gaW5mIDEuNTcwNzk2MzI2Nzk0ODk2NgorcG9sYXIxMDExIHBvbGFyIC1pbmYgaW5mIC0+IGluZiAyLjM1NjE5NDQ5MDE5MjM0NDgKK3BvbGFyMTAxMiBwb2xhciAtaW5mIDIuMyAtPiBpbmYgMy4xNDE1OTI2NTM1ODk3OTMxCitwb2xhcjEwMTMgcG9sYXIgLWluZiAwLjAgLT4gaW5mIDMuMTQxNTkyNjUzNTg5NzkzMQorcG9sYXIxMDE0IHBvbGFyIC1pbmYgLTAuMCAtPiBpbmYgLTMuMTQxNTkyNjUzNTg5NzkzMQorcG9sYXIxMDE1IHBvbGFyIC1pbmYgLTIuMyAtPiBpbmYgLTMuMTQxNTkyNjUzNTg5NzkzMQorcG9sYXIxMDE2IHBvbGFyIC1pbmYgLWluZiAtPiBpbmYgLTIuMzU2MTk0NDkwMTkyMzQ0OAorcG9sYXIxMDE3IHBvbGFyIC0yLjMgLWluZiAtPiBpbmYgLTEuNTcwNzk2MzI2Nzk0ODk2NgorcG9sYXIxMDE4IHBvbGFyIC0wLjAgLWluZiAtPiBpbmYgLTEuNTcwNzk2MzI2Nzk0ODk2NgorcG9sYXIxMDE5IHBvbGFyIDAuMCAtaW5mIC0+IGluZiAtMS41NzA3OTYzMjY3OTQ4OTY2Citwb2xhcjEwMjAgcG9sYXIgMi4zIC1pbmYgLT4gaW5mIC0xLjU3MDc5NjMyNjc5NDg5NjYKK3BvbGFyMTAyMSBwb2xhciBpbmYgLWluZiAtPiBpbmYgLTAuNzg1Mzk4MTYzMzk3NDQ4MjgKK3BvbGFyMTAyMiBwb2xhciBpbmYgLTIuMyAtPiBpbmYgLTAuMAorcG9sYXIxMDIzIHBvbGFyIGluZiAtMC4wIC0+IGluZiAtMC4wCitwb2xhcjEwMjQgcG9sYXIgbmFuIC1pbmYgLT4gaW5mIG5hbgorcG9sYXIxMDI1IHBvbGFyIG5hbiAtMi4zIC0+IG5hbiBuYW4KK3BvbGFyMTAyNiBwb2xhciBuYW4gLTAuMCAtPiBuYW4gbmFuCitwb2xhcjEwMjcgcG9sYXIgbmFuIDAuMCAtPiBuYW4gbmFuCitwb2xhcjEwMjggcG9sYXIgbmFuIDIuMyAtPiBuYW4gbmFuCitwb2xhcjEwMjkgcG9sYXIgbmFuIGluZiAtPiBpbmYgbmFuCitwb2xhcjEwMzAgcG9sYXIgbmFuIG5hbiAtPiBuYW4gbmFuCitwb2xhcjEwMzEgcG9sYXIgaW5mIG5hbiAtPiBpbmYgbmFuCitwb2xhcjEwMzIgcG9sYXIgMi4zIG5hbiAtPiBuYW4gbmFuCitwb2xhcjEwMzMgcG9sYXIgMC4wIG5hbiAtPiBuYW4gbmFuCitwb2xhcjEwMzQgcG9sYXIgLTAuMCBuYW4gLT4gbmFuIG5hbgorcG9sYXIxMDM1IHBvbGFyIC0yLjMgbmFuIC0+IG5hbiBuYW4KK3BvbGFyMTAzNiBwb2xhciAtaW5mIG5hbiAtPiBpbmYgbmFuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY3Vyc2VzX3Rlc3RzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2N1cnNlc190ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGVkYmJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2N1cnNlc190ZXN0cy5weQpAQCAtMCwwICsxLDQ2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgJElkOiBuY3Vyc2VzLnB5IDM2NTU5IDIwMDQtMDctMTggMDU6NTY6MDlaIHRpbV9vbmUgJAorIworIyBJbnRlcmFjdGl2ZSB0ZXN0IHN1aXRlIGZvciB0aGUgY3Vyc2VzIG1vZHVsZS4KKyMgVGhpcyBzY3JpcHQgZGlzcGxheXMgdmFyaW91cyB0aGluZ3MgYW5kIHRoZSB1c2VyIHNob3VsZCB2ZXJpZnkgd2hldGhlcgorIyB0aGV5IGRpc3BsYXkgY29ycmVjdGx5LgorIworCitpbXBvcnQgY3Vyc2VzCitmcm9tIGN1cnNlcyBpbXBvcnQgdGV4dHBhZAorCitkZWYgdGVzdF90ZXh0cGFkKHN0ZHNjciwgaW5zZXJ0X21vZGU9RmFsc2UpOgorICAgIG5jb2xzLCBubGluZXMgPSA4LCAzCisgICAgdWx5LCB1bHggPSAzLCAyCisgICAgaWYgaW5zZXJ0X21vZGU6CisgICAgICAgIG1vZGUgPSAnaW5zZXJ0IG1vZGUnCisgICAgZWxzZToKKyAgICAgICAgbW9kZSA9ICdvdmVyd3JpdGUgbW9kZScKKworICAgIHN0ZHNjci5hZGRzdHIodWx5LTMsIHVseCwgIlVzZSBDdHJsLUcgdG8gZW5kIGVkaXRpbmcgKCVzKS4iICUgbW9kZSkKKyAgICBzdGRzY3IuYWRkc3RyKHVseS0yLCB1bHgsICJCZSBzdXJlIHRvIHRyeSB0eXBpbmcgaW4gdGhlIGxvd2VyLXJpZ2h0IGNvcm5lci4iKQorICAgIHdpbiA9IGN1cnNlcy5uZXd3aW4obmxpbmVzLCBuY29scywgdWx5LCB1bHgpCisgICAgdGV4dHBhZC5yZWN0YW5nbGUoc3Rkc2NyLCB1bHktMSwgdWx4LTEsIHVseSArIG5saW5lcywgdWx4ICsgbmNvbHMpCisgICAgc3Rkc2NyLnJlZnJlc2goKQorCisgICAgYm94ID0gdGV4dHBhZC5UZXh0Ym94KHdpbiwgaW5zZXJ0X21vZGUpCisgICAgY29udGVudHMgPSBib3guZWRpdCgpCisgICAgc3Rkc2NyLmFkZHN0cih1bHkrbmNvbHMrMiwgMCwgIlRleHQgZW50ZXJlZCBpbiB0aGUgYm94XG4iKQorICAgIHN0ZHNjci5hZGRzdHIocmVwcihjb250ZW50cykpCisgICAgc3Rkc2NyLmFkZHN0cignXG4nKQorICAgIHN0ZHNjci5hZGRzdHIoJ1ByZXNzIGFueSBrZXknKQorICAgIHN0ZHNjci5nZXRjaCgpCisKKyAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgICAgc3Rkc2NyLm1vdmUodWx5K25jb2xzKzIgKyBpLCAwKQorICAgICAgICBzdGRzY3IuY2xydG9lb2woKQorCitkZWYgbWFpbihzdGRzY3IpOgorICAgIHN0ZHNjci5jbGVhcigpCisgICAgdGVzdF90ZXh0cGFkKHN0ZHNjciwgRmFsc2UpCisgICAgdGVzdF90ZXh0cGFkKHN0ZHNjciwgVHJ1ZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGN1cnNlcy53cmFwcGVyKG1haW4pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY3Vyc2VzX3Rlc3RzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9jdXJzZXNfdGVzdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmE5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY3Vyc2VzX3Rlc3RzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY3Vyc2VzX3Rlc3RzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9jdXJzZXNfdGVzdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmE5ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY3Vyc2VzX3Rlc3RzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGF0YS9SRUFETUUgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGF0YS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJmOGM5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kYXRhL1JFQURNRQpAQCAtMCwwICsxLDIgQEAKK1RoaXMgZW1wdHkgZGlyZWN0b3J5IHNlcnZlcyBhcyBkZXN0aW5hdGlvbiBmb3IgdGVtcG9yYXJ5IGZpbGVzCitjcmVhdGVkIGJ5IHNvbWUgdGVzdHMuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2Ficy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9hYnMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWY3M2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9hYnMuZGVjVGVzdApAQCAtMCwwICsxLDE2MSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBhYnMuZGVjVGVzdCAtLSBkZWNpbWFsIGFic29sdXRlIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgc2V0IG9mIHRlc3RzIHByaW1hcmlseSB0ZXN0cyB0aGUgZXhpc3RlbmNlIG9mIHRoZSBvcGVyYXRvci4KKy0tIEFkZGl0b24sIHN1YnRyYWN0aW9uLCByb3VuZGluZywgYW5kIG1vcmUgb3ZlcmZsb3dzIGFyZSB0ZXN0ZWQKKy0tIGVsc2V3aGVyZS4KKworcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworZXh0ZW5kZWQ6IDEKKworYWJzeDAwMSBhYnMgJzEnICAgICAgLT4gJzEnCithYnN4MDAyIGFicyAnLTEnICAgICAtPiAnMScKK2Fic3gwMDMgYWJzICcxLjAwJyAgIC0+ICcxLjAwJworYWJzeDAwNCBhYnMgJy0xLjAwJyAgLT4gJzEuMDAnCithYnN4MDA1IGFicyAnMCcgICAgICAtPiAnMCcKK2Fic3gwMDYgYWJzICcwLjAwJyAgIC0+ICcwLjAwJworYWJzeDAwNyBhYnMgJzAwLjAnICAgLT4gJzAuMCcKK2Fic3gwMDggYWJzICcwMC4wMCcgIC0+ICcwLjAwJworYWJzeDAwOSBhYnMgJzAwJyAgICAgLT4gJzAnCisKK2Fic3gwMTAgYWJzICctMicgICAgIC0+ICcyJworYWJzeDAxMSBhYnMgJzInICAgICAgLT4gJzInCithYnN4MDEyIGFicyAnLTIuMDAnICAtPiAnMi4wMCcKK2Fic3gwMTMgYWJzICcyLjAwJyAgIC0+ICcyLjAwJworYWJzeDAxNCBhYnMgJy0wJyAgICAgLT4gJzAnCithYnN4MDE1IGFicyAnLTAuMDAnICAtPiAnMC4wMCcKK2Fic3gwMTYgYWJzICctMDAuMCcgIC0+ICcwLjAnCithYnN4MDE3IGFicyAnLTAwLjAwJyAtPiAnMC4wMCcKK2Fic3gwMTggYWJzICctMDAnICAgIC0+ICcwJworCithYnN4MDIwIGFicyAnLTIwMDAwMDAnIC0+ICcyMDAwMDAwJworYWJzeDAyMSBhYnMgJzIwMDAwMDAnICAtPiAnMjAwMDAwMCcKK3ByZWNpc2lvbjogNworYWJzeDAyMiBhYnMgJy0yMDAwMDAwJyAtPiAnMjAwMDAwMCcKK2Fic3gwMjMgYWJzICcyMDAwMDAwJyAgLT4gJzIwMDAwMDAnCitwcmVjaXNpb246IDYKK2Fic3gwMjQgYWJzICctMjAwMDAwMCcgLT4gJzIuMDAwMDBFKzYnIFJvdW5kZWQKK2Fic3gwMjUgYWJzICcyMDAwMDAwJyAgLT4gJzIuMDAwMDBFKzYnIFJvdW5kZWQKK3ByZWNpc2lvbjogMworYWJzeDAyNiBhYnMgJy0yMDAwMDAwJyAtPiAnMi4wMEUrNicgUm91bmRlZAorYWJzeDAyNyBhYnMgJzIwMDAwMDAnICAtPiAnMi4wMEUrNicgUm91bmRlZAorCithYnN4MDMwIGFicyAnKzAuMScgICAgICAgICAgICAtPiAnMC4xJworYWJzeDAzMSBhYnMgJy0wLjEnICAgICAgICAgICAgLT4gJzAuMScKK2Fic3gwMzIgYWJzICcrMC4wMScgICAgICAgICAgIC0+ICcwLjAxJworYWJzeDAzMyBhYnMgJy0wLjAxJyAgICAgICAgICAgLT4gJzAuMDEnCithYnN4MDM0IGFicyAnKzAuMDAxJyAgICAgICAgICAtPiAnMC4wMDEnCithYnN4MDM1IGFicyAnLTAuMDAxJyAgICAgICAgICAtPiAnMC4wMDEnCithYnN4MDM2IGFicyAnKzAuMDAwMDAxJyAgICAgICAtPiAnMC4wMDAwMDEnCithYnN4MDM3IGFicyAnLTAuMDAwMDAxJyAgICAgICAtPiAnMC4wMDAwMDEnCithYnN4MDM4IGFicyAnKzAuMDAwMDAwMDAwMDAxJyAtPiAnMUUtMTInCithYnN4MDM5IGFicyAnLTAuMDAwMDAwMDAwMDAxJyAtPiAnMUUtMTInCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjQXJpdGgKK3ByZWNpc2lvbjogOQorYWJzeDA0MCBhYnMgJzIuMScgICAgIC0+ICAnMi4xJworYWJzeDA0MSBhYnMgJy0xMDAnICAgIC0+ICAnMTAwJworYWJzeDA0MiBhYnMgJzEwMS41JyAgIC0+ICAnMTAxLjUnCithYnN4MDQzIGFicyAnLTEwMS41JyAgLT4gICcxMDEuNScKKworLS0gbW9yZSBmaXhlZCwgcG90ZW50aWFsIExIUyBzd2Fwcy9vdmVybGF5cyBpZiBkb25lIGJ5IHN1YnRyYWN0IDAKK3ByZWNpc2lvbjogOQorYWJzeDA2MCBhYnMgJy01NjI2N0UtMTAnICAtPiAnMC4wMDAwMDU2MjY3JworYWJzeDA2MSBhYnMgJy01NjI2N0UtNScgICAtPiAnMC41NjI2NycKK2Fic3gwNjIgYWJzICctNTYyNjdFLTInICAgLT4gJzU2Mi42NycKK2Fic3gwNjMgYWJzICctNTYyNjdFLTEnICAgLT4gJzU2MjYuNycKK2Fic3gwNjUgYWJzICctNTYyNjdFLTAnICAgLT4gJzU2MjY3JworCistLSBvdmVyZmxvdyB0ZXN0cworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogMworYWJzeDEyMCBhYnMgOS45OTlFKzk5OTk5OTk5OSAtPiBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworLS0gc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93CitwcmVjaXNpb246IDMKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CithYnN4MjEwIGFicyAgMS4wMEUtOTk5ICAgICAgICAtPiAgIDEuMDBFLTk5OQorYWJzeDIxMSBhYnMgIDAuMUUtOTk5ICAgICAgICAgLT4gICAxRS0xMDAwICAgU3Vibm9ybWFsCithYnN4MjEyIGFicyAgMC4xMEUtOTk5ICAgICAgICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwKK2Fic3gyMTMgYWJzICAwLjEwMEUtOTk5ICAgICAgIC0+ICAgMS4wRS0xMDAwIFN1Ym5vcm1hbCBSb3VuZGVkCithYnN4MjE0IGFicyAgMC4wMUUtOTk5ICAgICAgICAtPiAgIDFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCithYnN4MjE1IGFicyAgMC45OTlFLTk5OSAgICAgICAtPiAgIDEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWJzeDIxNiBhYnMgIDAuMDk5RS05OTkgICAgICAgLT4gICAxLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2Fic3gyMTcgYWJzICAwLjAwOUUtOTk5ICAgICAgIC0+ICAgMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithYnN4MjE4IGFicyAgMC4wMDFFLTk5OSAgICAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCithYnN4MjE5IGFicyAgMC4wMDA5RS05OTkgICAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCithYnN4MjIwIGFicyAgMC4wMDAxRS05OTkgICAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCisKK2Fic3gyMzAgYWJzIC0xLjAwRS05OTkgICAgICAgIC0+ICAgMS4wMEUtOTk5CithYnN4MjMxIGFicyAtMC4xRS05OTkgICAgICAgICAtPiAgIDFFLTEwMDAgICBTdWJub3JtYWwKK2Fic3gyMzIgYWJzIC0wLjEwRS05OTkgICAgICAgIC0+ICAgMS4wRS0xMDAwIFN1Ym5vcm1hbAorYWJzeDIzMyBhYnMgLTAuMTAwRS05OTkgICAgICAgLT4gICAxLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK2Fic3gyMzQgYWJzIC0wLjAxRS05OTkgICAgICAgIC0+ICAgMUUtMTAwMSAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIEVtaW4KK2Fic3gyMzUgYWJzIC0wLjk5OUUtOTk5ICAgICAgIC0+ICAgMS4wMEUtOTk5IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithYnN4MjM2IGFicyAtMC4wOTlFLTk5OSAgICAgICAtPiAgIDEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWJzeDIzNyBhYnMgLTAuMDA5RS05OTkgICAgICAgLT4gICAxRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2Fic3gyMzggYWJzIC0wLjAwMUUtOTk5ICAgICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2Fic3gyMzkgYWJzIC0wLjAwMDlFLTk5OSAgICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2Fic3gyNDAgYWJzIC0wLjAwMDFFLTk5OSAgICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKKworLS0gbG9uZyBvcGVyYW5kIHRlc3RzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CithYnN4MzAxIGFicyAxMjM0NTY3ODAwMCAgLT4gMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorYWJzeDMwMiBhYnMgMTIzNDU2NzgwMCAgIC0+IDEuMjM0NTY3ODBFKzkgUm91bmRlZAorYWJzeDMwMyBhYnMgMTIzNDU2Nzg5MCAgIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorYWJzeDMwNCBhYnMgMTIzNDU2Nzg5MSAgIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCithYnN4MzA1IGFicyAxMjM0NTY3ODkwMSAgLT4gMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCithYnN4MzA2IGFicyAxMjM0NTY3ODk2ICAgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAxNQorYWJzeDMyMSBhYnMgMTIzNDU2NzgwMDAgIC0+IDEyMzQ1Njc4MDAwCithYnN4MzIyIGFicyAxMjM0NTY3ODAwICAgLT4gMTIzNDU2NzgwMAorYWJzeDMyMyBhYnMgMTIzNDU2Nzg5MCAgIC0+IDEyMzQ1Njc4OTAKK2Fic3gzMjQgYWJzIDEyMzQ1Njc4OTEgICAtPiAxMjM0NTY3ODkxCithYnN4MzI1IGFicyAxMjM0NTY3ODkwMSAgLT4gMTIzNDU2Nzg5MDEKK2Fic3gzMjYgYWJzIDEyMzQ1Njc4OTYgICAtPiAxMjM0NTY3ODk2CisKKworLS0gU3BlY2lhbHMKK3ByZWNpc2lvbjogICA5CisKKy0tIHNwZWNpYWxzCithYnN4NTIwIGFicyAnSW5mJyAgICAtPiAnSW5maW5pdHknCithYnN4NTIxIGFicyAnLUluZicgICAtPiAnSW5maW5pdHknCithYnN4NTIyIGFicyAgIE5hTiAgICAtPiAgTmFOCithYnN4NTIzIGFicyAgc05hTiAgICAtPiAgTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2Fic3g1MjQgYWJzICAgTmFOMjIgIC0+ICBOYU4yMgorYWJzeDUyNSBhYnMgIHNOYU4zMyAgLT4gIE5hTjMzIEludmFsaWRfb3BlcmF0aW9uCithYnN4NTI2IGFicyAgLU5hTjIyICAtPiAtTmFOMjIKK2Fic3g1MjcgYWJzIC1zTmFOMzMgIC0+IC1OYU4zMyBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOdWxsIHRlc3RzCithYnN4OTAwIGFicyAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9hZGQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvYWRkLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2MWM0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvYWRkLmRlY1Rlc3QKQEAgLTAsMCArMSwyNzE2IEBACistLS0tLS0vY2FuY2VsbC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGFkZC5kZWNUZXN0IC0tIGRlY2ltYWwgYWRkaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKKworLS0gW2ZpcnN0IGdyb3VwIGFyZSAncXVpY2sgY29uZmlkZW5jZSBjaGVjayddCithZGR4MDAxIGFkZCAxICAgICAgIDEgICAgICAgLT4gIDIKK2FkZHgwMDIgYWRkIDIgICAgICAgMyAgICAgICAtPiAgNQorYWRkeDAwMyBhZGQgJzUuNzUnICAnMy4zJyAgIC0+ICA5LjA1CithZGR4MDA0IGFkZCAnNScgICAgICctMycgICAgLT4gIDIKK2FkZHgwMDUgYWRkICctNScgICAgJy0zJyAgICAtPiAgLTgKK2FkZHgwMDYgYWRkICctNycgICAgJzIuNScgICAtPiAgLTQuNQorYWRkeDAwNyBhZGQgJzAuNycgICAnMC4zJyAgIC0+ICAxLjAKK2FkZHgwMDggYWRkICcxLjI1JyAgJzEuMjUnICAtPiAgMi41MAorYWRkeDAwOSBhZGQgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAwMCcgLT4gJzIuMjM0NTY3ODknCithZGR4MDEwIGFkZCAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDExJyAtPiAnMi4yMzQ1NjgwMCcKKworYWRkeDAxMSBhZGQgJzAuNDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTUnIC0+ICcxLjAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwMTIgYWRkICcwLjQ0NDQ0NDQ0NDAnICAnMC41NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4MDEzIGFkZCAnMC40NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1MCcgLT4gJzAuOTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwMTQgYWRkICcwLjQ0NDQ0NDQ0NDQ5JyAgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwMTUgYWRkICcwLjQ0NDQ0NDQ0NDQ5OScgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwMTYgYWRkICcwLjQ0NDQ0NDQ0NDQ5OTknICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwMTcgYWRkICcwLjQ0NDQ0NDQ0NDUwMDAnICAnMCcgLT4gJzAuNDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwMTggYWRkICcwLjQ0NDQ0NDQ0NDUwMDEnICAnMCcgLT4gJzAuNDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwMTkgYWRkICcwLjQ0NDQ0NDQ0NDUwMScgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwMjAgYWRkICcwLjQ0NDQ0NDQ0NDUxJyAgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDAyMSBhZGQgMCAxIC0+IDEKK2FkZHgwMjIgYWRkIDEgMSAtPiAyCithZGR4MDIzIGFkZCAyIDEgLT4gMworYWRkeDAyNCBhZGQgMyAxIC0+IDQKK2FkZHgwMjUgYWRkIDQgMSAtPiA1CithZGR4MDI2IGFkZCA1IDEgLT4gNgorYWRkeDAyNyBhZGQgNiAxIC0+IDcKK2FkZHgwMjggYWRkIDcgMSAtPiA4CithZGR4MDI5IGFkZCA4IDEgLT4gOQorYWRkeDAzMCBhZGQgOSAxIC0+IDEwCisKKy0tIHNvbWUgY2FycnlpbmcgZWZmZWN0cworYWRkeDAzMSBhZGQgJzAuOTk5OCcgICcwLjAwMDAnIC0+ICcwLjk5OTgnCithZGR4MDMyIGFkZCAnMC45OTk4JyAgJzAuMDAwMScgLT4gJzAuOTk5OScKK2FkZHgwMzMgYWRkICcwLjk5OTgnICAnMC4wMDAyJyAtPiAnMS4wMDAwJworYWRkeDAzNCBhZGQgJzAuOTk5OCcgICcwLjAwMDMnIC0+ICcxLjAwMDEnCisKK2FkZHgwMzUgYWRkICc3MCcgICcxMDAwMGUrOScgLT4gJzEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwMzYgYWRkICc3MDAnICAnMTAwMDBlKzknIC0+ICcxLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCithZGR4MDM3IGFkZCAnNzAwMCcgICcxMDAwMGUrOScgLT4gJzEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwMzggYWRkICc3MDAwMCcgICcxMDAwMGUrOScgLT4gJzEuMDAwMDAwMDFFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwMzkgYWRkICc3MDAwMDAnICAnMTAwMDBlKzknIC0+ICcxLjAwMDAwMDA3RSsxMycgUm91bmRlZAorCistLSBzeW1tZXRyeToKK2FkZHgwNDAgYWRkICcxMDAwMGUrOScgICc3MCcgLT4gJzEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwNDEgYWRkICcxMDAwMGUrOScgICc3MDAnIC0+ICcxLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCithZGR4MDQyIGFkZCAnMTAwMDBlKzknICAnNzAwMCcgLT4gJzEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwNDQgYWRkICcxMDAwMGUrOScgICc3MDAwMCcgLT4gJzEuMDAwMDAwMDFFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwNDUgYWRkICcxMDAwMGUrOScgICc3MDAwMDAnIC0+ICcxLjAwMDAwMDA3RSsxMycgUm91bmRlZAorCistLSBzYW1lLCBoaWdoZXIgcHJlY2lzaW9uCitwcmVjaXNpb246IDE1CithZGR4MDQ2IGFkZCAnMTAwMDBlKzknICAnNycgLT4gJzEwMDAwMDAwMDAwMDA3JworYWRkeDA0NyBhZGQgJzEwMDAwZSs5JyAgJzcwJyAtPiAnMTAwMDAwMDAwMDAwNzAnCithZGR4MDQ4IGFkZCAnMTAwMDBlKzknICAnNzAwJyAtPiAnMTAwMDAwMDAwMDA3MDAnCithZGR4MDQ5IGFkZCAnMTAwMDBlKzknICAnNzAwMCcgLT4gJzEwMDAwMDAwMDA3MDAwJworYWRkeDA1MCBhZGQgJzEwMDAwZSs5JyAgJzcwMDAwJyAtPiAnMTAwMDAwMDAwNzAwMDAnCithZGR4MDUxIGFkZCAnMTAwMDBlKzknICAnNzAwMDAwJyAtPiAnMTAwMDAwMDA3MDAwMDAnCithZGR4MDUyIGFkZCAnMTAwMDBlKzknICAnNzAwMDAwMCcgLT4gJzEwMDAwMDA3MDAwMDAwJworCistLSBleGFtcGxlcyBmcm9tIGRlY2FyaXRoCithZGR4MDUzIGFkZCAnMTInICc3LjAwJyAtPiAnMTkuMDAnCithZGR4MDU0IGFkZCAnMS4zJyAnLTEuMDcnIC0+ICcwLjIzJworYWRkeDA1NSBhZGQgJzEuMycgJy0xLjMwJyAtPiAnMC4wMCcKK2FkZHgwNTYgYWRkICcxLjMnICctMi4wNycgLT4gJy0wLjc3JworYWRkeDA1NyBhZGQgJzFFKzInICcxRSs0JyAtPiAnMS4wMUUrNCcKKworLS0gemVybyBwcmVzZXJ2YXRpb24KK3ByZWNpc2lvbjogNgorYWRkeDA2MCBhZGQgJzEwMDAwZSs5JyAgJzcwMDAwJyAtPiAnMS4wMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorYWRkeDA2MSBhZGQgMSAnMC4wMDAxJyAtPiAnMS4wMDAxJworYWRkeDA2MiBhZGQgMSAnMC4wMDAwMScgLT4gJzEuMDAwMDEnCithZGR4MDYzIGFkZCAxICcwLjAwMDAwMScgLT4gJzEuMDAwMDAnIEluZXhhY3QgUm91bmRlZAorYWRkeDA2NCBhZGQgMSAnMC4wMDAwMDAxJyAtPiAnMS4wMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4MDY1IGFkZCAxICcwLjAwMDAwMDAxJyAtPiAnMS4wMDAwMCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNvbWUgZnVubnkgemVyb3MgW2luIGNhc2Ugb2YgYmFkIHNpZ251bV0KK2FkZHgwNzAgYWRkIDEgIDAgICAgLT4gMQorYWRkeDA3MSBhZGQgMSAwLiAgICAtPiAxCithZGR4MDcyIGFkZCAxICAuMCAgIC0+IDEuMAorYWRkeDA3MyBhZGQgMSAwLjAgICAtPiAxLjAKK2FkZHgwNzQgYWRkIDEgMC4wMCAgLT4gMS4wMAorYWRkeDA3NSBhZGQgIDAgIDEgICAtPiAxCithZGR4MDc2IGFkZCAwLiAgMSAgIC0+IDEKK2FkZHgwNzcgYWRkICAuMCAxICAgLT4gMS4wCithZGR4MDc4IGFkZCAwLjAgMSAgIC0+IDEuMAorYWRkeDA3OSBhZGQgMC4wMCAxICAtPiAxLjAwCisKK3ByZWNpc2lvbjogOQorCistLSBzb21lIGNhcnJpZXMKK2FkZHgwODAgYWRkIDk5OTk5OTk5OCAxICAtPiA5OTk5OTk5OTkKK2FkZHgwODEgYWRkIDk5OTk5OTk5OSAxICAtPiAxLjAwMDAwMDAwRSs5IFJvdW5kZWQKK2FkZHgwODIgYWRkICA5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAKK2FkZHgwODMgYWRkICAgOTk5OTk5OSAxICAtPiAxMDAwMDAwMAorYWRkeDA4NCBhZGQgICAgOTk5OTk5IDEgIC0+IDEwMDAwMDAKK2FkZHgwODUgYWRkICAgICA5OTk5OSAxICAtPiAxMDAwMDAKK2FkZHgwODYgYWRkICAgICAgOTk5OSAxICAtPiAxMDAwMAorYWRkeDA4NyBhZGQgICAgICAgOTk5IDEgIC0+IDEwMDAKK2FkZHgwODggYWRkICAgICAgICA5OSAxICAtPiAxMDAKK2FkZHgwODkgYWRkICAgICAgICAgOSAxICAtPiAxMAorCisKKy0tIG1vcmUgTEhTIHN3YXBzCithZGR4MDkwIGFkZCAnLTU2MjY3RS0xMCcgICAwIC0+ICAnLTAuMDAwMDA1NjI2NycKK2FkZHgwOTEgYWRkICctNTYyNjdFLTYnICAgIDAgLT4gICctMC4wNTYyNjcnCithZGR4MDkyIGFkZCAnLTU2MjY3RS01JyAgICAwIC0+ICAnLTAuNTYyNjcnCithZGR4MDkzIGFkZCAnLTU2MjY3RS00JyAgICAwIC0+ICAnLTUuNjI2NycKK2FkZHgwOTQgYWRkICctNTYyNjdFLTMnICAgIDAgLT4gICctNTYuMjY3JworYWRkeDA5NSBhZGQgJy01NjI2N0UtMicgICAgMCAtPiAgJy01NjIuNjcnCithZGR4MDk2IGFkZCAnLTU2MjY3RS0xJyAgICAwIC0+ICAnLTU2MjYuNycKK2FkZHgwOTcgYWRkICctNTYyNjdFLTAnICAgIDAgLT4gICctNTYyNjcnCithZGR4MDk4IGFkZCAnLTVFLTEwJyAgICAgICAwIC0+ICAnLTVFLTEwJworYWRkeDA5OSBhZGQgJy01RS03JyAgICAgICAgMCAtPiAgJy01RS03JworYWRkeDEwMCBhZGQgJy01RS02JyAgICAgICAgMCAtPiAgJy0wLjAwMDAwNScKK2FkZHgxMDEgYWRkICctNUUtNScgICAgICAgIDAgLT4gICctMC4wMDAwNScKK2FkZHgxMDIgYWRkICctNUUtNCcgICAgICAgIDAgLT4gICctMC4wMDA1JworYWRkeDEwMyBhZGQgJy01RS0xJyAgICAgICAgMCAtPiAgJy0wLjUnCithZGR4MTA0IGFkZCAnLTVFMCcgICAgICAgICAwIC0+ICAnLTUnCithZGR4MTA1IGFkZCAnLTVFMScgICAgICAgICAwIC0+ICAnLTUwJworYWRkeDEwNiBhZGQgJy01RTUnICAgICAgICAgMCAtPiAgJy01MDAwMDAnCithZGR4MTA3IGFkZCAnLTVFOCcgICAgICAgICAwIC0+ICAnLTUwMDAwMDAwMCcKK2FkZHgxMDggYWRkICctNUU5JyAgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMEUrOScgICBSb3VuZGVkCithZGR4MTA5IGFkZCAnLTVFMTAnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDBFKzEwJyAgUm91bmRlZAorYWRkeDExMCBhZGQgJy01RTExJyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwRSsxMScgIFJvdW5kZWQKK2FkZHgxMTEgYWRkICctNUUxMDAnICAgICAgIDAgLT4gICctNS4wMDAwMDAwMEUrMTAwJyBSb3VuZGVkCisKKy0tIG1vcmUgUkhTIHN3YXBzCithZGR4MTEzIGFkZCAwICAnLTU2MjY3RS0xMCcgLT4gICctMC4wMDAwMDU2MjY3JworYWRkeDExNCBhZGQgMCAgJy01NjI2N0UtNicgIC0+ICAnLTAuMDU2MjY3JworYWRkeDExNiBhZGQgMCAgJy01NjI2N0UtNScgIC0+ICAnLTAuNTYyNjcnCithZGR4MTE3IGFkZCAwICAnLTU2MjY3RS00JyAgLT4gICctNS42MjY3JworYWRkeDExOSBhZGQgMCAgJy01NjI2N0UtMycgIC0+ICAnLTU2LjI2NycKK2FkZHgxMjAgYWRkIDAgICctNTYyNjdFLTInICAtPiAgJy01NjIuNjcnCithZGR4MTIxIGFkZCAwICAnLTU2MjY3RS0xJyAgLT4gICctNTYyNi43JworYWRkeDEyMiBhZGQgMCAgJy01NjI2N0UtMCcgIC0+ICAnLTU2MjY3JworYWRkeDEyMyBhZGQgMCAgJy01RS0xMCcgICAgIC0+ICAnLTVFLTEwJworYWRkeDEyNCBhZGQgMCAgJy01RS03JyAgICAgIC0+ICAnLTVFLTcnCithZGR4MTI1IGFkZCAwICAnLTVFLTYnICAgICAgLT4gICctMC4wMDAwMDUnCithZGR4MTI2IGFkZCAwICAnLTVFLTUnICAgICAgLT4gICctMC4wMDAwNScKK2FkZHgxMjcgYWRkIDAgICctNUUtNCcgICAgICAtPiAgJy0wLjAwMDUnCithZGR4MTI4IGFkZCAwICAnLTVFLTEnICAgICAgLT4gICctMC41JworYWRkeDEyOSBhZGQgMCAgJy01RTAnICAgICAgIC0+ICAnLTUnCithZGR4MTMwIGFkZCAwICAnLTVFMScgICAgICAgLT4gICctNTAnCithZGR4MTMxIGFkZCAwICAnLTVFNScgICAgICAgLT4gICctNTAwMDAwJworYWRkeDEzMiBhZGQgMCAgJy01RTgnICAgICAgIC0+ICAnLTUwMDAwMDAwMCcKK2FkZHgxMzMgYWRkIDAgICctNUU5JyAgICAgICAtPiAgJy01LjAwMDAwMDAwRSs5JyAgICBSb3VuZGVkCithZGR4MTM0IGFkZCAwICAnLTVFMTAnICAgICAgLT4gICctNS4wMDAwMDAwMEUrMTAnICAgUm91bmRlZAorYWRkeDEzNSBhZGQgMCAgJy01RTExJyAgICAgIC0+ICAnLTUuMDAwMDAwMDBFKzExJyAgIFJvdW5kZWQKK2FkZHgxMzYgYWRkIDAgICctNUUxMDAnICAgICAtPiAgJy01LjAwMDAwMDAwRSsxMDAnICBSb3VuZGVkCisKKy0tIHJlbGF0ZWQKK2FkZHgxMzcgYWRkICAxICAnMEUtMTInICAgICAgLT4gICcxLjAwMDAwMDAwJyAgUm91bmRlZAorYWRkeDEzOCBhZGQgLTEgICcwRS0xMicgICAgICAtPiAgJy0xLjAwMDAwMDAwJyBSb3VuZGVkCithZGR4MTM5IGFkZCAnMEUtMTInIDEgICAgICAgIC0+ICAnMS4wMDAwMDAwMCcgIFJvdW5kZWQKK2FkZHgxNDAgYWRkICcwRS0xMicgLTEgICAgICAgLT4gICctMS4wMDAwMDAwMCcgUm91bmRlZAorYWRkeDE0MSBhZGQgMUUrNCAgICAwLjAwMDAgICAtPiAgJzEwMDAwLjAwMDAnCithZGR4MTQyIGFkZCAxRSs0ICAgIDAuMDAwMDAgIC0+ICAnMTAwMDAuMDAwMCcgIFJvdW5kZWQKK2FkZHgxNDMgYWRkIDAuMDAwICAgMUUrNSAgICAgLT4gICcxMDAwMDAuMDAwJworYWRkeDE0NCBhZGQgMC4wMDAwICAxRSs1ICAgICAtPiAgJzEwMDAwMC4wMDAnICBSb3VuZGVkCisKKy0tIFtzb21lIG9mIHRoZSBuZXh0IGdyb3VwIGFyZSByZWFsbHkgY29uc3RydWN0b3IgdGVzdHNdCithZGR4MTQ2IGFkZCAnMDAuMCcgIDAgICAgICAgLT4gICcwLjAnCithZGR4MTQ3IGFkZCAnMC4wMCcgIDAgICAgICAgLT4gICcwLjAwJworYWRkeDE0OCBhZGQgIDAgICAgICAnMC4wMCcgIC0+ICAnMC4wMCcKK2FkZHgxNDkgYWRkICAwICAgICAgJzAwLjAnICAtPiAgJzAuMCcKK2FkZHgxNTAgYWRkICcwMC4wJyAgJzAuMDAnICAtPiAgJzAuMDAnCithZGR4MTUxIGFkZCAnMC4wMCcgICcwMC4wJyAgLT4gICcwLjAwJworYWRkeDE1MiBhZGQgJzMnICAgICAnLjMnICAgIC0+ICAnMy4zJworYWRkeDE1MyBhZGQgJzMuJyAgICAnLjMnICAgIC0+ICAnMy4zJworYWRkeDE1NCBhZGQgJzMuMCcgICAnLjMnICAgIC0+ICAnMy4zJworYWRkeDE1NSBhZGQgJzMuMDAnICAnLjMnICAgIC0+ICAnMy4zMCcKK2FkZHgxNTYgYWRkICczJyAgICAgJzMnICAgICAtPiAgJzYnCithZGR4MTU3IGFkZCAnMycgICAgICcrMycgICAgLT4gICc2JworYWRkeDE1OCBhZGQgJzMnICAgICAnLTMnICAgIC0+ICAnMCcKK2FkZHgxNTkgYWRkICcwLjMnICAgJy0wLjMnICAtPiAgJzAuMCcKK2FkZHgxNjAgYWRkICcwLjAzJyAgJy0wLjAzJyAtPiAgJzAuMDAnCisKKy0tIHRyeSBib3JkZXJsaW5lIHByZWNpc2lvbiwgd2l0aCBjYXJyaWVzLCBldGMuCitwcmVjaXNpb246IDE1CithZGR4MTYxIGFkZCAnMUUrMTInICctMScgICAgLT4gJzk5OTk5OTk5OTk5OScKK2FkZHgxNjIgYWRkICcxRSsxMicgICcxLjExJyAtPiAnMTAwMDAwMDAwMDAwMS4xMScKK2FkZHgxNjMgYWRkICcxLjExJyAgJzFFKzEyJyAtPiAnMTAwMDAwMDAwMDAwMS4xMScKK2FkZHgxNjQgYWRkICctMScgICAgJzFFKzEyJyAtPiAnOTk5OTk5OTk5OTk5JworYWRkeDE2NSBhZGQgJzdFKzEyJyAnLTEnICAgIC0+ICc2OTk5OTk5OTk5OTk5JworYWRkeDE2NiBhZGQgJzdFKzEyJyAgJzEuMTEnIC0+ICc3MDAwMDAwMDAwMDAxLjExJworYWRkeDE2NyBhZGQgJzEuMTEnICAnN0UrMTInIC0+ICc3MDAwMDAwMDAwMDAxLjExJworYWRkeDE2OCBhZGQgJy0xJyAgICAnN0UrMTInIC0+ICc2OTk5OTk5OTk5OTk5JworCistLSAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDUgICAgICAxMjM0NTY3ODkwMTIzNDUgICAgICAxIDIzNDU2Nzg5MDEyMzQ1CithZGR4MTcwIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NjMnIC0+ICcxLjAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxNzEgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU2MicgLT4gJzEuMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorYWRkeDE3MiBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTYxJyAtPiAnMS4wMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCithZGR4MTczIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NjAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxNzQgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1OScgLT4gJzEuMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorYWRkeDE3NSBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU4JyAtPiAnMS4wMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4MTc2IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTcnIC0+ICcxLjAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxNzcgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NicgLT4gJzEuMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2FkZHgxNzggYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NScgLT4gJzAuOTk5OTk5OTk5OTk5OTk5JworYWRkeDE3OSBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU0JyAtPiAnMC45OTk5OTk5OTk5OTk5OTgnCithZGR4MTgwIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTMnIC0+ICcwLjk5OTk5OTk5OTk5OTk5NycKK2FkZHgxODEgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1MicgLT4gJzAuOTk5OTk5OTk5OTk5OTk2JworYWRkeDE4MiBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTUxJyAtPiAnMC45OTk5OTk5OTk5OTk5OTUnCithZGR4MTgzIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTAnIC0+ICcwLjk5OTk5OTk5OTk5OTk5NCcKKworLS0gYW5kIHNvbWUgbW9yZSwgaW5jbHVkaW5nIHJlc2lkdWUgZWZmZWN0cyBhbmQgZGlmZmVyZW50IHJvdW5kaW5ncworcHJlY2lzaW9uOiA5Cityb3VuZGluZzogaGFsZl91cAorYWRkeDIwMCBhZGQgJzEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JworYWRkeDIwMSBhZGQgJzEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMDIgYWRkICcxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjAzIGFkZCAnMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDIwNCBhZGQgJzEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMDUgYWRkICcxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjA2IGFkZCAnMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDIwNyBhZGQgJzEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMDggYWRkICcxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjA5IGFkZCAnMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIxMCBhZGQgJzEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMTEgYWRkICcxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjEyIGFkZCAnMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIxMyBhZGQgJzEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMTQgYWRkICcxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjE1IGFkZCAnMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIxNiBhZGQgJzEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzNDU2NzkwJworYWRkeDIxNyBhZGQgJzEyMzQ1Njc4OScgMS4wMDAwMDAwMDEgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMTggYWRkICcxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjE5IGFkZCAnMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCithZGR4MjIwIGFkZCAnMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjM0NTY3ODknCithZGR4MjIxIGFkZCAnMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDIyMiBhZGQgJzEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMjMgYWRkICcxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjI0IGFkZCAnMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDIyNSBhZGQgJzEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMjYgYWRkICcxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjI3IGFkZCAnMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDIyOCBhZGQgJzEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMjkgYWRkICcxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjMwIGFkZCAnMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIzMSBhZGQgJzEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMzIgYWRkICcxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjMzIGFkZCAnMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIzNCBhZGQgJzEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMzUgYWRkICcxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjM2IGFkZCAnMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnCithZGR4MjM3IGFkZCAnMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIzOCBhZGQgJzEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMzkgYWRkICcxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorYWRkeDI0MCBhZGQgJzEyMzQ1Njc4OCcgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNDEgYWRkICcxMjM0NTY3ODgnIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjQyIGFkZCAnMTIzNDU2Nzg4JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorYWRkeDI1MCBhZGQgJzEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JworYWRkeDI1MSBhZGQgJzEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNTIgYWRkICcxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjUzIGFkZCAnMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDI1NCBhZGQgJzEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNTUgYWRkICcxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjU2IGFkZCAnMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDI1NyBhZGQgJzEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNTggYWRkICcxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjU5IGFkZCAnMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDI2MCBhZGQgJzEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNjEgYWRkICcxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjYyIGFkZCAnMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDI2MyBhZGQgJzEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNjQgYWRkICcxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjY1IGFkZCAnMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDI2NiBhZGQgJzEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzNDU2NzkwJworYWRkeDI2NyBhZGQgJzEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNjggYWRkICcxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjY5IGFkZCAnMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCistLSBpbnB1dCBwcmVwYXJhdGlvbiB0ZXN0cyAob3BlcmFuZHMgc2hvdWxkIG5vdCBiZSByb3VuZGVkKQorcHJlY2lzaW9uOiAzCityb3VuZGluZzogaGFsZl91cAorCithZGR4MjcwIGFkZCAnMTIzNDU2Nzg5MDAwMDAnICA5OTk5OTk5OTk5OTk5IC0+ICAnMi4yM0UrMTMnIEluZXhhY3QgUm91bmRlZAorYWRkeDI3MSBhZGQgICc5OTk5OTk5OTk5OTk5JyAxMjM0NTY3ODkwMDAwMCAtPiAgJzIuMjNFKzEzJyBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDI3MiBhZGQgJzEyRSszJyAgJzM0NDQnICAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNzMgYWRkICcxMkUrMycgICczNDQ2JyAgIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCithZGR4Mjc0IGFkZCAnMTJFKzMnICAnMzQ0OS45JyAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorYWRkeDI3NSBhZGQgJzEyRSszJyAgJzM0NTAuMCcgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNzYgYWRkICcxMkUrMycgICczNDUwLjEnIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCithZGR4Mjc3IGFkZCAnMTJFKzMnICAnMzQ1NCcgICAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorYWRkeDI3OCBhZGQgJzEyRSszJyAgJzM0NTYnICAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDI4MSBhZGQgJzM0NDQnICAgJzEyRSszJyAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyODIgYWRkICczNDQ2JyAgICcxMkUrMycgIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjgzIGFkZCAnMzQ0OS45JyAnMTJFKzMnICAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorYWRkeDI4NCBhZGQgJzM0NTAuMCcgJzEyRSszJyAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyODUgYWRkICczNDUwLjEnICcxMkUrMycgIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCithZGR4Mjg2IGFkZCAnMzQ1NCcgICAnMTJFKzMnICAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorYWRkeDI4NyBhZGQgJzM0NTYnICAgJzEyRSszJyAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZG93bgorYWRkeDI5MSBhZGQgJzM0NDQnICAgJzEyRSszJyAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyOTIgYWRkICczNDQ2JyAgICcxMkUrMycgIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjkzIGFkZCAnMzQ0OS45JyAnMTJFKzMnICAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorYWRkeDI5NCBhZGQgJzM0NTAuMCcgJzEyRSszJyAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyOTUgYWRkICczNDUwLjEnICcxMkUrMycgIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCithZGR4Mjk2IGFkZCAnMzQ1NCcgICAnMTJFKzMnICAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorYWRkeDI5NyBhZGQgJzM0NTYnICAgJzEyRSszJyAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKKworLS0gMSBpbiBsYXN0IHBsYWNlIHRlc3RzCityb3VuZGluZzogaGFsZl91cAorYWRkeDMwMSBhZGQgIC0xICAgMSAgICAgIC0+ICAgMAorYWRkeDMwMiBhZGQgICAwICAgMSAgICAgIC0+ICAgMQorYWRkeDMwMyBhZGQgICAxICAgMSAgICAgIC0+ICAgMgorYWRkeDMwNCBhZGQgIDEyICAgMSAgICAgIC0+ICAxMworYWRkeDMwNSBhZGQgIDk4ICAgMSAgICAgIC0+ICA5OQorYWRkeDMwNiBhZGQgIDk5ICAgMSAgICAgIC0+IDEwMAorYWRkeDMwNyBhZGQgMTAwICAgMSAgICAgIC0+IDEwMQorYWRkeDMwOCBhZGQgMTAxICAgMSAgICAgIC0+IDEwMgorYWRkeDMwOSBhZGQgIC0xICAtMSAgICAgIC0+ICAtMgorYWRkeDMxMCBhZGQgICAwICAtMSAgICAgIC0+ICAtMQorYWRkeDMxMSBhZGQgICAxICAtMSAgICAgIC0+ICAgMAorYWRkeDMxMiBhZGQgIDEyICAtMSAgICAgIC0+ICAxMQorYWRkeDMxMyBhZGQgIDk4ICAtMSAgICAgIC0+ICA5NworYWRkeDMxNCBhZGQgIDk5ICAtMSAgICAgIC0+ICA5OAorYWRkeDMxNSBhZGQgMTAwICAtMSAgICAgIC0+ICA5OQorYWRkeDMxNiBhZGQgMTAxICAtMSAgICAgIC0+IDEwMAorCithZGR4MzIxIGFkZCAtMC4wMSAgMC4wMSAgICAtPiAgMC4wMAorYWRkeDMyMiBhZGQgIDAuMDAgIDAuMDEgICAgLT4gIDAuMDEKK2FkZHgzMjMgYWRkICAwLjAxICAwLjAxICAgIC0+ICAwLjAyCithZGR4MzI0IGFkZCAgMC4xMiAgMC4wMSAgICAtPiAgMC4xMworYWRkeDMyNSBhZGQgIDAuOTggIDAuMDEgICAgLT4gIDAuOTkKK2FkZHgzMjYgYWRkICAwLjk5ICAwLjAxICAgIC0+ICAxLjAwCithZGR4MzI3IGFkZCAgMS4wMCAgMC4wMSAgICAtPiAgMS4wMQorYWRkeDMyOCBhZGQgIDEuMDEgIDAuMDEgICAgLT4gIDEuMDIKK2FkZHgzMjkgYWRkIC0wLjAxIC0wLjAxICAgIC0+IC0wLjAyCithZGR4MzMwIGFkZCAgMC4wMCAtMC4wMSAgICAtPiAtMC4wMQorYWRkeDMzMSBhZGQgIDAuMDEgLTAuMDEgICAgLT4gIDAuMDAKK2FkZHgzMzIgYWRkICAwLjEyIC0wLjAxICAgIC0+ICAwLjExCithZGR4MzMzIGFkZCAgMC45OCAtMC4wMSAgICAtPiAgMC45NworYWRkeDMzNCBhZGQgIDAuOTkgLTAuMDEgICAgLT4gIDAuOTgKK2FkZHgzMzUgYWRkICAxLjAwIC0wLjAxICAgIC0+ICAwLjk5CithZGR4MzM2IGFkZCAgMS4wMSAtMC4wMSAgICAtPiAgMS4wMAorCistLSBzb21lIG1vcmUgY2FzZXMgd2hlcmUgYWRkaW5nIDAgYWZmZWN0cyB0aGUgY29lZmZpY2llbnQKK3ByZWNpc2lvbjogOQorYWRkeDM0MCBhZGQgMUUrMyAgICAwICAgIC0+ICAgICAgICAgMTAwMAorYWRkeDM0MSBhZGQgMUUrOCAgICAwICAgIC0+ICAgIDEwMDAwMDAwMAorYWRkeDM0MiBhZGQgMUUrOSAgICAwICAgIC0+ICAgMS4wMDAwMDAwMEUrOSAgIFJvdW5kZWQKK2FkZHgzNDMgYWRkIDFFKzEwICAgMCAgICAtPiAgIDEuMDAwMDAwMDBFKzEwICBSb3VuZGVkCistLSB3aGljaCBzaW1wbHkgZm9sbG93IGZyb20gdGhlc2UgY2FzZXMgLi4uCithZGR4MzQ0IGFkZCAxRSszICAgIDEgICAgLT4gICAgICAgICAxMDAxCithZGR4MzQ1IGFkZCAxRSs4ICAgIDEgICAgLT4gICAgMTAwMDAwMDAxCithZGR4MzQ2IGFkZCAxRSs5ICAgIDEgICAgLT4gICAxLjAwMDAwMDAwRSs5ICAgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ3IGFkZCAxRSsxMCAgIDEgICAgLT4gICAxLjAwMDAwMDAwRSsxMCAgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ4IGFkZCAxRSszICAgIDcgICAgLT4gICAgICAgICAxMDA3CithZGR4MzQ5IGFkZCAxRSs4ICAgIDcgICAgLT4gICAgMTAwMDAwMDA3CithZGR4MzUwIGFkZCAxRSs5ICAgIDcgICAgLT4gICAxLjAwMDAwMDAxRSs5ICAgSW5leGFjdCBSb3VuZGVkCithZGR4MzUxIGFkZCAxRSsxMCAgIDcgICAgLT4gICAxLjAwMDAwMDAwRSsxMCAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRyeXplcm9zIGNhc2VzCitwcmVjaXNpb246ICAgNworcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5MgorbWluZXhwb25lbnQ6IC05MgorYWRkeDM2MSAgYWRkIDBFKzUwIDEwMDAwRSsxICAtPiAxLjAwMDBFKzUKK2FkZHgzNjIgIGFkZCAxMDAwMEUrMSAwRS01MCAgLT4gMTAwMDAwLjAgIFJvdW5kZWQKK2FkZHgzNjMgIGFkZCAxMDAwMEUrMSAxMDAwMEUtNTAgIC0+IDEwMDAwMC4wICBSb3VuZGVkIEluZXhhY3QKK2FkZHgzNjQgIGFkZCA5Ljk5OTk5OUUrOTIgLTkuOTk5OTk5RSs5MiAtPiAwRSs4NgorCistLSBhIGN1cmlvc2l0eSBmcm9tIEpTUiAxMyB0ZXN0aW5nCityb3VuZGluZzogICAgaGFsZl9kb3duCitwcmVjaXNpb246ICAgMTAKK2FkZHgzNzAgYWRkIDk5OTk5OTk5IDgxNTEyIC0+IDEwMDA4MTUxMQorcHJlY2lzaW9uOiAgICAgIDYKK2FkZHgzNzEgYWRkIDk5OTk5OTk5IDgxNTEyIC0+IDEuMDAwODJFKzggUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogICAgaGFsZl91cAorcHJlY2lzaW9uOiAgIDEwCithZGR4MzcyIGFkZCA5OTk5OTk5OSA4MTUxMiAtPiAxMDAwODE1MTEKK3ByZWNpc2lvbjogICAgICA2CithZGR4MzczIGFkZCA5OTk5OTk5OSA4MTUxMiAtPiAxLjAwMDgyRSs4IFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorcHJlY2lzaW9uOiAgIDEwCithZGR4Mzc0IGFkZCA5OTk5OTk5OSA4MTUxMiAtPiAxMDAwODE1MTEKK3ByZWNpc2lvbjogICAgICA2CithZGR4Mzc1IGFkZCA5OTk5OTk5OSA4MTUxMiAtPiAxLjAwMDgyRSs4IFJvdW5kZWQgSW5leGFjdAorCistLSB1bHAgcmVwbGFjZW1lbnQgdGVzdHMKK3ByZWNpc2lvbjogOQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK2FkZHg0MDAgYWRkICAgMSAgIDc3ZS03ICAgICAgIC0+ICAxLjAwMDAwNzcKK2FkZHg0MDEgYWRkICAgMSAgIDc3ZS04ICAgICAgIC0+ICAxLjAwMDAwMDc3CithZGR4NDAyIGFkZCAgIDEgICA3N2UtOSAgICAgICAtPiAgMS4wMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MDMgYWRkICAgMSAgIDc3ZS0xMCAgICAgIC0+ICAxLjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDQwNCBhZGQgICAxICAgNzdlLTExICAgICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDA1IGFkZCAgIDEgICA3N2UtMTIgICAgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MDYgYWRkICAgMSAgIDc3ZS05OTkgICAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQwNyBhZGQgICAxICAgNzdlLTk5OTk5OTkgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg0MTAgYWRkICAxMCAgIDc3ZS03ICAgICAgIC0+ICAxMC4wMDAwMDc3CithZGR4NDExIGFkZCAgMTAgICA3N2UtOCAgICAgICAtPiAgMTAuMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MTIgYWRkICAxMCAgIDc3ZS05ICAgICAgIC0+ICAxMC4wMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDQxMyBhZGQgIDEwICAgNzdlLTEwICAgICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDE0IGFkZCAgMTAgICA3N2UtMTEgICAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MTUgYWRkICAxMCAgIDc3ZS0xMiAgICAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQxNiBhZGQgIDEwICAgNzdlLTk5OSAgICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDE3IGFkZCAgMTAgICA3N2UtOTk5OTk5OSAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDQyMCBhZGQgIDc3ZS03ICAgICAgICAxICAgLT4gIDEuMDAwMDA3NworYWRkeDQyMSBhZGQgIDc3ZS04ICAgICAgICAxICAgLT4gIDEuMDAwMDAwNzcKK2FkZHg0MjIgYWRkICA3N2UtOSAgICAgICAgMSAgIC0+ICAxLjAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorYWRkeDQyMyBhZGQgIDc3ZS0xMCAgICAgICAxICAgLT4gIDEuMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NDI0IGFkZCAgNzdlLTExICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MjUgYWRkICA3N2UtMTIgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQyNiBhZGQgIDc3ZS05OTkgICAgICAxICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDI3IGFkZCAgNzdlLTk5OTk5OTkgIDEgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDQzMCBhZGQgIDc3ZS03ICAgICAgIDEwICAgLT4gIDEwLjAwMDAwNzcKK2FkZHg0MzEgYWRkICA3N2UtOCAgICAgICAxMCAgIC0+ICAxMC4wMDAwMDA4IEluZXhhY3QgUm91bmRlZAorYWRkeDQzMiBhZGQgIDc3ZS05ICAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NDMzIGFkZCAgNzdlLTEwICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MzQgYWRkICA3N2UtMTEgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQzNSBhZGQgIDc3ZS0xMiAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDM2IGFkZCAgNzdlLTk5OSAgICAgMTAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MzcgYWRkICA3N2UtOTk5OTk5OSAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBuZWdhdGl2ZSB1bHBzCithZGR4NDQwIGFkZCAgIDEgICAtNzdlLTcgICAgICAgLT4gIDAuOTk5OTkyMworYWRkeDQ0MSBhZGQgICAxICAgLTc3ZS04ICAgICAgIC0+ICAwLjk5OTk5OTIzCithZGR4NDQyIGFkZCAgIDEgICAtNzdlLTkgICAgICAgLT4gIDAuOTk5OTk5OTIzCithZGR4NDQzIGFkZCAgIDEgICAtNzdlLTEwICAgICAgLT4gIDAuOTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorYWRkeDQ0NCBhZGQgICAxICAgLTc3ZS0xMSAgICAgIC0+ICAwLjk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0NDUgYWRkICAgMSAgIC03N2UtMTIgICAgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0NDYgYWRkICAgMSAgIC03N2UtOTk5ICAgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0NDcgYWRkICAgMSAgIC03N2UtOTk5OTk5OSAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDQ1MCBhZGQgIDEwICAgLTc3ZS03ICAgICAgIC0+ICAgOS45OTk5OTIzCithZGR4NDUxIGFkZCAgMTAgICAtNzdlLTggICAgICAgLT4gICA5Ljk5OTk5OTIzCithZGR4NDUyIGFkZCAgMTAgICAtNzdlLTkgICAgICAgLT4gICA5Ljk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorYWRkeDQ1MyBhZGQgIDEwICAgLTc3ZS0xMCAgICAgIC0+ICAgOS45OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0NTQgYWRkICAxMCAgIC03N2UtMTEgICAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0NTUgYWRkICAxMCAgIC03N2UtMTIgICAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0NTYgYWRkICAxMCAgIC03N2UtOTk5ICAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0NTcgYWRkICAxMCAgIC03N2UtOTk5OTk5OSAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDQ2MCBhZGQgIC03N2UtNyAgICAgICAgMSAgIC0+ICAwLjk5OTk5MjMKK2FkZHg0NjEgYWRkICAtNzdlLTggICAgICAgIDEgICAtPiAgMC45OTk5OTkyMworYWRkeDQ2MiBhZGQgIC03N2UtOSAgICAgICAgMSAgIC0+ICAwLjk5OTk5OTkyMworYWRkeDQ2MyBhZGQgIC03N2UtMTAgICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0NjQgYWRkICAtNzdlLTExICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NDY1IGFkZCAgLTc3ZS0xMiAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDY2IGFkZCAgLTc3ZS05OTkgICAgICAxICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDY3IGFkZCAgLTc3ZS05OTk5OTk5ICAxICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg0NzAgYWRkICAtNzdlLTcgICAgICAgMTAgICAtPiAgIDkuOTk5OTkyMworYWRkeDQ3MSBhZGQgIC03N2UtOCAgICAgICAxMCAgIC0+ICAgOS45OTk5OTkyMworYWRkeDQ3MiBhZGQgIC03N2UtOSAgICAgICAxMCAgIC0+ICAgOS45OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0NzMgYWRkICAtNzdlLTEwICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NDc0IGFkZCAgLTc3ZS0xMSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDc1IGFkZCAgLTc3ZS0xMiAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDc2IGFkZCAgLTc3ZS05OTkgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDc3IGFkZCAgLTc3ZS05OTk5OTk5IDEwICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlIHVscHMKK2FkZHg0ODAgYWRkICAtMSAgICA3N2UtNyAgICAgICAtPiAgLTAuOTk5OTkyMworYWRkeDQ4MSBhZGQgIC0xICAgIDc3ZS04ICAgICAgIC0+ICAtMC45OTk5OTkyMworYWRkeDQ4MiBhZGQgIC0xICAgIDc3ZS05ICAgICAgIC0+ICAtMC45OTk5OTk5MjMKK2FkZHg0ODMgYWRkICAtMSAgICA3N2UtMTAgICAgICAtPiAgLTAuOTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorYWRkeDQ4NCBhZGQgIC0xICAgIDc3ZS0xMSAgICAgIC0+ICAtMC45OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NDg1IGFkZCAgLTEgICAgNzdlLTEyICAgICAgLT4gIC0xLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQ4NiBhZGQgIC0xICAgIDc3ZS05OTkgICAgIC0+ICAtMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0ODcgYWRkICAtMSAgICA3N2UtOTk5OTk5OSAtPiAgLTEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg0OTAgYWRkIC0xMCAgICA3N2UtNyAgICAgICAtPiAgIC05Ljk5OTk5MjMKK2FkZHg0OTEgYWRkIC0xMCAgICA3N2UtOCAgICAgICAtPiAgIC05Ljk5OTk5OTIzCithZGR4NDkyIGFkZCAtMTAgICAgNzdlLTkgICAgICAgLT4gICAtOS45OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0OTMgYWRkIC0xMCAgICA3N2UtMTAgICAgICAtPiAgIC05Ljk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorYWRkeDQ5NCBhZGQgLTEwICAgIDc3ZS0xMSAgICAgIC0+ICAtMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0OTUgYWRkIC0xMCAgICA3N2UtMTIgICAgICAtPiAgLTEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDk2IGFkZCAtMTAgICAgNzdlLTk5OSAgICAgLT4gIC0xMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQ5NyBhZGQgLTEwICAgIDc3ZS05OTk5OTk5IC0+ICAtMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDUwMCBhZGQgICA3N2UtNyAgICAgICAtMSAgIC0+ICAtMC45OTk5OTIzCithZGR4NTAxIGFkZCAgIDc3ZS04ICAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTIzCithZGR4NTAyIGFkZCAgIDc3ZS05ICAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTkyMworYWRkeDUwMyBhZGQgICA3N2UtMTAgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCithZGR4NTA0IGFkZCAgIDc3ZS0xMSAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg1MDUgYWRkICAgNzdlLTEyICAgICAgLTEgICAtPiAgLTEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NTA2IGFkZCAgIDc3ZS05OTkgICAgIC0xICAgLT4gIC0xLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDUwNyBhZGQgICA3N2UtOTk5OTk5OSAtMSAgIC0+ICAtMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDUxMCBhZGQgICA3N2UtNyAgICAgICAtMTAgIC0+ICAgLTkuOTk5OTkyMworYWRkeDUxMSBhZGQgICA3N2UtOCAgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5MjMKK2FkZHg1MTIgYWRkICAgNzdlLTkgICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorYWRkeDUxMyBhZGQgICA3N2UtMTAgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NTE0IGFkZCAgIDc3ZS0xMSAgICAgIC0xMCAgLT4gIC0xMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDUxNSBhZGQgICA3N2UtMTIgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg1MTYgYWRkICAgNzdlLTk5OSAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NTE3IGFkZCAgIDc3ZS05OTk5OTk5IC0xMCAgLT4gIC0xMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCisKKy0tIGxvbmcgb3BlcmFuZHMKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK2FkZHg1MjEgYWRkIDEyMzQ1Njc4MDAwIDAgLT4gMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorYWRkeDUyMiBhZGQgMCAxMjM0NTY3ODAwMCAtPiAxLjIzNDU2NzgwRSsxMCBSb3VuZGVkCithZGR4NTIzIGFkZCAxMjM0NTY3ODAwICAwIC0+IDEuMjM0NTY3ODBFKzkgUm91bmRlZAorYWRkeDUyNCBhZGQgMCAxMjM0NTY3ODAwICAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK2FkZHg1MjUgYWRkIDEyMzQ1Njc4OTAgIDAgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCithZGR4NTI2IGFkZCAwIDEyMzQ1Njc4OTAgIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorYWRkeDUyNyBhZGQgMTIzNDU2Nzg5MSAgMCAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorYWRkeDUyOCBhZGQgMCAxMjM0NTY3ODkxICAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorYWRkeDUyOSBhZGQgMTIzNDU2Nzg5MDEgMCAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg1MzAgYWRkIDAgMTIzNDU2Nzg5MDEgLT4gMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCithZGR4NTMxIGFkZCAxMjM0NTY3ODk2ICAwIC0+IDEuMjM0NTY3OTBFKzkgSW5leGFjdCBSb3VuZGVkCithZGR4NTMyIGFkZCAwIDEyMzQ1Njc4OTYgIC0+IDEuMjM0NTY3OTBFKzkgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMTUKKy0tIHN0aWxsIGNoZWNraW5nCithZGR4NTQxIGFkZCAxMjM0NTY3ODAwMCAwIC0+IDEyMzQ1Njc4MDAwCithZGR4NTQyIGFkZCAwIDEyMzQ1Njc4MDAwIC0+IDEyMzQ1Njc4MDAwCithZGR4NTQzIGFkZCAxMjM0NTY3ODAwICAwIC0+IDEyMzQ1Njc4MDAKK2FkZHg1NDQgYWRkIDAgMTIzNDU2NzgwMCAgLT4gMTIzNDU2NzgwMAorYWRkeDU0NSBhZGQgMTIzNDU2Nzg5MCAgMCAtPiAxMjM0NTY3ODkwCithZGR4NTQ2IGFkZCAwIDEyMzQ1Njc4OTAgIC0+IDEyMzQ1Njc4OTAKK2FkZHg1NDcgYWRkIDEyMzQ1Njc4OTEgIDAgLT4gMTIzNDU2Nzg5MQorYWRkeDU0OCBhZGQgMCAxMjM0NTY3ODkxICAtPiAxMjM0NTY3ODkxCithZGR4NTQ5IGFkZCAxMjM0NTY3ODkwMSAwIC0+IDEyMzQ1Njc4OTAxCithZGR4NTUwIGFkZCAwIDEyMzQ1Njc4OTAxIC0+IDEyMzQ1Njc4OTAxCithZGR4NTUxIGFkZCAxMjM0NTY3ODk2ICAwIC0+IDEyMzQ1Njc4OTYKK2FkZHg1NTIgYWRkIDAgMTIzNDU2Nzg5NiAgLT4gMTIzNDU2Nzg5NgorCistLSB2ZXJpZnkgYSBxdWVyeQorcHJlY2lzaW9uOiAgICAxNgorbWF4RXhwb25lbnQ6ICszOTQKK21pbkV4cG9uZW50OiAtMzkzCityb3VuZGluZzogICAgIGRvd24KK2FkZHg1NjEgYWRkIDFlLTM5OCA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszODQgSW5leGFjdCBSb3VuZGVkCithZGR4NTYyIGFkZCAgICAgIDAgOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IFJvdW5kZWQKKy0tIGFuZCB1c2luZyBkZWNpbWFsNjQgYm91bmRzIChzZWUgYWxzbyBkZGFkZC5kZWNUZXN0KQorcHJlY2lzaW9uOiAgICAxNgorbWF4RXhwb25lbnQ6ICszODQKK21pbkV4cG9uZW50OiAtMzgzCityb3VuZGluZzogICAgIGRvd24KK2FkZHg1NjMgYWRkIDFlLTM4OCA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgSW5leGFjdCBSb3VuZGVkCithZGR4NTY0IGFkZCAgICAgIDAgOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IFJvdW5kZWQKKworCistLSBzb21lIG1vcmUgcmVzaWR1ZSBlZmZlY3RzIHdpdGggZXh0cmVtZSByb3VuZGluZworcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiBoYWxmX3VwCithZGR4NjAxIGFkZCAxMjM0NTY3ODkgIDAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2FkZHg2MDIgYWRkIDEyMzQ1Njc4OSAgMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZG93bgorYWRkeDYwMyBhZGQgMTIzNDU2Nzg5ICAwLjAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZmxvb3IKK2FkZHg2MDQgYWRkIDEyMzQ1Njc4OSAgMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGNlaWxpbmcKK2FkZHg2MDUgYWRkIDEyMzQ1Njc4OSAgMC4wMDAwMDEgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IHVwCithZGR4NjA2IGFkZCAxMjM0NTY3ODkgIDAuMDAwMDAxIC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBkb3duCithZGR4NjA3IGFkZCAxMjM0NTY3ODkgIDAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK2FkZHg2MTEgYWRkIDEyMzQ1Njc4OSAtMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZXZlbgorYWRkeDYxMiBhZGQgMTIzNDU2Nzg5IC0wLjAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9kb3duCithZGR4NjEzIGFkZCAxMjM0NTY3ODkgLTAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBmbG9vcgorYWRkeDYxNCBhZGQgMTIzNDU2Nzg5IC0wLjAwMDAwMSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogY2VpbGluZworYWRkeDYxNSBhZGQgMTIzNDU2Nzg5IC0wLjAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogdXAKK2FkZHg2MTYgYWRkIDEyMzQ1Njc4OSAtMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGRvd24KK2FkZHg2MTcgYWRkIDEyMzQ1Njc4OSAtMC4wMDAwMDEgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorYWRkeDYyMSBhZGQgMTIzNDU2Nzg5ICAwLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9ldmVuCithZGR4NjIyIGFkZCAxMjM0NTY3ODkgIDAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK2FkZHg2MjMgYWRkIDEyMzQ1Njc4OSAgMC40OTk5OTkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGZsb29yCithZGR4NjI0IGFkZCAxMjM0NTY3ODkgIDAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBjZWlsaW5nCithZGR4NjI1IGFkZCAxMjM0NTY3ODkgIDAuNDk5OTk5IC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiB1cAorYWRkeDYyNiBhZGQgMTIzNDU2Nzg5ICAwLjQ5OTk5OSAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZG93bgorYWRkeDYyNyBhZGQgMTIzNDU2Nzg5ICAwLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX3VwCithZGR4NjMxIGFkZCAxMjM0NTY3ODkgLTAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2FkZHg2MzIgYWRkIDEyMzQ1Njc4OSAtMC40OTk5OTkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZG93bgorYWRkeDYzMyBhZGQgMTIzNDU2Nzg5IC0wLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZmxvb3IKK2FkZHg2MzQgYWRkIDEyMzQ1Njc4OSAtMC40OTk5OTkgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGNlaWxpbmcKK2FkZHg2MzUgYWRkIDEyMzQ1Njc4OSAtMC40OTk5OTkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IHVwCithZGR4NjM2IGFkZCAxMjM0NTY3ODkgLTAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBkb3duCithZGR4NjM3IGFkZCAxMjM0NTY3ODkgLTAuNDk5OTk5IC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK2FkZHg2NDEgYWRkIDEyMzQ1Njc4OSAgMC41MDAwMDEgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZXZlbgorYWRkeDY0MiBhZGQgMTIzNDU2Nzg5ICAwLjUwMDAwMSAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9kb3duCithZGR4NjQzIGFkZCAxMjM0NTY3ODkgIDAuNTAwMDAxIC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBmbG9vcgorYWRkeDY0NCBhZGQgMTIzNDU2Nzg5ICAwLjUwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogY2VpbGluZworYWRkeDY0NSBhZGQgMTIzNDU2Nzg5ICAwLjUwMDAwMSAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogdXAKK2FkZHg2NDYgYWRkIDEyMzQ1Njc4OSAgMC41MDAwMDEgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGRvd24KK2FkZHg2NDcgYWRkIDEyMzQ1Njc4OSAgMC41MDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorYWRkeDY1MSBhZGQgMTIzNDU2Nzg5IC0wLjUwMDAwMSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9ldmVuCithZGR4NjUyIGFkZCAxMjM0NTY3ODkgLTAuNTAwMDAxIC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK2FkZHg2NTMgYWRkIDEyMzQ1Njc4OSAtMC41MDAwMDEgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGZsb29yCithZGR4NjU0IGFkZCAxMjM0NTY3ODkgLTAuNTAwMDAxIC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBjZWlsaW5nCithZGR4NjU1IGFkZCAxMjM0NTY3ODkgLTAuNTAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiB1cAorYWRkeDY1NiBhZGQgMTIzNDU2Nzg5IC0wLjUwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZG93bgorYWRkeDY1NyBhZGQgMTIzNDU2Nzg5IC0wLjUwMDAwMSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCisKKy0tIGxvbmcgb3BlcmFuZCB0cmlhbmdsZQorcm91bmRpbmc6IGhhbGZfdXAKK3ByZWNpc2lvbjogIDM3CithZGR4NjYwIGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMTQ4MzQ1MzgKK3ByZWNpc2lvbjogIDM2CithZGR4NjYxIGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMTQ4MzQ1NCAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAzNQorYWRkeDY2MiBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTE0ODM0NSAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMzQKK2FkZHg2NjMgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMzNzExNDgzNSAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDMzCithZGR4NjY0IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMTQ4MyAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAzMgorYWRkeDY2NSBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTE0OCAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMzEKK2FkZHg2NjYgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMzNzExNSAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDMwCithZGR4NjY3IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMSAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyOQorYWRkeDY2OCBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjgKK2FkZHg2NjkgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMzNyAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDI3CithZGR4NjcwIGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzNCAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyNgorYWRkeDY3MSBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMyAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjUKK2FkZHg2NzIgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMiAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDI0CithZGR4NjczIGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MiAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyMworYWRkeDY3NCBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OSAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjIKK2FkZHg2NzUgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzOSAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDIxCithZGR4Njc2IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2NCAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyMAorYWRkeDY3NyBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNiAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTkKK2FkZHg2NzggYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyNCAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDE4CithZGR4Njc5IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMiAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxNworYWRkeDY4MCBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMCAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTYKK2FkZHg2ODEgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMSAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDE1CithZGR4NjgyIGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMSAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxNAorYWRkeDY4MyBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMiAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTMKK2FkZHg2ODQgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MiAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDEyCithZGR4Njg1IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNCAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxMQorYWRkeDY4NiBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTAKK2FkZHg2ODcgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg0NzExNzQxN0UrMTAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA5CithZGR4Njg4IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOS44NDcxMTc0MkUrMTAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgOAorYWRkeDY4OSBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDkuODQ3MTE3NEUrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDcKK2FkZHg2OTAgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg0NzExN0UrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDYKK2FkZHg2OTEgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg0NzEyRSsxMCAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgNQorYWRkeDY5MiBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDkuODQ3MUUrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDQKK2FkZHg2OTMgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg0N0UrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDMKK2FkZHg2OTQgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg1RSsxMCAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMgorYWRkeDY5NSBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDkuOEUrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDEKK2FkZHg2OTYgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiAxRSsxMSAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG1vcmUgemVyb3MsIGV0Yy4KK3JvdW5kaW5nOiBoYWxmX3VwCitwcmVjaXNpb246ICAgOQorCithZGR4NzAxIGFkZCA1LjAwIDEuMDBFLTMgLT4gNS4wMDEwMAorYWRkeDcwMiBhZGQgMDAuMDAgMC4wMDAgIC0+IDAuMDAwCithZGR4NzAzIGFkZCAwMC4wMCAwRS0zICAgLT4gMC4wMDAKK2FkZHg3MDQgYWRkIDBFLTMgIDAwLjAwICAtPiAwLjAwMAorCithZGR4NzEwIGFkZCAwRSszICAwMC4wMCAgLT4gMC4wMAorYWRkeDcxMSBhZGQgMEUrMyAgMDAuMCAgIC0+IDAuMAorYWRkeDcxMiBhZGQgMEUrMyAgMDAuICAgIC0+IDAKK2FkZHg3MTMgYWRkIDBFKzMgIDAwLkUrMSAtPiAwRSsxCithZGR4NzE0IGFkZCAwRSszICAwMC5FKzIgLT4gMEUrMgorYWRkeDcxNSBhZGQgMEUrMyAgMDAuRSszIC0+IDBFKzMKK2FkZHg3MTYgYWRkIDBFKzMgIDAwLkUrNCAtPiAwRSszCithZGR4NzE3IGFkZCAwRSszICAwMC5FKzUgLT4gMEUrMworYWRkeDcxOCBhZGQgMEUrMyAgLTAwLjAgICAtPiAwLjAKK2FkZHg3MTkgYWRkIDBFKzMgIC0wMC4gICAgLT4gMAorYWRkeDczMSBhZGQgMEUrMyAgLTAwLkUrMSAtPiAwRSsxCisKK2FkZHg3MjAgYWRkIDAwLjAwICAwRSszICAtPiAwLjAwCithZGR4NzIxIGFkZCAwMC4wICAgMEUrMyAgLT4gMC4wCithZGR4NzIyIGFkZCAwMC4gICAgMEUrMyAgLT4gMAorYWRkeDcyMyBhZGQgMDAuRSsxIDBFKzMgIC0+IDBFKzEKK2FkZHg3MjQgYWRkIDAwLkUrMiAwRSszICAtPiAwRSsyCithZGR4NzI1IGFkZCAwMC5FKzMgMEUrMyAgLT4gMEUrMworYWRkeDcyNiBhZGQgMDAuRSs0IDBFKzMgIC0+IDBFKzMKK2FkZHg3MjcgYWRkIDAwLkUrNSAwRSszICAtPiAwRSszCithZGR4NzI4IGFkZCAtMDAuMDAgMEUrMyAgLT4gMC4wMAorYWRkeDcyOSBhZGQgLTAwLjAgIDBFKzMgIC0+IDAuMAorYWRkeDczMCBhZGQgLTAwLiAgIDBFKzMgIC0+IDAKKworYWRkeDczMiBhZGQgIDAgICAgIDAgICAgIC0+ICAwCithZGR4NzMzIGFkZCAgMCAgICAtMCAgICAgLT4gIDAKK2FkZHg3MzQgYWRkIC0wICAgICAwICAgICAtPiAgMAorYWRkeDczNSBhZGQgLTAgICAgLTAgICAgIC0+IC0wICAgICAtLSBJRUVFIDg1NCBzcGVjaWFsIGNhc2UKKworYWRkeDczNiBhZGQgIDEgICAgLTEgICAgIC0+ICAwCithZGR4NzM3IGFkZCAtMSAgICAtMSAgICAgLT4gLTIKK2FkZHg3MzggYWRkICAxICAgICAxICAgICAtPiAgMgorYWRkeDczOSBhZGQgLTEgICAgIDEgICAgIC0+ICAwCisKK2FkZHg3NDEgYWRkICAwICAgIC0xICAgICAtPiAtMQorYWRkeDc0MiBhZGQgLTAgICAgLTEgICAgIC0+IC0xCithZGR4NzQzIGFkZCAgMCAgICAgMSAgICAgLT4gIDEKK2FkZHg3NDQgYWRkIC0wICAgICAxICAgICAtPiAgMQorYWRkeDc0NSBhZGQgLTEgICAgIDAgICAgIC0+IC0xCithZGR4NzQ2IGFkZCAtMSAgICAtMCAgICAgLT4gLTEKK2FkZHg3NDcgYWRkICAxICAgICAwICAgICAtPiAgMQorYWRkeDc0OCBhZGQgIDEgICAgLTAgICAgIC0+ICAxCisKK2FkZHg3NTEgYWRkICAwLjAgIC0xICAgICAtPiAtMS4wCithZGR4NzUyIGFkZCAtMC4wICAtMSAgICAgLT4gLTEuMAorYWRkeDc1MyBhZGQgIDAuMCAgIDEgICAgIC0+ICAxLjAKK2FkZHg3NTQgYWRkIC0wLjAgICAxICAgICAtPiAgMS4wCithZGR4NzU1IGFkZCAtMS4wICAgMCAgICAgLT4gLTEuMAorYWRkeDc1NiBhZGQgLTEuMCAgLTAgICAgIC0+IC0xLjAKK2FkZHg3NTcgYWRkICAxLjAgICAwICAgICAtPiAgMS4wCithZGR4NzU4IGFkZCAgMS4wICAtMCAgICAgLT4gIDEuMAorCithZGR4NzYxIGFkZCAgMCAgICAtMS4wICAgLT4gLTEuMAorYWRkeDc2MiBhZGQgLTAgICAgLTEuMCAgIC0+IC0xLjAKK2FkZHg3NjMgYWRkICAwICAgICAxLjAgICAtPiAgMS4wCithZGR4NzY0IGFkZCAtMCAgICAgMS4wICAgLT4gIDEuMAorYWRkeDc2NSBhZGQgLTEgICAgIDAuMCAgIC0+IC0xLjAKK2FkZHg3NjYgYWRkIC0xICAgIC0wLjAgICAtPiAtMS4wCithZGR4NzY3IGFkZCAgMSAgICAgMC4wICAgLT4gIDEuMAorYWRkeDc2OCBhZGQgIDEgICAgLTAuMCAgIC0+ICAxLjAKKworYWRkeDc3MSBhZGQgIDAuMCAgLTEuMCAgIC0+IC0xLjAKK2FkZHg3NzIgYWRkIC0wLjAgIC0xLjAgICAtPiAtMS4wCithZGR4NzczIGFkZCAgMC4wICAgMS4wICAgLT4gIDEuMAorYWRkeDc3NCBhZGQgLTAuMCAgIDEuMCAgIC0+ICAxLjAKK2FkZHg3NzUgYWRkIC0xLjAgICAwLjAgICAtPiAtMS4wCithZGR4Nzc2IGFkZCAtMS4wICAtMC4wICAgLT4gLTEuMAorYWRkeDc3NyBhZGQgIDEuMCAgIDAuMCAgIC0+ICAxLjAKK2FkZHg3NzggYWRkICAxLjAgIC0wLjAgICAtPiAgMS4wCisKKy0tIFNwZWNpYWxzCithZGR4NzgwIGFkZCAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CithZGR4NzgxIGFkZCAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CithZGR4NzgyIGFkZCAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5CithZGR4NzgzIGFkZCAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CithZGR4Nzg0IGFkZCAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CithZGR4Nzg1IGFkZCAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CithZGR4Nzg2IGFkZCAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CithZGR4Nzg3IGFkZCAtMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CithZGR4Nzg4IGFkZCAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CithZGR4Nzg5IGFkZCAtMSAgICAtSW5mICAgLT4gLUluZmluaXR5CithZGR4NzkwIGFkZCAtMCAgICAtSW5mICAgLT4gLUluZmluaXR5CithZGR4NzkxIGFkZCAgMCAgICAtSW5mICAgLT4gLUluZmluaXR5CithZGR4NzkyIGFkZCAgMSAgICAtSW5mICAgLT4gLUluZmluaXR5CithZGR4NzkzIGFkZCAgMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CithZGR4Nzk0IGFkZCAgSW5mICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworYWRkeDgwMCBhZGQgIEluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODAxIGFkZCAgSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CithZGR4ODAyIGFkZCAgSW5mICAtMSAgICAgLT4gIEluZmluaXR5CithZGR4ODAzIGFkZCAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CithZGR4ODA0IGFkZCAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CithZGR4ODA1IGFkZCAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CithZGR4ODA2IGFkZCAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CithZGR4ODA3IGFkZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CithZGR4ODA4IGFkZCAtMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CithZGR4ODA5IGFkZCAtSW5mICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4MTAgYWRkIC0xICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2FkZHg4MTEgYWRkIC0wICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2FkZHg4MTIgYWRkICAwICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2FkZHg4MTMgYWRkICAxICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2FkZHg4MTQgYWRkICAxMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2FkZHg4MTUgYWRkICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworYWRkeDgyMSBhZGQgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2FkZHg4MjIgYWRkICBOYU4gLTEwMDAgICAtPiAgTmFOCithZGR4ODIzIGFkZCAgTmFOIC0xICAgICAgLT4gIE5hTgorYWRkeDgyNCBhZGQgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2FkZHg4MjUgYWRkICBOYU4gIDAgICAgICAtPiAgTmFOCithZGR4ODI2IGFkZCAgTmFOICAxICAgICAgLT4gIE5hTgorYWRkeDgyNyBhZGQgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2FkZHg4MjggYWRkICBOYU4gIEluZiAgICAtPiAgTmFOCithZGR4ODI5IGFkZCAgTmFOICBOYU4gICAgLT4gIE5hTgorYWRkeDgzMCBhZGQgLUluZiAgTmFOICAgIC0+ICBOYU4KK2FkZHg4MzEgYWRkIC0xMDAwIE5hTiAgICAtPiAgTmFOCithZGR4ODMyIGFkZCAtMSAgICBOYU4gICAgLT4gIE5hTgorYWRkeDgzMyBhZGQgLTAgICAgTmFOICAgIC0+ICBOYU4KK2FkZHg4MzQgYWRkICAwICAgIE5hTiAgICAtPiAgTmFOCithZGR4ODM1IGFkZCAgMSAgICBOYU4gICAgLT4gIE5hTgorYWRkeDgzNiBhZGQgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2FkZHg4MzcgYWRkICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2FkZHg4NDEgYWRkICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg0MiBhZGQgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODQzIGFkZCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NDQgYWRkICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg0NSBhZGQgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODQ2IGFkZCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NDcgYWRkICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg0OCBhZGQgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODQ5IGFkZCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NTAgYWRkICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg1MSBhZGQgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODUyIGFkZCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NTMgYWRkIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg1NCBhZGQgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODU1IGFkZCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NTYgYWRkICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg1NyBhZGQgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODU4IGFkZCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NTkgYWRkICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCithZGR4ODYxIGFkZCAgTmFOMSAgIC1JbmYgICAgLT4gIE5hTjEKK2FkZHg4NjIgYWRkICtOYU4yICAgLTEwMDAgICAtPiAgTmFOMgorYWRkeDg2MyBhZGQgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCithZGR4ODY0IGFkZCAgTmFONCAgICBJbmYgICAgLT4gIE5hTjQKK2FkZHg4NjUgYWRkICBOYU41ICAgK05hTjYgICAtPiAgTmFONQorYWRkeDg2NiBhZGQgLUluZiAgICAgTmFONyAgIC0+ICBOYU43CithZGR4ODY3IGFkZCAtMTAwMCAgICBOYU44ICAgLT4gIE5hTjgKK2FkZHg4NjggYWRkICAxMDAwICAgIE5hTjkgICAtPiAgTmFOOQorYWRkeDg2OSBhZGQgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorYWRkeDg3MSBhZGQgIHNOYU4xMSAgLUluZiAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NzIgYWRkICBzTmFOMTIgIC0xMDAwICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODczIGFkZCAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg3NCBhZGQgIHNOYU4xNCAgIE5hTjE3IC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NzUgYWRkICBzTmFOMTUgIHNOYU4xOCAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODc2IGFkZCAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg3NyBhZGQgLUluZiAgICArc05hTjIwIC0+ICBOYU4yMCAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NzggYWRkIC0xMDAwICAgIHNOYU4yMSAtPiAgTmFOMjEgIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODc5IGFkZCAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg4MCBhZGQgIEluZiAgICAgc05hTjIzIC0+ICBOYU4yMyAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4ODEgYWRkICtOYU4yNSAgK3NOYU4yNCAtPiAgTmFOMjQgIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODgyIGFkZCAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2CithZGR4ODgzIGFkZCAtc05hTjI3ICBzTmFOMjkgLT4gLU5hTjI3ICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg4NCBhZGQgIDEwMDAgICAgLU5hTjMwIC0+IC1OYU4zMAorYWRkeDg4NSBhZGQgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gb3ZlcmZsb3csIHVuZGVyZmxvdyBhbmQgc3Vibm9ybWFsIHRlc3RzCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcHJlY2lzaW9uOiA5CithZGR4ODkwIGFkZCAxRSs5OTk5OTk5OTkgICAgIDlFKzk5OTk5OTk5OSAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDg5MSBhZGQgOUUrOTk5OTk5OTk5ICAgICAxRSs5OTk5OTk5OTkgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg4OTIgYWRkIC0xLjFFLTk5OTk5OTk5OSAgMUUtOTk5OTk5OTk5ICAgLT4gLTFFLTEwMDAwMDAwMDAgICAgU3Vibm9ybWFsCithZGR4ODkzIGFkZCAxRS05OTk5OTk5OTkgICAgLTEuMWUtOTk5OTk5OTk5IC0+IC0xRS0xMDAwMDAwMDAwICAgIFN1Ym5vcm1hbAorYWRkeDg5NCBhZGQgLTEuMDAwMUUtOTk5OTk5OTk5ICAxRS05OTk5OTk5OTkgICAtPiAtMUUtMTAwMDAwMDAwMyBTdWJub3JtYWwKK2FkZHg4OTUgYWRkIDFFLTk5OTk5OTk5OSAgICAtMS4wMDAxZS05OTk5OTk5OTkgLT4gLTFFLTEwMDAwMDAwMDMgU3Vibm9ybWFsCithZGR4ODk2IGFkZCAtMUUrOTk5OTk5OTk5ICAgLTlFKzk5OTk5OTk5OSAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg4OTcgYWRkIC05RSs5OTk5OTk5OTkgICAtMUUrOTk5OTk5OTk5ICAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDg5OCBhZGQgKzEuMUUtOTk5OTk5OTk5IC0xRS05OTk5OTk5OTkgICAtPiAxRS0xMDAwMDAwMDAwICAgIFN1Ym5vcm1hbAorYWRkeDg5OSBhZGQgLTFFLTk5OTk5OTk5OSAgICsxLjFlLTk5OTk5OTk5OSAtPiAxRS0xMDAwMDAwMDAwICAgIFN1Ym5vcm1hbAorYWRkeDkwMCBhZGQgKzEuMDAwMUUtOTk5OTk5OTk5IC0xRS05OTk5OTk5OTkgICAtPiAxRS0xMDAwMDAwMDAzIFN1Ym5vcm1hbAorYWRkeDkwMSBhZGQgLTFFLTk5OTk5OTk5OSAgICsxLjAwMDFlLTk5OTk5OTk5OSAtPiAxRS0xMDAwMDAwMDAzIFN1Ym5vcm1hbAorYWRkeDkwMiBhZGQgLTFFKzk5OTk5OTk5OSAgICs5RSs5OTk5OTk5OTkgICAtPiAgOEUrOTk5OTk5OTk5CithZGR4OTAzIGFkZCAtOUUrOTk5OTk5OTk5ICAgKzFFKzk5OTk5OTk5OSAgIC0+IC04RSs5OTk5OTk5OTkKKworcHJlY2lzaW9uOiAzCithZGR4OTA0IGFkZCAgICAgIDAgLTkuOTk5RSs5OTk5OTk5OTkgICAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCithZGR4OTA1IGFkZCAgICAgICAgLTkuOTk5RSs5OTk5OTk5OTkgMCAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCithZGR4OTA2IGFkZCAgICAgIDAgIDkuOTk5RSs5OTk5OTk5OTkgICAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCithZGR4OTA3IGFkZCAgICAgICAgIDkuOTk5RSs5OTk5OTk5OTkgMCAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCisKK3ByZWNpc2lvbjogMworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK2FkZHg5MTAgYWRkICAxLjAwRS05OTkgICAwICAgIC0+ICAgMS4wMEUtOTk5CithZGR4OTExIGFkZCAgMC4xRS05OTkgICAgMCAgICAtPiAgIDFFLTEwMDAgICBTdWJub3JtYWwKK2FkZHg5MTIgYWRkICAwLjEwRS05OTkgICAwICAgIC0+ICAgMS4wRS0xMDAwIFN1Ym5vcm1hbAorYWRkeDkxMyBhZGQgIDAuMTAwRS05OTkgIDAgICAgLT4gICAxLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK2FkZHg5MTQgYWRkICAwLjAxRS05OTkgICAwICAgIC0+ICAgMUUtMTAwMSAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIE5taW4KK2FkZHg5MTUgYWRkICAwLjk5OUUtOTk5ICAwICAgIC0+ICAgMS4wMEUtOTk5IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4OTE2IGFkZCAgMC4wOTlFLTk5OSAgMCAgICAtPiAgIDEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDkxNyBhZGQgIDAuMDA5RS05OTkgIDAgICAgLT4gICAxRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHg5MTggYWRkICAwLjAwMUUtOTk5ICAwICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg5MTkgYWRkICAwLjAwMDlFLTk5OSAwICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg5MjAgYWRkICAwLjAwMDFFLTk5OSAwICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKKworYWRkeDkzMCBhZGQgLTEuMDBFLTk5OSAgIDAgICAgLT4gIC0xLjAwRS05OTkKK2FkZHg5MzEgYWRkIC0wLjFFLTk5OSAgICAwICAgIC0+ICAtMUUtMTAwMCAgIFN1Ym5vcm1hbAorYWRkeDkzMiBhZGQgLTAuMTBFLTk5OSAgIDAgICAgLT4gIC0xLjBFLTEwMDAgU3Vibm9ybWFsCithZGR4OTMzIGFkZCAtMC4xMDBFLTk5OSAgMCAgICAtPiAgLTEuMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorYWRkeDkzNCBhZGQgLTAuMDFFLTk5OSAgIDAgICAgLT4gIC0xRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gTm1pbgorYWRkeDkzNSBhZGQgLTAuOTk5RS05OTkgIDAgICAgLT4gIC0xLjAwRS05OTkgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHg5MzYgYWRkIC0wLjA5OUUtOTk5ICAwICAgIC0+ICAtMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4OTM3IGFkZCAtMC4wMDlFLTk5OSAgMCAgICAtPiAgLTFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDkzOCBhZGQgLTAuMDAxRS05OTkgIDAgICAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDkzOSBhZGQgLTAuMDAwOUUtOTk5IDAgICAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDk0MCBhZGQgLTAuMDAwMUUtOTk5IDAgICAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCistLSBzb21lIG5vbi16ZXJvIHN1Ym5vcm1hbCBhZGRzCithZGR4OTUwIGFkZCAgMS4wMEUtOTk5ICAgIDAuMUUtOTk5ICAtPiAgIDEuMTBFLTk5OQorYWRkeDk1MSBhZGQgIDAuMUUtOTk5ICAgICAwLjFFLTk5OSAgLT4gICAyRS0xMDAwICAgIFN1Ym5vcm1hbAorYWRkeDk1MiBhZGQgIDAuMTBFLTk5OSAgICAwLjFFLTk5OSAgLT4gICAyLjBFLTEwMDAgIFN1Ym5vcm1hbAorYWRkeDk1MyBhZGQgIDAuMTAwRS05OTkgICAwLjFFLTk5OSAgLT4gICAyLjBFLTEwMDAgIFN1Ym5vcm1hbCBSb3VuZGVkCithZGR4OTU0IGFkZCAgMC4wMUUtOTk5ICAgIDAuMUUtOTk5ICAtPiAgIDEuMUUtMTAwMCAgU3Vibm9ybWFsCithZGR4OTU1IGFkZCAgMC45OTlFLTk5OSAgIDAuMUUtOTk5ICAtPiAgIDEuMTBFLTk5OSAgSW5leGFjdCBSb3VuZGVkCithZGR4OTU2IGFkZCAgMC4wOTlFLTk5OSAgIDAuMUUtOTk5ICAtPiAgIDIuMEUtMTAwMCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHg5NTcgYWRkICAwLjAwOUUtOTk5ICAgMC4xRS05OTkgIC0+ICAgMS4xRS0xMDAwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDk1OCBhZGQgIDAuMDAxRS05OTkgICAwLjFFLTk5OSAgLT4gICAxLjBFLTEwMDAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4OTU5IGFkZCAgMC4wMDA5RS05OTkgIDAuMUUtOTk5ICAtPiAgIDEuMEUtMTAwMCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHg5NjAgYWRkICAwLjAwMDFFLTk5OSAgMC4xRS05OTkgIC0+ICAgMS4wRS0xMDAwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworLS0gbmVnYXRpdmVzLi4uCithZGR4OTYxIGFkZCAgMS4wMEUtOTk5ICAgLTAuMUUtOTk5ICAtPiAgIDkuMEUtMTAwMCAgU3Vibm9ybWFsCithZGR4OTYyIGFkZCAgMC4xRS05OTkgICAgLTAuMUUtOTk5ICAtPiAgIDBFLTEwMDAKK2FkZHg5NjMgYWRkICAwLjEwRS05OTkgICAtMC4xRS05OTkgIC0+ICAgMEUtMTAwMQorYWRkeDk2NCBhZGQgIDAuMTAwRS05OTkgIC0wLjFFLTk5OSAgLT4gICAwRS0xMDAxICAgIENsYW1wZWQKK2FkZHg5NjUgYWRkICAwLjAxRS05OTkgICAtMC4xRS05OTkgIC0+ICAgLTlFLTEwMDEgICBTdWJub3JtYWwKK2FkZHg5NjYgYWRkICAwLjk5OUUtOTk5ICAtMC4xRS05OTkgIC0+ICAgOS4wRS0xMDAwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDk2NyBhZGQgIDAuMDk5RS05OTkgIC0wLjFFLTk5OSAgLT4gICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg5NjggYWRkICAwLjAwOUUtOTk5ICAtMC4xRS05OTkgIC0+ICAgLTlFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDk2OSBhZGQgIDAuMDAxRS05OTkgIC0wLjFFLTk5OSAgLT4gICAtMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4OTcwIGFkZCAgMC4wMDA5RS05OTkgLTAuMUUtOTk5ICAtPiAgIC0xLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHg5NzEgYWRkICAwLjAwMDFFLTk5OSAtMC4xRS05OTkgIC0+ICAgLTEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCistLSBzb21lICdyZWFsJyBudW1iZXJzCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworcHJlY2lzaW9uOiA4CithZGR4NTY2IGFkZCA5OTk5OTA2MTczNUUtMzk0ICAwRS0zOTQgLT4gOS45OTk5MDZFLTM4NCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorcHJlY2lzaW9uOiA3CithZGR4NTY3IGFkZCA5OTk5OTA2MTczNUUtMzk0ICAwRS0zOTQgLT4gOS45OTk5MUUtMzg0IEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsCitwcmVjaXNpb246IDYKK2FkZHg1NjggYWRkIDk5OTk5MDYxNzM1RS0zOTQgIDBFLTM5NCAtPiA5Ljk5OTlFLTM4NCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorCistLSBub3cgdGhlIGNhc2Ugd2hlcmUgd2UgY2FuIGdldCB1bmRlcmZsb3cgYnV0IHRoZSByZXN1bHQgaXMgbm9ybWFsCistLSBbbm90ZSB0aGlzIGNhbid0IGhhcHBlbiBpZiB0aGUgb3BlcmFuZHMgYXJlIGFsc28gYm91bmRlZCwgYXMgd2UKKy0tIGNhbm5vdCByZXByZXNlbnQgMUUtMzk5LCBmb3IgZXhhbXBsZV0KK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCisKK2FkZHg1NzEgYWRkICAgICAgIDFFLTM4MyAgICAgICAwICAtPiAxRS0zODMKK2FkZHg1NzIgYWRkICAgICAgIDFFLTM4NCAgICAgICAwICAtPiAxRS0zODQgICBTdWJub3JtYWwKK2FkZHg1NzMgYWRkICAgICAgIDFFLTM4MyAgMUUtMzg0ICAtPiAxLjFFLTM4MworYWRkeDU3NCBzdWJ0cmFjdCAgMUUtMzgzICAxRS0zODQgIC0+ICAgOUUtMzg0IFN1Ym5vcm1hbAorCistLSBIZXJlIHdlIGV4cGxvcmUgdGhlIGJvdW5kYXJ5IG9mIHJvdW5kaW5nIGEgc3Vibm9ybWFsIHRvIE5taW4KK2FkZHg1NzUgc3VidHJhY3QgIDFFLTM4MyAgMUUtMzk4ICAtPiAgIDkuOTk5OTk5OTk5OTk5OTlFLTM4NCAgU3Vibm9ybWFsCithZGR4NTc2IHN1YnRyYWN0ICAxRS0zODMgIDFFLTM5OCAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgIFN1Ym5vcm1hbAorYWRkeDU3NyBzdWJ0cmFjdCAgMUUtMzgzICAxRS0zOTkgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorYWRkeDU3OCBzdWJ0cmFjdCAgMUUtMzgzICAxRS00MDAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorYWRkeDU3OSBzdWJ0cmFjdCAgMUUtMzgzICAxRS00MDEgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorYWRkeDU4MCBzdWJ0cmFjdCAgMUUtMzgzICAxRS00MDIgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorCistLSBjaGVjayBvdmVyZmxvdyBlZGdlIGNhc2UKK3ByZWNpc2lvbjogICA3Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk2CittaW5FeHBvbmVudDogLTk1CithZGR4OTcyIGFwcGx5ICAgOS45OTk5OTlFKzk2ICAgICAgICAgLT4gOS45OTk5OTlFKzk2CithZGR4OTczIGFkZCAgICAgOS45OTk5OTlFKzk2ICAxICAgICAgLT4gOS45OTk5OTlFKzk2IEluZXhhY3QgUm91bmRlZAorYWRkeDk3NCBhZGQgICAgICA5OTk5OTk5RSs5MCAgMSAgICAgIC0+IDkuOTk5OTk5RSs5NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5NzUgYWRkICAgICAgOTk5OTk5OUUrOTAgIDFFKzkwICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5NzYgYWRkICAgICAgOTk5OTk5OUUrOTAgIDlFKzg5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5NzcgYWRkICAgICAgOTk5OTk5OUUrOTAgIDhFKzg5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5NzggYWRkICAgICAgOTk5OTk5OUUrOTAgIDdFKzg5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5NzkgYWRkICAgICAgOTk5OTk5OUUrOTAgIDZFKzg5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5ODAgYWRkICAgICAgOTk5OTk5OUUrOTAgIDVFKzg5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5ODEgYWRkICAgICAgOTk5OTk5OUUrOTAgIDRFKzg5ICAtPiA5Ljk5OTk5OUUrOTYgSW5leGFjdCBSb3VuZGVkCithZGR4OTgyIGFkZCAgICAgIDk5OTk5OTlFKzkwICAzRSs4OSAgLT4gOS45OTk5OTlFKzk2IEluZXhhY3QgUm91bmRlZAorYWRkeDk4MyBhZGQgICAgICA5OTk5OTk5RSs5MCAgMkUrODkgIC0+IDkuOTk5OTk5RSs5NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5ODQgYWRkICAgICAgOTk5OTk5OUUrOTAgIDFFKzg5ICAtPiA5Ljk5OTk5OUUrOTYgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg5ODUgYXBwbHkgIC05Ljk5OTk5OUUrOTYgICAgICAgICAtPiAtOS45OTk5OTlFKzk2CithZGR4OTg2IGFkZCAgICAtOS45OTk5OTlFKzk2IC0xICAgICAgLT4gLTkuOTk5OTk5RSs5NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5ODcgYWRkICAgICAtOTk5OTk5OUUrOTAgLTEgICAgICAtPiAtOS45OTk5OTlFKzk2IEluZXhhY3QgUm91bmRlZAorYWRkeDk4OCBhZGQgICAgIC05OTk5OTk5RSs5MCAtMUUrOTAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5ODkgYWRkICAgICAtOTk5OTk5OUUrOTAgLTlFKzg5ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4OTkwIGFkZCAgICAgLTk5OTk5OTlFKzkwIC04RSs4OSAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDk5MSBhZGQgICAgIC05OTk5OTk5RSs5MCAtN0UrODkgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5OTIgYWRkICAgICAtOTk5OTk5OUUrOTAgLTZFKzg5ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4OTkzIGFkZCAgICAgLTk5OTk5OTlFKzkwIC01RSs4OSAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDk5NCBhZGQgICAgIC05OTk5OTk5RSs5MCAtNEUrODkgIC0+IC05Ljk5OTk5OUUrOTYgSW5leGFjdCBSb3VuZGVkCithZGR4OTk1IGFkZCAgICAgLTk5OTk5OTlFKzkwIC0zRSs4OSAgLT4gLTkuOTk5OTk5RSs5NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5OTYgYWRkICAgICAtOTk5OTk5OUUrOTAgLTJFKzg5ICAtPiAtOS45OTk5OTlFKzk2IEluZXhhY3QgUm91bmRlZAorYWRkeDk5NyBhZGQgICAgIC05OTk5OTk5RSs5MCAtMUUrODkgIC0+IC05Ljk5OTk5OUUrOTYgSW5leGFjdCBSb3VuZGVkCisKKy0tIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitwcmVjaXNpb246ICAgNQorbWF4ZXhwb25lbnQ6IDc5CittaW5leHBvbmVudDogLTc5CistLSBBZGQ6IGxocyBhbmQgcmhzIDAKK2FkZHgxMDAxIGFkZCAgICAgICAxLjUyNDQ0RS04MCAwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDEwMDIgYWRkICAgICAgIDEuNTI0NDVFLTgwIDAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4MTAwMyBhZGQgICAgICAgMS41MjQ0NkUtODAgMCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMDA0IGFkZCAgICAgICAwIDEuNTI0NDRFLTgwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDEwMDUgYWRkICAgICAgIDAgMS41MjQ0NUUtODAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4MTAwNiBhZGQgICAgICAgMCAxLjUyNDQ2RS04MCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworLS0gQWRkOiBsaHMgPj4gcmhzIGFuZCB2aWNlIHZlcnNhCithZGR4MTAxMSBhZGQgICAgICAgMS41MjQ0NEUtODAgMUUtMTAwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDEwMTIgYWRkICAgICAgIDEuNTI0NDVFLTgwIDFFLTEwMCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMDEzIGFkZCAgICAgICAxLjUyNDQ2RS04MCAxRS0xMDAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4MTAxNCBhZGQgICAgICAgMUUtMTAwIDEuNTI0NDRFLTgwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDEwMTUgYWRkICAgICAgIDFFLTEwMCAxLjUyNDQ1RS04MCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMDE2IGFkZCAgICAgICAxRS0xMDAgMS41MjQ0NkUtODAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIEFkZDogbGhzICsgcmhzIGFkZGl0aW9uIGNhcnJpZWQgb3V0CithZGR4MTAyMSBhZGQgICAgICAgMS41MjQ0M0UtODAgMS4wMDAwMUUtODAgIC0+IDIuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDEwMjIgYWRkICAgICAgIDEuNTI0NDRFLTgwIDEuMDAwMDFFLTgwICAtPiAyLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMDIzIGFkZCAgICAgICAxLjUyNDQ1RS04MCAxLjAwMDAxRS04MCAgLT4gMi41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4MTAyNCBhZGQgICAgICAgMS4wMDAwMUUtODAgIDEuNTI0NDNFLTgwIC0+IDIuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDEwMjUgYWRkICAgICAgIDEuMDAwMDFFLTgwICAxLjUyNDQ0RS04MCAtPiAyLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMDI2IGFkZCAgICAgICAxLjAwMDAxRS04MCAgMS41MjQ0NUUtODAgLT4gMi41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIEFuZCBmb3Igcm91bmQgZG93biBmdWxsIGFuZCBzdWJub3JtYWwgcmVzdWx0cworcHJlY2lzaW9uOiAgICAxNgorbWF4RXhwb25lbnQ6ICszODQKK21pbkV4cG9uZW50OiAtMzgzCityb3VuZGluZzogICAgIGRvd24KKworYWRkeDExMDAgYWRkIDFlKzIgLTFlLTM4MyAgICAtPiA5OS45OTk5OTk5OTk5OTk5OSBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTAxIGFkZCAxZSsxIC0xZS0zODMgICAgLT4gOS45OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMDMgYWRkICAgKzEgLTFlLTM4MyAgICAtPiAwLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMDQgYWRkIDFlLTEgLTFlLTM4MyAgICAtPiAwLjA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTA1IGFkZCAxZS0yIC0xZS0zODMgICAgLT4gMC4wMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMDYgYWRkIDFlLTMgLTFlLTM4MyAgICAtPiAwLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMDcgYWRkIDFlLTQgLTFlLTM4MyAgICAtPiAwLjAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTA4IGFkZCAxZS01IC0xZS0zODMgICAgLT4gMC4wMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMDkgYWRkIDFlLTYgLTFlLTM4MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICAgY2VpbGluZworYWRkeDExMTAgYWRkIC0xZSsyICsxZS0zODMgICAtPiAtOTkuOTk5OTk5OTk5OTk5OTkgUm91bmRlZCBJbmV4YWN0CithZGR4MTExMSBhZGQgLTFlKzEgKzFlLTM4MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTExMyBhZGQgICAgLTEgKzFlLTM4MyAgIC0+IC0wLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMTQgYWRkIC0xZS0xICsxZS0zODMgICAtPiAtMC4wOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTExNSBhZGQgLTFlLTIgKzFlLTM4MyAgIC0+IC0wLjAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTExNiBhZGQgLTFlLTMgKzFlLTM4MyAgIC0+IC0wLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMTcgYWRkIC0xZS00ICsxZS0zODMgICAtPiAtMC4wMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTExOCBhZGQgLTFlLTUgKzFlLTM4MyAgIC0+IC0wLjAwMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTExOSBhZGQgLTFlLTYgKzFlLTM4MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CithZGR4MTEyMCBhZGQgKzFlLTM4MyAtMWUrMiAgIC0+IC05OS45OTk5OTk5OTk5OTk5OSBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTIxIGFkZCArMWUtMzgzIC0xZSsxICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTIzIGFkZCArMWUtMzgzICAgIC0xICAgLT4gLTAuOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTEyNCBhZGQgKzFlLTM4MyAtMWUtMSAgIC0+IC0wLjA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTI1IGFkZCArMWUtMzgzIC0xZS0yICAgLT4gLTAuMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTI2IGFkZCArMWUtMzgzIC0xZS0zICAgLT4gLTAuMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTEyNyBhZGQgKzFlLTM4MyAtMWUtNCAgIC0+IC0wLjAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTI4IGFkZCArMWUtMzgzIC0xZS01ICAgLT4gLTAuMDAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTI5IGFkZCArMWUtMzgzIC0xZS02ICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RS03ICBSb3VuZGVkIEluZXhhY3QKKworcm91bmRpbmc6ICAgICBkb3duCitwcmVjaXNpb246ICAgIDcKK21heEV4cG9uZW50OiArOTYKK21pbkV4cG9uZW50OiAtOTUKK2FkZHgxMTMwIGFkZCAgIDEgICAgICAgICAgICAtMWUtMjAwICAtPiAwLjk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorLS0gc3Vibm9ybWFsIGJvdW5kYXJ5CithZGR4MTEzMSBhZGQgICAxLjAwMDAwMEUtOTQgIC0xZS0yMDAgIC0+ICA5Ljk5OTk5OUUtOTUgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMzIgYWRkICAgMS4wMDAwMDFFLTk1ICAtMWUtMjAwICAtPiAgMS4wMDAwMDBFLTk1ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTMzIGFkZCAgIDEuMDAwMDAwRS05NSAgLTFlLTIwMCAgLT4gIDkuOTk5OTlFLTk2ICBSb3VuZGVkIEluZXhhY3QgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDExMzQgYWRkICAgMC45OTk5OTlFLTk1ICAtMWUtMjAwICAtPiAgOS45OTk5OEUtOTYgIFJvdW5kZWQgSW5leGFjdCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4MTEzNSBhZGQgICAwLjAwMTAwMEUtOTUgIC0xZS0yMDAgIC0+ICA5Ljk5RS05OSAgUm91bmRlZCBJbmV4YWN0IFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMTM2IGFkZCAgIDAuMDAwOTk5RS05NSAgLTFlLTIwMCAgLT4gIDkuOThFLTk5ICBSb3VuZGVkIEluZXhhY3QgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDExMzcgYWRkICAgMS4wMDAwMDBFLTk1ICAtMWUtMTAxICAtPiAgOS45OTk5OUUtOTYgIFN1Ym5vcm1hbAorYWRkeDExMzggYWRkICAgICAgMTAwMDBFLTEwMSAtMWUtMjAwICAtPiAgOS45OTlFLTk4ICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDExMzkgYWRkICAgICAgIDEwMDBFLTEwMSAtMWUtMjAwICAtPiAgOS45OUUtOTkgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDExNDAgYWRkICAgICAgICAxMDBFLTEwMSAtMWUtMjAwICAtPiAgOS45RS0xMDAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDExNDEgYWRkICAgICAgICAgMTBFLTEwMSAtMWUtMjAwICAtPiAgOUUtMTAxICAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDExNDIgYWRkICAgICAgICAgIDFFLTEwMSAtMWUtMjAwICAtPiAgMEUtMTAxICAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTE0MyBhZGQgICAgICAgICAgMEUtMTAxIC0xZS0yMDAgIC0+IC0wRS0xMDEgICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxMTQ0IGFkZCAgICAgICAgICAxRS0xMDIgLTFlLTIwMCAgLT4gIDBFLTEwMSAgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCithZGR4MTE1MSBhZGQgICAgICAxMDAwMEUtMTAyIC0xZS0yMDAgIC0+ICA5Ljk5RS05OSAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHgxMTUyIGFkZCAgICAgICAxMDAwRS0xMDIgLTFlLTIwMCAgLT4gIDkuOUUtMTAwICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDExNTMgYWRkICAgICAgICAxMDBFLTEwMiAtMWUtMjAwICAtPiAgOUUtMTAxICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHgxMTU0IGFkZCAgICAgICAgIDEwRS0xMDIgLTFlLTIwMCAgLT4gIDBFLTEwMSAgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDExNTUgYWRkICAgICAgICAgIDFFLTEwMiAtMWUtMjAwICAtPiAgMEUtMTAxICAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTE1NiBhZGQgICAgICAgICAgMEUtMTAyIC0xZS0yMDAgIC0+IC0wRS0xMDEgICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxMTU3IGFkZCAgICAgICAgICAxRS0xMDMgLTFlLTIwMCAgLT4gIDBFLTEwMSAgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCithZGR4MTE2MCBhZGQgICAgICAgIDEwMEUtMTA1IC0xZS0xMDEgIC0+IC0wRS0xMDEgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDExNjEgYWRkICAgICAgICAxMDBFLTEwNSAtMWUtMjAxICAtPiAgMEUtMTAxIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworLS0gdGVzdHMgYmFzZWQgb24gR3VubmFyIERlZ25ib2wncyBlZGdlIGNhc2UKK3ByZWNpc2lvbjogICAxNQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK2FkZHgxMjAwIGFkZCAxRTE1ICAtMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMEUrMTUgSW5leGFjdCBSb3VuZGVkCithZGR4MTIwMSBhZGQgMUUxNSAgLTAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDBFKzE1IEluZXhhY3QgUm91bmRlZAorYWRkeDEyMTAgYWRkIDFFMTUgIC0wLjUxICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMjExIGFkZCAxRTE1ICAtMC41MDEgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTIxMiBhZGQgMUUxNSAgLTAuNTAwMSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEyMTMgYWRkIDFFMTUgIC0wLjUwMDAxICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMjE0IGFkZCAxRTE1ICAtMC41MDAwMDEgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTIxNSBhZGQgMUUxNSAgLTAuNTAwMDAwMSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEyMTYgYWRkIDFFMTUgIC0wLjUwMDAwMDAxICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMjE3IGFkZCAxRTE1ICAtMC41MDAwMDAwMDEgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTIxOCBhZGQgMUUxNSAgLTAuNTAwMDAwMDAwMSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEyMTkgYWRkIDFFMTUgIC0wLjUwMDAwMDAwMDAxICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMjIwIGFkZCAxRTE1ICAtMC41MDAwMDAwMDAwMDEgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTIyMSBhZGQgMUUxNSAgLTAuNTAwMDAwMDAwMDAwMSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEyMjIgYWRkIDFFMTUgIC0wLjUwMDAwMDAwMDAwMDAxICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMjIzIGFkZCAxRTE1ICAtMC41MDAwMDAwMDAwMDAwMDEgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTIyNCBhZGQgMUUxNSAgLTAuNTAwMDAwMDAwMDAwMDAwMSAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEyMjUgYWRkIDFFMTUgIC0wLjUwMDAwMDAwMDAwMDAwMDAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwRSsxNSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMjMwIGFkZCAxRTE1ICAtNTAwMDAwMC4wMDAwMDAwMDEgICAtPiAgOTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogICAxNgorCithZGR4MTMwMCBhZGQgMUUxNiAgLTAuNSAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzEwIGFkZCAxRTE2ICAtMC41MSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzMTEgYWRkIDFFMTYgIC0wLjUwMSAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTMxMiBhZGQgMUUxNiAgLTAuNTAwMSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzEzIGFkZCAxRTE2ICAtMC41MDAwMSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzMTQgYWRkIDFFMTYgIC0wLjUwMDAwMSAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTMxNSBhZGQgMUUxNiAgLTAuNTAwMDAwMSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzE2IGFkZCAxRTE2ICAtMC41MDAwMDAwMSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzMTcgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMSAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTMxOCBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzE5IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzMjAgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMSAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTMyMSBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzIyIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzMjMgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTMyNCBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMDAwMSAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzI1IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzMjYgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMCAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4MTMyNyBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMDAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzI4IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzMjkgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4MTMzMCBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzMxIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzMzIgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMCAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4MTMzMyBhZGQgMUUxNiAgLTAuNTAwMDAwMDAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzM0IGFkZCAxRTE2ICAtMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzMzUgYWRkIDFFMTYgIC0wLjUwMDAwMCAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4MTMzNiBhZGQgMUUxNiAgLTAuNTAwMDAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzM3IGFkZCAxRTE2ICAtMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzMzggYWRkIDFFMTYgIC0wLjUwMCAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4MTMzOSBhZGQgMUUxNiAgLTAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDEzNDAgYWRkIDFFMTYgIC01MDAwMDAwLjAwMDAxMDAwMSAgIC0+ICA5OTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTM0MSBhZGQgMUUxNiAgLTUwMDAwMDAuMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTUwMDAwMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDEzNDkgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40ICAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNTAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNTEgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTkgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNTIgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5ICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNTMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNTQgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTkgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNTUgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5ICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNTYgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNTcgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTkgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNTggYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5ICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNTkgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNjAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTkgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNjEgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5ICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNjIgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNjMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OTkgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNjQgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OTk5ICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNjUgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNjcgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNjggYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMCAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNjkgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNzAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNzEgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMCAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNzIgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNzMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNzQgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMCAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNzUgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNzYgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNzcgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMCAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNzggYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzNzkgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzODAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MCAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzODEgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzODIgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzODMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzODQgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzODUgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAxICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzODYgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDEgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzODcgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMSAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzODggYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAxICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzODkgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDEgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzOTAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMSAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzOTEgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAxICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzOTIgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDEgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzOTMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMSAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzOTQgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAxICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzOTUgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDEgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzOTYgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MSAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorCistLSBNb3JlIEdEIGVkZ2UgY2FzZXMsIHdoZXJlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdW5hZGp1c3RlZAorLS0gZXhwb25lbnRzIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHByZWNpc2lvbiBhbmQgb25lIHNpZGUgaXMgMAorcHJlY2lzaW9uOiAgIDE1Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworYWRkeDE0MDAgYWRkICAwIDEuMjM0NTY3ODkwMTIzNDUgICAgIC0+IDEuMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDAxIGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xICAtPiAwLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0MDIgYWRkICAwIDEuMjM0NTY3ODkwMTIzNDVFLTIgIC0+IDAuMDEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0MDMgYWRkICAwIDEuMjM0NTY3ODkwMTIzNDVFLTMgIC0+IDAuMDAxMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDA0IGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS00ICAtPiAwLjAwMDEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0MDUgYWRkICAwIDEuMjM0NTY3ODkwMTIzNDVFLTUgIC0+IDAuMDAwMDEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0MDYgYWRkICAwIDEuMjM0NTY3ODkwMTIzNDVFLTYgIC0+IDAuMDAwMDAxMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDA3IGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS03ICAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS03CithZGR4MTQwOCBhZGQgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtOCAgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtOAorYWRkeDE0MDkgYWRkICAwIDEuMjM0NTY3ODkwMTIzNDVFLTkgIC0+IDEuMjM0NTY3ODkwMTIzNDVFLTkKK2FkZHgxNDEwIGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xMCAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xMAorYWRkeDE0MTEgYWRkICAwIDEuMjM0NTY3ODkwMTIzNDVFLTExIC0+IDEuMjM0NTY3ODkwMTIzNDVFLTExCithZGR4MTQxMiBhZGQgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTIgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTIKK2FkZHgxNDEzIGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xMyAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xMworYWRkeDE0MTQgYWRkICAwIDEuMjM0NTY3ODkwMTIzNDVFLTE0IC0+IDEuMjM0NTY3ODkwMTIzNDVFLTE0CithZGR4MTQxNSBhZGQgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTUgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTUKK2FkZHgxNDE2IGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xNiAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xNgorYWRkeDE0MTcgYWRkICAwIDEuMjM0NTY3ODkwMTIzNDVFLTE3IC0+IDEuMjM0NTY3ODkwMTIzNDVFLTE3CithZGR4MTQxOCBhZGQgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTggLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTgKK2FkZHgxNDE5IGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xOSAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xOQorCistLSBzYW1lLCBwcmVjaXNpb24gMTYuLgorcHJlY2lzaW9uOiAgIDE2CithZGR4MTQyMCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDUgICAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQyMSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEgIC0+IDAuMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0MjIgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0yICAtPiAwLjAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQyMyBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTMgIC0+IDAuMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQyNCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTQgIC0+IDAuMDAwMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0MjUgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS01ICAtPiAwLjAwMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQyNiBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTYgIC0+IDAuMDAwMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQyNyBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTcgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS03CithZGR4MTQyOCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTggIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS04CithZGR4MTQyOSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTkgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS05CithZGR4MTQzMCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMAorYWRkeDE0MzEgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMSAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEKK2FkZHgxNDMyIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEyCithZGR4MTQzMyBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEzIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMworYWRkeDE0MzQgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQKK2FkZHgxNDM1IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE1CithZGR4MTQzNiBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE2IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNgorYWRkeDE0MzcgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNyAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcKK2FkZHgxNDM4IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTggLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE4CithZGR4MTQzOSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE5IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOQorCistLSBzYW1lLCByZXZlcnNlZCAwCithZGR4MTQ0MCBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgICAgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDQxIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMSAgMCAtPiAwLjExMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDQyIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMiAgMCAtPiAwLjAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ0MyBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTMgIDAgLT4gMC4wMDExMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDQ0IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtNCAgMCAtPiAwLjAwMDExMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDQ1IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtNSAgMCAtPiAwLjAwMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ0NiBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTYgIDAgLT4gMC4wMDAwMDExMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDQ3IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtNyAgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtNworYWRkeDE0NDggYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS04ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS04CithZGR4MTQ0OSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTkgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTkKK2FkZHgxNDUwIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTAgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTAKK2FkZHgxNDUxIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEKK2FkZHgxNDUyIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIKK2FkZHgxNDUzIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTMgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTMKK2FkZHgxNDU0IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQKK2FkZHgxNDU1IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUKK2FkZHgxNDU2IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTYgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTYKK2FkZHgxNDU3IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcKK2FkZHgxNDU4IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTggMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTgKK2FkZHgxNDU5IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTkgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTkKKworLS0gc2FtZSwgRXMgb24gdGhlIDAKK2FkZHgxNDYwIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ2MSBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0NjIgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0yICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDYzIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMyAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ2NCBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTQgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0NjUgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS01ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDY2IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNiAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ2NyBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTcgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0NjggYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS04ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDY5IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtOSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ3MCBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEwICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0NzEgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDcyIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTIgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ3MyBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEzICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0NzQgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNCAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDc1IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTUgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CistLSBuZXh0IGZvdXIgZmxhZyBSb3VuZGVkIGJlY2F1c2UgdGhlIDAgZXh0ZW5kcyB0aGUgcmVzdWx0CithZGR4MTQ3NiBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE2ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCithZGR4MTQ3NyBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE3ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCithZGR4MTQ3OCBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE4ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCithZGR4MTQ3OSBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE5ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCisKKy0tIHN1bSBvZiB0d28gb3Bwb3NpdGUtc2lnbiBvcGVyYW5kcyBpcyBleGFjdGx5IDAgYW5kIGZsb29yID0+IC0wCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK3JvdW5kaW5nOiAgICBoYWxmX3VwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCithZGR4MTUwMCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNTAxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE1MDIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CithZGR4MTUwMyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2FkZHgxNTA0IGFkZCAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1MDUgYWRkIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTUwNiBhZGQgIDBFLTQwMCAgLTBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTA3IGFkZCAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworYWRkeDE1MTEgYWRkICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTUxMiBhZGQgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxNTEzIGFkZCAgMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE1MTQgYWRkIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCithZGR4MTUxNSBhZGQgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxNTE2IGFkZCAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1MTcgYWRkICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTUxOCBhZGQgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworYWRkeDE1MjAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4MTUyMSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNTIyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE1MjMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CithZGR4MTUyNCBhZGQgIDBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTI1IGFkZCAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1MjYgYWRkICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTUyNyBhZGQgLTBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQKKy0tIGluZXhhY3QgemVyb3MKK2FkZHgxNTMxIGFkZCAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE1MzIgYWRkIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTUzMyBhZGQgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxNTM0IGFkZCAtMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworYWRkeDE1MzUgYWRkICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTUzNiBhZGQgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTM3IGFkZCAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1MzggYWRkIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2FkZHgxNTQwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE1NDEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4MTU0MiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNTQzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorYWRkeDE1NDQgYWRkICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTU0NSBhZGQgLTBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTQ2IGFkZCAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1NDcgYWRkIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCithZGR4MTU1MSBhZGQgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxNTUyIGFkZCAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE1NTMgYWRkICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTU1NCBhZGQgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2FkZHgxNTU1IGFkZCAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE1NTYgYWRkIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTU1NyBhZGQgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTU4IGFkZCAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCityb3VuZGluZzogICAgdXAKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2FkZHgxNTYwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE1NjEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4MTU2MiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNTYzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorYWRkeDE1NjQgYWRkICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTU2NSBhZGQgLTBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTY2IGFkZCAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1NjcgYWRkIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCithZGR4MTU3MSBhZGQgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CithZGR4MTU3MiBhZGQgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CithZGR4MTU3MyBhZGQgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CithZGR4MTU3NCBhZGQgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCithZGR4MTU3NSBhZGQgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CithZGR4MTU3NiBhZGQgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTc3IGFkZCAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1NzggYWRkIC0xRS00MDEgIC0xRS00MDEgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworCityb3VuZGluZzogICAgZG93bgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworYWRkeDE1ODAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4MTU4MSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNTgyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE1ODMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CithZGR4MTU4NCBhZGQgIDBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTg1IGFkZCAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1ODYgYWRkICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTU4NyBhZGQgLTBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQKKy0tIGluZXhhY3QgemVyb3MKK2FkZHgxNTkxIGFkZCAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE1OTIgYWRkIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTU5MyBhZGQgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxNTk0IGFkZCAtMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworYWRkeDE1OTUgYWRkICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTU5NiBhZGQgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTk3IGFkZCAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1OTggYWRkIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICBjZWlsaW5nCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCithZGR4MTYwMCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNjAxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE2MDIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CithZGR4MTYwMyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2FkZHgxNjA0IGFkZCAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE2MDUgYWRkIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTYwNiBhZGQgIDBFLTQwMCAgLTBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNjA3IGFkZCAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworYWRkeDE2MTEgYWRkICAxRS00MDEgICAxRS00MDAgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDE2MTIgYWRkIC0xRS00MDEgICAxRS00MDAgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDE2MTMgYWRkICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTYxNCBhZGQgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2FkZHgxNjE1IGFkZCAgMUUtNDAxICAgMUUtNDAxIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHgxNjE2IGFkZCAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE2MTcgYWRkICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTYxOCBhZGQgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworLS0gYW5kIHRoZSBleHRyYS1zcGVjaWFsIHVnbHkgY2FzZTsgdW51c3VhbCBtaW51c2VzIG1hcmtlZCBieSAtLSAqCityb3VuZGluZzogICAgZmxvb3IKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2FkZHgxNjIwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE2MjEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCithZGR4MTYyMiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkgICAgICAgICAgIC0tICoKK2FkZHgxNjIzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorYWRkeDE2MjQgYWRkICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTYyNSBhZGQgLTBFLTQwMCAgIDBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQgIC0tICoKK2FkZHgxNjI2IGFkZCAgMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZCAgLS0gKgorYWRkeDE2MjcgYWRkIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCithZGR4MTYzMSBhZGQgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxNjMyIGFkZCAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE2MzMgYWRkICAxRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDE2MzQgYWRkIC0xRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworYWRkeDE2MzUgYWRkICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTYzNiBhZGQgLTFFLTQwMSAgIDFFLTQwMSAtPiAtMEUtMzk4IENsYW1wZWQgIC0tICoKK2FkZHgxNjM3IGFkZCAgMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggQ2xhbXBlZCAgLS0gKgorYWRkeDE2MzggYWRkIC0xRS00MDEgIC0xRS00MDEgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworCistLSBCaWdEZWNpbWFsIHByb2JsZW0gdGVzdGNhc2VzIDIwMDYuMDEuMjMKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworcm91bmRpbmc6ICBkb3duCitwcmVjaXNpb246IDcKK2FkZHgxNjUxIGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwMDhFKzYKK3ByZWNpc2lvbjogNgorYWRkeDE2NTIgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDAwOEUrNgorcHJlY2lzaW9uOiA1CithZGR4MTY1MyBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMDBFKzYgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNAorYWRkeDE2NTQgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDBFKzYgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMKK2FkZHgxNjU1IGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDBFKzYgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyCithZGR4MTY1NiBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjBFKzYgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMQorYWRkeDE2NTcgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMUUrNiAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitwcmVjaXNpb246IDcKK2FkZHgxNjYxIGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwMDhFKzYKK3ByZWNpc2lvbjogNgorYWRkeDE2NjIgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDAwOEUrNgorcHJlY2lzaW9uOiA1CithZGR4MTY2MyBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMDFFKzYgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNAorYWRkeDE2NjQgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDBFKzYgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMKK2FkZHgxNjY1IGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDBFKzYgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyCithZGR4MTY2NiBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjBFKzYgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMQorYWRkeDE2NjcgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMUUrNiAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgdXAKK3ByZWNpc2lvbjogNworYWRkeDE2NzEgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDAwOEUrNgorcHJlY2lzaW9uOiA2CithZGR4MTY3MiBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMDA4RSs2CitwcmVjaXNpb246IDUKK2FkZHgxNjczIGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwMUUrNiAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0CithZGR4MTY3NCBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMUUrNiAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMworYWRkeDE2NzUgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMUUrNiAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIKK2FkZHgxNjc2IGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMUUrNiAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxCithZGR4MTY3NyBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAyRSs2ICAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAgIDM0Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0MworLS0gRXhhbXBsZXMgZnJvbSBTUUwgcHJvcG9zYWwgKEtyaXNobmEgS3Vsa2FybmkpCithZGR4MTcwMSAgYWRkIDEzMEUtMiAgICAxMjBFLTIgICAgLT4gMi41MAorYWRkeDE3MDIgIGFkZCAxMzBFLTIgICAgMTJFLTEgICAgIC0+IDIuNTAKK2FkZHgxNzAzICBhZGQgMTMwRS0yICAgIDFFMCAgICAgICAtPiAyLjMwCithZGR4MTcwNCAgYWRkIDFFMiAgICAgICAxRTQgICAgICAgLT4gMS4wMUUrNAorYWRkeDE3MDUgIHN1YnRyYWN0IDEzMEUtMiAgMTIwRS0yIC0+IDAuMTAKK2FkZHgxNzA2ICBzdWJ0cmFjdCAxMzBFLTIgIDEyRS0xICAtPiAwLjEwCithZGR4MTcwNyAgc3VidHJhY3QgMTMwRS0yICAxRTAgICAgLT4gMC4zMAorYWRkeDE3MDggIHN1YnRyYWN0IDFFMiAgICAgMUU0ICAgIC0+IC05LjlFKzMKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBTYW1lIGFzIGFib3ZlLCB1c2luZyBkZWNpbWFsNjQgZGVmYXVsdCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCistLSBbZmlyc3QgZ3JvdXAgYXJlICdxdWljayBjb25maWRlbmNlIGNoZWNrJ10KK2FkZHg2MDAxIGFkZCAxICAgICAgIDEgICAgICAgLT4gIDIKK2FkZHg2MDAyIGFkZCAyICAgICAgIDMgICAgICAgLT4gIDUKK2FkZHg2MDAzIGFkZCAnNS43NScgICczLjMnICAgLT4gIDkuMDUKK2FkZHg2MDA0IGFkZCAnNScgICAgICctMycgICAgLT4gIDIKK2FkZHg2MDA1IGFkZCAnLTUnICAgICctMycgICAgLT4gIC04CithZGR4NjAwNiBhZGQgJy03JyAgICAnMi41JyAgIC0+ICAtNC41CithZGR4NjAwNyBhZGQgJzAuNycgICAnMC4zJyAgIC0+ICAxLjAKK2FkZHg2MDA4IGFkZCAnMS4yNScgICcxLjI1JyAgLT4gIDIuNTAKK2FkZHg2MDA5IGFkZCAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDAwJyAtPiAnMi4yMzQ1Njc4OScKK2FkZHg2MDEwIGFkZCAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDExJyAtPiAnMi4yMzQ1NjgwMCcKKworYWRkeDYwMTEgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTUnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjAxMiBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDAnICAnMC41NTU1NTU1NTU1NTU1NTU1NScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDEzIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTUwJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDE0IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDknICAgICcwJyAtPiAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDE1IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDk5JyAgICcwJyAtPiAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDE2IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDk5OScgICcwJyAtPiAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDE3IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NTAwMCcgICcwJyAtPiAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDE4IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NTAwMScgICcwJyAtPiAnMC40NDQ0NDQ0NDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDE5IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NTAxJyAgICcwJyAtPiAnMC40NDQ0NDQ0NDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDIwIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NTEnICAgICcwJyAtPiAnMC40NDQ0NDQ0NDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDYwMjEgYWRkIDAgMSAtPiAxCithZGR4NjAyMiBhZGQgMSAxIC0+IDIKK2FkZHg2MDIzIGFkZCAyIDEgLT4gMworYWRkeDYwMjQgYWRkIDMgMSAtPiA0CithZGR4NjAyNSBhZGQgNCAxIC0+IDUKK2FkZHg2MDI2IGFkZCA1IDEgLT4gNgorYWRkeDYwMjcgYWRkIDYgMSAtPiA3CithZGR4NjAyOCBhZGQgNyAxIC0+IDgKK2FkZHg2MDI5IGFkZCA4IDEgLT4gOQorYWRkeDYwMzAgYWRkIDkgMSAtPiAxMAorCistLSBzb21lIGNhcnJ5aW5nIGVmZmVjdHMKK2FkZHg2MDMxIGFkZCAnMC45OTk4JyAgJzAuMDAwMCcgLT4gJzAuOTk5OCcKK2FkZHg2MDMyIGFkZCAnMC45OTk4JyAgJzAuMDAwMScgLT4gJzAuOTk5OScKK2FkZHg2MDMzIGFkZCAnMC45OTk4JyAgJzAuMDAwMicgLT4gJzEuMDAwMCcKK2FkZHg2MDM0IGFkZCAnMC45OTk4JyAgJzAuMDAwMycgLT4gJzEuMDAwMScKKworYWRkeDYwMzUgYWRkICc3MCcgICAgICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDM2IGFkZCAnNzAwJyAgICAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjAzNyBhZGQgJzcwMDAnICAgICcxMDAwMGUrMTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYwMzggYWRkICc3MDAwMCcgICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDFFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDM5IGFkZCAnNzAwMDAwJyAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDA3RSsyMCcgUm91bmRlZAorCistLSBzeW1tZXRyeToKK2FkZHg2MDQwIGFkZCAnMTAwMDBlKzE2JyAgJzcwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDQxIGFkZCAnMTAwMDBlKzE2JyAgJzcwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjA0MiBhZGQgJzEwMDAwZSsxNicgICc3MDAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDQ0IGFkZCAnMTAwMDBlKzE2JyAgJzcwMDAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDFFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDQ1IGFkZCAnMTAwMDBlKzE2JyAgJzcwMDAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDA3RSsyMCcgUm91bmRlZAorCithZGR4NjA0NiBhZGQgJzEwMDAwZSs5JyAgJzcnIC0+ICcxMDAwMDAwMDAwMDAwNycKK2FkZHg2MDQ3IGFkZCAnMTAwMDBlKzknICAnNzAnIC0+ICcxMDAwMDAwMDAwMDA3MCcKK2FkZHg2MDQ4IGFkZCAnMTAwMDBlKzknICAnNzAwJyAtPiAnMTAwMDAwMDAwMDA3MDAnCithZGR4NjA0OSBhZGQgJzEwMDAwZSs5JyAgJzcwMDAnIC0+ICcxMDAwMDAwMDAwNzAwMCcKK2FkZHg2MDUwIGFkZCAnMTAwMDBlKzknICAnNzAwMDAnIC0+ICcxMDAwMDAwMDA3MDAwMCcKK2FkZHg2MDUxIGFkZCAnMTAwMDBlKzknICAnNzAwMDAwJyAtPiAnMTAwMDAwMDA3MDAwMDAnCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjYXJpdGgKK2FkZHg2MDUzIGFkZCAnMTInICc3LjAwJyAtPiAnMTkuMDAnCithZGR4NjA1NCBhZGQgJzEuMycgJy0xLjA3JyAtPiAnMC4yMycKK2FkZHg2MDU1IGFkZCAnMS4zJyAnLTEuMzAnIC0+ICcwLjAwJworYWRkeDYwNTYgYWRkICcxLjMnICctMi4wNycgLT4gJy0wLjc3JworYWRkeDYwNTcgYWRkICcxRSsyJyAnMUUrNCcgLT4gJzEuMDFFKzQnCisKKy0tIGZyb20gYWJvdmUKK2FkZHg2MDYwIGFkZCAxICcwLjEnIC0+ICcxLjEnCithZGR4NjA2MSBhZGQgMSAnMC4wMScgLT4gJzEuMDEnCithZGR4NjA2MiBhZGQgMSAnMC4wMDEnIC0+ICcxLjAwMScKK2FkZHg2MDYzIGFkZCAxICcwLjAwMDEnIC0+ICcxLjAwMDEnCithZGR4NjA2NCBhZGQgMSAnMC4wMDAwMScgLT4gJzEuMDAwMDEnCithZGR4NjA2NSBhZGQgMSAnMC4wMDAwMDEnIC0+ICcxLjAwMDAwMScKK2FkZHg2MDY2IGFkZCAxICcwLjAwMDAwMDEnIC0+ICcxLjAwMDAwMDEnCithZGR4NjA2NyBhZGQgMSAnMC4wMDAwMDAwMScgLT4gJzEuMDAwMDAwMDEnCisKKy0tIGNhbmNlbGxhdGlvbiB0byBpbnRlZ2VyCithZGR4NjA2OCBhZGQgOTk5OTk5OTk5OTk5OTkxMjM0NTY3ODkgLTk5OTk5OTk5OTk5OTk5RSs5IC0+IDEyMzQ1Njc4OQorLS0gc2ltaWxhciBmcm9tIEZNQSBmdW4KK2FkZHg2MDY5IGFkZCAiLTEyMzQ1Njc4OTAxMjM0NTUuMjM0NTY3ODkwMTIzNDU0IiAiMTIzNDU2Nzg5MDEyMzQ1NiIgLT4gMC43NjU0MzIxMDk4NzY1NDYKKworLS0gc29tZSBmdW5ueSB6ZXJvcyBbaW4gY2FzZSBvZiBiYWQgc2lnbnVtXQorYWRkeDYwNzAgYWRkIDEgIDAgICAgLT4gMQorYWRkeDYwNzEgYWRkIDEgMC4gICAgLT4gMQorYWRkeDYwNzIgYWRkIDEgIC4wICAgLT4gMS4wCithZGR4NjA3MyBhZGQgMSAwLjAgICAtPiAxLjAKK2FkZHg2MDc0IGFkZCAxIDAuMDAgIC0+IDEuMDAKK2FkZHg2MDc1IGFkZCAgMCAgMSAgIC0+IDEKK2FkZHg2MDc2IGFkZCAwLiAgMSAgIC0+IDEKK2FkZHg2MDc3IGFkZCAgLjAgMSAgIC0+IDEuMAorYWRkeDYwNzggYWRkIDAuMCAxICAgLT4gMS4wCithZGR4NjA3OSBhZGQgMC4wMCAxICAtPiAxLjAwCisKKy0tIHNvbWUgY2FycmllcworYWRkeDYwODAgYWRkIDk5OTk5OTk5OTk5OTk5OTggMSAgLT4gOTk5OTk5OTk5OTk5OTk5OQorYWRkeDYwODEgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMSAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzE2IFJvdW5kZWQKK2FkZHg2MDgyIGFkZCAgOTk5OTk5OTk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMDAwMDAwMDAKK2FkZHg2MDgzIGFkZCAgICA5OTk5OTk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMDAwMDAwCithZGR4NjA4NCBhZGQgICAgICA5OTk5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAwMDAKK2FkZHg2MDg1IGFkZCAgICAgICAgOTk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMDAKK2FkZHg2MDg2IGFkZCAgICAgICAgICA5OTk5OTk5IDEgIC0+IDEwMDAwMDAwCithZGR4NjA4NyBhZGQgICAgICAgICAgICA5OTk5OSAxICAtPiAxMDAwMDAKK2FkZHg2MDg4IGFkZCAgICAgICAgICAgICAgOTk5IDEgIC0+IDEwMDAKK2FkZHg2MDg5IGFkZCAgICAgICAgICAgICAgICA5IDEgIC0+IDEwCisKKworLS0gbW9yZSBMSFMgc3dhcHMKK2FkZHg2MDkwIGFkZCAnLTU2MjY3RS0xMCcgICAwIC0+ICAnLTAuMDAwMDA1NjI2NycKK2FkZHg2MDkxIGFkZCAnLTU2MjY3RS02JyAgICAwIC0+ICAnLTAuMDU2MjY3JworYWRkeDYwOTIgYWRkICctNTYyNjdFLTUnICAgIDAgLT4gICctMC41NjI2NycKK2FkZHg2MDkzIGFkZCAnLTU2MjY3RS00JyAgICAwIC0+ICAnLTUuNjI2NycKK2FkZHg2MDk0IGFkZCAnLTU2MjY3RS0zJyAgICAwIC0+ICAnLTU2LjI2NycKK2FkZHg2MDk1IGFkZCAnLTU2MjY3RS0yJyAgICAwIC0+ICAnLTU2Mi42NycKK2FkZHg2MDk2IGFkZCAnLTU2MjY3RS0xJyAgICAwIC0+ICAnLTU2MjYuNycKK2FkZHg2MDk3IGFkZCAnLTU2MjY3RS0wJyAgICAwIC0+ICAnLTU2MjY3JworYWRkeDYwOTggYWRkICctNUUtMTAnICAgICAgIDAgLT4gICctNUUtMTAnCithZGR4NjA5OSBhZGQgJy01RS03JyAgICAgICAgMCAtPiAgJy01RS03JworYWRkeDYxMDAgYWRkICctNUUtNicgICAgICAgIDAgLT4gICctMC4wMDAwMDUnCithZGR4NjEwMSBhZGQgJy01RS01JyAgICAgICAgMCAtPiAgJy0wLjAwMDA1JworYWRkeDYxMDIgYWRkICctNUUtNCcgICAgICAgIDAgLT4gICctMC4wMDA1JworYWRkeDYxMDMgYWRkICctNUUtMScgICAgICAgIDAgLT4gICctMC41JworYWRkeDYxMDQgYWRkICctNUUwJyAgICAgICAgIDAgLT4gICctNScKK2FkZHg2MTA1IGFkZCAnLTVFMScgICAgICAgICAwIC0+ICAnLTUwJworYWRkeDYxMDYgYWRkICctNUU1JyAgICAgICAgIDAgLT4gICctNTAwMDAwJworYWRkeDYxMDcgYWRkICctNUUxNScgICAgICAgIDAgLT4gICctNTAwMDAwMDAwMDAwMDAwMCcKK2FkZHg2MTA4IGFkZCAnLTVFMTYnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNicgICBSb3VuZGVkCithZGR4NjEwOSBhZGQgJy01RTE3JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTcnICBSb3VuZGVkCithZGR4NjExMCBhZGQgJy01RTE4JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTgnICBSb3VuZGVkCithZGR4NjExMSBhZGQgJy01RTEwMCcgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTAwJyBSb3VuZGVkCisKKy0tIG1vcmUgUkhTIHN3YXBzCithZGR4NjExMyBhZGQgMCAgJy01NjI2N0UtMTAnIC0+ICAnLTAuMDAwMDA1NjI2NycKK2FkZHg2MTE0IGFkZCAwICAnLTU2MjY3RS02JyAgLT4gICctMC4wNTYyNjcnCithZGR4NjExNiBhZGQgMCAgJy01NjI2N0UtNScgIC0+ICAnLTAuNTYyNjcnCithZGR4NjExNyBhZGQgMCAgJy01NjI2N0UtNCcgIC0+ICAnLTUuNjI2NycKK2FkZHg2MTE5IGFkZCAwICAnLTU2MjY3RS0zJyAgLT4gICctNTYuMjY3JworYWRkeDYxMjAgYWRkIDAgICctNTYyNjdFLTInICAtPiAgJy01NjIuNjcnCithZGR4NjEyMSBhZGQgMCAgJy01NjI2N0UtMScgIC0+ICAnLTU2MjYuNycKK2FkZHg2MTIyIGFkZCAwICAnLTU2MjY3RS0wJyAgLT4gICctNTYyNjcnCithZGR4NjEyMyBhZGQgMCAgJy01RS0xMCcgICAgIC0+ICAnLTVFLTEwJworYWRkeDYxMjQgYWRkIDAgICctNUUtNycgICAgICAtPiAgJy01RS03JworYWRkeDYxMjUgYWRkIDAgICctNUUtNicgICAgICAtPiAgJy0wLjAwMDAwNScKK2FkZHg2MTI2IGFkZCAwICAnLTVFLTUnICAgICAgLT4gICctMC4wMDAwNScKK2FkZHg2MTI3IGFkZCAwICAnLTVFLTQnICAgICAgLT4gICctMC4wMDA1JworYWRkeDYxMjggYWRkIDAgICctNUUtMScgICAgICAtPiAgJy0wLjUnCithZGR4NjEyOSBhZGQgMCAgJy01RTAnICAgICAgIC0+ICAnLTUnCithZGR4NjEzMCBhZGQgMCAgJy01RTEnICAgICAgIC0+ICAnLTUwJworYWRkeDYxMzEgYWRkIDAgICctNUU1JyAgICAgICAtPiAgJy01MDAwMDAnCithZGR4NjEzMiBhZGQgMCAgJy01RTE1JyAgICAgIC0+ICAnLTUwMDAwMDAwMDAwMDAwMDAnCithZGR4NjEzMyBhZGQgMCAgJy01RTE2JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNicgICBSb3VuZGVkCithZGR4NjEzNCBhZGQgMCAgJy01RTE3JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNycgICBSb3VuZGVkCithZGR4NjEzNSBhZGQgMCAgJy01RTE4JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxOCcgICBSb3VuZGVkCithZGR4NjEzNiBhZGQgMCAgJy01RTEwMCcgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxMDAnICBSb3VuZGVkCisKKy0tIHJlbGF0ZWQKK2FkZHg2MTM3IGFkZCAgMSAgJzBFLTE5JyAgICAgIC0+ICAnMS4wMDAwMDAwMDAwMDAwMDAnICBSb3VuZGVkCithZGR4NjEzOCBhZGQgLTEgICcwRS0xOScgICAgICAtPiAgJy0xLjAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorYWRkeDYxMzkgYWRkICcwRS0xOScgMSAgICAgICAgLT4gICcxLjAwMDAwMDAwMDAwMDAwMCcgIFJvdW5kZWQKK2FkZHg2MTQwIGFkZCAnMEUtMTknIC0xICAgICAgIC0+ICAnLTEuMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCithZGR4NjE0MSBhZGQgMUUrMTEgICAwLjAwMDAgICAtPiAgJzEwMDAwMDAwMDAwMC4wMDAwJworYWRkeDYxNDIgYWRkIDFFKzExICAgMC4wMDAwMCAgLT4gICcxMDAwMDAwMDAwMDAuMDAwMCcgIFJvdW5kZWQKK2FkZHg2MTQzIGFkZCAwLjAwMCAgIDFFKzEyICAgIC0+ICAnMTAwMDAwMDAwMDAwMC4wMDAnCithZGR4NjE0NCBhZGQgMC4wMDAwICAxRSsxMiAgICAtPiAgJzEwMDAwMDAwMDAwMDAuMDAwJyAgUm91bmRlZAorCistLSBbc29tZSBvZiB0aGUgbmV4dCBncm91cCBhcmUgcmVhbGx5IGNvbnN0cnVjdG9yIHRlc3RzXQorYWRkeDYxNDYgYWRkICcwMC4wJyAgMCAgICAgICAtPiAgJzAuMCcKK2FkZHg2MTQ3IGFkZCAnMC4wMCcgIDAgICAgICAgLT4gICcwLjAwJworYWRkeDYxNDggYWRkICAwICAgICAgJzAuMDAnICAtPiAgJzAuMDAnCithZGR4NjE0OSBhZGQgIDAgICAgICAnMDAuMCcgIC0+ICAnMC4wJworYWRkeDYxNTAgYWRkICcwMC4wJyAgJzAuMDAnICAtPiAgJzAuMDAnCithZGR4NjE1MSBhZGQgJzAuMDAnICAnMDAuMCcgIC0+ICAnMC4wMCcKK2FkZHg2MTUyIGFkZCAnMycgICAgICcuMycgICAgLT4gICczLjMnCithZGR4NjE1MyBhZGQgJzMuJyAgICAnLjMnICAgIC0+ICAnMy4zJworYWRkeDYxNTQgYWRkICczLjAnICAgJy4zJyAgICAtPiAgJzMuMycKK2FkZHg2MTU1IGFkZCAnMy4wMCcgICcuMycgICAgLT4gICczLjMwJworYWRkeDYxNTYgYWRkICczJyAgICAgJzMnICAgICAtPiAgJzYnCithZGR4NjE1NyBhZGQgJzMnICAgICAnKzMnICAgIC0+ICAnNicKK2FkZHg2MTU4IGFkZCAnMycgICAgICctMycgICAgLT4gICcwJworYWRkeDYxNTkgYWRkICcwLjMnICAgJy0wLjMnICAtPiAgJzAuMCcKK2FkZHg2MTYwIGFkZCAnMC4wMycgICctMC4wMycgLT4gICcwLjAwJworCistLSB0cnkgYm9yZGVybGluZSBwcmVjaXNpb24sIHdpdGggY2FycmllcywgZXRjLgorYWRkeDYxNjEgYWRkICcxRSsxMycgJy0xJyAgICAtPiAnOTk5OTk5OTk5OTk5OScKK2FkZHg2MTYyIGFkZCAnMUUrMTMnICAnMS4xMScgLT4gJzEwMDAwMDAwMDAwMDAxLjExJworYWRkeDYxNjMgYWRkICcxLjExJyAgJzFFKzEzJyAtPiAnMTAwMDAwMDAwMDAwMDEuMTEnCithZGR4NjE2NCBhZGQgJy0xJyAgICAnMUUrMTMnIC0+ICc5OTk5OTk5OTk5OTk5JworYWRkeDYxNjUgYWRkICc3RSsxMycgJy0xJyAgICAtPiAnNjk5OTk5OTk5OTk5OTknCithZGR4NjE2NiBhZGQgJzdFKzEzJyAgJzEuMTEnIC0+ICc3MDAwMDAwMDAwMDAwMS4xMScKK2FkZHg2MTY3IGFkZCAnMS4xMScgICc3RSsxMycgLT4gJzcwMDAwMDAwMDAwMDAxLjExJworYWRkeDYxNjggYWRkICctMScgICAgJzdFKzEzJyAtPiAnNjk5OTk5OTk5OTk5OTknCisKKy0tICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgMSAyMzQ1Njc4OTAxMjM0NTYKK2FkZHg2MTcwIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2MycgLT4gJzEuMDAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTcxIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2MicgLT4gJzEuMDAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTcyIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2MScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTczIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2MCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTc0IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1OScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTc1IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1OCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTc2IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NycgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTc3IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NicgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCithZGR4NjE3OCBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTUnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTknCithZGR4NjE3OSBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTQnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTgnCithZGR4NjE4MCBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTMnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTcnCithZGR4NjE4MSBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTInIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTYnCithZGR4NjE4MiBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTEnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTUnCithZGR4NjE4MyBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTAnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTQnCisKKy0tIGFuZCBzb21lIG1vcmUsIGluY2x1ZGluZyByZXNpZHVlIGVmZmVjdHMgYW5kIGRpZmZlcmVudCByb3VuZGluZ3MKK3JvdW5kaW5nOiBoYWxmX3VwCithZGR4NjIwMCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknCithZGR4NjIwMSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDIgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAzIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDUgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA2IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDggYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA5IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIxMCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMTEgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjEyIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIxMyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMTQgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjE1IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIxNiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnCithZGR4NjIxNyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMTggYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjE5IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2FkZHg2MjIwIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScKK2FkZHg2MjIxIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjIyMiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMjMgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjI0IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjIyNSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMjYgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjI3IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjIyOCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMjkgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjMwIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIzMSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMzIgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjMzIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIzNCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMzUgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjM2IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcKK2FkZHg2MjM3IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIzOCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMzkgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCithZGR4NjI0MCBhZGQgJzY1NDMyMTAxMjM0NTY3ODgnIDAuNDk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyNDEgYWRkICc2NTQzMjEwMTIzNDU2Nzg4JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjQyIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OCcgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCithZGR4NjI1MCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknCithZGR4NjI1MSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyNTIgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjUzIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjI1NCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyNTUgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjU2IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjI1NyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyNTggYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjU5IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjI2MCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyNjEgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjYyIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjI2MyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyNjQgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjY1IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjI2NiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnCithZGR4NjI2NyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyNjggYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjY5IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIDEgaW4gbGFzdCBwbGFjZSB0ZXN0cworcm91bmRpbmc6IGhhbGZfZXZlbgorYWRkeDYzMDEgYWRkICAtMSAgIDEgICAgICAtPiAgIDAKK2FkZHg2MzAyIGFkZCAgIDAgICAxICAgICAgLT4gICAxCithZGR4NjMwMyBhZGQgICAxICAgMSAgICAgIC0+ICAgMgorYWRkeDYzMDQgYWRkICAxMiAgIDEgICAgICAtPiAgMTMKK2FkZHg2MzA1IGFkZCAgOTggICAxICAgICAgLT4gIDk5CithZGR4NjMwNiBhZGQgIDk5ICAgMSAgICAgIC0+IDEwMAorYWRkeDYzMDcgYWRkIDEwMCAgIDEgICAgICAtPiAxMDEKK2FkZHg2MzA4IGFkZCAxMDEgICAxICAgICAgLT4gMTAyCithZGR4NjMwOSBhZGQgIC0xICAtMSAgICAgIC0+ICAtMgorYWRkeDYzMTAgYWRkICAgMCAgLTEgICAgICAtPiAgLTEKK2FkZHg2MzExIGFkZCAgIDEgIC0xICAgICAgLT4gICAwCithZGR4NjMxMiBhZGQgIDEyICAtMSAgICAgIC0+ICAxMQorYWRkeDYzMTMgYWRkICA5OCAgLTEgICAgICAtPiAgOTcKK2FkZHg2MzE0IGFkZCAgOTkgIC0xICAgICAgLT4gIDk4CithZGR4NjMxNSBhZGQgMTAwICAtMSAgICAgIC0+ICA5OQorYWRkeDYzMTYgYWRkIDEwMSAgLTEgICAgICAtPiAxMDAKKworYWRkeDYzMjEgYWRkIC0wLjAxICAwLjAxICAgIC0+ICAwLjAwCithZGR4NjMyMiBhZGQgIDAuMDAgIDAuMDEgICAgLT4gIDAuMDEKK2FkZHg2MzIzIGFkZCAgMC4wMSAgMC4wMSAgICAtPiAgMC4wMgorYWRkeDYzMjQgYWRkICAwLjEyICAwLjAxICAgIC0+ICAwLjEzCithZGR4NjMyNSBhZGQgIDAuOTggIDAuMDEgICAgLT4gIDAuOTkKK2FkZHg2MzI2IGFkZCAgMC45OSAgMC4wMSAgICAtPiAgMS4wMAorYWRkeDYzMjcgYWRkICAxLjAwICAwLjAxICAgIC0+ICAxLjAxCithZGR4NjMyOCBhZGQgIDEuMDEgIDAuMDEgICAgLT4gIDEuMDIKK2FkZHg2MzI5IGFkZCAtMC4wMSAtMC4wMSAgICAtPiAtMC4wMgorYWRkeDYzMzAgYWRkICAwLjAwIC0wLjAxICAgIC0+IC0wLjAxCithZGR4NjMzMSBhZGQgIDAuMDEgLTAuMDEgICAgLT4gIDAuMDAKK2FkZHg2MzMyIGFkZCAgMC4xMiAtMC4wMSAgICAtPiAgMC4xMQorYWRkeDYzMzMgYWRkICAwLjk4IC0wLjAxICAgIC0+ICAwLjk3CithZGR4NjMzNCBhZGQgIDAuOTkgLTAuMDEgICAgLT4gIDAuOTgKK2FkZHg2MzM1IGFkZCAgMS4wMCAtMC4wMSAgICAtPiAgMC45OQorYWRkeDYzMzYgYWRkICAxLjAxIC0wLjAxICAgIC0+ICAxLjAwCisKKy0tIHNvbWUgbW9yZSBjYXNlcyB3aGVyZSBhZGRpbmcgMCBhZmZlY3RzIHRoZSBjb2VmZmljaWVudAorYWRkeDYzNDAgYWRkIDFFKzMgICAgMCAgICAtPiAgICAgICAgIDEwMDAKK2FkZHg2MzQxIGFkZCAxRSsxNSAgIDAgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMAorYWRkeDYzNDIgYWRkIDFFKzE2ICAgMCAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiAgUm91bmRlZAorYWRkeDYzNDMgYWRkIDFFKzE3ICAgMCAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNyAgUm91bmRlZAorLS0gd2hpY2ggc2ltcGx5IGZvbGxvdyBmcm9tIHRoZXNlIGNhc2VzIC4uLgorYWRkeDYzNDQgYWRkIDFFKzMgICAgMSAgICAtPiAgICAgICAgIDEwMDEKK2FkZHg2MzQ1IGFkZCAxRSsxNSAgIDEgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMQorYWRkeDYzNDYgYWRkIDFFKzE2ICAgMSAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjM0NyBhZGQgMUUrMTcgICAxICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzE3ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MzQ4IGFkZCAxRSszICAgIDcgICAgLT4gICAgICAgICAxMDA3CithZGR4NjM0OSBhZGQgMUUrMTUgICA3ICAgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDcKK2FkZHg2MzUwIGFkZCAxRSsxNiAgIDcgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMUUrMTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYzNTEgYWRkIDFFKzE3ICAgNyAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNyAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRyeXplcm9zIGNhc2VzCithZGR4NjM2MSAgYWRkIDBFKzUwIDEwMDAwRSsxICAtPiAxLjAwMDBFKzUKK2FkZHg2MzYyICBhZGQgMTAwMDBFKzEgMEUtNTAgIC0+IDEwMDAwMC4wMDAwMDAwMDAwICBSb3VuZGVkCithZGR4NjM2MyAgYWRkIDEwMDAwRSsxIDEwMDAwRS01MCAgLT4gMTAwMDAwLjAwMDAwMDAwMDAgIFJvdW5kZWQgSW5leGFjdAorYWRkeDYzNjQgIGFkZCAxMi4zNCAgICAwZS0zOTggIC0+IDEyLjM0MDAwMDAwMDAwMDAwICBSb3VuZGVkCisKKy0tIHVscCByZXBsYWNlbWVudCB0ZXN0cworYWRkeDY0MDAgYWRkICAgMSAgIDc3ZS0xNCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDc3CithZGR4NjQwMSBhZGQgICAxICAgNzdlLTE1ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDc3CithZGR4NjQwMiBhZGQgICAxICAgNzdlLTE2ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorYWRkeDY0MDMgYWRkICAgMSAgIDc3ZS0xNyAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDA0IGFkZCAgIDEgICA3N2UtMTggICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQwNSBhZGQgICAxICAgNzdlLTE5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY0MDYgYWRkICAgMSAgIDc3ZS05OSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDY0MTAgYWRkICAxMCAgIDc3ZS0xNCAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDA3NworYWRkeDY0MTEgYWRkICAxMCAgIDc3ZS0xNSAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDEyIGFkZCAgMTAgICA3N2UtMTYgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjQxMyBhZGQgIDEwICAgNzdlLTE3ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY0MTQgYWRkICAxMCAgIDc3ZS0xOCAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDE1IGFkZCAgMTAgICA3N2UtMTkgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQxNiBhZGQgIDEwICAgNzdlLTk5ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCithZGR4NjQyMCBhZGQgIDc3ZS0xNCAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwNzcKK2FkZHg2NDIxIGFkZCAgNzdlLTE1ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwNzcKK2FkZHg2NDIyIGFkZCAgNzdlLTE2ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCithZGR4NjQyMyBhZGQgIDc3ZS0xNyAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDY0MjQgYWRkICA3N2UtMTggICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDI1IGFkZCAgNzdlLTE5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQyNiBhZGQgIDc3ZS05OSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCithZGR4NjQzMCBhZGQgIDc3ZS0xNCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDc3CithZGR4NjQzMSBhZGQgIDc3ZS0xNSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorYWRkeDY0MzIgYWRkICA3N2UtMTYgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDMzIGFkZCAgNzdlLTE3ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQzNCBhZGQgIDc3ZS0xOCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY0MzUgYWRkICA3N2UtMTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDM2IGFkZCAgNzdlLTk5ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlIHVscHMKK2FkZHg2NDQwIGFkZCAgIDEgICAtNzdlLTE0ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5MjMKK2FkZHg2NDQxIGFkZCAgIDEgICAtNzdlLTE1ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTIzCithZGR4NjQ0MiBhZGQgICAxICAgLTc3ZS0xNiAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5MjMKK2FkZHg2NDQzIGFkZCAgIDEgICAtNzdlLTE3ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDQ0IGFkZCAgIDEgICAtNzdlLTE4ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDQ1IGFkZCAgIDEgICAtNzdlLTE5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY0NDYgYWRkICAgMSAgIC03N2UtOTkgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg2NDUwIGFkZCAgMTAgICAtNzdlLTE0ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTIzCithZGR4NjQ1MSBhZGQgIDEwICAgLTc3ZS0xNSAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5MjMKK2FkZHg2NDUyIGFkZCAgMTAgICAtNzdlLTE2ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDUzIGFkZCAgMTAgICAtNzdlLTE3ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDU0IGFkZCAgMTAgICAtNzdlLTE4ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY0NTUgYWRkICAxMCAgIC03N2UtMTkgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ1NiBhZGQgIDEwICAgLTc3ZS05OSAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDY0NjAgYWRkICAtNzdlLTE0ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTkyMworYWRkeDY0NjEgYWRkICAtNzdlLTE1ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5MjMKK2FkZHg2NDYyIGFkZCAgLTc3ZS0xNiAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTkyMworYWRkeDY0NjMgYWRkICAtNzdlLTE3ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorYWRkeDY0NjQgYWRkICAtNzdlLTE4ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorYWRkeDY0NjUgYWRkICAtNzdlLTE5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ2NiBhZGQgIC03N2UtOTkgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDY0NzAgYWRkICAtNzdlLTE0ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5MjMKK2FkZHg2NDcxIGFkZCAgLTc3ZS0xNSAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTkyMworYWRkeDY0NzIgYWRkICAtNzdlLTE2ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorYWRkeDY0NzMgYWRkICAtNzdlLTE3ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorYWRkeDY0NzQgYWRkICAtNzdlLTE4ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ3NSBhZGQgIC03N2UtMTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDc2IGFkZCAgLTc3ZS05OSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBuZWdhdGl2ZSB1bHBzCithZGR4NjQ4MCBhZGQgIC0xICAgIDc3ZS0xNCAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTkyMworYWRkeDY0ODEgYWRkICAtMSAgICA3N2UtMTUgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTIzCithZGR4NjQ4MiBhZGQgIC0xICAgIDc3ZS0xNiAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTIzCithZGR4NjQ4MyBhZGQgIC0xICAgIDc3ZS0xNyAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorYWRkeDY0ODQgYWRkICAtMSAgICA3N2UtMTggICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDg1IGFkZCAgLTEgICAgNzdlLTE5ICAgICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDg2IGFkZCAgLTEgICAgNzdlLTk5ICAgICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDY0OTAgYWRkIC0xMCAgICA3N2UtMTQgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTIzCithZGR4NjQ5MSBhZGQgLTEwICAgIDc3ZS0xNSAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTIzCithZGR4NjQ5MiBhZGQgLTEwICAgIDc3ZS0xNiAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorYWRkeDY0OTMgYWRkIC0xMCAgICA3N2UtMTcgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDk0IGFkZCAtMTAgICAgNzdlLTE4ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDk1IGFkZCAtMTAgICAgNzdlLTE5ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDk2IGFkZCAtMTAgICAgNzdlLTk5ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDY1MDAgYWRkICAgNzdlLTE0ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5MjMKK2FkZHg2NTAxIGFkZCAgIDc3ZS0xNSAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTkyMworYWRkeDY1MDIgYWRkICAgNzdlLTE2ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTkyMworYWRkeDY1MDMgYWRkICAgNzdlLTE3ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NTA0IGFkZCAgIDc3ZS0xOCAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NjUwNSBhZGQgICA3N2UtMTkgICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjUwNiBhZGQgICA3N2UtOTkgICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg2NTEwIGFkZCAgIDc3ZS0xNCAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTkyMworYWRkeDY1MTEgYWRkICAgNzdlLTE1ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTkyMworYWRkeDY1MTIgYWRkICAgNzdlLTE2ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NTEzIGFkZCAgIDc3ZS0xNyAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NjUxNCBhZGQgICA3N2UtMTggICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjUxNSBhZGQgICA3N2UtMTkgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjUxNiBhZGQgICA3N2UtOTkgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKworLS0gbG9uZyBvcGVyYW5kcworYWRkeDY1MjEgYWRkIDEwMTIzNDU2MjM0NTY3ODAwMCAwIC0+IDEuMDEyMzQ1NjIzNDU2NzgwRSsxNyBSb3VuZGVkCithZGR4NjUyMiBhZGQgMCAxMDEyMzQ1NjIzNDU2NzgwMDAgLT4gMS4wMTIzNDU2MjM0NTY3ODBFKzE3IFJvdW5kZWQKK2FkZHg2NTIzIGFkZCAxMDEyMzQ1NjIzNDU2NzgwMCAgMCAtPiAxLjAxMjM0NTYyMzQ1Njc4MEUrMTYgUm91bmRlZAorYWRkeDY1MjQgYWRkIDAgMTAxMjM0NTYyMzQ1Njc4MDAgIC0+IDEuMDEyMzQ1NjIzNDU2NzgwRSsxNiBSb3VuZGVkCithZGR4NjUyNSBhZGQgMTAxMjM0NTYyMzQ1Njc4OTAgIDAgLT4gMS4wMTIzNDU2MjM0NTY3ODlFKzE2IFJvdW5kZWQKK2FkZHg2NTI2IGFkZCAwIDEwMTIzNDU2MjM0NTY3ODkwICAtPiAxLjAxMjM0NTYyMzQ1Njc4OUUrMTYgUm91bmRlZAorYWRkeDY1MjcgYWRkIDEwMTIzNDU2MjM0NTY3ODkxICAwIC0+IDEuMDEyMzQ1NjIzNDU2Nzg5RSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NTI4IGFkZCAwIDEwMTIzNDU2MjM0NTY3ODkxICAtPiAxLjAxMjM0NTYyMzQ1Njc4OUUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjUyOSBhZGQgMTAxMjM0NTYyMzQ1Njc4OTAxIDAgLT4gMS4wMTIzNDU2MjM0NTY3ODlFKzE3IEluZXhhY3QgUm91bmRlZAorYWRkeDY1MzAgYWRkIDAgMTAxMjM0NTYyMzQ1Njc4OTAxIC0+IDEuMDEyMzQ1NjIzNDU2Nzg5RSsxNyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NTMxIGFkZCAxMDEyMzQ1NjIzNDU2Nzg5NiAgMCAtPiAxLjAxMjM0NTYyMzQ1Njc5MEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjUzMiBhZGQgMCAxMDEyMzQ1NjIzNDU2Nzg5NiAgLT4gMS4wMTIzNDU2MjM0NTY3OTBFKzE2IEluZXhhY3QgUm91bmRlZAorCistLSB2ZXJpZnkgYSBxdWVyeQorcm91bmRpbmc6ICAgICBkb3duCithZGR4NjU2MSBhZGQgMWUtMzk4IDkuMDAwMDAwMDAwMDAwMDAwRSszODQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NTYyIGFkZCAgICAgIDAgOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IFJvdW5kZWQKKy0tIGFuZCB1c2luZyBkZWNpbWFsNjQgYm91bmRzLi4uCityb3VuZGluZzogICAgIGRvd24KK2FkZHg2NTYzIGFkZCAxZS0zODggOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IEluZXhhY3QgUm91bmRlZAorYWRkeDY1NjQgYWRkICAgICAgMCA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgUm91bmRlZAorCistLSBtb3JlIHplcm9zLCBldGMuCityb3VuZGluZzogaGFsZl9ldmVuCisKK2FkZHg2NzAxIGFkZCA1LjAwIDEuMDBFLTMgLT4gNS4wMDEwMAorYWRkeDY3MDIgYWRkIDAwLjAwIDAuMDAwICAtPiAwLjAwMAorYWRkeDY3MDMgYWRkIDAwLjAwIDBFLTMgICAtPiAwLjAwMAorYWRkeDY3MDQgYWRkIDBFLTMgIDAwLjAwICAtPiAwLjAwMAorCithZGR4NjcxMCBhZGQgMEUrMyAgMDAuMDAgIC0+IDAuMDAKK2FkZHg2NzExIGFkZCAwRSszICAwMC4wICAgLT4gMC4wCithZGR4NjcxMiBhZGQgMEUrMyAgMDAuICAgIC0+IDAKK2FkZHg2NzEzIGFkZCAwRSszICAwMC5FKzEgLT4gMEUrMQorYWRkeDY3MTQgYWRkIDBFKzMgIDAwLkUrMiAtPiAwRSsyCithZGR4NjcxNSBhZGQgMEUrMyAgMDAuRSszIC0+IDBFKzMKK2FkZHg2NzE2IGFkZCAwRSszICAwMC5FKzQgLT4gMEUrMworYWRkeDY3MTcgYWRkIDBFKzMgIDAwLkUrNSAtPiAwRSszCithZGR4NjcxOCBhZGQgMEUrMyAgLTAwLjAgICAtPiAwLjAKK2FkZHg2NzE5IGFkZCAwRSszICAtMDAuICAgIC0+IDAKK2FkZHg2NzMxIGFkZCAwRSszICAtMDAuRSsxIC0+IDBFKzEKKworYWRkeDY3MjAgYWRkIDAwLjAwICAwRSszICAtPiAwLjAwCithZGR4NjcyMSBhZGQgMDAuMCAgIDBFKzMgIC0+IDAuMAorYWRkeDY3MjIgYWRkIDAwLiAgICAwRSszICAtPiAwCithZGR4NjcyMyBhZGQgMDAuRSsxIDBFKzMgIC0+IDBFKzEKK2FkZHg2NzI0IGFkZCAwMC5FKzIgMEUrMyAgLT4gMEUrMgorYWRkeDY3MjUgYWRkIDAwLkUrMyAwRSszICAtPiAwRSszCithZGR4NjcyNiBhZGQgMDAuRSs0IDBFKzMgIC0+IDBFKzMKK2FkZHg2NzI3IGFkZCAwMC5FKzUgMEUrMyAgLT4gMEUrMworYWRkeDY3MjggYWRkIC0wMC4wMCAwRSszICAtPiAwLjAwCithZGR4NjcyOSBhZGQgLTAwLjAgIDBFKzMgIC0+IDAuMAorYWRkeDY3MzAgYWRkIC0wMC4gICAwRSszICAtPiAwCisKK2FkZHg2NzMyIGFkZCAgMCAgICAgMCAgICAgLT4gIDAKK2FkZHg2NzMzIGFkZCAgMCAgICAtMCAgICAgLT4gIDAKK2FkZHg2NzM0IGFkZCAtMCAgICAgMCAgICAgLT4gIDAKK2FkZHg2NzM1IGFkZCAtMCAgICAtMCAgICAgLT4gLTAgICAgIC0tIElFRUUgODU0IHNwZWNpYWwgY2FzZQorCithZGR4NjczNiBhZGQgIDEgICAgLTEgICAgIC0+ICAwCithZGR4NjczNyBhZGQgLTEgICAgLTEgICAgIC0+IC0yCithZGR4NjczOCBhZGQgIDEgICAgIDEgICAgIC0+ICAyCithZGR4NjczOSBhZGQgLTEgICAgIDEgICAgIC0+ICAwCisKK2FkZHg2NzQxIGFkZCAgMCAgICAtMSAgICAgLT4gLTEKK2FkZHg2NzQyIGFkZCAtMCAgICAtMSAgICAgLT4gLTEKK2FkZHg2NzQzIGFkZCAgMCAgICAgMSAgICAgLT4gIDEKK2FkZHg2NzQ0IGFkZCAtMCAgICAgMSAgICAgLT4gIDEKK2FkZHg2NzQ1IGFkZCAtMSAgICAgMCAgICAgLT4gLTEKK2FkZHg2NzQ2IGFkZCAtMSAgICAtMCAgICAgLT4gLTEKK2FkZHg2NzQ3IGFkZCAgMSAgICAgMCAgICAgLT4gIDEKK2FkZHg2NzQ4IGFkZCAgMSAgICAtMCAgICAgLT4gIDEKKworYWRkeDY3NTEgYWRkICAwLjAgIC0xICAgICAtPiAtMS4wCithZGR4Njc1MiBhZGQgLTAuMCAgLTEgICAgIC0+IC0xLjAKK2FkZHg2NzUzIGFkZCAgMC4wICAgMSAgICAgLT4gIDEuMAorYWRkeDY3NTQgYWRkIC0wLjAgICAxICAgICAtPiAgMS4wCithZGR4Njc1NSBhZGQgLTEuMCAgIDAgICAgIC0+IC0xLjAKK2FkZHg2NzU2IGFkZCAtMS4wICAtMCAgICAgLT4gLTEuMAorYWRkeDY3NTcgYWRkICAxLjAgICAwICAgICAtPiAgMS4wCithZGR4Njc1OCBhZGQgIDEuMCAgLTAgICAgIC0+ICAxLjAKKworYWRkeDY3NjEgYWRkICAwICAgIC0xLjAgICAtPiAtMS4wCithZGR4Njc2MiBhZGQgLTAgICAgLTEuMCAgIC0+IC0xLjAKK2FkZHg2NzYzIGFkZCAgMCAgICAgMS4wICAgLT4gIDEuMAorYWRkeDY3NjQgYWRkIC0wICAgICAxLjAgICAtPiAgMS4wCithZGR4Njc2NSBhZGQgLTEgICAgIDAuMCAgIC0+IC0xLjAKK2FkZHg2NzY2IGFkZCAtMSAgICAtMC4wICAgLT4gLTEuMAorYWRkeDY3NjcgYWRkICAxICAgICAwLjAgICAtPiAgMS4wCithZGR4Njc2OCBhZGQgIDEgICAgLTAuMCAgIC0+ICAxLjAKKworYWRkeDY3NzEgYWRkICAwLjAgIC0xLjAgICAtPiAtMS4wCithZGR4Njc3MiBhZGQgLTAuMCAgLTEuMCAgIC0+IC0xLjAKK2FkZHg2NzczIGFkZCAgMC4wICAgMS4wICAgLT4gIDEuMAorYWRkeDY3NzQgYWRkIC0wLjAgICAxLjAgICAtPiAgMS4wCithZGR4Njc3NSBhZGQgLTEuMCAgIDAuMCAgIC0+IC0xLjAKK2FkZHg2Nzc2IGFkZCAtMS4wICAtMC4wICAgLT4gLTEuMAorYWRkeDY3NzcgYWRkICAxLjAgICAwLjAgICAtPiAgMS4wCithZGR4Njc3OCBhZGQgIDEuMCAgLTAuMCAgIC0+ICAxLjAKKworLS0gU3BlY2lhbHMKK2FkZHg2NzgwIGFkZCAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CithZGR4Njc4MSBhZGQgLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorYWRkeDY3ODIgYWRkIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2FkZHg2NzgzIGFkZCAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CithZGR4Njc4NCBhZGQgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorYWRkeDY3ODUgYWRkIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2FkZHg2Nzg2IGFkZCAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CithZGR4Njc4NyBhZGQgLTEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDY3ODggYWRkIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2FkZHg2Nzg5IGFkZCAtMSAgICAtSW5mICAgLT4gLUluZmluaXR5CithZGR4Njc5MCBhZGQgLTAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDY3OTEgYWRkICAwICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2FkZHg2NzkyIGFkZCAgMSAgICAtSW5mICAgLT4gLUluZmluaXR5CithZGR4Njc5MyBhZGQgIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDY3OTQgYWRkICBJbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCithZGR4NjgwMCBhZGQgIEluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4NjgwMSBhZGQgIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorYWRkeDY4MDIgYWRkICBJbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2FkZHg2ODAzIGFkZCAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CithZGR4NjgwNCBhZGQgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorYWRkeDY4MDUgYWRkICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2FkZHg2ODA2IGFkZCAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CithZGR4NjgwNyBhZGQgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorYWRkeDY4MDggYWRkIC0xMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2FkZHg2ODA5IGFkZCAtSW5mICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODEwIGFkZCAtMSAgICAgSW5mICAgLT4gIEluZmluaXR5CithZGR4NjgxMSBhZGQgLTAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorYWRkeDY4MTIgYWRkICAwICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2FkZHg2ODEzIGFkZCAgMSAgICAgSW5mICAgLT4gIEluZmluaXR5CithZGR4NjgxNCBhZGQgIDEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorYWRkeDY4MTUgYWRkICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworYWRkeDY4MjEgYWRkICBOYU4gLUluZiAgICAtPiAgTmFOCithZGR4NjgyMiBhZGQgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2FkZHg2ODIzIGFkZCAgTmFOIC0xICAgICAgLT4gIE5hTgorYWRkeDY4MjQgYWRkICBOYU4gLTAgICAgICAtPiAgTmFOCithZGR4NjgyNSBhZGQgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2FkZHg2ODI2IGFkZCAgTmFOICAxICAgICAgLT4gIE5hTgorYWRkeDY4MjcgYWRkICBOYU4gIDEwMDAgICAtPiAgTmFOCithZGR4NjgyOCBhZGQgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2FkZHg2ODI5IGFkZCAgTmFOICBOYU4gICAgLT4gIE5hTgorYWRkeDY4MzAgYWRkIC1JbmYgIE5hTiAgICAtPiAgTmFOCithZGR4NjgzMSBhZGQgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2FkZHg2ODMyIGFkZCAtMSAgICBOYU4gICAgLT4gIE5hTgorYWRkeDY4MzMgYWRkIC0wICAgIE5hTiAgICAtPiAgTmFOCithZGR4NjgzNCBhZGQgIDAgICAgTmFOICAgIC0+ICBOYU4KK2FkZHg2ODM1IGFkZCAgMSAgICBOYU4gICAgLT4gIE5hTgorYWRkeDY4MzYgYWRkICAxMDAwIE5hTiAgICAtPiAgTmFOCithZGR4NjgzNyBhZGQgIEluZiAgTmFOICAgIC0+ICBOYU4KKworYWRkeDY4NDEgYWRkICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NDIgYWRkICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NDMgYWRkICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NDQgYWRkICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NDUgYWRkICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NDYgYWRkICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NDcgYWRkICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NDggYWRkICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NDkgYWRkICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NTAgYWRkICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NTEgYWRkIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NTIgYWRkIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NTMgYWRkIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NTQgYWRkIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NTUgYWRkICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NTYgYWRkICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NTcgYWRkICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NTggYWRkICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NTkgYWRkICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCithZGR4Njg2MSBhZGQgIE5hTjEgICAtSW5mICAgIC0+ICBOYU4xCithZGR4Njg2MiBhZGQgK05hTjIgICAtMTAwMCAgIC0+ICBOYU4yCithZGR4Njg2MyBhZGQgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCithZGR4Njg2NCBhZGQgIE5hTjQgICAgSW5mICAgIC0+ICBOYU40CithZGR4Njg2NSBhZGQgIE5hTjUgICArTmFONiAgIC0+ICBOYU41CithZGR4Njg2NiBhZGQgLUluZiAgICAgTmFONyAgIC0+ICBOYU43CithZGR4Njg2NyBhZGQgLTEwMDAgICAgTmFOOCAgIC0+ICBOYU44CithZGR4Njg2OCBhZGQgIDEwMDAgICAgTmFOOSAgIC0+ICBOYU45CithZGR4Njg2OSBhZGQgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorYWRkeDY4NzEgYWRkICBzTmFOMTEgIC1JbmYgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCithZGR4Njg3MiBhZGQgIHNOYU4xMiAgLTEwMDAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODczIGFkZCAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NzQgYWRkICBzTmFOMTQgICBOYU4xNyAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCithZGR4Njg3NSBhZGQgIHNOYU4xNSAgc05hTjE4IC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODc2IGFkZCAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NzcgYWRkIC1JbmYgICAgK3NOYU4yMCAtPiAgTmFOMjAgIEludmFsaWRfb3BlcmF0aW9uCithZGR4Njg3OCBhZGQgLTEwMDAgICAgc05hTjIxIC0+ICBOYU4yMSAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODc5IGFkZCAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4ODAgYWRkICBJbmYgICAgIHNOYU4yMyAtPiAgTmFOMjMgIEludmFsaWRfb3BlcmF0aW9uCithZGR4Njg4MSBhZGQgK05hTjI1ICArc05hTjI0IC0+ICBOYU4yNCAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODgyIGFkZCAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2CithZGR4Njg4MyBhZGQgLXNOYU4yNyAgc05hTjI5IC0+IC1OYU4yNyAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODg0IGFkZCAgMTAwMCAgICAtTmFOMzAgLT4gLU5hTjMwCithZGR4Njg4NSBhZGQgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gbm93IHRoZSBjYXNlIHdoZXJlIHdlIGNhbiBnZXQgdW5kZXJmbG93IGJ1dCB0aGUgcmVzdWx0IGlzIG5vcm1hbAorLS0gW25vdGUgdGhpcyBjYW4ndCBoYXBwZW4gaWYgdGhlIG9wZXJhbmRzIGFyZSBhbHNvIGJvdW5kZWQsIGFzIHdlCistLSBjYW5ub3QgcmVwcmVzZW50IDFFLTM5OSwgZm9yIGV4YW1wbGVdCisKK2FkZHg2NTcxIGFkZCAgICAgICAxRS0zODMgICAgICAgMCAgLT4gMUUtMzgzCithZGR4NjU3MiBhZGQgICAgICAgMUUtMzg0ICAgICAgIDAgIC0+IDFFLTM4NCAgIFN1Ym5vcm1hbAorYWRkeDY1NzMgYWRkICAgICAgIDFFLTM4MyAgMUUtMzg0ICAtPiAxLjFFLTM4MworYWRkeDY1NzQgc3VidHJhY3QgIDFFLTM4MyAgMUUtMzg0ICAtPiAgIDlFLTM4NCBTdWJub3JtYWwKKworLS0gSGVyZSB3ZSBleHBsb3JlIHRoZSBib3VuZGFyeSBvZiByb3VuZGluZyBhIHN1Ym5vcm1hbCB0byBObWluCithZGR4NjU3NSBzdWJ0cmFjdCAgMUUtMzgzICAxRS0zOTggIC0+ICAgOS45OTk5OTk5OTk5OTk5OUUtMzg0ICBTdWJub3JtYWwKK2FkZHg2NTc2IHN1YnRyYWN0ICAxRS0zODMgIDFFLTM5OCAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgIFN1Ym5vcm1hbAorYWRkeDY1Nzcgc3VidHJhY3QgIDFFLTM4MyAgMUUtMzk5ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2FkZHg2NTc4IHN1YnRyYWN0ICAxRS0zODMgIDFFLTQwMCAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCithZGR4NjU3OSBzdWJ0cmFjdCAgMUUtMzgzICAxRS00MDEgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorYWRkeDY1ODAgc3VidHJhY3QgIDFFLTM4MyAgMUUtNDAyICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKKworLS0gY2hlY2sgb3ZlcmZsb3cgZWRnZSBjYXNlCistLSAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2FkZHg2OTcyIGFwcGx5ICAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2FkZHg2OTczIGFkZCAgICAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgMSAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCithZGR4Njk3NCBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDEgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorYWRkeDY5NzUgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAxRSszNjkgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDY5NzYgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA5RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDY5NzcgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA4RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDY5NzggYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA3RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDY5NzkgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA2RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDY5ODAgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA1RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDY5ODEgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA0RSszNjggIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCithZGR4Njk4MiBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDNFKzM2OCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTgzIGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgMkUrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorYWRkeDY5ODQgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAxRSszNjggIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg2OTg1IGFwcGx5ICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CithZGR4Njk4NiBhZGQgICAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLTEgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTg3IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMSAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorYWRkeDY5ODggYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0xRSszNjkgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTg5IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtOUUrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4Njk5MCBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLThFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDY5OTEgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC03RSszNjggIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTkyIGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtNkUrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4Njk5MyBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTVFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDY5OTQgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC00RSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorYWRkeDY5OTUgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0zRSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorYWRkeDY5OTYgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0yRSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorYWRkeDY5OTcgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0xRSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorCistLSBBbmQgZm9yIHJvdW5kIGRvd24gZnVsbCBhbmQgc3Vibm9ybWFsIHJlc3VsdHMKK3JvdW5kaW5nOiAgICAgZG93bgorYWRkeDYxMTAwIGFkZCAxZSsyIC0xZS0zODMgICAgLT4gOTkuOTk5OTk5OTk5OTk5OTkgUm91bmRlZCBJbmV4YWN0CithZGR4NjExMDEgYWRkIDFlKzEgLTFlLTM4MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4NjExMDMgYWRkICAgKzEgLTFlLTM4MyAgICAtPiAwLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTA0IGFkZCAxZS0xIC0xZS0zODMgICAgLT4gMC4wOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4NjExMDUgYWRkIDFlLTIgLTFlLTM4MyAgICAtPiAwLjAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4NjExMDYgYWRkIDFlLTMgLTFlLTM4MyAgICAtPiAwLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTA3IGFkZCAxZS00IC0xZS0zODMgICAgLT4gMC4wMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4NjExMDggYWRkIDFlLTUgLTFlLTM4MyAgICAtPiAwLjAwMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4NjExMDkgYWRkIDFlLTYgLTFlLTM4MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICAgY2VpbGluZworYWRkeDYxMTEwIGFkZCAtMWUrMiArMWUtMzgzICAgLT4gLTk5Ljk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTExIGFkZCAtMWUrMSArMWUtMzgzICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHg2MTExMyBhZGQgICAgLTEgKzFlLTM4MyAgIC0+IC0wLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTE0IGFkZCAtMWUtMSArMWUtMzgzICAgLT4gLTAuMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTE1IGFkZCAtMWUtMiArMWUtMzgzICAgLT4gLTAuMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHg2MTExNiBhZGQgLTFlLTMgKzFlLTM4MyAgIC0+IC0wLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTE3IGFkZCAtMWUtNCArMWUtMzgzICAgLT4gLTAuMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTE4IGFkZCAtMWUtNSArMWUtMzgzICAgLT4gLTAuMDAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHg2MTExOSBhZGQgLTFlLTYgKzFlLTM4MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKKy0tIHRlc3RzIGJhc2VkIG9uIEd1bm5hciBEZWduYm9sJ3MgZWRnZSBjYXNlCityb3VuZGluZzogICAgIGhhbGZfZXZlbgorCithZGR4NjEzMDAgYWRkIDFFMTYgIC0wLjUgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMTAgYWRkIDFFMTYgIC0wLjUxICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMTEgYWRkIDFFMTYgIC0wLjUwMSAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMTIgYWRkIDFFMTYgIC0wLjUwMDEgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMTMgYWRkIDFFMTYgIC0wLjUwMDAxICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMTQgYWRkIDFFMTYgIC0wLjUwMDAwMSAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMTUgYWRkIDFFMTYgIC0wLjUwMDAwMDEgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMTYgYWRkIDFFMTYgIC0wLjUwMDAwMDAxICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMTcgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMSAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMTggYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDEgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMTkgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAxICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMjAgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMSAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMjEgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDEgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMjIgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAxICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMjMgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMjQgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMjUgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMDAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMjYgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMCAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMjcgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMjggYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMjkgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMzAgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMzEgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMzIgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMCAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMzMgYWRkIDFFMTYgIC0wLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMzQgYWRkIDFFMTYgIC0wLjUwMDAwMDAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMzUgYWRkIDFFMTYgIC0wLjUwMDAwMCAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMzYgYWRkIDFFMTYgIC0wLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMzcgYWRkIDFFMTYgIC0wLjUwMDAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMzggYWRkIDFFMTYgIC0wLjUwMCAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzMzkgYWRkIDFFMTYgIC0wLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg2MTM0MCBhZGQgMUUxNiAgLTUwMDAwMDAuMDAwMDEwMDAxICAgLT4gIDk5OTk5OTk5OTUwMDAwMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM0MSBhZGQgMUUxNiAgLTUwMDAwMDAuMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTUwMDAwMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDYxMzQ5IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNCAgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM1MCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5ICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNTEgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTkgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzUyIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM1MyBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5ICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNTQgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTkgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzU1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM1NiBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5ICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNTcgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTkgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzU4IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM1OSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5ICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNjAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTkgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzYxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM2MiBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTk5ICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNjMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OTkgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzY0IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5OSAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM2NSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMDAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNjcgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzY4IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM2OSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNzAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzcxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM3MiBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNzMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzc0IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM3NSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNzYgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzc3IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM3OCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNzkgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzgwIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM4MSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzODIgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzgzIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM4NCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAxICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzODUgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAxICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzg2IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM4NyBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAxICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzODggYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAxICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzg5IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAxICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM5MCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAxICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzOTEgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAxICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzkyIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAxICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM5MyBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAxICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzOTQgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAxICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzk1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAxICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM5NiBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUxICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCisKKy0tIE1vcmUgR0QgZWRnZSBjYXNlcywgd2hlcmUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB1bmFkanVzdGVkCistLSBleHBvbmVudHMgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gcHJlY2lzaW9uIGFuZCBvbmUgc2lkZSBpcyAwCithZGR4NjE0MjAgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1ICAgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDIxIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMSAgLT4gMC4xMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0MjIgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0yICAtPiAwLjAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0MjMgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0zICAtPiAwLjAwMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDI0IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNCAgLT4gMC4wMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0MjUgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS01ICAtPiAwLjAwMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0MjYgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS02ICAtPiAwLjAwMDAwMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDI3IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNyAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTcKK2FkZHg2MTQyOCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTggIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS04CithZGR4NjE0MjkgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS05ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOQorYWRkeDYxNDMwIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEwCithZGR4NjE0MzEgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMSAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEKK2FkZHg2MTQzMiBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEyIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMgorYWRkeDYxNDMzIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTMgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEzCithZGR4NjE0MzQgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQKK2FkZHg2MTQzNSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE1IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNQorYWRkeDYxNDM2IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTYgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE2CithZGR4NjE0MzcgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNyAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcKK2FkZHg2MTQzOCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE4IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOAorYWRkeDYxNDM5IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTkgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE5CisKKy0tIHNhbWUsIHJldmVyc2VkIDAKK2FkZHg2MTQ0MCBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgICAgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ0MSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTEgIDAgLT4gMC4xMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NDIgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0yICAwIC0+IDAuMDExMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ0MyBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTMgIDAgLT4gMC4wMDExMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ0NCBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTQgIDAgLT4gMC4wMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NDUgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS01ICAwIC0+IDAuMDAwMDExMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ0NiBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTYgIDAgLT4gMC4wMDAwMDExMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ0NyBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTcgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTcKK2FkZHg2MTQ0OCBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTggIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTgKK2FkZHg2MTQ0OSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTkgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTkKK2FkZHg2MTQ1MCBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTEwIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEwCithZGR4NjE0NTEgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMSAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMQorYWRkeDYxNDUyIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIKK2FkZHg2MTQ1MyBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTEzIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEzCithZGR4NjE0NTQgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNCAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNAorYWRkeDYxNDU1IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUKK2FkZHg2MTQ1NiBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE2IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE2CithZGR4NjE0NTcgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNyAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNworYWRkeDYxNDU4IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTggMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTgKK2FkZHg2MTQ1OSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE5IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE5CisKKy0tIHNhbWUsIEVzIG9uIHRoZSAwCithZGR4NjE0NjAgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0wICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ2MSBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDYyIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMiAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NjMgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0zICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ2NCBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTQgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDY1IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NjYgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS02ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ2NyBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTcgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDY4IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtOCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NjkgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS05ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ3MCBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEwICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDcxIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTEgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NzIgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMiAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ3MyBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEzICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDc0IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTQgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NzUgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKKy0tIG5leHQgZm91ciBmbGFnIFJvdW5kZWQgYmVjYXVzZSB0aGUgMCBleHRlbmRzIHRoZSByZXN1bHQKK2FkZHg2MTQ3NiBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE2ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCithZGR4NjE0NzcgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNyAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorYWRkeDYxNDc4IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTggIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKK2FkZHg2MTQ3OSBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE5ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCisKKy0tIHN1bSBvZiB0d28gb3Bwb3NpdGUtc2lnbiBvcGVyYW5kcyBpcyBleGFjdGx5IDAgYW5kIGZsb29yID0+IC0wCityb3VuZGluZzogICAgaGFsZl91cAorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworYWRkeDYxNTAwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNTAxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNTAyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNTAzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorYWRkeDYxNTA0IGFkZCAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTA1IGFkZCAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTA2IGFkZCAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTA3IGFkZCAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworYWRkeDYxNTExIGFkZCAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNTEyIGFkZCAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNTEzIGFkZCAgMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNTE0IGFkZCAtMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworYWRkeDYxNTE1IGFkZCAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNTE2IGFkZCAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTE3IGFkZCAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTE4IGFkZCAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCityb3VuZGluZzogICAgaGFsZl9kb3duCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCithZGR4NjE1MjAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4NjE1MjEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4NjE1MjIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CithZGR4NjE1MjMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CithZGR4NjE1MjQgYWRkICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1MjUgYWRkIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1MjYgYWRkICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1MjcgYWRkIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCithZGR4NjE1MzEgYWRkICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE1MzIgYWRkIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE1MzMgYWRkICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE1MzQgYWRkIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCithZGR4NjE1MzUgYWRkICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE1MzYgYWRkIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1MzcgYWRkICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1MzggYWRkIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2FkZHg2MTU0MCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHg2MTU0MSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHg2MTU0MiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2FkZHg2MTU0MyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2FkZHg2MTU0NCBhZGQgIDBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHg2MTU0NSBhZGQgLTBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHg2MTU0NiBhZGQgIDBFLTQwMCAgLTBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHg2MTU0NyBhZGQgLTBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQKKy0tIGluZXhhY3QgemVyb3MKK2FkZHg2MTU1MSBhZGQgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg2MTU1MiBhZGQgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg2MTU1MyBhZGQgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg2MTU1NCBhZGQgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2FkZHg2MTU1NSBhZGQgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg2MTU1NiBhZGQgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHg2MTU1NyBhZGQgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHg2MTU1OCBhZGQgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworcm91bmRpbmc6ICAgIHVwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCithZGR4NjE1NjAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4NjE1NjEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4NjE1NjIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CithZGR4NjE1NjMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CithZGR4NjE1NjQgYWRkICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1NjUgYWRkIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1NjYgYWRkICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1NjcgYWRkIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCithZGR4NjE1NzEgYWRkICAxRS00MDEgICAxRS00MDAgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDYxNTcyIGFkZCAtMUUtNDAxICAgMUUtNDAwIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHg2MTU3MyBhZGQgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CithZGR4NjE1NzQgYWRkIC0xRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworYWRkeDYxNTc1IGFkZCAgMUUtNDAxICAgMUUtNDAxIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHg2MTU3NiBhZGQgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHg2MTU3NyBhZGQgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHg2MTU3OCBhZGQgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CisKK3JvdW5kaW5nOiAgICBkb3duCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCithZGR4NjE1ODAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4NjE1ODEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4NjE1ODIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CithZGR4NjE1ODMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CithZGR4NjE1ODQgYWRkICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1ODUgYWRkIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1ODYgYWRkICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1ODcgYWRkIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCithZGR4NjE1OTEgYWRkICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE1OTIgYWRkIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE1OTMgYWRkICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE1OTQgYWRkIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCithZGR4NjE1OTUgYWRkICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE1OTYgYWRkIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1OTcgYWRkICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1OTggYWRkIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICBjZWlsaW5nCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCithZGR4NjE2MDAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4NjE2MDEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4NjE2MDIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CithZGR4NjE2MDMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CithZGR4NjE2MDQgYWRkICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE2MDUgYWRkIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE2MDYgYWRkICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE2MDcgYWRkIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCithZGR4NjE2MTEgYWRkICAxRS00MDEgICAxRS00MDAgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDYxNjEyIGFkZCAtMUUtNDAxICAgMUUtNDAwIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHg2MTYxMyBhZGQgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg2MTYxNCBhZGQgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2FkZHg2MTYxNSBhZGQgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CithZGR4NjE2MTYgYWRkIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE2MTcgYWRkICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE2MTggYWRkIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKKy0tIGFuZCB0aGUgZXh0cmEtc3BlY2lhbCB1Z2x5IGNhc2U7IHVudXN1YWwgbWludXNlcyBtYXJrZWQgYnkgLS0gKgorcm91bmRpbmc6ICAgIGZsb29yCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCithZGR4NjE2MjAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4NjE2MjEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCithZGR4NjE2MjIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCithZGR4NjE2MjMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CithZGR4NjE2MjQgYWRkICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE2MjUgYWRkIC0wRS00MDAgICAwRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkICAtLSAqCithZGR4NjE2MjYgYWRkICAwRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkICAtLSAqCithZGR4NjE2MjcgYWRkIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCithZGR4NjE2MzEgYWRkICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE2MzIgYWRkIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE2MzMgYWRkICAxRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDYxNjM0IGFkZCAtMUUtNDAxICAtMUUtNDAwIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2FkZHg2MTYzNSBhZGQgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg2MTYzNiBhZGQgLTFFLTQwMSAgIDFFLTQwMSAtPiAtMEUtMzk4IENsYW1wZWQgIC0tICoKK2FkZHg2MTYzNyBhZGQgIDFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IENsYW1wZWQgIC0tICoKK2FkZHg2MTYzOCBhZGQgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CisKKy0tIEV4YW1wbGVzIGZyb20gU1FMIHByb3Bvc2FsIChLcmlzaG5hIEt1bGthcm5pKQorYWRkeDYxNzAxIGFkZCAxMzBFLTIgICAgMTIwRS0yICAgIC0+IDIuNTAKK2FkZHg2MTcwMiBhZGQgMTMwRS0yICAgIDEyRS0xICAgICAtPiAyLjUwCithZGR4NjE3MDMgYWRkIDEzMEUtMiAgICAxRTAgICAgICAgLT4gMi4zMAorYWRkeDYxNzA0IGFkZCAxRTIgICAgICAgMUU0ICAgICAgIC0+IDEuMDFFKzQKK2FkZHg2MTcwNSBzdWJ0cmFjdCAxMzBFLTIgIDEyMEUtMiAtPiAwLjEwCithZGR4NjE3MDYgc3VidHJhY3QgMTMwRS0yICAxMkUtMSAgLT4gMC4xMAorYWRkeDYxNzA3IHN1YnRyYWN0IDEzMEUtMiAgMUUwICAgIC0+IDAuMzAKK2FkZHg2MTcwOCBzdWJ0cmFjdCAxRTIgICAgIDFFNCAgICAtPiAtOS45RSszCisKKy0tIEdhcHB5IGNvZWZmaWNpZW50czsgY2hlY2sgcmVzaWR1ZSBoYW5kbGluZyBldmVuIHdpdGggZnVsbCBjb2VmZmljaWVudCBnYXAKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KKworYWRkeDYyMDAxIGFkZCAxMjM0NTY3ODkwMTIzNDU2IDEgICAgICAtPiAxMjM0NTY3ODkwMTIzNDU3CithZGR4NjIwMDIgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgMC42ICAgIC0+IDEyMzQ1Njc4OTAxMjM0NTcgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDAzIGFkZCAxMjM0NTY3ODkwMTIzNDU2IDAuMDYgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAwNCBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0zICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMDUgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtNCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDA2IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTUgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAwNyBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS02ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMDggYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtNyAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDA5IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTggICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAxMCBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS05ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMTEgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDEyIGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTExICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAxMyBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xMiAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMTQgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTMgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDE1IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTE0ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAxNiBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xNSAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMTcgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTYgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDE4IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTE3ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAxOSBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xOCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMjAgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTkgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDIxIGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTIwICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gd2lkZW5pbmcgc2Vjb25kIGFyZ3VtZW50IGF0IGdhcAorYWRkeDYyMDMwIGFkZCAxMjM0NTY3OCAxICAgICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OQorYWRkeDYyMDMxIGFkZCAxMjM0NTY3OCAwLjEgICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xCithZGR4NjIwMzIgYWRkIDEyMzQ1Njc4IDAuMTIgICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyCithZGR4NjIwMzMgYWRkIDEyMzQ1Njc4IDAuMTIzICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMworYWRkeDYyMDM0IGFkZCAxMjM0NTY3OCAwLjEyMzQgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0CithZGR4NjIwMzUgYWRkIDEyMzQ1Njc4IDAuMTIzNDUgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1CithZGR4NjIwMzYgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2ICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1NgorYWRkeDYyMDM3IGFkZCAxMjM0NTY3OCAwLjEyMzQ1NjcgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3CithZGR4NjIwMzggYWRkIDEyMzQ1Njc4IDAuMTIzNDU2NzggICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc4CithZGR4NjIwMzkgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg5ICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDQwIGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NSAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA0MSBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUwICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzggSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNDIgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MSAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDQzIGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAxICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA0NCBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDEgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNDUgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAwMSAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDQ2IGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDAxICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA0NyBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAwMDEgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNDggYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDQ5IGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwMTIzNDU2Cityb3VuZGluZzogaGFsZl9ldmVuCithZGR4NjIwNTAgYWRkIDEyMzQ1Njc4IDAuMDIzNDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDUxIGFkZCAxMjM0NTY3OCAwLjAwMzQ1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA1MiBhZGQgMTIzNDU2NzggMC4wMDA0NTY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwNDU2NzggSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNTMgYWRkIDEyMzQ1Njc4IDAuMDAwMDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDA1Njc4IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDU0IGFkZCAxMjM0NTY3OCAwLjAwMDAwNjc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDY3OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA1NSBhZGQgMTIzNDU2NzggMC4wMDAwMDA3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDAwNzggSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNTYgYWRkIDEyMzQ1Njc4IDAuMDAwMDAwMDc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDU3IGFkZCAxMjM0NTY3OCAwLjAwMDAwMDAwNTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA2MCBhZGQgMTIzNDU2NzggMC4wMjM0NTY3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDIzNDU2NzggSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNjEgYWRkIDEyMzQ1Njc4IDAuMDAzNDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDYyIGFkZCAxMjM0NTY3OCAwLjAwMDQ1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDA0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA2MyBhZGQgMTIzNDU2NzggMC4wMDAwNTY3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwMDU2NzggSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNjQgYWRkIDEyMzQ1Njc4IDAuMDAwMDA2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwNjc4IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDY1IGFkZCAxMjM0NTY3OCAwLjAwMDAwMDc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwMDA3OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA2NiBhZGQgMTIzNDU2NzggMC4wMDAwMDAwNzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNjcgYWRkIDEyMzQ1Njc4IDAuMDAwMDAwMDA1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorLS0gZmFyLW91dCByZXNpZHVlcyAoZnVsbCBjb2VmZmljaWVudCBnYXAgaXMgMTYrMTUgZGlnaXRzKQorcm91bmRpbmc6IHVwCithZGR4NjIwNzAgYWRkIDEyMzQ1Njc4IDFFLTggICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxCithZGR4NjIwNzEgYWRkIDEyMzQ1Njc4IDFFLTkgICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDcyIGFkZCAxMjM0NTY3OCAxRS0xMCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA3MyBhZGQgMTIzNDU2NzggMUUtMTEgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNzQgYWRkIDEyMzQ1Njc4IDFFLTEyICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDc1IGFkZCAxMjM0NTY3OCAxRS0xMyAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA3NiBhZGQgMTIzNDU2NzggMUUtMTQgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNzcgYWRkIDEyMzQ1Njc4IDFFLTE1ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDc4IGFkZCAxMjM0NTY3OCAxRS0xNiAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA3OSBhZGQgMTIzNDU2NzggMUUtMTcgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwODAgYWRkIDEyMzQ1Njc4IDFFLTE4ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDgxIGFkZCAxMjM0NTY3OCAxRS0xOSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA4MiBhZGQgMTIzNDU2NzggMUUtMjAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwODMgYWRkIDEyMzQ1Njc4IDFFLTI1ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDg0IGFkZCAxMjM0NTY3OCAxRS0zMCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA4NSBhZGQgMTIzNDU2NzggMUUtMzEgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwODYgYWRkIDEyMzQ1Njc4IDFFLTMyICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDg3IGFkZCAxMjM0NTY3OCAxRS0zMyAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA4OCBhZGQgMTIzNDU2NzggMUUtMzQgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwODkgYWRkIDEyMzQ1Njc4IDFFLTM1ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorCistLSBwYXlsb2FkIGRlY2FwaXRhdGUKK3ByZWNpc2lvbjogNQorYWRkeDYyMTAwIGFkZCAgICAgIDExICBzTmFOMTIzNDU2Nzg5IC0+ICBOYU41Njc4OSAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2MjEwMSBhZGQgICAgIC0xMSAtc05hTjEyMzQ1Njc4OSAtPiAtTmFONTY3ODkgIEludmFsaWRfb3BlcmF0aW9uCithZGR4NjIxMDIgYWRkICAgICAgMTEgICBOYU4xMjM0NTY3ODkgLT4gIE5hTjU2Nzg5CithZGR4NjIxMDMgYWRkICAgICAtMTEgIC1OYU4xMjM0NTY3ODkgLT4gLU5hTjU2Nzg5CisKKy0tIE51bGwgdGVzdHMKK2FkZHg5OTkwIGFkZCAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FkZHg5OTkxIGFkZCAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvYW5kLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2FuZC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwY2M3ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2FuZC5kZWNUZXN0CkBAIC0wLDAgKzEsMzM4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGFuZC5kZWNUZXN0IC0tIGRpZ2l0d2lzZSBsb2dpY2FsIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworLS0gU2FuaXR5IGNoZWNrICh0cnV0aCB0YWJsZSkKK2FuZHgwMDEgYW5kICAgICAgICAgICAgIDAgICAgMCAtPiAgICAwCithbmR4MDAyIGFuZCAgICAgICAgICAgICAwICAgIDEgLT4gICAgMAorYW5keDAwMyBhbmQgICAgICAgICAgICAgMSAgICAwIC0+ICAgIDAKK2FuZHgwMDQgYW5kICAgICAgICAgICAgIDEgICAgMSAtPiAgICAxCithbmR4MDA1IGFuZCAgICAgICAgICAxMTAwIDEwMTAgLT4gMTAwMAorYW5keDAwNiBhbmQgICAgICAgICAgMTExMSAgIDEwIC0+ICAgMTAKK2FuZHgwMDcgYW5kICAgICAgICAgIDExMTEgMTAxMCAtPiAxMDEwCisKKy0tIGFuZCBhdCBtc2QgYW5kIG1zZC0xCithbmR4MDEwIGFuZCAwMDAwMDAwMDAgMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCithbmR4MDExIGFuZCAwMDAwMDAwMDAgMTAwMDAwMDAwIC0+ICAgICAgICAgICAwCithbmR4MDEyIGFuZCAxMDAwMDAwMDAgMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCithbmR4MDEzIGFuZCAxMDAwMDAwMDAgMTAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwCithbmR4MDE0IGFuZCAwMDAwMDAwMDAgMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCithbmR4MDE1IGFuZCAwMDAwMDAwMDAgMDEwMDAwMDAwIC0+ICAgICAgICAgICAwCithbmR4MDE2IGFuZCAwMTAwMDAwMDAgMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCithbmR4MDE3IGFuZCAwMTAwMDAwMDAgMDEwMDAwMDAwIC0+ICAgIDEwMDAwMDAwCisKKy0tIFZhcmlvdXMgbGVuZ3RocworLS0gICAgICAgICAgMTIzNDU2Nzg5ICAgICAxMjM0NTY3ODkgICAgICAxMjM0NTY3ODkKK2FuZHgwMjEgYW5kIDExMTExMTExMSAgICAgMTExMTExMTExICAtPiAgMTExMTExMTExCithbmR4MDIyIGFuZCAxMTExMTExMTExMTEgIDExMTExMTExMSAgLT4gIDExMTExMTExMQorYW5keDAyMyBhbmQgMTExMTExMTExMTExICAgMTExMTExMTEgIC0+ICAgMTExMTExMTEKK2FuZHgwMjQgYW5kIDExMTExMTExMSAgICAgIDExMTExMTExICAtPiAgIDExMTExMTExCithbmR4MDI1IGFuZCAxMTExMTExMTEgICAgICAgMTExMTExMSAgLT4gICAgMTExMTExMQorYW5keDAyNiBhbmQgMTExMTExMTExMTExICAgICAxMTExMTEgIC0+ICAgICAxMTExMTEKK2FuZHgwMjcgYW5kIDExMTExMTExMTExMSAgICAgIDExMTExICAtPiAgICAgIDExMTExCithbmR4MDI4IGFuZCAxMTExMTExMTExMTEgICAgICAgMTExMSAgLT4gICAgICAgMTExMQorYW5keDAyOSBhbmQgMTExMTExMTExMTExICAgICAgICAxMTEgIC0+ICAgICAgICAxMTEKK2FuZHgwMzEgYW5kIDExMTExMTExMTExMSAgICAgICAgIDExICAtPiAgICAgICAgIDExCithbmR4MDMyIGFuZCAxMTExMTExMTExMTEgICAgICAgICAgMSAgLT4gICAgICAgICAgMQorYW5keDAzMyBhbmQgMTExMTExMTExMTExIDExMTExMTExMTEgIC0+ICAxMTExMTExMTEKK2FuZHgwMzQgYW5kIDExMTExMTExMTExIDExMTExMTExMTExICAtPiAgMTExMTExMTExCithbmR4MDM1IGFuZCAxMTExMTExMTExIDExMTExMTExMTExMSAgLT4gIDExMTExMTExMQorYW5keDAzNiBhbmQgMTExMTExMTExIDExMTExMTExMTExMTEgIC0+ICAxMTExMTExMTEKKworYW5keDA0MCBhbmQgMTExMTExMTExICAxMTExMTExMTExMTEgIC0+ICAxMTExMTExMTEKK2FuZHgwNDEgYW5kICAxMTExMTExMSAgMTExMTExMTExMTExICAtPiAgIDExMTExMTExCithbmR4MDQyIGFuZCAgMTExMTExMTEgICAgIDExMTExMTExMSAgLT4gICAxMTExMTExMQorYW5keDA0MyBhbmQgICAxMTExMTExICAgICAxMTExMTExMTEgIC0+ICAgIDExMTExMTEKK2FuZHgwNDQgYW5kICAgIDExMTExMSAgICAgMTExMTExMTExICAtPiAgICAgMTExMTExCithbmR4MDQ1IGFuZCAgICAgMTExMTEgICAgIDExMTExMTExMSAgLT4gICAgICAxMTExMQorYW5keDA0NiBhbmQgICAgICAxMTExICAgICAxMTExMTExMTEgIC0+ICAgICAgIDExMTEKK2FuZHgwNDcgYW5kICAgICAgIDExMSAgICAgMTExMTExMTExICAtPiAgICAgICAgMTExCithbmR4MDQ4IGFuZCAgICAgICAgMTEgICAgIDExMTExMTExMSAgLT4gICAgICAgICAxMQorYW5keDA0OSBhbmQgICAgICAgICAxICAgICAxMTExMTExMTEgIC0+ICAgICAgICAgIDEKKworYW5keDA1MCBhbmQgMTExMTExMTExMSAgMSAgLT4gIDEKK2FuZHgwNTEgYW5kICAxMTExMTExMTEgIDEgIC0+ICAxCithbmR4MDUyIGFuZCAgIDExMTExMTExICAxICAtPiAgMQorYW5keDA1MyBhbmQgICAgMTExMTExMSAgMSAgLT4gIDEKK2FuZHgwNTQgYW5kICAgICAxMTExMTEgIDEgIC0+ICAxCithbmR4MDU1IGFuZCAgICAgIDExMTExICAxICAtPiAgMQorYW5keDA1NiBhbmQgICAgICAgMTExMSAgMSAgLT4gIDEKK2FuZHgwNTcgYW5kICAgICAgICAxMTEgIDEgIC0+ICAxCithbmR4MDU4IGFuZCAgICAgICAgIDExICAxICAtPiAgMQorYW5keDA1OSBhbmQgICAgICAgICAgMSAgMSAgLT4gIDEKKworYW5keDA2MCBhbmQgMTExMTExMTExMSAgMCAgLT4gIDAKK2FuZHgwNjEgYW5kICAxMTExMTExMTEgIDAgIC0+ICAwCithbmR4MDYyIGFuZCAgIDExMTExMTExICAwICAtPiAgMAorYW5keDA2MyBhbmQgICAgMTExMTExMSAgMCAgLT4gIDAKK2FuZHgwNjQgYW5kICAgICAxMTExMTEgIDAgIC0+ICAwCithbmR4MDY1IGFuZCAgICAgIDExMTExICAwICAtPiAgMAorYW5keDA2NiBhbmQgICAgICAgMTExMSAgMCAgLT4gIDAKK2FuZHgwNjcgYW5kICAgICAgICAxMTEgIDAgIC0+ICAwCithbmR4MDY4IGFuZCAgICAgICAgIDExICAwICAtPiAgMAorYW5keDA2OSBhbmQgICAgICAgICAgMSAgMCAgLT4gIDAKKworYW5keDA3MCBhbmQgMSAgMTExMTExMTExMSAgLT4gIDEKK2FuZHgwNzEgYW5kIDEgICAxMTExMTExMTEgIC0+ICAxCithbmR4MDcyIGFuZCAxICAgIDExMTExMTExICAtPiAgMQorYW5keDA3MyBhbmQgMSAgICAgMTExMTExMSAgLT4gIDEKK2FuZHgwNzQgYW5kIDEgICAgICAxMTExMTEgIC0+ICAxCithbmR4MDc1IGFuZCAxICAgICAgIDExMTExICAtPiAgMQorYW5keDA3NiBhbmQgMSAgICAgICAgMTExMSAgLT4gIDEKK2FuZHgwNzcgYW5kIDEgICAgICAgICAxMTEgIC0+ICAxCithbmR4MDc4IGFuZCAxICAgICAgICAgIDExICAtPiAgMQorYW5keDA3OSBhbmQgMSAgICAgICAgICAgMSAgLT4gIDEKKworYW5keDA4MCBhbmQgMCAgMTExMTExMTExMSAgLT4gIDAKK2FuZHgwODEgYW5kIDAgICAxMTExMTExMTEgIC0+ICAwCithbmR4MDgyIGFuZCAwICAgIDExMTExMTExICAtPiAgMAorYW5keDA4MyBhbmQgMCAgICAgMTExMTExMSAgLT4gIDAKK2FuZHgwODQgYW5kIDAgICAgICAxMTExMTEgIC0+ICAwCithbmR4MDg1IGFuZCAwICAgICAgIDExMTExICAtPiAgMAorYW5keDA4NiBhbmQgMCAgICAgICAgMTExMSAgLT4gIDAKK2FuZHgwODcgYW5kIDAgICAgICAgICAxMTEgIC0+ICAwCithbmR4MDg4IGFuZCAwICAgICAgICAgIDExICAtPiAgMAorYW5keDA4OSBhbmQgMCAgICAgICAgICAgMSAgLT4gIDAKKworYW5keDA5MCBhbmQgMDExMTExMTExICAxMTExMTExMTEgIC0+ICAgMTExMTExMTEKK2FuZHgwOTEgYW5kIDEwMTExMTExMSAgMTExMTExMTExICAtPiAgMTAxMTExMTExCithbmR4MDkyIGFuZCAxMTAxMTExMTEgIDExMTExMTExMSAgLT4gIDExMDExMTExMQorYW5keDA5MyBhbmQgMTExMDExMTExICAxMTExMTExMTEgIC0+ICAxMTEwMTExMTEKK2FuZHgwOTQgYW5kIDExMTEwMTExMSAgMTExMTExMTExICAtPiAgMTExMTAxMTExCithbmR4MDk1IGFuZCAxMTExMTAxMTEgIDExMTExMTExMSAgLT4gIDExMTExMDExMQorYW5keDA5NiBhbmQgMTExMTExMDExICAxMTExMTExMTEgIC0+ICAxMTExMTEwMTEKK2FuZHgwOTcgYW5kIDExMTExMTEwMSAgMTExMTExMTExICAtPiAgMTExMTExMTAxCithbmR4MDk4IGFuZCAxMTExMTExMTAgIDExMTExMTExMSAgLT4gIDExMTExMTExMAorCithbmR4MTAwIGFuZCAxMTExMTExMTEgIDAxMTExMTExMSAgLT4gICAxMTExMTExMQorYW5keDEwMSBhbmQgMTExMTExMTExICAxMDExMTExMTEgIC0+ICAxMDExMTExMTEKK2FuZHgxMDIgYW5kIDExMTExMTExMSAgMTEwMTExMTExICAtPiAgMTEwMTExMTExCithbmR4MTAzIGFuZCAxMTExMTExMTEgIDExMTAxMTExMSAgLT4gIDExMTAxMTExMQorYW5keDEwNCBhbmQgMTExMTExMTExICAxMTExMDExMTEgIC0+ICAxMTExMDExMTEKK2FuZHgxMDUgYW5kIDExMTExMTExMSAgMTExMTEwMTExICAtPiAgMTExMTEwMTExCithbmR4MTA2IGFuZCAxMTExMTExMTEgIDExMTExMTAxMSAgLT4gIDExMTExMTAxMQorYW5keDEwNyBhbmQgMTExMTExMTExICAxMTExMTExMDEgIC0+ICAxMTExMTExMDEKK2FuZHgxMDggYW5kIDExMTExMTExMSAgMTExMTExMTEwICAtPiAgMTExMTExMTEwCisKKy0tIG5vbi0wLzEgc2hvdWxkIG5vdCBiZSBhY2NlcHRlZCwgbm9yIHNob3VsZCBzaWducworYW5keDIyMCBhbmQgMTExMTExMTEyICAxMTExMTExMTEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyMjEgYW5kIDMzMzMzMzMzMyAgMzMzMzMzMzMzICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjIyIGFuZCA1NTU1NTU1NTUgIDU1NTU1NTU1NSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDIyMyBhbmQgNzc3Nzc3Nzc3ICA3Nzc3Nzc3NzcgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyMjQgYW5kIDk5OTk5OTk5OSAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjI1IGFuZCAyMjIyMjIyMjIgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDIyNiBhbmQgNDQ0NDQ0NDQ0ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyMjcgYW5kIDY2NjY2NjY2NiAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjI4IGFuZCA4ODg4ODg4ODggIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDIyOSBhbmQgOTk5OTk5OTk5ICAyMjIyMjIyMjIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyMzAgYW5kIDk5OTk5OTk5OSAgNDQ0NDQ0NDQ0ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjMxIGFuZCA5OTk5OTk5OTkgIDY2NjY2NjY2NiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDIzMiBhbmQgOTk5OTk5OTk5ICA4ODg4ODg4ODggIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGEgZmV3IHJhbmRvbXMKK2FuZHgyNDAgYW5kICA1Njc0Njg2ODkgLTkzNDk4MTk0MiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjQxIGFuZCAgNTY3MzY3Njg5ICA5MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI0MiBhbmQgLTYzMTkxNzc3MiAtNzA2MDE0NjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNDMgYW5kIC03NTYyNTMyNTcgIDEzODU3OTIzNCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjQ0IGFuZCAgODM1NTkwMTQ5ICA1Njc0MzU0MDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QKK2FuZHgyNTAgYW5kICAyMDAwMDAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNTEgYW5kICA3MDAwMDAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNTIgYW5kICA4MDAwMDAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNTMgYW5kICA5MDAwMDAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNTQgYW5kICAyMDAwMDAwMDAgMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNTUgYW5kICA3MDAwMDAwMDAgMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNTYgYW5kICA4MDAwMDAwMDAgMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNTcgYW5kICA5MDAwMDAwMDAgMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNTggYW5kICAxMDAwMDAwMDAgMjAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNTkgYW5kICAxMDAwMDAwMDAgNzAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNjAgYW5kICAxMDAwMDAwMDAgODAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNjEgYW5kICAxMDAwMDAwMDAgOTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNjIgYW5kICAwMDAwMDAwMDAgMjAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNjMgYW5kICAwMDAwMDAwMDAgNzAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNjQgYW5kICAwMDAwMDAwMDAgODAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNjUgYW5kICAwMDAwMDAwMDAgOTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNELTEKK2FuZHgyNzAgYW5kICAwMjAwMDAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNzEgYW5kICAwNzAxMDAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNzIgYW5kICAwODAwMTAwMDAgMTAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNzMgYW5kICAwOTAwMDEwMDAgMTAwMDAwMDEwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNzQgYW5kICAxMDAwMDAxMDAgMDIwMDEwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNzUgYW5kICAxMDAwMDAwMDAgMDcwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNzYgYW5kICAxMDAwMDAwMTAgMDgwMDEwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNzcgYW5kICAxMDAwMDAwMDAgMDkwMDAwMDEwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTFNECithbmR4MjgwIGFuZCAgMDAxMDAwMDAyIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjgxIGFuZCAgMDAwMDAwMDA3IDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjgyIGFuZCAgMDAwMDAwMDA4IDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjgzIGFuZCAgMDAwMDAwMDA5IDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mjg0IGFuZCAgMTAwMDAwMDAwIDAwMDEwMDAwMiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mjg1IGFuZCAgMTAwMTAwMDAwIDAwMTAwMDAwNyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mjg2IGFuZCAgMTAwMDEwMDAwIDAxMDAwMDAwOCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mjg3IGFuZCAgMTAwMDAxMDAwIDEwMDAwMDAwOSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1pZGRpZQorYW5keDI4OCBhbmQgIDAwMTAyMDAwMCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI4OSBhbmQgIDAwMDA3MDAwMSAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI5MCBhbmQgIDAwMDA4MDAwMCAxMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI5MSBhbmQgIDAwMDA5MDAwMCAxMDAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI5MiBhbmQgIDEwMDAwMDAxMCAwMDAwMjAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI5MyBhbmQgIDEwMDEwMDAwMCAwMDAwNzAwMTAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI5NCBhbmQgIDEwMDAxMDEwMCAwMDAwODAwMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI5NSBhbmQgIDEwMDAwMTAwMCAwMDAwOTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gc2lnbnMKK2FuZHgyOTYgYW5kIC0xMDAwMDEwMDAgLTAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mjk3IGFuZCAtMTAwMDAxMDAwICAwMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI5OCBhbmQgIDEwMDAwMTAwMCAtMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyOTkgYW5kICAxMDAwMDEwMDAgIDAwMDAxMTAwMCAtPiAgMTAwMAorCistLSBObWF4LCBObWluLCBOdGlueQorYW5keDMzMSBhbmQgIDIgICA5Ljk5OTk5OTk5RSs5OTkgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDMzMiBhbmQgIDMgICAxRS05OTkgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDMzMyBhbmQgIDQgICAxLjAwMDAwMDAwRS05OTkgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDMzNCBhbmQgIDUgICAxRS0xMDA3ICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDMzNSBhbmQgIDYgICAtMUUtMTAwNyAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDMzNiBhbmQgIDcgICAtMS4wMDAwMDAwMEUtOTk5ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDMzNyBhbmQgIDggICAtMUUtOTk5ICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDMzOCBhbmQgIDkgICAtOS45OTk5OTk5OUUrOTk5ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDM0MSBhbmQgIDkuOTk5OTk5OTlFKzk5OSAgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDM0MiBhbmQgIDFFLTk5OSAgICAgICAgICAgICAgIDAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDM0MyBhbmQgIDEuMDAwMDAwMDBFLTk5OSAgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDM0NCBhbmQgIDFFLTEwMDcgICAgICAgICAgICAgIDE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDM0NSBhbmQgIC0xRS0xMDA3ICAgICAgICAgICAgLTEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDM0NiBhbmQgIC0xLjAwMDAwMDAwRS05OTkgICAgIDE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDM0NyBhbmQgIC0xRS05OTkgICAgICAgICAgICAgIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDM0OCBhbmQgIC05Ljk5OTk5OTk5RSs5OTkgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBIGZldyBvdGhlciBub24taW50ZWdlcnMKK2FuZHgzNjEgYW5kICAxLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNjIgYW5kICAxRSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNjMgYW5kICAwLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNjQgYW5kICAwRSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNjUgYW5kICA5LjkgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNjYgYW5kICA5RSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNzEgYW5kICAwIDEuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNzIgYW5kICAwIDFFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNzMgYW5kICAwIDAuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNzQgYW5kICAwIDBFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNzUgYW5kICAwIDkuOSAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNzYgYW5kICAwIDlFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQWxsIFNwZWNpYWxzIGFyZSBpbiBlcnJvcgorYW5keDc4MCBhbmQgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc4MSBhbmQgLUluZiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc4MiBhbmQgLUluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc4MyBhbmQgLUluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc4NCBhbmQgLUluZiAgIDAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc4NSBhbmQgLUluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc4NiBhbmQgLUluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc4NyBhbmQgLTEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc4OCBhbmQgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc4OSBhbmQgLTEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc5MCBhbmQgLTAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc5MSBhbmQgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc5MiBhbmQgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc5MyBhbmQgIDEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDc5NCBhbmQgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCithbmR4ODAwIGFuZCAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODAxIGFuZCAgSW5mICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODAyIGFuZCAgSW5mICAtMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODAzIGFuZCAgSW5mICAtMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODA0IGFuZCAgSW5mICAgMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODA1IGFuZCAgSW5mICAgMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODA2IGFuZCAgSW5mICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODA3IGFuZCAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODA4IGFuZCAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODA5IGFuZCAtSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODEwIGFuZCAtMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODExIGFuZCAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODEyIGFuZCAgMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODEzIGFuZCAgMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODE0IGFuZCAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODE1IGFuZCAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2FuZHg4MjEgYW5kICBOYU4gLUluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MjIgYW5kICBOYU4gLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MjMgYW5kICBOYU4gLTEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MjQgYW5kICBOYU4gLTAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MjUgYW5kICBOYU4gIDAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MjYgYW5kICBOYU4gIDEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MjcgYW5kICBOYU4gIDEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MjggYW5kICBOYU4gIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MjkgYW5kICBOYU4gIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MzAgYW5kIC1JbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MzEgYW5kIC0xMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MzIgYW5kIC0xICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MzMgYW5kIC0wICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MzQgYW5kICAwICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MzUgYW5kICAxICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MzYgYW5kICAxMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4MzcgYW5kICBJbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworYW5keDg0MSBhbmQgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODQyIGFuZCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NDMgYW5kICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYW5keDg0NCBhbmQgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODQ1IGFuZCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NDYgYW5kICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYW5keDg0NyBhbmQgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODQ4IGFuZCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NDkgYW5kICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYW5keDg1MCBhbmQgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODUxIGFuZCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NTIgYW5kIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYW5keDg1MyBhbmQgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODU0IGFuZCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NTUgYW5kICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYW5keDg1NiBhbmQgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODU3IGFuZCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NTggYW5kICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYW5keDg1OSBhbmQgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2FuZHg4NjEgYW5kICBOYU4xICAgLUluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NjIgYW5kICtOYU4yICAgLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NjMgYW5kICBOYU4zICAgIDEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NjQgYW5kICBOYU40ICAgIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NjUgYW5kICBOYU41ICAgK05hTjYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NjYgYW5kIC1JbmYgICAgIE5hTjcgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NjcgYW5kIC0xMDAwICAgIE5hTjggICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NjggYW5kICAxMDAwICAgIE5hTjkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NjkgYW5kICBJbmYgICAgK05hTjEwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NzEgYW5kICBzTmFOMTEgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NzIgYW5kICBzTmFOMTIgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NzMgYW5kICBzTmFOMTMgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NzQgYW5kICBzTmFOMTQgICBOYU4xNyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NzUgYW5kICBzTmFOMTUgIHNOYU4xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NzYgYW5kICBOYU4xNiAgIHNOYU4xOSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NzcgYW5kIC1JbmYgICAgK3NOYU4yMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NzggYW5kIC0xMDAwICAgIHNOYU4yMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NzkgYW5kICAxMDAwICAgIHNOYU4yMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4ODAgYW5kICBJbmYgICAgIHNOYU4yMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4ODEgYW5kICtOYU4yNSAgK3NOYU4yNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4ODIgYW5kIC1OYU4yNiAgICBOYU4yOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4ODMgYW5kIC1zTmFOMjcgIHNOYU4yOSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4ODQgYW5kICAxMDAwICAgIC1OYU4zMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4ODUgYW5kICAxMDAwICAgLXNOYU4zMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvYmFzZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9iYXNlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0Y2VmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvYmFzZS5kZWNUZXN0CkBAIC0wLDAgKzEsMTQxMSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBiYXNlLmRlY1Rlc3QgLS0gYmFzZSBkZWNpbWFsIDwtLT4gc3RyaW5nIGNvbnZlcnNpb25zICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CitleHRlbmRlZDogICAgMQorCistLSBUaGlzIGZpbGUgdGVzdHMgYmFzZSBjb252ZXJzaW9ucyBmcm9tIHN0cmluZyB0byBhIGRlY2ltYWwgbnVtYmVyCistLSBhbmQgYmFjayB0byBhIHN0cmluZyAoaW4gZWl0aGVyIFNjaWVudGlmaWMgb3IgRW5naW5lZXJpbmcgZm9ybSkKKworLS0gTm90ZSB0aGF0IHVubGlrZSBvdGhlciBvcGVyYXRpb25zIHRoZSBvcGVyYW5kIGlzIHN1YmplY3QgdG8gcm91bmRpbmcKKy0tIHRvIGNvbmZvcm0gdG8gZW1heCBhbmQgcHJlY2lzaW9uIHNldHRpbmdzICh0aGF0IGlzLCBudW1iZXJzIHdpbGwKKy0tIGNvbmZvcm0gdG8gcnVsZXMgYW5kIGV4cG9uZW50IHdpbGwgYmUgaW4gcGVybWl0dGVkIHJhbmdlKS4KKworcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKKworYmFzeDAwMSB0b1NjaSAgICAgICAwIC0+IDAKK2Jhc3gwMDIgdG9TY2kgICAgICAgMSAtPiAxCitiYXN4MDAzIHRvU2NpICAgICAxLjAgLT4gMS4wCitiYXN4MDA0IHRvU2NpICAgIDEuMDAgLT4gMS4wMAorYmFzeDAwNSB0b1NjaSAgICAgIDEwIC0+IDEwCitiYXN4MDA2IHRvU2NpICAgIDEwMDAgLT4gMTAwMAorYmFzeDAwNyB0b1NjaSAgICAxMC4wIC0+IDEwLjAKK2Jhc3gwMDggdG9TY2kgICAgMTAuMSAtPiAxMC4xCitiYXN4MDA5IHRvU2NpICAgIDEwLjQgLT4gMTAuNAorYmFzeDAxMCB0b1NjaSAgICAxMC41IC0+IDEwLjUKK2Jhc3gwMTEgdG9TY2kgICAgMTAuNiAtPiAxMC42CitiYXN4MDEyIHRvU2NpICAgIDEwLjkgLT4gMTAuOQorYmFzeDAxMyB0b1NjaSAgICAxMS4wIC0+IDExLjAKK2Jhc3gwMTQgdG9TY2kgIDEuMjM0IC0+IDEuMjM0CitiYXN4MDE1IHRvU2NpICAwLjEyMyAtPiAwLjEyMworYmFzeDAxNiB0b1NjaSAgMC4wMTIgLT4gMC4wMTIKK2Jhc3gwMTcgdG9TY2kgIC0wICAgIC0+IC0wCitiYXN4MDE4IHRvU2NpICAtMC4wICAtPiAtMC4wCitiYXN4MDE5IHRvU2NpIC0wMC4wMCAtPiAtMC4wMAorCitiYXN4MDIxIHRvU2NpICAgICAtMSAtPiAtMQorYmFzeDAyMiB0b1NjaSAgIC0xLjAgLT4gLTEuMAorYmFzeDAyMyB0b1NjaSAgIC0wLjEgLT4gLTAuMQorYmFzeDAyNCB0b1NjaSAgIC05LjEgLT4gLTkuMQorYmFzeDAyNSB0b1NjaSAgIC05LjExIC0+IC05LjExCitiYXN4MDI2IHRvU2NpICAgLTkuMTE5IC0+IC05LjExOQorYmFzeDAyNyB0b1NjaSAgIC05Ljk5OSAtPiAtOS45OTkKKworYmFzeDAzMCB0b1NjaSAgJzEyMzQ1Njc4OS4xMjM0NTYnICAgLT4gJzEyMzQ1Njc4OS4xMjM0NTYnCitiYXN4MDMxIHRvU2NpICAnMTIzNDU2Nzg5LjAwMDAwMCcgICAtPiAnMTIzNDU2Nzg5LjAwMDAwMCcKK2Jhc3gwMzIgdG9TY2kgICAnMTIzNDU2Nzg5MTIzNDU2JyAgIC0+ICcxMjM0NTY3ODkxMjM0NTYnCitiYXN4MDMzIHRvU2NpICAgJzAuMDAwMDEyMzQ1Njc4OScgICAtPiAnMC4wMDAwMTIzNDU2Nzg5JworYmFzeDAzNCB0b1NjaSAgJzAuMDAwMDAxMjM0NTY3ODknICAgLT4gJzAuMDAwMDAxMjM0NTY3ODknCitiYXN4MDM1IHRvU2NpICcwLjAwMDAwMDEyMzQ1Njc4OScgICAtPiAnMS4yMzQ1Njc4OUUtNycKK2Jhc3gwMzYgdG9TY2kgJzAuMDAwMDAwMDEyMzQ1Njc4OScgIC0+ICcxLjIzNDU2Nzg5RS04JworCitiYXN4MDM3IHRvU2NpICcwLjEyMzQ1Njc4OTAxMjM0NCcgICAtPiAnMC4xMjM0NTY3ODkwMTIzNDQnCitiYXN4MDM4IHRvU2NpICcwLjEyMzQ1Njc4OTAxMjM0NScgICAtPiAnMC4xMjM0NTY3ODkwMTIzNDUnCisKKy0tIFN0cmluZyBbbWFueSBtb3JlIGV4YW1wbGVzIGFyZSBpbXBsaWNpdGx5IHRlc3RlZCBlbHNld2hlcmVdCistLSBzdHJpbmdzIHdpdGhvdXQgRSBjYW5ub3QgZ2VuZXJhdGUgRSBpbiByZXN1bHQKK2Jhc3gwNDAgdG9TY2kgIjEyIiAgICAgICAgLT4gJzEyJworYmFzeDA0MSB0b1NjaSAiLTc2IiAgICAgICAtPiAnLTc2JworYmFzeDA0MiB0b1NjaSAiMTIuNzYiICAgICAtPiAnMTIuNzYnCitiYXN4MDQzIHRvU2NpICIrMTIuNzYiICAgIC0+ICcxMi43NicKK2Jhc3gwNDQgdG9TY2kgIjAxMi43NiIgICAgLT4gJzEyLjc2JworYmFzeDA0NSB0b1NjaSAiKzAuMDAzIiAgICAtPiAnMC4wMDMnCitiYXN4MDQ2IHRvU2NpICIxNy4iICAgICAgIC0+ICcxNycKK2Jhc3gwNDcgdG9TY2kgIi41IiAgICAgICAgLT4gJzAuNScKK2Jhc3gwNDggdG9TY2kgIjA0NCIgICAgICAgLT4gJzQ0JworYmFzeDA0OSB0b1NjaSAiMDA0NCIgICAgICAtPiAnNDQnCitiYXN4MDUwIHRvU2NpICIwLjAwMDUiICAgICAgLT4gJzAuMDAwNScKK2Jhc3gwNTEgdG9TY2kgIjAwLjAwMDA1IiAgICAtPiAnMC4wMDAwNScKK2Jhc3gwNTIgdG9TY2kgIjAuMDAwMDA1IiAgICAtPiAnMC4wMDAwMDUnCitiYXN4MDUzIHRvU2NpICIwLjAwMDAwNTAiICAgLT4gJzAuMDAwMDA1MCcKK2Jhc3gwNTQgdG9TY2kgIjAuMDAwMDAwNSIgICAtPiAnNUUtNycKK2Jhc3gwNTUgdG9TY2kgIjAuMDAwMDAwMDUiICAtPiAnNUUtOCcKK2Jhc3gwNTYgdG9TY2kgIjEyMzQ1Njc4LjU0MzIxMCIgLT4gJzEyMzQ1Njc4LjU0MzIxMCcKK2Jhc3gwNTcgdG9TY2kgIjIzNDU2NzguNTQzMjEwIiAtPiAnMjM0NTY3OC41NDMyMTAnCitiYXN4MDU4IHRvU2NpICIzNDU2NzguNTQzMjEwIiAtPiAnMzQ1Njc4LjU0MzIxMCcKK2Jhc3gwNTkgdG9TY2kgIjAzNDU2NzguNTQzMjEiIC0+ICczNDU2NzguNTQzMjEnCitiYXN4MDYwIHRvU2NpICIzNDU2NzguNTQzMiIgLT4gJzM0NTY3OC41NDMyJworYmFzeDA2MSB0b1NjaSAiKzM0NTY3OC41NDMyIiAtPiAnMzQ1Njc4LjU0MzInCitiYXN4MDYyIHRvU2NpICIrMDM0NTY3OC41NDMyIiAtPiAnMzQ1Njc4LjU0MzInCitiYXN4MDYzIHRvU2NpICIrMDAzNDU2NzguNTQzMiIgLT4gJzM0NTY3OC41NDMyJworYmFzeDA2NCB0b1NjaSAiLTM0NTY3OC41NDMyIiAgLT4gJy0zNDU2NzguNTQzMicKK2Jhc3gwNjUgdG9TY2kgIi0wMzQ1Njc4LjU0MzIiICAtPiAnLTM0NTY3OC41NDMyJworYmFzeDA2NiB0b1NjaSAiLTAwMzQ1Njc4LjU0MzIiICAtPiAnLTM0NTY3OC41NDMyJworLS0gZXhhbXBsZXMKK2Jhc3gwNjcgdG9TY2kgIjVFLTYiICAgICAgICAtPiAnMC4wMDAwMDUnCitiYXN4MDY4IHRvU2NpICI1MEUtNyIgICAgICAgLT4gJzAuMDAwMDA1MCcKK2Jhc3gwNjkgdG9TY2kgIjVFLTciICAgICAgICAtPiAnNUUtNycKKworLS0gW05vIGV4b3RpY3MgYXMgbm8gVW5pY29kZV0KKworLS0gcm91bmRlZCB3aXRoIGRvdHMgaW4gYWxsIChpbmNsdWRpbmcgZWRnZSkgcGxhY2VzCitiYXN4MDcxIHRvU2NpICAuMTIzNDU2Nzg5MDEyMzQ1NjEyMyAgLT4gMC4xMjM0NTY3ODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA3MiB0b1NjaSAgMS4yMzQ1Njc4OTAxMjM0NTYxMjMgIC0+IDEuMjM0NTY3ODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA3MyB0b1NjaSAgMTIuMzQ1Njc4OTAxMjM0NTYxMjMgIC0+IDEyLjM0NTY3ODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA3NCB0b1NjaSAgMTIzLjQ1Njc4OTAxMjM0NTYxMjMgIC0+IDEyMy40NTY3ODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA3NSB0b1NjaSAgMTIzNC41Njc4OTAxMjM0NTYxMjMgIC0+IDEyMzQuNTY3ODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA3NiB0b1NjaSAgMTIzNDUuNjc4OTAxMjM0NTYxMjMgIC0+IDEyMzQ1LjY3ODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA3NyB0b1NjaSAgMTIzNDU2Ljc4OTAxMjM0NTYxMjMgIC0+IDEyMzQ1Ni43ODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA3OCB0b1NjaSAgMTIzNDU2Ny44OTAxMjM0NTYxMjMgIC0+IDEyMzQ1NjcuODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA3OSB0b1NjaSAgMTIzNDU2NzguOTAxMjM0NTYxMjMgIC0+IDEyMzQ1Njc4LjkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA4MCB0b1NjaSAgMTIzNDU2Nzg5LjAxMjM0NTYxMjMgIC0+IDEyMzQ1Njc4OS4wMTIzNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA4MSB0b1NjaSAgMTIzNDU2Nzg5MC4xMjM0NTYxMjMgIC0+IDEyMzQ1Njc4OTAuMTIzNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA4MiB0b1NjaSAgMTIzNDU2Nzg5MDEuMjM0NTYxMjMgIC0+IDEyMzQ1Njc4OTAxLjIzNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA4MyB0b1NjaSAgMTIzNDU2Nzg5MDEyLjM0NTYxMjMgIC0+IDEyMzQ1Njc4OTAxMi4zNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA4NCB0b1NjaSAgMTIzNDU2Nzg5MDEyMy40NTYxMjMgIC0+IDEyMzQ1Njc4OTAxMjMuNDU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA4NSB0b1NjaSAgMTIzNDU2Nzg5MDEyMzQuNTYxMjMgIC0+IDEyMzQ1Njc4OTAxMjM0LjU2IEluZXhhY3QgUm91bmRlZAorYmFzeDA4NiB0b1NjaSAgMTIzNDU2Nzg5MDEyMzQ1LjYxMjMgIC0+IDEyMzQ1Njc4OTAxMjM0NS42IEluZXhhY3QgUm91bmRlZAorYmFzeDA4NyB0b1NjaSAgMTIzNDU2Nzg5MDEyMzQ1Ni4xMjMgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYmFzeDA4OCB0b1NjaSAgMTIzNDU2Nzg5MDEyMzQ1NjEuMjMgIC0+IDEuMjM0NTY3ODkwMTIzNDU2RSsxNiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwODkgdG9TY2kgIDEyMzQ1Njc4OTAxMjM0NTYxMi4zICAtPiAxLjIzNDU2Nzg5MDEyMzQ1NkUrMTcgSW5leGFjdCBSb3VuZGVkCitiYXN4MDkwIHRvU2NpICAxMjM0NTY3ODkwMTIzNDU2MTIzLiAgLT4gMS4yMzQ1Njc4OTAxMjM0NTZFKzE4IEluZXhhY3QgUm91bmRlZAorCistLSBOdW1iZXJzIHdpdGggRQorYmFzeDEzMCB0b1NjaSAiMC4wMDBFLTEiICAtPiAnMC4wMDAwJworYmFzeDEzMSB0b1NjaSAiMC4wMDBFLTIiICAtPiAnMC4wMDAwMCcKK2Jhc3gxMzIgdG9TY2kgIjAuMDAwRS0zIiAgLT4gJzAuMDAwMDAwJworYmFzeDEzMyB0b1NjaSAiMC4wMDBFLTQiICAtPiAnMEUtNycKK2Jhc3gxMzQgdG9TY2kgIjAuMDBFLTIiICAgLT4gJzAuMDAwMCcKK2Jhc3gxMzUgdG9TY2kgIjAuMDBFLTMiICAgLT4gJzAuMDAwMDAnCitiYXN4MTM2IHRvU2NpICIwLjAwRS00IiAgIC0+ICcwLjAwMDAwMCcKK2Jhc3gxMzcgdG9TY2kgIjAuMDBFLTUiICAgLT4gJzBFLTcnCitiYXN4MTM4IHRvU2NpICIrMEUrOSIgICAgIC0+ICcwRSs5JworYmFzeDEzOSB0b1NjaSAiLTBFKzkiICAgICAtPiAnLTBFKzknCitiYXN4MTQwIHRvU2NpICIxRSs5IiAgICAgIC0+ICcxRSs5JworYmFzeDE0MSB0b1NjaSAiMWUrMDkiICAgICAtPiAnMUUrOScKK2Jhc3gxNDIgdG9TY2kgIjFFKzkwIiAgICAgLT4gJzFFKzkwJworYmFzeDE0MyB0b1NjaSAiKzFFKzAwOSIgICAtPiAnMUUrOScKK2Jhc3gxNDQgdG9TY2kgIjBFKzkiICAgICAgLT4gJzBFKzknCitiYXN4MTQ1IHRvU2NpICIxRSs5IiAgICAgIC0+ICcxRSs5JworYmFzeDE0NiB0b1NjaSAiMUUrMDkiICAgICAtPiAnMUUrOScKK2Jhc3gxNDcgdG9TY2kgIjFlKzkwIiAgICAgLT4gJzFFKzkwJworYmFzeDE0OCB0b1NjaSAiMUUrMDA5IiAgICAtPiAnMUUrOScKK2Jhc3gxNDkgdG9TY2kgIjAwMEUrOSIgICAgLT4gJzBFKzknCitiYXN4MTUwIHRvU2NpICIxRTkiICAgICAgIC0+ICcxRSs5JworYmFzeDE1MSB0b1NjaSAiMWUwOSIgICAgICAtPiAnMUUrOScKK2Jhc3gxNTIgdG9TY2kgIjFFOTAiICAgICAgLT4gJzFFKzkwJworYmFzeDE1MyB0b1NjaSAiMUUwMDkiICAgICAtPiAnMUUrOScKK2Jhc3gxNTQgdG9TY2kgIjBFOSIgICAgICAgLT4gJzBFKzknCitiYXN4MTU1IHRvU2NpICIwLjAwMGUrMCIgIC0+ICcwLjAwMCcKK2Jhc3gxNTYgdG9TY2kgIjAuMDAwRS0xIiAgLT4gJzAuMDAwMCcKK2Jhc3gxNTcgdG9TY2kgIjRFKzkiICAgICAgLT4gJzRFKzknCitiYXN4MTU4IHRvU2NpICI0NEUrOSIgICAgIC0+ICc0LjRFKzEwJworYmFzeDE1OSB0b1NjaSAiMC43M2UtNyIgICAtPiAnNy4zRS04JworYmFzeDE2MCB0b1NjaSAiMDBFKzkiICAgICAtPiAnMEUrOScKK2Jhc3gxNjEgdG9TY2kgIjAwRS05IiAgICAgLT4gJzBFLTknCitiYXN4MTYyIHRvU2NpICIxMEUrOSIgICAgIC0+ICcxLjBFKzEwJworYmFzeDE2MyB0b1NjaSAiMTBFKzA5IiAgICAtPiAnMS4wRSsxMCcKK2Jhc3gxNjQgdG9TY2kgIjEwZSs5MCIgICAgLT4gJzEuMEUrOTEnCitiYXN4MTY1IHRvU2NpICIxMEUrMDA5IiAgIC0+ICcxLjBFKzEwJworYmFzeDE2NiB0b1NjaSAiMTAwZSs5IiAgICAtPiAnMS4wMEUrMTEnCitiYXN4MTY3IHRvU2NpICIxMDBlKzA5IiAgIC0+ICcxLjAwRSsxMScKK2Jhc3gxNjggdG9TY2kgIjEwMEUrOTAiICAgLT4gJzEuMDBFKzkyJworYmFzeDE2OSB0b1NjaSAiMTAwZSswMDkiICAtPiAnMS4wMEUrMTEnCisKK2Jhc3gxNzAgdG9TY2kgIjEuMjY1IiAgICAgLT4gJzEuMjY1JworYmFzeDE3MSB0b1NjaSAiMS4yNjVFLTIwIiAtPiAnMS4yNjVFLTIwJworYmFzeDE3MiB0b1NjaSAiMS4yNjVFLTgiICAtPiAnMS4yNjVFLTgnCitiYXN4MTczIHRvU2NpICIxLjI2NUUtNCIgIC0+ICcwLjAwMDEyNjUnCitiYXN4MTc0IHRvU2NpICIxLjI2NUUtMyIgIC0+ICcwLjAwMTI2NScKK2Jhc3gxNzUgdG9TY2kgIjEuMjY1RS0yIiAgLT4gJzAuMDEyNjUnCitiYXN4MTc2IHRvU2NpICIxLjI2NUUtMSIgIC0+ICcwLjEyNjUnCitiYXN4MTc3IHRvU2NpICIxLjI2NUUtMCIgIC0+ICcxLjI2NScKK2Jhc3gxNzggdG9TY2kgIjEuMjY1RSsxIiAgLT4gJzEyLjY1JworYmFzeDE3OSB0b1NjaSAiMS4yNjVFKzIiICAtPiAnMTI2LjUnCitiYXN4MTgwIHRvU2NpICIxLjI2NUUrMyIgIC0+ICcxMjY1JworYmFzeDE4MSB0b1NjaSAiMS4yNjVFKzQiICAtPiAnMS4yNjVFKzQnCitiYXN4MTgyIHRvU2NpICIxLjI2NUUrOCIgIC0+ICcxLjI2NUUrOCcKK2Jhc3gxODMgdG9TY2kgIjEuMjY1RSsyMCIgLT4gJzEuMjY1RSsyMCcKKworYmFzeDE5MCB0b1NjaSAiMTIuNjUiICAgICAtPiAnMTIuNjUnCitiYXN4MTkxIHRvU2NpICIxMi42NUUtMjAiIC0+ICcxLjI2NUUtMTknCitiYXN4MTkyIHRvU2NpICIxMi42NUUtOCIgIC0+ICcxLjI2NUUtNycKK2Jhc3gxOTMgdG9TY2kgIjEyLjY1RS00IiAgLT4gJzAuMDAxMjY1JworYmFzeDE5NCB0b1NjaSAiMTIuNjVFLTMiICAtPiAnMC4wMTI2NScKK2Jhc3gxOTUgdG9TY2kgIjEyLjY1RS0yIiAgLT4gJzAuMTI2NScKK2Jhc3gxOTYgdG9TY2kgIjEyLjY1RS0xIiAgLT4gJzEuMjY1JworYmFzeDE5NyB0b1NjaSAiMTIuNjVFLTAiICAtPiAnMTIuNjUnCitiYXN4MTk4IHRvU2NpICIxMi42NUUrMSIgIC0+ICcxMjYuNScKK2Jhc3gxOTkgdG9TY2kgIjEyLjY1RSsyIiAgLT4gJzEyNjUnCitiYXN4MjAwIHRvU2NpICIxMi42NUUrMyIgIC0+ICcxLjI2NUUrNCcKK2Jhc3gyMDEgdG9TY2kgIjEyLjY1RSs0IiAgLT4gJzEuMjY1RSs1JworYmFzeDIwMiB0b1NjaSAiMTIuNjVFKzgiICAtPiAnMS4yNjVFKzknCitiYXN4MjAzIHRvU2NpICIxMi42NUUrMjAiIC0+ICcxLjI2NUUrMjEnCisKK2Jhc3gyMTAgdG9TY2kgIjEyNi41IiAgICAgLT4gJzEyNi41JworYmFzeDIxMSB0b1NjaSAiMTI2LjVFLTIwIiAtPiAnMS4yNjVFLTE4JworYmFzeDIxMiB0b1NjaSAiMTI2LjVFLTgiICAtPiAnMC4wMDAwMDEyNjUnCitiYXN4MjEzIHRvU2NpICIxMjYuNUUtNCIgIC0+ICcwLjAxMjY1JworYmFzeDIxNCB0b1NjaSAiMTI2LjVFLTMiICAtPiAnMC4xMjY1JworYmFzeDIxNSB0b1NjaSAiMTI2LjVFLTIiICAtPiAnMS4yNjUnCitiYXN4MjE2IHRvU2NpICIxMjYuNUUtMSIgIC0+ICcxMi42NScKK2Jhc3gyMTcgdG9TY2kgIjEyNi41RS0wIiAgLT4gJzEyNi41JworYmFzeDIxOCB0b1NjaSAiMTI2LjVFKzEiICAtPiAnMTI2NScKK2Jhc3gyMTkgdG9TY2kgIjEyNi41RSsyIiAgLT4gJzEuMjY1RSs0JworYmFzeDIyMCB0b1NjaSAiMTI2LjVFKzMiICAtPiAnMS4yNjVFKzUnCitiYXN4MjIxIHRvU2NpICIxMjYuNUUrNCIgIC0+ICcxLjI2NUUrNicKK2Jhc3gyMjIgdG9TY2kgIjEyNi41RSs4IiAgLT4gJzEuMjY1RSsxMCcKK2Jhc3gyMjMgdG9TY2kgIjEyNi41RSsyMCIgLT4gJzEuMjY1RSsyMicKKworYmFzeDIzMCB0b1NjaSAiMTI2NSIgICAgIC0+ICcxMjY1JworYmFzeDIzMSB0b1NjaSAiMTI2NUUtMjAiIC0+ICcxLjI2NUUtMTcnCitiYXN4MjMyIHRvU2NpICIxMjY1RS04IiAgLT4gJzAuMDAwMDEyNjUnCitiYXN4MjMzIHRvU2NpICIxMjY1RS00IiAgLT4gJzAuMTI2NScKK2Jhc3gyMzQgdG9TY2kgIjEyNjVFLTMiICAtPiAnMS4yNjUnCitiYXN4MjM1IHRvU2NpICIxMjY1RS0yIiAgLT4gJzEyLjY1JworYmFzeDIzNiB0b1NjaSAiMTI2NUUtMSIgIC0+ICcxMjYuNScKK2Jhc3gyMzcgdG9TY2kgIjEyNjVFLTAiICAtPiAnMTI2NScKK2Jhc3gyMzggdG9TY2kgIjEyNjVFKzEiICAtPiAnMS4yNjVFKzQnCitiYXN4MjM5IHRvU2NpICIxMjY1RSsyIiAgLT4gJzEuMjY1RSs1JworYmFzeDI0MCB0b1NjaSAiMTI2NUUrMyIgIC0+ICcxLjI2NUUrNicKK2Jhc3gyNDEgdG9TY2kgIjEyNjVFKzQiICAtPiAnMS4yNjVFKzcnCitiYXN4MjQyIHRvU2NpICIxMjY1RSs4IiAgLT4gJzEuMjY1RSsxMScKK2Jhc3gyNDMgdG9TY2kgIjEyNjVFKzIwIiAtPiAnMS4yNjVFKzIzJworCitiYXN4MjUwIHRvU2NpICIwLjEyNjUiICAgICAtPiAnMC4xMjY1JworYmFzeDI1MSB0b1NjaSAiMC4xMjY1RS0yMCIgLT4gJzEuMjY1RS0yMScKK2Jhc3gyNTIgdG9TY2kgIjAuMTI2NUUtOCIgIC0+ICcxLjI2NUUtOScKK2Jhc3gyNTMgdG9TY2kgIjAuMTI2NUUtNCIgIC0+ICcwLjAwMDAxMjY1JworYmFzeDI1NCB0b1NjaSAiMC4xMjY1RS0zIiAgLT4gJzAuMDAwMTI2NScKK2Jhc3gyNTUgdG9TY2kgIjAuMTI2NUUtMiIgIC0+ICcwLjAwMTI2NScKK2Jhc3gyNTYgdG9TY2kgIjAuMTI2NUUtMSIgIC0+ICcwLjAxMjY1JworYmFzeDI1NyB0b1NjaSAiMC4xMjY1RS0wIiAgLT4gJzAuMTI2NScKK2Jhc3gyNTggdG9TY2kgIjAuMTI2NUUrMSIgIC0+ICcxLjI2NScKK2Jhc3gyNTkgdG9TY2kgIjAuMTI2NUUrMiIgIC0+ICcxMi42NScKK2Jhc3gyNjAgdG9TY2kgIjAuMTI2NUUrMyIgIC0+ICcxMjYuNScKK2Jhc3gyNjEgdG9TY2kgIjAuMTI2NUUrNCIgIC0+ICcxMjY1JworYmFzeDI2MiB0b1NjaSAiMC4xMjY1RSs4IiAgLT4gJzEuMjY1RSs3JworYmFzeDI2MyB0b1NjaSAiMC4xMjY1RSsyMCIgLT4gJzEuMjY1RSsxOScKKworLS0gc29tZSBtb3JlIG5lZ2F0aXZlIHplcm9zIFtzeXN0ZW1hdGljIHRlc3RzIGJlbG93XQorYmFzeDI5MCB0b1NjaSAiLTAuMDAwRS0xIiAgLT4gJy0wLjAwMDAnCitiYXN4MjkxIHRvU2NpICItMC4wMDBFLTIiICAtPiAnLTAuMDAwMDAnCitiYXN4MjkyIHRvU2NpICItMC4wMDBFLTMiICAtPiAnLTAuMDAwMDAwJworYmFzeDI5MyB0b1NjaSAiLTAuMDAwRS00IiAgLT4gJy0wRS03JworYmFzeDI5NCB0b1NjaSAiLTAuMDBFLTIiICAgLT4gJy0wLjAwMDAnCitiYXN4Mjk1IHRvU2NpICItMC4wMEUtMyIgICAtPiAnLTAuMDAwMDAnCitiYXN4Mjk2IHRvU2NpICItMC4wRS0yIiAgICAtPiAnLTAuMDAwJworYmFzeDI5NyB0b1NjaSAiLTAuMEUtMyIgICAgLT4gJy0wLjAwMDAnCitiYXN4Mjk4IHRvU2NpICItMEUtMiIgICAgICAtPiAnLTAuMDAnCitiYXN4Mjk5IHRvU2NpICItMEUtMyIgICAgICAtPiAnLTAuMDAwJworCistLSBFbmdpbmVlcmluZyBub3RhdGlvbiB0ZXN0cworYmFzeDMwMSAgdG9TY2kgMTBlMTIgIC0+IDEuMEUrMTMKK2Jhc3gzMDIgIHRvRW5nIDEwZTEyICAtPiAxMEUrMTIKK2Jhc3gzMDMgIHRvU2NpIDEwZTExICAtPiAxLjBFKzEyCitiYXN4MzA0ICB0b0VuZyAxMGUxMSAgLT4gMS4wRSsxMgorYmFzeDMwNSAgdG9TY2kgMTBlMTAgIC0+IDEuMEUrMTEKK2Jhc3gzMDYgIHRvRW5nIDEwZTEwICAtPiAxMDBFKzkKK2Jhc3gzMDcgIHRvU2NpIDEwZTkgICAtPiAxLjBFKzEwCitiYXN4MzA4ICB0b0VuZyAxMGU5ICAgLT4gMTBFKzkKK2Jhc3gzMDkgIHRvU2NpIDEwZTggICAtPiAxLjBFKzkKK2Jhc3gzMTAgIHRvRW5nIDEwZTggICAtPiAxLjBFKzkKK2Jhc3gzMTEgIHRvU2NpIDEwZTcgICAtPiAxLjBFKzgKK2Jhc3gzMTIgIHRvRW5nIDEwZTcgICAtPiAxMDBFKzYKK2Jhc3gzMTMgIHRvU2NpIDEwZTYgICAtPiAxLjBFKzcKK2Jhc3gzMTQgIHRvRW5nIDEwZTYgICAtPiAxMEUrNgorYmFzeDMxNSAgdG9TY2kgMTBlNSAgIC0+IDEuMEUrNgorYmFzeDMxNiAgdG9FbmcgMTBlNSAgIC0+IDEuMEUrNgorYmFzeDMxNyAgdG9TY2kgMTBlNCAgIC0+IDEuMEUrNQorYmFzeDMxOCAgdG9FbmcgMTBlNCAgIC0+IDEwMEUrMworYmFzeDMxOSAgdG9TY2kgMTBlMyAgIC0+IDEuMEUrNAorYmFzeDMyMCAgdG9FbmcgMTBlMyAgIC0+IDEwRSszCitiYXN4MzIxICB0b1NjaSAxMGUyICAgLT4gMS4wRSszCitiYXN4MzIyICB0b0VuZyAxMGUyICAgLT4gMS4wRSszCitiYXN4MzIzICB0b1NjaSAxMGUxICAgLT4gMS4wRSsyCitiYXN4MzI0ICB0b0VuZyAxMGUxICAgLT4gMTAwCitiYXN4MzI1ICB0b1NjaSAxMGUwICAgLT4gMTAKK2Jhc3gzMjYgIHRvRW5nIDEwZTAgICAtPiAxMAorYmFzeDMyNyAgdG9TY2kgMTBlLTEgIC0+IDEuMAorYmFzeDMyOCAgdG9FbmcgMTBlLTEgIC0+IDEuMAorYmFzeDMyOSAgdG9TY2kgMTBlLTIgIC0+IDAuMTAKK2Jhc3gzMzAgIHRvRW5nIDEwZS0yICAtPiAwLjEwCitiYXN4MzMxICB0b1NjaSAxMGUtMyAgLT4gMC4wMTAKK2Jhc3gzMzIgIHRvRW5nIDEwZS0zICAtPiAwLjAxMAorYmFzeDMzMyAgdG9TY2kgMTBlLTQgIC0+IDAuMDAxMAorYmFzeDMzNCAgdG9FbmcgMTBlLTQgIC0+IDAuMDAxMAorYmFzeDMzNSAgdG9TY2kgMTBlLTUgIC0+IDAuMDAwMTAKK2Jhc3gzMzYgIHRvRW5nIDEwZS01ICAtPiAwLjAwMDEwCitiYXN4MzM3ICB0b1NjaSAxMGUtNiAgLT4gMC4wMDAwMTAKK2Jhc3gzMzggIHRvRW5nIDEwZS02ICAtPiAwLjAwMDAxMAorYmFzeDMzOSAgdG9TY2kgMTBlLTcgIC0+IDAuMDAwMDAxMAorYmFzeDM0MCAgdG9FbmcgMTBlLTcgIC0+IDAuMDAwMDAxMAorYmFzeDM0MSAgdG9TY2kgMTBlLTggIC0+IDEuMEUtNworYmFzeDM0MiAgdG9FbmcgMTBlLTggIC0+IDEwMEUtOQorYmFzeDM0MyAgdG9TY2kgMTBlLTkgIC0+IDEuMEUtOAorYmFzeDM0NCAgdG9FbmcgMTBlLTkgIC0+IDEwRS05CitiYXN4MzQ1ICB0b1NjaSAxMGUtMTAgLT4gMS4wRS05CitiYXN4MzQ2ICB0b0VuZyAxMGUtMTAgLT4gMS4wRS05CitiYXN4MzQ3ICB0b1NjaSAxMGUtMTEgLT4gMS4wRS0xMAorYmFzeDM0OCAgdG9FbmcgMTBlLTExIC0+IDEwMEUtMTIKK2Jhc3gzNDkgIHRvU2NpIDEwZS0xMiAtPiAxLjBFLTExCitiYXN4MzUwICB0b0VuZyAxMGUtMTIgLT4gMTBFLTEyCitiYXN4MzUxICB0b1NjaSAxMGUtMTMgLT4gMS4wRS0xMgorYmFzeDM1MiAgdG9FbmcgMTBlLTEzIC0+IDEuMEUtMTIKKworYmFzeDM2MSAgdG9TY2kgN0UxMiAgLT4gN0UrMTIKK2Jhc3gzNjIgIHRvRW5nIDdFMTIgIC0+IDdFKzEyCitiYXN4MzYzICB0b1NjaSA3RTExICAtPiA3RSsxMQorYmFzeDM2NCAgdG9FbmcgN0UxMSAgLT4gNzAwRSs5CitiYXN4MzY1ICB0b1NjaSA3RTEwICAtPiA3RSsxMAorYmFzeDM2NiAgdG9FbmcgN0UxMCAgLT4gNzBFKzkKK2Jhc3gzNjcgIHRvU2NpIDdFOSAgIC0+IDdFKzkKK2Jhc3gzNjggIHRvRW5nIDdFOSAgIC0+IDdFKzkKK2Jhc3gzNjkgIHRvU2NpIDdFOCAgIC0+IDdFKzgKK2Jhc3gzNzAgIHRvRW5nIDdFOCAgIC0+IDcwMEUrNgorYmFzeDM3MSAgdG9TY2kgN0U3ICAgLT4gN0UrNworYmFzeDM3MiAgdG9FbmcgN0U3ICAgLT4gNzBFKzYKK2Jhc3gzNzMgIHRvU2NpIDdFNiAgIC0+IDdFKzYKK2Jhc3gzNzQgIHRvRW5nIDdFNiAgIC0+IDdFKzYKK2Jhc3gzNzUgIHRvU2NpIDdFNSAgIC0+IDdFKzUKK2Jhc3gzNzYgIHRvRW5nIDdFNSAgIC0+IDcwMEUrMworYmFzeDM3NyAgdG9TY2kgN0U0ICAgLT4gN0UrNAorYmFzeDM3OCAgdG9FbmcgN0U0ICAgLT4gNzBFKzMKK2Jhc3gzNzkgIHRvU2NpIDdFMyAgIC0+IDdFKzMKK2Jhc3gzODAgIHRvRW5nIDdFMyAgIC0+IDdFKzMKK2Jhc3gzODEgIHRvU2NpIDdFMiAgIC0+IDdFKzIKK2Jhc3gzODIgIHRvRW5nIDdFMiAgIC0+IDcwMAorYmFzeDM4MyAgdG9TY2kgN0UxICAgLT4gN0UrMQorYmFzeDM4NCAgdG9FbmcgN0UxICAgLT4gNzAKK2Jhc3gzODUgIHRvU2NpIDdFMCAgIC0+IDcKK2Jhc3gzODYgIHRvRW5nIDdFMCAgIC0+IDcKK2Jhc3gzODcgIHRvU2NpIDdFLTEgIC0+IDAuNworYmFzeDM4OCAgdG9FbmcgN0UtMSAgLT4gMC43CitiYXN4Mzg5ICB0b1NjaSA3RS0yICAtPiAwLjA3CitiYXN4MzkwICB0b0VuZyA3RS0yICAtPiAwLjA3CitiYXN4MzkxICB0b1NjaSA3RS0zICAtPiAwLjAwNworYmFzeDM5MiAgdG9FbmcgN0UtMyAgLT4gMC4wMDcKK2Jhc3gzOTMgIHRvU2NpIDdFLTQgIC0+IDAuMDAwNworYmFzeDM5NCAgdG9FbmcgN0UtNCAgLT4gMC4wMDA3CitiYXN4Mzk1ICB0b1NjaSA3RS01ICAtPiAwLjAwMDA3CitiYXN4Mzk2ICB0b0VuZyA3RS01ICAtPiAwLjAwMDA3CitiYXN4Mzk3ICB0b1NjaSA3RS02ICAtPiAwLjAwMDAwNworYmFzeDM5OCAgdG9FbmcgN0UtNiAgLT4gMC4wMDAwMDcKK2Jhc3gzOTkgIHRvU2NpIDdFLTcgIC0+IDdFLTcKK2Jhc3g0MDAgIHRvRW5nIDdFLTcgIC0+IDcwMEUtOQorYmFzeDQwMSAgdG9TY2kgN0UtOCAgLT4gN0UtOAorYmFzeDQwMiAgdG9FbmcgN0UtOCAgLT4gNzBFLTkKK2Jhc3g0MDMgIHRvU2NpIDdFLTkgIC0+IDdFLTkKK2Jhc3g0MDQgIHRvRW5nIDdFLTkgIC0+IDdFLTkKK2Jhc3g0MDUgIHRvU2NpIDdFLTEwIC0+IDdFLTEwCitiYXN4NDA2ICB0b0VuZyA3RS0xMCAtPiA3MDBFLTEyCitiYXN4NDA3ICB0b1NjaSA3RS0xMSAtPiA3RS0xMQorYmFzeDQwOCAgdG9FbmcgN0UtMTEgLT4gNzBFLTEyCitiYXN4NDA5ICB0b1NjaSA3RS0xMiAtPiA3RS0xMgorYmFzeDQxMCAgdG9FbmcgN0UtMTIgLT4gN0UtMTIKK2Jhc3g0MTEgIHRvU2NpIDdFLTEzIC0+IDdFLTEzCitiYXN4NDEyICB0b0VuZyA3RS0xMyAtPiA3MDBFLTE1CisKKy0tIEV4YWN0cyByZW1haW4gZXhhY3QgdXAgdG8gcHJlY2lzaW9uIC4uCitwcmVjaXNpb246IDkKK2Jhc3g0MjAgIHRvU2NpICAgIDEwMCAtPiAxMDAKK2Jhc3g0MjEgIHRvRW5nICAgIDEwMCAtPiAxMDAKK2Jhc3g0MjIgIHRvU2NpICAgMTAwMCAtPiAxMDAwCitiYXN4NDIzICB0b0VuZyAgIDEwMDAgLT4gMTAwMAorYmFzeDQyNCAgdG9TY2kgIDk5OS45IC0+ICA5OTkuOQorYmFzeDQyNSAgdG9FbmcgIDk5OS45IC0+ICA5OTkuOQorYmFzeDQyNiAgdG9TY2kgMTAwMC4wIC0+IDEwMDAuMAorYmFzeDQyNyAgdG9FbmcgMTAwMC4wIC0+IDEwMDAuMAorYmFzeDQyOCAgdG9TY2kgMTAwMC4xIC0+IDEwMDAuMQorYmFzeDQyOSAgdG9FbmcgMTAwMC4xIC0+IDEwMDAuMQorYmFzeDQzMCAgdG9TY2kgMTAwMDAgLT4gMTAwMDAKK2Jhc3g0MzEgIHRvRW5nIDEwMDAwIC0+IDEwMDAwCitiYXN4NDMyICB0b1NjaSAxMDAwMDAgLT4gMTAwMDAwCitiYXN4NDMzICB0b0VuZyAxMDAwMDAgLT4gMTAwMDAwCitiYXN4NDM0ICB0b1NjaSAxMDAwMDAwIC0+IDEwMDAwMDAKK2Jhc3g0MzUgIHRvRW5nIDEwMDAwMDAgLT4gMTAwMDAwMAorYmFzeDQzNiAgdG9TY2kgMTAwMDAwMDAgLT4gMTAwMDAwMDAKK2Jhc3g0MzcgIHRvRW5nIDEwMDAwMDAwIC0+IDEwMDAwMDAwCitiYXN4NDM4ICB0b1NjaSAxMDAwMDAwMDAgLT4gMTAwMDAwMDAwCitiYXN4NDM5ICB0b0VuZyAxMDAwMDAwMDAgLT4gMTAwMDAwMDAwCitiYXN4NDQwICB0b1NjaSAxMDAwMDAwMDAwICAgIC0+IDEuMDAwMDAwMDBFKzkgICAgUm91bmRlZAorYmFzeDQ0MSAgdG9FbmcgMTAwMDAwMDAwMCAgICAtPiAxLjAwMDAwMDAwRSs5ICAgIFJvdW5kZWQKK2Jhc3g0NDIgIHRvU2NpIDEwMDAwMDAwMDAgICAgLT4gMS4wMDAwMDAwMEUrOSAgICBSb3VuZGVkCitiYXN4NDQzICB0b0VuZyAxMDAwMDAwMDAwICAgIC0+IDEuMDAwMDAwMDBFKzkgICAgUm91bmRlZAorYmFzeDQ0NCAgdG9TY2kgMTAwMDAwMDAwMyAgICAtPiAxLjAwMDAwMDAwRSs5ICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ0NSAgdG9FbmcgMTAwMDAwMDAwMyAgICAtPiAxLjAwMDAwMDAwRSs5ICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ0NiAgdG9TY2kgMTAwMDAwMDAwNSAgICAtPiAxLjAwMDAwMDAxRSs5ICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ0NyAgdG9FbmcgMTAwMDAwMDAwNSAgICAtPiAxLjAwMDAwMDAxRSs5ICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ0OCAgdG9TY2kgMTAwMDAwMDAwNTAgICAtPiAxLjAwMDAwMDAxRSsxMCAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ0OSAgdG9FbmcgMTAwMDAwMDAwNTAgICAtPiAxMC4wMDAwMDAxRSs5ICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ1MCAgdG9TY2kgMTAwMDAwMDAwOSAgICAtPiAxLjAwMDAwMDAxRSs5ICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ1MSAgdG9FbmcgMTAwMDAwMDAwOSAgICAtPiAxLjAwMDAwMDAxRSs5ICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ1MiAgdG9TY2kgMTAwMDAwMDAwMDAgICAtPiAxLjAwMDAwMDAwRSsxMCAgIFJvdW5kZWQKK2Jhc3g0NTMgIHRvRW5nIDEwMDAwMDAwMDAwICAgLT4gMTAuMDAwMDAwMEUrOSAgICBSb3VuZGVkCitiYXN4NDU0ICB0b1NjaSAxMDAwMDAwMDAwMyAgIC0+IDEuMDAwMDAwMDBFKzEwICAgUm91bmRlZCBJbmV4YWN0CitiYXN4NDU1ICB0b0VuZyAxMDAwMDAwMDAwMyAgIC0+IDEwLjAwMDAwMDBFKzkgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4NDU2ICB0b1NjaSAxMDAwMDAwMDAwNSAgIC0+IDEuMDAwMDAwMDBFKzEwICAgUm91bmRlZCBJbmV4YWN0CitiYXN4NDU3ICB0b0VuZyAxMDAwMDAwMDAwNSAgIC0+IDEwLjAwMDAwMDBFKzkgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4NDU4ICB0b1NjaSAxMDAwMDAwMDAwOSAgIC0+IDEuMDAwMDAwMDBFKzEwICAgUm91bmRlZCBJbmV4YWN0CitiYXN4NDU5ICB0b0VuZyAxMDAwMDAwMDAwOSAgIC0+IDEwLjAwMDAwMDBFKzkgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4NDYwICB0b1NjaSAxMDAwMDAwMDAwMDAgIC0+IDEuMDAwMDAwMDBFKzExICAgUm91bmRlZAorYmFzeDQ2MSAgdG9FbmcgMTAwMDAwMDAwMDAwICAtPiAxMDAuMDAwMDAwRSs5ICAgIFJvdW5kZWQKK2Jhc3g0NjIgIHRvU2NpIDEwMDAwMDAwMDMwMCAgLT4gMS4wMDAwMDAwMEUrMTEgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NjMgIHRvRW5nIDEwMDAwMDAwMDMwMCAgLT4gMTAwLjAwMDAwMEUrOSAgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NjQgIHRvU2NpIDEwMDAwMDAwMDUwMCAgLT4gMS4wMDAwMDAwMUUrMTEgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NjUgIHRvRW5nIDEwMDAwMDAwMDUwMCAgLT4gMTAwLjAwMDAwMUUrOSAgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NjYgIHRvU2NpIDEwMDAwMDAwMDkwMCAgLT4gMS4wMDAwMDAwMUUrMTEgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NjcgIHRvRW5nIDEwMDAwMDAwMDkwMCAgLT4gMTAwLjAwMDAwMUUrOSAgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NjggIHRvU2NpIDEwMDAwMDAwMDAwMDAgLT4gMS4wMDAwMDAwMEUrMTIgICBSb3VuZGVkCitiYXN4NDY5ICB0b0VuZyAxMDAwMDAwMDAwMDAwIC0+IDEuMDAwMDAwMDBFKzEyICAgUm91bmRlZAorYmFzeDQ3MCAgdG9TY2kgMTAwMDAwMDAwMzAwMCAtPiAxLjAwMDAwMDAwRSsxMiAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ3MSAgdG9FbmcgMTAwMDAwMDAwMzAwMCAtPiAxLjAwMDAwMDAwRSsxMiAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ3MiAgdG9TY2kgMTAwMDAwMDAwNTAwMCAtPiAxLjAwMDAwMDAxRSsxMiAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ3MyAgdG9FbmcgMTAwMDAwMDAwNTAwMCAtPiAxLjAwMDAwMDAxRSsxMiAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ3NCAgdG9TY2kgMTAwMDAwMDAwOTAwMCAtPiAxLjAwMDAwMDAxRSsxMiAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ3NSAgdG9FbmcgMTAwMDAwMDAwOTAwMCAtPiAxLjAwMDAwMDAxRSsxMiAgIFJvdW5kZWQgSW5leGFjdAorCistLSBhbGwtbmluZXMgcm91bmRpbmcKK3ByZWNpc2lvbjogOQorcm91bmRpbmc6ICBoYWxmX3VwCitiYXN4MjcwICB0b1NjaSA5OTk5OTk5OTkgICAgICAgICAgLT4gICA5OTk5OTk5OTkKK2Jhc3gyNzEgIHRvU2NpIDk5OTk5OTk5OTAgICAgICAgICAtPiAgIDkuOTk5OTk5OTlFKzkgICAgICBSb3VuZGVkCitiYXN4MjcyICB0b1NjaSA5OTk5OTk5OTkxICAgICAgICAgLT4gICA5Ljk5OTk5OTk5RSs5ICAgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4MjczICB0b1NjaSA5OTk5OTk5OTkyICAgICAgICAgLT4gICA5Ljk5OTk5OTk5RSs5ICAgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4Mjc0ICB0b1NjaSA5OTk5OTk5OTkzICAgICAgICAgLT4gICA5Ljk5OTk5OTk5RSs5ICAgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4Mjc1ICB0b1NjaSA5OTk5OTk5OTk0ICAgICAgICAgLT4gICA5Ljk5OTk5OTk5RSs5ICAgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4Mjc2ICB0b1NjaSA5OTk5OTk5OTk1ICAgICAgICAgLT4gICAxLjAwMDAwMDAwRSsxMCAgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4Mjc3ICB0b1NjaSA5OTk5OTk5OTk2ICAgICAgICAgLT4gICAxLjAwMDAwMDAwRSsxMCAgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4Mjc4ICB0b1NjaSA5OTk5OTk5OTk3ICAgICAgICAgLT4gICAxLjAwMDAwMDAwRSsxMCAgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4Mjc5ICB0b1NjaSA5OTk5OTk5OTk4ICAgICAgICAgLT4gICAxLjAwMDAwMDAwRSsxMCAgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4MjgwICB0b1NjaSA5OTk5OTk5OTk5ICAgICAgICAgLT4gICAxLjAwMDAwMDAwRSsxMCAgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4MjgxICB0b1NjaSA5OTk5OTk5OTk5OTk5OTk5ICAgLT4gICAxLjAwMDAwMDAwRSsxNiAgICAgUm91bmRlZCBJbmV4YWN0CisKKy0tIGNoZWNrIHJvdW5kaW5nIG1vZGVzIGhlZWRlZAorcHJlY2lzaW9uOiA1Cityb3VuZGluZzogIGNlaWxpbmcKK2Jzcng0MDEgIHRvU2NpICAxLjIzNDUwICAgIC0+ICAxLjIzNDUgIFJvdW5kZWQKK2Jzcng0MDIgIHRvU2NpICAxLjIzNDU0OSAgIC0+ICAxLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQwMyAgdG9TY2kgIDEuMjM0NTUwICAgLT4gIDEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Citic3J4NDA0ICB0b1NjaSAgMS4yMzQ1NTEgICAtPiAgMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgdXAKK2Jzcng0MDUgIHRvU2NpICAxLjIzNDUwICAgIC0+ICAxLjIzNDUgIFJvdW5kZWQKK2Jzcng0MDYgIHRvU2NpICAxLjIzNDU0OSAgIC0+ICAxLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQwNyAgdG9TY2kgIDEuMjM0NTUwICAgLT4gIDEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Citic3J4NDA4ICB0b1NjaSAgMS4yMzQ1NTEgICAtPiAgMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgZmxvb3IKK2Jzcng0MTAgIHRvU2NpICAxLjIzNDUwICAgIC0+ICAxLjIzNDUgIFJvdW5kZWQKK2Jzcng0MTEgIHRvU2NpICAxLjIzNDU0OSAgIC0+ICAxLjIzNDUgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQxMiAgdG9TY2kgIDEuMjM0NTUwICAgLT4gIDEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Citic3J4NDEzICB0b1NjaSAgMS4yMzQ1NTEgICAtPiAgMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl9kb3duCitic3J4NDE1ICB0b1NjaSAgMS4yMzQ1MCAgICAtPiAgMS4yMzQ1ICBSb3VuZGVkCitic3J4NDE2ICB0b1NjaSAgMS4yMzQ1NDkgICAtPiAgMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng0MTcgIHRvU2NpICAxLjIzNDU1MCAgIC0+ICAxLjIzNDUgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQxOCAgdG9TY2kgIDEuMjM0NjUwICAgLT4gIDEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Citic3J4NDE5ICB0b1NjaSAgMS4yMzQ1NTEgICAtPiAgMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitic3J4NDIxICB0b1NjaSAgMS4yMzQ1MCAgICAtPiAgMS4yMzQ1ICBSb3VuZGVkCitic3J4NDIyICB0b1NjaSAgMS4yMzQ1NDkgICAtPiAgMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng0MjMgIHRvU2NpICAxLjIzNDU1MCAgIC0+ICAxLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQyNCAgdG9TY2kgIDEuMjM0NjUwICAgLT4gIDEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Citic3J4NDI1ICB0b1NjaSAgMS4yMzQ1NTEgICAtPiAgMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgZG93bgorYnNyeDQyNiAgdG9TY2kgIDEuMjM0NTAgICAgLT4gIDEuMjM0NSAgUm91bmRlZAorYnNyeDQyNyAgdG9TY2kgIDEuMjM0NTQ5ICAgLT4gIDEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Citic3J4NDI4ICB0b1NjaSAgMS4yMzQ1NTAgICAtPiAgMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng0MjkgIHRvU2NpICAxLjIzNDU1MSAgIC0+ICAxLjIzNDUgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX3VwCitic3J4NDMxICB0b1NjaSAgMS4yMzQ1MCAgICAtPiAgMS4yMzQ1ICBSb3VuZGVkCitic3J4NDMyICB0b1NjaSAgMS4yMzQ1NDkgICAtPiAgMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng0MzMgIHRvU2NpICAxLjIzNDU1MCAgIC0+ICAxLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQzNCAgdG9TY2kgIDEuMjM0NjUwICAgLT4gIDEuMjM0NyAgUm91bmRlZCBJbmV4YWN0Citic3J4NDM1ICB0b1NjaSAgMS4yMzQ1NTEgICAtPiAgMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKKy0tIG5lZ2F0aXZlcworcm91bmRpbmc6ICBjZWlsaW5nCitic3J4NTAxICB0b1NjaSAtMS4yMzQ1MCAgICAtPiAtMS4yMzQ1ICBSb3VuZGVkCitic3J4NTAyICB0b1NjaSAtMS4yMzQ1NDkgICAtPiAtMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MDMgIHRvU2NpIC0xLjIzNDU1MCAgIC0+IC0xLjIzNDUgIFJvdW5kZWQgSW5leGFjdAorYnNyeDUwNCAgdG9TY2kgLTEuMjM0NTUxICAgLT4gLTEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIHVwCitic3J4NTA1ICB0b1NjaSAtMS4yMzQ1MCAgICAtPiAtMS4yMzQ1ICBSb3VuZGVkCitic3J4NTA2ICB0b1NjaSAtMS4yMzQ1NDkgICAtPiAtMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MDcgIHRvU2NpIC0xLjIzNDU1MCAgIC0+IC0xLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorYnNyeDUwOCAgdG9TY2kgLTEuMjM0NTUxICAgLT4gLTEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGZsb29yCitic3J4NTEwICB0b1NjaSAtMS4yMzQ1MCAgICAtPiAtMS4yMzQ1ICBSb3VuZGVkCitic3J4NTExICB0b1NjaSAtMS4yMzQ1NDkgICAtPiAtMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MTIgIHRvU2NpIC0xLjIzNDU1MCAgIC0+IC0xLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorYnNyeDUxMyAgdG9TY2kgLTEuMjM0NTUxICAgLT4gLTEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfZG93bgorYnNyeDUxNSAgdG9TY2kgLTEuMjM0NTAgICAgLT4gLTEuMjM0NSAgUm91bmRlZAorYnNyeDUxNiAgdG9TY2kgLTEuMjM0NTQ5ICAgLT4gLTEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Citic3J4NTE3ICB0b1NjaSAtMS4yMzQ1NTAgICAtPiAtMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MTggIHRvU2NpIC0xLjIzNDY1MCAgIC0+IC0xLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorYnNyeDUxOSAgdG9TY2kgLTEuMjM0NTUxICAgLT4gLTEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfZXZlbgorYnNyeDUyMSAgdG9TY2kgLTEuMjM0NTAgICAgLT4gLTEuMjM0NSAgUm91bmRlZAorYnNyeDUyMiAgdG9TY2kgLTEuMjM0NTQ5ICAgLT4gLTEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Citic3J4NTIzICB0b1NjaSAtMS4yMzQ1NTAgICAtPiAtMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MjQgIHRvU2NpIC0xLjIzNDY1MCAgIC0+IC0xLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorYnNyeDUyNSAgdG9TY2kgLTEuMjM0NTUxICAgLT4gLTEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGRvd24KK2Jzcng1MjYgIHRvU2NpIC0xLjIzNDUwICAgIC0+IC0xLjIzNDUgIFJvdW5kZWQKK2Jzcng1MjcgIHRvU2NpIC0xLjIzNDU0OSAgIC0+IC0xLjIzNDUgIFJvdW5kZWQgSW5leGFjdAorYnNyeDUyOCAgdG9TY2kgLTEuMjM0NTUwICAgLT4gLTEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Citic3J4NTI5ICB0b1NjaSAtMS4yMzQ1NTEgICAtPiAtMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl91cAorYnNyeDUzMSAgdG9TY2kgLTEuMjM0NTAgICAgLT4gLTEuMjM0NSAgUm91bmRlZAorYnNyeDUzMiAgdG9TY2kgLTEuMjM0NTQ5ICAgLT4gLTEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Citic3J4NTMzICB0b1NjaSAtMS4yMzQ1NTAgICAtPiAtMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MzQgIHRvU2NpIC0xLjIzNDY1MCAgIC0+IC0xLjIzNDcgIFJvdW5kZWQgSW5leGFjdAorYnNyeDUzNSAgdG9TY2kgLTEuMjM0NTUxICAgLT4gLTEuMjM0NiAgUm91bmRlZCBJbmV4YWN0CisKKy0tIGEgZmV3IGxhcmdlciBleHBvbmVudHMKK21heEV4cG9uZW50OiA5OTk5OTk5OTkKK21pbkV4cG9uZW50OiAtOTk5OTk5OTk5CitiYXN4NDgwIHRvU2NpICIwLjA5ZTk5OSIgIC0+ICc5RSs5OTcnCitiYXN4NDgxIHRvU2NpICIwLjllOTk5IiAgIC0+ICc5RSs5OTgnCitiYXN4NDgyIHRvU2NpICI5ZTk5OSIgICAgIC0+ICc5RSs5OTknCitiYXN4NDgzIHRvU2NpICI5LjllOTk5IiAgIC0+ICc5LjlFKzk5OScKK2Jhc3g0ODQgdG9TY2kgIjkuOTllOTk5IiAgLT4gJzkuOTlFKzk5OScKK2Jhc3g0ODUgdG9TY2kgIjkuOTllLTk5OSIgLT4gJzkuOTlFLTk5OScKK2Jhc3g0ODYgdG9TY2kgIjkuOWUtOTk5IiAgLT4gJzkuOUUtOTk5JworYmFzeDQ4NyB0b1NjaSAiOWUtOTk5IiAgICAtPiAnOUUtOTk5JworYmFzeDQ4OSB0b1NjaSAiOTllLTk5OSIgICAtPiAnOS45RS05OTgnCitiYXN4NDkwIHRvU2NpICI5OTllLTk5OSIgIC0+ICc5Ljk5RS05OTcnCitiYXN4NDkxIHRvU2NpICcwLjllLTk5OCcgIC0+ICc5RS05OTknCitiYXN4NDkyIHRvU2NpICcwLjA5ZS05OTcnIC0+ICc5RS05OTknCitiYXN4NDkzIHRvU2NpICcwLjFlMTAwMCcgIC0+ICcxRSs5OTknCitiYXN4NDk0IHRvU2NpICcxMGUtMTAwMCcgIC0+ICcxLjBFLTk5OScKKworcm91bmRpbmc6ICBoYWxmX3VwCitwcmVjaXNpb246IDkKKworLS0gVGhlICdiYWRkaWVzJyB0ZXN0cyBmcm9tIERpYWdCaWdEZWNpbWFsLCBwbHVzIHNvbWUgbmV3IG9uZXMKK2Jhc3g1MDAgdG9TY2kgJzEuLjInICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTAxIHRvU2NpICcuJyAgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUwMiB0b1NjaSAnLi4nICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MDMgdG9TY2kgJysrMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTA0IHRvU2NpICctLTEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUwNSB0b1NjaSAnLSsxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MDYgdG9TY2kgJystMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTA3IHRvU2NpICcxMmUnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUwOCB0b1NjaSAnMTJlKysnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MDkgdG9TY2kgJzEyZjQnICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTEwIHRvU2NpICcgKzEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUxMSB0b1NjaSAnKyAxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MTIgdG9TY2kgJzEyICcgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTEzIHRvU2NpICcgKyAxJyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUxNCB0b1NjaSAnIC0gMSAnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MTUgdG9TY2kgJ3gnICAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTE2IHRvU2NpICctMS0nICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUxNyB0b1NjaSAnMTItJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MTggdG9TY2kgJzMrJyAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTE5IHRvU2NpICcnICAgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUyMCB0b1NjaSAnMWUtJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MjEgdG9TY2kgJzdlOTk5OTlhJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTIyIHRvU2NpICc3ZTEyMzU2Nzg5MHgnICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUyMyB0b1NjaSAnN2UxMjM1Njc4OTAxMngnICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MjQgdG9TY2kgJycgICAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTI1IHRvU2NpICdlMTAwJyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUyNiB0b1NjaSAnXHUwZTVhJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MjcgdG9TY2kgJ1x1MGI2NScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTI4IHRvU2NpICcxMjMsNjUnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUyOSB0b1NjaSAnMS4zNC41JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MzAgdG9TY2kgJy4xMjMuNScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTMxIHRvU2NpICcwMS4zNS4nICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUzMiB0b1NjaSAnMDEuMzUtJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MzMgdG9TY2kgJzAwMDAuLicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTM0IHRvU2NpICcuMDAwMC4nICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUzNSB0b1NjaSAnMDAuLjAwJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MzYgdG9TY2kgJzExMWUqMTIzJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTM3IHRvU2NpICcxMTFlMTIzLScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUzOCB0b1NjaSAnMTExZSsxMisnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MzkgdG9TY2kgJzExMWUxLTMtJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTQwIHRvU2NpICcxMTFlMSoyMycgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU0MSB0b1NjaSAnMTExZTFlKzMnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NDIgdG9TY2kgJzFlMS4wJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTQzIHRvU2NpICcxZTEyM2UnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU0NCB0b1NjaSAndGVuJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NDUgdG9TY2kgJ09ORScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTQ2IHRvU2NpICcxZS4xJyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU0NyB0b1NjaSAnMWUxLicgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NDggdG9TY2kgJzFlZScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTQ5IHRvU2NpICdlKzEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU1MCB0b1NjaSAnMS4yMy40JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NTEgdG9TY2kgJzEuMi4xJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTUyIHRvU2NpICcxRSsxLjInICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU1MyB0b1NjaSAnMUUrMS4yLjMnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NTQgdG9TY2kgJzFFKysxJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTU1IHRvU2NpICcxRS0tMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU1NiB0b1NjaSAnMUUrLTEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NTcgdG9TY2kgJzFFLSsxJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTU4IHRvU2NpICcxRScnMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU1OSB0b1NjaSAiMUUiIjEiICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NjAgdG9TY2kgIjFFIiIiIiIgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CistLSBOZWFyLXNwZWNpYWxzCitiYXN4NTYxIHRvU2NpICJxTmFOIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU2MiB0b1NjaSAiTmFOcSIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NjMgdG9TY2kgIk5hTnMiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTY0IHRvU2NpICJJbmZpIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU2NSB0b1NjaSAiSW5maW4iICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NjYgdG9TY2kgIkluZmluaSIgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTY3IHRvU2NpICJJbmZpbml0IiAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU2OCB0b1NjaSAiLUluZmluaXQiICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NjkgdG9TY2kgIjBJbmYiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTcwIHRvU2NpICI5SW5mIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU3MSB0b1NjaSAiLTBJbmYiICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NzIgdG9TY2kgIi05SW5mIiAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTczIHRvU2NpICItc05hIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU3NCB0b1NjaSAieE5hTiIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NzUgdG9TY2kgIjBzTmFOIiAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CisKKy0tIHNvbWUgYmFkZGllcyB3aXRoIGRvdHMgYW5kIEVzIGFuZCBkb3RzIGFuZCBzcGVjaWFscworYmFzeDU3NiB0b1NjaSAgJ2UrMScgICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTc3IHRvU2NpICAnLmUrMScgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NzggdG9TY2kgICcrLmUrMScgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU3OSB0b1NjaSAgJy0uZSsnICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTgwIHRvU2NpICAnLS5lJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1ODEgdG9TY2kgICdFKzEnICAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU4MiB0b1NjaSAgJy5FKzEnICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTgzIHRvU2NpICAnKy5FKzEnICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1ODQgdG9TY2kgICctLkUrJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU4NSB0b1NjaSAgJy0uRScgICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CisKK2Jhc3g1ODYgdG9TY2kgICcuTmFOJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU4NyB0b1NjaSAgJy0uTmFOJyAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTg4IHRvU2NpICAnKy5zTmFOJyAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1ODkgdG9TY2kgICcrLkluZicgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU5MCB0b1NjaSAgJy5JbmZpbml0eScgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CisKKy0tIFplcm9zCitiYXN4NjAxIHRvU2NpIDAuMDAwMDAwMDAwICAgICAgIC0+IDBFLTkKK2Jhc3g2MDIgdG9TY2kgMC4wMDAwMDAwMCAgICAgICAgLT4gMEUtOAorYmFzeDYwMyB0b1NjaSAwLjAwMDAwMDAgICAgICAgICAtPiAwRS03CitiYXN4NjA0IHRvU2NpIDAuMDAwMDAwICAgICAgICAgIC0+IDAuMDAwMDAwCitiYXN4NjA1IHRvU2NpIDAuMDAwMDAgICAgICAgICAgIC0+IDAuMDAwMDAKK2Jhc3g2MDYgdG9TY2kgMC4wMDAwICAgICAgICAgICAgLT4gMC4wMDAwCitiYXN4NjA3IHRvU2NpIDAuMDAwICAgICAgICAgICAgIC0+IDAuMDAwCitiYXN4NjA4IHRvU2NpIDAuMDAgICAgICAgICAgICAgIC0+IDAuMDAKK2Jhc3g2MDkgdG9TY2kgMC4wICAgICAgICAgICAgICAgLT4gMC4wCitiYXN4NjEwIHRvU2NpICAuMCAgICAgICAgICAgICAgIC0+IDAuMAorYmFzeDYxMSB0b1NjaSAwLiAgICAgICAgICAgICAgICAtPiAwCitiYXN4NjEyIHRvU2NpIC0uMCAgICAgICAgICAgICAgIC0+IC0wLjAKK2Jhc3g2MTMgdG9TY2kgLTAuICAgICAgICAgICAgICAgLT4gLTAKK2Jhc3g2MTQgdG9TY2kgLTAuMCAgICAgICAgICAgICAgLT4gLTAuMAorYmFzeDYxNSB0b1NjaSAtMC4wMCAgICAgICAgICAgICAtPiAtMC4wMAorYmFzeDYxNiB0b1NjaSAtMC4wMDAgICAgICAgICAgICAtPiAtMC4wMDAKK2Jhc3g2MTcgdG9TY2kgLTAuMDAwMCAgICAgICAgICAgLT4gLTAuMDAwMAorYmFzeDYxOCB0b1NjaSAtMC4wMDAwMCAgICAgICAgICAtPiAtMC4wMDAwMAorYmFzeDYxOSB0b1NjaSAtMC4wMDAwMDAgICAgICAgICAtPiAtMC4wMDAwMDAKK2Jhc3g2MjAgdG9TY2kgLTAuMDAwMDAwMCAgICAgICAgLT4gLTBFLTcKK2Jhc3g2MjEgdG9TY2kgLTAuMDAwMDAwMDAgICAgICAgLT4gLTBFLTgKK2Jhc3g2MjIgdG9TY2kgLTAuMDAwMDAwMDAwICAgICAgLT4gLTBFLTkKKworYmFzeDYzMCB0b1NjaSAgMC4wMEUrMCAgICAgICAgICAtPiAwLjAwCitiYXN4NjMxIHRvU2NpICAwLjAwRSsxICAgICAgICAgIC0+IDAuMAorYmFzeDYzMiB0b1NjaSAgMC4wMEUrMiAgICAgICAgICAtPiAwCitiYXN4NjMzIHRvU2NpICAwLjAwRSszICAgICAgICAgIC0+IDBFKzEKK2Jhc3g2MzQgdG9TY2kgIDAuMDBFKzQgICAgICAgICAgLT4gMEUrMgorYmFzeDYzNSB0b1NjaSAgMC4wMEUrNSAgICAgICAgICAtPiAwRSszCitiYXN4NjM2IHRvU2NpICAwLjAwRSs2ICAgICAgICAgIC0+IDBFKzQKK2Jhc3g2MzcgdG9TY2kgIDAuMDBFKzcgICAgICAgICAgLT4gMEUrNQorYmFzeDYzOCB0b1NjaSAgMC4wMEUrOCAgICAgICAgICAtPiAwRSs2CitiYXN4NjM5IHRvU2NpICAwLjAwRSs5ICAgICAgICAgIC0+IDBFKzcKKworYmFzeDY0MCB0b1NjaSAgMC4wRSswICAgICAgICAgICAtPiAwLjAKK2Jhc3g2NDEgdG9TY2kgIDAuMEUrMSAgICAgICAgICAgLT4gMAorYmFzeDY0MiB0b1NjaSAgMC4wRSsyICAgICAgICAgICAtPiAwRSsxCitiYXN4NjQzIHRvU2NpICAwLjBFKzMgICAgICAgICAgIC0+IDBFKzIKK2Jhc3g2NDQgdG9TY2kgIDAuMEUrNCAgICAgICAgICAgLT4gMEUrMworYmFzeDY0NSB0b1NjaSAgMC4wRSs1ICAgICAgICAgICAtPiAwRSs0CitiYXN4NjQ2IHRvU2NpICAwLjBFKzYgICAgICAgICAgIC0+IDBFKzUKK2Jhc3g2NDcgdG9TY2kgIDAuMEUrNyAgICAgICAgICAgLT4gMEUrNgorYmFzeDY0OCB0b1NjaSAgMC4wRSs4ICAgICAgICAgICAtPiAwRSs3CitiYXN4NjQ5IHRvU2NpICAwLjBFKzkgICAgICAgICAgIC0+IDBFKzgKKworYmFzeDY1MCB0b1NjaSAgMEUrMCAgICAgICAgICAgICAtPiAwCitiYXN4NjUxIHRvU2NpICAwRSsxICAgICAgICAgICAgIC0+IDBFKzEKK2Jhc3g2NTIgdG9TY2kgIDBFKzIgICAgICAgICAgICAgLT4gMEUrMgorYmFzeDY1MyB0b1NjaSAgMEUrMyAgICAgICAgICAgICAtPiAwRSszCitiYXN4NjU0IHRvU2NpICAwRSs0ICAgICAgICAgICAgIC0+IDBFKzQKK2Jhc3g2NTUgdG9TY2kgIDBFKzUgICAgICAgICAgICAgLT4gMEUrNQorYmFzeDY1NiB0b1NjaSAgMEUrNiAgICAgICAgICAgICAtPiAwRSs2CitiYXN4NjU3IHRvU2NpICAwRSs3ICAgICAgICAgICAgIC0+IDBFKzcKK2Jhc3g2NTggdG9TY2kgIDBFKzggICAgICAgICAgICAgLT4gMEUrOAorYmFzeDY1OSB0b1NjaSAgMEUrOSAgICAgICAgICAgICAtPiAwRSs5CisKK2Jhc3g2NjAgdG9TY2kgIDAuMEUtMCAgICAgICAgICAgLT4gMC4wCitiYXN4NjYxIHRvU2NpICAwLjBFLTEgICAgICAgICAgIC0+IDAuMDAKK2Jhc3g2NjIgdG9TY2kgIDAuMEUtMiAgICAgICAgICAgLT4gMC4wMDAKK2Jhc3g2NjMgdG9TY2kgIDAuMEUtMyAgICAgICAgICAgLT4gMC4wMDAwCitiYXN4NjY0IHRvU2NpICAwLjBFLTQgICAgICAgICAgIC0+IDAuMDAwMDAKK2Jhc3g2NjUgdG9TY2kgIDAuMEUtNSAgICAgICAgICAgLT4gMC4wMDAwMDAKK2Jhc3g2NjYgdG9TY2kgIDAuMEUtNiAgICAgICAgICAgLT4gMEUtNworYmFzeDY2NyB0b1NjaSAgMC4wRS03ICAgICAgICAgICAtPiAwRS04CitiYXN4NjY4IHRvU2NpICAwLjBFLTggICAgICAgICAgIC0+IDBFLTkKK2Jhc3g2NjkgdG9TY2kgIDAuMEUtOSAgICAgICAgICAgLT4gMEUtMTAKKworYmFzeDY3MCB0b1NjaSAgMC4wMEUtMCAgICAgICAgICAtPiAwLjAwCitiYXN4NjcxIHRvU2NpICAwLjAwRS0xICAgICAgICAgIC0+IDAuMDAwCitiYXN4NjcyIHRvU2NpICAwLjAwRS0yICAgICAgICAgIC0+IDAuMDAwMAorYmFzeDY3MyB0b1NjaSAgMC4wMEUtMyAgICAgICAgICAtPiAwLjAwMDAwCitiYXN4Njc0IHRvU2NpICAwLjAwRS00ICAgICAgICAgIC0+IDAuMDAwMDAwCitiYXN4Njc1IHRvU2NpICAwLjAwRS01ICAgICAgICAgIC0+IDBFLTcKK2Jhc3g2NzYgdG9TY2kgIDAuMDBFLTYgICAgICAgICAgLT4gMEUtOAorYmFzeDY3NyB0b1NjaSAgMC4wMEUtNyAgICAgICAgICAtPiAwRS05CitiYXN4Njc4IHRvU2NpICAwLjAwRS04ICAgICAgICAgIC0+IDBFLTEwCitiYXN4Njc5IHRvU2NpICAwLjAwRS05ICAgICAgICAgIC0+IDBFLTExCisKK2Jhc3g2ODAgdG9TY2kgIDAwMDAwMC4gICAgICAgICAgLT4gIDAKK2Jhc3g2ODEgdG9TY2kgICAwMDAwMC4gICAgICAgICAgLT4gIDAKK2Jhc3g2ODIgdG9TY2kgICAgMDAwMC4gICAgICAgICAgLT4gIDAKK2Jhc3g2ODMgdG9TY2kgICAgIDAwMC4gICAgICAgICAgLT4gIDAKK2Jhc3g2ODQgdG9TY2kgICAgICAwMC4gICAgICAgICAgLT4gIDAKK2Jhc3g2ODUgdG9TY2kgICAgICAgMC4gICAgICAgICAgLT4gIDAKK2Jhc3g2ODYgdG9TY2kgICswMDAwMC4gICAgICAgICAgLT4gIDAKK2Jhc3g2ODcgdG9TY2kgIC0wMDAwMC4gICAgICAgICAgLT4gLTAKK2Jhc3g2ODggdG9TY2kgICswLiAgICAgICAgICAgICAgLT4gIDAKK2Jhc3g2ODkgdG9TY2kgIC0wLiAgICAgICAgICAgICAgLT4gLTAKKworLS0gU3BlY2lhbHMKK3ByZWNpc2lvbjogNAorYmFzeDcwMCB0b1NjaSAiTmFOIiAgICAgICAgICAgICAtPiBOYU4KK2Jhc3g3MDEgdG9TY2kgIm5hbiIgICAgICAgICAgICAgLT4gTmFOCitiYXN4NzAyIHRvU2NpICJuQW4iICAgICAgICAgICAgIC0+IE5hTgorYmFzeDcwMyB0b1NjaSAiTkFOIiAgICAgICAgICAgICAtPiBOYU4KK2Jhc3g3MDQgdG9TY2kgIitOYU4iICAgICAgICAgICAgLT4gTmFOCitiYXN4NzA1IHRvU2NpICIrbmFuIiAgICAgICAgICAgIC0+IE5hTgorYmFzeDcwNiB0b1NjaSAiK25BbiIgICAgICAgICAgICAtPiBOYU4KK2Jhc3g3MDcgdG9TY2kgIitOQU4iICAgICAgICAgICAgLT4gTmFOCitiYXN4NzA4IHRvU2NpICItTmFOIiAgICAgICAgICAgIC0+IC1OYU4KK2Jhc3g3MDkgdG9TY2kgIi1uYW4iICAgICAgICAgICAgLT4gLU5hTgorYmFzeDcxMCB0b1NjaSAiLW5BbiIgICAgICAgICAgICAtPiAtTmFOCitiYXN4NzExIHRvU2NpICItTkFOIiAgICAgICAgICAgIC0+IC1OYU4KK2Jhc3g3MTIgdG9TY2kgJ05hTjAnICAgICAgICAgICAgLT4gTmFOCitiYXN4NzEzIHRvU2NpICdOYU4xJyAgICAgICAgICAgIC0+IE5hTjEKK2Jhc3g3MTQgdG9TY2kgJ05hTjEyJyAgICAgICAgICAgLT4gTmFOMTIKK2Jhc3g3MTUgdG9TY2kgJ05hTjEyMycgICAgICAgICAgLT4gTmFOMTIzCitiYXN4NzE2IHRvU2NpICdOYU4xMjM0JyAgICAgICAgIC0+IE5hTjEyMzQKK2Jhc3g3MTcgdG9TY2kgJ05hTjAxJyAgICAgICAgICAgLT4gTmFOMQorYmFzeDcxOCB0b1NjaSAnTmFOMDEyJyAgICAgICAgICAtPiBOYU4xMgorYmFzeDcxOSB0b1NjaSAnTmFOMDEyMycgICAgICAgICAtPiBOYU4xMjMKK2Jhc3g3MjAgdG9TY2kgJ05hTjAxMjM0JyAgICAgICAgLT4gTmFOMTIzNAorYmFzeDcyMSB0b1NjaSAnTmFOMDAxJyAgICAgICAgICAtPiBOYU4xCitiYXN4NzIyIHRvU2NpICdOYU4wMDEyJyAgICAgICAgIC0+IE5hTjEyCitiYXN4NzIzIHRvU2NpICdOYU4wMDEyMycgICAgICAgIC0+IE5hTjEyMworYmFzeDcyNCB0b1NjaSAnTmFOMDAxMjM0JyAgICAgICAtPiBOYU4xMjM0CitiYXN4NzI1IHRvU2NpICdOYU4xMjM0NScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDcyNiB0b1NjaSAnTmFOMTIzZSsxJyAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g3MjcgdG9TY2kgJ05hTjEyLjQ1JyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NzI4IHRvU2NpICdOYU4tMTInICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDcyOSB0b1NjaSAnTmFOKzEyJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKKworYmFzeDczMCB0b1NjaSAic05hTiIgICAgICAgICAgICAtPiBzTmFOCitiYXN4NzMxIHRvU2NpICJzbmFuIiAgICAgICAgICAgIC0+IHNOYU4KK2Jhc3g3MzIgdG9TY2kgIlNuQW4iICAgICAgICAgICAgLT4gc05hTgorYmFzeDczMyB0b1NjaSAiU05BTiIgICAgICAgICAgICAtPiBzTmFOCitiYXN4NzM0IHRvU2NpICIrc05hTiIgICAgICAgICAgIC0+IHNOYU4KK2Jhc3g3MzUgdG9TY2kgIitzbmFuIiAgICAgICAgICAgLT4gc05hTgorYmFzeDczNiB0b1NjaSAiK1NuQW4iICAgICAgICAgICAtPiBzTmFOCitiYXN4NzM3IHRvU2NpICIrU05BTiIgICAgICAgICAgIC0+IHNOYU4KK2Jhc3g3MzggdG9TY2kgIi1zTmFOIiAgICAgICAgICAgLT4gLXNOYU4KK2Jhc3g3MzkgdG9TY2kgIi1zbmFuIiAgICAgICAgICAgLT4gLXNOYU4KK2Jhc3g3NDAgdG9TY2kgIi1TbkFuIiAgICAgICAgICAgLT4gLXNOYU4KK2Jhc3g3NDEgdG9TY2kgIi1TTkFOIiAgICAgICAgICAgLT4gLXNOYU4KK2Jhc3g3NDIgdG9TY2kgJ3NOYU4wMDAwJyAgICAgICAgLT4gc05hTgorYmFzeDc0MyB0b1NjaSAnc05hTjcnICAgICAgICAgICAtPiBzTmFONworYmFzeDc0NCB0b1NjaSAnc05hTjAwNzIzNCcgICAgICAtPiBzTmFONzIzNAorYmFzeDc0NSB0b1NjaSAnc05hTjcyMzQ1JyAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g3NDYgdG9TY2kgJ3NOYU43Mi40NScgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NzQ3IHRvU2NpICdzTmFOLTcyJyAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorCitiYXN4NzQ4IHRvU2NpICJJbmYiICAgICAgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzQ5IHRvU2NpICJpbmYiICAgICAgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzUwIHRvU2NpICJpTmYiICAgICAgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzUxIHRvU2NpICJJTkYiICAgICAgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzUyIHRvU2NpICIrSW5mIiAgICAgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzUzIHRvU2NpICIraW5mIiAgICAgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzU0IHRvU2NpICIraU5mIiAgICAgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzU1IHRvU2NpICIrSU5GIiAgICAgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzU2IHRvU2NpICItSW5mIiAgICAgICAgICAgIC0+IC1JbmZpbml0eQorYmFzeDc1NyB0b1NjaSAiLWluZiIgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2Jhc3g3NTggdG9TY2kgIi1pTmYiICAgICAgICAgICAgLT4gLUluZmluaXR5CitiYXN4NzU5IHRvU2NpICItSU5GIiAgICAgICAgICAgIC0+IC1JbmZpbml0eQorCitiYXN4NzYwIHRvU2NpICJJbmZpbml0eSIgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzYxIHRvU2NpICJpbmZpbml0eSIgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzYyIHRvU2NpICJpTmZJbkl0WSIgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzYzIHRvU2NpICJJTkZJTklUWSIgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzY0IHRvU2NpICIrSW5maW5pdHkiICAgICAgIC0+IEluZmluaXR5CitiYXN4NzY1IHRvU2NpICIraW5maW5pdHkiICAgICAgIC0+IEluZmluaXR5CitiYXN4NzY2IHRvU2NpICIraU5mSW5JdFkiICAgICAgIC0+IEluZmluaXR5CitiYXN4NzY3IHRvU2NpICIrSU5GSU5JVFkiICAgICAgIC0+IEluZmluaXR5CitiYXN4NzY4IHRvU2NpICItSW5maW5pdHkiICAgICAgIC0+IC1JbmZpbml0eQorYmFzeDc2OSB0b1NjaSAiLWluZmluaXR5IiAgICAgICAtPiAtSW5maW5pdHkKK2Jhc3g3NzAgdG9TY2kgIi1pTmZJbkl0WSIgICAgICAgLT4gLUluZmluaXR5CitiYXN4NzcxIHRvU2NpICItSU5GSU5JVFkiICAgICAgIC0+IC1JbmZpbml0eQorCistLSBTcGVjaWFscyBhbmQgemVyb3MgZm9yIHRvRW5nCitiYXN4NzcyIHRvRW5nICJOYU4iICAgICAgICAgICAgICAtPiBOYU4KK2Jhc3g3NzMgdG9FbmcgIi1JbmZpbml0eSIgICAgICAgIC0+IC1JbmZpbml0eQorYmFzeDc3NCB0b0VuZyAiLXNOYU4iICAgICAgICAgICAgLT4gLXNOYU4KK2Jhc3g3NzUgdG9FbmcgIi1OYU4iICAgICAgICAgICAgIC0+IC1OYU4KK2Jhc3g3NzYgdG9FbmcgIitJbmZpbml0eSIgICAgICAgIC0+IEluZmluaXR5CitiYXN4Nzc4IHRvRW5nICIrc05hTiIgICAgICAgICAgICAtPiBzTmFOCitiYXN4Nzc5IHRvRW5nICIrTmFOIiAgICAgICAgICAgICAtPiBOYU4KK2Jhc3g3ODAgdG9FbmcgIklORklOSVRZIiAgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzgxIHRvRW5nICJTTkFOIiAgICAgICAgICAgICAtPiBzTmFOCitiYXN4NzgyIHRvRW5nICJOQU4iICAgICAgICAgICAgICAtPiBOYU4KK2Jhc3g3ODMgdG9FbmcgImluZmluaXR5IiAgICAgICAgIC0+IEluZmluaXR5CitiYXN4Nzg0IHRvRW5nICJzbmFuIiAgICAgICAgICAgICAtPiBzTmFOCitiYXN4Nzg1IHRvRW5nICJuYW4iICAgICAgICAgICAgICAtPiBOYU4KK2Jhc3g3ODYgdG9FbmcgIkluRklOSVRZIiAgICAgICAgIC0+IEluZmluaXR5CitiYXN4Nzg3IHRvRW5nICJTbkFOIiAgICAgICAgICAgICAtPiBzTmFOCitiYXN4Nzg4IHRvRW5nICJuQU4iICAgICAgICAgICAgICAtPiBOYU4KK2Jhc3g3ODkgdG9FbmcgImlOZmluaXR5IiAgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzkwIHRvRW5nICJzTmFuIiAgICAgICAgICAgICAtPiBzTmFOCitiYXN4NzkxIHRvRW5nICJOYW4iICAgICAgICAgICAgICAtPiBOYU4KK2Jhc3g3OTIgdG9FbmcgIkluZmluaXR5IiAgICAgICAgIC0+IEluZmluaXR5CitiYXN4NzkzIHRvRW5nICJzTmFOIiAgICAgICAgICAgICAtPiBzTmFOCisKKy0tIFplcm8gdG9FbmcsIGV0Yy4KK2Jhc3g4MDAgdG9FbmcgMGUrMSAgICAgICAgICAgICAgLT4gIjAuMDBFKzMiICAtLSBkb2MgZXhhbXBsZQorCitiYXN4ODAxIHRvRW5nIDAuMDAwMDAwMDAwICAgICAgIC0+IDBFLTkKK2Jhc3g4MDIgdG9FbmcgMC4wMDAwMDAwMCAgICAgICAgLT4gMC4wMEUtNgorYmFzeDgwMyB0b0VuZyAwLjAwMDAwMDAgICAgICAgICAtPiAwLjBFLTYKK2Jhc3g4MDQgdG9FbmcgMC4wMDAwMDAgICAgICAgICAgLT4gMC4wMDAwMDAKK2Jhc3g4MDUgdG9FbmcgMC4wMDAwMCAgICAgICAgICAgLT4gMC4wMDAwMAorYmFzeDgwNiB0b0VuZyAwLjAwMDAgICAgICAgICAgICAtPiAwLjAwMDAKK2Jhc3g4MDcgdG9FbmcgMC4wMDAgICAgICAgICAgICAgLT4gMC4wMDAKK2Jhc3g4MDggdG9FbmcgMC4wMCAgICAgICAgICAgICAgLT4gMC4wMAorYmFzeDgwOSB0b0VuZyAwLjAgICAgICAgICAgICAgICAtPiAwLjAKK2Jhc3g4MTAgdG9FbmcgIC4wICAgICAgICAgICAgICAgLT4gMC4wCitiYXN4ODExIHRvRW5nIDAuICAgICAgICAgICAgICAgIC0+IDAKK2Jhc3g4MTIgdG9FbmcgLS4wICAgICAgICAgICAgICAgLT4gLTAuMAorYmFzeDgxMyB0b0VuZyAtMC4gICAgICAgICAgICAgICAtPiAtMAorYmFzeDgxNCB0b0VuZyAtMC4wICAgICAgICAgICAgICAtPiAtMC4wCitiYXN4ODE1IHRvRW5nIC0wLjAwICAgICAgICAgICAgIC0+IC0wLjAwCitiYXN4ODE2IHRvRW5nIC0wLjAwMCAgICAgICAgICAgIC0+IC0wLjAwMAorYmFzeDgxNyB0b0VuZyAtMC4wMDAwICAgICAgICAgICAtPiAtMC4wMDAwCitiYXN4ODE4IHRvRW5nIC0wLjAwMDAwICAgICAgICAgIC0+IC0wLjAwMDAwCitiYXN4ODE5IHRvRW5nIC0wLjAwMDAwMCAgICAgICAgIC0+IC0wLjAwMDAwMAorYmFzeDgyMCB0b0VuZyAtMC4wMDAwMDAwICAgICAgICAtPiAtMC4wRS02CitiYXN4ODIxIHRvRW5nIC0wLjAwMDAwMDAwICAgICAgIC0+IC0wLjAwRS02CitiYXN4ODIyIHRvRW5nIC0wLjAwMDAwMDAwMCAgICAgIC0+IC0wRS05CisKK2Jhc3g4MzAgdG9FbmcgIDAuMDBFKzAgICAgICAgICAgLT4gMC4wMAorYmFzeDgzMSB0b0VuZyAgMC4wMEUrMSAgICAgICAgICAtPiAwLjAKK2Jhc3g4MzIgdG9FbmcgIDAuMDBFKzIgICAgICAgICAgLT4gMAorYmFzeDgzMyB0b0VuZyAgMC4wMEUrMyAgICAgICAgICAtPiAwLjAwRSszCitiYXN4ODM0IHRvRW5nICAwLjAwRSs0ICAgICAgICAgIC0+IDAuMEUrMworYmFzeDgzNSB0b0VuZyAgMC4wMEUrNSAgICAgICAgICAtPiAwRSszCitiYXN4ODM2IHRvRW5nICAwLjAwRSs2ICAgICAgICAgIC0+IDAuMDBFKzYKK2Jhc3g4MzcgdG9FbmcgIDAuMDBFKzcgICAgICAgICAgLT4gMC4wRSs2CitiYXN4ODM4IHRvRW5nICAwLjAwRSs4ICAgICAgICAgIC0+IDBFKzYKK2Jhc3g4MzkgdG9FbmcgIDAuMDBFKzkgICAgICAgICAgLT4gMC4wMEUrOQorCitiYXN4ODQwIHRvRW5nICAwLjBFKzAgICAgICAgICAgIC0+IDAuMAorYmFzeDg0MSB0b0VuZyAgMC4wRSsxICAgICAgICAgICAtPiAwCitiYXN4ODQyIHRvRW5nICAwLjBFKzIgICAgICAgICAgIC0+IDAuMDBFKzMKK2Jhc3g4NDMgdG9FbmcgIDAuMEUrMyAgICAgICAgICAgLT4gMC4wRSszCitiYXN4ODQ0IHRvRW5nICAwLjBFKzQgICAgICAgICAgIC0+IDBFKzMKK2Jhc3g4NDUgdG9FbmcgIDAuMEUrNSAgICAgICAgICAgLT4gMC4wMEUrNgorYmFzeDg0NiB0b0VuZyAgMC4wRSs2ICAgICAgICAgICAtPiAwLjBFKzYKK2Jhc3g4NDcgdG9FbmcgIDAuMEUrNyAgICAgICAgICAgLT4gMEUrNgorYmFzeDg0OCB0b0VuZyAgMC4wRSs4ICAgICAgICAgICAtPiAwLjAwRSs5CitiYXN4ODQ5IHRvRW5nICAwLjBFKzkgICAgICAgICAgIC0+IDAuMEUrOQorCitiYXN4ODUwIHRvRW5nICAwRSswICAgICAgICAgICAgIC0+IDAKK2Jhc3g4NTEgdG9FbmcgIDBFKzEgICAgICAgICAgICAgLT4gMC4wMEUrMworYmFzeDg1MiB0b0VuZyAgMEUrMiAgICAgICAgICAgICAtPiAwLjBFKzMKK2Jhc3g4NTMgdG9FbmcgIDBFKzMgICAgICAgICAgICAgLT4gMEUrMworYmFzeDg1NCB0b0VuZyAgMEUrNCAgICAgICAgICAgICAtPiAwLjAwRSs2CitiYXN4ODU1IHRvRW5nICAwRSs1ICAgICAgICAgICAgIC0+IDAuMEUrNgorYmFzeDg1NiB0b0VuZyAgMEUrNiAgICAgICAgICAgICAtPiAwRSs2CitiYXN4ODU3IHRvRW5nICAwRSs3ICAgICAgICAgICAgIC0+IDAuMDBFKzkKK2Jhc3g4NTggdG9FbmcgIDBFKzggICAgICAgICAgICAgLT4gMC4wRSs5CitiYXN4ODU5IHRvRW5nICAwRSs5ICAgICAgICAgICAgIC0+IDBFKzkKKworYmFzeDg2MCB0b0VuZyAgMC4wRS0wICAgICAgICAgICAtPiAwLjAKK2Jhc3g4NjEgdG9FbmcgIDAuMEUtMSAgICAgICAgICAgLT4gMC4wMAorYmFzeDg2MiB0b0VuZyAgMC4wRS0yICAgICAgICAgICAtPiAwLjAwMAorYmFzeDg2MyB0b0VuZyAgMC4wRS0zICAgICAgICAgICAtPiAwLjAwMDAKK2Jhc3g4NjQgdG9FbmcgIDAuMEUtNCAgICAgICAgICAgLT4gMC4wMDAwMAorYmFzeDg2NSB0b0VuZyAgMC4wRS01ICAgICAgICAgICAtPiAwLjAwMDAwMAorYmFzeDg2NiB0b0VuZyAgMC4wRS02ICAgICAgICAgICAtPiAwLjBFLTYKK2Jhc3g4NjcgdG9FbmcgIDAuMEUtNyAgICAgICAgICAgLT4gMC4wMEUtNgorYmFzeDg2OCB0b0VuZyAgMC4wRS04ICAgICAgICAgICAtPiAwRS05CitiYXN4ODY5IHRvRW5nICAwLjBFLTkgICAgICAgICAgIC0+IDAuMEUtOQorCitiYXN4ODcwIHRvRW5nICAwLjAwRS0wICAgICAgICAgIC0+IDAuMDAKK2Jhc3g4NzEgdG9FbmcgIDAuMDBFLTEgICAgICAgICAgLT4gMC4wMDAKK2Jhc3g4NzIgdG9FbmcgIDAuMDBFLTIgICAgICAgICAgLT4gMC4wMDAwCitiYXN4ODczIHRvRW5nICAwLjAwRS0zICAgICAgICAgIC0+IDAuMDAwMDAKK2Jhc3g4NzQgdG9FbmcgIDAuMDBFLTQgICAgICAgICAgLT4gMC4wMDAwMDAKK2Jhc3g4NzUgdG9FbmcgIDAuMDBFLTUgICAgICAgICAgLT4gMC4wRS02CitiYXN4ODc2IHRvRW5nICAwLjAwRS02ICAgICAgICAgIC0+IDAuMDBFLTYKK2Jhc3g4NzcgdG9FbmcgIDAuMDBFLTcgICAgICAgICAgLT4gMEUtOQorYmFzeDg3OCB0b0VuZyAgMC4wMEUtOCAgICAgICAgICAtPiAwLjBFLTkKK2Jhc3g4NzkgdG9FbmcgIDAuMDBFLTkgICAgICAgICAgLT4gMC4wMEUtOQorCisKK3JvdW5kaW5nOiAgaGFsZl91cAorcHJlY2lzaW9uOiA5CistLSBzdWJub3JtYWxzIGFuZCBvdmVyZmxvd3MKK2Jhc3g5MDYgdG9TY2kgJzk5ZTk5OTk5OTk5OScgICAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDkwNyB0b1NjaSAnOTk5ZTk5OTk5OTk5OScgICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitiYXN4OTA4IHRvU2NpICcwLjllLTk5OTk5OTk5OScgICAgIC0+IDlFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCitiYXN4OTA5IHRvU2NpICcwLjA5ZS05OTk5OTk5OTknICAgIC0+IDlFLTEwMDAwMDAwMDEgU3Vibm9ybWFsCitiYXN4OTEwIHRvU2NpICcwLjFlMTAwMDAwMDAwMCcgICAgIC0+IDFFKzk5OTk5OTk5OQorYmFzeDkxMSB0b1NjaSAnMTBlLTEwMDAwMDAwMDAnICAgICAtPiAxLjBFLTk5OTk5OTk5OQorYmFzeDkxMiB0b1NjaSAnMC45ZTk5OTk5OTk5OTknICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitiYXN4OTEzIHRvU2NpICc5OWUtOTk5OTk5OTk5OScgICAgIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorYmFzeDkxNCB0b1NjaSAnMTExZTk5OTk5OTk5OTknICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitiYXN4OTE1IHRvU2NpICcxMTExZS05OTk5OTk5OTk5JyAgIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorYmFzeDkxNiB0b1NjaSAnMTExMWUtOTk5OTk5OTk5OTknICAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Jhc3g5MTcgdG9TY2kgJzdlMTAwMDAwMDAwMCcgICAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorLS0gbmVnYXRpdmVzIHRoZSBzYW1lCitiYXN4OTE4IHRvU2NpICctOTllOTk5OTk5OTk5JyAgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitiYXN4OTE5IHRvU2NpICctOTk5ZTk5OTk5OTk5OScgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitiYXN4OTIwIHRvU2NpICctMC45ZS05OTk5OTk5OTknICAgIC0+IC05RS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorYmFzeDkyMSB0b1NjaSAnLTAuMDllLTk5OTk5OTk5OScgICAtPiAtOUUtMTAwMDAwMDAwMSBTdWJub3JtYWwKK2Jhc3g5MjIgdG9TY2kgJy0wLjFlMTAwMDAwMDAwMCcgICAgLT4gLTFFKzk5OTk5OTk5OQorYmFzeDkyMyB0b1NjaSAnLTEwZS0xMDAwMDAwMDAwJyAgICAtPiAtMS4wRS05OTk5OTk5OTkKK2Jhc3g5MjQgdG9TY2kgJy0wLjllOTk5OTk5OTk5OScgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2Jhc3g5MjUgdG9TY2kgJy05OWUtOTk5OTk5OTk5OScgICAgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorYmFzeDkyNiB0b1NjaSAnLTExMWU5OTk5OTk5OTk5JyAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDkyNyB0b1NjaSAnLTExMTFlLTk5OTk5OTk5OTknICAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitiYXN4OTI4IHRvU2NpICctMTExMWUtOTk5OTk5OTk5OTknIC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Jhc3g5MjkgdG9TY2kgJy03ZTEwMDAwMDAwMDAnICAgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICBjZWlsaW5nCitiYXN4OTMwIHRvU2NpICAnN2UxMDAwMDAwMDAwJyAgICAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitiYXN4OTMxIHRvU2NpICctN2UxMDAwMDAwMDAwJyAgICAgIC0+IC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6ICB1cAorYmFzeDkzMiB0b1NjaSAgJzdlMTAwMDAwMDAwMCcgICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDkzMyB0b1NjaSAnLTdlMTAwMDAwMDAwMCcgICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6ICBkb3duCitiYXN4OTM0IHRvU2NpICAnN2UxMDAwMDAwMDAwJyAgICAgIC0+ICA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDkzNSB0b1NjaSAnLTdlMTAwMDAwMDAwMCcgICAgICAtPiAtOS45OTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgZmxvb3IKK2Jhc3g5MzYgdG9TY2kgICc3ZTEwMDAwMDAwMDAnICAgICAgLT4gIDkuOTk5OTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitiYXN4OTM3IHRvU2NpICctN2UxMDAwMDAwMDAwJyAgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgaGFsZl91cAorYmFzeDkzOCB0b1NjaSAgJzdlMTAwMDAwMDAwMCcgICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDkzOSB0b1NjaSAnLTdlMTAwMDAwMDAwMCcgICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6ICBoYWxmX2V2ZW4KK2Jhc3g5NDAgdG9TY2kgICc3ZTEwMDAwMDAwMDAnICAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2Jhc3g5NDEgdG9TY2kgJy03ZTEwMDAwMDAwMDAnICAgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgaGFsZl9kb3duCitiYXN4OTQyIHRvU2NpICAnN2UxMDAwMDAwMDAwJyAgICAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitiYXN4OTQzIHRvU2NpICctN2UxMDAwMDAwMDAwJyAgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCisKKworLS0gR2lnYSBleHBvbmVudCBpbml0aWFsIHRlc3RzCittYXhFeHBvbmVudDogOTk5OTk5OTk5CittaW5FeHBvbmVudDogLTk5OTk5OTk5OQorCitiYXN4OTUxIHRvU2NpICc5OWU5OTknICAgICAgICAgIC0+ICc5LjlFKzEwMDAnCitiYXN4OTUyIHRvU2NpICc5OTllOTk5JyAgICAgICAgIC0+ICc5Ljk5RSsxMDAxJworYmFzeDk1MyB0b1NjaSAnMC45ZS05OTknICAgICAgICAtPiAnOUUtMTAwMCcKK2Jhc3g5NTQgdG9TY2kgJzAuMDllLTk5OScgICAgICAgLT4gJzlFLTEwMDEnCitiYXN4OTU1IHRvU2NpICcwLjFlMTAwMScgICAgICAgIC0+ICcxRSsxMDAwJworYmFzeDk1NiB0b1NjaSAnMTBlLTEwMDEnICAgICAgICAtPiAnMS4wRS0xMDAwJworYmFzeDk1NyB0b1NjaSAnMC45ZTk5OTknICAgICAgICAtPiAnOUUrOTk5OCcKK2Jhc3g5NTggdG9TY2kgJzk5ZS05OTk5JyAgICAgICAgLT4gJzkuOUUtOTk5OCcKK2Jhc3g5NTkgdG9TY2kgJzExMWU5OTk3JyAgICAgICAgLT4gJzEuMTFFKzk5OTknCitiYXN4OTYwIHRvU2NpICcxMTExZS05OTk5JyAgICAgIC0+ICcxLjExMUUtOTk5NicKK2Jhc3g5NjEgdG9TY2kgJzk5ZTk5OTknICAgICAgICAgLT4gJzkuOUUrMTAwMDAnCitiYXN4OTYyIHRvU2NpICc5OTllOTk5OScgICAgICAgIC0+ICc5Ljk5RSsxMDAwMScKK2Jhc3g5NjMgdG9TY2kgJzAuOWUtOTk5OScgICAgICAgLT4gJzlFLTEwMDAwJworYmFzeDk2NCB0b1NjaSAnMC4wOWUtOTk5OScgICAgICAtPiAnOUUtMTAwMDEnCitiYXN4OTY1IHRvU2NpICcwLjFlMTAwMDEnICAgICAgIC0+ICcxRSsxMDAwMCcKK2Jhc3g5NjYgdG9TY2kgJzEwZS0xMDAwMScgICAgICAgLT4gJzEuMEUtMTAwMDAnCitiYXN4OTY3IHRvU2NpICcwLjllOTk5OTknICAgICAgIC0+ICc5RSs5OTk5OCcKK2Jhc3g5NjggdG9TY2kgJzk5ZS05OTk5OScgICAgICAgLT4gJzkuOUUtOTk5OTgnCitiYXN4OTY5IHRvU2NpICcxMTFlOTk5OTknICAgICAgIC0+ICcxLjExRSsxMDAwMDEnCitiYXN4OTcwIHRvU2NpICcxMTExZS05OTk5OScgICAgIC0+ICcxLjExMUUtOTk5OTYnCitiYXN4OTcxIHRvU2NpICIwLjA5ZTk5OTk5OTk5OSIgIC0+ICc5RSs5OTk5OTk5OTcnCitiYXN4OTcyIHRvU2NpICIwLjllOTk5OTk5OTk5IiAgIC0+ICc5RSs5OTk5OTk5OTgnCitiYXN4OTczIHRvU2NpICI5ZTk5OTk5OTk5OSIgICAgIC0+ICc5RSs5OTk5OTk5OTknCitiYXN4OTc0IHRvU2NpICI5LjllOTk5OTk5OTk5IiAgIC0+ICc5LjlFKzk5OTk5OTk5OScKK2Jhc3g5NzUgdG9TY2kgIjkuOTllOTk5OTk5OTk5IiAgLT4gJzkuOTlFKzk5OTk5OTk5OScKK2Jhc3g5NzYgdG9TY2kgIjkuOTllLTk5OTk5OTk5OSIgLT4gJzkuOTlFLTk5OTk5OTk5OScKK2Jhc3g5NzcgdG9TY2kgIjkuOWUtOTk5OTk5OTk5IiAgLT4gJzkuOUUtOTk5OTk5OTk5JworYmFzeDk3OCB0b1NjaSAiOWUtOTk5OTk5OTk5IiAgICAtPiAnOUUtOTk5OTk5OTk5JworYmFzeDk3OSB0b1NjaSAiOTllLTk5OTk5OTk5OSIgICAtPiAnOS45RS05OTk5OTk5OTgnCitiYXN4OTgwIHRvU2NpICI5OTllLTk5OTk5OTk5OSIgIC0+ICc5Ljk5RS05OTk5OTk5OTcnCisKKy0tIFZhcnlpbmcgZXhwb25lbnQgbWF4aW11bXMKK3ByZWNpc2lvbjogNQorbWF4ZXhwb25lbnQ6IDAKK21pbmV4cG9uZW50OiAwCitlbWF4MDAxIHRvU2NpIC0xRSsyICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MDAyIHRvU2NpIC0xMDAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MDAzIHRvU2NpICAtMTAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MDA0IHRvU2NpICAgLTkuOSAtPiAtOS45CitlbWF4MDA1IHRvU2NpICAgLTkgICAtPiAtOQorZW1heDAwNiB0b1NjaSAgIC0xICAgLT4gLTEKK2VtYXgwMDcgdG9TY2kgICAgMCAgIC0+ICAwCitlbWF4MDA4IHRvU2NpICAgIDEgICAtPiAgMQorZW1heDAwOSB0b1NjaSAgICA5ICAgLT4gIDkKK2VtYXgwMTAgdG9TY2kgICAgOS45IC0+ICA5LjkKK2VtYXgwMTEgdG9TY2kgICAxMCAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgwMTIgdG9TY2kgIDEwMCAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgwMTMgdG9TY2kgIDFFKzIgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgwMTQgdG9TY2kgICAwLjk5IC0+ICAwLjk5IFN1Ym5vcm1hbAorZW1heDAxNSB0b1NjaSAgIDAuMSAgLT4gIDAuMSBTdWJub3JtYWwKK2VtYXgwMTYgdG9TY2kgICAwLjAxIC0+ICAwLjAxIFN1Ym5vcm1hbAorZW1heDAxNyB0b1NjaSAgMUUtMSAgLT4gIDAuMSBTdWJub3JtYWwKK2VtYXgwMTggdG9TY2kgIDFFLTIgIC0+ICAwLjAxIFN1Ym5vcm1hbAorCittYXhleHBvbmVudDogMQorbWluZXhwb25lbnQ6IC0xCitlbWF4MTAwIHRvU2NpIC0xRSszICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MTAxIHRvU2NpIC0xRSsyICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MTAyIHRvU2NpIC0xMDAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MTAzIHRvU2NpICAtMTAgICAtPiAtMTAKK2VtYXgxMDQgdG9TY2kgICAtOS45IC0+IC05LjkKK2VtYXgxMDUgdG9TY2kgICAtOSAgIC0+IC05CitlbWF4MTA2IHRvU2NpICAgLTEgICAtPiAtMQorZW1heDEwNyB0b1NjaSAgICAwICAgLT4gIDAKK2VtYXgxMDggdG9TY2kgICAgMSAgIC0+ICAxCitlbWF4MTA5IHRvU2NpICAgIDkgICAtPiAgOQorZW1heDExMCB0b1NjaSAgICA5LjkgLT4gIDkuOQorZW1heDExMSB0b1NjaSAgIDEwICAgLT4gMTAKK2VtYXgxMTIgdG9TY2kgIDEwMCAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgxMTMgdG9TY2kgIDFFKzIgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgxMTQgdG9TY2kgIDFFKzMgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgxMTUgdG9TY2kgICAwLjk5IC0+ICAwLjk5CitlbWF4MTE2IHRvU2NpICAgMC4xICAtPiAgMC4xCitlbWF4MTE3IHRvU2NpICAgMC4wMSAtPiAgMC4wMSBTdWJub3JtYWwKK2VtYXgxMTggdG9TY2kgIDFFLTEgIC0+ICAwLjEKK2VtYXgxMTkgdG9TY2kgIDFFLTIgIC0+ICAwLjAxIFN1Ym5vcm1hbAorZW1heDEyMCB0b1NjaSAgMUUtMyAgLT4gIDAuMDAxIFN1Ym5vcm1hbAorZW1heDEyMSB0b1NjaSAgMS4xRS0zICAtPiAgMC4wMDExIFN1Ym5vcm1hbAorZW1heDEyMiB0b1NjaSAgMS4xMUUtMyAgLT4gIDAuMDAxMTEgU3Vibm9ybWFsCitlbWF4MTIzIHRvU2NpICAxLjExMUUtMyAgLT4gIDAuMDAxMTEgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgxMjQgdG9TY2kgIDEuMTExMUUtMyAgLT4gIDAuMDAxMTEgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgxMjUgdG9TY2kgIDEuMTExMTFFLTMgIC0+ICAwLjAwMTExIFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK21heGV4cG9uZW50OiAyCittaW5leHBvbmVudDogLTIKK3ByZWNpc2lvbjogOQorZW1heDIwMCB0b1NjaSAtMUUrMyAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDIwMSB0b1NjaSAtMUUrMiAgLT4gLTFFKzIKK2VtYXgyMDIgdG9TY2kgLTEwMCAgIC0+IC0xMDAKK2VtYXgyMDMgdG9TY2kgIC0xMCAgIC0+IC0xMAorZW1heDIwNCB0b1NjaSAgIC05LjkgLT4gLTkuOQorZW1heDIwNSB0b1NjaSAgIC05ICAgLT4gLTkKK2VtYXgyMDYgdG9TY2kgICAtMSAgIC0+IC0xCitlbWF4MjA3IHRvU2NpICAgIDAgICAtPiAgMAorZW1heDIwOCB0b1NjaSAgICAxICAgLT4gIDEKK2VtYXgyMDkgdG9TY2kgICAgOSAgIC0+ICA5CitlbWF4MjEwIHRvU2NpICAgIDkuOSAtPiAgOS45CitlbWF4MjExIHRvU2NpICAgMTAgICAtPiAxMAorZW1heDIxMiB0b1NjaSAgMTAwICAgLT4gMTAwCitlbWF4MjEzIHRvU2NpICAxRSsyICAtPiAxRSsyCitlbWF4MjE0IHRvU2NpICAxRSszICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MjE1IHRvU2NpICAgMC45OSAtPiAgMC45OQorZW1heDIxNiB0b1NjaSAgIDAuMSAgLT4gIDAuMQorZW1heDIxNyB0b1NjaSAgIDAuMDEgLT4gIDAuMDEKK2VtYXgyMTggdG9TY2kgIDAuMDAxIC0+ICAwLjAwMSBTdWJub3JtYWwKK2VtYXgyMTkgdG9TY2kgIDFFLTEgIC0+ICAwLjEKK2VtYXgyMjAgdG9TY2kgIDFFLTIgIC0+ICAwLjAxCitlbWF4MjIxIHRvU2NpICAxRS0zICAtPiAgMC4wMDEgU3Vibm9ybWFsCitlbWF4MjIyIHRvU2NpICAxRS00ICAtPiAgMC4wMDAxIFN1Ym5vcm1hbAorZW1heDIyMyB0b1NjaSAgMUUtNSAgLT4gIDAuMDAwMDEgU3Vibm9ybWFsCitlbWF4MjI0IHRvU2NpICAxRS02ICAtPiAgMC4wMDAwMDEgU3Vibm9ybWFsCitlbWF4MjI1IHRvU2NpICAxRS03ICAtPiAgMUUtNyAgU3Vibm9ybWFsCitlbWF4MjI2IHRvU2NpICAxRS04ICAtPiAgMUUtOCAgU3Vibm9ybWFsCitlbWF4MjI3IHRvU2NpICAxRS05ICAtPiAgMUUtOSAgU3Vibm9ybWFsCitlbWF4MjI4IHRvU2NpICAxRS0xMCAtPiAgMUUtMTAgU3Vibm9ybWFsCitlbWF4MjI5IHRvU2NpICAxRS0xMSAtPiAgMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDIzMCB0b1NjaSAgMUUtMTIgLT4gIDBFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworbWF4ZXhwb25lbnQ6IDcKK21pbmV4cG9uZW50OiAtNworZW1heDIzMSB0b1NjaSAgMUUtOCAgLT4gIDFFLTggU3Vibm9ybWFsCitlbWF4MjMyIHRvU2NpICAxRS03ICAtPiAgMUUtNworZW1heDIzMyB0b1NjaSAgMUUtNiAgLT4gIDAuMDAwMDAxCitlbWF4MjM0IHRvU2NpICAxRS01ICAtPiAgMC4wMDAwMQorZW1heDIzNSB0b1NjaSAgMUUrNSAgLT4gIDFFKzUKK2VtYXgyMzYgdG9TY2kgIDFFKzYgIC0+ICAxRSs2CitlbWF4MjM3IHRvU2NpICAxRSs3ICAtPiAgMUUrNworZW1heDIzOCB0b1NjaSAgMUUrOCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCittYXhleHBvbmVudDogOQorbWluZXhwb25lbnQ6IC05CitlbWF4MjQwIHRvU2NpICAxRS0yMSAtPiAgMEUtMTcgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDI0MSB0b1NjaSAgMUUtMTAgLT4gIDFFLTEwIFN1Ym5vcm1hbAorZW1heDI0MiB0b1NjaSAgMUUtOSAgLT4gIDFFLTkKK2VtYXgyNDMgdG9TY2kgIDFFLTggIC0+ICAxRS04CitlbWF4MjQ0IHRvU2NpICAxRS03ICAtPiAgMUUtNworZW1heDI0NSB0b1NjaSAgMUUrNyAgLT4gIDFFKzcKK2VtYXgyNDYgdG9TY2kgIDFFKzggIC0+ICAxRSs4CitlbWF4MjQ3IHRvU2NpICAxRSs5ICAtPiAgMUUrOQorZW1heDI0OCB0b1NjaSAgMUUrMTAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCittYXhleHBvbmVudDogMTAgIC0tIGJvdW5kYXJ5CittaW5leHBvbmVudDogLTEwCitlbWF4MjUwIHRvU2NpICAxRS0yMSAtPiAgMEUtMTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDI1MSB0b1NjaSAgMUUtMTEgLT4gIDFFLTExIFN1Ym5vcm1hbAorZW1heDI1MiB0b1NjaSAgMUUtMTAgLT4gIDFFLTEwCitlbWF4MjUzIHRvU2NpICAxRS05ICAtPiAgMUUtOQorZW1heDI1NCB0b1NjaSAgMUUtOCAgLT4gIDFFLTgKK2VtYXgyNTUgdG9TY2kgIDFFKzggIC0+ICAxRSs4CitlbWF4MjU2IHRvU2NpICAxRSs5ICAtPiAgMUUrOQorZW1heDI1NyB0b1NjaSAgMUUrMTAgLT4gIDFFKzEwCitlbWF4MjU4IHRvU2NpICAxRSsxMSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK2VtYXgyNjAgdG9TY2kgIDEuMDBFLTIxIC0+ICAwRS0xOCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitlbWF4MjYxIHRvU2NpICAxLjAwRS0xMSAtPiAgMS4wMEUtMTEgU3Vibm9ybWFsCitlbWF4MjYyIHRvU2NpICAxLjAwRS0xMCAtPiAgMS4wMEUtMTAKK2VtYXgyNjMgdG9TY2kgIDEuMDBFLTkgIC0+ICAxLjAwRS05CitlbWF4MjY0IHRvU2NpICAxLjAwRS04ICAtPiAgMS4wMEUtOAorZW1heDI2NSB0b1NjaSAgMS4wMEUrOCAgLT4gIDEuMDBFKzgKK2VtYXgyNjYgdG9TY2kgIDEuMDBFKzkgIC0+ICAxLjAwRSs5CitlbWF4MjY3IHRvU2NpICAxLjAwRSsxMCAtPiAgMS4wMEUrMTAKK2VtYXgyNjggdG9TY2kgIDEuMDBFKzExIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgyNzAgdG9TY2kgIDkuOTlFLTIxIC0+ICAwRS0xOCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitlbWF4MjcxIHRvU2NpICA5Ljk5RS0xMSAtPiAgOS45OUUtMTEgU3Vibm9ybWFsCitlbWF4MjcyIHRvU2NpICA5Ljk5RS0xMCAtPiAgOS45OUUtMTAKK2VtYXgyNzMgdG9TY2kgIDkuOTlFLTkgIC0+ICA5Ljk5RS05CitlbWF4Mjc0IHRvU2NpICA5Ljk5RS04ICAtPiAgOS45OUUtOAorZW1heDI3NSB0b1NjaSAgOS45OUUrOCAgLT4gIDkuOTlFKzgKK2VtYXgyNzYgdG9TY2kgIDkuOTlFKzkgIC0+ICA5Ljk5RSs5CitlbWF4Mjc3IHRvU2NpICA5Ljk5RSsxMCAtPiAgOS45OUUrMTAKK2VtYXgyNzggdG9TY2kgIDkuOTlFKzExIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworbWF4ZXhwb25lbnQ6IDk5CittaW5leHBvbmVudDogLTk5CitlbWF4MjgwIHRvU2NpICAxRS0xMjAgLT4gIDBFLTEwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitlbWF4MjgxIHRvU2NpICAxRS0xMDAgLT4gIDFFLTEwMCBTdWJub3JtYWwKK2VtYXgyODIgdG9TY2kgIDFFLTk5ICAtPiAgMUUtOTkKK2VtYXgyODMgdG9TY2kgIDFFLTk4ICAtPiAgMUUtOTgKK2VtYXgyODQgdG9TY2kgIDFFKzk4ICAtPiAgMUUrOTgKK2VtYXgyODUgdG9TY2kgIDFFKzk5ICAtPiAgMUUrOTkKK2VtYXgyODYgdG9TY2kgIDFFKzEwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitlbWF4MjkxIHRvU2NpICAxRS0xMDAwIC0+ICAxRS0xMDAwIFN1Ym5vcm1hbAorZW1heDI5MiB0b1NjaSAgMUUtOTk5ICAtPiAgMUUtOTk5CitlbWF4MjkzIHRvU2NpICAxRSs5OTkgIC0+ICAxRSs5OTkKK2VtYXgyOTQgdG9TY2kgIDFFKzEwMDAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbWF4ZXhwb25lbnQ6IDk5OTkKK21pbmV4cG9uZW50OiAtOTk5OQorZW1heDMwMSB0b1NjaSAgMUUtMTAwMDAgLT4gIDFFLTEwMDAwIFN1Ym5vcm1hbAorZW1heDMwMiB0b1NjaSAgMUUtOTk5OSAgLT4gIDFFLTk5OTkKK2VtYXgzMDMgdG9TY2kgIDFFKzk5OTkgIC0+ICAxRSs5OTk5CitlbWF4MzA0IHRvU2NpICAxRSsxMDAwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittYXhleHBvbmVudDogOTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTkKK2VtYXgzMTEgdG9TY2kgIDFFLTEwMDAwMCAtPiAgMUUtMTAwMDAwIFN1Ym5vcm1hbAorZW1heDMxMiB0b1NjaSAgMUUtOTk5OTkgIC0+ICAxRS05OTk5OQorZW1heDMxMyB0b1NjaSAgMUUrOTk5OTkgIC0+ICAxRSs5OTk5OQorZW1heDMxNCB0b1NjaSAgMUUrMTAwMDAwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK21heGV4cG9uZW50OiA5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5CitlbWF4MzIxIHRvU2NpICAxRS0xMDAwMDAwIC0+ICAxRS0xMDAwMDAwIFN1Ym5vcm1hbAorZW1heDMyMiB0b1NjaSAgMUUtOTk5OTk5ICAtPiAgMUUtOTk5OTk5CitlbWF4MzIzIHRvU2NpICAxRSs5OTk5OTkgIC0+ICAxRSs5OTk5OTkKK2VtYXgzMjQgdG9TY2kgIDFFKzEwMDAwMDAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbWF4ZXhwb25lbnQ6IDk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OQorZW1heDMzMSB0b1NjaSAgMUUtMTAwMDAwMDAgLT4gIDFFLTEwMDAwMDAwIFN1Ym5vcm1hbAorZW1heDMzMiB0b1NjaSAgMUUtOTk5OTk5OSAgLT4gIDFFLTk5OTk5OTkKK2VtYXgzMzMgdG9TY2kgIDFFKzk5OTk5OTkgIC0+ICAxRSs5OTk5OTk5CitlbWF4MzM0IHRvU2NpICAxRSsxMDAwMDAwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittYXhleHBvbmVudDogOTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTkKK2VtYXgzNDEgdG9TY2kgIDFFLTEwMDAwMDAwMCAtPiAgMUUtMTAwMDAwMDAwIFN1Ym5vcm1hbAorZW1heDM0MiB0b1NjaSAgMUUtOTk5OTk5OTkgIC0+ICAxRS05OTk5OTk5OQorZW1heDM0MyB0b1NjaSAgMUUrOTk5OTk5OTkgIC0+ICAxRSs5OTk5OTk5OQorZW1heDM0NCB0b1NjaSAgMUUrMTAwMDAwMDAwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK2VtYXgzNDcgdG9TY2kgIDFFLTEwMDAwMDAwMDggICAgIC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2VtYXgzNDggdG9TY2kgIDFFLTEwMDAwMDAwMDcgICAgIC0+ICAxRS0xMDAwMDAwMDA3IFN1Ym5vcm1hbAorZW1heDM0OSB0b1NjaSAgMUUtMTAwMDAwMDAwMCAgICAgLT4gIDFFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCitlbWF4MzUwIHRvU2NpICAxRS05OTk5OTk5OTkgICAgICAtPiAgMUUtOTk5OTk5OTk5CitlbWF4MzUxIHRvU2NpICAxRSs5OTk5OTk5OTkgICAgICAtPiAgMUUrOTk5OTk5OTk5CitlbWF4MzUyIHRvU2NpICAxRSsxMDAwMDAwMDAwICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MzUzIHRvU2NpICAxLjAwMEUtMTAwMDAwMDAwMCAtPiAgMS4wMDBFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCitlbWF4MzU0IHRvU2NpICAxLjAwMEUtOTk5OTk5OTk5ICAtPiAgMS4wMDBFLTk5OTk5OTk5OQorZW1heDM1NSB0b1NjaSAgMS4wMDBFKzk5OTk5OTk5OSAgLT4gIDEuMDAwRSs5OTk5OTk5OTkKK2VtYXgzNTYgdG9TY2kgIDEuMDAwRSsxMDAwMDAwMDAwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgzNTcgdG9TY2kgIDEuMDAxRS0xMDAwMDAwMDA4IC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2VtYXgzNTggdG9TY2kgIDEuMDAxRS0xMDAwMDAwMDA3IC0+ICAxRS0xMDAwMDAwMDA3IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitlbWF4MzU5IHRvU2NpICAxLjAwMUUtMTAwMDAwMDAwMCAtPiAgMS4wMDFFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCitlbWF4MzYwIHRvU2NpICAxLjAwMUUtOTk5OTk5OTk5ICAtPiAgMS4wMDFFLTk5OTk5OTk5OQorZW1heDM2MSB0b1NjaSAgMS4wMDFFKzk5OTk5OTk5OSAgLT4gIDEuMDAxRSs5OTk5OTk5OTkKK2VtYXgzNjIgdG9TY2kgIDEuMDAxRSsxMDAwMDAwMDAwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgzNjMgdG9TY2kgIDkuMDAwRS0xMDAwMDAwMDAwIC0+ICA5LjAwMEUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK2VtYXgzNjQgdG9TY2kgIDkuMDAwRS05OTk5OTk5OTkgIC0+ICA5LjAwMEUtOTk5OTk5OTk5CitlbWF4MzY1IHRvU2NpICA5LjAwMEUrOTk5OTk5OTk5ICAtPiAgOS4wMDBFKzk5OTk5OTk5OQorZW1heDM2NiB0b1NjaSAgOS4wMDBFKzEwMDAwMDAwMDAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDM2NyB0b1NjaSAgOS45OTlFLTEwMDAwMDAwMDkgLT4gIDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDM2OCB0b1NjaSAgOS45OTlFLTEwMDAwMDAwMDggLT4gIDFFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXgzNjkgdG9TY2kgIDkuOTk5RS0xMDAwMDAwMDA3IC0+ICAxLjBFLTEwMDAwMDAwMDYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXgzNzAgdG9TY2kgIDkuOTk5RS0xMDAwMDAwMDAwIC0+ICA5Ljk5OUUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK2VtYXgzNzEgdG9TY2kgIDkuOTk5RS05OTk5OTk5OTkgIC0+ICA5Ljk5OUUtOTk5OTk5OTk5CitlbWF4MzcyIHRvU2NpICA5Ljk5OUUrOTk5OTk5OTk5ICAtPiAgOS45OTlFKzk5OTk5OTk5OQorCitlbWF4MzczIHRvU2NpICA5Ljk5OUUrMTAwMDAwMDAwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4Mzc0IHRvU2NpIC0xRS0xMDAwMDAwMDAwICAgICAtPiAtMUUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK2VtYXgzNzUgdG9TY2kgLTFFLTk5OTk5OTk5OSAgICAgIC0+IC0xRS05OTk5OTk5OTkKK2VtYXgzNzYgdG9TY2kgLTFFKzk5OTk5OTk5OSAgICAgIC0+IC0xRSs5OTk5OTk5OTkKK2VtYXgzNzcgdG9TY2kgLTFFKzEwMDAwMDAwMDAgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgzNzggdG9TY2kgLTEuMDAwRS0xMDAwMDAwMDAwIC0+IC0xLjAwMEUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK2VtYXgzNzkgdG9TY2kgLTEuMDAwRS05OTk5OTk5OTkgIC0+IC0xLjAwMEUtOTk5OTk5OTk5CitlbWF4MzgwIHRvU2NpIC0xLjAwMEUrOTk5OTk5OTk5ICAtPiAtMS4wMDBFKzk5OTk5OTk5OQorZW1heDM4MSB0b1NjaSAtMS4wMDBFKzEwMDAwMDAwMDAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDM4MiB0b1NjaSAtMS4wMDFFLTEwMDAwMDAwMDggLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDM4MyB0b1NjaSAtMS4wMDFFLTk5OTk5OTk5OSAgLT4gLTEuMDAxRS05OTk5OTk5OTkKK2VtYXgzODQgdG9TY2kgLTEuMDAxRSs5OTk5OTk5OTkgIC0+IC0xLjAwMUUrOTk5OTk5OTk5CitlbWF4Mzg1IHRvU2NpIC0xLjAwMUUrMTAwMDAwMDAwMCAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4Mzg2IHRvU2NpIC05LjAwMEUtMTAwMDAwMDEyMyAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitlbWF4Mzg3IHRvU2NpIC05LjAwMEUtOTk5OTk5OTk5ICAtPiAtOS4wMDBFLTk5OTk5OTk5OQorZW1heDM4OCB0b1NjaSAtOS4wMDBFKzk5OTk5OTk5OSAgLT4gLTkuMDAwRSs5OTk5OTk5OTkKK2VtYXgzODkgdG9TY2kgLTkuMDAwRSsxMDAwMDAwMDAwIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgzOTAgdG9TY2kgLTkuOTk5RS0xMDAwMDAwMDA4IC0+IC0xRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4MzkxIHRvU2NpIC05Ljk5OUUtOTk5OTk5OTk5ICAtPiAtOS45OTlFLTk5OTk5OTk5OQorZW1heDM5MiB0b1NjaSAtOS45OTlFKzk5OTk5OTk5OSAgLT4gLTkuOTk5RSs5OTk5OTk5OTkKK2VtYXgzOTMgdG9TY2kgLTkuOTk5RSsxMDAwMDAwMDAwIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0gTm93IGNoZWNrIDg1NCByb3VuZGluZyBvZiBzdWJub3JtYWxzIGFuZCBwcm9wZXIgdW5kZXJmbG93IHRvIDAKK3ByZWNpc2lvbjogICA1CittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitlbWF4NDAwIHRvU2NpICAxLjAwMDBFLTk5OSAgICAgLT4gMS4wMDAwRS05OTkKK2VtYXg0MDEgdG9TY2kgIDAuMUUtOTk5ICAgICAgICAtPiAxRS0xMDAwICAgICBTdWJub3JtYWwKK2VtYXg0MDIgdG9TY2kgIDAuMTAwMEUtOTk5ICAgICAtPiAxLjAwMEUtMTAwMCBTdWJub3JtYWwKK2VtYXg0MDMgdG9TY2kgIDAuMDEwMEUtOTk5ICAgICAtPiAxLjAwRS0xMDAxICBTdWJub3JtYWwKK2VtYXg0MDQgdG9TY2kgIDAuMDAxMEUtOTk5ICAgICAtPiAxLjBFLTEwMDIgICBTdWJub3JtYWwKK2VtYXg0MDUgdG9TY2kgIDAuMDAwMUUtOTk5ICAgICAtPiAxRS0xMDAzICAgICBTdWJub3JtYWwKK2VtYXg0MDYgdG9TY2kgIDAuMDAwMTBFLTk5OSAgICAtPiAxRS0xMDAzICAgICBTdWJub3JtYWwgUm91bmRlZAorZW1heDQwNyB0b1NjaSAgMC4wMDAxM0UtOTk5ICAgIC0+IDFFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDA4IHRvU2NpICAwLjAwMDE1RS05OTkgICAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MDkgdG9TY2kgIDAuMDAwMTdFLTk5OSAgICAtPiAyRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQxMCB0b1NjaSAgMC4wMDAyM0UtOTk5ICAgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDExIHRvU2NpICAwLjAwMDI1RS05OTkgICAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MTIgdG9TY2kgIDAuMDAwMjdFLTk5OSAgICAtPiAzRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQxMyB0b1NjaSAgMC4wMDAxNDlFLTk5OSAgIC0+IDFFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDE0IHRvU2NpICAwLjAwMDE1MEUtOTk5ICAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MTUgdG9TY2kgIDAuMDAwMTUxRS05OTkgICAtPiAyRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQxNiB0b1NjaSAgMC4wMDAyNDlFLTk5OSAgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDE3IHRvU2NpICAwLjAwMDI1MEUtOTk5ICAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MTggdG9TY2kgIDAuMDAwMjUxRS05OTkgICAtPiAzRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQxOSB0b1NjaSAgMC4wMDAwOUUtOTk5ICAgIC0+IDFFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDIwIHRvU2NpICAwLjAwMDA1RS05OTkgICAgLT4gMEUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDQyMSB0b1NjaSAgMC4wMDAwM0UtOTk5ICAgIC0+IDBFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2VtYXg0MjIgdG9TY2kgIDAuMDAwMDA5RS05OTkgICAtPiAwRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitlbWF4NDIzIHRvU2NpICAwLjAwMDAwNUUtOTk5ICAgLT4gMEUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDQyNCB0b1NjaSAgMC4wMDAwMDNFLTk5OSAgIC0+IDBFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworZW1heDQyNSB0b1NjaSAgMC4wMDEwNDlFLTk5OSAgIC0+IDEuMEUtMTAwMiAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDI2IHRvU2NpICAwLjAwMTA1MEUtOTk5ICAgLT4gMS4wRS0xMDAyICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MjcgdG9TY2kgIDAuMDAxMDUxRS05OTkgICAtPiAxLjFFLTEwMDIgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQyOCB0b1NjaSAgMC4wMDExNDlFLTk5OSAgIC0+IDEuMUUtMTAwMiAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDI5IHRvU2NpICAwLjAwMTE1MEUtOTk5ICAgLT4gMS4yRS0xMDAyICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MzAgdG9TY2kgIDAuMDAxMTUxRS05OTkgICAtPiAxLjJFLTEwMDIgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitlbWF4NDMyIHRvU2NpICAwLjAxMDA0OUUtOTk5ICAgLT4gMS4wMEUtMTAwMSAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MzMgdG9TY2kgIDAuMDEwMDUwRS05OTkgICAtPiAxLjAwRS0xMDAxICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQzNCB0b1NjaSAgMC4wMTAwNTFFLTk5OSAgIC0+IDEuMDFFLTEwMDEgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDM1IHRvU2NpICAwLjAxMDE0OUUtOTk5ICAgLT4gMS4wMUUtMTAwMSAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MzYgdG9TY2kgIDAuMDEwMTUwRS05OTkgICAtPiAxLjAyRS0xMDAxICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQzNyB0b1NjaSAgMC4wMTAxNTFFLTk5OSAgIC0+IDEuMDJFLTEwMDEgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2VtYXg0NDAgdG9TY2kgIDAuMTAxMDNFLTk5OSAgICAtPiAxLjAxMEUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQ0MSB0b1NjaSAgMC4xMDEwNUUtOTk5ICAgIC0+IDEuMDEwRS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDQyIHRvU2NpICAwLjEwMTA3RS05OTkgICAgLT4gMS4wMTFFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NDMgdG9TY2kgIDAuMTAxMTNFLTk5OSAgICAtPiAxLjAxMUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQ0NCB0b1NjaSAgMC4xMDExNUUtOTk5ICAgIC0+IDEuMDEyRS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDQ1IHRvU2NpICAwLjEwMTE3RS05OTkgICAgLT4gMS4wMTJFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZW1heDQ1MCB0b1NjaSAgMS4xMDczMEUtMTAwMCAgIC0+IDEuMTA3RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDUxIHRvU2NpICAxLjEwNzUwRS0xMDAwICAgLT4gMS4xMDhFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NTIgdG9TY2kgIDEuMTA3NzBFLTEwMDAgICAtPiAxLjEwOEUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQ1MyB0b1NjaSAgMS4xMDgzMEUtMTAwMCAgIC0+IDEuMTA4RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDU0IHRvU2NpICAxLjEwODUwRS0xMDAwICAgLT4gMS4xMDhFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NTUgdG9TY2kgIDEuMTA4NzBFLTEwMDAgICAtPiAxLjEwOUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLSBtYWtlIHN1cmUgc2lnbiBPSworZW1heDQ1NiB0b1NjaSAgLTAuMTAxMDNFLTk5OSAgIC0+IC0xLjAxMEUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQ1NyB0b1NjaSAgLTAuMTAxMDVFLTk5OSAgIC0+IC0xLjAxMEUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQ1OCB0b1NjaSAgLTAuMTAxMDdFLTk5OSAgIC0+IC0xLjAxMUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQ1OSB0b1NjaSAgLTAuMTAxMTNFLTk5OSAgIC0+IC0xLjAxMUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQ2MCB0b1NjaSAgLTAuMTAxMTVFLTk5OSAgIC0+IC0xLjAxMkUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQ2MSB0b1NjaSAgLTAuMTAxMTdFLTk5OSAgIC0+IC0xLjAxMkUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLSAnOTk5cycgY2FzZXMKK2VtYXg0NjQgdG9TY2kgIDk5OTk5OUUtOTk5ICAgICAgICAgLT4gMS4wMDAwRS05OTMgSW5leGFjdCBSb3VuZGVkCitlbWF4NDY1IHRvU2NpICA5OTk5OS4wRS05OTkgICAgICAgIC0+IDkuOTk5OUUtOTk1IFJvdW5kZWQKK2VtYXg0NjYgdG9TY2kgIDk5OTk5LkUtOTk5ICAgICAgICAgLT4gOS45OTk5RS05OTUKK2VtYXg0NjcgdG9TY2kgIDk5OTkuOUUtOTk5ICAgICAgICAgLT4gOS45OTk5RS05OTYKK2VtYXg0NjggdG9TY2kgIDk5OS45OUUtOTk5ICAgICAgICAgLT4gOS45OTk5RS05OTcKK2VtYXg0NjkgdG9TY2kgIDk5Ljk5OUUtOTk5ICAgICAgICAgLT4gOS45OTk5RS05OTgKK2VtYXg0NzAgdG9TY2kgIDkuOTk5OUUtOTk5ICAgICAgICAgLT4gOS45OTk5RS05OTkKK2VtYXg0NzEgdG9TY2kgIDAuOTk5OTlFLTk5OSAgICAgICAgLT4gMS4wMDAwRS05OTkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NzIgdG9TY2kgIDAuMDk5OTk5RS05OTkgICAgICAgLT4gMS4wMDBFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NzMgdG9TY2kgIDAuMDA5OTk5OUUtOTk5ICAgICAgLT4gMS4wMEUtMTAwMSAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NzQgdG9TY2kgIDAuMDAwOTk5OTlFLTk5OSAgICAgLT4gMS4wRS0xMDAyICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NzUgdG9TY2kgIDAuMDAwMDk5OTk5RS05OTkgICAgLT4gMUUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NzYgdG9TY2kgIDAuMDAwMDA5OTk5OUUtOTk5ICAgLT4gMEUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDQ3NyB0b1NjaSAgMC4wMDAwMDA5OTk5OUUtOTk5ICAtPiAwRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitlbWF4NDc4IHRvU2NpICAwLjAwMDAwMDA5OTk5OUUtOTk5IC0+IDBFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gRXhwb25lbnRzIHdpdGggaW5zaWduaWZpY2FudCBsZWFkaW5nIHplcm9zCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitiYXN4MTAwMSB0b1NjaSAgMWU5OTk5OTk5OTkgLT4gMUUrOTk5OTk5OTk5CitiYXN4MTAwMiB0b1NjaSAgMWUwOTk5OTk5OTk5IC0+IDFFKzk5OTk5OTk5OQorYmFzeDEwMDMgdG9TY2kgIDFlMDA5OTk5OTk5OTkgLT4gMUUrOTk5OTk5OTk5CitiYXN4MTAwNCB0b1NjaSAgMWUwMDA5OTk5OTk5OTkgLT4gMUUrOTk5OTk5OTk5CitiYXN4MTAwNSB0b1NjaSAgMWUwMDAwMDAwMDAwMDA5OTk5OTk5OTkgLT4gMUUrOTk5OTk5OTk5CitiYXN4MTAwNiB0b1NjaSAgMWUwMDAwMDAwMDAwMDEwMDAwMDAwMDcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitiYXN4MTAwNyB0b1NjaSAgMWUtOTk5OTk5OTk5IC0+IDFFLTk5OTk5OTk5OQorYmFzeDEwMDggdG9TY2kgIDFlLTA5OTk5OTk5OTkgLT4gMUUtOTk5OTk5OTk5CitiYXN4MTAwOSB0b1NjaSAgMWUtMDA5OTk5OTk5OTkgLT4gMUUtOTk5OTk5OTk5CitiYXN4MTAxMCB0b1NjaSAgMWUtMDAwOTk5OTk5OTk5IC0+IDFFLTk5OTk5OTk5OQorYmFzeDEwMTEgdG9TY2kgIDFlLTAwMDAwMDAwMDAwMDk5OTk5OTk5OSAtPiAxRS05OTk5OTk5OTkKK2Jhc3gxMDEyIHRvU2NpICAxZS0wMDAwMDAwMDAwMDEwMDAwMDAwMDcgLT4gMUUtMTAwMDAwMDAwNyBTdWJub3JtYWwKKworLS0gRWRnZSBjYXNlcyBmb3IgaW50MzIgZXhwb25lbnRzLi4uCitiYXN4MTAyMSB0b3NjaSAxZSsyMTQ3NDgzNjQ5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYmFzeDEwMjIgdG9zY2kgMWUrMjE0NzQ4MzY0OCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gxMDIzIHRvc2NpIDFlKzIxNDc0ODM2NDcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitiYXN4MTAyNCB0b3NjaSAxZS0yMTQ3NDgzNjQ3IC0+IDBFLTEwMDAwMDAwMTQgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorYmFzeDEwMjUgdG9zY2kgMWUtMjE0NzQ4MzY0OCAtPiAwRS0xMDAwMDAwMDE0IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Jhc3gxMDI2IHRvc2NpIDFlLTIxNDc0ODM2NDkgLT4gMEUtMTAwMDAwMDAxNCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCistLSBzYW1lIHVuYmFsYW5jZWQKK3ByZWNpc2lvbjogICA3CittYXhFeHBvbmVudDogOTYKK21pbmV4cG9uZW50OiAtOTUKK2Jhc3gxMDMxIHRvc2NpIDFlKzIxNDc0ODM2NDkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitiYXN4MTAzMiB0b3NjaSAxZSsyMTQ3NDgzNjQ4IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYmFzeDEwMzMgdG9zY2kgMWUrMjE0NzQ4MzY0NyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gxMDM0IHRvc2NpIDFlLTIxNDc0ODM2NDcgLT4gMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Jhc3gxMDM1IHRvc2NpIDFlLTIxNDc0ODM2NDggLT4gMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Jhc3gxMDM2IHRvc2NpIDFlLTIxNDc0ODM2NDkgLT4gMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gY2hlY2sgZm9yIGRvdWJsZS1yb3VuZGVkIHN1Ym5vcm1hbHMKK3ByZWNpc2lvbjogICA1CittYXhleHBvbmVudDogNzkKK21pbmV4cG9uZW50OiAtNzkKK2Jhc3gxMDQxIHRvU2NpICAgICAxLjUyNDQ0RS04MCAgLT4gIDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYmFzeDEwNDIgdG9TY2kgICAgIDEuNTI0NDVFLTgwICAtPiAgMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitiYXN4MTA0MyB0b1NjaSAgICAgMS41MjQ0NkUtODAgIC0+ICAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworLS0gY2xhbXBlZCB6ZXJvcyBbc2VlIGFsc28gY2xhbXAuZGVjVGVzdF0KK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0MworCitiYXN4MTA2MSBhcHBseSAgIDBlKzEwMDAwICAtPiAgMEUrNjE0NCBDbGFtcGVkCitiYXN4MTA2MiBhcHBseSAgIDBlLTEwMDAwICAtPiAgMEUtNjE3NiBDbGFtcGVkCitiYXN4MTA2MyBhcHBseSAgLTBlKzEwMDAwICAtPiAtMEUrNjE0NCBDbGFtcGVkCitiYXN4MTA2NCBhcHBseSAgLTBlLTEwMDAwICAtPiAtMEUtNjE3NiBDbGFtcGVkCisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKKworYmFzeDEwNjUgYXBwbHkgICAwZSsxMDAwMCAgLT4gIDBFKzM4NCAgQ2xhbXBlZAorYmFzeDEwNjYgYXBwbHkgICAwZS0xMDAwMCAgLT4gIDBFLTM5OCAgQ2xhbXBlZAorYmFzeDEwNjcgYXBwbHkgIC0wZSsxMDAwMCAgLT4gLTBFKzM4NCAgQ2xhbXBlZAorYmFzeDEwNjggYXBwbHkgIC0wZS0xMDAwMCAgLT4gLTBFLTM5OCAgQ2xhbXBlZAorCistLSBzYW1lIHdpdGggSUVFRSBjbGFtcGluZworY2xhbXA6ICAgICAgIDEKKworcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCisKK2Jhc3gxMDcxIGFwcGx5ICAgMGUrMTAwMDAgIC0+ICAwRSs2MTExIENsYW1wZWQKK2Jhc3gxMDcyIGFwcGx5ICAgMGUtMTAwMDAgIC0+ICAwRS02MTc2IENsYW1wZWQKK2Jhc3gxMDczIGFwcGx5ICAtMGUrMTAwMDAgIC0+IC0wRSs2MTExIENsYW1wZWQKK2Jhc3gxMDc0IGFwcGx5ICAtMGUtMTAwMDAgIC0+IC0wRS02MTc2IENsYW1wZWQKKworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworCitiYXN4MTA3NSBhcHBseSAgIDBlKzEwMDAwICAtPiAgMEUrMzY5ICBDbGFtcGVkCitiYXN4MTA3NiBhcHBseSAgIDBlLTEwMDAwICAtPiAgMEUtMzk4ICBDbGFtcGVkCitiYXN4MTA3NyBhcHBseSAgLTBlKzEwMDAwICAtPiAtMEUrMzY5ICBDbGFtcGVkCitiYXN4MTA3OCBhcHBseSAgLTBlLTEwMDAwICAtPiAtMEUtMzk4ICBDbGFtcGVkCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jbGFtcC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jbGFtcC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYzY2NDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NsYW1wLmRlY1Rlc3QKQEAgLTAsMCArMSwyMTEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gY2xhbXAuZGVjVGVzdCAtLSBjbGFtcGVkIGV4cG9uZW50IHRlc3RzIChmb3JtYXQtaW5kZXBlbmRlbnQpICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMCwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyB1c2VzIHRoZSBzYW1lIGxpbWl0cyBhcyB0aGUgOC1ieXRlIGNvbmNyZXRlCistLSByZXByZXNlbnRhdGlvbiwgYnV0IGFwcGxpZXMgY2xhbXBpbmcgd2l0aG91dCB1c2luZyBmb3JtYXQtc3BlY2lmaWMKKy0tIGNvbnZlcnNpb25zLgorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworY2xhbXA6ICAgICAgIDEKKworLS0gR2VuZXJhbCB0ZXN0Y2FzZXMKKworLS0gTm9ybWFsaXR5CitjbGFtMDEwIGFwcGx5ICAgMTIzNDU2Nzg5MDEyMzQ1NiAgIC0+ICAxMjM0NTY3ODkwMTIzNDU2CitjbGFtMDExIGFwcGx5ICAgMTIzNDU2Nzg5MDEyMzQ1Ni4wIC0+ICAxMjM0NTY3ODkwMTIzNDU2IFJvdW5kZWQKK2NsYW0wMTIgYXBwbHkgICAxMjM0NTY3ODkwMTIzNDU2LjEgLT4gIDEyMzQ1Njc4OTAxMjM0NTYgUm91bmRlZCBJbmV4YWN0CitjbGFtMDEzIGFwcGx5ICAtMTIzNDU2Nzg5MDEyMzQ1NiAgIC0+IC0xMjM0NTY3ODkwMTIzNDU2CitjbGFtMDE0IGFwcGx5ICAtMTIzNDU2Nzg5MDEyMzQ1Ni4wIC0+IC0xMjM0NTY3ODkwMTIzNDU2IFJvdW5kZWQKK2NsYW0wMTUgYXBwbHkgIC0xMjM0NTY3ODkwMTIzNDU2LjEgLT4gLTEyMzQ1Njc4OTAxMjM0NTYgUm91bmRlZCBJbmV4YWN0CisKKworLS0gTm1heCBhbmQgc2ltaWxhcgorY2xhbTAyMiBhcHBseSAgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2NsYW0wMjQgYXBwbHkgICAxLjIzNDU2Nzg5MDEyMzQ1NkUrMzg0ICAtPiAxLjIzNDU2Nzg5MDEyMzQ1NkUrMzg0CistLSBmb2xkLWRvd25zIChtb3JlIGJlbG93KQorY2xhbTAzMCBhcHBseSAgIDEuMjNFKzM4NCAgICAgICAgICAgICAgIC0+IDEuMjMwMDAwMDAwMDAwMDAwRSszODQgQ2xhbXBlZAorY2xhbTAzMiBhcHBseSAgIDFFKzM4NCAgICAgICAgICAgICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSszODQgQ2xhbXBlZAorCitjbGFtMDUxIGFwcGx5ICAgMTIzNDUgICAgICAgICAgICAgICAgICAgLT4gMTIzNDUKK2NsYW0wNTMgYXBwbHkgICAxMjM0ICAgICAgICAgICAgICAgICAgICAtPiAxMjM0CitjbGFtMDU1IGFwcGx5ICAgMTIzICAgICAgICAgICAgICAgICAgICAgLT4gMTIzCitjbGFtMDU3IGFwcGx5ICAgMTIgICAgICAgICAgICAgICAgICAgICAgLT4gMTIKK2NsYW0wNTkgYXBwbHkgICAxICAgICAgICAgICAgICAgICAgICAgICAtPiAxCitjbGFtMDYxIGFwcGx5ICAgMS4yMyAgICAgICAgICAgICAgICAgICAgLT4gMS4yMworY2xhbTA2MyBhcHBseSAgIDEyMy40NSAgICAgICAgICAgICAgICAgIC0+IDEyMy40NQorCistLSBObWluIGFuZCBiZWxvdworY2xhbTA3MSBhcHBseSAgIDFFLTM4MyAgICAgICAgICAgICAgICAgIC0+IDFFLTM4MworY2xhbTA3MyBhcHBseSAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2NsYW0wNzUgYXBwbHkgICAxLjAwMDAwMDAwMDAwMDAwMUUtMzgzICAtPiAxLjAwMDAwMDAwMDAwMDAwMUUtMzgzCisKK2NsYW0wNzcgYXBwbHkgICAwLjEwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAxLjAwMDAwMDAwMDAwMDAwRS0zODQgIFN1Ym5vcm1hbAorY2xhbTA3OSBhcHBseSAgIDAuMDAwMDAwMDAwMDAwMDEwRS0zODMgIC0+IDEuMEUtMzk3ICAgICAgICAgICAgICAgU3Vibm9ybWFsCitjbGFtMDgxIGFwcGx5ICAgMC4wMDAwMDAwMDAwMDAwMUUtMzgzICAgLT4gMUUtMzk3ICAgICAgICAgICAgICAgICBTdWJub3JtYWwKK2NsYW0wODMgYXBwbHkgICAwLjAwMDAwMDAwMDAwMDAwMUUtMzgzICAtPiAxRS0zOTggICAgICAgICAgICAgICAgIFN1Ym5vcm1hbAorCistLSB1bmRlcmZsb3dzCitjbGFtMDkwIGFwcGx5ICAgMWUtMzk4ICAgICAgICAgICAgICAgICAgLT4gIzAwMDAwMDAwMDAwMDAwMDEgIFN1Ym5vcm1hbAorY2xhbTA5MSBhcHBseSAgIDEuOWUtMzk4ICAgICAgICAgICAgICAgIC0+ICMwMDAwMDAwMDAwMDAwMDAyICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTA5MiBhcHBseSAgIDEuMWUtMzk4ICAgICAgICAgICAgICAgIC0+ICMwMDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTA5MyBhcHBseSAgIDEuMDAwMDAwMDAwMDFlLTM5OCAgICAgIC0+ICMwMDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTA5NCBhcHBseSAgIDEuMDAwMDAwMDAwMDAwMDFlLTM5OCAgIC0+ICMwMDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTA5NSBhcHBseSAgIDEuMDAwMDAwMDAwMDAwMDAxZS0zOTggIC0+ICMwMDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTA5NiBhcHBseSAgIDAuMWUtMzk4ICAgICAgICAgICAgICAgIC0+ICMwMDAwMDAwMDAwMDAwMDAwICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitjbGFtMDk3IGFwcGx5ICAgMC4wMDAwMDAwMDAwMWUtMzk4ICAgICAgLT4gIzAwMDAwMDAwMDAwMDAwMDAgIFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2NsYW0wOTggYXBwbHkgICAwLjAwMDAwMDAwMDAwMDAxZS0zOTggICAtPiAjMDAwMDAwMDAwMDAwMDAwMCAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorY2xhbTA5OSBhcHBseSAgIDAuMDAwMDAwMDAwMDAwMDAxZS0zOTggIC0+ICMwMDAwMDAwMDAwMDAwMDAwICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIFNhbWUgYWdhaW4sIG5lZ2F0aXZlcworLS0gTm1heCBhbmQgc2ltaWxhcgorY2xhbTEyMiBhcHBseSAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitjbGFtMTI0IGFwcGx5ICAtMS4yMzQ1Njc4OTAxMjM0NTZFKzM4NCAgLT4gLTEuMjM0NTY3ODkwMTIzNDU2RSszODQKKy0tIGZvbGQtZG93bnMgKG1vcmUgYmVsb3cpCitjbGFtMTMwIGFwcGx5ICAtMS4yM0UrMzg0ICAgICAgICAgICAgICAgLT4gLTEuMjMwMDAwMDAwMDAwMDAwRSszODQgQ2xhbXBlZAorY2xhbTEzMiBhcHBseSAgLTFFKzM4NCAgICAgICAgICAgICAgICAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMEUrMzg0IENsYW1wZWQKKworY2xhbTE1MSBhcHBseSAgLTEyMzQ1ICAgICAgICAgICAgICAgICAgIC0+IC0xMjM0NQorY2xhbTE1MyBhcHBseSAgLTEyMzQgICAgICAgICAgICAgICAgICAgIC0+IC0xMjM0CitjbGFtMTU1IGFwcGx5ICAtMTIzICAgICAgICAgICAgICAgICAgICAgLT4gLTEyMworY2xhbTE1NyBhcHBseSAgLTEyICAgICAgICAgICAgICAgICAgICAgIC0+IC0xMgorY2xhbTE1OSBhcHBseSAgLTEgICAgICAgICAgICAgICAgICAgICAgIC0+IC0xCitjbGFtMTYxIGFwcGx5ICAtMS4yMyAgICAgICAgICAgICAgICAgICAgLT4gLTEuMjMKK2NsYW0xNjMgYXBwbHkgIC0xMjMuNDUgICAgICAgICAgICAgICAgICAtPiAtMTIzLjQ1CisKKy0tIE5taW4gYW5kIGJlbG93CitjbGFtMTcxIGFwcGx5ICAtMUUtMzgzICAgICAgICAgICAgICAgICAgLT4gLTFFLTM4MworY2xhbTE3MyBhcHBseSAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitjbGFtMTc1IGFwcGx5ICAtMS4wMDAwMDAwMDAwMDAwMDFFLTM4MyAgLT4gLTEuMDAwMDAwMDAwMDAwMDAxRS0zODMKKworY2xhbTE3NyBhcHBseSAgLTAuMTAwMDAwMDAwMDAwMDAwRS0zODMgIC0+IC0xLjAwMDAwMDAwMDAwMDAwRS0zODQgIFN1Ym5vcm1hbAorY2xhbTE3OSBhcHBseSAgLTAuMDAwMDAwMDAwMDAwMDEwRS0zODMgIC0+IC0xLjBFLTM5NyAgICAgICAgICAgICAgIFN1Ym5vcm1hbAorY2xhbTE4MSBhcHBseSAgLTAuMDAwMDAwMDAwMDAwMDFFLTM4MyAgIC0+IC0xRS0zOTcgICAgICAgICAgICAgICAgIFN1Ym5vcm1hbAorY2xhbTE4MyBhcHBseSAgLTAuMDAwMDAwMDAwMDAwMDAxRS0zODMgIC0+IC0xRS0zOTggICAgICAgICAgICAgICAgIFN1Ym5vcm1hbAorCistLSB1bmRlcmZsb3dzCitjbGFtMTg5IGFwcGx5ICAgLTFlLTM5OCAgICAgICAgICAgICAgICAgLT4gIzgwMDAwMDAwMDAwMDAwMDEgIFN1Ym5vcm1hbAorY2xhbTE5MCBhcHBseSAgIC0xLjBlLTM5OCAgICAgICAgICAgICAgIC0+ICM4MDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwgUm91bmRlZAorY2xhbTE5MSBhcHBseSAgIC0xLjllLTM5OCAgICAgICAgICAgICAgIC0+ICM4MDAwMDAwMDAwMDAwMDAyICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTE5MiBhcHBseSAgIC0xLjFlLTM5OCAgICAgICAgICAgICAgIC0+ICM4MDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTE5MyBhcHBseSAgIC0xLjAwMDAwMDAwMDAxZS0zOTggICAgIC0+ICM4MDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTE5NCBhcHBseSAgIC0xLjAwMDAwMDAwMDAwMDAxZS0zOTggIC0+ICM4MDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTE5NSBhcHBseSAgIC0xLjAwMDAwMDAwMDAwMDAwMWUtMzk4IC0+ICM4MDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTE5NiBhcHBseSAgIC0wLjFlLTM5OCAgICAgICAgICAgICAgIC0+ICM4MDAwMDAwMDAwMDAwMDAwICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitjbGFtMTk3IGFwcGx5ICAgLTAuMDAwMDAwMDAwMDFlLTM5OCAgICAgLT4gIzgwMDAwMDAwMDAwMDAwMDAgIFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2NsYW0xOTggYXBwbHkgICAtMC4wMDAwMDAwMDAwMDAwMWUtMzk4ICAtPiAjODAwMDAwMDAwMDAwMDAwMCAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorY2xhbTE5OSBhcHBseSAgIC0wLjAwMDAwMDAwMDAwMDAwMWUtMzk4IC0+ICM4MDAwMDAwMDAwMDAwMDAwICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIHplcm9zCitjbGFtNDAxIGFwcGx5ICAgMEUtNTAwICAgICAgICAgICAgICAgICAgLT4gMEUtMzk4ICBDbGFtcGVkCitjbGFtNDAyIGFwcGx5ICAgMEUtNDAwICAgICAgICAgICAgICAgICAgLT4gMEUtMzk4ICBDbGFtcGVkCitjbGFtNDAzIGFwcGx5ICAgMEUtMzk4ICAgICAgICAgICAgICAgICAgLT4gMEUtMzk4CitjbGFtNDA0IGFwcGx5ICAgMC4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gMEUtMzk4CitjbGFtNDA1IGFwcGx5ICAgMEUtMiAgICAgICAgICAgICAgICAgICAgLT4gIDAuMDAKK2NsYW00MDYgYXBwbHkgICAwICAgICAgICAgICAgICAgICAgICAgICAtPiAwCitjbGFtNDA3IGFwcGx5ICAgMEUrMyAgICAgICAgICAgICAgICAgICAgLT4gMEUrMworY2xhbTQwOCBhcHBseSAgIDBFKzM2OSAgICAgICAgICAgICAgICAgIC0+IDBFKzM2OQorLS0gY2xhbXBlZCB6ZXJvcy4uLgorY2xhbTQxMCBhcHBseSAgIDBFKzM3MCAgICAgICAgICAgICAgICAgIC0+IDBFKzM2OSBDbGFtcGVkCitjbGFtNDExIGFwcGx5ICAgMEUrMzg0ICAgICAgICAgICAgICAgICAgLT4gMEUrMzY5IENsYW1wZWQKK2NsYW00MTIgYXBwbHkgICAwRSs0MDAgICAgICAgICAgICAgICAgICAtPiAwRSszNjkgQ2xhbXBlZAorY2xhbTQxMyBhcHBseSAgIDBFKzUwMCAgICAgICAgICAgICAgICAgIC0+IDBFKzM2OSBDbGFtcGVkCisKKy0tIG5lZ2F0aXZlIHplcm9zCitjbGFtNDIwIGFwcGx5ICAgLTBFLTUwMCAgICAgICAgICAgICAgICAgLT4gLTBFLTM5OCBDbGFtcGVkCitjbGFtNDIxIGFwcGx5ICAgLTBFLTQwMCAgICAgICAgICAgICAgICAgLT4gLTBFLTM5OCBDbGFtcGVkCitjbGFtNDIyIGFwcGx5ICAgLTBFLTM5OCAgICAgICAgICAgICAgICAgLT4gLTBFLTM5OAorY2xhbTQyMyBhcHBseSAgIC0wLjAwMDAwMDAwMDAwMDAwMEUtMzgzIC0+IC0wRS0zOTgKK2NsYW00MjQgYXBwbHkgICAtMEUtMiAgICAgICAgICAgICAgICAgICAtPiAtMC4wMAorY2xhbTQyNSBhcHBseSAgIC0wICAgICAgICAgICAgICAgICAgICAgIC0+IC0wCitjbGFtNDI2IGFwcGx5ICAgLTBFKzMgICAgICAgICAgICAgICAgICAgLT4gLTBFKzMKK2NsYW00MjcgYXBwbHkgICAtMEUrMzY5ICAgICAgICAgICAgICAgICAtPiAtMEUrMzY5CistLSBjbGFtcGVkIHplcm9zLi4uCitjbGFtNDMxIGFwcGx5ICAgLTBFKzM3MCAgICAgICAgICAgICAgICAgLT4gLTBFKzM2OSBDbGFtcGVkCitjbGFtNDMyIGFwcGx5ICAgLTBFKzM4NCAgICAgICAgICAgICAgICAgLT4gLTBFKzM2OSBDbGFtcGVkCitjbGFtNDMzIGFwcGx5ICAgLTBFKzQwMCAgICAgICAgICAgICAgICAgLT4gLTBFKzM2OSBDbGFtcGVkCitjbGFtNDM0IGFwcGx5ICAgLTBFKzUwMCAgICAgICAgICAgICAgICAgLT4gLTBFKzM2OSBDbGFtcGVkCisKKy0tIGZvbGQtZG93biBmdWxsIHNlcXVlbmNlCitjbGFtNjAxIGFwcGx5ICAgMUUrMzg0ICAgICAgICAgICAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBDbGFtcGVkCitjbGFtNjAzIGFwcGx5ICAgMUUrMzgzICAgICAgICAgICAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMEUrMzgzIENsYW1wZWQKK2NsYW02MDUgYXBwbHkgICAxRSszODIgICAgICAgICAgICAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDBFKzM4MiBDbGFtcGVkCitjbGFtNjA3IGFwcGx5ICAgMUUrMzgxICAgICAgICAgICAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDBFKzM4MSBDbGFtcGVkCitjbGFtNjA5IGFwcGx5ICAgMUUrMzgwICAgICAgICAgICAgICAgICAgLT4gMS4wMDAwMDAwMDAwMEUrMzgwIENsYW1wZWQKK2NsYW02MTEgYXBwbHkgICAxRSszNzkgICAgICAgICAgICAgICAgICAtPiAxLjAwMDAwMDAwMDBFKzM3OSBDbGFtcGVkCitjbGFtNjEzIGFwcGx5ICAgMUUrMzc4ICAgICAgICAgICAgICAgICAgLT4gMS4wMDAwMDAwMDBFKzM3OCBDbGFtcGVkCitjbGFtNjE1IGFwcGx5ICAgMUUrMzc3ICAgICAgICAgICAgICAgICAgLT4gMS4wMDAwMDAwMEUrMzc3IENsYW1wZWQKK2NsYW02MTcgYXBwbHkgICAxRSszNzYgICAgICAgICAgICAgICAgICAtPiAxLjAwMDAwMDBFKzM3NiBDbGFtcGVkCitjbGFtNjE5IGFwcGx5ICAgMUUrMzc1ICAgICAgICAgICAgICAgICAgLT4gMS4wMDAwMDBFKzM3NSBDbGFtcGVkCitjbGFtNjIxIGFwcGx5ICAgMUUrMzc0ICAgICAgICAgICAgICAgICAgLT4gMS4wMDAwMEUrMzc0IENsYW1wZWQKK2NsYW02MjMgYXBwbHkgICAxRSszNzMgICAgICAgICAgICAgICAgICAtPiAxLjAwMDBFKzM3MyBDbGFtcGVkCitjbGFtNjI1IGFwcGx5ICAgMUUrMzcyICAgICAgICAgICAgICAgICAgLT4gMS4wMDBFKzM3MiBDbGFtcGVkCitjbGFtNjI3IGFwcGx5ICAgMUUrMzcxICAgICAgICAgICAgICAgICAgLT4gMS4wMEUrMzcxIENsYW1wZWQKK2NsYW02MjkgYXBwbHkgICAxRSszNzAgICAgICAgICAgICAgICAgICAtPiAxLjBFKzM3MCBDbGFtcGVkCitjbGFtNjMxIGFwcGx5ICAgMUUrMzY5ICAgICAgICAgICAgICAgICAgLT4gMUUrMzY5CitjbGFtNjMzIGFwcGx5ICAgMUUrMzY4ICAgICAgICAgICAgICAgICAgLT4gMUUrMzY4CistLSBzYW1lIHdpdGggOXMKK2NsYW02NDEgYXBwbHkgICA5RSszODQgICAgICAgICAgICAgICAgICAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IENsYW1wZWQKK2NsYW02NDMgYXBwbHkgICA5RSszODMgICAgICAgICAgICAgICAgICAtPiA5LjAwMDAwMDAwMDAwMDAwRSszODMgQ2xhbXBlZAorY2xhbTY0NSBhcHBseSAgIDlFKzM4MiAgICAgICAgICAgICAgICAgIC0+IDkuMDAwMDAwMDAwMDAwMEUrMzgyIENsYW1wZWQKK2NsYW02NDcgYXBwbHkgICA5RSszODEgICAgICAgICAgICAgICAgICAtPiA5LjAwMDAwMDAwMDAwMEUrMzgxIENsYW1wZWQKK2NsYW02NDkgYXBwbHkgICA5RSszODAgICAgICAgICAgICAgICAgICAtPiA5LjAwMDAwMDAwMDAwRSszODAgQ2xhbXBlZAorY2xhbTY1MSBhcHBseSAgIDlFKzM3OSAgICAgICAgICAgICAgICAgIC0+IDkuMDAwMDAwMDAwMEUrMzc5IENsYW1wZWQKK2NsYW02NTMgYXBwbHkgICA5RSszNzggICAgICAgICAgICAgICAgICAtPiA5LjAwMDAwMDAwMEUrMzc4IENsYW1wZWQKK2NsYW02NTUgYXBwbHkgICA5RSszNzcgICAgICAgICAgICAgICAgICAtPiA5LjAwMDAwMDAwRSszNzcgQ2xhbXBlZAorY2xhbTY1NyBhcHBseSAgIDlFKzM3NiAgICAgICAgICAgICAgICAgIC0+IDkuMDAwMDAwMEUrMzc2IENsYW1wZWQKK2NsYW02NTkgYXBwbHkgICA5RSszNzUgICAgICAgICAgICAgICAgICAtPiA5LjAwMDAwMEUrMzc1IENsYW1wZWQKK2NsYW02NjEgYXBwbHkgICA5RSszNzQgICAgICAgICAgICAgICAgICAtPiA5LjAwMDAwRSszNzQgQ2xhbXBlZAorY2xhbTY2MyBhcHBseSAgIDlFKzM3MyAgICAgICAgICAgICAgICAgIC0+IDkuMDAwMEUrMzczIENsYW1wZWQKK2NsYW02NjUgYXBwbHkgICA5RSszNzIgICAgICAgICAgICAgICAgICAtPiA5LjAwMEUrMzcyIENsYW1wZWQKK2NsYW02NjcgYXBwbHkgICA5RSszNzEgICAgICAgICAgICAgICAgICAtPiA5LjAwRSszNzEgQ2xhbXBlZAorY2xhbTY2OSBhcHBseSAgIDlFKzM3MCAgICAgICAgICAgICAgICAgIC0+IDkuMEUrMzcwIENsYW1wZWQKK2NsYW02NzEgYXBwbHkgICA5RSszNjkgICAgICAgICAgICAgICAgICAtPiA5RSszNjkKK2NsYW02NzMgYXBwbHkgICA5RSszNjggICAgICAgICAgICAgICAgICAtPiA5RSszNjgKKworLS0gc3Vibm9ybWFscyBjbGFtcGVkIHRvIDAtRXRpbnkKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2NsYW02ODEgYXBwbHkgN0UtMzk4ICAgICAtPiA3RS0zOTggU3Vibm9ybWFsCitjbGFtNjgyIGFwcGx5IDBFLTM5OCAgICAgLT4gMEUtMzk4CitjbGFtNjgzIGFwcGx5IDdFLTM5OSAgICAgLT4gMUUtMzk4IFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitjbGFtNjg0IGFwcGx5IDRFLTM5OSAgICAgLT4gMEUtMzk4IENsYW1wZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW02ODUgYXBwbHkgN0UtNDAwICAgICAtPiAwRS0zOTggQ2xhbXBlZCBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTY4NiBhcHBseSA3RS00MDEgICAgIC0+IDBFLTM5OCBDbGFtcGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitjbGFtNjg3IGFwcGx5IDBFLTM5OSAgICAgLT4gMEUtMzk4IENsYW1wZWQKK2NsYW02ODggYXBwbHkgMEUtNDAwICAgICAtPiAwRS0zOTggQ2xhbXBlZAorY2xhbTY4OSBhcHBseSAwRS00MDEgICAgIC0+IDBFLTM5OCBDbGFtcGVkCisKKy0tIGV4YW1wbGUgZnJvbSBkb2N1bWVudGF0aW9uCitwcmVjaXNpb246ICAgNworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6ICs5NgorbWluRXhwb25lbnQ6IC05NQorCitjbGFtcDogICAgICAgMAorY2xhbTcwMCBhcHBseSAgIDEuMjNFKzk2ICAgICAgICAgICAgICAgIC0+IDEuMjNFKzk2CisKK2NsYW1wOiAgICAgICAxCitjbGFtNzAxIGFwcGx5ICAgMS4yM0UrOTYgICAgICAgICAgICAgICAgLT4gMS4yMzAwMDBFKzk2IENsYW1wZWQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY2xhc3MuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY2xhc3MuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTViYzNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jbGFzcy5kZWNUZXN0CkBAIC0wLDAgKzEsMTMxIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGNsYXNzLmRlY1Rlc3QgLS0gQ2xhc3Mgb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gW05ldyAyMDA2LjExLjI3XQorCitwcmVjaXNpb246ICAgOQorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitjbGFzeDAwMSAgY2xhc3MgICAgMCAgICAgICAgICAgICAgICAgICAgICAgIC0+ICtaZXJvCitjbGFzeDAwMiAgY2xhc3MgICAgMC4wMCAgICAgICAgICAgICAgICAgICAgIC0+ICtaZXJvCitjbGFzeDAwMyAgY2xhc3MgICAgMEUrNSAgICAgICAgICAgICAgICAgICAgIC0+ICtaZXJvCitjbGFzeDAwNCAgY2xhc3MgICAgMUUtMTAwNyAgICAgICAgICAgICAgICAgIC0+ICtTdWJub3JtYWwKK2NsYXN4MDA1ICBjbGFzcyAgMC4xRS05OTkgICAgICAgICAgICAgICAgICAgLT4gK1N1Ym5vcm1hbAorY2xhc3gwMDYgIGNsYXNzICAwLjk5OTk5OTk5RS05OTkgICAgICAgICAgICAtPiArU3Vibm9ybWFsCitjbGFzeDAwNyAgY2xhc3MgIDEuMDAwMDAwMDBFLTk5OSAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MDA4ICBjbGFzcyAgIDFFLTk5OSAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gwMDkgIGNsYXNzICAgMUUtMTAwICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDAxMCAgY2xhc3MgICAxRS0xMCAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MDEyICBjbGFzcyAgIDFFLTEgICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gwMTMgIGNsYXNzICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDAxNCAgY2xhc3MgICAyLjUwICAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MDE1ICBjbGFzcyAgIDEwMC4xMDAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gwMTYgIGNsYXNzICAgMUUrMzAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDAxNyAgY2xhc3MgICAxRSs5OTkgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MDE4ICBjbGFzcyAgIDkuOTk5OTk5OTlFKzk5OSAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gwMTkgIGNsYXNzICAgSW5mICAgICAgICAgICAgICAgICAgICAgICAtPiArSW5maW5pdHkKKworY2xhc3gwMjEgIGNsYXNzICAgLTAgICAgICAgICAgICAgICAgICAgICAgICAtPiAtWmVybworY2xhc3gwMjIgIGNsYXNzICAgLTAuMDAgICAgICAgICAgICAgICAgICAgICAtPiAtWmVybworY2xhc3gwMjMgIGNsYXNzICAgLTBFKzUgICAgICAgICAgICAgICAgICAgICAtPiAtWmVybworY2xhc3gwMjQgIGNsYXNzICAgLTFFLTEwMDcgICAgICAgICAgICAgICAgICAtPiAtU3Vibm9ybWFsCitjbGFzeDAyNSAgY2xhc3MgIC0wLjFFLTk5OSAgICAgICAgICAgICAgICAgIC0+IC1TdWJub3JtYWwKK2NsYXN4MDI2ICBjbGFzcyAgLTAuOTk5OTk5OTlFLTk5OSAgICAgICAgICAgLT4gLVN1Ym5vcm1hbAorY2xhc3gwMjcgIGNsYXNzICAtMS4wMDAwMDAwMEUtOTk5ICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDAyOCAgY2xhc3MgIC0xRS05OTkgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MDI5ICBjbGFzcyAgLTFFLTEwMCAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gwMzAgIGNsYXNzICAtMUUtMTAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDAzMiAgY2xhc3MgIC0xRS0xICAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MDMzICBjbGFzcyAgLTEgICAgICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gwMzQgIGNsYXNzICAtMi41MCAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDAzNSAgY2xhc3MgIC0xMDAuMTAwICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MDM2ICBjbGFzcyAgLTFFKzMwICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gwMzcgIGNsYXNzICAtMUUrOTk5ICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDAzOCAgY2xhc3MgIC05Ljk5OTk5OTk5RSs5OTkgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MDM5ICBjbGFzcyAgLUluZiAgICAgICAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5CisKK2NsYXN4MDQxICBjbGFzcyAgIE5hTiAgICAgICAgICAgICAgICAgICAgICAgLT4gTmFOCitjbGFzeDA0MiAgY2xhc3MgIC1OYU4gICAgICAgICAgICAgICAgICAgICAgIC0+IE5hTgorY2xhc3gwNDMgIGNsYXNzICArTmFOMTIzNDUgICAgICAgICAgICAgICAgICAtPiBOYU4KK2NsYXN4MDQ0ICBjbGFzcyAgIHNOYU4gICAgICAgICAgICAgICAgICAgICAgLT4gc05hTgorY2xhc3gwNDUgIGNsYXNzICAtc05hTiAgICAgICAgICAgICAgICAgICAgICAtPiBzTmFOCitjbGFzeDA0NiAgY2xhc3MgICtzTmFOMTIzNDUgICAgICAgICAgICAgICAgIC0+IHNOYU4KKworCistLSBkZWNpbWFsNjQgYm91bmRzCisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2NsYXN4MjAxICBjbGFzcyAgICAwICAgICAgICAgICAgICAgICAgICAgICAgLT4gK1plcm8KK2NsYXN4MjAyICBjbGFzcyAgICAwLjAwICAgICAgICAgICAgICAgICAgICAgLT4gK1plcm8KK2NsYXN4MjAzICBjbGFzcyAgICAwRSs1ICAgICAgICAgICAgICAgICAgICAgLT4gK1plcm8KK2NsYXN4MjA0ICBjbGFzcyAgICAxRS0zOTYgICAgICAgICAgICAgICAgICAgLT4gK1N1Ym5vcm1hbAorY2xhc3gyMDUgIGNsYXNzICAwLjFFLTM4MyAgICAgICAgICAgICAgICAgICAtPiArU3Vibm9ybWFsCitjbGFzeDIwNiAgY2xhc3MgIDAuOTk5OTk5OTk5OTk5OTk5RS0zODMgICAgIC0+ICtTdWJub3JtYWwKK2NsYXN4MjA3ICBjbGFzcyAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLT4gK05vcm1hbAorY2xhc3gyMDggIGNsYXNzICAgMUUtMzgzICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDIwOSAgY2xhc3MgICAxRS0xMDAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MjEwICBjbGFzcyAgIDFFLTEwICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gyMTIgIGNsYXNzICAgMUUtMSAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDIxMyAgY2xhc3MgICAxICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MjE0ICBjbGFzcyAgIDIuNTAgICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gyMTUgIGNsYXNzICAgMTAwLjEwMCAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDIxNiAgY2xhc3MgICAxRSszMCAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MjE3ICBjbGFzcyAgIDFFKzM4NCAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gyMTggIGNsYXNzICAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAtPiArTm9ybWFsCitjbGFzeDIxOSAgY2xhc3MgICBJbmYgICAgICAgICAgICAgICAgICAgICAgIC0+ICtJbmZpbml0eQorCitjbGFzeDIyMSAgY2xhc3MgICAtMCAgICAgICAgICAgICAgICAgICAgICAgIC0+IC1aZXJvCitjbGFzeDIyMiAgY2xhc3MgICAtMC4wMCAgICAgICAgICAgICAgICAgICAgIC0+IC1aZXJvCitjbGFzeDIyMyAgY2xhc3MgICAtMEUrNSAgICAgICAgICAgICAgICAgICAgIC0+IC1aZXJvCitjbGFzeDIyNCAgY2xhc3MgICAtMUUtMzk2ICAgICAgICAgICAgICAgICAgIC0+IC1TdWJub3JtYWwKK2NsYXN4MjI1ICBjbGFzcyAgLTAuMUUtMzgzICAgICAgICAgICAgICAgICAgLT4gLVN1Ym5vcm1hbAorY2xhc3gyMjYgIGNsYXNzICAtMC45OTk5OTk5OTk5OTk5OTlFLTM4MyAgICAtPiAtU3Vibm9ybWFsCitjbGFzeDIyNyAgY2xhc3MgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgIC0+IC1Ob3JtYWwKK2NsYXN4MjI4ICBjbGFzcyAgLTFFLTM4MyAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gyMjkgIGNsYXNzICAtMUUtMTAwICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDIzMCAgY2xhc3MgIC0xRS0xMCAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MjMyICBjbGFzcyAgLTFFLTEgICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gyMzMgIGNsYXNzICAtMSAgICAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDIzNCAgY2xhc3MgIC0yLjUwICAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MjM1ICBjbGFzcyAgLTEwMC4xMDAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gyMzYgIGNsYXNzICAtMUUrMzAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDIzNyAgY2xhc3MgIC0xRSszODQgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MjM4ICBjbGFzcyAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgLT4gLU5vcm1hbAorY2xhc3gyMzkgIGNsYXNzICAtSW5mICAgICAgICAgICAgICAgICAgICAgICAtPiAtSW5maW5pdHkKKworY2xhc3gyNDEgIGNsYXNzICAgTmFOICAgICAgICAgICAgICAgICAgICAgICAtPiBOYU4KK2NsYXN4MjQyICBjbGFzcyAgLU5hTiAgICAgICAgICAgICAgICAgICAgICAgLT4gTmFOCitjbGFzeDI0MyAgY2xhc3MgICtOYU4xMjM0NSAgICAgICAgICAgICAgICAgIC0+IE5hTgorY2xhc3gyNDQgIGNsYXNzICAgc05hTiAgICAgICAgICAgICAgICAgICAgICAtPiBzTmFOCitjbGFzeDI0NSAgY2xhc3MgIC1zTmFOICAgICAgICAgICAgICAgICAgICAgIC0+IHNOYU4KK2NsYXN4MjQ2ICBjbGFzcyAgK3NOYU4xMjM0NSAgICAgICAgICAgICAgICAgLT4gc05hTgorCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb21wYXJlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvbXBhcmUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzcxMzAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb21wYXJlLmRlY1Rlc3QKQEAgLTAsMCArMSw3NTggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gY29tcGFyZS5kZWNUZXN0IC0tIGRlY2ltYWwgY29tcGFyaXNvbiB0aGF0IGFsbG93cyBxdWlldCBOYU5zICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBOb3RlIHRoYXQgd2UgY2Fubm90IGFzc3VtZSBhZGQvc3VidHJhY3QgdGVzdHMgY292ZXIgcGF0aHMgYWRlcXVhdGVseSwKKy0tIGhlcmUsIGJlY2F1c2UgdGhlIGNvZGUgbWlnaHQgYmUgcXVpdGUgZGlmZmVyZW50IChjb21wYXJpc29uIGNhbm5vdAorLS0gb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBzbyBhY3R1YWwgc3VidHJhY3Rpb25zIGFyZSBub3QgbmVjZXNzYXJ5KS4KKworZXh0ZW5kZWQ6IDEKKworcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorCistLSBzYW5pdHkgY2hlY2tzCitjb214MDAxIGNvbXBhcmUgIC0yICAtMiAgLT4gMAorY29teDAwMiBjb21wYXJlICAtMiAgLTEgIC0+IC0xCitjb214MDAzIGNvbXBhcmUgIC0yICAgMCAgLT4gLTEKK2NvbXgwMDQgY29tcGFyZSAgLTIgICAxICAtPiAtMQorY29teDAwNSBjb21wYXJlICAtMiAgIDIgIC0+IC0xCitjb214MDA2IGNvbXBhcmUgIC0xICAtMiAgLT4gMQorY29teDAwNyBjb21wYXJlICAtMSAgLTEgIC0+IDAKK2NvbXgwMDggY29tcGFyZSAgLTEgICAwICAtPiAtMQorY29teDAwOSBjb21wYXJlICAtMSAgIDEgIC0+IC0xCitjb214MDEwIGNvbXBhcmUgIC0xICAgMiAgLT4gLTEKK2NvbXgwMTEgY29tcGFyZSAgIDAgIC0yICAtPiAxCitjb214MDEyIGNvbXBhcmUgICAwICAtMSAgLT4gMQorY29teDAxMyBjb21wYXJlICAgMCAgIDAgIC0+IDAKK2NvbXgwMTQgY29tcGFyZSAgIDAgICAxICAtPiAtMQorY29teDAxNSBjb21wYXJlICAgMCAgIDIgIC0+IC0xCitjb214MDE2IGNvbXBhcmUgICAxICAtMiAgLT4gMQorY29teDAxNyBjb21wYXJlICAgMSAgLTEgIC0+IDEKK2NvbXgwMTggY29tcGFyZSAgIDEgICAwICAtPiAxCitjb214MDE5IGNvbXBhcmUgICAxICAgMSAgLT4gMAorY29teDAyMCBjb21wYXJlICAgMSAgIDIgIC0+IC0xCitjb214MDIxIGNvbXBhcmUgICAyICAtMiAgLT4gMQorY29teDAyMiBjb21wYXJlICAgMiAgLTEgIC0+IDEKK2NvbXgwMjMgY29tcGFyZSAgIDIgICAwICAtPiAxCitjb214MDI1IGNvbXBhcmUgICAyICAgMSAgLT4gMQorY29teDAyNiBjb21wYXJlICAgMiAgIDIgIC0+IDAKKworY29teDAzMSBjb21wYXJlICAtMjAgIC0yMCAgLT4gMAorY29teDAzMiBjb21wYXJlICAtMjAgIC0xMCAgLT4gLTEKK2NvbXgwMzMgY29tcGFyZSAgLTIwICAgMDAgIC0+IC0xCitjb214MDM0IGNvbXBhcmUgIC0yMCAgIDEwICAtPiAtMQorY29teDAzNSBjb21wYXJlICAtMjAgICAyMCAgLT4gLTEKK2NvbXgwMzYgY29tcGFyZSAgLTEwICAtMjAgIC0+IDEKK2NvbXgwMzcgY29tcGFyZSAgLTEwICAtMTAgIC0+IDAKK2NvbXgwMzggY29tcGFyZSAgLTEwICAgMDAgIC0+IC0xCitjb214MDM5IGNvbXBhcmUgIC0xMCAgIDEwICAtPiAtMQorY29teDA0MCBjb21wYXJlICAtMTAgICAyMCAgLT4gLTEKK2NvbXgwNDEgY29tcGFyZSAgIDAwICAtMjAgIC0+IDEKK2NvbXgwNDIgY29tcGFyZSAgIDAwICAtMTAgIC0+IDEKK2NvbXgwNDMgY29tcGFyZSAgIDAwICAgMDAgIC0+IDAKK2NvbXgwNDQgY29tcGFyZSAgIDAwICAgMTAgIC0+IC0xCitjb214MDQ1IGNvbXBhcmUgICAwMCAgIDIwICAtPiAtMQorY29teDA0NiBjb21wYXJlICAgMTAgIC0yMCAgLT4gMQorY29teDA0NyBjb21wYXJlICAgMTAgIC0xMCAgLT4gMQorY29teDA0OCBjb21wYXJlICAgMTAgICAwMCAgLT4gMQorY29teDA0OSBjb21wYXJlICAgMTAgICAxMCAgLT4gMAorY29teDA1MCBjb21wYXJlICAgMTAgICAyMCAgLT4gLTEKK2NvbXgwNTEgY29tcGFyZSAgIDIwICAtMjAgIC0+IDEKK2NvbXgwNTIgY29tcGFyZSAgIDIwICAtMTAgIC0+IDEKK2NvbXgwNTMgY29tcGFyZSAgIDIwICAgMDAgIC0+IDEKK2NvbXgwNTUgY29tcGFyZSAgIDIwICAgMTAgIC0+IDEKK2NvbXgwNTYgY29tcGFyZSAgIDIwICAgMjAgIC0+IDAKKworY29teDA2MSBjb21wYXJlICAtMi4wICAtMi4wICAtPiAwCitjb214MDYyIGNvbXBhcmUgIC0yLjAgIC0xLjAgIC0+IC0xCitjb214MDYzIGNvbXBhcmUgIC0yLjAgICAwLjAgIC0+IC0xCitjb214MDY0IGNvbXBhcmUgIC0yLjAgICAxLjAgIC0+IC0xCitjb214MDY1IGNvbXBhcmUgIC0yLjAgICAyLjAgIC0+IC0xCitjb214MDY2IGNvbXBhcmUgIC0xLjAgIC0yLjAgIC0+IDEKK2NvbXgwNjcgY29tcGFyZSAgLTEuMCAgLTEuMCAgLT4gMAorY29teDA2OCBjb21wYXJlICAtMS4wICAgMC4wICAtPiAtMQorY29teDA2OSBjb21wYXJlICAtMS4wICAgMS4wICAtPiAtMQorY29teDA3MCBjb21wYXJlICAtMS4wICAgMi4wICAtPiAtMQorY29teDA3MSBjb21wYXJlICAgMC4wICAtMi4wICAtPiAxCitjb214MDcyIGNvbXBhcmUgICAwLjAgIC0xLjAgIC0+IDEKK2NvbXgwNzMgY29tcGFyZSAgIDAuMCAgIDAuMCAgLT4gMAorY29teDA3NCBjb21wYXJlICAgMC4wICAgMS4wICAtPiAtMQorY29teDA3NSBjb21wYXJlICAgMC4wICAgMi4wICAtPiAtMQorY29teDA3NiBjb21wYXJlICAgMS4wICAtMi4wICAtPiAxCitjb214MDc3IGNvbXBhcmUgICAxLjAgIC0xLjAgIC0+IDEKK2NvbXgwNzggY29tcGFyZSAgIDEuMCAgIDAuMCAgLT4gMQorY29teDA3OSBjb21wYXJlICAgMS4wICAgMS4wICAtPiAwCitjb214MDgwIGNvbXBhcmUgICAxLjAgICAyLjAgIC0+IC0xCitjb214MDgxIGNvbXBhcmUgICAyLjAgIC0yLjAgIC0+IDEKK2NvbXgwODIgY29tcGFyZSAgIDIuMCAgLTEuMCAgLT4gMQorY29teDA4MyBjb21wYXJlICAgMi4wICAgMC4wICAtPiAxCitjb214MDg1IGNvbXBhcmUgICAyLjAgICAxLjAgIC0+IDEKK2NvbXgwODYgY29tcGFyZSAgIDIuMCAgIDIuMCAgLT4gMAorCistLSBub3cgc29tZSBjYXNlcyB3aGljaCBtaWdodCBvdmVyZmxvdyBpZiBzdWJ0cmFjdCB3ZXJlIHVzZWQKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5Citjb214MDk1IGNvbXBhcmUgIDkuOTk5OTk5OTlFKzk5OTk5OTk5OSA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgIC0+IDAKK2NvbXgwOTYgY29tcGFyZSAtOS45OTk5OTk5OUUrOTk5OTk5OTk5IDkuOTk5OTk5OTlFKzk5OTk5OTk5OSAgLT4gLTEKK2NvbXgwOTcgY29tcGFyZSAgOS45OTk5OTk5OUUrOTk5OTk5OTk5IC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgLT4gMQorY29teDA5OCBjb21wYXJlIC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgLTkuOTk5OTk5OTlFKzk5OTk5OTk5OSAtPiAwCisKKy0tIHNvbWUgZGlmZmVyaW5nIGxlbmd0aC9leHBvbmVudCBjYXNlcworY29teDEwMCBjb21wYXJlICAgNy4wICAgIDcuMCAgICAtPiAwCitjb214MTAxIGNvbXBhcmUgICA3LjAgICAgNyAgICAgIC0+IDAKK2NvbXgxMDIgY29tcGFyZSAgIDcgICAgICA3LjAgICAgLT4gMAorY29teDEwMyBjb21wYXJlICAgN0UrMCAgIDcuMCAgICAtPiAwCitjb214MTA0IGNvbXBhcmUgICA3MEUtMSAgNy4wICAgIC0+IDAKK2NvbXgxMDUgY29tcGFyZSAgIDAuN0UrMSA3ICAgICAgLT4gMAorY29teDEwNiBjb21wYXJlICAgNzBFLTEgIDcgICAgICAtPiAwCitjb214MTA3IGNvbXBhcmUgICA3LjAgICAgN0UrMCAgIC0+IDAKK2NvbXgxMDggY29tcGFyZSAgIDcuMCAgICA3MEUtMSAgLT4gMAorY29teDEwOSBjb21wYXJlICAgNyAgICAgIDAuN0UrMSAtPiAwCitjb214MTEwIGNvbXBhcmUgICA3ICAgICAgNzBFLTEgIC0+IDAKKworY29teDEyMCBjb21wYXJlICAgOC4wICAgIDcuMCAgICAtPiAxCitjb214MTIxIGNvbXBhcmUgICA4LjAgICAgNyAgICAgIC0+IDEKK2NvbXgxMjIgY29tcGFyZSAgIDggICAgICA3LjAgICAgLT4gMQorY29teDEyMyBjb21wYXJlICAgOEUrMCAgIDcuMCAgICAtPiAxCitjb214MTI0IGNvbXBhcmUgICA4MEUtMSAgNy4wICAgIC0+IDEKK2NvbXgxMjUgY29tcGFyZSAgIDAuOEUrMSA3ICAgICAgLT4gMQorY29teDEyNiBjb21wYXJlICAgODBFLTEgIDcgICAgICAtPiAxCitjb214MTI3IGNvbXBhcmUgICA4LjAgICAgN0UrMCAgIC0+IDEKK2NvbXgxMjggY29tcGFyZSAgIDguMCAgICA3MEUtMSAgLT4gMQorY29teDEyOSBjb21wYXJlICAgOCAgICAgIDAuN0UrMSAgLT4gMQorY29teDEzMCBjb21wYXJlICAgOCAgICAgIDcwRS0xICAtPiAxCisKK2NvbXgxNDAgY29tcGFyZSAgIDguMCAgICA5LjAgICAgLT4gLTEKK2NvbXgxNDEgY29tcGFyZSAgIDguMCAgICA5ICAgICAgLT4gLTEKK2NvbXgxNDIgY29tcGFyZSAgIDggICAgICA5LjAgICAgLT4gLTEKK2NvbXgxNDMgY29tcGFyZSAgIDhFKzAgICA5LjAgICAgLT4gLTEKK2NvbXgxNDQgY29tcGFyZSAgIDgwRS0xICA5LjAgICAgLT4gLTEKK2NvbXgxNDUgY29tcGFyZSAgIDAuOEUrMSA5ICAgICAgLT4gLTEKK2NvbXgxNDYgY29tcGFyZSAgIDgwRS0xICA5ICAgICAgLT4gLTEKK2NvbXgxNDcgY29tcGFyZSAgIDguMCAgICA5RSswICAgLT4gLTEKK2NvbXgxNDggY29tcGFyZSAgIDguMCAgICA5MEUtMSAgLT4gLTEKK2NvbXgxNDkgY29tcGFyZSAgIDggICAgICAwLjlFKzEgLT4gLTEKK2NvbXgxNTAgY29tcGFyZSAgIDggICAgICA5MEUtMSAgLT4gLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyAtKyAuLgorY29teDIwMCBjb21wYXJlICAtNy4wICAgIDcuMCAgICAtPiAtMQorY29teDIwMSBjb21wYXJlICAtNy4wICAgIDcgICAgICAtPiAtMQorY29teDIwMiBjb21wYXJlICAtNyAgICAgIDcuMCAgICAtPiAtMQorY29teDIwMyBjb21wYXJlICAtN0UrMCAgIDcuMCAgICAtPiAtMQorY29teDIwNCBjb21wYXJlICAtNzBFLTEgIDcuMCAgICAtPiAtMQorY29teDIwNSBjb21wYXJlICAtMC43RSsxIDcgICAgICAtPiAtMQorY29teDIwNiBjb21wYXJlICAtNzBFLTEgIDcgICAgICAtPiAtMQorY29teDIwNyBjb21wYXJlICAtNy4wICAgIDdFKzAgICAtPiAtMQorY29teDIwOCBjb21wYXJlICAtNy4wICAgIDcwRS0xICAtPiAtMQorY29teDIwOSBjb21wYXJlICAtNyAgICAgIDAuN0UrMSAtPiAtMQorY29teDIxMCBjb21wYXJlICAtNyAgICAgIDcwRS0xICAtPiAtMQorCitjb214MjIwIGNvbXBhcmUgIC04LjAgICAgNy4wICAgIC0+IC0xCitjb214MjIxIGNvbXBhcmUgIC04LjAgICAgNyAgICAgIC0+IC0xCitjb214MjIyIGNvbXBhcmUgIC04ICAgICAgNy4wICAgIC0+IC0xCitjb214MjIzIGNvbXBhcmUgIC04RSswICAgNy4wICAgIC0+IC0xCitjb214MjI0IGNvbXBhcmUgIC04MEUtMSAgNy4wICAgIC0+IC0xCitjb214MjI1IGNvbXBhcmUgIC0wLjhFKzEgNyAgICAgIC0+IC0xCitjb214MjI2IGNvbXBhcmUgIC04MEUtMSAgNyAgICAgIC0+IC0xCitjb214MjI3IGNvbXBhcmUgIC04LjAgICAgN0UrMCAgIC0+IC0xCitjb214MjI4IGNvbXBhcmUgIC04LjAgICAgNzBFLTEgIC0+IC0xCitjb214MjI5IGNvbXBhcmUgIC04ICAgICAgMC43RSsxIC0+IC0xCitjb214MjMwIGNvbXBhcmUgIC04ICAgICAgNzBFLTEgIC0+IC0xCisKK2NvbXgyNDAgY29tcGFyZSAgLTguMCAgICA5LjAgICAgLT4gLTEKK2NvbXgyNDEgY29tcGFyZSAgLTguMCAgICA5ICAgICAgLT4gLTEKK2NvbXgyNDIgY29tcGFyZSAgLTggICAgICA5LjAgICAgLT4gLTEKK2NvbXgyNDMgY29tcGFyZSAgLThFKzAgICA5LjAgICAgLT4gLTEKK2NvbXgyNDQgY29tcGFyZSAgLTgwRS0xICA5LjAgICAgLT4gLTEKK2NvbXgyNDUgY29tcGFyZSAgLTAuOEUrMSA5ICAgICAgLT4gLTEKK2NvbXgyNDYgY29tcGFyZSAgLTgwRS0xICA5ICAgICAgLT4gLTEKK2NvbXgyNDcgY29tcGFyZSAgLTguMCAgICA5RSswICAgLT4gLTEKK2NvbXgyNDggY29tcGFyZSAgLTguMCAgICA5MEUtMSAgLT4gLTEKK2NvbXgyNDkgY29tcGFyZSAgLTggICAgICAwLjlFKzEgLT4gLTEKK2NvbXgyNTAgY29tcGFyZSAgLTggICAgICA5MEUtMSAgLT4gLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyArLSAuLgorY29teDMwMCBjb21wYXJlICAgNy4wICAgIC03LjAgICAgLT4gMQorY29teDMwMSBjb21wYXJlICAgNy4wICAgIC03ICAgICAgLT4gMQorY29teDMwMiBjb21wYXJlICAgNyAgICAgIC03LjAgICAgLT4gMQorY29teDMwMyBjb21wYXJlICAgN0UrMCAgIC03LjAgICAgLT4gMQorY29teDMwNCBjb21wYXJlICAgNzBFLTEgIC03LjAgICAgLT4gMQorY29teDMwNSBjb21wYXJlICAgLjdFKzEgIC03ICAgICAgLT4gMQorY29teDMwNiBjb21wYXJlICAgNzBFLTEgIC03ICAgICAgLT4gMQorY29teDMwNyBjb21wYXJlICAgNy4wICAgIC03RSswICAgLT4gMQorY29teDMwOCBjb21wYXJlICAgNy4wICAgIC03MEUtMSAgLT4gMQorY29teDMwOSBjb21wYXJlICAgNyAgICAgIC0uN0UrMSAgLT4gMQorY29teDMxMCBjb21wYXJlICAgNyAgICAgIC03MEUtMSAgLT4gMQorCitjb214MzIwIGNvbXBhcmUgICA4LjAgICAgLTcuMCAgICAtPiAxCitjb214MzIxIGNvbXBhcmUgICA4LjAgICAgLTcgICAgICAtPiAxCitjb214MzIyIGNvbXBhcmUgICA4ICAgICAgLTcuMCAgICAtPiAxCitjb214MzIzIGNvbXBhcmUgICA4RSswICAgLTcuMCAgICAtPiAxCitjb214MzI0IGNvbXBhcmUgICA4MEUtMSAgLTcuMCAgICAtPiAxCitjb214MzI1IGNvbXBhcmUgICAuOEUrMSAgLTcgICAgICAtPiAxCitjb214MzI2IGNvbXBhcmUgICA4MEUtMSAgLTcgICAgICAtPiAxCitjb214MzI3IGNvbXBhcmUgICA4LjAgICAgLTdFKzAgICAtPiAxCitjb214MzI4IGNvbXBhcmUgICA4LjAgICAgLTcwRS0xICAtPiAxCitjb214MzI5IGNvbXBhcmUgICA4ICAgICAgLS43RSsxICAtPiAxCitjb214MzMwIGNvbXBhcmUgICA4ICAgICAgLTcwRS0xICAtPiAxCisKK2NvbXgzNDAgY29tcGFyZSAgIDguMCAgICAtOS4wICAgIC0+IDEKK2NvbXgzNDEgY29tcGFyZSAgIDguMCAgICAtOSAgICAgIC0+IDEKK2NvbXgzNDIgY29tcGFyZSAgIDggICAgICAtOS4wICAgIC0+IDEKK2NvbXgzNDMgY29tcGFyZSAgIDhFKzAgICAtOS4wICAgIC0+IDEKK2NvbXgzNDQgY29tcGFyZSAgIDgwRS0xICAtOS4wICAgIC0+IDEKK2NvbXgzNDUgY29tcGFyZSAgIC44RSsxICAtOSAgICAgIC0+IDEKK2NvbXgzNDYgY29tcGFyZSAgIDgwRS0xICAtOSAgICAgIC0+IDEKK2NvbXgzNDcgY29tcGFyZSAgIDguMCAgICAtOUUrMCAgIC0+IDEKK2NvbXgzNDggY29tcGFyZSAgIDguMCAgICAtOTBFLTEgIC0+IDEKK2NvbXgzNDkgY29tcGFyZSAgIDggICAgICAtLjlFKzEgIC0+IDEKK2NvbXgzNTAgY29tcGFyZSAgIDggICAgICAtOTBFLTEgIC0+IDEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyAtLSAuLgorY29teDQwMCBjb21wYXJlICAgLTcuMCAgICAtNy4wICAgIC0+IDAKK2NvbXg0MDEgY29tcGFyZSAgIC03LjAgICAgLTcgICAgICAtPiAwCitjb214NDAyIGNvbXBhcmUgICAtNyAgICAgIC03LjAgICAgLT4gMAorY29teDQwMyBjb21wYXJlICAgLTdFKzAgICAtNy4wICAgIC0+IDAKK2NvbXg0MDQgY29tcGFyZSAgIC03MEUtMSAgLTcuMCAgICAtPiAwCitjb214NDA1IGNvbXBhcmUgICAtLjdFKzEgIC03ICAgICAgLT4gMAorY29teDQwNiBjb21wYXJlICAgLTcwRS0xICAtNyAgICAgIC0+IDAKK2NvbXg0MDcgY29tcGFyZSAgIC03LjAgICAgLTdFKzAgICAtPiAwCitjb214NDA4IGNvbXBhcmUgICAtNy4wICAgIC03MEUtMSAgLT4gMAorY29teDQwOSBjb21wYXJlICAgLTcgICAgICAtLjdFKzEgIC0+IDAKK2NvbXg0MTAgY29tcGFyZSAgIC03ICAgICAgLTcwRS0xICAtPiAwCisKK2NvbXg0MjAgY29tcGFyZSAgIC04LjAgICAgLTcuMCAgICAtPiAtMQorY29teDQyMSBjb21wYXJlICAgLTguMCAgICAtNyAgICAgIC0+IC0xCitjb214NDIyIGNvbXBhcmUgICAtOCAgICAgIC03LjAgICAgLT4gLTEKK2NvbXg0MjMgY29tcGFyZSAgIC04RSswICAgLTcuMCAgICAtPiAtMQorY29teDQyNCBjb21wYXJlICAgLTgwRS0xICAtNy4wICAgIC0+IC0xCitjb214NDI1IGNvbXBhcmUgICAtLjhFKzEgIC03ICAgICAgLT4gLTEKK2NvbXg0MjYgY29tcGFyZSAgIC04MEUtMSAgLTcgICAgICAtPiAtMQorY29teDQyNyBjb21wYXJlICAgLTguMCAgICAtN0UrMCAgIC0+IC0xCitjb214NDI4IGNvbXBhcmUgICAtOC4wICAgIC03MEUtMSAgLT4gLTEKK2NvbXg0MjkgY29tcGFyZSAgIC04ICAgICAgLS43RSsxICAtPiAtMQorY29teDQzMCBjb21wYXJlICAgLTggICAgICAtNzBFLTEgIC0+IC0xCisKK2NvbXg0NDAgY29tcGFyZSAgIC04LjAgICAgLTkuMCAgICAtPiAxCitjb214NDQxIGNvbXBhcmUgICAtOC4wICAgIC05ICAgICAgLT4gMQorY29teDQ0MiBjb21wYXJlICAgLTggICAgICAtOS4wICAgIC0+IDEKK2NvbXg0NDMgY29tcGFyZSAgIC04RSswICAgLTkuMCAgICAtPiAxCitjb214NDQ0IGNvbXBhcmUgICAtODBFLTEgIC05LjAgICAgLT4gMQorY29teDQ0NSBjb21wYXJlICAgLS44RSsxICAtOSAgICAgIC0+IDEKK2NvbXg0NDYgY29tcGFyZSAgIC04MEUtMSAgLTkgICAgICAtPiAxCitjb214NDQ3IGNvbXBhcmUgICAtOC4wICAgIC05RSswICAgLT4gMQorY29teDQ0OCBjb21wYXJlICAgLTguMCAgICAtOTBFLTEgIC0+IDEKK2NvbXg0NDkgY29tcGFyZSAgIC04ICAgICAgLS45RSsxICAtPiAxCitjb214NDUwIGNvbXBhcmUgICAtOCAgICAgIC05MEUtMSAgLT4gMQorCistLSBtaXNhbGlnbm1lbnQgdHJhcHMgZm9yIGxpdHRsZS1lbmRpYW4KK2NvbXg0NTEgY29tcGFyZSAgICAgIDEuMCAgICAgICAwLjEgIC0+IDEKK2NvbXg0NTIgY29tcGFyZSAgICAgIDAuMSAgICAgICAxLjAgIC0+IC0xCitjb214NDUzIGNvbXBhcmUgICAgIDEwLjAgICAgICAgMC4xICAtPiAxCitjb214NDU0IGNvbXBhcmUgICAgICAwLjEgICAgICAxMC4wICAtPiAtMQorY29teDQ1NSBjb21wYXJlICAgICAgMTAwICAgICAgIDEuMCAgLT4gMQorY29teDQ1NiBjb21wYXJlICAgICAgMS4wICAgICAgIDEwMCAgLT4gLTEKK2NvbXg0NTcgY29tcGFyZSAgICAgMTAwMCAgICAgIDEwLjAgIC0+IDEKK2NvbXg0NTggY29tcGFyZSAgICAgMTAuMCAgICAgIDEwMDAgIC0+IC0xCitjb214NDU5IGNvbXBhcmUgICAgMTAwMDAgICAgIDEwMC4wICAtPiAxCitjb214NDYwIGNvbXBhcmUgICAgMTAwLjAgICAgIDEwMDAwICAtPiAtMQorY29teDQ2MSBjb21wYXJlICAgMTAwMDAwICAgIDEwMDAuMCAgLT4gMQorY29teDQ2MiBjb21wYXJlICAgMTAwMC4wICAgIDEwMDAwMCAgLT4gLTEKK2NvbXg0NjMgY29tcGFyZSAgMTAwMDAwMCAgIDEwMDAwLjAgIC0+IDEKK2NvbXg0NjQgY29tcGFyZSAgMTAwMDAuMCAgIDEwMDAwMDAgIC0+IC0xCisKKy0tIHRlc3RjYXNlcyB0aGF0IHN1YnRyYWN0IHRvIGxvdHMgb2YgemVyb3MgYXQgYm91bmRhcmllcyBbcGdyXQorcHJlY2lzaW9uOiA0MAorY29teDQ3MCBjb21wYXJlIDEyMy40NTYwMDAwMDAwMDAwMDAwRTc4OSAxMjMuNDU2RTc4OSAtPiAwCitjb214NDcxIGNvbXBhcmUgMTIzLjQ1NjAwMDAwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gMAorY29teDQ3MiBjb21wYXJlIDEyMy40NTYwMDAwMDAwMDAwMEU3ODkgMTIzLjQ1NkU3ODkgLT4gMAorY29teDQ3MyBjb21wYXJlIDEyMy40NTYwMDAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAwCitjb214NDc0IGNvbXBhcmUgMTIzLjQ1NjAwMDAwMDAwMEU3ODkgMTIzLjQ1NkU3ODkgLT4gMAorY29teDQ3NSBjb21wYXJlIDEyMy40NTYwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gMAorY29teDQ3NiBjb21wYXJlIDEyMy40NTYwMDAwMDAwRTc4OSAxMjMuNDU2RTc4OSAtPiAwCitjb214NDc3IGNvbXBhcmUgMTIzLjQ1NjAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gMAorY29teDQ3OCBjb21wYXJlIDEyMy40NTYwMDAwMEU3ODkgMTIzLjQ1NkU3ODkgLT4gMAorY29teDQ3OSBjb21wYXJlIDEyMy40NTYwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAwCitjb214NDgwIGNvbXBhcmUgMTIzLjQ1NjAwMEU3ODkgMTIzLjQ1NkU3ODkgLT4gMAorY29teDQ4MSBjb21wYXJlIDEyMy40NTYwMEUtODkgMTIzLjQ1NkUtODkgLT4gMAorY29teDQ4MiBjb21wYXJlIDEyMy40NTYwRTc4OSAxMjMuNDU2RTc4OSAtPiAwCitjb214NDgzIGNvbXBhcmUgMTIzLjQ1NkUtODkgMTIzLjQ1NkUtODkgLT4gMAorY29teDQ4NCBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwMDAwMDAwRS04OSAtPiAwCitjb214NDg1IGNvbXBhcmUgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwMDAwMDAwMDAwMEU3ODkgLT4gMAorY29teDQ4NiBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwMDAwMEUtODkgLT4gMAorY29teDQ4NyBjb21wYXJlIDEyMy40NTZFNzg5IDEyMy40NTYwMDAwMDAwMDAwRTc4OSAtPiAwCitjb214NDg4IGNvbXBhcmUgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDAwMEUtODkgLT4gMAorY29teDQ4OSBjb21wYXJlIDEyMy40NTZFNzg5IDEyMy40NTYwMDAwMDAwMEU3ODkgLT4gMAorY29teDQ5MCBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwRS04OSAtPiAwCitjb214NDkxIGNvbXBhcmUgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwMDAwMEU3ODkgLT4gMAorY29teDQ5MiBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMEUtODkgLT4gMAorY29teDQ5MyBjb21wYXJlIDEyMy40NTZFNzg5IDEyMy40NTYwMDAwRTc4OSAtPiAwCitjb214NDk0IGNvbXBhcmUgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMEUtODkgLT4gMAorY29teDQ5NSBjb21wYXJlIDEyMy40NTZFNzg5IDEyMy40NTYwMEU3ODkgLT4gMAorY29teDQ5NiBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTYwRS04OSAtPiAwCitjb214NDk3IGNvbXBhcmUgMTIzLjQ1NkU3ODkgMTIzLjQ1NkU3ODkgLT4gMAorCistLSB3aWRlLXJhbmdpbmcsIGFyb3VuZCBwcmVjaXNpb247IHNpZ25zIGVxdWFsCitwcmVjaXNpb246IDkKK2NvbXg1MDAgY29tcGFyZSAgICAxICAgICAxRS0xNSAgICAtPiAxCitjb214NTAxIGNvbXBhcmUgICAgMSAgICAgMUUtMTQgICAgLT4gMQorY29teDUwMiBjb21wYXJlICAgIDEgICAgIDFFLTEzICAgIC0+IDEKK2NvbXg1MDMgY29tcGFyZSAgICAxICAgICAxRS0xMiAgICAtPiAxCitjb214NTA0IGNvbXBhcmUgICAgMSAgICAgMUUtMTEgICAgLT4gMQorY29teDUwNSBjb21wYXJlICAgIDEgICAgIDFFLTEwICAgIC0+IDEKK2NvbXg1MDYgY29tcGFyZSAgICAxICAgICAxRS05ICAgICAtPiAxCitjb214NTA3IGNvbXBhcmUgICAgMSAgICAgMUUtOCAgICAgLT4gMQorY29teDUwOCBjb21wYXJlICAgIDEgICAgIDFFLTcgICAgIC0+IDEKK2NvbXg1MDkgY29tcGFyZSAgICAxICAgICAxRS02ICAgICAtPiAxCitjb214NTEwIGNvbXBhcmUgICAgMSAgICAgMUUtNSAgICAgLT4gMQorY29teDUxMSBjb21wYXJlICAgIDEgICAgIDFFLTQgICAgIC0+IDEKK2NvbXg1MTIgY29tcGFyZSAgICAxICAgICAxRS0zICAgICAtPiAxCitjb214NTEzIGNvbXBhcmUgICAgMSAgICAgMUUtMiAgICAgLT4gMQorY29teDUxNCBjb21wYXJlICAgIDEgICAgIDFFLTEgICAgIC0+IDEKK2NvbXg1MTUgY29tcGFyZSAgICAxICAgICAxRS0wICAgICAtPiAwCitjb214NTE2IGNvbXBhcmUgICAgMSAgICAgMUUrMSAgICAgLT4gLTEKK2NvbXg1MTcgY29tcGFyZSAgICAxICAgICAxRSsyICAgICAtPiAtMQorY29teDUxOCBjb21wYXJlICAgIDEgICAgIDFFKzMgICAgIC0+IC0xCitjb214NTE5IGNvbXBhcmUgICAgMSAgICAgMUUrNCAgICAgLT4gLTEKK2NvbXg1MjEgY29tcGFyZSAgICAxICAgICAxRSs1ICAgICAtPiAtMQorY29teDUyMiBjb21wYXJlICAgIDEgICAgIDFFKzYgICAgIC0+IC0xCitjb214NTIzIGNvbXBhcmUgICAgMSAgICAgMUUrNyAgICAgLT4gLTEKK2NvbXg1MjQgY29tcGFyZSAgICAxICAgICAxRSs4ICAgICAtPiAtMQorY29teDUyNSBjb21wYXJlICAgIDEgICAgIDFFKzkgICAgIC0+IC0xCitjb214NTI2IGNvbXBhcmUgICAgMSAgICAgMUUrMTAgICAgLT4gLTEKK2NvbXg1MjcgY29tcGFyZSAgICAxICAgICAxRSsxMSAgICAtPiAtMQorY29teDUyOCBjb21wYXJlICAgIDEgICAgIDFFKzEyICAgIC0+IC0xCitjb214NTI5IGNvbXBhcmUgICAgMSAgICAgMUUrMTMgICAgLT4gLTEKK2NvbXg1MzAgY29tcGFyZSAgICAxICAgICAxRSsxNCAgICAtPiAtMQorY29teDUzMSBjb21wYXJlICAgIDEgICAgIDFFKzE1ICAgIC0+IC0xCistLSBMUiBzd2FwCitjb214NTQwIGNvbXBhcmUgICAgMUUtMTUgIDEgICAgICAgLT4gLTEKK2NvbXg1NDEgY29tcGFyZSAgICAxRS0xNCAgMSAgICAgICAtPiAtMQorY29teDU0MiBjb21wYXJlICAgIDFFLTEzICAxICAgICAgIC0+IC0xCitjb214NTQzIGNvbXBhcmUgICAgMUUtMTIgIDEgICAgICAgLT4gLTEKK2NvbXg1NDQgY29tcGFyZSAgICAxRS0xMSAgMSAgICAgICAtPiAtMQorY29teDU0NSBjb21wYXJlICAgIDFFLTEwICAxICAgICAgIC0+IC0xCitjb214NTQ2IGNvbXBhcmUgICAgMUUtOSAgIDEgICAgICAgLT4gLTEKK2NvbXg1NDcgY29tcGFyZSAgICAxRS04ICAgMSAgICAgICAtPiAtMQorY29teDU0OCBjb21wYXJlICAgIDFFLTcgICAxICAgICAgIC0+IC0xCitjb214NTQ5IGNvbXBhcmUgICAgMUUtNiAgIDEgICAgICAgLT4gLTEKK2NvbXg1NTAgY29tcGFyZSAgICAxRS01ICAgMSAgICAgICAtPiAtMQorY29teDU1MSBjb21wYXJlICAgIDFFLTQgICAxICAgICAgIC0+IC0xCitjb214NTUyIGNvbXBhcmUgICAgMUUtMyAgIDEgICAgICAgLT4gLTEKK2NvbXg1NTMgY29tcGFyZSAgICAxRS0yICAgMSAgICAgICAtPiAtMQorY29teDU1NCBjb21wYXJlICAgIDFFLTEgICAxICAgICAgIC0+IC0xCitjb214NTU1IGNvbXBhcmUgICAgMUUtMCAgIDEgICAgICAgLT4gIDAKK2NvbXg1NTYgY29tcGFyZSAgICAxRSsxICAgMSAgICAgICAtPiAgMQorY29teDU1NyBjb21wYXJlICAgIDFFKzIgICAxICAgICAgIC0+ICAxCitjb214NTU4IGNvbXBhcmUgICAgMUUrMyAgIDEgICAgICAgLT4gIDEKK2NvbXg1NTkgY29tcGFyZSAgICAxRSs0ICAgMSAgICAgICAtPiAgMQorY29teDU2MSBjb21wYXJlICAgIDFFKzUgICAxICAgICAgIC0+ICAxCitjb214NTYyIGNvbXBhcmUgICAgMUUrNiAgIDEgICAgICAgLT4gIDEKK2NvbXg1NjMgY29tcGFyZSAgICAxRSs3ICAgMSAgICAgICAtPiAgMQorY29teDU2NCBjb21wYXJlICAgIDFFKzggICAxICAgICAgIC0+ICAxCitjb214NTY1IGNvbXBhcmUgICAgMUUrOSAgIDEgICAgICAgLT4gIDEKK2NvbXg1NjYgY29tcGFyZSAgICAxRSsxMCAgMSAgICAgICAtPiAgMQorY29teDU2NyBjb21wYXJlICAgIDFFKzExICAxICAgICAgIC0+ICAxCitjb214NTY4IGNvbXBhcmUgICAgMUUrMTIgIDEgICAgICAgLT4gIDEKK2NvbXg1NjkgY29tcGFyZSAgICAxRSsxMyAgMSAgICAgICAtPiAgMQorY29teDU3MCBjb21wYXJlICAgIDFFKzE0ICAxICAgICAgIC0+ICAxCitjb214NTcxIGNvbXBhcmUgICAgMUUrMTUgIDEgICAgICAgLT4gIDEKKy0tIHNpbWlsYXIgd2l0aCBhIHVzZWZ1bCBjb2VmZmljaWVudCwgb25lIHNpZGUgb25seQorY29teDU4MCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTUgICAgLT4gMQorY29teDU4MSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTQgICAgLT4gMQorY29teDU4MiBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTMgICAgLT4gMQorY29teDU4MyBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTIgICAgLT4gMQorY29teDU4NCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTEgICAgLT4gMQorY29teDU4NSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTAgICAgLT4gMQorY29teDU4NiBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOSAgICAgLT4gMQorY29teDU4NyBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOCAgICAgLT4gMQorY29teDU4OCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNyAgICAgLT4gMQorY29teDU4OSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNiAgICAgLT4gLTEKK2NvbXg1OTAgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTUgICAgIC0+IC0xCitjb214NTkxIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS00ICAgICAtPiAtMQorY29teDU5MiBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMyAgICAgLT4gLTEKK2NvbXg1OTMgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTIgICAgIC0+IC0xCitjb214NTk0IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xICAgICAtPiAtMQorY29teDU5NSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMCAgICAgLT4gLTEKK2NvbXg1OTYgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzEgICAgIC0+IC0xCitjb214NTk3IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsyICAgICAtPiAtMQorY29teDU5OCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMyAgICAgLT4gLTEKK2NvbXg1OTkgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzQgICAgIC0+IC0xCisKKy0tIGNoZWNrIHNvbWUgdW5pdC15IHRyYXBzCitwcmVjaXNpb246IDIwCitjb214NjAwIGNvbXBhcmUgICAxMiAgICAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2NvbXg2MDEgY29tcGFyZSAgIDEyLjAgICAgICAgICAgMTIuMjM0NSAtPiAtMQorY29teDYwMiBjb21wYXJlICAgMTIuMDAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitjb214NjAzIGNvbXBhcmUgICAxMi4wMDAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2NvbXg2MDQgY29tcGFyZSAgIDEyLjAwMDAgICAgICAgMTIuMjM0NSAtPiAtMQorY29teDYwNSBjb21wYXJlICAgMTIuMDAwMDAgICAgICAxMi4yMzQ1IC0+IC0xCitjb214NjA2IGNvbXBhcmUgICAxMi4wMDAwMDAgICAgIDEyLjIzNDUgLT4gLTEKK2NvbXg2MDcgY29tcGFyZSAgIDEyLjAwMDAwMDAgICAgMTIuMjM0NSAtPiAtMQorY29teDYwOCBjb21wYXJlICAgMTIuMDAwMDAwMDAgICAxMi4yMzQ1IC0+IC0xCitjb214NjA5IGNvbXBhcmUgICAxMi4wMDAwMDAwMDAgIDEyLjIzNDUgLT4gLTEKK2NvbXg2MTAgY29tcGFyZSAgIDEyLjEyMzQgMTIgICAgICAgICAgICAtPiAgMQorY29teDYxMSBjb21wYXJlICAgMTIuMTIzNCAxMi4wICAgICAgICAgIC0+ICAxCitjb214NjEyIGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwICAgICAgICAgLT4gIDEKK2NvbXg2MTMgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwICAgICAgICAtPiAgMQorY29teDYxNCBjb21wYXJlICAgMTIuMTIzNCAxMi4wMDAwICAgICAgIC0+ICAxCitjb214NjE1IGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwMDAwICAgICAgLT4gIDEKK2NvbXg2MTYgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAwICAgICAtPiAgMQorY29teDYxNyBjb21wYXJlICAgMTIuMTIzNCAxMi4wMDAwMDAwICAgIC0+ICAxCitjb214NjE4IGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwMDAwMDAwICAgLT4gIDEKK2NvbXg2MTkgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAwMDAwICAtPiAgMQorY29teDYyMCBjb21wYXJlICAtMTIgICAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitjb214NjIxIGNvbXBhcmUgIC0xMi4wICAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2NvbXg2MjIgY29tcGFyZSAgLTEyLjAwICAgICAgICAtMTIuMjM0NSAtPiAgMQorY29teDYyMyBjb21wYXJlICAtMTIuMDAwICAgICAgIC0xMi4yMzQ1IC0+ICAxCitjb214NjI0IGNvbXBhcmUgIC0xMi4wMDAwICAgICAgLTEyLjIzNDUgLT4gIDEKK2NvbXg2MjUgY29tcGFyZSAgLTEyLjAwMDAwICAgICAtMTIuMjM0NSAtPiAgMQorY29teDYyNiBjb21wYXJlICAtMTIuMDAwMDAwICAgIC0xMi4yMzQ1IC0+ICAxCitjb214NjI3IGNvbXBhcmUgIC0xMi4wMDAwMDAwICAgLTEyLjIzNDUgLT4gIDEKK2NvbXg2MjggY29tcGFyZSAgLTEyLjAwMDAwMDAwICAtMTIuMjM0NSAtPiAgMQorY29teDYyOSBjb21wYXJlICAtMTIuMDAwMDAwMDAwIC0xMi4yMzQ1IC0+ICAxCitjb214NjMwIGNvbXBhcmUgIC0xMi4xMjM0IC0xMiAgICAgICAgICAgLT4gLTEKK2NvbXg2MzEgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAgICAgICAgICAtPiAtMQorY29teDYzMiBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAgICAgICAgIC0+IC0xCitjb214NjMzIGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMDAgICAgICAgLT4gLTEKK2NvbXg2MzQgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAgICAgICAtPiAtMQorY29teDYzNSBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAwMDAgICAgIC0+IC0xCitjb214NjM2IGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMDAwMDAgICAgLT4gLTEKK2NvbXg2MzcgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwMDAgICAtPiAtMQorY29teDYzOCBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAgIC0+IC0xCitjb214NjM5IGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMDAgLT4gLTEKK3ByZWNpc2lvbjogOQorCistLSBleHRlbmRlZCB6ZXJvcworY29teDY0MCBjb21wYXJlICAgMCAgICAgMCAgIC0+IDAKK2NvbXg2NDEgY29tcGFyZSAgIDAgICAgLTAgICAtPiAwCitjb214NjQyIGNvbXBhcmUgICAwICAgIC0wLjAgLT4gMAorY29teDY0MyBjb21wYXJlICAgMCAgICAgMC4wIC0+IDAKK2NvbXg2NDQgY29tcGFyZSAgLTAgICAgIDAgICAtPiAwCitjb214NjQ1IGNvbXBhcmUgIC0wICAgIC0wICAgLT4gMAorY29teDY0NiBjb21wYXJlICAtMCAgICAtMC4wIC0+IDAKK2NvbXg2NDcgY29tcGFyZSAgLTAgICAgIDAuMCAtPiAwCitjb214NjQ4IGNvbXBhcmUgICAwLjAgICAwICAgLT4gMAorY29teDY0OSBjb21wYXJlICAgMC4wICAtMCAgIC0+IDAKK2NvbXg2NTAgY29tcGFyZSAgIDAuMCAgLTAuMCAtPiAwCitjb214NjUxIGNvbXBhcmUgICAwLjAgICAwLjAgLT4gMAorY29teDY1MiBjb21wYXJlICAtMC4wICAgMCAgIC0+IDAKK2NvbXg2NTMgY29tcGFyZSAgLTAuMCAgLTAgICAtPiAwCitjb214NjU0IGNvbXBhcmUgIC0wLjAgIC0wLjAgLT4gMAorY29teDY1NSBjb21wYXJlICAtMC4wICAgMC4wIC0+IDAKKworY29teDY1NiBjb21wYXJlICAtMEUxICAgMC4wIC0+IDAKK2NvbXg2NTcgY29tcGFyZSAgLTBFMiAgIDAuMCAtPiAwCitjb214NjU4IGNvbXBhcmUgICAwRTEgICAwLjAgLT4gMAorY29teDY1OSBjb21wYXJlICAgMEUyICAgMC4wIC0+IDAKK2NvbXg2NjAgY29tcGFyZSAgLTBFMSAgIDAgICAtPiAwCitjb214NjYxIGNvbXBhcmUgIC0wRTIgICAwICAgLT4gMAorY29teDY2MiBjb21wYXJlICAgMEUxICAgMCAgIC0+IDAKK2NvbXg2NjMgY29tcGFyZSAgIDBFMiAgIDAgICAtPiAwCitjb214NjY0IGNvbXBhcmUgIC0wRTEgIC0wRTEgLT4gMAorY29teDY2NSBjb21wYXJlICAtMEUyICAtMEUxIC0+IDAKK2NvbXg2NjYgY29tcGFyZSAgIDBFMSAgLTBFMSAtPiAwCitjb214NjY3IGNvbXBhcmUgICAwRTIgIC0wRTEgLT4gMAorY29teDY2OCBjb21wYXJlICAtMEUxICAtMEUyIC0+IDAKK2NvbXg2NjkgY29tcGFyZSAgLTBFMiAgLTBFMiAtPiAwCitjb214NjcwIGNvbXBhcmUgICAwRTEgIC0wRTIgLT4gMAorY29teDY3MSBjb21wYXJlICAgMEUyICAtMEUyIC0+IDAKK2NvbXg2NzIgY29tcGFyZSAgLTBFMSAgIDBFMSAtPiAwCitjb214NjczIGNvbXBhcmUgIC0wRTIgICAwRTEgLT4gMAorY29teDY3NCBjb21wYXJlICAgMEUxICAgMEUxIC0+IDAKK2NvbXg2NzUgY29tcGFyZSAgIDBFMiAgIDBFMSAtPiAwCitjb214Njc2IGNvbXBhcmUgIC0wRTEgICAwRTIgLT4gMAorY29teDY3NyBjb21wYXJlICAtMEUyICAgMEUyIC0+IDAKK2NvbXg2NzggY29tcGFyZSAgIDBFMSAgIDBFMiAtPiAwCitjb214Njc5IGNvbXBhcmUgICAwRTIgICAwRTIgLT4gMAorCistLSB0cmFpbGluZyB6ZXJvczsgdW5pdC15CitwcmVjaXNpb246IDIwCitjb214NjgwIGNvbXBhcmUgICAxMiAgICAxMiAgICAgICAgICAgLT4gMAorY29teDY4MSBjb21wYXJlICAgMTIgICAgMTIuMCAgICAgICAgIC0+IDAKK2NvbXg2ODIgY29tcGFyZSAgIDEyICAgIDEyLjAwICAgICAgICAtPiAwCitjb214NjgzIGNvbXBhcmUgICAxMiAgICAxMi4wMDAgICAgICAgLT4gMAorY29teDY4NCBjb21wYXJlICAgMTIgICAgMTIuMDAwMCAgICAgIC0+IDAKK2NvbXg2ODUgY29tcGFyZSAgIDEyICAgIDEyLjAwMDAwICAgICAtPiAwCitjb214Njg2IGNvbXBhcmUgICAxMiAgICAxMi4wMDAwMDAgICAgLT4gMAorY29teDY4NyBjb21wYXJlICAgMTIgICAgMTIuMDAwMDAwMCAgIC0+IDAKK2NvbXg2ODggY29tcGFyZSAgIDEyICAgIDEyLjAwMDAwMDAwICAtPiAwCitjb214Njg5IGNvbXBhcmUgICAxMiAgICAxMi4wMDAwMDAwMDAgLT4gMAorY29teDY5MCBjb21wYXJlICAgMTIgICAgICAgICAgICAgIDEyIC0+IDAKK2NvbXg2OTEgY29tcGFyZSAgIDEyLjAgICAgICAgICAgICAxMiAtPiAwCitjb214NjkyIGNvbXBhcmUgICAxMi4wMCAgICAgICAgICAgMTIgLT4gMAorY29teDY5MyBjb21wYXJlICAgMTIuMDAwICAgICAgICAgIDEyIC0+IDAKK2NvbXg2OTQgY29tcGFyZSAgIDEyLjAwMDAgICAgICAgICAxMiAtPiAwCitjb214Njk1IGNvbXBhcmUgICAxMi4wMDAwMCAgICAgICAgMTIgLT4gMAorY29teDY5NiBjb21wYXJlICAgMTIuMDAwMDAwICAgICAgIDEyIC0+IDAKK2NvbXg2OTcgY29tcGFyZSAgIDEyLjAwMDAwMDAgICAgICAxMiAtPiAwCitjb214Njk4IGNvbXBhcmUgICAxMi4wMDAwMDAwMCAgICAgMTIgLT4gMAorY29teDY5OSBjb21wYXJlICAgMTIuMDAwMDAwMDAwICAgIDEyIC0+IDAKKworLS0gbG9uZyBvcGVyYW5kIGNoZWNrcworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogOQorY29teDcwMSBjb21wYXJlIDEyMzQ1Njc4MDAwICAxIC0+ICAxCitjb214NzAyIGNvbXBhcmUgMSAxMjM0NTY3ODAwMCAgLT4gLTEKK2NvbXg3MDMgY29tcGFyZSAxMjM0NTY3ODAwICAgMSAtPiAgMQorY29teDcwNCBjb21wYXJlIDEgMTIzNDU2NzgwMCAgIC0+IC0xCitjb214NzA1IGNvbXBhcmUgMTIzNDU2Nzg5MCAgIDEgLT4gIDEKK2NvbXg3MDYgY29tcGFyZSAxIDEyMzQ1Njc4OTAgICAtPiAtMQorY29teDcwNyBjb21wYXJlIDEyMzQ1Njc4OTEgICAxIC0+ICAxCitjb214NzA4IGNvbXBhcmUgMSAxMjM0NTY3ODkxICAgLT4gLTEKK2NvbXg3MDkgY29tcGFyZSAxMjM0NTY3ODkwMSAgMSAtPiAgMQorY29teDcxMCBjb21wYXJlIDEgMTIzNDU2Nzg5MDEgIC0+IC0xCitjb214NzExIGNvbXBhcmUgMTIzNDU2Nzg5NiAgIDEgLT4gIDEKK2NvbXg3MTIgY29tcGFyZSAxIDEyMzQ1Njc4OTYgICAtPiAtMQorY29teDcxMyBjb21wYXJlIC0xMjM0NTY3ODkxICAxIC0+IC0xCitjb214NzE0IGNvbXBhcmUgMSAtMTIzNDU2Nzg5MSAgLT4gIDEKK2NvbXg3MTUgY29tcGFyZSAtMTIzNDU2Nzg5MDEgMSAtPiAtMQorY29teDcxNiBjb21wYXJlIDEgLTEyMzQ1Njc4OTAxIC0+ICAxCitjb214NzE3IGNvbXBhcmUgLTEyMzQ1Njc4OTYgIDEgLT4gLTEKK2NvbXg3MTggY29tcGFyZSAxIC0xMjM0NTY3ODk2ICAtPiAgMQorCitwcmVjaXNpb246IDE1CistLSBzYW1lIHdpdGggcGxlbnR5IG9mIHByZWNpc2lvbgorY29teDcyMSBjb21wYXJlIDEyMzQ1Njc4MDAwIDEgLT4gMQorY29teDcyMiBjb21wYXJlIDEgMTIzNDU2NzgwMDAgLT4gLTEKK2NvbXg3MjMgY29tcGFyZSAxMjM0NTY3ODAwICAxIC0+IDEKK2NvbXg3MjQgY29tcGFyZSAxIDEyMzQ1Njc4MDAgIC0+IC0xCitjb214NzI1IGNvbXBhcmUgMTIzNDU2Nzg5MCAgMSAtPiAxCitjb214NzI2IGNvbXBhcmUgMSAxMjM0NTY3ODkwICAtPiAtMQorY29teDcyNyBjb21wYXJlIDEyMzQ1Njc4OTEgIDEgLT4gMQorY29teDcyOCBjb21wYXJlIDEgMTIzNDU2Nzg5MSAgLT4gLTEKK2NvbXg3MjkgY29tcGFyZSAxMjM0NTY3ODkwMSAxIC0+IDEKK2NvbXg3MzAgY29tcGFyZSAxIDEyMzQ1Njc4OTAxIC0+IC0xCitjb214NzMxIGNvbXBhcmUgMTIzNDU2Nzg5NiAgMSAtPiAxCitjb214NzMyIGNvbXBhcmUgMSAxMjM0NTY3ODk2ICAtPiAtMQorCistLSByZXNpZHVlIGNhc2VzCitwcmVjaXNpb246IDUKK2NvbXg3NDAgY29tcGFyZSAgMSAgMC45OTk5OTk5ICAtPiAxCitjb214NzQxIGNvbXBhcmUgIDEgIDAuOTk5OTk5ICAgLT4gMQorY29teDc0MiBjb21wYXJlICAxICAwLjk5OTk5ICAgIC0+IDEKK2NvbXg3NDMgY29tcGFyZSAgMSAgMS4wMDAwICAgICAtPiAwCitjb214NzQ0IGNvbXBhcmUgIDEgIDEuMDAwMDEgICAgLT4gLTEKK2NvbXg3NDUgY29tcGFyZSAgMSAgMS4wMDAwMDEgICAtPiAtMQorY29teDc0NiBjb21wYXJlICAxICAxLjAwMDAwMDEgIC0+IC0xCitjb214NzUwIGNvbXBhcmUgIDAuOTk5OTk5OSAgMSAgLT4gLTEKK2NvbXg3NTEgY29tcGFyZSAgMC45OTk5OTkgICAxICAtPiAtMQorY29teDc1MiBjb21wYXJlICAwLjk5OTk5ICAgIDEgIC0+IC0xCitjb214NzUzIGNvbXBhcmUgIDEuMDAwMCAgICAgMSAgLT4gMAorY29teDc1NCBjb21wYXJlICAxLjAwMDAxICAgIDEgIC0+IDEKK2NvbXg3NTUgY29tcGFyZSAgMS4wMDAwMDEgICAxICAtPiAxCitjb214NzU2IGNvbXBhcmUgIDEuMDAwMDAwMSAgMSAgLT4gMQorCistLSBhIHNlbGVjdGlvbiBvZiBsb25naWVzCitjb214NzYwIGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC01ODMwNjI5LjgzNDcwODUwMjU4MDg3NTY1NjAzNTc5NDAgLT4gLTEKK2NvbXg3NjEgY29tcGFyZSAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAtPiAwCitjb214NzYyIGNvbXBhcmUgLTM2ODUyMTM0Ljk0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gLTEKK2NvbXg3NjMgY29tcGFyZSAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljk0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAtPiAxCistLSBwcmVjaXNpb25zIGFib3ZlIG9yIGJlbG93IHRoZSBkaWZmZXJlbmNlIHNob3VsZCBoYXZlIG5vIGVmZmVjdAorcHJlY2lzaW9uOiAgIDExCitjb214NzY0IGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgIDEwCitjb214NzY1IGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICA5Citjb214NzY2IGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICA4Citjb214NzY3IGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICA3Citjb214NzY4IGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICA2Citjb214NzY5IGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICA1Citjb214NzcwIGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICA0Citjb214NzcxIGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICAzCitjb214NzcyIGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICAyCitjb214NzczIGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICAxCitjb214Nzc0IGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorCistLSBTcGVjaWFscworcHJlY2lzaW9uOiAgIDkKK2NvbXg3ODAgY29tcGFyZSAgSW5mICAtSW5mICAgLT4gIDEKK2NvbXg3ODEgY29tcGFyZSAgSW5mICAtMTAwMCAgLT4gIDEKK2NvbXg3ODIgY29tcGFyZSAgSW5mICAtMSAgICAgLT4gIDEKK2NvbXg3ODMgY29tcGFyZSAgSW5mICAtMCAgICAgLT4gIDEKK2NvbXg3ODQgY29tcGFyZSAgSW5mICAgMCAgICAgLT4gIDEKK2NvbXg3ODUgY29tcGFyZSAgSW5mICAgMSAgICAgLT4gIDEKK2NvbXg3ODYgY29tcGFyZSAgSW5mICAgMTAwMCAgLT4gIDEKK2NvbXg3ODcgY29tcGFyZSAgSW5mICAgSW5mICAgLT4gIDAKK2NvbXg3ODggY29tcGFyZSAtMTAwMCAgSW5mICAgLT4gLTEKK2NvbXg3ODkgY29tcGFyZSAtSW5mICAgSW5mICAgLT4gLTEKK2NvbXg3OTAgY29tcGFyZSAtMSAgICAgSW5mICAgLT4gLTEKK2NvbXg3OTEgY29tcGFyZSAtMCAgICAgSW5mICAgLT4gLTEKK2NvbXg3OTIgY29tcGFyZSAgMCAgICAgSW5mICAgLT4gLTEKK2NvbXg3OTMgY29tcGFyZSAgMSAgICAgSW5mICAgLT4gLTEKK2NvbXg3OTQgY29tcGFyZSAgMTAwMCAgSW5mICAgLT4gLTEKK2NvbXg3OTUgY29tcGFyZSAgSW5mICAgSW5mICAgLT4gIDAKKworY29teDgwMCBjb21wYXJlIC1JbmYgIC1JbmYgICAtPiAgMAorY29teDgwMSBjb21wYXJlIC1JbmYgIC0xMDAwICAtPiAtMQorY29teDgwMiBjb21wYXJlIC1JbmYgIC0xICAgICAtPiAtMQorY29teDgwMyBjb21wYXJlIC1JbmYgIC0wICAgICAtPiAtMQorY29teDgwNCBjb21wYXJlIC1JbmYgICAwICAgICAtPiAtMQorY29teDgwNSBjb21wYXJlIC1JbmYgICAxICAgICAtPiAtMQorY29teDgwNiBjb21wYXJlIC1JbmYgICAxMDAwICAtPiAtMQorY29teDgwNyBjb21wYXJlIC1JbmYgICBJbmYgICAtPiAtMQorY29teDgwOCBjb21wYXJlIC1JbmYgIC1JbmYgICAtPiAgMAorY29teDgwOSBjb21wYXJlIC0xMDAwIC1JbmYgICAtPiAgMQorY29teDgxMCBjb21wYXJlIC0xICAgIC1JbmYgICAtPiAgMQorY29teDgxMSBjb21wYXJlIC0wICAgIC1JbmYgICAtPiAgMQorY29teDgxMiBjb21wYXJlICAwICAgIC1JbmYgICAtPiAgMQorY29teDgxMyBjb21wYXJlICAxICAgIC1JbmYgICAtPiAgMQorY29teDgxNCBjb21wYXJlICAxMDAwIC1JbmYgICAtPiAgMQorY29teDgxNSBjb21wYXJlICBJbmYgIC1JbmYgICAtPiAgMQorCitjb214ODIxIGNvbXBhcmUgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2NvbXg4MjIgY29tcGFyZSAgTmFOIC0xMDAwICAgLT4gIE5hTgorY29teDgyMyBjb21wYXJlICBOYU4gLTEgICAgICAtPiAgTmFOCitjb214ODI0IGNvbXBhcmUgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2NvbXg4MjUgY29tcGFyZSAgTmFOICAwICAgICAgLT4gIE5hTgorY29teDgyNiBjb21wYXJlICBOYU4gIDEgICAgICAtPiAgTmFOCitjb214ODI3IGNvbXBhcmUgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2NvbXg4MjggY29tcGFyZSAgTmFOICBJbmYgICAgLT4gIE5hTgorY29teDgyOSBjb21wYXJlICBOYU4gIE5hTiAgICAtPiAgTmFOCitjb214ODMwIGNvbXBhcmUgLUluZiAgTmFOICAgIC0+ICBOYU4KK2NvbXg4MzEgY29tcGFyZSAtMTAwMCBOYU4gICAgLT4gIE5hTgorY29teDgzMiBjb21wYXJlIC0xICAgIE5hTiAgICAtPiAgTmFOCitjb214ODMzIGNvbXBhcmUgLTAgICAgTmFOICAgIC0+ICBOYU4KK2NvbXg4MzQgY29tcGFyZSAgMCAgICBOYU4gICAgLT4gIE5hTgorY29teDgzNSBjb21wYXJlICAxICAgIE5hTiAgICAtPiAgTmFOCitjb214ODM2IGNvbXBhcmUgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2NvbXg4MzcgY29tcGFyZSAgSW5mICBOYU4gICAgLT4gIE5hTgorY29teDgzOCBjb21wYXJlIC1OYU4gLU5hTiAgICAtPiAtTmFOCitjb214ODM5IGNvbXBhcmUgK05hTiAtTmFOICAgIC0+ICBOYU4KK2NvbXg4NDAgY29tcGFyZSAtTmFOICtOYU4gICAgLT4gLU5hTgorCitjb214ODQxIGNvbXBhcmUgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODQyIGNvbXBhcmUgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODQzIGNvbXBhcmUgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODQ0IGNvbXBhcmUgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODQ1IGNvbXBhcmUgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODQ2IGNvbXBhcmUgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODQ3IGNvbXBhcmUgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODQ4IGNvbXBhcmUgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODQ5IGNvbXBhcmUgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODUwIGNvbXBhcmUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODUxIGNvbXBhcmUgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODUyIGNvbXBhcmUgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODUzIGNvbXBhcmUgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODU0IGNvbXBhcmUgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODU1IGNvbXBhcmUgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODU2IGNvbXBhcmUgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODU3IGNvbXBhcmUgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODU4IGNvbXBhcmUgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitjb214ODU5IGNvbXBhcmUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2NvbXg4NjAgY29tcGFyZSAgTmFOOSAtSW5mICAgLT4gIE5hTjkKK2NvbXg4NjEgY29tcGFyZSAgTmFOOCAgOTk5ICAgLT4gIE5hTjgKK2NvbXg4NjIgY29tcGFyZSAgTmFONzcgSW5mICAgLT4gIE5hTjc3Citjb214ODYzIGNvbXBhcmUgLU5hTjY3IE5hTjUgIC0+IC1OYU42NworY29teDg2NCBjb21wYXJlIC1JbmYgIC1OYU40ICAtPiAtTmFONAorY29teDg2NSBjb21wYXJlIC05OTkgIC1OYU4zMyAtPiAtTmFOMzMKK2NvbXg4NjYgY29tcGFyZSAgSW5mICAgTmFOMiAgLT4gIE5hTjIKK2NvbXg4NjcgY29tcGFyZSAtTmFONDEgLU5hTjQyIC0+IC1OYU40MQorY29teDg2OCBjb21wYXJlICtOYU40MSAtTmFONDIgLT4gIE5hTjQxCitjb214ODY5IGNvbXBhcmUgLU5hTjQxICtOYU40MiAtPiAtTmFONDEKK2NvbXg4NzAgY29tcGFyZSArTmFONDEgK05hTjQyIC0+ICBOYU40MQorCitjb214ODcxIGNvbXBhcmUgLXNOYU45OSAtSW5mICAgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorY29teDg3MiBjb21wYXJlICBzTmFOOTggLTExICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2NvbXg4NzMgY29tcGFyZSAgc05hTjk3ICBOYU4gICAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitjb214ODc0IGNvbXBhcmUgIHNOYU4xNiBzTmFOOTQgIC0+ICBOYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorY29teDg3NSBjb21wYXJlICBOYU44NSAgc05hTjgzICAtPiAgTmFOODMgSW52YWxpZF9vcGVyYXRpb24KK2NvbXg4NzYgY29tcGFyZSAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitjb214ODc3IGNvbXBhcmUgIDA4OCAgICBzTmFOODEgIC0+ICBOYU44MSBJbnZhbGlkX29wZXJhdGlvbgorY29teDg3OCBjb21wYXJlICBJbmYgICAgc05hTjkwICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2NvbXg4NzkgY29tcGFyZSAgTmFOICAgLXNOYU44OSAgLT4gLU5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgLi4gc3Vibm9ybWFsIHJlc3VsdHMgbm93IGFsbG93ZWQKK21heEV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5Citjb214ODgwIGNvbXBhcmUgKzEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5IC0+IC0xCitjb214ODgxIGNvbXBhcmUgOUUrOTk5OTk5OTk5ICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+ICAxCitjb214ODgyIGNvbXBhcmUgKzAuMTAwIDlFLTk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+ICAxCitjb214ODgzIGNvbXBhcmUgOUUtOTk5OTk5OTk5ICswLjEwMCAgICAgICAgICAgICAgIC0+IC0xCitjb214ODg1IGNvbXBhcmUgLTEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5IC0+IC0xCitjb214ODg2IGNvbXBhcmUgOUUrOTk5OTk5OTk5IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+ICAxCitjb214ODg3IGNvbXBhcmUgLTAuMTAwIDlFLTk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+IC0xCitjb214ODg4IGNvbXBhcmUgOUUtOTk5OTk5OTk5IC0wLjEwMCAgICAgICAgICAgICAgIC0+ICAxCisKK2NvbXg4ODkgY29tcGFyZSAxZS01OTk5OTk5OTkgMWUtNDAwMDAwMDAxICAgLT4gLTEKK2NvbXg4OTAgY29tcGFyZSAxZS01OTk5OTk5OTkgMWUtNDAwMDAwMDAwICAgLT4gLTEKK2NvbXg4OTEgY29tcGFyZSAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDAwICAgLT4gLTEKK2NvbXg4OTIgY29tcGFyZSA5ZS05OTk5OTk5OTggMC4wMSAgICAgICAgICAgLT4gLTEKK2NvbXg4OTMgY29tcGFyZSA5ZS05OTk5OTk5OTggMC4xICAgICAgICAgICAgLT4gLTEKK2NvbXg4OTQgY29tcGFyZSAwLjAxIDllLTk5OTk5OTk5OCAgICAgICAgICAgLT4gIDEKK2NvbXg4OTUgY29tcGFyZSAxZTU5OTk5OTk5OSAxZTQwMDAwMDAwMSAgICAgLT4gIDEKK2NvbXg4OTYgY29tcGFyZSAxZTU5OTk5OTk5OSAxZTQwMDAwMDAwMCAgICAgLT4gIDEKK2NvbXg4OTcgY29tcGFyZSAxZTYwMDAwMDAwMCAxZTQwMDAwMDAwMCAgICAgLT4gIDEKK2NvbXg4OTggY29tcGFyZSA5ZTk5OTk5OTk5OCAxMDAgICAgICAgICAgICAgLT4gIDEKK2NvbXg4OTkgY29tcGFyZSA5ZTk5OTk5OTk5OCAxMCAgICAgICAgICAgICAgLT4gIDEKK2NvbXg5MDAgY29tcGFyZSAxMDAgIDllOTk5OTk5OTk4ICAgICAgICAgICAgLT4gLTEKKy0tIHNpZ25zCitjb214OTAxIGNvbXBhcmUgIDFlKzc3Nzc3Nzc3NyAgMWUrNDExMTExMTExIC0+ICAxCitjb214OTAyIGNvbXBhcmUgIDFlKzc3Nzc3Nzc3NyAtMWUrNDExMTExMTExIC0+ICAxCitjb214OTAzIGNvbXBhcmUgLTFlKzc3Nzc3Nzc3NyAgMWUrNDExMTExMTExIC0+IC0xCitjb214OTA0IGNvbXBhcmUgLTFlKzc3Nzc3Nzc3NyAtMWUrNDExMTExMTExIC0+IC0xCitjb214OTA1IGNvbXBhcmUgIDFlLTc3Nzc3Nzc3NyAgMWUtNDExMTExMTExIC0+IC0xCitjb214OTA2IGNvbXBhcmUgIDFlLTc3Nzc3Nzc3NyAtMWUtNDExMTExMTExIC0+ICAxCitjb214OTA3IGNvbXBhcmUgLTFlLTc3Nzc3Nzc3NyAgMWUtNDExMTExMTExIC0+IC0xCitjb214OTA4IGNvbXBhcmUgLTFlLTc3Nzc3Nzc3NyAtMWUtNDExMTExMTExIC0+ICAxCisKKy0tIHNwcmVhZCB6ZXJvcworY29teDkxMCBjb21wYXJlICAgMEUtMzgzICAwICAgICAgIC0+ICAwCitjb214OTExIGNvbXBhcmUgICAwRS0zODMgLTAgICAgICAgLT4gIDAKK2NvbXg5MTIgY29tcGFyZSAgLTBFLTM4MyAgMCAgICAgICAtPiAgMAorY29teDkxMyBjb21wYXJlICAtMEUtMzgzIC0wICAgICAgIC0+ICAwCitjb214OTE0IGNvbXBhcmUgICAwRS0zODMgIDBFKzM4NCAgLT4gIDAKK2NvbXg5MTUgY29tcGFyZSAgIDBFLTM4MyAtMEUrMzg0ICAtPiAgMAorY29teDkxNiBjb21wYXJlICAtMEUtMzgzICAwRSszODQgIC0+ICAwCitjb214OTE3IGNvbXBhcmUgIC0wRS0zODMgLTBFKzM4NCAgLT4gIDAKK2NvbXg5MTggY29tcGFyZSAgIDAgICAgICAgMEUrMzg0ICAtPiAgMAorY29teDkxOSBjb21wYXJlICAgMCAgICAgIC0wRSszODQgIC0+ICAwCitjb214OTIwIGNvbXBhcmUgIC0wICAgICAgIDBFKzM4NCAgLT4gIDAKK2NvbXg5MjEgY29tcGFyZSAgLTAgICAgICAtMEUrMzg0ICAtPiAgMAorY29teDkzMCBjb21wYXJlICAgMEUrMzg0ICAwICAgICAgIC0+ICAwCitjb214OTMxIGNvbXBhcmUgICAwRSszODQgLTAgICAgICAgLT4gIDAKK2NvbXg5MzIgY29tcGFyZSAgLTBFKzM4NCAgMCAgICAgICAtPiAgMAorY29teDkzMyBjb21wYXJlICAtMEUrMzg0IC0wICAgICAgIC0+ICAwCitjb214OTM0IGNvbXBhcmUgICAwRSszODQgIDBFLTM4MyAgLT4gIDAKK2NvbXg5MzUgY29tcGFyZSAgIDBFKzM4NCAtMEUtMzgzICAtPiAgMAorY29teDkzNiBjb21wYXJlICAtMEUrMzg0ICAwRS0zODMgIC0+ICAwCitjb214OTM3IGNvbXBhcmUgIC0wRSszODQgLTBFLTM4MyAgLT4gIDAKK2NvbXg5MzggY29tcGFyZSAgIDAgICAgICAgMEUtMzgzICAtPiAgMAorY29teDkzOSBjb21wYXJlICAgMCAgICAgIC0wRS0zODMgIC0+ICAwCitjb214OTQwIGNvbXBhcmUgIC0wICAgICAgIDBFLTM4MyAgLT4gIDAKK2NvbXg5NDEgY29tcGFyZSAgLTAgICAgICAtMEUtMzgzICAtPiAgMAorCistLSBOdWxsIHRlc3RzCitjb214OTkwIGNvbXBhcmUgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitjb214OTkxIGNvbXBhcmUgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvbXBhcmV0b3RhbC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb21wYXJldG90YWwuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTJjNDlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb21wYXJldG90YWwuZGVjVGVzdApAQCAtMCwwICsxLDc5OCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBjb21wYXJldG90YWwuZGVjVGVzdCAtLSBkZWNpbWFsIGNvbXBhcmlzb24gdXNpbmcgdG90YWwgb3JkZXJpbmcgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIE5vdGUgdGhhdCB3ZSBjYW5ub3QgYXNzdW1lIGFkZC9zdWJ0cmFjdCB0ZXN0cyBjb3ZlciBwYXRocyBhZGVxdWF0ZWx5LAorLS0gaGVyZSwgYmVjYXVzZSB0aGUgY29kZSBtaWdodCBiZSBxdWl0ZSBkaWZmZXJlbnQgKGNvbXBhcmlzb24gY2Fubm90CistLSBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHNvIGFjdHVhbCBzdWJ0cmFjdGlvbnMgYXJlIG5vdCBuZWNlc3NhcnkpLgorLS0gU2ltaWxhcmx5LCBjb21wYXJldG90YWwgd2lsbCBoYXZlIHNvbWUgcmFkaWNhbGx5IGRpZmZlcmVudCBwYXRocworLS0gdGhhbiBjb21wYXJlLgorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKKworLS0gc2FuaXR5IGNoZWNrcworY290eDAwMSBjb21wYXJldG90YWwgIC0yICAtMiAgLT4gMAorY290eDAwMiBjb21wYXJldG90YWwgIC0yICAtMSAgLT4gLTEKK2NvdHgwMDMgY29tcGFyZXRvdGFsICAtMiAgIDAgIC0+IC0xCitjb3R4MDA0IGNvbXBhcmV0b3RhbCAgLTIgICAxICAtPiAtMQorY290eDAwNSBjb21wYXJldG90YWwgIC0yICAgMiAgLT4gLTEKK2NvdHgwMDYgY29tcGFyZXRvdGFsICAtMSAgLTIgIC0+IDEKK2NvdHgwMDcgY29tcGFyZXRvdGFsICAtMSAgLTEgIC0+IDAKK2NvdHgwMDggY29tcGFyZXRvdGFsICAtMSAgIDAgIC0+IC0xCitjb3R4MDA5IGNvbXBhcmV0b3RhbCAgLTEgICAxICAtPiAtMQorY290eDAxMCBjb21wYXJldG90YWwgIC0xICAgMiAgLT4gLTEKK2NvdHgwMTEgY29tcGFyZXRvdGFsICAgMCAgLTIgIC0+IDEKK2NvdHgwMTIgY29tcGFyZXRvdGFsICAgMCAgLTEgIC0+IDEKK2NvdHgwMTMgY29tcGFyZXRvdGFsICAgMCAgIDAgIC0+IDAKK2NvdHgwMTQgY29tcGFyZXRvdGFsICAgMCAgIDEgIC0+IC0xCitjb3R4MDE1IGNvbXBhcmV0b3RhbCAgIDAgICAyICAtPiAtMQorY290eDAxNiBjb21wYXJldG90YWwgICAxICAtMiAgLT4gMQorY290eDAxNyBjb21wYXJldG90YWwgICAxICAtMSAgLT4gMQorY290eDAxOCBjb21wYXJldG90YWwgICAxICAgMCAgLT4gMQorY290eDAxOSBjb21wYXJldG90YWwgICAxICAgMSAgLT4gMAorY290eDAyMCBjb21wYXJldG90YWwgICAxICAgMiAgLT4gLTEKK2NvdHgwMjEgY29tcGFyZXRvdGFsICAgMiAgLTIgIC0+IDEKK2NvdHgwMjIgY29tcGFyZXRvdGFsICAgMiAgLTEgIC0+IDEKK2NvdHgwMjMgY29tcGFyZXRvdGFsICAgMiAgIDAgIC0+IDEKK2NvdHgwMjUgY29tcGFyZXRvdGFsICAgMiAgIDEgIC0+IDEKK2NvdHgwMjYgY29tcGFyZXRvdGFsICAgMiAgIDIgIC0+IDAKKworY290eDAzMSBjb21wYXJldG90YWwgIC0yMCAgLTIwICAtPiAwCitjb3R4MDMyIGNvbXBhcmV0b3RhbCAgLTIwICAtMTAgIC0+IC0xCitjb3R4MDMzIGNvbXBhcmV0b3RhbCAgLTIwICAgMDAgIC0+IC0xCitjb3R4MDM0IGNvbXBhcmV0b3RhbCAgLTIwICAgMTAgIC0+IC0xCitjb3R4MDM1IGNvbXBhcmV0b3RhbCAgLTIwICAgMjAgIC0+IC0xCitjb3R4MDM2IGNvbXBhcmV0b3RhbCAgLTEwICAtMjAgIC0+IDEKK2NvdHgwMzcgY29tcGFyZXRvdGFsICAtMTAgIC0xMCAgLT4gMAorY290eDAzOCBjb21wYXJldG90YWwgIC0xMCAgIDAwICAtPiAtMQorY290eDAzOSBjb21wYXJldG90YWwgIC0xMCAgIDEwICAtPiAtMQorY290eDA0MCBjb21wYXJldG90YWwgIC0xMCAgIDIwICAtPiAtMQorY290eDA0MSBjb21wYXJldG90YWwgICAwMCAgLTIwICAtPiAxCitjb3R4MDQyIGNvbXBhcmV0b3RhbCAgIDAwICAtMTAgIC0+IDEKK2NvdHgwNDMgY29tcGFyZXRvdGFsICAgMDAgICAwMCAgLT4gMAorY290eDA0NCBjb21wYXJldG90YWwgICAwMCAgIDEwICAtPiAtMQorY290eDA0NSBjb21wYXJldG90YWwgICAwMCAgIDIwICAtPiAtMQorY290eDA0NiBjb21wYXJldG90YWwgICAxMCAgLTIwICAtPiAxCitjb3R4MDQ3IGNvbXBhcmV0b3RhbCAgIDEwICAtMTAgIC0+IDEKK2NvdHgwNDggY29tcGFyZXRvdGFsICAgMTAgICAwMCAgLT4gMQorY290eDA0OSBjb21wYXJldG90YWwgICAxMCAgIDEwICAtPiAwCitjb3R4MDUwIGNvbXBhcmV0b3RhbCAgIDEwICAgMjAgIC0+IC0xCitjb3R4MDUxIGNvbXBhcmV0b3RhbCAgIDIwICAtMjAgIC0+IDEKK2NvdHgwNTIgY29tcGFyZXRvdGFsICAgMjAgIC0xMCAgLT4gMQorY290eDA1MyBjb21wYXJldG90YWwgICAyMCAgIDAwICAtPiAxCitjb3R4MDU1IGNvbXBhcmV0b3RhbCAgIDIwICAgMTAgIC0+IDEKK2NvdHgwNTYgY29tcGFyZXRvdGFsICAgMjAgICAyMCAgLT4gMAorCitjb3R4MDYxIGNvbXBhcmV0b3RhbCAgLTIuMCAgLTIuMCAgLT4gMAorY290eDA2MiBjb21wYXJldG90YWwgIC0yLjAgIC0xLjAgIC0+IC0xCitjb3R4MDYzIGNvbXBhcmV0b3RhbCAgLTIuMCAgIDAuMCAgLT4gLTEKK2NvdHgwNjQgY29tcGFyZXRvdGFsICAtMi4wICAgMS4wICAtPiAtMQorY290eDA2NSBjb21wYXJldG90YWwgIC0yLjAgICAyLjAgIC0+IC0xCitjb3R4MDY2IGNvbXBhcmV0b3RhbCAgLTEuMCAgLTIuMCAgLT4gMQorY290eDA2NyBjb21wYXJldG90YWwgIC0xLjAgIC0xLjAgIC0+IDAKK2NvdHgwNjggY29tcGFyZXRvdGFsICAtMS4wICAgMC4wICAtPiAtMQorY290eDA2OSBjb21wYXJldG90YWwgIC0xLjAgICAxLjAgIC0+IC0xCitjb3R4MDcwIGNvbXBhcmV0b3RhbCAgLTEuMCAgIDIuMCAgLT4gLTEKK2NvdHgwNzEgY29tcGFyZXRvdGFsICAgMC4wICAtMi4wICAtPiAxCitjb3R4MDcyIGNvbXBhcmV0b3RhbCAgIDAuMCAgLTEuMCAgLT4gMQorY290eDA3MyBjb21wYXJldG90YWwgICAwLjAgICAwLjAgIC0+IDAKK2NvdHgwNzQgY29tcGFyZXRvdGFsICAgMC4wICAgMS4wICAtPiAtMQorY290eDA3NSBjb21wYXJldG90YWwgICAwLjAgICAyLjAgIC0+IC0xCitjb3R4MDc2IGNvbXBhcmV0b3RhbCAgIDEuMCAgLTIuMCAgLT4gMQorY290eDA3NyBjb21wYXJldG90YWwgICAxLjAgIC0xLjAgIC0+IDEKK2NvdHgwNzggY29tcGFyZXRvdGFsICAgMS4wICAgMC4wICAtPiAxCitjb3R4MDc5IGNvbXBhcmV0b3RhbCAgIDEuMCAgIDEuMCAgLT4gMAorY290eDA4MCBjb21wYXJldG90YWwgICAxLjAgICAyLjAgIC0+IC0xCitjb3R4MDgxIGNvbXBhcmV0b3RhbCAgIDIuMCAgLTIuMCAgLT4gMQorY290eDA4MiBjb21wYXJldG90YWwgICAyLjAgIC0xLjAgIC0+IDEKK2NvdHgwODMgY29tcGFyZXRvdGFsICAgMi4wICAgMC4wICAtPiAxCitjb3R4MDg1IGNvbXBhcmV0b3RhbCAgIDIuMCAgIDEuMCAgLT4gMQorY290eDA4NiBjb21wYXJldG90YWwgICAyLjAgICAyLjAgIC0+IDAKKworLS0gbm93IHNvbWUgY2FzZXMgd2hpY2ggbWlnaHQgb3ZlcmZsb3cgaWYgc3VidHJhY3Qgd2VyZSB1c2VkCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorY290eDA5MCBjb21wYXJldG90YWwgIDkuOTk5OTk5OTlFKzk5OTk5OTk5OSA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgIC0+IDAKK2NvdHgwOTEgY29tcGFyZXRvdGFsIC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgOS45OTk5OTk5OUUrOTk5OTk5OTk5ICAtPiAtMQorY290eDA5MiBjb21wYXJldG90YWwgIDkuOTk5OTk5OTlFKzk5OTk5OTk5OSAtOS45OTk5OTk5OUUrOTk5OTk5OTk5IC0+IDEKK2NvdHgwOTMgY29tcGFyZXRvdGFsIC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgLTkuOTk5OTk5OTlFKzk5OTk5OTk5OSAtPiAwCisKKy0tIEV4YW1wbGVzCitjb3R4MDk0IGNvbXBhcmV0b3RhbCAgMTIuNzMgIDEyNy45ICAtPiAtMQorY290eDA5NSBjb21wYXJldG90YWwgIC0xMjcgICAxMiAgICAgLT4gLTEKK2NvdHgwOTYgY29tcGFyZXRvdGFsICAxMi4zMCAgMTIuMyAgIC0+IC0xCitjb3R4MDk3IGNvbXBhcmV0b3RhbCAgMTIuMzAgIDEyLjMwICAtPiAgMAorY290eDA5OCBjb21wYXJldG90YWwgIDEyLjMgICAxMi4zMDAgLT4gIDEKK2NvdHgwOTkgY29tcGFyZXRvdGFsICAxMi4zICAgTmFOICAgIC0+IC0xCisKKy0tIHNvbWUgZGlmZmVyaW5nIGxlbmd0aC9leHBvbmVudCBjYXNlcworLS0gaW4gdGhpcyBmaXJzdCBncm91cCwgY29tcGFyZSB3b3VsZCBjb21wYXJlIGFsbCBlcXVhbAorY290eDEwMCBjb21wYXJldG90YWwgICA3LjAgICAgNy4wICAgIC0+IDAKK2NvdHgxMDEgY29tcGFyZXRvdGFsICAgNy4wICAgIDcgICAgICAtPiAtMQorY290eDEwMiBjb21wYXJldG90YWwgICA3ICAgICAgNy4wICAgIC0+IDEKK2NvdHgxMDMgY29tcGFyZXRvdGFsICAgN0UrMCAgIDcuMCAgICAtPiAxCitjb3R4MTA0IGNvbXBhcmV0b3RhbCAgIDcwRS0xICA3LjAgICAgLT4gMAorY290eDEwNSBjb21wYXJldG90YWwgICAwLjdFKzEgNyAgICAgIC0+IDAKK2NvdHgxMDYgY29tcGFyZXRvdGFsICAgNzBFLTEgIDcgICAgICAtPiAtMQorY290eDEwNyBjb21wYXJldG90YWwgICA3LjAgICAgN0UrMCAgIC0+IC0xCitjb3R4MTA4IGNvbXBhcmV0b3RhbCAgIDcuMCAgICA3MEUtMSAgLT4gMAorY290eDEwOSBjb21wYXJldG90YWwgICA3ICAgICAgMC43RSsxIC0+IDAKK2NvdHgxMTAgY29tcGFyZXRvdGFsICAgNyAgICAgIDcwRS0xICAtPiAxCisKK2NvdHgxMjAgY29tcGFyZXRvdGFsICAgOC4wICAgIDcuMCAgICAtPiAxCitjb3R4MTIxIGNvbXBhcmV0b3RhbCAgIDguMCAgICA3ICAgICAgLT4gMQorY290eDEyMiBjb21wYXJldG90YWwgICA4ICAgICAgNy4wICAgIC0+IDEKK2NvdHgxMjMgY29tcGFyZXRvdGFsICAgOEUrMCAgIDcuMCAgICAtPiAxCitjb3R4MTI0IGNvbXBhcmV0b3RhbCAgIDgwRS0xICA3LjAgICAgLT4gMQorY290eDEyNSBjb21wYXJldG90YWwgICAwLjhFKzEgNyAgICAgIC0+IDEKK2NvdHgxMjYgY29tcGFyZXRvdGFsICAgODBFLTEgIDcgICAgICAtPiAxCitjb3R4MTI3IGNvbXBhcmV0b3RhbCAgIDguMCAgICA3RSswICAgLT4gMQorY290eDEyOCBjb21wYXJldG90YWwgICA4LjAgICAgNzBFLTEgIC0+IDEKK2NvdHgxMjkgY29tcGFyZXRvdGFsICAgOCAgICAgIDAuN0UrMSAgLT4gMQorY290eDEzMCBjb21wYXJldG90YWwgICA4ICAgICAgNzBFLTEgIC0+IDEKKworY290eDE0MCBjb21wYXJldG90YWwgICA4LjAgICAgOS4wICAgIC0+IC0xCitjb3R4MTQxIGNvbXBhcmV0b3RhbCAgIDguMCAgICA5ICAgICAgLT4gLTEKK2NvdHgxNDIgY29tcGFyZXRvdGFsICAgOCAgICAgIDkuMCAgICAtPiAtMQorY290eDE0MyBjb21wYXJldG90YWwgICA4RSswICAgOS4wICAgIC0+IC0xCitjb3R4MTQ0IGNvbXBhcmV0b3RhbCAgIDgwRS0xICA5LjAgICAgLT4gLTEKK2NvdHgxNDUgY29tcGFyZXRvdGFsICAgMC44RSsxIDkgICAgICAtPiAtMQorY290eDE0NiBjb21wYXJldG90YWwgICA4MEUtMSAgOSAgICAgIC0+IC0xCitjb3R4MTQ3IGNvbXBhcmV0b3RhbCAgIDguMCAgICA5RSswICAgLT4gLTEKK2NvdHgxNDggY29tcGFyZXRvdGFsICAgOC4wICAgIDkwRS0xICAtPiAtMQorY290eDE0OSBjb21wYXJldG90YWwgICA4ICAgICAgMC45RSsxIC0+IC0xCitjb3R4MTUwIGNvbXBhcmV0b3RhbCAgIDggICAgICA5MEUtMSAgLT4gLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyAtKyAuLgorY290eDIwMCBjb21wYXJldG90YWwgIC03LjAgICAgNy4wICAgIC0+IC0xCitjb3R4MjAxIGNvbXBhcmV0b3RhbCAgLTcuMCAgICA3ICAgICAgLT4gLTEKK2NvdHgyMDIgY29tcGFyZXRvdGFsICAtNyAgICAgIDcuMCAgICAtPiAtMQorY290eDIwMyBjb21wYXJldG90YWwgIC03RSswICAgNy4wICAgIC0+IC0xCitjb3R4MjA0IGNvbXBhcmV0b3RhbCAgLTcwRS0xICA3LjAgICAgLT4gLTEKK2NvdHgyMDUgY29tcGFyZXRvdGFsICAtMC43RSsxIDcgICAgICAtPiAtMQorY290eDIwNiBjb21wYXJldG90YWwgIC03MEUtMSAgNyAgICAgIC0+IC0xCitjb3R4MjA3IGNvbXBhcmV0b3RhbCAgLTcuMCAgICA3RSswICAgLT4gLTEKK2NvdHgyMDggY29tcGFyZXRvdGFsICAtNy4wICAgIDcwRS0xICAtPiAtMQorY290eDIwOSBjb21wYXJldG90YWwgIC03ICAgICAgMC43RSsxIC0+IC0xCitjb3R4MjEwIGNvbXBhcmV0b3RhbCAgLTcgICAgICA3MEUtMSAgLT4gLTEKKworY290eDIyMCBjb21wYXJldG90YWwgIC04LjAgICAgNy4wICAgIC0+IC0xCitjb3R4MjIxIGNvbXBhcmV0b3RhbCAgLTguMCAgICA3ICAgICAgLT4gLTEKK2NvdHgyMjIgY29tcGFyZXRvdGFsICAtOCAgICAgIDcuMCAgICAtPiAtMQorY290eDIyMyBjb21wYXJldG90YWwgIC04RSswICAgNy4wICAgIC0+IC0xCitjb3R4MjI0IGNvbXBhcmV0b3RhbCAgLTgwRS0xICA3LjAgICAgLT4gLTEKK2NvdHgyMjUgY29tcGFyZXRvdGFsICAtMC44RSsxIDcgICAgICAtPiAtMQorY290eDIyNiBjb21wYXJldG90YWwgIC04MEUtMSAgNyAgICAgIC0+IC0xCitjb3R4MjI3IGNvbXBhcmV0b3RhbCAgLTguMCAgICA3RSswICAgLT4gLTEKK2NvdHgyMjggY29tcGFyZXRvdGFsICAtOC4wICAgIDcwRS0xICAtPiAtMQorY290eDIyOSBjb21wYXJldG90YWwgIC04ICAgICAgMC43RSsxIC0+IC0xCitjb3R4MjMwIGNvbXBhcmV0b3RhbCAgLTggICAgICA3MEUtMSAgLT4gLTEKKworY290eDI0MCBjb21wYXJldG90YWwgIC04LjAgICAgOS4wICAgIC0+IC0xCitjb3R4MjQxIGNvbXBhcmV0b3RhbCAgLTguMCAgICA5ICAgICAgLT4gLTEKK2NvdHgyNDIgY29tcGFyZXRvdGFsICAtOCAgICAgIDkuMCAgICAtPiAtMQorY290eDI0MyBjb21wYXJldG90YWwgIC04RSswICAgOS4wICAgIC0+IC0xCitjb3R4MjQ0IGNvbXBhcmV0b3RhbCAgLTgwRS0xICA5LjAgICAgLT4gLTEKK2NvdHgyNDUgY29tcGFyZXRvdGFsICAtMC44RSsxIDkgICAgICAtPiAtMQorY290eDI0NiBjb21wYXJldG90YWwgIC04MEUtMSAgOSAgICAgIC0+IC0xCitjb3R4MjQ3IGNvbXBhcmV0b3RhbCAgLTguMCAgICA5RSswICAgLT4gLTEKK2NvdHgyNDggY29tcGFyZXRvdGFsICAtOC4wICAgIDkwRS0xICAtPiAtMQorY290eDI0OSBjb21wYXJldG90YWwgIC04ICAgICAgMC45RSsxIC0+IC0xCitjb3R4MjUwIGNvbXBhcmV0b3RhbCAgLTggICAgICA5MEUtMSAgLT4gLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyArLSAuLgorY290eDMwMCBjb21wYXJldG90YWwgICA3LjAgICAgLTcuMCAgICAtPiAxCitjb3R4MzAxIGNvbXBhcmV0b3RhbCAgIDcuMCAgICAtNyAgICAgIC0+IDEKK2NvdHgzMDIgY29tcGFyZXRvdGFsICAgNyAgICAgIC03LjAgICAgLT4gMQorY290eDMwMyBjb21wYXJldG90YWwgICA3RSswICAgLTcuMCAgICAtPiAxCitjb3R4MzA0IGNvbXBhcmV0b3RhbCAgIDcwRS0xICAtNy4wICAgIC0+IDEKK2NvdHgzMDUgY29tcGFyZXRvdGFsICAgLjdFKzEgIC03ICAgICAgLT4gMQorY290eDMwNiBjb21wYXJldG90YWwgICA3MEUtMSAgLTcgICAgICAtPiAxCitjb3R4MzA3IGNvbXBhcmV0b3RhbCAgIDcuMCAgICAtN0UrMCAgIC0+IDEKK2NvdHgzMDggY29tcGFyZXRvdGFsICAgNy4wICAgIC03MEUtMSAgLT4gMQorY290eDMwOSBjb21wYXJldG90YWwgICA3ICAgICAgLS43RSsxICAtPiAxCitjb3R4MzEwIGNvbXBhcmV0b3RhbCAgIDcgICAgICAtNzBFLTEgIC0+IDEKKworY290eDMyMCBjb21wYXJldG90YWwgICA4LjAgICAgLTcuMCAgICAtPiAxCitjb3R4MzIxIGNvbXBhcmV0b3RhbCAgIDguMCAgICAtNyAgICAgIC0+IDEKK2NvdHgzMjIgY29tcGFyZXRvdGFsICAgOCAgICAgIC03LjAgICAgLT4gMQorY290eDMyMyBjb21wYXJldG90YWwgICA4RSswICAgLTcuMCAgICAtPiAxCitjb3R4MzI0IGNvbXBhcmV0b3RhbCAgIDgwRS0xICAtNy4wICAgIC0+IDEKK2NvdHgzMjUgY29tcGFyZXRvdGFsICAgLjhFKzEgIC03ICAgICAgLT4gMQorY290eDMyNiBjb21wYXJldG90YWwgICA4MEUtMSAgLTcgICAgICAtPiAxCitjb3R4MzI3IGNvbXBhcmV0b3RhbCAgIDguMCAgICAtN0UrMCAgIC0+IDEKK2NvdHgzMjggY29tcGFyZXRvdGFsICAgOC4wICAgIC03MEUtMSAgLT4gMQorY290eDMyOSBjb21wYXJldG90YWwgICA4ICAgICAgLS43RSsxICAtPiAxCitjb3R4MzMwIGNvbXBhcmV0b3RhbCAgIDggICAgICAtNzBFLTEgIC0+IDEKKworY290eDM0MCBjb21wYXJldG90YWwgICA4LjAgICAgLTkuMCAgICAtPiAxCitjb3R4MzQxIGNvbXBhcmV0b3RhbCAgIDguMCAgICAtOSAgICAgIC0+IDEKK2NvdHgzNDIgY29tcGFyZXRvdGFsICAgOCAgICAgIC05LjAgICAgLT4gMQorY290eDM0MyBjb21wYXJldG90YWwgICA4RSswICAgLTkuMCAgICAtPiAxCitjb3R4MzQ0IGNvbXBhcmV0b3RhbCAgIDgwRS0xICAtOS4wICAgIC0+IDEKK2NvdHgzNDUgY29tcGFyZXRvdGFsICAgLjhFKzEgIC05ICAgICAgLT4gMQorY290eDM0NiBjb21wYXJldG90YWwgICA4MEUtMSAgLTkgICAgICAtPiAxCitjb3R4MzQ3IGNvbXBhcmV0b3RhbCAgIDguMCAgICAtOUUrMCAgIC0+IDEKK2NvdHgzNDggY29tcGFyZXRvdGFsICAgOC4wICAgIC05MEUtMSAgLT4gMQorY290eDM0OSBjb21wYXJldG90YWwgICA4ICAgICAgLS45RSsxICAtPiAxCitjb3R4MzUwIGNvbXBhcmV0b3RhbCAgIDggICAgICAtOTBFLTEgIC0+IDEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyAtLSAuLgorY290eDQwMCBjb21wYXJldG90YWwgICAtNy4wICAgIC03LjAgICAgLT4gMAorY290eDQwMSBjb21wYXJldG90YWwgICAtNy4wICAgIC03ICAgICAgLT4gMQorY290eDQwMiBjb21wYXJldG90YWwgICAtNyAgICAgIC03LjAgICAgLT4gLTEKK2NvdHg0MDMgY29tcGFyZXRvdGFsICAgLTdFKzAgICAtNy4wICAgIC0+IC0xCitjb3R4NDA0IGNvbXBhcmV0b3RhbCAgIC03MEUtMSAgLTcuMCAgICAtPiAwCitjb3R4NDA1IGNvbXBhcmV0b3RhbCAgIC0uN0UrMSAgLTcgICAgICAtPiAwCitjb3R4NDA2IGNvbXBhcmV0b3RhbCAgIC03MEUtMSAgLTcgICAgICAtPiAxCitjb3R4NDA3IGNvbXBhcmV0b3RhbCAgIC03LjAgICAgLTdFKzAgICAtPiAxCitjb3R4NDA4IGNvbXBhcmV0b3RhbCAgIC03LjAgICAgLTcwRS0xICAtPiAwCitjb3R4NDA5IGNvbXBhcmV0b3RhbCAgIC03ICAgICAgLS43RSsxICAtPiAwCitjb3R4NDEwIGNvbXBhcmV0b3RhbCAgIC03ICAgICAgLTcwRS0xICAtPiAtMQorCitjb3R4NDIwIGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTcuMCAgICAtPiAtMQorY290eDQyMSBjb21wYXJldG90YWwgICAtOC4wICAgIC03ICAgICAgLT4gLTEKK2NvdHg0MjIgY29tcGFyZXRvdGFsICAgLTggICAgICAtNy4wICAgIC0+IC0xCitjb3R4NDIzIGNvbXBhcmV0b3RhbCAgIC04RSswICAgLTcuMCAgICAtPiAtMQorY290eDQyNCBjb21wYXJldG90YWwgICAtODBFLTEgIC03LjAgICAgLT4gLTEKK2NvdHg0MjUgY29tcGFyZXRvdGFsICAgLS44RSsxICAtNyAgICAgIC0+IC0xCitjb3R4NDI2IGNvbXBhcmV0b3RhbCAgIC04MEUtMSAgLTcgICAgICAtPiAtMQorY290eDQyNyBjb21wYXJldG90YWwgICAtOC4wICAgIC03RSswICAgLT4gLTEKK2NvdHg0MjggY29tcGFyZXRvdGFsICAgLTguMCAgICAtNzBFLTEgIC0+IC0xCitjb3R4NDI5IGNvbXBhcmV0b3RhbCAgIC04ICAgICAgLS43RSsxICAtPiAtMQorY290eDQzMCBjb21wYXJldG90YWwgICAtOCAgICAgIC03MEUtMSAgLT4gLTEKKworY290eDQ0MCBjb21wYXJldG90YWwgICAtOC4wICAgIC05LjAgICAgLT4gMQorY290eDQ0MSBjb21wYXJldG90YWwgICAtOC4wICAgIC05ICAgICAgLT4gMQorY290eDQ0MiBjb21wYXJldG90YWwgICAtOCAgICAgIC05LjAgICAgLT4gMQorY290eDQ0MyBjb21wYXJldG90YWwgICAtOEUrMCAgIC05LjAgICAgLT4gMQorY290eDQ0NCBjb21wYXJldG90YWwgICAtODBFLTEgIC05LjAgICAgLT4gMQorY290eDQ0NSBjb21wYXJldG90YWwgICAtLjhFKzEgIC05ICAgICAgLT4gMQorY290eDQ0NiBjb21wYXJldG90YWwgICAtODBFLTEgIC05ICAgICAgLT4gMQorY290eDQ0NyBjb21wYXJldG90YWwgICAtOC4wICAgIC05RSswICAgLT4gMQorY290eDQ0OCBjb21wYXJldG90YWwgICAtOC4wICAgIC05MEUtMSAgLT4gMQorY290eDQ0OSBjb21wYXJldG90YWwgICAtOCAgICAgIC0uOUUrMSAgLT4gMQorY290eDQ1MCBjb21wYXJldG90YWwgICAtOCAgICAgIC05MEUtMSAgLT4gMQorCisKKy0tIHRlc3RjYXNlcyB0aGF0IHN1YnRyYWN0IHRvIGxvdHMgb2YgemVyb3MgYXQgYm91bmRhcmllcyBbcGdyXQorcHJlY2lzaW9uOiA0MAorY290eDQ3MCBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMDAwMDAwMDBFNzg5IDEyMy40NTZFNzg5IC0+IC0xCitjb3R4NDcxIGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAtMQorY290eDQ3MiBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMDAwMDAwRTc4OSAxMjMuNDU2RTc4OSAtPiAtMQorY290eDQ3MyBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMDAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IC0xCitjb3R4NDc0IGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDAwMDAwRTc4OSAxMjMuNDU2RTc4OSAtPiAtMQorY290eDQ3NSBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAtMQorY290eDQ3NiBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMDBFNzg5IDEyMy40NTZFNzg5IC0+IC0xCitjb3R4NDc3IGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAtMQorY290eDQ3OCBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwRTc4OSAxMjMuNDU2RTc4OSAtPiAtMQorY290eDQ3OSBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IC0xCitjb3R4NDgwIGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwRTc4OSAxMjMuNDU2RTc4OSAtPiAtMQorY290eDQ4MSBjb21wYXJldG90YWwgMTIzLjQ1NjAwRS04OSAxMjMuNDU2RS04OSAtPiAtMQorY290eDQ4MiBjb21wYXJldG90YWwgMTIzLjQ1NjBFNzg5IDEyMy40NTZFNzg5IC0+IC0xCitjb3R4NDgzIGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2RS04OSAtPiAwCitjb3R4NDg0IGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMDAwMDAwMEUtODkgLT4gMQorY290eDQ4NSBjb21wYXJldG90YWwgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwMDAwMDAwMDAwMEU3ODkgLT4gMQorY290eDQ4NiBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDAwMDAwRS04OSAtPiAxCitjb3R4NDg3IGNvbXBhcmV0b3RhbCAxMjMuNDU2RTc4OSAxMjMuNDU2MDAwMDAwMDAwMEU3ODkgLT4gMQorY290eDQ4OCBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDAwMEUtODkgLT4gMQorY290eDQ4OSBjb21wYXJldG90YWwgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwMDAwMDAwRTc4OSAtPiAxCitjb3R4NDkwIGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMEUtODkgLT4gMQorY290eDQ5MSBjb21wYXJldG90YWwgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwMDAwMEU3ODkgLT4gMQorY290eDQ5MiBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwRS04OSAtPiAxCitjb3R4NDkzIGNvbXBhcmV0b3RhbCAxMjMuNDU2RTc4OSAxMjMuNDU2MDAwMEU3ODkgLT4gMQorY290eDQ5NCBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMEUtODkgLT4gMQorY290eDQ5NSBjb21wYXJldG90YWwgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwRTc4OSAtPiAxCitjb3R4NDk2IGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2MEUtODkgLT4gMQorY290eDQ5NyBjb21wYXJldG90YWwgMTIzLjQ1NkU3ODkgMTIzLjQ1NkU3ODkgLT4gMAorCistLSB3aWRlLXJhbmdpbmcsIGFyb3VuZCBwcmVjaXNpb247IHNpZ25zIGVxdWFsCitwcmVjaXNpb246IDkKK2NvdHg1MDAgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTE1ICAgIC0+IDEKK2NvdHg1MDEgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTE0ICAgIC0+IDEKK2NvdHg1MDIgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTEzICAgIC0+IDEKK2NvdHg1MDMgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTEyICAgIC0+IDEKK2NvdHg1MDQgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTExICAgIC0+IDEKK2NvdHg1MDUgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTEwICAgIC0+IDEKK2NvdHg1MDYgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTkgICAgIC0+IDEKK2NvdHg1MDcgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTggICAgIC0+IDEKK2NvdHg1MDggY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTcgICAgIC0+IDEKK2NvdHg1MDkgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTYgICAgIC0+IDEKK2NvdHg1MTAgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTUgICAgIC0+IDEKK2NvdHg1MTEgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTQgICAgIC0+IDEKK2NvdHg1MTIgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTMgICAgIC0+IDEKK2NvdHg1MTMgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTIgICAgIC0+IDEKK2NvdHg1MTQgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTEgICAgIC0+IDEKK2NvdHg1MTUgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTAgICAgIC0+IDAKK2NvdHg1MTYgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzEgICAgIC0+IC0xCitjb3R4NTE3IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsyICAgICAtPiAtMQorY290eDUxOCBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMyAgICAgLT4gLTEKK2NvdHg1MTkgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzQgICAgIC0+IC0xCitjb3R4NTIxIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSs1ICAgICAtPiAtMQorY290eDUyMiBjb21wYXJldG90YWwgICAgMSAgICAgMUUrNiAgICAgLT4gLTEKK2NvdHg1MjMgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzcgICAgIC0+IC0xCitjb3R4NTI0IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSs4ICAgICAtPiAtMQorY290eDUyNSBjb21wYXJldG90YWwgICAgMSAgICAgMUUrOSAgICAgLT4gLTEKK2NvdHg1MjYgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzEwICAgIC0+IC0xCitjb3R4NTI3IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxMSAgICAtPiAtMQorY290eDUyOCBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTIgICAgLT4gLTEKK2NvdHg1MjkgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzEzICAgIC0+IC0xCitjb3R4NTMwIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxNCAgICAtPiAtMQorY290eDUzMSBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTUgICAgLT4gLTEKKy0tIExSIHN3YXAKK2NvdHg1NDAgY29tcGFyZXRvdGFsICAgIDFFLTE1ICAxICAgICAgIC0+IC0xCitjb3R4NTQxIGNvbXBhcmV0b3RhbCAgICAxRS0xNCAgMSAgICAgICAtPiAtMQorY290eDU0MiBjb21wYXJldG90YWwgICAgMUUtMTMgIDEgICAgICAgLT4gLTEKK2NvdHg1NDMgY29tcGFyZXRvdGFsICAgIDFFLTEyICAxICAgICAgIC0+IC0xCitjb3R4NTQ0IGNvbXBhcmV0b3RhbCAgICAxRS0xMSAgMSAgICAgICAtPiAtMQorY290eDU0NSBjb21wYXJldG90YWwgICAgMUUtMTAgIDEgICAgICAgLT4gLTEKK2NvdHg1NDYgY29tcGFyZXRvdGFsICAgIDFFLTkgICAxICAgICAgIC0+IC0xCitjb3R4NTQ3IGNvbXBhcmV0b3RhbCAgICAxRS04ICAgMSAgICAgICAtPiAtMQorY290eDU0OCBjb21wYXJldG90YWwgICAgMUUtNyAgIDEgICAgICAgLT4gLTEKK2NvdHg1NDkgY29tcGFyZXRvdGFsICAgIDFFLTYgICAxICAgICAgIC0+IC0xCitjb3R4NTUwIGNvbXBhcmV0b3RhbCAgICAxRS01ICAgMSAgICAgICAtPiAtMQorY290eDU1MSBjb21wYXJldG90YWwgICAgMUUtNCAgIDEgICAgICAgLT4gLTEKK2NvdHg1NTIgY29tcGFyZXRvdGFsICAgIDFFLTMgICAxICAgICAgIC0+IC0xCitjb3R4NTUzIGNvbXBhcmV0b3RhbCAgICAxRS0yICAgMSAgICAgICAtPiAtMQorY290eDU1NCBjb21wYXJldG90YWwgICAgMUUtMSAgIDEgICAgICAgLT4gLTEKK2NvdHg1NTUgY29tcGFyZXRvdGFsICAgIDFFLTAgICAxICAgICAgIC0+ICAwCitjb3R4NTU2IGNvbXBhcmV0b3RhbCAgICAxRSsxICAgMSAgICAgICAtPiAgMQorY290eDU1NyBjb21wYXJldG90YWwgICAgMUUrMiAgIDEgICAgICAgLT4gIDEKK2NvdHg1NTggY29tcGFyZXRvdGFsICAgIDFFKzMgICAxICAgICAgIC0+ICAxCitjb3R4NTU5IGNvbXBhcmV0b3RhbCAgICAxRSs0ICAgMSAgICAgICAtPiAgMQorY290eDU2MSBjb21wYXJldG90YWwgICAgMUUrNSAgIDEgICAgICAgLT4gIDEKK2NvdHg1NjIgY29tcGFyZXRvdGFsICAgIDFFKzYgICAxICAgICAgIC0+ICAxCitjb3R4NTYzIGNvbXBhcmV0b3RhbCAgICAxRSs3ICAgMSAgICAgICAtPiAgMQorY290eDU2NCBjb21wYXJldG90YWwgICAgMUUrOCAgIDEgICAgICAgLT4gIDEKK2NvdHg1NjUgY29tcGFyZXRvdGFsICAgIDFFKzkgICAxICAgICAgIC0+ICAxCitjb3R4NTY2IGNvbXBhcmV0b3RhbCAgICAxRSsxMCAgMSAgICAgICAtPiAgMQorY290eDU2NyBjb21wYXJldG90YWwgICAgMUUrMTEgIDEgICAgICAgLT4gIDEKK2NvdHg1NjggY29tcGFyZXRvdGFsICAgIDFFKzEyICAxICAgICAgIC0+ICAxCitjb3R4NTY5IGNvbXBhcmV0b3RhbCAgICAxRSsxMyAgMSAgICAgICAtPiAgMQorY290eDU3MCBjb21wYXJldG90YWwgICAgMUUrMTQgIDEgICAgICAgLT4gIDEKK2NvdHg1NzEgY29tcGFyZXRvdGFsICAgIDFFKzE1ICAxICAgICAgIC0+ICAxCistLSBzaW1pbGFyIHdpdGggYW4gdXNlZnVsIGNvZWZmaWNpZW50LCBvbmUgc2lkZSBvbmx5Citjb3R4NTgwIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE1ICAgIC0+IDEKK2NvdHg1ODEgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTQgICAgLT4gMQorY290eDU4MiBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMyAgICAtPiAxCitjb3R4NTgzIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEyICAgIC0+IDEKK2NvdHg1ODQgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTEgICAgLT4gMQorY290eDU4NSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMCAgICAtPiAxCitjb3R4NTg2IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTkgICAgIC0+IDEKK2NvdHg1ODcgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOCAgICAgLT4gMQorY290eDU4OCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS03ICAgICAtPiAxCitjb3R4NTg5IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTYgICAgIC0+IC0xCitjb3R4NTkwIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTUgICAgIC0+IC0xCitjb3R4NTkxIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTQgICAgIC0+IC0xCitjb3R4NTkyIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTMgICAgIC0+IC0xCitjb3R4NTkzIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTIgICAgIC0+IC0xCitjb3R4NTk0IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEgICAgIC0+IC0xCitjb3R4NTk1IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTAgICAgIC0+IC0xCitjb3R4NTk2IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzEgICAgIC0+IC0xCitjb3R4NTk3IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzIgICAgIC0+IC0xCitjb3R4NTk4IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzMgICAgIC0+IC0xCitjb3R4NTk5IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzQgICAgIC0+IC0xCisKKy0tIGNoZWNrIHNvbWUgdW5pdC15IHRyYXBzCitwcmVjaXNpb246IDIwCitjb3R4NjAwIGNvbXBhcmV0b3RhbCAgIDEyICAgICAgICAgICAgMTIuMjM0NSAtPiAtMQorY290eDYwMSBjb21wYXJldG90YWwgICAxMi4wICAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2NvdHg2MDIgY29tcGFyZXRvdGFsICAgMTIuMDAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitjb3R4NjAzIGNvbXBhcmV0b3RhbCAgIDEyLjAwMCAgICAgICAgMTIuMjM0NSAtPiAtMQorY290eDYwNCBjb21wYXJldG90YWwgICAxMi4wMDAwICAgICAgIDEyLjIzNDUgLT4gLTEKK2NvdHg2MDUgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAgICAgICAxMi4yMzQ1IC0+IC0xCitjb3R4NjA2IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMCAgICAgMTIuMjM0NSAtPiAtMQorY290eDYwNyBjb21wYXJldG90YWwgICAxMi4wMDAwMDAwICAgIDEyLjIzNDUgLT4gLTEKK2NvdHg2MDggY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwMDAgICAxMi4yMzQ1IC0+IC0xCitjb3R4NjA5IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMDAwMCAgMTIuMjM0NSAtPiAtMQorY290eDYxMCBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyICAgICAgICAgICAgLT4gIDEKK2NvdHg2MTEgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wICAgICAgICAgIC0+ICAxCitjb3R4NjEyIGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAgICAgICAgICAtPiAgMQorY290eDYxMyBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMCAgICAgICAgLT4gIDEKK2NvdHg2MTQgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAwICAgICAgIC0+ICAxCitjb3R4NjE1IGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwMDAgICAgICAtPiAgMQorY290eDYxNiBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMDAwMCAgICAgLT4gIDEKK2NvdHg2MTcgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAwMDAwICAgIC0+ICAxCitjb3R4NjE4IGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwMDAwMDAgICAtPiAgMQorY290eDYxOSBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMDAwMDAwMCAgLT4gIDEKK2NvdHg2MjAgY29tcGFyZXRvdGFsICAtMTIgICAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitjb3R4NjIxIGNvbXBhcmV0b3RhbCAgLTEyLjAgICAgICAgICAtMTIuMjM0NSAtPiAgMQorY290eDYyMiBjb21wYXJldG90YWwgIC0xMi4wMCAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2NvdHg2MjMgY29tcGFyZXRvdGFsICAtMTIuMDAwICAgICAgIC0xMi4yMzQ1IC0+ICAxCitjb3R4NjI0IGNvbXBhcmV0b3RhbCAgLTEyLjAwMDAgICAgICAtMTIuMjM0NSAtPiAgMQorY290eDYyNSBjb21wYXJldG90YWwgIC0xMi4wMDAwMCAgICAgLTEyLjIzNDUgLT4gIDEKK2NvdHg2MjYgY29tcGFyZXRvdGFsICAtMTIuMDAwMDAwICAgIC0xMi4yMzQ1IC0+ICAxCitjb3R4NjI3IGNvbXBhcmV0b3RhbCAgLTEyLjAwMDAwMDAgICAtMTIuMjM0NSAtPiAgMQorY290eDYyOCBjb21wYXJldG90YWwgIC0xMi4wMDAwMDAwMCAgLTEyLjIzNDUgLT4gIDEKK2NvdHg2MjkgY29tcGFyZXRvdGFsICAtMTIuMDAwMDAwMDAwIC0xMi4yMzQ1IC0+ICAxCitjb3R4NjMwIGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyICAgICAgICAgICAtPiAtMQorY290eDYzMSBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wICAgICAgICAgLT4gLTEKK2NvdHg2MzIgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAgICAgICAgIC0+IC0xCitjb3R4NjMzIGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMCAgICAgICAtPiAtMQorY290eDYzNCBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAwICAgICAgLT4gLTEKK2NvdHg2MzUgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwMDAgICAgIC0+IC0xCitjb3R4NjM2IGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMDAwMCAgICAtPiAtMQorY290eDYzNyBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAwMDAwICAgLT4gLTEKK2NvdHg2MzggY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAgIC0+IC0xCitjb3R4NjM5IGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwMCAtPiAtMQorcHJlY2lzaW9uOiA5CisKKy0tIGV4dGVuZGVkIHplcm9zCitjb3R4NjQwIGNvbXBhcmV0b3RhbCAgIDAgICAgIDAgICAtPiAwCitjb3R4NjQxIGNvbXBhcmV0b3RhbCAgIDAgICAgLTAgICAtPiAxCitjb3R4NjQyIGNvbXBhcmV0b3RhbCAgIDAgICAgLTAuMCAtPiAxCitjb3R4NjQzIGNvbXBhcmV0b3RhbCAgIDAgICAgIDAuMCAtPiAxCitjb3R4NjQ0IGNvbXBhcmV0b3RhbCAgLTAgICAgIDAgICAtPiAtMQorY290eDY0NSBjb21wYXJldG90YWwgIC0wICAgIC0wICAgLT4gMAorY290eDY0NiBjb21wYXJldG90YWwgIC0wICAgIC0wLjAgLT4gLTEKK2NvdHg2NDcgY29tcGFyZXRvdGFsICAtMCAgICAgMC4wIC0+IC0xCitjb3R4NjQ4IGNvbXBhcmV0b3RhbCAgIDAuMCAgIDAgICAtPiAtMQorY290eDY0OSBjb21wYXJldG90YWwgICAwLjAgIC0wICAgLT4gMQorY290eDY1MCBjb21wYXJldG90YWwgICAwLjAgIC0wLjAgLT4gMQorY290eDY1MSBjb21wYXJldG90YWwgICAwLjAgICAwLjAgLT4gMAorY290eDY1MiBjb21wYXJldG90YWwgIC0wLjAgICAwICAgLT4gLTEKK2NvdHg2NTMgY29tcGFyZXRvdGFsICAtMC4wICAtMCAgIC0+IDEKK2NvdHg2NTQgY29tcGFyZXRvdGFsICAtMC4wICAtMC4wIC0+IDAKK2NvdHg2NTUgY29tcGFyZXRvdGFsICAtMC4wICAgMC4wIC0+IC0xCisKK2NvdHg2NTYgY29tcGFyZXRvdGFsICAtMEUxICAgMC4wIC0+IC0xCitjb3R4NjU3IGNvbXBhcmV0b3RhbCAgLTBFMiAgIDAuMCAtPiAtMQorY290eDY1OCBjb21wYXJldG90YWwgICAwRTEgICAwLjAgLT4gMQorY290eDY1OSBjb21wYXJldG90YWwgICAwRTIgICAwLjAgLT4gMQorY290eDY2MCBjb21wYXJldG90YWwgIC0wRTEgICAwICAgLT4gLTEKK2NvdHg2NjEgY29tcGFyZXRvdGFsICAtMEUyICAgMCAgIC0+IC0xCitjb3R4NjYyIGNvbXBhcmV0b3RhbCAgIDBFMSAgIDAgICAtPiAxCitjb3R4NjYzIGNvbXBhcmV0b3RhbCAgIDBFMiAgIDAgICAtPiAxCitjb3R4NjY0IGNvbXBhcmV0b3RhbCAgLTBFMSAgLTBFMSAtPiAwCitjb3R4NjY1IGNvbXBhcmV0b3RhbCAgLTBFMiAgLTBFMSAtPiAtMQorY290eDY2NiBjb21wYXJldG90YWwgICAwRTEgIC0wRTEgLT4gMQorY290eDY2NyBjb21wYXJldG90YWwgICAwRTIgIC0wRTEgLT4gMQorY290eDY2OCBjb21wYXJldG90YWwgIC0wRTEgIC0wRTIgLT4gMQorY290eDY2OSBjb21wYXJldG90YWwgIC0wRTIgIC0wRTIgLT4gMAorY290eDY3MCBjb21wYXJldG90YWwgICAwRTEgIC0wRTIgLT4gMQorY290eDY3MSBjb21wYXJldG90YWwgICAwRTIgIC0wRTIgLT4gMQorY290eDY3MiBjb21wYXJldG90YWwgIC0wRTEgICAwRTEgLT4gLTEKK2NvdHg2NzMgY29tcGFyZXRvdGFsICAtMEUyICAgMEUxIC0+IC0xCitjb3R4Njc0IGNvbXBhcmV0b3RhbCAgIDBFMSAgIDBFMSAtPiAwCitjb3R4Njc1IGNvbXBhcmV0b3RhbCAgIDBFMiAgIDBFMSAtPiAxCitjb3R4Njc2IGNvbXBhcmV0b3RhbCAgLTBFMSAgIDBFMiAtPiAtMQorY290eDY3NyBjb21wYXJldG90YWwgIC0wRTIgICAwRTIgLT4gLTEKK2NvdHg2NzggY29tcGFyZXRvdGFsICAgMEUxICAgMEUyIC0+IC0xCitjb3R4Njc5IGNvbXBhcmV0b3RhbCAgIDBFMiAgIDBFMiAtPiAwCisKKy0tIHRyYWlsaW5nIHplcm9zOyB1bml0LXkKK3ByZWNpc2lvbjogMjAKK2NvdHg2ODAgY29tcGFyZXRvdGFsICAgMTIgICAgMTIgICAgICAgICAgIC0+IDAKK2NvdHg2ODEgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMCAgICAgICAgIC0+IDEKK2NvdHg2ODIgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAgICAgICAgIC0+IDEKK2NvdHg2ODMgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwICAgICAgIC0+IDEKK2NvdHg2ODQgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMCAgICAgIC0+IDEKK2NvdHg2ODUgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMDAgICAgIC0+IDEKK2NvdHg2ODYgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMDAwICAgIC0+IDEKK2NvdHg2ODcgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMDAwMCAgIC0+IDEKK2NvdHg2ODggY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMDAwMDAgIC0+IDEKK2NvdHg2ODkgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMDAwMDAwIC0+IDEKK2NvdHg2OTAgY29tcGFyZXRvdGFsICAgMTIgICAgICAgICAgICAgIDEyIC0+IDAKK2NvdHg2OTEgY29tcGFyZXRvdGFsICAgMTIuMCAgICAgICAgICAgIDEyIC0+IC0xCitjb3R4NjkyIGNvbXBhcmV0b3RhbCAgIDEyLjAwICAgICAgICAgICAxMiAtPiAtMQorY290eDY5MyBjb21wYXJldG90YWwgICAxMi4wMDAgICAgICAgICAgMTIgLT4gLTEKK2NvdHg2OTQgY29tcGFyZXRvdGFsICAgMTIuMDAwMCAgICAgICAgIDEyIC0+IC0xCitjb3R4Njk1IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwICAgICAgICAxMiAtPiAtMQorY290eDY5NiBjb21wYXJldG90YWwgICAxMi4wMDAwMDAgICAgICAgMTIgLT4gLTEKK2NvdHg2OTcgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwMCAgICAgIDEyIC0+IC0xCitjb3R4Njk4IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMDAwICAgICAxMiAtPiAtMQorY290eDY5OSBjb21wYXJldG90YWwgICAxMi4wMDAwMDAwMDAgICAgMTIgLT4gLTEKKworLS0gbG9uZyBvcGVyYW5kIGNoZWNrcworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogOQorY290eDcwMSBjb21wYXJldG90YWwgMTIzNDU2NzgwMDAgIDEgLT4gIDEKK2NvdHg3MDIgY29tcGFyZXRvdGFsIDEgMTIzNDU2NzgwMDAgIC0+IC0xCitjb3R4NzAzIGNvbXBhcmV0b3RhbCAxMjM0NTY3ODAwICAgMSAtPiAgMQorY290eDcwNCBjb21wYXJldG90YWwgMSAxMjM0NTY3ODAwICAgLT4gLTEKK2NvdHg3MDUgY29tcGFyZXRvdGFsIDEyMzQ1Njc4OTAgICAxIC0+ICAxCitjb3R4NzA2IGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4OTAgICAtPiAtMQorY290eDcwNyBjb21wYXJldG90YWwgMTIzNDU2Nzg5MSAgIDEgLT4gIDEKK2NvdHg3MDggY29tcGFyZXRvdGFsIDEgMTIzNDU2Nzg5MSAgIC0+IC0xCitjb3R4NzA5IGNvbXBhcmV0b3RhbCAxMjM0NTY3ODkwMSAgMSAtPiAgMQorY290eDcxMCBjb21wYXJldG90YWwgMSAxMjM0NTY3ODkwMSAgLT4gLTEKK2NvdHg3MTEgY29tcGFyZXRvdGFsIDEyMzQ1Njc4OTYgICAxIC0+ICAxCitjb3R4NzEyIGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4OTYgICAtPiAtMQorY290eDcxMyBjb21wYXJldG90YWwgLTEyMzQ1Njc4OTEgIDEgLT4gLTEKK2NvdHg3MTQgY29tcGFyZXRvdGFsIDEgLTEyMzQ1Njc4OTEgIC0+ICAxCitjb3R4NzE1IGNvbXBhcmV0b3RhbCAtMTIzNDU2Nzg5MDEgMSAtPiAtMQorY290eDcxNiBjb21wYXJldG90YWwgMSAtMTIzNDU2Nzg5MDEgLT4gIDEKK2NvdHg3MTcgY29tcGFyZXRvdGFsIC0xMjM0NTY3ODk2ICAxIC0+IC0xCitjb3R4NzE4IGNvbXBhcmV0b3RhbCAxIC0xMjM0NTY3ODk2ICAtPiAgMQorCitwcmVjaXNpb246IDE1CistLSBzYW1lIHdpdGggcGxlbnR5IG9mIHByZWNpc2lvbgorY290eDcyMSBjb21wYXJldG90YWwgMTIzNDU2NzgwMDAgMSAtPiAxCitjb3R4NzIyIGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4MDAwIC0+IC0xCitjb3R4NzIzIGNvbXBhcmV0b3RhbCAxMjM0NTY3ODAwICAxIC0+IDEKK2NvdHg3MjQgY29tcGFyZXRvdGFsIDEgMTIzNDU2NzgwMCAgLT4gLTEKK2NvdHg3MjUgY29tcGFyZXRvdGFsIDEyMzQ1Njc4OTAgIDEgLT4gMQorY290eDcyNiBjb21wYXJldG90YWwgMSAxMjM0NTY3ODkwICAtPiAtMQorY290eDcyNyBjb21wYXJldG90YWwgMTIzNDU2Nzg5MSAgMSAtPiAxCitjb3R4NzI4IGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4OTEgIC0+IC0xCitjb3R4NzI5IGNvbXBhcmV0b3RhbCAxMjM0NTY3ODkwMSAxIC0+IDEKK2NvdHg3MzAgY29tcGFyZXRvdGFsIDEgMTIzNDU2Nzg5MDEgLT4gLTEKK2NvdHg3MzEgY29tcGFyZXRvdGFsIDEyMzQ1Njc4OTYgIDEgLT4gMQorY290eDczMiBjb21wYXJldG90YWwgMSAxMjM0NTY3ODk2ICAtPiAtMQorCistLSByZXNpZHVlIGNhc2VzCitwcmVjaXNpb246IDUKK2NvdHg3NDAgY29tcGFyZXRvdGFsICAxICAwLjk5OTk5OTkgIC0+IDEKK2NvdHg3NDEgY29tcGFyZXRvdGFsICAxICAwLjk5OTk5OSAgIC0+IDEKK2NvdHg3NDIgY29tcGFyZXRvdGFsICAxICAwLjk5OTk5ICAgIC0+IDEKK2NvdHg3NDMgY29tcGFyZXRvdGFsICAxICAxLjAwMDAgICAgIC0+IDEKK2NvdHg3NDQgY29tcGFyZXRvdGFsICAxICAxLjAwMDAxICAgIC0+IC0xCitjb3R4NzQ1IGNvbXBhcmV0b3RhbCAgMSAgMS4wMDAwMDEgICAtPiAtMQorY290eDc0NiBjb21wYXJldG90YWwgIDEgIDEuMDAwMDAwMSAgLT4gLTEKK2NvdHg3NTAgY29tcGFyZXRvdGFsICAwLjk5OTk5OTkgIDEgIC0+IC0xCitjb3R4NzUxIGNvbXBhcmV0b3RhbCAgMC45OTk5OTkgICAxICAtPiAtMQorY290eDc1MiBjb21wYXJldG90YWwgIDAuOTk5OTkgICAgMSAgLT4gLTEKK2NvdHg3NTMgY29tcGFyZXRvdGFsICAxLjAwMDAgICAgIDEgIC0+IC0xCitjb3R4NzU0IGNvbXBhcmV0b3RhbCAgMS4wMDAwMSAgICAxICAtPiAxCitjb3R4NzU1IGNvbXBhcmV0b3RhbCAgMS4wMDAwMDEgICAxICAtPiAxCitjb3R4NzU2IGNvbXBhcmV0b3RhbCAgMS4wMDAwMDAxICAxICAtPiAxCisKKy0tIGEgc2VsZWN0aW9uIG9mIGxvbmdpZXMKK2NvdHg3NjAgY29tcGFyZXRvdGFsIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtNTgzMDYyOS44MzQ3MDg1MDI1ODA4NzU2NTYwMzU3OTQwIC0+IC0xCitjb3R4NzYxIGNvbXBhcmV0b3RhbCAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAtPiAwCitjb3R4NzYyIGNvbXBhcmV0b3RhbCAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAtPiAtMQorY290eDc2MyBjb21wYXJldG90YWwgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorLS0gcHJlY2lzaW9ucyBhYm92ZSBvciBiZWxvdyB0aGUgZGlmZmVyZW5jZSBzaG91bGQgaGF2ZSBubyBlZmZlY3QKK3ByZWNpc2lvbjogICAxMQorY290eDc2NCBjb21wYXJldG90YWwgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgIDEwCitjb3R4NzY1IGNvbXBhcmV0b3RhbCAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljk0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAtPiAxCitwcmVjaXNpb246ICAgIDkKK2NvdHg3NjYgY29tcGFyZXRvdGFsIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgOAorY290eDc2NyBjb21wYXJldG90YWwgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICA3Citjb3R4NzY4IGNvbXBhcmV0b3RhbCAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljk0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAtPiAxCitwcmVjaXNpb246ICAgIDYKK2NvdHg3NjkgY29tcGFyZXRvdGFsIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgNQorY290eDc3MCBjb21wYXJldG90YWwgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICA0Citjb3R4NzcxIGNvbXBhcmV0b3RhbCAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljk0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAtPiAxCitwcmVjaXNpb246ICAgIDMKK2NvdHg3NzIgY29tcGFyZXRvdGFsIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgMgorY290eDc3MyBjb21wYXJldG90YWwgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICAxCitjb3R4Nzc0IGNvbXBhcmV0b3RhbCAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljk0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAtPiAxCisKKy0tIFNwZWNpYWxzCitwcmVjaXNpb246ICAgOQorY290eDc4MCBjb21wYXJldG90YWwgIEluZiAgLUluZiAgIC0+ICAxCitjb3R4NzgxIGNvbXBhcmV0b3RhbCAgSW5mICAtMTAwMCAgLT4gIDEKK2NvdHg3ODIgY29tcGFyZXRvdGFsICBJbmYgIC0xICAgICAtPiAgMQorY290eDc4MyBjb21wYXJldG90YWwgIEluZiAgLTAgICAgIC0+ICAxCitjb3R4Nzg0IGNvbXBhcmV0b3RhbCAgSW5mICAgMCAgICAgLT4gIDEKK2NvdHg3ODUgY29tcGFyZXRvdGFsICBJbmYgICAxICAgICAtPiAgMQorY290eDc4NiBjb21wYXJldG90YWwgIEluZiAgIDEwMDAgIC0+ICAxCitjb3R4Nzg3IGNvbXBhcmV0b3RhbCAgSW5mICAgSW5mICAgLT4gIDAKK2NvdHg3ODggY29tcGFyZXRvdGFsIC0xMDAwICBJbmYgICAtPiAtMQorY290eDc4OSBjb21wYXJldG90YWwgLUluZiAgIEluZiAgIC0+IC0xCitjb3R4NzkwIGNvbXBhcmV0b3RhbCAtMSAgICAgSW5mICAgLT4gLTEKK2NvdHg3OTEgY29tcGFyZXRvdGFsIC0wICAgICBJbmYgICAtPiAtMQorY290eDc5MiBjb21wYXJldG90YWwgIDAgICAgIEluZiAgIC0+IC0xCitjb3R4NzkzIGNvbXBhcmV0b3RhbCAgMSAgICAgSW5mICAgLT4gLTEKK2NvdHg3OTQgY29tcGFyZXRvdGFsICAxMDAwICBJbmYgICAtPiAtMQorY290eDc5NSBjb21wYXJldG90YWwgIEluZiAgIEluZiAgIC0+ICAwCisKK2NvdHg4MDAgY29tcGFyZXRvdGFsIC1JbmYgIC1JbmYgICAtPiAgMAorY290eDgwMSBjb21wYXJldG90YWwgLUluZiAgLTEwMDAgIC0+IC0xCitjb3R4ODAyIGNvbXBhcmV0b3RhbCAtSW5mICAtMSAgICAgLT4gLTEKK2NvdHg4MDMgY29tcGFyZXRvdGFsIC1JbmYgIC0wICAgICAtPiAtMQorY290eDgwNCBjb21wYXJldG90YWwgLUluZiAgIDAgICAgIC0+IC0xCitjb3R4ODA1IGNvbXBhcmV0b3RhbCAtSW5mICAgMSAgICAgLT4gLTEKK2NvdHg4MDYgY29tcGFyZXRvdGFsIC1JbmYgICAxMDAwICAtPiAtMQorY290eDgwNyBjb21wYXJldG90YWwgLUluZiAgIEluZiAgIC0+IC0xCitjb3R4ODA4IGNvbXBhcmV0b3RhbCAtSW5mICAtSW5mICAgLT4gIDAKK2NvdHg4MDkgY29tcGFyZXRvdGFsIC0xMDAwIC1JbmYgICAtPiAgMQorY290eDgxMCBjb21wYXJldG90YWwgLTEgICAgLUluZiAgIC0+ICAxCitjb3R4ODExIGNvbXBhcmV0b3RhbCAtMCAgICAtSW5mICAgLT4gIDEKK2NvdHg4MTIgY29tcGFyZXRvdGFsICAwICAgIC1JbmYgICAtPiAgMQorY290eDgxMyBjb21wYXJldG90YWwgIDEgICAgLUluZiAgIC0+ICAxCitjb3R4ODE0IGNvbXBhcmV0b3RhbCAgMTAwMCAtSW5mICAgLT4gIDEKK2NvdHg4MTUgY29tcGFyZXRvdGFsICBJbmYgIC1JbmYgICAtPiAgMQorCitjb3R4ODIxIGNvbXBhcmV0b3RhbCAgTmFOIC1JbmYgICAgLT4gIDEKK2NvdHg4MjIgY29tcGFyZXRvdGFsICBOYU4gLTEwMDAgICAtPiAgMQorY290eDgyMyBjb21wYXJldG90YWwgIE5hTiAtMSAgICAgIC0+ICAxCitjb3R4ODI0IGNvbXBhcmV0b3RhbCAgTmFOIC0wICAgICAgLT4gIDEKK2NvdHg4MjUgY29tcGFyZXRvdGFsICBOYU4gIDAgICAgICAtPiAgMQorY290eDgyNiBjb21wYXJldG90YWwgIE5hTiAgMSAgICAgIC0+ICAxCitjb3R4ODI3IGNvbXBhcmV0b3RhbCAgTmFOICAxMDAwICAgLT4gIDEKK2NvdHg4MjggY29tcGFyZXRvdGFsICBOYU4gIEluZiAgICAtPiAgMQorY290eDgyOSBjb21wYXJldG90YWwgIE5hTiAgTmFOICAgIC0+ICAwCitjb3R4ODMwIGNvbXBhcmV0b3RhbCAtSW5mICBOYU4gICAgLT4gIC0xCitjb3R4ODMxIGNvbXBhcmV0b3RhbCAtMTAwMCBOYU4gICAgLT4gIC0xCitjb3R4ODMyIGNvbXBhcmV0b3RhbCAtMSAgICBOYU4gICAgLT4gIC0xCitjb3R4ODMzIGNvbXBhcmV0b3RhbCAtMCAgICBOYU4gICAgLT4gIC0xCitjb3R4ODM0IGNvbXBhcmV0b3RhbCAgMCAgICBOYU4gICAgLT4gIC0xCitjb3R4ODM1IGNvbXBhcmV0b3RhbCAgMSAgICBOYU4gICAgLT4gIC0xCitjb3R4ODM2IGNvbXBhcmV0b3RhbCAgMTAwMCBOYU4gICAgLT4gIC0xCitjb3R4ODM3IGNvbXBhcmV0b3RhbCAgSW5mICBOYU4gICAgLT4gIC0xCitjb3R4ODM4IGNvbXBhcmV0b3RhbCAtTmFOIC1OYU4gICAgLT4gIDAKK2NvdHg4MzkgY29tcGFyZXRvdGFsICtOYU4gLU5hTiAgICAtPiAgMQorY290eDg0MCBjb21wYXJldG90YWwgLU5hTiArTmFOICAgIC0+ICAtMQorCitjb3R4ODQxIGNvbXBhcmV0b3RhbCAgc05hTiAtc05hTiAgLT4gIDEKK2NvdHg4NDIgY29tcGFyZXRvdGFsICBzTmFOIC1OYU4gICAtPiAgMQorY290eDg0MyBjb21wYXJldG90YWwgIHNOYU4gLUluZiAgIC0+ICAxCitjb3R4ODQ0IGNvbXBhcmV0b3RhbCAgc05hTiAtMTAwMCAgLT4gIDEKK2NvdHg4NDUgY29tcGFyZXRvdGFsICBzTmFOIC0xICAgICAtPiAgMQorY290eDg0NiBjb21wYXJldG90YWwgIHNOYU4gLTAgICAgIC0+ICAxCitjb3R4ODQ3IGNvbXBhcmV0b3RhbCAgc05hTiAgMCAgICAgLT4gIDEKK2NvdHg4NDggY29tcGFyZXRvdGFsICBzTmFOICAxICAgICAtPiAgMQorY290eDg0OSBjb21wYXJldG90YWwgIHNOYU4gIDEwMDAgIC0+ICAxCitjb3R4ODUwIGNvbXBhcmV0b3RhbCAgc05hTiAgTmFOICAgLT4gIC0xCitjb3R4ODUxIGNvbXBhcmV0b3RhbCAgc05hTiBzTmFOICAgLT4gIDAKKworY290eDg1MiBjb21wYXJldG90YWwgLXNOYU4gc05hTiAgIC0+ICAtMQorY290eDg1MyBjb21wYXJldG90YWwgLU5hTiAgc05hTiAgIC0+ICAtMQorY290eDg1NCBjb21wYXJldG90YWwgLUluZiAgc05hTiAgIC0+ICAtMQorY290eDg1NSBjb21wYXJldG90YWwgLTEwMDAgc05hTiAgIC0+ICAtMQorY290eDg1NiBjb21wYXJldG90YWwgLTEgICAgc05hTiAgIC0+ICAtMQorY290eDg1NyBjb21wYXJldG90YWwgLTAgICAgc05hTiAgIC0+ICAtMQorY290eDg1OCBjb21wYXJldG90YWwgIDAgICAgc05hTiAgIC0+ICAtMQorY290eDg1OSBjb21wYXJldG90YWwgIDEgICAgc05hTiAgIC0+ICAtMQorY290eDg2MCBjb21wYXJldG90YWwgIDEwMDAgc05hTiAgIC0+ICAtMQorY290eDg2MSBjb21wYXJldG90YWwgIEluZiAgc05hTiAgIC0+ICAtMQorY290eDg2MiBjb21wYXJldG90YWwgIE5hTiAgc05hTiAgIC0+ICAxCitjb3R4ODYzIGNvbXBhcmV0b3RhbCAgc05hTiBzTmFOICAgLT4gIDAKKworY290eDg3MSBjb21wYXJldG90YWwgIC1zTmFOIC1zTmFOICAtPiAgMAorY290eDg3MiBjb21wYXJldG90YWwgIC1zTmFOIC1OYU4gICAtPiAgMQorY290eDg3MyBjb21wYXJldG90YWwgIC1zTmFOIC1JbmYgICAtPiAgLTEKK2NvdHg4NzQgY29tcGFyZXRvdGFsICAtc05hTiAtMTAwMCAgLT4gIC0xCitjb3R4ODc1IGNvbXBhcmV0b3RhbCAgLXNOYU4gLTEgICAgIC0+ICAtMQorY290eDg3NiBjb21wYXJldG90YWwgIC1zTmFOIC0wICAgICAtPiAgLTEKK2NvdHg4NzcgY29tcGFyZXRvdGFsICAtc05hTiAgMCAgICAgLT4gIC0xCitjb3R4ODc4IGNvbXBhcmV0b3RhbCAgLXNOYU4gIDEgICAgIC0+ICAtMQorY290eDg3OSBjb21wYXJldG90YWwgIC1zTmFOICAxMDAwICAtPiAgLTEKK2NvdHg4ODAgY29tcGFyZXRvdGFsICAtc05hTiAgTmFOICAgLT4gIC0xCitjb3R4ODgxIGNvbXBhcmV0b3RhbCAgLXNOYU4gc05hTiAgIC0+ICAtMQorCitjb3R4ODgyIGNvbXBhcmV0b3RhbCAtc05hTiAtc05hTiAgIC0+ICAwCitjb3R4ODgzIGNvbXBhcmV0b3RhbCAtTmFOICAtc05hTiAgIC0+ICAtMQorY290eDg4NCBjb21wYXJldG90YWwgLUluZiAgLXNOYU4gICAtPiAgMQorY290eDg4NSBjb21wYXJldG90YWwgLTEwMDAgLXNOYU4gICAtPiAgMQorY290eDg4NiBjb21wYXJldG90YWwgLTEgICAgLXNOYU4gICAtPiAgMQorY290eDg4NyBjb21wYXJldG90YWwgLTAgICAgLXNOYU4gICAtPiAgMQorY290eDg4OCBjb21wYXJldG90YWwgIDAgICAgLXNOYU4gICAtPiAgMQorY290eDg4OSBjb21wYXJldG90YWwgIDEgICAgLXNOYU4gICAtPiAgMQorY290eDg5MCBjb21wYXJldG90YWwgIDEwMDAgLXNOYU4gICAtPiAgMQorY290eDg5MSBjb21wYXJldG90YWwgIEluZiAgLXNOYU4gICAtPiAgMQorY290eDg5MiBjb21wYXJldG90YWwgIE5hTiAgLXNOYU4gICAtPiAgMQorY290eDg5MyBjb21wYXJldG90YWwgIHNOYU4gLXNOYU4gICAtPiAgMQorCistLSBOYU5zIHdpdGggcGF5bG9hZAorY290eDk2MCBjb21wYXJldG90YWwgIE5hTjkgLUluZiAgIC0+ICAxCitjb3R4OTYxIGNvbXBhcmV0b3RhbCAgTmFOOCAgOTk5ICAgLT4gIDEKK2NvdHg5NjIgY29tcGFyZXRvdGFsICBOYU43NyBJbmYgICAtPiAgMQorY290eDk2MyBjb21wYXJldG90YWwgLU5hTjY3IE5hTjUgIC0+ICAtMQorY290eDk2NCBjb21wYXJldG90YWwgLUluZiAgLU5hTjQgIC0+ICAxCitjb3R4OTY1IGNvbXBhcmV0b3RhbCAtOTk5ICAtTmFOMzMgLT4gIDEKK2NvdHg5NjYgY29tcGFyZXRvdGFsICBJbmYgICBOYU4yICAtPiAgLTEKKworY290eDk3MCBjb21wYXJldG90YWwgLU5hTjQxIC1OYU40MiAtPiAxCitjb3R4OTcxIGNvbXBhcmV0b3RhbCArTmFONDEgLU5hTjQyIC0+IDEKK2NvdHg5NzIgY29tcGFyZXRvdGFsIC1OYU40MSArTmFONDIgLT4gLTEKK2NvdHg5NzMgY29tcGFyZXRvdGFsICtOYU40MSArTmFONDIgLT4gLTEKK2NvdHg5NzQgY29tcGFyZXRvdGFsIC1OYU40MiAtTmFOMDEgLT4gLTEKK2NvdHg5NzUgY29tcGFyZXRvdGFsICtOYU40MiAtTmFOMDEgLT4gIDEKK2NvdHg5NzYgY29tcGFyZXRvdGFsIC1OYU40MiArTmFOMDEgLT4gLTEKK2NvdHg5NzcgY29tcGFyZXRvdGFsICtOYU40MiArTmFOMDEgLT4gIDEKKworY290eDk4MCBjb21wYXJldG90YWwgLXNOYU43NzEgLXNOYU43NzIgLT4gMQorY290eDk4MSBjb21wYXJldG90YWwgK3NOYU43NzEgLXNOYU43NzIgLT4gMQorY290eDk4MiBjb21wYXJldG90YWwgLXNOYU43NzEgK3NOYU43NzIgLT4gLTEKK2NvdHg5ODMgY29tcGFyZXRvdGFsICtzTmFONzcxICtzTmFONzcyIC0+IC0xCitjb3R4OTg0IGNvbXBhcmV0b3RhbCAtc05hTjc3MiAtc05hTjc3MSAtPiAtMQorY290eDk4NSBjb21wYXJldG90YWwgK3NOYU43NzIgLXNOYU43NzEgLT4gIDEKK2NvdHg5ODYgY29tcGFyZXRvdGFsIC1zTmFONzcyICtzTmFONzcxIC0+IC0xCitjb3R4OTg3IGNvbXBhcmV0b3RhbCArc05hTjc3MiArc05hTjc3MSAtPiAgMQorCitjb3R4OTkxIGNvbXBhcmV0b3RhbCAtc05hTjk5IC1JbmYgICAgLT4gLTEKK2NvdHg5OTIgY29tcGFyZXRvdGFsICBzTmFOOTggLTExICAgICAtPiAgMQorY290eDk5MyBjb21wYXJldG90YWwgIHNOYU45NyAgTmFOICAgIC0+IC0xCitjb3R4OTk0IGNvbXBhcmV0b3RhbCAgc05hTjE2IHNOYU45NCAgLT4gLTEKK2NvdHg5OTUgY29tcGFyZXRvdGFsICBOYU44NSAgc05hTjgzICAtPiAgMQorY290eDk5NiBjb21wYXJldG90YWwgLUluZiAgICBzTmFOOTIgIC0+IC0xCitjb3R4OTk3IGNvbXBhcmV0b3RhbCAgMDg4ICAgIHNOYU44MSAgLT4gLTEKK2NvdHg5OTggY29tcGFyZXRvdGFsICBJbmYgICAgc05hTjkwICAtPiAtMQorY290eDk5OSBjb21wYXJldG90YWwgIE5hTiAgIC1zTmFOODkgIC0+ICAxCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgLi4gc3Vibm9ybWFsIHJlc3VsdHMgbm93IGFsbG93ZWQKK21heEV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5Citjb3R4MTA4MCBjb21wYXJldG90YWwgKzEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5IC0+IC0xCitjb3R4MTA4MSBjb21wYXJldG90YWwgOUUrOTk5OTk5OTk5ICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+ICAxCitjb3R4MTA4MiBjb21wYXJldG90YWwgKzAuMTAwIDlFLTk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+ICAxCitjb3R4MTA4MyBjb21wYXJldG90YWwgOUUtOTk5OTk5OTk5ICswLjEwMCAgICAgICAgICAgICAgIC0+IC0xCitjb3R4MTA4NSBjb21wYXJldG90YWwgLTEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5IC0+IC0xCitjb3R4MTA4NiBjb21wYXJldG90YWwgOUUrOTk5OTk5OTk5IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+ICAxCitjb3R4MTA4NyBjb21wYXJldG90YWwgLTAuMTAwIDlFLTk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+IC0xCitjb3R4MTA4OCBjb21wYXJldG90YWwgOUUtOTk5OTk5OTk5IC0wLjEwMCAgICAgICAgICAgICAgIC0+ICAxCisKK2NvdHgxMDg5IGNvbXBhcmV0b3RhbCAxZS01OTk5OTk5OTkgMWUtNDAwMDAwMDAxICAgLT4gLTEKK2NvdHgxMDkwIGNvbXBhcmV0b3RhbCAxZS01OTk5OTk5OTkgMWUtNDAwMDAwMDAwICAgLT4gLTEKK2NvdHgxMDkxIGNvbXBhcmV0b3RhbCAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDAwICAgLT4gLTEKK2NvdHgxMDkyIGNvbXBhcmV0b3RhbCA5ZS05OTk5OTk5OTggMC4wMSAgICAgICAgICAgLT4gLTEKK2NvdHgxMDkzIGNvbXBhcmV0b3RhbCA5ZS05OTk5OTk5OTggMC4xICAgICAgICAgICAgLT4gLTEKK2NvdHgxMDk0IGNvbXBhcmV0b3RhbCAwLjAxIDllLTk5OTk5OTk5OCAgICAgICAgICAgLT4gIDEKK2NvdHgxMDk1IGNvbXBhcmV0b3RhbCAxZTU5OTk5OTk5OSAxZTQwMDAwMDAwMSAgICAgLT4gIDEKK2NvdHgxMDk2IGNvbXBhcmV0b3RhbCAxZTU5OTk5OTk5OSAxZTQwMDAwMDAwMCAgICAgLT4gIDEKK2NvdHgxMDk3IGNvbXBhcmV0b3RhbCAxZTYwMDAwMDAwMCAxZTQwMDAwMDAwMCAgICAgLT4gIDEKK2NvdHgxMDk4IGNvbXBhcmV0b3RhbCA5ZTk5OTk5OTk5OCAxMDAgICAgICAgICAgICAgLT4gIDEKK2NvdHgxMDk5IGNvbXBhcmV0b3RhbCA5ZTk5OTk5OTk5OCAxMCAgICAgICAgICAgICAgLT4gIDEKK2NvdHgxMTAwIGNvbXBhcmV0b3RhbCAxMDAgIDllOTk5OTk5OTk4ICAgICAgICAgICAgLT4gLTEKKy0tIHNpZ25zCitjb3R4MTEwMSBjb21wYXJldG90YWwgIDFlKzc3Nzc3Nzc3NyAgMWUrNDExMTExMTExIC0+ICAxCitjb3R4MTEwMiBjb21wYXJldG90YWwgIDFlKzc3Nzc3Nzc3NyAtMWUrNDExMTExMTExIC0+ICAxCitjb3R4MTEwMyBjb21wYXJldG90YWwgLTFlKzc3Nzc3Nzc3NyAgMWUrNDExMTExMTExIC0+IC0xCitjb3R4MTEwNCBjb21wYXJldG90YWwgLTFlKzc3Nzc3Nzc3NyAtMWUrNDExMTExMTExIC0+IC0xCitjb3R4MTEwNSBjb21wYXJldG90YWwgIDFlLTc3Nzc3Nzc3NyAgMWUtNDExMTExMTExIC0+IC0xCitjb3R4MTEwNiBjb21wYXJldG90YWwgIDFlLTc3Nzc3Nzc3NyAtMWUtNDExMTExMTExIC0+ICAxCitjb3R4MTEwNyBjb21wYXJldG90YWwgLTFlLTc3Nzc3Nzc3NyAgMWUtNDExMTExMTExIC0+IC0xCitjb3R4MTEwOCBjb21wYXJldG90YWwgLTFlLTc3Nzc3Nzc3NyAtMWUtNDExMTExMTExIC0+ICAxCisKKy0tIHNwcmVhZCB6ZXJvcworY290eDExMTAgY29tcGFyZXRvdGFsICAgMEUtMzgzICAwICAgICAgIC0+IC0xCitjb3R4MTExMSBjb21wYXJldG90YWwgICAwRS0zODMgLTAgICAgICAgLT4gIDEKK2NvdHgxMTEyIGNvbXBhcmV0b3RhbCAgLTBFLTM4MyAgMCAgICAgICAtPiAtMQorY290eDExMTMgY29tcGFyZXRvdGFsICAtMEUtMzgzIC0wICAgICAgIC0+ICAxCitjb3R4MTExNCBjb21wYXJldG90YWwgICAwRS0zODMgIDBFKzM4NCAgLT4gLTEKK2NvdHgxMTE1IGNvbXBhcmV0b3RhbCAgIDBFLTM4MyAtMEUrMzg0ICAtPiAgMQorY290eDExMTYgY29tcGFyZXRvdGFsICAtMEUtMzgzICAwRSszODQgIC0+IC0xCitjb3R4MTExNyBjb21wYXJldG90YWwgIC0wRS0zODMgLTBFKzM4NCAgLT4gIDEKK2NvdHgxMTE4IGNvbXBhcmV0b3RhbCAgIDAgICAgICAgMEUrMzg0ICAtPiAtMQorY290eDExMTkgY29tcGFyZXRvdGFsICAgMCAgICAgIC0wRSszODQgIC0+ICAxCitjb3R4MTEyMCBjb21wYXJldG90YWwgIC0wICAgICAgIDBFKzM4NCAgLT4gLTEKK2NvdHgxMTIxIGNvbXBhcmV0b3RhbCAgLTAgICAgICAtMEUrMzg0ICAtPiAgMQorCitjb3R4MTEzMCBjb21wYXJldG90YWwgICAwRSszODQgIDAgICAgICAgLT4gIDEKK2NvdHgxMTMxIGNvbXBhcmV0b3RhbCAgIDBFKzM4NCAtMCAgICAgICAtPiAgMQorY290eDExMzIgY29tcGFyZXRvdGFsICAtMEUrMzg0ICAwICAgICAgIC0+IC0xCitjb3R4MTEzMyBjb21wYXJldG90YWwgIC0wRSszODQgLTAgICAgICAgLT4gLTEKK2NvdHgxMTM0IGNvbXBhcmV0b3RhbCAgIDBFKzM4NCAgMEUtMzgzICAtPiAgMQorY290eDExMzUgY29tcGFyZXRvdGFsICAgMEUrMzg0IC0wRS0zODMgIC0+ICAxCitjb3R4MTEzNiBjb21wYXJldG90YWwgIC0wRSszODQgIDBFLTM4MyAgLT4gLTEKK2NvdHgxMTM3IGNvbXBhcmV0b3RhbCAgLTBFKzM4NCAtMEUtMzgzICAtPiAtMQorY290eDExMzggY29tcGFyZXRvdGFsICAgMCAgICAgICAwRS0zODMgIC0+ICAxCitjb3R4MTEzOSBjb21wYXJldG90YWwgICAwICAgICAgLTBFLTM4MyAgLT4gIDEKK2NvdHgxMTQwIGNvbXBhcmV0b3RhbCAgLTAgICAgICAgMEUtMzgzICAtPiAtMQorY290eDExNDEgY29tcGFyZXRvdGFsICAtMCAgICAgIC0wRS0zODMgIC0+IC0xCisKKy0tIE51bGwgdGVzdHMKK2NvdHg5OTkwIGNvbXBhcmV0b3RhbCAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2NvdHg5OTkxIGNvbXBhcmV0b3RhbCAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29tcGFyZXRvdG1hZy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb21wYXJldG90bWFnLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkZmRmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29tcGFyZXRvdG1hZy5kZWNUZXN0CkBAIC0wLDAgKzEsNzkwIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGNvbXBhcmV0b3RtYWcuZGVjVGVzdCAtLSBkZWNpbWFsIGNvbXBhcmlzb24sIGFicy4gdG90YWwgb3JkZXJpbmcgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gTm90ZSB0aGF0IGl0IGNhbm5vdCBiZSBhc3N1bWVkIHRoYXQgYWRkL3N1YnRyYWN0IHRlc3RzIGNvdmVyIHBhdGhzCistLSBmb3IgdGhpcyBvcGVyYXRpb24gYWRlcXVhdGVseSwgaGVyZSwgYmVjYXVzZSB0aGUgY29kZSBtaWdodCBiZQorLS0gcXVpdGUgZGlmZmVyZW50IChjb21wYXJpc29uIGNhbm5vdCBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHNvCistLSBhY3R1YWwgc3VidHJhY3Rpb25zIGFyZSBub3QgbmVjZXNzYXJ5KS4gU2ltaWxhcmx5LCBjb21wYXJldG90YWwKKy0tIHdpbGwgaGF2ZSBzb21lIHJhZGljYWxseSBkaWZmZXJlbnQgcGF0aHMgdGhhbiBjb21wYXJlLgorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKKworLS0gc2FuaXR5IGNoZWNrcworY3RteDAwMSBjb21wYXJldG90bWFnICAtMiAgLTIgICAtPiAgIDAKK2N0bXgwMDIgY29tcGFyZXRvdG1hZyAgLTIgIC0xICAgLT4gICAxCitjdG14MDAzIGNvbXBhcmV0b3RtYWcgIC0yICAgMCAgIC0+ICAgMQorY3RteDAwNCBjb21wYXJldG90bWFnICAtMiAgIDEgICAtPiAgIDEKK2N0bXgwMDUgY29tcGFyZXRvdG1hZyAgLTIgICAyICAgLT4gICAwCitjdG14MDA2IGNvbXBhcmV0b3RtYWcgIC0xICAtMiAgIC0+ICAtMQorY3RteDAwNyBjb21wYXJldG90bWFnICAtMSAgLTEgICAtPiAgIDAKK2N0bXgwMDggY29tcGFyZXRvdG1hZyAgLTEgICAwICAgLT4gICAxCitjdG14MDA5IGNvbXBhcmV0b3RtYWcgIC0xICAgMSAgIC0+ICAgMAorY3RteDAxMCBjb21wYXJldG90bWFnICAtMSAgIDIgICAtPiAgLTEKK2N0bXgwMTEgY29tcGFyZXRvdG1hZyAgIDAgIC0yICAgLT4gIC0xCitjdG14MDEyIGNvbXBhcmV0b3RtYWcgICAwICAtMSAgIC0+ICAtMQorY3RteDAxMyBjb21wYXJldG90bWFnICAgMCAgIDAgICAtPiAgIDAKK2N0bXgwMTQgY29tcGFyZXRvdG1hZyAgIDAgICAxICAgLT4gIC0xCitjdG14MDE1IGNvbXBhcmV0b3RtYWcgICAwICAgMiAgIC0+ICAtMQorY3RteDAxNiBjb21wYXJldG90bWFnICAgMSAgLTIgICAtPiAgLTEKK2N0bXgwMTcgY29tcGFyZXRvdG1hZyAgIDEgIC0xICAgLT4gICAwCitjdG14MDE4IGNvbXBhcmV0b3RtYWcgICAxICAgMCAgIC0+ICAgMQorY3RteDAxOSBjb21wYXJldG90bWFnICAgMSAgIDEgICAtPiAgIDAKK2N0bXgwMjAgY29tcGFyZXRvdG1hZyAgIDEgICAyICAgLT4gIC0xCitjdG14MDIxIGNvbXBhcmV0b3RtYWcgICAyICAtMiAgIC0+ICAgMAorY3RteDAyMiBjb21wYXJldG90bWFnICAgMiAgLTEgICAtPiAgIDEKK2N0bXgwMjMgY29tcGFyZXRvdG1hZyAgIDIgICAwICAgLT4gICAxCitjdG14MDI1IGNvbXBhcmV0b3RtYWcgICAyICAgMSAgIC0+ICAgMQorY3RteDAyNiBjb21wYXJldG90bWFnICAgMiAgIDIgICAtPiAgIDAKKworY3RteDAzMSBjb21wYXJldG90bWFnICAtMjAgIC0yMCAgIC0+ICAgMAorY3RteDAzMiBjb21wYXJldG90bWFnICAtMjAgIC0xMCAgIC0+ICAgMQorY3RteDAzMyBjb21wYXJldG90bWFnICAtMjAgICAwMCAgIC0+ICAgMQorY3RteDAzNCBjb21wYXJldG90bWFnICAtMjAgICAxMCAgIC0+ICAgMQorY3RteDAzNSBjb21wYXJldG90bWFnICAtMjAgICAyMCAgIC0+ICAgMAorY3RteDAzNiBjb21wYXJldG90bWFnICAtMTAgIC0yMCAgIC0+ICAtMQorY3RteDAzNyBjb21wYXJldG90bWFnICAtMTAgIC0xMCAgIC0+ICAgMAorY3RteDAzOCBjb21wYXJldG90bWFnICAtMTAgICAwMCAgIC0+ICAgMQorY3RteDAzOSBjb21wYXJldG90bWFnICAtMTAgICAxMCAgIC0+ICAgMAorY3RteDA0MCBjb21wYXJldG90bWFnICAtMTAgICAyMCAgIC0+ICAtMQorY3RteDA0MSBjb21wYXJldG90bWFnICAgMDAgIC0yMCAgIC0+ICAtMQorY3RteDA0MiBjb21wYXJldG90bWFnICAgMDAgIC0xMCAgIC0+ICAtMQorY3RteDA0MyBjb21wYXJldG90bWFnICAgMDAgICAwMCAgIC0+ICAgMAorY3RteDA0NCBjb21wYXJldG90bWFnICAgMDAgICAxMCAgIC0+ICAtMQorY3RteDA0NSBjb21wYXJldG90bWFnICAgMDAgICAyMCAgIC0+ICAtMQorY3RteDA0NiBjb21wYXJldG90bWFnICAgMTAgIC0yMCAgIC0+ICAtMQorY3RteDA0NyBjb21wYXJldG90bWFnICAgMTAgIC0xMCAgIC0+ICAgMAorY3RteDA0OCBjb21wYXJldG90bWFnICAgMTAgICAwMCAgIC0+ICAgMQorY3RteDA0OSBjb21wYXJldG90bWFnICAgMTAgICAxMCAgIC0+ICAgMAorY3RteDA1MCBjb21wYXJldG90bWFnICAgMTAgICAyMCAgIC0+ICAtMQorY3RteDA1MSBjb21wYXJldG90bWFnICAgMjAgIC0yMCAgIC0+ICAgMAorY3RteDA1MiBjb21wYXJldG90bWFnICAgMjAgIC0xMCAgIC0+ICAgMQorY3RteDA1MyBjb21wYXJldG90bWFnICAgMjAgICAwMCAgIC0+ICAgMQorY3RteDA1NSBjb21wYXJldG90bWFnICAgMjAgICAxMCAgIC0+ICAgMQorY3RteDA1NiBjb21wYXJldG90bWFnICAgMjAgICAyMCAgIC0+ICAgMAorCitjdG14MDYxIGNvbXBhcmV0b3RtYWcgIC0yLjAgIC0yLjAgICAtPiAgIDAKK2N0bXgwNjIgY29tcGFyZXRvdG1hZyAgLTIuMCAgLTEuMCAgIC0+ICAgMQorY3RteDA2MyBjb21wYXJldG90bWFnICAtMi4wICAgMC4wICAgLT4gICAxCitjdG14MDY0IGNvbXBhcmV0b3RtYWcgIC0yLjAgICAxLjAgICAtPiAgIDEKK2N0bXgwNjUgY29tcGFyZXRvdG1hZyAgLTIuMCAgIDIuMCAgIC0+ICAgMAorY3RteDA2NiBjb21wYXJldG90bWFnICAtMS4wICAtMi4wICAgLT4gIC0xCitjdG14MDY3IGNvbXBhcmV0b3RtYWcgIC0xLjAgIC0xLjAgICAtPiAgIDAKK2N0bXgwNjggY29tcGFyZXRvdG1hZyAgLTEuMCAgIDAuMCAgIC0+ICAgMQorY3RteDA2OSBjb21wYXJldG90bWFnICAtMS4wICAgMS4wICAgLT4gICAwCitjdG14MDcwIGNvbXBhcmV0b3RtYWcgIC0xLjAgICAyLjAgICAtPiAgLTEKK2N0bXgwNzEgY29tcGFyZXRvdG1hZyAgIDAuMCAgLTIuMCAgIC0+ICAtMQorY3RteDA3MiBjb21wYXJldG90bWFnICAgMC4wICAtMS4wICAgLT4gIC0xCitjdG14MDczIGNvbXBhcmV0b3RtYWcgICAwLjAgICAwLjAgICAtPiAgIDAKK2N0bXgwNzQgY29tcGFyZXRvdG1hZyAgIDAuMCAgIDEuMCAgIC0+ICAtMQorY3RteDA3NSBjb21wYXJldG90bWFnICAgMC4wICAgMi4wICAgLT4gIC0xCitjdG14MDc2IGNvbXBhcmV0b3RtYWcgICAxLjAgIC0yLjAgICAtPiAgLTEKK2N0bXgwNzcgY29tcGFyZXRvdG1hZyAgIDEuMCAgLTEuMCAgIC0+ICAgMAorY3RteDA3OCBjb21wYXJldG90bWFnICAgMS4wICAgMC4wICAgLT4gICAxCitjdG14MDc5IGNvbXBhcmV0b3RtYWcgICAxLjAgICAxLjAgICAtPiAgIDAKK2N0bXgwODAgY29tcGFyZXRvdG1hZyAgIDEuMCAgIDIuMCAgIC0+ICAtMQorY3RteDA4MSBjb21wYXJldG90bWFnICAgMi4wICAtMi4wICAgLT4gICAwCitjdG14MDgyIGNvbXBhcmV0b3RtYWcgICAyLjAgIC0xLjAgICAtPiAgIDEKK2N0bXgwODMgY29tcGFyZXRvdG1hZyAgIDIuMCAgIDAuMCAgIC0+ICAgMQorY3RteDA4NSBjb21wYXJldG90bWFnICAgMi4wICAgMS4wICAgLT4gICAxCitjdG14MDg2IGNvbXBhcmV0b3RtYWcgICAyLjAgICAyLjAgICAtPiAgIDAKKworLS0gbm93IHNvbWUgY2FzZXMgd2hpY2ggbWlnaHQgb3ZlcmZsb3cgaWYgc3VidHJhY3Qgd2VyZSB1c2VkCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorY3RteDA5MCBjb21wYXJldG90bWFnICA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgOS45OTk5OTk5OUUrOTk5OTk5OTk5ICAgLT4gICAwCitjdG14MDkxIGNvbXBhcmV0b3RtYWcgLTkuOTk5OTk5OTlFKzk5OTk5OTk5OSA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgICAtPiAgIDAKK2N0bXgwOTIgY29tcGFyZXRvdG1hZyAgOS45OTk5OTk5OUUrOTk5OTk5OTk5IC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgIC0+ICAgMAorY3RteDA5MyBjb21wYXJldG90bWFnIC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgLTkuOTk5OTk5OTlFKzk5OTk5OTk5OSAgLT4gICAwCisKKy0tIHNvbWUgZGlmZmVyaW5nIGxlbmd0aC9leHBvbmVudCBjYXNlcworLS0gaW4gdGhpcyBmaXJzdCBncm91cCwgY29tcGFyZSB3b3VsZCBjb21wYXJlIGFsbCBlcXVhbAorY3RteDEwMCBjb21wYXJldG90bWFnICAgNy4wICAgIDcuMCAgICAgLT4gICAwCitjdG14MTAxIGNvbXBhcmV0b3RtYWcgICA3LjAgICAgNyAgICAgICAtPiAgLTEKK2N0bXgxMDIgY29tcGFyZXRvdG1hZyAgIDcgICAgICA3LjAgICAgIC0+ICAgMQorY3RteDEwMyBjb21wYXJldG90bWFnICAgN0UrMCAgIDcuMCAgICAgLT4gICAxCitjdG14MTA0IGNvbXBhcmV0b3RtYWcgICA3MEUtMSAgNy4wICAgICAtPiAgIDAKK2N0bXgxMDUgY29tcGFyZXRvdG1hZyAgIDAuN0UrMSA3ICAgICAgIC0+ICAgMAorY3RteDEwNiBjb21wYXJldG90bWFnICAgNzBFLTEgIDcgICAgICAgLT4gIC0xCitjdG14MTA3IGNvbXBhcmV0b3RtYWcgICA3LjAgICAgN0UrMCAgICAtPiAgLTEKK2N0bXgxMDggY29tcGFyZXRvdG1hZyAgIDcuMCAgICA3MEUtMSAgIC0+ICAgMAorY3RteDEwOSBjb21wYXJldG90bWFnICAgNyAgICAgIDAuN0UrMSAgLT4gICAwCitjdG14MTEwIGNvbXBhcmV0b3RtYWcgICA3ICAgICAgNzBFLTEgICAtPiAgIDEKKworY3RteDEyMCBjb21wYXJldG90bWFnICAgOC4wICAgIDcuMCAgICAgLT4gICAxCitjdG14MTIxIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgNyAgICAgICAtPiAgIDEKK2N0bXgxMjIgY29tcGFyZXRvdG1hZyAgIDggICAgICA3LjAgICAgIC0+ICAgMQorY3RteDEyMyBjb21wYXJldG90bWFnICAgOEUrMCAgIDcuMCAgICAgLT4gICAxCitjdG14MTI0IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgNy4wICAgICAtPiAgIDEKK2N0bXgxMjUgY29tcGFyZXRvdG1hZyAgIDAuOEUrMSA3ICAgICAgIC0+ICAgMQorY3RteDEyNiBjb21wYXJldG90bWFnICAgODBFLTEgIDcgICAgICAgLT4gICAxCitjdG14MTI3IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgN0UrMCAgICAtPiAgIDEKK2N0bXgxMjggY29tcGFyZXRvdG1hZyAgIDguMCAgICA3MEUtMSAgIC0+ICAgMQorY3RteDEyOSBjb21wYXJldG90bWFnICAgOCAgICAgIDAuN0UrMSAgIC0+ICAgMQorY3RteDEzMCBjb21wYXJldG90bWFnICAgOCAgICAgIDcwRS0xICAgLT4gICAxCisKK2N0bXgxNDAgY29tcGFyZXRvdG1hZyAgIDguMCAgICA5LjAgICAgIC0+ICAtMQorY3RteDE0MSBjb21wYXJldG90bWFnICAgOC4wICAgIDkgICAgICAgLT4gIC0xCitjdG14MTQyIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgOS4wICAgICAtPiAgLTEKK2N0bXgxNDMgY29tcGFyZXRvdG1hZyAgIDhFKzAgICA5LjAgICAgIC0+ICAtMQorY3RteDE0NCBjb21wYXJldG90bWFnICAgODBFLTEgIDkuMCAgICAgLT4gIC0xCitjdG14MTQ1IGNvbXBhcmV0b3RtYWcgICAwLjhFKzEgOSAgICAgICAtPiAgLTEKK2N0bXgxNDYgY29tcGFyZXRvdG1hZyAgIDgwRS0xICA5ICAgICAgIC0+ICAtMQorY3RteDE0NyBjb21wYXJldG90bWFnICAgOC4wICAgIDlFKzAgICAgLT4gIC0xCitjdG14MTQ4IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgOTBFLTEgICAtPiAgLTEKK2N0bXgxNDkgY29tcGFyZXRvdG1hZyAgIDggICAgICAwLjlFKzEgIC0+ICAtMQorY3RteDE1MCBjb21wYXJldG90bWFnICAgOCAgICAgIDkwRS0xICAgLT4gIC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLSsgLi4KK2N0bXgyMDAgY29tcGFyZXRvdG1hZyAgLTcuMCAgICA3LjAgICAgIC0+ICAgMAorY3RteDIwMSBjb21wYXJldG90bWFnICAtNy4wICAgIDcgICAgICAgLT4gIC0xCitjdG14MjAyIGNvbXBhcmV0b3RtYWcgIC03ICAgICAgNy4wICAgICAtPiAgIDEKK2N0bXgyMDMgY29tcGFyZXRvdG1hZyAgLTdFKzAgICA3LjAgICAgIC0+ICAgMQorY3RteDIwNCBjb21wYXJldG90bWFnICAtNzBFLTEgIDcuMCAgICAgLT4gICAwCitjdG14MjA1IGNvbXBhcmV0b3RtYWcgIC0wLjdFKzEgNyAgICAgICAtPiAgIDAKK2N0bXgyMDYgY29tcGFyZXRvdG1hZyAgLTcwRS0xICA3ICAgICAgIC0+ICAtMQorY3RteDIwNyBjb21wYXJldG90bWFnICAtNy4wICAgIDdFKzAgICAgLT4gIC0xCitjdG14MjA4IGNvbXBhcmV0b3RtYWcgIC03LjAgICAgNzBFLTEgICAtPiAgIDAKK2N0bXgyMDkgY29tcGFyZXRvdG1hZyAgLTcgICAgICAwLjdFKzEgIC0+ICAgMAorY3RteDIxMCBjb21wYXJldG90bWFnICAtNyAgICAgIDcwRS0xICAgLT4gICAxCisKK2N0bXgyMjAgY29tcGFyZXRvdG1hZyAgLTguMCAgICA3LjAgICAgIC0+ICAgMQorY3RteDIyMSBjb21wYXJldG90bWFnICAtOC4wICAgIDcgICAgICAgLT4gICAxCitjdG14MjIyIGNvbXBhcmV0b3RtYWcgIC04ICAgICAgNy4wICAgICAtPiAgIDEKK2N0bXgyMjMgY29tcGFyZXRvdG1hZyAgLThFKzAgICA3LjAgICAgIC0+ICAgMQorY3RteDIyNCBjb21wYXJldG90bWFnICAtODBFLTEgIDcuMCAgICAgLT4gICAxCitjdG14MjI1IGNvbXBhcmV0b3RtYWcgIC0wLjhFKzEgNyAgICAgICAtPiAgIDEKK2N0bXgyMjYgY29tcGFyZXRvdG1hZyAgLTgwRS0xICA3ICAgICAgIC0+ICAgMQorY3RteDIyNyBjb21wYXJldG90bWFnICAtOC4wICAgIDdFKzAgICAgLT4gICAxCitjdG14MjI4IGNvbXBhcmV0b3RtYWcgIC04LjAgICAgNzBFLTEgICAtPiAgIDEKK2N0bXgyMjkgY29tcGFyZXRvdG1hZyAgLTggICAgICAwLjdFKzEgIC0+ICAgMQorY3RteDIzMCBjb21wYXJldG90bWFnICAtOCAgICAgIDcwRS0xICAgLT4gICAxCisKK2N0bXgyNDAgY29tcGFyZXRvdG1hZyAgLTguMCAgICA5LjAgICAgIC0+ICAtMQorY3RteDI0MSBjb21wYXJldG90bWFnICAtOC4wICAgIDkgICAgICAgLT4gIC0xCitjdG14MjQyIGNvbXBhcmV0b3RtYWcgIC04ICAgICAgOS4wICAgICAtPiAgLTEKK2N0bXgyNDMgY29tcGFyZXRvdG1hZyAgLThFKzAgICA5LjAgICAgIC0+ICAtMQorY3RteDI0NCBjb21wYXJldG90bWFnICAtODBFLTEgIDkuMCAgICAgLT4gIC0xCitjdG14MjQ1IGNvbXBhcmV0b3RtYWcgIC0wLjhFKzEgOSAgICAgICAtPiAgLTEKK2N0bXgyNDYgY29tcGFyZXRvdG1hZyAgLTgwRS0xICA5ICAgICAgIC0+ICAtMQorY3RteDI0NyBjb21wYXJldG90bWFnICAtOC4wICAgIDlFKzAgICAgLT4gIC0xCitjdG14MjQ4IGNvbXBhcmV0b3RtYWcgIC04LjAgICAgOTBFLTEgICAtPiAgLTEKK2N0bXgyNDkgY29tcGFyZXRvdG1hZyAgLTggICAgICAwLjlFKzEgIC0+ICAtMQorY3RteDI1MCBjb21wYXJldG90bWFnICAtOCAgICAgIDkwRS0xICAgLT4gIC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgKy0gLi4KK2N0bXgzMDAgY29tcGFyZXRvdG1hZyAgIDcuMCAgICAtNy4wICAgICAtPiAgIDAKK2N0bXgzMDEgY29tcGFyZXRvdG1hZyAgIDcuMCAgICAtNyAgICAgICAtPiAgLTEKK2N0bXgzMDIgY29tcGFyZXRvdG1hZyAgIDcgICAgICAtNy4wICAgICAtPiAgIDEKK2N0bXgzMDMgY29tcGFyZXRvdG1hZyAgIDdFKzAgICAtNy4wICAgICAtPiAgIDEKK2N0bXgzMDQgY29tcGFyZXRvdG1hZyAgIDcwRS0xICAtNy4wICAgICAtPiAgIDAKK2N0bXgzMDUgY29tcGFyZXRvdG1hZyAgIC43RSsxICAtNyAgICAgICAtPiAgIDAKK2N0bXgzMDYgY29tcGFyZXRvdG1hZyAgIDcwRS0xICAtNyAgICAgICAtPiAgLTEKK2N0bXgzMDcgY29tcGFyZXRvdG1hZyAgIDcuMCAgICAtN0UrMCAgICAtPiAgLTEKK2N0bXgzMDggY29tcGFyZXRvdG1hZyAgIDcuMCAgICAtNzBFLTEgICAtPiAgIDAKK2N0bXgzMDkgY29tcGFyZXRvdG1hZyAgIDcgICAgICAtLjdFKzEgICAtPiAgIDAKK2N0bXgzMTAgY29tcGFyZXRvdG1hZyAgIDcgICAgICAtNzBFLTEgICAtPiAgIDEKKworY3RteDMyMCBjb21wYXJldG90bWFnICAgOC4wICAgIC03LjAgICAgIC0+ICAgMQorY3RteDMyMSBjb21wYXJldG90bWFnICAgOC4wICAgIC03ICAgICAgIC0+ICAgMQorY3RteDMyMiBjb21wYXJldG90bWFnICAgOCAgICAgIC03LjAgICAgIC0+ICAgMQorY3RteDMyMyBjb21wYXJldG90bWFnICAgOEUrMCAgIC03LjAgICAgIC0+ICAgMQorY3RteDMyNCBjb21wYXJldG90bWFnICAgODBFLTEgIC03LjAgICAgIC0+ICAgMQorY3RteDMyNSBjb21wYXJldG90bWFnICAgLjhFKzEgIC03ICAgICAgIC0+ICAgMQorY3RteDMyNiBjb21wYXJldG90bWFnICAgODBFLTEgIC03ICAgICAgIC0+ICAgMQorY3RteDMyNyBjb21wYXJldG90bWFnICAgOC4wICAgIC03RSswICAgIC0+ICAgMQorY3RteDMyOCBjb21wYXJldG90bWFnICAgOC4wICAgIC03MEUtMSAgIC0+ICAgMQorY3RteDMyOSBjb21wYXJldG90bWFnICAgOCAgICAgIC0uN0UrMSAgIC0+ICAgMQorY3RteDMzMCBjb21wYXJldG90bWFnICAgOCAgICAgIC03MEUtMSAgIC0+ICAgMQorCitjdG14MzQwIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTkuMCAgICAgLT4gIC0xCitjdG14MzQxIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTkgICAgICAgLT4gIC0xCitjdG14MzQyIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgLTkuMCAgICAgLT4gIC0xCitjdG14MzQzIGNvbXBhcmV0b3RtYWcgICA4RSswICAgLTkuMCAgICAgLT4gIC0xCitjdG14MzQ0IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgLTkuMCAgICAgLT4gIC0xCitjdG14MzQ1IGNvbXBhcmV0b3RtYWcgICAuOEUrMSAgLTkgICAgICAgLT4gIC0xCitjdG14MzQ2IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgLTkgICAgICAgLT4gIC0xCitjdG14MzQ3IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTlFKzAgICAgLT4gIC0xCitjdG14MzQ4IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTkwRS0xICAgLT4gIC0xCitjdG14MzQ5IGNvbXBhcmV0b3RtYWcgICA4ICAgICAgLS45RSsxICAgLT4gIC0xCitjdG14MzUwIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgLTkwRS0xICAgLT4gIC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLS0gLi4KK2N0bXg0MDAgY29tcGFyZXRvdG1hZyAgIC03LjAgICAgLTcuMCAgICAgLT4gICAwCitjdG14NDAxIGNvbXBhcmV0b3RtYWcgICAtNy4wICAgIC03ICAgICAgIC0+ICAtMQorY3RteDQwMiBjb21wYXJldG90bWFnICAgLTcgICAgICAtNy4wICAgICAtPiAgIDEKK2N0bXg0MDMgY29tcGFyZXRvdG1hZyAgIC03RSswICAgLTcuMCAgICAgLT4gICAxCitjdG14NDA0IGNvbXBhcmV0b3RtYWcgICAtNzBFLTEgIC03LjAgICAgIC0+ICAgMAorY3RteDQwNSBjb21wYXJldG90bWFnICAgLS43RSsxICAtNyAgICAgICAtPiAgIDAKK2N0bXg0MDYgY29tcGFyZXRvdG1hZyAgIC03MEUtMSAgLTcgICAgICAgLT4gIC0xCitjdG14NDA3IGNvbXBhcmV0b3RtYWcgICAtNy4wICAgIC03RSswICAgIC0+ICAtMQorY3RteDQwOCBjb21wYXJldG90bWFnICAgLTcuMCAgICAtNzBFLTEgICAtPiAgIDAKK2N0bXg0MDkgY29tcGFyZXRvdG1hZyAgIC03ICAgICAgLS43RSsxICAgLT4gICAwCitjdG14NDEwIGNvbXBhcmV0b3RtYWcgICAtNyAgICAgIC03MEUtMSAgIC0+ICAgMQorCitjdG14NDIwIGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC03LjAgICAgIC0+ICAgMQorY3RteDQyMSBjb21wYXJldG90bWFnICAgLTguMCAgICAtNyAgICAgICAtPiAgIDEKK2N0bXg0MjIgY29tcGFyZXRvdG1hZyAgIC04ICAgICAgLTcuMCAgICAgLT4gICAxCitjdG14NDIzIGNvbXBhcmV0b3RtYWcgICAtOEUrMCAgIC03LjAgICAgIC0+ICAgMQorY3RteDQyNCBjb21wYXJldG90bWFnICAgLTgwRS0xICAtNy4wICAgICAtPiAgIDEKK2N0bXg0MjUgY29tcGFyZXRvdG1hZyAgIC0uOEUrMSAgLTcgICAgICAgLT4gICAxCitjdG14NDI2IGNvbXBhcmV0b3RtYWcgICAtODBFLTEgIC03ICAgICAgIC0+ICAgMQorY3RteDQyNyBjb21wYXJldG90bWFnICAgLTguMCAgICAtN0UrMCAgICAtPiAgIDEKK2N0bXg0MjggY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTcwRS0xICAgLT4gICAxCitjdG14NDI5IGNvbXBhcmV0b3RtYWcgICAtOCAgICAgIC0uN0UrMSAgIC0+ICAgMQorY3RteDQzMCBjb21wYXJldG90bWFnICAgLTggICAgICAtNzBFLTEgICAtPiAgIDEKKworY3RteDQ0MCBjb21wYXJldG90bWFnICAgLTguMCAgICAtOS4wICAgICAtPiAgLTEKK2N0bXg0NDEgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTkgICAgICAgLT4gIC0xCitjdG14NDQyIGNvbXBhcmV0b3RtYWcgICAtOCAgICAgIC05LjAgICAgIC0+ICAtMQorY3RteDQ0MyBjb21wYXJldG90bWFnICAgLThFKzAgICAtOS4wICAgICAtPiAgLTEKK2N0bXg0NDQgY29tcGFyZXRvdG1hZyAgIC04MEUtMSAgLTkuMCAgICAgLT4gIC0xCitjdG14NDQ1IGNvbXBhcmV0b3RtYWcgICAtLjhFKzEgIC05ICAgICAgIC0+ICAtMQorY3RteDQ0NiBjb21wYXJldG90bWFnICAgLTgwRS0xICAtOSAgICAgICAtPiAgLTEKK2N0bXg0NDcgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTlFKzAgICAgLT4gIC0xCitjdG14NDQ4IGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC05MEUtMSAgIC0+ICAtMQorY3RteDQ0OSBjb21wYXJldG90bWFnICAgLTggICAgICAtLjlFKzEgICAtPiAgLTEKK2N0bXg0NTAgY29tcGFyZXRvdG1hZyAgIC04ICAgICAgLTkwRS0xICAgLT4gIC0xCisKKworLS0gdGVzdGNhc2VzIHRoYXQgc3VidHJhY3QgdG8gbG90cyBvZiB6ZXJvcyBhdCBib3VuZGFyaWVzIFtwZ3JdCitwcmVjaXNpb246IDQwCitjdG14NDcwIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMDAwMDAwMDBFNzg5IDEyMy40NTZFNzg5ICAtPiAgLTEKK2N0bXg0NzEgY29tcGFyZXRvdG1hZyAxMjMuNDU2MDAwMDAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitjdG14NDcyIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMDAwMDAwRTc4OSAxMjMuNDU2RTc4OSAgLT4gIC0xCitjdG14NDczIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMDAwMDBFLTg5IDEyMy40NTZFLTg5ICAtPiAgLTEKK2N0bXg0NzQgY29tcGFyZXRvdG1hZyAxMjMuNDU2MDAwMDAwMDAwRTc4OSAxMjMuNDU2RTc4OSAgLT4gIC0xCitjdG14NDc1IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitjdG14NDc2IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMDBFNzg5IDEyMy40NTZFNzg5ICAtPiAgLTEKK2N0bXg0NzcgY29tcGFyZXRvdG1hZyAxMjMuNDU2MDAwMDAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitjdG14NDc4IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwRTc4OSAxMjMuNDU2RTc4OSAgLT4gIC0xCitjdG14NDc5IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDBFLTg5IDEyMy40NTZFLTg5ICAtPiAgLTEKK2N0bXg0ODAgY29tcGFyZXRvdG1hZyAxMjMuNDU2MDAwRTc4OSAxMjMuNDU2RTc4OSAgLT4gIC0xCitjdG14NDgxIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitjdG14NDgyIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjBFNzg5IDEyMy40NTZFNzg5ICAtPiAgLTEKK2N0bXg0ODMgY29tcGFyZXRvdG1hZyAxMjMuNDU2RS04OSAxMjMuNDU2RS04OSAgLT4gICAwCitjdG14NDg0IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDAwMDAwMDBFLTg5ICAtPiAgIDEKK2N0bXg0ODUgY29tcGFyZXRvdG1hZyAxMjMuNDU2RTc4OSAxMjMuNDU2MDAwMDAwMDAwMDAwRTc4OSAgLT4gICAxCitjdG14NDg2IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDAwMDAwRS04OSAgLT4gICAxCitjdG14NDg3IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwMDAwMDAwMDBFNzg5ICAtPiAgIDEKK2N0bXg0ODggY29tcGFyZXRvdG1hZyAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMDAwRS04OSAgLT4gICAxCitjdG14NDg5IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwMDAwMDAwRTc4OSAgLT4gICAxCitjdG14NDkwIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDBFLTg5ICAtPiAgIDEKK2N0bXg0OTEgY29tcGFyZXRvdG1hZyAxMjMuNDU2RTc4OSAxMjMuNDU2MDAwMDAwRTc4OSAgLT4gICAxCitjdG14NDkyIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwRS04OSAgLT4gICAxCitjdG14NDkzIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwMDBFNzg5ICAtPiAgIDEKK2N0bXg0OTQgY29tcGFyZXRvdG1hZyAxMjMuNDU2RS04OSAxMjMuNDU2MDAwRS04OSAgLT4gICAxCitjdG14NDk1IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwRTc4OSAgLT4gICAxCitjdG14NDk2IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjBFLTg5ICAtPiAgIDEKK2N0bXg0OTcgY29tcGFyZXRvdG1hZyAxMjMuNDU2RTc4OSAxMjMuNDU2RTc4OSAgLT4gICAwCisKKy0tIHdpZGUtcmFuZ2luZywgYXJvdW5kIHByZWNpc2lvbjsgc2lnbnMgZXF1YWwKK3ByZWNpc2lvbjogOQorY3RteDUwMCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTE1ICAgICAtPiAgIDEKK2N0bXg1MDEgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xNCAgICAgLT4gICAxCitjdG14NTAyIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTMgICAgIC0+ICAgMQorY3RteDUwMyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTEyICAgICAtPiAgIDEKK2N0bXg1MDQgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xMSAgICAgLT4gICAxCitjdG14NTA1IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTAgICAgIC0+ICAgMQorY3RteDUwNiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTkgICAgICAtPiAgIDEKK2N0bXg1MDcgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS04ICAgICAgLT4gICAxCitjdG14NTA4IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtNyAgICAgIC0+ICAgMQorY3RteDUwOSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTYgICAgICAtPiAgIDEKK2N0bXg1MTAgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS01ICAgICAgLT4gICAxCitjdG14NTExIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtNCAgICAgIC0+ICAgMQorY3RteDUxMiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTMgICAgICAtPiAgIDEKK2N0bXg1MTMgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0yICAgICAgLT4gICAxCitjdG14NTE0IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMSAgICAgIC0+ICAgMQorY3RteDUxNSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTAgICAgICAtPiAgIDAKK2N0bXg1MTYgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxICAgICAgLT4gIC0xCitjdG14NTE3IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMiAgICAgIC0+ICAtMQorY3RteDUxOCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzMgICAgICAtPiAgLTEKK2N0bXg1MTkgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSs0ICAgICAgLT4gIC0xCitjdG14NTIxIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrNSAgICAgIC0+ICAtMQorY3RteDUyMiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzYgICAgICAtPiAgLTEKK2N0bXg1MjMgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSs3ICAgICAgLT4gIC0xCitjdG14NTI0IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrOCAgICAgIC0+ICAtMQorY3RteDUyNSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzkgICAgICAtPiAgLTEKK2N0bXg1MjYgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxMCAgICAgLT4gIC0xCitjdG14NTI3IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTEgICAgIC0+ICAtMQorY3RteDUyOCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzEyICAgICAtPiAgLTEKK2N0bXg1MjkgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxMyAgICAgLT4gIC0xCitjdG14NTMwIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTQgICAgIC0+ICAtMQorY3RteDUzMSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzE1ICAgICAtPiAgLTEKKy0tIExSIHN3YXAKK2N0bXg1NDAgY29tcGFyZXRvdG1hZyAgICAxRS0xNSAgMSAgICAgICAgLT4gIC0xCitjdG14NTQxIGNvbXBhcmV0b3RtYWcgICAgMUUtMTQgIDEgICAgICAgIC0+ICAtMQorY3RteDU0MiBjb21wYXJldG90bWFnICAgIDFFLTEzICAxICAgICAgICAtPiAgLTEKK2N0bXg1NDMgY29tcGFyZXRvdG1hZyAgICAxRS0xMiAgMSAgICAgICAgLT4gIC0xCitjdG14NTQ0IGNvbXBhcmV0b3RtYWcgICAgMUUtMTEgIDEgICAgICAgIC0+ICAtMQorY3RteDU0NSBjb21wYXJldG90bWFnICAgIDFFLTEwICAxICAgICAgICAtPiAgLTEKK2N0bXg1NDYgY29tcGFyZXRvdG1hZyAgICAxRS05ICAgMSAgICAgICAgLT4gIC0xCitjdG14NTQ3IGNvbXBhcmV0b3RtYWcgICAgMUUtOCAgIDEgICAgICAgIC0+ICAtMQorY3RteDU0OCBjb21wYXJldG90bWFnICAgIDFFLTcgICAxICAgICAgICAtPiAgLTEKK2N0bXg1NDkgY29tcGFyZXRvdG1hZyAgICAxRS02ICAgMSAgICAgICAgLT4gIC0xCitjdG14NTUwIGNvbXBhcmV0b3RtYWcgICAgMUUtNSAgIDEgICAgICAgIC0+ICAtMQorY3RteDU1MSBjb21wYXJldG90bWFnICAgIDFFLTQgICAxICAgICAgICAtPiAgLTEKK2N0bXg1NTIgY29tcGFyZXRvdG1hZyAgICAxRS0zICAgMSAgICAgICAgLT4gIC0xCitjdG14NTUzIGNvbXBhcmV0b3RtYWcgICAgMUUtMiAgIDEgICAgICAgIC0+ICAtMQorY3RteDU1NCBjb21wYXJldG90bWFnICAgIDFFLTEgICAxICAgICAgICAtPiAgLTEKK2N0bXg1NTUgY29tcGFyZXRvdG1hZyAgICAxRS0wICAgMSAgICAgICAgLT4gICAwCitjdG14NTU2IGNvbXBhcmV0b3RtYWcgICAgMUUrMSAgIDEgICAgICAgIC0+ICAgMQorY3RteDU1NyBjb21wYXJldG90bWFnICAgIDFFKzIgICAxICAgICAgICAtPiAgIDEKK2N0bXg1NTggY29tcGFyZXRvdG1hZyAgICAxRSszICAgMSAgICAgICAgLT4gICAxCitjdG14NTU5IGNvbXBhcmV0b3RtYWcgICAgMUUrNCAgIDEgICAgICAgIC0+ICAgMQorY3RteDU2MSBjb21wYXJldG90bWFnICAgIDFFKzUgICAxICAgICAgICAtPiAgIDEKK2N0bXg1NjIgY29tcGFyZXRvdG1hZyAgICAxRSs2ICAgMSAgICAgICAgLT4gICAxCitjdG14NTYzIGNvbXBhcmV0b3RtYWcgICAgMUUrNyAgIDEgICAgICAgIC0+ICAgMQorY3RteDU2NCBjb21wYXJldG90bWFnICAgIDFFKzggICAxICAgICAgICAtPiAgIDEKK2N0bXg1NjUgY29tcGFyZXRvdG1hZyAgICAxRSs5ICAgMSAgICAgICAgLT4gICAxCitjdG14NTY2IGNvbXBhcmV0b3RtYWcgICAgMUUrMTAgIDEgICAgICAgIC0+ICAgMQorY3RteDU2NyBjb21wYXJldG90bWFnICAgIDFFKzExICAxICAgICAgICAtPiAgIDEKK2N0bXg1NjggY29tcGFyZXRvdG1hZyAgICAxRSsxMiAgMSAgICAgICAgLT4gICAxCitjdG14NTY5IGNvbXBhcmV0b3RtYWcgICAgMUUrMTMgIDEgICAgICAgIC0+ICAgMQorY3RteDU3MCBjb21wYXJldG90bWFnICAgIDFFKzE0ICAxICAgICAgICAtPiAgIDEKK2N0bXg1NzEgY29tcGFyZXRvdG1hZyAgICAxRSsxNSAgMSAgICAgICAgLT4gICAxCistLSBzaW1pbGFyIHdpdGggYW4gdXNlZnVsIGNvZWZmaWNpZW50LCBvbmUgc2lkZSBvbmx5CitjdG14NTgwIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNSAgICAgLT4gICAxCitjdG14NTgxIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNCAgICAgLT4gICAxCitjdG14NTgyIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMyAgICAgLT4gICAxCitjdG14NTgzIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMiAgICAgLT4gICAxCitjdG14NTg0IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMSAgICAgLT4gICAxCitjdG14NTg1IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMCAgICAgLT4gICAxCitjdG14NTg2IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS05ICAgICAgLT4gICAxCitjdG14NTg3IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS04ICAgICAgLT4gICAxCitjdG14NTg4IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS03ICAgICAgLT4gICAxCitjdG14NTg5IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS02ICAgICAgLT4gIC0xCitjdG14NTkwIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS01ICAgICAgLT4gIC0xCitjdG14NTkxIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS00ICAgICAgLT4gIC0xCitjdG14NTkyIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0zICAgICAgLT4gIC0xCitjdG14NTkzIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0yICAgICAgLT4gIC0xCitjdG14NTk0IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xICAgICAgLT4gIC0xCitjdG14NTk1IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0wICAgICAgLT4gIC0xCitjdG14NTk2IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsxICAgICAgLT4gIC0xCitjdG14NTk3IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsyICAgICAgLT4gIC0xCitjdG14NTk4IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSszICAgICAgLT4gIC0xCitjdG14NTk5IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSs0ICAgICAgLT4gIC0xCisKKy0tIGNoZWNrIHNvbWUgdW5pdC15IHRyYXBzCitwcmVjaXNpb246IDIwCitjdG14NjAwIGNvbXBhcmV0b3RtYWcgICAxMiAgICAgICAgICAgIDEyLjIzNDUgIC0+ICAtMQorY3RteDYwMSBjb21wYXJldG90bWFnICAgMTIuMCAgICAgICAgICAxMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MDIgY29tcGFyZXRvdG1hZyAgIDEyLjAwICAgICAgICAgMTIuMjM0NSAgLT4gIC0xCitjdG14NjAzIGNvbXBhcmV0b3RtYWcgICAxMi4wMDAgICAgICAgIDEyLjIzNDUgIC0+ICAtMQorY3RteDYwNCBjb21wYXJldG90bWFnICAgMTIuMDAwMCAgICAgICAxMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MDUgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwICAgICAgMTIuMjM0NSAgLT4gIC0xCitjdG14NjA2IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAgICAgIDEyLjIzNDUgIC0+ICAtMQorY3RteDYwNyBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwMCAgICAxMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MDggY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMDAwICAgMTIuMjM0NSAgLT4gIC0xCitjdG14NjA5IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAwMDAgIDEyLjIzNDUgIC0+ICAtMQorY3RteDYxMCBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMiAgICAgICAgICAgICAtPiAgIDEKK2N0bXg2MTEgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMCAgICAgICAgICAgLT4gICAxCitjdG14NjEyIGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwICAgICAgICAgIC0+ICAgMQorY3RteDYxMyBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAgICAgICAgICAtPiAgIDEKK2N0bXg2MTQgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwMCAgICAgICAgLT4gICAxCitjdG14NjE1IGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMDAwICAgICAgIC0+ICAgMQorY3RteDYxNiBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAwMDAgICAgICAtPiAgIDEKK2N0bXg2MTcgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwMDAwMCAgICAgLT4gICAxCitjdG14NjE4IGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMDAwMDAwICAgIC0+ICAgMQorY3RteDYxOSBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAwMDAwMDAgICAtPiAgIDEKK2N0bXg2MjAgY29tcGFyZXRvdG1hZyAgLTEyICAgICAgICAgICAtMTIuMjM0NSAgLT4gIC0xCitjdG14NjIxIGNvbXBhcmV0b3RtYWcgIC0xMi4wICAgICAgICAgLTEyLjIzNDUgIC0+ICAtMQorY3RteDYyMiBjb21wYXJldG90bWFnICAtMTIuMDAgICAgICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MjMgY29tcGFyZXRvdG1hZyAgLTEyLjAwMCAgICAgICAtMTIuMjM0NSAgLT4gIC0xCitjdG14NjI0IGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAwICAgICAgLTEyLjIzNDUgIC0+ICAtMQorY3RteDYyNSBjb21wYXJldG90bWFnICAtMTIuMDAwMDAgICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MjYgY29tcGFyZXRvdG1hZyAgLTEyLjAwMDAwMCAgICAtMTIuMjM0NSAgLT4gIC0xCitjdG14NjI3IGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAwMDAwICAgLTEyLjIzNDUgIC0+ICAtMQorY3RteDYyOCBjb21wYXJldG90bWFnICAtMTIuMDAwMDAwMDAgIC0xMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MjkgY29tcGFyZXRvdG1hZyAgLTEyLjAwMDAwMDAwMCAtMTIuMjM0NSAgLT4gIC0xCitjdG14NjMwIGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMiAgICAgICAgICAgIC0+ICAgMQorY3RteDYzMSBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMCAgICAgICAgICAtPiAgIDEKK2N0bXg2MzIgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwICAgICAgICAgLT4gICAxCitjdG14NjMzIGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAgICAgICAgIC0+ICAgMQorY3RteDYzNCBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwMCAgICAgICAtPiAgIDEKK2N0bXg2MzUgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMDAwICAgICAgLT4gICAxCitjdG14NjM2IGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAgICAgIC0+ICAgMQorY3RteDYzNyBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwMDAwMCAgICAtPiAgIDEKK2N0bXg2MzggY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwICAgLT4gICAxCitjdG14NjM5IGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMDAgIC0+ICAgMQorcHJlY2lzaW9uOiA5CisKKy0tIGV4dGVuZGVkIHplcm9zCitjdG14NjQwIGNvbXBhcmV0b3RtYWcgICAwICAgICAwICAgIC0+ICAgMAorY3RteDY0MSBjb21wYXJldG90bWFnICAgMCAgICAtMCAgICAtPiAgIDAKK2N0bXg2NDIgY29tcGFyZXRvdG1hZyAgIDAgICAgLTAuMCAgLT4gICAxCitjdG14NjQzIGNvbXBhcmV0b3RtYWcgICAwICAgICAwLjAgIC0+ICAgMQorY3RteDY0NCBjb21wYXJldG90bWFnICAtMCAgICAgMCAgICAtPiAgIDAKK2N0bXg2NDUgY29tcGFyZXRvdG1hZyAgLTAgICAgLTAgICAgLT4gICAwCitjdG14NjQ2IGNvbXBhcmV0b3RtYWcgIC0wICAgIC0wLjAgIC0+ICAgMQorY3RteDY0NyBjb21wYXJldG90bWFnICAtMCAgICAgMC4wICAtPiAgIDEKK2N0bXg2NDggY29tcGFyZXRvdG1hZyAgIDAuMCAgIDAgICAgLT4gIC0xCitjdG14NjQ5IGNvbXBhcmV0b3RtYWcgICAwLjAgIC0wICAgIC0+ICAtMQorY3RteDY1MCBjb21wYXJldG90bWFnICAgMC4wICAtMC4wICAtPiAgIDAKK2N0bXg2NTEgY29tcGFyZXRvdG1hZyAgIDAuMCAgIDAuMCAgLT4gICAwCitjdG14NjUyIGNvbXBhcmV0b3RtYWcgIC0wLjAgICAwICAgIC0+ICAtMQorY3RteDY1MyBjb21wYXJldG90bWFnICAtMC4wICAtMCAgICAtPiAgLTEKK2N0bXg2NTQgY29tcGFyZXRvdG1hZyAgLTAuMCAgLTAuMCAgLT4gICAwCitjdG14NjU1IGNvbXBhcmV0b3RtYWcgIC0wLjAgICAwLjAgIC0+ICAgMAorCitjdG14NjU2IGNvbXBhcmV0b3RtYWcgIC0wRTEgICAwLjAgIC0+ICAgMQorY3RteDY1NyBjb21wYXJldG90bWFnICAtMEUyICAgMC4wICAtPiAgIDEKK2N0bXg2NTggY29tcGFyZXRvdG1hZyAgIDBFMSAgIDAuMCAgLT4gICAxCitjdG14NjU5IGNvbXBhcmV0b3RtYWcgICAwRTIgICAwLjAgIC0+ICAgMQorY3RteDY2MCBjb21wYXJldG90bWFnICAtMEUxICAgMCAgICAtPiAgIDEKK2N0bXg2NjEgY29tcGFyZXRvdG1hZyAgLTBFMiAgIDAgICAgLT4gICAxCitjdG14NjYyIGNvbXBhcmV0b3RtYWcgICAwRTEgICAwICAgIC0+ICAgMQorY3RteDY2MyBjb21wYXJldG90bWFnICAgMEUyICAgMCAgICAtPiAgIDEKK2N0bXg2NjQgY29tcGFyZXRvdG1hZyAgLTBFMSAgLTBFMSAgLT4gICAwCitjdG14NjY1IGNvbXBhcmV0b3RtYWcgIC0wRTIgIC0wRTEgIC0+ICAgMQorY3RteDY2NiBjb21wYXJldG90bWFnICAgMEUxICAtMEUxICAtPiAgIDAKK2N0bXg2NjcgY29tcGFyZXRvdG1hZyAgIDBFMiAgLTBFMSAgLT4gICAxCitjdG14NjY4IGNvbXBhcmV0b3RtYWcgIC0wRTEgIC0wRTIgIC0+ICAtMQorY3RteDY2OSBjb21wYXJldG90bWFnICAtMEUyICAtMEUyICAtPiAgIDAKK2N0bXg2NzAgY29tcGFyZXRvdG1hZyAgIDBFMSAgLTBFMiAgLT4gIC0xCitjdG14NjcxIGNvbXBhcmV0b3RtYWcgICAwRTIgIC0wRTIgIC0+ICAgMAorY3RteDY3MiBjb21wYXJldG90bWFnICAtMEUxICAgMEUxICAtPiAgIDAKK2N0bXg2NzMgY29tcGFyZXRvdG1hZyAgLTBFMiAgIDBFMSAgLT4gICAxCitjdG14Njc0IGNvbXBhcmV0b3RtYWcgICAwRTEgICAwRTEgIC0+ICAgMAorY3RteDY3NSBjb21wYXJldG90bWFnICAgMEUyICAgMEUxICAtPiAgIDEKK2N0bXg2NzYgY29tcGFyZXRvdG1hZyAgLTBFMSAgIDBFMiAgLT4gIC0xCitjdG14Njc3IGNvbXBhcmV0b3RtYWcgIC0wRTIgICAwRTIgIC0+ICAgMAorY3RteDY3OCBjb21wYXJldG90bWFnICAgMEUxICAgMEUyICAtPiAgLTEKK2N0bXg2NzkgY29tcGFyZXRvdG1hZyAgIDBFMiAgIDBFMiAgLT4gICAwCisKKy0tIHRyYWlsaW5nIHplcm9zOyB1bml0LXkKK3ByZWNpc2lvbjogMjAKK2N0bXg2ODAgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyICAgICAgICAgICAgLT4gICAwCitjdG14NjgxIGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wICAgICAgICAgIC0+ICAgMQorY3RteDY4MiBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAgICAgICAgICAtPiAgIDEKK2N0bXg2ODMgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMCAgICAgICAgLT4gICAxCitjdG14Njg0IGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAwICAgICAgIC0+ICAgMQorY3RteDY4NSBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwMDAgICAgICAtPiAgIDEKK2N0bXg2ODYgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMDAwMCAgICAgLT4gICAxCitjdG14Njg3IGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAwMDAwICAgIC0+ICAgMQorY3RteDY4OCBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwMDAwMDAgICAtPiAgIDEKK2N0bXg2ODkgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMDAwMDAwMCAgLT4gICAxCitjdG14NjkwIGNvbXBhcmV0b3RtYWcgICAxMiAgICAgICAgICAgICAgMTIgIC0+ICAgMAorY3RteDY5MSBjb21wYXJldG90bWFnICAgMTIuMCAgICAgICAgICAgIDEyICAtPiAgLTEKK2N0bXg2OTIgY29tcGFyZXRvdG1hZyAgIDEyLjAwICAgICAgICAgICAxMiAgLT4gIC0xCitjdG14NjkzIGNvbXBhcmV0b3RtYWcgICAxMi4wMDAgICAgICAgICAgMTIgIC0+ICAtMQorY3RteDY5NCBjb21wYXJldG90bWFnICAgMTIuMDAwMCAgICAgICAgIDEyICAtPiAgLTEKK2N0bXg2OTUgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwICAgICAgICAxMiAgLT4gIC0xCitjdG14Njk2IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAgICAgICAgMTIgIC0+ICAtMQorY3RteDY5NyBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwMCAgICAgIDEyICAtPiAgLTEKK2N0bXg2OTggY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMDAwICAgICAxMiAgLT4gIC0xCitjdG14Njk5IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAwMDAgICAgMTIgIC0+ICAtMQorCistLSBsb25nIG9wZXJhbmQgY2hlY2tzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CitjdG14NzAxIGNvbXBhcmV0b3RtYWcgMTIzNDU2NzgwMDAgIDEgIC0+ICAgMQorY3RteDcwMiBjb21wYXJldG90bWFnIDEgMTIzNDU2NzgwMDAgICAtPiAgLTEKK2N0bXg3MDMgY29tcGFyZXRvdG1hZyAxMjM0NTY3ODAwICAgMSAgLT4gICAxCitjdG14NzA0IGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODAwICAgIC0+ICAtMQorY3RteDcwNSBjb21wYXJldG90bWFnIDEyMzQ1Njc4OTAgICAxICAtPiAgIDEKK2N0bXg3MDYgY29tcGFyZXRvdG1hZyAxIDEyMzQ1Njc4OTAgICAgLT4gIC0xCitjdG14NzA3IGNvbXBhcmV0b3RtYWcgMTIzNDU2Nzg5MSAgIDEgIC0+ICAgMQorY3RteDcwOCBjb21wYXJldG90bWFnIDEgMTIzNDU2Nzg5MSAgICAtPiAgLTEKK2N0bXg3MDkgY29tcGFyZXRvdG1hZyAxMjM0NTY3ODkwMSAgMSAgLT4gICAxCitjdG14NzEwIGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODkwMSAgIC0+ICAtMQorY3RteDcxMSBjb21wYXJldG90bWFnIDEyMzQ1Njc4OTYgICAxICAtPiAgIDEKK2N0bXg3MTIgY29tcGFyZXRvdG1hZyAxIDEyMzQ1Njc4OTYgICAgLT4gIC0xCitjdG14NzEzIGNvbXBhcmV0b3RtYWcgLTEyMzQ1Njc4OTEgIDEgIC0+ICAgMQorY3RteDcxNCBjb21wYXJldG90bWFnIDEgLTEyMzQ1Njc4OTEgICAtPiAgLTEKK2N0bXg3MTUgY29tcGFyZXRvdG1hZyAtMTIzNDU2Nzg5MDEgMSAgLT4gICAxCitjdG14NzE2IGNvbXBhcmV0b3RtYWcgMSAtMTIzNDU2Nzg5MDEgIC0+ICAtMQorY3RteDcxNyBjb21wYXJldG90bWFnIC0xMjM0NTY3ODk2ICAxICAtPiAgIDEKK2N0bXg3MTggY29tcGFyZXRvdG1hZyAxIC0xMjM0NTY3ODk2ICAgLT4gIC0xCisKK3ByZWNpc2lvbjogMTUKKy0tIHNhbWUgd2l0aCBwbGVudHkgb2YgcHJlY2lzaW9uCitjdG14NzIxIGNvbXBhcmV0b3RtYWcgMTIzNDU2NzgwMDAgMSAgLT4gICAxCitjdG14NzIyIGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODAwMCAgLT4gIC0xCitjdG14NzIzIGNvbXBhcmV0b3RtYWcgMTIzNDU2NzgwMCAgMSAgLT4gICAxCitjdG14NzI0IGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODAwICAgLT4gIC0xCitjdG14NzI1IGNvbXBhcmV0b3RtYWcgMTIzNDU2Nzg5MCAgMSAgLT4gICAxCitjdG14NzI2IGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODkwICAgLT4gIC0xCitjdG14NzI3IGNvbXBhcmV0b3RtYWcgMTIzNDU2Nzg5MSAgMSAgLT4gICAxCitjdG14NzI4IGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODkxICAgLT4gIC0xCitjdG14NzI5IGNvbXBhcmV0b3RtYWcgMTIzNDU2Nzg5MDEgMSAgLT4gICAxCitjdG14NzMwIGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODkwMSAgLT4gIC0xCitjdG14NzMxIGNvbXBhcmV0b3RtYWcgMTIzNDU2Nzg5NiAgMSAgLT4gICAxCitjdG14NzMyIGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODk2ICAgLT4gIC0xCisKKy0tIHJlc2lkdWUgY2FzZXMKK3ByZWNpc2lvbjogNQorY3RteDc0MCBjb21wYXJldG90bWFnICAxICAwLjk5OTk5OTkgICAtPiAgIDEKK2N0bXg3NDEgY29tcGFyZXRvdG1hZyAgMSAgMC45OTk5OTkgICAgLT4gICAxCitjdG14NzQyIGNvbXBhcmV0b3RtYWcgIDEgIDAuOTk5OTkgICAgIC0+ICAgMQorY3RteDc0MyBjb21wYXJldG90bWFnICAxICAxLjAwMDAgICAgICAtPiAgIDEKK2N0bXg3NDQgY29tcGFyZXRvdG1hZyAgMSAgMS4wMDAwMSAgICAgLT4gIC0xCitjdG14NzQ1IGNvbXBhcmV0b3RtYWcgIDEgIDEuMDAwMDAxICAgIC0+ICAtMQorY3RteDc0NiBjb21wYXJldG90bWFnICAxICAxLjAwMDAwMDEgICAtPiAgLTEKK2N0bXg3NTAgY29tcGFyZXRvdG1hZyAgMC45OTk5OTk5ICAxICAgLT4gIC0xCitjdG14NzUxIGNvbXBhcmV0b3RtYWcgIDAuOTk5OTk5ICAgMSAgIC0+ICAtMQorY3RteDc1MiBjb21wYXJldG90bWFnICAwLjk5OTk5ICAgIDEgICAtPiAgLTEKK2N0bXg3NTMgY29tcGFyZXRvdG1hZyAgMS4wMDAwICAgICAxICAgLT4gIC0xCitjdG14NzU0IGNvbXBhcmV0b3RtYWcgIDEuMDAwMDEgICAgMSAgIC0+ICAgMQorY3RteDc1NSBjb21wYXJldG90bWFnICAxLjAwMDAwMSAgIDEgICAtPiAgIDEKK2N0bXg3NTYgY29tcGFyZXRvdG1hZyAgMS4wMDAwMDAxICAxICAgLT4gICAxCisKKy0tIGEgc2VsZWN0aW9uIG9mIGxvbmdpZXMKK2N0bXg3NjAgY29tcGFyZXRvdG1hZyAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTU4MzA2MjkuODM0NzA4NTAyNTgwODc1NjU2MDM1Nzk0MCAgLT4gICAxCitjdG14NzYxIGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAgMAorY3RteDc2MiBjb21wYXJldG90bWFnIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgIDEKK2N0bXg3NjMgY29tcGFyZXRvdG1hZyAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljk0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAgLT4gIC0xCistLSBwcmVjaXNpb25zIGFib3ZlIG9yIGJlbG93IHRoZSBkaWZmZXJlbmNlIHNob3VsZCBoYXZlIG5vIGVmZmVjdAorcHJlY2lzaW9uOiAgIDExCitjdG14NzY0IGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAtMQorcHJlY2lzaW9uOiAgIDEwCitjdG14NzY1IGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAtMQorcHJlY2lzaW9uOiAgICA5CitjdG14NzY2IGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAtMQorcHJlY2lzaW9uOiAgICA4CitjdG14NzY3IGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAtMQorcHJlY2lzaW9uOiAgICA3CitjdG14NzY4IGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAtMQorcHJlY2lzaW9uOiAgICA2CitjdG14NzY5IGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAtMQorcHJlY2lzaW9uOiAgICA1CitjdG14NzcwIGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAtMQorcHJlY2lzaW9uOiAgICA0CitjdG14NzcxIGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAtMQorcHJlY2lzaW9uOiAgICAzCitjdG14NzcyIGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAtMQorcHJlY2lzaW9uOiAgICAyCitjdG14NzczIGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAtMQorcHJlY2lzaW9uOiAgICAxCitjdG14Nzc0IGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAtMQorCistLSBTcGVjaWFscworcHJlY2lzaW9uOiAgIDkKK2N0bXg3ODAgY29tcGFyZXRvdG1hZyAgSW5mICAtSW5mICAgLT4gIDAKK2N0bXg3ODEgY29tcGFyZXRvdG1hZyAgSW5mICAtMTAwMCAgLT4gIDEKK2N0bXg3ODIgY29tcGFyZXRvdG1hZyAgSW5mICAtMSAgICAgLT4gIDEKK2N0bXg3ODMgY29tcGFyZXRvdG1hZyAgSW5mICAtMCAgICAgLT4gIDEKK2N0bXg3ODQgY29tcGFyZXRvdG1hZyAgSW5mICAgMCAgICAgLT4gIDEKK2N0bXg3ODUgY29tcGFyZXRvdG1hZyAgSW5mICAgMSAgICAgLT4gIDEKK2N0bXg3ODYgY29tcGFyZXRvdG1hZyAgSW5mICAgMTAwMCAgLT4gIDEKK2N0bXg3ODcgY29tcGFyZXRvdG1hZyAgSW5mICAgSW5mICAgLT4gIDAKK2N0bXg3ODggY29tcGFyZXRvdG1hZyAtMTAwMCAgSW5mICAgLT4gLTEKK2N0bXg3ODkgY29tcGFyZXRvdG1hZyAtSW5mICAgSW5mICAgLT4gIDAKK2N0bXg3OTAgY29tcGFyZXRvdG1hZyAtMSAgICAgSW5mICAgLT4gLTEKK2N0bXg3OTEgY29tcGFyZXRvdG1hZyAtMCAgICAgSW5mICAgLT4gLTEKK2N0bXg3OTIgY29tcGFyZXRvdG1hZyAgMCAgICAgSW5mICAgLT4gLTEKK2N0bXg3OTMgY29tcGFyZXRvdG1hZyAgMSAgICAgSW5mICAgLT4gLTEKK2N0bXg3OTQgY29tcGFyZXRvdG1hZyAgMTAwMCAgSW5mICAgLT4gLTEKK2N0bXg3OTUgY29tcGFyZXRvdG1hZyAgSW5mICAgSW5mICAgLT4gIDAKKworY3RteDgwMCBjb21wYXJldG90bWFnIC1JbmYgIC1JbmYgICAtPiAgMAorY3RteDgwMSBjb21wYXJldG90bWFnIC1JbmYgIC0xMDAwICAtPiAgMQorY3RteDgwMiBjb21wYXJldG90bWFnIC1JbmYgIC0xICAgICAtPiAgMQorY3RteDgwMyBjb21wYXJldG90bWFnIC1JbmYgIC0wICAgICAtPiAgMQorY3RteDgwNCBjb21wYXJldG90bWFnIC1JbmYgICAwICAgICAtPiAgMQorY3RteDgwNSBjb21wYXJldG90bWFnIC1JbmYgICAxICAgICAtPiAgMQorY3RteDgwNiBjb21wYXJldG90bWFnIC1JbmYgICAxMDAwICAtPiAgMQorY3RteDgwNyBjb21wYXJldG90bWFnIC1JbmYgICBJbmYgICAtPiAgMAorY3RteDgwOCBjb21wYXJldG90bWFnIC1JbmYgIC1JbmYgICAtPiAgMAorY3RteDgwOSBjb21wYXJldG90bWFnIC0xMDAwIC1JbmYgICAtPiAtMQorY3RteDgxMCBjb21wYXJldG90bWFnIC0xICAgIC1JbmYgICAtPiAtMQorY3RteDgxMSBjb21wYXJldG90bWFnIC0wICAgIC1JbmYgICAtPiAtMQorY3RteDgxMiBjb21wYXJldG90bWFnICAwICAgIC1JbmYgICAtPiAtMQorY3RteDgxMyBjb21wYXJldG90bWFnICAxICAgIC1JbmYgICAtPiAtMQorY3RteDgxNCBjb21wYXJldG90bWFnICAxMDAwIC1JbmYgICAtPiAtMQorY3RteDgxNSBjb21wYXJldG90bWFnICBJbmYgIC1JbmYgICAtPiAgMAorCitjdG14ODIxIGNvbXBhcmV0b3RtYWcgIE5hTiAtSW5mICAgIC0+ICAxCitjdG14ODIyIGNvbXBhcmV0b3RtYWcgIE5hTiAtMTAwMCAgIC0+ICAxCitjdG14ODIzIGNvbXBhcmV0b3RtYWcgIE5hTiAtMSAgICAgIC0+ICAxCitjdG14ODI0IGNvbXBhcmV0b3RtYWcgIE5hTiAtMCAgICAgIC0+ICAxCitjdG14ODI1IGNvbXBhcmV0b3RtYWcgIE5hTiAgMCAgICAgIC0+ICAxCitjdG14ODI2IGNvbXBhcmV0b3RtYWcgIE5hTiAgMSAgICAgIC0+ICAxCitjdG14ODI3IGNvbXBhcmV0b3RtYWcgIE5hTiAgMTAwMCAgIC0+ICAxCitjdG14ODI4IGNvbXBhcmV0b3RtYWcgIE5hTiAgSW5mICAgIC0+ICAxCitjdG14ODI5IGNvbXBhcmV0b3RtYWcgIE5hTiAgTmFOICAgIC0+ICAwCitjdG14ODMwIGNvbXBhcmV0b3RtYWcgLUluZiAgTmFOICAgIC0+ICAtMQorY3RteDgzMSBjb21wYXJldG90bWFnIC0xMDAwIE5hTiAgICAtPiAgLTEKK2N0bXg4MzIgY29tcGFyZXRvdG1hZyAtMSAgICBOYU4gICAgLT4gIC0xCitjdG14ODMzIGNvbXBhcmV0b3RtYWcgLTAgICAgTmFOICAgIC0+ICAtMQorY3RteDgzNCBjb21wYXJldG90bWFnICAwICAgIE5hTiAgICAtPiAgLTEKK2N0bXg4MzUgY29tcGFyZXRvdG1hZyAgMSAgICBOYU4gICAgLT4gIC0xCitjdG14ODM2IGNvbXBhcmV0b3RtYWcgIDEwMDAgTmFOICAgIC0+ICAtMQorY3RteDgzNyBjb21wYXJldG90bWFnICBJbmYgIE5hTiAgICAtPiAgLTEKK2N0bXg4MzggY29tcGFyZXRvdG1hZyAtTmFOIC1OYU4gICAgLT4gIDAKK2N0bXg4MzkgY29tcGFyZXRvdG1hZyArTmFOIC1OYU4gICAgLT4gIDAKK2N0bXg4NDAgY29tcGFyZXRvdG1hZyAtTmFOICtOYU4gICAgLT4gIDAKKworY3RteDg0MSBjb21wYXJldG90bWFnICBzTmFOIC1zTmFOICAtPiAgMAorY3RteDg0MiBjb21wYXJldG90bWFnICBzTmFOIC1OYU4gICAtPiAgLTEKK2N0bXg4NDMgY29tcGFyZXRvdG1hZyAgc05hTiAtSW5mICAgLT4gIDEKK2N0bXg4NDQgY29tcGFyZXRvdG1hZyAgc05hTiAtMTAwMCAgLT4gIDEKK2N0bXg4NDUgY29tcGFyZXRvdG1hZyAgc05hTiAtMSAgICAgLT4gIDEKK2N0bXg4NDYgY29tcGFyZXRvdG1hZyAgc05hTiAtMCAgICAgLT4gIDEKK2N0bXg4NDcgY29tcGFyZXRvdG1hZyAgc05hTiAgMCAgICAgLT4gIDEKK2N0bXg4NDggY29tcGFyZXRvdG1hZyAgc05hTiAgMSAgICAgLT4gIDEKK2N0bXg4NDkgY29tcGFyZXRvdG1hZyAgc05hTiAgMTAwMCAgLT4gIDEKK2N0bXg4NTAgY29tcGFyZXRvdG1hZyAgc05hTiAgTmFOICAgLT4gIC0xCitjdG14ODUxIGNvbXBhcmV0b3RtYWcgIHNOYU4gc05hTiAgIC0+ICAwCisKK2N0bXg4NTIgY29tcGFyZXRvdG1hZyAtc05hTiBzTmFOICAgLT4gIDAKK2N0bXg4NTMgY29tcGFyZXRvdG1hZyAtTmFOICBzTmFOICAgLT4gIDEKK2N0bXg4NTQgY29tcGFyZXRvdG1hZyAtSW5mICBzTmFOICAgLT4gIC0xCitjdG14ODU1IGNvbXBhcmV0b3RtYWcgLTEwMDAgc05hTiAgIC0+ICAtMQorY3RteDg1NiBjb21wYXJldG90bWFnIC0xICAgIHNOYU4gICAtPiAgLTEKK2N0bXg4NTcgY29tcGFyZXRvdG1hZyAtMCAgICBzTmFOICAgLT4gIC0xCitjdG14ODU4IGNvbXBhcmV0b3RtYWcgIDAgICAgc05hTiAgIC0+ICAtMQorY3RteDg1OSBjb21wYXJldG90bWFnICAxICAgIHNOYU4gICAtPiAgLTEKK2N0bXg4NjAgY29tcGFyZXRvdG1hZyAgMTAwMCBzTmFOICAgLT4gIC0xCitjdG14ODYxIGNvbXBhcmV0b3RtYWcgIEluZiAgc05hTiAgIC0+ICAtMQorY3RteDg2MiBjb21wYXJldG90bWFnICBOYU4gIHNOYU4gICAtPiAgMQorY3RteDg2MyBjb21wYXJldG90bWFnICBzTmFOIHNOYU4gICAtPiAgMAorCitjdG14ODcxIGNvbXBhcmV0b3RtYWcgIC1zTmFOIC1zTmFOICAtPiAgMAorY3RteDg3MiBjb21wYXJldG90bWFnICAtc05hTiAtTmFOICAgLT4gIC0xCitjdG14ODczIGNvbXBhcmV0b3RtYWcgIC1zTmFOIC1JbmYgICAtPiAgMQorY3RteDg3NCBjb21wYXJldG90bWFnICAtc05hTiAtMTAwMCAgLT4gIDEKK2N0bXg4NzUgY29tcGFyZXRvdG1hZyAgLXNOYU4gLTEgICAgIC0+ICAxCitjdG14ODc2IGNvbXBhcmV0b3RtYWcgIC1zTmFOIC0wICAgICAtPiAgMQorY3RteDg3NyBjb21wYXJldG90bWFnICAtc05hTiAgMCAgICAgLT4gIDEKK2N0bXg4NzggY29tcGFyZXRvdG1hZyAgLXNOYU4gIDEgICAgIC0+ICAxCitjdG14ODc5IGNvbXBhcmV0b3RtYWcgIC1zTmFOICAxMDAwICAtPiAgMQorY3RteDg4MCBjb21wYXJldG90bWFnICAtc05hTiAgTmFOICAgLT4gIC0xCitjdG14ODgxIGNvbXBhcmV0b3RtYWcgIC1zTmFOIHNOYU4gICAtPiAgMAorCitjdG14ODgyIGNvbXBhcmV0b3RtYWcgLXNOYU4gLXNOYU4gICAtPiAgMAorY3RteDg4MyBjb21wYXJldG90bWFnIC1OYU4gIC1zTmFOICAgLT4gIDEKK2N0bXg4ODQgY29tcGFyZXRvdG1hZyAtSW5mICAtc05hTiAgIC0+ICAtMQorY3RteDg4NSBjb21wYXJldG90bWFnIC0xMDAwIC1zTmFOICAgLT4gIC0xCitjdG14ODg2IGNvbXBhcmV0b3RtYWcgLTEgICAgLXNOYU4gICAtPiAgLTEKK2N0bXg4ODcgY29tcGFyZXRvdG1hZyAtMCAgICAtc05hTiAgIC0+ICAtMQorY3RteDg4OCBjb21wYXJldG90bWFnICAwICAgIC1zTmFOICAgLT4gIC0xCitjdG14ODg5IGNvbXBhcmV0b3RtYWcgIDEgICAgLXNOYU4gICAtPiAgLTEKK2N0bXg4OTAgY29tcGFyZXRvdG1hZyAgMTAwMCAtc05hTiAgIC0+ICAtMQorY3RteDg5MSBjb21wYXJldG90bWFnICBJbmYgIC1zTmFOICAgLT4gIC0xCitjdG14ODkyIGNvbXBhcmV0b3RtYWcgIE5hTiAgLXNOYU4gICAtPiAgMQorY3RteDg5MyBjb21wYXJldG90bWFnICBzTmFOIC1zTmFOICAgLT4gIDAKKworLS0gTmFOcyB3aXRoIHBheWxvYWQKK2N0bXg5NjAgY29tcGFyZXRvdG1hZyAgTmFOOSAtSW5mICAgLT4gIDEKK2N0bXg5NjEgY29tcGFyZXRvdG1hZyAgTmFOOCAgOTk5ICAgLT4gIDEKK2N0bXg5NjIgY29tcGFyZXRvdG1hZyAgTmFONzcgSW5mICAgLT4gIDEKK2N0bXg5NjMgY29tcGFyZXRvdG1hZyAtTmFONjcgTmFONSAgLT4gIDEKK2N0bXg5NjQgY29tcGFyZXRvdG1hZyAtSW5mICAtTmFONCAgLT4gIC0xCitjdG14OTY1IGNvbXBhcmV0b3RtYWcgLTk5OSAgLU5hTjMzIC0+ICAtMQorY3RteDk2NiBjb21wYXJldG90bWFnICBJbmYgICBOYU4yICAtPiAgLTEKKworY3RteDk3MCBjb21wYXJldG90bWFnIC1OYU40MSAtTmFONDIgLT4gLTEKK2N0bXg5NzEgY29tcGFyZXRvdG1hZyArTmFONDEgLU5hTjQyIC0+IC0xCitjdG14OTcyIGNvbXBhcmV0b3RtYWcgLU5hTjQxICtOYU40MiAtPiAtMQorY3RteDk3MyBjb21wYXJldG90bWFnICtOYU40MSArTmFONDIgLT4gLTEKK2N0bXg5NzQgY29tcGFyZXRvdG1hZyAtTmFONDIgLU5hTjAxIC0+ICAxCitjdG14OTc1IGNvbXBhcmV0b3RtYWcgK05hTjQyIC1OYU4wMSAtPiAgMQorY3RteDk3NiBjb21wYXJldG90bWFnIC1OYU40MiArTmFOMDEgLT4gIDEKK2N0bXg5NzcgY29tcGFyZXRvdG1hZyArTmFONDIgK05hTjAxIC0+ICAxCisKK2N0bXg5ODAgY29tcGFyZXRvdG1hZyAtc05hTjc3MSAtc05hTjc3MiAtPiAtMQorY3RteDk4MSBjb21wYXJldG90bWFnICtzTmFONzcxIC1zTmFONzcyIC0+IC0xCitjdG14OTgyIGNvbXBhcmV0b3RtYWcgLXNOYU43NzEgK3NOYU43NzIgLT4gLTEKK2N0bXg5ODMgY29tcGFyZXRvdG1hZyArc05hTjc3MSArc05hTjc3MiAtPiAtMQorY3RteDk4NCBjb21wYXJldG90bWFnIC1zTmFONzcyIC1zTmFONzcxIC0+ICAxCitjdG14OTg1IGNvbXBhcmV0b3RtYWcgK3NOYU43NzIgLXNOYU43NzEgLT4gIDEKK2N0bXg5ODYgY29tcGFyZXRvdG1hZyAtc05hTjc3MiArc05hTjc3MSAtPiAgMQorY3RteDk4NyBjb21wYXJldG90bWFnICtzTmFONzcyICtzTmFONzcxIC0+ICAxCisKK2N0bXg5OTEgY29tcGFyZXRvdG1hZyAtc05hTjk5IC1JbmYgICAgLT4gIDEKK2N0bXg5OTIgY29tcGFyZXRvdG1hZyAgc05hTjk4IC0xMSAgICAgLT4gIDEKK2N0bXg5OTMgY29tcGFyZXRvdG1hZyAgc05hTjk3ICBOYU4gICAgLT4gLTEKK2N0bXg5OTQgY29tcGFyZXRvdG1hZyAgc05hTjE2IHNOYU45NCAgLT4gLTEKK2N0bXg5OTUgY29tcGFyZXRvdG1hZyAgTmFOODUgIHNOYU44MyAgLT4gIDEKK2N0bXg5OTYgY29tcGFyZXRvdG1hZyAtSW5mICAgIHNOYU45MiAgLT4gLTEKK2N0bXg5OTcgY29tcGFyZXRvdG1hZyAgMDg4ICAgIHNOYU44MSAgLT4gLTEKK2N0bXg5OTggY29tcGFyZXRvdG1hZyAgSW5mICAgIHNOYU45MCAgLT4gLTEKK2N0bXg5OTkgY29tcGFyZXRvdG1hZyAgTmFOICAgLXNOYU44OSAgLT4gIDEKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cyAuLiBzdWJub3JtYWwgcmVzdWx0cyBub3cgYWxsb3dlZAorbWF4RXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK2N0bXgxMDgwIGNvbXBhcmV0b3RtYWcgKzEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5ICAtPiAgLTEKK2N0bXgxMDgxIGNvbXBhcmV0b3RtYWcgOUUrOTk5OTk5OTk5ICsxLjIzNDU2Nzg5MDEyMzQ1RS0wICAtPiAgIDEKK2N0bXgxMDgyIGNvbXBhcmV0b3RtYWcgKzAuMTAwIDlFLTk5OTk5OTk5OSAgICAgICAgICAgICAgICAtPiAgIDEKK2N0bXgxMDgzIGNvbXBhcmV0b3RtYWcgOUUtOTk5OTk5OTk5ICswLjEwMCAgICAgICAgICAgICAgICAtPiAgLTEKK2N0bXgxMDg1IGNvbXBhcmV0b3RtYWcgLTEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5ICAtPiAgLTEKK2N0bXgxMDg2IGNvbXBhcmV0b3RtYWcgOUUrOTk5OTk5OTk5IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wICAtPiAgIDEKK2N0bXgxMDg3IGNvbXBhcmV0b3RtYWcgLTAuMTAwIDlFLTk5OTk5OTk5OSAgICAgICAgICAgICAgICAtPiAgIDEKK2N0bXgxMDg4IGNvbXBhcmV0b3RtYWcgOUUtOTk5OTk5OTk5IC0wLjEwMCAgICAgICAgICAgICAgICAtPiAgLTEKKworY3RteDEwODkgY29tcGFyZXRvdG1hZyAxZS01OTk5OTk5OTkgMWUtNDAwMDAwMDAxICAgIC0+ICAtMQorY3RteDEwOTAgY29tcGFyZXRvdG1hZyAxZS01OTk5OTk5OTkgMWUtNDAwMDAwMDAwICAgIC0+ICAtMQorY3RteDEwOTEgY29tcGFyZXRvdG1hZyAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDAwICAgIC0+ICAtMQorY3RteDEwOTIgY29tcGFyZXRvdG1hZyA5ZS05OTk5OTk5OTggMC4wMSAgICAgICAgICAgIC0+ICAtMQorY3RteDEwOTMgY29tcGFyZXRvdG1hZyA5ZS05OTk5OTk5OTggMC4xICAgICAgICAgICAgIC0+ICAtMQorY3RteDEwOTQgY29tcGFyZXRvdG1hZyAwLjAxIDllLTk5OTk5OTk5OCAgICAgICAgICAgIC0+ICAgMQorY3RteDEwOTUgY29tcGFyZXRvdG1hZyAxZTU5OTk5OTk5OSAxZTQwMDAwMDAwMSAgICAgIC0+ICAgMQorY3RteDEwOTYgY29tcGFyZXRvdG1hZyAxZTU5OTk5OTk5OSAxZTQwMDAwMDAwMCAgICAgIC0+ICAgMQorY3RteDEwOTcgY29tcGFyZXRvdG1hZyAxZTYwMDAwMDAwMCAxZTQwMDAwMDAwMCAgICAgIC0+ICAgMQorY3RteDEwOTggY29tcGFyZXRvdG1hZyA5ZTk5OTk5OTk5OCAxMDAgICAgICAgICAgICAgIC0+ICAgMQorY3RteDEwOTkgY29tcGFyZXRvdG1hZyA5ZTk5OTk5OTk5OCAxMCAgICAgICAgICAgICAgIC0+ICAgMQorY3RteDExMDAgY29tcGFyZXRvdG1hZyAxMDAgIDllOTk5OTk5OTk4ICAgICAgICAgICAgIC0+ICAtMQorLS0gc2lnbnMKK2N0bXgxMTAxIGNvbXBhcmV0b3RtYWcgIDFlKzc3Nzc3Nzc3NyAgMWUrNDExMTExMTExICAtPiAgIDEKK2N0bXgxMTAyIGNvbXBhcmV0b3RtYWcgIDFlKzc3Nzc3Nzc3NyAtMWUrNDExMTExMTExICAtPiAgIDEKK2N0bXgxMTAzIGNvbXBhcmV0b3RtYWcgLTFlKzc3Nzc3Nzc3NyAgMWUrNDExMTExMTExICAtPiAgIDEKK2N0bXgxMTA0IGNvbXBhcmV0b3RtYWcgLTFlKzc3Nzc3Nzc3NyAtMWUrNDExMTExMTExICAtPiAgIDEKK2N0bXgxMTA1IGNvbXBhcmV0b3RtYWcgIDFlLTc3Nzc3Nzc3NyAgMWUtNDExMTExMTExICAtPiAgLTEKK2N0bXgxMTA2IGNvbXBhcmV0b3RtYWcgIDFlLTc3Nzc3Nzc3NyAtMWUtNDExMTExMTExICAtPiAgLTEKK2N0bXgxMTA3IGNvbXBhcmV0b3RtYWcgLTFlLTc3Nzc3Nzc3NyAgMWUtNDExMTExMTExICAtPiAgLTEKK2N0bXgxMTA4IGNvbXBhcmV0b3RtYWcgLTFlLTc3Nzc3Nzc3NyAtMWUtNDExMTExMTExICAtPiAgLTEKKworLS0gc3ByZWFkIHplcm9zCitjdG14MTExMCBjb21wYXJldG90bWFnICAgMEUtMzgzICAwICAgICAgICAtPiAgLTEKK2N0bXgxMTExIGNvbXBhcmV0b3RtYWcgICAwRS0zODMgLTAgICAgICAgIC0+ICAtMQorY3RteDExMTIgY29tcGFyZXRvdG1hZyAgLTBFLTM4MyAgMCAgICAgICAgLT4gIC0xCitjdG14MTExMyBjb21wYXJldG90bWFnICAtMEUtMzgzIC0wICAgICAgICAtPiAgLTEKK2N0bXgxMTE0IGNvbXBhcmV0b3RtYWcgICAwRS0zODMgIDBFKzM4NCAgIC0+ICAtMQorY3RteDExMTUgY29tcGFyZXRvdG1hZyAgIDBFLTM4MyAtMEUrMzg0ICAgLT4gIC0xCitjdG14MTExNiBjb21wYXJldG90bWFnICAtMEUtMzgzICAwRSszODQgICAtPiAgLTEKK2N0bXgxMTE3IGNvbXBhcmV0b3RtYWcgIC0wRS0zODMgLTBFKzM4NCAgIC0+ICAtMQorY3RteDExMTggY29tcGFyZXRvdG1hZyAgIDAgICAgICAgMEUrMzg0ICAgLT4gIC0xCitjdG14MTExOSBjb21wYXJldG90bWFnICAgMCAgICAgIC0wRSszODQgICAtPiAgLTEKK2N0bXgxMTIwIGNvbXBhcmV0b3RtYWcgIC0wICAgICAgIDBFKzM4NCAgIC0+ICAtMQorY3RteDExMjEgY29tcGFyZXRvdG1hZyAgLTAgICAgICAtMEUrMzg0ICAgLT4gIC0xCisKK2N0bXgxMTMwIGNvbXBhcmV0b3RtYWcgICAwRSszODQgIDAgICAgICAgIC0+ICAgMQorY3RteDExMzEgY29tcGFyZXRvdG1hZyAgIDBFKzM4NCAtMCAgICAgICAgLT4gICAxCitjdG14MTEzMiBjb21wYXJldG90bWFnICAtMEUrMzg0ICAwICAgICAgICAtPiAgIDEKK2N0bXgxMTMzIGNvbXBhcmV0b3RtYWcgIC0wRSszODQgLTAgICAgICAgIC0+ICAgMQorY3RteDExMzQgY29tcGFyZXRvdG1hZyAgIDBFKzM4NCAgMEUtMzgzICAgLT4gICAxCitjdG14MTEzNSBjb21wYXJldG90bWFnICAgMEUrMzg0IC0wRS0zODMgICAtPiAgIDEKK2N0bXgxMTM2IGNvbXBhcmV0b3RtYWcgIC0wRSszODQgIDBFLTM4MyAgIC0+ICAgMQorY3RteDExMzcgY29tcGFyZXRvdG1hZyAgLTBFKzM4NCAtMEUtMzgzICAgLT4gICAxCitjdG14MTEzOCBjb21wYXJldG90bWFnICAgMCAgICAgICAwRS0zODMgICAtPiAgIDEKK2N0bXgxMTM5IGNvbXBhcmV0b3RtYWcgICAwICAgICAgLTBFLTM4MyAgIC0+ICAgMQorY3RteDExNDAgY29tcGFyZXRvdG1hZyAgLTAgICAgICAgMEUtMzgzICAgLT4gICAxCitjdG14MTE0MSBjb21wYXJldG90bWFnICAtMCAgICAgIC0wRS0zODMgICAtPiAgIDEKKworLS0gTnVsbCB0ZXN0cworY3RteDk5OTAgY29tcGFyZXRvdG1hZyAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2N0bXg5OTkxIGNvbXBhcmV0b3RtYWcgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvcHkuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29weS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZjI5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvcHkuZGVjVGVzdApAQCAtMCwwICsxLDg2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGNvcHkuZGVjVGVzdCAtLSBxdWlldCBjb3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworLS0gU2FuaXR5IGNoZWNrCitjcHl4MDAxIGNvcHkgICAgICAgKzcuNTAgIC0+IDcuNTAKKworLS0gSW5maW5pdGllcworY3B5eDAxMSBjb3B5ICBJbmZpbml0eSAgICAtPiBJbmZpbml0eQorY3B5eDAxMiBjb3B5ICAtSW5maW5pdHkgICAtPiAtSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitjcHl4MDIxIGNvcHkgICAgICAgICBOYU4gIC0+IE5hTgorY3B5eDAyMiBjb3B5ICAgICAgICAtTmFOICAtPiAtTmFOCitjcHl4MDIzIGNvcHkgICAgICAgIHNOYU4gIC0+IHNOYU4KK2NweXgwMjQgY29weSAgICAgICAtc05hTiAgLT4gLXNOYU4KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorY3B5eDAzMSBjb3B5ICAgICAgIE5hTjEwICAtPiBOYU4xMAorY3B5eDAzMiBjb3B5ICAgICAgLU5hTjEwICAtPiAtTmFOMTAKK2NweXgwMzMgY29weSAgICAgIHNOYU4xMCAgLT4gc05hTjEwCitjcHl4MDM0IGNvcHkgICAgIC1zTmFOMTAgIC0+IC1zTmFOMTAKK2NweXgwMzUgY29weSAgICAgICBOYU43ICAgLT4gTmFONworY3B5eDAzNiBjb3B5ICAgICAgLU5hTjcgICAtPiAtTmFONworY3B5eDAzNyBjb3B5ICAgICAgc05hTjEwMSAtPiBzTmFOMTAxCitjcHl4MDM4IGNvcHkgICAgIC1zTmFOMTAxIC0+IC1zTmFOMTAxCisKKy0tIGZpbml0ZXMKK2NweXgxMDEgY29weSAgICAgICAgICA3ICAgLT4gNworY3B5eDEwMiBjb3B5ICAgICAgICAgLTcgICAtPiAtNworY3B5eDEwMyBjb3B5ICAgICAgICAgNzUgICAtPiA3NQorY3B5eDEwNCBjb3B5ICAgICAgICAtNzUgICAtPiAtNzUKK2NweXgxMDUgY29weSAgICAgICA3LjUwICAgLT4gNy41MAorY3B5eDEwNiBjb3B5ICAgICAgLTcuNTAgICAtPiAtNy41MAorY3B5eDEwNyBjb3B5ICAgICAgIDcuNTAwICAtPiA3LjUwMAorY3B5eDEwOCBjb3B5ICAgICAgLTcuNTAwICAtPiAtNy41MDAKKworLS0gemVyb3MKK2NweXgxMTEgY29weSAgICAgICAgICAwICAgLT4gMAorY3B5eDExMiBjb3B5ICAgICAgICAgLTAgICAtPiAtMAorY3B5eDExMyBjb3B5ICAgICAgIDBFKzQgICAtPiAwRSs0CitjcHl4MTE0IGNvcHkgICAgICAtMEUrNCAgIC0+IC0wRSs0CitjcHl4MTE1IGNvcHkgICAgIDAuMDAwMCAgIC0+IDAuMDAwMAorY3B5eDExNiBjb3B5ICAgIC0wLjAwMDAgICAtPiAtMC4wMDAwCitjcHl4MTE3IGNvcHkgICAgICAwRS0xNDEgIC0+IDBFLTE0MQorY3B5eDExOCBjb3B5ICAgICAtMEUtMTQxICAtPiAtMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitjcHl4MTIxIGNvcHkgICAyNjgyNjgyNjggICAgICAgIC0+IDI2ODI2ODI2OAorY3B5eDEyMiBjb3B5ICAtMjY4MjY4MjY4ICAgICAgICAtPiAtMjY4MjY4MjY4CitjcHl4MTIzIGNvcHkgICAxMzQxMzQxMzQgICAgICAgIC0+IDEzNDEzNDEzNAorY3B5eDEyNCBjb3B5ICAtMTM0MTM0MTM0ICAgICAgICAtPiAtMTM0MTM0MTM0CisKKy0tIE5tYXgsIE5taW4sIE50aW55CitjcHl4MTMxIGNvcHkgIDkuOTk5OTk5OTlFKzk5OSAgIC0+IDkuOTk5OTk5OTlFKzk5OQorY3B5eDEzMiBjb3B5ICAxRS05OTkgICAgICAgICAgICAtPiAxRS05OTkKK2NweXgxMzMgY29weSAgMS4wMDAwMDAwMEUtOTk5ICAgLT4gMS4wMDAwMDAwMEUtOTk5CitjcHl4MTM0IGNvcHkgIDFFLTEwMDcgICAgICAgICAgIC0+IDFFLTEwMDcKKworY3B5eDEzNSBjb3B5ICAtMUUtMTAwNyAgICAgICAgICAtPiAtMUUtMTAwNworY3B5eDEzNiBjb3B5ICAtMS4wMDAwMDAwMEUtOTk5ICAtPiAtMS4wMDAwMDAwMEUtOTk5CitjcHl4MTM3IGNvcHkgIC0xRS05OTkgICAgICAgICAgIC0+IC0xRS05OTkKK2NweXgxMzggY29weSAgLTkuOTk5OTk5OTlFKzk5OSAgLT4gLTkuOTk5OTk5OTlFKzk5OQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb3B5YWJzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvcHlhYnMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjAwMmRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb3B5YWJzLmRlY1Rlc3QKQEAgLTAsMCArMSw4NiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBjb3B5QWJzLmRlY1Rlc3QgLS0gcXVpZXQgY29weSBhbmQgc2V0IHNpZ24gdG8gemVybyAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5CisKKy0tIFNhbml0eSBjaGVjaworY3BheDAwMSBjb3B5YWJzICAgICAgICs3LjUwICAtPiA3LjUwCisKKy0tIEluZmluaXRpZXMKK2NwYXgwMTEgY29weWFicyAgSW5maW5pdHkgICAgLT4gSW5maW5pdHkKK2NwYXgwMTIgY29weWFicyAgLUluZmluaXR5ICAgLT4gSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitjcGF4MDIxIGNvcHlhYnMgICAgICAgICBOYU4gIC0+IE5hTgorY3BheDAyMiBjb3B5YWJzICAgICAgICAtTmFOICAtPiBOYU4KK2NwYXgwMjMgY29weWFicyAgICAgICAgc05hTiAgLT4gc05hTgorY3BheDAyNCBjb3B5YWJzICAgICAgIC1zTmFOICAtPiBzTmFOCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2NwYXgwMzEgY29weWFicyAgICAgICBOYU4xMCAgLT4gTmFOMTAKK2NwYXgwMzIgY29weWFicyAgICAgIC1OYU4xNSAgLT4gTmFOMTUKK2NwYXgwMzMgY29weWFicyAgICAgIHNOYU4xNSAgLT4gc05hTjE1CitjcGF4MDM0IGNvcHlhYnMgICAgIC1zTmFOMTAgIC0+IHNOYU4xMAorY3BheDAzNSBjb3B5YWJzICAgICAgIE5hTjcgICAtPiBOYU43CitjcGF4MDM2IGNvcHlhYnMgICAgICAtTmFONyAgIC0+IE5hTjcKK2NwYXgwMzcgY29weWFicyAgICAgIHNOYU4xMDEgLT4gc05hTjEwMQorY3BheDAzOCBjb3B5YWJzICAgICAtc05hTjEwMSAtPiBzTmFOMTAxCisKKy0tIGZpbml0ZXMKK2NwYXgxMDEgY29weWFicyAgICAgICAgICA3ICAgLT4gNworY3BheDEwMiBjb3B5YWJzICAgICAgICAgLTcgICAtPiA3CitjcGF4MTAzIGNvcHlhYnMgICAgICAgICA3NSAgIC0+IDc1CitjcGF4MTA0IGNvcHlhYnMgICAgICAgIC03NSAgIC0+IDc1CitjcGF4MTA1IGNvcHlhYnMgICAgICAgNy4xMCAgIC0+IDcuMTAKK2NwYXgxMDYgY29weWFicyAgICAgIC03LjEwICAgLT4gNy4xMAorY3BheDEwNyBjb3B5YWJzICAgICAgIDcuNTAwICAtPiA3LjUwMAorY3BheDEwOCBjb3B5YWJzICAgICAgLTcuNTAwICAtPiA3LjUwMAorCistLSB6ZXJvcworY3BheDExMSBjb3B5YWJzICAgICAgICAgIDAgICAtPiAwCitjcGF4MTEyIGNvcHlhYnMgICAgICAgICAtMCAgIC0+IDAKK2NwYXgxMTMgY29weWFicyAgICAgICAwRSs2ICAgLT4gMEUrNgorY3BheDExNCBjb3B5YWJzICAgICAgLTBFKzYgICAtPiAwRSs2CitjcGF4MTE1IGNvcHlhYnMgICAgIDAuMDAwMCAgIC0+IDAuMDAwMAorY3BheDExNiBjb3B5YWJzICAgIC0wLjAwMDAgICAtPiAwLjAwMDAKK2NwYXgxMTcgY29weWFicyAgICAgIDBFLTE0MSAgLT4gMEUtMTQxCitjcGF4MTE4IGNvcHlhYnMgICAgIC0wRS0xNDEgIC0+IDBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworY3BheDEyMSBjb3B5YWJzICAgMjY4MjY4MjY4ICAgICAgICAtPiAyNjgyNjgyNjgKK2NwYXgxMjIgY29weWFicyAgLTI2ODI2ODI2OCAgICAgICAgLT4gMjY4MjY4MjY4CitjcGF4MTIzIGNvcHlhYnMgICAxMzQxMzQxMzQgICAgICAgIC0+IDEzNDEzNDEzNAorY3BheDEyNCBjb3B5YWJzICAtMTM0MTM0MTM0ICAgICAgICAtPiAxMzQxMzQxMzQKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2NwYXgxMzEgY29weWFicyAgOS45OTk5OTk5OUUrOTk5ICAgLT4gOS45OTk5OTk5OUUrOTk5CitjcGF4MTMyIGNvcHlhYnMgIDFFLTk5OSAgICAgICAgICAgIC0+IDFFLTk5OQorY3BheDEzMyBjb3B5YWJzICAxLjAwMDAwMDAwRS05OTkgICAtPiAxLjAwMDAwMDAwRS05OTkKK2NwYXgxMzQgY29weWFicyAgMUUtMTAwNyAgICAgICAgICAgLT4gMUUtMTAwNworCitjcGF4MTM1IGNvcHlhYnMgIC0xRS0xMDA3ICAgICAgICAgIC0+IDFFLTEwMDcKK2NwYXgxMzYgY29weWFicyAgLTEuMDAwMDAwMDBFLTk5OSAgLT4gMS4wMDAwMDAwMEUtOTk5CitjcGF4MTM3IGNvcHlhYnMgIC0xRS05OTkgICAgICAgICAgIC0+IDFFLTk5OQorY3BheDE5OSBjb3B5YWJzICAtOS45OTk5OTk5OUUrOTk5ICAtPiA5Ljk5OTk5OTk5RSs5OTkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29weW5lZ2F0ZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb3B5bmVnYXRlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4ZGU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29weW5lZ2F0ZS5kZWNUZXN0CkBAIC0wLDAgKzEsODYgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gY29weU5lZ2F0ZS5kZWNUZXN0IC0tIHF1aWV0IGNvcHkgYW5kIG5lZ2F0ZSAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5CittaW5FeHBvbmVudDogLTk5OQorCistLSBTYW5pdHkgY2hlY2sKK2NwbngwMDEgY29weW5lZ2F0ZSAgICAgICArNy41MCAgLT4gLTcuNTAKKworLS0gSW5maW5pdGllcworY3BueDAxMSBjb3B5bmVnYXRlICBJbmZpbml0eSAgICAtPiAtSW5maW5pdHkKK2NwbngwMTIgY29weW5lZ2F0ZSAgLUluZmluaXR5ICAgLT4gSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitjcG54MDIxIGNvcHluZWdhdGUgICAgICAgICBOYU4gIC0+IC1OYU4KK2NwbngwMjIgY29weW5lZ2F0ZSAgICAgICAgLU5hTiAgLT4gTmFOCitjcG54MDIzIGNvcHluZWdhdGUgICAgICAgIHNOYU4gIC0+IC1zTmFOCitjcG54MDI0IGNvcHluZWdhdGUgICAgICAgLXNOYU4gIC0+IHNOYU4KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorY3BueDAzMSBjb3B5bmVnYXRlICAgICAgIE5hTjEzICAtPiAtTmFOMTMKK2NwbngwMzIgY29weW5lZ2F0ZSAgICAgIC1OYU4xMyAgLT4gTmFOMTMKK2NwbngwMzMgY29weW5lZ2F0ZSAgICAgIHNOYU4xMyAgLT4gLXNOYU4xMworY3BueDAzNCBjb3B5bmVnYXRlICAgICAtc05hTjEzICAtPiBzTmFOMTMKK2NwbngwMzUgY29weW5lZ2F0ZSAgICAgICBOYU43MCAgLT4gLU5hTjcwCitjcG54MDM2IGNvcHluZWdhdGUgICAgICAtTmFONzAgIC0+IE5hTjcwCitjcG54MDM3IGNvcHluZWdhdGUgICAgICBzTmFOMTAxIC0+IC1zTmFOMTAxCitjcG54MDM4IGNvcHluZWdhdGUgICAgIC1zTmFOMTAxIC0+IHNOYU4xMDEKKworLS0gZmluaXRlcworY3BueDEwMSBjb3B5bmVnYXRlICAgICAgICAgIDcgICAtPiAtNworY3BueDEwMiBjb3B5bmVnYXRlICAgICAgICAgLTcgICAtPiA3CitjcG54MTAzIGNvcHluZWdhdGUgICAgICAgICA3NSAgIC0+IC03NQorY3BueDEwNCBjb3B5bmVnYXRlICAgICAgICAtNzUgICAtPiA3NQorY3BueDEwNSBjb3B5bmVnYXRlICAgICAgIDcuNTAgICAtPiAtNy41MAorY3BueDEwNiBjb3B5bmVnYXRlICAgICAgLTcuNTAgICAtPiA3LjUwCitjcG54MTA3IGNvcHluZWdhdGUgICAgICAgNy41MDAgIC0+IC03LjUwMAorY3BueDEwOCBjb3B5bmVnYXRlICAgICAgLTcuNTAwICAtPiA3LjUwMAorCistLSB6ZXJvcworY3BueDExMSBjb3B5bmVnYXRlICAgICAgICAgIDAgICAtPiAtMAorY3BueDExMiBjb3B5bmVnYXRlICAgICAgICAgLTAgICAtPiAwCitjcG54MTEzIGNvcHluZWdhdGUgICAgICAgMEUrNCAgIC0+IC0wRSs0CitjcG54MTE0IGNvcHluZWdhdGUgICAgICAtMEUrNCAgIC0+IDBFKzQKK2NwbngxMTUgY29weW5lZ2F0ZSAgICAgMC4wMDAwICAgLT4gLTAuMDAwMAorY3BueDExNiBjb3B5bmVnYXRlICAgIC0wLjAwMDAgICAtPiAwLjAwMDAKK2NwbngxMTcgY29weW5lZ2F0ZSAgICAgIDBFLTE0MSAgLT4gLTBFLTE0MQorY3BueDExOCBjb3B5bmVnYXRlICAgICAtMEUtMTQxICAtPiAwRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2NwbngxMjEgY29weW5lZ2F0ZSAgMjY4MjY4MjY4ICAgICAgICAgLT4gLTI2ODI2ODI2OAorY3BueDEyMiBjb3B5bmVnYXRlICAtMjY4MjY4MjY4ICAgICAgICAtPiAyNjgyNjgyNjgKK2NwbngxMjMgY29weW5lZ2F0ZSAgMTM0MTM0MTM0ICAgICAgICAgLT4gLTEzNDEzNDEzNAorY3BueDEyNCBjb3B5bmVnYXRlICAtMTM0MTM0MTM0ICAgICAgICAtPiAxMzQxMzQxMzQKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2NwbngxMzEgY29weW5lZ2F0ZSAgOS45OTk5OTk5OUUrOTk5ICAgLT4gLTkuOTk5OTk5OTlFKzk5OQorY3BueDEzMiBjb3B5bmVnYXRlICAxRS05OTkgICAgICAgICAgICAgICAgICAgICAtPiAtMUUtOTk5CitjcG54MTMzIGNvcHluZWdhdGUgIDEuMDAwMDAwMDBFLTk5OSAgIC0+IC0xLjAwMDAwMDAwRS05OTkKK2NwbngxMzQgY29weW5lZ2F0ZSAgMUUtMTAwNyAgICAgICAgICAgICAgICAgICAgLT4gLTFFLTEwMDcKKworY3BueDEzNSBjb3B5bmVnYXRlICAtMUUtMTAwNyAgICAgICAgICAgICAgICAgICAtPiAxRS0xMDA3CitjcG54MTM2IGNvcHluZWdhdGUgIC0xLjAwMDAwMDAwRS05OTkgIC0+IDEuMDAwMDAwMDBFLTk5OQorY3BueDEzNyBjb3B5bmVnYXRlICAtMUUtOTk5ICAgICAgICAgICAgICAgICAgICAtPiAxRS05OTkKK2NwbngxMzggY29weW5lZ2F0ZSAgLTkuOTk5OTk5OTlFKzk5OSAgLT4gOS45OTk5OTk5OUUrOTk5CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvcHlzaWduLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvcHlzaWduLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkZDY3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29weXNpZ24uZGVjVGVzdApAQCAtMCwwICsxLDE3NyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBjb3B5c2lnbi5kZWNUZXN0IC0tIHF1aWV0IGNvcHkgd2l0aCBzaWduIGZyb20gcmhzICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5CisKKy0tIFNhbml0eSBjaGVjaywgYW5kIGV4YW1wbGVzIGZyb20gZGVjQXJpdGgKK2Nwc3gwMDEgY29weXNpZ24gICArNy41MCAgICAgICAxMSAgLT4gNy41MAorY3BzeDAwMiBjb3B5c2lnbiAgICcxLjUwJyAgICc3LjMzJyAtPiAxLjUwCitjcHN4MDAzIGNvcHlzaWduICAnLTEuNTAnICAgJzcuMzMnIC0+IDEuNTAKK2Nwc3gwMDQgY29weXNpZ24gICAnMS41MCcgICctNy4zMycgLT4gLTEuNTAKK2Nwc3gwMDUgY29weXNpZ24gICctMS41MCcgICctNy4zMycgLT4gLTEuNTAKKworLS0gSW5maW5pdGllcworY3BzeDAxMSBjb3B5c2lnbiAgSW5maW5pdHkgICAgICAgMTEgLT4gSW5maW5pdHkKK2Nwc3gwMTIgY29weXNpZ24gIC1JbmZpbml0eSAgICAgIDExIC0+IEluZmluaXR5CisKKy0tIE5hTnMsIDAgcGF5bG9hZAorY3BzeDAyMSBjb3B5c2lnbiAgICAgICAgIE5hTiAgICAgMTEgLT4gTmFOCitjcHN4MDIyIGNvcHlzaWduICAgICAgICAtTmFOICAgICAxMSAtPiBOYU4KK2Nwc3gwMjMgY29weXNpZ24gICAgICAgIHNOYU4gICAgIDExIC0+IHNOYU4KK2Nwc3gwMjQgY29weXNpZ24gICAgICAgLXNOYU4gICAgIDExIC0+IHNOYU4KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorY3BzeDAzMSBjb3B5c2lnbiAgICAgICBOYU4xMCAgICAgMTEgLT4gTmFOMTAKK2Nwc3gwMzIgY29weXNpZ24gICAgICAtTmFOMTAgICAgIDExIC0+IE5hTjEwCitjcHN4MDMzIGNvcHlzaWduICAgICAgc05hTjEwICAgICAxMSAtPiBzTmFOMTAKK2Nwc3gwMzQgY29weXNpZ24gICAgIC1zTmFOMTAgICAgIDExIC0+IHNOYU4xMAorY3BzeDAzNSBjb3B5c2lnbiAgICAgICBOYU43ICAgICAgMTEgLT4gTmFONworY3BzeDAzNiBjb3B5c2lnbiAgICAgIC1OYU43ICAgICAgMTEgLT4gTmFONworY3BzeDAzNyBjb3B5c2lnbiAgICAgIHNOYU4xMDEgICAgMTEgLT4gc05hTjEwMQorY3BzeDAzOCBjb3B5c2lnbiAgICAgLXNOYU4xMDEgICAgMTEgLT4gc05hTjEwMQorCistLSBmaW5pdGVzCitjcHN4MTAxIGNvcHlzaWduICAgICAgICAgIDcgICAgICAxMSAtPiA3CitjcHN4MTAyIGNvcHlzaWduICAgICAgICAgLTcgICAgICAxMSAtPiA3CitjcHN4MTAzIGNvcHlzaWduICAgICAgICAgNzUgICAgICAxMSAtPiA3NQorY3BzeDEwNCBjb3B5c2lnbiAgICAgICAgLTc1ICAgICAgMTEgLT4gNzUKK2Nwc3gxMDUgY29weXNpZ24gICAgICAgNy41MCAgICAgIDExIC0+IDcuNTAKK2Nwc3gxMDYgY29weXNpZ24gICAgICAtNy41MCAgICAgIDExIC0+IDcuNTAKK2Nwc3gxMDcgY29weXNpZ24gICAgICAgNy41MDAgICAgIDExIC0+IDcuNTAwCitjcHN4MTA4IGNvcHlzaWduICAgICAgLTcuNTAwICAgICAxMSAtPiA3LjUwMAorCistLSB6ZXJvcworY3BzeDExMSBjb3B5c2lnbiAgICAgICAgICAwICAgICAgMTEgLT4gMAorY3BzeDExMiBjb3B5c2lnbiAgICAgICAgIC0wICAgICAgMTEgLT4gMAorY3BzeDExMyBjb3B5c2lnbiAgICAgICAwRSs0ICAgICAgMTEgLT4gMEUrNAorY3BzeDExNCBjb3B5c2lnbiAgICAgIC0wRSs0ICAgICAgMTEgLT4gMEUrNAorY3BzeDExNSBjb3B5c2lnbiAgICAgMC4wMDAwICAgICAgMTEgLT4gMC4wMDAwCitjcHN4MTE2IGNvcHlzaWduICAgIC0wLjAwMDAgICAgICAxMSAtPiAwLjAwMDAKK2Nwc3gxMTcgY29weXNpZ24gICAgICAwRS0xNDEgICAgIDExIC0+IDBFLTE0MQorY3BzeDExOCBjb3B5c2lnbiAgICAgLTBFLTE0MSAgICAgMTEgLT4gMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitjcHN4MTIxIGNvcHlzaWduICAgMjY4MjY4MjY4ICAgICAgICAgICAxMSAtPiAyNjgyNjgyNjgKK2Nwc3gxMjIgY29weXNpZ24gIC0yNjgyNjgyNjggICAgICAgICAgIDExIC0+IDI2ODI2ODI2OAorY3BzeDEyMyBjb3B5c2lnbiAgIDEzNDEzNDEzNCAgICAgICAgICAgMTEgLT4gMTM0MTM0MTM0CitjcHN4MTI0IGNvcHlzaWduICAtMTM0MTM0MTM0ICAgICAgICAgICAxMSAtPiAxMzQxMzQxMzQKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2Nwc3gxMzEgY29weXNpZ24gIDkuOTk5OTk5OTlFKzk5OSAgICAgIDExIC0+IDkuOTk5OTk5OTlFKzk5OQorY3BzeDEzMiBjb3B5c2lnbiAgMUUtOTk5ICAgICAgICAgICAgICAgMTEgLT4gMUUtOTk5CitjcHN4MTMzIGNvcHlzaWduICAxLjAwMDAwMDAwRS05OTkgICAgICAxMSAtPiAxLjAwMDAwMDAwRS05OTkKK2Nwc3gxMzQgY29weXNpZ24gIDFFLTEwMDcgICAgICAgICAgICAgIDExIC0+IDFFLTEwMDcKKworY3BzeDEzNSBjb3B5c2lnbiAgLTFFLTEwMDcgICAgICAgICAgICAgMTEgLT4gMUUtMTAwNworY3BzeDEzNiBjb3B5c2lnbiAgLTEuMDAwMDAwMDBFLTk5OSAgICAgMTEgLT4gMS4wMDAwMDAwMEUtOTk5CitjcHN4MTM3IGNvcHlzaWduICAtMUUtOTk5ICAgICAgICAgICAgICAxMSAtPiAxRS05OTkKK2Nwc3gxMzggY29weXNpZ24gIC05Ljk5OTk5OTk5RSs5OTkgICAgIDExIC0+IDkuOTk5OTk5OTlFKzk5OQorCistLSByZXBlYXQgd2l0aCBuZWdhdGl2ZSBSSFMKKworLS0gSW5maW5pdGllcworY3BzeDIxMSBjb3B5c2lnbiAgSW5maW5pdHkgICAgICAgLTM0IC0+IC1JbmZpbml0eQorY3BzeDIxMiBjb3B5c2lnbiAgLUluZmluaXR5ICAgICAgLTM0IC0+IC1JbmZpbml0eQorCistLSBOYU5zLCAwIHBheWxvYWQKK2Nwc3gyMjEgY29weXNpZ24gICAgICAgICBOYU4gICAgIC0zNCAtPiAtTmFOCitjcHN4MjIyIGNvcHlzaWduICAgICAgICAtTmFOICAgICAtMzQgLT4gLU5hTgorY3BzeDIyMyBjb3B5c2lnbiAgICAgICAgc05hTiAgICAgLTM0IC0+IC1zTmFOCitjcHN4MjI0IGNvcHlzaWduICAgICAgIC1zTmFOICAgICAtMzQgLT4gLXNOYU4KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorY3BzeDIzMSBjb3B5c2lnbiAgICAgICBOYU4xMCAgICAgLTM0IC0+IC1OYU4xMAorY3BzeDIzMiBjb3B5c2lnbiAgICAgIC1OYU4xMCAgICAgLTM0IC0+IC1OYU4xMAorY3BzeDIzMyBjb3B5c2lnbiAgICAgIHNOYU4xMCAgICAgLTM0IC0+IC1zTmFOMTAKK2Nwc3gyMzQgY29weXNpZ24gICAgIC1zTmFOMTAgICAgIC0zNCAtPiAtc05hTjEwCitjcHN4MjM1IGNvcHlzaWduICAgICAgIE5hTjcgICAgICAtMzQgLT4gLU5hTjcKK2Nwc3gyMzYgY29weXNpZ24gICAgICAtTmFONyAgICAgIC0zNCAtPiAtTmFONworY3BzeDIzNyBjb3B5c2lnbiAgICAgIHNOYU4xMDEgICAgLTM0IC0+IC1zTmFOMTAxCitjcHN4MjM4IGNvcHlzaWduICAgICAtc05hTjEwMSAgICAtMzQgLT4gLXNOYU4xMDEKKworLS0gZmluaXRlcworY3BzeDMwMSBjb3B5c2lnbiAgICAgICAgICA3ICAgICAgLTM0IC0+IC03CitjcHN4MzAyIGNvcHlzaWduICAgICAgICAgLTcgICAgICAtMzQgLT4gLTcKK2Nwc3gzMDMgY29weXNpZ24gICAgICAgICA3NSAgICAgIC0zNCAtPiAtNzUKK2Nwc3gzMDQgY29weXNpZ24gICAgICAgIC03NSAgICAgIC0zNCAtPiAtNzUKK2Nwc3gzMDUgY29weXNpZ24gICAgICAgNy41MCAgICAgIC0zNCAtPiAtNy41MAorY3BzeDMwNiBjb3B5c2lnbiAgICAgIC03LjUwICAgICAgLTM0IC0+IC03LjUwCitjcHN4MzA3IGNvcHlzaWduICAgICAgIDcuNTAwICAgICAtMzQgLT4gLTcuNTAwCitjcHN4MzA4IGNvcHlzaWduICAgICAgLTcuNTAwICAgICAtMzQgLT4gLTcuNTAwCisKKy0tIHplcm9zCitjcHN4MzExIGNvcHlzaWduICAgICAgICAgIDAgICAgICAtMzQgLT4gLTAKK2Nwc3gzMTIgY29weXNpZ24gICAgICAgICAtMCAgICAgIC0zNCAtPiAtMAorY3BzeDMxMyBjb3B5c2lnbiAgICAgICAwRSs0ICAgICAgLTM0IC0+IC0wRSs0CitjcHN4MzE0IGNvcHlzaWduICAgICAgLTBFKzQgICAgICAtMzQgLT4gLTBFKzQKK2Nwc3gzMTUgY29weXNpZ24gICAgIDAuMDAwMCAgICAgIC0zNCAtPiAtMC4wMDAwCitjcHN4MzE2IGNvcHlzaWduICAgIC0wLjAwMDAgICAgICAtMzQgLT4gLTAuMDAwMAorY3BzeDMxNyBjb3B5c2lnbiAgICAgIDBFLTE0MSAgICAgLTM0IC0+IC0wRS0xNDEKK2Nwc3gzMTggY29weXNpZ24gICAgIC0wRS0xNDEgICAgIC0zNCAtPiAtMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitjcHN4MzIxIGNvcHlzaWduICAgMjY4MjY4MjY4ICAgICAgICAgIC0xOCAtPiAtMjY4MjY4MjY4CitjcHN4MzIyIGNvcHlzaWduICAtMjY4MjY4MjY4ICAgICAgICAgIC0xOCAtPiAtMjY4MjY4MjY4CitjcHN4MzIzIGNvcHlzaWduICAgMTM0MTM0MTM0ICAgICAgICAgIC0xOCAtPiAtMTM0MTM0MTM0CitjcHN4MzI0IGNvcHlzaWduICAtMTM0MTM0MTM0ICAgICAgICAgIC0xOCAtPiAtMTM0MTM0MTM0CisKKy0tIE5tYXgsIE5taW4sIE50aW55CitjcHN4MzMxIGNvcHlzaWduICA5Ljk5OTk5OTk5RSs5OTkgICAgIC0xOCAtPiAtOS45OTk5OTk5OUUrOTk5CitjcHN4MzMyIGNvcHlzaWduICAxRS05OTkgICAgICAgICAgICAgIC0xOCAtPiAtMUUtOTk5CitjcHN4MzMzIGNvcHlzaWduICAxLjAwMDAwMDAwRS05OTkgICAgIC0xOCAtPiAtMS4wMDAwMDAwMEUtOTk5CitjcHN4MzM0IGNvcHlzaWduICAxRS0xMDA3ICAgICAgICAgICAgIC0xOCAtPiAtMUUtMTAwNworCitjcHN4MzM1IGNvcHlzaWduICAtMUUtMTAwNyAgICAgICAgICAgIC0xOCAtPiAtMUUtMTAwNworY3BzeDMzNiBjb3B5c2lnbiAgLTEuMDAwMDAwMDBFLTk5OSAgICAtMTggLT4gLTEuMDAwMDAwMDBFLTk5OQorY3BzeDMzNyBjb3B5c2lnbiAgLTFFLTk5OSAgICAgICAgICAgICAtMTggLT4gLTFFLTk5OQorY3BzeDMzOCBjb3B5c2lnbiAgLTkuOTk5OTk5OTlFKzk5OSAgICAtMTggLT4gLTkuOTk5OTk5OTlFKzk5OQorCistLSBPdGhlciBraW5kcyBvZiBSSFMKK2Nwc3g0MDEgY29weXNpZ24gICAgICAgICAgNzAxICAgIC0zNCAtPiAtNzAxCitjcHN4NDAyIGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtMzQgLT4gLTcyMAorY3BzeDQwMyBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgLTAgIC0+IC03MDEKK2Nwc3g0MDQgY29weXNpZ24gICAgICAgICAtNzIwICAgIC0wICAtPiAtNzIwCitjcHN4NDA1IGNvcHlzaWduICAgICAgICAgIDcwMSAgICArMCAgLT4gIDcwMQorY3BzeDQwNiBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgKzAgIC0+ICA3MjAKK2Nwc3g0MDcgY29weXNpZ24gICAgICAgICAgNzAxICAgICszNCAtPiAgNzAxCitjcHN4NDA4IGNvcHlzaWduICAgICAgICAgLTcyMCAgICArMzQgLT4gIDcyMAorCitjcHN4NDEzIGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtSW5mICAtPiAtNzAxCitjcHN4NDE0IGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtSW5mICAtPiAtNzIwCitjcHN4NDE1IGNvcHlzaWduICAgICAgICAgIDcwMSAgICArSW5mICAtPiAgNzAxCitjcHN4NDE2IGNvcHlzaWduICAgICAgICAgLTcyMCAgICArSW5mICAtPiAgNzIwCisKK2Nwc3g0MjAgY29weXNpZ24gICAgICAgICAgNzAxICAgIC1OYU4gIC0+IC03MDEKK2Nwc3g0MjEgY29weXNpZ24gICAgICAgICAtNzIwICAgIC1OYU4gIC0+IC03MjAKK2Nwc3g0MjIgY29weXNpZ24gICAgICAgICAgNzAxICAgICtOYU4gIC0+ICA3MDEKK2Nwc3g0MjMgY29weXNpZ24gICAgICAgICAtNzIwICAgICtOYU4gIC0+ICA3MjAKK2Nwc3g0MjUgY29weXNpZ24gICAgICAgICAtNzIwICAgICtOYU44IC0+ICA3MjAKKworY3BzeDQyNiBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgLXNOYU4gIC0+IC03MDEKK2Nwc3g0MjcgY29weXNpZ24gICAgICAgICAtNzIwICAgIC1zTmFOICAtPiAtNzIwCitjcHN4NDI4IGNvcHlzaWduICAgICAgICAgIDcwMSAgICArc05hTiAgLT4gIDcwMQorY3BzeDQyOSBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgK3NOYU4gIC0+ICA3MjAKK2Nwc3g0MzAgY29weXNpZ24gICAgICAgICAtNzIwICAgICtzTmFOMyAtPiAgNzIwCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRBYnMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRBYnMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOThkNjRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZEFicy5kZWNUZXN0CkBAIC0wLDAgKzEsMTI2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkQWJzLmRlY1Rlc3QgLS0gZGVjRG91YmxlIGFic29sdXRlIHZhbHVlLCBoZWVkaW5nIHNOYU4gICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2RkYWJzMDAxIGFicyAnMScgICAgICAtPiAnMScKK2RkYWJzMDAyIGFicyAnLTEnICAgICAtPiAnMScKK2RkYWJzMDAzIGFicyAnMS4wMCcgICAtPiAnMS4wMCcKK2RkYWJzMDA0IGFicyAnLTEuMDAnICAtPiAnMS4wMCcKK2RkYWJzMDA1IGFicyAnMCcgICAgICAtPiAnMCcKK2RkYWJzMDA2IGFicyAnMC4wMCcgICAtPiAnMC4wMCcKK2RkYWJzMDA3IGFicyAnMDAuMCcgICAtPiAnMC4wJworZGRhYnMwMDggYWJzICcwMC4wMCcgIC0+ICcwLjAwJworZGRhYnMwMDkgYWJzICcwMCcgICAgIC0+ICcwJworCitkZGFiczAxMCBhYnMgJy0yJyAgICAgLT4gJzInCitkZGFiczAxMSBhYnMgJzInICAgICAgLT4gJzInCitkZGFiczAxMiBhYnMgJy0yLjAwJyAgLT4gJzIuMDAnCitkZGFiczAxMyBhYnMgJzIuMDAnICAgLT4gJzIuMDAnCitkZGFiczAxNCBhYnMgJy0wJyAgICAgLT4gJzAnCitkZGFiczAxNSBhYnMgJy0wLjAwJyAgLT4gJzAuMDAnCitkZGFiczAxNiBhYnMgJy0wMC4wJyAgLT4gJzAuMCcKK2RkYWJzMDE3IGFicyAnLTAwLjAwJyAtPiAnMC4wMCcKK2RkYWJzMDE4IGFicyAnLTAwJyAgICAtPiAnMCcKKworZGRhYnMwMjAgYWJzICctMjAwMDAwMCcgLT4gJzIwMDAwMDAnCitkZGFiczAyMSBhYnMgJzIwMDAwMDAnICAtPiAnMjAwMDAwMCcKKworZGRhYnMwMzAgYWJzICcrMC4xJyAgICAgICAgICAgIC0+ICcwLjEnCitkZGFiczAzMSBhYnMgJy0wLjEnICAgICAgICAgICAgLT4gJzAuMScKK2RkYWJzMDMyIGFicyAnKzAuMDEnICAgICAgICAgICAtPiAnMC4wMScKK2RkYWJzMDMzIGFicyAnLTAuMDEnICAgICAgICAgICAtPiAnMC4wMScKK2RkYWJzMDM0IGFicyAnKzAuMDAxJyAgICAgICAgICAtPiAnMC4wMDEnCitkZGFiczAzNSBhYnMgJy0wLjAwMScgICAgICAgICAgLT4gJzAuMDAxJworZGRhYnMwMzYgYWJzICcrMC4wMDAwMDEnICAgICAgIC0+ICcwLjAwMDAwMScKK2RkYWJzMDM3IGFicyAnLTAuMDAwMDAxJyAgICAgICAtPiAnMC4wMDAwMDEnCitkZGFiczAzOCBhYnMgJyswLjAwMDAwMDAwMDAwMScgLT4gJzFFLTEyJworZGRhYnMwMzkgYWJzICctMC4wMDAwMDAwMDAwMDEnIC0+ICcxRS0xMicKKworLS0gZXhhbXBsZXMgZnJvbSBkZWNBcml0aAorZGRhYnMwNDAgYWJzICcyLjEnICAgICAtPiAgJzIuMScKK2RkYWJzMDQxIGFicyAnLTEwMCcgICAgLT4gICcxMDAnCitkZGFiczA0MiBhYnMgJzEwMS41JyAgIC0+ICAnMTAxLjUnCitkZGFiczA0MyBhYnMgJy0xMDEuNScgIC0+ICAnMTAxLjUnCisKKy0tIG1vcmUgZml4ZWQsIHBvdGVudGlhbCBMSFMgc3dhcHMvb3ZlcmxheXMgaWYgZG9uZSBieSBzdWJ0cmFjdCAwCitkZGFiczA2MCBhYnMgJy01NjI2N0UtMTAnICAtPiAnMC4wMDAwMDU2MjY3JworZGRhYnMwNjEgYWJzICctNTYyNjdFLTUnICAgLT4gJzAuNTYyNjcnCitkZGFiczA2MiBhYnMgJy01NjI2N0UtMicgICAtPiAnNTYyLjY3JworZGRhYnMwNjMgYWJzICctNTYyNjdFLTEnICAgLT4gJzU2MjYuNycKK2RkYWJzMDY1IGFicyAnLTU2MjY3RS0wJyAgIC0+ICc1NjI2NycKKworLS0gc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93CisKKy0tIGxvbmcgb3BlcmFuZCB0ZXN0cworZGRhYnMzMjEgYWJzIDEyMzQ1Njc4OTAxMjM0NTYgIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2RkYWJzMzIyIGFicyAxMjM0NTY3ODAwMCAgLT4gMTIzNDU2NzgwMDAKK2RkYWJzMzIzIGFicyAxMjM0NTY3ODAwICAgLT4gMTIzNDU2NzgwMAorZGRhYnMzMjQgYWJzIDEyMzQ1Njc4OTAgICAtPiAxMjM0NTY3ODkwCitkZGFiczMyNSBhYnMgMTIzNDU2Nzg5MSAgIC0+IDEyMzQ1Njc4OTEKK2RkYWJzMzI2IGFicyAxMjM0NTY3ODkwMSAgLT4gMTIzNDU2Nzg5MDEKK2RkYWJzMzI3IGFicyAxMjM0NTY3ODk2ICAgLT4gMTIzNDU2Nzg5NgorCistLSB6ZXJvcworZGRhYnMxMTEgYWJzICAgICAgICAgIDAgICAtPiAwCitkZGFiczExMiBhYnMgICAgICAgICAtMCAgIC0+IDAKK2RkYWJzMTEzIGFicyAgICAgICAwRSs2ICAgLT4gMEUrNgorZGRhYnMxMTQgYWJzICAgICAgLTBFKzYgICAtPiAwRSs2CitkZGFiczExNSBhYnMgICAgIDAuMDAwMCAgIC0+IDAuMDAwMAorZGRhYnMxMTYgYWJzICAgIC0wLjAwMDAgICAtPiAwLjAwMDAKK2RkYWJzMTE3IGFicyAgICAgIDBFLTE0MSAgLT4gMEUtMTQxCitkZGFiczExOCBhYnMgICAgIC0wRS0xNDEgIC0+IDBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZGRhYnMxMjEgYWJzICAyNjgyNjgyNjgyNjgyNjgyICAgICAgICAgLT4gMjY4MjY4MjY4MjY4MjY4MgorZGRhYnMxMjIgYWJzICAtMjY4MjY4MjY4MjY4MjY4MiAgICAgICAgLT4gMjY4MjY4MjY4MjY4MjY4MgorZGRhYnMxMjMgYWJzICAxMzQxMzQxMzQxMzQxMzQxICAgICAgICAgLT4gMTM0MTM0MTM0MTM0MTM0MQorZGRhYnMxMjQgYWJzICAtMTM0MTM0MTM0MTM0MTM0MSAgICAgICAgLT4gMTM0MTM0MTM0MTM0MTM0MQorCistLSBObWF4LCBObWluLCBOdGlueQorZGRhYnMxMzEgYWJzICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRhYnMxMzIgYWJzICAxRS0zODMgICAgICAgICAgICAgICAgICAgLT4gMUUtMzgzCitkZGFiczEzMyBhYnMgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZGFiczEzNCBhYnMgIDFFLTM5OCAgICAgICAgICAgICAgICAgICAtPiAxRS0zOTggU3Vibm9ybWFsCisKK2RkYWJzMTM1IGFicyAgLTFFLTM5OCAgICAgICAgICAgICAgICAgIC0+IDFFLTM5OCBTdWJub3JtYWwKK2RkYWJzMTM2IGFicyAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2RkYWJzMTM3IGFicyAgLTFFLTM4MyAgICAgICAgICAgICAgICAgIC0+IDFFLTM4MworZGRhYnMxMzggYWJzICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorCistLSBzcGVjaWFscworZGRhYnM1MjAgYWJzICdJbmYnICAgIC0+ICdJbmZpbml0eScKK2RkYWJzNTIxIGFicyAnLUluZicgICAtPiAnSW5maW5pdHknCitkZGFiczUyMiBhYnMgICBOYU4gICAgLT4gIE5hTgorZGRhYnM1MjMgYWJzICBzTmFOICAgIC0+ICBOYU4gICBJbnZhbGlkX29wZXJhdGlvbgorZGRhYnM1MjQgYWJzICAgTmFOMjIgIC0+ICBOYU4yMgorZGRhYnM1MjUgYWJzICBzTmFOMzMgIC0+ICBOYU4zMyBJbnZhbGlkX29wZXJhdGlvbgorZGRhYnM1MjYgYWJzICAtTmFOMjIgIC0+IC1OYU4yMgorZGRhYnM1MjcgYWJzIC1zTmFOMzMgIC0+IC1OYU4zMyBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOdWxsIHRlc3RzCitkZGFiczkwMCBhYnMgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRBZGQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRBZGQuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjEyY2U0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZEFkZC5kZWNUZXN0CkBAIC0wLDAgKzEsMTMyOCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZEFkZC5kZWNUZXN0IC0tIGRlY0RvdWJsZSBhZGRpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgc2V0IG9mIHRlc3RzIGFyZSBmb3IgZGVjRG91YmxlcyBvbmx5OyBhbGwgYXJndW1lbnRzIGFyZQorLS0gcmVwcmVzZW50YWJsZSBpbiBhIGRlY0RvdWJsZQorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFtmaXJzdCBncm91cCBhcmUgJ3F1aWNrIGNvbmZpZGVuY2UgY2hlY2snXQorZGRhZGQwMDEgYWRkIDEgICAgICAgMSAgICAgICAtPiAgMgorZGRhZGQwMDIgYWRkIDIgICAgICAgMyAgICAgICAtPiAgNQorZGRhZGQwMDMgYWRkICc1Ljc1JyAgJzMuMycgICAtPiAgOS4wNQorZGRhZGQwMDQgYWRkICc1JyAgICAgJy0zJyAgICAtPiAgMgorZGRhZGQwMDUgYWRkICctNScgICAgJy0zJyAgICAtPiAgLTgKK2RkYWRkMDA2IGFkZCAnLTcnICAgICcyLjUnICAgLT4gIC00LjUKK2RkYWRkMDA3IGFkZCAnMC43JyAgICcwLjMnICAgLT4gIDEuMAorZGRhZGQwMDggYWRkICcxLjI1JyAgJzEuMjUnICAtPiAgMi41MAorZGRhZGQwMDkgYWRkICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMDAnIC0+ICcyLjIzNDU2Nzg5JworZGRhZGQwMTAgYWRkICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMTEnIC0+ICcyLjIzNDU2ODAwJworCistLSAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorZGRhZGQwMTEgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDYnICAnMC41NTU1NTU1NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQwMTIgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDUnICAnMC41NTU1NTU1NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2RkYWRkMDEzIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NScgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OScKK2RkYWRkMDE0IGFkZCAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC40OScgICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDAxNSBhZGQgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNDk5JyAgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZGRhZGQwMTYgYWRkICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjQ5OTknIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMDE3IGFkZCAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MDAwJyAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDAxOCBhZGQgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNTAwMScgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorZGRhZGQwMTkgYWRkICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjUwMScgIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMDIwIGFkZCAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MScgICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCisKK2RkYWRkMDIxIGFkZCAwIDEgLT4gMQorZGRhZGQwMjIgYWRkIDEgMSAtPiAyCitkZGFkZDAyMyBhZGQgMiAxIC0+IDMKK2RkYWRkMDI0IGFkZCAzIDEgLT4gNAorZGRhZGQwMjUgYWRkIDQgMSAtPiA1CitkZGFkZDAyNiBhZGQgNSAxIC0+IDYKK2RkYWRkMDI3IGFkZCA2IDEgLT4gNworZGRhZGQwMjggYWRkIDcgMSAtPiA4CitkZGFkZDAyOSBhZGQgOCAxIC0+IDkKK2RkYWRkMDMwIGFkZCA5IDEgLT4gMTAKKworLS0gc29tZSBjYXJyeWluZyBlZmZlY3RzCitkZGFkZDAzMSBhZGQgJzAuOTk5OCcgICcwLjAwMDAnIC0+ICcwLjk5OTgnCitkZGFkZDAzMiBhZGQgJzAuOTk5OCcgICcwLjAwMDEnIC0+ICcwLjk5OTknCitkZGFkZDAzMyBhZGQgJzAuOTk5OCcgICcwLjAwMDInIC0+ICcxLjAwMDAnCitkZGFkZDAzNCBhZGQgJzAuOTk5OCcgICcwLjAwMDMnIC0+ICcxLjAwMDEnCisKK2RkYWRkMDM1IGFkZCAnNzAnICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMDM2IGFkZCAnNzAwJyAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDAzNyBhZGQgJzcwMDAnICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMDM4IGFkZCAnNzAwMDAnICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDFFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMDM5IGFkZCAnNzAwMDAwJyAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDA3RSsyMCcgUm91bmRlZAorCistLSBzeW1tZXRyeToKK2RkYWRkMDQwIGFkZCAnMTAwMDBlKzE2JyAgJzcwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMDQxIGFkZCAnMTAwMDBlKzE2JyAgJzcwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDA0MiBhZGQgJzEwMDAwZSsxNicgICc3MDAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMDQ0IGFkZCAnMTAwMDBlKzE2JyAgJzcwMDAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDFFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMDQ1IGFkZCAnMTAwMDBlKzE2JyAgJzcwMDAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDA3RSsyMCcgUm91bmRlZAorCistLSBzYW1lLCB3aXRob3V0IHJvdW5kaW5nCitkZGFkZDA0NiBhZGQgJzEwMDAwZSs5JyAgJzcnIC0+ICcxMDAwMDAwMDAwMDAwNycKK2RkYWRkMDQ3IGFkZCAnMTAwMDBlKzknICAnNzAnIC0+ICcxMDAwMDAwMDAwMDA3MCcKK2RkYWRkMDQ4IGFkZCAnMTAwMDBlKzknICAnNzAwJyAtPiAnMTAwMDAwMDAwMDA3MDAnCitkZGFkZDA0OSBhZGQgJzEwMDAwZSs5JyAgJzcwMDAnIC0+ICcxMDAwMDAwMDAwNzAwMCcKK2RkYWRkMDUwIGFkZCAnMTAwMDBlKzknICAnNzAwMDAnIC0+ICcxMDAwMDAwMDA3MDAwMCcKK2RkYWRkMDUxIGFkZCAnMTAwMDBlKzknICAnNzAwMDAwJyAtPiAnMTAwMDAwMDA3MDAwMDAnCitkZGFkZDA1MiBhZGQgJzEwMDAwZSs5JyAgJzcwMDAwMDAnIC0+ICcxMDAwMDAwNzAwMDAwMCcKKworLS0gZXhhbXBsZXMgZnJvbSBkZWNhcml0aAorZGRhZGQwNTMgYWRkICcxMicgJzcuMDAnIC0+ICcxOS4wMCcKK2RkYWRkMDU0IGFkZCAnMS4zJyAnLTEuMDcnIC0+ICcwLjIzJworZGRhZGQwNTUgYWRkICcxLjMnICctMS4zMCcgLT4gJzAuMDAnCitkZGFkZDA1NiBhZGQgJzEuMycgJy0yLjA3JyAtPiAnLTAuNzcnCitkZGFkZDA1NyBhZGQgJzFFKzInICcxRSs0JyAtPiAnMS4wMUUrNCcKKworLS0gbGVhZGluZyB6ZXJvIHByZXNlcnZhdGlvbgorZGRhZGQwNjEgYWRkIDEgJzAuMDAwMScgLT4gJzEuMDAwMScKK2RkYWRkMDYyIGFkZCAxICcwLjAwMDAxJyAtPiAnMS4wMDAwMScKK2RkYWRkMDYzIGFkZCAxICcwLjAwMDAwMScgLT4gJzEuMDAwMDAxJworZGRhZGQwNjQgYWRkIDEgJzAuMDAwMDAwMScgLT4gJzEuMDAwMDAwMScKK2RkYWRkMDY1IGFkZCAxICcwLjAwMDAwMDAxJyAtPiAnMS4wMDAwMDAwMScKKworLS0gc29tZSBmdW5ueSB6ZXJvcyBbaW4gY2FzZSBvZiBiYWQgc2lnbnVtXQorZGRhZGQwNzAgYWRkIDEgIDAgICAgLT4gMQorZGRhZGQwNzEgYWRkIDEgMC4gICAgLT4gMQorZGRhZGQwNzIgYWRkIDEgIC4wICAgLT4gMS4wCitkZGFkZDA3MyBhZGQgMSAwLjAgICAtPiAxLjAKK2RkYWRkMDc0IGFkZCAxIDAuMDAgIC0+IDEuMDAKK2RkYWRkMDc1IGFkZCAgMCAgMSAgIC0+IDEKK2RkYWRkMDc2IGFkZCAwLiAgMSAgIC0+IDEKK2RkYWRkMDc3IGFkZCAgLjAgMSAgIC0+IDEuMAorZGRhZGQwNzggYWRkIDAuMCAxICAgLT4gMS4wCitkZGFkZDA3OSBhZGQgMC4wMCAxICAtPiAxLjAwCisKKy0tIHNvbWUgY2FycmllcworZGRhZGQwODAgYWRkIDk5OTk5OTk5OCAxICAtPiA5OTk5OTk5OTkKK2RkYWRkMDgxIGFkZCA5OTk5OTk5OTkgMSAgLT4gMTAwMDAwMDAwMAorZGRhZGQwODIgYWRkICA5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAKK2RkYWRkMDgzIGFkZCAgIDk5OTk5OTkgMSAgLT4gMTAwMDAwMDAKK2RkYWRkMDg0IGFkZCAgICA5OTk5OTkgMSAgLT4gMTAwMDAwMAorZGRhZGQwODUgYWRkICAgICA5OTk5OSAxICAtPiAxMDAwMDAKK2RkYWRkMDg2IGFkZCAgICAgIDk5OTkgMSAgLT4gMTAwMDAKK2RkYWRkMDg3IGFkZCAgICAgICA5OTkgMSAgLT4gMTAwMAorZGRhZGQwODggYWRkICAgICAgICA5OSAxICAtPiAxMDAKK2RkYWRkMDg5IGFkZCAgICAgICAgIDkgMSAgLT4gMTAKKworCistLSBtb3JlIExIUyBzd2FwcworZGRhZGQwOTAgYWRkICctNTYyNjdFLTEwJyAgIDAgLT4gICctMC4wMDAwMDU2MjY3JworZGRhZGQwOTEgYWRkICctNTYyNjdFLTYnICAgIDAgLT4gICctMC4wNTYyNjcnCitkZGFkZDA5MiBhZGQgJy01NjI2N0UtNScgICAgMCAtPiAgJy0wLjU2MjY3JworZGRhZGQwOTMgYWRkICctNTYyNjdFLTQnICAgIDAgLT4gICctNS42MjY3JworZGRhZGQwOTQgYWRkICctNTYyNjdFLTMnICAgIDAgLT4gICctNTYuMjY3JworZGRhZGQwOTUgYWRkICctNTYyNjdFLTInICAgIDAgLT4gICctNTYyLjY3JworZGRhZGQwOTYgYWRkICctNTYyNjdFLTEnICAgIDAgLT4gICctNTYyNi43JworZGRhZGQwOTcgYWRkICctNTYyNjdFLTAnICAgIDAgLT4gICctNTYyNjcnCitkZGFkZDA5OCBhZGQgJy01RS0xMCcgICAgICAgMCAtPiAgJy01RS0xMCcKK2RkYWRkMDk5IGFkZCAnLTVFLTcnICAgICAgICAwIC0+ICAnLTVFLTcnCitkZGFkZDEwMCBhZGQgJy01RS02JyAgICAgICAgMCAtPiAgJy0wLjAwMDAwNScKK2RkYWRkMTAxIGFkZCAnLTVFLTUnICAgICAgICAwIC0+ICAnLTAuMDAwMDUnCitkZGFkZDEwMiBhZGQgJy01RS00JyAgICAgICAgMCAtPiAgJy0wLjAwMDUnCitkZGFkZDEwMyBhZGQgJy01RS0xJyAgICAgICAgMCAtPiAgJy0wLjUnCitkZGFkZDEwNCBhZGQgJy01RTAnICAgICAgICAgMCAtPiAgJy01JworZGRhZGQxMDUgYWRkICctNUUxJyAgICAgICAgIDAgLT4gICctNTAnCitkZGFkZDEwNiBhZGQgJy01RTUnICAgICAgICAgMCAtPiAgJy01MDAwMDAnCitkZGFkZDEwNyBhZGQgJy01RTE1JyAgICAgICAgMCAtPiAgJy01MDAwMDAwMDAwMDAwMDAwJworZGRhZGQxMDggYWRkICctNUUxNicgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE2JyAgUm91bmRlZAorZGRhZGQxMDkgYWRkICctNUUxNycgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE3JyAgUm91bmRlZAorZGRhZGQxMTAgYWRkICctNUUxOCcgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE4JyAgUm91bmRlZAorZGRhZGQxMTEgYWRkICctNUUxMDAnICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzEwMCcgUm91bmRlZAorCistLSBtb3JlIFJIUyBzd2FwcworZGRhZGQxMTMgYWRkIDAgICctNTYyNjdFLTEwJyAtPiAgJy0wLjAwMDAwNTYyNjcnCitkZGFkZDExNCBhZGQgMCAgJy01NjI2N0UtNicgIC0+ICAnLTAuMDU2MjY3JworZGRhZGQxMTYgYWRkIDAgICctNTYyNjdFLTUnICAtPiAgJy0wLjU2MjY3JworZGRhZGQxMTcgYWRkIDAgICctNTYyNjdFLTQnICAtPiAgJy01LjYyNjcnCitkZGFkZDExOSBhZGQgMCAgJy01NjI2N0UtMycgIC0+ICAnLTU2LjI2NycKK2RkYWRkMTIwIGFkZCAwICAnLTU2MjY3RS0yJyAgLT4gICctNTYyLjY3JworZGRhZGQxMjEgYWRkIDAgICctNTYyNjdFLTEnICAtPiAgJy01NjI2LjcnCitkZGFkZDEyMiBhZGQgMCAgJy01NjI2N0UtMCcgIC0+ICAnLTU2MjY3JworZGRhZGQxMjMgYWRkIDAgICctNUUtMTAnICAgICAtPiAgJy01RS0xMCcKK2RkYWRkMTI0IGFkZCAwICAnLTVFLTcnICAgICAgLT4gICctNUUtNycKK2RkYWRkMTI1IGFkZCAwICAnLTVFLTYnICAgICAgLT4gICctMC4wMDAwMDUnCitkZGFkZDEyNiBhZGQgMCAgJy01RS01JyAgICAgIC0+ICAnLTAuMDAwMDUnCitkZGFkZDEyNyBhZGQgMCAgJy01RS00JyAgICAgIC0+ICAnLTAuMDAwNScKK2RkYWRkMTI4IGFkZCAwICAnLTVFLTEnICAgICAgLT4gICctMC41JworZGRhZGQxMjkgYWRkIDAgICctNUUwJyAgICAgICAtPiAgJy01JworZGRhZGQxMzAgYWRkIDAgICctNUUxJyAgICAgICAtPiAgJy01MCcKK2RkYWRkMTMxIGFkZCAwICAnLTVFNScgICAgICAgLT4gICctNTAwMDAwJworZGRhZGQxMzIgYWRkIDAgICctNUUxNScgICAgICAtPiAgJy01MDAwMDAwMDAwMDAwMDAwJworZGRhZGQxMzMgYWRkIDAgICctNUUxNicgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTYnICAgUm91bmRlZAorZGRhZGQxMzQgYWRkIDAgICctNUUxNycgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTcnICAgUm91bmRlZAorZGRhZGQxMzUgYWRkIDAgICctNUUxOCcgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTgnICAgUm91bmRlZAorZGRhZGQxMzYgYWRkIDAgICctNUUxMDAnICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTAwJyAgUm91bmRlZAorCistLSByZWxhdGVkCitkZGFkZDEzNyBhZGQgIDEgICcwRS0xOScgICAgICAtPiAgJzEuMDAwMDAwMDAwMDAwMDAwJyAgUm91bmRlZAorZGRhZGQxMzggYWRkIC0xICAnMEUtMTknICAgICAgLT4gICctMS4wMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2RkYWRkMTM5IGFkZCAnMEUtMTknIDEgICAgICAgIC0+ICAnMS4wMDAwMDAwMDAwMDAwMDAnICBSb3VuZGVkCitkZGFkZDE0MCBhZGQgJzBFLTE5JyAtMSAgICAgICAtPiAgJy0xLjAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZGRhZGQxNDEgYWRkIDFFKzExICAgMC4wMDAwICAgLT4gICcxMDAwMDAwMDAwMDAuMDAwMCcKK2RkYWRkMTQyIGFkZCAxRSsxMSAgIDAuMDAwMDAgIC0+ICAnMTAwMDAwMDAwMDAwLjAwMDAnICBSb3VuZGVkCitkZGFkZDE0MyBhZGQgMC4wMDAgICAxRSsxMiAgICAtPiAgJzEwMDAwMDAwMDAwMDAuMDAwJworZGRhZGQxNDQgYWRkIDAuMDAwMCAgMUUrMTIgICAgLT4gICcxMDAwMDAwMDAwMDAwLjAwMCcgIFJvdW5kZWQKKworLS0gW3NvbWUgb2YgdGhlIG5leHQgZ3JvdXAgYXJlIHJlYWxseSBjb25zdHJ1Y3RvciB0ZXN0c10KK2RkYWRkMTQ2IGFkZCAnMDAuMCcgIDAgICAgICAgLT4gICcwLjAnCitkZGFkZDE0NyBhZGQgJzAuMDAnICAwICAgICAgIC0+ICAnMC4wMCcKK2RkYWRkMTQ4IGFkZCAgMCAgICAgICcwLjAwJyAgLT4gICcwLjAwJworZGRhZGQxNDkgYWRkICAwICAgICAgJzAwLjAnICAtPiAgJzAuMCcKK2RkYWRkMTUwIGFkZCAnMDAuMCcgICcwLjAwJyAgLT4gICcwLjAwJworZGRhZGQxNTEgYWRkICcwLjAwJyAgJzAwLjAnICAtPiAgJzAuMDAnCitkZGFkZDE1MiBhZGQgJzMnICAgICAnLjMnICAgIC0+ICAnMy4zJworZGRhZGQxNTMgYWRkICczLicgICAgJy4zJyAgICAtPiAgJzMuMycKK2RkYWRkMTU0IGFkZCAnMy4wJyAgICcuMycgICAgLT4gICczLjMnCitkZGFkZDE1NSBhZGQgJzMuMDAnICAnLjMnICAgIC0+ICAnMy4zMCcKK2RkYWRkMTU2IGFkZCAnMycgICAgICczJyAgICAgLT4gICc2JworZGRhZGQxNTcgYWRkICczJyAgICAgJyszJyAgICAtPiAgJzYnCitkZGFkZDE1OCBhZGQgJzMnICAgICAnLTMnICAgIC0+ICAnMCcKK2RkYWRkMTU5IGFkZCAnMC4zJyAgICctMC4zJyAgLT4gICcwLjAnCitkZGFkZDE2MCBhZGQgJzAuMDMnICAnLTAuMDMnIC0+ICAnMC4wMCcKKworLS0gdHJ5IGJvcmRlcmxpbmUgcHJlY2lzaW9uLCB3aXRoIGNhcnJpZXMsIGV0Yy4KK2RkYWRkMTYxIGFkZCAnMUUrMTInICctMScgICAgLT4gJzk5OTk5OTk5OTk5OScKK2RkYWRkMTYyIGFkZCAnMUUrMTInICAnMS4xMScgLT4gJzEwMDAwMDAwMDAwMDEuMTEnCitkZGFkZDE2MyBhZGQgJzEuMTEnICAnMUUrMTInIC0+ICcxMDAwMDAwMDAwMDAxLjExJworZGRhZGQxNjQgYWRkICctMScgICAgJzFFKzEyJyAtPiAnOTk5OTk5OTk5OTk5JworZGRhZGQxNjUgYWRkICc3RSsxMicgJy0xJyAgICAtPiAnNjk5OTk5OTk5OTk5OScKK2RkYWRkMTY2IGFkZCAnN0UrMTInICAnMS4xMScgLT4gJzcwMDAwMDAwMDAwMDEuMTEnCitkZGFkZDE2NyBhZGQgJzEuMTEnICAnN0UrMTInIC0+ICc3MDAwMDAwMDAwMDAxLjExJworZGRhZGQxNjggYWRkICctMScgICAgJzdFKzEyJyAtPiAnNjk5OTk5OTk5OTk5OScKKworcm91bmRpbmc6IGhhbGZfdXAKKy0tICAgICAgICAgICAxLjIzNDU2Nzg5MDEyMzQ1NiAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAxIDIzNDU2Nzg5MDEyMzQ1NgorZGRhZGQxNzAgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjcnIC0+ICc1LjAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDE3MSBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2NicgLT4gJzUuMDAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMTcyIGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTY1JyAtPiAnNS4wMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZGRhZGQxNzMgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjQnIC0+ICc1LjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDE3NCBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1MycgLT4gJzQuOTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMTc1IGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUyJyAtPiAnNC45OTk5OTk5OTk5OTk5OTknIEluZXhhY3QgUm91bmRlZAorZGRhZGQxNzYgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTEnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDE3NyBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1MCcgLT4gJzQuOTk5OTk5OTk5OTk5OTk5JyBSb3VuZGVkCitkZGFkZDE3OCBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU0NScgLT4gJzQuOTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMTc5IGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTQ0JyAtPiAnNC45OTk5OTk5OTk5OTk5OTgnIEluZXhhY3QgUm91bmRlZAorZGRhZGQxODAgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NDMnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDE4MSBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU0MicgLT4gJzQuOTk5OTk5OTk5OTk5OTk4JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMTgyIGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTQxJyAtPiAnNC45OTk5OTk5OTk5OTk5OTgnIEluZXhhY3QgUm91bmRlZAorZGRhZGQxODMgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NDAnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OCcgUm91bmRlZAorCistLSBhbmQgc29tZSBtb3JlLCBpbmNsdWRpbmcgcmVzaWR1ZSBlZmZlY3RzIGFuZCBkaWZmZXJlbnQgcm91bmRpbmdzCityb3VuZGluZzogaGFsZl91cAorZGRhZGQyMDAgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JworZGRhZGQyMDEgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjAyIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIwMyBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMDQgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjA1IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIwNiBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMDcgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjA4IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIwOSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMTAgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjExIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIxMiBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMTMgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjE0IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIxNSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMTYgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJworZGRhZGQyMTcgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjE4IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIxOSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCitkZGFkZDIyMCBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknCitkZGFkZDIyMSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMjIgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjIzIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIyNCBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMjUgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjI2IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIyNyBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMjggYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjI5IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIzMCBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMzEgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjMyIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIzMyBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMzQgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjM1IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIzNiBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnCitkZGFkZDIzNyBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMzggYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjM5IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorZGRhZGQyNDAgYWRkICcxMjM0NTYwMTIzNDU2Nzg4JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjQxIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OCcgMC41ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI0MiBhZGQgJzEyMzQ1NjAxMjM0NTY3ODgnIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorZGRhZGQyNTAgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JworZGRhZGQyNTEgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjUyIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI1MyBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyNTQgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjU1IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI1NiBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyNTcgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjU4IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI1OSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyNjAgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjYxIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI2MiBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyNjMgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjY0IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI2NSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyNjYgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJworZGRhZGQyNjcgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjY4IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI2OSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCistLSAxIGluIGxhc3QgcGxhY2UgdGVzdHMKK3JvdW5kaW5nOiBoYWxmX3VwCitkZGFkZDMwMSBhZGQgIC0xICAgMSAgICAgIC0+ICAgMAorZGRhZGQzMDIgYWRkICAgMCAgIDEgICAgICAtPiAgIDEKK2RkYWRkMzAzIGFkZCAgIDEgICAxICAgICAgLT4gICAyCitkZGFkZDMwNCBhZGQgIDEyICAgMSAgICAgIC0+ICAxMworZGRhZGQzMDUgYWRkICA5OCAgIDEgICAgICAtPiAgOTkKK2RkYWRkMzA2IGFkZCAgOTkgICAxICAgICAgLT4gMTAwCitkZGFkZDMwNyBhZGQgMTAwICAgMSAgICAgIC0+IDEwMQorZGRhZGQzMDggYWRkIDEwMSAgIDEgICAgICAtPiAxMDIKK2RkYWRkMzA5IGFkZCAgLTEgIC0xICAgICAgLT4gIC0yCitkZGFkZDMxMCBhZGQgICAwICAtMSAgICAgIC0+ICAtMQorZGRhZGQzMTEgYWRkICAgMSAgLTEgICAgICAtPiAgIDAKK2RkYWRkMzEyIGFkZCAgMTIgIC0xICAgICAgLT4gIDExCitkZGFkZDMxMyBhZGQgIDk4ICAtMSAgICAgIC0+ICA5NworZGRhZGQzMTQgYWRkICA5OSAgLTEgICAgICAtPiAgOTgKK2RkYWRkMzE1IGFkZCAxMDAgIC0xICAgICAgLT4gIDk5CitkZGFkZDMxNiBhZGQgMTAxICAtMSAgICAgIC0+IDEwMAorCitkZGFkZDMyMSBhZGQgLTAuMDEgIDAuMDEgICAgLT4gIDAuMDAKK2RkYWRkMzIyIGFkZCAgMC4wMCAgMC4wMSAgICAtPiAgMC4wMQorZGRhZGQzMjMgYWRkICAwLjAxICAwLjAxICAgIC0+ICAwLjAyCitkZGFkZDMyNCBhZGQgIDAuMTIgIDAuMDEgICAgLT4gIDAuMTMKK2RkYWRkMzI1IGFkZCAgMC45OCAgMC4wMSAgICAtPiAgMC45OQorZGRhZGQzMjYgYWRkICAwLjk5ICAwLjAxICAgIC0+ICAxLjAwCitkZGFkZDMyNyBhZGQgIDEuMDAgIDAuMDEgICAgLT4gIDEuMDEKK2RkYWRkMzI4IGFkZCAgMS4wMSAgMC4wMSAgICAtPiAgMS4wMgorZGRhZGQzMjkgYWRkIC0wLjAxIC0wLjAxICAgIC0+IC0wLjAyCitkZGFkZDMzMCBhZGQgIDAuMDAgLTAuMDEgICAgLT4gLTAuMDEKK2RkYWRkMzMxIGFkZCAgMC4wMSAtMC4wMSAgICAtPiAgMC4wMAorZGRhZGQzMzIgYWRkICAwLjEyIC0wLjAxICAgIC0+ICAwLjExCitkZGFkZDMzMyBhZGQgIDAuOTggLTAuMDEgICAgLT4gIDAuOTcKK2RkYWRkMzM0IGFkZCAgMC45OSAtMC4wMSAgICAtPiAgMC45OAorZGRhZGQzMzUgYWRkICAxLjAwIC0wLjAxICAgIC0+ICAwLjk5CitkZGFkZDMzNiBhZGQgIDEuMDEgLTAuMDEgICAgLT4gIDEuMDAKKworLS0gc29tZSBtb3JlIGNhc2VzIHdoZXJlIGFkZGluZyAwIGFmZmVjdHMgdGhlIGNvZWZmaWNpZW50CitkZGFkZDM0MCBhZGQgMUUrMyAgICAwICAgIC0+ICAgICAgICAgMTAwMAorZGRhZGQzNDEgYWRkIDFFKzE1ICAgMCAgICAtPiAgICAxMDAwMDAwMDAwMDAwMDAwCitkZGFkZDM0MiBhZGQgMUUrMTYgICAwICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2ICBSb3VuZGVkCitkZGFkZDM0MyBhZGQgMUUrMjAgICAwICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzIwICBSb3VuZGVkCistLSB3aGljaCBzaW1wbHkgZm9sbG93IGZyb20gdGhlc2UgY2FzZXMgLi4uCitkZGFkZDM0NCBhZGQgMUUrMyAgICAxICAgIC0+ICAgICAgICAgMTAwMQorZGRhZGQzNDUgYWRkIDFFKzE1ICAgMSAgICAtPiAgICAxMDAwMDAwMDAwMDAwMDAxCitkZGFkZDM0NiBhZGQgMUUrMTYgICAxICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMzQ3IGFkZCAxRSsyMCAgIDEgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUrMjAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQzNDggYWRkIDFFKzMgICAgNyAgICAtPiAgICAgICAgIDEwMDcKK2RkYWRkMzQ5IGFkZCAxRSsxNSAgIDcgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwNworZGRhZGQzNTAgYWRkIDFFKzE2ICAgNyAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAxRSsxNiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDM1MSBhZGQgMUUrMjAgICA3ICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzIwICBJbmV4YWN0IFJvdW5kZWQKKworLS0gdHJ5emVyb3MgY2FzZXMKK3JvdW5kaW5nOiAgICBoYWxmX3VwCitkZGFkZDM2MCAgYWRkIDBFKzUwIDEwMDAwRSsxICAtPiAxLjAwMDBFKzUKK2RkYWRkMzYxICBhZGQgMEUtNTAgMTAwMDBFKzEgIC0+IDEwMDAwMC4wMDAwMDAwMDAwIFJvdW5kZWQKK2RkYWRkMzYyICBhZGQgMTAwMDBFKzEgMEUtNTAgIC0+IDEwMDAwMC4wMDAwMDAwMDAwIFJvdW5kZWQKK2RkYWRkMzYzICBhZGQgMTAwMDBFKzEgMTAwMDBFLTUwICAtPiAxMDAwMDAuMDAwMDAwMDAwMCBSb3VuZGVkIEluZXhhY3QKK2RkYWRkMzY0ICBhZGQgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtPiAwRSszNjkKKworLS0gYSBjdXJpb3NpdHkgZnJvbSBKU1IgMTMgdGVzdGluZworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorZGRhZGQzNzAgYWRkICA5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEwMDAwMDAwMDAwMDA4MTQKK2RkYWRkMzcxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxLjAwMDAwMDAwMDAwMDA4MUUrMTYgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogICAgaGFsZl91cAorZGRhZGQzNzIgYWRkICA5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEwMDAwMDAwMDAwMDA4MTQKK2RkYWRkMzczIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxLjAwMDAwMDAwMDAwMDA4MUUrMTYgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogICAgaGFsZl9ldmVuCitkZGFkZDM3NCBhZGQgIDk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMTAwMDAwMDAwMDAwMDgxNAorZGRhZGQzNzUgYWRkIDk5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEuMDAwMDAwMDAwMDAwMDgxRSsxNiBSb3VuZGVkIEluZXhhY3QKKworLS0gb3BlcmFuZHMgZm9sZGVkCitkZGFkZDM4MCBhZGQgICAxRSszODQgIDFFKzM4NCAgLT4gIDIuMDAwMDAwMDAwMDAwMDAwRSszODQgIENsYW1wZWQKK2RkYWRkMzgxIGFkZCAgIDFFKzM4MCAgMUUrMzgwICAtPiAgMi4wMDAwMDAwMDAwMEUrMzgwICAgICAgQ2xhbXBlZAorZGRhZGQzODIgYWRkICAgMUUrMzc2ICAxRSszNzYgIC0+ICAyLjAwMDAwMDBFKzM3NiAgICAgICAgICBDbGFtcGVkCitkZGFkZDM4MyBhZGQgICAxRSszNzIgIDFFKzM3MiAgLT4gIDIuMDAwRSszNzIgICAgICAgICAgICAgIENsYW1wZWQKK2RkYWRkMzg0IGFkZCAgIDFFKzM3MCAgMUUrMzcwICAtPiAgMi4wRSszNzAgICAgICAgICAgICAgICAgQ2xhbXBlZAorZGRhZGQzODUgYWRkICAgMUUrMzY5ICAxRSszNjkgIC0+ICAyRSszNjkKK2RkYWRkMzg2IGFkZCAgIDFFKzM2OCAgMUUrMzY4ICAtPiAgMkUrMzY4CisKKy0tIHVscCByZXBsYWNlbWVudCB0ZXN0cworZGRhZGQ0MDAgYWRkICAgMSAgIDc3ZS0xNCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDc3CitkZGFkZDQwMSBhZGQgICAxICAgNzdlLTE1ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDc3CitkZGFkZDQwMiBhZGQgICAxICAgNzdlLTE2ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ0MDMgYWRkICAgMSAgIDc3ZS0xNyAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNDA0IGFkZCAgIDEgICA3N2UtMTggICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDQwNSBhZGQgICAxICAgNzdlLTE5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ0MDYgYWRkICAgMSAgIDc3ZS0yOTkgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ0MTAgYWRkICAxMCAgIDc3ZS0xNCAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDA3NworZGRhZGQ0MTEgYWRkICAxMCAgIDc3ZS0xNSAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNDEyIGFkZCAgMTAgICA3N2UtMTYgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDQxMyBhZGQgIDEwICAgNzdlLTE3ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ0MTQgYWRkICAxMCAgIDc3ZS0xOCAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNDE1IGFkZCAgMTAgICA3N2UtMTkgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDQxNiBhZGQgIDEwICAgNzdlLTI5OSAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkZGFkZDQyMCBhZGQgIDc3ZS0xNCAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwNzcKK2RkYWRkNDIxIGFkZCAgNzdlLTE1ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwNzcKK2RkYWRkNDIyIGFkZCAgNzdlLTE2ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkZGFkZDQyMyBhZGQgIDc3ZS0xNyAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ0MjQgYWRkICA3N2UtMTggICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNDI1IGFkZCAgNzdlLTE5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDQyNiBhZGQgIDc3ZS0yOTkgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkZGFkZDQzMCBhZGQgIDc3ZS0xNCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDc3CitkZGFkZDQzMSBhZGQgIDc3ZS0xNSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ0MzIgYWRkICA3N2UtMTYgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNDMzIGFkZCAgNzdlLTE3ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDQzNCBhZGQgIDc3ZS0xOCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ0MzUgYWRkICA3N2UtMTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNDM2IGFkZCAgNzdlLTI5OSAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGZhc3RwYXRoIGJvdW5kYXJ5IChtb3JlIGluIGRxYWRkKQorLS0gICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkZGFkZDUzOSBhZGQgJzQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMzMzMzMzMzMzMzMzMzMzMycgLT4gJzc3Nzc3Nzc3Nzc3Nzc3NzcnCitkZGFkZDU0MCBhZGQgJzQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgLT4gJzg4ODg4ODg4ODg4ODg4ODgnCitkZGFkZDU0MSBhZGQgJzQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NScgLT4gJzk5OTk5OTk5OTk5OTk5OTknCitkZGFkZDU0MiBhZGQgJzMzMzMzMzMzMzMzMzMzMzMnICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgLT4gJzc3Nzc3Nzc3Nzc3Nzc3NzcnCitkZGFkZDU0MyBhZGQgJzQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgLT4gJzg4ODg4ODg4ODg4ODg4ODgnCitkZGFkZDU0NCBhZGQgJzU1NTU1NTU1NTU1NTU1NTUnICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgLT4gJzk5OTk5OTk5OTk5OTk5OTknCitkZGFkZDU0NSBhZGQgJzMwMDAwMDQwMDAwMDAwMDAnICAnMzAwMDAwMDAwMDAwMDA0MCcgLT4gJzYwMDAwMDQwMDAwMDAwNDAnCitkZGFkZDU0NiBhZGQgJzMwMDAwMDA0MDAwMDAwMDAnICAnNDAwMDAwMDAwMDAwMDQwMCcgLT4gJzcwMDAwMDA0MDAwMDA0MDAnCitkZGFkZDU0NyBhZGQgJzMwMDAwMDAwNDAwMDAwMDAnICAnNTAwMDAwMDAwMDAwNDAwMCcgLT4gJzgwMDAwMDAwNDAwMDQwMDAnCitkZGFkZDU0OCBhZGQgJzQwMDAwMDAwMDQwMDAwMDAnICAnMzAwMDAwMDAwMDA0MDAwMCcgLT4gJzcwMDAwMDAwMDQwNDAwMDAnCitkZGFkZDU0OSBhZGQgJzQwMDAwMDAwMDA0MDAwMDAnICAnNDAwMDAwMDAwMDQwMDAwMCcgLT4gJzgwMDAwMDAwMDA4MDAwMDAnCitkZGFkZDU1MCBhZGQgJzQwMDAwMDAwMDAwNDAwMDAnICAnNTAwMDAwMDAwNDAwMDAwMCcgLT4gJzkwMDAwMDAwMDQwNDAwMDAnCitkZGFkZDU1MSBhZGQgJzUwMDAwMDAwMDAwMDQwMDAnICAnMzAwMDAwMDA0MDAwMDAwMCcgLT4gJzgwMDAwMDAwNDAwMDQwMDAnCitkZGFkZDU1MiBhZGQgJzUwMDAwMDAwMDAwMDA0MDAnICAnNDAwMDAwMDQwMDAwMDAwMCcgLT4gJzkwMDAwMDA0MDAwMDA0MDAnCitkZGFkZDU1MyBhZGQgJzUwMDAwMDAwMDAwMDAwNDAnICAnNTAwMDAwNDAwMDAwMDAwMCcgLT4gMS4wMDAwMDA0MDAwMDAwMDRFKzE2IFJvdW5kZWQKKy0tIGNoZWNrIHByb3BhZ2F0aW9uCitkZGFkZDU1NCBhZGQgJzg5OTk5OTk5OTk5OTk5OTknICAnMDAwMDAwMDAwMDAwMDAwMScgLT4gOTAwMDAwMDAwMDAwMDAwMAorZGRhZGQ1NTUgYWRkICcwMDAwMDAwMDAwMDAwMDAxJyAgJzg5OTk5OTk5OTk5OTk5OTknIC0+IDkwMDAwMDAwMDAwMDAwMDAKK2RkYWRkNTU2IGFkZCAnMDk5OTk5OTk5OTk5OTk5OScgICcwMDAwMDAwMDAwMDAwMDAxJyAtPiAxMDAwMDAwMDAwMDAwMDAwCitkZGFkZDU1NyBhZGQgJzAwMDAwMDAwMDAwMDAwMDEnICAnMDk5OTk5OTk5OTk5OTk5OScgLT4gMTAwMDAwMDAwMDAwMDAwMAorZGRhZGQ1NTggYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzQ1NTU1NTU1NTU1NTU1NTYnIC0+IDkwMDAwMDAwMDAwMDAwMDAKK2RkYWRkNTU5IGFkZCAnNDU1NTU1NTU1NTU1NTU1NicgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAtPiA5MDAwMDAwMDAwMDAwMDAwCisKKy0tIG5lZ2F0aXZlIHVscHMKK2RkYWRkNjQ0MCBhZGQgICAxICAgLTc3ZS0xNCAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTIzCitkZGFkZDY0NDEgYWRkICAgMSAgIC03N2UtMTUgICAgICAtPiAgMC45OTk5OTk5OTk5OTk5MjMKK2RkYWRkNjQ0MiBhZGQgICAxICAgLTc3ZS0xNiAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5MjMKK2RkYWRkNjQ0MyBhZGQgICAxICAgLTc3ZS0xNyAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0NDQgYWRkICAgMSAgIC03N2UtMTggICAgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDQ1IGFkZCAgIDEgICAtNzdlLTE5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDQ2IGFkZCAgIDEgICAtNzdlLTk5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkZGFkZDY0NTAgYWRkICAxMCAgIC03N2UtMTQgICAgICAtPiAgIDkuOTk5OTk5OTk5OTk5MjMKK2RkYWRkNjQ1MSBhZGQgIDEwICAgLTc3ZS0xNSAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5MjMKK2RkYWRkNjQ1MiBhZGQgIDEwICAgLTc3ZS0xNiAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0NTMgYWRkICAxMCAgIC03N2UtMTcgICAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDU0IGFkZCAgMTAgICAtNzdlLTE4ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDU1IGFkZCAgMTAgICAtNzdlLTE5ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDU2IGFkZCAgMTAgICAtNzdlLTk5ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkZGFkZDY0NjAgYWRkICAtNzdlLTE0ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTkyMworZGRhZGQ2NDYxIGFkZCAgLTc3ZS0xNSAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTIzCitkZGFkZDY0NjIgYWRkICAtNzdlLTE2ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTIzCitkZGFkZDY0NjMgYWRkICAtNzdlLTE3ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDY0IGFkZCAgLTc3ZS0xOCAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ2NSBhZGQgIC03N2UtMTkgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ2NiBhZGQgIC03N2UtOTkgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ2NDcwIGFkZCAgLTc3ZS0xNCAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTIzCitkZGFkZDY0NzEgYWRkICAtNzdlLTE1ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTIzCitkZGFkZDY0NzIgYWRkICAtNzdlLTE2ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDczIGFkZCAgLTc3ZS0xNyAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ3NCBhZGQgIC03N2UtMTggICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ3NSBhZGQgIC03N2UtMTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ3NiBhZGQgIC03N2UtOTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmUgdWxwcworZGRhZGQ2NDgwIGFkZCAgLTEgICAgNzdlLTE0ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTIzCitkZGFkZDY0ODEgYWRkICAtMSAgICA3N2UtMTUgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTIzCitkZGFkZDY0ODIgYWRkICAtMSAgICA3N2UtMTYgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTkyMworZGRhZGQ2NDgzIGFkZCAgLTEgICAgNzdlLTE3ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0ODQgYWRkICAtMSAgICA3N2UtMTggICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ4NSBhZGQgIC0xICAgIDc3ZS0xOSAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0ODYgYWRkICAtMSAgICA3N2UtOTkgICAgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkZGFkZDY0OTAgYWRkIC0xMCAgICA3N2UtMTQgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTIzCitkZGFkZDY0OTEgYWRkIC0xMCAgICA3N2UtMTUgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTkyMworZGRhZGQ2NDkyIGFkZCAtMTAgICAgNzdlLTE2ICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0OTMgYWRkIC0xMCAgICA3N2UtMTcgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ5NCBhZGQgLTEwICAgIDc3ZS0xOCAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0OTUgYWRkIC0xMCAgICA3N2UtMTkgICAgICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDk2IGFkZCAtMTAgICAgNzdlLTk5ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ2NTAwIGFkZCAgIDc3ZS0xNCAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTIzCitkZGFkZDY1MDEgYWRkICAgNzdlLTE1ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTIzCitkZGFkZDY1MDIgYWRkICAgNzdlLTE2ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTkyMworZGRhZGQ2NTAzIGFkZCAgIDc3ZS0xNyAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1MDQgYWRkICAgNzdlLTE4ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjUwNSBhZGQgICA3N2UtMTkgICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1MDYgYWRkICAgNzdlLTk5ICAgICAgLTEgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkZGFkZDY1MTAgYWRkICAgNzdlLTE0ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTIzCitkZGFkZDY1MTEgYWRkICAgNzdlLTE1ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTkyMworZGRhZGQ2NTEyIGFkZCAgIDc3ZS0xNiAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1MTMgYWRkICAgNzdlLTE3ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjUxNCBhZGQgICA3N2UtMTggICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1MTUgYWRkICAgNzdlLTE5ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTE2IGFkZCAgIDc3ZS05OSAgICAgIC0xMCAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gYW5kIHNvbWUgbW9yZSByZXNpZHVlIGVmZmVjdHMgYW5kIGRpZmZlcmVudCByb3VuZGluZ3MKK3JvdW5kaW5nOiBoYWxmX3VwCitkZGFkZDY1NDAgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JworZGRhZGQ2NTQxIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NDIgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU0MyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTQ0IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NDUgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU0NiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTQ3IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NDggYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU0OSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTUwIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NTEgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU1MiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTUzIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NTQgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU1NSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTU2IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcKK2RkYWRkNjU1NyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTU4IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NTkgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZGRhZGQ2NTYwIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScKK2RkYWRkNjU2MSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTYyIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NjMgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU2NCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTY1IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NjYgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU2NyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTY4IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NjkgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU3MCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTcxIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NzIgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU3MyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTc0IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NzUgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU3NiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnCitkZGFkZDY1NzcgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU3OCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTc5IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitkZGFkZDc1NDAgYWRkICc2NTQzMjEwMTIzNDU2Nzg4JyAwLjQ5OTk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU0MSBhZGQgJzY1NDMyMTAxMjM0NTY3ODgnIDAuNSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTQyIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OCcgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkZGFkZDc1NTAgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JworZGRhZGQ3NTUxIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1NTIgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU1MyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTU0IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1NTUgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU1NiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTU3IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1NTggYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU1OSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTYwIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1NjEgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU2MiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTYzIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1NjQgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU2NSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTY2IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcKK2RkYWRkNzU2NyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTY4IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1NjkgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gdmVyaWZ5IGEgcXVlcnkKK3JvdW5kaW5nOiAgICAgZG93bgorZGRhZGQ3NjYxIGFkZCAxZS0zOTggOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NjYyIGFkZCAgICAgIDAgOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IFJvdW5kZWQKK2RkYWRkNzY2MyBhZGQgMWUtMzg4IDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzY2NCBhZGQgICAgICAwIDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCBSb3VuZGVkCisKKy0tIG1vcmUgemVyb3MsIGV0Yy4KK3JvdW5kaW5nOiBoYWxmX2V2ZW4KKworZGRhZGQ3NzAxIGFkZCA1LjAwIDEuMDBFLTMgLT4gNS4wMDEwMAorZGRhZGQ3NzAyIGFkZCAwMC4wMCAwLjAwMCAgLT4gMC4wMDAKK2RkYWRkNzcwMyBhZGQgMDAuMDAgMEUtMyAgIC0+IDAuMDAwCitkZGFkZDc3MDQgYWRkIDBFLTMgIDAwLjAwICAtPiAwLjAwMAorCitkZGFkZDc3MTAgYWRkIDBFKzMgIDAwLjAwICAtPiAwLjAwCitkZGFkZDc3MTEgYWRkIDBFKzMgIDAwLjAgICAtPiAwLjAKK2RkYWRkNzcxMiBhZGQgMEUrMyAgMDAuICAgIC0+IDAKK2RkYWRkNzcxMyBhZGQgMEUrMyAgMDAuRSsxIC0+IDBFKzEKK2RkYWRkNzcxNCBhZGQgMEUrMyAgMDAuRSsyIC0+IDBFKzIKK2RkYWRkNzcxNSBhZGQgMEUrMyAgMDAuRSszIC0+IDBFKzMKK2RkYWRkNzcxNiBhZGQgMEUrMyAgMDAuRSs0IC0+IDBFKzMKK2RkYWRkNzcxNyBhZGQgMEUrMyAgMDAuRSs1IC0+IDBFKzMKK2RkYWRkNzcxOCBhZGQgMEUrMyAgLTAwLjAgICAtPiAwLjAKK2RkYWRkNzcxOSBhZGQgMEUrMyAgLTAwLiAgICAtPiAwCitkZGFkZDc3MzEgYWRkIDBFKzMgIC0wMC5FKzEgLT4gMEUrMQorCitkZGFkZDc3MjAgYWRkIDAwLjAwICAwRSszICAtPiAwLjAwCitkZGFkZDc3MjEgYWRkIDAwLjAgICAwRSszICAtPiAwLjAKK2RkYWRkNzcyMiBhZGQgMDAuICAgIDBFKzMgIC0+IDAKK2RkYWRkNzcyMyBhZGQgMDAuRSsxIDBFKzMgIC0+IDBFKzEKK2RkYWRkNzcyNCBhZGQgMDAuRSsyIDBFKzMgIC0+IDBFKzIKK2RkYWRkNzcyNSBhZGQgMDAuRSszIDBFKzMgIC0+IDBFKzMKK2RkYWRkNzcyNiBhZGQgMDAuRSs0IDBFKzMgIC0+IDBFKzMKK2RkYWRkNzcyNyBhZGQgMDAuRSs1IDBFKzMgIC0+IDBFKzMKK2RkYWRkNzcyOCBhZGQgLTAwLjAwIDBFKzMgIC0+IDAuMDAKK2RkYWRkNzcyOSBhZGQgLTAwLjAgIDBFKzMgIC0+IDAuMAorZGRhZGQ3NzMwIGFkZCAtMDAuICAgMEUrMyAgLT4gMAorCitkZGFkZDc3MzIgYWRkICAwICAgICAwICAgICAtPiAgMAorZGRhZGQ3NzMzIGFkZCAgMCAgICAtMCAgICAgLT4gIDAKK2RkYWRkNzczNCBhZGQgLTAgICAgIDAgICAgIC0+ICAwCitkZGFkZDc3MzUgYWRkIC0wICAgIC0wICAgICAtPiAtMCAgICAgLS0gSUVFRSA4NTQgc3BlY2lhbCBjYXNlCisKK2RkYWRkNzczNiBhZGQgIDEgICAgLTEgICAgIC0+ICAwCitkZGFkZDc3MzcgYWRkIC0xICAgIC0xICAgICAtPiAtMgorZGRhZGQ3NzM4IGFkZCAgMSAgICAgMSAgICAgLT4gIDIKK2RkYWRkNzczOSBhZGQgLTEgICAgIDEgICAgIC0+ICAwCisKK2RkYWRkNzc0MSBhZGQgIDAgICAgLTEgICAgIC0+IC0xCitkZGFkZDc3NDIgYWRkIC0wICAgIC0xICAgICAtPiAtMQorZGRhZGQ3NzQzIGFkZCAgMCAgICAgMSAgICAgLT4gIDEKK2RkYWRkNzc0NCBhZGQgLTAgICAgIDEgICAgIC0+ICAxCitkZGFkZDc3NDUgYWRkIC0xICAgICAwICAgICAtPiAtMQorZGRhZGQ3NzQ2IGFkZCAtMSAgICAtMCAgICAgLT4gLTEKK2RkYWRkNzc0NyBhZGQgIDEgICAgIDAgICAgIC0+ICAxCitkZGFkZDc3NDggYWRkICAxICAgIC0wICAgICAtPiAgMQorCitkZGFkZDc3NTEgYWRkICAwLjAgIC0xICAgICAtPiAtMS4wCitkZGFkZDc3NTIgYWRkIC0wLjAgIC0xICAgICAtPiAtMS4wCitkZGFkZDc3NTMgYWRkICAwLjAgICAxICAgICAtPiAgMS4wCitkZGFkZDc3NTQgYWRkIC0wLjAgICAxICAgICAtPiAgMS4wCitkZGFkZDc3NTUgYWRkIC0xLjAgICAwICAgICAtPiAtMS4wCitkZGFkZDc3NTYgYWRkIC0xLjAgIC0wICAgICAtPiAtMS4wCitkZGFkZDc3NTcgYWRkICAxLjAgICAwICAgICAtPiAgMS4wCitkZGFkZDc3NTggYWRkICAxLjAgIC0wICAgICAtPiAgMS4wCisKK2RkYWRkNzc2MSBhZGQgIDAgICAgLTEuMCAgIC0+IC0xLjAKK2RkYWRkNzc2MiBhZGQgLTAgICAgLTEuMCAgIC0+IC0xLjAKK2RkYWRkNzc2MyBhZGQgIDAgICAgIDEuMCAgIC0+ICAxLjAKK2RkYWRkNzc2NCBhZGQgLTAgICAgIDEuMCAgIC0+ICAxLjAKK2RkYWRkNzc2NSBhZGQgLTEgICAgIDAuMCAgIC0+IC0xLjAKK2RkYWRkNzc2NiBhZGQgLTEgICAgLTAuMCAgIC0+IC0xLjAKK2RkYWRkNzc2NyBhZGQgIDEgICAgIDAuMCAgIC0+ICAxLjAKK2RkYWRkNzc2OCBhZGQgIDEgICAgLTAuMCAgIC0+ICAxLjAKKworZGRhZGQ3NzcxIGFkZCAgMC4wICAtMS4wICAgLT4gLTEuMAorZGRhZGQ3NzcyIGFkZCAtMC4wICAtMS4wICAgLT4gLTEuMAorZGRhZGQ3NzczIGFkZCAgMC4wICAgMS4wICAgLT4gIDEuMAorZGRhZGQ3Nzc0IGFkZCAtMC4wICAgMS4wICAgLT4gIDEuMAorZGRhZGQ3Nzc1IGFkZCAtMS4wICAgMC4wICAgLT4gLTEuMAorZGRhZGQ3Nzc2IGFkZCAtMS4wICAtMC4wICAgLT4gLTEuMAorZGRhZGQ3Nzc3IGFkZCAgMS4wICAgMC4wICAgLT4gIDEuMAorZGRhZGQ3Nzc4IGFkZCAgMS4wICAtMC4wICAgLT4gIDEuMAorCistLSBTcGVjaWFscworZGRhZGQ3NzgwIGFkZCAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkZGFkZDc3ODEgYWRkIC1JbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK2RkYWRkNzc4MiBhZGQgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZGRhZGQ3NzgzIGFkZCAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkZGFkZDc3ODQgYWRkIC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK2RkYWRkNzc4NSBhZGQgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZGRhZGQ3Nzg2IGFkZCAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkZGFkZDc3ODcgYWRkIC0xMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkYWRkNzc4OCBhZGQgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRhZGQ3Nzg5IGFkZCAtMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkZGFkZDc3OTAgYWRkIC0wICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkYWRkNzc5MSBhZGQgIDAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRhZGQ3NzkyIGFkZCAgMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkZGFkZDc3OTMgYWRkICAxMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkYWRkNzc5NCBhZGQgIEluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK2RkYWRkNzgwMCBhZGQgIEluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4MDEgYWRkICBJbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK2RkYWRkNzgwMiBhZGQgIEluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorZGRhZGQ3ODAzIGFkZCAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkZGFkZDc4MDQgYWRkICBJbmYgICAwICAgICAtPiAgSW5maW5pdHkKK2RkYWRkNzgwNSBhZGQgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorZGRhZGQ3ODA2IGFkZCAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkZGFkZDc4MDcgYWRkICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkYWRkNzgwOCBhZGQgLTEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRhZGQ3ODA5IGFkZCAtSW5mICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzgxMCBhZGQgLTEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRhZGQ3ODExIGFkZCAtMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitkZGFkZDc4MTIgYWRkICAwICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkYWRkNzgxMyBhZGQgIDEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRhZGQ3ODE0IGFkZCAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitkZGFkZDc4MTUgYWRkICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZGRhZGQ3ODIxIGFkZCAgTmFOIC1JbmYgICAgLT4gIE5hTgorZGRhZGQ3ODIyIGFkZCAgTmFOIC0xMDAwICAgLT4gIE5hTgorZGRhZGQ3ODIzIGFkZCAgTmFOIC0xICAgICAgLT4gIE5hTgorZGRhZGQ3ODI0IGFkZCAgTmFOIC0wICAgICAgLT4gIE5hTgorZGRhZGQ3ODI1IGFkZCAgTmFOICAwICAgICAgLT4gIE5hTgorZGRhZGQ3ODI2IGFkZCAgTmFOICAxICAgICAgLT4gIE5hTgorZGRhZGQ3ODI3IGFkZCAgTmFOICAxMDAwICAgLT4gIE5hTgorZGRhZGQ3ODI4IGFkZCAgTmFOICBJbmYgICAgLT4gIE5hTgorZGRhZGQ3ODI5IGFkZCAgTmFOICBOYU4gICAgLT4gIE5hTgorZGRhZGQ3ODMwIGFkZCAtSW5mICBOYU4gICAgLT4gIE5hTgorZGRhZGQ3ODMxIGFkZCAtMTAwMCBOYU4gICAgLT4gIE5hTgorZGRhZGQ3ODMyIGFkZCAtMSAgICBOYU4gICAgLT4gIE5hTgorZGRhZGQ3ODMzIGFkZCAtMCAgICBOYU4gICAgLT4gIE5hTgorZGRhZGQ3ODM0IGFkZCAgMCAgICBOYU4gICAgLT4gIE5hTgorZGRhZGQ3ODM1IGFkZCAgMSAgICBOYU4gICAgLT4gIE5hTgorZGRhZGQ3ODM2IGFkZCAgMTAwMCBOYU4gICAgLT4gIE5hTgorZGRhZGQ3ODM3IGFkZCAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkZGFkZDc4NDEgYWRkICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODQyIGFkZCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg0MyBhZGQgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4NDQgYWRkICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODQ1IGFkZCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg0NiBhZGQgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4NDcgYWRkICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODQ4IGFkZCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg0OSBhZGQgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4NTAgYWRkICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODUxIGFkZCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg1MiBhZGQgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4NTMgYWRkIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODU0IGFkZCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg1NSBhZGQgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4NTYgYWRkICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODU3IGFkZCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg1OCBhZGQgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4NTkgYWRkICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZGFkZDc4NjEgYWRkICBOYU4xICAgLUluZiAgICAtPiAgTmFOMQorZGRhZGQ3ODYyIGFkZCArTmFOMiAgIC0xMDAwICAgLT4gIE5hTjIKK2RkYWRkNzg2MyBhZGQgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCitkZGFkZDc4NjQgYWRkICBOYU40ICAgIEluZiAgICAtPiAgTmFONAorZGRhZGQ3ODY1IGFkZCAgTmFONSAgICtOYU42ICAgLT4gIE5hTjUKK2RkYWRkNzg2NiBhZGQgLUluZiAgICAgTmFONyAgIC0+ICBOYU43CitkZGFkZDc4NjcgYWRkIC0xMDAwICAgIE5hTjggICAtPiAgTmFOOAorZGRhZGQ3ODY4IGFkZCAgMTAwMCAgICBOYU45ICAgLT4gIE5hTjkKK2RkYWRkNzg2OSBhZGQgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorZGRhZGQ3ODcxIGFkZCAgc05hTjExICAtSW5mICAgLT4gIE5hTjExICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODcyIGFkZCAgc05hTjEyICAtMTAwMCAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODczIGFkZCAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODc0IGFkZCAgc05hTjE0ICAgTmFOMTcgLT4gIE5hTjE0ICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODc1IGFkZCAgc05hTjE1ICBzTmFOMTggLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODc2IGFkZCAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODc3IGFkZCAtSW5mICAgICtzTmFOMjAgLT4gIE5hTjIwICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODc4IGFkZCAtMTAwMCAgICBzTmFOMjEgLT4gIE5hTjIxICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODc5IGFkZCAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODgwIGFkZCAgSW5mICAgICBzTmFOMjMgLT4gIE5hTjIzICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODgxIGFkZCArTmFOMjUgICtzTmFOMjQgLT4gIE5hTjI0ICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODgyIGFkZCAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2CitkZGFkZDc4ODMgYWRkIC1zTmFOMjcgIHNOYU4yOSAtPiAtTmFOMjcgIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4ODQgYWRkICAxMDAwICAgIC1OYU4zMCAtPiAtTmFOMzAKK2RkYWRkNzg4NSBhZGQgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gSGVyZSB3ZSBleHBsb3JlIG5lYXIgdGhlIGJvdW5kYXJ5IG9mIHJvdW5kaW5nIGEgc3Vibm9ybWFsIHRvIE5taW4KK2RkYWRkNzU3NSBhZGQgIDFFLTM4MyAtMUUtMzk4IC0+ICA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgIFN1Ym5vcm1hbAorZGRhZGQ3NTc2IGFkZCAtMUUtMzgzICsxRS0zOTggLT4gLTkuOTk5OTk5OTk5OTk5OTlFLTM4NCAgU3Vibm9ybWFsCisKKy0tIGFuZCBhbm90aGVyIGN1cmlvdXMgY2FzZQorZGRhZGQ3NTc3IGFkZCA3LjAwMDAwMDAwMDAwMEUtMzg1IC0xLjAwMDAwRS0zOTEgLT4gNi45OTk5OTkwMDAwMDBFLTM4NSBTdWJub3JtYWwKKworLS0gY2hlY2sgb3ZlcmZsb3cgZWRnZSBjYXNlCistLSAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RkYWRkNzk3MiBhcHBseSAgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZGFkZDc5NzMgYWRkICAgICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAxICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk3NCBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDEgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTc1IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgMUUrMzY5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk3NiBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDlFKzM2OCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5NzcgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA4RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTc4IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgN0UrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk3OSBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDZFKzM2OCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5ODAgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA1RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTgxIGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgNEUrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTgyIGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgM0UrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTgzIGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgMkUrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTg0IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgMUUrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorCitkZGFkZDc5ODUgYXBwbHkgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkYWRkNzk4NiBhZGQgICAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLTEgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk4NyBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTEgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk4OCBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTFFKzM2OSAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTg5IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtOUUrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5OTAgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC04RSszNjggIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk5MSBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTdFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTkyIGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtNkUrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5OTMgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC01RSszNjggIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk5NCBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTRFKzM2OCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5OTUgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0zRSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTk2IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMkUrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk5NyBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTFFKzM2OCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCisKKy0tIEFuZCBmb3Igcm91bmQgZG93biBmdWxsIGFuZCBzdWJub3JtYWwgcmVzdWx0cworcm91bmRpbmc6ICAgICBkb3duCitkZGFkZDcxMTAwIGFkZCAxZSsyIC0xZS0zODMgICAgLT4gOTkuOTk5OTk5OTk5OTk5OTkgUm91bmRlZCBJbmV4YWN0CitkZGFkZDcxMTAxIGFkZCAxZSsxIC0xZS0zODMgICAgLT4gOS45OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTEwMyBhZGQgICArMSAtMWUtMzgzICAgIC0+IDAuOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGFkZDcxMTA0IGFkZCAxZS0xIC0xZS0zODMgICAgLT4gMC4wOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGFkZDcxMTA1IGFkZCAxZS0yIC0xZS0zODMgICAgLT4gMC4wMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTEwNiBhZGQgMWUtMyAtMWUtMzgzICAgIC0+IDAuMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGFkZDcxMTA3IGFkZCAxZS00IC0xZS0zODMgICAgLT4gMC4wMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGFkZDcxMTA4IGFkZCAxZS01IC0xZS0zODMgICAgLT4gMC4wMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTEwOSBhZGQgMWUtNiAtMWUtMzgzICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RS03ICBSb3VuZGVkIEluZXhhY3QKKworcm91bmRpbmc6ICAgICBjZWlsaW5nCitkZGFkZDcxMTEwIGFkZCAtMWUrMiArMWUtMzgzICAgLT4gLTk5Ljk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTExMSBhZGQgLTFlKzEgKzFlLTM4MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGFkZDcxMTEzIGFkZCAgICAtMSArMWUtMzgzICAgLT4gLTAuOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGFkZDcxMTE0IGFkZCAtMWUtMSArMWUtMzgzICAgLT4gLTAuMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTExNSBhZGQgLTFlLTIgKzFlLTM4MyAgIC0+IC0wLjAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGFkZDcxMTE2IGFkZCAtMWUtMyArMWUtMzgzICAgLT4gLTAuMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGFkZDcxMTE3IGFkZCAtMWUtNCArMWUtMzgzICAgLT4gLTAuMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTExOCBhZGQgLTFlLTUgKzFlLTM4MyAgIC0+IC0wLjAwMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGFkZDcxMTE5IGFkZCAtMWUtNiArMWUtMzgzICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RS03ICBSb3VuZGVkIEluZXhhY3QKKworLS0gdGVzdHMgYmFzZWQgb24gR3VubmFyIERlZ25ib2wncyBlZGdlIGNhc2UKK3JvdW5kaW5nOiAgICAgaGFsZl9ldmVuCisKK2RkYWRkNzEzMDAgYWRkIDFFMTYgIC0wLjUgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzEwIGFkZCAxRTE2ICAtMC41MSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMxMSBhZGQgMUUxNiAgLTAuNTAxICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMTIgYWRkIDFFMTYgIC0wLjUwMDEgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzEzIGFkZCAxRTE2ICAtMC41MDAwMSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMxNCBhZGQgMUUxNiAgLTAuNTAwMDAxICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMTUgYWRkIDFFMTYgIC0wLjUwMDAwMDEgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzE2IGFkZCAxRTE2ICAtMC41MDAwMDAwMSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMxNyBhZGQgMUUxNiAgLTAuNTAwMDAwMDAxICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMTggYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDEgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzE5IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMyMCBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMjEgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDEgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzIyIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMyMyBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMjQgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzI1IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMyNiBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMDAwICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMjcgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzI4IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMyOSBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAwICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMzAgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzMxIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMzMiBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMzMgYWRkIDFFMTYgIC0wLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzM0IGFkZCAxRTE2ICAtMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMzNSBhZGQgMUUxNiAgLTAuNTAwMDAwICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMzYgYWRkIDFFMTYgIC0wLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzM3IGFkZCAxRTE2ICAtMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMzOCBhZGQgMUUxNiAgLTAuNTAwICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMzkgYWRkIDFFMTYgIC0wLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCisKK2RkYWRkNzEzNDAgYWRkIDFFMTYgIC01MDAwMDAwLjAwMDAxMDAwMSAgIC0+ICA5OTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzQxIGFkZCAxRTE2ICAtNTAwMDAwMC4wMDAwMDAwMDEgICAtPiAgOTk5OTk5OTk5NTAwMDAwMCAgICAgIEluZXhhY3QgUm91bmRlZAorCitkZGFkZDcxMzQ5IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNCAgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNTAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM1MSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OSAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzUyIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNTMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM1NCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OSAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzU1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNTYgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM1NyBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OSAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzU4IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNTkgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM2MCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OSAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzYxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNjIgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM2MyBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTk5OSAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzY0IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5OSAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNjUgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM2NyBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMCAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzY4IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNjkgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM3MCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzcxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNzIgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM3MyBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMCAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzc0IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNzUgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM3NiBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMCAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzc3IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNzggYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM3OSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMCAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzgwIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzODEgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM4MiBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzgzIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzODQgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM4NSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDEgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzg2IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzODcgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMSAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM4OCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDEgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzg5IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAxICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzOTAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMSAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM5MSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDEgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzkyIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAxICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzOTMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMSAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM5NCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDEgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzk1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAxICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzOTYgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MSAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorCistLSBNb3JlIEdEIGVkZ2UgY2FzZXMsIHdoZXJlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdW5hZGp1c3RlZAorLS0gZXhwb25lbnRzIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHByZWNpc2lvbiBhbmQgb25lIHNpZGUgaXMgMAorZGRhZGQ3MTQyMCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDUgICAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDIxIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMSAgLT4gMC4xMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDIyIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMiAgLT4gMC4wMTEyMzQ1Njc4OTAxMjM0NQorZGRhZGQ3MTQyMyBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTMgIC0+IDAuMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDI0IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNCAgLT4gMC4wMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDI1IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNSAgLT4gMC4wMDAwMTEyMzQ1Njc4OTAxMjM0NQorZGRhZGQ3MTQyNiBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTYgIC0+IDAuMDAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDI3IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNyAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTcKK2RkYWRkNzE0MjggYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS04ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOAorZGRhZGQ3MTQyOSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTkgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS05CitkZGFkZDcxNDMwIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEwCitkZGFkZDcxNDMxIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTExCitkZGFkZDcxNDMyIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEyCitkZGFkZDcxNDMzIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTMgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEzCitkZGFkZDcxNDM0IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE0CitkZGFkZDcxNDM1IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE1CitkZGFkZDcxNDM2IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTYgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE2CitkZGFkZDcxNDM3IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE3CitkZGFkZDcxNDM4IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTggLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE4CitkZGFkZDcxNDM5IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTkgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE5CisKKy0tIHNhbWUsIHJldmVyc2VkIDAKK2RkYWRkNzE0NDAgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAgICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDQxIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMSAgMCAtPiAwLjExMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NDIgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0yICAwIC0+IDAuMDExMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NDMgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0zICAwIC0+IDAuMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDQ0IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtNCAgMCAtPiAwLjAwMDExMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NDUgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS01ICAwIC0+IDAuMDAwMDExMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NDYgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS02ICAwIC0+IDAuMDAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDQ3IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtNyAgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtNworZGRhZGQ3MTQ0OCBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTggIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTgKK2RkYWRkNzE0NDkgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS05ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS05CitkZGFkZDcxNDUwIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTAgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTAKK2RkYWRkNzE0NTEgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMSAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMQorZGRhZGQ3MTQ1MiBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTEyIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEyCitkZGFkZDcxNDUzIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTMgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTMKK2RkYWRkNzE0NTQgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNCAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNAorZGRhZGQ3MTQ1NSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE1IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE1CitkZGFkZDcxNDU2IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTYgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTYKK2RkYWRkNzE0NTcgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNyAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNworZGRhZGQ3MTQ1OCBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE4IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE4CitkZGFkZDcxNDU5IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTkgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTkKKworLS0gc2FtZSwgRXMgb24gdGhlIDAKK2RkYWRkNzE0NjAgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0wICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NjEgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NjIgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0yICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NjMgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0zICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NjQgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS00ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NjUgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS01ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NjYgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS02ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NjcgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS03ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NjggYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS04ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NjkgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS05ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NzAgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMCAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NzEgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NzIgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMiAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NzMgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMyAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NzQgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNCAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0NzUgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKKy0tIG5leHQgZm91ciBmbGFnIFJvdW5kZWQgYmVjYXVzZSB0aGUgMCBleHRlbmRzIHRoZSByZXN1bHQKK2RkYWRkNzE0NzYgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNiAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZGRhZGQ3MTQ3NyBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE3ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitkZGFkZDcxNDc4IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTggIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKK2RkYWRkNzE0NzkgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xOSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorCistLSBzdW0gb2YgdHdvIG9wcG9zaXRlLXNpZ24gb3BlcmFuZHMgaXMgZXhhY3RseSAwIGFuZCBmbG9vciA9PiAtMAorcm91bmRpbmc6ICAgIGhhbGZfdXAKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RkYWRkNzE1MDAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNTAxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRhZGQ3MTUwMiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE1MDMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZGRhZGQ3MTUxMSBhZGQgLTExICAgICAgMTEgICAgLT4gIDAKK2RkYWRkNzE1MTIgYWRkICAxMSAgICAgLTExICAgIC0+ICAwCisKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RkYWRkNzE1MjAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNTIxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRhZGQ3MTUyMiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE1MjMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZGRhZGQ3MTUzMSBhZGQgLTExICAgICAgMTEgICAgLT4gIDAKK2RkYWRkNzE1MzIgYWRkICAxMSAgICAgLTExICAgIC0+ICAwCisKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RkYWRkNzE1NDAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNTQxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRhZGQ3MTU0MiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE1NDMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZGRhZGQ3MTU1MSBhZGQgLTExICAgICAgMTEgICAgLT4gIDAKK2RkYWRkNzE1NTIgYWRkICAxMSAgICAgLTExICAgIC0+ICAwCisKK3JvdW5kaW5nOiAgICB1cAorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZGRhZGQ3MTU2MCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE1NjEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNTYyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZGRhZGQ3MTU2MyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkZGFkZDcxNTcxIGFkZCAtMTEgICAgICAxMSAgICAtPiAgMAorZGRhZGQ3MTU3MiBhZGQgIDExICAgICAtMTEgICAgLT4gIDAKKworcm91bmRpbmc6ICAgIGRvd24KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RkYWRkNzE1ODAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNTgxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRhZGQ3MTU4MiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE1ODMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZGRhZGQ3MTU5MSBhZGQgLTExICAgICAgMTEgICAgLT4gIDAKK2RkYWRkNzE1OTIgYWRkICAxMSAgICAgLTExICAgIC0+ICAwCisKK3JvdW5kaW5nOiAgICBjZWlsaW5nCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkZGFkZDcxNjAwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRhZGQ3MTYwMSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE2MDIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNjAzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RkYWRkNzE2MTEgYWRkIC0xMSAgICAgIDExICAgIC0+ICAwCitkZGFkZDcxNjEyIGFkZCAgMTEgICAgIC0xMSAgICAtPiAgMAorCistLSBhbmQgdGhlIGV4dHJhLXNwZWNpYWwgdWdseSBjYXNlOyB1bnVzdWFsIG1pbnVzZXMgbWFya2VkIGJ5IC0tICoKK3JvdW5kaW5nOiAgICBmbG9vcgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZGRhZGQ3MTYyMCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE2MjEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCitkZGFkZDcxNjIyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOSAgICAgICAgICAgLS0gKgorZGRhZGQ3MTYyMyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkZGFkZDcxNjMxIGFkZCAtMTEgICAgICAxMSAgICAtPiAgLTAgICAgICAgICAgICAgICAgLS0gKgorZGRhZGQ3MTYzMiBhZGQgIDExICAgICAtMTEgICAgLT4gIC0wICAgICAgICAgICAgICAgIC0tICoKKworLS0gRXhhbXBsZXMgZnJvbSBTUUwgcHJvcG9zYWwgKEtyaXNobmEgS3Vsa2FybmkpCitkZGFkZDcxNzAxIGFkZCAxMzBFLTIgICAgMTIwRS0yICAgIC0+IDIuNTAKK2RkYWRkNzE3MDIgYWRkIDEzMEUtMiAgICAxMkUtMSAgICAgLT4gMi41MAorZGRhZGQ3MTcwMyBhZGQgMTMwRS0yICAgIDFFMCAgICAgICAtPiAyLjMwCitkZGFkZDcxNzA0IGFkZCAxRTIgICAgICAgMUU0ICAgICAgIC0+IDEuMDFFKzQKK2RkYWRkNzE3MDUgYWRkIDEzMEUtMiAgIC0xMjBFLTIgLT4gMC4xMAorZGRhZGQ3MTcwNiBhZGQgMTMwRS0yICAgLTEyRS0xICAtPiAwLjEwCitkZGFkZDcxNzA3IGFkZCAxMzBFLTIgICAtMUUwICAgIC0+IDAuMzAKK2RkYWRkNzE3MDggYWRkIDFFMiAgICAgIC0xRTQgICAgLT4gLTkuOUUrMworCistLSBxdWVyeSBmcm9tIFZpbmNlbnQgS3VsYW5kYWlzYW15Cityb3VuZGluZzogY2VpbGluZworZGRhZGQ3MTgwMSAgYWRkICA3Ljg4MjI3NzM4MDU4NjJFKzI3NyAgICAtNS4xNzU3NTAzODIwNjYzRS0yMSAtPiA3Ljg4MjI3NzM4MDU4NjIwMEUrMjc3IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTgwMiAgYWRkICA3Ljg4MjI3NzM4MDU4NjIwMEUrMjc3ICAxMi4zNDEgICAgICAgICAgICAgICAtPiA3Ljg4MjI3NzM4MDU4NjIwMUUrMjc3IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTgwMyAgYWRkICA3Ljg4MjI3NzM4MDU4NjIwMUUrMjc3ICAyLjcyNzA1NDUwNDY2MTNFLTMxICAtPiA3Ljg4MjI3NzM4MDU4NjIwMkUrMjc3IEluZXhhY3QgUm91bmRlZAorCitkZGFkZDcxODExICBhZGQgICAgICAgICAgICAgICAgICAgMTIuMzQxIC01LjE3NTc1MDM4MjA2NjNFLTIxIC0+IDEyLjM0MTAwMDAwMDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxODEyICBhZGQgICAgICAgIDEyLjM0MTAwMDAwMDAwMDAwIDIuNzI3MDU0NTA0NjYxM0UtMzEgIC0+IDEyLjM0MTAwMDAwMDAwMDAxICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxODEzICBhZGQgICAgICAgIDEyLjM0MTAwMDAwMDAwMDAxIDcuODgyMjc3MzgwNTg2MkUrMjc3IC0+IDcuODgyMjc3MzgwNTg2MjAxRSsyNzcgSW5leGFjdCBSb3VuZGVkCisKKy0tIEdhcHB5IGNvZWZmaWNpZW50czsgY2hlY2sgcmVzaWR1ZSBoYW5kbGluZyBldmVuIHdpdGggZnVsbCBjb2VmZmljaWVudCBnYXAKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KKworZGRhZGQ3NTAwMSBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiAxICAgICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NworZGRhZGQ3NTAwMiBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiAwLjYgICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDAzIGFkZCAxMjM0NTY3ODkwMTIzNDU2IDAuMDYgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwMDQgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMyAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAwNSBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS00ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDA2IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTUgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwMDcgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtNiAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAwOCBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS03ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDA5IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTggICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwMTAgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtOSAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAxMSBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xMCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDEyIGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTExICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwMTMgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTIgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAxNCBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xMyAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDE1IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTE0ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwMTYgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTUgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAxNyBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xNiAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDE4IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTE3ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwMTkgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTggIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAyMCBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xOSAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDIxIGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTIwICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gd2lkZW5pbmcgc2Vjb25kIGFyZ3VtZW50IGF0IGdhcAorZGRhZGQ3NTAzMCBhZGQgMTIzNDU2NzggMSAgICAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzkKK2RkYWRkNzUwMzEgYWRkIDEyMzQ1Njc4IDAuMSAgICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEKK2RkYWRkNzUwMzIgYWRkIDEyMzQ1Njc4IDAuMTIgICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyCitkZGFkZDc1MDMzIGFkZCAxMjM0NTY3OCAwLjEyMyAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjMKK2RkYWRkNzUwMzQgYWRkIDEyMzQ1Njc4IDAuMTIzNCAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQKK2RkYWRkNzUwMzUgYWRkIDEyMzQ1Njc4IDAuMTIzNDUgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1CitkZGFkZDc1MDM2IGFkZCAxMjM0NTY3OCAwLjEyMzQ1NiAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTYKK2RkYWRkNzUwMzcgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2NyAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1NjcKK2RkYWRkNzUwMzggYWRkIDEyMzQ1Njc4IDAuMTIzNDU2NzggICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc4CitkZGFkZDc1MDM5IGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4OSAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNDAgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1ICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA0MSBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUwICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDQyIGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NTEgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNDMgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDEgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA0NCBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDEgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDQ1IGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDEgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNDYgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDEgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA0NyBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAwMDEgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDQ4IGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNDkgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAxMjM0NTYKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2RkYWRkNzUwNTAgYWRkIDEyMzQ1Njc4IDAuMDIzNDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA1MSBhZGQgMTIzNDU2NzggMC4wMDM0NTY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDUyIGFkZCAxMjM0NTY3OCAwLjAwMDQ1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDA0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNTMgYWRkIDEyMzQ1Njc4IDAuMDAwMDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDA1Njc4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA1NCBhZGQgMTIzNDU2NzggMC4wMDAwMDY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDA2NzggSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDU1IGFkZCAxMjM0NTY3OCAwLjAwMDAwMDc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDA3OCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNTYgYWRkIDEyMzQ1Njc4IDAuMDAwMDAwMDc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA1NyBhZGQgMTIzNDU2NzggMC4wMDAwMDAwMDUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDYwIGFkZCAxMjM0NTY3OCAwLjAyMzQ1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNjEgYWRkIDEyMzQ1Njc4IDAuMDAzNDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA2MiBhZGQgMTIzNDU2NzggMC4wMDA0NTY3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwNDU2NzggSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDYzIGFkZCAxMjM0NTY3OCAwLjAwMDA1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwNTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNjQgYWRkIDEyMzQ1Njc4IDAuMDAwMDA2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwNjc4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA2NSBhZGQgMTIzNDU2NzggMC4wMDAwMDA3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwMDAwNzggSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDY2IGFkZCAxMjM0NTY3OCAwLjAwMDAwMDA3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNjcgYWRkIDEyMzQ1Njc4IDAuMDAwMDAwMDA1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorLS0gZmFyLW91dCByZXNpZHVlcyAoZnVsbCBjb2VmZmljaWVudCBnYXAgaXMgMTYrMTUgZGlnaXRzKQorcm91bmRpbmc6IHVwCitkZGFkZDc1MDcwIGFkZCAxMjM0NTY3OCAxRS04ICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMQorZGRhZGQ3NTA3MSBhZGQgMTIzNDU2NzggMUUtOSAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDcyIGFkZCAxMjM0NTY3OCAxRS0xMCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNzMgYWRkIDEyMzQ1Njc4IDFFLTExICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA3NCBhZGQgMTIzNDU2NzggMUUtMTIgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDc1IGFkZCAxMjM0NTY3OCAxRS0xMyAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNzYgYWRkIDEyMzQ1Njc4IDFFLTE0ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA3NyBhZGQgMTIzNDU2NzggMUUtMTUgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDc4IGFkZCAxMjM0NTY3OCAxRS0xNiAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNzkgYWRkIDEyMzQ1Njc4IDFFLTE3ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA4MCBhZGQgMTIzNDU2NzggMUUtMTggICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDgxIGFkZCAxMjM0NTY3OCAxRS0xOSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwODIgYWRkIDEyMzQ1Njc4IDFFLTIwICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA4MyBhZGQgMTIzNDU2NzggMUUtMjUgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDg0IGFkZCAxMjM0NTY3OCAxRS0zMCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwODUgYWRkIDEyMzQ1Njc4IDFFLTMxICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA4NiBhZGQgMTIzNDU2NzggMUUtMzIgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDg3IGFkZCAxMjM0NTY3OCAxRS0zMyAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwODggYWRkIDEyMzQ1Njc4IDFFLTM0ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA4OSBhZGQgMTIzNDU2NzggMUUtMzUgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCisKKy0tIFB1bml0J3MKK2RkYWRkNzUxMDAgYWRkIDEuMDAwIC0yMDAuMDAwICAgICAgICAgICAgICAgICAgIC0+IC0xOTkuMDAwCisKKy0tIFJvdW5kaW5nIHN3YXRoZQorcm91bmRpbmc6IGhhbGZfZXZlbgorZGRhZGQ4MTEwMCBhZGQgIC4yMzAwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgUm91bmRlZAorZGRhZGQ4MTEwMSBhZGQgIC4yMzAxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMTAyIGFkZCAgLjIzMTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODExMDMgYWRkICAuMjM1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTEwNCBhZGQgIC4yMzUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMTA1IGFkZCAgLjI0NTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODExMDYgYWRkICAuMjQ1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjUgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTEwNyBhZGQgIC4yMzYwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMTA4IGFkZCAgLjIzNzAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODExMDkgYWRkICAuMjM5OSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTEyMCBhZGQgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOUUrMzY5ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTEyMSBhZGQgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtOUUrMzY5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX3VwCitkZGFkZDgxMjAwIGFkZCAgLjIzMDAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBSb3VuZGVkCitkZGFkZDgxMjAxIGFkZCAgLjIzMDEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEyMDIgYWRkICAuMjMxMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTIwMyBhZGQgIC4yMzUwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMjA0IGFkZCAgLjIzNTEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEyMDUgYWRkICAuMjQ1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjUgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTIwNiBhZGQgIC4yNDUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMjA3IGFkZCAgLjIzNjAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEyMDggYWRkICAuMjM3MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTIwOSBhZGQgIC4yMzk5ICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMjIwIGFkZCAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA5RSszNjkgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEyMjEgYWRkIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTlFKzM2OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9kb3duCitkZGFkZDgxMzAwIGFkZCAgLjIzMDAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBSb3VuZGVkCitkZGFkZDgxMzAxIGFkZCAgLjIzMDEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEzMDIgYWRkICAuMjMxMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTMwMyBhZGQgIC4yMzUwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMzA0IGFkZCAgLjIzNTEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEzMDUgYWRkICAuMjQ1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTMwNiBhZGQgIC4yNDUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMzA3IGFkZCAgLjIzNjAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEzMDggYWRkICAuMjM3MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTMwOSBhZGQgIC4yMzk5ICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMzIwIGFkZCAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA5RSszNjkgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEzMjEgYWRkIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTlFKzM2OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogdXAKK2RkYWRkODE0MDAgYWRkICAuMjMwMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIFJvdW5kZWQKK2RkYWRkODE0MDEgYWRkICAuMjMwMSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTQwMiBhZGQgIC4yMzEwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNDAzIGFkZCAgLjIzNTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE0MDQgYWRkICAuMjM1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTQwNSBhZGQgIC4yNDUwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNDA2IGFkZCAgLjI0NTEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE0MDcgYWRkICAuMjM2MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTQwOCBhZGQgIC4yMzcwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNDA5IGFkZCAgLjIzOTkgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE0MTEgYWRkIC0uMjM5OSAgIC0xMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAtMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTQyMCBhZGQgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOUUrMzY5IC0+ICBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNDIxIGFkZCAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC05RSszNjkgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGRvd24KK2RkYWRkODE1MDAgYWRkICAuMjMwMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIFJvdW5kZWQKK2RkYWRkODE1MDEgYWRkICAuMjMwMSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTUwMiBhZGQgIC4yMzEwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNTAzIGFkZCAgLjIzNTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE1MDQgYWRkICAuMjM1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTUwNSBhZGQgIC4yNDUwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNTA2IGFkZCAgLjI0NTEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE1MDcgYWRkICAuMjM2MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTUwOCBhZGQgIC4yMzcwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNTA5IGFkZCAgLjIzOTkgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE1MTEgYWRkIC0uMjM5OSAgIC0xMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAtMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTUyMCBhZGQgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOUUrMzY5IC0+ICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE1MjEgYWRkIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTlFKzM2OSAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBjZWlsaW5nCitkZGFkZDgxNjAwIGFkZCAgLjIzMDAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBSb3VuZGVkCitkZGFkZDgxNjAxIGFkZCAgLjIzMDEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE2MDIgYWRkICAuMjMxMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTYwMyBhZGQgIC4yMzUwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNjA0IGFkZCAgLjIzNTEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE2MDUgYWRkICAuMjQ1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjUgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTYwNiBhZGQgIC4yNDUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNjA3IGFkZCAgLjIzNjAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE2MDggYWRkICAuMjM3MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTYwOSBhZGQgIC4yMzk5ICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNjExIGFkZCAtLjIzOTkgICAtMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gLTEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE2MjAgYWRkICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDlFKzM2OSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTYyMSBhZGQgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtOUUrMzY5IC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGZsb29yCitkZGFkZDgxNzAwIGFkZCAgLjIzMDAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBSb3VuZGVkCitkZGFkZDgxNzAxIGFkZCAgLjIzMDEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE3MDIgYWRkICAuMjMxMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTcwMyBhZGQgIC4yMzUwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNzA0IGFkZCAgLjIzNTEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE3MDUgYWRkICAuMjQ1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTcwNiBhZGQgIC4yNDUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNzA3IGFkZCAgLjIzNjAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE3MDggYWRkICAuMjM3MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTcwOSBhZGQgIC4yMzk5ICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNzExIGFkZCAtLjIzOTkgICAtMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gLTEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE3MjAgYWRkICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDlFKzM2OSAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNzIxIGFkZCAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC05RSszNjkgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IDA1dXAKK2RkYWRkODE4MDAgYWRkICAuMjAwMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjAgIFJvdW5kZWQKK2RkYWRkODE4MDEgYWRkICAuMjAwMSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjEgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTgwMiBhZGQgIC4yMDEwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxODAzIGFkZCAgLjIwNTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE4MDQgYWRkICAuMjA1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjEgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTgwNyBhZGQgIC4yMDYwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxODA4IGFkZCAgLjIwNzAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE4MDkgYWRkICAuMjA5OSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjEgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTgxMSBhZGQgLS4yMDk5ICAgLTEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+IC0xMjM0NTY3ODkwMTIzNC4yMSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxODIwIGFkZCAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA5RSszNjkgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTgyMSBhZGQgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtOUUrMzY5IC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ4MTkwMCBhZGQgIC4yMTAwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMSAgUm91bmRlZAorZGRhZGQ4MTkwMSBhZGQgIC4yMTAxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxOTAyIGFkZCAgLjIxMTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE5MDMgYWRkICAuMjE1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjEgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTkwNCBhZGQgIC4yMTUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxOTA3IGFkZCAgLjIxNjAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE5MDggYWRkICAuMjE3MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjEgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTkwOSBhZGQgIC4yMTk5ICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxOTExIGFkZCAtLjIxOTkgICAtMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gLTEyMzQ1Njc4OTAxMjM0LjIxICBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ4MjAwMCBhZGQgIC4yNDAwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgUm91bmRlZAorZGRhZGQ4MjAwMSBhZGQgIC4yNDAxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMDAyIGFkZCAgLjI0MTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIwMDMgYWRkICAuMjQ1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjAwNCBhZGQgIC4yNDUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMDA3IGFkZCAgLjI0NjAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIwMDggYWRkICAuMjQ3MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjAwOSBhZGQgIC4yNDk5ICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMDExIGFkZCAtLjI0OTkgICAtMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gLTEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ4MjEwMCBhZGQgIC4yNTAwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNSAgUm91bmRlZAorZGRhZGQ4MjEwMSBhZGQgIC4yNTAxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMTAyIGFkZCAgLjI1MTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIxMDMgYWRkICAuMjU1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjEwNCBhZGQgIC4yNTUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMTA3IGFkZCAgLjI1NjAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIxMDggYWRkICAuMjU3MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjEwOSBhZGQgIC4yNTk5ICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMTExIGFkZCAtLjI1OTkgICAtMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gLTEyMzQ1Njc4OTAxMjM0LjI2ICBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ4MjIwMCBhZGQgIC4yNjAwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNiAgUm91bmRlZAorZGRhZGQ4MjIwMSBhZGQgIC4yNjAxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMjAyIGFkZCAgLjI2MTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIyMDMgYWRkICAuMjY1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjIwNCBhZGQgIC4yNjUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMjA3IGFkZCAgLjI2NjAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIyMDggYWRkICAuMjY3MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjIwOSBhZGQgIC4yNjk5ICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMjExIGFkZCAtLjI2OTkgICAtMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gLTEyMzQ1Njc4OTAxMjM0LjI2ICBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ4MjMwMCBhZGQgIC4yOTAwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yOSAgUm91bmRlZAorZGRhZGQ4MjMwMSBhZGQgIC4yOTAxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yOSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMzAyIGFkZCAgLjI5MTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIzMDMgYWRkICAuMjk1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjkgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjMwNCBhZGQgIC4yOTUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yOSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMzA3IGFkZCAgLjI5NjAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIzMDggYWRkICAuMjk3MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjkgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjMwOSBhZGQgIC4yOTk5ICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yOSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMzExIGFkZCAtLjI5OTkgICAtMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gLTEyMzQ1Njc4OTAxMjM0LjI5ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gTnVsbCB0ZXN0cworZGRhZGQ5OTkwIGFkZCAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkOTk5MSBhZGQgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQW5kLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQW5kLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhOWY5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRBbmQuZGVjVGVzdApAQCAtMCwwICsxLDM0NyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZEFuZC5kZWNUZXN0IC0tIGRpZ2l0d2lzZSBsb2dpY2FsIEFORCBmb3IgZGVjRG91YmxlcyAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sgKHRydXRoIHRhYmxlKQorZGRhbmQwMDEgYW5kICAgICAgICAgICAgIDAgICAgMCAtPiAgICAwCitkZGFuZDAwMiBhbmQgICAgICAgICAgICAgMCAgICAxIC0+ICAgIDAKK2RkYW5kMDAzIGFuZCAgICAgICAgICAgICAxICAgIDAgLT4gICAgMAorZGRhbmQwMDQgYW5kICAgICAgICAgICAgIDEgICAgMSAtPiAgICAxCitkZGFuZDAwNSBhbmQgICAgICAgICAgMTEwMCAxMDEwIC0+IDEwMDAKKy0tIGFuZCBhdCBtc2QgYW5kIG1zZC0xCistLSAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAxMjM0NTY3ODkwMTIzNDU2ICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorZGRhbmQwMDYgYW5kIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgICAgICAgIDAKK2RkYW5kMDA3IGFuZCAwMDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgICAgICAgICAwCitkZGFuZDAwOCBhbmQgMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAgICAgICAgMAorZGRhbmQwMDkgYW5kIDEwMDAwMDAwMDAwMDAwMDAgMTAwMDAwMDAwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMDAwMDAwMDAKK2RkYW5kMDEwIGFuZCAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgICAgICAgICAwCitkZGFuZDAxMSBhbmQgMDAwMDAwMDAwMDAwMDAwMCAwMTAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAgICAgICAgMAorZGRhbmQwMTIgYW5kIDAxMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgICAgICAgIDAKK2RkYW5kMDEzIGFuZCAwMTAwMDAwMDAwMDAwMDAwIDAxMDAwMDAwMDAwMDAwMDAgLT4gICAgMTAwMDAwMDAwMDAwMDAwCisKKy0tIFZhcmlvdXMgbGVuZ3RocworLS0gICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RkYW5kMDIxIGFuZCAxMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTEgIC0+ICAxMTExMTExMTExMTExMTExCitkZGFuZDAyNCBhbmQgMTExMTExMTExMTExMTExMSAgMTExMTExMTExMTExMTExICAtPiAgIDExMTExMTExMTExMTExMQorZGRhbmQwMjUgYW5kIDExMTExMTExMTExMTExMTEgICAxMTExMTExMTExMTExMSAgLT4gICAgMTExMTExMTExMTExMTEKK2RkYW5kMDI2IGFuZCAxMTExMTExMTExMTExMTExICAgIDExMTExMTExMTExMTEgIC0+ICAgICAxMTExMTExMTExMTExCitkZGFuZDAyNyBhbmQgMTExMTExMTExMTExMTExMSAgICAgMTExMTExMTExMTExICAtPiAgICAgIDExMTExMTExMTExMQorZGRhbmQwMjggYW5kIDExMTExMTExMTExMTExMTEgICAgICAxMTExMTExMTExMSAgLT4gICAgICAgMTExMTExMTExMTEKK2RkYW5kMDI5IGFuZCAxMTExMTExMTExMTExMTExICAgICAgIDExMTExMTExMTEgIC0+ICAgICAgICAxMTExMTExMTExCitkZGFuZDAzMCBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgMTExMTExMTExICAtPiAgICAgICAgIDExMTExMTExMQorZGRhbmQwMzEgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgICAxMTExMTExMSAgLT4gICAgICAgICAgMTExMTExMTEKK2RkYW5kMDMyIGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAgIDExMTExMTEgIC0+ICAgICAgICAgICAxMTExMTExCitkZGFuZDAzMyBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgICAgMTExMTExICAtPiAgICAgICAgICAgIDExMTExMQorZGRhbmQwMzQgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgICAgICAxMTExMSAgLT4gICAgICAgICAgICAgMTExMTEKK2RkYW5kMDM1IGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAgICAgIDExMTEgIC0+ICAgICAgICAgICAgICAxMTExCitkZGFuZDAzNiBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgICAgICAgMTExICAtPiAgICAgICAgICAgICAgIDExMQorZGRhbmQwMzcgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgICAgICAgICAxMSAgLT4gICAgICAgICAgICAgICAgMTEKK2RkYW5kMDM4IGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAgICAgICAgIDEgIC0+ICAgICAgICAgICAgICAgICAxCitkZGFuZDAzOSBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgICAgICAgICAwICAtPiAgICAgICAgICAgICAgICAgMAorCitkZGFuZDA0MCBhbmQgMTExMTExMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAxMTExMTExMTExMTExMTExCitkZGFuZDA0MSBhbmQgIDExMTExMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgMTExMTExMTExMTExMTExCitkZGFuZDA0MiBhbmQgIDExMTExMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgMTExMTExMTExMTExMTExCitkZGFuZDA0MyBhbmQgICAxMTExMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgIDExMTExMTExMTExMTExCitkZGFuZDA0NCBhbmQgICAgMTExMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAxMTExMTExMTExMTExCitkZGFuZDA0NSBhbmQgICAgIDExMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgMTExMTExMTExMTExCitkZGFuZDA0NiBhbmQgICAgICAxMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgIDExMTExMTExMTExCitkZGFuZDA0NyBhbmQgICAgICAgMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAxMTExMTExMTExCitkZGFuZDA0OCBhbmQgICAgICAgIDExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgMTExMTExMTExCitkZGFuZDA0OSBhbmQgICAgICAgICAxMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgIDExMTExMTExCitkZGFuZDA1MCBhbmQgICAgICAgICAgMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAxMTExMTExCitkZGFuZDA1MSBhbmQgICAgICAgICAgIDExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgMTExMTExCitkZGFuZDA1MiBhbmQgICAgICAgICAgICAxMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgIDExMTExCitkZGFuZDA1MyBhbmQgICAgICAgICAgICAgMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgICAxMTExCitkZGFuZDA1NCBhbmQgICAgICAgICAgICAgIDExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgICAgMTExCitkZGFuZDA1NSBhbmQgICAgICAgICAgICAgICAxMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgICAgIDExCitkZGFuZDA1NiBhbmQgICAgICAgICAgICAgICAgMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgICAgICAxCitkZGFuZDA1NyBhbmQgICAgICAgICAgICAgICAgMCAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgICAgICAwCisKK2RkYW5kMTUwIGFuZCAxMTExMTExMTExICAxICAtPiAgMQorZGRhbmQxNTEgYW5kICAxMTExMTExMTEgIDEgIC0+ICAxCitkZGFuZDE1MiBhbmQgICAxMTExMTExMSAgMSAgLT4gIDEKK2RkYW5kMTUzIGFuZCAgICAxMTExMTExICAxICAtPiAgMQorZGRhbmQxNTQgYW5kICAgICAxMTExMTEgIDEgIC0+ICAxCitkZGFuZDE1NSBhbmQgICAgICAxMTExMSAgMSAgLT4gIDEKK2RkYW5kMTU2IGFuZCAgICAgICAxMTExICAxICAtPiAgMQorZGRhbmQxNTcgYW5kICAgICAgICAxMTEgIDEgIC0+ICAxCitkZGFuZDE1OCBhbmQgICAgICAgICAxMSAgMSAgLT4gIDEKK2RkYW5kMTU5IGFuZCAgICAgICAgICAxICAxICAtPiAgMQorCitkZGFuZDE2MCBhbmQgMTExMTExMTExMSAgMCAgLT4gIDAKK2RkYW5kMTYxIGFuZCAgMTExMTExMTExICAwICAtPiAgMAorZGRhbmQxNjIgYW5kICAgMTExMTExMTEgIDAgIC0+ICAwCitkZGFuZDE2MyBhbmQgICAgMTExMTExMSAgMCAgLT4gIDAKK2RkYW5kMTY0IGFuZCAgICAgMTExMTExICAwICAtPiAgMAorZGRhbmQxNjUgYW5kICAgICAgMTExMTEgIDAgIC0+ICAwCitkZGFuZDE2NiBhbmQgICAgICAgMTExMSAgMCAgLT4gIDAKK2RkYW5kMTY3IGFuZCAgICAgICAgMTExICAwICAtPiAgMAorZGRhbmQxNjggYW5kICAgICAgICAgMTEgIDAgIC0+ICAwCitkZGFuZDE2OSBhbmQgICAgICAgICAgMSAgMCAgLT4gIDAKKworZGRhbmQxNzAgYW5kIDEgIDExMTExMTExMTEgIC0+ICAxCitkZGFuZDE3MSBhbmQgMSAgIDExMTExMTExMSAgLT4gIDEKK2RkYW5kMTcyIGFuZCAxICAgIDExMTExMTExICAtPiAgMQorZGRhbmQxNzMgYW5kIDEgICAgIDExMTExMTEgIC0+ICAxCitkZGFuZDE3NCBhbmQgMSAgICAgIDExMTExMSAgLT4gIDEKK2RkYW5kMTc1IGFuZCAxICAgICAgIDExMTExICAtPiAgMQorZGRhbmQxNzYgYW5kIDEgICAgICAgIDExMTEgIC0+ICAxCitkZGFuZDE3NyBhbmQgMSAgICAgICAgIDExMSAgLT4gIDEKK2RkYW5kMTc4IGFuZCAxICAgICAgICAgIDExICAtPiAgMQorZGRhbmQxNzkgYW5kIDEgICAgICAgICAgIDEgIC0+ICAxCisKK2RkYW5kMTgwIGFuZCAwICAxMTExMTExMTExICAtPiAgMAorZGRhbmQxODEgYW5kIDAgICAxMTExMTExMTEgIC0+ICAwCitkZGFuZDE4MiBhbmQgMCAgICAxMTExMTExMSAgLT4gIDAKK2RkYW5kMTgzIGFuZCAwICAgICAxMTExMTExICAtPiAgMAorZGRhbmQxODQgYW5kIDAgICAgICAxMTExMTEgIC0+ICAwCitkZGFuZDE4NSBhbmQgMCAgICAgICAxMTExMSAgLT4gIDAKK2RkYW5kMTg2IGFuZCAwICAgICAgICAxMTExICAtPiAgMAorZGRhbmQxODcgYW5kIDAgICAgICAgICAxMTEgIC0+ICAwCitkZGFuZDE4OCBhbmQgMCAgICAgICAgICAxMSAgLT4gIDAKK2RkYW5kMTg5IGFuZCAwICAgICAgICAgICAxICAtPiAgMAorCitkZGFuZDA5MCBhbmQgMDExMTExMTExICAxMTExMTExMTEgIC0+ICAgMTExMTExMTEKK2RkYW5kMDkxIGFuZCAxMDExMTExMTEgIDExMTExMTExMSAgLT4gIDEwMTExMTExMQorZGRhbmQwOTIgYW5kIDExMDExMTExMSAgMTExMTExMTExICAtPiAgMTEwMTExMTExCitkZGFuZDA5MyBhbmQgMTExMDExMTExICAxMTExMTExMTEgIC0+ICAxMTEwMTExMTEKK2RkYW5kMDk0IGFuZCAxMTExMDExMTEgIDExMTExMTExMSAgLT4gIDExMTEwMTExMQorZGRhbmQwOTUgYW5kIDExMTExMDExMSAgMTExMTExMTExICAtPiAgMTExMTEwMTExCitkZGFuZDA5NiBhbmQgMTExMTExMDExICAxMTExMTExMTEgIC0+ICAxMTExMTEwMTEKK2RkYW5kMDk3IGFuZCAxMTExMTExMDEgIDExMTExMTExMSAgLT4gIDExMTExMTEwMQorZGRhbmQwOTggYW5kIDExMTExMTExMCAgMTExMTExMTExICAtPiAgMTExMTExMTEwCisKK2RkYW5kMTAwIGFuZCAxMTExMTExMTEgIDAxMTExMTExMSAgLT4gICAxMTExMTExMQorZGRhbmQxMDEgYW5kIDExMTExMTExMSAgMTAxMTExMTExICAtPiAgMTAxMTExMTExCitkZGFuZDEwMiBhbmQgMTExMTExMTExICAxMTAxMTExMTEgIC0+ICAxMTAxMTExMTEKK2RkYW5kMTAzIGFuZCAxMTExMTExMTEgIDExMTAxMTExMSAgLT4gIDExMTAxMTExMQorZGRhbmQxMDQgYW5kIDExMTExMTExMSAgMTExMTAxMTExICAtPiAgMTExMTAxMTExCitkZGFuZDEwNSBhbmQgMTExMTExMTExICAxMTExMTAxMTEgIC0+ICAxMTExMTAxMTEKK2RkYW5kMTA2IGFuZCAxMTExMTExMTEgIDExMTExMTAxMSAgLT4gIDExMTExMTAxMQorZGRhbmQxMDcgYW5kIDExMTExMTExMSAgMTExMTExMTAxICAtPiAgMTExMTExMTAxCitkZGFuZDEwOCBhbmQgMTExMTExMTExICAxMTExMTExMTAgIC0+ICAxMTExMTExMTAKKworLS0gbm9uLTAvMSBzaG91bGQgbm90IGJlIGFjY2VwdGVkLCBub3Igc2hvdWxkIHNpZ25zCitkZGFuZDIyMCBhbmQgMTExMTExMTEyICAxMTExMTExMTEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjIxIGFuZCAzMzMzMzMzMzMgIDMzMzMzMzMzMyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyMjIgYW5kIDU1NTU1NTU1NSAgNTU1NTU1NTU1ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDIyMyBhbmQgNzc3Nzc3Nzc3ICA3Nzc3Nzc3NzcgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjI0IGFuZCA5OTk5OTk5OTkgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyMjUgYW5kIDIyMjIyMjIyMiAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDIyNiBhbmQgNDQ0NDQ0NDQ0ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjI3IGFuZCA2NjY2NjY2NjYgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyMjggYW5kIDg4ODg4ODg4OCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDIyOSBhbmQgOTk5OTk5OTk5ICAyMjIyMjIyMjIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjMwIGFuZCA5OTk5OTk5OTkgIDQ0NDQ0NDQ0NCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyMzEgYW5kIDk5OTk5OTk5OSAgNjY2NjY2NjY2ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDIzMiBhbmQgOTk5OTk5OTk5ICA4ODg4ODg4ODggIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGEgZmV3IHJhbmRvbXMKK2RkYW5kMjQwIGFuZCAgNTY3NDY4Njg5IC05MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNDEgYW5kICA1NjczNjc2ODkgIDkzNDk4MTk0MiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI0MiBhbmQgLTYzMTkxNzc3MiAtNzA2MDE0NjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjQzIGFuZCAtNzU2MjUzMjU3ICAxMzg1NzkyMzQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNDQgYW5kICA4MzU1OTAxNDkgIDU2NzQzNTQwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRAorZGRhbmQyNTAgYW5kICAyMDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNTEgYW5kICA3MDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNTIgYW5kICA4MDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNTMgYW5kICA5MDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNTQgYW5kICAyMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNTUgYW5kICA3MDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNTYgYW5kICA4MDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNTcgYW5kICA5MDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNTggYW5kICAxMDAwMDAwMDAwMDAwMDAwIDIwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNTkgYW5kICAxMDAwMDAwMDAwMDAwMDAwIDcwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNjAgYW5kICAxMDAwMDAwMDAwMDAwMDAwIDgwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNjEgYW5kICAxMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNjIgYW5kICAwMDAwMDAwMDAwMDAwMDAwIDIwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNjMgYW5kICAwMDAwMDAwMDAwMDAwMDAwIDcwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNjQgYW5kICAwMDAwMDAwMDAwMDAwMDAwIDgwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNjUgYW5kICAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QtMQorZGRhbmQyNzAgYW5kICAwMjAwMDAxMDAwMDAwMDAwIDEwMDAxMDAwMDAwMDAwMTAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNzEgYW5kICAwNzAwMDAwMTAwMDAwMDAwIDEwMDAwMTAwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNzIgYW5kICAwODAwMDAwMDEwMDAwMDAwIDEwMDAwMDEwMDAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNzMgYW5kICAwOTAwMDAwMDAxMDAwMDAwIDEwMDAwMDAxMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNzQgYW5kICAxMDAwMDAwMDAwMTAwMDAwIDAyMDAwMDAwMTAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNzUgYW5kICAxMDAwMDAwMDAwMDEwMDAwIDA3MDAwMDAwMDEwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNzYgYW5kICAxMDAwMDAwMDAwMDAxMDAwIDA4MDAwMDAwMTAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNzcgYW5kICAxMDAwMDAwMDAwMDAwMTAwIDA5MDAwMDAwMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBMU0QKK2RkYW5kMjgwIGFuZCAgMDAxMDAwMDAwMDAwMDAwMiAxMDAwMDAwMTAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjgxIGFuZCAgMDAwMTAwMDAwMDAwMDAwNyAxMDAwMDAxMDAwMDAwMDExIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjgyIGFuZCAgMDAwMDEwMDAwMDAwMDAwOCAxMDAwMDEwMDAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjgzIGFuZCAgMDAwMDAxMDAwMDAwMDAwOSAxMDAwMTAwMDAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjg0IGFuZCAgMTAwMDAwMTAwMDAwMDAwMCAwMDAxMDAwMDAwMDAwMDAyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjg1IGFuZCAgMTAwMDAwMDEwMDAwMDAwMCAwMDEwMDAwMDAwMDAwMDA3IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjg2IGFuZCAgMTAwMDAwMDAxMDAwMDAwMCAwMTAwMDAwMDAwMDAwMDA4IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjg3IGFuZCAgMTAwMDAwMDAwMTAwMDAwMCAxMDAwMDAwMDAwMDAwMDA5IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTWlkZGllCitkZGFuZDI4OCBhbmQgIDAwMTAwMDAwMjAwMDAwMDAgMTAwMDAwMTAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI4OSBhbmQgIDAwMDEwMDAwNzAwMDAwMDEgMTAwMDAwMDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI5MCBhbmQgIDAwMDAxMDAwODAwMDAwMTAgMTAwMDAwMDAxMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI5MSBhbmQgIDAwMDAwMTAwOTAwMDAxMDAgMTAwMDAwMDAwMTAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI5MiBhbmQgIDEwMDAwMDEwMDAwMDEwMDAgMDAwMDAwMDAyMDEwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI5MyBhbmQgIDEwMDAwMDAxMDAwMTAwMDAgMDAwMDAwMDA3MDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI5NCBhbmQgIDEwMDAwMDAwMTAxMDAwMDAgMDAwMDAwMDA4MDAwMTAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI5NSBhbmQgIDEwMDAwMDAwMDEwMDAwMDAgMDAwMDAwMDA5MDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBzaWducworZGRhbmQyOTYgYW5kIC0xMDAwMDAwMDAxMDAwMDAwIC0wMDAwMDEwMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjk3IGFuZCAtMTAwMDAwMDAwMTAwMDAwMCAgMDAwMDAwMDAxMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI5OCBhbmQgIDEwMDAwMDAwMDEwMDAwMDAgLTAwMDAwMDEwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyOTkgYW5kICAxMDAwMDAwMDAxMDAwMDAwICAwMDAwMDAwMDExMDAwMTAwIC0+ICAxMDAwMDAwCisKKy0tIE5tYXgsIE5taW4sIE50aW55LWxpa2UKK2RkYW5kMzMxIGFuZCAgMiAgIDkuOTk5OTk5OTlFKzE5OSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDMzMiBhbmQgIDMgICAxRS0xOTkgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzMzMgYW5kICA0ICAgMS4wMDAwMDAwMEUtMTk5ICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzM0IGFuZCAgNSAgIDFFLTEwMCAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDMzNSBhbmQgIDYgICAtMUUtMTAwICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzMzYgYW5kICA3ICAgLTEuMDAwMDAwMDBFLTE5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzM3IGFuZCAgOCAgIC0xRS0xOTkgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDMzOCBhbmQgIDkgICAtOS45OTk5OTk5OUUrMTk5ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzNDEgYW5kICA5Ljk5OTk5OTk5RSsxOTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzQyIGFuZCAgMUUtMTk5ICAgICAgICAgICAgICAgMDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM0MyBhbmQgIDEuMDAwMDAwMDBFLTE5OSAgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzNDQgYW5kICAxRS0xMDAgICAgICAgICAgICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzQ1IGFuZCAgLTFFLTEwMCAgICAgICAgICAgICAtMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM0NiBhbmQgIC0xLjAwMDAwMDAwRS0xOTkgICAgIDE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzNDcgYW5kICAtMUUtMTk5ICAgICAgICAgICAgICAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzQ4IGFuZCAgLTkuOTk5OTk5OTlFKzE5OSAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEEgZmV3IG90aGVyIG5vbi1pbnRlZ2VycworZGRhbmQzNjEgYW5kICAxLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzYyIGFuZCAgMUUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM2MyBhbmQgIDAuMCAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzNjQgYW5kICAwRSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzY1IGFuZCAgOS45ICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM2NiBhbmQgIDlFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzNzEgYW5kICAwIDEuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzcyIGFuZCAgMCAxRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM3MyBhbmQgIDAgMC4wICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzNzQgYW5kICAwIDBFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzc1IGFuZCAgMCA5LjkgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM3NiBhbmQgIDAgOUUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBbGwgU3BlY2lhbHMgYXJlIGluIGVycm9yCitkZGFuZDc4MCBhbmQgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ3ODEgYW5kIC1JbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kNzgyIGFuZCAtSW5mICAtMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDc4MyBhbmQgLUluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ3ODQgYW5kIC1JbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kNzg1IGFuZCAtSW5mICAgMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDc4NiBhbmQgLUluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ3ODcgYW5kIC0xMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kNzg4IGFuZCAtSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDc4OSBhbmQgLTEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ3OTAgYW5kIC0wICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kNzkxIGFuZCAgMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDc5MiBhbmQgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ3OTMgYW5kICAxMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kNzk0IGFuZCAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RkYW5kODAwIGFuZCAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgwMSBhbmQgIEluZiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MDIgYW5kICBJbmYgIC0xICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODAzIGFuZCAgSW5mICAtMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgwNCBhbmQgIEluZiAgIDAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MDUgYW5kICBJbmYgICAxICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODA2IGFuZCAgSW5mICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgwNyBhbmQgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MDggYW5kIC0xMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODA5IGFuZCAtSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgxMCBhbmQgLTEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MTEgYW5kIC0wICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODEyIGFuZCAgMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgxMyBhbmQgIDEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MTQgYW5kICAxMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODE1IGFuZCAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RkYW5kODIxIGFuZCAgTmFOIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgyMiBhbmQgIE5hTiAtMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MjMgYW5kICBOYU4gLTEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODI0IGFuZCAgTmFOIC0wICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgyNSBhbmQgIE5hTiAgMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MjYgYW5kICBOYU4gIDEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODI3IGFuZCAgTmFOICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgyOCBhbmQgIE5hTiAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MjkgYW5kICBOYU4gIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODMwIGFuZCAtSW5mICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgzMSBhbmQgLTEwMDAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MzIgYW5kIC0xICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODMzIGFuZCAtMCAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgzNCBhbmQgIDAgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MzUgYW5kICAxICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODM2IGFuZCAgMTAwMCBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgzNyBhbmQgIEluZiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZGFuZDg0MSBhbmQgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg0MiBhbmQgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg0MyBhbmQgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg0NCBhbmQgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg0NSBhbmQgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg0NiBhbmQgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg0NyBhbmQgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg0OCBhbmQgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg0OSBhbmQgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg1MCBhbmQgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg1MSBhbmQgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg1MiBhbmQgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg1MyBhbmQgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg1NCBhbmQgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg1NSBhbmQgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg1NiBhbmQgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg1NyBhbmQgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg1OCBhbmQgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg1OSBhbmQgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RkYW5kODYxIGFuZCAgTmFOMSAgIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg2MiBhbmQgK05hTjIgICAtMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NjMgYW5kICBOYU4zICAgIDEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODY0IGFuZCAgTmFONCAgICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg2NSBhbmQgIE5hTjUgICArTmFONiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NjYgYW5kIC1JbmYgICAgIE5hTjcgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODY3IGFuZCAtMTAwMCAgICBOYU44ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg2OCBhbmQgIDEwMDAgICAgTmFOOSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NjkgYW5kICBJbmYgICAgK05hTjEwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODcxIGFuZCAgc05hTjExICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg3MiBhbmQgIHNOYU4xMiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NzMgYW5kICBzTmFOMTMgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODc0IGFuZCAgc05hTjE0ICAgTmFOMTcgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg3NSBhbmQgIHNOYU4xNSAgc05hTjE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NzYgYW5kICBOYU4xNiAgIHNOYU4xOSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODc3IGFuZCAtSW5mICAgICtzTmFOMjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg3OCBhbmQgLTEwMDAgICAgc05hTjIxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NzkgYW5kICAxMDAwICAgIHNOYU4yMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODgwIGFuZCAgSW5mICAgICBzTmFOMjMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg4MSBhbmQgK05hTjI1ICArc05hTjI0IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4ODIgYW5kIC1OYU4yNiAgICBOYU4yOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODgzIGFuZCAtc05hTjI3ICBzTmFOMjkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg4NCBhbmQgIDEwMDAgICAgLU5hTjMwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4ODUgYW5kICAxMDAwICAgLXNOYU4zMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRCYXNlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQmFzZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmViZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQmFzZS5kZWNUZXN0CkBAIC0wLDAgKzEsMTEwNCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZEJhc2UuZGVjVGVzdCAtLSBiYXNlIGRlY0RvdWJsZSA8LS0+IHN0cmluZyBjb252ZXJzaW9ucyAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgZmlsZSB0ZXN0cyBiYXNlIGNvbnZlcnNpb25zIGZyb20gc3RyaW5nIHRvIGEgZGVjaW1hbCBudW1iZXIKKy0tIGFuZCBiYWNrIHRvIGEgc3RyaW5nIChpbiBTY2llbnRpZmljIGZvcm0pCisKKy0tIE5vdGUgdGhhdCB1bmxpa2Ugb3RoZXIgb3BlcmF0aW9ucyB0aGUgb3BlcmFuZCBpcyBzdWJqZWN0IHRvIHJvdW5kaW5nCistLSB0byBjb25mb3JtIHRvIGVtYXggYW5kIHByZWNpc2lvbiBzZXR0aW5ncyAodGhhdCBpcywgbnVtYmVycyB3aWxsCistLSBjb25mb3JtIHRvIHJ1bGVzIGFuZCBleHBvbmVudCB3aWxsIGJlIGluIHBlcm1pdHRlZCByYW5nZSkuICBUaGUKKy0tICdsZWZ0IGhhbmQgc2lkZScsIHRoZXJlZm9yZSwgbWF5IGhhdmUgbnVtYmVycyB0aGF0IGNhbm5vdCBiZQorLS0gcmVwcmVzZW50ZWQgaW4gYSBkZWNEb3VibGUuICBTb21lIHRlc3RjYXNlcyBnbyB0byB0aGUgbGltaXQgb2YgdGhlCistLSBuZXh0LXdpZGVyIGZvcm1hdCwgYW5kIGhlbmNlIHRoZXNlIHRlc3RjYXNlcyBtYXkgYWxzbyBiZSB1c2VkIHRvCistLSB0ZXN0IG5hcnJvd2luZyBhbmQgd2lkZW5pbmcgb3BlcmF0aW9ucy4KKworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2RkYmFzMDAxIHRvU2NpICAgICAgIDAgLT4gMAorZGRiYXMwMDIgdG9TY2kgICAgICAgMSAtPiAxCitkZGJhczAwMyB0b1NjaSAgICAgMS4wIC0+IDEuMAorZGRiYXMwMDQgdG9TY2kgICAgMS4wMCAtPiAxLjAwCitkZGJhczAwNSB0b1NjaSAgICAgIDEwIC0+IDEwCitkZGJhczAwNiB0b1NjaSAgICAxMDAwIC0+IDEwMDAKK2RkYmFzMDA3IHRvU2NpICAgIDEwLjAgLT4gMTAuMAorZGRiYXMwMDggdG9TY2kgICAgMTAuMSAtPiAxMC4xCitkZGJhczAwOSB0b1NjaSAgICAxMC40IC0+IDEwLjQKK2RkYmFzMDEwIHRvU2NpICAgIDEwLjUgLT4gMTAuNQorZGRiYXMwMTEgdG9TY2kgICAgMTAuNiAtPiAxMC42CitkZGJhczAxMiB0b1NjaSAgICAxMC45IC0+IDEwLjkKK2RkYmFzMDEzIHRvU2NpICAgIDExLjAgLT4gMTEuMAorZGRiYXMwMTQgdG9TY2kgIDEuMjM0IC0+IDEuMjM0CitkZGJhczAxNSB0b1NjaSAgMC4xMjMgLT4gMC4xMjMKK2RkYmFzMDE2IHRvU2NpICAwLjAxMiAtPiAwLjAxMgorZGRiYXMwMTcgdG9TY2kgIC0wICAgIC0+IC0wCitkZGJhczAxOCB0b1NjaSAgLTAuMCAgLT4gLTAuMAorZGRiYXMwMTkgdG9TY2kgLTAwLjAwIC0+IC0wLjAwCisKK2RkYmFzMDIxIHRvU2NpICAgICAtMSAtPiAtMQorZGRiYXMwMjIgdG9TY2kgICAtMS4wIC0+IC0xLjAKK2RkYmFzMDIzIHRvU2NpICAgLTAuMSAtPiAtMC4xCitkZGJhczAyNCB0b1NjaSAgIC05LjEgLT4gLTkuMQorZGRiYXMwMjUgdG9TY2kgICAtOS4xMSAtPiAtOS4xMQorZGRiYXMwMjYgdG9TY2kgICAtOS4xMTkgLT4gLTkuMTE5CitkZGJhczAyNyB0b1NjaSAgIC05Ljk5OSAtPiAtOS45OTkKKworZGRiYXMwMzAgdG9TY2kgICcxMjM0NTY3ODkuMTIzNDU2JyAgIC0+ICcxMjM0NTY3ODkuMTIzNDU2JworZGRiYXMwMzEgdG9TY2kgICcxMjM0NTY3ODkuMDAwMDAwJyAgIC0+ICcxMjM0NTY3ODkuMDAwMDAwJworZGRiYXMwMzIgdG9TY2kgICAnMTIzNDU2Nzg5MTIzNDU2JyAgIC0+ICcxMjM0NTY3ODkxMjM0NTYnCitkZGJhczAzMyB0b1NjaSAgICcwLjAwMDAxMjM0NTY3ODknICAgLT4gJzAuMDAwMDEyMzQ1Njc4OScKK2RkYmFzMDM0IHRvU2NpICAnMC4wMDAwMDEyMzQ1Njc4OScgICAtPiAnMC4wMDAwMDEyMzQ1Njc4OScKK2RkYmFzMDM1IHRvU2NpICcwLjAwMDAwMDEyMzQ1Njc4OScgICAtPiAnMS4yMzQ1Njc4OUUtNycKK2RkYmFzMDM2IHRvU2NpICcwLjAwMDAwMDAxMjM0NTY3ODknICAtPiAnMS4yMzQ1Njc4OUUtOCcKKworZGRiYXMwMzcgdG9TY2kgJzAuMTIzNDU2Nzg5MDEyMzQ0JyAgIC0+ICcwLjEyMzQ1Njc4OTAxMjM0NCcKK2RkYmFzMDM4IHRvU2NpICcwLjEyMzQ1Njc4OTAxMjM0NScgICAtPiAnMC4xMjM0NTY3ODkwMTIzNDUnCisKKy0tIHRlc3QgZmluaXRlIGJvdW5kcyAoTmVncyBvZiwgdGhlbiAwLCBOdGlueSwgTm1pbiwgb3RoZXIsIE5tYXgpCitkZGJzbjAwMSB0b1NjaSAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRic24wMDIgdG9TY2kgLTFFLTM4MyAtPiAtMUUtMzgzCitkZGJzbjAwMyB0b1NjaSAtMUUtMzk4IC0+IC0xRS0zOTggU3Vibm9ybWFsCitkZGJzbjAwNCB0b1NjaSAtMCAtPiAtMAorZGRic24wMDUgdG9TY2kgKzAgLT4gIDAKK2RkYnNuMDA2IHRvU2NpICsxRS0zOTggLT4gIDFFLTM5OCBTdWJub3JtYWwKK2RkYnNuMDA3IHRvU2NpICsxRS0zODMgLT4gIDFFLTM4MworZGRic24wMDggdG9TY2kgKzkuOTk5OTk5OTk5OTk5OTk5RSszODQgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKKworLS0gU3RyaW5nIFttYW55IG1vcmUgZXhhbXBsZXMgYXJlIGltcGxpY2l0bHkgdGVzdGVkIGVsc2V3aGVyZV0KKy0tIHN0cmluZ3Mgd2l0aG91dCBFIGNhbm5vdCBnZW5lcmF0ZSBFIGluIHJlc3VsdAorZGRiYXMwNDAgdG9TY2kgIjEyIiAgICAgICAgLT4gJzEyJworZGRiYXMwNDEgdG9TY2kgIi03NiIgICAgICAgLT4gJy03NicKK2RkYmFzMDQyIHRvU2NpICIxMi43NiIgICAgIC0+ICcxMi43NicKK2RkYmFzMDQzIHRvU2NpICIrMTIuNzYiICAgIC0+ICcxMi43NicKK2RkYmFzMDQ0IHRvU2NpICIwMTIuNzYiICAgIC0+ICcxMi43NicKK2RkYmFzMDQ1IHRvU2NpICIrMC4wMDMiICAgIC0+ICcwLjAwMycKK2RkYmFzMDQ2IHRvU2NpICIxNy4iICAgICAgIC0+ICcxNycKK2RkYmFzMDQ3IHRvU2NpICIuNSIgICAgICAgIC0+ICcwLjUnCitkZGJhczA0OCB0b1NjaSAiMDQ0IiAgICAgICAtPiAnNDQnCitkZGJhczA0OSB0b1NjaSAiMDA0NCIgICAgICAtPiAnNDQnCitkZGJhczA1MCB0b1NjaSAiMC4wMDA1IiAgICAgIC0+ICcwLjAwMDUnCitkZGJhczA1MSB0b1NjaSAiMDAuMDAwMDUiICAgIC0+ICcwLjAwMDA1JworZGRiYXMwNTIgdG9TY2kgIjAuMDAwMDA1IiAgICAtPiAnMC4wMDAwMDUnCitkZGJhczA1MyB0b1NjaSAiMC4wMDAwMDUwIiAgIC0+ICcwLjAwMDAwNTAnCitkZGJhczA1NCB0b1NjaSAiMC4wMDAwMDA1IiAgIC0+ICc1RS03JworZGRiYXMwNTUgdG9TY2kgIjAuMDAwMDAwMDUiICAtPiAnNUUtOCcKK2RkYmFzMDU2IHRvU2NpICIxMjM0NTY3OC41NDMyMTAiIC0+ICcxMjM0NTY3OC41NDMyMTAnCitkZGJhczA1NyB0b1NjaSAiMjM0NTY3OC41NDMyMTAiIC0+ICcyMzQ1Njc4LjU0MzIxMCcKK2RkYmFzMDU4IHRvU2NpICIzNDU2NzguNTQzMjEwIiAtPiAnMzQ1Njc4LjU0MzIxMCcKK2RkYmFzMDU5IHRvU2NpICIwMzQ1Njc4LjU0MzIxIiAtPiAnMzQ1Njc4LjU0MzIxJworZGRiYXMwNjAgdG9TY2kgIjM0NTY3OC41NDMyIiAtPiAnMzQ1Njc4LjU0MzInCitkZGJhczA2MSB0b1NjaSAiKzM0NTY3OC41NDMyIiAtPiAnMzQ1Njc4LjU0MzInCitkZGJhczA2MiB0b1NjaSAiKzAzNDU2NzguNTQzMiIgLT4gJzM0NTY3OC41NDMyJworZGRiYXMwNjMgdG9TY2kgIiswMDM0NTY3OC41NDMyIiAtPiAnMzQ1Njc4LjU0MzInCitkZGJhczA2NCB0b1NjaSAiLTM0NTY3OC41NDMyIiAgLT4gJy0zNDU2NzguNTQzMicKK2RkYmFzMDY1IHRvU2NpICItMDM0NTY3OC41NDMyIiAgLT4gJy0zNDU2NzguNTQzMicKK2RkYmFzMDY2IHRvU2NpICItMDAzNDU2NzguNTQzMiIgIC0+ICctMzQ1Njc4LjU0MzInCistLSBleGFtcGxlcworZGRiYXMwNjcgdG9TY2kgIjVFLTYiICAgICAgICAtPiAnMC4wMDAwMDUnCitkZGJhczA2OCB0b1NjaSAiNTBFLTciICAgICAgIC0+ICcwLjAwMDAwNTAnCitkZGJhczA2OSB0b1NjaSAiNUUtNyIgICAgICAgIC0+ICc1RS03JworCistLSBbTm8gZXhvdGljcyBhcyBubyBVbmljb2RlXQorCistLSByb3VuZGVkIHdpdGggZG90cyBpbiBhbGwgKGluY2x1ZGluZyBlZGdlKSBwbGFjZXMKK2RkYmFzMDcxIHRvU2NpICAuMTIzNDU2Nzg5MDEyMzQ1NjEyMyAgLT4gMC4xMjM0NTY3ODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZGRiYXMwNzIgdG9TY2kgIDEuMjM0NTY3ODkwMTIzNDU2MTIzICAtPiAxLjIzNDU2Nzg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDczIHRvU2NpICAxMi4zNDU2Nzg5MDEyMzQ1NjEyMyAgLT4gMTIuMzQ1Njc4OTAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkZGJhczA3NCB0b1NjaSAgMTIzLjQ1Njc4OTAxMjM0NTYxMjMgIC0+IDEyMy40NTY3ODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZGRiYXMwNzUgdG9TY2kgIDEyMzQuNTY3ODkwMTIzNDU2MTIzICAtPiAxMjM0LjU2Nzg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDc2IHRvU2NpICAxMjM0NS42Nzg5MDEyMzQ1NjEyMyAgLT4gMTIzNDUuNjc4OTAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkZGJhczA3NyB0b1NjaSAgMTIzNDU2Ljc4OTAxMjM0NTYxMjMgIC0+IDEyMzQ1Ni43ODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZGRiYXMwNzggdG9TY2kgIDEyMzQ1NjcuODkwMTIzNDU2MTIzICAtPiAxMjM0NTY3Ljg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDc5IHRvU2NpICAxMjM0NTY3OC45MDEyMzQ1NjEyMyAgLT4gMTIzNDU2NzguOTAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkZGJhczA4MCB0b1NjaSAgMTIzNDU2Nzg5LjAxMjM0NTYxMjMgIC0+IDEyMzQ1Njc4OS4wMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZGRiYXMwODEgdG9TY2kgIDEyMzQ1Njc4OTAuMTIzNDU2MTIzICAtPiAxMjM0NTY3ODkwLjEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDgyIHRvU2NpICAxMjM0NTY3ODkwMS4yMzQ1NjEyMyAgLT4gMTIzNDU2Nzg5MDEuMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkZGJhczA4MyB0b1NjaSAgMTIzNDU2Nzg5MDEyLjM0NTYxMjMgIC0+IDEyMzQ1Njc4OTAxMi4zNDU2IEluZXhhY3QgUm91bmRlZAorZGRiYXMwODQgdG9TY2kgIDEyMzQ1Njc4OTAxMjMuNDU2MTIzICAtPiAxMjM0NTY3ODkwMTIzLjQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDg1IHRvU2NpICAxMjM0NTY3ODkwMTIzNC41NjEyMyAgLT4gMTIzNDU2Nzg5MDEyMzQuNTYgSW5leGFjdCBSb3VuZGVkCitkZGJhczA4NiB0b1NjaSAgMTIzNDU2Nzg5MDEyMzQ1LjYxMjMgIC0+IDEyMzQ1Njc4OTAxMjM0NS42IEluZXhhY3QgUm91bmRlZAorZGRiYXMwODcgdG9TY2kgIDEyMzQ1Njc4OTAxMjM0NTYuMTIzICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDg4IHRvU2NpICAxMjM0NTY3ODkwMTIzNDU2MS4yMyAgLT4gMS4yMzQ1Njc4OTAxMjM0NTZFKzE2IEluZXhhY3QgUm91bmRlZAorZGRiYXMwODkgdG9TY2kgIDEyMzQ1Njc4OTAxMjM0NTYxMi4zICAtPiAxLjIzNDU2Nzg5MDEyMzQ1NkUrMTcgSW5leGFjdCBSb3VuZGVkCitkZGJhczA5MCB0b1NjaSAgMTIzNDU2Nzg5MDEyMzQ1NjEyMy4gIC0+IDEuMjM0NTY3ODkwMTIzNDU2RSsxOCBJbmV4YWN0IFJvdW5kZWQKKworCistLSBOdW1iZXJzIHdpdGggRQorZGRiYXMxMzAgdG9TY2kgIjAuMDAwRS0xIiAgLT4gJzAuMDAwMCcKK2RkYmFzMTMxIHRvU2NpICIwLjAwMEUtMiIgIC0+ICcwLjAwMDAwJworZGRiYXMxMzIgdG9TY2kgIjAuMDAwRS0zIiAgLT4gJzAuMDAwMDAwJworZGRiYXMxMzMgdG9TY2kgIjAuMDAwRS00IiAgLT4gJzBFLTcnCitkZGJhczEzNCB0b1NjaSAiMC4wMEUtMiIgICAtPiAnMC4wMDAwJworZGRiYXMxMzUgdG9TY2kgIjAuMDBFLTMiICAgLT4gJzAuMDAwMDAnCitkZGJhczEzNiB0b1NjaSAiMC4wMEUtNCIgICAtPiAnMC4wMDAwMDAnCitkZGJhczEzNyB0b1NjaSAiMC4wMEUtNSIgICAtPiAnMEUtNycKK2RkYmFzMTM4IHRvU2NpICIrMEUrOSIgICAgIC0+ICcwRSs5JworZGRiYXMxMzkgdG9TY2kgIi0wRSs5IiAgICAgLT4gJy0wRSs5JworZGRiYXMxNDAgdG9TY2kgIjFFKzkiICAgICAgLT4gJzFFKzknCitkZGJhczE0MSB0b1NjaSAiMWUrMDkiICAgICAtPiAnMUUrOScKK2RkYmFzMTQyIHRvU2NpICIxRSs5MCIgICAgIC0+ICcxRSs5MCcKK2RkYmFzMTQzIHRvU2NpICIrMUUrMDA5IiAgIC0+ICcxRSs5JworZGRiYXMxNDQgdG9TY2kgIjBFKzkiICAgICAgLT4gJzBFKzknCitkZGJhczE0NSB0b1NjaSAiMUUrOSIgICAgICAtPiAnMUUrOScKK2RkYmFzMTQ2IHRvU2NpICIxRSswOSIgICAgIC0+ICcxRSs5JworZGRiYXMxNDcgdG9TY2kgIjFlKzkwIiAgICAgLT4gJzFFKzkwJworZGRiYXMxNDggdG9TY2kgIjFFKzAwOSIgICAgLT4gJzFFKzknCitkZGJhczE0OSB0b1NjaSAiMDAwRSs5IiAgICAtPiAnMEUrOScKK2RkYmFzMTUwIHRvU2NpICIxRTkiICAgICAgIC0+ICcxRSs5JworZGRiYXMxNTEgdG9TY2kgIjFlMDkiICAgICAgLT4gJzFFKzknCitkZGJhczE1MiB0b1NjaSAiMUU5MCIgICAgICAtPiAnMUUrOTAnCitkZGJhczE1MyB0b1NjaSAiMUUwMDkiICAgICAtPiAnMUUrOScKK2RkYmFzMTU0IHRvU2NpICIwRTkiICAgICAgIC0+ICcwRSs5JworZGRiYXMxNTUgdG9TY2kgIjAuMDAwZSswIiAgLT4gJzAuMDAwJworZGRiYXMxNTYgdG9TY2kgIjAuMDAwRS0xIiAgLT4gJzAuMDAwMCcKK2RkYmFzMTU3IHRvU2NpICI0RSs5IiAgICAgIC0+ICc0RSs5JworZGRiYXMxNTggdG9TY2kgIjQ0RSs5IiAgICAgLT4gJzQuNEUrMTAnCitkZGJhczE1OSB0b1NjaSAiMC43M2UtNyIgICAtPiAnNy4zRS04JworZGRiYXMxNjAgdG9TY2kgIjAwRSs5IiAgICAgLT4gJzBFKzknCitkZGJhczE2MSB0b1NjaSAiMDBFLTkiICAgICAtPiAnMEUtOScKK2RkYmFzMTYyIHRvU2NpICIxMEUrOSIgICAgIC0+ICcxLjBFKzEwJworZGRiYXMxNjMgdG9TY2kgIjEwRSswOSIgICAgLT4gJzEuMEUrMTAnCitkZGJhczE2NCB0b1NjaSAiMTBlKzkwIiAgICAtPiAnMS4wRSs5MScKK2RkYmFzMTY1IHRvU2NpICIxMEUrMDA5IiAgIC0+ICcxLjBFKzEwJworZGRiYXMxNjYgdG9TY2kgIjEwMGUrOSIgICAgLT4gJzEuMDBFKzExJworZGRiYXMxNjcgdG9TY2kgIjEwMGUrMDkiICAgLT4gJzEuMDBFKzExJworZGRiYXMxNjggdG9TY2kgIjEwMEUrOTAiICAgLT4gJzEuMDBFKzkyJworZGRiYXMxNjkgdG9TY2kgIjEwMGUrMDA5IiAgLT4gJzEuMDBFKzExJworCitkZGJhczE3MCB0b1NjaSAiMS4yNjUiICAgICAtPiAnMS4yNjUnCitkZGJhczE3MSB0b1NjaSAiMS4yNjVFLTIwIiAtPiAnMS4yNjVFLTIwJworZGRiYXMxNzIgdG9TY2kgIjEuMjY1RS04IiAgLT4gJzEuMjY1RS04JworZGRiYXMxNzMgdG9TY2kgIjEuMjY1RS00IiAgLT4gJzAuMDAwMTI2NScKK2RkYmFzMTc0IHRvU2NpICIxLjI2NUUtMyIgIC0+ICcwLjAwMTI2NScKK2RkYmFzMTc1IHRvU2NpICIxLjI2NUUtMiIgIC0+ICcwLjAxMjY1JworZGRiYXMxNzYgdG9TY2kgIjEuMjY1RS0xIiAgLT4gJzAuMTI2NScKK2RkYmFzMTc3IHRvU2NpICIxLjI2NUUtMCIgIC0+ICcxLjI2NScKK2RkYmFzMTc4IHRvU2NpICIxLjI2NUUrMSIgIC0+ICcxMi42NScKK2RkYmFzMTc5IHRvU2NpICIxLjI2NUUrMiIgIC0+ICcxMjYuNScKK2RkYmFzMTgwIHRvU2NpICIxLjI2NUUrMyIgIC0+ICcxMjY1JworZGRiYXMxODEgdG9TY2kgIjEuMjY1RSs0IiAgLT4gJzEuMjY1RSs0JworZGRiYXMxODIgdG9TY2kgIjEuMjY1RSs4IiAgLT4gJzEuMjY1RSs4JworZGRiYXMxODMgdG9TY2kgIjEuMjY1RSsyMCIgLT4gJzEuMjY1RSsyMCcKKworZGRiYXMxOTAgdG9TY2kgIjEyLjY1IiAgICAgLT4gJzEyLjY1JworZGRiYXMxOTEgdG9TY2kgIjEyLjY1RS0yMCIgLT4gJzEuMjY1RS0xOScKK2RkYmFzMTkyIHRvU2NpICIxMi42NUUtOCIgIC0+ICcxLjI2NUUtNycKK2RkYmFzMTkzIHRvU2NpICIxMi42NUUtNCIgIC0+ICcwLjAwMTI2NScKK2RkYmFzMTk0IHRvU2NpICIxMi42NUUtMyIgIC0+ICcwLjAxMjY1JworZGRiYXMxOTUgdG9TY2kgIjEyLjY1RS0yIiAgLT4gJzAuMTI2NScKK2RkYmFzMTk2IHRvU2NpICIxMi42NUUtMSIgIC0+ICcxLjI2NScKK2RkYmFzMTk3IHRvU2NpICIxMi42NUUtMCIgIC0+ICcxMi42NScKK2RkYmFzMTk4IHRvU2NpICIxMi42NUUrMSIgIC0+ICcxMjYuNScKK2RkYmFzMTk5IHRvU2NpICIxMi42NUUrMiIgIC0+ICcxMjY1JworZGRiYXMyMDAgdG9TY2kgIjEyLjY1RSszIiAgLT4gJzEuMjY1RSs0JworZGRiYXMyMDEgdG9TY2kgIjEyLjY1RSs0IiAgLT4gJzEuMjY1RSs1JworZGRiYXMyMDIgdG9TY2kgIjEyLjY1RSs4IiAgLT4gJzEuMjY1RSs5JworZGRiYXMyMDMgdG9TY2kgIjEyLjY1RSsyMCIgLT4gJzEuMjY1RSsyMScKKworZGRiYXMyMTAgdG9TY2kgIjEyNi41IiAgICAgLT4gJzEyNi41JworZGRiYXMyMTEgdG9TY2kgIjEyNi41RS0yMCIgLT4gJzEuMjY1RS0xOCcKK2RkYmFzMjEyIHRvU2NpICIxMjYuNUUtOCIgIC0+ICcwLjAwMDAwMTI2NScKK2RkYmFzMjEzIHRvU2NpICIxMjYuNUUtNCIgIC0+ICcwLjAxMjY1JworZGRiYXMyMTQgdG9TY2kgIjEyNi41RS0zIiAgLT4gJzAuMTI2NScKK2RkYmFzMjE1IHRvU2NpICIxMjYuNUUtMiIgIC0+ICcxLjI2NScKK2RkYmFzMjE2IHRvU2NpICIxMjYuNUUtMSIgIC0+ICcxMi42NScKK2RkYmFzMjE3IHRvU2NpICIxMjYuNUUtMCIgIC0+ICcxMjYuNScKK2RkYmFzMjE4IHRvU2NpICIxMjYuNUUrMSIgIC0+ICcxMjY1JworZGRiYXMyMTkgdG9TY2kgIjEyNi41RSsyIiAgLT4gJzEuMjY1RSs0JworZGRiYXMyMjAgdG9TY2kgIjEyNi41RSszIiAgLT4gJzEuMjY1RSs1JworZGRiYXMyMjEgdG9TY2kgIjEyNi41RSs0IiAgLT4gJzEuMjY1RSs2JworZGRiYXMyMjIgdG9TY2kgIjEyNi41RSs4IiAgLT4gJzEuMjY1RSsxMCcKK2RkYmFzMjIzIHRvU2NpICIxMjYuNUUrMjAiIC0+ICcxLjI2NUUrMjInCisKK2RkYmFzMjMwIHRvU2NpICIxMjY1IiAgICAgLT4gJzEyNjUnCitkZGJhczIzMSB0b1NjaSAiMTI2NUUtMjAiIC0+ICcxLjI2NUUtMTcnCitkZGJhczIzMiB0b1NjaSAiMTI2NUUtOCIgIC0+ICcwLjAwMDAxMjY1JworZGRiYXMyMzMgdG9TY2kgIjEyNjVFLTQiICAtPiAnMC4xMjY1JworZGRiYXMyMzQgdG9TY2kgIjEyNjVFLTMiICAtPiAnMS4yNjUnCitkZGJhczIzNSB0b1NjaSAiMTI2NUUtMiIgIC0+ICcxMi42NScKK2RkYmFzMjM2IHRvU2NpICIxMjY1RS0xIiAgLT4gJzEyNi41JworZGRiYXMyMzcgdG9TY2kgIjEyNjVFLTAiICAtPiAnMTI2NScKK2RkYmFzMjM4IHRvU2NpICIxMjY1RSsxIiAgLT4gJzEuMjY1RSs0JworZGRiYXMyMzkgdG9TY2kgIjEyNjVFKzIiICAtPiAnMS4yNjVFKzUnCitkZGJhczI0MCB0b1NjaSAiMTI2NUUrMyIgIC0+ICcxLjI2NUUrNicKK2RkYmFzMjQxIHRvU2NpICIxMjY1RSs0IiAgLT4gJzEuMjY1RSs3JworZGRiYXMyNDIgdG9TY2kgIjEyNjVFKzgiICAtPiAnMS4yNjVFKzExJworZGRiYXMyNDMgdG9TY2kgIjEyNjVFKzIwIiAtPiAnMS4yNjVFKzIzJworZGRiYXMyNDQgdG9TY2kgIjEyNjVFLTkiICAtPiAnMC4wMDAwMDEyNjUnCitkZGJhczI0NSB0b1NjaSAiMTI2NUUtMTAiIC0+ICcxLjI2NUUtNycKK2RkYmFzMjQ2IHRvU2NpICIxMjY1RS0xMSIgLT4gJzEuMjY1RS04JworZGRiYXMyNDcgdG9TY2kgIjEyNjVFLTEyIiAtPiAnMS4yNjVFLTknCisKK2RkYmFzMjUwIHRvU2NpICIwLjEyNjUiICAgICAtPiAnMC4xMjY1JworZGRiYXMyNTEgdG9TY2kgIjAuMTI2NUUtMjAiIC0+ICcxLjI2NUUtMjEnCitkZGJhczI1MiB0b1NjaSAiMC4xMjY1RS04IiAgLT4gJzEuMjY1RS05JworZGRiYXMyNTMgdG9TY2kgIjAuMTI2NUUtNCIgIC0+ICcwLjAwMDAxMjY1JworZGRiYXMyNTQgdG9TY2kgIjAuMTI2NUUtMyIgIC0+ICcwLjAwMDEyNjUnCitkZGJhczI1NSB0b1NjaSAiMC4xMjY1RS0yIiAgLT4gJzAuMDAxMjY1JworZGRiYXMyNTYgdG9TY2kgIjAuMTI2NUUtMSIgIC0+ICcwLjAxMjY1JworZGRiYXMyNTcgdG9TY2kgIjAuMTI2NUUtMCIgIC0+ICcwLjEyNjUnCitkZGJhczI1OCB0b1NjaSAiMC4xMjY1RSsxIiAgLT4gJzEuMjY1JworZGRiYXMyNTkgdG9TY2kgIjAuMTI2NUUrMiIgIC0+ICcxMi42NScKK2RkYmFzMjYwIHRvU2NpICIwLjEyNjVFKzMiICAtPiAnMTI2LjUnCitkZGJhczI2MSB0b1NjaSAiMC4xMjY1RSs0IiAgLT4gJzEyNjUnCitkZGJhczI2MiB0b1NjaSAiMC4xMjY1RSs4IiAgLT4gJzEuMjY1RSs3JworZGRiYXMyNjMgdG9TY2kgIjAuMTI2NUUrMjAiIC0+ICcxLjI2NUUrMTknCisKKy0tIHNvbWUgbW9yZSBuZWdhdGl2ZSB6ZXJvcyBbc3lzdGVtYXRpYyB0ZXN0cyBiZWxvd10KK2RkYmFzMjkwIHRvU2NpICItMC4wMDBFLTEiICAtPiAnLTAuMDAwMCcKK2RkYmFzMjkxIHRvU2NpICItMC4wMDBFLTIiICAtPiAnLTAuMDAwMDAnCitkZGJhczI5MiB0b1NjaSAiLTAuMDAwRS0zIiAgLT4gJy0wLjAwMDAwMCcKK2RkYmFzMjkzIHRvU2NpICItMC4wMDBFLTQiICAtPiAnLTBFLTcnCitkZGJhczI5NCB0b1NjaSAiLTAuMDBFLTIiICAgLT4gJy0wLjAwMDAnCitkZGJhczI5NSB0b1NjaSAiLTAuMDBFLTMiICAgLT4gJy0wLjAwMDAwJworZGRiYXMyOTYgdG9TY2kgIi0wLjBFLTIiICAgIC0+ICctMC4wMDAnCitkZGJhczI5NyB0b1NjaSAiLTAuMEUtMyIgICAgLT4gJy0wLjAwMDAnCitkZGJhczI5OCB0b1NjaSAiLTBFLTIiICAgICAgLT4gJy0wLjAwJworZGRiYXMyOTkgdG9TY2kgIi0wRS0zIiAgICAgIC0+ICctMC4wMDAnCisKKy0tIEVuZ2luZWVyaW5nIG5vdGF0aW9uIHRlc3RzCitkZGJhczMwMSAgdG9TY2kgMTBlMTIgIC0+IDEuMEUrMTMKK2RkYmFzMzAyICB0b0VuZyAxMGUxMiAgLT4gMTBFKzEyCitkZGJhczMwMyAgdG9TY2kgMTBlMTEgIC0+IDEuMEUrMTIKK2RkYmFzMzA0ICB0b0VuZyAxMGUxMSAgLT4gMS4wRSsxMgorZGRiYXMzMDUgIHRvU2NpIDEwZTEwICAtPiAxLjBFKzExCitkZGJhczMwNiAgdG9FbmcgMTBlMTAgIC0+IDEwMEUrOQorZGRiYXMzMDcgIHRvU2NpIDEwZTkgICAtPiAxLjBFKzEwCitkZGJhczMwOCAgdG9FbmcgMTBlOSAgIC0+IDEwRSs5CitkZGJhczMwOSAgdG9TY2kgMTBlOCAgIC0+IDEuMEUrOQorZGRiYXMzMTAgIHRvRW5nIDEwZTggICAtPiAxLjBFKzkKK2RkYmFzMzExICB0b1NjaSAxMGU3ICAgLT4gMS4wRSs4CitkZGJhczMxMiAgdG9FbmcgMTBlNyAgIC0+IDEwMEUrNgorZGRiYXMzMTMgIHRvU2NpIDEwZTYgICAtPiAxLjBFKzcKK2RkYmFzMzE0ICB0b0VuZyAxMGU2ICAgLT4gMTBFKzYKK2RkYmFzMzE1ICB0b1NjaSAxMGU1ICAgLT4gMS4wRSs2CitkZGJhczMxNiAgdG9FbmcgMTBlNSAgIC0+IDEuMEUrNgorZGRiYXMzMTcgIHRvU2NpIDEwZTQgICAtPiAxLjBFKzUKK2RkYmFzMzE4ICB0b0VuZyAxMGU0ICAgLT4gMTAwRSszCitkZGJhczMxOSAgdG9TY2kgMTBlMyAgIC0+IDEuMEUrNAorZGRiYXMzMjAgIHRvRW5nIDEwZTMgICAtPiAxMEUrMworZGRiYXMzMjEgIHRvU2NpIDEwZTIgICAtPiAxLjBFKzMKK2RkYmFzMzIyICB0b0VuZyAxMGUyICAgLT4gMS4wRSszCitkZGJhczMyMyAgdG9TY2kgMTBlMSAgIC0+IDEuMEUrMgorZGRiYXMzMjQgIHRvRW5nIDEwZTEgICAtPiAxMDAKK2RkYmFzMzI1ICB0b1NjaSAxMGUwICAgLT4gMTAKK2RkYmFzMzI2ICB0b0VuZyAxMGUwICAgLT4gMTAKK2RkYmFzMzI3ICB0b1NjaSAxMGUtMSAgLT4gMS4wCitkZGJhczMyOCAgdG9FbmcgMTBlLTEgIC0+IDEuMAorZGRiYXMzMjkgIHRvU2NpIDEwZS0yICAtPiAwLjEwCitkZGJhczMzMCAgdG9FbmcgMTBlLTIgIC0+IDAuMTAKK2RkYmFzMzMxICB0b1NjaSAxMGUtMyAgLT4gMC4wMTAKK2RkYmFzMzMyICB0b0VuZyAxMGUtMyAgLT4gMC4wMTAKK2RkYmFzMzMzICB0b1NjaSAxMGUtNCAgLT4gMC4wMDEwCitkZGJhczMzNCAgdG9FbmcgMTBlLTQgIC0+IDAuMDAxMAorZGRiYXMzMzUgIHRvU2NpIDEwZS01ICAtPiAwLjAwMDEwCitkZGJhczMzNiAgdG9FbmcgMTBlLTUgIC0+IDAuMDAwMTAKK2RkYmFzMzM3ICB0b1NjaSAxMGUtNiAgLT4gMC4wMDAwMTAKK2RkYmFzMzM4ICB0b0VuZyAxMGUtNiAgLT4gMC4wMDAwMTAKK2RkYmFzMzM5ICB0b1NjaSAxMGUtNyAgLT4gMC4wMDAwMDEwCitkZGJhczM0MCAgdG9FbmcgMTBlLTcgIC0+IDAuMDAwMDAxMAorZGRiYXMzNDEgIHRvU2NpIDEwZS04ICAtPiAxLjBFLTcKK2RkYmFzMzQyICB0b0VuZyAxMGUtOCAgLT4gMTAwRS05CitkZGJhczM0MyAgdG9TY2kgMTBlLTkgIC0+IDEuMEUtOAorZGRiYXMzNDQgIHRvRW5nIDEwZS05ICAtPiAxMEUtOQorZGRiYXMzNDUgIHRvU2NpIDEwZS0xMCAtPiAxLjBFLTkKK2RkYmFzMzQ2ICB0b0VuZyAxMGUtMTAgLT4gMS4wRS05CitkZGJhczM0NyAgdG9TY2kgMTBlLTExIC0+IDEuMEUtMTAKK2RkYmFzMzQ4ICB0b0VuZyAxMGUtMTEgLT4gMTAwRS0xMgorZGRiYXMzNDkgIHRvU2NpIDEwZS0xMiAtPiAxLjBFLTExCitkZGJhczM1MCAgdG9FbmcgMTBlLTEyIC0+IDEwRS0xMgorZGRiYXMzNTEgIHRvU2NpIDEwZS0xMyAtPiAxLjBFLTEyCitkZGJhczM1MiAgdG9FbmcgMTBlLTEzIC0+IDEuMEUtMTIKKworZGRiYXMzNjEgIHRvU2NpIDdFMTIgIC0+IDdFKzEyCitkZGJhczM2MiAgdG9FbmcgN0UxMiAgLT4gN0UrMTIKK2RkYmFzMzYzICB0b1NjaSA3RTExICAtPiA3RSsxMQorZGRiYXMzNjQgIHRvRW5nIDdFMTEgIC0+IDcwMEUrOQorZGRiYXMzNjUgIHRvU2NpIDdFMTAgIC0+IDdFKzEwCitkZGJhczM2NiAgdG9FbmcgN0UxMCAgLT4gNzBFKzkKK2RkYmFzMzY3ICB0b1NjaSA3RTkgICAtPiA3RSs5CitkZGJhczM2OCAgdG9FbmcgN0U5ICAgLT4gN0UrOQorZGRiYXMzNjkgIHRvU2NpIDdFOCAgIC0+IDdFKzgKK2RkYmFzMzcwICB0b0VuZyA3RTggICAtPiA3MDBFKzYKK2RkYmFzMzcxICB0b1NjaSA3RTcgICAtPiA3RSs3CitkZGJhczM3MiAgdG9FbmcgN0U3ICAgLT4gNzBFKzYKK2RkYmFzMzczICB0b1NjaSA3RTYgICAtPiA3RSs2CitkZGJhczM3NCAgdG9FbmcgN0U2ICAgLT4gN0UrNgorZGRiYXMzNzUgIHRvU2NpIDdFNSAgIC0+IDdFKzUKK2RkYmFzMzc2ICB0b0VuZyA3RTUgICAtPiA3MDBFKzMKK2RkYmFzMzc3ICB0b1NjaSA3RTQgICAtPiA3RSs0CitkZGJhczM3OCAgdG9FbmcgN0U0ICAgLT4gNzBFKzMKK2RkYmFzMzc5ICB0b1NjaSA3RTMgICAtPiA3RSszCitkZGJhczM4MCAgdG9FbmcgN0UzICAgLT4gN0UrMworZGRiYXMzODEgIHRvU2NpIDdFMiAgIC0+IDdFKzIKK2RkYmFzMzgyICB0b0VuZyA3RTIgICAtPiA3MDAKK2RkYmFzMzgzICB0b1NjaSA3RTEgICAtPiA3RSsxCitkZGJhczM4NCAgdG9FbmcgN0UxICAgLT4gNzAKK2RkYmFzMzg1ICB0b1NjaSA3RTAgICAtPiA3CitkZGJhczM4NiAgdG9FbmcgN0UwICAgLT4gNworZGRiYXMzODcgIHRvU2NpIDdFLTEgIC0+IDAuNworZGRiYXMzODggIHRvRW5nIDdFLTEgIC0+IDAuNworZGRiYXMzODkgIHRvU2NpIDdFLTIgIC0+IDAuMDcKK2RkYmFzMzkwICB0b0VuZyA3RS0yICAtPiAwLjA3CitkZGJhczM5MSAgdG9TY2kgN0UtMyAgLT4gMC4wMDcKK2RkYmFzMzkyICB0b0VuZyA3RS0zICAtPiAwLjAwNworZGRiYXMzOTMgIHRvU2NpIDdFLTQgIC0+IDAuMDAwNworZGRiYXMzOTQgIHRvRW5nIDdFLTQgIC0+IDAuMDAwNworZGRiYXMzOTUgIHRvU2NpIDdFLTUgIC0+IDAuMDAwMDcKK2RkYmFzMzk2ICB0b0VuZyA3RS01ICAtPiAwLjAwMDA3CitkZGJhczM5NyAgdG9TY2kgN0UtNiAgLT4gMC4wMDAwMDcKK2RkYmFzMzk4ICB0b0VuZyA3RS02ICAtPiAwLjAwMDAwNworZGRiYXMzOTkgIHRvU2NpIDdFLTcgIC0+IDdFLTcKK2RkYmFzNDAwICB0b0VuZyA3RS03ICAtPiA3MDBFLTkKK2RkYmFzNDAxICB0b1NjaSA3RS04ICAtPiA3RS04CitkZGJhczQwMiAgdG9FbmcgN0UtOCAgLT4gNzBFLTkKK2RkYmFzNDAzICB0b1NjaSA3RS05ICAtPiA3RS05CitkZGJhczQwNCAgdG9FbmcgN0UtOSAgLT4gN0UtOQorZGRiYXM0MDUgIHRvU2NpIDdFLTEwIC0+IDdFLTEwCitkZGJhczQwNiAgdG9FbmcgN0UtMTAgLT4gNzAwRS0xMgorZGRiYXM0MDcgIHRvU2NpIDdFLTExIC0+IDdFLTExCitkZGJhczQwOCAgdG9FbmcgN0UtMTEgLT4gNzBFLTEyCitkZGJhczQwOSAgdG9TY2kgN0UtMTIgLT4gN0UtMTIKK2RkYmFzNDEwICB0b0VuZyA3RS0xMiAtPiA3RS0xMgorZGRiYXM0MTEgIHRvU2NpIDdFLTEzIC0+IDdFLTEzCitkZGJhczQxMiAgdG9FbmcgN0UtMTMgLT4gNzAwRS0xNQorCistLSBFeGFjdHMgcmVtYWluIGV4YWN0IHVwIHRvIHByZWNpc2lvbiAuLgorcm91bmRpbmc6ICBoYWxmX3VwCitkZGJhczQyMCAgdG9TY2kgICAgMTAwIC0+IDEwMAorZGRiYXM0MjEgIHRvRW5nICAgIDEwMCAtPiAxMDAKK2RkYmFzNDIyICB0b1NjaSAgIDEwMDAgLT4gMTAwMAorZGRiYXM0MjMgIHRvRW5nICAgMTAwMCAtPiAxMDAwCitkZGJhczQyNCAgdG9TY2kgIDk5OS45IC0+ICA5OTkuOQorZGRiYXM0MjUgIHRvRW5nICA5OTkuOSAtPiAgOTk5LjkKK2RkYmFzNDI2ICB0b1NjaSAxMDAwLjAgLT4gMTAwMC4wCitkZGJhczQyNyAgdG9FbmcgMTAwMC4wIC0+IDEwMDAuMAorZGRiYXM0MjggIHRvU2NpIDEwMDAuMSAtPiAxMDAwLjEKK2RkYmFzNDI5ICB0b0VuZyAxMDAwLjEgLT4gMTAwMC4xCitkZGJhczQzMCAgdG9TY2kgMTAwMDAgLT4gMTAwMDAKK2RkYmFzNDMxICB0b0VuZyAxMDAwMCAtPiAxMDAwMAorZGRiYXM0MzIgIHRvU2NpIDEwMDAwMCAtPiAxMDAwMDAKK2RkYmFzNDMzICB0b0VuZyAxMDAwMDAgLT4gMTAwMDAwCitkZGJhczQzNCAgdG9TY2kgMTAwMDAwMCAtPiAxMDAwMDAwCitkZGJhczQzNSAgdG9FbmcgMTAwMDAwMCAtPiAxMDAwMDAwCitkZGJhczQzNiAgdG9TY2kgMTAwMDAwMDAgLT4gMTAwMDAwMDAKK2RkYmFzNDM3ICB0b0VuZyAxMDAwMDAwMCAtPiAxMDAwMDAwMAorZGRiYXM0MzggIHRvU2NpIDEwMDAwMDAwMCAtPiAxMDAwMDAwMDAKK2RkYmFzNDM5ICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAKK2RkYmFzNDQwICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMCAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgICBSb3VuZGVkCitkZGJhczQ0MSAgdG9FbmcgMTAwMDAwMDAwMDAwMDAwMDAgICAgLT4gMTAuMDAwMDAwMDAwMDAwMDBFKzE1ICAgUm91bmRlZAorZGRiYXM0NDIgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAxICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSsxNiAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NDMgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDAxICAgIC0+IDEwLjAwMDAwMDAwMDAwMDAwRSsxNSAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NDQgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAzICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSsxNiAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NDUgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDAzICAgIC0+IDEwLjAwMDAwMDAwMDAwMDAwRSsxNSAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NDYgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDA1ICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAxRSsxNiAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NDcgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDA1ICAgIC0+IDEwLjAwMDAwMDAwMDAwMDAxRSsxNSAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NDggIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDA1MCAgIC0+IDEuMDAwMDAwMDAwMDAwMDAxRSsxNyAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NDkgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDA1MCAgIC0+IDEwMC4wMDAwMDAwMDAwMDAxRSsxNSAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NTAgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDA5ICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAxRSsxNiAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NTEgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDA5ICAgIC0+IDEwLjAwMDAwMDAwMDAwMDAxRSsxNSAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NTIgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSsxNyAgIFJvdW5kZWQKK2RkYmFzNDUzICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwMDAgICAtPiAxMDAuMDAwMDAwMDAwMDAwMEUrMTUgICBSb3VuZGVkCitkZGJhczQ1NCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAzICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzE3ICAgUm91bmRlZCBJbmV4YWN0CitkZGJhczQ1NSAgdG9FbmcgMTAwMDAwMDAwMDAwMDAwMDAzICAgLT4gMTAwLjAwMDAwMDAwMDAwMDBFKzE1ICAgUm91bmRlZCBJbmV4YWN0CitkZGJhczQ1NiAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDA1ICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzE3ICAgUm91bmRlZCBJbmV4YWN0CitkZGJhczQ1NyAgdG9FbmcgMTAwMDAwMDAwMDAwMDAwMDA1ICAgLT4gMTAwLjAwMDAwMDAwMDAwMDBFKzE1ICAgUm91bmRlZCBJbmV4YWN0CitkZGJhczQ1OCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDA5ICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzE3ICAgUm91bmRlZCBJbmV4YWN0CitkZGJhczQ1OSAgdG9FbmcgMTAwMDAwMDAwMDAwMDAwMDA5ICAgLT4gMTAwLjAwMDAwMDAwMDAwMDBFKzE1ICAgUm91bmRlZCBJbmV4YWN0CitkZGJhczQ2MCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzE4ICAgUm91bmRlZAorZGRiYXM0NjEgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDAwMDAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSsxOCAgIFJvdW5kZWQKK2RkYmFzNDYyICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMzAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMTggICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDYzICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwMzAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMTggICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDY0ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwNTAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMUUrMTggICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDY1ICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwNTAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMUUrMTggICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDY2ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwOTAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMUUrMTggICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDY3ICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwOTAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMUUrMTggICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDY4ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMTkgICBSb3VuZGVkCitkZGJhczQ2OSAgdG9FbmcgMTAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAuMDAwMDAwMDAwMDAwMDBFKzE4ICAgUm91bmRlZAorZGRiYXM0NzAgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAzMDAwIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSsxOSAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NzEgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDAzMDAwIC0+IDEwLjAwMDAwMDAwMDAwMDAwRSsxOCAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NzIgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDA1MDAwIC0+IDEuMDAwMDAwMDAwMDAwMDAxRSsxOSAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NzMgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDA1MDAwIC0+IDEwLjAwMDAwMDAwMDAwMDAxRSsxOCAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NzQgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDA5MDAwIC0+IDEuMDAwMDAwMDAwMDAwMDAxRSsxOSAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NzUgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDA5MDAwIC0+IDEwLjAwMDAwMDAwMDAwMDAxRSsxOCAgIFJvdW5kZWQgSW5leGFjdAorCistLSBjaGVjayByb3VuZGluZyBtb2RlcyBoZWVkZWQKK3JvdW5kaW5nOiAgY2VpbGluZworZGRic3I0MDEgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTAgICAgLT4gIDEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkZGJzcjQwMiAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NDkgICAtPiAgMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZGRic3I0MDMgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTUwICAgLT4gIDEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNDA0ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU1MSAgIC0+ICAxLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIHVwCitkZGJzcjQwNSAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1MCAgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RkYnNyNDA2ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU0OSAgIC0+ICAxLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjQwNyAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NTAgICAtPiAgMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZGRic3I0MDggIHRvU2NpICAxLjExMTExMTExMTExMjM0NTUxICAgLT4gIDEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgZmxvb3IKK2RkYnNyNDEwICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDUwICAgIC0+ICAxLjExMTExMTExMTExMjM0NSAgUm91bmRlZAorZGRic3I0MTEgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTQ5ICAgLT4gIDEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNDEyICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU1MCAgIC0+ICAxLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjQxMyAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NTEgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX2Rvd24KK2RkYnNyNDE1ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDUwICAgIC0+ICAxLjExMTExMTExMTExMjM0NSAgUm91bmRlZAorZGRic3I0MTYgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTQ5ICAgLT4gIDEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNDE3ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU1MCAgIC0+ICAxLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjQxOCAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ2NTAgICAtPiAgMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZGRic3I0MTkgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTUxICAgLT4gIDEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitkZGJzcjQyMSAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1MCAgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RkYnNyNDIyICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU0OSAgIC0+ICAxLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjQyMyAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NTAgICAtPiAgMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZGRic3I0MjQgIHRvU2NpICAxLjExMTExMTExMTExMjM0NjUwICAgLT4gIDEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNDI1ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU1MSAgIC0+ICAxLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGRvd24KK2RkYnNyNDI2ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDUwICAgIC0+ICAxLjExMTExMTExMTExMjM0NSAgUm91bmRlZAorZGRic3I0MjcgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTQ5ICAgLT4gIDEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNDI4ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU1MCAgIC0+ICAxLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjQyOSAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NTEgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX3VwCitkZGJzcjQzMSAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1MCAgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RkYnNyNDMyICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU0OSAgIC0+ICAxLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjQzMyAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NTAgICAtPiAgMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZGRic3I0MzQgIHRvU2NpICAxLjExMTExMTExMTExMjM0NjUwICAgLT4gIDEuMTExMTExMTExMTEyMzQ3ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNDM1ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU1MSAgIC0+ICAxLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CistLSBuZWdhdGl2ZXMKK3JvdW5kaW5nOiAgY2VpbGluZworZGRic3I1MDEgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTAgICAgLT4gLTEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkZGJzcjUwMiAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NDkgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZGRic3I1MDMgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTUwICAgLT4gLTEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNTA0ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU1MSAgIC0+IC0xLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIHVwCitkZGJzcjUwNSAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1MCAgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RkYnNyNTA2ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU0OSAgIC0+IC0xLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjUwNyAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NTAgICAtPiAtMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZGRic3I1MDggIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTUxICAgLT4gLTEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgZmxvb3IKK2RkYnNyNTEwICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDUwICAgIC0+IC0xLjExMTExMTExMTExMjM0NSAgUm91bmRlZAorZGRic3I1MTEgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTQ5ICAgLT4gLTEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNTEyICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU1MCAgIC0+IC0xLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjUxMyAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NTEgICAtPiAtMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX2Rvd24KK2RkYnNyNTE1ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDUwICAgIC0+IC0xLjExMTExMTExMTExMjM0NSAgUm91bmRlZAorZGRic3I1MTYgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTQ5ICAgLT4gLTEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNTE3ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU1MCAgIC0+IC0xLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjUxOCAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ2NTAgICAtPiAtMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZGRic3I1MTkgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTUxICAgLT4gLTEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitkZGJzcjUyMSAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1MCAgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RkYnNyNTIyICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU0OSAgIC0+IC0xLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjUyMyAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NTAgICAtPiAtMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZGRic3I1MjQgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NjUwICAgLT4gLTEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNTI1ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU1MSAgIC0+IC0xLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGRvd24KK2RkYnNyNTI2ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDUwICAgIC0+IC0xLjExMTExMTExMTExMjM0NSAgUm91bmRlZAorZGRic3I1MjcgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTQ5ICAgLT4gLTEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNTI4ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU1MCAgIC0+IC0xLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjUyOSAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NTEgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX3VwCitkZGJzcjUzMSAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1MCAgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RkYnNyNTMyICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU0OSAgIC0+IC0xLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjUzMyAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NTAgICAtPiAtMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZGRic3I1MzQgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NjUwICAgLT4gLTEuMTExMTExMTExMTEyMzQ3ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNTM1ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU1MSAgIC0+IC0xLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gVGhlICdiYWRkaWVzJyB0ZXN0cyBmcm9tIERpYWdCaWdEZWNpbWFsLCBwbHVzIHNvbWUgbmV3IG9uZXMKK2RkYmFzNTAwIHRvU2NpICcxLi4yJyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MDEgdG9TY2kgJy4nICAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUwMiB0b1NjaSAnLi4nICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTAzIHRvU2NpICcrKzEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MDQgdG9TY2kgJy0tMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUwNSB0b1NjaSAnLSsxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTA2IHRvU2NpICcrLTEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MDcgdG9TY2kgJzEyZScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUwOCB0b1NjaSAnMTJlKysnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTA5IHRvU2NpICcxMmY0JyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MTAgdG9TY2kgJyArMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUxMSB0b1NjaSAnKyAxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTEyIHRvU2NpICcxMiAnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MTMgdG9TY2kgJyArIDEnICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUxNCB0b1NjaSAnIC0gMSAnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTE1IHRvU2NpICd4JyAgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MTYgdG9TY2kgJy0xLScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUxNyB0b1NjaSAnMTItJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTE4IHRvU2NpICczKycgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MTkgdG9TY2kgJycgICAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUyMCB0b1NjaSAnMWUtJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTIxIHRvU2NpICc3ZTk5OTk5YScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MjIgdG9TY2kgJzdlMTIzNTY3ODkweCcgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUyMyB0b1NjaSAnN2UxMjM1Njc4OTAxMngnICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTI0IHRvU2NpICcnICAgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MjUgdG9TY2kgJ2UxMDAnICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUyNiB0b1NjaSAnXHUwZTVhJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTI3IHRvU2NpICdcdTBiNjUnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MjggdG9TY2kgJzEyMyw2NScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUyOSB0b1NjaSAnMS4zNC41JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTMwIHRvU2NpICcuMTIzLjUnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MzEgdG9TY2kgJzAxLjM1LicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUzMiB0b1NjaSAnMDEuMzUtJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTMzIHRvU2NpICcwMDAwLi4nICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MzQgdG9TY2kgJy4wMDAwLicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUzNSB0b1NjaSAnMDAuLjAwJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTM2IHRvU2NpICcxMTFlKjEyMycgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MzcgdG9TY2kgJzExMWUxMjMtJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUzOCB0b1NjaSAnMTExZSsxMisnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTM5IHRvU2NpICcxMTFlMS0zLScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NDAgdG9TY2kgJzExMWUxKjIzJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU0MSB0b1NjaSAnMTExZTFlKzMnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTQyIHRvU2NpICcxZTEuMCcgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NDMgdG9TY2kgJzFlMTIzZScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU0NCB0b1NjaSAndGVuJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTQ1IHRvU2NpICdPTkUnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NDYgdG9TY2kgJzFlLjEnICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU0NyB0b1NjaSAnMWUxLicgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTQ4IHRvU2NpICcxZWUnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NDkgdG9TY2kgJ2UrMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU1MCB0b1NjaSAnMS4yMy40JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTUxIHRvU2NpICcxLjIuMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NTIgdG9TY2kgJzFFKzEuMicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU1MyB0b1NjaSAnMUUrMS4yLjMnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTU0IHRvU2NpICcxRSsrMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NTUgdG9TY2kgJzFFLS0xJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU1NiB0b1NjaSAnMUUrLTEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTU3IHRvU2NpICcxRS0rMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NTggdG9TY2kgJzFFJycxJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU1OSB0b1NjaSAiMUUiIjEiICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTYwIHRvU2NpICIxRSIiIiIiICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorLS0gTmVhci1zcGVjaWFscworZGRiYXM1NjEgdG9TY2kgInFOYU4iICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU2MiB0b1NjaSAiTmFOcSIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTYzIHRvU2NpICJOYU5zIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NjQgdG9TY2kgIkluZmkiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU2NSB0b1NjaSAiSW5maW4iICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTY2IHRvU2NpICJJbmZpbmkiICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NjcgdG9TY2kgIkluZmluaXQiICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU2OCB0b1NjaSAiLUluZmluaXQiICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTY5IHRvU2NpICIwSW5mIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NzAgdG9TY2kgIjlJbmYiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU3MSB0b1NjaSAiLTBJbmYiICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTcyIHRvU2NpICItOUluZiIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NzMgdG9TY2kgIi1zTmEiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU3NCB0b1NjaSAieE5hTiIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTc1IHRvU2NpICIwc05hTiIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorCistLSBzb21lIGJhZGRpZXMgd2l0aCBkb3RzIGFuZCBFcyBhbmQgZG90cyBhbmQgc3BlY2lhbHMKK2RkYmFzNTc2IHRvU2NpICAnZSsxJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTc3IHRvU2NpICAnLmUrMScgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTc4IHRvU2NpICAnKy5lKzEnICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTc5IHRvU2NpICAnLS5lKycgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTgwIHRvU2NpICAnLS5lJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTgxIHRvU2NpICAnRSsxJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTgyIHRvU2NpICAnLkUrMScgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTgzIHRvU2NpICAnKy5FKzEnICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTg0IHRvU2NpICAnLS5FKycgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTg1IHRvU2NpICAnLS5FJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKKworZGRiYXM1ODYgdG9TY2kgICcuTmFOJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1ODcgdG9TY2kgICctLk5hTicgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1ODggdG9TY2kgICcrLnNOYU4nICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1ODkgdG9TY2kgICcrLkluZicgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1OTAgdG9TY2kgICcuSW5maW5pdHknICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorCistLSBaZXJvcworZGRiYXM2MDEgdG9TY2kgMC4wMDAwMDAwMDAgICAgICAgLT4gMEUtOQorZGRiYXM2MDIgdG9TY2kgMC4wMDAwMDAwMCAgICAgICAgLT4gMEUtOAorZGRiYXM2MDMgdG9TY2kgMC4wMDAwMDAwICAgICAgICAgLT4gMEUtNworZGRiYXM2MDQgdG9TY2kgMC4wMDAwMDAgICAgICAgICAgLT4gMC4wMDAwMDAKK2RkYmFzNjA1IHRvU2NpIDAuMDAwMDAgICAgICAgICAgIC0+IDAuMDAwMDAKK2RkYmFzNjA2IHRvU2NpIDAuMDAwMCAgICAgICAgICAgIC0+IDAuMDAwMAorZGRiYXM2MDcgdG9TY2kgMC4wMDAgICAgICAgICAgICAgLT4gMC4wMDAKK2RkYmFzNjA4IHRvU2NpIDAuMDAgICAgICAgICAgICAgIC0+IDAuMDAKK2RkYmFzNjA5IHRvU2NpIDAuMCAgICAgICAgICAgICAgIC0+IDAuMAorZGRiYXM2MTAgdG9TY2kgIC4wICAgICAgICAgICAgICAgLT4gMC4wCitkZGJhczYxMSB0b1NjaSAwLiAgICAgICAgICAgICAgICAtPiAwCitkZGJhczYxMiB0b1NjaSAtLjAgICAgICAgICAgICAgICAtPiAtMC4wCitkZGJhczYxMyB0b1NjaSAtMC4gICAgICAgICAgICAgICAtPiAtMAorZGRiYXM2MTQgdG9TY2kgLTAuMCAgICAgICAgICAgICAgLT4gLTAuMAorZGRiYXM2MTUgdG9TY2kgLTAuMDAgICAgICAgICAgICAgLT4gLTAuMDAKK2RkYmFzNjE2IHRvU2NpIC0wLjAwMCAgICAgICAgICAgIC0+IC0wLjAwMAorZGRiYXM2MTcgdG9TY2kgLTAuMDAwMCAgICAgICAgICAgLT4gLTAuMDAwMAorZGRiYXM2MTggdG9TY2kgLTAuMDAwMDAgICAgICAgICAgLT4gLTAuMDAwMDAKK2RkYmFzNjE5IHRvU2NpIC0wLjAwMDAwMCAgICAgICAgIC0+IC0wLjAwMDAwMAorZGRiYXM2MjAgdG9TY2kgLTAuMDAwMDAwMCAgICAgICAgLT4gLTBFLTcKK2RkYmFzNjIxIHRvU2NpIC0wLjAwMDAwMDAwICAgICAgIC0+IC0wRS04CitkZGJhczYyMiB0b1NjaSAtMC4wMDAwMDAwMDAgICAgICAtPiAtMEUtOQorCitkZGJhczYzMCB0b1NjaSAgMC4wMEUrMCAgICAgICAgICAtPiAwLjAwCitkZGJhczYzMSB0b1NjaSAgMC4wMEUrMSAgICAgICAgICAtPiAwLjAKK2RkYmFzNjMyIHRvU2NpICAwLjAwRSsyICAgICAgICAgIC0+IDAKK2RkYmFzNjMzIHRvU2NpICAwLjAwRSszICAgICAgICAgIC0+IDBFKzEKK2RkYmFzNjM0IHRvU2NpICAwLjAwRSs0ICAgICAgICAgIC0+IDBFKzIKK2RkYmFzNjM1IHRvU2NpICAwLjAwRSs1ICAgICAgICAgIC0+IDBFKzMKK2RkYmFzNjM2IHRvU2NpICAwLjAwRSs2ICAgICAgICAgIC0+IDBFKzQKK2RkYmFzNjM3IHRvU2NpICAwLjAwRSs3ICAgICAgICAgIC0+IDBFKzUKK2RkYmFzNjM4IHRvU2NpICAwLjAwRSs4ICAgICAgICAgIC0+IDBFKzYKK2RkYmFzNjM5IHRvU2NpICAwLjAwRSs5ICAgICAgICAgIC0+IDBFKzcKKworZGRiYXM2NDAgdG9TY2kgIDAuMEUrMCAgICAgICAgICAgLT4gMC4wCitkZGJhczY0MSB0b1NjaSAgMC4wRSsxICAgICAgICAgICAtPiAwCitkZGJhczY0MiB0b1NjaSAgMC4wRSsyICAgICAgICAgICAtPiAwRSsxCitkZGJhczY0MyB0b1NjaSAgMC4wRSszICAgICAgICAgICAtPiAwRSsyCitkZGJhczY0NCB0b1NjaSAgMC4wRSs0ICAgICAgICAgICAtPiAwRSszCitkZGJhczY0NSB0b1NjaSAgMC4wRSs1ICAgICAgICAgICAtPiAwRSs0CitkZGJhczY0NiB0b1NjaSAgMC4wRSs2ICAgICAgICAgICAtPiAwRSs1CitkZGJhczY0NyB0b1NjaSAgMC4wRSs3ICAgICAgICAgICAtPiAwRSs2CitkZGJhczY0OCB0b1NjaSAgMC4wRSs4ICAgICAgICAgICAtPiAwRSs3CitkZGJhczY0OSB0b1NjaSAgMC4wRSs5ICAgICAgICAgICAtPiAwRSs4CisKK2RkYmFzNjUwIHRvU2NpICAwRSswICAgICAgICAgICAgIC0+IDAKK2RkYmFzNjUxIHRvU2NpICAwRSsxICAgICAgICAgICAgIC0+IDBFKzEKK2RkYmFzNjUyIHRvU2NpICAwRSsyICAgICAgICAgICAgIC0+IDBFKzIKK2RkYmFzNjUzIHRvU2NpICAwRSszICAgICAgICAgICAgIC0+IDBFKzMKK2RkYmFzNjU0IHRvU2NpICAwRSs0ICAgICAgICAgICAgIC0+IDBFKzQKK2RkYmFzNjU1IHRvU2NpICAwRSs1ICAgICAgICAgICAgIC0+IDBFKzUKK2RkYmFzNjU2IHRvU2NpICAwRSs2ICAgICAgICAgICAgIC0+IDBFKzYKK2RkYmFzNjU3IHRvU2NpICAwRSs3ICAgICAgICAgICAgIC0+IDBFKzcKK2RkYmFzNjU4IHRvU2NpICAwRSs4ICAgICAgICAgICAgIC0+IDBFKzgKK2RkYmFzNjU5IHRvU2NpICAwRSs5ICAgICAgICAgICAgIC0+IDBFKzkKKworZGRiYXM2NjAgdG9TY2kgIDAuMEUtMCAgICAgICAgICAgLT4gMC4wCitkZGJhczY2MSB0b1NjaSAgMC4wRS0xICAgICAgICAgICAtPiAwLjAwCitkZGJhczY2MiB0b1NjaSAgMC4wRS0yICAgICAgICAgICAtPiAwLjAwMAorZGRiYXM2NjMgdG9TY2kgIDAuMEUtMyAgICAgICAgICAgLT4gMC4wMDAwCitkZGJhczY2NCB0b1NjaSAgMC4wRS00ICAgICAgICAgICAtPiAwLjAwMDAwCitkZGJhczY2NSB0b1NjaSAgMC4wRS01ICAgICAgICAgICAtPiAwLjAwMDAwMAorZGRiYXM2NjYgdG9TY2kgIDAuMEUtNiAgICAgICAgICAgLT4gMEUtNworZGRiYXM2NjcgdG9TY2kgIDAuMEUtNyAgICAgICAgICAgLT4gMEUtOAorZGRiYXM2NjggdG9TY2kgIDAuMEUtOCAgICAgICAgICAgLT4gMEUtOQorZGRiYXM2NjkgdG9TY2kgIDAuMEUtOSAgICAgICAgICAgLT4gMEUtMTAKKworZGRiYXM2NzAgdG9TY2kgIDAuMDBFLTAgICAgICAgICAgLT4gMC4wMAorZGRiYXM2NzEgdG9TY2kgIDAuMDBFLTEgICAgICAgICAgLT4gMC4wMDAKK2RkYmFzNjcyIHRvU2NpICAwLjAwRS0yICAgICAgICAgIC0+IDAuMDAwMAorZGRiYXM2NzMgdG9TY2kgIDAuMDBFLTMgICAgICAgICAgLT4gMC4wMDAwMAorZGRiYXM2NzQgdG9TY2kgIDAuMDBFLTQgICAgICAgICAgLT4gMC4wMDAwMDAKK2RkYmFzNjc1IHRvU2NpICAwLjAwRS01ICAgICAgICAgIC0+IDBFLTcKK2RkYmFzNjc2IHRvU2NpICAwLjAwRS02ICAgICAgICAgIC0+IDBFLTgKK2RkYmFzNjc3IHRvU2NpICAwLjAwRS03ICAgICAgICAgIC0+IDBFLTkKK2RkYmFzNjc4IHRvU2NpICAwLjAwRS04ICAgICAgICAgIC0+IDBFLTEwCitkZGJhczY3OSB0b1NjaSAgMC4wMEUtOSAgICAgICAgICAtPiAwRS0xMQorCitkZGJhczY4MCB0b1NjaSAgMDAwMDAwLiAgICAgICAgICAtPiAgMAorZGRiYXM2ODEgdG9TY2kgICAwMDAwMC4gICAgICAgICAgLT4gIDAKK2RkYmFzNjgyIHRvU2NpICAgIDAwMDAuICAgICAgICAgIC0+ICAwCitkZGJhczY4MyB0b1NjaSAgICAgMDAwLiAgICAgICAgICAtPiAgMAorZGRiYXM2ODQgdG9TY2kgICAgICAwMC4gICAgICAgICAgLT4gIDAKK2RkYmFzNjg1IHRvU2NpICAgICAgIDAuICAgICAgICAgIC0+ICAwCitkZGJhczY4NiB0b1NjaSAgKzAwMDAwLiAgICAgICAgICAtPiAgMAorZGRiYXM2ODcgdG9TY2kgIC0wMDAwMC4gICAgICAgICAgLT4gLTAKK2RkYmFzNjg4IHRvU2NpICArMC4gICAgICAgICAgICAgIC0+ICAwCitkZGJhczY4OSB0b1NjaSAgLTAuICAgICAgICAgICAgICAtPiAtMAorCistLSBTcGVjaWFscworZGRiYXM3MDAgdG9TY2kgIk5hTiIgICAgICAgICAgICAgLT4gTmFOCitkZGJhczcwMSB0b1NjaSAibmFuIiAgICAgICAgICAgICAtPiBOYU4KK2RkYmFzNzAyIHRvU2NpICJuQW4iICAgICAgICAgICAgIC0+IE5hTgorZGRiYXM3MDMgdG9TY2kgIk5BTiIgICAgICAgICAgICAgLT4gTmFOCitkZGJhczcwNCB0b1NjaSAiK05hTiIgICAgICAgICAgICAtPiBOYU4KK2RkYmFzNzA1IHRvU2NpICIrbmFuIiAgICAgICAgICAgIC0+IE5hTgorZGRiYXM3MDYgdG9TY2kgIituQW4iICAgICAgICAgICAgLT4gTmFOCitkZGJhczcwNyB0b1NjaSAiK05BTiIgICAgICAgICAgICAtPiBOYU4KK2RkYmFzNzA4IHRvU2NpICItTmFOIiAgICAgICAgICAgIC0+IC1OYU4KK2RkYmFzNzA5IHRvU2NpICItbmFuIiAgICAgICAgICAgIC0+IC1OYU4KK2RkYmFzNzEwIHRvU2NpICItbkFuIiAgICAgICAgICAgIC0+IC1OYU4KK2RkYmFzNzExIHRvU2NpICItTkFOIiAgICAgICAgICAgIC0+IC1OYU4KK2RkYmFzNzEyIHRvU2NpICdOYU4wJyAgICAgICAgICAgIC0+IE5hTgorZGRiYXM3MTMgdG9TY2kgJ05hTjEnICAgICAgICAgICAgLT4gTmFOMQorZGRiYXM3MTQgdG9TY2kgJ05hTjEyJyAgICAgICAgICAgLT4gTmFOMTIKK2RkYmFzNzE1IHRvU2NpICdOYU4xMjMnICAgICAgICAgIC0+IE5hTjEyMworZGRiYXM3MTYgdG9TY2kgJ05hTjEyMzQnICAgICAgICAgLT4gTmFOMTIzNAorZGRiYXM3MTcgdG9TY2kgJ05hTjAxJyAgICAgICAgICAgLT4gTmFOMQorZGRiYXM3MTggdG9TY2kgJ05hTjAxMicgICAgICAgICAgLT4gTmFOMTIKK2RkYmFzNzE5IHRvU2NpICdOYU4wMTIzJyAgICAgICAgIC0+IE5hTjEyMworZGRiYXM3MjAgdG9TY2kgJ05hTjAxMjM0JyAgICAgICAgLT4gTmFOMTIzNAorZGRiYXM3MjEgdG9TY2kgJ05hTjAwMScgICAgICAgICAgLT4gTmFOMQorZGRiYXM3MjIgdG9TY2kgJ05hTjAwMTInICAgICAgICAgLT4gTmFOMTIKK2RkYmFzNzIzIHRvU2NpICdOYU4wMDEyMycgICAgICAgIC0+IE5hTjEyMworZGRiYXM3MjQgdG9TY2kgJ05hTjAwMTIzNCcgICAgICAgLT4gTmFOMTIzNAorZGRiYXM3MjUgdG9TY2kgJ05hTjEyMzQ1Njc4OTAxMjM0NTYnIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM3MjYgdG9TY2kgJ05hTjEyM2UrMScgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczcyNyB0b1NjaSAnTmFOMTIuNDUnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNzI4IHRvU2NpICdOYU4tMTInICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM3MjkgdG9TY2kgJ05hTisxMicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CisKK2RkYmFzNzMwIHRvU2NpICJzTmFOIiAgICAgICAgICAgIC0+IHNOYU4KK2RkYmFzNzMxIHRvU2NpICJzbmFuIiAgICAgICAgICAgIC0+IHNOYU4KK2RkYmFzNzMyIHRvU2NpICJTbkFuIiAgICAgICAgICAgIC0+IHNOYU4KK2RkYmFzNzMzIHRvU2NpICJTTkFOIiAgICAgICAgICAgIC0+IHNOYU4KK2RkYmFzNzM0IHRvU2NpICIrc05hTiIgICAgICAgICAgIC0+IHNOYU4KK2RkYmFzNzM1IHRvU2NpICIrc25hbiIgICAgICAgICAgIC0+IHNOYU4KK2RkYmFzNzM2IHRvU2NpICIrU25BbiIgICAgICAgICAgIC0+IHNOYU4KK2RkYmFzNzM3IHRvU2NpICIrU05BTiIgICAgICAgICAgIC0+IHNOYU4KK2RkYmFzNzM4IHRvU2NpICItc05hTiIgICAgICAgICAgIC0+IC1zTmFOCitkZGJhczczOSB0b1NjaSAiLXNuYW4iICAgICAgICAgICAtPiAtc05hTgorZGRiYXM3NDAgdG9TY2kgIi1TbkFuIiAgICAgICAgICAgLT4gLXNOYU4KK2RkYmFzNzQxIHRvU2NpICItU05BTiIgICAgICAgICAgIC0+IC1zTmFOCitkZGJhczc0MiB0b1NjaSAnc05hTjAwMDAnICAgICAgICAtPiBzTmFOCitkZGJhczc0MyB0b1NjaSAnc05hTjcnICAgICAgICAgICAtPiBzTmFONworZGRiYXM3NDQgdG9TY2kgJ3NOYU4wMDcyMzQnICAgICAgLT4gc05hTjcyMzQKK2RkYmFzNzQ1IHRvU2NpICdzTmFONzIzNDU2MTIzNDU2Nzg5MCcgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczc0NiB0b1NjaSAnc05hTjcyLjQ1JyAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNzQ3IHRvU2NpICdzTmFOLTcyJyAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorCitkZGJhczc0OCB0b1NjaSAiSW5mIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorZGRiYXM3NDkgdG9TY2kgImluZiIgICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzNzUwIHRvU2NpICJpTmYiICAgICAgICAgICAgIC0+IEluZmluaXR5CitkZGJhczc1MSB0b1NjaSAiSU5GIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorZGRiYXM3NTIgdG9TY2kgIitJbmYiICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzNzUzIHRvU2NpICIraW5mIiAgICAgICAgICAgIC0+IEluZmluaXR5CitkZGJhczc1NCB0b1NjaSAiK2lOZiIgICAgICAgICAgICAtPiBJbmZpbml0eQorZGRiYXM3NTUgdG9TY2kgIitJTkYiICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzNzU2IHRvU2NpICItSW5mIiAgICAgICAgICAgIC0+IC1JbmZpbml0eQorZGRiYXM3NTcgdG9TY2kgIi1pbmYiICAgICAgICAgICAgLT4gLUluZmluaXR5CitkZGJhczc1OCB0b1NjaSAiLWlOZiIgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2RkYmFzNzU5IHRvU2NpICItSU5GIiAgICAgICAgICAgIC0+IC1JbmZpbml0eQorCitkZGJhczc2MCB0b1NjaSAiSW5maW5pdHkiICAgICAgICAtPiBJbmZpbml0eQorZGRiYXM3NjEgdG9TY2kgImluZmluaXR5IiAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzNzYyIHRvU2NpICJpTmZJbkl0WSIgICAgICAgIC0+IEluZmluaXR5CitkZGJhczc2MyB0b1NjaSAiSU5GSU5JVFkiICAgICAgICAtPiBJbmZpbml0eQorZGRiYXM3NjQgdG9TY2kgIitJbmZpbml0eSIgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzNzY1IHRvU2NpICIraW5maW5pdHkiICAgICAgIC0+IEluZmluaXR5CitkZGJhczc2NiB0b1NjaSAiK2lOZkluSXRZIiAgICAgICAtPiBJbmZpbml0eQorZGRiYXM3NjcgdG9TY2kgIitJTkZJTklUWSIgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzNzY4IHRvU2NpICItSW5maW5pdHkiICAgICAgIC0+IC1JbmZpbml0eQorZGRiYXM3NjkgdG9TY2kgIi1pbmZpbml0eSIgICAgICAgLT4gLUluZmluaXR5CitkZGJhczc3MCB0b1NjaSAiLWlOZkluSXRZIiAgICAgICAtPiAtSW5maW5pdHkKK2RkYmFzNzcxIHRvU2NpICItSU5GSU5JVFkiICAgICAgIC0+IC1JbmZpbml0eQorCistLSBTcGVjaWFscyBhbmQgemVyb3MgZm9yIHRvRW5nCitkZGJhc3Q3NzIgdG9FbmcgIk5hTiIgICAgICAgICAgICAgIC0+IE5hTgorZGRiYXN0NzczIHRvRW5nICItSW5maW5pdHkiICAgICAgICAtPiAtSW5maW5pdHkKK2RkYmFzdDc3NCB0b0VuZyAiLXNOYU4iICAgICAgICAgICAgLT4gLXNOYU4KK2RkYmFzdDc3NSB0b0VuZyAiLU5hTiIgICAgICAgICAgICAgLT4gLU5hTgorZGRiYXN0Nzc2IHRvRW5nICIrSW5maW5pdHkiICAgICAgICAtPiBJbmZpbml0eQorZGRiYXN0Nzc4IHRvRW5nICIrc05hTiIgICAgICAgICAgICAtPiBzTmFOCitkZGJhc3Q3NzkgdG9FbmcgIitOYU4iICAgICAgICAgICAgIC0+IE5hTgorZGRiYXN0NzgwIHRvRW5nICJJTkZJTklUWSIgICAgICAgICAtPiBJbmZpbml0eQorZGRiYXN0NzgxIHRvRW5nICJTTkFOIiAgICAgICAgICAgICAtPiBzTmFOCitkZGJhc3Q3ODIgdG9FbmcgIk5BTiIgICAgICAgICAgICAgIC0+IE5hTgorZGRiYXN0NzgzIHRvRW5nICJpbmZpbml0eSIgICAgICAgICAtPiBJbmZpbml0eQorZGRiYXN0Nzg0IHRvRW5nICJzbmFuIiAgICAgICAgICAgICAtPiBzTmFOCitkZGJhc3Q3ODUgdG9FbmcgIm5hbiIgICAgICAgICAgICAgIC0+IE5hTgorZGRiYXN0Nzg2IHRvRW5nICJJbkZJTklUWSIgICAgICAgICAtPiBJbmZpbml0eQorZGRiYXN0Nzg3IHRvRW5nICJTbkFOIiAgICAgICAgICAgICAtPiBzTmFOCitkZGJhc3Q3ODggdG9FbmcgIm5BTiIgICAgICAgICAgICAgIC0+IE5hTgorZGRiYXN0Nzg5IHRvRW5nICJpTmZpbml0eSIgICAgICAgICAtPiBJbmZpbml0eQorZGRiYXN0NzkwIHRvRW5nICJzTmFuIiAgICAgICAgICAgICAtPiBzTmFOCitkZGJhc3Q3OTEgdG9FbmcgIk5hbiIgICAgICAgICAgICAgIC0+IE5hTgorZGRiYXN0NzkyIHRvRW5nICJJbmZpbml0eSIgICAgICAgICAtPiBJbmZpbml0eQorZGRiYXN0NzkzIHRvRW5nICJzTmFOIiAgICAgICAgICAgICAtPiBzTmFOCisKKy0tIFplcm8gdG9FbmcsIGV0Yy4KK2RkYmFzdDgwMCB0b0VuZyAwZSsxICAgICAgICAgICAgICAtPiAiMC4wMEUrMyIgIC0tIGRvYyBleGFtcGxlCisKK2RkYmFzdDgwMSB0b0VuZyAwLjAwMDAwMDAwMCAgICAgICAtPiAwRS05CitkZGJhc3Q4MDIgdG9FbmcgMC4wMDAwMDAwMCAgICAgICAgLT4gMC4wMEUtNgorZGRiYXN0ODAzIHRvRW5nIDAuMDAwMDAwMCAgICAgICAgIC0+IDAuMEUtNgorZGRiYXN0ODA0IHRvRW5nIDAuMDAwMDAwICAgICAgICAgIC0+IDAuMDAwMDAwCitkZGJhc3Q4MDUgdG9FbmcgMC4wMDAwMCAgICAgICAgICAgLT4gMC4wMDAwMAorZGRiYXN0ODA2IHRvRW5nIDAuMDAwMCAgICAgICAgICAgIC0+IDAuMDAwMAorZGRiYXN0ODA3IHRvRW5nIDAuMDAwICAgICAgICAgICAgIC0+IDAuMDAwCitkZGJhc3Q4MDggdG9FbmcgMC4wMCAgICAgICAgICAgICAgLT4gMC4wMAorZGRiYXN0ODA5IHRvRW5nIDAuMCAgICAgICAgICAgICAgIC0+IDAuMAorZGRiYXN0ODEwIHRvRW5nICAuMCAgICAgICAgICAgICAgIC0+IDAuMAorZGRiYXN0ODExIHRvRW5nIDAuICAgICAgICAgICAgICAgIC0+IDAKK2RkYmFzdDgxMiB0b0VuZyAtLjAgICAgICAgICAgICAgICAtPiAtMC4wCitkZGJhc3Q4MTMgdG9FbmcgLTAuICAgICAgICAgICAgICAgLT4gLTAKK2RkYmFzdDgxNCB0b0VuZyAtMC4wICAgICAgICAgICAgICAtPiAtMC4wCitkZGJhc3Q4MTUgdG9FbmcgLTAuMDAgICAgICAgICAgICAgLT4gLTAuMDAKK2RkYmFzdDgxNiB0b0VuZyAtMC4wMDAgICAgICAgICAgICAtPiAtMC4wMDAKK2RkYmFzdDgxNyB0b0VuZyAtMC4wMDAwICAgICAgICAgICAtPiAtMC4wMDAwCitkZGJhc3Q4MTggdG9FbmcgLTAuMDAwMDAgICAgICAgICAgLT4gLTAuMDAwMDAKK2RkYmFzdDgxOSB0b0VuZyAtMC4wMDAwMDAgICAgICAgICAtPiAtMC4wMDAwMDAKK2RkYmFzdDgyMCB0b0VuZyAtMC4wMDAwMDAwICAgICAgICAtPiAtMC4wRS02CitkZGJhc3Q4MjEgdG9FbmcgLTAuMDAwMDAwMDAgICAgICAgLT4gLTAuMDBFLTYKK2RkYmFzdDgyMiB0b0VuZyAtMC4wMDAwMDAwMDAgICAgICAtPiAtMEUtOQorCitkZGJhc3Q4MzAgdG9FbmcgIDAuMDBFKzAgICAgICAgICAgLT4gMC4wMAorZGRiYXN0ODMxIHRvRW5nICAwLjAwRSsxICAgICAgICAgIC0+IDAuMAorZGRiYXN0ODMyIHRvRW5nICAwLjAwRSsyICAgICAgICAgIC0+IDAKK2RkYmFzdDgzMyB0b0VuZyAgMC4wMEUrMyAgICAgICAgICAtPiAwLjAwRSszCitkZGJhc3Q4MzQgdG9FbmcgIDAuMDBFKzQgICAgICAgICAgLT4gMC4wRSszCitkZGJhc3Q4MzUgdG9FbmcgIDAuMDBFKzUgICAgICAgICAgLT4gMEUrMworZGRiYXN0ODM2IHRvRW5nICAwLjAwRSs2ICAgICAgICAgIC0+IDAuMDBFKzYKK2RkYmFzdDgzNyB0b0VuZyAgMC4wMEUrNyAgICAgICAgICAtPiAwLjBFKzYKK2RkYmFzdDgzOCB0b0VuZyAgMC4wMEUrOCAgICAgICAgICAtPiAwRSs2CitkZGJhc3Q4MzkgdG9FbmcgIDAuMDBFKzkgICAgICAgICAgLT4gMC4wMEUrOQorCitkZGJhc3Q4NDAgdG9FbmcgIDAuMEUrMCAgICAgICAgICAgLT4gMC4wCitkZGJhc3Q4NDEgdG9FbmcgIDAuMEUrMSAgICAgICAgICAgLT4gMAorZGRiYXN0ODQyIHRvRW5nICAwLjBFKzIgICAgICAgICAgIC0+IDAuMDBFKzMKK2RkYmFzdDg0MyB0b0VuZyAgMC4wRSszICAgICAgICAgICAtPiAwLjBFKzMKK2RkYmFzdDg0NCB0b0VuZyAgMC4wRSs0ICAgICAgICAgICAtPiAwRSszCitkZGJhc3Q4NDUgdG9FbmcgIDAuMEUrNSAgICAgICAgICAgLT4gMC4wMEUrNgorZGRiYXN0ODQ2IHRvRW5nICAwLjBFKzYgICAgICAgICAgIC0+IDAuMEUrNgorZGRiYXN0ODQ3IHRvRW5nICAwLjBFKzcgICAgICAgICAgIC0+IDBFKzYKK2RkYmFzdDg0OCB0b0VuZyAgMC4wRSs4ICAgICAgICAgICAtPiAwLjAwRSs5CitkZGJhc3Q4NDkgdG9FbmcgIDAuMEUrOSAgICAgICAgICAgLT4gMC4wRSs5CisKK2RkYmFzdDg1MCB0b0VuZyAgMEUrMCAgICAgICAgICAgICAtPiAwCitkZGJhc3Q4NTEgdG9FbmcgIDBFKzEgICAgICAgICAgICAgLT4gMC4wMEUrMworZGRiYXN0ODUyIHRvRW5nICAwRSsyICAgICAgICAgICAgIC0+IDAuMEUrMworZGRiYXN0ODUzIHRvRW5nICAwRSszICAgICAgICAgICAgIC0+IDBFKzMKK2RkYmFzdDg1NCB0b0VuZyAgMEUrNCAgICAgICAgICAgICAtPiAwLjAwRSs2CitkZGJhc3Q4NTUgdG9FbmcgIDBFKzUgICAgICAgICAgICAgLT4gMC4wRSs2CitkZGJhc3Q4NTYgdG9FbmcgIDBFKzYgICAgICAgICAgICAgLT4gMEUrNgorZGRiYXN0ODU3IHRvRW5nICAwRSs3ICAgICAgICAgICAgIC0+IDAuMDBFKzkKK2RkYmFzdDg1OCB0b0VuZyAgMEUrOCAgICAgICAgICAgICAtPiAwLjBFKzkKK2RkYmFzdDg1OSB0b0VuZyAgMEUrOSAgICAgICAgICAgICAtPiAwRSs5CisKK2RkYmFzdDg2MCB0b0VuZyAgMC4wRS0wICAgICAgICAgICAtPiAwLjAKK2RkYmFzdDg2MSB0b0VuZyAgMC4wRS0xICAgICAgICAgICAtPiAwLjAwCitkZGJhc3Q4NjIgdG9FbmcgIDAuMEUtMiAgICAgICAgICAgLT4gMC4wMDAKK2RkYmFzdDg2MyB0b0VuZyAgMC4wRS0zICAgICAgICAgICAtPiAwLjAwMDAKK2RkYmFzdDg2NCB0b0VuZyAgMC4wRS00ICAgICAgICAgICAtPiAwLjAwMDAwCitkZGJhc3Q4NjUgdG9FbmcgIDAuMEUtNSAgICAgICAgICAgLT4gMC4wMDAwMDAKK2RkYmFzdDg2NiB0b0VuZyAgMC4wRS02ICAgICAgICAgICAtPiAwLjBFLTYKK2RkYmFzdDg2NyB0b0VuZyAgMC4wRS03ICAgICAgICAgICAtPiAwLjAwRS02CitkZGJhc3Q4NjggdG9FbmcgIDAuMEUtOCAgICAgICAgICAgLT4gMEUtOQorZGRiYXN0ODY5IHRvRW5nICAwLjBFLTkgICAgICAgICAgIC0+IDAuMEUtOQorCitkZGJhc3Q4NzAgdG9FbmcgIDAuMDBFLTAgICAgICAgICAgLT4gMC4wMAorZGRiYXN0ODcxIHRvRW5nICAwLjAwRS0xICAgICAgICAgIC0+IDAuMDAwCitkZGJhc3Q4NzIgdG9FbmcgIDAuMDBFLTIgICAgICAgICAgLT4gMC4wMDAwCitkZGJhc3Q4NzMgdG9FbmcgIDAuMDBFLTMgICAgICAgICAgLT4gMC4wMDAwMAorZGRiYXN0ODc0IHRvRW5nICAwLjAwRS00ICAgICAgICAgIC0+IDAuMDAwMDAwCitkZGJhc3Q4NzUgdG9FbmcgIDAuMDBFLTUgICAgICAgICAgLT4gMC4wRS02CitkZGJhc3Q4NzYgdG9FbmcgIDAuMDBFLTYgICAgICAgICAgLT4gMC4wMEUtNgorZGRiYXN0ODc3IHRvRW5nICAwLjAwRS03ICAgICAgICAgIC0+IDBFLTkKK2RkYmFzdDg3OCB0b0VuZyAgMC4wMEUtOCAgICAgICAgICAtPiAwLjBFLTkKK2RkYmFzdDg3OSB0b0VuZyAgMC4wMEUtOSAgICAgICAgICAtPiAwLjAwRS05CisKKy0tIGxvbmcgaW5wdXQgc3RyaW5ncworZGRiYXM4MDEgdG9zY2kgJzAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkZGJhczgwMiB0b3NjaSAnMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkZGJhczgwMyB0b3NjaSAnMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZGRiYXM4MDQgdG9zY2kgJzAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkZGJhczgwNSB0b3NjaSAnMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkZGJhczgwNiB0b3NjaSAnMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZGRiYXM4MDcgdG9zY2kgJzAwMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkZGJhczgwOCB0b3NjaSAnMDAwMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkZGJhczgwOSB0b3NjaSAnMDAwMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZGRiYXM4MTAgdG9zY2kgJzAwMDAwMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CisKK2RkYmFzODExIHRvc2NpICcwLjEyMzQ1Njc4OTAxMjM0NTYnIC0+IDAuMTIzNDU2Nzg5MDEyMzQ1NgorZGRiYXM4MTIgdG9zY2kgJzAuMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDAuMDEyMzQ1Njc4OTAxMjM0NTYKK2RkYmFzODEzIHRvc2NpICcwLjAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMC4wMDEyMzQ1Njc4OTAxMjM0NTYKK2RkYmFzODE0IHRvc2NpICcwLjAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDAuMDAwMTIzNDU2Nzg5MDEyMzQ1NgorZGRiYXM4MTUgdG9zY2kgJzAuMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDAuMDAwMDEyMzQ1Njc4OTAxMjM0NTYKK2RkYmFzODE2IHRvc2NpICcwLjAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMC4wMDAwMDEyMzQ1Njc4OTAxMjM0NTYKK2RkYmFzODE3IHRvc2NpICcwLjAwMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEuMjM0NTY3ODkwMTIzNDU2RS03CitkZGJhczgxOCB0b3NjaSAnMC4wMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMS4yMzQ1Njc4OTAxMjM0NTZFLTgKK2RkYmFzODE5IHRvc2NpICcwLjAwMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMS4yMzQ1Njc4OTAxMjM0NTZFLTkKK2RkYmFzODIwIHRvc2NpICcwLjAwMDAwMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEuMjM0NTY3ODkwMTIzNDU2RS0xMAorCitkZGJhczgyMSB0b3NjaSAnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnIC0+IDEuMjM0NTY3ODkwMTIzNDU3RSsxOSBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzODIyIHRvc2NpICcxMjM0NTY3ODkwMTIzNDU2Nzg5MDEnIC0+IDEuMjM0NTY3ODkwMTIzNDU3RSsyMCBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzODIzIHRvc2NpICcxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyJyAtPiAxLjIzNDU2Nzg5MDEyMzQ1N0UrMjEgSW5leGFjdCBSb3VuZGVkCitkZGJhczgyNCB0b3NjaSAnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMnIC0+IDEuMjM0NTY3ODkwMTIzNDU3RSsyMiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzODI1IHRvc2NpICcxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQnIC0+IDEuMjM0NTY3ODkwMTIzNDU3RSsyMyBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzODI2IHRvc2NpICcxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1JyAtPiAxLjIzNDU2Nzg5MDEyMzQ1N0UrMjQgSW5leGFjdCBSb3VuZGVkCitkZGJhczgyNyB0b3NjaSAnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEuMjM0NTY3ODkwMTIzNDU3RSsyNSBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzODI4IHRvc2NpICcxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1NjcnIC0+IDEuMjM0NTY3ODkwMTIzNDU3RSsyNiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzODI5IHRvc2NpICcxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4JyAtPiAxLjIzNDU2Nzg5MDEyMzQ1N0UrMjcgSW5leGFjdCBSb3VuZGVkCisKKy0tIHN1Ym5vcm1hbHMgYW5kIG92ZXJmbG93cworZGRiYXM5MDYgdG9TY2kgJzk5ZTk5OTk5OTk5OScgICAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MDcgdG9TY2kgJzk5OWU5OTk5OTk5OTknICAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MDggdG9TY2kgJzAuOWUtOTk5OTk5OTk5JyAgICAgLT4gMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmFzOTA5IHRvU2NpICcwLjA5ZS05OTk5OTk5OTknICAgIC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJhczkxMCB0b1NjaSAnMC4xZTEwMDAwMDAwMDAnICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkZGJhczkxMSB0b1NjaSAnMTBlLTEwMDAwMDAwMDAnICAgICAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXM5MTIgdG9TY2kgJzAuOWU5OTk5OTk5OTk5JyAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MTMgdG9TY2kgJzk5ZS05OTk5OTk5OTk5JyAgICAgLT4gMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmFzOTE0IHRvU2NpICcxMTFlOTk5OTk5OTk5OScgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTE1IHRvU2NpICcxMTExZS05OTk5OTk5OTk5JyAgIC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJhczkxNiB0b1NjaSAnMTExMWUtOTk5OTk5OTk5OTknICAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXM5MTcgdG9TY2kgJzdlMTAwMDAwMDAwMCcgICAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorLS0gbmVnYXRpdmVzIHRoZSBzYW1lCitkZGJhczkxOCB0b1NjaSAnLTk5ZTk5OTk5OTk5OScgICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MTkgdG9TY2kgJy05OTllOTk5OTk5OTk5JyAgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTIwIHRvU2NpICctMC45ZS05OTk5OTk5OTknICAgIC0+IC0wRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXM5MjEgdG9TY2kgJy0wLjA5ZS05OTk5OTk5OTknICAgLT4gLTBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJhczkyMiB0b1NjaSAnLTAuMWUxMDAwMDAwMDAwJyAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MjMgdG9TY2kgJy0xMGUtMTAwMDAwMDAwMCcgICAgLT4gLTBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJhczkyNCB0b1NjaSAnLTAuOWU5OTk5OTk5OTk5JyAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MjUgdG9TY2kgJy05OWUtOTk5OTk5OTk5OScgICAgLT4gLTBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJhczkyNiB0b1NjaSAnLTExMWU5OTk5OTk5OTk5JyAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MjcgdG9TY2kgJy0xMTExZS05OTk5OTk5OTk5JyAgLT4gLTBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJhczkyOCB0b1NjaSAnLTExMTFlLTk5OTk5OTk5OTk5JyAtPiAtMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmFzOTI5IHRvU2NpICctN2UxMDAwMDAwMDAwJyAgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG92ZXJmbG93IHJlc3VsdHMgYXQgZGlmZmVyZW50IHJvdW5kaW5nIG1vZGVzCityb3VuZGluZzogIGNlaWxpbmcKK2RkYmFzOTMwIHRvU2NpICAnN2UxMDAwMCcgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkZGJhczkzMSB0b1NjaSAnLTdlMTAwMDAnICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIHVwCitkZGJhczkzMiB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MzMgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgZG93bgorZGRiYXM5MzQgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MzUgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6ICBmbG9vcgorZGRiYXM5MzYgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MzcgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICBoYWxmX3VwCitkZGJhczkzOCB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MzkgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitkZGJhczk0MCB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5NDEgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgaGFsZl9kb3duCitkZGJhczk0MiB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5NDMgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICBoYWxmX2V2ZW4KKworLS0gTm93IGNoZWNrIDg1NC83NTRyIHNvbWUgc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93IHRvIDAKK2RkYmVtNDAwIHRvU2NpICAxLjAwMDBFLTM4MyAgICAgLT4gMS4wMDAwRS0zODMKK2RkYmVtNDAxIHRvU2NpICAwLjFFLTM5NCAgICAgICAgLT4gMUUtMzk1ICAgICAgIFN1Ym5vcm1hbAorZGRiZW00MDIgdG9TY2kgIDAuMTAwMEUtMzk0ICAgICAtPiAxLjAwMEUtMzk1ICAgU3Vibm9ybWFsCitkZGJlbTQwMyB0b1NjaSAgMC4wMTAwRS0zOTQgICAgIC0+IDEuMDBFLTM5NiAgICBTdWJub3JtYWwKK2RkYmVtNDA0IHRvU2NpICAwLjAwMTBFLTM5NCAgICAgLT4gMS4wRS0zOTcgICAgIFN1Ym5vcm1hbAorZGRiZW00MDUgdG9TY2kgIDAuMDAwMUUtMzk0ICAgICAtPiAxRS0zOTggICAgICAgU3Vibm9ybWFsCitkZGJlbTQwNiB0b1NjaSAgMC4wMDAxMEUtMzk0ICAgIC0+IDFFLTM5OCAgICAgU3Vibm9ybWFsIFJvdW5kZWQKK2RkYmVtNDA3IHRvU2NpICAwLjAwMDEzRS0zOTQgICAgLT4gMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MDggdG9TY2kgIDAuMDAwMTVFLTM5NCAgICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQwOSB0b1NjaSAgMC4wMDAxN0UtMzk0ICAgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDEwIHRvU2NpICAwLjAwMDIzRS0zOTQgICAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MTEgdG9TY2kgIDAuMDAwMjVFLTM5NCAgICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQxMiB0b1NjaSAgMC4wMDAyN0UtMzk0ICAgIC0+IDNFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDEzIHRvU2NpICAwLjAwMDE0OUUtMzk0ICAgLT4gMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MTQgdG9TY2kgIDAuMDAwMTUwRS0zOTQgICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQxNSB0b1NjaSAgMC4wMDAxNTFFLTM5NCAgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDE2IHRvU2NpICAwLjAwMDI0OUUtMzk0ICAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MTcgdG9TY2kgIDAuMDAwMjUwRS0zOTQgICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQxOCB0b1NjaSAgMC4wMDAyNTFFLTM5NCAgIC0+IDNFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDE5IHRvU2NpICAwLjAwMDA5RS0zOTQgICAgLT4gMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MjAgdG9TY2kgIDAuMDAwMDVFLTM5NCAgICAtPiAwRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmVtNDIxIHRvU2NpICAwLjAwMDAzRS0zOTQgICAgLT4gMEUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJlbTQyMiB0b1NjaSAgMC4wMDAwMDlFLTM5NCAgIC0+IDBFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiZW00MjMgdG9TY2kgIDAuMDAwMDA1RS0zOTQgICAtPiAwRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmVtNDI0IHRvU2NpICAwLjAwMDAwM0UtMzk0ICAgLT4gMEUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK2RkYmVtNDI1IHRvU2NpICAwLjAwMTA0OUUtMzk0ICAgLT4gMS4wRS0zOTcgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MjYgdG9TY2kgIDAuMDAxMDUwRS0zOTQgICAtPiAxLjBFLTM5NyAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQyNyB0b1NjaSAgMC4wMDEwNTFFLTM5NCAgIC0+IDEuMUUtMzk3ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDI4IHRvU2NpICAwLjAwMTE0OUUtMzk0ICAgLT4gMS4xRS0zOTcgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MjkgdG9TY2kgIDAuMDAxMTUwRS0zOTQgICAtPiAxLjJFLTM5NyAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQzMCB0b1NjaSAgMC4wMDExNTFFLTM5NCAgIC0+IDEuMkUtMzk3ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZGRiZW00MzIgdG9TY2kgIDAuMDEwMDQ5RS0zOTQgICAtPiAxLjAwRS0zOTYgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQzMyB0b1NjaSAgMC4wMTAwNTBFLTM5NCAgIC0+IDEuMDBFLTM5NiAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDM0IHRvU2NpICAwLjAxMDA1MUUtMzk0ICAgLT4gMS4wMUUtMzk2ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MzUgdG9TY2kgIDAuMDEwMTQ5RS0zOTQgICAtPiAxLjAxRS0zOTYgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQzNiB0b1NjaSAgMC4wMTAxNTBFLTM5NCAgIC0+IDEuMDJFLTM5NiAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDM3IHRvU2NpICAwLjAxMDE1MUUtMzk0ICAgLT4gMS4wMkUtMzk2ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkZGJlbTQ0MCB0b1NjaSAgMC4xMDEwM0UtMzk0ICAgIC0+IDEuMDEwRS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDQxIHRvU2NpICAwLjEwMTA1RS0zOTQgICAgLT4gMS4wMTBFLTM5NSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00NDIgdG9TY2kgIDAuMTAxMDdFLTM5NCAgICAtPiAxLjAxMUUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQ0MyB0b1NjaSAgMC4xMDExM0UtMzk0ICAgIC0+IDEuMDExRS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDQ0IHRvU2NpICAwLjEwMTE1RS0zOTQgICAgLT4gMS4wMTJFLTM5NSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00NDUgdG9TY2kgIDAuMTAxMTdFLTM5NCAgICAtPiAxLjAxMkUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RkYmVtNDUwIHRvU2NpICAxLjEwNzMwRS0zOTUgICAtPiAxLjEwN0UtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQ1MSB0b1NjaSAgMS4xMDc1MEUtMzk1ICAgLT4gMS4xMDhFLTM5NSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00NTIgdG9TY2kgIDEuMTA3NzBFLTM5NSAgIC0+IDEuMTA4RS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDUzIHRvU2NpICAxLjEwODMwRS0zOTUgICAtPiAxLjEwOEUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQ1NCB0b1NjaSAgMS4xMDg1MEUtMzk1ICAgLT4gMS4xMDhFLTM5NSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00NTUgdG9TY2kgIDEuMTA4NzBFLTM5NSAgIC0+IDEuMTA5RS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbWFrZSBzdXJlIHNpZ24gT0sKK2RkYmVtNDU2IHRvU2NpICAtMC4xMDEwM0UtMzk0ICAgLT4gLTEuMDEwRS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDU3IHRvU2NpICAtMC4xMDEwNUUtMzk0ICAgLT4gLTEuMDEwRS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDU4IHRvU2NpICAtMC4xMDEwN0UtMzk0ICAgLT4gLTEuMDExRS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDU5IHRvU2NpICAtMC4xMDExM0UtMzk0ICAgLT4gLTEuMDExRS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDYwIHRvU2NpICAtMC4xMDExNUUtMzk0ICAgLT4gLTEuMDEyRS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDYxIHRvU2NpICAtMC4xMDExN0UtMzk0ICAgLT4gLTEuMDEyRS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gJzk5OXMnIGNhc2VzCitkZGJlbTQ2NCB0b1NjaSAgOTk5OTk5RS0zOTUgICAgICAgICAtPiA5Ljk5OTk5RS0zOTAgU3Vibm9ybWFsCitkZGJlbTQ2NSB0b1NjaSAgOTk5OTkuMEUtMzk0ICAgICAgICAtPiA5Ljk5OTkwRS0zOTAgU3Vibm9ybWFsCitkZGJlbTQ2NiB0b1NjaSAgOTk5OTkuRS0zOTQgICAgICAgICAtPiA5Ljk5OTlFLTM5MCAgU3Vibm9ybWFsCitkZGJlbTQ2NyB0b1NjaSAgOTk5OS45RS0zOTQgICAgICAgICAtPiA5Ljk5OTlFLTM5MSAgU3Vibm9ybWFsCitkZGJlbTQ2OCB0b1NjaSAgOTk5Ljk5RS0zOTQgICAgICAgICAtPiA5Ljk5OTlFLTM5MiAgU3Vibm9ybWFsCitkZGJlbTQ2OSB0b1NjaSAgOTkuOTk5RS0zOTQgICAgICAgICAtPiA5Ljk5OTlFLTM5MyAgU3Vibm9ybWFsCitkZGJlbTQ3MCB0b1NjaSAgOS45OTk5RS0zOTQgICAgICAgICAtPiA5Ljk5OTlFLTM5NCAgU3Vibm9ybWFsCitkZGJlbTQ3MSB0b1NjaSAgMC45OTk5OUUtMzk0ICAgICAgICAtPiAxLjAwMDBFLTM5NCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00NzIgdG9TY2kgIDAuMDk5OTk5RS0zOTQgICAgICAgLT4gMS4wMDBFLTM5NSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00NzMgdG9TY2kgIDAuMDA5OTk5OUUtMzk0ICAgICAgLT4gMS4wMEUtMzk2ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00NzQgdG9TY2kgIDAuMDAwOTk5OTlFLTM5NCAgICAgLT4gMS4wRS0zOTcgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00NzUgdG9TY2kgIDAuMDAwMDk5OTk5RS0zOTQgICAgLT4gMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00NzYgdG9TY2kgIDAuMDAwMDA5OTk5OUUtMzk0ICAgLT4gMEUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJlbTQ3NyB0b1NjaSAgMC4wMDAwMDA5OTk5OUUtMzk0ICAtPiAwRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmVtNDc4IHRvU2NpICAwLjAwMDAwMDA5OTk5OUUtMzk0IC0+IDBFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSBFeHBvbmVudHMgd2l0aCBpbnNpZ25pZmljYW50IGxlYWRpbmcgemVyb3MKK2RkYmFzMTAwMSB0b1NjaSAgMWU5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGJhczEwMDIgdG9TY2kgIDFlMDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMTAwMyB0b1NjaSAgMWUwMDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMTAwNCB0b1NjaSAgMWUwMDA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGJhczEwMDUgdG9TY2kgIDFlMDAwMDAwMDAwMDAwOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRiYXMxMDA2IHRvU2NpICAxZTAwMDAwMDAwMDAwMTAwMDAwMDAwNyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMTAwNyB0b1NjaSAgMWUtOTk5OTk5OTk5IC0+IDBFLTM5OCAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJhczEwMDggdG9TY2kgIDFlLTA5OTk5OTk5OTkgLT4gMEUtMzk4ICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXMxMDA5IHRvU2NpICAxZS0wMDk5OTk5OTk5OSAtPiAwRS0zOTggICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmFzMTAxMCB0b1NjaSAgMWUtMDAwOTk5OTk5OTk5IC0+IDBFLTM5OCAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJhczEwMTEgdG9TY2kgIDFlLTAwMDAwMDAwMDAwMDk5OTk5OTk5OSAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXMxMDEyIHRvU2NpICAxZS0wMDAwMDAwMDAwMDEwMDAwMDAwMDcgLT4gMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gY2hlY2sgZm9yIGRvdWJsZS1yb3VuZGVkIHN1Ym5vcm1hbHMKK2RkYmFzMTA0MSB0b1NjaSAgICAgMS4xMTExMTExMTExMTUyNDQ0RS0zODQgLT4gIDEuMTExMTExMTExMTE1MjRFLTM4NCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRiYXMxMDQyIHRvU2NpICAgICAxLjExMTExMTExMTExNTI0NDVFLTM4NCAtPiAgMS4xMTExMTExMTExMTUyNEUtMzg0IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkZGJhczEwNDMgdG9TY2kgICAgIDEuMTExMTExMTExMTE1MjQ0NkUtMzg0IC0+ICAxLjExMTExMTExMTExNTI0RS0zODQgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworLS0gY2xhbXBlZCBsYXJnZSBub3JtYWxzCitkZGJhczEwNzAgdG9TY2kgICAxRSszNjkgIC0+ICAxRSszNjkKK2RkYmFzMTA3MSB0b1NjaSAgIDFFKzM3MCAgLT4gIDEuMEUrMzcwICBDbGFtcGVkCitkZGJhczEwNzIgdG9TY2kgICAxRSszNzggIC0+ICAxLjAwMDAwMDAwMEUrMzc4ICBDbGFtcGVkCitkZGJhczEwNzMgdG9TY2kgICAxRSszODQgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMzg0ICBDbGFtcGVkCitkZGJhczEwNzQgdG9TY2kgICAxRSszODUgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworCistLSBjbGFtcGVkIHplcm9zIFtzZWUgYWxzbyBjbGFtcC5kZWNUZXN0XQorZGRiYXMxMDc1IHRvU2NpICAgMGUrMTAwMDAgIC0+ICAwRSszNjkgIENsYW1wZWQKK2RkYmFzMTA3NiB0b1NjaSAgIDBlLTEwMDAwICAtPiAgMEUtMzk4ICBDbGFtcGVkCitkZGJhczEwNzcgdG9TY2kgIC0wZSsxMDAwMCAgLT4gLTBFKzM2OSAgQ2xhbXBlZAorZGRiYXMxMDc4IHRvU2NpICAtMGUtMTAwMDAgIC0+IC0wRS0zOTggIENsYW1wZWQKKworLS0gZXh0cmVtZSB2YWx1ZXMgZnJvbSBuZXh0LXdpZGVyCitkZGJhczExMDEgdG9TY2kgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRiYXMxMTAyIHRvU2NpIC0xRS02MTQzIC0+IC0wRS0zOTggSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZGRiYXMxMTAzIHRvU2NpIC0xRS02MTc2IC0+IC0wRS0zOTggSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZGRiYXMxMTA0IHRvU2NpIC0wIC0+IC0wCitkZGJhczExMDUgdG9TY2kgKzAgLT4gIDAKK2RkYmFzMTEwNiB0b1NjaSArMUUtNjE3NiAtPiAgMEUtMzk4IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2RkYmFzMTEwNyB0b1NjaSArMUUtNjE3MyAtPiAgMEUtMzk4IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2RkYmFzMTEwOCB0b1NjaSArOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDYW5vbmljYWwuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDYW5vbmljYWwuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY5ZTMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENhbm9uaWNhbC5kZWNUZXN0CkBAIC0wLDAgKzEsMzU3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkQ2Fub25pY2FsLmRlY1Rlc3QgLS0gdGVzdCBkZWNEb3VibGUgY2Fub25pY2FsIHJlc3VsdHMgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBmaWxlIHRlc3RzIHRoYXQgY29weSBvcGVyYXRpb25zIGxlYXZlIHVuY2Fub25pY2FsIG9wZXJhbmRzCistLSB1bmNoYW5nZWQsIGFuZCB2aWNlIHZlcnNhCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY0RvdWJsZXMuCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gVW5jYW5vbmljYWwgZGVjbGV0cyBhcmU6IGFiYywgd2hlcmU6CistLSAgIGE9MSwyLDMKKy0tICAgYj02LDcsZSxmCistLSAgIGM9ZSxmCisKKy0tIGFzc2VydCBzb21lIHN0YW5kYXJkIChjYW5vbmljYWwpIHZhbHVlczsgdGhpcyB0ZXN0cyB0aGF0IEZyb21TdHJpbmcKKy0tIHByb2R1Y2VzIGNhbm9uaWNhbCByZXN1bHRzIChtYW55IG1vcmUgaW4gZGVjaW1hbE5OKQorZGRjYW4wMDEgYXBwbHkgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorZGRjYW4wMDIgYXBwbHkgMCAgICAgICAgICAgICAgICAgICAgICAtPiAjMjIzODAwMDAwMDAwMDAwMAorZGRjYW4wMDMgYXBwbHkgMSAgICAgICAgICAgICAgICAgICAgICAtPiAjMjIzODAwMDAwMDAwMDAwMQorZGRjYW4wMDQgYXBwbHkgLTEgICAgICAgICAgICAgICAgICAgICAtPiAjYTIzODAwMDAwMDAwMDAwMQorZGRjYW4wMDUgYXBwbHkgSW5maW5pdHkgICAgICAgICAgICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4wMDYgYXBwbHkgLUluZmluaXR5ICAgICAgICAgICAgICAtPiAjZjgwMDAwMDAwMDAwMDAwMAorZGRjYW4wMDcgYXBwbHkgLU5hTiAgICAgICAgICAgICAgICAgICAtPiAjZmMwMDAwMDAwMDAwMDAwMAorZGRjYW4wMDggYXBwbHkgLXNOYU4gICAgICAgICAgICAgICAgICAtPiAjZmUwMDAwMDAwMDAwMDAwMAorZGRjYW4wMDkgYXBwbHkgTmFOOTk5OTk5OTk5OTk5OTk5ICAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW4wMTAgYXBwbHkgc05hTjk5OTk5OTk5OTk5OTk5OSAgICAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorZGVjYW4wMTEgYXBwbHkgIDk5OTk5OTk5OTk5OTk5OTkgICAgICAtPiAjNmUzOGZmM2ZjZmYzZmNmZgorZGRjYW4wMTIgYXBwbHkgNy41MCAgICAgICAgICAgICAgICAgICAtPiAjMjIzMDAwMDAwMDAwMDNkMAorZGRjYW4wMTMgYXBwbHkgOS45OSAgICAgICAgICAgICAgICAgICAtPiAjMjIzMDAwMDAwMDAwMDBmZgorCistLSBCYXNlIHRlc3RzIGZvciBjYW5vbmljYWwgZW5jb2RpbmdzIChpbmRpdmlkdWFsIG9wZXJhdG9yCistLSBwcm9wYWdhdGlvbiBpcyB0ZXN0ZWQgbGF0ZXIpCisKKy0tIEZpbml0ZXM6IGRlY2xldHMgaW4gY29lZmZpY2llbnQKK2RkY2FuMDIxIGNhbm9uaWNhbCAgIzc3ZmNmZjNmY2ZmM2ZjZmYgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjAyMiBjYW5vbmljYWwgICM3N2ZjZmYzZmNmZjNmY2ZmICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorZGRjYW4wMjMgY2Fub25pY2FsICAjNzdmZmZmM2ZjZmYzZmNmZiAgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKK2RkY2FuMDI0IGNhbm9uaWNhbCAgIzc3ZmZmZjNmY2ZmM2ZjZmYgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjAyNSBjYW5vbmljYWwgICM3N2ZjZmZmZmNmZjNmY2ZmICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorZGRjYW4wMjYgY2Fub25pY2FsICAjNzdmY2ZmZmZjZmYzZmNmZiAgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKK2RkY2FuMDI3IGNhbm9uaWNhbCAgIzc3ZmNmZjNmZmZmM2ZjZmYgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjAyOCBjYW5vbmljYWwgICM3N2ZjZmYzZmZmZjNmY2ZmICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorZGRjYW4wMzAgY2Fub25pY2FsICAjNzdmY2ZmM2ZjZmZmZmNmZiAgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKK2RkY2FuMDMxIGNhbm9uaWNhbCAgIzc3ZmNmZjNmY2ZmZmZjZmYgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjAzMiBjYW5vbmljYWwgICM3N2ZjZmYzZmNmZjNmZmZmICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorZGRjYW4wMzMgY2Fub25pY2FsICAjNzdmY2ZmM2ZjZmYzZmZmZiAgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKK2RkY2FuMDM1IGNhbm9uaWNhbCAgIzc3ZmNmZjNmZGZmM2ZjZmYgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjAzNiBjYW5vbmljYWwgICM3N2ZjZmYzZmVmZjNmY2ZmICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorCistLSBOYU46IGRlY2xldHMgaW4gcGF5bG9hZAorZGRjYW4xMDAgY2Fub25pY2FsICBOYU45OTk5OTk5OTk5OTk5OTkgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTAxIGNhbm9uaWNhbCAgIzdjMDBmZjNmY2ZmM2ZjZmYgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjEwMiBjYW5vbmljYWwgICM3YzAzZmYzZmNmZjNmY2ZmICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMDMgY2Fub25pY2FsICAjN2MwMGZmZmZjZmYzZmNmZiAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTA0IGNhbm9uaWNhbCAgIzdjMDBmZjNmZmZmM2ZjZmYgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjEwNSBjYW5vbmljYWwgICM3YzAwZmYzZmNmZmZmY2ZmICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMDYgY2Fub25pY2FsICAjN2MwMGZmM2ZjZmYzZmZmZiAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTA3IGNhbm9uaWNhbCAgIzdjMDBmZjNmY2ZmM2ZmZmYgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCistLSBOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RkY2FuMTEwIGNhbm9uaWNhbCAgIzdjMDBmZjNmY2ZmM2ZjZmYgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjExMiBjYW5vbmljYWwgICM3ZDAwZmYzZmNmZjNmY2ZmICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMTMgY2Fub25pY2FsICAjN2M4MGZmM2ZjZmYzZmNmZiAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTE0IGNhbm9uaWNhbCAgIzdjNDBmZjNmY2ZmM2ZjZmYgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjExNSBjYW5vbmljYWwgICM3YzIwZmYzZmNmZjNmY2ZmICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMTYgY2Fub25pY2FsICAjN2MxMGZmM2ZjZmYzZmNmZiAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTE3IGNhbm9uaWNhbCAgIzdjMDhmZjNmY2ZmM2ZjZmYgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjExOCBjYW5vbmljYWwgICM3YzA0ZmYzZmNmZjNmY2ZmICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorCistLSBzTmFOOiBkZWNsZXRzIGluIHBheWxvYWQKK2RkY2FuMTIwIGNhbm9uaWNhbCBzTmFOOTk5OTk5OTk5OTk5OTk5IC0+ICM3ZTAwZmYzZmNmZjNmY2ZmCitkZGNhbjEyMSBjYW5vbmljYWwgICM3ZTAwZmYzZmNmZjNmY2ZmICAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMjIgY2Fub25pY2FsICAjN2UwM2ZmM2ZjZmYzZmNmZiAgLT4gIzdlMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTIzIGNhbm9uaWNhbCAgIzdlMDBmZmZmY2ZmM2ZjZmYgIC0+ICM3ZTAwZmYzZmNmZjNmY2ZmCitkZGNhbjEyNCBjYW5vbmljYWwgICM3ZTAwZmYzZmZmZjNmY2ZmICAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMjUgY2Fub25pY2FsICAjN2UwMGZmM2ZjZmZmZmNmZiAgLT4gIzdlMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTI2IGNhbm9uaWNhbCAgIzdlMDBmZjNmY2ZmM2ZmZmYgIC0+ICM3ZTAwZmYzZmNmZjNmY2ZmCitkZGNhbjEyNyBjYW5vbmljYWwgICM3ZTAwZmYzZmNmZjNmZmZmICAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorLS0gc05hTjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMgW2V4Y2x1ZGluZyBzTmFOIHNlbGVjdG9yXQorZGRjYW4xMzAgY2Fub25pY2FsICAjN2UwMGZmM2ZjZmYzZmNmZiAgLT4gIzdlMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTMyIGNhbm9uaWNhbCAgIzdmMDBmZjNmY2ZmM2ZjZmYgIC0+ICM3ZTAwZmYzZmNmZjNmY2ZmCitkZGNhbjEzMyBjYW5vbmljYWwgICM3ZTgwZmYzZmNmZjNmY2ZmICAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMzQgY2Fub25pY2FsICAjN2U0MGZmM2ZjZmYzZmNmZiAgLT4gIzdlMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTM1IGNhbm9uaWNhbCAgIzdlMjBmZjNmY2ZmM2ZjZmYgIC0+ICM3ZTAwZmYzZmNmZjNmY2ZmCitkZGNhbjEzNiBjYW5vbmljYWwgICM3ZTEwZmYzZmNmZjNmY2ZmICAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMzcgY2Fub25pY2FsICAjN2UwOGZmM2ZjZmYzZmNmZiAgLT4gIzdlMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTM4IGNhbm9uaWNhbCAgIzdlMDRmZjNmY2ZmM2ZjZmYgIC0+ICM3ZTAwZmYzZmNmZjNmY2ZmCisKKy0tIEluZjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMKK2RkY2FuMTQwIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE0MSBjYW5vbmljYWwgICM3OTAwMDAwMDAwMDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNDIgY2Fub25pY2FsICAjN2EwMDAwMDAwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTQzIGNhbm9uaWNhbCAgIzc4ODAwMDAwMDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE0NCBjYW5vbmljYWwgICM3ODQwMDAwMDAwMDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNDUgY2Fub25pY2FsICAjNzgyMDAwMDAwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTQ2IGNhbm9uaWNhbCAgIzc4MTAwMDAwMDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE0NyBjYW5vbmljYWwgICM3ODA4MDAwMDAwMDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNDggY2Fub25pY2FsICAjNzgwNDAwMDAwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKKworLS0gSW5mOiBjb2VmZmljaWVudCBjb250aW51YXRpb24gYml0cyAoZmlyc3QsIGxhc3QsIGFuZCBhIGZldyBvdGhlcnMpCitkZGNhbjE1MCBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNTEgY2Fub25pY2FsICAjNzgwMjAwMDAwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTUyIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDEgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE1MyBjYW5vbmljYWwgICM3ODAxMDAwMDAwMDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNTQgY2Fub25pY2FsICAjNzgwMDIwMDAwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTU1IGNhbm9uaWNhbCAgIzc4MDAwODAwMDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE1NiBjYW5vbmljYWwgICM3ODAwMDAyMDAwMDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNTcgY2Fub25pY2FsICAjNzgwMDAwMDQwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTU4IGNhbm9uaWNhbCAgIzc4MDAwMDAwNDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE1OSBjYW5vbmljYWwgICM3ODAwMDAwMDA4MDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNjAgY2Fub25pY2FsICAjNzgwMDAwMDAwMDQwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTYxIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMjAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE2MiBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDA4MDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNjMgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDIwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTY0IGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwNDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE2NSBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDA4ICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorCisKKy0tIE5vdyB0aGUgb3BlcmF0b3JzIC0tIHRyeWluZyB0byBjaGVjayBwYXRocyB0aGF0IG1pZ2h0IGZhaWwgdG8KKy0tIGNhbm9uaWNhbGl6ZSBwcm9wYWdhdGVkIG9wZXJhbmRzCisKKy0tLS0tIEFkZDoKKy0tIEZpbml0ZXM6IG5ldXRyYWwgMAorZGRjYW4yMDIgYWRkICAwRSszODQgIzc3ZmZmZjNmY2ZmM2ZjZmYgICAgICAgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjIwMyBhZGQgICAgICAgICAjNzdmY2ZmZmZjZmYzZmNmZiAwRSszODQgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKKy0tIHRpbnkgemVybworZGRjYW4yMDQgYWRkICAwRS0zOTggIzc3ZmZmZjNmY2ZmM2ZjZmYgICAgICAgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmIFJvdW5kZWQKK2RkY2FuMjA1IGFkZCAgICAgICAgICM3N2ZjZmZmZmNmZjNmY2ZmIDBFLTM5OCAtPiAjNzdmY2ZmM2ZjZmYzZmNmZiBSb3VuZGVkCistLSB0aW55IG5vbiB6ZXJvCitkZGNhbjIwNiBhZGQgLTFFLTM5OCAjNzdmZmZmM2ZjZmYzZmNmZiAgICAgICAgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmIEluZXhhY3QgUm91bmRlZAorZGRjYW4yMDcgYWRkICAgICAgICAgIzc3ZmZmZjNmY2ZmM2ZjZmYgLTFFLTM5OCAtPiAjNzdmY2ZmM2ZjZmYzZmNmZiBJbmV4YWN0IFJvdW5kZWQKKy0tIE5hTjogZGVjbGV0cyBpbiBwYXlsb2FkCitkZGNhbjIxMSBhZGQgIDAgICM3YzAzZmYzZmNmZjNmY2ZmICAgICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMjEyIGFkZCAgICAgIzdjMDNmZjNmY2ZmM2ZjZmYgIDAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorLS0gTmFOOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cyBbZXhjbHVkaW5nIHNOYU4gc2VsZWN0b3JdCitkZGNhbjIxMyBhZGQgIDAgICM3YzQwZmYzZmNmZjNmY2ZmICAgICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMjE0IGFkZCAgICAgIzdjNDBmZjNmY2ZmM2ZjZmYgIDAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorLS0gc05hTjogZGVjbGV0cyBpbiBwYXlsb2FkCitkZGNhbjIxNSBhZGQgIDAgICM3ZTAwZmZmZmNmZjNmY2ZmICAgICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KK2RkY2FuMjE2IGFkZCAgICAgIzdlMDBmZmZmY2ZmM2ZjZmYgIDAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorLS0gc05hTjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMgW2V4Y2x1ZGluZyBzTmFOIHNlbGVjdG9yXQorZGRjYW4yMTcgYWRkICAwICAjN2U4MGZmM2ZjZmYzZmNmZiAgICAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCitkZGNhbjIxOCBhZGQgICAgICM3ZTgwZmYzZmNmZjNmY2ZmICAwICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KKy0tIEluZjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMKK2RkY2FuMjIwIGFkZCAgMCAgIzc4ODAwMDAwMDAwMDAwMDAgICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4yMjEgYWRkICAgICAjNzg4MDAwMDAwMDAwMDAwMCAgMCAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCistLSBJbmY6IGNvZWZmaWNpZW50IGNvbnRpbnVhdGlvbiBiaXRzCitkZGNhbjIyMiBhZGQgIDAgICM3ODAyMDAwMDAwMDAwMDAwICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4yMjMgYWRkICAgICAjNzgwMjAwMDAwMDAwMDAwMCAgMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMjI0IGFkZCAgMCAgIzc4MDAwMDAwMDAwMDAwMDEgICAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjIyNSBhZGQgICAgICM3ODAwMDAwMDAwMDAwMDAxICAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4yMjYgYWRkICAwICAjNzgwMDAwMjAwMDAwMDAwMCAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMjI3IGFkZCAgICAgIzc4MDAwMDIwMDAwMDAwMDAgIDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCisKKy0tLS0tIENsYXNzOiBbZG9lcyBub3QgcmV0dXJuIGVuY29kZWRdCisKKy0tLS0tIENvbXBhcmU6CitkZGNhbjIzMSBjb21wYXJlIC1JbmYgICAxICAgICAtPiAgI2EyMzgwMDAwMDAwMDAwMDEKK2RkY2FuMjMyIGNvbXBhcmUgLUluZiAgLUluZiAgIC0+ICAjMjIzODAwMDAwMDAwMDAwMAorZGRjYW4yMzMgY29tcGFyZSAgMSAgICAtSW5mICAgLT4gICMyMjM4MDAwMDAwMDAwMDAxCitkZGNhbjIzNCBjb21wYXJlICAjN2MwMGZmM2ZmZmYzZmNmZiAtMTAwMCAgLT4gICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjIzNSBjb21wYXJlICAjN2UwMGZmM2ZmZmYzZmNmZiAtMTAwMCAgLT4gICM3YzAwZmYzZmNmZjNmY2ZmICBJbnZhbGlkX29wZXJhdGlvbgorCistLS0tLSBDb21wYXJlU2lnOgorZGRjYW4yNDEgY29tcGFyZXNpZyAtSW5mICAgMSAgICAgLT4gICNhMjM4MDAwMDAwMDAwMDAxCitkZGNhbjI0MiBjb21wYXJlc2lnIC1JbmYgIC1JbmYgICAtPiAgIzIyMzgwMDAwMDAwMDAwMDAKK2RkY2FuMjQzIGNvbXBhcmVzaWcgIDEgICAgLUluZiAgIC0+ICAjMjIzODAwMDAwMDAwMDAwMQorZGRjYW4yNDQgY29tcGFyZXNpZyAgIzdjMDBmZjNmZmZmM2ZjZmYgLTEwMDAgIC0+ICAjN2MwMGZmM2ZjZmYzZmNmZiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY2FuMjQ1IGNvbXBhcmVzaWcgICM3ZTAwZmYzZmZmZjNmY2ZmIC0xMDAwICAtPiAgIzdjMDBmZjNmY2ZmM2ZjZmYgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tLS0tIENvcHk6IFtkb2VzIG5vdCB1c3VhbGx5IGNhbm9uaWNhbGl6ZV0KKy0tIGZpbml0ZXMKK2RkY2FuMjUwIGNvcHkgICM3N2ZmZmYzZmNmZjNmY2ZmICAtPiAjNzdmZmZmM2ZjZmYzZmNmZgorZGRjYW4yNTEgY29weSAgIzc3ZmNmZjNmZGZmM2ZjZmYgIC0+ICM3N2ZjZmYzZmRmZjNmY2ZmCistLSBOYU5zCitkZGNhbjI1MiBjb3B5ICAjN2MwM2ZmM2ZjZmYzZmNmZiAgLT4gIzdjMDNmZjNmY2ZmM2ZjZmYKK2RkY2FuMjUzIGNvcHkgICM3YzAwZmYzZmNmZjNmZmZmICAtPiAjN2MwMGZmM2ZjZmYzZmZmZgorZGRjYW4yNTQgY29weSAgIzdkMDBmZjNmY2ZmM2ZjZmYgIC0+ICM3ZDAwZmYzZmNmZjNmY2ZmCitkZGNhbjI1NSBjb3B5ICAjN2MwNGZmM2ZjZmYzZmNmZiAgLT4gIzdjMDRmZjNmY2ZmM2ZjZmYKKy0tIHNOYU4KK2RkY2FuMjU2IGNvcHkgICM3ZTAwZmYzZmNmZmZmY2ZmICAtPiAjN2UwMGZmM2ZjZmZmZmNmZgorZGRjYW4yNTcgY29weSAgIzdlNDBmZjNmY2ZmM2ZjZmYgIC0+ICM3ZTQwZmYzZmNmZjNmY2ZmCistLSBJbmYKK2RkY2FuMjU4IGNvcHkgICM3YTAwMDAwMDAwMDAwMDAwICAtPiAjN2EwMDAwMDAwMDAwMDAwMAorZGRjYW4yNTkgY29weSAgIzc4MDAyMDAwMDAwMDAwMDAgIC0+ICM3ODAwMjAwMDAwMDAwMDAwCisKKy0tLS0tIENvcHlBYnM6IFtkb2VzIG5vdCB1c3VhbGx5IGNhbm9uaWNhbGl6ZV0KKy0tIGZpbml0ZXMKK2RkY2FuMjYwIGNvcHlhYnMgICNmN2ZmZmYzZmNmZjNmY2ZmICAtPiAjNzdmZmZmM2ZjZmYzZmNmZgorZGRjYW4yNjEgY29weWFicyAgI2Y3ZmNmZjNmZGZmM2ZjZmYgIC0+ICM3N2ZjZmYzZmRmZjNmY2ZmCistLSBOYU5zCitkZGNhbjI2MiBjb3B5YWJzICAjZmMwM2ZmM2ZjZmYzZmNmZiAgLT4gIzdjMDNmZjNmY2ZmM2ZjZmYKK2RkY2FuMjYzIGNvcHlhYnMgICNmYzAwZmYzZmNmZjNmZmZmICAtPiAjN2MwMGZmM2ZjZmYzZmZmZgorZGRjYW4yNjQgY29weWFicyAgI2ZkMDBmZjNmY2ZmM2ZjZmYgIC0+ICM3ZDAwZmYzZmNmZjNmY2ZmCitkZGNhbjI2NSBjb3B5YWJzICAjZmMwNGZmM2ZjZmYzZmNmZiAgLT4gIzdjMDRmZjNmY2ZmM2ZjZmYKKy0tIHNOYU4KK2RkY2FuMjY2IGNvcHlhYnMgICNmZTAwZmYzZmNmZmZmY2ZmICAtPiAjN2UwMGZmM2ZjZmZmZmNmZgorZGRjYW4yNjcgY29weWFicyAgI2ZlNDBmZjNmY2ZmM2ZjZmYgIC0+ICM3ZTQwZmYzZmNmZjNmY2ZmCistLSBJbmYKK2RkY2FuMjY4IGNvcHlhYnMgICNmYTAwMDAwMDAwMDAwMDAwICAtPiAjN2EwMDAwMDAwMDAwMDAwMAorZGRjYW4yNjkgY29weWFicyAgI2Y4MDAyMDAwMDAwMDAwMDAgIC0+ICM3ODAwMjAwMDAwMDAwMDAwCisKKy0tLS0tIENvcHlOZWdhdGU6IFtkb2VzIG5vdCB1c3VhbGx5IGNhbm9uaWNhbGl6ZV0KKy0tIGZpbml0ZXMKK2RkY2FuMjcwIGNvcHluZWdhdGUgICM3N2ZmZmYzZmNmZjNmY2ZmICAtPiAjZjdmZmZmM2ZjZmYzZmNmZgorZGRjYW4yNzEgY29weW5lZ2F0ZSAgIzc3ZmNmZjNmZGZmM2ZjZmYgIC0+ICNmN2ZjZmYzZmRmZjNmY2ZmCistLSBOYU5zCitkZGNhbjI3MiBjb3B5bmVnYXRlICAjN2MwM2ZmM2ZjZmYzZmNmZiAgLT4gI2ZjMDNmZjNmY2ZmM2ZjZmYKK2RkY2FuMjczIGNvcHluZWdhdGUgICM3YzAwZmYzZmNmZjNmZmZmICAtPiAjZmMwMGZmM2ZjZmYzZmZmZgorZGRjYW4yNzQgY29weW5lZ2F0ZSAgIzdkMDBmZjNmY2ZmM2ZjZmYgIC0+ICNmZDAwZmYzZmNmZjNmY2ZmCitkZGNhbjI3NSBjb3B5bmVnYXRlICAjN2MwNGZmM2ZjZmYzZmNmZiAgLT4gI2ZjMDRmZjNmY2ZmM2ZjZmYKKy0tIHNOYU4KK2RkY2FuMjc2IGNvcHluZWdhdGUgICM3ZTAwZmYzZmNmZmZmY2ZmICAtPiAjZmUwMGZmM2ZjZmZmZmNmZgorZGRjYW4yNzcgY29weW5lZ2F0ZSAgIzdlNDBmZjNmY2ZmM2ZjZmYgIC0+ICNmZTQwZmYzZmNmZjNmY2ZmCistLSBJbmYKK2RkY2FuMjc4IGNvcHluZWdhdGUgICM3YTAwMDAwMDAwMDAwMDAwICAtPiAjZmEwMDAwMDAwMDAwMDAwMAorZGRjYW4yNzkgY29weW5lZ2F0ZSAgIzc4MDAyMDAwMDAwMDAwMDAgIC0+ICNmODAwMjAwMDAwMDAwMDAwCisKKy0tLS0tIENvcHlTaWduOiBbZG9lcyBub3QgdXN1YWxseSBjYW5vbmljYWxpemVdCistLSBmaW5pdGVzCitkZGNhbjI4MCBjb3B5c2lnbiAgIzc3ZmZmZjNmY2ZmM2ZjZmYgLTEgLT4gI2Y3ZmZmZjNmY2ZmM2ZjZmYKK2RkY2FuMjgxIGNvcHlzaWduICAjNzdmY2ZmM2ZkZmYzZmNmZiAgMSAtPiAjNzdmY2ZmM2ZkZmYzZmNmZgorLS0gTmFOcworZGRjYW4yODIgY29weXNpZ24gICM3YzAzZmYzZmNmZjNmY2ZmIC0xIC0+ICNmYzAzZmYzZmNmZjNmY2ZmCitkZGNhbjI4MyBjb3B5c2lnbiAgIzdjMDBmZjNmY2ZmM2ZmZmYgIDEgLT4gIzdjMDBmZjNmY2ZmM2ZmZmYKK2RkY2FuMjg0IGNvcHlzaWduICAjN2QwMGZmM2ZjZmYzZmNmZiAtMSAtPiAjZmQwMGZmM2ZjZmYzZmNmZgorZGRjYW4yODUgY29weXNpZ24gICM3YzA0ZmYzZmNmZjNmY2ZmICAxIC0+ICM3YzA0ZmYzZmNmZjNmY2ZmCistLSBzTmFOCitkZGNhbjI4NiBjb3B5c2lnbiAgIzdlMDBmZjNmY2ZmZmZjZmYgLTEgLT4gI2ZlMDBmZjNmY2ZmZmZjZmYKK2RkY2FuMjg3IGNvcHlzaWduICAjN2U0MGZmM2ZjZmYzZmNmZiAgMSAtPiAjN2U0MGZmM2ZjZmYzZmNmZgorLS0gSW5mCitkZGNhbjI4OCBjb3B5c2lnbiAgIzdhMDAwMDAwMDAwMDAwMDAgLTEgLT4gI2ZhMDAwMDAwMDAwMDAwMDAKK2RkY2FuMjg5IGNvcHlzaWduICAjNzgwMDIwMDAwMDAwMDAwMCAgMSAtPiAjNzgwMDIwMDAwMDAwMDAwMAorCistLS0tLSBNdWx0aXBseToKKy0tIEZpbml0ZXM6IG5ldXRyYWwgMAorZGRjYW4zMDIgbXVsdGlwbHkgIDEgICAgICAjNzdmZmZmM2ZjZmYzZmNmZiAgICAgICAgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKK2RkY2FuMzAzIG11bHRpcGx5ICAgICAgICAgIzc3ZmNmZmZmY2ZmM2ZjZmYgIDEgICAgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCistLSBuZWdhdGl2ZQorZGRjYW4zMDYgbXVsdGlwbHkgLTEgICAgICAjNzdmZmZmM2ZjZmYzZmNmZiAgICAgICAgLT4gI2Y3ZmNmZjNmY2ZmM2ZjZmYKK2RkY2FuMzA3IG11bHRpcGx5ICAgICAgICAgIzc3ZmNmZmZmY2ZmM2ZjZmYgLTEgICAgIC0+ICNmN2ZjZmYzZmNmZjNmY2ZmCistLSBOYU46IGRlY2xldHMgaW4gcGF5bG9hZAorZGRjYW4zMTEgbXVsdGlwbHkgIDEgICM3YzAzZmYzZmNmZjNmY2ZmICAgICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMzEyIG11bHRpcGx5ICAgICAjN2MwM2ZmM2ZjZmYzZmNmZiAgMSAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCistLSBOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RkY2FuMzEzIG11bHRpcGx5ICAxICAjN2M0MGZmM2ZjZmYzZmNmZiAgICAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjMxNCBtdWx0aXBseSAgICAgIzdjNDBmZjNmY2ZmM2ZjZmYgIDEgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorLS0gc05hTjogZGVjbGV0cyBpbiBwYXlsb2FkCitkZGNhbjMxNSBtdWx0aXBseSAgMSAgIzdlMDBmZmZmY2ZmM2ZjZmYgICAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorZGRjYW4zMTYgbXVsdGlwbHkgICAgICM3ZTAwZmZmZmNmZjNmY2ZmICAxICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KKy0tIHNOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RkY2FuMzE3IG11bHRpcGx5ICAxICAjN2U4MGZmM2ZjZmYzZmNmZiAgICAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCitkZGNhbjMxOCBtdWx0aXBseSAgICAgIzdlODBmZjNmY2ZmM2ZjZmYgIDEgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorLS0gSW5mOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cworZGRjYW4zMjAgbXVsdGlwbHkgIDEgICM3ODgwMDAwMDAwMDAwMDAwICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMzIxIG11bHRpcGx5ICAgICAjNzg4MDAwMDAwMDAwMDAwMCAgMSAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCistLSBJbmY6IGNvZWZmaWNpZW50IGNvbnRpbnVhdGlvbiBiaXRzCitkZGNhbjMyMiBtdWx0aXBseSAgMSAgIzc4MDIwMDAwMDAwMDAwMDAgICAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjMyMyBtdWx0aXBseSAgICAgIzc4MDIwMDAwMDAwMDAwMDAgIDEgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjMyNCBtdWx0aXBseSAgMSAgIzc4MDAwMDAwMDAwMDAwMDEgICAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjMyNSBtdWx0aXBseSAgICAgIzc4MDAwMDAwMDAwMDAwMDEgIDEgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjMyNiBtdWx0aXBseSAgMSAgIzc4MDAwMDIwMDAwMDAwMDAgICAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjMyNyBtdWx0aXBseSAgICAgIzc4MDAwMDIwMDAwMDAwMDAgIDEgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCisKKy0tLS0tIFF1YW50aXplOgorZGRjYW40MDEgcXVhbnRpemUgICM2ZTM4ZmYzZmZmZjNmY2ZmIDEgICAgLT4gIzZlMzhmZjNmY2ZmM2ZjZmYKK2RkY2FuNDAyIHF1YW50aXplICAjNmUzOGZmM2ZjZmYzZmRmZiAwICAgIC0+ICM2ZTM4ZmYzZmNmZjNmY2ZmCitkZGNhbjQwMyBxdWFudGl6ZSAgIzc4ODAwMDAwMDAwMDAwMDAgSW5mICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW40MDQgcXVhbnRpemUgICM3ODAyMDAwMDAwMDAwMDAwIC1JbmYgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuNDEwIHF1YW50aXplICAjN2MwM2ZmM2ZjZmYzZmNmZiAgMSAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjQxMSBxdWFudGl6ZSAgIzdjMDNmZjNmY2ZmM2ZjZmYgIDEgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW40MTIgcXVhbnRpemUgICM3YzQwZmYzZmNmZjNmY2ZmICAxICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuNDEzIHF1YW50aXplICAjN2M0MGZmM2ZjZmYzZmNmZiAgMSAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjQxNCBxdWFudGl6ZSAgIzdlMDBmZmZmY2ZmM2ZjZmYgIDEgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorZGRjYW40MTUgcXVhbnRpemUgICM3ZTAwZmZmZmNmZjNmY2ZmICAxICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KK2RkY2FuNDE2IHF1YW50aXplICAjN2U4MGZmM2ZjZmYzZmNmZiAgMSAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCitkZGNhbjQxNyBxdWFudGl6ZSAgIzdlODBmZjNmY2ZmM2ZjZmYgIDEgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorCistLS0tLSBTdWJ0cmFjdDoKKy0tIEZpbml0ZXM6IG5ldXRyYWwgMAorZGRjYW41MDIgc3VidHJhY3QgIDBFKzM4NCAjNzdmZmZmM2ZjZmYzZmNmZiAgICAgICAgLT4gI2Y3ZmNmZjNmY2ZmM2ZjZmYKK2RkY2FuNTAzIHN1YnRyYWN0ICAgICAgICAgIzc3ZmNmZmZmY2ZmM2ZjZmYgMEUrMzg0IC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCistLSB0aW55IHplcm8KK2RkY2FuNTA0IHN1YnRyYWN0ICAwRS0zOTggIzc3ZmZmZjNmY2ZmM2ZjZmYgICAgICAgIC0+ICNmN2ZjZmYzZmNmZjNmY2ZmIFJvdW5kZWQKK2RkY2FuNTA1IHN1YnRyYWN0ICAgICAgICAgIzc3ZmNmZmZmY2ZmM2ZjZmYgMEUtMzk4IC0+ICM3N2ZjZmYzZmNmZjNmY2ZmIFJvdW5kZWQKKy0tIHRpbnkgbm9uIHplcm8KK2RkY2FuNTA2IHN1YnRyYWN0IC0xRS0zOTggIzc3ZmZmZjNmY2ZmM2ZjZmYgICAgICAgICAtPiAjZjdmY2ZmM2ZjZmYzZmNmZiBJbmV4YWN0IFJvdW5kZWQKK2RkY2FuNTA3IHN1YnRyYWN0ICAgICAgICAgIzc3ZmZmZjNmY2ZmM2ZjZmYgLTFFLTM5OCAtPiAjNzdmY2ZmM2ZjZmYzZmNmZiBJbmV4YWN0IFJvdW5kZWQKKy0tIE5hTjogZGVjbGV0cyBpbiBwYXlsb2FkCitkZGNhbjUxMSBzdWJ0cmFjdCAgMCAgIzdjMDNmZjNmY2ZmM2ZjZmYgICAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW41MTIgc3VidHJhY3QgICAgICM3YzAzZmYzZmNmZjNmY2ZmICAwICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKKy0tIE5hTjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMgW2V4Y2x1ZGluZyBzTmFOIHNlbGVjdG9yXQorZGRjYW41MTMgc3VidHJhY3QgIDAgICM3YzQwZmYzZmNmZjNmY2ZmICAgICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuNTE0IHN1YnRyYWN0ICAgICAjN2M0MGZmM2ZjZmYzZmNmZiAgMCAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCistLSBzTmFOOiBkZWNsZXRzIGluIHBheWxvYWQKK2RkY2FuNTE1IHN1YnRyYWN0ICAwICAjN2UwMGZmZmZjZmYzZmNmZiAgICAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCitkZGNhbjUxNiBzdWJ0cmFjdCAgICAgIzdlMDBmZmZmY2ZmM2ZjZmYgIDAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorLS0gc05hTjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMgW2V4Y2x1ZGluZyBzTmFOIHNlbGVjdG9yXQorZGRjYW41MTcgc3VidHJhY3QgIDAgICM3ZTgwZmYzZmNmZjNmY2ZmICAgICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KK2RkY2FuNTE4IHN1YnRyYWN0ICAgICAjN2U4MGZmM2ZjZmYzZmNmZiAgMCAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCistLSBJbmY6IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzCitkZGNhbjUyMCBzdWJ0cmFjdCAgMCAgIzc4ODAwMDAwMDAwMDAwMDAgICAgICAtPiAjZjgwMDAwMDAwMDAwMDAwMAorZGRjYW41MjEgc3VidHJhY3QgICAgICM3ODgwMDAwMDAwMDAwMDAwICAwICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKKy0tIEluZjogY29lZmZpY2llbnQgY29udGludWF0aW9uIGJpdHMKK2RkY2FuNTIyIHN1YnRyYWN0ICAwICAjNzgwMjAwMDAwMDAwMDAwMCAgICAgLT4gI2Y4MDAwMDAwMDAwMDAwMDAKK2RkY2FuNTIzIHN1YnRyYWN0ICAgICAjNzgwMjAwMDAwMDAwMDAwMCAgMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuNTI0IHN1YnRyYWN0ICAwICAjNzgwMDAwMDAwMDAwMDAwMSAgICAgLT4gI2Y4MDAwMDAwMDAwMDAwMDAKK2RkY2FuNTI1IHN1YnRyYWN0ICAgICAjNzgwMDAwMDAwMDAwMDAwMSAgMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuNTI2IHN1YnRyYWN0ICAwICAjNzgwMDAwMjAwMDAwMDAwMCAgICAgLT4gI2Y4MDAwMDAwMDAwMDAwMDAKK2RkY2FuNTI3IHN1YnRyYWN0ICAgICAjNzgwMDAwMjAwMDAwMDAwMCAgMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKKworLS0tLS0gVG9JbnRlZ3JhbDoKK2RkY2FuNjAxIHRvaW50ZWdyYWx4ICAjNmUzOGZmM2ZmZmYzZmNmZiAtPiAjNmUzOGZmM2ZjZmYzZmNmZgorZGRjYW42MDIgdG9pbnRlZ3JhbHggICM2ZTM4ZmYzZmNmZjNmZGZmIC0+ICM2ZTM4ZmYzZmNmZjNmY2ZmCitkZGNhbjYwMyB0b2ludGVncmFseCAgIzc4ODAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuNjA0IHRvaW50ZWdyYWx4ICAjNzgwMjAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW42MTAgdG9pbnRlZ3JhbHggICM3YzAzZmYzZmNmZjNmY2ZmIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjYxMSB0b2ludGVncmFseCAgIzdjMDNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuNjEyIHRvaW50ZWdyYWx4ICAjN2M0MGZmM2ZjZmYzZmNmZiAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW42MTMgdG9pbnRlZ3JhbHggICM3YzQwZmYzZmNmZjNmY2ZmIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjYxNCB0b2ludGVncmFseCAgIzdlMDBmZmZmY2ZmM2ZjZmYgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KK2RkY2FuNjE1IHRvaW50ZWdyYWx4ICAjN2UwMGZmZmZjZmYzZmNmZiAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorZGRjYW42MTYgdG9pbnRlZ3JhbHggICM3ZTgwZmYzZmNmZjNmY2ZmIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCitkZGNhbjYxNyB0b2ludGVncmFseCAgIzdlODBmZjNmY2ZmM2ZjZmYgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KKy0tIHVuY2Fub25pY2FsIDM5OTksIDM5Ljk5LCAzLjk5LCAwLjM5OSwgYW5kIG5lZ2F0aXZlcworZGRjYW42MTggdG9pbnRlZ3JhbHggICMyMjM4MDAwMDAwMDAwZmZmIC0+ICMyMjM4MDAwMDAwMDAwY2ZmCitkZGNhbjYxOSB0b2ludGVncmFseCAgIzIyMzAwMDAwMDAwMDBmZmYgLT4gIzIyMzgwMDAwMDAwMDAwNDAgSW5leGFjdCBSb3VuZGVkCitkZGNhbjYyMCB0b2ludGVncmFseCAgIzIyMmMwMDAwMDAwMDBmZmYgLT4gIzIyMzgwMDAwMDAwMDAwMDQgSW5leGFjdCBSb3VuZGVkCitkZGNhbjYyMSB0b2ludGVncmFseCAgIzIyMjgwMDAwMDAwMDBmZmYgLT4gIzIyMzgwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGNhbjYyMiB0b2ludGVncmFseCAgI2EyMzgwMDAwMDAwMDBmZmYgLT4gI2EyMzgwMDAwMDAwMDBjZmYKK2RkY2FuNjIzIHRvaW50ZWdyYWx4ICAjYTIzMDAwMDAwMDAwMGZmZiAtPiAjYTIzODAwMDAwMDAwMDA0MCBJbmV4YWN0IFJvdW5kZWQKK2RkY2FuNjI0IHRvaW50ZWdyYWx4ICAjYTIyYzAwMDAwMDAwMGZmZiAtPiAjYTIzODAwMDAwMDAwMDAwNCBJbmV4YWN0IFJvdW5kZWQKK2RkY2FuNjI1IHRvaW50ZWdyYWx4ICAjYTIyODAwMDAwMDAwMGZmZiAtPiAjYTIzODAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDbGFzcy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENsYXNzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzNGM0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDbGFzcy5kZWNUZXN0CkBAIC0wLDAgKzEsNzYgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRDbGFzcy5kZWNUZXN0IC0tIGRlY0RvdWJsZSBDbGFzcyBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBbTmV3IDIwMDYuMTEuMjddCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworZGRjbGEwMDEgIGNsYXNzICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAtPiArWmVybworZGRjbGEwMDIgIGNsYXNzICAgIDAuMDAgICAgICAgICAgICAgICAgICAgICAtPiArWmVybworZGRjbGEwMDMgIGNsYXNzICAgIDBFKzUgICAgICAgICAgICAgICAgICAgICAtPiArWmVybworZGRjbGEwMDQgIGNsYXNzICAgIDFFLTM5NiAgICAgICAgICAgICAgICAgICAtPiArU3Vibm9ybWFsCitkZGNsYTAwNSAgY2xhc3MgIDAuMUUtMzgzICAgICAgICAgICAgICAgICAgIC0+ICtTdWJub3JtYWwKK2RkY2xhMDA2ICBjbGFzcyAgMC45OTk5OTk5OTk5OTk5OTlFLTM4MyAgICAgLT4gK1N1Ym5vcm1hbAorZGRjbGEwMDcgIGNsYXNzICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtPiArTm9ybWFsCitkZGNsYTAwOCAgY2xhc3MgICAxRS0zODMgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2RkY2xhMDA5ICBjbGFzcyAgIDFFLTEwMCAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorZGRjbGEwMTAgIGNsYXNzICAgMUUtMTAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitkZGNsYTAxMiAgY2xhc3MgICAxRS0xICAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2RkY2xhMDEzICBjbGFzcyAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorZGRjbGEwMTQgIGNsYXNzICAgMi41MCAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitkZGNsYTAxNSAgY2xhc3MgICAxMDAuMTAwICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2RkY2xhMDE2ICBjbGFzcyAgIDFFKzMwICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorZGRjbGEwMTcgIGNsYXNzICAgMUUrMzg0ICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitkZGNsYTAxOCAgY2xhc3MgICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgIC0+ICtOb3JtYWwKK2RkY2xhMDE5ICBjbGFzcyAgIEluZiAgICAgICAgICAgICAgICAgICAgICAgLT4gK0luZmluaXR5CisKK2RkY2xhMDIxICBjbGFzcyAgIC0wICAgICAgICAgICAgICAgICAgICAgICAgLT4gLVplcm8KK2RkY2xhMDIyICBjbGFzcyAgIC0wLjAwICAgICAgICAgICAgICAgICAgICAgLT4gLVplcm8KK2RkY2xhMDIzICBjbGFzcyAgIC0wRSs1ICAgICAgICAgICAgICAgICAgICAgLT4gLVplcm8KK2RkY2xhMDI0ICBjbGFzcyAgIC0xRS0zOTYgICAgICAgICAgICAgICAgICAgLT4gLVN1Ym5vcm1hbAorZGRjbGEwMjUgIGNsYXNzICAtMC4xRS0zODMgICAgICAgICAgICAgICAgICAtPiAtU3Vibm9ybWFsCitkZGNsYTAyNiAgY2xhc3MgIC0wLjk5OTk5OTk5OTk5OTk5OUUtMzgzICAgIC0+IC1TdWJub3JtYWwKK2RkY2xhMDI3ICBjbGFzcyAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgLT4gLU5vcm1hbAorZGRjbGEwMjggIGNsYXNzICAtMUUtMzgzICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitkZGNsYTAyOSAgY2xhc3MgIC0xRS0xMDAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2RkY2xhMDMwICBjbGFzcyAgLTFFLTEwICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorZGRjbGEwMzIgIGNsYXNzICAtMUUtMSAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitkZGNsYTAzMyAgY2xhc3MgIC0xICAgICAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2RkY2xhMDM0ICBjbGFzcyAgLTIuNTAgICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorZGRjbGEwMzUgIGNsYXNzICAtMTAwLjEwMCAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitkZGNsYTAzNiAgY2xhc3MgIC0xRSszMCAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2RkY2xhMDM3ICBjbGFzcyAgLTFFKzM4NCAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorZGRjbGEwMzggIGNsYXNzICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAtPiAtTm9ybWFsCitkZGNsYTAzOSAgY2xhc3MgIC1JbmYgICAgICAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorCitkZGNsYTA0MSAgY2xhc3MgICBOYU4gICAgICAgICAgICAgICAgICAgICAgIC0+IE5hTgorZGRjbGEwNDIgIGNsYXNzICAtTmFOICAgICAgICAgICAgICAgICAgICAgICAtPiBOYU4KK2RkY2xhMDQzICBjbGFzcyAgK05hTjEyMzQ1ICAgICAgICAgICAgICAgICAgLT4gTmFOCitkZGNsYTA0NCAgY2xhc3MgICBzTmFOICAgICAgICAgICAgICAgICAgICAgIC0+IHNOYU4KK2RkY2xhMDQ1ICBjbGFzcyAgLXNOYU4gICAgICAgICAgICAgICAgICAgICAgLT4gc05hTgorZGRjbGEwNDYgIGNsYXNzICArc05hTjEyMzQ1ICAgICAgICAgICAgICAgICAtPiBzTmFOCisKKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29tcGFyZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvbXBhcmUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGViZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvbXBhcmUuZGVjVGVzdApAQCAtMCwwICsxLDc0NCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZENvbXBhcmUuZGVjVGVzdCAtLSBkZWNEb3VibGUgY29tcGFyaXNvbiB0aGF0IGFsbG93cyBxdWlldCBOYU5zICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIE5vdGUgdGhhdCB3ZSBjYW5ub3QgYXNzdW1lIGFkZC9zdWJ0cmFjdCB0ZXN0cyBjb3ZlciBwYXRocyBhZGVxdWF0ZWx5LAorLS0gaGVyZSwgYmVjYXVzZSB0aGUgY29kZSBtaWdodCBiZSBxdWl0ZSBkaWZmZXJlbnQgKGNvbXBhcmlzb24gY2Fubm90CistLSBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHNvIGFjdHVhbCBzdWJ0cmFjdGlvbnMgYXJlIG5vdCBuZWNlc3NhcnkpLgorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY0RvdWJsZXMuCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZGRjb20wMDEgY29tcGFyZSAgLTIgIC0yICAtPiAwCitkZGNvbTAwMiBjb21wYXJlICAtMiAgLTEgIC0+IC0xCitkZGNvbTAwMyBjb21wYXJlICAtMiAgIDAgIC0+IC0xCitkZGNvbTAwNCBjb21wYXJlICAtMiAgIDEgIC0+IC0xCitkZGNvbTAwNSBjb21wYXJlICAtMiAgIDIgIC0+IC0xCitkZGNvbTAwNiBjb21wYXJlICAtMSAgLTIgIC0+IDEKK2RkY29tMDA3IGNvbXBhcmUgIC0xICAtMSAgLT4gMAorZGRjb20wMDggY29tcGFyZSAgLTEgICAwICAtPiAtMQorZGRjb20wMDkgY29tcGFyZSAgLTEgICAxICAtPiAtMQorZGRjb20wMTAgY29tcGFyZSAgLTEgICAyICAtPiAtMQorZGRjb20wMTEgY29tcGFyZSAgIDAgIC0yICAtPiAxCitkZGNvbTAxMiBjb21wYXJlICAgMCAgLTEgIC0+IDEKK2RkY29tMDEzIGNvbXBhcmUgICAwICAgMCAgLT4gMAorZGRjb20wMTQgY29tcGFyZSAgIDAgICAxICAtPiAtMQorZGRjb20wMTUgY29tcGFyZSAgIDAgICAyICAtPiAtMQorZGRjb20wMTYgY29tcGFyZSAgIDEgIC0yICAtPiAxCitkZGNvbTAxNyBjb21wYXJlICAgMSAgLTEgIC0+IDEKK2RkY29tMDE4IGNvbXBhcmUgICAxICAgMCAgLT4gMQorZGRjb20wMTkgY29tcGFyZSAgIDEgICAxICAtPiAwCitkZGNvbTAyMCBjb21wYXJlICAgMSAgIDIgIC0+IC0xCitkZGNvbTAyMSBjb21wYXJlICAgMiAgLTIgIC0+IDEKK2RkY29tMDIyIGNvbXBhcmUgICAyICAtMSAgLT4gMQorZGRjb20wMjMgY29tcGFyZSAgIDIgICAwICAtPiAxCitkZGNvbTAyNSBjb21wYXJlICAgMiAgIDEgIC0+IDEKK2RkY29tMDI2IGNvbXBhcmUgICAyICAgMiAgLT4gMAorCitkZGNvbTAzMSBjb21wYXJlICAtMjAgIC0yMCAgLT4gMAorZGRjb20wMzIgY29tcGFyZSAgLTIwICAtMTAgIC0+IC0xCitkZGNvbTAzMyBjb21wYXJlICAtMjAgICAwMCAgLT4gLTEKK2RkY29tMDM0IGNvbXBhcmUgIC0yMCAgIDEwICAtPiAtMQorZGRjb20wMzUgY29tcGFyZSAgLTIwICAgMjAgIC0+IC0xCitkZGNvbTAzNiBjb21wYXJlICAtMTAgIC0yMCAgLT4gMQorZGRjb20wMzcgY29tcGFyZSAgLTEwICAtMTAgIC0+IDAKK2RkY29tMDM4IGNvbXBhcmUgIC0xMCAgIDAwICAtPiAtMQorZGRjb20wMzkgY29tcGFyZSAgLTEwICAgMTAgIC0+IC0xCitkZGNvbTA0MCBjb21wYXJlICAtMTAgICAyMCAgLT4gLTEKK2RkY29tMDQxIGNvbXBhcmUgICAwMCAgLTIwICAtPiAxCitkZGNvbTA0MiBjb21wYXJlICAgMDAgIC0xMCAgLT4gMQorZGRjb20wNDMgY29tcGFyZSAgIDAwICAgMDAgIC0+IDAKK2RkY29tMDQ0IGNvbXBhcmUgICAwMCAgIDEwICAtPiAtMQorZGRjb20wNDUgY29tcGFyZSAgIDAwICAgMjAgIC0+IC0xCitkZGNvbTA0NiBjb21wYXJlICAgMTAgIC0yMCAgLT4gMQorZGRjb20wNDcgY29tcGFyZSAgIDEwICAtMTAgIC0+IDEKK2RkY29tMDQ4IGNvbXBhcmUgICAxMCAgIDAwICAtPiAxCitkZGNvbTA0OSBjb21wYXJlICAgMTAgICAxMCAgLT4gMAorZGRjb20wNTAgY29tcGFyZSAgIDEwICAgMjAgIC0+IC0xCitkZGNvbTA1MSBjb21wYXJlICAgMjAgIC0yMCAgLT4gMQorZGRjb20wNTIgY29tcGFyZSAgIDIwICAtMTAgIC0+IDEKK2RkY29tMDUzIGNvbXBhcmUgICAyMCAgIDAwICAtPiAxCitkZGNvbTA1NSBjb21wYXJlICAgMjAgICAxMCAgLT4gMQorZGRjb20wNTYgY29tcGFyZSAgIDIwICAgMjAgIC0+IDAKKworZGRjb20wNjEgY29tcGFyZSAgLTIuMCAgLTIuMCAgLT4gMAorZGRjb20wNjIgY29tcGFyZSAgLTIuMCAgLTEuMCAgLT4gLTEKK2RkY29tMDYzIGNvbXBhcmUgIC0yLjAgICAwLjAgIC0+IC0xCitkZGNvbTA2NCBjb21wYXJlICAtMi4wICAgMS4wICAtPiAtMQorZGRjb20wNjUgY29tcGFyZSAgLTIuMCAgIDIuMCAgLT4gLTEKK2RkY29tMDY2IGNvbXBhcmUgIC0xLjAgIC0yLjAgIC0+IDEKK2RkY29tMDY3IGNvbXBhcmUgIC0xLjAgIC0xLjAgIC0+IDAKK2RkY29tMDY4IGNvbXBhcmUgIC0xLjAgICAwLjAgIC0+IC0xCitkZGNvbTA2OSBjb21wYXJlICAtMS4wICAgMS4wICAtPiAtMQorZGRjb20wNzAgY29tcGFyZSAgLTEuMCAgIDIuMCAgLT4gLTEKK2RkY29tMDcxIGNvbXBhcmUgICAwLjAgIC0yLjAgIC0+IDEKK2RkY29tMDcyIGNvbXBhcmUgICAwLjAgIC0xLjAgIC0+IDEKK2RkY29tMDczIGNvbXBhcmUgICAwLjAgICAwLjAgIC0+IDAKK2RkY29tMDc0IGNvbXBhcmUgICAwLjAgICAxLjAgIC0+IC0xCitkZGNvbTA3NSBjb21wYXJlICAgMC4wICAgMi4wICAtPiAtMQorZGRjb20wNzYgY29tcGFyZSAgIDEuMCAgLTIuMCAgLT4gMQorZGRjb20wNzcgY29tcGFyZSAgIDEuMCAgLTEuMCAgLT4gMQorZGRjb20wNzggY29tcGFyZSAgIDEuMCAgIDAuMCAgLT4gMQorZGRjb20wNzkgY29tcGFyZSAgIDEuMCAgIDEuMCAgLT4gMAorZGRjb20wODAgY29tcGFyZSAgIDEuMCAgIDIuMCAgLT4gLTEKK2RkY29tMDgxIGNvbXBhcmUgICAyLjAgIC0yLjAgIC0+IDEKK2RkY29tMDgyIGNvbXBhcmUgICAyLjAgIC0xLjAgIC0+IDEKK2RkY29tMDgzIGNvbXBhcmUgICAyLjAgICAwLjAgIC0+IDEKK2RkY29tMDg1IGNvbXBhcmUgICAyLjAgICAxLjAgIC0+IDEKK2RkY29tMDg2IGNvbXBhcmUgICAyLjAgICAyLjAgIC0+IDAKK2RkY29tMDg3IGNvbXBhcmUgICAxLjAgICAwLjEgIC0+IDEKK2RkY29tMDg4IGNvbXBhcmUgICAwLjEgICAxLjAgIC0+IC0xCisKKy0tIG5vdyBzb21lIGNhc2VzIHdoaWNoIG1pZ2h0IG92ZXJmbG93IGlmIHN1YnRyYWN0IHdlcmUgdXNlZAorZGRjb20wOTUgY29tcGFyZSAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAwCitkZGNvbTA5NiBjb21wYXJlIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0+IC0xCitkZGNvbTA5NyBjb21wYXJlICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0+IDEKK2RkY29tMDk4IGNvbXBhcmUgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLT4gMAorCistLSBzb21lIGRpZmZlcmluZyBsZW5ndGgvZXhwb25lbnQgY2FzZXMKK2RkY29tMTAwIGNvbXBhcmUgICA3LjAgICAgNy4wICAgIC0+IDAKK2RkY29tMTAxIGNvbXBhcmUgICA3LjAgICAgNyAgICAgIC0+IDAKK2RkY29tMTAyIGNvbXBhcmUgICA3ICAgICAgNy4wICAgIC0+IDAKK2RkY29tMTAzIGNvbXBhcmUgICA3RSswICAgNy4wICAgIC0+IDAKK2RkY29tMTA0IGNvbXBhcmUgICA3MEUtMSAgNy4wICAgIC0+IDAKK2RkY29tMTA1IGNvbXBhcmUgICAwLjdFKzEgNyAgICAgIC0+IDAKK2RkY29tMTA2IGNvbXBhcmUgICA3MEUtMSAgNyAgICAgIC0+IDAKK2RkY29tMTA3IGNvbXBhcmUgICA3LjAgICAgN0UrMCAgIC0+IDAKK2RkY29tMTA4IGNvbXBhcmUgICA3LjAgICAgNzBFLTEgIC0+IDAKK2RkY29tMTA5IGNvbXBhcmUgICA3ICAgICAgMC43RSsxIC0+IDAKK2RkY29tMTEwIGNvbXBhcmUgICA3ICAgICAgNzBFLTEgIC0+IDAKKworZGRjb20xMjAgY29tcGFyZSAgIDguMCAgICA3LjAgICAgLT4gMQorZGRjb20xMjEgY29tcGFyZSAgIDguMCAgICA3ICAgICAgLT4gMQorZGRjb20xMjIgY29tcGFyZSAgIDggICAgICA3LjAgICAgLT4gMQorZGRjb20xMjMgY29tcGFyZSAgIDhFKzAgICA3LjAgICAgLT4gMQorZGRjb20xMjQgY29tcGFyZSAgIDgwRS0xICA3LjAgICAgLT4gMQorZGRjb20xMjUgY29tcGFyZSAgIDAuOEUrMSA3ICAgICAgLT4gMQorZGRjb20xMjYgY29tcGFyZSAgIDgwRS0xICA3ICAgICAgLT4gMQorZGRjb20xMjcgY29tcGFyZSAgIDguMCAgICA3RSswICAgLT4gMQorZGRjb20xMjggY29tcGFyZSAgIDguMCAgICA3MEUtMSAgLT4gMQorZGRjb20xMjkgY29tcGFyZSAgIDggICAgICAwLjdFKzEgIC0+IDEKK2RkY29tMTMwIGNvbXBhcmUgICA4ICAgICAgNzBFLTEgIC0+IDEKKworZGRjb20xNDAgY29tcGFyZSAgIDguMCAgICA5LjAgICAgLT4gLTEKK2RkY29tMTQxIGNvbXBhcmUgICA4LjAgICAgOSAgICAgIC0+IC0xCitkZGNvbTE0MiBjb21wYXJlICAgOCAgICAgIDkuMCAgICAtPiAtMQorZGRjb20xNDMgY29tcGFyZSAgIDhFKzAgICA5LjAgICAgLT4gLTEKK2RkY29tMTQ0IGNvbXBhcmUgICA4MEUtMSAgOS4wICAgIC0+IC0xCitkZGNvbTE0NSBjb21wYXJlICAgMC44RSsxIDkgICAgICAtPiAtMQorZGRjb20xNDYgY29tcGFyZSAgIDgwRS0xICA5ICAgICAgLT4gLTEKK2RkY29tMTQ3IGNvbXBhcmUgICA4LjAgICAgOUUrMCAgIC0+IC0xCitkZGNvbTE0OCBjb21wYXJlICAgOC4wICAgIDkwRS0xICAtPiAtMQorZGRjb20xNDkgY29tcGFyZSAgIDggICAgICAwLjlFKzEgLT4gLTEKK2RkY29tMTUwIGNvbXBhcmUgICA4ICAgICAgOTBFLTEgIC0+IC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLSsgLi4KK2RkY29tMjAwIGNvbXBhcmUgIC03LjAgICAgNy4wICAgIC0+IC0xCitkZGNvbTIwMSBjb21wYXJlICAtNy4wICAgIDcgICAgICAtPiAtMQorZGRjb20yMDIgY29tcGFyZSAgLTcgICAgICA3LjAgICAgLT4gLTEKK2RkY29tMjAzIGNvbXBhcmUgIC03RSswICAgNy4wICAgIC0+IC0xCitkZGNvbTIwNCBjb21wYXJlICAtNzBFLTEgIDcuMCAgICAtPiAtMQorZGRjb20yMDUgY29tcGFyZSAgLTAuN0UrMSA3ICAgICAgLT4gLTEKK2RkY29tMjA2IGNvbXBhcmUgIC03MEUtMSAgNyAgICAgIC0+IC0xCitkZGNvbTIwNyBjb21wYXJlICAtNy4wICAgIDdFKzAgICAtPiAtMQorZGRjb20yMDggY29tcGFyZSAgLTcuMCAgICA3MEUtMSAgLT4gLTEKK2RkY29tMjA5IGNvbXBhcmUgIC03ICAgICAgMC43RSsxIC0+IC0xCitkZGNvbTIxMCBjb21wYXJlICAtNyAgICAgIDcwRS0xICAtPiAtMQorCitkZGNvbTIyMCBjb21wYXJlICAtOC4wICAgIDcuMCAgICAtPiAtMQorZGRjb20yMjEgY29tcGFyZSAgLTguMCAgICA3ICAgICAgLT4gLTEKK2RkY29tMjIyIGNvbXBhcmUgIC04ICAgICAgNy4wICAgIC0+IC0xCitkZGNvbTIyMyBjb21wYXJlICAtOEUrMCAgIDcuMCAgICAtPiAtMQorZGRjb20yMjQgY29tcGFyZSAgLTgwRS0xICA3LjAgICAgLT4gLTEKK2RkY29tMjI1IGNvbXBhcmUgIC0wLjhFKzEgNyAgICAgIC0+IC0xCitkZGNvbTIyNiBjb21wYXJlICAtODBFLTEgIDcgICAgICAtPiAtMQorZGRjb20yMjcgY29tcGFyZSAgLTguMCAgICA3RSswICAgLT4gLTEKK2RkY29tMjI4IGNvbXBhcmUgIC04LjAgICAgNzBFLTEgIC0+IC0xCitkZGNvbTIyOSBjb21wYXJlICAtOCAgICAgIDAuN0UrMSAtPiAtMQorZGRjb20yMzAgY29tcGFyZSAgLTggICAgICA3MEUtMSAgLT4gLTEKKworZGRjb20yNDAgY29tcGFyZSAgLTguMCAgICA5LjAgICAgLT4gLTEKK2RkY29tMjQxIGNvbXBhcmUgIC04LjAgICAgOSAgICAgIC0+IC0xCitkZGNvbTI0MiBjb21wYXJlICAtOCAgICAgIDkuMCAgICAtPiAtMQorZGRjb20yNDMgY29tcGFyZSAgLThFKzAgICA5LjAgICAgLT4gLTEKK2RkY29tMjQ0IGNvbXBhcmUgIC04MEUtMSAgOS4wICAgIC0+IC0xCitkZGNvbTI0NSBjb21wYXJlICAtMC44RSsxIDkgICAgICAtPiAtMQorZGRjb20yNDYgY29tcGFyZSAgLTgwRS0xICA5ICAgICAgLT4gLTEKK2RkY29tMjQ3IGNvbXBhcmUgIC04LjAgICAgOUUrMCAgIC0+IC0xCitkZGNvbTI0OCBjb21wYXJlICAtOC4wICAgIDkwRS0xICAtPiAtMQorZGRjb20yNDkgY29tcGFyZSAgLTggICAgICAwLjlFKzEgLT4gLTEKK2RkY29tMjUwIGNvbXBhcmUgIC04ICAgICAgOTBFLTEgIC0+IC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgKy0gLi4KK2RkY29tMzAwIGNvbXBhcmUgICA3LjAgICAgLTcuMCAgICAtPiAxCitkZGNvbTMwMSBjb21wYXJlICAgNy4wICAgIC03ICAgICAgLT4gMQorZGRjb20zMDIgY29tcGFyZSAgIDcgICAgICAtNy4wICAgIC0+IDEKK2RkY29tMzAzIGNvbXBhcmUgICA3RSswICAgLTcuMCAgICAtPiAxCitkZGNvbTMwNCBjb21wYXJlICAgNzBFLTEgIC03LjAgICAgLT4gMQorZGRjb20zMDUgY29tcGFyZSAgIC43RSsxICAtNyAgICAgIC0+IDEKK2RkY29tMzA2IGNvbXBhcmUgICA3MEUtMSAgLTcgICAgICAtPiAxCitkZGNvbTMwNyBjb21wYXJlICAgNy4wICAgIC03RSswICAgLT4gMQorZGRjb20zMDggY29tcGFyZSAgIDcuMCAgICAtNzBFLTEgIC0+IDEKK2RkY29tMzA5IGNvbXBhcmUgICA3ICAgICAgLS43RSsxICAtPiAxCitkZGNvbTMxMCBjb21wYXJlICAgNyAgICAgIC03MEUtMSAgLT4gMQorCitkZGNvbTMyMCBjb21wYXJlICAgOC4wICAgIC03LjAgICAgLT4gMQorZGRjb20zMjEgY29tcGFyZSAgIDguMCAgICAtNyAgICAgIC0+IDEKK2RkY29tMzIyIGNvbXBhcmUgICA4ICAgICAgLTcuMCAgICAtPiAxCitkZGNvbTMyMyBjb21wYXJlICAgOEUrMCAgIC03LjAgICAgLT4gMQorZGRjb20zMjQgY29tcGFyZSAgIDgwRS0xICAtNy4wICAgIC0+IDEKK2RkY29tMzI1IGNvbXBhcmUgICAuOEUrMSAgLTcgICAgICAtPiAxCitkZGNvbTMyNiBjb21wYXJlICAgODBFLTEgIC03ICAgICAgLT4gMQorZGRjb20zMjcgY29tcGFyZSAgIDguMCAgICAtN0UrMCAgIC0+IDEKK2RkY29tMzI4IGNvbXBhcmUgICA4LjAgICAgLTcwRS0xICAtPiAxCitkZGNvbTMyOSBjb21wYXJlICAgOCAgICAgIC0uN0UrMSAgLT4gMQorZGRjb20zMzAgY29tcGFyZSAgIDggICAgICAtNzBFLTEgIC0+IDEKKworZGRjb20zNDAgY29tcGFyZSAgIDguMCAgICAtOS4wICAgIC0+IDEKK2RkY29tMzQxIGNvbXBhcmUgICA4LjAgICAgLTkgICAgICAtPiAxCitkZGNvbTM0MiBjb21wYXJlICAgOCAgICAgIC05LjAgICAgLT4gMQorZGRjb20zNDMgY29tcGFyZSAgIDhFKzAgICAtOS4wICAgIC0+IDEKK2RkY29tMzQ0IGNvbXBhcmUgICA4MEUtMSAgLTkuMCAgICAtPiAxCitkZGNvbTM0NSBjb21wYXJlICAgLjhFKzEgIC05ICAgICAgLT4gMQorZGRjb20zNDYgY29tcGFyZSAgIDgwRS0xICAtOSAgICAgIC0+IDEKK2RkY29tMzQ3IGNvbXBhcmUgICA4LjAgICAgLTlFKzAgICAtPiAxCitkZGNvbTM0OCBjb21wYXJlICAgOC4wICAgIC05MEUtMSAgLT4gMQorZGRjb20zNDkgY29tcGFyZSAgIDggICAgICAtLjlFKzEgIC0+IDEKK2RkY29tMzUwIGNvbXBhcmUgICA4ICAgICAgLTkwRS0xICAtPiAxCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLS0gLi4KK2RkY29tNDAwIGNvbXBhcmUgICAtNy4wICAgIC03LjAgICAgLT4gMAorZGRjb200MDEgY29tcGFyZSAgIC03LjAgICAgLTcgICAgICAtPiAwCitkZGNvbTQwMiBjb21wYXJlICAgLTcgICAgICAtNy4wICAgIC0+IDAKK2RkY29tNDAzIGNvbXBhcmUgICAtN0UrMCAgIC03LjAgICAgLT4gMAorZGRjb200MDQgY29tcGFyZSAgIC03MEUtMSAgLTcuMCAgICAtPiAwCitkZGNvbTQwNSBjb21wYXJlICAgLS43RSsxICAtNyAgICAgIC0+IDAKK2RkY29tNDA2IGNvbXBhcmUgICAtNzBFLTEgIC03ICAgICAgLT4gMAorZGRjb200MDcgY29tcGFyZSAgIC03LjAgICAgLTdFKzAgICAtPiAwCitkZGNvbTQwOCBjb21wYXJlICAgLTcuMCAgICAtNzBFLTEgIC0+IDAKK2RkY29tNDA5IGNvbXBhcmUgICAtNyAgICAgIC0uN0UrMSAgLT4gMAorZGRjb200MTAgY29tcGFyZSAgIC03ICAgICAgLTcwRS0xICAtPiAwCisKK2RkY29tNDIwIGNvbXBhcmUgICAtOC4wICAgIC03LjAgICAgLT4gLTEKK2RkY29tNDIxIGNvbXBhcmUgICAtOC4wICAgIC03ICAgICAgLT4gLTEKK2RkY29tNDIyIGNvbXBhcmUgICAtOCAgICAgIC03LjAgICAgLT4gLTEKK2RkY29tNDIzIGNvbXBhcmUgICAtOEUrMCAgIC03LjAgICAgLT4gLTEKK2RkY29tNDI0IGNvbXBhcmUgICAtODBFLTEgIC03LjAgICAgLT4gLTEKK2RkY29tNDI1IGNvbXBhcmUgICAtLjhFKzEgIC03ICAgICAgLT4gLTEKK2RkY29tNDI2IGNvbXBhcmUgICAtODBFLTEgIC03ICAgICAgLT4gLTEKK2RkY29tNDI3IGNvbXBhcmUgICAtOC4wICAgIC03RSswICAgLT4gLTEKK2RkY29tNDI4IGNvbXBhcmUgICAtOC4wICAgIC03MEUtMSAgLT4gLTEKK2RkY29tNDI5IGNvbXBhcmUgICAtOCAgICAgIC0uN0UrMSAgLT4gLTEKK2RkY29tNDMwIGNvbXBhcmUgICAtOCAgICAgIC03MEUtMSAgLT4gLTEKKworZGRjb200NDAgY29tcGFyZSAgIC04LjAgICAgLTkuMCAgICAtPiAxCitkZGNvbTQ0MSBjb21wYXJlICAgLTguMCAgICAtOSAgICAgIC0+IDEKK2RkY29tNDQyIGNvbXBhcmUgICAtOCAgICAgIC05LjAgICAgLT4gMQorZGRjb200NDMgY29tcGFyZSAgIC04RSswICAgLTkuMCAgICAtPiAxCitkZGNvbTQ0NCBjb21wYXJlICAgLTgwRS0xICAtOS4wICAgIC0+IDEKK2RkY29tNDQ1IGNvbXBhcmUgICAtLjhFKzEgIC05ICAgICAgLT4gMQorZGRjb200NDYgY29tcGFyZSAgIC04MEUtMSAgLTkgICAgICAtPiAxCitkZGNvbTQ0NyBjb21wYXJlICAgLTguMCAgICAtOUUrMCAgIC0+IDEKK2RkY29tNDQ4IGNvbXBhcmUgICAtOC4wICAgIC05MEUtMSAgLT4gMQorZGRjb200NDkgY29tcGFyZSAgIC04ICAgICAgLS45RSsxICAtPiAxCitkZGNvbTQ1MCBjb21wYXJlICAgLTggICAgICAtOTBFLTEgIC0+IDEKKworLS0gbWlzYWxpZ25tZW50IHRyYXBzIGZvciBsaXR0bGUtZW5kaWFuCitkZGNvbTQ1MSBjb21wYXJlICAgICAgMS4wICAgICAgIDAuMSAgLT4gMQorZGRjb200NTIgY29tcGFyZSAgICAgIDAuMSAgICAgICAxLjAgIC0+IC0xCitkZGNvbTQ1MyBjb21wYXJlICAgICAxMC4wICAgICAgIDAuMSAgLT4gMQorZGRjb200NTQgY29tcGFyZSAgICAgIDAuMSAgICAgIDEwLjAgIC0+IC0xCitkZGNvbTQ1NSBjb21wYXJlICAgICAgMTAwICAgICAgIDEuMCAgLT4gMQorZGRjb200NTYgY29tcGFyZSAgICAgIDEuMCAgICAgICAxMDAgIC0+IC0xCitkZGNvbTQ1NyBjb21wYXJlICAgICAxMDAwICAgICAgMTAuMCAgLT4gMQorZGRjb200NTggY29tcGFyZSAgICAgMTAuMCAgICAgIDEwMDAgIC0+IC0xCitkZGNvbTQ1OSBjb21wYXJlICAgIDEwMDAwICAgICAxMDAuMCAgLT4gMQorZGRjb200NjAgY29tcGFyZSAgICAxMDAuMCAgICAgMTAwMDAgIC0+IC0xCitkZGNvbTQ2MSBjb21wYXJlICAgMTAwMDAwICAgIDEwMDAuMCAgLT4gMQorZGRjb200NjIgY29tcGFyZSAgIDEwMDAuMCAgICAxMDAwMDAgIC0+IC0xCitkZGNvbTQ2MyBjb21wYXJlICAxMDAwMDAwICAgMTAwMDAuMCAgLT4gMQorZGRjb200NjQgY29tcGFyZSAgMTAwMDAuMCAgIDEwMDAwMDAgIC0+IC0xCisKKy0tIHRlc3RjYXNlcyB0aGF0IHN1YnRyYWN0IHRvIGxvdHMgb2YgemVyb3MgYXQgYm91bmRhcmllcyBbcGdyXQorZGRjb200NzMgY29tcGFyZSAxMjMuNDU2MDAwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gMAorZGRjb200NzQgY29tcGFyZSAxMjMuNDU2MDAwMDAwMDAwRSs4OSAxMjMuNDU2RSs4OSAtPiAwCitkZGNvbTQ3NSBjb21wYXJlIDEyMy40NTYwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gMAorZGRjb200NzYgY29tcGFyZSAxMjMuNDU2MDAwMDAwMEUrODkgMTIzLjQ1NkUrODkgLT4gMAorZGRjb200NzcgY29tcGFyZSAxMjMuNDU2MDAwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAwCitkZGNvbTQ3OCBjb21wYXJlIDEyMy40NTYwMDAwMEUrODkgMTIzLjQ1NkUrODkgLT4gMAorZGRjb200NzkgY29tcGFyZSAxMjMuNDU2MDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gMAorZGRjb200ODAgY29tcGFyZSAxMjMuNDU2MDAwRSs4OSAxMjMuNDU2RSs4OSAtPiAwCitkZGNvbTQ4MSBjb21wYXJlIDEyMy40NTYwMEUtODkgMTIzLjQ1NkUtODkgLT4gMAorZGRjb200ODIgY29tcGFyZSAxMjMuNDU2MEUrODkgMTIzLjQ1NkUrODkgLT4gMAorZGRjb200ODMgY29tcGFyZSAxMjMuNDU2RS04OSAxMjMuNDU2RS04OSAtPiAwCitkZGNvbTQ4NyBjb21wYXJlIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwMDAwMDAwRSs4OSAtPiAwCitkZGNvbTQ4OCBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwMDBFLTg5IC0+IDAKK2RkY29tNDg5IGNvbXBhcmUgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMDAwRSs4OSAtPiAwCitkZGNvbTQ5MCBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwRS04OSAtPiAwCitkZGNvbTQ5MSBjb21wYXJlIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwMDBFKzg5IC0+IDAKK2RkY29tNDkyIGNvbXBhcmUgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwRS04OSAtPiAwCitkZGNvbTQ5MyBjb21wYXJlIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwRSs4OSAtPiAwCitkZGNvbTQ5NCBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTYwMDBFLTg5IC0+IDAKK2RkY29tNDk1IGNvbXBhcmUgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwRSs4OSAtPiAwCitkZGNvbTQ5NiBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTYwRS04OSAtPiAwCitkZGNvbTQ5NyBjb21wYXJlIDEyMy40NTZFKzg5IDEyMy40NTZFKzg5IC0+IDAKKworLS0gd2lkZS1yYW5naW5nLCBhcm91bmQgcHJlY2lzaW9uOyBzaWducyBlcXVhbAorZGRjb201MDAgY29tcGFyZSAgICAxICAgICAxRS0xNSAgICAtPiAxCitkZGNvbTUwMSBjb21wYXJlICAgIDEgICAgIDFFLTE0ICAgIC0+IDEKK2RkY29tNTAyIGNvbXBhcmUgICAgMSAgICAgMUUtMTMgICAgLT4gMQorZGRjb201MDMgY29tcGFyZSAgICAxICAgICAxRS0xMiAgICAtPiAxCitkZGNvbTUwNCBjb21wYXJlICAgIDEgICAgIDFFLTExICAgIC0+IDEKK2RkY29tNTA1IGNvbXBhcmUgICAgMSAgICAgMUUtMTAgICAgLT4gMQorZGRjb201MDYgY29tcGFyZSAgICAxICAgICAxRS05ICAgICAtPiAxCitkZGNvbTUwNyBjb21wYXJlICAgIDEgICAgIDFFLTggICAgIC0+IDEKK2RkY29tNTA4IGNvbXBhcmUgICAgMSAgICAgMUUtNyAgICAgLT4gMQorZGRjb201MDkgY29tcGFyZSAgICAxICAgICAxRS02ICAgICAtPiAxCitkZGNvbTUxMCBjb21wYXJlICAgIDEgICAgIDFFLTUgICAgIC0+IDEKK2RkY29tNTExIGNvbXBhcmUgICAgMSAgICAgMUUtNCAgICAgLT4gMQorZGRjb201MTIgY29tcGFyZSAgICAxICAgICAxRS0zICAgICAtPiAxCitkZGNvbTUxMyBjb21wYXJlICAgIDEgICAgIDFFLTIgICAgIC0+IDEKK2RkY29tNTE0IGNvbXBhcmUgICAgMSAgICAgMUUtMSAgICAgLT4gMQorZGRjb201MTUgY29tcGFyZSAgICAxICAgICAxRS0wICAgICAtPiAwCitkZGNvbTUxNiBjb21wYXJlICAgIDEgICAgIDFFKzEgICAgIC0+IC0xCitkZGNvbTUxNyBjb21wYXJlICAgIDEgICAgIDFFKzIgICAgIC0+IC0xCitkZGNvbTUxOCBjb21wYXJlICAgIDEgICAgIDFFKzMgICAgIC0+IC0xCitkZGNvbTUxOSBjb21wYXJlICAgIDEgICAgIDFFKzQgICAgIC0+IC0xCitkZGNvbTUyMSBjb21wYXJlICAgIDEgICAgIDFFKzUgICAgIC0+IC0xCitkZGNvbTUyMiBjb21wYXJlICAgIDEgICAgIDFFKzYgICAgIC0+IC0xCitkZGNvbTUyMyBjb21wYXJlICAgIDEgICAgIDFFKzcgICAgIC0+IC0xCitkZGNvbTUyNCBjb21wYXJlICAgIDEgICAgIDFFKzggICAgIC0+IC0xCitkZGNvbTUyNSBjb21wYXJlICAgIDEgICAgIDFFKzkgICAgIC0+IC0xCitkZGNvbTUyNiBjb21wYXJlICAgIDEgICAgIDFFKzEwICAgIC0+IC0xCitkZGNvbTUyNyBjb21wYXJlICAgIDEgICAgIDFFKzExICAgIC0+IC0xCitkZGNvbTUyOCBjb21wYXJlICAgIDEgICAgIDFFKzEyICAgIC0+IC0xCitkZGNvbTUyOSBjb21wYXJlICAgIDEgICAgIDFFKzEzICAgIC0+IC0xCitkZGNvbTUzMCBjb21wYXJlICAgIDEgICAgIDFFKzE0ICAgIC0+IC0xCitkZGNvbTUzMSBjb21wYXJlICAgIDEgICAgIDFFKzE1ICAgIC0+IC0xCistLSBMUiBzd2FwCitkZGNvbTU0MCBjb21wYXJlICAgIDFFLTE1ICAxICAgICAgIC0+IC0xCitkZGNvbTU0MSBjb21wYXJlICAgIDFFLTE0ICAxICAgICAgIC0+IC0xCitkZGNvbTU0MiBjb21wYXJlICAgIDFFLTEzICAxICAgICAgIC0+IC0xCitkZGNvbTU0MyBjb21wYXJlICAgIDFFLTEyICAxICAgICAgIC0+IC0xCitkZGNvbTU0NCBjb21wYXJlICAgIDFFLTExICAxICAgICAgIC0+IC0xCitkZGNvbTU0NSBjb21wYXJlICAgIDFFLTEwICAxICAgICAgIC0+IC0xCitkZGNvbTU0NiBjb21wYXJlICAgIDFFLTkgICAxICAgICAgIC0+IC0xCitkZGNvbTU0NyBjb21wYXJlICAgIDFFLTggICAxICAgICAgIC0+IC0xCitkZGNvbTU0OCBjb21wYXJlICAgIDFFLTcgICAxICAgICAgIC0+IC0xCitkZGNvbTU0OSBjb21wYXJlICAgIDFFLTYgICAxICAgICAgIC0+IC0xCitkZGNvbTU1MCBjb21wYXJlICAgIDFFLTUgICAxICAgICAgIC0+IC0xCitkZGNvbTU1MSBjb21wYXJlICAgIDFFLTQgICAxICAgICAgIC0+IC0xCitkZGNvbTU1MiBjb21wYXJlICAgIDFFLTMgICAxICAgICAgIC0+IC0xCitkZGNvbTU1MyBjb21wYXJlICAgIDFFLTIgICAxICAgICAgIC0+IC0xCitkZGNvbTU1NCBjb21wYXJlICAgIDFFLTEgICAxICAgICAgIC0+IC0xCitkZGNvbTU1NSBjb21wYXJlICAgIDFFLTAgICAxICAgICAgIC0+ICAwCitkZGNvbTU1NiBjb21wYXJlICAgIDFFKzEgICAxICAgICAgIC0+ICAxCitkZGNvbTU1NyBjb21wYXJlICAgIDFFKzIgICAxICAgICAgIC0+ICAxCitkZGNvbTU1OCBjb21wYXJlICAgIDFFKzMgICAxICAgICAgIC0+ICAxCitkZGNvbTU1OSBjb21wYXJlICAgIDFFKzQgICAxICAgICAgIC0+ICAxCitkZGNvbTU2MSBjb21wYXJlICAgIDFFKzUgICAxICAgICAgIC0+ICAxCitkZGNvbTU2MiBjb21wYXJlICAgIDFFKzYgICAxICAgICAgIC0+ICAxCitkZGNvbTU2MyBjb21wYXJlICAgIDFFKzcgICAxICAgICAgIC0+ICAxCitkZGNvbTU2NCBjb21wYXJlICAgIDFFKzggICAxICAgICAgIC0+ICAxCitkZGNvbTU2NSBjb21wYXJlICAgIDFFKzkgICAxICAgICAgIC0+ICAxCitkZGNvbTU2NiBjb21wYXJlICAgIDFFKzEwICAxICAgICAgIC0+ICAxCitkZGNvbTU2NyBjb21wYXJlICAgIDFFKzExICAxICAgICAgIC0+ICAxCitkZGNvbTU2OCBjb21wYXJlICAgIDFFKzEyICAxICAgICAgIC0+ICAxCitkZGNvbTU2OSBjb21wYXJlICAgIDFFKzEzICAxICAgICAgIC0+ICAxCitkZGNvbTU3MCBjb21wYXJlICAgIDFFKzE0ICAxICAgICAgIC0+ICAxCitkZGNvbTU3MSBjb21wYXJlICAgIDFFKzE1ICAxICAgICAgIC0+ICAxCistLSBzaW1pbGFyIHdpdGggYSB1c2VmdWwgY29lZmZpY2llbnQsIG9uZSBzaWRlIG9ubHkKK2RkY29tNTgwIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNSAgICAtPiAxCitkZGNvbTU4MSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTQgICAgLT4gMQorZGRjb201ODIgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEzICAgIC0+IDEKK2RkY29tNTgzIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMiAgICAtPiAxCitkZGNvbTU4NCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTEgICAgLT4gMQorZGRjb201ODUgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEwICAgIC0+IDEKK2RkY29tNTg2IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS05ICAgICAtPiAxCitkZGNvbTU4NyBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOCAgICAgLT4gMQorZGRjb201ODggY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTcgICAgIC0+IDEKK2RkY29tNTg5IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS02ICAgICAtPiAtMQorZGRjb201OTAgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTUgICAgIC0+IC0xCitkZGNvbTU5MSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNCAgICAgLT4gLTEKK2RkY29tNTkyIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0zICAgICAtPiAtMQorZGRjb201OTMgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTIgICAgIC0+IC0xCitkZGNvbTU5NCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMSAgICAgLT4gLTEKK2RkY29tNTk1IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0wICAgICAtPiAtMQorZGRjb201OTYgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzEgICAgIC0+IC0xCitkZGNvbTU5NyBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMiAgICAgLT4gLTEKK2RkY29tNTk4IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSszICAgICAtPiAtMQorZGRjb201OTkgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzQgICAgIC0+IC0xCisKKy0tIGNoZWNrIHNvbWUgdW5pdC15IHRyYXBzCitkZGNvbTYwMCBjb21wYXJlICAgMTIgICAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitkZGNvbTYwMSBjb21wYXJlICAgMTIuMCAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitkZGNvbTYwMiBjb21wYXJlICAgMTIuMDAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitkZGNvbTYwMyBjb21wYXJlICAgMTIuMDAwICAgICAgICAxMi4yMzQ1IC0+IC0xCitkZGNvbTYwNCBjb21wYXJlICAgMTIuMDAwMCAgICAgICAxMi4yMzQ1IC0+IC0xCitkZGNvbTYwNSBjb21wYXJlICAgMTIuMDAwMDAgICAgICAxMi4yMzQ1IC0+IC0xCitkZGNvbTYwNiBjb21wYXJlICAgMTIuMDAwMDAwICAgICAxMi4yMzQ1IC0+IC0xCitkZGNvbTYwNyBjb21wYXJlICAgMTIuMDAwMDAwMCAgICAxMi4yMzQ1IC0+IC0xCitkZGNvbTYwOCBjb21wYXJlICAgMTIuMDAwMDAwMDAgICAxMi4yMzQ1IC0+IC0xCitkZGNvbTYwOSBjb21wYXJlICAgMTIuMDAwMDAwMDAwICAxMi4yMzQ1IC0+IC0xCitkZGNvbTYxMCBjb21wYXJlICAgMTIuMTIzNCAxMiAgICAgICAgICAgIC0+ICAxCitkZGNvbTYxMSBjb21wYXJlICAgMTIuMTIzNCAxMi4wICAgICAgICAgIC0+ICAxCitkZGNvbTYxMiBjb21wYXJlICAgMTIuMTIzNCAxMi4wMCAgICAgICAgIC0+ICAxCitkZGNvbTYxMyBjb21wYXJlICAgMTIuMTIzNCAxMi4wMDAgICAgICAgIC0+ICAxCitkZGNvbTYxNCBjb21wYXJlICAgMTIuMTIzNCAxMi4wMDAwICAgICAgIC0+ICAxCitkZGNvbTYxNSBjb21wYXJlICAgMTIuMTIzNCAxMi4wMDAwMCAgICAgIC0+ICAxCitkZGNvbTYxNiBjb21wYXJlICAgMTIuMTIzNCAxMi4wMDAwMDAgICAgIC0+ICAxCitkZGNvbTYxNyBjb21wYXJlICAgMTIuMTIzNCAxMi4wMDAwMDAwICAgIC0+ICAxCitkZGNvbTYxOCBjb21wYXJlICAgMTIuMTIzNCAxMi4wMDAwMDAwMCAgIC0+ICAxCitkZGNvbTYxOSBjb21wYXJlICAgMTIuMTIzNCAxMi4wMDAwMDAwMDAgIC0+ICAxCitkZGNvbTYyMCBjb21wYXJlICAtMTIgICAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvbTYyMSBjb21wYXJlICAtMTIuMCAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvbTYyMiBjb21wYXJlICAtMTIuMDAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvbTYyMyBjb21wYXJlICAtMTIuMDAwICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvbTYyNCBjb21wYXJlICAtMTIuMDAwMCAgICAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvbTYyNSBjb21wYXJlICAtMTIuMDAwMDAgICAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvbTYyNiBjb21wYXJlICAtMTIuMDAwMDAwICAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvbTYyNyBjb21wYXJlICAtMTIuMDAwMDAwMCAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvbTYyOCBjb21wYXJlICAtMTIuMDAwMDAwMDAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvbTYyOSBjb21wYXJlICAtMTIuMDAwMDAwMDAwIC0xMi4yMzQ1IC0+ICAxCitkZGNvbTYzMCBjb21wYXJlICAtMTIuMTIzNCAtMTIgICAgICAgICAgIC0+IC0xCitkZGNvbTYzMSBjb21wYXJlICAtMTIuMTIzNCAtMTIuMCAgICAgICAgIC0+IC0xCitkZGNvbTYzMiBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAgICAgICAgIC0+IC0xCitkZGNvbTYzMyBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAwICAgICAgIC0+IC0xCitkZGNvbTYzNCBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAwMCAgICAgIC0+IC0xCitkZGNvbTYzNSBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAwMDAgICAgIC0+IC0xCitkZGNvbTYzNiBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAwMDAwICAgIC0+IC0xCitkZGNvbTYzNyBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAwMDAwMCAgIC0+IC0xCitkZGNvbTYzOCBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAgIC0+IC0xCitkZGNvbTYzOSBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAwIC0+IC0xCisKKy0tIGV4dGVuZGVkIHplcm9zCitkZGNvbTY0MCBjb21wYXJlICAgMCAgICAgMCAgIC0+IDAKK2RkY29tNjQxIGNvbXBhcmUgICAwICAgIC0wICAgLT4gMAorZGRjb202NDIgY29tcGFyZSAgIDAgICAgLTAuMCAtPiAwCitkZGNvbTY0MyBjb21wYXJlICAgMCAgICAgMC4wIC0+IDAKK2RkY29tNjQ0IGNvbXBhcmUgIC0wICAgICAwICAgLT4gMAorZGRjb202NDUgY29tcGFyZSAgLTAgICAgLTAgICAtPiAwCitkZGNvbTY0NiBjb21wYXJlICAtMCAgICAtMC4wIC0+IDAKK2RkY29tNjQ3IGNvbXBhcmUgIC0wICAgICAwLjAgLT4gMAorZGRjb202NDggY29tcGFyZSAgIDAuMCAgIDAgICAtPiAwCitkZGNvbTY0OSBjb21wYXJlICAgMC4wICAtMCAgIC0+IDAKK2RkY29tNjUwIGNvbXBhcmUgICAwLjAgIC0wLjAgLT4gMAorZGRjb202NTEgY29tcGFyZSAgIDAuMCAgIDAuMCAtPiAwCitkZGNvbTY1MiBjb21wYXJlICAtMC4wICAgMCAgIC0+IDAKK2RkY29tNjUzIGNvbXBhcmUgIC0wLjAgIC0wICAgLT4gMAorZGRjb202NTQgY29tcGFyZSAgLTAuMCAgLTAuMCAtPiAwCitkZGNvbTY1NSBjb21wYXJlICAtMC4wICAgMC4wIC0+IDAKKworZGRjb202NTYgY29tcGFyZSAgLTBFMSAgIDAuMCAtPiAwCitkZGNvbTY1NyBjb21wYXJlICAtMEUyICAgMC4wIC0+IDAKK2RkY29tNjU4IGNvbXBhcmUgICAwRTEgICAwLjAgLT4gMAorZGRjb202NTkgY29tcGFyZSAgIDBFMiAgIDAuMCAtPiAwCitkZGNvbTY2MCBjb21wYXJlICAtMEUxICAgMCAgIC0+IDAKK2RkY29tNjYxIGNvbXBhcmUgIC0wRTIgICAwICAgLT4gMAorZGRjb202NjIgY29tcGFyZSAgIDBFMSAgIDAgICAtPiAwCitkZGNvbTY2MyBjb21wYXJlICAgMEUyICAgMCAgIC0+IDAKK2RkY29tNjY0IGNvbXBhcmUgIC0wRTEgIC0wRTEgLT4gMAorZGRjb202NjUgY29tcGFyZSAgLTBFMiAgLTBFMSAtPiAwCitkZGNvbTY2NiBjb21wYXJlICAgMEUxICAtMEUxIC0+IDAKK2RkY29tNjY3IGNvbXBhcmUgICAwRTIgIC0wRTEgLT4gMAorZGRjb202NjggY29tcGFyZSAgLTBFMSAgLTBFMiAtPiAwCitkZGNvbTY2OSBjb21wYXJlICAtMEUyICAtMEUyIC0+IDAKK2RkY29tNjcwIGNvbXBhcmUgICAwRTEgIC0wRTIgLT4gMAorZGRjb202NzEgY29tcGFyZSAgIDBFMiAgLTBFMiAtPiAwCitkZGNvbTY3MiBjb21wYXJlICAtMEUxICAgMEUxIC0+IDAKK2RkY29tNjczIGNvbXBhcmUgIC0wRTIgICAwRTEgLT4gMAorZGRjb202NzQgY29tcGFyZSAgIDBFMSAgIDBFMSAtPiAwCitkZGNvbTY3NSBjb21wYXJlICAgMEUyICAgMEUxIC0+IDAKK2RkY29tNjc2IGNvbXBhcmUgIC0wRTEgICAwRTIgLT4gMAorZGRjb202NzcgY29tcGFyZSAgLTBFMiAgIDBFMiAtPiAwCitkZGNvbTY3OCBjb21wYXJlICAgMEUxICAgMEUyIC0+IDAKK2RkY29tNjc5IGNvbXBhcmUgICAwRTIgICAwRTIgLT4gMAorCistLSB0cmFpbGluZyB6ZXJvczsgdW5pdC15CitkZGNvbTY4MCBjb21wYXJlICAgMTIgICAgMTIgICAgICAgICAgIC0+IDAKK2RkY29tNjgxIGNvbXBhcmUgICAxMiAgICAxMi4wICAgICAgICAgLT4gMAorZGRjb202ODIgY29tcGFyZSAgIDEyICAgIDEyLjAwICAgICAgICAtPiAwCitkZGNvbTY4MyBjb21wYXJlICAgMTIgICAgMTIuMDAwICAgICAgIC0+IDAKK2RkY29tNjg0IGNvbXBhcmUgICAxMiAgICAxMi4wMDAwICAgICAgLT4gMAorZGRjb202ODUgY29tcGFyZSAgIDEyICAgIDEyLjAwMDAwICAgICAtPiAwCitkZGNvbTY4NiBjb21wYXJlICAgMTIgICAgMTIuMDAwMDAwICAgIC0+IDAKK2RkY29tNjg3IGNvbXBhcmUgICAxMiAgICAxMi4wMDAwMDAwICAgLT4gMAorZGRjb202ODggY29tcGFyZSAgIDEyICAgIDEyLjAwMDAwMDAwICAtPiAwCitkZGNvbTY4OSBjb21wYXJlICAgMTIgICAgMTIuMDAwMDAwMDAwIC0+IDAKK2RkY29tNjkwIGNvbXBhcmUgICAxMiAgICAgICAgICAgICAgMTIgLT4gMAorZGRjb202OTEgY29tcGFyZSAgIDEyLjAgICAgICAgICAgICAxMiAtPiAwCitkZGNvbTY5MiBjb21wYXJlICAgMTIuMDAgICAgICAgICAgIDEyIC0+IDAKK2RkY29tNjkzIGNvbXBhcmUgICAxMi4wMDAgICAgICAgICAgMTIgLT4gMAorZGRjb202OTQgY29tcGFyZSAgIDEyLjAwMDAgICAgICAgICAxMiAtPiAwCitkZGNvbTY5NSBjb21wYXJlICAgMTIuMDAwMDAgICAgICAgIDEyIC0+IDAKK2RkY29tNjk2IGNvbXBhcmUgICAxMi4wMDAwMDAgICAgICAgMTIgLT4gMAorZGRjb202OTcgY29tcGFyZSAgIDEyLjAwMDAwMDAgICAgICAxMiAtPiAwCitkZGNvbTY5OCBjb21wYXJlICAgMTIuMDAwMDAwMDAgICAgIDEyIC0+IDAKK2RkY29tNjk5IGNvbXBhcmUgICAxMi4wMDAwMDAwMDAgICAgMTIgLT4gMAorCistLSBmaXJzdCwgc2Vjb25kLCAmIGxhc3QgZGlnaXQKK2RkY29tNzAwIGNvbXBhcmUgICAxMjM0NTY3ODkwMTIzNDU2IDEyMzQ1Njc4OTAxMjM0NTUgLT4gMQorZGRjb203MDEgY29tcGFyZSAgIDEyMzQ1Njc4OTAxMjM0NTYgMTIzNDU2Nzg5MDEyMzQ1NiAtPiAwCitkZGNvbTcwMiBjb21wYXJlICAgMTIzNDU2Nzg5MDEyMzQ1NiAxMjM0NTY3ODkwMTIzNDU3IC0+IC0xCitkZGNvbTcwMyBjb21wYXJlICAgMTIzNDU2Nzg5MDEyMzQ1NiAwMjM0NTY3ODkwMTIzNDU2IC0+IDEKK2RkY29tNzA0IGNvbXBhcmUgICAxMjM0NTY3ODkwMTIzNDU2IDEyMzQ1Njc4OTAxMjM0NTYgLT4gMAorZGRjb203MDUgY29tcGFyZSAgIDEyMzQ1Njc4OTAxMjM0NTYgMjIzNDU2Nzg5MDEyMzQ1NiAtPiAtMQorZGRjb203MDYgY29tcGFyZSAgIDExMzQ1Njc4OTAxMjM0NTYgMTAzNDU2Nzg5MDEyMzQ1NiAtPiAxCitkZGNvbTcwNyBjb21wYXJlICAgMTEzNDU2Nzg5MDEyMzQ1NiAxMTM0NTY3ODkwMTIzNDU2IC0+IDAKK2RkY29tNzA4IGNvbXBhcmUgICAxMTM0NTY3ODkwMTIzNDU2IDEyMzQ1Njc4OTAxMjM0NTYgLT4gLTEKKworLS0gbWlzY2VsbGFuZW91cworZGRjb203MjEgY29tcGFyZSAxMjM0NTY3ODAwMCAxIC0+IDEKK2RkY29tNzIyIGNvbXBhcmUgMSAxMjM0NTY3ODAwMCAtPiAtMQorZGRjb203MjMgY29tcGFyZSAxMjM0NTY3ODAwICAxIC0+IDEKK2RkY29tNzI0IGNvbXBhcmUgMSAxMjM0NTY3ODAwICAtPiAtMQorZGRjb203MjUgY29tcGFyZSAxMjM0NTY3ODkwICAxIC0+IDEKK2RkY29tNzI2IGNvbXBhcmUgMSAxMjM0NTY3ODkwICAtPiAtMQorZGRjb203MjcgY29tcGFyZSAxMjM0NTY3ODkxICAxIC0+IDEKK2RkY29tNzI4IGNvbXBhcmUgMSAxMjM0NTY3ODkxICAtPiAtMQorZGRjb203MjkgY29tcGFyZSAxMjM0NTY3ODkwMSAxIC0+IDEKK2RkY29tNzMwIGNvbXBhcmUgMSAxMjM0NTY3ODkwMSAtPiAtMQorZGRjb203MzEgY29tcGFyZSAxMjM0NTY3ODk2ICAxIC0+IDEKK2RkY29tNzMyIGNvbXBhcmUgMSAxMjM0NTY3ODk2ICAtPiAtMQorCistLSByZXNpZHVlIGNhc2VzIGF0IGxvd2VyIHByZWNpc2lvbgorZGRjb203NDAgY29tcGFyZSAgMSAgMC45OTk5OTk5ICAtPiAxCitkZGNvbTc0MSBjb21wYXJlICAxICAwLjk5OTk5OSAgIC0+IDEKK2RkY29tNzQyIGNvbXBhcmUgIDEgIDAuOTk5OTkgICAgLT4gMQorZGRjb203NDMgY29tcGFyZSAgMSAgMS4wMDAwICAgICAtPiAwCitkZGNvbTc0NCBjb21wYXJlICAxICAxLjAwMDAxICAgIC0+IC0xCitkZGNvbTc0NSBjb21wYXJlICAxICAxLjAwMDAwMSAgIC0+IC0xCitkZGNvbTc0NiBjb21wYXJlICAxICAxLjAwMDAwMDEgIC0+IC0xCitkZGNvbTc1MCBjb21wYXJlICAwLjk5OTk5OTkgIDEgIC0+IC0xCitkZGNvbTc1MSBjb21wYXJlICAwLjk5OTk5OSAgIDEgIC0+IC0xCitkZGNvbTc1MiBjb21wYXJlICAwLjk5OTk5ICAgIDEgIC0+IC0xCitkZGNvbTc1MyBjb21wYXJlICAxLjAwMDAgICAgIDEgIC0+IDAKK2RkY29tNzU0IGNvbXBhcmUgIDEuMDAwMDEgICAgMSAgLT4gMQorZGRjb203NTUgY29tcGFyZSAgMS4wMDAwMDEgICAxICAtPiAxCitkZGNvbTc1NiBjb21wYXJlICAxLjAwMDAwMDEgIDEgIC0+IDEKKworLS0gU3BlY2lhbHMKK2RkY29tNzgwIGNvbXBhcmUgIEluZiAgLUluZiAgIC0+ICAxCitkZGNvbTc4MSBjb21wYXJlICBJbmYgIC0xMDAwICAtPiAgMQorZGRjb203ODIgY29tcGFyZSAgSW5mICAtMSAgICAgLT4gIDEKK2RkY29tNzgzIGNvbXBhcmUgIEluZiAgLTAgICAgIC0+ICAxCitkZGNvbTc4NCBjb21wYXJlICBJbmYgICAwICAgICAtPiAgMQorZGRjb203ODUgY29tcGFyZSAgSW5mICAgMSAgICAgLT4gIDEKK2RkY29tNzg2IGNvbXBhcmUgIEluZiAgIDEwMDAgIC0+ICAxCitkZGNvbTc4NyBjb21wYXJlICBJbmYgICBJbmYgICAtPiAgMAorZGRjb203ODggY29tcGFyZSAtMTAwMCAgSW5mICAgLT4gLTEKK2RkY29tNzg5IGNvbXBhcmUgLUluZiAgIEluZiAgIC0+IC0xCitkZGNvbTc5MCBjb21wYXJlIC0xICAgICBJbmYgICAtPiAtMQorZGRjb203OTEgY29tcGFyZSAtMCAgICAgSW5mICAgLT4gLTEKK2RkY29tNzkyIGNvbXBhcmUgIDAgICAgIEluZiAgIC0+IC0xCitkZGNvbTc5MyBjb21wYXJlICAxICAgICBJbmYgICAtPiAtMQorZGRjb203OTQgY29tcGFyZSAgMTAwMCAgSW5mICAgLT4gLTEKK2RkY29tNzk1IGNvbXBhcmUgIEluZiAgIEluZiAgIC0+ICAwCisKK2RkY29tODAwIGNvbXBhcmUgLUluZiAgLUluZiAgIC0+ICAwCitkZGNvbTgwMSBjb21wYXJlIC1JbmYgIC0xMDAwICAtPiAtMQorZGRjb204MDIgY29tcGFyZSAtSW5mICAtMSAgICAgLT4gLTEKK2RkY29tODAzIGNvbXBhcmUgLUluZiAgLTAgICAgIC0+IC0xCitkZGNvbTgwNCBjb21wYXJlIC1JbmYgICAwICAgICAtPiAtMQorZGRjb204MDUgY29tcGFyZSAtSW5mICAgMSAgICAgLT4gLTEKK2RkY29tODA2IGNvbXBhcmUgLUluZiAgIDEwMDAgIC0+IC0xCitkZGNvbTgwNyBjb21wYXJlIC1JbmYgICBJbmYgICAtPiAtMQorZGRjb204MDggY29tcGFyZSAtSW5mICAtSW5mICAgLT4gIDAKK2RkY29tODA5IGNvbXBhcmUgLTEwMDAgLUluZiAgIC0+ICAxCitkZGNvbTgxMCBjb21wYXJlIC0xICAgIC1JbmYgICAtPiAgMQorZGRjb204MTEgY29tcGFyZSAtMCAgICAtSW5mICAgLT4gIDEKK2RkY29tODEyIGNvbXBhcmUgIDAgICAgLUluZiAgIC0+ICAxCitkZGNvbTgxMyBjb21wYXJlICAxICAgIC1JbmYgICAtPiAgMQorZGRjb204MTQgY29tcGFyZSAgMTAwMCAtSW5mICAgLT4gIDEKK2RkY29tODE1IGNvbXBhcmUgIEluZiAgLUluZiAgIC0+ICAxCisKK2RkY29tODIxIGNvbXBhcmUgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2RkY29tODIyIGNvbXBhcmUgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RkY29tODIzIGNvbXBhcmUgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2RkY29tODI0IGNvbXBhcmUgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2RkY29tODI1IGNvbXBhcmUgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2RkY29tODI2IGNvbXBhcmUgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2RkY29tODI3IGNvbXBhcmUgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2RkY29tODI4IGNvbXBhcmUgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RkY29tODI5IGNvbXBhcmUgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RkY29tODMwIGNvbXBhcmUgLUluZiAgTmFOICAgIC0+ICBOYU4KK2RkY29tODMxIGNvbXBhcmUgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RkY29tODMyIGNvbXBhcmUgLTEgICAgTmFOICAgIC0+ICBOYU4KK2RkY29tODMzIGNvbXBhcmUgLTAgICAgTmFOICAgIC0+ICBOYU4KK2RkY29tODM0IGNvbXBhcmUgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RkY29tODM1IGNvbXBhcmUgIDEgICAgTmFOICAgIC0+ICBOYU4KK2RkY29tODM2IGNvbXBhcmUgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2RkY29tODM3IGNvbXBhcmUgIEluZiAgTmFOICAgIC0+ICBOYU4KK2RkY29tODM4IGNvbXBhcmUgLU5hTiAtTmFOICAgIC0+IC1OYU4KK2RkY29tODM5IGNvbXBhcmUgK05hTiAtTmFOICAgIC0+ICBOYU4KK2RkY29tODQwIGNvbXBhcmUgLU5hTiArTmFOICAgIC0+IC1OYU4KKworZGRjb204NDEgY29tcGFyZSAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODQyIGNvbXBhcmUgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg0MyBjb21wYXJlICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NDQgY29tcGFyZSAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODQ1IGNvbXBhcmUgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg0NiBjb21wYXJlICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NDcgY29tcGFyZSAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODQ4IGNvbXBhcmUgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg0OSBjb21wYXJlICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NTAgY29tcGFyZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODUxIGNvbXBhcmUgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg1MiBjb21wYXJlIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NTMgY29tcGFyZSAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODU0IGNvbXBhcmUgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg1NSBjb21wYXJlICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NTYgY29tcGFyZSAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODU3IGNvbXBhcmUgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg1OCBjb21wYXJlICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NTkgY29tcGFyZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRjb204NjAgY29tcGFyZSAgTmFOOSAtSW5mICAgLT4gIE5hTjkKK2RkY29tODYxIGNvbXBhcmUgIE5hTjggIDk5OSAgIC0+ICBOYU44CitkZGNvbTg2MiBjb21wYXJlICBOYU43NyBJbmYgICAtPiAgTmFONzcKK2RkY29tODYzIGNvbXBhcmUgLU5hTjY3IE5hTjUgIC0+IC1OYU42NworZGRjb204NjQgY29tcGFyZSAtSW5mICAtTmFONCAgLT4gLU5hTjQKK2RkY29tODY1IGNvbXBhcmUgLTk5OSAgLU5hTjMzIC0+IC1OYU4zMworZGRjb204NjYgY29tcGFyZSAgSW5mICAgTmFOMiAgLT4gIE5hTjIKK2RkY29tODY3IGNvbXBhcmUgLU5hTjQxIC1OYU40MiAtPiAtTmFONDEKK2RkY29tODY4IGNvbXBhcmUgK05hTjQxIC1OYU40MiAtPiAgTmFONDEKK2RkY29tODY5IGNvbXBhcmUgLU5hTjQxICtOYU40MiAtPiAtTmFONDEKK2RkY29tODcwIGNvbXBhcmUgK05hTjQxICtOYU40MiAtPiAgTmFONDEKKworZGRjb204NzEgY29tcGFyZSAtc05hTjk5IC1JbmYgICAgLT4gLU5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg3MiBjb21wYXJlICBzTmFOOTggLTExICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODczIGNvbXBhcmUgIHNOYU45NyAgTmFOICAgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NzQgY29tcGFyZSAgc05hTjE2IHNOYU45NCAgLT4gIE5hTjE2IEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg3NSBjb21wYXJlICBOYU44NSAgc05hTjgzICAtPiAgTmFOODMgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODc2IGNvbXBhcmUgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NzcgY29tcGFyZSAgMDg4ICAgIHNOYU44MSAgLT4gIE5hTjgxIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg3OCBjb21wYXJlICBJbmYgICAgc05hTjkwICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODc5IGNvbXBhcmUgIE5hTiAgIC1zTmFOODkgIC0+IC1OYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCistLSB3aWRlIHJhbmdlCitkZGNvbTg4MCBjb21wYXJlICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzM4NCAtPiAtMQorZGRjb204ODEgY29tcGFyZSA5RSszODQgKzEuMjM0NTY3ODkwMTIzNDVFLTAgLT4gIDEKK2RkY29tODgyIGNvbXBhcmUgKzAuMTAwIDlFLTM4MyAgICAgICAgICAgICAgIC0+ICAxCitkZGNvbTg4MyBjb21wYXJlIDlFLTM4MyArMC4xMDAgICAgICAgICAgICAgICAtPiAtMQorZGRjb204ODUgY29tcGFyZSAtMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSszODQgLT4gLTEKK2RkY29tODg2IGNvbXBhcmUgOUUrMzg0IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+ICAxCitkZGNvbTg4NyBjb21wYXJlIC0wLjEwMCA5RS0zODMgICAgICAgICAgICAgICAtPiAtMQorZGRjb204ODggY29tcGFyZSA5RS0zODMgLTAuMTAwICAgICAgICAgICAgICAgLT4gIDEKKworLS0gc3ByZWFkIHplcm9zCitkZGNvbTkwMCBjb21wYXJlICAgMEUtMzgzICAwICAgICAgIC0+ICAwCitkZGNvbTkwMSBjb21wYXJlICAgMEUtMzgzIC0wICAgICAgIC0+ICAwCitkZGNvbTkwMiBjb21wYXJlICAtMEUtMzgzICAwICAgICAgIC0+ICAwCitkZGNvbTkwMyBjb21wYXJlICAtMEUtMzgzIC0wICAgICAgIC0+ICAwCitkZGNvbTkwNCBjb21wYXJlICAgMEUtMzgzICAwRSszODQgIC0+ICAwCitkZGNvbTkwNSBjb21wYXJlICAgMEUtMzgzIC0wRSszODQgIC0+ICAwCitkZGNvbTkwNiBjb21wYXJlICAtMEUtMzgzICAwRSszODQgIC0+ICAwCitkZGNvbTkwNyBjb21wYXJlICAtMEUtMzgzIC0wRSszODQgIC0+ICAwCitkZGNvbTkwOCBjb21wYXJlICAgMCAgICAgICAwRSszODQgIC0+ICAwCitkZGNvbTkwOSBjb21wYXJlICAgMCAgICAgIC0wRSszODQgIC0+ICAwCitkZGNvbTkxMCBjb21wYXJlICAtMCAgICAgICAwRSszODQgIC0+ICAwCitkZGNvbTkxMSBjb21wYXJlICAtMCAgICAgIC0wRSszODQgIC0+ICAwCitkZGNvbTkzMCBjb21wYXJlICAgMEUrMzg0ICAwICAgICAgIC0+ICAwCitkZGNvbTkzMSBjb21wYXJlICAgMEUrMzg0IC0wICAgICAgIC0+ICAwCitkZGNvbTkzMiBjb21wYXJlICAtMEUrMzg0ICAwICAgICAgIC0+ICAwCitkZGNvbTkzMyBjb21wYXJlICAtMEUrMzg0IC0wICAgICAgIC0+ICAwCitkZGNvbTkzNCBjb21wYXJlICAgMEUrMzg0ICAwRS0zODMgIC0+ICAwCitkZGNvbTkzNSBjb21wYXJlICAgMEUrMzg0IC0wRS0zODMgIC0+ICAwCitkZGNvbTkzNiBjb21wYXJlICAtMEUrMzg0ICAwRS0zODMgIC0+ICAwCitkZGNvbTkzNyBjb21wYXJlICAtMEUrMzg0IC0wRS0zODMgIC0+ICAwCitkZGNvbTkzOCBjb21wYXJlICAgMCAgICAgICAwRS0zODMgIC0+ICAwCitkZGNvbTkzOSBjb21wYXJlICAgMCAgICAgIC0wRS0zODMgIC0+ICAwCitkZGNvbTk0MCBjb21wYXJlICAtMCAgICAgICAwRS0zODMgIC0+ICAwCitkZGNvbTk0MSBjb21wYXJlICAtMCAgICAgIC0wRS0zODMgIC0+ICAwCisKKy0tIHNpZ25zCitkZGNvbTk2MSBjb21wYXJlICAxZSs3NyAgMWUrMTEgLT4gIDEKK2RkY29tOTYyIGNvbXBhcmUgIDFlKzc3IC0xZSsxMSAtPiAgMQorZGRjb205NjMgY29tcGFyZSAtMWUrNzcgIDFlKzExIC0+IC0xCitkZGNvbTk2NCBjb21wYXJlIC0xZSs3NyAtMWUrMTEgLT4gLTEKK2RkY29tOTY1IGNvbXBhcmUgIDFlLTc3ICAxZS0xMSAtPiAtMQorZGRjb205NjYgY29tcGFyZSAgMWUtNzcgLTFlLTExIC0+ICAxCitkZGNvbTk2NyBjb21wYXJlIC0xZS03NyAgMWUtMTEgLT4gLTEKK2RkY29tOTY4IGNvbXBhcmUgLTFlLTc3IC0xZS0xMSAtPiAgMQorCistLSBmdWxsIGFsaWdubWVudCByYW5nZSwgYm90aCB3YXlzCitkZGNvbXAxMDAxIGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMCAgLT4gMAorZGRjb21wMTAwMiBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMCAgIC0+IDAKK2RkY29tcDEwMDMgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMCAgICAtPiAwCitkZGNvbXAxMDA0IGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMCAgICAgLT4gMAorZGRjb21wMTAwNSBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMCAgICAgIC0+IDAKK2RkY29tcDEwMDYgY29tcGFyZSAxIDEuMDAwMDAwMDAwMCAgICAgICAtPiAwCitkZGNvbXAxMDA3IGNvbXBhcmUgMSAxLjAwMDAwMDAwMCAgICAgICAgLT4gMAorZGRjb21wMTAwOCBjb21wYXJlIDEgMS4wMDAwMDAwMCAgICAgICAgIC0+IDAKK2RkY29tcDEwMDkgY29tcGFyZSAxIDEuMDAwMDAwMCAgICAgICAgICAtPiAwCitkZGNvbXAxMDEwIGNvbXBhcmUgMSAxLjAwMDAwMCAgICAgICAgICAgLT4gMAorZGRjb21wMTAxMSBjb21wYXJlIDEgMS4wMDAwMCAgICAgICAgICAgIC0+IDAKK2RkY29tcDEwMTIgY29tcGFyZSAxIDEuMDAwMCAgICAgICAgICAgICAtPiAwCitkZGNvbXAxMDEzIGNvbXBhcmUgMSAxLjAwMCAgICAgICAgICAgICAgLT4gMAorZGRjb21wMTAxNCBjb21wYXJlIDEgMS4wMCAgICAgICAgICAgICAgIC0+IDAKK2RkY29tcDEwMTUgY29tcGFyZSAxIDEuMCAgICAgICAgICAgICAgICAtPiAwCitkZGNvbXAxMDIxIGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAgIDEgLT4gMAorZGRjb21wMTAyMiBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAgICAxIC0+IDAKK2RkY29tcDEwMjMgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAgICAgMSAtPiAwCitkZGNvbXAxMDI0IGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAgICAgIDEgLT4gMAorZGRjb21wMTAyNSBjb21wYXJlIDEuMDAwMDAwMDAwMDAgICAgICAxIC0+IDAKK2RkY29tcDEwMjYgY29tcGFyZSAxLjAwMDAwMDAwMDAgICAgICAgMSAtPiAwCitkZGNvbXAxMDI3IGNvbXBhcmUgMS4wMDAwMDAwMDAgICAgICAgIDEgLT4gMAorZGRjb21wMTAyOCBjb21wYXJlIDEuMDAwMDAwMDAgICAgICAgICAxIC0+IDAKK2RkY29tcDEwMjkgY29tcGFyZSAxLjAwMDAwMDAgICAgICAgICAgMSAtPiAwCitkZGNvbXAxMDMwIGNvbXBhcmUgMS4wMDAwMDAgICAgICAgICAgIDEgLT4gMAorZGRjb21wMTAzMSBjb21wYXJlIDEuMDAwMDAgICAgICAgICAgICAxIC0+IDAKK2RkY29tcDEwMzIgY29tcGFyZSAxLjAwMDAgICAgICAgICAgICAgMSAtPiAwCitkZGNvbXAxMDMzIGNvbXBhcmUgMS4wMDAgICAgICAgICAgICAgIDEgLT4gMAorZGRjb21wMTAzNCBjb21wYXJlIDEuMDAgICAgICAgICAgICAgICAxIC0+IDAKK2RkY29tcDEwMzUgY29tcGFyZSAxLjAgICAgICAgICAgICAgICAgMSAtPiAwCisKKy0tIGNoZWNrIE1TRCBhbHdheXMgZGV0ZWN0ZWQgbm9uLXplcm8KK2RkY29tcDEwNDAgY29tcGFyZSAwIDAuMDAwMDAwMDAwMDAwMDAwICAtPiAwCitkZGNvbXAxMDQxIGNvbXBhcmUgMCAxLjAwMDAwMDAwMDAwMDAwMCAgLT4gLTEKK2RkY29tcDEwNDIgY29tcGFyZSAwIDIuMDAwMDAwMDAwMDAwMDAwICAtPiAtMQorZGRjb21wMTA0MyBjb21wYXJlIDAgMy4wMDAwMDAwMDAwMDAwMDAgIC0+IC0xCitkZGNvbXAxMDQ0IGNvbXBhcmUgMCA0LjAwMDAwMDAwMDAwMDAwMCAgLT4gLTEKK2RkY29tcDEwNDUgY29tcGFyZSAwIDUuMDAwMDAwMDAwMDAwMDAwICAtPiAtMQorZGRjb21wMTA0NiBjb21wYXJlIDAgNi4wMDAwMDAwMDAwMDAwMDAgIC0+IC0xCitkZGNvbXAxMDQ3IGNvbXBhcmUgMCA3LjAwMDAwMDAwMDAwMDAwMCAgLT4gLTEKK2RkY29tcDEwNDggY29tcGFyZSAwIDguMDAwMDAwMDAwMDAwMDAwICAtPiAtMQorZGRjb21wMTA0OSBjb21wYXJlIDAgOS4wMDAwMDAwMDAwMDAwMDAgIC0+IC0xCitkZGNvbXAxMDUwIGNvbXBhcmUgMC4wMDAwMDAwMDAwMDAwMDAgIDAgLT4gMAorZGRjb21wMTA1MSBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwICAwIC0+IDEKK2RkY29tcDEwNTIgY29tcGFyZSAyLjAwMDAwMDAwMDAwMDAwMCAgMCAtPiAxCitkZGNvbXAxMDUzIGNvbXBhcmUgMy4wMDAwMDAwMDAwMDAwMDAgIDAgLT4gMQorZGRjb21wMTA1NCBjb21wYXJlIDQuMDAwMDAwMDAwMDAwMDAwICAwIC0+IDEKK2RkY29tcDEwNTUgY29tcGFyZSA1LjAwMDAwMDAwMDAwMDAwMCAgMCAtPiAxCitkZGNvbXAxMDU2IGNvbXBhcmUgNi4wMDAwMDAwMDAwMDAwMDAgIDAgLT4gMQorZGRjb21wMTA1NyBjb21wYXJlIDcuMDAwMDAwMDAwMDAwMDAwICAwIC0+IDEKK2RkY29tcDEwNTggY29tcGFyZSA4LjAwMDAwMDAwMDAwMDAwMCAgMCAtPiAxCitkZGNvbXAxMDU5IGNvbXBhcmUgOS4wMDAwMDAwMDAwMDAwMDAgIDAgLT4gMQorCistLSBOdWxsIHRlc3RzCitkZGNvbTk5OTAgY29tcGFyZSAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkY29tOTk5MSBjb21wYXJlICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvbXBhcmVTaWcuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb21wYXJlU2lnLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyZWM0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb21wYXJlU2lnLmRlY1Rlc3QKQEAgLTAsMCArMSw2NDcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRDb21wYXJlU2lnLmRlY1Rlc3QgLS0gZGVjRG91YmxlIGNvbXBhcmlzb247IGFsbCBOYU5zIHNpZ25hbCAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBOb3RlIHRoYXQgd2UgY2Fubm90IGFzc3VtZSBhZGQvc3VidHJhY3QgdGVzdHMgY292ZXIgcGF0aHMgYWRlcXVhdGVseSwKKy0tIGhlcmUsIGJlY2F1c2UgdGhlIGNvZGUgbWlnaHQgYmUgcXVpdGUgZGlmZmVyZW50IChjb21wYXJpc29uIGNhbm5vdAorLS0gb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBzbyBhY3R1YWwgc3VidHJhY3Rpb25zIGFyZSBub3QgbmVjZXNzYXJ5KS4KKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNEb3VibGVzLgorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RkY21zMDAxIGNvbXBhcmVzaWcgIC0yICAtMiAgLT4gMAorZGRjbXMwMDIgY29tcGFyZXNpZyAgLTIgIC0xICAtPiAtMQorZGRjbXMwMDMgY29tcGFyZXNpZyAgLTIgICAwICAtPiAtMQorZGRjbXMwMDQgY29tcGFyZXNpZyAgLTIgICAxICAtPiAtMQorZGRjbXMwMDUgY29tcGFyZXNpZyAgLTIgICAyICAtPiAtMQorZGRjbXMwMDYgY29tcGFyZXNpZyAgLTEgIC0yICAtPiAxCitkZGNtczAwNyBjb21wYXJlc2lnICAtMSAgLTEgIC0+IDAKK2RkY21zMDA4IGNvbXBhcmVzaWcgIC0xICAgMCAgLT4gLTEKK2RkY21zMDA5IGNvbXBhcmVzaWcgIC0xICAgMSAgLT4gLTEKK2RkY21zMDEwIGNvbXBhcmVzaWcgIC0xICAgMiAgLT4gLTEKK2RkY21zMDExIGNvbXBhcmVzaWcgICAwICAtMiAgLT4gMQorZGRjbXMwMTIgY29tcGFyZXNpZyAgIDAgIC0xICAtPiAxCitkZGNtczAxMyBjb21wYXJlc2lnICAgMCAgIDAgIC0+IDAKK2RkY21zMDE0IGNvbXBhcmVzaWcgICAwICAgMSAgLT4gLTEKK2RkY21zMDE1IGNvbXBhcmVzaWcgICAwICAgMiAgLT4gLTEKK2RkY21zMDE2IGNvbXBhcmVzaWcgICAxICAtMiAgLT4gMQorZGRjbXMwMTcgY29tcGFyZXNpZyAgIDEgIC0xICAtPiAxCitkZGNtczAxOCBjb21wYXJlc2lnICAgMSAgIDAgIC0+IDEKK2RkY21zMDE5IGNvbXBhcmVzaWcgICAxICAgMSAgLT4gMAorZGRjbXMwMjAgY29tcGFyZXNpZyAgIDEgICAyICAtPiAtMQorZGRjbXMwMjEgY29tcGFyZXNpZyAgIDIgIC0yICAtPiAxCitkZGNtczAyMiBjb21wYXJlc2lnICAgMiAgLTEgIC0+IDEKK2RkY21zMDIzIGNvbXBhcmVzaWcgICAyICAgMCAgLT4gMQorZGRjbXMwMjUgY29tcGFyZXNpZyAgIDIgICAxICAtPiAxCitkZGNtczAyNiBjb21wYXJlc2lnICAgMiAgIDIgIC0+IDAKKworZGRjbXMwMzEgY29tcGFyZXNpZyAgLTIwICAtMjAgIC0+IDAKK2RkY21zMDMyIGNvbXBhcmVzaWcgIC0yMCAgLTEwICAtPiAtMQorZGRjbXMwMzMgY29tcGFyZXNpZyAgLTIwICAgMDAgIC0+IC0xCitkZGNtczAzNCBjb21wYXJlc2lnICAtMjAgICAxMCAgLT4gLTEKK2RkY21zMDM1IGNvbXBhcmVzaWcgIC0yMCAgIDIwICAtPiAtMQorZGRjbXMwMzYgY29tcGFyZXNpZyAgLTEwICAtMjAgIC0+IDEKK2RkY21zMDM3IGNvbXBhcmVzaWcgIC0xMCAgLTEwICAtPiAwCitkZGNtczAzOCBjb21wYXJlc2lnICAtMTAgICAwMCAgLT4gLTEKK2RkY21zMDM5IGNvbXBhcmVzaWcgIC0xMCAgIDEwICAtPiAtMQorZGRjbXMwNDAgY29tcGFyZXNpZyAgLTEwICAgMjAgIC0+IC0xCitkZGNtczA0MSBjb21wYXJlc2lnICAgMDAgIC0yMCAgLT4gMQorZGRjbXMwNDIgY29tcGFyZXNpZyAgIDAwICAtMTAgIC0+IDEKK2RkY21zMDQzIGNvbXBhcmVzaWcgICAwMCAgIDAwICAtPiAwCitkZGNtczA0NCBjb21wYXJlc2lnICAgMDAgICAxMCAgLT4gLTEKK2RkY21zMDQ1IGNvbXBhcmVzaWcgICAwMCAgIDIwICAtPiAtMQorZGRjbXMwNDYgY29tcGFyZXNpZyAgIDEwICAtMjAgIC0+IDEKK2RkY21zMDQ3IGNvbXBhcmVzaWcgICAxMCAgLTEwICAtPiAxCitkZGNtczA0OCBjb21wYXJlc2lnICAgMTAgICAwMCAgLT4gMQorZGRjbXMwNDkgY29tcGFyZXNpZyAgIDEwICAgMTAgIC0+IDAKK2RkY21zMDUwIGNvbXBhcmVzaWcgICAxMCAgIDIwICAtPiAtMQorZGRjbXMwNTEgY29tcGFyZXNpZyAgIDIwICAtMjAgIC0+IDEKK2RkY21zMDUyIGNvbXBhcmVzaWcgICAyMCAgLTEwICAtPiAxCitkZGNtczA1MyBjb21wYXJlc2lnICAgMjAgICAwMCAgLT4gMQorZGRjbXMwNTUgY29tcGFyZXNpZyAgIDIwICAgMTAgIC0+IDEKK2RkY21zMDU2IGNvbXBhcmVzaWcgICAyMCAgIDIwICAtPiAwCisKK2RkY21zMDYxIGNvbXBhcmVzaWcgIC0yLjAgIC0yLjAgIC0+IDAKK2RkY21zMDYyIGNvbXBhcmVzaWcgIC0yLjAgIC0xLjAgIC0+IC0xCitkZGNtczA2MyBjb21wYXJlc2lnICAtMi4wICAgMC4wICAtPiAtMQorZGRjbXMwNjQgY29tcGFyZXNpZyAgLTIuMCAgIDEuMCAgLT4gLTEKK2RkY21zMDY1IGNvbXBhcmVzaWcgIC0yLjAgICAyLjAgIC0+IC0xCitkZGNtczA2NiBjb21wYXJlc2lnICAtMS4wICAtMi4wICAtPiAxCitkZGNtczA2NyBjb21wYXJlc2lnICAtMS4wICAtMS4wICAtPiAwCitkZGNtczA2OCBjb21wYXJlc2lnICAtMS4wICAgMC4wICAtPiAtMQorZGRjbXMwNjkgY29tcGFyZXNpZyAgLTEuMCAgIDEuMCAgLT4gLTEKK2RkY21zMDcwIGNvbXBhcmVzaWcgIC0xLjAgICAyLjAgIC0+IC0xCitkZGNtczA3MSBjb21wYXJlc2lnICAgMC4wICAtMi4wICAtPiAxCitkZGNtczA3MiBjb21wYXJlc2lnICAgMC4wICAtMS4wICAtPiAxCitkZGNtczA3MyBjb21wYXJlc2lnICAgMC4wICAgMC4wICAtPiAwCitkZGNtczA3NCBjb21wYXJlc2lnICAgMC4wICAgMS4wICAtPiAtMQorZGRjbXMwNzUgY29tcGFyZXNpZyAgIDAuMCAgIDIuMCAgLT4gLTEKK2RkY21zMDc2IGNvbXBhcmVzaWcgICAxLjAgIC0yLjAgIC0+IDEKK2RkY21zMDc3IGNvbXBhcmVzaWcgICAxLjAgIC0xLjAgIC0+IDEKK2RkY21zMDc4IGNvbXBhcmVzaWcgICAxLjAgICAwLjAgIC0+IDEKK2RkY21zMDc5IGNvbXBhcmVzaWcgICAxLjAgICAxLjAgIC0+IDAKK2RkY21zMDgwIGNvbXBhcmVzaWcgICAxLjAgICAyLjAgIC0+IC0xCitkZGNtczA4MSBjb21wYXJlc2lnICAgMi4wICAtMi4wICAtPiAxCitkZGNtczA4MiBjb21wYXJlc2lnICAgMi4wICAtMS4wICAtPiAxCitkZGNtczA4MyBjb21wYXJlc2lnICAgMi4wICAgMC4wICAtPiAxCitkZGNtczA4NSBjb21wYXJlc2lnICAgMi4wICAgMS4wICAtPiAxCitkZGNtczA4NiBjb21wYXJlc2lnICAgMi4wICAgMi4wICAtPiAwCisKKy0tIG5vdyBzb21lIGNhc2VzIHdoaWNoIG1pZ2h0IG92ZXJmbG93IGlmIHN1YnRyYWN0IHdlcmUgdXNlZAorZGRjbXMwOTAgY29tcGFyZXNpZyAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAwCitkZGNtczA5MSBjb21wYXJlc2lnIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0+IC0xCitkZGNtczA5MiBjb21wYXJlc2lnICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0+IDEKK2RkY21zMDkzIGNvbXBhcmVzaWcgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLT4gMAorCistLSBzb21lIGRpZmZlcmluZyBsZW5ndGgvZXhwb25lbnQgY2FzZXMKK2RkY21zMTAwIGNvbXBhcmVzaWcgICA3LjAgICAgNy4wICAgIC0+IDAKK2RkY21zMTAxIGNvbXBhcmVzaWcgICA3LjAgICAgNyAgICAgIC0+IDAKK2RkY21zMTAyIGNvbXBhcmVzaWcgICA3ICAgICAgNy4wICAgIC0+IDAKK2RkY21zMTAzIGNvbXBhcmVzaWcgICA3RSswICAgNy4wICAgIC0+IDAKK2RkY21zMTA0IGNvbXBhcmVzaWcgICA3MEUtMSAgNy4wICAgIC0+IDAKK2RkY21zMTA1IGNvbXBhcmVzaWcgICAwLjdFKzEgNyAgICAgIC0+IDAKK2RkY21zMTA2IGNvbXBhcmVzaWcgICA3MEUtMSAgNyAgICAgIC0+IDAKK2RkY21zMTA3IGNvbXBhcmVzaWcgICA3LjAgICAgN0UrMCAgIC0+IDAKK2RkY21zMTA4IGNvbXBhcmVzaWcgICA3LjAgICAgNzBFLTEgIC0+IDAKK2RkY21zMTA5IGNvbXBhcmVzaWcgICA3ICAgICAgMC43RSsxIC0+IDAKK2RkY21zMTEwIGNvbXBhcmVzaWcgICA3ICAgICAgNzBFLTEgIC0+IDAKKworZGRjbXMxMjAgY29tcGFyZXNpZyAgIDguMCAgICA3LjAgICAgLT4gMQorZGRjbXMxMjEgY29tcGFyZXNpZyAgIDguMCAgICA3ICAgICAgLT4gMQorZGRjbXMxMjIgY29tcGFyZXNpZyAgIDggICAgICA3LjAgICAgLT4gMQorZGRjbXMxMjMgY29tcGFyZXNpZyAgIDhFKzAgICA3LjAgICAgLT4gMQorZGRjbXMxMjQgY29tcGFyZXNpZyAgIDgwRS0xICA3LjAgICAgLT4gMQorZGRjbXMxMjUgY29tcGFyZXNpZyAgIDAuOEUrMSA3ICAgICAgLT4gMQorZGRjbXMxMjYgY29tcGFyZXNpZyAgIDgwRS0xICA3ICAgICAgLT4gMQorZGRjbXMxMjcgY29tcGFyZXNpZyAgIDguMCAgICA3RSswICAgLT4gMQorZGRjbXMxMjggY29tcGFyZXNpZyAgIDguMCAgICA3MEUtMSAgLT4gMQorZGRjbXMxMjkgY29tcGFyZXNpZyAgIDggICAgICAwLjdFKzEgIC0+IDEKK2RkY21zMTMwIGNvbXBhcmVzaWcgICA4ICAgICAgNzBFLTEgIC0+IDEKKworZGRjbXMxNDAgY29tcGFyZXNpZyAgIDguMCAgICA5LjAgICAgLT4gLTEKK2RkY21zMTQxIGNvbXBhcmVzaWcgICA4LjAgICAgOSAgICAgIC0+IC0xCitkZGNtczE0MiBjb21wYXJlc2lnICAgOCAgICAgIDkuMCAgICAtPiAtMQorZGRjbXMxNDMgY29tcGFyZXNpZyAgIDhFKzAgICA5LjAgICAgLT4gLTEKK2RkY21zMTQ0IGNvbXBhcmVzaWcgICA4MEUtMSAgOS4wICAgIC0+IC0xCitkZGNtczE0NSBjb21wYXJlc2lnICAgMC44RSsxIDkgICAgICAtPiAtMQorZGRjbXMxNDYgY29tcGFyZXNpZyAgIDgwRS0xICA5ICAgICAgLT4gLTEKK2RkY21zMTQ3IGNvbXBhcmVzaWcgICA4LjAgICAgOUUrMCAgIC0+IC0xCitkZGNtczE0OCBjb21wYXJlc2lnICAgOC4wICAgIDkwRS0xICAtPiAtMQorZGRjbXMxNDkgY29tcGFyZXNpZyAgIDggICAgICAwLjlFKzEgLT4gLTEKK2RkY21zMTUwIGNvbXBhcmVzaWcgICA4ICAgICAgOTBFLTEgIC0+IC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLSsgLi4KK2RkY21zMjAwIGNvbXBhcmVzaWcgIC03LjAgICAgNy4wICAgIC0+IC0xCitkZGNtczIwMSBjb21wYXJlc2lnICAtNy4wICAgIDcgICAgICAtPiAtMQorZGRjbXMyMDIgY29tcGFyZXNpZyAgLTcgICAgICA3LjAgICAgLT4gLTEKK2RkY21zMjAzIGNvbXBhcmVzaWcgIC03RSswICAgNy4wICAgIC0+IC0xCitkZGNtczIwNCBjb21wYXJlc2lnICAtNzBFLTEgIDcuMCAgICAtPiAtMQorZGRjbXMyMDUgY29tcGFyZXNpZyAgLTAuN0UrMSA3ICAgICAgLT4gLTEKK2RkY21zMjA2IGNvbXBhcmVzaWcgIC03MEUtMSAgNyAgICAgIC0+IC0xCitkZGNtczIwNyBjb21wYXJlc2lnICAtNy4wICAgIDdFKzAgICAtPiAtMQorZGRjbXMyMDggY29tcGFyZXNpZyAgLTcuMCAgICA3MEUtMSAgLT4gLTEKK2RkY21zMjA5IGNvbXBhcmVzaWcgIC03ICAgICAgMC43RSsxIC0+IC0xCitkZGNtczIxMCBjb21wYXJlc2lnICAtNyAgICAgIDcwRS0xICAtPiAtMQorCitkZGNtczIyMCBjb21wYXJlc2lnICAtOC4wICAgIDcuMCAgICAtPiAtMQorZGRjbXMyMjEgY29tcGFyZXNpZyAgLTguMCAgICA3ICAgICAgLT4gLTEKK2RkY21zMjIyIGNvbXBhcmVzaWcgIC04ICAgICAgNy4wICAgIC0+IC0xCitkZGNtczIyMyBjb21wYXJlc2lnICAtOEUrMCAgIDcuMCAgICAtPiAtMQorZGRjbXMyMjQgY29tcGFyZXNpZyAgLTgwRS0xICA3LjAgICAgLT4gLTEKK2RkY21zMjI1IGNvbXBhcmVzaWcgIC0wLjhFKzEgNyAgICAgIC0+IC0xCitkZGNtczIyNiBjb21wYXJlc2lnICAtODBFLTEgIDcgICAgICAtPiAtMQorZGRjbXMyMjcgY29tcGFyZXNpZyAgLTguMCAgICA3RSswICAgLT4gLTEKK2RkY21zMjI4IGNvbXBhcmVzaWcgIC04LjAgICAgNzBFLTEgIC0+IC0xCitkZGNtczIyOSBjb21wYXJlc2lnICAtOCAgICAgIDAuN0UrMSAtPiAtMQorZGRjbXMyMzAgY29tcGFyZXNpZyAgLTggICAgICA3MEUtMSAgLT4gLTEKKworZGRjbXMyNDAgY29tcGFyZXNpZyAgLTguMCAgICA5LjAgICAgLT4gLTEKK2RkY21zMjQxIGNvbXBhcmVzaWcgIC04LjAgICAgOSAgICAgIC0+IC0xCitkZGNtczI0MiBjb21wYXJlc2lnICAtOCAgICAgIDkuMCAgICAtPiAtMQorZGRjbXMyNDMgY29tcGFyZXNpZyAgLThFKzAgICA5LjAgICAgLT4gLTEKK2RkY21zMjQ0IGNvbXBhcmVzaWcgIC04MEUtMSAgOS4wICAgIC0+IC0xCitkZGNtczI0NSBjb21wYXJlc2lnICAtMC44RSsxIDkgICAgICAtPiAtMQorZGRjbXMyNDYgY29tcGFyZXNpZyAgLTgwRS0xICA5ICAgICAgLT4gLTEKK2RkY21zMjQ3IGNvbXBhcmVzaWcgIC04LjAgICAgOUUrMCAgIC0+IC0xCitkZGNtczI0OCBjb21wYXJlc2lnICAtOC4wICAgIDkwRS0xICAtPiAtMQorZGRjbXMyNDkgY29tcGFyZXNpZyAgLTggICAgICAwLjlFKzEgLT4gLTEKK2RkY21zMjUwIGNvbXBhcmVzaWcgIC04ICAgICAgOTBFLTEgIC0+IC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgKy0gLi4KK2RkY21zMzAwIGNvbXBhcmVzaWcgICA3LjAgICAgLTcuMCAgICAtPiAxCitkZGNtczMwMSBjb21wYXJlc2lnICAgNy4wICAgIC03ICAgICAgLT4gMQorZGRjbXMzMDIgY29tcGFyZXNpZyAgIDcgICAgICAtNy4wICAgIC0+IDEKK2RkY21zMzAzIGNvbXBhcmVzaWcgICA3RSswICAgLTcuMCAgICAtPiAxCitkZGNtczMwNCBjb21wYXJlc2lnICAgNzBFLTEgIC03LjAgICAgLT4gMQorZGRjbXMzMDUgY29tcGFyZXNpZyAgIC43RSsxICAtNyAgICAgIC0+IDEKK2RkY21zMzA2IGNvbXBhcmVzaWcgICA3MEUtMSAgLTcgICAgICAtPiAxCitkZGNtczMwNyBjb21wYXJlc2lnICAgNy4wICAgIC03RSswICAgLT4gMQorZGRjbXMzMDggY29tcGFyZXNpZyAgIDcuMCAgICAtNzBFLTEgIC0+IDEKK2RkY21zMzA5IGNvbXBhcmVzaWcgICA3ICAgICAgLS43RSsxICAtPiAxCitkZGNtczMxMCBjb21wYXJlc2lnICAgNyAgICAgIC03MEUtMSAgLT4gMQorCitkZGNtczMyMCBjb21wYXJlc2lnICAgOC4wICAgIC03LjAgICAgLT4gMQorZGRjbXMzMjEgY29tcGFyZXNpZyAgIDguMCAgICAtNyAgICAgIC0+IDEKK2RkY21zMzIyIGNvbXBhcmVzaWcgICA4ICAgICAgLTcuMCAgICAtPiAxCitkZGNtczMyMyBjb21wYXJlc2lnICAgOEUrMCAgIC03LjAgICAgLT4gMQorZGRjbXMzMjQgY29tcGFyZXNpZyAgIDgwRS0xICAtNy4wICAgIC0+IDEKK2RkY21zMzI1IGNvbXBhcmVzaWcgICAuOEUrMSAgLTcgICAgICAtPiAxCitkZGNtczMyNiBjb21wYXJlc2lnICAgODBFLTEgIC03ICAgICAgLT4gMQorZGRjbXMzMjcgY29tcGFyZXNpZyAgIDguMCAgICAtN0UrMCAgIC0+IDEKK2RkY21zMzI4IGNvbXBhcmVzaWcgICA4LjAgICAgLTcwRS0xICAtPiAxCitkZGNtczMyOSBjb21wYXJlc2lnICAgOCAgICAgIC0uN0UrMSAgLT4gMQorZGRjbXMzMzAgY29tcGFyZXNpZyAgIDggICAgICAtNzBFLTEgIC0+IDEKKworZGRjbXMzNDAgY29tcGFyZXNpZyAgIDguMCAgICAtOS4wICAgIC0+IDEKK2RkY21zMzQxIGNvbXBhcmVzaWcgICA4LjAgICAgLTkgICAgICAtPiAxCitkZGNtczM0MiBjb21wYXJlc2lnICAgOCAgICAgIC05LjAgICAgLT4gMQorZGRjbXMzNDMgY29tcGFyZXNpZyAgIDhFKzAgICAtOS4wICAgIC0+IDEKK2RkY21zMzQ0IGNvbXBhcmVzaWcgICA4MEUtMSAgLTkuMCAgICAtPiAxCitkZGNtczM0NSBjb21wYXJlc2lnICAgLjhFKzEgIC05ICAgICAgLT4gMQorZGRjbXMzNDYgY29tcGFyZXNpZyAgIDgwRS0xICAtOSAgICAgIC0+IDEKK2RkY21zMzQ3IGNvbXBhcmVzaWcgICA4LjAgICAgLTlFKzAgICAtPiAxCitkZGNtczM0OCBjb21wYXJlc2lnICAgOC4wICAgIC05MEUtMSAgLT4gMQorZGRjbXMzNDkgY29tcGFyZXNpZyAgIDggICAgICAtLjlFKzEgIC0+IDEKK2RkY21zMzUwIGNvbXBhcmVzaWcgICA4ICAgICAgLTkwRS0xICAtPiAxCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLS0gLi4KK2RkY21zNDAwIGNvbXBhcmVzaWcgICAtNy4wICAgIC03LjAgICAgLT4gMAorZGRjbXM0MDEgY29tcGFyZXNpZyAgIC03LjAgICAgLTcgICAgICAtPiAwCitkZGNtczQwMiBjb21wYXJlc2lnICAgLTcgICAgICAtNy4wICAgIC0+IDAKK2RkY21zNDAzIGNvbXBhcmVzaWcgICAtN0UrMCAgIC03LjAgICAgLT4gMAorZGRjbXM0MDQgY29tcGFyZXNpZyAgIC03MEUtMSAgLTcuMCAgICAtPiAwCitkZGNtczQwNSBjb21wYXJlc2lnICAgLS43RSsxICAtNyAgICAgIC0+IDAKK2RkY21zNDA2IGNvbXBhcmVzaWcgICAtNzBFLTEgIC03ICAgICAgLT4gMAorZGRjbXM0MDcgY29tcGFyZXNpZyAgIC03LjAgICAgLTdFKzAgICAtPiAwCitkZGNtczQwOCBjb21wYXJlc2lnICAgLTcuMCAgICAtNzBFLTEgIC0+IDAKK2RkY21zNDA5IGNvbXBhcmVzaWcgICAtNyAgICAgIC0uN0UrMSAgLT4gMAorZGRjbXM0MTAgY29tcGFyZXNpZyAgIC03ICAgICAgLTcwRS0xICAtPiAwCisKK2RkY21zNDIwIGNvbXBhcmVzaWcgICAtOC4wICAgIC03LjAgICAgLT4gLTEKK2RkY21zNDIxIGNvbXBhcmVzaWcgICAtOC4wICAgIC03ICAgICAgLT4gLTEKK2RkY21zNDIyIGNvbXBhcmVzaWcgICAtOCAgICAgIC03LjAgICAgLT4gLTEKK2RkY21zNDIzIGNvbXBhcmVzaWcgICAtOEUrMCAgIC03LjAgICAgLT4gLTEKK2RkY21zNDI0IGNvbXBhcmVzaWcgICAtODBFLTEgIC03LjAgICAgLT4gLTEKK2RkY21zNDI1IGNvbXBhcmVzaWcgICAtLjhFKzEgIC03ICAgICAgLT4gLTEKK2RkY21zNDI2IGNvbXBhcmVzaWcgICAtODBFLTEgIC03ICAgICAgLT4gLTEKK2RkY21zNDI3IGNvbXBhcmVzaWcgICAtOC4wICAgIC03RSswICAgLT4gLTEKK2RkY21zNDI4IGNvbXBhcmVzaWcgICAtOC4wICAgIC03MEUtMSAgLT4gLTEKK2RkY21zNDI5IGNvbXBhcmVzaWcgICAtOCAgICAgIC0uN0UrMSAgLT4gLTEKK2RkY21zNDMwIGNvbXBhcmVzaWcgICAtOCAgICAgIC03MEUtMSAgLT4gLTEKKworZGRjbXM0NDAgY29tcGFyZXNpZyAgIC04LjAgICAgLTkuMCAgICAtPiAxCitkZGNtczQ0MSBjb21wYXJlc2lnICAgLTguMCAgICAtOSAgICAgIC0+IDEKK2RkY21zNDQyIGNvbXBhcmVzaWcgICAtOCAgICAgIC05LjAgICAgLT4gMQorZGRjbXM0NDMgY29tcGFyZXNpZyAgIC04RSswICAgLTkuMCAgICAtPiAxCitkZGNtczQ0NCBjb21wYXJlc2lnICAgLTgwRS0xICAtOS4wICAgIC0+IDEKK2RkY21zNDQ1IGNvbXBhcmVzaWcgICAtLjhFKzEgIC05ICAgICAgLT4gMQorZGRjbXM0NDYgY29tcGFyZXNpZyAgIC04MEUtMSAgLTkgICAgICAtPiAxCitkZGNtczQ0NyBjb21wYXJlc2lnICAgLTguMCAgICAtOUUrMCAgIC0+IDEKK2RkY21zNDQ4IGNvbXBhcmVzaWcgICAtOC4wICAgIC05MEUtMSAgLT4gMQorZGRjbXM0NDkgY29tcGFyZXNpZyAgIC04ICAgICAgLS45RSsxICAtPiAxCitkZGNtczQ1MCBjb21wYXJlc2lnICAgLTggICAgICAtOTBFLTEgIC0+IDEKKworCistLSB0ZXN0Y2FzZXMgdGhhdCBzdWJ0cmFjdCB0byBsb3RzIG9mIHplcm9zIGF0IGJvdW5kYXJpZXMgW3Bncl0KK2RkY21zNDczIGNvbXBhcmVzaWcgMTIzLjQ1NjAwMDAwMDAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2RkY21zNDc0IGNvbXBhcmVzaWcgMTIzLjQ1NjAwMDAwMDAwMEUrODkgMTIzLjQ1NkUrODkgLT4gMAorZGRjbXM0NzUgY29tcGFyZXNpZyAxMjMuNDU2MDAwMDAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2RkY21zNDc2IGNvbXBhcmVzaWcgMTIzLjQ1NjAwMDAwMDBFKzg5IDEyMy40NTZFKzg5IC0+IDAKK2RkY21zNDc3IGNvbXBhcmVzaWcgMTIzLjQ1NjAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gMAorZGRjbXM0NzggY29tcGFyZXNpZyAxMjMuNDU2MDAwMDBFKzg5IDEyMy40NTZFKzg5IC0+IDAKK2RkY21zNDc5IGNvbXBhcmVzaWcgMTIzLjQ1NjAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2RkY21zNDgwIGNvbXBhcmVzaWcgMTIzLjQ1NjAwMEUrODkgMTIzLjQ1NkUrODkgLT4gMAorZGRjbXM0ODEgY29tcGFyZXNpZyAxMjMuNDU2MDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2RkY21zNDgyIGNvbXBhcmVzaWcgMTIzLjQ1NjBFKzg5IDEyMy40NTZFKzg5IC0+IDAKK2RkY21zNDgzIGNvbXBhcmVzaWcgMTIzLjQ1NkUtODkgMTIzLjQ1NkUtODkgLT4gMAorZGRjbXM0ODcgY29tcGFyZXNpZyAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwMDAwMEUrODkgLT4gMAorZGRjbXM0ODggY29tcGFyZXNpZyAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMDAwRS04OSAtPiAwCitkZGNtczQ4OSBjb21wYXJlc2lnIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwMDAwMEUrODkgLT4gMAorZGRjbXM0OTAgY29tcGFyZXNpZyAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMEUtODkgLT4gMAorZGRjbXM0OTEgY29tcGFyZXNpZyAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwRSs4OSAtPiAwCitkZGNtczQ5MiBjb21wYXJlc2lnIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMEUtODkgLT4gMAorZGRjbXM0OTMgY29tcGFyZXNpZyAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMEUrODkgLT4gMAorZGRjbXM0OTQgY29tcGFyZXNpZyAxMjMuNDU2RS04OSAxMjMuNDU2MDAwRS04OSAtPiAwCitkZGNtczQ5NSBjb21wYXJlc2lnIDEyMy40NTZFKzg5IDEyMy40NTYwMEUrODkgLT4gMAorZGRjbXM0OTYgY29tcGFyZXNpZyAxMjMuNDU2RS04OSAxMjMuNDU2MEUtODkgLT4gMAorZGRjbXM0OTcgY29tcGFyZXNpZyAxMjMuNDU2RSs4OSAxMjMuNDU2RSs4OSAtPiAwCisKKy0tIHdpZGUtcmFuZ2luZywgYXJvdW5kIHByZWNpc2lvbjsgc2lnbnMgZXF1YWwKK2RkY21zNTAwIGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMTUgICAgLT4gMQorZGRjbXM1MDEgY29tcGFyZXNpZyAgICAxICAgICAxRS0xNCAgICAtPiAxCitkZGNtczUwMiBjb21wYXJlc2lnICAgIDEgICAgIDFFLTEzICAgIC0+IDEKK2RkY21zNTAzIGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMTIgICAgLT4gMQorZGRjbXM1MDQgY29tcGFyZXNpZyAgICAxICAgICAxRS0xMSAgICAtPiAxCitkZGNtczUwNSBjb21wYXJlc2lnICAgIDEgICAgIDFFLTEwICAgIC0+IDEKK2RkY21zNTA2IGNvbXBhcmVzaWcgICAgMSAgICAgMUUtOSAgICAgLT4gMQorZGRjbXM1MDcgY29tcGFyZXNpZyAgICAxICAgICAxRS04ICAgICAtPiAxCitkZGNtczUwOCBjb21wYXJlc2lnICAgIDEgICAgIDFFLTcgICAgIC0+IDEKK2RkY21zNTA5IGNvbXBhcmVzaWcgICAgMSAgICAgMUUtNiAgICAgLT4gMQorZGRjbXM1MTAgY29tcGFyZXNpZyAgICAxICAgICAxRS01ICAgICAtPiAxCitkZGNtczUxMSBjb21wYXJlc2lnICAgIDEgICAgIDFFLTQgICAgIC0+IDEKK2RkY21zNTEyIGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMyAgICAgLT4gMQorZGRjbXM1MTMgY29tcGFyZXNpZyAgICAxICAgICAxRS0yICAgICAtPiAxCitkZGNtczUxNCBjb21wYXJlc2lnICAgIDEgICAgIDFFLTEgICAgIC0+IDEKK2RkY21zNTE1IGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMCAgICAgLT4gMAorZGRjbXM1MTYgY29tcGFyZXNpZyAgICAxICAgICAxRSsxICAgICAtPiAtMQorZGRjbXM1MTcgY29tcGFyZXNpZyAgICAxICAgICAxRSsyICAgICAtPiAtMQorZGRjbXM1MTggY29tcGFyZXNpZyAgICAxICAgICAxRSszICAgICAtPiAtMQorZGRjbXM1MTkgY29tcGFyZXNpZyAgICAxICAgICAxRSs0ICAgICAtPiAtMQorZGRjbXM1MjEgY29tcGFyZXNpZyAgICAxICAgICAxRSs1ICAgICAtPiAtMQorZGRjbXM1MjIgY29tcGFyZXNpZyAgICAxICAgICAxRSs2ICAgICAtPiAtMQorZGRjbXM1MjMgY29tcGFyZXNpZyAgICAxICAgICAxRSs3ICAgICAtPiAtMQorZGRjbXM1MjQgY29tcGFyZXNpZyAgICAxICAgICAxRSs4ICAgICAtPiAtMQorZGRjbXM1MjUgY29tcGFyZXNpZyAgICAxICAgICAxRSs5ICAgICAtPiAtMQorZGRjbXM1MjYgY29tcGFyZXNpZyAgICAxICAgICAxRSsxMCAgICAtPiAtMQorZGRjbXM1MjcgY29tcGFyZXNpZyAgICAxICAgICAxRSsxMSAgICAtPiAtMQorZGRjbXM1MjggY29tcGFyZXNpZyAgICAxICAgICAxRSsxMiAgICAtPiAtMQorZGRjbXM1MjkgY29tcGFyZXNpZyAgICAxICAgICAxRSsxMyAgICAtPiAtMQorZGRjbXM1MzAgY29tcGFyZXNpZyAgICAxICAgICAxRSsxNCAgICAtPiAtMQorZGRjbXM1MzEgY29tcGFyZXNpZyAgICAxICAgICAxRSsxNSAgICAtPiAtMQorLS0gTFIgc3dhcAorZGRjbXM1NDAgY29tcGFyZXNpZyAgICAxRS0xNSAgMSAgICAgICAtPiAtMQorZGRjbXM1NDEgY29tcGFyZXNpZyAgICAxRS0xNCAgMSAgICAgICAtPiAtMQorZGRjbXM1NDIgY29tcGFyZXNpZyAgICAxRS0xMyAgMSAgICAgICAtPiAtMQorZGRjbXM1NDMgY29tcGFyZXNpZyAgICAxRS0xMiAgMSAgICAgICAtPiAtMQorZGRjbXM1NDQgY29tcGFyZXNpZyAgICAxRS0xMSAgMSAgICAgICAtPiAtMQorZGRjbXM1NDUgY29tcGFyZXNpZyAgICAxRS0xMCAgMSAgICAgICAtPiAtMQorZGRjbXM1NDYgY29tcGFyZXNpZyAgICAxRS05ICAgMSAgICAgICAtPiAtMQorZGRjbXM1NDcgY29tcGFyZXNpZyAgICAxRS04ICAgMSAgICAgICAtPiAtMQorZGRjbXM1NDggY29tcGFyZXNpZyAgICAxRS03ICAgMSAgICAgICAtPiAtMQorZGRjbXM1NDkgY29tcGFyZXNpZyAgICAxRS02ICAgMSAgICAgICAtPiAtMQorZGRjbXM1NTAgY29tcGFyZXNpZyAgICAxRS01ICAgMSAgICAgICAtPiAtMQorZGRjbXM1NTEgY29tcGFyZXNpZyAgICAxRS00ICAgMSAgICAgICAtPiAtMQorZGRjbXM1NTIgY29tcGFyZXNpZyAgICAxRS0zICAgMSAgICAgICAtPiAtMQorZGRjbXM1NTMgY29tcGFyZXNpZyAgICAxRS0yICAgMSAgICAgICAtPiAtMQorZGRjbXM1NTQgY29tcGFyZXNpZyAgICAxRS0xICAgMSAgICAgICAtPiAtMQorZGRjbXM1NTUgY29tcGFyZXNpZyAgICAxRS0wICAgMSAgICAgICAtPiAgMAorZGRjbXM1NTYgY29tcGFyZXNpZyAgICAxRSsxICAgMSAgICAgICAtPiAgMQorZGRjbXM1NTcgY29tcGFyZXNpZyAgICAxRSsyICAgMSAgICAgICAtPiAgMQorZGRjbXM1NTggY29tcGFyZXNpZyAgICAxRSszICAgMSAgICAgICAtPiAgMQorZGRjbXM1NTkgY29tcGFyZXNpZyAgICAxRSs0ICAgMSAgICAgICAtPiAgMQorZGRjbXM1NjEgY29tcGFyZXNpZyAgICAxRSs1ICAgMSAgICAgICAtPiAgMQorZGRjbXM1NjIgY29tcGFyZXNpZyAgICAxRSs2ICAgMSAgICAgICAtPiAgMQorZGRjbXM1NjMgY29tcGFyZXNpZyAgICAxRSs3ICAgMSAgICAgICAtPiAgMQorZGRjbXM1NjQgY29tcGFyZXNpZyAgICAxRSs4ICAgMSAgICAgICAtPiAgMQorZGRjbXM1NjUgY29tcGFyZXNpZyAgICAxRSs5ICAgMSAgICAgICAtPiAgMQorZGRjbXM1NjYgY29tcGFyZXNpZyAgICAxRSsxMCAgMSAgICAgICAtPiAgMQorZGRjbXM1NjcgY29tcGFyZXNpZyAgICAxRSsxMSAgMSAgICAgICAtPiAgMQorZGRjbXM1NjggY29tcGFyZXNpZyAgICAxRSsxMiAgMSAgICAgICAtPiAgMQorZGRjbXM1NjkgY29tcGFyZXNpZyAgICAxRSsxMyAgMSAgICAgICAtPiAgMQorZGRjbXM1NzAgY29tcGFyZXNpZyAgICAxRSsxNCAgMSAgICAgICAtPiAgMQorZGRjbXM1NzEgY29tcGFyZXNpZyAgICAxRSsxNSAgMSAgICAgICAtPiAgMQorLS0gc2ltaWxhciB3aXRoIGEgdXNlZnVsIGNvZWZmaWNpZW50LCBvbmUgc2lkZSBvbmx5CitkZGNtczU4MCBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTUgICAgLT4gMQorZGRjbXM1ODEgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE0ICAgIC0+IDEKK2RkY21zNTgyIGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMyAgICAtPiAxCitkZGNtczU4MyBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTIgICAgLT4gMQorZGRjbXM1ODQgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTExICAgIC0+IDEKK2RkY21zNTg1IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMCAgICAtPiAxCitkZGNtczU4NiBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOSAgICAgLT4gMQorZGRjbXM1ODcgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTggICAgIC0+IDEKK2RkY21zNTg4IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS03ICAgICAtPiAxCitkZGNtczU4OSBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNiAgICAgLT4gLTEKK2RkY21zNTkwIGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS01ICAgICAtPiAtMQorZGRjbXM1OTEgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTQgICAgIC0+IC0xCitkZGNtczU5MiBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMyAgICAgLT4gLTEKK2RkY21zNTkzIGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0yICAgICAtPiAtMQorZGRjbXM1OTQgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEgICAgIC0+IC0xCitkZGNtczU5NSBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMCAgICAgLT4gLTEKK2RkY21zNTk2IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsxICAgICAtPiAtMQorZGRjbXM1OTcgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzIgICAgIC0+IC0xCitkZGNtczU5OCBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMyAgICAgLT4gLTEKK2RkY21zNTk5IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSs0ICAgICAtPiAtMQorCistLSBjaGVjayBzb21lIHVuaXQteSB0cmFwcworZGRjbXM2MDAgY29tcGFyZXNpZyAgIDEyICAgICAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjbXM2MDEgY29tcGFyZXNpZyAgIDEyLjAgICAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjbXM2MDIgY29tcGFyZXNpZyAgIDEyLjAwICAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjbXM2MDMgY29tcGFyZXNpZyAgIDEyLjAwMCAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjbXM2MDQgY29tcGFyZXNpZyAgIDEyLjAwMDAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjbXM2MDUgY29tcGFyZXNpZyAgIDEyLjAwMDAwICAgICAgMTIuMjM0NSAtPiAtMQorZGRjbXM2MDYgY29tcGFyZXNpZyAgIDEyLjAwMDAwMCAgICAgMTIuMjM0NSAtPiAtMQorZGRjbXM2MDcgY29tcGFyZXNpZyAgIDEyLjAwMDAwMDAgICAgMTIuMjM0NSAtPiAtMQorZGRjbXM2MDggY29tcGFyZXNpZyAgIDEyLjAwMDAwMDAwICAgMTIuMjM0NSAtPiAtMQorZGRjbXM2MDkgY29tcGFyZXNpZyAgIDEyLjAwMDAwMDAwMCAgMTIuMjM0NSAtPiAtMQorZGRjbXM2MTAgY29tcGFyZXNpZyAgIDEyLjEyMzQgMTIgICAgICAgICAgICAtPiAgMQorZGRjbXM2MTEgY29tcGFyZXNpZyAgIDEyLjEyMzQgMTIuMCAgICAgICAgICAtPiAgMQorZGRjbXM2MTIgY29tcGFyZXNpZyAgIDEyLjEyMzQgMTIuMDAgICAgICAgICAtPiAgMQorZGRjbXM2MTMgY29tcGFyZXNpZyAgIDEyLjEyMzQgMTIuMDAwICAgICAgICAtPiAgMQorZGRjbXM2MTQgY29tcGFyZXNpZyAgIDEyLjEyMzQgMTIuMDAwMCAgICAgICAtPiAgMQorZGRjbXM2MTUgY29tcGFyZXNpZyAgIDEyLjEyMzQgMTIuMDAwMDAgICAgICAtPiAgMQorZGRjbXM2MTYgY29tcGFyZXNpZyAgIDEyLjEyMzQgMTIuMDAwMDAwICAgICAtPiAgMQorZGRjbXM2MTcgY29tcGFyZXNpZyAgIDEyLjEyMzQgMTIuMDAwMDAwMCAgICAtPiAgMQorZGRjbXM2MTggY29tcGFyZXNpZyAgIDEyLjEyMzQgMTIuMDAwMDAwMDAgICAtPiAgMQorZGRjbXM2MTkgY29tcGFyZXNpZyAgIDEyLjEyMzQgMTIuMDAwMDAwMDAwICAtPiAgMQorZGRjbXM2MjAgY29tcGFyZXNpZyAgLTEyICAgICAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjbXM2MjEgY29tcGFyZXNpZyAgLTEyLjAgICAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjbXM2MjIgY29tcGFyZXNpZyAgLTEyLjAwICAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjbXM2MjMgY29tcGFyZXNpZyAgLTEyLjAwMCAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjbXM2MjQgY29tcGFyZXNpZyAgLTEyLjAwMDAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjbXM2MjUgY29tcGFyZXNpZyAgLTEyLjAwMDAwICAgICAtMTIuMjM0NSAtPiAgMQorZGRjbXM2MjYgY29tcGFyZXNpZyAgLTEyLjAwMDAwMCAgICAtMTIuMjM0NSAtPiAgMQorZGRjbXM2MjcgY29tcGFyZXNpZyAgLTEyLjAwMDAwMDAgICAtMTIuMjM0NSAtPiAgMQorZGRjbXM2MjggY29tcGFyZXNpZyAgLTEyLjAwMDAwMDAwICAtMTIuMjM0NSAtPiAgMQorZGRjbXM2MjkgY29tcGFyZXNpZyAgLTEyLjAwMDAwMDAwMCAtMTIuMjM0NSAtPiAgMQorZGRjbXM2MzAgY29tcGFyZXNpZyAgLTEyLjEyMzQgLTEyICAgICAgICAgICAtPiAtMQorZGRjbXM2MzEgY29tcGFyZXNpZyAgLTEyLjEyMzQgLTEyLjAgICAgICAgICAtPiAtMQorZGRjbXM2MzIgY29tcGFyZXNpZyAgLTEyLjEyMzQgLTEyLjAwICAgICAgICAtPiAtMQorZGRjbXM2MzMgY29tcGFyZXNpZyAgLTEyLjEyMzQgLTEyLjAwMCAgICAgICAtPiAtMQorZGRjbXM2MzQgY29tcGFyZXNpZyAgLTEyLjEyMzQgLTEyLjAwMDAgICAgICAtPiAtMQorZGRjbXM2MzUgY29tcGFyZXNpZyAgLTEyLjEyMzQgLTEyLjAwMDAwICAgICAtPiAtMQorZGRjbXM2MzYgY29tcGFyZXNpZyAgLTEyLjEyMzQgLTEyLjAwMDAwMCAgICAtPiAtMQorZGRjbXM2MzcgY29tcGFyZXNpZyAgLTEyLjEyMzQgLTEyLjAwMDAwMDAgICAtPiAtMQorZGRjbXM2MzggY29tcGFyZXNpZyAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwICAtPiAtMQorZGRjbXM2MzkgY29tcGFyZXNpZyAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwMCAtPiAtMQorCistLSBleHRlbmRlZCB6ZXJvcworZGRjbXM2NDAgY29tcGFyZXNpZyAgIDAgICAgIDAgICAtPiAwCitkZGNtczY0MSBjb21wYXJlc2lnICAgMCAgICAtMCAgIC0+IDAKK2RkY21zNjQyIGNvbXBhcmVzaWcgICAwICAgIC0wLjAgLT4gMAorZGRjbXM2NDMgY29tcGFyZXNpZyAgIDAgICAgIDAuMCAtPiAwCitkZGNtczY0NCBjb21wYXJlc2lnICAtMCAgICAgMCAgIC0+IDAKK2RkY21zNjQ1IGNvbXBhcmVzaWcgIC0wICAgIC0wICAgLT4gMAorZGRjbXM2NDYgY29tcGFyZXNpZyAgLTAgICAgLTAuMCAtPiAwCitkZGNtczY0NyBjb21wYXJlc2lnICAtMCAgICAgMC4wIC0+IDAKK2RkY21zNjQ4IGNvbXBhcmVzaWcgICAwLjAgICAwICAgLT4gMAorZGRjbXM2NDkgY29tcGFyZXNpZyAgIDAuMCAgLTAgICAtPiAwCitkZGNtczY1MCBjb21wYXJlc2lnICAgMC4wICAtMC4wIC0+IDAKK2RkY21zNjUxIGNvbXBhcmVzaWcgICAwLjAgICAwLjAgLT4gMAorZGRjbXM2NTIgY29tcGFyZXNpZyAgLTAuMCAgIDAgICAtPiAwCitkZGNtczY1MyBjb21wYXJlc2lnICAtMC4wICAtMCAgIC0+IDAKK2RkY21zNjU0IGNvbXBhcmVzaWcgIC0wLjAgIC0wLjAgLT4gMAorZGRjbXM2NTUgY29tcGFyZXNpZyAgLTAuMCAgIDAuMCAtPiAwCisKK2RkY21zNjU2IGNvbXBhcmVzaWcgIC0wRTEgICAwLjAgLT4gMAorZGRjbXM2NTcgY29tcGFyZXNpZyAgLTBFMiAgIDAuMCAtPiAwCitkZGNtczY1OCBjb21wYXJlc2lnICAgMEUxICAgMC4wIC0+IDAKK2RkY21zNjU5IGNvbXBhcmVzaWcgICAwRTIgICAwLjAgLT4gMAorZGRjbXM2NjAgY29tcGFyZXNpZyAgLTBFMSAgIDAgICAtPiAwCitkZGNtczY2MSBjb21wYXJlc2lnICAtMEUyICAgMCAgIC0+IDAKK2RkY21zNjYyIGNvbXBhcmVzaWcgICAwRTEgICAwICAgLT4gMAorZGRjbXM2NjMgY29tcGFyZXNpZyAgIDBFMiAgIDAgICAtPiAwCitkZGNtczY2NCBjb21wYXJlc2lnICAtMEUxICAtMEUxIC0+IDAKK2RkY21zNjY1IGNvbXBhcmVzaWcgIC0wRTIgIC0wRTEgLT4gMAorZGRjbXM2NjYgY29tcGFyZXNpZyAgIDBFMSAgLTBFMSAtPiAwCitkZGNtczY2NyBjb21wYXJlc2lnICAgMEUyICAtMEUxIC0+IDAKK2RkY21zNjY4IGNvbXBhcmVzaWcgIC0wRTEgIC0wRTIgLT4gMAorZGRjbXM2NjkgY29tcGFyZXNpZyAgLTBFMiAgLTBFMiAtPiAwCitkZGNtczY3MCBjb21wYXJlc2lnICAgMEUxICAtMEUyIC0+IDAKK2RkY21zNjcxIGNvbXBhcmVzaWcgICAwRTIgIC0wRTIgLT4gMAorZGRjbXM2NzIgY29tcGFyZXNpZyAgLTBFMSAgIDBFMSAtPiAwCitkZGNtczY3MyBjb21wYXJlc2lnICAtMEUyICAgMEUxIC0+IDAKK2RkY21zNjc0IGNvbXBhcmVzaWcgICAwRTEgICAwRTEgLT4gMAorZGRjbXM2NzUgY29tcGFyZXNpZyAgIDBFMiAgIDBFMSAtPiAwCitkZGNtczY3NiBjb21wYXJlc2lnICAtMEUxICAgMEUyIC0+IDAKK2RkY21zNjc3IGNvbXBhcmVzaWcgIC0wRTIgICAwRTIgLT4gMAorZGRjbXM2NzggY29tcGFyZXNpZyAgIDBFMSAgIDBFMiAtPiAwCitkZGNtczY3OSBjb21wYXJlc2lnICAgMEUyICAgMEUyIC0+IDAKKworLS0gdHJhaWxpbmcgemVyb3M7IHVuaXQteQorZGRjbXM2ODAgY29tcGFyZXNpZyAgIDEyICAgIDEyICAgICAgICAgICAtPiAwCitkZGNtczY4MSBjb21wYXJlc2lnICAgMTIgICAgMTIuMCAgICAgICAgIC0+IDAKK2RkY21zNjgyIGNvbXBhcmVzaWcgICAxMiAgICAxMi4wMCAgICAgICAgLT4gMAorZGRjbXM2ODMgY29tcGFyZXNpZyAgIDEyICAgIDEyLjAwMCAgICAgICAtPiAwCitkZGNtczY4NCBjb21wYXJlc2lnICAgMTIgICAgMTIuMDAwMCAgICAgIC0+IDAKK2RkY21zNjg1IGNvbXBhcmVzaWcgICAxMiAgICAxMi4wMDAwMCAgICAgLT4gMAorZGRjbXM2ODYgY29tcGFyZXNpZyAgIDEyICAgIDEyLjAwMDAwMCAgICAtPiAwCitkZGNtczY4NyBjb21wYXJlc2lnICAgMTIgICAgMTIuMDAwMDAwMCAgIC0+IDAKK2RkY21zNjg4IGNvbXBhcmVzaWcgICAxMiAgICAxMi4wMDAwMDAwMCAgLT4gMAorZGRjbXM2ODkgY29tcGFyZXNpZyAgIDEyICAgIDEyLjAwMDAwMDAwMCAtPiAwCitkZGNtczY5MCBjb21wYXJlc2lnICAgMTIgICAgICAgICAgICAgIDEyIC0+IDAKK2RkY21zNjkxIGNvbXBhcmVzaWcgICAxMi4wICAgICAgICAgICAgMTIgLT4gMAorZGRjbXM2OTIgY29tcGFyZXNpZyAgIDEyLjAwICAgICAgICAgICAxMiAtPiAwCitkZGNtczY5MyBjb21wYXJlc2lnICAgMTIuMDAwICAgICAgICAgIDEyIC0+IDAKK2RkY21zNjk0IGNvbXBhcmVzaWcgICAxMi4wMDAwICAgICAgICAgMTIgLT4gMAorZGRjbXM2OTUgY29tcGFyZXNpZyAgIDEyLjAwMDAwICAgICAgICAxMiAtPiAwCitkZGNtczY5NiBjb21wYXJlc2lnICAgMTIuMDAwMDAwICAgICAgIDEyIC0+IDAKK2RkY21zNjk3IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAwICAgICAgMTIgLT4gMAorZGRjbXM2OTggY29tcGFyZXNpZyAgIDEyLjAwMDAwMDAwICAgICAxMiAtPiAwCitkZGNtczY5OSBjb21wYXJlc2lnICAgMTIuMDAwMDAwMDAwICAgIDEyIC0+IDAKKworLS0gZmlyc3QsIHNlY29uZCwgJiBsYXN0IGRpZ2l0CitkZGNtczcwMCBjb21wYXJlc2lnICAgMTIzNDU2Nzg5MDEyMzQ1NiAxMjM0NTY3ODkwMTIzNDU1IC0+IDEKK2RkY21zNzAxIGNvbXBhcmVzaWcgICAxMjM0NTY3ODkwMTIzNDU2IDEyMzQ1Njc4OTAxMjM0NTYgLT4gMAorZGRjbXM3MDIgY29tcGFyZXNpZyAgIDEyMzQ1Njc4OTAxMjM0NTYgMTIzNDU2Nzg5MDEyMzQ1NyAtPiAtMQorZGRjbXM3MDMgY29tcGFyZXNpZyAgIDEyMzQ1Njc4OTAxMjM0NTYgMDIzNDU2Nzg5MDEyMzQ1NiAtPiAxCitkZGNtczcwNCBjb21wYXJlc2lnICAgMTIzNDU2Nzg5MDEyMzQ1NiAxMjM0NTY3ODkwMTIzNDU2IC0+IDAKK2RkY21zNzA1IGNvbXBhcmVzaWcgICAxMjM0NTY3ODkwMTIzNDU2IDIyMzQ1Njc4OTAxMjM0NTYgLT4gLTEKK2RkY21zNzA2IGNvbXBhcmVzaWcgICAxMTM0NTY3ODkwMTIzNDU2IDEwMzQ1Njc4OTAxMjM0NTYgLT4gMQorZGRjbXM3MDcgY29tcGFyZXNpZyAgIDExMzQ1Njc4OTAxMjM0NTYgMTEzNDU2Nzg5MDEyMzQ1NiAtPiAwCitkZGNtczcwOCBjb21wYXJlc2lnICAgMTEzNDU2Nzg5MDEyMzQ1NiAxMjM0NTY3ODkwMTIzNDU2IC0+IC0xCisKKy0tIG1pc2NlbGxhbmVvdXMKK2RkY21zNzIxIGNvbXBhcmVzaWcgMTIzNDU2NzgwMDAgMSAtPiAxCitkZGNtczcyMiBjb21wYXJlc2lnIDEgMTIzNDU2NzgwMDAgLT4gLTEKK2RkY21zNzIzIGNvbXBhcmVzaWcgMTIzNDU2NzgwMCAgMSAtPiAxCitkZGNtczcyNCBjb21wYXJlc2lnIDEgMTIzNDU2NzgwMCAgLT4gLTEKK2RkY21zNzI1IGNvbXBhcmVzaWcgMTIzNDU2Nzg5MCAgMSAtPiAxCitkZGNtczcyNiBjb21wYXJlc2lnIDEgMTIzNDU2Nzg5MCAgLT4gLTEKK2RkY21zNzI3IGNvbXBhcmVzaWcgMTIzNDU2Nzg5MSAgMSAtPiAxCitkZGNtczcyOCBjb21wYXJlc2lnIDEgMTIzNDU2Nzg5MSAgLT4gLTEKK2RkY21zNzI5IGNvbXBhcmVzaWcgMTIzNDU2Nzg5MDEgMSAtPiAxCitkZGNtczczMCBjb21wYXJlc2lnIDEgMTIzNDU2Nzg5MDEgLT4gLTEKK2RkY21zNzMxIGNvbXBhcmVzaWcgMTIzNDU2Nzg5NiAgMSAtPiAxCitkZGNtczczMiBjb21wYXJlc2lnIDEgMTIzNDU2Nzg5NiAgLT4gLTEKKworLS0gcmVzaWR1ZSBjYXNlcyBhdCBsb3dlciBwcmVjaXNpb24KK2RkY21zNzQwIGNvbXBhcmVzaWcgIDEgIDAuOTk5OTk5OSAgLT4gMQorZGRjbXM3NDEgY29tcGFyZXNpZyAgMSAgMC45OTk5OTkgICAtPiAxCitkZGNtczc0MiBjb21wYXJlc2lnICAxICAwLjk5OTk5ICAgIC0+IDEKK2RkY21zNzQzIGNvbXBhcmVzaWcgIDEgIDEuMDAwMCAgICAgLT4gMAorZGRjbXM3NDQgY29tcGFyZXNpZyAgMSAgMS4wMDAwMSAgICAtPiAtMQorZGRjbXM3NDUgY29tcGFyZXNpZyAgMSAgMS4wMDAwMDEgICAtPiAtMQorZGRjbXM3NDYgY29tcGFyZXNpZyAgMSAgMS4wMDAwMDAxICAtPiAtMQorZGRjbXM3NTAgY29tcGFyZXNpZyAgMC45OTk5OTk5ICAxICAtPiAtMQorZGRjbXM3NTEgY29tcGFyZXNpZyAgMC45OTk5OTkgICAxICAtPiAtMQorZGRjbXM3NTIgY29tcGFyZXNpZyAgMC45OTk5OSAgICAxICAtPiAtMQorZGRjbXM3NTMgY29tcGFyZXNpZyAgMS4wMDAwICAgICAxICAtPiAwCitkZGNtczc1NCBjb21wYXJlc2lnICAxLjAwMDAxICAgIDEgIC0+IDEKK2RkY21zNzU1IGNvbXBhcmVzaWcgIDEuMDAwMDAxICAgMSAgLT4gMQorZGRjbXM3NTYgY29tcGFyZXNpZyAgMS4wMDAwMDAxICAxICAtPiAxCisKKy0tIFNwZWNpYWxzCitkZGNtczc4MCBjb21wYXJlc2lnICBJbmYgIC1JbmYgICAtPiAgMQorZGRjbXM3ODEgY29tcGFyZXNpZyAgSW5mICAtMTAwMCAgLT4gIDEKK2RkY21zNzgyIGNvbXBhcmVzaWcgIEluZiAgLTEgICAgIC0+ICAxCitkZGNtczc4MyBjb21wYXJlc2lnICBJbmYgIC0wICAgICAtPiAgMQorZGRjbXM3ODQgY29tcGFyZXNpZyAgSW5mICAgMCAgICAgLT4gIDEKK2RkY21zNzg1IGNvbXBhcmVzaWcgIEluZiAgIDEgICAgIC0+ICAxCitkZGNtczc4NiBjb21wYXJlc2lnICBJbmYgICAxMDAwICAtPiAgMQorZGRjbXM3ODcgY29tcGFyZXNpZyAgSW5mICAgSW5mICAgLT4gIDAKK2RkY21zNzg4IGNvbXBhcmVzaWcgLTEwMDAgIEluZiAgIC0+IC0xCitkZGNtczc4OSBjb21wYXJlc2lnIC1JbmYgICBJbmYgICAtPiAtMQorZGRjbXM3OTAgY29tcGFyZXNpZyAtMSAgICAgSW5mICAgLT4gLTEKK2RkY21zNzkxIGNvbXBhcmVzaWcgLTAgICAgIEluZiAgIC0+IC0xCitkZGNtczc5MiBjb21wYXJlc2lnICAwICAgICBJbmYgICAtPiAtMQorZGRjbXM3OTMgY29tcGFyZXNpZyAgMSAgICAgSW5mICAgLT4gLTEKK2RkY21zNzk0IGNvbXBhcmVzaWcgIDEwMDAgIEluZiAgIC0+IC0xCitkZGNtczc5NSBjb21wYXJlc2lnICBJbmYgICBJbmYgICAtPiAgMAorCitkZGNtczgwMCBjb21wYXJlc2lnIC1JbmYgIC1JbmYgICAtPiAgMAorZGRjbXM4MDEgY29tcGFyZXNpZyAtSW5mICAtMTAwMCAgLT4gLTEKK2RkY21zODAyIGNvbXBhcmVzaWcgLUluZiAgLTEgICAgIC0+IC0xCitkZGNtczgwMyBjb21wYXJlc2lnIC1JbmYgIC0wICAgICAtPiAtMQorZGRjbXM4MDQgY29tcGFyZXNpZyAtSW5mICAgMCAgICAgLT4gLTEKK2RkY21zODA1IGNvbXBhcmVzaWcgLUluZiAgIDEgICAgIC0+IC0xCitkZGNtczgwNiBjb21wYXJlc2lnIC1JbmYgICAxMDAwICAtPiAtMQorZGRjbXM4MDcgY29tcGFyZXNpZyAtSW5mICAgSW5mICAgLT4gLTEKK2RkY21zODA4IGNvbXBhcmVzaWcgLUluZiAgLUluZiAgIC0+ICAwCitkZGNtczgwOSBjb21wYXJlc2lnIC0xMDAwIC1JbmYgICAtPiAgMQorZGRjbXM4MTAgY29tcGFyZXNpZyAtMSAgICAtSW5mICAgLT4gIDEKK2RkY21zODExIGNvbXBhcmVzaWcgLTAgICAgLUluZiAgIC0+ICAxCitkZGNtczgxMiBjb21wYXJlc2lnICAwICAgIC1JbmYgICAtPiAgMQorZGRjbXM4MTMgY29tcGFyZXNpZyAgMSAgICAtSW5mICAgLT4gIDEKK2RkY21zODE0IGNvbXBhcmVzaWcgIDEwMDAgLUluZiAgIC0+ICAxCitkZGNtczgxNSBjb21wYXJlc2lnICBJbmYgIC1JbmYgICAtPiAgMQorCitkZGNtczgyMSBjb21wYXJlc2lnICBOYU4gLUluZiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4MjIgY29tcGFyZXNpZyAgTmFOIC0xMDAwICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODIzIGNvbXBhcmVzaWcgIE5hTiAtMSAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczgyNCBjb21wYXJlc2lnICBOYU4gLTAgICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4MjUgY29tcGFyZXNpZyAgTmFOICAwICAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODI2IGNvbXBhcmVzaWcgIE5hTiAgMSAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczgyNyBjb21wYXJlc2lnICBOYU4gIDEwMDAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4MjggY29tcGFyZXNpZyAgTmFOICBJbmYgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODI5IGNvbXBhcmVzaWcgIE5hTiAgTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczgzMCBjb21wYXJlc2lnIC1JbmYgIE5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4MzEgY29tcGFyZXNpZyAtMTAwMCBOYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODMyIGNvbXBhcmVzaWcgLTEgICAgTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczgzMyBjb21wYXJlc2lnIC0wICAgIE5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4MzQgY29tcGFyZXNpZyAgMCAgICBOYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODM1IGNvbXBhcmVzaWcgIDEgICAgTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczgzNiBjb21wYXJlc2lnICAxMDAwIE5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4MzcgY29tcGFyZXNpZyAgSW5mICBOYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODM4IGNvbXBhcmVzaWcgLU5hTiAtTmFOICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczgzOSBjb21wYXJlc2lnICtOYU4gLU5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NDAgY29tcGFyZXNpZyAtTmFOICtOYU4gICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworZGRjbXM4NDEgY29tcGFyZXNpZyAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODQyIGNvbXBhcmVzaWcgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg0MyBjb21wYXJlc2lnICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NDQgY29tcGFyZXNpZyAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODQ1IGNvbXBhcmVzaWcgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg0NiBjb21wYXJlc2lnICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NDcgY29tcGFyZXNpZyAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODQ4IGNvbXBhcmVzaWcgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg0OSBjb21wYXJlc2lnICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NTAgY29tcGFyZXNpZyAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODUxIGNvbXBhcmVzaWcgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg1MiBjb21wYXJlc2lnIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NTMgY29tcGFyZXNpZyAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODU0IGNvbXBhcmVzaWcgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg1NSBjb21wYXJlc2lnICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NTYgY29tcGFyZXNpZyAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODU3IGNvbXBhcmVzaWcgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg1OCBjb21wYXJlc2lnICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NTkgY29tcGFyZXNpZyAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRjbXM4NjAgY29tcGFyZXNpZyAgTmFOOSAtSW5mICAgLT4gIE5hTjkgICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NjEgY29tcGFyZXNpZyAgTmFOOCAgOTk5ICAgLT4gIE5hTjggICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NjIgY29tcGFyZXNpZyAgTmFONzcgSW5mICAgLT4gIE5hTjc3ICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NjMgY29tcGFyZXNpZyAtTmFONjcgTmFONSAgLT4gLU5hTjY3ICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NjQgY29tcGFyZXNpZyAtSW5mICAtTmFONCAgLT4gLU5hTjQgICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NjUgY29tcGFyZXNpZyAtOTk5ICAtTmFOMzMgLT4gLU5hTjMzICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NjYgY29tcGFyZXNpZyAgSW5mICAgTmFOMiAgLT4gIE5hTjIgICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NjcgY29tcGFyZXNpZyAtTmFONDEgLU5hTjQyIC0+IC1OYU40MSBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NjggY29tcGFyZXNpZyArTmFONDEgLU5hTjQyIC0+ICBOYU40MSBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NjkgY29tcGFyZXNpZyAtTmFONDEgK05hTjQyIC0+IC1OYU40MSBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NzAgY29tcGFyZXNpZyArTmFONDEgK05hTjQyIC0+ICBOYU40MSBJbnZhbGlkX29wZXJhdGlvbgorCitkZGNtczg3MSBjb21wYXJlc2lnIC1zTmFOOTkgLUluZiAgICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODcyIGNvbXBhcmVzaWcgIHNOYU45OCAtMTEgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NzMgY29tcGFyZXNpZyAgc05hTjk3ICBOYU4gICAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg3NCBjb21wYXJlc2lnICBzTmFOMTYgc05hTjk0ICAtPiAgTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODc1IGNvbXBhcmVzaWcgIE5hTjg1ICBzTmFOODMgIC0+ICBOYU44MyBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NzYgY29tcGFyZXNpZyAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg3NyBjb21wYXJlc2lnICAwODggICAgc05hTjgxICAtPiAgTmFOODEgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODc4IGNvbXBhcmVzaWcgIEluZiAgICBzTmFOOTAgIC0+ICBOYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NzkgY29tcGFyZXNpZyAgTmFOICAgLXNOYU44OSAgLT4gLU5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHdpZGUgcmFuZ2UKK2RkY21zODgwIGNvbXBhcmVzaWcgKzEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrMzg0IC0+IC0xCitkZGNtczg4MSBjb21wYXJlc2lnIDlFKzM4NCArMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAgMQorZGRjbXM4ODIgY29tcGFyZXNpZyArMC4xMDAgOUUtMzgzICAgICAgICAgICAgICAgLT4gIDEKK2RkY21zODgzIGNvbXBhcmVzaWcgOUUtMzgzICswLjEwMCAgICAgICAgICAgICAgIC0+IC0xCitkZGNtczg4NSBjb21wYXJlc2lnIC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzM4NCAtPiAtMQorZGRjbXM4ODYgY29tcGFyZXNpZyA5RSszODQgLTEuMjM0NTY3ODkwMTIzNDVFLTAgLT4gIDEKK2RkY21zODg3IGNvbXBhcmVzaWcgLTAuMTAwIDlFLTM4MyAgICAgICAgICAgICAgIC0+IC0xCitkZGNtczg4OCBjb21wYXJlc2lnIDlFLTM4MyAtMC4xMDAgICAgICAgICAgICAgICAtPiAgMQorCistLSBzaWducworZGRjbXM5MDEgY29tcGFyZXNpZyAgMWUrNzcgIDFlKzExIC0+ICAxCitkZGNtczkwMiBjb21wYXJlc2lnICAxZSs3NyAtMWUrMTEgLT4gIDEKK2RkY21zOTAzIGNvbXBhcmVzaWcgLTFlKzc3ICAxZSsxMSAtPiAtMQorZGRjbXM5MDQgY29tcGFyZXNpZyAtMWUrNzcgLTFlKzExIC0+IC0xCitkZGNtczkwNSBjb21wYXJlc2lnICAxZS03NyAgMWUtMTEgLT4gLTEKK2RkY21zOTA2IGNvbXBhcmVzaWcgIDFlLTc3IC0xZS0xMSAtPiAgMQorZGRjbXM5MDcgY29tcGFyZXNpZyAtMWUtNzcgIDFlLTExIC0+IC0xCitkZGNtczkwOCBjb21wYXJlc2lnIC0xZS03NyAtMWUtMTEgLT4gIDEKKworLS0gTnVsbCB0ZXN0cworZGRjbXM5OTAgY29tcGFyZXNpZyAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkY21zOTkxIGNvbXBhcmVzaWcgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29tcGFyZVRvdGFsLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29tcGFyZVRvdGFsLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjOTg0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb21wYXJlVG90YWwuZGVjVGVzdApAQCAtMCwwICsxLDcwNiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZENvbXBhcmVUb3RhbC5kZWNUZXN0IC0tIGRlY0RvdWJsZSBjb21wYXJpc29uIHVzaW5nIHRvdGFsIG9yZGVyaW5nLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIE5vdGUgdGhhdCB3ZSBjYW5ub3QgYXNzdW1lIGFkZC9zdWJ0cmFjdCB0ZXN0cyBjb3ZlciBwYXRocyBhZGVxdWF0ZWx5LAorLS0gaGVyZSwgYmVjYXVzZSB0aGUgY29kZSBtaWdodCBiZSBxdWl0ZSBkaWZmZXJlbnQgKGNvbXBhcmlzb24gY2Fubm90CistLSBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHNvIGFjdHVhbCBzdWJ0cmFjdGlvbnMgYXJlIG5vdCBuZWNlc3NhcnkpLgorLS0gU2ltaWxhcmx5LCBjb21wYXJldG90YWwgd2lsbCBoYXZlIHNvbWUgcmFkaWNhbGx5IGRpZmZlcmVudCBwYXRocworLS0gdGhhbiBjb21wYXJlLgorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY0RvdWJsZXMuCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZGRjb3QwMDEgY29tcGFyZXRvdGFsICAtMiAgLTIgIC0+IDAKK2RkY290MDAyIGNvbXBhcmV0b3RhbCAgLTIgIC0xICAtPiAtMQorZGRjb3QwMDMgY29tcGFyZXRvdGFsICAtMiAgIDAgIC0+IC0xCitkZGNvdDAwNCBjb21wYXJldG90YWwgIC0yICAgMSAgLT4gLTEKK2RkY290MDA1IGNvbXBhcmV0b3RhbCAgLTIgICAyICAtPiAtMQorZGRjb3QwMDYgY29tcGFyZXRvdGFsICAtMSAgLTIgIC0+IDEKK2RkY290MDA3IGNvbXBhcmV0b3RhbCAgLTEgIC0xICAtPiAwCitkZGNvdDAwOCBjb21wYXJldG90YWwgIC0xICAgMCAgLT4gLTEKK2RkY290MDA5IGNvbXBhcmV0b3RhbCAgLTEgICAxICAtPiAtMQorZGRjb3QwMTAgY29tcGFyZXRvdGFsICAtMSAgIDIgIC0+IC0xCitkZGNvdDAxMSBjb21wYXJldG90YWwgICAwICAtMiAgLT4gMQorZGRjb3QwMTIgY29tcGFyZXRvdGFsICAgMCAgLTEgIC0+IDEKK2RkY290MDEzIGNvbXBhcmV0b3RhbCAgIDAgICAwICAtPiAwCitkZGNvdDAxNCBjb21wYXJldG90YWwgICAwICAgMSAgLT4gLTEKK2RkY290MDE1IGNvbXBhcmV0b3RhbCAgIDAgICAyICAtPiAtMQorZGRjb3QwMTYgY29tcGFyZXRvdGFsICAgMSAgLTIgIC0+IDEKK2RkY290MDE3IGNvbXBhcmV0b3RhbCAgIDEgIC0xICAtPiAxCitkZGNvdDAxOCBjb21wYXJldG90YWwgICAxICAgMCAgLT4gMQorZGRjb3QwMTkgY29tcGFyZXRvdGFsICAgMSAgIDEgIC0+IDAKK2RkY290MDIwIGNvbXBhcmV0b3RhbCAgIDEgICAyICAtPiAtMQorZGRjb3QwMjEgY29tcGFyZXRvdGFsICAgMiAgLTIgIC0+IDEKK2RkY290MDIyIGNvbXBhcmV0b3RhbCAgIDIgIC0xICAtPiAxCitkZGNvdDAyMyBjb21wYXJldG90YWwgICAyICAgMCAgLT4gMQorZGRjb3QwMjUgY29tcGFyZXRvdGFsICAgMiAgIDEgIC0+IDEKK2RkY290MDI2IGNvbXBhcmV0b3RhbCAgIDIgICAyICAtPiAwCisKK2RkY290MDMxIGNvbXBhcmV0b3RhbCAgLTIwICAtMjAgIC0+IDAKK2RkY290MDMyIGNvbXBhcmV0b3RhbCAgLTIwICAtMTAgIC0+IC0xCitkZGNvdDAzMyBjb21wYXJldG90YWwgIC0yMCAgIDAwICAtPiAtMQorZGRjb3QwMzQgY29tcGFyZXRvdGFsICAtMjAgICAxMCAgLT4gLTEKK2RkY290MDM1IGNvbXBhcmV0b3RhbCAgLTIwICAgMjAgIC0+IC0xCitkZGNvdDAzNiBjb21wYXJldG90YWwgIC0xMCAgLTIwICAtPiAxCitkZGNvdDAzNyBjb21wYXJldG90YWwgIC0xMCAgLTEwICAtPiAwCitkZGNvdDAzOCBjb21wYXJldG90YWwgIC0xMCAgIDAwICAtPiAtMQorZGRjb3QwMzkgY29tcGFyZXRvdGFsICAtMTAgICAxMCAgLT4gLTEKK2RkY290MDQwIGNvbXBhcmV0b3RhbCAgLTEwICAgMjAgIC0+IC0xCitkZGNvdDA0MSBjb21wYXJldG90YWwgICAwMCAgLTIwICAtPiAxCitkZGNvdDA0MiBjb21wYXJldG90YWwgICAwMCAgLTEwICAtPiAxCitkZGNvdDA0MyBjb21wYXJldG90YWwgICAwMCAgIDAwICAtPiAwCitkZGNvdDA0NCBjb21wYXJldG90YWwgICAwMCAgIDEwICAtPiAtMQorZGRjb3QwNDUgY29tcGFyZXRvdGFsICAgMDAgICAyMCAgLT4gLTEKK2RkY290MDQ2IGNvbXBhcmV0b3RhbCAgIDEwICAtMjAgIC0+IDEKK2RkY290MDQ3IGNvbXBhcmV0b3RhbCAgIDEwICAtMTAgIC0+IDEKK2RkY290MDQ4IGNvbXBhcmV0b3RhbCAgIDEwICAgMDAgIC0+IDEKK2RkY290MDQ5IGNvbXBhcmV0b3RhbCAgIDEwICAgMTAgIC0+IDAKK2RkY290MDUwIGNvbXBhcmV0b3RhbCAgIDEwICAgMjAgIC0+IC0xCitkZGNvdDA1MSBjb21wYXJldG90YWwgICAyMCAgLTIwICAtPiAxCitkZGNvdDA1MiBjb21wYXJldG90YWwgICAyMCAgLTEwICAtPiAxCitkZGNvdDA1MyBjb21wYXJldG90YWwgICAyMCAgIDAwICAtPiAxCitkZGNvdDA1NSBjb21wYXJldG90YWwgICAyMCAgIDEwICAtPiAxCitkZGNvdDA1NiBjb21wYXJldG90YWwgICAyMCAgIDIwICAtPiAwCisKK2RkY290MDYxIGNvbXBhcmV0b3RhbCAgLTIuMCAgLTIuMCAgLT4gMAorZGRjb3QwNjIgY29tcGFyZXRvdGFsICAtMi4wICAtMS4wICAtPiAtMQorZGRjb3QwNjMgY29tcGFyZXRvdGFsICAtMi4wICAgMC4wICAtPiAtMQorZGRjb3QwNjQgY29tcGFyZXRvdGFsICAtMi4wICAgMS4wICAtPiAtMQorZGRjb3QwNjUgY29tcGFyZXRvdGFsICAtMi4wICAgMi4wICAtPiAtMQorZGRjb3QwNjYgY29tcGFyZXRvdGFsICAtMS4wICAtMi4wICAtPiAxCitkZGNvdDA2NyBjb21wYXJldG90YWwgIC0xLjAgIC0xLjAgIC0+IDAKK2RkY290MDY4IGNvbXBhcmV0b3RhbCAgLTEuMCAgIDAuMCAgLT4gLTEKK2RkY290MDY5IGNvbXBhcmV0b3RhbCAgLTEuMCAgIDEuMCAgLT4gLTEKK2RkY290MDcwIGNvbXBhcmV0b3RhbCAgLTEuMCAgIDIuMCAgLT4gLTEKK2RkY290MDcxIGNvbXBhcmV0b3RhbCAgIDAuMCAgLTIuMCAgLT4gMQorZGRjb3QwNzIgY29tcGFyZXRvdGFsICAgMC4wICAtMS4wICAtPiAxCitkZGNvdDA3MyBjb21wYXJldG90YWwgICAwLjAgICAwLjAgIC0+IDAKK2RkY290MDc0IGNvbXBhcmV0b3RhbCAgIDAuMCAgIDEuMCAgLT4gLTEKK2RkY290MDc1IGNvbXBhcmV0b3RhbCAgIDAuMCAgIDIuMCAgLT4gLTEKK2RkY290MDc2IGNvbXBhcmV0b3RhbCAgIDEuMCAgLTIuMCAgLT4gMQorZGRjb3QwNzcgY29tcGFyZXRvdGFsICAgMS4wICAtMS4wICAtPiAxCitkZGNvdDA3OCBjb21wYXJldG90YWwgICAxLjAgICAwLjAgIC0+IDEKK2RkY290MDc5IGNvbXBhcmV0b3RhbCAgIDEuMCAgIDEuMCAgLT4gMAorZGRjb3QwODAgY29tcGFyZXRvdGFsICAgMS4wICAgMi4wICAtPiAtMQorZGRjb3QwODEgY29tcGFyZXRvdGFsICAgMi4wICAtMi4wICAtPiAxCitkZGNvdDA4MiBjb21wYXJldG90YWwgICAyLjAgIC0xLjAgIC0+IDEKK2RkY290MDgzIGNvbXBhcmV0b3RhbCAgIDIuMCAgIDAuMCAgLT4gMQorZGRjb3QwODUgY29tcGFyZXRvdGFsICAgMi4wICAgMS4wICAtPiAxCitkZGNvdDA4NiBjb21wYXJldG90YWwgICAyLjAgICAyLjAgIC0+IDAKKworLS0gbm93IHNvbWUgY2FzZXMgd2hpY2ggbWlnaHQgb3ZlcmZsb3cgaWYgc3VidHJhY3Qgd2VyZSB1c2VkCitkZGNvdDA5MCBjb21wYXJldG90YWwgIDkuOTk5OTk5OTlFKzM4NCA5Ljk5OTk5OTk5RSszODQgIC0+IDAKK2RkY290MDkxIGNvbXBhcmV0b3RhbCAtOS45OTk5OTk5OUUrMzg0IDkuOTk5OTk5OTlFKzM4NCAgLT4gLTEKK2RkY290MDkyIGNvbXBhcmV0b3RhbCAgOS45OTk5OTk5OUUrMzg0IC05Ljk5OTk5OTk5RSszODQgLT4gMQorZGRjb3QwOTMgY29tcGFyZXRvdGFsIC05Ljk5OTk5OTk5RSszODQgLTkuOTk5OTk5OTlFKzM4NCAtPiAwCisKKy0tIHNvbWUgZGlmZmVyaW5nIGxlbmd0aC9leHBvbmVudCBjYXNlcworLS0gaW4gdGhpcyBmaXJzdCBncm91cCwgY29tcGFyZSB3b3VsZCBjb21wYXJlIGFsbCBlcXVhbAorZGRjb3QxMDAgY29tcGFyZXRvdGFsICAgNy4wICAgIDcuMCAgICAtPiAwCitkZGNvdDEwMSBjb21wYXJldG90YWwgICA3LjAgICAgNyAgICAgIC0+IC0xCitkZGNvdDEwMiBjb21wYXJldG90YWwgICA3ICAgICAgNy4wICAgIC0+IDEKK2RkY290MTAzIGNvbXBhcmV0b3RhbCAgIDdFKzAgICA3LjAgICAgLT4gMQorZGRjb3QxMDQgY29tcGFyZXRvdGFsICAgNzBFLTEgIDcuMCAgICAtPiAwCitkZGNvdDEwNSBjb21wYXJldG90YWwgICAwLjdFKzEgNyAgICAgIC0+IDAKK2RkY290MTA2IGNvbXBhcmV0b3RhbCAgIDcwRS0xICA3ICAgICAgLT4gLTEKK2RkY290MTA3IGNvbXBhcmV0b3RhbCAgIDcuMCAgICA3RSswICAgLT4gLTEKK2RkY290MTA4IGNvbXBhcmV0b3RhbCAgIDcuMCAgICA3MEUtMSAgLT4gMAorZGRjb3QxMDkgY29tcGFyZXRvdGFsICAgNyAgICAgIDAuN0UrMSAtPiAwCitkZGNvdDExMCBjb21wYXJldG90YWwgICA3ICAgICAgNzBFLTEgIC0+IDEKKworZGRjb3QxMjAgY29tcGFyZXRvdGFsICAgOC4wICAgIDcuMCAgICAtPiAxCitkZGNvdDEyMSBjb21wYXJldG90YWwgICA4LjAgICAgNyAgICAgIC0+IDEKK2RkY290MTIyIGNvbXBhcmV0b3RhbCAgIDggICAgICA3LjAgICAgLT4gMQorZGRjb3QxMjMgY29tcGFyZXRvdGFsICAgOEUrMCAgIDcuMCAgICAtPiAxCitkZGNvdDEyNCBjb21wYXJldG90YWwgICA4MEUtMSAgNy4wICAgIC0+IDEKK2RkY290MTI1IGNvbXBhcmV0b3RhbCAgIDAuOEUrMSA3ICAgICAgLT4gMQorZGRjb3QxMjYgY29tcGFyZXRvdGFsICAgODBFLTEgIDcgICAgICAtPiAxCitkZGNvdDEyNyBjb21wYXJldG90YWwgICA4LjAgICAgN0UrMCAgIC0+IDEKK2RkY290MTI4IGNvbXBhcmV0b3RhbCAgIDguMCAgICA3MEUtMSAgLT4gMQorZGRjb3QxMjkgY29tcGFyZXRvdGFsICAgOCAgICAgIDAuN0UrMSAgLT4gMQorZGRjb3QxMzAgY29tcGFyZXRvdGFsICAgOCAgICAgIDcwRS0xICAtPiAxCisKK2RkY290MTQwIGNvbXBhcmV0b3RhbCAgIDguMCAgICA5LjAgICAgLT4gLTEKK2RkY290MTQxIGNvbXBhcmV0b3RhbCAgIDguMCAgICA5ICAgICAgLT4gLTEKK2RkY290MTQyIGNvbXBhcmV0b3RhbCAgIDggICAgICA5LjAgICAgLT4gLTEKK2RkY290MTQzIGNvbXBhcmV0b3RhbCAgIDhFKzAgICA5LjAgICAgLT4gLTEKK2RkY290MTQ0IGNvbXBhcmV0b3RhbCAgIDgwRS0xICA5LjAgICAgLT4gLTEKK2RkY290MTQ1IGNvbXBhcmV0b3RhbCAgIDAuOEUrMSA5ICAgICAgLT4gLTEKK2RkY290MTQ2IGNvbXBhcmV0b3RhbCAgIDgwRS0xICA5ICAgICAgLT4gLTEKK2RkY290MTQ3IGNvbXBhcmV0b3RhbCAgIDguMCAgICA5RSswICAgLT4gLTEKK2RkY290MTQ4IGNvbXBhcmV0b3RhbCAgIDguMCAgICA5MEUtMSAgLT4gLTEKK2RkY290MTQ5IGNvbXBhcmV0b3RhbCAgIDggICAgICAwLjlFKzEgLT4gLTEKK2RkY290MTUwIGNvbXBhcmV0b3RhbCAgIDggICAgICA5MEUtMSAgLT4gLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyAtKyAuLgorZGRjb3QyMDAgY29tcGFyZXRvdGFsICAtNy4wICAgIDcuMCAgICAtPiAtMQorZGRjb3QyMDEgY29tcGFyZXRvdGFsICAtNy4wICAgIDcgICAgICAtPiAtMQorZGRjb3QyMDIgY29tcGFyZXRvdGFsICAtNyAgICAgIDcuMCAgICAtPiAtMQorZGRjb3QyMDMgY29tcGFyZXRvdGFsICAtN0UrMCAgIDcuMCAgICAtPiAtMQorZGRjb3QyMDQgY29tcGFyZXRvdGFsICAtNzBFLTEgIDcuMCAgICAtPiAtMQorZGRjb3QyMDUgY29tcGFyZXRvdGFsICAtMC43RSsxIDcgICAgICAtPiAtMQorZGRjb3QyMDYgY29tcGFyZXRvdGFsICAtNzBFLTEgIDcgICAgICAtPiAtMQorZGRjb3QyMDcgY29tcGFyZXRvdGFsICAtNy4wICAgIDdFKzAgICAtPiAtMQorZGRjb3QyMDggY29tcGFyZXRvdGFsICAtNy4wICAgIDcwRS0xICAtPiAtMQorZGRjb3QyMDkgY29tcGFyZXRvdGFsICAtNyAgICAgIDAuN0UrMSAtPiAtMQorZGRjb3QyMTAgY29tcGFyZXRvdGFsICAtNyAgICAgIDcwRS0xICAtPiAtMQorCitkZGNvdDIyMCBjb21wYXJldG90YWwgIC04LjAgICAgNy4wICAgIC0+IC0xCitkZGNvdDIyMSBjb21wYXJldG90YWwgIC04LjAgICAgNyAgICAgIC0+IC0xCitkZGNvdDIyMiBjb21wYXJldG90YWwgIC04ICAgICAgNy4wICAgIC0+IC0xCitkZGNvdDIyMyBjb21wYXJldG90YWwgIC04RSswICAgNy4wICAgIC0+IC0xCitkZGNvdDIyNCBjb21wYXJldG90YWwgIC04MEUtMSAgNy4wICAgIC0+IC0xCitkZGNvdDIyNSBjb21wYXJldG90YWwgIC0wLjhFKzEgNyAgICAgIC0+IC0xCitkZGNvdDIyNiBjb21wYXJldG90YWwgIC04MEUtMSAgNyAgICAgIC0+IC0xCitkZGNvdDIyNyBjb21wYXJldG90YWwgIC04LjAgICAgN0UrMCAgIC0+IC0xCitkZGNvdDIyOCBjb21wYXJldG90YWwgIC04LjAgICAgNzBFLTEgIC0+IC0xCitkZGNvdDIyOSBjb21wYXJldG90YWwgIC04ICAgICAgMC43RSsxIC0+IC0xCitkZGNvdDIzMCBjb21wYXJldG90YWwgIC04ICAgICAgNzBFLTEgIC0+IC0xCisKK2RkY290MjQwIGNvbXBhcmV0b3RhbCAgLTguMCAgICA5LjAgICAgLT4gLTEKK2RkY290MjQxIGNvbXBhcmV0b3RhbCAgLTguMCAgICA5ICAgICAgLT4gLTEKK2RkY290MjQyIGNvbXBhcmV0b3RhbCAgLTggICAgICA5LjAgICAgLT4gLTEKK2RkY290MjQzIGNvbXBhcmV0b3RhbCAgLThFKzAgICA5LjAgICAgLT4gLTEKK2RkY290MjQ0IGNvbXBhcmV0b3RhbCAgLTgwRS0xICA5LjAgICAgLT4gLTEKK2RkY290MjQ1IGNvbXBhcmV0b3RhbCAgLTAuOEUrMSA5ICAgICAgLT4gLTEKK2RkY290MjQ2IGNvbXBhcmV0b3RhbCAgLTgwRS0xICA5ICAgICAgLT4gLTEKK2RkY290MjQ3IGNvbXBhcmV0b3RhbCAgLTguMCAgICA5RSswICAgLT4gLTEKK2RkY290MjQ4IGNvbXBhcmV0b3RhbCAgLTguMCAgICA5MEUtMSAgLT4gLTEKK2RkY290MjQ5IGNvbXBhcmV0b3RhbCAgLTggICAgICAwLjlFKzEgLT4gLTEKK2RkY290MjUwIGNvbXBhcmV0b3RhbCAgLTggICAgICA5MEUtMSAgLT4gLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyArLSAuLgorZGRjb3QzMDAgY29tcGFyZXRvdGFsICAgNy4wICAgIC03LjAgICAgLT4gMQorZGRjb3QzMDEgY29tcGFyZXRvdGFsICAgNy4wICAgIC03ICAgICAgLT4gMQorZGRjb3QzMDIgY29tcGFyZXRvdGFsICAgNyAgICAgIC03LjAgICAgLT4gMQorZGRjb3QzMDMgY29tcGFyZXRvdGFsICAgN0UrMCAgIC03LjAgICAgLT4gMQorZGRjb3QzMDQgY29tcGFyZXRvdGFsICAgNzBFLTEgIC03LjAgICAgLT4gMQorZGRjb3QzMDUgY29tcGFyZXRvdGFsICAgLjdFKzEgIC03ICAgICAgLT4gMQorZGRjb3QzMDYgY29tcGFyZXRvdGFsICAgNzBFLTEgIC03ICAgICAgLT4gMQorZGRjb3QzMDcgY29tcGFyZXRvdGFsICAgNy4wICAgIC03RSswICAgLT4gMQorZGRjb3QzMDggY29tcGFyZXRvdGFsICAgNy4wICAgIC03MEUtMSAgLT4gMQorZGRjb3QzMDkgY29tcGFyZXRvdGFsICAgNyAgICAgIC0uN0UrMSAgLT4gMQorZGRjb3QzMTAgY29tcGFyZXRvdGFsICAgNyAgICAgIC03MEUtMSAgLT4gMQorCitkZGNvdDMyMCBjb21wYXJldG90YWwgICA4LjAgICAgLTcuMCAgICAtPiAxCitkZGNvdDMyMSBjb21wYXJldG90YWwgICA4LjAgICAgLTcgICAgICAtPiAxCitkZGNvdDMyMiBjb21wYXJldG90YWwgICA4ICAgICAgLTcuMCAgICAtPiAxCitkZGNvdDMyMyBjb21wYXJldG90YWwgICA4RSswICAgLTcuMCAgICAtPiAxCitkZGNvdDMyNCBjb21wYXJldG90YWwgICA4MEUtMSAgLTcuMCAgICAtPiAxCitkZGNvdDMyNSBjb21wYXJldG90YWwgICAuOEUrMSAgLTcgICAgICAtPiAxCitkZGNvdDMyNiBjb21wYXJldG90YWwgICA4MEUtMSAgLTcgICAgICAtPiAxCitkZGNvdDMyNyBjb21wYXJldG90YWwgICA4LjAgICAgLTdFKzAgICAtPiAxCitkZGNvdDMyOCBjb21wYXJldG90YWwgICA4LjAgICAgLTcwRS0xICAtPiAxCitkZGNvdDMyOSBjb21wYXJldG90YWwgICA4ICAgICAgLS43RSsxICAtPiAxCitkZGNvdDMzMCBjb21wYXJldG90YWwgICA4ICAgICAgLTcwRS0xICAtPiAxCisKK2RkY290MzQwIGNvbXBhcmV0b3RhbCAgIDguMCAgICAtOS4wICAgIC0+IDEKK2RkY290MzQxIGNvbXBhcmV0b3RhbCAgIDguMCAgICAtOSAgICAgIC0+IDEKK2RkY290MzQyIGNvbXBhcmV0b3RhbCAgIDggICAgICAtOS4wICAgIC0+IDEKK2RkY290MzQzIGNvbXBhcmV0b3RhbCAgIDhFKzAgICAtOS4wICAgIC0+IDEKK2RkY290MzQ0IGNvbXBhcmV0b3RhbCAgIDgwRS0xICAtOS4wICAgIC0+IDEKK2RkY290MzQ1IGNvbXBhcmV0b3RhbCAgIC44RSsxICAtOSAgICAgIC0+IDEKK2RkY290MzQ2IGNvbXBhcmV0b3RhbCAgIDgwRS0xICAtOSAgICAgIC0+IDEKK2RkY290MzQ3IGNvbXBhcmV0b3RhbCAgIDguMCAgICAtOUUrMCAgIC0+IDEKK2RkY290MzQ4IGNvbXBhcmV0b3RhbCAgIDguMCAgICAtOTBFLTEgIC0+IDEKK2RkY290MzQ5IGNvbXBhcmV0b3RhbCAgIDggICAgICAtLjlFKzEgIC0+IDEKK2RkY290MzUwIGNvbXBhcmV0b3RhbCAgIDggICAgICAtOTBFLTEgIC0+IDEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyAtLSAuLgorZGRjb3Q0MDAgY29tcGFyZXRvdGFsICAgLTcuMCAgICAtNy4wICAgIC0+IDAKK2RkY290NDAxIGNvbXBhcmV0b3RhbCAgIC03LjAgICAgLTcgICAgICAtPiAxCitkZGNvdDQwMiBjb21wYXJldG90YWwgICAtNyAgICAgIC03LjAgICAgLT4gLTEKK2RkY290NDAzIGNvbXBhcmV0b3RhbCAgIC03RSswICAgLTcuMCAgICAtPiAtMQorZGRjb3Q0MDQgY29tcGFyZXRvdGFsICAgLTcwRS0xICAtNy4wICAgIC0+IDAKK2RkY290NDA1IGNvbXBhcmV0b3RhbCAgIC0uN0UrMSAgLTcgICAgICAtPiAwCitkZGNvdDQwNiBjb21wYXJldG90YWwgICAtNzBFLTEgIC03ICAgICAgLT4gMQorZGRjb3Q0MDcgY29tcGFyZXRvdGFsICAgLTcuMCAgICAtN0UrMCAgIC0+IDEKK2RkY290NDA4IGNvbXBhcmV0b3RhbCAgIC03LjAgICAgLTcwRS0xICAtPiAwCitkZGNvdDQwOSBjb21wYXJldG90YWwgICAtNyAgICAgIC0uN0UrMSAgLT4gMAorZGRjb3Q0MTAgY29tcGFyZXRvdGFsICAgLTcgICAgICAtNzBFLTEgIC0+IC0xCisKK2RkY290NDIwIGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTcuMCAgICAtPiAtMQorZGRjb3Q0MjEgY29tcGFyZXRvdGFsICAgLTguMCAgICAtNyAgICAgIC0+IC0xCitkZGNvdDQyMiBjb21wYXJldG90YWwgICAtOCAgICAgIC03LjAgICAgLT4gLTEKK2RkY290NDIzIGNvbXBhcmV0b3RhbCAgIC04RSswICAgLTcuMCAgICAtPiAtMQorZGRjb3Q0MjQgY29tcGFyZXRvdGFsICAgLTgwRS0xICAtNy4wICAgIC0+IC0xCitkZGNvdDQyNSBjb21wYXJldG90YWwgICAtLjhFKzEgIC03ICAgICAgLT4gLTEKK2RkY290NDI2IGNvbXBhcmV0b3RhbCAgIC04MEUtMSAgLTcgICAgICAtPiAtMQorZGRjb3Q0MjcgY29tcGFyZXRvdGFsICAgLTguMCAgICAtN0UrMCAgIC0+IC0xCitkZGNvdDQyOCBjb21wYXJldG90YWwgICAtOC4wICAgIC03MEUtMSAgLT4gLTEKK2RkY290NDI5IGNvbXBhcmV0b3RhbCAgIC04ICAgICAgLS43RSsxICAtPiAtMQorZGRjb3Q0MzAgY29tcGFyZXRvdGFsICAgLTggICAgICAtNzBFLTEgIC0+IC0xCisKK2RkY290NDQwIGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTkuMCAgICAtPiAxCitkZGNvdDQ0MSBjb21wYXJldG90YWwgICAtOC4wICAgIC05ICAgICAgLT4gMQorZGRjb3Q0NDIgY29tcGFyZXRvdGFsICAgLTggICAgICAtOS4wICAgIC0+IDEKK2RkY290NDQzIGNvbXBhcmV0b3RhbCAgIC04RSswICAgLTkuMCAgICAtPiAxCitkZGNvdDQ0NCBjb21wYXJldG90YWwgICAtODBFLTEgIC05LjAgICAgLT4gMQorZGRjb3Q0NDUgY29tcGFyZXRvdGFsICAgLS44RSsxICAtOSAgICAgIC0+IDEKK2RkY290NDQ2IGNvbXBhcmV0b3RhbCAgIC04MEUtMSAgLTkgICAgICAtPiAxCitkZGNvdDQ0NyBjb21wYXJldG90YWwgICAtOC4wICAgIC05RSswICAgLT4gMQorZGRjb3Q0NDggY29tcGFyZXRvdGFsICAgLTguMCAgICAtOTBFLTEgIC0+IDEKK2RkY290NDQ5IGNvbXBhcmV0b3RhbCAgIC04ICAgICAgLS45RSsxICAtPiAxCitkZGNvdDQ1MCBjb21wYXJldG90YWwgICAtOCAgICAgIC05MEUtMSAgLT4gMQorCisKKy0tIHRlc3RjYXNlcyB0aGF0IHN1YnRyYWN0IHRvIGxvdHMgb2YgemVyb3MgYXQgYm91bmRhcmllcyBbcGdyXQorZGRjb3Q0NzMgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAtMQorZGRjb3Q0NzQgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMDAwMDBFKzg5IDEyMy40NTZFKzg5IC0+IC0xCitkZGNvdDQ3NSBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAtMQorZGRjb3Q0NzYgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMDAwRSs4OSAxMjMuNDU2RSs4OSAtPiAtMQorZGRjb3Q0NzcgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IC0xCitkZGNvdDQ3OCBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwRSs4OSAxMjMuNDU2RSs4OSAtPiAtMQorZGRjb3Q0NzkgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAtMQorZGRjb3Q0ODAgY29tcGFyZXRvdGFsIDEyMy40NTYwMDBFKzg5IDEyMy40NTZFKzg5IC0+IC0xCitkZGNvdDQ4MSBjb21wYXJldG90YWwgMTIzLjQ1NjAwRS04OSAxMjMuNDU2RS04OSAtPiAtMQorZGRjb3Q0ODIgY29tcGFyZXRvdGFsIDEyMy40NTYwRSs4OSAxMjMuNDU2RSs4OSAtPiAtMQorZGRjb3Q0ODMgY29tcGFyZXRvdGFsIDEyMy40NTZFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2RkY290NDg3IGNvbXBhcmV0b3RhbCAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwMDAwMEUrODkgLT4gMQorZGRjb3Q0ODggY29tcGFyZXRvdGFsIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwMDBFLTg5IC0+IDEKK2RkY290NDg5IGNvbXBhcmV0b3RhbCAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwMDBFKzg5IC0+IDEKK2RkY290NDkwIGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMEUtODkgLT4gMQorZGRjb3Q0OTEgY29tcGFyZXRvdGFsIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwMDBFKzg5IC0+IDEKK2RkY290NDkyIGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDBFLTg5IC0+IDEKK2RkY290NDkzIGNvbXBhcmV0b3RhbCAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMEUrODkgLT4gMQorZGRjb3Q0OTQgY29tcGFyZXRvdGFsIDEyMy40NTZFLTg5IDEyMy40NTYwMDBFLTg5IC0+IDEKK2RkY290NDk1IGNvbXBhcmV0b3RhbCAxMjMuNDU2RSs4OSAxMjMuNDU2MDBFKzg5IC0+IDEKK2RkY290NDk2IGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2MEUtODkgLT4gMQorZGRjb3Q0OTcgY29tcGFyZXRvdGFsIDEyMy40NTZFKzg5IDEyMy40NTZFKzg5IC0+IDAKKworLS0gd2lkZS1yYW5naW5nLCBhcm91bmQgcHJlY2lzaW9uOyBzaWducyBlcXVhbAorZGRjb3Q0OTggY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTE3ICAgIC0+IDEKK2RkY290NDk5IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xNiAgICAtPiAxCitkZGNvdDUwMCBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMTUgICAgLT4gMQorZGRjb3Q1MDEgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTE0ICAgIC0+IDEKK2RkY290NTAyIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xMyAgICAtPiAxCitkZGNvdDUwMyBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMTIgICAgLT4gMQorZGRjb3Q1MDQgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTExICAgIC0+IDEKK2RkY290NTA1IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xMCAgICAtPiAxCitkZGNvdDUwNiBjb21wYXJldG90YWwgICAgMSAgICAgMUUtOSAgICAgLT4gMQorZGRjb3Q1MDcgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTggICAgIC0+IDEKK2RkY290NTA4IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS03ICAgICAtPiAxCitkZGNvdDUwOSBjb21wYXJldG90YWwgICAgMSAgICAgMUUtNiAgICAgLT4gMQorZGRjb3Q1MTAgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTUgICAgIC0+IDEKK2RkY290NTExIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS00ICAgICAtPiAxCitkZGNvdDUxMiBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMyAgICAgLT4gMQorZGRjb3Q1MTMgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTIgICAgIC0+IDEKK2RkY290NTE0IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xICAgICAtPiAxCitkZGNvdDUxNSBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMCAgICAgLT4gMAorZGRjb3Q1MTYgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzEgICAgIC0+IC0xCitkZGNvdDUxNyBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMiAgICAgLT4gLTEKK2RkY290NTE4IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSszICAgICAtPiAtMQorZGRjb3Q1MTkgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzQgICAgIC0+IC0xCitkZGNvdDUyMSBjb21wYXJldG90YWwgICAgMSAgICAgMUUrNSAgICAgLT4gLTEKK2RkY290NTIyIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSs2ICAgICAtPiAtMQorZGRjb3Q1MjMgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzcgICAgIC0+IC0xCitkZGNvdDUyNCBjb21wYXJldG90YWwgICAgMSAgICAgMUUrOCAgICAgLT4gLTEKK2RkY290NTI1IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSs5ICAgICAtPiAtMQorZGRjb3Q1MjYgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzEwICAgIC0+IC0xCitkZGNvdDUyNyBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTEgICAgLT4gLTEKK2RkY290NTI4IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxMiAgICAtPiAtMQorZGRjb3Q1MjkgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzEzICAgIC0+IC0xCitkZGNvdDUzMCBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTQgICAgLT4gLTEKK2RkY290NTMxIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxNSAgICAtPiAtMQorZGRjb3Q1MzIgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzE2ICAgIC0+IC0xCitkZGNvdDUzMyBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTcgICAgLT4gLTEKKy0tIExSIHN3YXAKK2RkY290NTM4IGNvbXBhcmV0b3RhbCAgICAxRS0xNyAgMSAgICAgICAtPiAtMQorZGRjb3Q1MzkgY29tcGFyZXRvdGFsICAgIDFFLTE2ICAxICAgICAgIC0+IC0xCitkZGNvdDU0MCBjb21wYXJldG90YWwgICAgMUUtMTUgIDEgICAgICAgLT4gLTEKK2RkY290NTQxIGNvbXBhcmV0b3RhbCAgICAxRS0xNCAgMSAgICAgICAtPiAtMQorZGRjb3Q1NDIgY29tcGFyZXRvdGFsICAgIDFFLTEzICAxICAgICAgIC0+IC0xCitkZGNvdDU0MyBjb21wYXJldG90YWwgICAgMUUtMTIgIDEgICAgICAgLT4gLTEKK2RkY290NTQ0IGNvbXBhcmV0b3RhbCAgICAxRS0xMSAgMSAgICAgICAtPiAtMQorZGRjb3Q1NDUgY29tcGFyZXRvdGFsICAgIDFFLTEwICAxICAgICAgIC0+IC0xCitkZGNvdDU0NiBjb21wYXJldG90YWwgICAgMUUtOSAgIDEgICAgICAgLT4gLTEKK2RkY290NTQ3IGNvbXBhcmV0b3RhbCAgICAxRS04ICAgMSAgICAgICAtPiAtMQorZGRjb3Q1NDggY29tcGFyZXRvdGFsICAgIDFFLTcgICAxICAgICAgIC0+IC0xCitkZGNvdDU0OSBjb21wYXJldG90YWwgICAgMUUtNiAgIDEgICAgICAgLT4gLTEKK2RkY290NTUwIGNvbXBhcmV0b3RhbCAgICAxRS01ICAgMSAgICAgICAtPiAtMQorZGRjb3Q1NTEgY29tcGFyZXRvdGFsICAgIDFFLTQgICAxICAgICAgIC0+IC0xCitkZGNvdDU1MiBjb21wYXJldG90YWwgICAgMUUtMyAgIDEgICAgICAgLT4gLTEKK2RkY290NTUzIGNvbXBhcmV0b3RhbCAgICAxRS0yICAgMSAgICAgICAtPiAtMQorZGRjb3Q1NTQgY29tcGFyZXRvdGFsICAgIDFFLTEgICAxICAgICAgIC0+IC0xCitkZGNvdDU1NSBjb21wYXJldG90YWwgICAgMUUtMCAgIDEgICAgICAgLT4gIDAKK2RkY290NTU2IGNvbXBhcmV0b3RhbCAgICAxRSsxICAgMSAgICAgICAtPiAgMQorZGRjb3Q1NTcgY29tcGFyZXRvdGFsICAgIDFFKzIgICAxICAgICAgIC0+ICAxCitkZGNvdDU1OCBjb21wYXJldG90YWwgICAgMUUrMyAgIDEgICAgICAgLT4gIDEKK2RkY290NTU5IGNvbXBhcmV0b3RhbCAgICAxRSs0ICAgMSAgICAgICAtPiAgMQorZGRjb3Q1NjEgY29tcGFyZXRvdGFsICAgIDFFKzUgICAxICAgICAgIC0+ICAxCitkZGNvdDU2MiBjb21wYXJldG90YWwgICAgMUUrNiAgIDEgICAgICAgLT4gIDEKK2RkY290NTYzIGNvbXBhcmV0b3RhbCAgICAxRSs3ICAgMSAgICAgICAtPiAgMQorZGRjb3Q1NjQgY29tcGFyZXRvdGFsICAgIDFFKzggICAxICAgICAgIC0+ICAxCitkZGNvdDU2NSBjb21wYXJldG90YWwgICAgMUUrOSAgIDEgICAgICAgLT4gIDEKK2RkY290NTY2IGNvbXBhcmV0b3RhbCAgICAxRSsxMCAgMSAgICAgICAtPiAgMQorZGRjb3Q1NjcgY29tcGFyZXRvdGFsICAgIDFFKzExICAxICAgICAgIC0+ICAxCitkZGNvdDU2OCBjb21wYXJldG90YWwgICAgMUUrMTIgIDEgICAgICAgLT4gIDEKK2RkY290NTY5IGNvbXBhcmV0b3RhbCAgICAxRSsxMyAgMSAgICAgICAtPiAgMQorZGRjb3Q1NzAgY29tcGFyZXRvdGFsICAgIDFFKzE0ICAxICAgICAgIC0+ICAxCitkZGNvdDU3MSBjb21wYXJldG90YWwgICAgMUUrMTUgIDEgICAgICAgLT4gIDEKK2RkY290NTcyIGNvbXBhcmV0b3RhbCAgICAxRSsxNiAgMSAgICAgICAtPiAgMQorZGRjb3Q1NzMgY29tcGFyZXRvdGFsICAgIDFFKzE3ICAxICAgICAgIC0+ICAxCistLSBzaW1pbGFyIHdpdGggYSB1c2VmdWwgY29lZmZpY2llbnQsIG9uZSBzaWRlIG9ubHkKK2RkY290NTc4IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE3ICAgIC0+IDEKK2RkY290NTc5IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE2ICAgIC0+IDEKK2RkY290NTgwIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE1ICAgIC0+IDEKK2RkY290NTgxIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE0ICAgIC0+IDEKK2RkY290NTgyIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEzICAgIC0+IDEKK2RkY290NTgzIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEyICAgIC0+IDEKK2RkY290NTg0IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTExICAgIC0+IDEKK2RkY290NTg1IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEwICAgIC0+IDEKK2RkY290NTg2IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTkgICAgIC0+IDEKK2RkY290NTg3IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTggICAgIC0+IDEKK2RkY290NTg4IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTcgICAgIC0+IDEKK2RkY290NTg5IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTYgICAgIC0+IC0xCitkZGNvdDU5MCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS01ICAgICAtPiAtMQorZGRjb3Q1OTEgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNCAgICAgLT4gLTEKK2RkY290NTkyIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTMgICAgIC0+IC0xCitkZGNvdDU5MyBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0yICAgICAtPiAtMQorZGRjb3Q1OTQgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMSAgICAgLT4gLTEKK2RkY290NTk1IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTAgICAgIC0+IC0xCitkZGNvdDU5NiBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsxICAgICAtPiAtMQorZGRjb3Q1OTcgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMiAgICAgLT4gLTEKK2RkY290NTk4IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzMgICAgIC0+IC0xCitkZGNvdDU5OSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSs0ICAgICAtPiAtMQorCistLSBjaGVjayBzb21lIHVuaXQteSB0cmFwcworZGRjb3Q2MDAgY29tcGFyZXRvdGFsICAgMTIgICAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitkZGNvdDYwMSBjb21wYXJldG90YWwgICAxMi4wICAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RkY290NjAyIGNvbXBhcmV0b3RhbCAgIDEyLjAwICAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjb3Q2MDMgY29tcGFyZXRvdGFsICAgMTIuMDAwICAgICAgICAxMi4yMzQ1IC0+IC0xCitkZGNvdDYwNCBjb21wYXJldG90YWwgICAxMi4wMDAwICAgICAgIDEyLjIzNDUgLT4gLTEKK2RkY290NjA1IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwICAgICAgMTIuMjM0NSAtPiAtMQorZGRjb3Q2MDYgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwICAgICAxMi4yMzQ1IC0+IC0xCitkZGNvdDYwNyBjb21wYXJldG90YWwgICAxMi4wMDAwMDAwICAgIDEyLjIzNDUgLT4gLTEKK2RkY290NjA4IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMDAwICAgMTIuMjM0NSAtPiAtMQorZGRjb3Q2MDkgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwMDAwICAxMi4yMzQ1IC0+IC0xCitkZGNvdDYxMCBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyICAgICAgICAgICAgLT4gIDEKK2RkY290NjExIGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMCAgICAgICAgICAtPiAgMQorZGRjb3Q2MTIgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMCAgICAgICAgIC0+ICAxCitkZGNvdDYxMyBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMCAgICAgICAgLT4gIDEKK2RkY290NjE0IGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwMCAgICAgICAtPiAgMQorZGRjb3Q2MTUgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAwMCAgICAgIC0+ICAxCitkZGNvdDYxNiBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMDAwMCAgICAgLT4gIDEKK2RkY290NjE3IGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwMDAwMCAgICAtPiAgMQorZGRjb3Q2MTggY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAwMDAwMCAgIC0+ICAxCitkZGNvdDYxOSBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMDAwMDAwMCAgLT4gIDEKK2RkY290NjIwIGNvbXBhcmV0b3RhbCAgLTEyICAgICAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjb3Q2MjEgY29tcGFyZXRvdGFsICAtMTIuMCAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvdDYyMiBjb21wYXJldG90YWwgIC0xMi4wMCAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RkY290NjIzIGNvbXBhcmV0b3RhbCAgLTEyLjAwMCAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjb3Q2MjQgY29tcGFyZXRvdGFsICAtMTIuMDAwMCAgICAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvdDYyNSBjb21wYXJldG90YWwgIC0xMi4wMDAwMCAgICAgLTEyLjIzNDUgLT4gIDEKK2RkY290NjI2IGNvbXBhcmV0b3RhbCAgLTEyLjAwMDAwMCAgICAtMTIuMjM0NSAtPiAgMQorZGRjb3Q2MjcgY29tcGFyZXRvdGFsICAtMTIuMDAwMDAwMCAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvdDYyOCBjb21wYXJldG90YWwgIC0xMi4wMDAwMDAwMCAgLTEyLjIzNDUgLT4gIDEKK2RkY290NjI5IGNvbXBhcmV0b3RhbCAgLTEyLjAwMDAwMDAwMCAtMTIuMjM0NSAtPiAgMQorZGRjb3Q2MzAgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIgICAgICAgICAgIC0+IC0xCitkZGNvdDYzMSBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wICAgICAgICAgLT4gLTEKK2RkY290NjMyIGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwICAgICAgICAtPiAtMQorZGRjb3Q2MzMgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwICAgICAgIC0+IC0xCitkZGNvdDYzNCBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAwICAgICAgLT4gLTEKK2RkY290NjM1IGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMDAwICAgICAtPiAtMQorZGRjb3Q2MzYgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwMDAwICAgIC0+IC0xCitkZGNvdDYzNyBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAwMDAwICAgLT4gLTEKK2RkY290NjM4IGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwICAtPiAtMQorZGRjb3Q2MzkgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAwIC0+IC0xCisKKy0tIGV4dGVuZGVkIHplcm9zCitkZGNvdDY0MCBjb21wYXJldG90YWwgICAwICAgICAwICAgLT4gMAorZGRjb3Q2NDEgY29tcGFyZXRvdGFsICAgMCAgICAtMCAgIC0+IDEKK2RkY290NjQyIGNvbXBhcmV0b3RhbCAgIDAgICAgLTAuMCAtPiAxCitkZGNvdDY0MyBjb21wYXJldG90YWwgICAwICAgICAwLjAgLT4gMQorZGRjb3Q2NDQgY29tcGFyZXRvdGFsICAtMCAgICAgMCAgIC0+IC0xCitkZGNvdDY0NSBjb21wYXJldG90YWwgIC0wICAgIC0wICAgLT4gMAorZGRjb3Q2NDYgY29tcGFyZXRvdGFsICAtMCAgICAtMC4wIC0+IC0xCitkZGNvdDY0NyBjb21wYXJldG90YWwgIC0wICAgICAwLjAgLT4gLTEKK2RkY290NjQ4IGNvbXBhcmV0b3RhbCAgIDAuMCAgIDAgICAtPiAtMQorZGRjb3Q2NDkgY29tcGFyZXRvdGFsICAgMC4wICAtMCAgIC0+IDEKK2RkY290NjUwIGNvbXBhcmV0b3RhbCAgIDAuMCAgLTAuMCAtPiAxCitkZGNvdDY1MSBjb21wYXJldG90YWwgICAwLjAgICAwLjAgLT4gMAorZGRjb3Q2NTIgY29tcGFyZXRvdGFsICAtMC4wICAgMCAgIC0+IC0xCitkZGNvdDY1MyBjb21wYXJldG90YWwgIC0wLjAgIC0wICAgLT4gMQorZGRjb3Q2NTQgY29tcGFyZXRvdGFsICAtMC4wICAtMC4wIC0+IDAKK2RkY290NjU1IGNvbXBhcmV0b3RhbCAgLTAuMCAgIDAuMCAtPiAtMQorCitkZGNvdDY1NiBjb21wYXJldG90YWwgIC0wRTEgICAwLjAgLT4gLTEKK2RkY290NjU3IGNvbXBhcmV0b3RhbCAgLTBFMiAgIDAuMCAtPiAtMQorZGRjb3Q2NTggY29tcGFyZXRvdGFsICAgMEUxICAgMC4wIC0+IDEKK2RkY290NjU5IGNvbXBhcmV0b3RhbCAgIDBFMiAgIDAuMCAtPiAxCitkZGNvdDY2MCBjb21wYXJldG90YWwgIC0wRTEgICAwICAgLT4gLTEKK2RkY290NjYxIGNvbXBhcmV0b3RhbCAgLTBFMiAgIDAgICAtPiAtMQorZGRjb3Q2NjIgY29tcGFyZXRvdGFsICAgMEUxICAgMCAgIC0+IDEKK2RkY290NjYzIGNvbXBhcmV0b3RhbCAgIDBFMiAgIDAgICAtPiAxCitkZGNvdDY2NCBjb21wYXJldG90YWwgIC0wRTEgIC0wRTEgLT4gMAorZGRjb3Q2NjUgY29tcGFyZXRvdGFsICAtMEUyICAtMEUxIC0+IC0xCitkZGNvdDY2NiBjb21wYXJldG90YWwgICAwRTEgIC0wRTEgLT4gMQorZGRjb3Q2NjcgY29tcGFyZXRvdGFsICAgMEUyICAtMEUxIC0+IDEKK2RkY290NjY4IGNvbXBhcmV0b3RhbCAgLTBFMSAgLTBFMiAtPiAxCitkZGNvdDY2OSBjb21wYXJldG90YWwgIC0wRTIgIC0wRTIgLT4gMAorZGRjb3Q2NzAgY29tcGFyZXRvdGFsICAgMEUxICAtMEUyIC0+IDEKK2RkY290NjcxIGNvbXBhcmV0b3RhbCAgIDBFMiAgLTBFMiAtPiAxCitkZGNvdDY3MiBjb21wYXJldG90YWwgIC0wRTEgICAwRTEgLT4gLTEKK2RkY290NjczIGNvbXBhcmV0b3RhbCAgLTBFMiAgIDBFMSAtPiAtMQorZGRjb3Q2NzQgY29tcGFyZXRvdGFsICAgMEUxICAgMEUxIC0+IDAKK2RkY290Njc1IGNvbXBhcmV0b3RhbCAgIDBFMiAgIDBFMSAtPiAxCitkZGNvdDY3NiBjb21wYXJldG90YWwgIC0wRTEgICAwRTIgLT4gLTEKK2RkY290Njc3IGNvbXBhcmV0b3RhbCAgLTBFMiAgIDBFMiAtPiAtMQorZGRjb3Q2NzggY29tcGFyZXRvdGFsICAgMEUxICAgMEUyIC0+IC0xCitkZGNvdDY3OSBjb21wYXJldG90YWwgICAwRTIgICAwRTIgLT4gMAorCistLSB0cmFpbGluZyB6ZXJvczsgdW5pdC15CitkZGNvdDY4MCBjb21wYXJldG90YWwgICAxMiAgICAxMiAgICAgICAgICAgLT4gMAorZGRjb3Q2ODEgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMCAgICAgICAgIC0+IDEKK2RkY290NjgyIGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwICAgICAgICAtPiAxCitkZGNvdDY4MyBjb21wYXJldG90YWwgICAxMiAgICAxMi4wMDAgICAgICAgLT4gMQorZGRjb3Q2ODQgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMCAgICAgIC0+IDEKK2RkY290Njg1IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAwICAgICAtPiAxCitkZGNvdDY4NiBjb21wYXJldG90YWwgICAxMiAgICAxMi4wMDAwMDAgICAgLT4gMQorZGRjb3Q2ODcgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMDAwMCAgIC0+IDEKK2RkY290Njg4IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAwMDAwICAtPiAxCitkZGNvdDY4OSBjb21wYXJldG90YWwgICAxMiAgICAxMi4wMDAwMDAwMDAgLT4gMQorZGRjb3Q2OTAgY29tcGFyZXRvdGFsICAgMTIgICAgICAgICAgICAgIDEyIC0+IDAKK2RkY290NjkxIGNvbXBhcmV0b3RhbCAgIDEyLjAgICAgICAgICAgICAxMiAtPiAtMQorZGRjb3Q2OTIgY29tcGFyZXRvdGFsICAgMTIuMDAgICAgICAgICAgIDEyIC0+IC0xCitkZGNvdDY5MyBjb21wYXJldG90YWwgICAxMi4wMDAgICAgICAgICAgMTIgLT4gLTEKK2RkY290Njk0IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAgICAgICAgICAxMiAtPiAtMQorZGRjb3Q2OTUgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAgICAgICAgIDEyIC0+IC0xCitkZGNvdDY5NiBjb21wYXJldG90YWwgICAxMi4wMDAwMDAgICAgICAgMTIgLT4gLTEKK2RkY290Njk3IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMDAgICAgICAxMiAtPiAtMQorZGRjb3Q2OTggY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwMDAgICAgIDEyIC0+IC0xCitkZGNvdDY5OSBjb21wYXJldG90YWwgICAxMi4wMDAwMDAwMDAgICAgMTIgLT4gLTEKKworLS0gb2xkIGxvbmcgb3BlcmFuZCBjaGVja3MKK2RkY290NzAxIGNvbXBhcmV0b3RhbCAxMjM0NTY3ODAwMCAgMSAtPiAgMQorZGRjb3Q3MDIgY29tcGFyZXRvdGFsIDEgMTIzNDU2NzgwMDAgIC0+IC0xCitkZGNvdDcwMyBjb21wYXJldG90YWwgMTIzNDU2NzgwMCAgIDEgLT4gIDEKK2RkY290NzA0IGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4MDAgICAtPiAtMQorZGRjb3Q3MDUgY29tcGFyZXRvdGFsIDEyMzQ1Njc4OTAgICAxIC0+ICAxCitkZGNvdDcwNiBjb21wYXJldG90YWwgMSAxMjM0NTY3ODkwICAgLT4gLTEKK2RkY290NzA3IGNvbXBhcmV0b3RhbCAxMjM0NTY3ODkxICAgMSAtPiAgMQorZGRjb3Q3MDggY29tcGFyZXRvdGFsIDEgMTIzNDU2Nzg5MSAgIC0+IC0xCitkZGNvdDcwOSBjb21wYXJldG90YWwgMTIzNDU2Nzg5MDEgIDEgLT4gIDEKK2RkY290NzEwIGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4OTAxICAtPiAtMQorZGRjb3Q3MTEgY29tcGFyZXRvdGFsIDEyMzQ1Njc4OTYgICAxIC0+ICAxCitkZGNvdDcxMiBjb21wYXJldG90YWwgMSAxMjM0NTY3ODk2ICAgLT4gLTEKK2RkY290NzEzIGNvbXBhcmV0b3RhbCAtMTIzNDU2Nzg5MSAgMSAtPiAtMQorZGRjb3Q3MTQgY29tcGFyZXRvdGFsIDEgLTEyMzQ1Njc4OTEgIC0+ICAxCitkZGNvdDcxNSBjb21wYXJldG90YWwgLTEyMzQ1Njc4OTAxIDEgLT4gLTEKK2RkY290NzE2IGNvbXBhcmV0b3RhbCAxIC0xMjM0NTY3ODkwMSAtPiAgMQorZGRjb3Q3MTcgY29tcGFyZXRvdGFsIC0xMjM0NTY3ODk2ICAxIC0+IC0xCitkZGNvdDcxOCBjb21wYXJldG90YWwgMSAtMTIzNDU2Nzg5NiAgLT4gIDEKKworLS0gb2xkIHJlc2lkdWUgY2FzZXMKK2RkY290NzQwIGNvbXBhcmV0b3RhbCAgMSAgMC45OTk5OTk5ICAtPiAxCitkZGNvdDc0MSBjb21wYXJldG90YWwgIDEgIDAuOTk5OTk5ICAgLT4gMQorZGRjb3Q3NDIgY29tcGFyZXRvdGFsICAxICAwLjk5OTk5ICAgIC0+IDEKK2RkY290NzQzIGNvbXBhcmV0b3RhbCAgMSAgMS4wMDAwICAgICAtPiAxCitkZGNvdDc0NCBjb21wYXJldG90YWwgIDEgIDEuMDAwMDEgICAgLT4gLTEKK2RkY290NzQ1IGNvbXBhcmV0b3RhbCAgMSAgMS4wMDAwMDEgICAtPiAtMQorZGRjb3Q3NDYgY29tcGFyZXRvdGFsICAxICAxLjAwMDAwMDEgIC0+IC0xCitkZGNvdDc1MCBjb21wYXJldG90YWwgIDAuOTk5OTk5OSAgMSAgLT4gLTEKK2RkY290NzUxIGNvbXBhcmV0b3RhbCAgMC45OTk5OTkgICAxICAtPiAtMQorZGRjb3Q3NTIgY29tcGFyZXRvdGFsICAwLjk5OTk5ICAgIDEgIC0+IC0xCitkZGNvdDc1MyBjb21wYXJldG90YWwgIDEuMDAwMCAgICAgMSAgLT4gLTEKK2RkY290NzU0IGNvbXBhcmV0b3RhbCAgMS4wMDAwMSAgICAxICAtPiAxCitkZGNvdDc1NSBjb21wYXJldG90YWwgIDEuMDAwMDAxICAgMSAgLT4gMQorZGRjb3Q3NTYgY29tcGFyZXRvdGFsICAxLjAwMDAwMDEgIDEgIC0+IDEKKworLS0gU3BlY2lhbHMKK2RkY290NzgwIGNvbXBhcmV0b3RhbCAgSW5mICAtSW5mICAgLT4gIDEKK2RkY290NzgxIGNvbXBhcmV0b3RhbCAgSW5mICAtMTAwMCAgLT4gIDEKK2RkY290NzgyIGNvbXBhcmV0b3RhbCAgSW5mICAtMSAgICAgLT4gIDEKK2RkY290NzgzIGNvbXBhcmV0b3RhbCAgSW5mICAtMCAgICAgLT4gIDEKK2RkY290Nzg0IGNvbXBhcmV0b3RhbCAgSW5mICAgMCAgICAgLT4gIDEKK2RkY290Nzg1IGNvbXBhcmV0b3RhbCAgSW5mICAgMSAgICAgLT4gIDEKK2RkY290Nzg2IGNvbXBhcmV0b3RhbCAgSW5mICAgMTAwMCAgLT4gIDEKK2RkY290Nzg3IGNvbXBhcmV0b3RhbCAgSW5mICAgSW5mICAgLT4gIDAKK2RkY290Nzg4IGNvbXBhcmV0b3RhbCAtMTAwMCAgSW5mICAgLT4gLTEKK2RkY290Nzg5IGNvbXBhcmV0b3RhbCAtSW5mICAgSW5mICAgLT4gLTEKK2RkY290NzkwIGNvbXBhcmV0b3RhbCAtMSAgICAgSW5mICAgLT4gLTEKK2RkY290NzkxIGNvbXBhcmV0b3RhbCAtMCAgICAgSW5mICAgLT4gLTEKK2RkY290NzkyIGNvbXBhcmV0b3RhbCAgMCAgICAgSW5mICAgLT4gLTEKK2RkY290NzkzIGNvbXBhcmV0b3RhbCAgMSAgICAgSW5mICAgLT4gLTEKK2RkY290Nzk0IGNvbXBhcmV0b3RhbCAgMTAwMCAgSW5mICAgLT4gLTEKK2RkY290Nzk1IGNvbXBhcmV0b3RhbCAgSW5mICAgSW5mICAgLT4gIDAKKworZGRjb3Q4MDAgY29tcGFyZXRvdGFsIC1JbmYgIC1JbmYgICAtPiAgMAorZGRjb3Q4MDEgY29tcGFyZXRvdGFsIC1JbmYgIC0xMDAwICAtPiAtMQorZGRjb3Q4MDIgY29tcGFyZXRvdGFsIC1JbmYgIC0xICAgICAtPiAtMQorZGRjb3Q4MDMgY29tcGFyZXRvdGFsIC1JbmYgIC0wICAgICAtPiAtMQorZGRjb3Q4MDQgY29tcGFyZXRvdGFsIC1JbmYgICAwICAgICAtPiAtMQorZGRjb3Q4MDUgY29tcGFyZXRvdGFsIC1JbmYgICAxICAgICAtPiAtMQorZGRjb3Q4MDYgY29tcGFyZXRvdGFsIC1JbmYgICAxMDAwICAtPiAtMQorZGRjb3Q4MDcgY29tcGFyZXRvdGFsIC1JbmYgICBJbmYgICAtPiAtMQorZGRjb3Q4MDggY29tcGFyZXRvdGFsIC1JbmYgIC1JbmYgICAtPiAgMAorZGRjb3Q4MDkgY29tcGFyZXRvdGFsIC0xMDAwIC1JbmYgICAtPiAgMQorZGRjb3Q4MTAgY29tcGFyZXRvdGFsIC0xICAgIC1JbmYgICAtPiAgMQorZGRjb3Q4MTEgY29tcGFyZXRvdGFsIC0wICAgIC1JbmYgICAtPiAgMQorZGRjb3Q4MTIgY29tcGFyZXRvdGFsICAwICAgIC1JbmYgICAtPiAgMQorZGRjb3Q4MTMgY29tcGFyZXRvdGFsICAxICAgIC1JbmYgICAtPiAgMQorZGRjb3Q4MTQgY29tcGFyZXRvdGFsICAxMDAwIC1JbmYgICAtPiAgMQorZGRjb3Q4MTUgY29tcGFyZXRvdGFsICBJbmYgIC1JbmYgICAtPiAgMQorCitkZGNvdDgyMSBjb21wYXJldG90YWwgIE5hTiAtSW5mICAgIC0+ICAxCitkZGNvdDgyMiBjb21wYXJldG90YWwgIE5hTiAtMTAwMCAgIC0+ICAxCitkZGNvdDgyMyBjb21wYXJldG90YWwgIE5hTiAtMSAgICAgIC0+ICAxCitkZGNvdDgyNCBjb21wYXJldG90YWwgIE5hTiAtMCAgICAgIC0+ICAxCitkZGNvdDgyNSBjb21wYXJldG90YWwgIE5hTiAgMCAgICAgIC0+ICAxCitkZGNvdDgyNiBjb21wYXJldG90YWwgIE5hTiAgMSAgICAgIC0+ICAxCitkZGNvdDgyNyBjb21wYXJldG90YWwgIE5hTiAgMTAwMCAgIC0+ICAxCitkZGNvdDgyOCBjb21wYXJldG90YWwgIE5hTiAgSW5mICAgIC0+ICAxCitkZGNvdDgyOSBjb21wYXJldG90YWwgIE5hTiAgTmFOICAgIC0+ICAwCitkZGNvdDgzMCBjb21wYXJldG90YWwgLUluZiAgTmFOICAgIC0+ICAtMQorZGRjb3Q4MzEgY29tcGFyZXRvdGFsIC0xMDAwIE5hTiAgICAtPiAgLTEKK2RkY290ODMyIGNvbXBhcmV0b3RhbCAtMSAgICBOYU4gICAgLT4gIC0xCitkZGNvdDgzMyBjb21wYXJldG90YWwgLTAgICAgTmFOICAgIC0+ICAtMQorZGRjb3Q4MzQgY29tcGFyZXRvdGFsICAwICAgIE5hTiAgICAtPiAgLTEKK2RkY290ODM1IGNvbXBhcmV0b3RhbCAgMSAgICBOYU4gICAgLT4gIC0xCitkZGNvdDgzNiBjb21wYXJldG90YWwgIDEwMDAgTmFOICAgIC0+ICAtMQorZGRjb3Q4MzcgY29tcGFyZXRvdGFsICBJbmYgIE5hTiAgICAtPiAgLTEKK2RkY290ODM4IGNvbXBhcmV0b3RhbCAtTmFOIC1OYU4gICAgLT4gIDAKK2RkY290ODM5IGNvbXBhcmV0b3RhbCArTmFOIC1OYU4gICAgLT4gIDEKK2RkY290ODQwIGNvbXBhcmV0b3RhbCAtTmFOICtOYU4gICAgLT4gIC0xCisKK2RkY290ODQxIGNvbXBhcmV0b3RhbCAgc05hTiAtc05hTiAgLT4gIDEKK2RkY290ODQyIGNvbXBhcmV0b3RhbCAgc05hTiAtTmFOICAgLT4gIDEKK2RkY290ODQzIGNvbXBhcmV0b3RhbCAgc05hTiAtSW5mICAgLT4gIDEKK2RkY290ODQ0IGNvbXBhcmV0b3RhbCAgc05hTiAtMTAwMCAgLT4gIDEKK2RkY290ODQ1IGNvbXBhcmV0b3RhbCAgc05hTiAtMSAgICAgLT4gIDEKK2RkY290ODQ2IGNvbXBhcmV0b3RhbCAgc05hTiAtMCAgICAgLT4gIDEKK2RkY290ODQ3IGNvbXBhcmV0b3RhbCAgc05hTiAgMCAgICAgLT4gIDEKK2RkY290ODQ4IGNvbXBhcmV0b3RhbCAgc05hTiAgMSAgICAgLT4gIDEKK2RkY290ODQ5IGNvbXBhcmV0b3RhbCAgc05hTiAgMTAwMCAgLT4gIDEKK2RkY290ODUwIGNvbXBhcmV0b3RhbCAgc05hTiAgTmFOICAgLT4gIC0xCitkZGNvdDg1MSBjb21wYXJldG90YWwgIHNOYU4gc05hTiAgIC0+ICAwCisKK2RkY290ODUyIGNvbXBhcmV0b3RhbCAtc05hTiBzTmFOICAgLT4gIC0xCitkZGNvdDg1MyBjb21wYXJldG90YWwgLU5hTiAgc05hTiAgIC0+ICAtMQorZGRjb3Q4NTQgY29tcGFyZXRvdGFsIC1JbmYgIHNOYU4gICAtPiAgLTEKK2RkY290ODU1IGNvbXBhcmV0b3RhbCAtMTAwMCBzTmFOICAgLT4gIC0xCitkZGNvdDg1NiBjb21wYXJldG90YWwgLTEgICAgc05hTiAgIC0+ICAtMQorZGRjb3Q4NTcgY29tcGFyZXRvdGFsIC0wICAgIHNOYU4gICAtPiAgLTEKK2RkY290ODU4IGNvbXBhcmV0b3RhbCAgMCAgICBzTmFOICAgLT4gIC0xCitkZGNvdDg1OSBjb21wYXJldG90YWwgIDEgICAgc05hTiAgIC0+ICAtMQorZGRjb3Q4NjAgY29tcGFyZXRvdGFsICAxMDAwIHNOYU4gICAtPiAgLTEKK2RkY290ODYxIGNvbXBhcmV0b3RhbCAgSW5mICBzTmFOICAgLT4gIC0xCitkZGNvdDg2MiBjb21wYXJldG90YWwgIE5hTiAgc05hTiAgIC0+ICAxCitkZGNvdDg2MyBjb21wYXJldG90YWwgIHNOYU4gc05hTiAgIC0+ICAwCisKK2RkY290ODcxIGNvbXBhcmV0b3RhbCAgLXNOYU4gLXNOYU4gIC0+ICAwCitkZGNvdDg3MiBjb21wYXJldG90YWwgIC1zTmFOIC1OYU4gICAtPiAgMQorZGRjb3Q4NzMgY29tcGFyZXRvdGFsICAtc05hTiAtSW5mICAgLT4gIC0xCitkZGNvdDg3NCBjb21wYXJldG90YWwgIC1zTmFOIC0xMDAwICAtPiAgLTEKK2RkY290ODc1IGNvbXBhcmV0b3RhbCAgLXNOYU4gLTEgICAgIC0+ICAtMQorZGRjb3Q4NzYgY29tcGFyZXRvdGFsICAtc05hTiAtMCAgICAgLT4gIC0xCitkZGNvdDg3NyBjb21wYXJldG90YWwgIC1zTmFOICAwICAgICAtPiAgLTEKK2RkY290ODc4IGNvbXBhcmV0b3RhbCAgLXNOYU4gIDEgICAgIC0+ICAtMQorZGRjb3Q4NzkgY29tcGFyZXRvdGFsICAtc05hTiAgMTAwMCAgLT4gIC0xCitkZGNvdDg4MCBjb21wYXJldG90YWwgIC1zTmFOICBOYU4gICAtPiAgLTEKK2RkY290ODgxIGNvbXBhcmV0b3RhbCAgLXNOYU4gc05hTiAgIC0+ICAtMQorCitkZGNvdDg4MiBjb21wYXJldG90YWwgLXNOYU4gLXNOYU4gICAtPiAgMAorZGRjb3Q4ODMgY29tcGFyZXRvdGFsIC1OYU4gIC1zTmFOICAgLT4gIC0xCitkZGNvdDg4NCBjb21wYXJldG90YWwgLUluZiAgLXNOYU4gICAtPiAgMQorZGRjb3Q4ODUgY29tcGFyZXRvdGFsIC0xMDAwIC1zTmFOICAgLT4gIDEKK2RkY290ODg2IGNvbXBhcmV0b3RhbCAtMSAgICAtc05hTiAgIC0+ICAxCitkZGNvdDg4NyBjb21wYXJldG90YWwgLTAgICAgLXNOYU4gICAtPiAgMQorZGRjb3Q4ODggY29tcGFyZXRvdGFsICAwICAgIC1zTmFOICAgLT4gIDEKK2RkY290ODg5IGNvbXBhcmV0b3RhbCAgMSAgICAtc05hTiAgIC0+ICAxCitkZGNvdDg5MCBjb21wYXJldG90YWwgIDEwMDAgLXNOYU4gICAtPiAgMQorZGRjb3Q4OTEgY29tcGFyZXRvdGFsICBJbmYgIC1zTmFOICAgLT4gIDEKK2RkY290ODkyIGNvbXBhcmV0b3RhbCAgTmFOICAtc05hTiAgIC0+ICAxCitkZGNvdDg5MyBjb21wYXJldG90YWwgIHNOYU4gLXNOYU4gICAtPiAgMQorCistLSBOYU5zIHdpdGggcGF5bG9hZAorZGRjb3Q5NjAgY29tcGFyZXRvdGFsICBOYU45IC1JbmYgICAtPiAgMQorZGRjb3Q5NjEgY29tcGFyZXRvdGFsICBOYU44ICA5OTkgICAtPiAgMQorZGRjb3Q5NjIgY29tcGFyZXRvdGFsICBOYU43NyBJbmYgICAtPiAgMQorZGRjb3Q5NjMgY29tcGFyZXRvdGFsIC1OYU42NyBOYU41ICAtPiAgLTEKK2RkY290OTY0IGNvbXBhcmV0b3RhbCAtSW5mICAtTmFONCAgLT4gIDEKK2RkY290OTY1IGNvbXBhcmV0b3RhbCAtOTk5ICAtTmFOMzMgLT4gIDEKK2RkY290OTY2IGNvbXBhcmV0b3RhbCAgSW5mICAgTmFOMiAgLT4gIC0xCisKK2RkY290OTcwIGNvbXBhcmV0b3RhbCAtTmFONDEgLU5hTjQyIC0+IDEKK2RkY290OTcxIGNvbXBhcmV0b3RhbCArTmFONDEgLU5hTjQyIC0+IDEKK2RkY290OTcyIGNvbXBhcmV0b3RhbCAtTmFONDEgK05hTjQyIC0+IC0xCitkZGNvdDk3MyBjb21wYXJldG90YWwgK05hTjQxICtOYU40MiAtPiAtMQorZGRjb3Q5NzQgY29tcGFyZXRvdGFsIC1OYU40MiAtTmFOMDEgLT4gLTEKK2RkY290OTc1IGNvbXBhcmV0b3RhbCArTmFONDIgLU5hTjAxIC0+ICAxCitkZGNvdDk3NiBjb21wYXJldG90YWwgLU5hTjQyICtOYU4wMSAtPiAtMQorZGRjb3Q5NzcgY29tcGFyZXRvdGFsICtOYU40MiArTmFOMDEgLT4gIDEKKworZGRjb3Q5ODAgY29tcGFyZXRvdGFsIC1zTmFONzcxIC1zTmFONzcyIC0+IDEKK2RkY290OTgxIGNvbXBhcmV0b3RhbCArc05hTjc3MSAtc05hTjc3MiAtPiAxCitkZGNvdDk4MiBjb21wYXJldG90YWwgLXNOYU43NzEgK3NOYU43NzIgLT4gLTEKK2RkY290OTgzIGNvbXBhcmV0b3RhbCArc05hTjc3MSArc05hTjc3MiAtPiAtMQorZGRjb3Q5ODQgY29tcGFyZXRvdGFsIC1zTmFONzcyIC1zTmFONzcxIC0+IC0xCitkZGNvdDk4NSBjb21wYXJldG90YWwgK3NOYU43NzIgLXNOYU43NzEgLT4gIDEKK2RkY290OTg2IGNvbXBhcmV0b3RhbCAtc05hTjc3MiArc05hTjc3MSAtPiAtMQorZGRjb3Q5ODcgY29tcGFyZXRvdGFsICtzTmFONzcyICtzTmFONzcxIC0+ICAxCisKK2RkY290OTkxIGNvbXBhcmV0b3RhbCAtc05hTjk5IC1JbmYgICAgLT4gLTEKK2RkY290OTkyIGNvbXBhcmV0b3RhbCAgc05hTjk4IC0xMSAgICAgLT4gIDEKK2RkY290OTkzIGNvbXBhcmV0b3RhbCAgc05hTjk3ICBOYU4gICAgLT4gLTEKK2RkY290OTk0IGNvbXBhcmV0b3RhbCAgc05hTjE2IHNOYU45NCAgLT4gLTEKK2RkY290OTk1IGNvbXBhcmV0b3RhbCAgTmFOODUgIHNOYU44MyAgLT4gIDEKK2RkY290OTk2IGNvbXBhcmV0b3RhbCAtSW5mICAgIHNOYU45MiAgLT4gLTEKK2RkY290OTk3IGNvbXBhcmV0b3RhbCAgMDg4ICAgIHNOYU44MSAgLT4gLTEKK2RkY290OTk4IGNvbXBhcmV0b3RhbCAgSW5mICAgIHNOYU45MCAgLT4gLTEKK2RkY290OTk5IGNvbXBhcmV0b3RhbCAgTmFOICAgLXNOYU44OSAgLT4gIDEKKworLS0gc3ByZWFkIHplcm9zCitkZGNvdDExMTAgY29tcGFyZXRvdGFsICAgMEUtMzgzICAwICAgICAgIC0+IC0xCitkZGNvdDExMTEgY29tcGFyZXRvdGFsICAgMEUtMzgzIC0wICAgICAgIC0+ICAxCitkZGNvdDExMTIgY29tcGFyZXRvdGFsICAtMEUtMzgzICAwICAgICAgIC0+IC0xCitkZGNvdDExMTMgY29tcGFyZXRvdGFsICAtMEUtMzgzIC0wICAgICAgIC0+ICAxCitkZGNvdDExMTQgY29tcGFyZXRvdGFsICAgMEUtMzgzICAwRSszODQgIC0+IC0xCitkZGNvdDExMTUgY29tcGFyZXRvdGFsICAgMEUtMzgzIC0wRSszODQgIC0+ICAxCitkZGNvdDExMTYgY29tcGFyZXRvdGFsICAtMEUtMzgzICAwRSszODQgIC0+IC0xCitkZGNvdDExMTcgY29tcGFyZXRvdGFsICAtMEUtMzgzIC0wRSszODQgIC0+ICAxCitkZGNvdDExMTggY29tcGFyZXRvdGFsICAgMCAgICAgICAwRSszODQgIC0+IC0xCitkZGNvdDExMTkgY29tcGFyZXRvdGFsICAgMCAgICAgIC0wRSszODQgIC0+ICAxCitkZGNvdDExMjAgY29tcGFyZXRvdGFsICAtMCAgICAgICAwRSszODQgIC0+IC0xCitkZGNvdDExMjEgY29tcGFyZXRvdGFsICAtMCAgICAgIC0wRSszODQgIC0+ICAxCisKK2RkY290MTEzMCBjb21wYXJldG90YWwgICAwRSszODQgIDAgICAgICAgLT4gIDEKK2RkY290MTEzMSBjb21wYXJldG90YWwgICAwRSszODQgLTAgICAgICAgLT4gIDEKK2RkY290MTEzMiBjb21wYXJldG90YWwgIC0wRSszODQgIDAgICAgICAgLT4gLTEKK2RkY290MTEzMyBjb21wYXJldG90YWwgIC0wRSszODQgLTAgICAgICAgLT4gLTEKK2RkY290MTEzNCBjb21wYXJldG90YWwgICAwRSszODQgIDBFLTM4MyAgLT4gIDEKK2RkY290MTEzNSBjb21wYXJldG90YWwgICAwRSszODQgLTBFLTM4MyAgLT4gIDEKK2RkY290MTEzNiBjb21wYXJldG90YWwgIC0wRSszODQgIDBFLTM4MyAgLT4gLTEKK2RkY290MTEzNyBjb21wYXJldG90YWwgIC0wRSszODQgLTBFLTM4MyAgLT4gLTEKK2RkY290MTEzOCBjb21wYXJldG90YWwgICAwICAgICAgIDBFLTM4MyAgLT4gIDEKK2RkY290MTEzOSBjb21wYXJldG90YWwgICAwICAgICAgLTBFLTM4MyAgLT4gIDEKK2RkY290MTE0MCBjb21wYXJldG90YWwgIC0wICAgICAgIDBFLTM4MyAgLT4gLTEKK2RkY290MTE0MSBjb21wYXJldG90YWwgIC0wICAgICAgLTBFLTM4MyAgLT4gLTEKKworLS0gTnVsbCB0ZXN0cworZGRjb3Q5OTkwIGNvbXBhcmV0b3RhbCAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkY290OTk5MSBjb21wYXJldG90YWwgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29tcGFyZVRvdGFsTWFnLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29tcGFyZVRvdGFsTWFnLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3YTA5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb21wYXJlVG90YWxNYWcuZGVjVGVzdApAQCAtMCwwICsxLDcwNiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZENvbXBhcmVUb3RhbE1hZy5kZWNUZXN0IC0tIGRlY0RvdWJsZSBjb21wYXJpc29uOyBhYnMuIHRvdGFsIG9yZGVyLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIE5vdGUgdGhhdCB3ZSBjYW5ub3QgYXNzdW1lIGFkZC9zdWJ0cmFjdCB0ZXN0cyBjb3ZlciBwYXRocyBhZGVxdWF0ZWx5LAorLS0gaGVyZSwgYmVjYXVzZSB0aGUgY29kZSBtaWdodCBiZSBxdWl0ZSBkaWZmZXJlbnQgKGNvbXBhcmlzb24gY2Fubm90CistLSBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHNvIGFjdHVhbCBzdWJ0cmFjdGlvbnMgYXJlIG5vdCBuZWNlc3NhcnkpLgorLS0gU2ltaWxhcmx5LCBjb21wYXJldG90YWwgd2lsbCBoYXZlIHNvbWUgcmFkaWNhbGx5IGRpZmZlcmVudCBwYXRocworLS0gdGhhbiBjb21wYXJlLgorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY0RvdWJsZXMuCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZGRjdG0wMDEgY29tcGFyZXRvdG1hZyAgLTIgIC0yICAgLT4gICAwCitkZGN0bTAwMiBjb21wYXJldG90bWFnICAtMiAgLTEgICAtPiAgIDEKK2RkY3RtMDAzIGNvbXBhcmV0b3RtYWcgIC0yICAgMCAgIC0+ICAgMQorZGRjdG0wMDQgY29tcGFyZXRvdG1hZyAgLTIgICAxICAgLT4gICAxCitkZGN0bTAwNSBjb21wYXJldG90bWFnICAtMiAgIDIgICAtPiAgIDAKK2RkY3RtMDA2IGNvbXBhcmV0b3RtYWcgIC0xICAtMiAgIC0+ICAtMQorZGRjdG0wMDcgY29tcGFyZXRvdG1hZyAgLTEgIC0xICAgLT4gICAwCitkZGN0bTAwOCBjb21wYXJldG90bWFnICAtMSAgIDAgICAtPiAgIDEKK2RkY3RtMDA5IGNvbXBhcmV0b3RtYWcgIC0xICAgMSAgIC0+ICAgMAorZGRjdG0wMTAgY29tcGFyZXRvdG1hZyAgLTEgICAyICAgLT4gIC0xCitkZGN0bTAxMSBjb21wYXJldG90bWFnICAgMCAgLTIgICAtPiAgLTEKK2RkY3RtMDEyIGNvbXBhcmV0b3RtYWcgICAwICAtMSAgIC0+ICAtMQorZGRjdG0wMTMgY29tcGFyZXRvdG1hZyAgIDAgICAwICAgLT4gICAwCitkZGN0bTAxNCBjb21wYXJldG90bWFnICAgMCAgIDEgICAtPiAgLTEKK2RkY3RtMDE1IGNvbXBhcmV0b3RtYWcgICAwICAgMiAgIC0+ICAtMQorZGRjdG0wMTYgY29tcGFyZXRvdG1hZyAgIDEgIC0yICAgLT4gIC0xCitkZGN0bTAxNyBjb21wYXJldG90bWFnICAgMSAgLTEgICAtPiAgIDAKK2RkY3RtMDE4IGNvbXBhcmV0b3RtYWcgICAxICAgMCAgIC0+ICAgMQorZGRjdG0wMTkgY29tcGFyZXRvdG1hZyAgIDEgICAxICAgLT4gICAwCitkZGN0bTAyMCBjb21wYXJldG90bWFnICAgMSAgIDIgICAtPiAgLTEKK2RkY3RtMDIxIGNvbXBhcmV0b3RtYWcgICAyICAtMiAgIC0+ICAgMAorZGRjdG0wMjIgY29tcGFyZXRvdG1hZyAgIDIgIC0xICAgLT4gICAxCitkZGN0bTAyMyBjb21wYXJldG90bWFnICAgMiAgIDAgICAtPiAgIDEKK2RkY3RtMDI1IGNvbXBhcmV0b3RtYWcgICAyICAgMSAgIC0+ICAgMQorZGRjdG0wMjYgY29tcGFyZXRvdG1hZyAgIDIgICAyICAgLT4gICAwCisKK2RkY3RtMDMxIGNvbXBhcmV0b3RtYWcgIC0yMCAgLTIwICAgLT4gICAwCitkZGN0bTAzMiBjb21wYXJldG90bWFnICAtMjAgIC0xMCAgIC0+ICAgMQorZGRjdG0wMzMgY29tcGFyZXRvdG1hZyAgLTIwICAgMDAgICAtPiAgIDEKK2RkY3RtMDM0IGNvbXBhcmV0b3RtYWcgIC0yMCAgIDEwICAgLT4gICAxCitkZGN0bTAzNSBjb21wYXJldG90bWFnICAtMjAgICAyMCAgIC0+ICAgMAorZGRjdG0wMzYgY29tcGFyZXRvdG1hZyAgLTEwICAtMjAgICAtPiAgLTEKK2RkY3RtMDM3IGNvbXBhcmV0b3RtYWcgIC0xMCAgLTEwICAgLT4gICAwCitkZGN0bTAzOCBjb21wYXJldG90bWFnICAtMTAgICAwMCAgIC0+ICAgMQorZGRjdG0wMzkgY29tcGFyZXRvdG1hZyAgLTEwICAgMTAgICAtPiAgIDAKK2RkY3RtMDQwIGNvbXBhcmV0b3RtYWcgIC0xMCAgIDIwICAgLT4gIC0xCitkZGN0bTA0MSBjb21wYXJldG90bWFnICAgMDAgIC0yMCAgIC0+ICAtMQorZGRjdG0wNDIgY29tcGFyZXRvdG1hZyAgIDAwICAtMTAgICAtPiAgLTEKK2RkY3RtMDQzIGNvbXBhcmV0b3RtYWcgICAwMCAgIDAwICAgLT4gICAwCitkZGN0bTA0NCBjb21wYXJldG90bWFnICAgMDAgICAxMCAgIC0+ICAtMQorZGRjdG0wNDUgY29tcGFyZXRvdG1hZyAgIDAwICAgMjAgICAtPiAgLTEKK2RkY3RtMDQ2IGNvbXBhcmV0b3RtYWcgICAxMCAgLTIwICAgLT4gIC0xCitkZGN0bTA0NyBjb21wYXJldG90bWFnICAgMTAgIC0xMCAgIC0+ICAgMAorZGRjdG0wNDggY29tcGFyZXRvdG1hZyAgIDEwICAgMDAgICAtPiAgIDEKK2RkY3RtMDQ5IGNvbXBhcmV0b3RtYWcgICAxMCAgIDEwICAgLT4gICAwCitkZGN0bTA1MCBjb21wYXJldG90bWFnICAgMTAgICAyMCAgIC0+ICAtMQorZGRjdG0wNTEgY29tcGFyZXRvdG1hZyAgIDIwICAtMjAgICAtPiAgIDAKK2RkY3RtMDUyIGNvbXBhcmV0b3RtYWcgICAyMCAgLTEwICAgLT4gICAxCitkZGN0bTA1MyBjb21wYXJldG90bWFnICAgMjAgICAwMCAgIC0+ICAgMQorZGRjdG0wNTUgY29tcGFyZXRvdG1hZyAgIDIwICAgMTAgICAtPiAgIDEKK2RkY3RtMDU2IGNvbXBhcmV0b3RtYWcgICAyMCAgIDIwICAgLT4gICAwCisKK2RkY3RtMDYxIGNvbXBhcmV0b3RtYWcgIC0yLjAgIC0yLjAgICAtPiAgIDAKK2RkY3RtMDYyIGNvbXBhcmV0b3RtYWcgIC0yLjAgIC0xLjAgICAtPiAgIDEKK2RkY3RtMDYzIGNvbXBhcmV0b3RtYWcgIC0yLjAgICAwLjAgICAtPiAgIDEKK2RkY3RtMDY0IGNvbXBhcmV0b3RtYWcgIC0yLjAgICAxLjAgICAtPiAgIDEKK2RkY3RtMDY1IGNvbXBhcmV0b3RtYWcgIC0yLjAgICAyLjAgICAtPiAgIDAKK2RkY3RtMDY2IGNvbXBhcmV0b3RtYWcgIC0xLjAgIC0yLjAgICAtPiAgLTEKK2RkY3RtMDY3IGNvbXBhcmV0b3RtYWcgIC0xLjAgIC0xLjAgICAtPiAgIDAKK2RkY3RtMDY4IGNvbXBhcmV0b3RtYWcgIC0xLjAgICAwLjAgICAtPiAgIDEKK2RkY3RtMDY5IGNvbXBhcmV0b3RtYWcgIC0xLjAgICAxLjAgICAtPiAgIDAKK2RkY3RtMDcwIGNvbXBhcmV0b3RtYWcgIC0xLjAgICAyLjAgICAtPiAgLTEKK2RkY3RtMDcxIGNvbXBhcmV0b3RtYWcgICAwLjAgIC0yLjAgICAtPiAgLTEKK2RkY3RtMDcyIGNvbXBhcmV0b3RtYWcgICAwLjAgIC0xLjAgICAtPiAgLTEKK2RkY3RtMDczIGNvbXBhcmV0b3RtYWcgICAwLjAgICAwLjAgICAtPiAgIDAKK2RkY3RtMDc0IGNvbXBhcmV0b3RtYWcgICAwLjAgICAxLjAgICAtPiAgLTEKK2RkY3RtMDc1IGNvbXBhcmV0b3RtYWcgICAwLjAgICAyLjAgICAtPiAgLTEKK2RkY3RtMDc2IGNvbXBhcmV0b3RtYWcgICAxLjAgIC0yLjAgICAtPiAgLTEKK2RkY3RtMDc3IGNvbXBhcmV0b3RtYWcgICAxLjAgIC0xLjAgICAtPiAgIDAKK2RkY3RtMDc4IGNvbXBhcmV0b3RtYWcgICAxLjAgICAwLjAgICAtPiAgIDEKK2RkY3RtMDc5IGNvbXBhcmV0b3RtYWcgICAxLjAgICAxLjAgICAtPiAgIDAKK2RkY3RtMDgwIGNvbXBhcmV0b3RtYWcgICAxLjAgICAyLjAgICAtPiAgLTEKK2RkY3RtMDgxIGNvbXBhcmV0b3RtYWcgICAyLjAgIC0yLjAgICAtPiAgIDAKK2RkY3RtMDgyIGNvbXBhcmV0b3RtYWcgICAyLjAgIC0xLjAgICAtPiAgIDEKK2RkY3RtMDgzIGNvbXBhcmV0b3RtYWcgICAyLjAgICAwLjAgICAtPiAgIDEKK2RkY3RtMDg1IGNvbXBhcmV0b3RtYWcgICAyLjAgICAxLjAgICAtPiAgIDEKK2RkY3RtMDg2IGNvbXBhcmV0b3RtYWcgICAyLjAgICAyLjAgICAtPiAgIDAKKworLS0gbm93IHNvbWUgY2FzZXMgd2hpY2ggbWlnaHQgb3ZlcmZsb3cgaWYgc3VidHJhY3Qgd2VyZSB1c2VkCitkZGN0bTA5MCBjb21wYXJldG90bWFnICA5Ljk5OTk5OTk5RSszODQgOS45OTk5OTk5OUUrMzg0ICAgLT4gICAwCitkZGN0bTA5MSBjb21wYXJldG90bWFnIC05Ljk5OTk5OTk5RSszODQgOS45OTk5OTk5OUUrMzg0ICAgLT4gICAwCitkZGN0bTA5MiBjb21wYXJldG90bWFnICA5Ljk5OTk5OTk5RSszODQgLTkuOTk5OTk5OTlFKzM4NCAgLT4gICAwCitkZGN0bTA5MyBjb21wYXJldG90bWFnIC05Ljk5OTk5OTk5RSszODQgLTkuOTk5OTk5OTlFKzM4NCAgLT4gICAwCisKKy0tIHNvbWUgZGlmZmVyaW5nIGxlbmd0aC9leHBvbmVudCBjYXNlcworLS0gaW4gdGhpcyBmaXJzdCBncm91cCwgY29tcGFyZSB3b3VsZCBjb21wYXJlIGFsbCBlcXVhbAorZGRjdG0xMDAgY29tcGFyZXRvdG1hZyAgIDcuMCAgICA3LjAgICAgIC0+ICAgMAorZGRjdG0xMDEgY29tcGFyZXRvdG1hZyAgIDcuMCAgICA3ICAgICAgIC0+ICAtMQorZGRjdG0xMDIgY29tcGFyZXRvdG1hZyAgIDcgICAgICA3LjAgICAgIC0+ICAgMQorZGRjdG0xMDMgY29tcGFyZXRvdG1hZyAgIDdFKzAgICA3LjAgICAgIC0+ICAgMQorZGRjdG0xMDQgY29tcGFyZXRvdG1hZyAgIDcwRS0xICA3LjAgICAgIC0+ICAgMAorZGRjdG0xMDUgY29tcGFyZXRvdG1hZyAgIDAuN0UrMSA3ICAgICAgIC0+ICAgMAorZGRjdG0xMDYgY29tcGFyZXRvdG1hZyAgIDcwRS0xICA3ICAgICAgIC0+ICAtMQorZGRjdG0xMDcgY29tcGFyZXRvdG1hZyAgIDcuMCAgICA3RSswICAgIC0+ICAtMQorZGRjdG0xMDggY29tcGFyZXRvdG1hZyAgIDcuMCAgICA3MEUtMSAgIC0+ICAgMAorZGRjdG0xMDkgY29tcGFyZXRvdG1hZyAgIDcgICAgICAwLjdFKzEgIC0+ICAgMAorZGRjdG0xMTAgY29tcGFyZXRvdG1hZyAgIDcgICAgICA3MEUtMSAgIC0+ICAgMQorCitkZGN0bTEyMCBjb21wYXJldG90bWFnICAgOC4wICAgIDcuMCAgICAgLT4gICAxCitkZGN0bTEyMSBjb21wYXJldG90bWFnICAgOC4wICAgIDcgICAgICAgLT4gICAxCitkZGN0bTEyMiBjb21wYXJldG90bWFnICAgOCAgICAgIDcuMCAgICAgLT4gICAxCitkZGN0bTEyMyBjb21wYXJldG90bWFnICAgOEUrMCAgIDcuMCAgICAgLT4gICAxCitkZGN0bTEyNCBjb21wYXJldG90bWFnICAgODBFLTEgIDcuMCAgICAgLT4gICAxCitkZGN0bTEyNSBjb21wYXJldG90bWFnICAgMC44RSsxIDcgICAgICAgLT4gICAxCitkZGN0bTEyNiBjb21wYXJldG90bWFnICAgODBFLTEgIDcgICAgICAgLT4gICAxCitkZGN0bTEyNyBjb21wYXJldG90bWFnICAgOC4wICAgIDdFKzAgICAgLT4gICAxCitkZGN0bTEyOCBjb21wYXJldG90bWFnICAgOC4wICAgIDcwRS0xICAgLT4gICAxCitkZGN0bTEyOSBjb21wYXJldG90bWFnICAgOCAgICAgIDAuN0UrMSAgIC0+ICAgMQorZGRjdG0xMzAgY29tcGFyZXRvdG1hZyAgIDggICAgICA3MEUtMSAgIC0+ICAgMQorCitkZGN0bTE0MCBjb21wYXJldG90bWFnICAgOC4wICAgIDkuMCAgICAgLT4gIC0xCitkZGN0bTE0MSBjb21wYXJldG90bWFnICAgOC4wICAgIDkgICAgICAgLT4gIC0xCitkZGN0bTE0MiBjb21wYXJldG90bWFnICAgOCAgICAgIDkuMCAgICAgLT4gIC0xCitkZGN0bTE0MyBjb21wYXJldG90bWFnICAgOEUrMCAgIDkuMCAgICAgLT4gIC0xCitkZGN0bTE0NCBjb21wYXJldG90bWFnICAgODBFLTEgIDkuMCAgICAgLT4gIC0xCitkZGN0bTE0NSBjb21wYXJldG90bWFnICAgMC44RSsxIDkgICAgICAgLT4gIC0xCitkZGN0bTE0NiBjb21wYXJldG90bWFnICAgODBFLTEgIDkgICAgICAgLT4gIC0xCitkZGN0bTE0NyBjb21wYXJldG90bWFnICAgOC4wICAgIDlFKzAgICAgLT4gIC0xCitkZGN0bTE0OCBjb21wYXJldG90bWFnICAgOC4wICAgIDkwRS0xICAgLT4gIC0xCitkZGN0bTE0OSBjb21wYXJldG90bWFnICAgOCAgICAgIDAuOUUrMSAgLT4gIC0xCitkZGN0bTE1MCBjb21wYXJldG90bWFnICAgOCAgICAgIDkwRS0xICAgLT4gIC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLSsgLi4KK2RkY3RtMjAwIGNvbXBhcmV0b3RtYWcgIC03LjAgICAgNy4wICAgICAtPiAgIDAKK2RkY3RtMjAxIGNvbXBhcmV0b3RtYWcgIC03LjAgICAgNyAgICAgICAtPiAgLTEKK2RkY3RtMjAyIGNvbXBhcmV0b3RtYWcgIC03ICAgICAgNy4wICAgICAtPiAgIDEKK2RkY3RtMjAzIGNvbXBhcmV0b3RtYWcgIC03RSswICAgNy4wICAgICAtPiAgIDEKK2RkY3RtMjA0IGNvbXBhcmV0b3RtYWcgIC03MEUtMSAgNy4wICAgICAtPiAgIDAKK2RkY3RtMjA1IGNvbXBhcmV0b3RtYWcgIC0wLjdFKzEgNyAgICAgICAtPiAgIDAKK2RkY3RtMjA2IGNvbXBhcmV0b3RtYWcgIC03MEUtMSAgNyAgICAgICAtPiAgLTEKK2RkY3RtMjA3IGNvbXBhcmV0b3RtYWcgIC03LjAgICAgN0UrMCAgICAtPiAgLTEKK2RkY3RtMjA4IGNvbXBhcmV0b3RtYWcgIC03LjAgICAgNzBFLTEgICAtPiAgIDAKK2RkY3RtMjA5IGNvbXBhcmV0b3RtYWcgIC03ICAgICAgMC43RSsxICAtPiAgIDAKK2RkY3RtMjEwIGNvbXBhcmV0b3RtYWcgIC03ICAgICAgNzBFLTEgICAtPiAgIDEKKworZGRjdG0yMjAgY29tcGFyZXRvdG1hZyAgLTguMCAgICA3LjAgICAgIC0+ICAgMQorZGRjdG0yMjEgY29tcGFyZXRvdG1hZyAgLTguMCAgICA3ICAgICAgIC0+ICAgMQorZGRjdG0yMjIgY29tcGFyZXRvdG1hZyAgLTggICAgICA3LjAgICAgIC0+ICAgMQorZGRjdG0yMjMgY29tcGFyZXRvdG1hZyAgLThFKzAgICA3LjAgICAgIC0+ICAgMQorZGRjdG0yMjQgY29tcGFyZXRvdG1hZyAgLTgwRS0xICA3LjAgICAgIC0+ICAgMQorZGRjdG0yMjUgY29tcGFyZXRvdG1hZyAgLTAuOEUrMSA3ICAgICAgIC0+ICAgMQorZGRjdG0yMjYgY29tcGFyZXRvdG1hZyAgLTgwRS0xICA3ICAgICAgIC0+ICAgMQorZGRjdG0yMjcgY29tcGFyZXRvdG1hZyAgLTguMCAgICA3RSswICAgIC0+ICAgMQorZGRjdG0yMjggY29tcGFyZXRvdG1hZyAgLTguMCAgICA3MEUtMSAgIC0+ICAgMQorZGRjdG0yMjkgY29tcGFyZXRvdG1hZyAgLTggICAgICAwLjdFKzEgIC0+ICAgMQorZGRjdG0yMzAgY29tcGFyZXRvdG1hZyAgLTggICAgICA3MEUtMSAgIC0+ICAgMQorCitkZGN0bTI0MCBjb21wYXJldG90bWFnICAtOC4wICAgIDkuMCAgICAgLT4gIC0xCitkZGN0bTI0MSBjb21wYXJldG90bWFnICAtOC4wICAgIDkgICAgICAgLT4gIC0xCitkZGN0bTI0MiBjb21wYXJldG90bWFnICAtOCAgICAgIDkuMCAgICAgLT4gIC0xCitkZGN0bTI0MyBjb21wYXJldG90bWFnICAtOEUrMCAgIDkuMCAgICAgLT4gIC0xCitkZGN0bTI0NCBjb21wYXJldG90bWFnICAtODBFLTEgIDkuMCAgICAgLT4gIC0xCitkZGN0bTI0NSBjb21wYXJldG90bWFnICAtMC44RSsxIDkgICAgICAgLT4gIC0xCitkZGN0bTI0NiBjb21wYXJldG90bWFnICAtODBFLTEgIDkgICAgICAgLT4gIC0xCitkZGN0bTI0NyBjb21wYXJldG90bWFnICAtOC4wICAgIDlFKzAgICAgLT4gIC0xCitkZGN0bTI0OCBjb21wYXJldG90bWFnICAtOC4wICAgIDkwRS0xICAgLT4gIC0xCitkZGN0bTI0OSBjb21wYXJldG90bWFnICAtOCAgICAgIDAuOUUrMSAgLT4gIC0xCitkZGN0bTI1MCBjb21wYXJldG90bWFnICAtOCAgICAgIDkwRS0xICAgLT4gIC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgKy0gLi4KK2RkY3RtMzAwIGNvbXBhcmV0b3RtYWcgICA3LjAgICAgLTcuMCAgICAgLT4gICAwCitkZGN0bTMwMSBjb21wYXJldG90bWFnICAgNy4wICAgIC03ICAgICAgIC0+ICAtMQorZGRjdG0zMDIgY29tcGFyZXRvdG1hZyAgIDcgICAgICAtNy4wICAgICAtPiAgIDEKK2RkY3RtMzAzIGNvbXBhcmV0b3RtYWcgICA3RSswICAgLTcuMCAgICAgLT4gICAxCitkZGN0bTMwNCBjb21wYXJldG90bWFnICAgNzBFLTEgIC03LjAgICAgIC0+ICAgMAorZGRjdG0zMDUgY29tcGFyZXRvdG1hZyAgIC43RSsxICAtNyAgICAgICAtPiAgIDAKK2RkY3RtMzA2IGNvbXBhcmV0b3RtYWcgICA3MEUtMSAgLTcgICAgICAgLT4gIC0xCitkZGN0bTMwNyBjb21wYXJldG90bWFnICAgNy4wICAgIC03RSswICAgIC0+ICAtMQorZGRjdG0zMDggY29tcGFyZXRvdG1hZyAgIDcuMCAgICAtNzBFLTEgICAtPiAgIDAKK2RkY3RtMzA5IGNvbXBhcmV0b3RtYWcgICA3ICAgICAgLS43RSsxICAgLT4gICAwCitkZGN0bTMxMCBjb21wYXJldG90bWFnICAgNyAgICAgIC03MEUtMSAgIC0+ICAgMQorCitkZGN0bTMyMCBjb21wYXJldG90bWFnICAgOC4wICAgIC03LjAgICAgIC0+ICAgMQorZGRjdG0zMjEgY29tcGFyZXRvdG1hZyAgIDguMCAgICAtNyAgICAgICAtPiAgIDEKK2RkY3RtMzIyIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgLTcuMCAgICAgLT4gICAxCitkZGN0bTMyMyBjb21wYXJldG90bWFnICAgOEUrMCAgIC03LjAgICAgIC0+ICAgMQorZGRjdG0zMjQgY29tcGFyZXRvdG1hZyAgIDgwRS0xICAtNy4wICAgICAtPiAgIDEKK2RkY3RtMzI1IGNvbXBhcmV0b3RtYWcgICAuOEUrMSAgLTcgICAgICAgLT4gICAxCitkZGN0bTMyNiBjb21wYXJldG90bWFnICAgODBFLTEgIC03ICAgICAgIC0+ICAgMQorZGRjdG0zMjcgY29tcGFyZXRvdG1hZyAgIDguMCAgICAtN0UrMCAgICAtPiAgIDEKK2RkY3RtMzI4IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTcwRS0xICAgLT4gICAxCitkZGN0bTMyOSBjb21wYXJldG90bWFnICAgOCAgICAgIC0uN0UrMSAgIC0+ICAgMQorZGRjdG0zMzAgY29tcGFyZXRvdG1hZyAgIDggICAgICAtNzBFLTEgICAtPiAgIDEKKworZGRjdG0zNDAgY29tcGFyZXRvdG1hZyAgIDguMCAgICAtOS4wICAgICAtPiAgLTEKK2RkY3RtMzQxIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTkgICAgICAgLT4gIC0xCitkZGN0bTM0MiBjb21wYXJldG90bWFnICAgOCAgICAgIC05LjAgICAgIC0+ICAtMQorZGRjdG0zNDMgY29tcGFyZXRvdG1hZyAgIDhFKzAgICAtOS4wICAgICAtPiAgLTEKK2RkY3RtMzQ0IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgLTkuMCAgICAgLT4gIC0xCitkZGN0bTM0NSBjb21wYXJldG90bWFnICAgLjhFKzEgIC05ICAgICAgIC0+ICAtMQorZGRjdG0zNDYgY29tcGFyZXRvdG1hZyAgIDgwRS0xICAtOSAgICAgICAtPiAgLTEKK2RkY3RtMzQ3IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTlFKzAgICAgLT4gIC0xCitkZGN0bTM0OCBjb21wYXJldG90bWFnICAgOC4wICAgIC05MEUtMSAgIC0+ICAtMQorZGRjdG0zNDkgY29tcGFyZXRvdG1hZyAgIDggICAgICAtLjlFKzEgICAtPiAgLTEKK2RkY3RtMzUwIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgLTkwRS0xICAgLT4gIC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLS0gLi4KK2RkY3RtNDAwIGNvbXBhcmV0b3RtYWcgICAtNy4wICAgIC03LjAgICAgIC0+ICAgMAorZGRjdG00MDEgY29tcGFyZXRvdG1hZyAgIC03LjAgICAgLTcgICAgICAgLT4gIC0xCitkZGN0bTQwMiBjb21wYXJldG90bWFnICAgLTcgICAgICAtNy4wICAgICAtPiAgIDEKK2RkY3RtNDAzIGNvbXBhcmV0b3RtYWcgICAtN0UrMCAgIC03LjAgICAgIC0+ICAgMQorZGRjdG00MDQgY29tcGFyZXRvdG1hZyAgIC03MEUtMSAgLTcuMCAgICAgLT4gICAwCitkZGN0bTQwNSBjb21wYXJldG90bWFnICAgLS43RSsxICAtNyAgICAgICAtPiAgIDAKK2RkY3RtNDA2IGNvbXBhcmV0b3RtYWcgICAtNzBFLTEgIC03ICAgICAgIC0+ICAtMQorZGRjdG00MDcgY29tcGFyZXRvdG1hZyAgIC03LjAgICAgLTdFKzAgICAgLT4gIC0xCitkZGN0bTQwOCBjb21wYXJldG90bWFnICAgLTcuMCAgICAtNzBFLTEgICAtPiAgIDAKK2RkY3RtNDA5IGNvbXBhcmV0b3RtYWcgICAtNyAgICAgIC0uN0UrMSAgIC0+ICAgMAorZGRjdG00MTAgY29tcGFyZXRvdG1hZyAgIC03ICAgICAgLTcwRS0xICAgLT4gICAxCisKK2RkY3RtNDIwIGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC03LjAgICAgIC0+ICAgMQorZGRjdG00MjEgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTcgICAgICAgLT4gICAxCitkZGN0bTQyMiBjb21wYXJldG90bWFnICAgLTggICAgICAtNy4wICAgICAtPiAgIDEKK2RkY3RtNDIzIGNvbXBhcmV0b3RtYWcgICAtOEUrMCAgIC03LjAgICAgIC0+ICAgMQorZGRjdG00MjQgY29tcGFyZXRvdG1hZyAgIC04MEUtMSAgLTcuMCAgICAgLT4gICAxCitkZGN0bTQyNSBjb21wYXJldG90bWFnICAgLS44RSsxICAtNyAgICAgICAtPiAgIDEKK2RkY3RtNDI2IGNvbXBhcmV0b3RtYWcgICAtODBFLTEgIC03ICAgICAgIC0+ICAgMQorZGRjdG00MjcgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTdFKzAgICAgLT4gICAxCitkZGN0bTQyOCBjb21wYXJldG90bWFnICAgLTguMCAgICAtNzBFLTEgICAtPiAgIDEKK2RkY3RtNDI5IGNvbXBhcmV0b3RtYWcgICAtOCAgICAgIC0uN0UrMSAgIC0+ICAgMQorZGRjdG00MzAgY29tcGFyZXRvdG1hZyAgIC04ICAgICAgLTcwRS0xICAgLT4gICAxCisKK2RkY3RtNDQwIGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC05LjAgICAgIC0+ICAtMQorZGRjdG00NDEgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTkgICAgICAgLT4gIC0xCitkZGN0bTQ0MiBjb21wYXJldG90bWFnICAgLTggICAgICAtOS4wICAgICAtPiAgLTEKK2RkY3RtNDQzIGNvbXBhcmV0b3RtYWcgICAtOEUrMCAgIC05LjAgICAgIC0+ICAtMQorZGRjdG00NDQgY29tcGFyZXRvdG1hZyAgIC04MEUtMSAgLTkuMCAgICAgLT4gIC0xCitkZGN0bTQ0NSBjb21wYXJldG90bWFnICAgLS44RSsxICAtOSAgICAgICAtPiAgLTEKK2RkY3RtNDQ2IGNvbXBhcmV0b3RtYWcgICAtODBFLTEgIC05ICAgICAgIC0+ICAtMQorZGRjdG00NDcgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTlFKzAgICAgLT4gIC0xCitkZGN0bTQ0OCBjb21wYXJldG90bWFnICAgLTguMCAgICAtOTBFLTEgICAtPiAgLTEKK2RkY3RtNDQ5IGNvbXBhcmV0b3RtYWcgICAtOCAgICAgIC0uOUUrMSAgIC0+ICAtMQorZGRjdG00NTAgY29tcGFyZXRvdG1hZyAgIC04ICAgICAgLTkwRS0xICAgLT4gIC0xCisKKworLS0gdGVzdGNhc2VzIHRoYXQgc3VidHJhY3QgdG8gbG90cyBvZiB6ZXJvcyBhdCBib3VuZGFyaWVzIFtwZ3JdCitkZGN0bTQ3MyBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitkZGN0bTQ3NCBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDAwMDBFKzg5IDEyMy40NTZFKzg5ICAtPiAgLTEKK2RkY3RtNDc1IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitkZGN0bTQ3NiBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDAwRSs4OSAxMjMuNDU2RSs4OSAgLT4gIC0xCitkZGN0bTQ3NyBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDBFLTg5IDEyMy40NTZFLTg5ICAtPiAgLTEKK2RkY3RtNDc4IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwRSs4OSAxMjMuNDU2RSs4OSAgLT4gIC0xCitkZGN0bTQ3OSBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitkZGN0bTQ4MCBjb21wYXJldG90bWFnIDEyMy40NTYwMDBFKzg5IDEyMy40NTZFKzg5ICAtPiAgLTEKK2RkY3RtNDgxIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitkZGN0bTQ4MiBjb21wYXJldG90bWFnIDEyMy40NTYwRSs4OSAxMjMuNDU2RSs4OSAgLT4gIC0xCitkZGN0bTQ4MyBjb21wYXJldG90bWFnIDEyMy40NTZFLTg5IDEyMy40NTZFLTg5ICAtPiAgIDAKK2RkY3RtNDg3IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMDAwMDBFKzg5ICAtPiAgIDEKK2RkY3RtNDg4IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDAwMEUtODkgIC0+ICAgMQorZGRjdG00ODkgY29tcGFyZXRvdG1hZyAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwMDBFKzg5ICAtPiAgIDEKK2RkY3RtNDkwIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDBFLTg5ICAtPiAgIDEKK2RkY3RtNDkxIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMEUrODkgIC0+ICAgMQorZGRjdG00OTIgY29tcGFyZXRvdG1hZyAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDBFLTg5ICAtPiAgIDEKK2RkY3RtNDkzIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDBFKzg5ICAtPiAgIDEKK2RkY3RtNDk0IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMEUtODkgIC0+ICAgMQorZGRjdG00OTUgY29tcGFyZXRvdG1hZyAxMjMuNDU2RSs4OSAxMjMuNDU2MDBFKzg5ICAtPiAgIDEKK2RkY3RtNDk2IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjBFLTg5ICAtPiAgIDEKK2RkY3RtNDk3IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUrODkgMTIzLjQ1NkUrODkgIC0+ICAgMAorCistLSB3aWRlLXJhbmdpbmcsIGFyb3VuZCBwcmVjaXNpb247IHNpZ25zIGVxdWFsCitkZGN0bTQ5OCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTE3ICAgICAtPiAgIDEKK2RkY3RtNDk5IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTYgICAgIC0+ICAgMQorZGRjdG01MDAgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xNSAgICAgLT4gICAxCitkZGN0bTUwMSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTE0ICAgICAtPiAgIDEKK2RkY3RtNTAyIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTMgICAgIC0+ICAgMQorZGRjdG01MDMgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xMiAgICAgLT4gICAxCitkZGN0bTUwNCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTExICAgICAtPiAgIDEKK2RkY3RtNTA1IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTAgICAgIC0+ICAgMQorZGRjdG01MDYgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS05ICAgICAgLT4gICAxCitkZGN0bTUwNyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTggICAgICAtPiAgIDEKK2RkY3RtNTA4IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtNyAgICAgIC0+ICAgMQorZGRjdG01MDkgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS02ICAgICAgLT4gICAxCitkZGN0bTUxMCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTUgICAgICAtPiAgIDEKK2RkY3RtNTExIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtNCAgICAgIC0+ICAgMQorZGRjdG01MTIgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0zICAgICAgLT4gICAxCitkZGN0bTUxMyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTIgICAgICAtPiAgIDEKK2RkY3RtNTE0IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMSAgICAgIC0+ICAgMQorZGRjdG01MTUgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0wICAgICAgLT4gICAwCitkZGN0bTUxNiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzEgICAgICAtPiAgLTEKK2RkY3RtNTE3IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMiAgICAgIC0+ICAtMQorZGRjdG01MTggY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSszICAgICAgLT4gIC0xCitkZGN0bTUxOSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzQgICAgICAtPiAgLTEKK2RkY3RtNTIxIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrNSAgICAgIC0+ICAtMQorZGRjdG01MjIgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSs2ICAgICAgLT4gIC0xCitkZGN0bTUyMyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzcgICAgICAtPiAgLTEKK2RkY3RtNTI0IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrOCAgICAgIC0+ICAtMQorZGRjdG01MjUgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSs5ICAgICAgLT4gIC0xCitkZGN0bTUyNiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzEwICAgICAtPiAgLTEKK2RkY3RtNTI3IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTEgICAgIC0+ICAtMQorZGRjdG01MjggY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxMiAgICAgLT4gIC0xCitkZGN0bTUyOSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzEzICAgICAtPiAgLTEKK2RkY3RtNTMwIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTQgICAgIC0+ICAtMQorZGRjdG01MzEgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxNSAgICAgLT4gIC0xCitkZGN0bTUzMiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzE2ICAgICAtPiAgLTEKK2RkY3RtNTMzIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTcgICAgIC0+ICAtMQorLS0gTFIgc3dhcAorZGRjdG01MzggY29tcGFyZXRvdG1hZyAgICAxRS0xNyAgMSAgICAgICAgLT4gIC0xCitkZGN0bTUzOSBjb21wYXJldG90bWFnICAgIDFFLTE2ICAxICAgICAgICAtPiAgLTEKK2RkY3RtNTQwIGNvbXBhcmV0b3RtYWcgICAgMUUtMTUgIDEgICAgICAgIC0+ICAtMQorZGRjdG01NDEgY29tcGFyZXRvdG1hZyAgICAxRS0xNCAgMSAgICAgICAgLT4gIC0xCitkZGN0bTU0MiBjb21wYXJldG90bWFnICAgIDFFLTEzICAxICAgICAgICAtPiAgLTEKK2RkY3RtNTQzIGNvbXBhcmV0b3RtYWcgICAgMUUtMTIgIDEgICAgICAgIC0+ICAtMQorZGRjdG01NDQgY29tcGFyZXRvdG1hZyAgICAxRS0xMSAgMSAgICAgICAgLT4gIC0xCitkZGN0bTU0NSBjb21wYXJldG90bWFnICAgIDFFLTEwICAxICAgICAgICAtPiAgLTEKK2RkY3RtNTQ2IGNvbXBhcmV0b3RtYWcgICAgMUUtOSAgIDEgICAgICAgIC0+ICAtMQorZGRjdG01NDcgY29tcGFyZXRvdG1hZyAgICAxRS04ICAgMSAgICAgICAgLT4gIC0xCitkZGN0bTU0OCBjb21wYXJldG90bWFnICAgIDFFLTcgICAxICAgICAgICAtPiAgLTEKK2RkY3RtNTQ5IGNvbXBhcmV0b3RtYWcgICAgMUUtNiAgIDEgICAgICAgIC0+ICAtMQorZGRjdG01NTAgY29tcGFyZXRvdG1hZyAgICAxRS01ICAgMSAgICAgICAgLT4gIC0xCitkZGN0bTU1MSBjb21wYXJldG90bWFnICAgIDFFLTQgICAxICAgICAgICAtPiAgLTEKK2RkY3RtNTUyIGNvbXBhcmV0b3RtYWcgICAgMUUtMyAgIDEgICAgICAgIC0+ICAtMQorZGRjdG01NTMgY29tcGFyZXRvdG1hZyAgICAxRS0yICAgMSAgICAgICAgLT4gIC0xCitkZGN0bTU1NCBjb21wYXJldG90bWFnICAgIDFFLTEgICAxICAgICAgICAtPiAgLTEKK2RkY3RtNTU1IGNvbXBhcmV0b3RtYWcgICAgMUUtMCAgIDEgICAgICAgIC0+ICAgMAorZGRjdG01NTYgY29tcGFyZXRvdG1hZyAgICAxRSsxICAgMSAgICAgICAgLT4gICAxCitkZGN0bTU1NyBjb21wYXJldG90bWFnICAgIDFFKzIgICAxICAgICAgICAtPiAgIDEKK2RkY3RtNTU4IGNvbXBhcmV0b3RtYWcgICAgMUUrMyAgIDEgICAgICAgIC0+ICAgMQorZGRjdG01NTkgY29tcGFyZXRvdG1hZyAgICAxRSs0ICAgMSAgICAgICAgLT4gICAxCitkZGN0bTU2MSBjb21wYXJldG90bWFnICAgIDFFKzUgICAxICAgICAgICAtPiAgIDEKK2RkY3RtNTYyIGNvbXBhcmV0b3RtYWcgICAgMUUrNiAgIDEgICAgICAgIC0+ICAgMQorZGRjdG01NjMgY29tcGFyZXRvdG1hZyAgICAxRSs3ICAgMSAgICAgICAgLT4gICAxCitkZGN0bTU2NCBjb21wYXJldG90bWFnICAgIDFFKzggICAxICAgICAgICAtPiAgIDEKK2RkY3RtNTY1IGNvbXBhcmV0b3RtYWcgICAgMUUrOSAgIDEgICAgICAgIC0+ICAgMQorZGRjdG01NjYgY29tcGFyZXRvdG1hZyAgICAxRSsxMCAgMSAgICAgICAgLT4gICAxCitkZGN0bTU2NyBjb21wYXJldG90bWFnICAgIDFFKzExICAxICAgICAgICAtPiAgIDEKK2RkY3RtNTY4IGNvbXBhcmV0b3RtYWcgICAgMUUrMTIgIDEgICAgICAgIC0+ICAgMQorZGRjdG01NjkgY29tcGFyZXRvdG1hZyAgICAxRSsxMyAgMSAgICAgICAgLT4gICAxCitkZGN0bTU3MCBjb21wYXJldG90bWFnICAgIDFFKzE0ICAxICAgICAgICAtPiAgIDEKK2RkY3RtNTcxIGNvbXBhcmV0b3RtYWcgICAgMUUrMTUgIDEgICAgICAgIC0+ICAgMQorZGRjdG01NzIgY29tcGFyZXRvdG1hZyAgICAxRSsxNiAgMSAgICAgICAgLT4gICAxCitkZGN0bTU3MyBjb21wYXJldG90bWFnICAgIDFFKzE3ICAxICAgICAgICAtPiAgIDEKKy0tIHNpbWlsYXIgd2l0aCBhIHVzZWZ1bCBjb2VmZmljaWVudCwgb25lIHNpZGUgb25seQorZGRjdG01NzggY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE3ICAgICAtPiAgIDEKK2RkY3RtNTc5IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNiAgICAgLT4gICAxCitkZGN0bTU4MCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTUgICAgIC0+ICAgMQorZGRjdG01ODEgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE0ICAgICAtPiAgIDEKK2RkY3RtNTgyIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMyAgICAgLT4gICAxCitkZGN0bTU4MyBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTIgICAgIC0+ICAgMQorZGRjdG01ODQgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTExICAgICAtPiAgIDEKK2RkY3RtNTg1IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMCAgICAgLT4gICAxCitkZGN0bTU4NiBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOSAgICAgIC0+ICAgMQorZGRjdG01ODcgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTggICAgICAtPiAgIDEKK2RkY3RtNTg4IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS03ICAgICAgLT4gICAxCitkZGN0bTU4OSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNiAgICAgIC0+ICAtMQorZGRjdG01OTAgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTUgICAgICAtPiAgLTEKK2RkY3RtNTkxIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS00ICAgICAgLT4gIC0xCitkZGN0bTU5MiBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMyAgICAgIC0+ICAtMQorZGRjdG01OTMgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTIgICAgICAtPiAgLTEKK2RkY3RtNTk0IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xICAgICAgLT4gIC0xCitkZGN0bTU5NSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMCAgICAgIC0+ICAtMQorZGRjdG01OTYgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzEgICAgICAtPiAgLTEKK2RkY3RtNTk3IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsyICAgICAgLT4gIC0xCitkZGN0bTU5OCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMyAgICAgIC0+ICAtMQorZGRjdG01OTkgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzQgICAgICAtPiAgLTEKKworLS0gY2hlY2sgc29tZSB1bml0LXkgdHJhcHMKK2RkY3RtNjAwIGNvbXBhcmV0b3RtYWcgICAxMiAgICAgICAgICAgIDEyLjIzNDUgIC0+ICAtMQorZGRjdG02MDEgY29tcGFyZXRvdG1hZyAgIDEyLjAgICAgICAgICAgMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYwMiBjb21wYXJldG90bWFnICAgMTIuMDAgICAgICAgICAxMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjAzIGNvbXBhcmV0b3RtYWcgICAxMi4wMDAgICAgICAgIDEyLjIzNDUgIC0+ICAtMQorZGRjdG02MDQgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAgICAgICAgMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYwNSBjb21wYXJldG90bWFnICAgMTIuMDAwMDAgICAgICAxMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjA2IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAgICAgIDEyLjIzNDUgIC0+ICAtMQorZGRjdG02MDcgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMDAgICAgMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYwOCBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwMDAgICAxMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjA5IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAwMDAgIDEyLjIzNDUgIC0+ICAtMQorZGRjdG02MTAgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIgICAgICAgICAgICAgLT4gICAxCitkZGN0bTYxMSBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wICAgICAgICAgICAtPiAgIDEKK2RkY3RtNjEyIGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwICAgICAgICAgIC0+ICAgMQorZGRjdG02MTMgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwICAgICAgICAgLT4gICAxCitkZGN0bTYxNCBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAwICAgICAgICAtPiAgIDEKK2RkY3RtNjE1IGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMDAwICAgICAgIC0+ICAgMQorZGRjdG02MTYgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwMDAwICAgICAgLT4gICAxCitkZGN0bTYxNyBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAwMDAwICAgICAtPiAgIDEKK2RkY3RtNjE4IGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMDAwMDAwICAgIC0+ICAgMQorZGRjdG02MTkgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwMDAwMDAwICAgLT4gICAxCitkZGN0bTYyMCBjb21wYXJldG90bWFnICAtMTIgICAgICAgICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjIxIGNvbXBhcmV0b3RtYWcgIC0xMi4wICAgICAgICAgLTEyLjIzNDUgIC0+ICAtMQorZGRjdG02MjIgY29tcGFyZXRvdG1hZyAgLTEyLjAwICAgICAgICAtMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYyMyBjb21wYXJldG90bWFnICAtMTIuMDAwICAgICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjI0IGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAwICAgICAgLTEyLjIzNDUgIC0+ICAtMQorZGRjdG02MjUgY29tcGFyZXRvdG1hZyAgLTEyLjAwMDAwICAgICAtMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYyNiBjb21wYXJldG90bWFnICAtMTIuMDAwMDAwICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjI3IGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAwMDAwICAgLTEyLjIzNDUgIC0+ICAtMQorZGRjdG02MjggY29tcGFyZXRvdG1hZyAgLTEyLjAwMDAwMDAwICAtMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYyOSBjb21wYXJldG90bWFnICAtMTIuMDAwMDAwMDAwIC0xMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjMwIGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMiAgICAgICAgICAgIC0+ICAgMQorZGRjdG02MzEgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAgICAgICAgICAgLT4gICAxCitkZGN0bTYzMiBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAgICAgICAgICAtPiAgIDEKK2RkY3RtNjMzIGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAgICAgICAgIC0+ICAgMQorZGRjdG02MzQgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMDAgICAgICAgLT4gICAxCitkZGN0bTYzNSBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwMDAgICAgICAtPiAgIDEKK2RkY3RtNjM2IGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAgICAgIC0+ICAgMQorZGRjdG02MzcgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMDAwMDAgICAgLT4gICAxCitkZGN0bTYzOCBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAgICAtPiAgIDEKK2RkY3RtNjM5IGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMDAgIC0+ICAgMQorCistLSBleHRlbmRlZCB6ZXJvcworZGRjdG02NDAgY29tcGFyZXRvdG1hZyAgIDAgICAgIDAgICAgLT4gICAwCitkZGN0bTY0MSBjb21wYXJldG90bWFnICAgMCAgICAtMCAgICAtPiAgIDAKK2RkY3RtNjQyIGNvbXBhcmV0b3RtYWcgICAwICAgIC0wLjAgIC0+ICAgMQorZGRjdG02NDMgY29tcGFyZXRvdG1hZyAgIDAgICAgIDAuMCAgLT4gICAxCitkZGN0bTY0NCBjb21wYXJldG90bWFnICAtMCAgICAgMCAgICAtPiAgIDAKK2RkY3RtNjQ1IGNvbXBhcmV0b3RtYWcgIC0wICAgIC0wICAgIC0+ICAgMAorZGRjdG02NDYgY29tcGFyZXRvdG1hZyAgLTAgICAgLTAuMCAgLT4gICAxCitkZGN0bTY0NyBjb21wYXJldG90bWFnICAtMCAgICAgMC4wICAtPiAgIDEKK2RkY3RtNjQ4IGNvbXBhcmV0b3RtYWcgICAwLjAgICAwICAgIC0+ICAtMQorZGRjdG02NDkgY29tcGFyZXRvdG1hZyAgIDAuMCAgLTAgICAgLT4gIC0xCitkZGN0bTY1MCBjb21wYXJldG90bWFnICAgMC4wICAtMC4wICAtPiAgIDAKK2RkY3RtNjUxIGNvbXBhcmV0b3RtYWcgICAwLjAgICAwLjAgIC0+ICAgMAorZGRjdG02NTIgY29tcGFyZXRvdG1hZyAgLTAuMCAgIDAgICAgLT4gIC0xCitkZGN0bTY1MyBjb21wYXJldG90bWFnICAtMC4wICAtMCAgICAtPiAgLTEKK2RkY3RtNjU0IGNvbXBhcmV0b3RtYWcgIC0wLjAgIC0wLjAgIC0+ICAgMAorZGRjdG02NTUgY29tcGFyZXRvdG1hZyAgLTAuMCAgIDAuMCAgLT4gICAwCisKK2RkY3RtNjU2IGNvbXBhcmV0b3RtYWcgIC0wRTEgICAwLjAgIC0+ICAgMQorZGRjdG02NTcgY29tcGFyZXRvdG1hZyAgLTBFMiAgIDAuMCAgLT4gICAxCitkZGN0bTY1OCBjb21wYXJldG90bWFnICAgMEUxICAgMC4wICAtPiAgIDEKK2RkY3RtNjU5IGNvbXBhcmV0b3RtYWcgICAwRTIgICAwLjAgIC0+ICAgMQorZGRjdG02NjAgY29tcGFyZXRvdG1hZyAgLTBFMSAgIDAgICAgLT4gICAxCitkZGN0bTY2MSBjb21wYXJldG90bWFnICAtMEUyICAgMCAgICAtPiAgIDEKK2RkY3RtNjYyIGNvbXBhcmV0b3RtYWcgICAwRTEgICAwICAgIC0+ICAgMQorZGRjdG02NjMgY29tcGFyZXRvdG1hZyAgIDBFMiAgIDAgICAgLT4gICAxCitkZGN0bTY2NCBjb21wYXJldG90bWFnICAtMEUxICAtMEUxICAtPiAgIDAKK2RkY3RtNjY1IGNvbXBhcmV0b3RtYWcgIC0wRTIgIC0wRTEgIC0+ICAgMQorZGRjdG02NjYgY29tcGFyZXRvdG1hZyAgIDBFMSAgLTBFMSAgLT4gICAwCitkZGN0bTY2NyBjb21wYXJldG90bWFnICAgMEUyICAtMEUxICAtPiAgIDEKK2RkY3RtNjY4IGNvbXBhcmV0b3RtYWcgIC0wRTEgIC0wRTIgIC0+ICAtMQorZGRjdG02NjkgY29tcGFyZXRvdG1hZyAgLTBFMiAgLTBFMiAgLT4gICAwCitkZGN0bTY3MCBjb21wYXJldG90bWFnICAgMEUxICAtMEUyICAtPiAgLTEKK2RkY3RtNjcxIGNvbXBhcmV0b3RtYWcgICAwRTIgIC0wRTIgIC0+ICAgMAorZGRjdG02NzIgY29tcGFyZXRvdG1hZyAgLTBFMSAgIDBFMSAgLT4gICAwCitkZGN0bTY3MyBjb21wYXJldG90bWFnICAtMEUyICAgMEUxICAtPiAgIDEKK2RkY3RtNjc0IGNvbXBhcmV0b3RtYWcgICAwRTEgICAwRTEgIC0+ICAgMAorZGRjdG02NzUgY29tcGFyZXRvdG1hZyAgIDBFMiAgIDBFMSAgLT4gICAxCitkZGN0bTY3NiBjb21wYXJldG90bWFnICAtMEUxICAgMEUyICAtPiAgLTEKK2RkY3RtNjc3IGNvbXBhcmV0b3RtYWcgIC0wRTIgICAwRTIgIC0+ICAgMAorZGRjdG02NzggY29tcGFyZXRvdG1hZyAgIDBFMSAgIDBFMiAgLT4gIC0xCitkZGN0bTY3OSBjb21wYXJldG90bWFnICAgMEUyICAgMEUyICAtPiAgIDAKKworLS0gdHJhaWxpbmcgemVyb3M7IHVuaXQteQorZGRjdG02ODAgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyICAgICAgICAgICAgLT4gICAwCitkZGN0bTY4MSBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMCAgICAgICAgICAtPiAgIDEKK2RkY3RtNjgyIGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMCAgICAgICAgIC0+ICAgMQorZGRjdG02ODMgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMCAgICAgICAgLT4gICAxCitkZGN0bTY4NCBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwMCAgICAgICAtPiAgIDEKK2RkY3RtNjg1IGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAwMCAgICAgIC0+ICAgMQorZGRjdG02ODYgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMDAwMCAgICAgLT4gICAxCitkZGN0bTY4NyBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwMDAwMCAgICAtPiAgIDEKK2RkY3RtNjg4IGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAwMDAwMCAgIC0+ICAgMQorZGRjdG02ODkgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMDAwMDAwMCAgLT4gICAxCitkZGN0bTY5MCBjb21wYXJldG90bWFnICAgMTIgICAgICAgICAgICAgIDEyICAtPiAgIDAKK2RkY3RtNjkxIGNvbXBhcmV0b3RtYWcgICAxMi4wICAgICAgICAgICAgMTIgIC0+ICAtMQorZGRjdG02OTIgY29tcGFyZXRvdG1hZyAgIDEyLjAwICAgICAgICAgICAxMiAgLT4gIC0xCitkZGN0bTY5MyBjb21wYXJldG90bWFnICAgMTIuMDAwICAgICAgICAgIDEyICAtPiAgLTEKK2RkY3RtNjk0IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwICAgICAgICAgMTIgIC0+ICAtMQorZGRjdG02OTUgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwICAgICAgICAxMiAgLT4gIC0xCitkZGN0bTY5NiBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwICAgICAgIDEyICAtPiAgLTEKK2RkY3RtNjk3IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAwICAgICAgMTIgIC0+ICAtMQorZGRjdG02OTggY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMDAwICAgICAxMiAgLT4gIC0xCitkZGN0bTY5OSBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwMDAwICAgIDEyICAtPiAgLTEKKworLS0gb2xkIGxvbmcgb3BlcmFuZCBjaGVja3MKK2RkY3RtNzAxIGNvbXBhcmV0b3RtYWcgMTIzNDU2NzgwMDAgIDEgIC0+ICAgMQorZGRjdG03MDIgY29tcGFyZXRvdG1hZyAxIDEyMzQ1Njc4MDAwICAgLT4gIC0xCitkZGN0bTcwMyBjb21wYXJldG90bWFnIDEyMzQ1Njc4MDAgICAxICAtPiAgIDEKK2RkY3RtNzA0IGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODAwICAgIC0+ICAtMQorZGRjdG03MDUgY29tcGFyZXRvdG1hZyAxMjM0NTY3ODkwICAgMSAgLT4gICAxCitkZGN0bTcwNiBjb21wYXJldG90bWFnIDEgMTIzNDU2Nzg5MCAgICAtPiAgLTEKK2RkY3RtNzA3IGNvbXBhcmV0b3RtYWcgMTIzNDU2Nzg5MSAgIDEgIC0+ICAgMQorZGRjdG03MDggY29tcGFyZXRvdG1hZyAxIDEyMzQ1Njc4OTEgICAgLT4gIC0xCitkZGN0bTcwOSBjb21wYXJldG90bWFnIDEyMzQ1Njc4OTAxICAxICAtPiAgIDEKK2RkY3RtNzEwIGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODkwMSAgIC0+ICAtMQorZGRjdG03MTEgY29tcGFyZXRvdG1hZyAxMjM0NTY3ODk2ICAgMSAgLT4gICAxCitkZGN0bTcxMiBjb21wYXJldG90bWFnIDEgMTIzNDU2Nzg5NiAgICAtPiAgLTEKK2RkY3RtNzEzIGNvbXBhcmV0b3RtYWcgLTEyMzQ1Njc4OTEgIDEgIC0+ICAgMQorZGRjdG03MTQgY29tcGFyZXRvdG1hZyAxIC0xMjM0NTY3ODkxICAgLT4gIC0xCitkZGN0bTcxNSBjb21wYXJldG90bWFnIC0xMjM0NTY3ODkwMSAxICAtPiAgIDEKK2RkY3RtNzE2IGNvbXBhcmV0b3RtYWcgMSAtMTIzNDU2Nzg5MDEgIC0+ICAtMQorZGRjdG03MTcgY29tcGFyZXRvdG1hZyAtMTIzNDU2Nzg5NiAgMSAgLT4gICAxCitkZGN0bTcxOCBjb21wYXJldG90bWFnIDEgLTEyMzQ1Njc4OTYgICAtPiAgLTEKKworLS0gb2xkIHJlc2lkdWUgY2FzZXMKK2RkY3RtNzQwIGNvbXBhcmV0b3RtYWcgIDEgIDAuOTk5OTk5OSAgIC0+ICAgMQorZGRjdG03NDEgY29tcGFyZXRvdG1hZyAgMSAgMC45OTk5OTkgICAgLT4gICAxCitkZGN0bTc0MiBjb21wYXJldG90bWFnICAxICAwLjk5OTk5ICAgICAtPiAgIDEKK2RkY3RtNzQzIGNvbXBhcmV0b3RtYWcgIDEgIDEuMDAwMCAgICAgIC0+ICAgMQorZGRjdG03NDQgY29tcGFyZXRvdG1hZyAgMSAgMS4wMDAwMSAgICAgLT4gIC0xCitkZGN0bTc0NSBjb21wYXJldG90bWFnICAxICAxLjAwMDAwMSAgICAtPiAgLTEKK2RkY3RtNzQ2IGNvbXBhcmV0b3RtYWcgIDEgIDEuMDAwMDAwMSAgIC0+ICAtMQorZGRjdG03NTAgY29tcGFyZXRvdG1hZyAgMC45OTk5OTk5ICAxICAgLT4gIC0xCitkZGN0bTc1MSBjb21wYXJldG90bWFnICAwLjk5OTk5OSAgIDEgICAtPiAgLTEKK2RkY3RtNzUyIGNvbXBhcmV0b3RtYWcgIDAuOTk5OTkgICAgMSAgIC0+ICAtMQorZGRjdG03NTMgY29tcGFyZXRvdG1hZyAgMS4wMDAwICAgICAxICAgLT4gIC0xCitkZGN0bTc1NCBjb21wYXJldG90bWFnICAxLjAwMDAxICAgIDEgICAtPiAgIDEKK2RkY3RtNzU1IGNvbXBhcmV0b3RtYWcgIDEuMDAwMDAxICAgMSAgIC0+ICAgMQorZGRjdG03NTYgY29tcGFyZXRvdG1hZyAgMS4wMDAwMDAxICAxICAgLT4gICAxCisKKy0tIFNwZWNpYWxzCitkZGN0bTc4MCBjb21wYXJldG90bWFnICBJbmYgIC1JbmYgICAtPiAgMAorZGRjdG03ODEgY29tcGFyZXRvdG1hZyAgSW5mICAtMTAwMCAgLT4gIDEKK2RkY3RtNzgyIGNvbXBhcmV0b3RtYWcgIEluZiAgLTEgICAgIC0+ICAxCitkZGN0bTc4MyBjb21wYXJldG90bWFnICBJbmYgIC0wICAgICAtPiAgMQorZGRjdG03ODQgY29tcGFyZXRvdG1hZyAgSW5mICAgMCAgICAgLT4gIDEKK2RkY3RtNzg1IGNvbXBhcmV0b3RtYWcgIEluZiAgIDEgICAgIC0+ICAxCitkZGN0bTc4NiBjb21wYXJldG90bWFnICBJbmYgICAxMDAwICAtPiAgMQorZGRjdG03ODcgY29tcGFyZXRvdG1hZyAgSW5mICAgSW5mICAgLT4gIDAKK2RkY3RtNzg4IGNvbXBhcmV0b3RtYWcgLTEwMDAgIEluZiAgIC0+IC0xCitkZGN0bTc4OSBjb21wYXJldG90bWFnIC1JbmYgICBJbmYgICAtPiAgMAorZGRjdG03OTAgY29tcGFyZXRvdG1hZyAtMSAgICAgSW5mICAgLT4gLTEKK2RkY3RtNzkxIGNvbXBhcmV0b3RtYWcgLTAgICAgIEluZiAgIC0+IC0xCitkZGN0bTc5MiBjb21wYXJldG90bWFnICAwICAgICBJbmYgICAtPiAtMQorZGRjdG03OTMgY29tcGFyZXRvdG1hZyAgMSAgICAgSW5mICAgLT4gLTEKK2RkY3RtNzk0IGNvbXBhcmV0b3RtYWcgIDEwMDAgIEluZiAgIC0+IC0xCitkZGN0bTc5NSBjb21wYXJldG90bWFnICBJbmYgICBJbmYgICAtPiAgMAorCitkZGN0bTgwMCBjb21wYXJldG90bWFnIC1JbmYgIC1JbmYgICAtPiAgMAorZGRjdG04MDEgY29tcGFyZXRvdG1hZyAtSW5mICAtMTAwMCAgLT4gIDEKK2RkY3RtODAyIGNvbXBhcmV0b3RtYWcgLUluZiAgLTEgICAgIC0+ICAxCitkZGN0bTgwMyBjb21wYXJldG90bWFnIC1JbmYgIC0wICAgICAtPiAgMQorZGRjdG04MDQgY29tcGFyZXRvdG1hZyAtSW5mICAgMCAgICAgLT4gIDEKK2RkY3RtODA1IGNvbXBhcmV0b3RtYWcgLUluZiAgIDEgICAgIC0+ICAxCitkZGN0bTgwNiBjb21wYXJldG90bWFnIC1JbmYgICAxMDAwICAtPiAgMQorZGRjdG04MDcgY29tcGFyZXRvdG1hZyAtSW5mICAgSW5mICAgLT4gIDAKK2RkY3RtODA4IGNvbXBhcmV0b3RtYWcgLUluZiAgLUluZiAgIC0+ICAwCitkZGN0bTgwOSBjb21wYXJldG90bWFnIC0xMDAwIC1JbmYgICAtPiAtMQorZGRjdG04MTAgY29tcGFyZXRvdG1hZyAtMSAgICAtSW5mICAgLT4gLTEKK2RkY3RtODExIGNvbXBhcmV0b3RtYWcgLTAgICAgLUluZiAgIC0+IC0xCitkZGN0bTgxMiBjb21wYXJldG90bWFnICAwICAgIC1JbmYgICAtPiAtMQorZGRjdG04MTMgY29tcGFyZXRvdG1hZyAgMSAgICAtSW5mICAgLT4gLTEKK2RkY3RtODE0IGNvbXBhcmV0b3RtYWcgIDEwMDAgLUluZiAgIC0+IC0xCitkZGN0bTgxNSBjb21wYXJldG90bWFnICBJbmYgIC1JbmYgICAtPiAgMAorCitkZGN0bTgyMSBjb21wYXJldG90bWFnICBOYU4gLUluZiAgICAtPiAgMQorZGRjdG04MjIgY29tcGFyZXRvdG1hZyAgTmFOIC0xMDAwICAgLT4gIDEKK2RkY3RtODIzIGNvbXBhcmV0b3RtYWcgIE5hTiAtMSAgICAgIC0+ICAxCitkZGN0bTgyNCBjb21wYXJldG90bWFnICBOYU4gLTAgICAgICAtPiAgMQorZGRjdG04MjUgY29tcGFyZXRvdG1hZyAgTmFOICAwICAgICAgLT4gIDEKK2RkY3RtODI2IGNvbXBhcmV0b3RtYWcgIE5hTiAgMSAgICAgIC0+ICAxCitkZGN0bTgyNyBjb21wYXJldG90bWFnICBOYU4gIDEwMDAgICAtPiAgMQorZGRjdG04MjggY29tcGFyZXRvdG1hZyAgTmFOICBJbmYgICAgLT4gIDEKK2RkY3RtODI5IGNvbXBhcmV0b3RtYWcgIE5hTiAgTmFOICAgIC0+ICAwCitkZGN0bTgzMCBjb21wYXJldG90bWFnIC1JbmYgIE5hTiAgICAtPiAgLTEKK2RkY3RtODMxIGNvbXBhcmV0b3RtYWcgLTEwMDAgTmFOICAgIC0+ICAtMQorZGRjdG04MzIgY29tcGFyZXRvdG1hZyAtMSAgICBOYU4gICAgLT4gIC0xCitkZGN0bTgzMyBjb21wYXJldG90bWFnIC0wICAgIE5hTiAgICAtPiAgLTEKK2RkY3RtODM0IGNvbXBhcmV0b3RtYWcgIDAgICAgTmFOICAgIC0+ICAtMQorZGRjdG04MzUgY29tcGFyZXRvdG1hZyAgMSAgICBOYU4gICAgLT4gIC0xCitkZGN0bTgzNiBjb21wYXJldG90bWFnICAxMDAwIE5hTiAgICAtPiAgLTEKK2RkY3RtODM3IGNvbXBhcmV0b3RtYWcgIEluZiAgTmFOICAgIC0+ICAtMQorZGRjdG04MzggY29tcGFyZXRvdG1hZyAtTmFOIC1OYU4gICAgLT4gIDAKK2RkY3RtODM5IGNvbXBhcmV0b3RtYWcgK05hTiAtTmFOICAgIC0+ICAwCitkZGN0bTg0MCBjb21wYXJldG90bWFnIC1OYU4gK05hTiAgICAtPiAgMAorCitkZGN0bTg0MSBjb21wYXJldG90bWFnICBzTmFOIC1zTmFOICAtPiAgMAorZGRjdG04NDIgY29tcGFyZXRvdG1hZyAgc05hTiAtTmFOICAgLT4gIC0xCitkZGN0bTg0MyBjb21wYXJldG90bWFnICBzTmFOIC1JbmYgICAtPiAgMQorZGRjdG04NDQgY29tcGFyZXRvdG1hZyAgc05hTiAtMTAwMCAgLT4gIDEKK2RkY3RtODQ1IGNvbXBhcmV0b3RtYWcgIHNOYU4gLTEgICAgIC0+ICAxCitkZGN0bTg0NiBjb21wYXJldG90bWFnICBzTmFOIC0wICAgICAtPiAgMQorZGRjdG04NDcgY29tcGFyZXRvdG1hZyAgc05hTiAgMCAgICAgLT4gIDEKK2RkY3RtODQ4IGNvbXBhcmV0b3RtYWcgIHNOYU4gIDEgICAgIC0+ICAxCitkZGN0bTg0OSBjb21wYXJldG90bWFnICBzTmFOICAxMDAwICAtPiAgMQorZGRjdG04NTAgY29tcGFyZXRvdG1hZyAgc05hTiAgTmFOICAgLT4gIC0xCitkZGN0bTg1MSBjb21wYXJldG90bWFnICBzTmFOIHNOYU4gICAtPiAgMAorCitkZGN0bTg1MiBjb21wYXJldG90bWFnIC1zTmFOIHNOYU4gICAtPiAgMAorZGRjdG04NTMgY29tcGFyZXRvdG1hZyAtTmFOICBzTmFOICAgLT4gIDEKK2RkY3RtODU0IGNvbXBhcmV0b3RtYWcgLUluZiAgc05hTiAgIC0+ICAtMQorZGRjdG04NTUgY29tcGFyZXRvdG1hZyAtMTAwMCBzTmFOICAgLT4gIC0xCitkZGN0bTg1NiBjb21wYXJldG90bWFnIC0xICAgIHNOYU4gICAtPiAgLTEKK2RkY3RtODU3IGNvbXBhcmV0b3RtYWcgLTAgICAgc05hTiAgIC0+ICAtMQorZGRjdG04NTggY29tcGFyZXRvdG1hZyAgMCAgICBzTmFOICAgLT4gIC0xCitkZGN0bTg1OSBjb21wYXJldG90bWFnICAxICAgIHNOYU4gICAtPiAgLTEKK2RkY3RtODYwIGNvbXBhcmV0b3RtYWcgIDEwMDAgc05hTiAgIC0+ICAtMQorZGRjdG04NjEgY29tcGFyZXRvdG1hZyAgSW5mICBzTmFOICAgLT4gIC0xCitkZGN0bTg2MiBjb21wYXJldG90bWFnICBOYU4gIHNOYU4gICAtPiAgMQorZGRjdG04NjMgY29tcGFyZXRvdG1hZyAgc05hTiBzTmFOICAgLT4gIDAKKworZGRjdG04NzEgY29tcGFyZXRvdG1hZyAgLXNOYU4gLXNOYU4gIC0+ICAwCitkZGN0bTg3MiBjb21wYXJldG90bWFnICAtc05hTiAtTmFOICAgLT4gIC0xCitkZGN0bTg3MyBjb21wYXJldG90bWFnICAtc05hTiAtSW5mICAgLT4gIDEKK2RkY3RtODc0IGNvbXBhcmV0b3RtYWcgIC1zTmFOIC0xMDAwICAtPiAgMQorZGRjdG04NzUgY29tcGFyZXRvdG1hZyAgLXNOYU4gLTEgICAgIC0+ICAxCitkZGN0bTg3NiBjb21wYXJldG90bWFnICAtc05hTiAtMCAgICAgLT4gIDEKK2RkY3RtODc3IGNvbXBhcmV0b3RtYWcgIC1zTmFOICAwICAgICAtPiAgMQorZGRjdG04NzggY29tcGFyZXRvdG1hZyAgLXNOYU4gIDEgICAgIC0+ICAxCitkZGN0bTg3OSBjb21wYXJldG90bWFnICAtc05hTiAgMTAwMCAgLT4gIDEKK2RkY3RtODgwIGNvbXBhcmV0b3RtYWcgIC1zTmFOICBOYU4gICAtPiAgLTEKK2RkY3RtODgxIGNvbXBhcmV0b3RtYWcgIC1zTmFOIHNOYU4gICAtPiAgMAorCitkZGN0bTg4MiBjb21wYXJldG90bWFnIC1zTmFOIC1zTmFOICAgLT4gIDAKK2RkY3RtODgzIGNvbXBhcmV0b3RtYWcgLU5hTiAgLXNOYU4gICAtPiAgMQorZGRjdG04ODQgY29tcGFyZXRvdG1hZyAtSW5mICAtc05hTiAgIC0+ICAtMQorZGRjdG04ODUgY29tcGFyZXRvdG1hZyAtMTAwMCAtc05hTiAgIC0+ICAtMQorZGRjdG04ODYgY29tcGFyZXRvdG1hZyAtMSAgICAtc05hTiAgIC0+ICAtMQorZGRjdG04ODcgY29tcGFyZXRvdG1hZyAtMCAgICAtc05hTiAgIC0+ICAtMQorZGRjdG04ODggY29tcGFyZXRvdG1hZyAgMCAgICAtc05hTiAgIC0+ICAtMQorZGRjdG04ODkgY29tcGFyZXRvdG1hZyAgMSAgICAtc05hTiAgIC0+ICAtMQorZGRjdG04OTAgY29tcGFyZXRvdG1hZyAgMTAwMCAtc05hTiAgIC0+ICAtMQorZGRjdG04OTEgY29tcGFyZXRvdG1hZyAgSW5mICAtc05hTiAgIC0+ICAtMQorZGRjdG04OTIgY29tcGFyZXRvdG1hZyAgTmFOICAtc05hTiAgIC0+ICAxCitkZGN0bTg5MyBjb21wYXJldG90bWFnICBzTmFOIC1zTmFOICAgLT4gIDAKKworLS0gTmFOcyB3aXRoIHBheWxvYWQKK2RkY3RtOTYwIGNvbXBhcmV0b3RtYWcgIE5hTjkgLUluZiAgIC0+ICAxCitkZGN0bTk2MSBjb21wYXJldG90bWFnICBOYU44ICA5OTkgICAtPiAgMQorZGRjdG05NjIgY29tcGFyZXRvdG1hZyAgTmFONzcgSW5mICAgLT4gIDEKK2RkY3RtOTYzIGNvbXBhcmV0b3RtYWcgLU5hTjY3IE5hTjUgIC0+ICAxCitkZGN0bTk2NCBjb21wYXJldG90bWFnIC1JbmYgIC1OYU40ICAtPiAgLTEKK2RkY3RtOTY1IGNvbXBhcmV0b3RtYWcgLTk5OSAgLU5hTjMzIC0+ICAtMQorZGRjdG05NjYgY29tcGFyZXRvdG1hZyAgSW5mICAgTmFOMiAgLT4gIC0xCisKK2RkY3RtOTcwIGNvbXBhcmV0b3RtYWcgLU5hTjQxIC1OYU40MiAtPiAtMQorZGRjdG05NzEgY29tcGFyZXRvdG1hZyArTmFONDEgLU5hTjQyIC0+IC0xCitkZGN0bTk3MiBjb21wYXJldG90bWFnIC1OYU40MSArTmFONDIgLT4gLTEKK2RkY3RtOTczIGNvbXBhcmV0b3RtYWcgK05hTjQxICtOYU40MiAtPiAtMQorZGRjdG05NzQgY29tcGFyZXRvdG1hZyAtTmFONDIgLU5hTjAxIC0+ICAxCitkZGN0bTk3NSBjb21wYXJldG90bWFnICtOYU40MiAtTmFOMDEgLT4gIDEKK2RkY3RtOTc2IGNvbXBhcmV0b3RtYWcgLU5hTjQyICtOYU4wMSAtPiAgMQorZGRjdG05NzcgY29tcGFyZXRvdG1hZyArTmFONDIgK05hTjAxIC0+ICAxCisKK2RkY3RtOTgwIGNvbXBhcmV0b3RtYWcgLXNOYU43NzEgLXNOYU43NzIgLT4gLTEKK2RkY3RtOTgxIGNvbXBhcmV0b3RtYWcgK3NOYU43NzEgLXNOYU43NzIgLT4gLTEKK2RkY3RtOTgyIGNvbXBhcmV0b3RtYWcgLXNOYU43NzEgK3NOYU43NzIgLT4gLTEKK2RkY3RtOTgzIGNvbXBhcmV0b3RtYWcgK3NOYU43NzEgK3NOYU43NzIgLT4gLTEKK2RkY3RtOTg0IGNvbXBhcmV0b3RtYWcgLXNOYU43NzIgLXNOYU43NzEgLT4gIDEKK2RkY3RtOTg1IGNvbXBhcmV0b3RtYWcgK3NOYU43NzIgLXNOYU43NzEgLT4gIDEKK2RkY3RtOTg2IGNvbXBhcmV0b3RtYWcgLXNOYU43NzIgK3NOYU43NzEgLT4gIDEKK2RkY3RtOTg3IGNvbXBhcmV0b3RtYWcgK3NOYU43NzIgK3NOYU43NzEgLT4gIDEKKworZGRjdG05OTEgY29tcGFyZXRvdG1hZyAtc05hTjk5IC1JbmYgICAgLT4gIDEKK2RkY3RtOTkyIGNvbXBhcmV0b3RtYWcgIHNOYU45OCAtMTEgICAgIC0+ICAxCitkZGN0bTk5MyBjb21wYXJldG90bWFnICBzTmFOOTcgIE5hTiAgICAtPiAtMQorZGRjdG05OTQgY29tcGFyZXRvdG1hZyAgc05hTjE2IHNOYU45NCAgLT4gLTEKK2RkY3RtOTk1IGNvbXBhcmV0b3RtYWcgIE5hTjg1ICBzTmFOODMgIC0+ICAxCitkZGN0bTk5NiBjb21wYXJldG90bWFnIC1JbmYgICAgc05hTjkyICAtPiAtMQorZGRjdG05OTcgY29tcGFyZXRvdG1hZyAgMDg4ICAgIHNOYU44MSAgLT4gLTEKK2RkY3RtOTk4IGNvbXBhcmV0b3RtYWcgIEluZiAgICBzTmFOOTAgIC0+IC0xCitkZGN0bTk5OSBjb21wYXJldG90bWFnICBOYU4gICAtc05hTjg5ICAtPiAgMQorCistLSBzcHJlYWQgemVyb3MKK2RkY3RtMTExMCBjb21wYXJldG90bWFnICAgMEUtMzgzICAwICAgICAgICAtPiAgLTEKK2RkY3RtMTExMSBjb21wYXJldG90bWFnICAgMEUtMzgzIC0wICAgICAgICAtPiAgLTEKK2RkY3RtMTExMiBjb21wYXJldG90bWFnICAtMEUtMzgzICAwICAgICAgICAtPiAgLTEKK2RkY3RtMTExMyBjb21wYXJldG90bWFnICAtMEUtMzgzIC0wICAgICAgICAtPiAgLTEKK2RkY3RtMTExNCBjb21wYXJldG90bWFnICAgMEUtMzgzICAwRSszODQgICAtPiAgLTEKK2RkY3RtMTExNSBjb21wYXJldG90bWFnICAgMEUtMzgzIC0wRSszODQgICAtPiAgLTEKK2RkY3RtMTExNiBjb21wYXJldG90bWFnICAtMEUtMzgzICAwRSszODQgICAtPiAgLTEKK2RkY3RtMTExNyBjb21wYXJldG90bWFnICAtMEUtMzgzIC0wRSszODQgICAtPiAgLTEKK2RkY3RtMTExOCBjb21wYXJldG90bWFnICAgMCAgICAgICAwRSszODQgICAtPiAgLTEKK2RkY3RtMTExOSBjb21wYXJldG90bWFnICAgMCAgICAgIC0wRSszODQgICAtPiAgLTEKK2RkY3RtMTEyMCBjb21wYXJldG90bWFnICAtMCAgICAgICAwRSszODQgICAtPiAgLTEKK2RkY3RtMTEyMSBjb21wYXJldG90bWFnICAtMCAgICAgIC0wRSszODQgICAtPiAgLTEKKworZGRjdG0xMTMwIGNvbXBhcmV0b3RtYWcgICAwRSszODQgIDAgICAgICAgIC0+ICAgMQorZGRjdG0xMTMxIGNvbXBhcmV0b3RtYWcgICAwRSszODQgLTAgICAgICAgIC0+ICAgMQorZGRjdG0xMTMyIGNvbXBhcmV0b3RtYWcgIC0wRSszODQgIDAgICAgICAgIC0+ICAgMQorZGRjdG0xMTMzIGNvbXBhcmV0b3RtYWcgIC0wRSszODQgLTAgICAgICAgIC0+ICAgMQorZGRjdG0xMTM0IGNvbXBhcmV0b3RtYWcgICAwRSszODQgIDBFLTM4MyAgIC0+ICAgMQorZGRjdG0xMTM1IGNvbXBhcmV0b3RtYWcgICAwRSszODQgLTBFLTM4MyAgIC0+ICAgMQorZGRjdG0xMTM2IGNvbXBhcmV0b3RtYWcgIC0wRSszODQgIDBFLTM4MyAgIC0+ICAgMQorZGRjdG0xMTM3IGNvbXBhcmV0b3RtYWcgIC0wRSszODQgLTBFLTM4MyAgIC0+ICAgMQorZGRjdG0xMTM4IGNvbXBhcmV0b3RtYWcgICAwICAgICAgIDBFLTM4MyAgIC0+ICAgMQorZGRjdG0xMTM5IGNvbXBhcmV0b3RtYWcgICAwICAgICAgLTBFLTM4MyAgIC0+ICAgMQorZGRjdG0xMTQwIGNvbXBhcmV0b3RtYWcgIC0wICAgICAgIDBFLTM4MyAgIC0+ICAgMQorZGRjdG0xMTQxIGNvbXBhcmV0b3RtYWcgIC0wICAgICAgLTBFLTM4MyAgIC0+ICAgMQorCistLSBOdWxsIHRlc3RzCitkZGN0bTk5OTAgY29tcGFyZXRvdG1hZyAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkY3RtOTk5MSBjb21wYXJldG90bWFnICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvcHkuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb3B5LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExNzVjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb3B5LmRlY1Rlc3QKQEAgLTAsMCArMSw4OCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZENvcHkuZGVjVGVzdCAtLSBxdWlldCBkZWNEb3VibGUgY29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjRG91Ymxlcy4KK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sKK2RkY3B5MDAxIGNvcHkgICAgICAgKzcuNTAgIC0+IDcuNTAKKworLS0gSW5maW5pdGllcworZGRjcHkwMTEgY29weSAgSW5maW5pdHkgICAgLT4gSW5maW5pdHkKK2RkY3B5MDEyIGNvcHkgIC1JbmZpbml0eSAgIC0+IC1JbmZpbml0eQorCistLSBOYU5zLCAwIHBheWxvYWQKK2RkY3B5MDIxIGNvcHkgICAgICAgICBOYU4gIC0+IE5hTgorZGRjcHkwMjIgY29weSAgICAgICAgLU5hTiAgLT4gLU5hTgorZGRjcHkwMjMgY29weSAgICAgICAgc05hTiAgLT4gc05hTgorZGRjcHkwMjQgY29weSAgICAgICAtc05hTiAgLT4gLXNOYU4KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorZGRjcHkwMzEgY29weSAgICAgICBOYU4xMCAgLT4gTmFOMTAKK2RkY3B5MDMyIGNvcHkgICAgICAtTmFOMTAgIC0+IC1OYU4xMAorZGRjcHkwMzMgY29weSAgICAgIHNOYU4xMCAgLT4gc05hTjEwCitkZGNweTAzNCBjb3B5ICAgICAtc05hTjEwICAtPiAtc05hTjEwCitkZGNweTAzNSBjb3B5ICAgICAgIE5hTjcgICAtPiBOYU43CitkZGNweTAzNiBjb3B5ICAgICAgLU5hTjcgICAtPiAtTmFONworZGRjcHkwMzcgY29weSAgICAgIHNOYU4xMDEgLT4gc05hTjEwMQorZGRjcHkwMzggY29weSAgICAgLXNOYU4xMDEgLT4gLXNOYU4xMDEKKworLS0gZmluaXRlcworZGRjcHkxMDEgY29weSAgICAgICAgICA3ICAgLT4gNworZGRjcHkxMDIgY29weSAgICAgICAgIC03ICAgLT4gLTcKK2RkY3B5MTAzIGNvcHkgICAgICAgICA3NSAgIC0+IDc1CitkZGNweTEwNCBjb3B5ICAgICAgICAtNzUgICAtPiAtNzUKK2RkY3B5MTA1IGNvcHkgICAgICAgNy41MCAgIC0+IDcuNTAKK2RkY3B5MTA2IGNvcHkgICAgICAtNy41MCAgIC0+IC03LjUwCitkZGNweTEwNyBjb3B5ICAgICAgIDcuNTAwICAtPiA3LjUwMAorZGRjcHkxMDggY29weSAgICAgIC03LjUwMCAgLT4gLTcuNTAwCisKKy0tIHplcm9zCitkZGNweTExMSBjb3B5ICAgICAgICAgIDAgICAtPiAwCitkZGNweTExMiBjb3B5ICAgICAgICAgLTAgICAtPiAtMAorZGRjcHkxMTMgY29weSAgICAgICAwRSs0ICAgLT4gMEUrNAorZGRjcHkxMTQgY29weSAgICAgIC0wRSs0ICAgLT4gLTBFKzQKK2RkY3B5MTE1IGNvcHkgICAgIDAuMDAwMCAgIC0+IDAuMDAwMAorZGRjcHkxMTYgY29weSAgICAtMC4wMDAwICAgLT4gLTAuMDAwMAorZGRjcHkxMTcgY29weSAgICAgIDBFLTE0MSAgLT4gMEUtMTQxCitkZGNweTExOCBjb3B5ICAgICAtMEUtMTQxICAtPiAtMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitkZGNweTEyMSBjb3B5ICAyNjgyNjgyNjgyNjgyNjgyICAgICAgICAgLT4gMjY4MjY4MjY4MjY4MjY4MgorZGRjcHkxMjIgY29weSAgLTI2ODI2ODI2ODI2ODI2ODIgICAgICAgIC0+IC0yNjgyNjgyNjgyNjgyNjgyCitkZGNweTEyMyBjb3B5ICAxMzQxMzQxMzQxMzQxMzQxICAgICAgICAgLT4gMTM0MTM0MTM0MTM0MTM0MQorZGRjcHkxMjQgY29weSAgLTEzNDEzNDEzNDEzNDEzNDEgICAgICAgIC0+IC0xMzQxMzQxMzQxMzQxMzQxCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkZGNweTEzMSBjb3B5ICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRjcHkxMzIgY29weSAgMUUtMzgzICAgICAgICAgICAgICAgICAgIC0+IDFFLTM4MworZGRjcHkxMzMgY29weSAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2RkY3B5MTM0IGNvcHkgIDFFLTM5OCAgICAgICAgICAgICAgICAgICAtPiAxRS0zOTgKKworZGRjcHkxMzUgY29weSAgLTFFLTM5OCAgICAgICAgICAgICAgICAgIC0+IC0xRS0zOTgKK2RkY3B5MTM2IGNvcHkgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRjcHkxMzcgY29weSAgLTFFLTM4MyAgICAgICAgICAgICAgICAgIC0+IC0xRS0zODMKK2RkY3B5MTM4IGNvcHkgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvcHlBYnMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb3B5QWJzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyM2NmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb3B5QWJzLmRlY1Rlc3QKQEAgLTAsMCArMSw4OCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZENvcHlBYnMuZGVjVGVzdCAtLSBxdWlldCBkZWNEb3VibGUgY29weSBhbmQgc2V0IHNpZ24gdG8gemVybyAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjRG91Ymxlcy4KK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sKK2RkY3BhMDAxIGNvcHlhYnMgICAgICAgKzcuNTAgIC0+IDcuNTAKKworLS0gSW5maW5pdGllcworZGRjcGEwMTEgY29weWFicyAgSW5maW5pdHkgICAgLT4gSW5maW5pdHkKK2RkY3BhMDEyIGNvcHlhYnMgIC1JbmZpbml0eSAgIC0+IEluZmluaXR5CisKKy0tIE5hTnMsIDAgcGF5bG9hZAorZGRjcGEwMjEgY29weWFicyAgICAgICAgIE5hTiAgLT4gTmFOCitkZGNwYTAyMiBjb3B5YWJzICAgICAgICAtTmFOICAtPiBOYU4KK2RkY3BhMDIzIGNvcHlhYnMgICAgICAgIHNOYU4gIC0+IHNOYU4KK2RkY3BhMDI0IGNvcHlhYnMgICAgICAgLXNOYU4gIC0+IHNOYU4KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorZGRjcGEwMzEgY29weWFicyAgICAgICBOYU4xMCAgLT4gTmFOMTAKK2RkY3BhMDMyIGNvcHlhYnMgICAgICAtTmFOMTUgIC0+IE5hTjE1CitkZGNwYTAzMyBjb3B5YWJzICAgICAgc05hTjE1ICAtPiBzTmFOMTUKK2RkY3BhMDM0IGNvcHlhYnMgICAgIC1zTmFOMTAgIC0+IHNOYU4xMAorZGRjcGEwMzUgY29weWFicyAgICAgICBOYU43ICAgLT4gTmFONworZGRjcGEwMzYgY29weWFicyAgICAgIC1OYU43ICAgLT4gTmFONworZGRjcGEwMzcgY29weWFicyAgICAgIHNOYU4xMDEgLT4gc05hTjEwMQorZGRjcGEwMzggY29weWFicyAgICAgLXNOYU4xMDEgLT4gc05hTjEwMQorCistLSBmaW5pdGVzCitkZGNwYTEwMSBjb3B5YWJzICAgICAgICAgIDcgICAtPiA3CitkZGNwYTEwMiBjb3B5YWJzICAgICAgICAgLTcgICAtPiA3CitkZGNwYTEwMyBjb3B5YWJzICAgICAgICAgNzUgICAtPiA3NQorZGRjcGExMDQgY29weWFicyAgICAgICAgLTc1ICAgLT4gNzUKK2RkY3BhMTA1IGNvcHlhYnMgICAgICAgNy4xMCAgIC0+IDcuMTAKK2RkY3BhMTA2IGNvcHlhYnMgICAgICAtNy4xMCAgIC0+IDcuMTAKK2RkY3BhMTA3IGNvcHlhYnMgICAgICAgNy41MDAgIC0+IDcuNTAwCitkZGNwYTEwOCBjb3B5YWJzICAgICAgLTcuNTAwICAtPiA3LjUwMAorCistLSB6ZXJvcworZGRjcGExMTEgY29weWFicyAgICAgICAgICAwICAgLT4gMAorZGRjcGExMTIgY29weWFicyAgICAgICAgIC0wICAgLT4gMAorZGRjcGExMTMgY29weWFicyAgICAgICAwRSs2ICAgLT4gMEUrNgorZGRjcGExMTQgY29weWFicyAgICAgIC0wRSs2ICAgLT4gMEUrNgorZGRjcGExMTUgY29weWFicyAgICAgMC4wMDAwICAgLT4gMC4wMDAwCitkZGNwYTExNiBjb3B5YWJzICAgIC0wLjAwMDAgICAtPiAwLjAwMDAKK2RkY3BhMTE3IGNvcHlhYnMgICAgICAwRS0xNDEgIC0+IDBFLTE0MQorZGRjcGExMTggY29weWFicyAgICAgLTBFLTE0MSAgLT4gMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitkZGNwYTEyMSBjb3B5YWJzICAyNjgyNjgyNjgyNjgyNjgyICAgICAgICAgLT4gMjY4MjY4MjY4MjY4MjY4MgorZGRjcGExMjIgY29weWFicyAgLTI2ODI2ODI2ODI2ODI2ODIgICAgICAgIC0+IDI2ODI2ODI2ODI2ODI2ODIKK2RkY3BhMTIzIGNvcHlhYnMgIDEzNDEzNDEzNDEzNDEzNDEgICAgICAgICAtPiAxMzQxMzQxMzQxMzQxMzQxCitkZGNwYTEyNCBjb3B5YWJzICAtMTM0MTM0MTM0MTM0MTM0MSAgICAgICAgLT4gMTM0MTM0MTM0MTM0MTM0MQorCistLSBObWF4LCBObWluLCBOdGlueQorZGRjcGExMzEgY29weWFicyAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkY3BhMTMyIGNvcHlhYnMgIDFFLTM4MyAgICAgICAgICAgICAgICAgICAtPiAxRS0zODMKK2RkY3BhMTMzIGNvcHlhYnMgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZGNwYTEzNCBjb3B5YWJzICAxRS0zOTggICAgICAgICAgICAgICAgICAgLT4gMUUtMzk4CisKK2RkY3BhMTM1IGNvcHlhYnMgIC0xRS0zOTggICAgICAgICAgICAgICAgICAtPiAxRS0zOTgKK2RkY3BhMTM2IGNvcHlhYnMgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZGNwYTEzNyBjb3B5YWJzICAtMUUtMzgzICAgICAgICAgICAgICAgICAgLT4gMUUtMzgzCitkZGNwYTEzOCBjb3B5YWJzICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvcHlOZWdhdGUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb3B5TmVnYXRlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxOTQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb3B5TmVnYXRlLmRlY1Rlc3QKQEAgLTAsMCArMSw4OCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZENvcHlOZWdhdGUuZGVjVGVzdCAtLSBxdWlldCBkZWNEb3VibGUgY29weSBhbmQgbmVnYXRlICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjRG91Ymxlcy4KK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sKK2RkY3BuMDAxIGNvcHluZWdhdGUgICAgICAgKzcuNTAgIC0+IC03LjUwCisKKy0tIEluZmluaXRpZXMKK2RkY3BuMDExIGNvcHluZWdhdGUgIEluZmluaXR5ICAgIC0+IC1JbmZpbml0eQorZGRjcG4wMTIgY29weW5lZ2F0ZSAgLUluZmluaXR5ICAgLT4gSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitkZGNwbjAyMSBjb3B5bmVnYXRlICAgICAgICAgTmFOICAtPiAtTmFOCitkZGNwbjAyMiBjb3B5bmVnYXRlICAgICAgICAtTmFOICAtPiBOYU4KK2RkY3BuMDIzIGNvcHluZWdhdGUgICAgICAgIHNOYU4gIC0+IC1zTmFOCitkZGNwbjAyNCBjb3B5bmVnYXRlICAgICAgIC1zTmFOICAtPiBzTmFOCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2RkY3BuMDMxIGNvcHluZWdhdGUgICAgICAgTmFOMTMgIC0+IC1OYU4xMworZGRjcG4wMzIgY29weW5lZ2F0ZSAgICAgIC1OYU4xMyAgLT4gTmFOMTMKK2RkY3BuMDMzIGNvcHluZWdhdGUgICAgICBzTmFOMTMgIC0+IC1zTmFOMTMKK2RkY3BuMDM0IGNvcHluZWdhdGUgICAgIC1zTmFOMTMgIC0+IHNOYU4xMworZGRjcG4wMzUgY29weW5lZ2F0ZSAgICAgICBOYU43MCAgLT4gLU5hTjcwCitkZGNwbjAzNiBjb3B5bmVnYXRlICAgICAgLU5hTjcwICAtPiBOYU43MAorZGRjcG4wMzcgY29weW5lZ2F0ZSAgICAgIHNOYU4xMDEgLT4gLXNOYU4xMDEKK2RkY3BuMDM4IGNvcHluZWdhdGUgICAgIC1zTmFOMTAxIC0+IHNOYU4xMDEKKworLS0gZmluaXRlcworZGRjcG4xMDEgY29weW5lZ2F0ZSAgICAgICAgICA3ICAgLT4gLTcKK2RkY3BuMTAyIGNvcHluZWdhdGUgICAgICAgICAtNyAgIC0+IDcKK2RkY3BuMTAzIGNvcHluZWdhdGUgICAgICAgICA3NSAgIC0+IC03NQorZGRjcG4xMDQgY29weW5lZ2F0ZSAgICAgICAgLTc1ICAgLT4gNzUKK2RkY3BuMTA1IGNvcHluZWdhdGUgICAgICAgNy41MCAgIC0+IC03LjUwCitkZGNwbjEwNiBjb3B5bmVnYXRlICAgICAgLTcuNTAgICAtPiA3LjUwCitkZGNwbjEwNyBjb3B5bmVnYXRlICAgICAgIDcuNTAwICAtPiAtNy41MDAKK2RkY3BuMTA4IGNvcHluZWdhdGUgICAgICAtNy41MDAgIC0+IDcuNTAwCisKKy0tIHplcm9zCitkZGNwbjExMSBjb3B5bmVnYXRlICAgICAgICAgIDAgICAtPiAtMAorZGRjcG4xMTIgY29weW5lZ2F0ZSAgICAgICAgIC0wICAgLT4gMAorZGRjcG4xMTMgY29weW5lZ2F0ZSAgICAgICAwRSs0ICAgLT4gLTBFKzQKK2RkY3BuMTE0IGNvcHluZWdhdGUgICAgICAtMEUrNCAgIC0+IDBFKzQKK2RkY3BuMTE1IGNvcHluZWdhdGUgICAgIDAuMDAwMCAgIC0+IC0wLjAwMDAKK2RkY3BuMTE2IGNvcHluZWdhdGUgICAgLTAuMDAwMCAgIC0+IDAuMDAwMAorZGRjcG4xMTcgY29weW5lZ2F0ZSAgICAgIDBFLTE0MSAgLT4gLTBFLTE0MQorZGRjcG4xMTggY29weW5lZ2F0ZSAgICAgLTBFLTE0MSAgLT4gMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitkZGNwbjEyMSBjb3B5bmVnYXRlICAyNjgyNjgyNjgyNjgyNjgyICAgICAgICAgLT4gLTI2ODI2ODI2ODI2ODI2ODIKK2RkY3BuMTIyIGNvcHluZWdhdGUgIC0yNjgyNjgyNjgyNjgyNjgyICAgICAgICAtPiAyNjgyNjgyNjgyNjgyNjgyCitkZGNwbjEyMyBjb3B5bmVnYXRlICAxMzQxMzQxMzQxMzQxMzQxICAgICAgICAgLT4gLTEzNDEzNDEzNDEzNDEzNDEKK2RkY3BuMTI0IGNvcHluZWdhdGUgIC0xMzQxMzQxMzQxMzQxMzQxICAgICAgICAtPiAxMzQxMzQxMzQxMzQxMzQxCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkZGNwbjEzMSBjb3B5bmVnYXRlICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkY3BuMTMyIGNvcHluZWdhdGUgIDFFLTM4MyAgICAgICAgICAgICAgICAgICAtPiAtMUUtMzgzCitkZGNwbjEzMyBjb3B5bmVnYXRlICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2RkY3BuMTM0IGNvcHluZWdhdGUgIDFFLTM5OCAgICAgICAgICAgICAgICAgICAtPiAtMUUtMzk4CisKK2RkY3BuMTM1IGNvcHluZWdhdGUgIC0xRS0zOTggICAgICAgICAgICAgICAgICAtPiAxRS0zOTgKK2RkY3BuMTM2IGNvcHluZWdhdGUgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZGNwbjEzNyBjb3B5bmVnYXRlICAtMUUtMzgzICAgICAgICAgICAgICAgICAgLT4gMUUtMzgzCitkZGNwbjEzOCBjb3B5bmVnYXRlICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvcHlTaWduLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29weVNpZ24uZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTk1NDRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvcHlTaWduLmRlY1Rlc3QKQEAgLTAsMCArMSwxNzUgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRDb3B5U2lnbi5kZWNUZXN0IC0tIHF1aWV0IGRlY0RvdWJsZSBjb3B5IHdpdGggc2lnbiBmcm9tIHJocyAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY0RvdWJsZXMuCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrCitkZGNwczAwMSBjb3B5c2lnbiAgICAgICArNy41MCAgICAgMTEgLT4gNy41MAorCistLSBJbmZpbml0aWVzCitkZGNwczAxMSBjb3B5c2lnbiAgSW5maW5pdHkgICAgICAgMTEgLT4gSW5maW5pdHkKK2RkY3BzMDEyIGNvcHlzaWduICAtSW5maW5pdHkgICAgICAxMSAtPiBJbmZpbml0eQorCistLSBOYU5zLCAwIHBheWxvYWQKK2RkY3BzMDIxIGNvcHlzaWduICAgICAgICAgTmFOICAgICAxMSAtPiBOYU4KK2RkY3BzMDIyIGNvcHlzaWduICAgICAgICAtTmFOICAgICAxMSAtPiBOYU4KK2RkY3BzMDIzIGNvcHlzaWduICAgICAgICBzTmFOICAgICAxMSAtPiBzTmFOCitkZGNwczAyNCBjb3B5c2lnbiAgICAgICAtc05hTiAgICAgMTEgLT4gc05hTgorCistLSBOYU5zLCBub24tMCBwYXlsb2FkCitkZGNwczAzMSBjb3B5c2lnbiAgICAgICBOYU4xMCAgICAgMTEgLT4gTmFOMTAKK2RkY3BzMDMyIGNvcHlzaWduICAgICAgLU5hTjEwICAgICAxMSAtPiBOYU4xMAorZGRjcHMwMzMgY29weXNpZ24gICAgICBzTmFOMTAgICAgIDExIC0+IHNOYU4xMAorZGRjcHMwMzQgY29weXNpZ24gICAgIC1zTmFOMTAgICAgIDExIC0+IHNOYU4xMAorZGRjcHMwMzUgY29weXNpZ24gICAgICAgTmFONyAgICAgIDExIC0+IE5hTjcKK2RkY3BzMDM2IGNvcHlzaWduICAgICAgLU5hTjcgICAgICAxMSAtPiBOYU43CitkZGNwczAzNyBjb3B5c2lnbiAgICAgIHNOYU4xMDEgICAgMTEgLT4gc05hTjEwMQorZGRjcHMwMzggY29weXNpZ24gICAgIC1zTmFOMTAxICAgIDExIC0+IHNOYU4xMDEKKworLS0gZmluaXRlcworZGRjcHMxMDEgY29weXNpZ24gICAgICAgICAgNyAgICAgIDExIC0+IDcKK2RkY3BzMTAyIGNvcHlzaWduICAgICAgICAgLTcgICAgICAxMSAtPiA3CitkZGNwczEwMyBjb3B5c2lnbiAgICAgICAgIDc1ICAgICAgMTEgLT4gNzUKK2RkY3BzMTA0IGNvcHlzaWduICAgICAgICAtNzUgICAgICAxMSAtPiA3NQorZGRjcHMxMDUgY29weXNpZ24gICAgICAgNy41MCAgICAgIDExIC0+IDcuNTAKK2RkY3BzMTA2IGNvcHlzaWduICAgICAgLTcuNTAgICAgICAxMSAtPiA3LjUwCitkZGNwczEwNyBjb3B5c2lnbiAgICAgICA3LjUwMCAgICAgMTEgLT4gNy41MDAKK2RkY3BzMTA4IGNvcHlzaWduICAgICAgLTcuNTAwICAgICAxMSAtPiA3LjUwMAorCistLSB6ZXJvcworZGRjcHMxMTEgY29weXNpZ24gICAgICAgICAgMCAgICAgIDExIC0+IDAKK2RkY3BzMTEyIGNvcHlzaWduICAgICAgICAgLTAgICAgICAxMSAtPiAwCitkZGNwczExMyBjb3B5c2lnbiAgICAgICAwRSs0ICAgICAgMTEgLT4gMEUrNAorZGRjcHMxMTQgY29weXNpZ24gICAgICAtMEUrNCAgICAgIDExIC0+IDBFKzQKK2RkY3BzMTE1IGNvcHlzaWduICAgICAwLjAwMDAgICAgICAxMSAtPiAwLjAwMDAKK2RkY3BzMTE2IGNvcHlzaWduICAgIC0wLjAwMDAgICAgICAxMSAtPiAwLjAwMDAKK2RkY3BzMTE3IGNvcHlzaWduICAgICAgMEUtMTQxICAgICAxMSAtPiAwRS0xNDEKK2RkY3BzMTE4IGNvcHlzaWduICAgICAtMEUtMTQxICAgICAxMSAtPiAwRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RkY3BzMTIxIGNvcHlzaWduICAyNjgyNjgyNjgyNjgyNjgyICAgICAgICAgICAgMTEgLT4gMjY4MjY4MjY4MjY4MjY4MgorZGRjcHMxMjIgY29weXNpZ24gIC0yNjgyNjgyNjgyNjgyNjgyICAgICAgICAgICAxMSAtPiAyNjgyNjgyNjgyNjgyNjgyCitkZGNwczEyMyBjb3B5c2lnbiAgMTM0MTM0MTM0MTM0MTM0MSAgICAgICAgICAgIDExIC0+IDEzNDEzNDEzNDEzNDEzNDEKK2RkY3BzMTI0IGNvcHlzaWduICAtMTM0MTM0MTM0MTM0MTM0MSAgICAgICAgICAgMTEgLT4gMTM0MTM0MTM0MTM0MTM0MQorCistLSBObWF4LCBObWluLCBOdGlueQorZGRjcHMxMzEgY29weXNpZ24gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgICAxMSAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZGNwczEzMiBjb3B5c2lnbiAgMUUtMzgzICAgICAgICAgICAgICAgICAgICAgIDExIC0+IDFFLTM4MworZGRjcHMxMzMgY29weXNpZ24gIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgICAxMSAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZGNwczEzNCBjb3B5c2lnbiAgMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgIDExIC0+IDFFLTM5OAorCitkZGNwczEzNSBjb3B5c2lnbiAgLTFFLTM5OCAgICAgICAgICAgICAgICAgICAgIDExIC0+IDFFLTM5OAorZGRjcHMxMzYgY29weXNpZ24gIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAxMSAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZGNwczEzNyBjb3B5c2lnbiAgLTFFLTM4MyAgICAgICAgICAgICAgICAgICAgIDExIC0+IDFFLTM4MworZGRjcHMxMzggY29weXNpZ24gIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAxMSAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CisKKy0tIHJlcGVhdCB3aXRoIG5lZ2F0aXZlIFJIUworCistLSBJbmZpbml0aWVzCitkZGNwczIxMSBjb3B5c2lnbiAgSW5maW5pdHkgICAgICAgLTM0IC0+IC1JbmZpbml0eQorZGRjcHMyMTIgY29weXNpZ24gIC1JbmZpbml0eSAgICAgIC0zNCAtPiAtSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitkZGNwczIyMSBjb3B5c2lnbiAgICAgICAgIE5hTiAgICAgLTM0IC0+IC1OYU4KK2RkY3BzMjIyIGNvcHlzaWduICAgICAgICAtTmFOICAgICAtMzQgLT4gLU5hTgorZGRjcHMyMjMgY29weXNpZ24gICAgICAgIHNOYU4gICAgIC0zNCAtPiAtc05hTgorZGRjcHMyMjQgY29weXNpZ24gICAgICAgLXNOYU4gICAgIC0zNCAtPiAtc05hTgorCistLSBOYU5zLCBub24tMCBwYXlsb2FkCitkZGNwczIzMSBjb3B5c2lnbiAgICAgICBOYU4xMCAgICAgLTM0IC0+IC1OYU4xMAorZGRjcHMyMzIgY29weXNpZ24gICAgICAtTmFOMTAgICAgIC0zNCAtPiAtTmFOMTAKK2RkY3BzMjMzIGNvcHlzaWduICAgICAgc05hTjEwICAgICAtMzQgLT4gLXNOYU4xMAorZGRjcHMyMzQgY29weXNpZ24gICAgIC1zTmFOMTAgICAgIC0zNCAtPiAtc05hTjEwCitkZGNwczIzNSBjb3B5c2lnbiAgICAgICBOYU43ICAgICAgLTM0IC0+IC1OYU43CitkZGNwczIzNiBjb3B5c2lnbiAgICAgIC1OYU43ICAgICAgLTM0IC0+IC1OYU43CitkZGNwczIzNyBjb3B5c2lnbiAgICAgIHNOYU4xMDEgICAgLTM0IC0+IC1zTmFOMTAxCitkZGNwczIzOCBjb3B5c2lnbiAgICAgLXNOYU4xMDEgICAgLTM0IC0+IC1zTmFOMTAxCisKKy0tIGZpbml0ZXMKK2RkY3BzMzAxIGNvcHlzaWduICAgICAgICAgIDcgICAgICAtMzQgLT4gLTcKK2RkY3BzMzAyIGNvcHlzaWduICAgICAgICAgLTcgICAgICAtMzQgLT4gLTcKK2RkY3BzMzAzIGNvcHlzaWduICAgICAgICAgNzUgICAgICAtMzQgLT4gLTc1CitkZGNwczMwNCBjb3B5c2lnbiAgICAgICAgLTc1ICAgICAgLTM0IC0+IC03NQorZGRjcHMzMDUgY29weXNpZ24gICAgICAgNy41MCAgICAgIC0zNCAtPiAtNy41MAorZGRjcHMzMDYgY29weXNpZ24gICAgICAtNy41MCAgICAgIC0zNCAtPiAtNy41MAorZGRjcHMzMDcgY29weXNpZ24gICAgICAgNy41MDAgICAgIC0zNCAtPiAtNy41MDAKK2RkY3BzMzA4IGNvcHlzaWduICAgICAgLTcuNTAwICAgICAtMzQgLT4gLTcuNTAwCisKKy0tIHplcm9zCitkZGNwczMxMSBjb3B5c2lnbiAgICAgICAgICAwICAgICAgLTM0IC0+IC0wCitkZGNwczMxMiBjb3B5c2lnbiAgICAgICAgIC0wICAgICAgLTM0IC0+IC0wCitkZGNwczMxMyBjb3B5c2lnbiAgICAgICAwRSs0ICAgICAgLTM0IC0+IC0wRSs0CitkZGNwczMxNCBjb3B5c2lnbiAgICAgIC0wRSs0ICAgICAgLTM0IC0+IC0wRSs0CitkZGNwczMxNSBjb3B5c2lnbiAgICAgMC4wMDAwICAgICAgLTM0IC0+IC0wLjAwMDAKK2RkY3BzMzE2IGNvcHlzaWduICAgIC0wLjAwMDAgICAgICAtMzQgLT4gLTAuMDAwMAorZGRjcHMzMTcgY29weXNpZ24gICAgICAwRS0xNDEgICAgIC0zNCAtPiAtMEUtMTQxCitkZGNwczMxOCBjb3B5c2lnbiAgICAgLTBFLTE0MSAgICAgLTM0IC0+IC0wRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RkY3BzMzIxIGNvcHlzaWduICAyNjgyNjgyNjgyNjgyNjgyICAgICAgICAgICAgLTM0IC0+IC0yNjgyNjgyNjgyNjgyNjgyCitkZGNwczMyMiBjb3B5c2lnbiAgLTI2ODI2ODI2ODI2ODI2ODIgICAgICAgICAgIC0zNCAtPiAtMjY4MjY4MjY4MjY4MjY4MgorZGRjcHMzMjMgY29weXNpZ24gIDEzNDEzNDEzNDEzNDEzNDEgICAgICAgICAgICAtMzQgLT4gLTEzNDEzNDEzNDEzNDEzNDEKK2RkY3BzMzI0IGNvcHlzaWduICAtMTM0MTM0MTM0MTM0MTM0MSAgICAgICAgICAgLTM0IC0+IC0xMzQxMzQxMzQxMzQxMzQxCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkZGNwczMzMSBjb3B5c2lnbiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgIC0zNCAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRjcHMzMzIgY29weXNpZ24gIDFFLTM4MyAgICAgICAgICAgICAgICAgICAgICAtMzQgLT4gLTFFLTM4MworZGRjcHMzMzMgY29weXNpZ24gIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgICAtMzQgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2RkY3BzMzM0IGNvcHlzaWduICAxRS0zOTggICAgICAgICAgICAgICAgICAgICAgLTM0IC0+IC0xRS0zOTgKKworZGRjcHMzMzUgY29weXNpZ24gIC0xRS0zOTggICAgICAgICAgICAgICAgICAgICAtMzQgLT4gLTFFLTM5OAorZGRjcHMzMzYgY29weXNpZ24gIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtMzQgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2RkY3BzMzM3IGNvcHlzaWduICAtMUUtMzgzICAgICAgICAgICAgICAgICAgICAgLTM0IC0+IC0xRS0zODMKK2RkY3BzMzM4IGNvcHlzaWduICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgLTM0IC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CisKKy0tIE90aGVyIGtpbmRzIG9mIFJIUworZGRjcHM0MDEgY29weXNpZ24gICAgICAgICAgNzAxICAgIC0zNCAtPiAtNzAxCitkZGNwczQwMiBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgLTM0IC0+IC03MjAKK2RkY3BzNDAzIGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtMCAgLT4gLTcwMQorZGRjcHM0MDQgY29weXNpZ24gICAgICAgICAtNzIwICAgIC0wICAtPiAtNzIwCitkZGNwczQwNSBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgKzAgIC0+ICA3MDEKK2RkY3BzNDA2IGNvcHlzaWduICAgICAgICAgLTcyMCAgICArMCAgLT4gIDcyMAorZGRjcHM0MDcgY29weXNpZ24gICAgICAgICAgNzAxICAgICszNCAtPiAgNzAxCitkZGNwczQwOCBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgKzM0IC0+ICA3MjAKKworZGRjcHM0MTMgY29weXNpZ24gICAgICAgICAgNzAxICAgIC1JbmYgIC0+IC03MDEKK2RkY3BzNDE0IGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtSW5mICAtPiAtNzIwCitkZGNwczQxNSBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgK0luZiAgLT4gIDcwMQorZGRjcHM0MTYgY29weXNpZ24gICAgICAgICAtNzIwICAgICtJbmYgIC0+ICA3MjAKKworZGRjcHM0MjAgY29weXNpZ24gICAgICAgICAgNzAxICAgIC1OYU4gIC0+IC03MDEKK2RkY3BzNDIxIGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtTmFOICAtPiAtNzIwCitkZGNwczQyMiBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgK05hTiAgLT4gIDcwMQorZGRjcHM0MjMgY29weXNpZ24gICAgICAgICAtNzIwICAgICtOYU4gIC0+ICA3MjAKK2RkY3BzNDI1IGNvcHlzaWduICAgICAgICAgLTcyMCAgICArTmFOOCAtPiAgNzIwCisKK2RkY3BzNDI2IGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtc05hTiAgLT4gLTcwMQorZGRjcHM0MjcgY29weXNpZ24gICAgICAgICAtNzIwICAgIC1zTmFOICAtPiAtNzIwCitkZGNwczQyOCBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgK3NOYU4gIC0+ICA3MDEKK2RkY3BzNDI5IGNvcHlzaWduICAgICAgICAgLTcyMCAgICArc05hTiAgLT4gIDcyMAorZGRjcHM0MzAgY29weXNpZ24gICAgICAgICAtNzIwICAgICtzTmFOMyAtPiAgNzIwCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGREaXZpZGUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGREaXZpZGUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTlkYjIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZERpdmlkZS5kZWNUZXN0CkBAIC0wLDAgKzEsODYzIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkRGl2aWRlLmRlY1Rlc3QgLS0gZGVjRG91YmxlIGRpdmlzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RkZGl2MDAxIGRpdmlkZSAgMSAgICAgMSAgICAtPiAgMQorZGRkaXYwMDIgZGl2aWRlICAyICAgICAxICAgIC0+ICAyCitkZGRpdjAwMyBkaXZpZGUgIDEgICAgIDIgICAgLT4gIDAuNQorZGRkaXYwMDQgZGl2aWRlICAyICAgICAyICAgIC0+ICAxCitkZGRpdjAwNSBkaXZpZGUgIDAgICAgIDEgICAgLT4gIDAKK2RkZGl2MDA2IGRpdmlkZSAgMCAgICAgMiAgICAtPiAgMAorZGRkaXYwMDcgZGl2aWRlICAxICAgICAzICAgIC0+ICAwLjMzMzMzMzMzMzMzMzMzMzMgSW5leGFjdCBSb3VuZGVkCitkZGRpdjAwOCBkaXZpZGUgIDIgICAgIDMgICAgLT4gIDAuNjY2NjY2NjY2NjY2NjY2NyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MDA5IGRpdmlkZSAgMyAgICAgMyAgICAtPiAgMQorCitkZGRpdjAxMCBkaXZpZGUgIDIuNCAgIDEgICAgLT4gIDIuNAorZGRkaXYwMTEgZGl2aWRlICAyLjQgICAtMSAgIC0+ICAtMi40CitkZGRpdjAxMiBkaXZpZGUgIC0yLjQgIDEgICAgLT4gIC0yLjQKK2RkZGl2MDEzIGRpdmlkZSAgLTIuNCAgLTEgICAtPiAgMi40CitkZGRpdjAxNCBkaXZpZGUgIDIuNDAgIDEgICAgLT4gIDIuNDAKK2RkZGl2MDE1IGRpdmlkZSAgMi40MDAgMSAgICAtPiAgMi40MDAKK2RkZGl2MDE2IGRpdmlkZSAgMi40ICAgMiAgICAtPiAgMS4yCitkZGRpdjAxNyBkaXZpZGUgIDIuNDAwIDIgICAgLT4gIDEuMjAwCitkZGRpdjAxOCBkaXZpZGUgIDIuICAgIDIgICAgLT4gIDEKK2RkZGl2MDE5IGRpdmlkZSAgMjAgICAgMjAgICAtPiAgMQorCitkZGRpdjAyMCBkaXZpZGUgIDE4NyAgIDE4NyAgICAtPiAgMQorZGRkaXYwMjEgZGl2aWRlICA1ICAgICAyICAgICAgLT4gIDIuNQorZGRkaXYwMjIgZGl2aWRlICA1MCAgICAyMCAgICAgLT4gIDIuNQorZGRkaXYwMjMgZGl2aWRlICA1MDAgICAyMDAgICAgLT4gIDIuNQorZGRkaXYwMjQgZGl2aWRlICA1MC4wICAyMC4wICAgLT4gIDIuNQorZGRkaXYwMjUgZGl2aWRlICA1LjAwICAyLjAwICAgLT4gIDIuNQorZGRkaXYwMjYgZGl2aWRlICA1ICAgICAyLjAgICAgLT4gIDIuNQorZGRkaXYwMjcgZGl2aWRlICA1ICAgICAyLjAwMCAgLT4gIDIuNQorZGRkaXYwMjggZGl2aWRlICA1ICAgICAwLjIwICAgLT4gIDI1CitkZGRpdjAyOSBkaXZpZGUgIDUgICAgIDAuMjAwICAtPiAgMjUKK2RkZGl2MDMwIGRpdmlkZSAgMTAgICAgMSAgICAgIC0+ICAxMAorZGRkaXYwMzEgZGl2aWRlICAxMDAgICAxICAgICAgLT4gIDEwMAorZGRkaXYwMzIgZGl2aWRlICAxMDAwICAxICAgICAgLT4gIDEwMDAKK2RkZGl2MDMzIGRpdmlkZSAgMTAwMCAgMTAwICAgIC0+ICAxMAorCitkZGRpdjAzNSBkaXZpZGUgIDEgICAgIDIgICAgICAtPiAgMC41CitkZGRpdjAzNiBkaXZpZGUgIDEgICAgIDQgICAgICAtPiAgMC4yNQorZGRkaXYwMzcgZGl2aWRlICAxICAgICA4ICAgICAgLT4gIDAuMTI1CitkZGRpdjAzOCBkaXZpZGUgIDEgICAgIDE2ICAgICAtPiAgMC4wNjI1CitkZGRpdjAzOSBkaXZpZGUgIDEgICAgIDMyICAgICAtPiAgMC4wMzEyNQorZGRkaXYwNDAgZGl2aWRlICAxICAgICA2NCAgICAgLT4gIDAuMDE1NjI1CitkZGRpdjA0MSBkaXZpZGUgIDEgICAgLTIgICAgICAtPiAgLTAuNQorZGRkaXYwNDIgZGl2aWRlICAxICAgIC00ICAgICAgLT4gIC0wLjI1CitkZGRpdjA0MyBkaXZpZGUgIDEgICAgLTggICAgICAtPiAgLTAuMTI1CitkZGRpdjA0NCBkaXZpZGUgIDEgICAgLTE2ICAgICAtPiAgLTAuMDYyNQorZGRkaXYwNDUgZGl2aWRlICAxICAgIC0zMiAgICAgLT4gIC0wLjAzMTI1CitkZGRpdjA0NiBkaXZpZGUgIDEgICAgLTY0ICAgICAtPiAgLTAuMDE1NjI1CitkZGRpdjA0NyBkaXZpZGUgLTEgICAgIDIgICAgICAtPiAgLTAuNQorZGRkaXYwNDggZGl2aWRlIC0xICAgICA0ICAgICAgLT4gIC0wLjI1CitkZGRpdjA0OSBkaXZpZGUgLTEgICAgIDggICAgICAtPiAgLTAuMTI1CitkZGRpdjA1MCBkaXZpZGUgLTEgICAgIDE2ICAgICAtPiAgLTAuMDYyNQorZGRkaXYwNTEgZGl2aWRlIC0xICAgICAzMiAgICAgLT4gIC0wLjAzMTI1CitkZGRpdjA1MiBkaXZpZGUgLTEgICAgIDY0ICAgICAtPiAgLTAuMDE1NjI1CitkZGRpdjA1MyBkaXZpZGUgLTEgICAgLTIgICAgICAtPiAgMC41CitkZGRpdjA1NCBkaXZpZGUgLTEgICAgLTQgICAgICAtPiAgMC4yNQorZGRkaXYwNTUgZGl2aWRlIC0xICAgIC04ICAgICAgLT4gIDAuMTI1CitkZGRpdjA1NiBkaXZpZGUgLTEgICAgLTE2ICAgICAtPiAgMC4wNjI1CitkZGRpdjA1NyBkaXZpZGUgLTEgICAgLTMyICAgICAtPiAgMC4wMzEyNQorZGRkaXYwNTggZGl2aWRlIC0xICAgIC02NCAgICAgLT4gIDAuMDE1NjI1CisKKy0tIGJjZFRpbWUKK2RkZGl2MDYwIGRpdmlkZSAgMSA3ICAgICAgICAgICAgICAgICAgIC0+IDAuMTQyODU3MTQyODU3MTQyOSBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MDYxIGRpdmlkZSAxLjIzNDU2NzggIDEuOTg3NjU0MyAgIC0+IDAuNjIxMTE3OTY4MDQ5MDcxNyBJbmV4YWN0IFJvdW5kZWQKKworLS0gICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkZGRpdjA3MSBkaXZpZGUgIDk5OTk5OTk5OTk5OTk5OTkgMSAgLT4gIDk5OTk5OTk5OTk5OTk5OTkKK2RkZGl2MDcyIGRpdmlkZSAgOTk5OTk5OTk5OTk5OTk5ICAxICAtPiAgOTk5OTk5OTk5OTk5OTk5CitkZGRpdjA3MyBkaXZpZGUgIDk5OTk5OTk5OTk5OTk5ICAgMSAgLT4gIDk5OTk5OTk5OTk5OTk5CitkZGRpdjA3NCBkaXZpZGUgIDk5OTk5OTk5OTk5OTkgICAgMSAgLT4gIDk5OTk5OTk5OTk5OTkKK2RkZGl2MDc1IGRpdmlkZSAgOTk5OTk5OTk5OTk5ICAgICAxICAtPiAgOTk5OTk5OTk5OTk5CitkZGRpdjA3NiBkaXZpZGUgIDk5OTk5OTk5OTk5ICAgICAgMSAgLT4gIDk5OTk5OTk5OTk5CitkZGRpdjA3NyBkaXZpZGUgIDk5OTk5OTk5OTkgICAgICAgMSAgLT4gIDk5OTk5OTk5OTkKK2RkZGl2MDc4IGRpdmlkZSAgOTk5OTk5OTk5ICAgICAgICAxICAtPiAgOTk5OTk5OTk5CitkZGRpdjA3OSBkaXZpZGUgIDk5OTk5OTk5ICAgICAgICAgMSAgLT4gIDk5OTk5OTk5CitkZGRpdjA4MCBkaXZpZGUgIDk5OTk5OTkgICAgICAgICAgMSAgLT4gIDk5OTk5OTkKK2RkZGl2MDgxIGRpdmlkZSAgOTk5OTk5ICAgICAgICAgICAxICAtPiAgOTk5OTk5CitkZGRpdjA4MiBkaXZpZGUgIDk5OTk5ICAgICAgICAgICAgMSAgLT4gIDk5OTk5CitkZGRpdjA4MyBkaXZpZGUgIDk5OTkgICAgICAgICAgICAgMSAgLT4gIDk5OTkKK2RkZGl2MDg0IGRpdmlkZSAgOTk5ICAgICAgICAgICAgICAxICAtPiAgOTk5CitkZGRpdjA4NSBkaXZpZGUgIDk5ICAgICAgICAgICAgICAgMSAgLT4gIDk5CitkZGRpdjA4NiBkaXZpZGUgIDkgICAgICAgICAgICAgICAgMSAgLT4gIDkKKworZGRkaXYwOTAgZGl2aWRlICAwLiAgICAgICAgICAgIDEgICAgLT4gIDAKK2RkZGl2MDkxIGRpdmlkZSAgLjAgICAgICAgICAgICAxICAgIC0+ICAwLjAKK2RkZGl2MDkyIGRpdmlkZSAgMC4wMCAgICAgICAgICAxICAgIC0+ICAwLjAwCitkZGRpdjA5MyBkaXZpZGUgIDAuMDBFKzkgICAgICAgMSAgICAtPiAgMEUrNworZGRkaXYwOTQgZGl2aWRlICAwLjAwMDBFLTUwICAgIDEgICAgLT4gIDBFLTU0CisKK2RkZGl2MDk1IGRpdmlkZSAgMSAgICAgICAgICAgIDFFLTggIC0+ICAxRSs4CitkZGRpdjA5NiBkaXZpZGUgIDEgICAgICAgICAgICAxRS05ICAtPiAgMUUrOQorZGRkaXYwOTcgZGl2aWRlICAxICAgICAgICAgICAgMUUtMTAgLT4gIDFFKzEwCitkZGRpdjA5OCBkaXZpZGUgIDEgICAgICAgICAgICAxRS0xMSAtPiAgMUUrMTEKK2RkZGl2MDk5IGRpdmlkZSAgMSAgICAgICAgICAgIDFFLTEyIC0+ICAxRSsxMgorCitkZGRpdjEwMCBkaXZpZGUgIDEgIDEgICAtPiAxCitkZGRpdjEwMSBkaXZpZGUgIDEgIDIgICAtPiAwLjUKK2RkZGl2MTAyIGRpdmlkZSAgMSAgMyAgIC0+IDAuMzMzMzMzMzMzMzMzMzMzMyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTAzIGRpdmlkZSAgMSAgNCAgIC0+IDAuMjUKK2RkZGl2MTA0IGRpdmlkZSAgMSAgNSAgIC0+IDAuMgorZGRkaXYxMDUgZGl2aWRlICAxICA2ICAgLT4gMC4xNjY2NjY2NjY2NjY2NjY3IEluZXhhY3QgUm91bmRlZAorZGRkaXYxMDYgZGl2aWRlICAxICA3ICAgLT4gMC4xNDI4NTcxNDI4NTcxNDI5IEluZXhhY3QgUm91bmRlZAorZGRkaXYxMDcgZGl2aWRlICAxICA4ICAgLT4gMC4xMjUKK2RkZGl2MTA4IGRpdmlkZSAgMSAgOSAgIC0+IDAuMTExMTExMTExMTExMTExMSBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTA5IGRpdmlkZSAgMSAgMTAgIC0+IDAuMQorZGRkaXYxMTAgZGl2aWRlICAxICAxICAgLT4gMQorZGRkaXYxMTEgZGl2aWRlICAyICAxICAgLT4gMgorZGRkaXYxMTIgZGl2aWRlICAzICAxICAgLT4gMworZGRkaXYxMTMgZGl2aWRlICA0ICAxICAgLT4gNAorZGRkaXYxMTQgZGl2aWRlICA1ICAxICAgLT4gNQorZGRkaXYxMTUgZGl2aWRlICA2ICAxICAgLT4gNgorZGRkaXYxMTYgZGl2aWRlICA3ICAxICAgLT4gNworZGRkaXYxMTcgZGl2aWRlICA4ICAxICAgLT4gOAorZGRkaXYxMTggZGl2aWRlICA5ICAxICAgLT4gOQorZGRkaXYxMTkgZGl2aWRlICAxMCAxICAgLT4gMTAKKworZGRkaXYxMjAgZGl2aWRlICAzRSsxIDAuMDAxICAtPiAzRSs0CitkZGRpdjEyMSBkaXZpZGUgIDIuMjAwIDIgICAgIC0+IDEuMTAwCisKK2RkZGl2MTMwIGRpdmlkZSAgMTIzNDUgIDQuOTk5ICAtPiAgMjQ2OS40OTM4OTg3Nzk3NTYgICAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEzMSBkaXZpZGUgIDEyMzQ1ICA0Ljk5ICAgLT4gIDI0NzMuOTQ3ODk1NzkxNTgzICAgIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMzIgZGl2aWRlICAxMjM0NSAgNC45ICAgIC0+ICAyNTE5LjM4Nzc1NTEwMjA0MSAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTMzIGRpdmlkZSAgMTIzNDUgIDUgICAgICAtPiAgMjQ2OQorZGRkaXYxMzQgZGl2aWRlICAxMjM0NSAgNS4xICAgIC0+ICAyNDIwLjU4ODIzNTI5NDExOCAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTM1IGRpdmlkZSAgMTIzNDUgIDUuMDEgICAtPiAgMjQ2NC4wNzE4NTYyODc0MjUgICAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEzNiBkaXZpZGUgIDEyMzQ1ICA1LjAwMSAgLT4gIDI0NjguNTA2Mjk4NzQwMjUyICAgIEluZXhhY3QgUm91bmRlZAorCistLSB0ZXN0IHBvc3NpYmx5IGltcHJlY2lzZSByZXN1bHRzCitkZGRpdjIyMCBkaXZpZGUgMzkxICAgNTk3IC0+ICAwLjY1NDk0MTM3MzUzNDMzODQgIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMjEgZGl2aWRlIDM5MSAgLTU5NyAtPiAtMC42NTQ5NDEzNzM1MzQzMzg0ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjIyIGRpdmlkZSAtMzkxICA1OTcgLT4gLTAuNjU0OTQxMzczNTM0MzM4NCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIyMyBkaXZpZGUgLTM5MSAtNTk3IC0+ICAwLjY1NDk0MTM3MzUzNDMzODQgIEluZXhhY3QgUm91bmRlZAorCistLSB0ZXN0IHNvbWUgY2FzZXMgdGhhdCBhcmUgY2xvc2UgdG8gZXhwb25lbnQgb3ZlcmZsb3csIHNvbWUgd2l0aCBjb2VmZmljaWVudCBwYWRkaW5nCitkZGRpdjI3MCBkaXZpZGUgMSAxZTM4NCAgICAgICAgICAgICAgICAgIC0+IDFFLTM4NCAgICAgICAgICAgICAgICAgU3Vibm9ybWFsCitkZGRpdjI3MSBkaXZpZGUgMSAwLjllMzg0ICAgICAgICAgICAgICAgIC0+IDEuMTExMTExMTExMTExMTFFLTM4NCAgUm91bmRlZCBJbmV4YWN0IFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkZGl2MjcyIGRpdmlkZSAxIDAuOTllMzg0ICAgICAgICAgICAgICAgLT4gMS4wMTAxMDEwMTAxMDEwMUUtMzg0ICBSb3VuZGVkIEluZXhhY3QgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRkaXYyNzMgZGl2aWRlIDEgMC45OTk5OTk5OTk5OTk5OTk5ZTM4NCAtPiAxLjAwMDAwMDAwMDAwMDAwRS0zODQgIFJvdW5kZWQgSW5leGFjdCBTdWJub3JtYWwgVW5kZXJmbG93CitkZGRpdjI3NCBkaXZpZGUgOWUzODQgICAgMSAgICAgICAgICAgICAgIC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszODQgQ2xhbXBlZAorZGRkaXYyNzUgZGl2aWRlIDkuOWUzODQgIDEgICAgICAgICAgICAgICAtPiA5LjkwMDAwMDAwMDAwMDAwMEUrMzg0IENsYW1wZWQKK2RkZGl2Mjc2IGRpdmlkZSA5Ljk5ZTM4NCAxICAgICAgICAgICAgICAgLT4gOS45OTAwMDAwMDAwMDAwMDBFKzM4NCBDbGFtcGVkCitkZGRpdjI3NyBkaXZpZGUgOS45OTk5OTk5OTk5OTk5ZTM4NCAxICAgIC0+IDkuOTk5OTk5OTk5OTk5OTAwRSszODQgQ2xhbXBlZAorZGRkaXYyNzggZGl2aWRlIDkuOTk5OTk5OTk5OTk5OTllMzg0IDEgICAtPiA5Ljk5OTk5OTk5OTk5OTk5MEUrMzg0IENsYW1wZWQKK2RkZGl2Mjc5IGRpdmlkZSA5Ljk5OTk5OTk5OTk5OTk5OWUzODQgMSAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorCitkZGRpdjI4NSBkaXZpZGUgOS45ZTM4NCAgMS4xICAgICAgICAgICAgICAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IENsYW1wZWQKK2RkZGl2Mjg2IGRpdmlkZSA5Ljk5ZTM4NCAxLjEgICAgICAgICAgICAgIC0+IDkuMDgxODE4MTgxODE4MTgyRSszODQgSW5leGFjdCBSb3VuZGVkCitkZGRpdjI4NyBkaXZpZGUgOS45OTk5OTk5OTk5OTk5ZTM4NCAxLjEgICAtPiA5LjA5MDkwOTA5MDkwOTAwMEUrMzg0IENsYW1wZWQKK2RkZGl2Mjg4IGRpdmlkZSA5Ljk5OTk5OTk5OTk5OTk5ZTM4NCAxLjEgIC0+IDkuMDkwOTA5MDkwOTA5MDgyRSszODQgSW5leGFjdCBSb3VuZGVkCitkZGRpdjI4OSBkaXZpZGUgOS45OTk5OTk5OTk5OTk5OTllMzg0IDEuMSAtPiA5LjA5MDkwOTA5MDkwOTA5MEUrMzg0IENsYW1wZWQKKworCistLSBEaXZpZGUgaW50byAwIHRlc3RzCitkZGRpdjMwMSBkaXZpZGUgICAgMCAgICA3ICAgICAtPiAwCitkZGRpdjMwMiBkaXZpZGUgICAgMCAgICA3RS01ICAtPiAwRSs1CitkZGRpdjMwMyBkaXZpZGUgICAgMCAgICA3RS0xICAtPiAwRSsxCitkZGRpdjMwNCBkaXZpZGUgICAgMCAgICA3RSsxICAtPiAwLjAKK2RkZGl2MzA1IGRpdmlkZSAgICAwICAgIDdFKzUgIC0+IDAuMDAwMDAKK2RkZGl2MzA2IGRpdmlkZSAgICAwICAgIDdFKzYgIC0+IDAuMDAwMDAwCitkZGRpdjMwNyBkaXZpZGUgICAgMCAgICA3RSs3ICAtPiAwRS03CitkZGRpdjMwOCBkaXZpZGUgICAgMCAgIDcwRS01ICAtPiAwRSs1CitkZGRpdjMwOSBkaXZpZGUgICAgMCAgIDcwRS0xICAtPiAwRSsxCitkZGRpdjMxMCBkaXZpZGUgICAgMCAgIDcwRSswICAtPiAwCitkZGRpdjMxMSBkaXZpZGUgICAgMCAgIDcwRSsxICAtPiAwLjAKK2RkZGl2MzEyIGRpdmlkZSAgICAwICAgNzBFKzUgIC0+IDAuMDAwMDAKK2RkZGl2MzEzIGRpdmlkZSAgICAwICAgNzBFKzYgIC0+IDAuMDAwMDAwCitkZGRpdjMxNCBkaXZpZGUgICAgMCAgIDcwRSs3ICAtPiAwRS03CitkZGRpdjMxNSBkaXZpZGUgICAgMCAgNzAwRS01ICAtPiAwRSs1CitkZGRpdjMxNiBkaXZpZGUgICAgMCAgNzAwRS0xICAtPiAwRSsxCitkZGRpdjMxNyBkaXZpZGUgICAgMCAgNzAwRSswICAtPiAwCitkZGRpdjMxOCBkaXZpZGUgICAgMCAgNzAwRSsxICAtPiAwLjAKK2RkZGl2MzE5IGRpdmlkZSAgICAwICA3MDBFKzUgIC0+IDAuMDAwMDAKK2RkZGl2MzIwIGRpdmlkZSAgICAwICA3MDBFKzYgIC0+IDAuMDAwMDAwCitkZGRpdjMyMSBkaXZpZGUgICAgMCAgNzAwRSs3ICAtPiAwRS03CitkZGRpdjMyMiBkaXZpZGUgICAgMCAgNzAwRSs3NyAtPiAwRS03NworCitkZGRpdjMzMSBkaXZpZGUgMEUtMyAgICA3RS01ICAtPiAwRSsyCitkZGRpdjMzMiBkaXZpZGUgMEUtMyAgICA3RS0xICAtPiAwLjAwCitkZGRpdjMzMyBkaXZpZGUgMEUtMyAgICA3RSsxICAtPiAwLjAwMDAKK2RkZGl2MzM0IGRpdmlkZSAwRS0zICAgIDdFKzUgIC0+IDBFLTgKK2RkZGl2MzM1IGRpdmlkZSAwRS0xICAgIDdFLTUgIC0+IDBFKzQKK2RkZGl2MzM2IGRpdmlkZSAwRS0xICAgIDdFLTEgIC0+IDAKK2RkZGl2MzM3IGRpdmlkZSAwRS0xICAgIDdFKzEgIC0+IDAuMDAKK2RkZGl2MzM4IGRpdmlkZSAwRS0xICAgIDdFKzUgIC0+IDAuMDAwMDAwCitkZGRpdjMzOSBkaXZpZGUgMEUrMSAgICA3RS01ICAtPiAwRSs2CitkZGRpdjM0MCBkaXZpZGUgMEUrMSAgICA3RS0xICAtPiAwRSsyCitkZGRpdjM0MSBkaXZpZGUgMEUrMSAgICA3RSsxICAtPiAwCitkZGRpdjM0MiBkaXZpZGUgMEUrMSAgICA3RSs1ICAtPiAwLjAwMDAKK2RkZGl2MzQzIGRpdmlkZSAwRSszICAgIDdFLTUgIC0+IDBFKzgKK2RkZGl2MzQ0IGRpdmlkZSAwRSszICAgIDdFLTEgIC0+IDBFKzQKK2RkZGl2MzQ1IGRpdmlkZSAwRSszICAgIDdFKzEgIC0+IDBFKzIKK2RkZGl2MzQ2IGRpdmlkZSAwRSszICAgIDdFKzUgIC0+IDAuMDAKKworLS0gVGhlc2Ugd2VyZSAnaW5wdXQgcm91bmRpbmcnCitkZGRpdjQ0MSBkaXZpZGUgMTIzNDU2NzgwMDAgMSAtPiAxMjM0NTY3ODAwMAorZGRkaXY0NDIgZGl2aWRlIDEgMTIzNDU2NzgwMDAgLT4gOC4xMDAwMDA2NjQyMDAwNTRFLTExIEluZXhhY3QgUm91bmRlZAorZGRkaXY0NDMgZGl2aWRlIDEyMzQ1Njc4MDAgIDEgLT4gMTIzNDU2NzgwMAorZGRkaXY0NDQgZGl2aWRlIDEgMTIzNDU2NzgwMCAgLT4gOC4xMDAwMDA2NjQyMDAwNTRFLTEwIEluZXhhY3QgUm91bmRlZAorZGRkaXY0NDUgZGl2aWRlIDEyMzQ1Njc4OTAgIDEgLT4gMTIzNDU2Nzg5MAorZGRkaXY0NDYgZGl2aWRlIDEgMTIzNDU2Nzg5MCAgLT4gOC4xMDAwMDAwNzM3MTAwMDFFLTEwIEluZXhhY3QgUm91bmRlZAorZGRkaXY0NDcgZGl2aWRlIDEyMzQ1Njc4OTEgIDEgLT4gMTIzNDU2Nzg5MQorZGRkaXY0NDggZGl2aWRlIDEgMTIzNDU2Nzg5MSAgLT4gOC4xMDAwMDAwNjcxNDkwMDFFLTEwIEluZXhhY3QgUm91bmRlZAorZGRkaXY0NDkgZGl2aWRlIDEyMzQ1Njc4OTAxIDEgLT4gMTIzNDU2Nzg5MDEKK2RkZGl2NDUwIGRpdmlkZSAxIDEyMzQ1Njc4OTAxIC0+IDguMTAwMDAwMDczMDUzOTAxRS0xMSBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDUxIGRpdmlkZSAxMjM0NTY3ODk2ICAxIC0+IDEyMzQ1Njc4OTYKK2RkZGl2NDUyIGRpdmlkZSAxIDEyMzQ1Njc4OTYgIC0+IDguMTAwMDAwMDM0MzQ0MDAwRS0xMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gaGlnaC1sb3dzCitkZGRpdjQ1MyBkaXZpZGUgMWUrMSAgIDEgICAgLT4gICAxRSsxCitkZGRpdjQ1NCBkaXZpZGUgMWUrMSAgIDEuMCAgLT4gICAxRSsxCitkZGRpdjQ1NSBkaXZpZGUgMWUrMSAgIDEuMDAgLT4gICAxRSsxCitkZGRpdjQ1NiBkaXZpZGUgMWUrMiAgIDIgICAgLT4gICA1RSsxCitkZGRpdjQ1NyBkaXZpZGUgMWUrMiAgIDIuMCAgLT4gICA1RSsxCitkZGRpdjQ1OCBkaXZpZGUgMWUrMiAgIDIuMDAgLT4gICA1RSsxCisKKy0tIHNvbWUgZnJvbSBJRUVFIGRpc2N1c3Npb25zCitkZGRpdjQ2MCBkaXZpZGUgM2UwICAgICAgMmUwICAgICAtPiAxLjUKK2RkZGl2NDYxIGRpdmlkZSAzMGUtMSAgICAyZTAgICAgIC0+IDEuNQorZGRkaXY0NjIgZGl2aWRlIDMwMGUtMiAgIDJlMCAgICAgLT4gMS41MAorZGRkaXY0NjQgZGl2aWRlIDMwMDBlLTMgIDJlMCAgICAgLT4gMS41MDAKK2RkZGl2NDY1IGRpdmlkZSAzZTAgICAgICAyMGUtMSAgIC0+IDEuNQorZGRkaXY0NjYgZGl2aWRlIDMwZS0xICAgIDIwZS0xICAgLT4gMS41CitkZGRpdjQ2NyBkaXZpZGUgMzAwZS0yICAgMjBlLTEgICAtPiAxLjUKK2RkZGl2NDY4IGRpdmlkZSAzMDAwZS0zICAyMGUtMSAgIC0+IDEuNTAKK2RkZGl2NDY5IGRpdmlkZSAzZTAgICAgICAyMDBlLTIgIC0+IDEuNQorZGRkaXY0NzAgZGl2aWRlIDMwZS0xICAgIDIwMGUtMiAgLT4gMS41CitkZGRpdjQ3MSBkaXZpZGUgMzAwZS0yICAgMjAwZS0yICAtPiAxLjUKK2RkZGl2NDcyIGRpdmlkZSAzMDAwZS0zICAyMDBlLTIgIC0+IDEuNQorZGRkaXY0NzMgZGl2aWRlIDNlMCAgICAgIDIwMDBlLTMgLT4gMS41CitkZGRpdjQ3NCBkaXZpZGUgMzBlLTEgICAgMjAwMGUtMyAtPiAxLjUKK2RkZGl2NDc1IGRpdmlkZSAzMDBlLTIgICAyMDAwZS0zIC0+IDEuNQorZGRkaXY0NzYgZGl2aWRlIDMwMDBlLTMgIDIwMDBlLTMgLT4gMS41CisKKy0tIHNvbWUgcmVjaXByb2NhbHMKK2RkZGl2NDgwIGRpdmlkZSAxICAgICAgICAxLjBFKzMzIC0+IDFFLTMzCitkZGRpdjQ4MSBkaXZpZGUgMSAgICAgICAgMTBFKzMzICAtPiAxRS0zNAorZGRkaXY0ODIgZGl2aWRlIDEgICAgICAgIDEuMEUtMzMgLT4gMUUrMzMKK2RkZGl2NDgzIGRpdmlkZSAxICAgICAgICAxMEUtMzMgIC0+IDFFKzMyCisKKy0tIFJNUyBkaXNjdXNzaW9uIHRhYmxlCitkZGRpdjQ4NCBkaXZpZGUgMGU1ICAgICAxZTMgLT4gICAwRSsyCitkZGRpdjQ4NSBkaXZpZGUgMGU1ICAgICAyZTMgLT4gICAwRSsyCitkZGRpdjQ4NiBkaXZpZGUgMGU1ICAgIDEwZTIgLT4gICAwRSszCitkZGRpdjQ4NyBkaXZpZGUgMGU1ICAgIDIwZTIgLT4gICAwRSszCitkZGRpdjQ4OCBkaXZpZGUgMGU1ICAgMTAwZTEgLT4gICAwRSs0CitkZGRpdjQ4OSBkaXZpZGUgMGU1ICAgMjAwZTEgLT4gICAwRSs0CisKK2RkZGl2NDkxIGRpdmlkZSAxZTUgICAgIDFlMyAtPiAgIDFFKzIKK2RkZGl2NDkyIGRpdmlkZSAxZTUgICAgIDJlMyAtPiAgIDVFKzEKK2RkZGl2NDkzIGRpdmlkZSAxZTUgICAgMTBlMiAtPiAgIDFFKzIKK2RkZGl2NDk0IGRpdmlkZSAxZTUgICAgMjBlMiAtPiAgIDVFKzEKK2RkZGl2NDk1IGRpdmlkZSAxZTUgICAxMDBlMSAtPiAgIDFFKzIKK2RkZGl2NDk2IGRpdmlkZSAxZTUgICAyMDBlMSAtPiAgIDVFKzEKKworLS0gdHJ5emVyb3MgY2FzZXMKK3JvdW5kaW5nOiAgICBoYWxmX3VwCitkZGRpdjQ5NyAgZGl2aWRlICAwRSszODAgMTAwMEUtMTMgIC0+IDBFKzM2OSBDbGFtcGVkCitkZGRpdjQ5OCAgZGl2aWRlICAwRS0zOTAgMTAwMEUrMTMgIC0+IDBFLTM5OCBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX3VwCisKKy0tIGZvY3VzIG9uIHRyYWlsaW5nIHplcm9zIGlzc3VlcworZGRkaXY1MDAgZGl2aWRlICAxICAgICAgOS45ICAgIC0+ICAwLjEwMTAxMDEwMTAxMDEwMTAgIEluZXhhY3QgUm91bmRlZAorZGRkaXY1MDEgZGl2aWRlICAxICAgICAgOS4wOSAgIC0+ICAwLjExMDAxMTAwMTEwMDExMDAgIEluZXhhY3QgUm91bmRlZAorZGRkaXY1MDIgZGl2aWRlICAxICAgICAgOS4wMDkgIC0+ICAwLjExMTAwMDExMTAwMDExMTAgIEluZXhhY3QgUm91bmRlZAorCitkZGRpdjUxMSBkaXZpZGUgMSAgICAgICAgIDIgICAgLT4gMC41CitkZGRpdjUxMiBkaXZpZGUgMS4wICAgICAgIDIgICAgLT4gMC41CitkZGRpdjUxMyBkaXZpZGUgMS4wMCAgICAgIDIgICAgLT4gMC41MAorZGRkaXY1MTQgZGl2aWRlIDEuMDAwICAgICAyICAgIC0+IDAuNTAwCitkZGRpdjUxNSBkaXZpZGUgMS4wMDAwICAgIDIgICAgLT4gMC41MDAwCitkZGRpdjUxNiBkaXZpZGUgMS4wMDAwMCAgIDIgICAgLT4gMC41MDAwMAorZGRkaXY1MTcgZGl2aWRlIDEuMDAwMDAwICAyICAgIC0+IDAuNTAwMDAwCitkZGRpdjUxOCBkaXZpZGUgMS4wMDAwMDAwIDIgICAgLT4gMC41MDAwMDAwCitkZGRpdjUxOSBkaXZpZGUgMS4wMCAgICAgIDIuMDAgLT4gMC41CisKK2RkZGl2NTIxIGRpdmlkZSAyICAgIDEgICAgICAgICAtPiAyCitkZGRpdjUyMiBkaXZpZGUgMiAgICAxLjAgICAgICAgLT4gMgorZGRkaXY1MjMgZGl2aWRlIDIgICAgMS4wMCAgICAgIC0+IDIKK2RkZGl2NTI0IGRpdmlkZSAyICAgIDEuMDAwICAgICAtPiAyCitkZGRpdjUyNSBkaXZpZGUgMiAgICAxLjAwMDAgICAgLT4gMgorZGRkaXY1MjYgZGl2aWRlIDIgICAgMS4wMDAwMCAgIC0+IDIKK2RkZGl2NTI3IGRpdmlkZSAyICAgIDEuMDAwMDAwICAtPiAyCitkZGRpdjUyOCBkaXZpZGUgMiAgICAxLjAwMDAwMDAgLT4gMgorZGRkaXY1MjkgZGl2aWRlIDIuMDAgMS4wMCAgICAgIC0+IDIKKworZGRkaXY1MzAgZGl2aWRlICAyLjQwICAgMiAgICAgIC0+ICAxLjIwCitkZGRpdjUzMSBkaXZpZGUgIDIuNDAgICA0ICAgICAgLT4gIDAuNjAKK2RkZGl2NTMyIGRpdmlkZSAgMi40MCAgMTAgICAgICAtPiAgMC4yNAorZGRkaXY1MzMgZGl2aWRlICAyLjQwICAgMi4wICAgIC0+ICAxLjIKK2RkZGl2NTM0IGRpdmlkZSAgMi40MCAgIDQuMCAgICAtPiAgMC42CitkZGRpdjUzNSBkaXZpZGUgIDIuNDAgIDEwLjAgICAgLT4gIDAuMjQKK2RkZGl2NTM2IGRpdmlkZSAgMi40MCAgIDIuMDAgICAtPiAgMS4yCitkZGRpdjUzNyBkaXZpZGUgIDIuNDAgICA0LjAwICAgLT4gIDAuNgorZGRkaXY1MzggZGl2aWRlICAyLjQwICAxMC4wMCAgIC0+ICAwLjI0CitkZGRpdjUzOSBkaXZpZGUgIDAuOSAgICAwLjEgICAgLT4gIDkKK2RkZGl2NTQwIGRpdmlkZSAgMC45ICAgIDAuMDEgICAtPiAgOUUrMQorZGRkaXY1NDEgZGl2aWRlICAwLjkgICAgMC4wMDEgIC0+ICA5RSsyCitkZGRpdjU0MiBkaXZpZGUgIDUgICAgICAyICAgICAgLT4gIDIuNQorZGRkaXY1NDMgZGl2aWRlICA1ICAgICAgMi4wICAgIC0+ICAyLjUKK2RkZGl2NTQ0IGRpdmlkZSAgNSAgICAgIDIuMDAgICAtPiAgMi41CitkZGRpdjU0NSBkaXZpZGUgIDUgICAgICAyMCAgICAgLT4gIDAuMjUKK2RkZGl2NTQ2IGRpdmlkZSAgNSAgICAgIDIwLjAgICAtPiAgMC4yNQorZGRkaXY1NDcgZGl2aWRlICAyLjQwMCAgMiAgICAgIC0+ICAxLjIwMAorZGRkaXY1NDggZGl2aWRlICAyLjQwMCAgMi4wICAgIC0+ICAxLjIwCitkZGRpdjU0OSBkaXZpZGUgIDIuNDAwICAyLjQwMCAgLT4gIDEKKworZGRkaXY1NTAgZGl2aWRlICAyNDAgICAgMSAgICAgIC0+ICAyNDAKK2RkZGl2NTUxIGRpdmlkZSAgMjQwICAgIDEwICAgICAtPiAgMjQKK2RkZGl2NTUyIGRpdmlkZSAgMjQwICAgIDEwMCAgICAtPiAgMi40CitkZGRpdjU1MyBkaXZpZGUgIDI0MCAgICAxMDAwICAgLT4gIDAuMjQKK2RkZGl2NTU0IGRpdmlkZSAgMjQwMCAgIDEgICAgICAtPiAgMjQwMAorZGRkaXY1NTUgZGl2aWRlICAyNDAwICAgMTAgICAgIC0+ICAyNDAKK2RkZGl2NTU2IGRpdmlkZSAgMjQwMCAgIDEwMCAgICAtPiAgMjQKK2RkZGl2NTU3IGRpdmlkZSAgMjQwMCAgIDEwMDAgICAtPiAgMi40CisKKy0tICt2ZSBleHBvbmVudAorZGRkaXY2MDAgZGl2aWRlICAyLjRFKzkgICAgIDIgIC0+ICAxLjJFKzkKK2RkZGl2NjAxIGRpdmlkZSAgMi40MEUrOSAgICAyICAtPiAgMS4yMEUrOQorZGRkaXY2MDIgZGl2aWRlICAyLjQwMEUrOSAgIDIgIC0+ICAxLjIwMEUrOQorZGRkaXY2MDMgZGl2aWRlICAyLjQwMDBFKzkgIDIgIC0+ICAxLjIwMDBFKzkKK2RkZGl2NjA0IGRpdmlkZSAgMjRFKzggICAgICAyICAtPiAgMS4yRSs5CitkZGRpdjYwNSBkaXZpZGUgIDI0MEUrNyAgICAgMiAgLT4gIDEuMjBFKzkKK2RkZGl2NjA2IGRpdmlkZSAgMjQwMEUrNiAgICAyICAtPiAgMS4yMDBFKzkKK2RkZGl2NjA3IGRpdmlkZSAgMjQwMDBFKzUgICAyICAtPiAgMS4yMDAwRSs5CisKKy0tIG1vcmUgemVyb3MsIGV0Yy4KK2RkZGl2NzMxIGRpdmlkZSA1LjAwIDFFLTMgICAgLT4gNS4wMEUrMworZGRkaXY3MzIgZGl2aWRlIDAwLjAwIDAuMDAwICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZGRpdjczMyBkaXZpZGUgMDAuMDAgMEUtMyAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkZGl2NzM0IGRpdmlkZSAgMCAgICAtMCAgICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRkaXY3MzUgZGl2aWRlIC0wICAgICAwICAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZGRpdjczNiBkaXZpZGUgLTAgICAgLTAgICAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKKworZGRkaXY3NDEgZGl2aWRlICAwICAgIC0xICAgICAtPiAtMAorZGRkaXY3NDIgZGl2aWRlIC0wICAgIC0xICAgICAtPiAgMAorZGRkaXY3NDMgZGl2aWRlICAwICAgICAxICAgICAtPiAgMAorZGRkaXY3NDQgZGl2aWRlIC0wICAgICAxICAgICAtPiAtMAorZGRkaXY3NDUgZGl2aWRlIC0xICAgICAwICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY3NDYgZGl2aWRlIC0xICAgIC0wICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY3NDcgZGl2aWRlICAxICAgICAwICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY3NDggZGl2aWRlICAxICAgIC0wICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkZGRpdjc1MSBkaXZpZGUgIDAuMCAgLTEgICAgIC0+IC0wLjAKK2RkZGl2NzUyIGRpdmlkZSAtMC4wICAtMSAgICAgLT4gIDAuMAorZGRkaXY3NTMgZGl2aWRlICAwLjAgICAxICAgICAtPiAgMC4wCitkZGRpdjc1NCBkaXZpZGUgLTAuMCAgIDEgICAgIC0+IC0wLjAKK2RkZGl2NzU1IGRpdmlkZSAtMS4wICAgMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2NzU2IGRpdmlkZSAtMS4wICAtMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2NzU3IGRpdmlkZSAgMS4wICAgMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2NzU4IGRpdmlkZSAgMS4wICAtMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGRkaXY3NjEgZGl2aWRlICAwICAgIC0xLjAgICAtPiAtMEUrMQorZGRkaXY3NjIgZGl2aWRlIC0wICAgIC0xLjAgICAtPiAgMEUrMQorZGRkaXY3NjMgZGl2aWRlICAwICAgICAxLjAgICAtPiAgMEUrMQorZGRkaXY3NjQgZGl2aWRlIC0wICAgICAxLjAgICAtPiAtMEUrMQorZGRkaXY3NjUgZGl2aWRlIC0xICAgICAwLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY3NjYgZGl2aWRlIC0xICAgIC0wLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY3NjcgZGl2aWRlICAxICAgICAwLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY3NjggZGl2aWRlICAxICAgIC0wLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkZGRpdjc3MSBkaXZpZGUgIDAuMCAgLTEuMCAgIC0+IC0wCitkZGRpdjc3MiBkaXZpZGUgLTAuMCAgLTEuMCAgIC0+ICAwCitkZGRpdjc3MyBkaXZpZGUgIDAuMCAgIDEuMCAgIC0+ICAwCitkZGRpdjc3NCBkaXZpZGUgLTAuMCAgIDEuMCAgIC0+IC0wCitkZGRpdjc3NSBkaXZpZGUgLTEuMCAgIDAuMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjc3NiBkaXZpZGUgLTEuMCAgLTAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjc3NyBkaXZpZGUgIDEuMCAgIDAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjc3OCBkaXZpZGUgIDEuMCAgLTAuMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKKy0tIFNwZWNpYWxzCitkZGRpdjc4MCBkaXZpZGUgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2NzgxIGRpdmlkZSAgSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkZGRpdjc4MiBkaXZpZGUgIEluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZGRkaXY3ODMgZGl2aWRlICBJbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2RkZGl2Nzg0IGRpdmlkZSAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitkZGRpdjc4NSBkaXZpZGUgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorZGRkaXY3ODYgZGl2aWRlICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK2RkZGl2Nzg3IGRpdmlkZSAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY3ODggZGl2aWRlIC0xMDAwICBJbmYgICAtPiAtMEUtMzk4IENsYW1wZWQKK2RkZGl2Nzg5IGRpdmlkZSAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY3OTAgZGl2aWRlIC0xICAgICBJbmYgICAtPiAtMEUtMzk4IENsYW1wZWQKK2RkZGl2NzkxIGRpdmlkZSAtMCAgICAgSW5mICAgLT4gLTBFLTM5OCBDbGFtcGVkCitkZGRpdjc5MiBkaXZpZGUgIDAgICAgIEluZiAgIC0+ICAwRS0zOTggQ2xhbXBlZAorZGRkaXY3OTMgZGl2aWRlICAxICAgICBJbmYgICAtPiAgMEUtMzk4IENsYW1wZWQKK2RkZGl2Nzk0IGRpdmlkZSAgMTAwMCAgSW5mICAgLT4gIDBFLTM5OCBDbGFtcGVkCitkZGRpdjc5NSBkaXZpZGUgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZGRkaXY4MDAgZGl2aWRlIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjgwMSBkaXZpZGUgLUluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZGRkaXY4MDIgZGl2aWRlIC1JbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RkZGl2ODAzIGRpdmlkZSAtSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkZGRpdjgwNCBkaXZpZGUgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZGRkaXY4MDUgZGl2aWRlIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RkZGl2ODA2IGRpdmlkZSAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkZGRpdjgwNyBkaXZpZGUgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODA4IGRpdmlkZSAtMTAwMCAgSW5mICAgLT4gLTBFLTM5OCBDbGFtcGVkCitkZGRpdjgwOSBkaXZpZGUgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODEwIGRpdmlkZSAtMSAgICAtSW5mICAgLT4gIDBFLTM5OCBDbGFtcGVkCitkZGRpdjgxMSBkaXZpZGUgLTAgICAgLUluZiAgIC0+ICAwRS0zOTggQ2xhbXBlZAorZGRkaXY4MTIgZGl2aWRlICAwICAgIC1JbmYgICAtPiAtMEUtMzk4IENsYW1wZWQKK2RkZGl2ODEzIGRpdmlkZSAgMSAgICAtSW5mICAgLT4gLTBFLTM5OCBDbGFtcGVkCitkZGRpdjgxNCBkaXZpZGUgIDEwMDAgLUluZiAgIC0+IC0wRS0zOTggQ2xhbXBlZAorZGRkaXY4MTUgZGl2aWRlICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RkZGl2ODIxIGRpdmlkZSAgTmFOIC1JbmYgICAgLT4gIE5hTgorZGRkaXY4MjIgZGl2aWRlICBOYU4gLTEwMDAgICAtPiAgTmFOCitkZGRpdjgyMyBkaXZpZGUgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2RkZGl2ODI0IGRpdmlkZSAgTmFOIC0wICAgICAgLT4gIE5hTgorZGRkaXY4MjUgZGl2aWRlICBOYU4gIDAgICAgICAtPiAgTmFOCitkZGRpdjgyNiBkaXZpZGUgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2RkZGl2ODI3IGRpdmlkZSAgTmFOICAxMDAwICAgLT4gIE5hTgorZGRkaXY4MjggZGl2aWRlICBOYU4gIEluZiAgICAtPiAgTmFOCitkZGRpdjgyOSBkaXZpZGUgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RkZGl2ODMwIGRpdmlkZSAtSW5mICBOYU4gICAgLT4gIE5hTgorZGRkaXY4MzEgZGl2aWRlIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkZGRpdjgzMiBkaXZpZGUgLTEgICAgTmFOICAgIC0+ICBOYU4KK2RkZGl2ODMzIGRpdmlkZSAtMCAgICBOYU4gICAgLT4gIE5hTgorZGRkaXY4MzQgZGl2aWRlICAwICAgIE5hTiAgICAtPiAgTmFOCitkZGRpdjgzNSBkaXZpZGUgIDEgICAgTmFOICAgIC0+ICBOYU4KK2RkZGl2ODM2IGRpdmlkZSAgMTAwMCBOYU4gICAgLT4gIE5hTgorZGRkaXY4MzcgZGl2aWRlICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2RkZGl2ODQxIGRpdmlkZSAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODQyIGRpdmlkZSAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODQzIGRpdmlkZSAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODQ0IGRpdmlkZSAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODQ1IGRpdmlkZSAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODQ2IGRpdmlkZSAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODQ3IGRpdmlkZSAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODQ4IGRpdmlkZSAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODQ5IGRpdmlkZSAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODUwIGRpdmlkZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODUxIGRpdmlkZSAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODUyIGRpdmlkZSAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODUzIGRpdmlkZSAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODU0IGRpdmlkZSAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODU1IGRpdmlkZSAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODU2IGRpdmlkZSAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODU3IGRpdmlkZSAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODU4IGRpdmlkZSAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODU5IGRpdmlkZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRkaXY4NjEgZGl2aWRlICBOYU45IC1JbmYgICAtPiAgTmFOOQorZGRkaXY4NjIgZGl2aWRlICBOYU44ICAxMDAwICAtPiAgTmFOOAorZGRkaXY4NjMgZGl2aWRlICBOYU43ICBJbmYgICAtPiAgTmFONworZGRkaXY4NjQgZGl2aWRlICBOYU42ICBOYU41ICAtPiAgTmFONgorZGRkaXY4NjUgZGl2aWRlIC1JbmYgICBOYU40ICAtPiAgTmFONAorZGRkaXY4NjYgZGl2aWRlIC0xMDAwICBOYU4zICAtPiAgTmFOMworZGRkaXY4NjcgZGl2aWRlICBJbmYgICBOYU4yICAtPiAgTmFOMgorCitkZGRpdjg3MSBkaXZpZGUgIHNOYU45OSAtSW5mICAgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY4NzIgZGl2aWRlICBzTmFOOTggLTEgICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODczIGRpdmlkZSAgc05hTjk3ICBOYU4gICAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg3NCBkaXZpZGUgIHNOYU45NiBzTmFOOTQgIC0+ICBOYU45NiBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY4NzUgZGl2aWRlICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODc2IGRpdmlkZSAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg3NyBkaXZpZGUgIDAgICAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY4NzggZGl2aWRlICBJbmYgICAgc05hTjkwICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODc5IGRpdmlkZSAgTmFOICAgIHNOYU44OSAgLT4gIE5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKK2RkZGl2ODgxIGRpdmlkZSAgLU5hTjkgIC1JbmYgICAtPiAgLU5hTjkKK2RkZGl2ODgyIGRpdmlkZSAgLU5hTjggICAxMDAwICAtPiAgLU5hTjgKK2RkZGl2ODgzIGRpdmlkZSAgLU5hTjcgICBJbmYgICAtPiAgLU5hTjcKK2RkZGl2ODg0IGRpdmlkZSAgLU5hTjYgIC1OYU41ICAtPiAgLU5hTjYKK2RkZGl2ODg1IGRpdmlkZSAgLUluZiAgIC1OYU40ICAtPiAgLU5hTjQKK2RkZGl2ODg2IGRpdmlkZSAgLTEwMDAgIC1OYU4zICAtPiAgLU5hTjMKK2RkZGl2ODg3IGRpdmlkZSAgIEluZiAgIC1OYU4yICAtPiAgLU5hTjIKKworZGRkaXY4OTEgZGl2aWRlIC1zTmFOOTkgLUluZiAgICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODkyIGRpdmlkZSAtc05hTjk4IC0xICAgICAgLT4gLU5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg5MyBkaXZpZGUgLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY4OTQgZGl2aWRlIC1zTmFOOTYgLXNOYU45NCAtPiAtTmFOOTYgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODk1IGRpdmlkZSAtTmFOOTUgIC1zTmFOOTMgLT4gLU5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg5NiBkaXZpZGUgLUluZiAgICAtc05hTjkyIC0+IC1OYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY4OTcgZGl2aWRlICAwICAgICAgLXNOYU45MSAtPiAtTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODk4IGRpdmlkZSAgSW5mICAgIC1zTmFOOTAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg5OSBkaXZpZGUgLU5hTiAgICAtc05hTjg5IC0+IC1OYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIGRpdmlkZSBieSAwCitkZGRpdjkwMSBkaXZpZGUgICAgMCAgICAgICAwICAgLT4gIE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkZGl2OTAyIGRpdmlkZSAgICAwLjBFNSAgIDAgICAtPiAgTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRkaXY5MDMgZGl2aWRlICAgIDAuMDAwICAgMCAgIC0+ICBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZGRpdjkwNCBkaXZpZGUgICAgMC4wMDAxICAwICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTA1IGRpdmlkZSAgICAwLjAxICAgIDAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5MDYgZGl2aWRlICAgIDAuMSAgICAgMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkwNyBkaXZpZGUgICAgMSAgICAgICAwICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTA4IGRpdmlkZSAgICAxICAgICAgIDAuMCAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5MDkgZGl2aWRlICAgMTAgICAgICAgMC4wIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkxMCBkaXZpZGUgICAxRSsxMDAgICAwLjAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTExIGRpdmlkZSAgIDFFKzEwMCAgIDAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkZGRpdjkyMSBkaXZpZGUgICAtMC4wMDAxICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTIyIGRpdmlkZSAgIC0wLjAxICAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5MjMgZGl2aWRlICAgLTAuMSAgICAgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkyNCBkaXZpZGUgICAtMSAgICAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTI1IGRpdmlkZSAgIC0xICAgICAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5MjYgZGl2aWRlICAtMTAgICAgICAgMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkyNyBkaXZpZGUgIC0xRSsxMDAgICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTI4IGRpdmlkZSAgLTFFKzEwMCAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkZGRpdjkzMSBkaXZpZGUgICAgMC4wMDAxIC0wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTMyIGRpdmlkZSAgICAwLjAxICAgLTAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5MzMgZGl2aWRlICAgIDAuMSAgICAtMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkzNCBkaXZpZGUgICAgMSAgICAgIC0wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTM1IGRpdmlkZSAgICAxICAgICAgLTAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5MzYgZGl2aWRlICAgMTAgICAgICAtMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkzNyBkaXZpZGUgICAxRSsxMDAgIC0wLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTM4IGRpdmlkZSAgIDFFKzEwMCAgLTAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkZGRpdjk0MSBkaXZpZGUgICAtMC4wMDAxIC0wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTQyIGRpdmlkZSAgIC0wLjAxICAgLTAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5NDMgZGl2aWRlICAgLTAuMSAgICAtMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjk0NCBkaXZpZGUgICAtMSAgICAgIC0wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTQ1IGRpdmlkZSAgIC0xICAgICAgLTAuMCAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5NDYgZGl2aWRlICAtMTAgICAgICAtMC4wIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjk0NyBkaXZpZGUgIC0xRSsxMDAgIC0wLjAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTQ4IGRpdmlkZSAgLTFFKzEwMCAgLTAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCistLSBFeGFtcGxlcyBmcm9tIFNRTCBwcm9wb3NhbCAoS3Jpc2huYSBLdWxrYXJuaSkKK2RkZGl2MTAyMSAgZGl2aWRlIDFFMCAgICAgICAgICAxRTAgLT4gMQorZGRkaXYxMDIyICBkaXZpZGUgMUUwICAgICAgICAgIDJFMCAtPiAwLjUKK2RkZGl2MTAyMyAgZGl2aWRlIDFFMCAgICAgICAgICAzRTAgLT4gMC4zMzMzMzMzMzMzMzMzMzMzIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMDI0ICBkaXZpZGUgMTAwRS0yICAgMTAwMEUtMyAtPiAxCitkZGRpdjEwMjUgIGRpdmlkZSAyNEUtMSAgICAgICAgMkUwIC0+IDEuMgorZGRkaXYxMDI2ICBkaXZpZGUgMjQwMEUtMyAgICAgIDJFMCAtPiAxLjIwMAorZGRkaXYxMDI3ICBkaXZpZGUgNUUwICAgICAgICAgIDJFMCAtPiAyLjUKK2RkZGl2MTAyOCAgZGl2aWRlIDVFMCAgICAgICAgMjBFLTEgLT4gMi41CitkZGRpdjEwMjkgIGRpdmlkZSA1RTAgICAgICAyMDAwRS0zIC0+IDIuNQorZGRkaXYxMDMwICBkaXZpZGUgNUUwICAgICAgICAgMkUtMSAtPiAyNQorZGRkaXYxMDMxICBkaXZpZGUgNUUwICAgICAgICAyMEUtMiAtPiAyNQorZGRkaXYxMDMyICBkaXZpZGUgNDgwRS0yICAgICAgIDNFMCAtPiAxLjYwCitkZGRpdjEwMzMgIGRpdmlkZSA0N0UtMSAgICAgICAgMkUwIC0+IDIuMzUKKworLS0gRUNNQVNjcmlwdCBiYWQgZXhhbXBsZXMKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KK2RkZGl2MTA0MCAgZGl2aWRlIDUgOSAgLT4gMC41NTU1NTU1NTU1NTU1NTU2IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorZGRkaXYxMDQxICBkaXZpZGUgNiAxMSAtPiAwLjU0NTQ1NDU0NTQ1NDU0NTUgSW5leGFjdCBSb3VuZGVkCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgLi4gbm90ZSBzdWJub3JtYWwgcmVzdWx0cworLS0gc2lnbnMKK2RkZGl2MTA1MSBkaXZpZGUgIDFlKzI3NyAgMWUtMzExIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTA1MiBkaXZpZGUgIDFlKzI3NyAtMWUtMzExIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTA1MyBkaXZpZGUgLTFlKzI3NyAgMWUtMzExIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTA1NCBkaXZpZGUgLTFlKzI3NyAtMWUtMzExIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTA1NSBkaXZpZGUgIDFlLTI3NyAgMWUrMzExIC0+ICAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRkaXYxMDU2IGRpdmlkZSAgMWUtMjc3IC0xZSszMTEgLT4gLTBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGRpdjEwNTcgZGl2aWRlIC0xZS0yNzcgIDFlKzMxMSAtPiAtMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZGl2MTA1OCBkaXZpZGUgLTFlLTI3NyAtMWUrMzExIC0+ICAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSAnc3Vibm9ybWFsJyBib3VuZGFyeSAoYWxsIGhhcmQgdW5kZXJmbG93IG9yIG92ZXJmbG93IGluIGJhc2UgYXJpdGhlbXRpYykKK2RkZGl2MTA2MCBkaXZpZGUgMWUtMjkxIDFlKzEwMSAtPiAxRS0zOTIgU3Vibm9ybWFsCitkZGRpdjEwNjEgZGl2aWRlIDFlLTI5MSAxZSsxMDIgLT4gMUUtMzkzIFN1Ym5vcm1hbAorZGRkaXYxMDYyIGRpdmlkZSAxZS0yOTEgMWUrMTAzIC0+IDFFLTM5NCBTdWJub3JtYWwKK2RkZGl2MTA2MyBkaXZpZGUgMWUtMjkxIDFlKzEwNCAtPiAxRS0zOTUgU3Vibm9ybWFsCitkZGRpdjEwNjQgZGl2aWRlIDFlLTI5MSAxZSsxMDUgLT4gMUUtMzk2IFN1Ym5vcm1hbAorZGRkaXYxMDY1IGRpdmlkZSAxZS0yOTEgMWUrMTA2IC0+IDFFLTM5NyBTdWJub3JtYWwKK2RkZGl2MTA2NiBkaXZpZGUgMWUtMjkxIDFlKzEwNyAtPiAxRS0zOTggU3Vibm9ybWFsCitkZGRpdjEwNjcgZGl2aWRlIDFlLTI5MSAxZSsxMDggLT4gMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZGl2MTA2OCBkaXZpZGUgMWUtMjkxIDFlKzEwOSAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRkaXYxMDY5IGRpdmlkZSAxZS0yOTEgMWUrMTEwIC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCistLSBbbm8gZXF1aXZhbGVudCBvZiAnc3Vibm9ybWFsJyBmb3Igb3ZlcmZsb3ddCitkZGRpdjEwNzAgZGl2aWRlIDFlKzYwIDFlLTMyMSAtPiAxLjAwMDAwMDAwMDAwMEUrMzgxICBDbGFtcGVkCitkZGRpdjEwNzEgZGl2aWRlIDFlKzYwIDFlLTMyMiAtPiAxLjAwMDAwMDAwMDAwMDBFKzM4MiAgQ2xhbXBlZAorZGRkaXYxMDcyIGRpdmlkZSAxZSs2MCAxZS0zMjMgLT4gMS4wMDAwMDAwMDAwMDAwMEUrMzgzICBDbGFtcGVkCitkZGRpdjEwNzMgZGl2aWRlIDFlKzYwIDFlLTMyNCAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMzg0ICBDbGFtcGVkCitkZGRpdjEwNzQgZGl2aWRlIDFlKzYwIDFlLTMyNSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTA3NSBkaXZpZGUgMWUrNjAgMWUtMzI2IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRkaXYxMDc2IGRpdmlkZSAxZSs2MCAxZS0zMjcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEwNzcgZGl2aWRlIDFlKzYwIDFlLTMyOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTA3OCBkaXZpZGUgMWUrNjAgMWUtMzI5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRkaXYxMDc5IGRpdmlkZSAxZSs2MCAxZS0zMzAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK2RkZGl2MTEwMSBkaXZpZGUgIDEuMDAwMEUtMzk0ICAxICAgICAtPiAxLjAwMDBFLTM5NCBTdWJub3JtYWwKK2RkZGl2MTEwMiBkaXZpZGUgIDEuMDAwRS0zOTQgICAxZSsxICAtPiAxLjAwMEUtMzk1ICBTdWJub3JtYWwKK2RkZGl2MTEwMyBkaXZpZGUgIDEuMDBFLTM5NCAgICAxZSsyICAtPiAxLjAwRS0zOTYgICBTdWJub3JtYWwKK2RkZGl2MTEwNCBkaXZpZGUgIDEuMEUtMzk0ICAgICAxZSszICAtPiAxLjBFLTM5NyAgICBTdWJub3JtYWwKK2RkZGl2MTEwNSBkaXZpZGUgIDEuMEUtMzk0ICAgICAxZSs0ICAtPiAxRS0zOTggICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkZGRpdjExMDYgZGl2aWRlICAxLjNFLTM5NCAgICAgMWUrNCAgLT4gMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMTA3IGRpdmlkZSAgMS41RS0zOTQgICAgIDFlKzQgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTEwOCBkaXZpZGUgIDEuN0UtMzk0ICAgICAxZSs0ICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGRpdjExMDkgZGl2aWRlICAyLjNFLTM5NCAgICAgMWUrNCAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMTEwIGRpdmlkZSAgMi41RS0zOTQgICAgIDFlKzQgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTExMSBkaXZpZGUgIDIuN0UtMzk0ICAgICAxZSs0ICAtPiAzRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGRpdjExMTIgZGl2aWRlICAxLjQ5RS0zOTQgICAgMWUrNCAgLT4gMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMTEzIGRpdmlkZSAgMS41MEUtMzk0ICAgIDFlKzQgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTExNCBkaXZpZGUgIDEuNTFFLTM5NCAgICAxZSs0ICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGRpdjExMTUgZGl2aWRlICAyLjQ5RS0zOTQgICAgMWUrNCAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMTE2IGRpdmlkZSAgMi41MEUtMzk0ICAgIDFlKzQgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTExNyBkaXZpZGUgIDIuNTFFLTM5NCAgICAxZSs0ICAtPiAzRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RkZGl2MTExOCBkaXZpZGUgIDFFLTM5NCAgICAgICAxZSs0ICAtPiAxRS0zOTggICAgIFN1Ym5vcm1hbAorZGRkaXYxMTE5IGRpdmlkZSAgM0UtMzk0ICAgICAgIDFlKzUgIC0+IDBFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRkaXYxMTIwIGRpdmlkZSAgNUUtMzk0ICAgICAgIDFlKzUgIC0+IDBFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRkaXYxMTIxIGRpdmlkZSAgN0UtMzk0ICAgICAgIDFlKzUgIC0+IDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTEyMiBkaXZpZGUgIDlFLTM5NCAgICAgICAxZSs1ICAtPiAxRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGRpdjExMjMgZGl2aWRlICA5LjlFLTM5NCAgICAgMWUrNSAgLT4gMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkZGRpdjExMjQgZGl2aWRlICAxRS0zOTQgICAgICAtMWUrNCAgLT4gLTFFLTM5OCAgICBTdWJub3JtYWwKK2RkZGl2MTEyNSBkaXZpZGUgIDNFLTM5NCAgICAgIC0xZSs1ICAtPiAtMEUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZGl2MTEyNiBkaXZpZGUgLTVFLTM5NCAgICAgICAxZSs1ICAtPiAtMEUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZGl2MTEyNyBkaXZpZGUgIDdFLTM5NCAgICAgIC0xZSs1ICAtPiAtMUUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGRpdjExMjggZGl2aWRlIC05RS0zOTQgICAgICAgMWUrNSAgLT4gLTFFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMTI5IGRpdmlkZSAgOS45RS0zOTQgICAgLTFlKzUgIC0+IC0xRS0zOTggICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTEzMCBkaXZpZGUgIDMuMEUtMzk0ICAgIC0xZSs1ICAtPiAtMEUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworZGRkaXYxMTMxIGRpdmlkZSAgMS4wRS0xOTkgICAgIDFlKzIwMCAtPiAwRS0zOTggICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRkaXYxMTMyIGRpdmlkZSAgMS4wRS0xOTkgICAgIDFlKzE5OSAtPiAxRS0zOTggICAgU3Vibm9ybWFsIFJvdW5kZWQKK2RkZGl2MTEzMyBkaXZpZGUgIDEuMEUtMTk5ICAgICAxZSsxOTggLT4gMS4wRS0zOTcgIFN1Ym5vcm1hbAorZGRkaXYxMTM0IGRpdmlkZSAgMi4wRS0xOTkgICAgIDJlKzE5OCAtPiAxLjBFLTM5NyAgU3Vibm9ybWFsCitkZGRpdjExMzUgZGl2aWRlICA0LjBFLTE5OSAgICAgNGUrMTk4IC0+IDEuMEUtMzk3ICBTdWJub3JtYWwKK2RkZGl2MTEzNiBkaXZpZGUgMTAuMEUtMTk5ICAgIDEwZSsxOTggLT4gMS4wRS0zOTcgIFN1Ym5vcm1hbAorZGRkaXYxMTM3IGRpdmlkZSAzMC4wRS0xOTkgICAgMzBlKzE5OCAtPiAxLjBFLTM5NyAgU3Vibm9ybWFsCisKKy0tIHJhbmRvbXMKK2RkZGl2MjAxMCAgZGl2aWRlICAtMy4zMDMyMjY3MTQ5MDA3MTFFLTM1ICAgOC43OTY1Nzg4NDI3MTMxODNFKzczICAgLT4gIC0zLjc1NTEyNjU5NDA1ODc4M0UtMTA5IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDExICBkaXZpZGUgICA5MzMxNTMzMjc4MjEwNzMuNiAgICAgICA2ODc4MjE4MTA5MDI0Ni4yNSAgICAgICAtPiAgIDEzLjU2Njc4ODg1NDc1NzYzIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDEyICBkaXZpZGUgICA1LjA0NzUyNDM2MDU3OTA2RS03MiAgIC04LjE3OTQ4MTc3MTIzODY0MkUrNjQgICAtPiAgLTYuMTcwOTU4NjI3NjMyODM1RS0xMzcgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMTMgIGRpdmlkZSAgLTM3MDc2MTMzMDk1ODIzMTggICAgICAgIDMzOTQ5MTExOTY1MDMuMDQ4ICAgICAgIC0+ICAtMTA5Mi4xMDkwNzAwMTA4MzYgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMTQgIGRpdmlkZSAgIDk5Njg5LjA1NTUxOTA0NjEgICAgICAgLTQuNzM1MjA4NTUzODkxNDY0ICAgICAgIC0+ICAtMjEwNTIuNzI3NTM3NjU0MTEgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMTUgIGRpdmlkZSAgLTE0NDc5MTU3NzU2MTMzMjkgICAgICAgIDI2OTc1MDc5Ny44MTg0ODc1ICAgICAgIC0+ICAtNTM2NzYwNS4xNjQ5MjU2NTMgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMTYgIGRpdmlkZSAgLTkuMzk0ODgxMzA0MjI1MjU4RS0xOSAgLTgzMDU4NS4wMjUyNjcxNjM2ICAgICAgIC0+ICAgMS4xMzExMTYxNDMyNTEzNThFLTI0IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDE3ICBkaXZpZGUgIC0xLjA1NjI4MzQzMjczODkzNCAgICAgICA4OC41ODc1NDU1NTEyNDAxMyAgICAgICAtPiAgLTAuMDExOTIzNjExMDAxNTkzNTIgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMTggIGRpdmlkZSAgIDU3NjMyMjA5MzMzNDMuMDgxICAgICAgIDY4OTA4OTU2NzAyNTA1Mi4xICAgICAgIC0+ICAgMC4wMDgzNjM1Mjk1MTY1MjQ0NTYgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMTkgIGRpdmlkZSAgIDg3MzgxOS4xMjIxMDMyMTYgICAgICAgIDkuNzQwNjEyNDk0NTIzMzAwRS00OSAgIC0+ICAgOC45NzA4ODQ3NjMwOTM5NDhFKzUzIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDIwICBkaXZpZGUgICA4MDIyOTE0LjgzODUzMzU3NiAgICAgICA2MTc4LjU2NjgwMTc0MjcxMyAgICAgICAtPiAgIDEyOTguNTA3NDIwMjQzNTgzIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDIxICBkaXZpZGUgICAyMDM5ODIuNzYwNTY1MDM2MyAgICAgIC0yMTU4LjI4MzYzOTA1MzQzNSAgICAgICAtPiAgLTk0LjUxMTU2MzIwNDIyMTY4IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDIyICBkaXZpZGUgICA4MDMuNjMxMDU0NzAxMzAzMCAgICAgICA3MTAxMTQzNzk1Mzk5LjIzOCAgICAgICAtPiAgIDEuMTMxNjkyNDExNjExMTY2RS0xMCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAyMyAgZGl2aWRlICAgOS4yNTE2OTc4NDIxMjMzOTlFLTgyICAtMS4zNDIzNTAyMjA2MDYxMTlFLTcgICAgLT4gIC02Ljg5MjE2Mzk4MjMyMTkzNkUtNzUgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMjQgIGRpdmlkZSAgLTEuOTgwNjAwNjQ1NjM3OTkyRS01MyAgLTUuNDc0MjYyNzUzMjE0NDU3RSs3NyAgIC0+ICAgMy42MTgwMjI2MTc3MDMxNjhFLTEzMSBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAyNSAgZGl2aWRlICAtMjEwLjAzMjI5OTYzNTE2OTAgICAgICAtOC41ODA5NTE4MzU4NzI4NDNFKzgwICAgLT4gICAyLjQ0NzY1NzM2NTQzNDk3MUUtNzkgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMjYgIGRpdmlkZSAgLTEuODIxOTgwMzE0MDIwMzcwRSs4NSAgLTMuMDE4OTE1MjY3MTM4MTY1ICAgICAgIC0+ICAgNi4wMzUyMTUxNDQ1MDMwNDJFKzg0IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDI3ICBkaXZpZGUgIC03NzIyNjQ1MDM2MDEuMTA0NyAgICAgICA1LjE1ODI1ODI3MTQwODk4OEUtODYgICAtPiAgLTEuNDk3MTQxOTg2NjMwNjE0RSs5NyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAyOCAgZGl2aWRlICAtNzY3LjA1MzI0MTU4NDcxMDYgICAgICAgMi43MDAwMjcyMjgwMjg5MzlFLTU5ICAgLT4gIC0yLjg0MDkwOTI4Mjc3Mjk0MUUrNjEgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMjkgIGRpdmlkZSAgIDQ5NjcyNC44NTQ4MjUwMDkzICAgICAgIDcuMzI3MDA1ODgxNjMxMDBFKzY2ICAgIC0+ICAgNi43NzkzNzAyMjA5MjkwMTNFLTYyIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDMwICBkaXZpZGUgIC0zMDQyMzI2NTE0NDc3MDMuOSAgICAgIC0xMDguOTczMDgwODY1NzQ0MCAgICAgICAtPiAgIDI3OTE4MTQ3MjE4NjIuNTY1IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDMxICBkaXZpZGUgIC03LjIzMzgxNzE5MjY5OTQwNUUrNDIgIC01NzExMzAyMDA0LjE0OTQxMSAgICAgICAtPiAgIDEuMjY2NTc5MzUyMjExNDMwRSszMyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAzMiAgZGl2aWRlICAtOS45OTkyMjE0NDQ5MTI3NDVFKzk2ICAgNDAxMDU2OTQwNjQ0NjE5NyAgICAgICAgLT4gIC0yLjQ5MzIxNzQwNDIwMjI1MEUrODEgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMzMgIGRpdmlkZSAgLTE4MzcyNzIuMDYxOTM3NjIyICAgICAgIDguMzU2MzIyODM4MDY2NzYyICAgICAgIC0+ICAtMjE5ODY2LjA5MzkxOTY4ODIgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMzQgIGRpdmlkZSAgIDIxNjguNTE3NTU1NjA2NTI5ICAgICAgIDIwOS4xOTEwMjU4NjE1MDYxICAgICAgIC0+ICAgMTAuMzY2MjA3Mzc3NTY3ODQgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMzUgIGRpdmlkZSAgLTEuODg0Mzg5NzkwNTc2MzcxRSs4OCAgIDIuOTUxODE5NTM4NzA1ODNFKzIwICAgIC0+ICAtNi4zODM4MjQ1MDUwNzk4MjhFKzY3IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDM2ICBkaXZpZGUgICA3MzIyNjMuNjAzNzQzODE5NiAgICAgICA5NjEyMjIuMzYzNDQ0Njg4OSAgICAgICAtPiAgIDAuNzYxODA0NTg1MDY5ODI2OSBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAzNyAgZGl2aWRlICAtODEzNDYxNDE5LjAzNDgzMzYgICAgICAgNS4zNzYyOTM3NTM4MDkxNDNFKzg0ICAgLT4gIC0xLjUxMzA1MjQwNDI4NTkyN0UtNzYgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMzggIGRpdmlkZSAgLTQ1NTYyMTMzNTA4MTA4LjUwICAgICAgLTkuNzc2ODQzNDk0NjkwMTA3RSs1MSAgIC0+ICAgNC42NjAyMDg5NDUwMjk1MTlFLTM5IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDM5ICBkaXZpZGUgIC02LjQ4OTM5MzE3MjQ0MTAxNkUrODAgIC05MTAxOTY1LjA5Nzg1MjExMyAgICAgICAtPiAgIDcuMTI5NjYxNjc0ODk3NDIxRSs3MyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjA0MCAgZGl2aWRlICAgMy42OTQ1NzYyMzcxMTczNDlFKzkzICAgNjY4MzUxMi4wMTI2MjIwMDMgICAgICAgLT4gICA1LjUyNzg5NjQ1NjQ0MzkxMkUrODYgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNDEgIGRpdmlkZSAgLTIuMjUyODc3NzI2NDAzMjcyRSsxOSAgLTc0NTE5MTMyNTYuMTgxMzY3ICAgICAgIC0+ICAgMzAyMzIyMDU0Ni4xMjU1MzEgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNDIgIGRpdmlkZSAgIDUxODMwMy4xOTg5MTExODQyICAgICAgIDUwLjAxNTg3MDIwNDc0MTMzICAgICAgIC0+ICAgMTAzNjIuNzc0NzkxMDcxMjMgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNDMgIGRpdmlkZSAgIDIuOTAyMDg3ODgxODgwMTAzRSsyNCAgIDMzLjMyNDAwOTkyMzA1NzAyICAgICAgIC0+ICAgOC43MDg2OTk0ODg5ODk1NzhFKzIyIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDQ0ICBkaXZpZGUgICA1NDk2MTkuNDU1OTUxMDU1NyAgICAgICAxNjYwODI0ODQ1MTk2MzM4ICAgICAgICAtPiAgIDMuMzA5MzE2MTk2MzUxMTA0RS0xMCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjA0NSAgZGl2aWRlICAtNjc3NTY3MDc3NDY4NDA0MyAgICAgICAgODI5MjE1MjAyMy4wNzcyNjIgICAgICAgLT4gIC04MTcxMTguNDk0MTg5MTA2MiBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjA0NiAgZGl2aWRlICAtNzcuNTA5MjM5MjE1MjQwNzkgICAgICAtNS42MzY4ODI2NTU0MjU4MTVFKzc0ICAgLT4gICAxLjM3NTAzNzMwMjU4ODQwNUUtNzMgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNDcgIGRpdmlkZSAgLTIuOTg0ODg5NDU5NjA1MTQ5RS0xMCAgLTg4MTA2MTU2Nzg0MTIyLjk5ICAgICAgIC0+ICAgMy4zODc4MzMwMDU3MjEzODRFLTI0IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDQ4ICBkaXZpZGUgICAwLjk0OTUxNzI5Mzk5NzA4NSAgICAgICA0NDc2NzExNS45NjQ1MDk5OCAgICAgICAtPiAgIDIuMTIxMDE1MTEwMTc1NTg5RS04IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDQ5ICBkaXZpZGUgIC0yNzYwOTM3MjExLjA4NDUyMSAgICAgIC0xMDg3MDE1ODc2OTc1NDA4ICAgICAgICAtPiAgIDAuMDAwMDAyNTM5OTIzNTM3MDU3MDI0IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDUwICBkaXZpZGUgICAyODQzODM1MS44NTAzMDUzNiAgICAgIC00LjIwOTM5NzkwNDA4ODYyNEUtNDcgICAtPiAgLTYuNzU1OTE5MTM1NzcwNjg4RSs1MyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjA1MSAgZGl2aWRlICAtODU1NjI3MzEuNjgyMDk1NiAgICAgICAtNy4xNjYwNDU0NDI1MzAxODVFKzQ1ICAgLT4gICAxLjE5NDAwMjA4MDYyMTU0MkUtMzggSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNTIgIGRpdmlkZSAgIDI1MzM4MDI4NTIxNjUuMjUgICAgICAgIDcxNTQuMTE5NjA2MjM1OTU1ICAgICAgIC0+ICAgMzU0MTczOTU3LjMzMTc1MDEgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNTMgIGRpdmlkZSAgLTg4NTg4MzEzNDY4NTEuNDc0ICAgICAgIDk3LjU5NzM0MjA4ODAxNzE2ICAgICAgIC0+ICAtOTA3NjkxODY1MDkuODM1NzcgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNTQgIGRpdmlkZSAgIDE3Njc4MzYyOTgwMTM4Ny41ICAgICAgIDg0MDA3MzI2My4zMTA5ODE3ICAgICAgIC0+ICAgMjEwNDM4LjM0ODA4NDgyMDYgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNTUgIGRpdmlkZSAgLTQ5MzUwNjQ3MTc5NjE3NS42ICAgICAgIDc5NzMzODk0NzkwODIyLjAzICAgICAgIC0+ICAtNi4xODk0MTg4NTQ5NDA3NDYgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNTYgIGRpdmlkZSAgIDc5MC4xNjgyNTQyMTAzNDQ1ICAgICAgIDgyOS45NDQ5MzcwMzY3NDM1ICAgICAgIC0+ICAgMC45NTIwNzMxMDYyMzcxMjE0IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDU3ICBkaXZpZGUgIC04OTIwNDU5ODM4LjU4MzE2NCAgICAgIC00NzY3Ljg4OTE4Nzg5OTIxNCAgICAgICAtPiAgIDE4NzA5NDUuMjk0MDM1NTgxIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDU4ICBkaXZpZGUgICA1MzUzNjY4NzE2NDQyMi4xICAgICAgICA1MzEzNy41MDA3MDMyNjg5ICAgICAgICAtPiAgIDEwMDc1MTIzMzAuMzg1Njk4IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDU5ICBkaXZpZGUgICA0LjA1MTUzMjMxMTE0NjU2MUUtNzQgIC0yLjM0MzA4OTc2ODk3MjI2MUUrOTQgICAtPiAgLTEuNzI5MTQwODgyNjA2MzMyRS0xNjggSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNjAgIGRpdmlkZSAgLTE0ODQ3NzU4Nzc4NjM2Ljg4ICAgICAgIDMuMDYyNTQzNTE2MzgzODA3RS00MyAgIC0+ICAtNC44NDgxNzg4NzQ1ODc0OTdFKzU1IEluZXhhY3QgUm91bmRlZAorCistLSBEaXZpc2lvbiBwcm9iYWJseSBoYXMgcHJlLXJvdW5kaW5nLCBzbyBuZWVkIHRvIHRlc3Qgcm91bmRpbmcKKy0tIGV4cGxpY2l0bHkgcmF0aGVyIHRoYW4gYXNzdW1lIGluY2x1ZGVkIHRocm91Z2ggb3RoZXIgdGVzdHM7CistLSB0ZXN0cyBpbmNsdWRlIHNpbXBsZSByb3VuZGluZyBhbmQgYWxzbyB0aGUgdHJpY2t5IGNhc2VzIG9mIHN0aWNreQorLS0gYml0cyBmb2xsb3dpbmcgdHdvIHplcm9zCistLQorLS0gICAxLzk5OTk5IGdpdmVzIDAuMDAwMDEwMDAwMTAwMDAxMDAwMDEwMDAwMTAwMDAxMDAwMDEwMDAwMQorLS0gICAgICAgICAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKKy0tCistLSAgIDEvOTk5OTk5IGdpdmVzIDAuMDAwMDAxMDAwMDAxMDAwMDAxMDAwMDAxMDAwMDAxMDAwMDAxMDAwMDAxCistLSAgICAgICAgICAgICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CisKK3JvdW5kaW5nOiBjZWlsaW5nCitkZGRpdjMwMDEgIGRpdmlkZSAgMSAgICAgMyAgICAtPiAgMC4zMzMzMzMzMzMzMzMzMzM0IEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDAyICBkaXZpZGUgIDIgICAgIDMgICAgLT4gIDAuNjY2NjY2NjY2NjY2NjY2NyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzAwMyAgZGl2aWRlICAxIDk5OTk5ICAgIC0+ICAwLjAwMDAxMDAwMDEwMDAwMTAwMDAyICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzAwNCAgZGl2aWRlICAxIDk5OTk5OSAgIC0+ICAwLjAwMDAwMTAwMDAwMTAwMDAwMTAwMSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGZsb29yCitkZGRpdjMwMTEgIGRpdmlkZSAgMSAgICAgMyAgICAtPiAgMC4zMzMzMzMzMzMzMzMzMzMzIEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDEyICBkaXZpZGUgIDIgICAgIDMgICAgLT4gIDAuNjY2NjY2NjY2NjY2NjY2NiBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzAxMyAgZGl2aWRlICAxIDk5OTk5ICAgIC0+ICAwLjAwMDAxMDAwMDEwMDAwMTAwMDAxICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzAxNCAgZGl2aWRlICAxIDk5OTk5OSAgIC0+ICAwLjAwMDAwMTAwMDAwMTAwMDAwMTAwMCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IHVwCitkZGRpdjMwMjEgIGRpdmlkZSAgMSAgICAgMyAgICAtPiAgMC4zMzMzMzMzMzMzMzMzMzM0IEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDIyICBkaXZpZGUgIDIgICAgIDMgICAgLT4gIDAuNjY2NjY2NjY2NjY2NjY2NyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzAyMyAgZGl2aWRlICAxIDk5OTk5ICAgIC0+ICAwLjAwMDAxMDAwMDEwMDAwMTAwMDAyICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzAyNCAgZGl2aWRlICAxIDk5OTk5OSAgIC0+ICAwLjAwMDAwMTAwMDAwMTAwMDAwMTAwMSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGRvd24KK2RkZGl2MzAzMSAgZGl2aWRlICAxICAgICAzICAgIC0+ICAwLjMzMzMzMzMzMzMzMzMzMzMgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwMzIgIGRpdmlkZSAgMiAgICAgMyAgICAtPiAgMC42NjY2NjY2NjY2NjY2NjY2IEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDMzICBkaXZpZGUgIDEgOTk5OTkgICAgLT4gIDAuMDAwMDEwMDAwMTAwMDAxMDAwMDEgIEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDM0ICBkaXZpZGUgIDEgOTk5OTk5ICAgLT4gIDAuMDAwMDAxMDAwMDAxMDAwMDAxMDAwIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorZGRkaXYzMDQxICBkaXZpZGUgIDEgICAgIDMgICAgLT4gIDAuMzMzMzMzMzMzMzMzMzMzMyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzA0MiAgZGl2aWRlICAyICAgICAzICAgIC0+ICAwLjY2NjY2NjY2NjY2NjY2NjcgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwNDMgIGRpdmlkZSAgMSA5OTk5OSAgICAtPiAgMC4wMDAwMTAwMDAxMDAwMDEwMDAwMSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwNDQgIGRpdmlkZSAgMSA5OTk5OTkgICAtPiAgMC4wMDAwMDEwMDAwMDEwMDAwMDEwMDAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK2RkZGl2MzA1MSAgZGl2aWRlICAxICAgICAzICAgIC0+ICAwLjMzMzMzMzMzMzMzMzMzMzMgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwNTIgIGRpdmlkZSAgMiAgICAgMyAgICAtPiAgMC42NjY2NjY2NjY2NjY2NjY3IEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDUzICBkaXZpZGUgIDEgOTk5OTkgICAgLT4gIDAuMDAwMDEwMDAwMTAwMDAxMDAwMDEgIEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDU0ICBkaXZpZGUgIDEgOTk5OTk5ICAgLT4gIDAuMDAwMDAxMDAwMDAxMDAwMDAxMDAwIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCitkZGRpdjMwNjEgIGRpdmlkZSAgMSAgICAgMyAgICAtPiAgMC4zMzMzMzMzMzMzMzMzMzMzIEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDYyICBkaXZpZGUgIDIgICAgIDMgICAgLT4gIDAuNjY2NjY2NjY2NjY2NjY2NyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzA2MyAgZGl2aWRlICAxIDk5OTk5ICAgIC0+ICAwLjAwMDAxMDAwMDEwMDAwMTAwMDAxICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzA2NCAgZGl2aWRlICAxIDk5OTk5OSAgIC0+ICAwLjAwMDAwMTAwMDAwMTAwMDAwMTAwMCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IDA1dXAKK2RkZGl2MzA3MSAgZGl2aWRlICAxICAgICAzICAgIC0+ICAwLjMzMzMzMzMzMzMzMzMzMzMgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwNzIgIGRpdmlkZSAgMiAgICAgMyAgICAtPiAgMC42NjY2NjY2NjY2NjY2NjY2IEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDczICBkaXZpZGUgIDEgOTk5OTkgICAgLT4gIDAuMDAwMDEwMDAwMTAwMDAxMDAwMDEgIEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDc0ICBkaXZpZGUgIDEgOTk5OTk5ICAgLT4gIDAuMDAwMDAxMDAwMDAxMDAwMDAxMDAxIEluZXhhY3QgUm91bmRlZAorCistLSByYW5kb20gZGl2aWRlIHRlc3RzIHdpdGggcmVzdWx0IG5lYXIgMQorcm91bmRpbmc6IGhhbGZfZXZlbgorZGRkaXY0MDAxIGRpdmlkZSAgMzE5NTM4NTE5MjkxNjkxNyAgIDMxOTUzODUxOTI5NDY2OTUgIC0+ICAwLjk5OTk5OTk5OTk5MDY4MDkgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDAyIGRpdmlkZSAgMTM5MzcyMzA2NzUyNjk5MyAgIDEzOTM3MjMwNjc1MTk0NzUgIC0+ICAxLjAwMDAwMDAwMDAwNTM5NCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMDMgZGl2aWRlICAgNzU5OTg1NTQzNzAyMzAyICAgIDc1OTk4NTU0MzY3NDAxNSAgLT4gIDEuMDAwMDAwMDAwMDM3MjIwICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAwNCBkaXZpZGUgIDk1NzkxNTg0NTYwMjczMDIgICA5NTc5MTU4NDU2MDM2ODY0ICAtPiAgMC45OTk5OTk5OTk5OTkwMDE4ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAwNSBkaXZpZGUgIDcwNzkzOTgyOTkxNDM1NjkgICA3MDc5Mzk4Mjk5MTU2OTA0ICAtPiAgMC45OTk5OTk5OTk5OTgxMTY0ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAwNiBkaXZpZGUgIDY2MzYxNjkyNTUzNjY1OTggICA2NjM2MTY5MjU1MzM2Mzg2ICAtPiAgMS4wMDAwMDAwMDAwMDQ1NTMgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDA3IGRpdmlkZSAgNjk2NDgxMzk3MTM0MDA5MCAgIDY5NjQ4MTM5NzEzMjE1NTQgIC0+ICAxLjAwMDAwMDAwMDAwMjY2MSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMDggZGl2aWRlICA0MTgyMjc1MjI1NDgwNzg0ICAgNDE4MjI3NTIyNTQ1NDAwOSAgLT4gIDEuMDAwMDAwMDAwMDA2NDAyICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAwOSBkaXZpZGUgIDkyMjgzMjUxMjQ5MzgwMjkgICA5MjI4MzI1MTI0OTE4NzMwICAtPiAgMS4wMDAwMDAwMDAwMDIwOTEgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDEwIGRpdmlkZSAgMzQyODM0NjMzODYzMDE5MiAgIDM0MjgzNDYzMzg2MDk4NDMgIC0+ICAxLjAwMDAwMDAwMDAwNTkzNiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMTEgZGl2aWRlICAyMTQzNTExNTUwNzIyODkzICAgMjE0MzUxMTU1MDc1MTc1NCAgLT4gIDAuOTk5OTk5OTk5OTg2NTM1NiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMTIgZGl2aWRlICAxNjcyNzMyOTI0Mzk2Nzg1ICAgMTY3MjczMjkyNDQwMTgxMSAgLT4gIDAuOTk5OTk5OTk5OTk2OTk1MyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMTMgZGl2aWRlICA0MTkwNzE0NjExOTQ4MjE2ICAgNDE5MDcxNDYxMTk0ODY2NCAgLT4gIDAuOTk5OTk5OTk5OTk5ODkzMSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMTQgZGl2aWRlICAzOTQyMjU0ODAwODQ4ODc3ICAgMzk0MjI1NDgwMDgxNDU1NiAgLT4gIDEuMDAwMDAwMDAwMDA4NzA2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAxNSBkaXZpZGUgIDI4NTQ0NTk4MjY5NTIzMzQgICAyODU0NDU5ODI2OTYwNzYyICAtPiAgMC45OTk5OTk5OTk5OTcwNDc0ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAxNiBkaXZpZGUgIDI4NTMyNTg5NTM2NjQ3MzEgICAyODUzMjU4OTUzNjg0NDcxICAtPiAgMC45OTk5OTk5OTk5OTMwODE2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAxNyBkaXZpZGUgIDk0NTM1MTI2MzgxMjU5NzggICA5NDUzNTEyNjM4MTQ2NDI1ICAtPiAgMC45OTk5OTk5OTk5OTc4MzcxICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAxOCBkaXZpZGUgICAzMzk0NzY2MzM5NDAzNjkgICAgMzM5NDc2NjMzOTEyODg3ICAtPiAgMS4wMDAwMDAwMDAwODA5NTQgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDE5IGRpdmlkZSAgNDU0MjE4MTQ5MjY4ODQ2NyAgIDQ1NDIxODE0OTI2OTc3MzUgIC0+ICAwLjk5OTk5OTk5OTk5Nzk1OTYgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDIwIGRpdmlkZSAgNzMxMjYwMDE5MjM5OTE5NyAgIDczMTI2MDAxOTIzOTU0MjQgIC0+ICAxLjAwMDAwMDAwMDAwMDUxNiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMjEgZGl2aWRlICAxODExNjc0OTg1NTcwMTExICAgMTgxMTY3NDk4NTYwMzkzNSAgLT4gIDAuOTk5OTk5OTk5OTgxMzMwMCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMjIgZGl2aWRlICAxNzA2NDYyNjM5MDAzNDgxICAgMTcwNjQ2MjYzOTAxNzc0MCAgLT4gIDAuOTk5OTk5OTk5OTkxNjQ0MSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMjMgZGl2aWRlICA2Njk3MDUyNjU0OTQwMzY4ICAgNjY5NzA1MjY1NDkzNDExMCAgLT4gIDEuMDAwMDAwMDAwMDAwOTM0ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAyNCBkaXZpZGUgIDUwMTUyODM2NjQyNzc1MzkgICA1MDE1MjgzNjY0MzEwNzE5ICAtPiAgMC45OTk5OTk5OTk5OTMzODQyICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAyNSBkaXZpZGUgIDIzNTk1MDE1NjE1Mzc0NjQgICAyMzU5NTAxNTYxNTAyNDY0ICAtPiAgMS4wMDAwMDAwMDAwMTQ4MzQgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDI2IGRpdmlkZSAgMjY2OTg1MDIyNzkwOTE1NyAgIDI2Njk4NTAyMjc5MDE1NDggIC0+ICAxLjAwMDAwMDAwMDAwMjg1MCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMjcgZGl2aWRlICA5MzI5NzI1NTQ2OTc0NjQ4ICAgOTMyOTcyNTU0NzAwMjQ0NSAgLT4gIDAuOTk5OTk5OTk5OTk3MDIwNiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMjggZGl2aWRlICAzMjI4NTYyODY3MDcxMjQ4ICAgMzIyODU2Mjg2NzEwNjIwNiAgLT4gIDAuOTk5OTk5OTk5OTg5MTcyMyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMjkgZGl2aWRlICA0ODYyMjI2NjQ0OTIxMTc1ICAgNDg2MjIyNjY0NDkwOTM4MCAgLT4gIDEuMDAwMDAwMDAwMDAyNDI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAzMCBkaXZpZGUgIDEwMjIyNjc5OTcwNTQ1MjkgICAxMDIyMjY3OTk3MDcxMzI5ICAtPiAgMC45OTk5OTk5OTk5ODM1NjYwICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAzMSBkaXZpZGUgIDEwNDg3Nzc0ODIwMjM3MTkgICAxMDQ4Nzc3NDgyMDAwOTQ4ICAtPiAgMS4wMDAwMDAwMDAwMjE3MTIgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDMyIGRpdmlkZSAgOTk4MDExMzc3NzMzNzA5OCAgIDk5ODAxMTM3NzczMzA1MzkgIC0+ICAxLjAwMDAwMDAwMDAwMDY1NyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMzMgZGl2aWRlICA3NTA2ODM5MTY3OTYzOTA4ICAgNzUwNjgzOTE2Nzk0MjkwMSAgLT4gIDEuMDAwMDAwMDAwMDAyNzk4ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAzNCBkaXZpZGUgICAyMzExMTk3NTE5Nzc4NjAgICAgMjMxMTE5NzUxOTYyNDUzICAtPiAgMS4wMDAwMDAwMDAwNjY2NjIgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDM1IGRpdmlkZSAgNDAzNDkwMzY2NDc2Mjk2MiAgIDQwMzQ5MDM2NjQ3OTU1MjYgIC0+ICAwLjk5OTk5OTk5OTk5MTkyOTQgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDM2IGRpdmlkZSAgNTcwMDEyMjE1MjI3NDY5NiAgIDU3MDAxMjIxNTIyNTEzODYgIC0+ICAxLjAwMDAwMDAwMDAwNDA4OSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMzcgZGl2aWRlICA2ODY5NTk5NTkwMjkzMTEwICAgNjg2OTU5OTU5MDI5MzQ5NSAgLT4gIDAuOTk5OTk5OTk5OTk5OTQ0MCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMzggZGl2aWRlICA1NTc2MjgxOTYwMDkyNzk3ICAgNTU3NjI4MTk2MDEwNTU3OSAgLT4gIDAuOTk5OTk5OTk5OTk3NzA3OCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMzkgZGl2aWRlICAyMzA0ODQ0ODg4MzgxMzE4ICAgMjMwNDg0NDg4ODM1MzA3MyAgLT4gIDEuMDAwMDAwMDAwMDEyMjU1ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA0MCBkaXZpZGUgIDMyNjU5MzM2NTE2NTY0NTIgICAzMjY1OTMzNjUxNjgyNzc5ICAtPiAgMC45OTk5OTk5OTk5OTE5Mzg5ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA0MSBkaXZpZGUgIDUyMzU3MTQ5ODUwNzk5MTQgICA1MjM1NzE0OTg1MDY2MTMxICAtPiAgMS4wMDAwMDAwMDAwMDI2MzIgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDQyIGRpdmlkZSAgNTU3ODQ4MTU3MjgyNzU1MSAgIDU1Nzg0ODE1NzI4MjI5NDUgIC0+ICAxLjAwMDAwMDAwMDAwMDgyNiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNDMgZGl2aWRlICA0OTA5NjE2MDgxMzk2MTM0ICAgNDkwOTYxNjA4MTM3MzA3NiAgLT4gIDEuMDAwMDAwMDAwMDA0Njk2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA0NCBkaXZpZGUgICA2MzY0NDcyMjQzNDk1MzcgICAgNjM2NDQ3MjI0MzM4NzU3ICAtPiAgMS4wMDAwMDAwMDAwMTY5MzggIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDQ1IGRpdmlkZSAgMTUzOTM3MzQyODM5NjY0MCAgIDE1MzkzNzM0MjgzNjQ3MjcgIC0+ICAxLjAwMDAwMDAwMDAyMDczMSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNDYgZGl2aWRlICAyMDI4Nzg2NzA3Mzc3ODkzICAgMjAyODc4NjcwNzM3ODg2NiAgLT4gIDAuOTk5OTk5OTk5OTk5NTIwNCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNDcgZGl2aWRlICAgMTM3NjQzMjYwNDg2MjIyICAgIDEzNzY0MzI2MDQ4NzQxOSAgLT4gIDAuOTk5OTk5OTk5OTkxMzAzNiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNDggZGl2aWRlICAgMjQ3NDUxNTE5NzQ2NzY1ICAgIDI0NzQ1MTUxOTc1MjI2NyAgLT4gIDAuOTk5OTk5OTk5OTc3NzY1MyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNDkgZGl2aWRlICA3ODc3ODU4NDc1MDIyMDU0ICAgNzg3Nzg1ODQ3NDk5OTc5NCAgLT4gIDEuMDAwMDAwMDAwMDAyODI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA1MCBkaXZpZGUgIDczMzMyNDI2OTQ3NjYyNTggICA3MzMzMjQyNjk0NzQ0NjI4ICAtPiAgMS4wMDAwMDAwMDAwMDI5NTAgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDUxIGRpdmlkZSAgIDEyNDA1MTUwMzY5ODU5MiAgICAxMjQwNTE1MDM2OTkzOTcgIC0+ICAwLjk5OTk5OTk5OTk5MzUxMDggIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDUyIGRpdmlkZSAgODk0NDczNzQzMjM4NTE4OCAgIDg5NDQ3Mzc0MzI0MDY4NjAgIC0+ICAwLjk5OTk5OTk5OTk5NzU3NzEgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDUzIGRpdmlkZSAgOTg4Mzk0ODkyMzQwNjg3NCAgIDk4ODM5NDg5MjM0MjQ4NDMgIC0+ICAwLjk5OTk5OTk5OTk5ODE4MjAgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDU0IGRpdmlkZSAgNjgyOTE3ODc0MTY1NDI4NCAgIDY4MjkxNzg3NDE2NzE5NzMgIC0+ICAwLjk5OTk5OTk5OTk5NzQwOTggIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDU1IGRpdmlkZSAgNzM0Mjc1MjQ3OTc2ODEyMiAgIDczNDI3NTI0Nzk3OTMzODUgIC0+ICAwLjk5OTk5OTk5OTk5NjU1OTUgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDU2IGRpdmlkZSAgODA2NjQyNjU3OTAwODc4MyAgIDgwNjY0MjY1Nzg5Nzc1NjMgIC0+ICAxLjAwMDAwMDAwMDAwMzg3MCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNTcgZGl2aWRlICA4OTkyNzc1MDcxMzgzMjk1ICAgODk5Mjc3NTA3MTM1MjcxMiAgLT4gIDEuMDAwMDAwMDAwMDAzNDAxICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA1OCBkaXZpZGUgIDU0ODUwMTE3NTU1NDU2NDEgICA1NDg1MDExNzU1NTQzNjExICAtPiAgMS4wMDAwMDAwMDAwMDAzNzAgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDU5IGRpdmlkZSAgNTc3OTk4MzA1NDM1MzkxOCAgIDU3Nzk5ODMwNTQzNjUzMDAgIC0+ICAwLjk5OTk5OTk5OTk5ODAzMDggIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDYwIGRpdmlkZSAgOTUwMjI2NTEwMjcxMzc3NCAgIDk1MDIyNjUxMDI3MzUyMDggIC0+ICAwLjk5OTk5OTk5OTk5Nzc0NDMgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDYxIGRpdmlkZSAgMjEwOTU1ODM5OTEzMDk4MSAgIDIxMDk1NTgzOTkxMTYyODEgIC0+ICAxLjAwMDAwMDAwMDAwNjk2OCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNjIgZGl2aWRlICA1Mjk2MTgyNjM2MzUwNDcxICAgNTI5NjE4MjYzNjM1MTUyMSAgLT4gIDAuOTk5OTk5OTk5OTk5ODAxNyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNjMgZGl2aWRlICAxNDQwMDE5MjI1NTkxODgzICAgMTQ0MDAxOTIyNTYwMTg0NCAgLT4gIDAuOTk5OTk5OTk5OTkzMDgyNyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNjQgZGl2aWRlICA4MTgyMTEwNzkxODgxMzQxICAgODE4MjExMDc5MTg0NzE3NCAgLT4gIDEuMDAwMDAwMDAwMDA0MTc2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA2NSBkaXZpZGUgICA0ODkwOTgyMzU1MTIwNjAgICAgNDg5MDk4MjM1NTM0NTE2ICAtPiAgMC45OTk5OTk5OTk5NTQwODY5ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA2NiBkaXZpZGUgIDY0NzU2ODcwODQ3ODIwMzggICA2NDc1Njg3MDg0NzU2MDg5ICAtPiAgMS4wMDAwMDAwMDAwMDQwMDcgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDY3IGRpdmlkZSAgODA5NDM0ODU1NTczNjk0OCAgIDgwOTQzNDg1NTU3NTkyMzYgIC0+ICAwLjk5OTk5OTk5OTk5NzI0NjUgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDY4IGRpdmlkZSAgMTk4Mjc2NjgxNjI5MTU0MyAgIDE5ODI3NjY4MTYzMDk0NjMgIC0+ICAwLjk5OTk5OTk5OTk5MDk2MjEgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDY5IGRpdmlkZSAgOTI3NzMxNDMwMDExMzI1MSAgIDkyNzczMTQzMDAwODQ0NjcgIC0+ICAxLjAwMDAwMDAwMDAwMzEwMyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNzAgZGl2aWRlICA0MzM1NTMyOTU5MzE4OTM0ICAgNDMzNTUzMjk1OTI5MzE2NyAgLT4gIDEuMDAwMDAwMDAwMDA1OTQzICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA3MSBkaXZpZGUgIDc3NjcxMTMwMzI5ODEzNDggICA3NzY3MTEzMDMyOTY4MTMyICAtPiAgMS4wMDAwMDAwMDAwMDE3MDIgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDcyIGRpdmlkZSAgMTU3ODU0ODA1MzM0Mjg2OCAgIDE1Nzg1NDgwNTMzNzA0NDggIC0+ICAwLjk5OTk5OTk5OTk4MjUyODIgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDczIGRpdmlkZSAgMzc5MDQyMDY4NjY2Njg5OCAgIDM3OTA0MjA2ODY2MzYzMTUgIC0+ICAxLjAwMDAwMDAwMDAwODA2OCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNzQgZGl2aWRlICAgODcxNjgyNDIxOTU1MTQ3ICAgIDg3MTY4MjQyMTk3NjQ0MSAgLT4gIDAuOTk5OTk5OTk5OTc1NTcxNCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNzUgZGl2aWRlICAgNzQ0MTQxMDU0NDc5OTQwICAgIDc0NDE0MTA1NDUxMjMyOSAgLT4gIDAuOTk5OTk5OTk5OTU2NDc0NiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNzYgZGl2aWRlICA4OTU2ODI0MTgzNjcwNzM1ICAgODk1NjgyNDE4MzY0MTc0MSAgLT4gIDEuMDAwMDAwMDAwMDAzMjM3ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA3NyBkaXZpZGUgIDgzMzcyOTE2OTQ0ODU2ODIgICA4MzM3MjkxNjk0NDUxMTkzICAtPiAgMS4wMDAwMDAwMDAwMDQxMzcgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDc4IGRpdmlkZSAgNDEwNzc3NTk0NDY4MzY2OSAgIDQxMDc3NzU5NDQ2NTcwOTcgIC0+ICAxLjAwMDAwMDAwMDAwNjQ2OSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNzkgZGl2aWRlICA4NjkxOTAwMDU3OTY0NjQ4ICAgODY5MTkwMDA1Nzk5NzU1NSAgLT4gIDAuOTk5OTk5OTk5OTk2MjE0MSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwODAgZGl2aWRlICAyMjI5NTI4NTIwNTM2NDYyICAgMjIyOTUyODUyMDUwMjMzNyAgLT4gIDEuMDAwMDAwMDAwMDE1MzA2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA4MSBkaXZpZGUgICAzOTg0NDIwODM3NzQzMjIgICAgMzk4NDQyMDgzNzQ2MjczICAtPiAgMS4wMDAwMDAwMDAwNzAzOTcgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDgyIGRpdmlkZSAgNTMxOTgxOTc3NjgwODc1OSAgIDUzMTk4MTk3NzY4MzgzMTMgIC0+ICAwLjk5OTk5OTk5OTk5NDQ0NDUgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDgzIGRpdmlkZSAgNzcxMDQ5MTI5OTA2Njg1NSAgIDc3MTA0OTEyOTkwNDE4NTggIC0+ICAxLjAwMDAwMDAwMDAwMzI0MiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwODQgZGl2aWRlICA5MDgzMjMxMjk2MDg3MjY2ICAgOTA4MzIzMTI5NjA1ODE2MCAgLT4gIDEuMDAwMDAwMDAwMDAzMjA0ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA4NSBkaXZpZGUgIDM1NjY4NzM1NzQ5MDQ1NTkgICAzNTY2ODczNTc0ODkwMzI4ICAtPiAgMS4wMDAwMDAwMDAwMDM5OTAgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDg2IGRpdmlkZSAgIDU5NjM0MzI5MDU1MDUyNSAgICA1OTYzNDMyOTA1NTU2MTQgIC0+ICAwLjk5OTk5OTk5OTk5MTQ2NjMgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDg3IGRpdmlkZSAgIDI3ODIyNzkyNTA5MzE5MiAgICAyNzgyMjc5MjUwNjgxMDQgIC0+ICAxLjAwMDAwMDAwMDA5MDE3MSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwODggZGl2aWRlICAzMjkyOTAyOTU4NDkwNjQ5ICAgMzI5MjkwMjk1ODUxOTg4MSAgLT4gIDAuOTk5OTk5OTk5OTkxMTIyNyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwODkgZGl2aWRlICA1NTIxODcxMzY0MjQ1ODgxICAgNTUyMTg3MTM2NDIyOTUzNiAgLT4gIDEuMDAwMDAwMDAwMDAyOTYwICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA5MCBkaXZpZGUgIDI0MDY1MDU2MDI4ODM2MTcgICAyNDA2NTA1NjAyODU3OTk3ICAtPiAgMS4wMDAwMDAwMDAwMTA2NDYgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDkxIGRpdmlkZSAgNzc0MTE0Njk4NDg2OTIwOCAgIDc3NDExNDY5ODQ4NjcyNTUgIC0+ICAxLjAwMDAwMDAwMDAwMDI1MiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwOTIgZGl2aWRlICA0NTc2MDQxODMyNDE0OTA5ICAgNDU3NjA0MTgzMjQwNTEwMiAgLT4gIDEuMDAwMDAwMDAwMDAyMTQzICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA5MyBkaXZpZGUgIDkxODM3NTY5ODI4NzgwNTcgICA5MTgzNzU2OTgyOTAxOTM0ICAtPiAgMC45OTk5OTk5OTk5OTc0MDAxICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA5NCBkaXZpZGUgIDYyMTU3MzY1MTM4NTUxNTkgICA2MjE1NzM2NTEzODcwMzQyICAtPiAgMC45OTk5OTk5OTk5OTc1NTczICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA5NSBkaXZpZGUgICAyNDg1NTQ5Njg1MzQ1MzMgICAgMjQ4NTU0OTY4NTUxNDE3ICAtPiAgMC45OTk5OTk5OTk5MzIwNzE0ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA5NiBkaXZpZGUgICAzNzYzMTQxNjU2Njg2NDUgICAgMzc2MzE0MTY1NjU5NzU1ICAtPiAgMS4wMDAwMDAwMDAwMjM2MjQgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDk3IGRpdmlkZSAgNTUxMzU2OTI0OTgwOTcxOCAgIDU1MTM1NjkyNDk4MDg5MDYgIC0+ICAxLjAwMDAwMDAwMDAwMDE0NyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwOTggZGl2aWRlICAzMzY3OTkyMjQyMTY3OTA0ICAgMzM2Nzk5MjI0MjE1NjIyOCAgLT4gIDEuMDAwMDAwMDAwMDAzNDY3ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA5OSBkaXZpZGUgIDYxMzQ4Njk1Mzg5NjY5NjcgICA2MTM0ODY5NTM4OTg1OTg2ICAtPiAgMC45OTk5OTk5OTk5OTY4OTk5ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gTnVsbCB0ZXN0cworZGRkaXY5OTk4IGRpdmlkZSAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2OTk5OSBkaXZpZGUgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGREaXZpZGVJbnQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGREaXZpZGVJbnQuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWM1Njc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZERpdmlkZUludC5kZWNUZXN0CkBAIC0wLDAgKzEsNDQ5IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkRGl2aWRlSW50LmRlY1Rlc3QgLS0gZGVjRG91YmxlIGludGVnZXIgZGl2aXNpb24gICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2RkZHZpMDAxIGRpdmlkZWludCAgMSAgICAgMSAgICAtPiAgMQorZGRkdmkwMDIgZGl2aWRlaW50ICAyICAgICAxICAgIC0+ICAyCitkZGR2aTAwMyBkaXZpZGVpbnQgIDEgICAgIDIgICAgLT4gIDAKK2RkZHZpMDA0IGRpdmlkZWludCAgMiAgICAgMiAgICAtPiAgMQorZGRkdmkwMDUgZGl2aWRlaW50ICAwICAgICAxICAgIC0+ICAwCitkZGR2aTAwNiBkaXZpZGVpbnQgIDAgICAgIDIgICAgLT4gIDAKK2RkZHZpMDA3IGRpdmlkZWludCAgMSAgICAgMyAgICAtPiAgMAorZGRkdmkwMDggZGl2aWRlaW50ICAyICAgICAzICAgIC0+ICAwCitkZGR2aTAwOSBkaXZpZGVpbnQgIDMgICAgIDMgICAgLT4gIDEKKworZGRkdmkwMTAgZGl2aWRlaW50ICAyLjQgICAxICAgIC0+ICAyCitkZGR2aTAxMSBkaXZpZGVpbnQgIDIuNCAgIC0xICAgLT4gIC0yCitkZGR2aTAxMiBkaXZpZGVpbnQgIC0yLjQgIDEgICAgLT4gIC0yCitkZGR2aTAxMyBkaXZpZGVpbnQgIC0yLjQgIC0xICAgLT4gIDIKK2RkZHZpMDE0IGRpdmlkZWludCAgMi40MCAgMSAgICAtPiAgMgorZGRkdmkwMTUgZGl2aWRlaW50ICAyLjQwMCAxICAgIC0+ICAyCitkZGR2aTAxNiBkaXZpZGVpbnQgIDIuNCAgIDIgICAgLT4gIDEKK2RkZHZpMDE3IGRpdmlkZWludCAgMi40MDAgMiAgICAtPiAgMQorZGRkdmkwMTggZGl2aWRlaW50ICAyLiAgICAyICAgIC0+ICAxCitkZGR2aTAxOSBkaXZpZGVpbnQgIDIwICAgIDIwICAgLT4gIDEKKworZGRkdmkwMjAgZGl2aWRlaW50ICAxODcgICAxODcgIC0+ICAxCitkZGR2aTAyMSBkaXZpZGVpbnQgIDUgICAgIDIgICAgLT4gIDIKK2RkZHZpMDIyIGRpdmlkZWludCAgNSAgICAgMi4wICAgIC0+ICAyCitkZGR2aTAyMyBkaXZpZGVpbnQgIDUgICAgIDIuMDAwICAtPiAgMgorZGRkdmkwMjQgZGl2aWRlaW50ICA1ICAgICAwLjIwMCAgLT4gIDI1CitkZGR2aTAyNSBkaXZpZGVpbnQgIDUgICAgIDAuMjAwICAtPiAgMjUKKworZGRkdmkwMzAgZGl2aWRlaW50ICAxICAgICAyICAgICAgLT4gIDAKK2RkZHZpMDMxIGRpdmlkZWludCAgMSAgICAgNCAgICAgIC0+ICAwCitkZGR2aTAzMiBkaXZpZGVpbnQgIDEgICAgIDggICAgICAtPiAgMAorZGRkdmkwMzMgZGl2aWRlaW50ICAxICAgICAxNiAgICAgLT4gIDAKK2RkZHZpMDM0IGRpdmlkZWludCAgMSAgICAgMzIgICAgIC0+ICAwCitkZGR2aTAzNSBkaXZpZGVpbnQgIDEgICAgIDY0ICAgICAtPiAgMAorZGRkdmkwNDAgZGl2aWRlaW50ICAxICAgIC0yICAgICAgLT4gLTAKK2RkZHZpMDQxIGRpdmlkZWludCAgMSAgICAtNCAgICAgIC0+IC0wCitkZGR2aTA0MiBkaXZpZGVpbnQgIDEgICAgLTggICAgICAtPiAtMAorZGRkdmkwNDMgZGl2aWRlaW50ICAxICAgIC0xNiAgICAgLT4gLTAKK2RkZHZpMDQ0IGRpdmlkZWludCAgMSAgICAtMzIgICAgIC0+IC0wCitkZGR2aTA0NSBkaXZpZGVpbnQgIDEgICAgLTY0ICAgICAtPiAtMAorZGRkdmkwNTAgZGl2aWRlaW50IC0xICAgICAyICAgICAgLT4gLTAKK2RkZHZpMDUxIGRpdmlkZWludCAtMSAgICAgNCAgICAgIC0+IC0wCitkZGR2aTA1MiBkaXZpZGVpbnQgLTEgICAgIDggICAgICAtPiAtMAorZGRkdmkwNTMgZGl2aWRlaW50IC0xICAgICAxNiAgICAgLT4gLTAKK2RkZHZpMDU0IGRpdmlkZWludCAtMSAgICAgMzIgICAgIC0+IC0wCitkZGR2aTA1NSBkaXZpZGVpbnQgLTEgICAgIDY0ICAgICAtPiAtMAorZGRkdmkwNjAgZGl2aWRlaW50IC0xICAgIC0yICAgICAgLT4gIDAKK2RkZHZpMDYxIGRpdmlkZWludCAtMSAgICAtNCAgICAgIC0+ICAwCitkZGR2aTA2MiBkaXZpZGVpbnQgLTEgICAgLTggICAgICAtPiAgMAorZGRkdmkwNjMgZGl2aWRlaW50IC0xICAgIC0xNiAgICAgLT4gIDAKK2RkZHZpMDY0IGRpdmlkZWludCAtMSAgICAtMzIgICAgIC0+ICAwCitkZGR2aTA2NSBkaXZpZGVpbnQgLTEgICAgLTY0ICAgICAtPiAgMAorCistLSBzaW1pbGFyIHdpdGggcG93ZXJzIG9mIHRlbgorZGRkdmkxNjAgZGl2aWRlaW50ICAxICAgICAxICAgICAgICAgLT4gIDEKK2RkZHZpMTYxIGRpdmlkZWludCAgMSAgICAgMTAgICAgICAgIC0+ICAwCitkZGR2aTE2MiBkaXZpZGVpbnQgIDEgICAgIDEwMCAgICAgICAtPiAgMAorZGRkdmkxNjMgZGl2aWRlaW50ICAxICAgICAxMDAwICAgICAgLT4gIDAKK2RkZHZpMTY0IGRpdmlkZWludCAgMSAgICAgMTAwMDAgICAgIC0+ICAwCitkZGR2aTE2NSBkaXZpZGVpbnQgIDEgICAgIDEwMDAwMCAgICAtPiAgMAorZGRkdmkxNjYgZGl2aWRlaW50ICAxICAgICAxMDAwMDAwICAgLT4gIDAKK2RkZHZpMTY3IGRpdmlkZWludCAgMSAgICAgMTAwMDAwMDAgIC0+ICAwCitkZGR2aTE2OCBkaXZpZGVpbnQgIDEgICAgIDEwMDAwMDAwMCAtPiAgMAorZGRkdmkxNzAgZGl2aWRlaW50ICAxICAgIC0xICAgICAgICAgLT4gLTEKK2RkZHZpMTcxIGRpdmlkZWludCAgMSAgICAtMTAgICAgICAgIC0+IC0wCitkZGR2aTE3MiBkaXZpZGVpbnQgIDEgICAgLTEwMCAgICAgICAtPiAtMAorZGRkdmkxNzMgZGl2aWRlaW50ICAxICAgIC0xMDAwICAgICAgLT4gLTAKK2RkZHZpMTc0IGRpdmlkZWludCAgMSAgICAtMTAwMDAgICAgIC0+IC0wCitkZGR2aTE3NSBkaXZpZGVpbnQgIDEgICAgLTEwMDAwMCAgICAtPiAtMAorZGRkdmkxNzYgZGl2aWRlaW50ICAxICAgIC0xMDAwMDAwICAgLT4gLTAKK2RkZHZpMTc3IGRpdmlkZWludCAgMSAgICAtMTAwMDAwMDAgIC0+IC0wCitkZGR2aTE3OCBkaXZpZGVpbnQgIDEgICAgLTEwMDAwMDAwMCAtPiAtMAorZGRkdmkxODAgZGl2aWRlaW50IC0xICAgICAxICAgICAgICAgLT4gLTEKK2RkZHZpMTgxIGRpdmlkZWludCAtMSAgICAgMTAgICAgICAgIC0+IC0wCitkZGR2aTE4MiBkaXZpZGVpbnQgLTEgICAgIDEwMCAgICAgICAtPiAtMAorZGRkdmkxODMgZGl2aWRlaW50IC0xICAgICAxMDAwICAgICAgLT4gLTAKK2RkZHZpMTg0IGRpdmlkZWludCAtMSAgICAgMTAwMDAgICAgIC0+IC0wCitkZGR2aTE4NSBkaXZpZGVpbnQgLTEgICAgIDEwMDAwMCAgICAtPiAtMAorZGRkdmkxODYgZGl2aWRlaW50IC0xICAgICAxMDAwMDAwICAgLT4gLTAKK2RkZHZpMTg3IGRpdmlkZWludCAtMSAgICAgMTAwMDAwMDAgIC0+IC0wCitkZGR2aTE4OCBkaXZpZGVpbnQgLTEgICAgIDEwMDAwMDAwMCAtPiAtMAorZGRkdmkxOTAgZGl2aWRlaW50IC0xICAgIC0xICAgICAgICAgLT4gIDEKK2RkZHZpMTkxIGRpdmlkZWludCAtMSAgICAtMTAgICAgICAgIC0+ICAwCitkZGR2aTE5MiBkaXZpZGVpbnQgLTEgICAgLTEwMCAgICAgICAtPiAgMAorZGRkdmkxOTMgZGl2aWRlaW50IC0xICAgIC0xMDAwICAgICAgLT4gIDAKK2RkZHZpMTk0IGRpdmlkZWludCAtMSAgICAtMTAwMDAgICAgIC0+ICAwCitkZGR2aTE5NSBkaXZpZGVpbnQgLTEgICAgLTEwMDAwMCAgICAtPiAgMAorZGRkdmkxOTYgZGl2aWRlaW50IC0xICAgIC0xMDAwMDAwICAgLT4gIDAKK2RkZHZpMTk3IGRpdmlkZWludCAtMSAgICAtMTAwMDAwMDAgIC0+ICAwCitkZGR2aTE5OCBkaXZpZGVpbnQgLTEgICAgLTEwMDAwMDAwMCAtPiAgMAorCistLSBzb21lIGxvbmcgb3BlcmFuZCAoYXQgcD05KSBjYXNlcworZGRkdmkwNzAgZGl2aWRlaW50ICA5OTk5OTk5OTkgICAgIDEgIC0+ICA5OTk5OTk5OTkKK2RkZHZpMDcxIGRpdmlkZWludCAgOTk5OTk5OTk5LjQgICAxICAtPiAgOTk5OTk5OTk5CitkZGR2aTA3MiBkaXZpZGVpbnQgIDk5OTk5OTk5OS41ICAgMSAgLT4gIDk5OTk5OTk5OQorZGRkdmkwNzMgZGl2aWRlaW50ICA5OTk5OTk5OTkuOSAgIDEgIC0+ICA5OTk5OTk5OTkKK2RkZHZpMDc0IGRpdmlkZWludCAgOTk5OTk5OTk5Ljk5OSAxICAtPiAgOTk5OTk5OTk5CisKK2RkZHZpMDkwIGRpdmlkZWludCAgMC4gICAgICAgICAgICAxICAgIC0+ICAwCitkZGR2aTA5MSBkaXZpZGVpbnQgIC4wICAgICAgICAgICAgMSAgICAtPiAgMAorZGRkdmkwOTIgZGl2aWRlaW50ICAwLjAwICAgICAgICAgIDEgICAgLT4gIDAKK2RkZHZpMDkzIGRpdmlkZWludCAgMC4wMEUrOSAgICAgICAxICAgIC0+ICAwCitkZGR2aTA5NCBkaXZpZGVpbnQgIDAuMDAwMEUtNTAgICAgMSAgICAtPiAgMAorCitkZGR2aTEwMCBkaXZpZGVpbnQgIDEgIDEgICAtPiAxCitkZGR2aTEwMSBkaXZpZGVpbnQgIDEgIDIgICAtPiAwCitkZGR2aTEwMiBkaXZpZGVpbnQgIDEgIDMgICAtPiAwCitkZGR2aTEwMyBkaXZpZGVpbnQgIDEgIDQgICAtPiAwCitkZGR2aTEwNCBkaXZpZGVpbnQgIDEgIDUgICAtPiAwCitkZGR2aTEwNSBkaXZpZGVpbnQgIDEgIDYgICAtPiAwCitkZGR2aTEwNiBkaXZpZGVpbnQgIDEgIDcgICAtPiAwCitkZGR2aTEwNyBkaXZpZGVpbnQgIDEgIDggICAtPiAwCitkZGR2aTEwOCBkaXZpZGVpbnQgIDEgIDkgICAtPiAwCitkZGR2aTEwOSBkaXZpZGVpbnQgIDEgIDEwICAtPiAwCitkZGR2aTExMCBkaXZpZGVpbnQgIDEgIDEgICAtPiAxCitkZGR2aTExMSBkaXZpZGVpbnQgIDIgIDEgICAtPiAyCitkZGR2aTExMiBkaXZpZGVpbnQgIDMgIDEgICAtPiAzCitkZGR2aTExMyBkaXZpZGVpbnQgIDQgIDEgICAtPiA0CitkZGR2aTExNCBkaXZpZGVpbnQgIDUgIDEgICAtPiA1CitkZGR2aTExNSBkaXZpZGVpbnQgIDYgIDEgICAtPiA2CitkZGR2aTExNiBkaXZpZGVpbnQgIDcgIDEgICAtPiA3CitkZGR2aTExNyBkaXZpZGVpbnQgIDggIDEgICAtPiA4CitkZGR2aTExOCBkaXZpZGVpbnQgIDkgIDEgICAtPiA5CitkZGR2aTExOSBkaXZpZGVpbnQgIDEwIDEgICAtPiAxMAorCistLSBmcm9tIERpYWdCaWdEZWNpbWFsCitkZGR2aTEzMSBkaXZpZGVpbnQgIDEwMS4zICAgMSAgICAgLT4gIDEwMQorZGRkdmkxMzIgZGl2aWRlaW50ICAxMDEuMCAgIDEgICAgIC0+ICAxMDEKK2RkZHZpMTMzIGRpdmlkZWludCAgMTAxLjMgICAzICAgICAtPiAgMzMKK2RkZHZpMTM0IGRpdmlkZWludCAgMTAxLjAgICAzICAgICAtPiAgMzMKK2RkZHZpMTM1IGRpdmlkZWludCAgMi40ICAgICAxICAgICAtPiAgMgorZGRkdmkxMzYgZGl2aWRlaW50ICAyLjQwMCAgIDEgICAgIC0+ICAyCitkZGR2aTEzNyBkaXZpZGVpbnQgIDE4ICAgICAgMTggICAgLT4gIDEKK2RkZHZpMTM4IGRpdmlkZWludCAgMTEyMCAgICAxMDAwICAtPiAgMQorZGRkdmkxMzkgZGl2aWRlaW50ICAyLjQgICAgIDIgICAgIC0+ICAxCitkZGR2aTE0MCBkaXZpZGVpbnQgIDIuNDAwICAgMiAgICAgLT4gIDEKK2RkZHZpMTQxIGRpdmlkZWludCAgMC41ICAgICAyLjAwMCAtPiAgMAorZGRkdmkxNDIgZGl2aWRlaW50ICA4LjAwNSAgIDcgICAgIC0+ICAxCitkZGR2aTE0MyBkaXZpZGVpbnQgIDUgICAgICAgMiAgICAgLT4gIDIKK2RkZHZpMTQ0IGRpdmlkZWludCAgMCAgICAgICAyICAgICAtPiAgMAorZGRkdmkxNDUgZGl2aWRlaW50ICAwLjAwICAgIDIgICAgIC0+ICAwCisKKy0tIE90aGVycworZGRkdmkxNTAgZGl2aWRlaW50ICAxMjM0NSAgNC45OTkgIC0+ICAyNDY5CitkZGR2aTE1MSBkaXZpZGVpbnQgIDEyMzQ1ICA0Ljk5ICAgLT4gIDI0NzMKK2RkZHZpMTUyIGRpdmlkZWludCAgMTIzNDUgIDQuOSAgICAtPiAgMjUxOQorZGRkdmkxNTMgZGl2aWRlaW50ICAxMjM0NSAgNSAgICAgIC0+ICAyNDY5CitkZGR2aTE1NCBkaXZpZGVpbnQgIDEyMzQ1ICA1LjEgICAgLT4gIDI0MjAKK2RkZHZpMTU1IGRpdmlkZWludCAgMTIzNDUgIDUuMDEgICAtPiAgMjQ2NAorZGRkdmkxNTYgZGl2aWRlaW50ICAxMjM0NSAgNS4wMDEgIC0+ICAyNDY4CitkZGR2aTE1NyBkaXZpZGVpbnQgICAgMTAxICA3LjYgICAgLT4gIDEzCisKKy0tIFZhcmlvdXMgZmxhdm91cnMgb2YgZGl2aWRlaW50IGJ5IDAKK2RkZHZpMjAxIGRpdmlkZWludCAgMCAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZGR2aTIwMiBkaXZpZGVpbnQgIDAuMEU1ICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRkdmkyMDMgZGl2aWRlaW50ICAwLjAwMCAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkZHZpMjA0IGRpdmlkZWludCAgMC4wMDAxIDAgICAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTIwNSBkaXZpZGVpbnQgIDAuMDEgICAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMDYgZGl2aWRlaW50ICAwLjEgICAgMCAgIC0+IEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpMjA3IGRpdmlkZWludCAgMSAgICAgIDAgICAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTIwOCBkaXZpZGVpbnQgIDEgICAgICAwLjAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMDkgZGl2aWRlaW50IDEwICAgICAgMC4wIC0+IEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpMjEwIGRpdmlkZWludCAxRSsxMDAgIDAuMCAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTIxMSBkaXZpZGVpbnQgMUUrMzgwICAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMTQgZGl2aWRlaW50ICAtMC4wMDAxIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMTUgZGl2aWRlaW50ICAtMC4wMSAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMTYgZGl2aWRlaW50ICAtMC4xICAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMTcgZGl2aWRlaW50ICAtMSAgICAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMTggZGl2aWRlaW50ICAtMSAgICAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMTkgZGl2aWRlaW50IC0xMCAgICAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMjAgZGl2aWRlaW50IC0xRSsxMDAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMjEgZGl2aWRlaW50IC0xRSszODAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCistLSB0ZXN0IHNvbWUgY2FzZXMgdGhhdCBhcmUgY2xvc2UgdG8gZXhwb25lbnQgb3ZlcmZsb3cKK2RkZHZpMjcwIGRpdmlkZWludCAxIDFlMzg0ICAgICAgICAgIC0+IDAKK2RkZHZpMjcxIGRpdmlkZWludCAxIDAuOWUzODQgICAgICAgIC0+IDAKK2RkZHZpMjcyIGRpdmlkZWludCAxIDAuOTllMzg0ICAgICAgIC0+IDAKK2RkZHZpMjczIGRpdmlkZWludCAxIDAuOTk5OTk5OTk5OTk5OTk5OWUzODQgICAgICAgLT4gMAorZGRkdmkyNzQgZGl2aWRlaW50IDllMzg0ICAgIDEgICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RkZHZpMjc1IGRpdmlkZWludCA5LjllMzg0ICAxICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZGR2aTI3NiBkaXZpZGVpbnQgOS45OWUzODQgMSAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRkdmkyNzcgZGl2aWRlaW50IDkuOTk5OTk5OTk5OTk5OTk5ZTM4NCAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKK2RkZHZpMjgwIGRpdmlkZWludCAwLjEgOWUtMzgzICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZGR2aTI4MSBkaXZpZGVpbnQgMC4xIDk5ZS0zODMgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRkdmkyODIgZGl2aWRlaW50IDAuMSA5OTllLTM4MyAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RkZHZpMjgzIGRpdmlkZWludCAwLjEgOWUtMzgyICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZGR2aTI4NCBkaXZpZGVpbnQgMC4xIDk5ZS0zODIgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCistLSBHRCBlZGdlIGNhc2VzOiBsaHMgc21hbGxlciB0aGFuIHJocyBidXQgbW9yZSBkaWdpdHMKK2RkZHZpMzAxICBkaXZpZGVpbnQgIDAuOSAgICAgIDIgICAgICAtPiAgMAorZGRkdmkzMDIgIGRpdmlkZWludCAgMC45ICAgICAgMi4wICAgIC0+ICAwCitkZGR2aTMwMyAgZGl2aWRlaW50ICAwLjkgICAgICAyLjEgICAgLT4gIDAKK2RkZHZpMzA0ICBkaXZpZGVpbnQgIDAuOSAgICAgIDIuMDAgICAtPiAgMAorZGRkdmkzMDUgIGRpdmlkZWludCAgMC45ICAgICAgMi4wMSAgIC0+ICAwCitkZGR2aTMwNiAgZGl2aWRlaW50ICAwLjEyICAgICAxICAgICAgLT4gIDAKK2RkZHZpMzA3ICBkaXZpZGVpbnQgIDAuMTIgICAgIDEuMCAgICAtPiAgMAorZGRkdmkzMDggIGRpdmlkZWludCAgMC4xMiAgICAgMS4wMCAgIC0+ICAwCitkZGR2aTMwOSAgZGl2aWRlaW50ICAwLjEyICAgICAxLjAgICAgLT4gIDAKK2RkZHZpMzEwICBkaXZpZGVpbnQgIDAuMTIgICAgIDEuMDAgICAtPiAgMAorZGRkdmkzMTEgIGRpdmlkZWludCAgMC4xMiAgICAgMiAgICAgIC0+ICAwCitkZGR2aTMxMiAgZGl2aWRlaW50ICAwLjEyICAgICAyLjAgICAgLT4gIDAKK2RkZHZpMzEzICBkaXZpZGVpbnQgIDAuMTIgICAgIDIuMSAgICAtPiAgMAorZGRkdmkzMTQgIGRpdmlkZWludCAgMC4xMiAgICAgMi4wMCAgIC0+ICAwCitkZGR2aTMxNSAgZGl2aWRlaW50ICAwLjEyICAgICAyLjAxICAgLT4gIDAKKworLS0gZWRnZSBjYXNlcyBvZiBpbXBvc3NpYmxlCitkZGR2aTMzMCAgZGl2aWRlaW50ICAxMjM0NTY3ODkwMTIzNDU2ICAxMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQ1CitkZGR2aTMzMSAgZGl2aWRlaW50ICAxMjM0NTY3ODkwMTIzNDU2ICAgMSAgICAtPiAgMTIzNDU2Nzg5MDEyMzQ1NgorZGRkdmkzMzIgIGRpdmlkZWludCAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDAuMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZGR2aTMzMyAgZGl2aWRlaW50ICAxMjM0NTY3ODkwMTIzNDU2ICAgMC4wMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cyBbZnJvbSBkaXZpZGVdCitkZGR2aTEwNTEgZGl2aWRlaW50ICAxZSsyNzcgIDFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RkZHZpMTA1MiBkaXZpZGVpbnQgIDFlKzI3NyAtMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRkdmkxMDUzIGRpdmlkZWludCAtMWUrMjc3ICAxZS0zMTEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZGR2aTEwNTQgZGl2aWRlaW50IC0xZSsyNzcgLTFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RkZHZpMTA1NSBkaXZpZGVpbnQgIDFlLTI3NyAgMWUrMzExIC0+ICAwCitkZGR2aTEwNTYgZGl2aWRlaW50ICAxZS0yNzcgLTFlKzMxMSAtPiAtMAorZGRkdmkxMDU3IGRpdmlkZWludCAtMWUtMjc3ICAxZSszMTEgLT4gLTAKK2RkZHZpMTA1OCBkaXZpZGVpbnQgLTFlLTI3NyAtMWUrMzExIC0+ICAwCisKKy0tICdzdWJub3JtYWwnIGJvdW5kYXJ5IChhbGwgaGFyZCB1bmRlcmZsb3cgb3Igb3ZlcmZsb3cgaW4gYmFzZSBhcml0aGVtdGljKQorZGRkdmkxMDYwIGRpdmlkZWludCAxZS0yOTEgMWUrMTAxIC0+IDAKK2RkZHZpMTA2MSBkaXZpZGVpbnQgMWUtMjkxIDFlKzEwMiAtPiAwCitkZGR2aTEwNjIgZGl2aWRlaW50IDFlLTI5MSAxZSsxMDMgLT4gMAorZGRkdmkxMDYzIGRpdmlkZWludCAxZS0yOTEgMWUrMTA0IC0+IDAKK2RkZHZpMTA2NCBkaXZpZGVpbnQgMWUtMjkxIDFlKzEwNSAtPiAwCitkZGR2aTEwNjUgZGl2aWRlaW50IDFlLTI5MSAxZSsxMDYgLT4gMAorZGRkdmkxMDY2IGRpdmlkZWludCAxZS0yOTEgMWUrMTA3IC0+IDAKK2RkZHZpMTA2NyBkaXZpZGVpbnQgMWUtMjkxIDFlKzEwOCAtPiAwCitkZGR2aTEwNjggZGl2aWRlaW50IDFlLTI5MSAxZSsxMDkgLT4gMAorZGRkdmkxMDY5IGRpdmlkZWludCAxZS0yOTEgMWUrMTEwIC0+IDAKKworZGRkdmkxMTAxIGRpdmlkZWludCAgMS4wMDAwRS0zOTQgIDEgICAgIC0+IDAKK2RkZHZpMTEwMiBkaXZpZGVpbnQgIDEuMDAwRS0zOTQgICAxZSsxICAtPiAwCitkZGR2aTExMDMgZGl2aWRlaW50ICAxLjAwRS0zOTQgICAgMWUrMiAgLT4gMAorCitkZGR2aTExMTggZGl2aWRlaW50ICAxRS0zOTQgICAgICAgMWUrNCAgLT4gMAorZGRkdmkxMTE5IGRpdmlkZWludCAgM0UtMzk0ICAgICAgLTFlKzUgIC0+IC0wCitkZGR2aTExMjAgZGl2aWRlaW50ICA1RS0zOTQgICAgICAgMWUrNSAgLT4gMAorCitkZGR2aTExMjQgZGl2aWRlaW50ICAxRS0zOTQgICAgICAtMWUrNCAgLT4gLTAKK2RkZHZpMTEzMCBkaXZpZGVpbnQgIDMuMEUtMzk0ICAgIC0xZSs1ICAtPiAtMAorCitkZGR2aTExMzEgZGl2aWRlaW50ICAxLjBFLTE5OSAgICAgMWUrMjAwIC0+IDAKK2RkZHZpMTEzMiBkaXZpZGVpbnQgIDEuMEUtMTk5ICAgICAxZSsxOTkgLT4gMAorZGRkdmkxMTMzIGRpdmlkZWludCAgMS4wRS0xOTkgICAgIDFlKzE5OCAtPiAwCitkZGR2aTExMzQgZGl2aWRlaW50ICAyLjBFLTE5OSAgICAgMmUrMTk4IC0+IDAKK2RkZHZpMTEzNSBkaXZpZGVpbnQgIDQuMEUtMTk5ICAgICA0ZSsxOTggLT4gMAorCistLSBsb25nIG9wZXJhbmQgY2hlY2tzCitkZGR2aTQwMSBkaXZpZGVpbnQgMTIzNDU2NzgwMDAgMTAwIC0+IDEyMzQ1Njc4MAorZGRkdmk0MDIgZGl2aWRlaW50IDEgMTIzNDU2NzgwMDAgICAtPiAwCitkZGR2aTQwMyBkaXZpZGVpbnQgMTIzNDU2NzgwMCAgMTAgIC0+IDEyMzQ1Njc4MAorZGRkdmk0MDQgZGl2aWRlaW50IDEgMTIzNDU2NzgwMCAgICAtPiAwCitkZGR2aTQwNSBkaXZpZGVpbnQgMTIzNDU2Nzg5MCAgMTAgIC0+IDEyMzQ1Njc4OQorZGRkdmk0MDYgZGl2aWRlaW50IDEgMTIzNDU2Nzg5MCAgICAtPiAwCitkZGR2aTQwNyBkaXZpZGVpbnQgMTIzNDU2Nzg5MSAgMTAgIC0+IDEyMzQ1Njc4OQorZGRkdmk0MDggZGl2aWRlaW50IDEgMTIzNDU2Nzg5MSAgICAtPiAwCitkZGR2aTQwOSBkaXZpZGVpbnQgMTIzNDU2Nzg5MDEgMTAwIC0+IDEyMzQ1Njc4OQorZGRkdmk0MTAgZGl2aWRlaW50IDEgMTIzNDU2Nzg5MDEgICAtPiAwCitkZGR2aTQxMSBkaXZpZGVpbnQgMTIzNDU2Nzg5NiAgMTAgIC0+IDEyMzQ1Njc4OQorZGRkdmk0MTIgZGl2aWRlaW50IDEgMTIzNDU2Nzg5NiAgICAtPiAwCitkZGR2aTQxMyBkaXZpZGVpbnQgMTIzNDU2Nzg5NDggMTAwIC0+IDEyMzQ1Njc4OQorZGRkdmk0MTQgZGl2aWRlaW50IDEyMzQ1Njc4OTQ5IDEwMCAtPiAxMjM0NTY3ODkKK2RkZHZpNDE1IGRpdmlkZWludCAxMjM0NTY3ODk1MCAxMDAgLT4gMTIzNDU2Nzg5CitkZGR2aTQxNiBkaXZpZGVpbnQgMTIzNDU2Nzg5NTEgMTAwIC0+IDEyMzQ1Njc4OQorZGRkdmk0MTcgZGl2aWRlaW50IDEyMzQ1Njc4OTk5IDEwMCAtPiAxMjM0NTY3ODkKK2RkZHZpNDQxIGRpdmlkZWludCAxMjM0NTY3ODAwMCAxIC0+IDEyMzQ1Njc4MDAwCitkZGR2aTQ0MiBkaXZpZGVpbnQgMSAxMjM0NTY3ODAwMCAtPiAwCitkZGR2aTQ0MyBkaXZpZGVpbnQgMTIzNDU2NzgwMCAgMSAtPiAxMjM0NTY3ODAwCitkZGR2aTQ0NCBkaXZpZGVpbnQgMSAxMjM0NTY3ODAwICAtPiAwCitkZGR2aTQ0NSBkaXZpZGVpbnQgMTIzNDU2Nzg5MCAgMSAtPiAxMjM0NTY3ODkwCitkZGR2aTQ0NiBkaXZpZGVpbnQgMSAxMjM0NTY3ODkwICAtPiAwCitkZGR2aTQ0NyBkaXZpZGVpbnQgMTIzNDU2Nzg5MSAgMSAtPiAxMjM0NTY3ODkxCitkZGR2aTQ0OCBkaXZpZGVpbnQgMSAxMjM0NTY3ODkxICAtPiAwCitkZGR2aTQ0OSBkaXZpZGVpbnQgMTIzNDU2Nzg5MDEgMSAtPiAxMjM0NTY3ODkwMQorZGRkdmk0NTAgZGl2aWRlaW50IDEgMTIzNDU2Nzg5MDEgLT4gMAorZGRkdmk0NTEgZGl2aWRlaW50IDEyMzQ1Njc4OTYgIDEgLT4gMTIzNDU2Nzg5NgorZGRkdmk0NTIgZGl2aWRlaW50IDEgMTIzNDU2Nzg5NiAgLT4gMAorCistLSBtb3JlIHplcm9zLCBldGMuCitkZGR2aTUzMSBkaXZpZGVpbnQgNS4wMCAxRS0zICAgIC0+IDUwMDAKK2RkZHZpNTMyIGRpdmlkZWludCAwMC4wMCAwLjAwMCAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRkdmk1MzMgZGl2aWRlaW50IDAwLjAwIDBFLTMgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZGR2aTUzNCBkaXZpZGVpbnQgIDAgICAgLTAgICAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkZHZpNTM1IGRpdmlkZWludCAtMCAgICAgMCAgICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRkdmk1MzYgZGl2aWRlaW50IC0wICAgIC0wICAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCisKK2RkZHZpNTQxIGRpdmlkZWludCAgMCAgICAtMSAgICAgLT4gLTAKK2RkZHZpNTQyIGRpdmlkZWludCAtMCAgICAtMSAgICAgLT4gIDAKK2RkZHZpNTQzIGRpdmlkZWludCAgMCAgICAgMSAgICAgLT4gIDAKK2RkZHZpNTQ0IGRpdmlkZWludCAtMCAgICAgMSAgICAgLT4gLTAKK2RkZHZpNTQ1IGRpdmlkZWludCAtMSAgICAgMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpNTQ2IGRpdmlkZWludCAtMSAgICAtMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpNTQ3IGRpdmlkZWludCAgMSAgICAgMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpNTQ4IGRpdmlkZWludCAgMSAgICAtMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGRkdmk1NTEgZGl2aWRlaW50ICAwLjAgIC0xICAgICAtPiAtMAorZGRkdmk1NTIgZGl2aWRlaW50IC0wLjAgIC0xICAgICAtPiAgMAorZGRkdmk1NTMgZGl2aWRlaW50ICAwLjAgICAxICAgICAtPiAgMAorZGRkdmk1NTQgZGl2aWRlaW50IC0wLjAgICAxICAgICAtPiAtMAorZGRkdmk1NTUgZGl2aWRlaW50IC0xLjAgICAwICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmk1NTYgZGl2aWRlaW50IC0xLjAgIC0wICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmk1NTcgZGl2aWRlaW50ICAxLjAgICAwICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmk1NTggZGl2aWRlaW50ICAxLjAgIC0wICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkZGR2aTU2MSBkaXZpZGVpbnQgIDAgICAgLTEuMCAgIC0+IC0wCitkZGR2aTU2MiBkaXZpZGVpbnQgLTAgICAgLTEuMCAgIC0+ICAwCitkZGR2aTU2MyBkaXZpZGVpbnQgIDAgICAgIDEuMCAgIC0+ICAwCitkZGR2aTU2NCBkaXZpZGVpbnQgLTAgICAgIDEuMCAgIC0+IC0wCitkZGR2aTU2NSBkaXZpZGVpbnQgLTEgICAgIDAuMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTU2NiBkaXZpZGVpbnQgLTEgICAgLTAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTU2NyBkaXZpZGVpbnQgIDEgICAgIDAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTU2OCBkaXZpZGVpbnQgIDEgICAgLTAuMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKK2RkZHZpNTcxIGRpdmlkZWludCAgMC4wICAtMS4wICAgLT4gLTAKK2RkZHZpNTcyIGRpdmlkZWludCAtMC4wICAtMS4wICAgLT4gIDAKK2RkZHZpNTczIGRpdmlkZWludCAgMC4wICAgMS4wICAgLT4gIDAKK2RkZHZpNTc0IGRpdmlkZWludCAtMC4wICAgMS4wICAgLT4gLTAKK2RkZHZpNTc1IGRpdmlkZWludCAtMS4wICAgMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpNTc2IGRpdmlkZWludCAtMS4wICAtMC4wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpNTc3IGRpdmlkZWludCAgMS4wICAgMC4wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpNTc4IGRpdmlkZWludCAgMS4wICAtMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworLS0gU3BlY2lhbHMKK2RkZHZpNTgwIGRpdmlkZWludCAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk1ODEgZGl2aWRlaW50ICBJbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK2RkZHZpNTgyIGRpdmlkZWludCAgSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitkZGR2aTU4MyBkaXZpZGVpbnQgIEluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorZGRkdmk1ODQgZGl2aWRlaW50ICBJbmYgICAwICAgICAtPiAgSW5maW5pdHkKK2RkZHZpNTg1IGRpdmlkZWludCAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitkZGR2aTU4NiBkaXZpZGVpbnQgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorZGRkdmk1ODcgZGl2aWRlaW50ICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGR2aTU4OCBkaXZpZGVpbnQgLTEwMDAgIEluZiAgIC0+IC0wCitkZGR2aTU4OSBkaXZpZGVpbnQgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNTkwIGRpdmlkZWludCAtMSAgICAgSW5mICAgLT4gLTAKK2RkZHZpNTkxIGRpdmlkZWludCAtMCAgICAgSW5mICAgLT4gLTAKK2RkZHZpNTkyIGRpdmlkZWludCAgMCAgICAgSW5mICAgLT4gIDAKK2RkZHZpNTkzIGRpdmlkZWludCAgMSAgICAgSW5mICAgLT4gIDAKK2RkZHZpNTk0IGRpdmlkZWludCAgMTAwMCAgSW5mICAgLT4gIDAKK2RkZHZpNTk1IGRpdmlkZWludCAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZGR2aTYwMCBkaXZpZGVpbnQgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjAxIGRpdmlkZWludCAtSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitkZGR2aTYwMiBkaXZpZGVpbnQgLUluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorZGRkdmk2MDMgZGl2aWRlaW50IC1JbmYgIC0wICAgICAtPiAgSW5maW5pdHkKK2RkZHZpNjA0IGRpdmlkZWludCAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitkZGR2aTYwNSBkaXZpZGVpbnQgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZGRkdmk2MDYgZGl2aWRlaW50IC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2RkZHZpNjA3IGRpdmlkZWludCAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2MDggZGl2aWRlaW50IC0xMDAwICBJbmYgICAtPiAtMAorZGRkdmk2MDkgZGl2aWRlaW50IC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGR2aTYxMCBkaXZpZGVpbnQgLTEgICAgLUluZiAgIC0+ICAwCitkZGR2aTYxMSBkaXZpZGVpbnQgLTAgICAgLUluZiAgIC0+ICAwCitkZGR2aTYxMiBkaXZpZGVpbnQgIDAgICAgLUluZiAgIC0+IC0wCitkZGR2aTYxMyBkaXZpZGVpbnQgIDEgICAgLUluZiAgIC0+IC0wCitkZGR2aTYxNCBkaXZpZGVpbnQgIDEwMDAgLUluZiAgIC0+IC0wCitkZGR2aTYxNSBkaXZpZGVpbnQgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZGRkdmk2MjEgZGl2aWRlaW50ICBOYU4gLUluZiAgICAtPiAgTmFOCitkZGR2aTYyMiBkaXZpZGVpbnQgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RkZHZpNjIzIGRpdmlkZWludCAgTmFOIC0xICAgICAgLT4gIE5hTgorZGRkdmk2MjQgZGl2aWRlaW50ICBOYU4gLTAgICAgICAtPiAgTmFOCitkZGR2aTYyNSBkaXZpZGVpbnQgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2RkZHZpNjI2IGRpdmlkZWludCAgTmFOICAxICAgICAgLT4gIE5hTgorZGRkdmk2MjcgZGl2aWRlaW50ICBOYU4gIDEwMDAgICAtPiAgTmFOCitkZGR2aTYyOCBkaXZpZGVpbnQgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RkZHZpNjI5IGRpdmlkZWludCAgTmFOICBOYU4gICAgLT4gIE5hTgorZGRkdmk2MzAgZGl2aWRlaW50IC1JbmYgIE5hTiAgICAtPiAgTmFOCitkZGR2aTYzMSBkaXZpZGVpbnQgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RkZHZpNjMyIGRpdmlkZWludCAtMSAgICBOYU4gICAgLT4gIE5hTgorZGRkdmk2MzMgZGl2aWRlaW50IC0wICAgIE5hTiAgICAtPiAgTmFOCitkZGR2aTYzNCBkaXZpZGVpbnQgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RkZHZpNjM1IGRpdmlkZWludCAgMSAgICBOYU4gICAgLT4gIE5hTgorZGRkdmk2MzYgZGl2aWRlaW50ICAxMDAwIE5hTiAgICAtPiAgTmFOCitkZGR2aTYzNyBkaXZpZGVpbnQgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZGRkdmk2NDEgZGl2aWRlaW50ICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NDIgZGl2aWRlaW50ICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NDMgZGl2aWRlaW50ICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NDQgZGl2aWRlaW50ICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NDUgZGl2aWRlaW50ICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NDYgZGl2aWRlaW50ICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NDcgZGl2aWRlaW50ICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NDggZGl2aWRlaW50ICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NDkgZGl2aWRlaW50ICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NTAgZGl2aWRlaW50ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NTEgZGl2aWRlaW50IC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NTIgZGl2aWRlaW50IC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NTMgZGl2aWRlaW50IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NTQgZGl2aWRlaW50IC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NTUgZGl2aWRlaW50ICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NTYgZGl2aWRlaW50ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NTcgZGl2aWRlaW50ICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NTggZGl2aWRlaW50ICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NTkgZGl2aWRlaW50ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZGR2aTY2MSBkaXZpZGVpbnQgIE5hTjkgLUluZiAgIC0+ICBOYU45CitkZGR2aTY2MiBkaXZpZGVpbnQgIE5hTjggIDEwMDAgIC0+ICBOYU44CitkZGR2aTY2MyBkaXZpZGVpbnQgIE5hTjcgIEluZiAgIC0+ICBOYU43CitkZGR2aTY2NCBkaXZpZGVpbnQgLU5hTjYgIE5hTjUgIC0+IC1OYU42CitkZGR2aTY2NSBkaXZpZGVpbnQgLUluZiAgIE5hTjQgIC0+ICBOYU40CitkZGR2aTY2NiBkaXZpZGVpbnQgLTEwMDAgIE5hTjMgIC0+ICBOYU4zCitkZGR2aTY2NyBkaXZpZGVpbnQgIEluZiAgLU5hTjIgIC0+IC1OYU4yCisKK2RkZHZpNjcxIGRpdmlkZWludCAtc05hTjk5IC1JbmYgICAgLT4gLU5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkZGR2aTY3MiBkaXZpZGVpbnQgIHNOYU45OCAtMSAgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NzMgZGl2aWRlaW50ICBzTmFOOTcgIE5hTiAgICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjc0IGRpdmlkZWludCAgc05hTjk2IHNOYU45NCAgLT4gIE5hTjk2IEludmFsaWRfb3BlcmF0aW9uCitkZGR2aTY3NSBkaXZpZGVpbnQgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NzYgZGl2aWRlaW50IC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjc3IGRpdmlkZWludCAgMCAgICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkZGR2aTY3OCBkaXZpZGVpbnQgIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NzkgZGl2aWRlaW50ICBOYU4gICAgc05hTjg5ICAtPiAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0cworZGRkdmk5MDAgZGl2aWRlaW50ICAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpOTAxIGRpdmlkZWludCAgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkRW5jb2RlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkRW5jb2RlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5ZDMxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRFbmNvZGUuZGVjVGVzdApAQCAtMCwwICsxLDQ5NSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZEVuY29kZS5kZWNUZXN0IC0tIGRlY2ltYWwgZWlnaHQtYnl0ZSBmb3JtYXQgdGVzdGNhc2VzICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDAwLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBbUHJldmlvdXNseSBjYWxsZWQgZGVjaW1hbDY0LmRlY1Rlc3RdCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgc2V0IG9mIHRlc3RzIGlzIGZvciB0aGUgZWlnaHQtYnl0ZSBjb25jcmV0ZSByZXByZXNlbnRhdGlvbi4KKy0tIEl0cyBjaGFyYWN0ZXJpc3RpY3MgYXJlOgorLS0KKy0tICAxIGJpdCAgc2lnbgorLS0gIDUgYml0cyBjb21iaW5hdGlvbiBmaWVsZAorLS0gIDggYml0cyBleHBvbmVudCBjb250aW51YXRpb24KKy0tIDUwIGJpdHMgY29lZmZpY2llbnQgY29udGludWF0aW9uCistLQorLS0gVG90YWwgZXhwb25lbnQgbGVuZ3RoIDEwIGJpdHMKKy0tIFRvdGFsIGNvZWZmaWNpZW50IGxlbmd0aCA1NCBiaXRzICgxNiBkaWdpdHMpCistLQorLS0gRWxpbWl0ID0gIDc2NyAobWF4aW11bSBlbmNvZGVkIGV4cG9uZW50KQorLS0gRW1heCAgID0gIDM4NCAobGFyZ2VzdCBleHBvbmVudCB2YWx1ZSkKKy0tIEVtaW4gICA9IC0zODMgKHNtYWxsZXN0IGV4cG9uZW50IHZhbHVlKQorLS0gYmlhcyAgID0gIDM5OCAoc3VidHJhY3RlZCBmcm9tIGVuY29kZWQgZXhwb25lbnQpID0gLUV0aW55CisKKy0tIFRoZSB0ZXN0Y2FzZXMgaGVyZSBoYXZlIG9ubHkgZXhhY3RseSByZXByZXNlbnRhYmxlIGRhdGEgb24gdGhlCistLSAnbGVmdC1oYW5kLXNpZGUnOyByb3VuZGluZyBmcm9tIHN0cmluZ3MgaXMgdGVzdGVkIGluICdiYXNlJworLS0gdGVzdGNhc2UgZ3JvdXBzLgorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCisKKy0tIEdlbmVyYWwgdGVzdGNhc2VzCistLSAobW9zdGx5IGRlcml2ZWQgZnJvbSB0aGUgU3RyYXdtYW4gNCBkb2N1bWVudCBhbmQgZXhhbXBsZXMpCitkZWNlMDAxIGFwcGx5ICAgI0EyMzAwMDAwMDAwMDAzRDAgLT4gLTcuNTAKK2RlY2UwMDIgYXBwbHkgICAtNy41MCAgICAgICAgICAgICAtPiAjQTIzMDAwMDAwMDAwMDNEMAorLS0gZGVyaXZhdGl2ZSBjYW5vbmljYWwgcGxhaW4gc3RyaW5ncworZGVjZTAwMyBhcHBseSAgICNBMjNjMDAwMDAwMDAwM0QwIC0+IC03LjUwRSszCitkZWNlMDA0IGFwcGx5ICAgLTcuNTBFKzMgICAgICAgICAgLT4gI0EyM2MwMDAwMDAwMDAzRDAKK2RlY2UwMDUgYXBwbHkgICAjQTIzODAwMDAwMDAwMDNEMCAtPiAtNzUwCitkZWNlMDA2IGFwcGx5ICAgLTc1MCAgICAgICAgICAgICAgLT4gI0EyMzgwMDAwMDAwMDAzRDAKK2RlY2UwMDcgYXBwbHkgICAjQTIzNDAwMDAwMDAwMDNEMCAtPiAtNzUuMAorZGVjZTAwOCBhcHBseSAgIC03NS4wICAgICAgICAgICAgIC0+ICNBMjM0MDAwMDAwMDAwM0QwCitkZWNlMDA5IGFwcGx5ICAgI0EyMmMwMDAwMDAwMDAzRDAgLT4gLTAuNzUwCitkZWNlMDEwIGFwcGx5ICAgLTAuNzUwICAgICAgICAgICAgLT4gI0EyMmMwMDAwMDAwMDAzRDAKK2RlY2UwMTEgYXBwbHkgICAjQTIyODAwMDAwMDAwMDNEMCAtPiAtMC4wNzUwCitkZWNlMDEyIGFwcGx5ICAgLTAuMDc1MCAgICAgICAgICAgLT4gI0EyMjgwMDAwMDAwMDAzRDAKK2RlY2UwMTMgYXBwbHkgICAjQTIyMDAwMDAwMDAwMDNEMCAtPiAtMC4wMDA3NTAKK2RlY2UwMTQgYXBwbHkgICAtMC4wMDA3NTAgICAgICAgICAtPiAjQTIyMDAwMDAwMDAwMDNEMAorZGVjZTAxNSBhcHBseSAgICNBMjE4MDAwMDAwMDAwM0QwIC0+IC0wLjAwMDAwNzUwCitkZWNlMDE2IGFwcGx5ICAgLTAuMDAwMDA3NTAgICAgICAgLT4gI0EyMTgwMDAwMDAwMDAzRDAKK2RlY2UwMTcgYXBwbHkgICAjQTIxNDAwMDAwMDAwMDNEMCAtPiAtNy41MEUtNworZGVjZTAxOCBhcHBseSAgIC03LjUwRS03ICAgICAgICAgIC0+ICNBMjE0MDAwMDAwMDAwM0QwCisKKy0tIE5vcm1hbGl0eQorZGVjZTAyMCBhcHBseSAgIDEyMzQ1Njc4OTAxMjM0NTYgICAtPiAjMjYzOTM0YjljMWUyOGU1NgorZGVjZTAyMSBhcHBseSAgLTEyMzQ1Njc4OTAxMjM0NTYgICAtPiAjYTYzOTM0YjljMWUyOGU1NgorZGVjZTAyMiBhcHBseSAgIDEyMzQuNTY3ODkwMTIzNDU2ICAtPiAjMjYwOTM0YjljMWUyOGU1NgorZGVjZTAyMyBhcHBseSAgIzI2MDkzNGI5YzFlMjhlNTYgICAtPiAxMjM0LjU2Nzg5MDEyMzQ1NgorZGVjZTAyNCBhcHBseSAgIDExMTExMTExMTExMTExMTEgICAtPiAjMjYzODkxMjQ0OTEyNDQ5MQorZGVjZTAyNSBhcHBseSAgIDk5OTk5OTk5OTk5OTk5OTkgICAtPiAjNmUzOGZmM2ZjZmYzZmNmZgorCistLSBObWF4IGFuZCBzaW1pbGFyCitkZWNlMDMxIGFwcGx5ICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKK2RlY2UwMzIgYXBwbHkgICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorZGVjZTAzMyBhcHBseSAgICM3N2ZjZmYzZmNmZjNmY2ZmICAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RlY2UwMzQgYXBwbHkgICAxLjIzNDU2Nzg5MDEyMzQ1NkUrMzg0ICAtPiAjNDdmZDM0YjljMWUyOGU1NgorZGVjZTAzNSBhcHBseSAgICM0N2ZkMzRiOWMxZTI4ZTU2ICAgICAgIC0+IDEuMjM0NTY3ODkwMTIzNDU2RSszODQKKy0tIGZvbGQtZG93bnMgKG1vcmUgYmVsb3cpCitkZWNlMDM2IGFwcGx5ICAgMS4yM0UrMzg0ICAgICAgICAgICAgICAgLT4gIzQ3ZmQzMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjZTAzNyBhcHBseSAgICM0N2ZkMzAwMDAwMDAwMDAwICAgICAgIC0+IDEuMjMwMDAwMDAwMDAwMDAwRSszODQKK2RlY2QwMzggYXBwbHkgICAxRSszODQgICAgICAgICAgICAgICAgICAtPiAjNDdmYzAwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNkMDM5IGFwcGx5ICAgIzQ3ZmMwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzM4NAorCitkZWNkMDUxIGFwcGx5ICAgMTIzNDUgICAgICAgICAgICAgICAgICAgLT4gIzIyMzgwMDAwMDAwMDQ5YzUKK2RlY2QwNTIgYXBwbHkgICAjMjIzODAwMDAwMDAwNDljNSAgICAgICAtPiAxMjM0NQorZGVjZDA1MyBhcHBseSAgIDEyMzQgICAgICAgICAgICAgICAgICAgIC0+ICMyMjM4MDAwMDAwMDAwNTM0CitkZWNkMDU0IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDA1MzQgICAgICAgLT4gMTIzNAorZGVjZDA1NSBhcHBseSAgIDEyMyAgICAgICAgICAgICAgICAgICAgIC0+ICMyMjM4MDAwMDAwMDAwMGEzCitkZWNkMDU2IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwYTMgICAgICAgLT4gMTIzCitkZWNkMDU3IGFwcGx5ICAgMTIgICAgICAgICAgICAgICAgICAgICAgLT4gIzIyMzgwMDAwMDAwMDAwMTIKK2RlY2QwNTggYXBwbHkgICAjMjIzODAwMDAwMDAwMDAxMiAgICAgICAtPiAxMgorZGVjZDA1OSBhcHBseSAgIDEgICAgICAgICAgICAgICAgICAgICAgIC0+ICMyMjM4MDAwMDAwMDAwMDAxCitkZWNkMDYwIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwMDEgICAgICAgLT4gMQorZGVjZDA2MSBhcHBseSAgIDEuMjMgICAgICAgICAgICAgICAgICAgIC0+ICMyMjMwMDAwMDAwMDAwMGEzCitkZWNkMDYyIGFwcGx5ICAgIzIyMzAwMDAwMDAwMDAwYTMgICAgICAgLT4gMS4yMworZGVjZDA2MyBhcHBseSAgIDEyMy40NSAgICAgICAgICAgICAgICAgIC0+ICMyMjMwMDAwMDAwMDA0OWM1CitkZWNkMDY0IGFwcGx5ICAgIzIyMzAwMDAwMDAwMDQ5YzUgICAgICAgLT4gMTIzLjQ1CisKKy0tIE5taW4gYW5kIGJlbG93CitkZWNkMDcxIGFwcGx5ICAgMUUtMzgzICAgICAgICAgICAgICAgICAgLT4gIzAwM2MwMDAwMDAwMDAwMDEKK2RlY2QwNzIgYXBwbHkgICAjMDAzYzAwMDAwMDAwMDAwMSAgICAgICAtPiAxRS0zODMKK2RlY2QwNzMgYXBwbHkgICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAjMDQwMDAwMDAwMDAwMDAwMAorZGVjZDA3NCBhcHBseSAgICMwNDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2RlY2QwNzUgYXBwbHkgICAxLjAwMDAwMDAwMDAwMDAwMUUtMzgzICAtPiAjMDQwMDAwMDAwMDAwMDAwMQorZGVjZDA3NiBhcHBseSAgICMwNDAwMDAwMDAwMDAwMDAxICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAxRS0zODMKKworZGVjZDA3NyBhcHBseSAgIDAuMTAwMDAwMDAwMDAwMDAwRS0zODMgIC0+ICMwMDAwODAwMDAwMDAwMDAwICAgICAgU3Vibm9ybWFsCitkZWNkMDc4IGFwcGx5ICAgIzAwMDA4MDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMEUtMzg0ICBTdWJub3JtYWwKK2RlY2QwNzkgYXBwbHkgICAwLjAwMDAwMDAwMDAwMDAxMEUtMzgzICAtPiAjMDAwMDAwMDAwMDAwMDAxMCAgICAgIFN1Ym5vcm1hbAorZGVjZDA4MCBhcHBseSAgICMwMDAwMDAwMDAwMDAwMDEwICAgICAgIC0+IDEuMEUtMzk3ICAgICAgICAgICAgICAgU3Vibm9ybWFsCitkZWNkMDgxIGFwcGx5ICAgMC4wMDAwMDAwMDAwMDAwMUUtMzgzICAgLT4gIzAwMDQwMDAwMDAwMDAwMDEgICAgICBTdWJub3JtYWwKK2RlY2QwODIgYXBwbHkgICAjMDAwNDAwMDAwMDAwMDAwMSAgICAgICAtPiAxRS0zOTcgICAgICAgICAgICAgICAgIFN1Ym5vcm1hbAorZGVjZDA4MyBhcHBseSAgIDAuMDAwMDAwMDAwMDAwMDAxRS0zODMgIC0+ICMwMDAwMDAwMDAwMDAwMDAxICAgICAgU3Vibm9ybWFsCitkZWNkMDg0IGFwcGx5ICAgIzAwMDAwMDAwMDAwMDAwMDEgICAgICAgLT4gMUUtMzk4ICAgICAgICAgICAgICAgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgc21hbGxlc3QgYWxsLW5pbmVzCitkZWNkMDg1IGFwcGx5ICAgOTk5OTk5OTk5OTk5OTk5OUUtMzk4ICAgLT4gIzY0MDBmZjNmY2ZmM2ZjZmYKK2RlY2QwODYgYXBwbHkgICAjNjQwMGZmM2ZjZmYzZmNmZiAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzCistLSBhbmQgYSBwcm9ibGVtYXRpYyBkaXZpZGUgcmVzdWx0CitkZWNkMDg4IGFwcGx5ICAgMS4xMTExMTExMTExMTExMTFFLTM4MyAgLT4gIzA0MDA5MTI0NDkxMjQ0OTEKK2RlY2QwODkgYXBwbHkgICAjMDQwMDkxMjQ0OTEyNDQ5MSAgICAgICAtPiAxLjExMTExMTExMTExMTExMUUtMzgzCisKKy0tIGZvcnRpZXMKK2RlY2QwOTAgYXBwbHkgICAgICAgIDQwICAgICAgICAgICAgICAgIC0+ICMyMjM4MDAwMDAwMDAwMDQwCitkZWNkMDkxIGFwcGx5ICAgICAgICAzOS45OSAgICAgICAgICAgICAtPiAjMjIzMDAwMDAwMDAwMGNmZgorCistLSB1bmRlcmZsb3dzIGNhbm5vdCBiZSB0ZXN0ZWQgYXMgYWxsIExIUyBleGFjdAorCistLSBTYW1lIGFnYWluLCBuZWdhdGl2ZXMKKy0tIE5tYXggYW5kIHNpbWlsYXIKK2RlY2QxMjIgYXBwbHkgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAjZjdmY2ZmM2ZjZmYzZmNmZgorZGVjZDEyMyBhcHBseSAgICNmN2ZjZmYzZmNmZjNmY2ZmICAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZWNkMTI0IGFwcGx5ICAtMS4yMzQ1Njc4OTAxMjM0NTZFKzM4NCAgLT4gI2M3ZmQzNGI5YzFlMjhlNTYKK2RlY2QxMjUgYXBwbHkgICAjYzdmZDM0YjljMWUyOGU1NiAgICAgICAtPiAtMS4yMzQ1Njc4OTAxMjM0NTZFKzM4NAorLS0gZm9sZC1kb3ducyAobW9yZSBiZWxvdykKK2RlY2QxMzAgYXBwbHkgIC0xLjIzRSszODQgICAgICAgICAgICAgICAtPiAjYzdmZDMwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNkMTMxIGFwcGx5ICAgI2M3ZmQzMDAwMDAwMDAwMDAgICAgICAgLT4gLTEuMjMwMDAwMDAwMDAwMDAwRSszODQKK2RlY2QxMzIgYXBwbHkgIC0xRSszODQgICAgICAgICAgICAgICAgICAtPiAjYzdmYzAwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNkMTMzIGFwcGx5ICAgI2M3ZmMwMDAwMDAwMDAwMDAgICAgICAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRSszODQKKworLS0gb3ZlcmZsb3dzCitkZWNkMTUxIGFwcGx5ICAtMTIzNDUgICAgICAgICAgICAgICAgICAgLT4gI2EyMzgwMDAwMDAwMDQ5YzUKK2RlY2QxNTIgYXBwbHkgICAjYTIzODAwMDAwMDAwNDljNSAgICAgICAtPiAtMTIzNDUKK2RlY2QxNTMgYXBwbHkgIC0xMjM0ICAgICAgICAgICAgICAgICAgICAtPiAjYTIzODAwMDAwMDAwMDUzNAorZGVjZDE1NCBhcHBseSAgICNhMjM4MDAwMDAwMDAwNTM0ICAgICAgIC0+IC0xMjM0CitkZWNkMTU1IGFwcGx5ICAtMTIzICAgICAgICAgICAgICAgICAgICAgLT4gI2EyMzgwMDAwMDAwMDAwYTMKK2RlY2QxNTYgYXBwbHkgICAjYTIzODAwMDAwMDAwMDBhMyAgICAgICAtPiAtMTIzCitkZWNkMTU3IGFwcGx5ICAtMTIgICAgICAgICAgICAgICAgICAgICAgLT4gI2EyMzgwMDAwMDAwMDAwMTIKK2RlY2QxNTggYXBwbHkgICAjYTIzODAwMDAwMDAwMDAxMiAgICAgICAtPiAtMTIKK2RlY2QxNTkgYXBwbHkgIC0xICAgICAgICAgICAgICAgICAgICAgICAtPiAjYTIzODAwMDAwMDAwMDAwMQorZGVjZDE2MCBhcHBseSAgICNhMjM4MDAwMDAwMDAwMDAxICAgICAgIC0+IC0xCitkZWNkMTYxIGFwcGx5ICAtMS4yMyAgICAgICAgICAgICAgICAgICAgLT4gI2EyMzAwMDAwMDAwMDAwYTMKK2RlY2QxNjIgYXBwbHkgICAjYTIzMDAwMDAwMDAwMDBhMyAgICAgICAtPiAtMS4yMworZGVjZDE2MyBhcHBseSAgLTEyMy40NSAgICAgICAgICAgICAgICAgIC0+ICNhMjMwMDAwMDAwMDA0OWM1CitkZWNkMTY0IGFwcGx5ICAgI2EyMzAwMDAwMDAwMDQ5YzUgICAgICAgLT4gLTEyMy40NQorCistLSBObWluIGFuZCBiZWxvdworZGVjZDE3MSBhcHBseSAgLTFFLTM4MyAgICAgICAgICAgICAgICAgIC0+ICM4MDNjMDAwMDAwMDAwMDAxCitkZWNkMTcyIGFwcGx5ICAgIzgwM2MwMDAwMDAwMDAwMDEgICAgICAgLT4gLTFFLTM4MworZGVjZDE3MyBhcHBseSAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0+ICM4NDAwMDAwMDAwMDAwMDAwCitkZWNkMTc0IGFwcGx5ICAgIzg0MDAwMDAwMDAwMDAwMDAgICAgICAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2RlY2QxNzUgYXBwbHkgIC0xLjAwMDAwMDAwMDAwMDAwMUUtMzgzICAtPiAjODQwMDAwMDAwMDAwMDAwMQorZGVjZDE3NiBhcHBseSAgICM4NDAwMDAwMDAwMDAwMDAxICAgICAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMUUtMzgzCisKK2RlY2QxNzcgYXBwbHkgIC0wLjEwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAjODAwMDgwMDAwMDAwMDAwMCAgICAgICBTdWJub3JtYWwKK2RlY2QxNzggYXBwbHkgICAjODAwMDgwMDAwMDAwMDAwMCAgICAgICAtPiAtMS4wMDAwMDAwMDAwMDAwMEUtMzg0ICBTdWJub3JtYWwKK2RlY2QxNzkgYXBwbHkgIC0wLjAwMDAwMDAwMDAwMDAxMEUtMzgzICAtPiAjODAwMDAwMDAwMDAwMDAxMCAgICAgICBTdWJub3JtYWwKK2RlY2QxODAgYXBwbHkgICAjODAwMDAwMDAwMDAwMDAxMCAgICAgICAtPiAtMS4wRS0zOTcgICAgICAgICAgICAgICBTdWJub3JtYWwKK2RlY2QxODEgYXBwbHkgIC0wLjAwMDAwMDAwMDAwMDAxRS0zODMgICAtPiAjODAwNDAwMDAwMDAwMDAwMSAgICAgICBTdWJub3JtYWwKK2RlY2QxODIgYXBwbHkgICAjODAwNDAwMDAwMDAwMDAwMSAgICAgICAtPiAtMUUtMzk3ICAgICAgICAgICAgICAgICBTdWJub3JtYWwKK2RlY2QxODMgYXBwbHkgIC0wLjAwMDAwMDAwMDAwMDAwMUUtMzgzICAtPiAjODAwMDAwMDAwMDAwMDAwMSAgICAgICBTdWJub3JtYWwKK2RlY2QxODQgYXBwbHkgICAjODAwMDAwMDAwMDAwMDAwMSAgICAgICAtPiAtMUUtMzk4ICAgICAgICAgICAgICAgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgc21hbGxlc3QgYWxsLW5pbmVzCitkZWNkMTg1IGFwcGx5ICAgLTk5OTk5OTk5OTk5OTk5OTlFLTM5OCAgIC0+ICNlNDAwZmYzZmNmZjNmY2ZmCitkZWNkMTg2IGFwcGx5ICAgI2U0MDBmZjNmY2ZmM2ZjZmYgICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RS0zODMKKy0tIGFuZCBhIHRyaWNreSBzdWJub3JtYWwKK2RlY2QxODcgYXBwbHkgICAxLjExMTExMTExMTExNTI0RS0zODQgICAgLT4gIzAwMDA5MTI0NDkxMjQ2YTQgICAgICBTdWJub3JtYWwKK2RlY2QxODggYXBwbHkgICAjMDAwMDkxMjQ0OTEyNDZhNCAgICAgICAgLT4gMS4xMTExMTExMTExMTUyNEUtMzg0ICBTdWJub3JtYWwKKworLS0gbmVhci11bmRlcmZsb3dzCitkZWNkMTg5IGFwcGx5ICAgLTFlLTM5OCAgICAgICAgICAgICAgICAgLT4gIzgwMDAwMDAwMDAwMDAwMDEgIFN1Ym5vcm1hbAorZGVjZDE5MCBhcHBseSAgIC0xLjBlLTM5OCAgICAgICAgICAgICAgIC0+ICM4MDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwgUm91bmRlZAorCistLSB6ZXJvcworZGVjZDQwMSBhcHBseSAgIDBFLTUwMCAgICAgICAgICAgICAgICAgIC0+ICMwMDAwMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNkNDAyIGFwcGx5ICAgMEUtNDAwICAgICAgICAgICAgICAgICAgLT4gIzAwMDAwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY2Q0MDMgYXBwbHkgICAwRS0zOTggICAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDAwMDAwMDAwMAorZGVjZDQwNCBhcHBseSAgICMwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDBFLTM5OAorZGVjZDQwNSBhcHBseSAgIDAuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0+ICMwMDAwMDAwMDAwMDAwMDAwCitkZWNkNDA2IGFwcGx5ICAgIzAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMEUtMzk4CitkZWNkNDA3IGFwcGx5ICAgMEUtMiAgICAgICAgICAgICAgICAgICAgLT4gIzIyMzAwMDAwMDAwMDAwMDAKK2RlY2Q0MDggYXBwbHkgICAjMjIzMDAwMDAwMDAwMDAwMCAgICAgICAtPiAwLjAwCitkZWNkNDA5IGFwcGx5ICAgMCAgICAgICAgICAgICAgICAgICAgICAgLT4gIzIyMzgwMDAwMDAwMDAwMDAKK2RlY2Q0MTAgYXBwbHkgICAjMjIzODAwMDAwMDAwMDAwMCAgICAgICAtPiAwCitkZWNkNDExIGFwcGx5ICAgMEUrMyAgICAgICAgICAgICAgICAgICAgLT4gIzIyNDQwMDAwMDAwMDAwMDAKK2RlY2Q0MTIgYXBwbHkgICAjMjI0NDAwMDAwMDAwMDAwMCAgICAgICAtPiAwRSszCitkZWNkNDEzIGFwcGx5ICAgMEUrMzY5ICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAwMDAwMDAKK2RlY2Q0MTQgYXBwbHkgICAjNDNmYzAwMDAwMDAwMDAwMCAgICAgICAtPiAwRSszNjkKKy0tIGNsYW1wZWQgemVyb3MuLi4KK2RlY2Q0MTUgYXBwbHkgICAwRSszNzAgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjZDQxNiBhcHBseSAgICM0M2ZjMDAwMDAwMDAwMDAwICAgICAgIC0+IDBFKzM2OQorZGVjZDQxNyBhcHBseSAgIDBFKzM4NCAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNkNDE4IGFwcGx5ICAgIzQzZmMwMDAwMDAwMDAwMDAgICAgICAgLT4gMEUrMzY5CitkZWNkNDE5IGFwcGx5ICAgMEUrNDAwICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY2Q0MjAgYXBwbHkgICAjNDNmYzAwMDAwMDAwMDAwMCAgICAgICAtPiAwRSszNjkKK2RlY2Q0MjEgYXBwbHkgICAwRSs1MDAgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjZDQyMiBhcHBseSAgICM0M2ZjMDAwMDAwMDAwMDAwICAgICAgIC0+IDBFKzM2OQorCistLSBuZWdhdGl2ZSB6ZXJvcworZGVjZDQzMSBhcHBseSAgIC0wRS00MDAgICAgICAgICAgICAgICAgIC0+ICM4MDAwMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNkNDMyIGFwcGx5ICAgLTBFLTQwMCAgICAgICAgICAgICAgICAgLT4gIzgwMDAwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY2Q0MzMgYXBwbHkgICAtMEUtMzk4ICAgICAgICAgICAgICAgICAtPiAjODAwMDAwMDAwMDAwMDAwMAorZGVjZDQzNCBhcHBseSAgICM4MDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRS0zOTgKK2RlY2Q0MzUgYXBwbHkgICAtMC4wMDAwMDAwMDAwMDAwMDBFLTM4MyAtPiAjODAwMDAwMDAwMDAwMDAwMAorZGVjZDQzNiBhcHBseSAgICM4MDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRS0zOTgKK2RlY2Q0MzcgYXBwbHkgICAtMEUtMiAgICAgICAgICAgICAgICAgICAtPiAjYTIzMDAwMDAwMDAwMDAwMAorZGVjZDQzOCBhcHBseSAgICNhMjMwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wLjAwCitkZWNkNDM5IGFwcGx5ICAgLTAgICAgICAgICAgICAgICAgICAgICAgLT4gI2EyMzgwMDAwMDAwMDAwMDAKK2RlY2Q0NDAgYXBwbHkgICAjYTIzODAwMDAwMDAwMDAwMCAgICAgICAtPiAtMAorZGVjZDQ0MSBhcHBseSAgIC0wRSszICAgICAgICAgICAgICAgICAgIC0+ICNhMjQ0MDAwMDAwMDAwMDAwCitkZWNkNDQyIGFwcGx5ICAgI2EyNDQwMDAwMDAwMDAwMDAgICAgICAgLT4gLTBFKzMKK2RlY2Q0NDMgYXBwbHkgICAtMEUrMzY5ICAgICAgICAgICAgICAgICAtPiAjYzNmYzAwMDAwMDAwMDAwMAorZGVjZDQ0NCBhcHBseSAgICNjM2ZjMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRSszNjkKKy0tIGNsYW1wZWQgemVyb3MuLi4KK2RlY2Q0NDUgYXBwbHkgICAtMEUrMzcwICAgICAgICAgICAgICAgICAtPiAjYzNmYzAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjZDQ0NiBhcHBseSAgICNjM2ZjMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRSszNjkKK2RlY2Q0NDcgYXBwbHkgICAtMEUrMzg0ICAgICAgICAgICAgICAgICAtPiAjYzNmYzAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjZDQ0OCBhcHBseSAgICNjM2ZjMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRSszNjkKK2RlY2Q0NDkgYXBwbHkgICAtMEUrNDAwICAgICAgICAgICAgICAgICAtPiAjYzNmYzAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjZDQ1MCBhcHBseSAgICNjM2ZjMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRSszNjkKK2RlY2Q0NTEgYXBwbHkgICAtMEUrNTAwICAgICAgICAgICAgICAgICAtPiAjYzNmYzAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjZDQ1MiBhcHBseSAgICNjM2ZjMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRSszNjkKKworLS0gZXhwb25lbnRzCitkZWNkNDYwIGFwcGx5ICAgIzIyNWMwMDAwMDAwMDAwMDcgLT4gN0UrOQorZGVjZDQ2MSBhcHBseSAgIDdFKzkgIC0+ICMyMjVjMDAwMDAwMDAwMDA3CitkZWNkNDYyIGFwcGx5ICAgIzIzYzQwMDAwMDAwMDAwMDcgLT4gN0UrOTkKK2RlY2Q0NjMgYXBwbHkgICA3RSs5OSAtPiAjMjNjNDAwMDAwMDAwMDAwNworCistLSBTcGVjaWFscworZGVjZDUwMCBhcHBseSAgIEluZmluaXR5ICAgICAgICAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZWNkNTAxIGFwcGx5ICAgIzc4Nzg3ODc4Nzg3ODc4NzggLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RlY2Q1MDIgYXBwbHkgICAjNzgwMDAwMDAwMDAwMDAwMCAtPiBJbmZpbml0eQorZGVjZDUwMyBhcHBseSAgICM3OTc5Nzk3OTc5Nzk3OTc5IC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZWNkNTA0IGFwcGx5ICAgIzc5MDAwMDAwMDAwMDAwMDAgLT4gSW5maW5pdHkKK2RlY2Q1MDUgYXBwbHkgICAjN2E3YTdhN2E3YTdhN2E3YSAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGVjZDUwNiBhcHBseSAgICM3YTAwMDAwMDAwMDAwMDAwIC0+IEluZmluaXR5CitkZWNkNTA3IGFwcGx5ICAgIzdiN2I3YjdiN2I3YjdiN2IgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RlY2Q1MDggYXBwbHkgICAjN2IwMDAwMDAwMDAwMDAwMCAtPiBJbmZpbml0eQorCitkZWNkNTA5IGFwcGx5ICAgTmFOICAgICAgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwMDAKK2RlY2Q1MTAgYXBwbHkgICAjN2M3YzdjN2M3YzdjN2M3YyAtPiAjN2MwMDdjN2M3YzdjN2M3YworZGVjZDUxMSBhcHBseSAgICM3YzAwMDAwMDAwMDAwMDAwIC0+IE5hTgorZGVjZDUxMiBhcHBseSAgICM3ZDdkN2Q3ZDdkN2Q3ZDdkIC0+ICM3YzAxN2Q3ZDdkN2Q3ZDdkCitkZWNkNTEzIGFwcGx5ICAgIzdkMDAwMDAwMDAwMDAwMDAgLT4gTmFOCitkZWNkNTE0IGFwcGx5ICAgIzdlN2U3ZTdlN2U3ZTdlN2UgLT4gIzdlMDA3ZTdlN2U3ZTdjN2UKK2RlY2Q1MTUgYXBwbHkgICAjN2UwMDAwMDAwMDAwMDAwMCAtPiBzTmFOCitkZWNkNTE2IGFwcGx5ICAgIzdmN2Y3ZjdmN2Y3ZjdmN2YgLT4gIzdlMDA3ZjdmN2Y3ZjdjN2YKK2RlY2Q1MTcgYXBwbHkgICAjN2YwMDAwMDAwMDAwMDAwMCAtPiBzTmFOCitkZWNkNTE4IGFwcGx5ICAgIzdmZmZmZmZmZmZmZmZmZmYgLT4gc05hTjk5OTk5OTk5OTk5OTk5OQorZGVjZDUxOSBhcHBseSAgICM3ZmZmZmZmZmZmZmZmZmZmIC0+ICM3ZTAwZmYzZmNmZjNmY2ZmCisKK2RlY2Q1MjAgYXBwbHkgICAtSW5maW5pdHkgICAgICAgICAtPiAjZjgwMDAwMDAwMDAwMDAwMAorZGVjZDUyMSBhcHBseSAgICNmODc4Nzg3ODc4Nzg3ODc4IC0+ICNmODAwMDAwMDAwMDAwMDAwCitkZWNkNTIyIGFwcGx5ICAgI2Y4MDAwMDAwMDAwMDAwMDAgLT4gLUluZmluaXR5CitkZWNkNTIzIGFwcGx5ICAgI2Y5Nzk3OTc5Nzk3OTc5NzkgLT4gI2Y4MDAwMDAwMDAwMDAwMDAKK2RlY2Q1MjQgYXBwbHkgICAjZjkwMDAwMDAwMDAwMDAwMCAtPiAtSW5maW5pdHkKK2RlY2Q1MjUgYXBwbHkgICAjZmE3YTdhN2E3YTdhN2E3YSAtPiAjZjgwMDAwMDAwMDAwMDAwMAorZGVjZDUyNiBhcHBseSAgICNmYTAwMDAwMDAwMDAwMDAwIC0+IC1JbmZpbml0eQorZGVjZDUyNyBhcHBseSAgICNmYjdiN2I3YjdiN2I3YjdiIC0+ICNmODAwMDAwMDAwMDAwMDAwCitkZWNkNTI4IGFwcGx5ICAgI2ZiMDAwMDAwMDAwMDAwMDAgLT4gLUluZmluaXR5CisKK2RlY2Q1MjkgYXBwbHkgICAtTmFOICAgICAgICAgICAgICAtPiAjZmMwMDAwMDAwMDAwMDAwMAorZGVjZDUzMCBhcHBseSAgICNmYzdjN2M3YzdjN2M3YzdjIC0+ICNmYzAwN2M3YzdjN2M3YzdjCitkZWNkNTMxIGFwcGx5ICAgI2ZjMDAwMDAwMDAwMDAwMDAgLT4gLU5hTgorZGVjZDUzMiBhcHBseSAgICNmZDdkN2Q3ZDdkN2Q3ZDdkIC0+ICNmYzAxN2Q3ZDdkN2Q3ZDdkCitkZWNkNTMzIGFwcGx5ICAgI2ZkMDAwMDAwMDAwMDAwMDAgLT4gLU5hTgorZGVjZDUzNCBhcHBseSAgICNmZTdlN2U3ZTdlN2U3ZTdlIC0+ICNmZTAwN2U3ZTdlN2U3YzdlCitkZWNkNTM1IGFwcGx5ICAgI2ZlMDAwMDAwMDAwMDAwMDAgLT4gLXNOYU4KK2RlY2Q1MzYgYXBwbHkgICAjZmY3ZjdmN2Y3ZjdmN2Y3ZiAtPiAjZmUwMDdmN2Y3ZjdmN2M3ZgorZGVjZDUzNyBhcHBseSAgICNmZjAwMDAwMDAwMDAwMDAwIC0+IC1zTmFOCitkZWNkNTM4IGFwcGx5ICAgI2ZmZmZmZmZmZmZmZmZmZmYgLT4gLXNOYU45OTk5OTk5OTk5OTk5OTkKK2RlY2Q1MzkgYXBwbHkgICAjZmZmZmZmZmZmZmZmZmZmZiAtPiAjZmUwMGZmM2ZjZmYzZmNmZgorCistLSBkaWFnbm9zdGljIE5hTnMKK2RlY2Q1NDAgYXBwbHkgICBOYU4gICAgICAgICAgICAgICAgIC0+ICM3YzAwMDAwMDAwMDAwMDAwCitkZWNkNTQxIGFwcGx5ICAgTmFOMCAgICAgICAgICAgICAgICAtPiAjN2MwMDAwMDAwMDAwMDAwMAorZGVjZDU0MiBhcHBseSAgIE5hTjEgICAgICAgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwMDEKK2RlY2Q1NDMgYXBwbHkgICBOYU4xMiAgICAgICAgICAgICAgIC0+ICM3YzAwMDAwMDAwMDAwMDEyCitkZWNkNTQ0IGFwcGx5ICAgTmFONzkgICAgICAgICAgICAgICAtPiAjN2MwMDAwMDAwMDAwMDA3OQorZGVjZDU0NSBhcHBseSAgIE5hTjEyMzQ1ICAgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDQ5YzUKK2RlY2Q1NDYgYXBwbHkgICBOYU4xMjM0NTYgICAgICAgICAgIC0+ICM3YzAwMDAwMDAwMDI4ZTU2CitkZWNkNTQ3IGFwcGx5ICAgTmFONzk5Nzk5ICAgICAgICAgICAtPiAjN2MwMDAwMDAwMDBmN2ZkZgorZGVjZDU0OCBhcHBseSAgIE5hTjc5OTc5OTc5OTc5OTc5OSAgLT4gIzdjMDNkZmY3ZmRmZjdmZGYKK2RlY2Q1NDkgYXBwbHkgICBOYU45OTk5OTk5OTk5OTk5OTkgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCistLSB0b28gbWFueSBkaWdpdHMKKworLS0gZm9sZC1kb3duIGZ1bGwgc2VxdWVuY2UKK2RlY2Q2MDEgYXBwbHkgICAxRSszODQgICAgICAgICAgICAgICAgICAtPiAjNDdmYzAwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNkNjAyIGFwcGx5ICAgIzQ3ZmMwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzM4NAorZGVjZDYwMyBhcHBseSAgIDFFKzM4MyAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjODAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY2Q2MDQgYXBwbHkgICAjNDNmYzgwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwRSszODMKK2RlY2Q2MDUgYXBwbHkgICAxRSszODIgICAgICAgICAgICAgICAgICAtPiAjNDNmYzEwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNkNjA2IGFwcGx5ICAgIzQzZmMxMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwRSszODIKK2RlY2Q2MDcgYXBwbHkgICAxRSszODEgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAxMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNkNjA4IGFwcGx5ICAgIzQzZmMwMTAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDBFKzM4MQorZGVjZDYwOSBhcHBseSAgIDFFKzM4MCAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjMDAyMDAwMDAwMDAwIENsYW1wZWQKK2RlY2Q2MTAgYXBwbHkgICAjNDNmYzAwMjAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwRSszODAKK2RlY2Q2MTEgYXBwbHkgICAxRSszNzkgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDQwMDAwMDAwMCBDbGFtcGVkCitkZWNkNjEyIGFwcGx5ICAgIzQzZmMwMDA0MDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwRSszNzkKK2RlY2Q2MTMgYXBwbHkgICAxRSszNzggICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDA0MDAwMDAwMCBDbGFtcGVkCitkZWNkNjE0IGFwcGx5ICAgIzQzZmMwMDAwNDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDBFKzM3OAorZGVjZDYxNSBhcHBseSAgIDFFKzM3NyAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjMDAwMDA4MDAwMDAwIENsYW1wZWQKK2RlY2Q2MTYgYXBwbHkgICAjNDNmYzAwMDAwODAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwRSszNzcKK2RlY2Q2MTcgYXBwbHkgICAxRSszNzYgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMTAwMDAwMCBDbGFtcGVkCitkZWNkNjE4IGFwcGx5ICAgIzQzZmMwMDAwMDEwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwRSszNzYKK2RlY2Q2MTkgYXBwbHkgICAxRSszNzUgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDEwMDAwMCBDbGFtcGVkCitkZWNkNjIwIGFwcGx5ICAgIzQzZmMwMDAwMDAxMDAwMDAgICAgICAgLT4gMS4wMDAwMDBFKzM3NQorZGVjZDYyMSBhcHBseSAgIDFFKzM3NCAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjMDAwMDAwMDIwMDAwIENsYW1wZWQKK2RlY2Q2MjIgYXBwbHkgICAjNDNmYzAwMDAwMDAyMDAwMCAgICAgICAtPiAxLjAwMDAwRSszNzQKK2RlY2Q2MjMgYXBwbHkgICAxRSszNzMgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwNDAwMCBDbGFtcGVkCitkZWNkNjI0IGFwcGx5ICAgIzQzZmMwMDAwMDAwMDQwMDAgICAgICAgLT4gMS4wMDAwRSszNzMKK2RlY2Q2MjUgYXBwbHkgICAxRSszNzIgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwMDQwMCBDbGFtcGVkCitkZWNkNjI2IGFwcGx5ICAgIzQzZmMwMDAwMDAwMDA0MDAgICAgICAgLT4gMS4wMDBFKzM3MgorZGVjZDYyNyBhcHBseSAgIDFFKzM3MSAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjMDAwMDAwMDAwMDgwIENsYW1wZWQKK2RlY2Q2MjggYXBwbHkgICAjNDNmYzAwMDAwMDAwMDA4MCAgICAgICAtPiAxLjAwRSszNzEKK2RlY2Q2MjkgYXBwbHkgICAxRSszNzAgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwMDAxMCBDbGFtcGVkCitkZWNkNjMwIGFwcGx5ICAgIzQzZmMwMDAwMDAwMDAwMTAgICAgICAgLT4gMS4wRSszNzAKK2RlY2Q2MzEgYXBwbHkgICAxRSszNjkgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwMDAwMQorZGVjZDYzMiBhcHBseSAgICM0M2ZjMDAwMDAwMDAwMDAxICAgICAgIC0+IDFFKzM2OQorZGVjZDYzMyBhcHBseSAgIDFFKzM2OCAgICAgICAgICAgICAgICAgIC0+ICM0M2Y4MDAwMDAwMDAwMDAxCitkZWNkNjM0IGFwcGx5ICAgIzQzZjgwMDAwMDAwMDAwMDEgICAgICAgLT4gMUUrMzY4CistLSBzYW1lIHdpdGggOXMKK2RlY2Q2NDEgYXBwbHkgICA5RSszODQgICAgICAgICAgICAgICAgICAtPiAjNzdmYzAwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNkNjQyIGFwcGx5ICAgIzc3ZmMwMDAwMDAwMDAwMDAgICAgICAgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NAorZGVjZDY0MyBhcHBseSAgIDlFKzM4MyAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjOGMwMDAwMDAwMDAwIENsYW1wZWQKK2RlY2Q2NDQgYXBwbHkgICAjNDNmYzhjMDAwMDAwMDAwMCAgICAgICAtPiA5LjAwMDAwMDAwMDAwMDAwRSszODMKK2RlY2Q2NDUgYXBwbHkgICA5RSszODIgICAgICAgICAgICAgICAgICAtPiAjNDNmYzFhMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNkNjQ2IGFwcGx5ICAgIzQzZmMxYTAwMDAwMDAwMDAgICAgICAgLT4gOS4wMDAwMDAwMDAwMDAwRSszODIKK2RlY2Q2NDcgYXBwbHkgICA5RSszODEgICAgICAgICAgICAgICAgICAtPiAjNDNmYzA5MDAwMDAwMDAwMCBDbGFtcGVkCitkZWNkNjQ4IGFwcGx5ICAgIzQzZmMwOTAwMDAwMDAwMDAgICAgICAgLT4gOS4wMDAwMDAwMDAwMDBFKzM4MQorZGVjZDY0OSBhcHBseSAgIDlFKzM4MCAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjMDAyMzAwMDAwMDAwIENsYW1wZWQKK2RlY2Q2NTAgYXBwbHkgICAjNDNmYzAwMjMwMDAwMDAwMCAgICAgICAtPiA5LjAwMDAwMDAwMDAwRSszODAKK2RlY2Q2NTEgYXBwbHkgICA5RSszNzkgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDY4MDAwMDAwMCBDbGFtcGVkCitkZWNkNjUyIGFwcGx5ICAgIzQzZmMwMDA2ODAwMDAwMDAgICAgICAgLT4gOS4wMDAwMDAwMDAwRSszNzkKK2RlY2Q2NTMgYXBwbHkgICA5RSszNzggICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDI0MDAwMDAwMCBDbGFtcGVkCitkZWNkNjU0IGFwcGx5ICAgIzQzZmMwMDAyNDAwMDAwMDAgICAgICAgLT4gOS4wMDAwMDAwMDBFKzM3OAorZGVjZDY1NSBhcHBseSAgIDlFKzM3NyAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjMDAwMDA4YzAwMDAwIENsYW1wZWQKK2RlY2Q2NTYgYXBwbHkgICAjNDNmYzAwMDAwOGMwMDAwMCAgICAgICAtPiA5LjAwMDAwMDAwRSszNzcKK2RlY2Q2NTcgYXBwbHkgICA5RSszNzYgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMWEwMDAwMCBDbGFtcGVkCitkZWNkNjU4IGFwcGx5ICAgIzQzZmMwMDAwMDFhMDAwMDAgICAgICAgLT4gOS4wMDAwMDAwRSszNzYKK2RlY2Q2NTkgYXBwbHkgICA5RSszNzUgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDkwMDAwMCBDbGFtcGVkCitkZWNkNjYwIGFwcGx5ICAgIzQzZmMwMDAwMDA5MDAwMDAgICAgICAgLT4gOS4wMDAwMDBFKzM3NQorZGVjZDY2MSBhcHBseSAgIDlFKzM3NCAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjMDAwMDAwMDIzMDAwIENsYW1wZWQKK2RlY2Q2NjIgYXBwbHkgICAjNDNmYzAwMDAwMDAyMzAwMCAgICAgICAtPiA5LjAwMDAwRSszNzQKK2RlY2Q2NjMgYXBwbHkgICA5RSszNzMgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwNjgwMCBDbGFtcGVkCitkZWNkNjY0IGFwcGx5ICAgIzQzZmMwMDAwMDAwMDY4MDAgICAgICAgLT4gOS4wMDAwRSszNzMKK2RlY2Q2NjUgYXBwbHkgICA5RSszNzIgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwMjQwMCBDbGFtcGVkCitkZWNkNjY2IGFwcGx5ICAgIzQzZmMwMDAwMDAwMDI0MDAgICAgICAgLT4gOS4wMDBFKzM3MgorZGVjZDY2NyBhcHBseSAgIDlFKzM3MSAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjMDAwMDAwMDAwMDhjIENsYW1wZWQKK2RlY2Q2NjggYXBwbHkgICAjNDNmYzAwMDAwMDAwMDA4YyAgICAgICAtPiA5LjAwRSszNzEKK2RlY2Q2NjkgYXBwbHkgICA5RSszNzAgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwMDAxYSBDbGFtcGVkCitkZWNkNjcwIGFwcGx5ICAgIzQzZmMwMDAwMDAwMDAwMWEgICAgICAgLT4gOS4wRSszNzAKK2RlY2Q2NzEgYXBwbHkgICA5RSszNjkgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwMDAwOQorZGVjZDY3MiBhcHBseSAgICM0M2ZjMDAwMDAwMDAwMDA5ICAgICAgIC0+IDlFKzM2OQorZGVjZDY3MyBhcHBseSAgIDlFKzM2OCAgICAgICAgICAgICAgICAgIC0+ICM0M2Y4MDAwMDAwMDAwMDA5CitkZWNkNjc0IGFwcGx5ICAgIzQzZjgwMDAwMDAwMDAwMDkgICAgICAgLT4gOUUrMzY4CisKKworLS0gU2VsZWN0ZWQgRFBEIGNvZGVzCitkZWNkNzAwIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwMDAgICAgICAgLT4gMAorZGVjZDcwMSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDA5ICAgICAgIC0+IDkKK2RlY2Q3MDIgYXBwbHkgICAjMjIzODAwMDAwMDAwMDAxMCAgICAgICAtPiAxMAorZGVjZDcwMyBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDE5ICAgICAgIC0+IDE5CitkZWNkNzA0IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwMjAgICAgICAgLT4gMjAKK2RlY2Q3MDUgYXBwbHkgICAjMjIzODAwMDAwMDAwMDAyOSAgICAgICAtPiAyOQorZGVjZDcwNiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDMwICAgICAgIC0+IDMwCitkZWNkNzA3IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwMzkgICAgICAgLT4gMzkKK2RlY2Q3MDggYXBwbHkgICAjMjIzODAwMDAwMDAwMDA0MCAgICAgICAtPiA0MAorZGVjZDcwOSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDQ5ICAgICAgIC0+IDQ5CitkZWNkNzEwIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwNTAgICAgICAgLT4gNTAKK2RlY2Q3MTEgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA1OSAgICAgICAtPiA1OQorZGVjZDcxMiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDYwICAgICAgIC0+IDYwCitkZWNkNzEzIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwNjkgICAgICAgLT4gNjkKK2RlY2Q3MTQgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA3MCAgICAgICAtPiA3MAorZGVjZDcxNSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDcxICAgICAgIC0+IDcxCitkZWNkNzE2IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwNzIgICAgICAgLT4gNzIKK2RlY2Q3MTcgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA3MyAgICAgICAtPiA3MworZGVjZDcxOCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDc0ICAgICAgIC0+IDc0CitkZWNkNzE5IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwNzUgICAgICAgLT4gNzUKK2RlY2Q3MjAgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA3NiAgICAgICAtPiA3NgorZGVjZDcyMSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDc3ICAgICAgIC0+IDc3CitkZWNkNzIyIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwNzggICAgICAgLT4gNzgKK2RlY2Q3MjMgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA3OSAgICAgICAtPiA3OQorCitkZWNkNzI1IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAyOWUgICAgICAgLT4gOTk0CitkZWNkNzI2IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAyOWYgICAgICAgLT4gOTk1CitkZWNkNzI3IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAyYTAgICAgICAgLT4gNTIwCitkZWNkNzI4IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAyYTEgICAgICAgLT4gNTIxCistLSBmcm9tIHRlbGNvIHRlc3QgZGF0YQorZGVjZDczMCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMTg4ICAgICAgIC0+IDMwOAorZGVjZDczMSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMWEzICAgICAgIC0+IDMyMworZGVjZDczMiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDJhICAgICAgIC0+ICA4MgorZGVjZDczMyBhcHBseSAgICMyMjM4MDAwMDAwMDAwMWE5ICAgICAgIC0+IDMyOQorZGVjZDczNCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDgxICAgICAgIC0+IDEwMQorZGVjZDczNSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMmEyICAgICAgIC0+IDUyMgorCistLSBEUEQ6IG9uZSBvZiBlYWNoIG9mIHRoZSBodWZmbWFuIGdyb3VwcworZGVjZDc0MCBhcHBseSAgICMyMjM4MDAwMDAwMDAwM2Y3ICAgICAgIC0+IDc3NworZGVjZDc0MSBhcHBseSAgICMyMjM4MDAwMDAwMDAwM2Y4ICAgICAgIC0+IDc3OAorZGVjZDc0MiBhcHBseSAgICMyMjM4MDAwMDAwMDAwM2ViICAgICAgIC0+IDc4NworZGVjZDc0MyBhcHBseSAgICMyMjM4MDAwMDAwMDAwMzdkICAgICAgIC0+IDg3NworZGVjZDc0NCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMzlmICAgICAgIC0+IDk5NworZGVjZDc0NSBhcHBseSAgICMyMjM4MDAwMDAwMDAwM2JmICAgICAgIC0+IDk3OQorZGVjZDc0NiBhcHBseSAgICMyMjM4MDAwMDAwMDAwM2RmICAgICAgIC0+IDc5OQorZGVjZDc0NyBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDZlICAgICAgIC0+IDg4OAorCistLSBEUEQgYWxsLWhpZ2hzIGNhc2VzIChpbmNsdWRlcyB0aGUgMjQgcmVkdW5kYW50IGNvZGVzKQorZGVjZDc1MCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDZlICAgICAgIC0+IDg4OAorZGVjZDc1MSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMTZlICAgICAgIC0+IDg4OAorZGVjZDc1MiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMjZlICAgICAgIC0+IDg4OAorZGVjZDc1MyBhcHBseSAgICMyMjM4MDAwMDAwMDAwMzZlICAgICAgIC0+IDg4OAorZGVjZDc1NCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDZmICAgICAgIC0+IDg4OQorZGVjZDc1NSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMTZmICAgICAgIC0+IDg4OQorZGVjZDc1NiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMjZmICAgICAgIC0+IDg4OQorZGVjZDc1NyBhcHBseSAgICMyMjM4MDAwMDAwMDAwMzZmICAgICAgIC0+IDg4OQorCitkZWNkNzYwIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwN2UgICAgICAgLT4gODk4CitkZWNkNzYxIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAxN2UgICAgICAgLT4gODk4CitkZWNkNzYyIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAyN2UgICAgICAgLT4gODk4CitkZWNkNzYzIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAzN2UgICAgICAgLT4gODk4CitkZWNkNzY0IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwN2YgICAgICAgLT4gODk5CitkZWNkNzY1IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAxN2YgICAgICAgLT4gODk5CitkZWNkNzY2IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAyN2YgICAgICAgLT4gODk5CitkZWNkNzY3IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAzN2YgICAgICAgLT4gODk5CisKK2RlY2Q3NzAgYXBwbHkgICAjMjIzODAwMDAwMDAwMDBlZSAgICAgICAtPiA5ODgKK2RlY2Q3NzEgYXBwbHkgICAjMjIzODAwMDAwMDAwMDFlZSAgICAgICAtPiA5ODgKK2RlY2Q3NzIgYXBwbHkgICAjMjIzODAwMDAwMDAwMDJlZSAgICAgICAtPiA5ODgKK2RlY2Q3NzMgYXBwbHkgICAjMjIzODAwMDAwMDAwMDNlZSAgICAgICAtPiA5ODgKK2RlY2Q3NzQgYXBwbHkgICAjMjIzODAwMDAwMDAwMDBlZiAgICAgICAtPiA5ODkKK2RlY2Q3NzUgYXBwbHkgICAjMjIzODAwMDAwMDAwMDFlZiAgICAgICAtPiA5ODkKK2RlY2Q3NzYgYXBwbHkgICAjMjIzODAwMDAwMDAwMDJlZiAgICAgICAtPiA5ODkKK2RlY2Q3NzcgYXBwbHkgICAjMjIzODAwMDAwMDAwMDNlZiAgICAgICAtPiA5ODkKKworZGVjZDc4MCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMGZlICAgICAgIC0+IDk5OAorZGVjZDc4MSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMWZlICAgICAgIC0+IDk5OAorZGVjZDc4MiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMmZlICAgICAgIC0+IDk5OAorZGVjZDc4MyBhcHBseSAgICMyMjM4MDAwMDAwMDAwM2ZlICAgICAgIC0+IDk5OAorZGVjZDc4NCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMGZmICAgICAgIC0+IDk5OQorZGVjZDc4NSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMWZmICAgICAgIC0+IDk5OQorZGVjZDc4NiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMmZmICAgICAgIC0+IDk5OQorZGVjZDc4NyBhcHBseSAgICMyMjM4MDAwMDAwMDAwM2ZmICAgICAgIC0+IDk5OQorCistLSB2YWx1ZXMgYXJvdW5kIFt1XWludDMyIGVkZ2VzICh6ZXJvcyBkb25lIGVhcmxpZXIpCitkZWNkODAwIGFwcGx5IC0yMTQ3NDgzNjQ2ICAtPiAjYTIzODAwMDA4Yzc4YWY0NgorZGVjZDgwMSBhcHBseSAtMjE0NzQ4MzY0NyAgLT4gI2EyMzgwMDAwOGM3OGFmNDcKK2RlY2Q4MDIgYXBwbHkgLTIxNDc0ODM2NDggIC0+ICNhMjM4MDAwMDhjNzhhZjQ4CitkZWNkODAzIGFwcGx5IC0yMTQ3NDgzNjQ5ICAtPiAjYTIzODAwMDA4Yzc4YWY0OQorZGVjZDgwNCBhcHBseSAgMjE0NzQ4MzY0NiAgLT4gIzIyMzgwMDAwOGM3OGFmNDYKK2RlY2Q4MDUgYXBwbHkgIDIxNDc0ODM2NDcgIC0+ICMyMjM4MDAwMDhjNzhhZjQ3CitkZWNkODA2IGFwcGx5ICAyMTQ3NDgzNjQ4ICAtPiAjMjIzODAwMDA4Yzc4YWY0OAorZGVjZDgwNyBhcHBseSAgMjE0NzQ4MzY0OSAgLT4gIzIyMzgwMDAwOGM3OGFmNDkKK2RlY2Q4MDggYXBwbHkgIDQyOTQ5NjcyOTQgIC0+ICMyMjM4MDAwMTE1YWZiNTVhCitkZWNkODA5IGFwcGx5ICA0Mjk0OTY3Mjk1ICAtPiAjMjIzODAwMDExNWFmYjU1YgorZGVjZDgxMCBhcHBseSAgNDI5NDk2NzI5NiAgLT4gIzIyMzgwMDAxMTVhZmI1N2EKK2RlY2Q4MTEgYXBwbHkgIDQyOTQ5NjcyOTcgIC0+ICMyMjM4MDAwMTE1YWZiNTdiCisKK2RlY2Q4MjAgYXBwbHkgICNhMjM4MDAwMDhjNzhhZjQ2IC0+IC0yMTQ3NDgzNjQ2CitkZWNkODIxIGFwcGx5ICAjYTIzODAwMDA4Yzc4YWY0NyAtPiAtMjE0NzQ4MzY0NworZGVjZDgyMiBhcHBseSAgI2EyMzgwMDAwOGM3OGFmNDggLT4gLTIxNDc0ODM2NDgKK2RlY2Q4MjMgYXBwbHkgICNhMjM4MDAwMDhjNzhhZjQ5IC0+IC0yMTQ3NDgzNjQ5CitkZWNkODI0IGFwcGx5ICAjMjIzODAwMDA4Yzc4YWY0NiAtPiAgMjE0NzQ4MzY0NgorZGVjZDgyNSBhcHBseSAgIzIyMzgwMDAwOGM3OGFmNDcgLT4gIDIxNDc0ODM2NDcKK2RlY2Q4MjYgYXBwbHkgICMyMjM4MDAwMDhjNzhhZjQ4IC0+ICAyMTQ3NDgzNjQ4CitkZWNkODI3IGFwcGx5ICAjMjIzODAwMDA4Yzc4YWY0OSAtPiAgMjE0NzQ4MzY0OQorZGVjZDgyOCBhcHBseSAgIzIyMzgwMDAxMTVhZmI1NWEgLT4gIDQyOTQ5NjcyOTQKK2RlY2Q4MjkgYXBwbHkgICMyMjM4MDAwMTE1YWZiNTViIC0+ICA0Mjk0OTY3Mjk1CitkZWNkODMwIGFwcGx5ICAjMjIzODAwMDExNWFmYjU3YSAtPiAgNDI5NDk2NzI5NgorZGVjZDgzMSBhcHBseSAgIzIyMzgwMDAxMTVhZmI1N2IgLT4gIDQyOTQ5NjcyOTcKKworLS0gZm9yIG5hcnJvd2luZworZGVjZDg0MCBhcHBseSAgIzI4NzAwMDAwMDAwMDAwMDAgLT4gIDIuMDAwMDAwMDAwMDAwMDAwRS05OQorCistLSBzb21lIG1pc2NlbGxhbmVvdXMKK2RlY2Q4NTAgYXBwbHkgICMwMDA0MDcwMDAwMDAwMDAwIC0+IDcuMDAwMDAwMDAwMDAwRS0zODUgIFN1Ym5vcm1hbAorZGVjZDg1MSBhcHBseSAgIzAwMDgwMDAwMDAwMjAwMDAgLT4gMS4wMDAwMEUtMzkxICAgICAgICAgU3Vibm9ybWFsCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRGTUEuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRGTUEuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWU5MmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZEZNQS5kZWNUZXN0CkBAIC0wLDAgKzEsMTY5OCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZEZNQS5kZWNUZXN0IC0tIGRlY0RvdWJsZSBGdXNlZCBNdWx0aXBseSBBZGQgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBUaGVzZSB0ZXN0cyBjb21wcmVzZSB0aHJlZSBwYXJ0czoKKy0tICAgMS4gU2FuaXR5IGNoZWNrcyBhbmQgb3RoZXIgdGhyZWUtb3BlcmFuZCB0ZXN0cyAoZXNwZWNpYWxseSB0aG9zZQorLS0gICAgICB3aGVyZSB0aGUgZnVzZWQgb3BlcmF0aW9uIG1ha2VzIGEgZGlmZmVyZW5jZSkKKy0tICAgMi4gTXVsdGlwbHkgdGVzdHMgKHRoaXJkIG9wZXJhbmQgaXMgbmV1dHJhbCB6ZXJvIFswRStlbWF4XSkKKy0tICAgMy4gQWRkaXRpb24gdGVzdHMgKGZpcnN0IG9wZXJhbmQgaXMgMSkKKy0tIFRoZSBtdWx0aXBseSBhbmQgYWRkaXRpb24gdGVzdHMgYXJlIGV4dGVuc2l2ZSBiZWNhdXNlIEZNQSBtYXkgaGF2ZQorLS0gaXRzIG93biBkZWRpY2F0ZWQgbXVsdGlwbGljYXRpb24gb3IgYWRkaXRpb24gcm91dGluZShzKSwgYW5kIHRoZXkKKy0tIGFsc28gaW5oZXJlbnRseSBjaGVjayB0aGUgbGVmdC10by1yaWdodCBwcm9wZXJ0aWVzLgorCistLSBTYW5pdHkgY2hlY2tzCitkZGZtYTAwMDEgZm1hICAxICAgMSAgIDEgLT4gICAyCitkZGZtYTAwMDIgZm1hICAxICAgMSAgIDIgLT4gICAzCitkZGZtYTAwMDMgZm1hICAyICAgMiAgIDMgLT4gICA3CitkZGZtYTAwMDQgZm1hICA5ICAgOSAgIDkgLT4gIDkwCitkZGZtYTAwMDUgZm1hIC0xICAgMSAgIDEgLT4gICAwCitkZGZtYTAwMDYgZm1hIC0xICAgMSAgIDIgLT4gICAxCitkZGZtYTAwMDcgZm1hIC0yICAgMiAgIDMgLT4gIC0xCitkZGZtYTAwMDggZm1hIC05ICAgOSAgIDkgLT4gLTcyCitkZGZtYTAwMTEgZm1hICAxICAtMSAgIDEgLT4gICAwCitkZGZtYTAwMTIgZm1hICAxICAtMSAgIDIgLT4gICAxCitkZGZtYTAwMTMgZm1hICAyICAtMiAgIDMgLT4gIC0xCitkZGZtYTAwMTQgZm1hICA5ICAtOSAgIDkgLT4gLTcyCitkZGZtYTAwMTUgZm1hICAxICAgMSAgLTEgLT4gICAwCitkZGZtYTAwMTYgZm1hICAxICAgMSAgLTIgLT4gIC0xCitkZGZtYTAwMTcgZm1hICAyICAgMiAgLTMgLT4gICAxCitkZGZtYTAwMTggZm1hICA5ICAgOSAgLTkgLT4gIDcyCisKKy0tIG5vbi1pbnRlZ2VyIGV4YWN0cworZGRmbWEwMTAwICBmbWEgICAgMjUuMiAgIDYzLjYgICAtNDM4ICAtPiAgMTE2NC43MgorZGRmbWEwMTAxICBmbWEgICAwLjMwMSAgMC4zODAgICAgMzM0ICAtPiAgMzM0LjExNDM4MAorZGRmbWEwMTAyICBmbWEgICAgNDkuMiAgIC00LjggICAyMy4zICAtPiAgLTIxMi44NgorZGRmbWEwMTAzICBmbWEgICAgNC4yMiAgMC4wNzkgIC05NC42ICAtPiAgLTk0LjI2NjYyCitkZGZtYTAxMDQgIGZtYSAgICAgOTAzICAwLjc5NyAgMC44ODcgIC0+ICA3MjAuNTc4CitkZGZtYTAxMDUgIGZtYSAgICA2LjEzICAgLTE2MSAgIDY1LjkgIC0+ICAtOTIxLjAzCitkZGZtYTAxMDYgIGZtYSAgICAyOC4yICAgIDcyNyAgIDUuNDUgIC0+ICAyMDUwNi44NQorZGRmbWEwMTA3ICBmbWEgICAgICAgNCAgICA2MDUgICAgNjg4ICAtPiAgMzEwOAorZGRmbWEwMTA4ICBmbWEgICAgOTMuMyAgIDAuMTkgIDAuMjI2ICAtPiAgMTcuOTUzCitkZGZtYTAxMDkgIGZtYSAgIDAuMTY5ICAgLTM0MSAgIDUuNjEgIC0+ICAtNTIuMDE5CitkZGZtYTAxMTAgIGZtYSAgIC03Mi4yICAgICAzMCAgLTUxLjIgIC0+ICAtMjIxNy4yCitkZGZtYTAxMTEgIGZtYSAgLTAuNDA5ICAgICAxMyAgIDIwLjQgIC0+ICAxNS4wODMKK2RkZm1hMDExMiAgZm1hICAgICAzMTcgICA3Ny4wICAgMTkuMCAgLT4gIDI0NDI4LjAKK2RkZm1hMDExMyAgZm1hICAgICAgNDcgICA2LjU4ICAgMS42MiAgLT4gIDMxMC44OAorZGRmbWEwMTE0ICBmbWEgICAgMS4zNiAgMC45ODQgIDAuNDkzICAtPiAgMS44MzEyNAorZGRmbWEwMTE1ICBmbWEgICAgNzIuNyAgICAyNzQgICAxLjU2ICAtPiAgMTk5MjEuMzYKK2RkZm1hMDExNiAgZm1hICAgICAzMzUgICAgODQ3ICAgICA4MyAgLT4gIDI4MzgyOAorZGRmbWEwMTE3ICBmbWEgICAgIDY2NiAgMC4yNDcgICAyNS40ICAtPiAgMTg5LjkwMgorZGRmbWEwMTE4ICBmbWEgICAtMy44NyAgIDMuMDYgICA3OC4wICAtPiAgNjYuMTU3OAorZGRmbWEwMTE5ICBmbWEgICAwLjc0MiAgICAxOTIgICAzNS42ICAtPiAgMTc4LjA2NAorZGRmbWEwMTIwICBmbWEgICAtOTEuNiAgIDUuMjkgIDAuMTUzICAtPiAgLTQ4NC40MTEKKworLS0gY2FzZXMgd2hlcmUgcmVzdWx0IGlzIGRpZmZlcmVudCBmcm9tIHNlcGFyYXRlIG11bHRpcGx5ICsgYWRkOyBlYWNoCistLSBpcyBwcmVjZWRlZCBieSB0aGUgcmVzdWx0IG9mIHVuZnVzZWQgbXVsdGlwbHkgYW5kIGFkZAorLS0gW3RoaXMgaXMgYWJvdXQgMjAlIG9mIGFsbCBzaW1pbGFyICBjYXNlcyBpbiBnZW5lcmFsXQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDcuMTIzMzU2NDI5MjU3OTY5RSsxNgorZGRmbWEwMjAxICBmbWEgICAgICAgMjc1ODM0ODkuNjY0NSAgICAgIDI1ODI0NzEwNzguMDQgICAgICAyNTkzMTgzLjQyMzcxICAtPiAgNy4xMjMzNTY0MjkyNTc5NzBFKzE2ICBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAyMjgxMzI3NTMyOC44MDUwNgorZGRmbWEwMjA4ICBmbWEgICAgICAgIDI0MjgwLjM1NTU2NiAgICAgIDkzOTU3Ny4zOTc2NTMgICAgICAgIDIwMzIuMDEzMjUyICAtPiAgMjI4MTMyNzUzMjguODA1MDcgICAgICBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAtMi4wMzAzOTc3MzQyNzgwNjJFKzE2CitkZGZtYTAyMDkgIGZtYSAgICAgICAgICA3ODQ4OTc2NDMyICAgICAgLTI1ODY4MzEuMjI4MSAgICAgIDEzNzkwMy41MTc5MDkgIC0+ICAtMi4wMzAzOTc3MzQyNzgwNjFFKzE2IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDIwNDA3NzQwOTQ4MTQuMDc3CitkZGZtYTAyMTcgIGZtYSAgICAgICAgNTY4OTAuMzg4NzMxICAgICAgMzU4NzIwMzAuNDI1NSAgICAgIDMzOTMzNy4xMjM0MTAgIC0+ICAyMDQwNzc0MDk0ODE0LjA3OCAgICAgIEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDIuNzE0NDY5NTc1MjA1MDQ5RSsxOAorZGRmbWEwMjIwICBmbWEgICAgICAgNzUzMzU0My41NzQ0NSAgICAgICAzNjAzMTc3NjM5MjggICAgICA1MDczMzkyLjMxNjM4ICAtPiAgMi43MTQ0Njk1NzUyMDUwNTBFKzE4ICBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxLjAxMTY3NjI5NzcxNjcxNkUrMTkKK2RkZm1hMDIyMyAgZm1hICAgICAgIDczOTk0NTI1NS41NjMgICAgICAxMzY3MjMxMjc4NC4xICAgICAgLTk5NDM4MS41MzU3MiAgLT4gIDEuMDExNjc2Mjk3NzE2NzE1RSsxOSAgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgLTIuOTE0MTM1NzIxNDU1MzE1RSsyMworZGRmbWEwMjI0ICBmbWEgICAgICAgLTQxMzUxMDk1NzIxOCAgICAgICA3MDQ3Mjk5ODg1NTAgICAgICAgOTIzNDE2MjYxNC4wICAtPiAgLTIuOTE0MTM1NzIxNDU1MzE0RSsyMyBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAyLjYyMDExOTg2MzM2NTc4NkUrMTcKK2RkZm1hMDIyNiAgZm1hICAgICAgICA0Mzc0ODQuMDA2MDEgICAgICAgNTk4OTA2NDMyNzkwICAgICAgODk0NDUwNjM4LjQ0MiAgLT4gIDIuNjIwMTE5ODYzMzY1Nzg3RSsxNyAgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMS4yNzI2NDc5OTU4MDgxNzhFKzE5CitkZGZtYTAyNTMgIGZtYSAgICAgICAgIDczMjg3NTU2OTI5ICAgICAgMTczNjUxMzA1Ljc4NCAgICAgLTM1ODMxMjU2OC4zODkgIC0+ICAxLjI3MjY0Nzk5NTgwODE3N0UrMTkgIEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIC0xLjc1Mzc2OTMyMDg2MTg1MUUrMTgKK2RkZm1hMDI1NyAgZm1hICAgICAgICAyMDMyNTgzMDQ0ODYgICAgICAtODYyODI3OC44MDY2ICAgICAgMTUzMTI3LjQ0NjcyNyAgLT4gIC0xLjc1Mzc2OTMyMDg2MTg1MEUrMTggSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgLTEuNTUwNzM3ODM1MjYzMzQ2RSsxNworZGRmbWEwMjYwICBmbWEgICAgICAgNDI1NjA1MzMuMTc3NCAgICAgLTM2NDM2MDUyODIuODYgICAgICAgMTc4Mjc3Ljk2Mzc3ICAtPiAgLTEuNTUwNzM3ODM1MjYzMzQ3RSsxNyBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAyLjg5NzYyNDYyMDU3NjAwNUUrMjIKK2RkZm1hMDI2OSAgZm1hICAgICAgICAxNDI2NTY1ODczNzUgICAgICAgMjAzMTE4ODc5NjcwICAgICAgIDYwNDU3NjEwMzk5MSAgLT4gIDIuODk3NjI0NjIwNTc2MDA0RSsyMiAgSW5leGFjdCBSb3VuZGVkCisKKy0tIENhc2VzIHdoZXJlIG11bHRpcGx5IHdvdWxkIG92ZXJmbG93IG9yIHVuZGVyZmxvdyBpZiBzZXBhcmF0ZQorZm1hMDMwMCAgZm1hICAgOWUrMzg0ICAgIDEwICAgMCAgICAgICAgIC0+IEluZmluaXR5ICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYTAzMDEgIGZtYSAgIDFlKzM4NCAgICAxMCAgIDAgICAgICAgICAtPiBJbmZpbml0eSAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWEwMzAyICBmbWEgICAxZSszODQgICAgMTAgICAtMWUrMzg0ICAgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAgQ2xhbXBlZAorZm1hMDMwMyAgZm1hICAgMWUrMzg0ICAgIDEwICAgLTllKzM4NCAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSszODQgIENsYW1wZWQKKy0tIHN1Ym5vcm1hbCBldGMuCitmbWEwMzA1ICBmbWEgICAxZS0zOTggICAgMC4xICAwICAgICAgICAgLT4gMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2ZtYTAzMDYgIGZtYSAgIDFlLTM5OCAgICAwLjEgIDEgICAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYTAzMDcgIGZtYSAgIDFlLTM5OCAgICAwLjEgIDFlLTM5OCAgICAtPiAxRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gSW5maW5pdGUgY29tYmluYXRpb25zCitkZGZtYTA4MDAgZm1hICBJbmYgICBJbmYgICBJbmYgICAgLT4gIEluZmluaXR5CitkZGZtYTA4MDEgZm1hICBJbmYgICBJbmYgIC1JbmYgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEwODAyIGZtYSAgSW5mICAtSW5mICAgSW5mICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMDgwMyBmbWEgIEluZiAgLUluZiAgLUluZiAgICAtPiAtSW5maW5pdHkKK2RkZm1hMDgwNCBmbWEgLUluZiAgIEluZiAgIEluZiAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTA4MDUgZm1hIC1JbmYgICBJbmYgIC1JbmYgICAgLT4gLUluZmluaXR5CitkZGZtYTA4MDYgZm1hIC1JbmYgIC1JbmYgICBJbmYgICAgLT4gIEluZmluaXR5CitkZGZtYTA4MDcgZm1hIC1JbmYgIC1JbmYgIC1JbmYgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBUcmlwbGUgTmFOIHByb3BhZ2F0aW9uCitkZGZtYTA5MDAgZm1hICBOYU4yICBOYU4zICBOYU41ICAgLT4gIE5hTjIKK2RkZm1hMDkwMSBmbWEgIDAgICAgIE5hTjMgIE5hTjUgICAtPiAgTmFOMworZGRmbWEwOTAyIGZtYSAgMCAgICAgMCAgICAgTmFONSAgIC0+ICBOYU41CistLSBmaXJzdCBzTmFOIHdpbnMgKGNvbnNpZGVyIHFOYU4gZnJvbSBlYXJsaWVyIHNOYU4gYmVpbmcKKy0tIG92ZXJyaWRkZW4gYnkgYW4gc05hTiBpbiB0aGlyZCBvcGVyYW5kKQorZGRmbWEwOTAzIGZtYSAgc05hTjEgc05hTjIgc05hTjMgIC0+ICBOYU4xIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTA5MDQgZm1hICAwICAgICBzTmFOMiBzTmFOMyAgLT4gIE5hTjIgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMDkwNSBmbWEgIDAgICAgIDAgICAgIHNOYU4zICAtPiAgTmFOMyBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEwOTA2IGZtYSAgc05hTjEgc05hTjIgc05hTjMgIC0+ICBOYU4xIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTA5MDcgZm1hICBOYU43ICBzTmFOMiBzTmFOMyAgLT4gIE5hTjIgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMDkwOCBmbWEgIE5hTjcgIE5hTjUgIHNOYU4zICAtPiAgTmFOMyBJbnZhbGlkX29wZXJhdGlvbgorCistLSBNVUxUSVBMSUNBVElPTiBURVNUUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gc2FuaXR5IGNoZWNrcworZGRmbWEyMDAwIGZtYSAgMiAgICAgIDIgICAwZSszODQgIC0+ICA0CitkZGZtYTIwMDEgZm1hICAyICAgICAgMyAgIDBlKzM4NCAgLT4gIDYKK2RkZm1hMjAwMiBmbWEgIDUgICAgICAxICAgMGUrMzg0ICAtPiAgNQorZGRmbWEyMDAzIGZtYSAgNSAgICAgIDIgICAwZSszODQgIC0+ICAxMAorZGRmbWEyMDA0IGZtYSAgMS4yMCAgIDIgICAwZSszODQgIC0+ICAyLjQwCitkZGZtYTIwMDUgZm1hICAxLjIwICAgMCAgIDBlKzM4NCAgLT4gIDAuMDAKK2RkZm1hMjAwNiBmbWEgIDEuMjAgIC0yICAgMGUrMzg0ICAtPiAgLTIuNDAKK2RkZm1hMjAwNyBmbWEgIC0xLjIwICAyICAgMGUrMzg0ICAtPiAgLTIuNDAKK2RkZm1hMjAwOCBmbWEgIC0xLjIwICAwICAgMGUrMzg0ICAtPiAgMC4wMAorZGRmbWEyMDA5IGZtYSAgLTEuMjAgLTIgICAwZSszODQgIC0+ICAyLjQwCitkZGZtYTIwMTAgZm1hICA1LjA5IDcuMSAgIDBlKzM4NCAgLT4gIDM2LjEzOQorZGRmbWEyMDExIGZtYSAgMi41ICAgIDQgICAwZSszODQgIC0+ICAxMC4wCitkZGZtYTIwMTIgZm1hICAyLjUwICAgNCAgIDBlKzM4NCAgLT4gIDEwLjAwCitkZGZtYTIwMTMgZm1hICAxLjIzNDU2Nzg5IDEuMDAwMDAwMDAgICAwZSszODQgIC0+ICAxLjIzNDU2Nzg5MDAwMDAwMCBSb3VuZGVkCitkZGZtYTIwMTUgZm1hICAyLjUwICAgNCAgIDBlKzM4NCAgLT4gIDEwLjAwCitkZGZtYTIwMTYgZm1hICAgOS45OTk5OTk5OTkgIDkuOTk5OTk5OTk5ICAgMGUrMzg0ICAtPiAgIDk5Ljk5OTk5OTk4MDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEyMDE3IGZtYSAgIDkuOTk5OTk5OTk5IC05Ljk5OTk5OTk5OSAgIDBlKzM4NCAgLT4gIC05OS45OTk5OTk5ODAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjAxOCBmbWEgIC05Ljk5OTk5OTk5OSAgOS45OTk5OTk5OTkgICAwZSszODQgIC0+ICAtOTkuOTk5OTk5OTgwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTIwMTkgZm1hICAtOS45OTk5OTk5OTkgLTkuOTk5OTk5OTk5ICAgMGUrMzg0ICAtPiAgIDk5Ljk5OTk5OTk4MDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSB6ZXJvcywgZXRjLgorZGRmbWEyMDIxIGZtYSAgIDAgICAgICAwICAgICAgIDBlKzM4NCAgLT4gICAwCitkZGZtYTIwMjIgZm1hICAgMCAgICAgLTAgICAgICAgMGUrMzg0ICAtPiAgIDAKK2RkZm1hMjAyMyBmbWEgIC0wICAgICAgMCAgICAgICAwZSszODQgIC0+ICAgMAorZGRmbWEyMDI0IGZtYSAgLTAgICAgIC0wICAgICAgIDBlKzM4NCAgLT4gICAwCitkZGZtYTIwMjUgZm1hICAtMC4wICAgLTAuMCAgICAgMGUrMzg0ICAtPiAgIDAuMDAKK2RkZm1hMjAyNiBmbWEgIC0wLjAgICAtMC4wICAgICAwZSszODQgIC0+ICAgMC4wMAorZGRmbWEyMDI3IGZtYSAgLTAuMCAgIC0wLjAgICAgIDBlKzM4NCAgLT4gICAwLjAwCitkZGZtYTIwMjggZm1hICAtMC4wICAgLTAuMCAgICAgMGUrMzg0ICAtPiAgIDAuMDAKK2RkZm1hMjAzMCBmbWEgICA1LjAwICAgMUUtMyAgICAwZSszODQgIC0+ICAgMC4wMDUwMAorZGRmbWEyMDMxIGZtYSAgIDAwLjAwICAwLjAwMCAgIDBlKzM4NCAgLT4gICAwLjAwMDAwCitkZGZtYTIwMzIgZm1hICAgMDAuMDAgIDBFLTMgICAgMGUrMzg0ICAtPiAgIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitkZGZtYTIwMzMgZm1hICAgMEUtMyAgIDAwLjAwICAgMGUrMzg0ICAtPiAgIDAuMDAwMDAgICAgIC0tIGxocyBpcyAwCitkZGZtYTIwMzQgZm1hICAtNS4wMCAgIDFFLTMgICAgMGUrMzg0ICAtPiAgLTAuMDA1MDAKK2RkZm1hMjAzNSBmbWEgIC0wMC4wMCAgMC4wMDAgICAwZSszODQgIC0+ICAgMC4wMDAwMAorZGRmbWEyMDM2IGZtYSAgLTAwLjAwICAwRS0zICAgIDBlKzM4NCAgLT4gICAwLjAwMDAwICAgICAtLSByaHMgaXMgMAorZGRmbWEyMDM3IGZtYSAgLTBFLTMgICAwMC4wMCAgIDBlKzM4NCAgLT4gICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorZGRmbWEyMDM4IGZtYSAgIDUuMDAgIC0xRS0zICAgIDBlKzM4NCAgLT4gIC0wLjAwNTAwCitkZGZtYTIwMzkgZm1hICAgMDAuMDAgLTAuMDAwICAgMGUrMzg0ICAtPiAgIDAuMDAwMDAKK2RkZm1hMjA0MCBmbWEgICAwMC4wMCAtMEUtMyAgICAwZSszODQgIC0+ICAgMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2RkZm1hMjA0MSBmbWEgICAwRS0zICAtMDAuMDAgICAwZSszODQgIC0+ICAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK2RkZm1hMjA0MiBmbWEgIC01LjAwICAtMUUtMyAgICAwZSszODQgIC0+ICAgMC4wMDUwMAorZGRmbWEyMDQzIGZtYSAgLTAwLjAwIC0wLjAwMCAgIDBlKzM4NCAgLT4gICAwLjAwMDAwCitkZGZtYTIwNDQgZm1hICAtMDAuMDAgLTBFLTMgICAgMGUrMzg0ICAtPiAgIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitkZGZtYTIwNDUgZm1hICAtMEUtMyAgLTAwLjAwICAtMGUrMzg0ICAtPiAgIDAuMDAwMDAgICAgIC0tIGxocyBpcyAwCitkZGZtYTIwNDYgZm1hICAtMEUtMyAgIDAwLjAwICAtMGUrMzg0ICAtPiAgLTAuMDAwMDAKK2RkZm1hMjA0NyBmbWEgICAwRS0zICAtMDAuMDAgIC0wZSszODQgIC0+ICAtMC4wMDAwMAorZGRmbWEyMDQ4IGZtYSAgIDBFLTMgICAwMC4wMCAgLTBlKzM4NCAgLT4gICAwLjAwMDAwCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjYXJpdGgKK2RkZm1hMjA1MCBmbWEgIDEuMjAgMyAgICAgICAgICAwZSszODQgIC0+ICAzLjYwCitkZGZtYTIwNTEgZm1hICA3ICAgIDMgICAgICAgICAgMGUrMzg0ICAtPiAgMjEKK2RkZm1hMjA1MiBmbWEgIDAuOSAgMC44ICAgICAgICAwZSszODQgIC0+ICAwLjcyCitkZGZtYTIwNTMgZm1hICAwLjkgIC0wICAgICAgICAgMGUrMzg0ICAtPiAgMC4wCitkZGZtYTIwNTQgZm1hICA2NTQzMjEgNjU0MzIxICAgMGUrMzg0ICAtPiAgNDI4MTM1OTcxMDQxCisKK2RkZm1hMjA2MCBmbWEgIDEyMy40NSAxZTcgICAgMGUrMzg0ICAtPiAgIDEuMjM0NUUrOQorZGRmbWEyMDYxIGZtYSAgMTIzLjQ1IDFlOCAgICAwZSszODQgIC0+ICAgMS4yMzQ1RSsxMAorZGRmbWEyMDYyIGZtYSAgMTIzLjQ1IDFlKzkgICAwZSszODQgIC0+ICAgMS4yMzQ1RSsxMQorZGRmbWEyMDYzIGZtYSAgMTIzLjQ1IDFlMTAgICAwZSszODQgIC0+ICAgMS4yMzQ1RSsxMgorZGRmbWEyMDY0IGZtYSAgMTIzLjQ1IDFlMTEgICAwZSszODQgIC0+ICAgMS4yMzQ1RSsxMworZGRmbWEyMDY1IGZtYSAgMTIzLjQ1IDFlMTIgICAwZSszODQgIC0+ICAgMS4yMzQ1RSsxNAorZGRmbWEyMDY2IGZtYSAgMTIzLjQ1IDFlMTMgICAwZSszODQgIC0+ICAgMS4yMzQ1RSsxNQorCisKKy0tIHRlc3Qgc29tZSBpbnRlcm1lZGlhdGUgbGVuZ3RocworLS0gICAgICAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RkZm1hMjA4MCBmbWEgIDAuMSAxMjMwMTIzNDU2NDU2Nzg5ICAgICAgIDBlKzM4NCAgLT4gIDEyMzAxMjM0NTY0NTY3OC45CitkZGZtYTIwODQgZm1hICAwLjEgMTIzMDEyMzQ1NjQ1Njc4OSAgICAgICAwZSszODQgIC0+ICAxMjMwMTIzNDU2NDU2NzguOQorZGRmbWEyMDkwIGZtYSAgMTIzMDEyMzQ1NjQ1Njc4OSAgICAgMC4xICAgMGUrMzg0ICAtPiAgMTIzMDEyMzQ1NjQ1Njc4LjkKK2RkZm1hMjA5NCBmbWEgIDEyMzAxMjM0NTY0NTY3ODkgICAgIDAuMSAgIDBlKzM4NCAgLT4gIDEyMzAxMjM0NTY0NTY3OC45CisKKy0tIHRlc3Qgc29tZSBtb3JlIGVkZ2UgY2FzZXMgYW5kIGNhcnJpZXMKK2RkZm1hMjEwMSBmbWEgIDkgOSAgICAgMGUrMzg0ICAtPiAgODEKK2RkZm1hMjEwMiBmbWEgIDkgOTAgICAgIDBlKzM4NCAgLT4gIDgxMAorZGRmbWEyMTAzIGZtYSAgOSA5MDAgICAgIDBlKzM4NCAgLT4gIDgxMDAKK2RkZm1hMjEwNCBmbWEgIDkgOTAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAKK2RkZm1hMjEwNSBmbWEgIDkgOTAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMAorZGRmbWEyMTA2IGZtYSAgOSA5MDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAKK2RkZm1hMjEwNyBmbWEgIDkgOTAwMDAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAwMDAKK2RkZm1hMjEwOCBmbWEgIDkgOTAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMAorZGRmbWEyMTA5IGZtYSAgOSA5MDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAKK2RkZm1hMjExMCBmbWEgIDkgOTAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAwMDAwMDAKK2RkZm1hMjExMSBmbWEgIDkgOTAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwMAorZGRmbWEyMTEyIGZtYSAgOSA5MDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwMDAKK2RkZm1hMjExMyBmbWEgIDkgOTAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAwMDAwMDAwMDAKK2RkZm1hMjExNCBmbWEgIDkgOTAwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwMDAwMAorZGRmbWEyMTE1IGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwMDAwMDAKKy0tZGRmbWEyMTE2IGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwMDAwMAorLS1kZGZtYTIxMTcgZm1hICA5IDkwMDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwMDAwMDAKKy0tZGRmbWEyMTE4IGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwMDAwMDAwMDAKKy0tZGRmbWEyMTE5IGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwMDAwMDAwMAorLS1kZGZtYTIxMjAgZm1hICA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tZGRmbWEyMTIxIGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tZGRmbWEyMTIyIGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorLS1kZGZtYTIxMjMgZm1hICA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tIHRlc3Qgc29tZSBtb3JlIGVkZ2UgY2FzZXMgd2l0aG91dCBjYXJyaWVzCitkZGZtYTIxMzEgZm1hICAzIDMgICAgIDBlKzM4NCAgLT4gIDkKK2RkZm1hMjEzMiBmbWEgIDMgMzAgICAgIDBlKzM4NCAgLT4gIDkwCitkZGZtYTIxMzMgZm1hICAzIDMwMCAgICAgMGUrMzg0ICAtPiAgOTAwCitkZGZtYTIxMzQgZm1hICAzIDMwMDAgICAgIDBlKzM4NCAgLT4gIDkwMDAKK2RkZm1hMjEzNSBmbWEgIDMgMzAwMDAgICAgIDBlKzM4NCAgLT4gIDkwMDAwCitkZGZtYTIxMzYgZm1hICAzIDMwMDAwMCAgICAgMGUrMzg0ICAtPiAgOTAwMDAwCitkZGZtYTIxMzcgZm1hICAzIDMwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDkwMDAwMDAKK2RkZm1hMjEzOCBmbWEgIDMgMzAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDkwMDAwMDAwCitkZGZtYTIxMzkgZm1hICAzIDMwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgOTAwMDAwMDAwCitkZGZtYTIxNDAgZm1hICAzIDMwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDkwMDAwMDAwMDAKK2RkZm1hMjE0MSBmbWEgIDMgMzAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDkwMDAwMDAwMDAwCitkZGZtYTIxNDIgZm1hICAzIDMwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgOTAwMDAwMDAwMDAwCitkZGZtYTIxNDMgZm1hICAzIDMwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDkwMDAwMDAwMDAwMDAKK2RkZm1hMjE0NCBmbWEgIDMgMzAwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDkwMDAwMDAwMDAwMDAwCitkZGZtYTIxNDUgZm1hICAzIDMwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgOTAwMDAwMDAwMDAwMDAwCisKKy0tIHRlc3Qgc29tZSBlZGdlIGNhc2VzIHdpdGggZXhhY3Qgcm91bmRpbmcKK2RkZm1hMjMwMSBmbWEgIDkgOSAgICAgMGUrMzg0ICAtPiAgODEKK2RkZm1hMjMwMiBmbWEgIDkgOTAgICAgIDBlKzM4NCAgLT4gIDgxMAorZGRmbWEyMzAzIGZtYSAgOSA5MDAgICAgIDBlKzM4NCAgLT4gIDgxMDAKK2RkZm1hMjMwNCBmbWEgIDkgOTAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAKK2RkZm1hMjMwNSBmbWEgIDkgOTAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMAorZGRmbWEyMzA2IGZtYSAgOSA5MDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAKK2RkZm1hMjMwNyBmbWEgIDkgOTAwMDAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAwMDAKK2RkZm1hMjMwOCBmbWEgIDkgOTAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMAorZGRmbWEyMzA5IGZtYSAgOSA5MDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAKK2RkZm1hMjMxMCBmbWEgIDkgOTAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAwMDAwMDAKK2RkZm1hMjMxMSBmbWEgIDkgOTAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwMAorZGRmbWEyMzEyIGZtYSAgOSA5MDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwMDAKK2RkZm1hMjMxMyBmbWEgIDkgOTAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAwMDAwMDAwMDAKK2RkZm1hMjMxNCBmbWEgIDkgOTAwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwMDAwMAorZGRmbWEyMzE1IGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwMDAwMDAKK2RkZm1hMjMxNiBmbWEgIDkgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgOC4xMDAwMDAwMDAwMDAwMDBFKzE2ICBSb3VuZGVkCitkZGZtYTIzMTcgZm1hICA5MCA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4LjEwMDAwMDAwMDAwMDAwMEUrMTcgIFJvdW5kZWQKK2RkZm1hMjMxOCBmbWEgIDkwMCA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4LjEwMDAwMDAwMDAwMDAwMEUrMTggIFJvdW5kZWQKK2RkZm1hMjMxOSBmbWEgIDkwMDAgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgOC4xMDAwMDAwMDAwMDAwMDBFKzE5ICBSb3VuZGVkCitkZGZtYTIzMjAgZm1hICA5MDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4LjEwMDAwMDAwMDAwMDAwMEUrMjAgIFJvdW5kZWQKK2RkZm1hMjMyMSBmbWEgIDkwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4LjEwMDAwMDAwMDAwMDAwMEUrMjEgIFJvdW5kZWQKK2RkZm1hMjMyMiBmbWEgIDkwMDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgOC4xMDAwMDAwMDAwMDAwMDBFKzIyICBSb3VuZGVkCitkZGZtYTIzMjMgZm1hICA5MDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4LjEwMDAwMDAwMDAwMDAwMEUrMjMgIFJvdW5kZWQKKworLS0gdHJ5emVyb3MgY2FzZXMKK2RkZm1hMjUwNCAgZm1hICAgMEUtMjYwIDEwMDBFLTI2MCAgICAwZSszODQgIC0+ICAwRS0zOTggQ2xhbXBlZAorZGRmbWEyNTA1ICBmbWEgICAxMDBFKzI2MCAwRSsyNjAgICAgIDBlKzM4NCAgLT4gIDBFKzM2OSBDbGFtcGVkCisKKy0tIG1peGVkIHdpdGggemVyb3MKK2RkZm1hMjU0MSBmbWEgICAwICAgIC0xICAgICAgIDBlKzM4NCAgLT4gICAwCitkZGZtYTI1NDIgZm1hICAtMCAgICAtMSAgICAgICAwZSszODQgIC0+ICAgMAorZGRmbWEyNTQzIGZtYSAgIDAgICAgIDEgICAgICAgMGUrMzg0ICAtPiAgIDAKK2RkZm1hMjU0NCBmbWEgIC0wICAgICAxICAgICAgIDBlKzM4NCAgLT4gICAwCitkZGZtYTI1NDUgZm1hICAtMSAgICAgMCAgICAgICAwZSszODQgIC0+ICAgMAorZGRmbWEyNTQ2IGZtYSAgLTEgICAgLTAgICAgICAgMGUrMzg0ICAtPiAgIDAKK2RkZm1hMjU0NyBmbWEgICAxICAgICAwICAgICAgIDBlKzM4NCAgLT4gICAwCitkZGZtYTI1NDggZm1hICAgMSAgICAtMCAgICAgICAwZSszODQgIC0+ICAgMAorCitkZGZtYTI1NTEgZm1hICAgMC4wICAtMSAgICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NTIgZm1hICAtMC4wICAtMSAgICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NTMgZm1hICAgMC4wICAgMSAgICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NTQgZm1hICAtMC4wICAgMSAgICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NTUgZm1hICAtMS4wICAgMCAgICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NTYgZm1hICAtMS4wICAtMCAgICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NTcgZm1hICAgMS4wICAgMCAgICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NTggZm1hICAgMS4wICAtMCAgICAgICAwZSszODQgIC0+ICAgMC4wCisKK2RkZm1hMjU2MSBmbWEgICAwICAgIC0xLjAgICAgIDBlKzM4NCAgLT4gICAwLjAKK2RkZm1hMjU2MiBmbWEgIC0wICAgIC0xLjAgICAgIDBlKzM4NCAgLT4gICAwLjAKK2RkZm1hMjU2MyBmbWEgICAwICAgICAxLjAgICAgIDBlKzM4NCAgLT4gICAwLjAKK2RkZm1hMjU2NCBmbWEgIC0wICAgICAxLjAgICAgIDBlKzM4NCAgLT4gICAwLjAKK2RkZm1hMjU2NSBmbWEgIC0xICAgICAwLjAgICAgIDBlKzM4NCAgLT4gICAwLjAKK2RkZm1hMjU2NiBmbWEgIC0xICAgIC0wLjAgICAgIDBlKzM4NCAgLT4gICAwLjAKK2RkZm1hMjU2NyBmbWEgICAxICAgICAwLjAgICAgIDBlKzM4NCAgLT4gICAwLjAKK2RkZm1hMjU2OCBmbWEgICAxICAgIC0wLjAgICAgIDBlKzM4NCAgLT4gICAwLjAKKworZGRmbWEyNTcxIGZtYSAgIDAuMCAgLTEuMCAgICAgMGUrMzg0ICAtPiAgIDAuMDAKK2RkZm1hMjU3MiBmbWEgIC0wLjAgIC0xLjAgICAgIDBlKzM4NCAgLT4gICAwLjAwCitkZGZtYTI1NzMgZm1hICAgMC4wICAgMS4wICAgICAwZSszODQgIC0+ICAgMC4wMAorZGRmbWEyNTc0IGZtYSAgLTAuMCAgIDEuMCAgICAgMGUrMzg0ICAtPiAgIDAuMDAKK2RkZm1hMjU3NSBmbWEgIC0xLjAgICAwLjAgICAgIDBlKzM4NCAgLT4gICAwLjAwCitkZGZtYTI1NzYgZm1hICAtMS4wICAtMC4wICAgICAwZSszODQgIC0+ICAgMC4wMAorZGRmbWEyNTc3IGZtYSAgIDEuMCAgIDAuMCAgICAgMGUrMzg0ICAtPiAgIDAuMDAKK2RkZm1hMjU3OCBmbWEgICAxLjAgIC0wLjAgICAgIDBlKzM4NCAgLT4gICAwLjAwCisKKy0tIFNwZWNpYWxzCitkZGZtYTI1ODAgZm1hICAgSW5mICAtSW5mICAgICAwZSszODQgIC0+ICAtSW5maW5pdHkKK2RkZm1hMjU4MSBmbWEgICBJbmYgIC0xMDAwICAgIDBlKzM4NCAgLT4gIC1JbmZpbml0eQorZGRmbWEyNTgyIGZtYSAgIEluZiAgLTEgICAgICAgMGUrMzg0ICAtPiAgLUluZmluaXR5CitkZGZtYTI1ODMgZm1hICAgSW5mICAtMCAgICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNTg0IGZtYSAgIEluZiAgIDAgICAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjU4NSBmbWEgICBJbmYgICAxICAgICAgIDBlKzM4NCAgLT4gICBJbmZpbml0eQorZGRmbWEyNTg2IGZtYSAgIEluZiAgIDEwMDAgICAgMGUrMzg0ICAtPiAgIEluZmluaXR5CitkZGZtYTI1ODcgZm1hICAgSW5mICAgSW5mICAgICAwZSszODQgIC0+ICAgSW5maW5pdHkKK2RkZm1hMjU4OCBmbWEgIC0xMDAwICBJbmYgICAgIDBlKzM4NCAgLT4gIC1JbmZpbml0eQorZGRmbWEyNTg5IGZtYSAgLUluZiAgIEluZiAgICAgMGUrMzg0ICAtPiAgLUluZmluaXR5CitkZGZtYTI1OTAgZm1hICAtMSAgICAgSW5mICAgICAwZSszODQgIC0+ICAtSW5maW5pdHkKK2RkZm1hMjU5MSBmbWEgIC0wICAgICBJbmYgICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI1OTIgZm1hICAgMCAgICAgSW5mICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNTkzIGZtYSAgIDEgICAgIEluZiAgICAgMGUrMzg0ICAtPiAgIEluZmluaXR5CitkZGZtYTI1OTQgZm1hICAgMTAwMCAgSW5mICAgICAwZSszODQgIC0+ICAgSW5maW5pdHkKK2RkZm1hMjU5NSBmbWEgICBJbmYgICBJbmYgICAgIDBlKzM4NCAgLT4gICBJbmZpbml0eQorCitkZGZtYTI2MDAgZm1hICAtSW5mICAtSW5mICAgICAwZSszODQgIC0+ICAgSW5maW5pdHkKK2RkZm1hMjYwMSBmbWEgIC1JbmYgIC0xMDAwICAgIDBlKzM4NCAgLT4gICBJbmZpbml0eQorZGRmbWEyNjAyIGZtYSAgLUluZiAgLTEgICAgICAgMGUrMzg0ICAtPiAgIEluZmluaXR5CitkZGZtYTI2MDMgZm1hICAtSW5mICAtMCAgICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjA0IGZtYSAgLUluZiAgIDAgICAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjYwNSBmbWEgIC1JbmYgICAxICAgICAgIDBlKzM4NCAgLT4gIC1JbmZpbml0eQorZGRmbWEyNjA2IGZtYSAgLUluZiAgIDEwMDAgICAgMGUrMzg0ICAtPiAgLUluZmluaXR5CitkZGZtYTI2MDcgZm1hICAtSW5mICAgSW5mICAgICAwZSszODQgIC0+ICAtSW5maW5pdHkKK2RkZm1hMjYwOCBmbWEgIC0xMDAwICBJbmYgICAgIDBlKzM4NCAgLT4gIC1JbmZpbml0eQorZGRmbWEyNjA5IGZtYSAgLUluZiAgLUluZiAgICAgMGUrMzg0ICAtPiAgIEluZmluaXR5CitkZGZtYTI2MTAgZm1hICAtMSAgICAtSW5mICAgICAwZSszODQgIC0+ICAgSW5maW5pdHkKK2RkZm1hMjYxMSBmbWEgIC0wICAgIC1JbmYgICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2MTIgZm1hICAgMCAgICAtSW5mICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjEzIGZtYSAgIDEgICAgLUluZiAgICAgMGUrMzg0ICAtPiAgLUluZmluaXR5CitkZGZtYTI2MTQgZm1hICAgMTAwMCAtSW5mICAgICAwZSszODQgIC0+ICAtSW5maW5pdHkKK2RkZm1hMjYxNSBmbWEgICBJbmYgIC1JbmYgICAgIDBlKzM4NCAgLT4gIC1JbmZpbml0eQorCitkZGZtYTI2MjEgZm1hICAgTmFOIC1JbmYgICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MjIgZm1hICAgTmFOIC0xMDAwICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MjMgZm1hICAgTmFOIC0xICAgICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MjQgZm1hICAgTmFOIC0wICAgICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MjUgZm1hICAgTmFOICAwICAgICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MjYgZm1hICAgTmFOICAxICAgICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MjcgZm1hICAgTmFOICAxMDAwICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MjggZm1hICAgTmFOICBJbmYgICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MjkgZm1hICAgTmFOICBOYU4gICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MzAgZm1hICAtSW5mICBOYU4gICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MzEgZm1hICAtMTAwMCBOYU4gICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MzIgZm1hICAtMSAgICBOYU4gICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MzMgZm1hICAtMCAgICBOYU4gICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MzQgZm1hICAgMCAgICBOYU4gICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MzUgZm1hICAgMSAgICBOYU4gICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MzYgZm1hICAgMTAwMCBOYU4gICAgICAwZSszODQgIC0+ICAgTmFOCitkZGZtYTI2MzcgZm1hICAgSW5mICBOYU4gICAgICAwZSszODQgIC0+ICAgTmFOCisKK2RkZm1hMjY0MSBmbWEgICBzTmFOIC1JbmYgICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NDIgZm1hICAgc05hTiAtMTAwMCAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjQzIGZtYSAgIHNOYU4gLTEgICAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY0NCBmbWEgICBzTmFOIC0wICAgICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NDUgZm1hICAgc05hTiAgMCAgICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjQ2IGZtYSAgIHNOYU4gIDEgICAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY0NyBmbWEgICBzTmFOICAxMDAwICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NDggZm1hICAgc05hTiAgTmFOICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjQ5IGZtYSAgIHNOYU4gc05hTiAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY1MCBmbWEgICBOYU4gIHNOYU4gICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NTEgZm1hICAtSW5mICBzTmFOICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjUyIGZtYSAgLTEwMDAgc05hTiAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY1MyBmbWEgIC0xICAgIHNOYU4gICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NTQgZm1hICAtMCAgICBzTmFOICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjU1IGZtYSAgIDAgICAgc05hTiAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY1NiBmbWEgICAxICAgIHNOYU4gICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NTcgZm1hICAgMTAwMCBzTmFOICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjU4IGZtYSAgIEluZiAgc05hTiAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY1OSBmbWEgICBOYU4gIHNOYU4gICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RkZm1hMjY2MSBmbWEgICBOYU45IC1JbmYgICAgIDBlKzM4NCAgLT4gICBOYU45CitkZGZtYTI2NjIgZm1hICAgTmFOOCAgOTk5ICAgICAwZSszODQgIC0+ICAgTmFOOAorZGRmbWEyNjYzIGZtYSAgIE5hTjcxIEluZiAgICAgMGUrMzg0ICAtPiAgIE5hTjcxCitkZGZtYTI2NjQgZm1hICAgTmFONiAgTmFONSAgICAwZSszODQgIC0+ICAgTmFONgorZGRmbWEyNjY1IGZtYSAgLUluZiAgIE5hTjQgICAgMGUrMzg0ICAtPiAgIE5hTjQKK2RkZm1hMjY2NiBmbWEgIC05OTkgICBOYU4zMyAgIDBlKzM4NCAgLT4gICBOYU4zMworZGRmbWEyNjY3IGZtYSAgIEluZiAgIE5hTjIgICAgMGUrMzg0ICAtPiAgIE5hTjIKKworZGRmbWEyNjcxIGZtYSAgIHNOYU45OSAtSW5mICAgICAgMGUrMzg0ICAtPiAgIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NzIgZm1hICAgc05hTjk4IC0xMSAgICAgICAwZSszODQgIC0+ICAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY3MyBmbWEgICBzTmFOOTcgIE5hTiAgICAgIDBlKzM4NCAgLT4gICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjc0IGZtYSAgIHNOYU4xNiBzTmFOOTQgICAgMGUrMzg0ICAtPiAgIE5hTjE2IEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NzUgZm1hICAgTmFOOTUgIHNOYU45MyAgICAwZSszODQgIC0+ICAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY3NiBmbWEgIC1JbmYgICAgc05hTjkyICAgIDBlKzM4NCAgLT4gICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjc3IGZtYSAgIDA4OCAgICBzTmFOOTEgICAgMGUrMzg0ICAtPiAgIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NzggZm1hICAgSW5mICAgIHNOYU45MCAgICAwZSszODQgIC0+ICAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY3OSBmbWEgICBOYU4gICAgc05hTjg5ICAgIDBlKzM4NCAgLT4gICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCitkZGZtYTI2ODEgZm1hICAtTmFOOSAtSW5mICAgICAwZSszODQgIC0+ICAtTmFOOQorZGRmbWEyNjgyIGZtYSAgLU5hTjggIDk5OSAgICAgMGUrMzg0ICAtPiAgLU5hTjgKK2RkZm1hMjY4MyBmbWEgIC1OYU43MSBJbmYgICAgIDBlKzM4NCAgLT4gIC1OYU43MQorZGRmbWEyNjg0IGZtYSAgLU5hTjYgLU5hTjUgICAgMGUrMzg0ICAtPiAgLU5hTjYKK2RkZm1hMjY4NSBmbWEgIC1JbmYgIC1OYU40ICAgIDBlKzM4NCAgLT4gIC1OYU40CitkZGZtYTI2ODYgZm1hICAtOTk5ICAtTmFOMzMgICAwZSszODQgIC0+ICAtTmFOMzMKK2RkZm1hMjY4NyBmbWEgICBJbmYgIC1OYU4yICAgIDBlKzM4NCAgLT4gIC1OYU4yCisKK2RkZm1hMjY5MSBmbWEgIC1zTmFOOTkgLUluZiAgICAgIDBlKzM4NCAgLT4gIC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjkyIGZtYSAgLXNOYU45OCAtMTEgICAgICAgMGUrMzg0ICAtPiAgLU5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2OTMgZm1hICAtc05hTjk3ICBOYU4gICAgICAwZSszODQgIC0+ICAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY5NCBmbWEgIC1zTmFOMTYgLXNOYU45NCAgIDBlKzM4NCAgLT4gIC1OYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjk1IGZtYSAgLU5hTjk1ICAtc05hTjkzICAgMGUrMzg0ICAtPiAgLU5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2OTYgZm1hICAtSW5mICAgIC1zTmFOOTIgICAwZSszODQgIC0+ICAtTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY5NyBmbWEgICAwODggICAgLXNOYU45MSAgIDBlKzM4NCAgLT4gIC1OYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjk4IGZtYSAgIEluZiAgICAtc05hTjkwICAgMGUrMzg0ICAtPiAgLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2OTkgZm1hICAtTmFOICAgIC1zTmFOODkgICAwZSszODQgIC0+ICAtTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworZGRmbWEyNzAxIGZtYSAgLU5hTiAgLUluZiAgICAgMGUrMzg0ICAtPiAgLU5hTgorZGRmbWEyNzAyIGZtYSAgLU5hTiAgIDk5OSAgICAgMGUrMzg0ICAtPiAgLU5hTgorZGRmbWEyNzAzIGZtYSAgLU5hTiAgIEluZiAgICAgMGUrMzg0ICAtPiAgLU5hTgorZGRmbWEyNzA0IGZtYSAgLU5hTiAgLU5hTiAgICAgMGUrMzg0ICAtPiAgLU5hTgorZGRmbWEyNzA1IGZtYSAgLUluZiAgLU5hTjAgICAgMGUrMzg0ICAtPiAgLU5hTgorZGRmbWEyNzA2IGZtYSAgLTk5OSAgLU5hTiAgICAgMGUrMzg0ICAtPiAgLU5hTgorZGRmbWEyNzA3IGZtYSAgIEluZiAgLU5hTiAgICAgMGUrMzg0ICAtPiAgLU5hTgorCitkZGZtYTI3MTEgZm1hICAtc05hTiAgIC1JbmYgICAgICAwZSszODQgIC0+ICAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI3MTIgZm1hICAtc05hTiAgIC0xMSAgICAgICAwZSszODQgIC0+ICAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI3MTMgZm1hICAtc05hTjAwICBOYU4gICAgICAwZSszODQgIC0+ICAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI3MTQgZm1hICAtc05hTiAgIC1zTmFOICAgICAwZSszODQgIC0+ICAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI3MTUgZm1hICAtTmFOICAgIC1zTmFOICAgICAwZSszODQgIC0+ICAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI3MTYgZm1hICAtSW5mICAgIC1zTmFOICAgICAwZSszODQgIC0+ICAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI3MTcgZm1hICAgMDg4ICAgIC1zTmFOICAgICAwZSszODQgIC0+ICAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI3MTggZm1hICAgSW5mICAgIC1zTmFOICAgICAwZSszODQgIC0+ICAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI3MTkgZm1hICAtTmFOICAgIC1zTmFOICAgICAwZSszODQgIC0+ICAtTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgLi4gbm90ZSBzdWJub3JtYWwgcmVzdWx0cworLS0gc2lnbnMKK2RkZm1hMjc1MSBmbWEgICAxZSsyNzcgIDFlKzMxMSAgIDBlKzM4NCAgLT4gICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjc1MiBmbWEgICAxZSsyNzcgLTFlKzMxMSAgIDBlKzM4NCAgLT4gIC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjc1MyBmbWEgIC0xZSsyNzcgIDFlKzMxMSAgIDBlKzM4NCAgLT4gIC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjc1NCBmbWEgIC0xZSsyNzcgLTFlKzMxMSAgIDBlKzM4NCAgLT4gICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjc1NSBmbWEgICAxZS0yNzcgIDFlLTMxMSAgIDBlKzM4NCAgLT4gICAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRmbWEyNzU2IGZtYSAgIDFlLTI3NyAtMWUtMzExICAgMGUrMzg0ICAtPiAgLTBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGZtYTI3NTcgZm1hICAtMWUtMjc3ICAxZS0zMTEgICAwZSszODQgIC0+ICAtMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZm1hMjc1OCBmbWEgIC0xZS0yNzcgLTFlLTMxMSAgIDBlKzM4NCAgLT4gICAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSAnc3Vibm9ybWFsJyBib3VuZGFyeSAoYWxsIGhhcmQgdW5kZXJmbG93IG9yIG92ZXJmbG93IGluIGJhc2UgYXJpdGhlbXRpYykKK2RkZm1hMjc2MCBmbWEgIDFlLTI5MSAxZS0xMDEgICAwZSszODQgIC0+ICAxRS0zOTIgU3Vibm9ybWFsCitkZGZtYTI3NjEgZm1hICAxZS0yOTEgMWUtMTAyICAgMGUrMzg0ICAtPiAgMUUtMzkzIFN1Ym5vcm1hbAorZGRmbWEyNzYyIGZtYSAgMWUtMjkxIDFlLTEwMyAgIDBlKzM4NCAgLT4gIDFFLTM5NCBTdWJub3JtYWwKK2RkZm1hMjc2MyBmbWEgIDFlLTI5MSAxZS0xMDQgICAwZSszODQgIC0+ICAxRS0zOTUgU3Vibm9ybWFsCitkZGZtYTI3NjQgZm1hICAxZS0yOTEgMWUtMTA1ICAgMGUrMzg0ICAtPiAgMUUtMzk2IFN1Ym5vcm1hbAorZGRmbWEyNzY1IGZtYSAgMWUtMjkxIDFlLTEwNiAgIDBlKzM4NCAgLT4gIDFFLTM5NyBTdWJub3JtYWwKK2RkZm1hMjc2NiBmbWEgIDFlLTI5MSAxZS0xMDcgICAwZSszODQgIC0+ICAxRS0zOTggU3Vibm9ybWFsCitkZGZtYTI3NjcgZm1hICAxZS0yOTEgMWUtMTA4ICAgMGUrMzg0ICAtPiAgMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZm1hMjc2OCBmbWEgIDFlLTI5MSAxZS0xMDkgICAwZSszODQgIC0+ICAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRmbWEyNzY5IGZtYSAgMWUtMjkxIDFlLTExMCAgIDBlKzM4NCAgLT4gIDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCistLSBbbm8gZXF1aXZhbGVudCBvZiAnc3Vibm9ybWFsJyBmb3Igb3ZlcmZsb3ddCitkZGZtYTI3NzAgZm1hICAxZSs2MCAxZSszMjEgICAwZSszODQgIC0+ICAxLjAwMDAwMDAwMDAwMEUrMzgxICBDbGFtcGVkCitkZGZtYTI3NzEgZm1hICAxZSs2MCAxZSszMjIgICAwZSszODQgIC0+ICAxLjAwMDAwMDAwMDAwMDBFKzM4MiAgQ2xhbXBlZAorZGRmbWEyNzcyIGZtYSAgMWUrNjAgMWUrMzIzICAgMGUrMzg0ICAtPiAgMS4wMDAwMDAwMDAwMDAwMEUrMzgzICBDbGFtcGVkCitkZGZtYTI3NzMgZm1hICAxZSs2MCAxZSszMjQgICAwZSszODQgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMzg0ICBDbGFtcGVkCitkZGZtYTI3NzQgZm1hICAxZSs2MCAxZSszMjUgICAwZSszODQgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjc3NSBmbWEgIDFlKzYwIDFlKzMyNiAgIDBlKzM4NCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRmbWEyNzc2IGZtYSAgMWUrNjAgMWUrMzI3ICAgMGUrMzg0ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI3NzcgZm1hICAxZSs2MCAxZSszMjggICAwZSszODQgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjc3OCBmbWEgIDFlKzYwIDFlKzMyOSAgIDBlKzM4NCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRmbWEyNzc5IGZtYSAgMWUrNjAgMWUrMzMwICAgMGUrMzg0ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMjgwMSBmbWEgICAxLjAwMDBFLTM5NCAgMSAgICAgICAwZSszODQgIC0+ICAxLjAwMDBFLTM5NCBTdWJub3JtYWwKK2RkZm1hMjgwMiBmbWEgICAxLjAwMEUtMzk0ICAgMWUtMSAgICAwZSszODQgIC0+ICAxLjAwMEUtMzk1ICBTdWJub3JtYWwKK2RkZm1hMjgwMyBmbWEgICAxLjAwRS0zOTQgICAgMWUtMiAgICAwZSszODQgIC0+ICAxLjAwRS0zOTYgICBTdWJub3JtYWwKK2RkZm1hMjgwNCBmbWEgICAxLjBFLTM5NCAgICAgMWUtMyAgICAwZSszODQgIC0+ICAxLjBFLTM5NyAgICBTdWJub3JtYWwKK2RkZm1hMjgwNSBmbWEgICAxLjBFLTM5NCAgICAgMWUtNCAgICAwZSszODQgIC0+ICAxRS0zOTggICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkZGZtYTI4MDYgZm1hICAgMS4zRS0zOTQgICAgIDFlLTQgICAgMGUrMzg0ICAtPiAgMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRmbWEyODA3IGZtYSAgIDEuNUUtMzk0ICAgICAxZS00ICAgIDBlKzM4NCAgLT4gIDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjgwOCBmbWEgICAxLjdFLTM5NCAgICAgMWUtNCAgICAwZSszODQgIC0+ICAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI4MDkgZm1hICAgMi4zRS0zOTQgICAgIDFlLTQgICAgMGUrMzg0ICAtPiAgMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRmbWEyODEwIGZtYSAgIDIuNUUtMzk0ICAgICAxZS00ICAgIDBlKzM4NCAgLT4gIDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjgxMSBmbWEgICAyLjdFLTM5NCAgICAgMWUtNCAgICAwZSszODQgIC0+ICAzRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI4MTIgZm1hICAgMS40OUUtMzk0ICAgIDFlLTQgICAgMGUrMzg0ICAtPiAgMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRmbWEyODEzIGZtYSAgIDEuNTBFLTM5NCAgICAxZS00ICAgIDBlKzM4NCAgLT4gIDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjgxNCBmbWEgICAxLjUxRS0zOTQgICAgMWUtNCAgICAwZSszODQgIC0+ICAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI4MTUgZm1hICAgMi40OUUtMzk0ICAgIDFlLTQgICAgMGUrMzg0ICAtPiAgMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRmbWEyODE2IGZtYSAgIDIuNTBFLTM5NCAgICAxZS00ICAgIDBlKzM4NCAgLT4gIDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjgxNyBmbWEgICAyLjUxRS0zOTQgICAgMWUtNCAgICAwZSszODQgIC0+ICAzRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMjgxOCBmbWEgICAxRS0zOTQgICAgICAgMWUtNCAgICAwZSszODQgIC0+ICAxRS0zOTggICAgIFN1Ym5vcm1hbAorZGRmbWEyODE5IGZtYSAgIDNFLTM5NCAgICAgICAxZS01ICAgIDBlKzM4NCAgLT4gIDBFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRmbWEyODIwIGZtYSAgIDVFLTM5NCAgICAgICAxZS01ICAgIDBlKzM4NCAgLT4gIDBFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRmbWEyODIxIGZtYSAgIDdFLTM5NCAgICAgICAxZS01ICAgIDBlKzM4NCAgLT4gIDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjgyMiBmbWEgICA5RS0zOTQgICAgICAgMWUtNSAgICAwZSszODQgIC0+ICAxRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI4MjMgZm1hICAgOS45RS0zOTQgICAgIDFlLTUgICAgMGUrMzg0ICAtPiAgMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkZGZtYTI4MjQgZm1hICAgMUUtMzk0ICAgICAgLTFlLTQgICAgMGUrMzg0ICAtPiAgLTFFLTM5OCAgICBTdWJub3JtYWwKK2RkZm1hMjgyNSBmbWEgICAzRS0zOTQgICAgICAtMWUtNSAgICAwZSszODQgIC0+ICAtMEUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZm1hMjgyNiBmbWEgIC01RS0zOTQgICAgICAgMWUtNSAgICAwZSszODQgIC0+ICAtMEUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZm1hMjgyNyBmbWEgICA3RS0zOTQgICAgICAtMWUtNSAgICAwZSszODQgIC0+ICAtMUUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI4MjggZm1hICAtOUUtMzk0ICAgICAgIDFlLTUgICAgMGUrMzg0ICAtPiAgLTFFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRmbWEyODI5IGZtYSAgIDkuOUUtMzk0ICAgIC0xZS01ICAgIDBlKzM4NCAgLT4gIC0xRS0zOTggICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjgzMCBmbWEgICAzLjBFLTM5NCAgICAtMWUtNSAgICAwZSszODQgIC0+ICAtMEUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworZGRmbWEyODMxIGZtYSAgIDEuMEUtMTk5ICAgICAxZS0yMDAgICAwZSszODQgIC0+ICAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRmbWEyODMyIGZtYSAgIDEuMEUtMTk5ICAgICAxZS0xOTkgICAwZSszODQgIC0+ICAxRS0zOTggICAgU3Vibm9ybWFsIFJvdW5kZWQKK2RkZm1hMjgzMyBmbWEgICAxLjBFLTE5OSAgICAgMWUtMTk4ICAgMGUrMzg0ICAtPiAgMS4wRS0zOTcgICAgU3Vibm9ybWFsCitkZGZtYTI4MzQgZm1hICAgMi4wRS0xOTkgICAgIDJlLTE5OCAgIDBlKzM4NCAgLT4gIDQuMEUtMzk3ICAgIFN1Ym5vcm1hbAorZGRmbWEyODM1IGZtYSAgIDQuMEUtMTk5ICAgICA0ZS0xOTggICAwZSszODQgIC0+ICAxLjYwRS0zOTYgICBTdWJub3JtYWwKK2RkZm1hMjgzNiBmbWEgIDEwLjBFLTE5OSAgICAxMGUtMTk4ICAgMGUrMzg0ICAtPiAgMS4wMDBFLTM5NSAgU3Vibm9ybWFsCitkZGZtYTI4MzcgZm1hICAzMC4wRS0xOTkgICAgMzBlLTE5OCAgIDBlKzM4NCAgLT4gIDkuMDAwRS0zOTUgIFN1Ym5vcm1hbAorZGRmbWEyODM4IGZtYSAgNDAuMEUtMTk5ICAgIDQwZS0xODggICAwZSszODQgIC0+ICAxLjYwMDBFLTM4NCBTdWJub3JtYWwKK2RkZm1hMjgzOSBmbWEgIDQwLjBFLTE5OSAgICA0MGUtMTg3ICAgMGUrMzg0ICAtPiAgMS42MDAwRS0zODMKK2RkZm1hMjg0MCBmbWEgIDQwLjBFLTE5OSAgICA0MGUtMTg2ICAgMGUrMzg0ICAtPiAgMS42MDAwRS0zODIKKworLS0gTG9uZyBvcGVyYW5kIG92ZXJmbG93IG1heSBiZSBhIGRpZmZlcmVudCBwYXRoCitkZGZtYTI4NzAgZm1hICAxMDAgIDkuOTk5RSszODMgICAgICAgICAgIDBlKzM4NCAgLT4gICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2RkZm1hMjg3MSBmbWEgIDEwMCAtOS45OTlFKzM4MyAgICAgICAwZSszODQgIC0+ICAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitkZGZtYTI4NzIgZm1hICAgICAgIDkuOTk5RSszODMgMTAwICAgMGUrMzg0ICAtPiAgIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZGRmbWEyODczIGZtYSAgICAgIC05Ljk5OUUrMzgzIDEwMCAgIDBlKzM4NCAgLT4gIC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworLS0gY2hlY2sgZm9yIGRvdWJsZS1yb3VuZGVkIHN1Ym5vcm1hbHMKK2RkZm1hMjg4MSBmbWEgICAxLjIzNDdFLTM1NSAxLjIzNDdFLTQwICAgIDBlKzM4NCAgLT4gICAxLjUyNEUtMzk1IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkZGZtYTI4ODIgZm1hICAgMS4yMzRFLTM1NSAxLjIzNEUtNDAgICAgICAwZSszODQgIC0+ICAgMS41MjNFLTM5NSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRmbWEyODgzIGZtYSAgIDEuMjNFLTM1NSAgMS4yM0UtNDAgICAgICAgMGUrMzg0ICAtPiAgIDEuNTEzRS0zOTUgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkZm1hMjg4NCBmbWEgICAxLjJFLTM1NSAgIDEuMkUtNDAgICAgICAgIDBlKzM4NCAgLT4gICAxLjQ0RS0zOTUgIFN1Ym5vcm1hbAorZGRmbWEyODg1IGZtYSAgIDEuMkUtMzU1ICAgMS4yRS00MSAgICAgICAgMGUrMzg0ICAtPiAgIDEuNDRFLTM5NiAgU3Vibm9ybWFsCitkZGZtYTI4ODYgZm1hICAgMS4yRS0zNTUgICAxLjJFLTQyICAgICAgICAwZSszODQgIC0+ICAgMS40RS0zOTcgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZGRmbWEyODg3IGZtYSAgIDEuMkUtMzU1ICAgMS4zRS00MiAgICAgICAgMGUrMzg0ICAtPiAgIDEuNkUtMzk3ICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2RkZm1hMjg4OCBmbWEgICAxLjNFLTM1NSAgIDEuM0UtNDIgICAgICAgIDBlKzM4NCAgLT4gICAxLjdFLTM5NyAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkZGZtYTI4ODkgZm1hICAgMS4zRS0zNTUgICAxLjNFLTQzICAgICAgICAwZSszODQgIC0+ICAgICAyRS0zOTggICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZGRmbWEyODkwIGZtYSAgIDEuM0UtMzU2ICAgMS4zRS00MyAgICAgICAgMGUrMzg0ICAtPiAgICAgMEUtMzk4ICAgQ2xhbXBlZCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworCitkZGZtYTI4OTEgZm1hICAgMS4yMzQ1RS0zOSAgIDEuMjM0RS0zNTUgICAwZSszODQgIC0+ICAgMS41MjM0RS0zOTQgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkZm1hMjg5MiBmbWEgICAxLjIzNDU2RS0zOSAgMS4yMzRFLTM1NSAgIDBlKzM4NCAgLT4gICAxLjUyMzRFLTM5NCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRmbWEyODkzIGZtYSAgIDEuMjM0NUUtNDAgICAxLjIzNEUtMzU1ICAgMGUrMzg0ICAtPiAgIDEuNTIzRS0zOTUgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkZGZtYTI4OTQgZm1hICAgMS4yMzQ1NkUtNDAgIDEuMjM0RS0zNTUgICAwZSszODQgIC0+ICAgMS41MjNFLTM5NSAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkZm1hMjg5NSBmbWEgICAxLjIzNDVFLTQxICAgMS4yMzRFLTM1NSAgIDBlKzM4NCAgLT4gICAxLjUyRS0zOTYgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRmbWEyODk2IGZtYSAgIDEuMjM0NTZFLTQxICAxLjIzNEUtMzU1ICAgMGUrMzg0ICAtPiAgIDEuNTJFLTM5NiAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIE5vdyBleHBsb3JlIHRoZSBjYXNlIHdoZXJlIHdlIGdldCBhIG5vcm1hbCByZXN1bHQgd2l0aCBVbmRlcmZsb3cKK2RkZm1hMjkwMCBmbWEgICAwLjMwMDAwMDAwMDBFLTE5MSAwLjMwMDAwMDAwMDBFLTE5MSAgIDBlKzM4NCAgLT4gIDkuMDAwMDAwMDAwMDAwMDBFLTM4NCBTdWJub3JtYWwgUm91bmRlZAorZGRmbWEyOTAxIGZtYSAgIDAuMzAwMDAwMDAwMUUtMTkxIDAuMzAwMDAwMDAwMUUtMTkxICAgMGUrMzg0ICAtPiAgOS4wMDAwMDAwMDYwMDAwMEUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitkZGZtYTI5MDIgZm1hICAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5ICAgICAgICAgICAwZSszODQgIC0+ICA5Ljk5OTk5OTk5OTk5MDAwRS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2RkZm1hMjkwMyBmbWEgICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5ICAgICAgICAgIDBlKzM4NCAgLT4gIDkuOTk5OTk5OTk5OTk5MDBFLTM4NCBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZGRmbWEyOTA0IGZtYSAgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTk5ICAgICAgICAgMGUrMzg0ICAtPiAgOS45OTk5OTk5OTk5OTk5MEUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitkZGZtYTI5MDUgZm1hICAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTk5ICAgICAgICAwZSszODQgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKKy0tIHByb3ZlIG9wZXJhbmRzIGFyZSBleGFjdAorZGRmbWEyOTA2IGZtYSAgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDEgICAgICAgICAgICAgICAgICAgICAgICAgMGUrMzg0ICAtPiAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MworZGRmbWEyOTA3IGZtYSAgICAgICAgICAgICAgICAgICAgICAgIDEgIDAuMDk5OTk5OTk5OTk5OTk5OTkgICAgICAgMGUrMzg0ICAtPiAgMC4wOTk5OTk5OTk5OTk5OTk5OQorLS0gdGhlIG5leHQgcm91bmRzIHRvIE5taW4KK2RkZm1hMjkwOCBmbWEgICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5OTk5ICAgICAgIDBlKzM4NCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKKworLS0gaHVnZXN0CitkZGZtYTI5MDkgZm1hICAgOTk5OTk5OTk5OTk5OTk5OSA5OTk5OTk5OTk5OTk5OTk5ICAgMGUrMzg0ICAtPiAgOS45OTk5OTk5OTk5OTk5OThFKzMxIEluZXhhY3QgUm91bmRlZAorCistLSBOdWxsIHRlc3RzCitkZGZtYTI5OTAgZm1hICAxMCAgIyAgIDBlKzM4NCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyOTkxIGZtYSAgICMgMTAgICAwZSszODQgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworCistLSBBRERJVElPTiBURVNUUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gW2ZpcnN0IGdyb3VwIGFyZSAncXVpY2sgY29uZmlkZW5jZSBjaGVjayddCitkZGZtYTMwMDEgZm1hICAxICAxICAgICAgIDEgICAgICAgLT4gIDIKK2RkZm1hMzAwMiBmbWEgIDEgIDIgICAgICAgMyAgICAgICAtPiAgNQorZGRmbWEzMDAzIGZtYSAgMSAgJzUuNzUnICAnMy4zJyAgIC0+ICA5LjA1CitkZGZtYTMwMDQgZm1hICAxICAnNScgICAgICctMycgICAgLT4gIDIKK2RkZm1hMzAwNSBmbWEgIDEgICctNScgICAgJy0zJyAgICAtPiAgLTgKK2RkZm1hMzAwNiBmbWEgIDEgICctNycgICAgJzIuNScgICAtPiAgLTQuNQorZGRmbWEzMDA3IGZtYSAgMSAgJzAuNycgICAnMC4zJyAgIC0+ICAxLjAKK2RkZm1hMzAwOCBmbWEgIDEgICcxLjI1JyAgJzEuMjUnICAtPiAgMi41MAorZGRmbWEzMDA5IGZtYSAgMSAgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAwMCcgLT4gJzIuMjM0NTY3ODknCitkZGZtYTMwMTAgZm1hICAxICAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDExJyAtPiAnMi4yMzQ1NjgwMCcKKworLS0gICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RkZm1hMzAxMSBmbWEgIDEgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDYnICAnMC41NTU1NTU1NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMDEyIGZtYSAgMSAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NScgICcwLjU1NTU1NTU1NTU1NTU1NTUnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZGRmbWEzMDEzIGZtYSAgMSAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTUnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTknCitkZGZtYTMwMTQgZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC40OScgICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwMTUgZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC40OTknICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwMTYgZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC40OTk5JyAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwMTcgZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MDAwJyAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwMTggZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MDAxJyAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwMTkgZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MDEnICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwMjAgZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MScgICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMzAyMSBmbWEgIDEgIDAgMSAtPiAxCitkZGZtYTMwMjIgZm1hICAxICAxIDEgLT4gMgorZGRmbWEzMDIzIGZtYSAgMSAgMiAxIC0+IDMKK2RkZm1hMzAyNCBmbWEgIDEgIDMgMSAtPiA0CitkZGZtYTMwMjUgZm1hICAxICA0IDEgLT4gNQorZGRmbWEzMDI2IGZtYSAgMSAgNSAxIC0+IDYKK2RkZm1hMzAyNyBmbWEgIDEgIDYgMSAtPiA3CitkZGZtYTMwMjggZm1hICAxICA3IDEgLT4gOAorZGRmbWEzMDI5IGZtYSAgMSAgOCAxIC0+IDkKK2RkZm1hMzAzMCBmbWEgIDEgIDkgMSAtPiAxMAorCistLSBzb21lIGNhcnJ5aW5nIGVmZmVjdHMKK2RkZm1hMzAzMSBmbWEgIDEgICcwLjk5OTgnICAnMC4wMDAwJyAtPiAnMC45OTk4JworZGRmbWEzMDMyIGZtYSAgMSAgJzAuOTk5OCcgICcwLjAwMDEnIC0+ICcwLjk5OTknCitkZGZtYTMwMzMgZm1hICAxICAnMC45OTk4JyAgJzAuMDAwMicgLT4gJzEuMDAwMCcKK2RkZm1hMzAzNCBmbWEgIDEgICcwLjk5OTgnICAnMC4wMDAzJyAtPiAnMS4wMDAxJworCitkZGZtYTMwMzUgZm1hICAxICAnNzAnICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzAzNiBmbWEgIDEgICc3MDAnICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzAzNyBmbWEgIDEgICc3MDAwJyAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwMzggZm1hICAxICAnNzAwMDAnICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDFFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzAzOSBmbWEgIDEgICc3MDAwMDAnICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDdFKzIwJyBSb3VuZGVkCisKKy0tIHN5bW1ldHJ5OgorZGRmbWEzMDQwIGZtYSAgMSAgJzEwMDAwZSsxNicgICc3MCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwNDEgZm1hICAxICAnMTAwMDBlKzE2JyAgJzcwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwNDIgZm1hICAxICAnMTAwMDBlKzE2JyAgJzcwMDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMDQ0IGZtYSAgMSAgJzEwMDAwZSsxNicgICc3MDAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAxRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwNDUgZm1hICAxICAnMTAwMDBlKzE2JyAgJzcwMDAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDA3RSsyMCcgUm91bmRlZAorCistLSBzYW1lLCB3aXRob3V0IHJvdW5kaW5nCitkZGZtYTMwNDYgZm1hICAxICAnMTAwMDBlKzknICAnNycgLT4gJzEwMDAwMDAwMDAwMDA3JworZGRmbWEzMDQ3IGZtYSAgMSAgJzEwMDAwZSs5JyAgJzcwJyAtPiAnMTAwMDAwMDAwMDAwNzAnCitkZGZtYTMwNDggZm1hICAxICAnMTAwMDBlKzknICAnNzAwJyAtPiAnMTAwMDAwMDAwMDA3MDAnCitkZGZtYTMwNDkgZm1hICAxICAnMTAwMDBlKzknICAnNzAwMCcgLT4gJzEwMDAwMDAwMDA3MDAwJworZGRmbWEzMDUwIGZtYSAgMSAgJzEwMDAwZSs5JyAgJzcwMDAwJyAtPiAnMTAwMDAwMDAwNzAwMDAnCitkZGZtYTMwNTEgZm1hICAxICAnMTAwMDBlKzknICAnNzAwMDAwJyAtPiAnMTAwMDAwMDA3MDAwMDAnCitkZGZtYTMwNTIgZm1hICAxICAnMTAwMDBlKzknICAnNzAwMDAwMCcgLT4gJzEwMDAwMDA3MDAwMDAwJworCistLSBleGFtcGxlcyBmcm9tIGRlY2FyaXRoCitkZGZtYTMwNTMgZm1hICAxICAnMTInICc3LjAwJyAtPiAnMTkuMDAnCitkZGZtYTMwNTQgZm1hICAxICAnMS4zJyAnLTEuMDcnIC0+ICcwLjIzJworZGRmbWEzMDU1IGZtYSAgMSAgJzEuMycgJy0xLjMwJyAtPiAnMC4wMCcKK2RkZm1hMzA1NiBmbWEgIDEgICcxLjMnICctMi4wNycgLT4gJy0wLjc3JworZGRmbWEzMDU3IGZtYSAgMSAgJzFFKzInICcxRSs0JyAtPiAnMS4wMUUrNCcKKworLS0gbGVhZGluZyB6ZXJvIHByZXNlcnZhdGlvbgorZGRmbWEzMDYxIGZtYSAgMSAgMSAnMC4wMDAxJyAtPiAnMS4wMDAxJworZGRmbWEzMDYyIGZtYSAgMSAgMSAnMC4wMDAwMScgLT4gJzEuMDAwMDEnCitkZGZtYTMwNjMgZm1hICAxICAxICcwLjAwMDAwMScgLT4gJzEuMDAwMDAxJworZGRmbWEzMDY0IGZtYSAgMSAgMSAnMC4wMDAwMDAxJyAtPiAnMS4wMDAwMDAxJworZGRmbWEzMDY1IGZtYSAgMSAgMSAnMC4wMDAwMDAwMScgLT4gJzEuMDAwMDAwMDEnCisKKy0tIHNvbWUgZnVubnkgemVyb3MgW2luIGNhc2Ugb2YgYmFkIHNpZ251bV0KK2RkZm1hMzA3MCBmbWEgIDEgIDEgIDAgICAgLT4gMQorZGRmbWEzMDcxIGZtYSAgMSAgMSAwLiAgICAtPiAxCitkZGZtYTMwNzIgZm1hICAxICAxICAuMCAgIC0+IDEuMAorZGRmbWEzMDczIGZtYSAgMSAgMSAwLjAgICAtPiAxLjAKK2RkZm1hMzA3NCBmbWEgIDEgIDEgMC4wMCAgLT4gMS4wMAorZGRmbWEzMDc1IGZtYSAgMSAgIDAgIDEgICAtPiAxCitkZGZtYTMwNzYgZm1hICAxICAwLiAgMSAgIC0+IDEKK2RkZm1hMzA3NyBmbWEgIDEgICAuMCAxICAgLT4gMS4wCitkZGZtYTMwNzggZm1hICAxICAwLjAgMSAgIC0+IDEuMAorZGRmbWEzMDc5IGZtYSAgMSAgMC4wMCAxICAtPiAxLjAwCisKKy0tIHNvbWUgY2FycmllcworZGRmbWEzMDgwIGZtYSAgMSAgOTk5OTk5OTk4IDEgIC0+IDk5OTk5OTk5OQorZGRmbWEzMDgxIGZtYSAgMSAgOTk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMDAKK2RkZm1hMzA4MiBmbWEgIDEgICA5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAKK2RkZm1hMzA4MyBmbWEgIDEgICAgOTk5OTk5OSAxICAtPiAxMDAwMDAwMAorZGRmbWEzMDg0IGZtYSAgMSAgICAgOTk5OTk5IDEgIC0+IDEwMDAwMDAKK2RkZm1hMzA4NSBmbWEgIDEgICAgICA5OTk5OSAxICAtPiAxMDAwMDAKK2RkZm1hMzA4NiBmbWEgIDEgICAgICAgOTk5OSAxICAtPiAxMDAwMAorZGRmbWEzMDg3IGZtYSAgMSAgICAgICAgOTk5IDEgIC0+IDEwMDAKK2RkZm1hMzA4OCBmbWEgIDEgICAgICAgICA5OSAxICAtPiAxMDAKK2RkZm1hMzA4OSBmbWEgIDEgICAgICAgICAgOSAxICAtPiAxMAorCisKKy0tIG1vcmUgTEhTIHN3YXBzCitkZGZtYTMwOTAgZm1hICAxICAnLTU2MjY3RS0xMCcgICAwIC0+ICAnLTAuMDAwMDA1NjI2NycKK2RkZm1hMzA5MSBmbWEgIDEgICctNTYyNjdFLTYnICAgIDAgLT4gICctMC4wNTYyNjcnCitkZGZtYTMwOTIgZm1hICAxICAnLTU2MjY3RS01JyAgICAwIC0+ICAnLTAuNTYyNjcnCitkZGZtYTMwOTMgZm1hICAxICAnLTU2MjY3RS00JyAgICAwIC0+ICAnLTUuNjI2NycKK2RkZm1hMzA5NCBmbWEgIDEgICctNTYyNjdFLTMnICAgIDAgLT4gICctNTYuMjY3JworZGRmbWEzMDk1IGZtYSAgMSAgJy01NjI2N0UtMicgICAgMCAtPiAgJy01NjIuNjcnCitkZGZtYTMwOTYgZm1hICAxICAnLTU2MjY3RS0xJyAgICAwIC0+ICAnLTU2MjYuNycKK2RkZm1hMzA5NyBmbWEgIDEgICctNTYyNjdFLTAnICAgIDAgLT4gICctNTYyNjcnCitkZGZtYTMwOTggZm1hICAxICAnLTVFLTEwJyAgICAgICAwIC0+ICAnLTVFLTEwJworZGRmbWEzMDk5IGZtYSAgMSAgJy01RS03JyAgICAgICAgMCAtPiAgJy01RS03JworZGRmbWEzMTAwIGZtYSAgMSAgJy01RS02JyAgICAgICAgMCAtPiAgJy0wLjAwMDAwNScKK2RkZm1hMzEwMSBmbWEgIDEgICctNUUtNScgICAgICAgIDAgLT4gICctMC4wMDAwNScKK2RkZm1hMzEwMiBmbWEgIDEgICctNUUtNCcgICAgICAgIDAgLT4gICctMC4wMDA1JworZGRmbWEzMTAzIGZtYSAgMSAgJy01RS0xJyAgICAgICAgMCAtPiAgJy0wLjUnCitkZGZtYTMxMDQgZm1hICAxICAnLTVFMCcgICAgICAgICAwIC0+ICAnLTUnCitkZGZtYTMxMDUgZm1hICAxICAnLTVFMScgICAgICAgICAwIC0+ICAnLTUwJworZGRmbWEzMTA2IGZtYSAgMSAgJy01RTUnICAgICAgICAgMCAtPiAgJy01MDAwMDAnCitkZGZtYTMxMDcgZm1hICAxICAnLTVFMTUnICAgICAgICAwIC0+ICAnLTUwMDAwMDAwMDAwMDAwMDAnCitkZGZtYTMxMDggZm1hICAxICAnLTVFMTYnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNicgIFJvdW5kZWQKK2RkZm1hMzEwOSBmbWEgIDEgICctNUUxNycgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE3JyAgUm91bmRlZAorZGRmbWEzMTEwIGZtYSAgMSAgJy01RTE4JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTgnICBSb3VuZGVkCitkZGZtYTMxMTEgZm1hICAxICAnLTVFMTAwJyAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxMDAnIFJvdW5kZWQKKworLS0gbW9yZSBSSFMgc3dhcHMKK2RkZm1hMzExMyBmbWEgIDEgIDAgICctNTYyNjdFLTEwJyAtPiAgJy0wLjAwMDAwNTYyNjcnCitkZGZtYTMxMTQgZm1hICAxICAwICAnLTU2MjY3RS02JyAgLT4gICctMC4wNTYyNjcnCitkZGZtYTMxMTYgZm1hICAxICAwICAnLTU2MjY3RS01JyAgLT4gICctMC41NjI2NycKK2RkZm1hMzExNyBmbWEgIDEgIDAgICctNTYyNjdFLTQnICAtPiAgJy01LjYyNjcnCitkZGZtYTMxMTkgZm1hICAxICAwICAnLTU2MjY3RS0zJyAgLT4gICctNTYuMjY3JworZGRmbWEzMTIwIGZtYSAgMSAgMCAgJy01NjI2N0UtMicgIC0+ICAnLTU2Mi42NycKK2RkZm1hMzEyMSBmbWEgIDEgIDAgICctNTYyNjdFLTEnICAtPiAgJy01NjI2LjcnCitkZGZtYTMxMjIgZm1hICAxICAwICAnLTU2MjY3RS0wJyAgLT4gICctNTYyNjcnCitkZGZtYTMxMjMgZm1hICAxICAwICAnLTVFLTEwJyAgICAgLT4gICctNUUtMTAnCitkZGZtYTMxMjQgZm1hICAxICAwICAnLTVFLTcnICAgICAgLT4gICctNUUtNycKK2RkZm1hMzEyNSBmbWEgIDEgIDAgICctNUUtNicgICAgICAtPiAgJy0wLjAwMDAwNScKK2RkZm1hMzEyNiBmbWEgIDEgIDAgICctNUUtNScgICAgICAtPiAgJy0wLjAwMDA1JworZGRmbWEzMTI3IGZtYSAgMSAgMCAgJy01RS00JyAgICAgIC0+ICAnLTAuMDAwNScKK2RkZm1hMzEyOCBmbWEgIDEgIDAgICctNUUtMScgICAgICAtPiAgJy0wLjUnCitkZGZtYTMxMjkgZm1hICAxICAwICAnLTVFMCcgICAgICAgLT4gICctNScKK2RkZm1hMzEzMCBmbWEgIDEgIDAgICctNUUxJyAgICAgICAtPiAgJy01MCcKK2RkZm1hMzEzMSBmbWEgIDEgIDAgICctNUU1JyAgICAgICAtPiAgJy01MDAwMDAnCitkZGZtYTMxMzIgZm1hICAxICAwICAnLTVFMTUnICAgICAgLT4gICctNTAwMDAwMDAwMDAwMDAwMCcKK2RkZm1hMzEzMyBmbWEgIDEgIDAgICctNUUxNicgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTYnICAgUm91bmRlZAorZGRmbWEzMTM0IGZtYSAgMSAgMCAgJy01RTE3JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNycgICBSb3VuZGVkCitkZGZtYTMxMzUgZm1hICAxICAwICAnLTVFMTgnICAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE4JyAgIFJvdW5kZWQKK2RkZm1hMzEzNiBmbWEgIDEgIDAgICctNUUxMDAnICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTAwJyAgUm91bmRlZAorCistLSByZWxhdGVkCitkZGZtYTMxMzcgZm1hICAxICAgMSAgJzBFLTE5JyAgICAgIC0+ICAnMS4wMDAwMDAwMDAwMDAwMDAnICBSb3VuZGVkCitkZGZtYTMxMzggZm1hICAxICAtMSAgJzBFLTE5JyAgICAgIC0+ICAnLTEuMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCitkZGZtYTMxMzkgZm1hICAxICAnMEUtMTknIDEgICAgICAgIC0+ICAnMS4wMDAwMDAwMDAwMDAwMDAnICBSb3VuZGVkCitkZGZtYTMxNDAgZm1hICAxICAnMEUtMTknIC0xICAgICAgIC0+ICAnLTEuMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCitkZGZtYTMxNDEgZm1hICAxICAxRSsxMSAgIDAuMDAwMCAgIC0+ICAnMTAwMDAwMDAwMDAwLjAwMDAnCitkZGZtYTMxNDIgZm1hICAxICAxRSsxMSAgIDAuMDAwMDAgIC0+ICAnMTAwMDAwMDAwMDAwLjAwMDAnICBSb3VuZGVkCitkZGZtYTMxNDMgZm1hICAxICAwLjAwMCAgIDFFKzEyICAgIC0+ICAnMTAwMDAwMDAwMDAwMC4wMDAnCitkZGZtYTMxNDQgZm1hICAxICAwLjAwMDAgIDFFKzEyICAgIC0+ICAnMTAwMDAwMDAwMDAwMC4wMDAnICBSb3VuZGVkCisKKy0tIFtzb21lIG9mIHRoZSBuZXh0IGdyb3VwIGFyZSByZWFsbHkgY29uc3RydWN0b3IgdGVzdHNdCitkZGZtYTMxNDYgZm1hICAxICAnMDAuMCcgIDAgICAgICAgLT4gICcwLjAnCitkZGZtYTMxNDcgZm1hICAxICAnMC4wMCcgIDAgICAgICAgLT4gICcwLjAwJworZGRmbWEzMTQ4IGZtYSAgMSAgIDAgICAgICAnMC4wMCcgIC0+ICAnMC4wMCcKK2RkZm1hMzE0OSBmbWEgIDEgICAwICAgICAgJzAwLjAnICAtPiAgJzAuMCcKK2RkZm1hMzE1MCBmbWEgIDEgICcwMC4wJyAgJzAuMDAnICAtPiAgJzAuMDAnCitkZGZtYTMxNTEgZm1hICAxICAnMC4wMCcgICcwMC4wJyAgLT4gICcwLjAwJworZGRmbWEzMTUyIGZtYSAgMSAgJzMnICAgICAnLjMnICAgIC0+ICAnMy4zJworZGRmbWEzMTUzIGZtYSAgMSAgJzMuJyAgICAnLjMnICAgIC0+ICAnMy4zJworZGRmbWEzMTU0IGZtYSAgMSAgJzMuMCcgICAnLjMnICAgIC0+ICAnMy4zJworZGRmbWEzMTU1IGZtYSAgMSAgJzMuMDAnICAnLjMnICAgIC0+ICAnMy4zMCcKK2RkZm1hMzE1NiBmbWEgIDEgICczJyAgICAgJzMnICAgICAtPiAgJzYnCitkZGZtYTMxNTcgZm1hICAxICAnMycgICAgICcrMycgICAgLT4gICc2JworZGRmbWEzMTU4IGZtYSAgMSAgJzMnICAgICAnLTMnICAgIC0+ICAnMCcKK2RkZm1hMzE1OSBmbWEgIDEgICcwLjMnICAgJy0wLjMnICAtPiAgJzAuMCcKK2RkZm1hMzE2MCBmbWEgIDEgICcwLjAzJyAgJy0wLjAzJyAtPiAgJzAuMDAnCisKKy0tIHRyeSBib3JkZXJsaW5lIHByZWNpc2lvbiwgd2l0aCBjYXJyaWVzLCBldGMuCitkZGZtYTMxNjEgZm1hICAxICAnMUUrMTInICctMScgICAgLT4gJzk5OTk5OTk5OTk5OScKK2RkZm1hMzE2MiBmbWEgIDEgICcxRSsxMicgICcxLjExJyAtPiAnMTAwMDAwMDAwMDAwMS4xMScKK2RkZm1hMzE2MyBmbWEgIDEgICcxLjExJyAgJzFFKzEyJyAtPiAnMTAwMDAwMDAwMDAwMS4xMScKK2RkZm1hMzE2NCBmbWEgIDEgICctMScgICAgJzFFKzEyJyAtPiAnOTk5OTk5OTk5OTk5JworZGRmbWEzMTY1IGZtYSAgMSAgJzdFKzEyJyAnLTEnICAgIC0+ICc2OTk5OTk5OTk5OTk5JworZGRmbWEzMTY2IGZtYSAgMSAgJzdFKzEyJyAgJzEuMTEnIC0+ICc3MDAwMDAwMDAwMDAxLjExJworZGRmbWEzMTY3IGZtYSAgMSAgJzEuMTEnICAnN0UrMTInIC0+ICc3MDAwMDAwMDAwMDAxLjExJworZGRmbWEzMTY4IGZtYSAgMSAgJy0xJyAgICAnN0UrMTInIC0+ICc2OTk5OTk5OTk5OTk5JworCityb3VuZGluZzogaGFsZl91cAorLS0gICAgICAgICAgIDEuMjM0NTY3ODkwMTIzNDU2ICAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgIDEgMjM0NTY3ODkwMTIzNDU2CitkZGZtYTMxNzAgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTY3JyAtPiAnNS4wMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMTcxIGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2NicgLT4gJzUuMDAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzE3MiBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjUnIC0+ICc1LjAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMxNzMgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTY0JyAtPiAnNS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMTc0IGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1MycgLT4gJzQuOTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzE3NSBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTInIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMxNzYgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUxJyAtPiAnNC45OTk5OTk5OTk5OTk5OTknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMTc3IGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1MCcgLT4gJzQuOTk5OTk5OTk5OTk5OTk5JyBSb3VuZGVkCitkZGZtYTMxNzggZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTQ1JyAtPiAnNC45OTk5OTk5OTk5OTk5OTknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMTc5IGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU0NCcgLT4gJzQuOTk5OTk5OTk5OTk5OTk4JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzE4MCBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NDMnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMxODEgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTQyJyAtPiAnNC45OTk5OTk5OTk5OTk5OTgnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMTgyIGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU0MScgLT4gJzQuOTk5OTk5OTk5OTk5OTk4JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzE4MyBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NDAnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OCcgUm91bmRlZAorCistLSBhbmQgc29tZSBtb3JlLCBpbmNsdWRpbmcgcmVzaWR1ZSBlZmZlY3RzIGFuZCBkaWZmZXJlbnQgcm91bmRpbmdzCityb3VuZGluZzogaGFsZl91cAorZGRmbWEzMjAwIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknCitkZGZtYTMyMDEgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMDIgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMDMgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMDQgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMDUgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMDYgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMDcgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMDggZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMDkgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMTAgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMTEgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMTIgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMTMgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMTQgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMTUgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMTYgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcKK2RkZm1hMzIxNyBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzIxOCBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzIxOSBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZGRmbWEzMjIwIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknCitkZGZtYTMyMjEgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMjIgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMjMgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMjQgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMjUgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMjYgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMjcgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMjggZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMjkgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMzAgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMzEgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMzIgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMzMgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMzQgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMzUgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMzYgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcKK2RkZm1hMzIzNyBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzIzOCBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzIzOSBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitkZGZtYTMyNDAgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OCcgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNDEgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OCcgMC41ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNDIgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OCcgMC41MDAwMDAwMDEgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkZGZtYTMyNTAgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScKK2RkZm1hMzI1MSBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI1MiBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI1MyBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI1NCBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI1NSBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI1NiBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI1NyBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI1OCBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI1OSBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI2MCBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI2MSBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI2MiBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI2MyBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI2NCBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI2NSBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI2NiBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJworZGRmbWEzMjY3IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjY4IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjY5IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCistLSAxIGluIGxhc3QgcGxhY2UgdGVzdHMKK3JvdW5kaW5nOiBoYWxmX3VwCitkZGZtYTMzMDEgZm1hICAxICAgLTEgICAxICAgICAgLT4gICAwCitkZGZtYTMzMDIgZm1hICAxICAgIDAgICAxICAgICAgLT4gICAxCitkZGZtYTMzMDMgZm1hICAxICAgIDEgICAxICAgICAgLT4gICAyCitkZGZtYTMzMDQgZm1hICAxICAgMTIgICAxICAgICAgLT4gIDEzCitkZGZtYTMzMDUgZm1hICAxICAgOTggICAxICAgICAgLT4gIDk5CitkZGZtYTMzMDYgZm1hICAxICAgOTkgICAxICAgICAgLT4gMTAwCitkZGZtYTMzMDcgZm1hICAxICAxMDAgICAxICAgICAgLT4gMTAxCitkZGZtYTMzMDggZm1hICAxICAxMDEgICAxICAgICAgLT4gMTAyCitkZGZtYTMzMDkgZm1hICAxICAgLTEgIC0xICAgICAgLT4gIC0yCitkZGZtYTMzMTAgZm1hICAxICAgIDAgIC0xICAgICAgLT4gIC0xCitkZGZtYTMzMTEgZm1hICAxICAgIDEgIC0xICAgICAgLT4gICAwCitkZGZtYTMzMTIgZm1hICAxICAgMTIgIC0xICAgICAgLT4gIDExCitkZGZtYTMzMTMgZm1hICAxICAgOTggIC0xICAgICAgLT4gIDk3CitkZGZtYTMzMTQgZm1hICAxICAgOTkgIC0xICAgICAgLT4gIDk4CitkZGZtYTMzMTUgZm1hICAxICAxMDAgIC0xICAgICAgLT4gIDk5CitkZGZtYTMzMTYgZm1hICAxICAxMDEgIC0xICAgICAgLT4gMTAwCisKK2RkZm1hMzMyMSBmbWEgIDEgIC0wLjAxICAwLjAxICAgIC0+ICAwLjAwCitkZGZtYTMzMjIgZm1hICAxICAgMC4wMCAgMC4wMSAgICAtPiAgMC4wMQorZGRmbWEzMzIzIGZtYSAgMSAgIDAuMDEgIDAuMDEgICAgLT4gIDAuMDIKK2RkZm1hMzMyNCBmbWEgIDEgICAwLjEyICAwLjAxICAgIC0+ICAwLjEzCitkZGZtYTMzMjUgZm1hICAxICAgMC45OCAgMC4wMSAgICAtPiAgMC45OQorZGRmbWEzMzI2IGZtYSAgMSAgIDAuOTkgIDAuMDEgICAgLT4gIDEuMDAKK2RkZm1hMzMyNyBmbWEgIDEgICAxLjAwICAwLjAxICAgIC0+ICAxLjAxCitkZGZtYTMzMjggZm1hICAxICAgMS4wMSAgMC4wMSAgICAtPiAgMS4wMgorZGRmbWEzMzI5IGZtYSAgMSAgLTAuMDEgLTAuMDEgICAgLT4gLTAuMDIKK2RkZm1hMzMzMCBmbWEgIDEgICAwLjAwIC0wLjAxICAgIC0+IC0wLjAxCitkZGZtYTMzMzEgZm1hICAxICAgMC4wMSAtMC4wMSAgICAtPiAgMC4wMAorZGRmbWEzMzMyIGZtYSAgMSAgIDAuMTIgLTAuMDEgICAgLT4gIDAuMTEKK2RkZm1hMzMzMyBmbWEgIDEgICAwLjk4IC0wLjAxICAgIC0+ICAwLjk3CitkZGZtYTMzMzQgZm1hICAxICAgMC45OSAtMC4wMSAgICAtPiAgMC45OAorZGRmbWEzMzM1IGZtYSAgMSAgIDEuMDAgLTAuMDEgICAgLT4gIDAuOTkKK2RkZm1hMzMzNiBmbWEgIDEgICAxLjAxIC0wLjAxICAgIC0+ICAxLjAwCisKKy0tIHNvbWUgbW9yZSBjYXNlcyB3aGVyZSBhZGRpbmcgMCBhZmZlY3RzIHRoZSBjb2VmZmljaWVudAorZGRmbWEzMzQwIGZtYSAgMSAgMUUrMyAgICAwICAgIC0+ICAgICAgICAgMTAwMAorZGRmbWEzMzQxIGZtYSAgMSAgMUUrMTUgICAwICAgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDAKK2RkZm1hMzM0MiBmbWEgIDEgIDFFKzE2ICAgMCAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiAgUm91bmRlZAorZGRmbWEzMzQzIGZtYSAgMSAgMUUrMjAgICAwICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzIwICBSb3VuZGVkCistLSB3aGljaCBzaW1wbHkgZm9sbG93IGZyb20gdGhlc2UgY2FzZXMgLi4uCitkZGZtYTMzNDQgZm1hICAxICAxRSszICAgIDEgICAgLT4gICAgICAgICAxMDAxCitkZGZtYTMzNDUgZm1hICAxICAxRSsxNSAgIDEgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMQorZGRmbWEzMzQ2IGZtYSAgMSAgMUUrMTYgICAxICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzM0NyBmbWEgIDEgIDFFKzIwICAgMSAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsyMCAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMzNDggZm1hICAxICAxRSszICAgIDcgICAgLT4gICAgICAgICAxMDA3CitkZGZtYTMzNDkgZm1hICAxICAxRSsxNSAgIDcgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwNworZGRmbWEzMzUwIGZtYSAgMSAgMUUrMTYgICA3ICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDFFKzE2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzM1MSBmbWEgIDEgIDFFKzIwICAgNyAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsyMCAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRyeXplcm9zIGNhc2VzCityb3VuZGluZzogICAgaGFsZl91cAorZGRmbWEzMzYwICBmbWEgIDEgIDBFKzUwIDEwMDAwRSsxICAtPiAxLjAwMDBFKzUKK2RkZm1hMzM2MSAgZm1hICAxICAwRS01MCAxMDAwMEUrMSAgLT4gMTAwMDAwLjAwMDAwMDAwMDAgUm91bmRlZAorZGRmbWEzMzYyICBmbWEgIDEgIDEwMDAwRSsxIDBFLTUwICAtPiAxMDAwMDAuMDAwMDAwMDAwMCBSb3VuZGVkCitkZGZtYTMzNjMgIGZtYSAgMSAgMTAwMDBFKzEgMTAwMDBFLTUwICAtPiAxMDAwMDAuMDAwMDAwMDAwMCBSb3VuZGVkIEluZXhhY3QKK2RkZm1hMzM2NCAgZm1hICAxICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0+IDBFKzM2OQorCistLSBhIGN1cmlvc2l0eSBmcm9tIEpTUiAxMyB0ZXN0aW5nCityb3VuZGluZzogICAgaGFsZl9kb3duCitkZGZtYTMzNzAgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxMDAwMDAwMDAwMDAwODE0CitkZGZtYTMzNzEgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxLjAwMDAwMDAwMDAwMDA4MUUrMTYgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogICAgaGFsZl91cAorZGRmbWEzMzcyIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMTAwMDAwMDAwMDAwMDgxNAorZGRmbWEzMzczIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMS4wMDAwMDAwMDAwMDAwODFFKzE2IFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorZGRmbWEzMzc0IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMTAwMDAwMDAwMDAwMDgxNAorZGRmbWEzMzc1IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMS4wMDAwMDAwMDAwMDAwODFFKzE2IFJvdW5kZWQgSW5leGFjdAorCistLSB1bHAgcmVwbGFjZW1lbnQgdGVzdHMKK2RkZm1hMzQwMCBmbWEgIDEgICAgMSAgIDc3ZS0xNCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDc3CitkZGZtYTM0MDEgZm1hICAxICAgIDEgICA3N2UtMTUgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwNzcKK2RkZm1hMzQwMiBmbWEgIDEgICAgMSAgIDc3ZS0xNiAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzQwMyBmbWEgIDEgICAgMSAgIDc3ZS0xNyAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzQwNCBmbWEgIDEgICAgMSAgIDc3ZS0xOCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzQwNSBmbWEgIDEgICAgMSAgIDc3ZS0xOSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzQwNiBmbWEgIDEgICAgMSAgIDc3ZS0yOTkgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRmbWEzNDEwIGZtYSAgMSAgIDEwICAgNzdlLTE0ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDc3CitkZGZtYTM0MTEgZm1hICAxICAgMTAgICA3N2UtMTUgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MTIgZm1hICAxICAgMTAgICA3N2UtMTYgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MTMgZm1hICAxICAgMTAgICA3N2UtMTcgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MTQgZm1hICAxICAgMTAgICA3N2UtMTggICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MTUgZm1hICAxICAgMTAgICA3N2UtMTkgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MTYgZm1hICAxICAgMTAgICA3N2UtMjk5ICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMzQyMCBmbWEgIDEgICA3N2UtMTQgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDc3CitkZGZtYTM0MjEgZm1hICAxICAgNzdlLTE1ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwNzcKK2RkZm1hMzQyMiBmbWEgIDEgICA3N2UtMTYgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzQyMyBmbWEgIDEgICA3N2UtMTcgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzQyNCBmbWEgIDEgICA3N2UtMTggICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzQyNSBmbWEgIDEgICA3N2UtMTkgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzQyNiBmbWEgIDEgICA3N2UtMjk5ICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRmbWEzNDMwIGZtYSAgMSAgIDc3ZS0xNCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDc3CitkZGZtYTM0MzEgZm1hICAxICAgNzdlLTE1ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MzIgZm1hICAxICAgNzdlLTE2ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MzMgZm1hICAxICAgNzdlLTE3ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MzQgZm1hICAxICAgNzdlLTE4ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MzUgZm1hICAxICAgNzdlLTE5ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MzYgZm1hICAxICAgNzdlLTI5OSAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlIHVscHMKK2RkZm1hMzY0NDAgZm1hICAxICAgIDEgICAtNzdlLTE0ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY0NDEgZm1hICAxICAgIDEgICAtNzdlLTE1ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTIzCitkZGZtYTM2NDQyIGZtYSAgMSAgICAxICAgLTc3ZS0xNiAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY0NDMgZm1hICAxICAgIDEgICAtNzdlLTE3ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0NDQgZm1hICAxICAgIDEgICAtNzdlLTE4ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0NDUgZm1hICAxICAgIDEgICAtNzdlLTE5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjQ0NiBmbWEgIDEgICAgMSAgIC03N2UtOTkgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMzY0NTAgZm1hICAxICAgMTAgICAtNzdlLTE0ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTIzCitkZGZtYTM2NDUxIGZtYSAgMSAgIDEwICAgLTc3ZS0xNSAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY0NTIgZm1hICAxICAgMTAgICAtNzdlLTE2ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0NTMgZm1hICAxICAgMTAgICAtNzdlLTE3ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0NTQgZm1hICAxICAgMTAgICAtNzdlLTE4ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjQ1NSBmbWEgIDEgICAxMCAgIC03N2UtMTkgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDU2IGZtYSAgMSAgIDEwICAgLTc3ZS05OSAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRmbWEzNjQ2MCBmbWEgIDEgICAtNzdlLTE0ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTkyMworZGRmbWEzNjQ2MSBmbWEgIDEgICAtNzdlLTE1ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY0NjIgZm1hICAxICAgLTc3ZS0xNiAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTkyMworZGRmbWEzNjQ2MyBmbWEgIDEgICAtNzdlLTE3ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjQ2NCBmbWEgIDEgICAtNzdlLTE4ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjQ2NSBmbWEgIDEgICAtNzdlLTE5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDY2IGZtYSAgMSAgIC03N2UtOTkgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRmbWEzNjQ3MCBmbWEgIDEgICAtNzdlLTE0ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY0NzEgZm1hICAxICAgLTc3ZS0xNSAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTkyMworZGRmbWEzNjQ3MiBmbWEgIDEgICAtNzdlLTE2ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjQ3MyBmbWEgIDEgICAtNzdlLTE3ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjQ3NCBmbWEgIDEgICAtNzdlLTE4ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDc1IGZtYSAgMSAgIC03N2UtMTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0NzYgZm1hICAxICAgLTc3ZS05OSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBuZWdhdGl2ZSB1bHBzCitkZGZtYTM2NDgwIGZtYSAgMSAgIC0xICAgIDc3ZS0xNCAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTkyMworZGRmbWEzNjQ4MSBmbWEgIDEgICAtMSAgICA3N2UtMTUgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTIzCitkZGZtYTM2NDgyIGZtYSAgMSAgIC0xICAgIDc3ZS0xNiAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTIzCitkZGZtYTM2NDgzIGZtYSAgMSAgIC0xICAgIDc3ZS0xNyAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjQ4NCBmbWEgIDEgICAtMSAgICA3N2UtMTggICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0ODUgZm1hICAxICAgLTEgICAgNzdlLTE5ICAgICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0ODYgZm1hICAxICAgLTEgICAgNzdlLTk5ICAgICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRmbWEzNjQ5MCBmbWEgIDEgIC0xMCAgICA3N2UtMTQgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTIzCitkZGZtYTM2NDkxIGZtYSAgMSAgLTEwICAgIDc3ZS0xNSAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTIzCitkZGZtYTM2NDkyIGZtYSAgMSAgLTEwICAgIDc3ZS0xNiAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjQ5MyBmbWEgIDEgIC0xMCAgICA3N2UtMTcgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0OTQgZm1hICAxICAtMTAgICAgNzdlLTE4ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0OTUgZm1hICAxICAtMTAgICAgNzdlLTE5ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0OTYgZm1hICAxICAtMTAgICAgNzdlLTk5ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRmbWEzNjUwMCBmbWEgIDEgICAgNzdlLTE0ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY1MDEgZm1hICAxICAgIDc3ZS0xNSAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTkyMworZGRmbWEzNjUwMiBmbWEgIDEgICAgNzdlLTE2ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTkyMworZGRmbWEzNjUwMyBmbWEgIDEgICAgNzdlLTE3ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1MDQgZm1hICAxICAgIDc3ZS0xOCAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTA1IGZtYSAgMSAgICA3N2UtMTkgICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTA2IGZtYSAgMSAgICA3N2UtOTkgICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMzY1MTAgZm1hICAxICAgIDc3ZS0xNCAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTkyMworZGRmbWEzNjUxMSBmbWEgIDEgICAgNzdlLTE1ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTkyMworZGRmbWEzNjUxMiBmbWEgIDEgICAgNzdlLTE2ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1MTMgZm1hICAxICAgIDc3ZS0xNyAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTE0IGZtYSAgMSAgICA3N2UtMTggICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTE1IGZtYSAgMSAgICA3N2UtMTkgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTE2IGZtYSAgMSAgICA3N2UtOTkgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGFuZCBhIGNvdXBsZSBtb3JlIHdpdGggbG9uZ2VyIFJIUworZGRmbWEzNjUyMCBmbWEgIDEgICAgMSAgIC03Nzc3ZS0xNiAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTIyMjMKK2RkZm1hMzY1MjEgZm1hICAxICAgIDEgICAtNzc3N2UtMTcgICAgICAtPiAgMC45OTk5OTk5OTk5OTk5MjIyIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjUyMiBmbWEgIDEgICAgMSAgIC03Nzc3ZS0xOCAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5MjIgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTIzIGZtYSAgMSAgICAxICAgLTc3NzdlLTE5ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1MjQgZm1hICAxICAgIDEgICAtNzc3N2UtMjAgICAgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjUyNSBmbWEgIDEgICAgMSAgIC03Nzc3ZS0yMSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1MjYgZm1hICAxICAgIDEgICAtNzc3N2UtMjIgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKworLS0gYW5kIHNvbWUgbW9yZSByZXNpZHVlIGVmZmVjdHMgYW5kIGRpZmZlcmVudCByb3VuZGluZ3MKK3JvdW5kaW5nOiBoYWxmX3VwCitkZGZtYTM2NTQwIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknCitkZGZtYTM2NTQxIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU0MiBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NDMgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTQ0IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU0NSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NDYgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTQ3IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU0OCBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NDkgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTUwIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU1MSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NTIgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTUzIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU1NCBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NTUgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTU2IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnCitkZGZtYTM2NTU3IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU1OCBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NTkgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2RkZm1hMzY1NjAgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScKK2RkZm1hMzY1NjEgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTYyIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU2MyBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NjQgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTY1IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU2NiBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NjcgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTY4IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU2OSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NzAgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTcxIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU3MiBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NzMgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTc0IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU3NSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NzYgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcKK2RkZm1hMzY1NzcgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTc4IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU3OSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gY3JpdGljYWwgZmV3IHdpdGggZXZlbiBib3R0b20gZGlnaXQuLi4KK2RkZm1hMzc1NDAgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OCcgMC40OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTQxIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODgnIDAuNSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU0MiBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg4JyAwLjUwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGRvd24KK2RkZm1hMzc1NTAgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScKK2RkZm1hMzc1NTEgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTUyIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU1MyBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1NTQgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTU1IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU1NiBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1NTcgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTU4IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU1OSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1NjAgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTYxIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU2MiBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1NjMgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTY0IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU2NSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1NjYgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcKK2RkZm1hMzc1NjcgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTY4IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU2OSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworCistLSB2ZXJpZnkgYSBxdWVyeQorcm91bmRpbmc6ICAgICBkb3duCitkZGZtYTM3NjYxIGZtYSAgMSAgMWUtMzk4IDkuMDAwMDAwMDAwMDAwMDAwRSszODQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc2NjIgZm1hICAxICAgICAgIDAgOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IFJvdW5kZWQKK2RkZm1hMzc2NjMgZm1hICAxICAxZS0zODggOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzY2NCBmbWEgIDEgICAgICAgMCA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgUm91bmRlZAorCistLSBtb3JlIHplcm9zLCBldGMuCityb3VuZGluZzogaGFsZl9ldmVuCisKK2RkZm1hMzc3MDEgZm1hICAxICA1LjAwIDEuMDBFLTMgLT4gNS4wMDEwMAorZGRmbWEzNzcwMiBmbWEgIDEgIDAwLjAwIDAuMDAwICAtPiAwLjAwMAorZGRmbWEzNzcwMyBmbWEgIDEgIDAwLjAwIDBFLTMgICAtPiAwLjAwMAorZGRmbWEzNzcwNCBmbWEgIDEgIDBFLTMgIDAwLjAwICAtPiAwLjAwMAorCitkZGZtYTM3NzEwIGZtYSAgMSAgMEUrMyAgMDAuMDAgIC0+IDAuMDAKK2RkZm1hMzc3MTEgZm1hICAxICAwRSszICAwMC4wICAgLT4gMC4wCitkZGZtYTM3NzEyIGZtYSAgMSAgMEUrMyAgMDAuICAgIC0+IDAKK2RkZm1hMzc3MTMgZm1hICAxICAwRSszICAwMC5FKzEgLT4gMEUrMQorZGRmbWEzNzcxNCBmbWEgIDEgIDBFKzMgIDAwLkUrMiAtPiAwRSsyCitkZGZtYTM3NzE1IGZtYSAgMSAgMEUrMyAgMDAuRSszIC0+IDBFKzMKK2RkZm1hMzc3MTYgZm1hICAxICAwRSszICAwMC5FKzQgLT4gMEUrMworZGRmbWEzNzcxNyBmbWEgIDEgIDBFKzMgIDAwLkUrNSAtPiAwRSszCitkZGZtYTM3NzE4IGZtYSAgMSAgMEUrMyAgLTAwLjAgICAtPiAwLjAKK2RkZm1hMzc3MTkgZm1hICAxICAwRSszICAtMDAuICAgIC0+IDAKK2RkZm1hMzc3MzEgZm1hICAxICAwRSszICAtMDAuRSsxIC0+IDBFKzEKKworZGRmbWEzNzcyMCBmbWEgIDEgIDAwLjAwICAwRSszICAtPiAwLjAwCitkZGZtYTM3NzIxIGZtYSAgMSAgMDAuMCAgIDBFKzMgIC0+IDAuMAorZGRmbWEzNzcyMiBmbWEgIDEgIDAwLiAgICAwRSszICAtPiAwCitkZGZtYTM3NzIzIGZtYSAgMSAgMDAuRSsxIDBFKzMgIC0+IDBFKzEKK2RkZm1hMzc3MjQgZm1hICAxICAwMC5FKzIgMEUrMyAgLT4gMEUrMgorZGRmbWEzNzcyNSBmbWEgIDEgIDAwLkUrMyAwRSszICAtPiAwRSszCitkZGZtYTM3NzI2IGZtYSAgMSAgMDAuRSs0IDBFKzMgIC0+IDBFKzMKK2RkZm1hMzc3MjcgZm1hICAxICAwMC5FKzUgMEUrMyAgLT4gMEUrMworZGRmbWEzNzcyOCBmbWEgIDEgIC0wMC4wMCAwRSszICAtPiAwLjAwCitkZGZtYTM3NzI5IGZtYSAgMSAgLTAwLjAgIDBFKzMgIC0+IDAuMAorZGRmbWEzNzczMCBmbWEgIDEgIC0wMC4gICAwRSszICAtPiAwCisKK2RkZm1hMzc3MzIgZm1hICAxICAgMCAgICAgMCAgICAgLT4gIDAKK2RkZm1hMzc3MzMgZm1hICAxICAgMCAgICAtMCAgICAgLT4gIDAKK2RkZm1hMzc3MzQgZm1hICAxICAtMCAgICAgMCAgICAgLT4gIDAKK2RkZm1hMzc3MzUgZm1hICAxICAtMCAgICAtMCAgICAgLT4gLTAgICAgIC0tIElFRUUgODU0IHNwZWNpYWwgY2FzZQorCitkZGZtYTM3NzM2IGZtYSAgMSAgIDEgICAgLTEgICAgIC0+ICAwCitkZGZtYTM3NzM3IGZtYSAgMSAgLTEgICAgLTEgICAgIC0+IC0yCitkZGZtYTM3NzM4IGZtYSAgMSAgIDEgICAgIDEgICAgIC0+ICAyCitkZGZtYTM3NzM5IGZtYSAgMSAgLTEgICAgIDEgICAgIC0+ICAwCisKK2RkZm1hMzc3NDEgZm1hICAxICAgMCAgICAtMSAgICAgLT4gLTEKK2RkZm1hMzc3NDIgZm1hICAxICAtMCAgICAtMSAgICAgLT4gLTEKK2RkZm1hMzc3NDMgZm1hICAxICAgMCAgICAgMSAgICAgLT4gIDEKK2RkZm1hMzc3NDQgZm1hICAxICAtMCAgICAgMSAgICAgLT4gIDEKK2RkZm1hMzc3NDUgZm1hICAxICAtMSAgICAgMCAgICAgLT4gLTEKK2RkZm1hMzc3NDYgZm1hICAxICAtMSAgICAtMCAgICAgLT4gLTEKK2RkZm1hMzc3NDcgZm1hICAxICAgMSAgICAgMCAgICAgLT4gIDEKK2RkZm1hMzc3NDggZm1hICAxICAgMSAgICAtMCAgICAgLT4gIDEKKworZGRmbWEzNzc1MSBmbWEgIDEgICAwLjAgIC0xICAgICAtPiAtMS4wCitkZGZtYTM3NzUyIGZtYSAgMSAgLTAuMCAgLTEgICAgIC0+IC0xLjAKK2RkZm1hMzc3NTMgZm1hICAxICAgMC4wICAgMSAgICAgLT4gIDEuMAorZGRmbWEzNzc1NCBmbWEgIDEgIC0wLjAgICAxICAgICAtPiAgMS4wCitkZGZtYTM3NzU1IGZtYSAgMSAgLTEuMCAgIDAgICAgIC0+IC0xLjAKK2RkZm1hMzc3NTYgZm1hICAxICAtMS4wICAtMCAgICAgLT4gLTEuMAorZGRmbWEzNzc1NyBmbWEgIDEgICAxLjAgICAwICAgICAtPiAgMS4wCitkZGZtYTM3NzU4IGZtYSAgMSAgIDEuMCAgLTAgICAgIC0+ICAxLjAKKworZGRmbWEzNzc2MSBmbWEgIDEgICAwICAgIC0xLjAgICAtPiAtMS4wCitkZGZtYTM3NzYyIGZtYSAgMSAgLTAgICAgLTEuMCAgIC0+IC0xLjAKK2RkZm1hMzc3NjMgZm1hICAxICAgMCAgICAgMS4wICAgLT4gIDEuMAorZGRmbWEzNzc2NCBmbWEgIDEgIC0wICAgICAxLjAgICAtPiAgMS4wCitkZGZtYTM3NzY1IGZtYSAgMSAgLTEgICAgIDAuMCAgIC0+IC0xLjAKK2RkZm1hMzc3NjYgZm1hICAxICAtMSAgICAtMC4wICAgLT4gLTEuMAorZGRmbWEzNzc2NyBmbWEgIDEgICAxICAgICAwLjAgICAtPiAgMS4wCitkZGZtYTM3NzY4IGZtYSAgMSAgIDEgICAgLTAuMCAgIC0+ICAxLjAKKworZGRmbWEzNzc3MSBmbWEgIDEgICAwLjAgIC0xLjAgICAtPiAtMS4wCitkZGZtYTM3NzcyIGZtYSAgMSAgLTAuMCAgLTEuMCAgIC0+IC0xLjAKK2RkZm1hMzc3NzMgZm1hICAxICAgMC4wICAgMS4wICAgLT4gIDEuMAorZGRmbWEzNzc3NCBmbWEgIDEgIC0wLjAgICAxLjAgICAtPiAgMS4wCitkZGZtYTM3Nzc1IGZtYSAgMSAgLTEuMCAgIDAuMCAgIC0+IC0xLjAKK2RkZm1hMzc3NzYgZm1hICAxICAtMS4wICAtMC4wICAgLT4gLTEuMAorZGRmbWEzNzc3NyBmbWEgIDEgICAxLjAgICAwLjAgICAtPiAgMS4wCitkZGZtYTM3Nzc4IGZtYSAgMSAgIDEuMCAgLTAuMCAgIC0+ICAxLjAKKworLS0gU3BlY2lhbHMKK2RkZm1hMzc3ODAgZm1hICAxICAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkZGZtYTM3NzgxIGZtYSAgMSAgLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZGRmbWEzNzc4MiBmbWEgIDEgIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2RkZm1hMzc3ODMgZm1hICAxICAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkZGZtYTM3Nzg0IGZtYSAgMSAgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZGRmbWEzNzc4NSBmbWEgIDEgIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RkZm1hMzc3ODYgZm1hICAxICAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkZGZtYTM3Nzg3IGZtYSAgMSAgLTEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRmbWEzNzc4OCBmbWEgIDEgIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkZm1hMzc3ODkgZm1hICAxICAtMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkZGZtYTM3NzkwIGZtYSAgMSAgLTAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRmbWEzNzc5MSBmbWEgIDEgICAwICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkZm1hMzc3OTIgZm1hICAxICAgMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkZGZtYTM3NzkzIGZtYSAgMSAgIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRmbWEzNzc5NCBmbWEgIDEgICBJbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCitkZGZtYTM3ODAwIGZtYSAgMSAgIEluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTM3ODAxIGZtYSAgMSAgIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZGRmbWEzNzgwMiBmbWEgIDEgICBJbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RkZm1hMzc4MDMgZm1hICAxICAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkZGZtYTM3ODA0IGZtYSAgMSAgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZGRmbWEzNzgwNSBmbWEgIDEgICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2RkZm1hMzc4MDYgZm1hICAxICAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkZGZtYTM3ODA3IGZtYSAgMSAgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRmbWEzNzgwOCBmbWEgIDEgIC0xMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RkZm1hMzc4MDkgZm1hICAxICAtSW5mICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4MTAgZm1hICAxICAtMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitkZGZtYTM3ODExIGZtYSAgMSAgLTAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRmbWEzNzgxMiBmbWEgIDEgICAwICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkZm1hMzc4MTMgZm1hICAxICAgMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitkZGZtYTM3ODE0IGZtYSAgMSAgIDEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRmbWEzNzgxNSBmbWEgIDEgICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZGRmbWEzNzgyMSBmbWEgIDEgICBOYU4gLUluZiAgICAtPiAgTmFOCitkZGZtYTM3ODIyIGZtYSAgMSAgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RkZm1hMzc4MjMgZm1hICAxICAgTmFOIC0xICAgICAgLT4gIE5hTgorZGRmbWEzNzgyNCBmbWEgIDEgICBOYU4gLTAgICAgICAtPiAgTmFOCitkZGZtYTM3ODI1IGZtYSAgMSAgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2RkZm1hMzc4MjYgZm1hICAxICAgTmFOICAxICAgICAgLT4gIE5hTgorZGRmbWEzNzgyNyBmbWEgIDEgICBOYU4gIDEwMDAgICAtPiAgTmFOCitkZGZtYTM3ODI4IGZtYSAgMSAgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RkZm1hMzc4MjkgZm1hICAxICAgTmFOICBOYU4gICAgLT4gIE5hTgorZGRmbWEzNzgzMCBmbWEgIDEgIC1JbmYgIE5hTiAgICAtPiAgTmFOCitkZGZtYTM3ODMxIGZtYSAgMSAgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RkZm1hMzc4MzIgZm1hICAxICAtMSAgICBOYU4gICAgLT4gIE5hTgorZGRmbWEzNzgzMyBmbWEgIDEgIC0wICAgIE5hTiAgICAtPiAgTmFOCitkZGZtYTM3ODM0IGZtYSAgMSAgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RkZm1hMzc4MzUgZm1hICAxICAgMSAgICBOYU4gICAgLT4gIE5hTgorZGRmbWEzNzgzNiBmbWEgIDEgICAxMDAwIE5hTiAgICAtPiAgTmFOCitkZGZtYTM3ODM3IGZtYSAgMSAgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZGRmbWEzNzg0MSBmbWEgIDEgICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg0MiBmbWEgIDEgICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg0MyBmbWEgIDEgICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg0NCBmbWEgIDEgICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg0NSBmbWEgIDEgICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg0NiBmbWEgIDEgICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg0NyBmbWEgIDEgICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg0OCBmbWEgIDEgICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg0OSBmbWEgIDEgICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg1MCBmbWEgIDEgICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg1MSBmbWEgIDEgIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg1MiBmbWEgIDEgIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg1MyBmbWEgIDEgIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg1NCBmbWEgIDEgIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg1NSBmbWEgIDEgICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg1NiBmbWEgIDEgICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg1NyBmbWEgIDEgICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg1OCBmbWEgIDEgICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg1OSBmbWEgIDEgICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZGZtYTM3ODYxIGZtYSAgMSAgIE5hTjEgICAtSW5mICAgIC0+ICBOYU4xCitkZGZtYTM3ODYyIGZtYSAgMSAgK05hTjIgICAtMTAwMCAgIC0+ICBOYU4yCitkZGZtYTM3ODYzIGZtYSAgMSAgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCitkZGZtYTM3ODY0IGZtYSAgMSAgIE5hTjQgICAgSW5mICAgIC0+ICBOYU40CitkZGZtYTM3ODY1IGZtYSAgMSAgIE5hTjUgICArTmFONiAgIC0+ICBOYU41CitkZGZtYTM3ODY2IGZtYSAgMSAgLUluZiAgICAgTmFONyAgIC0+ICBOYU43CitkZGZtYTM3ODY3IGZtYSAgMSAgLTEwMDAgICAgTmFOOCAgIC0+ICBOYU44CitkZGZtYTM3ODY4IGZtYSAgMSAgIDEwMDAgICAgTmFOOSAgIC0+ICBOYU45CitkZGZtYTM3ODY5IGZtYSAgMSAgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorZGRmbWEzNzg3MSBmbWEgIDEgICBzTmFOMTEgIC1JbmYgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTM3ODcyIGZtYSAgMSAgIHNOYU4xMiAgLTEwMDAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NzMgZm1hICAxICAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg3NCBmbWEgIDEgICBzTmFOMTQgICBOYU4xNyAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTM3ODc1IGZtYSAgMSAgIHNOYU4xNSAgc05hTjE4IC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NzYgZm1hICAxICAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg3NyBmbWEgIDEgIC1JbmYgICAgK3NOYU4yMCAtPiAgTmFOMjAgIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTM3ODc4IGZtYSAgMSAgLTEwMDAgICAgc05hTjIxIC0+ICBOYU4yMSAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NzkgZm1hICAxICAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg4MCBmbWEgIDEgICBJbmYgICAgIHNOYU4yMyAtPiAgTmFOMjMgIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTM3ODgxIGZtYSAgMSAgK05hTjI1ICArc05hTjI0IC0+ICBOYU4yNCAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4ODIgZm1hICAxICAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2CitkZGZtYTM3ODgzIGZtYSAgMSAgLXNOYU4yNyAgc05hTjI5IC0+IC1OYU4yNyAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4ODQgZm1hICAxICAgMTAwMCAgICAtTmFOMzAgLT4gLU5hTjMwCitkZGZtYTM3ODg1IGZtYSAgMSAgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gSGVyZSB3ZSBleHBsb3JlIG5lYXIgdGhlIGJvdW5kYXJ5IG9mIHJvdW5kaW5nIGEgc3Vibm9ybWFsIHRvIE5taW4KK2RkZm1hMzc1NzUgZm1hICAxICAgMUUtMzgzIC0xRS0zOTggLT4gIDkuOTk5OTk5OTk5OTk5OTlFLTM4NCAgU3Vibm9ybWFsCitkZGZtYTM3NTc2IGZtYSAgMSAgLTFFLTM4MyArMUUtMzk4IC0+IC05Ljk5OTk5OTk5OTk5OTk5RS0zODQgIFN1Ym5vcm1hbAorCistLSBjaGVjayBvdmVyZmxvdyBlZGdlIGNhc2UKKy0tICAgICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorZGRmbWEzNzk3MiBhcHBseSAgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZGZtYTM3OTczIGZtYSAgMSAgICAgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgIDEgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzk3NCBmbWEgIDEgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAxICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5NzUgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgMUUrMzY5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5NzYgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOUUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5NzcgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOEUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5NzggZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgN0UrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5NzkgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgNkUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5ODAgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgNUUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5ODEgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgNEUrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzk4MiBmbWEgIDEgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAzRSszNjggIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTgzIGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDJFKzM2OCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5ODQgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgMUUrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorCitkZGZtYTM3OTg1IGFwcGx5ICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZGZtYTM3OTg2IGZtYSAgMSAgICAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLTEgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5ODcgZm1hICAxICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMSAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzk4OCBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0xRSszNjkgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5ODkgZm1hICAxICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtOUUrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTkwIGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLThFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzk5MSBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC03RSszNjggIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5OTIgZm1hICAxICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtNkUrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTkzIGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTVFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzk5NCBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC00RSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzk5NSBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0zRSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzk5NiBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0yRSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzk5NyBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0xRSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorCistLSBBbmQgZm9yIHJvdW5kIGRvd24gZnVsbCBhbmQgc3Vibm9ybWFsIHJlc3VsdHMKK3JvdW5kaW5nOiAgICAgZG93bgorZGRmbWEzNzExMDAgZm1hICAxICAxZSsyIC0xZS0zODMgICAgLT4gOTkuOTk5OTk5OTk5OTk5OTkgUm91bmRlZCBJbmV4YWN0CitkZGZtYTM3MTEwMSBmbWEgIDEgIDFlKzEgLTFlLTM4MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGZtYTM3MTEwMyBmbWEgIDEgICAgKzEgLTFlLTM4MyAgICAtPiAwLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMDQgZm1hICAxICAxZS0xIC0xZS0zODMgICAgLT4gMC4wOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGZtYTM3MTEwNSBmbWEgIDEgIDFlLTIgLTFlLTM4MyAgICAtPiAwLjAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGZtYTM3MTEwNiBmbWEgIDEgIDFlLTMgLTFlLTM4MyAgICAtPiAwLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMDcgZm1hICAxICAxZS00IC0xZS0zODMgICAgLT4gMC4wMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGZtYTM3MTEwOCBmbWEgIDEgIDFlLTUgLTFlLTM4MyAgICAtPiAwLjAwMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGZtYTM3MTEwOSBmbWEgIDEgIDFlLTYgLTFlLTM4MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICAgY2VpbGluZworZGRmbWEzNzExMTAgZm1hICAxICAtMWUrMiArMWUtMzgzICAgLT4gLTk5Ljk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMTEgZm1hICAxICAtMWUrMSArMWUtMzgzICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkZm1hMzcxMTEzIGZtYSAgMSAgICAgLTEgKzFlLTM4MyAgIC0+IC0wLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMTQgZm1hICAxICAtMWUtMSArMWUtMzgzICAgLT4gLTAuMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMTUgZm1hICAxICAtMWUtMiArMWUtMzgzICAgLT4gLTAuMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkZm1hMzcxMTE2IGZtYSAgMSAgLTFlLTMgKzFlLTM4MyAgIC0+IC0wLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMTcgZm1hICAxICAtMWUtNCArMWUtMzgzICAgLT4gLTAuMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMTggZm1hICAxICAtMWUtNSArMWUtMzgzICAgLT4gLTAuMDAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkZm1hMzcxMTE5IGZtYSAgMSAgLTFlLTYgKzFlLTM4MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKKy0tIHRlc3RzIGJhc2VkIG9uIEd1bm5hciBEZWduYm9sJ3MgZWRnZSBjYXNlCityb3VuZGluZzogICAgIGhhbGZfZXZlbgorCitkZGZtYTM3MTMwMCBmbWEgIDEgIDFFMTYgIC0wLjUgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMxMCBmbWEgIDEgIDFFMTYgIC0wLjUxICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMxMSBmbWEgIDEgIDFFMTYgIC0wLjUwMSAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMxMiBmbWEgIDEgIDFFMTYgIC0wLjUwMDEgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMxMyBmbWEgIDEgIDFFMTYgIC0wLjUwMDAxICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMxNCBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMSAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMxNSBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDEgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMxNiBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAxICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMxNyBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMSAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMxOCBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDEgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMxOSBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAxICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMyMCBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMSAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMyMSBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDEgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMyMiBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAxICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMyMyBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMyNCBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMyNSBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMDAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMyNiBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMCAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMyNyBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMyOCBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMyOSBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMzMCBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMzMSBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMDAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMzMiBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwMCAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMzMyBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMzNCBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMDAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMzNSBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwMCAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMzNiBmbWEgIDEgIDFFMTYgIC0wLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMzNyBmbWEgIDEgIDFFMTYgIC0wLjUwMDAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMzOCBmbWEgIDEgIDFFMTYgIC0wLjUwMCAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTMzOSBmbWEgIDEgIDFFMTYgIC0wLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMzcxMzQwIGZtYSAgMSAgMUUxNiAgLTUwMDAwMDAuMDAwMDEwMDAxICAgLT4gIDk5OTk5OTk5OTUwMDAwMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzQxIGZtYSAgMSAgMUUxNiAgLTUwMDAwMDAuMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTUwMDAwMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworZGRmbWEzNzEzNDkgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNCAgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzUwIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5ICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM1MSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTkgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNTIgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzUzIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5ICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM1NCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTkgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNTUgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzU2IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5ICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM1NyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTkgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNTggZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzU5IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5ICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM2MCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTkgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNjEgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzYyIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTk5ICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM2MyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OTkgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNjQgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5OSAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzY1IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMDAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM2NyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNjggZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzY5IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM3MCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNzEgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzcyIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM3MyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNzQgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzc1IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM3NiBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNzcgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzc4IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM3OSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzODAgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzgxIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM4MiBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzODMgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzg0IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAxICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM4NSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAxICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzODYgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzg3IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAxICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM4OCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAxICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzODkgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAxICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzkwIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAxICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM5MSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAxICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzOTIgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAxICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzkzIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAxICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM5NCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAxICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzOTUgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAxICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzk2IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUxICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCisKKy0tIE1vcmUgR0QgZWRnZSBjYXNlcywgd2hlcmUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB1bmFkanVzdGVkCistLSBleHBvbmVudHMgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gcHJlY2lzaW9uIGFuZCBvbmUgc2lkZSBpcyAwCitkZGZtYTM3MTQyMCBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1ICAgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0MjEgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMSAgLT4gMC4xMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQyMiBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0yICAtPiAwLjAxMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQyMyBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0zICAtPiAwLjAwMTEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0MjQgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNCAgLT4gMC4wMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQyNSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS01ICAtPiAwLjAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQyNiBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS02ICAtPiAwLjAwMDAwMTEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0MjcgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNyAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTcKK2RkZm1hMzcxNDI4IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTggIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS04CitkZGZtYTM3MTQyOSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS05ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOQorZGRmbWEzNzE0MzAgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEwCitkZGZtYTM3MTQzMSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMSAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEKK2RkZm1hMzcxNDMyIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEyIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMgorZGRmbWEzNzE0MzMgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTMgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEzCitkZGZtYTM3MTQzNCBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQKK2RkZm1hMzcxNDM1IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE1IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNQorZGRmbWEzNzE0MzYgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTYgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE2CitkZGZtYTM3MTQzNyBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNyAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcKK2RkZm1hMzcxNDM4IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE4IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOAorZGRmbWEzNzE0MzkgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTkgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE5CisKKy0tIHNhbWUsIHJldmVyc2VkIDAKK2RkZm1hMzcxNDQwIGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgICAgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDQxIGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTEgIDAgLT4gMC4xMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ0MiBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0yICAwIC0+IDAuMDExMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDQzIGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTMgIDAgLT4gMC4wMDExMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDQ0IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTQgIDAgLT4gMC4wMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ0NSBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS01ICAwIC0+IDAuMDAwMDExMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDQ2IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTYgIDAgLT4gMC4wMDAwMDExMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDQ3IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTcgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTcKK2RkZm1hMzcxNDQ4IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTggIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTgKK2RkZm1hMzcxNDQ5IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTkgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTkKK2RkZm1hMzcxNDUwIGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTEwIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEwCitkZGZtYTM3MTQ1MSBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMSAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMQorZGRmbWEzNzE0NTIgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIKK2RkZm1hMzcxNDUzIGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTEzIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEzCitkZGZtYTM3MTQ1NCBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNCAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNAorZGRmbWEzNzE0NTUgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUKK2RkZm1hMzcxNDU2IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTE2IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE2CitkZGZtYTM3MTQ1NyBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNyAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNworZGRmbWEzNzE0NTggZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTggMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTgKK2RkZm1hMzcxNDU5IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTE5IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE5CisKKy0tIHNhbWUsIEVzIG9uIHRoZSAwCitkZGZtYTM3MTQ2MCBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0wICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDYxIGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0NjIgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMiAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ2MyBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0zICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDY0IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTQgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0NjUgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ2NiBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS02ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDY3IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTcgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0NjggZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtOCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ2OSBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS05ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDcwIGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEwICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0NzEgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTEgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ3MiBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMiAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDczIGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEzICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0NzQgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTQgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ3NSBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKKy0tIG5leHQgZm91ciBmbGFnIFJvdW5kZWQgYmVjYXVzZSB0aGUgMCBleHRlbmRzIHRoZSByZXN1bHQKK2RkZm1hMzcxNDc2IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE2ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitkZGZtYTM3MTQ3NyBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNyAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZGRmbWEzNzE0NzggZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTggIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKK2RkZm1hMzcxNDc5IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE5ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCisKKy0tIHN1bSBvZiB0d28gb3Bwb3NpdGUtc2lnbiBvcGVyYW5kcyBpcyBleGFjdGx5IDAgYW5kIGZsb29yID0+IC0wCityb3VuZGluZzogICAgaGFsZl91cAorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZGRmbWEzNzE1MDAgZm1hICAxICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1MDEgZm1hICAxICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1MDIgZm1hICAxICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1MDMgZm1hICAxICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RkZm1hMzcxNTExIGZtYSAgMSAgLTExICAgICAgMTEgICAgLT4gIDAKK2RkZm1hMzcxNTEyIGZtYSAgMSAgIDExICAgICAtMTEgICAgLT4gIDAKKworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZGRmbWEzNzE1MjAgZm1hICAxICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1MjEgZm1hICAxICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1MjIgZm1hICAxICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1MjMgZm1hICAxICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RkZm1hMzcxNTMxIGZtYSAgMSAgLTExICAgICAgMTEgICAgLT4gIDAKK2RkZm1hMzcxNTMyIGZtYSAgMSAgIDExICAgICAtMTEgICAgLT4gIDAKKworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZGRmbWEzNzE1NDAgZm1hICAxICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1NDEgZm1hICAxICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1NDIgZm1hICAxICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1NDMgZm1hICAxICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RkZm1hMzcxNTUxIGZtYSAgMSAgLTExICAgICAgMTEgICAgLT4gIDAKK2RkZm1hMzcxNTUyIGZtYSAgMSAgIDExICAgICAtMTEgICAgLT4gIDAKKworcm91bmRpbmc6ICAgIHVwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkZGZtYTM3MTU2MCBmbWEgIDEgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGZtYTM3MTU2MSBmbWEgIDEgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGZtYTM3MTU2MiBmbWEgIDEgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkZGZtYTM3MTU2MyBmbWEgIDEgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZGRmbWEzNzE1NzEgZm1hICAxICAtMTEgICAgICAxMSAgICAtPiAgMAorZGRmbWEzNzE1NzIgZm1hICAxICAgMTEgICAgIC0xMSAgICAtPiAgMAorCityb3VuZGluZzogICAgZG93bgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZGRmbWEzNzE1ODAgZm1hICAxICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1ODEgZm1hICAxICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1ODIgZm1hICAxICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1ODMgZm1hICAxICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RkZm1hMzcxNTkxIGZtYSAgMSAgLTExICAgICAgMTEgICAgLT4gIDAKK2RkZm1hMzcxNTkyIGZtYSAgMSAgIDExICAgICAtMTEgICAgLT4gIDAKKworcm91bmRpbmc6ICAgIGNlaWxpbmcKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RkZm1hMzcxNjAwIGZtYSAgMSAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNjAxIGZtYSAgMSAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNjAyIGZtYSAgMSAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNjAzIGZtYSAgMSAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkZGZtYTM3MTYxMSBmbWEgIDEgIC0xMSAgICAgIDExICAgIC0+ICAwCitkZGZtYTM3MTYxMiBmbWEgIDEgICAxMSAgICAgLTExICAgIC0+ICAwCisKKy0tIGFuZCB0aGUgZXh0cmEtc3BlY2lhbCB1Z2x5IGNhc2U7IHVudXN1YWwgbWludXNlcyBtYXJrZWQgYnkgLS0gKgorcm91bmRpbmc6ICAgIGZsb29yCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkZGZtYTM3MTYyMCBmbWEgIDEgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGZtYTM3MTYyMSBmbWEgIDEgIC0wICAgICAgICAwRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCitkZGZtYTM3MTYyMiBmbWEgIDEgICAwICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCitkZGZtYTM3MTYyMyBmbWEgIDEgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZGRmbWEzNzE2MzEgZm1hICAxICAtMTEgICAgICAxMSAgICAtPiAgLTAgICAgICAgICAgICAgICAgLS0gKgorZGRmbWEzNzE2MzIgZm1hICAxICAgMTEgICAgIC0xMSAgICAtPiAgLTAgICAgICAgICAgICAgICAgLS0gKgorCistLSBFeGFtcGxlcyBmcm9tIFNRTCBwcm9wb3NhbCAoS3Jpc2huYSBLdWxrYXJuaSkKK2RkZm1hMzcxNzAxIGZtYSAgMSAgMTMwRS0yICAgIDEyMEUtMiAgICAtPiAyLjUwCitkZGZtYTM3MTcwMiBmbWEgIDEgIDEzMEUtMiAgICAxMkUtMSAgICAgLT4gMi41MAorZGRmbWEzNzE3MDMgZm1hICAxICAxMzBFLTIgICAgMUUwICAgICAgIC0+IDIuMzAKK2RkZm1hMzcxNzA0IGZtYSAgMSAgMUUyICAgICAgIDFFNCAgICAgICAtPiAxLjAxRSs0CitkZGZtYTM3MTcwNSBmbWEgIDEgIDEzMEUtMiAgIC0xMjBFLTIgLT4gMC4xMAorZGRmbWEzNzE3MDYgZm1hICAxICAxMzBFLTIgICAtMTJFLTEgIC0+IDAuMTAKK2RkZm1hMzcxNzA3IGZtYSAgMSAgMTMwRS0yICAgLTFFMCAgICAtPiAwLjMwCitkZGZtYTM3MTcwOCBmbWEgIDEgIDFFMiAgICAgIC0xRTQgICAgLT4gLTkuOUUrMworCistLSBHYXBweSBjb2VmZmljaWVudHM7IGNoZWNrIHJlc2lkdWUgaGFuZGxpbmcgZXZlbiB3aXRoIGZ1bGwgY29lZmZpY2llbnQgZ2FwCityb3VuZGluZzogaGFsZl9ldmVuCisKK2RkZm1hMzc1MDAxIGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiAxICAgICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NworZGRmbWEzNzUwMDIgZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDAuNiAgICAtPiAxMjM0NTY3ODkwMTIzNDU3ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDAzIGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiAwLjA2ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAwNCBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMyAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwMDUgZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDZFLTQgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDA2IGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS01ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAwNyBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtNiAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwMDggZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDZFLTcgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDA5IGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS04ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAxMCBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtOSAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwMTEgZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDZFLTEwICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDEyIGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xMSAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAxMyBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTIgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwMTQgZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDZFLTEzICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDE1IGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xNCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAxNiBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTUgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwMTcgZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDZFLTE2ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDE4IGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xNyAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAxOSBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTggIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwMjAgZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDZFLTE5ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDIxIGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0yMCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHdpZGVuaW5nIHNlY29uZCBhcmd1bWVudCBhdCBnYXAKK2RkZm1hMzc1MDMwIGZtYSAgMSAgMTIzNDU2NzggMSAgICAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzkKK2RkZm1hMzc1MDMxIGZtYSAgMSAgMTIzNDU2NzggMC4xICAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMQorZGRmbWEzNzUwMzIgZm1hICAxICAxMjM0NTY3OCAwLjEyICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMgorZGRmbWEzNzUwMzMgZm1hICAxICAxMjM0NTY3OCAwLjEyMyAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjMKK2RkZm1hMzc1MDM0IGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0ICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNAorZGRmbWEzNzUwMzUgZm1hICAxICAxMjM0NTY3OCAwLjEyMzQ1ICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NQorZGRmbWEzNzUwMzYgZm1hICAxICAxMjM0NTY3OCAwLjEyMzQ1NiAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTYKK2RkZm1hMzc1MDM3IGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0NTY3ICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NworZGRmbWEzNzUwMzggZm1hICAxICAxMjM0NTY3OCAwLjEyMzQ1Njc4ICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OAorZGRmbWEzNzUwMzkgZm1hICAxICAxMjM0NTY3OCAwLjEyMzQ1Njc4OSAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDQwIGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0NTY3ODUgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA0MSBmbWEgIDEgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MCAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNDIgZm1hICAxICAxMjM0NTY3OCAwLjEyMzQ1Njc4NTEgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDQzIGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0NTY3ODUwMSAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA0NCBmbWEgIDEgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAxICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNDUgZm1hICAxICAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDEgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDQ2IGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAwMSAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA0NyBmbWEgIDEgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDAxICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNDggZm1hICAxICAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDQ5IGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzggSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDEyMzQ1Ngorcm91bmRpbmc6IGhhbGZfZXZlbgorZGRmbWEzNzUwNTAgZm1hICAxICAxMjM0NTY3OCAwLjAyMzQ1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDUxIGZtYSAgMSAgMTIzNDU2NzggMC4wMDM0NTY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA1MiBmbWEgIDEgIDEyMzQ1Njc4IDAuMDAwNDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDQ1Njc4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNTMgZm1hICAxICAxMjM0NTY3OCAwLjAwMDA1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwNTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDU0IGZtYSAgMSAgMTIzNDU2NzggMC4wMDAwMDY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDA2NzggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA1NSBmbWEgIDEgIDEyMzQ1Njc4IDAuMDAwMDAwNzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDc4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNTYgZm1hICAxICAxMjM0NTY3OCAwLjAwMDAwMDA3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDU3IGZtYSAgMSAgMTIzNDU2NzggMC4wMDAwMDAwMDUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA2MCBmbWEgIDEgIDEyMzQ1Njc4IDAuMDIzNDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNjEgZm1hICAxICAxMjM0NTY3OCAwLjAwMzQ1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDYyIGZtYSAgMSAgMTIzNDU2NzggMC4wMDA0NTY3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwNDU2NzggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA2MyBmbWEgIDEgIDEyMzQ1Njc4IDAuMDAwMDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDA1Njc4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNjQgZm1hICAxICAxMjM0NTY3OCAwLjAwMDAwNjc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwMDY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDY1IGZtYSAgMSAgMTIzNDU2NzggMC4wMDAwMDA3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwMDAwNzggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA2NiBmbWEgIDEgIDEyMzQ1Njc4IDAuMDAwMDAwMDc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNjcgZm1hICAxICAxMjM0NTY3OCAwLjAwMDAwMDAwNTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKKy0tIGZhci1vdXQgcmVzaWR1ZXMgKGZ1bGwgY29lZmZpY2llbnQgZ2FwIGlzIDE2KzE1IGRpZ2l0cykKK3JvdW5kaW5nOiB1cAorZGRmbWEzNzUwNzAgZm1hICAxICAxMjM0NTY3OCAxRS04ICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMQorZGRmbWEzNzUwNzEgZm1hICAxICAxMjM0NTY3OCAxRS05ICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDcyIGZtYSAgMSAgMTIzNDU2NzggMUUtMTAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA3MyBmbWEgIDEgIDEyMzQ1Njc4IDFFLTExICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNzQgZm1hICAxICAxMjM0NTY3OCAxRS0xMiAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDc1IGZtYSAgMSAgMTIzNDU2NzggMUUtMTMgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA3NiBmbWEgIDEgIDEyMzQ1Njc4IDFFLTE0ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNzcgZm1hICAxICAxMjM0NTY3OCAxRS0xNSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDc4IGZtYSAgMSAgMTIzNDU2NzggMUUtMTYgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA3OSBmbWEgIDEgIDEyMzQ1Njc4IDFFLTE3ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwODAgZm1hICAxICAxMjM0NTY3OCAxRS0xOCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDgxIGZtYSAgMSAgMTIzNDU2NzggMUUtMTkgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA4MiBmbWEgIDEgIDEyMzQ1Njc4IDFFLTIwICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwODMgZm1hICAxICAxMjM0NTY3OCAxRS0yNSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDg0IGZtYSAgMSAgMTIzNDU2NzggMUUtMzAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA4NSBmbWEgIDEgIDEyMzQ1Njc4IDFFLTMxICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwODYgZm1hICAxICAxMjM0NTY3OCAxRS0zMiAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDg3IGZtYSAgMSAgMTIzNDU2NzggMUUtMzMgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA4OCBmbWEgIDEgIDEyMzQ1Njc4IDFFLTM0ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwODkgZm1hICAxICAxMjM0NTY3OCAxRS0zNSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKKworLS0gZGVzY3RydWN0aXZlIHN1YnRyYWN0aW9uIChmcm9tIHJlbWFpbmRlciB0ZXN0cykKKworLS0gKysrIHNvbWUgb2YgdGhlc2Ugd2lsbCBiZSBvZmYtYnktb25lIHJlbWFpbmRlciB2cyByZW1haW5kZXJOZWFyCisKK2RkZm1hNDAwMCAgZm1hICAtMTIzNDU2Nzg5MDEyMzQ1NCAgIDEuMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTYgIC0+ICAwLjc2NTQzMjEwOTg3NjU0NgorZGRmbWE0MDAxICBmbWEgIC0xMjM0NTY3ODkwMTIzNDQzICAgIDEuMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIDAuNjU0MzIxMDk4NzY1NTcKK2RkZm1hNDAwMiAgZm1hICAtMTIzNDU2Nzg5MDEyMzMzMiAgICAgMS4wMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTYgIC0+ICAwLjU0MzIxMDk4NzY2NjgKK2RkZm1hNDAwMyAgZm1hICAgLTMwODY0MTk3MjUzMDg2MyAgIDQuMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTUgIC0+ICAyLjY5MTM1ODAyNzQ2OTEzNworZGRmbWE0MDA0ICBmbWEgICAtMzA4NjQxOTcyNTMwODYzICAgNC4wMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIDMuNjkxMzU4MDI3NDY5MTM3CitkZGZtYTQwMDUgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTYgICAgIDQuOTk5OTk5OTk5OTk5OSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgMC42OTEzNTc4MDI0Njk2CitkZGZtYTQwMDYgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTEgICAgNC45OTk5OTk5OTk5OTk5OSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgMy40NjkxMzU3ODAyNDY5MQorZGRmbWE0MDA3ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxICAgNC45OTk5OTk5OTk5OTk5OTkgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIDEuMjQ2OTEzNTc4MDI0NjkxCitkZGZtYTQwMDggIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTEgICA1LjAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgMC43NTMwODY0MjE5NzUzMDkKK2RkZm1hNDAwOSAgZm1hICAgLTI0NjkxMzU3ODAyNDY5MCAgICA1LjAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTYgIC0+ICAzLjUzMDg2NDIxOTc1MzEwCitkZGZtYTQwMTAgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2ODYgICAgIDUuMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgMS4zMDg2NDIxOTc1MzE0CitkZGZtYTQwMTEgIGZtYSAgLTEyMzQ1Njc4OTAxMjM0NTUgICAxLjAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgLTAuMjM0NTY3ODkwMTIzNDU1CitkZGZtYTQwMTIgIGZtYSAgLTEyMzQ1Njc4OTAxMjM0NDQgICAgMS4wMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgLTAuMzQ1Njc4OTAxMjM0NDQKK2RkZm1hNDAxMyAgZm1hICAtMTIzNDU2Nzg5MDEyMzMzMyAgICAgMS4wMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTYgIC0+ICAtMC40NTY3ODkwMTIzMzMzCitkZGZtYTQwMTQgIGZtYSAgIC0zMDg2NDE5NzI1MzA4NjQgICA0LjAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU1ICAtPiAgLTEuMzA4NjQxOTcyNTMwODY0CitkZGZtYTQwMTUgIGZtYSAgIC0zMDg2NDE5NzI1MzA4NjQgICA0LjAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgLTAuMzA4NjQxOTcyNTMwODY0CitkZGZtYTQwMTYgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTYgICAgIDQuOTk5OTk5OTk5OTk5OSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgMC42OTEzNTc4MDI0Njk2CitkZGZtYTQwMTcgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTIgICAgNC45OTk5OTk5OTk5OTk5OSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgLTEuNTMwODY0MjE5NzUzMDgKK2RkZm1hNDAxOCAgZm1hICAgLTI0NjkxMzU3ODAyNDY5MSAgIDQuOTk5OTk5OTk5OTk5OTk5ICAgIDEyMzQ1Njc4OTAxMjM0NTYgIC0+ICAxLjI0NjkxMzU3ODAyNDY5MQorZGRmbWE0MDE5ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxICAgNS4wMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIDAuNzUzMDg2NDIxOTc1MzA5CitkZGZtYTQwMjAgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTEgICAgNS4wMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgLTEuNDY5MTM1NzgwMjQ2OTEKK2RkZm1hNDAyMSAgZm1hICAgLTI0NjkxMzU3ODAyNDY4NiAgICAgNS4wMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTYgIC0+ICAxLjMwODY0MjE5NzUzMTQKKworCistLSBOdWxsIHRlc3RzCitkZGZtYTM5OTkwIGZtYSAgMSAgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTM5OTkxIGZtYSAgMSAgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZEludmVydC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZEludmVydC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMTlmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkSW52ZXJ0LmRlY1Rlc3QKQEAgLTAsMCArMSwyMDIgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRJbnZlcnQuZGVjVGVzdCAtLSBkaWdpdHdpc2UgbG9naWNhbCBJTlZFUlQgZm9yIGRlY0RvdWJsZXMgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrICh0cnV0aCB0YWJsZSkKK2RkaW52MDAxIGludmVydCAgICAgICAgICAgICAwIC0+IDExMTExMTExMTExMTExMTEKK2RkaW52MDAyIGludmVydCAgICAgICAgICAgICAxIC0+IDExMTExMTExMTExMTExMTAKK2RkaW52MDAzIGludmVydCAgICAgICAgICAgIDEwIC0+IDExMTExMTExMTExMTExMDEKK2RkaW52MDA0IGludmVydCAgICAgMTExMTExMTExIC0+IDExMTExMTEwMDAwMDAwMDAKK2RkaW52MDA1IGludmVydCAgICAgMDAwMDAwMDAwIC0+IDExMTExMTExMTExMTExMTEKKy0tIGFuZCBhdCBtc2QgYW5kIG1zZC0xCitkZGludjAwNyBpbnZlcnQgMDAwMDAwMDAwMDAwMDAwMCAtPiAgIDExMTExMTExMTExMTExMTEKK2RkaW52MDA4IGludmVydCAxMDAwMDAwMDAwMDAwMDAwIC0+ICAgIDExMTExMTExMTExMTExMQorZGRpbnYwMDkgaW52ZXJ0IDAwMDAwMDAwMDAwMDAwMDAgLT4gICAxMTExMTExMTExMTExMTExCitkZGludjAxMCBpbnZlcnQgMDEwMDAwMDAwMDAwMDAwMCAtPiAgIDEwMTExMTExMTExMTExMTEKK2RkaW52MDExIGludmVydCAwMTExMTExMTExMTExMTExIC0+ICAgMTAwMDAwMDAwMDAwMDAwMAorZGRpbnYwMTIgaW52ZXJ0IDExMTExMTExMTExMTExMTEgLT4gICAgICAgICAgICAgICAgICAwCitkZGludjAxMyBpbnZlcnQgMDAxMTExMTExMTExMTExMSAtPiAgIDExMDAwMDAwMDAwMDAwMDAKK2RkaW52MDE0IGludmVydCAwMTExMTExMTExMTExMTExIC0+ICAgMTAwMDAwMDAwMDAwMDAwMAorCistLSBWYXJpb3VzIGxlbmd0aHMKKy0tICAgICAgICAgICAgIDEyMzQ1Njc4OSAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RkaW52MDIxIGludmVydCAxMTExMTExMTEgICAgIC0+ICAxMTExMTExMDAwMDAwMDAwCitkZGludjAyMiBpbnZlcnQgMTExMTExMTExMTExICAtPiAgMTExMTAwMDAwMDAwMDAwMAorZGRpbnYwMjMgaW52ZXJ0ICAxMTExMTExMSAgICAgLT4gIDExMTExMTExMDAwMDAwMDAKK2RkaW52MDI1IGludmVydCAgIDExMTExMTEgICAgIC0+ICAxMTExMTExMTEwMDAwMDAwCitkZGludjAyNiBpbnZlcnQgICAgMTExMTExICAgICAtPiAgMTExMTExMTExMTAwMDAwMAorZGRpbnYwMjcgaW52ZXJ0ICAgICAxMTExMSAgICAgLT4gIDExMTExMTExMTExMDAwMDAKK2RkaW52MDI4IGludmVydCAgICAgIDExMTEgICAgIC0+ICAxMTExMTExMTExMTEwMDAwCitkZGludjAyOSBpbnZlcnQgICAgICAgMTExICAgICAtPiAgMTExMTExMTExMTExMTAwMAorZGRpbnYwMzEgaW52ZXJ0ICAgICAgICAxMSAgICAgLT4gIDExMTExMTExMTExMTExMDAKK2RkaW52MDMyIGludmVydCAgICAgICAgIDEgICAgIC0+ICAxMTExMTExMTExMTExMTEwCitkZGludjAzMyBpbnZlcnQgMTExMTExMTExMTExICAtPiAgMTExMTAwMDAwMDAwMDAwMAorZGRpbnYwMzQgaW52ZXJ0IDExMTExMTExMTExICAgLT4gIDExMTExMDAwMDAwMDAwMDAKK2RkaW52MDM1IGludmVydCAxMTExMTExMTExICAgIC0+ICAxMTExMTEwMDAwMDAwMDAwCitkZGludjAzNiBpbnZlcnQgMTExMTExMTExICAgICAtPiAgMTExMTExMTAwMDAwMDAwMAorCitkZGludjA0MCBpbnZlcnQgMDExMTExMTExICAgLT4gIDExMTExMTExMDAwMDAwMDAKK2RkaW52MDQxIGludmVydCAxMDExMTExMTEgICAtPiAgMTExMTExMTAxMDAwMDAwMAorZGRpbnYwNDIgaW52ZXJ0IDExMDExMTExMSAgIC0+ICAxMTExMTExMDAxMDAwMDAwCitkZGludjA0MyBpbnZlcnQgMTExMDExMTExICAgLT4gIDExMTExMTEwMDAxMDAwMDAKK2RkaW52MDQ0IGludmVydCAxMTExMDExMTEgICAtPiAgMTExMTExMTAwMDAxMDAwMAorZGRpbnYwNDUgaW52ZXJ0IDExMTExMDExMSAgIC0+ICAxMTExMTExMDAwMDAxMDAwCitkZGludjA0NiBpbnZlcnQgMTExMTExMDExICAgLT4gIDExMTExMTEwMDAwMDAxMDAKK2RkaW52MDQ3IGludmVydCAxMTExMTExMDEgICAtPiAgMTExMTExMTAwMDAwMDAxMAorZGRpbnYwNDggaW52ZXJ0IDExMTExMTExMCAgIC0+ICAxMTExMTExMDAwMDAwMDAxCitkZGludjA0OSBpbnZlcnQgMDExMTExMDExICAgLT4gIDExMTExMTExMDAwMDAxMDAKK2RkaW52MDUwIGludmVydCAxMDExMTExMDEgICAtPiAgMTExMTExMTAxMDAwMDAxMAorZGRpbnYwNTEgaW52ZXJ0IDExMDExMTExMCAgIC0+ICAxMTExMTExMDAxMDAwMDAxCitkZGludjA1MiBpbnZlcnQgMTExMDExMTAxICAgLT4gIDExMTExMTEwMDAxMDAwMTAKK2RkaW52MDUzIGludmVydCAxMTExMDEwMTEgICAtPiAgMTExMTExMTAwMDAxMDEwMAorZGRpbnYwNTQgaW52ZXJ0IDExMTExMDExMSAgIC0+ICAxMTExMTExMDAwMDAxMDAwCitkZGludjA1NSBpbnZlcnQgMTExMTAxMDExICAgLT4gIDExMTExMTEwMDAwMTAxMDAKK2RkaW52MDU2IGludmVydCAxMTEwMTExMDEgICAtPiAgMTExMTExMTAwMDEwMDAxMAorZGRpbnYwNTcgaW52ZXJ0IDExMDExMTExMCAgIC0+ICAxMTExMTExMDAxMDAwMDAxCitkZGludjA1OCBpbnZlcnQgMTAxMTExMTAxICAgLT4gIDExMTExMTEwMTAwMDAwMTAKK2RkaW52MDU5IGludmVydCAwMTExMTEwMTEgICAtPiAgMTExMTExMTEwMDAwMDEwMAorCitkZGludjA4MCBpbnZlcnQgMTAwMDAwMDAxMTExMTExMSAgIC0+ICAgMTExMTExMTAwMDAwMDAwCitkZGludjA4MSBpbnZlcnQgMDEwMDAwMDEwMTExMTExMSAgIC0+ICAxMDExMTExMDEwMDAwMDAwCitkZGludjA4MiBpbnZlcnQgMDAxMDAwMDExMDExMTExMSAgIC0+ICAxMTAxMTExMDAxMDAwMDAwCitkZGludjA4MyBpbnZlcnQgMDAwMTAwMDExMTAxMTExMSAgIC0+ICAxMTEwMTExMDAwMTAwMDAwCitkZGludjA4NCBpbnZlcnQgMDAwMDEwMDExMTEwMTExMSAgIC0+ICAxMTExMDExMDAwMDEwMDAwCitkZGludjA4NSBpbnZlcnQgMDAwMDAxMDExMTExMDExMSAgIC0+ICAxMTExMTAxMDAwMDAxMDAwCitkZGludjA4NiBpbnZlcnQgMDAwMDAwMTExMTExMTAxMSAgIC0+ICAxMTExMTEwMDAwMDAwMTAwCitkZGludjA4NyBpbnZlcnQgMDAwMDAxMDExMTExMTEwMSAgIC0+ICAxMTExMTAxMDAwMDAwMDEwCitkZGludjA4OCBpbnZlcnQgMDAwMDEwMDExMTExMTExMCAgIC0+ICAxMTExMDExMDAwMDAwMDAxCitkZGludjA4OSBpbnZlcnQgMDAwMTAwMDAxMTExMTAxMSAgIC0+ICAxMTEwMTExMTAwMDAwMTAwCitkZGludjA5MCBpbnZlcnQgMDAxMDAwMDEwMTExMTEwMSAgIC0+ICAxMTAxMTExMDEwMDAwMDEwCitkZGludjA5MSBpbnZlcnQgMDEwMDAwMDExMDExMTExMCAgIC0+ICAxMDExMTExMDAxMDAwMDAxCitkZGludjA5MiBpbnZlcnQgMTAwMDAwMDExMTAxMTEwMSAgIC0+ICAgMTExMTExMDAwMTAwMDEwCitkZGludjA5MyBpbnZlcnQgMDEwMDAwMDExMTEwMTAxMSAgIC0+ICAxMDExMTExMDAwMDEwMTAwCitkZGludjA5NCBpbnZlcnQgMDAxMDAwMDExMTExMDExMSAgIC0+ICAxMTAxMTExMDAwMDAxMDAwCitkZGludjA5NSBpbnZlcnQgMDAwMTAwMDExMTEwMTAxMSAgIC0+ICAxMTEwMTExMDAwMDEwMTAwCitkZGludjA5NiBpbnZlcnQgMDAwMDEwMDExMTAxMTEwMSAgIC0+ICAxMTExMDExMDAwMTAwMDEwCitkZGludjA5NyBpbnZlcnQgMDAwMDAxMDExMDExMTExMCAgIC0+ICAxMTExMTAxMDAxMDAwMDAxCitkZGludjA5OCBpbnZlcnQgMDAwMDAwMTEwMTExMTEwMSAgIC0+ICAxMTExMTEwMDEwMDAwMDEwCitkZGludjA5OSBpbnZlcnQgMDAwMDAxMDAxMTExMTAxMSAgIC0+ICAxMTExMTAxMTAwMDAwMTAwCisKKy0tIG5vbi0wLzEgc2hvdWxkIG5vdCBiZSBhY2NlcHRlZCwgbm9yIHNob3VsZCBzaWducworZGRpbnYyMjAgaW52ZXJ0IDExMTExMTExMiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjIxIGludmVydCAzMzMzMzMzMzMgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjIyMiBpbnZlcnQgNTU1NTU1NTU1ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyMjMgaW52ZXJ0IDc3Nzc3Nzc3NyAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjI0IGludmVydCA5OTk5OTk5OTkgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjIyNSBpbnZlcnQgMjIyMjIyMjIyICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyMjYgaW52ZXJ0IDQ0NDQ0NDQ0NCAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjI3IGludmVydCA2NjY2NjY2NjYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjIyOCBpbnZlcnQgODg4ODg4ODg4ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyMjkgaW52ZXJ0IDk5OTk5OTk5OSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjMwIGludmVydCA5OTk5OTk5OTkgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjIzMSBpbnZlcnQgOTk5OTk5OTk5ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyMzIgaW52ZXJ0IDk5OTk5OTk5OSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGEgZmV3IHJhbmRvbXMKK2RkaW52MjQwIGludmVydCAgNTY3NDY4Njg5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI0MSBpbnZlcnQgIDU2NzM2NzY4OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyNDIgaW52ZXJ0IC02MzE5MTc3NzIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjQzIGludmVydCAtNzU2MjUzMjU3ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI0NCBpbnZlcnQgIDgzNTU5MDE0OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QKK2RkaW52MjUwIGludmVydCAgMjAwMDAwMDAwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyNTEgaW52ZXJ0ICAzMDAwMDAwMDAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI1MiBpbnZlcnQgIDQwMDAwMDAwMDAwMDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjUzIGludmVydCAgNTAwMDAwMDAwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyNTQgaW52ZXJ0ICA2MDAwMDAwMDAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI1NSBpbnZlcnQgIDcwMDAwMDAwMDAwMDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjU2IGludmVydCAgODAwMDAwMDAwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyNTcgaW52ZXJ0ICA5MDAwMDAwMDAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRC0xCitkZGludjI3MCBpbnZlcnQgIDAyMDAwMDEwMDAwMDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjcxIGludmVydCAgMDMwMDAwMDEwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyNzIgaW52ZXJ0ICAwNDAwMDAwMDEwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI3MyBpbnZlcnQgIDA1MDAwMDAwMDEwMDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52Mjc0IGludmVydCAgMTYwMDAwMDAwMDEwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyNzUgaW52ZXJ0ICAxNzAwMDAwMDAwMDEwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI3NiBpbnZlcnQgIDE4MDAwMDAwMDAwMDEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52Mjc3IGludmVydCAgMTkwMDAwMDAwMDAwMDEwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBMU0QKK2RkaW52MjgwIGludmVydCAgMDAxMDAwMDAwMDAwMDAwMiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyODEgaW52ZXJ0ICAwMDAxMDAwMDAwMDAwMDAzICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI4MiBpbnZlcnQgIDAwMDAxMDAwMDAwMDAwMDQgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjgzIGludmVydCAgMDAwMDAxMDAwMDAwMDAwNSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyODQgaW52ZXJ0ICAxMDAwMDAxMDAwMDAwMDA2ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI4NSBpbnZlcnQgIDEwMDAwMDAxMDAwMDAwMDcgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52Mjg2IGludmVydCAgMTAwMDAwMDAxMDAwMDAwOCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyODcgaW52ZXJ0ICAxMDAwMDAwMDAxMDAwMDA5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1pZGRpZQorZGRpbnYyODggaW52ZXJ0ICAwMDEwMDAwMDIwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI4OSBpbnZlcnQgIDAwMDEwMDAwMzAwMDAwMDEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjkwIGludmVydCAgMDAwMDEwMDA0MDAwMDAxMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyOTEgaW52ZXJ0ICAwMDAwMDEwMDUwMDAwMTAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI5MiBpbnZlcnQgIDEwMDAwMDEwNjAwMDEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjkzIGludmVydCAgMTAwMDAwMDE3MDAxMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyOTQgaW52ZXJ0ICAxMDAwMDAwMDgwMTAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI5NSBpbnZlcnQgIDEwMDAwMDAwOTEwMDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHNpZ24KK2RkaW52Mjk2IGludmVydCAtMTAwMDAwMDAwMTAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyOTkgaW52ZXJ0ICAxMDAwMDAwMDAxMDAwMDAwICAtPiAgMTExMTExMTEwMTExMTExCisKKworLS0gTm1heCwgTm1pbiwgTnRpbnktbGlrZQorZGRpbnYzNDEgaW52ZXJ0ICA5Ljk5OTk5OTk5RSsyOTkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MzQyIGludmVydCAgMUUtMjk5ICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjM0MyBpbnZlcnQgIDEuMDAwMDAwMDBFLTI5OSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYzNDQgaW52ZXJ0ICAxRS0yMDcgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MzQ1IGludmVydCAgLTFFLTIwNyAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjM0NiBpbnZlcnQgIC0xLjAwMDAwMDAwRS0yOTkgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYzNDcgaW52ZXJ0ICAtMUUtMjk5ICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MzQ4IGludmVydCAgLTkuOTk5OTk5OTlFKzI5OSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEEgZmV3IG90aGVyIG5vbi1pbnRlZ2VycworZGRpbnYzNjEgaW52ZXJ0ICAxLjAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MzYyIGludmVydCAgMUUrMSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjM2MyBpbnZlcnQgIDAuMCAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYzNjQgaW52ZXJ0ICAwRSsxICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MzY1IGludmVydCAgOS45ICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjM2NiBpbnZlcnQgIDlFKzEgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBbGwgU3BlY2lhbHMgYXJlIGluIGVycm9yCitkZGludjc4OCBpbnZlcnQgLUluZiAgICAgLT4gTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY3OTQgaW52ZXJ0ICBJbmYgICAgIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODIxIGludmVydCAgTmFOICAgICAtPiBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGludjg0MSBpbnZlcnQgIHNOYU4gICAgLT4gTmFOICBJbnZhbGlkX29wZXJhdGlvbgorLS0gcHJvcGFnYXRpbmcgTmFOcworZGRpbnY4NjEgaW52ZXJ0ICBOYU4xICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4NjIgaW52ZXJ0ICtOYU4yICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4NjMgaW52ZXJ0ICBOYU4zICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4NjQgaW52ZXJ0ICBOYU40ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4NjUgaW52ZXJ0ICBOYU41ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4NzEgaW52ZXJ0ICBzTmFOMTEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4NzIgaW52ZXJ0ICBzTmFOMTIgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4NzMgaW52ZXJ0ICBzTmFOMTMgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4NzQgaW52ZXJ0ICBzTmFOMTQgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4NzUgaW52ZXJ0ICBzTmFOMTUgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4NzYgaW52ZXJ0ICBOYU4xNiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4ODEgaW52ZXJ0ICtOYU4yNSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4ODIgaW52ZXJ0IC1OYU4yNiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4ODMgaW52ZXJ0IC1zTmFOMjcgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZExvZ0IuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRMb2dCLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU3MjhlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRMb2dCLmRlY1Rlc3QKQEAgLTAsMCArMSwxNTkgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRMb2dCLmRlY1Rlc3QgLS0gaW50ZWdyYWwgNzU0ciBhZGp1c3RlZCBleHBvbmVudCwgZm9yIGRlY0RvdWJsZXMgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gYmFzaWNzCitkZGxvZ2IwMDAgbG9nYiAgMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5ICBEaXZpc2lvbl9ieV96ZXJvCitkZGxvZ2IwMDEgbG9nYiAgMUUtMzk4ICAgICAgICAgICAgLT4gLTM5OAorZGRsb2diMDAyIGxvZ2IgIDFFLTM4MyAgICAgICAgICAgIC0+IC0zODMKK2RkbG9nYjAwMyBsb2diICAwLjAwMSAgICAgICAgICAgICAtPiAtMworZGRsb2diMDA0IGxvZ2IgIDAuMDMgICAgICAgICAgICAgIC0+IC0yCitkZGxvZ2IwMDUgbG9nYiAgMSAgICAgICAgICAgICAgICAgLT4gIDAKK2RkbG9nYjAwNiBsb2diICAyICAgICAgICAgICAgICAgICAtPiAgMAorZGRsb2diMDA3IGxvZ2IgIDIuNSAgICAgICAgICAgICAgIC0+ICAwCitkZGxvZ2IwMDggbG9nYiAgMi41MDAgICAgICAgICAgICAgLT4gIDAKK2RkbG9nYjAwOSBsb2diICAxMCAgICAgICAgICAgICAgICAtPiAgMQorZGRsb2diMDEwIGxvZ2IgIDcwICAgICAgICAgICAgICAgIC0+ICAxCitkZGxvZ2IwMTEgbG9nYiAgMTAwICAgICAgICAgICAgICAgLT4gIDIKK2RkbG9nYjAxMiBsb2diICAzMzMgICAgICAgICAgICAgICAtPiAgMgorZGRsb2diMDEzIGxvZ2IgIDlFKzM4NCAgICAgICAgICAgIC0+ICAzODQKK2RkbG9nYjAxNCBsb2diICtJbmZpbml0eSAgICAgICAgICAtPiAgSW5maW5pdHkKKworLS0gbmVnYXRpdmVzIGFwcGVhciB0byBiZSB0cmVhdGVkIGFzIHBvc2l0aXZlcworZGRsb2diMDIxIGxvZ2IgLTAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZGRsb2diMDIyIGxvZ2IgLTFFLTM5OCAgICAgICAgICAgIC0+IC0zOTgKK2RkbG9nYjAyMyBsb2diIC05RS0zODMgICAgICAgICAgICAtPiAtMzgzCitkZGxvZ2IwMjQgbG9nYiAtMC4wMDEgICAgICAgICAgICAgLT4gLTMKK2RkbG9nYjAyNSBsb2diIC0xICAgICAgICAgICAgICAgICAtPiAgMAorZGRsb2diMDI2IGxvZ2IgLTIgICAgICAgICAgICAgICAgIC0+ICAwCitkZGxvZ2IwMjcgbG9nYiAtMTAgICAgICAgICAgICAgICAgLT4gIDEKK2RkbG9nYjAyOCBsb2diIC03MCAgICAgICAgICAgICAgICAtPiAgMQorZGRsb2diMDI5IGxvZ2IgLTEwMCAgICAgICAgICAgICAgIC0+ICAyCitkZGxvZ2IwMzAgbG9nYiAtOUUrMzg0ICAgICAgICAgICAgLT4gIDM4NAorZGRsb2diMDMxIGxvZ2IgLUluZmluaXR5ICAgICAgICAgIC0+ICBJbmZpbml0eQorCistLSB6ZXJvcworZGRsb2diMTExIGxvZ2IgICAgICAgICAgMCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZGRsb2diMTEyIGxvZ2IgICAgICAgICAtMCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZGRsb2diMTEzIGxvZ2IgICAgICAgMEUrNCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZGRsb2diMTE0IGxvZ2IgICAgICAtMEUrNCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZGRsb2diMTE1IGxvZ2IgICAgIDAuMDAwMCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZGRsb2diMTE2IGxvZ2IgICAgLTAuMDAwMCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZGRsb2diMTE3IGxvZ2IgICAgICAwRS0xNDEgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZGRsb2diMTE4IGxvZ2IgICAgIC0wRS0xNDEgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZGRsb2diMTIxIGxvZ2IgICAyNjgyNjgyNjggICAgICAgIC0+IDgKK2RkbG9nYjEyMiBsb2diICAtMjY4MjY4MjY4ICAgICAgICAtPiA4CitkZGxvZ2IxMjMgbG9nYiAgIDEzNDEzNDEzNCAgICAgICAgLT4gOAorZGRsb2diMTI0IGxvZ2IgIC0xMzQxMzQxMzQgICAgICAgIC0+IDgKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RkbG9nYjEzMSBsb2diICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgLT4gIDM4NAorZGRsb2diMTMyIGxvZ2IgIDFFLTM4MyAgICAgICAgICAgICAgICAgICAtPiAtMzgzCitkZGxvZ2IxMzMgbG9nYiAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgIC0+IC0zODMKK2RkbG9nYjEzNCBsb2diICAxRS0zOTggICAgICAgICAgICAgICAgICAgLT4gLTM5OAorCitkZGxvZ2IxMzUgbG9nYiAgLTFFLTM5OCAgICAgICAgICAgICAgICAgIC0+IC0zOTgKK2RkbG9nYjEzNiBsb2diICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gLTM4MworZGRsb2diMTM3IGxvZ2IgIC0xRS0zODMgICAgICAgICAgICAgICAgICAtPiAtMzgzCitkZGxvZ2IxMzggbG9nYiAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0+ICAzODQKKworLS0gb25lcworZGRsb2diMDA2MSBsb2diICAxICAgICAgICAgICAgICAgICAtPiAgIDAKK2RkbG9nYjAwNjIgbG9nYiAgMS4wICAgICAgICAgICAgICAgLT4gICAwCitkZGxvZ2IwMDYzIGxvZ2IgIDEuMDAwMDAwMDAwMDAwMDAwIC0+ICAgMAorCistLSBub3RhYmxlIGNhc2VzIC0tIGV4YWN0IHBvd2VycyBvZiAxMAorZGRsb2diMTEwMCBsb2diIDEgICAgICAgICAgICAgLT4gMAorZGRsb2diMTEwMSBsb2diIDEwICAgICAgICAgICAgLT4gMQorZGRsb2diMTEwMiBsb2diIDEwMCAgICAgICAgICAgLT4gMgorZGRsb2diMTEwMyBsb2diIDEwMDAgICAgICAgICAgLT4gMworZGRsb2diMTEwNCBsb2diIDEwMDAwICAgICAgICAgLT4gNAorZGRsb2diMTEwNSBsb2diIDEwMDAwMCAgICAgICAgLT4gNQorZGRsb2diMTEwNiBsb2diIDEwMDAwMDAgICAgICAgLT4gNgorZGRsb2diMTEwNyBsb2diIDEwMDAwMDAwICAgICAgLT4gNworZGRsb2diMTEwOCBsb2diIDEwMDAwMDAwMCAgICAgLT4gOAorZGRsb2diMTEwOSBsb2diIDEwMDAwMDAwMDAgICAgLT4gOQorZGRsb2diMTExMCBsb2diIDEwMDAwMDAwMDAwICAgLT4gMTAKK2RkbG9nYjExMTEgbG9nYiAxMDAwMDAwMDAwMDAgIC0+IDExCitkZGxvZ2IxMTEyIGxvZ2IgMTAwMDAwMDAwMDAwMCAtPiAxMgorZGRsb2diMTExMyBsb2diIDAuMDAwMDAwMDAwMDEgLT4gLTExCitkZGxvZ2IxMTE0IGxvZ2IgMC4wMDAwMDAwMDAxIC0+IC0xMAorZGRsb2diMTExNSBsb2diIDAuMDAwMDAwMDAxIC0+IC05CitkZGxvZ2IxMTE2IGxvZ2IgMC4wMDAwMDAwMSAtPiAtOAorZGRsb2diMTExNyBsb2diIDAuMDAwMDAwMSAtPiAtNworZGRsb2diMTExOCBsb2diIDAuMDAwMDAxIC0+IC02CitkZGxvZ2IxMTE5IGxvZ2IgMC4wMDAwMSAtPiAtNQorZGRsb2diMTEyMCBsb2diIDAuMDAwMSAtPiAtNAorZGRsb2diMTEyMSBsb2diIDAuMDAxIC0+IC0zCitkZGxvZ2IxMTIyIGxvZ2IgMC4wMSAtPiAtMgorZGRsb2diMTEyMyBsb2diIDAuMSAtPiAtMQorZGRsb2diMTEyNCBsb2diIDFFLTk5ICAtPiAtOTkKK2RkbG9nYjExMjUgbG9nYiAxRS0xMDAgLT4gLTEwMAorZGRsb2diMTEyNyBsb2diIDFFLTI5OSAtPiAtMjk5CitkZGxvZ2IxMTI2IGxvZ2IgMUUtMzgzIC0+IC0zODMKKworLS0gc3VnZ2VzdGlvbnMgZnJvbSBJbGFuIE5laGFtYQorZGRsb2diMTQwMCBsb2diIDEwRS0zICAgIC0+IC0yCitkZGxvZ2IxNDAxIGxvZ2IgMTBFLTIgICAgLT4gLTEKK2RkbG9nYjE0MDIgbG9nYiAxMDBFLTIgICAtPiAgMAorZGRsb2diMTQwMyBsb2diIDEwMDBFLTIgIC0+ICAxCitkZGxvZ2IxNDA0IGxvZ2IgMTAwMDBFLTIgLT4gIDIKK2RkbG9nYjE0MDUgbG9nYiAxMEUtMSAgICAtPiAgMAorZGRsb2diMTQwNiBsb2diIDEwMEUtMSAgIC0+ICAxCitkZGxvZ2IxNDA3IGxvZ2IgMTAwMEUtMSAgLT4gIDIKK2RkbG9nYjE0MDggbG9nYiAxMDAwMEUtMSAtPiAgMworZGRsb2diMTQwOSBsb2diIDEwRTAgICAgIC0+ICAxCitkZGxvZ2IxNDEwIGxvZ2IgMTAwRTAgICAgLT4gIDIKK2RkbG9nYjE0MTEgbG9nYiAxMDAwRTAgICAtPiAgMworZGRsb2diMTQxMiBsb2diIDEwMDAwRTAgIC0+ICA0CitkZGxvZ2IxNDEzIGxvZ2IgMTBFMSAgICAgLT4gIDIKK2RkbG9nYjE0MTQgbG9nYiAxMDBFMSAgICAtPiAgMworZGRsb2diMTQxNSBsb2diIDEwMDBFMSAgIC0+ICA0CitkZGxvZ2IxNDE2IGxvZ2IgMTAwMDBFMSAgLT4gIDUKK2RkbG9nYjE0MTcgbG9nYiAxMEUyICAgICAtPiAgMworZGRsb2diMTQxOCBsb2diIDEwMEUyICAgIC0+ICA0CitkZGxvZ2IxNDE5IGxvZ2IgMTAwMEUyICAgLT4gIDUKK2RkbG9nYjE0MjAgbG9nYiAxMDAwMEUyICAtPiAgNgorCistLSBzcGVjaWFsIHZhbHVlcworZGRsb2diODIwICBsb2diICAgSW5maW5pdHkgLT4gICBJbmZpbml0eQorZGRsb2diODIxICBsb2diICAgMCAgICAgICAgLT4gIC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGxvZ2I4MjIgIGxvZ2IgICBOYU4gICAgICAtPiAgIE5hTgorZGRsb2diODIzICBsb2diICAgc05hTiAgICAgLT4gICBOYU4gICAgIEludmFsaWRfb3BlcmF0aW9uCistLSBwcm9wYWdhdGluZyBOYU5zCitkZGxvZ2I4MjQgIGxvZ2IgICBzTmFOMTIzICAtPiAgIE5hTjEyMyAgSW52YWxpZF9vcGVyYXRpb24KK2RkbG9nYjgyNSAgbG9nYiAgIC1zTmFOMzIxIC0+ICAtTmFOMzIxICBJbnZhbGlkX29wZXJhdGlvbgorZGRsb2diODI2ICBsb2diICAgTmFONDU2ICAgLT4gICBOYU40NTYKK2RkbG9nYjgyNyAgbG9nYiAgIC1OYU42NTQgIC0+ICAtTmFONjU0CitkZGxvZ2I4MjggIGxvZ2IgICBOYU4xICAgICAtPiAgIE5hTjEKKworLS0gTnVsbCB0ZXN0CitkZGxvZ2I5MDAgIGxvZ2IgIyAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNYXguZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNYXguZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWM2Mzk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE1heC5kZWNUZXN0CkBAIC0wLDAgKzEsMzIyIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkTWF4LmRlY1Rlc3QgLS0gZGVjRG91YmxlIG1heG51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gd2UgYXNzdW1lIHRoYXQgYmFzZSBjb21wYXJpc29uIGlzIHRlc3RlZCBpbiBjb21wYXJlLmRlY1Rlc3QsIHNvCistLSB0aGVzZSBtYWlubHkgY292ZXIgc3BlY2lhbCBjYXNlcyBhbmQgcm91bmRpbmcKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkZG1heDAwMSBtYXggIC0yICAtMiAgLT4gLTIKK2RkbWF4MDAyIG1heCAgLTIgIC0xICAtPiAtMQorZGRtYXgwMDMgbWF4ICAtMiAgIDAgIC0+ICAwCitkZG1heDAwNCBtYXggIC0yICAgMSAgLT4gIDEKK2RkbWF4MDA1IG1heCAgLTIgICAyICAtPiAgMgorZGRtYXgwMDYgbWF4ICAtMSAgLTIgIC0+IC0xCitkZG1heDAwNyBtYXggIC0xICAtMSAgLT4gLTEKK2RkbWF4MDA4IG1heCAgLTEgICAwICAtPiAgMAorZGRtYXgwMDkgbWF4ICAtMSAgIDEgIC0+ICAxCitkZG1heDAxMCBtYXggIC0xICAgMiAgLT4gIDIKK2RkbWF4MDExIG1heCAgIDAgIC0yICAtPiAgMAorZGRtYXgwMTIgbWF4ICAgMCAgLTEgIC0+ICAwCitkZG1heDAxMyBtYXggICAwICAgMCAgLT4gIDAKK2RkbWF4MDE0IG1heCAgIDAgICAxICAtPiAgMQorZGRtYXgwMTUgbWF4ICAgMCAgIDIgIC0+ICAyCitkZG1heDAxNiBtYXggICAxICAtMiAgLT4gIDEKK2RkbWF4MDE3IG1heCAgIDEgIC0xICAtPiAgMQorZGRtYXgwMTggbWF4ICAgMSAgIDAgIC0+ICAxCitkZG1heDAxOSBtYXggICAxICAgMSAgLT4gIDEKK2RkbWF4MDIwIG1heCAgIDEgICAyICAtPiAgMgorZGRtYXgwMjEgbWF4ICAgMiAgLTIgIC0+ICAyCitkZG1heDAyMiBtYXggICAyICAtMSAgLT4gIDIKK2RkbWF4MDIzIG1heCAgIDIgICAwICAtPiAgMgorZGRtYXgwMjUgbWF4ICAgMiAgIDEgIC0+ICAyCitkZG1heDAyNiBtYXggICAyICAgMiAgLT4gIDIKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RkbWF4MDMwIG1heCAgIDAgICAgIDAgICAtPiAgMAorZGRtYXgwMzEgbWF4ICAgMCAgICAtMCAgIC0+ICAwCitkZG1heDAzMiBtYXggICAwICAgIC0wLjAgLT4gIDAKK2RkbWF4MDMzIG1heCAgIDAgICAgIDAuMCAtPiAgMAorZGRtYXgwMzQgbWF4ICAtMCAgICAgMCAgIC0+ICAwICAgIC0tIG5vdGU6IC0wID0gMCwgYnV0IDAgY2hvc2VuCitkZG1heDAzNSBtYXggIC0wICAgIC0wICAgLT4gLTAKK2RkbWF4MDM2IG1heCAgLTAgICAgLTAuMCAtPiAtMC4wCitkZG1heDAzNyBtYXggIC0wICAgICAwLjAgLT4gIDAuMAorZGRtYXgwMzggbWF4ICAgMC4wICAgMCAgIC0+ICAwCitkZG1heDAzOSBtYXggICAwLjAgIC0wICAgLT4gIDAuMAorZGRtYXgwNDAgbWF4ICAgMC4wICAtMC4wIC0+ICAwLjAKK2RkbWF4MDQxIG1heCAgIDAuMCAgIDAuMCAtPiAgMC4wCitkZG1heDA0MiBtYXggIC0wLjAgICAwICAgLT4gIDAKK2RkbWF4MDQzIG1heCAgLTAuMCAgLTAgICAtPiAtMC4wCitkZG1heDA0NCBtYXggIC0wLjAgIC0wLjAgLT4gLTAuMAorZGRtYXgwNDUgbWF4ICAtMC4wICAgMC4wIC0+ICAwLjAKKworZGRtYXgwNTAgbWF4ICAtMEUxICAgMEUxIC0+ICAwRSsxCitkZG1heDA1MSBtYXggIC0wRTIgICAwRTIgLT4gIDBFKzIKK2RkbWF4MDUyIG1heCAgLTBFMiAgIDBFMSAtPiAgMEUrMQorZGRtYXgwNTMgbWF4ICAtMEUxICAgMEUyIC0+ICAwRSsyCitkZG1heDA1NCBtYXggICAwRTEgIC0wRTEgLT4gIDBFKzEKK2RkbWF4MDU1IG1heCAgIDBFMiAgLTBFMiAtPiAgMEUrMgorZGRtYXgwNTYgbWF4ICAgMEUyICAtMEUxIC0+ICAwRSsyCitkZG1heDA1NyBtYXggICAwRTEgIC0wRTIgLT4gIDBFKzEKKworZGRtYXgwNTggbWF4ICAgMEUxICAgMEUxIC0+ICAwRSsxCitkZG1heDA1OSBtYXggICAwRTIgICAwRTIgLT4gIDBFKzIKK2RkbWF4MDYwIG1heCAgIDBFMiAgIDBFMSAtPiAgMEUrMgorZGRtYXgwNjEgbWF4ICAgMEUxICAgMEUyIC0+ICAwRSsyCitkZG1heDA2MiBtYXggIC0wRTEgIC0wRTEgLT4gLTBFKzEKK2RkbWF4MDYzIG1heCAgLTBFMiAgLTBFMiAtPiAtMEUrMgorZGRtYXgwNjQgbWF4ICAtMEUyICAtMEUxIC0+IC0wRSsxCitkZG1heDA2NSBtYXggIC0wRTEgIC0wRTIgLT4gLTBFKzEKKworLS0gU3BlY2lhbHMKK2RkbWF4MDkwIG1heCAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CitkZG1heDA5MSBtYXggIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZGRtYXgwOTIgbWF4ICBJbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RkbWF4MDkzIG1heCAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkZG1heDA5NCBtYXggIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZGRtYXgwOTUgbWF4ICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2RkbWF4MDk2IG1heCAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkZG1heDA5NyBtYXggIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRtYXgwOTggbWF4IC0xMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbWF4MDk5IG1heCAtSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkZG1heDEwMCBtYXggLTEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRtYXgxMDEgbWF4IC0wICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbWF4MTAyIG1heCAgMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitkZG1heDEwMyBtYXggIDEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRtYXgxMDQgbWF4ICAxMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbWF4MTA1IG1heCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RkbWF4MTIwIG1heCAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkZG1heDEyMSBtYXggLUluZiAgLTEwMDAgIC0+IC0xMDAwCitkZG1heDEyMiBtYXggLUluZiAgLTEgICAgIC0+IC0xCitkZG1heDEyMyBtYXggLUluZiAgLTAgICAgIC0+IC0wCitkZG1heDEyNCBtYXggLUluZiAgIDAgICAgIC0+ICAwCitkZG1heDEyNSBtYXggLUluZiAgIDEgICAgIC0+ICAxCitkZG1heDEyNiBtYXggLUluZiAgIDEwMDAgIC0+ICAxMDAwCitkZG1heDEyNyBtYXggLUluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRtYXgxMjggbWF4IC1JbmYgIC1JbmYgICAtPiAgLUluZmluaXR5CitkZG1heDEyOSBtYXggLTEwMDAgLUluZiAgIC0+ICAtMTAwMAorZGRtYXgxMzAgbWF4IC0xICAgIC1JbmYgICAtPiAgLTEKK2RkbWF4MTMxIG1heCAtMCAgICAtSW5mICAgLT4gIC0wCitkZG1heDEzMiBtYXggIDAgICAgLUluZiAgIC0+ICAwCitkZG1heDEzMyBtYXggIDEgICAgLUluZiAgIC0+ICAxCitkZG1heDEzNCBtYXggIDEwMDAgLUluZiAgIC0+ICAxMDAwCitkZG1heDEzNSBtYXggIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorCistLSAyMDA0LjA4LjAyIDc1NHIgY2hvb3NlcyBudW1iZXIgb3ZlciBOYU4gaW4gbWl4ZWQgY2FzZXMKK2RkbWF4MTQxIG1heCAgTmFOIC1JbmYgICAgLT4gLUluZmluaXR5CitkZG1heDE0MiBtYXggIE5hTiAtMTAwMCAgIC0+IC0xMDAwCitkZG1heDE0MyBtYXggIE5hTiAtMSAgICAgIC0+IC0xCitkZG1heDE0NCBtYXggIE5hTiAtMCAgICAgIC0+IC0wCitkZG1heDE0NSBtYXggIE5hTiAgMCAgICAgIC0+ICAwCitkZG1heDE0NiBtYXggIE5hTiAgMSAgICAgIC0+ICAxCitkZG1heDE0NyBtYXggIE5hTiAgMTAwMCAgIC0+ICAxMDAwCitkZG1heDE0OCBtYXggIE5hTiAgSW5mICAgIC0+ICBJbmZpbml0eQorZGRtYXgxNDkgbWF4ICBOYU4gIE5hTiAgICAtPiAgTmFOCitkZG1heDE1MCBtYXggLUluZiAgTmFOICAgIC0+IC1JbmZpbml0eQorZGRtYXgxNTEgbWF4IC0xMDAwIE5hTiAgICAtPiAtMTAwMAorZGRtYXgxNTIgbWF4IC0xICAgIE5hTiAgICAtPiAtMQorZGRtYXgxNTMgbWF4IC0wICAgIE5hTiAgICAtPiAtMAorZGRtYXgxNTQgbWF4ICAwICAgIE5hTiAgICAtPiAgMAorZGRtYXgxNTUgbWF4ICAxICAgIE5hTiAgICAtPiAgMQorZGRtYXgxNTYgbWF4ICAxMDAwIE5hTiAgICAtPiAgMTAwMAorZGRtYXgxNTcgbWF4ICBJbmYgIE5hTiAgICAtPiAgSW5maW5pdHkKKworZGRtYXgxNjEgbWF4ICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNjIgbWF4ICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNjMgbWF4ICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNjQgbWF4ICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNjUgbWF4ICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNjYgbWF4ICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNjcgbWF4ICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNjggbWF4ICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNjkgbWF4ICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNzAgbWF4ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNzEgbWF4IC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNzIgbWF4IC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNzMgbWF4IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNzQgbWF4IC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNzUgbWF4ICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNzYgbWF4ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNzcgbWF4ICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNzggbWF4ICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxNzkgbWF4ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZG1heDE4MSBtYXggIE5hTjkgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbWF4MTgyIG1heCAgTmFOOCAgICAgOSAgIC0+ICA5CitkZG1heDE4MyBtYXggLU5hTjcgICBJbmYgICAtPiAgSW5maW5pdHkKKworZGRtYXgxODQgbWF4IC1OYU4xICAgTmFOMTEgLT4gLU5hTjEKK2RkbWF4MTg1IG1heCAgTmFOMiAgIE5hTjEyIC0+ICBOYU4yCitkZG1heDE4NiBtYXggLU5hTjEzIC1OYU43ICAtPiAtTmFOMTMKK2RkbWF4MTg3IG1heCAgTmFOMTQgLU5hTjUgIC0+ICBOYU4xNAorCitkZG1heDE4OCBtYXggLUluZiAgICBOYU40ICAtPiAtSW5maW5pdHkKK2RkbWF4MTg5IG1heCAtOSAgICAgLU5hTjMgIC0+IC05CitkZG1heDE5MCBtYXggIEluZiAgICBOYU4yICAtPiAgSW5maW5pdHkKKworZGRtYXgxOTEgbWF4ICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTkyIG1heCAgc05hTjk4IC0xICAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkZG1heDE5MyBtYXggLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxOTQgbWF4ICBzTmFOOTYgc05hTjk0ICAtPiAgTmFOOTYgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTk1IG1heCAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkZG1heDE5NiBtYXggLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxOTcgbWF4ICAwICAgICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTk4IG1heCAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkZG1heDE5OSBtYXggIE5hTiAgICBzTmFOODkgIC0+ICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvbGQgcm91bmRpbmcgY2hlY2tzCitkZG1heDIyMSBtYXggMTIzNDU2NzgwMDAgMSAgLT4gMTIzNDU2NzgwMDAKK2RkbWF4MjIyIG1heCAxIDEyMzQ1Njc4MDAwICAtPiAxMjM0NTY3ODAwMAorZGRtYXgyMjMgbWF4IDEyMzQ1Njc4MDAgIDEgIC0+IDEyMzQ1Njc4MDAKK2RkbWF4MjI0IG1heCAxIDEyMzQ1Njc4MDAgICAtPiAxMjM0NTY3ODAwCitkZG1heDIyNSBtYXggMTIzNDU2Nzg5MCAgMSAgLT4gMTIzNDU2Nzg5MAorZGRtYXgyMjYgbWF4IDEgMTIzNDU2Nzg5MCAgIC0+IDEyMzQ1Njc4OTAKK2RkbWF4MjI3IG1heCAxMjM0NTY3ODkxICAxICAtPiAxMjM0NTY3ODkxCitkZG1heDIyOCBtYXggMSAxMjM0NTY3ODkxICAgLT4gMTIzNDU2Nzg5MQorZGRtYXgyMjkgbWF4IDEyMzQ1Njc4OTAxIDEgIC0+IDEyMzQ1Njc4OTAxCitkZG1heDIzMCBtYXggMSAxMjM0NTY3ODkwMSAgLT4gMTIzNDU2Nzg5MDEKK2RkbWF4MjMxIG1heCAxMjM0NTY3ODk2ICAxICAtPiAxMjM0NTY3ODk2CitkZG1heDIzMiBtYXggMSAxMjM0NTY3ODk2ICAgLT4gMTIzNDU2Nzg5NgorZGRtYXgyMzMgbWF4IC0xMjM0NTY3ODkxICAxIC0+IDEKK2RkbWF4MjM0IG1heCAxIC0xMjM0NTY3ODkxICAtPiAxCitkZG1heDIzNSBtYXggLTEyMzQ1Njc4OTAxIDEgLT4gMQorZGRtYXgyMzYgbWF4IDEgLTEyMzQ1Njc4OTAxIC0+IDEKK2RkbWF4MjM3IG1heCAtMTIzNDU2Nzg5NiAgMSAtPiAxCitkZG1heDIzOCBtYXggMSAtMTIzNDU2Nzg5NiAgLT4gMQorCistLSBmcm9tIGV4YW1wbGVzCitkZG1heDI4MCBtYXggJzMnICAgJzInICAtPiAgJzMnCitkZG1heDI4MSBtYXggJy0xMCcgJzMnICAtPiAgJzMnCitkZG1heDI4MiBtYXggJzEuMCcgJzEnICAtPiAgJzEnCitkZG1heDI4MyBtYXggJzEnICcxLjAnICAtPiAgJzEnCitkZG1heDI4NCBtYXggJzcnICdOYU4nICAtPiAgJzcnCisKKy0tIGV4cGFuZGVkIGxpc3QgZnJvbSBtaW4vbWF4IDc1NHIgcHVycGxlIHByb3NlCistLSBbZXhwbGljaXQgdGVzdHMgZm9yIGV4cG9uZW50IG9yZGVyaW5nXQorZGRtYXg0MDEgbWF4ICBJbmYgICAgMS4xICAgICAtPiAgSW5maW5pdHkKK2RkbWF4NDAyIG1heCAgMS4xICAgIDEgICAgICAgLT4gIDEuMQorZGRtYXg0MDMgbWF4ICAxICAgICAgMS4wICAgICAtPiAgMQorZGRtYXg0MDQgbWF4ICAxLjAgICAgMC4xICAgICAtPiAgMS4wCitkZG1heDQwNSBtYXggIDAuMSAgICAwLjEwICAgIC0+ICAwLjEKK2RkbWF4NDA2IG1heCAgMC4xMCAgIDAuMTAwICAgLT4gIDAuMTAKK2RkbWF4NDA3IG1heCAgMC4xMCAgIDAgICAgICAgLT4gIDAuMTAKK2RkbWF4NDA4IG1heCAgMCAgICAgIDAuMCAgICAgLT4gIDAKK2RkbWF4NDA5IG1heCAgMC4wICAgLTAgICAgICAgLT4gIDAuMAorZGRtYXg0MTAgbWF4ICAwLjAgICAtMC4wICAgICAtPiAgMC4wCitkZG1heDQxMSBtYXggIDAuMDAgIC0wLjAgICAgIC0+ICAwLjAwCitkZG1heDQxMiBtYXggIDAuMCAgIC0wLjAwICAgIC0+ICAwLjAKK2RkbWF4NDEzIG1heCAgMCAgICAgLTAuMCAgICAgLT4gIDAKK2RkbWF4NDE0IG1heCAgMCAgICAgLTAgICAgICAgLT4gIDAKK2RkbWF4NDE1IG1heCAtMC4wICAgLTAgICAgICAgLT4gLTAuMAorZGRtYXg0MTYgbWF4IC0wICAgICAtMC4xMDAgICAtPiAtMAorZGRtYXg0MTcgbWF4IC0wLjEwMCAtMC4xMCAgICAtPiAtMC4xMDAKK2RkbWF4NDE4IG1heCAtMC4xMCAgLTAuMSAgICAgLT4gLTAuMTAKK2RkbWF4NDE5IG1heCAtMC4xICAgLTEuMCAgICAgLT4gLTAuMQorZGRtYXg0MjAgbWF4IC0xLjAgICAtMSAgICAgICAtPiAtMS4wCitkZG1heDQyMSBtYXggLTEgICAgIC0xLjEgICAgIC0+IC0xCitkZG1heDQyMyBtYXggLTEuMSAgIC1JbmYgICAgIC0+IC0xLjEKKy0tIHNhbWUgd2l0aCBvcGVyYW5kcyByZXZlcnNlZAorZGRtYXg0MzEgbWF4ICAxLjEgICAgSW5mICAgICAtPiAgSW5maW5pdHkKK2RkbWF4NDMyIG1heCAgMSAgICAgIDEuMSAgICAgLT4gIDEuMQorZGRtYXg0MzMgbWF4ICAxLjAgICAgMSAgICAgICAtPiAgMQorZGRtYXg0MzQgbWF4ICAwLjEgICAgMS4wICAgICAtPiAgMS4wCitkZG1heDQzNSBtYXggIDAuMTAgICAwLjEgICAgIC0+ICAwLjEKK2RkbWF4NDM2IG1heCAgMC4xMDAgIDAuMTAgICAgLT4gIDAuMTAKK2RkbWF4NDM3IG1heCAgMCAgICAgIDAuMTAgICAgLT4gIDAuMTAKK2RkbWF4NDM4IG1heCAgMC4wICAgIDAgICAgICAgLT4gIDAKK2RkbWF4NDM5IG1heCAtMCAgICAgIDAuMCAgICAgLT4gIDAuMAorZGRtYXg0NDAgbWF4IC0wLjAgICAgMC4wICAgICAtPiAgMC4wCitkZG1heDQ0MSBtYXggLTAuMCAgICAwLjAwICAgIC0+ICAwLjAwCitkZG1heDQ0MiBtYXggLTAuMDAgICAwLjAgICAgIC0+ICAwLjAKK2RkbWF4NDQzIG1heCAtMC4wICAgIDAgICAgICAgLT4gIDAKK2RkbWF4NDQ0IG1heCAtMCAgICAgIDAgICAgICAgLT4gIDAKK2RkbWF4NDQ1IG1heCAtMCAgICAgLTAuMCAgICAgLT4gLTAuMAorZGRtYXg0NDYgbWF4IC0wLjEwMCAtMCAgICAgICAtPiAtMAorZGRtYXg0NDcgbWF4IC0wLjEwICAtMC4xMDAgICAtPiAtMC4xMDAKK2RkbWF4NDQ4IG1heCAtMC4xICAgLTAuMTAgICAgLT4gLTAuMTAKK2RkbWF4NDQ5IG1heCAtMS4wICAgLTAuMSAgICAgLT4gLTAuMQorZGRtYXg0NTAgbWF4IC0xICAgICAtMS4wICAgICAtPiAtMS4wCitkZG1heDQ1MSBtYXggLTEuMSAgIC0xICAgICAgIC0+IC0xCitkZG1heDQ1MyBtYXggLUluZiAgIC0xLjEgICAgIC0+IC0xLjEKKy0tIGxhcmdpZXMKK2RkbWF4NDYwIG1heCAgMTAwMCAgIDFFKzMgICAgLT4gIDFFKzMKK2RkbWF4NDYxIG1heCAgMUUrMyAgIDEwMDAgICAgLT4gIDFFKzMKK2RkbWF4NDYyIG1heCAgMTAwMCAgLTFFKzMgICAgLT4gIDEwMDAKK2RkbWF4NDYzIG1heCAgMUUrMyAgLTEwMDAgICAgLT4gIDFFKzMKK2RkbWF4NDY0IG1heCAtMTAwMCAgIDFFKzMgICAgLT4gIDFFKzMKK2RkbWF4NDY1IG1heCAtMUUrMyAgIDEwMDAgICAgLT4gIDEwMDAKK2RkbWF4NDY2IG1heCAtMTAwMCAgLTFFKzMgICAgLT4gLTEwMDAKK2RkbWF4NDY3IG1heCAtMUUrMyAgLTEwMDAgICAgLT4gLTEwMDAKKworLS0gbWlzYWxpZ25tZW50IHRyYXBzIGZvciBsaXR0bGUtZW5kaWFuCitkZG1heDQ3MSBtYXggICAgICAxLjAgICAgICAgMC4xICAtPiAxLjAKK2RkbWF4NDcyIG1heCAgICAgIDAuMSAgICAgICAxLjAgIC0+IDEuMAorZGRtYXg0NzMgbWF4ICAgICAxMC4wICAgICAgIDAuMSAgLT4gMTAuMAorZGRtYXg0NzQgbWF4ICAgICAgMC4xICAgICAgMTAuMCAgLT4gMTAuMAorZGRtYXg0NzUgbWF4ICAgICAgMTAwICAgICAgIDEuMCAgLT4gMTAwCitkZG1heDQ3NiBtYXggICAgICAxLjAgICAgICAgMTAwICAtPiAxMDAKK2RkbWF4NDc3IG1heCAgICAgMTAwMCAgICAgIDEwLjAgIC0+IDEwMDAKK2RkbWF4NDc4IG1heCAgICAgMTAuMCAgICAgIDEwMDAgIC0+IDEwMDAKK2RkbWF4NDc5IG1heCAgICAxMDAwMCAgICAgMTAwLjAgIC0+IDEwMDAwCitkZG1heDQ4MCBtYXggICAgMTAwLjAgICAgIDEwMDAwICAtPiAxMDAwMAorZGRtYXg0ODEgbWF4ICAgMTAwMDAwICAgIDEwMDAuMCAgLT4gMTAwMDAwCitkZG1heDQ4MiBtYXggICAxMDAwLjAgICAgMTAwMDAwICAtPiAxMDAwMDAKK2RkbWF4NDgzIG1heCAgMTAwMDAwMCAgIDEwMDAwLjAgIC0+IDEwMDAwMDAKK2RkbWF4NDg0IG1heCAgMTAwMDAuMCAgIDEwMDAwMDAgIC0+IDEwMDAwMDAKKworLS0gc3Vibm9ybWFscworZGRtYXg1MTAgbWF4ICAxLjAwRS0zODMgICAgICAgMCAgLT4gICAxLjAwRS0zODMKK2RkbWF4NTExIG1heCAgMC4xRS0zODMgICAgICAgIDAgIC0+ICAgMUUtMzg0ICAgIFN1Ym5vcm1hbAorZGRtYXg1MTIgbWF4ICAwLjEwRS0zODMgICAgICAgMCAgLT4gICAxLjBFLTM4NCAgU3Vibm9ybWFsCitkZG1heDUxMyBtYXggIDAuMTAwRS0zODMgICAgICAwICAtPiAgIDEuMDBFLTM4NCBTdWJub3JtYWwKK2RkbWF4NTE0IG1heCAgMC4wMUUtMzgzICAgICAgIDAgIC0+ICAgMUUtMzg1ICAgIFN1Ym5vcm1hbAorZGRtYXg1MTUgbWF4ICAwLjk5OUUtMzgzICAgICAgMCAgLT4gICA5Ljk5RS0zODQgU3Vibm9ybWFsCitkZG1heDUxNiBtYXggIDAuMDk5RS0zODMgICAgICAwICAtPiAgIDkuOUUtMzg1ICBTdWJub3JtYWwKK2RkbWF4NTE3IG1heCAgMC4wMDlFLTM4MyAgICAgIDAgIC0+ICAgOUUtMzg2ICAgIFN1Ym5vcm1hbAorZGRtYXg1MTggbWF4ICAwLjAwMUUtMzgzICAgICAgMCAgLT4gICAxRS0zODYgICAgU3Vibm9ybWFsCitkZG1heDUxOSBtYXggIDAuMDAwOUUtMzgzICAgICAwICAtPiAgIDlFLTM4NyAgICBTdWJub3JtYWwKK2RkbWF4NTIwIG1heCAgMC4wMDAxRS0zODMgICAgIDAgIC0+ICAgMUUtMzg3ICAgIFN1Ym5vcm1hbAorCitkZG1heDUzMCBtYXggLTEuMDBFLTM4MyAgICAgICAwICAtPiAgIDAKK2RkbWF4NTMxIG1heCAtMC4xRS0zODMgICAgICAgIDAgIC0+ICAgMAorZGRtYXg1MzIgbWF4IC0wLjEwRS0zODMgICAgICAgMCAgLT4gICAwCitkZG1heDUzMyBtYXggLTAuMTAwRS0zODMgICAgICAwICAtPiAgIDAKK2RkbWF4NTM0IG1heCAtMC4wMUUtMzgzICAgICAgIDAgIC0+ICAgMAorZGRtYXg1MzUgbWF4IC0wLjk5OUUtMzgzICAgICAgMCAgLT4gICAwCitkZG1heDUzNiBtYXggLTAuMDk5RS0zODMgICAgICAwICAtPiAgIDAKK2RkbWF4NTM3IG1heCAtMC4wMDlFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtYXg1MzggbWF4IC0wLjAwMUUtMzgzICAgICAgMCAgLT4gICAwCitkZG1heDUzOSBtYXggLTAuMDAwOUUtMzgzICAgICAwICAtPiAgIDAKK2RkbWF4NTQwIG1heCAtMC4wMDAxRS0zODMgICAgIDAgIC0+ICAgMAorCistLSBOdWxsIHRlc3RzCitkZG1heDkwMCBtYXggMTAgICMgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXg5MDEgbWF4ICAjIDEwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNYXhNYWcuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNYXhNYWcuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWMzZTkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE1heE1hZy5kZWNUZXN0CkBAIC0wLDAgKzEsMzA0IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkTWF4TWFnLmRlY1Rlc3QgLS0gZGVjRG91YmxlIG1heG51bW1hZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gd2UgYXNzdW1lIHRoYXQgYmFzZSBjb21wYXJpc29uIGlzIHRlc3RlZCBpbiBjb21wYXJlLmRlY1Rlc3QsIHNvCistLSB0aGVzZSBtYWlubHkgY292ZXIgc3BlY2lhbCBjYXNlcyBhbmQgcm91bmRpbmcKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkZG14ZzAwMSBtYXhtYWcgIC0yICAtMiAgLT4gLTIKK2RkbXhnMDAyIG1heG1hZyAgLTIgIC0xICAtPiAtMgorZGRteGcwMDMgbWF4bWFnICAtMiAgIDAgIC0+IC0yCitkZG14ZzAwNCBtYXhtYWcgIC0yICAgMSAgLT4gLTIKK2RkbXhnMDA1IG1heG1hZyAgLTIgICAyICAtPiAgMgorZGRteGcwMDYgbWF4bWFnICAtMSAgLTIgIC0+IC0yCitkZG14ZzAwNyBtYXhtYWcgIC0xICAtMSAgLT4gLTEKK2RkbXhnMDA4IG1heG1hZyAgLTEgICAwICAtPiAtMQorZGRteGcwMDkgbWF4bWFnICAtMSAgIDEgIC0+ICAxCitkZG14ZzAxMCBtYXhtYWcgIC0xICAgMiAgLT4gIDIKK2RkbXhnMDExIG1heG1hZyAgIDAgIC0yICAtPiAtMgorZGRteGcwMTIgbWF4bWFnICAgMCAgLTEgIC0+IC0xCitkZG14ZzAxMyBtYXhtYWcgICAwICAgMCAgLT4gIDAKK2RkbXhnMDE0IG1heG1hZyAgIDAgICAxICAtPiAgMQorZGRteGcwMTUgbWF4bWFnICAgMCAgIDIgIC0+ICAyCitkZG14ZzAxNiBtYXhtYWcgICAxICAtMiAgLT4gLTIKK2RkbXhnMDE3IG1heG1hZyAgIDEgIC0xICAtPiAgMQorZGRteGcwMTggbWF4bWFnICAgMSAgIDAgIC0+ICAxCitkZG14ZzAxOSBtYXhtYWcgICAxICAgMSAgLT4gIDEKK2RkbXhnMDIwIG1heG1hZyAgIDEgICAyICAtPiAgMgorZGRteGcwMjEgbWF4bWFnICAgMiAgLTIgIC0+ICAyCitkZG14ZzAyMiBtYXhtYWcgICAyICAtMSAgLT4gIDIKK2RkbXhnMDIzIG1heG1hZyAgIDIgICAwICAtPiAgMgorZGRteGcwMjUgbWF4bWFnICAgMiAgIDEgIC0+ICAyCitkZG14ZzAyNiBtYXhtYWcgICAyICAgMiAgLT4gIDIKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RkbXhnMDMwIG1heG1hZyAgIDAgICAgIDAgICAtPiAgMAorZGRteGcwMzEgbWF4bWFnICAgMCAgICAtMCAgIC0+ICAwCitkZG14ZzAzMiBtYXhtYWcgICAwICAgIC0wLjAgLT4gIDAKK2RkbXhnMDMzIG1heG1hZyAgIDAgICAgIDAuMCAtPiAgMAorZGRteGcwMzQgbWF4bWFnICAtMCAgICAgMCAgIC0+ICAwICAgIC0tIG5vdGU6IC0wID0gMCwgYnV0IDAgY2hvc2VuCitkZG14ZzAzNSBtYXhtYWcgIC0wICAgIC0wICAgLT4gLTAKK2RkbXhnMDM2IG1heG1hZyAgLTAgICAgLTAuMCAtPiAtMC4wCitkZG14ZzAzNyBtYXhtYWcgIC0wICAgICAwLjAgLT4gIDAuMAorZGRteGcwMzggbWF4bWFnICAgMC4wICAgMCAgIC0+ICAwCitkZG14ZzAzOSBtYXhtYWcgICAwLjAgIC0wICAgLT4gIDAuMAorZGRteGcwNDAgbWF4bWFnICAgMC4wICAtMC4wIC0+ICAwLjAKK2RkbXhnMDQxIG1heG1hZyAgIDAuMCAgIDAuMCAtPiAgMC4wCitkZG14ZzA0MiBtYXhtYWcgIC0wLjAgICAwICAgLT4gIDAKK2RkbXhnMDQzIG1heG1hZyAgLTAuMCAgLTAgICAtPiAtMC4wCitkZG14ZzA0NCBtYXhtYWcgIC0wLjAgIC0wLjAgLT4gLTAuMAorZGRteGcwNDUgbWF4bWFnICAtMC4wICAgMC4wIC0+ICAwLjAKKworZGRteGcwNTAgbWF4bWFnICAtMEUxICAgMEUxIC0+ICAwRSsxCitkZG14ZzA1MSBtYXhtYWcgIC0wRTIgICAwRTIgLT4gIDBFKzIKK2RkbXhnMDUyIG1heG1hZyAgLTBFMiAgIDBFMSAtPiAgMEUrMQorZGRteGcwNTMgbWF4bWFnICAtMEUxICAgMEUyIC0+ICAwRSsyCitkZG14ZzA1NCBtYXhtYWcgICAwRTEgIC0wRTEgLT4gIDBFKzEKK2RkbXhnMDU1IG1heG1hZyAgIDBFMiAgLTBFMiAtPiAgMEUrMgorZGRteGcwNTYgbWF4bWFnICAgMEUyICAtMEUxIC0+ICAwRSsyCitkZG14ZzA1NyBtYXhtYWcgICAwRTEgIC0wRTIgLT4gIDBFKzEKKworZGRteGcwNTggbWF4bWFnICAgMEUxICAgMEUxIC0+ICAwRSsxCitkZG14ZzA1OSBtYXhtYWcgICAwRTIgICAwRTIgLT4gIDBFKzIKK2RkbXhnMDYwIG1heG1hZyAgIDBFMiAgIDBFMSAtPiAgMEUrMgorZGRteGcwNjEgbWF4bWFnICAgMEUxICAgMEUyIC0+ICAwRSsyCitkZG14ZzA2MiBtYXhtYWcgIC0wRTEgIC0wRTEgLT4gLTBFKzEKK2RkbXhnMDYzIG1heG1hZyAgLTBFMiAgLTBFMiAtPiAtMEUrMgorZGRteGcwNjQgbWF4bWFnICAtMEUyICAtMEUxIC0+IC0wRSsxCitkZG14ZzA2NSBtYXhtYWcgIC0wRTEgIC0wRTIgLT4gLTBFKzEKKworLS0gU3BlY2lhbHMKK2RkbXhnMDkwIG1heG1hZyAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CitkZG14ZzA5MSBtYXhtYWcgIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZGRteGcwOTIgbWF4bWFnICBJbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RkbXhnMDkzIG1heG1hZyAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkZG14ZzA5NCBtYXhtYWcgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZGRteGcwOTUgbWF4bWFnICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2RkbXhnMDk2IG1heG1hZyAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkZG14ZzA5NyBtYXhtYWcgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRteGcwOTggbWF4bWFnIC0xMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbXhnMDk5IG1heG1hZyAtSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkZG14ZzEwMCBtYXhtYWcgLTEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRteGcxMDEgbWF4bWFnIC0wICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbXhnMTAyIG1heG1hZyAgMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitkZG14ZzEwMyBtYXhtYWcgIDEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRteGcxMDQgbWF4bWFnICAxMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbXhnMTA1IG1heG1hZyAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RkbXhnMTIwIG1heG1hZyAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkZG14ZzEyMSBtYXhtYWcgLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZGRteGcxMjIgbWF4bWFnIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2RkbXhnMTIzIG1heG1hZyAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkZG14ZzEyNCBtYXhtYWcgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZGRteGcxMjUgbWF4bWFnIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RkbXhnMTI2IG1heG1hZyAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkZG14ZzEyNyBtYXhtYWcgLUluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRteGcxMjggbWF4bWFnIC1JbmYgIC1JbmYgICAtPiAgLUluZmluaXR5CitkZG14ZzEyOSBtYXhtYWcgLTEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRteGcxMzAgbWF4bWFnIC0xICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbXhnMTMxIG1heG1hZyAtMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitkZG14ZzEzMiBtYXhtYWcgIDAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRteGcxMzMgbWF4bWFnICAxICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbXhnMTM0IG1heG1hZyAgMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitkZG14ZzEzNSBtYXhtYWcgIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorCistLSAyMDA0LjA4LjAyIDc1NHIgY2hvb3NlcyBudW1iZXIgb3ZlciBOYU4gaW4gbWl4ZWQgY2FzZXMKK2RkbXhnMTQxIG1heG1hZyAgTmFOIC1JbmYgICAgLT4gLUluZmluaXR5CitkZG14ZzE0MiBtYXhtYWcgIE5hTiAtMTAwMCAgIC0+IC0xMDAwCitkZG14ZzE0MyBtYXhtYWcgIE5hTiAtMSAgICAgIC0+IC0xCitkZG14ZzE0NCBtYXhtYWcgIE5hTiAtMCAgICAgIC0+IC0wCitkZG14ZzE0NSBtYXhtYWcgIE5hTiAgMCAgICAgIC0+ICAwCitkZG14ZzE0NiBtYXhtYWcgIE5hTiAgMSAgICAgIC0+ICAxCitkZG14ZzE0NyBtYXhtYWcgIE5hTiAgMTAwMCAgIC0+ICAxMDAwCitkZG14ZzE0OCBtYXhtYWcgIE5hTiAgSW5mICAgIC0+ICBJbmZpbml0eQorZGRteGcxNDkgbWF4bWFnICBOYU4gIE5hTiAgICAtPiAgTmFOCitkZG14ZzE1MCBtYXhtYWcgLUluZiAgTmFOICAgIC0+IC1JbmZpbml0eQorZGRteGcxNTEgbWF4bWFnIC0xMDAwIE5hTiAgICAtPiAtMTAwMAorZGRteGcxNTIgbWF4bWFnIC0xICAgIE5hTiAgICAtPiAtMQorZGRteGcxNTMgbWF4bWFnIC0wICAgIE5hTiAgICAtPiAtMAorZGRteGcxNTQgbWF4bWFnICAwICAgIE5hTiAgICAtPiAgMAorZGRteGcxNTUgbWF4bWFnICAxICAgIE5hTiAgICAtPiAgMQorZGRteGcxNTYgbWF4bWFnICAxMDAwIE5hTiAgICAtPiAgMTAwMAorZGRteGcxNTcgbWF4bWFnICBJbmYgIE5hTiAgICAtPiAgSW5maW5pdHkKKworZGRteGcxNjEgbWF4bWFnICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNjIgbWF4bWFnICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNjMgbWF4bWFnICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNjQgbWF4bWFnICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNjUgbWF4bWFnICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNjYgbWF4bWFnICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNjcgbWF4bWFnICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNjggbWF4bWFnICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNjkgbWF4bWFnICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNzAgbWF4bWFnICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNzEgbWF4bWFnIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNzIgbWF4bWFnIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNzMgbWF4bWFnIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNzQgbWF4bWFnIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNzUgbWF4bWFnICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNzYgbWF4bWFnICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNzcgbWF4bWFnICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNzggbWF4bWFnICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxNzkgbWF4bWFnICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZG14ZzE4MSBtYXhtYWcgIE5hTjkgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbXhnMTgyIG1heG1hZyAgTmFOOCAgICAgOSAgIC0+ICA5CitkZG14ZzE4MyBtYXhtYWcgLU5hTjcgICBJbmYgICAtPiAgSW5maW5pdHkKKworZGRteGcxODQgbWF4bWFnIC1OYU4xICAgTmFOMTEgLT4gLU5hTjEKK2RkbXhnMTg1IG1heG1hZyAgTmFOMiAgIE5hTjEyIC0+ICBOYU4yCitkZG14ZzE4NiBtYXhtYWcgLU5hTjEzIC1OYU43ICAtPiAtTmFOMTMKK2RkbXhnMTg3IG1heG1hZyAgTmFOMTQgLU5hTjUgIC0+ICBOYU4xNAorCitkZG14ZzE4OCBtYXhtYWcgLUluZiAgICBOYU40ICAtPiAtSW5maW5pdHkKK2RkbXhnMTg5IG1heG1hZyAtOSAgICAgLU5hTjMgIC0+IC05CitkZG14ZzE5MCBtYXhtYWcgIEluZiAgICBOYU4yICAtPiAgSW5maW5pdHkKKworZGRteGcxOTEgbWF4bWFnICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTkyIG1heG1hZyAgc05hTjk4IC0xICAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkZG14ZzE5MyBtYXhtYWcgLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxOTQgbWF4bWFnICBzTmFOOTYgc05hTjk0ICAtPiAgTmFOOTYgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTk1IG1heG1hZyAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkZG14ZzE5NiBtYXhtYWcgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxOTcgbWF4bWFnICAwICAgICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTk4IG1heG1hZyAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkZG14ZzE5OSBtYXhtYWcgIE5hTiAgICBzTmFOODkgIC0+ICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvbGQgcm91bmRpbmcgY2hlY2tzCitkZG14ZzIyMSBtYXhtYWcgMTIzNDU2NzgwMDAgMSAgLT4gMTIzNDU2NzgwMDAKK2RkbXhnMjIyIG1heG1hZyAxIDEyMzQ1Njc4MDAwICAtPiAxMjM0NTY3ODAwMAorZGRteGcyMjMgbWF4bWFnIDEyMzQ1Njc4MDAgIDEgIC0+IDEyMzQ1Njc4MDAKK2RkbXhnMjI0IG1heG1hZyAxIDEyMzQ1Njc4MDAgICAtPiAxMjM0NTY3ODAwCitkZG14ZzIyNSBtYXhtYWcgMTIzNDU2Nzg5MCAgMSAgLT4gMTIzNDU2Nzg5MAorZGRteGcyMjYgbWF4bWFnIDEgMTIzNDU2Nzg5MCAgIC0+IDEyMzQ1Njc4OTAKK2RkbXhnMjI3IG1heG1hZyAxMjM0NTY3ODkxICAxICAtPiAxMjM0NTY3ODkxCitkZG14ZzIyOCBtYXhtYWcgMSAxMjM0NTY3ODkxICAgLT4gMTIzNDU2Nzg5MQorZGRteGcyMjkgbWF4bWFnIDEyMzQ1Njc4OTAxIDEgIC0+IDEyMzQ1Njc4OTAxCitkZG14ZzIzMCBtYXhtYWcgMSAxMjM0NTY3ODkwMSAgLT4gMTIzNDU2Nzg5MDEKK2RkbXhnMjMxIG1heG1hZyAxMjM0NTY3ODk2ICAxICAtPiAxMjM0NTY3ODk2CitkZG14ZzIzMiBtYXhtYWcgMSAxMjM0NTY3ODk2ICAgLT4gMTIzNDU2Nzg5NgorZGRteGcyMzMgbWF4bWFnIC0xMjM0NTY3ODkxICAxIC0+IC0xMjM0NTY3ODkxCitkZG14ZzIzNCBtYXhtYWcgMSAtMTIzNDU2Nzg5MSAgLT4gLTEyMzQ1Njc4OTEKK2RkbXhnMjM1IG1heG1hZyAtMTIzNDU2Nzg5MDEgMSAtPiAtMTIzNDU2Nzg5MDEKK2RkbXhnMjM2IG1heG1hZyAxIC0xMjM0NTY3ODkwMSAtPiAtMTIzNDU2Nzg5MDEKK2RkbXhnMjM3IG1heG1hZyAtMTIzNDU2Nzg5NiAgMSAtPiAtMTIzNDU2Nzg5NgorZGRteGcyMzggbWF4bWFnIDEgLTEyMzQ1Njc4OTYgIC0+IC0xMjM0NTY3ODk2CisKKy0tIGZyb20gZXhhbXBsZXMKK2RkbXhnMjgwIG1heG1hZyAnMycgICAnMicgIC0+ICAnMycKK2RkbXhnMjgxIG1heG1hZyAnLTEwJyAnMycgIC0+ICAnLTEwJworZGRteGcyODIgbWF4bWFnICcxLjAnICcxJyAgLT4gICcxJworZGRteGcyODMgbWF4bWFnICcxJyAnMS4wJyAgLT4gICcxJworZGRteGcyODQgbWF4bWFnICc3JyAnTmFOJyAgLT4gICc3JworCistLSBleHBhbmRlZCBsaXN0IGZyb20gbWluL21heCA3NTRyIHB1cnBsZSBwcm9zZQorLS0gW2V4cGxpY2l0IHRlc3RzIGZvciBleHBvbmVudCBvcmRlcmluZ10KK2RkbXhnNDAxIG1heG1hZyAgSW5mICAgIDEuMSAgICAgLT4gIEluZmluaXR5CitkZG14ZzQwMiBtYXhtYWcgIDEuMSAgICAxICAgICAgIC0+ICAxLjEKK2RkbXhnNDAzIG1heG1hZyAgMSAgICAgIDEuMCAgICAgLT4gIDEKK2RkbXhnNDA0IG1heG1hZyAgMS4wICAgIDAuMSAgICAgLT4gIDEuMAorZGRteGc0MDUgbWF4bWFnICAwLjEgICAgMC4xMCAgICAtPiAgMC4xCitkZG14ZzQwNiBtYXhtYWcgIDAuMTAgICAwLjEwMCAgIC0+ICAwLjEwCitkZG14ZzQwNyBtYXhtYWcgIDAuMTAgICAwICAgICAgIC0+ICAwLjEwCitkZG14ZzQwOCBtYXhtYWcgIDAgICAgICAwLjAgICAgIC0+ICAwCitkZG14ZzQwOSBtYXhtYWcgIDAuMCAgIC0wICAgICAgIC0+ICAwLjAKK2RkbXhnNDEwIG1heG1hZyAgMC4wICAgLTAuMCAgICAgLT4gIDAuMAorZGRteGc0MTEgbWF4bWFnICAwLjAwICAtMC4wICAgICAtPiAgMC4wMAorZGRteGc0MTIgbWF4bWFnICAwLjAgICAtMC4wMCAgICAtPiAgMC4wCitkZG14ZzQxMyBtYXhtYWcgIDAgICAgIC0wLjAgICAgIC0+ICAwCitkZG14ZzQxNCBtYXhtYWcgIDAgICAgIC0wICAgICAgIC0+ICAwCitkZG14ZzQxNSBtYXhtYWcgLTAuMCAgIC0wICAgICAgIC0+IC0wLjAKK2RkbXhnNDE2IG1heG1hZyAtMCAgICAgLTAuMTAwICAgLT4gLTAuMTAwCitkZG14ZzQxNyBtYXhtYWcgLTAuMTAwIC0wLjEwICAgIC0+IC0wLjEwMAorZGRteGc0MTggbWF4bWFnIC0wLjEwICAtMC4xICAgICAtPiAtMC4xMAorZGRteGc0MTkgbWF4bWFnIC0wLjEgICAtMS4wICAgICAtPiAtMS4wCitkZG14ZzQyMCBtYXhtYWcgLTEuMCAgIC0xICAgICAgIC0+IC0xLjAKK2RkbXhnNDIxIG1heG1hZyAtMSAgICAgLTEuMSAgICAgLT4gLTEuMQorZGRteGc0MjMgbWF4bWFnIC0xLjEgICAtSW5mICAgICAtPiAtSW5maW5pdHkKKy0tIHNhbWUgd2l0aCBvcGVyYW5kcyByZXZlcnNlZAorZGRteGc0MzEgbWF4bWFnICAxLjEgICAgSW5mICAgICAtPiAgSW5maW5pdHkKK2RkbXhnNDMyIG1heG1hZyAgMSAgICAgIDEuMSAgICAgLT4gIDEuMQorZGRteGc0MzMgbWF4bWFnICAxLjAgICAgMSAgICAgICAtPiAgMQorZGRteGc0MzQgbWF4bWFnICAwLjEgICAgMS4wICAgICAtPiAgMS4wCitkZG14ZzQzNSBtYXhtYWcgIDAuMTAgICAwLjEgICAgIC0+ICAwLjEKK2RkbXhnNDM2IG1heG1hZyAgMC4xMDAgIDAuMTAgICAgLT4gIDAuMTAKK2RkbXhnNDM3IG1heG1hZyAgMCAgICAgIDAuMTAgICAgLT4gIDAuMTAKK2RkbXhnNDM4IG1heG1hZyAgMC4wICAgIDAgICAgICAgLT4gIDAKK2RkbXhnNDM5IG1heG1hZyAtMCAgICAgIDAuMCAgICAgLT4gIDAuMAorZGRteGc0NDAgbWF4bWFnIC0wLjAgICAgMC4wICAgICAtPiAgMC4wCitkZG14ZzQ0MSBtYXhtYWcgLTAuMCAgICAwLjAwICAgIC0+ICAwLjAwCitkZG14ZzQ0MiBtYXhtYWcgLTAuMDAgICAwLjAgICAgIC0+ICAwLjAKK2RkbXhnNDQzIG1heG1hZyAtMC4wICAgIDAgICAgICAgLT4gIDAKK2RkbXhnNDQ0IG1heG1hZyAtMCAgICAgIDAgICAgICAgLT4gIDAKK2RkbXhnNDQ1IG1heG1hZyAtMCAgICAgLTAuMCAgICAgLT4gLTAuMAorZGRteGc0NDYgbWF4bWFnIC0wLjEwMCAtMCAgICAgICAtPiAtMC4xMDAKK2RkbXhnNDQ3IG1heG1hZyAtMC4xMCAgLTAuMTAwICAgLT4gLTAuMTAwCitkZG14ZzQ0OCBtYXhtYWcgLTAuMSAgIC0wLjEwICAgIC0+IC0wLjEwCitkZG14ZzQ0OSBtYXhtYWcgLTEuMCAgIC0wLjEgICAgIC0+IC0xLjAKK2RkbXhnNDUwIG1heG1hZyAtMSAgICAgLTEuMCAgICAgLT4gLTEuMAorZGRteGc0NTEgbWF4bWFnIC0xLjEgICAtMSAgICAgICAtPiAtMS4xCitkZG14ZzQ1MyBtYXhtYWcgLUluZiAgIC0xLjEgICAgIC0+IC1JbmZpbml0eQorLS0gbGFyZ2llcworZGRteGc0NjAgbWF4bWFnICAxMDAwICAgMUUrMyAgICAtPiAgMUUrMworZGRteGc0NjEgbWF4bWFnICAxRSszICAgMTAwMCAgICAtPiAgMUUrMworZGRteGc0NjIgbWF4bWFnICAxMDAwICAtMUUrMyAgICAtPiAgMTAwMAorZGRteGc0NjMgbWF4bWFnICAxRSszICAtMTAwMCAgICAtPiAgMUUrMworZGRteGc0NjQgbWF4bWFnIC0xMDAwICAgMUUrMyAgICAtPiAgMUUrMworZGRteGc0NjUgbWF4bWFnIC0xRSszICAgMTAwMCAgICAtPiAgMTAwMAorZGRteGc0NjYgbWF4bWFnIC0xMDAwICAtMUUrMyAgICAtPiAtMTAwMAorZGRteGc0NjcgbWF4bWFnIC0xRSszICAtMTAwMCAgICAtPiAtMTAwMAorCistLSBzdWJub3JtYWxzCitkZG14ZzUxMCBtYXhtYWcgIDEuMDBFLTM4MyAgICAgICAwICAtPiAgIDEuMDBFLTM4MworZGRteGc1MTEgbWF4bWFnICAwLjFFLTM4MyAgICAgICAgMCAgLT4gICAxRS0zODQgICAgU3Vibm9ybWFsCitkZG14ZzUxMiBtYXhtYWcgIDAuMTBFLTM4MyAgICAgICAwICAtPiAgIDEuMEUtMzg0ICBTdWJub3JtYWwKK2RkbXhnNTEzIG1heG1hZyAgMC4xMDBFLTM4MyAgICAgIDAgIC0+ICAgMS4wMEUtMzg0IFN1Ym5vcm1hbAorZGRteGc1MTQgbWF4bWFnICAwLjAxRS0zODMgICAgICAgMCAgLT4gICAxRS0zODUgICAgU3Vibm9ybWFsCitkZG14ZzUxNSBtYXhtYWcgIDAuOTk5RS0zODMgICAgICAwICAtPiAgIDkuOTlFLTM4NCBTdWJub3JtYWwKK2RkbXhnNTE2IG1heG1hZyAgMC4wOTlFLTM4MyAgICAgIDAgIC0+ICAgOS45RS0zODUgIFN1Ym5vcm1hbAorZGRteGc1MTcgbWF4bWFnICAwLjAwOUUtMzgzICAgICAgMCAgLT4gICA5RS0zODYgICAgU3Vibm9ybWFsCitkZG14ZzUxOCBtYXhtYWcgIDAuMDAxRS0zODMgICAgICAwICAtPiAgIDFFLTM4NiAgICBTdWJub3JtYWwKK2RkbXhnNTE5IG1heG1hZyAgMC4wMDA5RS0zODMgICAgIDAgIC0+ICAgOUUtMzg3ICAgIFN1Ym5vcm1hbAorZGRteGc1MjAgbWF4bWFnICAwLjAwMDFFLTM4MyAgICAgMCAgLT4gICAxRS0zODcgICAgU3Vibm9ybWFsCisKK2RkbXhnNTMwIG1heG1hZyAtMS4wMEUtMzgzICAgICAgIDAgIC0+ICAtMS4wMEUtMzgzCitkZG14ZzUzMSBtYXhtYWcgLTAuMUUtMzgzICAgICAgICAwICAtPiAgLTFFLTM4NCAgICBTdWJub3JtYWwKK2RkbXhnNTMyIG1heG1hZyAtMC4xMEUtMzgzICAgICAgIDAgIC0+ICAtMS4wRS0zODQgIFN1Ym5vcm1hbAorZGRteGc1MzMgbWF4bWFnIC0wLjEwMEUtMzgzICAgICAgMCAgLT4gIC0xLjAwRS0zODQgU3Vibm9ybWFsCitkZG14ZzUzNCBtYXhtYWcgLTAuMDFFLTM4MyAgICAgICAwICAtPiAgLTFFLTM4NSAgICBTdWJub3JtYWwKK2RkbXhnNTM1IG1heG1hZyAtMC45OTlFLTM4MyAgICAgIDAgIC0+ICAtOS45OUUtMzg0IFN1Ym5vcm1hbAorZGRteGc1MzYgbWF4bWFnIC0wLjA5OUUtMzgzICAgICAgMCAgLT4gIC05LjlFLTM4NSAgU3Vibm9ybWFsCitkZG14ZzUzNyBtYXhtYWcgLTAuMDA5RS0zODMgICAgICAwICAtPiAgLTlFLTM4NiAgICBTdWJub3JtYWwKK2RkbXhnNTM4IG1heG1hZyAtMC4wMDFFLTM4MyAgICAgIDAgIC0+ICAtMUUtMzg2ICAgIFN1Ym5vcm1hbAorZGRteGc1MzkgbWF4bWFnIC0wLjAwMDlFLTM4MyAgICAgMCAgLT4gIC05RS0zODcgICAgU3Vibm9ybWFsCitkZG14ZzU0MCBtYXhtYWcgLTAuMDAwMUUtMzgzICAgICAwICAtPiAgLTFFLTM4NyAgICBTdWJub3JtYWwKKworLS0gTnVsbCB0ZXN0cworZGRteGc5MDAgbWF4bWFnIDEwICAjICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnOTAxIG1heG1hZyAgIyAxMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNaW4uZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNaW4uZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjk0MmZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE1pbi5kZWNUZXN0CkBAIC0wLDAgKzEsMzA5IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkTWluLmRlY1Rlc3QgLS0gZGVjRG91YmxlIG1pbm51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gd2UgYXNzdW1lIHRoYXQgYmFzZSBjb21wYXJpc29uIGlzIHRlc3RlZCBpbiBjb21wYXJlLmRlY1Rlc3QsIHNvCistLSB0aGVzZSBtYWlubHkgY292ZXIgc3BlY2lhbCBjYXNlcyBhbmQgcm91bmRpbmcKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkZG1pbjAwMSBtaW4gIC0yICAtMiAgLT4gLTIKK2RkbWluMDAyIG1pbiAgLTIgIC0xICAtPiAtMgorZGRtaW4wMDMgbWluICAtMiAgIDAgIC0+IC0yCitkZG1pbjAwNCBtaW4gIC0yICAgMSAgLT4gLTIKK2RkbWluMDA1IG1pbiAgLTIgICAyICAtPiAtMgorZGRtaW4wMDYgbWluICAtMSAgLTIgIC0+IC0yCitkZG1pbjAwNyBtaW4gIC0xICAtMSAgLT4gLTEKK2RkbWluMDA4IG1pbiAgLTEgICAwICAtPiAtMQorZGRtaW4wMDkgbWluICAtMSAgIDEgIC0+IC0xCitkZG1pbjAxMCBtaW4gIC0xICAgMiAgLT4gLTEKK2RkbWluMDExIG1pbiAgIDAgIC0yICAtPiAtMgorZGRtaW4wMTIgbWluICAgMCAgLTEgIC0+IC0xCitkZG1pbjAxMyBtaW4gICAwICAgMCAgLT4gIDAKK2RkbWluMDE0IG1pbiAgIDAgICAxICAtPiAgMAorZGRtaW4wMTUgbWluICAgMCAgIDIgIC0+ICAwCitkZG1pbjAxNiBtaW4gICAxICAtMiAgLT4gLTIKK2RkbWluMDE3IG1pbiAgIDEgIC0xICAtPiAtMQorZGRtaW4wMTggbWluICAgMSAgIDAgIC0+ICAwCitkZG1pbjAxOSBtaW4gICAxICAgMSAgLT4gIDEKK2RkbWluMDIwIG1pbiAgIDEgICAyICAtPiAgMQorZGRtaW4wMjEgbWluICAgMiAgLTIgIC0+IC0yCitkZG1pbjAyMiBtaW4gICAyICAtMSAgLT4gLTEKK2RkbWluMDIzIG1pbiAgIDIgICAwICAtPiAgMAorZGRtaW4wMjUgbWluICAgMiAgIDEgIC0+ICAxCitkZG1pbjAyNiBtaW4gICAyICAgMiAgLT4gIDIKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RkbWluMDMwIG1pbiAgIDAgICAgIDAgICAtPiAgMAorZGRtaW4wMzEgbWluICAgMCAgICAtMCAgIC0+IC0wCitkZG1pbjAzMiBtaW4gICAwICAgIC0wLjAgLT4gLTAuMAorZGRtaW4wMzMgbWluICAgMCAgICAgMC4wIC0+ICAwLjAKK2RkbWluMDM0IG1pbiAgLTAgICAgIDAgICAtPiAtMAorZGRtaW4wMzUgbWluICAtMCAgICAtMCAgIC0+IC0wCitkZG1pbjAzNiBtaW4gIC0wICAgIC0wLjAgLT4gLTAKK2RkbWluMDM3IG1pbiAgLTAgICAgIDAuMCAtPiAtMAorZGRtaW4wMzggbWluICAgMC4wICAgMCAgIC0+ICAwLjAKK2RkbWluMDM5IG1pbiAgIDAuMCAgLTAgICAtPiAtMAorZGRtaW4wNDAgbWluICAgMC4wICAtMC4wIC0+IC0wLjAKK2RkbWluMDQxIG1pbiAgIDAuMCAgIDAuMCAtPiAgMC4wCitkZG1pbjA0MiBtaW4gIC0wLjAgICAwICAgLT4gLTAuMAorZGRtaW4wNDMgbWluICAtMC4wICAtMCAgIC0+IC0wCitkZG1pbjA0NCBtaW4gIC0wLjAgIC0wLjAgLT4gLTAuMAorZGRtaW4wNDUgbWluICAtMC4wICAgMC4wIC0+IC0wLjAKKworZGRtaW4wNDYgbWluICAgMEUxICAtMEUxIC0+IC0wRSsxCitkZG1pbjA0NyBtaW4gIC0wRTEgICAwRTIgLT4gLTBFKzEKK2RkbWluMDQ4IG1pbiAgIDBFMiAgIDBFMSAtPiAgMEUrMQorZGRtaW4wNDkgbWluICAgMEUxICAgMEUyIC0+ICAwRSsxCitkZG1pbjA1MCBtaW4gIC0wRTMgIC0wRTIgLT4gLTBFKzMKK2RkbWluMDUxIG1pbiAgLTBFMiAgLTBFMyAtPiAtMEUrMworCistLSBTcGVjaWFscworZGRtaW4wOTAgbWluICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbWluMDkxIG1pbiAgSW5mICAtMTAwMCAgLT4gLTEwMDAKK2RkbWluMDkyIG1pbiAgSW5mICAtMSAgICAgLT4gLTEKK2RkbWluMDkzIG1pbiAgSW5mICAtMCAgICAgLT4gLTAKK2RkbWluMDk0IG1pbiAgSW5mICAgMCAgICAgLT4gIDAKK2RkbWluMDk1IG1pbiAgSW5mICAgMSAgICAgLT4gIDEKK2RkbWluMDk2IG1pbiAgSW5mICAgMTAwMCAgLT4gIDEwMDAKK2RkbWluMDk3IG1pbiAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkZG1pbjA5OCBtaW4gLTEwMDAgIEluZiAgIC0+IC0xMDAwCitkZG1pbjA5OSBtaW4gLUluZiAgIEluZiAgIC0+IC1JbmZpbml0eQorZGRtaW4xMDAgbWluIC0xICAgICBJbmYgICAtPiAtMQorZGRtaW4xMDEgbWluIC0wICAgICBJbmYgICAtPiAtMAorZGRtaW4xMDIgbWluICAwICAgICBJbmYgICAtPiAgMAorZGRtaW4xMDMgbWluICAxICAgICBJbmYgICAtPiAgMQorZGRtaW4xMDQgbWluICAxMDAwICBJbmYgICAtPiAgMTAwMAorZGRtaW4xMDUgbWluICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZGRtaW4xMjAgbWluIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbWluMTIxIG1pbiAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkZG1pbjEyMiBtaW4gLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZGRtaW4xMjMgbWluIC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2RkbWluMTI0IG1pbiAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitkZG1pbjEyNSBtaW4gLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZGRtaW4xMjYgbWluIC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2RkbWluMTI3IG1pbiAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitkZG1pbjEyOCBtaW4gLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRtaW4xMjkgbWluIC0xMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbWluMTMwIG1pbiAtMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkZG1pbjEzMSBtaW4gLTAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRtaW4xMzIgbWluICAwICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbWluMTMzIG1pbiAgMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkZG1pbjEzNCBtaW4gIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRtaW4xMzUgbWluICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKKworLS0gMjAwNC4wOC4wMiA3NTRyIGNob29zZXMgbnVtYmVyIG92ZXIgTmFOIGluIG1peGVkIGNhc2VzCitkZG1pbjE0MSBtaW4gIE5hTiAtSW5mICAgIC0+ICAtSW5maW5pdHkKK2RkbWluMTQyIG1pbiAgTmFOIC0xMDAwICAgLT4gIC0xMDAwCitkZG1pbjE0MyBtaW4gIE5hTiAtMSAgICAgIC0+ICAtMQorZGRtaW4xNDQgbWluICBOYU4gLTAgICAgICAtPiAgLTAKK2RkbWluMTQ1IG1pbiAgTmFOICAwICAgICAgLT4gIDAKK2RkbWluMTQ2IG1pbiAgTmFOICAxICAgICAgLT4gIDEKK2RkbWluMTQ3IG1pbiAgTmFOICAxMDAwICAgLT4gIDEwMDAKK2RkbWluMTQ4IG1pbiAgTmFOICBJbmYgICAgLT4gIEluZmluaXR5CitkZG1pbjE0OSBtaW4gIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RkbWluMTUwIG1pbiAtSW5mICBOYU4gICAgLT4gLUluZmluaXR5CitkZG1pbjE1MSBtaW4gLTEwMDAgTmFOICAgIC0+IC0xMDAwCitkZG1pbjE1MiBtaW4gLTEgICAtTmFOICAgIC0+IC0xCitkZG1pbjE1MyBtaW4gLTAgICAgTmFOICAgIC0+IC0wCitkZG1pbjE1NCBtaW4gIDAgICAtTmFOICAgIC0+ICAwCitkZG1pbjE1NSBtaW4gIDEgICAgTmFOICAgIC0+ICAxCitkZG1pbjE1NiBtaW4gIDEwMDAgTmFOICAgIC0+ICAxMDAwCitkZG1pbjE1NyBtaW4gIEluZiAgTmFOICAgIC0+ICBJbmZpbml0eQorCitkZG1pbjE2MSBtaW4gIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE2MiBtaW4gIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE2MyBtaW4gIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE2NCBtaW4gIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE2NSBtaW4gLXNOYU4gIDAgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE2NiBtaW4gLXNOYU4gIDEgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE2NyBtaW4gIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE2OCBtaW4gIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE2OSBtaW4gIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE3MCBtaW4gIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE3MSBtaW4gLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE3MiBtaW4gLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE3MyBtaW4gLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE3NCBtaW4gLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE3NSBtaW4gIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE3NiBtaW4gIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE3NyBtaW4gIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE3OCBtaW4gIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE3OSBtaW4gIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RkbWluMTgxIG1pbiAgTmFOOSAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbWluMTgyIG1pbiAtTmFOOCAgICA5OTkwICAtPiAgOTk5MAorZGRtaW4xODMgbWluICBOYU43MSAgIEluZiAgIC0+ICBJbmZpbml0eQorCitkZG1pbjE4NCBtaW4gIE5hTjEgICAgTmFONTQgLT4gIE5hTjEKK2RkbWluMTg1IG1pbiAgTmFOMjIgIC1OYU41MyAtPiAgTmFOMjIKK2RkbWluMTg2IG1pbiAtTmFOMyAgICBOYU42ICAtPiAtTmFOMworZGRtaW4xODcgbWluIC1OYU40NCAgIE5hTjcgIC0+IC1OYU40NAorCitkZG1pbjE4OCBtaW4gLUluZiAgICAgTmFONDEgLT4gLUluZmluaXR5CitkZG1pbjE4OSBtaW4gLTk5OTkgICAtTmFOMzMgLT4gLTk5OTkKK2RkbWluMTkwIG1pbiAgSW5mICAgICBOYU4yICAtPiAgSW5maW5pdHkKKworZGRtaW4xOTEgbWluICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RkbWluMTkyIG1pbiAgc05hTjk4IC0xMSAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE5MyBtaW4gLXNOYU45NyAgTmFOOCAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xOTQgbWluICBzTmFONjkgc05hTjk0ICAtPiAgTmFONjkgSW52YWxpZF9vcGVyYXRpb24KK2RkbWluMTk1IG1pbiAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE5NiBtaW4gLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xOTcgbWluICAwODggICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RkbWluMTk4IG1pbiAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE5OSBtaW4gIE5hTiAgICBzTmFOODYgIC0+ICBOYU44NiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvbGQgcm91bmRpbmcgY2hlY2tzCitkZG1pbjIyMSBtaW4gLTEyMzQ1Njc4MDAwIDEgIC0+IC0xMjM0NTY3ODAwMAorZGRtaW4yMjIgbWluIDEgLTEyMzQ1Njc4MDAwICAtPiAtMTIzNDU2NzgwMDAKK2RkbWluMjIzIG1pbiAtMTIzNDU2NzgwMCAgMSAgLT4gLTEyMzQ1Njc4MDAKK2RkbWluMjI0IG1pbiAxIC0xMjM0NTY3ODAwICAgLT4gLTEyMzQ1Njc4MDAKK2RkbWluMjI1IG1pbiAtMTIzNDU2Nzg5MCAgMSAgLT4gLTEyMzQ1Njc4OTAKK2RkbWluMjI2IG1pbiAxIC0xMjM0NTY3ODkwICAgLT4gLTEyMzQ1Njc4OTAKK2RkbWluMjI3IG1pbiAtMTIzNDU2Nzg5MSAgMSAgLT4gLTEyMzQ1Njc4OTEKK2RkbWluMjI4IG1pbiAxIC0xMjM0NTY3ODkxICAgLT4gLTEyMzQ1Njc4OTEKK2RkbWluMjI5IG1pbiAtMTIzNDU2Nzg5MDEgMSAgLT4gLTEyMzQ1Njc4OTAxCitkZG1pbjIzMCBtaW4gMSAtMTIzNDU2Nzg5MDEgIC0+IC0xMjM0NTY3ODkwMQorZGRtaW4yMzEgbWluIC0xMjM0NTY3ODk2ICAxICAtPiAtMTIzNDU2Nzg5NgorZGRtaW4yMzIgbWluIDEgLTEyMzQ1Njc4OTYgICAtPiAtMTIzNDU2Nzg5NgorZGRtaW4yMzMgbWluIDEyMzQ1Njc4OTEgIDEgICAtPiAxCitkZG1pbjIzNCBtaW4gMSAxMjM0NTY3ODkxICAgIC0+IDEKK2RkbWluMjM1IG1pbiAxMjM0NTY3ODkwMSAxICAgLT4gMQorZGRtaW4yMzYgbWluIDEgMTIzNDU2Nzg5MDEgICAtPiAxCitkZG1pbjIzNyBtaW4gMTIzNDU2Nzg5NiAgMSAgIC0+IDEKK2RkbWluMjM4IG1pbiAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCistLSBmcm9tIGV4YW1wbGVzCitkZG1pbjI4MCBtaW4gJzMnICAgJzInICAtPiAgJzInCitkZG1pbjI4MSBtaW4gJy0xMCcgJzMnICAtPiAgJy0xMCcKK2RkbWluMjgyIG1pbiAnMS4wJyAnMScgIC0+ICAnMS4wJworZGRtaW4yODMgbWluICcxJyAnMS4wJyAgLT4gICcxLjAnCitkZG1pbjI4NCBtaW4gJzcnICdOYU4nICAtPiAgJzcnCisKKy0tIGV4cGFuZGVkIGxpc3QgZnJvbSBtaW4vbWF4IDc1NHIgcHVycGxlIHByb3NlCistLSBbZXhwbGljaXQgdGVzdHMgZm9yIGV4cG9uZW50IG9yZGVyaW5nXQorZGRtaW40MDEgbWluICBJbmYgICAgMS4xICAgICAtPiAgMS4xCitkZG1pbjQwMiBtaW4gIDEuMSAgICAxICAgICAgIC0+ICAxCitkZG1pbjQwMyBtaW4gIDEgICAgICAxLjAgICAgIC0+ICAxLjAKK2RkbWluNDA0IG1pbiAgMS4wICAgIDAuMSAgICAgLT4gIDAuMQorZGRtaW40MDUgbWluICAwLjEgICAgMC4xMCAgICAtPiAgMC4xMAorZGRtaW40MDYgbWluICAwLjEwICAgMC4xMDAgICAtPiAgMC4xMDAKK2RkbWluNDA3IG1pbiAgMC4xMCAgIDAgICAgICAgLT4gIDAKK2RkbWluNDA4IG1pbiAgMCAgICAgIDAuMCAgICAgLT4gIDAuMAorZGRtaW40MDkgbWluICAwLjAgICAtMCAgICAgICAtPiAtMAorZGRtaW40MTAgbWluICAwLjAgICAtMC4wICAgICAtPiAtMC4wCitkZG1pbjQxMSBtaW4gIDAuMDAgIC0wLjAgICAgIC0+IC0wLjAKK2RkbWluNDEyIG1pbiAgMC4wICAgLTAuMDAgICAgLT4gLTAuMDAKK2RkbWluNDEzIG1pbiAgMCAgICAgLTAuMCAgICAgLT4gLTAuMAorZGRtaW40MTQgbWluICAwICAgICAtMCAgICAgICAtPiAtMAorZGRtaW40MTUgbWluIC0wLjAgICAtMCAgICAgICAtPiAtMAorZGRtaW40MTYgbWluIC0wICAgICAtMC4xMDAgICAtPiAtMC4xMDAKK2RkbWluNDE3IG1pbiAtMC4xMDAgLTAuMTAgICAgLT4gLTAuMTAKK2RkbWluNDE4IG1pbiAtMC4xMCAgLTAuMSAgICAgLT4gLTAuMQorZGRtaW40MTkgbWluIC0wLjEgICAtMS4wICAgICAtPiAtMS4wCitkZG1pbjQyMCBtaW4gLTEuMCAgIC0xICAgICAgIC0+IC0xCitkZG1pbjQyMSBtaW4gLTEgICAgIC0xLjEgICAgIC0+IC0xLjEKK2RkbWluNDIzIG1pbiAtMS4xICAgLUluZiAgICAgLT4gLUluZmluaXR5CistLSBzYW1lIHdpdGggb3BlcmFuZHMgcmV2ZXJzZWQKK2RkbWluNDMxIG1pbiAgMS4xICAgIEluZiAgICAgLT4gIDEuMQorZGRtaW40MzIgbWluICAxICAgICAgMS4xICAgICAtPiAgMQorZGRtaW40MzMgbWluICAxLjAgICAgMSAgICAgICAtPiAgMS4wCitkZG1pbjQzNCBtaW4gIDAuMSAgICAxLjAgICAgIC0+ICAwLjEKK2RkbWluNDM1IG1pbiAgMC4xMCAgIDAuMSAgICAgLT4gIDAuMTAKK2RkbWluNDM2IG1pbiAgMC4xMDAgIDAuMTAgICAgLT4gIDAuMTAwCitkZG1pbjQzNyBtaW4gIDAgICAgICAwLjEwICAgIC0+ICAwCitkZG1pbjQzOCBtaW4gIDAuMCAgICAwICAgICAgIC0+ICAwLjAKK2RkbWluNDM5IG1pbiAtMCAgICAgIDAuMCAgICAgLT4gLTAKK2RkbWluNDQwIG1pbiAtMC4wICAgIDAuMCAgICAgLT4gLTAuMAorZGRtaW40NDEgbWluIC0wLjAgICAgMC4wMCAgICAtPiAtMC4wCitkZG1pbjQ0MiBtaW4gLTAuMDAgICAwLjAgICAgIC0+IC0wLjAwCitkZG1pbjQ0MyBtaW4gLTAuMCAgICAwICAgICAgIC0+IC0wLjAKK2RkbWluNDQ0IG1pbiAtMCAgICAgIDAgICAgICAgLT4gLTAKK2RkbWluNDQ1IG1pbiAtMCAgICAgLTAuMCAgICAgLT4gLTAKK2RkbWluNDQ2IG1pbiAtMC4xMDAgLTAgICAgICAgLT4gLTAuMTAwCitkZG1pbjQ0NyBtaW4gLTAuMTAgIC0wLjEwMCAgIC0+IC0wLjEwCitkZG1pbjQ0OCBtaW4gLTAuMSAgIC0wLjEwICAgIC0+IC0wLjEKK2RkbWluNDQ5IG1pbiAtMS4wICAgLTAuMSAgICAgLT4gLTEuMAorZGRtaW40NTAgbWluIC0xICAgICAtMS4wICAgICAtPiAtMQorZGRtaW40NTEgbWluIC0xLjEgICAtMSAgICAgICAtPiAtMS4xCitkZG1pbjQ1MyBtaW4gLUluZiAgIC0xLjEgICAgIC0+IC1JbmZpbml0eQorLS0gbGFyZ2llcworZGRtaW40NjAgbWluICAxMDAwICAgMUUrMyAgICAtPiAgMTAwMAorZGRtaW40NjEgbWluICAxRSszICAgMTAwMCAgICAtPiAgMTAwMAorZGRtaW40NjIgbWluICAxMDAwICAtMUUrMyAgICAtPiAtMUUrMworZGRtaW40NjMgbWluICAxRSszICAtMzg0ICAgIC0+IC0zODQKK2RkbWluNDY0IG1pbiAtMzg0ICAgMUUrMyAgICAtPiAtMzg0CitkZG1pbjQ2NSBtaW4gLTFFKzMgICAxMDAwICAgIC0+IC0xRSszCitkZG1pbjQ2NiBtaW4gLTM4NCAgLTFFKzMgICAgLT4gLTFFKzMKK2RkbWluNDY3IG1pbiAtMUUrMyAgLTM4NCAgICAtPiAtMUUrMworCistLSBtaXNhbGlnbm1lbnQgdHJhcHMgZm9yIGxpdHRsZS1lbmRpYW4KK2RkbWluNDcxIG1pbiAgICAgIDEuMCAgICAgICAwLjEgIC0+IDAuMQorZGRtaW40NzIgbWluICAgICAgMC4xICAgICAgIDEuMCAgLT4gMC4xCitkZG1pbjQ3MyBtaW4gICAgIDEwLjAgICAgICAgMC4xICAtPiAwLjEKK2RkbWluNDc0IG1pbiAgICAgIDAuMSAgICAgIDEwLjAgIC0+IDAuMQorZGRtaW40NzUgbWluICAgICAgMTAwICAgICAgIDEuMCAgLT4gMS4wCitkZG1pbjQ3NiBtaW4gICAgICAxLjAgICAgICAgMTAwICAtPiAxLjAKK2RkbWluNDc3IG1pbiAgICAgMTAwMCAgICAgIDEwLjAgIC0+IDEwLjAKK2RkbWluNDc4IG1pbiAgICAgMTAuMCAgICAgIDEwMDAgIC0+IDEwLjAKK2RkbWluNDc5IG1pbiAgICAxMDAwMCAgICAgMTAwLjAgIC0+IDEwMC4wCitkZG1pbjQ4MCBtaW4gICAgMTAwLjAgICAgIDEwMDAwICAtPiAxMDAuMAorZGRtaW40ODEgbWluICAgMTAwMDAwICAgIDEwMDAuMCAgLT4gMTAwMC4wCitkZG1pbjQ4MiBtaW4gICAxMDAwLjAgICAgMTAwMDAwICAtPiAxMDAwLjAKK2RkbWluNDgzIG1pbiAgMTAwMDAwMCAgIDEwMDAwLjAgIC0+IDEwMDAwLjAKK2RkbWluNDg0IG1pbiAgMTAwMDAuMCAgIDEwMDAwMDAgIC0+IDEwMDAwLjAKKworLS0gc3Vibm9ybWFscworZGRtaW41MTAgbWluICAxLjAwRS0zODMgICAgICAgMCAgLT4gICAwCitkZG1pbjUxMSBtaW4gIDAuMUUtMzgzICAgICAgICAwICAtPiAgIDAKK2RkbWluNTEyIG1pbiAgMC4xMEUtMzgzICAgICAgIDAgIC0+ICAgMAorZGRtaW41MTMgbWluICAwLjEwMEUtMzgzICAgICAgMCAgLT4gICAwCitkZG1pbjUxNCBtaW4gIDAuMDFFLTM4MyAgICAgICAwICAtPiAgIDAKK2RkbWluNTE1IG1pbiAgMC45OTlFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtaW41MTYgbWluICAwLjA5OUUtMzgzICAgICAgMCAgLT4gICAwCitkZG1pbjUxNyBtaW4gIDAuMDA5RS0zODMgICAgICAwICAtPiAgIDAKK2RkbWluNTE4IG1pbiAgMC4wMDFFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtaW41MTkgbWluICAwLjAwMDlFLTM4MyAgICAgMCAgLT4gICAwCitkZG1pbjUyMCBtaW4gIDAuMDAwMUUtMzgzICAgICAwICAtPiAgIDAKKworZGRtaW41MzAgbWluIC0xLjAwRS0zODMgICAgICAgMCAgLT4gIC0xLjAwRS0zODMKK2RkbWluNTMxIG1pbiAtMC4xRS0zODMgICAgICAgIDAgIC0+ICAtMUUtMzg0ICAgIFN1Ym5vcm1hbAorZGRtaW41MzIgbWluIC0wLjEwRS0zODMgICAgICAgMCAgLT4gIC0xLjBFLTM4NCAgU3Vibm9ybWFsCitkZG1pbjUzMyBtaW4gLTAuMTAwRS0zODMgICAgICAwICAtPiAgLTEuMDBFLTM4NCBTdWJub3JtYWwKK2RkbWluNTM0IG1pbiAtMC4wMUUtMzgzICAgICAgIDAgIC0+ICAtMUUtMzg1ICAgIFN1Ym5vcm1hbAorZGRtaW41MzUgbWluIC0wLjk5OUUtMzgzICAgICAgMCAgLT4gIC05Ljk5RS0zODQgU3Vibm9ybWFsCitkZG1pbjUzNiBtaW4gLTAuMDk5RS0zODMgICAgICAwICAtPiAgLTkuOUUtMzg1ICBTdWJub3JtYWwKK2RkbWluNTM3IG1pbiAtMC4wMDlFLTM4MyAgICAgIDAgIC0+ICAtOUUtMzg2ICAgIFN1Ym5vcm1hbAorZGRtaW41MzggbWluIC0wLjAwMUUtMzgzICAgICAgMCAgLT4gIC0xRS0zODYgICAgU3Vibm9ybWFsCitkZG1pbjUzOSBtaW4gLTAuMDAwOUUtMzgzICAgICAwICAtPiAgLTlFLTM4NyAgICBTdWJub3JtYWwKK2RkbWluNTQwIG1pbiAtMC4wMDAxRS0zODMgICAgIDAgIC0+ICAtMUUtMzg3ICAgIFN1Ym5vcm1hbAorCisKKy0tIE51bGwgdGVzdHMKK2RkbWluOTAwIG1pbiAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkbWluOTAxIG1pbiAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNaW5NYWcuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNaW5NYWcuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDEyZjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE1pbk1hZy5kZWNUZXN0CkBAIC0wLDAgKzEsMjkzIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkTWluTWFnLmRlY1Rlc3QgLS0gZGVjRG91YmxlIG1pbm51bW1hZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gd2UgYXNzdW1lIHRoYXQgYmFzZSBjb21wYXJpc29uIGlzIHRlc3RlZCBpbiBjb21wYXJlLmRlY1Rlc3QsIHNvCistLSB0aGVzZSBtYWlubHkgY292ZXIgc3BlY2lhbCBjYXNlcyBhbmQgcm91bmRpbmcKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkZG1uZzAwMSBtaW5tYWcgIC0yICAtMiAgLT4gLTIKK2RkbW5nMDAyIG1pbm1hZyAgLTIgIC0xICAtPiAtMQorZGRtbmcwMDMgbWlubWFnICAtMiAgIDAgIC0+ICAwCitkZG1uZzAwNCBtaW5tYWcgIC0yICAgMSAgLT4gIDEKK2RkbW5nMDA1IG1pbm1hZyAgLTIgICAyICAtPiAtMgorZGRtbmcwMDYgbWlubWFnICAtMSAgLTIgIC0+IC0xCitkZG1uZzAwNyBtaW5tYWcgIC0xICAtMSAgLT4gLTEKK2RkbW5nMDA4IG1pbm1hZyAgLTEgICAwICAtPiAgMAorZGRtbmcwMDkgbWlubWFnICAtMSAgIDEgIC0+IC0xCitkZG1uZzAxMCBtaW5tYWcgIC0xICAgMiAgLT4gLTEKK2RkbW5nMDExIG1pbm1hZyAgIDAgIC0yICAtPiAgMAorZGRtbmcwMTIgbWlubWFnICAgMCAgLTEgIC0+ICAwCitkZG1uZzAxMyBtaW5tYWcgICAwICAgMCAgLT4gIDAKK2RkbW5nMDE0IG1pbm1hZyAgIDAgICAxICAtPiAgMAorZGRtbmcwMTUgbWlubWFnICAgMCAgIDIgIC0+ICAwCitkZG1uZzAxNiBtaW5tYWcgICAxICAtMiAgLT4gIDEKK2RkbW5nMDE3IG1pbm1hZyAgIDEgIC0xICAtPiAtMQorZGRtbmcwMTggbWlubWFnICAgMSAgIDAgIC0+ICAwCitkZG1uZzAxOSBtaW5tYWcgICAxICAgMSAgLT4gIDEKK2RkbW5nMDIwIG1pbm1hZyAgIDEgICAyICAtPiAgMQorZGRtbmcwMjEgbWlubWFnICAgMiAgLTIgIC0+IC0yCitkZG1uZzAyMiBtaW5tYWcgICAyICAtMSAgLT4gLTEKK2RkbW5nMDIzIG1pbm1hZyAgIDIgICAwICAtPiAgMAorZGRtbmcwMjUgbWlubWFnICAgMiAgIDEgIC0+ICAxCitkZG1uZzAyNiBtaW5tYWcgICAyICAgMiAgLT4gIDIKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RkbW5nMDMwIG1pbm1hZyAgIDAgICAgIDAgICAtPiAgMAorZGRtbmcwMzEgbWlubWFnICAgMCAgICAtMCAgIC0+IC0wCitkZG1uZzAzMiBtaW5tYWcgICAwICAgIC0wLjAgLT4gLTAuMAorZGRtbmcwMzMgbWlubWFnICAgMCAgICAgMC4wIC0+ICAwLjAKK2RkbW5nMDM0IG1pbm1hZyAgLTAgICAgIDAgICAtPiAtMAorZGRtbmcwMzUgbWlubWFnICAtMCAgICAtMCAgIC0+IC0wCitkZG1uZzAzNiBtaW5tYWcgIC0wICAgIC0wLjAgLT4gLTAKK2RkbW5nMDM3IG1pbm1hZyAgLTAgICAgIDAuMCAtPiAtMAorZGRtbmcwMzggbWlubWFnICAgMC4wICAgMCAgIC0+ICAwLjAKK2RkbW5nMDM5IG1pbm1hZyAgIDAuMCAgLTAgICAtPiAtMAorZGRtbmcwNDAgbWlubWFnICAgMC4wICAtMC4wIC0+IC0wLjAKK2RkbW5nMDQxIG1pbm1hZyAgIDAuMCAgIDAuMCAtPiAgMC4wCitkZG1uZzA0MiBtaW5tYWcgIC0wLjAgICAwICAgLT4gLTAuMAorZGRtbmcwNDMgbWlubWFnICAtMC4wICAtMCAgIC0+IC0wCitkZG1uZzA0NCBtaW5tYWcgIC0wLjAgIC0wLjAgLT4gLTAuMAorZGRtbmcwNDUgbWlubWFnICAtMC4wICAgMC4wIC0+IC0wLjAKKworZGRtbmcwNDYgbWlubWFnICAgMEUxICAtMEUxIC0+IC0wRSsxCitkZG1uZzA0NyBtaW5tYWcgIC0wRTEgICAwRTIgLT4gLTBFKzEKK2RkbW5nMDQ4IG1pbm1hZyAgIDBFMiAgIDBFMSAtPiAgMEUrMQorZGRtbmcwNDkgbWlubWFnICAgMEUxICAgMEUyIC0+ICAwRSsxCitkZG1uZzA1MCBtaW5tYWcgIC0wRTMgIC0wRTIgLT4gLTBFKzMKK2RkbW5nMDUxIG1pbm1hZyAgLTBFMiAgLTBFMyAtPiAtMEUrMworCistLSBTcGVjaWFscworZGRtbmcwOTAgbWlubWFnICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbW5nMDkxIG1pbm1hZyAgSW5mICAtMTAwMCAgLT4gLTEwMDAKK2RkbW5nMDkyIG1pbm1hZyAgSW5mICAtMSAgICAgLT4gLTEKK2RkbW5nMDkzIG1pbm1hZyAgSW5mICAtMCAgICAgLT4gLTAKK2RkbW5nMDk0IG1pbm1hZyAgSW5mICAgMCAgICAgLT4gIDAKK2RkbW5nMDk1IG1pbm1hZyAgSW5mICAgMSAgICAgLT4gIDEKK2RkbW5nMDk2IG1pbm1hZyAgSW5mICAgMTAwMCAgLT4gIDEwMDAKK2RkbW5nMDk3IG1pbm1hZyAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkZG1uZzA5OCBtaW5tYWcgLTEwMDAgIEluZiAgIC0+IC0xMDAwCitkZG1uZzA5OSBtaW5tYWcgLUluZiAgIEluZiAgIC0+IC1JbmZpbml0eQorZGRtbmcxMDAgbWlubWFnIC0xICAgICBJbmYgICAtPiAtMQorZGRtbmcxMDEgbWlubWFnIC0wICAgICBJbmYgICAtPiAtMAorZGRtbmcxMDIgbWlubWFnICAwICAgICBJbmYgICAtPiAgMAorZGRtbmcxMDMgbWlubWFnICAxICAgICBJbmYgICAtPiAgMQorZGRtbmcxMDQgbWlubWFnICAxMDAwICBJbmYgICAtPiAgMTAwMAorZGRtbmcxMDUgbWlubWFnICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZGRtbmcxMjAgbWlubWFnIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbW5nMTIxIG1pbm1hZyAtSW5mICAtMTAwMCAgLT4gLTEwMDAKK2RkbW5nMTIyIG1pbm1hZyAtSW5mICAtMSAgICAgLT4gLTEKK2RkbW5nMTIzIG1pbm1hZyAtSW5mICAtMCAgICAgLT4gLTAKK2RkbW5nMTI0IG1pbm1hZyAtSW5mICAgMCAgICAgLT4gIDAKK2RkbW5nMTI1IG1pbm1hZyAtSW5mICAgMSAgICAgLT4gIDEKK2RkbW5nMTI2IG1pbm1hZyAtSW5mICAgMTAwMCAgLT4gIDEwMDAKK2RkbW5nMTI3IG1pbm1hZyAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitkZG1uZzEyOCBtaW5tYWcgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRtbmcxMjkgbWlubWFnIC0xMDAwIC1JbmYgICAtPiAtMTAwMAorZGRtbmcxMzAgbWlubWFnIC0xICAgIC1JbmYgICAtPiAtMQorZGRtbmcxMzEgbWlubWFnIC0wICAgIC1JbmYgICAtPiAtMAorZGRtbmcxMzIgbWlubWFnICAwICAgIC1JbmYgICAtPiAgMAorZGRtbmcxMzMgbWlubWFnICAxICAgIC1JbmYgICAtPiAgMQorZGRtbmcxMzQgbWlubWFnICAxMDAwIC1JbmYgICAtPiAgMTAwMAorZGRtbmcxMzUgbWlubWFnICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKKworLS0gMjAwNC4wOC4wMiA3NTRyIGNob29zZXMgbnVtYmVyIG92ZXIgTmFOIGluIG1peGVkIGNhc2VzCitkZG1uZzE0MSBtaW5tYWcgIE5hTiAtSW5mICAgIC0+ICAtSW5maW5pdHkKK2RkbW5nMTQyIG1pbm1hZyAgTmFOIC0xMDAwICAgLT4gIC0xMDAwCitkZG1uZzE0MyBtaW5tYWcgIE5hTiAtMSAgICAgIC0+ICAtMQorZGRtbmcxNDQgbWlubWFnICBOYU4gLTAgICAgICAtPiAgLTAKK2RkbW5nMTQ1IG1pbm1hZyAgTmFOICAwICAgICAgLT4gIDAKK2RkbW5nMTQ2IG1pbm1hZyAgTmFOICAxICAgICAgLT4gIDEKK2RkbW5nMTQ3IG1pbm1hZyAgTmFOICAxMDAwICAgLT4gIDEwMDAKK2RkbW5nMTQ4IG1pbm1hZyAgTmFOICBJbmYgICAgLT4gIEluZmluaXR5CitkZG1uZzE0OSBtaW5tYWcgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RkbW5nMTUwIG1pbm1hZyAtSW5mICBOYU4gICAgLT4gLUluZmluaXR5CitkZG1uZzE1MSBtaW5tYWcgLTEwMDAgTmFOICAgIC0+IC0xMDAwCitkZG1uZzE1MiBtaW5tYWcgLTEgICAtTmFOICAgIC0+IC0xCitkZG1uZzE1MyBtaW5tYWcgLTAgICAgTmFOICAgIC0+IC0wCitkZG1uZzE1NCBtaW5tYWcgIDAgICAtTmFOICAgIC0+ICAwCitkZG1uZzE1NSBtaW5tYWcgIDEgICAgTmFOICAgIC0+ICAxCitkZG1uZzE1NiBtaW5tYWcgIDEwMDAgTmFOICAgIC0+ICAxMDAwCitkZG1uZzE1NyBtaW5tYWcgIEluZiAgTmFOICAgIC0+ICBJbmZpbml0eQorCitkZG1uZzE2MSBtaW5tYWcgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE2MiBtaW5tYWcgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE2MyBtaW5tYWcgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE2NCBtaW5tYWcgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE2NSBtaW5tYWcgLXNOYU4gIDAgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE2NiBtaW5tYWcgLXNOYU4gIDEgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE2NyBtaW5tYWcgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE2OCBtaW5tYWcgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE2OSBtaW5tYWcgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE3MCBtaW5tYWcgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE3MSBtaW5tYWcgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE3MiBtaW5tYWcgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE3MyBtaW5tYWcgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE3NCBtaW5tYWcgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE3NSBtaW5tYWcgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE3NiBtaW5tYWcgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE3NyBtaW5tYWcgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE3OCBtaW5tYWcgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE3OSBtaW5tYWcgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RkbW5nMTgxIG1pbm1hZyAgTmFOOSAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbW5nMTgyIG1pbm1hZyAtTmFOOCAgICA5OTkwICAtPiAgOTk5MAorZGRtbmcxODMgbWlubWFnICBOYU43MSAgIEluZiAgIC0+ICBJbmZpbml0eQorCitkZG1uZzE4NCBtaW5tYWcgIE5hTjEgICAgTmFONTQgLT4gIE5hTjEKK2RkbW5nMTg1IG1pbm1hZyAgTmFOMjIgIC1OYU41MyAtPiAgTmFOMjIKK2RkbW5nMTg2IG1pbm1hZyAtTmFOMyAgICBOYU42ICAtPiAtTmFOMworZGRtbmcxODcgbWlubWFnIC1OYU40NCAgIE5hTjcgIC0+IC1OYU40NAorCitkZG1uZzE4OCBtaW5tYWcgLUluZiAgICAgTmFONDEgLT4gLUluZmluaXR5CitkZG1uZzE4OSBtaW5tYWcgLTk5OTkgICAtTmFOMzMgLT4gLTk5OTkKK2RkbW5nMTkwIG1pbm1hZyAgSW5mICAgICBOYU4yICAtPiAgSW5maW5pdHkKKworZGRtbmcxOTEgbWlubWFnICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RkbW5nMTkyIG1pbm1hZyAgc05hTjk4IC0xMSAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE5MyBtaW5tYWcgLXNOYU45NyAgTmFOOCAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxOTQgbWlubWFnICBzTmFONjkgc05hTjk0ICAtPiAgTmFONjkgSW52YWxpZF9vcGVyYXRpb24KK2RkbW5nMTk1IG1pbm1hZyAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE5NiBtaW5tYWcgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxOTcgbWlubWFnICAwODggICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RkbW5nMTk4IG1pbm1hZyAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE5OSBtaW5tYWcgIE5hTiAgICBzTmFOODYgIC0+ICBOYU44NiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvbGQgcm91bmRpbmcgY2hlY2tzCitkZG1uZzIyMSBtaW5tYWcgLTEyMzQ1Njc4MDAwIDEgIC0+IDEKK2RkbW5nMjIyIG1pbm1hZyAxIC0xMjM0NTY3ODAwMCAgLT4gMQorZGRtbmcyMjMgbWlubWFnIC0xMjM0NTY3ODAwICAxICAtPiAxCitkZG1uZzIyNCBtaW5tYWcgMSAtMTIzNDU2NzgwMCAgIC0+IDEKK2RkbW5nMjI1IG1pbm1hZyAtMTIzNDU2Nzg5MCAgMSAgLT4gMQorZGRtbmcyMjYgbWlubWFnIDEgLTEyMzQ1Njc4OTAgICAtPiAxCitkZG1uZzIyNyBtaW5tYWcgLTEyMzQ1Njc4OTEgIDEgIC0+IDEKK2RkbW5nMjI4IG1pbm1hZyAxIC0xMjM0NTY3ODkxICAgLT4gMQorZGRtbmcyMjkgbWlubWFnIC0xMjM0NTY3ODkwMSAxICAtPiAxCitkZG1uZzIzMCBtaW5tYWcgMSAtMTIzNDU2Nzg5MDEgIC0+IDEKK2RkbW5nMjMxIG1pbm1hZyAtMTIzNDU2Nzg5NiAgMSAgLT4gMQorZGRtbmcyMzIgbWlubWFnIDEgLTEyMzQ1Njc4OTYgICAtPiAxCitkZG1uZzIzMyBtaW5tYWcgMTIzNDU2Nzg5MSAgMSAgIC0+IDEKK2RkbW5nMjM0IG1pbm1hZyAxIDEyMzQ1Njc4OTEgICAgLT4gMQorZGRtbmcyMzUgbWlubWFnIDEyMzQ1Njc4OTAxIDEgICAtPiAxCitkZG1uZzIzNiBtaW5tYWcgMSAxMjM0NTY3ODkwMSAgIC0+IDEKK2RkbW5nMjM3IG1pbm1hZyAxMjM0NTY3ODk2ICAxICAgLT4gMQorZGRtbmcyMzggbWlubWFnIDEgMTIzNDU2Nzg5NiAgICAtPiAxCisKKy0tIGZyb20gZXhhbXBsZXMKK2RkbW5nMjgwIG1pbm1hZyAnMycgICAnMicgIC0+ICAnMicKK2RkbW5nMjgxIG1pbm1hZyAnLTEwJyAnMycgIC0+ICAnMycKK2RkbW5nMjgyIG1pbm1hZyAnMS4wJyAnMScgIC0+ICAnMS4wJworZGRtbmcyODMgbWlubWFnICcxJyAnMS4wJyAgLT4gICcxLjAnCitkZG1uZzI4NCBtaW5tYWcgJzcnICdOYU4nICAtPiAgJzcnCisKKy0tIGV4cGFuZGVkIGxpc3QgZnJvbSBtaW4vbWF4IDc1NHIgcHVycGxlIHByb3NlCistLSBbZXhwbGljaXQgdGVzdHMgZm9yIGV4cG9uZW50IG9yZGVyaW5nXQorZGRtbmc0MDEgbWlubWFnICBJbmYgICAgMS4xICAgICAtPiAgMS4xCitkZG1uZzQwMiBtaW5tYWcgIDEuMSAgICAxICAgICAgIC0+ICAxCitkZG1uZzQwMyBtaW5tYWcgIDEgICAgICAxLjAgICAgIC0+ICAxLjAKK2RkbW5nNDA0IG1pbm1hZyAgMS4wICAgIDAuMSAgICAgLT4gIDAuMQorZGRtbmc0MDUgbWlubWFnICAwLjEgICAgMC4xMCAgICAtPiAgMC4xMAorZGRtbmc0MDYgbWlubWFnICAwLjEwICAgMC4xMDAgICAtPiAgMC4xMDAKK2RkbW5nNDA3IG1pbm1hZyAgMC4xMCAgIDAgICAgICAgLT4gIDAKK2RkbW5nNDA4IG1pbm1hZyAgMCAgICAgIDAuMCAgICAgLT4gIDAuMAorZGRtbmc0MDkgbWlubWFnICAwLjAgICAtMCAgICAgICAtPiAtMAorZGRtbmc0MTAgbWlubWFnICAwLjAgICAtMC4wICAgICAtPiAtMC4wCitkZG1uZzQxMSBtaW5tYWcgIDAuMDAgIC0wLjAgICAgIC0+IC0wLjAKK2RkbW5nNDEyIG1pbm1hZyAgMC4wICAgLTAuMDAgICAgLT4gLTAuMDAKK2RkbW5nNDEzIG1pbm1hZyAgMCAgICAgLTAuMCAgICAgLT4gLTAuMAorZGRtbmc0MTQgbWlubWFnICAwICAgICAtMCAgICAgICAtPiAtMAorZGRtbmc0MTUgbWlubWFnIC0wLjAgICAtMCAgICAgICAtPiAtMAorZGRtbmc0MTYgbWlubWFnIC0wICAgICAtMC4xMDAgICAtPiAtMAorZGRtbmc0MTcgbWlubWFnIC0wLjEwMCAtMC4xMCAgICAtPiAtMC4xMAorZGRtbmc0MTggbWlubWFnIC0wLjEwICAtMC4xICAgICAtPiAtMC4xCitkZG1uZzQxOSBtaW5tYWcgLTAuMSAgIC0xLjAgICAgIC0+IC0wLjEKK2RkbW5nNDIwIG1pbm1hZyAtMS4wICAgLTEgICAgICAgLT4gLTEKK2RkbW5nNDIxIG1pbm1hZyAtMSAgICAgLTEuMSAgICAgLT4gLTEKK2RkbW5nNDIzIG1pbm1hZyAtMS4xICAgLUluZiAgICAgLT4gLTEuMQorLS0gc2FtZSB3aXRoIG9wZXJhbmRzIHJldmVyc2VkCitkZG1uZzQzMSBtaW5tYWcgIDEuMSAgICBJbmYgICAgIC0+ICAxLjEKK2RkbW5nNDMyIG1pbm1hZyAgMSAgICAgIDEuMSAgICAgLT4gIDEKK2RkbW5nNDMzIG1pbm1hZyAgMS4wICAgIDEgICAgICAgLT4gIDEuMAorZGRtbmc0MzQgbWlubWFnICAwLjEgICAgMS4wICAgICAtPiAgMC4xCitkZG1uZzQzNSBtaW5tYWcgIDAuMTAgICAwLjEgICAgIC0+ICAwLjEwCitkZG1uZzQzNiBtaW5tYWcgIDAuMTAwICAwLjEwICAgIC0+ICAwLjEwMAorZGRtbmc0MzcgbWlubWFnICAwICAgICAgMC4xMCAgICAtPiAgMAorZGRtbmc0MzggbWlubWFnICAwLjAgICAgMCAgICAgICAtPiAgMC4wCitkZG1uZzQzOSBtaW5tYWcgLTAgICAgICAwLjAgICAgIC0+IC0wCitkZG1uZzQ0MCBtaW5tYWcgLTAuMCAgICAwLjAgICAgIC0+IC0wLjAKK2RkbW5nNDQxIG1pbm1hZyAtMC4wICAgIDAuMDAgICAgLT4gLTAuMAorZGRtbmc0NDIgbWlubWFnIC0wLjAwICAgMC4wICAgICAtPiAtMC4wMAorZGRtbmc0NDMgbWlubWFnIC0wLjAgICAgMCAgICAgICAtPiAtMC4wCitkZG1uZzQ0NCBtaW5tYWcgLTAgICAgICAwICAgICAgIC0+IC0wCitkZG1uZzQ0NSBtaW5tYWcgLTAgICAgIC0wLjAgICAgIC0+IC0wCitkZG1uZzQ0NiBtaW5tYWcgLTAuMTAwIC0wICAgICAgIC0+IC0wCitkZG1uZzQ0NyBtaW5tYWcgLTAuMTAgIC0wLjEwMCAgIC0+IC0wLjEwCitkZG1uZzQ0OCBtaW5tYWcgLTAuMSAgIC0wLjEwICAgIC0+IC0wLjEKK2RkbW5nNDQ5IG1pbm1hZyAtMS4wICAgLTAuMSAgICAgLT4gLTAuMQorZGRtbmc0NTAgbWlubWFnIC0xICAgICAtMS4wICAgICAtPiAtMQorZGRtbmc0NTEgbWlubWFnIC0xLjEgICAtMSAgICAgICAtPiAtMQorZGRtbmc0NTMgbWlubWFnIC1JbmYgICAtMS4xICAgICAtPiAtMS4xCistLSBsYXJnaWVzCitkZG1uZzQ2MCBtaW5tYWcgIDEwMDAgICAxRSszICAgIC0+ICAxMDAwCitkZG1uZzQ2MSBtaW5tYWcgIDFFKzMgICAxMDAwICAgIC0+ICAxMDAwCitkZG1uZzQ2MiBtaW5tYWcgIDEwMDAgIC0xRSszICAgIC0+IC0xRSszCitkZG1uZzQ2MyBtaW5tYWcgIDFFKzMgICAtMzg0ICAgIC0+IC0zODQKK2RkbW5nNDY0IG1pbm1hZyAtMzg0ICAgIDFFKzMgICAgLT4gLTM4NAorZGRtbmc0NjUgbWlubWFnIC0xRSszICAgMTAwMCAgICAtPiAtMUUrMworZGRtbmc0NjYgbWlubWFnIC0zODQgICAtMUUrMyAgICAtPiAtMzg0CitkZG1uZzQ2NyBtaW5tYWcgLTFFKzMgICAtMzg0ICAgIC0+IC0zODQKKworLS0gc3Vibm9ybWFscworZGRtbmc1MTAgbWlubWFnICAxLjAwRS0zODMgICAgICAgMCAgLT4gICAwCitkZG1uZzUxMSBtaW5tYWcgIDAuMUUtMzgzICAgICAgICAwICAtPiAgIDAKK2RkbW5nNTEyIG1pbm1hZyAgMC4xMEUtMzgzICAgICAgIDAgIC0+ICAgMAorZGRtbmc1MTMgbWlubWFnICAwLjEwMEUtMzgzICAgICAgMCAgLT4gICAwCitkZG1uZzUxNCBtaW5tYWcgIDAuMDFFLTM4MyAgICAgICAwICAtPiAgIDAKK2RkbW5nNTE1IG1pbm1hZyAgMC45OTlFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtbmc1MTYgbWlubWFnICAwLjA5OUUtMzgzICAgICAgMCAgLT4gICAwCitkZG1uZzUxNyBtaW5tYWcgIDAuMDA5RS0zODMgICAgICAwICAtPiAgIDAKK2RkbW5nNTE4IG1pbm1hZyAgMC4wMDFFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtbmc1MTkgbWlubWFnICAwLjAwMDlFLTM4MyAgICAgMCAgLT4gICAwCitkZG1uZzUyMCBtaW5tYWcgIDAuMDAwMUUtMzgzICAgICAwICAtPiAgIDAKKworZGRtbmc1MzAgbWlubWFnIC0xLjAwRS0zODMgICAgICAgMCAgLT4gICAwCitkZG1uZzUzMSBtaW5tYWcgLTAuMUUtMzgzICAgICAgICAwICAtPiAgIDAKK2RkbW5nNTMyIG1pbm1hZyAtMC4xMEUtMzgzICAgICAgIDAgIC0+ICAgMAorZGRtbmc1MzMgbWlubWFnIC0wLjEwMEUtMzgzICAgICAgMCAgLT4gICAwCitkZG1uZzUzNCBtaW5tYWcgLTAuMDFFLTM4MyAgICAgICAwICAtPiAgIDAKK2RkbW5nNTM1IG1pbm1hZyAtMC45OTlFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtbmc1MzYgbWlubWFnIC0wLjA5OUUtMzgzICAgICAgMCAgLT4gICAwCitkZG1uZzUzNyBtaW5tYWcgLTAuMDA5RS0zODMgICAgICAwICAtPiAgIDAKK2RkbW5nNTM4IG1pbm1hZyAtMC4wMDFFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtbmc1MzkgbWlubWFnIC0wLjAwMDlFLTM4MyAgICAgMCAgLT4gICAwCitkZG1uZzU0MCBtaW5tYWcgLTAuMDAwMUUtMzgzICAgICAwICAtPiAgIDAKKworCistLSBOdWxsIHRlc3RzCitkZG1uZzkwMCBtaW5tYWcgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzkwMSBtaW5tYWcgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTWludXMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNaW51cy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZmZmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTWludXMuZGVjVGVzdApAQCAtMCwwICsxLDg4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkTWludXMuZGVjVGVzdCAtLSBkZWNEb3VibGUgMC14ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNEb3VibGVzLgorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjaworZGRtbnMwMDEgbWludXMgICAgICAgKzcuNTAgIC0+IC03LjUwCisKKy0tIEluZmluaXRpZXMKK2RkbW5zMDExIG1pbnVzICBJbmZpbml0eSAgICAtPiAtSW5maW5pdHkKK2RkbW5zMDEyIG1pbnVzICAtSW5maW5pdHkgICAtPiBJbmZpbml0eQorCistLSBOYU5zLCAwIHBheWxvYWQKK2RkbW5zMDIxIG1pbnVzICAgICAgICAgTmFOICAtPiBOYU4KK2RkbW5zMDIyIG1pbnVzICAgICAgICAtTmFOICAtPiAtTmFOCitkZG1uczAyMyBtaW51cyAgICAgICAgc05hTiAgLT4gTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbnMwMjQgbWludXMgICAgICAgLXNOYU4gIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorZGRtbnMwMzEgbWludXMgICAgICAgTmFOMTMgIC0+IE5hTjEzCitkZG1uczAzMiBtaW51cyAgICAgIC1OYU4xMyAgLT4gLU5hTjEzCitkZG1uczAzMyBtaW51cyAgICAgIHNOYU4xMyAgLT4gTmFOMTMgICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbnMwMzQgbWludXMgICAgIC1zTmFOMTMgIC0+IC1OYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2RkbW5zMDM1IG1pbnVzICAgICAgIE5hTjcwICAtPiBOYU43MAorZGRtbnMwMzYgbWludXMgICAgICAtTmFONzAgIC0+IC1OYU43MAorZGRtbnMwMzcgbWludXMgICAgICBzTmFOMTAxIC0+IE5hTjEwMSAgSW52YWxpZF9vcGVyYXRpb24KK2RkbW5zMDM4IG1pbnVzICAgICAtc05hTjEwMSAtPiAtTmFOMTAxIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGZpbml0ZXMKK2RkbW5zMTAxIG1pbnVzICAgICAgICAgIDcgICAtPiAtNworZGRtbnMxMDIgbWludXMgICAgICAgICAtNyAgIC0+IDcKK2RkbW5zMTAzIG1pbnVzICAgICAgICAgNzUgICAtPiAtNzUKK2RkbW5zMTA0IG1pbnVzICAgICAgICAtNzUgICAtPiA3NQorZGRtbnMxMDUgbWludXMgICAgICAgNy41MCAgIC0+IC03LjUwCitkZG1uczEwNiBtaW51cyAgICAgIC03LjUwICAgLT4gNy41MAorZGRtbnMxMDcgbWludXMgICAgICAgNy41MDAgIC0+IC03LjUwMAorZGRtbnMxMDggbWludXMgICAgICAtNy41MDAgIC0+IDcuNTAwCisKKy0tIHplcm9zCitkZG1uczExMSBtaW51cyAgICAgICAgICAwICAgLT4gMAorZGRtbnMxMTIgbWludXMgICAgICAgICAtMCAgIC0+IDAKK2RkbW5zMTEzIG1pbnVzICAgICAgIDBFKzQgICAtPiAwRSs0CitkZG1uczExNCBtaW51cyAgICAgIC0wRSs0ICAgLT4gMEUrNAorZGRtbnMxMTUgbWludXMgICAgIDAuMDAwMCAgIC0+IDAuMDAwMAorZGRtbnMxMTYgbWludXMgICAgLTAuMDAwMCAgIC0+IDAuMDAwMAorZGRtbnMxMTcgbWludXMgICAgICAwRS0xNDEgIC0+IDBFLTE0MQorZGRtbnMxMTggbWludXMgICAgIC0wRS0xNDEgIC0+IDBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZGRtbnMxMjEgbWludXMgIDI2ODI2ODI2ODI2ODI2ODIgICAgICAgICAtPiAtMjY4MjY4MjY4MjY4MjY4MgorZGRtbnMxMjIgbWludXMgIC0yNjgyNjgyNjgyNjgyNjgyICAgICAgICAtPiAyNjgyNjgyNjgyNjgyNjgyCitkZG1uczEyMyBtaW51cyAgMTM0MTM0MTM0MTM0MTM0MSAgICAgICAgIC0+IC0xMzQxMzQxMzQxMzQxMzQxCitkZG1uczEyNCBtaW51cyAgLTEzNDEzNDEzNDEzNDEzNDEgICAgICAgIC0+IDEzNDEzNDEzNDEzNDEzNDEKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RkbW5zMTMxIG1pbnVzICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbW5zMTMyIG1pbnVzICAxRS0zODMgICAgICAgICAgICAgICAgICAgLT4gLTFFLTM4MworZGRtbnMxMzMgbWludXMgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRtbnMxMzQgbWludXMgIDFFLTM5OCAgICAgICAgICAgICAgICAgICAtPiAtMUUtMzk4IFN1Ym5vcm1hbAorCitkZG1uczEzNSBtaW51cyAgLTFFLTM5OCAgICAgICAgICAgICAgICAgIC0+IDFFLTM5OCBTdWJub3JtYWwKK2RkbW5zMTM2IG1pbnVzICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRtbnMxMzcgbWludXMgIC0xRS0zODMgICAgICAgICAgICAgICAgICAtPiAxRS0zODMKK2RkbW5zMTM4IG1pbnVzICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE11bHRpcGx5LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTXVsdGlwbHkuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODczZjgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE11bHRpcGx5LmRlY1Rlc3QKQEAgLTAsMCArMSw1NTMgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRNdWx0aXBseS5kZWNUZXN0IC0tIGRlY0RvdWJsZSBtdWx0aXBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyBhcmUgZm9yIGRlY0RvdWJsZXMgb25seTsgYWxsIGFyZ3VtZW50cyBhcmUKKy0tIHJlcHJlc2VudGFibGUgaW4gYSBkZWNEb3VibGUKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkZG11bDAwMCBtdWx0aXBseSAyICAgICAgMiAtPiA0CitkZG11bDAwMSBtdWx0aXBseSAyICAgICAgMyAtPiA2CitkZG11bDAwMiBtdWx0aXBseSA1ICAgICAgMSAtPiA1CitkZG11bDAwMyBtdWx0aXBseSA1ICAgICAgMiAtPiAxMAorZGRtdWwwMDQgbXVsdGlwbHkgMS4yMCAgIDIgLT4gMi40MAorZGRtdWwwMDUgbXVsdGlwbHkgMS4yMCAgIDAgLT4gMC4wMAorZGRtdWwwMDYgbXVsdGlwbHkgMS4yMCAgLTIgLT4gLTIuNDAKK2RkbXVsMDA3IG11bHRpcGx5IC0xLjIwICAyIC0+IC0yLjQwCitkZG11bDAwOCBtdWx0aXBseSAtMS4yMCAgMCAtPiAtMC4wMAorZGRtdWwwMDkgbXVsdGlwbHkgLTEuMjAgLTIgLT4gMi40MAorZGRtdWwwMTAgbXVsdGlwbHkgNS4wOSA3LjEgLT4gMzYuMTM5CitkZG11bDAxMSBtdWx0aXBseSAyLjUgICAgNCAtPiAxMC4wCitkZG11bDAxMiBtdWx0aXBseSAyLjUwICAgNCAtPiAxMC4wMAorZGRtdWwwMTMgbXVsdGlwbHkgMS4yMzQ1Njc4OSAxLjAwMDAwMDAwIC0+IDEuMjM0NTY3ODkwMDAwMDAwIFJvdW5kZWQKK2RkbXVsMDE1IG11bHRpcGx5IDIuNTAgICA0IC0+IDEwLjAwCitkZG11bDAxNiBtdWx0aXBseSAgOS45OTk5OTk5OTkgIDkuOTk5OTk5OTk5IC0+ICA5OS45OTk5OTk5ODAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsMDE3IG11bHRpcGx5ICA5Ljk5OTk5OTk5OSAtOS45OTk5OTk5OTkgLT4gLTk5Ljk5OTk5OTk4MDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRtdWwwMTggbXVsdGlwbHkgLTkuOTk5OTk5OTk5ICA5Ljk5OTk5OTk5OSAtPiAtOTkuOTk5OTk5OTgwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZG11bDAxOSBtdWx0aXBseSAtOS45OTk5OTk5OTkgLTkuOTk5OTk5OTk5IC0+ICA5OS45OTk5OTk5ODAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gemVyb3MsIGV0Yy4KK2RkbXVsMDIxIG11bHRpcGx5ICAwICAgICAgMCAgICAgLT4gIDAKK2RkbXVsMDIyIG11bHRpcGx5ICAwICAgICAtMCAgICAgLT4gLTAKK2RkbXVsMDIzIG11bHRpcGx5IC0wICAgICAgMCAgICAgLT4gLTAKK2RkbXVsMDI0IG11bHRpcGx5IC0wICAgICAtMCAgICAgLT4gIDAKK2RkbXVsMDI1IG11bHRpcGx5IC0wLjAgICAtMC4wICAgLT4gIDAuMDAKK2RkbXVsMDI2IG11bHRpcGx5IC0wLjAgICAtMC4wICAgLT4gIDAuMDAKK2RkbXVsMDI3IG11bHRpcGx5IC0wLjAgICAtMC4wICAgLT4gIDAuMDAKK2RkbXVsMDI4IG11bHRpcGx5IC0wLjAgICAtMC4wICAgLT4gIDAuMDAKK2RkbXVsMDMwIG11bHRpcGx5ICA1LjAwICAgMUUtMyAgLT4gIDAuMDA1MDAKK2RkbXVsMDMxIG11bHRpcGx5ICAwMC4wMCAgMC4wMDAgLT4gIDAuMDAwMDAKK2RkbXVsMDMyIG11bHRpcGx5ICAwMC4wMCAgMEUtMyAgLT4gIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitkZG11bDAzMyBtdWx0aXBseSAgMEUtMyAgIDAwLjAwIC0+ICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorZGRtdWwwMzQgbXVsdGlwbHkgLTUuMDAgICAxRS0zICAtPiAtMC4wMDUwMAorZGRtdWwwMzUgbXVsdGlwbHkgLTAwLjAwICAwLjAwMCAtPiAtMC4wMDAwMAorZGRtdWwwMzYgbXVsdGlwbHkgLTAwLjAwICAwRS0zICAtPiAtMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2RkbXVsMDM3IG11bHRpcGx5IC0wRS0zICAgMDAuMDAgLT4gLTAuMDAwMDAgICAgIC0tIGxocyBpcyAwCitkZG11bDAzOCBtdWx0aXBseSAgNS4wMCAgLTFFLTMgIC0+IC0wLjAwNTAwCitkZG11bDAzOSBtdWx0aXBseSAgMDAuMDAgLTAuMDAwIC0+IC0wLjAwMDAwCitkZG11bDA0MCBtdWx0aXBseSAgMDAuMDAgLTBFLTMgIC0+IC0wLjAwMDAwICAgICAtLSByaHMgaXMgMAorZGRtdWwwNDEgbXVsdGlwbHkgIDBFLTMgIC0wMC4wMCAtPiAtMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK2RkbXVsMDQyIG11bHRpcGx5IC01LjAwICAtMUUtMyAgLT4gIDAuMDA1MDAKK2RkbXVsMDQzIG11bHRpcGx5IC0wMC4wMCAtMC4wMDAgLT4gIDAuMDAwMDAKK2RkbXVsMDQ0IG11bHRpcGx5IC0wMC4wMCAtMEUtMyAgLT4gIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitkZG11bDA0NSBtdWx0aXBseSAtMEUtMyAgLTAwLjAwIC0+ICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorCistLSBleGFtcGxlcyBmcm9tIGRlY2FyaXRoCitkZG11bDA1MCBtdWx0aXBseSAxLjIwIDMgICAgICAgIC0+IDMuNjAKK2RkbXVsMDUxIG11bHRpcGx5IDcgICAgMyAgICAgICAgLT4gMjEKK2RkbXVsMDUyIG11bHRpcGx5IDAuOSAgMC44ICAgICAgLT4gMC43MgorZGRtdWwwNTMgbXVsdGlwbHkgMC45ICAtMCAgICAgICAtPiAtMC4wCitkZG11bDA1NCBtdWx0aXBseSA2NTQzMjEgNjU0MzIxIC0+IDQyODEzNTk3MTA0MQorCitkZG11bDA2MCBtdWx0aXBseSAxMjMuNDUgMWU3ICAtPiAgMS4yMzQ1RSs5CitkZG11bDA2MSBtdWx0aXBseSAxMjMuNDUgMWU4ICAtPiAgMS4yMzQ1RSsxMAorZGRtdWwwNjIgbXVsdGlwbHkgMTIzLjQ1IDFlKzkgLT4gIDEuMjM0NUUrMTEKK2RkbXVsMDYzIG11bHRpcGx5IDEyMy40NSAxZTEwIC0+ICAxLjIzNDVFKzEyCitkZG11bDA2NCBtdWx0aXBseSAxMjMuNDUgMWUxMSAtPiAgMS4yMzQ1RSsxMworZGRtdWwwNjUgbXVsdGlwbHkgMTIzLjQ1IDFlMTIgLT4gIDEuMjM0NUUrMTQKK2RkbXVsMDY2IG11bHRpcGx5IDEyMy40NSAxZTEzIC0+ICAxLjIzNDVFKzE1CisKKworLS0gdGVzdCBzb21lIGludGVybWVkaWF0ZSBsZW5ndGhzCistLSAgICAgICAgICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorZGRtdWwwODAgbXVsdGlwbHkgMC4xIDEyMzAxMjM0NTY0NTY3ODkgICAgIC0+IDEyMzAxMjM0NTY0NTY3OC45CitkZG11bDA4NCBtdWx0aXBseSAwLjEgMTIzMDEyMzQ1NjQ1Njc4OSAgICAgLT4gMTIzMDEyMzQ1NjQ1Njc4LjkKK2RkbXVsMDkwIG11bHRpcGx5IDEyMzAxMjM0NTY0NTY3ODkgICAgIDAuMSAtPiAxMjMwMTIzNDU2NDU2NzguOQorZGRtdWwwOTQgbXVsdGlwbHkgMTIzMDEyMzQ1NjQ1Njc4OSAgICAgMC4xIC0+IDEyMzAxMjM0NTY0NTY3OC45CisKKy0tIHRlc3Qgc29tZSBtb3JlIGVkZ2UgY2FzZXMgYW5kIGNhcnJpZXMKK2RkbXVsMTAxIG11bHRpcGx5IDkgOSAgIC0+IDgxCitkZG11bDEwMiBtdWx0aXBseSA5IDkwICAgLT4gODEwCitkZG11bDEwMyBtdWx0aXBseSA5IDkwMCAgIC0+IDgxMDAKK2RkbXVsMTA0IG11bHRpcGx5IDkgOTAwMCAgIC0+IDgxMDAwCitkZG11bDEwNSBtdWx0aXBseSA5IDkwMDAwICAgLT4gODEwMDAwCitkZG11bDEwNiBtdWx0aXBseSA5IDkwMDAwMCAgIC0+IDgxMDAwMDAKK2RkbXVsMTA3IG11bHRpcGx5IDkgOTAwMDAwMCAgIC0+IDgxMDAwMDAwCitkZG11bDEwOCBtdWx0aXBseSA5IDkwMDAwMDAwICAgLT4gODEwMDAwMDAwCitkZG11bDEwOSBtdWx0aXBseSA5IDkwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAKK2RkbXVsMTEwIG11bHRpcGx5IDkgOTAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwCitkZG11bDExMSBtdWx0aXBseSA5IDkwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwCitkZG11bDExMiBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAKK2RkbXVsMTEzIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwCitkZG11bDExNCBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwCitkZG11bDExNSBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAKKy0tZGRtdWwxMTYgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAKKy0tZGRtdWwxMTcgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMAorLS1kZG11bDExOCBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAKKy0tZGRtdWwxMTkgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAKKy0tZGRtdWwxMjAgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMAorLS1kZG11bDEyMSBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tZGRtdWwxMjIgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tZGRtdWwxMjMgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorLS0gdGVzdCBzb21lIG1vcmUgZWRnZSBjYXNlcyB3aXRob3V0IGNhcnJpZXMKK2RkbXVsMTMxIG11bHRpcGx5IDMgMyAgIC0+IDkKK2RkbXVsMTMyIG11bHRpcGx5IDMgMzAgICAtPiA5MAorZGRtdWwxMzMgbXVsdGlwbHkgMyAzMDAgICAtPiA5MDAKK2RkbXVsMTM0IG11bHRpcGx5IDMgMzAwMCAgIC0+IDkwMDAKK2RkbXVsMTM1IG11bHRpcGx5IDMgMzAwMDAgICAtPiA5MDAwMAorZGRtdWwxMzYgbXVsdGlwbHkgMyAzMDAwMDAgICAtPiA5MDAwMDAKK2RkbXVsMTM3IG11bHRpcGx5IDMgMzAwMDAwMCAgIC0+IDkwMDAwMDAKK2RkbXVsMTM4IG11bHRpcGx5IDMgMzAwMDAwMDAgICAtPiA5MDAwMDAwMAorZGRtdWwxMzkgbXVsdGlwbHkgMyAzMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAKK2RkbXVsMTQwIG11bHRpcGx5IDMgMzAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAKK2RkbXVsMTQxIG11bHRpcGx5IDMgMzAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMAorZGRtdWwxNDIgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAKK2RkbXVsMTQzIG11bHRpcGx5IDMgMzAwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMDAKK2RkbXVsMTQ0IG11bHRpcGx5IDMgMzAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMAorZGRtdWwxNDUgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAKKworLS0gdGVzdCBzb21lIGVkZ2UgY2FzZXMgd2l0aCBleGFjdCByb3VuZGluZworZGRtdWwzMDEgbXVsdGlwbHkgOSA5ICAgLT4gODEKK2RkbXVsMzAyIG11bHRpcGx5IDkgOTAgICAtPiA4MTAKK2RkbXVsMzAzIG11bHRpcGx5IDkgOTAwICAgLT4gODEwMAorZGRtdWwzMDQgbXVsdGlwbHkgOSA5MDAwICAgLT4gODEwMDAKK2RkbXVsMzA1IG11bHRpcGx5IDkgOTAwMDAgICAtPiA4MTAwMDAKK2RkbXVsMzA2IG11bHRpcGx5IDkgOTAwMDAwICAgLT4gODEwMDAwMAorZGRtdWwzMDcgbXVsdGlwbHkgOSA5MDAwMDAwICAgLT4gODEwMDAwMDAKK2RkbXVsMzA4IG11bHRpcGx5IDkgOTAwMDAwMDAgICAtPiA4MTAwMDAwMDAKK2RkbXVsMzA5IG11bHRpcGx5IDkgOTAwMDAwMDAwICAgLT4gODEwMDAwMDAwMAorZGRtdWwzMTAgbXVsdGlwbHkgOSA5MDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAKK2RkbXVsMzExIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAKK2RkbXVsMzEyIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMAorZGRtdWwzMTMgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAKK2RkbXVsMzE0IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAKK2RkbXVsMzE1IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMAorZGRtdWwzMTYgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDBFKzE2ICBSb3VuZGVkCitkZG11bDMxNyBtdWx0aXBseSA5MCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDBFKzE3ICBSb3VuZGVkCitkZG11bDMxOCBtdWx0aXBseSA5MDAgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDAwMDAwMDAwRSsxOCAgUm91bmRlZAorZGRtdWwzMTkgbXVsdGlwbHkgOTAwMCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDBFKzE5ICBSb3VuZGVkCitkZG11bDMyMCBtdWx0aXBseSA5MDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDBFKzIwICBSb3VuZGVkCitkZG11bDMyMSBtdWx0aXBseSA5MDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDAwMDAwMDAwRSsyMSAgUm91bmRlZAorZGRtdWwzMjIgbXVsdGlwbHkgOTAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDBFKzIyICBSb3VuZGVkCitkZG11bDMyMyBtdWx0aXBseSA5MDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDBFKzIzICBSb3VuZGVkCisKKy0tIHRyeXplcm9zIGNhc2VzCitkZG11bDUwNCAgbXVsdGlwbHkgIDBFLTI2MCAxMDAwRS0yNjAgIC0+IDBFLTM5OCBDbGFtcGVkCitkZG11bDUwNSAgbXVsdGlwbHkgIDEwMEUrMjYwIDBFKzI2MCAgIC0+IDBFKzM2OSBDbGFtcGVkCistLSA2NUstMSBjYXNlCitkZG11bDUwNiBtdWx0aXBseSA3Ny4xIDg1MCAtPiA2NTUzNS4wCisKKy0tIG1peGVkIHdpdGggemVyb3MKK2RkbXVsNTQxIG11bHRpcGx5ICAwICAgIC0xICAgICAtPiAtMAorZGRtdWw1NDIgbXVsdGlwbHkgLTAgICAgLTEgICAgIC0+ICAwCitkZG11bDU0MyBtdWx0aXBseSAgMCAgICAgMSAgICAgLT4gIDAKK2RkbXVsNTQ0IG11bHRpcGx5IC0wICAgICAxICAgICAtPiAtMAorZGRtdWw1NDUgbXVsdGlwbHkgLTEgICAgIDAgICAgIC0+IC0wCitkZG11bDU0NiBtdWx0aXBseSAtMSAgICAtMCAgICAgLT4gIDAKK2RkbXVsNTQ3IG11bHRpcGx5ICAxICAgICAwICAgICAtPiAgMAorZGRtdWw1NDggbXVsdGlwbHkgIDEgICAgLTAgICAgIC0+IC0wCisKK2RkbXVsNTUxIG11bHRpcGx5ICAwLjAgIC0xICAgICAtPiAtMC4wCitkZG11bDU1MiBtdWx0aXBseSAtMC4wICAtMSAgICAgLT4gIDAuMAorZGRtdWw1NTMgbXVsdGlwbHkgIDAuMCAgIDEgICAgIC0+ICAwLjAKK2RkbXVsNTU0IG11bHRpcGx5IC0wLjAgICAxICAgICAtPiAtMC4wCitkZG11bDU1NSBtdWx0aXBseSAtMS4wICAgMCAgICAgLT4gLTAuMAorZGRtdWw1NTYgbXVsdGlwbHkgLTEuMCAgLTAgICAgIC0+ICAwLjAKK2RkbXVsNTU3IG11bHRpcGx5ICAxLjAgICAwICAgICAtPiAgMC4wCitkZG11bDU1OCBtdWx0aXBseSAgMS4wICAtMCAgICAgLT4gLTAuMAorCitkZG11bDU2MSBtdWx0aXBseSAgMCAgICAtMS4wICAgLT4gLTAuMAorZGRtdWw1NjIgbXVsdGlwbHkgLTAgICAgLTEuMCAgIC0+ICAwLjAKK2RkbXVsNTYzIG11bHRpcGx5ICAwICAgICAxLjAgICAtPiAgMC4wCitkZG11bDU2NCBtdWx0aXBseSAtMCAgICAgMS4wICAgLT4gLTAuMAorZGRtdWw1NjUgbXVsdGlwbHkgLTEgICAgIDAuMCAgIC0+IC0wLjAKK2RkbXVsNTY2IG11bHRpcGx5IC0xICAgIC0wLjAgICAtPiAgMC4wCitkZG11bDU2NyBtdWx0aXBseSAgMSAgICAgMC4wICAgLT4gIDAuMAorZGRtdWw1NjggbXVsdGlwbHkgIDEgICAgLTAuMCAgIC0+IC0wLjAKKworZGRtdWw1NzEgbXVsdGlwbHkgIDAuMCAgLTEuMCAgIC0+IC0wLjAwCitkZG11bDU3MiBtdWx0aXBseSAtMC4wICAtMS4wICAgLT4gIDAuMDAKK2RkbXVsNTczIG11bHRpcGx5ICAwLjAgICAxLjAgICAtPiAgMC4wMAorZGRtdWw1NzQgbXVsdGlwbHkgLTAuMCAgIDEuMCAgIC0+IC0wLjAwCitkZG11bDU3NSBtdWx0aXBseSAtMS4wICAgMC4wICAgLT4gLTAuMDAKK2RkbXVsNTc2IG11bHRpcGx5IC0xLjAgIC0wLjAgICAtPiAgMC4wMAorZGRtdWw1NzcgbXVsdGlwbHkgIDEuMCAgIDAuMCAgIC0+ICAwLjAwCitkZG11bDU3OCBtdWx0aXBseSAgMS4wICAtMC4wICAgLT4gLTAuMDAKKworCistLSBTcGVjaWFscworZGRtdWw1ODAgbXVsdGlwbHkgIEluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRtdWw1ODEgbXVsdGlwbHkgIEluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZGRtdWw1ODIgbXVsdGlwbHkgIEluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZGRtdWw1ODMgbXVsdGlwbHkgIEluZiAgLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDU4NCBtdWx0aXBseSAgSW5mICAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNTg1IG11bHRpcGx5ICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2RkbXVsNTg2IG11bHRpcGx5ICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK2RkbXVsNTg3IG11bHRpcGx5ICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbXVsNTg4IG11bHRpcGx5IC0xMDAwICBJbmYgICAtPiAtSW5maW5pdHkKK2RkbXVsNTg5IG11bHRpcGx5IC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK2RkbXVsNTkwIG11bHRpcGx5IC0xICAgICBJbmYgICAtPiAtSW5maW5pdHkKK2RkbXVsNTkxIG11bHRpcGx5IC0wICAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw1OTIgbXVsdGlwbHkgIDAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDU5MyBtdWx0aXBseSAgMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitkZG11bDU5NCBtdWx0aXBseSAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitkZG11bDU5NSBtdWx0aXBseSAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RkbXVsNjAwIG11bHRpcGx5IC1JbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKK2RkbXVsNjAxIG11bHRpcGx5IC1JbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK2RkbXVsNjAyIG11bHRpcGx5IC1JbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RkbXVsNjAzIG11bHRpcGx5IC1JbmYgIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2MDQgbXVsdGlwbHkgLUluZiAgIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDYwNSBtdWx0aXBseSAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkZG11bDYwNiBtdWx0aXBseSAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkZG11bDYwNyBtdWx0aXBseSAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitkZG11bDYwOCBtdWx0aXBseSAtMTAwMCAgSW5mICAgLT4gLUluZmluaXR5CitkZG11bDYwOSBtdWx0aXBseSAtSW5mICAtSW5mICAgLT4gIEluZmluaXR5CitkZG11bDYxMCBtdWx0aXBseSAtMSAgICAtSW5mICAgLT4gIEluZmluaXR5CitkZG11bDYxMSBtdWx0aXBseSAtMCAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjEyIG11bHRpcGx5ICAwICAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2MTMgbXVsdGlwbHkgIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRtdWw2MTQgbXVsdGlwbHkgIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRtdWw2MTUgbXVsdGlwbHkgIEluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorCitkZG11bDYyMSBtdWx0aXBseSAgTmFOIC1JbmYgICAgLT4gIE5hTgorZGRtdWw2MjIgbXVsdGlwbHkgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RkbXVsNjIzIG11bHRpcGx5ICBOYU4gLTEgICAgICAtPiAgTmFOCitkZG11bDYyNCBtdWx0aXBseSAgTmFOIC0wICAgICAgLT4gIE5hTgorZGRtdWw2MjUgbXVsdGlwbHkgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2RkbXVsNjI2IG11bHRpcGx5ICBOYU4gIDEgICAgICAtPiAgTmFOCitkZG11bDYyNyBtdWx0aXBseSAgTmFOICAxMDAwICAgLT4gIE5hTgorZGRtdWw2MjggbXVsdGlwbHkgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RkbXVsNjI5IG11bHRpcGx5ICBOYU4gIE5hTiAgICAtPiAgTmFOCitkZG11bDYzMCBtdWx0aXBseSAtSW5mICBOYU4gICAgLT4gIE5hTgorZGRtdWw2MzEgbXVsdGlwbHkgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RkbXVsNjMyIG11bHRpcGx5IC0xICAgIE5hTiAgICAtPiAgTmFOCitkZG11bDYzMyBtdWx0aXBseSAtMCAgICBOYU4gICAgLT4gIE5hTgorZGRtdWw2MzQgbXVsdGlwbHkgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RkbXVsNjM1IG11bHRpcGx5ICAxICAgIE5hTiAgICAtPiAgTmFOCitkZG11bDYzNiBtdWx0aXBseSAgMTAwMCBOYU4gICAgLT4gIE5hTgorZGRtdWw2MzcgbXVsdGlwbHkgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZGRtdWw2NDEgbXVsdGlwbHkgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY0MiBtdWx0aXBseSAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjQzIG11bHRpcGx5ICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2NDQgbXVsdGlwbHkgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY0NSBtdWx0aXBseSAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjQ2IG11bHRpcGx5ICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2NDcgbXVsdGlwbHkgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY0OCBtdWx0aXBseSAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjQ5IG11bHRpcGx5ICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2NTAgbXVsdGlwbHkgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY1MSBtdWx0aXBseSAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjUyIG11bHRpcGx5IC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2NTMgbXVsdGlwbHkgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY1NCBtdWx0aXBseSAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjU1IG11bHRpcGx5ICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2NTYgbXVsdGlwbHkgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY1NyBtdWx0aXBseSAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjU4IG11bHRpcGx5ICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2NTkgbXVsdGlwbHkgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RkbXVsNjYxIG11bHRpcGx5ICBOYU45IC1JbmYgICAtPiAgTmFOOQorZGRtdWw2NjIgbXVsdGlwbHkgIE5hTjggIDk5OSAgIC0+ICBOYU44CitkZG11bDY2MyBtdWx0aXBseSAgTmFONzEgSW5mICAgLT4gIE5hTjcxCitkZG11bDY2NCBtdWx0aXBseSAgTmFONiAgTmFONSAgLT4gIE5hTjYKK2RkbXVsNjY1IG11bHRpcGx5IC1JbmYgICBOYU40ICAtPiAgTmFONAorZGRtdWw2NjYgbXVsdGlwbHkgLTk5OSAgIE5hTjMzIC0+ICBOYU4zMworZGRtdWw2NjcgbXVsdGlwbHkgIEluZiAgIE5hTjIgIC0+ICBOYU4yCisKK2RkbXVsNjcxIG11bHRpcGx5ICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjcyIG11bHRpcGx5ICBzTmFOOTggLTExICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjczIG11bHRpcGx5ICBzTmFOOTcgIE5hTiAgICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjc0IG11bHRpcGx5ICBzTmFOMTYgc05hTjk0ICAtPiAgTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjc1IG11bHRpcGx5ICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjc2IG11bHRpcGx5IC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjc3IG11bHRpcGx5ICAwODggICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjc4IG11bHRpcGx5ICBJbmYgICAgc05hTjkwICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjc5IG11bHRpcGx5ICBOYU4gICAgc05hTjg5ICAtPiAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworZGRtdWw2ODEgbXVsdGlwbHkgLU5hTjkgLUluZiAgIC0+IC1OYU45CitkZG11bDY4MiBtdWx0aXBseSAtTmFOOCAgOTk5ICAgLT4gLU5hTjgKK2RkbXVsNjgzIG11bHRpcGx5IC1OYU43MSBJbmYgICAtPiAtTmFONzEKK2RkbXVsNjg0IG11bHRpcGx5IC1OYU42IC1OYU41ICAtPiAtTmFONgorZGRtdWw2ODUgbXVsdGlwbHkgLUluZiAgLU5hTjQgIC0+IC1OYU40CitkZG11bDY4NiBtdWx0aXBseSAtOTk5ICAtTmFOMzMgLT4gLU5hTjMzCitkZG11bDY4NyBtdWx0aXBseSAgSW5mICAtTmFOMiAgLT4gLU5hTjIKKworZGRtdWw2OTEgbXVsdGlwbHkgLXNOYU45OSAtSW5mICAgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2OTIgbXVsdGlwbHkgLXNOYU45OCAtMTEgICAgIC0+IC1OYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2OTMgbXVsdGlwbHkgLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2OTQgbXVsdGlwbHkgLXNOYU4xNiAtc05hTjk0IC0+IC1OYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2OTUgbXVsdGlwbHkgLU5hTjk1ICAtc05hTjkzIC0+IC1OYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2OTYgbXVsdGlwbHkgLUluZiAgICAtc05hTjkyIC0+IC1OYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2OTcgbXVsdGlwbHkgIDA4OCAgICAtc05hTjkxIC0+IC1OYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2OTggbXVsdGlwbHkgIEluZiAgICAtc05hTjkwIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2OTkgbXVsdGlwbHkgLU5hTiAgICAtc05hTjg5IC0+IC1OYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCitkZG11bDcwMSBtdWx0aXBseSAtTmFOICAtSW5mICAgLT4gLU5hTgorZGRtdWw3MDIgbXVsdGlwbHkgLU5hTiAgIDk5OSAgIC0+IC1OYU4KK2RkbXVsNzAzIG11bHRpcGx5IC1OYU4gICBJbmYgICAtPiAtTmFOCitkZG11bDcwNCBtdWx0aXBseSAtTmFOICAtTmFOICAgLT4gLU5hTgorZGRtdWw3MDUgbXVsdGlwbHkgLUluZiAgLU5hTjAgIC0+IC1OYU4KK2RkbXVsNzA2IG11bHRpcGx5IC05OTkgIC1OYU4gICAtPiAtTmFOCitkZG11bDcwNyBtdWx0aXBseSAgSW5mICAtTmFOICAgLT4gLU5hTgorCitkZG11bDcxMSBtdWx0aXBseSAtc05hTiAgIC1JbmYgICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw3MTIgbXVsdGlwbHkgLXNOYU4gICAtMTEgICAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNzEzIG11bHRpcGx5IC1zTmFOMDAgIE5hTiAgICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDcxNCBtdWx0aXBseSAtc05hTiAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw3MTUgbXVsdGlwbHkgLU5hTiAgICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNzE2IG11bHRpcGx5IC1JbmYgICAgLXNOYU4gICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDcxNyBtdWx0aXBseSAgMDg4ICAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw3MTggbXVsdGlwbHkgIEluZiAgICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNzE5IG11bHRpcGx5IC1OYU4gICAgLXNOYU4gICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgLi4gbm90ZSBzdWJub3JtYWwgcmVzdWx0cworLS0gc2lnbnMKK2RkbXVsNzUxIG11bHRpcGx5ICAxZSsyNzcgIDFlKzMxMSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZG11bDc1MiBtdWx0aXBseSAgMWUrMjc3IC0xZSszMTEgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRtdWw3NTMgbXVsdGlwbHkgLTFlKzI3NyAgMWUrMzExIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsNzU0IG11bHRpcGx5IC0xZSsyNzcgLTFlKzMxMSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZG11bDc1NSBtdWx0aXBseSAgMWUtMjc3ICAxZS0zMTEgLT4gIDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZG11bDc1NiBtdWx0aXBseSAgMWUtMjc3IC0xZS0zMTEgLT4gLTBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZG11bDc1NyBtdWx0aXBseSAtMWUtMjc3ICAxZS0zMTEgLT4gLTBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZG11bDc1OCBtdWx0aXBseSAtMWUtMjc3IC0xZS0zMTEgLT4gIDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tICdzdWJub3JtYWwnIGJvdW5kYXJ5IChhbGwgaGFyZCB1bmRlcmZsb3cgb3Igb3ZlcmZsb3cgaW4gYmFzZSBhcml0aGVtdGljKQorZGRtdWw3NjAgbXVsdGlwbHkgMWUtMjkxIDFlLTEwMSAtPiAxRS0zOTIgU3Vibm9ybWFsCitkZG11bDc2MSBtdWx0aXBseSAxZS0yOTEgMWUtMTAyIC0+IDFFLTM5MyBTdWJub3JtYWwKK2RkbXVsNzYyIG11bHRpcGx5IDFlLTI5MSAxZS0xMDMgLT4gMUUtMzk0IFN1Ym5vcm1hbAorZGRtdWw3NjMgbXVsdGlwbHkgMWUtMjkxIDFlLTEwNCAtPiAxRS0zOTUgU3Vibm9ybWFsCitkZG11bDc2NCBtdWx0aXBseSAxZS0yOTEgMWUtMTA1IC0+IDFFLTM5NiBTdWJub3JtYWwKK2RkbXVsNzY1IG11bHRpcGx5IDFlLTI5MSAxZS0xMDYgLT4gMUUtMzk3IFN1Ym5vcm1hbAorZGRtdWw3NjYgbXVsdGlwbHkgMWUtMjkxIDFlLTEwNyAtPiAxRS0zOTggU3Vibm9ybWFsCitkZG11bDc2NyBtdWx0aXBseSAxZS0yOTEgMWUtMTA4IC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZG11bDc2OCBtdWx0aXBseSAxZS0yOTEgMWUtMTA5IC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZG11bDc2OSBtdWx0aXBseSAxZS0yOTEgMWUtMTEwIC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCistLSBbbm8gZXF1aXZhbGVudCBvZiAnc3Vibm9ybWFsJyBmb3Igb3ZlcmZsb3ddCitkZG11bDc3MCBtdWx0aXBseSAxZSs2MCAxZSszMjEgLT4gMS4wMDAwMDAwMDAwMDBFKzM4MSAgQ2xhbXBlZAorZGRtdWw3NzEgbXVsdGlwbHkgMWUrNjAgMWUrMzIyIC0+IDEuMDAwMDAwMDAwMDAwMEUrMzgyICBDbGFtcGVkCitkZG11bDc3MiBtdWx0aXBseSAxZSs2MCAxZSszMjMgLT4gMS4wMDAwMDAwMDAwMDAwMEUrMzgzICBDbGFtcGVkCitkZG11bDc3MyBtdWx0aXBseSAxZSs2MCAxZSszMjQgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAgQ2xhbXBlZAorZGRtdWw3NzQgbXVsdGlwbHkgMWUrNjAgMWUrMzI1IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRtdWw3NzUgbXVsdGlwbHkgMWUrNjAgMWUrMzI2IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRtdWw3NzYgbXVsdGlwbHkgMWUrNjAgMWUrMzI3IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRtdWw3NzcgbXVsdGlwbHkgMWUrNjAgMWUrMzI4IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRtdWw3NzggbXVsdGlwbHkgMWUrNjAgMWUrMzI5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRtdWw3NzkgbXVsdGlwbHkgMWUrNjAgMWUrMzMwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCitkZG11bDgwMSBtdWx0aXBseSAgMS4wMDAwRS0zOTQgIDEgICAgIC0+IDEuMDAwMEUtMzk0IFN1Ym5vcm1hbAorZGRtdWw4MDIgbXVsdGlwbHkgIDEuMDAwRS0zOTQgICAxZS0xICAtPiAxLjAwMEUtMzk1ICBTdWJub3JtYWwKK2RkbXVsODAzIG11bHRpcGx5ICAxLjAwRS0zOTQgICAgMWUtMiAgLT4gMS4wMEUtMzk2ICAgU3Vibm9ybWFsCitkZG11bDgwNCBtdWx0aXBseSAgMS4wRS0zOTQgICAgIDFlLTMgIC0+IDEuMEUtMzk3ICAgIFN1Ym5vcm1hbAorZGRtdWw4MDUgbXVsdGlwbHkgIDEuMEUtMzk0ICAgICAxZS00ICAtPiAxRS0zOTggICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkZG11bDgwNiBtdWx0aXBseSAgMS4zRS0zOTQgICAgIDFlLTQgIC0+IDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsODA3IG11bHRpcGx5ICAxLjVFLTM5NCAgICAgMWUtNCAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRtdWw4MDggbXVsdGlwbHkgIDEuN0UtMzk0ICAgICAxZS00ICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG11bDgwOSBtdWx0aXBseSAgMi4zRS0zOTQgICAgIDFlLTQgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsODEwIG11bHRpcGx5ICAyLjVFLTM5NCAgICAgMWUtNCAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRtdWw4MTEgbXVsdGlwbHkgIDIuN0UtMzk0ICAgICAxZS00ICAtPiAzRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG11bDgxMiBtdWx0aXBseSAgMS40OUUtMzk0ICAgIDFlLTQgIC0+IDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsODEzIG11bHRpcGx5ICAxLjUwRS0zOTQgICAgMWUtNCAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRtdWw4MTQgbXVsdGlwbHkgIDEuNTFFLTM5NCAgICAxZS00ICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG11bDgxNSBtdWx0aXBseSAgMi40OUUtMzk0ICAgIDFlLTQgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsODE2IG11bHRpcGx5ICAyLjUwRS0zOTQgICAgMWUtNCAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRtdWw4MTcgbXVsdGlwbHkgIDIuNTFFLTM5NCAgICAxZS00ICAtPiAzRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RkbXVsODE4IG11bHRpcGx5ICAxRS0zOTQgICAgICAgMWUtNCAgLT4gMUUtMzk4ICAgICBTdWJub3JtYWwKK2RkbXVsODE5IG11bHRpcGx5ICAzRS0zOTQgICAgICAgMWUtNSAgLT4gMEUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZG11bDgyMCBtdWx0aXBseSAgNUUtMzk0ICAgICAgIDFlLTUgIC0+IDBFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRtdWw4MjEgbXVsdGlwbHkgIDdFLTM5NCAgICAgICAxZS01ICAtPiAxRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG11bDgyMiBtdWx0aXBseSAgOUUtMzk0ICAgICAgIDFlLTUgIC0+IDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsODIzIG11bHRpcGx5ICA5LjlFLTM5NCAgICAgMWUtNSAgLT4gMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkZG11bDgyNCBtdWx0aXBseSAgMUUtMzk0ICAgICAgLTFlLTQgIC0+IC0xRS0zOTggICAgU3Vibm9ybWFsCitkZG11bDgyNSBtdWx0aXBseSAgM0UtMzk0ICAgICAgLTFlLTUgIC0+IC0wRS0zOTggICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRtdWw4MjYgbXVsdGlwbHkgLTVFLTM5NCAgICAgICAxZS01ICAtPiAtMEUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkbXVsODI3IG11bHRpcGx5ICA3RS0zOTQgICAgICAtMWUtNSAgLT4gLTFFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRtdWw4MjggbXVsdGlwbHkgLTlFLTM5NCAgICAgICAxZS01ICAtPiAtMUUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG11bDgyOSBtdWx0aXBseSAgOS45RS0zOTQgICAgLTFlLTUgIC0+IC0xRS0zOTggICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsODMwIG11bHRpcGx5ICAzLjBFLTM5NCAgICAtMWUtNSAgLT4gLTBFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK2RkbXVsODMxIG11bHRpcGx5ICAxLjBFLTE5OSAgICAgMWUtMjAwIC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZG11bDgzMiBtdWx0aXBseSAgMS4wRS0xOTkgICAgIDFlLTE5OSAtPiAxRS0zOTggICAgU3Vibm9ybWFsIFJvdW5kZWQKK2RkbXVsODMzIG11bHRpcGx5ICAxLjBFLTE5OSAgICAgMWUtMTk4IC0+IDEuMEUtMzk3ICAgIFN1Ym5vcm1hbAorZGRtdWw4MzQgbXVsdGlwbHkgIDIuMEUtMTk5ICAgICAyZS0xOTggLT4gNC4wRS0zOTcgICAgU3Vibm9ybWFsCitkZG11bDgzNSBtdWx0aXBseSAgNC4wRS0xOTkgICAgIDRlLTE5OCAtPiAxLjYwRS0zOTYgICBTdWJub3JtYWwKK2RkbXVsODM2IG11bHRpcGx5IDEwLjBFLTE5OSAgICAxMGUtMTk4IC0+IDEuMDAwRS0zOTUgIFN1Ym5vcm1hbAorZGRtdWw4MzcgbXVsdGlwbHkgMzAuMEUtMTk5ICAgIDMwZS0xOTggLT4gOS4wMDBFLTM5NSAgU3Vibm9ybWFsCitkZG11bDgzOCBtdWx0aXBseSA0MC4wRS0xOTkgICAgNDBlLTE4OCAtPiAxLjYwMDBFLTM4NCBTdWJub3JtYWwKK2RkbXVsODM5IG11bHRpcGx5IDQwLjBFLTE5OSAgICA0MGUtMTg3IC0+IDEuNjAwMEUtMzgzCitkZG11bDg0MCBtdWx0aXBseSA0MC4wRS0xOTkgICAgNDBlLTE4NiAtPiAxLjYwMDBFLTM4MgorCistLSBMb25nIG9wZXJhbmQgb3ZlcmZsb3cgbWF5IGJlIGEgZGlmZmVyZW50IHBhdGgKK2RkbXVsODcwIG11bHRpcGx5IDEwMCAgOS45OTlFKzM4MyAgICAgICAgIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2RkbXVsODcxIG11bHRpcGx5IDEwMCAtOS45OTlFKzM4MyAgICAgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZGRtdWw4NzIgbXVsdGlwbHkgICAgICA5Ljk5OUUrMzgzIDEwMCAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitkZG11bDg3MyBtdWx0aXBseSAgICAgLTkuOTk5RSszODMgMTAwIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworLS0gY2hlY2sgZm9yIGRvdWJsZS1yb3VuZGVkIHN1Ym5vcm1hbHMKK2RkbXVsODgxIG11bHRpcGx5ICAxLjIzNDdFLTM1NSAxLjIzNDdFLTQwICAtPiAgMS41MjRFLTM5NSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRtdWw4ODIgbXVsdGlwbHkgIDEuMjM0RS0zNTUgMS4yMzRFLTQwICAgIC0+ICAxLjUyM0UtMzk1IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkZG11bDg4MyBtdWx0aXBseSAgMS4yM0UtMzU1ICAxLjIzRS00MCAgICAgLT4gIDEuNTEzRS0zOTUgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkbXVsODg0IG11bHRpcGx5ICAxLjJFLTM1NSAgIDEuMkUtNDAgICAgICAtPiAgMS40NEUtMzk1ICBTdWJub3JtYWwKK2RkbXVsODg1IG11bHRpcGx5ICAxLjJFLTM1NSAgIDEuMkUtNDEgICAgICAtPiAgMS40NEUtMzk2ICBTdWJub3JtYWwKK2RkbXVsODg2IG11bHRpcGx5ICAxLjJFLTM1NSAgIDEuMkUtNDIgICAgICAtPiAgMS40RS0zOTcgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZGRtdWw4ODcgbXVsdGlwbHkgIDEuMkUtMzU1ICAgMS4zRS00MiAgICAgIC0+ICAxLjZFLTM5NyAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkZG11bDg4OCBtdWx0aXBseSAgMS4zRS0zNTUgICAxLjNFLTQyICAgICAgLT4gIDEuN0UtMzk3ICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2RkbXVsODg5IG11bHRpcGx5ICAxLjNFLTM1NSAgIDEuM0UtNDMgICAgICAtPiAgICAyRS0zOTggICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZGRtdWw4OTAgbXVsdGlwbHkgIDEuM0UtMzU2ICAgMS4zRS00MyAgICAgIC0+ICAgIDBFLTM5OCAgIENsYW1wZWQgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKworZGRtdWw4OTEgbXVsdGlwbHkgIDEuMjM0NUUtMzkgICAxLjIzNEUtMzU1IC0+ICAxLjUyMzRFLTM5NCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRtdWw4OTIgbXVsdGlwbHkgIDEuMjM0NTZFLTM5ICAxLjIzNEUtMzU1IC0+ICAxLjUyMzRFLTM5NCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRtdWw4OTMgbXVsdGlwbHkgIDEuMjM0NUUtNDAgICAxLjIzNEUtMzU1IC0+ICAxLjUyM0UtMzk1ICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRtdWw4OTQgbXVsdGlwbHkgIDEuMjM0NTZFLTQwICAxLjIzNEUtMzU1IC0+ICAxLjUyM0UtMzk1ICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRtdWw4OTUgbXVsdGlwbHkgIDEuMjM0NUUtNDEgICAxLjIzNEUtMzU1IC0+ICAxLjUyRS0zOTYgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRtdWw4OTYgbXVsdGlwbHkgIDEuMjM0NTZFLTQxICAxLjIzNEUtMzU1IC0+ICAxLjUyRS0zOTYgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCistLSBOb3cgZXhwbG9yZSB0aGUgY2FzZSB3aGVyZSB3ZSBnZXQgYSBub3JtYWwgcmVzdWx0IHdpdGggVW5kZXJmbG93CistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAyMzQ1Njc4OTAxMjM0NTYKK2RkbXVsOTAwIG11bHRpcGx5ICAwLjMwMDAwMDAwMDBFLTE5MSAwLjMwMDAwMDAwMDBFLTE5MSAtPiA5LjAwMDAwMDAwMDAwMDAwRS0zODQgU3Vibm9ybWFsIFJvdW5kZWQKK2RkbXVsOTAxIG11bHRpcGx5ICAwLjMwMDAwMDAwMDFFLTE5MSAwLjMwMDAwMDAwMDFFLTE5MSAtPiA5LjAwMDAwMDAwNjAwMDAwRS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2RkbXVsOTAyIG11bHRpcGx5ICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTkgICAgLT4gOS45OTk5OTk5OTk5OTAwMEUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitkZG11bDkwMyBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OSAgIC0+IDkuOTk5OTk5OTk5OTk5MDBFLTM4NCBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZGRtdWw5MDQgbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTk5ICAtPiA5Ljk5OTk5OTk5OTk5OTkwRS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2RkbXVsOTA1IG11bHRpcGx5ICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5OTkgLT4gOS45OTk5OTk5OTk5OTk5OUUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCistLSBUaGUgbmV4dCByb3VuZHMgdG8gTm1pbiAoYioqZW1pbik7IHRoaXMgaXMgdGhlIGRpc3Rpbmd1aXNoaW5nIGNhc2UKKy0tIGZvciBkZXRlY3RpbmcgdGluaW5lc3MgKGJlZm9yZSBvciBhZnRlciByb3VuZGluZykgLS0gaWYgYWZ0ZXIKKy0tIHJvdW5kaW5nIHRoZW4gdGhlIHJlc3VsdCB3b3VsZCBiZSB0aGUgc2FtZSwgYnV0IHRoZSBVbmRlcmZsb3cgZmxhZworLS0gd291bGQgbm90IGJlIHNldAorZGRtdWw5MDYgbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTk5OTkgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKKy0tIHByb3ZlIHRob3NlIG9wZXJhbmRzIHdlcmUgZXhhY3QKK2RkbXVsOTA3IG11bHRpcGx5ICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAxICAgICAgICAgICAgICAgICAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzCitkZG11bDkwOCBtdWx0aXBseSAgICAgICAgICAgICAgICAgICAgICAgMSAgMC4wOTk5OTk5OTk5OTk5OTk5OSAgICAgLT4gMC4wOTk5OTk5OTk5OTk5OTk5OQorCistLSByZWR1Y2luZyB0aW5pZXN0CitkZG11bDkxMCBtdWx0aXBseSAxZS0zOTggMC45OSAtPiAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2RkbXVsOTExIG11bHRpcGx5IDFlLTM5OCAwLjc1IC0+IDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZGRtdWw5MTIgbXVsdGlwbHkgMWUtMzk4IDAuNSAgLT4gMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2RkbXVsOTEzIG11bHRpcGx5IDFlLTM5OCAwLjI1IC0+IDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitkZG11bDkxNCBtdWx0aXBseSAxZS0zOTggMC4wMSAtPiAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCistLSBodWdlc3QKK2RkbXVsOTIwIG11bHRpcGx5ICA5OTk5OTk5OTk5OTk5OTk5IDk5OTk5OTk5OTk5OTk5OTkgLT4gOS45OTk5OTk5OTk5OTk5OThFKzMxIEluZXhhY3QgUm91bmRlZAorCistLSBwb3dlci1vZi10ZW4gZWRnZSBjYXNlcworZGRtdWwxMDAxIG11bHRpcGx5ICAxICAgICAgMTAgICAgICAgICAgICAgICAtPiAxMAorZGRtdWwxMDAyIG11bHRpcGx5ICAxICAgICAgMTAwICAgICAgICAgICAgICAtPiAxMDAKK2RkbXVsMTAwMyBtdWx0aXBseSAgMSAgICAgIDEwMDAgICAgICAgICAgICAgLT4gMTAwMAorZGRtdWwxMDA0IG11bHRpcGx5ICAxICAgICAgMTAwMDAgICAgICAgICAgICAtPiAxMDAwMAorZGRtdWwxMDA1IG11bHRpcGx5ICAxICAgICAgMTAwMDAwICAgICAgICAgICAtPiAxMDAwMDAKK2RkbXVsMTAwNiBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAgICAgICAgICAgLT4gMTAwMDAwMAorZGRtdWwxMDA3IG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAgICAgICAgICAtPiAxMDAwMDAwMAorZGRtdWwxMDA4IG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwICAgICAgICAtPiAxMDAwMDAwMDAKK2RkbXVsMTAwOSBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAgICAgICAgLT4gMTAwMDAwMDAwMAorZGRtdWwxMDEwIG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAgICAgICAtPiAxMDAwMDAwMDAwMAorZGRtdWwxMDExIG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAwICAgICAtPiAxMDAwMDAwMDAwMDAKK2RkbXVsMTAxMiBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAwMDAgICAgLT4gMTAwMDAwMDAwMDAwMAorZGRtdWwxMDEzIG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAwMDAgICAtPiAxMDAwMDAwMDAwMDAwMAorZGRtdWwxMDE0IG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAwMDAwICAtPiAxMDAwMDAwMDAwMDAwMDAKK2RkbXVsMTAxNSBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMAorZGRtdWwxMDIxIG11bHRpcGx5ICAxMCAgICAgMSAgICAgICAgICAgICAgICAtPiAxMAorZGRtdWwxMDIyIG11bHRpcGx5ICAxMCAgICAgMTAgICAgICAgICAgICAgICAtPiAxMDAKK2RkbXVsMTAyMyBtdWx0aXBseSAgMTAgICAgIDEwMCAgICAgICAgICAgICAgLT4gMTAwMAorZGRtdWwxMDI0IG11bHRpcGx5ICAxMCAgICAgMTAwMCAgICAgICAgICAgICAtPiAxMDAwMAorZGRtdWwxMDI1IG11bHRpcGx5ICAxMCAgICAgMTAwMDAgICAgICAgICAgICAtPiAxMDAwMDAKK2RkbXVsMTAyNiBtdWx0aXBseSAgMTAgICAgIDEwMDAwMCAgICAgICAgICAgLT4gMTAwMDAwMAorZGRtdWwxMDI3IG11bHRpcGx5ICAxMCAgICAgMTAwMDAwMCAgICAgICAgICAtPiAxMDAwMDAwMAorZGRtdWwxMDI4IG11bHRpcGx5ICAxMCAgICAgMTAwMDAwMDAgICAgICAgICAtPiAxMDAwMDAwMDAKK2RkbXVsMTAyOSBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMCAgICAgICAgLT4gMTAwMDAwMDAwMAorZGRtdWwxMDMwIG11bHRpcGx5ICAxMCAgICAgMTAwMDAwMDAwMCAgICAgICAtPiAxMDAwMDAwMDAwMAorZGRtdWwxMDMxIG11bHRpcGx5ICAxMCAgICAgMTAwMDAwMDAwMDAgICAgICAtPiAxMDAwMDAwMDAwMDAKK2RkbXVsMTAzMiBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwMCAgICAgLT4gMTAwMDAwMDAwMDAwMAorZGRtdWwxMDMzIG11bHRpcGx5ICAxMCAgICAgMTAwMDAwMDAwMDAwMCAgICAtPiAxMDAwMDAwMDAwMDAwMAorZGRtdWwxMDM0IG11bHRpcGx5ICAxMCAgICAgMTAwMDAwMDAwMDAwMDAgICAtPiAxMDAwMDAwMDAwMDAwMDAKK2RkbXVsMTAzNSBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwMDAwMCAgLT4gMTAwMDAwMDAwMDAwMDAwMAorZGRtdWwxMDQxIG11bHRpcGx5ICAxMDAgICAgMC4xICAgICAgICAgICAgICAtPiAxMC4wCitkZG11bDEwNDIgbXVsdGlwbHkgIDEwMCAgICAxICAgICAgICAgICAgICAgIC0+IDEwMAorZGRtdWwxMDQzIG11bHRpcGx5ICAxMDAgICAgMTAgICAgICAgICAgICAgICAtPiAxMDAwCitkZG11bDEwNDQgbXVsdGlwbHkgIDEwMCAgICAxMDAgICAgICAgICAgICAgIC0+IDEwMDAwCitkZG11bDEwNDUgbXVsdGlwbHkgIDEwMCAgICAxMDAwICAgICAgICAgICAgIC0+IDEwMDAwMAorZGRtdWwxMDQ2IG11bHRpcGx5ICAxMDAgICAgMTAwMDAgICAgICAgICAgICAtPiAxMDAwMDAwCitkZG11bDEwNDcgbXVsdGlwbHkgIDEwMCAgICAxMDAwMDAgICAgICAgICAgIC0+IDEwMDAwMDAwCitkZG11bDEwNDggbXVsdGlwbHkgIDEwMCAgICAxMDAwMDAwICAgICAgICAgIC0+IDEwMDAwMDAwMAorZGRtdWwxMDQ5IG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAgICAgICAgICAtPiAxMDAwMDAwMDAwCitkZG11bDEwNTAgbXVsdGlwbHkgIDEwMCAgICAxMDAwMDAwMDAgICAgICAgIC0+IDEwMDAwMDAwMDAwCitkZG11bDEwNTEgbXVsdGlwbHkgIDEwMCAgICAxMDAwMDAwMDAwICAgICAgIC0+IDEwMDAwMDAwMDAwMAorZGRtdWwxMDUyIG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMDAgICAgICAtPiAxMDAwMDAwMDAwMDAwCitkZG11bDEwNTMgbXVsdGlwbHkgIDEwMCAgICAxMDAwMDAwMDAwMDAgICAgIC0+IDEwMDAwMDAwMDAwMDAwCitkZG11bDEwNTQgbXVsdGlwbHkgIDEwMCAgICAxMDAwMDAwMDAwMDAwICAgIC0+IDEwMDAwMDAwMDAwMDAwMAorZGRtdWwxMDU1IG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMDAwMDAgICAtPiAxMDAwMDAwMDAwMDAwMDAwCitkZG11bDEwNjEgbXVsdGlwbHkgIDEwMDAgICAwLjAxICAgICAgICAgICAgIC0+IDEwLjAwCitkZG11bDEwNjIgbXVsdGlwbHkgIDEwMDAgICAwLjEgICAgICAgICAgICAgIC0+IDEwMC4wCitkZG11bDEwNjMgbXVsdGlwbHkgIDEwMDAgICAxICAgICAgICAgICAgICAgIC0+IDEwMDAKK2RkbXVsMTA2NCBtdWx0aXBseSAgMTAwMCAgIDEwICAgICAgICAgICAgICAgLT4gMTAwMDAKK2RkbXVsMTA2NSBtdWx0aXBseSAgMTAwMCAgIDEwMCAgICAgICAgICAgICAgLT4gMTAwMDAwCitkZG11bDEwNjYgbXVsdGlwbHkgIDEwMDAgICAxMDAwICAgICAgICAgICAgIC0+IDEwMDAwMDAKK2RkbXVsMTA2NyBtdWx0aXBseSAgMTAwMCAgIDEwMDAwICAgICAgICAgICAgLT4gMTAwMDAwMDAKK2RkbXVsMTA2OCBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMCAgICAgICAgICAgLT4gMTAwMDAwMDAwCitkZG11bDEwNjkgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwICAgICAgICAgIC0+IDEwMDAwMDAwMDAKK2RkbXVsMTA3MCBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwICAgICAgICAgLT4gMTAwMDAwMDAwMDAKK2RkbXVsMTA3MSBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwMCAgICAgICAgLT4gMTAwMDAwMDAwMDAwCitkZG11bDEwNzIgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwMDAwICAgICAgIC0+IDEwMDAwMDAwMDAwMDAKK2RkbXVsMTA3MyBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwMDAwICAgICAgLT4gMTAwMDAwMDAwMDAwMDAKK2RkbXVsMTA3NCBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwMDAwMCAgICAgLT4gMTAwMDAwMDAwMDAwMDAwCitkZG11bDEwNzUgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwMDAwMDAwICAgIC0+IDEwMDAwMDAwMDAwMDAwMDAKK2RkbXVsMTA4MSBtdWx0aXBseSAgMTAwMDAgIDAuMDAxICAgICAgICAgICAgLT4gMTAuMDAwCitkZG11bDEwODIgbXVsdGlwbHkgIDEwMDAwICAwLjAxICAgICAgICAgICAgIC0+IDEwMC4wMAorZGRtdWwxMDgzIG11bHRpcGx5ICAxMDAwMCAgMC4xICAgICAgICAgICAgICAtPiAxMDAwLjAKK2RkbXVsMTA4NCBtdWx0aXBseSAgMTAwMDAgIDEgICAgICAgICAgICAgICAgLT4gMTAwMDAKK2RkbXVsMTA4NSBtdWx0aXBseSAgMTAwMDAgIDEwICAgICAgICAgICAgICAgLT4gMTAwMDAwCitkZG11bDEwODYgbXVsdGlwbHkgIDEwMDAwICAxMDAgICAgICAgICAgICAgIC0+IDEwMDAwMDAKK2RkbXVsMTA4NyBtdWx0aXBseSAgMTAwMDAgIDEwMDAgICAgICAgICAgICAgLT4gMTAwMDAwMDAKK2RkbXVsMTA4OCBtdWx0aXBseSAgMTAwMDAgIDEwMDAwICAgICAgICAgICAgLT4gMTAwMDAwMDAwCitkZG11bDEwODkgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAgICAgICAgICAgIC0+IDEwMDAwMDAwMDAKK2RkbXVsMTA5MCBtdWx0aXBseSAgMTAwMDAgIDEwMDAwMDAgICAgICAgICAgLT4gMTAwMDAwMDAwMDAKK2RkbXVsMTA5MSBtdWx0aXBseSAgMTAwMDAgIDEwMDAwMDAwICAgICAgICAgLT4gMTAwMDAwMDAwMDAwCitkZG11bDEwOTIgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMDAgICAgICAgIC0+IDEwMDAwMDAwMDAwMDAKK2RkbXVsMTA5MyBtdWx0aXBseSAgMTAwMDAgIDEwMDAwMDAwMDAgICAgICAgLT4gMTAwMDAwMDAwMDAwMDAKK2RkbXVsMTA5NCBtdWx0aXBseSAgMTAwMDAgIDEwMDAwMDAwMDAwICAgICAgLT4gMTAwMDAwMDAwMDAwMDAwCitkZG11bDEwOTUgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMDAwMDAgICAgIC0+IDEwMDAwMDAwMDAwMDAwMDAKKworZGRtdWwxMDk3IG11bHRpcGx5ICAxMDAwMCAgIDk5OTk5OTk5OTk5ICAgICAtPiAgOTk5OTk5OTk5OTkwMDAwCitkZG11bDEwOTggbXVsdGlwbHkgIDEwMDAwICAgOTk5OTk5OTk5OTkgICAgIC0+ICA5OTk5OTk5OTk5OTAwMDAKKworCistLSBOdWxsIHRlc3RzCitkZG11bDk5OTAgbXVsdGlwbHkgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDk5OTEgbXVsdGlwbHkgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGROZXh0TWludXMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGROZXh0TWludXMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWY1OGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE5leHRNaW51cy5kZWNUZXN0CkBAIC0wLDAgKzEsMTI2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkTmV4dE1pbnVzLmRlY1Rlc3QgLS0gZGVjRG91YmxlIG5leHQgdGhhdCBpcyBsZXNzIFs3NTRyIG5leHRkb3duXSAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNEb3VibGVzLgorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2RkbmV4dG0wMDEgbmV4dG1pbnVzICAwLjk5OTk5OTk5OTk5OTk5OTUgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTQKK2RkbmV4dG0wMDIgbmV4dG1pbnVzICAwLjk5OTk5OTk5OTk5OTk5OTYgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTUKK2RkbmV4dG0wMDMgbmV4dG1pbnVzICAwLjk5OTk5OTk5OTk5OTk5OTcgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTYKK2RkbmV4dG0wMDQgbmV4dG1pbnVzICAwLjk5OTk5OTk5OTk5OTk5OTggLT4gICAwLjk5OTk5OTk5OTk5OTk5OTcKK2RkbmV4dG0wMDUgbmV4dG1pbnVzICAwLjk5OTk5OTk5OTk5OTk5OTkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTgKK2RkbmV4dG0wMDYgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMCAgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTkKK2RkbmV4dG0wMDcgbmV4dG1pbnVzICAxLjAgICAgICAgICAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0bTAwOCBuZXh0bWludXMgIDEgICAgICAgICAgIC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHRtMDA5IG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDEgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAKK2RkbmV4dG0wMTAgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMiAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0bTAxMSBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDAzICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAyCitkZG5leHRtMDEyIG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDQgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDMKK2RkbmV4dG0wMTMgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwNSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwNAorZGRuZXh0bTAxNCBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDA2ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDA1CitkZG5leHRtMDE1IG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDcgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDYKK2RkbmV4dG0wMTYgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwOCAgLT4gICAxLjAwMDAwMDAwMDAwMDAwNworZGRuZXh0bTAxNyBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDA5ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDA4CitkZG5leHRtMDE4IG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMTAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDkKK2RkbmV4dG0wMTkgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAxMSAgLT4gICAxLjAwMDAwMDAwMDAwMDAxMAorZGRuZXh0bTAyMCBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDEyICAtPiAgIDEuMDAwMDAwMDAwMDAwMDExCisKK2RkbmV4dG0wMjEgbmV4dG1pbnVzIC0wLjk5OTk5OTk5OTk5OTk5OTUgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTYKK2RkbmV4dG0wMjIgbmV4dG1pbnVzIC0wLjk5OTk5OTk5OTk5OTk5OTYgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTcKK2RkbmV4dG0wMjMgbmV4dG1pbnVzIC0wLjk5OTk5OTk5OTk5OTk5OTcgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTgKK2RkbmV4dG0wMjQgbmV4dG1pbnVzIC0wLjk5OTk5OTk5OTk5OTk5OTggLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTkKK2RkbmV4dG0wMjUgbmV4dG1pbnVzIC0wLjk5OTk5OTk5OTk5OTk5OTkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMAorZGRuZXh0bTAyNiBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDAwICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHRtMDI3IG5leHRtaW51cyAtMS4wICAgICAgICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0bTAyOCBuZXh0bWludXMgLTEgICAgICAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDEKK2RkbmV4dG0wMjkgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwMSAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMgorZGRuZXh0bTAzMCBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDAyICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAzCitkZG5leHRtMDMxIG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDMgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDQKK2RkbmV4dG0wMzIgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwNCAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwNQorZGRuZXh0bTAzMyBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDA1ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDA2CitkZG5leHRtMDM0IG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDYgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDcKK2RkbmV4dG0wMzUgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwNyAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwOAorZGRuZXh0bTAzNiBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDA4ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDA5CitkZG5leHRtMDM3IG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDkgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMTAKK2RkbmV4dG0wMzggbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAxMCAgLT4gIC0xLjAwMDAwMDAwMDAwMDAxMQorZGRuZXh0bTAzOSBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDExICAtPiAgLTEuMDAwMDAwMDAwMDAwMDEyCisKKy0tIHVsdHJhLXRpbnkgaW5wdXRzCitkZG5leHRtMDYyIG5leHRtaW51cyAgMUUtMzk4ICAgICAgICAgLT4gICAwRS0zOTgKK2RkbmV4dG0wNjUgbmV4dG1pbnVzIC0xRS0zOTggICAgICAgICAtPiAgLTJFLTM5OAorCistLSBaZXJvcworZGRuZXh0bTEwMCBuZXh0bWludXMgLTAgICAgICAgICAgIC0+IC0xRS0zOTgKK2RkbmV4dG0xMDEgbmV4dG1pbnVzICAwICAgICAgICAgICAtPiAtMUUtMzk4CitkZG5leHRtMTAyIG5leHRtaW51cyAgMC4wMCAgICAgICAgLT4gLTFFLTM5OAorZGRuZXh0bTEwMyBuZXh0bWludXMgLTAuMDAgICAgICAgIC0+IC0xRS0zOTgKK2RkbmV4dG0xMDQgbmV4dG1pbnVzICAwRS0zMDAgICAgICAtPiAtMUUtMzk4CitkZG5leHRtMTA1IG5leHRtaW51cyAgMEUrMzAwICAgICAgLT4gLTFFLTM5OAorZGRuZXh0bTEwNiBuZXh0bWludXMgIDBFKzMwMDAwICAgIC0+IC0xRS0zOTgKK2RkbmV4dG0xMDcgbmV4dG1pbnVzIC0wRSszMDAwMCAgICAtPiAtMUUtMzk4CisKKy0tIHNwZWNpYWxzCitkZG5leHRtMTUwIG5leHRtaW51cyAgIEluZiAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0bTE1MSBuZXh0bWludXMgIC1JbmYgICAgLT4gLUluZmluaXR5CitkZG5leHRtMTUyIG5leHRtaW51cyAgIE5hTiAgICAtPiAgTmFOCitkZG5leHRtMTUzIG5leHRtaW51cyAgc05hTiAgICAtPiAgTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dG0xNTQgbmV4dG1pbnVzICAgTmFONzcgIC0+ICBOYU43NworZGRuZXh0bTE1NSBuZXh0bWludXMgIHNOYU44OCAgLT4gIE5hTjg4IEludmFsaWRfb3BlcmF0aW9uCitkZG5leHRtMTU2IG5leHRtaW51cyAgLU5hTiAgICAtPiAtTmFOCitkZG5leHRtMTU3IG5leHRtaW51cyAtc05hTiAgICAtPiAtTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dG0xNTggbmV4dG1pbnVzICAtTmFONzcgIC0+IC1OYU43NworZGRuZXh0bTE1OSBuZXh0bWludXMgLXNOYU44OCAgLT4gLU5hTjg4IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5tYXgsIE5taW4sIE50aW55LCBzdWJub3JtYWxzCitkZG5leHRtMTcwIG5leHRtaW51cyAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC0+IDkuOTk5OTk5OTk5OTk5OTk4RSszODQKK2RkbmV4dG0xNzEgbmV4dG1pbnVzICA5Ljk5OTk5OTk5OTk5OTk5OEUrMzg0ICAgLT4gOS45OTk5OTk5OTk5OTk5OTdFKzM4NAorZGRuZXh0bTE3MiBuZXh0bWludXMgIDFFLTM4MyAgICAgICAgICAgICAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5RS0zODQKK2RkbmV4dG0xNzMgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgLT4gOS45OTk5OTk5OTk5OTk5OUUtMzg0CitkZG5leHRtMTc0IG5leHRtaW51cyAgOUUtMzk4ICAgICAgICAgICAgICAgICAgIC0+IDhFLTM5OAorZGRuZXh0bTE3NSBuZXh0bWludXMgIDkuOUUtMzk3ICAgICAgICAgICAgICAgICAtPiA5LjhFLTM5NworZGRuZXh0bTE3NiBuZXh0bWludXMgIDkuOTk5OTk5OTk5OTlFLTM4NyAgICAgICAtPiA5Ljk5OTk5OTk5OTk4RS0zODcKK2RkbmV4dG0xNzcgbmV4dG1pbnVzICA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgICAgLT4gOS45OTk5OTk5OTk5OTk5OEUtMzg0CitkZG5leHRtMTc4IG5leHRtaW51cyAgOS45OTk5OTk5OTk5OTk5OEUtMzg0ICAgIC0+IDkuOTk5OTk5OTk5OTk5OTdFLTM4NAorZGRuZXh0bTE3OSBuZXh0bWludXMgIDkuOTk5OTk5OTk5OTk5OTdFLTM4NCAgICAtPiA5Ljk5OTk5OTk5OTk5OTk2RS0zODQKK2RkbmV4dG0xODAgbmV4dG1pbnVzICAwRS0zOTggICAgICAgICAgICAgICAgICAgLT4gLTFFLTM5OAorZGRuZXh0bTE4MSBuZXh0bWludXMgIDFFLTM5OCAgICAgICAgICAgICAgICAgICAtPiAwRS0zOTgKK2RkbmV4dG0xODIgbmV4dG1pbnVzICAyRS0zOTggICAgICAgICAgICAgICAgICAgLT4gMUUtMzk4CisKK2RkbmV4dG0xODMgbmV4dG1pbnVzICAtMEUtMzk4ICAgICAgICAgICAgICAgICAgLT4gLTFFLTM5OAorZGRuZXh0bTE4NCBuZXh0bWludXMgIC0xRS0zOTggICAgICAgICAgICAgICAgICAtPiAtMkUtMzk4CitkZG5leHRtMTg1IG5leHRtaW51cyAgLTJFLTM5OCAgICAgICAgICAgICAgICAgIC0+IC0zRS0zOTgKK2RkbmV4dG0xODYgbmV4dG1pbnVzICAtMTBFLTM5OCAgICAgICAgICAgICAgICAgLT4gLTEuMUUtMzk3CitkZG5leHRtMTg3IG5leHRtaW51cyAgLTEwMEUtMzk4ICAgICAgICAgICAgICAgIC0+IC0xLjAxRS0zOTYKK2RkbmV4dG0xODggbmV4dG1pbnVzICAtMTAwMDAwRS0zOTggICAgICAgICAgICAgLT4gLTEuMDAwMDFFLTM5MworZGRuZXh0bTE4OSBuZXh0bWludXMgIC0xLjAwMDAwMDAwMDAwRS0zODMgICAgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDFFLTM4MworZGRuZXh0bTE5MCBuZXh0bWludXMgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAtMS4wMDAwMDAwMDAwMDAwMDFFLTM4MworZGRuZXh0bTE5MSBuZXh0bWludXMgIC0xRS0zODMgICAgICAgICAgICAgICAgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDFFLTM4MworZGRuZXh0bTE5MiBuZXh0bWludXMgIC05Ljk5OTk5OTk5OTk5OTk5OEUrMzg0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0bTE5MyBuZXh0bWludXMgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAtSW5maW5pdHkKKworLS0gTnVsbCB0ZXN0cworZGRuZXh0bTkwMCBuZXh0bWludXMgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGROZXh0UGx1cy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE5leHRQbHVzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxZGZiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGROZXh0UGx1cy5kZWNUZXN0CkBAIC0wLDAgKzEsMTI0IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkTmV4dFBsdXMuZGVjVGVzdCAtLSBkZWNEb3VibGUgbmV4dCB0aGF0IGlzIGdyZWF0ZXIgWzc1NHIgbmV4dHVwXSAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNEb3VibGVzLgorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2RkbmV4dHAwMDEgbmV4dHBsdXMgIDAuOTk5OTk5OTk5OTk5OTk5NSAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5NgorZGRuZXh0cDAwMiBuZXh0cGx1cyAgMC45OTk5OTk5OTk5OTk5OTk2IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk3CitkZG5leHRwMDAzIG5leHRwbHVzICAwLjk5OTk5OTk5OTk5OTk5OTcgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTgKK2RkbmV4dHAwMDQgbmV4dHBsdXMgIDAuOTk5OTk5OTk5OTk5OTk5OCAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0cDAwNSBuZXh0cGx1cyAgMC45OTk5OTk5OTk5OTk5OTk5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAKK2RkbmV4dHAwMDYgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAwICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHRwMDA3IG5leHRwbHVzICAxLjAgICAgICAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHRwMDA4IG5leHRwbHVzICAxICAgICAgICAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHRwMDA5IG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwMSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMgorZGRuZXh0cDAxMCBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDIgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDMKK2RkbmV4dHAwMTEgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAzICAtPiAgIDEuMDAwMDAwMDAwMDAwMDA0CitkZG5leHRwMDEyIG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwNCAgLT4gICAxLjAwMDAwMDAwMDAwMDAwNQorZGRuZXh0cDAxMyBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDUgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDYKK2RkbmV4dHAwMTQgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDA2ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDA3CitkZG5leHRwMDE1IG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwNyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwOAorZGRuZXh0cDAxNiBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDggIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDkKK2RkbmV4dHAwMTcgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDA5ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDEwCitkZG5leHRwMDE4IG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAxMCAgLT4gICAxLjAwMDAwMDAwMDAwMDAxMQorZGRuZXh0cDAxOSBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMTEgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMTIKKworZGRuZXh0cDAyMSBuZXh0cGx1cyAtMC45OTk5OTk5OTk5OTk5OTk1IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk0CitkZG5leHRwMDIyIG5leHRwbHVzIC0wLjk5OTk5OTk5OTk5OTk5OTYgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTUKK2RkbmV4dHAwMjMgbmV4dHBsdXMgLTAuOTk5OTk5OTk5OTk5OTk5NyAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5NgorZGRuZXh0cDAyNCBuZXh0cGx1cyAtMC45OTk5OTk5OTk5OTk5OTk4IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk3CitkZG5leHRwMDI1IG5leHRwbHVzIC0wLjk5OTk5OTk5OTk5OTk5OTkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTgKK2RkbmV4dHAwMjYgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDAwICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0cDAyNyBuZXh0cGx1cyAtMS4wICAgICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTkKK2RkbmV4dHAwMjggbmV4dHBsdXMgLTEgICAgICAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHRwMDI5IG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwMSAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMAorZGRuZXh0cDAzMCBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDIgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDEKK2RkbmV4dHAwMzEgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDAzICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAyCitkZG5leHRwMDMyIG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwNCAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMworZGRuZXh0cDAzMyBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDUgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDQKK2RkbmV4dHAwMzQgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDA2ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDA1CitkZG5leHRwMDM1IG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwNyAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwNgorZGRuZXh0cDAzNiBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDggIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDcKK2RkbmV4dHAwMzcgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDA5ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDA4CitkZG5leHRwMDM4IG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAxMCAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwOQorZGRuZXh0cDAzOSBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMTEgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMTAKK2RkbmV4dHAwNDAgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDEyICAtPiAgLTEuMDAwMDAwMDAwMDAwMDExCisKKy0tIFplcm9zCitkZG5leHRwMTAwIG5leHRwbHVzICAwICAgICAgICAgICAtPiAgMUUtMzk4CitkZG5leHRwMTAxIG5leHRwbHVzICAwLjAwICAgICAgICAtPiAgMUUtMzk4CitkZG5leHRwMTAyIG5leHRwbHVzICAwRS0zMDAgICAgICAtPiAgMUUtMzk4CitkZG5leHRwMTAzIG5leHRwbHVzICAwRSszMDAgICAgICAtPiAgMUUtMzk4CitkZG5leHRwMTA0IG5leHRwbHVzICAwRSszMDAwMCAgICAtPiAgMUUtMzk4CitkZG5leHRwMTA1IG5leHRwbHVzIC0wICAgICAgICAgICAtPiAgMUUtMzk4CitkZG5leHRwMTA2IG5leHRwbHVzIC0wLjAwICAgICAgICAtPiAgMUUtMzk4CitkZG5leHRwMTA3IG5leHRwbHVzIC0wRS0zMDAgICAgICAtPiAgMUUtMzk4CitkZG5leHRwMTA4IG5leHRwbHVzIC0wRSszMDAgICAgICAtPiAgMUUtMzk4CitkZG5leHRwMTA5IG5leHRwbHVzIC0wRSszMDAwMCAgICAtPiAgMUUtMzk4CisKKy0tIHNwZWNpYWxzCitkZG5leHRwMTUwIG5leHRwbHVzICAgSW5mICAgIC0+ICBJbmZpbml0eQorZGRuZXh0cDE1MSBuZXh0cGx1cyAgLUluZiAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0cDE1MiBuZXh0cGx1cyAgIE5hTiAgICAtPiAgTmFOCitkZG5leHRwMTUzIG5leHRwbHVzICBzTmFOICAgIC0+ICBOYU4gICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0cDE1NCBuZXh0cGx1cyAgIE5hTjc3ICAtPiAgTmFONzcKK2RkbmV4dHAxNTUgbmV4dHBsdXMgIHNOYU44OCAgLT4gIE5hTjg4IEludmFsaWRfb3BlcmF0aW9uCitkZG5leHRwMTU2IG5leHRwbHVzICAtTmFOICAgIC0+IC1OYU4KK2RkbmV4dHAxNTcgbmV4dHBsdXMgLXNOYU4gICAgLT4gLU5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHRwMTU4IG5leHRwbHVzICAtTmFONzcgIC0+IC1OYU43NworZGRuZXh0cDE1OSBuZXh0cGx1cyAtc05hTjg4ICAtPiAtTmFOODggSW52YWxpZF9vcGVyYXRpb24KKworLS0gTm1heCwgTm1pbiwgTnRpbnksIHN1Ym5vcm1hbHMKK2RkbmV4dHAxNzAgbmV4dHBsdXMgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAtOS45OTk5OTk5OTk5OTk5OThFKzM4NAorZGRuZXh0cDE3MSBuZXh0cGx1cyAgLTkuOTk5OTk5OTk5OTk5OTk4RSszODQgIC0+IC05Ljk5OTk5OTk5OTk5OTk5N0UrMzg0CitkZG5leHRwMTcyIG5leHRwbHVzICAtMUUtMzgzICAgICAgICAgICAgICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTlFLTM4NAorZGRuZXh0cDE3MyBuZXh0cGx1cyAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0+IC05Ljk5OTk5OTk5OTk5OTk5RS0zODQKK2RkbmV4dHAxNzQgbmV4dHBsdXMgIC05RS0zOTggICAgICAgICAgICAgICAgICAtPiAtOEUtMzk4CitkZG5leHRwMTc1IG5leHRwbHVzICAtOS45RS0zOTcgICAgICAgICAgICAgICAgLT4gLTkuOEUtMzk3CitkZG5leHRwMTc2IG5leHRwbHVzICAtOS45OTk5OTk5OTk5OUUtMzg3ICAgICAgLT4gLTkuOTk5OTk5OTk5OThFLTM4NworZGRuZXh0cDE3NyBuZXh0cGx1cyAgLTkuOTk5OTk5OTk5OTk5OTlFLTM4NCAgIC0+IC05Ljk5OTk5OTk5OTk5OTk4RS0zODQKK2RkbmV4dHAxNzggbmV4dHBsdXMgIC05Ljk5OTk5OTk5OTk5OTk4RS0zODQgICAtPiAtOS45OTk5OTk5OTk5OTk5N0UtMzg0CitkZG5leHRwMTc5IG5leHRwbHVzICAtOS45OTk5OTk5OTk5OTk5N0UtMzg0ICAgLT4gLTkuOTk5OTk5OTk5OTk5OTZFLTM4NAorZGRuZXh0cDE4MCBuZXh0cGx1cyAgLTBFLTM5OCAgICAgICAgICAgICAgICAgIC0+ICAxRS0zOTgKK2RkbmV4dHAxODEgbmV4dHBsdXMgIC0xRS0zOTggICAgICAgICAgICAgICAgICAtPiAtMEUtMzk4CitkZG5leHRwMTgyIG5leHRwbHVzICAtMkUtMzk4ICAgICAgICAgICAgICAgICAgLT4gLTFFLTM5OAorCitkZG5leHRwMTgzIG5leHRwbHVzICAgMEUtMzk4ICAgICAgICAgICAgICAgICAgLT4gIDFFLTM5OAorZGRuZXh0cDE4NCBuZXh0cGx1cyAgIDFFLTM5OCAgICAgICAgICAgICAgICAgIC0+ICAyRS0zOTgKK2RkbmV4dHAxODUgbmV4dHBsdXMgICAyRS0zOTggICAgICAgICAgICAgICAgICAtPiAgM0UtMzk4CitkZG5leHRwMTg2IG5leHRwbHVzICAgMTBFLTM5OCAgICAgICAgICAgICAgICAgLT4gIDEuMUUtMzk3CitkZG5leHRwMTg3IG5leHRwbHVzICAgMTAwRS0zOTggICAgICAgICAgICAgICAgLT4gIDEuMDFFLTM5NgorZGRuZXh0cDE4OCBuZXh0cGx1cyAgIDEwMDAwMEUtMzk4ICAgICAgICAgICAgIC0+ICAxLjAwMDAxRS0zOTMKK2RkbmV4dHAxODkgbmV4dHBsdXMgICAxLjAwMDAwMDAwMDAwRS0zODMgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDFFLTM4MworZGRuZXh0cDE5MCBuZXh0cGx1cyAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMUUtMzgzCitkZG5leHRwMTkxIG5leHRwbHVzICAgMUUtMzgzICAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAxRS0zODMKK2RkbmV4dHAxOTIgbmV4dHBsdXMgICA5Ljk5OTk5OTk5OTk5OTk5OEUrMzg0ICAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0cDE5MyBuZXh0cGx1cyAgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0+ICBJbmZpbml0eQorCistLSBOdWxsIHRlc3RzCitkZG5leHRwOTAwIG5leHRwbHVzICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTmV4dFRvd2FyZC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE5leHRUb3dhcmQuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU0NzRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE5leHRUb3dhcmQuZGVjVGVzdApAQCAtMCwwICsxLDM3NCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZE5leHRUb3dhcmQuZGVjVGVzdCAtLSBkZWNEb3VibGUgbmV4dCB0b3dhcmQgcmhzIFs3NTRyIG5leHRhZnRlcl0gLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjRG91Ymxlcy4KK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sgd2l0aCBhIHNjYXR0ZXJpbmcgb2YgbnVtZXJpY3MKK2RkbmV4dHQwMDEgbmV4dHRvd2FyZCAgIDEwICAgIDEwICAgLT4gIDEwCitkZG5leHR0MDAyIG5leHR0b3dhcmQgIC0xMCAgIC0xMCAgIC0+IC0xMAorZGRuZXh0dDAwMyBuZXh0dG93YXJkICAgMSAgICAgMTAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDEKK2RkbmV4dHQwMDQgbmV4dHRvd2FyZCAgIDEgICAgLTEwICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDAwNSBuZXh0dG93YXJkICAtMSAgICAgMTAgICAtPiAtMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHR0MDA2IG5leHR0b3dhcmQgIC0xICAgIC0xMCAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0dDAwNyBuZXh0dG93YXJkICAgMCAgICAgMTAgICAtPiAgMUUtMzk4ICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MDA4IG5leHR0b3dhcmQgICAwICAgIC0xMCAgIC0+IC0xRS0zOTggICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQwMDkgbmV4dHRvd2FyZCAgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgK0luZmluaXR5IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQwMTAgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLUluZmluaXR5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQwMTEgbmV4dHRvd2FyZCAgICAgICA5Ljk5OTk5OTk5OTk5OTk5OSAgMTAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMAorZGRuZXh0dDAxMiBuZXh0dG93YXJkICAgMTAgIDkuOTk5OTk5OTk5OTk5OTk5ICAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5CitkZG5leHR0MDEzIG5leHR0b3dhcmQgICAgICAtOS45OTk5OTk5OTk5OTk5OTkgLTEwICAtPiAtMTAuMDAwMDAwMDAwMDAwMDAKK2RkbmV4dHQwMTQgbmV4dHRvd2FyZCAgLTEwIC05Ljk5OTk5OTk5OTk5OTk5OSAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDAxNSBuZXh0dG93YXJkICAgICAgIDkuOTk5OTk5OTk5OTk5OTk4ICAxMCAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5CitkZG5leHR0MDE2IG5leHR0b3dhcmQgICAxMCAgOS45OTk5OTk5OTk5OTk5OTggICAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTkKK2RkbmV4dHQwMTcgbmV4dHRvd2FyZCAgICAgIC05Ljk5OTk5OTk5OTk5OTk5OCAtMTAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDAxOCBuZXh0dG93YXJkICAtMTAgLTkuOTk5OTk5OTk5OTk5OTk4ICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5CisKKy0tLS0tLS0gbGhzPXJocworLS0gZmluaXRlcworZGRuZXh0dDEwMSBuZXh0dG93YXJkICAgICAgICAgIDcgICAgICAgNyAtPiAgNworZGRuZXh0dDEwMiBuZXh0dG93YXJkICAgICAgICAgLTcgICAgICAtNyAtPiAtNworZGRuZXh0dDEwMyBuZXh0dG93YXJkICAgICAgICAgNzUgICAgICA3NSAtPiAgNzUKK2RkbmV4dHQxMDQgbmV4dHRvd2FyZCAgICAgICAgLTc1ICAgICAtNzUgLT4gLTc1CitkZG5leHR0MTA1IG5leHR0b3dhcmQgICAgICAgNy41MCAgICAgNy41IC0+ICA3LjUwCitkZG5leHR0MTA2IG5leHR0b3dhcmQgICAgICAtNy41MCAgIC03LjUwIC0+IC03LjUwCitkZG5leHR0MTA3IG5leHR0b3dhcmQgICAgICAgNy41MDAgNy41MDAwIC0+ICA3LjUwMAorZGRuZXh0dDEwOCBuZXh0dG93YXJkICAgICAgLTcuNTAwICAgLTcuNSAtPiAtNy41MDAKKworLS0gemVyb3MKK2RkbmV4dHQxMTEgbmV4dHRvd2FyZCAgICAgICAgICAwICAgICAgIDAgLT4gIDAKK2RkbmV4dHQxMTIgbmV4dHRvd2FyZCAgICAgICAgIC0wICAgICAgLTAgLT4gLTAKK2RkbmV4dHQxMTMgbmV4dHRvd2FyZCAgICAgICAwRSs0ICAgICAgIDAgLT4gIDBFKzQKK2RkbmV4dHQxMTQgbmV4dHRvd2FyZCAgICAgIC0wRSs0ICAgICAgLTAgLT4gLTBFKzQKK2RkbmV4dHQxMTUgbmV4dHRvd2FyZCAgICAgMC4wMDAwMDAwMDAwMCAgIDAuMDAwMDAwMDAwMDAwIC0+ICAwRS0xMQorZGRuZXh0dDExNiBuZXh0dG93YXJkICAgIC0wLjAwMDAwMDAwMDAwICAtMC4wMCAgICAgICAgICAgLT4gLTBFLTExCitkZG5leHR0MTE3IG5leHR0b3dhcmQgICAgICAwRS0xNDEgICAgICAwIC0+ICAwRS0xNDEKK2RkbmV4dHQxMTggbmV4dHRvd2FyZCAgICAgLTBFLTE0MSAgIC0wMDAgLT4gLTBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZGRuZXh0dDEyMSBuZXh0dG93YXJkICAgMjY4MjY4MjY4ICAgIDI2ODI2ODI2OCAtPiAgIDI2ODI2ODI2OAorZGRuZXh0dDEyMiBuZXh0dG93YXJkICAtMjY4MjY4MjY4ICAgLTI2ODI2ODI2OCAtPiAgLTI2ODI2ODI2OAorZGRuZXh0dDEyMyBuZXh0dG93YXJkICAgMTM0MTM0MTM0ICAgIDEzNDEzNDEzNCAtPiAgIDEzNDEzNDEzNAorZGRuZXh0dDEyNCBuZXh0dG93YXJkICAtMTM0MTM0MTM0ICAgLTEzNDEzNDEzNCAtPiAgLTEzNDEzNDEzNAorCistLSBObWF4LCBObWluLCBOdGlueQorZGRuZXh0dDEzMSBuZXh0dG93YXJkICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZG5leHR0MTMyIG5leHR0b3dhcmQgIDFFLTM4MyAgICAgICAgICAgMUUtMzgzICAgICAgICAgICAgLT4gICAxRS0zODMKK2RkbmV4dHQxMzMgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRuZXh0dDEzNCBuZXh0dG93YXJkICAxRS0zOTggICAgICAgICAgIDFFLTM5OCAgICAgICAgICAgIC0+ICAgMUUtMzk4CisKK2RkbmV4dHQxMzUgbmV4dHRvd2FyZCAgLTFFLTM5OCAgICAgICAgICAtMUUtMzk4ICAgICAgICAgICAtPiAgLTFFLTM5OAorZGRuZXh0dDEzNiBuZXh0dG93YXJkICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZG5leHR0MTM3IG5leHR0b3dhcmQgIC0xRS0zODMgICAgICAgICAgLTFFLTM4MyAgICAgICAgICAgLT4gIC0xRS0zODMKK2RkbmV4dHQxMzggbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0+ICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorCistLS0tLS0tIGxoczxyaHMKK2RkbmV4dHQyMDEgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk1IEluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk2CitkZG5leHR0MjAyIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5NiBJbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5NworZGRuZXh0dDIwMyBuZXh0dG93YXJkICAwLjk5OTk5OTk5OTk5OTk5OTcgSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTgKK2RkbmV4dHQyMDQgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk4IEluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHR0MjA1IG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5OSBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwCitkZG5leHR0MjA2IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHR0MjA3IG5leHR0b3dhcmQgIDEuMCAgICAgICAgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDEKK2RkbmV4dHQyMDggbmV4dHRvd2FyZCAgMSAgICAgICAgICAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0dDIwOSBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMSAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMgorZGRuZXh0dDIxMCBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMiAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMworZGRuZXh0dDIxMSBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMyAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwNAorZGRuZXh0dDIxMiBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwNCAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwNQorZGRuZXh0dDIxMyBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwNSAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwNgorZGRuZXh0dDIxNCBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwNiAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwNworZGRuZXh0dDIxNSBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwNyAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwOAorZGRuZXh0dDIxNiBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwOCAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwOQorZGRuZXh0dDIxNyBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwOSAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAxMAorZGRuZXh0dDIxOCBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAxMCAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAxMQorZGRuZXh0dDIxOSBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAxMSAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAxMgorCitkZG5leHR0MjIxIG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5NSBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5NAorZGRuZXh0dDIyMiBuZXh0dG93YXJkIC0wLjk5OTk5OTk5OTk5OTk5OTYgSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTUKK2RkbmV4dHQyMjMgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk3IEluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk2CitkZG5leHR0MjI0IG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5OCBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5NworZGRuZXh0dDIyNSBuZXh0dG93YXJkIC0wLjk5OTk5OTk5OTk5OTk5OTkgSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTgKK2RkbmV4dHQyMjYgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDAgIEluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHR0MjI3IG5leHR0b3dhcmQgLTEuMCAgICAgICAgIEluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHR0MjI4IG5leHR0b3dhcmQgLTEgICAgICAgICAgIEluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHR0MjI5IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAxICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwCitkZG5leHR0MjMwIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAyICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHR0MjMxIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAzICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAyCitkZG5leHR0MjMyIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDA0ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAzCitkZG5leHR0MjMzIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDA1ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDA0CitkZG5leHR0MjM0IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDA2ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDA1CitkZG5leHR0MjM1IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDA3ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDA2CitkZG5leHR0MjM2IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDA4ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDA3CitkZG5leHR0MjM3IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDA5ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDA4CitkZG5leHR0MjM4IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDEwICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDA5CitkZG5leHR0MjM5IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDExICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDEwCitkZG5leHR0MjQwIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDEyICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDExCisKKy0tIFplcm9zCitkZG5leHR0MzAwIG5leHR0b3dhcmQgIDAgICAgICAgICAgIEluZmluaXR5IC0+ICAxRS0zOTggICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MzAxIG5leHR0b3dhcmQgIDAuMDAgICAgICAgIEluZmluaXR5IC0+ICAxRS0zOTggICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MzAyIG5leHR0b3dhcmQgIDBFLTMwMCAgICAgIEluZmluaXR5IC0+ICAxRS0zOTggICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MzAzIG5leHR0b3dhcmQgIDBFKzMwMCAgICAgIEluZmluaXR5IC0+ICAxRS0zOTggICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MzA0IG5leHR0b3dhcmQgIDBFKzMwMDAwICAgIEluZmluaXR5IC0+ICAxRS0zOTggICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MzA1IG5leHR0b3dhcmQgLTAgICAgICAgICAgIEluZmluaXR5IC0+ICAxRS0zOTggICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MzA2IG5leHR0b3dhcmQgLTAuMDAgICAgICAgIEluZmluaXR5IC0+ICAxRS0zOTggICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MzA3IG5leHR0b3dhcmQgLTBFLTMwMCAgICAgIEluZmluaXR5IC0+ICAxRS0zOTggICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MzA4IG5leHR0b3dhcmQgLTBFKzMwMCAgICAgIEluZmluaXR5IC0+ICAxRS0zOTggICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MzA5IG5leHR0b3dhcmQgLTBFKzMwMDAwICAgIEluZmluaXR5IC0+ICAxRS0zOTggICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNwZWNpYWxzCitkZG5leHR0MzUwIG5leHR0b3dhcmQgICBJbmYgICAgSW5maW5pdHkgLT4gIEluZmluaXR5CitkZG5leHR0MzUxIG5leHR0b3dhcmQgIC1JbmYgICAgSW5maW5pdHkgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQzNTIgbmV4dHRvd2FyZCAgIE5hTiAgICBJbmZpbml0eSAtPiAgTmFOCitkZG5leHR0MzUzIG5leHR0b3dhcmQgIHNOYU4gICAgSW5maW5pdHkgLT4gIE5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0MzU0IG5leHR0b3dhcmQgICBOYU43NyAgSW5maW5pdHkgLT4gIE5hTjc3CitkZG5leHR0MzU1IG5leHR0b3dhcmQgIHNOYU44OCAgSW5maW5pdHkgLT4gIE5hTjg4IEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0MzU2IG5leHR0b3dhcmQgIC1OYU4gICAgSW5maW5pdHkgLT4gLU5hTgorZGRuZXh0dDM1NyBuZXh0dG93YXJkIC1zTmFOICAgIEluZmluaXR5IC0+IC1OYU4gICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDM1OCBuZXh0dG93YXJkICAtTmFONzcgIEluZmluaXR5IC0+IC1OYU43NworZGRuZXh0dDM1OSBuZXh0dG93YXJkIC1zTmFOODggIEluZmluaXR5IC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBObWF4LCBObWluLCBOdGlueSwgc3Vibm9ybWFscworZGRuZXh0dDM3MCBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgSW5maW5pdHkgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OEUrMzg0CitkZG5leHR0MzcxIG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk5OEUrMzg0ICBJbmZpbml0eSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk3RSszODQKK2RkbmV4dHQzNzIgbmV4dHRvd2FyZCAgLTFFLTM4MyAgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5OUUtMzg0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDM3MyBuZXh0dG93YXJkICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgSW5maW5pdHkgIC0+IC05Ljk5OTk5OTk5OTk5OTk5RS0zODQgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Mzc0IG5leHR0b3dhcmQgIC05RS0zOTggICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gLThFLTM5OCAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQzNzUgbmV4dHRvd2FyZCAgLTkuOUUtMzk3ICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAtOS44RS0zOTcgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDM3NiBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OUUtMzg3ICAgICAgSW5maW5pdHkgIC0+IC05Ljk5OTk5OTk5OTk4RS0zODcgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Mzc3IG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk5RS0zODQgICBJbmZpbml0eSAgLT4gLTkuOTk5OTk5OTk5OTk5OThFLTM4NCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQzNzggbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTk5OThFLTM4NCAgIEluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5N0UtMzg0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDM3OSBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5N0UtMzg0ICAgSW5maW5pdHkgIC0+IC05Ljk5OTk5OTk5OTk5OTk2RS0zODQgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MzgwIG5leHR0b3dhcmQgIC0wRS0zOTggICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gIDFFLTM5OCAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQzODEgbmV4dHRvd2FyZCAgLTFFLTM5OCAgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAtMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkbmV4dHQzODIgbmV4dHRvd2FyZCAgLTJFLTM5OCAgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAtMUUtMzk4ICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkZG5leHR0MzgzIG5leHR0b3dhcmQgICAwRS0zOTggICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gIDFFLTM5OCAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQzODQgbmV4dHRvd2FyZCAgIDFFLTM5OCAgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAgMkUtMzk4ICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDM4NSBuZXh0dG93YXJkICAgMkUtMzk4ICAgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+ICAzRS0zOTggICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Mzg2IG5leHR0b3dhcmQgICAxMEUtMzk4ICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gIDEuMUUtMzk3ICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQzODcgbmV4dHRvd2FyZCAgIDEwMEUtMzk4ICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAgMS4wMUUtMzk2ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDM4OCBuZXh0dG93YXJkICAgMTAwMDAwRS0zOTggICAgICAgICAgICAgSW5maW5pdHkgIC0+ICAxLjAwMDAxRS0zOTMgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Mzg5IG5leHR0b3dhcmQgICAxLjAwMDAwMDAwMDAwRS0zODMgICAgICBJbmZpbml0eSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAxRS0zODMKK2RkbmV4dHQzOTAgbmV4dHRvd2FyZCAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIEluZmluaXR5ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDFFLTM4MworZGRuZXh0dDM5MSBuZXh0dG93YXJkICAgMUUtMzgzICAgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMUUtMzgzCitkZG5leHR0MzkyIG5leHR0b3dhcmQgICA5Ljk5OTk5OTk5OTk5OTk5N0UrMzg0ICBJbmZpbml0eSAgLT4gIDkuOTk5OTk5OTk5OTk5OTk4RSszODQKK2RkbmV4dHQzOTMgbmV4dHRvd2FyZCAgIDkuOTk5OTk5OTk5OTk5OTk4RSszODQgIEluZmluaXR5ICAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0dDM5NCBuZXh0dG93YXJkICAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgSW5maW5pdHkgIC0+ICBJbmZpbml0eSAgICAgICAgICAgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLS0tLS0tIGxocz5yaHMKK2RkbmV4dHQ0MDEgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk1ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTQKK2RkbmV4dHQ0MDIgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk2ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTUKK2RkbmV4dHQ0MDMgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk3ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTYKK2RkbmV4dHQ0MDQgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk4ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTcKK2RkbmV4dHQ0MDUgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk5ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTgKK2RkbmV4dHQ0MDYgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAgICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTkKK2RkbmV4dHQ0MDcgbmV4dHRvd2FyZCAgMS4wICAgICAgICAgIC1JbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDQwOCBuZXh0dG93YXJkICAxICAgICAgICAgICAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHR0NDA5IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAxICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAKK2RkbmV4dHQ0MTAgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDIgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0dDQxMSBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMyAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAyCitkZG5leHR0NDEyIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDA0ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDMKK2RkbmV4dHQ0MTMgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDUgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwNAorZGRuZXh0dDQxNCBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwNiAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDA1CitkZG5leHR0NDE1IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDA3ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDYKK2RkbmV4dHQ0MTYgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDggICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwNworZGRuZXh0dDQxNyBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwOSAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDA4CitkZG5leHR0NDE4IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDEwICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDkKK2RkbmV4dHQ0MTkgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMTEgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAxMAorZGRuZXh0dDQyMCBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAxMiAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDExCisKK2RkbmV4dHQ0MjEgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk1ICAtSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTYKK2RkbmV4dHQ0MjIgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk2ICAtSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTcKK2RkbmV4dHQ0MjMgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk3ICAtSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTgKK2RkbmV4dHQ0MjQgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk4ICAtSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTkKK2RkbmV4dHQ0MjUgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk5ICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMAorZGRuZXh0dDQyNiBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMCAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHR0NDI3IG5leHR0b3dhcmQgLTEuMCAgICAgICAgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0dDQyOCBuZXh0dG93YXJkIC0xICAgICAgICAgICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDEKK2RkbmV4dHQ0MjkgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDEgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMgorZGRuZXh0dDQzMCBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMiAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAzCitkZG5leHR0NDMxIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAzICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDQKK2RkbmV4dHQ0MzIgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDQgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwNQorZGRuZXh0dDQzMyBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwNSAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDA2CitkZG5leHR0NDM0IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDA2ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDcKK2RkbmV4dHQ0MzUgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDcgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwOAorZGRuZXh0dDQzNiBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwOCAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDA5CitkZG5leHR0NDM3IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDA5ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMTAKK2RkbmV4dHQ0MzggbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMTAgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAxMQorZGRuZXh0dDQzOSBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAxMSAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDEyCisKKy0tIFplcm9zCitkZG5leHR0NTAwIG5leHR0b3dhcmQgLTAgICAgICAgICAgICAtSW5maW5pdHkgLT4gLTFFLTM5OCAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0NTAxIG5leHR0b3dhcmQgIDAgICAgICAgICAgICAtSW5maW5pdHkgLT4gLTFFLTM5OCAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0NTAyIG5leHR0b3dhcmQgIDAuMDAgICAgICAgICAtSW5maW5pdHkgLT4gLTFFLTM5OCAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0NTAzIG5leHR0b3dhcmQgLTAuMDAgICAgICAgICAtSW5maW5pdHkgLT4gLTFFLTM5OCAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0NTA0IG5leHR0b3dhcmQgIDBFLTMwMCAgICAgICAtSW5maW5pdHkgLT4gLTFFLTM5OCAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0NTA1IG5leHR0b3dhcmQgIDBFKzMwMCAgICAgICAtSW5maW5pdHkgLT4gLTFFLTM5OCAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0NTA2IG5leHR0b3dhcmQgIDBFKzMwMDAwICAgICAtSW5maW5pdHkgLT4gLTFFLTM5OCAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0NTA3IG5leHR0b3dhcmQgLTBFKzMwMDAwICAgICAtSW5maW5pdHkgLT4gLTFFLTM5OCAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNwZWNpYWxzCitkZG5leHR0NTUwIG5leHR0b3dhcmQgICBJbmYgICAgIC1JbmZpbml0eSAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0dDU1MSBuZXh0dG93YXJkICAtSW5mICAgICAtSW5maW5pdHkgLT4gLUluZmluaXR5CitkZG5leHR0NTUyIG5leHR0b3dhcmQgICBOYU4gICAgIC1JbmZpbml0eSAtPiAgTmFOCitkZG5leHR0NTUzIG5leHR0b3dhcmQgIHNOYU4gICAgIC1JbmZpbml0eSAtPiAgTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ1NTQgbmV4dHRvd2FyZCAgIE5hTjc3ICAgLUluZmluaXR5IC0+ICBOYU43NworZGRuZXh0dDU1NSBuZXh0dG93YXJkICBzTmFOODggICAtSW5maW5pdHkgLT4gIE5hTjg4IEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0NTU2IG5leHR0b3dhcmQgIC1OYU4gICAgIC1JbmZpbml0eSAtPiAtTmFOCitkZG5leHR0NTU3IG5leHR0b3dhcmQgLXNOYU4gICAgIC1JbmZpbml0eSAtPiAtTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ1NTggbmV4dHRvd2FyZCAgLU5hTjc3ICAgLUluZmluaXR5IC0+IC1OYU43NworZGRuZXh0dDU1OSBuZXh0dG93YXJkIC1zTmFOODggICAtSW5maW5pdHkgLT4gLU5hTjg4IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5tYXgsIE5taW4sIE50aW55LCBzdWJub3JtYWxzCitkZG5leHR0NjcwIG5leHR0b3dhcmQgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OTk5OTk4RSszODQKK2RkbmV4dHQ2NzEgbmV4dHRvd2FyZCAgOS45OTk5OTk5OTk5OTk5OThFKzM4NCAgIC1JbmZpbml0eSAgLT4gOS45OTk5OTk5OTk5OTk5OTdFKzM4NAorZGRuZXh0dDY3MiBuZXh0dG93YXJkICAxRS0zODMgICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ2NzMgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgIC1JbmZpbml0eSAgLT4gOS45OTk5OTk5OTk5OTk5OUUtMzg0ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Njc0IG5leHR0b3dhcmQgIDlFLTM5OCAgICAgICAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IDhFLTM5OCAgICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDY3NSBuZXh0dG93YXJkICA5LjlFLTM5NyAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiA5LjhFLTM5NyAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ2NzYgbmV4dHRvd2FyZCAgOS45OTk5OTk5OTk5OUUtMzg3ICAgICAgIC1JbmZpbml0eSAgLT4gOS45OTk5OTk5OTk5OEUtMzg3ICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Njc3IG5leHR0b3dhcmQgIDkuOTk5OTk5OTk5OTk5OTlFLTM4NCAgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OTk5OThFLTM4NCAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDY3OCBuZXh0dG93YXJkICA5Ljk5OTk5OTk5OTk5OTk4RS0zODQgICAgLUluZmluaXR5ICAtPiA5Ljk5OTk5OTk5OTk5OTk3RS0zODQgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ2NzkgbmV4dHRvd2FyZCAgOS45OTk5OTk5OTk5OTk5N0UtMzg0ICAgIC1JbmZpbml0eSAgLT4gOS45OTk5OTk5OTk5OTk5NkUtMzg0ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0NjgwIG5leHR0b3dhcmQgIDBFLTM5OCAgICAgICAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IC0xRS0zOTggICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDY4MSBuZXh0dG93YXJkICAxRS0zOTggICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAwRS0zOTggICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRuZXh0dDY4MiBuZXh0dG93YXJkICAyRS0zOTggICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAxRS0zOTggICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKKworZGRuZXh0dDY4MyBuZXh0dG93YXJkICAtMEUtMzk4ICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtMUUtMzk4ICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ2ODQgbmV4dHRvd2FyZCAgLTFFLTM5OCAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gLTJFLTM5OCAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Njg1IG5leHR0b3dhcmQgIC0yRS0zOTggICAgICAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IC0zRS0zOTggICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDY4NiBuZXh0dG93YXJkICAtMTBFLTM5OCAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtMS4xRS0zOTcgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ2ODcgbmV4dHRvd2FyZCAgLTEwMEUtMzk4ICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gLTEuMDFFLTM5NiAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Njg4IG5leHR0b3dhcmQgIC0xMDAwMDBFLTM5OCAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IC0xLjAwMDAxRS0zOTMgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDY4OSBuZXh0dG93YXJkICAtMS4wMDAwMDAwMDAwMEUtMzgzICAgICAgLUluZmluaXR5ICAtPiAtMS4wMDAwMDAwMDAwMDAwMDFFLTM4MworZGRuZXh0dDY5MCBuZXh0dG93YXJkICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLUluZmluaXR5ICAtPiAtMS4wMDAwMDAwMDAwMDAwMDFFLTM4MworZGRuZXh0dDY5MSBuZXh0dG93YXJkICAtMUUtMzgzICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtMS4wMDAwMDAwMDAwMDAwMDFFLTM4MworZGRuZXh0dDY5MiBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5OThFKzM4NCAgLUluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0dDY5MyBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLUluZmluaXR5ICAtPiAtSW5maW5pdHkgICAgICAgICAgICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0tLS0tLSBTcGVjaWFscworZGRuZXh0dDc4MCBuZXh0dG93YXJkIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbmV4dHQ3ODEgbmV4dHRvd2FyZCAtSW5mICAtMTAwMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ3ODIgbmV4dHRvd2FyZCAtSW5mICAtMSAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ3ODMgbmV4dHRvd2FyZCAtSW5mICAtMCAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ3ODQgbmV4dHRvd2FyZCAtSW5mICAgMCAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ3ODUgbmV4dHRvd2FyZCAtSW5mICAgMSAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ3ODYgbmV4dHRvd2FyZCAtSW5mICAgMTAwMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ3ODcgbmV4dHRvd2FyZCAtMTAwMCAtSW5mICAgLT4gLTEwMDAuMDAwMDAwMDAwMDAxCitkZG5leHR0Nzg4IG5leHR0b3dhcmQgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRuZXh0dDc4OSBuZXh0dG93YXJkIC0xICAgIC1JbmYgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDEKK2RkbmV4dHQ3OTAgbmV4dHRvd2FyZCAtMCAgICAtSW5mICAgLT4gLTFFLTM5OCAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ3OTEgbmV4dHRvd2FyZCAgMCAgICAtSW5mICAgLT4gLTFFLTM5OCAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ3OTIgbmV4dHRvd2FyZCAgMSAgICAtSW5mICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDc5MyBuZXh0dG93YXJkICAxMDAwIC1JbmYgICAtPiAgOTk5Ljk5OTk5OTk5OTk5OTkKK2RkbmV4dHQ3OTQgbmV4dHRvd2FyZCAgSW5mICAtSW5mICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKKworZGRuZXh0dDgwMCBuZXh0dG93YXJkICBJbmYgIC1JbmYgICAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0dDgwMSBuZXh0dG93YXJkICBJbmYgIC0xMDAwICAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0dDgwMiBuZXh0dG93YXJkICBJbmYgIC0xICAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0dDgwMyBuZXh0dG93YXJkICBJbmYgIC0wICAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0dDgwNCBuZXh0dG93YXJkICBJbmYgICAwICAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0dDgwNSBuZXh0dG93YXJkICBJbmYgICAxICAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0dDgwNiBuZXh0dG93YXJkICBJbmYgICAxMDAwICAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0dDgwNyBuZXh0dG93YXJkICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbmV4dHQ4MDggbmV4dHRvd2FyZCAtMTAwMCAgSW5mICAgLT4gLTk5OS45OTk5OTk5OTk5OTk5CitkZG5leHR0ODA5IG5leHR0b3dhcmQgLUluZiAgIEluZiAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZG5leHR0ODEwIG5leHR0b3dhcmQgLTEgICAgIEluZiAgIC0+IC0wLjk5OTk5OTk5OTk5OTk5OTkKK2RkbmV4dHQ4MTEgbmV4dHRvd2FyZCAtMCAgICAgSW5mICAgLT4gIDFFLTM5OCAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ4MTIgbmV4dHRvd2FyZCAgMCAgICAgSW5mICAgLT4gIDFFLTM5OCAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ4MTMgbmV4dHRvd2FyZCAgMSAgICAgSW5mICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHR0ODE0IG5leHR0b3dhcmQgIDEwMDAgIEluZiAgIC0+ICAxMDAwLjAwMDAwMDAwMDAwMQorZGRuZXh0dDgxNSBuZXh0dG93YXJkICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZGRuZXh0dDgyMSBuZXh0dG93YXJkICBOYU4gLUluZiAgICAtPiAgTmFOCitkZG5leHR0ODIyIG5leHR0b3dhcmQgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RkbmV4dHQ4MjMgbmV4dHRvd2FyZCAgTmFOIC0xICAgICAgLT4gIE5hTgorZGRuZXh0dDgyNCBuZXh0dG93YXJkICBOYU4gLTAgICAgICAtPiAgTmFOCitkZG5leHR0ODI1IG5leHR0b3dhcmQgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2RkbmV4dHQ4MjYgbmV4dHRvd2FyZCAgTmFOICAxICAgICAgLT4gIE5hTgorZGRuZXh0dDgyNyBuZXh0dG93YXJkICBOYU4gIDEwMDAgICAtPiAgTmFOCitkZG5leHR0ODI4IG5leHR0b3dhcmQgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RkbmV4dHQ4MjkgbmV4dHRvd2FyZCAgTmFOICBOYU4gICAgLT4gIE5hTgorZGRuZXh0dDgzMCBuZXh0dG93YXJkIC1JbmYgIE5hTiAgICAtPiAgTmFOCitkZG5leHR0ODMxIG5leHR0b3dhcmQgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RkbmV4dHQ4MzIgbmV4dHRvd2FyZCAtMSAgICBOYU4gICAgLT4gIE5hTgorZGRuZXh0dDgzMyBuZXh0dG93YXJkIC0wICAgIE5hTiAgICAtPiAgTmFOCitkZG5leHR0ODM0IG5leHR0b3dhcmQgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RkbmV4dHQ4MzUgbmV4dHRvd2FyZCAgMSAgICBOYU4gICAgLT4gIE5hTgorZGRuZXh0dDgzNiBuZXh0dG93YXJkICAxMDAwIE5hTiAgICAtPiAgTmFOCitkZG5leHR0ODM3IG5leHR0b3dhcmQgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZGRuZXh0dDg0MSBuZXh0dG93YXJkICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg0MiBuZXh0dG93YXJkICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg0MyBuZXh0dG93YXJkICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg0NCBuZXh0dG93YXJkICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg0NSBuZXh0dG93YXJkICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg0NiBuZXh0dG93YXJkICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg0NyBuZXh0dG93YXJkICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg0OCBuZXh0dG93YXJkICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg0OSBuZXh0dG93YXJkICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg1MCBuZXh0dG93YXJkICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg1MSBuZXh0dG93YXJkIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg1MiBuZXh0dG93YXJkIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg1MyBuZXh0dG93YXJkIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg1NCBuZXh0dG93YXJkIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg1NSBuZXh0dG93YXJkICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg1NiBuZXh0dG93YXJkICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg1NyBuZXh0dG93YXJkICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg1OCBuZXh0dG93YXJkICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg1OSBuZXh0dG93YXJkICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZG5leHR0ODYxIG5leHR0b3dhcmQgIE5hTjEgICAtSW5mICAgIC0+ICBOYU4xCitkZG5leHR0ODYyIG5leHR0b3dhcmQgK05hTjIgICAtMTAwMCAgIC0+ICBOYU4yCitkZG5leHR0ODYzIG5leHR0b3dhcmQgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCitkZG5leHR0ODY0IG5leHR0b3dhcmQgIE5hTjQgICAgSW5mICAgIC0+ICBOYU40CitkZG5leHR0ODY1IG5leHR0b3dhcmQgIE5hTjUgICArTmFONiAgIC0+ICBOYU41CitkZG5leHR0ODY2IG5leHR0b3dhcmQgLUluZiAgICAgTmFONyAgIC0+ICBOYU43CitkZG5leHR0ODY3IG5leHR0b3dhcmQgLTEwMDAgICAgTmFOOCAgIC0+ICBOYU44CitkZG5leHR0ODY4IG5leHR0b3dhcmQgIDEwMDAgICAgTmFOOSAgIC0+ICBOYU45CitkZG5leHR0ODY5IG5leHR0b3dhcmQgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorZGRuZXh0dDg3MSBuZXh0dG93YXJkICBzTmFOMTEgIC1JbmYgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0ODcyIG5leHR0b3dhcmQgIHNOYU4xMiAgLTEwMDAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NzMgbmV4dHRvd2FyZCAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg3NCBuZXh0dG93YXJkICBzTmFOMTQgICBOYU4xNyAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0ODc1IG5leHR0b3dhcmQgIHNOYU4xNSAgc05hTjE4IC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NzYgbmV4dHRvd2FyZCAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg3NyBuZXh0dG93YXJkIC1JbmYgICAgK3NOYU4yMCAtPiAgTmFOMjAgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0ODc4IG5leHR0b3dhcmQgLTEwMDAgICAgc05hTjIxIC0+ICBOYU4yMSAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NzkgbmV4dHRvd2FyZCAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg4MCBuZXh0dG93YXJkICBJbmYgICAgIHNOYU4yMyAtPiAgTmFOMjMgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0ODgxIG5leHR0b3dhcmQgK05hTjI1ICArc05hTjI0IC0+ICBOYU4yNCAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4ODIgbmV4dHRvd2FyZCAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2CitkZG5leHR0ODgzIG5leHR0b3dhcmQgLXNOYU4yNyAgc05hTjI5IC0+IC1OYU4yNyAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4ODQgbmV4dHRvd2FyZCAgMTAwMCAgICAtTmFOMzAgLT4gLU5hTjMwCitkZG5leHR0ODg1IG5leHR0b3dhcmQgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0cworZGRuZXh0dDkwMCBuZXh0dG93YXJkIDEgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0OTAxIG5leHR0b3dhcmQgIyAgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE9yLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkT3IuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2E3MDJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE9yLmRlY1Rlc3QKQEAgLTAsMCArMSwyOTIgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRPci5kZWNUZXN0IC0tIGRpZ2l0d2lzZSBsb2dpY2FsIE9SIGZvciBkZWNEb3VibGVzICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrICh0cnV0aCB0YWJsZSkKK2Rkb3IwMDEgb3IgICAgICAgICAgICAgMCAgICAwIC0+ICAgIDAKK2Rkb3IwMDIgb3IgICAgICAgICAgICAgMCAgICAxIC0+ICAgIDEKK2Rkb3IwMDMgb3IgICAgICAgICAgICAgMSAgICAwIC0+ICAgIDEKK2Rkb3IwMDQgb3IgICAgICAgICAgICAgMSAgICAxIC0+ICAgIDEKK2Rkb3IwMDUgb3IgICAgICAgICAgMTEwMCAxMDEwIC0+IDExMTAKKy0tIGFuZCBhdCBtc2QgYW5kIG1zZC0xCitkZG9yMDA2IG9yIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorZGRvcjAwNyBvciAwMDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gICAxMDAwMDAwMDAwMDAwMDAwCitkZG9yMDA4IG9yIDEwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMDAwMDAwMDAKK2Rkb3IwMDkgb3IgMTAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwMDAwMDAwMAorZGRvcjAxMCBvciAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgIDAKK2Rkb3IwMTEgb3IgMDAwMDAwMDAwMDAwMDAwMCAwMTAwMDAwMDAwMDAwMDAwIC0+ICAgIDEwMDAwMDAwMDAwMDAwMAorZGRvcjAxMiBvciAwMTAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgMTAwMDAwMDAwMDAwMDAwCitkZG9yMDEzIG9yIDAxMDAwMDAwMDAwMDAwMDAgMDEwMDAwMDAwMDAwMDAwMCAtPiAgICAxMDAwMDAwMDAwMDAwMDAKKworLS0gVmFyaW91cyBsZW5ndGhzCistLSAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgICAgIDEyMzQ1Njc4OTAxMjM0NTYgMTIzNDU2Nzg5MDEyMzQ1NgorZGRvcjAyMCBvciAxMTExMTExMTExMTExMTExICAgICAxMTExMTExMTExMTExMTExICAtPiAgMTExMTExMTExMTExMTExMQorZGRvcjAyMSBvciAgMTExMTExMTExMTExMTExICAgICAgMTExMTExMTExMTExMTExICAtPiAgIDExMTExMTExMTExMTExMQorZGRvcjAyMiBvciAgIDExMTExMTExMTExMTExICAgICAgIDExMTExMTExMTExMTExICAtPiAgICAxMTExMTExMTExMTExMQorZGRvcjAyMyBvciAgICAxMTExMTExMTExMTExICAgICAgICAxMTExMTExMTExMTExICAtPiAgICAgMTExMTExMTExMTExMQorZGRvcjAyNCBvciAgICAgMTExMTExMTExMTExICAgICAgICAgMTExMTExMTExMTExICAtPiAgICAgIDExMTExMTExMTExMQorZGRvcjAyNSBvciAgICAgIDExMTExMTExMTExICAgICAgICAgIDExMTExMTExMTExICAtPiAgICAgICAxMTExMTExMTExMQorZGRvcjAyNiBvciAgICAgICAxMTExMTExMTExICAgICAgICAgICAxMTExMTExMTExICAtPiAgICAgICAgMTExMTExMTExMQorZGRvcjAyNyBvciAgICAgICAgMTExMTExMTExICAgICAgICAgICAgMTExMTExMTExICAtPiAgICAgICAgIDExMTExMTExMQorZGRvcjAyOCBvciAgICAgICAgIDExMTExMTExICAgICAgICAgICAgIDExMTExMTExICAtPiAgICAgICAgICAxMTExMTExMQorZGRvcjAyOSBvciAgICAgICAgICAxMTExMTExICAgICAgICAgICAgICAxMTExMTExICAtPiAgICAgICAgICAgMTExMTExMQorZGRvcjAzMCBvciAgICAgICAgICAgMTExMTExICAgICAgICAgICAgICAgMTExMTExICAtPiAgICAgICAgICAgIDExMTExMQorZGRvcjAzMSBvciAgICAgICAgICAgIDExMTExICAgICAgICAgICAgICAgIDExMTExICAtPiAgICAgICAgICAgICAxMTExMQorZGRvcjAzMiBvciAgICAgICAgICAgICAxMTExICAgICAgICAgICAgICAgICAxMTExICAtPiAgICAgICAgICAgICAgMTExMQorZGRvcjAzMyBvciAgICAgICAgICAgICAgMTExICAgICAgICAgICAgICAgICAgMTExICAtPiAgICAgICAgICAgICAgIDExMQorZGRvcjAzNCBvciAgICAgICAgICAgICAgIDExICAgICAgICAgICAgICAgICAgIDExICAtPiAgICAgICAgICAgICAgICAxMQorZGRvcjAzNSBvciAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAtPiAgICAgICAgICAgICAgICAgMQorZGRvcjAzNiBvciAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAwICAtPiAgICAgICAgICAgICAgICAgMAorCitkZG9yMDQyIG9yICAxMTExMTExMTAwMDAwMDAgICAgIDExMTExMTExMTAwMDAwMDAgIC0+ICAxMTExMTExMTEwMDAwMDAwCitkZG9yMDQzIG9yICAgMTExMTExMTAwMDAwMDAgICAgIDEwMDAwMDAxMDAwMDAwMDAgIC0+ICAxMDExMTExMTEwMDAwMDAwCitkZG9yMDQ0IG9yICAgIDExMTExMTAwMDAwMDAgICAgIDEwMDAwMDEwMDAwMDAwMDAgIC0+ICAxMDAxMTExMTEwMDAwMDAwCitkZG9yMDQ1IG9yICAgICAxMTExMTAwMDAwMDAgICAgIDEwMDAwMTAwMDAwMDAwMDAgIC0+ICAxMDAwMTExMTEwMDAwMDAwCitkZG9yMDQ2IG9yICAgICAgMTExMTAwMDAwMDAgICAgIDEwMDAxMDAwMDAwMDAwMDAgIC0+ICAxMDAwMTExMTEwMDAwMDAwCitkZG9yMDQ3IG9yICAgICAgIDExMTAwMDAwMDAgICAgIDEwMDEwMDAwMDAwMDAwMDAgIC0+ICAxMDAxMDAxMTEwMDAwMDAwCitkZG9yMDQ4IG9yICAgICAgICAxMTAwMDAwMDAgICAgIDEwMTAwMDAwMDAwMDAwMDAgIC0+ICAxMDEwMDAwMTEwMDAwMDAwCitkZG9yMDQ5IG9yICAgICAgICAgMTAwMDAwMDAgICAgIDExMDAwMDAwMDAwMDAwMDAgIC0+ICAxMTAwMDAwMDEwMDAwMDAwCisKK2Rkb3IwOTAgb3IgMDExMTExMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IwOTEgb3IgMTAxMTExMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IwOTIgb3IgMTEwMTExMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IwOTMgb3IgMTExMDExMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IwOTQgb3IgMTExMTAxMTExICAxMTExMDExMTEgIC0+ICAxMTExMDExMTEKK2Rkb3IwOTUgb3IgMTExMTEwMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IwOTYgb3IgMTExMTExMDExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IwOTcgb3IgMTExMTExMTAxICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IwOTggb3IgMTExMTExMTEwICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKKworZGRvcjEwMCBvciAxMTExMDExMTEgIDAxMTExMTExMSAgLT4gIDExMTExMTExMQorZGRvcjEwMSBvciAxMTExMDExMTEgIDEwMTExMTExMSAgLT4gIDExMTExMTExMQorZGRvcjEwMiBvciAxMTExMDExMTEgIDExMDExMTExMSAgLT4gIDExMTExMTExMQorZGRvcjEwMyBvciAxMTExMDExMTEgIDExMTAxMTExMSAgLT4gIDExMTExMTExMQorZGRvcjEwNCBvciAxMTExMDExMTEgIDExMTEwMTExMSAgLT4gIDExMTEwMTExMQorZGRvcjEwNSBvciAxMTExMDExMTEgIDExMTExMDExMSAgLT4gIDExMTExMTExMQorZGRvcjEwNiBvciAxMTExMDExMTEgIDExMTExMTAxMSAgLT4gIDExMTExMTExMQorZGRvcjEwNyBvciAxMTExMDExMTEgIDExMTExMTEwMSAgLT4gIDExMTExMTExMQorZGRvcjEwOCBvciAxMTExMDExMTEgIDExMTExMTExMCAgLT4gIDExMTExMTExMQorCistLSBub24tMC8xIHNob3VsZCBub3QgYmUgYWNjZXB0ZWQsIG5vciBzaG91bGQgc2lnbnMKK2Rkb3IyMjAgb3IgMTExMTExMTEyICAxMTExMTExMTEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyMjEgb3IgMzMzMzMzMzMzICAzMzMzMzMzMzMgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyMjIgb3IgNTU1NTU1NTU1ICA1NTU1NTU1NTUgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyMjMgb3IgNzc3Nzc3Nzc3ICA3Nzc3Nzc3NzcgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyMjQgb3IgOTk5OTk5OTk5ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyMjUgb3IgMjIyMjIyMjIyICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyMjYgb3IgNDQ0NDQ0NDQ0ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyMjcgb3IgNjY2NjY2NjY2ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyMjggb3IgODg4ODg4ODg4ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyMjkgb3IgOTk5OTk5OTk5ICAyMjIyMjIyMjIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyMzAgb3IgOTk5OTk5OTk5ICA0NDQ0NDQ0NDQgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyMzEgb3IgOTk5OTk5OTk5ICA2NjY2NjY2NjYgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyMzIgb3IgOTk5OTk5OTk5ICA4ODg4ODg4ODggIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGEgZmV3IHJhbmRvbXMKK2Rkb3IyNDAgb3IgIDU2NzQ2ODY4OSAtOTM0OTgxOTQyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNDEgb3IgIDU2NzM2NzY4OSAgOTM0OTgxOTQyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNDIgb3IgLTYzMTkxNzc3MiAtNzA2MDE0NjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNDMgb3IgLTc1NjI1MzI1NyAgMTM4NTc5MjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNDQgb3IgIDgzNTU5MDE0OSAgNTY3NDM1NDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNECitkZG9yMjUwIG9yICAyMDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI1MSBvciAgNzAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNTIgb3IgIDgwMDAwMDAwMDAwMDAwMDAgMTAwMDAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjUzIG9yICA5MDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI1NCBvciAgMjAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNTUgb3IgIDcwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjU2IG9yICA4MDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI1NyBvciAgOTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNTggb3IgIDEwMDAwMDAwMDAwMDAwMDAgMjAwMDAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjU5IG9yICAxMDAwMDAwMDAwMDAwMDAwIDcwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI2MCBvciAgMTAwMDAwMDAwMDAwMDAwMCA4MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNjEgb3IgIDEwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjYyIG9yICAwMDAwMDAwMDAwMDAwMDAwIDIwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI2MyBvciAgMDAwMDAwMDAwMDAwMDAwMCA3MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNjQgb3IgIDAwMDAwMDAwMDAwMDAwMDAgODAwMDAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjY1IG9yICAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QtMQorZGRvcjI3MCBvciAgMDIwMDAwMTAwMDAwMDAwMCAxMDAwMTAwMDAwMDAwMDEwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNzEgb3IgIDA3MDAwMDAxMDAwMDAwMDAgMTAwMDAxMDAwMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjcyIG9yICAwODAwMDAwMDEwMDAwMDAwIDEwMDAwMDEwMDAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI3MyBvciAgMDkwMDAwMDAwMTAwMDAwMCAxMDAwMDAwMTAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNzQgb3IgIDEwMDAwMDAwMDAxMDAwMDAgMDIwMDAwMDAxMDEwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjc1IG9yICAxMDAwMDAwMDAwMDEwMDAwIDA3MDAwMDAwMDEwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI3NiBvciAgMTAwMDAwMDAwMDAwMTAwMCAwODAwMDAwMDEwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNzcgb3IgIDEwMDAwMDAwMDAwMDAxMDAgMDkwMDAwMDAwMDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IExTRAorZGRvcjI4MCBvciAgMDAxMDAwMDAwMDAwMDAwMiAxMDAwMDAwMTAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyODEgb3IgIDAwMDEwMDAwMDAwMDAwMDcgMTAwMDAwMTAwMDAwMDAxMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjgyIG9yICAwMDAwMTAwMDAwMDAwMDA4IDEwMDAwMTAwMDAwMDAwMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI4MyBvciAgMDAwMDAxMDAwMDAwMDAwOSAxMDAwMTAwMDAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyODQgb3IgIDEwMDAwMDEwMDAwMDAwMDAgMDAwMTAwMDAwMDAwMDAwMiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjg1IG9yICAxMDAwMDAwMTAwMDAwMDAwIDAwMTAwMDAwMDAwMDAwMDcgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI4NiBvciAgMTAwMDAwMDAxMDAwMDAwMCAwMTAwMDAwMDAwMDAwMDA4IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyODcgb3IgIDEwMDAwMDAwMDEwMDAwMDAgMTAwMDAwMDAwMDAwMDAwOSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1pZGRpZQorZGRvcjI4OCBvciAgMDAxMDAwMDAyMDAwMDAwMCAxMDAwMDAxMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyODkgb3IgIDAwMDEwMDAwNzAwMDAwMDEgMTAwMDAwMDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjkwIG9yICAwMDAwMTAwMDgwMDAwMDEwIDEwMDAwMDAwMTAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI5MSBvciAgMDAwMDAxMDA5MDAwMDEwMCAxMDAwMDAwMDAxMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyOTIgb3IgIDEwMDAwMDEwMDAwMDEwMDAgMDAwMDAwMDAyMDEwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjkzIG9yICAxMDAwMDAwMTAwMDEwMDAwIDAwMDAwMDAwNzAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI5NCBvciAgMTAwMDAwMDAxMDEwMDAwMCAwMDAwMDAwMDgwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyOTUgb3IgIDEwMDAwMDAwMDEwMDAwMDAgMDAwMDAwMDA5MDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBzaWducworZGRvcjI5NiBvciAtMTAwMDAwMDAwMTAwMDAwMCAtMDAwMDAxMDAwMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjk3IG9yIC0xMDAwMDAwMDAxMDAwMDAwICAwMDAwMDAwMDEwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyOTggb3IgIDEwMDAwMDAwMDEwMDAwMDAgLTAwMDAwMDEwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI5OSBvciAgMTAwMDAwMDAwMTAwMDAwMCAgMDAwMDAwMDAxMTAwMDEwMCAtPiAgMTAwMDAwMDAxMTAwMDEwMAorCistLSBObWF4LCBObWluLCBOdGlueS1saWtlCitkZG9yMzMxIG9yICAyICAgOS45OTk5OTk5OUUrMTk5ICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzMzIgb3IgIDMgICAxRS0xOTkgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjMzMyBvciAgNCAgIDEuMDAwMDAwMDBFLTE5OSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzM0IG9yICA1ICAgMUUtMTAwICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzMzUgb3IgIDYgICAtMUUtMTAwICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjMzNiBvciAgNyAgIC0xLjAwMDAwMDAwRS0xOTkgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzM3IG9yICA4ICAgLTFFLTE5OSAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzMzggb3IgIDkgICAtOS45OTk5OTk5OUUrMTk5ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM0MSBvciAgOS45OTk5OTk5OUUrMjk5ICAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzQyIG9yICAxRS0yOTkgICAgICAgICAgICAgICAwMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNDMgb3IgIDEuMDAwMDAwMDBFLTI5OSAgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM0NCBvciAgMUUtMTAwICAgICAgICAgICAgICAgMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzQ1IG9yICAtMUUtMTAwICAgICAgICAgICAgIC0xMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNDYgb3IgIC0xLjAwMDAwMDAwRS0yOTkgICAgIDE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM0NyBvciAgLTFFLTI5OSAgICAgICAgICAgICAgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzQ4IG9yICAtOS45OTk5OTk5OUUrMjk5ICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQSBmZXcgb3RoZXIgbm9uLWludGVnZXJzCitkZG9yMzYxIG9yICAxLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNjIgb3IgIDFFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM2MyBvciAgMC4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzY0IG9yICAwRSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNjUgb3IgIDkuOSAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM2NiBvciAgOUUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzcxIG9yICAwIDEuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNzIgb3IgIDAgMUUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM3MyBvciAgMCAwLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzc0IG9yICAwIDBFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNzUgb3IgIDAgOS45ICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM3NiBvciAgMCA5RSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEFsbCBTcGVjaWFscyBhcmUgaW4gZXJyb3IKK2Rkb3I3ODAgb3IgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjc4MSBvciAtSW5mICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yNzgyIG9yIC1JbmYgIC0xICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I3ODMgb3IgLUluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjc4NCBvciAtSW5mICAgMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yNzg1IG9yIC1JbmYgICAxICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I3ODYgb3IgLUluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjc4NyBvciAtMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yNzg4IG9yIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I3ODkgb3IgLTEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjc5MCBvciAtMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yNzkxIG9yICAwICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I3OTIgb3IgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjc5MyBvciAgMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yNzk0IG9yICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZGRvcjgwMCBvciAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODAxIG9yICBJbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MDIgb3IgIEluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgwMyBvciAgSW5mICAtMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODA0IG9yICBJbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MDUgb3IgIEluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgwNiBvciAgSW5mICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODA3IG9yICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MDggb3IgLTEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgwOSBvciAtSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODEwIG9yIC0xICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MTEgb3IgLTAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgxMiBvciAgMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODEzIG9yICAxICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MTQgb3IgIDEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgxNSBvciAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rkb3I4MjEgb3IgIE5hTiAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgyMiBvciAgTmFOIC0xMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODIzIG9yICBOYU4gLTEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MjQgb3IgIE5hTiAtMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgyNSBvciAgTmFOICAwICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODI2IG9yICBOYU4gIDEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4Mjcgb3IgIE5hTiAgMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgyOCBvciAgTmFOICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODI5IG9yICBOYU4gIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MzAgb3IgLUluZiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgzMSBvciAtMTAwMCBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODMyIG9yIC0xICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MzMgb3IgLTAgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgzNCBvciAgMCAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODM1IG9yICAxICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MzYgb3IgIDEwMDAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgzNyBvciAgSW5mICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rkb3I4NDEgb3IgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODQyIG9yICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg0MyBvciAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NDQgb3IgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODQ1IG9yICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg0NiBvciAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NDcgb3IgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODQ4IG9yICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg0OSBvciAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NTAgb3IgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODUxIG9yIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg1MiBvciAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NTMgb3IgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODU0IG9yIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg1NSBvciAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NTYgb3IgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODU3IG9yICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg1OCBvciAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NTkgb3IgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2Rkb3I4NjEgb3IgIE5hTjEgICAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg2MiBvciArTmFOMiAgIC0xMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODYzIG9yICBOYU4zICAgIDEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NjQgb3IgIE5hTjQgICAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg2NSBvciAgTmFONSAgICtOYU42ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODY2IG9yIC1JbmYgICAgIE5hTjcgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4Njcgb3IgLTEwMDAgICAgTmFOOCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg2OCBvciAgMTAwMCAgICBOYU45ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODY5IG9yICBJbmYgICAgK05hTjEwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NzEgb3IgIHNOYU4xMSAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg3MiBvciAgc05hTjEyICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODczIG9yICBzTmFOMTMgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NzQgb3IgIHNOYU4xNCAgIE5hTjE3IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg3NSBvciAgc05hTjE1ICBzTmFOMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODc2IG9yICBOYU4xNiAgIHNOYU4xOSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4Nzcgb3IgLUluZiAgICArc05hTjIwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg3OCBvciAtMTAwMCAgICBzTmFOMjEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODc5IG9yICAxMDAwICAgIHNOYU4yMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4ODAgb3IgIEluZiAgICAgc05hTjIzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg4MSBvciArTmFOMjUgICtzTmFOMjQgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODgyIG9yIC1OYU4yNiAgICBOYU4yOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4ODMgb3IgLXNOYU4yNyAgc05hTjI5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg4NCBvciAgMTAwMCAgICAtTmFOMzAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODg1IG9yICAxMDAwICAgLXNOYU4zMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRQbHVzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUGx1cy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YWEwOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUGx1cy5kZWNUZXN0CkBAIC0wLDAgKzEsODggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRQbHVzLmRlY1Rlc3QgLS0gZGVjRG91YmxlIDAreCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY0RvdWJsZXMuCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrCitkZHBsczAwMSBwbHVzICAgICAgICs3LjUwICAtPiA3LjUwCisKKy0tIEluZmluaXRpZXMKK2RkcGxzMDExIHBsdXMgIEluZmluaXR5ICAgIC0+IEluZmluaXR5CitkZHBsczAxMiBwbHVzICAtSW5maW5pdHkgICAtPiAtSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitkZHBsczAyMSBwbHVzICAgICAgICAgTmFOICAtPiBOYU4KK2RkcGxzMDIyIHBsdXMgICAgICAgIC1OYU4gIC0+IC1OYU4KK2RkcGxzMDIzIHBsdXMgICAgICAgIHNOYU4gIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcGxzMDI0IHBsdXMgICAgICAgLXNOYU4gIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorZGRwbHMwMzEgcGx1cyAgICAgICBOYU4xMyAgLT4gTmFOMTMKK2RkcGxzMDMyIHBsdXMgICAgICAtTmFOMTMgIC0+IC1OYU4xMworZGRwbHMwMzMgcGx1cyAgICAgIHNOYU4xMyAgLT4gTmFOMTMgICBJbnZhbGlkX29wZXJhdGlvbgorZGRwbHMwMzQgcGx1cyAgICAgLXNOYU4xMyAgLT4gLU5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorZGRwbHMwMzUgcGx1cyAgICAgICBOYU43MCAgLT4gTmFONzAKK2RkcGxzMDM2IHBsdXMgICAgICAtTmFONzAgIC0+IC1OYU43MAorZGRwbHMwMzcgcGx1cyAgICAgIHNOYU4xMDEgLT4gTmFOMTAxICBJbnZhbGlkX29wZXJhdGlvbgorZGRwbHMwMzggcGx1cyAgICAgLXNOYU4xMDEgLT4gLU5hTjEwMSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBmaW5pdGVzCitkZHBsczEwMSBwbHVzICAgICAgICAgIDcgICAtPiA3CitkZHBsczEwMiBwbHVzICAgICAgICAgLTcgICAtPiAtNworZGRwbHMxMDMgcGx1cyAgICAgICAgIDc1ICAgLT4gNzUKK2RkcGxzMTA0IHBsdXMgICAgICAgIC03NSAgIC0+IC03NQorZGRwbHMxMDUgcGx1cyAgICAgICA3LjUwICAgLT4gNy41MAorZGRwbHMxMDYgcGx1cyAgICAgIC03LjUwICAgLT4gLTcuNTAKK2RkcGxzMTA3IHBsdXMgICAgICAgNy41MDAgIC0+IDcuNTAwCitkZHBsczEwOCBwbHVzICAgICAgLTcuNTAwICAtPiAtNy41MDAKKworLS0gemVyb3MKK2RkcGxzMTExIHBsdXMgICAgICAgICAgMCAgIC0+IDAKK2RkcGxzMTEyIHBsdXMgICAgICAgICAtMCAgIC0+IDAKK2RkcGxzMTEzIHBsdXMgICAgICAgMEUrNCAgIC0+IDBFKzQKK2RkcGxzMTE0IHBsdXMgICAgICAtMEUrNCAgIC0+IDBFKzQKK2RkcGxzMTE1IHBsdXMgICAgIDAuMDAwMCAgIC0+IDAuMDAwMAorZGRwbHMxMTYgcGx1cyAgICAtMC4wMDAwICAgLT4gMC4wMDAwCitkZHBsczExNyBwbHVzICAgICAgMEUtMTQxICAtPiAwRS0xNDEKK2RkcGxzMTE4IHBsdXMgICAgIC0wRS0xNDEgIC0+IDBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZGRwbHMxMjEgcGx1cyAgMjY4MjY4MjY4MjY4MjY4MiAgICAgICAgIC0+IDI2ODI2ODI2ODI2ODI2ODIKK2RkcGxzMTIyIHBsdXMgIC0yNjgyNjgyNjgyNjgyNjgyICAgICAgICAtPiAtMjY4MjY4MjY4MjY4MjY4MgorZGRwbHMxMjMgcGx1cyAgMTM0MTM0MTM0MTM0MTM0MSAgICAgICAgIC0+IDEzNDEzNDEzNDEzNDEzNDEKK2RkcGxzMTI0IHBsdXMgIC0xMzQxMzQxMzQxMzQxMzQxICAgICAgICAtPiAtMTM0MTM0MTM0MTM0MTM0MQorCistLSBObWF4LCBObWluLCBOdGlueQorZGRwbHMxMzEgcGx1cyAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkcGxzMTMyIHBsdXMgIDFFLTM4MyAgICAgICAgICAgICAgICAgICAtPiAxRS0zODMKK2RkcGxzMTMzIHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZHBsczEzNCBwbHVzICAxRS0zOTggICAgICAgICAgICAgICAgICAgLT4gMUUtMzk4IFN1Ym5vcm1hbAorCitkZHBsczEzNSBwbHVzICAtMUUtMzk4ICAgICAgICAgICAgICAgICAgLT4gLTFFLTM5OCBTdWJub3JtYWwKK2RkcGxzMTM2IHBsdXMgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRwbHMxMzcgcGx1cyAgLTFFLTM4MyAgICAgICAgICAgICAgICAgIC0+IC0xRS0zODMKK2RkcGxzMTM4IHBsdXMgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFF1YW50aXplLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUXVhbnRpemUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDE5YzlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFF1YW50aXplLmRlY1Rlc3QKQEAgLTAsMCArMSw4MzMgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRRdWFudGl6ZS5kZWNUZXN0IC0tIGRlY0RvdWJsZSBxdWFudGl6ZSBvcGVyYXRpb24gICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBNb3N0IG9mIHRoZSB0ZXN0cyBoZXJlIGFzc3VtZSBhICJyZWd1bGFyIHBhdHRlcm4iLCB3aGVyZSB0aGUKKy0tIHNpZ24gYW5kIGNvZWZmaWNpZW50IGFyZSArMS4KKy0tIDIwMDQuMDMuMTUgVW5kZXJmbG93IGZvciBxdWFudGl6ZSBpcyBzdXBwcmVzc2VkCistLSAyMDA1LjA2LjA4IE1vcmUgZXh0ZW5zaXZlIHRlc3RzIGZvciAnZG9lcyBub3QgZml0JworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RkcXVhMDAxIHF1YW50aXplIDAgICAgICAgMWUwICAgLT4gMAorZGRxdWEwMDIgcXVhbnRpemUgMSAgICAgICAxZTAgICAtPiAxCitkZHF1YTAwMyBxdWFudGl6ZSAwLjEgICAgMWUrMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTAwNSBxdWFudGl6ZSAwLjEgICAgMWUrMSAgIC0+IDBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTAwNiBxdWFudGl6ZSAwLjEgICAgIDFlMCAgIC0+IDAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTAwNyBxdWFudGl6ZSAwLjEgICAgMWUtMSAgIC0+IDAuMQorZGRxdWEwMDggcXVhbnRpemUgMC4xICAgIDFlLTIgICAtPiAwLjEwCitkZHF1YTAwOSBxdWFudGl6ZSAwLjEgICAgMWUtMyAgIC0+IDAuMTAwCitkZHF1YTAxMCBxdWFudGl6ZSAwLjkgICAgMWUrMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTAxMSBxdWFudGl6ZSAwLjkgICAgMWUrMSAgIC0+IDBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTAxMiBxdWFudGl6ZSAwLjkgICAgMWUrMCAgIC0+IDEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTAxMyBxdWFudGl6ZSAwLjkgICAgMWUtMSAgIC0+IDAuOQorZGRxdWEwMTQgcXVhbnRpemUgMC45ICAgIDFlLTIgICAtPiAwLjkwCitkZHF1YTAxNSBxdWFudGl6ZSAwLjkgICAgMWUtMyAgIC0+IDAuOTAwCistLSBuZWdhdGl2ZXMKK2RkcXVhMDIxIHF1YW50aXplIC0wICAgICAgMWUwICAgLT4gLTAKK2RkcXVhMDIyIHF1YW50aXplIC0xICAgICAgMWUwICAgLT4gLTEKK2RkcXVhMDIzIHF1YW50aXplIC0wLjEgICAxZSsyICAgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTAyNSBxdWFudGl6ZSAtMC4xICAgMWUrMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEwMjYgcXVhbnRpemUgLTAuMSAgICAxZTAgICAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDI3IHF1YW50aXplIC0wLjEgICAxZS0xICAgLT4gLTAuMQorZGRxdWEwMjggcXVhbnRpemUgLTAuMSAgIDFlLTIgICAtPiAtMC4xMAorZGRxdWEwMjkgcXVhbnRpemUgLTAuMSAgIDFlLTMgICAtPiAtMC4xMDAKK2RkcXVhMDMwIHF1YW50aXplIC0wLjkgICAxZSsyICAgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTAzMSBxdWFudGl6ZSAtMC45ICAgMWUrMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEwMzIgcXVhbnRpemUgLTAuOSAgIDFlKzAgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDMzIHF1YW50aXplIC0wLjkgICAxZS0xICAgLT4gLTAuOQorZGRxdWEwMzQgcXVhbnRpemUgLTAuOSAgIDFlLTIgICAtPiAtMC45MAorZGRxdWEwMzUgcXVhbnRpemUgLTAuOSAgIDFlLTMgICAtPiAtMC45MDAKK2RkcXVhMDM2IHF1YW50aXplIC0wLjUgICAxZSsyICAgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTAzNyBxdWFudGl6ZSAtMC41ICAgMWUrMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEwMzggcXVhbnRpemUgLTAuNSAgIDFlKzAgICAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDM5IHF1YW50aXplIC0wLjUgICAxZS0xICAgLT4gLTAuNQorZGRxdWEwNDAgcXVhbnRpemUgLTAuNSAgIDFlLTIgICAtPiAtMC41MAorZGRxdWEwNDEgcXVhbnRpemUgLTAuNSAgIDFlLTMgICAtPiAtMC41MDAKK2RkcXVhMDQyIHF1YW50aXplIC0wLjkgICAxZSsyICAgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTA0MyBxdWFudGl6ZSAtMC45ICAgMWUrMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEwNDQgcXVhbnRpemUgLTAuOSAgIDFlKzAgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDQ1IHF1YW50aXplIC0wLjkgICAxZS0xICAgLT4gLTAuOQorZGRxdWEwNDYgcXVhbnRpemUgLTAuOSAgIDFlLTIgICAtPiAtMC45MAorZGRxdWEwNDcgcXVhbnRpemUgLTAuOSAgIDFlLTMgICAtPiAtMC45MDAKKworLS0gZXhhbXBsZXMgZnJvbSBTcGVjaWZpY2F0aW9uCitkZHF1YTA2MCBxdWFudGl6ZSAyLjE3ICAgMC4wMDEgIC0+IDIuMTcwCitkZHF1YTA2MSBxdWFudGl6ZSAyLjE3ICAgMC4wMSAgIC0+IDIuMTcKK2RkcXVhMDYyIHF1YW50aXplIDIuMTcgICAwLjEgICAgLT4gMi4yIEluZXhhY3QgUm91bmRlZAorZGRxdWEwNjMgcXVhbnRpemUgMi4xNyAgIDFlKzAgICAtPiAyIEluZXhhY3QgUm91bmRlZAorZGRxdWEwNjQgcXVhbnRpemUgMi4xNyAgIDFlKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEwNjUgcXVhbnRpemUgLUluZiAgICBJbmYgICAtPiAtSW5maW5pdHkKK2RkcXVhMDY2IHF1YW50aXplIDIgICAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTA2NyBxdWFudGl6ZSAtMC4xICAgIDEgICAgIC0+IC0wIEluZXhhY3QgUm91bmRlZAorZGRxdWEwNjggcXVhbnRpemUgLTAgICAgICAxZSs1ICAgICAtPiAtMEUrNQorZGRxdWEwNjkgcXVhbnRpemUgKzEyMzQ1Njc4OTAxMjM0NS42IDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTA3MCBxdWFudGl6ZSAtOTg3NjU0MzM1MjM2NDUwLjYgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhMDcxIHF1YW50aXplIDIxNyAgICAxZS0xICAgLT4gMjE3LjAKK2RkcXVhMDcyIHF1YW50aXplIDIxNyAgICAxZSswICAgLT4gMjE3CitkZHF1YTA3MyBxdWFudGl6ZSAyMTcgICAgMWUrMSAgIC0+IDIuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDc0IHF1YW50aXplIDIxNyAgICAxZSsyICAgLT4gMkUrMiBJbmV4YWN0IFJvdW5kZWQKKworLS0gZ2VuZXJhbCB0ZXN0cyAuLgorZGRxdWEwODkgcXVhbnRpemUgMTIgICAgIDFlKzQgICAtPiAwRSs0IEluZXhhY3QgUm91bmRlZAorZGRxdWEwOTAgcXVhbnRpemUgMTIgICAgIDFlKzMgICAtPiAwRSszIEluZXhhY3QgUm91bmRlZAorZGRxdWEwOTEgcXVhbnRpemUgMTIgICAgIDFlKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEwOTIgcXVhbnRpemUgMTIgICAgIDFlKzEgICAtPiAxRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEwOTMgcXVhbnRpemUgMS4yMzQ1IDFlLTIgICAtPiAxLjIzIEluZXhhY3QgUm91bmRlZAorZGRxdWEwOTQgcXVhbnRpemUgMS4yMzU1IDFlLTIgICAtPiAxLjI0IEluZXhhY3QgUm91bmRlZAorZGRxdWEwOTUgcXVhbnRpemUgMS4yMzQ1IDFlLTYgICAtPiAxLjIzNDUwMAorZGRxdWEwOTYgcXVhbnRpemUgOS45OTk5IDFlLTIgICAtPiAxMC4wMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDk3IHF1YW50aXplIDAuMDAwMSAxZS0yICAgLT4gMC4wMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDk4IHF1YW50aXplIDAuMDAxICAxZS0yICAgLT4gMC4wMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDk5IHF1YW50aXplIDAuMDA5ICAxZS0yICAgLT4gMC4wMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTAwIHF1YW50aXplIDkyICAgICAxZSsyICAgLT4gMUUrMiBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWExMDEgcXVhbnRpemUgLTEgICAgICAxZTAgICAtPiAgLTEKK2RkcXVhMTAyIHF1YW50aXplIC0xICAgICAxZS0xICAgLT4gIC0xLjAKK2RkcXVhMTAzIHF1YW50aXplIC0xICAgICAxZS0yICAgLT4gIC0xLjAwCitkZHF1YTEwNCBxdWFudGl6ZSAgMCAgICAgIDFlMCAgIC0+ICAwCitkZHF1YTEwNSBxdWFudGl6ZSAgMCAgICAgMWUtMSAgIC0+ICAwLjAKK2RkcXVhMTA2IHF1YW50aXplICAwICAgICAxZS0yICAgLT4gIDAuMDAKK2RkcXVhMTA3IHF1YW50aXplICAwLjAwICAgMWUwICAgLT4gIDAKK2RkcXVhMTA4IHF1YW50aXplICAwICAgICAxZSsxICAgLT4gIDBFKzEKK2RkcXVhMTA5IHF1YW50aXplICAwICAgICAxZSsyICAgLT4gIDBFKzIKK2RkcXVhMTEwIHF1YW50aXplICsxICAgICAgMWUwICAgLT4gIDEKK2RkcXVhMTExIHF1YW50aXplICsxICAgICAxZS0xICAgLT4gIDEuMAorZGRxdWExMTIgcXVhbnRpemUgKzEgICAgIDFlLTIgICAtPiAgMS4wMAorCitkZHF1YTEyMCBxdWFudGl6ZSAgIDEuMDQgIDFlLTMgLT4gIDEuMDQwCitkZHF1YTEyMSBxdWFudGl6ZSAgIDEuMDQgIDFlLTIgLT4gIDEuMDQKK2RkcXVhMTIyIHF1YW50aXplICAgMS4wNCAgMWUtMSAtPiAgMS4wIEluZXhhY3QgUm91bmRlZAorZGRxdWExMjMgcXVhbnRpemUgICAxLjA0ICAgMWUwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorZGRxdWExMjQgcXVhbnRpemUgICAxLjA1ICAxZS0zIC0+ICAxLjA1MAorZGRxdWExMjUgcXVhbnRpemUgICAxLjA1ICAxZS0yIC0+ICAxLjA1CitkZHF1YTEyNiBxdWFudGl6ZSAgIDEuMDUgIDFlLTEgLT4gIDEuMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTMxIHF1YW50aXplICAgMS4wNSAgIDFlMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTMyIHF1YW50aXplICAgMS4wNiAgMWUtMyAtPiAgMS4wNjAKK2RkcXVhMTMzIHF1YW50aXplICAgMS4wNiAgMWUtMiAtPiAgMS4wNgorZGRxdWExMzQgcXVhbnRpemUgICAxLjA2ICAxZS0xIC0+ICAxLjEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEzNSBxdWFudGl6ZSAgIDEuMDYgICAxZTAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMTQwIHF1YW50aXplICAgLTEwICAgIDFlLTIgIC0+ICAtMTAuMDAKK2RkcXVhMTQxIHF1YW50aXplICAgKzEgICAgIDFlLTIgIC0+ICAxLjAwCitkZHF1YTE0MiBxdWFudGl6ZSAgICsxMCAgICAxZS0yICAtPiAgMTAuMDAKK2RkcXVhMTQzIHF1YW50aXplICAgMUUrMTcgIDFlLTIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhMTQ0IHF1YW50aXplICAgMUUtMTcgIDFlLTIgIC0+ICAwLjAwIEluZXhhY3QgUm91bmRlZAorZGRxdWExNDUgcXVhbnRpemUgICAxRS0zICAgMWUtMiAgLT4gIDAuMDAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE0NiBxdWFudGl6ZSAgIDFFLTIgICAxZS0yICAtPiAgMC4wMQorZGRxdWExNDcgcXVhbnRpemUgICAxRS0xICAgMWUtMiAgLT4gIDAuMTAKK2RkcXVhMTQ4IHF1YW50aXplICAgMEUtMTcgIDFlLTIgIC0+ICAwLjAwCisKK2RkcXVhMTUwIHF1YW50aXplICAgMS4wNjAwIDFlLTUgLT4gIDEuMDYwMDAKK2RkcXVhMTUxIHF1YW50aXplICAgMS4wNjAwIDFlLTQgLT4gIDEuMDYwMAorZGRxdWExNTIgcXVhbnRpemUgICAxLjA2MDAgMWUtMyAtPiAgMS4wNjAgUm91bmRlZAorZGRxdWExNTMgcXVhbnRpemUgICAxLjA2MDAgMWUtMiAtPiAgMS4wNiBSb3VuZGVkCitkZHF1YTE1NCBxdWFudGl6ZSAgIDEuMDYwMCAxZS0xIC0+ICAxLjEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE1NSBxdWFudGl6ZSAgIDEuMDYwMCAgMWUwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorCistLSBhIGNvdXBsZSB3aGVyZSByb3VuZGluZyB3YXMgZGlmZmVyZW50IGluIGJhc2UgdGVzdHMKK3JvdW5kaW5nOiAgICBoYWxmX3VwCitkZHF1YTE1NyBxdWFudGl6ZSAtMC41ICAgMWUrMCAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAorZGRxdWExNTggcXVhbnRpemUgICAxLjA1ICAxZS0xIC0+ICAxLjEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE1OSBxdWFudGl6ZSAgIDEuMDYgICAxZTAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIGJhc2UgdGVzdHMgd2l0aCBub24tMSBjb2VmZmljaWVudHMKK2RkcXVhMTYxIHF1YW50aXplIDAgICAgICAtOWUwICAgLT4gMAorZGRxdWExNjIgcXVhbnRpemUgMSAgICAgIC03ZTAgICAtPiAxCitkZHF1YTE2MyBxdWFudGl6ZSAwLjEgICAtMWUrMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE2NSBxdWFudGl6ZSAwLjEgICAgMGUrMSAgIC0+IDBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE2NiBxdWFudGl6ZSAwLjEgICAgIDJlMCAgIC0+IDAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE2NyBxdWFudGl6ZSAwLjEgICAgM2UtMSAgIC0+IDAuMQorZGRxdWExNjggcXVhbnRpemUgMC4xICAgNDRlLTIgICAtPiAwLjEwCitkZHF1YTE2OSBxdWFudGl6ZSAwLjEgIDU1NWUtMyAgIC0+IDAuMTAwCitkZHF1YTE3MCBxdWFudGl6ZSAwLjkgNjY2NmUrMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE3MSBxdWFudGl6ZSAwLjkgLTc3N2UrMSAgIC0+IDBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE3MiBxdWFudGl6ZSAwLjkgIC04OGUrMCAgIC0+IDEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE3MyBxdWFudGl6ZSAwLjkgICAtOWUtMSAgIC0+IDAuOQorZGRxdWExNzQgcXVhbnRpemUgMC45ICAgIDBlLTIgICAtPiAwLjkwCitkZHF1YTE3NSBxdWFudGl6ZSAwLjkgIDEuMWUtMyAgIC0+IDAuOTAwMAorLS0gbmVnYXRpdmVzCitkZHF1YTE4MSBxdWFudGl6ZSAtMCAgICAxLjFlMCAgIC0+IC0wLjAKK2RkcXVhMTgyIHF1YW50aXplIC0xICAgICAtMWUwICAgLT4gLTEKK2RkcXVhMTgzIHF1YW50aXplIC0wLjEgIDExZSsyICAgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE4NSBxdWFudGl6ZSAtMC4xIDExMWUrMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWExODYgcXVhbnRpemUgLTAuMSAgIDcxZTAgICAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTg3IHF1YW50aXplIC0wLjEgLTkxZS0xICAgLT4gLTAuMQorZGRxdWExODggcXVhbnRpemUgLTAuMSAtLjFlLTIgICAtPiAtMC4xMDAKK2RkcXVhMTg5IHF1YW50aXplIC0wLjEgIC0xZS0zICAgLT4gLTAuMTAwCitkZHF1YTE5MCBxdWFudGl6ZSAtMC45ICAgMGUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWExOTEgcXVhbnRpemUgLTAuOSAgLTBlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTkyIHF1YW50aXplIC0wLjkgLTEwZSswICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE5MyBxdWFudGl6ZSAtMC45IDEwMGUtMSAgIC0+IC0wLjkKK2RkcXVhMTk0IHF1YW50aXplIC0wLjkgOTk5ZS0yICAgLT4gLTAuOTAKKworLS0gK3ZlIGV4cG9uZW50cyAuLgorZGRxdWEyMDEgcXVhbnRpemUgICAtMSAgIDFlKzAgLT4gIC0xCitkZHF1YTIwMiBxdWFudGl6ZSAgIC0xICAgMWUrMSAtPiAgLTBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIwMyBxdWFudGl6ZSAgIC0xICAgMWUrMiAtPiAgLTBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIwNCBxdWFudGl6ZSAgICAwICAgMWUrMCAtPiAgMAorZGRxdWEyMDUgcXVhbnRpemUgICAgMCAgIDFlKzEgLT4gIDBFKzEKK2RkcXVhMjA2IHF1YW50aXplICAgIDAgICAxZSsyIC0+ICAwRSsyCitkZHF1YTIwNyBxdWFudGl6ZSAgICsxICAgMWUrMCAtPiAgMQorZGRxdWEyMDggcXVhbnRpemUgICArMSAgIDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIwOSBxdWFudGl6ZSAgICsxICAgMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWEyMjAgcXVhbnRpemUgICAxLjA0IDFlKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIyMSBxdWFudGl6ZSAgIDEuMDQgMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjIyIHF1YW50aXplICAgMS4wNCAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMjMgcXVhbnRpemUgICAxLjA0IDFlKzAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIyNCBxdWFudGl6ZSAgIDEuMDUgMWUrMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjI1IHF1YW50aXplICAgMS4wNSAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMjYgcXVhbnRpemUgICAxLjA1IDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIyNyBxdWFudGl6ZSAgIDEuMDUgMWUrMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjI4IHF1YW50aXplICAgMS4wNSAxZSszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMjkgcXVhbnRpemUgICAxLjA1IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIzMCBxdWFudGl6ZSAgIDEuMDUgMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjMxIHF1YW50aXplICAgMS4wNSAxZSswIC0+ICAxIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMzIgcXVhbnRpemUgICAxLjA2IDFlKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIzMyBxdWFudGl6ZSAgIDEuMDYgMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjM0IHF1YW50aXplICAgMS4wNiAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMzUgcXVhbnRpemUgICAxLjA2IDFlKzAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMjQwIHF1YW50aXplICAgLTEwICAgMWUrMSAgLT4gIC0xRSsxIFJvdW5kZWQKK2RkcXVhMjQxIHF1YW50aXplICAgKzEgICAgMWUrMSAgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTI0MiBxdWFudGl6ZSAgICsxMCAgIDFlKzEgIC0+ICAxRSsxIFJvdW5kZWQKK2RkcXVhMjQzIHF1YW50aXplICAgMUUrMSAgMWUrMSAgLT4gIDFFKzEgICAgICAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorZGRxdWEyNDQgcXVhbnRpemUgICAxRSsyICAxZSsxICAtPiAgMS4wRSsyICAgICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitkZHF1YTI0NSBxdWFudGl6ZSAgIDFFKzMgIDFlKzEgIC0+ICAxLjAwRSszICAgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK2RkcXVhMjQ2IHF1YW50aXplICAgMUUrNCAgMWUrMSAgLT4gIDEuMDAwRSs0ICAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorZGRxdWEyNDcgcXVhbnRpemUgICAxRSs1ICAxZSsxICAtPiAgMS4wMDAwRSs1ICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitkZHF1YTI0OCBxdWFudGl6ZSAgIDFFKzYgIDFlKzEgIC0+ICAxLjAwMDAwRSs2ICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK2RkcXVhMjQ5IHF1YW50aXplICAgMUUrNyAgMWUrMSAgLT4gIDEuMDAwMDAwRSs3ICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorZGRxdWEyNTAgcXVhbnRpemUgICAxRSs4ICAxZSsxICAtPiAgMS4wMDAwMDAwRSs4ICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitkZHF1YTI1MSBxdWFudGl6ZSAgIDFFKzkgIDFlKzEgIC0+ICAxLjAwMDAwMDAwRSs5IC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKKy0tIG5leHQgb25lIHRyaWVzIHRvIGFkZCA5IHplcm9zCitkZHF1YTI1MiBxdWFudGl6ZSAgIDFFKzE3IDFlKzEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhMjUzIHF1YW50aXplICAgMUUtMTcgMWUrMSAgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTI1NCBxdWFudGl6ZSAgIDFFLTIgIDFlKzEgIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEyNTUgcXVhbnRpemUgICAwRS0xNyAxZSsxICAtPiAgMEUrMQorZGRxdWEyNTYgcXVhbnRpemUgIC0wRS0xNyAxZSsxICAtPiAtMEUrMQorZGRxdWEyNTcgcXVhbnRpemUgIC0wRS0xICAxZSsxICAtPiAtMEUrMQorZGRxdWEyNTggcXVhbnRpemUgIC0wICAgICAxZSsxICAtPiAtMEUrMQorZGRxdWEyNTkgcXVhbnRpemUgIC0wRSsxICAxZSsxICAtPiAtMEUrMQorCitkZHF1YTI2MCBxdWFudGl6ZSAgIC0xMCAgIDFlKzIgIC0+ICAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjYxIHF1YW50aXplICAgKzEgICAgMWUrMiAgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTI2MiBxdWFudGl6ZSAgICsxMCAgIDFlKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEyNjMgcXVhbnRpemUgICAxRSsxICAxZSsyICAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjY0IHF1YW50aXplICAgMUUrMiAgMWUrMiAgLT4gIDFFKzIKK2RkcXVhMjY1IHF1YW50aXplICAgMUUrMyAgMWUrMiAgLT4gIDEuMEUrMworZGRxdWEyNjYgcXVhbnRpemUgICAxRSs0ICAxZSsyICAtPiAgMS4wMEUrNAorZGRxdWEyNjcgcXVhbnRpemUgICAxRSs1ICAxZSsyICAtPiAgMS4wMDBFKzUKK2RkcXVhMjY4IHF1YW50aXplICAgMUUrNiAgMWUrMiAgLT4gIDEuMDAwMEUrNgorZGRxdWEyNjkgcXVhbnRpemUgICAxRSs3ICAxZSsyICAtPiAgMS4wMDAwMEUrNworZGRxdWEyNzAgcXVhbnRpemUgICAxRSs4ICAxZSsyICAtPiAgMS4wMDAwMDBFKzgKK2RkcXVhMjcxIHF1YW50aXplICAgMUUrOSAgMWUrMiAgLT4gIDEuMDAwMDAwMEUrOQorZGRxdWEyNzIgcXVhbnRpemUgICAxRSsxMCAxZSsyICAtPiAgMS4wMDAwMDAwMEUrMTAKK2RkcXVhMjczIHF1YW50aXplICAgMUUtMTAgMWUrMiAgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTI3NCBxdWFudGl6ZSAgIDFFLTIgIDFlKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEyNzUgcXVhbnRpemUgICAwRS0xMCAxZSsyICAtPiAgMEUrMgorCitkZHF1YTI4MCBxdWFudGl6ZSAgIC0xMCAgIDFlKzMgIC0+ICAtMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjgxIHF1YW50aXplICAgKzEgICAgMWUrMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkZHF1YTI4MiBxdWFudGl6ZSAgICsxMCAgIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZGRxdWEyODMgcXVhbnRpemUgICAxRSsxICAxZSszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjg0IHF1YW50aXplICAgMUUrMiAgMWUrMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkZHF1YTI4NSBxdWFudGl6ZSAgIDFFKzMgIDFlKzMgIC0+ICAxRSszCitkZHF1YTI4NiBxdWFudGl6ZSAgIDFFKzQgIDFlKzMgIC0+ICAxLjBFKzQKK2RkcXVhMjg3IHF1YW50aXplICAgMUUrNSAgMWUrMyAgLT4gIDEuMDBFKzUKK2RkcXVhMjg4IHF1YW50aXplICAgMUUrNiAgMWUrMyAgLT4gIDEuMDAwRSs2CitkZHF1YTI4OSBxdWFudGl6ZSAgIDFFKzcgIDFlKzMgIC0+ICAxLjAwMDBFKzcKK2RkcXVhMjkwIHF1YW50aXplICAgMUUrOCAgMWUrMyAgLT4gIDEuMDAwMDBFKzgKK2RkcXVhMjkxIHF1YW50aXplICAgMUUrOSAgMWUrMyAgLT4gIDEuMDAwMDAwRSs5CitkZHF1YTI5MiBxdWFudGl6ZSAgIDFFKzEwIDFlKzMgIC0+ICAxLjAwMDAwMDBFKzEwCitkZHF1YTI5MyBxdWFudGl6ZSAgIDFFLTEwIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZGRxdWEyOTQgcXVhbnRpemUgICAxRS0yICAxZSszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjk1IHF1YW50aXplICAgMEUtMTAgMWUrMyAgLT4gIDBFKzMKKworLS0gcm91bmQgdXAgZnJvbSBiZWxvdyBbc2lnbiB3cm9uZyBpbiBKSVQgY29tcGlsZXIgb25jZV0KK2RkcXVhMzAwIHF1YW50aXplICAgMC4wMDc4IDFlLTUgLT4gIDAuMDA3ODAKK2RkcXVhMzAxIHF1YW50aXplICAgMC4wMDc4IDFlLTQgLT4gIDAuMDA3OAorZGRxdWEzMDIgcXVhbnRpemUgICAwLjAwNzggMWUtMyAtPiAgMC4wMDggSW5leGFjdCBSb3VuZGVkCitkZHF1YTMwMyBxdWFudGl6ZSAgIDAuMDA3OCAxZS0yIC0+ICAwLjAxIEluZXhhY3QgUm91bmRlZAorZGRxdWEzMDQgcXVhbnRpemUgICAwLjAwNzggMWUtMSAtPiAgMC4wIEluZXhhY3QgUm91bmRlZAorZGRxdWEzMDUgcXVhbnRpemUgICAwLjAwNzggIDFlMCAtPiAgMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzA2IHF1YW50aXplICAgMC4wMDc4IDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTMwNyBxdWFudGl6ZSAgIDAuMDA3OCAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorCitkZHF1YTMxMCBxdWFudGl6ZSAgLTAuMDA3OCAxZS01IC0+IC0wLjAwNzgwCitkZHF1YTMxMSBxdWFudGl6ZSAgLTAuMDA3OCAxZS00IC0+IC0wLjAwNzgKK2RkcXVhMzEyIHF1YW50aXplICAtMC4wMDc4IDFlLTMgLT4gLTAuMDA4IEluZXhhY3QgUm91bmRlZAorZGRxdWEzMTMgcXVhbnRpemUgIC0wLjAwNzggMWUtMiAtPiAtMC4wMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzE0IHF1YW50aXplICAtMC4wMDc4IDFlLTEgLT4gLTAuMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzE1IHF1YW50aXplICAtMC4wMDc4ICAxZTAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTMxNiBxdWFudGl6ZSAgLTAuMDA3OCAxZSsxIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEzMTcgcXVhbnRpemUgIC0wLjAwNzggMWUrMiAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWEzMjAgcXVhbnRpemUgICAwLjA3OCAxZS01IC0+ICAwLjA3ODAwCitkZHF1YTMyMSBxdWFudGl6ZSAgIDAuMDc4IDFlLTQgLT4gIDAuMDc4MAorZGRxdWEzMjIgcXVhbnRpemUgICAwLjA3OCAxZS0zIC0+ICAwLjA3OAorZGRxdWEzMjMgcXVhbnRpemUgICAwLjA3OCAxZS0yIC0+ICAwLjA4IEluZXhhY3QgUm91bmRlZAorZGRxdWEzMjQgcXVhbnRpemUgICAwLjA3OCAxZS0xIC0+ICAwLjEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTMyNSBxdWFudGl6ZSAgIDAuMDc4ICAxZTAgLT4gIDAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTMyNiBxdWFudGl6ZSAgIDAuMDc4IDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTMyNyBxdWFudGl6ZSAgIDAuMDc4IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMzMwIHF1YW50aXplICAtMC4wNzggMWUtNSAtPiAtMC4wNzgwMAorZGRxdWEzMzEgcXVhbnRpemUgIC0wLjA3OCAxZS00IC0+IC0wLjA3ODAKK2RkcXVhMzMyIHF1YW50aXplICAtMC4wNzggMWUtMyAtPiAtMC4wNzgKK2RkcXVhMzMzIHF1YW50aXplICAtMC4wNzggMWUtMiAtPiAtMC4wOCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzM0IHF1YW50aXplICAtMC4wNzggMWUtMSAtPiAtMC4xIEluZXhhY3QgUm91bmRlZAorZGRxdWEzMzUgcXVhbnRpemUgIC0wLjA3OCAgMWUwIC0+IC0wIEluZXhhY3QgUm91bmRlZAorZGRxdWEzMzYgcXVhbnRpemUgIC0wLjA3OCAxZSsxIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEzMzcgcXVhbnRpemUgIC0wLjA3OCAxZSsyIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorCitkZHF1YTM0MCBxdWFudGl6ZSAgIDAuNzggMWUtNSAtPiAgMC43ODAwMAorZGRxdWEzNDEgcXVhbnRpemUgICAwLjc4IDFlLTQgLT4gIDAuNzgwMAorZGRxdWEzNDIgcXVhbnRpemUgICAwLjc4IDFlLTMgLT4gIDAuNzgwCitkZHF1YTM0MyBxdWFudGl6ZSAgIDAuNzggMWUtMiAtPiAgMC43OAorZGRxdWEzNDQgcXVhbnRpemUgICAwLjc4IDFlLTEgLT4gIDAuOCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzQ1IHF1YW50aXplICAgMC43OCAgMWUwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorZGRxdWEzNDYgcXVhbnRpemUgICAwLjc4IDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTM0NyBxdWFudGl6ZSAgIDAuNzggMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWEzNTAgcXVhbnRpemUgIC0wLjc4IDFlLTUgLT4gLTAuNzgwMDAKK2RkcXVhMzUxIHF1YW50aXplICAtMC43OCAxZS00IC0+IC0wLjc4MDAKK2RkcXVhMzUyIHF1YW50aXplICAtMC43OCAxZS0zIC0+IC0wLjc4MAorZGRxdWEzNTMgcXVhbnRpemUgIC0wLjc4IDFlLTIgLT4gLTAuNzgKK2RkcXVhMzU0IHF1YW50aXplICAtMC43OCAxZS0xIC0+IC0wLjggSW5leGFjdCBSb3VuZGVkCitkZHF1YTM1NSBxdWFudGl6ZSAgLTAuNzggIDFlMCAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzU2IHF1YW50aXplICAtMC43OCAxZSsxIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEzNTcgcXVhbnRpemUgIC0wLjc4IDFlKzIgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMzYwIHF1YW50aXplICAgNy44IDFlLTUgLT4gIDcuODAwMDAKK2RkcXVhMzYxIHF1YW50aXplICAgNy44IDFlLTQgLT4gIDcuODAwMAorZGRxdWEzNjIgcXVhbnRpemUgICA3LjggMWUtMyAtPiAgNy44MDAKK2RkcXVhMzYzIHF1YW50aXplICAgNy44IDFlLTIgLT4gIDcuODAKK2RkcXVhMzY0IHF1YW50aXplICAgNy44IDFlLTEgLT4gIDcuOAorZGRxdWEzNjUgcXVhbnRpemUgICA3LjggIDFlMCAtPiAgOCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzY2IHF1YW50aXplICAgNy44IDFlKzEgLT4gIDFFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTM2NyBxdWFudGl6ZSAgIDcuOCAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEzNjggcXVhbnRpemUgICA3LjggMWUrMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWEzNzAgcXVhbnRpemUgIC03LjggMWUtNSAtPiAtNy44MDAwMAorZGRxdWEzNzEgcXVhbnRpemUgIC03LjggMWUtNCAtPiAtNy44MDAwCitkZHF1YTM3MiBxdWFudGl6ZSAgLTcuOCAxZS0zIC0+IC03LjgwMAorZGRxdWEzNzMgcXVhbnRpemUgIC03LjggMWUtMiAtPiAtNy44MAorZGRxdWEzNzQgcXVhbnRpemUgIC03LjggMWUtMSAtPiAtNy44CitkZHF1YTM3NSBxdWFudGl6ZSAgLTcuOCAgMWUwIC0+IC04IEluZXhhY3QgUm91bmRlZAorZGRxdWEzNzYgcXVhbnRpemUgIC03LjggMWUrMSAtPiAtMUUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzc3IHF1YW50aXplICAtNy44IDFlKzIgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTM3OCBxdWFudGl6ZSAgLTcuOCAxZSszIC0+IC0wRSszIEluZXhhY3QgUm91bmRlZAorCistLSBzb21lIGluZGl2aWR1YWxzCitkZHF1YTM4MCBxdWFudGl6ZSAgIDEyMzQ1NjczNTIzNjQuNTA2IDFlLTIgLT4gMTIzNDU2NzM1MjM2NC41MSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzgxIHF1YW50aXplICAgMTIzNDU2NzM1MjM2NDUuMDYgMWUtMiAtPiAxMjM0NTY3MzUyMzY0NS4wNgorZGRxdWEzODIgcXVhbnRpemUgICAxMjM0NTY3MzUyMzY0NTAuNiAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWEzODMgcXVhbnRpemUgICAxMjM0NTY3MzUyMzY0NTA2ICAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWEzODQgcXVhbnRpemUgIC0xMjM0NTY3MzUyMzY0LjUwNiAxZS0yIC0+IC0xMjM0NTY3MzUyMzY0LjUxIEluZXhhY3QgUm91bmRlZAorZGRxdWEzODUgcXVhbnRpemUgIC0xMjM0NTY3MzUyMzY0NS4wNiAxZS0yIC0+IC0xMjM0NTY3MzUyMzY0NS4wNgorZGRxdWEzODYgcXVhbnRpemUgIC0xMjM0NTY3MzUyMzY0NTAuNiAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWEzODcgcXVhbnRpemUgIC0xMjM0NTY3MzUyMzY0NTA2ICAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCityb3VuZGluZzogZG93bgorZGRxdWEzODkgcXVhbnRpemUgICAxMjM0NTY3MzUyMzY0NTAuNiAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gPyBzaG91bGQgdGhhdCBvbmUgaW5zdGVhZCBoYXZlIGJlZW46CistLSBkZHF1YTM4OSBxdWFudGl6ZSAgIDEyMzQ1NjczNTIzNjQ1MC42IDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityb3VuZGluZzogaGFsZl91cAorCistLSBhbmQgYSBmZXcgbW9yZSBmcm9tIGUtbWFpbCBkaXNjdXNzaW9ucworZGRxdWEzOTEgcXVhbnRpemUgIDEyMzQ1Njc4OTEyLjM0NTY3ICAxZS0zIC0+IDEyMzQ1Njc4OTEyLjM0NiAgIEluZXhhY3QgUm91bmRlZAorZGRxdWEzOTIgcXVhbnRpemUgIDEyMzQ1Njc4OTEyMy40NTY3ICAxZS0zIC0+IDEyMzQ1Njc4OTEyMy40NTcgIEluZXhhY3QgUm91bmRlZAorZGRxdWEzOTMgcXVhbnRpemUgIDEyMzQ1Njc4OTEyMzQuNTY3ICAxZS0zIC0+IDEyMzQ1Njc4OTEyMzQuNTY3CitkZHF1YTM5NCBxdWFudGl6ZSAgMTIzNDU2Nzg5MTIzNDUuNjcgIDFlLTMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTM5NSBxdWFudGl6ZSAgMTIzNDU2Nzg5MTIzNDU2LjcgIDFlLTMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTM5NiBxdWFudGl6ZSAgMTIzNDU2Nzg5MTIzNDU2Ny4gIDFlLTMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHNvbWUgOTk5OSByb3VuZC11cCBjYXNlcworZGRxdWE0MDAgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgMWUtNSAgLT4gIDkuOTk5MDAKK2RkcXVhNDAxIHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTQgIC0+ICA5Ljk5OTAKK2RkcXVhNDAyIHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTMgIC0+ICA5Ljk5OQorZGRxdWE0MDMgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgMWUtMiAgLT4gMTAuMDAgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MDQgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgMWUtMSAgLT4gMTAuMCAgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MDUgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgIDFlMCAgLT4gMTAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MDYgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgIDFlMSAgLT4gMUUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MDcgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgIDFlMiAgLT4gMEUrMiAgICAgIEluZXhhY3QgUm91bmRlZAorCitkZHF1YTQxMCBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAxZS01ICAtPiAgMC45OTkwMAorZGRxdWE0MTEgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtNCAgLT4gIDAuOTk5MAorZGRxdWE0MTIgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtMyAgLT4gIDAuOTk5CitkZHF1YTQxMyBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAxZS0yICAtPiAgMS4wMCAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQxNCBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAxZS0xICAtPiAgMS4wICAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQxNSBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAgMWUwICAtPiAgMSAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQxNiBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAgMWUxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhNDIwIHF1YW50aXplICAgMC4wOTk5ICAgICAgIDFlLTUgIC0+ICAwLjA5OTkwCitkZHF1YTQyMSBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS00ICAtPiAgMC4wOTk5CitkZHF1YTQyMiBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS0zICAtPiAgMC4xMDAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQyMyBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS0yICAtPiAgMC4xMCAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQyNCBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS0xICAtPiAgMC4xICAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQyNSBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAgMWUwICAtPiAgMCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQyNiBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAgMWUxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhNDMwIHF1YW50aXplICAgMC4wMDk5OSAgICAgIDFlLTUgIC0+ICAwLjAwOTk5CitkZHF1YTQzMSBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAxZS00ICAtPiAgMC4wMTAwICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQzMiBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAxZS0zICAtPiAgMC4wMTAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQzMyBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAxZS0yICAtPiAgMC4wMSAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQzNCBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAxZS0xICAtPiAgMC4wICAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQzNSBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAgMWUwICAtPiAgMCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQzNiBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAgMWUxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhNDQwIHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTUgIC0+ICAwLjAwMTAwICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDQxIHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTQgIC0+ICAwLjAwMTAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDQyIHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTMgIC0+ICAwLjAwMSAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDQzIHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTIgIC0+ICAwLjAwICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDQ0IHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTEgIC0+ICAwLjAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDQ1IHF1YW50aXplICAgMC4wMDA5OTkgICAgICAxZTAgIC0+ICAwICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDQ2IHF1YW50aXplICAgMC4wMDA5OTkgICAgICAxZTEgIC0+IDBFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWExMDAxIHF1YW50aXplICAwLjAwMCAgICAgICAgMC4wMDEgLT4gIDAuMDAwCitkZHF1YTEwMDIgcXVhbnRpemUgIDAuMDAxICAgICAgICAwLjAwMSAtPiAgMC4wMDEKK2RkcXVhMTAwMyBxdWFudGl6ZSAgMC4wMDEyICAgICAgIDAuMDAxIC0+ICAwLjAwMSAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEwMDQgcXVhbnRpemUgIDAuMDAxOCAgICAgICAwLjAwMSAtPiAgMC4wMDIgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMDA1IHF1YW50aXplICAwLjUwMSAgICAgICAgMC4wMDEgLT4gIDAuNTAxCitkZHF1YTEwMDYgcXVhbnRpemUgIDAuNTAxMiAgICAgICAwLjAwMSAtPiAgMC41MDEgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMDA3IHF1YW50aXplICAwLjUwMTggICAgICAgMC4wMDEgLT4gIDAuNTAyICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTAwOCBxdWFudGl6ZSAgMC45OTkgICAgICAgIDAuMDAxIC0+ICAwLjk5OQorCitkZHF1YTQ4MSBxdWFudGl6ZSAxMjM0NTY3ODAwMCAxZSszIC0+IDEuMjM0NTY3OEUrMTAgUm91bmRlZAorZGRxdWE0ODIgcXVhbnRpemUgMTIzNDU2NzgwMCAgMWUrMSAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK2RkcXVhNDgzIHF1YW50aXplIDEyMzQ1Njc4OTAgIDFlKzEgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCitkZHF1YTQ4NCBxdWFudGl6ZSAxMjM0NTY3ODkxICAxZSsxIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQ4NSBxdWFudGl6ZSAxMjM0NTY3ODkwMSAxZSsyIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorZGRxdWE0ODYgcXVhbnRpemUgMTIzNDU2Nzg5NiAgMWUrMSAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorLS0gYSBwb3RlbnRpYWwgZG91YmxlLXJvdW5kCitkZHF1YTQ4NyBxdWFudGl6ZSAxMjM0Ljk4NzY0MyAxZS00IC0+IDEyMzQuOTg3NiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDg4IHF1YW50aXplIDEyMzQuOTg3NjQ3IDFlLTQgLT4gMTIzNC45ODc2IEluZXhhY3QgUm91bmRlZAorCitkZHF1YTQ5MSBxdWFudGl6ZSAxMjM0NTY3ODAwMCAxZSszIC0+IDEuMjM0NTY3OEUrMTAgUm91bmRlZAorZGRxdWE0OTIgcXVhbnRpemUgMTIzNDU2NzgwMCAgMWUrMSAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK2RkcXVhNDkzIHF1YW50aXplIDEyMzQ1Njc4OTAgIDFlKzEgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCitkZHF1YTQ5NCBxdWFudGl6ZSAxMjM0NTY3ODkxICAxZSsxIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQ5NSBxdWFudGl6ZSAxMjM0NTY3ODkwMSAxZSsyIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorZGRxdWE0OTYgcXVhbnRpemUgMTIzNDU2Nzg5NiAgMWUrMSAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorZGRxdWE0OTcgcXVhbnRpemUgMTIzNC45ODc2NDMgMWUtNCAtPiAxMjM0Ljk4NzYgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQ5OCBxdWFudGl6ZSAxMjM0Ljk4NzY0NyAxZS00IC0+IDEyMzQuOTg3NiBJbmV4YWN0IFJvdW5kZWQKKworLS0gWmVyb3MKK2RkcXVhNTAwIHF1YW50aXplICAgMCAgICAgMWUxIC0+ICAwRSsxCitkZHF1YTUwMSBxdWFudGl6ZSAgIDAgICAgIDFlMCAtPiAgMAorZGRxdWE1MDIgcXVhbnRpemUgICAwICAgIDFlLTEgLT4gIDAuMAorZGRxdWE1MDMgcXVhbnRpemUgICAwLjAgIDFlLTEgLT4gIDAuMAorZGRxdWE1MDQgcXVhbnRpemUgICAwLjAgICAxZTAgLT4gIDAKK2RkcXVhNTA1IHF1YW50aXplICAgMC4wICAxZSsxIC0+ICAwRSsxCitkZHF1YTUwNiBxdWFudGl6ZSAgIDBFKzEgMWUtMSAtPiAgMC4wCitkZHF1YTUwNyBxdWFudGl6ZSAgIDBFKzEgIDFlMCAtPiAgMAorZGRxdWE1MDggcXVhbnRpemUgICAwRSsxIDFlKzEgLT4gIDBFKzEKK2RkcXVhNTA5IHF1YW50aXplICAtMCAgICAgMWUxIC0+IC0wRSsxCitkZHF1YTUxMCBxdWFudGl6ZSAgLTAgICAgIDFlMCAtPiAtMAorZGRxdWE1MTEgcXVhbnRpemUgIC0wICAgIDFlLTEgLT4gLTAuMAorZGRxdWE1MTIgcXVhbnRpemUgIC0wLjAgIDFlLTEgLT4gLTAuMAorZGRxdWE1MTMgcXVhbnRpemUgIC0wLjAgICAxZTAgLT4gLTAKK2RkcXVhNTE0IHF1YW50aXplICAtMC4wICAxZSsxIC0+IC0wRSsxCitkZHF1YTUxNSBxdWFudGl6ZSAgLTBFKzEgMWUtMSAtPiAtMC4wCitkZHF1YTUxNiBxdWFudGl6ZSAgLTBFKzEgIDFlMCAtPiAtMAorZGRxdWE1MTcgcXVhbnRpemUgIC0wRSsxIDFlKzEgLT4gLTBFKzEKKworLS0gU3VzcGljaW91cyBSSFMgdmFsdWVzCitkZHF1YTUyMCBxdWFudGl6ZSAgIDEuMjM0ICAgIDFlMzU5IC0+IDBFKzM1OSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNTIxIHF1YW50aXplIDEyMy40NTYgICAgMWUzNTkgLT4gMEUrMzU5IEluZXhhY3QgUm91bmRlZAorZGRxdWE1MjIgcXVhbnRpemUgICAxLjIzNCAgICAxZTM1OSAtPiAwRSszNTkgSW5leGFjdCBSb3VuZGVkCitkZHF1YTUyMyBxdWFudGl6ZSAxMjMuNDU2ICAgIDFlMzU5IC0+IDBFKzM1OSBJbmV4YWN0IFJvdW5kZWQKKy0tIG5leHQgZm91ciBhcmUgIndvbid0IGZpdCIgb3ZlcmZsCitkZHF1YTUyNiBxdWFudGl6ZSAgIDEuMjM0ICAgMWUtMjk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE1MjcgcXVhbnRpemUgMTIzLjQ1NiAgIDFlLTI5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNTI4IHF1YW50aXplICAgMS4yMzQgICAxZS0yOTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTUyOSBxdWFudGl6ZSAxMjMuNDU2ICAgMWUtMjk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZHF1YTUzMiBxdWFudGl6ZSAgIDEuMjM0RSsyOTkgICAgMWUyOTkgLT4gMUUrMjk5ICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE1MzMgcXVhbnRpemUgICAxLjIzNEUrMjk4ICAgIDFlMjk5IC0+IDBFKzI5OSAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNTM0IHF1YW50aXplICAgMS4yMzQgICAgICAgICAxZTI5OSAtPiAwRSsyOTkgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTUzNyBxdWFudGl6ZSAgIDAgICAgICAgICAgICAxZS0yOTkgLT4gMEUtMjk5CistLSBuZXh0IHR3byBhcmUgIndvbid0IGZpdCIgb3ZlcmZsb3dzCitkZHF1YTUzOCBxdWFudGl6ZSAgIDEuMjM0ICAgICAgICAxZS0yOTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTUzOSBxdWFudGl6ZSAgIDEuMjM0ICAgICAgICAxZS0zMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBbbW9yZSBiZWxvd10KKworLS0gU3BlY2lhbHMKK2RkcXVhNTgwIHF1YW50aXplICBJbmYgICAgLUluZiAgIC0+ICBJbmZpbml0eQorZGRxdWE1ODEgcXVhbnRpemUgIEluZiAgMWUtMjk5ICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNTgyIHF1YW50aXplICBJbmYgIDFlLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTU4MyBxdWFudGl6ZSAgSW5mICAgMWUwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE1ODQgcXVhbnRpemUgIEluZiAgIDFlMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNTg1IHF1YW50aXplICBJbmYgICAxZTI5OSAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTU4NiBxdWFudGl6ZSAgSW5mICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkcXVhNTg3IHF1YW50aXplIC0xMDAwICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTU4OCBxdWFudGl6ZSAtSW5mICAgICBJbmYgICAtPiAgLUluZmluaXR5CitkZHF1YTU4OSBxdWFudGl6ZSAtMSAgICAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE1OTAgcXVhbnRpemUgIDAgICAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNTkxIHF1YW50aXplICAxICAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTU5MiBxdWFudGl6ZSAgMTAwMCAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE1OTMgcXVhbnRpemUgIEluZiAgICAgSW5mICAgLT4gIEluZmluaXR5CitkZHF1YTU5NCBxdWFudGl6ZSAgSW5mICAxZS0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE1OTUgcXVhbnRpemUgLTAgICAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworZGRxdWE2MDAgcXVhbnRpemUgLUluZiAgICAtSW5mICAgLT4gIC1JbmZpbml0eQorZGRxdWE2MDEgcXVhbnRpemUgLUluZiAgMWUtMjk5ICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjAyIHF1YW50aXplIC1JbmYgIDFlLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTYwMyBxdWFudGl6ZSAtSW5mICAgMWUwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2MDQgcXVhbnRpemUgLUluZiAgIDFlMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjA1IHF1YW50aXplIC1JbmYgICAxZTI5OSAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTYwNiBxdWFudGl6ZSAtSW5mICAgICBJbmYgICAtPiAgLUluZmluaXR5CitkZHF1YTYwNyBxdWFudGl6ZSAtMTAwMCAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2MDggcXVhbnRpemUgLUluZiAgICAtSW5mICAgLT4gIC1JbmZpbml0eQorZGRxdWE2MDkgcXVhbnRpemUgLTEgICAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjEwIHF1YW50aXplICAwICAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTYxMSBxdWFudGl6ZSAgMSAgICAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2MTIgcXVhbnRpemUgIDEwMDAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjEzIHF1YW50aXplICBJbmYgICAgLUluZiAgIC0+ICBJbmZpbml0eQorZGRxdWE2MTQgcXVhbnRpemUgLUluZiAgMWUtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjE1IHF1YW50aXplIC0wICAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK2RkcXVhNjIxIHF1YW50aXplICBOYU4gICAtSW5mICAgIC0+ICBOYU4KK2RkcXVhNjIyIHF1YW50aXplICBOYU4gMWUtMjk5ICAgIC0+ICBOYU4KK2RkcXVhNjIzIHF1YW50aXplICBOYU4gMWUtMSAgICAgIC0+ICBOYU4KK2RkcXVhNjI0IHF1YW50aXplICBOYU4gIDFlMCAgICAgIC0+ICBOYU4KK2RkcXVhNjI1IHF1YW50aXplICBOYU4gIDFlMSAgICAgIC0+ICBOYU4KK2RkcXVhNjI2IHF1YW50aXplICBOYU4gIDFlMjk5ICAgIC0+ICBOYU4KK2RkcXVhNjI3IHF1YW50aXplICBOYU4gICAgSW5mICAgIC0+ICBOYU4KK2RkcXVhNjI4IHF1YW50aXplICBOYU4gICAgTmFOICAgIC0+ICBOYU4KK2RkcXVhNjI5IHF1YW50aXplIC1JbmYgICAgTmFOICAgIC0+ICBOYU4KK2RkcXVhNjMwIHF1YW50aXplIC0xMDAwICAgTmFOICAgIC0+ICBOYU4KK2RkcXVhNjMxIHF1YW50aXplIC0xICAgICAgTmFOICAgIC0+ICBOYU4KK2RkcXVhNjMyIHF1YW50aXplICAwICAgICAgTmFOICAgIC0+ICBOYU4KK2RkcXVhNjMzIHF1YW50aXplICAxICAgICAgTmFOICAgIC0+ICBOYU4KK2RkcXVhNjM0IHF1YW50aXplICAxMDAwICAgTmFOICAgIC0+ICBOYU4KK2RkcXVhNjM1IHF1YW50aXplICBJbmYgICAgTmFOICAgIC0+ICBOYU4KK2RkcXVhNjM2IHF1YW50aXplICBOYU4gMWUtMCAgICAgIC0+ICBOYU4KK2RkcXVhNjM3IHF1YW50aXplIC0wICAgICAgTmFOICAgIC0+ICBOYU4KKworZGRxdWE2NDEgcXVhbnRpemUgIHNOYU4gICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjQyIHF1YW50aXplICBzTmFOIDFlLTI5OSAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY0MyBxdWFudGl6ZSAgc05hTiAxZS0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NDQgcXVhbnRpemUgIHNOYU4gIDFlMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjQ1IHF1YW50aXplICBzTmFOICAxZTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY0NiBxdWFudGl6ZSAgc05hTiAgMWUyOTkgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NDcgcXVhbnRpemUgIHNOYU4gICAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjQ4IHF1YW50aXplICBzTmFOICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY0OSBxdWFudGl6ZSAgTmFOICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NTAgcXVhbnRpemUgLUluZiAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjUxIHF1YW50aXplIC0xMDAwICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY1MiBxdWFudGl6ZSAtMSAgICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NTMgcXVhbnRpemUgIDAgICAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjU0IHF1YW50aXplICAxICAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY1NSBxdWFudGl6ZSAgMTAwMCAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NTYgcXVhbnRpemUgIEluZiAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjU3IHF1YW50aXplICBOYU4gICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY1OCBxdWFudGl6ZSAgc05hTiAxZS0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NTkgcXVhbnRpemUgLTAgICAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRxdWE2NjEgcXVhbnRpemUgIE5hTjkgLUluZiAgIC0+ICBOYU45CitkZHF1YTY2MiBxdWFudGl6ZSAgTmFOOCAgOTE5ICAgLT4gIE5hTjgKK2RkcXVhNjYzIHF1YW50aXplICBOYU43MSBJbmYgICAtPiAgTmFONzEKK2RkcXVhNjY0IHF1YW50aXplICBOYU42ICBOYU41ICAtPiAgTmFONgorZGRxdWE2NjUgcXVhbnRpemUgLUluZiAgIE5hTjQgIC0+ICBOYU40CitkZHF1YTY2NiBxdWFudGl6ZSAtOTE5ICAgTmFOMzEgLT4gIE5hTjMxCitkZHF1YTY2NyBxdWFudGl6ZSAgSW5mICAgTmFOMiAgLT4gIE5hTjIKKworZGRxdWE2NzEgcXVhbnRpemUgIHNOYU45OSAtSW5mICAgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NzIgcXVhbnRpemUgIHNOYU45OCAtMTEgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NzMgcXVhbnRpemUgIHNOYU45NyAgTmFOICAgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NzQgcXVhbnRpemUgIHNOYU4xNiBzTmFOOTQgIC0+ICBOYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NzUgcXVhbnRpemUgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NzYgcXVhbnRpemUgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NzcgcXVhbnRpemUgIDA4OCAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NzggcXVhbnRpemUgIEluZiAgICBzTmFOOTAgIC0+ICBOYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NzkgcXVhbnRpemUgIE5hTiAgICBzTmFOODggIC0+ICBOYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCitkZHF1YTY4MSBxdWFudGl6ZSAtTmFOOSAtSW5mICAgLT4gLU5hTjkKK2RkcXVhNjgyIHF1YW50aXplIC1OYU44ICA5MTkgICAtPiAtTmFOOAorZGRxdWE2ODMgcXVhbnRpemUgLU5hTjcxIEluZiAgIC0+IC1OYU43MQorZGRxdWE2ODQgcXVhbnRpemUgLU5hTjYgLU5hTjUgIC0+IC1OYU42CitkZHF1YTY4NSBxdWFudGl6ZSAtSW5mICAtTmFONCAgLT4gLU5hTjQKK2RkcXVhNjg2IHF1YW50aXplIC05MTkgIC1OYU4zMSAtPiAtTmFOMzEKK2RkcXVhNjg3IHF1YW50aXplICBJbmYgIC1OYU4yICAtPiAtTmFOMgorCitkZHF1YTY5MSBxdWFudGl6ZSAtc05hTjk5IC1JbmYgICAgLT4gLU5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY5MiBxdWFudGl6ZSAtc05hTjk4IC0xMSAgICAgLT4gLU5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY5MyBxdWFudGl6ZSAtc05hTjk3ICBOYU4gICAgLT4gLU5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY5NCBxdWFudGl6ZSAtc05hTjE2IHNOYU45NCAgLT4gLU5hTjE2IEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY5NSBxdWFudGl6ZSAtTmFOOTUgLXNOYU45MyAgLT4gLU5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY5NiBxdWFudGl6ZSAtSW5mICAgLXNOYU45MiAgLT4gLU5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY5NyBxdWFudGl6ZSAgMDg4ICAgLXNOYU45MSAgLT4gLU5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY5OCBxdWFudGl6ZSAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY5OSBxdWFudGl6ZSAgTmFOICAgLXNOYU44OCAgLT4gLU5hTjg4IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvdworZGRxdWE3MTAgcXVhbnRpemUgIDEuMDBFLTM4MyAgICAxZS0zODMgIC0+ICAgMUUtMzgzICAgIFJvdW5kZWQKK2RkcXVhNzExIHF1YW50aXplICAwLjFFLTM4MyAgICAyZS0zODQgIC0+ICAgMUUtMzg0ICAgU3Vibm9ybWFsCitkZHF1YTcxMiBxdWFudGl6ZSAgMC4xMEUtMzgzICAgM2UtMzg0ICAtPiAgIDFFLTM4NCAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkZHF1YTcxMyBxdWFudGl6ZSAgMC4xMDBFLTM4MyAgNGUtMzg0ICAtPiAgIDFFLTM4NCAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkZHF1YTcxNCBxdWFudGl6ZSAgMC4wMUUtMzgzICAgNWUtMzg1ICAtPiAgIDFFLTM4NSAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIEVtaW4KK2RkcXVhNzE1IHF1YW50aXplICAwLjk5OUUtMzgzICAgMWUtMzgzICAtPiAgIDFFLTM4MyAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNzE2IHF1YW50aXplICAwLjA5OUUtMzgzIDEwZS0zODQgIC0+ICAgMUUtMzg0ICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorCitkZHF1YTcxNyBxdWFudGl6ZSAgMC4wMDlFLTM4MyAgMWUtMzg1ICAtPiAgIDFFLTM4NSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwKK2RkcXVhNzE4IHF1YW50aXplICAwLjAwMUUtMzgzICAxZS0zODUgIC0+ICAgMEUtMzg1ICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTcxOSBxdWFudGl6ZSAgMC4wMDA5RS0zODMgMWUtMzg1ICAtPiAgIDBFLTM4NSAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE3MjAgcXVhbnRpemUgIDAuMDAwMUUtMzgzIDFlLTM4NSAgLT4gICAwRS0zODUgICBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWE3MzAgcXVhbnRpemUgLTEuMDBFLTM4MyAgIDFlLTM4MyAgLT4gIC0xRS0zODMgICAgIFJvdW5kZWQKK2RkcXVhNzMxIHF1YW50aXplIC0wLjFFLTM4MyAgICAxZS0zODMgIC0+ICAtMEUtMzgzICAgICBSb3VuZGVkIEluZXhhY3QKK2RkcXVhNzMyIHF1YW50aXplIC0wLjEwRS0zODMgICAxZS0zODMgIC0+ICAtMEUtMzgzICAgICBSb3VuZGVkIEluZXhhY3QKK2RkcXVhNzMzIHF1YW50aXplIC0wLjEwMEUtMzgzICAxZS0zODMgIC0+ICAtMEUtMzgzICAgICBSb3VuZGVkIEluZXhhY3QKK2RkcXVhNzM0IHF1YW50aXplIC0wLjAxRS0zODMgICAxZS0zODMgIC0+ICAtMEUtMzgzICAgICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCitkZHF1YTczNSBxdWFudGl6ZSAtMC45OTlFLTM4MyA5MGUtMzgzICAtPiAgLTFFLTM4MyAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTczNiBxdWFudGl6ZSAtMC4wOTlFLTM4MyAtMWUtMzgzICAtPiAgLTBFLTM4MyAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTczNyBxdWFudGl6ZSAtMC4wMDlFLTM4MyAtMWUtMzgzICAtPiAgLTBFLTM4MyAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTczOCBxdWFudGl6ZSAtMC4wMDFFLTM4MyAtMGUtMzgzICAtPiAgLTBFLTM4MyAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTczOSBxdWFudGl6ZSAtMC4wMDAxRS0zODMgMGUtMzgzICAtPiAgLTBFLTM4MyAgICAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhNzQwIHF1YW50aXplIC0xLjAwRS0zODMgICAxZS0zODQgLT4gIC0xLjBFLTM4MyAgIFJvdW5kZWQKK2RkcXVhNzQxIHF1YW50aXplIC0wLjFFLTM4MyAgICAxZS0zODQgLT4gIC0xRS0zODQgICAgU3Vibm9ybWFsCitkZHF1YTc0MiBxdWFudGl6ZSAtMC4xMEUtMzgzICAgMWUtMzg0IC0+ICAtMUUtMzg0ICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkZHF1YTc0MyBxdWFudGl6ZSAtMC4xMDBFLTM4MyAgMWUtMzg0IC0+ICAtMUUtMzg0ICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkZHF1YTc0NCBxdWFudGl6ZSAtMC4wMUUtMzgzICAgMWUtMzg0IC0+ICAtMEUtMzg0ICAgIEluZXhhY3QgUm91bmRlZAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIEVtaW4KK2RkcXVhNzQ1IHF1YW50aXplIC0wLjk5OUUtMzgzICAxZS0zODQgLT4gIC0xLjBFLTM4MyAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE3NDYgcXVhbnRpemUgLTAuMDk5RS0zODMgIDFlLTM4NCAtPiAgLTFFLTM4NCAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCitkZHF1YTc0NyBxdWFudGl6ZSAtMC4wMDlFLTM4MyAgMWUtMzg0IC0+ICAtMEUtMzg0ICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE3NDggcXVhbnRpemUgLTAuMDAxRS0zODMgIDFlLTM4NCAtPiAgLTBFLTM4NCAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNzQ5IHF1YW50aXplIC0wLjAwMDFFLTM4MyAxZS0zODQgLT4gIC0wRS0zODQgICAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhNzUwIHF1YW50aXplIC0xLjAwRS0zODMgICAxZS0zODUgLT4gIC0xLjAwRS0zODMKK2RkcXVhNzUxIHF1YW50aXplIC0wLjFFLTM4MyAgICAxZS0zODUgLT4gIC0xLjBFLTM4NCAgU3Vibm9ybWFsCitkZHF1YTc1MiBxdWFudGl6ZSAtMC4xMEUtMzgzICAgMWUtMzg1IC0+ICAtMS4wRS0zODQgIFN1Ym5vcm1hbAorZGRxdWE3NTMgcXVhbnRpemUgLTAuMTAwRS0zODMgIDFlLTM4NSAtPiAgLTEuMEUtMzg0ICBTdWJub3JtYWwgUm91bmRlZAorZGRxdWE3NTQgcXVhbnRpemUgLTAuMDFFLTM4MyAgIDFlLTM4NSAtPiAgLTFFLTM4NSAgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCitkZHF1YTc1NSBxdWFudGl6ZSAtMC45OTlFLTM4MyAgMWUtMzg1IC0+ICAtMS4wMEUtMzgzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNzU2IHF1YW50aXplIC0wLjA5OUUtMzgzICAxZS0zODUgLT4gIC0xLjBFLTM4NCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorZGRxdWE3NTcgcXVhbnRpemUgLTAuMDA5RS0zODMgIDFlLTM4NSAtPiAgLTFFLTM4NSAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCitkZHF1YTc1OCBxdWFudGl6ZSAtMC4wMDFFLTM4MyAgMWUtMzg1IC0+ICAtMEUtMzg1ICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE3NTkgcXVhbnRpemUgLTAuMDAwMUUtMzgzIDFlLTM4NSAtPiAgLTBFLTM4NSAgICBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWE3NjAgcXVhbnRpemUgLTEuMDBFLTM4MyAgIDFlLTM4NiAtPiAgLTEuMDAwRS0zODMKK2RkcXVhNzYxIHF1YW50aXplIC0wLjFFLTM4MyAgICAxZS0zODYgLT4gIC0xLjAwRS0zODQgIFN1Ym5vcm1hbAorZGRxdWE3NjIgcXVhbnRpemUgLTAuMTBFLTM4MyAgIDFlLTM4NiAtPiAgLTEuMDBFLTM4NCAgU3Vibm9ybWFsCitkZHF1YTc2MyBxdWFudGl6ZSAtMC4xMDBFLTM4MyAgMWUtMzg2IC0+ICAtMS4wMEUtMzg0ICBTdWJub3JtYWwKK2RkcXVhNzY0IHF1YW50aXplIC0wLjAxRS0zODMgICAxZS0zODYgLT4gIC0xLjBFLTM4NSAgIFN1Ym5vcm1hbAorZGRxdWE3NjUgcXVhbnRpemUgLTAuOTk5RS0zODMgIDFlLTM4NiAtPiAgLTkuOTlFLTM4NCAgU3Vibm9ybWFsCitkZHF1YTc2NiBxdWFudGl6ZSAtMC4wOTlFLTM4MyAgMWUtMzg2IC0+ICAtOS45RS0zODUgICBTdWJub3JtYWwKK2RkcXVhNzY3IHF1YW50aXplIC0wLjAwOUUtMzgzICAxZS0zODYgLT4gIC05RS0zODYgICAgIFN1Ym5vcm1hbAorZGRxdWE3NjggcXVhbnRpemUgLTAuMDAxRS0zODMgIDFlLTM4NiAtPiAgLTFFLTM4NiAgICAgU3Vibm9ybWFsCitkZHF1YTc2OSBxdWFudGl6ZSAtMC4wMDAxRS0zODMgMWUtMzg2IC0+ICAtMEUtMzg2ICAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gTW9yZSBmcm9tIEZ1bmcgTGVlCitkZHF1YTEwMjEgcXVhbnRpemUgIDguNjY2NjY2NjY2NjY2MDAwRSszODQgIDEuMDAwMDAwMDAwMDAwMDAwRSszODQgLT4gIDguNjY2NjY2NjY2NjY2MDAwRSszODQKK2RkcXVhMTAyMiBxdWFudGl6ZSAtOC42NjY2NjY2NjY2NjYwMDBFKzM4NCAgMS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAtPiAtOC42NjY2NjY2NjY2NjYwMDBFKzM4NAorZGRxdWExMDI3IHF1YW50aXplIDguNjY2NjY2NjY2NjY2MDAwRSszMjMgIDFFKzMxICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWExMDI5IHF1YW50aXplIDguNjY2NjY2NjZFKzMgICAgICAgICAgIDFFKzMgICAgIC0+IDlFKzMgSW5leGFjdCBSb3VuZGVkCisKKworLS1kZHF1YTEwMzAgcXVhbnRpemUgOC42NjY2NjY2NjY2NjYwMDBFKzM4NCAxRSszODQgICAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IFJvdW5kZWQgSW5leGFjdAorLS1kZHF1YTEwMzEgcXVhbnRpemUgOC42NjY2NjY2NjY2NjYwMDBFKzM4NCAxRSszODQgICAtPiA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0IFJvdW5kZWQKKy0tZGRxdWExMDMyIHF1YW50aXplIDguNjY2NjY2NjY2NjY2MDAwRSszODQgMUUrMzgzICAgLT4gOC42NjY2NjY2NjY2NjYwMDBFKzM4NCBSb3VuZGVkCistLWRkcXVhMTAzMyBxdWFudGl6ZSA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0IDFFKzM4MiAgIC0+IDguNjY2NjY2NjY2NjY2MDAwRSszODQgUm91bmRlZAorLS1kZHF1YTEwMzQgcXVhbnRpemUgOC42NjY2NjY2NjY2NjYwMDBFKzM4NCAxRSszODEgICAtPiA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0IFJvdW5kZWQKKy0tZGRxdWExMDM1IHF1YW50aXplIDguNjY2NjY2NjY2NjY2MDAwRSszODQgMUUrMzgwICAgLT4gOC42NjY2NjY2NjY2NjYwMDBFKzM4NCBSb3VuZGVkCisKKy0tIEludCBhbmQgdUludDMyIGVkZ2UgdmFsdWVzIGZvciB0ZXN0aW5nIGNvbnZlcnNpb25zCitkZHF1YTEwNDAgcXVhbnRpemUgLTIxNDc0ODM2NDYgICAgIDAgLT4gLTIxNDc0ODM2NDYKK2RkcXVhMTA0MSBxdWFudGl6ZSAtMjE0NzQ4MzY0NyAgICAgMCAtPiAtMjE0NzQ4MzY0NworZGRxdWExMDQyIHF1YW50aXplIC0yMTQ3NDgzNjQ4ICAgICAwIC0+IC0yMTQ3NDgzNjQ4CitkZHF1YTEwNDMgcXVhbnRpemUgLTIxNDc0ODM2NDkgICAgIDAgLT4gLTIxNDc0ODM2NDkKK2RkcXVhMTA0NCBxdWFudGl6ZSAgMjE0NzQ4MzY0NiAgICAgMCAtPiAgMjE0NzQ4MzY0NgorZGRxdWExMDQ1IHF1YW50aXplICAyMTQ3NDgzNjQ3ICAgICAwIC0+ICAyMTQ3NDgzNjQ3CitkZHF1YTEwNDYgcXVhbnRpemUgIDIxNDc0ODM2NDggICAgIDAgLT4gIDIxNDc0ODM2NDgKK2RkcXVhMTA0NyBxdWFudGl6ZSAgMjE0NzQ4MzY0OSAgICAgMCAtPiAgMjE0NzQ4MzY0OQorZGRxdWExMDQ4IHF1YW50aXplICA0Mjk0OTY3Mjk0ICAgICAwIC0+ICA0Mjk0OTY3Mjk0CitkZHF1YTEwNDkgcXVhbnRpemUgIDQyOTQ5NjcyOTUgICAgIDAgLT4gIDQyOTQ5NjcyOTUKK2RkcXVhMTA1MCBxdWFudGl6ZSAgNDI5NDk2NzI5NiAgICAgMCAtPiAgNDI5NDk2NzI5NgorZGRxdWExMDUxIHF1YW50aXplICA0Mjk0OTY3Mjk3ICAgICAwIC0+ICA0Mjk0OTY3Mjk3CisKKy0tIFJvdW5kaW5nIHN3YXRoZQorcm91bmRpbmc6IGhhbGZfZXZlbgorZGRxdWExMTAwIHF1YW50aXplICAxLjIzMDAgICAgMS4wMCAgICAtPiAgMS4yMyAgUm91bmRlZAorZGRxdWExMTAxIHF1YW50aXplICAxLjIzMDEgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTExMDIgcXVhbnRpemUgIDEuMjMxMCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTEwMyBxdWFudGl6ZSAgMS4yMzUwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMTA0IHF1YW50aXplICAxLjIzNTEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTExMDUgcXVhbnRpemUgIDEuMjQ1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTEwNiBxdWFudGl6ZSAgMS4yNDUxICAgIDEuMDAgICAgLT4gIDEuMjUgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMTA3IHF1YW50aXplICAxLjIzNjAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTExMDggcXVhbnRpemUgIDEuMjM3MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTEwOSBxdWFudGl6ZSAgMS4yMzk5ICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorZGRxdWExMjAwIHF1YW50aXplICAxLjIzMDAgICAgMS4wMCAgICAtPiAgMS4yMyAgUm91bmRlZAorZGRxdWExMjAxIHF1YW50aXplICAxLjIzMDEgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEyMDIgcXVhbnRpemUgIDEuMjMxMCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTIwMyBxdWFudGl6ZSAgMS4yMzUwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMjA0IHF1YW50aXplICAxLjIzNTEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEyMDUgcXVhbnRpemUgIDEuMjQ1MCAgICAxLjAwICAgIC0+ICAxLjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTIwNiBxdWFudGl6ZSAgMS4yNDUxICAgIDEuMDAgICAgLT4gIDEuMjUgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMjA3IHF1YW50aXplICAxLjIzNjAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEyMDggcXVhbnRpemUgIDEuMjM3MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTIwOSBxdWFudGl6ZSAgMS4yMzk5ICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9kb3duCitkZHF1YTEzMDAgcXVhbnRpemUgIDEuMjMwMCAgICAxLjAwICAgIC0+ICAxLjIzICBSb3VuZGVkCitkZHF1YTEzMDEgcXVhbnRpemUgIDEuMjMwMSAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTMwMiBxdWFudGl6ZSAgMS4yMzEwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMzAzIHF1YW50aXplICAxLjIzNTAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEzMDQgcXVhbnRpemUgIDEuMjM1MSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTMwNSBxdWFudGl6ZSAgMS4yNDUwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMzA2IHF1YW50aXplICAxLjI0NTEgICAgMS4wMCAgICAtPiAgMS4yNSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEzMDcgcXVhbnRpemUgIDEuMjM2MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTMwOCBxdWFudGl6ZSAgMS4yMzcwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMzA5IHF1YW50aXplICAxLjIzOTkgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiB1cAorZGRxdWExNDAwIHF1YW50aXplICAxLjIzMDAgICAgMS4wMCAgICAtPiAgMS4yMyAgUm91bmRlZAorZGRxdWExNDAxIHF1YW50aXplICAxLjIzMDEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE0MDIgcXVhbnRpemUgIDEuMjMxMCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTQwMyBxdWFudGl6ZSAgMS4yMzUwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNDA0IHF1YW50aXplICAxLjIzNTEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE0MDUgcXVhbnRpemUgIDEuMjQ1MCAgICAxLjAwICAgIC0+ICAxLjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTQwNiBxdWFudGl6ZSAgMS4yNDUxICAgIDEuMDAgICAgLT4gIDEuMjUgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNDA3IHF1YW50aXplICAxLjIzNjAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE0MDggcXVhbnRpemUgIDEuMjM3MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTQwOSBxdWFudGl6ZSAgMS4yMzk5ICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNDExIHF1YW50aXplIC0xLjIzOTkgICAgMS4wMCAgICAtPiAtMS4yNCAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkZHF1YTE1MDAgcXVhbnRpemUgIDEuMjMwMCAgICAxLjAwICAgIC0+ICAxLjIzICBSb3VuZGVkCitkZHF1YTE1MDEgcXVhbnRpemUgIDEuMjMwMSAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTUwMiBxdWFudGl6ZSAgMS4yMzEwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNTAzIHF1YW50aXplICAxLjIzNTAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE1MDQgcXVhbnRpemUgIDEuMjM1MSAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTUwNSBxdWFudGl6ZSAgMS4yNDUwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNTA2IHF1YW50aXplICAxLjI0NTEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE1MDcgcXVhbnRpemUgIDEuMjM2MCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTUwOCBxdWFudGl6ZSAgMS4yMzcwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNTA5IHF1YW50aXplICAxLjIzOTkgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE1MTEgcXVhbnRpemUgLTEuMjM5OSAgICAxLjAwICAgIC0+IC0xLjIzICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGNlaWxpbmcKK2RkcXVhMTYwMCBxdWFudGl6ZSAgMS4yMzAwICAgIDEuMDAgICAgLT4gIDEuMjMgIFJvdW5kZWQKK2RkcXVhMTYwMSBxdWFudGl6ZSAgMS4yMzAxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNjAyIHF1YW50aXplICAxLjIzMTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE2MDMgcXVhbnRpemUgIDEuMjM1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTYwNCBxdWFudGl6ZSAgMS4yMzUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNjA1IHF1YW50aXplICAxLjI0NTAgICAgMS4wMCAgICAtPiAgMS4yNSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE2MDYgcXVhbnRpemUgIDEuMjQ1MSAgICAxLjAwICAgIC0+ICAxLjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTYwNyBxdWFudGl6ZSAgMS4yMzYwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNjA4IHF1YW50aXplICAxLjIzNzAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE2MDkgcXVhbnRpemUgIDEuMjM5OSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTYxMSBxdWFudGl6ZSAtMS4yMzk5ICAgIDEuMDAgICAgLT4gLTEuMjMgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZmxvb3IKK2RkcXVhMTcwMCBxdWFudGl6ZSAgMS4yMzAwICAgIDEuMDAgICAgLT4gIDEuMjMgIFJvdW5kZWQKK2RkcXVhMTcwMSBxdWFudGl6ZSAgMS4yMzAxICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNzAyIHF1YW50aXplICAxLjIzMTAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE3MDMgcXVhbnRpemUgIDEuMjM1MCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTcwNCBxdWFudGl6ZSAgMS4yMzUxICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNzA1IHF1YW50aXplICAxLjI0NTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE3MDYgcXVhbnRpemUgIDEuMjQ1MSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTcwNyBxdWFudGl6ZSAgMS4yMzYwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNzA4IHF1YW50aXplICAxLjIzNzAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE3MDkgcXVhbnRpemUgIDEuMjM5OSAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTcxMSBxdWFudGl6ZSAtMS4yMzk5ICAgIDEuMDAgICAgLT4gLTEuMjQgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogMDV1cAorZGRxdWExODAwIHF1YW50aXplICAxLjIwMDAgICAgMS4wMCAgICAtPiAgMS4yMCAgUm91bmRlZAorZGRxdWExODAxIHF1YW50aXplICAxLjIwMDEgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE4MDIgcXVhbnRpemUgIDEuMjAxMCAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTgwMyBxdWFudGl6ZSAgMS4yMDUwICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZGRxdWExODA0IHF1YW50aXplICAxLjIwNTEgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE4MDcgcXVhbnRpemUgIDEuMjA2MCAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTgwOCBxdWFudGl6ZSAgMS4yMDcwICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZGRxdWExODA5IHF1YW50aXplICAxLjIwOTkgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE4MTEgcXVhbnRpemUgLTEuMjA5OSAgICAxLjAwICAgIC0+IC0xLjIxICBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWExOTAwIHF1YW50aXplICAxLjIxMDAgICAgMS4wMCAgICAtPiAgMS4yMSAgUm91bmRlZAorZGRxdWExOTAxIHF1YW50aXplICAxLjIxMDEgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE5MDIgcXVhbnRpemUgIDEuMjExMCAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTkwMyBxdWFudGl6ZSAgMS4yMTUwICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZGRxdWExOTA0IHF1YW50aXplICAxLjIxNTEgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE5MDcgcXVhbnRpemUgIDEuMjE2MCAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTkwOCBxdWFudGl6ZSAgMS4yMTcwICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZGRxdWExOTA5IHF1YW50aXplICAxLjIxOTkgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE5MTEgcXVhbnRpemUgLTEuMjE5OSAgICAxLjAwICAgIC0+IC0xLjIxICBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWEyMDAwIHF1YW50aXplICAxLjI0MDAgICAgMS4wMCAgICAtPiAgMS4yNCAgUm91bmRlZAorZGRxdWEyMDAxIHF1YW50aXplICAxLjI0MDEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIwMDIgcXVhbnRpemUgIDEuMjQxMCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjAwMyBxdWFudGl6ZSAgMS4yNDUwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMDA0IHF1YW50aXplICAxLjI0NTEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIwMDcgcXVhbnRpemUgIDEuMjQ2MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjAwOCBxdWFudGl6ZSAgMS4yNDcwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMDA5IHF1YW50aXplICAxLjI0OTkgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIwMTEgcXVhbnRpemUgLTEuMjQ5OSAgICAxLjAwICAgIC0+IC0xLjI0ICBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWEyMTAwIHF1YW50aXplICAxLjI1MDAgICAgMS4wMCAgICAtPiAgMS4yNSAgUm91bmRlZAorZGRxdWEyMTAxIHF1YW50aXplICAxLjI1MDEgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIxMDIgcXVhbnRpemUgIDEuMjUxMCAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjEwMyBxdWFudGl6ZSAgMS4yNTUwICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMTA0IHF1YW50aXplICAxLjI1NTEgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIxMDcgcXVhbnRpemUgIDEuMjU2MCAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjEwOCBxdWFudGl6ZSAgMS4yNTcwICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMTA5IHF1YW50aXplICAxLjI1OTkgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIxMTEgcXVhbnRpemUgLTEuMjU5OSAgICAxLjAwICAgIC0+IC0xLjI2ICBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWEyMjAwIHF1YW50aXplICAxLjI2MDAgICAgMS4wMCAgICAtPiAgMS4yNiAgUm91bmRlZAorZGRxdWEyMjAxIHF1YW50aXplICAxLjI2MDEgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIyMDIgcXVhbnRpemUgIDEuMjYxMCAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjIwMyBxdWFudGl6ZSAgMS4yNjUwICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMjA0IHF1YW50aXplICAxLjI2NTEgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIyMDcgcXVhbnRpemUgIDEuMjY2MCAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjIwOCBxdWFudGl6ZSAgMS4yNjcwICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMjA5IHF1YW50aXplICAxLjI2OTkgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIyMTEgcXVhbnRpemUgLTEuMjY5OSAgICAxLjAwICAgIC0+IC0xLjI2ICBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWEyMzAwIHF1YW50aXplICAxLjI5MDAgICAgMS4wMCAgICAtPiAgMS4yOSAgUm91bmRlZAorZGRxdWEyMzAxIHF1YW50aXplICAxLjI5MDEgICAgMS4wMCAgICAtPiAgMS4yOSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIzMDIgcXVhbnRpemUgIDEuMjkxMCAgICAxLjAwICAgIC0+ICAxLjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjMwMyBxdWFudGl6ZSAgMS4yOTUwICAgIDEuMDAgICAgLT4gIDEuMjkgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMzA0IHF1YW50aXplICAxLjI5NTEgICAgMS4wMCAgICAtPiAgMS4yOSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIzMDcgcXVhbnRpemUgIDEuMjk2MCAgICAxLjAwICAgIC0+ICAxLjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjMwOCBxdWFudGl6ZSAgMS4yOTcwICAgIDEuMDAgICAgLT4gIDEuMjkgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMzA5IHF1YW50aXplICAxLjI5OTkgICAgMS4wMCAgICAtPiAgMS4yOSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIzMTEgcXVhbnRpemUgLTEuMjk5OSAgICAxLjAwICAgIC0+IC0xLjI5ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gTnVsbCB0ZXN0cworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorZGRxdWE5OTggcXVhbnRpemUgMTAgICAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhOTk5IHF1YW50aXplICAjIDFlMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUmVkdWNlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUmVkdWNlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyOWU1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRSZWR1Y2UuZGVjVGVzdApAQCAtMCwwICsxLDE4MiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZFJlZHVjZS5kZWNUZXN0IC0tIHJlbW92ZSB0cmFpbGluZyB6ZXJvcyBmcm9tIGEgZGVjRG91YmxlICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDAzLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkZHJlZDAwMSByZWR1Y2UgJzEnICAgICAgLT4gJzEnCitkZHJlZDAwMiByZWR1Y2UgJy0xJyAgICAgLT4gJy0xJworZGRyZWQwMDMgcmVkdWNlICcxLjAwJyAgIC0+ICcxJworZGRyZWQwMDQgcmVkdWNlICctMS4wMCcgIC0+ICctMScKK2RkcmVkMDA1IHJlZHVjZSAnMCcgICAgICAtPiAnMCcKK2RkcmVkMDA2IHJlZHVjZSAnMC4wMCcgICAtPiAnMCcKK2RkcmVkMDA3IHJlZHVjZSAnMDAuMCcgICAtPiAnMCcKK2RkcmVkMDA4IHJlZHVjZSAnMDAuMDAnICAtPiAnMCcKK2RkcmVkMDA5IHJlZHVjZSAnMDAnICAgICAtPiAnMCcKK2RkcmVkMDEwIHJlZHVjZSAnMEUrMScgICAtPiAnMCcKK2RkcmVkMDExIHJlZHVjZSAnMEUrNScgICAtPiAnMCcKKworZGRyZWQwMTIgcmVkdWNlICctMicgICAgIC0+ICctMicKK2RkcmVkMDEzIHJlZHVjZSAnMicgICAgICAtPiAnMicKK2RkcmVkMDE0IHJlZHVjZSAnLTIuMDAnICAtPiAnLTInCitkZHJlZDAxNSByZWR1Y2UgJzIuMDAnICAgLT4gJzInCitkZHJlZDAxNiByZWR1Y2UgJy0wJyAgICAgLT4gJy0wJworZGRyZWQwMTcgcmVkdWNlICctMC4wMCcgIC0+ICctMCcKK2RkcmVkMDE4IHJlZHVjZSAnLTAwLjAnICAtPiAnLTAnCitkZHJlZDAxOSByZWR1Y2UgJy0wMC4wMCcgLT4gJy0wJworZGRyZWQwMjAgcmVkdWNlICctMDAnICAgIC0+ICctMCcKK2RkcmVkMDIxIHJlZHVjZSAnLTBFKzUnICAgLT4gJy0wJworZGRyZWQwMjIgcmVkdWNlICctMEUrMScgIC0+ICctMCcKKworZGRyZWQwMzAgcmVkdWNlICcrMC4xJyAgICAgICAgICAgIC0+ICcwLjEnCitkZHJlZDAzMSByZWR1Y2UgJy0wLjEnICAgICAgICAgICAgLT4gJy0wLjEnCitkZHJlZDAzMiByZWR1Y2UgJyswLjAxJyAgICAgICAgICAgLT4gJzAuMDEnCitkZHJlZDAzMyByZWR1Y2UgJy0wLjAxJyAgICAgICAgICAgLT4gJy0wLjAxJworZGRyZWQwMzQgcmVkdWNlICcrMC4wMDEnICAgICAgICAgIC0+ICcwLjAwMScKK2RkcmVkMDM1IHJlZHVjZSAnLTAuMDAxJyAgICAgICAgICAtPiAnLTAuMDAxJworZGRyZWQwMzYgcmVkdWNlICcrMC4wMDAwMDEnICAgICAgIC0+ICcwLjAwMDAwMScKK2RkcmVkMDM3IHJlZHVjZSAnLTAuMDAwMDAxJyAgICAgICAtPiAnLTAuMDAwMDAxJworZGRyZWQwMzggcmVkdWNlICcrMC4wMDAwMDAwMDAwMDEnIC0+ICcxRS0xMicKK2RkcmVkMDM5IHJlZHVjZSAnLTAuMDAwMDAwMDAwMDAxJyAtPiAnLTFFLTEyJworCitkZHJlZDA0MSByZWR1Y2UgMS4xICAgICAgICAtPiAxLjEKK2RkcmVkMDQyIHJlZHVjZSAxLjEwICAgICAgIC0+IDEuMQorZGRyZWQwNDMgcmVkdWNlIDEuMTAwICAgICAgLT4gMS4xCitkZHJlZDA0NCByZWR1Y2UgMS4xMTAgICAgICAtPiAxLjExCitkZHJlZDA0NSByZWR1Y2UgLTEuMSAgICAgICAtPiAtMS4xCitkZHJlZDA0NiByZWR1Y2UgLTEuMTAgICAgICAtPiAtMS4xCitkZHJlZDA0NyByZWR1Y2UgLTEuMTAwICAgICAtPiAtMS4xCitkZHJlZDA0OCByZWR1Y2UgLTEuMTEwICAgICAtPiAtMS4xMQorZGRyZWQwNDkgcmVkdWNlIDkuOSAgICAgICAgLT4gOS45CitkZHJlZDA1MCByZWR1Y2UgOS45MCAgICAgICAtPiA5LjkKK2RkcmVkMDUxIHJlZHVjZSA5LjkwMCAgICAgIC0+IDkuOQorZGRyZWQwNTIgcmVkdWNlIDkuOTkwICAgICAgLT4gOS45OQorZGRyZWQwNTMgcmVkdWNlIC05LjkgICAgICAgLT4gLTkuOQorZGRyZWQwNTQgcmVkdWNlIC05LjkwICAgICAgLT4gLTkuOQorZGRyZWQwNTUgcmVkdWNlIC05LjkwMCAgICAgLT4gLTkuOQorZGRyZWQwNTYgcmVkdWNlIC05Ljk5MCAgICAgLT4gLTkuOTkKKworLS0gc29tZSB0cmFpbGluZyBmcmFjdGlvbmFsIHplcm9zIHdpdGggemVyb3MgaW4gdW5pdHMKK2RkcmVkMDYwIHJlZHVjZSAgMTAuMCAgICAgICAgLT4gMUUrMQorZGRyZWQwNjEgcmVkdWNlICAxMC4wMCAgICAgICAtPiAxRSsxCitkZHJlZDA2MiByZWR1Y2UgIDEwMC4wICAgICAgIC0+IDFFKzIKK2RkcmVkMDYzIHJlZHVjZSAgMTAwLjAwICAgICAgLT4gMUUrMgorZGRyZWQwNjQgcmVkdWNlICAxLjEwMDBFKzMgICAtPiAxLjFFKzMKK2RkcmVkMDY1IHJlZHVjZSAgMS4xMDAwMEUrMyAgLT4gMS4xRSszCitkZHJlZDA2NiByZWR1Y2UgLTEwLjAgICAgICAgIC0+IC0xRSsxCitkZHJlZDA2NyByZWR1Y2UgLTEwLjAwICAgICAgIC0+IC0xRSsxCitkZHJlZDA2OCByZWR1Y2UgLTEwMC4wICAgICAgIC0+IC0xRSsyCitkZHJlZDA2OSByZWR1Y2UgLTEwMC4wMCAgICAgIC0+IC0xRSsyCitkZHJlZDA3MCByZWR1Y2UgLTEuMTAwMEUrMyAgIC0+IC0xLjFFKzMKK2RkcmVkMDcxIHJlZHVjZSAtMS4xMDAwMEUrMyAgLT4gLTEuMUUrMworCistLSBzb21lIGluc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3Mgd2l0aCBwb3NpdGl2ZSBleHBvbmVudAorZGRyZWQwODAgcmVkdWNlICAxMEUrMSAgICAgICAtPiAxRSsyCitkZHJlZDA4MSByZWR1Y2UgIDEwMEUrMSAgICAgIC0+IDFFKzMKK2RkcmVkMDgyIHJlZHVjZSAgMS4wRSsyICAgICAgLT4gMUUrMgorZGRyZWQwODMgcmVkdWNlICAxLjBFKzMgICAgICAtPiAxRSszCitkZHJlZDA4NCByZWR1Y2UgIDEuMUUrMyAgICAgIC0+IDEuMUUrMworZGRyZWQwODUgcmVkdWNlICAxLjAwRSszICAgICAtPiAxRSszCitkZHJlZDA4NiByZWR1Y2UgIDEuMTBFKzMgICAgIC0+IDEuMUUrMworZGRyZWQwODcgcmVkdWNlIC0xMEUrMSAgICAgICAtPiAtMUUrMgorZGRyZWQwODggcmVkdWNlIC0xMDBFKzEgICAgICAtPiAtMUUrMworZGRyZWQwODkgcmVkdWNlIC0xLjBFKzIgICAgICAtPiAtMUUrMgorZGRyZWQwOTAgcmVkdWNlIC0xLjBFKzMgICAgICAtPiAtMUUrMworZGRyZWQwOTEgcmVkdWNlIC0xLjFFKzMgICAgICAtPiAtMS4xRSszCitkZHJlZDA5MiByZWR1Y2UgLTEuMDBFKzMgICAgIC0+IC0xRSszCitkZHJlZDA5MyByZWR1Y2UgLTEuMTBFKzMgICAgIC0+IC0xLjFFKzMKKworLS0gc29tZSBzaWduaWZpY2FudCB0cmFpbGluZyB6ZXJvcywgd2VyZSB3ZSB0byBiZSB0cmltbWluZworZGRyZWQxMDAgcmVkdWNlICAxMSAgICAgICAgICAtPiAxMQorZGRyZWQxMDEgcmVkdWNlICAxMCAgICAgICAgICAtPiAxRSsxCitkZHJlZDEwMiByZWR1Y2UgIDEwLiAgICAgICAgIC0+IDFFKzEKK2RkcmVkMTAzIHJlZHVjZSAgMS4xRSsxICAgICAgLT4gMTEKK2RkcmVkMTA0IHJlZHVjZSAgMS4wRSsxICAgICAgLT4gMUUrMQorZGRyZWQxMDUgcmVkdWNlICAxLjEwRSsyICAgICAtPiAxLjFFKzIKK2RkcmVkMTA2IHJlZHVjZSAgMS4wMEUrMiAgICAgLT4gMUUrMgorZGRyZWQxMDcgcmVkdWNlICAxLjEwMEUrMyAgICAtPiAxLjFFKzMKK2RkcmVkMTA4IHJlZHVjZSAgMS4wMDBFKzMgICAgLT4gMUUrMworZGRyZWQxMDkgcmVkdWNlICAxLjAwMDAwMEUrNiAtPiAxRSs2CitkZHJlZDExMCByZWR1Y2UgLTExICAgICAgICAgIC0+IC0xMQorZGRyZWQxMTEgcmVkdWNlIC0xMCAgICAgICAgICAtPiAtMUUrMQorZGRyZWQxMTIgcmVkdWNlIC0xMC4gICAgICAgICAtPiAtMUUrMQorZGRyZWQxMTMgcmVkdWNlIC0xLjFFKzEgICAgICAtPiAtMTEKK2RkcmVkMTE0IHJlZHVjZSAtMS4wRSsxICAgICAgLT4gLTFFKzEKK2RkcmVkMTE1IHJlZHVjZSAtMS4xMEUrMiAgICAgLT4gLTEuMUUrMgorZGRyZWQxMTYgcmVkdWNlIC0xLjAwRSsyICAgICAtPiAtMUUrMgorZGRyZWQxMTcgcmVkdWNlIC0xLjEwMEUrMyAgICAtPiAtMS4xRSszCitkZHJlZDExOCByZWR1Y2UgLTEuMDAwRSszICAgIC0+IC0xRSszCitkZHJlZDExOSByZWR1Y2UgLTEuMDAwMDBFKzUgIC0+IC0xRSs1CitkZHJlZDEyMCByZWR1Y2UgLTEuMDAwMDAwRSs2IC0+IC0xRSs2CitkZHJlZDEyMSByZWR1Y2UgLTEwLjAwMDAwRSs2IC0+IC0xRSs3CitkZHJlZDEyMiByZWR1Y2UgLTEwMC4wMDAwRSs2IC0+IC0xRSs4CitkZHJlZDEyMyByZWR1Y2UgLTEwMDAuMDAwRSs2IC0+IC0xRSs5CitkZHJlZDEyNCByZWR1Y2UgLTEwMDAwLjAwRSs2IC0+IC0xRSsxMAorZGRyZWQxMjUgcmVkdWNlIC0xMDAwMDAuMEUrNiAtPiAtMUUrMTEKK2RkcmVkMTI2IHJlZHVjZSAtMTAwMDAwMC5FKzYgLT4gLTFFKzEyCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjQXJpdGgKK2RkcmVkMTQwIHJlZHVjZSAnMi4xJyAgICAgLT4gICcyLjEnCitkZHJlZDE0MSByZWR1Y2UgJy0yLjAnICAgIC0+ICAnLTInCitkZHJlZDE0MiByZWR1Y2UgJzEuMjAwJyAgIC0+ICAnMS4yJworZGRyZWQxNDMgcmVkdWNlICctMTIwJyAgICAtPiAgJy0xLjJFKzInCitkZHJlZDE0NCByZWR1Y2UgJzEyMC4wMCcgIC0+ICAnMS4yRSsyJworZGRyZWQxNDUgcmVkdWNlICcwLjAwJyAgICAtPiAgJzAnCisKKy0tIE5tYXgsIE5taW4sIE50aW55CistLSBub3RlIG9yaWdhbWkgZWZmZWN0IG9uIHNvbWUgb2YgdGhlc2UKK2RkcmVkMTUxIHJlZHVjZSAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkcmVkMTUyIHJlZHVjZSAgOS45OTk5OTkwMDAwMDAwMDBFKzM4MCAgIC0+IDkuOTk5OTk5MDAwMDBFKzM4MAorZGRyZWQxNTMgcmVkdWNlICA5Ljk5OTk5OTk5OTk5MDAwMEUrMzg0ICAgLT4gOS45OTk5OTk5OTk5OTAwMDBFKzM4NAorZGRyZWQxNTQgcmVkdWNlICAxRS0zODMgICAgICAgICAgICAgICAgICAgLT4gMUUtMzgzCitkZHJlZDE1NSByZWR1Y2UgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtPiAxRS0zODMKK2RkcmVkMTU2IHJlZHVjZSAgMi4wMDBFLTM5NSAgICAgICAgICAgICAgIC0+IDJFLTM5NSAgIFN1Ym5vcm1hbAorZGRyZWQxNTcgcmVkdWNlICAxRS0zOTggICAgICAgICAgICAgICAgICAgLT4gMUUtMzk4ICAgU3Vibm9ybWFsCisKK2RkcmVkMTYxIHJlZHVjZSAgLTFFLTM5OCAgICAgICAgICAgICAgICAgIC0+IC0xRS0zOTggIFN1Ym5vcm1hbAorZGRyZWQxNjIgcmVkdWNlICAtMi4wMDBFLTM5NSAgICAgICAgICAgICAgLT4gLTJFLTM5NSAgU3Vibm9ybWFsCitkZHJlZDE2MyByZWR1Y2UgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAtMUUtMzgzCitkZHJlZDE2NCByZWR1Y2UgIC0xRS0zODMgICAgICAgICAgICAgICAgICAtPiAtMUUtMzgzCitkZHJlZDE2NSByZWR1Y2UgIC05Ljk5OTk5OTAwMDAwMDAwMEUrMzgwICAtPiAtOS45OTk5OTkwMDAwMEUrMzgwCitkZHJlZDE2NiByZWR1Y2UgIC05Ljk5OTk5OTk5OTk5MDAwMEUrMzg0ICAtPiAtOS45OTk5OTk5OTk5OTAwMDBFKzM4NAorZGRyZWQxNjcgcmVkdWNlICAtOS45OTk5OTk5OTk5OTk5OTBFKzM4NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTkwRSszODQKK2RkcmVkMTY4IHJlZHVjZSAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZHJlZDE2OSByZWR1Y2UgIC05Ljk5OTk5OTk5OTk5OTk5MEUrMzg0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTBFKzM4NAorCisKKy0tIHNwZWNpYWxzIChyZWR1Y2UgZG9lcyBub3QgYWZmZWN0IHBheWxvYWQpCitkZHJlZDgyMCByZWR1Y2UgJ0luZicgICAgLT4gJ0luZmluaXR5JworZGRyZWQ4MjEgcmVkdWNlICctSW5mJyAgIC0+ICctSW5maW5pdHknCitkZHJlZDgyMiByZWR1Y2UgICBOYU4gICAgLT4gIE5hTgorZGRyZWQ4MjMgcmVkdWNlICBzTmFOICAgIC0+ICBOYU4gICAgSW52YWxpZF9vcGVyYXRpb24KK2RkcmVkODI0IHJlZHVjZSAgIE5hTjEwMSAtPiAgTmFOMTAxCitkZHJlZDgyNSByZWR1Y2UgIHNOYU4wMTAgLT4gIE5hTjEwICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZWQ4MjcgcmVkdWNlICAtTmFOICAgIC0+IC1OYU4KK2RkcmVkODI4IHJlZHVjZSAtc05hTiAgICAtPiAtTmFOICAgIEludmFsaWRfb3BlcmF0aW9uCitkZHJlZDgyOSByZWR1Y2UgIC1OYU4xMDEgLT4gLU5hTjEwMQorZGRyZWQ4MzAgcmVkdWNlIC1zTmFOMDEwIC0+IC1OYU4xMCAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0CitkZHJlZDkwMCByZWR1Y2UgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUmVtYWluZGVyLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUmVtYWluZGVyLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkODZmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRSZW1haW5kZXIuZGVjVGVzdApAQCAtMCwwICsxLDYwMCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZFJlbWFpbmRlci5kZWNUZXN0IC0tIGRlY0RvdWJsZSByZW1haW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzIChhcyBiYXNlLCBhYm92ZSkKK2RkcmVtMDAxIHJlbWFpbmRlciAgMSAgICAgMSAgICAtPiAgMAorZGRyZW0wMDIgcmVtYWluZGVyICAyICAgICAxICAgIC0+ICAwCitkZHJlbTAwMyByZW1haW5kZXIgIDEgICAgIDIgICAgLT4gIDEKK2RkcmVtMDA0IHJlbWFpbmRlciAgMiAgICAgMiAgICAtPiAgMAorZGRyZW0wMDUgcmVtYWluZGVyICAwICAgICAxICAgIC0+ICAwCitkZHJlbTAwNiByZW1haW5kZXIgIDAgICAgIDIgICAgLT4gIDAKK2RkcmVtMDA3IHJlbWFpbmRlciAgMSAgICAgMyAgICAtPiAgMQorZGRyZW0wMDggcmVtYWluZGVyICAyICAgICAzICAgIC0+ICAyCitkZHJlbTAwOSByZW1haW5kZXIgIDMgICAgIDMgICAgLT4gIDAKKworZGRyZW0wMTAgcmVtYWluZGVyICAyLjQgICAxICAgIC0+ICAwLjQKK2RkcmVtMDExIHJlbWFpbmRlciAgMi40ICAgLTEgICAtPiAgMC40CitkZHJlbTAxMiByZW1haW5kZXIgIC0yLjQgIDEgICAgLT4gIC0wLjQKK2RkcmVtMDEzIHJlbWFpbmRlciAgLTIuNCAgLTEgICAtPiAgLTAuNAorZGRyZW0wMTQgcmVtYWluZGVyICAyLjQwICAxICAgIC0+ICAwLjQwCitkZHJlbTAxNSByZW1haW5kZXIgIDIuNDAwIDEgICAgLT4gIDAuNDAwCitkZHJlbTAxNiByZW1haW5kZXIgIDIuNCAgIDIgICAgLT4gIDAuNAorZGRyZW0wMTcgcmVtYWluZGVyICAyLjQwMCAyICAgIC0+ICAwLjQwMAorZGRyZW0wMTggcmVtYWluZGVyICAyLiAgICAyICAgIC0+ICAwCitkZHJlbTAxOSByZW1haW5kZXIgIDIwICAgIDIwICAgLT4gIDAKKworZGRyZW0wMjAgcmVtYWluZGVyICAxODcgICAxODcgICAgLT4gIDAKK2RkcmVtMDIxIHJlbWFpbmRlciAgNSAgICAgMiAgICAgIC0+ICAxCitkZHJlbTAyMiByZW1haW5kZXIgIDUgICAgIDIuMCAgICAtPiAgMS4wCitkZHJlbTAyMyByZW1haW5kZXIgIDUgICAgIDIuMDAwICAtPiAgMS4wMDAKK2RkcmVtMDI0IHJlbWFpbmRlciAgNSAgICAgMC4yMDAgIC0+ICAwLjAwMAorZGRyZW0wMjUgcmVtYWluZGVyICA1ICAgICAwLjIwMCAgLT4gIDAuMDAwCisKK2RkcmVtMDMwIHJlbWFpbmRlciAgMSAgICAgMiAgICAgIC0+ICAxCitkZHJlbTAzMSByZW1haW5kZXIgIDEgICAgIDQgICAgICAtPiAgMQorZGRyZW0wMzIgcmVtYWluZGVyICAxICAgICA4ICAgICAgLT4gIDEKKworZGRyZW0wMzMgcmVtYWluZGVyICAxICAgICAxNiAgICAgLT4gIDEKK2RkcmVtMDM0IHJlbWFpbmRlciAgMSAgICAgMzIgICAgIC0+ICAxCitkZHJlbTAzNSByZW1haW5kZXIgIDEgICAgIDY0ICAgICAtPiAgMQorZGRyZW0wNDAgcmVtYWluZGVyICAxICAgIC0yICAgICAgLT4gIDEKK2RkcmVtMDQxIHJlbWFpbmRlciAgMSAgICAtNCAgICAgIC0+ICAxCitkZHJlbTA0MiByZW1haW5kZXIgIDEgICAgLTggICAgICAtPiAgMQorZGRyZW0wNDMgcmVtYWluZGVyICAxICAgIC0xNiAgICAgLT4gIDEKK2RkcmVtMDQ0IHJlbWFpbmRlciAgMSAgICAtMzIgICAgIC0+ICAxCitkZHJlbTA0NSByZW1haW5kZXIgIDEgICAgLTY0ICAgICAtPiAgMQorZGRyZW0wNTAgcmVtYWluZGVyIC0xICAgICAyICAgICAgLT4gIC0xCitkZHJlbTA1MSByZW1haW5kZXIgLTEgICAgIDQgICAgICAtPiAgLTEKK2RkcmVtMDUyIHJlbWFpbmRlciAtMSAgICAgOCAgICAgIC0+ICAtMQorZGRyZW0wNTMgcmVtYWluZGVyIC0xICAgICAxNiAgICAgLT4gIC0xCitkZHJlbTA1NCByZW1haW5kZXIgLTEgICAgIDMyICAgICAtPiAgLTEKK2RkcmVtMDU1IHJlbWFpbmRlciAtMSAgICAgNjQgICAgIC0+ICAtMQorZGRyZW0wNjAgcmVtYWluZGVyIC0xICAgIC0yICAgICAgLT4gIC0xCitkZHJlbTA2MSByZW1haW5kZXIgLTEgICAgLTQgICAgICAtPiAgLTEKK2RkcmVtMDYyIHJlbWFpbmRlciAtMSAgICAtOCAgICAgIC0+ICAtMQorZGRyZW0wNjMgcmVtYWluZGVyIC0xICAgIC0xNiAgICAgLT4gIC0xCitkZHJlbTA2NCByZW1haW5kZXIgLTEgICAgLTMyICAgICAtPiAgLTEKK2RkcmVtMDY1IHJlbWFpbmRlciAtMSAgICAtNjQgICAgIC0+ICAtMQorCitkZHJlbTA2NiByZW1haW5kZXIgIDk5OTk5OTk5OSAgICAgMSAgLT4gMAorZGRyZW0wNjcgcmVtYWluZGVyICA5OTk5OTk5OTkuNCAgIDEgIC0+IDAuNAorZGRyZW0wNjggcmVtYWluZGVyICA5OTk5OTk5OTkuNSAgIDEgIC0+IDAuNQorZGRyZW0wNjkgcmVtYWluZGVyICA5OTk5OTk5OTkuOSAgIDEgIC0+IDAuOQorZGRyZW0wNzAgcmVtYWluZGVyICA5OTk5OTk5OTkuOTk5IDEgIC0+IDAuOTk5CitkZHJlbTA3MSByZW1haW5kZXIgIDk5OTk5OS45OTk5OTkgMSAgLT4gMC45OTk5OTkKK2RkcmVtMDcyIHJlbWFpbmRlciAgOSAgICAgICAgICAgICAxICAtPiAwCitkZHJlbTA3MyByZW1haW5kZXIgIDk5OTk5OTk5OTk5OTk5OTkgMSAgLT4gMAorZGRyZW0wNzQgcmVtYWluZGVyICA5OTk5OTk5OTk5OTk5OTk5IDIgIC0+IDEKK2RkcmVtMDc1IHJlbWFpbmRlciAgOTk5OTk5OTk5OTk5OTk5OSAzICAtPiAwCitkZHJlbTA3NiByZW1haW5kZXIgIDk5OTk5OTk5OTk5OTk5OTkgNCAgLT4gMworCitkZHJlbTA4MCByZW1haW5kZXIgIDAuICAgICAgICAgICAgMSAgLT4gMAorZGRyZW0wODEgcmVtYWluZGVyICAuMCAgICAgICAgICAgIDEgIC0+IDAuMAorZGRyZW0wODIgcmVtYWluZGVyICAwLjAwICAgICAgICAgIDEgIC0+IDAuMDAKK2RkcmVtMDgzIHJlbWFpbmRlciAgMC4wMEUrOSAgICAgICAxICAtPiAwCitkZHJlbTA4NCByZW1haW5kZXIgIDAuMDBFKzMgICAgICAgMSAgLT4gMAorZGRyZW0wODUgcmVtYWluZGVyICAwLjAwRSsyICAgICAgIDEgIC0+IDAKK2RkcmVtMDg2IHJlbWFpbmRlciAgMC4wMEUrMSAgICAgICAxICAtPiAwLjAKK2RkcmVtMDg3IHJlbWFpbmRlciAgMC4wMEUrMCAgICAgICAxICAtPiAwLjAwCitkZHJlbTA4OCByZW1haW5kZXIgIDAuMDBFLTAgICAgICAgMSAgLT4gMC4wMAorZGRyZW0wODkgcmVtYWluZGVyICAwLjAwRS0xICAgICAgIDEgIC0+IDAuMDAwCitkZHJlbTA5MCByZW1haW5kZXIgIDAuMDBFLTIgICAgICAgMSAgLT4gMC4wMDAwCitkZHJlbTA5MSByZW1haW5kZXIgIDAuMDBFLTMgICAgICAgMSAgLT4gMC4wMDAwMAorZGRyZW0wOTIgcmVtYWluZGVyICAwLjAwRS00ICAgICAgIDEgIC0+IDAuMDAwMDAwCitkZHJlbTA5MyByZW1haW5kZXIgIDAuMDBFLTUgICAgICAgMSAgLT4gMEUtNworZGRyZW0wOTQgcmVtYWluZGVyICAwLjAwRS02ICAgICAgIDEgIC0+IDBFLTgKK2RkcmVtMDk1IHJlbWFpbmRlciAgMC4wMDAwRS01MCAgICAxICAtPiAwRS01NAorCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIHJlbWFpbmRlciBieSAwCitkZHJlbTEwMSByZW1haW5kZXIgIDAgICAgICAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkcmVtMTAyIHJlbWFpbmRlciAgMCAgICAgIC0wICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRyZW0xMDMgcmVtYWluZGVyIC0wICAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZHJlbTEwNCByZW1haW5kZXIgLTAgICAgICAtMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkcmVtMTA1IHJlbWFpbmRlciAgMC4wRTUgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRyZW0xMDYgcmVtYWluZGVyICAwLjAwMCAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCistLSBbU29tZSB0aGluayB0aGlzIG5leHQgZ3JvdXAgc2hvdWxkIGJlIERpdmlzaW9uX2J5X3plcm8gZXhjZXB0aW9uLCBidXQKKy0tIElFRUUgODU0IGlzIGV4cGxpY2l0IHRoYXQgaXQgaXMgSW52YWxpZCBvcGVyYXRpb24gLi4gZm9yCistLSByZW1haW5kZXItbmVhciwgYW55d2F5XQorZGRyZW0xMDcgcmVtYWluZGVyICAwLjAwMDEgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMTA4IHJlbWFpbmRlciAgMC4wMSAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTEwOSByZW1haW5kZXIgIDAuMSAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW0xMTAgcmVtYWluZGVyICAxICAgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMTExIHJlbWFpbmRlciAgMSAgICAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTExMiByZW1haW5kZXIgMTAgICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW0xMTMgcmVtYWluZGVyIDFFKzEwMCAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMTE0IHJlbWFpbmRlciAxRSszODAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTExNSByZW1haW5kZXIgIDAuMDAwMSAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW0xMTYgcmVtYWluZGVyICAwLjAxICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMTE5IHJlbWFpbmRlciAgMC4xICAgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTEyMCByZW1haW5kZXIgIDEgICAgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW0xMjEgcmVtYWluZGVyICAxICAgICAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMTIyIHJlbWFpbmRlciAxMCAgICAgIC0wLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTEyMyByZW1haW5kZXIgMUUrMTAwICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW0xMjQgcmVtYWluZGVyIDFFKzM4NCAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGFuZCB6ZXJvcyBvbiBsZWZ0CitkZHJlbTEzMCByZW1haW5kZXIgIDAgICAgICAxICAgLT4gIDAKK2RkcmVtMTMxIHJlbWFpbmRlciAgMCAgICAgLTEgICAtPiAgMAorZGRyZW0xMzIgcmVtYWluZGVyICAwLjAgICAgMSAgIC0+ICAwLjAKK2RkcmVtMTMzIHJlbWFpbmRlciAgMC4wICAgLTEgICAtPiAgMC4wCitkZHJlbTEzNCByZW1haW5kZXIgLTAgICAgICAxICAgLT4gLTAKK2RkcmVtMTM1IHJlbWFpbmRlciAtMCAgICAgLTEgICAtPiAtMAorZGRyZW0xMzYgcmVtYWluZGVyIC0wLjAgICAgMSAgIC0+IC0wLjAKK2RkcmVtMTM3IHJlbWFpbmRlciAtMC4wICAgLTEgICAtPiAtMC4wCisKKy0tIDAuNWVycworZGRyZW0xNDMgcmVtYWluZGVyICAgMC41ICAyICAgICAtPiAgMC41CitkZHJlbTE0NCByZW1haW5kZXIgICAwLjUgIDIuMSAgIC0+ICAwLjUKK2RkcmVtMTQ1IHJlbWFpbmRlciAgIDAuNSAgMi4wMSAgLT4gIDAuNTAKK2RkcmVtMTQ2IHJlbWFpbmRlciAgIDAuNSAgMi4wMDEgLT4gIDAuNTAwCitkZHJlbTE0NyByZW1haW5kZXIgICAwLjUwIDIgICAgIC0+ICAwLjUwCitkZHJlbTE0OCByZW1haW5kZXIgICAwLjUwIDIuMDEgIC0+ICAwLjUwCitkZHJlbTE0OSByZW1haW5kZXIgICAwLjUwIDIuMDAxIC0+ICAwLjUwMAorCistLSBzdGVhZGllcworZGRyZW0xNTAgcmVtYWluZGVyICAxICAxICAgLT4gMAorZGRyZW0xNTEgcmVtYWluZGVyICAxICAyICAgLT4gMQorZGRyZW0xNTIgcmVtYWluZGVyICAxICAzICAgLT4gMQorZGRyZW0xNTMgcmVtYWluZGVyICAxICA0ICAgLT4gMQorZGRyZW0xNTQgcmVtYWluZGVyICAxICA1ICAgLT4gMQorZGRyZW0xNTUgcmVtYWluZGVyICAxICA2ICAgLT4gMQorZGRyZW0xNTYgcmVtYWluZGVyICAxICA3ICAgLT4gMQorZGRyZW0xNTcgcmVtYWluZGVyICAxICA4ICAgLT4gMQorZGRyZW0xNTggcmVtYWluZGVyICAxICA5ICAgLT4gMQorZGRyZW0xNTkgcmVtYWluZGVyICAxICAxMCAgLT4gMQorZGRyZW0xNjAgcmVtYWluZGVyICAxICAxICAgLT4gMAorZGRyZW0xNjEgcmVtYWluZGVyICAyICAxICAgLT4gMAorZGRyZW0xNjIgcmVtYWluZGVyICAzICAxICAgLT4gMAorZGRyZW0xNjMgcmVtYWluZGVyICA0ICAxICAgLT4gMAorZGRyZW0xNjQgcmVtYWluZGVyICA1ICAxICAgLT4gMAorZGRyZW0xNjUgcmVtYWluZGVyICA2ICAxICAgLT4gMAorZGRyZW0xNjYgcmVtYWluZGVyICA3ICAxICAgLT4gMAorZGRyZW0xNjcgcmVtYWluZGVyICA4ICAxICAgLT4gMAorZGRyZW0xNjggcmVtYWluZGVyICA5ICAxICAgLT4gMAorZGRyZW0xNjkgcmVtYWluZGVyICAxMCAxICAgLT4gMAorCistLSBzb21lIGRpZmZlcmVuY2VzIGZyb20gcmVtYWluZGVyTmVhcgorZGRyZW0xNzEgcmVtYWluZGVyICAgMC40ICAxLjAyMCAtPiAgMC40MDAKK2RkcmVtMTcyIHJlbWFpbmRlciAgIDAuNTAgMS4wMjAgLT4gIDAuNTAwCitkZHJlbTE3MyByZW1haW5kZXIgICAwLjUxIDEuMDIwIC0+ICAwLjUxMAorZGRyZW0xNzQgcmVtYWluZGVyICAgMC41MiAxLjAyMCAtPiAgMC41MjAKK2RkcmVtMTc1IHJlbWFpbmRlciAgIDAuNiAgMS4wMjAgLT4gIDAuNjAwCisKKy0tIE1vcmUgZmxhdm91cnMgb2YgcmVtYWluZGVyIGJ5IDAKK2RkcmVtMjAxIHJlbWFpbmRlciAgMCAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZHJlbTIwMiByZW1haW5kZXIgIDAuMEU1ICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRyZW0yMDMgcmVtYWluZGVyICAwLjAwMCAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkcmVtMjA0IHJlbWFpbmRlciAgMC4wMDAxIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMjA1IHJlbWFpbmRlciAgMC4wMSAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMjA2IHJlbWFpbmRlciAgMC4xICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMjA3IHJlbWFpbmRlciAgMSAgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMjA4IHJlbWFpbmRlciAgMSAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMjA5IHJlbWFpbmRlciAxMCAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMjEwIHJlbWFpbmRlciAxRSsxMDAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMjExIHJlbWFpbmRlciAxRSszODAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gc29tZSBkaWZmZXJlbmNlcyBmcm9tIHJlbWFpbmRlck5lYXIKK2RkcmVtMjMxIHJlbWFpbmRlciAgLTAuNCAgMS4wMjAgLT4gLTAuNDAwCitkZHJlbTIzMiByZW1haW5kZXIgIC0wLjUwIDEuMDIwIC0+IC0wLjUwMAorZGRyZW0yMzMgcmVtYWluZGVyICAtMC41MSAxLjAyMCAtPiAtMC41MTAKK2RkcmVtMjM0IHJlbWFpbmRlciAgLTAuNTIgMS4wMjAgLT4gLTAuNTIwCitkZHJlbTIzNSByZW1haW5kZXIgIC0wLjYgIDEuMDIwIC0+IC0wLjYwMAorCistLSBoaWdoIFhzCitkZHJlbTI0MCByZW1haW5kZXIgIDFFKzIgIDEuMDAgIC0+ICAwLjAwCisKKy0tIGRkcmVtM3h4IGFyZSBmcm9tIERpYWdCaWdEZWNpbWFsCitkZHJlbTMwMSByZW1haW5kZXIgICAxICAgIDMgICAgIC0+ICAxCitkZHJlbTMwMiByZW1haW5kZXIgICA1ICAgIDUgICAgIC0+ICAwCitkZHJlbTMwMyByZW1haW5kZXIgICAxMyAgIDEwICAgIC0+ICAzCitkZHJlbTMwNCByZW1haW5kZXIgICAxMyAgIDUwICAgIC0+ICAxMworZGRyZW0zMDUgcmVtYWluZGVyICAgMTMgICAxMDAgICAtPiAgMTMKK2RkcmVtMzA2IHJlbWFpbmRlciAgIDEzICAgMTAwMCAgLT4gIDEzCitkZHJlbTMwNyByZW1haW5kZXIgICAuMTMgICAgMSAgIC0+ICAwLjEzCitkZHJlbTMwOCByZW1haW5kZXIgICAwLjEzMyAgMSAgIC0+ICAwLjEzMworZGRyZW0zMDkgcmVtYWluZGVyICAgMC4xMDMzIDEgICAtPiAgMC4xMDMzCitkZHJlbTMxMCByZW1haW5kZXIgICAxLjAzMyAgMSAgIC0+ICAwLjAzMworZGRyZW0zMTEgcmVtYWluZGVyICAgMTAuMzMgIDEgICAtPiAgMC4zMworZGRyZW0zMTIgcmVtYWluZGVyICAgMTAuMzMgMTAgICAtPiAgMC4zMworZGRyZW0zMTMgcmVtYWluZGVyICAgMTAzLjMgIDEgICAtPiAgMC4zCitkZHJlbTMxNCByZW1haW5kZXIgICAxMzMgICAxMCAgIC0+ICAzCitkZHJlbTMxNSByZW1haW5kZXIgICAxMDMzICAxMCAgIC0+ICAzCitkZHJlbTMxNiByZW1haW5kZXIgICAxMDMzICA1MCAgIC0+ICAzMworZGRyZW0zMTcgcmVtYWluZGVyICAgMTAxLjAgIDMgICAtPiAgMi4wCitkZHJlbTMxOCByZW1haW5kZXIgICAxMDIuMCAgMyAgIC0+ICAwLjAKK2RkcmVtMzE5IHJlbWFpbmRlciAgIDEwMy4wICAzICAgLT4gIDEuMAorZGRyZW0zMjAgcmVtYWluZGVyICAgMi40MCAgIDEgICAtPiAgMC40MAorZGRyZW0zMjEgcmVtYWluZGVyICAgMi40MDAgIDEgICAtPiAgMC40MDAKK2RkcmVtMzIyIHJlbWFpbmRlciAgIDIuNCAgICAxICAgLT4gIDAuNAorZGRyZW0zMjMgcmVtYWluZGVyICAgMi40ICAgIDIgICAtPiAgMC40CitkZHJlbTMyNCByZW1haW5kZXIgICAyLjQwMCAgMiAgIC0+ICAwLjQwMAorZGRyZW0zMjUgcmVtYWluZGVyICAgMSAgIDAuMyAgICAtPiAgMC4xCitkZHJlbTMyNiByZW1haW5kZXIgICAxICAgMC4zMCAgIC0+ICAwLjEwCitkZHJlbTMyNyByZW1haW5kZXIgICAxICAgMC4zMDAgIC0+ICAwLjEwMAorZGRyZW0zMjggcmVtYWluZGVyICAgMSAgIDAuMzAwMCAtPiAgMC4xMDAwCitkZHJlbTMyOSByZW1haW5kZXIgICAxLjAgICAgMC4zIC0+ICAwLjEKK2RkcmVtMzMwIHJlbWFpbmRlciAgIDEuMDAgICAwLjMgLT4gIDAuMTAKK2RkcmVtMzMxIHJlbWFpbmRlciAgIDEuMDAwICAwLjMgLT4gIDAuMTAwCitkZHJlbTMzMiByZW1haW5kZXIgICAxLjAwMDAgMC4zIC0+ICAwLjEwMDAKK2RkcmVtMzMzIHJlbWFpbmRlciAgIDAuNSAgMiAgICAgLT4gIDAuNQorZGRyZW0zMzQgcmVtYWluZGVyICAgMC41ICAyLjEgICAtPiAgMC41CitkZHJlbTMzNSByZW1haW5kZXIgICAwLjUgIDIuMDEgIC0+ICAwLjUwCitkZHJlbTMzNiByZW1haW5kZXIgICAwLjUgIDIuMDAxIC0+ICAwLjUwMAorZGRyZW0zMzcgcmVtYWluZGVyICAgMC41MCAyICAgICAtPiAgMC41MAorZGRyZW0zMzggcmVtYWluZGVyICAgMC41MCAyLjAxICAtPiAgMC41MAorZGRyZW0zMzkgcmVtYWluZGVyICAgMC41MCAyLjAwMSAtPiAgMC41MDAKKworZGRyZW0zNDAgcmVtYWluZGVyICAgMC41ICAgMC41MDAwMDAxICAgIC0+ICAwLjUwMDAwMDAKK2RkcmVtMzQxIHJlbWFpbmRlciAgIDAuNSAgIDAuNTAwMDAwMDEgICAgLT4gIDAuNTAwMDAwMDAKK2RkcmVtMzQyIHJlbWFpbmRlciAgIDAuNSAgIDAuNTAwMDAwMDAxICAgIC0+ICAwLjUwMDAwMDAwMAorZGRyZW0zNDMgcmVtYWluZGVyICAgMC41ICAgMC41MDAwMDAwMDAxICAgIC0+ICAwLjUwMDAwMDAwMDAKK2RkcmVtMzQ0IHJlbWFpbmRlciAgIDAuNSAgIDAuNTAwMDAwMDAwMDEgICAgLT4gIDAuNTAwMDAwMDAwMDAKK2RkcmVtMzQ1IHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OSAgICAtPiAgMUUtNworZGRyZW0zNDYgcmVtYWluZGVyICAgMC41ICAgMC40OTk5OTk5OSAgICAtPiAgMUUtOAorZGRyZW0zNDcgcmVtYWluZGVyICAgMC41ICAgMC40OTk5OTk5OTkgICAgLT4gIDFFLTkKK2RkcmVtMzQ4IHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OTk5OSAgICAtPiAgMUUtMTAKK2RkcmVtMzQ5IHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OTk5OTkgICAgLT4gIDFFLTExCitkZHJlbTM1MCByZW1haW5kZXIgICAwLjUgICAwLjQ5OTk5OTk5OTk5OSAgICAtPiAgMUUtMTIKKworZGRyZW0zNTEgcmVtYWluZGVyICAgMC4wMyAgNyAgLT4gIDAuMDMKK2RkcmVtMzUyIHJlbWFpbmRlciAgIDUgICAyICAgIC0+ICAxCitkZHJlbTM1MyByZW1haW5kZXIgICA0LjEgICAyICAgIC0+ICAwLjEKK2RkcmVtMzU0IHJlbWFpbmRlciAgIDQuMDEgICAyICAgIC0+ICAwLjAxCitkZHJlbTM1NSByZW1haW5kZXIgICA0LjAwMSAgIDIgICAgLT4gIDAuMDAxCitkZHJlbTM1NiByZW1haW5kZXIgICA0LjAwMDEgICAyICAgIC0+ICAwLjAwMDEKK2RkcmVtMzU3IHJlbWFpbmRlciAgIDQuMDAwMDEgICAyICAgIC0+ICAwLjAwMDAxCitkZHJlbTM1OCByZW1haW5kZXIgICA0LjAwMDAwMSAgIDIgICAgLT4gIDAuMDAwMDAxCitkZHJlbTM1OSByZW1haW5kZXIgICA0LjAwMDAwMDEgICAyICAgIC0+ICAxRS03CisKK2RkcmVtMzYwIHJlbWFpbmRlciAgIDEuMiAgIDAuNzM0NSAtPiAgMC40NjU1CitkZHJlbTM2MSByZW1haW5kZXIgICAwLjggICAxMiAgICAgLT4gIDAuOAorZGRyZW0zNjIgcmVtYWluZGVyICAgMC44ICAgMC4yICAgIC0+ICAwLjAKK2RkcmVtMzYzIHJlbWFpbmRlciAgIDAuOCAgIDAuMyAgICAtPiAgMC4yCitkZHJlbTM2NCByZW1haW5kZXIgICAwLjgwMCAgIDEyICAgLT4gIDAuODAwCitkZHJlbTM2NSByZW1haW5kZXIgICAwLjgwMCAgIDEuNyAgLT4gIDAuODAwCitkZHJlbTM2NiByZW1haW5kZXIgICAyLjQwMCAgIDIgICAgLT4gIDAuNDAwCisKK2RkcmVtMzcxIHJlbWFpbmRlciAgIDIuNDAwICAyICAgICAgICAtPiAgMC40MDAKKworZGRyZW0zODEgcmVtYWluZGVyIDEyMzQ1ICAxICAgICAgICAgLT4gIDAKK2RkcmVtMzgyIHJlbWFpbmRlciAxMjM0NSAgMS4wMDAxICAgIC0+ICAwLjc2NTcKK2RkcmVtMzgzIHJlbWFpbmRlciAxMjM0NSAgMS4wMDEgICAgIC0+ICAwLjY2OAorZGRyZW0zODQgcmVtYWluZGVyIDEyMzQ1ICAxLjAxICAgICAgLT4gIDAuNzgKK2RkcmVtMzg1IHJlbWFpbmRlciAxMjM0NSAgMS4xICAgICAgIC0+ICAwLjgKK2RkcmVtMzg2IHJlbWFpbmRlciAxMjM1NSAgNCAgICAgICAgIC0+ICAzCitkZHJlbTM4NyByZW1haW5kZXIgMTIzNDUgIDQgICAgICAgICAtPiAgMQorZGRyZW0zODggcmVtYWluZGVyIDEyMzU1ICA0LjAwMDEgICAgLT4gIDIuNjkxMgorZGRyZW0zODkgcmVtYWluZGVyIDEyMzQ1ICA0LjAwMDEgICAgLT4gIDAuNjkxNAorZGRyZW0zOTAgcmVtYWluZGVyIDEyMzQ1ICA0LjkgICAgICAgLT4gIDEuOQorZGRyZW0zOTEgcmVtYWluZGVyIDEyMzQ1ICA0Ljk5ICAgICAgLT4gIDQuNzMKK2RkcmVtMzkyIHJlbWFpbmRlciAxMjM0NSAgNC45OTkgICAgIC0+ICAyLjQ2OQorZGRyZW0zOTMgcmVtYWluZGVyIDEyMzQ1ICA0Ljk5OTkgICAgLT4gIDAuMjQ2OQorZGRyZW0zOTQgcmVtYWluZGVyIDEyMzQ1ICA1ICAgICAgICAgLT4gIDAKK2RkcmVtMzk1IHJlbWFpbmRlciAxMjM0NSAgNS4wMDAxICAgIC0+ICA0Ljc1MzIKK2RkcmVtMzk2IHJlbWFpbmRlciAxMjM0NSAgNS4wMDEgICAgIC0+ICAyLjUzMgorZGRyZW0zOTcgcmVtYWluZGVyIDEyMzQ1ICA1LjAxICAgICAgLT4gIDAuMzYKK2RkcmVtMzk4IHJlbWFpbmRlciAxMjM0NSAgNS4xICAgICAgIC0+ICAzLjAKKworLS0gdGhlIG5hc3R5IGRpdmlzaW9uLWJ5LTEgY2FzZXMKK2RkcmVtNDAxIHJlbWFpbmRlciAgIDAuNSAgICAgICAgIDEgICAtPiAgMC41CitkZHJlbTQwMiByZW1haW5kZXIgICAwLjU1ICAgICAgICAxICAgLT4gIDAuNTUKK2RkcmVtNDAzIHJlbWFpbmRlciAgIDAuNTU1ICAgICAgIDEgICAtPiAgMC41NTUKK2RkcmVtNDA0IHJlbWFpbmRlciAgIDAuNTU1NSAgICAgIDEgICAtPiAgMC41NTU1CitkZHJlbTQwNSByZW1haW5kZXIgICAwLjU1NTU1ICAgICAxICAgLT4gIDAuNTU1NTUKK2RkcmVtNDA2IHJlbWFpbmRlciAgIDAuNTU1NTU1ICAgIDEgICAtPiAgMC41NTU1NTUKK2RkcmVtNDA3IHJlbWFpbmRlciAgIDAuNTU1NTU1NSAgIDEgICAtPiAgMC41NTU1NTU1CitkZHJlbTQwOCByZW1haW5kZXIgICAwLjU1NTU1NTU1ICAxICAgLT4gIDAuNTU1NTU1NTUKK2RkcmVtNDA5IHJlbWFpbmRlciAgIDAuNTU1NTU1NTU1IDEgICAtPiAgMC41NTU1NTU1NTUKKworLS0gZm9sZGRvd25zCitkZHJlbTQyMSByZW1haW5kZXIgICAxRSszODQgICAgICAgMSAgLT4gICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRyZW00MjIgcmVtYWluZGVyICAgMUUrMzg0ICAxRSszODMgIC0+ICAgMEUrMzY5IENsYW1wZWQKK2RkcmVtNDIzIHJlbWFpbmRlciAgIDFFKzM4NCAgMkUrMzgzICAtPiAgIDBFKzM2OSBDbGFtcGVkCitkZHJlbTQyNCByZW1haW5kZXIgICAxRSszODQgIDNFKzM4MyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwRSszODMgQ2xhbXBlZAorZGRyZW00MjUgcmVtYWluZGVyICAgMUUrMzg0ICA0RSszODMgIC0+ICAgMi4wMDAwMDAwMDAwMDAwMEUrMzgzIENsYW1wZWQKK2RkcmVtNDI2IHJlbWFpbmRlciAgIDFFKzM4NCAgNUUrMzgzICAtPiAgIDBFKzM2OSBDbGFtcGVkCitkZHJlbTQyNyByZW1haW5kZXIgICAxRSszODQgIDZFKzM4MyAgLT4gICA0LjAwMDAwMDAwMDAwMDAwRSszODMgQ2xhbXBlZAorZGRyZW00MjggcmVtYWluZGVyICAgMUUrMzg0ICA3RSszODMgIC0+ICAgMy4wMDAwMDAwMDAwMDAwMEUrMzgzIENsYW1wZWQKK2RkcmVtNDI5IHJlbWFpbmRlciAgIDFFKzM4NCAgOEUrMzgzICAtPiAgIDIuMDAwMDAwMDAwMDAwMDBFKzM4MyBDbGFtcGVkCitkZHJlbTQzMCByZW1haW5kZXIgICAxRSszODQgIDlFKzM4MyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwRSszODMgQ2xhbXBlZAorLS0gdGluaWVzCitkZHJlbTQzMSByZW1haW5kZXIgICAxRS0zOTcgIDFFLTM5OCAgLT4gICAwRS0zOTgKK2RkcmVtNDMyIHJlbWFpbmRlciAgIDFFLTM5NyAgMkUtMzk4ICAtPiAgIDBFLTM5OAorZGRyZW00MzMgcmVtYWluZGVyICAgMUUtMzk3ICAzRS0zOTggIC0+ICAgMUUtMzk4IFN1Ym5vcm1hbAorZGRyZW00MzQgcmVtYWluZGVyICAgMUUtMzk3ICA0RS0zOTggIC0+ICAgMkUtMzk4IFN1Ym5vcm1hbAorZGRyZW00MzUgcmVtYWluZGVyICAgMUUtMzk3ICA1RS0zOTggIC0+ICAgMEUtMzk4CitkZHJlbTQzNiByZW1haW5kZXIgICAxRS0zOTcgIDZFLTM5OCAgLT4gICA0RS0zOTggU3Vibm9ybWFsCitkZHJlbTQzNyByZW1haW5kZXIgICAxRS0zOTcgIDdFLTM5OCAgLT4gICAzRS0zOTggU3Vibm9ybWFsCitkZHJlbTQzOCByZW1haW5kZXIgICAxRS0zOTcgIDhFLTM5OCAgLT4gICAyRS0zOTggU3Vibm9ybWFsCitkZHJlbTQzOSByZW1haW5kZXIgICAxRS0zOTcgIDlFLTM5OCAgLT4gICAxRS0zOTggU3Vibm9ybWFsCitkZHJlbTQ0MCByZW1haW5kZXIgICAxRS0zOTcgMTBFLTM5OCAgLT4gICAwRS0zOTgKK2RkcmVtNDQxIHJlbWFpbmRlciAgIDFFLTM5NyAxMUUtMzk4ICAtPiAxLjBFLTM5NyBTdWJub3JtYWwKK2RkcmVtNDQyIHJlbWFpbmRlciAxMDBFLTM5NyAxMUUtMzk4ICAtPiAxLjBFLTM5NyBTdWJub3JtYWwKK2RkcmVtNDQzIHJlbWFpbmRlciAxMDBFLTM5NyAyMEUtMzk4ICAtPiAgIDBFLTM5OAorZGRyZW00NDQgcmVtYWluZGVyIDEwMEUtMzk3IDIxRS0zOTggIC0+IDEuM0UtMzk3IFN1Ym5vcm1hbAorZGRyZW00NDUgcmVtYWluZGVyIDEwMEUtMzk3IDMwRS0zOTggIC0+IDEuMEUtMzk3IFN1Ym5vcm1hbAorCistLSB6ZXJvIHNpZ25zCitkZHJlbTY1MCByZW1haW5kZXIgIDEgIDEgLT4gIDAKK2RkcmVtNjUxIHJlbWFpbmRlciAtMSAgMSAtPiAtMAorZGRyZW02NTIgcmVtYWluZGVyICAxIC0xIC0+ICAwCitkZHJlbTY1MyByZW1haW5kZXIgLTEgLTEgLT4gLTAKK2RkcmVtNjU0IHJlbWFpbmRlciAgMCAgMSAtPiAgMAorZGRyZW02NTUgcmVtYWluZGVyIC0wICAxIC0+IC0wCitkZHJlbTY1NiByZW1haW5kZXIgIDAgLTEgLT4gIDAKK2RkcmVtNjU3IHJlbWFpbmRlciAtMCAtMSAtPiAtMAorZGRyZW02NTggcmVtYWluZGVyICAwLjAwICAxICAtPiAgMC4wMAorZGRyZW02NTkgcmVtYWluZGVyIC0wLjAwICAxICAtPiAtMC4wMAorCistLSBTcGVjaWFscworZGRyZW02ODAgcmVtYWluZGVyICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTY4MSByZW1haW5kZXIgIEluZiAgLTEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNjgyIHJlbWFpbmRlciAgSW5mICAtMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW02ODMgcmVtYWluZGVyICBJbmYgICAwICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTY4NCByZW1haW5kZXIgIEluZiAgLTAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNjg1IHJlbWFpbmRlciAgSW5mICAgMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW02ODYgcmVtYWluZGVyICBJbmYgICAxMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTY4NyByZW1haW5kZXIgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNjg4IHJlbWFpbmRlciAtMTAwMCAgSW5mICAgLT4gLTEwMDAKK2RkcmVtNjg5IHJlbWFpbmRlciAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW02OTEgcmVtYWluZGVyIC0xICAgICBJbmYgICAtPiAtMQorZGRyZW02OTIgcmVtYWluZGVyICAwICAgICBJbmYgICAtPiAgMAorZGRyZW02OTMgcmVtYWluZGVyIC0wICAgICBJbmYgICAtPiAtMAorZGRyZW02OTQgcmVtYWluZGVyICAxICAgICBJbmYgICAtPiAgMQorZGRyZW02OTUgcmVtYWluZGVyICAxMDAwICBJbmYgICAtPiAgMTAwMAorZGRyZW02OTYgcmVtYWluZGVyICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RkcmVtNzAwIHJlbWFpbmRlciAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03MDEgcmVtYWluZGVyIC1JbmYgIC0xMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTcwMiByZW1haW5kZXIgLUluZiAgLTEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNzAzIHJlbWFpbmRlciAtSW5mICAtMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03MDQgcmVtYWluZGVyIC1JbmYgICAwICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTcwNSByZW1haW5kZXIgLUluZiAgIDEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNzA2IHJlbWFpbmRlciAtSW5mICAgMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03MDcgcmVtYWluZGVyIC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTcwOCByZW1haW5kZXIgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNzA5IHJlbWFpbmRlciAtMTAwMCAgSW5mICAgLT4gLTEwMDAKK2RkcmVtNzEwIHJlbWFpbmRlciAtMSAgICAtSW5mICAgLT4gLTEKK2RkcmVtNzExIHJlbWFpbmRlciAtMCAgICAtSW5mICAgLT4gLTAKK2RkcmVtNzEyIHJlbWFpbmRlciAgMCAgICAtSW5mICAgLT4gIDAKK2RkcmVtNzEzIHJlbWFpbmRlciAgMSAgICAtSW5mICAgLT4gIDEKK2RkcmVtNzE0IHJlbWFpbmRlciAgMTAwMCAtSW5mICAgLT4gIDEwMDAKK2RkcmVtNzE1IHJlbWFpbmRlciAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZHJlbTcyMSByZW1haW5kZXIgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2RkcmVtNzIyIHJlbWFpbmRlciAgTmFOIC0xMDAwICAgLT4gIE5hTgorZGRyZW03MjMgcmVtYWluZGVyICBOYU4gLTEgICAgICAtPiAgTmFOCitkZHJlbTcyNCByZW1haW5kZXIgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2RkcmVtNzI1IHJlbWFpbmRlciAtTmFOICAwICAgICAgLT4gLU5hTgorZGRyZW03MjYgcmVtYWluZGVyICBOYU4gIDEgICAgICAtPiAgTmFOCitkZHJlbTcyNyByZW1haW5kZXIgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2RkcmVtNzI4IHJlbWFpbmRlciAgTmFOICBJbmYgICAgLT4gIE5hTgorZGRyZW03MjkgcmVtYWluZGVyICBOYU4gLU5hTiAgICAtPiAgTmFOCitkZHJlbTczMCByZW1haW5kZXIgLUluZiAgTmFOICAgIC0+ICBOYU4KK2RkcmVtNzMxIHJlbWFpbmRlciAtMTAwMCBOYU4gICAgLT4gIE5hTgorZGRyZW03MzIgcmVtYWluZGVyIC0xICAgIE5hTiAgICAtPiAgTmFOCitkZHJlbTczMyByZW1haW5kZXIgLTAgICAtTmFOICAgIC0+IC1OYU4KK2RkcmVtNzM0IHJlbWFpbmRlciAgMCAgICBOYU4gICAgLT4gIE5hTgorZGRyZW03MzUgcmVtYWluZGVyICAxICAgLU5hTiAgICAtPiAtTmFOCitkZHJlbTczNiByZW1haW5kZXIgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2RkcmVtNzM3IHJlbWFpbmRlciAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkZHJlbTc0MSByZW1haW5kZXIgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc0MiByZW1haW5kZXIgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc0MyByZW1haW5kZXIgLXNOYU4gLTEgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc0NCByZW1haW5kZXIgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc0NSByZW1haW5kZXIgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc0NiByZW1haW5kZXIgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc0NyByZW1haW5kZXIgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc0OSByZW1haW5kZXIgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc1MCByZW1haW5kZXIgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc1MSByZW1haW5kZXIgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc1MiByZW1haW5kZXIgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc1MyByZW1haW5kZXIgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc1NCByZW1haW5kZXIgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc1NSByZW1haW5kZXIgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc1NiByZW1haW5kZXIgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc1NyByZW1haW5kZXIgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc1OCByZW1haW5kZXIgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc1OSByZW1haW5kZXIgIEluZiAtc05hTiAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2luZyBOYU5zCitkZHJlbTc2MCByZW1haW5kZXIgIE5hTjEgICBOYU43ICAgLT4gIE5hTjEKK2RkcmVtNzYxIHJlbWFpbmRlciBzTmFOMiAgIE5hTjggICAtPiAgTmFOMiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NjIgcmVtYWluZGVyICBOYU4zICBzTmFOOSAgIC0+ICBOYU45IEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc2MyByZW1haW5kZXIgc05hTjQgIHNOYU4xMCAgLT4gIE5hTjQgSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNzY0IHJlbWFpbmRlciAgICAxNSAgIE5hTjExICAtPiAgTmFOMTEKK2RkcmVtNzY1IHJlbWFpbmRlciAgTmFONiAgIE5hTjEyICAtPiAgTmFONgorZGRyZW03NjYgcmVtYWluZGVyICBJbmYgICAgTmFOMTMgIC0+ICBOYU4xMworZGRyZW03NjcgcmVtYWluZGVyICBOYU4xNCAgLUluZiAgIC0+ICBOYU4xNAorZGRyZW03NjggcmVtYWluZGVyICAgIDAgICAgTmFOMTUgIC0+ICBOYU4xNQorZGRyZW03NjkgcmVtYWluZGVyICBOYU4xNiAgIC0wICAgIC0+ICBOYU4xNgorCistLSBlZGdlIGNhc2VzIG9mIGltcG9zc2libGUKK2RkcmVtNzcwICByZW1haW5kZXIgIDEyMzQ1Njc4OTAxMjM0NTYgIDEwICAgIC0+ICA2CitkZHJlbTc3MSAgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICAgMSAgICAtPiAgMAorZGRyZW03NzIgIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDAuMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZHJlbTc3MyAgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICAgMC4wMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworLS0gbG9uZyBvcGVyYW5kIGNoZWNrcworZGRyZW04MDEgcmVtYWluZGVyIDEyMzQ1Njc4MDAwIDEwMCAtPiAwCitkZHJlbTgwMiByZW1haW5kZXIgMSAxMjM0NTY3ODAwMCAgIC0+IDEKK2RkcmVtODAzIHJlbWFpbmRlciAxMjM0NTY3ODAwICAxMCAgLT4gMAorZGRyZW04MDQgcmVtYWluZGVyIDEgMTIzNDU2NzgwMCAgICAtPiAxCitkZHJlbTgwNSByZW1haW5kZXIgMTIzNDU2Nzg5MCAgMTAgIC0+IDAKK2RkcmVtODA2IHJlbWFpbmRlciAxIDEyMzQ1Njc4OTAgICAgLT4gMQorZGRyZW04MDcgcmVtYWluZGVyIDEyMzQ1Njc4OTEgIDEwICAtPiAxCitkZHJlbTgwOCByZW1haW5kZXIgMSAxMjM0NTY3ODkxICAgIC0+IDEKK2RkcmVtODA5IHJlbWFpbmRlciAxMjM0NTY3ODkwMSAxMDAgLT4gMQorZGRyZW04MTAgcmVtYWluZGVyIDEgMTIzNDU2Nzg5MDEgICAtPiAxCitkZHJlbTgxMSByZW1haW5kZXIgMTIzNDU2Nzg5NiAgMTAgIC0+IDYKK2RkcmVtODEyIHJlbWFpbmRlciAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCitkZHJlbTgyMSByZW1haW5kZXIgMTIzNDU2NzgwMDAgMTAwIC0+IDAKK2RkcmVtODIyIHJlbWFpbmRlciAxIDEyMzQ1Njc4MDAwICAgLT4gMQorZGRyZW04MjMgcmVtYWluZGVyIDEyMzQ1Njc4MDAgIDEwICAtPiAwCitkZHJlbTgyNCByZW1haW5kZXIgMSAxMjM0NTY3ODAwICAgIC0+IDEKK2RkcmVtODI1IHJlbWFpbmRlciAxMjM0NTY3ODkwICAxMCAgLT4gMAorZGRyZW04MjYgcmVtYWluZGVyIDEgMTIzNDU2Nzg5MCAgICAtPiAxCitkZHJlbTgyNyByZW1haW5kZXIgMTIzNDU2Nzg5MSAgMTAgIC0+IDEKK2RkcmVtODI4IHJlbWFpbmRlciAxIDEyMzQ1Njc4OTEgICAgLT4gMQorZGRyZW04MjkgcmVtYWluZGVyIDEyMzQ1Njc4OTAxIDEwMCAtPiAxCitkZHJlbTgzMCByZW1haW5kZXIgMSAxMjM0NTY3ODkwMSAgIC0+IDEKK2RkcmVtODMxIHJlbWFpbmRlciAxMjM0NTY3ODk2ICAxMCAgLT4gNgorZGRyZW04MzIgcmVtYWluZGVyIDEgMTIzNDU2Nzg5NiAgICAtPiAxCisKKy0tIGZyb20gZGl2aWRlaW50CitkZHJlbTg0MCByZW1haW5kZXIgIDEwMDAwMDAwMC4wICAgMSAgLT4gIDAuMAorZGRyZW04NDEgcmVtYWluZGVyICAxMDAwMDAwMDAuNCAgIDEgIC0+ICAwLjQKK2RkcmVtODQyIHJlbWFpbmRlciAgMTAwMDAwMDAwLjUgICAxICAtPiAgMC41CitkZHJlbTg0MyByZW1haW5kZXIgIDEwMDAwMDAwMC45ICAgMSAgLT4gIDAuOQorZGRyZW04NDQgcmVtYWluZGVyICAxMDAwMDAwMDAuOTk5IDEgIC0+ICAwLjk5OQorZGRyZW04NTAgcmVtYWluZGVyICAxMDAwMDAwMDMgICAgIDUgIC0+ICAzCitkZHJlbTg1MSByZW1haW5kZXIgIDEwMDAwMDAzICAgICAgNSAgLT4gIDMKK2RkcmVtODUyIHJlbWFpbmRlciAgMTAwMDAwMyAgICAgICA1ICAtPiAgMworZGRyZW04NTMgcmVtYWluZGVyICAxMDAwMDMgICAgICAgIDUgIC0+ICAzCitkZHJlbTg1NCByZW1haW5kZXIgIDEwMDAzICAgICAgICAgNSAgLT4gIDMKK2RkcmVtODU1IHJlbWFpbmRlciAgMTAwMyAgICAgICAgICA1ICAtPiAgMworZGRyZW04NTYgcmVtYWluZGVyICAxMDMgICAgICAgICAgIDUgIC0+ICAzCitkZHJlbTg1NyByZW1haW5kZXIgIDEzICAgICAgICAgICAgNSAgLT4gIDMKK2RkcmVtODU4IHJlbWFpbmRlciAgMSAgICAgICAgICAgICA1ICAtPiAgMQorCistLSBWbGFkaW1pcidzIGNhc2VzICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorZGRyZW04NjAgcmVtYWluZGVyIDEyMy4wZTEgMTAwMDAwMDAwMDAwMDAwMCAgLT4gMTIzMAorZGRyZW04NjEgcmVtYWluZGVyIDEyMzAgICAgMTAwMDAwMDAwMDAwMDAwMCAgLT4gMTIzMAorZGRyZW04NjIgcmVtYWluZGVyIDEyLjNlMiAgMTAwMDAwMDAwMDAwMDAwMCAgLT4gMTIzMAorZGRyZW04NjMgcmVtYWluZGVyIDEuMjNlMyAgMTAwMDAwMDAwMDAwMDAwMCAgLT4gMTIzMAorZGRyZW04NjQgcmVtYWluZGVyIDEyM2UxICAgMTAwMDAwMDAwMDAwMDAwMCAgLT4gMTIzMAorZGRyZW04NzAgcmVtYWluZGVyIDEyM2UxICAgIDEwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04NzEgcmVtYWluZGVyIDEyM2UxICAgICAxMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04NzIgcmVtYWluZGVyIDEyM2UxICAgICAgMTAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04NzMgcmVtYWluZGVyIDEyM2UxICAgICAgIDEwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04NzQgcmVtYWluZGVyIDEyM2UxICAgICAgICAxMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04NzUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgMTAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04NzYgcmVtYWluZGVyIDEyM2UxICAgICAgICAgIDEwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04NzcgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAxMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04NzggcmVtYWluZGVyIDEyMzAgICAgICAgICAgICAxMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04NzkgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgMTAwMDAwMDAgLT4gMTIzMAorZGRyZW04ODAgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgIDEwMDAwMDAgLT4gMTIzMAorZGRyZW04ODEgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAxMDAwMDAgLT4gMTIzMAorZGRyZW04ODIgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgMTAwMDAgLT4gMTIzMAorZGRyZW04ODMgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgIDEwMDAgLT4gIDIzMAorZGRyZW04ODQgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAxMDAgLT4gICAzMAorZGRyZW04ODUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgMTAgLT4gICAgMAorZGRyZW04ODYgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgIDEgLT4gICAgMAorCitkZHJlbTg5MCByZW1haW5kZXIgMTIzZTEgICAgMjAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTg5MSByZW1haW5kZXIgMTIzZTEgICAgIDIwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTg5MiByZW1haW5kZXIgMTIzZTEgICAgICAyMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTg5MyByZW1haW5kZXIgMTIzZTEgICAgICAgMjAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTg5NCByZW1haW5kZXIgMTIzZTEgICAgICAgIDIwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTg5NSByZW1haW5kZXIgMTIzZTEgICAgICAgICAyMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTg5NiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgMjAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTg5NyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgIDIwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTg5OSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAyMDAwMDAwMCAtPiAxMjMwCitkZHJlbTkwMCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgMjAwMDAwMCAtPiAxMjMwCitkZHJlbTkwMSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgIDIwMDAwMCAtPiAxMjMwCitkZHJlbTkwMiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAyMDAwMCAtPiAxMjMwCitkZHJlbTkwMyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgMjAwMCAtPiAxMjMwCitkZHJlbTkwNCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgIDIwMCAtPiAgIDMwCitkZHJlbTkwNSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAyMCAtPiAgIDEwCitkZHJlbTkwNiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAgMiAtPiAgICAwCisKK2RkcmVtOTEwIHJlbWFpbmRlciAxMjNlMSAgICA1MDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTExIHJlbWFpbmRlciAxMjNlMSAgICAgNTAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTEyIHJlbWFpbmRlciAxMjNlMSAgICAgIDUwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTEzIHJlbWFpbmRlciAxMjNlMSAgICAgICA1MDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTE0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgNTAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTE1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgIDUwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTE2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICA1MDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTE3IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgNTAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTE5IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgIDUwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTIwIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICA1MDAwMDAwIC0+IDEyMzAKK2RkcmVtOTIxIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgNTAwMDAwIC0+IDEyMzAKK2RkcmVtOTIyIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgIDUwMDAwIC0+IDEyMzAKK2RkcmVtOTIzIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICA1MDAwIC0+IDEyMzAKK2RkcmVtOTI0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgNTAwIC0+ICAyMzAKK2RkcmVtOTI1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgIDUwIC0+ICAgMzAKK2RkcmVtOTI2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgICA1IC0+ICAgIDAKKworZGRyZW05MzAgcmVtYWluZGVyIDEyM2UxICAgIDkwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW05MzEgcmVtYWluZGVyIDEyM2UxICAgICA5MDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW05MzIgcmVtYWluZGVyIDEyM2UxICAgICAgOTAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW05MzMgcmVtYWluZGVyIDEyM2UxICAgICAgIDkwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW05MzQgcmVtYWluZGVyIDEyM2UxICAgICAgICA5MDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW05MzUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgOTAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW05MzYgcmVtYWluZGVyIDEyM2UxICAgICAgICAgIDkwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW05MzcgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICA5MDAwMDAwMDAgLT4gMTIzMAorZGRyZW05MzkgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgOTAwMDAwMDAgLT4gMTIzMAorZGRyZW05NDAgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgIDkwMDAwMDAgLT4gMTIzMAorZGRyZW05NDEgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICA5MDAwMDAgLT4gMTIzMAorZGRyZW05NDIgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgOTAwMDAgLT4gMTIzMAorZGRyZW05NDMgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgIDkwMDAgLT4gMTIzMAorZGRyZW05NDQgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICA5MDAgLT4gIDMzMAorZGRyZW05NDUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgOTAgLT4gICA2MAorZGRyZW05NDYgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgIDkgLT4gICAgNgorCitkZHJlbTk1MCByZW1haW5kZXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTYxIHJlbWFpbmRlciAxMjNlMSAgIDI5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZGRyZW05NjIgcmVtYWluZGVyIDEyM2UxICAgMzk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJlbTk2MyByZW1haW5kZXIgMTIzZTEgICA0OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2RkcmVtOTY0IHJlbWFpbmRlciAxMjNlMSAgIDU5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZGRyZW05NjUgcmVtYWluZGVyIDEyM2UxICAgNjk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJlbTk2NiByZW1haW5kZXIgMTIzZTEgICA3OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2RkcmVtOTY3IHJlbWFpbmRlciAxMjNlMSAgIDg5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZGRyZW05NjggcmVtYWluZGVyIDEyM2UxICAgOTk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJlbTk2OSByZW1haW5kZXIgMTIzZTEgICA5ODc2NTQzMjEwOTg3NjU0IC0+IDEyMzAKKworZGRyZW05ODAgcmVtYWluZGVyIDEyM2UxIDEwMDBFMjk5IC0+IDEuMjNFKzMgIC0tIDEyM0UrMSBpbnRlcm5hbGx5CisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgW2Zyb20gZGl2aWRlXQorZGRyZW0xMDUxIHJlbWFpbmRlciAgMWUrMjc3ICAxZS0zMTEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZHJlbTEwNTIgcmVtYWluZGVyICAxZSsyNzcgLTFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RkcmVtMTA1MyByZW1haW5kZXIgLTFlKzI3NyAgMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRyZW0xMDU0IHJlbWFpbmRlciAtMWUrMjc3IC0xZS0zMTEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZHJlbTEwNTUgcmVtYWluZGVyICAxZS0yNzcgIDFlKzMxMSAtPiAgMUUtMjc3CitkZHJlbTEwNTYgcmVtYWluZGVyICAxZS0yNzcgLTFlKzMxMSAtPiAgMUUtMjc3CitkZHJlbTEwNTcgcmVtYWluZGVyIC0xZS0yNzcgIDFlKzMxMSAtPiAtMUUtMjc3CitkZHJlbTEwNTggcmVtYWluZGVyIC0xZS0yNzcgLTFlKzMxMSAtPiAtMUUtMjc3CisKKy0tIGRlc3RydWN0aXZlIHN1YnRyYWN0CitkZHJlbTExMDEgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICAxLjAwMDAwMDAwMDAwMDAwMSAgLT4gIDAuNzY1NDMyMTA5ODc2NTQ2CitkZHJlbTExMDIgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICAgMS4wMDAwMDAwMDAwMDAwMSAgLT4gICAwLjY1NDMyMTA5ODc2NTU3CitkZHJlbTExMDMgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICAgIDEuMDAwMDAwMDAwMDAwMSAgLT4gICAgMC41NDMyMTA5ODc2NjY4CitkZHJlbTExMDQgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU1ICA0LjAwMDAwMDAwMDAwMDAwMSAgLT4gIDIuNjkxMzU4MDI3NDY5MTM3CitkZHJlbTExMDUgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICA0LjAwMDAwMDAwMDAwMDAwMSAgLT4gIDMuNjkxMzU4MDI3NDY5MTM3CitkZHJlbTExMDYgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICAgIDQuOTk5OTk5OTk5OTk5OSAgLT4gICAgMC42OTEzNTc4MDI0Njk2CitkZHJlbTExMDcgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICAgNC45OTk5OTk5OTk5OTk5OSAgLT4gICAzLjQ2OTEzNTc4MDI0NjkxCitkZHJlbTExMDggcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICA0Ljk5OTk5OTk5OTk5OTk5OSAgLT4gIDEuMjQ2OTEzNTc4MDI0NjkxCitkZHJlbTExMDkgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICA1LjAwMDAwMDAwMDAwMDAwMSAgLT4gIDAuNzUzMDg2NDIxOTc1MzA5CitkZHJlbTExMTAgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICAgNS4wMDAwMDAwMDAwMDAwMSAgLT4gICAzLjUzMDg2NDIxOTc1MzEwCitkZHJlbTExMTEgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICAgIDUuMDAwMDAwMDAwMDAwMSAgLT4gICAgMS4zMDg2NDIxOTc1MzE0CisKKy0tIE51bGwgdGVzdHMKK2RkcmVtMTAwMCByZW1haW5kZXIgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTEwMDEgcmVtYWluZGVyICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUmVtYWluZGVyTmVhci5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFJlbWFpbmRlck5lYXIuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGE5YWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFJlbWFpbmRlck5lYXIuZGVjVGVzdApAQCAtMCwwICsxLDYyOSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZFJlbWFpbmRlck5lYXIuZGVjVGVzdCAtLSBkZWNEb3VibGUgcmVtYWluZGVyLW5lYXIgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzIChhcyBiYXNlLCBhYm92ZSkKK2Rkcm1uMDAxIHJlbWFpbmRlcm5lYXIgIDEgICAgIDEgICAgLT4gIDAKK2Rkcm1uMDAyIHJlbWFpbmRlcm5lYXIgIDIgICAgIDEgICAgLT4gIDAKK2Rkcm1uMDAzIHJlbWFpbmRlcm5lYXIgIDEgICAgIDIgICAgLT4gIDEKK2Rkcm1uMDA0IHJlbWFpbmRlcm5lYXIgIDIgICAgIDIgICAgLT4gIDAKK2Rkcm1uMDA1IHJlbWFpbmRlcm5lYXIgIDAgICAgIDEgICAgLT4gIDAKK2Rkcm1uMDA2IHJlbWFpbmRlcm5lYXIgIDAgICAgIDIgICAgLT4gIDAKK2Rkcm1uMDA3IHJlbWFpbmRlcm5lYXIgIDEgICAgIDMgICAgLT4gIDEKK2Rkcm1uMDA4IHJlbWFpbmRlcm5lYXIgIDIgICAgIDMgICAgLT4gLTEKK2Rkcm1uMDA5IHJlbWFpbmRlcm5lYXIgIDMgICAgIDMgICAgLT4gIDAKKworZGRybW4wMTAgcmVtYWluZGVybmVhciAgMi40ICAgMSAgICAtPiAgMC40CitkZHJtbjAxMSByZW1haW5kZXJuZWFyICAyLjQgICAtMSAgIC0+ICAwLjQKK2Rkcm1uMDEyIHJlbWFpbmRlcm5lYXIgIC0yLjQgIDEgICAgLT4gIC0wLjQKK2Rkcm1uMDEzIHJlbWFpbmRlcm5lYXIgIC0yLjQgIC0xICAgLT4gIC0wLjQKK2Rkcm1uMDE0IHJlbWFpbmRlcm5lYXIgIDIuNDAgIDEgICAgLT4gIDAuNDAKK2Rkcm1uMDE1IHJlbWFpbmRlcm5lYXIgIDIuNDAwIDEgICAgLT4gIDAuNDAwCitkZHJtbjAxNiByZW1haW5kZXJuZWFyICAyLjQgICAyICAgIC0+ICAwLjQKK2Rkcm1uMDE3IHJlbWFpbmRlcm5lYXIgIDIuNDAwIDIgICAgLT4gIDAuNDAwCitkZHJtbjAxOCByZW1haW5kZXJuZWFyICAyLiAgICAyICAgIC0+ICAwCitkZHJtbjAxOSByZW1haW5kZXJuZWFyICAyMCAgICAyMCAgIC0+ICAwCisKK2Rkcm1uMDIwIHJlbWFpbmRlcm5lYXIgIDE4NyAgIDE4NyAgICAtPiAgMAorZGRybW4wMjEgcmVtYWluZGVybmVhciAgNSAgICAgMiAgICAgIC0+ICAxCitkZHJtbjAyMiByZW1haW5kZXJuZWFyICA1ICAgICAyLjAgICAgLT4gIDEuMAorZGRybW4wMjMgcmVtYWluZGVybmVhciAgNSAgICAgMi4wMDAgIC0+ICAxLjAwMAorZGRybW4wMjQgcmVtYWluZGVybmVhciAgNSAgICAgMC4yMDAgIC0+ICAwLjAwMAorZGRybW4wMjUgcmVtYWluZGVybmVhciAgNSAgICAgMC4yMDAgIC0+ICAwLjAwMAorCitkZHJtbjAzMCByZW1haW5kZXJuZWFyICAxICAgICAyICAgICAgLT4gIDEKK2Rkcm1uMDMxIHJlbWFpbmRlcm5lYXIgIDEgICAgIDQgICAgICAtPiAgMQorZGRybW4wMzIgcmVtYWluZGVybmVhciAgMSAgICAgOCAgICAgIC0+ICAxCisKK2Rkcm1uMDMzIHJlbWFpbmRlcm5lYXIgIDEgICAgIDE2ICAgICAtPiAgMQorZGRybW4wMzQgcmVtYWluZGVybmVhciAgMSAgICAgMzIgICAgIC0+ICAxCitkZHJtbjAzNSByZW1haW5kZXJuZWFyICAxICAgICA2NCAgICAgLT4gIDEKK2Rkcm1uMDQwIHJlbWFpbmRlcm5lYXIgIDEgICAgLTIgICAgICAtPiAgMQorZGRybW4wNDEgcmVtYWluZGVybmVhciAgMSAgICAtNCAgICAgIC0+ICAxCitkZHJtbjA0MiByZW1haW5kZXJuZWFyICAxICAgIC04ICAgICAgLT4gIDEKK2Rkcm1uMDQzIHJlbWFpbmRlcm5lYXIgIDEgICAgLTE2ICAgICAtPiAgMQorZGRybW4wNDQgcmVtYWluZGVybmVhciAgMSAgICAtMzIgICAgIC0+ICAxCitkZHJtbjA0NSByZW1haW5kZXJuZWFyICAxICAgIC02NCAgICAgLT4gIDEKK2Rkcm1uMDUwIHJlbWFpbmRlcm5lYXIgLTEgICAgIDIgICAgICAtPiAgLTEKK2Rkcm1uMDUxIHJlbWFpbmRlcm5lYXIgLTEgICAgIDQgICAgICAtPiAgLTEKK2Rkcm1uMDUyIHJlbWFpbmRlcm5lYXIgLTEgICAgIDggICAgICAtPiAgLTEKK2Rkcm1uMDUzIHJlbWFpbmRlcm5lYXIgLTEgICAgIDE2ICAgICAtPiAgLTEKK2Rkcm1uMDU0IHJlbWFpbmRlcm5lYXIgLTEgICAgIDMyICAgICAtPiAgLTEKK2Rkcm1uMDU1IHJlbWFpbmRlcm5lYXIgLTEgICAgIDY0ICAgICAtPiAgLTEKK2Rkcm1uMDYwIHJlbWFpbmRlcm5lYXIgLTEgICAgLTIgICAgICAtPiAgLTEKK2Rkcm1uMDYxIHJlbWFpbmRlcm5lYXIgLTEgICAgLTQgICAgICAtPiAgLTEKK2Rkcm1uMDYyIHJlbWFpbmRlcm5lYXIgLTEgICAgLTggICAgICAtPiAgLTEKK2Rkcm1uMDYzIHJlbWFpbmRlcm5lYXIgLTEgICAgLTE2ICAgICAtPiAgLTEKK2Rkcm1uMDY0IHJlbWFpbmRlcm5lYXIgLTEgICAgLTMyICAgICAtPiAgLTEKK2Rkcm1uMDY1IHJlbWFpbmRlcm5lYXIgLTEgICAgLTY0ICAgICAtPiAgLTEKKworZGRybW4wNjYgcmVtYWluZGVybmVhciAgICAgICAgICA5LjkgICAxICAtPiAtMC4xCitkZHJtbjA2NyByZW1haW5kZXJuZWFyICAgICAgICAgOTkuNyAgIDEgIC0+IC0wLjMKK2Rkcm1uMDY4IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OSAgICAgMSAgLT4gMAorZGRybW4wNjkgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5LjQgICAxICAtPiAwLjQKK2Rkcm1uMDcwIHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OS41ICAgMSAgLT4gLTAuNQorZGRybW4wNzEgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5LjkgICAxICAtPiAtMC4xCitkZHJtbjA3MiByZW1haW5kZXJuZWFyICA5OTk5OTk5OTkuOTk5IDEgIC0+IC0wLjAwMQorZGRybW4wNzMgcmVtYWluZGVybmVhciAgOTk5OTk5Ljk5OTk5OSAxICAtPiAtMC4wMDAwMDEKK2Rkcm1uMDc0IHJlbWFpbmRlcm5lYXIgIDkgICAgICAgICAgICAgMSAgLT4gMAorZGRybW4wNzUgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5OTk5OTk5OSAxICAtPiAwCitkZHJtbjA3NiByZW1haW5kZXJuZWFyICA5OTk5OTk5OTk5OTk5OTk5IDIgIC0+IC0xCitkZHJtbjA3NyByZW1haW5kZXJuZWFyICA5OTk5OTk5OTk5OTk5OTk5IDMgIC0+IDAKK2Rkcm1uMDc4IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OTk5OTk5OTkgNCAgLT4gLTEKKworZGRybW4wODAgcmVtYWluZGVybmVhciAgMC4gICAgICAgICAgICAxICAtPiAwCitkZHJtbjA4MSByZW1haW5kZXJuZWFyICAuMCAgICAgICAgICAgIDEgIC0+IDAuMAorZGRybW4wODIgcmVtYWluZGVybmVhciAgMC4wMCAgICAgICAgICAxICAtPiAwLjAwCitkZHJtbjA4MyByZW1haW5kZXJuZWFyICAwLjAwRSs5ICAgICAgIDEgIC0+IDAKK2Rkcm1uMDg0IHJlbWFpbmRlcm5lYXIgIDAuMDBFKzMgICAgICAgMSAgLT4gMAorZGRybW4wODUgcmVtYWluZGVybmVhciAgMC4wMEUrMiAgICAgICAxICAtPiAwCitkZHJtbjA4NiByZW1haW5kZXJuZWFyICAwLjAwRSsxICAgICAgIDEgIC0+IDAuMAorZGRybW4wODcgcmVtYWluZGVybmVhciAgMC4wMEUrMCAgICAgICAxICAtPiAwLjAwCitkZHJtbjA4OCByZW1haW5kZXJuZWFyICAwLjAwRS0wICAgICAgIDEgIC0+IDAuMDAKK2Rkcm1uMDg5IHJlbWFpbmRlcm5lYXIgIDAuMDBFLTEgICAgICAgMSAgLT4gMC4wMDAKK2Rkcm1uMDkwIHJlbWFpbmRlcm5lYXIgIDAuMDBFLTIgICAgICAgMSAgLT4gMC4wMDAwCitkZHJtbjA5MSByZW1haW5kZXJuZWFyICAwLjAwRS0zICAgICAgIDEgIC0+IDAuMDAwMDAKK2Rkcm1uMDkyIHJlbWFpbmRlcm5lYXIgIDAuMDBFLTQgICAgICAgMSAgLT4gMC4wMDAwMDAKK2Rkcm1uMDkzIHJlbWFpbmRlcm5lYXIgIDAuMDBFLTUgICAgICAgMSAgLT4gMEUtNworZGRybW4wOTQgcmVtYWluZGVybmVhciAgMC4wMEUtNiAgICAgICAxICAtPiAwRS04CitkZHJtbjA5NSByZW1haW5kZXJuZWFyICAwLjAwMDBFLTUwICAgIDEgIC0+IDBFLTU0CisKKy0tIFZhcmlvdXMgZmxhdm91cnMgb2YgcmVtYWluZGVybmVhciBieSAwCitkZHJtbjEwMSByZW1haW5kZXJuZWFyICAwICAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZHJtbjEwMiByZW1haW5kZXJuZWFyICAwICAgICAgLTAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZHJtbjEwMyByZW1haW5kZXJuZWFyIC0wICAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZHJtbjEwNCByZW1haW5kZXJuZWFyIC0wICAgICAgLTAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZHJtbjEwNSByZW1haW5kZXJuZWFyICAwLjBFNSAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZHJtbjEwNiByZW1haW5kZXJuZWFyICAwLjAwMCAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCistLSBbU29tZSB0aGluayB0aGlzIG5leHQgZ3JvdXAgc2hvdWxkIGJlIERpdmlzaW9uX2J5X3plcm8gZXhjZXB0aW9uLCBidXQKKy0tIElFRUUgODU0IGlzIGV4cGxpY2l0IHRoYXQgaXQgaXMgSW52YWxpZCBvcGVyYXRpb24gLi4gZm9yCistLSByZW1haW5kZXItbmVhciwgYW55d2F5XQorZGRybW4xMDcgcmVtYWluZGVybmVhciAgMC4wMDAxICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjEwOCByZW1haW5kZXJuZWFyICAwLjAxICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMTA5IHJlbWFpbmRlcm5lYXIgIDAuMSAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4xMTAgcmVtYWluZGVybmVhciAgMSAgICAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjExMSByZW1haW5kZXJuZWFyICAxICAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMTEyIHJlbWFpbmRlcm5lYXIgMTAgICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4xMTMgcmVtYWluZGVybmVhciAxRSsxMDAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjExNCByZW1haW5kZXJuZWFyIDFFKzM4MCAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMTE1IHJlbWFpbmRlcm5lYXIgIDAuMDAwMSAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4xMTYgcmVtYWluZGVybmVhciAgMC4wMSAgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjExOSByZW1haW5kZXJuZWFyICAwLjEgICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMTIwIHJlbWFpbmRlcm5lYXIgIDEgICAgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4xMjEgcmVtYWluZGVybmVhciAgMSAgICAgIC0wLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjEyMiByZW1haW5kZXJuZWFyIDEwICAgICAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMTIzIHJlbWFpbmRlcm5lYXIgMUUrMTAwICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4xMjQgcmVtYWluZGVybmVhciAxRSszODQgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhbmQgemVyb3Mgb24gbGVmdAorZGRybW4xMzAgcmVtYWluZGVybmVhciAgMCAgICAgIDEgICAtPiAgMAorZGRybW4xMzEgcmVtYWluZGVybmVhciAgMCAgICAgLTEgICAtPiAgMAorZGRybW4xMzIgcmVtYWluZGVybmVhciAgMC4wICAgIDEgICAtPiAgMC4wCitkZHJtbjEzMyByZW1haW5kZXJuZWFyICAwLjAgICAtMSAgIC0+ICAwLjAKK2Rkcm1uMTM0IHJlbWFpbmRlcm5lYXIgLTAgICAgICAxICAgLT4gLTAKK2Rkcm1uMTM1IHJlbWFpbmRlcm5lYXIgLTAgICAgIC0xICAgLT4gLTAKK2Rkcm1uMTM2IHJlbWFpbmRlcm5lYXIgLTAuMCAgICAxICAgLT4gLTAuMAorZGRybW4xMzcgcmVtYWluZGVybmVhciAtMC4wICAgLTEgICAtPiAtMC4wCisKKy0tIDAuNWVycworZGRybW4xNDMgcmVtYWluZGVybmVhciAgIDAuNSAgMiAgICAgLT4gIDAuNQorZGRybW4xNDQgcmVtYWluZGVybmVhciAgIDAuNSAgMi4xICAgLT4gIDAuNQorZGRybW4xNDUgcmVtYWluZGVybmVhciAgIDAuNSAgMi4wMSAgLT4gIDAuNTAKK2Rkcm1uMTQ2IHJlbWFpbmRlcm5lYXIgICAwLjUgIDIuMDAxIC0+ICAwLjUwMAorZGRybW4xNDcgcmVtYWluZGVybmVhciAgIDAuNTAgMiAgICAgLT4gIDAuNTAKK2Rkcm1uMTQ4IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIuMDEgIC0+ICAwLjUwCitkZHJtbjE0OSByZW1haW5kZXJuZWFyICAgMC41MCAyLjAwMSAtPiAgMC41MDAKKworLS0gc3RlYWRpZXMKK2Rkcm1uMTUwIHJlbWFpbmRlcm5lYXIgIDEgIDEgICAtPiAwCitkZHJtbjE1MSByZW1haW5kZXJuZWFyICAxICAyICAgLT4gMQorZGRybW4xNTIgcmVtYWluZGVybmVhciAgMSAgMyAgIC0+IDEKK2Rkcm1uMTUzIHJlbWFpbmRlcm5lYXIgIDEgIDQgICAtPiAxCitkZHJtbjE1NCByZW1haW5kZXJuZWFyICAxICA1ICAgLT4gMQorZGRybW4xNTUgcmVtYWluZGVybmVhciAgMSAgNiAgIC0+IDEKK2Rkcm1uMTU2IHJlbWFpbmRlcm5lYXIgIDEgIDcgICAtPiAxCitkZHJtbjE1NyByZW1haW5kZXJuZWFyICAxICA4ICAgLT4gMQorZGRybW4xNTggcmVtYWluZGVybmVhciAgMSAgOSAgIC0+IDEKK2Rkcm1uMTU5IHJlbWFpbmRlcm5lYXIgIDEgIDEwICAtPiAxCitkZHJtbjE2MCByZW1haW5kZXJuZWFyICAxICAxICAgLT4gMAorZGRybW4xNjEgcmVtYWluZGVybmVhciAgMiAgMSAgIC0+IDAKK2Rkcm1uMTYyIHJlbWFpbmRlcm5lYXIgIDMgIDEgICAtPiAwCitkZHJtbjE2MyByZW1haW5kZXJuZWFyICA0ICAxICAgLT4gMAorZGRybW4xNjQgcmVtYWluZGVybmVhciAgNSAgMSAgIC0+IDAKK2Rkcm1uMTY1IHJlbWFpbmRlcm5lYXIgIDYgIDEgICAtPiAwCitkZHJtbjE2NiByZW1haW5kZXJuZWFyICA3ICAxICAgLT4gMAorZGRybW4xNjcgcmVtYWluZGVybmVhciAgOCAgMSAgIC0+IDAKK2Rkcm1uMTY4IHJlbWFpbmRlcm5lYXIgIDkgIDEgICAtPiAwCitkZHJtbjE2OSByZW1haW5kZXJuZWFyICAxMCAxICAgLT4gMAorCistLSBzb21lIGRpZmZlcmVuY2VzIGZyb20gcmVtYWluZGVyCitkZHJtbjE3MSByZW1haW5kZXJuZWFyICAgMC40ICAxLjAyMCAtPiAgMC40MDAKK2Rkcm1uMTcyIHJlbWFpbmRlcm5lYXIgICAwLjUwIDEuMDIwIC0+ICAwLjUwMAorZGRybW4xNzMgcmVtYWluZGVybmVhciAgIDAuNTEgMS4wMjAgLT4gIDAuNTEwCitkZHJtbjE3NCByZW1haW5kZXJuZWFyICAgMC41MiAxLjAyMCAtPiAtMC41MDAKK2Rkcm1uMTc1IHJlbWFpbmRlcm5lYXIgICAwLjYgIDEuMDIwIC0+IC0wLjQyMAorCistLSBNb3JlIGZsYXZvdXJzIG9mIHJlbWFpbmRlcm5lYXIgYnkgMAorZGRybW4yMDEgcmVtYWluZGVybmVhciAgMCAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZHJtbjIwMiByZW1haW5kZXJuZWFyICAwLjBFNSAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2Rkcm1uMjAzIHJlbWFpbmRlcm5lYXIgIDAuMDAwICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRybW4yMDQgcmVtYWluZGVybmVhciAgMC4wMDAxIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMjA1IHJlbWFpbmRlcm5lYXIgIDAuMDEgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjIwNiByZW1haW5kZXJuZWFyICAwLjEgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4yMDcgcmVtYWluZGVybmVhciAgMSAgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMjA4IHJlbWFpbmRlcm5lYXIgIDEgICAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjIwOSByZW1haW5kZXJuZWFyIDEwICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4yMTAgcmVtYWluZGVybmVhciAxRSsxMDAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMjExIHJlbWFpbmRlcm5lYXIgMUUrMzgwICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHRlc3RzIGZyb20gdGhlIGV4dGVuZGVkIHNwZWNpZmljYXRpb24KK2Rkcm1uMjIxIHJlbWFpbmRlcm5lYXIgMi4xICAgICAzICAgLT4gLTAuOQorZGRybW4yMjIgcmVtYWluZGVybmVhciAgMTAgICAgIDYgICAtPiAtMgorZGRybW4yMjMgcmVtYWluZGVybmVhciAgMTAgICAgIDMgICAtPiAgMQorZGRybW4yMjQgcmVtYWluZGVybmVhciAtMTAgICAgIDMgICAtPiAtMQorZGRybW4yMjUgcmVtYWluZGVybmVhciAgMTAuMiAgIDEgICAtPiAwLjIKK2Rkcm1uMjI2IHJlbWFpbmRlcm5lYXIgIDEwICAgICAwLjMgLT4gMC4xCitkZHJtbjIyNyByZW1haW5kZXJuZWFyICAgMy42ICAgMS4zIC0+IC0wLjMKKworLS0gc29tZSBkaWZmZXJlbmNlcyBmcm9tIHJlbWFpbmRlcgorZGRybW4yMzEgcmVtYWluZGVybmVhciAgLTAuNCAgMS4wMjAgLT4gLTAuNDAwCitkZHJtbjIzMiByZW1haW5kZXJuZWFyICAtMC41MCAxLjAyMCAtPiAtMC41MDAKK2Rkcm1uMjMzIHJlbWFpbmRlcm5lYXIgIC0wLjUxIDEuMDIwIC0+IC0wLjUxMAorZGRybW4yMzQgcmVtYWluZGVybmVhciAgLTAuNTIgMS4wMjAgLT4gIDAuNTAwCitkZHJtbjIzNSByZW1haW5kZXJuZWFyICAtMC42ICAxLjAyMCAtPiAgMC40MjAKKworLS0gaGlnaCBYcworZGRybW4yNDAgcmVtYWluZGVybmVhciAgMUUrMiAgMS4wMCAgLT4gIDAuMDAKKworLS0gZGRybW4zeHggYXJlIGZyb20gRGlhZ0JpZ0RlY2ltYWwKK2Rkcm1uMzAxIHJlbWFpbmRlcm5lYXIgICAxICAgIDMgICAgIC0+ICAxCitkZHJtbjMwMiByZW1haW5kZXJuZWFyICAgNSAgICA1ICAgICAtPiAgMAorZGRybW4zMDMgcmVtYWluZGVybmVhciAgIDEzICAgMTAgICAgLT4gIDMKK2Rkcm1uMzA0IHJlbWFpbmRlcm5lYXIgICAxMyAgIDUwICAgIC0+ICAxMworZGRybW4zMDUgcmVtYWluZGVybmVhciAgIDEzICAgMTAwICAgLT4gIDEzCitkZHJtbjMwNiByZW1haW5kZXJuZWFyICAgMTMgICAxMDAwICAtPiAgMTMKK2Rkcm1uMzA3IHJlbWFpbmRlcm5lYXIgICAuMTMgICAgMSAgIC0+ICAwLjEzCitkZHJtbjMwOCByZW1haW5kZXJuZWFyICAgMC4xMzMgIDEgICAtPiAgMC4xMzMKK2Rkcm1uMzA5IHJlbWFpbmRlcm5lYXIgICAwLjEwMzMgMSAgIC0+ICAwLjEwMzMKK2Rkcm1uMzEwIHJlbWFpbmRlcm5lYXIgICAxLjAzMyAgMSAgIC0+ICAwLjAzMworZGRybW4zMTEgcmVtYWluZGVybmVhciAgIDEwLjMzICAxICAgLT4gIDAuMzMKK2Rkcm1uMzEyIHJlbWFpbmRlcm5lYXIgICAxMC4zMyAxMCAgIC0+ICAwLjMzCitkZHJtbjMxMyByZW1haW5kZXJuZWFyICAgMTAzLjMgIDEgICAtPiAgMC4zCitkZHJtbjMxNCByZW1haW5kZXJuZWFyICAgMTMzICAgMTAgICAtPiAgMworZGRybW4zMTUgcmVtYWluZGVybmVhciAgIDEwMzMgIDEwICAgLT4gIDMKK2Rkcm1uMzE2IHJlbWFpbmRlcm5lYXIgICAxMDMzICA1MCAgIC0+IC0xNworZGRybW4zMTcgcmVtYWluZGVybmVhciAgIDEwMS4wICAzICAgLT4gLTEuMAorZGRybW4zMTggcmVtYWluZGVybmVhciAgIDEwMi4wICAzICAgLT4gIDAuMAorZGRybW4zMTkgcmVtYWluZGVybmVhciAgIDEwMy4wICAzICAgLT4gIDEuMAorZGRybW4zMjAgcmVtYWluZGVybmVhciAgIDIuNDAgICAxICAgLT4gIDAuNDAKK2Rkcm1uMzIxIHJlbWFpbmRlcm5lYXIgICAyLjQwMCAgMSAgIC0+ICAwLjQwMAorZGRybW4zMjIgcmVtYWluZGVybmVhciAgIDIuNCAgICAxICAgLT4gIDAuNAorZGRybW4zMjMgcmVtYWluZGVybmVhciAgIDIuNCAgICAyICAgLT4gIDAuNAorZGRybW4zMjQgcmVtYWluZGVybmVhciAgIDIuNDAwICAyICAgLT4gIDAuNDAwCitkZHJtbjMyNSByZW1haW5kZXJuZWFyICAgMSAgIDAuMyAgICAtPiAgMC4xCitkZHJtbjMyNiByZW1haW5kZXJuZWFyICAgMSAgIDAuMzAgICAtPiAgMC4xMAorZGRybW4zMjcgcmVtYWluZGVybmVhciAgIDEgICAwLjMwMCAgLT4gIDAuMTAwCitkZHJtbjMyOCByZW1haW5kZXJuZWFyICAgMSAgIDAuMzAwMCAtPiAgMC4xMDAwCitkZHJtbjMyOSByZW1haW5kZXJuZWFyICAgMS4wICAgIDAuMyAtPiAgMC4xCitkZHJtbjMzMCByZW1haW5kZXJuZWFyICAgMS4wMCAgIDAuMyAtPiAgMC4xMAorZGRybW4zMzEgcmVtYWluZGVybmVhciAgIDEuMDAwICAwLjMgLT4gIDAuMTAwCitkZHJtbjMzMiByZW1haW5kZXJuZWFyICAgMS4wMDAwIDAuMyAtPiAgMC4xMDAwCitkZHJtbjMzMyByZW1haW5kZXJuZWFyICAgMC41ICAyICAgICAtPiAgMC41CitkZHJtbjMzNCByZW1haW5kZXJuZWFyICAgMC41ICAyLjEgICAtPiAgMC41CitkZHJtbjMzNSByZW1haW5kZXJuZWFyICAgMC41ICAyLjAxICAtPiAgMC41MAorZGRybW4zMzYgcmVtYWluZGVybmVhciAgIDAuNSAgMi4wMDEgLT4gIDAuNTAwCitkZHJtbjMzNyByZW1haW5kZXJuZWFyICAgMC41MCAyICAgICAtPiAgMC41MAorZGRybW4zMzggcmVtYWluZGVybmVhciAgIDAuNTAgMi4wMSAgLT4gIDAuNTAKK2Rkcm1uMzM5IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIuMDAxIC0+ICAwLjUwMAorCitkZHJtbjM0MCByZW1haW5kZXJuZWFyICAgMC41ICAgMC41MDAwMDAxICAgIC0+ICAtMUUtNworZGRybW4zNDEgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNTAwMDAwMDEgICAgLT4gIC0xRS04CitkZHJtbjM0MiByZW1haW5kZXJuZWFyICAgMC41ICAgMC41MDAwMDAwMDEgICAgLT4gIC0xRS05CitkZHJtbjM0MyByZW1haW5kZXJuZWFyICAgMC41ICAgMC41MDAwMDAwMDAxICAgIC0+ICAtMUUtMTAKK2Rkcm1uMzQ0IHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjUwMDAwMDAwMDAxICAgIC0+ICAtMUUtMTEKK2Rkcm1uMzQ1IHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjQ5OTk5OTkgICAgLT4gIDFFLTcKK2Rkcm1uMzQ2IHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjQ5OTk5OTk5ICAgIC0+ICAxRS04CitkZHJtbjM0NyByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5OTkgICAgLT4gIDFFLTkKK2Rkcm1uMzQ4IHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjQ5OTk5OTk5OTkgICAgLT4gIDFFLTEwCitkZHJtbjM0OSByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5OTk5OSAgICAtPiAgMUUtMTEKK2Rkcm1uMzUwIHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjQ5OTk5OTk5OTk5OSAgICAtPiAgMUUtMTIKKworZGRybW4zNTEgcmVtYWluZGVybmVhciAgIDAuMDMgIDcgIC0+ICAwLjAzCitkZHJtbjM1MiByZW1haW5kZXJuZWFyICAgNSAgIDIgICAgLT4gIDEKK2Rkcm1uMzUzIHJlbWFpbmRlcm5lYXIgICA0LjEgICAyICAgIC0+ICAwLjEKK2Rkcm1uMzU0IHJlbWFpbmRlcm5lYXIgICA0LjAxICAgMiAgICAtPiAgMC4wMQorZGRybW4zNTUgcmVtYWluZGVybmVhciAgIDQuMDAxICAgMiAgICAtPiAgMC4wMDEKK2Rkcm1uMzU2IHJlbWFpbmRlcm5lYXIgICA0LjAwMDEgICAyICAgIC0+ICAwLjAwMDEKK2Rkcm1uMzU3IHJlbWFpbmRlcm5lYXIgICA0LjAwMDAxICAgMiAgICAtPiAgMC4wMDAwMQorZGRybW4zNTggcmVtYWluZGVybmVhciAgIDQuMDAwMDAxICAgMiAgICAtPiAgMC4wMDAwMDEKK2Rkcm1uMzU5IHJlbWFpbmRlcm5lYXIgICA0LjAwMDAwMDEgICAyICAgIC0+ICAxRS03CisKK2Rkcm1uMzYwIHJlbWFpbmRlcm5lYXIgICAxLjIgICAwLjczNDUgLT4gLTAuMjY5MAorZGRybW4zNjEgcmVtYWluZGVybmVhciAgIDAuOCAgIDEyICAgICAtPiAgMC44CitkZHJtbjM2MiByZW1haW5kZXJuZWFyICAgMC44ICAgMC4yICAgIC0+ICAwLjAKK2Rkcm1uMzYzIHJlbWFpbmRlcm5lYXIgICAwLjggICAwLjMgICAgLT4gLTAuMQorZGRybW4zNjQgcmVtYWluZGVybmVhciAgIDAuODAwICAgMTIgICAtPiAgMC44MDAKK2Rkcm1uMzY1IHJlbWFpbmRlcm5lYXIgICAwLjgwMCAgIDEuNyAgLT4gIDAuODAwCitkZHJtbjM2NiByZW1haW5kZXJuZWFyICAgMi40MDAgICAyICAgIC0+ICAwLjQwMAorCistLSByb3VuZCB0byBldmVuCitkZHJtbjM3MSByZW1haW5kZXJuZWFyICAgMTIxICAgICAyICAgIC0+ICAxCitkZHJtbjM3MiByZW1haW5kZXJuZWFyICAgMTIyICAgICAyICAgIC0+ICAwCitkZHJtbjM3MyByZW1haW5kZXJuZWFyICAgMTIzICAgICAyICAgIC0+IC0xCitkZHJtbjM3NCByZW1haW5kZXJuZWFyICAgMTI0ICAgICAyICAgIC0+ICAwCitkZHJtbjM3NSByZW1haW5kZXJuZWFyICAgMTI1ICAgICAyICAgIC0+ICAxCitkZHJtbjM3NiByZW1haW5kZXJuZWFyICAgMTI2ICAgICAyICAgIC0+ICAwCitkZHJtbjM3NyByZW1haW5kZXJuZWFyICAgMTI3ICAgICAyICAgIC0+IC0xCisKK2Rkcm1uMzgxIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEgICAgICAgICAtPiAgMAorZGRybW4zODIgcmVtYWluZGVybmVhciAxMjM0NSAgMS4wMDAxICAgIC0+IC0wLjIzNDQKK2Rkcm1uMzgzIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEuMDAxICAgICAtPiAtMC4zMzMKK2Rkcm1uMzg0IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEuMDEgICAgICAtPiAtMC4yMworZGRybW4zODUgcmVtYWluZGVybmVhciAxMjM0NSAgMS4xICAgICAgIC0+IC0wLjMKK2Rkcm1uMzg2IHJlbWFpbmRlcm5lYXIgMTIzNTUgIDQgICAgICAgICAtPiAtMQorZGRybW4zODcgcmVtYWluZGVybmVhciAxMjM0NSAgNCAgICAgICAgIC0+ICAxCitkZHJtbjM4OCByZW1haW5kZXJuZWFyIDEyMzU1ICA0LjAwMDEgICAgLT4gLTEuMzA4OQorZGRybW4zODkgcmVtYWluZGVybmVhciAxMjM0NSAgNC4wMDAxICAgIC0+ICAwLjY5MTQKK2Rkcm1uMzkwIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuOSAgICAgICAtPiAgMS45CitkZHJtbjM5MSByZW1haW5kZXJuZWFyIDEyMzQ1ICA0Ljk5ICAgICAgLT4gLTAuMjYKK2Rkcm1uMzkyIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuOTk5ICAgICAtPiAgMi40NjkKK2Rkcm1uMzkzIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuOTk5OSAgICAtPiAgMC4yNDY5CitkZHJtbjM5NCByZW1haW5kZXJuZWFyIDEyMzQ1ICA1ICAgICAgICAgLT4gIDAKK2Rkcm1uMzk1IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDUuMDAwMSAgICAtPiAtMC4yNDY5CitkZHJtbjM5NiByZW1haW5kZXJuZWFyIDEyMzQ1ICA1LjAwMSAgICAgLT4gLTIuNDY5CitkZHJtbjM5NyByZW1haW5kZXJuZWFyIDEyMzQ1ICA1LjAxICAgICAgLT4gIDAuMzYKK2Rkcm1uMzk4IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDUuMSAgICAgICAtPiAtMi4xCisKKy0tIHRoZSBuYXN0eSBkaXZpc2lvbi1ieS0xIGNhc2VzCitkZHJtbjQwMSByZW1haW5kZXJuZWFyICAgMC40ICAgICAgICAgMSAgIC0+ICAwLjQKK2Rkcm1uNDAyIHJlbWFpbmRlcm5lYXIgICAwLjQ1ICAgICAgICAxICAgLT4gIDAuNDUKK2Rkcm1uNDAzIHJlbWFpbmRlcm5lYXIgICAwLjQ1NSAgICAgICAxICAgLT4gIDAuNDU1CitkZHJtbjQwNCByZW1haW5kZXJuZWFyICAgMC40NTU1ICAgICAgMSAgIC0+ICAwLjQ1NTUKK2Rkcm1uNDA1IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1ICAgICAxICAgLT4gIDAuNDU1NTUKK2Rkcm1uNDA2IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NSAgICAxICAgLT4gIDAuNDU1NTU1CitkZHJtbjQwNyByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1ICAgMSAgIC0+ICAwLjQ1NTU1NTUKK2Rkcm1uNDA4IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTU1ICAxICAgLT4gIDAuNDU1NTU1NTUKK2Rkcm1uNDA5IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTU1NSAxICAgLT4gIDAuNDU1NTU1NTU1CistLSB3aXRoIHNwaWxsLi4uIFs0MTIgZXhlcmNpc2VzIHN0aWNrdGFiIGxvb3BdCitkZHJtbjQxMSByZW1haW5kZXJuZWFyICAgMC41ICAgICAgICAgMSAgIC0+ICAwLjUKK2Rkcm1uNDEyIHJlbWFpbmRlcm5lYXIgICAwLjU1ICAgICAgICAxICAgLT4gLTAuNDUKK2Rkcm1uNDEzIHJlbWFpbmRlcm5lYXIgICAwLjU1NSAgICAgICAxICAgLT4gLTAuNDQ1CitkZHJtbjQxNCByZW1haW5kZXJuZWFyICAgMC41NTU1ICAgICAgMSAgIC0+IC0wLjQ0NDUKK2Rkcm1uNDE1IHJlbWFpbmRlcm5lYXIgICAwLjU1NTU1ICAgICAxICAgLT4gLTAuNDQ0NDUKK2Rkcm1uNDE2IHJlbWFpbmRlcm5lYXIgICAwLjU1NTU1NSAgICAxICAgLT4gLTAuNDQ0NDQ1CitkZHJtbjQxNyByZW1haW5kZXJuZWFyICAgMC41NTU1NTU1ICAgMSAgIC0+IC0wLjQ0NDQ0NDUKK2Rkcm1uNDE4IHJlbWFpbmRlcm5lYXIgICAwLjU1NTU1NTU1ICAxICAgLT4gLTAuNDQ0NDQ0NDUKK2Rkcm1uNDE5IHJlbWFpbmRlcm5lYXIgICAwLjU1NTU1NTU1NSAxICAgLT4gLTAuNDQ0NDQ0NDQ1CisKKy0tIGZvbGRkb3ducworZGRybW40MjEgcmVtYWluZGVybmVhciAgIDFFKzM4NCAgICAgICAxICAtPiAgIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZHJtbjQyMiByZW1haW5kZXJuZWFyICAgMUUrMzg0ICAxRSszODMgIC0+ICAgMEUrMzY5IENsYW1wZWQKK2Rkcm1uNDIzIHJlbWFpbmRlcm5lYXIgICAxRSszODQgIDJFKzM4MyAgLT4gICAwRSszNjkgQ2xhbXBlZAorZGRybW40MjQgcmVtYWluZGVybmVhciAgIDFFKzM4NCAgM0UrMzgzICAtPiAgIDEuMDAwMDAwMDAwMDAwMDBFKzM4MyBDbGFtcGVkCitkZHJtbjQyNSByZW1haW5kZXJuZWFyICAgMUUrMzg0ICA0RSszODMgIC0+ICAgMi4wMDAwMDAwMDAwMDAwMEUrMzgzIENsYW1wZWQKK2Rkcm1uNDI2IHJlbWFpbmRlcm5lYXIgICAxRSszODQgIDVFKzM4MyAgLT4gICAwRSszNjkgQ2xhbXBlZAorZGRybW40MjcgcmVtYWluZGVybmVhciAgIDFFKzM4NCAgNkUrMzgzICAtPiAgLTIuMDAwMDAwMDAwMDAwMDBFKzM4MyBDbGFtcGVkCitkZHJtbjQyOCByZW1haW5kZXJuZWFyICAgMUUrMzg0ICA3RSszODMgIC0+ICAgMy4wMDAwMDAwMDAwMDAwMEUrMzgzIENsYW1wZWQKK2Rkcm1uNDI5IHJlbWFpbmRlcm5lYXIgICAxRSszODQgIDhFKzM4MyAgLT4gICAyLjAwMDAwMDAwMDAwMDAwRSszODMgQ2xhbXBlZAorZGRybW40MzAgcmVtYWluZGVybmVhciAgIDFFKzM4NCAgOUUrMzgzICAtPiAgIDEuMDAwMDAwMDAwMDAwMDBFKzM4MyBDbGFtcGVkCistLSB0aW5pZXMKK2Rkcm1uNDMxIHJlbWFpbmRlcm5lYXIgICAxRS0zOTcgIDFFLTM5OCAgLT4gICAwRS0zOTgKK2Rkcm1uNDMyIHJlbWFpbmRlcm5lYXIgICAxRS0zOTcgIDJFLTM5OCAgLT4gICAwRS0zOTgKK2Rkcm1uNDMzIHJlbWFpbmRlcm5lYXIgICAxRS0zOTcgIDNFLTM5OCAgLT4gICAxRS0zOTggU3Vibm9ybWFsCitkZHJtbjQzNCByZW1haW5kZXJuZWFyICAgMUUtMzk3ICA0RS0zOTggIC0+ICAgMkUtMzk4IFN1Ym5vcm1hbAorZGRybW40MzUgcmVtYWluZGVybmVhciAgIDFFLTM5NyAgNUUtMzk4ICAtPiAgIDBFLTM5OAorZGRybW40MzYgcmVtYWluZGVybmVhciAgIDFFLTM5NyAgNkUtMzk4ICAtPiAgLTJFLTM5OCBTdWJub3JtYWwKK2Rkcm1uNDM3IHJlbWFpbmRlcm5lYXIgICAxRS0zOTcgIDdFLTM5OCAgLT4gICAzRS0zOTggU3Vibm9ybWFsCitkZHJtbjQzOCByZW1haW5kZXJuZWFyICAgMUUtMzk3ICA4RS0zOTggIC0+ICAgMkUtMzk4IFN1Ym5vcm1hbAorZGRybW40MzkgcmVtYWluZGVybmVhciAgIDFFLTM5NyAgOUUtMzk4ICAtPiAgIDFFLTM5OCBTdWJub3JtYWwKK2Rkcm1uNDQwIHJlbWFpbmRlcm5lYXIgICAxRS0zOTcgMTBFLTM5OCAgLT4gICAwRS0zOTgKK2Rkcm1uNDQxIHJlbWFpbmRlcm5lYXIgICAxRS0zOTcgMTFFLTM5OCAgLT4gIC0xRS0zOTggU3Vibm9ybWFsCitkZHJtbjQ0MiByZW1haW5kZXJuZWFyIDEwMEUtMzk3IDExRS0zOTggIC0+ICAtMUUtMzk4IFN1Ym5vcm1hbAorZGRybW40NDMgcmVtYWluZGVybmVhciAxMDBFLTM5NyAyMEUtMzk4ICAtPiAgIDBFLTM5OAorZGRybW40NDQgcmVtYWluZGVybmVhciAxMDBFLTM5NyAyMUUtMzk4ICAtPiAgLThFLTM5OCBTdWJub3JtYWwKK2Rkcm1uNDQ1IHJlbWFpbmRlcm5lYXIgMTAwRS0zOTcgMzBFLTM5OCAgLT4gMS4wRS0zOTcgU3Vibm9ybWFsCisKKy0tIHplcm8gc2lnbnMKK2Rkcm1uNjUwIHJlbWFpbmRlcm5lYXIgIDEgIDEgLT4gIDAKK2Rkcm1uNjUxIHJlbWFpbmRlcm5lYXIgLTEgIDEgLT4gLTAKK2Rkcm1uNjUyIHJlbWFpbmRlcm5lYXIgIDEgLTEgLT4gIDAKK2Rkcm1uNjUzIHJlbWFpbmRlcm5lYXIgLTEgLTEgLT4gLTAKK2Rkcm1uNjU0IHJlbWFpbmRlcm5lYXIgIDAgIDEgLT4gIDAKK2Rkcm1uNjU1IHJlbWFpbmRlcm5lYXIgLTAgIDEgLT4gLTAKK2Rkcm1uNjU2IHJlbWFpbmRlcm5lYXIgIDAgLTEgLT4gIDAKK2Rkcm1uNjU3IHJlbWFpbmRlcm5lYXIgLTAgLTEgLT4gLTAKK2Rkcm1uNjU4IHJlbWFpbmRlcm5lYXIgIDAuMDAgIDEgIC0+ICAwLjAwCitkZHJtbjY1OSByZW1haW5kZXJuZWFyIC0wLjAwICAxICAtPiAtMC4wMAorCistLSBTcGVjaWFscworZGRybW42ODAgcmVtYWluZGVybmVhciAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW42ODEgcmVtYWluZGVybmVhciAgSW5mICAtMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW42ODIgcmVtYWluZGVybmVhciAgSW5mICAtMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW42ODMgcmVtYWluZGVybmVhciAgSW5mICAgMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW42ODQgcmVtYWluZGVybmVhciAgSW5mICAtMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW42ODUgcmVtYWluZGVybmVhciAgSW5mICAgMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW42ODYgcmVtYWluZGVybmVhciAgSW5mICAgMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW42ODcgcmVtYWluZGVybmVhciAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW42ODggcmVtYWluZGVybmVhciAtMTAwMCAgSW5mICAgLT4gLTEwMDAKK2Rkcm1uNjg5IHJlbWFpbmRlcm5lYXIgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNjkxIHJlbWFpbmRlcm5lYXIgLTEgICAgIEluZiAgIC0+IC0xCitkZHJtbjY5MiByZW1haW5kZXJuZWFyICAwICAgICBJbmYgICAtPiAgMAorZGRybW42OTMgcmVtYWluZGVybmVhciAtMCAgICAgSW5mICAgLT4gLTAKK2Rkcm1uNjk0IHJlbWFpbmRlcm5lYXIgIDEgICAgIEluZiAgIC0+ICAxCitkZHJtbjY5NSByZW1haW5kZXJuZWFyICAxMDAwICBJbmYgICAtPiAgMTAwMAorZGRybW42OTYgcmVtYWluZGVybmVhciAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZHJtbjcwMCByZW1haW5kZXJuZWFyIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjcwMSByZW1haW5kZXJuZWFyIC1JbmYgIC0xMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjcwMiByZW1haW5kZXJuZWFyIC1JbmYgIC0xICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjcwMyByZW1haW5kZXJuZWFyIC1JbmYgIC0wICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjcwNCByZW1haW5kZXJuZWFyIC1JbmYgICAwICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjcwNSByZW1haW5kZXJuZWFyIC1JbmYgICAxICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjcwNiByZW1haW5kZXJuZWFyIC1JbmYgICAxMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjcwNyByZW1haW5kZXJuZWFyIC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjcwOCByZW1haW5kZXJuZWFyIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjcwOSByZW1haW5kZXJuZWFyIC0xMDAwICBJbmYgICAtPiAtMTAwMAorZGRybW43MTAgcmVtYWluZGVybmVhciAtMSAgICAtSW5mICAgLT4gLTEKK2Rkcm1uNzExIHJlbWFpbmRlcm5lYXIgLTAgICAgLUluZiAgIC0+IC0wCitkZHJtbjcxMiByZW1haW5kZXJuZWFyICAwICAgIC1JbmYgICAtPiAgMAorZGRybW43MTMgcmVtYWluZGVybmVhciAgMSAgICAtSW5mICAgLT4gIDEKK2Rkcm1uNzE0IHJlbWFpbmRlcm5lYXIgIDEwMDAgLUluZiAgIC0+ICAxMDAwCitkZHJtbjcxNSByZW1haW5kZXJuZWFyICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rkcm1uNzIxIHJlbWFpbmRlcm5lYXIgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2Rkcm1uNzIyIHJlbWFpbmRlcm5lYXIgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2Rkcm1uNzIzIHJlbWFpbmRlcm5lYXIgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2Rkcm1uNzI0IHJlbWFpbmRlcm5lYXIgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2Rkcm1uNzI1IHJlbWFpbmRlcm5lYXIgLU5hTiAgMCAgICAgIC0+IC1OYU4KK2Rkcm1uNzI2IHJlbWFpbmRlcm5lYXIgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2Rkcm1uNzI3IHJlbWFpbmRlcm5lYXIgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2Rkcm1uNzI4IHJlbWFpbmRlcm5lYXIgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2Rkcm1uNzI5IHJlbWFpbmRlcm5lYXIgIE5hTiAtTmFOICAgIC0+ICBOYU4KK2Rkcm1uNzMwIHJlbWFpbmRlcm5lYXIgLUluZiAgTmFOICAgIC0+ICBOYU4KK2Rkcm1uNzMxIHJlbWFpbmRlcm5lYXIgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2Rkcm1uNzMyIHJlbWFpbmRlcm5lYXIgLTEgICAgTmFOICAgIC0+ICBOYU4KK2Rkcm1uNzMzIHJlbWFpbmRlcm5lYXIgLTAgICAtTmFOICAgIC0+IC1OYU4KK2Rkcm1uNzM0IHJlbWFpbmRlcm5lYXIgIDAgICAgTmFOICAgIC0+ICBOYU4KK2Rkcm1uNzM1IHJlbWFpbmRlcm5lYXIgIDEgICAtTmFOICAgIC0+IC1OYU4KK2Rkcm1uNzM2IHJlbWFpbmRlcm5lYXIgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2Rkcm1uNzM3IHJlbWFpbmRlcm5lYXIgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZGRybW43NDEgcmVtYWluZGVybmVhciAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzQyIHJlbWFpbmRlcm5lYXIgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjc0MyByZW1haW5kZXJuZWFyIC1zTmFOIC0xICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NDQgcmVtYWluZGVybmVhciAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzQ1IHJlbWFpbmRlcm5lYXIgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjc0NiByZW1haW5kZXJuZWFyICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NDcgcmVtYWluZGVybmVhciAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzQ5IHJlbWFpbmRlcm5lYXIgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjc1MCByZW1haW5kZXJuZWFyICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NTEgcmVtYWluZGVybmVhciAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzUyIHJlbWFpbmRlcm5lYXIgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjc1MyByZW1haW5kZXJuZWFyIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NTQgcmVtYWluZGVybmVhciAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzU1IHJlbWFpbmRlcm5lYXIgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjc1NiByZW1haW5kZXJuZWFyICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NTcgcmVtYWluZGVybmVhciAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzU4IHJlbWFpbmRlcm5lYXIgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjc1OSByZW1haW5kZXJuZWFyICBJbmYgLXNOYU4gICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdpbmcgTmFOcworZGRybW43NjAgcmVtYWluZGVybmVhciAgTmFOMSAgIE5hTjcgICAtPiAgTmFOMQorZGRybW43NjEgcmVtYWluZGVybmVhciBzTmFOMiAgIE5hTjggICAtPiAgTmFOMiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NjIgcmVtYWluZGVybmVhciAgTmFOMyAgc05hTjkgICAtPiAgTmFOOSBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NjMgcmVtYWluZGVybmVhciBzTmFONCAgc05hTjEwICAtPiAgTmFONCBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NjQgcmVtYWluZGVybmVhciAgICAxNSAgIE5hTjExICAtPiAgTmFOMTEKK2Rkcm1uNzY1IHJlbWFpbmRlcm5lYXIgIE5hTjYgICBOYU4xMiAgLT4gIE5hTjYKK2Rkcm1uNzY2IHJlbWFpbmRlcm5lYXIgIEluZiAgICBOYU4xMyAgLT4gIE5hTjEzCitkZHJtbjc2NyByZW1haW5kZXJuZWFyICBOYU4xNCAgLUluZiAgIC0+ICBOYU4xNAorZGRybW43NjggcmVtYWluZGVybmVhciAgICAwICAgIE5hTjE1ICAtPiAgTmFOMTUKK2Rkcm1uNzY5IHJlbWFpbmRlcm5lYXIgIE5hTjE2ICAgLTAgICAgLT4gIE5hTjE2CisKKy0tIGVkZ2UgY2FzZXMgb2YgaW1wb3NzaWJsZQorZGRybW43NzAgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTYgIDEwICAgIC0+IC00CitkZHJtbjc3MSAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDEgICAgLT4gIDAKK2Rkcm1uNzcyICByZW1haW5kZXJuZWFyICAxMjM0NTY3ODkwMTIzNDU2ICAgMC4xICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2Rkcm1uNzczICByZW1haW5kZXJuZWFyICAxMjM0NTY3ODkwMTIzNDU2ICAgMC4wMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworLS0gbG9uZyBvcGVyYW5kIGNoZWNrcworZGRybW44MDEgcmVtYWluZGVybmVhciAxMjM0NTY3ODAwMCAxMDAgLT4gMAorZGRybW44MDIgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4MDAwICAgLT4gMQorZGRybW44MDMgcmVtYWluZGVybmVhciAxMjM0NTY3ODAwICAxMCAgLT4gMAorZGRybW44MDQgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4MDAgICAgLT4gMQorZGRybW44MDUgcmVtYWluZGVybmVhciAxMjM0NTY3ODkwICAxMCAgLT4gMAorZGRybW44MDYgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTAgICAgLT4gMQorZGRybW44MDcgcmVtYWluZGVybmVhciAxMjM0NTY3ODkxICAxMCAgLT4gMQorZGRybW44MDggcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTEgICAgLT4gMQorZGRybW44MDkgcmVtYWluZGVybmVhciAxMjM0NTY3ODkwMSAxMDAgLT4gMQorZGRybW44MTAgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTAxICAgLT4gMQorZGRybW44MTEgcmVtYWluZGVybmVhciAxMjM0NTY3ODk2ICAxMCAgLT4gLTQKK2Rkcm1uODEyIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworZGRybW44MjEgcmVtYWluZGVybmVhciAxMjM0NTY3ODAwMCAxMDAgLT4gMAorZGRybW44MjIgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4MDAwICAgLT4gMQorZGRybW44MjMgcmVtYWluZGVybmVhciAxMjM0NTY3ODAwICAxMCAgLT4gMAorZGRybW44MjQgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4MDAgICAgLT4gMQorZGRybW44MjUgcmVtYWluZGVybmVhciAxMjM0NTY3ODkwICAxMCAgLT4gMAorZGRybW44MjYgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTAgICAgLT4gMQorZGRybW44MjcgcmVtYWluZGVybmVhciAxMjM0NTY3ODkxICAxMCAgLT4gMQorZGRybW44MjggcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTEgICAgLT4gMQorZGRybW44MjkgcmVtYWluZGVybmVhciAxMjM0NTY3ODkwMSAxMDAgLT4gMQorZGRybW44MzAgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTAxICAgLT4gMQorZGRybW44MzEgcmVtYWluZGVybmVhciAxMjM0NTY3ODk2ICAxMCAgLT4gLTQKK2Rkcm1uODMyIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworLS0gZnJvbSBkaXZpZGVpbnQKK2Rkcm1uODQwIHJlbWFpbmRlcm5lYXIgIDEwMDAwMDAwMC4wICAgMSAgLT4gIDAuMAorZGRybW44NDEgcmVtYWluZGVybmVhciAgMTAwMDAwMDAwLjQgICAxICAtPiAgMC40CitkZHJtbjg0MiByZW1haW5kZXJuZWFyICAxMDAwMDAwMDAuNSAgIDEgIC0+ICAwLjUKK2Rkcm1uODQzIHJlbWFpbmRlcm5lYXIgIDEwMDAwMDAwMC45ICAgMSAgLT4gLTAuMQorZGRybW44NDQgcmVtYWluZGVybmVhciAgMTAwMDAwMDAwLjk5OSAxICAtPiAtMC4wMDEKK2Rkcm1uODUwIHJlbWFpbmRlcm5lYXIgIDEwMDAwMDAwMyAgICAgNSAgLT4gLTIKK2Rkcm1uODUxIHJlbWFpbmRlcm5lYXIgIDEwMDAwMDAzICAgICAgNSAgLT4gLTIKK2Rkcm1uODUyIHJlbWFpbmRlcm5lYXIgIDEwMDAwMDMgICAgICAgNSAgLT4gLTIKK2Rkcm1uODUzIHJlbWFpbmRlcm5lYXIgIDEwMDAwMyAgICAgICAgNSAgLT4gLTIKK2Rkcm1uODU0IHJlbWFpbmRlcm5lYXIgIDEwMDAzICAgICAgICAgNSAgLT4gLTIKK2Rkcm1uODU1IHJlbWFpbmRlcm5lYXIgIDEwMDMgICAgICAgICAgNSAgLT4gLTIKK2Rkcm1uODU2IHJlbWFpbmRlcm5lYXIgIDEwMyAgICAgICAgICAgNSAgLT4gLTIKK2Rkcm1uODU3IHJlbWFpbmRlcm5lYXIgIDEzICAgICAgICAgICAgNSAgLT4gLTIKK2Rkcm1uODU4IHJlbWFpbmRlcm5lYXIgIDEgICAgICAgICAgICAgNSAgLT4gIDEKKworLS0gVmxhZGltaXIncyBjYXNlcyAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2Rkcm1uODYwIHJlbWFpbmRlcm5lYXIgMTIzLjBlMSAxMDAwMDAwMDAwMDAwMDAwICAtPiAxMjMwCitkZHJtbjg2MSByZW1haW5kZXJuZWFyIDEyMzAgICAgMTAwMDAwMDAwMDAwMDAwMCAgLT4gMTIzMAorZGRybW44NjIgcmVtYWluZGVybmVhciAxMi4zZTIgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2Rkcm1uODYzIHJlbWFpbmRlcm5lYXIgMS4yM2UzICAxMDAwMDAwMDAwMDAwMDAwICAtPiAxMjMwCitkZHJtbjg2NCByZW1haW5kZXJuZWFyIDEyM2UxICAgMTAwMDAwMDAwMDAwMDAwMCAgLT4gMTIzMAorZGRybW44NzAgcmVtYWluZGVybmVhciAxMjNlMSAgICAxMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uODcxIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgIDEwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjg3MiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgMTAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW44NzMgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAxMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uODc0IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgIDEwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjg3NSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgMTAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW44NzYgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAxMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uODc3IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgIDEwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjg3OCByZW1haW5kZXJuZWFyIDEyMzAgICAgICAgICAgICAxMDAwMDAwMDAgLT4gMTIzMAorZGRybW44NzkgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgIDEwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uODgwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgMTAwMDAwMCAtPiAxMjMwCitkZHJtbjg4MSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAxMDAwMDAgLT4gMTIzMAorZGRybW44ODIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgIDEwMDAwIC0+IDEyMzAKK2Rkcm1uODgzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgMTAwMCAtPiAgMjMwCitkZHJtbjg4NCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICAxMDAgLT4gICAzMAorZGRybW44ODUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgIDEwIC0+ICAgIDAKK2Rkcm1uODg2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgICAgMSAtPiAgICAwCisKK2Rkcm1uODkwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgMjAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjg5MSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAyMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW44OTIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgIDIwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uODkzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgMjAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjg5NCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAyMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW44OTUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgIDIwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uODk2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgMjAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjg5NyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAyMDAwMDAwMDAgLT4gMTIzMAorZGRybW44OTkgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgIDIwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTAwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgMjAwMDAwMCAtPiAxMjMwCitkZHJtbjkwMSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAyMDAwMDAgLT4gMTIzMAorZGRybW45MDIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgIDIwMDAwIC0+IDEyMzAKK2Rkcm1uOTAzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgMjAwMCAtPiAtNzcwCitkZHJtbjkwNCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICAyMDAgLT4gICAzMAorZGRybW45MDUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgIDIwIC0+ICAtMTAKK2Rkcm1uOTA2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgICAgMiAtPiAgICAwCisKK2Rkcm1uOTEwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgNTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjkxMSByZW1haW5kZXJuZWFyIDEyM2UxICAgICA1MDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW45MTIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgIDUwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTEzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgNTAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjkxNCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICA1MDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW45MTUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgIDUwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTE2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgNTAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjkxNyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICA1MDAwMDAwMDAgLT4gMTIzMAorZGRybW45MTkgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgIDUwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTIwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgNTAwMDAwMCAtPiAxMjMwCitkZHJtbjkyMSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICA1MDAwMDAgLT4gMTIzMAorZGRybW45MjIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgIDUwMDAwIC0+IDEyMzAKK2Rkcm1uOTIzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgNTAwMCAtPiAxMjMwCitkZHJtbjkyNCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICA1MDAgLT4gIDIzMAorZGRybW45MjUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgIDUwIC0+ICAtMjAKK2Rkcm1uOTI2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgICAgNSAtPiAgICAwCisKK2Rkcm1uOTMwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgOTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjkzMSByZW1haW5kZXJuZWFyIDEyM2UxICAgICA5MDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW45MzIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgIDkwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTMzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgOTAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjkzNCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICA5MDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW45MzUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgIDkwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTM2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgOTAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjkzNyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICA5MDAwMDAwMDAgLT4gMTIzMAorZGRybW45MzkgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgIDkwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTQwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgOTAwMDAwMCAtPiAxMjMwCitkZHJtbjk0MSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICA5MDAwMDAgLT4gMTIzMAorZGRybW45NDIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgIDkwMDAwIC0+IDEyMzAKK2Rkcm1uOTQzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgOTAwMCAtPiAxMjMwCitkZHJtbjk0NCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICA5MDAgLT4gIDMzMAorZGRybW45NDUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgIDkwIC0+ICAtMzAKK2Rkcm1uOTQ2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgICAgOSAtPiAgIC0zCisKK2Rkcm1uOTUwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTYxIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAyOTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rkcm1uOTYyIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAzOTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rkcm1uOTYzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICA0OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rkcm1uOTY0IHJlbWFpbmRlcm5lYXIgMTIzZTEgICA1OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rkcm1uOTY1IHJlbWFpbmRlcm5lYXIgMTIzZTEgICA2OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rkcm1uOTY2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICA3OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rkcm1uOTY3IHJlbWFpbmRlcm5lYXIgMTIzZTEgICA4OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rkcm1uOTY4IHJlbWFpbmRlcm5lYXIgMTIzZTEgICA5OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rkcm1uOTY5IHJlbWFpbmRlcm5lYXIgMTIzZTEgICA5ODc2NTQzMjEwOTg3NjU0IC0+IDEyMzAKKworZGRybW45ODAgcmVtYWluZGVybmVhciAxMjNlMSAxMDAwRTI5OSAtPiAxLjIzRSszICAtLSAxMjNFKzEgaW50ZXJuYWxseQorCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgW2Zyb20gZGl2aWRlXQorZGRybW4xMDUxIHJlbWFpbmRlcm5lYXIgIDFlKzI3NyAgMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRybW4xMDUyIHJlbWFpbmRlcm5lYXIgIDFlKzI3NyAtMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRybW4xMDUzIHJlbWFpbmRlcm5lYXIgLTFlKzI3NyAgMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRybW4xMDU0IHJlbWFpbmRlcm5lYXIgLTFlKzI3NyAtMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRybW4xMDU1IHJlbWFpbmRlcm5lYXIgIDFlLTI3NyAgMWUrMzExIC0+ICAxRS0yNzcKK2Rkcm1uMTA1NiByZW1haW5kZXJuZWFyICAxZS0yNzcgLTFlKzMxMSAtPiAgMUUtMjc3CitkZHJtbjEwNTcgcmVtYWluZGVybmVhciAtMWUtMjc3ICAxZSszMTEgLT4gLTFFLTI3NworZGRybW4xMDU4IHJlbWFpbmRlcm5lYXIgLTFlLTI3NyAtMWUrMzExIC0+IC0xRS0yNzcKKworLS0gZGVzdHJ1Y3RpdmUgc3VidHJhY3QKK2Rkcm1uMTEwMCByZW1haW5kZXJOZWFyICAxMjM0NTY3ODkwMTIzNDU2ICAxLjAwMDAwMDAwMDAwMDAwMSAgLT4gIC0wLjIzNDU2Nzg5MDEyMzQ1NQorZGRybW4xMTAxIHJlbWFpbmRlck5lYXIgIDEyMzQ1Njc4OTAxMjM0NTYgICAxLjAwMDAwMDAwMDAwMDAxICAtPiAgIC0wLjM0NTY3ODkwMTIzNDQ0CitkZHJtbjExMDIgcmVtYWluZGVyTmVhciAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAxLjAwMDAwMDAwMDAwMDEgIC0+ICAgIC0wLjQ1Njc4OTAxMjMzMzMKK2Rkcm1uMTEwMyByZW1haW5kZXJOZWFyICAxMjM0NTY3ODkwMTIzNDU1ICA0LjAwMDAwMDAwMDAwMDAwMSAgLT4gIC0xLjMwODY0MTk3MjUzMDg2NAorZGRybW4xMTA0IHJlbWFpbmRlck5lYXIgIDEyMzQ1Njc4OTAxMjM0NTYgIDQuMDAwMDAwMDAwMDAwMDAxICAtPiAgLTAuMzA4NjQxOTcyNTMwODY0CitkZHJtbjExMTUgcmVtYWluZGVyTmVhciAgMTIzNDU2Nzg5MDEyMzQ1NiAgICA0Ljk5OTk5OTk5OTk5OTkgIC0+ICAgICAwLjY5MTM1NzgwMjQ2OTYKK2Rkcm1uMTExNiByZW1haW5kZXJOZWFyICAxMjM0NTY3ODkwMTIzNDU2ICAgNC45OTk5OTk5OTk5OTk5OSAgLT4gICAtMS41MzA4NjQyMTk3NTMwOAorZGRybW4xMTE3IHJlbWFpbmRlck5lYXIgIDEyMzQ1Njc4OTAxMjM0NTYgIDQuOTk5OTk5OTk5OTk5OTk5ICAtPiAgIDEuMjQ2OTEzNTc4MDI0NjkxCitkZHJtbjExMTggcmVtYWluZGVyTmVhciAgMTIzNDU2Nzg5MDEyMzQ1NiAgNS4wMDAwMDAwMDAwMDAwMDEgIC0+ICAgMC43NTMwODY0MjE5NzUzMDkKK2Rkcm1uMTExOSByZW1haW5kZXJOZWFyICAxMjM0NTY3ODkwMTIzNDU2ICAgNS4wMDAwMDAwMDAwMDAwMSAgLT4gICAtMS40NjkxMzU3ODAyNDY5MQorZGRybW4xMTEwIHJlbWFpbmRlck5lYXIgIDEyMzQ1Njc4OTAxMjM0NTYgICAgNS4wMDAwMDAwMDAwMDAxICAtPiAgICAgMS4zMDg2NDIxOTc1MzE0CisKKy0tIE51bGwgdGVzdHMKK2Rkcm1uMTAwMCByZW1haW5kZXJuZWFyIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4xMDAxIHJlbWFpbmRlcm5lYXIgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRSb3RhdGUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRSb3RhdGUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjBmZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFJvdGF0ZS5kZWNUZXN0CkBAIC0wLDAgKzEsMjYyIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkUm90YXRlLmRlY1Rlc3QgLS0gcm90YXRlIGEgZGVjRG91YmxlIGNvZWZmaWNpZW50IGxlZnQgb3IgcmlnaHQgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjaworZGRyb3QwMDEgcm90YXRlICAgICAgICAgICAgICAgICAwICAgIDAgIC0+ICAwCitkZHJvdDAwMiByb3RhdGUgICAgICAgICAgICAgICAgIDAgICAgMiAgLT4gIDAKK2Rkcm90MDAzIHJvdGF0ZSAgICAgICAgICAgICAgICAgMSAgICAyICAtPiAgMTAwCitkZHJvdDAwNCByb3RhdGUgICAgICAgICAgICAgICAgIDEgICAxNSAgLT4gIDEwMDAwMDAwMDAwMDAwMDAKK2Rkcm90MDA1IHJvdGF0ZSAgICAgICAgICAgICAgICAgMSAgIDE2ICAtPiAgMQorZGRyb3QwMDYgcm90YXRlICAgICAgICAgICAgICAgICAxICAgLTEgIC0+ICAxMDAwMDAwMDAwMDAwMDAwCitkZHJvdDAwNyByb3RhdGUgICAgICAgICAgICAgICAgIDAgICAtMiAgLT4gIDAKK2Rkcm90MDA4IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgIC0xICAtPiAgNjEyMzQ1Njc4OTAxMjM0NQorZGRyb3QwMDkgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgLTE1IC0+ICAyMzQ1Njc4OTAxMjM0NTYxCitkZHJvdDAxMCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAtMTYgLT4gIDEyMzQ1Njc4OTAxMjM0NTYKK2Rkcm90MDExIHJvdGF0ZSAgOTkzNDU2Nzg5MDEyMzQ1NiAgIC0xNSAtPiAgOTM0NTY3ODkwMTIzNDU2OQorZGRyb3QwMTIgcm90YXRlICA5OTM0NTY3ODkwMTIzNDU2ICAgLTE2IC0+ICA5OTM0NTY3ODkwMTIzNDU2CisKKy0tIHJocyBtdXN0IGJlIGFuIGludGVnZXIKK2Rkcm90MDE1IHJvdGF0ZSAgICAgICAgMSAgICAxLjUgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDAxNiByb3RhdGUgICAgICAgIDEgICAgMS4wICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3QwMTcgcm90YXRlICAgICAgICAxICAgIDAuMSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90MDE4IHJvdGF0ZSAgICAgICAgMSAgICAwLjAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDAxOSByb3RhdGUgICAgICAgIDEgICAgMUUrMSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3QwMjAgcm90YXRlICAgICAgICAxICAgIDFFKzk5ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90MDIxIHJvdGF0ZSAgICAgICAgMSAgICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDAyMiByb3RhdGUgICAgICAgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYW5kIHxyaHN8IDw9IHByZWNpc2lvbgorZGRyb3QwMjUgcm90YXRlICAgICAgICAxICAgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90MDI2IHJvdGF0ZSAgICAgICAgMSAgICAtMTcgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDAyNyByb3RhdGUgICAgICAgIDEgICAgIDE3ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3QwMjggcm90YXRlICAgICAgICAxICAgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gZnVsbCBwYXR0ZXJuCitkZHJvdDAzMCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMTYgIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2Rkcm90MDMxIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC0xNSAgLT4gMjM0NTY3ODkwMTIzNDU2MQorZGRyb3QwMzIgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTE0ICAtPiAzNDU2Nzg5MDEyMzQ1NjEyCitkZHJvdDAzMyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMTMgIC0+IDQ1Njc4OTAxMjM0NTYxMjMKK2Rkcm90MDM0IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC0xMiAgLT4gNTY3ODkwMTIzNDU2MTIzNAorZGRyb3QwMzUgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTExICAtPiA2Nzg5MDEyMzQ1NjEyMzQ1CitkZHJvdDAzNiByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMTAgIC0+IDc4OTAxMjM0NTYxMjM0NTYKK2Rkcm90MDM3IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC05ICAgLT4gODkwMTIzNDU2MTIzNDU2NworZGRyb3QwMzggcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTggICAtPiA5MDEyMzQ1NjEyMzQ1Njc4CitkZHJvdDAzOSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtNyAgIC0+ICAxMjM0NTYxMjM0NTY3ODkKK2Rkcm90MDQwIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC02ICAgLT4gMTIzNDU2MTIzNDU2Nzg5MAorZGRyb3QwNDEgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTUgICAtPiAyMzQ1NjEyMzQ1Njc4OTAxCitkZHJvdDA0MiByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtNCAgIC0+IDM0NTYxMjM0NTY3ODkwMTIKK2Rkcm90MDQzIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC0zICAgLT4gNDU2MTIzNDU2Nzg5MDEyMworZGRyb3QwNDQgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTIgICAtPiA1NjEyMzQ1Njc4OTAxMjM0CitkZHJvdDA0NSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMSAgIC0+IDYxMjM0NTY3ODkwMTIzNDUKK2Rkcm90MDQ2IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC0wICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorCitkZHJvdDA0NyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2Rkcm90MDQ4IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsxICAgLT4gMjM0NTY3ODkwMTIzNDU2MQorZGRyb3QwNDkgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzIgICAtPiAzNDU2Nzg5MDEyMzQ1NjEyCitkZHJvdDA1MCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMyAgIC0+IDQ1Njc4OTAxMjM0NTYxMjMKK2Rkcm90MDUxIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICs0ICAgLT4gNTY3ODkwMTIzNDU2MTIzNAorZGRyb3QwNTIgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzUgICAtPiA2Nzg5MDEyMzQ1NjEyMzQ1CitkZHJvdDA1MyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArNiAgIC0+IDc4OTAxMjM0NTYxMjM0NTYKK2Rkcm90MDU0IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICs3ICAgLT4gODkwMTIzNDU2MTIzNDU2NworZGRyb3QwNTUgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzggICAtPiA5MDEyMzQ1NjEyMzQ1Njc4CitkZHJvdDA1NiByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArOSAgIC0+ICAxMjM0NTYxMjM0NTY3ODkKK2Rkcm90MDU3IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsxMCAgLT4gMTIzNDU2MTIzNDU2Nzg5MAorZGRyb3QwNTggcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzExICAtPiAyMzQ1NjEyMzQ1Njc4OTAxCitkZHJvdDA1OSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMTIgIC0+IDM0NTYxMjM0NTY3ODkwMTIKK2Rkcm90MDYwIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsxMyAgLT4gNDU2MTIzNDU2Nzg5MDEyMworZGRyb3QwNjEgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzE0ICAtPiA1NjEyMzQ1Njc4OTAxMjM0CitkZHJvdDA2MiByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMTUgIC0+IDYxMjM0NTY3ODkwMTIzNDUKK2Rkcm90MDYzIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsxNiAgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorCistLSB6ZXJvcworZGRyb3QwNzAgcm90YXRlICAwRS0xMCAgICAgICAgICAgICAgKzkgICAtPiAgIDBFLTEwCitkZHJvdDA3MSByb3RhdGUgIDBFLTEwICAgICAgICAgICAgICAtOSAgIC0+ICAgMEUtMTAKK2Rkcm90MDcyIHJvdGF0ZSAgMC4wMDAgICAgICAgICAgICAgICs5ICAgLT4gICAwLjAwMAorZGRyb3QwNzMgcm90YXRlICAwLjAwMCAgICAgICAgICAgICAgLTkgICAtPiAgIDAuMDAwCitkZHJvdDA3NCByb3RhdGUgIDBFKzEwICAgICAgICAgICAgICArOSAgIC0+ICAgMEUrMTAKK2Rkcm90MDc1IHJvdGF0ZSAgMEUrMTAgICAgICAgICAgICAgIC05ICAgLT4gICAwRSsxMAorZGRyb3QwNzYgcm90YXRlIC0wRS0xMCAgICAgICAgICAgICAgKzkgICAtPiAgLTBFLTEwCitkZHJvdDA3NyByb3RhdGUgLTBFLTEwICAgICAgICAgICAgICAtOSAgIC0+ICAtMEUtMTAKK2Rkcm90MDc4IHJvdGF0ZSAtMC4wMDAgICAgICAgICAgICAgICs5ICAgLT4gIC0wLjAwMAorZGRyb3QwNzkgcm90YXRlIC0wLjAwMCAgICAgICAgICAgICAgLTkgICAtPiAgLTAuMDAwCitkZHJvdDA4MCByb3RhdGUgLTBFKzEwICAgICAgICAgICAgICArOSAgIC0+ICAtMEUrMTAKK2Rkcm90MDgxIHJvdGF0ZSAtMEUrMTAgICAgICAgICAgICAgIC05ICAgLT4gIC0wRSsxMAorCistLSBObWF4LCBObWluLCBOdGlueQorZGRyb3QxNDEgcm90YXRlICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAtMSAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRyb3QxNDIgcm90YXRlICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAtMTUgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRyb3QxNDMgcm90YXRlICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAgMSAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRyb3QxNDQgcm90YXRlICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAgMTUgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRyb3QxNDUgcm90YXRlICAxRS0zODMgICAgICAgICAgICAgICAgICAgICAtMSAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM2OAorZGRyb3QxNDYgcm90YXRlICAxRS0zODMgICAgICAgICAgICAgICAgICAgICAtMTUgLT4gMS4wRS0zODIKK2Rkcm90MTQ3IHJvdGF0ZSAgMUUtMzgzICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IDEuMEUtMzgyCitkZHJvdDE0OCByb3RhdGUgIDFFLTM4MyAgICAgICAgICAgICAgICAgICAgICAxNSAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzY4CitkZHJvdDE1MSByb3RhdGUgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgIC0xICAtPiAxLjAwMDAwMDAwMDAwMDAwRS0zODQKK2Rkcm90MTUyIHJvdGF0ZSAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTE1IC0+IDFFLTM5OAorZGRyb3QxNTMgcm90YXRlICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMSAgLT4gMUUtMzk4CitkZHJvdDE1NCByb3RhdGUgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgICAxNSAtPiAxLjAwMDAwMDAwMDAwMDAwRS0zODQKK2Rkcm90MTU1IHJvdGF0ZSAgOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTEgIC0+IDkuMDAwMDAwMDAwMDAwMDBFLTM4NAorZGRyb3QxNTYgcm90YXRlICA5LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtMTUgLT4gOUUtMzk4CitkZHJvdDE1NyByb3RhdGUgIDkuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgICAxICAtPiA5RS0zOTgKK2Rkcm90MTU4IHJvdGF0ZSAgOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgIDE1IC0+IDkuMDAwMDAwMDAwMDAwMDBFLTM4NAorZGRyb3QxNjAgcm90YXRlICAxRS0zOTggICAgICAgICAgICAgICAgICAgICAtMSAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRyb3QxNjEgcm90YXRlICAxRS0zOTggICAgICAgICAgICAgICAgICAgICAtMTUgLT4gMS4wRS0zOTcKK2Rkcm90MTYyIHJvdGF0ZSAgMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IDEuMEUtMzk3CitkZHJvdDE2MyByb3RhdGUgIDFFLTM5OCAgICAgICAgICAgICAgICAgICAgICAxNSAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCistLSAgbmVnYXRpdmVzCitkZHJvdDE3MSByb3RhdGUgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgIC0xICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRyb3QxNzIgcm90YXRlIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAtMTUgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2Rkcm90MTczIHJvdGF0ZSAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgIDEgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZHJvdDE3NCByb3RhdGUgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgICAxNSAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRyb3QxNzUgcm90YXRlIC0xRS0zODMgICAgICAgICAgICAgICAgICAgICAtMSAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zNjgKK2Rkcm90MTc2IHJvdGF0ZSAtMUUtMzgzICAgICAgICAgICAgICAgICAgICAgLTE1IC0+IC0xLjBFLTM4MgorZGRyb3QxNzcgcm90YXRlIC0xRS0zODMgICAgICAgICAgICAgICAgICAgICAgMSAgLT4gLTEuMEUtMzgyCitkZHJvdDE3OCByb3RhdGUgLTFFLTM4MyAgICAgICAgICAgICAgICAgICAgICAxNSAtPiAtMS4wMDAwMDAwMDAwMDAwMDBFLTM2OAorZGRyb3QxODEgcm90YXRlIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtMSAgLT4gLTEuMDAwMDAwMDAwMDAwMDBFLTM4NAorZGRyb3QxODIgcm90YXRlIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtMTUgLT4gLTFFLTM5OAorZGRyb3QxODMgcm90YXRlIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMSAgLT4gLTFFLTM5OAorZGRyb3QxODQgcm90YXRlIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMTUgLT4gLTEuMDAwMDAwMDAwMDAwMDBFLTM4NAorZGRyb3QxODUgcm90YXRlIC05LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtMSAgLT4gLTkuMDAwMDAwMDAwMDAwMDBFLTM4NAorZGRyb3QxODYgcm90YXRlIC05LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtMTUgLT4gLTlFLTM5OAorZGRyb3QxODcgcm90YXRlIC05LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMSAgLT4gLTlFLTM5OAorZGRyb3QxODggcm90YXRlIC05LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMTUgLT4gLTkuMDAwMDAwMDAwMDAwMDBFLTM4NAorZGRyb3QxOTAgcm90YXRlIC0xRS0zOTggICAgICAgICAgICAgICAgICAgICAtMSAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2Rkcm90MTkxIHJvdGF0ZSAtMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgLTE1IC0+IC0xLjBFLTM5NworZGRyb3QxOTIgcm90YXRlIC0xRS0zOTggICAgICAgICAgICAgICAgICAgICAgMSAgLT4gLTEuMEUtMzk3CitkZHJvdDE5MyByb3RhdGUgLTFFLTM5OCAgICAgICAgICAgICAgICAgICAgICAxNSAtPiAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworCistLSBtb3JlIG5lZ2F0aXZlcyAob2Ygc2FuaXRpZXMpCitkZHJvdDIwMSByb3RhdGUgICAgICAgICAgICAgICAgLTAgICAgMCAgLT4gLTAKK2Rkcm90MjAyIHJvdGF0ZSAgICAgICAgICAgICAgICAtMCAgICAyICAtPiAtMAorZGRyb3QyMDMgcm90YXRlICAgICAgICAgICAgICAgIC0xICAgIDIgIC0+IC0xMDAKK2Rkcm90MjA0IHJvdGF0ZSAgICAgICAgICAgICAgICAtMSAgIDE1ICAtPiAtMTAwMDAwMDAwMDAwMDAwMAorZGRyb3QyMDUgcm90YXRlICAgICAgICAgICAgICAgIC0xICAgMTYgIC0+IC0xCitkZHJvdDIwNiByb3RhdGUgICAgICAgICAgICAgICAgLTEgICAtMSAgLT4gLTEwMDAwMDAwMDAwMDAwMDAKK2Rkcm90MjA3IHJvdGF0ZSAgICAgICAgICAgICAgICAtMCAgIC0yICAtPiAtMAorZGRyb3QyMDggcm90YXRlIC0xMjM0NTY3ODkwMTIzNDU2ICAgLTEgIC0+IC02MTIzNDU2Nzg5MDEyMzQ1CitkZHJvdDIwOSByb3RhdGUgLTEyMzQ1Njc4OTAxMjM0NTYgICAtMTUgLT4gLTIzNDU2Nzg5MDEyMzQ1NjEKK2Rkcm90MjEwIHJvdGF0ZSAtMTIzNDU2Nzg5MDEyMzQ1NiAgIC0xNiAtPiAtMTIzNDU2Nzg5MDEyMzQ1NgorZGRyb3QyMTEgcm90YXRlIC05OTM0NTY3ODkwMTIzNDU2ICAgLTE1IC0+IC05MzQ1Njc4OTAxMjM0NTY5CitkZHJvdDIxMiByb3RhdGUgLTk5MzQ1Njc4OTAxMjM0NTYgICAtMTYgLT4gLTk5MzQ1Njc4OTAxMjM0NTYKKworCistLSBTcGVjaWFsczsgTmFOcyBhcmUgaGFuZGxlZCBhcyB1c3VhbAorZGRyb3Q3ODEgcm90YXRlIC1JbmYgIC04ICAgICAtPiAtSW5maW5pdHkKK2Rkcm90NzgyIHJvdGF0ZSAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitkZHJvdDc4MyByb3RhdGUgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorZGRyb3Q3ODQgcm90YXRlIC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK2Rkcm90Nzg1IHJvdGF0ZSAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkZHJvdDc4NiByb3RhdGUgLUluZiAgIDggICAgIC0+IC1JbmZpbml0eQorZGRyb3Q3ODcgcm90YXRlIC0xMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90Nzg4IHJvdGF0ZSAtSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDc4OSByb3RhdGUgLTEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q3OTAgcm90YXRlIC0wICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90NzkxIHJvdGF0ZSAgMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDc5MiByb3RhdGUgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q3OTMgcm90YXRlICAxMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90Nzk0IHJvdGF0ZSAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rkcm90ODAwIHJvdGF0ZSAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDgwMSByb3RhdGUgIEluZiAgLTggICAgIC0+IEluZmluaXR5CitkZHJvdDgwMiByb3RhdGUgIEluZiAgLTEgICAgIC0+IEluZmluaXR5CitkZHJvdDgwMyByb3RhdGUgIEluZiAgLTAgICAgIC0+IEluZmluaXR5CitkZHJvdDgwNCByb3RhdGUgIEluZiAgIDAgICAgIC0+IEluZmluaXR5CitkZHJvdDgwNSByb3RhdGUgIEluZiAgIDEgICAgIC0+IEluZmluaXR5CitkZHJvdDgwNiByb3RhdGUgIEluZiAgIDggICAgIC0+IEluZmluaXR5CitkZHJvdDgwNyByb3RhdGUgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4MDggcm90YXRlIC0xMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODA5IHJvdGF0ZSAtSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDgxMCByb3RhdGUgLTEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4MTEgcm90YXRlIC0wICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODEyIHJvdGF0ZSAgMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDgxMyByb3RhdGUgIDEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4MTQgcm90YXRlICAxMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODE1IHJvdGF0ZSAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rkcm90ODIxIHJvdGF0ZSAgTmFOIC1JbmYgICAgLT4gIE5hTgorZGRyb3Q4MjIgcm90YXRlICBOYU4gLTEwMDAgICAtPiAgTmFOCitkZHJvdDgyMyByb3RhdGUgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2Rkcm90ODI0IHJvdGF0ZSAgTmFOIC0wICAgICAgLT4gIE5hTgorZGRyb3Q4MjUgcm90YXRlICBOYU4gIDAgICAgICAtPiAgTmFOCitkZHJvdDgyNiByb3RhdGUgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2Rkcm90ODI3IHJvdGF0ZSAgTmFOICAxMDAwICAgLT4gIE5hTgorZGRyb3Q4Mjggcm90YXRlICBOYU4gIEluZiAgICAtPiAgTmFOCitkZHJvdDgyOSByb3RhdGUgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2Rkcm90ODMwIHJvdGF0ZSAtSW5mICBOYU4gICAgLT4gIE5hTgorZGRyb3Q4MzEgcm90YXRlIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkZHJvdDgzMiByb3RhdGUgLTEgICAgTmFOICAgIC0+ICBOYU4KK2Rkcm90ODMzIHJvdGF0ZSAtMCAgICBOYU4gICAgLT4gIE5hTgorZGRyb3Q4MzQgcm90YXRlICAwICAgIE5hTiAgICAtPiAgTmFOCitkZHJvdDgzNSByb3RhdGUgIDEgICAgTmFOICAgIC0+ICBOYU4KK2Rkcm90ODM2IHJvdGF0ZSAgMTAwMCBOYU4gICAgLT4gIE5hTgorZGRyb3Q4Mzcgcm90YXRlICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2Rkcm90ODQxIHJvdGF0ZSAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODQyIHJvdGF0ZSAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODQzIHJvdGF0ZSAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODQ0IHJvdGF0ZSAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODQ1IHJvdGF0ZSAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODQ2IHJvdGF0ZSAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODQ3IHJvdGF0ZSAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODQ4IHJvdGF0ZSAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODQ5IHJvdGF0ZSAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODUwIHJvdGF0ZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODUxIHJvdGF0ZSAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODUyIHJvdGF0ZSAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODUzIHJvdGF0ZSAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODU0IHJvdGF0ZSAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODU1IHJvdGF0ZSAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODU2IHJvdGF0ZSAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODU3IHJvdGF0ZSAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODU4IHJvdGF0ZSAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODU5IHJvdGF0ZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRyb3Q4NjEgcm90YXRlICBOYU4xICAgLUluZiAgICAtPiAgTmFOMQorZGRyb3Q4NjIgcm90YXRlICtOYU4yICAgLTEwMDAgICAtPiAgTmFOMgorZGRyb3Q4NjMgcm90YXRlICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworZGRyb3Q4NjQgcm90YXRlICBOYU40ICAgIEluZiAgICAtPiAgTmFONAorZGRyb3Q4NjUgcm90YXRlICBOYU41ICAgK05hTjYgICAtPiAgTmFONQorZGRyb3Q4NjYgcm90YXRlIC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworZGRyb3Q4Njcgcm90YXRlIC0xMDAwICAgIE5hTjggICAtPiAgTmFOOAorZGRyb3Q4Njggcm90YXRlICAxMDAwICAgIE5hTjkgICAtPiAgTmFOOQorZGRyb3Q4Njkgcm90YXRlICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK2Rkcm90ODcxIHJvdGF0ZSAgc05hTjExICAtSW5mICAgLT4gIE5hTjExICBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4NzIgcm90YXRlICBzTmFOMTIgIC0xMDAwICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg3MyByb3RhdGUgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODc0IHJvdGF0ZSAgc05hTjE0ICAgTmFOMTcgLT4gIE5hTjE0ICBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4NzUgcm90YXRlICBzTmFOMTUgIHNOYU4xOCAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg3NiByb3RhdGUgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODc3IHJvdGF0ZSAtSW5mICAgICtzTmFOMjAgLT4gIE5hTjIwICBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4Nzggcm90YXRlIC0xMDAwICAgIHNOYU4yMSAtPiAgTmFOMjEgIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg3OSByb3RhdGUgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODgwIHJvdGF0ZSAgSW5mICAgICBzTmFOMjMgLT4gIE5hTjIzICBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4ODEgcm90YXRlICtOYU4yNSAgK3NOYU4yNCAtPiAgTmFOMjQgIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg4MiByb3RhdGUgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorZGRyb3Q4ODMgcm90YXRlIC1zTmFOMjcgIHNOYU4yOSAtPiAtTmFOMjcgIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg4NCByb3RhdGUgIDEwMDAgICAgLU5hTjMwIC0+IC1OYU4zMAorZGRyb3Q4ODUgcm90YXRlICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkU2FtZVF1YW50dW0uZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRTYW1lUXVhbnR1bS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NWIzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkU2FtZVF1YW50dW0uZGVjVGVzdApAQCAtMCwwICsxLDM4OSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZFNhbWVRdWFudHVtLmRlY1Rlc3QgLS0gY2hlY2sgZGVjRG91YmxlIHF1YW50dW1zIG1hdGNoICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDAxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjRG91Ymxlcy4KK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkZHNhbXEwMDEgc2FtZXF1YW50dW0gIDAgICAgICAwICAgICAgLT4gIDEKK2Rkc2FtcTAwMiBzYW1lcXVhbnR1bSAgMCAgICAgIDEgICAgICAtPiAgMQorZGRzYW1xMDAzIHNhbWVxdWFudHVtICAxICAgICAgMCAgICAgIC0+ICAxCitkZHNhbXEwMDQgc2FtZXF1YW50dW0gIDEgICAgICAxICAgICAgLT4gIDEKKworZGRzYW1xMDExIHNhbWVxdWFudHVtICAxMCAgICAgMUUrMSAgIC0+IDAKK2Rkc2FtcTAxMiBzYW1lcXVhbnR1bSAgMTBFKzEgIDEwRSsxICAtPiAxCitkZHNhbXEwMTMgc2FtZXF1YW50dW0gIDEwMCAgICAxMEUrMSAgLT4gMAorZGRzYW1xMDE0IHNhbWVxdWFudHVtICAxMDAgICAgMUUrMiAgIC0+IDAKK2Rkc2FtcTAxNSBzYW1lcXVhbnR1bSAgMC4xICAgIDFFLTIgICAtPiAwCitkZHNhbXEwMTYgc2FtZXF1YW50dW0gIDAuMSAgICAxRS0xICAgLT4gMQorZGRzYW1xMDE3IHNhbWVxdWFudHVtICAwLjEgICAgMUUtMCAgIC0+IDAKK2Rkc2FtcTAxOCBzYW1lcXVhbnR1bSAgOTk5ICAgIDk5OSAgICAtPiAxCitkZHNhbXEwMTkgc2FtZXF1YW50dW0gIDk5OUUtMSA5OS45ICAgLT4gMQorZGRzYW1xMDIwIHNhbWVxdWFudHVtICAxMTFFLTEgMjIuMiAgIC0+IDEKK2Rkc2FtcTAyMSBzYW1lcXVhbnR1bSAgMTExRS0xIDEyMzQuMiAtPiAxCisKKy0tIHplcm9zCitkZHNhbXEwMzAgc2FtZXF1YW50dW0gIDAuMCAgICAxLjEgICAgLT4gMQorZGRzYW1xMDMxIHNhbWVxdWFudHVtICAwLjAgICAgMS4xMSAgIC0+IDAKK2Rkc2FtcTAzMiBzYW1lcXVhbnR1bSAgMC4wICAgIDAgICAgICAtPiAwCitkZHNhbXEwMzMgc2FtZXF1YW50dW0gIDAuMCAgICAwLjAgICAgLT4gMQorZGRzYW1xMDM0IHNhbWVxdWFudHVtICAwLjAgICAgMC4wMCAgIC0+IDAKK2Rkc2FtcTAzNSBzYW1lcXVhbnR1bSAgMEUrMSAgIDBFKzAgICAtPiAwCitkZHNhbXEwMzYgc2FtZXF1YW50dW0gIDBFKzEgICAwRSsxICAgLT4gMQorZGRzYW1xMDM3IHNhbWVxdWFudHVtICAwRSsxICAgMEUrMiAgIC0+IDAKK2Rkc2FtcTAzOCBzYW1lcXVhbnR1bSAgMEUtMTcgIDBFLTE2ICAtPiAwCitkZHNhbXEwMzkgc2FtZXF1YW50dW0gIDBFLTE3ICAwRS0xNyAgLT4gMQorZGRzYW1xMDQwIHNhbWVxdWFudHVtICAwRS0xNyAgMEUtMTggIC0+IDAKK2Rkc2FtcTA0MSBzYW1lcXVhbnR1bSAgMEUtMTcgIDAuMEUtMTUgLT4gMAorZGRzYW1xMDQyIHNhbWVxdWFudHVtICAwRS0xNyAgMC4wRS0xNiAtPiAxCitkZHNhbXEwNDMgc2FtZXF1YW50dW0gIDBFLTE3ICAwLjBFLTE3IC0+IDAKK2Rkc2FtcTA0NCBzYW1lcXVhbnR1bSAtMEUtMTcgIDAuMEUtMTYgLT4gMQorZGRzYW1xMDQ1IHNhbWVxdWFudHVtICAwRS0xNyAtMC4wRS0xNyAtPiAwCitkZHNhbXEwNDYgc2FtZXF1YW50dW0gIDBFLTE3IC0wLjBFLTE2IC0+IDEKK2Rkc2FtcTA0NyBzYW1lcXVhbnR1bSAtMEUtMTcgIDAuMEUtMTcgLT4gMAorZGRzYW1xMDQ4IHNhbWVxdWFudHVtIC0wRS0xNyAtMC4wRS0xNiAtPiAxCitkZHNhbXEwNDkgc2FtZXF1YW50dW0gLTBFLTE3IC0wLjBFLTE3IC0+IDAKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2Rkc2FtcTA1MSBzYW1lcXVhbnR1bSAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAxCitkZHNhbXEwNTIgc2FtZXF1YW50dW0gIDFFLTM4MyAgICAgICAgICAgICAxRS0zODMgICAgICAgICAgIC0+IDEKK2Rkc2FtcTA1MyBzYW1lcXVhbnR1bSAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAxCitkZHNhbXEwNTQgc2FtZXF1YW50dW0gIDFFLTM5OCAgICAgICAgICAgICAxRS0zOTggICAgICAgICAgIC0+IDEKK2Rkc2FtcTA1NSBzYW1lcXVhbnR1bSAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAxCitkZHNhbXEwNTYgc2FtZXF1YW50dW0gIDFFLTM4MyAgICAgICAgICAgICAxRS0zODMgICAgICAgICAgIC0+IDEKK2Rkc2FtcTA1NyBzYW1lcXVhbnR1bSAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAxCitkZHNhbXEwNTggc2FtZXF1YW50dW0gIDFFLTM5OCAgICAgICAgICAgICAxRS0zOTggICAgICAgICAgIC0+IDEKKworZGRzYW1xMDYxIHNhbWVxdWFudHVtICAtMUUtMzk4ICAgICAgICAgICAgLTFFLTM5OCAgICAgICAgICAtPiAxCitkZHNhbXEwNjIgc2FtZXF1YW50dW0gIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgLT4gMQorZGRzYW1xMDYzIHNhbWVxdWFudHVtICAtMUUtMzgzICAgICAgICAgICAgLTFFLTM4MyAgICAgICAgICAtPiAxCitkZHNhbXEwNjQgc2FtZXF1YW50dW0gIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLT4gMQorZGRzYW1xMDY1IHNhbWVxdWFudHVtICAtMUUtMzk4ICAgICAgICAgICAgLTFFLTM5OCAgICAgICAgICAtPiAxCitkZHNhbXEwNjYgc2FtZXF1YW50dW0gIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgLT4gMQorZGRzYW1xMDY3IHNhbWVxdWFudHVtICAtMUUtMzgzICAgICAgICAgICAgLTFFLTM4MyAgICAgICAgICAtPiAxCitkZHNhbXEwNjggc2FtZXF1YW50dW0gIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLT4gMQorCitkZHNhbXEwNzEgc2FtZXF1YW50dW0gIC00RS0zOTggICAgICAgICAgICAtMUUtMzk4ICAgICAgICAgIC0+IDEKK2Rkc2FtcTA3MiBzYW1lcXVhbnR1bSAgLTQuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtMS4wMDAwNDAwMDAwMDAwMDBFLTM4MyAtPiAxCitkZHNhbXEwNzMgc2FtZXF1YW50dW0gIC00RS0zODMgICAgICAgICAgICAtMUUtMzgzICAgICAgICAgIC0+IDEKK2Rkc2FtcTA3NCBzYW1lcXVhbnR1bSAgLTQuOTk5OTk5OTk5OTk5OTk5RSszODQgICAtOS45OTk5OTk5OTk5NDk5OTlFKzM4NCAtPiAxCitkZHNhbXEwNzUgc2FtZXF1YW50dW0gIC00RS0zOTggICAgICAgICAgICAtMUUtMzk4ICAgICAgICAgIC0+IDEKK2Rkc2FtcTA3NiBzYW1lcXVhbnR1bSAgLTQuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtMS4wMDQwMDAwMDAwMDAwMDBFLTM4MyAtPiAxCitkZHNhbXEwNzcgc2FtZXF1YW50dW0gIC00RS0zODMgICAgICAgICAgICAtMUUtMzgzICAgICAgICAgIC0+IDEKK2Rkc2FtcTA3OCBzYW1lcXVhbnR1bSAgLTQuOTk5OTk5OTk5OTk5OTk5RSszODQgICAtOS45NDk5OTk5OTk5OTk5OTlFKzM4NCAtPiAxCisKK2Rkc2FtcTA4MSBzYW1lcXVhbnR1bSAgLTRFLTM5NyAgICAgICAgICAgIC0xRS0zOTggICAgICAgICAgLT4gMAorZGRzYW1xMDgyIHNhbWVxdWFudHVtICAtNC4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgIC0xLjAwMDA0MDAwMDAwMDAwMEUtMzM2IC0+IDAKK2Rkc2FtcTA4MyBzYW1lcXVhbnR1bSAgLTRFLTM0NiAgICAgICAgICAgIC0xRS0zODMgICAgICAgICAgLT4gMAorZGRzYW1xMDg0IHNhbWVxdWFudHVtICAtNC45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC05Ljk5OTQ5OTk5OTk5OTk5OUUrMzM2IC0+IDAKK2Rkc2FtcTA4NSBzYW1lcXVhbnR1bSAgLTRFLTM5NyAgICAgICAgICAgIC0xRS0zOTggICAgICAgICAgLT4gMAorZGRzYW1xMDg2IHNhbWVxdWFudHVtICAtNC4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgIC0xLjAwNDAwMDAwMDAwMDAwMEUtMzM2IC0+IDAKK2Rkc2FtcTA4NyBzYW1lcXVhbnR1bSAgLTRFLTM0NiAgICAgICAgICAgIC0xRS0zODMgICAgICAgICAgLT4gMAorZGRzYW1xMDg4IHNhbWVxdWFudHVtICAtNC45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC05Ljk0OTk5OTk5OTk5OTk5OUUrMzM2IC0+IDAKKworLS0gc3BlY2lhbHMgJiBjb21iaW5hdGlvbnMKK2Rkc2FtcTAxMTAgc2FtZXF1YW50dW0gIC1JbmYgICAgLUluZiAgIC0+IDEKK2Rkc2FtcTAxMTEgc2FtZXF1YW50dW0gIC1JbmYgICAgIEluZiAgIC0+IDEKK2Rkc2FtcTAxMTIgc2FtZXF1YW50dW0gIC1JbmYgICAgIE5hTiAgIC0+IDAKK2Rkc2FtcTAxMTMgc2FtZXF1YW50dW0gIC1JbmYgICAgLTdFKzMgIC0+IDAKK2Rkc2FtcTAxMTQgc2FtZXF1YW50dW0gIC1JbmYgICAgLTcgICAgIC0+IDAKK2Rkc2FtcTAxMTUgc2FtZXF1YW50dW0gIC1JbmYgICAgLTdFLTMgIC0+IDAKK2Rkc2FtcTAxMTYgc2FtZXF1YW50dW0gIC1JbmYgICAgLTBFLTMgIC0+IDAKK2Rkc2FtcTAxMTcgc2FtZXF1YW50dW0gIC1JbmYgICAgLTAgICAgIC0+IDAKK2Rkc2FtcTAxMTggc2FtZXF1YW50dW0gIC1JbmYgICAgLTBFKzMgIC0+IDAKK2Rkc2FtcTAxMTkgc2FtZXF1YW50dW0gIC1JbmYgICAgIDBFLTMgIC0+IDAKK2Rkc2FtcTAxMjAgc2FtZXF1YW50dW0gIC1JbmYgICAgIDAgICAgIC0+IDAKK2Rkc2FtcTAxMjEgc2FtZXF1YW50dW0gIC1JbmYgICAgIDBFKzMgIC0+IDAKK2Rkc2FtcTAxMjIgc2FtZXF1YW50dW0gIC1JbmYgICAgIDdFLTMgIC0+IDAKK2Rkc2FtcTAxMjMgc2FtZXF1YW50dW0gIC1JbmYgICAgIDcgICAgIC0+IDAKK2Rkc2FtcTAxMjQgc2FtZXF1YW50dW0gIC1JbmYgICAgIDdFKzMgIC0+IDAKK2Rkc2FtcTAxMjUgc2FtZXF1YW50dW0gIC1JbmYgICAgIHNOYU4gIC0+IDAKKworZGRzYW1xMDIxMCBzYW1lcXVhbnR1bSAgIEluZiAgICAtSW5mICAgLT4gMQorZGRzYW1xMDIxMSBzYW1lcXVhbnR1bSAgIEluZiAgICAgSW5mICAgLT4gMQorZGRzYW1xMDIxMiBzYW1lcXVhbnR1bSAgIEluZiAgICAgTmFOICAgLT4gMAorZGRzYW1xMDIxMyBzYW1lcXVhbnR1bSAgIEluZiAgICAtN0UrMyAgLT4gMAorZGRzYW1xMDIxNCBzYW1lcXVhbnR1bSAgIEluZiAgICAtNyAgICAgLT4gMAorZGRzYW1xMDIxNSBzYW1lcXVhbnR1bSAgIEluZiAgICAtN0UtMyAgLT4gMAorZGRzYW1xMDIxNiBzYW1lcXVhbnR1bSAgIEluZiAgICAtMEUtMyAgLT4gMAorZGRzYW1xMDIxNyBzYW1lcXVhbnR1bSAgIEluZiAgICAtMCAgICAgLT4gMAorZGRzYW1xMDIxOCBzYW1lcXVhbnR1bSAgIEluZiAgICAtMEUrMyAgLT4gMAorZGRzYW1xMDIxOSBzYW1lcXVhbnR1bSAgIEluZiAgICAgMEUtMyAgLT4gMAorZGRzYW1xMDIyMCBzYW1lcXVhbnR1bSAgIEluZiAgICAgMCAgICAgLT4gMAorZGRzYW1xMDIyMSBzYW1lcXVhbnR1bSAgIEluZiAgICAgMEUrMyAgLT4gMAorZGRzYW1xMDIyMiBzYW1lcXVhbnR1bSAgIEluZiAgICAgN0UtMyAgLT4gMAorZGRzYW1xMDIyMyBzYW1lcXVhbnR1bSAgIEluZiAgICAgNyAgICAgLT4gMAorZGRzYW1xMDIyNCBzYW1lcXVhbnR1bSAgIEluZiAgICAgN0UrMyAgLT4gMAorZGRzYW1xMDIyNSBzYW1lcXVhbnR1bSAgIEluZiAgICAgc05hTiAgLT4gMAorCitkZHNhbXEwMzEwIHNhbWVxdWFudHVtICAgTmFOICAgIC1JbmYgICAtPiAwCitkZHNhbXEwMzExIHNhbWVxdWFudHVtICAgTmFOICAgICBJbmYgICAtPiAwCitkZHNhbXEwMzEyIHNhbWVxdWFudHVtICAgTmFOICAgICBOYU4gICAtPiAxCitkZHNhbXEwMzEzIHNhbWVxdWFudHVtICAgTmFOICAgIC03RSszICAtPiAwCitkZHNhbXEwMzE0IHNhbWVxdWFudHVtICAgTmFOICAgIC03ICAgICAtPiAwCitkZHNhbXEwMzE1IHNhbWVxdWFudHVtICAgTmFOICAgIC03RS0zICAtPiAwCitkZHNhbXEwMzE2IHNhbWVxdWFudHVtICAgTmFOICAgIC0wRS0zICAtPiAwCitkZHNhbXEwMzE3IHNhbWVxdWFudHVtICAgTmFOICAgIC0wICAgICAtPiAwCitkZHNhbXEwMzE4IHNhbWVxdWFudHVtICAgTmFOICAgIC0wRSszICAtPiAwCitkZHNhbXEwMzE5IHNhbWVxdWFudHVtICAgTmFOICAgICAwRS0zICAtPiAwCitkZHNhbXEwMzIwIHNhbWVxdWFudHVtICAgTmFOICAgICAwICAgICAtPiAwCitkZHNhbXEwMzIxIHNhbWVxdWFudHVtICAgTmFOICAgICAwRSszICAtPiAwCitkZHNhbXEwMzIyIHNhbWVxdWFudHVtICAgTmFOICAgICA3RS0zICAtPiAwCitkZHNhbXEwMzIzIHNhbWVxdWFudHVtICAgTmFOICAgICA3ICAgICAtPiAwCitkZHNhbXEwMzI0IHNhbWVxdWFudHVtICAgTmFOICAgICA3RSszICAtPiAwCitkZHNhbXEwMzI1IHNhbWVxdWFudHVtICAgTmFOICAgICBzTmFOICAtPiAxCisKK2Rkc2FtcTA0MTAgc2FtZXF1YW50dW0gIC03RSszICAgIC1JbmYgICAtPiAwCitkZHNhbXEwNDExIHNhbWVxdWFudHVtICAtN0UrMyAgICAgSW5mICAgLT4gMAorZGRzYW1xMDQxMiBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIE5hTiAgIC0+IDAKK2Rkc2FtcTA0MTMgc2FtZXF1YW50dW0gIC03RSszICAgIC03RSszICAtPiAxCitkZHNhbXEwNDE0IHNhbWVxdWFudHVtICAtN0UrMyAgICAtNyAgICAgLT4gMAorZGRzYW1xMDQxNSBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLTdFLTMgIC0+IDAKK2Rkc2FtcTA0MTYgc2FtZXF1YW50dW0gIC03RSszICAgIC0wRS0zICAtPiAwCitkZHNhbXEwNDE3IHNhbWVxdWFudHVtICAtN0UrMyAgICAtMCAgICAgLT4gMAorZGRzYW1xMDQxOCBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLTBFKzMgIC0+IDEKK2Rkc2FtcTA0MTkgc2FtZXF1YW50dW0gIC03RSszICAgICAwRS0zICAtPiAwCitkZHNhbXEwNDIwIHNhbWVxdWFudHVtICAtN0UrMyAgICAgMCAgICAgLT4gMAorZGRzYW1xMDQyMSBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIDBFKzMgIC0+IDEKK2Rkc2FtcTA0MjIgc2FtZXF1YW50dW0gIC03RSszICAgICA3RS0zICAtPiAwCitkZHNhbXEwNDIzIHNhbWVxdWFudHVtICAtN0UrMyAgICAgNyAgICAgLT4gMAorZGRzYW1xMDQyNCBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIDdFKzMgIC0+IDEKK2Rkc2FtcTA0MjUgc2FtZXF1YW50dW0gIC03RSszICAgICBzTmFOICAtPiAwCisKK2Rkc2FtcTA1MTAgc2FtZXF1YW50dW0gIC03ICAgICAgLUluZiAgIC0+IDAKK2Rkc2FtcTA1MTEgc2FtZXF1YW50dW0gIC03ICAgICAgIEluZiAgIC0+IDAKK2Rkc2FtcTA1MTIgc2FtZXF1YW50dW0gIC03ICAgICAgIE5hTiAgIC0+IDAKK2Rkc2FtcTA1MTMgc2FtZXF1YW50dW0gIC03ICAgICAgLTdFKzMgIC0+IDAKK2Rkc2FtcTA1MTQgc2FtZXF1YW50dW0gIC03ICAgICAgLTcgICAgIC0+IDEKK2Rkc2FtcTA1MTUgc2FtZXF1YW50dW0gIC03ICAgICAgLTdFLTMgIC0+IDAKK2Rkc2FtcTA1MTYgc2FtZXF1YW50dW0gIC03ICAgICAgLTBFLTMgIC0+IDAKK2Rkc2FtcTA1MTcgc2FtZXF1YW50dW0gIC03ICAgICAgLTAgICAgIC0+IDEKK2Rkc2FtcTA1MTggc2FtZXF1YW50dW0gIC03ICAgICAgLTBFKzMgIC0+IDAKK2Rkc2FtcTA1MTkgc2FtZXF1YW50dW0gIC03ICAgICAgIDBFLTMgIC0+IDAKK2Rkc2FtcTA1MjAgc2FtZXF1YW50dW0gIC03ICAgICAgIDAgICAgIC0+IDEKK2Rkc2FtcTA1MjEgc2FtZXF1YW50dW0gIC03ICAgICAgIDBFKzMgIC0+IDAKK2Rkc2FtcTA1MjIgc2FtZXF1YW50dW0gIC03ICAgICAgIDdFLTMgIC0+IDAKK2Rkc2FtcTA1MjMgc2FtZXF1YW50dW0gIC03ICAgICAgIDcgICAgIC0+IDEKK2Rkc2FtcTA1MjQgc2FtZXF1YW50dW0gIC03ICAgICAgIDdFKzMgIC0+IDAKK2Rkc2FtcTA1MjUgc2FtZXF1YW50dW0gIC03ICAgICAgIHNOYU4gIC0+IDAKKworZGRzYW1xMDYxMCBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLUluZiAgIC0+IDAKK2Rkc2FtcTA2MTEgc2FtZXF1YW50dW0gIC03RS0zICAgICBJbmYgICAtPiAwCitkZHNhbXEwNjEyIHNhbWVxdWFudHVtICAtN0UtMyAgICAgTmFOICAgLT4gMAorZGRzYW1xMDYxMyBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLTdFKzMgIC0+IDAKK2Rkc2FtcTA2MTQgc2FtZXF1YW50dW0gIC03RS0zICAgIC03ICAgICAtPiAwCitkZHNhbXEwNjE1IHNhbWVxdWFudHVtICAtN0UtMyAgICAtN0UtMyAgLT4gMQorZGRzYW1xMDYxNiBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLTBFLTMgIC0+IDEKK2Rkc2FtcTA2MTcgc2FtZXF1YW50dW0gIC03RS0zICAgIC0wICAgICAtPiAwCitkZHNhbXEwNjE4IHNhbWVxdWFudHVtICAtN0UtMyAgICAtMEUrMyAgLT4gMAorZGRzYW1xMDYxOSBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIDBFLTMgIC0+IDEKK2Rkc2FtcTA2MjAgc2FtZXF1YW50dW0gIC03RS0zICAgICAwICAgICAtPiAwCitkZHNhbXEwNjIxIHNhbWVxdWFudHVtICAtN0UtMyAgICAgMEUrMyAgLT4gMAorZGRzYW1xMDYyMiBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIDdFLTMgIC0+IDEKK2Rkc2FtcTA2MjMgc2FtZXF1YW50dW0gIC03RS0zICAgICA3ICAgICAtPiAwCitkZHNhbXEwNjI0IHNhbWVxdWFudHVtICAtN0UtMyAgICAgN0UrMyAgLT4gMAorZGRzYW1xMDYyNSBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIHNOYU4gIC0+IDAKKworZGRzYW1xMDcxMCBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLUluZiAgIC0+IDAKK2Rkc2FtcTA3MTEgc2FtZXF1YW50dW0gIC0wRS0zICAgICBJbmYgICAtPiAwCitkZHNhbXEwNzEyIHNhbWVxdWFudHVtICAtMEUtMyAgICAgTmFOICAgLT4gMAorZGRzYW1xMDcxMyBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLTdFKzMgIC0+IDAKK2Rkc2FtcTA3MTQgc2FtZXF1YW50dW0gIC0wRS0zICAgIC03ICAgICAtPiAwCitkZHNhbXEwNzE1IHNhbWVxdWFudHVtICAtMEUtMyAgICAtN0UtMyAgLT4gMQorZGRzYW1xMDcxNiBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLTBFLTMgIC0+IDEKK2Rkc2FtcTA3MTcgc2FtZXF1YW50dW0gIC0wRS0zICAgIC0wICAgICAtPiAwCitkZHNhbXEwNzE4IHNhbWVxdWFudHVtICAtMEUtMyAgICAtMEUrMyAgLT4gMAorZGRzYW1xMDcxOSBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIDBFLTMgIC0+IDEKK2Rkc2FtcTA3MjAgc2FtZXF1YW50dW0gIC0wRS0zICAgICAwICAgICAtPiAwCitkZHNhbXEwNzIxIHNhbWVxdWFudHVtICAtMEUtMyAgICAgMEUrMyAgLT4gMAorZGRzYW1xMDcyMiBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIDdFLTMgIC0+IDEKK2Rkc2FtcTA3MjMgc2FtZXF1YW50dW0gIC0wRS0zICAgICA3ICAgICAtPiAwCitkZHNhbXEwNzI0IHNhbWVxdWFudHVtICAtMEUtMyAgICAgN0UrMyAgLT4gMAorZGRzYW1xMDcyNSBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIHNOYU4gIC0+IDAKKworZGRzYW1xMDgxMCBzYW1lcXVhbnR1bSAgLTAgICAgICAtSW5mICAgLT4gMAorZGRzYW1xMDgxMSBzYW1lcXVhbnR1bSAgLTAgICAgICAgSW5mICAgLT4gMAorZGRzYW1xMDgxMiBzYW1lcXVhbnR1bSAgLTAgICAgICAgTmFOICAgLT4gMAorZGRzYW1xMDgxMyBzYW1lcXVhbnR1bSAgLTAgICAgICAtN0UrMyAgLT4gMAorZGRzYW1xMDgxNCBzYW1lcXVhbnR1bSAgLTAgICAgICAtNyAgICAgLT4gMQorZGRzYW1xMDgxNSBzYW1lcXVhbnR1bSAgLTAgICAgICAtN0UtMyAgLT4gMAorZGRzYW1xMDgxNiBzYW1lcXVhbnR1bSAgLTAgICAgICAtMEUtMyAgLT4gMAorZGRzYW1xMDgxNyBzYW1lcXVhbnR1bSAgLTAgICAgICAtMCAgICAgLT4gMQorZGRzYW1xMDgxOCBzYW1lcXVhbnR1bSAgLTAgICAgICAtMEUrMyAgLT4gMAorZGRzYW1xMDgxOSBzYW1lcXVhbnR1bSAgLTAgICAgICAgMEUtMyAgLT4gMAorZGRzYW1xMDgyMCBzYW1lcXVhbnR1bSAgLTAgICAgICAgMCAgICAgLT4gMQorZGRzYW1xMDgyMSBzYW1lcXVhbnR1bSAgLTAgICAgICAgMEUrMyAgLT4gMAorZGRzYW1xMDgyMiBzYW1lcXVhbnR1bSAgLTAgICAgICAgN0UtMyAgLT4gMAorZGRzYW1xMDgyMyBzYW1lcXVhbnR1bSAgLTAgICAgICAgNyAgICAgLT4gMQorZGRzYW1xMDgyNCBzYW1lcXVhbnR1bSAgLTAgICAgICAgN0UrMyAgLT4gMAorZGRzYW1xMDgyNSBzYW1lcXVhbnR1bSAgLTAgICAgICAgc05hTiAgLT4gMAorCitkZHNhbXEwOTEwIHNhbWVxdWFudHVtICAtMEUrMyAgICAtSW5mICAgLT4gMAorZGRzYW1xMDkxMSBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIEluZiAgIC0+IDAKK2Rkc2FtcTA5MTIgc2FtZXF1YW50dW0gIC0wRSszICAgICBOYU4gICAtPiAwCitkZHNhbXEwOTEzIHNhbWVxdWFudHVtICAtMEUrMyAgICAtN0UrMyAgLT4gMQorZGRzYW1xMDkxNCBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLTcgICAgIC0+IDAKK2Rkc2FtcTA5MTUgc2FtZXF1YW50dW0gIC0wRSszICAgIC03RS0zICAtPiAwCitkZHNhbXEwOTE2IHNhbWVxdWFudHVtICAtMEUrMyAgICAtMEUtMyAgLT4gMAorZGRzYW1xMDkxNyBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLTAgICAgIC0+IDAKK2Rkc2FtcTA5MTggc2FtZXF1YW50dW0gIC0wRSszICAgIC0wRSszICAtPiAxCitkZHNhbXEwOTE5IHNhbWVxdWFudHVtICAtMEUrMyAgICAgMEUtMyAgLT4gMAorZGRzYW1xMDkyMCBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIDAgICAgIC0+IDAKK2Rkc2FtcTA5MjEgc2FtZXF1YW50dW0gIC0wRSszICAgICAwRSszICAtPiAxCitkZHNhbXEwOTIyIHNhbWVxdWFudHVtICAtMEUrMyAgICAgN0UtMyAgLT4gMAorZGRzYW1xMDkyMyBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIDcgICAgIC0+IDAKK2Rkc2FtcTA5MjQgc2FtZXF1YW50dW0gIC0wRSszICAgICA3RSszICAtPiAxCitkZHNhbXEwOTI1IHNhbWVxdWFudHVtICAtMEUrMyAgICAgc05hTiAgLT4gMAorCitkZHNhbXExMTEwIHNhbWVxdWFudHVtICAwRS0zICAgIC1JbmYgICAtPiAwCitkZHNhbXExMTExIHNhbWVxdWFudHVtICAwRS0zICAgICBJbmYgICAtPiAwCitkZHNhbXExMTEyIHNhbWVxdWFudHVtICAwRS0zICAgICBOYU4gICAtPiAwCitkZHNhbXExMTEzIHNhbWVxdWFudHVtICAwRS0zICAgIC03RSszICAtPiAwCitkZHNhbXExMTE0IHNhbWVxdWFudHVtICAwRS0zICAgIC03ICAgICAtPiAwCitkZHNhbXExMTE1IHNhbWVxdWFudHVtICAwRS0zICAgIC03RS0zICAtPiAxCitkZHNhbXExMTE2IHNhbWVxdWFudHVtICAwRS0zICAgIC0wRS0zICAtPiAxCitkZHNhbXExMTE3IHNhbWVxdWFudHVtICAwRS0zICAgIC0wICAgICAtPiAwCitkZHNhbXExMTE4IHNhbWVxdWFudHVtICAwRS0zICAgIC0wRSszICAtPiAwCitkZHNhbXExMTE5IHNhbWVxdWFudHVtICAwRS0zICAgICAwRS0zICAtPiAxCitkZHNhbXExMTIwIHNhbWVxdWFudHVtICAwRS0zICAgICAwICAgICAtPiAwCitkZHNhbXExMTIxIHNhbWVxdWFudHVtICAwRS0zICAgICAwRSszICAtPiAwCitkZHNhbXExMTIyIHNhbWVxdWFudHVtICAwRS0zICAgICA3RS0zICAtPiAxCitkZHNhbXExMTIzIHNhbWVxdWFudHVtICAwRS0zICAgICA3ICAgICAtPiAwCitkZHNhbXExMTI0IHNhbWVxdWFudHVtICAwRS0zICAgICA3RSszICAtPiAwCitkZHNhbXExMTI1IHNhbWVxdWFudHVtICAwRS0zICAgICBzTmFOICAtPiAwCisKK2Rkc2FtcTEyMTAgc2FtZXF1YW50dW0gIDAgICAgICAgLUluZiAgIC0+IDAKK2Rkc2FtcTEyMTEgc2FtZXF1YW50dW0gIDAgICAgICAgIEluZiAgIC0+IDAKK2Rkc2FtcTEyMTIgc2FtZXF1YW50dW0gIDAgICAgICAgIE5hTiAgIC0+IDAKK2Rkc2FtcTEyMTMgc2FtZXF1YW50dW0gIDAgICAgICAgLTdFKzMgIC0+IDAKK2Rkc2FtcTEyMTQgc2FtZXF1YW50dW0gIDAgICAgICAgLTcgICAgIC0+IDEKK2Rkc2FtcTEyMTUgc2FtZXF1YW50dW0gIDAgICAgICAgLTdFLTMgIC0+IDAKK2Rkc2FtcTEyMTYgc2FtZXF1YW50dW0gIDAgICAgICAgLTBFLTMgIC0+IDAKK2Rkc2FtcTEyMTcgc2FtZXF1YW50dW0gIDAgICAgICAgLTAgICAgIC0+IDEKK2Rkc2FtcTEyMTggc2FtZXF1YW50dW0gIDAgICAgICAgLTBFKzMgIC0+IDAKK2Rkc2FtcTEyMTkgc2FtZXF1YW50dW0gIDAgICAgICAgIDBFLTMgIC0+IDAKK2Rkc2FtcTEyMjAgc2FtZXF1YW50dW0gIDAgICAgICAgIDAgICAgIC0+IDEKK2Rkc2FtcTEyMjEgc2FtZXF1YW50dW0gIDAgICAgICAgIDBFKzMgIC0+IDAKK2Rkc2FtcTEyMjIgc2FtZXF1YW50dW0gIDAgICAgICAgIDdFLTMgIC0+IDAKK2Rkc2FtcTEyMjMgc2FtZXF1YW50dW0gIDAgICAgICAgIDcgICAgIC0+IDEKK2Rkc2FtcTEyMjQgc2FtZXF1YW50dW0gIDAgICAgICAgIDdFKzMgIC0+IDAKK2Rkc2FtcTEyMjUgc2FtZXF1YW50dW0gIDAgICAgICAgIHNOYU4gIC0+IDAKKworZGRzYW1xMTMxMCBzYW1lcXVhbnR1bSAgMEUrMyAgICAtSW5mICAgLT4gMAorZGRzYW1xMTMxMSBzYW1lcXVhbnR1bSAgMEUrMyAgICAgSW5mICAgLT4gMAorZGRzYW1xMTMxMiBzYW1lcXVhbnR1bSAgMEUrMyAgICAgTmFOICAgLT4gMAorZGRzYW1xMTMxMyBzYW1lcXVhbnR1bSAgMEUrMyAgICAtN0UrMyAgLT4gMQorZGRzYW1xMTMxNCBzYW1lcXVhbnR1bSAgMEUrMyAgICAtNyAgICAgLT4gMAorZGRzYW1xMTMxNSBzYW1lcXVhbnR1bSAgMEUrMyAgICAtN0UtMyAgLT4gMAorZGRzYW1xMTMxNiBzYW1lcXVhbnR1bSAgMEUrMyAgICAtMEUtMyAgLT4gMAorZGRzYW1xMTMxNyBzYW1lcXVhbnR1bSAgMEUrMyAgICAtMCAgICAgLT4gMAorZGRzYW1xMTMxOCBzYW1lcXVhbnR1bSAgMEUrMyAgICAtMEUrMyAgLT4gMQorZGRzYW1xMTMxOSBzYW1lcXVhbnR1bSAgMEUrMyAgICAgMEUtMyAgLT4gMAorZGRzYW1xMTMyMCBzYW1lcXVhbnR1bSAgMEUrMyAgICAgMCAgICAgLT4gMAorZGRzYW1xMTMyMSBzYW1lcXVhbnR1bSAgMEUrMyAgICAgMEUrMyAgLT4gMQorZGRzYW1xMTMyMiBzYW1lcXVhbnR1bSAgMEUrMyAgICAgN0UtMyAgLT4gMAorZGRzYW1xMTMyMyBzYW1lcXVhbnR1bSAgMEUrMyAgICAgNyAgICAgLT4gMAorZGRzYW1xMTMyNCBzYW1lcXVhbnR1bSAgMEUrMyAgICAgN0UrMyAgLT4gMQorZGRzYW1xMTMyNSBzYW1lcXVhbnR1bSAgMEUrMyAgICAgc05hTiAgLT4gMAorCitkZHNhbXExNDEwIHNhbWVxdWFudHVtICA3RS0zICAgIC1JbmYgICAtPiAwCitkZHNhbXExNDExIHNhbWVxdWFudHVtICA3RS0zICAgICBJbmYgICAtPiAwCitkZHNhbXExNDEyIHNhbWVxdWFudHVtICA3RS0zICAgICBOYU4gICAtPiAwCitkZHNhbXExNDEzIHNhbWVxdWFudHVtICA3RS0zICAgIC03RSszICAtPiAwCitkZHNhbXExNDE0IHNhbWVxdWFudHVtICA3RS0zICAgIC03ICAgICAtPiAwCitkZHNhbXExNDE1IHNhbWVxdWFudHVtICA3RS0zICAgIC03RS0zICAtPiAxCitkZHNhbXExNDE2IHNhbWVxdWFudHVtICA3RS0zICAgIC0wRS0zICAtPiAxCitkZHNhbXExNDE3IHNhbWVxdWFudHVtICA3RS0zICAgIC0wICAgICAtPiAwCitkZHNhbXExNDE4IHNhbWVxdWFudHVtICA3RS0zICAgIC0wRSszICAtPiAwCitkZHNhbXExNDE5IHNhbWVxdWFudHVtICA3RS0zICAgICAwRS0zICAtPiAxCitkZHNhbXExNDIwIHNhbWVxdWFudHVtICA3RS0zICAgICAwICAgICAtPiAwCitkZHNhbXExNDIxIHNhbWVxdWFudHVtICA3RS0zICAgICAwRSszICAtPiAwCitkZHNhbXExNDIyIHNhbWVxdWFudHVtICA3RS0zICAgICA3RS0zICAtPiAxCitkZHNhbXExNDIzIHNhbWVxdWFudHVtICA3RS0zICAgICA3ICAgICAtPiAwCitkZHNhbXExNDI0IHNhbWVxdWFudHVtICA3RS0zICAgICA3RSszICAtPiAwCitkZHNhbXExNDI1IHNhbWVxdWFudHVtICA3RS0zICAgICBzTmFOICAtPiAwCisKK2Rkc2FtcTE1MTAgc2FtZXF1YW50dW0gIDcgICAgICAtSW5mICAgLT4gMAorZGRzYW1xMTUxMSBzYW1lcXVhbnR1bSAgNyAgICAgICBJbmYgICAtPiAwCitkZHNhbXExNTEyIHNhbWVxdWFudHVtICA3ICAgICAgIE5hTiAgIC0+IDAKK2Rkc2FtcTE1MTMgc2FtZXF1YW50dW0gIDcgICAgICAtN0UrMyAgLT4gMAorZGRzYW1xMTUxNCBzYW1lcXVhbnR1bSAgNyAgICAgIC03ICAgICAtPiAxCitkZHNhbXExNTE1IHNhbWVxdWFudHVtICA3ICAgICAgLTdFLTMgIC0+IDAKK2Rkc2FtcTE1MTYgc2FtZXF1YW50dW0gIDcgICAgICAtMEUtMyAgLT4gMAorZGRzYW1xMTUxNyBzYW1lcXVhbnR1bSAgNyAgICAgIC0wICAgICAtPiAxCitkZHNhbXExNTE4IHNhbWVxdWFudHVtICA3ICAgICAgLTBFKzMgIC0+IDAKK2Rkc2FtcTE1MTkgc2FtZXF1YW50dW0gIDcgICAgICAgMEUtMyAgLT4gMAorZGRzYW1xMTUyMCBzYW1lcXVhbnR1bSAgNyAgICAgICAwICAgICAtPiAxCitkZHNhbXExNTIxIHNhbWVxdWFudHVtICA3ICAgICAgIDBFKzMgIC0+IDAKK2Rkc2FtcTE1MjIgc2FtZXF1YW50dW0gIDcgICAgICAgN0UtMyAgLT4gMAorZGRzYW1xMTUyMyBzYW1lcXVhbnR1bSAgNyAgICAgICA3ICAgICAtPiAxCitkZHNhbXExNTI0IHNhbWVxdWFudHVtICA3ICAgICAgIDdFKzMgIC0+IDAKK2Rkc2FtcTE1MjUgc2FtZXF1YW50dW0gIDcgICAgICAgc05hTiAgLT4gMAorCitkZHNhbXExNjEwIHNhbWVxdWFudHVtICA3RSszICAgIC1JbmYgICAtPiAwCitkZHNhbXExNjExIHNhbWVxdWFudHVtICA3RSszICAgICBJbmYgICAtPiAwCitkZHNhbXExNjEyIHNhbWVxdWFudHVtICA3RSszICAgICBOYU4gICAtPiAwCitkZHNhbXExNjEzIHNhbWVxdWFudHVtICA3RSszICAgIC03RSszICAtPiAxCitkZHNhbXExNjE0IHNhbWVxdWFudHVtICA3RSszICAgIC03ICAgICAtPiAwCitkZHNhbXExNjE1IHNhbWVxdWFudHVtICA3RSszICAgIC03RS0zICAtPiAwCitkZHNhbXExNjE2IHNhbWVxdWFudHVtICA3RSszICAgIC0wRS0zICAtPiAwCitkZHNhbXExNjE3IHNhbWVxdWFudHVtICA3RSszICAgIC0wICAgICAtPiAwCitkZHNhbXExNjE4IHNhbWVxdWFudHVtICA3RSszICAgIC0wRSszICAtPiAxCitkZHNhbXExNjE5IHNhbWVxdWFudHVtICA3RSszICAgICAwRS0zICAtPiAwCitkZHNhbXExNjIwIHNhbWVxdWFudHVtICA3RSszICAgICAwICAgICAtPiAwCitkZHNhbXExNjIxIHNhbWVxdWFudHVtICA3RSszICAgICAwRSszICAtPiAxCitkZHNhbXExNjIyIHNhbWVxdWFudHVtICA3RSszICAgICA3RS0zICAtPiAwCitkZHNhbXExNjIzIHNhbWVxdWFudHVtICA3RSszICAgICA3ICAgICAtPiAwCitkZHNhbXExNjI0IHNhbWVxdWFudHVtICA3RSszICAgICA3RSszICAtPiAxCitkZHNhbXExNjI1IHNhbWVxdWFudHVtICA3RSszICAgICBzTmFOICAtPiAwCisKK2Rkc2FtcTE3MTAgc2FtZXF1YW50dW0gIHNOYU4gICAgLUluZiAgIC0+IDAKK2Rkc2FtcTE3MTEgc2FtZXF1YW50dW0gIHNOYU4gICAgIEluZiAgIC0+IDAKK2Rkc2FtcTE3MTIgc2FtZXF1YW50dW0gIHNOYU4gICAgIE5hTiAgIC0+IDEKK2Rkc2FtcTE3MTMgc2FtZXF1YW50dW0gIHNOYU4gICAgLTdFKzMgIC0+IDAKK2Rkc2FtcTE3MTQgc2FtZXF1YW50dW0gIHNOYU4gICAgLTcgICAgIC0+IDAKK2Rkc2FtcTE3MTUgc2FtZXF1YW50dW0gIHNOYU4gICAgLTdFLTMgIC0+IDAKK2Rkc2FtcTE3MTYgc2FtZXF1YW50dW0gIHNOYU4gICAgLTBFLTMgIC0+IDAKK2Rkc2FtcTE3MTcgc2FtZXF1YW50dW0gIHNOYU4gICAgLTAgICAgIC0+IDAKK2Rkc2FtcTE3MTggc2FtZXF1YW50dW0gIHNOYU4gICAgLTBFKzMgIC0+IDAKK2Rkc2FtcTE3MTkgc2FtZXF1YW50dW0gIHNOYU4gICAgIDBFLTMgIC0+IDAKK2Rkc2FtcTE3MjAgc2FtZXF1YW50dW0gIHNOYU4gICAgIDAgICAgIC0+IDAKK2Rkc2FtcTE3MjEgc2FtZXF1YW50dW0gIHNOYU4gICAgIDBFKzMgIC0+IDAKK2Rkc2FtcTE3MjIgc2FtZXF1YW50dW0gIHNOYU4gICAgIDdFLTMgIC0+IDAKK2Rkc2FtcTE3MjMgc2FtZXF1YW50dW0gIHNOYU4gICAgIDcgICAgIC0+IDAKK2Rkc2FtcTE3MjQgc2FtZXF1YW50dW0gIHNOYU4gICAgIDdFKzMgIC0+IDAKK2Rkc2FtcTE3MjUgc2FtZXF1YW50dW0gIHNOYU4gICAgIHNOYU4gIC0+IDEKKy0tIG5vaXN5IE5hTnMKK2Rkc2FtcTE3MzAgc2FtZXF1YW50dW0gIHNOYU4zICAgIHNOYU4zIC0+IDEKK2Rkc2FtcTE3MzEgc2FtZXF1YW50dW0gIHNOYU4zICAgIHNOYU40IC0+IDEKK2Rkc2FtcTE3MzIgc2FtZXF1YW50dW0gICBOYU4zICAgICBOYU4zIC0+IDEKK2Rkc2FtcTE3MzMgc2FtZXF1YW50dW0gICBOYU4zICAgICBOYU40IC0+IDEKK2Rkc2FtcTE3MzQgc2FtZXF1YW50dW0gIHNOYU4zICAgICAzICAgIC0+IDAKK2Rkc2FtcTE3MzUgc2FtZXF1YW50dW0gICBOYU4zICAgICAzICAgIC0+IDAKK2Rkc2FtcTE3MzYgc2FtZXF1YW50dW0gICAgICA0ICAgIHNOYU40IC0+IDAKK2Rkc2FtcTE3Mzcgc2FtZXF1YW50dW0gICAgICAzICAgICBOYU4zIC0+IDAKK2Rkc2FtcTE3Mzggc2FtZXF1YW50dW0gICAgSW5mICAgIHNOYU40IC0+IDAKK2Rkc2FtcTE3Mzkgc2FtZXF1YW50dW0gICAtSW5mICAgICBOYU4zIC0+IDAKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFNjYWxlQi5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFNjYWxlQi5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZWUxMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkU2NhbGVCLmRlY1Rlc3QKQEAgLTAsMCArMSwyNDMgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRTY2FsZWJCLmRlY1Rlc3QgLS0gc2NhbGUgYSBkZWNEb3VibGUgYnkgcG93ZXJzIG9mIDEwICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gTWF4IHxyaHN8IGlzIDIqKDM4NCsxNikgPSA4MDAKKworLS0gU2FuaXR5IGNoZWNrcworZGRzY2IwMDEgc2NhbGViICAgICAgIDcuNTAgICAxMCAtPiA3LjUwRSsxMAorZGRzY2IwMDIgc2NhbGViICAgICAgIDcuNTAgICAgMyAtPiA3LjUwRSszCitkZHNjYjAwMyBzY2FsZWIgICAgICAgNy41MCAgICAyIC0+IDc1MAorZGRzY2IwMDQgc2NhbGViICAgICAgIDcuNTAgICAgMSAtPiA3NS4wCitkZHNjYjAwNSBzY2FsZWIgICAgICAgNy41MCAgICAwIC0+IDcuNTAKK2Rkc2NiMDA2IHNjYWxlYiAgICAgICA3LjUwICAgLTEgLT4gMC43NTAKK2Rkc2NiMDA3IHNjYWxlYiAgICAgICA3LjUwICAgLTIgLT4gMC4wNzUwCitkZHNjYjAwOCBzY2FsZWIgICAgICAgNy41MCAgLTEwIC0+IDcuNTBFLTEwCitkZHNjYjAwOSBzY2FsZWIgICAgICAtNy41MCAgICAzIC0+IC03LjUwRSszCitkZHNjYjAxMCBzY2FsZWIgICAgICAtNy41MCAgICAyIC0+IC03NTAKK2Rkc2NiMDExIHNjYWxlYiAgICAgIC03LjUwICAgIDEgLT4gLTc1LjAKK2Rkc2NiMDEyIHNjYWxlYiAgICAgIC03LjUwICAgIDAgLT4gLTcuNTAKK2Rkc2NiMDEzIHNjYWxlYiAgICAgIC03LjUwICAgLTEgLT4gLTAuNzUwCisKKy0tIEluZmluaXRpZXMKK2Rkc2NiMDE0IHNjYWxlYiAgSW5maW5pdHkgICAxIC0+IEluZmluaXR5CitkZHNjYjAxNSBzY2FsZWIgIC1JbmZpbml0eSAgMiAtPiAtSW5maW5pdHkKK2Rkc2NiMDE2IHNjYWxlYiAgSW5maW5pdHkgIC0xIC0+IEluZmluaXR5CitkZHNjYjAxNyBzY2FsZWIgIC1JbmZpbml0eSAtMiAtPiAtSW5maW5pdHkKKworLS0gTmV4dCB0d28gYXJlIHNvbWV3aGF0IHVuZGVmaW5lZCBpbiA3NTRyOyB0cmVhdCBhcyBub24taW50ZWdlcgorZGRzY2IwMTggc2NhbGViICAxMCAgSW5maW5pdHkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjAxOSBzY2FsZWIgIDEwIC1JbmZpbml0eSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gTmFOcyBhcmUgdW5kZWZpbmVkIGluIDc1NHI7IGFzc3VtZSB1c3VhbCBwcm9jZXNzaW5nCistLSBOYU5zLCAwIHBheWxvYWQKK2Rkc2NiMDIxIHNjYWxlYiAgICAgICAgIE5hTiAgMSAtPiBOYU4KK2Rkc2NiMDIyIHNjYWxlYiAgICAgICAgLU5hTiAtMSAtPiAtTmFOCitkZHNjYjAyMyBzY2FsZWIgICAgICAgIHNOYU4gIDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjAyNCBzY2FsZWIgICAgICAgLXNOYU4gIDEgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2IwMjUgc2NhbGViICAgIDQgICAgTmFOICAgIC0+IE5hTgorZGRzY2IwMjYgc2NhbGViIC1JbmYgICAtTmFOICAgIC0+IC1OYU4KK2Rkc2NiMDI3IHNjYWxlYiAgICA0ICAgc05hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDI4IHNjYWxlYiAgSW5mICAtc05hTiAgICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG5vbi1pbnRlZ2VyIFJIUworZGRzY2IwMzAgc2NhbGViICAxLjIzICAgIDEgICAgLT4gIDEyLjMKK2Rkc2NiMDMxIHNjYWxlYiAgMS4yMyAgICAxLjAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDMyIHNjYWxlYiAgMS4yMyAgICAxLjEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDMzIHNjYWxlYiAgMS4yMyAgICAxLjAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDM0IHNjYWxlYiAgMS4yMyAgICAwLjAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDM1IHNjYWxlYiAgMS4yMyAgICAwLjExIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDM2IHNjYWxlYiAgMS4yMyAgICAwLjk5OTk5OTk5OSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjAzNyBzY2FsZWIgIDEuMjMgICAtMSAgICAtPiAgMC4xMjMKK2Rkc2NiMDM4IHNjYWxlYiAgMS4yMyAgIC0xLjAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDM5IHNjYWxlYiAgMS4yMyAgIC0xLjEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDQwIHNjYWxlYiAgMS4yMyAgIC0xLjAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDQxIHNjYWxlYiAgMS4yMyAgIC0wLjAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDQyIHNjYWxlYiAgMS4yMyAgIC0wLjExIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDQzIHNjYWxlYiAgMS4yMyAgIC0wLjk5OTk5OTk5OSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjA0NCBzY2FsZWIgIDEuMjMgICAgMC4xICAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2IwNDUgc2NhbGViICAxLjIzICAgIDFFKzEgICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDQ2IHNjYWxlYiAgMS4yMyAgICAxLjEyMzRFKzYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjA0NyBzY2FsZWIgIDEuMjMgICAgMS4xMjNFKzQgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvdXQtb2YgcmFuZ2UgUkhTCitkZHNjYjEyMCBzY2FsZWIgIDEuMjMgICAgNzk5ICAgICAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRzY2IxMjEgc2NhbGViICAxLjIzICAgIDgwMCAgICAgICAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rkc2NiMTIyIHNjYWxlYiAgMS4yMyAgICA4MDEgICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjEyMyBzY2FsZWIgIDEuMjMgICAgODAyICAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2IxMjQgc2NhbGViICAxLjIzICAgLTc5OSAgICAgICAgIC0+ICAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRzY2IxMjUgc2NhbGViICAxLjIzICAgLTgwMCAgICAgICAgIC0+ICAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRzY2IxMjYgc2NhbGViICAxLjIzICAgLTgwMSAgICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMTI3IHNjYWxlYiAgMS4yMyAgIC04MDIgICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2Rkc2NiODYxIHNjYWxlYiAgTmFOMDEgICAtSW5mICAgICAtPiAgTmFOMQorZGRzY2I4NjIgc2NhbGViIC1OYU4wMiAgIC0xMDAwICAgIC0+IC1OYU4yCitkZHNjYjg2MyBzY2FsZWIgIE5hTjAzICAgIDEwMDAgICAgLT4gIE5hTjMKK2Rkc2NiODY0IHNjYWxlYiAgTmFOMDQgICAgSW5mICAgICAtPiAgTmFONAorZGRzY2I4NjUgc2NhbGViICBOYU4wNSAgICBOYU42MSAgIC0+ICBOYU41CitkZHNjYjg2NiBzY2FsZWIgLUluZiAgICAgLU5hTjcxICAgLT4gLU5hTjcxCitkZHNjYjg2NyBzY2FsZWIgLTEwMDAgICAgIE5hTjgxICAgLT4gIE5hTjgxCitkZHNjYjg2OCBzY2FsZWIgIDEwMDAgICAgIE5hTjkxICAgLT4gIE5hTjkxCitkZHNjYjg2OSBzY2FsZWIgIEluZiAgICAgIE5hTjEwMSAgLT4gIE5hTjEwMQorZGRzY2I4NzEgc2NhbGViICBzTmFOMDExICAtSW5mICAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiODcyIHNjYWxlYiAgc05hTjAxMiAgLTEwMDAgICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjg3MyBzY2FsZWIgLXNOYU4wMTMgICAxMDAwICAgLT4gLU5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2I4NzQgc2NhbGViICBzTmFOMDE0ICAgTmFOMTcxIC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiODc1IHNjYWxlYiAgc05hTjAxNSAgc05hTjE4MSAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjg3NiBzY2FsZWIgIE5hTjAxNiAgIHNOYU4xOTEgLT4gIE5hTjE5MSBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2I4Nzcgc2NhbGViIC1JbmYgICAgICBzTmFOMjAxIC0+ICBOYU4yMDEgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiODc4IHNjYWxlYiAtMTAwMCAgICAgc05hTjIxMSAtPiAgTmFOMjExIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjg3OSBzY2FsZWIgIDEwMDAgICAgLXNOYU4yMjEgLT4gLU5hTjIyMSBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2I4ODAgc2NhbGViICBJbmYgICAgICBzTmFOMjMxIC0+ICBOYU4yMzEgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiODgxIHNjYWxlYiAgTmFOMDI1ICAgc05hTjI0MSAtPiAgTmFOMjQxIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGZpbml0ZXMKK2Rkc2NiMDUxIHNjYWxlYiAgICAgICAgICA3ICAgLTIgIC0+IDAuMDcKK2Rkc2NiMDUyIHNjYWxlYiAgICAgICAgIC03ICAgLTIgIC0+IC0wLjA3CitkZHNjYjA1MyBzY2FsZWIgICAgICAgICA3NSAgIC0yICAtPiAwLjc1CitkZHNjYjA1NCBzY2FsZWIgICAgICAgIC03NSAgIC0yICAtPiAtMC43NQorZGRzY2IwNTUgc2NhbGViICAgICAgIDcuNTAgICAtMiAgLT4gMC4wNzUwCitkZHNjYjA1NiBzY2FsZWIgICAgICAtNy41MCAgIC0yICAtPiAtMC4wNzUwCitkZHNjYjA1NyBzY2FsZWIgICAgICAgNy41MDAgIC0yICAtPiAwLjA3NTAwCitkZHNjYjA1OCBzY2FsZWIgICAgICAtNy41MDAgIC0yICAtPiAtMC4wNzUwMAorZGRzY2IwNjEgc2NhbGViICAgICAgICAgIDcgICAtMSAgLT4gMC43CitkZHNjYjA2MiBzY2FsZWIgICAgICAgICAtNyAgIC0xICAtPiAtMC43CitkZHNjYjA2MyBzY2FsZWIgICAgICAgICA3NSAgIC0xICAtPiA3LjUKK2Rkc2NiMDY0IHNjYWxlYiAgICAgICAgLTc1ICAgLTEgIC0+IC03LjUKK2Rkc2NiMDY1IHNjYWxlYiAgICAgICA3LjUwICAgLTEgIC0+IDAuNzUwCitkZHNjYjA2NiBzY2FsZWIgICAgICAtNy41MCAgIC0xICAtPiAtMC43NTAKK2Rkc2NiMDY3IHNjYWxlYiAgICAgICA3LjUwMCAgLTEgIC0+IDAuNzUwMAorZGRzY2IwNjggc2NhbGViICAgICAgLTcuNTAwICAtMSAgLT4gLTAuNzUwMAorZGRzY2IwNzEgc2NhbGViICAgICAgICAgIDcgICAgMCAgLT4gNworZGRzY2IwNzIgc2NhbGViICAgICAgICAgLTcgICAgMCAgLT4gLTcKK2Rkc2NiMDczIHNjYWxlYiAgICAgICAgIDc1ICAgIDAgIC0+IDc1CitkZHNjYjA3NCBzY2FsZWIgICAgICAgIC03NSAgICAwICAtPiAtNzUKK2Rkc2NiMDc1IHNjYWxlYiAgICAgICA3LjUwICAgIDAgIC0+IDcuNTAKK2Rkc2NiMDc2IHNjYWxlYiAgICAgIC03LjUwICAgIDAgIC0+IC03LjUwCitkZHNjYjA3NyBzY2FsZWIgICAgICAgNy41MDAgICAwICAtPiA3LjUwMAorZGRzY2IwNzggc2NhbGViICAgICAgLTcuNTAwICAgMCAgLT4gLTcuNTAwCitkZHNjYjA4MSBzY2FsZWIgICAgICAgICAgNyAgICAxICAtPiA3RSsxCitkZHNjYjA4MiBzY2FsZWIgICAgICAgICAtNyAgICAxICAtPiAtN0UrMQorZGRzY2IwODMgc2NhbGViICAgICAgICAgNzUgICAgMSAgLT4gNy41RSsyCitkZHNjYjA4NCBzY2FsZWIgICAgICAgIC03NSAgICAxICAtPiAtNy41RSsyCitkZHNjYjA4NSBzY2FsZWIgICAgICAgNy41MCAgICAxICAtPiA3NS4wCitkZHNjYjA4NiBzY2FsZWIgICAgICAtNy41MCAgICAxICAtPiAtNzUuMAorZGRzY2IwODcgc2NhbGViICAgICAgIDcuNTAwICAgMSAgLT4gNzUuMDAKK2Rkc2NiMDg4IHNjYWxlYiAgICAgIC03LjUwMCAgIDEgIC0+IC03NS4wMAorZGRzY2IwOTEgc2NhbGViICAgICAgICAgIDcgICAgMiAgLT4gN0UrMgorZGRzY2IwOTIgc2NhbGViICAgICAgICAgLTcgICAgMiAgLT4gLTdFKzIKK2Rkc2NiMDkzIHNjYWxlYiAgICAgICAgIDc1ICAgIDIgIC0+IDcuNUUrMworZGRzY2IwOTQgc2NhbGViICAgICAgICAtNzUgICAgMiAgLT4gLTcuNUUrMworZGRzY2IwOTUgc2NhbGViICAgICAgIDcuNTAgICAgMiAgLT4gNzUwCitkZHNjYjA5NiBzY2FsZWIgICAgICAtNy41MCAgICAyICAtPiAtNzUwCitkZHNjYjA5NyBzY2FsZWIgICAgICAgNy41MDAgICAyICAtPiA3NTAuMAorZGRzY2IwOTggc2NhbGViICAgICAgLTcuNTAwICAgMiAgLT4gLTc1MC4wCisKKy0tIHplcm9zCitkZHNjYjExMSBzY2FsZWIgICAgICAgICAgMCAgMSAtPiAwRSsxCitkZHNjYjExMiBzY2FsZWIgICAgICAgICAtMCAgMiAtPiAtMEUrMgorZGRzY2IxMTMgc2NhbGViICAgICAgIDBFKzQgIDMgLT4gMEUrNworZGRzY2IxMTQgc2NhbGViICAgICAgLTBFKzQgIDQgLT4gLTBFKzgKK2Rkc2NiMTE1IHNjYWxlYiAgICAgMC4wMDAwICA1IC0+IDBFKzEKK2Rkc2NiMTE2IHNjYWxlYiAgICAtMC4wMDAwICA2IC0+IC0wRSsyCitkZHNjYjExNyBzY2FsZWIgICAgICAwRS0xNDEgNyAtPiAwRS0xMzQKK2Rkc2NiMTE4IHNjYWxlYiAgICAgLTBFLTE0MSA4IC0+IC0wRS0xMzMKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2Rkc2NiMTMyIHNjYWxlYiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgKzM4NCAtPiBJbmZpbml0eSAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rkc2NiMTMzIHNjYWxlYiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgKzEwIC0+IEluZmluaXR5ICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rkc2NiMTM0IHNjYWxlYiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgKzEgIC0+IEluZmluaXR5ICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rkc2NiMTM1IHNjYWxlYiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIDAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2Rkc2NiMTM2IHNjYWxlYiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLTEgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODMKK2Rkc2NiMTM3IHNjYWxlYiAgMUUtMzgzICAgICAgICAgICArMSAgLT4gMUUtMzgyCitkZHNjYjEzOCBzY2FsZWIgIDFFLTM4MyAgICAgICAgICAgLTAgIC0+IDFFLTM4MworZGRzY2IxMzkgc2NhbGViICAxRS0zODMgICAgICAgICAgIC0xICAtPiAxRS0zODQgICAgICAgICAgU3Vibm9ybWFsCitkZHNjYjE0MCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICsxICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgyCitkZHNjYjE0MSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZHNjYjE0MiBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0xICAtPiAxLjAwMDAwMDAwMDAwMDAwRS0zODQgU3Vibm9ybWFsIFJvdW5kZWQKK2Rkc2NiMTQzIHNjYWxlYiAgMUUtMzk4ICAgICAgICAgICsxICAtPiAxRS0zOTcgICAgICAgICAgU3Vibm9ybWFsCitkZHNjYjE0NCBzY2FsZWIgIDFFLTM5OCAgICAgICAgICAtMCAgLT4gMUUtMzk4ICAgICAgICAgU3Vibm9ybWFsCitkZHNjYjE0NSBzY2FsZWIgIDFFLTM5OCAgICAgICAgICAtMSAgLT4gMEUtMzk4ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitkZHNjYjE1MCBzY2FsZWIgIC0xRS0zOTggICAgICAgICArMSAgLT4gLTFFLTM5NyAgICAgICAgIFN1Ym5vcm1hbAorZGRzY2IxNTEgc2NhbGViICAtMUUtMzk4ICAgICAgICAgLTAgIC0+IC0xRS0zOTggICAgICAgIFN1Ym5vcm1hbAorZGRzY2IxNTIgc2NhbGViICAtMUUtMzk4ICAgICAgICAgLTEgIC0+IC0wRS0zOTggICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Rkc2NiMTUzIHNjYWxlYiAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgKzEgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgyCitkZHNjYjE1NCBzY2FsZWIgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICswICAtPiAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRzY2IxNTUgc2NhbGViICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAtMSAgLT4gLTEuMDAwMDAwMDAwMDAwMDBFLTM4NCBTdWJub3JtYWwgUm91bmRlZAorZGRzY2IxNTYgc2NhbGViICAtMUUtMzgzICAgICAgICAgICsxICAtPiAtMUUtMzgyCitkZHNjYjE1NyBzY2FsZWIgIC0xRS0zODMgICAgICAgICAgLTAgIC0+IC0xRS0zODMKK2Rkc2NiMTU4IHNjYWxlYiAgLTFFLTM4MyAgICAgICAgICAtMSAgLT4gLTFFLTM4NCAgICAgICAgICBTdWJub3JtYWwKK2Rkc2NiMTU5IHNjYWxlYiAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgKzEgIC0+IC1JbmZpbml0eSAgICAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZHNjYjE2MCBzY2FsZWIgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICswICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRzY2IxNjEgc2NhbGViICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtMSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODMKK2Rkc2NiMTYyIHNjYWxlYiAgLTlFKzM4NCAgICAgICAgICArMSAgLT4gLUluZmluaXR5ICAgICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rkc2NiMTYzIHNjYWxlYiAgLTFFKzM4NCAgICAgICAgICArMSAgLT4gLUluZmluaXR5ICAgICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBPcmlnYW1pCistLSAodGhlc2UgY2hlY2sgdGhhdCBvdmVyZmxvdyBpcyBiZWluZyBkb25lIGNvcnJlY3RseSkKK2Rkc2NiMTcxIHNjYWxlYiAgIDEwMDBFKzM2NSAgKzEgLT4gMS4wMDBFKzM2OQorZGRzY2IxNzIgc2NhbGViICAgMTAwMEUrMzY2ICArMSAtPiAxLjAwMEUrMzcwCitkZHNjYjE3MyBzY2FsZWIgICAxMDAwRSszNjcgICsxIC0+IDEuMDAwRSszNzEKK2Rkc2NiMTc0IHNjYWxlYiAgIDEwMDBFKzM2OCAgKzEgLT4gMS4wMDBFKzM3MgorZGRzY2IxNzUgc2NhbGViICAgMTAwMEUrMzY5ICArMSAtPiAxLjAwMDBFKzM3MyAgICAgICAgICAgICAgICAgIENsYW1wZWQKK2Rkc2NiMTc2IHNjYWxlYiAgIDEwMDBFKzM3MCAgKzEgLT4gMS4wMDAwMEUrMzc0ICAgICAgICAgICAgICAgICBDbGFtcGVkCitkZHNjYjE3NyBzY2FsZWIgICAxMDAwRSszNzEgICsxIC0+IDEuMDAwMDAwRSszNzUgICAgICAgICAgICAgICAgQ2xhbXBlZAorZGRzY2IxNzggc2NhbGViICAgMTAwMEUrMzcyICArMSAtPiAxLjAwMDAwMDBFKzM3NiAgICAgICAgICAgICAgIENsYW1wZWQKK2Rkc2NiMTc5IHNjYWxlYiAgIDEwMDBFKzM3MyAgKzEgLT4gMS4wMDAwMDAwMEUrMzc3ICAgICAgICAgICAgICBDbGFtcGVkCitkZHNjYjE4MCBzY2FsZWIgICAxMDAwRSszNzQgICsxIC0+IDEuMDAwMDAwMDAwRSszNzggICAgICAgICAgICAgQ2xhbXBlZAorZGRzY2IxODEgc2NhbGViICAgMTAwMEUrMzc1ICArMSAtPiAxLjAwMDAwMDAwMDBFKzM3OSAgICAgICAgICAgIENsYW1wZWQKK2Rkc2NiMTgyIHNjYWxlYiAgIDEwMDBFKzM3NiAgKzEgLT4gMS4wMDAwMDAwMDAwMEUrMzgwICAgICAgICAgICBDbGFtcGVkCitkZHNjYjE4MyBzY2FsZWIgICAxMDAwRSszNzcgICsxIC0+IDEuMDAwMDAwMDAwMDAwRSszODEgICAgICAgICAgQ2xhbXBlZAorZGRzY2IxODQgc2NhbGViICAgMTAwMEUrMzc4ICArMSAtPiAxLjAwMDAwMDAwMDAwMDBFKzM4MiAgICAgICAgIENsYW1wZWQKK2Rkc2NiMTg1IHNjYWxlYiAgIDEwMDBFKzM3OSAgKzEgLT4gMS4wMDAwMDAwMDAwMDAwMEUrMzgzICAgICAgICBDbGFtcGVkCitkZHNjYjE4NiBzY2FsZWIgICAxMDAwRSszODAgICsxIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSszODQgICAgICAgQ2xhbXBlZAorZGRzY2IxODcgc2NhbGViICAgMTAwMEUrMzgxICArMSAtPiBJbmZpbml0eSAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0gYW5kIGEgZmV3IG1vcmUgc3Vibm9ybWFsIHRydW5jYXRpb25zCistLSAodGhlc2UgY2hlY2sgdGhhdCB1bmRlcmZsb3cgaXMgYmVpbmcgZG9uZSBjb3JyZWN0bHkpCitkZHNjYjIwMSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZHNjYjIwMiBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0xICAtPiAxLjAwMDAwMDAwMDAwMDAwRS0zODQgU3Vibm9ybWFsIFJvdW5kZWQKK2Rkc2NiMjAzIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLTIgIC0+IDEuMDAwMDAwMDAwMDAwMEUtMzg1IFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIwNCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0zICAtPiAxLjAwMDAwMDAwMDAwMEUtMzg2IFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIwNSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC00ICAtPiAxLjAwMDAwMDAwMDAwRS0zODcgU3Vibm9ybWFsIFJvdW5kZWQKK2Rkc2NiMjA2IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLTUgIC0+IDEuMDAwMDAwMDAwMEUtMzg4IFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIwNyBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC02ICAtPiAxLjAwMDAwMDAwMEUtMzg5IFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIwOCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC03ICAtPiAxLjAwMDAwMDAwRS0zOTAgU3Vibm9ybWFsIFJvdW5kZWQKK2Rkc2NiMjA5IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLTggIC0+IDEuMDAwMDAwMEUtMzkxIFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIxMCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC05ICAtPiAxLjAwMDAwMEUtMzkyIFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIxMSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0xMCAtPiAxLjAwMDAwRS0zOTMgU3Vibm9ybWFsIFJvdW5kZWQKK2Rkc2NiMjEyIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLTExIC0+IDEuMDAwMEUtMzk0IFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIxMyBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0xMiAtPiAxLjAwMEUtMzk1IFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIxNCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0xMyAtPiAxLjAwRS0zOTYgU3Vibm9ybWFsIFJvdW5kZWQKK2Rkc2NiMjE1IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLTE0IC0+IDEuMEUtMzk3IFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIxNiBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0xNSAtPiAxRS0zOTggU3Vibm9ybWFsIFJvdW5kZWQKK2Rkc2NiMjE3IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLTE2IC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZHNjYjIxOCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0xNyAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkU2hpZnQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRTaGlmdC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MmEyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkU2hpZnQuZGVjVGVzdApAQCAtMCwwICsxLDI2MiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZFNoaWZ0LmRlY1Rlc3QgLS0gc2hpZnQgZGVjRG91YmxlIGNvZWZmaWNpZW50IGxlZnQgb3IgcmlnaHQgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sKK2Rkc2hpMDAxIHNoaWZ0ICAgICAgICAgICAgICAgICAwICAgIDAgIC0+ICAwCitkZHNoaTAwMiBzaGlmdCAgICAgICAgICAgICAgICAgMCAgICAyICAtPiAgMAorZGRzaGkwMDMgc2hpZnQgICAgICAgICAgICAgICAgIDEgICAgMiAgLT4gIDEwMAorZGRzaGkwMDQgc2hpZnQgICAgICAgICAgICAgICAgIDEgICAxNSAgLT4gIDEwMDAwMDAwMDAwMDAwMDAKK2Rkc2hpMDA1IHNoaWZ0ICAgICAgICAgICAgICAgICAxICAgMTYgIC0+ICAwCitkZHNoaTAwNiBzaGlmdCAgICAgICAgICAgICAgICAgMSAgIC0xICAtPiAgMAorZGRzaGkwMDcgc2hpZnQgICAgICAgICAgICAgICAgIDAgICAtMiAgLT4gIDAKK2Rkc2hpMDA4IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgLTEgIC0+ICAxMjM0NTY3ODkwMTIzNDUKK2Rkc2hpMDA5IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgLTE1IC0+ICAxCitkZHNoaTAxMCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgIC0xNiAtPiAgMAorZGRzaGkwMTEgc2hpZnQgIDk5MzQ1Njc4OTAxMjM0NTYgICAtMTUgLT4gIDkKK2Rkc2hpMDEyIHNoaWZ0ICA5OTM0NTY3ODkwMTIzNDU2ICAgLTE2IC0+ICAwCisKKy0tIHJocyBtdXN0IGJlIGFuIGludGVnZXIKK2Rkc2hpMDE1IHNoaWZ0ICAgICAgICAxICAgIDEuNSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpMDE2IHNoaWZ0ICAgICAgICAxICAgIDEuMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpMDE3IHNoaWZ0ICAgICAgICAxICAgIDAuMSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpMDE4IHNoaWZ0ICAgICAgICAxICAgIDAuMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpMDE5IHNoaWZ0ICAgICAgICAxICAgIDFFKzEgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpMDIwIHNoaWZ0ICAgICAgICAxICAgIDFFKzk5ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpMDIxIHNoaWZ0ICAgICAgICAxICAgIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpMDIyIHNoaWZ0ICAgICAgICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGFuZCB8cmhzfCA8PSBwcmVjaXNpb24KK2Rkc2hpMDI1IHNoaWZ0ICAgICAgICAxICAgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpMDI2IHNoaWZ0ICAgICAgICAxICAgIC0xNyAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpMDI3IHNoaWZ0ICAgICAgICAxICAgICAxNyAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpMDI4IHNoaWZ0ICAgICAgICAxICAgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gZnVsbCBzaGlmdGluZyBwYXR0ZXJuCitkZHNoaTAzMCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC0xNiAgLT4gMAorZGRzaGkwMzEgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMTUgIC0+IDEKK2Rkc2hpMDMyIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTE0ICAtPiAxMgorZGRzaGkwMzMgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMTMgIC0+IDEyMworZGRzaGkwMzQgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMTIgIC0+IDEyMzQKK2Rkc2hpMDM1IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTExICAtPiAxMjM0NQorZGRzaGkwMzYgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMTAgIC0+IDEyMzQ1NgorZGRzaGkwMzcgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtOSAgIC0+IDEyMzQ1NjcKK2Rkc2hpMDM4IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTggICAtPiAxMjM0NTY3OAorZGRzaGkwMzkgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtNyAgIC0+IDEyMzQ1Njc4OQorZGRzaGkwNDAgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtNiAgIC0+IDEyMzQ1Njc4OTAKK2Rkc2hpMDQxIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTUgICAtPiAxMjM0NTY3ODkwMQorZGRzaGkwNDIgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtNCAgIC0+IDEyMzQ1Njc4OTAxMgorZGRzaGkwNDMgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMyAgIC0+IDEyMzQ1Njc4OTAxMjMKK2Rkc2hpMDQ0IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTIgICAtPiAxMjM0NTY3ODkwMTIzNAorZGRzaGkwNDUgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMSAgIC0+IDEyMzQ1Njc4OTAxMjM0NQorZGRzaGkwNDYgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYKKworZGRzaGkwNDcgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2Rkc2hpMDQ4IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzEgICAtPiAyMzQ1Njc4OTAxMjM0NTYwCitkZHNoaTA0OSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsyICAgLT4gMzQ1Njc4OTAxMjM0NTYwMAorZGRzaGkwNTAgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMyAgIC0+IDQ1Njc4OTAxMjM0NTYwMDAKK2Rkc2hpMDUxIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzQgICAtPiA1Njc4OTAxMjM0NTYwMDAwCitkZHNoaTA1MiBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICs1ICAgLT4gNjc4OTAxMjM0NTYwMDAwMAorZGRzaGkwNTMgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArNiAgIC0+IDc4OTAxMjM0NTYwMDAwMDAKK2Rkc2hpMDU0IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzcgICAtPiA4OTAxMjM0NTYwMDAwMDAwCitkZHNoaTA1NSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICs4ICAgLT4gOTAxMjM0NTYwMDAwMDAwMAorZGRzaGkwNTYgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArOSAgIC0+ICAxMjM0NTYwMDAwMDAwMDAKK2Rkc2hpMDU3IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzEwICAtPiAxMjM0NTYwMDAwMDAwMDAwCitkZHNoaTA1OCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsxMSAgLT4gMjM0NTYwMDAwMDAwMDAwMAorZGRzaGkwNTkgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMTIgIC0+IDM0NTYwMDAwMDAwMDAwMDAKK2Rkc2hpMDYwIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzEzICAtPiA0NTYwMDAwMDAwMDAwMDAwCitkZHNoaTA2MSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsxNCAgLT4gNTYwMDAwMDAwMDAwMDAwMAorZGRzaGkwNjIgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMTUgIC0+IDYwMDAwMDAwMDAwMDAwMDAKK2Rkc2hpMDYzIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzE2ICAtPiAwCisKKy0tIHplcm9zCitkZHNoaTA3MCBzaGlmdCAgMEUtMTAgICAgICAgICAgICAgICs5ICAgLT4gICAwRS0xMAorZGRzaGkwNzEgc2hpZnQgIDBFLTEwICAgICAgICAgICAgICAtOSAgIC0+ICAgMEUtMTAKK2Rkc2hpMDcyIHNoaWZ0ICAwLjAwMCAgICAgICAgICAgICAgKzkgICAtPiAgIDAuMDAwCitkZHNoaTA3MyBzaGlmdCAgMC4wMDAgICAgICAgICAgICAgIC05ICAgLT4gICAwLjAwMAorZGRzaGkwNzQgc2hpZnQgIDBFKzEwICAgICAgICAgICAgICArOSAgIC0+ICAgMEUrMTAKK2Rkc2hpMDc1IHNoaWZ0ICAwRSsxMCAgICAgICAgICAgICAgLTkgICAtPiAgIDBFKzEwCitkZHNoaTA3NiBzaGlmdCAtMEUtMTAgICAgICAgICAgICAgICs5ICAgLT4gIC0wRS0xMAorZGRzaGkwNzcgc2hpZnQgLTBFLTEwICAgICAgICAgICAgICAtOSAgIC0+ICAtMEUtMTAKK2Rkc2hpMDc4IHNoaWZ0IC0wLjAwMCAgICAgICAgICAgICAgKzkgICAtPiAgLTAuMDAwCitkZHNoaTA3OSBzaGlmdCAtMC4wMDAgICAgICAgICAgICAgIC05ICAgLT4gIC0wLjAwMAorZGRzaGkwODAgc2hpZnQgLTBFKzEwICAgICAgICAgICAgICArOSAgIC0+ICAtMEUrMTAKK2Rkc2hpMDgxIHNoaWZ0IC0wRSsxMCAgICAgICAgICAgICAgLTkgICAtPiAgLTBFKzEwCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkZHNoaTE0MSBzaGlmdCAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgLTEgIC0+IDkuOTk5OTk5OTk5OTk5OTlFKzM4MworZGRzaGkxNDIgc2hpZnQgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgIC0xNSAtPiA5RSszNjkKK2Rkc2hpMTQzIHNoaWZ0ICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAgMSAgLT4gOS45OTk5OTk5OTk5OTk5OTBFKzM4NAorZGRzaGkxNDQgc2hpZnQgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgICAxNSAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0CitkZHNoaTE0NSBzaGlmdCAgMUUtMzgzICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IDBFLTM4MworZGRzaGkxNDYgc2hpZnQgIDFFLTM4MyAgICAgICAgICAgICAgICAgICAgIC0xNSAtPiAwRS0zODMKK2Rkc2hpMTQ3IHNoaWZ0ICAxRS0zODMgICAgICAgICAgICAgICAgICAgICAgMSAgLT4gMS4wRS0zODIKK2Rkc2hpMTQ4IHNoaWZ0ICAxRS0zODMgICAgICAgICAgICAgICAgICAgICAgMTUgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM2OAorZGRzaGkxNTEgc2hpZnQgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgIC0xICAtPiAxLjAwMDAwMDAwMDAwMDAwRS0zODQKK2Rkc2hpMTUyIHNoaWZ0ICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtMTUgLT4gMUUtMzk4CitkZHNoaTE1MyBzaGlmdCAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgIDEgIC0+IDBFLTM5OAorZGRzaGkxNTQgc2hpZnQgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgICAxNSAtPiAwRS0zOTgKK2Rkc2hpMTU1IHNoaWZ0ICA5LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtMSAgLT4gOS4wMDAwMDAwMDAwMDAwMEUtMzg0CitkZHNoaTE1NiBzaGlmdCAgOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTE1IC0+IDlFLTM5OAorZGRzaGkxNTcgc2hpZnQgIDkuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgICAxICAtPiAwRS0zOTgKK2Rkc2hpMTU4IHNoaWZ0ICA5LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMTUgLT4gMEUtMzk4CitkZHNoaTE2MCBzaGlmdCAgMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IDBFLTM5OAorZGRzaGkxNjEgc2hpZnQgIDFFLTM5OCAgICAgICAgICAgICAgICAgICAgIC0xNSAtPiAwRS0zOTgKK2Rkc2hpMTYyIHNoaWZ0ICAxRS0zOTggICAgICAgICAgICAgICAgICAgICAgMSAgLT4gMS4wRS0zOTcKK2Rkc2hpMTYzIHNoaWZ0ICAxRS0zOTggICAgICAgICAgICAgICAgICAgICAgMTUgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworLS0gIG5lZ2F0aXZlcworZGRzaGkxNzEgc2hpZnQgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgIC0xICAtPiAtOS45OTk5OTk5OTk5OTk5OUUrMzgzCitkZHNoaTE3MiBzaGlmdCAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgLTE1IC0+IC05RSszNjkKK2Rkc2hpMTczIHNoaWZ0IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAgMSAgLT4gLTkuOTk5OTk5OTk5OTk5OTkwRSszODQKK2Rkc2hpMTc0IHNoaWZ0IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAgMTUgLT4gLTkuMDAwMDAwMDAwMDAwMDAwRSszODQKK2Rkc2hpMTc1IHNoaWZ0IC0xRS0zODMgICAgICAgICAgICAgICAgICAgICAtMSAgLT4gLTBFLTM4MworZGRzaGkxNzYgc2hpZnQgLTFFLTM4MyAgICAgICAgICAgICAgICAgICAgIC0xNSAtPiAtMEUtMzgzCitkZHNoaTE3NyBzaGlmdCAtMUUtMzgzICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IC0xLjBFLTM4MgorZGRzaGkxNzggc2hpZnQgLTFFLTM4MyAgICAgICAgICAgICAgICAgICAgICAxNSAtPiAtMS4wMDAwMDAwMDAwMDAwMDBFLTM2OAorZGRzaGkxODEgc2hpZnQgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgIC0xICAtPiAtMS4wMDAwMDAwMDAwMDAwMEUtMzg0CitkZHNoaTE4MiBzaGlmdCAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTE1IC0+IC0xRS0zOTgKK2Rkc2hpMTgzIHNoaWZ0IC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMSAgLT4gLTBFLTM5OAorZGRzaGkxODQgc2hpZnQgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgICAxNSAtPiAtMEUtMzk4CitkZHNoaTE4NSBzaGlmdCAtOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTEgIC0+IC05LjAwMDAwMDAwMDAwMDAwRS0zODQKK2Rkc2hpMTg2IHNoaWZ0IC05LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtMTUgLT4gLTlFLTM5OAorZGRzaGkxODcgc2hpZnQgLTkuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgICAxICAtPiAtMEUtMzk4CitkZHNoaTE4OCBzaGlmdCAtOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgIDE1IC0+IC0wRS0zOTgKK2Rkc2hpMTkwIHNoaWZ0IC0xRS0zOTggICAgICAgICAgICAgICAgICAgICAtMSAgLT4gLTBFLTM5OAorZGRzaGkxOTEgc2hpZnQgLTFFLTM5OCAgICAgICAgICAgICAgICAgICAgIC0xNSAtPiAtMEUtMzk4CitkZHNoaTE5MiBzaGlmdCAtMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IC0xLjBFLTM5NworZGRzaGkxOTMgc2hpZnQgLTFFLTM5OCAgICAgICAgICAgICAgICAgICAgICAxNSAtPiAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworCistLSBtb3JlIG5lZ2F0aXZlcyAob2Ygc2FuaXRpZXMpCitkZHNoaTIwMSBzaGlmdCAgICAgICAgICAgICAgICAtMCAgICAwICAtPiAtMAorZGRzaGkyMDIgc2hpZnQgICAgICAgICAgICAgICAgLTAgICAgMiAgLT4gLTAKK2Rkc2hpMjAzIHNoaWZ0ICAgICAgICAgICAgICAgIC0xICAgIDIgIC0+IC0xMDAKK2Rkc2hpMjA0IHNoaWZ0ICAgICAgICAgICAgICAgIC0xICAgMTUgIC0+IC0xMDAwMDAwMDAwMDAwMDAwCitkZHNoaTIwNSBzaGlmdCAgICAgICAgICAgICAgICAtMSAgIDE2ICAtPiAtMAorZGRzaGkyMDYgc2hpZnQgICAgICAgICAgICAgICAgLTEgICAtMSAgLT4gLTAKK2Rkc2hpMjA3IHNoaWZ0ICAgICAgICAgICAgICAgIC0wICAgLTIgIC0+IC0wCitkZHNoaTIwOCBzaGlmdCAtMTIzNDU2Nzg5MDEyMzQ1NiAgIC0xICAtPiAtMTIzNDU2Nzg5MDEyMzQ1CitkZHNoaTIwOSBzaGlmdCAtMTIzNDU2Nzg5MDEyMzQ1NiAgIC0xNSAtPiAtMQorZGRzaGkyMTAgc2hpZnQgLTEyMzQ1Njc4OTAxMjM0NTYgICAtMTYgLT4gLTAKK2Rkc2hpMjExIHNoaWZ0IC05OTM0NTY3ODkwMTIzNDU2ICAgLTE1IC0+IC05CitkZHNoaTIxMiBzaGlmdCAtOTkzNDU2Nzg5MDEyMzQ1NiAgIC0xNiAtPiAtMAorCisKKy0tIFNwZWNpYWxzOyBOYU5zIGFyZSBoYW5kbGVkIGFzIHVzdWFsCitkZHNoaTc4MSBzaGlmdCAtSW5mICAtOCAgICAgLT4gLUluZmluaXR5CitkZHNoaTc4MiBzaGlmdCAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitkZHNoaTc4MyBzaGlmdCAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkZHNoaTc4NCBzaGlmdCAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitkZHNoaTc4NSBzaGlmdCAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkZHNoaTc4NiBzaGlmdCAtSW5mICAgOCAgICAgLT4gLUluZmluaXR5CitkZHNoaTc4NyBzaGlmdCAtMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTc4OCBzaGlmdCAtSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTc4OSBzaGlmdCAtMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTc5MCBzaGlmdCAtMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTc5MSBzaGlmdCAgMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTc5MiBzaGlmdCAgMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTc5MyBzaGlmdCAgMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTc5NCBzaGlmdCAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rkc2hpODAwIHNoaWZ0ICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODAxIHNoaWZ0ICBJbmYgIC04ICAgICAtPiBJbmZpbml0eQorZGRzaGk4MDIgc2hpZnQgIEluZiAgLTEgICAgIC0+IEluZmluaXR5CitkZHNoaTgwMyBzaGlmdCAgSW5mICAtMCAgICAgLT4gSW5maW5pdHkKK2Rkc2hpODA0IHNoaWZ0ICBJbmYgICAwICAgICAtPiBJbmZpbml0eQorZGRzaGk4MDUgc2hpZnQgIEluZiAgIDEgICAgIC0+IEluZmluaXR5CitkZHNoaTgwNiBzaGlmdCAgSW5mICAgOCAgICAgLT4gSW5maW5pdHkKK2Rkc2hpODA3IHNoaWZ0ICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODA4IHNoaWZ0IC0xMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODA5IHNoaWZ0IC1JbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODEwIHNoaWZ0IC0xICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODExIHNoaWZ0IC0wICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODEyIHNoaWZ0ICAwICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODEzIHNoaWZ0ICAxICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODE0IHNoaWZ0ICAxMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODE1IHNoaWZ0ICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZGRzaGk4MjEgc2hpZnQgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2Rkc2hpODIyIHNoaWZ0ICBOYU4gLTEwMDAgICAtPiAgTmFOCitkZHNoaTgyMyBzaGlmdCAgTmFOIC0xICAgICAgLT4gIE5hTgorZGRzaGk4MjQgc2hpZnQgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2Rkc2hpODI1IHNoaWZ0ICBOYU4gIDAgICAgICAtPiAgTmFOCitkZHNoaTgyNiBzaGlmdCAgTmFOICAxICAgICAgLT4gIE5hTgorZGRzaGk4Mjcgc2hpZnQgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2Rkc2hpODI4IHNoaWZ0ICBOYU4gIEluZiAgICAtPiAgTmFOCitkZHNoaTgyOSBzaGlmdCAgTmFOICBOYU4gICAgLT4gIE5hTgorZGRzaGk4MzAgc2hpZnQgLUluZiAgTmFOICAgIC0+ICBOYU4KK2Rkc2hpODMxIHNoaWZ0IC0xMDAwIE5hTiAgICAtPiAgTmFOCitkZHNoaTgzMiBzaGlmdCAtMSAgICBOYU4gICAgLT4gIE5hTgorZGRzaGk4MzMgc2hpZnQgLTAgICAgTmFOICAgIC0+ICBOYU4KK2Rkc2hpODM0IHNoaWZ0ICAwICAgIE5hTiAgICAtPiAgTmFOCitkZHNoaTgzNSBzaGlmdCAgMSAgICBOYU4gICAgLT4gIE5hTgorZGRzaGk4MzYgc2hpZnQgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2Rkc2hpODM3IHNoaWZ0ICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2Rkc2hpODQxIHNoaWZ0ICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NDIgc2hpZnQgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg0MyBzaGlmdCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODQ0IHNoaWZ0ICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NDUgc2hpZnQgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg0NiBzaGlmdCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODQ3IHNoaWZ0ICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NDggc2hpZnQgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg0OSBzaGlmdCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODUwIHNoaWZ0ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NTEgc2hpZnQgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg1MiBzaGlmdCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODUzIHNoaWZ0IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NTQgc2hpZnQgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg1NSBzaGlmdCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODU2IHNoaWZ0ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NTcgc2hpZnQgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg1OCBzaGlmdCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODU5IHNoaWZ0ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZHNoaTg2MSBzaGlmdCAgTmFOMSAgIC1JbmYgICAgLT4gIE5hTjEKK2Rkc2hpODYyIHNoaWZ0ICtOYU4yICAgLTEwMDAgICAtPiAgTmFOMgorZGRzaGk4NjMgc2hpZnQgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCitkZHNoaTg2NCBzaGlmdCAgTmFONCAgICBJbmYgICAgLT4gIE5hTjQKK2Rkc2hpODY1IHNoaWZ0ICBOYU41ICAgK05hTjYgICAtPiAgTmFONQorZGRzaGk4NjYgc2hpZnQgLUluZiAgICAgTmFONyAgIC0+ICBOYU43CitkZHNoaTg2NyBzaGlmdCAtMTAwMCAgICBOYU44ICAgLT4gIE5hTjgKK2Rkc2hpODY4IHNoaWZ0ICAxMDAwICAgIE5hTjkgICAtPiAgTmFOOQorZGRzaGk4Njkgc2hpZnQgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorZGRzaGk4NzEgc2hpZnQgIHNOYU4xMSAgLUluZiAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODcyIHNoaWZ0ICBzTmFOMTIgIC0xMDAwICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg3MyBzaGlmdCAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NzQgc2hpZnQgIHNOYU4xNCAgIE5hTjE3IC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODc1IHNoaWZ0ICBzTmFOMTUgIHNOYU4xOCAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg3NiBzaGlmdCAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4Nzcgc2hpZnQgLUluZiAgICArc05hTjIwIC0+ICBOYU4yMCAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODc4IHNoaWZ0IC0xMDAwICAgIHNOYU4yMSAtPiAgTmFOMjEgIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg3OSBzaGlmdCAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4ODAgc2hpZnQgIEluZiAgICAgc05hTjIzIC0+ICBOYU4yMyAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODgxIHNoaWZ0ICtOYU4yNSAgK3NOYU4yNCAtPiAgTmFOMjQgIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg4MiBzaGlmdCAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2CitkZHNoaTg4MyBzaGlmdCAtc05hTjI3ICBzTmFOMjkgLT4gLU5hTjI3ICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4ODQgc2hpZnQgIDEwMDAgICAgLU5hTjMwIC0+IC1OYU4zMAorZGRzaGk4ODUgc2hpZnQgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRTdWJ0cmFjdC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFN1YnRyYWN0LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViYzQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRTdWJ0cmFjdC5kZWNUZXN0CkBAIC0wLDAgKzEsNjI5IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkU3VidHJhY3QuZGVjVGVzdCAtLSBkZWNEb3VibGUgc3VidHJhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBzZXQgb2YgdGVzdHMgYXJlIGZvciBkZWNEb3VibGVzIG9ubHk7IGFsbCBhcmd1bWVudHMgYXJlCistLSByZXByZXNlbnRhYmxlIGluIGEgZGVjRG91YmxlCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gW2ZpcnN0IGdyb3VwIGFyZSAncXVpY2sgY29uZmlkZW5jZSBjaGVjayddCitkZHN1YjAwMSBzdWJ0cmFjdCAgMCAgIDAgIC0+ICcwJworZGRzdWIwMDIgc3VidHJhY3QgIDEgICAxICAtPiAnMCcKK2Rkc3ViMDAzIHN1YnRyYWN0ICAxICAgMiAgLT4gJy0xJworZGRzdWIwMDQgc3VidHJhY3QgIDIgICAxICAtPiAnMScKK2Rkc3ViMDA1IHN1YnRyYWN0ICAyICAgMiAgLT4gJzAnCitkZHN1YjAwNiBzdWJ0cmFjdCAgMyAgIDIgIC0+ICcxJworZGRzdWIwMDcgc3VidHJhY3QgIDIgICAzICAtPiAnLTEnCisKK2Rkc3ViMDExIHN1YnRyYWN0IC0wICAgMCAgLT4gJy0wJworZGRzdWIwMTIgc3VidHJhY3QgLTEgICAxICAtPiAnLTInCitkZHN1YjAxMyBzdWJ0cmFjdCAtMSAgIDIgIC0+ICctMycKK2Rkc3ViMDE0IHN1YnRyYWN0IC0yICAgMSAgLT4gJy0zJworZGRzdWIwMTUgc3VidHJhY3QgLTIgICAyICAtPiAnLTQnCitkZHN1YjAxNiBzdWJ0cmFjdCAtMyAgIDIgIC0+ICctNScKK2Rkc3ViMDE3IHN1YnRyYWN0IC0yICAgMyAgLT4gJy01JworCitkZHN1YjAyMSBzdWJ0cmFjdCAgMCAgLTAgIC0+ICcwJworZGRzdWIwMjIgc3VidHJhY3QgIDEgIC0xICAtPiAnMicKK2Rkc3ViMDIzIHN1YnRyYWN0ICAxICAtMiAgLT4gJzMnCitkZHN1YjAyNCBzdWJ0cmFjdCAgMiAgLTEgIC0+ICczJworZGRzdWIwMjUgc3VidHJhY3QgIDIgIC0yICAtPiAnNCcKK2Rkc3ViMDI2IHN1YnRyYWN0ICAzICAtMiAgLT4gJzUnCitkZHN1YjAyNyBzdWJ0cmFjdCAgMiAgLTMgIC0+ICc1JworCitkZHN1YjAzMCBzdWJ0cmFjdCAgMTEgIDEgIC0+IDEwCitkZHN1YjAzMSBzdWJ0cmFjdCAgMTAgIDEgIC0+ICA5CitkZHN1YjAzMiBzdWJ0cmFjdCAgOSAgIDEgIC0+ICA4CitkZHN1YjAzMyBzdWJ0cmFjdCAgMSAgIDEgIC0+ICAwCitkZHN1YjAzNCBzdWJ0cmFjdCAgMCAgIDEgIC0+IC0xCitkZHN1YjAzNSBzdWJ0cmFjdCAtMSAgIDEgIC0+IC0yCitkZHN1YjAzNiBzdWJ0cmFjdCAtOSAgIDEgIC0+IC0xMAorZGRzdWIwMzcgc3VidHJhY3QgLTEwICAxICAtPiAtMTEKK2Rkc3ViMDM4IHN1YnRyYWN0IC0xMSAgMSAgLT4gLTEyCisKK2Rkc3ViMDQwIHN1YnRyYWN0ICc1Ljc1JyAnMy4zJyAgLT4gJzIuNDUnCitkZHN1YjA0MSBzdWJ0cmFjdCAnNScgICAgJy0zJyAgIC0+ICc4JworZGRzdWIwNDIgc3VidHJhY3QgJy01JyAgICctMycgICAtPiAnLTInCitkZHN1YjA0MyBzdWJ0cmFjdCAnLTcnICAgJzIuNScgIC0+ICctOS41JworZGRzdWIwNDQgc3VidHJhY3QgJzAuNycgICcwLjMnICAtPiAnMC40JworZGRzdWIwNDUgc3VidHJhY3QgJzEuMycgICcwLjMnICAtPiAnMS4wJworZGRzdWIwNDYgc3VidHJhY3QgJzEuMjUnICcxLjI1JyAtPiAnMC4wMCcKKworZGRzdWIwNTAgc3VidHJhY3QgJzEuMjM0NTY3ODknICAgICcxLjAwMDAwMDAwJyAtPiAnMC4yMzQ1Njc4OScKK2Rkc3ViMDUxIHN1YnRyYWN0ICcxLjIzNDU2Nzg5JyAgICAnMS4wMDAwMDA4OScgLT4gJzAuMjM0NTY3MDAnCisKK2Rkc3ViMDYwIHN1YnRyYWN0ICc3MCcgICAgJzEwMDAwZSsxNicgLT4gJy0xLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZGRzdWIwNjEgc3VidHJhY3QgJzcwMCcgICAgJzEwMDAwZSsxNicgLT4gJy0xLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZGRzdWIwNjIgc3VidHJhY3QgJzcwMDAnICAgICcxMDAwMGUrMTYnIC0+ICctOS45OTk5OTk5OTk5OTk5OTlFKzE5JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViMDYzIHN1YnRyYWN0ICc3MDAwMCcgICAgJzEwMDAwZSsxNicgLT4gJy05Ljk5OTk5OTk5OTk5OTk5M0UrMTknIFJvdW5kZWQKK2Rkc3ViMDY0IHN1YnRyYWN0ICc3MDAwMDAnICAgICcxMDAwMGUrMTYnIC0+ICctOS45OTk5OTk5OTk5OTk5MzBFKzE5JyBSb3VuZGVkCisgIC0tIHN5bW1ldHJ5OgorZGRzdWIwNjUgc3VidHJhY3QgJzEwMDAwZSsxNicgICAgJzcwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViMDY2IHN1YnRyYWN0ICcxMDAwMGUrMTYnICAgICc3MDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZGRzdWIwNjcgc3VidHJhY3QgJzEwMDAwZSsxNicgICAgJzcwMDAnIC0+ICc5Ljk5OTk5OTk5OTk5OTk5OUUrMTknIEluZXhhY3QgUm91bmRlZAorZGRzdWIwNjggc3VidHJhY3QgJzEwMDAwZSsxNicgICAgJzcwMDAwJyAtPiAnOS45OTk5OTk5OTk5OTk5OTNFKzE5JyBSb3VuZGVkCitkZHN1YjA2OSBzdWJ0cmFjdCAnMTAwMDBlKzE2JyAgICAnNzAwMDAwJyAtPiAnOS45OTk5OTk5OTk5OTk5MzBFKzE5JyBSb3VuZGVkCisKKyAgLS0gc29tZSBvZiB0aGUgbmV4dCBncm91cCBhcmUgcmVhbGx5IGNvbnN0cnVjdG9yIHRlc3RzCitkZHN1YjA5MCBzdWJ0cmFjdCAnMDAuMCcgICAgJzAuMCcgIC0+ICcwLjAnCitkZHN1YjA5MSBzdWJ0cmFjdCAnMDAuMCcgICAgJzAuMDAnIC0+ICcwLjAwJworZGRzdWIwOTIgc3VidHJhY3QgJzAuMDAnICAgICcwMC4wJyAtPiAnMC4wMCcKK2Rkc3ViMDkzIHN1YnRyYWN0ICcwMC4wJyAgICAnMC4wMCcgLT4gJzAuMDAnCitkZHN1YjA5NCBzdWJ0cmFjdCAnMC4wMCcgICAgJzAwLjAnIC0+ICcwLjAwJworZGRzdWIwOTUgc3VidHJhY3QgJzMnICAgICcuMycgICAtPiAnMi43JworZGRzdWIwOTYgc3VidHJhY3QgJzMuJyAgICcuMycgICAtPiAnMi43JworZGRzdWIwOTcgc3VidHJhY3QgJzMuMCcgICcuMycgICAtPiAnMi43JworZGRzdWIwOTggc3VidHJhY3QgJzMuMDAnICcuMycgICAtPiAnMi43MCcKK2Rkc3ViMDk5IHN1YnRyYWN0ICczJyAgICAnMycgICAgLT4gJzAnCitkZHN1YjEwMCBzdWJ0cmFjdCAnMycgICAgJyszJyAgIC0+ICcwJworZGRzdWIxMDEgc3VidHJhY3QgJzMnICAgICctMycgICAtPiAnNicKK2Rkc3ViMTAyIHN1YnRyYWN0ICczJyAgICAnMC4zJyAgLT4gJzIuNycKK2Rkc3ViMTAzIHN1YnRyYWN0ICczLicgICAnMC4zJyAgLT4gJzIuNycKK2Rkc3ViMTA0IHN1YnRyYWN0ICczLjAnICAnMC4zJyAgLT4gJzIuNycKK2Rkc3ViMTA1IHN1YnRyYWN0ICczLjAwJyAnMC4zJyAgLT4gJzIuNzAnCitkZHN1YjEwNiBzdWJ0cmFjdCAnMycgICAgJzMuMCcgIC0+ICcwLjAnCitkZHN1YjEwNyBzdWJ0cmFjdCAnMycgICAgJyszLjAnIC0+ICcwLjAnCitkZHN1YjEwOCBzdWJ0cmFjdCAnMycgICAgJy0zLjAnIC0+ICc2LjAnCisKKy0tIHRoZSBhYm92ZSBhbGwgZnJvbSBhZGQ7IG1hc3NhZ2VkIGFuZCBleHRlbmRlZC4gIE5vdyBzb21lIG5ldyBvbmVzLi4uCistLSBbcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgY29tcGFyaXNvbnNdCistLSBOQjogLXhFLTggYmVsb3cgd2VyZSBub24tZXhwb25lbnRzIHByZS1BTlNJIFgzLTI3NCwgYW5kIC0xRS03IG9yIDBFLTcKKy0tIHdpdGggaW5wdXQgcm91bmRpbmcuCitkZHN1YjEyMCBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg0JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTVFLTgnCitkZHN1YjEyMSBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg1JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTRFLTgnCitkZHN1YjEyMiBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg2JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTNFLTgnCitkZHN1YjEyMyBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg3JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTJFLTgnCitkZHN1YjEyNCBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg4JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTFFLTgnCitkZHN1YjEyNSBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg5JyAgICAnMTAuMjM0NTY3ODknICAtPiAnMEUtOCcKK2Rkc3ViMTI2IHN1YnRyYWN0ICAnMTAuMjM0NTY3OTAnICAgICcxMC4yMzQ1Njc4OScgIC0+ICcxRS04JworZGRzdWIxMjcgc3VidHJhY3QgICcxMC4yMzQ1Njc5MScgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJzJFLTgnCitkZHN1YjEyOCBzdWJ0cmFjdCAgJzEwLjIzNDU2NzkyJyAgICAnMTAuMjM0NTY3ODknICAtPiAnM0UtOCcKK2Rkc3ViMTI5IHN1YnRyYWN0ICAnMTAuMjM0NTY3OTMnICAgICcxMC4yMzQ1Njc4OScgIC0+ICc0RS04JworZGRzdWIxMzAgc3VidHJhY3QgICcxMC4yMzQ1Njc5NCcgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJzVFLTgnCitkZHN1YjEzMSBzdWJ0cmFjdCAgJzEwLjIzNDU2NzgxJyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTVFLTgnCitkZHN1YjEzMiBzdWJ0cmFjdCAgJzEwLjIzNDU2NzgyJyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTRFLTgnCitkZHN1YjEzMyBzdWJ0cmFjdCAgJzEwLjIzNDU2NzgzJyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTNFLTgnCitkZHN1YjEzNCBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg0JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTJFLTgnCitkZHN1YjEzNSBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg1JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTFFLTgnCitkZHN1YjEzNiBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg2JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnMEUtOCcKK2Rkc3ViMTM3IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODcnICAgICcxMC4yMzQ1Njc4NicgIC0+ICcxRS04JworZGRzdWIxMzggc3VidHJhY3QgICcxMC4yMzQ1Njc4OCcgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJzJFLTgnCitkZHN1YjEzOSBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg5JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnM0UtOCcKK2Rkc3ViMTQwIHN1YnRyYWN0ICAnMTAuMjM0NTY3OTAnICAgICcxMC4yMzQ1Njc4NicgIC0+ICc0RS04JworZGRzdWIxNDEgc3VidHJhY3QgICcxMC4yMzQ1Njc5MScgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJzVFLTgnCitkZHN1YjE0MiBzdWJ0cmFjdCAgJzEnICAgICAgICAgICAgICAnMC45OTk5OTk5OTknICAtPiAnMUUtOScKK2Rkc3ViMTQzIHN1YnRyYWN0ICAnMC45OTk5OTk5OTknICAgICcxJyAgICAgICAgICAgIC0+ICctMUUtOScKK2Rkc3ViMTQ0IHN1YnRyYWN0ICAnLTEwLjIzNDU2NzgwJyAgICctMTAuMjM0NTY3ODYnIC0+ICc2RS04JworZGRzdWIxNDUgc3VidHJhY3QgICctMTAuMjM0NTY3OTAnICAgJy0xMC4yMzQ1Njc4NicgLT4gJy00RS04JworZGRzdWIxNDYgc3VidHJhY3QgICctMTAuMjM0NTY3OTEnICAgJy0xMC4yMzQ1Njc4NicgLT4gJy01RS04JworCistLSBhZGRpdGlvbmFsIHNjYWxlZCBhcml0aG1ldGljIHRlc3RzIFswLjk3IHByb2JsZW1dCitkZHN1YjE2MCBzdWJ0cmFjdCAnMCcgICAgICcuMScgICAgICAtPiAnLTAuMScKK2Rkc3ViMTYxIHN1YnRyYWN0ICcwMCcgICAgJy45Nzk4MycgIC0+ICctMC45Nzk4MycKK2Rkc3ViMTYyIHN1YnRyYWN0ICcwJyAgICAgJy45JyAgICAgIC0+ICctMC45JworZGRzdWIxNjMgc3VidHJhY3QgJzAnICAgICAnMC4xMDInICAgLT4gJy0wLjEwMicKK2Rkc3ViMTY0IHN1YnRyYWN0ICcwJyAgICAgJy40JyAgICAgIC0+ICctMC40JworZGRzdWIxNjUgc3VidHJhY3QgJzAnICAgICAnLjMwNycgICAgLT4gJy0wLjMwNycKK2Rkc3ViMTY2IHN1YnRyYWN0ICcwJyAgICAgJy40MzgyMicgIC0+ICctMC40MzgyMicKK2Rkc3ViMTY3IHN1YnRyYWN0ICcwJyAgICAgJy45MTEnICAgIC0+ICctMC45MTEnCitkZHN1YjE2OCBzdWJ0cmFjdCAnLjAnICAgICcuMDInICAgICAtPiAnLTAuMDInCitkZHN1YjE2OSBzdWJ0cmFjdCAnMDAnICAgICcuMzkyJyAgICAtPiAnLTAuMzkyJworZGRzdWIxNzAgc3VidHJhY3QgJzAnICAgICAnLjI2JyAgICAgLT4gJy0wLjI2JworZGRzdWIxNzEgc3VidHJhY3QgJzAnICAgICAnMC41MScgICAgLT4gJy0wLjUxJworZGRzdWIxNzIgc3VidHJhY3QgJzAnICAgICAnLjIyMzQnICAgLT4gJy0wLjIyMzQnCitkZHN1YjE3MyBzdWJ0cmFjdCAnMCcgICAgICcuMicgICAgICAtPiAnLTAuMicKK2Rkc3ViMTc0IHN1YnRyYWN0ICcuMCcgICAgJy4wMDA4JyAgIC0+ICctMC4wMDA4JworLS0gMC4gb24gbGVmdAorZGRzdWIxODAgc3VidHJhY3QgJzAuMCcgICAgICctLjEnICAgICAgLT4gJzAuMScKK2Rkc3ViMTgxIHN1YnRyYWN0ICcwLjAwJyAgICAnLS45Nzk4MycgIC0+ICcwLjk3OTgzJworZGRzdWIxODIgc3VidHJhY3QgJzAuMCcgICAgICctLjknICAgICAgLT4gJzAuOScKK2Rkc3ViMTgzIHN1YnRyYWN0ICcwLjAnICAgICAnLTAuMTAyJyAgIC0+ICcwLjEwMicKK2Rkc3ViMTg0IHN1YnRyYWN0ICcwLjAnICAgICAnLS40JyAgICAgIC0+ICcwLjQnCitkZHN1YjE4NSBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMzA3JyAgICAtPiAnMC4zMDcnCitkZHN1YjE4NiBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uNDM4MjInICAtPiAnMC40MzgyMicKK2Rkc3ViMTg3IHN1YnRyYWN0ICcwLjAnICAgICAnLS45MTEnICAgIC0+ICcwLjkxMScKK2Rkc3ViMTg4IHN1YnRyYWN0ICcwLjAnICAgICAnLS4wMicgICAgIC0+ICcwLjAyJworZGRzdWIxODkgc3VidHJhY3QgJzAuMDAnICAgICctLjM5MicgICAgLT4gJzAuMzkyJworZGRzdWIxOTAgc3VidHJhY3QgJzAuMCcgICAgICctLjI2JyAgICAgLT4gJzAuMjYnCitkZHN1YjE5MSBzdWJ0cmFjdCAnMC4wJyAgICAgJy0wLjUxJyAgICAtPiAnMC41MScKK2Rkc3ViMTkyIHN1YnRyYWN0ICcwLjAnICAgICAnLS4yMjM0JyAgIC0+ICcwLjIyMzQnCitkZHN1YjE5MyBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMicgICAgICAtPiAnMC4yJworZGRzdWIxOTQgc3VidHJhY3QgJzAuMCcgICAgICctLjAwMDgnICAgLT4gJzAuMDAwOCcKKy0tIG5lZ2F0aXZlcyBvZiBzYW1lCitkZHN1YjIwMCBzdWJ0cmFjdCAnMCcgICAgICctLjEnICAgICAgLT4gJzAuMScKK2Rkc3ViMjAxIHN1YnRyYWN0ICcwMCcgICAgJy0uOTc5ODMnICAtPiAnMC45Nzk4MycKK2Rkc3ViMjAyIHN1YnRyYWN0ICcwJyAgICAgJy0uOScgICAgICAtPiAnMC45JworZGRzdWIyMDMgc3VidHJhY3QgJzAnICAgICAnLTAuMTAyJyAgIC0+ICcwLjEwMicKK2Rkc3ViMjA0IHN1YnRyYWN0ICcwJyAgICAgJy0uNCcgICAgICAtPiAnMC40JworZGRzdWIyMDUgc3VidHJhY3QgJzAnICAgICAnLS4zMDcnICAgIC0+ICcwLjMwNycKK2Rkc3ViMjA2IHN1YnRyYWN0ICcwJyAgICAgJy0uNDM4MjInICAtPiAnMC40MzgyMicKK2Rkc3ViMjA3IHN1YnRyYWN0ICcwJyAgICAgJy0uOTExJyAgICAtPiAnMC45MTEnCitkZHN1YjIwOCBzdWJ0cmFjdCAnLjAnICAgICctLjAyJyAgICAgLT4gJzAuMDInCitkZHN1YjIwOSBzdWJ0cmFjdCAnMDAnICAgICctLjM5MicgICAgLT4gJzAuMzkyJworZGRzdWIyMTAgc3VidHJhY3QgJzAnICAgICAnLS4yNicgICAgIC0+ICcwLjI2JworZGRzdWIyMTEgc3VidHJhY3QgJzAnICAgICAnLTAuNTEnICAgIC0+ICcwLjUxJworZGRzdWIyMTIgc3VidHJhY3QgJzAnICAgICAnLS4yMjM0JyAgIC0+ICcwLjIyMzQnCitkZHN1YjIxMyBzdWJ0cmFjdCAnMCcgICAgICctLjInICAgICAgLT4gJzAuMicKK2Rkc3ViMjE0IHN1YnRyYWN0ICcuMCcgICAgJy0uMDAwOCcgICAtPiAnMC4wMDA4JworCistLSBtb3JlIGZpeGVkLCBMSFMgc3dhcHMgW3JlYWxseSB0aGUgc2FtZSBhcyB0ZXN0Y2FzZXMgdW5kZXIgYWRkXQorZGRzdWIyMjAgc3VidHJhY3QgJy01NjI2N0UtMTInIDAgIC0+ICctNS42MjY3RS04JworZGRzdWIyMjEgc3VidHJhY3QgJy01NjI2N0UtMTEnIDAgIC0+ICctNS42MjY3RS03JworZGRzdWIyMjIgc3VidHJhY3QgJy01NjI2N0UtMTAnIDAgIC0+ICctMC4wMDAwMDU2MjY3JworZGRzdWIyMjMgc3VidHJhY3QgJy01NjI2N0UtOScgIDAgIC0+ICctMC4wMDAwNTYyNjcnCitkZHN1YjIyNCBzdWJ0cmFjdCAnLTU2MjY3RS04JyAgMCAgLT4gJy0wLjAwMDU2MjY3JworZGRzdWIyMjUgc3VidHJhY3QgJy01NjI2N0UtNycgIDAgIC0+ICctMC4wMDU2MjY3JworZGRzdWIyMjYgc3VidHJhY3QgJy01NjI2N0UtNicgIDAgIC0+ICctMC4wNTYyNjcnCitkZHN1YjIyNyBzdWJ0cmFjdCAnLTU2MjY3RS01JyAgMCAgLT4gJy0wLjU2MjY3JworZGRzdWIyMjggc3VidHJhY3QgJy01NjI2N0UtMicgIDAgIC0+ICctNTYyLjY3JworZGRzdWIyMjkgc3VidHJhY3QgJy01NjI2N0UtMScgIDAgIC0+ICctNTYyNi43JworZGRzdWIyMzAgc3VidHJhY3QgJy01NjI2N0UtMCcgIDAgIC0+ICctNTYyNjcnCistLSBzeW1tZXRyeSAuLi4KK2Rkc3ViMjQwIHN1YnRyYWN0IDAgJy01NjI2N0UtMTInICAtPiAnNS42MjY3RS04JworZGRzdWIyNDEgc3VidHJhY3QgMCAnLTU2MjY3RS0xMScgIC0+ICc1LjYyNjdFLTcnCitkZHN1YjI0MiBzdWJ0cmFjdCAwICctNTYyNjdFLTEwJyAgLT4gJzAuMDAwMDA1NjI2NycKK2Rkc3ViMjQzIHN1YnRyYWN0IDAgJy01NjI2N0UtOScgICAtPiAnMC4wMDAwNTYyNjcnCitkZHN1YjI0NCBzdWJ0cmFjdCAwICctNTYyNjdFLTgnICAgLT4gJzAuMDAwNTYyNjcnCitkZHN1YjI0NSBzdWJ0cmFjdCAwICctNTYyNjdFLTcnICAgLT4gJzAuMDA1NjI2NycKK2Rkc3ViMjQ2IHN1YnRyYWN0IDAgJy01NjI2N0UtNicgICAtPiAnMC4wNTYyNjcnCitkZHN1YjI0NyBzdWJ0cmFjdCAwICctNTYyNjdFLTUnICAgLT4gJzAuNTYyNjcnCitkZHN1YjI0OCBzdWJ0cmFjdCAwICctNTYyNjdFLTInICAgLT4gJzU2Mi42NycKK2Rkc3ViMjQ5IHN1YnRyYWN0IDAgJy01NjI2N0UtMScgICAtPiAnNTYyNi43JworZGRzdWIyNTAgc3VidHJhY3QgMCAnLTU2MjY3RS0wJyAgIC0+ICc1NjI2NycKKworLS0gbm93IHNvbWUgbW9yZSBmcm9tIHRoZSAnbmV3JyBhZGQKK2Rkc3ViMzAxIHN1YnRyYWN0ICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMDAnIC0+ICcwLjIzNDU2Nzg5JworZGRzdWIzMDIgc3VidHJhY3QgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAxMScgLT4gJzAuMjM0NTY3NzgnCisKKy0tIHNvbWUgY2FycnlpbmcgZWZmZWN0cworZGRzdWIzMjEgc3VidHJhY3QgJzAuOTk5OCcgICcwLjAwMDAnIC0+ICcwLjk5OTgnCitkZHN1YjMyMiBzdWJ0cmFjdCAnMC45OTk4JyAgJzAuMDAwMScgLT4gJzAuOTk5NycKK2Rkc3ViMzIzIHN1YnRyYWN0ICcwLjk5OTgnICAnMC4wMDAyJyAtPiAnMC45OTk2JworZGRzdWIzMjQgc3VidHJhY3QgJzAuOTk5OCcgICcwLjAwMDMnIC0+ICcwLjk5OTUnCitkZHN1YjMyNSBzdWJ0cmFjdCAnMC45OTk4JyAgJy0wLjAwMDAnIC0+ICcwLjk5OTgnCitkZHN1YjMyNiBzdWJ0cmFjdCAnMC45OTk4JyAgJy0wLjAwMDEnIC0+ICcwLjk5OTknCitkZHN1YjMyNyBzdWJ0cmFjdCAnMC45OTk4JyAgJy0wLjAwMDInIC0+ICcxLjAwMDAnCitkZHN1YjMyOCBzdWJ0cmFjdCAnMC45OTk4JyAgJy0wLjAwMDMnIC0+ICcxLjAwMDEnCisKKy0tIGludGVybmFsIGJvdW5kYXJpZXMKK2Rkc3ViMzQ2IHN1YnRyYWN0ICcxMDAwMGUrOScgICc3JyAgIC0+ICc5OTk5OTk5OTk5OTkzJworZGRzdWIzNDcgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwJyAgIC0+ICc5OTk5OTk5OTk5OTMwJworZGRzdWIzNDggc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwMCcgICAtPiAnOTk5OTk5OTk5OTMwMCcKK2Rkc3ViMzQ5IHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MDAwJyAgIC0+ICc5OTk5OTk5OTkzMDAwJworZGRzdWIzNTAgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwMDAwJyAgIC0+ICc5OTk5OTk5OTMwMDAwJworZGRzdWIzNTEgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwMDAwMCcgICAtPiAnOTk5OTk5OTMwMDAwMCcKK2Rkc3ViMzUyIHN1YnRyYWN0ICc3JyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTk5OTkzJworZGRzdWIzNTMgc3VidHJhY3QgJzcwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTk5OTMwJworZGRzdWIzNTQgc3VidHJhY3QgJzcwMCcgJzEwMDAwZSs5JyAgIC0+ICctOTk5OTk5OTk5OTMwMCcKK2Rkc3ViMzU1IHN1YnRyYWN0ICc3MDAwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTkzMDAwJworZGRzdWIzNTYgc3VidHJhY3QgJzcwMDAwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTMwMDAwJworZGRzdWIzNTcgc3VidHJhY3QgJzcwMDAwMCcgJzEwMDAwZSs5JyAgIC0+ICctOTk5OTk5OTMwMDAwMCcKKworLS0gemVybyBwcmVzZXJ2YXRpb24KK2Rkc3ViMzYxIHN1YnRyYWN0IDEgJzAuMDAwMScgLT4gJzAuOTk5OScKK2Rkc3ViMzYyIHN1YnRyYWN0IDEgJzAuMDAwMDEnIC0+ICcwLjk5OTk5JworZGRzdWIzNjMgc3VidHJhY3QgMSAnMC4wMDAwMDEnIC0+ICcwLjk5OTk5OScKK2Rkc3ViMzY0IHN1YnRyYWN0IDEgJzAuMDAwMDAwMDAwMDAwMDAwMScgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OScKK2Rkc3ViMzY1IHN1YnRyYWN0IDEgJzAuMDAwMDAwMDAwMDAwMDAwMDEnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjM2NiBzdWJ0cmFjdCAxICcwLjAwMDAwMDAwMDAwMDAwMDAwMScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBmdW5ueSB6ZXJvcyBbaW4gY2FzZSBvZiBiYWQgc2lnbnVtXQorZGRzdWIzNzAgc3VidHJhY3QgMSAgMCAgLT4gMQorZGRzdWIzNzEgc3VidHJhY3QgMSAwLiAgLT4gMQorZGRzdWIzNzIgc3VidHJhY3QgMSAgLjAgLT4gMS4wCitkZHN1YjM3MyBzdWJ0cmFjdCAxIDAuMCAtPiAxLjAKK2Rkc3ViMzc0IHN1YnRyYWN0ICAwICAxIC0+IC0xCitkZHN1YjM3NSBzdWJ0cmFjdCAwLiAgMSAtPiAtMQorZGRzdWIzNzYgc3VidHJhY3QgIC4wIDEgLT4gLTEuMAorZGRzdWIzNzcgc3VidHJhY3QgMC4wIDEgLT4gLTEuMAorCistLSBsZWFkaW5nIDAgZGlnaXQgYmVmb3JlIHJvdW5kCitkZHN1YjkxMCBzdWJ0cmFjdCAtMTAzNTE5MzYyIC01MTg5Nzk1NS4zIC0+IC01MTYyMTQwNi43CitkZHN1YjkxMSBzdWJ0cmFjdCAxNTk1NzkuNDQ0IDg5ODI3LjUyMjkgLT4gNjk3NTEuOTIxMQorCitkZHN1YjkyMCBzdWJ0cmFjdCAzMzMuMDAwMDAwMDEyMzQ1NiAzMy4wMDAwMDAwMTIzNDU2NiAtPiAyOTkuOTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViOTIxIHN1YnRyYWN0IDMzMy4wMDAwMDAwMTIzNDU2IDMzLjAwMDAwMDAxMjM0NTY1IC0+IDMwMC4wMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRzdWI5MjIgc3VidHJhY3QgMTMzLjAwMDAwMDAxMjM0NTYgMzMuMDAwMDAwMDEyMzQ1NjUgLT4gIDk5Ljk5OTk5OTk5OTk5OTk1CitkZHN1YjkyMyBzdWJ0cmFjdCAxMzMuMDAwMDAwMDEyMzQ1NiAzMy4wMDAwMDAwMTIzNDU2NCAtPiAgOTkuOTk5OTk5OTk5OTk5OTYKK2Rkc3ViOTI0IHN1YnRyYWN0IDEzMy4wMDAwMDAwMTIzNDU2IDMzLjAwMDAwMDAxMjM0NTQwIC0+IDEwMC4wMDAwMDAwMDAwMDAyIFJvdW5kZWQKK2Rkc3ViOTI1IHN1YnRyYWN0IDEzMy4wMDAwMDAwMTIzNDU2IDQzLjAwMDAwMDAxMjM0NTYwIC0+ICA5MC4wMDAwMDAwMDAwMDAwMAorZGRzdWI5MjYgc3VidHJhY3QgMTMzLjAwMDAwMDAxMjM0NTYgNDMuMDAwMDAwMDEyMzQ1NjEgLT4gIDg5Ljk5OTk5OTk5OTk5OTk5CitkZHN1YjkyNyBzdWJ0cmFjdCAxMzMuMDAwMDAwMDEyMzQ1NiA0My4wMDAwMDAwMTIzNDU2NiAtPiAgODkuOTk5OTk5OTk5OTk5OTQKK2Rkc3ViOTI4IHN1YnRyYWN0IDEwMS4wMDAwMDAwMTIzNDU2IDkxLjAwMDAwMDAxMjM0NTY2IC0+ICAgOS45OTk5OTk5OTk5OTk5NAorZGRzdWI5Mjkgc3VidHJhY3QgMTAxLjAwMDAwMDAxMjM0NTYgOTkuMDAwMDAwMDEyMzQ1NjYgLT4gICAxLjk5OTk5OTk5OTk5OTk0CisKKy0tIG1vcmUgTEhTIHN3YXBzIFt3ZXJlIGZpeGVkXQorZGRzdWIzOTAgc3VidHJhY3QgJy01NjI2N0UtMTAnICAgMCAtPiAgJy0wLjAwMDAwNTYyNjcnCitkZHN1YjM5MSBzdWJ0cmFjdCAnLTU2MjY3RS02JyAgICAwIC0+ICAnLTAuMDU2MjY3JworZGRzdWIzOTIgc3VidHJhY3QgJy01NjI2N0UtNScgICAgMCAtPiAgJy0wLjU2MjY3JworZGRzdWIzOTMgc3VidHJhY3QgJy01NjI2N0UtNCcgICAgMCAtPiAgJy01LjYyNjcnCitkZHN1YjM5NCBzdWJ0cmFjdCAnLTU2MjY3RS0zJyAgICAwIC0+ICAnLTU2LjI2NycKK2Rkc3ViMzk1IHN1YnRyYWN0ICctNTYyNjdFLTInICAgIDAgLT4gICctNTYyLjY3JworZGRzdWIzOTYgc3VidHJhY3QgJy01NjI2N0UtMScgICAgMCAtPiAgJy01NjI2LjcnCitkZHN1YjM5NyBzdWJ0cmFjdCAnLTU2MjY3RS0wJyAgICAwIC0+ICAnLTU2MjY3JworZGRzdWIzOTggc3VidHJhY3QgJy01RS0xMCcgICAgICAgMCAtPiAgJy01RS0xMCcKK2Rkc3ViMzk5IHN1YnRyYWN0ICctNUUtNycgICAgICAgIDAgLT4gICctNUUtNycKK2Rkc3ViNDAwIHN1YnRyYWN0ICctNUUtNicgICAgICAgIDAgLT4gICctMC4wMDAwMDUnCitkZHN1YjQwMSBzdWJ0cmFjdCAnLTVFLTUnICAgICAgICAwIC0+ICAnLTAuMDAwMDUnCitkZHN1YjQwMiBzdWJ0cmFjdCAnLTVFLTQnICAgICAgICAwIC0+ICAnLTAuMDAwNScKK2Rkc3ViNDAzIHN1YnRyYWN0ICctNUUtMScgICAgICAgIDAgLT4gICctMC41JworZGRzdWI0MDQgc3VidHJhY3QgJy01RTAnICAgICAgICAgMCAtPiAgJy01JworZGRzdWI0MDUgc3VidHJhY3QgJy01RTEnICAgICAgICAgMCAtPiAgJy01MCcKK2Rkc3ViNDA2IHN1YnRyYWN0ICctNUU1JyAgICAgICAgIDAgLT4gICctNTAwMDAwJworZGRzdWI0MDcgc3VidHJhY3QgJy01RTE1JyAgICAgICAgMCAtPiAgJy01MDAwMDAwMDAwMDAwMDAwJworZGRzdWI0MDggc3VidHJhY3QgJy01RTE2JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTYnICBSb3VuZGVkCitkZHN1YjQwOSBzdWJ0cmFjdCAnLTVFMTcnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNycgIFJvdW5kZWQKK2Rkc3ViNDEwIHN1YnRyYWN0ICctNUUxOCcgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE4JyAgUm91bmRlZAorZGRzdWI0MTEgc3VidHJhY3QgJy01RTEwMCcgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTAwJyBSb3VuZGVkCisKKy0tIG1vcmUgUkhTIHN3YXBzIFt3ZXJlIGZpeGVkXQorZGRzdWI0MjAgc3VidHJhY3QgMCAgJy01NjI2N0UtMTAnIC0+ICAnMC4wMDAwMDU2MjY3JworZGRzdWI0MjEgc3VidHJhY3QgMCAgJy01NjI2N0UtNicgIC0+ICAnMC4wNTYyNjcnCitkZHN1YjQyMiBzdWJ0cmFjdCAwICAnLTU2MjY3RS01JyAgLT4gICcwLjU2MjY3JworZGRzdWI0MjMgc3VidHJhY3QgMCAgJy01NjI2N0UtNCcgIC0+ICAnNS42MjY3JworZGRzdWI0MjQgc3VidHJhY3QgMCAgJy01NjI2N0UtMycgIC0+ICAnNTYuMjY3JworZGRzdWI0MjUgc3VidHJhY3QgMCAgJy01NjI2N0UtMicgIC0+ICAnNTYyLjY3JworZGRzdWI0MjYgc3VidHJhY3QgMCAgJy01NjI2N0UtMScgIC0+ICAnNTYyNi43JworZGRzdWI0Mjcgc3VidHJhY3QgMCAgJy01NjI2N0UtMCcgIC0+ICAnNTYyNjcnCitkZHN1YjQyOCBzdWJ0cmFjdCAwICAnLTVFLTEwJyAgICAgLT4gICc1RS0xMCcKK2Rkc3ViNDI5IHN1YnRyYWN0IDAgICctNUUtNycgICAgICAtPiAgJzVFLTcnCitkZHN1YjQzMCBzdWJ0cmFjdCAwICAnLTVFLTYnICAgICAgLT4gICcwLjAwMDAwNScKK2Rkc3ViNDMxIHN1YnRyYWN0IDAgICctNUUtNScgICAgICAtPiAgJzAuMDAwMDUnCitkZHN1YjQzMiBzdWJ0cmFjdCAwICAnLTVFLTQnICAgICAgLT4gICcwLjAwMDUnCitkZHN1YjQzMyBzdWJ0cmFjdCAwICAnLTVFLTEnICAgICAgLT4gICcwLjUnCitkZHN1YjQzNCBzdWJ0cmFjdCAwICAnLTVFMCcgICAgICAgLT4gICc1JworZGRzdWI0MzUgc3VidHJhY3QgMCAgJy01RTEnICAgICAgIC0+ICAnNTAnCitkZHN1YjQzNiBzdWJ0cmFjdCAwICAnLTVFNScgICAgICAgLT4gICc1MDAwMDAnCitkZHN1YjQzNyBzdWJ0cmFjdCAwICAnLTVFMTUnICAgICAgLT4gICc1MDAwMDAwMDAwMDAwMDAwJworZGRzdWI0Mzggc3VidHJhY3QgMCAgJy01RTE2JyAgICAgIC0+ICAnNS4wMDAwMDAwMDAwMDAwMDBFKzE2JyAgIFJvdW5kZWQKK2Rkc3ViNDM5IHN1YnRyYWN0IDAgICctNUUxNycgICAgICAtPiAgJzUuMDAwMDAwMDAwMDAwMDAwRSsxNycgICBSb3VuZGVkCitkZHN1YjQ0MCBzdWJ0cmFjdCAwICAnLTVFMTgnICAgICAgLT4gICc1LjAwMDAwMDAwMDAwMDAwMEUrMTgnICAgUm91bmRlZAorZGRzdWI0NDEgc3VidHJhY3QgMCAgJy01RTEwMCcgICAgIC0+ICAnNS4wMDAwMDAwMDAwMDAwMDBFKzEwMCcgIFJvdW5kZWQKKworCistLSB0cnkgYm9yZGVybGluZSBwcmVjaXNpb24sIHdpdGggY2FycmllcywgZXRjLgorZGRzdWI0NjEgc3VidHJhY3QgJzFFKzE2JyAnMScgICAgICAgIC0+ICc5OTk5OTk5OTk5OTk5OTk5JworZGRzdWI0NjIgc3VidHJhY3QgJzFFKzEyJyAnLTEuMTExJyAgIC0+ICcxMDAwMDAwMDAwMDAxLjExMScKK2Rkc3ViNDYzIHN1YnRyYWN0ICcxLjExMScgICctMUUrMTInICAtPiAnMTAwMDAwMDAwMDAwMS4xMTEnCitkZHN1YjQ2NCBzdWJ0cmFjdCAnLTEnICAgICctMUUrMTYnICAgLT4gJzk5OTk5OTk5OTk5OTk5OTknCitkZHN1YjQ2NSBzdWJ0cmFjdCAnN0UrMTUnICcxJyAgICAgICAgLT4gJzY5OTk5OTk5OTk5OTk5OTknCitkZHN1YjQ2NiBzdWJ0cmFjdCAnN0UrMTInICctMS4xMTEnICAgLT4gJzcwMDAwMDAwMDAwMDEuMTExJworZGRzdWI0Njcgc3VidHJhY3QgJzEuMTExJyAgJy03RSsxMicgIC0+ICc3MDAwMDAwMDAwMDAxLjExMScKK2Rkc3ViNDY4IHN1YnRyYWN0ICctMScgICAgJy03RSsxNScgICAtPiAnNjk5OTk5OTk5OTk5OTk5OScKKworLS0gICAgICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAxIDIzNDU2Nzg5MDEyMzQ1CitkZHN1YjQ3MCBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NjMnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjQ3MSBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NjInIC0+ICcxLjAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjQ3MiBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NjEnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjQ3MyBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NjAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjQ3NCBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NTknIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjQ3NSBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NTgnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjQ3NiBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NTcnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjQ3NyBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZGRzdWI0Nzggc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1JyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5JworZGRzdWI0Nzkgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU0JyAtPiAnMC45OTk5OTk5OTk5OTk5OTk4JworZGRzdWI0ODAgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTUzJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk3JworZGRzdWI0ODEgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTUyJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk2JworZGRzdWI0ODIgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTUxJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk1JworZGRzdWI0ODMgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTUwJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk0JworCistLSBhbmQgc29tZSBtb3JlLCBpbmNsdWRpbmcgcmVzaWR1ZSBlZmZlY3RzIGFuZCBkaWZmZXJlbnQgcm91bmRpbmdzCityb3VuZGluZzogaGFsZl91cAorZGRzdWI1MDAgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknCitkZHN1YjUwMSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUwMiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUwMyBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUwNCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUwNSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUwNiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUwNyBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUwOCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUwOSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUxMCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUxMSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUxMiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUxMyBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUxNCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUxNSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUxNiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcKK2Rkc3ViNTE3IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAxLjAwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTE4IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTE5IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZGRzdWI1MjAgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknCitkZHN1YjUyMSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUyMiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUyMyBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUyNCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUyNSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUyNiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUyNyBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUyOCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUyOSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUzMCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUzMSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUzMiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUzMyBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUzNCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUzNSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUzNiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcKK2Rkc3ViNTM3IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTM4IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTM5IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitkZHN1YjU0MCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OCcgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU0MSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OCcgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU0MiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OCcgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2NzQ1Njc4NycgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkZHN1YjU1MCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OScKK2Rkc3ViNTUxIHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTUyIHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTUzIHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTU0IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTU1IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTU2IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTU3IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTU4IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTU5IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTYwIHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTYxIHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTYyIHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTYzIHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTY0IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTY1IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTY2IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg4JworZGRzdWI1Njcgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1Njggc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1Njkgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorCistLSBzeW1tZXRyeS4uLgorcm91bmRpbmc6IGhhbGZfdXAKK2Rkc3ViNjAwIHN1YnRyYWN0IDAgICAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScKK2Rkc3ViNjAxIHN1YnRyYWN0IDAuMDAwMDAwMDAxICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYwMiBzdWJ0cmFjdCAwLjAwMDAwMSAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MDMgc3VidHJhY3QgMC4xICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjA0IHN1YnRyYWN0IDAuNCAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYwNSBzdWJ0cmFjdCAwLjQ5ICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MDYgc3VidHJhY3QgMC40OTk5OTkgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjA3IHN1YnRyYWN0IDAuNDk5OTk5OTk5ICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYwOCBzdWJ0cmFjdCAwLjUgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MDkgc3VidHJhY3QgMC41MDAwMDAwMDEgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjEwIHN1YnRyYWN0IDAuNTAwMDAxICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYxMSBzdWJ0cmFjdCAwLjUxICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MTIgc3VidHJhY3QgMC42ICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjEzIHN1YnRyYWN0IDAuOSAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYxNCBzdWJ0cmFjdCAwLjk5OTk5ICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MTUgc3VidHJhY3QgMC45OTk5OTk5OTkgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjE2IHN1YnRyYWN0IDEgICAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcKK2Rkc3ViNjE3IHN1YnRyYWN0IDEuMDAwMDAwMDAxICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYxOCBzdWJ0cmFjdCAxLjAwMDAxICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MTkgc3VidHJhY3QgMS4xICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZGRzdWI2MjAgc3VidHJhY3QgMCAgICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg5JworZGRzdWI2MjEgc3VidHJhY3QgMC4wMDAwMDAwMDEgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjIyIHN1YnRyYWN0IDAuMDAwMDAxICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYyMyBzdWJ0cmFjdCAwLjEgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MjQgc3VidHJhY3QgMC40ICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjI1IHN1YnRyYWN0IDAuNDkgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYyNiBzdWJ0cmFjdCAwLjQ5OTk5OSAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI2Mjcgc3VidHJhY3QgMC40OTk5OTk5OTkgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjI4IHN1YnRyYWN0IDAuNSAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYyOSBzdWJ0cmFjdCAwLjUwMDAwMDAwMSAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MzAgc3VidHJhY3QgMC41MDAwMDEgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjMxIHN1YnRyYWN0IDAuNTEgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYzMiBzdWJ0cmFjdCAwLjYgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MzMgc3VidHJhY3QgMC45ICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjM0IHN1YnRyYWN0IDAuOTk5OTkgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYzNSBzdWJ0cmFjdCAwLjk5OTk5OTk5OSAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MzYgc3VidHJhY3QgMSAgICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JworZGRzdWI2Mzcgc3VidHJhY3QgMS4wMDAwMDAwMSAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjM4IHN1YnRyYWN0IDEuMDAwMDEgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYzOSBzdWJ0cmFjdCAxLjEgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorLS0gY3JpdGljYWwgZmV3IHdpdGggZXZlbiBib3R0b20gZGlnaXQuLi4KK2Rkc3ViNjQwIHN1YnRyYWN0IDAuNDk5OTk5OTk5ICAgJzEyMzEyMzQ1Njc0NTY3ODgnIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjY0MSBzdWJ0cmFjdCAwLjUgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg4JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2NDIgc3VidHJhY3QgMC41MDAwMDAwMDEgICAnMTIzMTIzNDU2NzQ1Njc4OCcgLT4gJy0xMjMxMjM0NTY3NDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGRvd24KK2Rkc3ViNjUwIHN1YnRyYWN0IDAgICAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScKK2Rkc3ViNjUxIHN1YnRyYWN0IDAuMDAwMDAwMDAxICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjY1MiBzdWJ0cmFjdCAwLjAwMDAwMSAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2NTMgc3VidHJhY3QgMC4xICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjU0IHN1YnRyYWN0IDAuNCAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjY1NSBzdWJ0cmFjdCAwLjQ5ICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2NTYgc3VidHJhY3QgMC40OTk5OTkgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjU3IHN1YnRyYWN0IDAuNDk5OTk5OTk5ICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjY1OCBzdWJ0cmFjdCAwLjUgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2NTkgc3VidHJhY3QgMC41MDAwMDAwMDEgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjYwIHN1YnRyYWN0IDAuNTAwMDAxICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjY2MSBzdWJ0cmFjdCAwLjUxICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2NjIgc3VidHJhY3QgMC42ICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjYzIHN1YnRyYWN0IDAuOSAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjY2NCBzdWJ0cmFjdCAwLjk5OTk5ICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2NjUgc3VidHJhY3QgMC45OTk5OTk5OTkgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjY2IHN1YnRyYWN0IDEgICAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcKK2Rkc3ViNjY3IHN1YnRyYWN0IDEuMDAwMDAwMDEgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4NycgSW5leGFjdCBSb3VuZGVkCitkZHN1YjY2OCBzdWJ0cmFjdCAxLjAwMDAxICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2Njkgc3VidHJhY3QgMS4xICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKKworCistLSBsb3RzIG9mIGxlYWRpbmcgemVyb3MgaW4gaW50ZXJtZWRpYXRlIHJlc3VsdCwgYW5kIHNob3dpbmcgZWZmZWN0cyBvZgorLS0gaW5wdXQgcm91bmRpbmcgd291bGQgaGF2ZSBhZmZlY3RlZCB0aGUgZm9sbG93aW5nCityb3VuZGluZzogaGFsZl91cAorZGRzdWI2NzAgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg4LjEnIC0+IDAuOQorZGRzdWI2NzEgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg4LjknIC0+IDAuMQorZGRzdWI2NzIgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg5LjEnIC0+IC0wLjEKK2Rkc3ViNjczIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OS41JyAtPiAtMC41CitkZHN1YjY3NCBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODkuOScgLT4gLTAuOQorCityb3VuZGluZzogaGFsZl9ldmVuCitkZHN1YjY4MCBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODguMScgLT4gMC45CitkZHN1YjY4MSBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODguOScgLT4gMC4xCitkZHN1YjY4MiBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODkuMScgLT4gLTAuMQorZGRzdWI2ODMgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg5LjUnIC0+IC0wLjUKK2Rkc3ViNjg0IHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OS45JyAtPiAtMC45CisKK2Rkc3ViNjg1IHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg4JyAnMTIzNDU2NzQ1Njc4Ny4xJyAtPiAwLjkKK2Rkc3ViNjg2IHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg4JyAnMTIzNDU2NzQ1Njc4Ny45JyAtPiAwLjEKK2Rkc3ViNjg3IHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg4JyAnMTIzNDU2NzQ1Njc4OC4xJyAtPiAtMC4xCitkZHN1YjY4OCBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OCcgJzEyMzQ1Njc0NTY3ODguNScgLT4gLTAuNQorZGRzdWI2ODkgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODgnICcxMjM0NTY3NDU2Nzg4LjknIC0+IC0wLjkKKworcm91bmRpbmc6IGRvd24KK2Rkc3ViNjkwIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OC4xJyAtPiAwLjkKK2Rkc3ViNjkxIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OC45JyAtPiAwLjEKK2Rkc3ViNjkyIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OS4xJyAtPiAtMC4xCitkZHN1YjY5MyBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODkuNScgLT4gLTAuNQorZGRzdWI2OTQgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg5LjknIC0+IC0wLjkKKworLS0gU3BlY2lhbHMKK2Rkc3ViNzgwIHN1YnRyYWN0IC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK2Rkc3ViNzgxIHN1YnRyYWN0IC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2Rkc3ViNzgyIHN1YnRyYWN0IC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2Rkc3ViNzgzIHN1YnRyYWN0IC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2Rkc3ViNzg0IHN1YnRyYWN0IC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2Rkc3ViNzg1IHN1YnRyYWN0IC1JbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK2Rkc3ViNzg3IHN1YnRyYWN0IC0xMDAwICBJbmYgICAtPiAtSW5maW5pdHkKK2Rkc3ViNzg4IHN1YnRyYWN0IC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK2Rkc3ViNzg5IHN1YnRyYWN0IC0xICAgICBJbmYgICAtPiAtSW5maW5pdHkKK2Rkc3ViNzkwIHN1YnRyYWN0ICAwICAgICBJbmYgICAtPiAtSW5maW5pdHkKK2Rkc3ViNzkxIHN1YnRyYWN0ICAxICAgICBJbmYgICAtPiAtSW5maW5pdHkKK2Rkc3ViNzkyIHN1YnRyYWN0ICAxMDAwICBJbmYgICAtPiAtSW5maW5pdHkKKworZGRzdWI4MDAgc3VidHJhY3QgIEluZiAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1YjgwMSBzdWJ0cmFjdCAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkZHN1YjgwMiBzdWJ0cmFjdCAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitkZHN1YjgwMyBzdWJ0cmFjdCAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitkZHN1YjgwNCBzdWJ0cmFjdCAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkZHN1YjgwNSBzdWJ0cmFjdCAgSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitkZHN1YjgwNiBzdWJ0cmFjdCAgSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitkZHN1YjgwNyBzdWJ0cmFjdCAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CitkZHN1YjgwOCBzdWJ0cmFjdCAtMTAwMCAtSW5mICAgLT4gIEluZmluaXR5CitkZHN1YjgwOSBzdWJ0cmFjdCAtSW5mICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODEwIHN1YnRyYWN0IC0xICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2Rkc3ViODExIHN1YnRyYWN0IC0wICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2Rkc3ViODEyIHN1YnRyYWN0ICAwICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2Rkc3ViODEzIHN1YnRyYWN0ICAxICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2Rkc3ViODE0IHN1YnRyYWN0ICAxMDAwIC1JbmYgICAtPiAgSW5maW5pdHkKK2Rkc3ViODE1IHN1YnRyYWN0ICBJbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKKworZGRzdWI4MjEgc3VidHJhY3QgIE5hTiAgIEluZiAgIC0+ICBOYU4KK2Rkc3ViODIyIHN1YnRyYWN0IC1OYU4gICAxMDAwICAtPiAtTmFOCitkZHN1YjgyMyBzdWJ0cmFjdCAgTmFOICAgMSAgICAgLT4gIE5hTgorZGRzdWI4MjQgc3VidHJhY3QgIE5hTiAgIDAgICAgIC0+ICBOYU4KK2Rkc3ViODI1IHN1YnRyYWN0ICBOYU4gIC0wICAgICAtPiAgTmFOCitkZHN1YjgyNiBzdWJ0cmFjdCAgTmFOICAtMSAgICAgLT4gIE5hTgorZGRzdWI4Mjcgc3VidHJhY3QgIE5hTiAgLTEwMDAgIC0+ICBOYU4KK2Rkc3ViODI4IHN1YnRyYWN0ICBOYU4gIC1JbmYgICAtPiAgTmFOCitkZHN1YjgyOSBzdWJ0cmFjdCAtTmFOICAgTmFOICAgLT4gLU5hTgorZGRzdWI4MzAgc3VidHJhY3QgLUluZiAgIE5hTiAgIC0+ICBOYU4KK2Rkc3ViODMxIHN1YnRyYWN0IC0xMDAwICBOYU4gICAtPiAgTmFOCitkZHN1YjgzMiBzdWJ0cmFjdCAtMSAgICAgTmFOICAgLT4gIE5hTgorZGRzdWI4MzMgc3VidHJhY3QgLTAgICAgIE5hTiAgIC0+ICBOYU4KK2Rkc3ViODM0IHN1YnRyYWN0ICAwICAgICBOYU4gICAtPiAgTmFOCitkZHN1YjgzNSBzdWJ0cmFjdCAgMSAgICAgTmFOICAgLT4gIE5hTgorZGRzdWI4MzYgc3VidHJhY3QgIDEwMDAgLU5hTiAgIC0+IC1OYU4KK2Rkc3ViODM3IHN1YnRyYWN0ICBJbmYgICBOYU4gICAtPiAgTmFOCisKK2Rkc3ViODQxIHN1YnRyYWN0ICBzTmFOICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4NDIgc3VidHJhY3QgLXNOYU4gIDEwMDAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg0MyBzdWJ0cmFjdCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODQ0IHN1YnRyYWN0ICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4NDUgc3VidHJhY3QgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg0NiBzdWJ0cmFjdCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODQ3IHN1YnRyYWN0ICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4NDggc3VidHJhY3QgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg0OSBzdWJ0cmFjdCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODUwIHN1YnRyYWN0ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4NTEgc3VidHJhY3QgLUluZiAtc05hTiAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg1MiBzdWJ0cmFjdCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODUzIHN1YnRyYWN0IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4NTQgc3VidHJhY3QgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg1NSBzdWJ0cmFjdCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODU2IHN1YnRyYWN0ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4NTcgc3VidHJhY3QgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg1OCBzdWJ0cmFjdCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODU5IHN1YnRyYWN0ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZHN1Yjg2MSBzdWJ0cmFjdCAgTmFOMDEgICAtSW5mICAgICAtPiAgTmFOMQorZGRzdWI4NjIgc3VidHJhY3QgLU5hTjAyICAgLTEwMDAgICAgLT4gLU5hTjIKK2Rkc3ViODYzIHN1YnRyYWN0ICBOYU4wMyAgICAxMDAwICAgIC0+ICBOYU4zCitkZHN1Yjg2NCBzdWJ0cmFjdCAgTmFOMDQgICAgSW5mICAgICAtPiAgTmFONAorZGRzdWI4NjUgc3VidHJhY3QgIE5hTjA1ICAgIE5hTjYxICAgLT4gIE5hTjUKK2Rkc3ViODY2IHN1YnRyYWN0IC1JbmYgICAgIC1OYU43MSAgIC0+IC1OYU43MQorZGRzdWI4Njcgc3VidHJhY3QgLTEwMDAgICAgIE5hTjgxICAgLT4gIE5hTjgxCitkZHN1Yjg2OCBzdWJ0cmFjdCAgMTAwMCAgICAgTmFOOTEgICAtPiAgTmFOOTEKK2Rkc3ViODY5IHN1YnRyYWN0ICBJbmYgICAgICBOYU4xMDEgIC0+ICBOYU4xMDEKK2Rkc3ViODcxIHN1YnRyYWN0ICBzTmFOMDExICAtSW5mICAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODcyIHN1YnRyYWN0ICBzTmFOMDEyICAtMTAwMCAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODczIHN1YnRyYWN0IC1zTmFOMDEzICAgMTAwMCAgIC0+IC1OYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODc0IHN1YnRyYWN0ICBzTmFOMDE0ICAgTmFOMTcxIC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODc1IHN1YnRyYWN0ICBzTmFOMDE1ICBzTmFOMTgxIC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODc2IHN1YnRyYWN0ICBOYU4wMTYgICBzTmFOMTkxIC0+ICBOYU4xOTEgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODc3IHN1YnRyYWN0IC1JbmYgICAgICBzTmFOMjAxIC0+ICBOYU4yMDEgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODc4IHN1YnRyYWN0IC0xMDAwICAgICBzTmFOMjExIC0+ICBOYU4yMTEgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODc5IHN1YnRyYWN0ICAxMDAwICAgIC1zTmFOMjIxIC0+IC1OYU4yMjEgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODgwIHN1YnRyYWN0ICBJbmYgICAgICBzTmFOMjMxIC0+ICBOYU4yMzEgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODgxIHN1YnRyYWN0ICBOYU4wMjUgICBzTmFOMjQxIC0+ICBOYU4yNDEgSW52YWxpZF9vcGVyYXRpb24KKworLS0gZWRnZSBjYXNlIHNwaWxscworZGRzdWI5MDEgc3VidHJhY3QgIDIuRS0zICAxLjAwMiAgLT4gLTEuMDAwCitkZHN1YjkwMiBzdWJ0cmFjdCAgMi4wRS0zICAxLjAwMiAgLT4gLTEuMDAwMAorZGRzdWI5MDMgc3VidHJhY3QgIDIuMDBFLTMgIDEuMDAyMCAgLT4gLTEuMDAwMDAKK2Rkc3ViOTA0IHN1YnRyYWN0ICAyLjAwMEUtMyAgMS4wMDIwMCAgLT4gLTEuMDAwMDAwCitkZHN1YjkwNSBzdWJ0cmFjdCAgMi4wMDAwRS0zICAxLjAwMjAwMCAgLT4gLTEuMDAwMDAwMAorZGRzdWI5MDYgc3VidHJhY3QgIDIuMDAwMDBFLTMgIDEuMDAyMDAwMCAgLT4gLTEuMDAwMDAwMDAKK2Rkc3ViOTA3IHN1YnRyYWN0ICAyLjAwMDAwMEUtMyAgMS4wMDIwMDAwMCAgLT4gLTEuMDAwMDAwMDAwCitkZHN1YjkwOCBzdWJ0cmFjdCAgMi4wMDAwMDAwRS0zICAxLjAwMjAwMDAwMCAgLT4gLTEuMDAwMDAwMDAwMAorCistLSBzdWJub3JtYWxzIGFuZCBvdmVyZmxvd3MgY292ZXJlZCB1bmRlciBBZGQKKworLS0gTnVsbCB0ZXN0cworZGRzdWI5OTkwIHN1YnRyYWN0IDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI5OTkxIHN1YnRyYWN0ICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFRvSW50ZWdyYWwuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRUb0ludGVncmFsLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2ZDYxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRUb0ludGVncmFsLmRlY1Rlc3QKQEAgLTAsMCArMSwyNTcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRUb0ludGVncmFsLmRlY1Rlc3QgLS0gcm91bmQgRG91YmxlIHRvIGludGVncmFsIHZhbHVlICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyB0ZXN0cyB0aGUgZXh0ZW5kZWQgc3BlY2lmaWNhdGlvbiAncm91bmQtdG8taW50ZWdyYWwKKy0tIHZhbHVlLWV4YWN0JyBvcGVyYXRpb25zIChmcm9tIElFRUUgODU0LCBsYXRlciBtb2RpZmllZCBpbiA3NTRyKS4KKy0tIEFsbCBub24temVybyByZXN1bHRzIGFyZSBkZWZpbmVkIGFzIGJlaW5nIHRob3NlIGZyb20gZWl0aGVyIGNvcHkgb3IKKy0tIHF1YW50aXplLCBzbyB0aG9zZSBhcmUgYXNzdW1lZCB0byBoYXZlIGJlZW4gdGVzdGVkIGV4dGVuc2l2ZWx5CistLSBlbHNld2hlcmU7IHRoZSB0ZXN0cyBoZXJlIGFyZSBmb3IgaW50ZWdyaXR5LCByb3VuZGluZyBtb2RlLCBldGMuCistLSBBbHNvLCBpdCBpcyBhc3N1bWVkIHRoZSB0ZXN0IGhhcm5lc3Mgd2lsbCB1c2UgdGhlc2UgdGVzdHMgZm9yIGJvdGgKKy0tIFRvSW50ZWdyYWxFeGFjdCAod2hpY2ggZG9lcyBzZXQgSW5leGFjdCkgYW5kIHRoZSBmaXhlZC1uYW1lCistLSBmdW5jdGlvbnMgKHdoaWNoIGRvIG5vdCBzZXQgSW5leGFjdCkuCisKKy0tIE5vdGUgdGhhdCBkZWNOdW1iZXIgaW1wbGVtZW50cyBhbiBlYXJsaWVyIGRlZmluaXRpb24gb2YgdG9JbnRlZ3JhbAorLS0gd2hpY2ggbmV2ZXIgc2V0cyBJbmV4YWN0OyB0aGUgZGVjVGVzdCBvcGVyYXRvciBmb3IgdGhhdCBpcyBjYWxsZWQKKy0tICd0b2ludGVncmFsJyBpbnN0ZWFkIG9mICd0b2ludGVncmFseCcuCisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkZGludHgwMDEgdG9pbnRlZ3JhbHggICAgICAwICAgICAtPiAgMAorZGRpbnR4MDAyIHRvaW50ZWdyYWx4ICAgICAgMC4wICAgLT4gIDAKK2RkaW50eDAwMyB0b2ludGVncmFseCAgICAgIDAuMSAgIC0+ICAwICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAwNCB0b2ludGVncmFseCAgICAgIDAuMiAgIC0+ICAwICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAwNSB0b2ludGVncmFseCAgICAgIDAuMyAgIC0+ICAwICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAwNiB0b2ludGVncmFseCAgICAgIDAuNCAgIC0+ICAwICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAwNyB0b2ludGVncmFseCAgICAgIDAuNSAgIC0+ICAwICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAwOCB0b2ludGVncmFseCAgICAgIDAuNiAgIC0+ICAxICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAwOSB0b2ludGVncmFseCAgICAgIDAuNyAgIC0+ICAxICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAxMCB0b2ludGVncmFseCAgICAgIDAuOCAgIC0+ICAxICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAxMSB0b2ludGVncmFseCAgICAgIDAuOSAgIC0+ICAxICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAxMiB0b2ludGVncmFseCAgICAgIDEgICAgIC0+ICAxCitkZGludHgwMTMgdG9pbnRlZ3JhbHggICAgICAxLjAgICAtPiAgMSAgUm91bmRlZAorZGRpbnR4MDE0IHRvaW50ZWdyYWx4ICAgICAgMS4xICAgLT4gIDEgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDE1IHRvaW50ZWdyYWx4ICAgICAgMS4yICAgLT4gIDEgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDE2IHRvaW50ZWdyYWx4ICAgICAgMS4zICAgLT4gIDEgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDE3IHRvaW50ZWdyYWx4ICAgICAgMS40ICAgLT4gIDEgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDE4IHRvaW50ZWdyYWx4ICAgICAgMS41ICAgLT4gIDIgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDE5IHRvaW50ZWdyYWx4ICAgICAgMS42ICAgLT4gIDIgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDIwIHRvaW50ZWdyYWx4ICAgICAgMS43ICAgLT4gIDIgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDIxIHRvaW50ZWdyYWx4ICAgICAgMS44ICAgLT4gIDIgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDIyIHRvaW50ZWdyYWx4ICAgICAgMS45ICAgLT4gIDIgIEluZXhhY3QgUm91bmRlZAorLS0gbmVnYXRpdmVzCitkZGludHgwMzEgdG9pbnRlZ3JhbHggICAgIC0wICAgICAtPiAtMAorZGRpbnR4MDMyIHRvaW50ZWdyYWx4ICAgICAtMC4wICAgLT4gLTAKK2RkaW50eDAzMyB0b2ludGVncmFseCAgICAgLTAuMSAgIC0+IC0wICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAzNCB0b2ludGVncmFseCAgICAgLTAuMiAgIC0+IC0wICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAzNSB0b2ludGVncmFseCAgICAgLTAuMyAgIC0+IC0wICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAzNiB0b2ludGVncmFseCAgICAgLTAuNCAgIC0+IC0wICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAzNyB0b2ludGVncmFseCAgICAgLTAuNSAgIC0+IC0wICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAzOCB0b2ludGVncmFseCAgICAgLTAuNiAgIC0+IC0xICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAzOSB0b2ludGVncmFseCAgICAgLTAuNyAgIC0+IC0xICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA0MCB0b2ludGVncmFseCAgICAgLTAuOCAgIC0+IC0xICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA0MSB0b2ludGVncmFseCAgICAgLTAuOSAgIC0+IC0xICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA0MiB0b2ludGVncmFseCAgICAgLTEgICAgIC0+IC0xCitkZGludHgwNDMgdG9pbnRlZ3JhbHggICAgIC0xLjAgICAtPiAtMSAgUm91bmRlZAorZGRpbnR4MDQ0IHRvaW50ZWdyYWx4ICAgICAtMS4xICAgLT4gLTEgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDQ1IHRvaW50ZWdyYWx4ICAgICAtMS4yICAgLT4gLTEgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDQ2IHRvaW50ZWdyYWx4ICAgICAtMS4zICAgLT4gLTEgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDQ3IHRvaW50ZWdyYWx4ICAgICAtMS40ICAgLT4gLTEgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDQ4IHRvaW50ZWdyYWx4ICAgICAtMS41ICAgLT4gLTIgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDQ5IHRvaW50ZWdyYWx4ICAgICAtMS42ICAgLT4gLTIgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDUwIHRvaW50ZWdyYWx4ICAgICAtMS43ICAgLT4gLTIgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDUxIHRvaW50ZWdyYWx4ICAgICAtMS44ICAgLT4gLTIgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDUyIHRvaW50ZWdyYWx4ICAgICAtMS45ICAgLT4gLTIgIEluZXhhY3QgUm91bmRlZAorLS0gbmV4dCB0d28gd291bGQgYmUgTmFOIHVzaW5nIHF1YW50aXplKHgsIDApCitkZGludHgwNTMgdG9pbnRlZ3JhbHggICAgMTBFKzYwICAtPiAxLjBFKzYxCitkZGludHgwNTQgdG9pbnRlZ3JhbHggICAtMTBFKzYwICAtPiAtMS4wRSs2MQorCistLSBudW1iZXJzIGFyb3VuZCBwcmVjaXNpb24KK2RkaW50eDA2MCB0b2ludGVncmFseCAnNTYyNjdFLTE3JyAgIC0+ICcwJyAgICAgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDYxIHRvaW50ZWdyYWx4ICc1NjI2N0UtNScgICAgLT4gJzEnICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwNjIgdG9pbnRlZ3JhbHggJzU2MjY3RS0yJyAgICAtPiAnNTYzJyAgICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA2MyB0b2ludGVncmFseCAnNTYyNjdFLTEnICAgIC0+ICc1NjI3JyAgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDY1IHRvaW50ZWdyYWx4ICc1NjI2N0UtMCcgICAgLT4gJzU2MjY3JworZGRpbnR4MDY2IHRvaW50ZWdyYWx4ICc1NjI2N0UrMCcgICAgLT4gJzU2MjY3JworZGRpbnR4MDY3IHRvaW50ZWdyYWx4ICc1NjI2N0UrMScgICAgLT4gJzUuNjI2N0UrNScKK2RkaW50eDA2OCB0b2ludGVncmFseCAnNTYyNjdFKzknICAgIC0+ICc1LjYyNjdFKzEzJworZGRpbnR4MDY5IHRvaW50ZWdyYWx4ICc1NjI2N0UrMTAnICAgLT4gJzUuNjI2N0UrMTQnCitkZGludHgwNzAgdG9pbnRlZ3JhbHggJzU2MjY3RSsxMScgICAtPiAnNS42MjY3RSsxNScKK2RkaW50eDA3MSB0b2ludGVncmFseCAnNTYyNjdFKzEyJyAgIC0+ICc1LjYyNjdFKzE2JworZGRpbnR4MDcyIHRvaW50ZWdyYWx4ICc1NjI2N0UrMTMnICAgLT4gJzUuNjI2N0UrMTcnCitkZGludHgwNzMgdG9pbnRlZ3JhbHggJzEuMjNFKzk2JyAgICAtPiAnMS4yM0UrOTYnCitkZGludHgwNzQgdG9pbnRlZ3JhbHggJzEuMjNFKzM4NCcgICAtPiAjNDdmZDMwMDAwMDAwMDAwMCAgQ2xhbXBlZAorCitkZGludHgwODAgdG9pbnRlZ3JhbHggJy01NjI2N0UtMTAnICAtPiAnLTAnICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwODEgdG9pbnRlZ3JhbHggJy01NjI2N0UtNScgICAtPiAnLTEnICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwODIgdG9pbnRlZ3JhbHggJy01NjI2N0UtMicgICAtPiAnLTU2MycgICAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwODMgdG9pbnRlZ3JhbHggJy01NjI2N0UtMScgICAtPiAnLTU2MjcnICAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwODUgdG9pbnRlZ3JhbHggJy01NjI2N0UtMCcgICAtPiAnLTU2MjY3JworZGRpbnR4MDg2IHRvaW50ZWdyYWx4ICctNTYyNjdFKzAnICAgLT4gJy01NjI2NycKK2RkaW50eDA4NyB0b2ludGVncmFseCAnLTU2MjY3RSsxJyAgIC0+ICctNS42MjY3RSs1JworZGRpbnR4MDg4IHRvaW50ZWdyYWx4ICctNTYyNjdFKzknICAgLT4gJy01LjYyNjdFKzEzJworZGRpbnR4MDg5IHRvaW50ZWdyYWx4ICctNTYyNjdFKzEwJyAgLT4gJy01LjYyNjdFKzE0JworZGRpbnR4MDkwIHRvaW50ZWdyYWx4ICctNTYyNjdFKzExJyAgLT4gJy01LjYyNjdFKzE1JworZGRpbnR4MDkxIHRvaW50ZWdyYWx4ICctNTYyNjdFKzEyJyAgLT4gJy01LjYyNjdFKzE2JworZGRpbnR4MDkyIHRvaW50ZWdyYWx4ICctNTYyNjdFKzEzJyAgLT4gJy01LjYyNjdFKzE3JworZGRpbnR4MDkzIHRvaW50ZWdyYWx4ICctMS4yM0UrOTYnICAgLT4gJy0xLjIzRSs5NicKK2RkaW50eDA5NCB0b2ludGVncmFseCAnLTEuMjNFKzM4NCcgIC0+ICNjN2ZkMzAwMDAwMDAwMDAwICBDbGFtcGVkCisKKy0tIHN1Ym5vcm1hbCBpbnB1dHMKK2RkaW50eDEwMCB0b2ludGVncmFseCAgICAgICAgMUUtMjk5IC0+IDAgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MTAxIHRvaW50ZWdyYWx4ICAgICAgMC4xRS0yOTkgLT4gMCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgxMDIgdG9pbnRlZ3JhbHggICAgIDAuMDFFLTI5OSAtPiAwICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDEwMyB0b2ludGVncmFseCAgICAgICAgMEUtMjk5IC0+IDAKKworLS0gc3BlY2lhbHMgYW5kIHplcm9zCitkZGludHgxMjAgdG9pbnRlZ3JhbHggJ0luZicgICAgICAgLT4gIEluZmluaXR5CitkZGludHgxMjEgdG9pbnRlZ3JhbHggJy1JbmYnICAgICAgLT4gLUluZmluaXR5CitkZGludHgxMjIgdG9pbnRlZ3JhbHggICBOYU4gICAgICAgLT4gIE5hTgorZGRpbnR4MTIzIHRvaW50ZWdyYWx4ICBzTmFOICAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGludHgxMjQgdG9pbnRlZ3JhbHggICAgIDAgICAgICAgLT4gIDAKK2RkaW50eDEyNSB0b2ludGVncmFseCAgICAtMCAgICAgICAtPiAtMAorZGRpbnR4MTI2IHRvaW50ZWdyYWx4ICAgICAwLjAwMCAgIC0+ICAwCitkZGludHgxMjcgdG9pbnRlZ3JhbHggICAgIDAuMDAgICAgLT4gIDAKK2RkaW50eDEyOCB0b2ludGVncmFseCAgICAgMC4wICAgICAtPiAgMAorZGRpbnR4MTI5IHRvaW50ZWdyYWx4ICAgICAwICAgICAgIC0+ICAwCitkZGludHgxMzAgdG9pbnRlZ3JhbHggICAgIDBFLTMgICAgLT4gIDAKK2RkaW50eDEzMSB0b2ludGVncmFseCAgICAgMEUtMiAgICAtPiAgMAorZGRpbnR4MTMyIHRvaW50ZWdyYWx4ICAgICAwRS0xICAgIC0+ICAwCitkZGludHgxMzMgdG9pbnRlZ3JhbHggICAgIDBFLTAgICAgLT4gIDAKK2RkaW50eDEzNCB0b2ludGVncmFseCAgICAgMEUrMSAgICAtPiAgMEUrMQorZGRpbnR4MTM1IHRvaW50ZWdyYWx4ICAgICAwRSsyICAgIC0+ICAwRSsyCitkZGludHgxMzYgdG9pbnRlZ3JhbHggICAgIDBFKzMgICAgLT4gIDBFKzMKK2RkaW50eDEzNyB0b2ludGVncmFseCAgICAgMEUrNCAgICAtPiAgMEUrNAorZGRpbnR4MTM4IHRvaW50ZWdyYWx4ICAgICAwRSs1ICAgIC0+ICAwRSs1CitkZGludHgxMzkgdG9pbnRlZ3JhbHggICAgLTAuMDAwICAgLT4gLTAKK2RkaW50eDE0MCB0b2ludGVncmFseCAgICAtMC4wMCAgICAtPiAtMAorZGRpbnR4MTQxIHRvaW50ZWdyYWx4ICAgIC0wLjAgICAgIC0+IC0wCitkZGludHgxNDIgdG9pbnRlZ3JhbHggICAgLTAgICAgICAgLT4gLTAKK2RkaW50eDE0MyB0b2ludGVncmFseCAgICAtMEUtMyAgICAtPiAtMAorZGRpbnR4MTQ0IHRvaW50ZWdyYWx4ICAgIC0wRS0yICAgIC0+IC0wCitkZGludHgxNDUgdG9pbnRlZ3JhbHggICAgLTBFLTEgICAgLT4gLTAKK2RkaW50eDE0NiB0b2ludGVncmFseCAgICAtMEUtMCAgICAtPiAtMAorZGRpbnR4MTQ3IHRvaW50ZWdyYWx4ICAgIC0wRSsxICAgIC0+IC0wRSsxCitkZGludHgxNDggdG9pbnRlZ3JhbHggICAgLTBFKzIgICAgLT4gLTBFKzIKK2RkaW50eDE0OSB0b2ludGVncmFseCAgICAtMEUrMyAgICAtPiAtMEUrMworZGRpbnR4MTUwIHRvaW50ZWdyYWx4ICAgIC0wRSs0ICAgIC0+IC0wRSs0CitkZGludHgxNTEgdG9pbnRlZ3JhbHggICAgLTBFKzUgICAgLT4gLTBFKzUKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RkaW50eDE1MiB0b2ludGVncmFseCAgIE5hTjgwOCAgICAtPiAgTmFOODA4CitkZGludHgxNTMgdG9pbnRlZ3JhbHggIHNOYU4wODAgICAgLT4gIE5hTjgwICBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnR4MTU0IHRvaW50ZWdyYWx4ICAtTmFOODA4ICAgIC0+IC1OYU44MDgKK2RkaW50eDE1NSB0b2ludGVncmFseCAtc05hTjA4MCAgICAtPiAtTmFOODAgIEludmFsaWRfb3BlcmF0aW9uCitkZGludHgxNTYgdG9pbnRlZ3JhbHggIC1OYU4gICAgICAgLT4gLU5hTgorZGRpbnR4MTU3IHRvaW50ZWdyYWx4IC1zTmFOICAgICAgIC0+IC1OYU4gICAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gZXhhbXBsZXMKK3JvdW5kaW5nOiAgICBoYWxmX3VwCitkZGludHgyMDAgdG9pbnRlZ3JhbHggICAgIDIuMSAgICAtPiAyICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMDEgdG9pbnRlZ3JhbHggICAxMDAgICAgICAtPiAxMDAKK2RkaW50eDIwMiB0b2ludGVncmFseCAgIDEwMC4wICAgIC0+IDEwMCAgICAgICAgICBSb3VuZGVkCitkZGludHgyMDMgdG9pbnRlZ3JhbHggICAxMDEuNSAgICAtPiAxMDIgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMDQgdG9pbnRlZ3JhbHggIC0xMDEuNSAgICAtPiAtMTAyICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMDUgdG9pbnRlZ3JhbHggICAxMEUrNSAgICAtPiAxLjBFKzYKK2RkaW50eDIwNiB0b2ludGVncmFseCAgNy44OUUrNzcgIC0+IDcuODlFKzc3CitkZGludHgyMDcgdG9pbnRlZ3JhbHggICAtSW5mICAgICAtPiAtSW5maW5pdHkKKworCistLSBhbGwgcm91bmRpbmcgbW9kZXMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK2RkaW50eDIxMCB0b2ludGVncmFseCAgICAgNTUuNSAgIC0+ICA1NiAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMTEgdG9pbnRlZ3JhbHggICAgIDU2LjUgICAtPiAgNTYgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjEyIHRvaW50ZWdyYWx4ICAgICA1Ny41ICAgLT4gIDU4ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDIxMyB0b2ludGVncmFseCAgICAtNTUuNSAgIC0+IC01NiAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMTQgdG9pbnRlZ3JhbHggICAgLTU2LjUgICAtPiAtNTYgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjE1IHRvaW50ZWdyYWx4ICAgIC01Ny41ICAgLT4gLTU4ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGhhbGZfdXAKKworZGRpbnR4MjIwIHRvaW50ZWdyYWx4ICAgICA1NS41ICAgLT4gIDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDIyMSB0b2ludGVncmFseCAgICAgNTYuNSAgIC0+ICA1NyAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMjIgdG9pbnRlZ3JhbHggICAgIDU3LjUgICAtPiAgNTggIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjIzIHRvaW50ZWdyYWx4ICAgIC01NS41ICAgLT4gLTU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDIyNCB0b2ludGVncmFseCAgICAtNTYuNSAgIC0+IC01NyAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMjUgdG9pbnRlZ3JhbHggICAgLTU3LjUgICAtPiAtNTggIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgaGFsZl9kb3duCisKK2RkaW50eDIzMCB0b2ludGVncmFseCAgICAgNTUuNSAgIC0+ICA1NSAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMzEgdG9pbnRlZ3JhbHggICAgIDU2LjUgICAtPiAgNTYgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjMyIHRvaW50ZWdyYWx4ICAgICA1Ny41ICAgLT4gIDU3ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDIzMyB0b2ludGVncmFseCAgICAtNTUuNSAgIC0+IC01NSAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMzQgdG9pbnRlZ3JhbHggICAgLTU2LjUgICAtPiAtNTYgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjM1IHRvaW50ZWdyYWx4ICAgIC01Ny41ICAgLT4gLTU3ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIHVwCisKK2RkaW50eDI0MCB0b2ludGVncmFseCAgICAgNTUuMyAgIC0+ICA1NiAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNDEgdG9pbnRlZ3JhbHggICAgIDU2LjMgICAtPiAgNTcgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjQyIHRvaW50ZWdyYWx4ICAgICA1Ny4zICAgLT4gIDU4ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI0MyB0b2ludGVncmFseCAgICAtNTUuMyAgIC0+IC01NiAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNDQgdG9pbnRlZ3JhbHggICAgLTU2LjMgICAtPiAtNTcgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjQ1IHRvaW50ZWdyYWx4ICAgIC01Ny4zICAgLT4gLTU4ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGRvd24KKworZGRpbnR4MjUwIHRvaW50ZWdyYWx4ICAgICA1NS43ICAgLT4gIDU1ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI1MSB0b2ludGVncmFseCAgICAgNTYuNyAgIC0+ICA1NiAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNTIgdG9pbnRlZ3JhbHggICAgIDU3LjcgICAtPiAgNTcgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjUzIHRvaW50ZWdyYWx4ICAgIC01NS43ICAgLT4gLTU1ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI1NCB0b2ludGVncmFseCAgICAtNTYuNyAgIC0+IC01NiAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNTUgdG9pbnRlZ3JhbHggICAgLTU3LjcgICAtPiAtNTcgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgY2VpbGluZworCitkZGludHgyNjAgdG9pbnRlZ3JhbHggICAgIDU1LjMgICAtPiAgNTYgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjYxIHRvaW50ZWdyYWx4ICAgICA1Ni4zICAgLT4gIDU3ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI2MiB0b2ludGVncmFseCAgICAgNTcuMyAgIC0+ICA1OCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNjMgdG9pbnRlZ3JhbHggICAgLTU1LjMgICAtPiAtNTUgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjY0IHRvaW50ZWdyYWx4ICAgIC01Ni4zICAgLT4gLTU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI2NSB0b2ludGVncmFseCAgICAtNTcuMyAgIC0+IC01NyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBmbG9vcgorCitkZGludHgyNzAgdG9pbnRlZ3JhbHggICAgIDU1LjcgICAtPiAgNTUgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjcxIHRvaW50ZWdyYWx4ICAgICA1Ni43ICAgLT4gIDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI3MiB0b2ludGVncmFseCAgICAgNTcuNyAgIC0+ICA1NyAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNzMgdG9pbnRlZ3JhbHggICAgLTU1LjcgICAtPiAtNTYgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4Mjc0IHRvaW50ZWdyYWx4ICAgIC01Ni43ICAgLT4gLTU3ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI3NSB0b2ludGVncmFseCAgICAtNTcuNyAgIC0+IC01OCAgSW5leGFjdCBSb3VuZGVkCisKKy0tIEludCBhbmQgdUludDMyIGVkZ2UgdmFsdWVzIGZvciB0ZXN0aW5nIGNvbnZlcnNpb25zCitkZGludHgzMDAgdG9pbnRlZ3JhbHggLTIxNDc0ODM2NDYgIC0+IC0yMTQ3NDgzNjQ2CitkZGludHgzMDEgdG9pbnRlZ3JhbHggLTIxNDc0ODM2NDcgIC0+IC0yMTQ3NDgzNjQ3CitkZGludHgzMDIgdG9pbnRlZ3JhbHggLTIxNDc0ODM2NDggIC0+IC0yMTQ3NDgzNjQ4CitkZGludHgzMDMgdG9pbnRlZ3JhbHggLTIxNDc0ODM2NDkgIC0+IC0yMTQ3NDgzNjQ5CitkZGludHgzMDQgdG9pbnRlZ3JhbHggIDIxNDc0ODM2NDYgIC0+ICAyMTQ3NDgzNjQ2CitkZGludHgzMDUgdG9pbnRlZ3JhbHggIDIxNDc0ODM2NDcgIC0+ICAyMTQ3NDgzNjQ3CitkZGludHgzMDYgdG9pbnRlZ3JhbHggIDIxNDc0ODM2NDggIC0+ICAyMTQ3NDgzNjQ4CitkZGludHgzMDcgdG9pbnRlZ3JhbHggIDIxNDc0ODM2NDkgIC0+ICAyMTQ3NDgzNjQ5CitkZGludHgzMDggdG9pbnRlZ3JhbHggIDQyOTQ5NjcyOTQgIC0+ICA0Mjk0OTY3Mjk0CitkZGludHgzMDkgdG9pbnRlZ3JhbHggIDQyOTQ5NjcyOTUgIC0+ICA0Mjk0OTY3Mjk1CitkZGludHgzMTAgdG9pbnRlZ3JhbHggIDQyOTQ5NjcyOTYgIC0+ICA0Mjk0OTY3Mjk2CitkZGludHgzMTEgdG9pbnRlZ3JhbHggIDQyOTQ5NjcyOTcgIC0+ICA0Mjk0OTY3Mjk3CisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRYb3IuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRYb3IuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzFjN2ViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFhvci5kZWNUZXN0CkBAIC0wLDAgKzEsMzM3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkWG9yLmRlY1Rlc3QgLS0gZGlnaXR3aXNlIGxvZ2ljYWwgWE9SIGZvciBkZWNEb3VibGVzICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjayAodHJ1dGggdGFibGUpCitkZHhvcjAwMSB4b3IgICAgICAgICAgICAgMCAgICAwIC0+ICAgIDAKK2RkeG9yMDAyIHhvciAgICAgICAgICAgICAwICAgIDEgLT4gICAgMQorZGR4b3IwMDMgeG9yICAgICAgICAgICAgIDEgICAgMCAtPiAgICAxCitkZHhvcjAwNCB4b3IgICAgICAgICAgICAgMSAgICAxIC0+ICAgIDAKK2RkeG9yMDA1IHhvciAgICAgICAgICAxMTAwIDEwMTAgLT4gIDExMAorLS0gYW5kIGF0IG1zZCBhbmQgbXNkLTEKK2RkeG9yMDA2IHhvciAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgIDAKK2RkeG9yMDA3IHhvciAwMDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gICAxMDAwMDAwMDAwMDAwMDAwCitkZHhvcjAwOCB4b3IgMTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwMDAwMDAwMAorZGR4b3IwMDkgeG9yIDEwMDAwMDAwMDAwMDAwMDAgMTAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorZGR4b3IwMTAgeG9yIDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorZGR4b3IwMTEgeG9yIDAwMDAwMDAwMDAwMDAwMDAgMDEwMDAwMDAwMDAwMDAwMCAtPiAgICAxMDAwMDAwMDAwMDAwMDAKK2RkeG9yMDEyIHhvciAwMTAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgMTAwMDAwMDAwMDAwMDAwCitkZHhvcjAxMyB4b3IgMDEwMDAwMDAwMDAwMDAwMCAwMTAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCisKKy0tIFZhcmlvdXMgbGVuZ3RocworLS0gICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAxMjM0NTY3ODkwMTIzNDU2CitkZHhvcjAyMSB4b3IgMTExMTExMTExMDAwMDAwMCAgICAgMTExMTExMTExMDAwMDAwMCAgLT4gIDAKK2RkeG9yMDIyIHhvciAgMTExMTExMTEwMDAwMDAwICAgICAgMTExMTExMTEwMDAwMDAwICAtPiAgMAorZGR4b3IwMjMgeG9yICAgMTExMTExMTAwMDAwMDAgICAgICAgMTExMTExMTAwMDAwMDAgIC0+ICAwCitkZHhvcjAyNCB4b3IgICAgMTExMTExMDAwMDAwMCAgICAgICAgMTExMTExMDAwMDAwMCAgLT4gIDAKK2RkeG9yMDI1IHhvciAgICAgMTExMTEwMDAwMDAwICAgICAgICAgMTExMTEwMDAwMDAwICAtPiAgMAorZGR4b3IwMjYgeG9yICAgICAgMTExMTAwMDAwMDAgICAgICAgICAgMTExMTAwMDAwMDAgIC0+ICAwCitkZHhvcjAyNyB4b3IgICAgICAgMTExMDAwMDAwMCAgICAgICAgICAgMTExMDAwMDAwMCAgLT4gIDAKK2RkeG9yMDI4IHhvciAgICAgICAgMTEwMDAwMDAwICAgICAgICAgICAgMTEwMDAwMDAwICAtPiAgMAorZGR4b3IwMjkgeG9yICAgICAgICAgMTAwMDAwMDAgICAgICAgICAgICAgMTAwMDAwMDAgIC0+ICAwCitkZHhvcjAzMCB4b3IgICAgICAgICAgMTAwMDAwMCAgICAgICAgICAgICAgMTAwMDAwMCAgLT4gIDAKK2RkeG9yMDMxIHhvciAgICAgICAgICAgMTAwMDAwICAgICAgICAgICAgICAgMTAwMDAwICAtPiAgMAorZGR4b3IwMzIgeG9yICAgICAgICAgICAgMTAwMDAgICAgICAgICAgICAgICAgMTAwMDAgIC0+ICAwCitkZHhvcjAzMyB4b3IgICAgICAgICAgICAgMTAwMCAgICAgICAgICAgICAgICAgMTAwMCAgLT4gIDAKK2RkeG9yMDM0IHhvciAgICAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgICAgMTAwICAtPiAgMAorZGR4b3IwMzUgeG9yICAgICAgICAgICAgICAgMTAgICAgICAgICAgICAgICAgICAgMTAgIC0+ICAwCitkZHhvcjAzNiB4b3IgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgMSAgLT4gIDAKKworZGR4b3IwNDAgeG9yIDExMTExMTExMSAgMTExMTExMTExMTExICAtPiAgMTExMDAwMDAwMDAwCitkZHhvcjA0MSB4b3IgIDExMTExMTExICAxMTExMTExMTExMTEgIC0+ICAxMTExMDAwMDAwMDAKK2RkeG9yMDQyIHhvciAgMTExMTExMTEgICAgIDExMTExMTExMSAgLT4gIDEwMDAwMDAwMAorZGR4b3IwNDMgeG9yICAgMTExMTExMSAgICAgMTAwMDAwMDEwICAtPiAgMTAxMTExMTAxCitkZHhvcjA0NCB4b3IgICAgMTExMTExICAgICAxMDAwMDAxMDAgIC0+ICAxMDAxMTEwMTEKK2RkeG9yMDQ1IHhvciAgICAgMTExMTEgICAgIDEwMDAwMTAwMCAgLT4gIDEwMDAxMDExMQorZGR4b3IwNDYgeG9yICAgICAgMTExMSAgICAgMTAwMDEwMDAwICAtPiAgMTAwMDExMTExCitkZHhvcjA0NyB4b3IgICAgICAgMTExICAgICAxMDAxMDAwMDAgIC0+ICAxMDAxMDAxMTEKK2RkeG9yMDQ4IHhvciAgICAgICAgMTEgICAgIDEwMTAwMDAwMCAgLT4gIDEwMTAwMDAxMQorZGR4b3IwNDkgeG9yICAgICAgICAgMSAgICAgMTEwMDAwMDAwICAtPiAgMTEwMDAwMDAxCisKK2RkeG9yMDUwIHhvciAxMTExMTExMTExICAxICAtPiAgMTExMTExMTExMAorZGR4b3IwNTEgeG9yICAxMTExMTExMTEgIDEgIC0+ICAxMTExMTExMTAKK2RkeG9yMDUyIHhvciAgIDExMTExMTExICAxICAtPiAgMTExMTExMTAKK2RkeG9yMDUzIHhvciAgICAxMTExMTExICAxICAtPiAgMTExMTExMAorZGR4b3IwNTQgeG9yICAgICAxMTExMTEgIDEgIC0+ICAxMTExMTAKK2RkeG9yMDU1IHhvciAgICAgIDExMTExICAxICAtPiAgMTExMTAKK2RkeG9yMDU2IHhvciAgICAgICAxMTExICAxICAtPiAgMTExMAorZGR4b3IwNTcgeG9yICAgICAgICAxMTEgIDEgIC0+ICAxMTAKK2RkeG9yMDU4IHhvciAgICAgICAgIDExICAxICAtPiAgMTAKK2RkeG9yMDU5IHhvciAgICAgICAgICAxICAxICAtPiAgMAorCitkZHhvcjA2MCB4b3IgMTExMTExMTExMSAgMCAgLT4gIDExMTExMTExMTEKK2RkeG9yMDYxIHhvciAgMTExMTExMTExICAwICAtPiAgMTExMTExMTExCitkZHhvcjA2MiB4b3IgICAxMTExMTExMSAgMCAgLT4gIDExMTExMTExCitkZHhvcjA2MyB4b3IgICAgMTExMTExMSAgMCAgLT4gIDExMTExMTEKK2RkeG9yMDY0IHhvciAgICAgMTExMTExICAwICAtPiAgMTExMTExCitkZHhvcjA2NSB4b3IgICAgICAxMTExMSAgMCAgLT4gIDExMTExCitkZHhvcjA2NiB4b3IgICAgICAgMTExMSAgMCAgLT4gIDExMTEKK2RkeG9yMDY3IHhvciAgICAgICAgMTExICAwICAtPiAgMTExCitkZHhvcjA2OCB4b3IgICAgICAgICAxMSAgMCAgLT4gIDExCitkZHhvcjA2OSB4b3IgICAgICAgICAgMSAgMCAgLT4gIDEKKworZGR4b3IwNzAgeG9yIDEgIDExMTExMTExMTEgIC0+ICAxMTExMTExMTEwCitkZHhvcjA3MSB4b3IgMSAgIDExMTExMTExMSAgLT4gIDExMTExMTExMAorZGR4b3IwNzIgeG9yIDEgICAgMTExMTExMTEgIC0+ICAxMTExMTExMAorZGR4b3IwNzMgeG9yIDEgICAgIDExMTExMTEgIC0+ICAxMTExMTEwCitkZHhvcjA3NCB4b3IgMSAgICAgIDExMTExMSAgLT4gIDExMTExMAorZGR4b3IwNzUgeG9yIDEgICAgICAgMTExMTEgIC0+ICAxMTExMAorZGR4b3IwNzYgeG9yIDEgICAgICAgIDExMTEgIC0+ICAxMTEwCitkZHhvcjA3NyB4b3IgMSAgICAgICAgIDExMSAgLT4gIDExMAorZGR4b3IwNzggeG9yIDEgICAgICAgICAgMTEgIC0+ICAxMAorZGR4b3IwNzkgeG9yIDEgICAgICAgICAgIDEgIC0+ICAwCisKK2RkeG9yMDgwIHhvciAwICAxMTExMTExMTExICAtPiAgMTExMTExMTExMQorZGR4b3IwODEgeG9yIDAgICAxMTExMTExMTEgIC0+ICAxMTExMTExMTEKK2RkeG9yMDgyIHhvciAwICAgIDExMTExMTExICAtPiAgMTExMTExMTEKK2RkeG9yMDgzIHhvciAwICAgICAxMTExMTExICAtPiAgMTExMTExMQorZGR4b3IwODQgeG9yIDAgICAgICAxMTExMTEgIC0+ICAxMTExMTEKK2RkeG9yMDg1IHhvciAwICAgICAgIDExMTExICAtPiAgMTExMTEKK2RkeG9yMDg2IHhvciAwICAgICAgICAxMTExICAtPiAgMTExMQorZGR4b3IwODcgeG9yIDAgICAgICAgICAxMTEgIC0+ICAxMTEKK2RkeG9yMDg4IHhvciAwICAgICAgICAgIDExICAtPiAgMTEKK2RkeG9yMDg5IHhvciAwICAgICAgICAgICAxICAtPiAgMQorCitkZHhvcjA5MCB4b3IgMDExMTExMTExICAxMTExMDExMTEgIC0+ICAxMDAwMTAwMDAKK2RkeG9yMDkxIHhvciAxMDExMTExMTEgIDExMTEwMTExMSAgLT4gICAxMDAxMDAwMAorZGR4b3IwOTIgeG9yIDExMDExMTExMSAgMTExMTAxMTExICAtPiAgICAxMDEwMDAwCitkZHhvcjA5MyB4b3IgMTExMDExMTExICAxMTExMDExMTEgIC0+ICAgICAxMTAwMDAKK2RkeG9yMDk0IHhvciAxMTExMDExMTEgIDExMTEwMTExMSAgLT4gICAgICAgICAgMAorZGR4b3IwOTUgeG9yIDExMTExMDExMSAgMTExMTAxMTExICAtPiAgICAgIDExMDAwCitkZHhvcjA5NiB4b3IgMTExMTExMDExICAxMTExMDExMTEgIC0+ICAgICAgMTAxMDAKK2RkeG9yMDk3IHhvciAxMTExMTExMDEgIDExMTEwMTExMSAgLT4gICAgICAxMDAxMAorZGR4b3IwOTggeG9yIDExMTExMTExMCAgMTExMTAxMTExICAtPiAgICAgIDEwMDAxCisKK2RkeG9yMTAwIHhvciAxMTExMDExMTEgIDAxMTExMTExMSAgLT4gIDEwMDAxMDAwMAorZGR4b3IxMDEgeG9yIDExMTEwMTExMSAgMTAxMTExMTExICAtPiAgIDEwMDEwMDAwCitkZHhvcjEwMiB4b3IgMTExMTAxMTExICAxMTAxMTExMTEgIC0+ICAgIDEwMTAwMDAKK2RkeG9yMTAzIHhvciAxMTExMDExMTEgIDExMTAxMTExMSAgLT4gICAgIDExMDAwMAorZGR4b3IxMDQgeG9yIDExMTEwMTExMSAgMTExMTAxMTExICAtPiAgICAgICAgICAwCitkZHhvcjEwNSB4b3IgMTExMTAxMTExICAxMTExMTAxMTEgIC0+ICAgICAgMTEwMDAKK2RkeG9yMTA2IHhvciAxMTExMDExMTEgIDExMTExMTAxMSAgLT4gICAgICAxMDEwMAorZGR4b3IxMDcgeG9yIDExMTEwMTExMSAgMTExMTExMTAxICAtPiAgICAgIDEwMDEwCitkZHhvcjEwOCB4b3IgMTExMTAxMTExICAxMTExMTExMTAgIC0+ICAgICAgMTAwMDEKKworLS0gbm9uLTAvMSBzaG91bGQgbm90IGJlIGFjY2VwdGVkLCBub3Igc2hvdWxkIHNpZ25zCitkZHhvcjIyMCB4b3IgMTExMTExMTEyICAxMTExMTExMTEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjIxIHhvciAzMzMzMzMzMzMgIDMzMzMzMzMzMyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyMjIgeG9yIDU1NTU1NTU1NSAgNTU1NTU1NTU1ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjIyMyB4b3IgNzc3Nzc3Nzc3ICA3Nzc3Nzc3NzcgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjI0IHhvciA5OTk5OTk5OTkgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyMjUgeG9yIDIyMjIyMjIyMiAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjIyNiB4b3IgNDQ0NDQ0NDQ0ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjI3IHhvciA2NjY2NjY2NjYgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyMjggeG9yIDg4ODg4ODg4OCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjIyOSB4b3IgOTk5OTk5OTk5ICAyMjIyMjIyMjIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjMwIHhvciA5OTk5OTk5OTkgIDQ0NDQ0NDQ0NCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyMzEgeG9yIDk5OTk5OTk5OSAgNjY2NjY2NjY2ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjIzMiB4b3IgOTk5OTk5OTk5ICA4ODg4ODg4ODggIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGEgZmV3IHJhbmRvbXMKK2RkeG9yMjQwIHhvciAgNTY3NDY4Njg5IC05MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNDEgeG9yICA1NjczNjc2ODkgIDkzNDk4MTk0MiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI0MiB4b3IgLTYzMTkxNzc3MiAtNzA2MDE0NjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjQzIHhvciAtNzU2MjUzMjU3ICAxMzg1NzkyMzQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNDQgeG9yICA4MzU1OTAxNDkgIDU2NzQzNTQwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRAorZGR4b3IyNTAgeG9yICAyMDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNTEgeG9yICA3MDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNTIgeG9yICA4MDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNTMgeG9yICA5MDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNTQgeG9yICAyMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNTUgeG9yICA3MDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNTYgeG9yICA4MDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNTcgeG9yICA5MDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNTggeG9yICAxMDAwMDAwMDAwMDAwMDAwIDIwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNTkgeG9yICAxMDAwMDAwMDAwMDAwMDAwIDcwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNjAgeG9yICAxMDAwMDAwMDAwMDAwMDAwIDgwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNjEgeG9yICAxMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNjIgeG9yICAwMDAwMDAwMDAwMDAwMDAwIDIwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNjMgeG9yICAwMDAwMDAwMDAwMDAwMDAwIDcwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNjQgeG9yICAwMDAwMDAwMDAwMDAwMDAwIDgwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNjUgeG9yICAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QtMQorZGR4b3IyNzAgeG9yICAwMjAwMDAxMDAwMDAwMDAwIDEwMDAxMDAwMDAwMDAwMTAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNzEgeG9yICAwNzAwMDAwMTAwMDAwMDAwIDEwMDAwMTAwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNzIgeG9yICAwODAwMDAwMDEwMDAwMDAwIDEwMDAwMDEwMDAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNzMgeG9yICAwOTAwMDAwMDAxMDAwMDAwIDEwMDAwMDAxMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNzQgeG9yICAxMDAwMDAwMDAwMTAwMDAwIDAyMDAwMDAwMTAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNzUgeG9yICAxMDAwMDAwMDAwMDEwMDAwIDA3MDAwMDAwMDEwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNzYgeG9yICAxMDAwMDAwMDAwMDAxMDAwIDA4MDAwMDAwMTAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNzcgeG9yICAxMDAwMDAwMDAwMDAwMTAwIDA5MDAwMDAwMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBMU0QKK2RkeG9yMjgwIHhvciAgMDAxMDAwMDAwMDAwMDAwMiAxMDAwMDAwMTAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjgxIHhvciAgMDAwMTAwMDAwMDAwMDAwNyAxMDAwMDAxMDAwMDAwMDExIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjgyIHhvciAgMDAwMDEwMDAwMDAwMDAwOCAxMDAwMDEwMDAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjgzIHhvciAgMDAwMDAxMDAwMDAwMDAwOSAxMDAwMTAwMDAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjg0IHhvciAgMTAwMDAwMTAwMDAwMDAwMCAwMDAxMDAwMDAwMDAwMDAyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjg1IHhvciAgMTAwMDAwMDEwMDAwMDAwMCAwMDEwMDAwMDAwMDAwMDA3IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjg2IHhvciAgMTAwMDAwMDAxMDAwMDAwMCAwMTAwMDAwMDAwMDAwMDA4IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjg3IHhvciAgMTAwMDAwMDAwMTAwMDAwMCAxMDAwMDAwMDAwMDAwMDA5IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTWlkZGllCitkZHhvcjI4OCB4b3IgIDAwMTAwMDAwMjAwMDAwMDAgMTAwMDAwMTAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI4OSB4b3IgIDAwMDEwMDAwNzAwMDAwMDEgMTAwMDAwMDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI5MCB4b3IgIDAwMDAxMDAwODAwMDAwMTAgMTAwMDAwMDAxMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI5MSB4b3IgIDAwMDAwMTAwOTAwMDAxMDAgMTAwMDAwMDAwMTAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI5MiB4b3IgIDEwMDAwMDEwMDAwMDEwMDAgMDAwMDAwMDAyMDEwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI5MyB4b3IgIDEwMDAwMDAxMDAwMTAwMDAgMDAwMDAwMDA3MDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI5NCB4b3IgIDEwMDAwMDAwMTAxMDAwMDAgMDAwMDAwMDA4MDAwMTAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI5NSB4b3IgIDEwMDAwMDAwMDEwMDAwMDAgMDAwMDAwMDA5MDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBzaWducworZGR4b3IyOTYgeG9yIC0xMDAwMDAwMDAxMDAwMDAwIC0wMDAwMDEwMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjk3IHhvciAtMTAwMDAwMDAwMTAwMDAwMCAgMDAwMDAwMDAxMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI5OCB4b3IgIDEwMDAwMDAwMDEwMDAwMDAgLTAwMDAwMDEwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyOTkgeG9yICAxMDAwMDAwMDAxMDAwMDAwICAwMDAwMDAwMDExMDAwMTAwIC0+ICAxMDAwMDAwMDEwMDAwMTAwCisKKy0tIE5tYXgsIE5taW4sIE50aW55LWxpa2UKK2RkeG9yMzMxIHhvciAgMiAgIDkuOTk5OTk5OTlFKzI5OSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjMzMiB4b3IgIDMgICAxRS0yOTkgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzMzMgeG9yICA0ICAgMS4wMDAwMDAwMEUtMjk5ICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzM0IHhvciAgNSAgIDFFLTIwMCAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjMzNSB4b3IgIDYgICAtMUUtMjAwICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzMzYgeG9yICA3ICAgLTEuMDAwMDAwMDBFLTI5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzM3IHhvciAgOCAgIC0xRS0yOTkgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjMzOCB4b3IgIDkgICAtOS45OTk5OTk5OUUrMjk5ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzNDEgeG9yICA5Ljk5OTk5OTk5RSsyOTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzQyIHhvciAgMUUtMjk5ICAgICAgICAgICAgICAgMDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM0MyB4b3IgIDEuMDAwMDAwMDBFLTI5OSAgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzNDQgeG9yICAxRS0yMDggICAgICAgICAgICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzQ1IHhvciAgLTFFLTIwNyAgICAgICAgICAgICAtMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM0NiB4b3IgIC0xLjAwMDAwMDAwRS0yOTkgICAgIDE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzNDcgeG9yICAtMUUtMjk5ICAgICAgICAgICAgICAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzQ4IHhvciAgLTkuOTk5OTk5OTlFKzI5OSAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEEgZmV3IG90aGVyIG5vbi1pbnRlZ2VycworZGR4b3IzNjEgeG9yICAxLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzYyIHhvciAgMUUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM2MyB4b3IgIDAuMCAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzNjQgeG9yICAwRSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzY1IHhvciAgOS45ICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM2NiB4b3IgIDlFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzNzEgeG9yICAwIDEuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzcyIHhvciAgMCAxRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM3MyB4b3IgIDAgMC4wICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzNzQgeG9yICAwIDBFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzc1IHhvciAgMCA5LjkgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM3NiB4b3IgIDAgOUUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBbGwgU3BlY2lhbHMgYXJlIGluIGVycm9yCitkZHhvcjc4MCB4b3IgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I3ODEgeG9yIC1JbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yNzgyIHhvciAtSW5mICAtMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjc4MyB4b3IgLUluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I3ODQgeG9yIC1JbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yNzg1IHhvciAtSW5mICAgMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjc4NiB4b3IgLUluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I3ODcgeG9yIC0xMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yNzg4IHhvciAtSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjc4OSB4b3IgLTEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I3OTAgeG9yIC0wICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yNzkxIHhvciAgMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjc5MiB4b3IgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I3OTMgeG9yICAxMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yNzk0IHhvciAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RkeG9yODAwIHhvciAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgwMSB4b3IgIEluZiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MDIgeG9yICBJbmYgIC0xICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODAzIHhvciAgSW5mICAtMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgwNCB4b3IgIEluZiAgIDAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MDUgeG9yICBJbmYgICAxICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODA2IHhvciAgSW5mICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgwNyB4b3IgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MDggeG9yIC0xMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODA5IHhvciAtSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgxMCB4b3IgLTEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MTEgeG9yIC0wICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODEyIHhvciAgMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgxMyB4b3IgIDEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MTQgeG9yICAxMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODE1IHhvciAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RkeG9yODIxIHhvciAgTmFOIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgyMiB4b3IgIE5hTiAtMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MjMgeG9yICBOYU4gLTEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODI0IHhvciAgTmFOIC0wICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgyNSB4b3IgIE5hTiAgMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MjYgeG9yICBOYU4gIDEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODI3IHhvciAgTmFOICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgyOCB4b3IgIE5hTiAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MjkgeG9yICBOYU4gIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODMwIHhvciAtSW5mICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgzMSB4b3IgLTEwMDAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MzIgeG9yIC0xICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODMzIHhvciAtMCAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgzNCB4b3IgIDAgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MzUgeG9yICAxICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODM2IHhvciAgMTAwMCBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgzNyB4b3IgIEluZiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZHhvcjg0MSB4b3IgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg0MiB4b3IgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg0MyB4b3IgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg0NCB4b3IgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg0NSB4b3IgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg0NiB4b3IgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg0NyB4b3IgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg0OCB4b3IgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg0OSB4b3IgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg1MCB4b3IgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg1MSB4b3IgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg1MiB4b3IgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg1MyB4b3IgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg1NCB4b3IgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg1NSB4b3IgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg1NiB4b3IgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg1NyB4b3IgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg1OCB4b3IgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg1OSB4b3IgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RkeG9yODYxIHhvciAgTmFOMSAgIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg2MiB4b3IgK05hTjIgICAtMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NjMgeG9yICBOYU4zICAgIDEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODY0IHhvciAgTmFONCAgICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg2NSB4b3IgIE5hTjUgICArTmFONiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NjYgeG9yIC1JbmYgICAgIE5hTjcgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODY3IHhvciAtMTAwMCAgICBOYU44ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg2OCB4b3IgIDEwMDAgICAgTmFOOSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NjkgeG9yICBJbmYgICAgK05hTjEwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODcxIHhvciAgc05hTjExICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg3MiB4b3IgIHNOYU4xMiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NzMgeG9yICBzTmFOMTMgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODc0IHhvciAgc05hTjE0ICAgTmFOMTcgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg3NSB4b3IgIHNOYU4xNSAgc05hTjE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NzYgeG9yICBOYU4xNiAgIHNOYU4xOSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODc3IHhvciAtSW5mICAgICtzTmFOMjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg3OCB4b3IgLTEwMDAgICAgc05hTjIxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NzkgeG9yICAxMDAwICAgIHNOYU4yMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODgwIHhvciAgSW5mICAgICBzTmFOMjMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg4MSB4b3IgK05hTjI1ICArc05hTjI0IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4ODIgeG9yIC1OYU4yNiAgICBOYU4yOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODgzIHhvciAtc05hTjI3ICBzTmFOMjkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg4NCB4b3IgIDEwMDAgICAgLU5hTjMwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4ODUgeG9yICAxMDAwICAgLXNOYU4zMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGVjRG91YmxlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RlY0RvdWJsZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMTcwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RlY0RvdWJsZS5kZWNUZXN0CkBAIC0wLDAgKzEsNjUgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGVjRG91YmxlLmRlY1Rlc3QgLS0gcnVuIGFsbCBkZWNEb3VibGUgZGVjaW1hbCBhcml0aG1ldGljIHRlc3RzICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBkZWNEb3VibGUgdGVzdHMKK2RlY3Rlc3Q6IGRkQWJzCitkZWN0ZXN0OiBkZEFkZAorZGVjdGVzdDogZGRBbmQKK2RlY3Rlc3Q6IGRkQmFzZQorZGVjdGVzdDogZGRDYW5vbmljYWwKK2RlY3Rlc3Q6IGRkQ2xhc3MKK2RlY3Rlc3Q6IGRkQ29tcGFyZQorZGVjdGVzdDogZGRDb21wYXJlU2lnCitkZWN0ZXN0OiBkZENvbXBhcmVUb3RhbAorZGVjdGVzdDogZGRDb21wYXJlVG90YWxNYWcKK2RlY3Rlc3Q6IGRkQ29weQorZGVjdGVzdDogZGRDb3B5QWJzCitkZWN0ZXN0OiBkZENvcHlOZWdhdGUKK2RlY3Rlc3Q6IGRkQ29weVNpZ24KK2RlY3Rlc3Q6IGRkRGl2aWRlCitkZWN0ZXN0OiBkZERpdmlkZUludAorZGVjdGVzdDogZGRFbmNvZGUKK2RlY3Rlc3Q6IGRkRk1BCitkZWN0ZXN0OiBkZEludmVydAorZGVjdGVzdDogZGRMb2dCCitkZWN0ZXN0OiBkZE1heAorZGVjdGVzdDogZGRNYXhNYWcKK2RlY3Rlc3Q6IGRkTWluCitkZWN0ZXN0OiBkZE1pbk1hZworZGVjdGVzdDogZGRNaW51cworZGVjdGVzdDogZGRNdWx0aXBseQorZGVjdGVzdDogZGROZXh0TWludXMKK2RlY3Rlc3Q6IGRkTmV4dFBsdXMKK2RlY3Rlc3Q6IGRkTmV4dFRvd2FyZAorZGVjdGVzdDogZGRPcgorZGVjdGVzdDogZGRQbHVzCitkZWN0ZXN0OiBkZFF1YW50aXplCitkZWN0ZXN0OiBkZFJlZHVjZQorZGVjdGVzdDogZGRSZW1haW5kZXIKK2RlY3Rlc3Q6IGRkUmVtYWluZGVyTmVhcgorZGVjdGVzdDogZGRSb3RhdGUKK2RlY3Rlc3Q6IGRkU2FtZVF1YW50dW0KK2RlY3Rlc3Q6IGRkU2NhbGVCCitkZWN0ZXN0OiBkZFNoaWZ0CitkZWN0ZXN0OiBkZFN1YnRyYWN0CitkZWN0ZXN0OiBkZFRvSW50ZWdyYWwKK2RlY3Rlc3Q6IGRkWG9yCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGVjUXVhZC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZWNRdWFkLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkYjE0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGVjUXVhZC5kZWNUZXN0CkBAIC0wLDAgKzEsNjUgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGVjUXVhZC5kZWNUZXN0IC0tIHJ1biBhbGwgZGVjUXVhZCBkZWNpbWFsIGFyaXRobWV0aWMgdGVzdHMgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBkZWNRdWFkIHRlc3RzCitkZWN0ZXN0OiBkcUFicworZGVjdGVzdDogZHFBZGQKK2RlY3Rlc3Q6IGRxQW5kCitkZWN0ZXN0OiBkcUJhc2UKK2RlY3Rlc3Q6IGRxQ2Fub25pY2FsCitkZWN0ZXN0OiBkcUNsYXNzCitkZWN0ZXN0OiBkcUNvbXBhcmUKK2RlY3Rlc3Q6IGRxQ29tcGFyZVNpZworZGVjdGVzdDogZHFDb21wYXJlVG90YWwKK2RlY3Rlc3Q6IGRxQ29tcGFyZVRvdGFsTWFnCitkZWN0ZXN0OiBkcUNvcHkKK2RlY3Rlc3Q6IGRxQ29weUFicworZGVjdGVzdDogZHFDb3B5TmVnYXRlCitkZWN0ZXN0OiBkcUNvcHlTaWduCitkZWN0ZXN0OiBkcURpdmlkZQorZGVjdGVzdDogZHFEaXZpZGVJbnQKK2RlY3Rlc3Q6IGRxRW5jb2RlCitkZWN0ZXN0OiBkcUZNQQorZGVjdGVzdDogZHFJbnZlcnQKK2RlY3Rlc3Q6IGRxTG9nQgorZGVjdGVzdDogZHFNYXgKK2RlY3Rlc3Q6IGRxTWF4TWFnCitkZWN0ZXN0OiBkcU1pbgorZGVjdGVzdDogZHFNaW5NYWcKK2RlY3Rlc3Q6IGRxTWludXMKK2RlY3Rlc3Q6IGRxTXVsdGlwbHkKK2RlY3Rlc3Q6IGRxTmV4dE1pbnVzCitkZWN0ZXN0OiBkcU5leHRQbHVzCitkZWN0ZXN0OiBkcU5leHRUb3dhcmQKK2RlY3Rlc3Q6IGRxT3IKK2RlY3Rlc3Q6IGRxUGx1cworZGVjdGVzdDogZHFRdWFudGl6ZQorZGVjdGVzdDogZHFSZWR1Y2UKK2RlY3Rlc3Q6IGRxUmVtYWluZGVyCitkZWN0ZXN0OiBkcVJlbWFpbmRlck5lYXIKK2RlY3Rlc3Q6IGRxUm90YXRlCitkZWN0ZXN0OiBkcVNhbWVRdWFudHVtCitkZWN0ZXN0OiBkcVNjYWxlQgorZGVjdGVzdDogZHFTaGlmdAorZGVjdGVzdDogZHFTdWJ0cmFjdAorZGVjdGVzdDogZHFUb0ludGVncmFsCitkZWN0ZXN0OiBkcVhvcgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RlY1NpbmdsZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZWNTaW5nbGUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2Y5N2JmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZWNTaW5nbGUuZGVjVGVzdApAQCAtMCwwICsxLDI1IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRlY1NpbmdsZS5kZWNUZXN0IC0tIHJ1biBhbGwgZGVjU2luZ2xlIGRlY2ltYWwgYXJpdGhtZXRpYyB0ZXN0cyAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gZGVjU2luZ2xlIHRlc3RzCitkZWN0ZXN0OiBkc0Jhc2UKK2RlY3Rlc3Q6IGRzRW5jb2RlCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGl2aWRlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RpdmlkZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYmI1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RpdmlkZS5kZWNUZXN0CkBAIC0wLDAgKzEsODU0IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRpdmlkZS5kZWNUZXN0IC0tIGRlY2ltYWwgZGl2aXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworLS0gc2FuaXR5IGNoZWNrcworZGl2eDAwMSBkaXZpZGUgIDEgICAgIDEgICAgLT4gIDEKK2RpdngwMDIgZGl2aWRlICAyICAgICAxICAgIC0+ICAyCitkaXZ4MDAzIGRpdmlkZSAgMSAgICAgMiAgICAtPiAgMC41CitkaXZ4MDA0IGRpdmlkZSAgMiAgICAgMiAgICAtPiAgMQorZGl2eDAwNSBkaXZpZGUgIDAgICAgIDEgICAgLT4gIDAKK2RpdngwMDYgZGl2aWRlICAwICAgICAyICAgIC0+ICAwCitkaXZ4MDA3IGRpdmlkZSAgMSAgICAgMyAgICAtPiAgMC4zMzMzMzMzMzMgSW5leGFjdCBSb3VuZGVkCitkaXZ4MDA4IGRpdmlkZSAgMiAgICAgMyAgICAtPiAgMC42NjY2NjY2NjcgSW5leGFjdCBSb3VuZGVkCitkaXZ4MDA5IGRpdmlkZSAgMyAgICAgMyAgICAtPiAgMQorCitkaXZ4MDEwIGRpdmlkZSAgMi40ICAgMSAgICAtPiAgMi40CitkaXZ4MDExIGRpdmlkZSAgMi40ICAgLTEgICAtPiAgLTIuNAorZGl2eDAxMiBkaXZpZGUgIC0yLjQgIDEgICAgLT4gIC0yLjQKK2RpdngwMTMgZGl2aWRlICAtMi40ICAtMSAgIC0+ICAyLjQKK2RpdngwMTQgZGl2aWRlICAyLjQwICAxICAgIC0+ICAyLjQwCitkaXZ4MDE1IGRpdmlkZSAgMi40MDAgMSAgICAtPiAgMi40MDAKK2RpdngwMTYgZGl2aWRlICAyLjQgICAyICAgIC0+ICAxLjIKK2RpdngwMTcgZGl2aWRlICAyLjQwMCAyICAgIC0+ICAxLjIwMAorZGl2eDAxOCBkaXZpZGUgIDIuICAgIDIgICAgLT4gIDEKK2RpdngwMTkgZGl2aWRlICAyMCAgICAyMCAgIC0+ICAxCisKK2RpdngwMjAgZGl2aWRlICAxODcgICAxODcgICAgLT4gIDEKK2RpdngwMjEgZGl2aWRlICA1ICAgICAyICAgICAgLT4gIDIuNQorZGl2eDAyMiBkaXZpZGUgIDUwICAgIDIwICAgICAtPiAgMi41CitkaXZ4MDIzIGRpdmlkZSAgNTAwICAgMjAwICAgIC0+ICAyLjUKK2RpdngwMjQgZGl2aWRlICA1MC4wICAyMC4wICAgLT4gIDIuNQorZGl2eDAyNSBkaXZpZGUgIDUuMDAgIDIuMDAgICAtPiAgMi41CitkaXZ4MDI2IGRpdmlkZSAgNSAgICAgMi4wICAgIC0+ICAyLjUKK2RpdngwMjcgZGl2aWRlICA1ICAgICAyLjAwMCAgLT4gIDIuNQorZGl2eDAyOCBkaXZpZGUgIDUgICAgIDAuMjAgICAtPiAgMjUKK2RpdngwMjkgZGl2aWRlICA1ICAgICAwLjIwMCAgLT4gIDI1CitkaXZ4MDMwIGRpdmlkZSAgMTAgICAgMSAgICAgIC0+ICAxMAorZGl2eDAzMSBkaXZpZGUgIDEwMCAgIDEgICAgICAtPiAgMTAwCitkaXZ4MDMyIGRpdmlkZSAgMTAwMCAgMSAgICAgIC0+ICAxMDAwCitkaXZ4MDMzIGRpdmlkZSAgMTAwMCAgMTAwICAgIC0+ICAxMAorCitkaXZ4MDM1IGRpdmlkZSAgMSAgICAgMiAgICAgIC0+ICAwLjUKK2RpdngwMzYgZGl2aWRlICAxICAgICA0ICAgICAgLT4gIDAuMjUKK2RpdngwMzcgZGl2aWRlICAxICAgICA4ICAgICAgLT4gIDAuMTI1CitkaXZ4MDM4IGRpdmlkZSAgMSAgICAgMTYgICAgIC0+ICAwLjA2MjUKK2RpdngwMzkgZGl2aWRlICAxICAgICAzMiAgICAgLT4gIDAuMDMxMjUKK2RpdngwNDAgZGl2aWRlICAxICAgICA2NCAgICAgLT4gIDAuMDE1NjI1CitkaXZ4MDQxIGRpdmlkZSAgMSAgICAtMiAgICAgIC0+ICAtMC41CitkaXZ4MDQyIGRpdmlkZSAgMSAgICAtNCAgICAgIC0+ICAtMC4yNQorZGl2eDA0MyBkaXZpZGUgIDEgICAgLTggICAgICAtPiAgLTAuMTI1CitkaXZ4MDQ0IGRpdmlkZSAgMSAgICAtMTYgICAgIC0+ICAtMC4wNjI1CitkaXZ4MDQ1IGRpdmlkZSAgMSAgICAtMzIgICAgIC0+ICAtMC4wMzEyNQorZGl2eDA0NiBkaXZpZGUgIDEgICAgLTY0ICAgICAtPiAgLTAuMDE1NjI1CitkaXZ4MDQ3IGRpdmlkZSAtMSAgICAgMiAgICAgIC0+ICAtMC41CitkaXZ4MDQ4IGRpdmlkZSAtMSAgICAgNCAgICAgIC0+ICAtMC4yNQorZGl2eDA0OSBkaXZpZGUgLTEgICAgIDggICAgICAtPiAgLTAuMTI1CitkaXZ4MDUwIGRpdmlkZSAtMSAgICAgMTYgICAgIC0+ICAtMC4wNjI1CitkaXZ4MDUxIGRpdmlkZSAtMSAgICAgMzIgICAgIC0+ICAtMC4wMzEyNQorZGl2eDA1MiBkaXZpZGUgLTEgICAgIDY0ICAgICAtPiAgLTAuMDE1NjI1CitkaXZ4MDUzIGRpdmlkZSAtMSAgICAtMiAgICAgIC0+ICAwLjUKK2RpdngwNTQgZGl2aWRlIC0xICAgIC00ICAgICAgLT4gIDAuMjUKK2RpdngwNTUgZGl2aWRlIC0xICAgIC04ICAgICAgLT4gIDAuMTI1CitkaXZ4MDU2IGRpdmlkZSAtMSAgICAtMTYgICAgIC0+ICAwLjA2MjUKK2RpdngwNTcgZGl2aWRlIC0xICAgIC0zMiAgICAgLT4gIDAuMDMxMjUKK2RpdngwNTggZGl2aWRlIC0xICAgIC02NCAgICAgLT4gIDAuMDE1NjI1CisKK2RpdngwNzAgZGl2aWRlICA5OTk5OTk5OTkgICAgICAgIDEgICAgLT4gIDk5OTk5OTk5OQorZGl2eDA3MSBkaXZpZGUgIDk5OTk5OTk5OS40ICAgICAgMSAgICAtPiAgOTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZGl2eDA3MiBkaXZpZGUgIDk5OTk5OTk5OS41ICAgICAgMSAgICAtPiAgMS4wMDAwMDAwMEUrOSBJbmV4YWN0IFJvdW5kZWQKK2RpdngwNzMgZGl2aWRlICA5OTk5OTk5OTkuOSAgICAgIDEgICAgLT4gIDEuMDAwMDAwMDBFKzkgSW5leGFjdCBSb3VuZGVkCitkaXZ4MDc0IGRpdmlkZSAgOTk5OTk5OTk5Ljk5OSAgICAxICAgIC0+ICAxLjAwMDAwMDAwRSs5IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA2CitkaXZ4MDgwIGRpdmlkZSAgOTk5OTk5OTk5ICAgICAxICAtPiAgMS4wMDAwMEUrOSBJbmV4YWN0IFJvdW5kZWQKK2RpdngwODEgZGl2aWRlICA5OTk5OTk5OSAgICAgIDEgIC0+ICAxLjAwMDAwRSs4IEluZXhhY3QgUm91bmRlZAorZGl2eDA4MiBkaXZpZGUgIDk5OTk5OTkgICAgICAgMSAgLT4gIDEuMDAwMDBFKzcgSW5leGFjdCBSb3VuZGVkCitkaXZ4MDgzIGRpdmlkZSAgOTk5OTk5ICAgICAgICAxICAtPiAgOTk5OTk5CitkaXZ4MDg0IGRpdmlkZSAgOTk5OTkgICAgICAgICAxICAtPiAgOTk5OTkKK2RpdngwODUgZGl2aWRlICA5OTk5ICAgICAgICAgIDEgIC0+ICA5OTk5CitkaXZ4MDg2IGRpdmlkZSAgOTk5ICAgICAgICAgICAxICAtPiAgOTk5CitkaXZ4MDg3IGRpdmlkZSAgOTkgICAgICAgICAgICAxICAtPiAgOTkKK2RpdngwODggZGl2aWRlICA5ICAgICAgICAgICAgIDEgIC0+ICA5CisKK3ByZWNpc2lvbjogOQorZGl2eDA5MCBkaXZpZGUgIDAuICAgICAgICAgICAgMSAgICAtPiAgMAorZGl2eDA5MSBkaXZpZGUgIC4wICAgICAgICAgICAgMSAgICAtPiAgMC4wCitkaXZ4MDkyIGRpdmlkZSAgMC4wMCAgICAgICAgICAxICAgIC0+ICAwLjAwCitkaXZ4MDkzIGRpdmlkZSAgMC4wMEUrOSAgICAgICAxICAgIC0+ICAwRSs3CitkaXZ4MDk0IGRpdmlkZSAgMC4wMDAwRS01MCAgICAxICAgIC0+ICAwRS01NAorCitkaXZ4MDk1IGRpdmlkZSAgMSAgICAgICAgICAgIDFFLTggIC0+ICAxRSs4CitkaXZ4MDk2IGRpdmlkZSAgMSAgICAgICAgICAgIDFFLTkgIC0+ICAxRSs5CitkaXZ4MDk3IGRpdmlkZSAgMSAgICAgICAgICAgIDFFLTEwIC0+ICAxRSsxMAorZGl2eDA5OCBkaXZpZGUgIDEgICAgICAgICAgICAxRS0xMSAtPiAgMUUrMTEKK2RpdngwOTkgZGl2aWRlICAxICAgICAgICAgICAgMUUtMTIgLT4gIDFFKzEyCisKK2RpdngxMDAgZGl2aWRlICAxICAxICAgLT4gMQorZGl2eDEwMSBkaXZpZGUgIDEgIDIgICAtPiAwLjUKK2RpdngxMDIgZGl2aWRlICAxICAzICAgLT4gMC4zMzMzMzMzMzMgSW5leGFjdCBSb3VuZGVkCitkaXZ4MTAzIGRpdmlkZSAgMSAgNCAgIC0+IDAuMjUKK2RpdngxMDQgZGl2aWRlICAxICA1ICAgLT4gMC4yCitkaXZ4MTA1IGRpdmlkZSAgMSAgNiAgIC0+IDAuMTY2NjY2NjY3IEluZXhhY3QgUm91bmRlZAorZGl2eDEwNiBkaXZpZGUgIDEgIDcgICAtPiAwLjE0Mjg1NzE0MyBJbmV4YWN0IFJvdW5kZWQKK2RpdngxMDcgZGl2aWRlICAxICA4ICAgLT4gMC4xMjUKK2RpdngxMDggZGl2aWRlICAxICA5ICAgLT4gMC4xMTExMTExMTEgSW5leGFjdCBSb3VuZGVkCitkaXZ4MTA5IGRpdmlkZSAgMSAgMTAgIC0+IDAuMQorZGl2eDExMCBkaXZpZGUgIDEgIDEgICAtPiAxCitkaXZ4MTExIGRpdmlkZSAgMiAgMSAgIC0+IDIKK2RpdngxMTIgZGl2aWRlICAzICAxICAgLT4gMworZGl2eDExMyBkaXZpZGUgIDQgIDEgICAtPiA0CitkaXZ4MTE0IGRpdmlkZSAgNSAgMSAgIC0+IDUKK2RpdngxMTUgZGl2aWRlICA2ICAxICAgLT4gNgorZGl2eDExNiBkaXZpZGUgIDcgIDEgICAtPiA3CitkaXZ4MTE3IGRpdmlkZSAgOCAgMSAgIC0+IDgKK2RpdngxMTggZGl2aWRlICA5ICAxICAgLT4gOQorZGl2eDExOSBkaXZpZGUgIDEwIDEgICAtPiAxMAorCitkaXZ4MTIwIGRpdmlkZSAgM0UrMSAwLjAwMSAgLT4gM0UrNAorZGl2eDEyMSBkaXZpZGUgIDIuMjAwIDIgICAgIC0+IDEuMTAwCisKK2RpdngxMzAgZGl2aWRlICAxMjM0NSAgNC45OTkgIC0+ICAyNDY5LjQ5MzkwIEluZXhhY3QgUm91bmRlZAorZGl2eDEzMSBkaXZpZGUgIDEyMzQ1ICA0Ljk5ICAgLT4gIDI0NzMuOTQ3OTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4MTMyIGRpdmlkZSAgMTIzNDUgIDQuOSAgICAtPiAgMjUxOS4zODc3NiBJbmV4YWN0IFJvdW5kZWQKK2RpdngxMzMgZGl2aWRlICAxMjM0NSAgNSAgICAgIC0+ICAyNDY5CitkaXZ4MTM0IGRpdmlkZSAgMTIzNDUgIDUuMSAgICAtPiAgMjQyMC41ODgyNCBJbmV4YWN0IFJvdW5kZWQKK2RpdngxMzUgZGl2aWRlICAxMjM0NSAgNS4wMSAgIC0+ICAyNDY0LjA3MTg2IEluZXhhY3QgUm91bmRlZAorZGl2eDEzNiBkaXZpZGUgIDEyMzQ1ICA1LjAwMSAgLT4gIDI0NjguNTA2MzAgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogICA5CittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorCistLSB0ZXN0IHBvc3NpYmx5IGltcHJlY2lzZSByZXN1bHRzCitkaXZ4MjIwIGRpdmlkZSAzOTEgICA1OTcgLT4gIDAuNjU0OTQxMzc0IEluZXhhY3QgUm91bmRlZAorZGl2eDIyMSBkaXZpZGUgMzkxICAtNTk3IC0+IC0wLjY1NDk0MTM3NCBJbmV4YWN0IFJvdW5kZWQKK2RpdngyMjIgZGl2aWRlIC0zOTEgIDU5NyAtPiAtMC42NTQ5NDEzNzQgSW5leGFjdCBSb3VuZGVkCitkaXZ4MjIzIGRpdmlkZSAtMzkxIC01OTcgLT4gIDAuNjU0OTQxMzc0IEluZXhhY3QgUm91bmRlZAorCistLSB0ZXN0IHNvbWUgY2FzZXMgdGhhdCBhcmUgY2xvc2UgdG8gZXhwb25lbnQgb3ZlcmZsb3cKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitkaXZ4MjcwIGRpdmlkZSAxIDFlOTk5OTk5OTk5ICAgIC0+IDFFLTk5OTk5OTk5OQorZGl2eDI3MSBkaXZpZGUgMSAwLjllOTk5OTk5OTk5ICAtPiAxLjExMTExMTExRS05OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkaXZ4MjcyIGRpdmlkZSAxIDAuOTllOTk5OTk5OTk5IC0+IDEuMDEwMTAxMDFFLTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RpdngyNzMgZGl2aWRlIDEgMC45OTk5OTk5OTllOTk5OTk5OTk5IC0+IDEuMDAwMDAwMDBFLTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RpdngyNzQgZGl2aWRlIDllOTk5OTk5OTk5ICAgIDEgLT4gOUUrOTk5OTk5OTk5CitkaXZ4Mjc1IGRpdmlkZSA5LjllOTk5OTk5OTk5ICAxIC0+IDkuOUUrOTk5OTk5OTk5CitkaXZ4Mjc2IGRpdmlkZSA5Ljk5ZTk5OTk5OTk5OSAxIC0+IDkuOTlFKzk5OTk5OTk5OQorZGl2eDI3NyBkaXZpZGUgOS45OTk5OTk5OWU5OTk5OTk5OTkgMSAtPiA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkKKworZGl2eDI4MCBkaXZpZGUgMC4xIDllLTk5OTk5OTk5OSAgIC0+IDEuMTExMTExMTFFKzk5OTk5OTk5NyBJbmV4YWN0IFJvdW5kZWQKK2RpdngyODEgZGl2aWRlIDAuMSA5OWUtOTk5OTk5OTk5ICAtPiAxLjAxMDEwMTAxRSs5OTk5OTk5OTYgSW5leGFjdCBSb3VuZGVkCitkaXZ4MjgyIGRpdmlkZSAwLjEgOTk5ZS05OTk5OTk5OTkgLT4gMS4wMDEwMDEwMEUrOTk5OTk5OTk1IEluZXhhY3QgUm91bmRlZAorCitkaXZ4MjgzIGRpdmlkZSAwLjEgOWUtOTk5OTk5OTk4ICAgICAtPiAxLjExMTExMTExRSs5OTk5OTk5OTYgSW5leGFjdCBSb3VuZGVkCitkaXZ4Mjg0IGRpdmlkZSAwLjEgOTllLTk5OTk5OTk5OCAgICAtPiAxLjAxMDEwMTAxRSs5OTk5OTk5OTUgSW5leGFjdCBSb3VuZGVkCitkaXZ4Mjg1IGRpdmlkZSAwLjEgOTk5ZS05OTk5OTk5OTggICAtPiAxLjAwMTAwMTAwRSs5OTk5OTk5OTQgSW5leGFjdCBSb3VuZGVkCitkaXZ4Mjg2IGRpdmlkZSAwLjEgOTk5ZS05OTk5OTk5OTcgICAtPiAxLjAwMTAwMTAwRSs5OTk5OTk5OTMgSW5leGFjdCBSb3VuZGVkCitkaXZ4Mjg3IGRpdmlkZSAwLjEgOTk5OWUtOTk5OTk5OTk3ICAtPiAxLjAwMDEwMDAxRSs5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkaXZ4Mjg4IGRpdmlkZSAwLjEgOTk5OTllLTk5OTk5OTk5NyAtPiAxLjAwMDAxMDAwRSs5OTk5OTk5OTEgSW5leGFjdCBSb3VuZGVkCisKKy0tIERpdmlkZSBpbnRvIDAgdGVzdHMKKworZGl2eDMwMSBkaXZpZGUgICAgMCAgICA3ICAgICAtPiAwCitkaXZ4MzAyIGRpdmlkZSAgICAwICAgIDdFLTUgIC0+IDBFKzUKK2RpdngzMDMgZGl2aWRlICAgIDAgICAgN0UtMSAgLT4gMEUrMQorZGl2eDMwNCBkaXZpZGUgICAgMCAgICA3RSsxICAtPiAwLjAKK2RpdngzMDUgZGl2aWRlICAgIDAgICAgN0UrNSAgLT4gMC4wMDAwMAorZGl2eDMwNiBkaXZpZGUgICAgMCAgICA3RSs2ICAtPiAwLjAwMDAwMAorZGl2eDMwNyBkaXZpZGUgICAgMCAgICA3RSs3ICAtPiAwRS03CitkaXZ4MzA4IGRpdmlkZSAgICAwICAgNzBFLTUgIC0+IDBFKzUKK2RpdngzMDkgZGl2aWRlICAgIDAgICA3MEUtMSAgLT4gMEUrMQorZGl2eDMxMCBkaXZpZGUgICAgMCAgIDcwRSswICAtPiAwCitkaXZ4MzExIGRpdmlkZSAgICAwICAgNzBFKzEgIC0+IDAuMAorZGl2eDMxMiBkaXZpZGUgICAgMCAgIDcwRSs1ICAtPiAwLjAwMDAwCitkaXZ4MzEzIGRpdmlkZSAgICAwICAgNzBFKzYgIC0+IDAuMDAwMDAwCitkaXZ4MzE0IGRpdmlkZSAgICAwICAgNzBFKzcgIC0+IDBFLTcKK2RpdngzMTUgZGl2aWRlICAgIDAgIDcwMEUtNSAgLT4gMEUrNQorZGl2eDMxNiBkaXZpZGUgICAgMCAgNzAwRS0xICAtPiAwRSsxCitkaXZ4MzE3IGRpdmlkZSAgICAwICA3MDBFKzAgIC0+IDAKK2RpdngzMTggZGl2aWRlICAgIDAgIDcwMEUrMSAgLT4gMC4wCitkaXZ4MzE5IGRpdmlkZSAgICAwICA3MDBFKzUgIC0+IDAuMDAwMDAKK2RpdngzMjAgZGl2aWRlICAgIDAgIDcwMEUrNiAgLT4gMC4wMDAwMDAKK2RpdngzMjEgZGl2aWRlICAgIDAgIDcwMEUrNyAgLT4gMEUtNworZGl2eDMyMiBkaXZpZGUgICAgMCAgNzAwRSs3NyAtPiAwRS03NworCitkaXZ4MzMxIGRpdmlkZSAwRS0zICAgIDdFLTUgIC0+IDBFKzIKK2RpdngzMzIgZGl2aWRlIDBFLTMgICAgN0UtMSAgLT4gMC4wMAorZGl2eDMzMyBkaXZpZGUgMEUtMyAgICA3RSsxICAtPiAwLjAwMDAKK2RpdngzMzQgZGl2aWRlIDBFLTMgICAgN0UrNSAgLT4gMEUtOAorZGl2eDMzNSBkaXZpZGUgMEUtMSAgICA3RS01ICAtPiAwRSs0CitkaXZ4MzM2IGRpdmlkZSAwRS0xICAgIDdFLTEgIC0+IDAKK2RpdngzMzcgZGl2aWRlIDBFLTEgICAgN0UrMSAgLT4gMC4wMAorZGl2eDMzOCBkaXZpZGUgMEUtMSAgICA3RSs1ICAtPiAwLjAwMDAwMAorZGl2eDMzOSBkaXZpZGUgMEUrMSAgICA3RS01ICAtPiAwRSs2CitkaXZ4MzQwIGRpdmlkZSAwRSsxICAgIDdFLTEgIC0+IDBFKzIKK2RpdngzNDEgZGl2aWRlIDBFKzEgICAgN0UrMSAgLT4gMAorZGl2eDM0MiBkaXZpZGUgMEUrMSAgICA3RSs1ICAtPiAwLjAwMDAKK2RpdngzNDMgZGl2aWRlIDBFKzMgICAgN0UtNSAgLT4gMEUrOAorZGl2eDM0NCBkaXZpZGUgMEUrMyAgICA3RS0xICAtPiAwRSs0CitkaXZ4MzQ1IGRpdmlkZSAwRSszICAgIDdFKzEgIC0+IDBFKzIKK2RpdngzNDYgZGl2aWRlIDBFKzMgICAgN0UrNSAgLT4gMC4wMAorCittYXhleHBvbmVudDogOTIKK21pbmV4cG9uZW50OiAtOTIKK3ByZWNpc2lvbjogICAgNworZGl2eDM1MSBkaXZpZGUgMEUtOTIgICA3RS0xICAtPiAwRS05MQorZGl2eDM1MiBkaXZpZGUgMEUtOTIgICA3RSsxICAtPiAwRS05MworZGl2eDM1MyBkaXZpZGUgMEUtOTIgICA3RSs1ICAtPiAwRS05NworZGl2eDM1NCBkaXZpZGUgMEUtOTIgICA3RSs2ICAtPiAwRS05OAorZGl2eDM1NSBkaXZpZGUgMEUtOTIgICA3RSs3ICAtPiAwRS05OCBDbGFtcGVkCitkaXZ4MzU2IGRpdmlkZSAwRS05MiA3NzdFLTEgIC0+IDBFLTkxCitkaXZ4MzU3IGRpdmlkZSAwRS05MiA3NzdFKzEgIC0+IDBFLTkzCitkaXZ4MzU4IGRpdmlkZSAwRS05MiA3NzdFKzMgIC0+IDBFLTk1CitkaXZ4MzU5IGRpdmlkZSAwRS05MiA3NzdFKzQgIC0+IDBFLTk2CitkaXZ4MzYwIGRpdmlkZSAwRS05MiA3NzdFKzUgIC0+IDBFLTk3CitkaXZ4MzYxIGRpdmlkZSAwRS05MiA3NzdFKzYgIC0+IDBFLTk4CitkaXZ4MzYyIGRpdmlkZSAwRS05MiA3NzdFKzcgIC0+IDBFLTk4IENsYW1wZWQKK2RpdngzNjMgZGl2aWRlIDBFLTkyICAgN0UrOTIgLT4gMEUtOTggQ2xhbXBlZAorCitkaXZ4MzcxIGRpdmlkZSAwRS05MiA3MDBFLTEgIC0+IDBFLTkxCitkaXZ4MzcyIGRpdmlkZSAwRS05MiA3MDBFKzEgIC0+IDBFLTkzCitkaXZ4MzczIGRpdmlkZSAwRS05MiA3MDBFKzMgIC0+IDBFLTk1CitkaXZ4Mzc0IGRpdmlkZSAwRS05MiA3MDBFKzQgIC0+IDBFLTk2CitkaXZ4Mzc1IGRpdmlkZSAwRS05MiA3MDBFKzUgIC0+IDBFLTk3CitkaXZ4Mzc2IGRpdmlkZSAwRS05MiA3MDBFKzYgIC0+IDBFLTk4CitkaXZ4Mzc3IGRpdmlkZSAwRS05MiA3MDBFKzcgIC0+IDBFLTk4IENsYW1wZWQKKworZGl2eDM4MSBkaXZpZGUgMEUrOTIgICA3RSsxICAtPiAwRSs5MQorZGl2eDM4MiBkaXZpZGUgMEUrOTIgICA3RSswICAtPiAwRSs5MgorZGl2eDM4MyBkaXZpZGUgMEUrOTIgICA3RS0xICAtPiAwRSs5MiBDbGFtcGVkCitkaXZ4Mzg0IGRpdmlkZSAwRSs5MCA3NzdFKzEgIC0+IDBFKzg5CitkaXZ4Mzg1IGRpdmlkZSAwRSs5MCA3NzdFLTEgIC0+IDBFKzkxCitkaXZ4Mzg2IGRpdmlkZSAwRSs5MCA3NzdFLTIgIC0+IDBFKzkyCitkaXZ4Mzg3IGRpdmlkZSAwRSs5MCA3NzdFLTMgIC0+IDBFKzkyIENsYW1wZWQKK2RpdngzODggZGl2aWRlIDBFKzkwIDc3N0UtNCAgLT4gMEUrOTIgQ2xhbXBlZAorCitkaXZ4MzkxIGRpdmlkZSAwRSs5MCA3MDBFKzEgIC0+IDBFKzg5CitkaXZ4MzkyIGRpdmlkZSAwRSs5MCA3MDBFLTEgIC0+IDBFKzkxCitkaXZ4MzkzIGRpdmlkZSAwRSs5MCA3MDBFLTIgIC0+IDBFKzkyCitkaXZ4Mzk0IGRpdmlkZSAwRSs5MCA3MDBFLTMgIC0+IDBFKzkyIENsYW1wZWQKK2RpdngzOTUgZGl2aWRlIDBFKzkwIDcwMEUtNCAgLT4gMEUrOTIgQ2xhbXBlZAorCistLSBpbnB1dCByb3VuZGluZyBjaGVja3MKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK2Rpdng0MDEgZGl2aWRlIDEyMzQ1Njc4MDAwIDEgLT4gMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorZGl2eDQwMiBkaXZpZGUgMSAxMjM0NTY3ODAwMCAtPiA4LjEwMDAwMDY2RS0xMSBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MDMgZGl2aWRlIDEyMzQ1Njc4MDAgIDEgLT4gMS4yMzQ1Njc4MEUrOSAgUm91bmRlZAorZGl2eDQwNCBkaXZpZGUgMSAxMjM0NTY3ODAwICAtPiA4LjEwMDAwMDY2RS0xMCBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MDUgZGl2aWRlIDEyMzQ1Njc4OTAgIDEgLT4gMS4yMzQ1Njc4OUUrOSAgUm91bmRlZAorZGl2eDQwNiBkaXZpZGUgMSAxMjM0NTY3ODkwICAtPiA4LjEwMDAwMDA3RS0xMCBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MDcgZGl2aWRlIDEyMzQ1Njc4OTEgIDEgLT4gMS4yMzQ1Njc4OUUrOSAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDA4IGRpdmlkZSAxIDEyMzQ1Njc4OTEgIC0+IDguMTAwMDAwMDdFLTEwIEluZXhhY3QgUm91bmRlZAorZGl2eDQwOSBkaXZpZGUgMTIzNDU2Nzg5MDEgMSAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MTAgZGl2aWRlIDEgMTIzNDU2Nzg5MDEgLT4gOC4xMDAwMDAwN0UtMTEgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDExIGRpdmlkZSAxMjM0NTY3ODk2ICAxIC0+IDEuMjM0NTY3OTBFKzkgIEluZXhhY3QgUm91bmRlZAorZGl2eDQxMiBkaXZpZGUgMSAxMjM0NTY3ODk2ICAtPiA4LjEwMDAwMDAzRS0xMCBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MTMgZGl2aWRlIDEgMTIzNDU2Nzg5NyAgLT4gOC4xMDAwMDAwM0UtMTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDE0IGRpdmlkZSAxIDEyMzQ1Njc4OTggIC0+IDguMTAwMDAwMDJFLTEwIEluZXhhY3QgUm91bmRlZAorZGl2eDQxNSBkaXZpZGUgMSAxMjM0NTY3ODk5ICAtPiA4LjEwMDAwMDAxRS0xMCBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MTYgZGl2aWRlIDEgMTIzNDU2NzkwMCAgLT4gOC4xMDAwMDAwMUUtMTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDE3IGRpdmlkZSAxIDEyMzQ1Njc5MDEgIC0+IDguMTAwMDAwMDBFLTEwIEluZXhhY3QgUm91bmRlZAorZGl2eDQxOCBkaXZpZGUgMSAxMjM0NTY3OTAyICAtPiA4LjA5OTk5OTk5RS0xMCBJbmV4YWN0IFJvdW5kZWQKKy0tIHNvbWUgbG9uZ2llcworZGl2eDQyMSBkaXZpZGUgMTIzNDU2Nzg5Ni4wMDAwMDAwMDAwMDAgIDEgLT4gMS4yMzQ1Njc5MEUrOSAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDIyIGRpdmlkZSAxIDEyMzQ1Njc4OTYuMDAwMDAwMDAwMDAwICAtPiA4LjEwMDAwMDAzRS0xMCBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MjMgZGl2aWRlIDEyMzQ1Njc4OTYuMDAwMDAwMDAwMDAxICAxIC0+IDEuMjM0NTY3OTBFKzkgIEluZXhhY3QgUm91bmRlZAorZGl2eDQyNCBkaXZpZGUgMSAxMjM0NTY3ODk2LjAwMDAwMDAwMDAwMSAgLT4gOC4xMDAwMDAwM0UtMTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDI1IGRpdmlkZSAxMjM0NTY3ODk2LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOSAgMSAtPiAxLjIzNDU2NzkwRSs5ICBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MjYgZGl2aWRlIDEgMTIzNDU2Nzg5Ni4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkgIC0+IDguMTAwMDAwMDNFLTEwIEluZXhhY3QgUm91bmRlZAorZGl2eDQyNyBkaXZpZGUgMTIzNDU2Nzg5Ny45MDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkgIDEgLT4gMS4yMzQ1Njc5MEUrOSAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDI4IGRpdmlkZSAxIDEyMzQ1Njc4OTcuOTAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5ICAtPiA4LjEwMDAwMDAyRS0xMCBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAxNQorLS0gc3RpbGwgY2hlY2tpbmcuLi4KK2Rpdng0NDEgZGl2aWRlIDEyMzQ1Njc4MDAwIDEgLT4gMTIzNDU2NzgwMDAKK2Rpdng0NDIgZGl2aWRlIDEgMTIzNDU2NzgwMDAgLT4gOC4xMDAwMDA2NjQyMDAwNUUtMTEgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDQzIGRpdmlkZSAxMjM0NTY3ODAwICAxIC0+IDEyMzQ1Njc4MDAKK2Rpdng0NDQgZGl2aWRlIDEgMTIzNDU2NzgwMCAgLT4gOC4xMDAwMDA2NjQyMDAwNUUtMTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDQ1IGRpdmlkZSAxMjM0NTY3ODkwICAxIC0+IDEyMzQ1Njc4OTAKK2Rpdng0NDYgZGl2aWRlIDEgMTIzNDU2Nzg5MCAgLT4gOC4xMDAwMDAwNzM3MTAwMEUtMTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDQ3IGRpdmlkZSAxMjM0NTY3ODkxICAxIC0+IDEyMzQ1Njc4OTEKK2Rpdng0NDggZGl2aWRlIDEgMTIzNDU2Nzg5MSAgLT4gOC4xMDAwMDAwNjcxNDkwMEUtMTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDQ5IGRpdmlkZSAxMjM0NTY3ODkwMSAxIC0+IDEyMzQ1Njc4OTAxCitkaXZ4NDUwIGRpdmlkZSAxIDEyMzQ1Njc4OTAxIC0+IDguMTAwMDAwMDczMDUzOTBFLTExIEluZXhhY3QgUm91bmRlZAorZGl2eDQ1MSBkaXZpZGUgMTIzNDU2Nzg5NiAgMSAtPiAxMjM0NTY3ODk2CitkaXZ4NDUyIGRpdmlkZSAxIDEyMzQ1Njc4OTYgIC0+IDguMTAwMDAwMDM0MzQ0MDBFLTEwIEluZXhhY3QgUm91bmRlZAorCistLSBoaWdoLWxvd3MKK2Rpdng0NTMgZGl2aWRlIDFlKzEgICAxICAgIC0+ICAgMUUrMQorZGl2eDQ1NCBkaXZpZGUgMWUrMSAgIDEuMCAgLT4gICAxRSsxCitkaXZ4NDU1IGRpdmlkZSAxZSsxICAgMS4wMCAtPiAgIDFFKzEKK2Rpdng0NTYgZGl2aWRlIDFlKzIgICAyICAgIC0+ICAgNUUrMQorZGl2eDQ1NyBkaXZpZGUgMWUrMiAgIDIuMCAgLT4gICA1RSsxCitkaXZ4NDU4IGRpdmlkZSAxZSsyICAgMi4wMCAtPiAgIDVFKzEKKworLS0gc29tZSBmcm9tIElFRUUgZGlzY3Vzc2lvbnMKK2Rpdng0NjAgZGl2aWRlIDNlMCAgICAgIDJlMCAgICAgLT4gMS41CitkaXZ4NDYxIGRpdmlkZSAzMGUtMSAgICAyZTAgICAgIC0+IDEuNQorZGl2eDQ2MiBkaXZpZGUgMzAwZS0yICAgMmUwICAgICAtPiAxLjUwCitkaXZ4NDY0IGRpdmlkZSAzMDAwZS0zICAyZTAgICAgIC0+IDEuNTAwCitkaXZ4NDY1IGRpdmlkZSAzZTAgICAgICAyMGUtMSAgIC0+IDEuNQorZGl2eDQ2NiBkaXZpZGUgMzBlLTEgICAgMjBlLTEgICAtPiAxLjUKK2Rpdng0NjcgZGl2aWRlIDMwMGUtMiAgIDIwZS0xICAgLT4gMS41CitkaXZ4NDY4IGRpdmlkZSAzMDAwZS0zICAyMGUtMSAgIC0+IDEuNTAKK2Rpdng0NjkgZGl2aWRlIDNlMCAgICAgIDIwMGUtMiAgLT4gMS41CitkaXZ4NDcwIGRpdmlkZSAzMGUtMSAgICAyMDBlLTIgIC0+IDEuNQorZGl2eDQ3MSBkaXZpZGUgMzAwZS0yICAgMjAwZS0yICAtPiAxLjUKK2Rpdng0NzIgZGl2aWRlIDMwMDBlLTMgIDIwMGUtMiAgLT4gMS41CitkaXZ4NDczIGRpdmlkZSAzZTAgICAgICAyMDAwZS0zIC0+IDEuNQorZGl2eDQ3NCBkaXZpZGUgMzBlLTEgICAgMjAwMGUtMyAtPiAxLjUKK2Rpdng0NzUgZGl2aWRlIDMwMGUtMiAgIDIwMDBlLTMgLT4gMS41CitkaXZ4NDc2IGRpdmlkZSAzMDAwZS0zICAyMDAwZS0zIC0+IDEuNQorCistLSBzb21lIHJlY2lwcm9jYWxzCitkaXZ4NDgwIGRpdmlkZSAxICAgICAgICAxLjBFKzMzIC0+IDFFLTMzCitkaXZ4NDgxIGRpdmlkZSAxICAgICAgICAxMEUrMzMgIC0+IDFFLTM0CitkaXZ4NDgyIGRpdmlkZSAxICAgICAgICAxLjBFLTMzIC0+IDFFKzMzCitkaXZ4NDgzIGRpdmlkZSAxICAgICAgICAxMEUtMzMgIC0+IDFFKzMyCisKKy0tIFJNUyBkaXNjdXNzaW9uIHRhYmxlCittYXhleHBvbmVudDogIDk2CittaW5leHBvbmVudDogLTk1CitwcmVjaXNpb246ICAgICA3CisKK2Rpdng0ODQgZGl2aWRlIDBlNSAgICAgMWUzIC0+ICAgMEUrMgorZGl2eDQ4NSBkaXZpZGUgMGU1ICAgICAyZTMgLT4gICAwRSsyCitkaXZ4NDg2IGRpdmlkZSAwZTUgICAgMTBlMiAtPiAgIDBFKzMKK2Rpdng0ODcgZGl2aWRlIDBlNSAgICAyMGUyIC0+ICAgMEUrMworZGl2eDQ4OCBkaXZpZGUgMGU1ICAgMTAwZTEgLT4gICAwRSs0CitkaXZ4NDg5IGRpdmlkZSAwZTUgICAyMDBlMSAtPiAgIDBFKzQKKworZGl2eDQ5MSBkaXZpZGUgMWU1ICAgICAxZTMgLT4gICAxRSsyCitkaXZ4NDkyIGRpdmlkZSAxZTUgICAgIDJlMyAtPiAgIDVFKzEKK2Rpdng0OTMgZGl2aWRlIDFlNSAgICAxMGUyIC0+ICAgMUUrMgorZGl2eDQ5NCBkaXZpZGUgMWU1ICAgIDIwZTIgLT4gICA1RSsxCitkaXZ4NDk1IGRpdmlkZSAxZTUgICAxMDBlMSAtPiAgIDFFKzIKK2Rpdng0OTYgZGl2aWRlIDFlNSAgIDIwMGUxIC0+ICAgNUUrMQorCistLSB0cnl6ZXJvcyBjYXNlcworcHJlY2lzaW9uOiAgIDcKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTIKK21pbmV4cG9uZW50OiAtOTIKK2Rpdng0OTcgIGRpdmlkZSAgMEUrODYgMTAwMEUtMTMgIC0+IDBFKzkyIENsYW1wZWQKK2Rpdng0OTggIGRpdmlkZSAgMEUtOTggMTAwMEUrMTMgIC0+IDBFLTk4IENsYW1wZWQKKworcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorCistLSBmb2N1cyBvbiB0cmFpbGluZyB6ZXJvcyBpc3N1ZXMKK3ByZWNpc2lvbjogICA5CitkaXZ4NTAwIGRpdmlkZSAgMSAgICAgIDkuOSAgICAtPiAgMC4xMDEwMTAxMDEgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDgKK2Rpdng1MDEgZGl2aWRlICAxICAgICAgOS45ICAgIC0+ICAwLjEwMTAxMDEwICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgNworZGl2eDUwMiBkaXZpZGUgIDEgICAgICA5LjkgICAgLT4gIDAuMTAxMDEwMSAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA2CitkaXZ4NTAzIGRpdmlkZSAgMSAgICAgIDkuOSAgICAtPiAgMC4xMDEwMTAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDkKKworZGl2eDUxMSBkaXZpZGUgMSAgICAgICAgIDIgICAgLT4gMC41CitkaXZ4NTEyIGRpdmlkZSAxLjAgICAgICAgMiAgICAtPiAwLjUKK2Rpdng1MTMgZGl2aWRlIDEuMDAgICAgICAyICAgIC0+IDAuNTAKK2Rpdng1MTQgZGl2aWRlIDEuMDAwICAgICAyICAgIC0+IDAuNTAwCitkaXZ4NTE1IGRpdmlkZSAxLjAwMDAgICAgMiAgICAtPiAwLjUwMDAKK2Rpdng1MTYgZGl2aWRlIDEuMDAwMDAgICAyICAgIC0+IDAuNTAwMDAKK2Rpdng1MTcgZGl2aWRlIDEuMDAwMDAwICAyICAgIC0+IDAuNTAwMDAwCitkaXZ4NTE4IGRpdmlkZSAxLjAwMDAwMDAgMiAgICAtPiAwLjUwMDAwMDAKK2Rpdng1MTkgZGl2aWRlIDEuMDAgICAgICAyLjAwIC0+IDAuNQorCitkaXZ4NTIxIGRpdmlkZSAyICAgIDEgICAgICAgICAtPiAyCitkaXZ4NTIyIGRpdmlkZSAyICAgIDEuMCAgICAgICAtPiAyCitkaXZ4NTIzIGRpdmlkZSAyICAgIDEuMDAgICAgICAtPiAyCitkaXZ4NTI0IGRpdmlkZSAyICAgIDEuMDAwICAgICAtPiAyCitkaXZ4NTI1IGRpdmlkZSAyICAgIDEuMDAwMCAgICAtPiAyCitkaXZ4NTI2IGRpdmlkZSAyICAgIDEuMDAwMDAgICAtPiAyCitkaXZ4NTI3IGRpdmlkZSAyICAgIDEuMDAwMDAwICAtPiAyCitkaXZ4NTI4IGRpdmlkZSAyICAgIDEuMDAwMDAwMCAtPiAyCitkaXZ4NTI5IGRpdmlkZSAyLjAwIDEuMDAgICAgICAtPiAyCisKK2Rpdng1MzAgZGl2aWRlICAyLjQwICAgMiAgICAgIC0+ICAxLjIwCitkaXZ4NTMxIGRpdmlkZSAgMi40MCAgIDQgICAgICAtPiAgMC42MAorZGl2eDUzMiBkaXZpZGUgIDIuNDAgIDEwICAgICAgLT4gIDAuMjQKK2Rpdng1MzMgZGl2aWRlICAyLjQwICAgMi4wICAgIC0+ICAxLjIKK2Rpdng1MzQgZGl2aWRlICAyLjQwICAgNC4wICAgIC0+ICAwLjYKK2Rpdng1MzUgZGl2aWRlICAyLjQwICAxMC4wICAgIC0+ICAwLjI0CitkaXZ4NTM2IGRpdmlkZSAgMi40MCAgIDIuMDAgICAtPiAgMS4yCitkaXZ4NTM3IGRpdmlkZSAgMi40MCAgIDQuMDAgICAtPiAgMC42CitkaXZ4NTM4IGRpdmlkZSAgMi40MCAgMTAuMDAgICAtPiAgMC4yNAorZGl2eDUzOSBkaXZpZGUgIDAuOSAgICAwLjEgICAgLT4gIDkKK2Rpdng1NDAgZGl2aWRlICAwLjkgICAgMC4wMSAgIC0+ICA5RSsxCitkaXZ4NTQxIGRpdmlkZSAgMC45ICAgIDAuMDAxICAtPiAgOUUrMgorZGl2eDU0MiBkaXZpZGUgIDUgICAgICAyICAgICAgLT4gIDIuNQorZGl2eDU0MyBkaXZpZGUgIDUgICAgICAyLjAgICAgLT4gIDIuNQorZGl2eDU0NCBkaXZpZGUgIDUgICAgICAyLjAwICAgLT4gIDIuNQorZGl2eDU0NSBkaXZpZGUgIDUgICAgICAyMCAgICAgLT4gIDAuMjUKK2Rpdng1NDYgZGl2aWRlICA1ICAgICAgMjAuMCAgIC0+ICAwLjI1CitkaXZ4NTQ3IGRpdmlkZSAgMi40MDAgIDIgICAgICAtPiAgMS4yMDAKK2Rpdng1NDggZGl2aWRlICAyLjQwMCAgMi4wICAgIC0+ICAxLjIwCitkaXZ4NTQ5IGRpdmlkZSAgMi40MDAgIDIuNDAwICAtPiAgMQorCitkaXZ4NTUwIGRpdmlkZSAgMjQwICAgIDEgICAgICAtPiAgMjQwCitkaXZ4NTUxIGRpdmlkZSAgMjQwICAgIDEwICAgICAtPiAgMjQKK2Rpdng1NTIgZGl2aWRlICAyNDAgICAgMTAwICAgIC0+ICAyLjQKK2Rpdng1NTMgZGl2aWRlICAyNDAgICAgMTAwMCAgIC0+ICAwLjI0CitkaXZ4NTU0IGRpdmlkZSAgMjQwMCAgIDEgICAgICAtPiAgMjQwMAorZGl2eDU1NSBkaXZpZGUgIDI0MDAgICAxMCAgICAgLT4gIDI0MAorZGl2eDU1NiBkaXZpZGUgIDI0MDAgICAxMDAgICAgLT4gIDI0CitkaXZ4NTU3IGRpdmlkZSAgMjQwMCAgIDEwMDAgICAtPiAgMi40CisKKy0tICt2ZSBleHBvbmVudAorcHJlY2lzaW9uOiA1CitkaXZ4NTcwIGRpdmlkZSAgMi40RSs2ICAgICAyICAtPiAgMS4yRSs2CitkaXZ4NTcxIGRpdmlkZSAgMi40MEUrNiAgICAyICAtPiAgMS4yMEUrNgorZGl2eDU3MiBkaXZpZGUgIDIuNDAwRSs2ICAgMiAgLT4gIDEuMjAwRSs2CitkaXZ4NTczIGRpdmlkZSAgMi40MDAwRSs2ICAyICAtPiAgMS4yMDAwRSs2CitkaXZ4NTc0IGRpdmlkZSAgMjRFKzUgICAgICAyICAtPiAgMS4yRSs2CitkaXZ4NTc1IGRpdmlkZSAgMjQwRSs0ICAgICAyICAtPiAgMS4yMEUrNgorZGl2eDU3NiBkaXZpZGUgIDI0MDBFKzMgICAgMiAgLT4gIDEuMjAwRSs2CitkaXZ4NTc3IGRpdmlkZSAgMjQwMDBFKzIgICAyICAtPiAgMS4yMDAwRSs2CitwcmVjaXNpb246IDYKK2Rpdng1ODAgZGl2aWRlICAyLjRFKzYgICAgIDIgIC0+ICAxLjJFKzYKK2Rpdng1ODEgZGl2aWRlICAyLjQwRSs2ICAgIDIgIC0+ICAxLjIwRSs2CitkaXZ4NTgyIGRpdmlkZSAgMi40MDBFKzYgICAyICAtPiAgMS4yMDBFKzYKK2Rpdng1ODMgZGl2aWRlICAyLjQwMDBFKzYgIDIgIC0+ICAxLjIwMDBFKzYKK2Rpdng1ODQgZGl2aWRlICAyNEUrNSAgICAgIDIgIC0+ICAxLjJFKzYKK2Rpdng1ODUgZGl2aWRlICAyNDBFKzQgICAgIDIgIC0+ICAxLjIwRSs2CitkaXZ4NTg2IGRpdmlkZSAgMjQwMEUrMyAgICAyICAtPiAgMS4yMDBFKzYKK2Rpdng1ODcgZGl2aWRlICAyNDAwMEUrMiAgIDIgIC0+ICAxLjIwMDBFKzYKK3ByZWNpc2lvbjogNworZGl2eDU5MCBkaXZpZGUgIDIuNEUrNiAgICAgMiAgLT4gIDEuMkUrNgorZGl2eDU5MSBkaXZpZGUgIDIuNDBFKzYgICAgMiAgLT4gIDEuMjBFKzYKK2Rpdng1OTIgZGl2aWRlICAyLjQwMEUrNiAgIDIgIC0+ICAxLjIwMEUrNgorZGl2eDU5MyBkaXZpZGUgIDIuNDAwMEUrNiAgMiAgLT4gIDEuMjAwMEUrNgorZGl2eDU5NCBkaXZpZGUgIDI0RSs1ICAgICAgMiAgLT4gIDEuMkUrNgorZGl2eDU5NSBkaXZpZGUgIDI0MEUrNCAgICAgMiAgLT4gIDEuMjBFKzYKK2Rpdng1OTYgZGl2aWRlICAyNDAwRSszICAgIDIgIC0+ICAxLjIwMEUrNgorZGl2eDU5NyBkaXZpZGUgIDI0MDAwRSsyICAgMiAgLT4gIDEuMjAwMEUrNgorcHJlY2lzaW9uOiAgIDkKK2Rpdng2MDAgZGl2aWRlICAyLjRFKzkgICAgIDIgIC0+ICAxLjJFKzkKK2Rpdng2MDEgZGl2aWRlICAyLjQwRSs5ICAgIDIgIC0+ICAxLjIwRSs5CitkaXZ4NjAyIGRpdmlkZSAgMi40MDBFKzkgICAyICAtPiAgMS4yMDBFKzkKK2Rpdng2MDMgZGl2aWRlICAyLjQwMDBFKzkgIDIgIC0+ICAxLjIwMDBFKzkKK2Rpdng2MDQgZGl2aWRlICAyNEUrOCAgICAgIDIgIC0+ICAxLjJFKzkKK2Rpdng2MDUgZGl2aWRlICAyNDBFKzcgICAgIDIgIC0+ICAxLjIwRSs5CitkaXZ4NjA2IGRpdmlkZSAgMjQwMEUrNiAgICAyICAtPiAgMS4yMDBFKzkKK2Rpdng2MDcgZGl2aWRlICAyNDAwMEUrNSAgIDIgIC0+ICAxLjIwMDBFKzkKKworLS0gbG9uZyBvcGVyYW5kIHRyaWFuZ2xlCitwcmVjaXNpb246IDMzCitkaXZ4NjEwIGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNDEwMTE0MDg4ODM3OTY4MTc3OTcuODEzMTA5NzcwMzc5MiBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzIKK2Rpdng2MTEgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00MTAxMTQwODg4Mzc5NjgxNzc5Ny44MTMxMDk3NzAzNzkgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMQorZGl2eDYxMiBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQxMDExNDA4ODgzNzk2ODE3Nzk3LjgxMzEwOTc3MDM4ICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMwCitkaXZ4NjEzIGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNDEwMTE0MDg4ODM3OTY4MTc3OTcuODEzMTA5NzcwNCAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjkKK2Rpdng2MTQgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00MTAxMTQwODg4Mzc5NjgxNzc5Ny44MTMxMDk3NzAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyOAorZGl2eDYxNSBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQxMDExNDA4ODgzNzk2ODE3Nzk3LjgxMzEwOTc3ICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI3CitkaXZ4NjE2IGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNDEwMTE0MDg4ODM3OTY4MTc3OTcuODEzMTA5OCAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjYKK2Rpdng2MTcgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00MTAxMTQwODg4Mzc5NjgxNzc5Ny44MTMxMTAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNQorZGl2eDYxOCBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQxMDExNDA4ODgzNzk2ODE3Nzk3LjgxMzExICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI0CitkaXZ4NjE5IGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNDEwMTE0MDg4ODM3OTY4MTc3OTcuODEzMSAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjMKK2Rpdng2MjAgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00MTAxMTQwODg4Mzc5NjgxNzc5Ny44MTMgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMgorZGl2eDYyMSBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQxMDExNDA4ODgzNzk2ODE3Nzk3LjgxICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIxCitkaXZ4NjIyIGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNDEwMTE0MDg4ODM3OTY4MTc3OTcuOCAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjAKK2Rpdng2MjMgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00MTAxMTQwODg4Mzc5NjgxNzc5OCAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxOQorZGl2eDYyNCBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQwODg4Mzc5NjgxNzgwRSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxOAorZGl2eDYyNSBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQwODg4Mzc5NjgxNzhFKzE5ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE3CitkaXZ4NjI2IGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNC4xMDExNDA4ODgzNzk2ODE4RSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNgorZGl2eDYyNyBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQwODg4Mzc5NjgyRSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNQorZGl2eDYyOCBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQwODg4Mzc5NjhFKzE5ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE0CitkaXZ4NjI5IGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNC4xMDExNDA4ODgzNzk3RSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMworZGl2eDYzMCBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQwODg4MzgwRSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMgorZGl2eDYzMSBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQwODg4MzhFKzE5ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDExCitkaXZ4NjMyIGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNC4xMDExNDA4ODg0RSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMAorZGl2eDYzMyBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQwODg4RSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgOQorZGl2eDYzNCBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQwODlFKzE5ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA4CitkaXZ4NjM1IGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNC4xMDExNDA5RSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNworZGl2eDYzNiBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQxRSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNgorZGl2eDYzNyBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTRFKzE5ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA1CitkaXZ4NjM4IGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNC4xMDExRSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNAorZGl2eDYzOSBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxRSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMworZGl2eDY0MCBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTBFKzE5ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyCitkaXZ4NjQxIGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNC4xRSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMQorZGl2eDY0MiBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTRFKzE5ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG1vcmUgemVyb3MsIGV0Yy4KK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCisKK2Rpdng3MzEgZGl2aWRlIDUuMDAgMUUtMyAgICAtPiA1LjAwRSszCitkaXZ4NzMyIGRpdmlkZSAwMC4wMCAwLjAwMCAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGl2eDczMyBkaXZpZGUgMDAuMDAgMEUtMyAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2Rpdng3MzQgZGl2aWRlICAwICAgIC0wICAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkaXZ4NzM1IGRpdmlkZSAtMCAgICAgMCAgICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGl2eDczNiBkaXZpZGUgLTAgICAgLTAgICAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKKworZGl2eDc0MSBkaXZpZGUgIDAgICAgLTEgICAgIC0+IC0wCitkaXZ4NzQyIGRpdmlkZSAtMCAgICAtMSAgICAgLT4gIDAKK2Rpdng3NDMgZGl2aWRlICAwICAgICAxICAgICAtPiAgMAorZGl2eDc0NCBkaXZpZGUgLTAgICAgIDEgICAgIC0+IC0wCitkaXZ4NzQ1IGRpdmlkZSAtMSAgICAgMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng3NDYgZGl2aWRlIC0xICAgIC0wICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDc0NyBkaXZpZGUgIDEgICAgIDAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4NzQ4IGRpdmlkZSAgMSAgICAtMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGl2eDc1MSBkaXZpZGUgIDAuMCAgLTEgICAgIC0+IC0wLjAKK2Rpdng3NTIgZGl2aWRlIC0wLjAgIC0xICAgICAtPiAgMC4wCitkaXZ4NzUzIGRpdmlkZSAgMC4wICAgMSAgICAgLT4gIDAuMAorZGl2eDc1NCBkaXZpZGUgLTAuMCAgIDEgICAgIC0+IC0wLjAKK2Rpdng3NTUgZGl2aWRlIC0xLjAgICAwICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDc1NiBkaXZpZGUgLTEuMCAgLTAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4NzU3IGRpdmlkZSAgMS4wICAgMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng3NTggZGl2aWRlICAxLjAgIC0wICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkaXZ4NzYxIGRpdmlkZSAgMCAgICAtMS4wICAgLT4gLTBFKzEKK2Rpdng3NjIgZGl2aWRlIC0wICAgIC0xLjAgICAtPiAgMEUrMQorZGl2eDc2MyBkaXZpZGUgIDAgICAgIDEuMCAgIC0+ICAwRSsxCitkaXZ4NzY0IGRpdmlkZSAtMCAgICAgMS4wICAgLT4gLTBFKzEKK2Rpdng3NjUgZGl2aWRlIC0xICAgICAwLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDc2NiBkaXZpZGUgLTEgICAgLTAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4NzY3IGRpdmlkZSAgMSAgICAgMC4wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng3NjggZGl2aWRlICAxICAgIC0wLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkaXZ4NzcxIGRpdmlkZSAgMC4wICAtMS4wICAgLT4gLTAKK2Rpdng3NzIgZGl2aWRlIC0wLjAgIC0xLjAgICAtPiAgMAorZGl2eDc3MyBkaXZpZGUgIDAuMCAgIDEuMCAgIC0+ICAwCitkaXZ4Nzc0IGRpdmlkZSAtMC4wICAgMS4wICAgLT4gLTAKK2Rpdng3NzUgZGl2aWRlIC0xLjAgICAwLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDc3NiBkaXZpZGUgLTEuMCAgLTAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4Nzc3IGRpdmlkZSAgMS4wICAgMC4wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng3NzggZGl2aWRlICAxLjAgIC0wLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCistLSBTcGVjaWFscworZGl2eDc4MCBkaXZpZGUgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rpdng3ODEgZGl2aWRlICBJbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK2Rpdng3ODIgZGl2aWRlICBJbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2Rpdng3ODMgZGl2aWRlICBJbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2Rpdng3ODQgZGl2aWRlICBJbmYgICAwICAgICAtPiAgSW5maW5pdHkKK2Rpdng3ODUgZGl2aWRlICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2Rpdng3ODYgZGl2aWRlICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK2Rpdng3ODcgZGl2aWRlICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4Nzg4IGRpdmlkZSAtMTAwMCAgSW5mICAgLT4gLTBFLTM5OCBDbGFtcGVkCitkaXZ4Nzg5IGRpdmlkZSAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDc5MCBkaXZpZGUgLTEgICAgIEluZiAgIC0+IC0wRS0zOTggQ2xhbXBlZAorZGl2eDc5MSBkaXZpZGUgLTAgICAgIEluZiAgIC0+IC0wRS0zOTggQ2xhbXBlZAorZGl2eDc5MiBkaXZpZGUgIDAgICAgIEluZiAgIC0+ICAwRS0zOTggQ2xhbXBlZAorZGl2eDc5MyBkaXZpZGUgIDEgICAgIEluZiAgIC0+ICAwRS0zOTggQ2xhbXBlZAorZGl2eDc5NCBkaXZpZGUgIDEwMDAgIEluZiAgIC0+ICAwRS0zOTggQ2xhbXBlZAorZGl2eDc5NSBkaXZpZGUgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZGl2eDgwMCBkaXZpZGUgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4MDEgZGl2aWRlIC1JbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK2Rpdng4MDIgZGl2aWRlIC1JbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2Rpdng4MDMgZGl2aWRlIC1JbmYgIC0wICAgICAtPiAgSW5maW5pdHkKK2Rpdng4MDQgZGl2aWRlIC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK2Rpdng4MDUgZGl2aWRlIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2Rpdng4MDYgZGl2aWRlIC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2Rpdng4MDcgZGl2aWRlIC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODA4IGRpdmlkZSAtMTAwMCAgSW5mICAgLT4gLTBFLTM5OCBDbGFtcGVkCitkaXZ4ODA5IGRpdmlkZSAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDgxMCBkaXZpZGUgLTEgICAgLUluZiAgIC0+ICAwRS0zOTggQ2xhbXBlZAorZGl2eDgxMSBkaXZpZGUgLTAgICAgLUluZiAgIC0+ICAwRS0zOTggQ2xhbXBlZAorZGl2eDgxMiBkaXZpZGUgIDAgICAgLUluZiAgIC0+IC0wRS0zOTggQ2xhbXBlZAorZGl2eDgxMyBkaXZpZGUgIDEgICAgLUluZiAgIC0+IC0wRS0zOTggQ2xhbXBlZAorZGl2eDgxNCBkaXZpZGUgIDEwMDAgLUluZiAgIC0+IC0wRS0zOTggQ2xhbXBlZAorZGl2eDgxNSBkaXZpZGUgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZGl2eDgyMSBkaXZpZGUgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2Rpdng4MjIgZGl2aWRlICBOYU4gLTEwMDAgICAtPiAgTmFOCitkaXZ4ODIzIGRpdmlkZSAgTmFOIC0xICAgICAgLT4gIE5hTgorZGl2eDgyNCBkaXZpZGUgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2Rpdng4MjUgZGl2aWRlICBOYU4gIDAgICAgICAtPiAgTmFOCitkaXZ4ODI2IGRpdmlkZSAgTmFOICAxICAgICAgLT4gIE5hTgorZGl2eDgyNyBkaXZpZGUgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2Rpdng4MjggZGl2aWRlICBOYU4gIEluZiAgICAtPiAgTmFOCitkaXZ4ODI5IGRpdmlkZSAgTmFOICBOYU4gICAgLT4gIE5hTgorZGl2eDgzMCBkaXZpZGUgLUluZiAgTmFOICAgIC0+ICBOYU4KK2Rpdng4MzEgZGl2aWRlIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkaXZ4ODMyIGRpdmlkZSAtMSAgICBOYU4gICAgLT4gIE5hTgorZGl2eDgzMyBkaXZpZGUgLTAgICAgTmFOICAgIC0+ICBOYU4KK2Rpdng4MzQgZGl2aWRlICAwICAgIE5hTiAgICAtPiAgTmFOCitkaXZ4ODM1IGRpdmlkZSAgMSAgICBOYU4gICAgLT4gIE5hTgorZGl2eDgzNiBkaXZpZGUgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2Rpdng4MzcgZGl2aWRlICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2Rpdng4NDEgZGl2aWRlICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg0MiBkaXZpZGUgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODQzIGRpdmlkZSAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NDQgZGl2aWRlICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg0NSBkaXZpZGUgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODQ2IGRpdmlkZSAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NDcgZGl2aWRlICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg0OCBkaXZpZGUgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODQ5IGRpdmlkZSAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NTAgZGl2aWRlICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg1MSBkaXZpZGUgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODUyIGRpdmlkZSAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NTMgZGl2aWRlIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg1NCBkaXZpZGUgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODU1IGRpdmlkZSAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NTYgZGl2aWRlICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg1NyBkaXZpZGUgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODU4IGRpdmlkZSAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NTkgZGl2aWRlICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkaXZ4ODYxIGRpdmlkZSAgTmFOOSAtSW5mICAgLT4gIE5hTjkKK2Rpdng4NjIgZGl2aWRlICBOYU44ICAxMDAwICAtPiAgTmFOOAorZGl2eDg2MyBkaXZpZGUgIE5hTjcgIEluZiAgIC0+ICBOYU43CitkaXZ4ODY0IGRpdmlkZSAgTmFONiAgTmFONSAgLT4gIE5hTjYKK2Rpdng4NjUgZGl2aWRlIC1JbmYgICBOYU40ICAtPiAgTmFONAorZGl2eDg2NiBkaXZpZGUgLTEwMDAgIE5hTjMgIC0+ICBOYU4zCitkaXZ4ODY3IGRpdmlkZSAgSW5mICAgTmFOMiAgLT4gIE5hTjIKKworZGl2eDg3MSBkaXZpZGUgIHNOYU45OSAtSW5mICAgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg3MiBkaXZpZGUgIHNOYU45OCAtMSAgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg3MyBkaXZpZGUgIHNOYU45NyAgTmFOICAgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg3NCBkaXZpZGUgIHNOYU45NiBzTmFOOTQgIC0+ICBOYU45NiBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg3NSBkaXZpZGUgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg3NiBkaXZpZGUgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg3NyBkaXZpZGUgIDAgICAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg3OCBkaXZpZGUgIEluZiAgICBzTmFOOTAgIC0+ICBOYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg3OSBkaXZpZGUgIE5hTiAgICBzTmFOODkgIC0+ICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCitkaXZ4ODgxIGRpdmlkZSAgLU5hTjkgIC1JbmYgICAtPiAgLU5hTjkKK2Rpdng4ODIgZGl2aWRlICAtTmFOOCAgIDEwMDAgIC0+ICAtTmFOOAorZGl2eDg4MyBkaXZpZGUgIC1OYU43ICAgSW5mICAgLT4gIC1OYU43CitkaXZ4ODg0IGRpdmlkZSAgLU5hTjYgIC1OYU41ICAtPiAgLU5hTjYKK2Rpdng4ODUgZGl2aWRlICAtSW5mICAgLU5hTjQgIC0+ICAtTmFONAorZGl2eDg4NiBkaXZpZGUgIC0xMDAwICAtTmFOMyAgLT4gIC1OYU4zCitkaXZ4ODg3IGRpdmlkZSAgIEluZiAgIC1OYU4yICAtPiAgLU5hTjIKKworZGl2eDg5MSBkaXZpZGUgLXNOYU45OSAtSW5mICAgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg5MiBkaXZpZGUgLXNOYU45OCAtMSAgICAgIC0+IC1OYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg5MyBkaXZpZGUgLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg5NCBkaXZpZGUgLXNOYU45NiAtc05hTjk0IC0+IC1OYU45NiBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg5NSBkaXZpZGUgLU5hTjk1ICAtc05hTjkzIC0+IC1OYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg5NiBkaXZpZGUgLUluZiAgICAtc05hTjkyIC0+IC1OYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg5NyBkaXZpZGUgIDAgICAgICAtc05hTjkxIC0+IC1OYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg5OCBkaXZpZGUgIEluZiAgICAtc05hTjkwIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg5OSBkaXZpZGUgLU5hTiAgICAtc05hTjg5IC0+IC1OYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIGRpdmlkZSBieSAwCitkaXZ4OTAxIGRpdmlkZSAgICAwICAgICAgIDAgICAtPiAgTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGl2eDkwMiBkaXZpZGUgICAgMC4wRTUgICAwICAgLT4gIE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2Rpdng5MDMgZGl2aWRlICAgIDAuMDAwICAgMCAgIC0+ICBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkaXZ4OTA0IGRpdmlkZSAgICAwLjAwMDEgIDAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkwNSBkaXZpZGUgICAgMC4wMSAgICAwICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MDYgZGl2aWRlICAgIDAuMSAgICAgMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTA3IGRpdmlkZSAgICAxICAgICAgIDAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkwOCBkaXZpZGUgICAgMSAgICAgICAwLjAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MDkgZGl2aWRlICAgMTAgICAgICAgMC4wIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTEwIGRpdmlkZSAgIDFFKzEwMCAgIDAuMCAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkxMSBkaXZpZGUgICAxRSsxMDAwICAwICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGl2eDkyMSBkaXZpZGUgICAtMC4wMDAxICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MjIgZGl2aWRlICAgLTAuMDEgICAgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTIzIGRpdmlkZSAgIC0wLjEgICAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkyNCBkaXZpZGUgICAtMSAgICAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MjUgZGl2aWRlICAgLTEgICAgICAgMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTI2IGRpdmlkZSAgLTEwICAgICAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkyNyBkaXZpZGUgIC0xRSsxMDAgICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MjggZGl2aWRlICAtMUUrMTAwMCAgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKK2Rpdng5MzEgZGl2aWRlICAgIDAuMDAwMSAtMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTMyIGRpdmlkZSAgICAwLjAxICAgLTAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkzMyBkaXZpZGUgICAgMC4xICAgIC0wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MzQgZGl2aWRlICAgIDEgICAgICAtMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTM1IGRpdmlkZSAgICAxICAgICAgLTAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkzNiBkaXZpZGUgICAxMCAgICAgIC0wLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MzcgZGl2aWRlICAgMUUrMTAwICAtMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTM4IGRpdmlkZSAgIDFFKzEwMDAgLTAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkaXZ4OTQxIGRpdmlkZSAgIC0wLjAwMDEgLTAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDk0MiBkaXZpZGUgICAtMC4wMSAgIC0wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5NDMgZGl2aWRlICAgLTAuMSAgICAtMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTQ0IGRpdmlkZSAgIC0xICAgICAgLTAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDk0NSBkaXZpZGUgICAtMSAgICAgIC0wLjAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5NDYgZGl2aWRlICAtMTAgICAgICAtMC4wIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTQ3IGRpdmlkZSAgLTFFKzEwMCAgLTAuMCAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDk0OCBkaXZpZGUgIC0xRSsxMDAwIC0wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cworcHJlY2lzaW9uOiA5CittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorZGl2eDk1MSBkaXZpZGUgOUUrOTk5OTk5OTk5ICswLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+IEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZGl2eDk1MiBkaXZpZGUgKzAuMTAwIDlFKzk5OTk5OTk5OSAtPiAxLjExMTExMUUtMTAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZGl2eDk1MyBkaXZpZGUgOUUtOTk5OTk5OTk5ICs5LjEwMCAtPiA5Ljg5MDEwOTlFLTEwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2Rpdng5NTQgZGl2aWRlIC0xLjIzNDU2Nzg5ICAgICAgICAgIDlFKzk5OTk5OTk5OSAtPiAtMS4zNzE3NDIxRS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorZGl2eDk1NSBkaXZpZGUgLTEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5IC0+IC0xLjM3MTc0MjFFLTEwMDAwMDAwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBSb3VuZGVkIEluZXhhY3QKK2Rpdng5NTYgZGl2aWRlIC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDdFKzk5OTk5OTk5OSAtPiAtMS43NjM2Njg0RS0xMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsCitkaXZ4OTU3IGRpdmlkZSA5RSs5OTk5OTk5OTkgLTAuODM0NTY3ODkwMTIzNDVFLTAgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZGl2eDk1OCBkaXZpZGUgLTAuMTAwIDlFKzk5OTk5OTk5OSAtPiAtMS4xMTExMTFFLTEwMDAwMDAwMDEgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2Rpdng5NTkgZGl2aWRlIDlFLTk5OTk5OTk5OSAtOS4xMDAgLT4gLTkuODkwMTA5OUUtMTAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IChhZGRpdGlvbmFsIGVkZ2UgdGVzdHMgaW4gbXVsdGlwbHkuZGVjVGVzdCkKKy0tICdzdWJub3JtYWwnIHJlc3VsdHMgbm93IHBvc3NpYmxlIChhbGwgaGFyZCB1bmRlcmZsb3cgb3Igb3ZlcmZsb3cgaW4KKy0tIGJhc2UgYXJpdGhlbXRpYykKK2Rpdng5NjAgZGl2aWRlIDFlLTYwMDAwMDAwMCAxZSs0MDAwMDAwMDEgLT4gMUUtMTAwMDAwMDAwMSBTdWJub3JtYWwKK2Rpdng5NjEgZGl2aWRlIDFlLTYwMDAwMDAwMCAxZSs0MDAwMDAwMDIgLT4gMUUtMTAwMDAwMDAwMiBTdWJub3JtYWwKK2Rpdng5NjIgZGl2aWRlIDFlLTYwMDAwMDAwMCAxZSs0MDAwMDAwMDMgLT4gMUUtMTAwMDAwMDAwMyBTdWJub3JtYWwKK2Rpdng5NjMgZGl2aWRlIDFlLTYwMDAwMDAwMCAxZSs0MDAwMDAwMDQgLT4gMUUtMTAwMDAwMDAwNCBTdWJub3JtYWwKK2Rpdng5NjQgZGl2aWRlIDFlLTYwMDAwMDAwMCAxZSs0MDAwMDAwMDUgLT4gMUUtMTAwMDAwMDAwNSBTdWJub3JtYWwKK2Rpdng5NjUgZGl2aWRlIDFlLTYwMDAwMDAwMCAxZSs0MDAwMDAwMDYgLT4gMUUtMTAwMDAwMDAwNiBTdWJub3JtYWwKK2Rpdng5NjYgZGl2aWRlIDFlLTYwMDAwMDAwMCAxZSs0MDAwMDAwMDcgLT4gMUUtMTAwMDAwMDAwNyBTdWJub3JtYWwKK2Rpdng5NjcgZGl2aWRlIDFlLTYwMDAwMDAwMCAxZSs0MDAwMDAwMDggLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkaXZ4OTY4IGRpdmlkZSAxZS02MDAwMDAwMDAgMWUrNDAwMDAwMDA5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGl2eDk2OSBkaXZpZGUgMWUtNjAwMDAwMDAwIDFlKzQwMDAwMDAxMCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKy0tIFtubyBlcXVpdmFsZW50IG9mICdzdWJub3JtYWwnIGZvciBvdmVyZmxvd10KK2Rpdng5NzAgZGl2aWRlIDFlKzYwMDAwMDAwMCAxZS00MDAwMDAwMDEgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkaXZ4OTcxIGRpdmlkZSAxZSs2MDAwMDAwMDAgMWUtNDAwMDAwMDAyIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGl2eDk3MiBkaXZpZGUgMWUrNjAwMDAwMDAwIDFlLTQwMDAwMDAwMyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rpdng5NzMgZGl2aWRlIDFlKzYwMDAwMDAwMCAxZS00MDAwMDAwMDQgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkaXZ4OTc0IGRpdmlkZSAxZSs2MDAwMDAwMDAgMWUtNDAwMDAwMDA1IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGl2eDk3NSBkaXZpZGUgMWUrNjAwMDAwMDAwIDFlLTQwMDAwMDAwNiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rpdng5NzYgZGl2aWRlIDFlKzYwMDAwMDAwMCAxZS00MDAwMDAwMDcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkaXZ4OTc3IGRpdmlkZSAxZSs2MDAwMDAwMDAgMWUtNDAwMDAwMDA4IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGl2eDk3OCBkaXZpZGUgMWUrNjAwMDAwMDAwIDFlLTQwMDAwMDAwOSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rpdng5NzkgZGl2aWRlIDFlKzYwMDAwMDAwMCAxZS00MDAwMDAwMTAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tIFNpZ24gYWZ0ZXIgb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdworZGl2eDk4MCBkaXZpZGUgIDFlLTYwMDAwMDAwMCAgMWUrNDAwMDAwMDA5IC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Rpdng5ODEgZGl2aWRlICAxZS02MDAwMDAwMDAgLTFlKzQwMDAwMDAwOSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkaXZ4OTgyIGRpdmlkZSAtMWUtNjAwMDAwMDAwICAxZSs0MDAwMDAwMDkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGl2eDk4MyBkaXZpZGUgLTFlLTYwMDAwMDAwMCAtMWUrNDAwMDAwMDA5IC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Rpdng5ODQgZGl2aWRlICAxZSs2MDAwMDAwMDAgIDFlLTQwMDAwMDAwOSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkaXZ4OTg1IGRpdmlkZSAgMWUrNjAwMDAwMDAwIC0xZS00MDAwMDAwMDkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGl2eDk4NiBkaXZpZGUgLTFlKzYwMDAwMDAwMCAgMWUtNDAwMDAwMDA5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rpdng5ODcgZGl2aWRlIC0xZSs2MDAwMDAwMDAgLTFlLTQwMDAwMDAwOSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tIExvbmcgb3BlcmFuZCBvdmVyZmxvdyBtYXkgYmUgYSBkaWZmZXJlbnQgcGF0aAorcHJlY2lzaW9uOiAzCitkaXZ4OTkwIGRpdmlkZSAxMDAwICA5Ljk5OUUtOTk5OTk5OTk5ICAgICAgLT4gIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZGl2eDk5MSBkaXZpZGUgMTAwMCAtOS45OTlFLTk5OTk5OTk5OSAgICAgIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2Rpdng5OTIgZGl2aWRlICAgICAgIDkuOTk5RSs5OTk5OTk5OTkgMC4wMSAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitkaXZ4OTkzIGRpdmlkZSAgICAgIC05Ljk5OUUrOTk5OTk5OTk5IDAuMDEgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorCistLSBjaGVjayBmb3IgZG91YmxlLXJvdW5kZWQgc3Vibm9ybWFscworcHJlY2lzaW9uOiAgIDUKK21heGV4cG9uZW50OiA3OQorbWluZXhwb25lbnQ6IC03OQorZGl2eDEwMDEgZGl2aWRlICAgIDEuNTI0NDRFLTgwIDEgICAgICAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RpdngxMDAyIGRpdmlkZSAgICAxLjUyNDQ1RS04MCAxICAgICAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkaXZ4MTAwMyBkaXZpZGUgICAgMS41MjQ0NkUtODAgMSAgICAgIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCistLSBhIHJvdW5kaW5nIHByb2JsZW0gaW4gb25lIGltcGxlbWVudGF0aW9uCitwcmVjaXNpb246ICAgMzQKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCistLSBVbmJvdW5kZWQgYW5zd2VyIHRvIDQwIGRpZ2l0czoKKy0tICAgMS40NjU4MTE5NjU4MTE5NjU4MTE5NjU4MTE5NjU4MTE5NjU4MTE5NjZFKzcwMDAKK2RpdngxMDEwIGRpdmlkZSAzNDNFNjAwMCAgMjM0RS0xMDAwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246ICAgMzQKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCisKKy0tIEV4YW1wbGVzIGZyb20gU1FMIHByb3Bvc2FsIChLcmlzaG5hIEt1bGthcm5pKQorcHJlY2lzaW9uOiA3CitkaXZ4MTAyMSAgZGl2aWRlIDFFMCAgICAgICAgICAxRTAgLT4gMQorZGl2eDEwMjIgIGRpdmlkZSAxRTAgICAgICAgICAgMkUwIC0+IDAuNQorZGl2eDEwMjMgIGRpdmlkZSAxRTAgICAgICAgICAgM0UwIC0+IDAuMzMzMzMzMyBJbmV4YWN0IFJvdW5kZWQKK2RpdngxMDI0ICBkaXZpZGUgMTAwRS0yICAgMTAwMEUtMyAtPiAxCitkaXZ4MTAyNSAgZGl2aWRlIDI0RS0xICAgICAgICAyRTAgLT4gMS4yCitkaXZ4MTAyNiAgZGl2aWRlIDI0MDBFLTMgICAgICAyRTAgLT4gMS4yMDAKK2RpdngxMDI3ICBkaXZpZGUgNUUwICAgICAgICAgIDJFMCAtPiAyLjUKK2RpdngxMDI4ICBkaXZpZGUgNUUwICAgICAgICAyMEUtMSAtPiAyLjUKK2RpdngxMDI5ICBkaXZpZGUgNUUwICAgICAgMjAwMEUtMyAtPiAyLjUKK2RpdngxMDMwICBkaXZpZGUgNUUwICAgICAgICAgMkUtMSAtPiAyNQorZGl2eDEwMzEgIGRpdmlkZSA1RTAgICAgICAgIDIwRS0yIC0+IDI1CitkaXZ4MTAzMiAgZGl2aWRlIDQ4MEUtMiAgICAgICAzRTAgLT4gMS42MAorZGl2eDEwMzMgIGRpdmlkZSA0N0UtMSAgICAgICAgMkUwIC0+IDIuMzUKKworLS0gRUNNQVNjcmlwdCBiYWQgZXhhbXBsZXMKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KK3ByZWNpc2lvbjogNworZGl2eDEwNTAgIGRpdmlkZSA1IDkgIC0+IDAuNTU1NTU1NiBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK2RpdngxMDUxICBkaXZpZGUgNSAxMSAtPiAwLjQ1NDU0NTUgSW5leGFjdCBSb3VuZGVkCisKKy0tIHBheWxvYWQgZGVjYXBpdGF0ZQorcHJlY2lzaW9uOiA1CitkaXZ4MTA1NSAgZGl2aWRlICAgc05hTjk4NzY1NDMyMSAxIC0+ICBOYU41NDMyMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0cworZGl2eDk5OTggZGl2aWRlIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDk5OTkgZGl2aWRlICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RpdmlkZWludC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kaXZpZGVpbnQuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmExYWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kaXZpZGVpbnQuZGVjVGVzdApAQCAtMCwwICsxLDQ4NiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkaXZpZGVpbnQuZGVjVGVzdCAtLSBkZWNpbWFsIGludGVnZXIgZGl2aXNpb24gICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK2R2aXgwMDEgZGl2aWRlaW50ICAxICAgICAxICAgIC0+ICAxCitkdml4MDAyIGRpdmlkZWludCAgMiAgICAgMSAgICAtPiAgMgorZHZpeDAwMyBkaXZpZGVpbnQgIDEgICAgIDIgICAgLT4gIDAKK2R2aXgwMDQgZGl2aWRlaW50ICAyICAgICAyICAgIC0+ICAxCitkdml4MDA1IGRpdmlkZWludCAgMCAgICAgMSAgICAtPiAgMAorZHZpeDAwNiBkaXZpZGVpbnQgIDAgICAgIDIgICAgLT4gIDAKK2R2aXgwMDcgZGl2aWRlaW50ICAxICAgICAzICAgIC0+ICAwCitkdml4MDA4IGRpdmlkZWludCAgMiAgICAgMyAgICAtPiAgMAorZHZpeDAwOSBkaXZpZGVpbnQgIDMgICAgIDMgICAgLT4gIDEKKworZHZpeDAxMCBkaXZpZGVpbnQgIDIuNCAgIDEgICAgLT4gIDIKK2R2aXgwMTEgZGl2aWRlaW50ICAyLjQgICAtMSAgIC0+ICAtMgorZHZpeDAxMiBkaXZpZGVpbnQgIC0yLjQgIDEgICAgLT4gIC0yCitkdml4MDEzIGRpdmlkZWludCAgLTIuNCAgLTEgICAtPiAgMgorZHZpeDAxNCBkaXZpZGVpbnQgIDIuNDAgIDEgICAgLT4gIDIKK2R2aXgwMTUgZGl2aWRlaW50ICAyLjQwMCAxICAgIC0+ICAyCitkdml4MDE2IGRpdmlkZWludCAgMi40ICAgMiAgICAtPiAgMQorZHZpeDAxNyBkaXZpZGVpbnQgIDIuNDAwIDIgICAgLT4gIDEKK2R2aXgwMTggZGl2aWRlaW50ICAyLiAgICAyICAgIC0+ICAxCitkdml4MDE5IGRpdmlkZWludCAgMjAgICAgMjAgICAtPiAgMQorCitkdml4MDIwIGRpdmlkZWludCAgMTg3ICAgMTg3ICAtPiAgMQorZHZpeDAyMSBkaXZpZGVpbnQgIDUgICAgIDIgICAgLT4gIDIKK2R2aXgwMjIgZGl2aWRlaW50ICA1ICAgICAyLjAgICAgLT4gIDIKK2R2aXgwMjMgZGl2aWRlaW50ICA1ICAgICAyLjAwMCAgLT4gIDIKK2R2aXgwMjQgZGl2aWRlaW50ICA1ICAgICAwLjIwMCAgLT4gIDI1Citkdml4MDI1IGRpdmlkZWludCAgNSAgICAgMC4yMDAgIC0+ICAyNQorCitkdml4MDMwIGRpdmlkZWludCAgMSAgICAgMiAgICAgIC0+ICAwCitkdml4MDMxIGRpdmlkZWludCAgMSAgICAgNCAgICAgIC0+ICAwCitkdml4MDMyIGRpdmlkZWludCAgMSAgICAgOCAgICAgIC0+ICAwCitkdml4MDMzIGRpdmlkZWludCAgMSAgICAgMTYgICAgIC0+ICAwCitkdml4MDM0IGRpdmlkZWludCAgMSAgICAgMzIgICAgIC0+ICAwCitkdml4MDM1IGRpdmlkZWludCAgMSAgICAgNjQgICAgIC0+ICAwCitkdml4MDQwIGRpdmlkZWludCAgMSAgICAtMiAgICAgIC0+IC0wCitkdml4MDQxIGRpdmlkZWludCAgMSAgICAtNCAgICAgIC0+IC0wCitkdml4MDQyIGRpdmlkZWludCAgMSAgICAtOCAgICAgIC0+IC0wCitkdml4MDQzIGRpdmlkZWludCAgMSAgICAtMTYgICAgIC0+IC0wCitkdml4MDQ0IGRpdmlkZWludCAgMSAgICAtMzIgICAgIC0+IC0wCitkdml4MDQ1IGRpdmlkZWludCAgMSAgICAtNjQgICAgIC0+IC0wCitkdml4MDUwIGRpdmlkZWludCAtMSAgICAgMiAgICAgIC0+IC0wCitkdml4MDUxIGRpdmlkZWludCAtMSAgICAgNCAgICAgIC0+IC0wCitkdml4MDUyIGRpdmlkZWludCAtMSAgICAgOCAgICAgIC0+IC0wCitkdml4MDUzIGRpdmlkZWludCAtMSAgICAgMTYgICAgIC0+IC0wCitkdml4MDU0IGRpdmlkZWludCAtMSAgICAgMzIgICAgIC0+IC0wCitkdml4MDU1IGRpdmlkZWludCAtMSAgICAgNjQgICAgIC0+IC0wCitkdml4MDYwIGRpdmlkZWludCAtMSAgICAtMiAgICAgIC0+ICAwCitkdml4MDYxIGRpdmlkZWludCAtMSAgICAtNCAgICAgIC0+ICAwCitkdml4MDYyIGRpdmlkZWludCAtMSAgICAtOCAgICAgIC0+ICAwCitkdml4MDYzIGRpdmlkZWludCAtMSAgICAtMTYgICAgIC0+ICAwCitkdml4MDY0IGRpdmlkZWludCAtMSAgICAtMzIgICAgIC0+ICAwCitkdml4MDY1IGRpdmlkZWludCAtMSAgICAtNjQgICAgIC0+ICAwCisKKy0tIHNpbWlsYXIgd2l0aCBwb3dlcnMgb2YgdGVuCitkdml4MTYwIGRpdmlkZWludCAgMSAgICAgMSAgICAgICAgIC0+ICAxCitkdml4MTYxIGRpdmlkZWludCAgMSAgICAgMTAgICAgICAgIC0+ICAwCitkdml4MTYyIGRpdmlkZWludCAgMSAgICAgMTAwICAgICAgIC0+ICAwCitkdml4MTYzIGRpdmlkZWludCAgMSAgICAgMTAwMCAgICAgIC0+ICAwCitkdml4MTY0IGRpdmlkZWludCAgMSAgICAgMTAwMDAgICAgIC0+ICAwCitkdml4MTY1IGRpdmlkZWludCAgMSAgICAgMTAwMDAwICAgIC0+ICAwCitkdml4MTY2IGRpdmlkZWludCAgMSAgICAgMTAwMDAwMCAgIC0+ICAwCitkdml4MTY3IGRpdmlkZWludCAgMSAgICAgMTAwMDAwMDAgIC0+ICAwCitkdml4MTY4IGRpdmlkZWludCAgMSAgICAgMTAwMDAwMDAwIC0+ICAwCitkdml4MTcwIGRpdmlkZWludCAgMSAgICAtMSAgICAgICAgIC0+IC0xCitkdml4MTcxIGRpdmlkZWludCAgMSAgICAtMTAgICAgICAgIC0+IC0wCitkdml4MTcyIGRpdmlkZWludCAgMSAgICAtMTAwICAgICAgIC0+IC0wCitkdml4MTczIGRpdmlkZWludCAgMSAgICAtMTAwMCAgICAgIC0+IC0wCitkdml4MTc0IGRpdmlkZWludCAgMSAgICAtMTAwMDAgICAgIC0+IC0wCitkdml4MTc1IGRpdmlkZWludCAgMSAgICAtMTAwMDAwICAgIC0+IC0wCitkdml4MTc2IGRpdmlkZWludCAgMSAgICAtMTAwMDAwMCAgIC0+IC0wCitkdml4MTc3IGRpdmlkZWludCAgMSAgICAtMTAwMDAwMDAgIC0+IC0wCitkdml4MTc4IGRpdmlkZWludCAgMSAgICAtMTAwMDAwMDAwIC0+IC0wCitkdml4MTgwIGRpdmlkZWludCAtMSAgICAgMSAgICAgICAgIC0+IC0xCitkdml4MTgxIGRpdmlkZWludCAtMSAgICAgMTAgICAgICAgIC0+IC0wCitkdml4MTgyIGRpdmlkZWludCAtMSAgICAgMTAwICAgICAgIC0+IC0wCitkdml4MTgzIGRpdmlkZWludCAtMSAgICAgMTAwMCAgICAgIC0+IC0wCitkdml4MTg0IGRpdmlkZWludCAtMSAgICAgMTAwMDAgICAgIC0+IC0wCitkdml4MTg1IGRpdmlkZWludCAtMSAgICAgMTAwMDAwICAgIC0+IC0wCitkdml4MTg2IGRpdmlkZWludCAtMSAgICAgMTAwMDAwMCAgIC0+IC0wCitkdml4MTg3IGRpdmlkZWludCAtMSAgICAgMTAwMDAwMDAgIC0+IC0wCitkdml4MTg4IGRpdmlkZWludCAtMSAgICAgMTAwMDAwMDAwIC0+IC0wCitkdml4MTkwIGRpdmlkZWludCAtMSAgICAtMSAgICAgICAgIC0+ICAxCitkdml4MTkxIGRpdmlkZWludCAtMSAgICAtMTAgICAgICAgIC0+ICAwCitkdml4MTkyIGRpdmlkZWludCAtMSAgICAtMTAwICAgICAgIC0+ICAwCitkdml4MTkzIGRpdmlkZWludCAtMSAgICAtMTAwMCAgICAgIC0+ICAwCitkdml4MTk0IGRpdmlkZWludCAtMSAgICAtMTAwMDAgICAgIC0+ICAwCitkdml4MTk1IGRpdmlkZWludCAtMSAgICAtMTAwMDAwICAgIC0+ICAwCitkdml4MTk2IGRpdmlkZWludCAtMSAgICAtMTAwMDAwMCAgIC0+ICAwCitkdml4MTk3IGRpdmlkZWludCAtMSAgICAtMTAwMDAwMDAgIC0+ICAwCitkdml4MTk4IGRpdmlkZWludCAtMSAgICAtMTAwMDAwMDAwIC0+ICAwCisKKy0tIHNvbWUgbG9uZyBvcGVyYW5kIGNhc2VzIGhlcmUKK2R2aXgwNzAgZGl2aWRlaW50ICA5OTk5OTk5OTkgICAgIDEgIC0+ICA5OTk5OTk5OTkKK2R2aXgwNzEgZGl2aWRlaW50ICA5OTk5OTk5OTkuNCAgIDEgIC0+ICA5OTk5OTk5OTkKK2R2aXgwNzIgZGl2aWRlaW50ICA5OTk5OTk5OTkuNSAgIDEgIC0+ICA5OTk5OTk5OTkKK2R2aXgwNzMgZGl2aWRlaW50ICA5OTk5OTk5OTkuOSAgIDEgIC0+ICA5OTk5OTk5OTkKK2R2aXgwNzQgZGl2aWRlaW50ICA5OTk5OTk5OTkuOTk5IDEgIC0+ICA5OTk5OTk5OTkKK3ByZWNpc2lvbjogNgorZHZpeDA4MCBkaXZpZGVpbnQgIDk5OTk5OTk5OSAgICAgMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4MDgxIGRpdmlkZWludCAgOTk5OTk5OTkgICAgICAxICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXgwODIgZGl2aWRlaW50ICA5OTk5OTk5ICAgICAgIDEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDA4MyBkaXZpZGVpbnQgIDk5OTk5OSAgICAgICAgMSAgLT4gIDk5OTk5OQorZHZpeDA4NCBkaXZpZGVpbnQgIDk5OTk5ICAgICAgICAgMSAgLT4gIDk5OTk5Citkdml4MDg1IGRpdmlkZWludCAgOTk5OSAgICAgICAgICAxICAtPiAgOTk5OQorZHZpeDA4NiBkaXZpZGVpbnQgIDk5OSAgICAgICAgICAgMSAgLT4gIDk5OQorZHZpeDA4NyBkaXZpZGVpbnQgIDk5ICAgICAgICAgICAgMSAgLT4gIDk5Citkdml4MDg4IGRpdmlkZWludCAgOSAgICAgICAgICAgICAxICAtPiAgOQorCitwcmVjaXNpb246IDkKK2R2aXgwOTAgZGl2aWRlaW50ICAwLiAgICAgICAgICAgIDEgICAgLT4gIDAKK2R2aXgwOTEgZGl2aWRlaW50ICAuMCAgICAgICAgICAgIDEgICAgLT4gIDAKK2R2aXgwOTIgZGl2aWRlaW50ICAwLjAwICAgICAgICAgIDEgICAgLT4gIDAKK2R2aXgwOTMgZGl2aWRlaW50ICAwLjAwRSs5ICAgICAgIDEgICAgLT4gIDAKK2R2aXgwOTQgZGl2aWRlaW50ICAwLjAwMDBFLTUwICAgIDEgICAgLT4gIDAKKworZHZpeDEwMCBkaXZpZGVpbnQgIDEgIDEgICAtPiAxCitkdml4MTAxIGRpdmlkZWludCAgMSAgMiAgIC0+IDAKK2R2aXgxMDIgZGl2aWRlaW50ICAxICAzICAgLT4gMAorZHZpeDEwMyBkaXZpZGVpbnQgIDEgIDQgICAtPiAwCitkdml4MTA0IGRpdmlkZWludCAgMSAgNSAgIC0+IDAKK2R2aXgxMDUgZGl2aWRlaW50ICAxICA2ICAgLT4gMAorZHZpeDEwNiBkaXZpZGVpbnQgIDEgIDcgICAtPiAwCitkdml4MTA3IGRpdmlkZWludCAgMSAgOCAgIC0+IDAKK2R2aXgxMDggZGl2aWRlaW50ICAxICA5ICAgLT4gMAorZHZpeDEwOSBkaXZpZGVpbnQgIDEgIDEwICAtPiAwCitkdml4MTEwIGRpdmlkZWludCAgMSAgMSAgIC0+IDEKK2R2aXgxMTEgZGl2aWRlaW50ICAyICAxICAgLT4gMgorZHZpeDExMiBkaXZpZGVpbnQgIDMgIDEgICAtPiAzCitkdml4MTEzIGRpdmlkZWludCAgNCAgMSAgIC0+IDQKK2R2aXgxMTQgZGl2aWRlaW50ICA1ICAxICAgLT4gNQorZHZpeDExNSBkaXZpZGVpbnQgIDYgIDEgICAtPiA2Citkdml4MTE2IGRpdmlkZWludCAgNyAgMSAgIC0+IDcKK2R2aXgxMTcgZGl2aWRlaW50ICA4ICAxICAgLT4gOAorZHZpeDExOCBkaXZpZGVpbnQgIDkgIDEgICAtPiA5Citkdml4MTE5IGRpdmlkZWludCAgMTAgMSAgIC0+IDEwCisKKy0tIGZyb20gRGlhZ0JpZ0RlY2ltYWwKK2R2aXgxMzEgZGl2aWRlaW50ICAxMDEuMyAgIDEgICAgIC0+ICAxMDEKK2R2aXgxMzIgZGl2aWRlaW50ICAxMDEuMCAgIDEgICAgIC0+ICAxMDEKK2R2aXgxMzMgZGl2aWRlaW50ICAxMDEuMyAgIDMgICAgIC0+ICAzMworZHZpeDEzNCBkaXZpZGVpbnQgIDEwMS4wICAgMyAgICAgLT4gIDMzCitkdml4MTM1IGRpdmlkZWludCAgMi40ICAgICAxICAgICAtPiAgMgorZHZpeDEzNiBkaXZpZGVpbnQgIDIuNDAwICAgMSAgICAgLT4gIDIKK2R2aXgxMzcgZGl2aWRlaW50ICAxOCAgICAgIDE4ICAgIC0+ICAxCitkdml4MTM4IGRpdmlkZWludCAgMTEyMCAgICAxMDAwICAtPiAgMQorZHZpeDEzOSBkaXZpZGVpbnQgIDIuNCAgICAgMiAgICAgLT4gIDEKK2R2aXgxNDAgZGl2aWRlaW50ICAyLjQwMCAgIDIgICAgIC0+ICAxCitkdml4MTQxIGRpdmlkZWludCAgMC41ICAgICAyLjAwMCAtPiAgMAorZHZpeDE0MiBkaXZpZGVpbnQgIDguMDA1ICAgNyAgICAgLT4gIDEKK2R2aXgxNDMgZGl2aWRlaW50ICA1ICAgICAgIDIgICAgIC0+ICAyCitkdml4MTQ0IGRpdmlkZWludCAgMCAgICAgICAyICAgICAtPiAgMAorZHZpeDE0NSBkaXZpZGVpbnQgIDAuMDAgICAgMiAgICAgLT4gIDAKKworLS0gT3RoZXJzCitkdml4MTUwIGRpdmlkZWludCAgMTIzNDUgIDQuOTk5ICAtPiAgMjQ2OQorZHZpeDE1MSBkaXZpZGVpbnQgIDEyMzQ1ICA0Ljk5ICAgLT4gIDI0NzMKK2R2aXgxNTIgZGl2aWRlaW50ICAxMjM0NSAgNC45ICAgIC0+ICAyNTE5Citkdml4MTUzIGRpdmlkZWludCAgMTIzNDUgIDUgICAgICAtPiAgMjQ2OQorZHZpeDE1NCBkaXZpZGVpbnQgIDEyMzQ1ICA1LjEgICAgLT4gIDI0MjAKK2R2aXgxNTUgZGl2aWRlaW50ICAxMjM0NSAgNS4wMSAgIC0+ICAyNDY0Citkdml4MTU2IGRpdmlkZWludCAgMTIzNDUgIDUuMDAxICAtPiAgMjQ2OAorZHZpeDE1NyBkaXZpZGVpbnQgICAgMTAxICA3LjYgICAgLT4gIDEzCisKKy0tIFZhcmlvdXMgZmxhdm91cnMgb2YgZGl2aWRlaW50IGJ5IDAKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5Citkdml4MjAxIGRpdmlkZWludCAgMCAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkdml4MjAyIGRpdmlkZWludCAgMC4wRTUgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkdml4MjAzIGRpdmlkZWludCAgMC4wMDAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkdml4MjA0IGRpdmlkZWludCAgMC4wMDAxIDAgICAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjA1IGRpdmlkZWludCAgMC4wMSAgIDAgICAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjA2IGRpdmlkZWludCAgMC4xICAgIDAgICAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjA3IGRpdmlkZWludCAgMSAgICAgIDAgICAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjA4IGRpdmlkZWludCAgMSAgICAgIDAuMCAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjA5IGRpdmlkZWludCAxMCAgICAgIDAuMCAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjEwIGRpdmlkZWludCAxRSsxMDAgIDAuMCAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjExIGRpdmlkZWludCAxRSsxMDAwIDAgICAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjE0IGRpdmlkZWludCAgLTAuMDAwMSAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXgyMTUgZGl2aWRlaW50ICAtMC4wMSAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDIxNiBkaXZpZGVpbnQgIC0wLjEgICAgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjE3IGRpdmlkZWludCAgLTEgICAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXgyMTggZGl2aWRlaW50ICAtMSAgICAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDIxOSBkaXZpZGVpbnQgLTEwICAgICAgMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjIwIGRpdmlkZWludCAtMUUrMTAwICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXgyMjEgZGl2aWRlaW50IC0xRSsxMDAwIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCistLSB0ZXN0IHNvbWUgY2FzZXMgdGhhdCBhcmUgY2xvc2UgdG8gZXhwb25lbnQgb3ZlcmZsb3cKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5Citkdml4MjcwIGRpdmlkZWludCAxIDFlOTk5OTk5OTk5ICAgIC0+IDAKK2R2aXgyNzEgZGl2aWRlaW50IDEgMC45ZTk5OTk5OTk5OSAgLT4gMAorZHZpeDI3MiBkaXZpZGVpbnQgMSAwLjk5ZTk5OTk5OTk5OSAtPiAwCitkdml4MjczIGRpdmlkZWludCAxIDAuOTk5OTk5OTk5ZTk5OTk5OTk5OSAtPiAwCitkdml4Mjc0IGRpdmlkZWludCA5ZTk5OTk5OTk5OSAgICAxICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4Mjc1IGRpdmlkZWludCA5LjllOTk5OTk5OTk5ICAxICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4Mjc2IGRpdmlkZWludCA5Ljk5ZTk5OTk5OTk5OSAxICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4Mjc3IGRpdmlkZWludCA5Ljk5OTk5OTk5ZTk5OTk5OTk5OSAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKK2R2aXgyODAgZGl2aWRlaW50IDAuMSA5ZS05OTk5OTk5OTkgICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXgyODEgZGl2aWRlaW50IDAuMSA5OWUtOTk5OTk5OTk5ICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXgyODIgZGl2aWRlaW50IDAuMSA5OTllLTk5OTk5OTk5OSAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworZHZpeDI4MyBkaXZpZGVpbnQgMC4xIDllLTk5OTk5OTk5OCAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDI4NCBkaXZpZGVpbnQgMC4xIDk5ZS05OTk5OTk5OTggICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDI4NSBkaXZpZGVpbnQgMC4xIDk5OWUtOTk5OTk5OTk4ICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDI4NiBkaXZpZGVpbnQgMC4xIDk5OWUtOTk5OTk5OTk3ICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDI4NyBkaXZpZGVpbnQgMC4xIDk5OTllLTk5OTk5OTk5NyAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDI4OCBkaXZpZGVpbnQgMC4xIDk5OTk5ZS05OTk5OTk5OTcgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCistLSBHRCBlZGdlIGNhc2VzOiBsaHMgc21hbGxlciB0aGFuIHJocyBidXQgbW9yZSBkaWdpdHMKK2R2aXgzMDEgIGRpdmlkZWludCAgMC45ICAgICAgMiAgICAgIC0+ICAwCitkdml4MzAyICBkaXZpZGVpbnQgIDAuOSAgICAgIDIuMCAgICAtPiAgMAorZHZpeDMwMyAgZGl2aWRlaW50ICAwLjkgICAgICAyLjEgICAgLT4gIDAKK2R2aXgzMDQgIGRpdmlkZWludCAgMC45ICAgICAgMi4wMCAgIC0+ICAwCitkdml4MzA1ICBkaXZpZGVpbnQgIDAuOSAgICAgIDIuMDEgICAtPiAgMAorZHZpeDMwNiAgZGl2aWRlaW50ICAwLjEyICAgICAxICAgICAgLT4gIDAKK2R2aXgzMDcgIGRpdmlkZWludCAgMC4xMiAgICAgMS4wICAgIC0+ICAwCitkdml4MzA4ICBkaXZpZGVpbnQgIDAuMTIgICAgIDEuMDAgICAtPiAgMAorZHZpeDMwOSAgZGl2aWRlaW50ICAwLjEyICAgICAxLjAgICAgLT4gIDAKK2R2aXgzMTAgIGRpdmlkZWludCAgMC4xMiAgICAgMS4wMCAgIC0+ICAwCitkdml4MzExICBkaXZpZGVpbnQgIDAuMTIgICAgIDIgICAgICAtPiAgMAorZHZpeDMxMiAgZGl2aWRlaW50ICAwLjEyICAgICAyLjAgICAgLT4gIDAKK2R2aXgzMTMgIGRpdmlkZWludCAgMC4xMiAgICAgMi4xICAgIC0+ICAwCitkdml4MzE0ICBkaXZpZGVpbnQgIDAuMTIgICAgIDIuMDAgICAtPiAgMAorZHZpeDMxNSAgZGl2aWRlaW50ICAwLjEyICAgICAyLjAxICAgLT4gIDAKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cyBbZnJvbSBkaXZpZGVdCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorZHZpeDMzMCBkaXZpZGVpbnQgKzEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5ICAgIC0+IDAKK2R2aXgzMzEgZGl2aWRlaW50IDlFKzk5OTk5OTk5OSArMC4yMzQ1Njc4OTAxMjM0NUUtMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDMzMiBkaXZpZGVpbnQgKzAuMTAwIDlFKzk5OTk5OTk5OSAgICAtPiAwCitkdml4MzMzIGRpdmlkZWludCA5RS05OTk5OTk5OTkgKzkuMTAwICAgIC0+IDAKK2R2aXgzMzUgZGl2aWRlaW50IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAgICAtPiAtMAorZHZpeDMzNiBkaXZpZGVpbnQgOUUrOTk5OTk5OTk5IC0wLjgzNDU2Nzg5MDEyMzQ1RS0wIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4MzM3IGRpdmlkZWludCAtMC4xMDAgOUUrOTk5OTk5OTk5ICAgIC0+IC0wCitkdml4MzM4IGRpdmlkZWludCA5RS05OTk5OTk5OTkgLTkuMTAwICAgIC0+IC0wCisKKy0tIGxvbmcgb3BlcmFuZCBjaGVja3MKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK2R2aXg0MDEgZGl2aWRlaW50IDEyMzQ1Njc4MDAwIDEwMCAtPiAxMjM0NTY3ODAKK2R2aXg0MDIgZGl2aWRlaW50IDEgMTIzNDU2NzgwMDAgICAtPiAwCitkdml4NDAzIGRpdmlkZWludCAxMjM0NTY3ODAwICAxMCAgLT4gMTIzNDU2NzgwCitkdml4NDA0IGRpdmlkZWludCAxIDEyMzQ1Njc4MDAgICAgLT4gMAorZHZpeDQwNSBkaXZpZGVpbnQgMTIzNDU2Nzg5MCAgMTAgIC0+IDEyMzQ1Njc4OQorZHZpeDQwNiBkaXZpZGVpbnQgMSAxMjM0NTY3ODkwICAgIC0+IDAKK2R2aXg0MDcgZGl2aWRlaW50IDEyMzQ1Njc4OTEgIDEwICAtPiAxMjM0NTY3ODkKK2R2aXg0MDggZGl2aWRlaW50IDEgMTIzNDU2Nzg5MSAgICAtPiAwCitkdml4NDA5IGRpdmlkZWludCAxMjM0NTY3ODkwMSAxMDAgLT4gMTIzNDU2Nzg5Citkdml4NDEwIGRpdmlkZWludCAxIDEyMzQ1Njc4OTAxICAgLT4gMAorZHZpeDQxMSBkaXZpZGVpbnQgMTIzNDU2Nzg5NiAgMTAgIC0+IDEyMzQ1Njc4OQorZHZpeDQxMiBkaXZpZGVpbnQgMSAxMjM0NTY3ODk2ICAgIC0+IDAKK2R2aXg0MTMgZGl2aWRlaW50IDEyMzQ1Njc4OTQ4IDEwMCAtPiAxMjM0NTY3ODkKK2R2aXg0MTQgZGl2aWRlaW50IDEyMzQ1Njc4OTQ5IDEwMCAtPiAxMjM0NTY3ODkKK2R2aXg0MTUgZGl2aWRlaW50IDEyMzQ1Njc4OTUwIDEwMCAtPiAxMjM0NTY3ODkKK2R2aXg0MTYgZGl2aWRlaW50IDEyMzQ1Njc4OTUxIDEwMCAtPiAxMjM0NTY3ODkKK2R2aXg0MTcgZGl2aWRlaW50IDEyMzQ1Njc4OTk5IDEwMCAtPiAxMjM0NTY3ODkKKworcHJlY2lzaW9uOiAxNQorZHZpeDQ0MSBkaXZpZGVpbnQgMTIzNDU2NzgwMDAgMSAtPiAxMjM0NTY3ODAwMAorZHZpeDQ0MiBkaXZpZGVpbnQgMSAxMjM0NTY3ODAwMCAtPiAwCitkdml4NDQzIGRpdmlkZWludCAxMjM0NTY3ODAwICAxIC0+IDEyMzQ1Njc4MDAKK2R2aXg0NDQgZGl2aWRlaW50IDEgMTIzNDU2NzgwMCAgLT4gMAorZHZpeDQ0NSBkaXZpZGVpbnQgMTIzNDU2Nzg5MCAgMSAtPiAxMjM0NTY3ODkwCitkdml4NDQ2IGRpdmlkZWludCAxIDEyMzQ1Njc4OTAgIC0+IDAKK2R2aXg0NDcgZGl2aWRlaW50IDEyMzQ1Njc4OTEgIDEgLT4gMTIzNDU2Nzg5MQorZHZpeDQ0OCBkaXZpZGVpbnQgMSAxMjM0NTY3ODkxICAtPiAwCitkdml4NDQ5IGRpdmlkZWludCAxMjM0NTY3ODkwMSAxIC0+IDEyMzQ1Njc4OTAxCitkdml4NDUwIGRpdmlkZWludCAxIDEyMzQ1Njc4OTAxIC0+IDAKK2R2aXg0NTEgZGl2aWRlaW50IDEyMzQ1Njc4OTYgIDEgLT4gMTIzNDU2Nzg5NgorZHZpeDQ1MiBkaXZpZGVpbnQgMSAxMjM0NTY3ODk2ICAtPiAwCisKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKKworLS0gbW9yZSB6ZXJvcywgZXRjLgorZHZpeDUzMSBkaXZpZGVpbnQgNS4wMCAxRS0zICAgIC0+IDUwMDAKK2R2aXg1MzIgZGl2aWRlaW50IDAwLjAwIDAuMDAwICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkdml4NTMzIGRpdmlkZWludCAwMC4wMCAwRS0zICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHZpeDUzNCBkaXZpZGVpbnQgIDAgICAgLTAgICAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2R2aXg1MzUgZGl2aWRlaW50IC0wICAgICAwICAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkdml4NTM2IGRpdmlkZWludCAtMCAgICAtMCAgICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorCitkdml4NTQxIGRpdmlkZWludCAgMCAgICAtMSAgICAgLT4gLTAKK2R2aXg1NDIgZGl2aWRlaW50IC0wICAgIC0xICAgICAtPiAgMAorZHZpeDU0MyBkaXZpZGVpbnQgIDAgICAgIDEgICAgIC0+ICAwCitkdml4NTQ0IGRpdmlkZWludCAtMCAgICAgMSAgICAgLT4gLTAKK2R2aXg1NDUgZGl2aWRlaW50IC0xICAgICAwICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDU0NiBkaXZpZGVpbnQgLTEgICAgLTAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4NTQ3IGRpdmlkZWludCAgMSAgICAgMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXg1NDggZGl2aWRlaW50ICAxICAgIC0wICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkdml4NTUxIGRpdmlkZWludCAgMC4wICAtMSAgICAgLT4gLTAKK2R2aXg1NTIgZGl2aWRlaW50IC0wLjAgIC0xICAgICAtPiAgMAorZHZpeDU1MyBkaXZpZGVpbnQgIDAuMCAgIDEgICAgIC0+ICAwCitkdml4NTU0IGRpdmlkZWludCAtMC4wICAgMSAgICAgLT4gLTAKK2R2aXg1NTUgZGl2aWRlaW50IC0xLjAgICAwICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDU1NiBkaXZpZGVpbnQgLTEuMCAgLTAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4NTU3IGRpdmlkZWludCAgMS4wICAgMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXg1NTggZGl2aWRlaW50ICAxLjAgIC0wICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkdml4NTYxIGRpdmlkZWludCAgMCAgICAtMS4wICAgLT4gLTAKK2R2aXg1NjIgZGl2aWRlaW50IC0wICAgIC0xLjAgICAtPiAgMAorZHZpeDU2MyBkaXZpZGVpbnQgIDAgICAgIDEuMCAgIC0+ICAwCitkdml4NTY0IGRpdmlkZWludCAtMCAgICAgMS4wICAgLT4gLTAKK2R2aXg1NjUgZGl2aWRlaW50IC0xICAgICAwLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDU2NiBkaXZpZGVpbnQgLTEgICAgLTAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4NTY3IGRpdmlkZWludCAgMSAgICAgMC4wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXg1NjggZGl2aWRlaW50ICAxICAgIC0wLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkdml4NTcxIGRpdmlkZWludCAgMC4wICAtMS4wICAgLT4gLTAKK2R2aXg1NzIgZGl2aWRlaW50IC0wLjAgIC0xLjAgICAtPiAgMAorZHZpeDU3MyBkaXZpZGVpbnQgIDAuMCAgIDEuMCAgIC0+ICAwCitkdml4NTc0IGRpdmlkZWludCAtMC4wICAgMS4wICAgLT4gLTAKK2R2aXg1NzUgZGl2aWRlaW50IC0xLjAgICAwLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDU3NiBkaXZpZGVpbnQgLTEuMCAgLTAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4NTc3IGRpdmlkZWludCAgMS4wICAgMC4wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXg1NzggZGl2aWRlaW50ICAxLjAgIC0wLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCistLSBTcGVjaWFscworZHZpeDU4MCBkaXZpZGVpbnQgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2R2aXg1ODEgZGl2aWRlaW50ICBJbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK2R2aXg1ODIgZGl2aWRlaW50ICBJbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2R2aXg1ODMgZGl2aWRlaW50ICBJbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2R2aXg1ODQgZGl2aWRlaW50ICBJbmYgICAwICAgICAtPiAgSW5maW5pdHkKK2R2aXg1ODUgZGl2aWRlaW50ICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2R2aXg1ODYgZGl2aWRlaW50ICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK2R2aXg1ODcgZGl2aWRlaW50ICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkdml4NTg4IGRpdmlkZWludCAtMTAwMCAgSW5mICAgLT4gLTAKK2R2aXg1ODkgZGl2aWRlaW50IC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkdml4NTkwIGRpdmlkZWludCAtMSAgICAgSW5mICAgLT4gLTAKK2R2aXg1OTEgZGl2aWRlaW50IC0wICAgICBJbmYgICAtPiAtMAorZHZpeDU5MiBkaXZpZGVpbnQgIDAgICAgIEluZiAgIC0+ICAwCitkdml4NTkzIGRpdmlkZWludCAgMSAgICAgSW5mICAgLT4gIDAKK2R2aXg1OTQgZGl2aWRlaW50ICAxMDAwICBJbmYgICAtPiAgMAorZHZpeDU5NSBkaXZpZGVpbnQgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHZpeDYwMCBkaXZpZGVpbnQgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2MDEgZGl2aWRlaW50IC1JbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK2R2aXg2MDIgZGl2aWRlaW50IC1JbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2R2aXg2MDMgZGl2aWRlaW50IC1JbmYgIC0wICAgICAtPiAgSW5maW5pdHkKK2R2aXg2MDQgZGl2aWRlaW50IC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK2R2aXg2MDUgZGl2aWRlaW50IC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2R2aXg2MDYgZGl2aWRlaW50IC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2R2aXg2MDcgZGl2aWRlaW50IC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjA4IGRpdmlkZWludCAtMTAwMCAgSW5mICAgLT4gLTAKK2R2aXg2MDkgZGl2aWRlaW50IC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjEwIGRpdmlkZWludCAtMSAgICAtSW5mICAgLT4gIDAKK2R2aXg2MTEgZGl2aWRlaW50IC0wICAgIC1JbmYgICAtPiAgMAorZHZpeDYxMiBkaXZpZGVpbnQgIDAgICAgLUluZiAgIC0+IC0wCitkdml4NjEzIGRpdmlkZWludCAgMSAgICAtSW5mICAgLT4gLTAKK2R2aXg2MTQgZGl2aWRlaW50ICAxMDAwIC1JbmYgICAtPiAtMAorZHZpeDYxNSBkaXZpZGVpbnQgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHZpeDYyMSBkaXZpZGVpbnQgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2R2aXg2MjIgZGl2aWRlaW50ICBOYU4gLTEwMDAgICAtPiAgTmFOCitkdml4NjIzIGRpdmlkZWludCAgTmFOIC0xICAgICAgLT4gIE5hTgorZHZpeDYyNCBkaXZpZGVpbnQgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2R2aXg2MjUgZGl2aWRlaW50ICBOYU4gIDAgICAgICAtPiAgTmFOCitkdml4NjI2IGRpdmlkZWludCAgTmFOICAxICAgICAgLT4gIE5hTgorZHZpeDYyNyBkaXZpZGVpbnQgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2R2aXg2MjggZGl2aWRlaW50ICBOYU4gIEluZiAgICAtPiAgTmFOCitkdml4NjI5IGRpdmlkZWludCAgTmFOICBOYU4gICAgLT4gIE5hTgorZHZpeDYzMCBkaXZpZGVpbnQgLUluZiAgTmFOICAgIC0+ICBOYU4KK2R2aXg2MzEgZGl2aWRlaW50IC0xMDAwIE5hTiAgICAtPiAgTmFOCitkdml4NjMyIGRpdmlkZWludCAtMSAgICBOYU4gICAgLT4gIE5hTgorZHZpeDYzMyBkaXZpZGVpbnQgLTAgICAgTmFOICAgIC0+ICBOYU4KK2R2aXg2MzQgZGl2aWRlaW50ICAwICAgIE5hTiAgICAtPiAgTmFOCitkdml4NjM1IGRpdmlkZWludCAgMSAgICBOYU4gICAgLT4gIE5hTgorZHZpeDYzNiBkaXZpZGVpbnQgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2R2aXg2MzcgZGl2aWRlaW50ICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2R2aXg2NDEgZGl2aWRlaW50ICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY0MiBkaXZpZGVpbnQgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjQzIGRpdmlkZWludCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NDQgZGl2aWRlaW50ICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY0NSBkaXZpZGVpbnQgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjQ2IGRpdmlkZWludCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NDcgZGl2aWRlaW50ICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY0OCBkaXZpZGVpbnQgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjQ5IGRpdmlkZWludCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NTAgZGl2aWRlaW50ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY1MSBkaXZpZGVpbnQgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjUyIGRpdmlkZWludCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NTMgZGl2aWRlaW50IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY1NCBkaXZpZGVpbnQgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjU1IGRpdmlkZWludCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NTYgZGl2aWRlaW50ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY1NyBkaXZpZGVpbnQgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjU4IGRpdmlkZWludCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NTkgZGl2aWRlaW50ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkdml4NjYxIGRpdmlkZWludCAgTmFOOSAtSW5mICAgLT4gIE5hTjkKK2R2aXg2NjIgZGl2aWRlaW50ICBOYU44ICAxMDAwICAtPiAgTmFOOAorZHZpeDY2MyBkaXZpZGVpbnQgIE5hTjcgIEluZiAgIC0+ICBOYU43Citkdml4NjY0IGRpdmlkZWludCAtTmFONiAgTmFONSAgLT4gLU5hTjYKK2R2aXg2NjUgZGl2aWRlaW50IC1JbmYgICBOYU40ICAtPiAgTmFONAorZHZpeDY2NiBkaXZpZGVpbnQgLTEwMDAgIE5hTjMgIC0+ICBOYU4zCitkdml4NjY3IGRpdmlkZWludCAgSW5mICAtTmFOMiAgLT4gLU5hTjIKKworZHZpeDY3MSBkaXZpZGVpbnQgLXNOYU45OSAtSW5mICAgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY3MiBkaXZpZGVpbnQgIHNOYU45OCAtMSAgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY3MyBkaXZpZGVpbnQgIHNOYU45NyAgTmFOICAgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY3NCBkaXZpZGVpbnQgIHNOYU45NiBzTmFOOTQgIC0+ICBOYU45NiBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY3NSBkaXZpZGVpbnQgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY3NiBkaXZpZGVpbnQgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY3NyBkaXZpZGVpbnQgIDAgICAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY3OCBkaXZpZGVpbnQgIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY3OSBkaXZpZGVpbnQgIE5hTiAgICBzTmFOODkgIC0+ICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBzb21lIGxvbmcgb3BlcmFuZCBjYXNlcyBhZ2FpbgorcHJlY2lzaW9uOiA4Citkdml4NzEwIGRpdmlkZWludCAgMTAwMDAwMDAxICAgICAxICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXg3MTEgZGl2aWRlaW50ICAxMDAwMDAwMDAuNCAgIDEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDcxMiBkaXZpZGVpbnQgIDEwMDAwMDAwMC41ICAgMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzEzIGRpdmlkZWludCAgMTAwMDAwMDAwLjkgICAxICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXg3MTQgZGl2aWRlaW50ICAxMDAwMDAwMDAuOTk5IDEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcHJlY2lzaW9uOiA2Citkdml4NzIwIGRpdmlkZWludCAgMTAwMDAwMDAwICAgICAxICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXg3MjEgZGl2aWRlaW50ICAxMDAwMDAwMCAgICAgIDEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDcyMiBkaXZpZGVpbnQgIDEwMDAwMDAgICAgICAgMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzIzIGRpdmlkZWludCAgMTAwMDAwICAgICAgICAxICAtPiAgMTAwMDAwCitkdml4NzI0IGRpdmlkZWludCAgMTAwMDAgICAgICAgICAxICAtPiAgMTAwMDAKK2R2aXg3MjUgZGl2aWRlaW50ICAxMDAwICAgICAgICAgIDEgIC0+ICAxMDAwCitkdml4NzI2IGRpdmlkZWludCAgMTAwICAgICAgICAgICAxICAtPiAgMTAwCitkdml4NzI3IGRpdmlkZWludCAgMTAgICAgICAgICAgICAxICAtPiAgMTAKK2R2aXg3MjggZGl2aWRlaW50ICAxICAgICAgICAgICAgIDEgIC0+ICAxCitkdml4NzI5IGRpdmlkZWludCAgMSAgICAgICAgICAgIDEwICAtPiAgMAorCitwcmVjaXNpb246IDkKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5Citkdml4NzMyIGRpdmlkZWludCAxIDAuOTllOTk5OTk5OTk5IC0+IDAKK2R2aXg3MzMgZGl2aWRlaW50IDEgMC45OTk5OTk5OTllOTk5OTk5OTk5IC0+IDAKK2R2aXg3MzQgZGl2aWRlaW50IDllOTk5OTk5OTk5ICAgIDEgICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXg3MzUgZGl2aWRlaW50IDkuOWU5OTk5OTk5OTkgIDEgICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXg3MzYgZGl2aWRlaW50IDkuOTllOTk5OTk5OTk5IDEgICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXg3MzcgZGl2aWRlaW50IDkuOTk5OTk5OTllOTk5OTk5OTk5IDEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworZHZpeDc0MCBkaXZpZGVpbnQgMC4xIDllLTk5OTk5OTk5OSAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDc0MSBkaXZpZGVpbnQgMC4xIDk5ZS05OTk5OTk5OTkgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDc0MiBkaXZpZGVpbnQgMC4xIDk5OWUtOTk5OTk5OTk5ICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCitkdml4NzQzIGRpdmlkZWludCAwLjEgOWUtOTk5OTk5OTk4ICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzQ0IGRpdmlkZWludCAwLjEgOTllLTk5OTk5OTk5OCAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzQ1IGRpdmlkZWludCAwLjEgOTk5ZS05OTk5OTk5OTggICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzQ2IGRpdmlkZWludCAwLjEgOTk5ZS05OTk5OTk5OTcgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzQ3IGRpdmlkZWludCAwLjEgOTk5OWUtOTk5OTk5OTk3ICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzQ4IGRpdmlkZWludCAwLjEgOTk5OTllLTk5OTk5OTk5NyAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKKworLS0gTnVsbCB0ZXN0cworZHZpeDkwMCBkaXZpZGVpbnQgIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDkwMSBkaXZpZGVpbnQgICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUFicy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUFicy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYWEwNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQWJzLmRlY1Rlc3QKQEAgLTAsMCArMSwxMjYgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFBYnMuZGVjVGVzdCAtLSBkZWNRdWFkIGFic29sdXRlIHZhbHVlLCBoZWVkaW5nIHNOYU4gICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkcWFiczAwMSBhYnMgJzEnICAgICAgLT4gJzEnCitkcWFiczAwMiBhYnMgJy0xJyAgICAgLT4gJzEnCitkcWFiczAwMyBhYnMgJzEuMDAnICAgLT4gJzEuMDAnCitkcWFiczAwNCBhYnMgJy0xLjAwJyAgLT4gJzEuMDAnCitkcWFiczAwNSBhYnMgJzAnICAgICAgLT4gJzAnCitkcWFiczAwNiBhYnMgJzAuMDAnICAgLT4gJzAuMDAnCitkcWFiczAwNyBhYnMgJzAwLjAnICAgLT4gJzAuMCcKK2RxYWJzMDA4IGFicyAnMDAuMDAnICAtPiAnMC4wMCcKK2RxYWJzMDA5IGFicyAnMDAnICAgICAtPiAnMCcKKworZHFhYnMwMTAgYWJzICctMicgICAgIC0+ICcyJworZHFhYnMwMTEgYWJzICcyJyAgICAgIC0+ICcyJworZHFhYnMwMTIgYWJzICctMi4wMCcgIC0+ICcyLjAwJworZHFhYnMwMTMgYWJzICcyLjAwJyAgIC0+ICcyLjAwJworZHFhYnMwMTQgYWJzICctMCcgICAgIC0+ICcwJworZHFhYnMwMTUgYWJzICctMC4wMCcgIC0+ICcwLjAwJworZHFhYnMwMTYgYWJzICctMDAuMCcgIC0+ICcwLjAnCitkcWFiczAxNyBhYnMgJy0wMC4wMCcgLT4gJzAuMDAnCitkcWFiczAxOCBhYnMgJy0wMCcgICAgLT4gJzAnCisKK2RxYWJzMDIwIGFicyAnLTIwMDAwMDAnIC0+ICcyMDAwMDAwJworZHFhYnMwMjEgYWJzICcyMDAwMDAwJyAgLT4gJzIwMDAwMDAnCisKK2RxYWJzMDMwIGFicyAnKzAuMScgICAgICAgICAgICAtPiAnMC4xJworZHFhYnMwMzEgYWJzICctMC4xJyAgICAgICAgICAgIC0+ICcwLjEnCitkcWFiczAzMiBhYnMgJyswLjAxJyAgICAgICAgICAgLT4gJzAuMDEnCitkcWFiczAzMyBhYnMgJy0wLjAxJyAgICAgICAgICAgLT4gJzAuMDEnCitkcWFiczAzNCBhYnMgJyswLjAwMScgICAgICAgICAgLT4gJzAuMDAxJworZHFhYnMwMzUgYWJzICctMC4wMDEnICAgICAgICAgIC0+ICcwLjAwMScKK2RxYWJzMDM2IGFicyAnKzAuMDAwMDAxJyAgICAgICAtPiAnMC4wMDAwMDEnCitkcWFiczAzNyBhYnMgJy0wLjAwMDAwMScgICAgICAgLT4gJzAuMDAwMDAxJworZHFhYnMwMzggYWJzICcrMC4wMDAwMDAwMDAwMDEnIC0+ICcxRS0xMicKK2RxYWJzMDM5IGFicyAnLTAuMDAwMDAwMDAwMDAxJyAtPiAnMUUtMTInCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjQXJpdGgKK2RxYWJzMDQwIGFicyAnMi4xJyAgICAgLT4gICcyLjEnCitkcWFiczA0MSBhYnMgJy0xMDAnICAgIC0+ICAnMTAwJworZHFhYnMwNDIgYWJzICcxMDEuNScgICAtPiAgJzEwMS41JworZHFhYnMwNDMgYWJzICctMTAxLjUnICAtPiAgJzEwMS41JworCistLSBtb3JlIGZpeGVkLCBwb3RlbnRpYWwgTEhTIHN3YXBzL292ZXJsYXlzIGlmIGRvbmUgYnkgc3VidHJhY3QgMAorZHFhYnMwNjAgYWJzICctNTYyNjdFLTEwJyAgLT4gJzAuMDAwMDA1NjI2NycKK2RxYWJzMDYxIGFicyAnLTU2MjY3RS01JyAgIC0+ICcwLjU2MjY3JworZHFhYnMwNjIgYWJzICctNTYyNjdFLTInICAgLT4gJzU2Mi42NycKK2RxYWJzMDYzIGFicyAnLTU2MjY3RS0xJyAgIC0+ICc1NjI2LjcnCitkcWFiczA2NSBhYnMgJy01NjI2N0UtMCcgICAtPiAnNTYyNjcnCisKKy0tIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvdworCistLSBsb25nIG9wZXJhbmQgdGVzdHMKK2RxYWJzMzIxIGFicyAxMjM0NTY3ODkwMTIzNDU2ICAtPiAxMjM0NTY3ODkwMTIzNDU2CitkcWFiczMyMiBhYnMgMTIzNDU2NzgwMDAgIC0+IDEyMzQ1Njc4MDAwCitkcWFiczMyMyBhYnMgMTIzNDU2NzgwMCAgIC0+IDEyMzQ1Njc4MDAKK2RxYWJzMzI0IGFicyAxMjM0NTY3ODkwICAgLT4gMTIzNDU2Nzg5MAorZHFhYnMzMjUgYWJzIDEyMzQ1Njc4OTEgICAtPiAxMjM0NTY3ODkxCitkcWFiczMyNiBhYnMgMTIzNDU2Nzg5MDEgIC0+IDEyMzQ1Njc4OTAxCitkcWFiczMyNyBhYnMgMTIzNDU2Nzg5NiAgIC0+IDEyMzQ1Njc4OTYKKworLS0gemVyb3MKK2RxYWJzMTExIGFicyAgICAgICAgICAwICAgLT4gMAorZHFhYnMxMTIgYWJzICAgICAgICAgLTAgICAtPiAwCitkcWFiczExMyBhYnMgICAgICAgMEUrNiAgIC0+IDBFKzYKK2RxYWJzMTE0IGFicyAgICAgIC0wRSs2ICAgLT4gMEUrNgorZHFhYnMxMTUgYWJzICAgICAwLjAwMDAgICAtPiAwLjAwMDAKK2RxYWJzMTE2IGFicyAgICAtMC4wMDAwICAgLT4gMC4wMDAwCitkcWFiczExNyBhYnMgICAgICAwRS0xNDEgIC0+IDBFLTE0MQorZHFhYnMxMTggYWJzICAgICAtMEUtMTQxICAtPiAwRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RxYWJzMTIxIGFicyAgIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIgICAgLT4gIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIKK2RxYWJzMTIyIGFicyAgLTI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIgICAgLT4gIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIKK2RxYWJzMTIzIGFicyAgIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEgICAgLT4gIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEKK2RxYWJzMTI0IGFicyAgLTEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEgICAgLT4gIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RxYWJzMTMxIGFicyAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxYWJzMTMyIGFicyAgMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE0MworZHFhYnMxMzMgYWJzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFhYnMxMzQgYWJzICAxRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxRS02MTc2IFN1Ym5vcm1hbAorCitkcWFiczEzNSBhYnMgIC0xRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDFFLTYxNzYgU3Vibm9ybWFsCitkcWFiczEzNiBhYnMgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkcWFiczEzNyBhYnMgIC0xRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDFFLTYxNDMKK2RxYWJzMTM4IGFicyAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKKworLS0gc3BlY2lhbHMKK2RxYWJzNTIwIGFicyAnSW5mJyAgICAtPiAnSW5maW5pdHknCitkcWFiczUyMSBhYnMgJy1JbmYnICAgLT4gJ0luZmluaXR5JworZHFhYnM1MjIgYWJzICAgTmFOICAgIC0+ICBOYU4KK2RxYWJzNTIzIGFicyAgc05hTiAgICAtPiAgTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWJzNTI0IGFicyAgIE5hTjIyICAtPiAgTmFOMjIKK2RxYWJzNTI1IGFicyAgc05hTjMzICAtPiAgTmFOMzMgSW52YWxpZF9vcGVyYXRpb24KK2RxYWJzNTI2IGFicyAgLU5hTjIyICAtPiAtTmFOMjIKK2RxYWJzNTI3IGFicyAtc05hTjMzICAtPiAtTmFOMzMgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0cworZHFhYnM5MDAgYWJzICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQWRkLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQWRkLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkZjc3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFBZGQuZGVjVGVzdApAQCAtMCwwICsxLDEyMTUgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFBZGQuZGVjVGVzdCAtLSBkZWNRdWFkIGFkZGl0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyBhcmUgZm9yIGRlY1F1YWRzIG9ubHk7IGFsbCBhcmd1bWVudHMgYXJlCistLSByZXByZXNlbnRhYmxlIGluIGEgZGVjUXVhZAorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gW2ZpcnN0IGdyb3VwIGFyZSAncXVpY2sgY29uZmlkZW5jZSBjaGVjayddCitkcWFkZDAwMSBhZGQgMSAgICAgICAxICAgICAgIC0+ICAyCitkcWFkZDAwMiBhZGQgMiAgICAgICAzICAgICAgIC0+ICA1CitkcWFkZDAwMyBhZGQgJzUuNzUnICAnMy4zJyAgIC0+ICA5LjA1CitkcWFkZDAwNCBhZGQgJzUnICAgICAnLTMnICAgIC0+ICAyCitkcWFkZDAwNSBhZGQgJy01JyAgICAnLTMnICAgIC0+ICAtOAorZHFhZGQwMDYgYWRkICctNycgICAgJzIuNScgICAtPiAgLTQuNQorZHFhZGQwMDcgYWRkICcwLjcnICAgJzAuMycgICAtPiAgMS4wCitkcWFkZDAwOCBhZGQgJzEuMjUnICAnMS4yNScgIC0+ICAyLjUwCitkcWFkZDAwOSBhZGQgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAwMCcgLT4gJzIuMjM0NTY3ODknCitkcWFkZDAxMCBhZGQgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAxMScgLT4gJzIuMjM0NTY4MDAnCisKKy0tICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkcWFkZDAxMSBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NicgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDAxMiBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NScgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZHFhZGQwMTMgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQwMTQgYWRkICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjQ5JyAgIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMDE1IGFkZCAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC40OTknICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDAxNiBhZGQgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNDk5OScgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZHFhZGQwMTcgYWRkICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjUwMDAnIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMDE4IGFkZCAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MDAxJyAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDAxOSBhZGQgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNTAxJyAgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorZHFhZGQwMjAgYWRkICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjUxJyAgIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQwMjEgYWRkIDAgMSAtPiAxCitkcWFkZDAyMiBhZGQgMSAxIC0+IDIKK2RxYWRkMDIzIGFkZCAyIDEgLT4gMworZHFhZGQwMjQgYWRkIDMgMSAtPiA0CitkcWFkZDAyNSBhZGQgNCAxIC0+IDUKK2RxYWRkMDI2IGFkZCA1IDEgLT4gNgorZHFhZGQwMjcgYWRkIDYgMSAtPiA3CitkcWFkZDAyOCBhZGQgNyAxIC0+IDgKK2RxYWRkMDI5IGFkZCA4IDEgLT4gOQorZHFhZGQwMzAgYWRkIDkgMSAtPiAxMAorCistLSBzb21lIGNhcnJ5aW5nIGVmZmVjdHMKK2RxYWRkMDMxIGFkZCAnMC45OTk4JyAgJzAuMDAwMCcgLT4gJzAuOTk5OCcKK2RxYWRkMDMyIGFkZCAnMC45OTk4JyAgJzAuMDAwMScgLT4gJzAuOTk5OScKK2RxYWRkMDMzIGFkZCAnMC45OTk4JyAgJzAuMDAwMicgLT4gJzEuMDAwMCcKK2RxYWRkMDM0IGFkZCAnMC45OTk4JyAgJzAuMDAwMycgLT4gJzEuMDAwMScKKworZHFhZGQwMzUgYWRkICc3MCcgICcxMDAwMGUrMzQnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQwMzYgYWRkICc3MDAnICAnMTAwMDBlKzM0JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMDM3IGFkZCAnNzAwMCcgICcxMDAwMGUrMzQnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQwMzggYWRkICc3MDAwMCcgICcxMDAwMGUrMzQnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQwMzkgYWRkICc3MDAwMDAnICAnMTAwMDBlKzM0JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDdFKzM4JyBSb3VuZGVkCisKKy0tIHN5bW1ldHJ5OgorZHFhZGQwNDAgYWRkICcxMDAwMGUrMzQnICAnNzAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQwNDEgYWRkICcxMDAwMGUrMzQnICAnNzAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMDQyIGFkZCAnMTAwMDBlKzM0JyAgJzcwMDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQwNDQgYWRkICcxMDAwMGUrMzQnICAnNzAwMDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQwNDUgYWRkICcxMDAwMGUrMzQnICAnNzAwMDAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDdFKzM4JyBSb3VuZGVkCisKKy0tIHNhbWUsIHdpdGhvdXQgcm91bmRpbmcKK2RxYWRkMDQ2IGFkZCAnMTAwMDBlKzknICAnNycgLT4gJzEwMDAwMDAwMDAwMDA3JworZHFhZGQwNDcgYWRkICcxMDAwMGUrOScgICc3MCcgLT4gJzEwMDAwMDAwMDAwMDcwJworZHFhZGQwNDggYWRkICcxMDAwMGUrOScgICc3MDAnIC0+ICcxMDAwMDAwMDAwMDcwMCcKK2RxYWRkMDQ5IGFkZCAnMTAwMDBlKzknICAnNzAwMCcgLT4gJzEwMDAwMDAwMDA3MDAwJworZHFhZGQwNTAgYWRkICcxMDAwMGUrOScgICc3MDAwMCcgLT4gJzEwMDAwMDAwMDcwMDAwJworZHFhZGQwNTEgYWRkICcxMDAwMGUrOScgICc3MDAwMDAnIC0+ICcxMDAwMDAwMDcwMDAwMCcKK2RxYWRkMDUyIGFkZCAnMTAwMDBlKzknICAnNzAwMDAwMCcgLT4gJzEwMDAwMDA3MDAwMDAwJworCistLSBleGFtcGxlcyBmcm9tIGRlY2FyaXRoCitkcWFkZDA1MyBhZGQgJzEyJyAnNy4wMCcgLT4gJzE5LjAwJworZHFhZGQwNTQgYWRkICcxLjMnICctMS4wNycgLT4gJzAuMjMnCitkcWFkZDA1NSBhZGQgJzEuMycgJy0xLjMwJyAtPiAnMC4wMCcKK2RxYWRkMDU2IGFkZCAnMS4zJyAnLTIuMDcnIC0+ICctMC43NycKK2RxYWRkMDU3IGFkZCAnMUUrMicgJzFFKzQnIC0+ICcxLjAxRSs0JworCistLSBsZWFkaW5nIHplcm8gcHJlc2VydmF0aW9uCitkcWFkZDA2MSBhZGQgMSAnMC4wMDAxJyAtPiAnMS4wMDAxJworZHFhZGQwNjIgYWRkIDEgJzAuMDAwMDEnIC0+ICcxLjAwMDAxJworZHFhZGQwNjMgYWRkIDEgJzAuMDAwMDAxJyAtPiAnMS4wMDAwMDEnCitkcWFkZDA2NCBhZGQgMSAnMC4wMDAwMDAxJyAtPiAnMS4wMDAwMDAxJworZHFhZGQwNjUgYWRkIDEgJzAuMDAwMDAwMDEnIC0+ICcxLjAwMDAwMDAxJworCistLSBzb21lIGZ1bm55IHplcm9zIFtpbiBjYXNlIG9mIGJhZCBzaWdudW1dCitkcWFkZDA3MCBhZGQgMSAgMCAgICAtPiAxCitkcWFkZDA3MSBhZGQgMSAwLiAgICAtPiAxCitkcWFkZDA3MiBhZGQgMSAgLjAgICAtPiAxLjAKK2RxYWRkMDczIGFkZCAxIDAuMCAgIC0+IDEuMAorZHFhZGQwNzQgYWRkIDEgMC4wMCAgLT4gMS4wMAorZHFhZGQwNzUgYWRkICAwICAxICAgLT4gMQorZHFhZGQwNzYgYWRkIDAuICAxICAgLT4gMQorZHFhZGQwNzcgYWRkICAuMCAxICAgLT4gMS4wCitkcWFkZDA3OCBhZGQgMC4wIDEgICAtPiAxLjAKK2RxYWRkMDc5IGFkZCAwLjAwIDEgIC0+IDEuMDAKKworLS0gc29tZSBjYXJyaWVzCitkcWFkZDA4MCBhZGQgOTk5OTk5OTk4IDEgIC0+IDk5OTk5OTk5OQorZHFhZGQwODEgYWRkIDk5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAwCitkcWFkZDA4MiBhZGQgIDk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMAorZHFhZGQwODMgYWRkICAgOTk5OTk5OSAxICAtPiAxMDAwMDAwMAorZHFhZGQwODQgYWRkICAgIDk5OTk5OSAxICAtPiAxMDAwMDAwCitkcWFkZDA4NSBhZGQgICAgIDk5OTk5IDEgIC0+IDEwMDAwMAorZHFhZGQwODYgYWRkICAgICAgOTk5OSAxICAtPiAxMDAwMAorZHFhZGQwODcgYWRkICAgICAgIDk5OSAxICAtPiAxMDAwCitkcWFkZDA4OCBhZGQgICAgICAgIDk5IDEgIC0+IDEwMAorZHFhZGQwODkgYWRkICAgICAgICAgOSAxICAtPiAxMAorCisKKy0tIG1vcmUgTEhTIHN3YXBzCitkcWFkZDA5MCBhZGQgJy01NjI2N0UtMTAnICAgMCAtPiAgJy0wLjAwMDAwNTYyNjcnCitkcWFkZDA5MSBhZGQgJy01NjI2N0UtNicgICAgMCAtPiAgJy0wLjA1NjI2NycKK2RxYWRkMDkyIGFkZCAnLTU2MjY3RS01JyAgICAwIC0+ICAnLTAuNTYyNjcnCitkcWFkZDA5MyBhZGQgJy01NjI2N0UtNCcgICAgMCAtPiAgJy01LjYyNjcnCitkcWFkZDA5NCBhZGQgJy01NjI2N0UtMycgICAgMCAtPiAgJy01Ni4yNjcnCitkcWFkZDA5NSBhZGQgJy01NjI2N0UtMicgICAgMCAtPiAgJy01NjIuNjcnCitkcWFkZDA5NiBhZGQgJy01NjI2N0UtMScgICAgMCAtPiAgJy01NjI2LjcnCitkcWFkZDA5NyBhZGQgJy01NjI2N0UtMCcgICAgMCAtPiAgJy01NjI2NycKK2RxYWRkMDk4IGFkZCAnLTVFLTEwJyAgICAgICAwIC0+ICAnLTVFLTEwJworZHFhZGQwOTkgYWRkICctNUUtNycgICAgICAgIDAgLT4gICctNUUtNycKK2RxYWRkMTAwIGFkZCAnLTVFLTYnICAgICAgICAwIC0+ICAnLTAuMDAwMDA1JworZHFhZGQxMDEgYWRkICctNUUtNScgICAgICAgIDAgLT4gICctMC4wMDAwNScKK2RxYWRkMTAyIGFkZCAnLTVFLTQnICAgICAgICAwIC0+ICAnLTAuMDAwNScKK2RxYWRkMTAzIGFkZCAnLTVFLTEnICAgICAgICAwIC0+ICAnLTAuNScKK2RxYWRkMTA0IGFkZCAnLTVFMCcgICAgICAgICAwIC0+ICAnLTUnCitkcWFkZDEwNSBhZGQgJy01RTEnICAgICAgICAgMCAtPiAgJy01MCcKK2RxYWRkMTA2IGFkZCAnLTVFNScgICAgICAgICAwIC0+ICAnLTUwMDAwMCcKK2RxYWRkMTA3IGFkZCAnLTVFMzMnICAgICAgICAwIC0+ICAnLTUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcWFkZDEwOCBhZGQgJy01RTM0JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQnICBSb3VuZGVkCitkcWFkZDEwOSBhZGQgJy01RTM1JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzUnICBSb3VuZGVkCitkcWFkZDExMCBhZGQgJy01RTM2JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzYnICBSb3VuZGVkCitkcWFkZDExMSBhZGQgJy01RTEwMCcgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMTAwJyBSb3VuZGVkCisKKy0tIG1vcmUgUkhTIHN3YXBzCitkcWFkZDExMyBhZGQgMCAgJy01NjI2N0UtMTAnIC0+ICAnLTAuMDAwMDA1NjI2NycKK2RxYWRkMTE0IGFkZCAwICAnLTU2MjY3RS02JyAgLT4gICctMC4wNTYyNjcnCitkcWFkZDExNiBhZGQgMCAgJy01NjI2N0UtNScgIC0+ICAnLTAuNTYyNjcnCitkcWFkZDExNyBhZGQgMCAgJy01NjI2N0UtNCcgIC0+ICAnLTUuNjI2NycKK2RxYWRkMTE5IGFkZCAwICAnLTU2MjY3RS0zJyAgLT4gICctNTYuMjY3JworZHFhZGQxMjAgYWRkIDAgICctNTYyNjdFLTInICAtPiAgJy01NjIuNjcnCitkcWFkZDEyMSBhZGQgMCAgJy01NjI2N0UtMScgIC0+ICAnLTU2MjYuNycKK2RxYWRkMTIyIGFkZCAwICAnLTU2MjY3RS0wJyAgLT4gICctNTYyNjcnCitkcWFkZDEyMyBhZGQgMCAgJy01RS0xMCcgICAgIC0+ICAnLTVFLTEwJworZHFhZGQxMjQgYWRkIDAgICctNUUtNycgICAgICAtPiAgJy01RS03JworZHFhZGQxMjUgYWRkIDAgICctNUUtNicgICAgICAtPiAgJy0wLjAwMDAwNScKK2RxYWRkMTI2IGFkZCAwICAnLTVFLTUnICAgICAgLT4gICctMC4wMDAwNScKK2RxYWRkMTI3IGFkZCAwICAnLTVFLTQnICAgICAgLT4gICctMC4wMDA1JworZHFhZGQxMjggYWRkIDAgICctNUUtMScgICAgICAtPiAgJy0wLjUnCitkcWFkZDEyOSBhZGQgMCAgJy01RTAnICAgICAgIC0+ICAnLTUnCitkcWFkZDEzMCBhZGQgMCAgJy01RTEnICAgICAgIC0+ICAnLTUwJworZHFhZGQxMzEgYWRkIDAgICctNUU1JyAgICAgICAtPiAgJy01MDAwMDAnCitkcWFkZDEzMiBhZGQgMCAgJy01RTMzJyAgICAgIC0+ICAnLTUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcWFkZDEzMyBhZGQgMCAgJy01RTM0JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCcgICBSb3VuZGVkCitkcWFkZDEzNCBhZGQgMCAgJy01RTM1JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNScgICBSb3VuZGVkCitkcWFkZDEzNSBhZGQgMCAgJy01RTM2JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNicgICBSb3VuZGVkCitkcWFkZDEzNiBhZGQgMCAgJy01RTEwMCcgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSsxMDAnICBSb3VuZGVkCisKKy0tIHJlbGF0ZWQKK2RxYWRkMTM3IGFkZCAgMSAgJzBFLTM5JyAgICAgIC0+ICAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICBSb3VuZGVkCitkcWFkZDEzOCBhZGQgLTEgICcwRS0zOScgICAgICAtPiAgJy0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZHFhZGQxMzkgYWRkICcwRS0zOScgMSAgICAgICAgLT4gICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgIFJvdW5kZWQKK2RxYWRkMTQwIGFkZCAnMEUtMzknIC0xICAgICAgIC0+ICAnLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCitkcWFkZDE0MSBhZGQgMUUrMjkgICAwLjAwMDAgICAtPiAgJzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wMDAwJworZHFhZGQxNDIgYWRkIDFFKzI5ICAgMC4wMDAwMCAgLT4gICcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMDAwMCcgIFJvdW5kZWQKK2RxYWRkMTQzIGFkZCAwLjAwMCAgIDFFKzMwICAgIC0+ICAnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wMDAnCitkcWFkZDE0NCBhZGQgMC4wMDAwICAxRSszMCAgICAtPiAgJzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMDAwJyAgUm91bmRlZAorCistLSBbc29tZSBvZiB0aGUgbmV4dCBncm91cCBhcmUgcmVhbGx5IGNvbnN0cnVjdG9yIHRlc3RzXQorZHFhZGQxNDYgYWRkICcwMC4wJyAgMCAgICAgICAtPiAgJzAuMCcKK2RxYWRkMTQ3IGFkZCAnMC4wMCcgIDAgICAgICAgLT4gICcwLjAwJworZHFhZGQxNDggYWRkICAwICAgICAgJzAuMDAnICAtPiAgJzAuMDAnCitkcWFkZDE0OSBhZGQgIDAgICAgICAnMDAuMCcgIC0+ICAnMC4wJworZHFhZGQxNTAgYWRkICcwMC4wJyAgJzAuMDAnICAtPiAgJzAuMDAnCitkcWFkZDE1MSBhZGQgJzAuMDAnICAnMDAuMCcgIC0+ICAnMC4wMCcKK2RxYWRkMTUyIGFkZCAnMycgICAgICcuMycgICAgLT4gICczLjMnCitkcWFkZDE1MyBhZGQgJzMuJyAgICAnLjMnICAgIC0+ICAnMy4zJworZHFhZGQxNTQgYWRkICczLjAnICAgJy4zJyAgICAtPiAgJzMuMycKK2RxYWRkMTU1IGFkZCAnMy4wMCcgICcuMycgICAgLT4gICczLjMwJworZHFhZGQxNTYgYWRkICczJyAgICAgJzMnICAgICAtPiAgJzYnCitkcWFkZDE1NyBhZGQgJzMnICAgICAnKzMnICAgIC0+ICAnNicKK2RxYWRkMTU4IGFkZCAnMycgICAgICctMycgICAgLT4gICcwJworZHFhZGQxNTkgYWRkICcwLjMnICAgJy0wLjMnICAtPiAgJzAuMCcKK2RxYWRkMTYwIGFkZCAnMC4wMycgICctMC4wMycgLT4gICcwLjAwJworCistLSB0cnkgYm9yZGVybGluZSBwcmVjaXNpb24sIHdpdGggY2FycmllcywgZXRjLgorZHFhZGQxNjEgYWRkICcxRSsxMicgJy0xJyAgICAtPiAnOTk5OTk5OTk5OTk5JworZHFhZGQxNjIgYWRkICcxRSsxMicgICcxLjExJyAtPiAnMTAwMDAwMDAwMDAwMS4xMScKK2RxYWRkMTYzIGFkZCAnMS4xMScgICcxRSsxMicgLT4gJzEwMDAwMDAwMDAwMDEuMTEnCitkcWFkZDE2NCBhZGQgJy0xJyAgICAnMUUrMTInIC0+ICc5OTk5OTk5OTk5OTknCitkcWFkZDE2NSBhZGQgJzdFKzEyJyAnLTEnICAgIC0+ICc2OTk5OTk5OTk5OTk5JworZHFhZGQxNjYgYWRkICc3RSsxMicgICcxLjExJyAtPiAnNzAwMDAwMDAwMDAwMS4xMScKK2RxYWRkMTY3IGFkZCAnMS4xMScgICc3RSsxMicgLT4gJzcwMDAwMDAwMDAwMDEuMTEnCitkcWFkZDE2OCBhZGQgJy0xJyAgICAnN0UrMTInIC0+ICc2OTk5OTk5OTk5OTk5JworCityb3VuZGluZzogaGFsZl91cAorZHFhZGQxNzAgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NjcnIC0+ICc1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDE3MSBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU2NicgLT4gJzUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMTcyIGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTY1JyAtPiAnNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZHFhZGQxNzMgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NjQnIC0+ICc1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDE3NCBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1MycgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMTc1IGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUyJyAtPiAnNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknIEluZXhhY3QgUm91bmRlZAorZHFhZGQxNzYgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTEnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDE3NyBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1MCcgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JyBSb3VuZGVkCitkcWFkZDE3OCBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0NScgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMTc5IGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTQ0JyAtPiAnNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQxODAgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NDMnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDE4MSBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0MicgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMTgyIGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTQxJyAtPiAnNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQxODMgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NDAnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCcgUm91bmRlZAorCistLSBhbmQgc29tZSBtb3JlLCBpbmNsdWRpbmcgcmVzaWR1ZSBlZmZlY3RzIGFuZCBkaWZmZXJlbnQgcm91bmRpbmdzCityb3VuZGluZzogaGFsZl91cAorZHFhZGQyMDAgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JworZHFhZGQyMDEgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjAyIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIwMyBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMDQgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjA1IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIwNiBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMDcgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjA4IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIwOSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMTAgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjExIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIxMiBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMTMgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjE0IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIxNSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMTYgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJworZHFhZGQyMTcgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjAwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjE4IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIxOSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCitkcWFkZDIyMCBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknCitkcWFkZDIyMSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMjIgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjIzIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIyNCBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMjUgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjI2IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIyNyBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMjggYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjI5IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIzMCBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMzEgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjMyIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIzMyBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMzQgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjM1IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIzNiBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnCitkcWFkZDIzNyBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMzggYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjM5IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorZHFhZGQyNDAgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg4JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjQxIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OCcgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI0MiBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODgnIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorZHFhZGQyNTAgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JworZHFhZGQyNTEgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjUyIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI1MyBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyNTQgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjU1IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI1NiBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyNTcgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjU4IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI1OSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyNjAgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjYxIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI2MiBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyNjMgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjY0IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI2NSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyNjYgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJworZHFhZGQyNjcgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjY4IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI2OSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCistLSAxIGluIGxhc3QgcGxhY2UgdGVzdHMKK3JvdW5kaW5nOiBoYWxmX3VwCitkcWFkZDMwMSBhZGQgIC0xICAgMSAgICAgIC0+ICAgMAorZHFhZGQzMDIgYWRkICAgMCAgIDEgICAgICAtPiAgIDEKK2RxYWRkMzAzIGFkZCAgIDEgICAxICAgICAgLT4gICAyCitkcWFkZDMwNCBhZGQgIDEyICAgMSAgICAgIC0+ICAxMworZHFhZGQzMDUgYWRkICA5OCAgIDEgICAgICAtPiAgOTkKK2RxYWRkMzA2IGFkZCAgOTkgICAxICAgICAgLT4gMTAwCitkcWFkZDMwNyBhZGQgMTAwICAgMSAgICAgIC0+IDEwMQorZHFhZGQzMDggYWRkIDEwMSAgIDEgICAgICAtPiAxMDIKK2RxYWRkMzA5IGFkZCAgLTEgIC0xICAgICAgLT4gIC0yCitkcWFkZDMxMCBhZGQgICAwICAtMSAgICAgIC0+ICAtMQorZHFhZGQzMTEgYWRkICAgMSAgLTEgICAgICAtPiAgIDAKK2RxYWRkMzEyIGFkZCAgMTIgIC0xICAgICAgLT4gIDExCitkcWFkZDMxMyBhZGQgIDk4ICAtMSAgICAgIC0+ICA5NworZHFhZGQzMTQgYWRkICA5OSAgLTEgICAgICAtPiAgOTgKK2RxYWRkMzE1IGFkZCAxMDAgIC0xICAgICAgLT4gIDk5CitkcWFkZDMxNiBhZGQgMTAxICAtMSAgICAgIC0+IDEwMAorCitkcWFkZDMyMSBhZGQgLTAuMDEgIDAuMDEgICAgLT4gIDAuMDAKK2RxYWRkMzIyIGFkZCAgMC4wMCAgMC4wMSAgICAtPiAgMC4wMQorZHFhZGQzMjMgYWRkICAwLjAxICAwLjAxICAgIC0+ICAwLjAyCitkcWFkZDMyNCBhZGQgIDAuMTIgIDAuMDEgICAgLT4gIDAuMTMKK2RxYWRkMzI1IGFkZCAgMC45OCAgMC4wMSAgICAtPiAgMC45OQorZHFhZGQzMjYgYWRkICAwLjk5ICAwLjAxICAgIC0+ICAxLjAwCitkcWFkZDMyNyBhZGQgIDEuMDAgIDAuMDEgICAgLT4gIDEuMDEKK2RxYWRkMzI4IGFkZCAgMS4wMSAgMC4wMSAgICAtPiAgMS4wMgorZHFhZGQzMjkgYWRkIC0wLjAxIC0wLjAxICAgIC0+IC0wLjAyCitkcWFkZDMzMCBhZGQgIDAuMDAgLTAuMDEgICAgLT4gLTAuMDEKK2RxYWRkMzMxIGFkZCAgMC4wMSAtMC4wMSAgICAtPiAgMC4wMAorZHFhZGQzMzIgYWRkICAwLjEyIC0wLjAxICAgIC0+ICAwLjExCitkcWFkZDMzMyBhZGQgIDAuOTggLTAuMDEgICAgLT4gIDAuOTcKK2RxYWRkMzM0IGFkZCAgMC45OSAtMC4wMSAgICAtPiAgMC45OAorZHFhZGQzMzUgYWRkICAxLjAwIC0wLjAxICAgIC0+ICAwLjk5CitkcWFkZDMzNiBhZGQgIDEuMDEgLTAuMDEgICAgLT4gIDEuMDAKKworLS0gc29tZSBtb3JlIGNhc2VzIHdoZXJlIGFkZGluZyAwIGFmZmVjdHMgdGhlIGNvZWZmaWNpZW50CitkcWFkZDM0MCBhZGQgMUUrMyAgICAwICAgIC0+ICAgICAgICAgMTAwMAorZHFhZGQzNDEgYWRkIDFFKzMzICAgMCAgICAtPiAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWFkZDM0MiBhZGQgMUUrMzQgICAwICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0ICBSb3VuZGVkCitkcWFkZDM0MyBhZGQgMUUrMzUgICAwICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM1ICBSb3VuZGVkCistLSB3aGljaCBzaW1wbHkgZm9sbG93IGZyb20gdGhlc2UgY2FzZXMgLi4uCitkcWFkZDM0NCBhZGQgMUUrMyAgICAxICAgIC0+ICAgICAgICAgMTAwMQorZHFhZGQzNDUgYWRkIDFFKzMzICAgMSAgICAtPiAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcWFkZDM0NiBhZGQgMUUrMzQgICAxICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzQ3IGFkZCAxRSszNSAgIDEgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzUgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNDggYWRkIDFFKzMgICAgNyAgICAtPiAgICAgICAgIDEwMDcKK2RxYWRkMzQ5IGFkZCAxRSszMyAgIDcgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNworZHFhZGQzNTAgYWRkIDFFKzM0ICAgNyAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRSszNCAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM1MSBhZGQgMUUrMzUgICA3ICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM1ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gdHJ5emVyb3MgY2FzZXMKK3JvdW5kaW5nOiAgICBoYWxmX3VwCitkcWFkZDM2MCAgYWRkIDBFKzUwIDEwMDAwRSsxICAtPiAxLjAwMDBFKzUKK2RxYWRkMzYxICBhZGQgMEUtNTAgMTAwMDBFKzEgIC0+IDEwMDAwMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIFJvdW5kZWQKK2RxYWRkMzYyICBhZGQgMTAwMDBFKzEgMEUtNTAgIC0+IDEwMDAwMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIFJvdW5kZWQKK2RxYWRkMzYzICBhZGQgMTAwMDBFKzEgMTAwMDBFLTUwICAtPiAxMDAwMDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBSb3VuZGVkIEluZXhhY3QKK2RxYWRkMzY0ICBhZGQgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+IDBFKzYxMTEKKy0tICAgICAgICAgICAgMSAyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQKKworLS0gYSBjdXJpb3NpdHkgZnJvbSBKU1IgMTMgdGVzdGluZworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorZHFhZGQzNzAgYWRkICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MTQKK2RxYWRkMzcxIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MUUrMzQgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogICAgaGFsZl91cAorZHFhZGQzNzIgYWRkICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MTQKK2RxYWRkMzczIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MUUrMzQgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogICAgaGFsZl9ldmVuCitkcWFkZDM3NCBhZGQgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxNAorZHFhZGQzNzUgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxRSszNCBSb3VuZGVkIEluZXhhY3QKKworLS0gdWxwIHJlcGxhY2VtZW50IHRlc3RzCitkcWFkZDQwMCBhZGQgICAxICAgNzdlLTMyICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzcKK2RxYWRkNDAxIGFkZCAgIDEgICA3N2UtMzMgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzcKK2RxYWRkNDAyIGFkZCAgIDEgICA3N2UtMzQgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkcWFkZDQwMyBhZGQgICAxICAgNzdlLTM1ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ0MDQgYWRkICAgMSAgIDc3ZS0zNiAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNDA1IGFkZCAgIDEgICA3N2UtMzcgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDQwNiBhZGQgICAxICAgNzdlLTI5OSAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDQxMCBhZGQgIDEwICAgNzdlLTMyICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3CitkcWFkZDQxMSBhZGQgIDEwICAgNzdlLTMzICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ0MTIgYWRkICAxMCAgIDc3ZS0zNCAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNDEzIGFkZCAgMTAgICA3N2UtMzUgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDQxNCBhZGQgIDEwICAgNzdlLTM2ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ0MTUgYWRkICAxMCAgIDc3ZS0zNyAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNDE2IGFkZCAgMTAgICA3N2UtMjk5ICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkNDIwIGFkZCAgNzdlLTMyICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3NworZHFhZGQ0MjEgYWRkICA3N2UtMzMgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3NworZHFhZGQ0MjIgYWRkICA3N2UtMzQgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNDIzIGFkZCAgNzdlLTM1ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDQyNCBhZGQgIDc3ZS0zNiAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ0MjUgYWRkICA3N2UtMzcgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNDI2IGFkZCAgNzdlLTI5OSAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkNDMwIGFkZCAgNzdlLTMyICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzcKK2RxYWRkNDMxIGFkZCAgNzdlLTMzICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkcWFkZDQzMiBhZGQgIDc3ZS0zNCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ0MzMgYWRkICA3N2UtMzUgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNDM0IGFkZCAgNzdlLTM2ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDQzNSBhZGQgIDc3ZS0zNyAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ0MzYgYWRkICA3N2UtMjk5ICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gZmFzdHBhdGggYm91bmRhcmllcworLS0gICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CitkcWFkZDUwMSBhZGQgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknCitkcWFkZDUwMiBhZGQgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNDU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknCitkcWFkZDUwMyBhZGQgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMzU1NTU1NTU1NTU1NTU1NTU1NTA1NTU1NTU1NTU1NTU1NScgLT4gJzc5OTk5OTk5OTk5OTk5OTk5OTk0OTk5OTk5OTk5OTk5OTknCitkcWFkZDUwNCBhZGQgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMzk1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzgzOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknCitkcWFkZDUwNSBhZGQgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNDk1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzkzOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknCitkcWFkZDUwNiBhZGQgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTk1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gMS4wNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ1MTEgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MTIgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MTMgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MTQgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MTUgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MTYgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MTcgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MTggYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MTkgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MjAgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MjEgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MjIgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MjMgYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMnIC0+ICc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3JworZHFhZGQ1MjQgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MjUgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MjYgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MjcgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MjggYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MjkgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MzAgYWRkICczNDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MzEgYWRkICczNDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5JworZHFhZGQ1MzIgYWRkICczNDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5JworZHFhZGQ1MzMgYWRkICczNDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5JworZHFhZGQ1MzQgYWRkICczNDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5JworZHFhZGQ1MzUgYWRkICczNDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5JworZHFhZGQ1MzYgYWRkICczNDQ0NDQ0NDQnICAnNTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5JworZHFhZGQ1MzcgYWRkICczNDQ0NDQ0NCcgICc1NTU1NTU1NScgLT4gJzg5OTk5OTk5JworZHFhZGQ1MzggYWRkICczNDQ0NDQ0JyAgJzU1NTU1NTUnIC0+ICc4OTk5OTk5JworZHFhZGQ1MzkgYWRkICczNDQ0NDQnICAnNTU1NTU1JyAtPiAnODk5OTk5JworZHFhZGQ1NDAgYWRkICczNDQ0NCcgICc1NTU1NScgLT4gJzg5OTk5JworZHFhZGQ1NDEgYWRkICczNDQ0JyAgJzU1NTUnIC0+ICc4OTk5JworZHFhZGQ1NDIgYWRkICczNDQnICAnNTU1JyAtPiAnODk5JworZHFhZGQ1NDMgYWRkICczNCcgICc1NScgLT4gJzg5JworZHFhZGQ1NDQgYWRkICczJyAgJzUnIC0+ICc4JworCitkcWFkZDU0NSBhZGQgJzMwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICAnMzAwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMCcgLT4gJzYwMDAwMDQwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcWFkZDU0NiBhZGQgJzMwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICAnNDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMCcgLT4gJzcwMDAwMDA0MDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcWFkZDU0NyBhZGQgJzMwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICAnNTAwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgLT4gJzgwMDAwMDAwNDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcWFkZDU0OCBhZGQgJzQwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICAnMzAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgLT4gJzcwMDAwMDAwMDQwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcWFkZDU0OSBhZGQgJzQwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICAnNDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgLT4gJzgwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcWFkZDU1MCBhZGQgJzQwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICAnNTAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgLT4gJzkwMDAwMDAwMDQwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcWFkZDU1MSBhZGQgJzUwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICAnMzAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgLT4gJzgwMDAwMDAwNDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcWFkZDU1MiBhZGQgJzUwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAnICAnNDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgLT4gJzkwMDAwMDA0MDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcWFkZDU1MyBhZGQgJzUwMDAwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAnICAnNTAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgLT4gMS4wMDAwMDA0MDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IFJvdW5kZWQKKy0tIGNoZWNrIHByb3BhZ2F0aW9uCitkcWFkZDU1NCBhZGQgJzg5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScgLT4gIDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxYWRkNTU1IGFkZCAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScgICc4OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JyAtPiAgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFhZGQ1NTYgYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzQ1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTYnIC0+ICA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWFkZDU1NyBhZGQgJzQ1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTYnICAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgLT4gIDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworLS0gbmVnYXRpdmUgdWxwcworZHFhZGQ2NDQwIGFkZCAgIDEgICAtNzdlLTMyICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjQ0MSBhZGQgICAxICAgLTc3ZS0zMyAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQ2NDQyIGFkZCAgIDEgICAtNzdlLTM0ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQ2NDQzIGFkZCAgIDEgICAtNzdlLTM1ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ0NCBhZGQgICAxICAgLTc3ZS0zNiAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0NDUgYWRkICAgMSAgIC03N2UtMzcgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0NDYgYWRkICAgMSAgIC03N2UtOTkgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkNjQ1MCBhZGQgIDEwICAgLTc3ZS0zMiAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQ2NDUxIGFkZCAgMTAgICAtNzdlLTMzICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQ2NDUyIGFkZCAgMTAgICAtNzdlLTM0ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ1MyBhZGQgIDEwICAgLTc3ZS0zNSAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0NTQgYWRkICAxMCAgIC03N2UtMzYgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0NTUgYWRkICAxMCAgIC03N2UtMzcgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0NTYgYWRkICAxMCAgIC03N2UtOTkgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkNjQ2MCBhZGQgIC03N2UtMzIgICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY0NjEgYWRkICAtNzdlLTMzICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjQ2MiBhZGQgIC03N2UtMzQgICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjQ2MyBhZGQgIC03N2UtMzUgICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0NjQgYWRkICAtNzdlLTM2ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDY1IGFkZCAgLTc3ZS0zNyAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDY2IGFkZCAgLTc3ZS05OSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDY0NzAgYWRkICAtNzdlLTMyICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjQ3MSBhZGQgIC03N2UtMzMgICAgICAxMCAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjQ3MiBhZGQgIC03N2UtMzQgICAgICAxMCAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0NzMgYWRkICAtNzdlLTM1ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDc0IGFkZCAgLTc3ZS0zNiAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDc1IGFkZCAgLTc3ZS0zNyAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDc2IGFkZCAgLTc3ZS05OSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBuZWdhdGl2ZSB1bHBzCitkcWFkZDY0ODAgYWRkICAtMSAgICA3N2UtMzIgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjQ4MSBhZGQgIC0xICAgIDc3ZS0zMyAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjQ4MiBhZGQgIC0xICAgIDc3ZS0zNCAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY0ODMgYWRkICAtMSAgICA3N2UtMzUgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ4NCBhZGQgIC0xICAgIDc3ZS0zNiAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDg1IGFkZCAgLTEgICAgNzdlLTM3ICAgICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ4NiBhZGQgIC0xICAgIDc3ZS05OSAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkNjQ5MCBhZGQgLTEwICAgIDc3ZS0zMiAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjQ5MSBhZGQgLTEwICAgIDc3ZS0zMyAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY0OTIgYWRkIC0xMCAgICA3N2UtMzQgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ5MyBhZGQgLTEwICAgIDc3ZS0zNSAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDk0IGFkZCAtMTAgICAgNzdlLTM2ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ5NSBhZGQgLTEwICAgIDc3ZS0zNyAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0OTYgYWRkIC0xMCAgICA3N2UtOTkgICAgICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDY1MDAgYWRkICAgNzdlLTMyICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjUwMSBhZGQgICA3N2UtMzMgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjUwMiBhZGQgICA3N2UtMzQgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY1MDMgYWRkICAgNzdlLTM1ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjUwNCBhZGQgICA3N2UtMzYgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTA1IGFkZCAgIDc3ZS0zNyAgICAgIC0xICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjUwNiBhZGQgICA3N2UtOTkgICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkNjUxMCBhZGQgICA3N2UtMzIgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjUxMSBhZGQgICA3N2UtMzMgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY1MTIgYWRkICAgNzdlLTM0ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjUxMyBhZGQgICA3N2UtMzUgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTE0IGFkZCAgIDc3ZS0zNiAgICAgIC0xMCAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjUxNSBhZGQgICA3N2UtMzcgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1MTYgYWRkICAgNzdlLTk5ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBhbmQgc29tZSBtb3JlIHJlc2lkdWUgZWZmZWN0cyBhbmQgZGlmZmVyZW50IHJvdW5kaW5ncworcm91bmRpbmc6IGhhbGZfdXAKK2RxYWRkNjU0MCBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknCitkcWFkZDY1NDEgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU0MiBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTQzIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NDQgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU0NSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTQ2IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NDcgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU0OCBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTQ5IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NTAgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU1MSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTUyIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NTMgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU1NCBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTU1IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NTYgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJworZHFhZGQ2NTU3IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMDAwMDEgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NTggYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU1OSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCitkcWFkZDY1NjAgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JworZHFhZGQ2NTYxIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NjIgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU2MyBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTY0IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NjUgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU2NiBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTY3IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NjggYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU2OSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTcwIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NzEgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU3MiBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTczIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NzQgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU3NSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTc2IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcKK2RxYWRkNjU3NyBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTc4IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NzkgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gY3JpdGljYWwgZmV3IHdpdGggZXZlbiBib3R0b20gZGlnaXQuLi4KK2RxYWRkNzU0MCBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODgnIDAuNDk5OTk5OTk5ICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTQxIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OCcgMC41ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NDIgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg4JyAwLjUwMDAwMDAwMSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGRvd24KK2RxYWRkNzU1MCBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknCitkcWFkZDc1NTEgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzU1MiBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTUzIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NTQgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzU1NSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTU2IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NTcgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzU1OCBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTU5IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NjAgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzU2MSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTYyIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NjMgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzU2NCBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTY1IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NjYgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJworZHFhZGQ3NTY3IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NjggYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzU2OSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCistLSBtb3JlIHplcm9zLCBldGMuCityb3VuZGluZzogaGFsZl9ldmVuCisKK2RxYWRkNzcwMSBhZGQgNS4wMCAxLjAwRS0zIC0+IDUuMDAxMDAKK2RxYWRkNzcwMiBhZGQgMDAuMDAgMC4wMDAgIC0+IDAuMDAwCitkcWFkZDc3MDMgYWRkIDAwLjAwIDBFLTMgICAtPiAwLjAwMAorZHFhZGQ3NzA0IGFkZCAwRS0zICAwMC4wMCAgLT4gMC4wMDAKKworZHFhZGQ3NzEwIGFkZCAwRSszICAwMC4wMCAgLT4gMC4wMAorZHFhZGQ3NzExIGFkZCAwRSszICAwMC4wICAgLT4gMC4wCitkcWFkZDc3MTIgYWRkIDBFKzMgIDAwLiAgICAtPiAwCitkcWFkZDc3MTMgYWRkIDBFKzMgIDAwLkUrMSAtPiAwRSsxCitkcWFkZDc3MTQgYWRkIDBFKzMgIDAwLkUrMiAtPiAwRSsyCitkcWFkZDc3MTUgYWRkIDBFKzMgIDAwLkUrMyAtPiAwRSszCitkcWFkZDc3MTYgYWRkIDBFKzMgIDAwLkUrNCAtPiAwRSszCitkcWFkZDc3MTcgYWRkIDBFKzMgIDAwLkUrNSAtPiAwRSszCitkcWFkZDc3MTggYWRkIDBFKzMgIC0wMC4wICAgLT4gMC4wCitkcWFkZDc3MTkgYWRkIDBFKzMgIC0wMC4gICAgLT4gMAorZHFhZGQ3NzMxIGFkZCAwRSszICAtMDAuRSsxIC0+IDBFKzEKKworZHFhZGQ3NzIwIGFkZCAwMC4wMCAgMEUrMyAgLT4gMC4wMAorZHFhZGQ3NzIxIGFkZCAwMC4wICAgMEUrMyAgLT4gMC4wCitkcWFkZDc3MjIgYWRkIDAwLiAgICAwRSszICAtPiAwCitkcWFkZDc3MjMgYWRkIDAwLkUrMSAwRSszICAtPiAwRSsxCitkcWFkZDc3MjQgYWRkIDAwLkUrMiAwRSszICAtPiAwRSsyCitkcWFkZDc3MjUgYWRkIDAwLkUrMyAwRSszICAtPiAwRSszCitkcWFkZDc3MjYgYWRkIDAwLkUrNCAwRSszICAtPiAwRSszCitkcWFkZDc3MjcgYWRkIDAwLkUrNSAwRSszICAtPiAwRSszCitkcWFkZDc3MjggYWRkIC0wMC4wMCAwRSszICAtPiAwLjAwCitkcWFkZDc3MjkgYWRkIC0wMC4wICAwRSszICAtPiAwLjAKK2RxYWRkNzczMCBhZGQgLTAwLiAgIDBFKzMgIC0+IDAKKworZHFhZGQ3NzMyIGFkZCAgMCAgICAgMCAgICAgLT4gIDAKK2RxYWRkNzczMyBhZGQgIDAgICAgLTAgICAgIC0+ICAwCitkcWFkZDc3MzQgYWRkIC0wICAgICAwICAgICAtPiAgMAorZHFhZGQ3NzM1IGFkZCAtMCAgICAtMCAgICAgLT4gLTAgICAgIC0tIElFRUUgNzU0IHNwZWNpYWwgY2FzZQorCitkcWFkZDc3MzYgYWRkICAxICAgIC0xICAgICAtPiAgMAorZHFhZGQ3NzM3IGFkZCAtMSAgICAtMSAgICAgLT4gLTIKK2RxYWRkNzczOCBhZGQgIDEgICAgIDEgICAgIC0+ICAyCitkcWFkZDc3MzkgYWRkIC0xICAgICAxICAgICAtPiAgMAorCitkcWFkZDc3NDEgYWRkICAwICAgIC0xICAgICAtPiAtMQorZHFhZGQ3NzQyIGFkZCAtMCAgICAtMSAgICAgLT4gLTEKK2RxYWRkNzc0MyBhZGQgIDAgICAgIDEgICAgIC0+ICAxCitkcWFkZDc3NDQgYWRkIC0wICAgICAxICAgICAtPiAgMQorZHFhZGQ3NzQ1IGFkZCAtMSAgICAgMCAgICAgLT4gLTEKK2RxYWRkNzc0NiBhZGQgLTEgICAgLTAgICAgIC0+IC0xCitkcWFkZDc3NDcgYWRkICAxICAgICAwICAgICAtPiAgMQorZHFhZGQ3NzQ4IGFkZCAgMSAgICAtMCAgICAgLT4gIDEKKworZHFhZGQ3NzUxIGFkZCAgMC4wICAtMSAgICAgLT4gLTEuMAorZHFhZGQ3NzUyIGFkZCAtMC4wICAtMSAgICAgLT4gLTEuMAorZHFhZGQ3NzUzIGFkZCAgMC4wICAgMSAgICAgLT4gIDEuMAorZHFhZGQ3NzU0IGFkZCAtMC4wICAgMSAgICAgLT4gIDEuMAorZHFhZGQ3NzU1IGFkZCAtMS4wICAgMCAgICAgLT4gLTEuMAorZHFhZGQ3NzU2IGFkZCAtMS4wICAtMCAgICAgLT4gLTEuMAorZHFhZGQ3NzU3IGFkZCAgMS4wICAgMCAgICAgLT4gIDEuMAorZHFhZGQ3NzU4IGFkZCAgMS4wICAtMCAgICAgLT4gIDEuMAorCitkcWFkZDc3NjEgYWRkICAwICAgIC0xLjAgICAtPiAtMS4wCitkcWFkZDc3NjIgYWRkIC0wICAgIC0xLjAgICAtPiAtMS4wCitkcWFkZDc3NjMgYWRkICAwICAgICAxLjAgICAtPiAgMS4wCitkcWFkZDc3NjQgYWRkIC0wICAgICAxLjAgICAtPiAgMS4wCitkcWFkZDc3NjUgYWRkIC0xICAgICAwLjAgICAtPiAtMS4wCitkcWFkZDc3NjYgYWRkIC0xICAgIC0wLjAgICAtPiAtMS4wCitkcWFkZDc3NjcgYWRkICAxICAgICAwLjAgICAtPiAgMS4wCitkcWFkZDc3NjggYWRkICAxICAgIC0wLjAgICAtPiAgMS4wCisKK2RxYWRkNzc3MSBhZGQgIDAuMCAgLTEuMCAgIC0+IC0xLjAKK2RxYWRkNzc3MiBhZGQgLTAuMCAgLTEuMCAgIC0+IC0xLjAKK2RxYWRkNzc3MyBhZGQgIDAuMCAgIDEuMCAgIC0+ICAxLjAKK2RxYWRkNzc3NCBhZGQgLTAuMCAgIDEuMCAgIC0+ICAxLjAKK2RxYWRkNzc3NSBhZGQgLTEuMCAgIDAuMCAgIC0+IC0xLjAKK2RxYWRkNzc3NiBhZGQgLTEuMCAgLTAuMCAgIC0+IC0xLjAKK2RxYWRkNzc3NyBhZGQgIDEuMCAgIDAuMCAgIC0+ICAxLjAKK2RxYWRkNzc3OCBhZGQgIDEuMCAgLTAuMCAgIC0+ICAxLjAKKworLS0gU3BlY2lhbHMKK2RxYWRkNzc4MCBhZGQgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFhZGQ3NzgxIGFkZCAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkcWFkZDc3ODIgYWRkIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2RxYWRkNzc4MyBhZGQgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorZHFhZGQ3Nzg0IGFkZCAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitkcWFkZDc3ODUgYWRkIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RxYWRkNzc4NiBhZGQgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorZHFhZGQ3Nzg3IGFkZCAtMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitkcWFkZDc3ODggYWRkIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxYWRkNzc4OSBhZGQgLTEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFhZGQ3NzkwIGFkZCAtMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitkcWFkZDc3OTEgYWRkICAwICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxYWRkNzc5MiBhZGQgIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFhZGQ3NzkzIGFkZCAgMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitkcWFkZDc3OTQgYWRkICBJbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCitkcWFkZDc4MDAgYWRkICBJbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODAxIGFkZCAgSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitkcWFkZDc4MDIgYWRkICBJbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RxYWRkNzgwMyBhZGQgIEluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorZHFhZGQ3ODA0IGFkZCAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitkcWFkZDc4MDUgYWRkICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2RxYWRkNzgwNiBhZGQgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorZHFhZGQ3ODA3IGFkZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkcWFkZDc4MDggYWRkIC0xMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RxYWRkNzgwOSBhZGQgLUluZiAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4MTAgYWRkIC0xICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxYWRkNzgxMSBhZGQgLTAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFhZGQ3ODEyIGFkZCAgMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcWFkZDc4MTMgYWRkICAxICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxYWRkNzgxNCBhZGQgIDEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFhZGQ3ODE1IGFkZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RxYWRkNzgyMSBhZGQgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2RxYWRkNzgyMiBhZGQgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RxYWRkNzgyMyBhZGQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2RxYWRkNzgyNCBhZGQgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2RxYWRkNzgyNSBhZGQgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2RxYWRkNzgyNiBhZGQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2RxYWRkNzgyNyBhZGQgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2RxYWRkNzgyOCBhZGQgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RxYWRkNzgyOSBhZGQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RxYWRkNzgzMCBhZGQgLUluZiAgTmFOICAgIC0+ICBOYU4KK2RxYWRkNzgzMSBhZGQgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RxYWRkNzgzMiBhZGQgLTEgICAgTmFOICAgIC0+ICBOYU4KK2RxYWRkNzgzMyBhZGQgLTAgICAgTmFOICAgIC0+ICBOYU4KK2RxYWRkNzgzNCBhZGQgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RxYWRkNzgzNSBhZGQgIDEgICAgTmFOICAgIC0+ICBOYU4KK2RxYWRkNzgzNiBhZGQgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2RxYWRkNzgzNyBhZGQgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZHFhZGQ3ODQxIGFkZCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg0MiBhZGQgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NDMgYWRkICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODQ0IGFkZCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg0NSBhZGQgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NDYgYWRkICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODQ3IGFkZCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg0OCBhZGQgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NDkgYWRkICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODUwIGFkZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg1MSBhZGQgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NTIgYWRkIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODUzIGFkZCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg1NCBhZGQgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NTUgYWRkICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODU2IGFkZCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg1NyBhZGQgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NTggYWRkICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODU5IGFkZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHFhZGQ3ODYxIGFkZCAgTmFOMSAgIC1JbmYgICAgLT4gIE5hTjEKK2RxYWRkNzg2MiBhZGQgK05hTjIgICAtMTAwMCAgIC0+ICBOYU4yCitkcWFkZDc4NjMgYWRkICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworZHFhZGQ3ODY0IGFkZCAgTmFONCAgICBJbmYgICAgLT4gIE5hTjQKK2RxYWRkNzg2NSBhZGQgIE5hTjUgICArTmFONiAgIC0+ICBOYU41CitkcWFkZDc4NjYgYWRkIC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworZHFhZGQ3ODY3IGFkZCAtMTAwMCAgICBOYU44ICAgLT4gIE5hTjgKK2RxYWRkNzg2OCBhZGQgIDEwMDAgICAgTmFOOSAgIC0+ICBOYU45CitkcWFkZDc4NjkgYWRkICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK2RxYWRkNzg3MSBhZGQgIHNOYU4xMSAgLUluZiAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg3MiBhZGQgIHNOYU4xMiAgLTEwMDAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg3MyBhZGQgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg3NCBhZGQgIHNOYU4xNCAgIE5hTjE3IC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg3NSBhZGQgIHNOYU4xNSAgc05hTjE4IC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg3NiBhZGQgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg3NyBhZGQgLUluZiAgICArc05hTjIwIC0+ICBOYU4yMCAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg3OCBhZGQgLTEwMDAgICAgc05hTjIxIC0+ICBOYU4yMSAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg3OSBhZGQgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg4MCBhZGQgIEluZiAgICAgc05hTjIzIC0+ICBOYU4yMyAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg4MSBhZGQgK05hTjI1ICArc05hTjI0IC0+ICBOYU4yNCAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg4MiBhZGQgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorZHFhZGQ3ODgzIGFkZCAtc05hTjI3ICBzTmFOMjkgLT4gLU5hTjI3ICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODg0IGFkZCAgMTAwMCAgICAtTmFOMzAgLT4gLU5hTjMwCitkcWFkZDc4ODUgYWRkICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEhlcmUgd2UgZXhwbG9yZSBuZWFyIHRoZSBib3VuZGFyeSBvZiByb3VuZGluZyBhIHN1Ym5vcm1hbCB0byBObWluCitkcWFkZDc1NzUgYWRkICAxRS02MTQzIC0xRS02MTc2IC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0IFN1Ym5vcm1hbAorZHFhZGQ3NTc2IGFkZCAtMUUtNjE0MyArMUUtNjE3NiAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NCBTdWJub3JtYWwKKworLS0gY2hlY2sgb3ZlcmZsb3cgZWRnZSBjYXNlCistLSAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RxYWRkNzk3MiBhcHBseSAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxYWRkNzk3MyBhZGQgICAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAxICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc5NzQgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAgMSAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTc1IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDFFKzYxMTEgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTc2IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDlFKzYxMTAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTc3IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDhFKzYxMTAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTc4IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDdFKzYxMTAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTc5IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDZFKzYxMTAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTgwIGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDVFKzYxMTAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTgxIGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDRFKzYxMTAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTgyIGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDNFKzYxMTAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTgzIGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDJFKzYxMTAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTg0IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDFFKzYxMTAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorCitkcWFkZDc5ODUgYXBwbHkgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFhZGQ3OTg2IGFkZCAgICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTEgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc5ODcgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtMSAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk4OCBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC0xRSs2MTExICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc5ODkgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtOUUrNjExMCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTkwIGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgLThFKzYxMTAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk5MSBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC03RSs2MTEwICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc5OTIgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtNkUrNjExMCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTkzIGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgLTVFKzYxMTAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk5NCBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC00RSs2MTEwICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc5OTUgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtM0UrNjExMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTk2IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgLTJFKzYxMTAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk5NyBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC0xRSs2MTEwICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCisKKy0tIEFuZCBmb3Igcm91bmQgZG93biBmdWxsIGFuZCBzdWJub3JtYWwgcmVzdWx0cworcm91bmRpbmc6ICAgICBkb3duCitkcWFkZDcxMTAwIGFkZCAxZSsyIC0xZS02MTQzICAgIC0+IDk5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorZHFhZGQ3MTEwMSBhZGQgMWUrMSAtMWUtNjE0MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTAzIGFkZCAgICsxIC0xZS02MTQzICAgIC0+IDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTA0IGFkZCAxZS0xIC0xZS02MTQzICAgIC0+IDAuMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQ3MTEwNSBhZGQgMWUtMiAtMWUtNjE0MyAgICAtPiAwLjAwOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTA2IGFkZCAxZS0zIC0xZS02MTQzICAgIC0+IDAuMDAwOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTA3IGFkZCAxZS00IC0xZS02MTQzICAgIC0+IDAuMDAwMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQ3MTEwOCBhZGQgMWUtNSAtMWUtNjE0MyAgICAtPiAwLjAwMDAwOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTA5IGFkZCAxZS02IC0xZS02MTQzICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS03ICBSb3VuZGVkIEluZXhhY3QKKworcm91bmRpbmc6ICAgICBjZWlsaW5nCitkcWFkZDcxMTEwIGFkZCAtMWUrMiArMWUtNjE0MyAgIC0+IC05OS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBSb3VuZGVkIEluZXhhY3QKK2RxYWRkNzExMTEgYWRkIC0xZSsxICsxZS02MTQzICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RxYWRkNzExMTMgYWRkICAgIC0xICsxZS02MTQzICAgLT4gLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTE0IGFkZCAtMWUtMSArMWUtNjE0MyAgIC0+IC0wLjA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RxYWRkNzExMTUgYWRkIC0xZS0yICsxZS02MTQzICAgLT4gLTAuMDA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RxYWRkNzExMTYgYWRkIC0xZS0zICsxZS02MTQzICAgLT4gLTAuMDAwOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTE3IGFkZCAtMWUtNCArMWUtNjE0MyAgIC0+IC0wLjAwMDA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RxYWRkNzExMTggYWRkIC0xZS01ICsxZS02MTQzICAgLT4gLTAuMDAwMDA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RxYWRkNzExMTkgYWRkIC0xZS02ICsxZS02MTQzICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS03ICBSb3VuZGVkIEluZXhhY3QKKworLS0gdGVzdHMgYmFzZWQgb24gR3VubmFyIERlZ25ib2wncyBlZGdlIGNhc2UKK3JvdW5kaW5nOiAgICAgaGFsZl9ldmVuCisKK2RxYWRkNzEzMDAgYWRkIDFFMzQgIC0wLjUgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzEwIGFkZCAxRTM0ICAtMC41MSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMxMSBhZGQgMUUzNCAgLTAuNTAxICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMTIgYWRkIDFFMzQgIC0wLjUwMDEgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzEzIGFkZCAxRTM0ICAtMC41MDAwMSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMxNCBhZGQgMUUzNCAgLTAuNTAwMDAxICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMTUgYWRkIDFFMzQgIC0wLjUwMDAwMDEgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzE2IGFkZCAxRTM0ICAtMC41MDAwMDAwMSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMxNyBhZGQgMUUzNCAgLTAuNTAwMDAwMDAxICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMTggYWRkIDFFMzQgIC0wLjUwMDAwMDAwMDEgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzE5IGFkZCAxRTM0ICAtMC41MDAwMDAwMDAwMSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMyMCBhZGQgMUUzNCAgLTAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMjEgYWRkIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDEgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzIyIGFkZCAxRTM0ICAtMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMyMyBhZGQgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMjQgYWRkIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzI1IGFkZCAxRTM0ICAtMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMyNiBhZGQgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMDAwICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMjcgYWRkIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzI4IGFkZCAxRTM0ICAtMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMyOSBhZGQgMUUzNCAgLTAuNTAwMDAwMDAwMDAwICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMzAgYWRkIDFFMzQgIC0wLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzMxIGFkZCAxRTM0ICAtMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMzMiBhZGQgMUUzNCAgLTAuNTAwMDAwMDAwICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMzMgYWRkIDFFMzQgIC0wLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzM0IGFkZCAxRTM0ICAtMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMzNSBhZGQgMUUzNCAgLTAuNTAwMDAwICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMzYgYWRkIDFFMzQgIC0wLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzM3IGFkZCAxRTM0ICAtMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMzOCBhZGQgMUUzNCAgLTAuNTAwICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMzkgYWRkIDFFMzQgIC0wLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkNzEzNDAgYWRkIDFFMzQgIC01MDAwMDAwLjAwMDAxMDAwMSAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzQxIGFkZCAxRTM0ICAtNTAwMDAwMC4wMDAwMDAwMDEgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTAwMDAwMCAgICAgIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDcxMzQ5IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNCAgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNTAgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM1MSBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OSAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzUyIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNTMgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM1NCBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OSAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzU1IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNTYgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM1NyBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OSAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzU4IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNTkgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM2MCBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OSAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzYxIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNjIgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM2MyBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTk5OSAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzY0IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5OSAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNjUgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM2NyBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMCAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzY4IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNjkgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM3MCBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzcxIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNzIgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM3MyBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMCAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzc0IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNzUgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM3NiBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMCAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzc3IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNzggYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM3OSBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMCAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzgwIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzODEgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM4MiBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzgzIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzODQgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM4NSBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDEgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzg2IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzODcgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMSAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM4OCBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDEgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzg5IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAxICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzOTAgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMSAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM5MSBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDEgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzkyIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAxICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzOTMgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMSAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM5NCBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDEgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzk1IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAxICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzOTYgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MSAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorCistLSBNb3JlIEdEIGVkZ2UgY2FzZXMsIHdoZXJlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdW5hZGp1c3RlZAorLS0gZXhwb25lbnRzIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHByZWNpc2lvbiBhbmQgb25lIHNpZGUgaXMgMAorZHFhZGQ3MTQyMCBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgICAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNDIxIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMSAgLT4gMC4xMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNDIyIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMiAgLT4gMC4wMTEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTQyMyBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMgIC0+IDAuMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNDI0IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtNCAgLT4gMC4wMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNDI1IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtNSAgLT4gMC4wMDAwMTEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTQyNiBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTYgIC0+IDAuMDAwMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNDI3IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtNyAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTcKK2RxYWRkNzE0MjggYWRkICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS04ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtOAorZHFhZGQ3MTQyOSBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTkgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS05CitkcWFkZDcxNDMwIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEwCitkcWFkZDcxNDMxIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTEgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTExCitkcWFkZDcxNDMyIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTIgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEyCitkcWFkZDcxNDMzIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTMgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEzCitkcWFkZDcxNDM0IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTQgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE0CitkcWFkZDcxNDM1IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTUgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE1CitkcWFkZDcxNDM2IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTYgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE2CitkcWFkZDcxNDM3IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTcgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE3CitkcWFkZDcxNDM4IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTggLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE4CitkcWFkZDcxNDM5IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTkgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE5CitkcWFkZDcxNDQwIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIwCitkcWFkZDcxNDQxIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjEgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIxCitkcWFkZDcxNDQyIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjIgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIyCitkcWFkZDcxNDQzIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjMgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIzCitkcWFkZDcxNDQ0IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjQgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI0CitkcWFkZDcxNDQ1IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjUgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI1CitkcWFkZDcxNDQ2IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjYgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI2CitkcWFkZDcxNDQ3IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjcgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI3CitkcWFkZDcxNDQ4IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjggLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI4CitkcWFkZDcxNDQ5IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjkgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI5CitkcWFkZDcxNDUwIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMwCitkcWFkZDcxNDUxIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzEgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMxCitkcWFkZDcxNDUyIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzIgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMyCitkcWFkZDcxNDUzIGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzMgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMzCitkcWFkZDcxNDU0IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzQgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM0CitkcWFkZDcxNDU1IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzUgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM1CitkcWFkZDcxNDU2IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzYgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM2CisKKy0tIHNhbWUsIHJldmVyc2VkIDAKK2RxYWRkNzE0NjAgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAgICAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNDYxIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMSAgMCAtPiAwLjExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkNzE0NjIgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yICAwIC0+IDAuMDExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkNzE0NjMgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zICAwIC0+IDAuMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNDY0IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtNCAgMCAtPiAwLjAwMDExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkNzE0NjUgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS01ICAwIC0+IDAuMDAwMDExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkNzE0NjYgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS02ICAwIC0+IDAuMDAwMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNDY3IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtNyAgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtNworZHFhZGQ3MTQ2OCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTggIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTgKK2RxYWRkNzE0NjkgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS05ICAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS05CitkcWFkZDcxNDcwIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTAgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTAKK2RxYWRkNzE0NzEgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMSAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMQorZHFhZGQ3MTQ3MiBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEyIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEyCitkcWFkZDcxNDczIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTMgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTMKK2RxYWRkNzE0NzQgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNCAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNAorZHFhZGQ3MTQ3NSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE1IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE1CitkcWFkZDcxNDc2IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTYgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTYKK2RxYWRkNzE0NzcgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNyAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNworZHFhZGQ3MTQ3OCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE4IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE4CitkcWFkZDcxNDc5IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTkgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTkKK2RxYWRkNzE0ODAgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMCAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMAorZHFhZGQ3MTQ4MSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIxIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIxCitkcWFkZDcxNDgyIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjIgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjIKK2RxYWRkNzE0ODMgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMyAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMworZHFhZGQ3MTQ4NCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI0IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI0CitkcWFkZDcxNDg1IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjUgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjUKK2RxYWRkNzE0ODYgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNiAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNgorZHFhZGQ3MTQ4NyBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI3IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI3CitkcWFkZDcxNDg4IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjggMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjgKK2RxYWRkNzE0ODkgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yOSAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yOQorZHFhZGQ3MTQ5MCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMwIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMwCitkcWFkZDcxNDkxIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzEgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzEKK2RxYWRkNzE0OTIgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMiAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMgorZHFhZGQ3MTQ5MyBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMzIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMzCitkcWFkZDcxNDk0IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzQgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzQKK2RxYWRkNzE0OTUgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNSAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNQorZHFhZGQ3MTQ5NiBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM2IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM2CisKKy0tIHNhbWUsIEVzIG9uIHRoZSAwCitkcWFkZDcxNTAwIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMCAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTAxIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMSAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTAyIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMiAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTAzIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMyAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTA0IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtNCAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTA1IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtNSAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTA2IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtNiAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTA3IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtNyAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTA4IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtOCAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTA5IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtOSAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTEwIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTExIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTEgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTEyIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTIgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTEzIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTMgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTE0IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTQgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTE1IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTUgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTE2IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTYgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTE3IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTcgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTE4IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTggIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTE5IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTkgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTIwIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTIxIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjEgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTIyIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjIgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTIzIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjMgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTI0IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjQgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTI1IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjUgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTI2IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjYgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTI3IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjcgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTI4IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjggIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTI5IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjkgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTMwIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMzAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTMxIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMzEgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTMyIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMzIgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNTMzIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMzMgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CistLSBuZXh0IGZvdXIgZmxhZyBSb3VuZGVkIGJlY2F1c2UgdGhlIDAgZXh0ZW5kcyB0aGUgcmVzdWx0CitkcWFkZDcxNTM0IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMzQgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKK2RxYWRkNzE1MzUgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0zNSAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZHFhZGQ3MTUzNiBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTM2ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitkcWFkZDcxNTM3IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMzcgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKKworLS0gc3VtIG9mIHR3byBvcHBvc2l0ZS1zaWduIG9wZXJhbmRzIGlzIGV4YWN0bHkgMCBhbmQgZmxvb3IgPT4gLTAKK3JvdW5kaW5nOiAgICBoYWxmX3VwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDcxNjAwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTYwMSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkNzE2MDIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNjAzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RxYWRkNzE2MTEgYWRkIC0xMSAgICAgIDExICAgIC0+ICAwCitkcWFkZDcxNjEyIGFkZCAgMTEgICAgIC0xMSAgICAtPiAgMAorCityb3VuZGluZzogICAgaGFsZl9kb3duCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDcxNjIwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTYyMSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkNzE2MjIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNjIzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RxYWRkNzE2MzEgYWRkIC0xMSAgICAgIDExICAgIC0+ICAwCitkcWFkZDcxNjMyIGFkZCAgMTEgICAgIC0xMSAgICAtPiAgMAorCityb3VuZGluZzogICAgaGFsZl9ldmVuCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDcxNjQwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTY0MSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkNzE2NDIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNjQzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RxYWRkNzE2NTEgYWRkIC0xMSAgICAgIDExICAgIC0+ICAwCitkcWFkZDcxNjUyIGFkZCAgMTEgICAgIC0xMSAgICAtPiAgMAorCityb3VuZGluZzogICAgdXAKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RxYWRkNzE2NjAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNjYxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTY2MiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkNzE2NjMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZHFhZGQ3MTY3MSBhZGQgLTExICAgICAgMTEgICAgLT4gIDAKK2RxYWRkNzE2NzIgYWRkICAxMSAgICAgLTExICAgIC0+ICAwCisKK3JvdW5kaW5nOiAgICBkb3duCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDcxNjgwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTY4MSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkNzE2ODIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNjgzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RxYWRkNzE2OTEgYWRkIC0xMSAgICAgIDExICAgIC0+ICAwCitkcWFkZDcxNjkyIGFkZCAgMTEgICAgIC0xMSAgICAtPiAgMAorCityb3VuZGluZzogICAgY2VpbGluZworLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZHFhZGQ3MTcwMCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkNzE3MDEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNzAyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTcwMyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkcWFkZDcxNzExIGFkZCAtMTEgICAgICAxMSAgICAtPiAgMAorZHFhZGQ3MTcxMiBhZGQgIDExICAgICAtMTEgICAgLT4gIDAKKworLS0gYW5kIHRoZSBleHRyYS1zcGVjaWFsIHVnbHkgY2FzZTsgdW51c3VhbCBtaW51c2VzIG1hcmtlZCBieSAtLSAqCityb3VuZGluZzogICAgZmxvb3IKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RxYWRkNzE3MjAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNzIxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+IC0wRS0xOSAgICAgICAgICAgLS0gKgorZHFhZGQ3MTcyMiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkgICAgICAgICAgIC0tICoKK2RxYWRkNzE3MjMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZHFhZGQ3MTczMSBhZGQgLTExICAgICAgMTEgICAgLT4gIC0wICAgICAgICAgICAgICAgIC0tICoKK2RxYWRkNzE3MzIgYWRkICAxMSAgICAgLTExICAgIC0+ICAtMCAgICAgICAgICAgICAgICAtLSAqCisKKy0tIEV4YW1wbGVzIGZyb20gU1FMIHByb3Bvc2FsIChLcmlzaG5hIEt1bGthcm5pKQorZHFhZGQ3MTc0MSBhZGQgMTMwRS0yICAgIDEyMEUtMiAgICAtPiAyLjUwCitkcWFkZDcxNzQyIGFkZCAxMzBFLTIgICAgMTJFLTEgICAgIC0+IDIuNTAKK2RxYWRkNzE3NDMgYWRkIDEzMEUtMiAgICAxRTAgICAgICAgLT4gMi4zMAorZHFhZGQ3MTc0NCBhZGQgMUUyICAgICAgIDFFNCAgICAgICAtPiAxLjAxRSs0CitkcWFkZDcxNzQ1IGFkZCAxMzBFLTIgICAtMTIwRS0yIC0+IDAuMTAKK2RxYWRkNzE3NDYgYWRkIDEzMEUtMiAgIC0xMkUtMSAgLT4gMC4xMAorZHFhZGQ3MTc0NyBhZGQgMTMwRS0yICAgLTFFMCAgICAtPiAwLjMwCitkcWFkZDcxNzQ4IGFkZCAxRTIgICAgICAtMUU0ICAgIC0+IC05LjlFKzMKKworLS0gR2FwcHkgY29lZmZpY2llbnRzOyBjaGVjayByZXNpZHVlIGhhbmRsaW5nIGV2ZW4gd2l0aCBmdWxsIGNvZWZmaWNpZW50IGdhcAorcm91bmRpbmc6IGhhbGZfZXZlbgorCitkcWFkZDc1MDAxIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU3CitkcWFkZDc1MDAyIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDAuNiAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU3ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMDMgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgMC4wNiAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTAwNCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0zICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDA1IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTQgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMDYgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtNSAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTAwNyBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS02ICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDA4IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTcgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMDkgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtOCAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTAxMCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS05ICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDExIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTEwICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMTIgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTEgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTAxMyBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xMiAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDE0IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTEzICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMTUgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTQgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTAxNiBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xNSAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDE3IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTE2ICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMTggYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTcgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTAxOSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xOCAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDIwIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTE5ICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMjEgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMjAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorCistLSB3aWRlbmluZyBzZWNvbmQgYXJndW1lbnQgYXQgZ2FwCitkcWFkZDc1MDMwIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxICAgICAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OQorZHFhZGQ3NTAzMSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xICAgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMQorZHFhZGQ3NTAzMiBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMiAgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIKK2RxYWRkNzUwMzMgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMworZHFhZGQ3NTAzNCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0ICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNAorZHFhZGQ3NTAzNSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NSAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDUKK2RxYWRkNzUwMzYgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2ICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1NgorZHFhZGQ3NTAzNyBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NworZHFhZGQ3NTAzOCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3OCAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzgKK2RxYWRkNzUwMzkgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg5ICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA0MCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDQxIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NTAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNDIgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1MSAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA0MyBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUwMSAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDQ0IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NTAwMSAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNDUgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1MDAwMSAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA0NiBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUwMDAwMSAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDQ3IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NTAwMDAwMSAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNDggYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA0OSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUwMDAwMDAwICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzggSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDEyMzQ1Ngorcm91bmRpbmc6IGhhbGZfZXZlbgorZHFhZGQ3NTA1MCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMjM0NTY3NzUwMDAwMDAwICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDIzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDUxIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMzQ1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNTIgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwNDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDQ1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA1MyBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwNTY3NzUwMDAwMDAwICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDU0IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDAwNjc3NTAwMDAwMDAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNTUgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDAwNzc1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA1NiBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwMDAwNzUwMDAwMDAwICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDU3IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDAwMDAwNTAwMDAwMDAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNjAgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDIzNDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA2MSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDM0NTY3NzUwMDAwMDAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDYyIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDQ1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDA0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNjMgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDA1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA2NCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwMDY3NzUwMDAwMDAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDA2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDY1IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDAwMDc3NTAwMDAwMDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDA3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNjYgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDAwMDc1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA2NyBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwMDAwMDUwMDAwMDAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCistLSBmYXItb3V0IHJlc2lkdWVzIChmdWxsIGNvZWZmaWNpZW50IGdhcCBpcyAxNisxNSBkaWdpdHMpCityb3VuZGluZzogdXAKK2RxYWRkNzUwNzAgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTggICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxCitkcWFkZDc1MDcxIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS05ICAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNzIgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTEwICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA3MyBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMTEgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDc0IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xMiAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNzUgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTEzICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA3NiBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMTQgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDc3IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xNSAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNzggYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTE2ICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA3OSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMTcgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDgwIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xOCAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwODEgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTE5ICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA4MiBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMjAgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDgzIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0yNSAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwODQgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTMwICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA4NSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMzEgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDg2IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0zMiAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwODcgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTMzICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA4OCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMzQgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDg5IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0zNSAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKKworLS0gTnVsbCB0ZXN0cworZHFhZGQ5OTkwIGFkZCAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkOTk5MSBhZGQgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQW5kLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQW5kLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwOWJjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFBbmQuZGVjVGVzdApAQCAtMCwwICsxLDQyMCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcUFuZC5kZWNUZXN0IC0tIGRpZ2l0d2lzZSBsb2dpY2FsIEFORCBmb3IgZGVjUXVhZHMgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjayAodHJ1dGggdGFibGUpCitkcWFuZDAwMSBhbmQgICAgICAgICAgICAgMCAgICAwIC0+ICAgIDAKK2RxYW5kMDAyIGFuZCAgICAgICAgICAgICAwICAgIDEgLT4gICAgMAorZHFhbmQwMDMgYW5kICAgICAgICAgICAgIDEgICAgMCAtPiAgICAwCitkcWFuZDAwNCBhbmQgICAgICAgICAgICAgMSAgICAxIC0+ICAgIDEKK2RxYW5kMDA1IGFuZCAgICAgICAgICAxMTAwIDEwMTAgLT4gMTAwMAorLS0gYW5kIGF0IG1zZCBhbmQgbXNkLTEKKy0tICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CitkcWFuZDAwNiBhbmQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAgICAgICAgMAorZHFhbmQwMDcgYW5kIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgICAgICAgIDAKK2RxYW5kMDA4IGFuZCAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgICAgICAgICAwCitkcWFuZDAwOSBhbmQgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFhbmQwMTAgYW5kIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgICAgICAgIDAKK2RxYW5kMDExIGFuZCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgICAgICAgICAwCitkcWFuZDAxMiBhbmQgMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAgICAgICAgMAorZHFhbmQwMTMgYW5kIDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworLS0gVmFyaW91cyBsZW5ndGhzCistLSAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorCitkcWFuZDYwMSBhbmQgMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYwMiBhbmQgMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYwMyBhbmQgMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYwNCBhbmQgMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYwNSBhbmQgMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYwNiBhbmQgMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYwNyBhbmQgMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYwOCBhbmQgMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYwOSBhbmQgMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYxMCBhbmQgMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYxMSBhbmQgMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYxMiBhbmQgMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYxMyBhbmQgMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDYxNCBhbmQgMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExCitkcWFuZDYxNSBhbmQgMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExCitkcWFuZDYxNiBhbmQgMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExCitkcWFuZDYxNyBhbmQgMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExCitkcWFuZDYxOCBhbmQgMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExCitkcWFuZDYxOSBhbmQgMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExCitkcWFuZDYyMCBhbmQgMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExCitkcWFuZDYyMSBhbmQgMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExCitkcWFuZDYyMiBhbmQgMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExCitkcWFuZDYyMyBhbmQgMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExCitkcWFuZDYyNCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExCitkcWFuZDYyNSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExCitkcWFuZDYyNiBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExCitkcWFuZDYyNyBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExCitkcWFuZDYyOCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExCitkcWFuZDYyOSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExCitkcWFuZDYzMCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExCitkcWFuZDYzMSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExCitkcWFuZDYzMiBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExCitkcWFuZDYzMyBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxCitkcWFuZDYzNCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwCisKK2RxYW5kNjQxIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+ICAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjQyIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjQzIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjQ0IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjQ1IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjQ2IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjQ3IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjQ4IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjQ5IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjUwIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjUxIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjUyIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjUzIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjU0IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjU1IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTEKK2RxYW5kNjU2IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTEKK2RxYW5kNjU3IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTEKK2RxYW5kNjU4IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTEKK2RxYW5kNjU5IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTEKK2RxYW5kNjYwIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTEKK2RxYW5kNjYxIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTEKK2RxYW5kNjYyIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTEKK2RxYW5kNjYzIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTEKK2RxYW5kNjY0IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTEKK2RxYW5kNjY1IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTEKK2RxYW5kNjY2IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTEKK2RxYW5kNjY3IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTEKK2RxYW5kNjY4IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTEKK2RxYW5kNjY5IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTEKK2RxYW5kNjcwIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTEKK2RxYW5kNjcxIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTEKK2RxYW5kNjcyIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTEKK2RxYW5kNjczIGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDEKK2RxYW5kNjc0IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAKK2RxYW5kNjc1IGFuZCAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgIC0+ICAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAKK2RxYW5kNjc2IGFuZCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAKKworZHFhbmQwMjEgYW5kIDExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMSAgLT4gIDExMTExMTExMTExMTExMTEKK2RxYW5kMDI0IGFuZCAxMTExMTExMTExMTExMTExICAxMTExMTExMTExMTExMTEgIC0+ICAgMTExMTExMTExMTExMTExCitkcWFuZDAyNSBhbmQgMTExMTExMTExMTExMTExMSAgIDExMTExMTExMTExMTExICAtPiAgICAxMTExMTExMTExMTExMQorZHFhbmQwMjYgYW5kIDExMTExMTExMTExMTExMTEgICAgMTExMTExMTExMTExMSAgLT4gICAgIDExMTExMTExMTExMTEKK2RxYW5kMDI3IGFuZCAxMTExMTExMTExMTExMTExICAgICAxMTExMTExMTExMTEgIC0+ICAgICAgMTExMTExMTExMTExCitkcWFuZDAyOCBhbmQgMTExMTExMTExMTExMTExMSAgICAgIDExMTExMTExMTExICAtPiAgICAgICAxMTExMTExMTExMQorZHFhbmQwMjkgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgMTExMTExMTExMSAgLT4gICAgICAgIDExMTExMTExMTEKK2RxYW5kMDMwIGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAxMTExMTExMTEgIC0+ICAgICAgICAgMTExMTExMTExCitkcWFuZDAzMSBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgIDExMTExMTExICAtPiAgICAgICAgICAxMTExMTExMQorZHFhbmQwMzIgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgICAgMTExMTExMSAgLT4gICAgICAgICAgIDExMTExMTEKK2RxYW5kMDMzIGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAgICAxMTExMTEgIC0+ICAgICAgICAgICAgMTExMTExCitkcWFuZDAzNCBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgICAgIDExMTExICAtPiAgICAgICAgICAgICAxMTExMQorZHFhbmQwMzUgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgICAgICAgMTExMSAgLT4gICAgICAgICAgICAgIDExMTEKK2RxYW5kMDM2IGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAgICAgICAxMTEgIC0+ICAgICAgICAgICAgICAgMTExCitkcWFuZDAzNyBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgICAgICAgIDExICAtPiAgICAgICAgICAgICAgICAxMQorZHFhbmQwMzggYW5kIDExMTExMTExMTExMTExMTEgICAgICAgICAgICAgICAgMSAgLT4gICAgICAgICAgICAgICAgIDEKK2RxYW5kMDM5IGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAgICAgICAgIDAgIC0+ICAgICAgICAgICAgICAgICAwCisKK2RxYW5kMDQwIGFuZCAxMTExMTExMTExMTExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gIDExMTExMTExMTExMTExMTEKK2RxYW5kMDQxIGFuZCAgMTExMTExMTExMTExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAxMTExMTExMTExMTExMTEKK2RxYW5kMDQyIGFuZCAgMTExMTExMTExMTExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAxMTExMTExMTExMTExMTEKK2RxYW5kMDQzIGFuZCAgIDExMTExMTExMTExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgMTExMTExMTExMTExMTEKK2RxYW5kMDQ0IGFuZCAgICAxMTExMTExMTExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgIDExMTExMTExMTExMTEKK2RxYW5kMDQ1IGFuZCAgICAgMTExMTExMTExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAxMTExMTExMTExMTEKK2RxYW5kMDQ2IGFuZCAgICAgIDExMTExMTExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAgMTExMTExMTExMTEKK2RxYW5kMDQ3IGFuZCAgICAgICAxMTExMTExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAgIDExMTExMTExMTEKK2RxYW5kMDQ4IGFuZCAgICAgICAgMTExMTExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAgICAxMTExMTExMTEKK2RxYW5kMDQ5IGFuZCAgICAgICAgIDExMTExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAgICAgMTExMTExMTEKK2RxYW5kMDUwIGFuZCAgICAgICAgICAxMTExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAgICAgIDExMTExMTEKK2RxYW5kMDUxIGFuZCAgICAgICAgICAgMTExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAgICAgICAxMTExMTEKK2RxYW5kMDUyIGFuZCAgICAgICAgICAgIDExMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAgICAgICAgMTExMTEKK2RxYW5kMDUzIGFuZCAgICAgICAgICAgICAxMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAgICAgICAgIDExMTEKK2RxYW5kMDU0IGFuZCAgICAgICAgICAgICAgMTExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAgICAgICAgICAxMTEKK2RxYW5kMDU1IGFuZCAgICAgICAgICAgICAgIDExICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAgICAgICAgICAgMTEKK2RxYW5kMDU2IGFuZCAgICAgICAgICAgICAgICAxICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAgICAgICAgICAgIDEKK2RxYW5kMDU3IGFuZCAgICAgICAgICAgICAgICAwICAgIDExMTExMTExMTExMTExMTEgLT4gICAgICAgICAgICAgICAgIDAKKworZHFhbmQxNTAgYW5kIDExMTExMTExMTEgIDEgIC0+ICAxCitkcWFuZDE1MSBhbmQgIDExMTExMTExMSAgMSAgLT4gIDEKK2RxYW5kMTUyIGFuZCAgIDExMTExMTExICAxICAtPiAgMQorZHFhbmQxNTMgYW5kICAgIDExMTExMTEgIDEgIC0+ICAxCitkcWFuZDE1NCBhbmQgICAgIDExMTExMSAgMSAgLT4gIDEKK2RxYW5kMTU1IGFuZCAgICAgIDExMTExICAxICAtPiAgMQorZHFhbmQxNTYgYW5kICAgICAgIDExMTEgIDEgIC0+ICAxCitkcWFuZDE1NyBhbmQgICAgICAgIDExMSAgMSAgLT4gIDEKK2RxYW5kMTU4IGFuZCAgICAgICAgIDExICAxICAtPiAgMQorZHFhbmQxNTkgYW5kICAgICAgICAgIDEgIDEgIC0+ICAxCisKK2RxYW5kMTYwIGFuZCAxMTExMTExMTExICAwICAtPiAgMAorZHFhbmQxNjEgYW5kICAxMTExMTExMTEgIDAgIC0+ICAwCitkcWFuZDE2MiBhbmQgICAxMTExMTExMSAgMCAgLT4gIDAKK2RxYW5kMTYzIGFuZCAgICAxMTExMTExICAwICAtPiAgMAorZHFhbmQxNjQgYW5kICAgICAxMTExMTEgIDAgIC0+ICAwCitkcWFuZDE2NSBhbmQgICAgICAxMTExMSAgMCAgLT4gIDAKK2RxYW5kMTY2IGFuZCAgICAgICAxMTExICAwICAtPiAgMAorZHFhbmQxNjcgYW5kICAgICAgICAxMTEgIDAgIC0+ICAwCitkcWFuZDE2OCBhbmQgICAgICAgICAxMSAgMCAgLT4gIDAKK2RxYW5kMTY5IGFuZCAgICAgICAgICAxICAwICAtPiAgMAorCitkcWFuZDE3MCBhbmQgMSAgMTExMTExMTExMSAgLT4gIDEKK2RxYW5kMTcxIGFuZCAxICAgMTExMTExMTExICAtPiAgMQorZHFhbmQxNzIgYW5kIDEgICAgMTExMTExMTEgIC0+ICAxCitkcWFuZDE3MyBhbmQgMSAgICAgMTExMTExMSAgLT4gIDEKK2RxYW5kMTc0IGFuZCAxICAgICAgMTExMTExICAtPiAgMQorZHFhbmQxNzUgYW5kIDEgICAgICAgMTExMTEgIC0+ICAxCitkcWFuZDE3NiBhbmQgMSAgICAgICAgMTExMSAgLT4gIDEKK2RxYW5kMTc3IGFuZCAxICAgICAgICAgMTExICAtPiAgMQorZHFhbmQxNzggYW5kIDEgICAgICAgICAgMTEgIC0+ICAxCitkcWFuZDE3OSBhbmQgMSAgICAgICAgICAgMSAgLT4gIDEKKworZHFhbmQxODAgYW5kIDAgIDExMTExMTExMTEgIC0+ICAwCitkcWFuZDE4MSBhbmQgMCAgIDExMTExMTExMSAgLT4gIDAKK2RxYW5kMTgyIGFuZCAwICAgIDExMTExMTExICAtPiAgMAorZHFhbmQxODMgYW5kIDAgICAgIDExMTExMTEgIC0+ICAwCitkcWFuZDE4NCBhbmQgMCAgICAgIDExMTExMSAgLT4gIDAKK2RxYW5kMTg1IGFuZCAwICAgICAgIDExMTExICAtPiAgMAorZHFhbmQxODYgYW5kIDAgICAgICAgIDExMTEgIC0+ICAwCitkcWFuZDE4NyBhbmQgMCAgICAgICAgIDExMSAgLT4gIDAKK2RxYW5kMTg4IGFuZCAwICAgICAgICAgIDExICAtPiAgMAorZHFhbmQxODkgYW5kIDAgICAgICAgICAgIDEgIC0+ICAwCisKK2RxYW5kMDkwIGFuZCAwMTExMTExMTEgIDExMTExMTExMSAgLT4gICAxMTExMTExMQorZHFhbmQwOTEgYW5kIDEwMTExMTExMSAgMTExMTExMTExICAtPiAgMTAxMTExMTExCitkcWFuZDA5MiBhbmQgMTEwMTExMTExICAxMTExMTExMTEgIC0+ICAxMTAxMTExMTEKK2RxYW5kMDkzIGFuZCAxMTEwMTExMTEgIDExMTExMTExMSAgLT4gIDExMTAxMTExMQorZHFhbmQwOTQgYW5kIDExMTEwMTExMSAgMTExMTExMTExICAtPiAgMTExMTAxMTExCitkcWFuZDA5NSBhbmQgMTExMTEwMTExICAxMTExMTExMTEgIC0+ICAxMTExMTAxMTEKK2RxYW5kMDk2IGFuZCAxMTExMTEwMTEgIDExMTExMTExMSAgLT4gIDExMTExMTAxMQorZHFhbmQwOTcgYW5kIDExMTExMTEwMSAgMTExMTExMTExICAtPiAgMTExMTExMTAxCitkcWFuZDA5OCBhbmQgMTExMTExMTEwICAxMTExMTExMTEgIC0+ICAxMTExMTExMTAKKworZHFhbmQxMDAgYW5kIDExMTExMTExMSAgMDExMTExMTExICAtPiAgIDExMTExMTExCitkcWFuZDEwMSBhbmQgMTExMTExMTExICAxMDExMTExMTEgIC0+ICAxMDExMTExMTEKK2RxYW5kMTAyIGFuZCAxMTExMTExMTEgIDExMDExMTExMSAgLT4gIDExMDExMTExMQorZHFhbmQxMDMgYW5kIDExMTExMTExMSAgMTExMDExMTExICAtPiAgMTExMDExMTExCitkcWFuZDEwNCBhbmQgMTExMTExMTExICAxMTExMDExMTEgIC0+ICAxMTExMDExMTEKK2RxYW5kMTA1IGFuZCAxMTExMTExMTEgIDExMTExMDExMSAgLT4gIDExMTExMDExMQorZHFhbmQxMDYgYW5kIDExMTExMTExMSAgMTExMTExMDExICAtPiAgMTExMTExMDExCitkcWFuZDEwNyBhbmQgMTExMTExMTExICAxMTExMTExMDEgIC0+ICAxMTExMTExMDEKK2RxYW5kMTA4IGFuZCAxMTExMTExMTEgIDExMTExMTExMCAgLT4gIDExMTExMTExMAorCistLSBub24tMC8xIHNob3VsZCBub3QgYmUgYWNjZXB0ZWQsIG5vciBzaG91bGQgc2lnbnMKK2RxYW5kMjIwIGFuZCAxMTExMTExMTIgIDExMTExMTExMSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyMjEgYW5kIDMzMzMzMzMzMyAgMzMzMzMzMzMzICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDIyMiBhbmQgNTU1NTU1NTU1ICA1NTU1NTU1NTUgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjIzIGFuZCA3Nzc3Nzc3NzcgIDc3Nzc3Nzc3NyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyMjQgYW5kIDk5OTk5OTk5OSAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDIyNSBhbmQgMjIyMjIyMjIyICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjI2IGFuZCA0NDQ0NDQ0NDQgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyMjcgYW5kIDY2NjY2NjY2NiAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDIyOCBhbmQgODg4ODg4ODg4ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjI5IGFuZCA5OTk5OTk5OTkgIDIyMjIyMjIyMiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyMzAgYW5kIDk5OTk5OTk5OSAgNDQ0NDQ0NDQ0ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDIzMSBhbmQgOTk5OTk5OTk5ICA2NjY2NjY2NjYgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjMyIGFuZCA5OTk5OTk5OTkgIDg4ODg4ODg4OCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYSBmZXcgcmFuZG9tcworZHFhbmQyNDAgYW5kICA1Njc0Njg2ODkgLTkzNDk4MTk0MiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI0MSBhbmQgIDU2NzM2NzY4OSAgOTM0OTgxOTQyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjQyIGFuZCAtNjMxOTE3NzcyIC03MDYwMTQ2MzQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNDMgYW5kIC03NTYyNTMyNTcgIDEzODU3OTIzNCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI0NCBhbmQgIDgzNTU5MDE0OSAgNTY3NDM1NDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNECitkcWFuZDI1MCBhbmQgIDIwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI1MSBhbmQgIDcwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI1MiBhbmQgIDgwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI1MyBhbmQgIDkwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI1NCBhbmQgIDIwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI1NSBhbmQgIDcwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI1NiBhbmQgIDgwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI1NyBhbmQgIDkwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI1OCBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMjAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI1OSBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgNzAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI2MCBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgODAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI2MSBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgOTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI2MiBhbmQgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMjAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI2MyBhbmQgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgNzAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI2NCBhbmQgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgODAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI2NSBhbmQgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgOTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRC0xCitkcWFuZDI3MCBhbmQgIDAyMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTEwMDAwMDAwMDAxMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI3MSBhbmQgIDA3MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAxMDAwMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI3MiBhbmQgIDA4MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMTAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI3MyBhbmQgIDA5MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI3NCBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAxMDAwMDAgMDIwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDEwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI3NSBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMTAwMDAgMDcwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI3NiBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDEwMDAgMDgwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDEwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI3NyBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAxMDAgMDkwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IExTRAorZHFhbmQyODAgYW5kICAwMDEwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAyIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMDAwMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyODEgYW5kICAwMDAxMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDA3IDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDAwMTEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyODIgYW5kICAwMDAwMDAwMTExMDAwMTExMDAwMTExMTAwMDAwMDAwMDA4IDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMTAwMDAwMDAwMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyODMgYW5kICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDEwMDAwMDAwMDA5IDEwMDAwMDAxMTEwMDAxMTEwMDAxMTExMDAwMDAwMDAwMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyODQgYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDAwIDAwMDEwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyODUgYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDAwMDAwIDAwMTAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDcgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyODYgYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMDAwMDAwIDAxMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDggLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyODcgYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDkgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNaWRkaWUKK2RxYW5kMjg4IGFuZCAgMDAxMDAwMDExMTAwMDExMTAwMDExMTAwMDAyMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjg5IGFuZCAgMDAwMTAwMDExMTAwMDExMTAwMDExMTAwMDA3MDAwMDAwMSAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjkwIGFuZCAgMDAwMDAwMDExMTAwMDExMTAwMDExMTEwMDA4MDAwMDAxMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjkxIGFuZCAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAxMDA5MDAwMDEwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjkyIGFuZCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMTAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDIwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjkzIGFuZCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAxMDAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDcwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjk0IGFuZCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDEwMDAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDgwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjk1IGFuZCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDkwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHNpZ25zCitkcWFuZDI5NiBhbmQgLTEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgLTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyOTcgYW5kIC0xMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwICAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjk4IGFuZCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAtMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI5OSBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgIDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTEwMDAxMDAgLT4gIDExMDAwMDExMDAwMDExMDAwMDAwMTAwMDAwMAorCistLSBObWF4LCBObWluLCBOdGlueS1saWtlCitkcWFuZDMzMSBhbmQgIDIgICA5Ljk5OTk5OTk5RSs5OTkgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzMzIgYW5kICAzICAgMUUtOTk5ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzMzIGFuZCAgNCAgIDEuMDAwMDAwMDBFLTk5OSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDMzNCBhbmQgIDUgICAxRS05MDAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzMzUgYW5kICA2ICAgLTFFLTkwMCAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzM2IGFuZCAgNyAgIC0xLjAwMDAwMDAwRS05OTkgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDMzNyBhbmQgIDggICAtMUUtOTk5ICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzMzggYW5kICA5ICAgLTkuOTk5OTk5OTlFKzk5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzQxIGFuZCAgOS45OTk5OTk5OUUrOTk5ICAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM0MiBhbmQgIDFFLTk5OSAgICAgICAgICAgICAgIDAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNDMgYW5kICAxLjAwMDAwMDAwRS05OTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzQ0IGFuZCAgMUUtOTAwICAgICAgICAgICAgICAgMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM0NSBhbmQgIC0xRS05MDAgICAgICAgICAgICAgLTEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNDYgYW5kICAtMS4wMDAwMDAwMEUtOTk5ICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzQ3IGFuZCAgLTFFLTk5OSAgICAgICAgICAgICAgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM0OCBhbmQgIC05Ljk5OTk5OTk5RSs5OTkgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBIGZldyBvdGhlciBub24taW50ZWdlcnMKK2RxYW5kMzYxIGFuZCAgMS4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM2MiBhbmQgIDFFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNjMgYW5kICAwLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzY0IGFuZCAgMEUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM2NSBhbmQgIDkuOSAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNjYgYW5kICA5RSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzcxIGFuZCAgMCAxLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM3MiBhbmQgIDAgMUUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNzMgYW5kICAwIDAuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzc0IGFuZCAgMCAwRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM3NSBhbmQgIDAgOS45ICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNzYgYW5kICAwIDlFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQWxsIFNwZWNpYWxzIGFyZSBpbiBlcnJvcgorZHFhbmQ3ODAgYW5kIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kNzgxIGFuZCAtSW5mICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDc4MiBhbmQgLUluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ3ODMgYW5kIC1JbmYgIC0wICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kNzg0IGFuZCAtSW5mICAgMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDc4NSBhbmQgLUluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ3ODYgYW5kIC1JbmYgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kNzg3IGFuZCAtMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDc4OCBhbmQgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ3ODkgYW5kIC0xICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kNzkwIGFuZCAtMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDc5MSBhbmQgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ3OTIgYW5kICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kNzkzIGFuZCAgMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDc5NCBhbmQgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcWFuZDgwMCBhbmQgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MDEgYW5kICBJbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODAyIGFuZCAgSW5mICAtMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgwMyBhbmQgIEluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MDQgYW5kICBJbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODA1IGFuZCAgSW5mICAgMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgwNiBhbmQgIEluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MDcgYW5kICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODA4IGFuZCAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgwOSBhbmQgLUluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MTAgYW5kIC0xICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODExIGFuZCAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgxMiBhbmQgIDAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MTMgYW5kICAxICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODE0IGFuZCAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgxNSBhbmQgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcWFuZDgyMSBhbmQgIE5hTiAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MjIgYW5kICBOYU4gLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODIzIGFuZCAgTmFOIC0xICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgyNCBhbmQgIE5hTiAtMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MjUgYW5kICBOYU4gIDAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODI2IGFuZCAgTmFOICAxICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgyNyBhbmQgIE5hTiAgMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MjggYW5kICBOYU4gIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODI5IGFuZCAgTmFOICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgzMCBhbmQgLUluZiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MzEgYW5kIC0xMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODMyIGFuZCAtMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgzMyBhbmQgLTAgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MzQgYW5kICAwICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODM1IGFuZCAgMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgzNiBhbmQgIDEwMDAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MzcgYW5kICBJbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFhbmQ4NDEgYW5kICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NDIgYW5kICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NDMgYW5kICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NDQgYW5kICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NDUgYW5kICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NDYgYW5kICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NDcgYW5kICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NDggYW5kICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NDkgYW5kICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NTAgYW5kICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NTEgYW5kIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NTIgYW5kIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NTMgYW5kIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NTQgYW5kIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NTUgYW5kICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NTYgYW5kICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NTcgYW5kICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NTggYW5kICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NTkgYW5kICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcWFuZDg2MSBhbmQgIE5hTjEgICAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NjIgYW5kICtOYU4yICAgLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODYzIGFuZCAgTmFOMyAgICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg2NCBhbmQgIE5hTjQgICAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NjUgYW5kICBOYU41ICAgK05hTjYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODY2IGFuZCAtSW5mICAgICBOYU43ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg2NyBhbmQgLTEwMDAgICAgTmFOOCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NjggYW5kICAxMDAwICAgIE5hTjkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODY5IGFuZCAgSW5mICAgICtOYU4xMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg3MSBhbmQgIHNOYU4xMSAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NzIgYW5kICBzTmFOMTIgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODczIGFuZCAgc05hTjEzICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg3NCBhbmQgIHNOYU4xNCAgIE5hTjE3IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NzUgYW5kICBzTmFOMTUgIHNOYU4xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODc2IGFuZCAgTmFOMTYgICBzTmFOMTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg3NyBhbmQgLUluZiAgICArc05hTjIwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NzggYW5kIC0xMDAwICAgIHNOYU4yMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODc5IGFuZCAgMTAwMCAgICBzTmFOMjIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg4MCBhbmQgIEluZiAgICAgc05hTjIzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4ODEgYW5kICtOYU4yNSAgK3NOYU4yNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODgyIGFuZCAtTmFOMjYgICAgTmFOMjggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg4MyBhbmQgLXNOYU4yNyAgc05hTjI5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4ODQgYW5kICAxMDAwICAgIC1OYU4zMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODg1IGFuZCAgMTAwMCAgIC1zTmFOMzEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQmFzZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUJhc2UuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDljNmJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUJhc2UuZGVjVGVzdApAQCAtMCwwICsxLDEwODEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFCYXNlLmRlY1Rlc3QgLS0gYmFzZSBkZWNRdWFkIDwtLT4gc3RyaW5nIGNvbnZlcnNpb25zICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIGZpbGUgdGVzdHMgYmFzZSBjb252ZXJzaW9ucyBmcm9tIHN0cmluZyB0byBhIGRlY2ltYWwgbnVtYmVyCistLSBhbmQgYmFjayB0byBhIHN0cmluZyAoaW4gU2NpZW50aWZpYyBmb3JtKQorCistLSBOb3RlIHRoYXQgdW5saWtlIG90aGVyIG9wZXJhdGlvbnMgdGhlIG9wZXJhbmQgaXMgc3ViamVjdCB0byByb3VuZGluZworLS0gdG8gY29uZm9ybSB0byBlbWF4IGFuZCBwcmVjaXNpb24gc2V0dGluZ3MgKHRoYXQgaXMsIG51bWJlcnMgd2lsbAorLS0gY29uZm9ybSB0byBydWxlcyBhbmQgZXhwb25lbnQgd2lsbCBiZSBpbiBwZXJtaXR0ZWQgcmFuZ2UpLiAgVGhlCistLSAnbGVmdCBoYW5kIHNpZGUnLCB0aGVyZWZvcmUsIG1heSBoYXZlIG51bWJlcnMgdGhhdCBjYW5ub3QgYmUKKy0tIHJlcHJlc2VudGVkIGluIGEgZGVjUXVhZC4gIFNvbWUgdGVzdGNhc2VzIGdvIHRvIHRoZSBsaW1pdCBvZiB0aGUKKy0tIG5leHQtd2lkZXIgZm9ybWF0LCBhbmQgaGVuY2UgdGhlc2UgdGVzdGNhc2VzIG1heSBhbHNvIGJlIHVzZWQgdG8KKy0tIHRlc3QgbmFycm93aW5nIGFuZCB3aWRlbmluZyBvcGVyYXRpb25zLgorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkcWJhczAwMSB0b1NjaSAgICAgICAwIC0+IDAKK2RxYmFzMDAyIHRvU2NpICAgICAgIDEgLT4gMQorZHFiYXMwMDMgdG9TY2kgICAgIDEuMCAtPiAxLjAKK2RxYmFzMDA0IHRvU2NpICAgIDEuMDAgLT4gMS4wMAorZHFiYXMwMDUgdG9TY2kgICAgICAxMCAtPiAxMAorZHFiYXMwMDYgdG9TY2kgICAgMTAwMCAtPiAxMDAwCitkcWJhczAwNyB0b1NjaSAgICAxMC4wIC0+IDEwLjAKK2RxYmFzMDA4IHRvU2NpICAgIDEwLjEgLT4gMTAuMQorZHFiYXMwMDkgdG9TY2kgICAgMTAuNCAtPiAxMC40CitkcWJhczAxMCB0b1NjaSAgICAxMC41IC0+IDEwLjUKK2RxYmFzMDExIHRvU2NpICAgIDEwLjYgLT4gMTAuNgorZHFiYXMwMTIgdG9TY2kgICAgMTAuOSAtPiAxMC45CitkcWJhczAxMyB0b1NjaSAgICAxMS4wIC0+IDExLjAKK2RxYmFzMDE0IHRvU2NpICAxLjIzNCAtPiAxLjIzNAorZHFiYXMwMTUgdG9TY2kgIDAuMTIzIC0+IDAuMTIzCitkcWJhczAxNiB0b1NjaSAgMC4wMTIgLT4gMC4wMTIKK2RxYmFzMDE3IHRvU2NpICAtMCAgICAtPiAtMAorZHFiYXMwMTggdG9TY2kgIC0wLjAgIC0+IC0wLjAKK2RxYmFzMDE5IHRvU2NpIC0wMC4wMCAtPiAtMC4wMAorCitkcWJhczAyMSB0b1NjaSAgICAgLTEgLT4gLTEKK2RxYmFzMDIyIHRvU2NpICAgLTEuMCAtPiAtMS4wCitkcWJhczAyMyB0b1NjaSAgIC0wLjEgLT4gLTAuMQorZHFiYXMwMjQgdG9TY2kgICAtOS4xIC0+IC05LjEKK2RxYmFzMDI1IHRvU2NpICAgLTkuMTEgLT4gLTkuMTEKK2RxYmFzMDI2IHRvU2NpICAgLTkuMTE5IC0+IC05LjExOQorZHFiYXMwMjcgdG9TY2kgICAtOS45OTkgLT4gLTkuOTk5CisKK2RxYmFzMDMwIHRvU2NpICAnMTIzNDU2Nzg5LjEyMzQ1NicgICAtPiAnMTIzNDU2Nzg5LjEyMzQ1NicKK2RxYmFzMDMxIHRvU2NpICAnMTIzNDU2Nzg5LjAwMDAwMCcgICAtPiAnMTIzNDU2Nzg5LjAwMDAwMCcKK2RxYmFzMDMyIHRvU2NpICAgJzEyMzQ1Njc4OTEyMzQ1NicgICAtPiAnMTIzNDU2Nzg5MTIzNDU2JworZHFiYXMwMzMgdG9TY2kgICAnMC4wMDAwMTIzNDU2Nzg5JyAgIC0+ICcwLjAwMDAxMjM0NTY3ODknCitkcWJhczAzNCB0b1NjaSAgJzAuMDAwMDAxMjM0NTY3ODknICAgLT4gJzAuMDAwMDAxMjM0NTY3ODknCitkcWJhczAzNSB0b1NjaSAnMC4wMDAwMDAxMjM0NTY3ODknICAgLT4gJzEuMjM0NTY3ODlFLTcnCitkcWJhczAzNiB0b1NjaSAnMC4wMDAwMDAwMTIzNDU2Nzg5JyAgLT4gJzEuMjM0NTY3ODlFLTgnCisKK2RxYmFzMDM3IHRvU2NpICcwLjEyMzQ1Njc4OTAxMjM0NCcgICAtPiAnMC4xMjM0NTY3ODkwMTIzNDQnCitkcWJhczAzOCB0b1NjaSAnMC4xMjM0NTY3ODkwMTIzNDUnICAgLT4gJzAuMTIzNDU2Nzg5MDEyMzQ1JworCistLSB0ZXN0IGZpbml0ZSBib3VuZHMgKE5lZ3Mgb2YsIHRoZW4gMCwgTnRpbnksIE5taW4sIG90aGVyLCBObWF4KQorZHFic24wMDEgdG9TY2kgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFic24wMDIgdG9TY2kgLTFFLTYxNDMgLT4gLTFFLTYxNDMKK2RxYnNuMDAzIHRvU2NpIC0xRS02MTc2IC0+IC0xRS02MTc2IFN1Ym5vcm1hbAorZHFic24wMDQgdG9TY2kgLTAgLT4gLTAKK2RxYnNuMDA1IHRvU2NpICswIC0+ICAwCitkcWJzbjAwNiB0b1NjaSArMUUtNjE3NiAtPiAgMUUtNjE3NiBTdWJub3JtYWwKK2RxYnNuMDA3IHRvU2NpICsxRS02MTQzIC0+ICAxRS02MTQzCitkcWJzbjAwOCB0b1NjaSArOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CisKKy0tIFN0cmluZyBbbWFueSBtb3JlIGV4YW1wbGVzIGFyZSBpbXBsaWNpdGx5IHRlc3RlZCBlbHNld2hlcmVdCistLSBzdHJpbmdzIHdpdGhvdXQgRSBjYW5ub3QgZ2VuZXJhdGUgRSBpbiByZXN1bHQKK2RxYmFzMDQwIHRvU2NpICIxMiIgICAgICAgIC0+ICcxMicKK2RxYmFzMDQxIHRvU2NpICItNzYiICAgICAgIC0+ICctNzYnCitkcWJhczA0MiB0b1NjaSAiMTIuNzYiICAgICAtPiAnMTIuNzYnCitkcWJhczA0MyB0b1NjaSAiKzEyLjc2IiAgICAtPiAnMTIuNzYnCitkcWJhczA0NCB0b1NjaSAiMDEyLjc2IiAgICAtPiAnMTIuNzYnCitkcWJhczA0NSB0b1NjaSAiKzAuMDAzIiAgICAtPiAnMC4wMDMnCitkcWJhczA0NiB0b1NjaSAiMTcuIiAgICAgICAtPiAnMTcnCitkcWJhczA0NyB0b1NjaSAiLjUiICAgICAgICAtPiAnMC41JworZHFiYXMwNDggdG9TY2kgIjA0NCIgICAgICAgLT4gJzQ0JworZHFiYXMwNDkgdG9TY2kgIjAwNDQiICAgICAgLT4gJzQ0JworZHFiYXMwNTAgdG9TY2kgIjAuMDAwNSIgICAgICAtPiAnMC4wMDA1JworZHFiYXMwNTEgdG9TY2kgIjAwLjAwMDA1IiAgICAtPiAnMC4wMDAwNScKK2RxYmFzMDUyIHRvU2NpICIwLjAwMDAwNSIgICAgLT4gJzAuMDAwMDA1JworZHFiYXMwNTMgdG9TY2kgIjAuMDAwMDA1MCIgICAtPiAnMC4wMDAwMDUwJworZHFiYXMwNTQgdG9TY2kgIjAuMDAwMDAwNSIgICAtPiAnNUUtNycKK2RxYmFzMDU1IHRvU2NpICIwLjAwMDAwMDA1IiAgLT4gJzVFLTgnCitkcWJhczA1NiB0b1NjaSAiMTIzNDU2NzguNTQzMjEwIiAtPiAnMTIzNDU2NzguNTQzMjEwJworZHFiYXMwNTcgdG9TY2kgIjIzNDU2NzguNTQzMjEwIiAtPiAnMjM0NTY3OC41NDMyMTAnCitkcWJhczA1OCB0b1NjaSAiMzQ1Njc4LjU0MzIxMCIgLT4gJzM0NTY3OC41NDMyMTAnCitkcWJhczA1OSB0b1NjaSAiMDM0NTY3OC41NDMyMSIgLT4gJzM0NTY3OC41NDMyMScKK2RxYmFzMDYwIHRvU2NpICIzNDU2NzguNTQzMiIgLT4gJzM0NTY3OC41NDMyJworZHFiYXMwNjEgdG9TY2kgIiszNDU2NzguNTQzMiIgLT4gJzM0NTY3OC41NDMyJworZHFiYXMwNjIgdG9TY2kgIiswMzQ1Njc4LjU0MzIiIC0+ICczNDU2NzguNTQzMicKK2RxYmFzMDYzIHRvU2NpICIrMDAzNDU2NzguNTQzMiIgLT4gJzM0NTY3OC41NDMyJworZHFiYXMwNjQgdG9TY2kgIi0zNDU2NzguNTQzMiIgIC0+ICctMzQ1Njc4LjU0MzInCitkcWJhczA2NSB0b1NjaSAiLTAzNDU2NzguNTQzMiIgIC0+ICctMzQ1Njc4LjU0MzInCitkcWJhczA2NiB0b1NjaSAiLTAwMzQ1Njc4LjU0MzIiICAtPiAnLTM0NTY3OC41NDMyJworLS0gZXhhbXBsZXMKK2RxYmFzMDY3IHRvU2NpICI1RS02IiAgICAgICAgLT4gJzAuMDAwMDA1JworZHFiYXMwNjggdG9TY2kgIjUwRS03IiAgICAgICAtPiAnMC4wMDAwMDUwJworZHFiYXMwNjkgdG9TY2kgIjVFLTciICAgICAgICAtPiAnNUUtNycKKworLS0gW05vIGV4b3RpY3MgYXMgbm8gVW5pY29kZV0KKworLS0gcm91bmRlZCB3aXRoIGRvdHMgaW4gYWxsIChpbmNsdWRpbmcgZWRnZSkgcGxhY2VzCitkcWJhczA3MSB0b1NjaSAgLjEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+IDAuMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDcyIHRvU2NpICAxLjIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwNzMgdG9TY2kgIDEyLjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIuMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA3NCB0b1NjaSAgMTIzLjQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjMuNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDc1IHRvU2NpICAxMjM0LjU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQuNTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwNzYgdG9TY2kgIDEyMzQ1LjY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDUuNjc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA3NyB0b1NjaSAgMTIzNDU2Ljc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTYuNzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDc4IHRvU2NpICAxMjM0NTY3Ljg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1NjcuODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwNzkgdG9TY2kgIDEyMzQ1Njc4LjkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2NzguOTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA4MCB0b1NjaSAgMTIzNDU2Nzg5LjEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkuMTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDgxIHRvU2NpICAxMjM0NTY3ODkxLjIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEuMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwODIgdG9TY2kgIDEyMzQ1Njc4OTEyLjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIuMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA4MyB0b1NjaSAgMTIzNDU2Nzg5MTIzLjQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjMuNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDg0IHRvU2NpICAxMjM0NTY3ODkxMjM0LjU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQuNTY3ODkwMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwODUgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1LjY3ODkwMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDUuNjc4OTAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA4NiB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Ljc4OTAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTYuNzg5MDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDg3IHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3Ljg5MDEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1NjcuODkwMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwODggdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4LjkwMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2NzguOTAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA4OSB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Nzg5LjAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3ODkuMDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDkwIHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwLjEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1Njc4OTAuMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwOTEgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxLjIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEuMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA5MiB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyLjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIuMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDkzIHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzLjQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjMuNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwOTQgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0LjU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQuNTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA5NSB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1LjY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDUuNjc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDk2IHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Ljc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTYuNzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwOTcgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3LjgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1NjcuODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA5OCB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4LjAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzguMDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDk5IHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwLjEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAuMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMxMDAgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxLjIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEuMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczEwMSB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyLjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIuMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMTAyIHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzLjQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjMuNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMxMDMgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0LjU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQuNTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczEwNCB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1LjYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDUuNiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMTA1IHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2LjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFiYXMxMDYgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYxLjIzICAtPiAgMS4yMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTZFKzM0IEluZXhhY3QgUm91bmRlZAorZHFiYXMxMDcgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYxMi4zICAtPiAgMS4yMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTZFKzM1IEluZXhhY3QgUm91bmRlZAorZHFiYXMxMDggdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYxMjMuICAtPiAgMS4yMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTZFKzM2IEluZXhhY3QgUm91bmRlZAorLS0gMTIzNDU2Nzg5MDEyMzQ1Njc4CisKKy0tIE51bWJlcnMgd2l0aCBFCitkcWJhczEzMCB0b1NjaSAiMC4wMDBFLTEiICAtPiAnMC4wMDAwJworZHFiYXMxMzEgdG9TY2kgIjAuMDAwRS0yIiAgLT4gJzAuMDAwMDAnCitkcWJhczEzMiB0b1NjaSAiMC4wMDBFLTMiICAtPiAnMC4wMDAwMDAnCitkcWJhczEzMyB0b1NjaSAiMC4wMDBFLTQiICAtPiAnMEUtNycKK2RxYmFzMTM0IHRvU2NpICIwLjAwRS0yIiAgIC0+ICcwLjAwMDAnCitkcWJhczEzNSB0b1NjaSAiMC4wMEUtMyIgICAtPiAnMC4wMDAwMCcKK2RxYmFzMTM2IHRvU2NpICIwLjAwRS00IiAgIC0+ICcwLjAwMDAwMCcKK2RxYmFzMTM3IHRvU2NpICIwLjAwRS01IiAgIC0+ICcwRS03JworZHFiYXMxMzggdG9TY2kgIiswRSs5IiAgICAgLT4gJzBFKzknCitkcWJhczEzOSB0b1NjaSAiLTBFKzkiICAgICAtPiAnLTBFKzknCitkcWJhczE0MCB0b1NjaSAiMUUrOSIgICAgICAtPiAnMUUrOScKK2RxYmFzMTQxIHRvU2NpICIxZSswOSIgICAgIC0+ICcxRSs5JworZHFiYXMxNDIgdG9TY2kgIjFFKzkwIiAgICAgLT4gJzFFKzkwJworZHFiYXMxNDMgdG9TY2kgIisxRSswMDkiICAgLT4gJzFFKzknCitkcWJhczE0NCB0b1NjaSAiMEUrOSIgICAgICAtPiAnMEUrOScKK2RxYmFzMTQ1IHRvU2NpICIxRSs5IiAgICAgIC0+ICcxRSs5JworZHFiYXMxNDYgdG9TY2kgIjFFKzA5IiAgICAgLT4gJzFFKzknCitkcWJhczE0NyB0b1NjaSAiMWUrOTAiICAgICAtPiAnMUUrOTAnCitkcWJhczE0OCB0b1NjaSAiMUUrMDA5IiAgICAtPiAnMUUrOScKK2RxYmFzMTQ5IHRvU2NpICIwMDBFKzkiICAgIC0+ICcwRSs5JworZHFiYXMxNTAgdG9TY2kgIjFFOSIgICAgICAgLT4gJzFFKzknCitkcWJhczE1MSB0b1NjaSAiMWUwOSIgICAgICAtPiAnMUUrOScKK2RxYmFzMTUyIHRvU2NpICIxRTkwIiAgICAgIC0+ICcxRSs5MCcKK2RxYmFzMTUzIHRvU2NpICIxRTAwOSIgICAgIC0+ICcxRSs5JworZHFiYXMxNTQgdG9TY2kgIjBFOSIgICAgICAgLT4gJzBFKzknCitkcWJhczE1NSB0b1NjaSAiMC4wMDBlKzAiICAtPiAnMC4wMDAnCitkcWJhczE1NiB0b1NjaSAiMC4wMDBFLTEiICAtPiAnMC4wMDAwJworZHFiYXMxNTcgdG9TY2kgIjRFKzkiICAgICAgLT4gJzRFKzknCitkcWJhczE1OCB0b1NjaSAiNDRFKzkiICAgICAtPiAnNC40RSsxMCcKK2RxYmFzMTU5IHRvU2NpICIwLjczZS03IiAgIC0+ICc3LjNFLTgnCitkcWJhczE2MCB0b1NjaSAiMDBFKzkiICAgICAtPiAnMEUrOScKK2RxYmFzMTYxIHRvU2NpICIwMEUtOSIgICAgIC0+ICcwRS05JworZHFiYXMxNjIgdG9TY2kgIjEwRSs5IiAgICAgLT4gJzEuMEUrMTAnCitkcWJhczE2MyB0b1NjaSAiMTBFKzA5IiAgICAtPiAnMS4wRSsxMCcKK2RxYmFzMTY0IHRvU2NpICIxMGUrOTAiICAgIC0+ICcxLjBFKzkxJworZHFiYXMxNjUgdG9TY2kgIjEwRSswMDkiICAgLT4gJzEuMEUrMTAnCitkcWJhczE2NiB0b1NjaSAiMTAwZSs5IiAgICAtPiAnMS4wMEUrMTEnCitkcWJhczE2NyB0b1NjaSAiMTAwZSswOSIgICAtPiAnMS4wMEUrMTEnCitkcWJhczE2OCB0b1NjaSAiMTAwRSs5MCIgICAtPiAnMS4wMEUrOTInCitkcWJhczE2OSB0b1NjaSAiMTAwZSswMDkiICAtPiAnMS4wMEUrMTEnCisKK2RxYmFzMTcwIHRvU2NpICIxLjI2NSIgICAgIC0+ICcxLjI2NScKK2RxYmFzMTcxIHRvU2NpICIxLjI2NUUtMjAiIC0+ICcxLjI2NUUtMjAnCitkcWJhczE3MiB0b1NjaSAiMS4yNjVFLTgiICAtPiAnMS4yNjVFLTgnCitkcWJhczE3MyB0b1NjaSAiMS4yNjVFLTQiICAtPiAnMC4wMDAxMjY1JworZHFiYXMxNzQgdG9TY2kgIjEuMjY1RS0zIiAgLT4gJzAuMDAxMjY1JworZHFiYXMxNzUgdG9TY2kgIjEuMjY1RS0yIiAgLT4gJzAuMDEyNjUnCitkcWJhczE3NiB0b1NjaSAiMS4yNjVFLTEiICAtPiAnMC4xMjY1JworZHFiYXMxNzcgdG9TY2kgIjEuMjY1RS0wIiAgLT4gJzEuMjY1JworZHFiYXMxNzggdG9TY2kgIjEuMjY1RSsxIiAgLT4gJzEyLjY1JworZHFiYXMxNzkgdG9TY2kgIjEuMjY1RSsyIiAgLT4gJzEyNi41JworZHFiYXMxODAgdG9TY2kgIjEuMjY1RSszIiAgLT4gJzEyNjUnCitkcWJhczE4MSB0b1NjaSAiMS4yNjVFKzQiICAtPiAnMS4yNjVFKzQnCitkcWJhczE4MiB0b1NjaSAiMS4yNjVFKzgiICAtPiAnMS4yNjVFKzgnCitkcWJhczE4MyB0b1NjaSAiMS4yNjVFKzIwIiAtPiAnMS4yNjVFKzIwJworCitkcWJhczE5MCB0b1NjaSAiMTIuNjUiICAgICAtPiAnMTIuNjUnCitkcWJhczE5MSB0b1NjaSAiMTIuNjVFLTIwIiAtPiAnMS4yNjVFLTE5JworZHFiYXMxOTIgdG9TY2kgIjEyLjY1RS04IiAgLT4gJzEuMjY1RS03JworZHFiYXMxOTMgdG9TY2kgIjEyLjY1RS00IiAgLT4gJzAuMDAxMjY1JworZHFiYXMxOTQgdG9TY2kgIjEyLjY1RS0zIiAgLT4gJzAuMDEyNjUnCitkcWJhczE5NSB0b1NjaSAiMTIuNjVFLTIiICAtPiAnMC4xMjY1JworZHFiYXMxOTYgdG9TY2kgIjEyLjY1RS0xIiAgLT4gJzEuMjY1JworZHFiYXMxOTcgdG9TY2kgIjEyLjY1RS0wIiAgLT4gJzEyLjY1JworZHFiYXMxOTggdG9TY2kgIjEyLjY1RSsxIiAgLT4gJzEyNi41JworZHFiYXMxOTkgdG9TY2kgIjEyLjY1RSsyIiAgLT4gJzEyNjUnCitkcWJhczIwMCB0b1NjaSAiMTIuNjVFKzMiICAtPiAnMS4yNjVFKzQnCitkcWJhczIwMSB0b1NjaSAiMTIuNjVFKzQiICAtPiAnMS4yNjVFKzUnCitkcWJhczIwMiB0b1NjaSAiMTIuNjVFKzgiICAtPiAnMS4yNjVFKzknCitkcWJhczIwMyB0b1NjaSAiMTIuNjVFKzIwIiAtPiAnMS4yNjVFKzIxJworCitkcWJhczIxMCB0b1NjaSAiMTI2LjUiICAgICAtPiAnMTI2LjUnCitkcWJhczIxMSB0b1NjaSAiMTI2LjVFLTIwIiAtPiAnMS4yNjVFLTE4JworZHFiYXMyMTIgdG9TY2kgIjEyNi41RS04IiAgLT4gJzAuMDAwMDAxMjY1JworZHFiYXMyMTMgdG9TY2kgIjEyNi41RS00IiAgLT4gJzAuMDEyNjUnCitkcWJhczIxNCB0b1NjaSAiMTI2LjVFLTMiICAtPiAnMC4xMjY1JworZHFiYXMyMTUgdG9TY2kgIjEyNi41RS0yIiAgLT4gJzEuMjY1JworZHFiYXMyMTYgdG9TY2kgIjEyNi41RS0xIiAgLT4gJzEyLjY1JworZHFiYXMyMTcgdG9TY2kgIjEyNi41RS0wIiAgLT4gJzEyNi41JworZHFiYXMyMTggdG9TY2kgIjEyNi41RSsxIiAgLT4gJzEyNjUnCitkcWJhczIxOSB0b1NjaSAiMTI2LjVFKzIiICAtPiAnMS4yNjVFKzQnCitkcWJhczIyMCB0b1NjaSAiMTI2LjVFKzMiICAtPiAnMS4yNjVFKzUnCitkcWJhczIyMSB0b1NjaSAiMTI2LjVFKzQiICAtPiAnMS4yNjVFKzYnCitkcWJhczIyMiB0b1NjaSAiMTI2LjVFKzgiICAtPiAnMS4yNjVFKzEwJworZHFiYXMyMjMgdG9TY2kgIjEyNi41RSsyMCIgLT4gJzEuMjY1RSsyMicKKworZHFiYXMyMzAgdG9TY2kgIjEyNjUiICAgICAtPiAnMTI2NScKK2RxYmFzMjMxIHRvU2NpICIxMjY1RS0yMCIgLT4gJzEuMjY1RS0xNycKK2RxYmFzMjMyIHRvU2NpICIxMjY1RS04IiAgLT4gJzAuMDAwMDEyNjUnCitkcWJhczIzMyB0b1NjaSAiMTI2NUUtNCIgIC0+ICcwLjEyNjUnCitkcWJhczIzNCB0b1NjaSAiMTI2NUUtMyIgIC0+ICcxLjI2NScKK2RxYmFzMjM1IHRvU2NpICIxMjY1RS0yIiAgLT4gJzEyLjY1JworZHFiYXMyMzYgdG9TY2kgIjEyNjVFLTEiICAtPiAnMTI2LjUnCitkcWJhczIzNyB0b1NjaSAiMTI2NUUtMCIgIC0+ICcxMjY1JworZHFiYXMyMzggdG9TY2kgIjEyNjVFKzEiICAtPiAnMS4yNjVFKzQnCitkcWJhczIzOSB0b1NjaSAiMTI2NUUrMiIgIC0+ICcxLjI2NUUrNScKK2RxYmFzMjQwIHRvU2NpICIxMjY1RSszIiAgLT4gJzEuMjY1RSs2JworZHFiYXMyNDEgdG9TY2kgIjEyNjVFKzQiICAtPiAnMS4yNjVFKzcnCitkcWJhczI0MiB0b1NjaSAiMTI2NUUrOCIgIC0+ICcxLjI2NUUrMTEnCitkcWJhczI0MyB0b1NjaSAiMTI2NUUrMjAiIC0+ICcxLjI2NUUrMjMnCisKK2RxYmFzMjUwIHRvU2NpICIwLjEyNjUiICAgICAtPiAnMC4xMjY1JworZHFiYXMyNTEgdG9TY2kgIjAuMTI2NUUtMjAiIC0+ICcxLjI2NUUtMjEnCitkcWJhczI1MiB0b1NjaSAiMC4xMjY1RS04IiAgLT4gJzEuMjY1RS05JworZHFiYXMyNTMgdG9TY2kgIjAuMTI2NUUtNCIgIC0+ICcwLjAwMDAxMjY1JworZHFiYXMyNTQgdG9TY2kgIjAuMTI2NUUtMyIgIC0+ICcwLjAwMDEyNjUnCitkcWJhczI1NSB0b1NjaSAiMC4xMjY1RS0yIiAgLT4gJzAuMDAxMjY1JworZHFiYXMyNTYgdG9TY2kgIjAuMTI2NUUtMSIgIC0+ICcwLjAxMjY1JworZHFiYXMyNTcgdG9TY2kgIjAuMTI2NUUtMCIgIC0+ICcwLjEyNjUnCitkcWJhczI1OCB0b1NjaSAiMC4xMjY1RSsxIiAgLT4gJzEuMjY1JworZHFiYXMyNTkgdG9TY2kgIjAuMTI2NUUrMiIgIC0+ICcxMi42NScKK2RxYmFzMjYwIHRvU2NpICIwLjEyNjVFKzMiICAtPiAnMTI2LjUnCitkcWJhczI2MSB0b1NjaSAiMC4xMjY1RSs0IiAgLT4gJzEyNjUnCitkcWJhczI2MiB0b1NjaSAiMC4xMjY1RSs4IiAgLT4gJzEuMjY1RSs3JworZHFiYXMyNjMgdG9TY2kgIjAuMTI2NUUrMjAiIC0+ICcxLjI2NUUrMTknCisKKy0tIHNvbWUgbW9yZSBuZWdhdGl2ZSB6ZXJvcyBbc3lzdGVtYXRpYyB0ZXN0cyBiZWxvd10KK2RxYmFzMjkwIHRvU2NpICItMC4wMDBFLTEiICAtPiAnLTAuMDAwMCcKK2RxYmFzMjkxIHRvU2NpICItMC4wMDBFLTIiICAtPiAnLTAuMDAwMDAnCitkcWJhczI5MiB0b1NjaSAiLTAuMDAwRS0zIiAgLT4gJy0wLjAwMDAwMCcKK2RxYmFzMjkzIHRvU2NpICItMC4wMDBFLTQiICAtPiAnLTBFLTcnCitkcWJhczI5NCB0b1NjaSAiLTAuMDBFLTIiICAgLT4gJy0wLjAwMDAnCitkcWJhczI5NSB0b1NjaSAiLTAuMDBFLTMiICAgLT4gJy0wLjAwMDAwJworZHFiYXMyOTYgdG9TY2kgIi0wLjBFLTIiICAgIC0+ICctMC4wMDAnCitkcWJhczI5NyB0b1NjaSAiLTAuMEUtMyIgICAgLT4gJy0wLjAwMDAnCitkcWJhczI5OCB0b1NjaSAiLTBFLTIiICAgICAgLT4gJy0wLjAwJworZHFiYXMyOTkgdG9TY2kgIi0wRS0zIiAgICAgIC0+ICctMC4wMDAnCisKKy0tIEVuZ2luZWVyaW5nIG5vdGF0aW9uIHRlc3RzCitkcWJhczMwMSAgdG9TY2kgMTBlMTIgIC0+IDEuMEUrMTMKK2RxYmFzMzAyICB0b0VuZyAxMGUxMiAgLT4gMTBFKzEyCitkcWJhczMwMyAgdG9TY2kgMTBlMTEgIC0+IDEuMEUrMTIKK2RxYmFzMzA0ICB0b0VuZyAxMGUxMSAgLT4gMS4wRSsxMgorZHFiYXMzMDUgIHRvU2NpIDEwZTEwICAtPiAxLjBFKzExCitkcWJhczMwNiAgdG9FbmcgMTBlMTAgIC0+IDEwMEUrOQorZHFiYXMzMDcgIHRvU2NpIDEwZTkgICAtPiAxLjBFKzEwCitkcWJhczMwOCAgdG9FbmcgMTBlOSAgIC0+IDEwRSs5CitkcWJhczMwOSAgdG9TY2kgMTBlOCAgIC0+IDEuMEUrOQorZHFiYXMzMTAgIHRvRW5nIDEwZTggICAtPiAxLjBFKzkKK2RxYmFzMzExICB0b1NjaSAxMGU3ICAgLT4gMS4wRSs4CitkcWJhczMxMiAgdG9FbmcgMTBlNyAgIC0+IDEwMEUrNgorZHFiYXMzMTMgIHRvU2NpIDEwZTYgICAtPiAxLjBFKzcKK2RxYmFzMzE0ICB0b0VuZyAxMGU2ICAgLT4gMTBFKzYKK2RxYmFzMzE1ICB0b1NjaSAxMGU1ICAgLT4gMS4wRSs2CitkcWJhczMxNiAgdG9FbmcgMTBlNSAgIC0+IDEuMEUrNgorZHFiYXMzMTcgIHRvU2NpIDEwZTQgICAtPiAxLjBFKzUKK2RxYmFzMzE4ICB0b0VuZyAxMGU0ICAgLT4gMTAwRSszCitkcWJhczMxOSAgdG9TY2kgMTBlMyAgIC0+IDEuMEUrNAorZHFiYXMzMjAgIHRvRW5nIDEwZTMgICAtPiAxMEUrMworZHFiYXMzMjEgIHRvU2NpIDEwZTIgICAtPiAxLjBFKzMKK2RxYmFzMzIyICB0b0VuZyAxMGUyICAgLT4gMS4wRSszCitkcWJhczMyMyAgdG9TY2kgMTBlMSAgIC0+IDEuMEUrMgorZHFiYXMzMjQgIHRvRW5nIDEwZTEgICAtPiAxMDAKK2RxYmFzMzI1ICB0b1NjaSAxMGUwICAgLT4gMTAKK2RxYmFzMzI2ICB0b0VuZyAxMGUwICAgLT4gMTAKK2RxYmFzMzI3ICB0b1NjaSAxMGUtMSAgLT4gMS4wCitkcWJhczMyOCAgdG9FbmcgMTBlLTEgIC0+IDEuMAorZHFiYXMzMjkgIHRvU2NpIDEwZS0yICAtPiAwLjEwCitkcWJhczMzMCAgdG9FbmcgMTBlLTIgIC0+IDAuMTAKK2RxYmFzMzMxICB0b1NjaSAxMGUtMyAgLT4gMC4wMTAKK2RxYmFzMzMyICB0b0VuZyAxMGUtMyAgLT4gMC4wMTAKK2RxYmFzMzMzICB0b1NjaSAxMGUtNCAgLT4gMC4wMDEwCitkcWJhczMzNCAgdG9FbmcgMTBlLTQgIC0+IDAuMDAxMAorZHFiYXMzMzUgIHRvU2NpIDEwZS01ICAtPiAwLjAwMDEwCitkcWJhczMzNiAgdG9FbmcgMTBlLTUgIC0+IDAuMDAwMTAKK2RxYmFzMzM3ICB0b1NjaSAxMGUtNiAgLT4gMC4wMDAwMTAKK2RxYmFzMzM4ICB0b0VuZyAxMGUtNiAgLT4gMC4wMDAwMTAKK2RxYmFzMzM5ICB0b1NjaSAxMGUtNyAgLT4gMC4wMDAwMDEwCitkcWJhczM0MCAgdG9FbmcgMTBlLTcgIC0+IDAuMDAwMDAxMAorZHFiYXMzNDEgIHRvU2NpIDEwZS04ICAtPiAxLjBFLTcKK2RxYmFzMzQyICB0b0VuZyAxMGUtOCAgLT4gMTAwRS05CitkcWJhczM0MyAgdG9TY2kgMTBlLTkgIC0+IDEuMEUtOAorZHFiYXMzNDQgIHRvRW5nIDEwZS05ICAtPiAxMEUtOQorZHFiYXMzNDUgIHRvU2NpIDEwZS0xMCAtPiAxLjBFLTkKK2RxYmFzMzQ2ICB0b0VuZyAxMGUtMTAgLT4gMS4wRS05CitkcWJhczM0NyAgdG9TY2kgMTBlLTExIC0+IDEuMEUtMTAKK2RxYmFzMzQ4ICB0b0VuZyAxMGUtMTEgLT4gMTAwRS0xMgorZHFiYXMzNDkgIHRvU2NpIDEwZS0xMiAtPiAxLjBFLTExCitkcWJhczM1MCAgdG9FbmcgMTBlLTEyIC0+IDEwRS0xMgorZHFiYXMzNTEgIHRvU2NpIDEwZS0xMyAtPiAxLjBFLTEyCitkcWJhczM1MiAgdG9FbmcgMTBlLTEzIC0+IDEuMEUtMTIKKworZHFiYXMzNjEgIHRvU2NpIDdFMTIgIC0+IDdFKzEyCitkcWJhczM2MiAgdG9FbmcgN0UxMiAgLT4gN0UrMTIKK2RxYmFzMzYzICB0b1NjaSA3RTExICAtPiA3RSsxMQorZHFiYXMzNjQgIHRvRW5nIDdFMTEgIC0+IDcwMEUrOQorZHFiYXMzNjUgIHRvU2NpIDdFMTAgIC0+IDdFKzEwCitkcWJhczM2NiAgdG9FbmcgN0UxMCAgLT4gNzBFKzkKK2RxYmFzMzY3ICB0b1NjaSA3RTkgICAtPiA3RSs5CitkcWJhczM2OCAgdG9FbmcgN0U5ICAgLT4gN0UrOQorZHFiYXMzNjkgIHRvU2NpIDdFOCAgIC0+IDdFKzgKK2RxYmFzMzcwICB0b0VuZyA3RTggICAtPiA3MDBFKzYKK2RxYmFzMzcxICB0b1NjaSA3RTcgICAtPiA3RSs3CitkcWJhczM3MiAgdG9FbmcgN0U3ICAgLT4gNzBFKzYKK2RxYmFzMzczICB0b1NjaSA3RTYgICAtPiA3RSs2CitkcWJhczM3NCAgdG9FbmcgN0U2ICAgLT4gN0UrNgorZHFiYXMzNzUgIHRvU2NpIDdFNSAgIC0+IDdFKzUKK2RxYmFzMzc2ICB0b0VuZyA3RTUgICAtPiA3MDBFKzMKK2RxYmFzMzc3ICB0b1NjaSA3RTQgICAtPiA3RSs0CitkcWJhczM3OCAgdG9FbmcgN0U0ICAgLT4gNzBFKzMKK2RxYmFzMzc5ICB0b1NjaSA3RTMgICAtPiA3RSszCitkcWJhczM4MCAgdG9FbmcgN0UzICAgLT4gN0UrMworZHFiYXMzODEgIHRvU2NpIDdFMiAgIC0+IDdFKzIKK2RxYmFzMzgyICB0b0VuZyA3RTIgICAtPiA3MDAKK2RxYmFzMzgzICB0b1NjaSA3RTEgICAtPiA3RSsxCitkcWJhczM4NCAgdG9FbmcgN0UxICAgLT4gNzAKK2RxYmFzMzg1ICB0b1NjaSA3RTAgICAtPiA3CitkcWJhczM4NiAgdG9FbmcgN0UwICAgLT4gNworZHFiYXMzODcgIHRvU2NpIDdFLTEgIC0+IDAuNworZHFiYXMzODggIHRvRW5nIDdFLTEgIC0+IDAuNworZHFiYXMzODkgIHRvU2NpIDdFLTIgIC0+IDAuMDcKK2RxYmFzMzkwICB0b0VuZyA3RS0yICAtPiAwLjA3CitkcWJhczM5MSAgdG9TY2kgN0UtMyAgLT4gMC4wMDcKK2RxYmFzMzkyICB0b0VuZyA3RS0zICAtPiAwLjAwNworZHFiYXMzOTMgIHRvU2NpIDdFLTQgIC0+IDAuMDAwNworZHFiYXMzOTQgIHRvRW5nIDdFLTQgIC0+IDAuMDAwNworZHFiYXMzOTUgIHRvU2NpIDdFLTUgIC0+IDAuMDAwMDcKK2RxYmFzMzk2ICB0b0VuZyA3RS01ICAtPiAwLjAwMDA3CitkcWJhczM5NyAgdG9TY2kgN0UtNiAgLT4gMC4wMDAwMDcKK2RxYmFzMzk4ICB0b0VuZyA3RS02ICAtPiAwLjAwMDAwNworZHFiYXMzOTkgIHRvU2NpIDdFLTcgIC0+IDdFLTcKK2RxYmFzNDAwICB0b0VuZyA3RS03ICAtPiA3MDBFLTkKK2RxYmFzNDAxICB0b1NjaSA3RS04ICAtPiA3RS04CitkcWJhczQwMiAgdG9FbmcgN0UtOCAgLT4gNzBFLTkKK2RxYmFzNDAzICB0b1NjaSA3RS05ICAtPiA3RS05CitkcWJhczQwNCAgdG9FbmcgN0UtOSAgLT4gN0UtOQorZHFiYXM0MDUgIHRvU2NpIDdFLTEwIC0+IDdFLTEwCitkcWJhczQwNiAgdG9FbmcgN0UtMTAgLT4gNzAwRS0xMgorZHFiYXM0MDcgIHRvU2NpIDdFLTExIC0+IDdFLTExCitkcWJhczQwOCAgdG9FbmcgN0UtMTEgLT4gNzBFLTEyCitkcWJhczQwOSAgdG9TY2kgN0UtMTIgLT4gN0UtMTIKK2RxYmFzNDEwICB0b0VuZyA3RS0xMiAtPiA3RS0xMgorZHFiYXM0MTEgIHRvU2NpIDdFLTEzIC0+IDdFLTEzCitkcWJhczQxMiAgdG9FbmcgN0UtMTMgLT4gNzAwRS0xNQorCistLSBFeGFjdHMgcmVtYWluIGV4YWN0IHVwIHRvIHByZWNpc2lvbiAuLgorZHFiYXM0MjAgIHRvU2NpICAgIDEwMCAtPiAxMDAKK2RxYmFzNDIyICB0b1NjaSAgIDEwMDAgLT4gMTAwMAorZHFiYXM0MjQgIHRvU2NpICA5OTkuOSAtPiAgOTk5LjkKK2RxYmFzNDI2ICB0b1NjaSAxMDAwLjAgLT4gMTAwMC4wCitkcWJhczQyOCAgdG9TY2kgMTAwMC4xIC0+IDEwMDAuMQorZHFiYXM0MzAgIHRvU2NpIDEwMDAwIC0+IDEwMDAwCitkcWJhczQzMiAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFiYXM0MzQgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWJhczQzNiAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWJhczQzOCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFiYXM0NDAgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCAgIFJvdW5kZWQKK2RxYmFzNDQyICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgICBSb3VuZGVkCitkcWJhczQ0NCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0ICAgUm91bmRlZCBJbmV4YWN0CitkcWJhczQ0NiAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0ICAgUm91bmRlZCBJbmV4YWN0CitkcWJhczQ0OCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUwICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM1ICAgUm91bmRlZCBJbmV4YWN0CitkcWJhczQ1MCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFKzM0ICAgUm91bmRlZCBJbmV4YWN0CitkcWJhczQ1MiAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM1ICAgUm91bmRlZAorZHFiYXM0NTQgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMyAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNSAgIFJvdW5kZWQgSW5leGFjdAorZHFiYXM0NTYgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNSAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNSAgIFJvdW5kZWQgSW5leGFjdAorZHFiYXM0NTggIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOSAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNSAgIFJvdW5kZWQgSW5leGFjdAorZHFiYXM0NjAgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNiAgIFJvdW5kZWQKK2RxYmFzNDYyICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzYgICBSb3VuZGVkIEluZXhhY3QKK2RxYmFzNDY0ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNTAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzYgICBSb3VuZGVkIEluZXhhY3QKK2RxYmFzNDY2ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOTAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUrMzYgICBSb3VuZGVkIEluZXhhY3QKK2RxYmFzNDY4ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzcgICBSb3VuZGVkCitkcWJhczQ3MCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMwMDAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM3ICAgUm91bmRlZCBJbmV4YWN0CitkcWJhczQ3MiAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUwMDAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM3ICAgUm91bmRlZCBJbmV4YWN0CitkcWJhczQ3NCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkwMDAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFKzM3ICAgUm91bmRlZCBJbmV4YWN0CisKKy0tIGNoZWNrIHJvdW5kaW5nIG1vZGVzIGhlZWRlZAorcm91bmRpbmc6ICBjZWlsaW5nCitkcWJzcjQwMSAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1MCAgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RxYnNyNDAyICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU0OSAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjQwMyAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTAgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I0MDQgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUxICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgdXAKK2RxYnNyNDA1ICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUwICAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZAorZHFic3I0MDYgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTQ5ICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNDA3ICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MCAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjQwOCAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTEgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBmbG9vcgorZHFic3I0MTAgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTAgICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkcWJzcjQxMSAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NDkgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHFic3I0MTIgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUwICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNDEzICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MSAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfZG93bgorZHFic3I0MTUgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTAgICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkcWJzcjQxNiAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NDkgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHFic3I0MTcgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUwICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNDE4ICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDY1MCAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjQxOSAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTEgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX2V2ZW4KK2RxYnNyNDIxICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUwICAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZAorZHFic3I0MjIgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTQ5ICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNDIzICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MCAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjQyNCAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2NTAgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I0MjUgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUxICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgZG93bgorZHFic3I0MjYgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTAgICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkcWJzcjQyNyAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NDkgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHFic3I0MjggIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUwICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNDI5ICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MSAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfdXAKK2RxYnNyNDMxICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUwICAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZAorZHFic3I0MzIgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTQ5ICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNDMzICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MCAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjQzNCAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2NTAgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDcgIFJvdW5kZWQgSW5leGFjdAorZHFic3I0MzUgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUxICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKKy0tIG5lZ2F0aXZlcworcm91bmRpbmc6ICBjZWlsaW5nCitkcWJzcjUwMSAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1MCAgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RxYnNyNTAyICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU0OSAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjUwMyAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTAgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHFic3I1MDQgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUxICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgdXAKK2RxYnNyNTA1ICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUwICAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZAorZHFic3I1MDYgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTQ5ICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNTA3ICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MCAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjUwOCAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTEgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBmbG9vcgorZHFic3I1MTAgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTAgICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkcWJzcjUxMSAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NDkgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I1MTIgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUwICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNTEzICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MSAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfZG93bgorZHFic3I1MTUgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTAgICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkcWJzcjUxNiAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NDkgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHFic3I1MTcgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUwICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNTE4ICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDY1MCAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjUxOSAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTEgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX2V2ZW4KK2RxYnNyNTIxICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUwICAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZAorZHFic3I1MjIgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTQ5ICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNTIzICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MCAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjUyNCAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2NTAgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I1MjUgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUxICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgZG93bgorZHFic3I1MjYgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTAgICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkcWJzcjUyNyAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NDkgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHFic3I1MjggIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUwICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNTI5ICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MSAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfdXAKK2RxYnNyNTMxICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUwICAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZAorZHFic3I1MzIgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTQ5ICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNTMzICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MCAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjUzNCAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2NTAgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDcgIFJvdW5kZWQgSW5leGFjdAorZHFic3I1MzUgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUxICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKKworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBUaGUgJ2JhZGRpZXMnIHRlc3RzIGZyb20gRGlhZ0JpZ0RlY2ltYWwsIHBsdXMgc29tZSBuZXcgb25lcworZHFiYXM1MDAgdG9TY2kgJzEuLjInICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUwMSB0b1NjaSAnLicgICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTAyIHRvU2NpICcuLicgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MDMgdG9TY2kgJysrMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUwNCB0b1NjaSAnLS0xJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTA1IHRvU2NpICctKzEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MDYgdG9TY2kgJystMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUwNyB0b1NjaSAnMTJlJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTA4IHRvU2NpICcxMmUrKycgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MDkgdG9TY2kgJzEyZjQnICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUxMCB0b1NjaSAnICsxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTExIHRvU2NpICcrIDEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MTIgdG9TY2kgJzEyICcgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUxMyB0b1NjaSAnICsgMScgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTE0IHRvU2NpICcgLSAxICcgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MTUgdG9TY2kgJ3gnICAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUxNiB0b1NjaSAnLTEtJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTE3IHRvU2NpICcxMi0nICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MTggdG9TY2kgJzMrJyAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUxOSB0b1NjaSAnJyAgICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTIwIHRvU2NpICcxZS0nICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MjEgdG9TY2kgJzdlOTk5OTlhJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUyMiB0b1NjaSAnN2UxMjM1Njc4OTB4JyAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTIzIHRvU2NpICc3ZTEyMzU2Nzg5MDEyeCcgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MjQgdG9TY2kgJycgICAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUyNSB0b1NjaSAnZTEwMCcgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTI2IHRvU2NpICdcdTBlNWEnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MjcgdG9TY2kgJ1x1MGI2NScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUyOCB0b1NjaSAnMTIzLDY1JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTI5IHRvU2NpICcxLjM0LjUnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MzAgdG9TY2kgJy4xMjMuNScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUzMSB0b1NjaSAnMDEuMzUuJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTMyIHRvU2NpICcwMS4zNS0nICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MzMgdG9TY2kgJzAwMDAuLicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUzNCB0b1NjaSAnLjAwMDAuJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTM1IHRvU2NpICcwMC4uMDAnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MzYgdG9TY2kgJzExMWUqMTIzJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUzNyB0b1NjaSAnMTExZTEyMy0nICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTM4IHRvU2NpICcxMTFlKzEyKycgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MzkgdG9TY2kgJzExMWUxLTMtJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU0MCB0b1NjaSAnMTExZTEqMjMnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTQxIHRvU2NpICcxMTFlMWUrMycgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NDIgdG9TY2kgJzFlMS4wJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU0MyB0b1NjaSAnMWUxMjNlJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTQ0IHRvU2NpICd0ZW4nICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NDUgdG9TY2kgJ09ORScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU0NiB0b1NjaSAnMWUuMScgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTQ3IHRvU2NpICcxZTEuJyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NDggdG9TY2kgJzFlZScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU0OSB0b1NjaSAnZSsxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTUwIHRvU2NpICcxLjIzLjQnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NTEgdG9TY2kgJzEuMi4xJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU1MiB0b1NjaSAnMUUrMS4yJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTUzIHRvU2NpICcxRSsxLjIuMycgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NTQgdG9TY2kgJzFFKysxJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU1NSB0b1NjaSAnMUUtLTEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTU2IHRvU2NpICcxRSstMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NTcgdG9TY2kgJzFFLSsxJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU1OCB0b1NjaSAnMUUnJzEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTU5IHRvU2NpICIxRSIiMSIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NjAgdG9TY2kgIjFFIiIiIiIgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CistLSBOZWFyLXNwZWNpYWxzCitkcWJhczU2MSB0b1NjaSAicU5hTiIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTYyIHRvU2NpICJOYU5xIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NjMgdG9TY2kgIk5hTnMiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU2NCB0b1NjaSAiSW5maSIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTY1IHRvU2NpICJJbmZpbiIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NjYgdG9TY2kgIkluZmluaSIgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU2NyB0b1NjaSAiSW5maW5pdCIgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTY4IHRvU2NpICItSW5maW5pdCIgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NjkgdG9TY2kgIjBJbmYiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU3MCB0b1NjaSAiOUluZiIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTcxIHRvU2NpICItMEluZiIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NzIgdG9TY2kgIi05SW5mIiAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU3MyB0b1NjaSAiLXNOYSIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTc0IHRvU2NpICJ4TmFOIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NzUgdG9TY2kgIjBzTmFOIiAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CisKKy0tIHNvbWUgYmFkZGllcyB3aXRoIGRvdHMgYW5kIEVzIGFuZCBkb3RzIGFuZCBzcGVjaWFscworZHFiYXM1NzYgdG9TY2kgICdlKzEnICAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NzcgdG9TY2kgICcuZSsxJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NzggdG9TY2kgICcrLmUrMScgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NzkgdG9TY2kgICctLmUrJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1ODAgdG9TY2kgICctLmUnICAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1ODEgdG9TY2kgICdFKzEnICAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1ODIgdG9TY2kgICcuRSsxJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1ODMgdG9TY2kgICcrLkUrMScgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1ODQgdG9TY2kgICctLkUrJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1ODUgdG9TY2kgICctLkUnICAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorCitkcWJhczU4NiB0b1NjaSAgJy5OYU4nICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU4NyB0b1NjaSAgJy0uTmFOJyAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU4OCB0b1NjaSAgJysuc05hTicgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU4OSB0b1NjaSAgJysuSW5mJyAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU5MCB0b1NjaSAgJy5JbmZpbml0eScgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CisKKy0tIFplcm9zCitkcWJhczYwMSB0b1NjaSAwLjAwMDAwMDAwMCAgICAgICAtPiAwRS05CitkcWJhczYwMiB0b1NjaSAwLjAwMDAwMDAwICAgICAgICAtPiAwRS04CitkcWJhczYwMyB0b1NjaSAwLjAwMDAwMDAgICAgICAgICAtPiAwRS03CitkcWJhczYwNCB0b1NjaSAwLjAwMDAwMCAgICAgICAgICAtPiAwLjAwMDAwMAorZHFiYXM2MDUgdG9TY2kgMC4wMDAwMCAgICAgICAgICAgLT4gMC4wMDAwMAorZHFiYXM2MDYgdG9TY2kgMC4wMDAwICAgICAgICAgICAgLT4gMC4wMDAwCitkcWJhczYwNyB0b1NjaSAwLjAwMCAgICAgICAgICAgICAtPiAwLjAwMAorZHFiYXM2MDggdG9TY2kgMC4wMCAgICAgICAgICAgICAgLT4gMC4wMAorZHFiYXM2MDkgdG9TY2kgMC4wICAgICAgICAgICAgICAgLT4gMC4wCitkcWJhczYxMCB0b1NjaSAgLjAgICAgICAgICAgICAgICAtPiAwLjAKK2RxYmFzNjExIHRvU2NpIDAuICAgICAgICAgICAgICAgIC0+IDAKK2RxYmFzNjEyIHRvU2NpIC0uMCAgICAgICAgICAgICAgIC0+IC0wLjAKK2RxYmFzNjEzIHRvU2NpIC0wLiAgICAgICAgICAgICAgIC0+IC0wCitkcWJhczYxNCB0b1NjaSAtMC4wICAgICAgICAgICAgICAtPiAtMC4wCitkcWJhczYxNSB0b1NjaSAtMC4wMCAgICAgICAgICAgICAtPiAtMC4wMAorZHFiYXM2MTYgdG9TY2kgLTAuMDAwICAgICAgICAgICAgLT4gLTAuMDAwCitkcWJhczYxNyB0b1NjaSAtMC4wMDAwICAgICAgICAgICAtPiAtMC4wMDAwCitkcWJhczYxOCB0b1NjaSAtMC4wMDAwMCAgICAgICAgICAtPiAtMC4wMDAwMAorZHFiYXM2MTkgdG9TY2kgLTAuMDAwMDAwICAgICAgICAgLT4gLTAuMDAwMDAwCitkcWJhczYyMCB0b1NjaSAtMC4wMDAwMDAwICAgICAgICAtPiAtMEUtNworZHFiYXM2MjEgdG9TY2kgLTAuMDAwMDAwMDAgICAgICAgLT4gLTBFLTgKK2RxYmFzNjIyIHRvU2NpIC0wLjAwMDAwMDAwMCAgICAgIC0+IC0wRS05CisKK2RxYmFzNjMwIHRvU2NpICAwLjAwRSswICAgICAgICAgIC0+IDAuMDAKK2RxYmFzNjMxIHRvU2NpICAwLjAwRSsxICAgICAgICAgIC0+IDAuMAorZHFiYXM2MzIgdG9TY2kgIDAuMDBFKzIgICAgICAgICAgLT4gMAorZHFiYXM2MzMgdG9TY2kgIDAuMDBFKzMgICAgICAgICAgLT4gMEUrMQorZHFiYXM2MzQgdG9TY2kgIDAuMDBFKzQgICAgICAgICAgLT4gMEUrMgorZHFiYXM2MzUgdG9TY2kgIDAuMDBFKzUgICAgICAgICAgLT4gMEUrMworZHFiYXM2MzYgdG9TY2kgIDAuMDBFKzYgICAgICAgICAgLT4gMEUrNAorZHFiYXM2MzcgdG9TY2kgIDAuMDBFKzcgICAgICAgICAgLT4gMEUrNQorZHFiYXM2MzggdG9TY2kgIDAuMDBFKzggICAgICAgICAgLT4gMEUrNgorZHFiYXM2MzkgdG9TY2kgIDAuMDBFKzkgICAgICAgICAgLT4gMEUrNworCitkcWJhczY0MCB0b1NjaSAgMC4wRSswICAgICAgICAgICAtPiAwLjAKK2RxYmFzNjQxIHRvU2NpICAwLjBFKzEgICAgICAgICAgIC0+IDAKK2RxYmFzNjQyIHRvU2NpICAwLjBFKzIgICAgICAgICAgIC0+IDBFKzEKK2RxYmFzNjQzIHRvU2NpICAwLjBFKzMgICAgICAgICAgIC0+IDBFKzIKK2RxYmFzNjQ0IHRvU2NpICAwLjBFKzQgICAgICAgICAgIC0+IDBFKzMKK2RxYmFzNjQ1IHRvU2NpICAwLjBFKzUgICAgICAgICAgIC0+IDBFKzQKK2RxYmFzNjQ2IHRvU2NpICAwLjBFKzYgICAgICAgICAgIC0+IDBFKzUKK2RxYmFzNjQ3IHRvU2NpICAwLjBFKzcgICAgICAgICAgIC0+IDBFKzYKK2RxYmFzNjQ4IHRvU2NpICAwLjBFKzggICAgICAgICAgIC0+IDBFKzcKK2RxYmFzNjQ5IHRvU2NpICAwLjBFKzkgICAgICAgICAgIC0+IDBFKzgKKworZHFiYXM2NTAgdG9TY2kgIDBFKzAgICAgICAgICAgICAgLT4gMAorZHFiYXM2NTEgdG9TY2kgIDBFKzEgICAgICAgICAgICAgLT4gMEUrMQorZHFiYXM2NTIgdG9TY2kgIDBFKzIgICAgICAgICAgICAgLT4gMEUrMgorZHFiYXM2NTMgdG9TY2kgIDBFKzMgICAgICAgICAgICAgLT4gMEUrMworZHFiYXM2NTQgdG9TY2kgIDBFKzQgICAgICAgICAgICAgLT4gMEUrNAorZHFiYXM2NTUgdG9TY2kgIDBFKzUgICAgICAgICAgICAgLT4gMEUrNQorZHFiYXM2NTYgdG9TY2kgIDBFKzYgICAgICAgICAgICAgLT4gMEUrNgorZHFiYXM2NTcgdG9TY2kgIDBFKzcgICAgICAgICAgICAgLT4gMEUrNworZHFiYXM2NTggdG9TY2kgIDBFKzggICAgICAgICAgICAgLT4gMEUrOAorZHFiYXM2NTkgdG9TY2kgIDBFKzkgICAgICAgICAgICAgLT4gMEUrOQorCitkcWJhczY2MCB0b1NjaSAgMC4wRS0wICAgICAgICAgICAtPiAwLjAKK2RxYmFzNjYxIHRvU2NpICAwLjBFLTEgICAgICAgICAgIC0+IDAuMDAKK2RxYmFzNjYyIHRvU2NpICAwLjBFLTIgICAgICAgICAgIC0+IDAuMDAwCitkcWJhczY2MyB0b1NjaSAgMC4wRS0zICAgICAgICAgICAtPiAwLjAwMDAKK2RxYmFzNjY0IHRvU2NpICAwLjBFLTQgICAgICAgICAgIC0+IDAuMDAwMDAKK2RxYmFzNjY1IHRvU2NpICAwLjBFLTUgICAgICAgICAgIC0+IDAuMDAwMDAwCitkcWJhczY2NiB0b1NjaSAgMC4wRS02ICAgICAgICAgICAtPiAwRS03CitkcWJhczY2NyB0b1NjaSAgMC4wRS03ICAgICAgICAgICAtPiAwRS04CitkcWJhczY2OCB0b1NjaSAgMC4wRS04ICAgICAgICAgICAtPiAwRS05CitkcWJhczY2OSB0b1NjaSAgMC4wRS05ICAgICAgICAgICAtPiAwRS0xMAorCitkcWJhczY3MCB0b1NjaSAgMC4wMEUtMCAgICAgICAgICAtPiAwLjAwCitkcWJhczY3MSB0b1NjaSAgMC4wMEUtMSAgICAgICAgICAtPiAwLjAwMAorZHFiYXM2NzIgdG9TY2kgIDAuMDBFLTIgICAgICAgICAgLT4gMC4wMDAwCitkcWJhczY3MyB0b1NjaSAgMC4wMEUtMyAgICAgICAgICAtPiAwLjAwMDAwCitkcWJhczY3NCB0b1NjaSAgMC4wMEUtNCAgICAgICAgICAtPiAwLjAwMDAwMAorZHFiYXM2NzUgdG9TY2kgIDAuMDBFLTUgICAgICAgICAgLT4gMEUtNworZHFiYXM2NzYgdG9TY2kgIDAuMDBFLTYgICAgICAgICAgLT4gMEUtOAorZHFiYXM2NzcgdG9TY2kgIDAuMDBFLTcgICAgICAgICAgLT4gMEUtOQorZHFiYXM2NzggdG9TY2kgIDAuMDBFLTggICAgICAgICAgLT4gMEUtMTAKK2RxYmFzNjc5IHRvU2NpICAwLjAwRS05ICAgICAgICAgIC0+IDBFLTExCisKK2RxYmFzNjgwIHRvU2NpICAwMDAwMDAuICAgICAgICAgIC0+ICAwCitkcWJhczY4MSB0b1NjaSAgIDAwMDAwLiAgICAgICAgICAtPiAgMAorZHFiYXM2ODIgdG9TY2kgICAgMDAwMC4gICAgICAgICAgLT4gIDAKK2RxYmFzNjgzIHRvU2NpICAgICAwMDAuICAgICAgICAgIC0+ICAwCitkcWJhczY4NCB0b1NjaSAgICAgIDAwLiAgICAgICAgICAtPiAgMAorZHFiYXM2ODUgdG9TY2kgICAgICAgMC4gICAgICAgICAgLT4gIDAKK2RxYmFzNjg2IHRvU2NpICArMDAwMDAuICAgICAgICAgIC0+ICAwCitkcWJhczY4NyB0b1NjaSAgLTAwMDAwLiAgICAgICAgICAtPiAtMAorZHFiYXM2ODggdG9TY2kgICswLiAgICAgICAgICAgICAgLT4gIDAKK2RxYmFzNjg5IHRvU2NpICAtMC4gICAgICAgICAgICAgIC0+IC0wCisKKy0tIFNwZWNpYWxzCitkcWJhczcwMCB0b1NjaSAiTmFOIiAgICAgICAgICAgICAtPiBOYU4KK2RxYmFzNzAxIHRvU2NpICJuYW4iICAgICAgICAgICAgIC0+IE5hTgorZHFiYXM3MDIgdG9TY2kgIm5BbiIgICAgICAgICAgICAgLT4gTmFOCitkcWJhczcwMyB0b1NjaSAiTkFOIiAgICAgICAgICAgICAtPiBOYU4KK2RxYmFzNzA0IHRvU2NpICIrTmFOIiAgICAgICAgICAgIC0+IE5hTgorZHFiYXM3MDUgdG9TY2kgIituYW4iICAgICAgICAgICAgLT4gTmFOCitkcWJhczcwNiB0b1NjaSAiK25BbiIgICAgICAgICAgICAtPiBOYU4KK2RxYmFzNzA3IHRvU2NpICIrTkFOIiAgICAgICAgICAgIC0+IE5hTgorZHFiYXM3MDggdG9TY2kgIi1OYU4iICAgICAgICAgICAgLT4gLU5hTgorZHFiYXM3MDkgdG9TY2kgIi1uYW4iICAgICAgICAgICAgLT4gLU5hTgorZHFiYXM3MTAgdG9TY2kgIi1uQW4iICAgICAgICAgICAgLT4gLU5hTgorZHFiYXM3MTEgdG9TY2kgIi1OQU4iICAgICAgICAgICAgLT4gLU5hTgorZHFiYXM3MTIgdG9TY2kgJ05hTjAnICAgICAgICAgICAgLT4gTmFOCitkcWJhczcxMyB0b1NjaSAnTmFOMScgICAgICAgICAgICAtPiBOYU4xCitkcWJhczcxNCB0b1NjaSAnTmFOMTInICAgICAgICAgICAtPiBOYU4xMgorZHFiYXM3MTUgdG9TY2kgJ05hTjEyMycgICAgICAgICAgLT4gTmFOMTIzCitkcWJhczcxNiB0b1NjaSAnTmFOMTIzNCcgICAgICAgICAtPiBOYU4xMjM0CitkcWJhczcxNyB0b1NjaSAnTmFOMDEnICAgICAgICAgICAtPiBOYU4xCitkcWJhczcxOCB0b1NjaSAnTmFOMDEyJyAgICAgICAgICAtPiBOYU4xMgorZHFiYXM3MTkgdG9TY2kgJ05hTjAxMjMnICAgICAgICAgLT4gTmFOMTIzCitkcWJhczcyMCB0b1NjaSAnTmFOMDEyMzQnICAgICAgICAtPiBOYU4xMjM0CitkcWJhczcyMSB0b1NjaSAnTmFOMDAxJyAgICAgICAgICAtPiBOYU4xCitkcWJhczcyMiB0b1NjaSAnTmFOMDAxMicgICAgICAgICAtPiBOYU4xMgorZHFiYXM3MjMgdG9TY2kgJ05hTjAwMTIzJyAgICAgICAgLT4gTmFOMTIzCitkcWJhczcyNCB0b1NjaSAnTmFOMDAxMjM0JyAgICAgICAtPiBOYU4xMjM0CitkcWJhczcyNSB0b1NjaSAnTmFOMTIzNDU2Nzg5MDEyMzQ1Njc4MTIzNDU2Nzg5MDEyMzQ1NicgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczcyNiB0b1NjaSAnTmFOMTIzZSsxJyAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNzI3IHRvU2NpICdOYU4xMi40NScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM3MjggdG9TY2kgJ05hTi0xMicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczcyOSB0b1NjaSAnTmFOKzEyJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKKworZHFiYXM3MzAgdG9TY2kgInNOYU4iICAgICAgICAgICAgLT4gc05hTgorZHFiYXM3MzEgdG9TY2kgInNuYW4iICAgICAgICAgICAgLT4gc05hTgorZHFiYXM3MzIgdG9TY2kgIlNuQW4iICAgICAgICAgICAgLT4gc05hTgorZHFiYXM3MzMgdG9TY2kgIlNOQU4iICAgICAgICAgICAgLT4gc05hTgorZHFiYXM3MzQgdG9TY2kgIitzTmFOIiAgICAgICAgICAgLT4gc05hTgorZHFiYXM3MzUgdG9TY2kgIitzbmFuIiAgICAgICAgICAgLT4gc05hTgorZHFiYXM3MzYgdG9TY2kgIitTbkFuIiAgICAgICAgICAgLT4gc05hTgorZHFiYXM3MzcgdG9TY2kgIitTTkFOIiAgICAgICAgICAgLT4gc05hTgorZHFiYXM3MzggdG9TY2kgIi1zTmFOIiAgICAgICAgICAgLT4gLXNOYU4KK2RxYmFzNzM5IHRvU2NpICItc25hbiIgICAgICAgICAgIC0+IC1zTmFOCitkcWJhczc0MCB0b1NjaSAiLVNuQW4iICAgICAgICAgICAtPiAtc05hTgorZHFiYXM3NDEgdG9TY2kgIi1TTkFOIiAgICAgICAgICAgLT4gLXNOYU4KK2RxYmFzNzQyIHRvU2NpICdzTmFOMDAwMCcgICAgICAgIC0+IHNOYU4KK2RxYmFzNzQzIHRvU2NpICdzTmFONycgICAgICAgICAgIC0+IHNOYU43CitkcWJhczc0NCB0b1NjaSAnc05hTjAwNzIzNCcgICAgICAtPiBzTmFONzIzNAorZHFiYXM3NDUgdG9TY2kgJ3NOYU4xMjM0NTY3ODkwMTIzNDU2Nzg3MjM0NTYxMjM0NTY3ODkwJyAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNzQ2IHRvU2NpICdzTmFONzIuNDUnICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM3NDcgdG9TY2kgJ3NOYU4tNzInICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CisKK2RxYmFzNzQ4IHRvU2NpICJJbmYiICAgICAgICAgICAgIC0+IEluZmluaXR5CitkcWJhczc0OSB0b1NjaSAiaW5mIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorZHFiYXM3NTAgdG9TY2kgImlOZiIgICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RxYmFzNzUxIHRvU2NpICJJTkYiICAgICAgICAgICAgIC0+IEluZmluaXR5CitkcWJhczc1MiB0b1NjaSAiK0luZiIgICAgICAgICAgICAtPiBJbmZpbml0eQorZHFiYXM3NTMgdG9TY2kgIitpbmYiICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RxYmFzNzU0IHRvU2NpICIraU5mIiAgICAgICAgICAgIC0+IEluZmluaXR5CitkcWJhczc1NSB0b1NjaSAiK0lORiIgICAgICAgICAgICAtPiBJbmZpbml0eQorZHFiYXM3NTYgdG9TY2kgIi1JbmYiICAgICAgICAgICAgLT4gLUluZmluaXR5CitkcWJhczc1NyB0b1NjaSAiLWluZiIgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2RxYmFzNzU4IHRvU2NpICItaU5mIiAgICAgICAgICAgIC0+IC1JbmZpbml0eQorZHFiYXM3NTkgdG9TY2kgIi1JTkYiICAgICAgICAgICAgLT4gLUluZmluaXR5CisKK2RxYmFzNzYwIHRvU2NpICJJbmZpbml0eSIgICAgICAgIC0+IEluZmluaXR5CitkcWJhczc2MSB0b1NjaSAiaW5maW5pdHkiICAgICAgICAtPiBJbmZpbml0eQorZHFiYXM3NjIgdG9TY2kgImlOZkluSXRZIiAgICAgICAgLT4gSW5maW5pdHkKK2RxYmFzNzYzIHRvU2NpICJJTkZJTklUWSIgICAgICAgIC0+IEluZmluaXR5CitkcWJhczc2NCB0b1NjaSAiK0luZmluaXR5IiAgICAgICAtPiBJbmZpbml0eQorZHFiYXM3NjUgdG9TY2kgIitpbmZpbml0eSIgICAgICAgLT4gSW5maW5pdHkKK2RxYmFzNzY2IHRvU2NpICIraU5mSW5JdFkiICAgICAgIC0+IEluZmluaXR5CitkcWJhczc2NyB0b1NjaSAiK0lORklOSVRZIiAgICAgICAtPiBJbmZpbml0eQorZHFiYXM3NjggdG9TY2kgIi1JbmZpbml0eSIgICAgICAgLT4gLUluZmluaXR5CitkcWJhczc2OSB0b1NjaSAiLWluZmluaXR5IiAgICAgICAtPiAtSW5maW5pdHkKK2RxYmFzNzcwIHRvU2NpICItaU5mSW5JdFkiICAgICAgIC0+IC1JbmZpbml0eQorZHFiYXM3NzEgdG9TY2kgIi1JTkZJTklUWSIgICAgICAgLT4gLUluZmluaXR5CisKKy0tIFNwZWNpYWxzIGFuZCB6ZXJvcyBmb3IgdG9FbmcKK2RxYmFzdDc3MiB0b0VuZyAiTmFOIiAgICAgICAgICAgICAgLT4gTmFOCitkcWJhc3Q3NzMgdG9FbmcgIi1JbmZpbml0eSIgICAgICAgIC0+IC1JbmZpbml0eQorZHFiYXN0Nzc0IHRvRW5nICItc05hTiIgICAgICAgICAgICAtPiAtc05hTgorZHFiYXN0Nzc1IHRvRW5nICItTmFOIiAgICAgICAgICAgICAtPiAtTmFOCitkcWJhc3Q3NzYgdG9FbmcgIitJbmZpbml0eSIgICAgICAgIC0+IEluZmluaXR5CitkcWJhc3Q3NzggdG9FbmcgIitzTmFOIiAgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzdDc3OSB0b0VuZyAiK05hTiIgICAgICAgICAgICAgLT4gTmFOCitkcWJhc3Q3ODAgdG9FbmcgIklORklOSVRZIiAgICAgICAgIC0+IEluZmluaXR5CitkcWJhc3Q3ODEgdG9FbmcgIlNOQU4iICAgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzdDc4MiB0b0VuZyAiTkFOIiAgICAgICAgICAgICAgLT4gTmFOCitkcWJhc3Q3ODMgdG9FbmcgImluZmluaXR5IiAgICAgICAgIC0+IEluZmluaXR5CitkcWJhc3Q3ODQgdG9FbmcgInNuYW4iICAgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzdDc4NSB0b0VuZyAibmFuIiAgICAgICAgICAgICAgLT4gTmFOCitkcWJhc3Q3ODYgdG9FbmcgIkluRklOSVRZIiAgICAgICAgIC0+IEluZmluaXR5CitkcWJhc3Q3ODcgdG9FbmcgIlNuQU4iICAgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzdDc4OCB0b0VuZyAibkFOIiAgICAgICAgICAgICAgLT4gTmFOCitkcWJhc3Q3ODkgdG9FbmcgImlOZmluaXR5IiAgICAgICAgIC0+IEluZmluaXR5CitkcWJhc3Q3OTAgdG9FbmcgInNOYW4iICAgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzdDc5MSB0b0VuZyAiTmFuIiAgICAgICAgICAgICAgLT4gTmFOCitkcWJhc3Q3OTIgdG9FbmcgIkluZmluaXR5IiAgICAgICAgIC0+IEluZmluaXR5CitkcWJhc3Q3OTMgdG9FbmcgInNOYU4iICAgICAgICAgICAgIC0+IHNOYU4KKworLS0gWmVybyB0b0VuZywgZXRjLgorZHFiYXN0ODAwIHRvRW5nIDBlKzEgICAgICAgICAgICAgIC0+ICIwLjAwRSszIiAgLS0gZG9jIGV4YW1wbGUKKworZHFiYXN0ODAxIHRvRW5nIDAuMDAwMDAwMDAwICAgICAgIC0+IDBFLTkKK2RxYmFzdDgwMiB0b0VuZyAwLjAwMDAwMDAwICAgICAgICAtPiAwLjAwRS02CitkcWJhc3Q4MDMgdG9FbmcgMC4wMDAwMDAwICAgICAgICAgLT4gMC4wRS02CitkcWJhc3Q4MDQgdG9FbmcgMC4wMDAwMDAgICAgICAgICAgLT4gMC4wMDAwMDAKK2RxYmFzdDgwNSB0b0VuZyAwLjAwMDAwICAgICAgICAgICAtPiAwLjAwMDAwCitkcWJhc3Q4MDYgdG9FbmcgMC4wMDAwICAgICAgICAgICAgLT4gMC4wMDAwCitkcWJhc3Q4MDcgdG9FbmcgMC4wMDAgICAgICAgICAgICAgLT4gMC4wMDAKK2RxYmFzdDgwOCB0b0VuZyAwLjAwICAgICAgICAgICAgICAtPiAwLjAwCitkcWJhc3Q4MDkgdG9FbmcgMC4wICAgICAgICAgICAgICAgLT4gMC4wCitkcWJhc3Q4MTAgdG9FbmcgIC4wICAgICAgICAgICAgICAgLT4gMC4wCitkcWJhc3Q4MTEgdG9FbmcgMC4gICAgICAgICAgICAgICAgLT4gMAorZHFiYXN0ODEyIHRvRW5nIC0uMCAgICAgICAgICAgICAgIC0+IC0wLjAKK2RxYmFzdDgxMyB0b0VuZyAtMC4gICAgICAgICAgICAgICAtPiAtMAorZHFiYXN0ODE0IHRvRW5nIC0wLjAgICAgICAgICAgICAgIC0+IC0wLjAKK2RxYmFzdDgxNSB0b0VuZyAtMC4wMCAgICAgICAgICAgICAtPiAtMC4wMAorZHFiYXN0ODE2IHRvRW5nIC0wLjAwMCAgICAgICAgICAgIC0+IC0wLjAwMAorZHFiYXN0ODE3IHRvRW5nIC0wLjAwMDAgICAgICAgICAgIC0+IC0wLjAwMDAKK2RxYmFzdDgxOCB0b0VuZyAtMC4wMDAwMCAgICAgICAgICAtPiAtMC4wMDAwMAorZHFiYXN0ODE5IHRvRW5nIC0wLjAwMDAwMCAgICAgICAgIC0+IC0wLjAwMDAwMAorZHFiYXN0ODIwIHRvRW5nIC0wLjAwMDAwMDAgICAgICAgIC0+IC0wLjBFLTYKK2RxYmFzdDgyMSB0b0VuZyAtMC4wMDAwMDAwMCAgICAgICAtPiAtMC4wMEUtNgorZHFiYXN0ODIyIHRvRW5nIC0wLjAwMDAwMDAwMCAgICAgIC0+IC0wRS05CisKK2RxYmFzdDgzMCB0b0VuZyAgMC4wMEUrMCAgICAgICAgICAtPiAwLjAwCitkcWJhc3Q4MzEgdG9FbmcgIDAuMDBFKzEgICAgICAgICAgLT4gMC4wCitkcWJhc3Q4MzIgdG9FbmcgIDAuMDBFKzIgICAgICAgICAgLT4gMAorZHFiYXN0ODMzIHRvRW5nICAwLjAwRSszICAgICAgICAgIC0+IDAuMDBFKzMKK2RxYmFzdDgzNCB0b0VuZyAgMC4wMEUrNCAgICAgICAgICAtPiAwLjBFKzMKK2RxYmFzdDgzNSB0b0VuZyAgMC4wMEUrNSAgICAgICAgICAtPiAwRSszCitkcWJhc3Q4MzYgdG9FbmcgIDAuMDBFKzYgICAgICAgICAgLT4gMC4wMEUrNgorZHFiYXN0ODM3IHRvRW5nICAwLjAwRSs3ICAgICAgICAgIC0+IDAuMEUrNgorZHFiYXN0ODM4IHRvRW5nICAwLjAwRSs4ICAgICAgICAgIC0+IDBFKzYKK2RxYmFzdDgzOSB0b0VuZyAgMC4wMEUrOSAgICAgICAgICAtPiAwLjAwRSs5CisKK2RxYmFzdDg0MCB0b0VuZyAgMC4wRSswICAgICAgICAgICAtPiAwLjAKK2RxYmFzdDg0MSB0b0VuZyAgMC4wRSsxICAgICAgICAgICAtPiAwCitkcWJhc3Q4NDIgdG9FbmcgIDAuMEUrMiAgICAgICAgICAgLT4gMC4wMEUrMworZHFiYXN0ODQzIHRvRW5nICAwLjBFKzMgICAgICAgICAgIC0+IDAuMEUrMworZHFiYXN0ODQ0IHRvRW5nICAwLjBFKzQgICAgICAgICAgIC0+IDBFKzMKK2RxYmFzdDg0NSB0b0VuZyAgMC4wRSs1ICAgICAgICAgICAtPiAwLjAwRSs2CitkcWJhc3Q4NDYgdG9FbmcgIDAuMEUrNiAgICAgICAgICAgLT4gMC4wRSs2CitkcWJhc3Q4NDcgdG9FbmcgIDAuMEUrNyAgICAgICAgICAgLT4gMEUrNgorZHFiYXN0ODQ4IHRvRW5nICAwLjBFKzggICAgICAgICAgIC0+IDAuMDBFKzkKK2RxYmFzdDg0OSB0b0VuZyAgMC4wRSs5ICAgICAgICAgICAtPiAwLjBFKzkKKworZHFiYXN0ODUwIHRvRW5nICAwRSswICAgICAgICAgICAgIC0+IDAKK2RxYmFzdDg1MSB0b0VuZyAgMEUrMSAgICAgICAgICAgICAtPiAwLjAwRSszCitkcWJhc3Q4NTIgdG9FbmcgIDBFKzIgICAgICAgICAgICAgLT4gMC4wRSszCitkcWJhc3Q4NTMgdG9FbmcgIDBFKzMgICAgICAgICAgICAgLT4gMEUrMworZHFiYXN0ODU0IHRvRW5nICAwRSs0ICAgICAgICAgICAgIC0+IDAuMDBFKzYKK2RxYmFzdDg1NSB0b0VuZyAgMEUrNSAgICAgICAgICAgICAtPiAwLjBFKzYKK2RxYmFzdDg1NiB0b0VuZyAgMEUrNiAgICAgICAgICAgICAtPiAwRSs2CitkcWJhc3Q4NTcgdG9FbmcgIDBFKzcgICAgICAgICAgICAgLT4gMC4wMEUrOQorZHFiYXN0ODU4IHRvRW5nICAwRSs4ICAgICAgICAgICAgIC0+IDAuMEUrOQorZHFiYXN0ODU5IHRvRW5nICAwRSs5ICAgICAgICAgICAgIC0+IDBFKzkKKworZHFiYXN0ODYwIHRvRW5nICAwLjBFLTAgICAgICAgICAgIC0+IDAuMAorZHFiYXN0ODYxIHRvRW5nICAwLjBFLTEgICAgICAgICAgIC0+IDAuMDAKK2RxYmFzdDg2MiB0b0VuZyAgMC4wRS0yICAgICAgICAgICAtPiAwLjAwMAorZHFiYXN0ODYzIHRvRW5nICAwLjBFLTMgICAgICAgICAgIC0+IDAuMDAwMAorZHFiYXN0ODY0IHRvRW5nICAwLjBFLTQgICAgICAgICAgIC0+IDAuMDAwMDAKK2RxYmFzdDg2NSB0b0VuZyAgMC4wRS01ICAgICAgICAgICAtPiAwLjAwMDAwMAorZHFiYXN0ODY2IHRvRW5nICAwLjBFLTYgICAgICAgICAgIC0+IDAuMEUtNgorZHFiYXN0ODY3IHRvRW5nICAwLjBFLTcgICAgICAgICAgIC0+IDAuMDBFLTYKK2RxYmFzdDg2OCB0b0VuZyAgMC4wRS04ICAgICAgICAgICAtPiAwRS05CitkcWJhc3Q4NjkgdG9FbmcgIDAuMEUtOSAgICAgICAgICAgLT4gMC4wRS05CisKK2RxYmFzdDg3MCB0b0VuZyAgMC4wMEUtMCAgICAgICAgICAtPiAwLjAwCitkcWJhc3Q4NzEgdG9FbmcgIDAuMDBFLTEgICAgICAgICAgLT4gMC4wMDAKK2RxYmFzdDg3MiB0b0VuZyAgMC4wMEUtMiAgICAgICAgICAtPiAwLjAwMDAKK2RxYmFzdDg3MyB0b0VuZyAgMC4wMEUtMyAgICAgICAgICAtPiAwLjAwMDAwCitkcWJhc3Q4NzQgdG9FbmcgIDAuMDBFLTQgICAgICAgICAgLT4gMC4wMDAwMDAKK2RxYmFzdDg3NSB0b0VuZyAgMC4wMEUtNSAgICAgICAgICAtPiAwLjBFLTYKK2RxYmFzdDg3NiB0b0VuZyAgMC4wMEUtNiAgICAgICAgICAtPiAwLjAwRS02CitkcWJhc3Q4NzcgdG9FbmcgIDAuMDBFLTcgICAgICAgICAgLT4gMEUtOQorZHFiYXN0ODc4IHRvRW5nICAwLjAwRS04ICAgICAgICAgIC0+IDAuMEUtOQorZHFiYXN0ODc5IHRvRW5nICAwLjAwRS05ICAgICAgICAgIC0+IDAuMDBFLTkKKworLS0gbG9uZyBpbnB1dCBzdHJpbmdzCitkcWJhczgwMSB0b3NjaSAnMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2RxYmFzODAyIHRvc2NpICcwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2RxYmFzODAzIHRvc2NpICcwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkcWJhczgwNCB0b3NjaSAnMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2RxYmFzODA1IHRvc2NpICcwMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2RxYmFzODA2IHRvc2NpICcwMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkcWJhczgwNyB0b3NjaSAnMDAwMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2RxYmFzODA4IHRvc2NpICcwMDAwMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2RxYmFzODA5IHRvc2NpICcwMDAwMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkcWJhczgxMCB0b3NjaSAnMDAwMDAwMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEyMzQ1Njc4OTAxMjM0NTYKKworZHFiYXM4MTEgdG9zY2kgJzAuMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMC4xMjM0NTY3ODkwMTIzNDU2CitkcWJhczgxMiB0b3NjaSAnMC4wMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMC4wMTIzNDU2Nzg5MDEyMzQ1NgorZHFiYXM4MTMgdG9zY2kgJzAuMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAwLjAwMTIzNDU2Nzg5MDEyMzQ1NgorZHFiYXM4MTQgdG9zY2kgJzAuMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMC4wMDAxMjM0NTY3ODkwMTIzNDU2CitkcWJhczgxNSB0b3NjaSAnMC4wMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMC4wMDAwMTIzNDU2Nzg5MDEyMzQ1NgorZHFiYXM4MTYgdG9zY2kgJzAuMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAwLjAwMDAwMTIzNDU2Nzg5MDEyMzQ1NgorZHFiYXM4MTcgdG9zY2kgJzAuMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMS4yMzQ1Njc4OTAxMjM0NTZFLTcKK2RxYmFzODE4IHRvc2NpICcwLjAwMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxLjIzNDU2Nzg5MDEyMzQ1NkUtOAorZHFiYXM4MTkgdG9zY2kgJzAuMDAwMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxLjIzNDU2Nzg5MDEyMzQ1NkUtOQorZHFiYXM4MjAgdG9zY2kgJzAuMDAwMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMS4yMzQ1Njc4OTAxMjM0NTZFLTEwCisKK2RxYmFzODIxIHRvc2NpICcxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2Nzg5MCcgLT4gMS4yMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTdFKzM3IEluZXhhY3QgUm91bmRlZAorZHFiYXM4MjIgdG9zY2kgJzEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTY3ODkwMScgLT4gMS4yMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTdFKzM4IEluZXhhY3QgUm91bmRlZAorZHFiYXM4MjMgdG9zY2kgJzEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTY3ODkwMTInIC0+IDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU3RSszOSBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzODI0IHRvc2NpICcxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2Nzg5MDEyMycgLT4gMS4yMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTdFKzQwIEluZXhhY3QgUm91bmRlZAorZHFiYXM4MjUgdG9zY2kgJzEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTY3ODkwMTIzNCcgLT4gMS4yMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTdFKzQxIEluZXhhY3QgUm91bmRlZAorZHFiYXM4MjYgdG9zY2kgJzEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTY3ODkwMTIzNDUnIC0+IDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU3RSs0MiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzODI3IHRvc2NpICcxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMS4yMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTdFKzQzIEluZXhhY3QgUm91bmRlZAorZHFiYXM4MjggdG9zY2kgJzEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTY3ODkwMTIzNDU2NycgLT4gMS4yMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTdFKzQ0IEluZXhhY3QgUm91bmRlZAorZHFiYXM4MjkgdG9zY2kgJzEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTY3ODkwMTIzNDU2NzgnIC0+IDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU3RSs0NSBJbmV4YWN0IFJvdW5kZWQKKworLS0gc3Vibm9ybWFscyBhbmQgb3ZlcmZsb3dzCitkcWJhczkwNiB0b1NjaSAnOTllOTk5OTk5OTk5JyAgICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkcWJhczkwNyB0b1NjaSAnOTk5ZTk5OTk5OTk5OScgICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkcWJhczkwOCB0b1NjaSAnMC45ZS05OTk5OTk5OTknICAgICAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmFzOTA5IHRvU2NpICcwLjA5ZS05OTk5OTk5OTknICAgIC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXM5MTAgdG9TY2kgJzAuMWUxMDAwMDAwMDAwJyAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5MTEgdG9TY2kgJzEwZS0xMDAwMDAwMDAwJyAgICAgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJhczkxMiB0b1NjaSAnMC45ZTk5OTk5OTk5OTknICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkcWJhczkxMyB0b1NjaSAnOTllLTk5OTk5OTk5OTknICAgICAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmFzOTE0IHRvU2NpICcxMTFlOTk5OTk5OTk5OScgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzOTE1IHRvU2NpICcxMTExZS05OTk5OTk5OTk5JyAgIC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXM5MTYgdG9TY2kgJzExMTFlLTk5OTk5OTk5OTk5JyAgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJhczkxNyB0b1NjaSAnN2UxMDAwMDAwMDAwJyAgICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCistLSBuZWdhdGl2ZXMgdGhlIHNhbWUKK2RxYmFzOTE4IHRvU2NpICctOTllOTk5OTk5OTk5JyAgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkcWJhczkxOSB0b1NjaSAnLTk5OWU5OTk5OTk5OTknICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5MjAgdG9TY2kgJy0wLjllLTk5OTk5OTk5OScgICAgLT4gLTBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXM5MjEgdG9TY2kgJy0wLjA5ZS05OTk5OTk5OTknICAgLT4gLTBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXM5MjIgdG9TY2kgJy0wLjFlMTAwMDAwMDAwMCcgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzOTIzIHRvU2NpICctMTBlLTEwMDAwMDAwMDAnICAgIC0+IC0wRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmFzOTI0IHRvU2NpICctMC45ZTk5OTk5OTk5OTknICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkcWJhczkyNSB0b1NjaSAnLTk5ZS05OTk5OTk5OTk5JyAgICAtPiAtMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJhczkyNiB0b1NjaSAnLTExMWU5OTk5OTk5OTk5JyAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5MjcgdG9TY2kgJy0xMTExZS05OTk5OTk5OTk5JyAgLT4gLTBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXM5MjggdG9TY2kgJy0xMTExZS05OTk5OTk5OTk5OScgLT4gLTBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXM5MjkgdG9TY2kgJy03ZTEwMDAwMDAwMDAnICAgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gb3ZlcmZsb3cgcmVzdWx0cyBhdCBkaWZmZXJlbnQgcm91bmRpbmcgbW9kZXMKK3JvdW5kaW5nOiAgY2VpbGluZworZHFiYXM5MzAgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzOTMxIHRvU2NpICctN2UxMDAwMCcgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIHVwCitkcWJhczkzMiB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5MzMgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgZG93bgorZHFiYXM5MzQgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzOTM1IHRvU2NpICctN2UxMDAwMCcgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGZsb29yCitkcWJhczkzNiB0b1NjaSAgJzdlMTAwMDAnICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5MzcgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICBoYWxmX3VwCitkcWJhczkzOCB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5MzkgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitkcWJhczk0MCB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5NDEgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgaGFsZl9kb3duCitkcWJhczk0MiB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5NDMgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICBoYWxmX2V2ZW4KKworLS0gTm93IGNoZWNrIDg1NC83NTRyIHNvbWUgc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93IHRvIDAKK2RxYmVtNDAwIHRvU2NpICAxLjAwMDBFLTM4MyAgICAgLT4gMS4wMDAwRS0zODMKK2RxYmVtNDAxIHRvU2NpICAwLjFFLTYxNzIgICAgICAgIC0+IDFFLTYxNzMgICAgICAgU3Vibm9ybWFsCitkcWJlbTQwMiB0b1NjaSAgMC4xMDAwRS02MTcyICAgICAtPiAxLjAwMEUtNjE3MyAgIFN1Ym5vcm1hbAorZHFiZW00MDMgdG9TY2kgIDAuMDEwMEUtNjE3MiAgICAgLT4gMS4wMEUtNjE3NCAgICBTdWJub3JtYWwKK2RxYmVtNDA0IHRvU2NpICAwLjAwMTBFLTYxNzIgICAgIC0+IDEuMEUtNjE3NSAgICAgU3Vibm9ybWFsCitkcWJlbTQwNSB0b1NjaSAgMC4wMDAxRS02MTcyICAgICAtPiAxRS02MTc2ICAgICAgIFN1Ym5vcm1hbAorZHFiZW00MDYgdG9TY2kgIDAuMDAwMTBFLTYxNzIgICAgLT4gMUUtNjE3NiAgICAgU3Vibm9ybWFsIFJvdW5kZWQKK2RxYmVtNDA3IHRvU2NpICAwLjAwMDEzRS02MTcyICAgIC0+IDFFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQwOCB0b1NjaSAgMC4wMDAxNUUtNjE3MiAgICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MDkgdG9TY2kgIDAuMDAwMTdFLTYxNzIgICAgLT4gMkUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDEwIHRvU2NpICAwLjAwMDIzRS02MTcyICAgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQxMSB0b1NjaSAgMC4wMDAyNUUtNjE3MiAgICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MTIgdG9TY2kgIDAuMDAwMjdFLTYxNzIgICAgLT4gM0UtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDEzIHRvU2NpICAwLjAwMDE0OUUtNjE3MiAgIC0+IDFFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQxNCB0b1NjaSAgMC4wMDAxNTBFLTYxNzIgICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MTUgdG9TY2kgIDAuMDAwMTUxRS02MTcyICAgLT4gMkUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDE2IHRvU2NpICAwLjAwMDI0OUUtNjE3MiAgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQxNyB0b1NjaSAgMC4wMDAyNTBFLTYxNzIgICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MTggdG9TY2kgIDAuMDAwMjUxRS02MTcyICAgLT4gM0UtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDE5IHRvU2NpICAwLjAwMDA5RS02MTcyICAgIC0+IDFFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQyMCB0b1NjaSAgMC4wMDAwNUUtNjE3MiAgICAtPiAwRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJlbTQyMSB0b1NjaSAgMC4wMDAwM0UtNjE3MiAgICAtPiAwRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJlbTQyMiB0b1NjaSAgMC4wMDAwMDlFLTYxNzIgICAtPiAwRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJlbTQyMyB0b1NjaSAgMC4wMDAwMDVFLTYxNzIgICAtPiAwRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJlbTQyNCB0b1NjaSAgMC4wMDAwMDNFLTYxNzIgICAtPiAwRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK2RxYmVtNDI1IHRvU2NpICAwLjAwMTA0OUUtNjE3MiAgIC0+IDEuMEUtNjE3NSAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQyNiB0b1NjaSAgMC4wMDEwNTBFLTYxNzIgICAtPiAxLjBFLTYxNzUgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MjcgdG9TY2kgIDAuMDAxMDUxRS02MTcyICAgLT4gMS4xRS02MTc1ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDI4IHRvU2NpICAwLjAwMTE0OUUtNjE3MiAgIC0+IDEuMUUtNjE3NSAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQyOSB0b1NjaSAgMC4wMDExNTBFLTYxNzIgICAtPiAxLjJFLTYxNzUgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MzAgdG9TY2kgIDAuMDAxMTUxRS02MTcyICAgLT4gMS4yRS02MTc1ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZHFiZW00MzIgdG9TY2kgIDAuMDEwMDQ5RS02MTcyICAgLT4gMS4wMEUtNjE3NCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDMzIHRvU2NpICAwLjAxMDA1MEUtNjE3MiAgIC0+IDEuMDBFLTYxNzQgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQzNCB0b1NjaSAgMC4wMTAwNTFFLTYxNzIgICAtPiAxLjAxRS02MTc0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MzUgdG9TY2kgIDAuMDEwMTQ5RS02MTcyICAgLT4gMS4wMUUtNjE3NCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDM2IHRvU2NpICAwLjAxMDE1MEUtNjE3MiAgIC0+IDEuMDJFLTYxNzQgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQzNyB0b1NjaSAgMC4wMTAxNTFFLTYxNzIgICAtPiAxLjAyRS02MTc0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkcWJlbTQ0MCB0b1NjaSAgMC4xMDEwM0UtNjE3MiAgICAtPiAxLjAxMEUtNjE3MyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00NDEgdG9TY2kgIDAuMTAxMDVFLTYxNzIgICAgLT4gMS4wMTBFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDQyIHRvU2NpICAwLjEwMTA3RS02MTcyICAgIC0+IDEuMDExRS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ0MyB0b1NjaSAgMC4xMDExM0UtNjE3MiAgICAtPiAxLjAxMUUtNjE3MyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00NDQgdG9TY2kgIDAuMTAxMTVFLTYxNzIgICAgLT4gMS4wMTJFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDQ1IHRvU2NpICAwLjEwMTE3RS02MTcyICAgIC0+IDEuMDEyRS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RxYmVtNDUwIHRvU2NpICAxLjEwNzMwRS02MTczICAgLT4gMS4xMDdFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDUxIHRvU2NpICAxLjEwNzUwRS02MTczICAgLT4gMS4xMDhFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDUyIHRvU2NpICAxLjEwNzcwRS02MTczICAgLT4gMS4xMDhFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDUzIHRvU2NpICAxLjEwODMwRS02MTczICAgLT4gMS4xMDhFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDU0IHRvU2NpICAxLjEwODUwRS02MTczICAgLT4gMS4xMDhFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDU1IHRvU2NpICAxLjEwODcwRS02MTczICAgLT4gMS4xMDlFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbWFrZSBzdXJlIHNpZ24gT0sKK2RxYmVtNDU2IHRvU2NpICAtMC4xMDEwM0UtNjE3MiAgIC0+IC0xLjAxMEUtNjE3MyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00NTcgdG9TY2kgIC0wLjEwMTA1RS02MTcyICAgLT4gLTEuMDEwRS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ1OCB0b1NjaSAgLTAuMTAxMDdFLTYxNzIgICAtPiAtMS4wMTFFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDU5IHRvU2NpICAtMC4xMDExM0UtNjE3MiAgIC0+IC0xLjAxMUUtNjE3MyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00NjAgdG9TY2kgIC0wLjEwMTE1RS02MTcyICAgLT4gLTEuMDEyRS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ2MSB0b1NjaSAgLTAuMTAxMTdFLTYxNzIgICAtPiAtMS4wMTJFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gJzk5OXMnIGNhc2VzCitkcWJlbTQ2NCB0b1NjaSAgOTk5OTk5RS02MTczICAgICAgICAgLT4gOS45OTk5OUUtNjE2OCBTdWJub3JtYWwKK2RxYmVtNDY1IHRvU2NpICA5OTk5OS4wRS02MTcyICAgICAgICAtPiA5Ljk5OTkwRS02MTY4IFN1Ym5vcm1hbAorZHFiZW00NjYgdG9TY2kgIDk5OTk5LkUtNjE3MiAgICAgICAgIC0+IDkuOTk5OUUtNjE2OCAgU3Vibm9ybWFsCitkcWJlbTQ2NyB0b1NjaSAgOTk5OS45RS02MTcyICAgICAgICAgLT4gOS45OTk5RS02MTY5ICBTdWJub3JtYWwKK2RxYmVtNDY4IHRvU2NpICA5OTkuOTlFLTYxNzIgICAgICAgICAtPiA5Ljk5OTlFLTYxNzAgIFN1Ym5vcm1hbAorZHFiZW00NjkgdG9TY2kgIDk5Ljk5OUUtNjE3MiAgICAgICAgIC0+IDkuOTk5OUUtNjE3MSAgU3Vibm9ybWFsCitkcWJlbTQ3MCB0b1NjaSAgOS45OTk5RS02MTcyICAgICAgICAgLT4gOS45OTk5RS02MTcyICBTdWJub3JtYWwKK2RxYmVtNDcxIHRvU2NpICAwLjk5OTk5RS02MTcyICAgICAgICAtPiAxLjAwMDBFLTYxNzIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDcyIHRvU2NpICAwLjA5OTk5OUUtNjE3MiAgICAgICAtPiAxLjAwMEUtNjE3MyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00NzMgdG9TY2kgIDAuMDA5OTk5OUUtNjE3MiAgICAgIC0+IDEuMDBFLTYxNzQgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ3NCB0b1NjaSAgMC4wMDA5OTk5OUUtNjE3MiAgICAgLT4gMS4wRS02MTc1ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDc1IHRvU2NpICAwLjAwMDA5OTk5OUUtNjE3MiAgICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00NzYgdG9TY2kgIDAuMDAwMDA5OTk5OUUtNjE3MiAgIC0+IDBFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmVtNDc3IHRvU2NpICAwLjAwMDAwMDk5OTk5RS02MTcyICAtPiAwRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJlbTQ3OCB0b1NjaSAgMC4wMDAwMDAwOTk5OTlFLTYxNzIgLT4gMEUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSBFeHBvbmVudHMgd2l0aCBpbnNpZ25pZmljYW50IGxlYWRpbmcgemVyb3MKK2RxYmFzMTAwMSB0b1NjaSAgMWU5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWJhczEwMDIgdG9TY2kgIDFlMDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMTAwMyB0b1NjaSAgMWUwMDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMTAwNCB0b1NjaSAgMWUwMDA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWJhczEwMDUgdG9TY2kgIDFlMDAwMDAwMDAwMDAwOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFiYXMxMDA2IHRvU2NpICAxZTAwMDAwMDAwMDAwMTAwMDAwMDAwNyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMTAwNyB0b1NjaSAgMWUtOTk5OTk5OTk5IC0+IDBFLTYxNzYgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXMxMDA4IHRvU2NpICAxZS0wOTk5OTk5OTk5IC0+IDBFLTYxNzYgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJhczEwMDkgdG9TY2kgIDFlLTAwOTk5OTk5OTk5IC0+IDBFLTYxNzYgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmFzMTAxMCB0b1NjaSAgMWUtMDAwOTk5OTk5OTk5IC0+IDBFLTYxNzYgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXMxMDExIHRvU2NpICAxZS0wMDAwMDAwMDAwMDA5OTk5OTk5OTkgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJhczEwMTIgdG9TY2kgIDFlLTAwMDAwMDAwMDAwMTAwMDAwMDAwNyAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gY2hlY2sgZm9yIGRvdWJsZS1yb3VuZGVkIHN1Ym5vcm1hbHMKK2RxYmFzMTA0MSB0b1NjaSAgICAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTUyNDQ0RS02MTQ0IC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExNTI0RS02MTQ0IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkcWJhczEwNDIgdG9TY2kgICAgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE1MjQ0NUUtNjE0NCAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTUyNEUtNjE0NCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFiYXMxMDQzIHRvU2NpICAgICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExNTI0NDZFLTYxNDQgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE1MjRFLTYxNDQgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworLS0gY2xhbXBlZCB6ZXJvcyBbc2VlIGFsc28gY2xhbXAuZGVjVGVzdF0KK2RxYmFzMTA3NSB0b1NjaSAgIDBlKzEwMDAwICAtPiAgMEUrNjExMSBDbGFtcGVkCitkcWJhczEwNzYgdG9TY2kgICAwZS0xMDAwMCAgLT4gIDBFLTYxNzYgIENsYW1wZWQKK2RxYmFzMTA3NyB0b1NjaSAgLTBlKzEwMDAwICAtPiAtMEUrNjExMSBDbGFtcGVkCitkcWJhczEwNzggdG9TY2kgIC0wZS0xMDAwMCAgLT4gLTBFLTYxNzYgIENsYW1wZWQKKworLS0gZXh0cmVtZSB2YWx1ZXMgZnJvbSBuZXh0LXdpZGVyCitkcWJhczExMDEgdG9TY2kgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrMTU3Mjg2NCAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWJhczExMDIgdG9TY2kgLTFFLTE1NzI4NjMgLT4gLTBFLTYxNzYgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZHFiYXMxMTAzIHRvU2NpIC0xRS0xNTcyOTMyIC0+IC0wRS02MTc2IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2RxYmFzMTEwNCB0b1NjaSAtMCAtPiAtMAorZHFiYXMxMTA1IHRvU2NpICswIC0+ICAwCitkcWJhczExMDYgdG9TY2kgKzFFLTE1NzI5MzIgLT4gIDBFLTYxNzYgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZHFiYXMxMTA3IHRvU2NpICsxRS0xNTcyODYzIC0+ICAwRS02MTc2IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2RxYmFzMTEwOCB0b1NjaSArOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSsxNTcyODY0IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNhbm9uaWNhbC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNhbm9uaWNhbC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmRiODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ2Fub25pY2FsLmRlY1Rlc3QKQEAgLTAsMCArMSwzNzIgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFDYW5vbmljYWwuZGVjVGVzdCAtLSB0ZXN0IGRlY1F1YWQgY2Fub25pY2FsIHJlc3VsdHMgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIGZpbGUgdGVzdHMgdGhhdCBjb3B5IG9wZXJhdGlvbnMgbGVhdmUgdW5jYW5vbmljYWwgb3BlcmFuZHMKKy0tIHVuY2hhbmdlZCwgYW5kIHZpY2UgdmVyc2EKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNRdWFkcy4KK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFVuY2Fub25pY2FsIGRlY2xldHMgYXJlOiBhYmMsIHdoZXJlOgorLS0gICBhPTEsMiwzCistLSAgIGI9Niw3LGUsZgorLS0gICBjPWUsZgorCistLSBhc3NlcnQgc29tZSBzdGFuZGFyZCAoY2Fub25pY2FsKSB2YWx1ZXM7IHRoaXMgdGVzdHMgdGhhdCBGcm9tU3RyaW5nCistLSBwcm9kdWNlcyBjYW5vbmljYWwgcmVzdWx0cyAobWFueSBtb3JlIGluIGRlY2ltYWxOTikKK2RxY2FuMDAxIGFwcGx5IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDAyIGFwcGx5IDAgICAgICAgICAgICAgICAgICAgICAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjAwMyBhcHBseSAxICAgICAgICAgICAgICAgICAgICAgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFjYW4wMDQgYXBwbHkgLTEgICAgICAgICAgICAgICAgICAgICAtPiAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxY2FuMDA1IGFwcGx5IEluZmluaXR5ICAgICAgICAgICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjAwNiBhcHBseSAtSW5maW5pdHkgICAgICAgICAgICAgIC0+ICNmODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4wMDcgYXBwbHkgLU5hTiAgICAgICAgICAgICAgICAgICAtPiAjZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMDA4IGFwcGx5IC1zTmFOICAgICAgICAgICAgICAgICAgLT4gI2ZlMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjAwOSBhcHBseSAgTmFOOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDEwIGFwcGx5IHNOYU45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZGVjYW4wMTEgYXBwbHkgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgLT4gIzZlMDgwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjAxMiBhcHBseSA3LjUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAjMjIwNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzZDAKK2RxY2FuMDEzIGFwcGx5IDkuOTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICMyMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZgorCistLSBCYXNlIHRlc3RzIGZvciBjYW5vbmljYWwgZW5jb2RpbmdzIChpbmRpdmlkdWFsIG9wZXJhdG9yCistLSBwcm9wYWdhdGlvbiBpcyB0ZXN0ZWQgbGF0ZXIpCisKKy0tIEZpbml0ZXM6IGRlY2xldHMgaW4gY29lZmZpY2llbnQKK2RxY2FuMDIxIGNhbm9uaWNhbCAgIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wMjIgY2Fub25pY2FsICAjNzdmZmZmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjAyMyBjYW5vbmljYWwgICM3N2ZmY2ZmZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDI0IGNhbm9uaWNhbCAgIzc3ZmZjZmYzZmZmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wMjUgY2Fub25pY2FsICAjNzdmZmNmZjNmY2ZmZmZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjAyNiBjYW5vbmljYWwgICM3N2ZmY2ZmM2ZjZmYzZmZmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDI3IGNhbm9uaWNhbCAgIzc3ZmZjZmYzZmNmZjNmY2ZmZmZjZmYzZmNmZjNmY2ZmIC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wMjggY2Fub25pY2FsICAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmZmZjNmY2ZmM2ZjZmYgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjAyOSBjYW5vbmljYWwgICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmZmZjZmYzZmNmZiAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDMwIGNhbm9uaWNhbCAgIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmZmZjNmY2ZmIC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wMzEgY2Fub25pY2FsICAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmZmZjZmYgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjAzMiBjYW5vbmljYWwgICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmZmZiAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKworLS0gTmFOOiBkZWNsZXRzIGluIHBheWxvYWQKK2RxY2FuMDYxIGNhbm9uaWNhbCAgIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wNjIgY2Fub25pY2FsICAjN2MwMDBmZmZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjA2MyBjYW5vbmljYWwgICM3YzAwMGZmM2ZmZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDY0IGNhbm9uaWNhbCAgIzdjMDAwZmYzZmNmZmZmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wNjUgY2Fub25pY2FsICAjN2MwMDBmZjNmY2ZmM2ZmZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjA2NiBjYW5vbmljYWwgICM3YzAwMGZmM2ZjZmYzZmNmZmZmY2ZmM2ZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDY3IGNhbm9uaWNhbCAgIzdjMDAwZmYzZmNmZjNmY2ZmM2ZmZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wNjggY2Fub25pY2FsICAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZmZmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjA2OSBjYW5vbmljYWwgICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZmZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDcwIGNhbm9uaWNhbCAgIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZmZmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wNzEgY2Fub25pY2FsICAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZmZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCistLSBOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RxY2FuMDgxIGNhbm9uaWNhbCAgIzdkMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wODIgY2Fub25pY2FsICAjN2M4MDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjA4MyBjYW5vbmljYWwgICM3YzQwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDg0IGNhbm9uaWNhbCAgIzdjMjAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wODUgY2Fub25pY2FsICAjN2MxMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjA4NiBjYW5vbmljYWwgICM3YzA4MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDg3IGNhbm9uaWNhbCAgIzdjMDQwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wODggY2Fub25pY2FsICAjN2MwMjBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjA4OSBjYW5vbmljYWwgICM3YzAxMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDkwIGNhbm9uaWNhbCAgIzdjMDA4ZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wOTEgY2Fub25pY2FsICAjN2MwMDRmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCisKKy0tIHNOYU46IGRlY2xldHMgaW4gcGF5bG9hZAorZHFjYW4xMDEgY2Fub25pY2FsICAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjEwMiBjYW5vbmljYWwgICM3ZTAwMGZmZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTAzIGNhbm9uaWNhbCAgIzdlMDAwZmYzZmZmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMDQgY2Fub25pY2FsICAjN2UwMDBmZjNmY2ZmZmZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjEwNSBjYW5vbmljYWwgICM3ZTAwMGZmM2ZjZmYzZmZmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTA2IGNhbm9uaWNhbCAgIzdlMDAwZmYzZmNmZjNmY2ZmZmZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMDcgY2Fub25pY2FsICAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmZmZjNmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjEwOCBjYW5vbmljYWwgICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmZmZjZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTA5IGNhbm9uaWNhbCAgIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmZmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMDAgY2Fub25pY2FsICAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmZmZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjExMSBjYW5vbmljYWwgICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmZmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKy0tIHNOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RxY2FuMTIxIGNhbm9uaWNhbCAgIzdmMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMjIgY2Fub25pY2FsICAjN2U4MDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjEyMyBjYW5vbmljYWwgICM3ZTQwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTI0IGNhbm9uaWNhbCAgIzdlMjAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMjUgY2Fub25pY2FsICAjN2UxMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjEyNiBjYW5vbmljYWwgICM3ZTA4MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTI3IGNhbm9uaWNhbCAgIzdlMDQwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMjggY2Fub25pY2FsICAjN2UwMjBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjEyOSBjYW5vbmljYWwgICM3ZTAxMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTMwIGNhbm9uaWNhbCAgIzdlMDA4ZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMzEgY2Fub25pY2FsICAjN2UwMDRmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCisKKy0tIEluZjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMKK2RxY2FuMTM3IGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xMzggY2Fub25pY2FsICAjNzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjEzOSBjYW5vbmljYWwgICM3YTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTQwIGNhbm9uaWNhbCAgIzc4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNDEgY2Fub25pY2FsICAjNzg0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE0MiBjYW5vbmljYWwgICM3ODIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTQzIGNhbm9uaWNhbCAgIzc4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNDQgY2Fub25pY2FsICAjNzgwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE0NSBjYW5vbmljYWwgICM3ODA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTQ2IGNhbm9uaWNhbCAgIzc4MDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNDcgY2Fub25pY2FsICAjNzgwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE0OCBjYW5vbmljYWwgICM3ODAwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTQ5IGNhbm9uaWNhbCAgIzc4MDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCistLSBJbmY6IGNvZWZmaWNpZW50IGNvbnRpbnVhdGlvbiBiaXRzIChmaXJzdCwgbGFzdCwgYW5kIGEgZmV3IG90aGVycykKK2RxY2FuMTUwIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNTEgY2Fub25pY2FsICAjNzgwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE1MiBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTUzIGNhbm9uaWNhbCAgIzc4MDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNTQgY2Fub25pY2FsICAjNzgwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE1NSBjYW5vbmljYWwgICM3ODAwMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTU2IGNhbm9uaWNhbCAgIzc4MDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNTcgY2Fub25pY2FsICAjNzgwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE1OCBjYW5vbmljYWwgICM3ODAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTU5IGNhbm9uaWNhbCAgIzc4MDAwMDAwMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNjAgY2Fub25pY2FsICAjNzgwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE2MSBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTYyIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDgwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNjMgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE2NCBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTY1IGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDgwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNjYgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE2NyBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTY4IGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAwMDgwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNjkgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE3MCBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTcxIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNzIgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE3MyBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTc0IGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNzUgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE3NiBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTc3IGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNzggY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE3OSBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTgwIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xODEgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKKworLS0gTm93IHRoZSBvcGVyYXRvcnMgLS0gdHJ5aW5nIHRvIGNoZWNrIHBhdGhzIHRoYXQgbWlnaHQgZmFpbCB0bworLS0gY2Fub25pY2FsaXplIHByb3BhZ2F0ZWQgb3BlcmFuZHMKKworLS0tLS0gQWRkOgorLS0gRmluaXRlczogbmV1dHJhbCAwCitkcWNhbjIwMiBhZGQgIDBFKzYxNDQgIzc3ZmZjZmYzZmNmZjNmY2ZmZmZjZmYzZmNmZjNmY2ZmICAgICAgICAgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjIwMyBhZGQgICAgICAgICAgIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmZmZjNmY2ZmIDBFKzYxNDQgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCistLSB0aW55IHplcm8KK2RxY2FuMjA0IGFkZCAgMEUtNjE3NiAjNzdmZmNmZjNmZmZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgICAgICAgICAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgUm91bmRlZAorZHFjYW4yMDUgYWRkICAgICAgICAgICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmZmZiAwRS02MTc2IC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiBSb3VuZGVkCistLSB0aW55IG5vbiB6ZXJvCitkcWNhbjIwNiBhZGQgLTFFLTYxNzYgIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZmZmZmZmICAgICAgICAgIC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiBJbmV4YWN0IFJvdW5kZWQKK2RxY2FuMjA3IGFkZCAgICAgICAgICAjNzdmZmNmZmZmZmZmZmZmZmZmZmZmZmZmZmZmM2ZjZmYgLTFFLTYxNzYgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIEluZXhhY3QgUm91bmRlZAorLS0gTmFOOiBkZWNsZXRzIGluIHBheWxvYWQKK2RxY2FuMjExIGFkZCAgMCAgIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmZmZmZmZjNmY2ZmICAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjIxMiBhZGQgICAgICM3YzAwMGZmM2ZjZmYzZmNmZmZmZmZmM2ZjZmYzZmNmZiAwIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorLS0gTmFOOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cyBbZXhjbHVkaW5nIHNOYU4gc2VsZWN0b3JdCitkcWNhbjIxMyBhZGQgIDAgICM3YzQwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4yMTQgYWRkICAgICAjN2MwMjBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgMCAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKy0tIHNOYU46IGRlY2xldHMgaW4gcGF5bG9hZAorZHFjYW4yMTUgYWRkICAwICAjN2UwMDBmZjNmY2ZmZmZjZmYzZmNmZjNmY2ZmM2ZjZmYgICAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgIEludmFsaWRfb3BlcmF0aW9uCitkcWNhbjIxNiBhZGQgICAgICM3ZTAwM2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAwIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgSW52YWxpZF9vcGVyYXRpb24KKy0tIHNOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RxY2FuMjE3IGFkZCAgMCAgIzdlNTAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICBJbnZhbGlkX29wZXJhdGlvbgorZHFjYW4yMTggYWRkICAgICAjN2UwZTBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgMCAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgIEludmFsaWRfb3BlcmF0aW9uCistLSBJbmY6IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzCitkcWNhbjIyMCBhZGQgIDAgICM3ODAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4yMjEgYWRkICAgICAjNzg2ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tIEluZjogY29lZmZpY2llbnQgY29udGludWF0aW9uIGJpdHMKK2RxY2FuMjIyIGFkZCAgMCAgIzc4MDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjIyMyBhZGQgICAgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4yMjQgYWRkICAwICAjNzgwMDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMjI1IGFkZCAgICAgIzc4MDAwMDAwMDAwMGYwMDAwMDAwMDAwMDAwMDAwMDAwIDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjIyNiBhZGQgIDAgICM3ODAwMDAwMDAwMDAwMDAwMDAwNTAwMDAwMDAwMDAwMCAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4yMjcgYWRkICAgICAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYTAwMDAgMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworLS0tLS0gQ2xhc3M6IFtkb2VzIG5vdCByZXR1cm4gZW5jb2RlZF0KKworLS0tLS0gQ29tcGFyZToKK2RxY2FuMjMxIGNvbXBhcmUgLUluZiAgIDEgICAgIC0+ICAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxY2FuMjMyIGNvbXBhcmUgLUluZiAgLUluZiAgIC0+ICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMjMzIGNvbXBhcmUgIDEgICAgLUluZiAgIC0+ICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxY2FuMjM0IGNvbXBhcmUgICM3YzAxMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZmZmZmZmNmZiAgICAgLTEwMDAgIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4yMzUgY29tcGFyZSAgIzdlMDA0ZmYzZmNmZjNmY2ZmM2ZmZmZmZmNmZjNmY2ZmICAgICAtMTAwMCAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCisKKy0tLS0tIENvbXBhcmVTaWc6CitkcWNhbjI0MSBjb21wYXJlc2lnIC1JbmYgICAxICAgICAtPiAgI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcWNhbjI0MiBjb21wYXJlc2lnIC1JbmYgIC1JbmYgICAtPiAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjI0MyBjb21wYXJlc2lnICAxICAgIC1JbmYgICAtPiAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcWNhbjI0NCBjb21wYXJlc2lnICAjN2M0MDBmZjNmZmZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgICAtMTAwMCAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KK2RxY2FuMjQ1IGNvbXBhcmVzaWcgICM3ZTA1MGZmM2ZjZmZmZmZmZjNmY2ZmM2ZjZmYzZmNmZiAgIC0xMDAwIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorCistLS0tLSBDb3B5OiBbZG9lcyBub3QgdXN1YWxseSBjYW5vbmljYWxpemVdCistLSBmaW5pdGVzCitkcWNhbjI1MCBjb3B5ICAjNmUwODBmZjNmY2ZmM2ZjZmZmZmZmZjNmY2ZmZmZmZmYgLT4gIzZlMDgwZmYzZmNmZjNmY2ZmZmZmZmYzZmNmZmZmZmZmCitkcWNhbjI1MSBjb3B5ICAjZWUwODBmZjNmY2ZmM2ZmZmYzZmNmZjNmZmZmM2ZjZmYgLT4gI2VlMDgwZmYzZmNmZjNmZmZmM2ZjZmYzZmZmZjNmY2ZmCistLSBOYU5zCitkcWNhbjI1MiBjb3B5ICAjN2MwMDBmZjNmY2ZmZmZmZmZmZmZmZmZmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZmZmZmZmZmZmZmZmZmNmZjNmY2ZmCitkcWNhbjI1MyBjb3B5ICAjN2MwODBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDgwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCistLSBzTmFOCitkcWNhbjI1NCBjb3B5ICAjN2UwMDNmZjNmY2ZmZmZmZmZmZmZmZmZmY2ZmM2ZjZmYgLT4gIzdlMDAzZmYzZmNmZmZmZmZmZmZmZmZmZmNmZjNmY2ZmCitkcWNhbjI1NSBjb3B5ICAjN2UxMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdlMTAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCistLSBJbmYKK2RxY2FuMjU4IGNvcHkgICM3ODAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMjU5IGNvcHkgICM3ODAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDEwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAxMDAwMDAKKworLS0tLS0gQ29weUFiczogW2RvZXMgbm90IHVzdWFsbHkgY2Fub25pY2FsaXplXQorLS0gZmluaXRlcworZHFjYW4yNjAgY29weWFicyAgIzZlMDgwZmYzZmNmZjNmY2ZmZmZmZmYzZmNmZmZmZmZmIC0+ICM2ZTA4MGZmM2ZjZmYzZmNmZmZmZmZmM2ZjZmZmZmZmZgorZHFjYW4yNjEgY29weWFicyAgI2VlMDgwZmYzZmNmZjNmZmZmM2ZjZmYzZmZmZjNmY2ZmIC0+ICM2ZTA4MGZmM2ZjZmYzZmZmZjNmY2ZmM2ZmZmYzZmNmZgorLS0gTmFOcworZHFjYW4yNjIgY29weWFicyAgI2ZjMDAwZmYzZmNmZmZmZmZmZmZmZmZmZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmZmZmZmZmZmZmZmZmZjZmYzZmNmZgorZHFjYW4yNjMgY29weWFicyAgI2ZjMDgwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzA4MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorLS0gc05hTgorZHFjYW4yNjQgY29weWFicyAgI2ZlMDAzZmYzZmNmZmZmZmZmZmZmZmZmZmNmZjNmY2ZmIC0+ICM3ZTAwM2ZmM2ZjZmZmZmZmZmZmZmZmZmZjZmYzZmNmZgorZHFjYW4yNjUgY29weWFicyAgI2ZlMTAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTEwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorLS0gSW5mCitkcWNhbjI2OCBjb3B5YWJzICAjZjgwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjI2OSBjb3B5YWJzICAjZjgwMDAwMDAwMDAwMDA3MDA3MDA3MDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwNzAwNzAwNzAwMDAwMDAwMDAwCisKKy0tLS0tIENvcHlOZWdhdGU6IFtkb2VzIG5vdCB1c3VhbGx5IGNhbm9uaWNhbGl6ZV0KKy0tIGZpbml0ZXMKK2RxY2FuMjcwIGNvcHluZWdhdGUgICM2ZTA4MGZmM2ZjZmYzZmNmZmZmZmZmM2ZjZmZmZmZmZiAtPiAjZWUwODBmZjNmY2ZmM2ZjZmZmZmZmZjNmY2ZmZmZmZmYKK2RxY2FuMjcxIGNvcHluZWdhdGUgICNlZTA4MGZmM2ZjZmYzZmZmZjNmY2ZmM2ZmZmYzZmNmZiAtPiAjNmUwODBmZjNmY2ZmM2ZmZmYzZmNmZjNmZmZmM2ZjZmYKKy0tIE5hTnMKK2RxY2FuMjcyIGNvcHluZWdhdGUgICM3YzAwMGZmM2ZjZmZmZmZmZmZmZmZmM2ZjZmYzZmNmZiAtPiAjZmMwMDBmZjNmY2ZmZmZmZmZmZmZmZjNmY2ZmM2ZjZmYKK2RxY2FuMjczIGNvcHluZWdhdGUgICM3YzA4MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjZmMwODBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKy0tIHNOYU4KK2RxY2FuMjc0IGNvcHluZWdhdGUgICM3ZTAwM2ZmM2ZjZmZmZmZmZmZmZmZmZmZjZmYzZmNmZiAtPiAjZmUwMDNmZjNmY2ZmZmZmZmZmZmZmZmZmY2ZmM2ZjZmYKK2RxY2FuMjc1IGNvcHluZWdhdGUgICM3ZTEwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjZmUxMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKy0tIEluZgorZHFjYW4yNzggY29weW5lZ2F0ZSAgIzc4MDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICNmODAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4yNzkgY29weW5lZ2F0ZSAgIzc4MDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMTAwMDAwIC0+ICNmODAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDEwMDAwMAorCistLS0tLSBDb3B5U2lnbjogW2RvZXMgbm90IHVzdWFsbHkgY2Fub25pY2FsaXplXQorLS0gZmluaXRlcworZHFjYW4yODAgY29weXNpZ24gICM2ZTA4MGZmM2ZjZmYzZmNmZmZmZmZmM2ZjZmZmZmZmZiAtMSAtPiAjZWUwODBmZjNmY2ZmM2ZjZmZmZmZmZjNmY2ZmZmZmZmYKK2RxY2FuMjgxIGNvcHlzaWduICAjZWUwODBmZjNmY2ZmM2ZmZmYzZmNmZjNmZmZmM2ZjZmYgIDEgLT4gIzZlMDgwZmYzZmNmZjNmZmZmM2ZjZmYzZmZmZjNmY2ZmCistLSBOYU5zCitkcWNhbjI4MiBjb3B5c2lnbiAgIzdjMDAwZmYzZmNmZmZmZmZmZmZmZmZmZmNmZjNmY2ZmIC0xIC0+ICNmYzAwMGZmM2ZjZmZmZmZmZmZmZmZmZmZjZmYzZmNmZgorZHFjYW4yODMgY29weXNpZ24gICM3YzA4MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgMSAtPiAjN2MwODBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKy0tIHNOYU4KK2RxY2FuMjg0IGNvcHlzaWduICAjN2UwMDNmZjNmY2ZmZmZmZmZmZmZmZmZmY2ZmM2ZjZmYgLTEgLT4gI2ZlMDAzZmYzZmNmZmZmZmZmZmZmZmZmZmNmZjNmY2ZmCitkcWNhbjI4NSBjb3B5c2lnbiAgIzdlMTAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICAxIC0+ICM3ZTEwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorLS0gSW5mCitkcWNhbjI4OCBjb3B5c2lnbiAgIzc4MDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0xIC0+ICNmODAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4yODkgY29weXNpZ24gICM3ODAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDEwMDAwMCAgMSAtPiAjNzgwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAxMDAwMDAKKworLS0tLS0gTXVsdGlwbHk6CistLSBGaW5pdGVzOiBuZXV0cmFsIDAKK2RxY2FuMzAyIG11bHRpcGx5ICAxICAjNzdmZmZmM2ZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAgICAtPiAjNzdmZmZmM2ZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMzAzIG11bHRpcGx5ICAgICAjNzdmY2ZmZmZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAgMSAgICAgICAgICAgICAtPiAjNzdmY2NmZmZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAKKy0tIG5lZ2F0aXZlCitkcWNhbjMwNiBtdWx0aXBseSAtMSAgIzc3ZmZmZjNmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgLT4gI2Y3ZmZmZjNmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjMwNyBtdWx0aXBseSAgICAgIzc3ZmNmZmZmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwIC0xICAgICAgICAgICAgLT4gI2Y3ZmNjZmZmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwCistLSBOYU46IGRlY2xldHMgaW4gcGF5bG9hZAorZHFjYW4zMTEgbXVsdGlwbHkgIDEgICM3YzAzZmYzZmNmZjNmY2ZmMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgIC0+ICM3YzAwM2YzZmNmZjNmY2ZmMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4zMTIgbXVsdGlwbHkgICAgICM3YzAzZmYzZmNmZjNmY2ZmMDAwMDAwMDAwMDAwMDAwMCAxICAgICAgICAgICAgIC0+ICM3YzAwM2YzZmNmZjNmY2ZmMDAwMDAwMDAwMDAwMDAwMAorLS0gTmFOOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cyBbZXhjbHVkaW5nIHNOYU4gc2VsZWN0b3JdCitkcWNhbjMxMyBtdWx0aXBseSAgMSAgIzdjNDBmZjNmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgLT4gIzdjMDAzZjNmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjMxNCBtdWx0aXBseSAgICAgIzdjNDBmZjNmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwIDEgICAgICAgICAgICAgLT4gIzdjMDAzZjNmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwCistLSBzTmFOOiBkZWNsZXRzIGluIHBheWxvYWQKK2RxY2FuMzE1IG11bHRpcGx5ICAxICAjN2UwMGZmZmZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAgICAtPiAjN2MwMDBmZmZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAgSW52YWxpZF9vcGVyYXRpb24KK2RxY2FuMzE2IG11bHRpcGx5ICAgICAjN2UwMGZmZmZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAgMSAgICAgICAgICAgICAtPiAjN2MwMDBmZmZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAgSW52YWxpZF9vcGVyYXRpb24KKy0tIHNOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RxY2FuMzE3IG11bHRpcGx5ICAxICAjN2U4MGZmM2ZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAgICAtPiAjN2MwMDNmM2ZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAgSW52YWxpZF9vcGVyYXRpb24KK2RxY2FuMzE4IG11bHRpcGx5ICAgICAjN2U4MGZmM2ZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAgMSAgICAgICAgICAgICAtPiAjN2MwMDNmM2ZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAgSW52YWxpZF9vcGVyYXRpb24KKy0tIEluZjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMKK2RxY2FuMzIwIG11bHRpcGx5ICAxICAjNzg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMzIxIG11bHRpcGx5ICAgICAjNzg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMSAgICAgICAgICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tIEluZjogY29lZmZpY2llbnQgY29udGludWF0aW9uIGJpdHMKK2RxY2FuMzIyIG11bHRpcGx5ICAxICAjNzgwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMzIzIG11bHRpcGx5ICAgICAjNzgwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMSAgICAgICAgICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMzI0IG11bHRpcGx5ICAxICAjNzgwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMzI1IG11bHRpcGx5ICAgICAjNzgwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAgMSAgICAgICAgICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMzI2IG11bHRpcGx5ICAxICAjNzgwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMzI3IG11bHRpcGx5ICAgICAjNzgwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMSAgICAgICAgICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworLS0tLS0gUXVhbnRpemU6CitkcWNhbjQwMSBxdWFudGl6ZSAgI2VlMDgwZmYzZmNmZjNmY2ZmM2ZmZmZmZmZmZjNmY2ZmIDAgICAgLT4gI2VlMDgwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjQwMiBxdWFudGl6ZSAgI2VlMDgwZmYzZmZmZmZmZmZmZmZjZmYzZmNmZjNmY2ZmIDAgICAgLT4gI2VlMDgwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjQwMyBxdWFudGl6ZSAgIzc4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZiAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjQwNCBxdWFudGl6ZSAgIzc4MDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC1JbmYgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjQxMCBxdWFudGl6ZSAgIzdjMDgwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICAxICAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjQxMSBxdWFudGl6ZSAgI2ZjMDAwZmYzZmNmZmZmZmZmM2ZjZmYzZmNmZjNmY2ZmICAxICAgLT4gI2ZjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjQxMiBxdWFudGl6ZSAgIzdlMTAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICAxICAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCitkcWNhbjQxMyBxdWFudGl6ZSAgI2ZlMDAwZmYzZmNmZjNmY2ZmM2ZmZmZmZmNmZjNmY2ZmICAxICAgLT4gI2ZjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCisKKy0tLS0tIFN1YnRyYWN0OgorLS0gRmluaXRlczogbmV1dHJhbCAwCitkcWNhbjUwMiBzdWJ0cmFjdCAgMEUrNjE0NCAjNzdmZmNmZjNmY2ZmM2ZjZmZmZmNmZjNmY2ZmM2ZjZmYgICAgICAgICAtPiAjZjdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuNTAzIHN1YnRyYWN0ICAgICAgICAgICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZmZmYzZmNmZiAwRSs2MTQ0IC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorLS0gdGlueSB6ZXJvCitkcWNhbjUwNCBzdWJ0cmFjdCAgMEUtNjE3NiAjNzdmZmNmZjNmZmZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgICAgICAgICAtPiAjZjdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgUm91bmRlZAorZHFjYW41MDUgc3VidHJhY3QgICAgICAgICAgIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmZmZmIDBFLTYxNzYgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIFJvdW5kZWQKKy0tIHRpbnkgbm9uIHplcm8KK2RxY2FuNTA2IHN1YnRyYWN0IC0xRS02MTc2ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmZmZmZmZiAgICAgICAgICAtPiAjZjdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgSW5leGFjdCBSb3VuZGVkCitkcWNhbjUwNyBzdWJ0cmFjdCAgICAgICAgICAjNzdmZmNmZmZmZmZmZmZmZmZmZmZmZmZmZmZmM2ZjZmYgLTFFLTYxNzYgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIEluZXhhY3QgUm91bmRlZAorLS0gTmFOOiBkZWNsZXRzIGluIHBheWxvYWQKK2RxY2FuNTExIHN1YnRyYWN0ICAwICAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZmZmZmZmM2ZjZmYgICAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuNTEyIHN1YnRyYWN0ICAgICAjN2MwMDBmZjNmY2ZmM2ZjZmZmZmZmZjNmY2ZmM2ZjZmYgMCAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKy0tIE5hTjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMgW2V4Y2x1ZGluZyBzTmFOIHNlbGVjdG9yXQorZHFjYW41MTMgc3VidHJhY3QgIDAgICM3YzQwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW41MTQgc3VidHJhY3QgICAgICM3YzAyMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAwIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorLS0gc05hTjogZGVjbGV0cyBpbiBwYXlsb2FkCitkcWNhbjUxNSBzdWJ0cmFjdCAgMCAgIzdlMDAwZmYzZmNmZmZmY2ZmM2ZjZmYzZmNmZjNmY2ZmICAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICBJbnZhbGlkX29wZXJhdGlvbgorZHFjYW41MTYgc3VidHJhY3QgICAgICM3ZTAwM2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAwIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgSW52YWxpZF9vcGVyYXRpb24KKy0tIHNOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RxY2FuNTE3IHN1YnRyYWN0ICAwICAjN2U1MDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgICAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgIEludmFsaWRfb3BlcmF0aW9uCitkcWNhbjUxOCBzdWJ0cmFjdCAgICAgIzdlMGUwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIDAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICBJbnZhbGlkX29wZXJhdGlvbgorLS0gSW5mOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cworZHFjYW41MjAgc3VidHJhY3QgIDAgICM3ODAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+ICNmODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW41MjEgc3VidHJhY3QgICAgICM3ODY4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorLS0gSW5mOiBjb2VmZmljaWVudCBjb250aW51YXRpb24gYml0cworZHFjYW41MjIgc3VidHJhY3QgIDAgICM3ODAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+ICNmODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW41MjMgc3VidHJhY3QgICAgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW41MjQgc3VidHJhY3QgIDAgICM3ODAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+ICNmODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW41MjUgc3VidHJhY3QgICAgICM3ODAwMDAwMDAwMDBmMDAwMDAwMDAwMDAwMDAwMDAwMCAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW41MjYgc3VidHJhY3QgIDAgICM3ODAwMDAwMDAwMDAwMDAwMDAwNTAwMDAwMDAwMDAwMCAgIC0+ICNmODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW41Mjcgc3VidHJhY3QgICAgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBhMDAwMCAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCistLS0tLSBUb0ludGVncmFsOgorZHFjYW42MDEgdG9pbnRlZ3JhbHggICM2ZTA4MGZmM2ZkZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgLT4gIzZlMDgwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjYwMiB0b2ludGVncmFseCAgI2VlMDgwZmYzZmNmZjNmZmZmM2ZjZmYzZmNmZjNmY2ZmICAtPiAjZWUwODBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuNjAzIHRvaW50ZWdyYWx4ICAjNzg4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW42MDQgdG9pbnRlZ3JhbHggICM3ODAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjYxNCB0b2ludGVncmFseCAgIzdjMTAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuNjE1IHRvaW50ZWdyYWx4ICAjZmMwMDBmZjNmY2ZmM2ZjZmYzZmNmZmZmY2ZmM2ZjZmYgIC0+ICNmYzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW42MTYgdG9pbnRlZ3JhbHggICM3ZTAxMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICBJbnZhbGlkX29wZXJhdGlvbgorZHFjYW42MTcgdG9pbnRlZ3JhbHggICNmZTAwMGZmM2ZjZmYzZmNmZjNmZGZmM2ZjZmYzZmNmZiAgLT4gI2ZjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICBJbnZhbGlkX29wZXJhdGlvbgorLS0gdW5jYW5vbmljYWwgMzk5OSwgMzkuOTksIDMuOTksIDAuMzk5LCAgICAgICAgICAgICAgICAgIGFuZCBuZWdhdGl2ZXMKK2RxY2FuNjE4IHRvaW50ZWdyYWx4ICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZmYgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGNmZgorZHFjYW42MTkgdG9pbnRlZ3JhbHggICMyMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZmZiAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwICBJbmV4YWN0IFJvdW5kZWQKK2RxY2FuNjIwIHRvaW50ZWdyYWx4ICAjMjIwNzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZmYgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNCAgSW5leGFjdCBSb3VuZGVkCitkcWNhbjYyMSB0b2ludGVncmFseCAgIzIyMDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmZmICAtPiAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIEluZXhhY3QgUm91bmRlZAorZHFjYW42MjIgdG9pbnRlZ3JhbHggICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZmZiAgLT4gI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwY2ZmCitkcWNhbjYyMyB0b2ludGVncmFseCAgI2EyMDc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmZmICAtPiAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDAgIEluZXhhY3QgUm91bmRlZAorZHFjYW42MjQgdG9pbnRlZ3JhbHggICNhMjA3NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZmZiAgLT4gI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0ICBJbmV4YWN0IFJvdW5kZWQKK2RxY2FuNjI1IHRvaW50ZWdyYWx4ICAjYTIwNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZmYgIC0+ICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCisKKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ2xhc3MuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDbGFzcy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZTE5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ2xhc3MuZGVjVGVzdApAQCAtMCwwICsxLDc3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxQ2xhc3MuZGVjVGVzdCAtLSBkZWNRdWFkIENsYXNzIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gW05ldyAyMDA2LjExLjI3XQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkcWNsYTAwMSAgY2xhc3MgICAgMCAgICAgICAgICAgICAgICAgICAgICAgIC0+ICtaZXJvCitkcWNsYTAwMiAgY2xhc3MgICAgMC4wMCAgICAgICAgICAgICAgICAgICAgIC0+ICtaZXJvCitkcWNsYTAwMyAgY2xhc3MgICAgMEUrNSAgICAgICAgICAgICAgICAgICAgIC0+ICtaZXJvCitkcWNsYTAwNCAgY2xhc3MgICAgMUUtNjE3NiAgICAgICAgICAgICAgICAgIC0+ICtTdWJub3JtYWwKK2RxY2xhMDA1ICBjbGFzcyAgMC4xRS02MTQzICAgICAgICAgICAgICAgICAgLT4gK1N1Ym5vcm1hbAorZHFjbGEwMDYgIGNsYXNzICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQzICAgICAtPiArU3Vibm9ybWFsCitkcWNsYTAwNyAgY2xhc3MgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgIC0+ICtOb3JtYWwKK2RxY2xhMDA4ICBjbGFzcyAgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorZHFjbGEwMDkgIGNsYXNzICAgMUUtMTAwICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitkcWNsYTAxMCAgY2xhc3MgICAxRS0xMCAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2RxY2xhMDEyICBjbGFzcyAgIDFFLTEgICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorZHFjbGEwMTMgIGNsYXNzICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitkcWNsYTAxNCAgY2xhc3MgICAyLjUwICAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2RxY2xhMDE1ICBjbGFzcyAgIDEwMC4xMDAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorZHFjbGEwMTYgIGNsYXNzICAgMUUrMzAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitkcWNsYTAxNyAgY2xhc3MgICAxRSs2MTQ0ICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2RxY2xhMDE4ICBjbGFzcyAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgLT4gK05vcm1hbAorZHFjbGEwMTkgIGNsYXNzICAgSW5mICAgICAgICAgICAgICAgICAgICAgICAtPiArSW5maW5pdHkKKworZHFjbGEwMjEgIGNsYXNzICAgLTAgICAgICAgICAgICAgICAgICAgICAgICAtPiAtWmVybworZHFjbGEwMjIgIGNsYXNzICAgLTAuMDAgICAgICAgICAgICAgICAgICAgICAtPiAtWmVybworZHFjbGEwMjMgIGNsYXNzICAgLTBFKzUgICAgICAgICAgICAgICAgICAgICAtPiAtWmVybworZHFjbGEwMjQgIGNsYXNzICAgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAtPiAtU3Vibm9ybWFsCitkcWNsYTAyNSAgY2xhc3MgIC0wLjFFLTYxNDMgICAgICAgICAgICAgICAgIC0+IC1TdWJub3JtYWwKK2RxY2xhMDI2ICBjbGFzcyAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFLTYxNDMgICAgLT4gLVN1Ym5vcm1hbAorZHFjbGEwMjcgIGNsYXNzICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAtPiAtTm9ybWFsCitkcWNsYTAyOCAgY2xhc3MgIC0xRS02MTQzICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2RxY2xhMDI5ICBjbGFzcyAgLTFFLTEwMCAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorZHFjbGEwMzAgIGNsYXNzICAtMUUtMTAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitkcWNsYTAzMiAgY2xhc3MgIC0xRS0xICAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2RxY2xhMDMzICBjbGFzcyAgLTEgICAgICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorZHFjbGEwMzQgIGNsYXNzICAtMi41MCAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitkcWNsYTAzNSAgY2xhc3MgIC0xMDAuMTAwICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2RxY2xhMDM2ICBjbGFzcyAgLTFFKzMwICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorZHFjbGEwMzcgIGNsYXNzICAtMUUrNjE0NCAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitkcWNsYTA2MTQgIGNsYXNzICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAtPiAtTm9ybWFsCitkcWNsYTAzOSAgY2xhc3MgIC1JbmYgICAgICAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorCitkcWNsYTA0MSAgY2xhc3MgICBOYU4gICAgICAgICAgICAgICAgICAgICAgIC0+IE5hTgorZHFjbGEwNDIgIGNsYXNzICAtTmFOICAgICAgICAgICAgICAgICAgICAgICAtPiBOYU4KK2RxY2xhMDQzICBjbGFzcyAgK05hTjEyMzQ1ICAgICAgICAgICAgICAgICAgLT4gTmFOCitkcWNsYTA0NCAgY2xhc3MgICBzTmFOICAgICAgICAgICAgICAgICAgICAgIC0+IHNOYU4KK2RxY2xhMDQ1ICBjbGFzcyAgLXNOYU4gICAgICAgICAgICAgICAgICAgICAgLT4gc05hTgorZHFjbGEwNDYgIGNsYXNzICArc05hTjEyMzQ1ICAgICAgICAgICAgICAgICAtPiBzTmFOCisKKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29tcGFyZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvbXBhcmUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2I1ZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvbXBhcmUuZGVjVGVzdApAQCAtMCwwICsxLDc1MyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcUNvbXBhcmUuZGVjVGVzdCAtLSBkZWNRdWFkIGNvbXBhcmlzb24gdGhhdCBhbGxvd3MgcXVpZXQgTmFOcyAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIE5vdGUgdGhhdCB3ZSBjYW5ub3QgYXNzdW1lIGFkZC9zdWJ0cmFjdCB0ZXN0cyBjb3ZlciBwYXRocyBhZGVxdWF0ZWx5LAorLS0gaGVyZSwgYmVjYXVzZSB0aGUgY29kZSBtaWdodCBiZSBxdWl0ZSBkaWZmZXJlbnQgKGNvbXBhcmlzb24gY2Fubm90CistLSBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHNvIGFjdHVhbCBzdWJ0cmFjdGlvbnMgYXJlIG5vdCBuZWNlc3NhcnkpLgorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY1F1YWRzLgorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZHFjb20wMDEgY29tcGFyZSAgLTIgIC0yICAtPiAwCitkcWNvbTAwMiBjb21wYXJlICAtMiAgLTEgIC0+IC0xCitkcWNvbTAwMyBjb21wYXJlICAtMiAgIDAgIC0+IC0xCitkcWNvbTAwNCBjb21wYXJlICAtMiAgIDEgIC0+IC0xCitkcWNvbTAwNSBjb21wYXJlICAtMiAgIDIgIC0+IC0xCitkcWNvbTAwNiBjb21wYXJlICAtMSAgLTIgIC0+IDEKK2RxY29tMDA3IGNvbXBhcmUgIC0xICAtMSAgLT4gMAorZHFjb20wMDggY29tcGFyZSAgLTEgICAwICAtPiAtMQorZHFjb20wMDkgY29tcGFyZSAgLTEgICAxICAtPiAtMQorZHFjb20wMTAgY29tcGFyZSAgLTEgICAyICAtPiAtMQorZHFjb20wMTEgY29tcGFyZSAgIDAgIC0yICAtPiAxCitkcWNvbTAxMiBjb21wYXJlICAgMCAgLTEgIC0+IDEKK2RxY29tMDEzIGNvbXBhcmUgICAwICAgMCAgLT4gMAorZHFjb20wMTQgY29tcGFyZSAgIDAgICAxICAtPiAtMQorZHFjb20wMTUgY29tcGFyZSAgIDAgICAyICAtPiAtMQorZHFjb20wMTYgY29tcGFyZSAgIDEgIC0yICAtPiAxCitkcWNvbTAxNyBjb21wYXJlICAgMSAgLTEgIC0+IDEKK2RxY29tMDE4IGNvbXBhcmUgICAxICAgMCAgLT4gMQorZHFjb20wMTkgY29tcGFyZSAgIDEgICAxICAtPiAwCitkcWNvbTAyMCBjb21wYXJlICAgMSAgIDIgIC0+IC0xCitkcWNvbTAyMSBjb21wYXJlICAgMiAgLTIgIC0+IDEKK2RxY29tMDIyIGNvbXBhcmUgICAyICAtMSAgLT4gMQorZHFjb20wMjMgY29tcGFyZSAgIDIgICAwICAtPiAxCitkcWNvbTAyNSBjb21wYXJlICAgMiAgIDEgIC0+IDEKK2RxY29tMDI2IGNvbXBhcmUgICAyICAgMiAgLT4gMAorCitkcWNvbTAzMSBjb21wYXJlICAtMjAgIC0yMCAgLT4gMAorZHFjb20wMzIgY29tcGFyZSAgLTIwICAtMTAgIC0+IC0xCitkcWNvbTAzMyBjb21wYXJlICAtMjAgICAwMCAgLT4gLTEKK2RxY29tMDM0IGNvbXBhcmUgIC0yMCAgIDEwICAtPiAtMQorZHFjb20wMzUgY29tcGFyZSAgLTIwICAgMjAgIC0+IC0xCitkcWNvbTAzNiBjb21wYXJlICAtMTAgIC0yMCAgLT4gMQorZHFjb20wMzcgY29tcGFyZSAgLTEwICAtMTAgIC0+IDAKK2RxY29tMDM4IGNvbXBhcmUgIC0xMCAgIDAwICAtPiAtMQorZHFjb20wMzkgY29tcGFyZSAgLTEwICAgMTAgIC0+IC0xCitkcWNvbTA0MCBjb21wYXJlICAtMTAgICAyMCAgLT4gLTEKK2RxY29tMDQxIGNvbXBhcmUgICAwMCAgLTIwICAtPiAxCitkcWNvbTA0MiBjb21wYXJlICAgMDAgIC0xMCAgLT4gMQorZHFjb20wNDMgY29tcGFyZSAgIDAwICAgMDAgIC0+IDAKK2RxY29tMDQ0IGNvbXBhcmUgICAwMCAgIDEwICAtPiAtMQorZHFjb20wNDUgY29tcGFyZSAgIDAwICAgMjAgIC0+IC0xCitkcWNvbTA0NiBjb21wYXJlICAgMTAgIC0yMCAgLT4gMQorZHFjb20wNDcgY29tcGFyZSAgIDEwICAtMTAgIC0+IDEKK2RxY29tMDQ4IGNvbXBhcmUgICAxMCAgIDAwICAtPiAxCitkcWNvbTA0OSBjb21wYXJlICAgMTAgICAxMCAgLT4gMAorZHFjb20wNTAgY29tcGFyZSAgIDEwICAgMjAgIC0+IC0xCitkcWNvbTA1MSBjb21wYXJlICAgMjAgIC0yMCAgLT4gMQorZHFjb20wNTIgY29tcGFyZSAgIDIwICAtMTAgIC0+IDEKK2RxY29tMDUzIGNvbXBhcmUgICAyMCAgIDAwICAtPiAxCitkcWNvbTA1NSBjb21wYXJlICAgMjAgICAxMCAgLT4gMQorZHFjb20wNTYgY29tcGFyZSAgIDIwICAgMjAgIC0+IDAKKworZHFjb20wNjEgY29tcGFyZSAgLTIuMCAgLTIuMCAgLT4gMAorZHFjb20wNjIgY29tcGFyZSAgLTIuMCAgLTEuMCAgLT4gLTEKK2RxY29tMDYzIGNvbXBhcmUgIC0yLjAgICAwLjAgIC0+IC0xCitkcWNvbTA2NCBjb21wYXJlICAtMi4wICAgMS4wICAtPiAtMQorZHFjb20wNjUgY29tcGFyZSAgLTIuMCAgIDIuMCAgLT4gLTEKK2RxY29tMDY2IGNvbXBhcmUgIC0xLjAgIC0yLjAgIC0+IDEKK2RxY29tMDY3IGNvbXBhcmUgIC0xLjAgIC0xLjAgIC0+IDAKK2RxY29tMDY4IGNvbXBhcmUgIC0xLjAgICAwLjAgIC0+IC0xCitkcWNvbTA2OSBjb21wYXJlICAtMS4wICAgMS4wICAtPiAtMQorZHFjb20wNzAgY29tcGFyZSAgLTEuMCAgIDIuMCAgLT4gLTEKK2RxY29tMDcxIGNvbXBhcmUgICAwLjAgIC0yLjAgIC0+IDEKK2RxY29tMDcyIGNvbXBhcmUgICAwLjAgIC0xLjAgIC0+IDEKK2RxY29tMDczIGNvbXBhcmUgICAwLjAgICAwLjAgIC0+IDAKK2RxY29tMDc0IGNvbXBhcmUgICAwLjAgICAxLjAgIC0+IC0xCitkcWNvbTA3NSBjb21wYXJlICAgMC4wICAgMi4wICAtPiAtMQorZHFjb20wNzYgY29tcGFyZSAgIDEuMCAgLTIuMCAgLT4gMQorZHFjb20wNzcgY29tcGFyZSAgIDEuMCAgLTEuMCAgLT4gMQorZHFjb20wNzggY29tcGFyZSAgIDEuMCAgIDAuMCAgLT4gMQorZHFjb20wNzkgY29tcGFyZSAgIDEuMCAgIDEuMCAgLT4gMAorZHFjb20wODAgY29tcGFyZSAgIDEuMCAgIDIuMCAgLT4gLTEKK2RxY29tMDgxIGNvbXBhcmUgICAyLjAgIC0yLjAgIC0+IDEKK2RxY29tMDgyIGNvbXBhcmUgICAyLjAgIC0xLjAgIC0+IDEKK2RxY29tMDgzIGNvbXBhcmUgICAyLjAgICAwLjAgIC0+IDEKK2RxY29tMDg1IGNvbXBhcmUgICAyLjAgICAxLjAgIC0+IDEKK2RxY29tMDg2IGNvbXBhcmUgICAyLjAgICAyLjAgIC0+IDAKKworLS0gbm93IHNvbWUgY2FzZXMgd2hpY2ggbWlnaHQgb3ZlcmZsb3cgaWYgc3VidHJhY3Qgd2VyZSB1c2VkCitkcWNvbTA5MCBjb21wYXJlICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gMAorZHFjb20wOTEgY29tcGFyZSAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0+IC0xCitkcWNvbTA5MiBjb21wYXJlICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLT4gMQorZHFjb20wOTMgY29tcGFyZSAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+IDAKKworLS0gc29tZSBkaWZmZXJpbmcgbGVuZ3RoL2V4cG9uZW50IGNhc2VzCitkcWNvbTEwMCBjb21wYXJlICAgNy4wICAgIDcuMCAgICAtPiAwCitkcWNvbTEwMSBjb21wYXJlICAgNy4wICAgIDcgICAgICAtPiAwCitkcWNvbTEwMiBjb21wYXJlICAgNyAgICAgIDcuMCAgICAtPiAwCitkcWNvbTEwMyBjb21wYXJlICAgN0UrMCAgIDcuMCAgICAtPiAwCitkcWNvbTEwNCBjb21wYXJlICAgNzBFLTEgIDcuMCAgICAtPiAwCitkcWNvbTEwNSBjb21wYXJlICAgMC43RSsxIDcgICAgICAtPiAwCitkcWNvbTEwNiBjb21wYXJlICAgNzBFLTEgIDcgICAgICAtPiAwCitkcWNvbTEwNyBjb21wYXJlICAgNy4wICAgIDdFKzAgICAtPiAwCitkcWNvbTEwOCBjb21wYXJlICAgNy4wICAgIDcwRS0xICAtPiAwCitkcWNvbTEwOSBjb21wYXJlICAgNyAgICAgIDAuN0UrMSAtPiAwCitkcWNvbTExMCBjb21wYXJlICAgNyAgICAgIDcwRS0xICAtPiAwCisKK2RxY29tMTIwIGNvbXBhcmUgICA4LjAgICAgNy4wICAgIC0+IDEKK2RxY29tMTIxIGNvbXBhcmUgICA4LjAgICAgNyAgICAgIC0+IDEKK2RxY29tMTIyIGNvbXBhcmUgICA4ICAgICAgNy4wICAgIC0+IDEKK2RxY29tMTIzIGNvbXBhcmUgICA4RSswICAgNy4wICAgIC0+IDEKK2RxY29tMTI0IGNvbXBhcmUgICA4MEUtMSAgNy4wICAgIC0+IDEKK2RxY29tMTI1IGNvbXBhcmUgICAwLjhFKzEgNyAgICAgIC0+IDEKK2RxY29tMTI2IGNvbXBhcmUgICA4MEUtMSAgNyAgICAgIC0+IDEKK2RxY29tMTI3IGNvbXBhcmUgICA4LjAgICAgN0UrMCAgIC0+IDEKK2RxY29tMTI4IGNvbXBhcmUgICA4LjAgICAgNzBFLTEgIC0+IDEKK2RxY29tMTI5IGNvbXBhcmUgICA4ICAgICAgMC43RSsxICAtPiAxCitkcWNvbTEzMCBjb21wYXJlICAgOCAgICAgIDcwRS0xICAtPiAxCisKK2RxY29tMTQwIGNvbXBhcmUgICA4LjAgICAgOS4wICAgIC0+IC0xCitkcWNvbTE0MSBjb21wYXJlICAgOC4wICAgIDkgICAgICAtPiAtMQorZHFjb20xNDIgY29tcGFyZSAgIDggICAgICA5LjAgICAgLT4gLTEKK2RxY29tMTQzIGNvbXBhcmUgICA4RSswICAgOS4wICAgIC0+IC0xCitkcWNvbTE0NCBjb21wYXJlICAgODBFLTEgIDkuMCAgICAtPiAtMQorZHFjb20xNDUgY29tcGFyZSAgIDAuOEUrMSA5ICAgICAgLT4gLTEKK2RxY29tMTQ2IGNvbXBhcmUgICA4MEUtMSAgOSAgICAgIC0+IC0xCitkcWNvbTE0NyBjb21wYXJlICAgOC4wICAgIDlFKzAgICAtPiAtMQorZHFjb20xNDggY29tcGFyZSAgIDguMCAgICA5MEUtMSAgLT4gLTEKK2RxY29tMTQ5IGNvbXBhcmUgICA4ICAgICAgMC45RSsxIC0+IC0xCitkcWNvbTE1MCBjb21wYXJlICAgOCAgICAgIDkwRS0xICAtPiAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0rIC4uCitkcWNvbTIwMCBjb21wYXJlICAtNy4wICAgIDcuMCAgICAtPiAtMQorZHFjb20yMDEgY29tcGFyZSAgLTcuMCAgICA3ICAgICAgLT4gLTEKK2RxY29tMjAyIGNvbXBhcmUgIC03ICAgICAgNy4wICAgIC0+IC0xCitkcWNvbTIwMyBjb21wYXJlICAtN0UrMCAgIDcuMCAgICAtPiAtMQorZHFjb20yMDQgY29tcGFyZSAgLTcwRS0xICA3LjAgICAgLT4gLTEKK2RxY29tMjA1IGNvbXBhcmUgIC0wLjdFKzEgNyAgICAgIC0+IC0xCitkcWNvbTIwNiBjb21wYXJlICAtNzBFLTEgIDcgICAgICAtPiAtMQorZHFjb20yMDcgY29tcGFyZSAgLTcuMCAgICA3RSswICAgLT4gLTEKK2RxY29tMjA4IGNvbXBhcmUgIC03LjAgICAgNzBFLTEgIC0+IC0xCitkcWNvbTIwOSBjb21wYXJlICAtNyAgICAgIDAuN0UrMSAtPiAtMQorZHFjb20yMTAgY29tcGFyZSAgLTcgICAgICA3MEUtMSAgLT4gLTEKKworZHFjb20yMjAgY29tcGFyZSAgLTguMCAgICA3LjAgICAgLT4gLTEKK2RxY29tMjIxIGNvbXBhcmUgIC04LjAgICAgNyAgICAgIC0+IC0xCitkcWNvbTIyMiBjb21wYXJlICAtOCAgICAgIDcuMCAgICAtPiAtMQorZHFjb20yMjMgY29tcGFyZSAgLThFKzAgICA3LjAgICAgLT4gLTEKK2RxY29tMjI0IGNvbXBhcmUgIC04MEUtMSAgNy4wICAgIC0+IC0xCitkcWNvbTIyNSBjb21wYXJlICAtMC44RSsxIDcgICAgICAtPiAtMQorZHFjb20yMjYgY29tcGFyZSAgLTgwRS0xICA3ICAgICAgLT4gLTEKK2RxY29tMjI3IGNvbXBhcmUgIC04LjAgICAgN0UrMCAgIC0+IC0xCitkcWNvbTIyOCBjb21wYXJlICAtOC4wICAgIDcwRS0xICAtPiAtMQorZHFjb20yMjkgY29tcGFyZSAgLTggICAgICAwLjdFKzEgLT4gLTEKK2RxY29tMjMwIGNvbXBhcmUgIC04ICAgICAgNzBFLTEgIC0+IC0xCisKK2RxY29tMjQwIGNvbXBhcmUgIC04LjAgICAgOS4wICAgIC0+IC0xCitkcWNvbTI0MSBjb21wYXJlICAtOC4wICAgIDkgICAgICAtPiAtMQorZHFjb20yNDIgY29tcGFyZSAgLTggICAgICA5LjAgICAgLT4gLTEKK2RxY29tMjQzIGNvbXBhcmUgIC04RSswICAgOS4wICAgIC0+IC0xCitkcWNvbTI0NCBjb21wYXJlICAtODBFLTEgIDkuMCAgICAtPiAtMQorZHFjb20yNDUgY29tcGFyZSAgLTAuOEUrMSA5ICAgICAgLT4gLTEKK2RxY29tMjQ2IGNvbXBhcmUgIC04MEUtMSAgOSAgICAgIC0+IC0xCitkcWNvbTI0NyBjb21wYXJlICAtOC4wICAgIDlFKzAgICAtPiAtMQorZHFjb20yNDggY29tcGFyZSAgLTguMCAgICA5MEUtMSAgLT4gLTEKK2RxY29tMjQ5IGNvbXBhcmUgIC04ICAgICAgMC45RSsxIC0+IC0xCitkcWNvbTI1MCBjb21wYXJlICAtOCAgICAgIDkwRS0xICAtPiAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzICstIC4uCitkcWNvbTMwMCBjb21wYXJlICAgNy4wICAgIC03LjAgICAgLT4gMQorZHFjb20zMDEgY29tcGFyZSAgIDcuMCAgICAtNyAgICAgIC0+IDEKK2RxY29tMzAyIGNvbXBhcmUgICA3ICAgICAgLTcuMCAgICAtPiAxCitkcWNvbTMwMyBjb21wYXJlICAgN0UrMCAgIC03LjAgICAgLT4gMQorZHFjb20zMDQgY29tcGFyZSAgIDcwRS0xICAtNy4wICAgIC0+IDEKK2RxY29tMzA1IGNvbXBhcmUgICAuN0UrMSAgLTcgICAgICAtPiAxCitkcWNvbTMwNiBjb21wYXJlICAgNzBFLTEgIC03ICAgICAgLT4gMQorZHFjb20zMDcgY29tcGFyZSAgIDcuMCAgICAtN0UrMCAgIC0+IDEKK2RxY29tMzA4IGNvbXBhcmUgICA3LjAgICAgLTcwRS0xICAtPiAxCitkcWNvbTMwOSBjb21wYXJlICAgNyAgICAgIC0uN0UrMSAgLT4gMQorZHFjb20zMTAgY29tcGFyZSAgIDcgICAgICAtNzBFLTEgIC0+IDEKKworZHFjb20zMjAgY29tcGFyZSAgIDguMCAgICAtNy4wICAgIC0+IDEKK2RxY29tMzIxIGNvbXBhcmUgICA4LjAgICAgLTcgICAgICAtPiAxCitkcWNvbTMyMiBjb21wYXJlICAgOCAgICAgIC03LjAgICAgLT4gMQorZHFjb20zMjMgY29tcGFyZSAgIDhFKzAgICAtNy4wICAgIC0+IDEKK2RxY29tMzI0IGNvbXBhcmUgICA4MEUtMSAgLTcuMCAgICAtPiAxCitkcWNvbTMyNSBjb21wYXJlICAgLjhFKzEgIC03ICAgICAgLT4gMQorZHFjb20zMjYgY29tcGFyZSAgIDgwRS0xICAtNyAgICAgIC0+IDEKK2RxY29tMzI3IGNvbXBhcmUgICA4LjAgICAgLTdFKzAgICAtPiAxCitkcWNvbTMyOCBjb21wYXJlICAgOC4wICAgIC03MEUtMSAgLT4gMQorZHFjb20zMjkgY29tcGFyZSAgIDggICAgICAtLjdFKzEgIC0+IDEKK2RxY29tMzMwIGNvbXBhcmUgICA4ICAgICAgLTcwRS0xICAtPiAxCisKK2RxY29tMzQwIGNvbXBhcmUgICA4LjAgICAgLTkuMCAgICAtPiAxCitkcWNvbTM0MSBjb21wYXJlICAgOC4wICAgIC05ICAgICAgLT4gMQorZHFjb20zNDIgY29tcGFyZSAgIDggICAgICAtOS4wICAgIC0+IDEKK2RxY29tMzQzIGNvbXBhcmUgICA4RSswICAgLTkuMCAgICAtPiAxCitkcWNvbTM0NCBjb21wYXJlICAgODBFLTEgIC05LjAgICAgLT4gMQorZHFjb20zNDUgY29tcGFyZSAgIC44RSsxICAtOSAgICAgIC0+IDEKK2RxY29tMzQ2IGNvbXBhcmUgICA4MEUtMSAgLTkgICAgICAtPiAxCitkcWNvbTM0NyBjb21wYXJlICAgOC4wICAgIC05RSswICAgLT4gMQorZHFjb20zNDggY29tcGFyZSAgIDguMCAgICAtOTBFLTEgIC0+IDEKK2RxY29tMzQ5IGNvbXBhcmUgICA4ICAgICAgLS45RSsxICAtPiAxCitkcWNvbTM1MCBjb21wYXJlICAgOCAgICAgIC05MEUtMSAgLT4gMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0tIC4uCitkcWNvbTQwMCBjb21wYXJlICAgLTcuMCAgICAtNy4wICAgIC0+IDAKK2RxY29tNDAxIGNvbXBhcmUgICAtNy4wICAgIC03ICAgICAgLT4gMAorZHFjb200MDIgY29tcGFyZSAgIC03ICAgICAgLTcuMCAgICAtPiAwCitkcWNvbTQwMyBjb21wYXJlICAgLTdFKzAgICAtNy4wICAgIC0+IDAKK2RxY29tNDA0IGNvbXBhcmUgICAtNzBFLTEgIC03LjAgICAgLT4gMAorZHFjb200MDUgY29tcGFyZSAgIC0uN0UrMSAgLTcgICAgICAtPiAwCitkcWNvbTQwNiBjb21wYXJlICAgLTcwRS0xICAtNyAgICAgIC0+IDAKK2RxY29tNDA3IGNvbXBhcmUgICAtNy4wICAgIC03RSswICAgLT4gMAorZHFjb200MDggY29tcGFyZSAgIC03LjAgICAgLTcwRS0xICAtPiAwCitkcWNvbTQwOSBjb21wYXJlICAgLTcgICAgICAtLjdFKzEgIC0+IDAKK2RxY29tNDEwIGNvbXBhcmUgICAtNyAgICAgIC03MEUtMSAgLT4gMAorCitkcWNvbTQyMCBjb21wYXJlICAgLTguMCAgICAtNy4wICAgIC0+IC0xCitkcWNvbTQyMSBjb21wYXJlICAgLTguMCAgICAtNyAgICAgIC0+IC0xCitkcWNvbTQyMiBjb21wYXJlICAgLTggICAgICAtNy4wICAgIC0+IC0xCitkcWNvbTQyMyBjb21wYXJlICAgLThFKzAgICAtNy4wICAgIC0+IC0xCitkcWNvbTQyNCBjb21wYXJlICAgLTgwRS0xICAtNy4wICAgIC0+IC0xCitkcWNvbTQyNSBjb21wYXJlICAgLS44RSsxICAtNyAgICAgIC0+IC0xCitkcWNvbTQyNiBjb21wYXJlICAgLTgwRS0xICAtNyAgICAgIC0+IC0xCitkcWNvbTQyNyBjb21wYXJlICAgLTguMCAgICAtN0UrMCAgIC0+IC0xCitkcWNvbTQyOCBjb21wYXJlICAgLTguMCAgICAtNzBFLTEgIC0+IC0xCitkcWNvbTQyOSBjb21wYXJlICAgLTggICAgICAtLjdFKzEgIC0+IC0xCitkcWNvbTQzMCBjb21wYXJlICAgLTggICAgICAtNzBFLTEgIC0+IC0xCisKK2RxY29tNDQwIGNvbXBhcmUgICAtOC4wICAgIC05LjAgICAgLT4gMQorZHFjb200NDEgY29tcGFyZSAgIC04LjAgICAgLTkgICAgICAtPiAxCitkcWNvbTQ0MiBjb21wYXJlICAgLTggICAgICAtOS4wICAgIC0+IDEKK2RxY29tNDQzIGNvbXBhcmUgICAtOEUrMCAgIC05LjAgICAgLT4gMQorZHFjb200NDQgY29tcGFyZSAgIC04MEUtMSAgLTkuMCAgICAtPiAxCitkcWNvbTQ0NSBjb21wYXJlICAgLS44RSsxICAtOSAgICAgIC0+IDEKK2RxY29tNDQ2IGNvbXBhcmUgICAtODBFLTEgIC05ICAgICAgLT4gMQorZHFjb200NDcgY29tcGFyZSAgIC04LjAgICAgLTlFKzAgICAtPiAxCitkcWNvbTQ0OCBjb21wYXJlICAgLTguMCAgICAtOTBFLTEgIC0+IDEKK2RxY29tNDQ5IGNvbXBhcmUgICAtOCAgICAgIC0uOUUrMSAgLT4gMQorZHFjb200NTAgY29tcGFyZSAgIC04ICAgICAgLTkwRS0xICAtPiAxCisKKy0tIG1pc2FsaWdubWVudCB0cmFwcyBmb3IgbGl0dGxlLWVuZGlhbgorZHFjb200NTEgY29tcGFyZSAgICAgIDEuMCAgICAgICAwLjEgIC0+IDEKK2RxY29tNDUyIGNvbXBhcmUgICAgICAwLjEgICAgICAgMS4wICAtPiAtMQorZHFjb200NTMgY29tcGFyZSAgICAgMTAuMCAgICAgICAwLjEgIC0+IDEKK2RxY29tNDU0IGNvbXBhcmUgICAgICAwLjEgICAgICAxMC4wICAtPiAtMQorZHFjb200NTUgY29tcGFyZSAgICAgIDEwMCAgICAgICAxLjAgIC0+IDEKK2RxY29tNDU2IGNvbXBhcmUgICAgICAxLjAgICAgICAgMTAwICAtPiAtMQorZHFjb200NTcgY29tcGFyZSAgICAgMTAwMCAgICAgIDEwLjAgIC0+IDEKK2RxY29tNDU4IGNvbXBhcmUgICAgIDEwLjAgICAgICAxMDAwICAtPiAtMQorZHFjb200NTkgY29tcGFyZSAgICAxMDAwMCAgICAgMTAwLjAgIC0+IDEKK2RxY29tNDYwIGNvbXBhcmUgICAgMTAwLjAgICAgIDEwMDAwICAtPiAtMQorZHFjb200NjEgY29tcGFyZSAgIDEwMDAwMCAgICAxMDAwLjAgIC0+IDEKK2RxY29tNDYyIGNvbXBhcmUgICAxMDAwLjAgICAgMTAwMDAwICAtPiAtMQorZHFjb200NjMgY29tcGFyZSAgMTAwMDAwMCAgIDEwMDAwLjAgIC0+IDEKK2RxY29tNDY0IGNvbXBhcmUgIDEwMDAwLjAgICAxMDAwMDAwICAtPiAtMQorCistLSB0ZXN0Y2FzZXMgdGhhdCBzdWJ0cmFjdCB0byBsb3RzIG9mIHplcm9zIGF0IGJvdW5kYXJpZXMgW3Bncl0KK2RxY29tNDczIGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMDAwMDBFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IC0+IDAKK2RxY29tNDc0IGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMDAwMEUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgLT4gMAorZHFjb200NzUgY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDAwMDBFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IC0+IDAKK2RxY29tNDc2IGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMDBFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IC0+IDAKK2RxY29tNDc3IGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMEUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgLT4gMAorZHFjb200NzggY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDBFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IC0+IDAKK2RxY29tNDc5IGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDBFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IC0+IDAKK2RxY29tNDgwIGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMEUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgLT4gMAorZHFjb200ODEgY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDBFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IC0+IDAKK2RxY29tNDgyIGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjBFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IC0+IDAKK2RxY29tNDgzIGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgLT4gMAorZHFjb200ODcgY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDAwMDAwMEUrODkgLT4gMAorZHFjb200ODggY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDAwMDAwRS04OSAtPiAwCitkcWNvbTQ4OSBjb21wYXJlIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDAwMEUrODkgLT4gMAorZHFjb200OTAgY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDAwMEUtODkgLT4gMAorZHFjb200OTEgY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDAwRSs4OSAtPiAwCitkcWNvbTQ5MiBjb21wYXJlIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMEUtODkgLT4gMAorZHFjb200OTMgY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMEUrODkgLT4gMAorZHFjb200OTQgY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwRS04OSAtPiAwCitkcWNvbTQ5NSBjb21wYXJlIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMEUrODkgLT4gMAorZHFjb200OTYgY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MEUtODkgLT4gMAorZHFjb200OTcgY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAtPiAwCisKKy0tIHdpZGUtcmFuZ2luZywgYXJvdW5kIHByZWNpc2lvbjsgc2lnbnMgZXF1YWwKK2RxY29tNTAwIGNvbXBhcmUgICAgMSAgICAgMUUtMTUgICAgLT4gMQorZHFjb201MDEgY29tcGFyZSAgICAxICAgICAxRS0xNCAgICAtPiAxCitkcWNvbTUwMiBjb21wYXJlICAgIDEgICAgIDFFLTEzICAgIC0+IDEKK2RxY29tNTAzIGNvbXBhcmUgICAgMSAgICAgMUUtMTIgICAgLT4gMQorZHFjb201MDQgY29tcGFyZSAgICAxICAgICAxRS0xMSAgICAtPiAxCitkcWNvbTUwNSBjb21wYXJlICAgIDEgICAgIDFFLTEwICAgIC0+IDEKK2RxY29tNTA2IGNvbXBhcmUgICAgMSAgICAgMUUtOSAgICAgLT4gMQorZHFjb201MDcgY29tcGFyZSAgICAxICAgICAxRS04ICAgICAtPiAxCitkcWNvbTUwOCBjb21wYXJlICAgIDEgICAgIDFFLTcgICAgIC0+IDEKK2RxY29tNTA5IGNvbXBhcmUgICAgMSAgICAgMUUtNiAgICAgLT4gMQorZHFjb201MTAgY29tcGFyZSAgICAxICAgICAxRS01ICAgICAtPiAxCitkcWNvbTUxMSBjb21wYXJlICAgIDEgICAgIDFFLTQgICAgIC0+IDEKK2RxY29tNTEyIGNvbXBhcmUgICAgMSAgICAgMUUtMyAgICAgLT4gMQorZHFjb201MTMgY29tcGFyZSAgICAxICAgICAxRS0yICAgICAtPiAxCitkcWNvbTUxNCBjb21wYXJlICAgIDEgICAgIDFFLTEgICAgIC0+IDEKK2RxY29tNTE1IGNvbXBhcmUgICAgMSAgICAgMUUtMCAgICAgLT4gMAorZHFjb201MTYgY29tcGFyZSAgICAxICAgICAxRSsxICAgICAtPiAtMQorZHFjb201MTcgY29tcGFyZSAgICAxICAgICAxRSsyICAgICAtPiAtMQorZHFjb201MTggY29tcGFyZSAgICAxICAgICAxRSszICAgICAtPiAtMQorZHFjb201MTkgY29tcGFyZSAgICAxICAgICAxRSs0ICAgICAtPiAtMQorZHFjb201MjEgY29tcGFyZSAgICAxICAgICAxRSs1ICAgICAtPiAtMQorZHFjb201MjIgY29tcGFyZSAgICAxICAgICAxRSs2ICAgICAtPiAtMQorZHFjb201MjMgY29tcGFyZSAgICAxICAgICAxRSs3ICAgICAtPiAtMQorZHFjb201MjQgY29tcGFyZSAgICAxICAgICAxRSs4ICAgICAtPiAtMQorZHFjb201MjUgY29tcGFyZSAgICAxICAgICAxRSs5ICAgICAtPiAtMQorZHFjb201MjYgY29tcGFyZSAgICAxICAgICAxRSsxMCAgICAtPiAtMQorZHFjb201MjcgY29tcGFyZSAgICAxICAgICAxRSsxMSAgICAtPiAtMQorZHFjb201MjggY29tcGFyZSAgICAxICAgICAxRSsxMiAgICAtPiAtMQorZHFjb201MjkgY29tcGFyZSAgICAxICAgICAxRSsxMyAgICAtPiAtMQorZHFjb201MzAgY29tcGFyZSAgICAxICAgICAxRSsxNCAgICAtPiAtMQorZHFjb201MzEgY29tcGFyZSAgICAxICAgICAxRSsxNSAgICAtPiAtMQorLS0gTFIgc3dhcAorZHFjb201NDAgY29tcGFyZSAgICAxRS0xNSAgMSAgICAgICAtPiAtMQorZHFjb201NDEgY29tcGFyZSAgICAxRS0xNCAgMSAgICAgICAtPiAtMQorZHFjb201NDIgY29tcGFyZSAgICAxRS0xMyAgMSAgICAgICAtPiAtMQorZHFjb201NDMgY29tcGFyZSAgICAxRS0xMiAgMSAgICAgICAtPiAtMQorZHFjb201NDQgY29tcGFyZSAgICAxRS0xMSAgMSAgICAgICAtPiAtMQorZHFjb201NDUgY29tcGFyZSAgICAxRS0xMCAgMSAgICAgICAtPiAtMQorZHFjb201NDYgY29tcGFyZSAgICAxRS05ICAgMSAgICAgICAtPiAtMQorZHFjb201NDcgY29tcGFyZSAgICAxRS04ICAgMSAgICAgICAtPiAtMQorZHFjb201NDggY29tcGFyZSAgICAxRS03ICAgMSAgICAgICAtPiAtMQorZHFjb201NDkgY29tcGFyZSAgICAxRS02ICAgMSAgICAgICAtPiAtMQorZHFjb201NTAgY29tcGFyZSAgICAxRS01ICAgMSAgICAgICAtPiAtMQorZHFjb201NTEgY29tcGFyZSAgICAxRS00ICAgMSAgICAgICAtPiAtMQorZHFjb201NTIgY29tcGFyZSAgICAxRS0zICAgMSAgICAgICAtPiAtMQorZHFjb201NTMgY29tcGFyZSAgICAxRS0yICAgMSAgICAgICAtPiAtMQorZHFjb201NTQgY29tcGFyZSAgICAxRS0xICAgMSAgICAgICAtPiAtMQorZHFjb201NTUgY29tcGFyZSAgICAxRS0wICAgMSAgICAgICAtPiAgMAorZHFjb201NTYgY29tcGFyZSAgICAxRSsxICAgMSAgICAgICAtPiAgMQorZHFjb201NTcgY29tcGFyZSAgICAxRSsyICAgMSAgICAgICAtPiAgMQorZHFjb201NTggY29tcGFyZSAgICAxRSszICAgMSAgICAgICAtPiAgMQorZHFjb201NTkgY29tcGFyZSAgICAxRSs0ICAgMSAgICAgICAtPiAgMQorZHFjb201NjEgY29tcGFyZSAgICAxRSs1ICAgMSAgICAgICAtPiAgMQorZHFjb201NjIgY29tcGFyZSAgICAxRSs2ICAgMSAgICAgICAtPiAgMQorZHFjb201NjMgY29tcGFyZSAgICAxRSs3ICAgMSAgICAgICAtPiAgMQorZHFjb201NjQgY29tcGFyZSAgICAxRSs4ICAgMSAgICAgICAtPiAgMQorZHFjb201NjUgY29tcGFyZSAgICAxRSs5ICAgMSAgICAgICAtPiAgMQorZHFjb201NjYgY29tcGFyZSAgICAxRSsxMCAgMSAgICAgICAtPiAgMQorZHFjb201NjcgY29tcGFyZSAgICAxRSsxMSAgMSAgICAgICAtPiAgMQorZHFjb201NjggY29tcGFyZSAgICAxRSsxMiAgMSAgICAgICAtPiAgMQorZHFjb201NjkgY29tcGFyZSAgICAxRSsxMyAgMSAgICAgICAtPiAgMQorZHFjb201NzAgY29tcGFyZSAgICAxRSsxNCAgMSAgICAgICAtPiAgMQorZHFjb201NzEgY29tcGFyZSAgICAxRSsxNSAgMSAgICAgICAtPiAgMQorLS0gc2ltaWxhciB3aXRoIGEgdXNlZnVsIGNvZWZmaWNpZW50LCBvbmUgc2lkZSBvbmx5CitkcWNvbTU4MCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTUgICAgLT4gMQorZHFjb201ODEgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE0ICAgIC0+IDEKK2RxY29tNTgyIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMyAgICAtPiAxCitkcWNvbTU4MyBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTIgICAgLT4gMQorZHFjb201ODQgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTExICAgIC0+IDEKK2RxY29tNTg1IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMCAgICAtPiAxCitkcWNvbTU4NiBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOSAgICAgLT4gMQorZHFjb201ODcgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTggICAgIC0+IDEKK2RxY29tNTg4IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS03ICAgICAtPiAxCitkcWNvbTU4OSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNiAgICAgLT4gLTEKK2RxY29tNTkwIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS01ICAgICAtPiAtMQorZHFjb201OTEgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTQgICAgIC0+IC0xCitkcWNvbTU5MiBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMyAgICAgLT4gLTEKK2RxY29tNTkzIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0yICAgICAtPiAtMQorZHFjb201OTQgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEgICAgIC0+IC0xCitkcWNvbTU5NSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMCAgICAgLT4gLTEKK2RxY29tNTk2IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsxICAgICAtPiAtMQorZHFjb201OTcgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzIgICAgIC0+IC0xCitkcWNvbTU5OCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMyAgICAgLT4gLTEKK2RxY29tNTk5IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSs0ICAgICAtPiAtMQorCistLSBjaGVjayBzb21lIHVuaXQteSB0cmFwcworZHFjb202MDAgY29tcGFyZSAgIDEyICAgICAgICAgICAgMTIuMjM0NSAtPiAtMQorZHFjb202MDEgY29tcGFyZSAgIDEyLjAgICAgICAgICAgMTIuMjM0NSAtPiAtMQorZHFjb202MDIgY29tcGFyZSAgIDEyLjAwICAgICAgICAgMTIuMjM0NSAtPiAtMQorZHFjb202MDMgY29tcGFyZSAgIDEyLjAwMCAgICAgICAgMTIuMjM0NSAtPiAtMQorZHFjb202MDQgY29tcGFyZSAgIDEyLjAwMDAgICAgICAgMTIuMjM0NSAtPiAtMQorZHFjb202MDUgY29tcGFyZSAgIDEyLjAwMDAwICAgICAgMTIuMjM0NSAtPiAtMQorZHFjb202MDYgY29tcGFyZSAgIDEyLjAwMDAwMCAgICAgMTIuMjM0NSAtPiAtMQorZHFjb202MDcgY29tcGFyZSAgIDEyLjAwMDAwMDAgICAgMTIuMjM0NSAtPiAtMQorZHFjb202MDggY29tcGFyZSAgIDEyLjAwMDAwMDAwICAgMTIuMjM0NSAtPiAtMQorZHFjb202MDkgY29tcGFyZSAgIDEyLjAwMDAwMDAwMCAgMTIuMjM0NSAtPiAtMQorZHFjb202MTAgY29tcGFyZSAgIDEyLjEyMzQgMTIgICAgICAgICAgICAtPiAgMQorZHFjb202MTEgY29tcGFyZSAgIDEyLjEyMzQgMTIuMCAgICAgICAgICAtPiAgMQorZHFjb202MTIgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAgICAgICAgICAtPiAgMQorZHFjb202MTMgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwICAgICAgICAtPiAgMQorZHFjb202MTQgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMCAgICAgICAtPiAgMQorZHFjb202MTUgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAgICAgICAtPiAgMQorZHFjb202MTYgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAwICAgICAtPiAgMQorZHFjb202MTcgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAwMCAgICAtPiAgMQorZHFjb202MTggY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAwMDAgICAtPiAgMQorZHFjb202MTkgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAwMDAwICAtPiAgMQorZHFjb202MjAgY29tcGFyZSAgLTEyICAgICAgICAgICAtMTIuMjM0NSAtPiAgMQorZHFjb202MjEgY29tcGFyZSAgLTEyLjAgICAgICAgICAtMTIuMjM0NSAtPiAgMQorZHFjb202MjIgY29tcGFyZSAgLTEyLjAwICAgICAgICAtMTIuMjM0NSAtPiAgMQorZHFjb202MjMgY29tcGFyZSAgLTEyLjAwMCAgICAgICAtMTIuMjM0NSAtPiAgMQorZHFjb202MjQgY29tcGFyZSAgLTEyLjAwMDAgICAgICAtMTIuMjM0NSAtPiAgMQorZHFjb202MjUgY29tcGFyZSAgLTEyLjAwMDAwICAgICAtMTIuMjM0NSAtPiAgMQorZHFjb202MjYgY29tcGFyZSAgLTEyLjAwMDAwMCAgICAtMTIuMjM0NSAtPiAgMQorZHFjb202MjcgY29tcGFyZSAgLTEyLjAwMDAwMDAgICAtMTIuMjM0NSAtPiAgMQorZHFjb202MjggY29tcGFyZSAgLTEyLjAwMDAwMDAwICAtMTIuMjM0NSAtPiAgMQorZHFjb202MjkgY29tcGFyZSAgLTEyLjAwMDAwMDAwMCAtMTIuMjM0NSAtPiAgMQorZHFjb202MzAgY29tcGFyZSAgLTEyLjEyMzQgLTEyICAgICAgICAgICAtPiAtMQorZHFjb202MzEgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAgICAgICAgICAtPiAtMQorZHFjb202MzIgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwICAgICAgICAtPiAtMQorZHFjb202MzMgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMCAgICAgICAtPiAtMQorZHFjb202MzQgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAgICAgICAtPiAtMQorZHFjb202MzUgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwICAgICAtPiAtMQorZHFjb202MzYgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwMCAgICAtPiAtMQorZHFjb202MzcgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwMDAgICAtPiAtMQorZHFjb202MzggY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwICAtPiAtMQorZHFjb202MzkgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwMCAtPiAtMQorCistLSBleHRlbmRlZCB6ZXJvcworZHFjb202NDAgY29tcGFyZSAgIDAgICAgIDAgICAtPiAwCitkcWNvbTY0MSBjb21wYXJlICAgMCAgICAtMCAgIC0+IDAKK2RxY29tNjQyIGNvbXBhcmUgICAwICAgIC0wLjAgLT4gMAorZHFjb202NDMgY29tcGFyZSAgIDAgICAgIDAuMCAtPiAwCitkcWNvbTY0NCBjb21wYXJlICAtMCAgICAgMCAgIC0+IDAKK2RxY29tNjQ1IGNvbXBhcmUgIC0wICAgIC0wICAgLT4gMAorZHFjb202NDYgY29tcGFyZSAgLTAgICAgLTAuMCAtPiAwCitkcWNvbTY0NyBjb21wYXJlICAtMCAgICAgMC4wIC0+IDAKK2RxY29tNjQ4IGNvbXBhcmUgICAwLjAgICAwICAgLT4gMAorZHFjb202NDkgY29tcGFyZSAgIDAuMCAgLTAgICAtPiAwCitkcWNvbTY1MCBjb21wYXJlICAgMC4wICAtMC4wIC0+IDAKK2RxY29tNjUxIGNvbXBhcmUgICAwLjAgICAwLjAgLT4gMAorZHFjb202NTIgY29tcGFyZSAgLTAuMCAgIDAgICAtPiAwCitkcWNvbTY1MyBjb21wYXJlICAtMC4wICAtMCAgIC0+IDAKK2RxY29tNjU0IGNvbXBhcmUgIC0wLjAgIC0wLjAgLT4gMAorZHFjb202NTUgY29tcGFyZSAgLTAuMCAgIDAuMCAtPiAwCisKK2RxY29tNjU2IGNvbXBhcmUgIC0wRTEgICAwLjAgLT4gMAorZHFjb202NTcgY29tcGFyZSAgLTBFMiAgIDAuMCAtPiAwCitkcWNvbTY1OCBjb21wYXJlICAgMEUxICAgMC4wIC0+IDAKK2RxY29tNjU5IGNvbXBhcmUgICAwRTIgICAwLjAgLT4gMAorZHFjb202NjAgY29tcGFyZSAgLTBFMSAgIDAgICAtPiAwCitkcWNvbTY2MSBjb21wYXJlICAtMEUyICAgMCAgIC0+IDAKK2RxY29tNjYyIGNvbXBhcmUgICAwRTEgICAwICAgLT4gMAorZHFjb202NjMgY29tcGFyZSAgIDBFMiAgIDAgICAtPiAwCitkcWNvbTY2NCBjb21wYXJlICAtMEUxICAtMEUxIC0+IDAKK2RxY29tNjY1IGNvbXBhcmUgIC0wRTIgIC0wRTEgLT4gMAorZHFjb202NjYgY29tcGFyZSAgIDBFMSAgLTBFMSAtPiAwCitkcWNvbTY2NyBjb21wYXJlICAgMEUyICAtMEUxIC0+IDAKK2RxY29tNjY4IGNvbXBhcmUgIC0wRTEgIC0wRTIgLT4gMAorZHFjb202NjkgY29tcGFyZSAgLTBFMiAgLTBFMiAtPiAwCitkcWNvbTY3MCBjb21wYXJlICAgMEUxICAtMEUyIC0+IDAKK2RxY29tNjcxIGNvbXBhcmUgICAwRTIgIC0wRTIgLT4gMAorZHFjb202NzIgY29tcGFyZSAgLTBFMSAgIDBFMSAtPiAwCitkcWNvbTY3MyBjb21wYXJlICAtMEUyICAgMEUxIC0+IDAKK2RxY29tNjc0IGNvbXBhcmUgICAwRTEgICAwRTEgLT4gMAorZHFjb202NzUgY29tcGFyZSAgIDBFMiAgIDBFMSAtPiAwCitkcWNvbTY3NiBjb21wYXJlICAtMEUxICAgMEUyIC0+IDAKK2RxY29tNjc3IGNvbXBhcmUgIC0wRTIgICAwRTIgLT4gMAorZHFjb202NzggY29tcGFyZSAgIDBFMSAgIDBFMiAtPiAwCitkcWNvbTY3OSBjb21wYXJlICAgMEUyICAgMEUyIC0+IDAKKworLS0gdHJhaWxpbmcgemVyb3M7IHVuaXQteQorZHFjb202ODAgY29tcGFyZSAgIDEyICAgIDEyICAgICAgICAgICAtPiAwCitkcWNvbTY4MSBjb21wYXJlICAgMTIgICAgMTIuMCAgICAgICAgIC0+IDAKK2RxY29tNjgyIGNvbXBhcmUgICAxMiAgICAxMi4wMCAgICAgICAgLT4gMAorZHFjb202ODMgY29tcGFyZSAgIDEyICAgIDEyLjAwMCAgICAgICAtPiAwCitkcWNvbTY4NCBjb21wYXJlICAgMTIgICAgMTIuMDAwMCAgICAgIC0+IDAKK2RxY29tNjg1IGNvbXBhcmUgICAxMiAgICAxMi4wMDAwMCAgICAgLT4gMAorZHFjb202ODYgY29tcGFyZSAgIDEyICAgIDEyLjAwMDAwMCAgICAtPiAwCitkcWNvbTY4NyBjb21wYXJlICAgMTIgICAgMTIuMDAwMDAwMCAgIC0+IDAKK2RxY29tNjg4IGNvbXBhcmUgICAxMiAgICAxMi4wMDAwMDAwMCAgLT4gMAorZHFjb202ODkgY29tcGFyZSAgIDEyICAgIDEyLjAwMDAwMDAwMCAtPiAwCitkcWNvbTY5MCBjb21wYXJlICAgMTIgICAgICAgICAgICAgIDEyIC0+IDAKK2RxY29tNjkxIGNvbXBhcmUgICAxMi4wICAgICAgICAgICAgMTIgLT4gMAorZHFjb202OTIgY29tcGFyZSAgIDEyLjAwICAgICAgICAgICAxMiAtPiAwCitkcWNvbTY5MyBjb21wYXJlICAgMTIuMDAwICAgICAgICAgIDEyIC0+IDAKK2RxY29tNjk0IGNvbXBhcmUgICAxMi4wMDAwICAgICAgICAgMTIgLT4gMAorZHFjb202OTUgY29tcGFyZSAgIDEyLjAwMDAwICAgICAgICAxMiAtPiAwCitkcWNvbTY5NiBjb21wYXJlICAgMTIuMDAwMDAwICAgICAgIDEyIC0+IDAKK2RxY29tNjk3IGNvbXBhcmUgICAxMi4wMDAwMDAwICAgICAgMTIgLT4gMAorZHFjb202OTggY29tcGFyZSAgIDEyLjAwMDAwMDAwICAgICAxMiAtPiAwCitkcWNvbTY5OSBjb21wYXJlICAgMTIuMDAwMDAwMDAwICAgIDEyIC0+IDAKKworLS0gZmlyc3QsIHNlY29uZCwgJiBsYXN0IGRpZ2l0CitkcWNvbTcwMCBjb21wYXJlICAgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU1IC0+IDEKK2RxY29tNzAxIGNvbXBhcmUgICAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgLT4gMAorZHFjb203MDIgY29tcGFyZSAgIDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NyAtPiAtMQorZHFjb203MDMgY29tcGFyZSAgIDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgMDIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAtPiAxCitkcWNvbTcwNCBjb21wYXJlICAgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IC0+IDAKK2RxY29tNzA1IGNvbXBhcmUgICAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IDIyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgLT4gLTEKK2RxY29tNzA2IGNvbXBhcmUgICAxMTM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IDEwMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgLT4gMQorZHFjb203MDcgY29tcGFyZSAgIDExMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgMTEzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAtPiAwCitkcWNvbTcwOCBjb21wYXJlICAgMTEzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IC0+IC0xCisKKy0tIG1pc2NlbGxhbmVvdXMKK2RxY29tNzIxIGNvbXBhcmUgMTIzNDU2NzgwMDAgMSAtPiAxCitkcWNvbTcyMiBjb21wYXJlIDEgMTIzNDU2NzgwMDAgLT4gLTEKK2RxY29tNzIzIGNvbXBhcmUgMTIzNDU2NzgwMCAgMSAtPiAxCitkcWNvbTcyNCBjb21wYXJlIDEgMTIzNDU2NzgwMCAgLT4gLTEKK2RxY29tNzI1IGNvbXBhcmUgMTIzNDU2Nzg5MCAgMSAtPiAxCitkcWNvbTcyNiBjb21wYXJlIDEgMTIzNDU2Nzg5MCAgLT4gLTEKK2RxY29tNzI3IGNvbXBhcmUgMTIzNDU2Nzg5MSAgMSAtPiAxCitkcWNvbTcyOCBjb21wYXJlIDEgMTIzNDU2Nzg5MSAgLT4gLTEKK2RxY29tNzI5IGNvbXBhcmUgMTIzNDU2Nzg5MDEgMSAtPiAxCitkcWNvbTczMCBjb21wYXJlIDEgMTIzNDU2Nzg5MDEgLT4gLTEKK2RxY29tNzMxIGNvbXBhcmUgMTIzNDU2Nzg5NiAgMSAtPiAxCitkcWNvbTczMiBjb21wYXJlIDEgMTIzNDU2Nzg5NiAgLT4gLTEKKworLS0gcmVzaWR1ZSBjYXNlcyBhdCBsb3dlciBwcmVjaXNpb24KK2RxY29tNzQwIGNvbXBhcmUgIDEgIDAuOTk5OTk5OSAgLT4gMQorZHFjb203NDEgY29tcGFyZSAgMSAgMC45OTk5OTkgICAtPiAxCitkcWNvbTc0MiBjb21wYXJlICAxICAwLjk5OTk5ICAgIC0+IDEKK2RxY29tNzQzIGNvbXBhcmUgIDEgIDEuMDAwMCAgICAgLT4gMAorZHFjb203NDQgY29tcGFyZSAgMSAgMS4wMDAwMSAgICAtPiAtMQorZHFjb203NDUgY29tcGFyZSAgMSAgMS4wMDAwMDEgICAtPiAtMQorZHFjb203NDYgY29tcGFyZSAgMSAgMS4wMDAwMDAxICAtPiAtMQorZHFjb203NTAgY29tcGFyZSAgMC45OTk5OTk5ICAxICAtPiAtMQorZHFjb203NTEgY29tcGFyZSAgMC45OTk5OTkgICAxICAtPiAtMQorZHFjb203NTIgY29tcGFyZSAgMC45OTk5OSAgICAxICAtPiAtMQorZHFjb203NTMgY29tcGFyZSAgMS4wMDAwICAgICAxICAtPiAwCitkcWNvbTc1NCBjb21wYXJlICAxLjAwMDAxICAgIDEgIC0+IDEKK2RxY29tNzU1IGNvbXBhcmUgIDEuMDAwMDAxICAgMSAgLT4gMQorZHFjb203NTYgY29tcGFyZSAgMS4wMDAwMDAxICAxICAtPiAxCisKKy0tIFNwZWNpYWxzCitkcWNvbTc4MCBjb21wYXJlICBJbmYgIC1JbmYgICAtPiAgMQorZHFjb203ODEgY29tcGFyZSAgSW5mICAtMTAwMCAgLT4gIDEKK2RxY29tNzgyIGNvbXBhcmUgIEluZiAgLTEgICAgIC0+ICAxCitkcWNvbTc4MyBjb21wYXJlICBJbmYgIC0wICAgICAtPiAgMQorZHFjb203ODQgY29tcGFyZSAgSW5mICAgMCAgICAgLT4gIDEKK2RxY29tNzg1IGNvbXBhcmUgIEluZiAgIDEgICAgIC0+ICAxCitkcWNvbTc4NiBjb21wYXJlICBJbmYgICAxMDAwICAtPiAgMQorZHFjb203ODcgY29tcGFyZSAgSW5mICAgSW5mICAgLT4gIDAKK2RxY29tNzg4IGNvbXBhcmUgLTEwMDAgIEluZiAgIC0+IC0xCitkcWNvbTc4OSBjb21wYXJlIC1JbmYgICBJbmYgICAtPiAtMQorZHFjb203OTAgY29tcGFyZSAtMSAgICAgSW5mICAgLT4gLTEKK2RxY29tNzkxIGNvbXBhcmUgLTAgICAgIEluZiAgIC0+IC0xCitkcWNvbTc5MiBjb21wYXJlICAwICAgICBJbmYgICAtPiAtMQorZHFjb203OTMgY29tcGFyZSAgMSAgICAgSW5mICAgLT4gLTEKK2RxY29tNzk0IGNvbXBhcmUgIDEwMDAgIEluZiAgIC0+IC0xCitkcWNvbTc5NSBjb21wYXJlICBJbmYgICBJbmYgICAtPiAgMAorCitkcWNvbTgwMCBjb21wYXJlIC1JbmYgIC1JbmYgICAtPiAgMAorZHFjb204MDEgY29tcGFyZSAtSW5mICAtMTAwMCAgLT4gLTEKK2RxY29tODAyIGNvbXBhcmUgLUluZiAgLTEgICAgIC0+IC0xCitkcWNvbTgwMyBjb21wYXJlIC1JbmYgIC0wICAgICAtPiAtMQorZHFjb204MDQgY29tcGFyZSAtSW5mICAgMCAgICAgLT4gLTEKK2RxY29tODA1IGNvbXBhcmUgLUluZiAgIDEgICAgIC0+IC0xCitkcWNvbTgwNiBjb21wYXJlIC1JbmYgICAxMDAwICAtPiAtMQorZHFjb204MDcgY29tcGFyZSAtSW5mICAgSW5mICAgLT4gLTEKK2RxY29tODA4IGNvbXBhcmUgLUluZiAgLUluZiAgIC0+ICAwCitkcWNvbTgwOSBjb21wYXJlIC0xMDAwIC1JbmYgICAtPiAgMQorZHFjb204MTAgY29tcGFyZSAtMSAgICAtSW5mICAgLT4gIDEKK2RxY29tODExIGNvbXBhcmUgLTAgICAgLUluZiAgIC0+ICAxCitkcWNvbTgxMiBjb21wYXJlICAwICAgIC1JbmYgICAtPiAgMQorZHFjb204MTMgY29tcGFyZSAgMSAgICAtSW5mICAgLT4gIDEKK2RxY29tODE0IGNvbXBhcmUgIDEwMDAgLUluZiAgIC0+ICAxCitkcWNvbTgxNSBjb21wYXJlICBJbmYgIC1JbmYgICAtPiAgMQorCitkcWNvbTgyMSBjb21wYXJlICBOYU4gLUluZiAgICAtPiAgTmFOCitkcWNvbTgyMiBjb21wYXJlICBOYU4gLTEwMDAgICAtPiAgTmFOCitkcWNvbTgyMyBjb21wYXJlICBOYU4gLTEgICAgICAtPiAgTmFOCitkcWNvbTgyNCBjb21wYXJlICBOYU4gLTAgICAgICAtPiAgTmFOCitkcWNvbTgyNSBjb21wYXJlICBOYU4gIDAgICAgICAtPiAgTmFOCitkcWNvbTgyNiBjb21wYXJlICBOYU4gIDEgICAgICAtPiAgTmFOCitkcWNvbTgyNyBjb21wYXJlICBOYU4gIDEwMDAgICAtPiAgTmFOCitkcWNvbTgyOCBjb21wYXJlICBOYU4gIEluZiAgICAtPiAgTmFOCitkcWNvbTgyOSBjb21wYXJlICBOYU4gIE5hTiAgICAtPiAgTmFOCitkcWNvbTgzMCBjb21wYXJlIC1JbmYgIE5hTiAgICAtPiAgTmFOCitkcWNvbTgzMSBjb21wYXJlIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkcWNvbTgzMiBjb21wYXJlIC0xICAgIE5hTiAgICAtPiAgTmFOCitkcWNvbTgzMyBjb21wYXJlIC0wICAgIE5hTiAgICAtPiAgTmFOCitkcWNvbTgzNCBjb21wYXJlICAwICAgIE5hTiAgICAtPiAgTmFOCitkcWNvbTgzNSBjb21wYXJlICAxICAgIE5hTiAgICAtPiAgTmFOCitkcWNvbTgzNiBjb21wYXJlICAxMDAwIE5hTiAgICAtPiAgTmFOCitkcWNvbTgzNyBjb21wYXJlICBJbmYgIE5hTiAgICAtPiAgTmFOCitkcWNvbTgzOCBjb21wYXJlIC1OYU4gLU5hTiAgICAtPiAtTmFOCitkcWNvbTgzOSBjb21wYXJlICtOYU4gLU5hTiAgICAtPiAgTmFOCitkcWNvbTg0MCBjb21wYXJlIC1OYU4gK05hTiAgICAtPiAtTmFOCisKK2RxY29tODQxIGNvbXBhcmUgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg0MiBjb21wYXJlICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NDMgY29tcGFyZSAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODQ0IGNvbXBhcmUgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg0NSBjb21wYXJlICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NDYgY29tcGFyZSAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODQ3IGNvbXBhcmUgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg0OCBjb21wYXJlICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NDkgY29tcGFyZSAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODUwIGNvbXBhcmUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg1MSBjb21wYXJlIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NTIgY29tcGFyZSAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODUzIGNvbXBhcmUgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg1NCBjb21wYXJlIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NTUgY29tcGFyZSAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODU2IGNvbXBhcmUgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg1NyBjb21wYXJlICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NTggY29tcGFyZSAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODU5IGNvbXBhcmUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxY29tODYwIGNvbXBhcmUgIE5hTjkgLUluZiAgIC0+ICBOYU45CitkcWNvbTg2MSBjb21wYXJlICBOYU44ICA5OTkgICAtPiAgTmFOOAorZHFjb204NjIgY29tcGFyZSAgTmFONzcgSW5mICAgLT4gIE5hTjc3CitkcWNvbTg2MyBjb21wYXJlIC1OYU42NyBOYU41ICAtPiAtTmFONjcKK2RxY29tODY0IGNvbXBhcmUgLUluZiAgLU5hTjQgIC0+IC1OYU40CitkcWNvbTg2NSBjb21wYXJlIC05OTkgIC1OYU4zMyAtPiAtTmFOMzMKK2RxY29tODY2IGNvbXBhcmUgIEluZiAgIE5hTjIgIC0+ICBOYU4yCitkcWNvbTg2NyBjb21wYXJlIC1OYU40MSAtTmFONDIgLT4gLU5hTjQxCitkcWNvbTg2OCBjb21wYXJlICtOYU40MSAtTmFONDIgLT4gIE5hTjQxCitkcWNvbTg2OSBjb21wYXJlIC1OYU40MSArTmFONDIgLT4gLU5hTjQxCitkcWNvbTg3MCBjb21wYXJlICtOYU40MSArTmFONDIgLT4gIE5hTjQxCisKK2RxY29tODcxIGNvbXBhcmUgLXNOYU45OSAtSW5mICAgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NzIgY29tcGFyZSAgc05hTjk4IC0xMSAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg3MyBjb21wYXJlICBzTmFOOTcgIE5hTiAgICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODc0IGNvbXBhcmUgIHNOYU4xNiBzTmFOOTQgIC0+ICBOYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NzUgY29tcGFyZSAgTmFOODUgIHNOYU44MyAgLT4gIE5hTjgzIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg3NiBjb21wYXJlIC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODc3IGNvbXBhcmUgIDA4OCAgICBzTmFOODEgIC0+ICBOYU44MSBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NzggY29tcGFyZSAgSW5mICAgIHNOYU45MCAgLT4gIE5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg3OSBjb21wYXJlICBOYU4gICAtc05hTjg5ICAtPiAtTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworLS0gd2lkZSByYW5nZQorZHFjb204ODAgY29tcGFyZSArMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSs2MTQ0IC0+IC0xCitkcWNvbTg4MSBjb21wYXJlIDlFKzYxNDQgKzEuMjM0NTY3ODkwMTIzNDVFLTAgLT4gIDEKK2RxY29tODgyIGNvbXBhcmUgKzAuMTAwIDlFLTYxNDMgICAgICAgICAgICAgICAtPiAgMQorZHFjb204ODMgY29tcGFyZSA5RS02MTQzICswLjEwMCAgICAgICAgICAgICAgIC0+IC0xCitkcWNvbTg4NSBjb21wYXJlIC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzYxNDQgLT4gLTEKK2RxY29tODg2IGNvbXBhcmUgOUUrNjE0NCAtMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAgMQorZHFjb204ODcgY29tcGFyZSAtMC4xMDAgOUUtNjE0MyAgICAgICAgICAgICAgIC0+IC0xCitkcWNvbTg4OCBjb21wYXJlIDlFLTYxNDMgLTAuMTAwICAgICAgICAgICAgICAgLT4gIDEKKworLS0gc2lnbnMKK2RxY29tOTAxIGNvbXBhcmUgIDFlKzc3ICAxZSsxMSAtPiAgMQorZHFjb205MDIgY29tcGFyZSAgMWUrNzcgLTFlKzExIC0+ICAxCitkcWNvbTkwMyBjb21wYXJlIC0xZSs3NyAgMWUrMTEgLT4gLTEKK2RxY29tOTA0IGNvbXBhcmUgLTFlKzc3IC0xZSsxMSAtPiAtMQorZHFjb205MDUgY29tcGFyZSAgMWUtNzcgIDFlLTExIC0+IC0xCitkcWNvbTkwNiBjb21wYXJlICAxZS03NyAtMWUtMTEgLT4gIDEKK2RxY29tOTA3IGNvbXBhcmUgLTFlLTc3ICAxZS0xMSAtPiAtMQorZHFjb205MDggY29tcGFyZSAtMWUtNzcgLTFlLTExIC0+ICAxCisKKy0tIGZ1bGwgYWxpZ25tZW50IHJhbmdlLCBib3RoIHdheXMKK2RxY29tcDEwMDEgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAwCitkcWNvbXAxMDAyIGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gMAorZHFjb21wMTAwMyBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgIC0+IDAKK2RxY29tcDEwMDQgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAtPiAwCitkcWNvbXAxMDA1IGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgLT4gMAorZHFjb21wMTAwNiBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDAKK2RxY29tcDEwMDcgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAtPiAwCitkcWNvbXAxMDA4IGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgLT4gMAorZHFjb21wMTAwOSBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgIC0+IDAKK2RxY29tcDEwMTAgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAtPiAwCitkcWNvbXAxMDExIGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgLT4gMAorZHFjb21wMTAxMiBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgIC0+IDAKK2RxY29tcDEwMTMgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAtPiAwCitkcWNvbXAxMDE0IGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgLT4gMAorZHFjb21wMTAxNSBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgIC0+IDAKK2RxY29tcDEwMTYgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgICAtPiAwCitkcWNvbXAxMDE3IGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgICAgLT4gMAorZHFjb21wMTAxOCBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgICAgIC0+IDAKK2RxY29tcDEwMTkgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwICAtPiAwCitkcWNvbXAxMDIwIGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwICAgLT4gMAorZHFjb21wMTAyMSBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwICAgIC0+IDAKK2RxY29tcDEwMjIgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwICAgICAtPiAwCitkcWNvbXAxMDIzIGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwICAgICAgLT4gMAorZHFjb21wMTAyNCBjb21wYXJlIDEgMS4wMDAwMDAwMDAwICAgICAgIC0+IDAKK2RxY29tcDEwMjUgY29tcGFyZSAxIDEuMDAwMDAwMDAwICAgICAgICAtPiAwCitkcWNvbXAxMDI2IGNvbXBhcmUgMSAxLjAwMDAwMDAwICAgICAgICAgLT4gMAorZHFjb21wMTAyNyBjb21wYXJlIDEgMS4wMDAwMDAwICAgICAgICAgIC0+IDAKK2RxY29tcDEwMjggY29tcGFyZSAxIDEuMDAwMDAwICAgICAgICAgICAtPiAwCitkcWNvbXAxMDI5IGNvbXBhcmUgMSAxLjAwMDAwICAgICAgICAgICAgLT4gMAorZHFjb21wMTAzMCBjb21wYXJlIDEgMS4wMDAwICAgICAgICAgICAgIC0+IDAKK2RxY29tcDEwMzEgY29tcGFyZSAxIDEuMDAwICAgICAgICAgICAgICAtPiAwCitkcWNvbXAxMDMyIGNvbXBhcmUgMSAxLjAwICAgICAgICAgICAgICAgLT4gMAorZHFjb21wMTAzMyBjb21wYXJlIDEgMS4wICAgICAgICAgICAgICAgIC0+IDAKKworZHFjb21wMTA0MSBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAxIC0+IDAKK2RxY29tcDEwNDIgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgMSAtPiAwCitkcWNvbXAxMDQzIGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgIDEgLT4gMAorZHFjb21wMTA0NCBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAxIC0+IDAKK2RxY29tcDEwNDUgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgMSAtPiAwCitkcWNvbXAxMDQ2IGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIDEgLT4gMAorZHFjb21wMTA0NyBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAxIC0+IDAKK2RxY29tcDEwNDggY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgMSAtPiAwCitkcWNvbXAxMDQ5IGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgIDEgLT4gMAorZHFjb21wMTA1MCBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAxIC0+IDAKK2RxY29tcDEwNTEgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgMSAtPiAwCitkcWNvbXAxMDUyIGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgIDEgLT4gMAorZHFjb21wMTA1MyBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAxIC0+IDAKK2RxY29tcDEwNTQgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgMSAtPiAwCitkcWNvbXAxMDU1IGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgIDEgLT4gMAorZHFjb21wMTA1NiBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgICAxIC0+IDAKK2RxY29tcDEwNTcgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgICAgMSAtPiAwCitkcWNvbXAxMDU4IGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgICAgIDEgLT4gMAorZHFjb21wMTA1OSBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwICAxIC0+IDAKK2RxY29tcDEwNjAgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwICAgMSAtPiAwCitkcWNvbXAxMDYxIGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwICAgIDEgLT4gMAorZHFjb21wMTA2MiBjb21wYXJlIDEuMDAwMDAwMDAwMDAwICAgICAxIC0+IDAKK2RxY29tcDEwNjMgY29tcGFyZSAxLjAwMDAwMDAwMDAwICAgICAgMSAtPiAwCitkcWNvbXAxMDY0IGNvbXBhcmUgMS4wMDAwMDAwMDAwICAgICAgIDEgLT4gMAorZHFjb21wMTA2NSBjb21wYXJlIDEuMDAwMDAwMDAwICAgICAgICAxIC0+IDAKK2RxY29tcDEwNjYgY29tcGFyZSAxLjAwMDAwMDAwICAgICAgICAgMSAtPiAwCitkcWNvbXAxMDY3IGNvbXBhcmUgMS4wMDAwMDAwICAgICAgICAgIDEgLT4gMAorZHFjb21wMTA2OCBjb21wYXJlIDEuMDAwMDAwICAgICAgICAgICAxIC0+IDAKK2RxY29tcDEwNjkgY29tcGFyZSAxLjAwMDAwICAgICAgICAgICAgMSAtPiAwCitkcWNvbXAxMDcwIGNvbXBhcmUgMS4wMDAwICAgICAgICAgICAgIDEgLT4gMAorZHFjb21wMTA3MSBjb21wYXJlIDEuMDAwICAgICAgICAgICAgICAxIC0+IDAKK2RxY29tcDEwNzIgY29tcGFyZSAxLjAwICAgICAgICAgICAgICAgMSAtPiAwCitkcWNvbXAxMDczIGNvbXBhcmUgMS4wICAgICAgICAgICAgICAgIDEgLT4gMAorCistLSBjaGVjayBNU0QgYWx3YXlzIGRldGVjdGVkIG5vbi16ZXJvCitkcWNvbXAxMDgwIGNvbXBhcmUgMCAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gMAorZHFjb21wMTA4MSBjb21wYXJlIDAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIC0+IC0xCitkcWNvbXAxMDgyIGNvbXBhcmUgMCAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gLTEKK2RxY29tcDEwODMgY29tcGFyZSAwIDMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAtMQorZHFjb21wMTA4NCBjb21wYXJlIDAgNC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIC0+IC0xCitkcWNvbXAxMDg1IGNvbXBhcmUgMCA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gLTEKK2RxY29tcDEwODYgY29tcGFyZSAwIDYuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAtMQorZHFjb21wMTA4NyBjb21wYXJlIDAgNy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIC0+IC0xCitkcWNvbXAxMDg4IGNvbXBhcmUgMCA4LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gLTEKK2RxY29tcDEwODkgY29tcGFyZSAwIDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAtMQorZHFjb21wMTA5MCBjb21wYXJlIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAwIC0+IDAKK2RxY29tcDEwOTEgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgMCAtPiAxCitkcWNvbXAxMDkyIGNvbXBhcmUgMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIDAgLT4gMQorZHFjb21wMTA5MyBjb21wYXJlIDMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAwIC0+IDEKK2RxY29tcDEwOTQgY29tcGFyZSA0LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgMCAtPiAxCitkcWNvbXAxMDk1IGNvbXBhcmUgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIDAgLT4gMQorZHFjb21wMTA5NiBjb21wYXJlIDYuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAwIC0+IDEKK2RxY29tcDEwOTcgY29tcGFyZSA3LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgMCAtPiAxCitkcWNvbXAxMDk4IGNvbXBhcmUgOC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIDAgLT4gMQorZHFjb21wMTA5OSBjb21wYXJlIDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAwIC0+IDEKKworLS0gTnVsbCB0ZXN0cworZHFjb205OTAgY29tcGFyZSAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxY29tOTkxIGNvbXBhcmUgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29tcGFyZVNpZy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvbXBhcmVTaWcuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTVmMDkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvbXBhcmVTaWcuZGVjVGVzdApAQCAtMCwwICsxLDY0NyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcUNvbXBhcmVTaWcuZGVjVGVzdCAtLSBkZWNRdWFkIGNvbXBhcmlzb247IGFsbCBOYU5zIHNpZ25hbCAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIE5vdGUgdGhhdCB3ZSBjYW5ub3QgYXNzdW1lIGFkZC9zdWJ0cmFjdCB0ZXN0cyBjb3ZlciBwYXRocyBhZGVxdWF0ZWx5LAorLS0gaGVyZSwgYmVjYXVzZSB0aGUgY29kZSBtaWdodCBiZSBxdWl0ZSBkaWZmZXJlbnQgKGNvbXBhcmlzb24gY2Fubm90CistLSBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHNvIGFjdHVhbCBzdWJ0cmFjdGlvbnMgYXJlIG5vdCBuZWNlc3NhcnkpLgorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY1F1YWRzLgorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZHFjbXMwMDEgY29tcGFyZXNpZyAgLTIgIC0yICAtPiAwCitkcWNtczAwMiBjb21wYXJlc2lnICAtMiAgLTEgIC0+IC0xCitkcWNtczAwMyBjb21wYXJlc2lnICAtMiAgIDAgIC0+IC0xCitkcWNtczAwNCBjb21wYXJlc2lnICAtMiAgIDEgIC0+IC0xCitkcWNtczAwNSBjb21wYXJlc2lnICAtMiAgIDIgIC0+IC0xCitkcWNtczAwNiBjb21wYXJlc2lnICAtMSAgLTIgIC0+IDEKK2RxY21zMDA3IGNvbXBhcmVzaWcgIC0xICAtMSAgLT4gMAorZHFjbXMwMDggY29tcGFyZXNpZyAgLTEgICAwICAtPiAtMQorZHFjbXMwMDkgY29tcGFyZXNpZyAgLTEgICAxICAtPiAtMQorZHFjbXMwMTAgY29tcGFyZXNpZyAgLTEgICAyICAtPiAtMQorZHFjbXMwMTEgY29tcGFyZXNpZyAgIDAgIC0yICAtPiAxCitkcWNtczAxMiBjb21wYXJlc2lnICAgMCAgLTEgIC0+IDEKK2RxY21zMDEzIGNvbXBhcmVzaWcgICAwICAgMCAgLT4gMAorZHFjbXMwMTQgY29tcGFyZXNpZyAgIDAgICAxICAtPiAtMQorZHFjbXMwMTUgY29tcGFyZXNpZyAgIDAgICAyICAtPiAtMQorZHFjbXMwMTYgY29tcGFyZXNpZyAgIDEgIC0yICAtPiAxCitkcWNtczAxNyBjb21wYXJlc2lnICAgMSAgLTEgIC0+IDEKK2RxY21zMDE4IGNvbXBhcmVzaWcgICAxICAgMCAgLT4gMQorZHFjbXMwMTkgY29tcGFyZXNpZyAgIDEgICAxICAtPiAwCitkcWNtczAyMCBjb21wYXJlc2lnICAgMSAgIDIgIC0+IC0xCitkcWNtczAyMSBjb21wYXJlc2lnICAgMiAgLTIgIC0+IDEKK2RxY21zMDIyIGNvbXBhcmVzaWcgICAyICAtMSAgLT4gMQorZHFjbXMwMjMgY29tcGFyZXNpZyAgIDIgICAwICAtPiAxCitkcWNtczAyNSBjb21wYXJlc2lnICAgMiAgIDEgIC0+IDEKK2RxY21zMDI2IGNvbXBhcmVzaWcgICAyICAgMiAgLT4gMAorCitkcWNtczAzMSBjb21wYXJlc2lnICAtMjAgIC0yMCAgLT4gMAorZHFjbXMwMzIgY29tcGFyZXNpZyAgLTIwICAtMTAgIC0+IC0xCitkcWNtczAzMyBjb21wYXJlc2lnICAtMjAgICAwMCAgLT4gLTEKK2RxY21zMDM0IGNvbXBhcmVzaWcgIC0yMCAgIDEwICAtPiAtMQorZHFjbXMwMzUgY29tcGFyZXNpZyAgLTIwICAgMjAgIC0+IC0xCitkcWNtczAzNiBjb21wYXJlc2lnICAtMTAgIC0yMCAgLT4gMQorZHFjbXMwMzcgY29tcGFyZXNpZyAgLTEwICAtMTAgIC0+IDAKK2RxY21zMDM4IGNvbXBhcmVzaWcgIC0xMCAgIDAwICAtPiAtMQorZHFjbXMwMzkgY29tcGFyZXNpZyAgLTEwICAgMTAgIC0+IC0xCitkcWNtczA0MCBjb21wYXJlc2lnICAtMTAgICAyMCAgLT4gLTEKK2RxY21zMDQxIGNvbXBhcmVzaWcgICAwMCAgLTIwICAtPiAxCitkcWNtczA0MiBjb21wYXJlc2lnICAgMDAgIC0xMCAgLT4gMQorZHFjbXMwNDMgY29tcGFyZXNpZyAgIDAwICAgMDAgIC0+IDAKK2RxY21zMDQ0IGNvbXBhcmVzaWcgICAwMCAgIDEwICAtPiAtMQorZHFjbXMwNDUgY29tcGFyZXNpZyAgIDAwICAgMjAgIC0+IC0xCitkcWNtczA0NiBjb21wYXJlc2lnICAgMTAgIC0yMCAgLT4gMQorZHFjbXMwNDcgY29tcGFyZXNpZyAgIDEwICAtMTAgIC0+IDEKK2RxY21zMDQ4IGNvbXBhcmVzaWcgICAxMCAgIDAwICAtPiAxCitkcWNtczA0OSBjb21wYXJlc2lnICAgMTAgICAxMCAgLT4gMAorZHFjbXMwNTAgY29tcGFyZXNpZyAgIDEwICAgMjAgIC0+IC0xCitkcWNtczA1MSBjb21wYXJlc2lnICAgMjAgIC0yMCAgLT4gMQorZHFjbXMwNTIgY29tcGFyZXNpZyAgIDIwICAtMTAgIC0+IDEKK2RxY21zMDUzIGNvbXBhcmVzaWcgICAyMCAgIDAwICAtPiAxCitkcWNtczA1NSBjb21wYXJlc2lnICAgMjAgICAxMCAgLT4gMQorZHFjbXMwNTYgY29tcGFyZXNpZyAgIDIwICAgMjAgIC0+IDAKKworZHFjbXMwNjEgY29tcGFyZXNpZyAgLTIuMCAgLTIuMCAgLT4gMAorZHFjbXMwNjIgY29tcGFyZXNpZyAgLTIuMCAgLTEuMCAgLT4gLTEKK2RxY21zMDYzIGNvbXBhcmVzaWcgIC0yLjAgICAwLjAgIC0+IC0xCitkcWNtczA2NCBjb21wYXJlc2lnICAtMi4wICAgMS4wICAtPiAtMQorZHFjbXMwNjUgY29tcGFyZXNpZyAgLTIuMCAgIDIuMCAgLT4gLTEKK2RxY21zMDY2IGNvbXBhcmVzaWcgIC0xLjAgIC0yLjAgIC0+IDEKK2RxY21zMDY3IGNvbXBhcmVzaWcgIC0xLjAgIC0xLjAgIC0+IDAKK2RxY21zMDY4IGNvbXBhcmVzaWcgIC0xLjAgICAwLjAgIC0+IC0xCitkcWNtczA2OSBjb21wYXJlc2lnICAtMS4wICAgMS4wICAtPiAtMQorZHFjbXMwNzAgY29tcGFyZXNpZyAgLTEuMCAgIDIuMCAgLT4gLTEKK2RxY21zMDcxIGNvbXBhcmVzaWcgICAwLjAgIC0yLjAgIC0+IDEKK2RxY21zMDcyIGNvbXBhcmVzaWcgICAwLjAgIC0xLjAgIC0+IDEKK2RxY21zMDczIGNvbXBhcmVzaWcgICAwLjAgICAwLjAgIC0+IDAKK2RxY21zMDc0IGNvbXBhcmVzaWcgICAwLjAgICAxLjAgIC0+IC0xCitkcWNtczA3NSBjb21wYXJlc2lnICAgMC4wICAgMi4wICAtPiAtMQorZHFjbXMwNzYgY29tcGFyZXNpZyAgIDEuMCAgLTIuMCAgLT4gMQorZHFjbXMwNzcgY29tcGFyZXNpZyAgIDEuMCAgLTEuMCAgLT4gMQorZHFjbXMwNzggY29tcGFyZXNpZyAgIDEuMCAgIDAuMCAgLT4gMQorZHFjbXMwNzkgY29tcGFyZXNpZyAgIDEuMCAgIDEuMCAgLT4gMAorZHFjbXMwODAgY29tcGFyZXNpZyAgIDEuMCAgIDIuMCAgLT4gLTEKK2RxY21zMDgxIGNvbXBhcmVzaWcgICAyLjAgIC0yLjAgIC0+IDEKK2RxY21zMDgyIGNvbXBhcmVzaWcgICAyLjAgIC0xLjAgIC0+IDEKK2RxY21zMDgzIGNvbXBhcmVzaWcgICAyLjAgICAwLjAgIC0+IDEKK2RxY21zMDg1IGNvbXBhcmVzaWcgICAyLjAgICAxLjAgIC0+IDEKK2RxY21zMDg2IGNvbXBhcmVzaWcgICAyLjAgICAyLjAgIC0+IDAKKworLS0gbm93IHNvbWUgY2FzZXMgd2hpY2ggbWlnaHQgb3ZlcmZsb3cgaWYgc3VidHJhY3Qgd2VyZSB1c2VkCitkcWNtczA5MCBjb21wYXJlc2lnICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gMAorZHFjbXMwOTEgY29tcGFyZXNpZyAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0+IC0xCitkcWNtczA5MiBjb21wYXJlc2lnICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLT4gMQorZHFjbXMwOTMgY29tcGFyZXNpZyAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+IDAKKworLS0gc29tZSBkaWZmZXJpbmcgbGVuZ3RoL2V4cG9uZW50IGNhc2VzCitkcWNtczEwMCBjb21wYXJlc2lnICAgNy4wICAgIDcuMCAgICAtPiAwCitkcWNtczEwMSBjb21wYXJlc2lnICAgNy4wICAgIDcgICAgICAtPiAwCitkcWNtczEwMiBjb21wYXJlc2lnICAgNyAgICAgIDcuMCAgICAtPiAwCitkcWNtczEwMyBjb21wYXJlc2lnICAgN0UrMCAgIDcuMCAgICAtPiAwCitkcWNtczEwNCBjb21wYXJlc2lnICAgNzBFLTEgIDcuMCAgICAtPiAwCitkcWNtczEwNSBjb21wYXJlc2lnICAgMC43RSsxIDcgICAgICAtPiAwCitkcWNtczEwNiBjb21wYXJlc2lnICAgNzBFLTEgIDcgICAgICAtPiAwCitkcWNtczEwNyBjb21wYXJlc2lnICAgNy4wICAgIDdFKzAgICAtPiAwCitkcWNtczEwOCBjb21wYXJlc2lnICAgNy4wICAgIDcwRS0xICAtPiAwCitkcWNtczEwOSBjb21wYXJlc2lnICAgNyAgICAgIDAuN0UrMSAtPiAwCitkcWNtczExMCBjb21wYXJlc2lnICAgNyAgICAgIDcwRS0xICAtPiAwCisKK2RxY21zMTIwIGNvbXBhcmVzaWcgICA4LjAgICAgNy4wICAgIC0+IDEKK2RxY21zMTIxIGNvbXBhcmVzaWcgICA4LjAgICAgNyAgICAgIC0+IDEKK2RxY21zMTIyIGNvbXBhcmVzaWcgICA4ICAgICAgNy4wICAgIC0+IDEKK2RxY21zMTIzIGNvbXBhcmVzaWcgICA4RSswICAgNy4wICAgIC0+IDEKK2RxY21zMTI0IGNvbXBhcmVzaWcgICA4MEUtMSAgNy4wICAgIC0+IDEKK2RxY21zMTI1IGNvbXBhcmVzaWcgICAwLjhFKzEgNyAgICAgIC0+IDEKK2RxY21zMTI2IGNvbXBhcmVzaWcgICA4MEUtMSAgNyAgICAgIC0+IDEKK2RxY21zMTI3IGNvbXBhcmVzaWcgICA4LjAgICAgN0UrMCAgIC0+IDEKK2RxY21zMTI4IGNvbXBhcmVzaWcgICA4LjAgICAgNzBFLTEgIC0+IDEKK2RxY21zMTI5IGNvbXBhcmVzaWcgICA4ICAgICAgMC43RSsxICAtPiAxCitkcWNtczEzMCBjb21wYXJlc2lnICAgOCAgICAgIDcwRS0xICAtPiAxCisKK2RxY21zMTQwIGNvbXBhcmVzaWcgICA4LjAgICAgOS4wICAgIC0+IC0xCitkcWNtczE0MSBjb21wYXJlc2lnICAgOC4wICAgIDkgICAgICAtPiAtMQorZHFjbXMxNDIgY29tcGFyZXNpZyAgIDggICAgICA5LjAgICAgLT4gLTEKK2RxY21zMTQzIGNvbXBhcmVzaWcgICA4RSswICAgOS4wICAgIC0+IC0xCitkcWNtczE0NCBjb21wYXJlc2lnICAgODBFLTEgIDkuMCAgICAtPiAtMQorZHFjbXMxNDUgY29tcGFyZXNpZyAgIDAuOEUrMSA5ICAgICAgLT4gLTEKK2RxY21zMTQ2IGNvbXBhcmVzaWcgICA4MEUtMSAgOSAgICAgIC0+IC0xCitkcWNtczE0NyBjb21wYXJlc2lnICAgOC4wICAgIDlFKzAgICAtPiAtMQorZHFjbXMxNDggY29tcGFyZXNpZyAgIDguMCAgICA5MEUtMSAgLT4gLTEKK2RxY21zMTQ5IGNvbXBhcmVzaWcgICA4ICAgICAgMC45RSsxIC0+IC0xCitkcWNtczE1MCBjb21wYXJlc2lnICAgOCAgICAgIDkwRS0xICAtPiAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0rIC4uCitkcWNtczIwMCBjb21wYXJlc2lnICAtNy4wICAgIDcuMCAgICAtPiAtMQorZHFjbXMyMDEgY29tcGFyZXNpZyAgLTcuMCAgICA3ICAgICAgLT4gLTEKK2RxY21zMjAyIGNvbXBhcmVzaWcgIC03ICAgICAgNy4wICAgIC0+IC0xCitkcWNtczIwMyBjb21wYXJlc2lnICAtN0UrMCAgIDcuMCAgICAtPiAtMQorZHFjbXMyMDQgY29tcGFyZXNpZyAgLTcwRS0xICA3LjAgICAgLT4gLTEKK2RxY21zMjA1IGNvbXBhcmVzaWcgIC0wLjdFKzEgNyAgICAgIC0+IC0xCitkcWNtczIwNiBjb21wYXJlc2lnICAtNzBFLTEgIDcgICAgICAtPiAtMQorZHFjbXMyMDcgY29tcGFyZXNpZyAgLTcuMCAgICA3RSswICAgLT4gLTEKK2RxY21zMjA4IGNvbXBhcmVzaWcgIC03LjAgICAgNzBFLTEgIC0+IC0xCitkcWNtczIwOSBjb21wYXJlc2lnICAtNyAgICAgIDAuN0UrMSAtPiAtMQorZHFjbXMyMTAgY29tcGFyZXNpZyAgLTcgICAgICA3MEUtMSAgLT4gLTEKKworZHFjbXMyMjAgY29tcGFyZXNpZyAgLTguMCAgICA3LjAgICAgLT4gLTEKK2RxY21zMjIxIGNvbXBhcmVzaWcgIC04LjAgICAgNyAgICAgIC0+IC0xCitkcWNtczIyMiBjb21wYXJlc2lnICAtOCAgICAgIDcuMCAgICAtPiAtMQorZHFjbXMyMjMgY29tcGFyZXNpZyAgLThFKzAgICA3LjAgICAgLT4gLTEKK2RxY21zMjI0IGNvbXBhcmVzaWcgIC04MEUtMSAgNy4wICAgIC0+IC0xCitkcWNtczIyNSBjb21wYXJlc2lnICAtMC44RSsxIDcgICAgICAtPiAtMQorZHFjbXMyMjYgY29tcGFyZXNpZyAgLTgwRS0xICA3ICAgICAgLT4gLTEKK2RxY21zMjI3IGNvbXBhcmVzaWcgIC04LjAgICAgN0UrMCAgIC0+IC0xCitkcWNtczIyOCBjb21wYXJlc2lnICAtOC4wICAgIDcwRS0xICAtPiAtMQorZHFjbXMyMjkgY29tcGFyZXNpZyAgLTggICAgICAwLjdFKzEgLT4gLTEKK2RxY21zMjMwIGNvbXBhcmVzaWcgIC04ICAgICAgNzBFLTEgIC0+IC0xCisKK2RxY21zMjQwIGNvbXBhcmVzaWcgIC04LjAgICAgOS4wICAgIC0+IC0xCitkcWNtczI0MSBjb21wYXJlc2lnICAtOC4wICAgIDkgICAgICAtPiAtMQorZHFjbXMyNDIgY29tcGFyZXNpZyAgLTggICAgICA5LjAgICAgLT4gLTEKK2RxY21zMjQzIGNvbXBhcmVzaWcgIC04RSswICAgOS4wICAgIC0+IC0xCitkcWNtczI0NCBjb21wYXJlc2lnICAtODBFLTEgIDkuMCAgICAtPiAtMQorZHFjbXMyNDUgY29tcGFyZXNpZyAgLTAuOEUrMSA5ICAgICAgLT4gLTEKK2RxY21zMjQ2IGNvbXBhcmVzaWcgIC04MEUtMSAgOSAgICAgIC0+IC0xCitkcWNtczI0NyBjb21wYXJlc2lnICAtOC4wICAgIDlFKzAgICAtPiAtMQorZHFjbXMyNDggY29tcGFyZXNpZyAgLTguMCAgICA5MEUtMSAgLT4gLTEKK2RxY21zMjQ5IGNvbXBhcmVzaWcgIC04ICAgICAgMC45RSsxIC0+IC0xCitkcWNtczI1MCBjb21wYXJlc2lnICAtOCAgICAgIDkwRS0xICAtPiAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzICstIC4uCitkcWNtczMwMCBjb21wYXJlc2lnICAgNy4wICAgIC03LjAgICAgLT4gMQorZHFjbXMzMDEgY29tcGFyZXNpZyAgIDcuMCAgICAtNyAgICAgIC0+IDEKK2RxY21zMzAyIGNvbXBhcmVzaWcgICA3ICAgICAgLTcuMCAgICAtPiAxCitkcWNtczMwMyBjb21wYXJlc2lnICAgN0UrMCAgIC03LjAgICAgLT4gMQorZHFjbXMzMDQgY29tcGFyZXNpZyAgIDcwRS0xICAtNy4wICAgIC0+IDEKK2RxY21zMzA1IGNvbXBhcmVzaWcgICAuN0UrMSAgLTcgICAgICAtPiAxCitkcWNtczMwNiBjb21wYXJlc2lnICAgNzBFLTEgIC03ICAgICAgLT4gMQorZHFjbXMzMDcgY29tcGFyZXNpZyAgIDcuMCAgICAtN0UrMCAgIC0+IDEKK2RxY21zMzA4IGNvbXBhcmVzaWcgICA3LjAgICAgLTcwRS0xICAtPiAxCitkcWNtczMwOSBjb21wYXJlc2lnICAgNyAgICAgIC0uN0UrMSAgLT4gMQorZHFjbXMzMTAgY29tcGFyZXNpZyAgIDcgICAgICAtNzBFLTEgIC0+IDEKKworZHFjbXMzMjAgY29tcGFyZXNpZyAgIDguMCAgICAtNy4wICAgIC0+IDEKK2RxY21zMzIxIGNvbXBhcmVzaWcgICA4LjAgICAgLTcgICAgICAtPiAxCitkcWNtczMyMiBjb21wYXJlc2lnICAgOCAgICAgIC03LjAgICAgLT4gMQorZHFjbXMzMjMgY29tcGFyZXNpZyAgIDhFKzAgICAtNy4wICAgIC0+IDEKK2RxY21zMzI0IGNvbXBhcmVzaWcgICA4MEUtMSAgLTcuMCAgICAtPiAxCitkcWNtczMyNSBjb21wYXJlc2lnICAgLjhFKzEgIC03ICAgICAgLT4gMQorZHFjbXMzMjYgY29tcGFyZXNpZyAgIDgwRS0xICAtNyAgICAgIC0+IDEKK2RxY21zMzI3IGNvbXBhcmVzaWcgICA4LjAgICAgLTdFKzAgICAtPiAxCitkcWNtczMyOCBjb21wYXJlc2lnICAgOC4wICAgIC03MEUtMSAgLT4gMQorZHFjbXMzMjkgY29tcGFyZXNpZyAgIDggICAgICAtLjdFKzEgIC0+IDEKK2RxY21zMzMwIGNvbXBhcmVzaWcgICA4ICAgICAgLTcwRS0xICAtPiAxCisKK2RxY21zMzQwIGNvbXBhcmVzaWcgICA4LjAgICAgLTkuMCAgICAtPiAxCitkcWNtczM0MSBjb21wYXJlc2lnICAgOC4wICAgIC05ICAgICAgLT4gMQorZHFjbXMzNDIgY29tcGFyZXNpZyAgIDggICAgICAtOS4wICAgIC0+IDEKK2RxY21zMzQzIGNvbXBhcmVzaWcgICA4RSswICAgLTkuMCAgICAtPiAxCitkcWNtczM0NCBjb21wYXJlc2lnICAgODBFLTEgIC05LjAgICAgLT4gMQorZHFjbXMzNDUgY29tcGFyZXNpZyAgIC44RSsxICAtOSAgICAgIC0+IDEKK2RxY21zMzQ2IGNvbXBhcmVzaWcgICA4MEUtMSAgLTkgICAgICAtPiAxCitkcWNtczM0NyBjb21wYXJlc2lnICAgOC4wICAgIC05RSswICAgLT4gMQorZHFjbXMzNDggY29tcGFyZXNpZyAgIDguMCAgICAtOTBFLTEgIC0+IDEKK2RxY21zMzQ5IGNvbXBhcmVzaWcgICA4ICAgICAgLS45RSsxICAtPiAxCitkcWNtczM1MCBjb21wYXJlc2lnICAgOCAgICAgIC05MEUtMSAgLT4gMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0tIC4uCitkcWNtczQwMCBjb21wYXJlc2lnICAgLTcuMCAgICAtNy4wICAgIC0+IDAKK2RxY21zNDAxIGNvbXBhcmVzaWcgICAtNy4wICAgIC03ICAgICAgLT4gMAorZHFjbXM0MDIgY29tcGFyZXNpZyAgIC03ICAgICAgLTcuMCAgICAtPiAwCitkcWNtczQwMyBjb21wYXJlc2lnICAgLTdFKzAgICAtNy4wICAgIC0+IDAKK2RxY21zNDA0IGNvbXBhcmVzaWcgICAtNzBFLTEgIC03LjAgICAgLT4gMAorZHFjbXM0MDUgY29tcGFyZXNpZyAgIC0uN0UrMSAgLTcgICAgICAtPiAwCitkcWNtczQwNiBjb21wYXJlc2lnICAgLTcwRS0xICAtNyAgICAgIC0+IDAKK2RxY21zNDA3IGNvbXBhcmVzaWcgICAtNy4wICAgIC03RSswICAgLT4gMAorZHFjbXM0MDggY29tcGFyZXNpZyAgIC03LjAgICAgLTcwRS0xICAtPiAwCitkcWNtczQwOSBjb21wYXJlc2lnICAgLTcgICAgICAtLjdFKzEgIC0+IDAKK2RxY21zNDEwIGNvbXBhcmVzaWcgICAtNyAgICAgIC03MEUtMSAgLT4gMAorCitkcWNtczQyMCBjb21wYXJlc2lnICAgLTguMCAgICAtNy4wICAgIC0+IC0xCitkcWNtczQyMSBjb21wYXJlc2lnICAgLTguMCAgICAtNyAgICAgIC0+IC0xCitkcWNtczQyMiBjb21wYXJlc2lnICAgLTggICAgICAtNy4wICAgIC0+IC0xCitkcWNtczQyMyBjb21wYXJlc2lnICAgLThFKzAgICAtNy4wICAgIC0+IC0xCitkcWNtczQyNCBjb21wYXJlc2lnICAgLTgwRS0xICAtNy4wICAgIC0+IC0xCitkcWNtczQyNSBjb21wYXJlc2lnICAgLS44RSsxICAtNyAgICAgIC0+IC0xCitkcWNtczQyNiBjb21wYXJlc2lnICAgLTgwRS0xICAtNyAgICAgIC0+IC0xCitkcWNtczQyNyBjb21wYXJlc2lnICAgLTguMCAgICAtN0UrMCAgIC0+IC0xCitkcWNtczQyOCBjb21wYXJlc2lnICAgLTguMCAgICAtNzBFLTEgIC0+IC0xCitkcWNtczQyOSBjb21wYXJlc2lnICAgLTggICAgICAtLjdFKzEgIC0+IC0xCitkcWNtczQzMCBjb21wYXJlc2lnICAgLTggICAgICAtNzBFLTEgIC0+IC0xCisKK2RxY21zNDQwIGNvbXBhcmVzaWcgICAtOC4wICAgIC05LjAgICAgLT4gMQorZHFjbXM0NDEgY29tcGFyZXNpZyAgIC04LjAgICAgLTkgICAgICAtPiAxCitkcWNtczQ0MiBjb21wYXJlc2lnICAgLTggICAgICAtOS4wICAgIC0+IDEKK2RxY21zNDQzIGNvbXBhcmVzaWcgICAtOEUrMCAgIC05LjAgICAgLT4gMQorZHFjbXM0NDQgY29tcGFyZXNpZyAgIC04MEUtMSAgLTkuMCAgICAtPiAxCitkcWNtczQ0NSBjb21wYXJlc2lnICAgLS44RSsxICAtOSAgICAgIC0+IDEKK2RxY21zNDQ2IGNvbXBhcmVzaWcgICAtODBFLTEgIC05ICAgICAgLT4gMQorZHFjbXM0NDcgY29tcGFyZXNpZyAgIC04LjAgICAgLTlFKzAgICAtPiAxCitkcWNtczQ0OCBjb21wYXJlc2lnICAgLTguMCAgICAtOTBFLTEgIC0+IDEKK2RxY21zNDQ5IGNvbXBhcmVzaWcgICAtOCAgICAgIC0uOUUrMSAgLT4gMQorZHFjbXM0NTAgY29tcGFyZXNpZyAgIC04ICAgICAgLTkwRS0xICAtPiAxCisKKworLS0gdGVzdGNhc2VzIHRoYXQgc3VidHJhY3QgdG8gbG90cyBvZiB6ZXJvcyBhdCBib3VuZGFyaWVzIFtwZ3JdCitkcWNtczQ3MyBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDAwMDAwRS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAtPiAwCitkcWNtczQ3NCBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDAwMDBFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IC0+IDAKK2RxY21zNDc1IGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMDAwRS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAtPiAwCitkcWNtczQ3NiBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDAwRSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAtPiAwCitkcWNtczQ3NyBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDBFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IC0+IDAKK2RxY21zNDc4IGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwRSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAtPiAwCitkcWNtczQ3OSBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwRS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAtPiAwCitkcWNtczQ4MCBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDBFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IC0+IDAKK2RxY21zNDgxIGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwRS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAtPiAwCitkcWNtczQ4MiBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwRSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAtPiAwCitkcWNtczQ4MyBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IC0+IDAKK2RxY21zNDg3IGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMDAwMDBFKzg5IC0+IDAKK2RxY21zNDg4IGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMDAwMEUtODkgLT4gMAorZHFjbXM0ODkgY29tcGFyZXNpZyAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDAwMDBFKzg5IC0+IDAKK2RxY21zNDkwIGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMDBFLTg5IC0+IDAKK2RxY21zNDkxIGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMEUrODkgLT4gMAorZHFjbXM0OTIgY29tcGFyZXNpZyAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDBFLTg5IC0+IDAKK2RxY21zNDkzIGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDBFKzg5IC0+IDAKK2RxY21zNDk0IGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMEUtODkgLT4gMAorZHFjbXM0OTUgY29tcGFyZXNpZyAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDBFKzg5IC0+IDAKK2RxY21zNDk2IGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjBFLTg5IC0+IDAKK2RxY21zNDk3IGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgLT4gMAorCistLSB3aWRlLXJhbmdpbmcsIGFyb3VuZCBwcmVjaXNpb247IHNpZ25zIGVxdWFsCitkcWNtczUwMCBjb21wYXJlc2lnICAgIDEgICAgIDFFLTE1ICAgIC0+IDEKK2RxY21zNTAxIGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMTQgICAgLT4gMQorZHFjbXM1MDIgY29tcGFyZXNpZyAgICAxICAgICAxRS0xMyAgICAtPiAxCitkcWNtczUwMyBjb21wYXJlc2lnICAgIDEgICAgIDFFLTEyICAgIC0+IDEKK2RxY21zNTA0IGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMTEgICAgLT4gMQorZHFjbXM1MDUgY29tcGFyZXNpZyAgICAxICAgICAxRS0xMCAgICAtPiAxCitkcWNtczUwNiBjb21wYXJlc2lnICAgIDEgICAgIDFFLTkgICAgIC0+IDEKK2RxY21zNTA3IGNvbXBhcmVzaWcgICAgMSAgICAgMUUtOCAgICAgLT4gMQorZHFjbXM1MDggY29tcGFyZXNpZyAgICAxICAgICAxRS03ICAgICAtPiAxCitkcWNtczUwOSBjb21wYXJlc2lnICAgIDEgICAgIDFFLTYgICAgIC0+IDEKK2RxY21zNTEwIGNvbXBhcmVzaWcgICAgMSAgICAgMUUtNSAgICAgLT4gMQorZHFjbXM1MTEgY29tcGFyZXNpZyAgICAxICAgICAxRS00ICAgICAtPiAxCitkcWNtczUxMiBjb21wYXJlc2lnICAgIDEgICAgIDFFLTMgICAgIC0+IDEKK2RxY21zNTEzIGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMiAgICAgLT4gMQorZHFjbXM1MTQgY29tcGFyZXNpZyAgICAxICAgICAxRS0xICAgICAtPiAxCitkcWNtczUxNSBjb21wYXJlc2lnICAgIDEgICAgIDFFLTAgICAgIC0+IDAKK2RxY21zNTE2IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMSAgICAgLT4gLTEKK2RxY21zNTE3IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMiAgICAgLT4gLTEKK2RxY21zNTE4IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMyAgICAgLT4gLTEKK2RxY21zNTE5IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrNCAgICAgLT4gLTEKK2RxY21zNTIxIGNvbXBhcmVzaWcgICAgMSAgICAgMUUrNSAgICAgLT4gLTEKK2RxY21zNTIyIGNvbXBhcmVzaWcgICAgMSAgICAgMUUrNiAgICAgLT4gLTEKK2RxY21zNTIzIGNvbXBhcmVzaWcgICAgMSAgICAgMUUrNyAgICAgLT4gLTEKK2RxY21zNTI0IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrOCAgICAgLT4gLTEKK2RxY21zNTI1IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrOSAgICAgLT4gLTEKK2RxY21zNTI2IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMTAgICAgLT4gLTEKK2RxY21zNTI3IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMTEgICAgLT4gLTEKK2RxY21zNTI4IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMTIgICAgLT4gLTEKK2RxY21zNTI5IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMTMgICAgLT4gLTEKK2RxY21zNTMwIGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMTQgICAgLT4gLTEKK2RxY21zNTMxIGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMTUgICAgLT4gLTEKKy0tIExSIHN3YXAKK2RxY21zNTQwIGNvbXBhcmVzaWcgICAgMUUtMTUgIDEgICAgICAgLT4gLTEKK2RxY21zNTQxIGNvbXBhcmVzaWcgICAgMUUtMTQgIDEgICAgICAgLT4gLTEKK2RxY21zNTQyIGNvbXBhcmVzaWcgICAgMUUtMTMgIDEgICAgICAgLT4gLTEKK2RxY21zNTQzIGNvbXBhcmVzaWcgICAgMUUtMTIgIDEgICAgICAgLT4gLTEKK2RxY21zNTQ0IGNvbXBhcmVzaWcgICAgMUUtMTEgIDEgICAgICAgLT4gLTEKK2RxY21zNTQ1IGNvbXBhcmVzaWcgICAgMUUtMTAgIDEgICAgICAgLT4gLTEKK2RxY21zNTQ2IGNvbXBhcmVzaWcgICAgMUUtOSAgIDEgICAgICAgLT4gLTEKK2RxY21zNTQ3IGNvbXBhcmVzaWcgICAgMUUtOCAgIDEgICAgICAgLT4gLTEKK2RxY21zNTQ4IGNvbXBhcmVzaWcgICAgMUUtNyAgIDEgICAgICAgLT4gLTEKK2RxY21zNTQ5IGNvbXBhcmVzaWcgICAgMUUtNiAgIDEgICAgICAgLT4gLTEKK2RxY21zNTUwIGNvbXBhcmVzaWcgICAgMUUtNSAgIDEgICAgICAgLT4gLTEKK2RxY21zNTUxIGNvbXBhcmVzaWcgICAgMUUtNCAgIDEgICAgICAgLT4gLTEKK2RxY21zNTUyIGNvbXBhcmVzaWcgICAgMUUtMyAgIDEgICAgICAgLT4gLTEKK2RxY21zNTUzIGNvbXBhcmVzaWcgICAgMUUtMiAgIDEgICAgICAgLT4gLTEKK2RxY21zNTU0IGNvbXBhcmVzaWcgICAgMUUtMSAgIDEgICAgICAgLT4gLTEKK2RxY21zNTU1IGNvbXBhcmVzaWcgICAgMUUtMCAgIDEgICAgICAgLT4gIDAKK2RxY21zNTU2IGNvbXBhcmVzaWcgICAgMUUrMSAgIDEgICAgICAgLT4gIDEKK2RxY21zNTU3IGNvbXBhcmVzaWcgICAgMUUrMiAgIDEgICAgICAgLT4gIDEKK2RxY21zNTU4IGNvbXBhcmVzaWcgICAgMUUrMyAgIDEgICAgICAgLT4gIDEKK2RxY21zNTU5IGNvbXBhcmVzaWcgICAgMUUrNCAgIDEgICAgICAgLT4gIDEKK2RxY21zNTYxIGNvbXBhcmVzaWcgICAgMUUrNSAgIDEgICAgICAgLT4gIDEKK2RxY21zNTYyIGNvbXBhcmVzaWcgICAgMUUrNiAgIDEgICAgICAgLT4gIDEKK2RxY21zNTYzIGNvbXBhcmVzaWcgICAgMUUrNyAgIDEgICAgICAgLT4gIDEKK2RxY21zNTY0IGNvbXBhcmVzaWcgICAgMUUrOCAgIDEgICAgICAgLT4gIDEKK2RxY21zNTY1IGNvbXBhcmVzaWcgICAgMUUrOSAgIDEgICAgICAgLT4gIDEKK2RxY21zNTY2IGNvbXBhcmVzaWcgICAgMUUrMTAgIDEgICAgICAgLT4gIDEKK2RxY21zNTY3IGNvbXBhcmVzaWcgICAgMUUrMTEgIDEgICAgICAgLT4gIDEKK2RxY21zNTY4IGNvbXBhcmVzaWcgICAgMUUrMTIgIDEgICAgICAgLT4gIDEKK2RxY21zNTY5IGNvbXBhcmVzaWcgICAgMUUrMTMgIDEgICAgICAgLT4gIDEKK2RxY21zNTcwIGNvbXBhcmVzaWcgICAgMUUrMTQgIDEgICAgICAgLT4gIDEKK2RxY21zNTcxIGNvbXBhcmVzaWcgICAgMUUrMTUgIDEgICAgICAgLT4gIDEKKy0tIHNpbWlsYXIgd2l0aCBhIHVzZWZ1bCBjb2VmZmljaWVudCwgb25lIHNpZGUgb25seQorZHFjbXM1ODAgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE1ICAgIC0+IDEKK2RxY21zNTgxIGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNCAgICAtPiAxCitkcWNtczU4MiBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTMgICAgLT4gMQorZHFjbXM1ODMgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEyICAgIC0+IDEKK2RxY21zNTg0IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMSAgICAtPiAxCitkcWNtczU4NSBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTAgICAgLT4gMQorZHFjbXM1ODYgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTkgICAgIC0+IDEKK2RxY21zNTg3IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS04ICAgICAtPiAxCitkcWNtczU4OCBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNyAgICAgLT4gMQorZHFjbXM1ODkgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTYgICAgIC0+IC0xCitkcWNtczU5MCBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNSAgICAgLT4gLTEKK2RxY21zNTkxIGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS00ICAgICAtPiAtMQorZHFjbXM1OTIgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTMgICAgIC0+IC0xCitkcWNtczU5MyBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMiAgICAgLT4gLTEKK2RxY21zNTk0IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xICAgICAtPiAtMQorZHFjbXM1OTUgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTAgICAgIC0+IC0xCitkcWNtczU5NiBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMSAgICAgLT4gLTEKK2RxY21zNTk3IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsyICAgICAtPiAtMQorZHFjbXM1OTggY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzMgICAgIC0+IC0xCitkcWNtczU5OSBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrNCAgICAgLT4gLTEKKworLS0gY2hlY2sgc29tZSB1bml0LXkgdHJhcHMKK2RxY21zNjAwIGNvbXBhcmVzaWcgICAxMiAgICAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY21zNjAxIGNvbXBhcmVzaWcgICAxMi4wICAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY21zNjAyIGNvbXBhcmVzaWcgICAxMi4wMCAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY21zNjAzIGNvbXBhcmVzaWcgICAxMi4wMDAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY21zNjA0IGNvbXBhcmVzaWcgICAxMi4wMDAwICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY21zNjA1IGNvbXBhcmVzaWcgICAxMi4wMDAwMCAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY21zNjA2IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY21zNjA3IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAwICAgIDEyLjIzNDUgLT4gLTEKK2RxY21zNjA4IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAwMCAgIDEyLjIzNDUgLT4gLTEKK2RxY21zNjA5IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAwMDAgIDEyLjIzNDUgLT4gLTEKK2RxY21zNjEwIGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyICAgICAgICAgICAgLT4gIDEKK2RxY21zNjExIGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAgICAgICAgICAgLT4gIDEKK2RxY21zNjEyIGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwICAgICAgICAgLT4gIDEKK2RxY21zNjEzIGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMCAgICAgICAgLT4gIDEKK2RxY21zNjE0IGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMDAgICAgICAgLT4gIDEKK2RxY21zNjE1IGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMDAwICAgICAgLT4gIDEKK2RxY21zNjE2IGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMDAwMCAgICAgLT4gIDEKK2RxY21zNjE3IGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMDAwMDAgICAgLT4gIDEKK2RxY21zNjE4IGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMDAwMDAwICAgLT4gIDEKK2RxY21zNjE5IGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMDAwMDAwMCAgLT4gIDEKK2RxY21zNjIwIGNvbXBhcmVzaWcgIC0xMiAgICAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY21zNjIxIGNvbXBhcmVzaWcgIC0xMi4wICAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY21zNjIyIGNvbXBhcmVzaWcgIC0xMi4wMCAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY21zNjIzIGNvbXBhcmVzaWcgIC0xMi4wMDAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY21zNjI0IGNvbXBhcmVzaWcgIC0xMi4wMDAwICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY21zNjI1IGNvbXBhcmVzaWcgIC0xMi4wMDAwMCAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY21zNjI2IGNvbXBhcmVzaWcgIC0xMi4wMDAwMDAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY21zNjI3IGNvbXBhcmVzaWcgIC0xMi4wMDAwMDAwICAgLTEyLjIzNDUgLT4gIDEKK2RxY21zNjI4IGNvbXBhcmVzaWcgIC0xMi4wMDAwMDAwMCAgLTEyLjIzNDUgLT4gIDEKK2RxY21zNjI5IGNvbXBhcmVzaWcgIC0xMi4wMDAwMDAwMDAgLTEyLjIzNDUgLT4gIDEKK2RxY21zNjMwIGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMiAgICAgICAgICAgLT4gLTEKK2RxY21zNjMxIGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wICAgICAgICAgLT4gLTEKK2RxY21zNjMyIGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMCAgICAgICAgLT4gLTEKK2RxY21zNjMzIGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAgICAgICAgLT4gLTEKK2RxY21zNjM0IGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAwICAgICAgLT4gLTEKK2RxY21zNjM1IGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAwMCAgICAgLT4gLTEKK2RxY21zNjM2IGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAgICAgLT4gLTEKK2RxY21zNjM3IGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAwICAgLT4gLTEKK2RxY21zNjM4IGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMCAgLT4gLTEKK2RxY21zNjM5IGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMDAgLT4gLTEKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RxY21zNjQwIGNvbXBhcmVzaWcgICAwICAgICAwICAgLT4gMAorZHFjbXM2NDEgY29tcGFyZXNpZyAgIDAgICAgLTAgICAtPiAwCitkcWNtczY0MiBjb21wYXJlc2lnICAgMCAgICAtMC4wIC0+IDAKK2RxY21zNjQzIGNvbXBhcmVzaWcgICAwICAgICAwLjAgLT4gMAorZHFjbXM2NDQgY29tcGFyZXNpZyAgLTAgICAgIDAgICAtPiAwCitkcWNtczY0NSBjb21wYXJlc2lnICAtMCAgICAtMCAgIC0+IDAKK2RxY21zNjQ2IGNvbXBhcmVzaWcgIC0wICAgIC0wLjAgLT4gMAorZHFjbXM2NDcgY29tcGFyZXNpZyAgLTAgICAgIDAuMCAtPiAwCitkcWNtczY0OCBjb21wYXJlc2lnICAgMC4wICAgMCAgIC0+IDAKK2RxY21zNjQ5IGNvbXBhcmVzaWcgICAwLjAgIC0wICAgLT4gMAorZHFjbXM2NTAgY29tcGFyZXNpZyAgIDAuMCAgLTAuMCAtPiAwCitkcWNtczY1MSBjb21wYXJlc2lnICAgMC4wICAgMC4wIC0+IDAKK2RxY21zNjUyIGNvbXBhcmVzaWcgIC0wLjAgICAwICAgLT4gMAorZHFjbXM2NTMgY29tcGFyZXNpZyAgLTAuMCAgLTAgICAtPiAwCitkcWNtczY1NCBjb21wYXJlc2lnICAtMC4wICAtMC4wIC0+IDAKK2RxY21zNjU1IGNvbXBhcmVzaWcgIC0wLjAgICAwLjAgLT4gMAorCitkcWNtczY1NiBjb21wYXJlc2lnICAtMEUxICAgMC4wIC0+IDAKK2RxY21zNjU3IGNvbXBhcmVzaWcgIC0wRTIgICAwLjAgLT4gMAorZHFjbXM2NTggY29tcGFyZXNpZyAgIDBFMSAgIDAuMCAtPiAwCitkcWNtczY1OSBjb21wYXJlc2lnICAgMEUyICAgMC4wIC0+IDAKK2RxY21zNjYwIGNvbXBhcmVzaWcgIC0wRTEgICAwICAgLT4gMAorZHFjbXM2NjEgY29tcGFyZXNpZyAgLTBFMiAgIDAgICAtPiAwCitkcWNtczY2MiBjb21wYXJlc2lnICAgMEUxICAgMCAgIC0+IDAKK2RxY21zNjYzIGNvbXBhcmVzaWcgICAwRTIgICAwICAgLT4gMAorZHFjbXM2NjQgY29tcGFyZXNpZyAgLTBFMSAgLTBFMSAtPiAwCitkcWNtczY2NSBjb21wYXJlc2lnICAtMEUyICAtMEUxIC0+IDAKK2RxY21zNjY2IGNvbXBhcmVzaWcgICAwRTEgIC0wRTEgLT4gMAorZHFjbXM2NjcgY29tcGFyZXNpZyAgIDBFMiAgLTBFMSAtPiAwCitkcWNtczY2OCBjb21wYXJlc2lnICAtMEUxICAtMEUyIC0+IDAKK2RxY21zNjY5IGNvbXBhcmVzaWcgIC0wRTIgIC0wRTIgLT4gMAorZHFjbXM2NzAgY29tcGFyZXNpZyAgIDBFMSAgLTBFMiAtPiAwCitkcWNtczY3MSBjb21wYXJlc2lnICAgMEUyICAtMEUyIC0+IDAKK2RxY21zNjcyIGNvbXBhcmVzaWcgIC0wRTEgICAwRTEgLT4gMAorZHFjbXM2NzMgY29tcGFyZXNpZyAgLTBFMiAgIDBFMSAtPiAwCitkcWNtczY3NCBjb21wYXJlc2lnICAgMEUxICAgMEUxIC0+IDAKK2RxY21zNjc1IGNvbXBhcmVzaWcgICAwRTIgICAwRTEgLT4gMAorZHFjbXM2NzYgY29tcGFyZXNpZyAgLTBFMSAgIDBFMiAtPiAwCitkcWNtczY3NyBjb21wYXJlc2lnICAtMEUyICAgMEUyIC0+IDAKK2RxY21zNjc4IGNvbXBhcmVzaWcgICAwRTEgICAwRTIgLT4gMAorZHFjbXM2NzkgY29tcGFyZXNpZyAgIDBFMiAgIDBFMiAtPiAwCisKKy0tIHRyYWlsaW5nIHplcm9zOyB1bml0LXkKK2RxY21zNjgwIGNvbXBhcmVzaWcgICAxMiAgICAxMiAgICAgICAgICAgLT4gMAorZHFjbXM2ODEgY29tcGFyZXNpZyAgIDEyICAgIDEyLjAgICAgICAgICAtPiAwCitkcWNtczY4MiBjb21wYXJlc2lnICAgMTIgICAgMTIuMDAgICAgICAgIC0+IDAKK2RxY21zNjgzIGNvbXBhcmVzaWcgICAxMiAgICAxMi4wMDAgICAgICAgLT4gMAorZHFjbXM2ODQgY29tcGFyZXNpZyAgIDEyICAgIDEyLjAwMDAgICAgICAtPiAwCitkcWNtczY4NSBjb21wYXJlc2lnICAgMTIgICAgMTIuMDAwMDAgICAgIC0+IDAKK2RxY21zNjg2IGNvbXBhcmVzaWcgICAxMiAgICAxMi4wMDAwMDAgICAgLT4gMAorZHFjbXM2ODcgY29tcGFyZXNpZyAgIDEyICAgIDEyLjAwMDAwMDAgICAtPiAwCitkcWNtczY4OCBjb21wYXJlc2lnICAgMTIgICAgMTIuMDAwMDAwMDAgIC0+IDAKK2RxY21zNjg5IGNvbXBhcmVzaWcgICAxMiAgICAxMi4wMDAwMDAwMDAgLT4gMAorZHFjbXM2OTAgY29tcGFyZXNpZyAgIDEyICAgICAgICAgICAgICAxMiAtPiAwCitkcWNtczY5MSBjb21wYXJlc2lnICAgMTIuMCAgICAgICAgICAgIDEyIC0+IDAKK2RxY21zNjkyIGNvbXBhcmVzaWcgICAxMi4wMCAgICAgICAgICAgMTIgLT4gMAorZHFjbXM2OTMgY29tcGFyZXNpZyAgIDEyLjAwMCAgICAgICAgICAxMiAtPiAwCitkcWNtczY5NCBjb21wYXJlc2lnICAgMTIuMDAwMCAgICAgICAgIDEyIC0+IDAKK2RxY21zNjk1IGNvbXBhcmVzaWcgICAxMi4wMDAwMCAgICAgICAgMTIgLT4gMAorZHFjbXM2OTYgY29tcGFyZXNpZyAgIDEyLjAwMDAwMCAgICAgICAxMiAtPiAwCitkcWNtczY5NyBjb21wYXJlc2lnICAgMTIuMDAwMDAwMCAgICAgIDEyIC0+IDAKK2RxY21zNjk4IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAwMCAgICAgMTIgLT4gMAorZHFjbXM2OTkgY29tcGFyZXNpZyAgIDEyLjAwMDAwMDAwMCAgICAxMiAtPiAwCisKKy0tIGZpcnN0LCBzZWNvbmQsICYgbGFzdCBkaWdpdAorZHFjbXM3MDAgY29tcGFyZXNpZyAgIDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NSAtPiAxCitkcWNtczcwMSBjb21wYXJlc2lnICAgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IC0+IDAKK2RxY21zNzAyIGNvbXBhcmVzaWcgICAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTcgLT4gLTEKK2RxY21zNzAzIGNvbXBhcmVzaWcgICAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IDAyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgLT4gMQorZHFjbXM3MDQgY29tcGFyZXNpZyAgIDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAtPiAwCitkcWNtczcwNSBjb21wYXJlc2lnICAgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAyMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IC0+IC0xCitkcWNtczcwNiBjb21wYXJlc2lnICAgMTEzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAxMDM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IC0+IDEKK2RxY21zNzA3IGNvbXBhcmVzaWcgICAxMTM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IDExMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgLT4gMAorZHFjbXM3MDggY29tcGFyZXNpZyAgIDExMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAtPiAtMQorCistLSBtaXNjZWxsYW5lb3VzCitkcWNtczcyMSBjb21wYXJlc2lnIDEyMzQ1Njc4MDAwIDEgLT4gMQorZHFjbXM3MjIgY29tcGFyZXNpZyAxIDEyMzQ1Njc4MDAwIC0+IC0xCitkcWNtczcyMyBjb21wYXJlc2lnIDEyMzQ1Njc4MDAgIDEgLT4gMQorZHFjbXM3MjQgY29tcGFyZXNpZyAxIDEyMzQ1Njc4MDAgIC0+IC0xCitkcWNtczcyNSBjb21wYXJlc2lnIDEyMzQ1Njc4OTAgIDEgLT4gMQorZHFjbXM3MjYgY29tcGFyZXNpZyAxIDEyMzQ1Njc4OTAgIC0+IC0xCitkcWNtczcyNyBjb21wYXJlc2lnIDEyMzQ1Njc4OTEgIDEgLT4gMQorZHFjbXM3MjggY29tcGFyZXNpZyAxIDEyMzQ1Njc4OTEgIC0+IC0xCitkcWNtczcyOSBjb21wYXJlc2lnIDEyMzQ1Njc4OTAxIDEgLT4gMQorZHFjbXM3MzAgY29tcGFyZXNpZyAxIDEyMzQ1Njc4OTAxIC0+IC0xCitkcWNtczczMSBjb21wYXJlc2lnIDEyMzQ1Njc4OTYgIDEgLT4gMQorZHFjbXM3MzIgY29tcGFyZXNpZyAxIDEyMzQ1Njc4OTYgIC0+IC0xCisKKy0tIHJlc2lkdWUgY2FzZXMgYXQgbG93ZXIgcHJlY2lzaW9uCitkcWNtczc0MCBjb21wYXJlc2lnICAxICAwLjk5OTk5OTkgIC0+IDEKK2RxY21zNzQxIGNvbXBhcmVzaWcgIDEgIDAuOTk5OTk5ICAgLT4gMQorZHFjbXM3NDIgY29tcGFyZXNpZyAgMSAgMC45OTk5OSAgICAtPiAxCitkcWNtczc0MyBjb21wYXJlc2lnICAxICAxLjAwMDAgICAgIC0+IDAKK2RxY21zNzQ0IGNvbXBhcmVzaWcgIDEgIDEuMDAwMDEgICAgLT4gLTEKK2RxY21zNzQ1IGNvbXBhcmVzaWcgIDEgIDEuMDAwMDAxICAgLT4gLTEKK2RxY21zNzQ2IGNvbXBhcmVzaWcgIDEgIDEuMDAwMDAwMSAgLT4gLTEKK2RxY21zNzUwIGNvbXBhcmVzaWcgIDAuOTk5OTk5OSAgMSAgLT4gLTEKK2RxY21zNzUxIGNvbXBhcmVzaWcgIDAuOTk5OTk5ICAgMSAgLT4gLTEKK2RxY21zNzUyIGNvbXBhcmVzaWcgIDAuOTk5OTkgICAgMSAgLT4gLTEKK2RxY21zNzUzIGNvbXBhcmVzaWcgIDEuMDAwMCAgICAgMSAgLT4gMAorZHFjbXM3NTQgY29tcGFyZXNpZyAgMS4wMDAwMSAgICAxICAtPiAxCitkcWNtczc1NSBjb21wYXJlc2lnICAxLjAwMDAwMSAgIDEgIC0+IDEKK2RxY21zNzU2IGNvbXBhcmVzaWcgIDEuMDAwMDAwMSAgMSAgLT4gMQorCistLSBTcGVjaWFscworZHFjbXM3ODAgY29tcGFyZXNpZyAgSW5mICAtSW5mICAgLT4gIDEKK2RxY21zNzgxIGNvbXBhcmVzaWcgIEluZiAgLTEwMDAgIC0+ICAxCitkcWNtczc4MiBjb21wYXJlc2lnICBJbmYgIC0xICAgICAtPiAgMQorZHFjbXM3ODMgY29tcGFyZXNpZyAgSW5mICAtMCAgICAgLT4gIDEKK2RxY21zNzg0IGNvbXBhcmVzaWcgIEluZiAgIDAgICAgIC0+ICAxCitkcWNtczc4NSBjb21wYXJlc2lnICBJbmYgICAxICAgICAtPiAgMQorZHFjbXM3ODYgY29tcGFyZXNpZyAgSW5mICAgMTAwMCAgLT4gIDEKK2RxY21zNzg3IGNvbXBhcmVzaWcgIEluZiAgIEluZiAgIC0+ICAwCitkcWNtczc4OCBjb21wYXJlc2lnIC0xMDAwICBJbmYgICAtPiAtMQorZHFjbXM3ODkgY29tcGFyZXNpZyAtSW5mICAgSW5mICAgLT4gLTEKK2RxY21zNzkwIGNvbXBhcmVzaWcgLTEgICAgIEluZiAgIC0+IC0xCitkcWNtczc5MSBjb21wYXJlc2lnIC0wICAgICBJbmYgICAtPiAtMQorZHFjbXM3OTIgY29tcGFyZXNpZyAgMCAgICAgSW5mICAgLT4gLTEKK2RxY21zNzkzIGNvbXBhcmVzaWcgIDEgICAgIEluZiAgIC0+IC0xCitkcWNtczc5NCBjb21wYXJlc2lnICAxMDAwICBJbmYgICAtPiAtMQorZHFjbXM3OTUgY29tcGFyZXNpZyAgSW5mICAgSW5mICAgLT4gIDAKKworZHFjbXM4MDAgY29tcGFyZXNpZyAtSW5mICAtSW5mICAgLT4gIDAKK2RxY21zODAxIGNvbXBhcmVzaWcgLUluZiAgLTEwMDAgIC0+IC0xCitkcWNtczgwMiBjb21wYXJlc2lnIC1JbmYgIC0xICAgICAtPiAtMQorZHFjbXM4MDMgY29tcGFyZXNpZyAtSW5mICAtMCAgICAgLT4gLTEKK2RxY21zODA0IGNvbXBhcmVzaWcgLUluZiAgIDAgICAgIC0+IC0xCitkcWNtczgwNSBjb21wYXJlc2lnIC1JbmYgICAxICAgICAtPiAtMQorZHFjbXM4MDYgY29tcGFyZXNpZyAtSW5mICAgMTAwMCAgLT4gLTEKK2RxY21zODA3IGNvbXBhcmVzaWcgLUluZiAgIEluZiAgIC0+IC0xCitkcWNtczgwOCBjb21wYXJlc2lnIC1JbmYgIC1JbmYgICAtPiAgMAorZHFjbXM4MDkgY29tcGFyZXNpZyAtMTAwMCAtSW5mICAgLT4gIDEKK2RxY21zODEwIGNvbXBhcmVzaWcgLTEgICAgLUluZiAgIC0+ICAxCitkcWNtczgxMSBjb21wYXJlc2lnIC0wICAgIC1JbmYgICAtPiAgMQorZHFjbXM4MTIgY29tcGFyZXNpZyAgMCAgICAtSW5mICAgLT4gIDEKK2RxY21zODEzIGNvbXBhcmVzaWcgIDEgICAgLUluZiAgIC0+ICAxCitkcWNtczgxNCBjb21wYXJlc2lnICAxMDAwIC1JbmYgICAtPiAgMQorZHFjbXM4MTUgY29tcGFyZXNpZyAgSW5mICAtSW5mICAgLT4gIDEKKworZHFjbXM4MjEgY29tcGFyZXNpZyAgTmFOIC1JbmYgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODIyIGNvbXBhcmVzaWcgIE5hTiAtMTAwMCAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczgyMyBjb21wYXJlc2lnICBOYU4gLTEgICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4MjQgY29tcGFyZXNpZyAgTmFOIC0wICAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODI1IGNvbXBhcmVzaWcgIE5hTiAgMCAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczgyNiBjb21wYXJlc2lnICBOYU4gIDEgICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4MjcgY29tcGFyZXNpZyAgTmFOICAxMDAwICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODI4IGNvbXBhcmVzaWcgIE5hTiAgSW5mICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczgyOSBjb21wYXJlc2lnICBOYU4gIE5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4MzAgY29tcGFyZXNpZyAtSW5mICBOYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODMxIGNvbXBhcmVzaWcgLTEwMDAgTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczgzMiBjb21wYXJlc2lnIC0xICAgIE5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4MzMgY29tcGFyZXNpZyAtMCAgICBOYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODM0IGNvbXBhcmVzaWcgIDAgICAgTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczgzNSBjb21wYXJlc2lnICAxICAgIE5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4MzYgY29tcGFyZXNpZyAgMTAwMCBOYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODM3IGNvbXBhcmVzaWcgIEluZiAgTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczgzOCBjb21wYXJlc2lnIC1OYU4gLU5hTiAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4MzkgY29tcGFyZXNpZyArTmFOIC1OYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODQwIGNvbXBhcmVzaWcgLU5hTiArTmFOICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK2RxY21zODQxIGNvbXBhcmVzaWcgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg0MiBjb21wYXJlc2lnICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NDMgY29tcGFyZXNpZyAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODQ0IGNvbXBhcmVzaWcgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg0NSBjb21wYXJlc2lnICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NDYgY29tcGFyZXNpZyAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODQ3IGNvbXBhcmVzaWcgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg0OCBjb21wYXJlc2lnICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NDkgY29tcGFyZXNpZyAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODUwIGNvbXBhcmVzaWcgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg1MSBjb21wYXJlc2lnIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NTIgY29tcGFyZXNpZyAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODUzIGNvbXBhcmVzaWcgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg1NCBjb21wYXJlc2lnIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NTUgY29tcGFyZXNpZyAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODU2IGNvbXBhcmVzaWcgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg1NyBjb21wYXJlc2lnICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NTggY29tcGFyZXNpZyAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODU5IGNvbXBhcmVzaWcgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxY21zODYwIGNvbXBhcmVzaWcgIE5hTjkgLUluZiAgIC0+ICBOYU45ICAgIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg2MSBjb21wYXJlc2lnICBOYU44ICA5OTkgICAtPiAgTmFOOCAgICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NjIgY29tcGFyZXNpZyAgTmFONzcgSW5mICAgLT4gIE5hTjc3ICAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODYzIGNvbXBhcmVzaWcgLU5hTjY3IE5hTjUgIC0+IC1OYU42NyAgIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg2NCBjb21wYXJlc2lnIC1JbmYgIC1OYU40ICAtPiAtTmFONCAgICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NjUgY29tcGFyZXNpZyAtOTk5ICAtTmFOMzMgLT4gLU5hTjMzICAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODY2IGNvbXBhcmVzaWcgIEluZiAgIE5hTjIgIC0+ICBOYU4yICAgIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg2NyBjb21wYXJlc2lnIC1OYU40MSAtTmFONDIgLT4gLU5hTjQxICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NjggY29tcGFyZXNpZyArTmFONDEgLU5hTjQyIC0+ICBOYU40MSAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODY5IGNvbXBhcmVzaWcgLU5hTjQxICtOYU40MiAtPiAtTmFONDEgIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg3MCBjb21wYXJlc2lnICtOYU40MSArTmFONDIgLT4gIE5hTjQxICBJbnZhbGlkX29wZXJhdGlvbgorCitkcWNtczg3MSBjb21wYXJlc2lnIC1zTmFOOTkgLUluZiAgICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODcyIGNvbXBhcmVzaWcgIHNOYU45OCAtMTEgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NzMgY29tcGFyZXNpZyAgc05hTjk3ICBOYU4gICAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg3NCBjb21wYXJlc2lnICBzTmFOMTYgc05hTjk0ICAtPiAgTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODc1IGNvbXBhcmVzaWcgIE5hTjg1ICBzTmFOODMgIC0+ICBOYU44MyBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NzYgY29tcGFyZXNpZyAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg3NyBjb21wYXJlc2lnICAwODggICAgc05hTjgxICAtPiAgTmFOODEgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODc4IGNvbXBhcmVzaWcgIEluZiAgICBzTmFOOTAgIC0+ICBOYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NzkgY29tcGFyZXNpZyAgTmFOICAgLXNOYU44OSAgLT4gLU5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHdpZGUgcmFuZ2UKK2RxY21zODgwIGNvbXBhcmVzaWcgKzEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrNjE0NCAtPiAtMQorZHFjbXM4ODEgY29tcGFyZXNpZyA5RSs2MTQ0ICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+ICAxCitkcWNtczg4MiBjb21wYXJlc2lnICswLjEwMCA5RS02MTQzICAgICAgICAgICAgICAgLT4gIDEKK2RxY21zODgzIGNvbXBhcmVzaWcgOUUtNjE0MyArMC4xMDAgICAgICAgICAgICAgICAtPiAtMQorZHFjbXM4ODUgY29tcGFyZXNpZyAtMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSs2MTQ0IC0+IC0xCitkcWNtczg4NiBjb21wYXJlc2lnIDlFKzYxNDQgLTEuMjM0NTY3ODkwMTIzNDVFLTAgLT4gIDEKK2RxY21zODg3IGNvbXBhcmVzaWcgLTAuMTAwIDlFLTYxNDMgICAgICAgICAgICAgICAtPiAtMQorZHFjbXM4ODggY29tcGFyZXNpZyA5RS02MTQzIC0wLjEwMCAgICAgICAgICAgICAgIC0+ICAxCisKKy0tIHNpZ25zCitkcWNtczkwMSBjb21wYXJlc2lnICAxZSs3NyAgMWUrMTEgLT4gIDEKK2RxY21zOTAyIGNvbXBhcmVzaWcgIDFlKzc3IC0xZSsxMSAtPiAgMQorZHFjbXM5MDMgY29tcGFyZXNpZyAtMWUrNzcgIDFlKzExIC0+IC0xCitkcWNtczkwNCBjb21wYXJlc2lnIC0xZSs3NyAtMWUrMTEgLT4gLTEKK2RxY21zOTA1IGNvbXBhcmVzaWcgIDFlLTc3ICAxZS0xMSAtPiAtMQorZHFjbXM5MDYgY29tcGFyZXNpZyAgMWUtNzcgLTFlLTExIC0+ICAxCitkcWNtczkwNyBjb21wYXJlc2lnIC0xZS03NyAgMWUtMTEgLT4gLTEKK2RxY21zOTA4IGNvbXBhcmVzaWcgLTFlLTc3IC0xZS0xMSAtPiAgMQorCistLSBOdWxsIHRlc3RzCitkcWNtczk5MCBjb21wYXJlc2lnIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM5OTEgY29tcGFyZXNpZyAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb21wYXJlVG90YWwuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb21wYXJlVG90YWwuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzcwMWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvbXBhcmVUb3RhbC5kZWNUZXN0CkBAIC0wLDAgKzEsNzA2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxQ29tcGFyZVRvdGFsLmRlY1Rlc3QgLS0gZGVjUXVhZCBjb21wYXJpc29uIHVzaW5nIHRvdGFsIG9yZGVyaW5nICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gTm90ZSB0aGF0IHdlIGNhbm5vdCBhc3N1bWUgYWRkL3N1YnRyYWN0IHRlc3RzIGNvdmVyIHBhdGhzIGFkZXF1YXRlbHksCistLSBoZXJlLCBiZWNhdXNlIHRoZSBjb2RlIG1pZ2h0IGJlIHF1aXRlIGRpZmZlcmVudCAoY29tcGFyaXNvbiBjYW5ub3QKKy0tIG92ZXJmbG93IG9yIHVuZGVyZmxvdywgc28gYWN0dWFsIHN1YnRyYWN0aW9ucyBhcmUgbm90IG5lY2Vzc2FyeSkuCistLSBTaW1pbGFybHksIGNvbXBhcmV0b3RhbCB3aWxsIGhhdmUgc29tZSByYWRpY2FsbHkgZGlmZmVyZW50IHBhdGhzCistLSB0aGFuIGNvbXBhcmUuCisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjUXVhZHMuCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkcWNvdDAwMSBjb21wYXJldG90YWwgIC0yICAtMiAgLT4gMAorZHFjb3QwMDIgY29tcGFyZXRvdGFsICAtMiAgLTEgIC0+IC0xCitkcWNvdDAwMyBjb21wYXJldG90YWwgIC0yICAgMCAgLT4gLTEKK2RxY290MDA0IGNvbXBhcmV0b3RhbCAgLTIgICAxICAtPiAtMQorZHFjb3QwMDUgY29tcGFyZXRvdGFsICAtMiAgIDIgIC0+IC0xCitkcWNvdDAwNiBjb21wYXJldG90YWwgIC0xICAtMiAgLT4gMQorZHFjb3QwMDcgY29tcGFyZXRvdGFsICAtMSAgLTEgIC0+IDAKK2RxY290MDA4IGNvbXBhcmV0b3RhbCAgLTEgICAwICAtPiAtMQorZHFjb3QwMDkgY29tcGFyZXRvdGFsICAtMSAgIDEgIC0+IC0xCitkcWNvdDAxMCBjb21wYXJldG90YWwgIC0xICAgMiAgLT4gLTEKK2RxY290MDExIGNvbXBhcmV0b3RhbCAgIDAgIC0yICAtPiAxCitkcWNvdDAxMiBjb21wYXJldG90YWwgICAwICAtMSAgLT4gMQorZHFjb3QwMTMgY29tcGFyZXRvdGFsICAgMCAgIDAgIC0+IDAKK2RxY290MDE0IGNvbXBhcmV0b3RhbCAgIDAgICAxICAtPiAtMQorZHFjb3QwMTUgY29tcGFyZXRvdGFsICAgMCAgIDIgIC0+IC0xCitkcWNvdDAxNiBjb21wYXJldG90YWwgICAxICAtMiAgLT4gMQorZHFjb3QwMTcgY29tcGFyZXRvdGFsICAgMSAgLTEgIC0+IDEKK2RxY290MDE4IGNvbXBhcmV0b3RhbCAgIDEgICAwICAtPiAxCitkcWNvdDAxOSBjb21wYXJldG90YWwgICAxICAgMSAgLT4gMAorZHFjb3QwMjAgY29tcGFyZXRvdGFsICAgMSAgIDIgIC0+IC0xCitkcWNvdDAyMSBjb21wYXJldG90YWwgICAyICAtMiAgLT4gMQorZHFjb3QwMjIgY29tcGFyZXRvdGFsICAgMiAgLTEgIC0+IDEKK2RxY290MDIzIGNvbXBhcmV0b3RhbCAgIDIgICAwICAtPiAxCitkcWNvdDAyNSBjb21wYXJldG90YWwgICAyICAgMSAgLT4gMQorZHFjb3QwMjYgY29tcGFyZXRvdGFsICAgMiAgIDIgIC0+IDAKKworZHFjb3QwMzEgY29tcGFyZXRvdGFsICAtMjAgIC0yMCAgLT4gMAorZHFjb3QwMzIgY29tcGFyZXRvdGFsICAtMjAgIC0xMCAgLT4gLTEKK2RxY290MDMzIGNvbXBhcmV0b3RhbCAgLTIwICAgMDAgIC0+IC0xCitkcWNvdDAzNCBjb21wYXJldG90YWwgIC0yMCAgIDEwICAtPiAtMQorZHFjb3QwMzUgY29tcGFyZXRvdGFsICAtMjAgICAyMCAgLT4gLTEKK2RxY290MDM2IGNvbXBhcmV0b3RhbCAgLTEwICAtMjAgIC0+IDEKK2RxY290MDM3IGNvbXBhcmV0b3RhbCAgLTEwICAtMTAgIC0+IDAKK2RxY290MDM4IGNvbXBhcmV0b3RhbCAgLTEwICAgMDAgIC0+IC0xCitkcWNvdDAzOSBjb21wYXJldG90YWwgIC0xMCAgIDEwICAtPiAtMQorZHFjb3QwNDAgY29tcGFyZXRvdGFsICAtMTAgICAyMCAgLT4gLTEKK2RxY290MDQxIGNvbXBhcmV0b3RhbCAgIDAwICAtMjAgIC0+IDEKK2RxY290MDQyIGNvbXBhcmV0b3RhbCAgIDAwICAtMTAgIC0+IDEKK2RxY290MDQzIGNvbXBhcmV0b3RhbCAgIDAwICAgMDAgIC0+IDAKK2RxY290MDQ0IGNvbXBhcmV0b3RhbCAgIDAwICAgMTAgIC0+IC0xCitkcWNvdDA0NSBjb21wYXJldG90YWwgICAwMCAgIDIwICAtPiAtMQorZHFjb3QwNDYgY29tcGFyZXRvdGFsICAgMTAgIC0yMCAgLT4gMQorZHFjb3QwNDcgY29tcGFyZXRvdGFsICAgMTAgIC0xMCAgLT4gMQorZHFjb3QwNDggY29tcGFyZXRvdGFsICAgMTAgICAwMCAgLT4gMQorZHFjb3QwNDkgY29tcGFyZXRvdGFsICAgMTAgICAxMCAgLT4gMAorZHFjb3QwNTAgY29tcGFyZXRvdGFsICAgMTAgICAyMCAgLT4gLTEKK2RxY290MDUxIGNvbXBhcmV0b3RhbCAgIDIwICAtMjAgIC0+IDEKK2RxY290MDUyIGNvbXBhcmV0b3RhbCAgIDIwICAtMTAgIC0+IDEKK2RxY290MDUzIGNvbXBhcmV0b3RhbCAgIDIwICAgMDAgIC0+IDEKK2RxY290MDU1IGNvbXBhcmV0b3RhbCAgIDIwICAgMTAgIC0+IDEKK2RxY290MDU2IGNvbXBhcmV0b3RhbCAgIDIwICAgMjAgIC0+IDAKKworZHFjb3QwNjEgY29tcGFyZXRvdGFsICAtMi4wICAtMi4wICAtPiAwCitkcWNvdDA2MiBjb21wYXJldG90YWwgIC0yLjAgIC0xLjAgIC0+IC0xCitkcWNvdDA2MyBjb21wYXJldG90YWwgIC0yLjAgICAwLjAgIC0+IC0xCitkcWNvdDA2NCBjb21wYXJldG90YWwgIC0yLjAgICAxLjAgIC0+IC0xCitkcWNvdDA2NSBjb21wYXJldG90YWwgIC0yLjAgICAyLjAgIC0+IC0xCitkcWNvdDA2NiBjb21wYXJldG90YWwgIC0xLjAgIC0yLjAgIC0+IDEKK2RxY290MDY3IGNvbXBhcmV0b3RhbCAgLTEuMCAgLTEuMCAgLT4gMAorZHFjb3QwNjggY29tcGFyZXRvdGFsICAtMS4wICAgMC4wICAtPiAtMQorZHFjb3QwNjkgY29tcGFyZXRvdGFsICAtMS4wICAgMS4wICAtPiAtMQorZHFjb3QwNzAgY29tcGFyZXRvdGFsICAtMS4wICAgMi4wICAtPiAtMQorZHFjb3QwNzEgY29tcGFyZXRvdGFsICAgMC4wICAtMi4wICAtPiAxCitkcWNvdDA3MiBjb21wYXJldG90YWwgICAwLjAgIC0xLjAgIC0+IDEKK2RxY290MDczIGNvbXBhcmV0b3RhbCAgIDAuMCAgIDAuMCAgLT4gMAorZHFjb3QwNzQgY29tcGFyZXRvdGFsICAgMC4wICAgMS4wICAtPiAtMQorZHFjb3QwNzUgY29tcGFyZXRvdGFsICAgMC4wICAgMi4wICAtPiAtMQorZHFjb3QwNzYgY29tcGFyZXRvdGFsICAgMS4wICAtMi4wICAtPiAxCitkcWNvdDA3NyBjb21wYXJldG90YWwgICAxLjAgIC0xLjAgIC0+IDEKK2RxY290MDc4IGNvbXBhcmV0b3RhbCAgIDEuMCAgIDAuMCAgLT4gMQorZHFjb3QwNzkgY29tcGFyZXRvdGFsICAgMS4wICAgMS4wICAtPiAwCitkcWNvdDA4MCBjb21wYXJldG90YWwgICAxLjAgICAyLjAgIC0+IC0xCitkcWNvdDA4MSBjb21wYXJldG90YWwgICAyLjAgIC0yLjAgIC0+IDEKK2RxY290MDgyIGNvbXBhcmV0b3RhbCAgIDIuMCAgLTEuMCAgLT4gMQorZHFjb3QwODMgY29tcGFyZXRvdGFsICAgMi4wICAgMC4wICAtPiAxCitkcWNvdDA4NSBjb21wYXJldG90YWwgICAyLjAgICAxLjAgIC0+IDEKK2RxY290MDg2IGNvbXBhcmV0b3RhbCAgIDIuMCAgIDIuMCAgLT4gMAorCistLSBub3cgc29tZSBjYXNlcyB3aGljaCBtaWdodCBvdmVyZmxvdyBpZiBzdWJ0cmFjdCB3ZXJlIHVzZWQKK2RxY290MDkwIGNvbXBhcmV0b3RhbCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAwCitkcWNvdDA5MSBjb21wYXJldG90YWwgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gLTEKK2RxY290MDkyIGNvbXBhcmV0b3RhbCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtPiAxCitkcWNvdDA5MyBjb21wYXJldG90YWwgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLT4gMAorCistLSBzb21lIGRpZmZlcmluZyBsZW5ndGgvZXhwb25lbnQgY2FzZXMKKy0tIGluIHRoaXMgZmlyc3QgZ3JvdXAsIGNvbXBhcmUgd291bGQgY29tcGFyZSBhbGwgZXF1YWwKK2RxY290MTAwIGNvbXBhcmV0b3RhbCAgIDcuMCAgICA3LjAgICAgLT4gMAorZHFjb3QxMDEgY29tcGFyZXRvdGFsICAgNy4wICAgIDcgICAgICAtPiAtMQorZHFjb3QxMDIgY29tcGFyZXRvdGFsICAgNyAgICAgIDcuMCAgICAtPiAxCitkcWNvdDEwMyBjb21wYXJldG90YWwgICA3RSswICAgNy4wICAgIC0+IDEKK2RxY290MTA0IGNvbXBhcmV0b3RhbCAgIDcwRS0xICA3LjAgICAgLT4gMAorZHFjb3QxMDUgY29tcGFyZXRvdGFsICAgMC43RSsxIDcgICAgICAtPiAwCitkcWNvdDEwNiBjb21wYXJldG90YWwgICA3MEUtMSAgNyAgICAgIC0+IC0xCitkcWNvdDEwNyBjb21wYXJldG90YWwgICA3LjAgICAgN0UrMCAgIC0+IC0xCitkcWNvdDEwOCBjb21wYXJldG90YWwgICA3LjAgICAgNzBFLTEgIC0+IDAKK2RxY290MTA5IGNvbXBhcmV0b3RhbCAgIDcgICAgICAwLjdFKzEgLT4gMAorZHFjb3QxMTAgY29tcGFyZXRvdGFsICAgNyAgICAgIDcwRS0xICAtPiAxCisKK2RxY290MTIwIGNvbXBhcmV0b3RhbCAgIDguMCAgICA3LjAgICAgLT4gMQorZHFjb3QxMjEgY29tcGFyZXRvdGFsICAgOC4wICAgIDcgICAgICAtPiAxCitkcWNvdDEyMiBjb21wYXJldG90YWwgICA4ICAgICAgNy4wICAgIC0+IDEKK2RxY290MTIzIGNvbXBhcmV0b3RhbCAgIDhFKzAgICA3LjAgICAgLT4gMQorZHFjb3QxMjQgY29tcGFyZXRvdGFsICAgODBFLTEgIDcuMCAgICAtPiAxCitkcWNvdDEyNSBjb21wYXJldG90YWwgICAwLjhFKzEgNyAgICAgIC0+IDEKK2RxY290MTI2IGNvbXBhcmV0b3RhbCAgIDgwRS0xICA3ICAgICAgLT4gMQorZHFjb3QxMjcgY29tcGFyZXRvdGFsICAgOC4wICAgIDdFKzAgICAtPiAxCitkcWNvdDEyOCBjb21wYXJldG90YWwgICA4LjAgICAgNzBFLTEgIC0+IDEKK2RxY290MTI5IGNvbXBhcmV0b3RhbCAgIDggICAgICAwLjdFKzEgIC0+IDEKK2RxY290MTMwIGNvbXBhcmV0b3RhbCAgIDggICAgICA3MEUtMSAgLT4gMQorCitkcWNvdDE0MCBjb21wYXJldG90YWwgICA4LjAgICAgOS4wICAgIC0+IC0xCitkcWNvdDE0MSBjb21wYXJldG90YWwgICA4LjAgICAgOSAgICAgIC0+IC0xCitkcWNvdDE0MiBjb21wYXJldG90YWwgICA4ICAgICAgOS4wICAgIC0+IC0xCitkcWNvdDE0MyBjb21wYXJldG90YWwgICA4RSswICAgOS4wICAgIC0+IC0xCitkcWNvdDE0NCBjb21wYXJldG90YWwgICA4MEUtMSAgOS4wICAgIC0+IC0xCitkcWNvdDE0NSBjb21wYXJldG90YWwgICAwLjhFKzEgOSAgICAgIC0+IC0xCitkcWNvdDE0NiBjb21wYXJldG90YWwgICA4MEUtMSAgOSAgICAgIC0+IC0xCitkcWNvdDE0NyBjb21wYXJldG90YWwgICA4LjAgICAgOUUrMCAgIC0+IC0xCitkcWNvdDE0OCBjb21wYXJldG90YWwgICA4LjAgICAgOTBFLTEgIC0+IC0xCitkcWNvdDE0OSBjb21wYXJldG90YWwgICA4ICAgICAgMC45RSsxIC0+IC0xCitkcWNvdDE1MCBjb21wYXJldG90YWwgICA4ICAgICAgOTBFLTEgIC0+IC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLSsgLi4KK2RxY290MjAwIGNvbXBhcmV0b3RhbCAgLTcuMCAgICA3LjAgICAgLT4gLTEKK2RxY290MjAxIGNvbXBhcmV0b3RhbCAgLTcuMCAgICA3ICAgICAgLT4gLTEKK2RxY290MjAyIGNvbXBhcmV0b3RhbCAgLTcgICAgICA3LjAgICAgLT4gLTEKK2RxY290MjAzIGNvbXBhcmV0b3RhbCAgLTdFKzAgICA3LjAgICAgLT4gLTEKK2RxY290MjA0IGNvbXBhcmV0b3RhbCAgLTcwRS0xICA3LjAgICAgLT4gLTEKK2RxY290MjA1IGNvbXBhcmV0b3RhbCAgLTAuN0UrMSA3ICAgICAgLT4gLTEKK2RxY290MjA2IGNvbXBhcmV0b3RhbCAgLTcwRS0xICA3ICAgICAgLT4gLTEKK2RxY290MjA3IGNvbXBhcmV0b3RhbCAgLTcuMCAgICA3RSswICAgLT4gLTEKK2RxY290MjA4IGNvbXBhcmV0b3RhbCAgLTcuMCAgICA3MEUtMSAgLT4gLTEKK2RxY290MjA5IGNvbXBhcmV0b3RhbCAgLTcgICAgICAwLjdFKzEgLT4gLTEKK2RxY290MjEwIGNvbXBhcmV0b3RhbCAgLTcgICAgICA3MEUtMSAgLT4gLTEKKworZHFjb3QyMjAgY29tcGFyZXRvdGFsICAtOC4wICAgIDcuMCAgICAtPiAtMQorZHFjb3QyMjEgY29tcGFyZXRvdGFsICAtOC4wICAgIDcgICAgICAtPiAtMQorZHFjb3QyMjIgY29tcGFyZXRvdGFsICAtOCAgICAgIDcuMCAgICAtPiAtMQorZHFjb3QyMjMgY29tcGFyZXRvdGFsICAtOEUrMCAgIDcuMCAgICAtPiAtMQorZHFjb3QyMjQgY29tcGFyZXRvdGFsICAtODBFLTEgIDcuMCAgICAtPiAtMQorZHFjb3QyMjUgY29tcGFyZXRvdGFsICAtMC44RSsxIDcgICAgICAtPiAtMQorZHFjb3QyMjYgY29tcGFyZXRvdGFsICAtODBFLTEgIDcgICAgICAtPiAtMQorZHFjb3QyMjcgY29tcGFyZXRvdGFsICAtOC4wICAgIDdFKzAgICAtPiAtMQorZHFjb3QyMjggY29tcGFyZXRvdGFsICAtOC4wICAgIDcwRS0xICAtPiAtMQorZHFjb3QyMjkgY29tcGFyZXRvdGFsICAtOCAgICAgIDAuN0UrMSAtPiAtMQorZHFjb3QyMzAgY29tcGFyZXRvdGFsICAtOCAgICAgIDcwRS0xICAtPiAtMQorCitkcWNvdDI0MCBjb21wYXJldG90YWwgIC04LjAgICAgOS4wICAgIC0+IC0xCitkcWNvdDI0MSBjb21wYXJldG90YWwgIC04LjAgICAgOSAgICAgIC0+IC0xCitkcWNvdDI0MiBjb21wYXJldG90YWwgIC04ICAgICAgOS4wICAgIC0+IC0xCitkcWNvdDI0MyBjb21wYXJldG90YWwgIC04RSswICAgOS4wICAgIC0+IC0xCitkcWNvdDI0NCBjb21wYXJldG90YWwgIC04MEUtMSAgOS4wICAgIC0+IC0xCitkcWNvdDI0NSBjb21wYXJldG90YWwgIC0wLjhFKzEgOSAgICAgIC0+IC0xCitkcWNvdDI0NiBjb21wYXJldG90YWwgIC04MEUtMSAgOSAgICAgIC0+IC0xCitkcWNvdDI0NyBjb21wYXJldG90YWwgIC04LjAgICAgOUUrMCAgIC0+IC0xCitkcWNvdDI0OCBjb21wYXJldG90YWwgIC04LjAgICAgOTBFLTEgIC0+IC0xCitkcWNvdDI0OSBjb21wYXJldG90YWwgIC04ICAgICAgMC45RSsxIC0+IC0xCitkcWNvdDI1MCBjb21wYXJldG90YWwgIC04ICAgICAgOTBFLTEgIC0+IC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgKy0gLi4KK2RxY290MzAwIGNvbXBhcmV0b3RhbCAgIDcuMCAgICAtNy4wICAgIC0+IDEKK2RxY290MzAxIGNvbXBhcmV0b3RhbCAgIDcuMCAgICAtNyAgICAgIC0+IDEKK2RxY290MzAyIGNvbXBhcmV0b3RhbCAgIDcgICAgICAtNy4wICAgIC0+IDEKK2RxY290MzAzIGNvbXBhcmV0b3RhbCAgIDdFKzAgICAtNy4wICAgIC0+IDEKK2RxY290MzA0IGNvbXBhcmV0b3RhbCAgIDcwRS0xICAtNy4wICAgIC0+IDEKK2RxY290MzA1IGNvbXBhcmV0b3RhbCAgIC43RSsxICAtNyAgICAgIC0+IDEKK2RxY290MzA2IGNvbXBhcmV0b3RhbCAgIDcwRS0xICAtNyAgICAgIC0+IDEKK2RxY290MzA3IGNvbXBhcmV0b3RhbCAgIDcuMCAgICAtN0UrMCAgIC0+IDEKK2RxY290MzA4IGNvbXBhcmV0b3RhbCAgIDcuMCAgICAtNzBFLTEgIC0+IDEKK2RxY290MzA5IGNvbXBhcmV0b3RhbCAgIDcgICAgICAtLjdFKzEgIC0+IDEKK2RxY290MzEwIGNvbXBhcmV0b3RhbCAgIDcgICAgICAtNzBFLTEgIC0+IDEKKworZHFjb3QzMjAgY29tcGFyZXRvdGFsICAgOC4wICAgIC03LjAgICAgLT4gMQorZHFjb3QzMjEgY29tcGFyZXRvdGFsICAgOC4wICAgIC03ICAgICAgLT4gMQorZHFjb3QzMjIgY29tcGFyZXRvdGFsICAgOCAgICAgIC03LjAgICAgLT4gMQorZHFjb3QzMjMgY29tcGFyZXRvdGFsICAgOEUrMCAgIC03LjAgICAgLT4gMQorZHFjb3QzMjQgY29tcGFyZXRvdGFsICAgODBFLTEgIC03LjAgICAgLT4gMQorZHFjb3QzMjUgY29tcGFyZXRvdGFsICAgLjhFKzEgIC03ICAgICAgLT4gMQorZHFjb3QzMjYgY29tcGFyZXRvdGFsICAgODBFLTEgIC03ICAgICAgLT4gMQorZHFjb3QzMjcgY29tcGFyZXRvdGFsICAgOC4wICAgIC03RSswICAgLT4gMQorZHFjb3QzMjggY29tcGFyZXRvdGFsICAgOC4wICAgIC03MEUtMSAgLT4gMQorZHFjb3QzMjkgY29tcGFyZXRvdGFsICAgOCAgICAgIC0uN0UrMSAgLT4gMQorZHFjb3QzMzAgY29tcGFyZXRvdGFsICAgOCAgICAgIC03MEUtMSAgLT4gMQorCitkcWNvdDM0MCBjb21wYXJldG90YWwgICA4LjAgICAgLTkuMCAgICAtPiAxCitkcWNvdDM0MSBjb21wYXJldG90YWwgICA4LjAgICAgLTkgICAgICAtPiAxCitkcWNvdDM0MiBjb21wYXJldG90YWwgICA4ICAgICAgLTkuMCAgICAtPiAxCitkcWNvdDM0MyBjb21wYXJldG90YWwgICA4RSswICAgLTkuMCAgICAtPiAxCitkcWNvdDM0NCBjb21wYXJldG90YWwgICA4MEUtMSAgLTkuMCAgICAtPiAxCitkcWNvdDM0NSBjb21wYXJldG90YWwgICAuOEUrMSAgLTkgICAgICAtPiAxCitkcWNvdDM0NiBjb21wYXJldG90YWwgICA4MEUtMSAgLTkgICAgICAtPiAxCitkcWNvdDM0NyBjb21wYXJldG90YWwgICA4LjAgICAgLTlFKzAgICAtPiAxCitkcWNvdDM0OCBjb21wYXJldG90YWwgICA4LjAgICAgLTkwRS0xICAtPiAxCitkcWNvdDM0OSBjb21wYXJldG90YWwgICA4ICAgICAgLS45RSsxICAtPiAxCitkcWNvdDM1MCBjb21wYXJldG90YWwgICA4ICAgICAgLTkwRS0xICAtPiAxCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLS0gLi4KK2RxY290NDAwIGNvbXBhcmV0b3RhbCAgIC03LjAgICAgLTcuMCAgICAtPiAwCitkcWNvdDQwMSBjb21wYXJldG90YWwgICAtNy4wICAgIC03ICAgICAgLT4gMQorZHFjb3Q0MDIgY29tcGFyZXRvdGFsICAgLTcgICAgICAtNy4wICAgIC0+IC0xCitkcWNvdDQwMyBjb21wYXJldG90YWwgICAtN0UrMCAgIC03LjAgICAgLT4gLTEKK2RxY290NDA0IGNvbXBhcmV0b3RhbCAgIC03MEUtMSAgLTcuMCAgICAtPiAwCitkcWNvdDQwNSBjb21wYXJldG90YWwgICAtLjdFKzEgIC03ICAgICAgLT4gMAorZHFjb3Q0MDYgY29tcGFyZXRvdGFsICAgLTcwRS0xICAtNyAgICAgIC0+IDEKK2RxY290NDA3IGNvbXBhcmV0b3RhbCAgIC03LjAgICAgLTdFKzAgICAtPiAxCitkcWNvdDQwOCBjb21wYXJldG90YWwgICAtNy4wICAgIC03MEUtMSAgLT4gMAorZHFjb3Q0MDkgY29tcGFyZXRvdGFsICAgLTcgICAgICAtLjdFKzEgIC0+IDAKK2RxY290NDEwIGNvbXBhcmV0b3RhbCAgIC03ICAgICAgLTcwRS0xICAtPiAtMQorCitkcWNvdDQyMCBjb21wYXJldG90YWwgICAtOC4wICAgIC03LjAgICAgLT4gLTEKK2RxY290NDIxIGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTcgICAgICAtPiAtMQorZHFjb3Q0MjIgY29tcGFyZXRvdGFsICAgLTggICAgICAtNy4wICAgIC0+IC0xCitkcWNvdDQyMyBjb21wYXJldG90YWwgICAtOEUrMCAgIC03LjAgICAgLT4gLTEKK2RxY290NDI0IGNvbXBhcmV0b3RhbCAgIC04MEUtMSAgLTcuMCAgICAtPiAtMQorZHFjb3Q0MjUgY29tcGFyZXRvdGFsICAgLS44RSsxICAtNyAgICAgIC0+IC0xCitkcWNvdDQyNiBjb21wYXJldG90YWwgICAtODBFLTEgIC03ICAgICAgLT4gLTEKK2RxY290NDI3IGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTdFKzAgICAtPiAtMQorZHFjb3Q0MjggY29tcGFyZXRvdGFsICAgLTguMCAgICAtNzBFLTEgIC0+IC0xCitkcWNvdDQyOSBjb21wYXJldG90YWwgICAtOCAgICAgIC0uN0UrMSAgLT4gLTEKK2RxY290NDMwIGNvbXBhcmV0b3RhbCAgIC04ICAgICAgLTcwRS0xICAtPiAtMQorCitkcWNvdDQ0MCBjb21wYXJldG90YWwgICAtOC4wICAgIC05LjAgICAgLT4gMQorZHFjb3Q0NDEgY29tcGFyZXRvdGFsICAgLTguMCAgICAtOSAgICAgIC0+IDEKK2RxY290NDQyIGNvbXBhcmV0b3RhbCAgIC04ICAgICAgLTkuMCAgICAtPiAxCitkcWNvdDQ0MyBjb21wYXJldG90YWwgICAtOEUrMCAgIC05LjAgICAgLT4gMQorZHFjb3Q0NDQgY29tcGFyZXRvdGFsICAgLTgwRS0xICAtOS4wICAgIC0+IDEKK2RxY290NDQ1IGNvbXBhcmV0b3RhbCAgIC0uOEUrMSAgLTkgICAgICAtPiAxCitkcWNvdDQ0NiBjb21wYXJldG90YWwgICAtODBFLTEgIC05ICAgICAgLT4gMQorZHFjb3Q0NDcgY29tcGFyZXRvdGFsICAgLTguMCAgICAtOUUrMCAgIC0+IDEKK2RxY290NDQ4IGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTkwRS0xICAtPiAxCitkcWNvdDQ0OSBjb21wYXJldG90YWwgICAtOCAgICAgIC0uOUUrMSAgLT4gMQorZHFjb3Q0NTAgY29tcGFyZXRvdGFsICAgLTggICAgICAtOTBFLTEgIC0+IDEKKworCistLSB0ZXN0Y2FzZXMgdGhhdCBzdWJ0cmFjdCB0byBsb3RzIG9mIHplcm9zIGF0IGJvdW5kYXJpZXMgW3Bncl0KK2RxY290NDczIGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2RxY290NDc0IGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDAwMDAwRSs4OSAxMjMuNDU2RSs4OSAtPiAtMQorZHFjb3Q0NzUgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2RxY290NDc2IGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDAwMEUrODkgMTIzLjQ1NkUrODkgLT4gLTEKK2RxY290NDc3IGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAtMQorZHFjb3Q0NzggY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMEUrODkgMTIzLjQ1NkUrODkgLT4gLTEKK2RxY290NDc5IGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2RxY290NDgwIGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwRSs4OSAxMjMuNDU2RSs4OSAtPiAtMQorZHFjb3Q0ODEgY29tcGFyZXRvdGFsIDEyMy40NTYwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2RxY290NDgyIGNvbXBhcmV0b3RhbCAxMjMuNDU2MEUrODkgMTIzLjQ1NkUrODkgLT4gLTEKK2RxY290NDgzIGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2RS04OSAtPiAwCitkcWNvdDQ4NyBjb21wYXJldG90YWwgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMDAwMDBFKzg5IC0+IDEKK2RxY290NDg4IGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMDAwRS04OSAtPiAxCitkcWNvdDQ4OSBjb21wYXJldG90YWwgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMDAwRSs4OSAtPiAxCitkcWNvdDQ5MCBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDBFLTg5IC0+IDEKK2RxY290NDkxIGNvbXBhcmV0b3RhbCAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwRSs4OSAtPiAxCitkcWNvdDQ5MiBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwRS04OSAtPiAxCitkcWNvdDQ5MyBjb21wYXJldG90YWwgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDBFKzg5IC0+IDEKK2RxY290NDk0IGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2MDAwRS04OSAtPiAxCitkcWNvdDQ5NSBjb21wYXJldG90YWwgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwRSs4OSAtPiAxCitkcWNvdDQ5NiBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjBFLTg5IC0+IDEKK2RxY290NDk3IGNvbXBhcmV0b3RhbCAxMjMuNDU2RSs4OSAxMjMuNDU2RSs4OSAtPiAwCisKKy0tIHdpZGUtcmFuZ2luZywgYXJvdW5kIHByZWNpc2lvbjsgc2lnbnMgZXF1YWwKK2RxY290NDk4IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xNyAgICAtPiAxCitkcWNvdDQ5OSBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMTYgICAgLT4gMQorZHFjb3Q1MDAgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTE1ICAgIC0+IDEKK2RxY290NTAxIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xNCAgICAtPiAxCitkcWNvdDUwMiBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMTMgICAgLT4gMQorZHFjb3Q1MDMgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTEyICAgIC0+IDEKK2RxY290NTA0IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xMSAgICAtPiAxCitkcWNvdDUwNSBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMTAgICAgLT4gMQorZHFjb3Q1MDYgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTkgICAgIC0+IDEKK2RxY290NTA3IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS04ICAgICAtPiAxCitkcWNvdDUwOCBjb21wYXJldG90YWwgICAgMSAgICAgMUUtNyAgICAgLT4gMQorZHFjb3Q1MDkgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTYgICAgIC0+IDEKK2RxY290NTEwIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS01ICAgICAtPiAxCitkcWNvdDUxMSBjb21wYXJldG90YWwgICAgMSAgICAgMUUtNCAgICAgLT4gMQorZHFjb3Q1MTIgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTMgICAgIC0+IDEKK2RxY290NTEzIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0yICAgICAtPiAxCitkcWNvdDUxNCBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMSAgICAgLT4gMQorZHFjb3Q1MTUgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTAgICAgIC0+IDAKK2RxY290NTE2IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxICAgICAtPiAtMQorZHFjb3Q1MTcgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzIgICAgIC0+IC0xCitkcWNvdDUxOCBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMyAgICAgLT4gLTEKK2RxY290NTE5IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSs0ICAgICAtPiAtMQorZHFjb3Q1MjEgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzUgICAgIC0+IC0xCitkcWNvdDUyMiBjb21wYXJldG90YWwgICAgMSAgICAgMUUrNiAgICAgLT4gLTEKK2RxY290NTIzIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSs3ICAgICAtPiAtMQorZHFjb3Q1MjQgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzggICAgIC0+IC0xCitkcWNvdDUyNSBjb21wYXJldG90YWwgICAgMSAgICAgMUUrOSAgICAgLT4gLTEKK2RxY290NTI2IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxMCAgICAtPiAtMQorZHFjb3Q1MjcgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzExICAgIC0+IC0xCitkcWNvdDUyOCBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTIgICAgLT4gLTEKK2RxY290NTI5IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxMyAgICAtPiAtMQorZHFjb3Q1MzAgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzE0ICAgIC0+IC0xCitkcWNvdDUzMSBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTUgICAgLT4gLTEKK2RxY290NTMyIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxNiAgICAtPiAtMQorZHFjb3Q1MzMgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzE3ICAgIC0+IC0xCistLSBMUiBzd2FwCitkcWNvdDUzOCBjb21wYXJldG90YWwgICAgMUUtMTcgIDEgICAgICAgLT4gLTEKK2RxY290NTM5IGNvbXBhcmV0b3RhbCAgICAxRS0xNiAgMSAgICAgICAtPiAtMQorZHFjb3Q1NDAgY29tcGFyZXRvdGFsICAgIDFFLTE1ICAxICAgICAgIC0+IC0xCitkcWNvdDU0MSBjb21wYXJldG90YWwgICAgMUUtMTQgIDEgICAgICAgLT4gLTEKK2RxY290NTQyIGNvbXBhcmV0b3RhbCAgICAxRS0xMyAgMSAgICAgICAtPiAtMQorZHFjb3Q1NDMgY29tcGFyZXRvdGFsICAgIDFFLTEyICAxICAgICAgIC0+IC0xCitkcWNvdDU0NCBjb21wYXJldG90YWwgICAgMUUtMTEgIDEgICAgICAgLT4gLTEKK2RxY290NTQ1IGNvbXBhcmV0b3RhbCAgICAxRS0xMCAgMSAgICAgICAtPiAtMQorZHFjb3Q1NDYgY29tcGFyZXRvdGFsICAgIDFFLTkgICAxICAgICAgIC0+IC0xCitkcWNvdDU0NyBjb21wYXJldG90YWwgICAgMUUtOCAgIDEgICAgICAgLT4gLTEKK2RxY290NTQ4IGNvbXBhcmV0b3RhbCAgICAxRS03ICAgMSAgICAgICAtPiAtMQorZHFjb3Q1NDkgY29tcGFyZXRvdGFsICAgIDFFLTYgICAxICAgICAgIC0+IC0xCitkcWNvdDU1MCBjb21wYXJldG90YWwgICAgMUUtNSAgIDEgICAgICAgLT4gLTEKK2RxY290NTUxIGNvbXBhcmV0b3RhbCAgICAxRS00ICAgMSAgICAgICAtPiAtMQorZHFjb3Q1NTIgY29tcGFyZXRvdGFsICAgIDFFLTMgICAxICAgICAgIC0+IC0xCitkcWNvdDU1MyBjb21wYXJldG90YWwgICAgMUUtMiAgIDEgICAgICAgLT4gLTEKK2RxY290NTU0IGNvbXBhcmV0b3RhbCAgICAxRS0xICAgMSAgICAgICAtPiAtMQorZHFjb3Q1NTUgY29tcGFyZXRvdGFsICAgIDFFLTAgICAxICAgICAgIC0+ICAwCitkcWNvdDU1NiBjb21wYXJldG90YWwgICAgMUUrMSAgIDEgICAgICAgLT4gIDEKK2RxY290NTU3IGNvbXBhcmV0b3RhbCAgICAxRSsyICAgMSAgICAgICAtPiAgMQorZHFjb3Q1NTggY29tcGFyZXRvdGFsICAgIDFFKzMgICAxICAgICAgIC0+ICAxCitkcWNvdDU1OSBjb21wYXJldG90YWwgICAgMUUrNCAgIDEgICAgICAgLT4gIDEKK2RxY290NTYxIGNvbXBhcmV0b3RhbCAgICAxRSs1ICAgMSAgICAgICAtPiAgMQorZHFjb3Q1NjIgY29tcGFyZXRvdGFsICAgIDFFKzYgICAxICAgICAgIC0+ICAxCitkcWNvdDU2MyBjb21wYXJldG90YWwgICAgMUUrNyAgIDEgICAgICAgLT4gIDEKK2RxY290NTY0IGNvbXBhcmV0b3RhbCAgICAxRSs4ICAgMSAgICAgICAtPiAgMQorZHFjb3Q1NjUgY29tcGFyZXRvdGFsICAgIDFFKzkgICAxICAgICAgIC0+ICAxCitkcWNvdDU2NiBjb21wYXJldG90YWwgICAgMUUrMTAgIDEgICAgICAgLT4gIDEKK2RxY290NTY3IGNvbXBhcmV0b3RhbCAgICAxRSsxMSAgMSAgICAgICAtPiAgMQorZHFjb3Q1NjggY29tcGFyZXRvdGFsICAgIDFFKzEyICAxICAgICAgIC0+ICAxCitkcWNvdDU2OSBjb21wYXJldG90YWwgICAgMUUrMTMgIDEgICAgICAgLT4gIDEKK2RxY290NTcwIGNvbXBhcmV0b3RhbCAgICAxRSsxNCAgMSAgICAgICAtPiAgMQorZHFjb3Q1NzEgY29tcGFyZXRvdGFsICAgIDFFKzE1ICAxICAgICAgIC0+ICAxCitkcWNvdDU3MiBjb21wYXJldG90YWwgICAgMUUrMTYgIDEgICAgICAgLT4gIDEKK2RxY290NTczIGNvbXBhcmV0b3RhbCAgICAxRSsxNyAgMSAgICAgICAtPiAgMQorLS0gc2ltaWxhciB3aXRoIGEgdXNlZnVsIGNvZWZmaWNpZW50LCBvbmUgc2lkZSBvbmx5CitkcWNvdDU3OCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNyAgICAtPiAxCitkcWNvdDU3OSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNiAgICAtPiAxCitkcWNvdDU4MCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNSAgICAtPiAxCitkcWNvdDU4MSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNCAgICAtPiAxCitkcWNvdDU4MiBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMyAgICAtPiAxCitkcWNvdDU4MyBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMiAgICAtPiAxCitkcWNvdDU4NCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMSAgICAtPiAxCitkcWNvdDU4NSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMCAgICAtPiAxCitkcWNvdDU4NiBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS05ICAgICAtPiAxCitkcWNvdDU4NyBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS04ICAgICAtPiAxCitkcWNvdDU4OCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS03ICAgICAtPiAxCitkcWNvdDU4OSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS02ICAgICAtPiAtMQorZHFjb3Q1OTAgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNSAgICAgLT4gLTEKK2RxY290NTkxIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTQgICAgIC0+IC0xCitkcWNvdDU5MiBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0zICAgICAtPiAtMQorZHFjb3Q1OTMgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMiAgICAgLT4gLTEKK2RxY290NTk0IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEgICAgIC0+IC0xCitkcWNvdDU5NSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0wICAgICAtPiAtMQorZHFjb3Q1OTYgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMSAgICAgLT4gLTEKK2RxY290NTk3IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzIgICAgIC0+IC0xCitkcWNvdDU5OCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSszICAgICAtPiAtMQorZHFjb3Q1OTkgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrNCAgICAgLT4gLTEKKworLS0gY2hlY2sgc29tZSB1bml0LXkgdHJhcHMKK2RxY290NjAwIGNvbXBhcmV0b3RhbCAgIDEyICAgICAgICAgICAgMTIuMjM0NSAtPiAtMQorZHFjb3Q2MDEgY29tcGFyZXRvdGFsICAgMTIuMCAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitkcWNvdDYwMiBjb21wYXJldG90YWwgICAxMi4wMCAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY290NjAzIGNvbXBhcmV0b3RhbCAgIDEyLjAwMCAgICAgICAgMTIuMjM0NSAtPiAtMQorZHFjb3Q2MDQgY29tcGFyZXRvdGFsICAgMTIuMDAwMCAgICAgICAxMi4yMzQ1IC0+IC0xCitkcWNvdDYwNSBjb21wYXJldG90YWwgICAxMi4wMDAwMCAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY290NjA2IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMCAgICAgMTIuMjM0NSAtPiAtMQorZHFjb3Q2MDcgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwMCAgICAxMi4yMzQ1IC0+IC0xCitkcWNvdDYwOCBjb21wYXJldG90YWwgICAxMi4wMDAwMDAwMCAgIDEyLjIzNDUgLT4gLTEKK2RxY290NjA5IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMDAwMCAgMTIuMjM0NSAtPiAtMQorZHFjb3Q2MTAgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMiAgICAgICAgICAgIC0+ICAxCitkcWNvdDYxMSBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAgICAgICAgICAgLT4gIDEKK2RxY290NjEyIGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAgICAgICAgICAtPiAgMQorZHFjb3Q2MTMgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAgICAgICAgIC0+ICAxCitkcWNvdDYxNCBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMDAgICAgICAgLT4gIDEKK2RxY290NjE1IGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwMDAgICAgICAtPiAgMQorZHFjb3Q2MTYgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAwMDAgICAgIC0+ICAxCitkcWNvdDYxNyBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMDAwMDAgICAgLT4gIDEKK2RxY290NjE4IGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwMDAwMDAgICAtPiAgMQorZHFjb3Q2MTkgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAwMDAwMDAgIC0+ICAxCitkcWNvdDYyMCBjb21wYXJldG90YWwgIC0xMiAgICAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY290NjIxIGNvbXBhcmV0b3RhbCAgLTEyLjAgICAgICAgICAtMTIuMjM0NSAtPiAgMQorZHFjb3Q2MjIgY29tcGFyZXRvdGFsICAtMTIuMDAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkcWNvdDYyMyBjb21wYXJldG90YWwgIC0xMi4wMDAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY290NjI0IGNvbXBhcmV0b3RhbCAgLTEyLjAwMDAgICAgICAtMTIuMjM0NSAtPiAgMQorZHFjb3Q2MjUgY29tcGFyZXRvdGFsICAtMTIuMDAwMDAgICAgIC0xMi4yMzQ1IC0+ICAxCitkcWNvdDYyNiBjb21wYXJldG90YWwgIC0xMi4wMDAwMDAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY290NjI3IGNvbXBhcmV0b3RhbCAgLTEyLjAwMDAwMDAgICAtMTIuMjM0NSAtPiAgMQorZHFjb3Q2MjggY29tcGFyZXRvdGFsICAtMTIuMDAwMDAwMDAgIC0xMi4yMzQ1IC0+ICAxCitkcWNvdDYyOSBjb21wYXJldG90YWwgIC0xMi4wMDAwMDAwMDAgLTEyLjIzNDUgLT4gIDEKK2RxY290NjMwIGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyICAgICAgICAgICAtPiAtMQorZHFjb3Q2MzEgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMCAgICAgICAgIC0+IC0xCitkcWNvdDYzMiBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMCAgICAgICAgLT4gLTEKK2RxY290NjMzIGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMCAgICAgICAtPiAtMQorZHFjb3Q2MzQgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwMCAgICAgIC0+IC0xCitkcWNvdDYzNSBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAwMCAgICAgLT4gLTEKK2RxY290NjM2IGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMDAwMCAgICAtPiAtMQorZHFjb3Q2MzcgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwMDAwMCAgIC0+IC0xCitkcWNvdDYzOCBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMCAgLT4gLTEKK2RxY290NjM5IGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwMCAtPiAtMQorCistLSBleHRlbmRlZCB6ZXJvcworZHFjb3Q2NDAgY29tcGFyZXRvdGFsICAgMCAgICAgMCAgIC0+IDAKK2RxY290NjQxIGNvbXBhcmV0b3RhbCAgIDAgICAgLTAgICAtPiAxCitkcWNvdDY0MiBjb21wYXJldG90YWwgICAwICAgIC0wLjAgLT4gMQorZHFjb3Q2NDMgY29tcGFyZXRvdGFsICAgMCAgICAgMC4wIC0+IDEKK2RxY290NjQ0IGNvbXBhcmV0b3RhbCAgLTAgICAgIDAgICAtPiAtMQorZHFjb3Q2NDUgY29tcGFyZXRvdGFsICAtMCAgICAtMCAgIC0+IDAKK2RxY290NjQ2IGNvbXBhcmV0b3RhbCAgLTAgICAgLTAuMCAtPiAtMQorZHFjb3Q2NDcgY29tcGFyZXRvdGFsICAtMCAgICAgMC4wIC0+IC0xCitkcWNvdDY0OCBjb21wYXJldG90YWwgICAwLjAgICAwICAgLT4gLTEKK2RxY290NjQ5IGNvbXBhcmV0b3RhbCAgIDAuMCAgLTAgICAtPiAxCitkcWNvdDY1MCBjb21wYXJldG90YWwgICAwLjAgIC0wLjAgLT4gMQorZHFjb3Q2NTEgY29tcGFyZXRvdGFsICAgMC4wICAgMC4wIC0+IDAKK2RxY290NjUyIGNvbXBhcmV0b3RhbCAgLTAuMCAgIDAgICAtPiAtMQorZHFjb3Q2NTMgY29tcGFyZXRvdGFsICAtMC4wICAtMCAgIC0+IDEKK2RxY290NjU0IGNvbXBhcmV0b3RhbCAgLTAuMCAgLTAuMCAtPiAwCitkcWNvdDY1NSBjb21wYXJldG90YWwgIC0wLjAgICAwLjAgLT4gLTEKKworZHFjb3Q2NTYgY29tcGFyZXRvdGFsICAtMEUxICAgMC4wIC0+IC0xCitkcWNvdDY1NyBjb21wYXJldG90YWwgIC0wRTIgICAwLjAgLT4gLTEKK2RxY290NjU4IGNvbXBhcmV0b3RhbCAgIDBFMSAgIDAuMCAtPiAxCitkcWNvdDY1OSBjb21wYXJldG90YWwgICAwRTIgICAwLjAgLT4gMQorZHFjb3Q2NjAgY29tcGFyZXRvdGFsICAtMEUxICAgMCAgIC0+IC0xCitkcWNvdDY2MSBjb21wYXJldG90YWwgIC0wRTIgICAwICAgLT4gLTEKK2RxY290NjYyIGNvbXBhcmV0b3RhbCAgIDBFMSAgIDAgICAtPiAxCitkcWNvdDY2MyBjb21wYXJldG90YWwgICAwRTIgICAwICAgLT4gMQorZHFjb3Q2NjQgY29tcGFyZXRvdGFsICAtMEUxICAtMEUxIC0+IDAKK2RxY290NjY1IGNvbXBhcmV0b3RhbCAgLTBFMiAgLTBFMSAtPiAtMQorZHFjb3Q2NjYgY29tcGFyZXRvdGFsICAgMEUxICAtMEUxIC0+IDEKK2RxY290NjY3IGNvbXBhcmV0b3RhbCAgIDBFMiAgLTBFMSAtPiAxCitkcWNvdDY2OCBjb21wYXJldG90YWwgIC0wRTEgIC0wRTIgLT4gMQorZHFjb3Q2NjkgY29tcGFyZXRvdGFsICAtMEUyICAtMEUyIC0+IDAKK2RxY290NjcwIGNvbXBhcmV0b3RhbCAgIDBFMSAgLTBFMiAtPiAxCitkcWNvdDY3MSBjb21wYXJldG90YWwgICAwRTIgIC0wRTIgLT4gMQorZHFjb3Q2NzIgY29tcGFyZXRvdGFsICAtMEUxICAgMEUxIC0+IC0xCitkcWNvdDY3MyBjb21wYXJldG90YWwgIC0wRTIgICAwRTEgLT4gLTEKK2RxY290Njc0IGNvbXBhcmV0b3RhbCAgIDBFMSAgIDBFMSAtPiAwCitkcWNvdDY3NSBjb21wYXJldG90YWwgICAwRTIgICAwRTEgLT4gMQorZHFjb3Q2NzYgY29tcGFyZXRvdGFsICAtMEUxICAgMEUyIC0+IC0xCitkcWNvdDY3NyBjb21wYXJldG90YWwgIC0wRTIgICAwRTIgLT4gLTEKK2RxY290Njc4IGNvbXBhcmV0b3RhbCAgIDBFMSAgIDBFMiAtPiAtMQorZHFjb3Q2NzkgY29tcGFyZXRvdGFsICAgMEUyICAgMEUyIC0+IDAKKworLS0gdHJhaWxpbmcgemVyb3M7IHVuaXQteQorZHFjb3Q2ODAgY29tcGFyZXRvdGFsICAgMTIgICAgMTIgICAgICAgICAgIC0+IDAKK2RxY290NjgxIGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAgICAgICAgICAtPiAxCitkcWNvdDY4MiBjb21wYXJldG90YWwgICAxMiAgICAxMi4wMCAgICAgICAgLT4gMQorZHFjb3Q2ODMgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwICAgICAgIC0+IDEKK2RxY290Njg0IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAgICAgICAtPiAxCitkcWNvdDY4NSBjb21wYXJldG90YWwgICAxMiAgICAxMi4wMDAwMCAgICAgLT4gMQorZHFjb3Q2ODYgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMDAwICAgIC0+IDEKK2RxY290Njg3IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAwMDAgICAtPiAxCitkcWNvdDY4OCBjb21wYXJldG90YWwgICAxMiAgICAxMi4wMDAwMDAwMCAgLT4gMQorZHFjb3Q2ODkgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMDAwMDAwIC0+IDEKK2RxY290NjkwIGNvbXBhcmV0b3RhbCAgIDEyICAgICAgICAgICAgICAxMiAtPiAwCitkcWNvdDY5MSBjb21wYXJldG90YWwgICAxMi4wICAgICAgICAgICAgMTIgLT4gLTEKK2RxY290NjkyIGNvbXBhcmV0b3RhbCAgIDEyLjAwICAgICAgICAgICAxMiAtPiAtMQorZHFjb3Q2OTMgY29tcGFyZXRvdGFsICAgMTIuMDAwICAgICAgICAgIDEyIC0+IC0xCitkcWNvdDY5NCBjb21wYXJldG90YWwgICAxMi4wMDAwICAgICAgICAgMTIgLT4gLTEKK2RxY290Njk1IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwICAgICAgICAxMiAtPiAtMQorZHFjb3Q2OTYgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwICAgICAgIDEyIC0+IC0xCitkcWNvdDY5NyBjb21wYXJldG90YWwgICAxMi4wMDAwMDAwICAgICAgMTIgLT4gLTEKK2RxY290Njk4IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMDAwICAgICAxMiAtPiAtMQorZHFjb3Q2OTkgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwMDAwICAgIDEyIC0+IC0xCisKKy0tIG9sZCBsb25nIG9wZXJhbmQgY2hlY2tzCitkcWNvdDcwMSBjb21wYXJldG90YWwgMTIzNDU2NzgwMDAgIDEgLT4gIDEKK2RxY290NzAyIGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4MDAwICAtPiAtMQorZHFjb3Q3MDMgY29tcGFyZXRvdGFsIDEyMzQ1Njc4MDAgICAxIC0+ICAxCitkcWNvdDcwNCBjb21wYXJldG90YWwgMSAxMjM0NTY3ODAwICAgLT4gLTEKK2RxY290NzA1IGNvbXBhcmV0b3RhbCAxMjM0NTY3ODkwICAgMSAtPiAgMQorZHFjb3Q3MDYgY29tcGFyZXRvdGFsIDEgMTIzNDU2Nzg5MCAgIC0+IC0xCitkcWNvdDcwNyBjb21wYXJldG90YWwgMTIzNDU2Nzg5MSAgIDEgLT4gIDEKK2RxY290NzA4IGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4OTEgICAtPiAtMQorZHFjb3Q3MDkgY29tcGFyZXRvdGFsIDEyMzQ1Njc4OTAxICAxIC0+ICAxCitkcWNvdDcxMCBjb21wYXJldG90YWwgMSAxMjM0NTY3ODkwMSAgLT4gLTEKK2RxY290NzExIGNvbXBhcmV0b3RhbCAxMjM0NTY3ODk2ICAgMSAtPiAgMQorZHFjb3Q3MTIgY29tcGFyZXRvdGFsIDEgMTIzNDU2Nzg5NiAgIC0+IC0xCitkcWNvdDcxMyBjb21wYXJldG90YWwgLTEyMzQ1Njc4OTEgIDEgLT4gLTEKK2RxY290NzE0IGNvbXBhcmV0b3RhbCAxIC0xMjM0NTY3ODkxICAtPiAgMQorZHFjb3Q3MTUgY29tcGFyZXRvdGFsIC0xMjM0NTY3ODkwMSAxIC0+IC0xCitkcWNvdDcxNiBjb21wYXJldG90YWwgMSAtMTIzNDU2Nzg5MDEgLT4gIDEKK2RxY290NzE3IGNvbXBhcmV0b3RhbCAtMTIzNDU2Nzg5NiAgMSAtPiAtMQorZHFjb3Q3MTggY29tcGFyZXRvdGFsIDEgLTEyMzQ1Njc4OTYgIC0+ICAxCisKKy0tIG9sZCByZXNpZHVlIGNhc2VzCitkcWNvdDc0MCBjb21wYXJldG90YWwgIDEgIDAuOTk5OTk5OSAgLT4gMQorZHFjb3Q3NDEgY29tcGFyZXRvdGFsICAxICAwLjk5OTk5OSAgIC0+IDEKK2RxY290NzQyIGNvbXBhcmV0b3RhbCAgMSAgMC45OTk5OSAgICAtPiAxCitkcWNvdDc0MyBjb21wYXJldG90YWwgIDEgIDEuMDAwMCAgICAgLT4gMQorZHFjb3Q3NDQgY29tcGFyZXRvdGFsICAxICAxLjAwMDAxICAgIC0+IC0xCitkcWNvdDc0NSBjb21wYXJldG90YWwgIDEgIDEuMDAwMDAxICAgLT4gLTEKK2RxY290NzQ2IGNvbXBhcmV0b3RhbCAgMSAgMS4wMDAwMDAxICAtPiAtMQorZHFjb3Q3NTAgY29tcGFyZXRvdGFsICAwLjk5OTk5OTkgIDEgIC0+IC0xCitkcWNvdDc1MSBjb21wYXJldG90YWwgIDAuOTk5OTk5ICAgMSAgLT4gLTEKK2RxY290NzUyIGNvbXBhcmV0b3RhbCAgMC45OTk5OSAgICAxICAtPiAtMQorZHFjb3Q3NTMgY29tcGFyZXRvdGFsICAxLjAwMDAgICAgIDEgIC0+IC0xCitkcWNvdDc1NCBjb21wYXJldG90YWwgIDEuMDAwMDEgICAgMSAgLT4gMQorZHFjb3Q3NTUgY29tcGFyZXRvdGFsICAxLjAwMDAwMSAgIDEgIC0+IDEKK2RxY290NzU2IGNvbXBhcmV0b3RhbCAgMS4wMDAwMDAxICAxICAtPiAxCisKKy0tIFNwZWNpYWxzCitkcWNvdDc4MCBjb21wYXJldG90YWwgIEluZiAgLUluZiAgIC0+ICAxCitkcWNvdDc4MSBjb21wYXJldG90YWwgIEluZiAgLTEwMDAgIC0+ICAxCitkcWNvdDc4MiBjb21wYXJldG90YWwgIEluZiAgLTEgICAgIC0+ICAxCitkcWNvdDc4MyBjb21wYXJldG90YWwgIEluZiAgLTAgICAgIC0+ICAxCitkcWNvdDc4NCBjb21wYXJldG90YWwgIEluZiAgIDAgICAgIC0+ICAxCitkcWNvdDc4NSBjb21wYXJldG90YWwgIEluZiAgIDEgICAgIC0+ICAxCitkcWNvdDc4NiBjb21wYXJldG90YWwgIEluZiAgIDEwMDAgIC0+ICAxCitkcWNvdDc4NyBjb21wYXJldG90YWwgIEluZiAgIEluZiAgIC0+ICAwCitkcWNvdDc4OCBjb21wYXJldG90YWwgLTEwMDAgIEluZiAgIC0+IC0xCitkcWNvdDc4OSBjb21wYXJldG90YWwgLUluZiAgIEluZiAgIC0+IC0xCitkcWNvdDc5MCBjb21wYXJldG90YWwgLTEgICAgIEluZiAgIC0+IC0xCitkcWNvdDc5MSBjb21wYXJldG90YWwgLTAgICAgIEluZiAgIC0+IC0xCitkcWNvdDc5MiBjb21wYXJldG90YWwgIDAgICAgIEluZiAgIC0+IC0xCitkcWNvdDc5MyBjb21wYXJldG90YWwgIDEgICAgIEluZiAgIC0+IC0xCitkcWNvdDc5NCBjb21wYXJldG90YWwgIDEwMDAgIEluZiAgIC0+IC0xCitkcWNvdDc5NSBjb21wYXJldG90YWwgIEluZiAgIEluZiAgIC0+ICAwCisKK2RxY290ODAwIGNvbXBhcmV0b3RhbCAtSW5mICAtSW5mICAgLT4gIDAKK2RxY290ODAxIGNvbXBhcmV0b3RhbCAtSW5mICAtMTAwMCAgLT4gLTEKK2RxY290ODAyIGNvbXBhcmV0b3RhbCAtSW5mICAtMSAgICAgLT4gLTEKK2RxY290ODAzIGNvbXBhcmV0b3RhbCAtSW5mICAtMCAgICAgLT4gLTEKK2RxY290ODA0IGNvbXBhcmV0b3RhbCAtSW5mICAgMCAgICAgLT4gLTEKK2RxY290ODA1IGNvbXBhcmV0b3RhbCAtSW5mICAgMSAgICAgLT4gLTEKK2RxY290ODA2IGNvbXBhcmV0b3RhbCAtSW5mICAgMTAwMCAgLT4gLTEKK2RxY290ODA3IGNvbXBhcmV0b3RhbCAtSW5mICAgSW5mICAgLT4gLTEKK2RxY290ODA4IGNvbXBhcmV0b3RhbCAtSW5mICAtSW5mICAgLT4gIDAKK2RxY290ODA5IGNvbXBhcmV0b3RhbCAtMTAwMCAtSW5mICAgLT4gIDEKK2RxY290ODEwIGNvbXBhcmV0b3RhbCAtMSAgICAtSW5mICAgLT4gIDEKK2RxY290ODExIGNvbXBhcmV0b3RhbCAtMCAgICAtSW5mICAgLT4gIDEKK2RxY290ODEyIGNvbXBhcmV0b3RhbCAgMCAgICAtSW5mICAgLT4gIDEKK2RxY290ODEzIGNvbXBhcmV0b3RhbCAgMSAgICAtSW5mICAgLT4gIDEKK2RxY290ODE0IGNvbXBhcmV0b3RhbCAgMTAwMCAtSW5mICAgLT4gIDEKK2RxY290ODE1IGNvbXBhcmV0b3RhbCAgSW5mICAtSW5mICAgLT4gIDEKKworZHFjb3Q4MjEgY29tcGFyZXRvdGFsICBOYU4gLUluZiAgICAtPiAgMQorZHFjb3Q4MjIgY29tcGFyZXRvdGFsICBOYU4gLTEwMDAgICAtPiAgMQorZHFjb3Q4MjMgY29tcGFyZXRvdGFsICBOYU4gLTEgICAgICAtPiAgMQorZHFjb3Q4MjQgY29tcGFyZXRvdGFsICBOYU4gLTAgICAgICAtPiAgMQorZHFjb3Q4MjUgY29tcGFyZXRvdGFsICBOYU4gIDAgICAgICAtPiAgMQorZHFjb3Q4MjYgY29tcGFyZXRvdGFsICBOYU4gIDEgICAgICAtPiAgMQorZHFjb3Q4MjcgY29tcGFyZXRvdGFsICBOYU4gIDEwMDAgICAtPiAgMQorZHFjb3Q4MjggY29tcGFyZXRvdGFsICBOYU4gIEluZiAgICAtPiAgMQorZHFjb3Q4MjkgY29tcGFyZXRvdGFsICBOYU4gIE5hTiAgICAtPiAgMAorZHFjb3Q4MzAgY29tcGFyZXRvdGFsIC1JbmYgIE5hTiAgICAtPiAgLTEKK2RxY290ODMxIGNvbXBhcmV0b3RhbCAtMTAwMCBOYU4gICAgLT4gIC0xCitkcWNvdDgzMiBjb21wYXJldG90YWwgLTEgICAgTmFOICAgIC0+ICAtMQorZHFjb3Q4MzMgY29tcGFyZXRvdGFsIC0wICAgIE5hTiAgICAtPiAgLTEKK2RxY290ODM0IGNvbXBhcmV0b3RhbCAgMCAgICBOYU4gICAgLT4gIC0xCitkcWNvdDgzNSBjb21wYXJldG90YWwgIDEgICAgTmFOICAgIC0+ICAtMQorZHFjb3Q4MzYgY29tcGFyZXRvdGFsICAxMDAwIE5hTiAgICAtPiAgLTEKK2RxY290ODM3IGNvbXBhcmV0b3RhbCAgSW5mICBOYU4gICAgLT4gIC0xCitkcWNvdDgzOCBjb21wYXJldG90YWwgLU5hTiAtTmFOICAgIC0+ICAwCitkcWNvdDgzOSBjb21wYXJldG90YWwgK05hTiAtTmFOICAgIC0+ICAxCitkcWNvdDg0MCBjb21wYXJldG90YWwgLU5hTiArTmFOICAgIC0+ICAtMQorCitkcWNvdDg0MSBjb21wYXJldG90YWwgIHNOYU4gLXNOYU4gIC0+ICAxCitkcWNvdDg0MiBjb21wYXJldG90YWwgIHNOYU4gLU5hTiAgIC0+ICAxCitkcWNvdDg0MyBjb21wYXJldG90YWwgIHNOYU4gLUluZiAgIC0+ICAxCitkcWNvdDg0NCBjb21wYXJldG90YWwgIHNOYU4gLTEwMDAgIC0+ICAxCitkcWNvdDg0NSBjb21wYXJldG90YWwgIHNOYU4gLTEgICAgIC0+ICAxCitkcWNvdDg0NiBjb21wYXJldG90YWwgIHNOYU4gLTAgICAgIC0+ICAxCitkcWNvdDg0NyBjb21wYXJldG90YWwgIHNOYU4gIDAgICAgIC0+ICAxCitkcWNvdDg0OCBjb21wYXJldG90YWwgIHNOYU4gIDEgICAgIC0+ICAxCitkcWNvdDg0OSBjb21wYXJldG90YWwgIHNOYU4gIDEwMDAgIC0+ICAxCitkcWNvdDg1MCBjb21wYXJldG90YWwgIHNOYU4gIE5hTiAgIC0+ICAtMQorZHFjb3Q4NTEgY29tcGFyZXRvdGFsICBzTmFOIHNOYU4gICAtPiAgMAorCitkcWNvdDg1MiBjb21wYXJldG90YWwgLXNOYU4gc05hTiAgIC0+ICAtMQorZHFjb3Q4NTMgY29tcGFyZXRvdGFsIC1OYU4gIHNOYU4gICAtPiAgLTEKK2RxY290ODU0IGNvbXBhcmV0b3RhbCAtSW5mICBzTmFOICAgLT4gIC0xCitkcWNvdDg1NSBjb21wYXJldG90YWwgLTEwMDAgc05hTiAgIC0+ICAtMQorZHFjb3Q4NTYgY29tcGFyZXRvdGFsIC0xICAgIHNOYU4gICAtPiAgLTEKK2RxY290ODU3IGNvbXBhcmV0b3RhbCAtMCAgICBzTmFOICAgLT4gIC0xCitkcWNvdDg1OCBjb21wYXJldG90YWwgIDAgICAgc05hTiAgIC0+ICAtMQorZHFjb3Q4NTkgY29tcGFyZXRvdGFsICAxICAgIHNOYU4gICAtPiAgLTEKK2RxY290ODYwIGNvbXBhcmV0b3RhbCAgMTAwMCBzTmFOICAgLT4gIC0xCitkcWNvdDg2MSBjb21wYXJldG90YWwgIEluZiAgc05hTiAgIC0+ICAtMQorZHFjb3Q4NjIgY29tcGFyZXRvdGFsICBOYU4gIHNOYU4gICAtPiAgMQorZHFjb3Q4NjMgY29tcGFyZXRvdGFsICBzTmFOIHNOYU4gICAtPiAgMAorCitkcWNvdDg3MSBjb21wYXJldG90YWwgIC1zTmFOIC1zTmFOICAtPiAgMAorZHFjb3Q4NzIgY29tcGFyZXRvdGFsICAtc05hTiAtTmFOICAgLT4gIDEKK2RxY290ODczIGNvbXBhcmV0b3RhbCAgLXNOYU4gLUluZiAgIC0+ICAtMQorZHFjb3Q4NzQgY29tcGFyZXRvdGFsICAtc05hTiAtMTAwMCAgLT4gIC0xCitkcWNvdDg3NSBjb21wYXJldG90YWwgIC1zTmFOIC0xICAgICAtPiAgLTEKK2RxY290ODc2IGNvbXBhcmV0b3RhbCAgLXNOYU4gLTAgICAgIC0+ICAtMQorZHFjb3Q4NzcgY29tcGFyZXRvdGFsICAtc05hTiAgMCAgICAgLT4gIC0xCitkcWNvdDg3OCBjb21wYXJldG90YWwgIC1zTmFOICAxICAgICAtPiAgLTEKK2RxY290ODc5IGNvbXBhcmV0b3RhbCAgLXNOYU4gIDEwMDAgIC0+ICAtMQorZHFjb3Q4ODAgY29tcGFyZXRvdGFsICAtc05hTiAgTmFOICAgLT4gIC0xCitkcWNvdDg4MSBjb21wYXJldG90YWwgIC1zTmFOIHNOYU4gICAtPiAgLTEKKworZHFjb3Q4ODIgY29tcGFyZXRvdGFsIC1zTmFOIC1zTmFOICAgLT4gIDAKK2RxY290ODgzIGNvbXBhcmV0b3RhbCAtTmFOICAtc05hTiAgIC0+ICAtMQorZHFjb3Q4ODQgY29tcGFyZXRvdGFsIC1JbmYgIC1zTmFOICAgLT4gIDEKK2RxY290ODg1IGNvbXBhcmV0b3RhbCAtMTAwMCAtc05hTiAgIC0+ICAxCitkcWNvdDg4NiBjb21wYXJldG90YWwgLTEgICAgLXNOYU4gICAtPiAgMQorZHFjb3Q4ODcgY29tcGFyZXRvdGFsIC0wICAgIC1zTmFOICAgLT4gIDEKK2RxY290ODg4IGNvbXBhcmV0b3RhbCAgMCAgICAtc05hTiAgIC0+ICAxCitkcWNvdDg4OSBjb21wYXJldG90YWwgIDEgICAgLXNOYU4gICAtPiAgMQorZHFjb3Q4OTAgY29tcGFyZXRvdGFsICAxMDAwIC1zTmFOICAgLT4gIDEKK2RxY290ODkxIGNvbXBhcmV0b3RhbCAgSW5mICAtc05hTiAgIC0+ICAxCitkcWNvdDg5MiBjb21wYXJldG90YWwgIE5hTiAgLXNOYU4gICAtPiAgMQorZHFjb3Q4OTMgY29tcGFyZXRvdGFsICBzTmFOIC1zTmFOICAgLT4gIDEKKworLS0gTmFOcyB3aXRoIHBheWxvYWQKK2RxY290OTYwIGNvbXBhcmV0b3RhbCAgTmFOOSAtSW5mICAgLT4gIDEKK2RxY290OTYxIGNvbXBhcmV0b3RhbCAgTmFOOCAgOTk5ICAgLT4gIDEKK2RxY290OTYyIGNvbXBhcmV0b3RhbCAgTmFONzcgSW5mICAgLT4gIDEKK2RxY290OTYzIGNvbXBhcmV0b3RhbCAtTmFONjcgTmFONSAgLT4gIC0xCitkcWNvdDk2NCBjb21wYXJldG90YWwgLUluZiAgLU5hTjQgIC0+ICAxCitkcWNvdDk2NSBjb21wYXJldG90YWwgLTk5OSAgLU5hTjMzIC0+ICAxCitkcWNvdDk2NiBjb21wYXJldG90YWwgIEluZiAgIE5hTjIgIC0+ICAtMQorCitkcWNvdDk3MCBjb21wYXJldG90YWwgLU5hTjQxIC1OYU40MiAtPiAxCitkcWNvdDk3MSBjb21wYXJldG90YWwgK05hTjQxIC1OYU40MiAtPiAxCitkcWNvdDk3MiBjb21wYXJldG90YWwgLU5hTjQxICtOYU40MiAtPiAtMQorZHFjb3Q5NzMgY29tcGFyZXRvdGFsICtOYU40MSArTmFONDIgLT4gLTEKK2RxY290OTc0IGNvbXBhcmV0b3RhbCAtTmFONDIgLU5hTjAxIC0+IC0xCitkcWNvdDk3NSBjb21wYXJldG90YWwgK05hTjQyIC1OYU4wMSAtPiAgMQorZHFjb3Q5NzYgY29tcGFyZXRvdGFsIC1OYU40MiArTmFOMDEgLT4gLTEKK2RxY290OTc3IGNvbXBhcmV0b3RhbCArTmFONDIgK05hTjAxIC0+ICAxCisKK2RxY290OTgwIGNvbXBhcmV0b3RhbCAtc05hTjc3MSAtc05hTjc3MiAtPiAxCitkcWNvdDk4MSBjb21wYXJldG90YWwgK3NOYU43NzEgLXNOYU43NzIgLT4gMQorZHFjb3Q5ODIgY29tcGFyZXRvdGFsIC1zTmFONzcxICtzTmFONzcyIC0+IC0xCitkcWNvdDk4MyBjb21wYXJldG90YWwgK3NOYU43NzEgK3NOYU43NzIgLT4gLTEKK2RxY290OTg0IGNvbXBhcmV0b3RhbCAtc05hTjc3MiAtc05hTjc3MSAtPiAtMQorZHFjb3Q5ODUgY29tcGFyZXRvdGFsICtzTmFONzcyIC1zTmFONzcxIC0+ICAxCitkcWNvdDk4NiBjb21wYXJldG90YWwgLXNOYU43NzIgK3NOYU43NzEgLT4gLTEKK2RxY290OTg3IGNvbXBhcmV0b3RhbCArc05hTjc3MiArc05hTjc3MSAtPiAgMQorCitkcWNvdDk5MSBjb21wYXJldG90YWwgLXNOYU45OSAtSW5mICAgIC0+IC0xCitkcWNvdDk5MiBjb21wYXJldG90YWwgIHNOYU45OCAtMTEgICAgIC0+ICAxCitkcWNvdDk5MyBjb21wYXJldG90YWwgIHNOYU45NyAgTmFOICAgIC0+IC0xCitkcWNvdDk5NCBjb21wYXJldG90YWwgIHNOYU4xNiBzTmFOOTQgIC0+IC0xCitkcWNvdDk5NSBjb21wYXJldG90YWwgIE5hTjg1ICBzTmFOODMgIC0+ICAxCitkcWNvdDk5NiBjb21wYXJldG90YWwgLUluZiAgICBzTmFOOTIgIC0+IC0xCitkcWNvdDk5NyBjb21wYXJldG90YWwgIDA4OCAgICBzTmFOODEgIC0+IC0xCitkcWNvdDk5OCBjb21wYXJldG90YWwgIEluZiAgICBzTmFOOTAgIC0+IC0xCitkcWNvdDk5OSBjb21wYXJldG90YWwgIE5hTiAgIC1zTmFOODkgIC0+ICAxCisKKy0tIHNwcmVhZCB6ZXJvcworZHFjb3QxMTEwIGNvbXBhcmV0b3RhbCAgIDBFLTYxNDMgIDAgICAgICAgLT4gLTEKK2RxY290MTExMSBjb21wYXJldG90YWwgICAwRS02MTQzIC0wICAgICAgIC0+ICAxCitkcWNvdDExMTIgY29tcGFyZXRvdGFsICAtMEUtNjE0MyAgMCAgICAgICAtPiAtMQorZHFjb3QxMTEzIGNvbXBhcmV0b3RhbCAgLTBFLTYxNDMgLTAgICAgICAgLT4gIDEKK2RxY290MTExNCBjb21wYXJldG90YWwgICAwRS02MTQzICAwRSs2MTQ0ICAtPiAtMQorZHFjb3QxMTE1IGNvbXBhcmV0b3RhbCAgIDBFLTYxNDMgLTBFKzYxNDQgIC0+ICAxCitkcWNvdDExMTYgY29tcGFyZXRvdGFsICAtMEUtNjE0MyAgMEUrNjE0NCAgLT4gLTEKK2RxY290MTExNyBjb21wYXJldG90YWwgIC0wRS02MTQzIC0wRSs2MTQ0ICAtPiAgMQorZHFjb3QxMTE4IGNvbXBhcmV0b3RhbCAgIDAgICAgICAgMEUrNjE0NCAgLT4gLTEKK2RxY290MTExOSBjb21wYXJldG90YWwgICAwICAgICAgLTBFKzYxNDQgIC0+ICAxCitkcWNvdDExMjAgY29tcGFyZXRvdGFsICAtMCAgICAgICAwRSs2MTQ0ICAtPiAtMQorZHFjb3QxMTIxIGNvbXBhcmV0b3RhbCAgLTAgICAgICAtMEUrNjE0NCAgLT4gIDEKKworZHFjb3QxMTMwIGNvbXBhcmV0b3RhbCAgIDBFKzYxNDQgIDAgICAgICAgLT4gIDEKK2RxY290MTEzMSBjb21wYXJldG90YWwgICAwRSs2MTQ0IC0wICAgICAgIC0+ICAxCitkcWNvdDExMzIgY29tcGFyZXRvdGFsICAtMEUrNjE0NCAgMCAgICAgICAtPiAtMQorZHFjb3QxMTMzIGNvbXBhcmV0b3RhbCAgLTBFKzYxNDQgLTAgICAgICAgLT4gLTEKK2RxY290MTEzNCBjb21wYXJldG90YWwgICAwRSs2MTQ0ICAwRS02MTQzICAtPiAgMQorZHFjb3QxMTM1IGNvbXBhcmV0b3RhbCAgIDBFKzYxNDQgLTBFLTYxNDMgIC0+ICAxCitkcWNvdDExMzYgY29tcGFyZXRvdGFsICAtMEUrNjE0NCAgMEUtNjE0MyAgLT4gLTEKK2RxY290MTEzNyBjb21wYXJldG90YWwgIC0wRSs2MTQ0IC0wRS02MTQzICAtPiAtMQorZHFjb3QxMTM4IGNvbXBhcmV0b3RhbCAgIDAgICAgICAgMEUtNjE0MyAgLT4gIDEKK2RxY290MTEzOSBjb21wYXJldG90YWwgICAwICAgICAgLTBFLTYxNDMgIC0+ICAxCitkcWNvdDExNDAgY29tcGFyZXRvdGFsICAtMCAgICAgICAwRS02MTQzICAtPiAtMQorZHFjb3QxMTQxIGNvbXBhcmV0b3RhbCAgLTAgICAgICAtMEUtNjE0MyAgLT4gLTEKKworLS0gTnVsbCB0ZXN0cworZHFjb3Q5OTkwIGNvbXBhcmV0b3RhbCAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxY290OTk5MSBjb21wYXJldG90YWwgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29tcGFyZVRvdGFsTWFnLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29tcGFyZVRvdGFsTWFnLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI4MWJmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb21wYXJlVG90YWxNYWcuZGVjVGVzdApAQCAtMCwwICsxLDcwNiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcUNvbXBhcmVUb3RhbE1hZy5kZWNUZXN0IC0tIGRlY1F1YWQgY29tcGFyaXNvbjsgYWJzLiB0b3RhbCBvcmRlciAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIE5vdGUgdGhhdCB3ZSBjYW5ub3QgYXNzdW1lIGFkZC9zdWJ0cmFjdCB0ZXN0cyBjb3ZlciBwYXRocyBhZGVxdWF0ZWx5LAorLS0gaGVyZSwgYmVjYXVzZSB0aGUgY29kZSBtaWdodCBiZSBxdWl0ZSBkaWZmZXJlbnQgKGNvbXBhcmlzb24gY2Fubm90CistLSBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHNvIGFjdHVhbCBzdWJ0cmFjdGlvbnMgYXJlIG5vdCBuZWNlc3NhcnkpLgorLS0gU2ltaWxhcmx5LCBjb21wYXJldG90YWwgd2lsbCBoYXZlIHNvbWUgcmFkaWNhbGx5IGRpZmZlcmVudCBwYXRocworLS0gdGhhbiBjb21wYXJlLgorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY1F1YWRzLgorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZHFjdG0wMDEgY29tcGFyZXRvdG1hZyAgLTIgIC0yICAgLT4gICAwCitkcWN0bTAwMiBjb21wYXJldG90bWFnICAtMiAgLTEgICAtPiAgIDEKK2RxY3RtMDAzIGNvbXBhcmV0b3RtYWcgIC0yICAgMCAgIC0+ICAgMQorZHFjdG0wMDQgY29tcGFyZXRvdG1hZyAgLTIgICAxICAgLT4gICAxCitkcWN0bTAwNSBjb21wYXJldG90bWFnICAtMiAgIDIgICAtPiAgIDAKK2RxY3RtMDA2IGNvbXBhcmV0b3RtYWcgIC0xICAtMiAgIC0+ICAtMQorZHFjdG0wMDcgY29tcGFyZXRvdG1hZyAgLTEgIC0xICAgLT4gICAwCitkcWN0bTAwOCBjb21wYXJldG90bWFnICAtMSAgIDAgICAtPiAgIDEKK2RxY3RtMDA5IGNvbXBhcmV0b3RtYWcgIC0xICAgMSAgIC0+ICAgMAorZHFjdG0wMTAgY29tcGFyZXRvdG1hZyAgLTEgICAyICAgLT4gIC0xCitkcWN0bTAxMSBjb21wYXJldG90bWFnICAgMCAgLTIgICAtPiAgLTEKK2RxY3RtMDEyIGNvbXBhcmV0b3RtYWcgICAwICAtMSAgIC0+ICAtMQorZHFjdG0wMTMgY29tcGFyZXRvdG1hZyAgIDAgICAwICAgLT4gICAwCitkcWN0bTAxNCBjb21wYXJldG90bWFnICAgMCAgIDEgICAtPiAgLTEKK2RxY3RtMDE1IGNvbXBhcmV0b3RtYWcgICAwICAgMiAgIC0+ICAtMQorZHFjdG0wMTYgY29tcGFyZXRvdG1hZyAgIDEgIC0yICAgLT4gIC0xCitkcWN0bTAxNyBjb21wYXJldG90bWFnICAgMSAgLTEgICAtPiAgIDAKK2RxY3RtMDE4IGNvbXBhcmV0b3RtYWcgICAxICAgMCAgIC0+ICAgMQorZHFjdG0wMTkgY29tcGFyZXRvdG1hZyAgIDEgICAxICAgLT4gICAwCitkcWN0bTAyMCBjb21wYXJldG90bWFnICAgMSAgIDIgICAtPiAgLTEKK2RxY3RtMDIxIGNvbXBhcmV0b3RtYWcgICAyICAtMiAgIC0+ICAgMAorZHFjdG0wMjIgY29tcGFyZXRvdG1hZyAgIDIgIC0xICAgLT4gICAxCitkcWN0bTAyMyBjb21wYXJldG90bWFnICAgMiAgIDAgICAtPiAgIDEKK2RxY3RtMDI1IGNvbXBhcmV0b3RtYWcgICAyICAgMSAgIC0+ICAgMQorZHFjdG0wMjYgY29tcGFyZXRvdG1hZyAgIDIgICAyICAgLT4gICAwCisKK2RxY3RtMDMxIGNvbXBhcmV0b3RtYWcgIC0yMCAgLTIwICAgLT4gICAwCitkcWN0bTAzMiBjb21wYXJldG90bWFnICAtMjAgIC0xMCAgIC0+ICAgMQorZHFjdG0wMzMgY29tcGFyZXRvdG1hZyAgLTIwICAgMDAgICAtPiAgIDEKK2RxY3RtMDM0IGNvbXBhcmV0b3RtYWcgIC0yMCAgIDEwICAgLT4gICAxCitkcWN0bTAzNSBjb21wYXJldG90bWFnICAtMjAgICAyMCAgIC0+ICAgMAorZHFjdG0wMzYgY29tcGFyZXRvdG1hZyAgLTEwICAtMjAgICAtPiAgLTEKK2RxY3RtMDM3IGNvbXBhcmV0b3RtYWcgIC0xMCAgLTEwICAgLT4gICAwCitkcWN0bTAzOCBjb21wYXJldG90bWFnICAtMTAgICAwMCAgIC0+ICAgMQorZHFjdG0wMzkgY29tcGFyZXRvdG1hZyAgLTEwICAgMTAgICAtPiAgIDAKK2RxY3RtMDQwIGNvbXBhcmV0b3RtYWcgIC0xMCAgIDIwICAgLT4gIC0xCitkcWN0bTA0MSBjb21wYXJldG90bWFnICAgMDAgIC0yMCAgIC0+ICAtMQorZHFjdG0wNDIgY29tcGFyZXRvdG1hZyAgIDAwICAtMTAgICAtPiAgLTEKK2RxY3RtMDQzIGNvbXBhcmV0b3RtYWcgICAwMCAgIDAwICAgLT4gICAwCitkcWN0bTA0NCBjb21wYXJldG90bWFnICAgMDAgICAxMCAgIC0+ICAtMQorZHFjdG0wNDUgY29tcGFyZXRvdG1hZyAgIDAwICAgMjAgICAtPiAgLTEKK2RxY3RtMDQ2IGNvbXBhcmV0b3RtYWcgICAxMCAgLTIwICAgLT4gIC0xCitkcWN0bTA0NyBjb21wYXJldG90bWFnICAgMTAgIC0xMCAgIC0+ICAgMAorZHFjdG0wNDggY29tcGFyZXRvdG1hZyAgIDEwICAgMDAgICAtPiAgIDEKK2RxY3RtMDQ5IGNvbXBhcmV0b3RtYWcgICAxMCAgIDEwICAgLT4gICAwCitkcWN0bTA1MCBjb21wYXJldG90bWFnICAgMTAgICAyMCAgIC0+ICAtMQorZHFjdG0wNTEgY29tcGFyZXRvdG1hZyAgIDIwICAtMjAgICAtPiAgIDAKK2RxY3RtMDUyIGNvbXBhcmV0b3RtYWcgICAyMCAgLTEwICAgLT4gICAxCitkcWN0bTA1MyBjb21wYXJldG90bWFnICAgMjAgICAwMCAgIC0+ICAgMQorZHFjdG0wNTUgY29tcGFyZXRvdG1hZyAgIDIwICAgMTAgICAtPiAgIDEKK2RxY3RtMDU2IGNvbXBhcmV0b3RtYWcgICAyMCAgIDIwICAgLT4gICAwCisKK2RxY3RtMDYxIGNvbXBhcmV0b3RtYWcgIC0yLjAgIC0yLjAgICAtPiAgIDAKK2RxY3RtMDYyIGNvbXBhcmV0b3RtYWcgIC0yLjAgIC0xLjAgICAtPiAgIDEKK2RxY3RtMDYzIGNvbXBhcmV0b3RtYWcgIC0yLjAgICAwLjAgICAtPiAgIDEKK2RxY3RtMDY0IGNvbXBhcmV0b3RtYWcgIC0yLjAgICAxLjAgICAtPiAgIDEKK2RxY3RtMDY1IGNvbXBhcmV0b3RtYWcgIC0yLjAgICAyLjAgICAtPiAgIDAKK2RxY3RtMDY2IGNvbXBhcmV0b3RtYWcgIC0xLjAgIC0yLjAgICAtPiAgLTEKK2RxY3RtMDY3IGNvbXBhcmV0b3RtYWcgIC0xLjAgIC0xLjAgICAtPiAgIDAKK2RxY3RtMDY4IGNvbXBhcmV0b3RtYWcgIC0xLjAgICAwLjAgICAtPiAgIDEKK2RxY3RtMDY5IGNvbXBhcmV0b3RtYWcgIC0xLjAgICAxLjAgICAtPiAgIDAKK2RxY3RtMDcwIGNvbXBhcmV0b3RtYWcgIC0xLjAgICAyLjAgICAtPiAgLTEKK2RxY3RtMDcxIGNvbXBhcmV0b3RtYWcgICAwLjAgIC0yLjAgICAtPiAgLTEKK2RxY3RtMDcyIGNvbXBhcmV0b3RtYWcgICAwLjAgIC0xLjAgICAtPiAgLTEKK2RxY3RtMDczIGNvbXBhcmV0b3RtYWcgICAwLjAgICAwLjAgICAtPiAgIDAKK2RxY3RtMDc0IGNvbXBhcmV0b3RtYWcgICAwLjAgICAxLjAgICAtPiAgLTEKK2RxY3RtMDc1IGNvbXBhcmV0b3RtYWcgICAwLjAgICAyLjAgICAtPiAgLTEKK2RxY3RtMDc2IGNvbXBhcmV0b3RtYWcgICAxLjAgIC0yLjAgICAtPiAgLTEKK2RxY3RtMDc3IGNvbXBhcmV0b3RtYWcgICAxLjAgIC0xLjAgICAtPiAgIDAKK2RxY3RtMDc4IGNvbXBhcmV0b3RtYWcgICAxLjAgICAwLjAgICAtPiAgIDEKK2RxY3RtMDc5IGNvbXBhcmV0b3RtYWcgICAxLjAgICAxLjAgICAtPiAgIDAKK2RxY3RtMDgwIGNvbXBhcmV0b3RtYWcgICAxLjAgICAyLjAgICAtPiAgLTEKK2RxY3RtMDgxIGNvbXBhcmV0b3RtYWcgICAyLjAgIC0yLjAgICAtPiAgIDAKK2RxY3RtMDgyIGNvbXBhcmV0b3RtYWcgICAyLjAgIC0xLjAgICAtPiAgIDEKK2RxY3RtMDgzIGNvbXBhcmV0b3RtYWcgICAyLjAgICAwLjAgICAtPiAgIDEKK2RxY3RtMDg1IGNvbXBhcmV0b3RtYWcgICAyLjAgICAxLjAgICAtPiAgIDEKK2RxY3RtMDg2IGNvbXBhcmV0b3RtYWcgICAyLjAgICAyLjAgICAtPiAgIDAKKworLS0gbm93IHNvbWUgY2FzZXMgd2hpY2ggbWlnaHQgb3ZlcmZsb3cgaWYgc3VidHJhY3Qgd2VyZSB1c2VkCitkcWN0bTA5MCBjb21wYXJldG90bWFnICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAtPiAgIDAKK2RxY3RtMDkxIGNvbXBhcmV0b3RtYWcgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC0+ICAgMAorZHFjdG0wOTIgY29tcGFyZXRvdG1hZyAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gICAwCitkcWN0bTA5MyBjb21wYXJldG90bWFnIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAgIDAKKworLS0gc29tZSBkaWZmZXJpbmcgbGVuZ3RoL2V4cG9uZW50IGNhc2VzCistLSBpbiB0aGlzIGZpcnN0IGdyb3VwLCBjb21wYXJlIHdvdWxkIGNvbXBhcmUgYWxsIGVxdWFsCitkcWN0bTEwMCBjb21wYXJldG90bWFnICAgNy4wICAgIDcuMCAgICAgLT4gICAwCitkcWN0bTEwMSBjb21wYXJldG90bWFnICAgNy4wICAgIDcgICAgICAgLT4gIC0xCitkcWN0bTEwMiBjb21wYXJldG90bWFnICAgNyAgICAgIDcuMCAgICAgLT4gICAxCitkcWN0bTEwMyBjb21wYXJldG90bWFnICAgN0UrMCAgIDcuMCAgICAgLT4gICAxCitkcWN0bTEwNCBjb21wYXJldG90bWFnICAgNzBFLTEgIDcuMCAgICAgLT4gICAwCitkcWN0bTEwNSBjb21wYXJldG90bWFnICAgMC43RSsxIDcgICAgICAgLT4gICAwCitkcWN0bTEwNiBjb21wYXJldG90bWFnICAgNzBFLTEgIDcgICAgICAgLT4gIC0xCitkcWN0bTEwNyBjb21wYXJldG90bWFnICAgNy4wICAgIDdFKzAgICAgLT4gIC0xCitkcWN0bTEwOCBjb21wYXJldG90bWFnICAgNy4wICAgIDcwRS0xICAgLT4gICAwCitkcWN0bTEwOSBjb21wYXJldG90bWFnICAgNyAgICAgIDAuN0UrMSAgLT4gICAwCitkcWN0bTExMCBjb21wYXJldG90bWFnICAgNyAgICAgIDcwRS0xICAgLT4gICAxCisKK2RxY3RtMTIwIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgNy4wICAgICAtPiAgIDEKK2RxY3RtMTIxIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgNyAgICAgICAtPiAgIDEKK2RxY3RtMTIyIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgNy4wICAgICAtPiAgIDEKK2RxY3RtMTIzIGNvbXBhcmV0b3RtYWcgICA4RSswICAgNy4wICAgICAtPiAgIDEKK2RxY3RtMTI0IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgNy4wICAgICAtPiAgIDEKK2RxY3RtMTI1IGNvbXBhcmV0b3RtYWcgICAwLjhFKzEgNyAgICAgICAtPiAgIDEKK2RxY3RtMTI2IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgNyAgICAgICAtPiAgIDEKK2RxY3RtMTI3IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgN0UrMCAgICAtPiAgIDEKK2RxY3RtMTI4IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgNzBFLTEgICAtPiAgIDEKK2RxY3RtMTI5IGNvbXBhcmV0b3RtYWcgICA4ICAgICAgMC43RSsxICAgLT4gICAxCitkcWN0bTEzMCBjb21wYXJldG90bWFnICAgOCAgICAgIDcwRS0xICAgLT4gICAxCisKK2RxY3RtMTQwIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgOS4wICAgICAtPiAgLTEKK2RxY3RtMTQxIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgOSAgICAgICAtPiAgLTEKK2RxY3RtMTQyIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgOS4wICAgICAtPiAgLTEKK2RxY3RtMTQzIGNvbXBhcmV0b3RtYWcgICA4RSswICAgOS4wICAgICAtPiAgLTEKK2RxY3RtMTQ0IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgOS4wICAgICAtPiAgLTEKK2RxY3RtMTQ1IGNvbXBhcmV0b3RtYWcgICAwLjhFKzEgOSAgICAgICAtPiAgLTEKK2RxY3RtMTQ2IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgOSAgICAgICAtPiAgLTEKK2RxY3RtMTQ3IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgOUUrMCAgICAtPiAgLTEKK2RxY3RtMTQ4IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgOTBFLTEgICAtPiAgLTEKK2RxY3RtMTQ5IGNvbXBhcmV0b3RtYWcgICA4ICAgICAgMC45RSsxICAtPiAgLTEKK2RxY3RtMTUwIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgOTBFLTEgICAtPiAgLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyAtKyAuLgorZHFjdG0yMDAgY29tcGFyZXRvdG1hZyAgLTcuMCAgICA3LjAgICAgIC0+ICAgMAorZHFjdG0yMDEgY29tcGFyZXRvdG1hZyAgLTcuMCAgICA3ICAgICAgIC0+ICAtMQorZHFjdG0yMDIgY29tcGFyZXRvdG1hZyAgLTcgICAgICA3LjAgICAgIC0+ICAgMQorZHFjdG0yMDMgY29tcGFyZXRvdG1hZyAgLTdFKzAgICA3LjAgICAgIC0+ICAgMQorZHFjdG0yMDQgY29tcGFyZXRvdG1hZyAgLTcwRS0xICA3LjAgICAgIC0+ICAgMAorZHFjdG0yMDUgY29tcGFyZXRvdG1hZyAgLTAuN0UrMSA3ICAgICAgIC0+ICAgMAorZHFjdG0yMDYgY29tcGFyZXRvdG1hZyAgLTcwRS0xICA3ICAgICAgIC0+ICAtMQorZHFjdG0yMDcgY29tcGFyZXRvdG1hZyAgLTcuMCAgICA3RSswICAgIC0+ICAtMQorZHFjdG0yMDggY29tcGFyZXRvdG1hZyAgLTcuMCAgICA3MEUtMSAgIC0+ICAgMAorZHFjdG0yMDkgY29tcGFyZXRvdG1hZyAgLTcgICAgICAwLjdFKzEgIC0+ICAgMAorZHFjdG0yMTAgY29tcGFyZXRvdG1hZyAgLTcgICAgICA3MEUtMSAgIC0+ICAgMQorCitkcWN0bTIyMCBjb21wYXJldG90bWFnICAtOC4wICAgIDcuMCAgICAgLT4gICAxCitkcWN0bTIyMSBjb21wYXJldG90bWFnICAtOC4wICAgIDcgICAgICAgLT4gICAxCitkcWN0bTIyMiBjb21wYXJldG90bWFnICAtOCAgICAgIDcuMCAgICAgLT4gICAxCitkcWN0bTIyMyBjb21wYXJldG90bWFnICAtOEUrMCAgIDcuMCAgICAgLT4gICAxCitkcWN0bTIyNCBjb21wYXJldG90bWFnICAtODBFLTEgIDcuMCAgICAgLT4gICAxCitkcWN0bTIyNSBjb21wYXJldG90bWFnICAtMC44RSsxIDcgICAgICAgLT4gICAxCitkcWN0bTIyNiBjb21wYXJldG90bWFnICAtODBFLTEgIDcgICAgICAgLT4gICAxCitkcWN0bTIyNyBjb21wYXJldG90bWFnICAtOC4wICAgIDdFKzAgICAgLT4gICAxCitkcWN0bTIyOCBjb21wYXJldG90bWFnICAtOC4wICAgIDcwRS0xICAgLT4gICAxCitkcWN0bTIyOSBjb21wYXJldG90bWFnICAtOCAgICAgIDAuN0UrMSAgLT4gICAxCitkcWN0bTIzMCBjb21wYXJldG90bWFnICAtOCAgICAgIDcwRS0xICAgLT4gICAxCisKK2RxY3RtMjQwIGNvbXBhcmV0b3RtYWcgIC04LjAgICAgOS4wICAgICAtPiAgLTEKK2RxY3RtMjQxIGNvbXBhcmV0b3RtYWcgIC04LjAgICAgOSAgICAgICAtPiAgLTEKK2RxY3RtMjQyIGNvbXBhcmV0b3RtYWcgIC04ICAgICAgOS4wICAgICAtPiAgLTEKK2RxY3RtMjQzIGNvbXBhcmV0b3RtYWcgIC04RSswICAgOS4wICAgICAtPiAgLTEKK2RxY3RtMjQ0IGNvbXBhcmV0b3RtYWcgIC04MEUtMSAgOS4wICAgICAtPiAgLTEKK2RxY3RtMjQ1IGNvbXBhcmV0b3RtYWcgIC0wLjhFKzEgOSAgICAgICAtPiAgLTEKK2RxY3RtMjQ2IGNvbXBhcmV0b3RtYWcgIC04MEUtMSAgOSAgICAgICAtPiAgLTEKK2RxY3RtMjQ3IGNvbXBhcmV0b3RtYWcgIC04LjAgICAgOUUrMCAgICAtPiAgLTEKK2RxY3RtMjQ4IGNvbXBhcmV0b3RtYWcgIC04LjAgICAgOTBFLTEgICAtPiAgLTEKK2RxY3RtMjQ5IGNvbXBhcmV0b3RtYWcgIC04ICAgICAgMC45RSsxICAtPiAgLTEKK2RxY3RtMjUwIGNvbXBhcmV0b3RtYWcgIC04ICAgICAgOTBFLTEgICAtPiAgLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyArLSAuLgorZHFjdG0zMDAgY29tcGFyZXRvdG1hZyAgIDcuMCAgICAtNy4wICAgICAtPiAgIDAKK2RxY3RtMzAxIGNvbXBhcmV0b3RtYWcgICA3LjAgICAgLTcgICAgICAgLT4gIC0xCitkcWN0bTMwMiBjb21wYXJldG90bWFnICAgNyAgICAgIC03LjAgICAgIC0+ICAgMQorZHFjdG0zMDMgY29tcGFyZXRvdG1hZyAgIDdFKzAgICAtNy4wICAgICAtPiAgIDEKK2RxY3RtMzA0IGNvbXBhcmV0b3RtYWcgICA3MEUtMSAgLTcuMCAgICAgLT4gICAwCitkcWN0bTMwNSBjb21wYXJldG90bWFnICAgLjdFKzEgIC03ICAgICAgIC0+ICAgMAorZHFjdG0zMDYgY29tcGFyZXRvdG1hZyAgIDcwRS0xICAtNyAgICAgICAtPiAgLTEKK2RxY3RtMzA3IGNvbXBhcmV0b3RtYWcgICA3LjAgICAgLTdFKzAgICAgLT4gIC0xCitkcWN0bTMwOCBjb21wYXJldG90bWFnICAgNy4wICAgIC03MEUtMSAgIC0+ICAgMAorZHFjdG0zMDkgY29tcGFyZXRvdG1hZyAgIDcgICAgICAtLjdFKzEgICAtPiAgIDAKK2RxY3RtMzEwIGNvbXBhcmV0b3RtYWcgICA3ICAgICAgLTcwRS0xICAgLT4gICAxCisKK2RxY3RtMzIwIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTcuMCAgICAgLT4gICAxCitkcWN0bTMyMSBjb21wYXJldG90bWFnICAgOC4wICAgIC03ICAgICAgIC0+ICAgMQorZHFjdG0zMjIgY29tcGFyZXRvdG1hZyAgIDggICAgICAtNy4wICAgICAtPiAgIDEKK2RxY3RtMzIzIGNvbXBhcmV0b3RtYWcgICA4RSswICAgLTcuMCAgICAgLT4gICAxCitkcWN0bTMyNCBjb21wYXJldG90bWFnICAgODBFLTEgIC03LjAgICAgIC0+ICAgMQorZHFjdG0zMjUgY29tcGFyZXRvdG1hZyAgIC44RSsxICAtNyAgICAgICAtPiAgIDEKK2RxY3RtMzI2IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgLTcgICAgICAgLT4gICAxCitkcWN0bTMyNyBjb21wYXJldG90bWFnICAgOC4wICAgIC03RSswICAgIC0+ICAgMQorZHFjdG0zMjggY29tcGFyZXRvdG1hZyAgIDguMCAgICAtNzBFLTEgICAtPiAgIDEKK2RxY3RtMzI5IGNvbXBhcmV0b3RtYWcgICA4ICAgICAgLS43RSsxICAgLT4gICAxCitkcWN0bTMzMCBjb21wYXJldG90bWFnICAgOCAgICAgIC03MEUtMSAgIC0+ICAgMQorCitkcWN0bTM0MCBjb21wYXJldG90bWFnICAgOC4wICAgIC05LjAgICAgIC0+ICAtMQorZHFjdG0zNDEgY29tcGFyZXRvdG1hZyAgIDguMCAgICAtOSAgICAgICAtPiAgLTEKK2RxY3RtMzQyIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgLTkuMCAgICAgLT4gIC0xCitkcWN0bTM0MyBjb21wYXJldG90bWFnICAgOEUrMCAgIC05LjAgICAgIC0+ICAtMQorZHFjdG0zNDQgY29tcGFyZXRvdG1hZyAgIDgwRS0xICAtOS4wICAgICAtPiAgLTEKK2RxY3RtMzQ1IGNvbXBhcmV0b3RtYWcgICAuOEUrMSAgLTkgICAgICAgLT4gIC0xCitkcWN0bTM0NiBjb21wYXJldG90bWFnICAgODBFLTEgIC05ICAgICAgIC0+ICAtMQorZHFjdG0zNDcgY29tcGFyZXRvdG1hZyAgIDguMCAgICAtOUUrMCAgICAtPiAgLTEKK2RxY3RtMzQ4IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTkwRS0xICAgLT4gIC0xCitkcWN0bTM0OSBjb21wYXJldG90bWFnICAgOCAgICAgIC0uOUUrMSAgIC0+ICAtMQorZHFjdG0zNTAgY29tcGFyZXRvdG1hZyAgIDggICAgICAtOTBFLTEgICAtPiAgLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyAtLSAuLgorZHFjdG00MDAgY29tcGFyZXRvdG1hZyAgIC03LjAgICAgLTcuMCAgICAgLT4gICAwCitkcWN0bTQwMSBjb21wYXJldG90bWFnICAgLTcuMCAgICAtNyAgICAgICAtPiAgLTEKK2RxY3RtNDAyIGNvbXBhcmV0b3RtYWcgICAtNyAgICAgIC03LjAgICAgIC0+ICAgMQorZHFjdG00MDMgY29tcGFyZXRvdG1hZyAgIC03RSswICAgLTcuMCAgICAgLT4gICAxCitkcWN0bTQwNCBjb21wYXJldG90bWFnICAgLTcwRS0xICAtNy4wICAgICAtPiAgIDAKK2RxY3RtNDA1IGNvbXBhcmV0b3RtYWcgICAtLjdFKzEgIC03ICAgICAgIC0+ICAgMAorZHFjdG00MDYgY29tcGFyZXRvdG1hZyAgIC03MEUtMSAgLTcgICAgICAgLT4gIC0xCitkcWN0bTQwNyBjb21wYXJldG90bWFnICAgLTcuMCAgICAtN0UrMCAgICAtPiAgLTEKK2RxY3RtNDA4IGNvbXBhcmV0b3RtYWcgICAtNy4wICAgIC03MEUtMSAgIC0+ICAgMAorZHFjdG00MDkgY29tcGFyZXRvdG1hZyAgIC03ICAgICAgLS43RSsxICAgLT4gICAwCitkcWN0bTQxMCBjb21wYXJldG90bWFnICAgLTcgICAgICAtNzBFLTEgICAtPiAgIDEKKworZHFjdG00MjAgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTcuMCAgICAgLT4gICAxCitkcWN0bTQyMSBjb21wYXJldG90bWFnICAgLTguMCAgICAtNyAgICAgICAtPiAgIDEKK2RxY3RtNDIyIGNvbXBhcmV0b3RtYWcgICAtOCAgICAgIC03LjAgICAgIC0+ICAgMQorZHFjdG00MjMgY29tcGFyZXRvdG1hZyAgIC04RSswICAgLTcuMCAgICAgLT4gICAxCitkcWN0bTQyNCBjb21wYXJldG90bWFnICAgLTgwRS0xICAtNy4wICAgICAtPiAgIDEKK2RxY3RtNDI1IGNvbXBhcmV0b3RtYWcgICAtLjhFKzEgIC03ICAgICAgIC0+ICAgMQorZHFjdG00MjYgY29tcGFyZXRvdG1hZyAgIC04MEUtMSAgLTcgICAgICAgLT4gICAxCitkcWN0bTQyNyBjb21wYXJldG90bWFnICAgLTguMCAgICAtN0UrMCAgICAtPiAgIDEKK2RxY3RtNDI4IGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC03MEUtMSAgIC0+ICAgMQorZHFjdG00MjkgY29tcGFyZXRvdG1hZyAgIC04ICAgICAgLS43RSsxICAgLT4gICAxCitkcWN0bTQzMCBjb21wYXJldG90bWFnICAgLTggICAgICAtNzBFLTEgICAtPiAgIDEKKworZHFjdG00NDAgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTkuMCAgICAgLT4gIC0xCitkcWN0bTQ0MSBjb21wYXJldG90bWFnICAgLTguMCAgICAtOSAgICAgICAtPiAgLTEKK2RxY3RtNDQyIGNvbXBhcmV0b3RtYWcgICAtOCAgICAgIC05LjAgICAgIC0+ICAtMQorZHFjdG00NDMgY29tcGFyZXRvdG1hZyAgIC04RSswICAgLTkuMCAgICAgLT4gIC0xCitkcWN0bTQ0NCBjb21wYXJldG90bWFnICAgLTgwRS0xICAtOS4wICAgICAtPiAgLTEKK2RxY3RtNDQ1IGNvbXBhcmV0b3RtYWcgICAtLjhFKzEgIC05ICAgICAgIC0+ICAtMQorZHFjdG00NDYgY29tcGFyZXRvdG1hZyAgIC04MEUtMSAgLTkgICAgICAgLT4gIC0xCitkcWN0bTQ0NyBjb21wYXJldG90bWFnICAgLTguMCAgICAtOUUrMCAgICAtPiAgLTEKK2RxY3RtNDQ4IGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC05MEUtMSAgIC0+ICAtMQorZHFjdG00NDkgY29tcGFyZXRvdG1hZyAgIC04ICAgICAgLS45RSsxICAgLT4gIC0xCitkcWN0bTQ1MCBjb21wYXJldG90bWFnICAgLTggICAgICAtOTBFLTEgICAtPiAgLTEKKworCistLSB0ZXN0Y2FzZXMgdGhhdCBzdWJ0cmFjdCB0byBsb3RzIG9mIHplcm9zIGF0IGJvdW5kYXJpZXMgW3Bncl0KK2RxY3RtNDczIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMDAwMDBFLTg5IDEyMy40NTZFLTg5ICAtPiAgLTEKK2RxY3RtNDc0IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMDAwMEUrODkgMTIzLjQ1NkUrODkgIC0+ICAtMQorZHFjdG00NzUgY29tcGFyZXRvdG1hZyAxMjMuNDU2MDAwMDAwMDBFLTg5IDEyMy40NTZFLTg5ICAtPiAgLTEKK2RxY3RtNDc2IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMDBFKzg5IDEyMy40NTZFKzg5ICAtPiAgLTEKK2RxY3RtNDc3IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMEUtODkgMTIzLjQ1NkUtODkgIC0+ICAtMQorZHFjdG00NzggY29tcGFyZXRvdG1hZyAxMjMuNDU2MDAwMDBFKzg5IDEyMy40NTZFKzg5ICAtPiAgLTEKK2RxY3RtNDc5IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDBFLTg5IDEyMy40NTZFLTg5ICAtPiAgLTEKK2RxY3RtNDgwIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMEUrODkgMTIzLjQ1NkUrODkgIC0+ICAtMQorZHFjdG00ODEgY29tcGFyZXRvdG1hZyAxMjMuNDU2MDBFLTg5IDEyMy40NTZFLTg5ICAtPiAgLTEKK2RxY3RtNDgyIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjBFKzg5IDEyMy40NTZFKzg5ICAtPiAgLTEKK2RxY3RtNDgzIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NkUtODkgIC0+ICAgMAorZHFjdG00ODcgY29tcGFyZXRvdG1hZyAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwMDAwMEUrODkgIC0+ICAgMQorZHFjdG00ODggY29tcGFyZXRvdG1hZyAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMDAwRS04OSAgLT4gICAxCitkcWN0bTQ4OSBjb21wYXJldG90bWFnIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwMDAwMEUrODkgIC0+ICAgMQorZHFjdG00OTAgY29tcGFyZXRvdG1hZyAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMEUtODkgIC0+ICAgMQorZHFjdG00OTEgY29tcGFyZXRvdG1hZyAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwRSs4OSAgLT4gICAxCitkcWN0bTQ5MiBjb21wYXJldG90bWFnIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMEUtODkgIC0+ICAgMQorZHFjdG00OTMgY29tcGFyZXRvdG1hZyAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMEUrODkgIC0+ICAgMQorZHFjdG00OTQgY29tcGFyZXRvdG1hZyAxMjMuNDU2RS04OSAxMjMuNDU2MDAwRS04OSAgLT4gICAxCitkcWN0bTQ5NSBjb21wYXJldG90bWFnIDEyMy40NTZFKzg5IDEyMy40NTYwMEUrODkgIC0+ICAgMQorZHFjdG00OTYgY29tcGFyZXRvdG1hZyAxMjMuNDU2RS04OSAxMjMuNDU2MEUtODkgIC0+ICAgMQorZHFjdG00OTcgY29tcGFyZXRvdG1hZyAxMjMuNDU2RSs4OSAxMjMuNDU2RSs4OSAgLT4gICAwCisKKy0tIHdpZGUtcmFuZ2luZywgYXJvdW5kIHByZWNpc2lvbjsgc2lnbnMgZXF1YWwKK2RxY3RtNDk4IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTcgICAgIC0+ICAgMQorZHFjdG00OTkgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xNiAgICAgLT4gICAxCitkcWN0bTUwMCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTE1ICAgICAtPiAgIDEKK2RxY3RtNTAxIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTQgICAgIC0+ICAgMQorZHFjdG01MDIgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xMyAgICAgLT4gICAxCitkcWN0bTUwMyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTEyICAgICAtPiAgIDEKK2RxY3RtNTA0IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTEgICAgIC0+ICAgMQorZHFjdG01MDUgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xMCAgICAgLT4gICAxCitkcWN0bTUwNiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTkgICAgICAtPiAgIDEKK2RxY3RtNTA3IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtOCAgICAgIC0+ICAgMQorZHFjdG01MDggY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS03ICAgICAgLT4gICAxCitkcWN0bTUwOSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTYgICAgICAtPiAgIDEKK2RxY3RtNTEwIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtNSAgICAgIC0+ICAgMQorZHFjdG01MTEgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS00ICAgICAgLT4gICAxCitkcWN0bTUxMiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTMgICAgICAtPiAgIDEKK2RxY3RtNTEzIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMiAgICAgIC0+ICAgMQorZHFjdG01MTQgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xICAgICAgLT4gICAxCitkcWN0bTUxNSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTAgICAgICAtPiAgIDAKK2RxY3RtNTE2IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMSAgICAgIC0+ICAtMQorZHFjdG01MTcgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsyICAgICAgLT4gIC0xCitkcWN0bTUxOCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzMgICAgICAtPiAgLTEKK2RxY3RtNTE5IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrNCAgICAgIC0+ICAtMQorZHFjdG01MjEgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSs1ICAgICAgLT4gIC0xCitkcWN0bTUyMiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzYgICAgICAtPiAgLTEKK2RxY3RtNTIzIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrNyAgICAgIC0+ICAtMQorZHFjdG01MjQgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSs4ICAgICAgLT4gIC0xCitkcWN0bTUyNSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzkgICAgICAtPiAgLTEKK2RxY3RtNTI2IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTAgICAgIC0+ICAtMQorZHFjdG01MjcgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxMSAgICAgLT4gIC0xCitkcWN0bTUyOCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzEyICAgICAtPiAgLTEKK2RxY3RtNTI5IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTMgICAgIC0+ICAtMQorZHFjdG01MzAgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxNCAgICAgLT4gIC0xCitkcWN0bTUzMSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzE1ICAgICAtPiAgLTEKK2RxY3RtNTMyIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTYgICAgIC0+ICAtMQorZHFjdG01MzMgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxNyAgICAgLT4gIC0xCistLSBMUiBzd2FwCitkcWN0bTUzOCBjb21wYXJldG90bWFnICAgIDFFLTE3ICAxICAgICAgICAtPiAgLTEKK2RxY3RtNTM5IGNvbXBhcmV0b3RtYWcgICAgMUUtMTYgIDEgICAgICAgIC0+ICAtMQorZHFjdG01NDAgY29tcGFyZXRvdG1hZyAgICAxRS0xNSAgMSAgICAgICAgLT4gIC0xCitkcWN0bTU0MSBjb21wYXJldG90bWFnICAgIDFFLTE0ICAxICAgICAgICAtPiAgLTEKK2RxY3RtNTQyIGNvbXBhcmV0b3RtYWcgICAgMUUtMTMgIDEgICAgICAgIC0+ICAtMQorZHFjdG01NDMgY29tcGFyZXRvdG1hZyAgICAxRS0xMiAgMSAgICAgICAgLT4gIC0xCitkcWN0bTU0NCBjb21wYXJldG90bWFnICAgIDFFLTExICAxICAgICAgICAtPiAgLTEKK2RxY3RtNTQ1IGNvbXBhcmV0b3RtYWcgICAgMUUtMTAgIDEgICAgICAgIC0+ICAtMQorZHFjdG01NDYgY29tcGFyZXRvdG1hZyAgICAxRS05ICAgMSAgICAgICAgLT4gIC0xCitkcWN0bTU0NyBjb21wYXJldG90bWFnICAgIDFFLTggICAxICAgICAgICAtPiAgLTEKK2RxY3RtNTQ4IGNvbXBhcmV0b3RtYWcgICAgMUUtNyAgIDEgICAgICAgIC0+ICAtMQorZHFjdG01NDkgY29tcGFyZXRvdG1hZyAgICAxRS02ICAgMSAgICAgICAgLT4gIC0xCitkcWN0bTU1MCBjb21wYXJldG90bWFnICAgIDFFLTUgICAxICAgICAgICAtPiAgLTEKK2RxY3RtNTUxIGNvbXBhcmV0b3RtYWcgICAgMUUtNCAgIDEgICAgICAgIC0+ICAtMQorZHFjdG01NTIgY29tcGFyZXRvdG1hZyAgICAxRS0zICAgMSAgICAgICAgLT4gIC0xCitkcWN0bTU1MyBjb21wYXJldG90bWFnICAgIDFFLTIgICAxICAgICAgICAtPiAgLTEKK2RxY3RtNTU0IGNvbXBhcmV0b3RtYWcgICAgMUUtMSAgIDEgICAgICAgIC0+ICAtMQorZHFjdG01NTUgY29tcGFyZXRvdG1hZyAgICAxRS0wICAgMSAgICAgICAgLT4gICAwCitkcWN0bTU1NiBjb21wYXJldG90bWFnICAgIDFFKzEgICAxICAgICAgICAtPiAgIDEKK2RxY3RtNTU3IGNvbXBhcmV0b3RtYWcgICAgMUUrMiAgIDEgICAgICAgIC0+ICAgMQorZHFjdG01NTggY29tcGFyZXRvdG1hZyAgICAxRSszICAgMSAgICAgICAgLT4gICAxCitkcWN0bTU1OSBjb21wYXJldG90bWFnICAgIDFFKzQgICAxICAgICAgICAtPiAgIDEKK2RxY3RtNTYxIGNvbXBhcmV0b3RtYWcgICAgMUUrNSAgIDEgICAgICAgIC0+ICAgMQorZHFjdG01NjIgY29tcGFyZXRvdG1hZyAgICAxRSs2ICAgMSAgICAgICAgLT4gICAxCitkcWN0bTU2MyBjb21wYXJldG90bWFnICAgIDFFKzcgICAxICAgICAgICAtPiAgIDEKK2RxY3RtNTY0IGNvbXBhcmV0b3RtYWcgICAgMUUrOCAgIDEgICAgICAgIC0+ICAgMQorZHFjdG01NjUgY29tcGFyZXRvdG1hZyAgICAxRSs5ICAgMSAgICAgICAgLT4gICAxCitkcWN0bTU2NiBjb21wYXJldG90bWFnICAgIDFFKzEwICAxICAgICAgICAtPiAgIDEKK2RxY3RtNTY3IGNvbXBhcmV0b3RtYWcgICAgMUUrMTEgIDEgICAgICAgIC0+ICAgMQorZHFjdG01NjggY29tcGFyZXRvdG1hZyAgICAxRSsxMiAgMSAgICAgICAgLT4gICAxCitkcWN0bTU2OSBjb21wYXJldG90bWFnICAgIDFFKzEzICAxICAgICAgICAtPiAgIDEKK2RxY3RtNTcwIGNvbXBhcmV0b3RtYWcgICAgMUUrMTQgIDEgICAgICAgIC0+ICAgMQorZHFjdG01NzEgY29tcGFyZXRvdG1hZyAgICAxRSsxNSAgMSAgICAgICAgLT4gICAxCitkcWN0bTU3MiBjb21wYXJldG90bWFnICAgIDFFKzE2ICAxICAgICAgICAtPiAgIDEKK2RxY3RtNTczIGNvbXBhcmV0b3RtYWcgICAgMUUrMTcgIDEgICAgICAgIC0+ICAgMQorLS0gc2ltaWxhciB3aXRoIGEgdXNlZnVsIGNvZWZmaWNpZW50LCBvbmUgc2lkZSBvbmx5CitkcWN0bTU3OCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTcgICAgIC0+ICAgMQorZHFjdG01NzkgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE2ICAgICAtPiAgIDEKK2RxY3RtNTgwIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNSAgICAgLT4gICAxCitkcWN0bTU4MSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTQgICAgIC0+ICAgMQorZHFjdG01ODIgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEzICAgICAtPiAgIDEKK2RxY3RtNTgzIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMiAgICAgLT4gICAxCitkcWN0bTU4NCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTEgICAgIC0+ICAgMQorZHFjdG01ODUgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEwICAgICAtPiAgIDEKK2RxY3RtNTg2IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS05ICAgICAgLT4gICAxCitkcWN0bTU4NyBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOCAgICAgIC0+ICAgMQorZHFjdG01ODggY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTcgICAgICAtPiAgIDEKK2RxY3RtNTg5IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS02ICAgICAgLT4gIC0xCitkcWN0bTU5MCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNSAgICAgIC0+ICAtMQorZHFjdG01OTEgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTQgICAgICAtPiAgLTEKK2RxY3RtNTkyIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0zICAgICAgLT4gIC0xCitkcWN0bTU5MyBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMiAgICAgIC0+ICAtMQorZHFjdG01OTQgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEgICAgICAtPiAgLTEKK2RxY3RtNTk1IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0wICAgICAgLT4gIC0xCitkcWN0bTU5NiBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMSAgICAgIC0+ICAtMQorZHFjdG01OTcgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzIgICAgICAtPiAgLTEKK2RxY3RtNTk4IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSszICAgICAgLT4gIC0xCitkcWN0bTU5OSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrNCAgICAgIC0+ICAtMQorCistLSBjaGVjayBzb21lIHVuaXQteSB0cmFwcworZHFjdG02MDAgY29tcGFyZXRvdG1hZyAgIDEyICAgICAgICAgICAgMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYwMSBjb21wYXJldG90bWFnICAgMTIuMCAgICAgICAgICAxMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjAyIGNvbXBhcmV0b3RtYWcgICAxMi4wMCAgICAgICAgIDEyLjIzNDUgIC0+ICAtMQorZHFjdG02MDMgY29tcGFyZXRvdG1hZyAgIDEyLjAwMCAgICAgICAgMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYwNCBjb21wYXJldG90bWFnICAgMTIuMDAwMCAgICAgICAxMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjA1IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMCAgICAgIDEyLjIzNDUgIC0+ICAtMQorZHFjdG02MDYgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMCAgICAgMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYwNyBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwMCAgICAxMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjA4IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAwMCAgIDEyLjIzNDUgIC0+ICAtMQorZHFjdG02MDkgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMDAwMCAgMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYxMCBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMiAgICAgICAgICAgICAtPiAgIDEKK2RxY3RtNjExIGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAgICAgICAgICAgIC0+ICAgMQorZHFjdG02MTIgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAgICAgICAgICAgLT4gICAxCitkcWN0bTYxMyBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAgICAgICAgICAtPiAgIDEKK2RxY3RtNjE0IGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMDAgICAgICAgIC0+ICAgMQorZHFjdG02MTUgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwMDAgICAgICAgLT4gICAxCitkcWN0bTYxNiBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAwMDAgICAgICAtPiAgIDEKK2RxY3RtNjE3IGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMDAwMDAgICAgIC0+ICAgMQorZHFjdG02MTggY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwMDAwMDAgICAgLT4gICAxCitkcWN0bTYxOSBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAwMDAwMDAgICAtPiAgIDEKK2RxY3RtNjIwIGNvbXBhcmV0b3RtYWcgIC0xMiAgICAgICAgICAgLTEyLjIzNDUgIC0+ICAtMQorZHFjdG02MjEgY29tcGFyZXRvdG1hZyAgLTEyLjAgICAgICAgICAtMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYyMiBjb21wYXJldG90bWFnICAtMTIuMDAgICAgICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjIzIGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAgICAgICAgLTEyLjIzNDUgIC0+ICAtMQorZHFjdG02MjQgY29tcGFyZXRvdG1hZyAgLTEyLjAwMDAgICAgICAtMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYyNSBjb21wYXJldG90bWFnICAtMTIuMDAwMDAgICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjI2IGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAwMDAgICAgLTEyLjIzNDUgIC0+ICAtMQorZHFjdG02MjcgY29tcGFyZXRvdG1hZyAgLTEyLjAwMDAwMDAgICAtMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYyOCBjb21wYXJldG90bWFnICAtMTIuMDAwMDAwMDAgIC0xMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjI5IGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAwMDAwMDAgLTEyLjIzNDUgIC0+ICAtMQorZHFjdG02MzAgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyICAgICAgICAgICAgLT4gICAxCitkcWN0bTYzMSBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMCAgICAgICAgICAtPiAgIDEKK2RxY3RtNjMyIGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMCAgICAgICAgIC0+ICAgMQorZHFjdG02MzMgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMCAgICAgICAgLT4gICAxCitkcWN0bTYzNCBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwMCAgICAgICAtPiAgIDEKK2RxY3RtNjM1IGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAwMCAgICAgIC0+ICAgMQorZHFjdG02MzYgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMDAwMCAgICAgLT4gICAxCitkcWN0bTYzNyBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwMDAwMCAgICAtPiAgIDEKK2RxY3RtNjM4IGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMCAgIC0+ICAgMQorZHFjdG02MzkgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwMCAgLT4gICAxCisKKy0tIGV4dGVuZGVkIHplcm9zCitkcWN0bTY0MCBjb21wYXJldG90bWFnICAgMCAgICAgMCAgICAtPiAgIDAKK2RxY3RtNjQxIGNvbXBhcmV0b3RtYWcgICAwICAgIC0wICAgIC0+ICAgMAorZHFjdG02NDIgY29tcGFyZXRvdG1hZyAgIDAgICAgLTAuMCAgLT4gICAxCitkcWN0bTY0MyBjb21wYXJldG90bWFnICAgMCAgICAgMC4wICAtPiAgIDEKK2RxY3RtNjQ0IGNvbXBhcmV0b3RtYWcgIC0wICAgICAwICAgIC0+ICAgMAorZHFjdG02NDUgY29tcGFyZXRvdG1hZyAgLTAgICAgLTAgICAgLT4gICAwCitkcWN0bTY0NiBjb21wYXJldG90bWFnICAtMCAgICAtMC4wICAtPiAgIDEKK2RxY3RtNjQ3IGNvbXBhcmV0b3RtYWcgIC0wICAgICAwLjAgIC0+ICAgMQorZHFjdG02NDggY29tcGFyZXRvdG1hZyAgIDAuMCAgIDAgICAgLT4gIC0xCitkcWN0bTY0OSBjb21wYXJldG90bWFnICAgMC4wICAtMCAgICAtPiAgLTEKK2RxY3RtNjUwIGNvbXBhcmV0b3RtYWcgICAwLjAgIC0wLjAgIC0+ICAgMAorZHFjdG02NTEgY29tcGFyZXRvdG1hZyAgIDAuMCAgIDAuMCAgLT4gICAwCitkcWN0bTY1MiBjb21wYXJldG90bWFnICAtMC4wICAgMCAgICAtPiAgLTEKK2RxY3RtNjUzIGNvbXBhcmV0b3RtYWcgIC0wLjAgIC0wICAgIC0+ICAtMQorZHFjdG02NTQgY29tcGFyZXRvdG1hZyAgLTAuMCAgLTAuMCAgLT4gICAwCitkcWN0bTY1NSBjb21wYXJldG90bWFnICAtMC4wICAgMC4wICAtPiAgIDAKKworZHFjdG02NTYgY29tcGFyZXRvdG1hZyAgLTBFMSAgIDAuMCAgLT4gICAxCitkcWN0bTY1NyBjb21wYXJldG90bWFnICAtMEUyICAgMC4wICAtPiAgIDEKK2RxY3RtNjU4IGNvbXBhcmV0b3RtYWcgICAwRTEgICAwLjAgIC0+ICAgMQorZHFjdG02NTkgY29tcGFyZXRvdG1hZyAgIDBFMiAgIDAuMCAgLT4gICAxCitkcWN0bTY2MCBjb21wYXJldG90bWFnICAtMEUxICAgMCAgICAtPiAgIDEKK2RxY3RtNjYxIGNvbXBhcmV0b3RtYWcgIC0wRTIgICAwICAgIC0+ICAgMQorZHFjdG02NjIgY29tcGFyZXRvdG1hZyAgIDBFMSAgIDAgICAgLT4gICAxCitkcWN0bTY2MyBjb21wYXJldG90bWFnICAgMEUyICAgMCAgICAtPiAgIDEKK2RxY3RtNjY0IGNvbXBhcmV0b3RtYWcgIC0wRTEgIC0wRTEgIC0+ICAgMAorZHFjdG02NjUgY29tcGFyZXRvdG1hZyAgLTBFMiAgLTBFMSAgLT4gICAxCitkcWN0bTY2NiBjb21wYXJldG90bWFnICAgMEUxICAtMEUxICAtPiAgIDAKK2RxY3RtNjY3IGNvbXBhcmV0b3RtYWcgICAwRTIgIC0wRTEgIC0+ICAgMQorZHFjdG02NjggY29tcGFyZXRvdG1hZyAgLTBFMSAgLTBFMiAgLT4gIC0xCitkcWN0bTY2OSBjb21wYXJldG90bWFnICAtMEUyICAtMEUyICAtPiAgIDAKK2RxY3RtNjcwIGNvbXBhcmV0b3RtYWcgICAwRTEgIC0wRTIgIC0+ICAtMQorZHFjdG02NzEgY29tcGFyZXRvdG1hZyAgIDBFMiAgLTBFMiAgLT4gICAwCitkcWN0bTY3MiBjb21wYXJldG90bWFnICAtMEUxICAgMEUxICAtPiAgIDAKK2RxY3RtNjczIGNvbXBhcmV0b3RtYWcgIC0wRTIgICAwRTEgIC0+ICAgMQorZHFjdG02NzQgY29tcGFyZXRvdG1hZyAgIDBFMSAgIDBFMSAgLT4gICAwCitkcWN0bTY3NSBjb21wYXJldG90bWFnICAgMEUyICAgMEUxICAtPiAgIDEKK2RxY3RtNjc2IGNvbXBhcmV0b3RtYWcgIC0wRTEgICAwRTIgIC0+ICAtMQorZHFjdG02NzcgY29tcGFyZXRvdG1hZyAgLTBFMiAgIDBFMiAgLT4gICAwCitkcWN0bTY3OCBjb21wYXJldG90bWFnICAgMEUxICAgMEUyICAtPiAgLTEKK2RxY3RtNjc5IGNvbXBhcmV0b3RtYWcgICAwRTIgICAwRTIgIC0+ICAgMAorCistLSB0cmFpbGluZyB6ZXJvczsgdW5pdC15CitkcWN0bTY4MCBjb21wYXJldG90bWFnICAgMTIgICAgMTIgICAgICAgICAgICAtPiAgIDAKK2RxY3RtNjgxIGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wICAgICAgICAgIC0+ICAgMQorZHFjdG02ODIgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwICAgICAgICAgLT4gICAxCitkcWN0bTY4MyBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwICAgICAgICAtPiAgIDEKK2RxY3RtNjg0IGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAwICAgICAgIC0+ICAgMQorZHFjdG02ODUgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMDAwICAgICAgLT4gICAxCitkcWN0bTY4NiBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwMDAwICAgICAtPiAgIDEKK2RxY3RtNjg3IGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAwMDAwICAgIC0+ICAgMQorZHFjdG02ODggY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMDAwMDAwICAgLT4gICAxCitkcWN0bTY4OSBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwMDAwMDAwICAtPiAgIDEKK2RxY3RtNjkwIGNvbXBhcmV0b3RtYWcgICAxMiAgICAgICAgICAgICAgMTIgIC0+ICAgMAorZHFjdG02OTEgY29tcGFyZXRvdG1hZyAgIDEyLjAgICAgICAgICAgICAxMiAgLT4gIC0xCitkcWN0bTY5MiBjb21wYXJldG90bWFnICAgMTIuMDAgICAgICAgICAgIDEyICAtPiAgLTEKK2RxY3RtNjkzIGNvbXBhcmV0b3RtYWcgICAxMi4wMDAgICAgICAgICAgMTIgIC0+ICAtMQorZHFjdG02OTQgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAgICAgICAgICAxMiAgLT4gIC0xCitkcWN0bTY5NSBjb21wYXJldG90bWFnICAgMTIuMDAwMDAgICAgICAgIDEyICAtPiAgLTEKK2RxY3RtNjk2IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAgICAgICAgMTIgIC0+ICAtMQorZHFjdG02OTcgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMDAgICAgICAxMiAgLT4gIC0xCitkcWN0bTY5OCBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwMDAgICAgIDEyICAtPiAgLTEKK2RxY3RtNjk5IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAwMDAgICAgMTIgIC0+ICAtMQorCistLSBvbGQgbG9uZyBvcGVyYW5kIGNoZWNrcworZHFjdG03MDEgY29tcGFyZXRvdG1hZyAxMjM0NTY3ODAwMCAgMSAgLT4gICAxCitkcWN0bTcwMiBjb21wYXJldG90bWFnIDEgMTIzNDU2NzgwMDAgICAtPiAgLTEKK2RxY3RtNzAzIGNvbXBhcmV0b3RtYWcgMTIzNDU2NzgwMCAgIDEgIC0+ICAgMQorZHFjdG03MDQgY29tcGFyZXRvdG1hZyAxIDEyMzQ1Njc4MDAgICAgLT4gIC0xCitkcWN0bTcwNSBjb21wYXJldG90bWFnIDEyMzQ1Njc4OTAgICAxICAtPiAgIDEKK2RxY3RtNzA2IGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODkwICAgIC0+ICAtMQorZHFjdG03MDcgY29tcGFyZXRvdG1hZyAxMjM0NTY3ODkxICAgMSAgLT4gICAxCitkcWN0bTcwOCBjb21wYXJldG90bWFnIDEgMTIzNDU2Nzg5MSAgICAtPiAgLTEKK2RxY3RtNzA5IGNvbXBhcmV0b3RtYWcgMTIzNDU2Nzg5MDEgIDEgIC0+ICAgMQorZHFjdG03MTAgY29tcGFyZXRvdG1hZyAxIDEyMzQ1Njc4OTAxICAgLT4gIC0xCitkcWN0bTcxMSBjb21wYXJldG90bWFnIDEyMzQ1Njc4OTYgICAxICAtPiAgIDEKK2RxY3RtNzEyIGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODk2ICAgIC0+ICAtMQorZHFjdG03MTMgY29tcGFyZXRvdG1hZyAtMTIzNDU2Nzg5MSAgMSAgLT4gICAxCitkcWN0bTcxNCBjb21wYXJldG90bWFnIDEgLTEyMzQ1Njc4OTEgICAtPiAgLTEKK2RxY3RtNzE1IGNvbXBhcmV0b3RtYWcgLTEyMzQ1Njc4OTAxIDEgIC0+ICAgMQorZHFjdG03MTYgY29tcGFyZXRvdG1hZyAxIC0xMjM0NTY3ODkwMSAgLT4gIC0xCitkcWN0bTcxNyBjb21wYXJldG90bWFnIC0xMjM0NTY3ODk2ICAxICAtPiAgIDEKK2RxY3RtNzE4IGNvbXBhcmV0b3RtYWcgMSAtMTIzNDU2Nzg5NiAgIC0+ICAtMQorCistLSBvbGQgcmVzaWR1ZSBjYXNlcworZHFjdG03NDAgY29tcGFyZXRvdG1hZyAgMSAgMC45OTk5OTk5ICAgLT4gICAxCitkcWN0bTc0MSBjb21wYXJldG90bWFnICAxICAwLjk5OTk5OSAgICAtPiAgIDEKK2RxY3RtNzQyIGNvbXBhcmV0b3RtYWcgIDEgIDAuOTk5OTkgICAgIC0+ICAgMQorZHFjdG03NDMgY29tcGFyZXRvdG1hZyAgMSAgMS4wMDAwICAgICAgLT4gICAxCitkcWN0bTc0NCBjb21wYXJldG90bWFnICAxICAxLjAwMDAxICAgICAtPiAgLTEKK2RxY3RtNzQ1IGNvbXBhcmV0b3RtYWcgIDEgIDEuMDAwMDAxICAgIC0+ICAtMQorZHFjdG03NDYgY29tcGFyZXRvdG1hZyAgMSAgMS4wMDAwMDAxICAgLT4gIC0xCitkcWN0bTc1MCBjb21wYXJldG90bWFnICAwLjk5OTk5OTkgIDEgICAtPiAgLTEKK2RxY3RtNzUxIGNvbXBhcmV0b3RtYWcgIDAuOTk5OTk5ICAgMSAgIC0+ICAtMQorZHFjdG03NTIgY29tcGFyZXRvdG1hZyAgMC45OTk5OSAgICAxICAgLT4gIC0xCitkcWN0bTc1MyBjb21wYXJldG90bWFnICAxLjAwMDAgICAgIDEgICAtPiAgLTEKK2RxY3RtNzU0IGNvbXBhcmV0b3RtYWcgIDEuMDAwMDEgICAgMSAgIC0+ICAgMQorZHFjdG03NTUgY29tcGFyZXRvdG1hZyAgMS4wMDAwMDEgICAxICAgLT4gICAxCitkcWN0bTc1NiBjb21wYXJldG90bWFnICAxLjAwMDAwMDEgIDEgICAtPiAgIDEKKworLS0gU3BlY2lhbHMKK2RxY3RtNzgwIGNvbXBhcmV0b3RtYWcgIEluZiAgLUluZiAgIC0+ICAwCitkcWN0bTc4MSBjb21wYXJldG90bWFnICBJbmYgIC0xMDAwICAtPiAgMQorZHFjdG03ODIgY29tcGFyZXRvdG1hZyAgSW5mICAtMSAgICAgLT4gIDEKK2RxY3RtNzgzIGNvbXBhcmV0b3RtYWcgIEluZiAgLTAgICAgIC0+ICAxCitkcWN0bTc4NCBjb21wYXJldG90bWFnICBJbmYgICAwICAgICAtPiAgMQorZHFjdG03ODUgY29tcGFyZXRvdG1hZyAgSW5mICAgMSAgICAgLT4gIDEKK2RxY3RtNzg2IGNvbXBhcmV0b3RtYWcgIEluZiAgIDEwMDAgIC0+ICAxCitkcWN0bTc4NyBjb21wYXJldG90bWFnICBJbmYgICBJbmYgICAtPiAgMAorZHFjdG03ODggY29tcGFyZXRvdG1hZyAtMTAwMCAgSW5mICAgLT4gLTEKK2RxY3RtNzg5IGNvbXBhcmV0b3RtYWcgLUluZiAgIEluZiAgIC0+ICAwCitkcWN0bTc5MCBjb21wYXJldG90bWFnIC0xICAgICBJbmYgICAtPiAtMQorZHFjdG03OTEgY29tcGFyZXRvdG1hZyAtMCAgICAgSW5mICAgLT4gLTEKK2RxY3RtNzkyIGNvbXBhcmV0b3RtYWcgIDAgICAgIEluZiAgIC0+IC0xCitkcWN0bTc5MyBjb21wYXJldG90bWFnICAxICAgICBJbmYgICAtPiAtMQorZHFjdG03OTQgY29tcGFyZXRvdG1hZyAgMTAwMCAgSW5mICAgLT4gLTEKK2RxY3RtNzk1IGNvbXBhcmV0b3RtYWcgIEluZiAgIEluZiAgIC0+ICAwCisKK2RxY3RtODAwIGNvbXBhcmV0b3RtYWcgLUluZiAgLUluZiAgIC0+ICAwCitkcWN0bTgwMSBjb21wYXJldG90bWFnIC1JbmYgIC0xMDAwICAtPiAgMQorZHFjdG04MDIgY29tcGFyZXRvdG1hZyAtSW5mICAtMSAgICAgLT4gIDEKK2RxY3RtODAzIGNvbXBhcmV0b3RtYWcgLUluZiAgLTAgICAgIC0+ICAxCitkcWN0bTgwNCBjb21wYXJldG90bWFnIC1JbmYgICAwICAgICAtPiAgMQorZHFjdG04MDUgY29tcGFyZXRvdG1hZyAtSW5mICAgMSAgICAgLT4gIDEKK2RxY3RtODA2IGNvbXBhcmV0b3RtYWcgLUluZiAgIDEwMDAgIC0+ICAxCitkcWN0bTgwNyBjb21wYXJldG90bWFnIC1JbmYgICBJbmYgICAtPiAgMAorZHFjdG04MDggY29tcGFyZXRvdG1hZyAtSW5mICAtSW5mICAgLT4gIDAKK2RxY3RtODA5IGNvbXBhcmV0b3RtYWcgLTEwMDAgLUluZiAgIC0+IC0xCitkcWN0bTgxMCBjb21wYXJldG90bWFnIC0xICAgIC1JbmYgICAtPiAtMQorZHFjdG04MTEgY29tcGFyZXRvdG1hZyAtMCAgICAtSW5mICAgLT4gLTEKK2RxY3RtODEyIGNvbXBhcmV0b3RtYWcgIDAgICAgLUluZiAgIC0+IC0xCitkcWN0bTgxMyBjb21wYXJldG90bWFnICAxICAgIC1JbmYgICAtPiAtMQorZHFjdG04MTQgY29tcGFyZXRvdG1hZyAgMTAwMCAtSW5mICAgLT4gLTEKK2RxY3RtODE1IGNvbXBhcmV0b3RtYWcgIEluZiAgLUluZiAgIC0+ICAwCisKK2RxY3RtODIxIGNvbXBhcmV0b3RtYWcgIE5hTiAtSW5mICAgIC0+ICAxCitkcWN0bTgyMiBjb21wYXJldG90bWFnICBOYU4gLTEwMDAgICAtPiAgMQorZHFjdG04MjMgY29tcGFyZXRvdG1hZyAgTmFOIC0xICAgICAgLT4gIDEKK2RxY3RtODI0IGNvbXBhcmV0b3RtYWcgIE5hTiAtMCAgICAgIC0+ICAxCitkcWN0bTgyNSBjb21wYXJldG90bWFnICBOYU4gIDAgICAgICAtPiAgMQorZHFjdG04MjYgY29tcGFyZXRvdG1hZyAgTmFOICAxICAgICAgLT4gIDEKK2RxY3RtODI3IGNvbXBhcmV0b3RtYWcgIE5hTiAgMTAwMCAgIC0+ICAxCitkcWN0bTgyOCBjb21wYXJldG90bWFnICBOYU4gIEluZiAgICAtPiAgMQorZHFjdG04MjkgY29tcGFyZXRvdG1hZyAgTmFOICBOYU4gICAgLT4gIDAKK2RxY3RtODMwIGNvbXBhcmV0b3RtYWcgLUluZiAgTmFOICAgIC0+ICAtMQorZHFjdG04MzEgY29tcGFyZXRvdG1hZyAtMTAwMCBOYU4gICAgLT4gIC0xCitkcWN0bTgzMiBjb21wYXJldG90bWFnIC0xICAgIE5hTiAgICAtPiAgLTEKK2RxY3RtODMzIGNvbXBhcmV0b3RtYWcgLTAgICAgTmFOICAgIC0+ICAtMQorZHFjdG04MzQgY29tcGFyZXRvdG1hZyAgMCAgICBOYU4gICAgLT4gIC0xCitkcWN0bTgzNSBjb21wYXJldG90bWFnICAxICAgIE5hTiAgICAtPiAgLTEKK2RxY3RtODM2IGNvbXBhcmV0b3RtYWcgIDEwMDAgTmFOICAgIC0+ICAtMQorZHFjdG04MzcgY29tcGFyZXRvdG1hZyAgSW5mICBOYU4gICAgLT4gIC0xCitkcWN0bTgzOCBjb21wYXJldG90bWFnIC1OYU4gLU5hTiAgICAtPiAgMAorZHFjdG04MzkgY29tcGFyZXRvdG1hZyArTmFOIC1OYU4gICAgLT4gIDAKK2RxY3RtODQwIGNvbXBhcmV0b3RtYWcgLU5hTiArTmFOICAgIC0+ICAwCisKK2RxY3RtODQxIGNvbXBhcmV0b3RtYWcgIHNOYU4gLXNOYU4gIC0+ICAwCitkcWN0bTg0MiBjb21wYXJldG90bWFnICBzTmFOIC1OYU4gICAtPiAgLTEKK2RxY3RtODQzIGNvbXBhcmV0b3RtYWcgIHNOYU4gLUluZiAgIC0+ICAxCitkcWN0bTg0NCBjb21wYXJldG90bWFnICBzTmFOIC0xMDAwICAtPiAgMQorZHFjdG04NDUgY29tcGFyZXRvdG1hZyAgc05hTiAtMSAgICAgLT4gIDEKK2RxY3RtODQ2IGNvbXBhcmV0b3RtYWcgIHNOYU4gLTAgICAgIC0+ICAxCitkcWN0bTg0NyBjb21wYXJldG90bWFnICBzTmFOICAwICAgICAtPiAgMQorZHFjdG04NDggY29tcGFyZXRvdG1hZyAgc05hTiAgMSAgICAgLT4gIDEKK2RxY3RtODQ5IGNvbXBhcmV0b3RtYWcgIHNOYU4gIDEwMDAgIC0+ICAxCitkcWN0bTg1MCBjb21wYXJldG90bWFnICBzTmFOICBOYU4gICAtPiAgLTEKK2RxY3RtODUxIGNvbXBhcmV0b3RtYWcgIHNOYU4gc05hTiAgIC0+ICAwCisKK2RxY3RtODUyIGNvbXBhcmV0b3RtYWcgLXNOYU4gc05hTiAgIC0+ICAwCitkcWN0bTg1MyBjb21wYXJldG90bWFnIC1OYU4gIHNOYU4gICAtPiAgMQorZHFjdG04NTQgY29tcGFyZXRvdG1hZyAtSW5mICBzTmFOICAgLT4gIC0xCitkcWN0bTg1NSBjb21wYXJldG90bWFnIC0xMDAwIHNOYU4gICAtPiAgLTEKK2RxY3RtODU2IGNvbXBhcmV0b3RtYWcgLTEgICAgc05hTiAgIC0+ICAtMQorZHFjdG04NTcgY29tcGFyZXRvdG1hZyAtMCAgICBzTmFOICAgLT4gIC0xCitkcWN0bTg1OCBjb21wYXJldG90bWFnICAwICAgIHNOYU4gICAtPiAgLTEKK2RxY3RtODU5IGNvbXBhcmV0b3RtYWcgIDEgICAgc05hTiAgIC0+ICAtMQorZHFjdG04NjAgY29tcGFyZXRvdG1hZyAgMTAwMCBzTmFOICAgLT4gIC0xCitkcWN0bTg2MSBjb21wYXJldG90bWFnICBJbmYgIHNOYU4gICAtPiAgLTEKK2RxY3RtODYyIGNvbXBhcmV0b3RtYWcgIE5hTiAgc05hTiAgIC0+ICAxCitkcWN0bTg2MyBjb21wYXJldG90bWFnICBzTmFOIHNOYU4gICAtPiAgMAorCitkcWN0bTg3MSBjb21wYXJldG90bWFnICAtc05hTiAtc05hTiAgLT4gIDAKK2RxY3RtODcyIGNvbXBhcmV0b3RtYWcgIC1zTmFOIC1OYU4gICAtPiAgLTEKK2RxY3RtODczIGNvbXBhcmV0b3RtYWcgIC1zTmFOIC1JbmYgICAtPiAgMQorZHFjdG04NzQgY29tcGFyZXRvdG1hZyAgLXNOYU4gLTEwMDAgIC0+ICAxCitkcWN0bTg3NSBjb21wYXJldG90bWFnICAtc05hTiAtMSAgICAgLT4gIDEKK2RxY3RtODc2IGNvbXBhcmV0b3RtYWcgIC1zTmFOIC0wICAgICAtPiAgMQorZHFjdG04NzcgY29tcGFyZXRvdG1hZyAgLXNOYU4gIDAgICAgIC0+ICAxCitkcWN0bTg3OCBjb21wYXJldG90bWFnICAtc05hTiAgMSAgICAgLT4gIDEKK2RxY3RtODc5IGNvbXBhcmV0b3RtYWcgIC1zTmFOICAxMDAwICAtPiAgMQorZHFjdG04ODAgY29tcGFyZXRvdG1hZyAgLXNOYU4gIE5hTiAgIC0+ICAtMQorZHFjdG04ODEgY29tcGFyZXRvdG1hZyAgLXNOYU4gc05hTiAgIC0+ICAwCisKK2RxY3RtODgyIGNvbXBhcmV0b3RtYWcgLXNOYU4gLXNOYU4gICAtPiAgMAorZHFjdG04ODMgY29tcGFyZXRvdG1hZyAtTmFOICAtc05hTiAgIC0+ICAxCitkcWN0bTg4NCBjb21wYXJldG90bWFnIC1JbmYgIC1zTmFOICAgLT4gIC0xCitkcWN0bTg4NSBjb21wYXJldG90bWFnIC0xMDAwIC1zTmFOICAgLT4gIC0xCitkcWN0bTg4NiBjb21wYXJldG90bWFnIC0xICAgIC1zTmFOICAgLT4gIC0xCitkcWN0bTg4NyBjb21wYXJldG90bWFnIC0wICAgIC1zTmFOICAgLT4gIC0xCitkcWN0bTg4OCBjb21wYXJldG90bWFnICAwICAgIC1zTmFOICAgLT4gIC0xCitkcWN0bTg4OSBjb21wYXJldG90bWFnICAxICAgIC1zTmFOICAgLT4gIC0xCitkcWN0bTg5MCBjb21wYXJldG90bWFnICAxMDAwIC1zTmFOICAgLT4gIC0xCitkcWN0bTg5MSBjb21wYXJldG90bWFnICBJbmYgIC1zTmFOICAgLT4gIC0xCitkcWN0bTg5MiBjb21wYXJldG90bWFnICBOYU4gIC1zTmFOICAgLT4gIDEKK2RxY3RtODkzIGNvbXBhcmV0b3RtYWcgIHNOYU4gLXNOYU4gICAtPiAgMAorCistLSBOYU5zIHdpdGggcGF5bG9hZAorZHFjdG05NjAgY29tcGFyZXRvdG1hZyAgTmFOOSAtSW5mICAgLT4gIDEKK2RxY3RtOTYxIGNvbXBhcmV0b3RtYWcgIE5hTjggIDk5OSAgIC0+ICAxCitkcWN0bTk2MiBjb21wYXJldG90bWFnICBOYU43NyBJbmYgICAtPiAgMQorZHFjdG05NjMgY29tcGFyZXRvdG1hZyAtTmFONjcgTmFONSAgLT4gIDEKK2RxY3RtOTY0IGNvbXBhcmV0b3RtYWcgLUluZiAgLU5hTjQgIC0+ICAtMQorZHFjdG05NjUgY29tcGFyZXRvdG1hZyAtOTk5ICAtTmFOMzMgLT4gIC0xCitkcWN0bTk2NiBjb21wYXJldG90bWFnICBJbmYgICBOYU4yICAtPiAgLTEKKworZHFjdG05NzAgY29tcGFyZXRvdG1hZyAtTmFONDEgLU5hTjQyIC0+IC0xCitkcWN0bTk3MSBjb21wYXJldG90bWFnICtOYU40MSAtTmFONDIgLT4gLTEKK2RxY3RtOTcyIGNvbXBhcmV0b3RtYWcgLU5hTjQxICtOYU40MiAtPiAtMQorZHFjdG05NzMgY29tcGFyZXRvdG1hZyArTmFONDEgK05hTjQyIC0+IC0xCitkcWN0bTk3NCBjb21wYXJldG90bWFnIC1OYU40MiAtTmFOMDEgLT4gIDEKK2RxY3RtOTc1IGNvbXBhcmV0b3RtYWcgK05hTjQyIC1OYU4wMSAtPiAgMQorZHFjdG05NzYgY29tcGFyZXRvdG1hZyAtTmFONDIgK05hTjAxIC0+ICAxCitkcWN0bTk3NyBjb21wYXJldG90bWFnICtOYU40MiArTmFOMDEgLT4gIDEKKworZHFjdG05ODAgY29tcGFyZXRvdG1hZyAtc05hTjc3MSAtc05hTjc3MiAtPiAtMQorZHFjdG05ODEgY29tcGFyZXRvdG1hZyArc05hTjc3MSAtc05hTjc3MiAtPiAtMQorZHFjdG05ODIgY29tcGFyZXRvdG1hZyAtc05hTjc3MSArc05hTjc3MiAtPiAtMQorZHFjdG05ODMgY29tcGFyZXRvdG1hZyArc05hTjc3MSArc05hTjc3MiAtPiAtMQorZHFjdG05ODQgY29tcGFyZXRvdG1hZyAtc05hTjc3MiAtc05hTjc3MSAtPiAgMQorZHFjdG05ODUgY29tcGFyZXRvdG1hZyArc05hTjc3MiAtc05hTjc3MSAtPiAgMQorZHFjdG05ODYgY29tcGFyZXRvdG1hZyAtc05hTjc3MiArc05hTjc3MSAtPiAgMQorZHFjdG05ODcgY29tcGFyZXRvdG1hZyArc05hTjc3MiArc05hTjc3MSAtPiAgMQorCitkcWN0bTk5MSBjb21wYXJldG90bWFnIC1zTmFOOTkgLUluZiAgICAtPiAgMQorZHFjdG05OTIgY29tcGFyZXRvdG1hZyAgc05hTjk4IC0xMSAgICAgLT4gIDEKK2RxY3RtOTkzIGNvbXBhcmV0b3RtYWcgIHNOYU45NyAgTmFOICAgIC0+IC0xCitkcWN0bTk5NCBjb21wYXJldG90bWFnICBzTmFOMTYgc05hTjk0ICAtPiAtMQorZHFjdG05OTUgY29tcGFyZXRvdG1hZyAgTmFOODUgIHNOYU44MyAgLT4gIDEKK2RxY3RtOTk2IGNvbXBhcmV0b3RtYWcgLUluZiAgICBzTmFOOTIgIC0+IC0xCitkcWN0bTk5NyBjb21wYXJldG90bWFnICAwODggICAgc05hTjgxICAtPiAtMQorZHFjdG05OTggY29tcGFyZXRvdG1hZyAgSW5mICAgIHNOYU45MCAgLT4gLTEKK2RxY3RtOTk5IGNvbXBhcmV0b3RtYWcgIE5hTiAgIC1zTmFOODkgIC0+ICAxCisKKy0tIHNwcmVhZCB6ZXJvcworZHFjdG0xMTEwIGNvbXBhcmV0b3RtYWcgICAwRS02MTQzICAwICAgICAgICAtPiAgLTEKK2RxY3RtMTExMSBjb21wYXJldG90bWFnICAgMEUtNjE0MyAtMCAgICAgICAgLT4gIC0xCitkcWN0bTExMTIgY29tcGFyZXRvdG1hZyAgLTBFLTYxNDMgIDAgICAgICAgIC0+ICAtMQorZHFjdG0xMTEzIGNvbXBhcmV0b3RtYWcgIC0wRS02MTQzIC0wICAgICAgICAtPiAgLTEKK2RxY3RtMTExNCBjb21wYXJldG90bWFnICAgMEUtNjE0MyAgMEUrNjE0NCAgIC0+ICAtMQorZHFjdG0xMTE1IGNvbXBhcmV0b3RtYWcgICAwRS02MTQzIC0wRSs2MTQ0ICAgLT4gIC0xCitkcWN0bTExMTYgY29tcGFyZXRvdG1hZyAgLTBFLTYxNDMgIDBFKzYxNDQgICAtPiAgLTEKK2RxY3RtMTExNyBjb21wYXJldG90bWFnICAtMEUtNjE0MyAtMEUrNjE0NCAgIC0+ICAtMQorZHFjdG0xMTE4IGNvbXBhcmV0b3RtYWcgICAwICAgICAgIDBFKzYxNDQgICAtPiAgLTEKK2RxY3RtMTExOSBjb21wYXJldG90bWFnICAgMCAgICAgIC0wRSs2MTQ0ICAgLT4gIC0xCitkcWN0bTExMjAgY29tcGFyZXRvdG1hZyAgLTAgICAgICAgMEUrNjE0NCAgIC0+ICAtMQorZHFjdG0xMTIxIGNvbXBhcmV0b3RtYWcgIC0wICAgICAgLTBFKzYxNDQgICAtPiAgLTEKKworZHFjdG0xMTMwIGNvbXBhcmV0b3RtYWcgICAwRSs2MTQ0ICAwICAgICAgICAtPiAgIDEKK2RxY3RtMTEzMSBjb21wYXJldG90bWFnICAgMEUrNjE0NCAtMCAgICAgICAgLT4gICAxCitkcWN0bTExMzIgY29tcGFyZXRvdG1hZyAgLTBFKzYxNDQgIDAgICAgICAgIC0+ICAgMQorZHFjdG0xMTMzIGNvbXBhcmV0b3RtYWcgIC0wRSs2MTQ0IC0wICAgICAgICAtPiAgIDEKK2RxY3RtMTEzNCBjb21wYXJldG90bWFnICAgMEUrNjE0NCAgMEUtNjE0MyAgIC0+ICAgMQorZHFjdG0xMTM1IGNvbXBhcmV0b3RtYWcgICAwRSs2MTQ0IC0wRS02MTQzICAgLT4gICAxCitkcWN0bTExMzYgY29tcGFyZXRvdG1hZyAgLTBFKzYxNDQgIDBFLTYxNDMgICAtPiAgIDEKK2RxY3RtMTEzNyBjb21wYXJldG90bWFnICAtMEUrNjE0NCAtMEUtNjE0MyAgIC0+ICAgMQorZHFjdG0xMTM4IGNvbXBhcmV0b3RtYWcgICAwICAgICAgIDBFLTYxNDMgICAtPiAgIDEKK2RxY3RtMTEzOSBjb21wYXJldG90bWFnICAgMCAgICAgIC0wRS02MTQzICAgLT4gICAxCitkcWN0bTExNDAgY29tcGFyZXRvdG1hZyAgLTAgICAgICAgMEUtNjE0MyAgIC0+ICAgMQorZHFjdG0xMTQxIGNvbXBhcmV0b3RtYWcgIC0wICAgICAgLTBFLTYxNDMgICAtPiAgIDEKKworLS0gTnVsbCB0ZXN0cworZHFjdG05OTkwIGNvbXBhcmV0b3RtYWcgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWN0bTk5OTEgY29tcGFyZXRvdG1hZyAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb3B5LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29weS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNjI0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29weS5kZWNUZXN0CkBAIC0wLDAgKzEsODggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFDb3B5LmRlY1Rlc3QgLS0gcXVpZXQgZGVjUXVhZCBjb3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY1F1YWRzLgorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrCitkcWNweTAwMSBjb3B5ICAgICAgICs3LjUwICAtPiA3LjUwCisKKy0tIEluZmluaXRpZXMKK2RxY3B5MDExIGNvcHkgIEluZmluaXR5ICAgIC0+IEluZmluaXR5CitkcWNweTAxMiBjb3B5ICAtSW5maW5pdHkgICAtPiAtSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitkcWNweTAyMSBjb3B5ICAgICAgICAgTmFOICAtPiBOYU4KK2RxY3B5MDIyIGNvcHkgICAgICAgIC1OYU4gIC0+IC1OYU4KK2RxY3B5MDIzIGNvcHkgICAgICAgIHNOYU4gIC0+IHNOYU4KK2RxY3B5MDI0IGNvcHkgICAgICAgLXNOYU4gIC0+IC1zTmFOCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2RxY3B5MDMxIGNvcHkgICAgICAgTmFOMTAgIC0+IE5hTjEwCitkcWNweTAzMiBjb3B5ICAgICAgLU5hTjEwICAtPiAtTmFOMTAKK2RxY3B5MDMzIGNvcHkgICAgICBzTmFOMTAgIC0+IHNOYU4xMAorZHFjcHkwMzQgY29weSAgICAgLXNOYU4xMCAgLT4gLXNOYU4xMAorZHFjcHkwMzUgY29weSAgICAgICBOYU43ICAgLT4gTmFONworZHFjcHkwMzYgY29weSAgICAgIC1OYU43ICAgLT4gLU5hTjcKK2RxY3B5MDM3IGNvcHkgICAgICBzTmFOMTAxIC0+IHNOYU4xMDEKK2RxY3B5MDM4IGNvcHkgICAgIC1zTmFOMTAxIC0+IC1zTmFOMTAxCisKKy0tIGZpbml0ZXMKK2RxY3B5MTAxIGNvcHkgICAgICAgICAgNyAgIC0+IDcKK2RxY3B5MTAyIGNvcHkgICAgICAgICAtNyAgIC0+IC03CitkcWNweTEwMyBjb3B5ICAgICAgICAgNzUgICAtPiA3NQorZHFjcHkxMDQgY29weSAgICAgICAgLTc1ICAgLT4gLTc1CitkcWNweTEwNSBjb3B5ICAgICAgIDcuNTAgICAtPiA3LjUwCitkcWNweTEwNiBjb3B5ICAgICAgLTcuNTAgICAtPiAtNy41MAorZHFjcHkxMDcgY29weSAgICAgICA3LjUwMCAgLT4gNy41MDAKK2RxY3B5MTA4IGNvcHkgICAgICAtNy41MDAgIC0+IC03LjUwMAorCistLSB6ZXJvcworZHFjcHkxMTEgY29weSAgICAgICAgICAwICAgLT4gMAorZHFjcHkxMTIgY29weSAgICAgICAgIC0wICAgLT4gLTAKK2RxY3B5MTEzIGNvcHkgICAgICAgMEUrNCAgIC0+IDBFKzQKK2RxY3B5MTE0IGNvcHkgICAgICAtMEUrNCAgIC0+IC0wRSs0CitkcWNweTExNSBjb3B5ICAgICAwLjAwMDAgICAtPiAwLjAwMDAKK2RxY3B5MTE2IGNvcHkgICAgLTAuMDAwMCAgIC0+IC0wLjAwMDAKK2RxY3B5MTE3IGNvcHkgICAgICAwRS0xNDEgIC0+IDBFLTE0MQorZHFjcHkxMTggY29weSAgICAgLTBFLTE0MSAgLT4gLTBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZHFjcHkxMjEgY29weSAgIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIgICAgLT4gIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIKK2RxY3B5MTIyIGNvcHkgIC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyICAgIC0+IC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcWNweTEyMyBjb3B5ICAgMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MSAgICAtPiAgMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MQorZHFjcHkxMjQgY29weSAgLTEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEgICAgLT4gLTEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RxY3B5MTMxIGNvcHkgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcWNweTEzMiBjb3B5ICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxRS02MTQzCitkcWNweTEzMyBjb3B5ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFjcHkxMzQgY29weSAgMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE3NgorCitkcWNweTEzNSBjb3B5ICAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IC0xRS02MTc2CitkcWNweTEzNiBjb3B5ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFjcHkxMzcgY29weSAgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAtMUUtNjE0MworZHFjcHkxMzggY29weSAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb3B5QWJzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29weUFicy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YmNiNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29weUFicy5kZWNUZXN0CkBAIC0wLDAgKzEsODggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFDb3B5QWJzLmRlY1Rlc3QgLS0gcXVpZXQgZGVjUXVhZCBjb3B5IGFuZCBzZXQgc2lnbiB0byB6ZXJvICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY1F1YWRzLgorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrCitkcWNwYTAwMSBjb3B5YWJzICAgICAgICs3LjUwICAtPiA3LjUwCisKKy0tIEluZmluaXRpZXMKK2RxY3BhMDExIGNvcHlhYnMgIEluZmluaXR5ICAgIC0+IEluZmluaXR5CitkcWNwYTAxMiBjb3B5YWJzICAtSW5maW5pdHkgICAtPiBJbmZpbml0eQorCistLSBOYU5zLCAwIHBheWxvYWQKK2RxY3BhMDIxIGNvcHlhYnMgICAgICAgICBOYU4gIC0+IE5hTgorZHFjcGEwMjIgY29weWFicyAgICAgICAgLU5hTiAgLT4gTmFOCitkcWNwYTAyMyBjb3B5YWJzICAgICAgICBzTmFOICAtPiBzTmFOCitkcWNwYTAyNCBjb3B5YWJzICAgICAgIC1zTmFOICAtPiBzTmFOCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2RxY3BhMDMxIGNvcHlhYnMgICAgICAgTmFOMTAgIC0+IE5hTjEwCitkcWNwYTAzMiBjb3B5YWJzICAgICAgLU5hTjE1ICAtPiBOYU4xNQorZHFjcGEwMzMgY29weWFicyAgICAgIHNOYU4xNSAgLT4gc05hTjE1CitkcWNwYTAzNCBjb3B5YWJzICAgICAtc05hTjEwICAtPiBzTmFOMTAKK2RxY3BhMDM1IGNvcHlhYnMgICAgICAgTmFONyAgIC0+IE5hTjcKK2RxY3BhMDM2IGNvcHlhYnMgICAgICAtTmFONyAgIC0+IE5hTjcKK2RxY3BhMDM3IGNvcHlhYnMgICAgICBzTmFOMTAxIC0+IHNOYU4xMDEKK2RxY3BhMDM4IGNvcHlhYnMgICAgIC1zTmFOMTAxIC0+IHNOYU4xMDEKKworLS0gZmluaXRlcworZHFjcGExMDEgY29weWFicyAgICAgICAgICA3ICAgLT4gNworZHFjcGExMDIgY29weWFicyAgICAgICAgIC03ICAgLT4gNworZHFjcGExMDMgY29weWFicyAgICAgICAgIDc1ICAgLT4gNzUKK2RxY3BhMTA0IGNvcHlhYnMgICAgICAgIC03NSAgIC0+IDc1CitkcWNwYTEwNSBjb3B5YWJzICAgICAgIDcuMTAgICAtPiA3LjEwCitkcWNwYTEwNiBjb3B5YWJzICAgICAgLTcuMTAgICAtPiA3LjEwCitkcWNwYTEwNyBjb3B5YWJzICAgICAgIDcuNTAwICAtPiA3LjUwMAorZHFjcGExMDggY29weWFicyAgICAgIC03LjUwMCAgLT4gNy41MDAKKworLS0gemVyb3MKK2RxY3BhMTExIGNvcHlhYnMgICAgICAgICAgMCAgIC0+IDAKK2RxY3BhMTEyIGNvcHlhYnMgICAgICAgICAtMCAgIC0+IDAKK2RxY3BhMTEzIGNvcHlhYnMgICAgICAgMEUrNiAgIC0+IDBFKzYKK2RxY3BhMTE0IGNvcHlhYnMgICAgICAtMEUrNiAgIC0+IDBFKzYKK2RxY3BhMTE1IGNvcHlhYnMgICAgIDAuMDAwMCAgIC0+IDAuMDAwMAorZHFjcGExMTYgY29weWFicyAgICAtMC4wMDAwICAgLT4gMC4wMDAwCitkcWNwYTExNyBjb3B5YWJzICAgICAgMEUtMTQxICAtPiAwRS0xNDEKK2RxY3BhMTE4IGNvcHlhYnMgICAgIC0wRS0xNDEgIC0+IDBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZHFjcGExMjEgY29weWFicyAgIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIgICAgLT4gIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIKK2RxY3BhMTIyIGNvcHlhYnMgIC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyICAgIC0+ICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcWNwYTEyMyBjb3B5YWJzICAgMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MSAgICAtPiAgMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MQorZHFjcGExMjQgY29weWFicyAgLTEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEgICAgLT4gIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RxY3BhMTMxIGNvcHlhYnMgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcWNwYTEzMiBjb3B5YWJzICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxRS02MTQzCitkcWNwYTEzMyBjb3B5YWJzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFjcGExMzQgY29weWFicyAgMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE3NgorCitkcWNwYTEzNSBjb3B5YWJzICAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxRS02MTc2CitkcWNwYTEzNiBjb3B5YWJzICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFjcGExMzcgY29weWFicyAgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE0MworZHFjcGExMzggY29weWFicyAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb3B5TmVnYXRlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29weU5lZ2F0ZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNTNmNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29weU5lZ2F0ZS5kZWNUZXN0CkBAIC0wLDAgKzEsODggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFDb3B5TmVnYXRlLmRlY1Rlc3QgLS0gcXVpZXQgZGVjUXVhZCBjb3B5IGFuZCBuZWdhdGUgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY1F1YWRzLgorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrCitkcWNwbjAwMSBjb3B5bmVnYXRlICAgICAgICs3LjUwICAtPiAtNy41MAorCistLSBJbmZpbml0aWVzCitkcWNwbjAxMSBjb3B5bmVnYXRlICBJbmZpbml0eSAgICAtPiAtSW5maW5pdHkKK2RxY3BuMDEyIGNvcHluZWdhdGUgIC1JbmZpbml0eSAgIC0+IEluZmluaXR5CisKKy0tIE5hTnMsIDAgcGF5bG9hZAorZHFjcG4wMjEgY29weW5lZ2F0ZSAgICAgICAgIE5hTiAgLT4gLU5hTgorZHFjcG4wMjIgY29weW5lZ2F0ZSAgICAgICAgLU5hTiAgLT4gTmFOCitkcWNwbjAyMyBjb3B5bmVnYXRlICAgICAgICBzTmFOICAtPiAtc05hTgorZHFjcG4wMjQgY29weW5lZ2F0ZSAgICAgICAtc05hTiAgLT4gc05hTgorCistLSBOYU5zLCBub24tMCBwYXlsb2FkCitkcWNwbjAzMSBjb3B5bmVnYXRlICAgICAgIE5hTjEzICAtPiAtTmFOMTMKK2RxY3BuMDMyIGNvcHluZWdhdGUgICAgICAtTmFOMTMgIC0+IE5hTjEzCitkcWNwbjAzMyBjb3B5bmVnYXRlICAgICAgc05hTjEzICAtPiAtc05hTjEzCitkcWNwbjAzNCBjb3B5bmVnYXRlICAgICAtc05hTjEzICAtPiBzTmFOMTMKK2RxY3BuMDM1IGNvcHluZWdhdGUgICAgICAgTmFONzAgIC0+IC1OYU43MAorZHFjcG4wMzYgY29weW5lZ2F0ZSAgICAgIC1OYU43MCAgLT4gTmFONzAKK2RxY3BuMDM3IGNvcHluZWdhdGUgICAgICBzTmFOMTAxIC0+IC1zTmFOMTAxCitkcWNwbjAzOCBjb3B5bmVnYXRlICAgICAtc05hTjEwMSAtPiBzTmFOMTAxCisKKy0tIGZpbml0ZXMKK2RxY3BuMTAxIGNvcHluZWdhdGUgICAgICAgICAgNyAgIC0+IC03CitkcWNwbjEwMiBjb3B5bmVnYXRlICAgICAgICAgLTcgICAtPiA3CitkcWNwbjEwMyBjb3B5bmVnYXRlICAgICAgICAgNzUgICAtPiAtNzUKK2RxY3BuMTA0IGNvcHluZWdhdGUgICAgICAgIC03NSAgIC0+IDc1CitkcWNwbjEwNSBjb3B5bmVnYXRlICAgICAgIDcuNTAgICAtPiAtNy41MAorZHFjcG4xMDYgY29weW5lZ2F0ZSAgICAgIC03LjUwICAgLT4gNy41MAorZHFjcG4xMDcgY29weW5lZ2F0ZSAgICAgICA3LjUwMCAgLT4gLTcuNTAwCitkcWNwbjEwOCBjb3B5bmVnYXRlICAgICAgLTcuNTAwICAtPiA3LjUwMAorCistLSB6ZXJvcworZHFjcG4xMTEgY29weW5lZ2F0ZSAgICAgICAgICAwICAgLT4gLTAKK2RxY3BuMTEyIGNvcHluZWdhdGUgICAgICAgICAtMCAgIC0+IDAKK2RxY3BuMTEzIGNvcHluZWdhdGUgICAgICAgMEUrNCAgIC0+IC0wRSs0CitkcWNwbjExNCBjb3B5bmVnYXRlICAgICAgLTBFKzQgICAtPiAwRSs0CitkcWNwbjExNSBjb3B5bmVnYXRlICAgICAwLjAwMDAgICAtPiAtMC4wMDAwCitkcWNwbjExNiBjb3B5bmVnYXRlICAgIC0wLjAwMDAgICAtPiAwLjAwMDAKK2RxY3BuMTE3IGNvcHluZWdhdGUgICAgICAwRS0xNDEgIC0+IC0wRS0xNDEKK2RxY3BuMTE4IGNvcHluZWdhdGUgICAgIC0wRS0xNDEgIC0+IDBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZHFjcG4xMjEgY29weW5lZ2F0ZSAgIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIgICAgLT4gLTI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIKK2RxY3BuMTIyIGNvcHluZWdhdGUgIC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyICAgIC0+ICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcWNwbjEyMyBjb3B5bmVnYXRlICAgMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MSAgICAtPiAtMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MQorZHFjcG4xMjQgY29weW5lZ2F0ZSAgLTEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEgICAgLT4gIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RxY3BuMTMxIGNvcHluZWdhdGUgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcWNwbjEzMiBjb3B5bmVnYXRlICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IC0xRS02MTQzCitkcWNwbjEzMyBjb3B5bmVnYXRlICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFjcG4xMzQgY29weW5lZ2F0ZSAgMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAtMUUtNjE3NgorCitkcWNwbjEzNSBjb3B5bmVnYXRlICAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxRS02MTc2CitkcWNwbjEzNiBjb3B5bmVnYXRlICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFjcG4xMzcgY29weW5lZ2F0ZSAgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE0MworZHFjcG4xMzggY29weW5lZ2F0ZSAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb3B5U2lnbi5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvcHlTaWduLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiNWU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb3B5U2lnbi5kZWNUZXN0CkBAIC0wLDAgKzEsMTc1IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxQ29weVNpZ24uZGVjVGVzdCAtLSBxdWlldCBkZWNRdWFkIGNvcHkgd2l0aCBzaWduIGZyb20gcmhzICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNRdWFkcy4KK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjaworZHFjcHMwMDEgY29weXNpZ24gICAgICAgKzcuNTAgICAgIDExIC0+IDcuNTAKKworLS0gSW5maW5pdGllcworZHFjcHMwMTEgY29weXNpZ24gIEluZmluaXR5ICAgICAgIDExIC0+IEluZmluaXR5CitkcWNwczAxMiBjb3B5c2lnbiAgLUluZmluaXR5ICAgICAgMTEgLT4gSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitkcWNwczAyMSBjb3B5c2lnbiAgICAgICAgIE5hTiAgICAgMTEgLT4gTmFOCitkcWNwczAyMiBjb3B5c2lnbiAgICAgICAgLU5hTiAgICAgMTEgLT4gTmFOCitkcWNwczAyMyBjb3B5c2lnbiAgICAgICAgc05hTiAgICAgMTEgLT4gc05hTgorZHFjcHMwMjQgY29weXNpZ24gICAgICAgLXNOYU4gICAgIDExIC0+IHNOYU4KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorZHFjcHMwMzEgY29weXNpZ24gICAgICAgTmFOMTAgICAgIDExIC0+IE5hTjEwCitkcWNwczAzMiBjb3B5c2lnbiAgICAgIC1OYU4xMCAgICAgMTEgLT4gTmFOMTAKK2RxY3BzMDMzIGNvcHlzaWduICAgICAgc05hTjEwICAgICAxMSAtPiBzTmFOMTAKK2RxY3BzMDM0IGNvcHlzaWduICAgICAtc05hTjEwICAgICAxMSAtPiBzTmFOMTAKK2RxY3BzMDM1IGNvcHlzaWduICAgICAgIE5hTjcgICAgICAxMSAtPiBOYU43CitkcWNwczAzNiBjb3B5c2lnbiAgICAgIC1OYU43ICAgICAgMTEgLT4gTmFONworZHFjcHMwMzcgY29weXNpZ24gICAgICBzTmFOMTAxICAgIDExIC0+IHNOYU4xMDEKK2RxY3BzMDM4IGNvcHlzaWduICAgICAtc05hTjEwMSAgICAxMSAtPiBzTmFOMTAxCisKKy0tIGZpbml0ZXMKK2RxY3BzMTAxIGNvcHlzaWduICAgICAgICAgIDcgICAgICAxMSAtPiA3CitkcWNwczEwMiBjb3B5c2lnbiAgICAgICAgIC03ICAgICAgMTEgLT4gNworZHFjcHMxMDMgY29weXNpZ24gICAgICAgICA3NSAgICAgIDExIC0+IDc1CitkcWNwczEwNCBjb3B5c2lnbiAgICAgICAgLTc1ICAgICAgMTEgLT4gNzUKK2RxY3BzMTA1IGNvcHlzaWduICAgICAgIDcuNTAgICAgICAxMSAtPiA3LjUwCitkcWNwczEwNiBjb3B5c2lnbiAgICAgIC03LjUwICAgICAgMTEgLT4gNy41MAorZHFjcHMxMDcgY29weXNpZ24gICAgICAgNy41MDAgICAgIDExIC0+IDcuNTAwCitkcWNwczEwOCBjb3B5c2lnbiAgICAgIC03LjUwMCAgICAgMTEgLT4gNy41MDAKKworLS0gemVyb3MKK2RxY3BzMTExIGNvcHlzaWduICAgICAgICAgIDAgICAgICAxMSAtPiAwCitkcWNwczExMiBjb3B5c2lnbiAgICAgICAgIC0wICAgICAgMTEgLT4gMAorZHFjcHMxMTMgY29weXNpZ24gICAgICAgMEUrNCAgICAgIDExIC0+IDBFKzQKK2RxY3BzMTE0IGNvcHlzaWduICAgICAgLTBFKzQgICAgICAxMSAtPiAwRSs0CitkcWNwczExNSBjb3B5c2lnbiAgICAgMC4wMDAwICAgICAgMTEgLT4gMC4wMDAwCitkcWNwczExNiBjb3B5c2lnbiAgICAtMC4wMDAwICAgICAgMTEgLT4gMC4wMDAwCitkcWNwczExNyBjb3B5c2lnbiAgICAgIDBFLTE0MSAgICAgMTEgLT4gMEUtMTQxCitkcWNwczExOCBjb3B5c2lnbiAgICAgLTBFLTE0MSAgICAgMTEgLT4gMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitkcWNwczEyMSBjb3B5c2lnbiAgIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIgOCAgLT4gIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIKK2RxY3BzMTIyIGNvcHlzaWduICAtMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MiA4ICAtPiAgMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MgorZHFjcHMxMjMgY29weXNpZ24gICAxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxIDggIC0+ICAxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxCitkcWNwczEyNCBjb3B5c2lnbiAgLTEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEgOCAgLT4gIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RxY3BzMTMxIGNvcHlzaWduICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCA4IC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFjcHMxMzIgY29weXNpZ24gIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggLT4gIDFFLTYxNDMKK2RxY3BzMTMzIGNvcHlzaWduICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyA4IC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFjcHMxMzQgY29weXNpZ24gIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggLT4gIDFFLTYxNzYKKworZHFjcHMxMzUgY29weXNpZ24gIC0xRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IC0+ICAxRS02MTc2CitkcWNwczEzNiBjb3B5c2lnbiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzIDggLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkcWNwczEzNyBjb3B5c2lnbiAgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggLT4gIDFFLTYxNDMKK2RxY3BzMTM4IGNvcHlzaWduICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgOCAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKKworLS0gcmVwZWF0IHdpdGggbmVnYXRpdmUgUkhTCisKKy0tIEluZmluaXRpZXMKK2RxY3BzMjExIGNvcHlzaWduICBJbmZpbml0eSAgICAgICAtMzQgLT4gLUluZmluaXR5CitkcWNwczIxMiBjb3B5c2lnbiAgLUluZmluaXR5ICAgICAgLTM0IC0+IC1JbmZpbml0eQorCistLSBOYU5zLCAwIHBheWxvYWQKK2RxY3BzMjIxIGNvcHlzaWduICAgICAgICAgTmFOICAgICAtMzQgLT4gLU5hTgorZHFjcHMyMjIgY29weXNpZ24gICAgICAgIC1OYU4gICAgIC0zNCAtPiAtTmFOCitkcWNwczIyMyBjb3B5c2lnbiAgICAgICAgc05hTiAgICAgLTM0IC0+IC1zTmFOCitkcWNwczIyNCBjb3B5c2lnbiAgICAgICAtc05hTiAgICAgLTM0IC0+IC1zTmFOCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2RxY3BzMjMxIGNvcHlzaWduICAgICAgIE5hTjEwICAgICAtMzQgLT4gLU5hTjEwCitkcWNwczIzMiBjb3B5c2lnbiAgICAgIC1OYU4xMCAgICAgLTM0IC0+IC1OYU4xMAorZHFjcHMyMzMgY29weXNpZ24gICAgICBzTmFOMTAgICAgIC0zNCAtPiAtc05hTjEwCitkcWNwczIzNCBjb3B5c2lnbiAgICAgLXNOYU4xMCAgICAgLTM0IC0+IC1zTmFOMTAKK2RxY3BzMjM1IGNvcHlzaWduICAgICAgIE5hTjcgICAgICAtMzQgLT4gLU5hTjcKK2RxY3BzMjM2IGNvcHlzaWduICAgICAgLU5hTjcgICAgICAtMzQgLT4gLU5hTjcKK2RxY3BzMjM3IGNvcHlzaWduICAgICAgc05hTjEwMSAgICAtMzQgLT4gLXNOYU4xMDEKK2RxY3BzMjM4IGNvcHlzaWduICAgICAtc05hTjEwMSAgICAtMzQgLT4gLXNOYU4xMDEKKworLS0gZmluaXRlcworZHFjcHMzMDEgY29weXNpZ24gICAgICAgICAgNyAgICAgIC0zNCAtPiAtNworZHFjcHMzMDIgY29weXNpZ24gICAgICAgICAtNyAgICAgIC0zNCAtPiAtNworZHFjcHMzMDMgY29weXNpZ24gICAgICAgICA3NSAgICAgIC0zNCAtPiAtNzUKK2RxY3BzMzA0IGNvcHlzaWduICAgICAgICAtNzUgICAgICAtMzQgLT4gLTc1CitkcWNwczMwNSBjb3B5c2lnbiAgICAgICA3LjUwICAgICAgLTM0IC0+IC03LjUwCitkcWNwczMwNiBjb3B5c2lnbiAgICAgIC03LjUwICAgICAgLTM0IC0+IC03LjUwCitkcWNwczMwNyBjb3B5c2lnbiAgICAgICA3LjUwMCAgICAgLTM0IC0+IC03LjUwMAorZHFjcHMzMDggY29weXNpZ24gICAgICAtNy41MDAgICAgIC0zNCAtPiAtNy41MDAKKworLS0gemVyb3MKK2RxY3BzMzExIGNvcHlzaWduICAgICAgICAgIDAgICAgICAtMzQgLT4gLTAKK2RxY3BzMzEyIGNvcHlzaWduICAgICAgICAgLTAgICAgICAtMzQgLT4gLTAKK2RxY3BzMzEzIGNvcHlzaWduICAgICAgIDBFKzQgICAgICAtMzQgLT4gLTBFKzQKK2RxY3BzMzE0IGNvcHlzaWduICAgICAgLTBFKzQgICAgICAtMzQgLT4gLTBFKzQKK2RxY3BzMzE1IGNvcHlzaWduICAgICAwLjAwMDAgICAgICAtMzQgLT4gLTAuMDAwMAorZHFjcHMzMTYgY29weXNpZ24gICAgLTAuMDAwMCAgICAgIC0zNCAtPiAtMC4wMDAwCitkcWNwczMxNyBjb3B5c2lnbiAgICAgIDBFLTE0MSAgICAgLTM0IC0+IC0wRS0xNDEKK2RxY3BzMzE4IGNvcHlzaWduICAgICAtMEUtMTQxICAgICAtMzQgLT4gLTBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZHFjcHMzMjEgY29weXNpZ24gICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyIC05IC0+IC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcWNwczMyMiBjb3B5c2lnbiAgLTI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIgLTkgLT4gLTI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIKK2RxY3BzMzIzIGNvcHlzaWduICAgMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MSAtOSAtPiAtMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MQorZHFjcHMzMjQgY29weXNpZ24gIC0xMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxIC05IC0+IC0xMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcWNwczMzMSBjb3B5c2lnbiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTEgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFjcHMzMzIgY29weXNpZ24gIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICAtPiAtMUUtNjE0MworZHFjcHMzMzMgY29weXNpZ24gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzIC0xICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxY3BzMzM0IGNvcHlzaWduICAxRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgLT4gLTFFLTYxNzYKKworZHFjcHMzMzUgY29weXNpZ24gIC0xRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMyAtPiAtMUUtNjE3NgorZHFjcHMzMzYgY29weXNpZ24gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAtMyAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxY3BzMzM3IGNvcHlzaWduICAtMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMgLT4gLTFFLTYxNDMKK2RxY3BzMzM4IGNvcHlzaWduICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTMgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CisKKy0tIE90aGVyIGtpbmRzIG9mIFJIUworZHFjcHM0MDEgY29weXNpZ24gICAgICAgICAgNzAxICAgIC0zNCAtPiAtNzAxCitkcWNwczQwMiBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgLTM0IC0+IC03MjAKK2RxY3BzNDAzIGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtMCAgLT4gLTcwMQorZHFjcHM0MDQgY29weXNpZ24gICAgICAgICAtNzIwICAgIC0wICAtPiAtNzIwCitkcWNwczQwNSBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgKzAgIC0+ICA3MDEKK2RxY3BzNDA2IGNvcHlzaWduICAgICAgICAgLTcyMCAgICArMCAgLT4gIDcyMAorZHFjcHM0MDcgY29weXNpZ24gICAgICAgICAgNzAxICAgICszNCAtPiAgNzAxCitkcWNwczQwOCBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgKzM0IC0+ICA3MjAKKworZHFjcHM0MTMgY29weXNpZ24gICAgICAgICAgNzAxICAgIC1JbmYgIC0+IC03MDEKK2RxY3BzNDE0IGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtSW5mICAtPiAtNzIwCitkcWNwczQxNSBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgK0luZiAgLT4gIDcwMQorZHFjcHM0MTYgY29weXNpZ24gICAgICAgICAtNzIwICAgICtJbmYgIC0+ICA3MjAKKworZHFjcHM0MjAgY29weXNpZ24gICAgICAgICAgNzAxICAgIC1OYU4gIC0+IC03MDEKK2RxY3BzNDIxIGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtTmFOICAtPiAtNzIwCitkcWNwczQyMiBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgK05hTiAgLT4gIDcwMQorZHFjcHM0MjMgY29weXNpZ24gICAgICAgICAtNzIwICAgICtOYU4gIC0+ICA3MjAKK2RxY3BzNDI1IGNvcHlzaWduICAgICAgICAgLTcyMCAgICArTmFOOCAtPiAgNzIwCisKK2RxY3BzNDI2IGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtc05hTiAgLT4gLTcwMQorZHFjcHM0MjcgY29weXNpZ24gICAgICAgICAtNzIwICAgIC1zTmFOICAtPiAtNzIwCitkcWNwczQyOCBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgK3NOYU4gIC0+ICA3MDEKK2RxY3BzNDI5IGNvcHlzaWduICAgICAgICAgLTcyMCAgICArc05hTiAgLT4gIDcyMAorZHFjcHM0MzAgY29weXNpZ24gICAgICAgICAtNzIwICAgICtzTmFOMyAtPiAgNzIwCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFEaXZpZGUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFEaXZpZGUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWJiOTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcURpdmlkZS5kZWNUZXN0CkBAIC0wLDAgKzEsODA4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxRGl2aWRlLmRlY1Rlc3QgLS0gZGVjUXVhZCBkaXZpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZHFkaXYwMDEgZGl2aWRlICAxICAgICAxICAgIC0+ICAxCitkcWRpdjAwMiBkaXZpZGUgIDIgICAgIDEgICAgLT4gIDIKK2RxZGl2MDAzIGRpdmlkZSAgMSAgICAgMiAgICAtPiAgMC41CitkcWRpdjAwNCBkaXZpZGUgIDIgICAgIDIgICAgLT4gIDEKK2RxZGl2MDA1IGRpdmlkZSAgMCAgICAgMSAgICAtPiAgMAorZHFkaXYwMDYgZGl2aWRlICAwICAgICAyICAgIC0+ICAwCitkcWRpdjAwNyBkaXZpZGUgIDEgICAgIDMgICAgLT4gIDAuMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MDA4IGRpdmlkZSAgMiAgICAgMyAgICAtPiAgMC42NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY3IEluZXhhY3QgUm91bmRlZAorZHFkaXYwMDkgZGl2aWRlICAzICAgICAzICAgIC0+ICAxCisKK2RxZGl2MDEwIGRpdmlkZSAgMi40ICAgMSAgICAtPiAgMi40CitkcWRpdjAxMSBkaXZpZGUgIDIuNCAgIC0xICAgLT4gIC0yLjQKK2RxZGl2MDEyIGRpdmlkZSAgLTIuNCAgMSAgICAtPiAgLTIuNAorZHFkaXYwMTMgZGl2aWRlICAtMi40ICAtMSAgIC0+ICAyLjQKK2RxZGl2MDE0IGRpdmlkZSAgMi40MCAgMSAgICAtPiAgMi40MAorZHFkaXYwMTUgZGl2aWRlICAyLjQwMCAxICAgIC0+ICAyLjQwMAorZHFkaXYwMTYgZGl2aWRlICAyLjQgICAyICAgIC0+ICAxLjIKK2RxZGl2MDE3IGRpdmlkZSAgMi40MDAgMiAgICAtPiAgMS4yMDAKK2RxZGl2MDE4IGRpdmlkZSAgMi4gICAgMiAgICAtPiAgMQorZHFkaXYwMTkgZGl2aWRlICAyMCAgICAyMCAgIC0+ICAxCisKK2RxZGl2MDIwIGRpdmlkZSAgMTg3ICAgMTg3ICAgIC0+ICAxCitkcWRpdjAyMSBkaXZpZGUgIDUgICAgIDIgICAgICAtPiAgMi41CitkcWRpdjAyMiBkaXZpZGUgIDUwICAgIDIwICAgICAtPiAgMi41CitkcWRpdjAyMyBkaXZpZGUgIDUwMCAgIDIwMCAgICAtPiAgMi41CitkcWRpdjAyNCBkaXZpZGUgIDUwLjAgIDIwLjAgICAtPiAgMi41CitkcWRpdjAyNSBkaXZpZGUgIDUuMDAgIDIuMDAgICAtPiAgMi41CitkcWRpdjAyNiBkaXZpZGUgIDUgICAgIDIuMCAgICAtPiAgMi41CitkcWRpdjAyNyBkaXZpZGUgIDUgICAgIDIuMDAwICAtPiAgMi41CitkcWRpdjAyOCBkaXZpZGUgIDUgICAgIDAuMjAgICAtPiAgMjUKK2RxZGl2MDI5IGRpdmlkZSAgNSAgICAgMC4yMDAgIC0+ICAyNQorZHFkaXYwMzAgZGl2aWRlICAxMCAgICAxICAgICAgLT4gIDEwCitkcWRpdjAzMSBkaXZpZGUgIDEwMCAgIDEgICAgICAtPiAgMTAwCitkcWRpdjAzMiBkaXZpZGUgIDEwMDAgIDEgICAgICAtPiAgMTAwMAorZHFkaXYwMzMgZGl2aWRlICAxMDAwICAxMDAgICAgLT4gIDEwCisKK2RxZGl2MDM1IGRpdmlkZSAgMSAgICAgMiAgICAgIC0+ICAwLjUKK2RxZGl2MDM2IGRpdmlkZSAgMSAgICAgNCAgICAgIC0+ICAwLjI1CitkcWRpdjAzNyBkaXZpZGUgIDEgICAgIDggICAgICAtPiAgMC4xMjUKK2RxZGl2MDM4IGRpdmlkZSAgMSAgICAgMTYgICAgIC0+ICAwLjA2MjUKK2RxZGl2MDM5IGRpdmlkZSAgMSAgICAgMzIgICAgIC0+ICAwLjAzMTI1CitkcWRpdjA0MCBkaXZpZGUgIDEgICAgIDY0ICAgICAtPiAgMC4wMTU2MjUKK2RxZGl2MDQxIGRpdmlkZSAgMSAgICAtMiAgICAgIC0+ICAtMC41CitkcWRpdjA0MiBkaXZpZGUgIDEgICAgLTQgICAgICAtPiAgLTAuMjUKK2RxZGl2MDQzIGRpdmlkZSAgMSAgICAtOCAgICAgIC0+ICAtMC4xMjUKK2RxZGl2MDQ0IGRpdmlkZSAgMSAgICAtMTYgICAgIC0+ICAtMC4wNjI1CitkcWRpdjA0NSBkaXZpZGUgIDEgICAgLTMyICAgICAtPiAgLTAuMDMxMjUKK2RxZGl2MDQ2IGRpdmlkZSAgMSAgICAtNjQgICAgIC0+ICAtMC4wMTU2MjUKK2RxZGl2MDQ3IGRpdmlkZSAtMSAgICAgMiAgICAgIC0+ICAtMC41CitkcWRpdjA0OCBkaXZpZGUgLTEgICAgIDQgICAgICAtPiAgLTAuMjUKK2RxZGl2MDQ5IGRpdmlkZSAtMSAgICAgOCAgICAgIC0+ICAtMC4xMjUKK2RxZGl2MDUwIGRpdmlkZSAtMSAgICAgMTYgICAgIC0+ICAtMC4wNjI1CitkcWRpdjA1MSBkaXZpZGUgLTEgICAgIDMyICAgICAtPiAgLTAuMDMxMjUKK2RxZGl2MDUyIGRpdmlkZSAtMSAgICAgNjQgICAgIC0+ICAtMC4wMTU2MjUKK2RxZGl2MDUzIGRpdmlkZSAtMSAgICAtMiAgICAgIC0+ICAwLjUKK2RxZGl2MDU0IGRpdmlkZSAtMSAgICAtNCAgICAgIC0+ICAwLjI1CitkcWRpdjA1NSBkaXZpZGUgLTEgICAgLTggICAgICAtPiAgMC4xMjUKK2RxZGl2MDU2IGRpdmlkZSAtMSAgICAtMTYgICAgIC0+ICAwLjA2MjUKK2RxZGl2MDU3IGRpdmlkZSAtMSAgICAtMzIgICAgIC0+ICAwLjAzMTI1CitkcWRpdjA1OCBkaXZpZGUgLTEgICAgLTY0ICAgICAtPiAgMC4wMTU2MjUKKworLS0gYmNkVGltZQorZHFkaXYwNjAgZGl2aWRlICAxIDcgICAgICAgICAgICAgICAgICAgLT4gMC4xNDI4NTcxNDI4NTcxNDI4NTcxNDI4NTcxNDI4NTcxNDI5IEluZXhhY3QgUm91bmRlZAorZHFkaXYwNjEgZGl2aWRlIDEuMjM0NTY3OCAgMS45ODc2NTQzICAgLT4gMC42MjExMTc5NjgwNDkwNzE3MTIzMTkzOTA3NTExOTg1MzU5IEluZXhhY3QgUm91bmRlZAorCistLSAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RxZGl2MDY3IGRpdmlkZSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgMSAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFkaXYwNjggZGl2aWRlICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAxIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxZGl2MDY5IGRpdmlkZSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgMSAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxZGl2MDcwIGRpdmlkZSAgOTk5OTk5OTk5OTk5OTk5OTkgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTk5OTk5OTk5OTk5OTkKK2RxZGl2MDcxIGRpdmlkZSAgOTk5OTk5OTk5OTk5OTk5OSAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTk5OTk5OTk5OTk5OQorZHFkaXYwNzIgZGl2aWRlICA5OTk5OTk5OTk5OTk5OTkgICAgICAgICAgICAgICAgICAgICAxIC0+ICA5OTk5OTk5OTk5OTk5OTkKK2RxZGl2MDczIGRpdmlkZSAgOTk5OTk5OTk5OTk5OTkgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTk5OTk5OTk5OTkKK2RxZGl2MDc0IGRpdmlkZSAgOTk5OTk5OTk5OTk5OSAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTk5OTk5OTk5OQorZHFkaXYwNzUgZGl2aWRlICA5OTk5OTk5OTk5OTkgICAgICAgICAgICAgICAgICAgICAgICAxIC0+ICA5OTk5OTk5OTk5OTkKK2RxZGl2MDc2IGRpdmlkZSAgOTk5OTk5OTk5OTkgICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTk5OTk5OTkKK2RxZGl2MDc3IGRpdmlkZSAgOTk5OTk5OTk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTk5OTk5OQorZHFkaXYwNzggZGl2aWRlICA5OTk5OTk5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0+ICA5OTk5OTk5OTkKK2RxZGl2MDc5IGRpdmlkZSAgOTk5OTk5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTk5OTkKK2RxZGl2MDgwIGRpdmlkZSAgOTk5OTk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTk5OQorZHFkaXYwODEgZGl2aWRlICA5OTk5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0+ICA5OTk5OTkKK2RxZGl2MDgyIGRpdmlkZSAgOTk5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTkKK2RxZGl2MDgzIGRpdmlkZSAgOTk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OQorZHFkaXYwODQgZGl2aWRlICA5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0+ICA5OTkKK2RxZGl2MDg1IGRpdmlkZSAgOTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTkKK2RxZGl2MDg2IGRpdmlkZSAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOQorCitkcWRpdjA5MCBkaXZpZGUgIDAuICAgICAgICAgICAgMSAgICAtPiAgMAorZHFkaXYwOTEgZGl2aWRlICAuMCAgICAgICAgICAgIDEgICAgLT4gIDAuMAorZHFkaXYwOTIgZGl2aWRlICAwLjAwICAgICAgICAgIDEgICAgLT4gIDAuMDAKK2RxZGl2MDkzIGRpdmlkZSAgMC4wMEUrOSAgICAgICAxICAgIC0+ICAwRSs3CitkcWRpdjA5NCBkaXZpZGUgIDAuMDAwMEUtNTAgICAgMSAgICAtPiAgMEUtNTQKKworZHFkaXYwOTUgZGl2aWRlICAxICAgICAgICAgICAgMUUtOCAgLT4gIDFFKzgKK2RxZGl2MDk2IGRpdmlkZSAgMSAgICAgICAgICAgIDFFLTkgIC0+ICAxRSs5CitkcWRpdjA5NyBkaXZpZGUgIDEgICAgICAgICAgICAxRS0xMCAtPiAgMUUrMTAKK2RxZGl2MDk4IGRpdmlkZSAgMSAgICAgICAgICAgIDFFLTExIC0+ICAxRSsxMQorZHFkaXYwOTkgZGl2aWRlICAxICAgICAgICAgICAgMUUtMTIgLT4gIDFFKzEyCisKK2RxZGl2MTAwIGRpdmlkZSAgMSAgMSAgIC0+IDEKK2RxZGl2MTAxIGRpdmlkZSAgMSAgMiAgIC0+IDAuNQorZHFkaXYxMDIgZGl2aWRlICAxICAzICAgLT4gMC4zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzIEluZXhhY3QgUm91bmRlZAorZHFkaXYxMDMgZGl2aWRlICAxICA0ICAgLT4gMC4yNQorZHFkaXYxMDQgZGl2aWRlICAxICA1ICAgLT4gMC4yCitkcWRpdjEwNSBkaXZpZGUgIDEgIDYgICAtPiAwLjE2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjcgSW5leGFjdCBSb3VuZGVkCitkcWRpdjEwNiBkaXZpZGUgIDEgIDcgICAtPiAwLjE0Mjg1NzE0Mjg1NzE0Mjg1NzE0Mjg1NzE0Mjg1NzE0MjkgSW5leGFjdCBSb3VuZGVkCitkcWRpdjEwNyBkaXZpZGUgIDEgIDggICAtPiAwLjEyNQorZHFkaXYxMDggZGl2aWRlICAxICA5ICAgLT4gMC4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIEluZXhhY3QgUm91bmRlZAorZHFkaXYxMDkgZGl2aWRlICAxICAxMCAgLT4gMC4xCitkcWRpdjExMCBkaXZpZGUgIDEgIDEgICAtPiAxCitkcWRpdjExMSBkaXZpZGUgIDIgIDEgICAtPiAyCitkcWRpdjExMiBkaXZpZGUgIDMgIDEgICAtPiAzCitkcWRpdjExMyBkaXZpZGUgIDQgIDEgICAtPiA0CitkcWRpdjExNCBkaXZpZGUgIDUgIDEgICAtPiA1CitkcWRpdjExNSBkaXZpZGUgIDYgIDEgICAtPiA2CitkcWRpdjExNiBkaXZpZGUgIDcgIDEgICAtPiA3CitkcWRpdjExNyBkaXZpZGUgIDggIDEgICAtPiA4CitkcWRpdjExOCBkaXZpZGUgIDkgIDEgICAtPiA5CitkcWRpdjExOSBkaXZpZGUgIDEwIDEgICAtPiAxMAorCitkcWRpdjEyMCBkaXZpZGUgIDNFKzEgMC4wMDEgIC0+IDNFKzQKK2RxZGl2MTIxIGRpdmlkZSAgMi4yMDAgMiAgICAgLT4gMS4xMDAKKworZHFkaXYxMzAgZGl2aWRlICAxMjM0NSAgNC45OTkgIC0+IDI0NjkuNDkzODk4Nzc5NzU1OTUxMTkwMjM4MDQ3NjA5NTIyICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTMxIGRpdmlkZSAgMTIzNDUgIDQuOTkgICAtPiAyNDczLjk0Nzg5NTc5MTU4MzE2NjMzMjY2NTMzMDY2MTMyMyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjEzMiBkaXZpZGUgIDEyMzQ1ICA0LjkgICAgLT4gMjUxOS4zODc3NTUxMDIwNDA4MTYzMjY1MzA2MTIyNDQ4OTggIEluZXhhY3QgUm91bmRlZAorZHFkaXYxMzMgZGl2aWRlICAxMjM0NSAgNSAgICAgIC0+IDI0NjkKK2RxZGl2MTM0IGRpdmlkZSAgMTIzNDUgIDUuMSAgICAtPiAyNDIwLjU4ODIzNTI5NDExNzY0NzA1ODgyMzUyOTQxMTc2NSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjEzNSBkaXZpZGUgIDEyMzQ1ICA1LjAxICAgLT4gMjQ2NC4wNzE4NTYyODc0MjUxNDk3MDA1OTg4MDIzOTUyMTAgIEluZXhhY3QgUm91bmRlZAorZHFkaXYxMzYgZGl2aWRlICAxMjM0NSAgNS4wMDEgIC0+IDI0NjguNTA2Mjk4NzQwMjUxOTQ5NjEwMDc3OTg0NDAzMTE5ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gdGVzdCBwb3NzaWJseSBpbXByZWNpc2UgcmVzdWx0cworZHFkaXYyMjAgZGl2aWRlIDM5MSAgIDU5NyAtPiAgMC42NTQ5NDEzNzM1MzQzMzgzNTg0NTg5NjE0NzQwMzY4NTA5ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjIxIGRpdmlkZSAzOTEgIC01OTcgLT4gLTAuNjU0OTQxMzczNTM0MzM4MzU4NDU4OTYxNDc0MDM2ODUwOSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIyMiBkaXZpZGUgLTM5MSAgNTk3IC0+IC0wLjY1NDk0MTM3MzUzNDMzODM1ODQ1ODk2MTQ3NDAzNjg1MDkgIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMjMgZGl2aWRlIC0zOTEgLTU5NyAtPiAgMC42NTQ5NDEzNzM1MzQzMzgzNTg0NTg5NjE0NzQwMzY4NTA5ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gdGVzdCBzb21lIGNhc2VzIHRoYXQgYXJlIGNsb3NlIHRvIGV4cG9uZW50IG92ZXJmbG93CitkcWRpdjI3MCBkaXZpZGUgMSAxZTYxNDQgICAgICAgICAgICAgICAgICAtPiAxRS02MTQ0ICAgICAgICAgICAgICAgICBTdWJub3JtYWwKK2RxZGl2MjcxIGRpdmlkZSAxIDAuOWU2MTQ0ICAgICAgICAgICAgICAgIC0+IDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFFLTYxNDQgIFJvdW5kZWQgSW5leGFjdCBTdWJub3JtYWwgVW5kZXJmbG93CitkcWRpdjI3MiBkaXZpZGUgMSAwLjk5ZTYxNDQgICAgICAgICAgICAgICAtPiAxLjAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxRS02MTQ0ICBSb3VuZGVkIEluZXhhY3QgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFkaXYyNzMgZGl2aWRlIDEgMC45OTk5OTk5OTk5OTk5OTk5ZTYxNDQgLT4gMS4wMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMUUtNjE0NCAgUm91bmRlZCBJbmV4YWN0IFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxZGl2Mjc0IGRpdmlkZSA5ZTYxNDQgICAgMSAgICAgICAgICAgICAgIC0+IDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0IENsYW1wZWQKK2RxZGl2Mjc1IGRpdmlkZSA5LjllNjE0NCAgMSAgICAgICAgICAgICAgIC0+IDkuOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0IENsYW1wZWQKK2RxZGl2Mjc2IGRpdmlkZSA5Ljk5ZTYxNDQgMSAgICAgICAgICAgICAgIC0+IDkuOTkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0IENsYW1wZWQKK2RxZGl2Mjc3IGRpdmlkZSA5Ljk5OTk5OTk5OTk5OTk5OWU2MTQ0IDEgIC0+IDkuOTk5OTk5OTk5OTk5OTk5MDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0IENsYW1wZWQKKworZHFkaXYyNzggZGl2aWRlIDEgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ZTYxNDQgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NCAgUm91bmRlZCBJbmV4YWN0IFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxZGl2Mjc5IGRpdmlkZSA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OWU2MTQ0IDEgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CisKKy0tIERpdmlkZSBpbnRvIDAgdGVzdHMKK2RxZGl2MzAxIGRpdmlkZSAgICAwICAgIDcgICAgIC0+IDAKK2RxZGl2MzAyIGRpdmlkZSAgICAwICAgIDdFLTUgIC0+IDBFKzUKK2RxZGl2MzAzIGRpdmlkZSAgICAwICAgIDdFLTEgIC0+IDBFKzEKK2RxZGl2MzA0IGRpdmlkZSAgICAwICAgIDdFKzEgIC0+IDAuMAorZHFkaXYzMDUgZGl2aWRlICAgIDAgICAgN0UrNSAgLT4gMC4wMDAwMAorZHFkaXYzMDYgZGl2aWRlICAgIDAgICAgN0UrNiAgLT4gMC4wMDAwMDAKK2RxZGl2MzA3IGRpdmlkZSAgICAwICAgIDdFKzcgIC0+IDBFLTcKK2RxZGl2MzA4IGRpdmlkZSAgICAwICAgNzBFLTUgIC0+IDBFKzUKK2RxZGl2MzA5IGRpdmlkZSAgICAwICAgNzBFLTEgIC0+IDBFKzEKK2RxZGl2MzEwIGRpdmlkZSAgICAwICAgNzBFKzAgIC0+IDAKK2RxZGl2MzExIGRpdmlkZSAgICAwICAgNzBFKzEgIC0+IDAuMAorZHFkaXYzMTIgZGl2aWRlICAgIDAgICA3MEUrNSAgLT4gMC4wMDAwMAorZHFkaXYzMTMgZGl2aWRlICAgIDAgICA3MEUrNiAgLT4gMC4wMDAwMDAKK2RxZGl2MzE0IGRpdmlkZSAgICAwICAgNzBFKzcgIC0+IDBFLTcKK2RxZGl2MzE1IGRpdmlkZSAgICAwICA3MDBFLTUgIC0+IDBFKzUKK2RxZGl2MzE2IGRpdmlkZSAgICAwICA3MDBFLTEgIC0+IDBFKzEKK2RxZGl2MzE3IGRpdmlkZSAgICAwICA3MDBFKzAgIC0+IDAKK2RxZGl2MzE4IGRpdmlkZSAgICAwICA3MDBFKzEgIC0+IDAuMAorZHFkaXYzMTkgZGl2aWRlICAgIDAgIDcwMEUrNSAgLT4gMC4wMDAwMAorZHFkaXYzMjAgZGl2aWRlICAgIDAgIDcwMEUrNiAgLT4gMC4wMDAwMDAKK2RxZGl2MzIxIGRpdmlkZSAgICAwICA3MDBFKzcgIC0+IDBFLTcKK2RxZGl2MzIyIGRpdmlkZSAgICAwICA3MDBFKzc3IC0+IDBFLTc3CisKK2RxZGl2MzMxIGRpdmlkZSAwRS0zICAgIDdFLTUgIC0+IDBFKzIKK2RxZGl2MzMyIGRpdmlkZSAwRS0zICAgIDdFLTEgIC0+IDAuMDAKK2RxZGl2MzMzIGRpdmlkZSAwRS0zICAgIDdFKzEgIC0+IDAuMDAwMAorZHFkaXYzMzQgZGl2aWRlIDBFLTMgICAgN0UrNSAgLT4gMEUtOAorZHFkaXYzMzUgZGl2aWRlIDBFLTEgICAgN0UtNSAgLT4gMEUrNAorZHFkaXYzMzYgZGl2aWRlIDBFLTEgICAgN0UtMSAgLT4gMAorZHFkaXYzMzcgZGl2aWRlIDBFLTEgICAgN0UrMSAgLT4gMC4wMAorZHFkaXYzMzggZGl2aWRlIDBFLTEgICAgN0UrNSAgLT4gMC4wMDAwMDAKK2RxZGl2MzM5IGRpdmlkZSAwRSsxICAgIDdFLTUgIC0+IDBFKzYKK2RxZGl2MzQwIGRpdmlkZSAwRSsxICAgIDdFLTEgIC0+IDBFKzIKK2RxZGl2MzQxIGRpdmlkZSAwRSsxICAgIDdFKzEgIC0+IDAKK2RxZGl2MzQyIGRpdmlkZSAwRSsxICAgIDdFKzUgIC0+IDAuMDAwMAorZHFkaXYzNDMgZGl2aWRlIDBFKzMgICAgN0UtNSAgLT4gMEUrOAorZHFkaXYzNDQgZGl2aWRlIDBFKzMgICAgN0UtMSAgLT4gMEUrNAorZHFkaXYzNDUgZGl2aWRlIDBFKzMgICAgN0UrMSAgLT4gMEUrMgorZHFkaXYzNDYgZGl2aWRlIDBFKzMgICAgN0UrNSAgLT4gMC4wMAorCistLSBUaGVzZSB3ZXJlICdpbnB1dCByb3VuZGluZycKK2RxZGl2NDQxIGRpdmlkZSAxMjM0NTY3ODAwMCAxIC0+IDEyMzQ1Njc4MDAwCitkcWRpdjQ0MiBkaXZpZGUgMSAxMjM0NTY3ODAwMCAtPiA4LjEwMDAwMDY2NDIwMDA1NDQ2NDQwNDQ2NjA4MTE2NjIxOUUtMTEgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQ0MyBkaXZpZGUgMTIzNDU2NzgwMCAgMSAtPiAxMjM0NTY3ODAwCitkcWRpdjQ0NCBkaXZpZGUgMSAxMjM0NTY3ODAwICAtPiA4LjEwMDAwMDY2NDIwMDA1NDQ2NDQwNDQ2NjA4MTE2NjIxOUUtMTAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQ0NSBkaXZpZGUgMTIzNDU2Nzg5MCAgMSAtPiAxMjM0NTY3ODkwCitkcWRpdjQ0NiBkaXZpZGUgMSAxMjM0NTY3ODkwICAtPiA4LjEwMDAwMDA3MzcxMDAwMDY3MDc2MTAwNjEwMzkyNTE1NkUtMTAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQ0NyBkaXZpZGUgMTIzNDU2Nzg5MSAgMSAtPiAxMjM0NTY3ODkxCitkcWRpdjQ0OCBkaXZpZGUgMSAxMjM0NTY3ODkxICAtPiA4LjEwMDAwMDA2NzE0OTAwMDU1NjY2NTIxNDYxNDc1NDYyOUUtMTAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQ0OSBkaXZpZGUgMTIzNDU2Nzg5MDEgMSAtPiAxMjM0NTY3ODkwMQorZHFkaXY0NTAgZGl2aWRlIDEgMTIzNDU2Nzg5MDEgLT4gOC4xMDAwMDAwNzMwNTM5MDA2NTg4NzMxMzAwNDIzNzY3NjBFLTExIEluZXhhY3QgUm91bmRlZAorZHFkaXY0NTEgZGl2aWRlIDEyMzQ1Njc4OTYgIDEgLT4gMTIzNDU2Nzg5NgorZHFkaXY0NTIgZGl2aWRlIDEgMTIzNDU2Nzg5NiAgLT4gOC4xMDAwMDAwMzQzNDQwMDAxNDU2MTg1NjA2MTc0MjI2OTdFLTEwIEluZXhhY3QgUm91bmRlZAorCistLSBoaWdoLWxvd3MKK2RxZGl2NDUzIGRpdmlkZSAxZSsxICAgMSAgICAtPiAgIDFFKzEKK2RxZGl2NDU0IGRpdmlkZSAxZSsxICAgMS4wICAtPiAgIDFFKzEKK2RxZGl2NDU1IGRpdmlkZSAxZSsxICAgMS4wMCAtPiAgIDFFKzEKK2RxZGl2NDU2IGRpdmlkZSAxZSsyICAgMiAgICAtPiAgIDVFKzEKK2RxZGl2NDU3IGRpdmlkZSAxZSsyICAgMi4wICAtPiAgIDVFKzEKK2RxZGl2NDU4IGRpdmlkZSAxZSsyICAgMi4wMCAtPiAgIDVFKzEKKworLS0gc29tZSBmcm9tIElFRUUgZGlzY3Vzc2lvbnMKK2RxZGl2NDYwIGRpdmlkZSAzZTAgICAgICAyZTAgICAgIC0+IDEuNQorZHFkaXY0NjEgZGl2aWRlIDMwZS0xICAgIDJlMCAgICAgLT4gMS41CitkcWRpdjQ2MiBkaXZpZGUgMzAwZS0yICAgMmUwICAgICAtPiAxLjUwCitkcWRpdjQ2NCBkaXZpZGUgMzAwMGUtMyAgMmUwICAgICAtPiAxLjUwMAorZHFkaXY0NjUgZGl2aWRlIDNlMCAgICAgIDIwZS0xICAgLT4gMS41CitkcWRpdjQ2NiBkaXZpZGUgMzBlLTEgICAgMjBlLTEgICAtPiAxLjUKK2RxZGl2NDY3IGRpdmlkZSAzMDBlLTIgICAyMGUtMSAgIC0+IDEuNQorZHFkaXY0NjggZGl2aWRlIDMwMDBlLTMgIDIwZS0xICAgLT4gMS41MAorZHFkaXY0NjkgZGl2aWRlIDNlMCAgICAgIDIwMGUtMiAgLT4gMS41CitkcWRpdjQ3MCBkaXZpZGUgMzBlLTEgICAgMjAwZS0yICAtPiAxLjUKK2RxZGl2NDcxIGRpdmlkZSAzMDBlLTIgICAyMDBlLTIgIC0+IDEuNQorZHFkaXY0NzIgZGl2aWRlIDMwMDBlLTMgIDIwMGUtMiAgLT4gMS41CitkcWRpdjQ3MyBkaXZpZGUgM2UwICAgICAgMjAwMGUtMyAtPiAxLjUKK2RxZGl2NDc0IGRpdmlkZSAzMGUtMSAgICAyMDAwZS0zIC0+IDEuNQorZHFkaXY0NzUgZGl2aWRlIDMwMGUtMiAgIDIwMDBlLTMgLT4gMS41CitkcWRpdjQ3NiBkaXZpZGUgMzAwMGUtMyAgMjAwMGUtMyAtPiAxLjUKKworLS0gc29tZSByZWNpcHJvY2FscworZHFkaXY0ODAgZGl2aWRlIDEgICAgICAgIDEuMEUrMzMgLT4gMUUtMzMKK2RxZGl2NDgxIGRpdmlkZSAxICAgICAgICAxMEUrMzMgIC0+IDFFLTM0CitkcWRpdjQ4MiBkaXZpZGUgMSAgICAgICAgMS4wRS0zMyAtPiAxRSszMworZHFkaXY0ODMgZGl2aWRlIDEgICAgICAgIDEwRS0zMyAgLT4gMUUrMzIKKworLS0gUk1TIGRpc2N1c3Npb24gdGFibGUKK2RxZGl2NDg0IGRpdmlkZSAwZTUgICAgIDFlMyAtPiAgIDBFKzIKK2RxZGl2NDg1IGRpdmlkZSAwZTUgICAgIDJlMyAtPiAgIDBFKzIKK2RxZGl2NDg2IGRpdmlkZSAwZTUgICAgMTBlMiAtPiAgIDBFKzMKK2RxZGl2NDg3IGRpdmlkZSAwZTUgICAgMjBlMiAtPiAgIDBFKzMKK2RxZGl2NDg4IGRpdmlkZSAwZTUgICAxMDBlMSAtPiAgIDBFKzQKK2RxZGl2NDg5IGRpdmlkZSAwZTUgICAyMDBlMSAtPiAgIDBFKzQKKworZHFkaXY0OTEgZGl2aWRlIDFlNSAgICAgMWUzIC0+ICAgMUUrMgorZHFkaXY0OTIgZGl2aWRlIDFlNSAgICAgMmUzIC0+ICAgNUUrMQorZHFkaXY0OTMgZGl2aWRlIDFlNSAgICAxMGUyIC0+ICAgMUUrMgorZHFkaXY0OTQgZGl2aWRlIDFlNSAgICAyMGUyIC0+ICAgNUUrMQorZHFkaXY0OTUgZGl2aWRlIDFlNSAgIDEwMGUxIC0+ICAgMUUrMgorZHFkaXY0OTYgZGl2aWRlIDFlNSAgIDIwMGUxIC0+ICAgNUUrMQorCistLSB0cnl6ZXJvcyBjYXNlcworcm91bmRpbmc6ICAgIGhhbGZfdXAKK2RxZGl2NDk3ICBkaXZpZGUgIDBFKzYxMDggMTAwMEUtMzMgIC0+IDBFKzYxMTEgQ2xhbXBlZAorZHFkaXY0OTggIGRpdmlkZSAgMEUtNjE3MCAxMDAwRSszMyAgLT4gMEUtNjE3NiBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX3VwCisKKy0tIGZvY3VzIG9uIHRyYWlsaW5nIHplcm9zIGlzc3VlcworZHFkaXY1MDAgZGl2aWRlICAxICAgICAgOS45ICAgIC0+ICAwLjEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAgIEluZXhhY3QgUm91bmRlZAorZHFkaXY1MDEgZGl2aWRlICAxICAgICAgOS4wOSAgIC0+ICAwLjExMDAxMTAwMTEwMDExMDAxMTAwMTEwMDExMDAxMTAwMTEgIEluZXhhY3QgUm91bmRlZAorZHFkaXY1MDIgZGl2aWRlICAxICAgICAgOS4wMDkgIC0+ICAwLjExMTAwMDExMTAwMDExMTAwMDExMTAwMDExMTAwMDExMTAgIEluZXhhY3QgUm91bmRlZAorCitkcWRpdjUxMSBkaXZpZGUgMSAgICAgICAgIDIgICAgLT4gMC41CitkcWRpdjUxMiBkaXZpZGUgMS4wICAgICAgIDIgICAgLT4gMC41CitkcWRpdjUxMyBkaXZpZGUgMS4wMCAgICAgIDIgICAgLT4gMC41MAorZHFkaXY1MTQgZGl2aWRlIDEuMDAwICAgICAyICAgIC0+IDAuNTAwCitkcWRpdjUxNSBkaXZpZGUgMS4wMDAwICAgIDIgICAgLT4gMC41MDAwCitkcWRpdjUxNiBkaXZpZGUgMS4wMDAwMCAgIDIgICAgLT4gMC41MDAwMAorZHFkaXY1MTcgZGl2aWRlIDEuMDAwMDAwICAyICAgIC0+IDAuNTAwMDAwCitkcWRpdjUxOCBkaXZpZGUgMS4wMDAwMDAwIDIgICAgLT4gMC41MDAwMDAwCitkcWRpdjUxOSBkaXZpZGUgMS4wMCAgICAgIDIuMDAgLT4gMC41CisKK2RxZGl2NTIxIGRpdmlkZSAyICAgIDEgICAgICAgICAtPiAyCitkcWRpdjUyMiBkaXZpZGUgMiAgICAxLjAgICAgICAgLT4gMgorZHFkaXY1MjMgZGl2aWRlIDIgICAgMS4wMCAgICAgIC0+IDIKK2RxZGl2NTI0IGRpdmlkZSAyICAgIDEuMDAwICAgICAtPiAyCitkcWRpdjUyNSBkaXZpZGUgMiAgICAxLjAwMDAgICAgLT4gMgorZHFkaXY1MjYgZGl2aWRlIDIgICAgMS4wMDAwMCAgIC0+IDIKK2RxZGl2NTI3IGRpdmlkZSAyICAgIDEuMDAwMDAwICAtPiAyCitkcWRpdjUyOCBkaXZpZGUgMiAgICAxLjAwMDAwMDAgLT4gMgorZHFkaXY1MjkgZGl2aWRlIDIuMDAgMS4wMCAgICAgIC0+IDIKKworZHFkaXY1MzAgZGl2aWRlICAyLjQwICAgMiAgICAgIC0+ICAxLjIwCitkcWRpdjUzMSBkaXZpZGUgIDIuNDAgICA0ICAgICAgLT4gIDAuNjAKK2RxZGl2NTMyIGRpdmlkZSAgMi40MCAgMTAgICAgICAtPiAgMC4yNAorZHFkaXY1MzMgZGl2aWRlICAyLjQwICAgMi4wICAgIC0+ICAxLjIKK2RxZGl2NTM0IGRpdmlkZSAgMi40MCAgIDQuMCAgICAtPiAgMC42CitkcWRpdjUzNSBkaXZpZGUgIDIuNDAgIDEwLjAgICAgLT4gIDAuMjQKK2RxZGl2NTM2IGRpdmlkZSAgMi40MCAgIDIuMDAgICAtPiAgMS4yCitkcWRpdjUzNyBkaXZpZGUgIDIuNDAgICA0LjAwICAgLT4gIDAuNgorZHFkaXY1MzggZGl2aWRlICAyLjQwICAxMC4wMCAgIC0+ICAwLjI0CitkcWRpdjUzOSBkaXZpZGUgIDAuOSAgICAwLjEgICAgLT4gIDkKK2RxZGl2NTQwIGRpdmlkZSAgMC45ICAgIDAuMDEgICAtPiAgOUUrMQorZHFkaXY1NDEgZGl2aWRlICAwLjkgICAgMC4wMDEgIC0+ICA5RSsyCitkcWRpdjU0MiBkaXZpZGUgIDUgICAgICAyICAgICAgLT4gIDIuNQorZHFkaXY1NDMgZGl2aWRlICA1ICAgICAgMi4wICAgIC0+ICAyLjUKK2RxZGl2NTQ0IGRpdmlkZSAgNSAgICAgIDIuMDAgICAtPiAgMi41CitkcWRpdjU0NSBkaXZpZGUgIDUgICAgICAyMCAgICAgLT4gIDAuMjUKK2RxZGl2NTQ2IGRpdmlkZSAgNSAgICAgIDIwLjAgICAtPiAgMC4yNQorZHFkaXY1NDcgZGl2aWRlICAyLjQwMCAgMiAgICAgIC0+ICAxLjIwMAorZHFkaXY1NDggZGl2aWRlICAyLjQwMCAgMi4wICAgIC0+ICAxLjIwCitkcWRpdjU0OSBkaXZpZGUgIDIuNDAwICAyLjQwMCAgLT4gIDEKKworZHFkaXY1NTAgZGl2aWRlICAyNDAgICAgMSAgICAgIC0+ICAyNDAKK2RxZGl2NTUxIGRpdmlkZSAgMjQwICAgIDEwICAgICAtPiAgMjQKK2RxZGl2NTUyIGRpdmlkZSAgMjQwICAgIDEwMCAgICAtPiAgMi40CitkcWRpdjU1MyBkaXZpZGUgIDI0MCAgICAxMDAwICAgLT4gIDAuMjQKK2RxZGl2NTU0IGRpdmlkZSAgMjQwMCAgIDEgICAgICAtPiAgMjQwMAorZHFkaXY1NTUgZGl2aWRlICAyNDAwICAgMTAgICAgIC0+ICAyNDAKK2RxZGl2NTU2IGRpdmlkZSAgMjQwMCAgIDEwMCAgICAtPiAgMjQKK2RxZGl2NTU3IGRpdmlkZSAgMjQwMCAgIDEwMDAgICAtPiAgMi40CisKKy0tICt2ZSBleHBvbmVudAorZHFkaXY2MDAgZGl2aWRlICAyLjRFKzkgICAgIDIgIC0+ICAxLjJFKzkKK2RxZGl2NjAxIGRpdmlkZSAgMi40MEUrOSAgICAyICAtPiAgMS4yMEUrOQorZHFkaXY2MDIgZGl2aWRlICAyLjQwMEUrOSAgIDIgIC0+ICAxLjIwMEUrOQorZHFkaXY2MDMgZGl2aWRlICAyLjQwMDBFKzkgIDIgIC0+ICAxLjIwMDBFKzkKK2RxZGl2NjA0IGRpdmlkZSAgMjRFKzggICAgICAyICAtPiAgMS4yRSs5CitkcWRpdjYwNSBkaXZpZGUgIDI0MEUrNyAgICAgMiAgLT4gIDEuMjBFKzkKK2RxZGl2NjA2IGRpdmlkZSAgMjQwMEUrNiAgICAyICAtPiAgMS4yMDBFKzkKK2RxZGl2NjA3IGRpdmlkZSAgMjQwMDBFKzUgICAyICAtPiAgMS4yMDAwRSs5CisKKy0tIG1vcmUgemVyb3MsIGV0Yy4KK2RxZGl2NzMxIGRpdmlkZSA1LjAwIDFFLTMgICAgLT4gNS4wMEUrMworZHFkaXY3MzIgZGl2aWRlIDAwLjAwIDAuMDAwICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcWRpdjczMyBkaXZpZGUgMDAuMDAgMEUtMyAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxZGl2NzM0IGRpdmlkZSAgMCAgICAtMCAgICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFkaXY3MzUgZGl2aWRlIC0wICAgICAwICAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcWRpdjczNiBkaXZpZGUgLTAgICAgLTAgICAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKKworZHFkaXY3NDEgZGl2aWRlICAwICAgIC0xICAgICAtPiAtMAorZHFkaXY3NDIgZGl2aWRlIC0wICAgIC0xICAgICAtPiAgMAorZHFkaXY3NDMgZGl2aWRlICAwICAgICAxICAgICAtPiAgMAorZHFkaXY3NDQgZGl2aWRlIC0wICAgICAxICAgICAtPiAtMAorZHFkaXY3NDUgZGl2aWRlIC0xICAgICAwICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY3NDYgZGl2aWRlIC0xICAgIC0wICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY3NDcgZGl2aWRlICAxICAgICAwICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY3NDggZGl2aWRlICAxICAgIC0wICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkcWRpdjc1MSBkaXZpZGUgIDAuMCAgLTEgICAgIC0+IC0wLjAKK2RxZGl2NzUyIGRpdmlkZSAtMC4wICAtMSAgICAgLT4gIDAuMAorZHFkaXY3NTMgZGl2aWRlICAwLjAgICAxICAgICAtPiAgMC4wCitkcWRpdjc1NCBkaXZpZGUgLTAuMCAgIDEgICAgIC0+IC0wLjAKK2RxZGl2NzU1IGRpdmlkZSAtMS4wICAgMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2NzU2IGRpdmlkZSAtMS4wICAtMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2NzU3IGRpdmlkZSAgMS4wICAgMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2NzU4IGRpdmlkZSAgMS4wICAtMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZHFkaXY3NjEgZGl2aWRlICAwICAgIC0xLjAgICAtPiAtMEUrMQorZHFkaXY3NjIgZGl2aWRlIC0wICAgIC0xLjAgICAtPiAgMEUrMQorZHFkaXY3NjMgZGl2aWRlICAwICAgICAxLjAgICAtPiAgMEUrMQorZHFkaXY3NjQgZGl2aWRlIC0wICAgICAxLjAgICAtPiAtMEUrMQorZHFkaXY3NjUgZGl2aWRlIC0xICAgICAwLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY3NjYgZGl2aWRlIC0xICAgIC0wLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY3NjcgZGl2aWRlICAxICAgICAwLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY3NjggZGl2aWRlICAxICAgIC0wLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkcWRpdjc3MSBkaXZpZGUgIDAuMCAgLTEuMCAgIC0+IC0wCitkcWRpdjc3MiBkaXZpZGUgLTAuMCAgLTEuMCAgIC0+ICAwCitkcWRpdjc3MyBkaXZpZGUgIDAuMCAgIDEuMCAgIC0+ICAwCitkcWRpdjc3NCBkaXZpZGUgLTAuMCAgIDEuMCAgIC0+IC0wCitkcWRpdjc3NSBkaXZpZGUgLTEuMCAgIDAuMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjc3NiBkaXZpZGUgLTEuMCAgLTAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjc3NyBkaXZpZGUgIDEuMCAgIDAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjc3OCBkaXZpZGUgIDEuMCAgLTAuMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKKy0tIFNwZWNpYWxzCitkcWRpdjc4MCBkaXZpZGUgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2NzgxIGRpdmlkZSAgSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkcWRpdjc4MiBkaXZpZGUgIEluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZHFkaXY3ODMgZGl2aWRlICBJbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2RxZGl2Nzg0IGRpdmlkZSAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitkcWRpdjc4NSBkaXZpZGUgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorZHFkaXY3ODYgZGl2aWRlICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK2RxZGl2Nzg3IGRpdmlkZSAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY3ODggZGl2aWRlIC0xMDAwICBJbmYgICAtPiAtMEUtNjE3NiBDbGFtcGVkCitkcWRpdjc4OSBkaXZpZGUgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2NzkwIGRpdmlkZSAtMSAgICAgSW5mICAgLT4gLTBFLTYxNzYgQ2xhbXBlZAorZHFkaXY3OTEgZGl2aWRlIC0wICAgICBJbmYgICAtPiAtMEUtNjE3NiBDbGFtcGVkCitkcWRpdjc5MiBkaXZpZGUgIDAgICAgIEluZiAgIC0+ICAwRS02MTc2IENsYW1wZWQKK2RxZGl2NzkzIGRpdmlkZSAgMSAgICAgSW5mICAgLT4gIDBFLTYxNzYgQ2xhbXBlZAorZHFkaXY3OTQgZGl2aWRlICAxMDAwICBJbmYgICAtPiAgMEUtNjE3NiBDbGFtcGVkCitkcWRpdjc5NSBkaXZpZGUgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFkaXY4MDAgZGl2aWRlIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjgwMSBkaXZpZGUgLUluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZHFkaXY4MDIgZGl2aWRlIC1JbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RxZGl2ODAzIGRpdmlkZSAtSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkcWRpdjgwNCBkaXZpZGUgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZHFkaXY4MDUgZGl2aWRlIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RxZGl2ODA2IGRpdmlkZSAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkcWRpdjgwNyBkaXZpZGUgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODA4IGRpdmlkZSAtMTAwMCAgSW5mICAgLT4gLTBFLTYxNzYgQ2xhbXBlZAorZHFkaXY4MDkgZGl2aWRlIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjgxMCBkaXZpZGUgLTEgICAgLUluZiAgIC0+ICAwRS02MTc2IENsYW1wZWQKK2RxZGl2ODExIGRpdmlkZSAtMCAgICAtSW5mICAgLT4gIDBFLTYxNzYgQ2xhbXBlZAorZHFkaXY4MTIgZGl2aWRlICAwICAgIC1JbmYgICAtPiAtMEUtNjE3NiBDbGFtcGVkCitkcWRpdjgxMyBkaXZpZGUgIDEgICAgLUluZiAgIC0+IC0wRS02MTc2IENsYW1wZWQKK2RxZGl2ODE0IGRpdmlkZSAgMTAwMCAtSW5mICAgLT4gLTBFLTYxNzYgQ2xhbXBlZAorZHFkaXY4MTUgZGl2aWRlICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RxZGl2ODIxIGRpdmlkZSAgTmFOIC1JbmYgICAgLT4gIE5hTgorZHFkaXY4MjIgZGl2aWRlICBOYU4gLTEwMDAgICAtPiAgTmFOCitkcWRpdjgyMyBkaXZpZGUgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2RxZGl2ODI0IGRpdmlkZSAgTmFOIC0wICAgICAgLT4gIE5hTgorZHFkaXY4MjUgZGl2aWRlICBOYU4gIDAgICAgICAtPiAgTmFOCitkcWRpdjgyNiBkaXZpZGUgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2RxZGl2ODI3IGRpdmlkZSAgTmFOICAxMDAwICAgLT4gIE5hTgorZHFkaXY4MjggZGl2aWRlICBOYU4gIEluZiAgICAtPiAgTmFOCitkcWRpdjgyOSBkaXZpZGUgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RxZGl2ODMwIGRpdmlkZSAtSW5mICBOYU4gICAgLT4gIE5hTgorZHFkaXY4MzEgZGl2aWRlIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkcWRpdjgzMiBkaXZpZGUgLTEgICAgTmFOICAgIC0+ICBOYU4KK2RxZGl2ODMzIGRpdmlkZSAtMCAgICBOYU4gICAgLT4gIE5hTgorZHFkaXY4MzQgZGl2aWRlICAwICAgIE5hTiAgICAtPiAgTmFOCitkcWRpdjgzNSBkaXZpZGUgIDEgICAgTmFOICAgIC0+ICBOYU4KK2RxZGl2ODM2IGRpdmlkZSAgMTAwMCBOYU4gICAgLT4gIE5hTgorZHFkaXY4MzcgZGl2aWRlICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2RxZGl2ODQxIGRpdmlkZSAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODQyIGRpdmlkZSAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODQzIGRpdmlkZSAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODQ0IGRpdmlkZSAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODQ1IGRpdmlkZSAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODQ2IGRpdmlkZSAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODQ3IGRpdmlkZSAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODQ4IGRpdmlkZSAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODQ5IGRpdmlkZSAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODUwIGRpdmlkZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODUxIGRpdmlkZSAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODUyIGRpdmlkZSAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODUzIGRpdmlkZSAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODU0IGRpdmlkZSAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODU1IGRpdmlkZSAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODU2IGRpdmlkZSAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODU3IGRpdmlkZSAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODU4IGRpdmlkZSAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODU5IGRpdmlkZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHFkaXY4NjEgZGl2aWRlICBOYU45IC1JbmYgICAtPiAgTmFOOQorZHFkaXY4NjIgZGl2aWRlICBOYU44ICAxMDAwICAtPiAgTmFOOAorZHFkaXY4NjMgZGl2aWRlICBOYU43ICBJbmYgICAtPiAgTmFONworZHFkaXY4NjQgZGl2aWRlICBOYU42ICBOYU41ICAtPiAgTmFONgorZHFkaXY4NjUgZGl2aWRlIC1JbmYgICBOYU40ICAtPiAgTmFONAorZHFkaXY4NjYgZGl2aWRlIC0xMDAwICBOYU4zICAtPiAgTmFOMworZHFkaXY4NjcgZGl2aWRlICBJbmYgICBOYU4yICAtPiAgTmFOMgorCitkcWRpdjg3MSBkaXZpZGUgIHNOYU45OSAtSW5mICAgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY4NzIgZGl2aWRlICBzTmFOOTggLTEgICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODczIGRpdmlkZSAgc05hTjk3ICBOYU4gICAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg3NCBkaXZpZGUgIHNOYU45NiBzTmFOOTQgIC0+ICBOYU45NiBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY4NzUgZGl2aWRlICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODc2IGRpdmlkZSAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg3NyBkaXZpZGUgIDAgICAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY4NzggZGl2aWRlICBJbmYgICAgc05hTjkwICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODc5IGRpdmlkZSAgTmFOICAgIHNOYU44OSAgLT4gIE5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKK2RxZGl2ODgxIGRpdmlkZSAgLU5hTjkgIC1JbmYgICAtPiAgLU5hTjkKK2RxZGl2ODgyIGRpdmlkZSAgLU5hTjggICAxMDAwICAtPiAgLU5hTjgKK2RxZGl2ODgzIGRpdmlkZSAgLU5hTjcgICBJbmYgICAtPiAgLU5hTjcKK2RxZGl2ODg0IGRpdmlkZSAgLU5hTjYgIC1OYU41ICAtPiAgLU5hTjYKK2RxZGl2ODg1IGRpdmlkZSAgLUluZiAgIC1OYU40ICAtPiAgLU5hTjQKK2RxZGl2ODg2IGRpdmlkZSAgLTEwMDAgIC1OYU4zICAtPiAgLU5hTjMKK2RxZGl2ODg3IGRpdmlkZSAgIEluZiAgIC1OYU4yICAtPiAgLU5hTjIKKworZHFkaXY4OTEgZGl2aWRlIC1zTmFOOTkgLUluZiAgICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODkyIGRpdmlkZSAtc05hTjk4IC0xICAgICAgLT4gLU5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg5MyBkaXZpZGUgLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY4OTQgZGl2aWRlIC1zTmFOOTYgLXNOYU45NCAtPiAtTmFOOTYgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODk1IGRpdmlkZSAtTmFOOTUgIC1zTmFOOTMgLT4gLU5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg5NiBkaXZpZGUgLUluZiAgICAtc05hTjkyIC0+IC1OYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY4OTcgZGl2aWRlICAwICAgICAgLXNOYU45MSAtPiAtTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODk4IGRpdmlkZSAgSW5mICAgIC1zTmFOOTAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg5OSBkaXZpZGUgLU5hTiAgICAtc05hTjg5IC0+IC1OYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIGRpdmlkZSBieSAwCitkcWRpdjkwMSBkaXZpZGUgICAgMCAgICAgICAwICAgLT4gIE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxZGl2OTAyIGRpdmlkZSAgICAwLjBFNSAgIDAgICAtPiAgTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFkaXY5MDMgZGl2aWRlICAgIDAuMDAwICAgMCAgIC0+ICBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcWRpdjkwNCBkaXZpZGUgICAgMC4wMDAxICAwICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTA1IGRpdmlkZSAgICAwLjAxICAgIDAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5MDYgZGl2aWRlICAgIDAuMSAgICAgMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkwNyBkaXZpZGUgICAgMSAgICAgICAwICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTA4IGRpdmlkZSAgICAxICAgICAgIDAuMCAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5MDkgZGl2aWRlICAgMTAgICAgICAgMC4wIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkxMCBkaXZpZGUgICAxRSsxMDAgICAwLjAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTExIGRpdmlkZSAgIDFFKzEwMCAgIDAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkcWRpdjkyMSBkaXZpZGUgICAtMC4wMDAxICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTIyIGRpdmlkZSAgIC0wLjAxICAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5MjMgZGl2aWRlICAgLTAuMSAgICAgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkyNCBkaXZpZGUgICAtMSAgICAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTI1IGRpdmlkZSAgIC0xICAgICAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5MjYgZGl2aWRlICAtMTAgICAgICAgMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkyNyBkaXZpZGUgIC0xRSsxMDAgICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTI4IGRpdmlkZSAgLTFFKzEwMCAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkcWRpdjkzMSBkaXZpZGUgICAgMC4wMDAxIC0wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTMyIGRpdmlkZSAgICAwLjAxICAgLTAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5MzMgZGl2aWRlICAgIDAuMSAgICAtMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkzNCBkaXZpZGUgICAgMSAgICAgIC0wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTM1IGRpdmlkZSAgICAxICAgICAgLTAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5MzYgZGl2aWRlICAgMTAgICAgICAtMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkzNyBkaXZpZGUgICAxRSsxMDAgIC0wLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTM4IGRpdmlkZSAgIDFFKzEwMCAgLTAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkcWRpdjk0MSBkaXZpZGUgICAtMC4wMDAxIC0wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTQyIGRpdmlkZSAgIC0wLjAxICAgLTAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5NDMgZGl2aWRlICAgLTAuMSAgICAtMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjk0NCBkaXZpZGUgICAtMSAgICAgIC0wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTQ1IGRpdmlkZSAgIC0xICAgICAgLTAuMCAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5NDYgZGl2aWRlICAtMTAgICAgICAtMC4wIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjk0NyBkaXZpZGUgIC0xRSsxMDAgIC0wLjAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTQ4IGRpdmlkZSAgLTFFKzEwMCAgLTAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCistLSBFeGFtcGxlcyBmcm9tIFNRTCBwcm9wb3NhbCAoS3Jpc2huYSBLdWxrYXJuaSkKK2RxZGl2MTAyMSAgZGl2aWRlIDFFMCAgICAgICAgICAxRTAgLT4gMQorZHFkaXYxMDIyICBkaXZpZGUgMUUwICAgICAgICAgIDJFMCAtPiAwLjUKK2RxZGl2MTAyMyAgZGl2aWRlIDFFMCAgICAgICAgICAzRTAgLT4gMC4zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzIEluZXhhY3QgUm91bmRlZAorZHFkaXYxMDI0ICBkaXZpZGUgMTAwRS0yICAgMTAwMEUtMyAtPiAxCitkcWRpdjEwMjUgIGRpdmlkZSAyNEUtMSAgICAgICAgMkUwIC0+IDEuMgorZHFkaXYxMDI2ICBkaXZpZGUgMjQwMEUtMyAgICAgIDJFMCAtPiAxLjIwMAorZHFkaXYxMDI3ICBkaXZpZGUgNUUwICAgICAgICAgIDJFMCAtPiAyLjUKK2RxZGl2MTAyOCAgZGl2aWRlIDVFMCAgICAgICAgMjBFLTEgLT4gMi41CitkcWRpdjEwMjkgIGRpdmlkZSA1RTAgICAgICAyMDAwRS0zIC0+IDIuNQorZHFkaXYxMDMwICBkaXZpZGUgNUUwICAgICAgICAgMkUtMSAtPiAyNQorZHFkaXYxMDMxICBkaXZpZGUgNUUwICAgICAgICAyMEUtMiAtPiAyNQorZHFkaXYxMDMyICBkaXZpZGUgNDgwRS0yICAgICAgIDNFMCAtPiAxLjYwCitkcWRpdjEwMzMgIGRpdmlkZSA0N0UtMSAgICAgICAgMkUwIC0+IDIuMzUKKworLS0gRUNNQVNjcmlwdCBiYWQgZXhhbXBsZXMKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KK2RxZGl2MTA0MCAgZGl2aWRlIDUgOSAgLT4gMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU2IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorZHFkaXYxMDQxICBkaXZpZGUgNiAxMSAtPiAwLjU0NTQ1NDU0NTQ1NDU0NTQ1NDU0NTQ1NDU0NTQ1NDU0NTUgSW5leGFjdCBSb3VuZGVkCisKKy0tIEd5dXJpcyBleGFtcGxlCitkcWRpdjEwNTAgIGRpdmlkZSA4LjMzNjgwNDQxODA5NDA0MDk4OTYzMDAwNjgxOTg4MTcwOUUtNjE0MyA4LjMzNjgwNDQxODA5NDA0MDk4OTYzMDAwNjgxOTg4OTAwMEUtNjE0MyAtPiAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTEyNTQgSW5leGFjdCBSb3VuZGVkCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgLi4gbm90ZSBzdWJub3JtYWwgcmVzdWx0cworLS0gc2lnbnMKK2RxZGl2MTc1MSBkaXZpZGUgIDFlKzQyNzcgIDFlLTMzMTEgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFkaXYxNzUyIGRpdmlkZSAgMWUrNDI3NyAtMWUtMzMxMSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE3NTMgZGl2aWRlIC0xZSs0Mjc3ICAxZS0zMzExIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTc1NCBkaXZpZGUgLTFlKzQyNzcgLTFlLTMzMTEgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFkaXYxNzU1IGRpdmlkZSAgMWUtNDI3NyAgMWUrMzMxMSAtPiAgMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWRpdjE3NTYgZGl2aWRlICAxZS00Mjc3IC0xZSszMzExIC0+IC0wRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZGl2MTc1NyBkaXZpZGUgLTFlLTQyNzcgIDFlKzMzMTEgLT4gLTBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFkaXYxNzU4IGRpdmlkZSAtMWUtNDI3NyAtMWUrMzMxMSAtPiAgMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tICdzdWJub3JtYWwnIGJvdW5kYXJ5IChhbGwgaGFyZCB1bmRlcmZsb3cgb3Igb3ZlcmZsb3cgaW4gYmFzZSBhcml0aGVtdGljKQorZHFkaXYxNzYwIGRpdmlkZSAxZS02MDY5IDFlKzEwMSAtPiAxRS02MTcwIFN1Ym5vcm1hbAorZHFkaXYxNzYxIGRpdmlkZSAxZS02MDY5IDFlKzEwMiAtPiAxRS02MTcxIFN1Ym5vcm1hbAorZHFkaXYxNzYyIGRpdmlkZSAxZS02MDY5IDFlKzEwMyAtPiAxRS02MTcyIFN1Ym5vcm1hbAorZHFkaXYxNzYzIGRpdmlkZSAxZS02MDY5IDFlKzEwNCAtPiAxRS02MTczIFN1Ym5vcm1hbAorZHFkaXYxNzY0IGRpdmlkZSAxZS02MDY5IDFlKzEwNSAtPiAxRS02MTc0IFN1Ym5vcm1hbAorZHFkaXYxNzY1IGRpdmlkZSAxZS02MDY5IDFlKzEwNiAtPiAxRS02MTc1IFN1Ym5vcm1hbAorZHFkaXYxNzY2IGRpdmlkZSAxZS02MDY5IDFlKzEwNyAtPiAxRS02MTc2IFN1Ym5vcm1hbAorZHFkaXYxNzY3IGRpdmlkZSAxZS02MDY5IDFlKzEwOCAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZGl2MTc2OCBkaXZpZGUgMWUtNjA2OSAxZSsxMDkgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWRpdjE3NjkgZGl2aWRlIDFlLTYwNjkgMWUrMTEwIC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorLS0gW25vIGVxdWl2YWxlbnQgb2YgJ3N1Ym5vcm1hbCcgZm9yIG92ZXJmbG93XQorZHFkaXYxNzcwIGRpdmlkZSAxZSs0MCAxZS02MTAxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQxIENsYW1wZWQKK2RxZGl2MTc3MSBkaXZpZGUgMWUrNDAgMWUtNjEwMiAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDIgIENsYW1wZWQKK2RxZGl2MTc3MiBkaXZpZGUgMWUrNDAgMWUtNjEwMyAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzICBDbGFtcGVkCitkcWRpdjE3NzMgZGl2aWRlIDFlKzQwIDFlLTYxMDQgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDQgIENsYW1wZWQKK2RxZGl2MTc3NCBkaXZpZGUgMWUrNDAgMWUtNjEwNSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTc3NSBkaXZpZGUgMWUrNDAgMWUtNjEwNiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTc3NiBkaXZpZGUgMWUrNDAgMWUtNjEwNyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTc3NyBkaXZpZGUgMWUrNDAgMWUtNjEwOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTc3OCBkaXZpZGUgMWUrNDAgMWUtNjEwOSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTc3OSBkaXZpZGUgMWUrNDAgMWUtNjExMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworZHFkaXYxODAxIGRpdmlkZSAgMS4wMDAwRS02MTcyICAxICAgICAtPiAxLjAwMDBFLTYxNzIgU3Vibm9ybWFsCitkcWRpdjE4MDIgZGl2aWRlICAxLjAwMEUtNjE3MiAgIDFlKzEgIC0+IDEuMDAwRS02MTczICBTdWJub3JtYWwKK2RxZGl2MTgwMyBkaXZpZGUgIDEuMDBFLTYxNzIgICAgMWUrMiAgLT4gMS4wMEUtNjE3NCAgIFN1Ym5vcm1hbAorZHFkaXYxODA0IGRpdmlkZSAgMS4wRS02MTcyICAgICAxZSszICAtPiAxLjBFLTYxNzUgICAgU3Vibm9ybWFsCitkcWRpdjE4MDUgZGl2aWRlICAxLjBFLTYxNzIgICAgIDFlKzQgIC0+IDFFLTYxNzYgICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkcWRpdjE4MDYgZGl2aWRlICAxLjNFLTYxNzIgICAgIDFlKzQgIC0+IDFFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MDcgZGl2aWRlICAxLjVFLTYxNzIgICAgIDFlKzQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MDggZGl2aWRlICAxLjdFLTYxNzIgICAgIDFlKzQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MDkgZGl2aWRlICAyLjNFLTYxNzIgICAgIDFlKzQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MTAgZGl2aWRlICAyLjVFLTYxNzIgICAgIDFlKzQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MTEgZGl2aWRlICAyLjdFLTYxNzIgICAgIDFlKzQgIC0+IDNFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MTIgZGl2aWRlICAxLjQ5RS02MTcyICAgIDFlKzQgIC0+IDFFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MTMgZGl2aWRlICAxLjUwRS02MTcyICAgIDFlKzQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MTQgZGl2aWRlICAxLjUxRS02MTcyICAgIDFlKzQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MTUgZGl2aWRlICAyLjQ5RS02MTcyICAgIDFlKzQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MTYgZGl2aWRlICAyLjUwRS02MTcyICAgIDFlKzQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MTcgZGl2aWRlICAyLjUxRS02MTcyICAgIDFlKzQgIC0+IDNFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RxZGl2MTgxOCBkaXZpZGUgIDFFLTYxNzIgICAgICAgMWUrNCAgLT4gMUUtNjE3NiAgICAgU3Vibm9ybWFsCitkcWRpdjE4MTkgZGl2aWRlICAzRS02MTcyICAgICAgIDFlKzUgIC0+IDBFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZGl2MTgyMCBkaXZpZGUgIDVFLTYxNzIgICAgICAgMWUrNSAgLT4gMEUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFkaXYxODIxIGRpdmlkZSAgN0UtNjE3MiAgICAgICAxZSs1ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODIyIGRpdmlkZSAgOUUtNjE3MiAgICAgICAxZSs1ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODIzIGRpdmlkZSAgOS45RS02MTcyICAgICAxZSs1ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkcWRpdjE4MjQgZGl2aWRlICAxRS02MTcyICAgICAgLTFlKzQgIC0+IC0xRS02MTc2ICAgIFN1Ym5vcm1hbAorZHFkaXYxODI1IGRpdmlkZSAgM0UtNjE3MiAgICAgIC0xZSs1ICAtPiAtMEUtNjE3NiAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWRpdjE4MjYgZGl2aWRlIC01RS02MTcyICAgICAgIDFlKzUgIC0+IC0wRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZGl2MTgyNyBkaXZpZGUgIDdFLTYxNzIgICAgICAtMWUrNSAgLT4gLTFFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTgyOCBkaXZpZGUgLTlFLTYxNzIgICAgICAgMWUrNSAgLT4gLTFFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTgyOSBkaXZpZGUgIDkuOUUtNjE3MiAgICAtMWUrNSAgLT4gLTFFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTgzMCBkaXZpZGUgIDMuMEUtNjE3MiAgICAtMWUrNSAgLT4gLTBFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitkcWRpdjE4MzEgZGl2aWRlICAxLjBFLTU5NzcgICAgIDFlKzIwMCAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZGl2MTgzMiBkaXZpZGUgIDEuMEUtNTk3NyAgICAgMWUrMTk5IC0+IDFFLTYxNzYgICBTdWJub3JtYWwgUm91bmRlZAorZHFkaXYxODMzIGRpdmlkZSAgMS4wRS01OTc3ICAgICAxZSsxOTggLT4gMS4wRS02MTc1IFN1Ym5vcm1hbAorZHFkaXYxODM0IGRpdmlkZSAgMi4wRS01OTc3ICAgICAyZSsxOTggLT4gMS4wRS02MTc1IFN1Ym5vcm1hbAorZHFkaXYxODM1IGRpdmlkZSAgNC4wRS01OTc3ICAgICA0ZSsxOTggLT4gMS4wRS02MTc1IFN1Ym5vcm1hbAorZHFkaXYxODM2IGRpdmlkZSAxMC4wRS01OTc3ICAgIDEwZSsxOTggLT4gMS4wRS02MTc1IFN1Ym5vcm1hbAorZHFkaXYxODM3IGRpdmlkZSAzMC4wRS01OTc3ICAgIDMwZSsxOTggLT4gMS4wRS02MTc1IFN1Ym5vcm1hbAorZHFkaXYxODM4IGRpdmlkZSA0MC4wRS01OTgyICAgIDQwZSsxNjYgLT4gMS4wRS02MTQ4IFN1Ym5vcm1hbAorZHFkaXYxODM5IGRpdmlkZSA0MC4wRS01OTgyICAgIDQwZSsxNjUgLT4gMS4wRS02MTQ3IFN1Ym5vcm1hbAorZHFkaXYxODQwIGRpdmlkZSA0MC4wRS01OTgyICAgIDQwZSsxNjQgLT4gMS4wRS02MTQ2IFN1Ym5vcm1hbAorCistLSByYW5kb21zCityb3VuZGluZzogIGhhbGZfZXZlbgorZHFkaXYyMDEwICBkaXZpZGUgIC01MjMxMTk1NjUyOTMxNjUxOTY4MDM0MzU2MTE3MTE4ODUwICAgICAgICAgLTcyNDM3MTg2NjQ0MjI1NDg1NzMyMDMyNjA5NzAuMzQ5OTUgICAgICAgICAgLT4gICA3MjIxNjkuOTA5NTgzMTI4NDYyNDczNjA1MTQ2MDU1MDY4MCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAxMSAgZGl2aWRlICAtODk1ODQ2Njk3NzM5MjcuODI3MTEyMzczNTAwMjI1MTUzNTIgICAgICAgIC00MjA3Nzk0MzcyODUyOTYzNTg4NC4yMTE0MjYyNzUzMjk4NSAgICAgICAgIC0+ICAgMC4wMDAwMDIxMjkwMTcyOTExNDY0NzE1NjU5MjgxMjU4ODc1MjcyNjYgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMTIgIGRpdmlkZSAgLTIuODI4MjAxNjkzMzYwNzIzMjAzODA2OTc0ODkxOTQ2MTgwRS0yMzIgICAgODEyNTk2NTQxMjIxODIzOTYwMzg2Mzg0NDAzMDg5MjQwLjkgICAgICAgICAtPiAgLTMuNDgwNDUwMDc1NjQwNTIxMzIwMDQwMDU1NzU5MTI1MTIwRS0yNjUgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMTMgIGRpdmlkZSAgLTY0NDI3NzUzNzI3NjEwNjkyNjc1MDI5Mzc1Mzk0MDg3MjAgICAgICAgICAgMjQ5MDQwODUwNTYuNjkxODU0NjUxNDUxODI2MDYwODkxOTYgICAgICAgICAtPiAgLTI1ODcwMzU1NjM4ODIyNjQ2MzY4NzcwMS40ODg0NzE5NTg5IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDE0ICBkaXZpZGUgICA1LjUzNTUyMDAxMTI3MjYyNTYyOTYxMDA3OTg3OTcxNDcwNSAgICAgICAgLTQ0MzQzNjY0NjUwLjU3MjAzMDUyMDAzMDY4MTEzNTMxMjA4ICAgICAgICAgLT4gIC0xLjI0ODMyMjYzMDcyODA4OTMwODk3NTk0MDUzMzQ5MzU2MkUtMTAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMTUgIGRpdmlkZSAgIDY1OTE5MjczNzEyNTE3ODY1OTY0MzI1Ljk5NDE5NjI1MDEwICAgICAgICAtMzE0NzMzMzU0MTQxMzgxNzM3Mzc4NjIyNTE1Ljc3ODkwNTQgICAgICAgICAtPiAgLTAuMDAwMjA5NDQ0ODI5NTUyMTQ5MDYxNjM3OTc4NDc1ODkxMTYzMiBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAxNiAgZGl2aWRlICAtNy43NzkxNzI1NjgxOTMxOTcxMDcxMTUyNzUxNDA0MzExMjlFKzc1OSAgIC0xNDA0NTMwMTU2MzkuMzk4ODk4NzY1Mjg5NTE3ODc4MjE0MyAgICAgICAgIC0+ICAgNS41Mzg2Mjk3OTIxNjE2NDE1MzQ5NjI3NzQyNDQyMzgxMTVFKzc0OCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAxNyAgZGl2aWRlICAgNjQ0MzE0ODMyNTk3NTY5LjAxODEyMjYwNjc1MTgxNzg3OTcgICAgICAgIC0xMTUwMjQ1ODUyNTc0MjUuMTYzNTc1OTUyMTU2NTIwMTA3NSAgICAgICAgIC0+ICAtNS42MDE1NDAxNTAzNTY0NzkyNTczNjc2ODc0NTA5MjI3OTUgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMTggIGRpdmlkZSAgIDYuODk4NjQwOTQxNTc5NjExNDUwNjc2NTkyNTUzMjg2ODcwRS00NyAgICAtMTEyNzI0Mjk4ODE0MDc4NTE0ODUxNjM5MTQ5OTkuMjU5NDMgICAgICAgICAtPiAgLTYuMTE5OTIzNTc4Mjg1MzM4Njg5MzcxMTM3NjQ4MzE5MjgwRS03NSBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAxOSAgZGl2aWRlICAtMzU5MTM0NDU0NDg4ODcyNzEzMy4zMDgxOTc1MDE2MzI1NCAgICAgICAgICA1MzI5Mzk1LjQyMzc5Mjc5NTY2MTQ0NjU2MTA5MDMzMTAzNyAgICAgICAgIC0+ICAtNjczODc0NjYyOTQxLjE5Njg1MjU1ODk0NjA1MzM3MjUyOTAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMjAgIGRpdmlkZSAgLTcuNjgyMzU2NzgxMzg0NjMxMzEzMTU2NDYyNzI0NDI1ODM4RSs3NDcgICAtNi42MDM3NTg1NTUxMjIxOTA1NzI4MTkyMjE0MTgwOTk0MEUrNzAzICAgICAtPiAgIDEuMTYzMzMwOTYwMjc5NTU2MDE2Njc4Mzc5MTI4ODc1MTQ5RSs0NCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAyMSAgZGl2aWRlICAtNDUxMTQ5NTU5NjU5Njk0MTgyMDg2MzIyNC4yNzQ2Nzk2OTkgICAgICAgICAzMzY1Mzk1MDE3LjI2MzMyOTc5NTQ0OTY2MTYxNjA5MDcyNCAgICAgICAgIC0+ICAtMTM0MDU1NDU0ODExNTMwNC45MDQxNjY4ODgwMTgzNDYyOTkgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMjIgIGRpdmlkZSAgIDUuMjExMTY0MTI3ODQwOTMxNTE3MjYzNjM5NjA4MTUxMjk5ICAgICAgICAgMTY0LjU1NjYzODEzNTYyNzY1NjcwMTI1MzM4NDcwMDY0NTMgICAgICAgICAtPiAgIDAuMDMxNjY3OTA1ODc2NTUyMjg4NjQ0NzgyNjAxNTcxNTY1MTAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMjMgIGRpdmlkZSAgLTQ5ODkxLjIyNDM4OTM0NTg4MzAzODQwNzc2ODQ2MjAzODMgICAgICAgICAtNDcxNzkuOTMxMjk2MTg2MDc0NzU1NDA1MzM3MTE3MTUzMCAgICAgICAgICAtPiAgIDEuMDU3NDY3MDg0Mzg2NzY3MjkxNjAyMTg5NjU2NDMwMjY4IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDI0ICBkaXZpZGUgICAxNTA2NTQ3Ny40NzIxNDI2ODQ4ODA3NzQxNTQ2MjQxMzM1MyAgICAgICAgIDQzNjYyMTEuMTIwODkyOTUzMjYxMzA5NTI5NzQwNTUyNTk2ICAgICAgICAgLT4gICAzLjQ1MDQ2OTMwOTY2MTIyNzk4NDI0NDU0NTUxMzQ0MTM1OSBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAyNSAgZGl2aWRlICAgMS41NzU2NzAyNjk0NDA3NjE4NDYxMDk2MDI0Mjk2MTI2NDRFKzM3MCAgICA2NTMxOTk2NDkzMjQ3NDAzMDAuMDA2MTg1NDgyNjQzNDM5ICAgICAgICAgIC0+ICAgMi40MTIyMzM3OTU3MDAzNTkxNzA5MDQ1ODg1NDgwNDE0ODFFKzM1MiBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAyNiAgZGl2aWRlICAtMjExMjQyMjMxMTczMzQ0ODkyNDU3MzQzMjE5Mi42MjAxNDUgICAgICAgIC04MDA2NzIwNi4wMzU5MDY5MzE1Mzg0ODIxNTg0ODYxMzQwNiAgICAgICAgIC0+ICAgMjYzODMxMTUwODk0MTc2NjAxNzUuMjAxMDI2NDY3NTY1NzQgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMjcgIGRpdmlkZSAgLTY3MDk2NTM2MDUxMjc5ODA5LjMyMjE4NjExNTQ4NzIxODM5ICAgICAgICAtODY5Njg1NDEyODgxOTQxMDgxNjY0MjUxOTkwMTgxLjEwNDkgICAgICAgICAtPiAgIDcuNzE1MDM1MjM2NTg0ODA1OTIxMjc4NTY2MzY1MjMxMTY4RS0xNCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAyOCAgZGl2aWRlICAtNTg2MTI5MDg1NDg5NjIwNDcuMjE4NjY5MTM0MjU0ODg5NzIgICAgICAgIC05Nzg0NDk1OTc1MzEuMzg3MzY2NTU4MzQ3NTYzMzgzMTY0NCAgICAgICAgIC0+ICAgNTk5MDMuODYwODU5OTE3MDMwOTEyMzY1MDc4NTk4MzcwMjMgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMjkgIGRpdmlkZSAgLTEzMzAzMjQxMjAxMDk0Mi4xNDc2ODY0MTM4MjEzMzE5Nzk2ICAgICAgICAtNy44ODIwNTkyOTM0OTg2NzA3MDU0NDY1Mjg2NDgyMDEzNTlFLTQyOCAgICAtPiAgIDEuNjg3Nzg3NTA2NTA0NDMzMDY0NTQ5NTE1NjgxNjkzNzE1RSs0NDEgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMzAgIGRpdmlkZSAgIDEuODM3NDY2OTgzMzg5NjYwMjk0OTIyOTk3MTYzNjA1MTNFKzk3NyAgICAtOS44OTc5MjY2MDg5Nzk2NDk5NTE2NzI4Mzk4NzkxMjg2MDNFKzE1NCAgICAtPiAgLTEuODU2NDE2MDUxNTQyMjEyNTUyMDQyMzkwMjE4MDYyNDU4RSs4MjIgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMzEgIGRpdmlkZSAgLTExMzc0MjQ3NTg0MTM5OTIzNjMwNzEyODk2Mi4xNTA3MDYzICAgICAgICAgODI5ODYwMi4yMDMwNDk4MzQ3MzI2NTc1Njc5NjUyNjI5ODkgICAgICAgICAtPiAgLTEzNzA2MjIxMDA2NjY1MTM3ODI2LjE2NTU3MzkzOTE5OTI5IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDMyICBkaXZpZGUgICAxOTYuNDc4NzU3NDY1MDc1NDE1Mjk5NTk0MTgwODMzMTg2MiAgICAgICAgIDkyOS42NTUzMzg4NDcyMzE4MDk0NDI3NDIyMTE3MTcyMzk0ICAgICAgICAgLT4gICAwLjIxMTM0NTgwNjYxNzY1MjY2NTEwMDY5MTc5MjI4MTQwMTggSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMzMgIGRpdmlkZSAgIDcxOTMxMjIxNDY1LjQzODY3OTk2MjgyODAzNjI4MTMwMzUwICAgICAgICAgMzgzODY4NTkzNDIwNjQyNjI1NzA5MDcxOC40MDIyNDg4NTMgICAgICAgICAtPiAgIDEuODczODUwMTMyNTI3NDIzNDEzNjA3MTk5NTEzMzI0MDIxRS0xNCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAzNCAgZGl2aWRlICAgNDg4LjQyODI1MDIyODk2NTE2NTM3ODM1OTYyNDYzMTI4ODUgICAgICAgIC04MC42ODk0MDk1NjgwNjYzNDI4MDA3ODcwNjU3Nzk1MzE4OCAgICAgICAgIC0+ICAtNi4wNTMxODkwNDcyODA2OTMzMTg4NDQ4MDE4OTk0NzMyNzIgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMzUgIGRpdmlkZSAgIDkuMDAxNzY0MzQ0OTYzOTIxNzU0OTgxNzYyOTEzMjQ3Mzk0RS0xNjIgICAtOC41ODU1NDA5NzM2NjcyMDU3NTM3MzQ5Njc2NDUzODY5MTlFLTcyOSAgICAtPiAgLTEuMDQ4NDc5NTc0MjcxODI3MzI2Mzk2MDEyNTczMjMyOTM0RSs1NjcgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMzYgIGRpdmlkZSAgLTcuNDA0MTMzOTU5NDA5ODk0NzQzNzA2NDAyODU3MTQ1NDcxRS04MjggICAtNTEuMzgxNTk5Mjk0NjAyODk3MTExMzQ2ODQ4NDMwODYyNjUgICAgICAgICAtPiAgIDEuNDQxMDA4ODU1NTE2MDI5NDYxMDMyMDYxNzg1MjE5NzczRS04MjkgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMzcgIGRpdmlkZSAgIDIuOTY3NTIwMjM1NTc0NDE5Nzk0MDQ4OTk0NDM2MDQwNzE3RS02MTMgICAtNjI1MjUxMzg1NS45MTM5NDg5NDk0OTg3OTI2MjczMTg4OSAgICAgICAgICAtPiAgLTQuNzQ2MTIzNDA1NjU2NDA5MTI3NTcyOTk4NzUxODg1MzM4RS02MjMgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMzggIGRpdmlkZSAgLTE4ODI2ODUyNjU0ODI0MDQwNTA1LjgzOTIwMzY2NzY1MDUxICAgICAgICAtNjMzNjkyNDg3Nzk0MjQzNzk5MjU5MDU1NzQ2MDE0NzM0MCAgICAgICAgICAtPiAgIDIuOTcwOTc2MTQ2NTQ2NDk0NjY5ODA3ODg2Mjc4NTE5MTk0RS0xNSBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAzOSAgZGl2aWRlICAtOC4xMDE0MDY3ODQ4MDkxOTc2MDQ5NDk1ODQwMDE3MzU5NDlFKzU2MSAgICA0LjgyMzMwMDMwNjk0ODk0MjgyMTA3NjY4MTY1ODc3MTYzNUUrMzYxICAgIC0+ICAtMS42Nzk2Mzk3MjE2MTA4MzkyMDQ3Mzg0NDU3NDcyMzg5ODdFKzIwMCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjA0MCAgZGl2aWRlICAtNi4xMTk4MTk3Nzc3MzA5NDA1MjMzMTA2MjU4NTE5MTcyM0UrMjk1ICAgICAxLjUwNzYxMDI1Mzc1NTMzOTMyODMwMjc3OTAwNTU4NjUzNEUrMjM4ICAgIC0+ICAtNC4wNTkyODUwNTg5MTE1NzcyNDQwNDQ0MTg0MTYwNDQ3NjNFKzU3IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDQxICBkaXZpZGUgICA2LjQ3MjYzODg1MDA0NjgxNTg4MDU5OTIyMDUzNDI3NDA1NUUtNTk2ICAgLTQuNDc1MjMzNzEyMDgzMDQ3NTE2OTMzOTExNzg2MTU5OTcyICAgICAgICAgLT4gIC0xLjQ0NjMyNDIwNzA2MjI2MTc0NTUyMDQ5NjQ3NTc3ODg3OUUtNTk2IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDQyICBkaXZpZGUgIC04NDQzODU5MzMzMC43MTI3NzgzOTYzMTE0NDUwOTM5NzExMiAgICAgICAgLTU4NjY4NDU5NjIwNDQwMTY2NDIwODk0Ny40MDU0ODc5NjMzICAgICAgICAgLT4gICAxLjQzOTI1MDIxODU1MDA0MTIyODc1OTk4MzkzNzc3MjUwNEUtMTMgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNDMgIGRpdmlkZSAgIDkuMzU0NTMzMjMzMjk0MDIyNjE2Njk1ODE1NjU2NzA0MzY5RS0yNCAgICAgNDA1LjUwMDM5MDYyNjEzNTMwNDI1MjE0NDE2MzU5MTc0NiAgICAgICAgICAtPiAgIDIuMzA2OTExMDI4ODI3Nzc0NTQ5NzQwNTcxMjI5NzM2MTk4RS0yNiBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjA0NCAgZGl2aWRlICAgOTg1NjA2NDIzMzUwMjEwLjczNzQ4NzY2NTAxNDk5NTc4ODEgICAgICAgIC0zNjgxMTU2MzY5Ny40MTkyNTY4MTg2NjY5NDg1OTgyODc5NCAgICAgICAgIC0+ICAtMjY3NzQuMzY5OTA4NjQxMTk0NDUzMzU4MTMzNTQ3MTc3MTEgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNDUgIGRpdmlkZSAgLTguMTg3MjgwNzc0MTc3NzE1NzA2Mjc4MDAyMjQ3NzY2MzExRS0xMjMgICAtMzg3ODQxMjQzOTMuOTEyMTI4NzA4Mjg0MzAwMDEzMDAwNjggICAgICAgICAtPiAgIDIuMTEwOTg3NjUzMzU2MTM5MTQ3MzU3MjQwNzI3Nzk0MzY1RS0xMzMgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNDYgIGRpdmlkZSAgLTQuNjEyMjAzMTI2MzUwMDcwOTAzNDU5MjQ1Nzk4MzcxNjU3RSs5MTIgICAgNy45NzE1NjIxODI3Mjc5NTYyOTA5MDE5ODQ3MzY4MDA1MTlFKzY0ICAgICAtPiAgLTUuNzg1ODIwOTIyNzA4NjgzMjM3MDk4ODI2NjYyNzY5NzQ4RSs4NDcgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNDcgIGRpdmlkZSAgIDQuNjYxMDE1OTA5NDIxNDg1Mjk4MjQ3OTI4OTY3OTc3MDg5RSs4ODggICAtNi4zNjA5MTEyNTMzMjM5MjIzMzg3MzczMTE1NjM4NDU1ODFFKzM4OCAgICAtPiAgLTcuMzI3NTkxNDc4MzIxMzY1OTgwMTU2NjU0NTM5NjM4ODM2RSs0OTkgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNDggIGRpdmlkZSAgIDkxNTYwNzgxNzI5MDMuMjU3NTAwMDAzMjYwNzEwODMzMDMwICAgICAgICAgNy4xODk3OTY2NTMyNjIxNDcxMzkwNzE2MzQyMzc5NjQwNzRFLTkwICAgICAtPiAgIDEuMjczNDgyMjE1NzY2MDAwOTk0MzY1MjAxNTQ1MDk2MDI2RSsxMDIgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNDkgIGRpdmlkZSAgLTEuNzEwNzIyMzAzMzI3NDc2NTg2MzczNDc3NzgxMjc2NTg2RS0zMTEgICAtMzE2NzU2MTYyODI2MDE1NjgzNzMyOTMyMy43MjkzODA2OTUgICAgICAgICAtPiAgIDUuNDAwNzU0NTk5NTc4NjEzOTg0ODc1NzUyOTU4NjQ1NjU1RS0zMzYgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNTAgIGRpdmlkZSAgLTQuNjQ3OTM1MjEwODgxODA2MjM4MzIxNjE2MzQ1NDEzMDIxRS04NzggICAgMjA5Mzg4LjU0MzE4Njc3NDQ2NDgxNzczMDg0NjA2Mzk1ODIgICAgICAgICAtPiAgLTIuMjE5NzY1NzcxMzk0NTkzNzMzMTQwNDk0Mjk3Mzg4MTQwRS04ODMgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNTEgIGRpdmlkZSAgIDU5NTguNjk0NzI4Mzk1NzYwOTkyNzE5MDg0NzgxNTgyNzAwICAgICAgICAgNC41NDE1MTAxNTY1NjQzMTU2MzI1MzYzNTMxNzE4NDYwOTZFLTc0NiAgICAtPiAgIDEuMzEyMDUxMzkzMjUzNjM4NjY0OTQ3ODUyNjkzMDA1NDgwRSs3NDkgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNTIgIGRpdmlkZSAgLTcuOTM1NzMyNTQ0NjQ5NzAyMTc1MjU2Njk5ODg2ODcyMDkzRS00ODkgICAtNy40MzMzMjkwNzM2NjQ3OTMxMzg5OTg3NjU2NDc0Njc5NzFFKzM2MCAgICAtPiAgIDEuMDY3NTg3OTQ5NjI2MDc2OTE3NjcyMjcxNjE5NjY0NjU2RS04NDkgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNTMgIGRpdmlkZSAgLTI3NDY2NTA4NjQ2MDExNTcuODYzNTg5OTU5OTM5OTAxMzUwICAgICAgICAgNy4wMTY2ODQ5NDU1MDc2NDc1Mjg5MDcxODQ2OTQzNTk1OThFKzU0OCAgICAtPiAgLTMuOTE0NDU2NTkzMDA5MzA5NTI5MzUxMjU0OTUwNDI5OTMyRS01MzQgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNTQgIGRpdmlkZSAgIDM2MDUxNDk0MDg2MzExOTczNjU0NDc5NTMuOTk0NTY5MTc4ICAgICAgICAtNzU2MTQwMjU4MjU2NDkwODIuNzgyNjQ4NjQ0MjgyMzc4MzMgICAgICAgICAtPiAgLTQ3Njc4MzE1Ljg4NDcyNjkzNTA3MDYwMDYzMTg4MDIwNTMyIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDU1ICBkaXZpZGUgICA3ODgxOTQzMjA5MjE3OTg0MDQ5MDYzNzUyMTQuMTk2MzQ5ICAgICAgICAgLTYuMjIyNzE4MTQ4NDMzMjQ3Mzg0OTMyNTczNDAxOTc2MzM3RS00MTggICAgLT4gIC0xLjI2NjYzOTkxODYzNDY3MTgwMzk4MjIyMjI0NDk3NzI4N0UrNDQ0IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDU2ICBkaXZpZGUgICA1NjIwNzIyNzMwNTM0NzUyLjc1ODIwODk0MzQ0NzYwMzIxMSAgICAgICAgIDYuODQzNTUyODQxMTY4NTM4MzE5MTIzMDAwOTE3NjU3NzU5RS0xMzkgICAgLT4gICA4LjIxMzE2NDgwMDQ4NTQzNDY2NjYyOTk3MDQ0MzczOTU1NEUrMTUzIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDU3ICBkaXZpZGUgICA3MzA0NTM0Njc2NzEzNzAzOTM4MTAyLjQwMzk0OTAxOTQwMiAgICAgICAgLTU3NjE2OS4zNjg1MDEwOTM1MTA4MTUzMDIzODAzNTkwODM1ICAgICAgICAgLT4gIC0xMjY3Nzc1NjAxNDIwMTk5NS4zMTk2OTIzNzE0NDM5NDc3MiBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjA1OCAgZGl2aWRlICAgODA2NzkxODc2Mi4xMzQ2MjE2MzkyNTQ5MTY3ODY5NDU1NDcgICAgICAgIC04Ljc3NDc3MTQ4MDA1NTUzNjAwOTEwNTU5NjE2Mzg2NDc1OEUrOTU0ICAgIC0+ICAtOS4xOTQ0NDg4NTg4MzYzMzIxNTY3NjY3NjQ2MDUxMjUyNDVFLTk0NiBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjA1OSAgZGl2aWRlICAgOC43MDIwOTM0NTQxMjMwNDY1MDc1NzgyNTY4OTk1Mzc1NjNFLTMyNCAgIC01Ljg3NTM5OTczMzAxNjAxODQwNDU4MDIwMTE3NjU3NjI5M0UtNDAxICAgIC0+ICAtMS40ODExMDY2MjI0NTIwNTI1ODE0NzA0NDM1MjY5NTczMzVFKzc3IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDYwICBkaXZpZGUgIC00MTQyNi4wMTY2MjUxODQ1MTg2MTM4NjM1MjQxNTA5MjM1NiAgICAgICAgIDkwLjAwMTQ2NjIxNjg0NDc4MzAwNTEwNzY5ODAyMDEzNDY0ICAgICAgICAgLT4gIC00NjAuMjgxNTc1MDI4NzMxODY5MjczMjA2NzcwOTE3NjIwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gcmFuZG9tIGRpdmlkZSB0ZXN0cyB3aXRoIHJlc3VsdCBuZWFyIDEKK2RxZGl2NDAwMSBkaXZpZGUgIDIwMDMxMDAzNTI3NzA3NTM5Njk4Nzg5MjU2NjQ1MjQ5MDAgICAyMDAzMTAwMzUyNzcwNzUzOTY5ODc4OTI1NjY0NDk3ODI0ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTM1MTcgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDAyIGRpdmlkZSAgNDgxNzc4NTc5MzkxNjQ5MDY1MjU3OTU1MjMxODM3MTY0NSAgIDQ4MTc3ODU3OTM5MTY0OTA2NTI1Nzk1NTIzMTgzNjIwOTcgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTk4MiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMDMgZGl2aWRlICA4Mjk5MTg3NDEwOTIwMDY3MzI1NjQ4MDY4NDM5NTYwMjgyICAgODI5OTE4NzQxMDkyMDA2NzMyNTY0ODA2ODQzOTU5MTE1OSAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2Mjc5NSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMDQgZGl2aWRlICA1NjQxMDg4NDU1ODk3NDA3MDQ0NTQ0NDYxNzg1MzY1ODk5ICAgNTY0MTA4ODQ1NTg5NzQwNzA0NDU0NDQ2MTc4NTM4OTk2NSAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1NzMzOCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMDUgZGl2aWRlICA1NzUyMjc0Njk0NzA2NTQ1MzU5MzI2MzYxMzEzNDkwNDI0ICAgNTc1MjI3NDY5NDcwNjU0NTM1OTMyNjM2MTMxMzUwMjcyMyAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3ODYxOSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMDYgZGl2aWRlICA2NzYyMDc5NDc3MzczNjcwNTk0ODI5MzE5MzQ2MDk5NjY1ICAgNjc2MjA3OTQ3NzM3MzY3MDU5NDgyOTMxOTM0NjEzMjU3OSAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1MTMyNiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMDcgZGl2aWRlICA3Mjg2NDI1MTUzNjkxODkwMzQxNjMzMDIzMjIyNjAyOTE2ICAgNzI4NjQyNTE1MzY5MTg5MDM0MTYzMzAyMzIyMjYwNjU1NiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTAwNCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMDggZGl2aWRlICA5NDgxMjMzOTkxOTAxMzA1NzI3NjQ4MzA2NDIxOTQ2NjU1ICAgOTQ4MTIzMzk5MTkwMTMwNTcyNzY0ODMwNjQyMTkxOTEyNCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyOTA0ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAwOSBkaXZpZGUgIDQyODIwNTM5NDE4OTM5NTE3NDIwMjk0NDQwNjU2MTQzMTEgICA0MjgyMDUzOTQxODkzOTUxNzQyMDI5NDQ0MDY1NTgzMDc3ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcyOTQgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDEwIGRpdmlkZSAgIDYyNjg4ODIyNTQ0MTI1MDYzOTc0MTc4MTg1MDMzODY5NSAgICA2MjY4ODgyMjU0NDEyNTA2Mzk3NDE3ODE4NTAzMjcyOTkgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxODE3OSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMTEgZGl2aWRlICAzODYwOTczNjQ5MjIyMDI4MDA5NDU2NTk4NjA0NDY4NTQ3ICAgMzg2MDk3MzY0OTIyMjAyODAwOTQ1NjU5ODYwNDQ3Njg0OSAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3ODQ5OCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMTIgZGl2aWRlICA0NzUzMTU3MDgwMTI3NDY4MTI3OTA4MDYwNjA3ODIxODM5ICAgNDc1MzE1NzA4MDEyNzQ2ODEyNzkwODA2MDYwNzc4ODM3OSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3MDQwICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAxMyBkaXZpZGUgICA1NTI0NDg1NDYyMDM3NTQwNjI4MDU3MDYyNzc4ODA0MTkgICAgNTUyNDQ4NTQ2MjAzNzU0MDYyODA1NzA2Mjc3ODgxOTAzICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTczMTM4ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAxNCBkaXZpZGUgIDg0MDU5NTQ1Mjc5NTIxNTg0NTUzMjM3MTM3Mjg5MTczOTUgICA4NDA1OTU0NTI3OTUyMTU4NDU1MzIzNzEzNzI4OTMzODY2ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgwNDA2ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAxNSBkaXZpZGUgIDc1NTQwOTY1MDIyMzUzMjExNDI1NTU4MDIyMzgwMTYxMTYgICA3NTU0MDk2NTAyMjM1MzIxMTQyNTU1ODAyMjM4MDI2NTQ2ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTg2MTkzICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAxNiBkaXZpZGUgIDQwNTMyNTc2NzQxMjc1MTg2MDY4NzEwNTQ5MzQ3NDY3ODIgICA0MDUzMjU3Njc0MTI3NTE4NjA2ODcxMDU0OTM0NzY3MzU1ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTQ5MjQzICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAxNyBkaXZpZGUgIDcxMTI0MTk0MjA3NTUwOTA0NTQ3MTY4ODg4NDQwMTE1ODIgICA3MTEyNDE5NDIwNzU1MDkwNDU0NzE2ODg4ODQ0MDM4MTA1ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYyNzA5ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAxOCBkaXZpZGUgIDMxMzIzMDIxMzc1MjAwNzI3MjgxNjQ1NDk3MzA5MTE4NDYgICAzMTMyMzAyMTM3NTIwMDcyNzI4MTY0NTQ5NzMwOTA4NDE2ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwOTUgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDE5IGRpdmlkZSAgNDc4ODM3NDA0NTg0MTQxNjM1NTcwNjcxNTA0ODE2MTAxMyAgIDQ3ODgzNzQwNDU4NDE0MTYzNTU3MDY3MTUwNDgxOTAwNzcgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MzkzMDMgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDIwIGRpdmlkZSAgOTQ2NjAyMTYzNjA0NzYzMDIxODIzODA3NTA5OTUxMDU5NyAgIDk0NjYwMjE2MzYwNDc2MzAyMTgyMzgwNzUwOTk0ODQwNTMgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjgwNCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMjEgZGl2aWRlICAgOTEyNzQyNzQ1NjQ2NzY1NjI1NTk3Mzk5NjkyMTM4NjUwICAgIDkxMjc0Mjc0NTY0Njc2NTYyNTU5NzM5OTY5MjEzOTA0MiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTcwNSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMjIgZGl2aWRlICA5NTA4NDAyNzQyOTMzNjQzMjA4ODA2MjY0ODk3MTg4NTA0ICAgOTUwODQwMjc0MjkzMzY0MzIwODgwNjI2NDg5NzE5NTk3MyAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjE0NSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMjMgZGl2aWRlICAxMTg2OTU2Nzk1NzI3MjMzNzA0OTYyMzYxOTE0MzYwODk1ICAgMTE4Njk1Njc5NTcyNzIzMzcwNDk2MjM2MTkxNDMyOTU3NyAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI2Mzg1ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAyNCBkaXZpZGUgIDU5NzIyMTAyNjg4MzkwMTQ4MTI2OTY5MTYxNzA5Njc5MzggICA1OTcyMjEwMjY4ODM5MDE0ODEyNjk2OTE2MTcwOTU0OTc0ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIxNzEgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDI1IGRpdmlkZSAgMjMwMzgwMTYyNTUyMTYxOTkzMDg5NDQ2MDEzOTc5MzE0MCAgIDIzMDM4MDE2MjU1MjE2MTk5MzA4OTQ0NjAxMzk3OTk2NDMgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NzE3NzMgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDI2IGRpdmlkZSAgNjAyMjIzMTU2MDAwMjg5ODI2NDc3NzM5MzQ3Mzk2NjU5NSAgIDYwMjIyMzE1NjAwMDI4OTgyNjQ3NzczOTM0NzM5NDcxOTggIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzIyMSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMjcgZGl2aWRlICA4NDI2MTQ4MzM1ODAxMzk2MTk5OTY5MzQ2MDMyMjEwODkzICAgODQyNjE0ODMzNTgwMTM5NjE5OTk2OTM0NjAzMjIwMzE3OSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOTE1ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAyOCBkaXZpZGUgIDg4MTIyNzg5NDcwMjg3ODQ2MzczODI4NDcwOTg0MTE3NDkgICA4ODEyMjc4OTQ3MDI4Nzg0NjM3MzgyODQ3MDk4Mzg1MzE3ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI5OTkgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDI5IGRpdmlkZSAgODE0NTI4MjAwMjM0ODM2NzM4MzI2NDE5NzE3MDExNjE0NiAgIDgxNDUyODIwMDIzNDgzNjczODMyNjQxOTcxNzAwODM5ODggIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzk0OCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMzAgZGl2aWRlICA2ODIxNTc3NTcxODc2ODQwMTUzMTIzNTEwMTA3Mzg3MDI2ICAgNjgyMTU3NzU3MTg3Njg0MDE1MzEyMzUxMDEwNzQxODAwOCAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1NDU4MiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMzEgZGl2aWRlICA5MDE4NTU1MzE5NTE4OTY2OTcwNDgwNTY1NDgyMDIzNzIwICAgOTAxODU1NTMxOTUxODk2Njk3MDQ4MDU2NTQ4MjAxMzM0NiAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTUwICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAzMiBkaXZpZGUgIDQ2MDIxNTU3MTI5OTgyMjg0NDk2NDA3MTcyNTI3ODg4NjQgICA0NjAyMTU1NzEyOTk4MjI4NDQ5NjQwNzE3MjUyODE4NTAyICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTM1NjAwICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAzMyBkaXZpZGUgIDY2NzU2MDc0ODE1MjI3ODU2MTQ1MDY4MjgyOTIyNjQ0NzIgICA2Njc1NjA3NDgxNTIyNzg1NjE0NTA2ODI4MjkyMjc3MTAwICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgxMDgzICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAzNCBkaXZpZGUgIDQwMTU4ODE1MTY4NzE4MzM4OTc3NjY5NDU4MzYyNjQ0NzIgICA0MDE1ODgxNTE2ODcxODMzODk3NzY2OTQ1ODM2MjYyNjQ1ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0NTUgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDM1IGRpdmlkZSAgMTQxNTU4MDIwNTkzMzQxMTgzNzU5NTQ1OTcxNjkxMDM2NSAgIDE0MTU1ODAyMDU5MzM0MTE4Mzc1OTU0NTk3MTY4ODAxMzkgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMTM1MiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMzYgZGl2aWRlICA5NDMyOTY4Mjk3MDY5NTQyODE2NzUyMDM1Mjc2MzYxNTUyICAgOTQzMjk2ODI5NzA2OTU0MjgxNjc1MjAzNTI3NjM1MzA1NCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOTAxICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAzNyBkaXZpZGUgIDQ3OTkzMTk1OTEzMDM4NDg1MDA1MzI3NjY2ODIxNDA2NTggICA0Nzk5MzE5NTkxMzAzODQ4NTAwNTMyNzY2NjgyMTcyNjU1ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTMzMzMwICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAzOCBkaXZpZGUgICAzMTY4NTQyNzA3MzI4Mzk1Mjk3OTA1ODQyODQ5ODc0NzIgICAgMzE2ODU0MjcwNzMyODM5NTI5NzkwNTg0Mjg1MDA0ODMyICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NDUyMTE0ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAzOSBkaXZpZGUgIDM1OTg5ODEzMDA1OTI0OTA0Mjc4MjYwMjc5NzU2OTc0MTUgICAzNTk4OTgxMzAwNTkyNDkwNDI3ODI2MDI3OTc1Njg2NzEyICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI5NzQgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDQwIGRpdmlkZSAgMTY2NDMxNTQzNTY5NDQ2MTM3MTE1NTgwMDY4MjE5NjUyMCAgIDE2NjQzMTU0MzU2OTQ0NjEzNzExNTU4MDA2ODIxOTU2MTcgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDU0MyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNDEgZGl2aWRlICAxNjgwODcyMzE2NTMxMTI4ODkwMTAyODU1MzE2NTEwNTgxICAgMTY4MDg3MjMxNjUzMTEyODg5MDEwMjg1NTMxNjQ5NTU0NSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4OTQ1ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA0MiBkaXZpZGUgIDk4ODEyNzQ4Nzk1NjY0MDU0NzU3NTU0OTkyODE2NDQ3MzAgICA5ODgxMjc0ODc5NTY2NDA1NDc1NzU1NDk5MjgxNjE1NzQzICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI5MzQgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDQzIGRpdmlkZSAgNDczNzIyNTk1NzcxNzQ2Njk2MDQ0NzIwNDIzMjI3OTIxNiAgIDQ3MzcyMjU5NTc3MTc0NjY5NjA0NDcyMDQyMzIyNzc0NTIgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDM3MiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNDQgZGl2aWRlICAyNDgyMDk3Mzc5NDE0ODY3MDYxMjEzMzE5MzQ2NDE4Mjg4ICAgMjQ4MjA5NzM3OTQxNDg2NzA2MTIxMzMxOTM0NjM4NzkzNiAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMjI4ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA0NSBkaXZpZGUgIDc0MDY5Nzc1OTUyMzM3NjI3MjM1NzY0MzQxMjIxNjE4NjggICA3NDA2OTc3NTk1MjMzNzYyNzIzNTc2NDM0MTIyMTg5MDQyICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYzMzEzICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA0NiBkaXZpZGUgICAyMjg3ODIwNTc3NTc1NjYwNDcwODY1OTMyODE3NzM1NzcgICAgMjI4NzgyMDU3NzU3NTY2MDQ3MDg2NTkzMjgxNzY5NzI3ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTY4MjggIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDQ3IGRpdmlkZSAgMjk1NjU5NDI3MDI0MDU3OTY0ODgyMzI3MDU0MDM2NzY1MyAgIDI5NTY1OTQyNzAyNDA1Nzk2NDg4MjMyNzA1NDAzNjg1NTYgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTY5NDYgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDQ4IGRpdmlkZSAgNjMyNjk2NDA5ODg5NzYyMDYyMDUzNDEzNjc2NzYzNDM0MCAgIDYzMjY5NjQwOTg4OTc2MjA2MjA1MzQxMzY3Njc2MTkzMzkgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjM3MSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNDkgZGl2aWRlICAgNDE0NTg2NDQwNDU2NTkwMjE1MjQ3MDAyNjc4MzI3ODAwICAgIDQxNDU4NjQ0MDQ1NjU5MDIxNTI0NzAwMjY3ODMxNjkyMiAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI2MjM4ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA1MCBkaXZpZGUgIDczNjQ1NTIyMDg1NzAwMzkzODYyMjA1MDU2MzY3NzkxMjUgICA3MzY0NTUyMjA4NTcwMDM5Mzg2MjIwNTA1NjM2ODAzNTQ4ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTY2ODM3ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA1MSBkaXZpZGUgIDU2MjYyNjY3NDk5MDIzNjk3MTAwMjI4MjQ5NTA1OTAwNTYgICA1NjI2MjY2NzQ5OTAyMzY5NzEwMDIyODI0OTUwNTkxMDA4ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4MzA4ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA1MiBkaXZpZGUgIDQ4NjMyNzgyOTM5MTYxOTc0NTQ5ODc0ODEzNDM0NjA0ODQgICA0ODYzMjc4MjkzOTE2MTk3NDU0OTg3NDgxMzQzNDQyNTIyICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDM2OTMgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDUzIGRpdmlkZSAgMTE3MDcxMzU4MjAzMDYzNzM1OTcxMzI0OTc5NjgzNTQ4MyAgIDExNzA3MTM1ODIwMzA2MzczNTk3MTMyNDk3OTY4MjMzNDUgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDM2OCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNTQgZGl2aWRlICA5ODM4MDYyNDk0NzI1OTY1NjY3Nzc2MzI2NTU2MDUyOTMxICAgOTgzODA2MjQ5NDcyNTk2NTY2Nzc3NjMyNjU1NjA2MTAwMiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MTc5NiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNTUgZGl2aWRlICA0MDcxMzg4NzMxMjk4ODYxMDkzMDA1Njg3MDkxNDk4OTIyICAgNDA3MTM4ODczMTI5ODg2MTA5MzAwNTY4NzA5MTQ5ODI3OCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTU4ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA1NiBkaXZpZGUgIDg3NTMxNTU3MjIzMjQ3MDY3OTU4NTUwMzg1OTAyNzI1MjYgICA4NzUzMTU1NzIyMzI0NzA2Nzk1ODU1MDM4NTkwMjc2NjU2ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1MjgyICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA1NyBkaXZpZGUgIDQzOTk5NDE5MTE1MzMyNzM0MTg4NDQ3NDI2NTgyNDA0ODUgICA0Mzk5OTQxOTExNTMzMjczNDE4ODQ0NzQyNjU4MjE5ODkxICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ2ODEgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDU4IGRpdmlkZSAgNDEyNzg4NDE1OTk0OTUwMzY3Nzc3NjQzMDYyMDA1MDI2OSAgIDQxMjc4ODQxNTk5NDk1MDM2Nzc3NzY0MzA2MjAwMjYwOTEgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNTg1NyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNTkgZGl2aWRlICA1NTM2MTYwODIyMzYwODAwMDY3MDQyNTI4MzE3NDM4ODA4ICAgNTUzNjE2MDgyMjM2MDgwMDA2NzA0MjUyODMxNzQ1MDY4NyAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3ODU0MyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNjAgZGl2aWRlICAzOTczMjM0OTk4NDY4NjY0OTM2NjcxMDg4MjM3NzEwMjQ2ICAgMzk3MzIzNDk5ODQ2ODY2NDkzNjY3MTA4ODIzNzc0MTg4NiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMDM2NyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNjEgZGl2aWRlICA5ODI0ODU1OTM1NjM4MjYzNTkzNDEwNDQ0MTQyMzI3MzU4ICAgOTgyNDg1NTkzNTYzODI2MzU5MzQxMDQ0NDE0MjMyODU3NiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ODc2MCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNjIgZGl2aWRlICA1OTE3MDc4NTE3MzQwMjE4MTMxODY3MzI3MzAwODE0ODY3ICAgNTkxNzA3ODUxNzM0MDIxODEzMTg2NzMyNzMwMDc4ODcwMSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0NDIyICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA2MyBkaXZpZGUgIDQzNTQyMzY2MDE4MzA1NDQ4ODIyODYxMzk2MTI1MjEzNjIgICA0MzU0MjM2NjAxODMwNTQ0ODgyMjg2MTM5NjEyNTQzMjIzICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTQ5Nzk0ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA2NCBkaXZpZGUgIDgwNTg0NzQ3NzIzNzUyNTkwMTczNDIxMTAwMTM4OTEyOTQgICA4MDU4NDc0NzcyMzc1MjU5MDE3MzQyMTEwMDEzOTA2NzkyICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgwNzY4ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA2NSBkaXZpZGUgIDU1MTk2MDQwMjA5ODE3NDgxNzA1MTcwOTM3NDYxNjYzMjggICA1NTE5NjA0MDIwOTgxNzQ4MTcwNTE3MDkzNzQ2MTgxNzYzICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTcyMDM2ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA2NiBkaXZpZGUgIDE1MDIxMzA5NjY4Nzk4MDU0NTg4MzEzMjM3ODI0NDMxMzkgICAxNTAyMTMwOTY2ODc5ODA1NDU4ODMxMzIzNzgyNDEyMjEzICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjA1ODggIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDY3IGRpdmlkZSAgIDU2Mjc5NTYzMzcxOTQ4MTIxMjkxNTE1OTc4Nzk4MDI3MCAgICA1NjI3OTU2MzM3MTk0ODEyMTI5MTUxNTk3ODgwMDcwNjYgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1MjM4NzcgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDY4IGRpdmlkZSAgNjU4NDc0MzMyNDQ5NDY2NDI3Mzk0MTI4MTU1NzI2ODg3OCAgIDY1ODQ3NDMzMjQ0OTQ2NjQyNzM5NDEyODE1NTcyNTg5NDUgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTUwOCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNjkgZGl2aWRlICAzNjMyMDAwMzI3Mjg1NzQzOTk3OTc2NDMxMTA5NDE2NTAwICAgMzYzMjAwMDMyNzI4NTc0Mzk5Nzk3NjQzMTEwOTQwODEwNyAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMzExICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA3MCBkaXZpZGUgIDExNDU4MjcyMzczMTU0MzAwODkzODg5NTM4Mzg1NjE0NTAgICAxMTQ1ODI3MjM3MzE1NDMwMDg5Mzg4OTUzODM4NTI3MzMyICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjk3NzYgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDcxIGRpdmlkZSAgODg3NDQzMTAxMDM1NzY5MTg2OTcyNTM3MjMxNzM1MDM4MCAgIDg4NzQ0MzEwMTAzNTc2OTE4Njk3MjUzNzIzMTczMTY0NzIgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzgyMSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNzIgZGl2aWRlICAgOTkyOTQ4NzE4OTAyODA0NjQ4MTE5NzUzMTQxMjAyMTk2ICAgIDk5Mjk0ODcxODkwMjgwNDY0ODExOTc1MzE0MTIzNTIyMiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTY2NzM5NSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNzMgZGl2aWRlICAyNTIyNzM1MTgzMzc0MjE4NTA1MTQyNDE3MjY1NDM5OTg5ICAgMjUyMjczNTE4MzM3NDIxODUwNTE0MjQxNzI2NTQ1Mzc3OSAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk0NTMzNyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNzQgZGl2aWRlICAyNjY4NDE5MTYxOTEyOTM2NTA4MDA2ODcyMzAzNTAxMDUyICAgMjY2ODQxOTE2MTkxMjkzNjUwODAwNjg3MjMwMzQ3MTAzNiAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMjQ5ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA3NSBkaXZpZGUgIDMwMzYxNjkwODU2NjUxODY3MTI1OTA5NDExMTE3NzUwOTIgICAzMDM2MTY5MDg1NjY1MTg2NzEyNTkwOTQxMTExODA4ODQ2ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ODg4ODI3ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA3NiBkaXZpZGUgIDk0NDE2MzQ2MDQ5MTcyMzE2Mzg1MDg4OTg5MzQwMDYxNDcgICA5NDQxNjM0NjA0OTE3MjMxNjM4NTA4ODk4OTM0MDAwMjg4ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MjEgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDc3IGRpdmlkZSAgMjY3NzMwMTM1MzE2NDM3NzA5MTExMTQ1ODgxMTgzOTE5MCAgIDI2NzczMDEzNTMxNjQzNzcwOTExMTE0NTg4MTE4Njc3MjIgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4OTM0MzAgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDc4IGRpdmlkZSAgNjg0NDk3OTIwMzExMjA2NjE2NjU4Mzc2NTg1NzE3MTQyNiAgIDY4NDQ5NzkyMDMxMTIwNjYxNjY1ODM3NjU4NTcxODk2ODIgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NzMzMjkgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDc5IGRpdmlkZSAgMjIyMDMzNzQzNTE0MTc5NjcyNDMyMzc4Mzk2MDIzMTY2MSAgIDIyMjAzMzc0MzUxNDE3OTY3MjQzMjM3ODM5NjAyMDg3NzggIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDMwNiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwODAgZGl2aWRlICA2NDQ3NDI0NzAwMDE5NzgzOTMxNTY5OTk2OTg5NTYxMzgwICAgNjQ0NzQyNDcwMDAxOTc4MzkzMTU2OTk5Njk4OTU3MjQ1NCAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4MjgyNCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwODEgZGl2aWRlICA3NTEyODU2NzYyNjk2NjA3MTE5ODQ3MDkyMTk1NTg3MTgwICAgNzUxMjg1Njc2MjY5NjYwNzExOTg0NzA5MjE5NTU1NzM0NiAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzOTcxICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA4MiBkaXZpZGUgIDczOTUyNjE5ODExOTM5NjAzOTkwODc4MTkwNzcyMzc0ODIgICA3Mzk1MjYxOTgxMTkzOTYwMzk5MDg3ODE5MDc3MjQyNDg3ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkzMjMyICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA4MyBkaXZpZGUgIDIyNTM0NDI0Njc2ODI1ODQwMzU3OTI3MjQ4ODQzNzY3MzUgICAyMjUzNDQyNDY3NjgyNTg0MDM1NzkyNzI0ODg0NDA3MTc4ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ODY0OTA0ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA4NCBkaXZpZGUgIDgxNTMxMzg2ODAzMDAyMTMxMzU1NzczMzY0NjYxOTA5OTcgICA4MTUzMTM4NjgwMzAwMjEzMTM1NTc3MzM2NDY2MjIwNjA3ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYzNjgzICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA4NSBkaXZpZGUgIDQ2Njg3MzEyNTIyNTQxNDgwNzQwNDEwMjI2ODE4MDEzOTAgICA0NjY4NzMxMjUyMjU0MTQ4MDc0MDQxMDIyNjgxNzc4MTAxICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ5ODggIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDg2IGRpdmlkZSAgNjA3ODQwNDU1Nzk5MzY2OTY5NjA0MDQyNTUwMTgxNTA1NiAgIDYwNzg0MDQ1NTc5OTM2Njk2OTYwNDA0MjU1MDE3OTc2MTIgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjg3MCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwODcgZGl2aWRlICAyMzA2MzUyMzU5ODc0MjYxNjIzMjIzMzU2ODc4MzE2Mjc4ICAgMjMwNjM1MjM1OTg3NDI2MTYyMzIyMzM1Njg3ODMzNTYxMiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkxNjE3MSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwODggZGl2aWRlICAzMjY0ODQyMTg2NjY4NDgwMzYyOTAwOTA5NTY0MDkxOTA4ICAgMzI2NDg0MjE4NjY2ODQ4MDM2MjkwMDkwOTU2NDA1ODY1OCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMTg0ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA4OSBkaXZpZGUgIDY5NzE5ODUwNDcyNzk2MzY4Nzg5NTc5NTk2MDg2MTIyMDQgICA2OTcxOTg1MDQ3Mjc5NjM2ODc4OTU3OTU5NjA4NjE1MDg4ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1ODYzICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA5MCBkaXZpZGUgIDUyNjI4MTA4ODk5NTI3MjEyMzU0NjY0NDU5NzM4MTYyNTcgICA1MjYyODEwODg5OTUyNzIxMjM1NDY2NDQ1OTczNzgzMDc3ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYzMDUgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDkxIGRpdmlkZSAgNzk0Nzk0NDczMTAzNTI2NzE3ODU0ODM1NzA3MDA4MDI4OCAgIDc5NDc5NDQ3MzEwMzUyNjcxNzg1NDgzNTcwNzAwNjEzMzkgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjM4NCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwOTIgZGl2aWRlICA1MDcxODA4OTA4Mzk1Mzc1MTA4MzgzMDM1ODAwNDQzMjI5ICAgNTA3MTgwODkwODM5NTM3NTEwODM4MzAzNTgwMDQxMjQyOSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MDczICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA5MyBkaXZpZGUgIDIwNDMxNDY1NDIwODQ1MDM2NTU1MTE1MDcyMDkyNjI5NjkgICAyMDQzMTQ2NTQyMDg0NTAzNjU1NTExNTA3MjA5MjQ5MjYzICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDY3MDggIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDk0IGRpdmlkZSAgNDA5NzYzMjczNTM4NDUzNDE4MTY2MTk1OTczMTI2NDgwMiAgIDQwOTc2MzI3MzUzODQ1MzQxODE2NjE5NTk3MzEyMzQ0OTkgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzM5NSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwOTUgZGl2aWRlICAzMDYxNDc3NjQyODMxMzg3NDg5NzI5NDY0NTg3MDQ0NDMwICAgMzA2MTQ3NzY0MjgzMTM4NzQ4OTcyOTQ2NDU4NzA1OTQ1MiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1MDkzMiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwOTYgZGl2aWRlICAzNDI5ODU0OTQxMDM5Nzc2MTU5NDk4ODAyOTM2MjUyNjM4ICAgMzQyOTg1NDk0MTAzOTc3NjE1OTQ5ODgwMjkzNjI0NjQxNSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxODE0ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA5NyBkaXZpZGUgIDQ4NzQzMjQ5Nzk1Nzg1OTk3MDAwMjQxMzMyNzgyODQ1NDUgICA0ODc0MzI0OTc5NTc4NTk5NzAwMDI0MTMzMjc4MjYyMTMxICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ1OTggIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDk4IGRpdmlkZSAgNTcwMTY1MjM2OTY5MTgzMzU0MTQ1NTk3ODUxNTgyMDg4MiAgIDU3MDE2NTIzNjk2OTE4MzM1NDE0NTU5Nzg1MTU4MzQ4NTQgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NzU0OTUgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDk5IGRpdmlkZSAgMjkyODIwNTcyODQwMjk0NTI2Njk1MzI1NTYzMjM0MzExMyAgIDI5MjgyMDU3Mjg0MDI5NDUyNjY5NTMyNTU2MzIzNzM3OTQgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4OTUyMjMgIEluZXhhY3QgUm91bmRlZAorCistLSBOdWxsIHRlc3RzCitkcWRpdjk5OTggZGl2aWRlIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY5OTk5IGRpdmlkZSAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcURpdmlkZUludC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcURpdmlkZUludC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOTAzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxRGl2aWRlSW50LmRlY1Rlc3QKQEAgLTAsMCArMSw0NTMgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFEaXZpZGVJbnQuZGVjVGVzdCAtLSBkZWNRdWFkIGludGVnZXIgZGl2aXNpb24gICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCisKK2RxZHZpMDAxIGRpdmlkZWludCAgMSAgICAgMSAgICAtPiAgMQorZHFkdmkwMDIgZGl2aWRlaW50ICAyICAgICAxICAgIC0+ICAyCitkcWR2aTAwMyBkaXZpZGVpbnQgIDEgICAgIDIgICAgLT4gIDAKK2RxZHZpMDA0IGRpdmlkZWludCAgMiAgICAgMiAgICAtPiAgMQorZHFkdmkwMDUgZGl2aWRlaW50ICAwICAgICAxICAgIC0+ICAwCitkcWR2aTAwNiBkaXZpZGVpbnQgIDAgICAgIDIgICAgLT4gIDAKK2RxZHZpMDA3IGRpdmlkZWludCAgMSAgICAgMyAgICAtPiAgMAorZHFkdmkwMDggZGl2aWRlaW50ICAyICAgICAzICAgIC0+ICAwCitkcWR2aTAwOSBkaXZpZGVpbnQgIDMgICAgIDMgICAgLT4gIDEKKworZHFkdmkwMTAgZGl2aWRlaW50ICAyLjQgICAxICAgIC0+ICAyCitkcWR2aTAxMSBkaXZpZGVpbnQgIDIuNCAgIC0xICAgLT4gIC0yCitkcWR2aTAxMiBkaXZpZGVpbnQgIC0yLjQgIDEgICAgLT4gIC0yCitkcWR2aTAxMyBkaXZpZGVpbnQgIC0yLjQgIC0xICAgLT4gIDIKK2RxZHZpMDE0IGRpdmlkZWludCAgMi40MCAgMSAgICAtPiAgMgorZHFkdmkwMTUgZGl2aWRlaW50ICAyLjQwMCAxICAgIC0+ICAyCitkcWR2aTAxNiBkaXZpZGVpbnQgIDIuNCAgIDIgICAgLT4gIDEKK2RxZHZpMDE3IGRpdmlkZWludCAgMi40MDAgMiAgICAtPiAgMQorZHFkdmkwMTggZGl2aWRlaW50ICAyLiAgICAyICAgIC0+ICAxCitkcWR2aTAxOSBkaXZpZGVpbnQgIDIwICAgIDIwICAgLT4gIDEKKworZHFkdmkwMjAgZGl2aWRlaW50ICAxODcgICAxODcgIC0+ICAxCitkcWR2aTAyMSBkaXZpZGVpbnQgIDUgICAgIDIgICAgLT4gIDIKK2RxZHZpMDIyIGRpdmlkZWludCAgNSAgICAgMi4wICAgIC0+ICAyCitkcWR2aTAyMyBkaXZpZGVpbnQgIDUgICAgIDIuMDAwICAtPiAgMgorZHFkdmkwMjQgZGl2aWRlaW50ICA1ICAgICAwLjIwMCAgLT4gIDI1CitkcWR2aTAyNSBkaXZpZGVpbnQgIDUgICAgIDAuMjAwICAtPiAgMjUKKworZHFkdmkwMzAgZGl2aWRlaW50ICAxICAgICAyICAgICAgLT4gIDAKK2RxZHZpMDMxIGRpdmlkZWludCAgMSAgICAgNCAgICAgIC0+ICAwCitkcWR2aTAzMiBkaXZpZGVpbnQgIDEgICAgIDggICAgICAtPiAgMAorZHFkdmkwMzMgZGl2aWRlaW50ICAxICAgICAxNiAgICAgLT4gIDAKK2RxZHZpMDM0IGRpdmlkZWludCAgMSAgICAgMzIgICAgIC0+ICAwCitkcWR2aTAzNSBkaXZpZGVpbnQgIDEgICAgIDY0ICAgICAtPiAgMAorZHFkdmkwNDAgZGl2aWRlaW50ICAxICAgIC0yICAgICAgLT4gLTAKK2RxZHZpMDQxIGRpdmlkZWludCAgMSAgICAtNCAgICAgIC0+IC0wCitkcWR2aTA0MiBkaXZpZGVpbnQgIDEgICAgLTggICAgICAtPiAtMAorZHFkdmkwNDMgZGl2aWRlaW50ICAxICAgIC0xNiAgICAgLT4gLTAKK2RxZHZpMDQ0IGRpdmlkZWludCAgMSAgICAtMzIgICAgIC0+IC0wCitkcWR2aTA0NSBkaXZpZGVpbnQgIDEgICAgLTY0ICAgICAtPiAtMAorZHFkdmkwNTAgZGl2aWRlaW50IC0xICAgICAyICAgICAgLT4gLTAKK2RxZHZpMDUxIGRpdmlkZWludCAtMSAgICAgNCAgICAgIC0+IC0wCitkcWR2aTA1MiBkaXZpZGVpbnQgLTEgICAgIDggICAgICAtPiAtMAorZHFkdmkwNTMgZGl2aWRlaW50IC0xICAgICAxNiAgICAgLT4gLTAKK2RxZHZpMDU0IGRpdmlkZWludCAtMSAgICAgMzIgICAgIC0+IC0wCitkcWR2aTA1NSBkaXZpZGVpbnQgLTEgICAgIDY0ICAgICAtPiAtMAorZHFkdmkwNjAgZGl2aWRlaW50IC0xICAgIC0yICAgICAgLT4gIDAKK2RxZHZpMDYxIGRpdmlkZWludCAtMSAgICAtNCAgICAgIC0+ICAwCitkcWR2aTA2MiBkaXZpZGVpbnQgLTEgICAgLTggICAgICAtPiAgMAorZHFkdmkwNjMgZGl2aWRlaW50IC0xICAgIC0xNiAgICAgLT4gIDAKK2RxZHZpMDY0IGRpdmlkZWludCAtMSAgICAtMzIgICAgIC0+ICAwCitkcWR2aTA2NSBkaXZpZGVpbnQgLTEgICAgLTY0ICAgICAtPiAgMAorCistLSBzaW1pbGFyIHdpdGggcG93ZXJzIG9mIHRlbgorZHFkdmkxNjAgZGl2aWRlaW50ICAxICAgICAxICAgICAgICAgLT4gIDEKK2RxZHZpMTYxIGRpdmlkZWludCAgMSAgICAgMTAgICAgICAgIC0+ICAwCitkcWR2aTE2MiBkaXZpZGVpbnQgIDEgICAgIDEwMCAgICAgICAtPiAgMAorZHFkdmkxNjMgZGl2aWRlaW50ICAxICAgICAxMDAwICAgICAgLT4gIDAKK2RxZHZpMTY0IGRpdmlkZWludCAgMSAgICAgMTAwMDAgICAgIC0+ICAwCitkcWR2aTE2NSBkaXZpZGVpbnQgIDEgICAgIDEwMDAwMCAgICAtPiAgMAorZHFkdmkxNjYgZGl2aWRlaW50ICAxICAgICAxMDAwMDAwICAgLT4gIDAKK2RxZHZpMTY3IGRpdmlkZWludCAgMSAgICAgMTAwMDAwMDAgIC0+ICAwCitkcWR2aTE2OCBkaXZpZGVpbnQgIDEgICAgIDEwMDAwMDAwMCAtPiAgMAorZHFkdmkxNzAgZGl2aWRlaW50ICAxICAgIC0xICAgICAgICAgLT4gLTEKK2RxZHZpMTcxIGRpdmlkZWludCAgMSAgICAtMTAgICAgICAgIC0+IC0wCitkcWR2aTE3MiBkaXZpZGVpbnQgIDEgICAgLTEwMCAgICAgICAtPiAtMAorZHFkdmkxNzMgZGl2aWRlaW50ICAxICAgIC0xMDAwICAgICAgLT4gLTAKK2RxZHZpMTc0IGRpdmlkZWludCAgMSAgICAtMTAwMDAgICAgIC0+IC0wCitkcWR2aTE3NSBkaXZpZGVpbnQgIDEgICAgLTEwMDAwMCAgICAtPiAtMAorZHFkdmkxNzYgZGl2aWRlaW50ICAxICAgIC0xMDAwMDAwICAgLT4gLTAKK2RxZHZpMTc3IGRpdmlkZWludCAgMSAgICAtMTAwMDAwMDAgIC0+IC0wCitkcWR2aTE3OCBkaXZpZGVpbnQgIDEgICAgLTEwMDAwMDAwMCAtPiAtMAorZHFkdmkxODAgZGl2aWRlaW50IC0xICAgICAxICAgICAgICAgLT4gLTEKK2RxZHZpMTgxIGRpdmlkZWludCAtMSAgICAgMTAgICAgICAgIC0+IC0wCitkcWR2aTE4MiBkaXZpZGVpbnQgLTEgICAgIDEwMCAgICAgICAtPiAtMAorZHFkdmkxODMgZGl2aWRlaW50IC0xICAgICAxMDAwICAgICAgLT4gLTAKK2RxZHZpMTg0IGRpdmlkZWludCAtMSAgICAgMTAwMDAgICAgIC0+IC0wCitkcWR2aTE4NSBkaXZpZGVpbnQgLTEgICAgIDEwMDAwMCAgICAtPiAtMAorZHFkdmkxODYgZGl2aWRlaW50IC0xICAgICAxMDAwMDAwICAgLT4gLTAKK2RxZHZpMTg3IGRpdmlkZWludCAtMSAgICAgMTAwMDAwMDAgIC0+IC0wCitkcWR2aTE4OCBkaXZpZGVpbnQgLTEgICAgIDEwMDAwMDAwMCAtPiAtMAorZHFkdmkxOTAgZGl2aWRlaW50IC0xICAgIC0xICAgICAgICAgLT4gIDEKK2RxZHZpMTkxIGRpdmlkZWludCAtMSAgICAtMTAgICAgICAgIC0+ICAwCitkcWR2aTE5MiBkaXZpZGVpbnQgLTEgICAgLTEwMCAgICAgICAtPiAgMAorZHFkdmkxOTMgZGl2aWRlaW50IC0xICAgIC0xMDAwICAgICAgLT4gIDAKK2RxZHZpMTk0IGRpdmlkZWludCAtMSAgICAtMTAwMDAgICAgIC0+ICAwCitkcWR2aTE5NSBkaXZpZGVpbnQgLTEgICAgLTEwMDAwMCAgICAtPiAgMAorZHFkdmkxOTYgZGl2aWRlaW50IC0xICAgIC0xMDAwMDAwICAgLT4gIDAKK2RxZHZpMTk3IGRpdmlkZWludCAtMSAgICAtMTAwMDAwMDAgIC0+ICAwCitkcWR2aTE5OCBkaXZpZGVpbnQgLTEgICAgLTEwMDAwMDAwMCAtPiAgMAorCistLSBzb21lIGxvbmcgb3BlcmFuZCAoYXQgcD05KSBjYXNlcworZHFkdmkwNzAgZGl2aWRlaW50ICA5OTk5OTk5OTkgICAgIDEgIC0+ICA5OTk5OTk5OTkKK2RxZHZpMDcxIGRpdmlkZWludCAgOTk5OTk5OTk5LjQgICAxICAtPiAgOTk5OTk5OTk5CitkcWR2aTA3MiBkaXZpZGVpbnQgIDk5OTk5OTk5OS41ICAgMSAgLT4gIDk5OTk5OTk5OQorZHFkdmkwNzMgZGl2aWRlaW50ICA5OTk5OTk5OTkuOSAgIDEgIC0+ICA5OTk5OTk5OTkKK2RxZHZpMDc0IGRpdmlkZWludCAgOTk5OTk5OTk5Ljk5OSAxICAtPiAgOTk5OTk5OTk5CisKK2RxZHZpMDkwIGRpdmlkZWludCAgMC4gICAgICAgICAgICAxICAgIC0+ICAwCitkcWR2aTA5MSBkaXZpZGVpbnQgIC4wICAgICAgICAgICAgMSAgICAtPiAgMAorZHFkdmkwOTIgZGl2aWRlaW50ICAwLjAwICAgICAgICAgIDEgICAgLT4gIDAKK2RxZHZpMDkzIGRpdmlkZWludCAgMC4wMEUrOSAgICAgICAxICAgIC0+ICAwCitkcWR2aTA5NCBkaXZpZGVpbnQgIDAuMDAwMEUtNTAgICAgMSAgICAtPiAgMAorCitkcWR2aTEwMCBkaXZpZGVpbnQgIDEgIDEgICAtPiAxCitkcWR2aTEwMSBkaXZpZGVpbnQgIDEgIDIgICAtPiAwCitkcWR2aTEwMiBkaXZpZGVpbnQgIDEgIDMgICAtPiAwCitkcWR2aTEwMyBkaXZpZGVpbnQgIDEgIDQgICAtPiAwCitkcWR2aTEwNCBkaXZpZGVpbnQgIDEgIDUgICAtPiAwCitkcWR2aTEwNSBkaXZpZGVpbnQgIDEgIDYgICAtPiAwCitkcWR2aTEwNiBkaXZpZGVpbnQgIDEgIDcgICAtPiAwCitkcWR2aTEwNyBkaXZpZGVpbnQgIDEgIDggICAtPiAwCitkcWR2aTEwOCBkaXZpZGVpbnQgIDEgIDkgICAtPiAwCitkcWR2aTEwOSBkaXZpZGVpbnQgIDEgIDEwICAtPiAwCitkcWR2aTExMCBkaXZpZGVpbnQgIDEgIDEgICAtPiAxCitkcWR2aTExMSBkaXZpZGVpbnQgIDIgIDEgICAtPiAyCitkcWR2aTExMiBkaXZpZGVpbnQgIDMgIDEgICAtPiAzCitkcWR2aTExMyBkaXZpZGVpbnQgIDQgIDEgICAtPiA0CitkcWR2aTExNCBkaXZpZGVpbnQgIDUgIDEgICAtPiA1CitkcWR2aTExNSBkaXZpZGVpbnQgIDYgIDEgICAtPiA2CitkcWR2aTExNiBkaXZpZGVpbnQgIDcgIDEgICAtPiA3CitkcWR2aTExNyBkaXZpZGVpbnQgIDggIDEgICAtPiA4CitkcWR2aTExOCBkaXZpZGVpbnQgIDkgIDEgICAtPiA5CitkcWR2aTExOSBkaXZpZGVpbnQgIDEwIDEgICAtPiAxMAorCistLSBmcm9tIERpYWdCaWdEZWNpbWFsCitkcWR2aTEzMSBkaXZpZGVpbnQgIDEwMS4zICAgMSAgICAgLT4gIDEwMQorZHFkdmkxMzIgZGl2aWRlaW50ICAxMDEuMCAgIDEgICAgIC0+ICAxMDEKK2RxZHZpMTMzIGRpdmlkZWludCAgMTAxLjMgICAzICAgICAtPiAgMzMKK2RxZHZpMTM0IGRpdmlkZWludCAgMTAxLjAgICAzICAgICAtPiAgMzMKK2RxZHZpMTM1IGRpdmlkZWludCAgMi40ICAgICAxICAgICAtPiAgMgorZHFkdmkxMzYgZGl2aWRlaW50ICAyLjQwMCAgIDEgICAgIC0+ICAyCitkcWR2aTEzNyBkaXZpZGVpbnQgIDE4ICAgICAgMTggICAgLT4gIDEKK2RxZHZpMTM4IGRpdmlkZWludCAgMTEyMCAgICAxMDAwICAtPiAgMQorZHFkdmkxMzkgZGl2aWRlaW50ICAyLjQgICAgIDIgICAgIC0+ICAxCitkcWR2aTE0MCBkaXZpZGVpbnQgIDIuNDAwICAgMiAgICAgLT4gIDEKK2RxZHZpMTQxIGRpdmlkZWludCAgMC41ICAgICAyLjAwMCAtPiAgMAorZHFkdmkxNDIgZGl2aWRlaW50ICA4LjAwNSAgIDcgICAgIC0+ICAxCitkcWR2aTE0MyBkaXZpZGVpbnQgIDUgICAgICAgMiAgICAgLT4gIDIKK2RxZHZpMTQ0IGRpdmlkZWludCAgMCAgICAgICAyICAgICAtPiAgMAorZHFkdmkxNDUgZGl2aWRlaW50ICAwLjAwICAgIDIgICAgIC0+ICAwCisKKy0tIE90aGVycworZHFkdmkxNTAgZGl2aWRlaW50ICAxMjM0NSAgNC45OTkgIC0+ICAyNDY5CitkcWR2aTE1MSBkaXZpZGVpbnQgIDEyMzQ1ICA0Ljk5ICAgLT4gIDI0NzMKK2RxZHZpMTUyIGRpdmlkZWludCAgMTIzNDUgIDQuOSAgICAtPiAgMjUxOQorZHFkdmkxNTMgZGl2aWRlaW50ICAxMjM0NSAgNSAgICAgIC0+ICAyNDY5CitkcWR2aTE1NCBkaXZpZGVpbnQgIDEyMzQ1ICA1LjEgICAgLT4gIDI0MjAKK2RxZHZpMTU1IGRpdmlkZWludCAgMTIzNDUgIDUuMDEgICAtPiAgMjQ2NAorZHFkdmkxNTYgZGl2aWRlaW50ICAxMjM0NSAgNS4wMDEgIC0+ICAyNDY4CitkcWR2aTE1NyBkaXZpZGVpbnQgICAgMTAxICA3LjYgICAgLT4gIDEzCisKKy0tIFZhcmlvdXMgZmxhdm91cnMgb2YgZGl2aWRlaW50IGJ5IDAKK2RxZHZpMjAxIGRpdmlkZWludCAgMCAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcWR2aTIwMiBkaXZpZGVpbnQgIDAuMEU1ICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFkdmkyMDMgZGl2aWRlaW50ICAwLjAwMCAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxZHZpMjA0IGRpdmlkZWludCAgMC4wMDAxIDAgICAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTIwNSBkaXZpZGVpbnQgIDAuMDEgICAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMDYgZGl2aWRlaW50ICAwLjEgICAgMCAgIC0+IEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpMjA3IGRpdmlkZWludCAgMSAgICAgIDAgICAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTIwOCBkaXZpZGVpbnQgIDEgICAgICAwLjAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMDkgZGl2aWRlaW50IDEwICAgICAgMC4wIC0+IEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpMjEwIGRpdmlkZWludCAxRSsxMDAgIDAuMCAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTIxMSBkaXZpZGVpbnQgMUUrMzgwICAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMTQgZGl2aWRlaW50ICAtMC4wMDAxIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMTUgZGl2aWRlaW50ICAtMC4wMSAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMTYgZGl2aWRlaW50ICAtMC4xICAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMTcgZGl2aWRlaW50ICAtMSAgICAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMTggZGl2aWRlaW50ICAtMSAgICAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMTkgZGl2aWRlaW50IC0xMCAgICAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMjAgZGl2aWRlaW50IC0xRSsxMDAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMjEgZGl2aWRlaW50IC0xRSszODAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCistLSB0ZXN0IHNvbWUgY2FzZXMgdGhhdCBhcmUgY2xvc2UgdG8gZXhwb25lbnQgb3ZlcmZsb3cKK2RxZHZpMjcwIGRpdmlkZWludCAxIDFlMzg0ICAgICAgICAgIC0+IDAKK2RxZHZpMjcxIGRpdmlkZWludCAxIDAuOWUzODQgICAgICAgIC0+IDAKK2RxZHZpMjcyIGRpdmlkZWludCAxIDAuOTllMzg0ICAgICAgIC0+IDAKK2RxZHZpMjczIGRpdmlkZWludCAxIDAuOTk5OTk5OTk5OTk5OTk5OWUzODQgICAgICAgLT4gMAorZHFkdmkyNzQgZGl2aWRlaW50IDllMzg0ICAgIDEgICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RxZHZpMjc1IGRpdmlkZWludCA5LjllMzg0ICAxICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcWR2aTI3NiBkaXZpZGVpbnQgOS45OWUzODQgMSAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFkdmkyNzcgZGl2aWRlaW50IDkuOTk5OTk5OTk5OTk5OTk5ZTM4NCAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKK2RxZHZpMjgwIGRpdmlkZWludCAwLjEgOWUtMzgzICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcWR2aTI4MSBkaXZpZGVpbnQgMC4xIDk5ZS0zODMgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFkdmkyODIgZGl2aWRlaW50IDAuMSA5OTllLTM4MyAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RxZHZpMjgzIGRpdmlkZWludCAwLjEgOWUtMzgyICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcWR2aTI4NCBkaXZpZGVpbnQgMC4xIDk5ZS0zODIgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCistLSBHRCBlZGdlIGNhc2VzOiBsaHMgc21hbGxlciB0aGFuIHJocyBidXQgbW9yZSBkaWdpdHMKK2RxZHZpMzAxICBkaXZpZGVpbnQgIDAuOSAgICAgIDIgICAgICAtPiAgMAorZHFkdmkzMDIgIGRpdmlkZWludCAgMC45ICAgICAgMi4wICAgIC0+ICAwCitkcWR2aTMwMyAgZGl2aWRlaW50ICAwLjkgICAgICAyLjEgICAgLT4gIDAKK2RxZHZpMzA0ICBkaXZpZGVpbnQgIDAuOSAgICAgIDIuMDAgICAtPiAgMAorZHFkdmkzMDUgIGRpdmlkZWludCAgMC45ICAgICAgMi4wMSAgIC0+ICAwCitkcWR2aTMwNiAgZGl2aWRlaW50ICAwLjEyICAgICAxICAgICAgLT4gIDAKK2RxZHZpMzA3ICBkaXZpZGVpbnQgIDAuMTIgICAgIDEuMCAgICAtPiAgMAorZHFkdmkzMDggIGRpdmlkZWludCAgMC4xMiAgICAgMS4wMCAgIC0+ICAwCitkcWR2aTMwOSAgZGl2aWRlaW50ICAwLjEyICAgICAxLjAgICAgLT4gIDAKK2RxZHZpMzEwICBkaXZpZGVpbnQgIDAuMTIgICAgIDEuMDAgICAtPiAgMAorZHFkdmkzMTEgIGRpdmlkZWludCAgMC4xMiAgICAgMiAgICAgIC0+ICAwCitkcWR2aTMxMiAgZGl2aWRlaW50ICAwLjEyICAgICAyLjAgICAgLT4gIDAKK2RxZHZpMzEzICBkaXZpZGVpbnQgIDAuMTIgICAgIDIuMSAgICAtPiAgMAorZHFkdmkzMTQgIGRpdmlkZWludCAgMC4xMiAgICAgMi4wMCAgIC0+ICAwCitkcWR2aTMxNSAgZGl2aWRlaW50ICAwLjEyICAgICAyLjAxICAgLT4gIDAKKworLS0gZWRnZSBjYXNlcyBvZiBpbXBvc3NpYmxlCitkcWR2aTMzMCAgZGl2aWRlaW50ICAxMjM0NTY3OTg3NjU0MzIxOTg3NjU0MzIxODkwMTIzNDU2ICAxMCAgICAtPiAgMTIzNDU2Nzk4NzY1NDMyMTk4NzY1NDMyMTg5MDEyMzQ1CitkcWR2aTMzMSAgZGl2aWRlaW50ICAxMjM0NTY3OTg3NjU0MzIxOTg3NjU0MzIxODkwMTIzNDU2ICAgMSAgICAtPiAgMTIzNDU2Nzk4NzY1NDMyMTk4NzY1NDMyMTg5MDEyMzQ1NgorZHFkdmkzMzIgIGRpdmlkZWludCAgMTIzNDU2Nzk4NzY1NDMyMTk4NzY1NDMyMTg5MDEyMzQ1NiAgIDAuMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcWR2aTMzMyAgZGl2aWRlaW50ICAxMjM0NTY3OTg3NjU0MzIxOTg3NjU0MzIxODkwMTIzNDU2ICAgMC4wMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cyBbZnJvbSBkaXZpZGVdCitkcWR2aTEwNTEgZGl2aWRlaW50ICAxZSsyNzcgIDFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RxZHZpMTA1MiBkaXZpZGVpbnQgIDFlKzI3NyAtMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFkdmkxMDUzIGRpdmlkZWludCAtMWUrMjc3ICAxZS0zMTEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcWR2aTEwNTQgZGl2aWRlaW50IC0xZSsyNzcgLTFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RxZHZpMTA1NSBkaXZpZGVpbnQgIDFlLTI3NyAgMWUrMzExIC0+ICAwCitkcWR2aTEwNTYgZGl2aWRlaW50ICAxZS0yNzcgLTFlKzMxMSAtPiAtMAorZHFkdmkxMDU3IGRpdmlkZWludCAtMWUtMjc3ICAxZSszMTEgLT4gLTAKK2RxZHZpMTA1OCBkaXZpZGVpbnQgLTFlLTI3NyAtMWUrMzExIC0+ICAwCisKKy0tICdzdWJub3JtYWwnIGJvdW5kYXJ5IChhbGwgaGFyZCB1bmRlcmZsb3cgb3Igb3ZlcmZsb3cgaW4gYmFzZSBhcml0aGVtdGljKQorZHFkdmkxMDYwIGRpdmlkZWludCAxZS0yOTEgMWUrMTAxIC0+IDAKK2RxZHZpMTA2MSBkaXZpZGVpbnQgMWUtMjkxIDFlKzEwMiAtPiAwCitkcWR2aTEwNjIgZGl2aWRlaW50IDFlLTI5MSAxZSsxMDMgLT4gMAorZHFkdmkxMDYzIGRpdmlkZWludCAxZS0yOTEgMWUrMTA0IC0+IDAKK2RxZHZpMTA2NCBkaXZpZGVpbnQgMWUtMjkxIDFlKzEwNSAtPiAwCitkcWR2aTEwNjUgZGl2aWRlaW50IDFlLTI5MSAxZSsxMDYgLT4gMAorZHFkdmkxMDY2IGRpdmlkZWludCAxZS0yOTEgMWUrMTA3IC0+IDAKK2RxZHZpMTA2NyBkaXZpZGVpbnQgMWUtMjkxIDFlKzEwOCAtPiAwCitkcWR2aTEwNjggZGl2aWRlaW50IDFlLTI5MSAxZSsxMDkgLT4gMAorZHFkdmkxMDY5IGRpdmlkZWludCAxZS0yOTEgMWUrMTEwIC0+IDAKKworZHFkdmkxMTAxIGRpdmlkZWludCAgMS4wMDAwRS0zOTQgIDEgICAgIC0+IDAKK2RxZHZpMTEwMiBkaXZpZGVpbnQgIDEuMDAwRS0zOTQgICAxZSsxICAtPiAwCitkcWR2aTExMDMgZGl2aWRlaW50ICAxLjAwRS0zOTQgICAgMWUrMiAgLT4gMAorCitkcWR2aTExMTggZGl2aWRlaW50ICAxRS0zOTQgICAgICAgMWUrNCAgLT4gMAorZHFkdmkxMTE5IGRpdmlkZWludCAgM0UtMzk0ICAgICAgLTFlKzUgIC0+IC0wCitkcWR2aTExMjAgZGl2aWRlaW50ICA1RS0zOTQgICAgICAgMWUrNSAgLT4gMAorCitkcWR2aTExMjQgZGl2aWRlaW50ICAxRS0zOTQgICAgICAtMWUrNCAgLT4gLTAKK2RxZHZpMTEzMCBkaXZpZGVpbnQgIDMuMEUtMzk0ICAgIC0xZSs1ICAtPiAtMAorCitkcWR2aTExMzEgZGl2aWRlaW50ICAxLjBFLTE5OSAgICAgMWUrMjAwIC0+IDAKK2RxZHZpMTEzMiBkaXZpZGVpbnQgIDEuMEUtMTk5ICAgICAxZSsxOTkgLT4gMAorZHFkdmkxMTMzIGRpdmlkZWludCAgMS4wRS0xOTkgICAgIDFlKzE5OCAtPiAwCitkcWR2aTExMzQgZGl2aWRlaW50ICAyLjBFLTE5OSAgICAgMmUrMTk4IC0+IDAKK2RxZHZpMTEzNSBkaXZpZGVpbnQgIDQuMEUtMTk5ICAgICA0ZSsxOTggLT4gMAorCistLSBsb25nIG9wZXJhbmQgY2hlY2tzCitkcWR2aTQwMSBkaXZpZGVpbnQgMTIzNDU2NzgwMDAgMTAwIC0+IDEyMzQ1Njc4MAorZHFkdmk0MDIgZGl2aWRlaW50IDEgMTIzNDU2NzgwMDAgICAtPiAwCitkcWR2aTQwMyBkaXZpZGVpbnQgMTIzNDU2NzgwMCAgMTAgIC0+IDEyMzQ1Njc4MAorZHFkdmk0MDQgZGl2aWRlaW50IDEgMTIzNDU2NzgwMCAgICAtPiAwCitkcWR2aTQwNSBkaXZpZGVpbnQgMTIzNDU2Nzg5MCAgMTAgIC0+IDEyMzQ1Njc4OQorZHFkdmk0MDYgZGl2aWRlaW50IDEgMTIzNDU2Nzg5MCAgICAtPiAwCitkcWR2aTQwNyBkaXZpZGVpbnQgMTIzNDU2Nzg5MSAgMTAgIC0+IDEyMzQ1Njc4OQorZHFkdmk0MDggZGl2aWRlaW50IDEgMTIzNDU2Nzg5MSAgICAtPiAwCitkcWR2aTQwOSBkaXZpZGVpbnQgMTIzNDU2Nzg5MDEgMTAwIC0+IDEyMzQ1Njc4OQorZHFkdmk0MTAgZGl2aWRlaW50IDEgMTIzNDU2Nzg5MDEgICAtPiAwCitkcWR2aTQxMSBkaXZpZGVpbnQgMTIzNDU2Nzg5NiAgMTAgIC0+IDEyMzQ1Njc4OQorZHFkdmk0MTIgZGl2aWRlaW50IDEgMTIzNDU2Nzg5NiAgICAtPiAwCitkcWR2aTQxMyBkaXZpZGVpbnQgMTIzNDU2Nzg5NDggMTAwIC0+IDEyMzQ1Njc4OQorZHFkdmk0MTQgZGl2aWRlaW50IDEyMzQ1Njc4OTQ5IDEwMCAtPiAxMjM0NTY3ODkKK2RxZHZpNDE1IGRpdmlkZWludCAxMjM0NTY3ODk1MCAxMDAgLT4gMTIzNDU2Nzg5CitkcWR2aTQxNiBkaXZpZGVpbnQgMTIzNDU2Nzg5NTEgMTAwIC0+IDEyMzQ1Njc4OQorZHFkdmk0MTcgZGl2aWRlaW50IDEyMzQ1Njc4OTk5IDEwMCAtPiAxMjM0NTY3ODkKK2RxZHZpNDQxIGRpdmlkZWludCAxMjM0NTY3ODAwMCAxIC0+IDEyMzQ1Njc4MDAwCitkcWR2aTQ0MiBkaXZpZGVpbnQgMSAxMjM0NTY3ODAwMCAtPiAwCitkcWR2aTQ0MyBkaXZpZGVpbnQgMTIzNDU2NzgwMCAgMSAtPiAxMjM0NTY3ODAwCitkcWR2aTQ0NCBkaXZpZGVpbnQgMSAxMjM0NTY3ODAwICAtPiAwCitkcWR2aTQ0NSBkaXZpZGVpbnQgMTIzNDU2Nzg5MCAgMSAtPiAxMjM0NTY3ODkwCitkcWR2aTQ0NiBkaXZpZGVpbnQgMSAxMjM0NTY3ODkwICAtPiAwCitkcWR2aTQ0NyBkaXZpZGVpbnQgMTIzNDU2Nzg5MSAgMSAtPiAxMjM0NTY3ODkxCitkcWR2aTQ0OCBkaXZpZGVpbnQgMSAxMjM0NTY3ODkxICAtPiAwCitkcWR2aTQ0OSBkaXZpZGVpbnQgMTIzNDU2Nzg5MDEgMSAtPiAxMjM0NTY3ODkwMQorZHFkdmk0NTAgZGl2aWRlaW50IDEgMTIzNDU2Nzg5MDEgLT4gMAorZHFkdmk0NTEgZGl2aWRlaW50IDEyMzQ1Njc4OTYgIDEgLT4gMTIzNDU2Nzg5NgorZHFkdmk0NTIgZGl2aWRlaW50IDEgMTIzNDU2Nzg5NiAgLT4gMAorCistLSBtb3JlIHplcm9zLCBldGMuCitkcWR2aTUzMSBkaXZpZGVpbnQgNS4wMCAxRS0zICAgIC0+IDUwMDAKK2RxZHZpNTMyIGRpdmlkZWludCAwMC4wMCAwLjAwMCAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFkdmk1MzMgZGl2aWRlaW50IDAwLjAwIDBFLTMgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcWR2aTUzNCBkaXZpZGVpbnQgIDAgICAgLTAgICAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxZHZpNTM1IGRpdmlkZWludCAtMCAgICAgMCAgICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFkdmk1MzYgZGl2aWRlaW50IC0wICAgIC0wICAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCisKK2RxZHZpNTQxIGRpdmlkZWludCAgMCAgICAtMSAgICAgLT4gLTAKK2RxZHZpNTQyIGRpdmlkZWludCAtMCAgICAtMSAgICAgLT4gIDAKK2RxZHZpNTQzIGRpdmlkZWludCAgMCAgICAgMSAgICAgLT4gIDAKK2RxZHZpNTQ0IGRpdmlkZWludCAtMCAgICAgMSAgICAgLT4gLTAKK2RxZHZpNTQ1IGRpdmlkZWludCAtMSAgICAgMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpNTQ2IGRpdmlkZWludCAtMSAgICAtMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpNTQ3IGRpdmlkZWludCAgMSAgICAgMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpNTQ4IGRpdmlkZWludCAgMSAgICAtMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZHFkdmk1NTEgZGl2aWRlaW50ICAwLjAgIC0xICAgICAtPiAtMAorZHFkdmk1NTIgZGl2aWRlaW50IC0wLjAgIC0xICAgICAtPiAgMAorZHFkdmk1NTMgZGl2aWRlaW50ICAwLjAgICAxICAgICAtPiAgMAorZHFkdmk1NTQgZGl2aWRlaW50IC0wLjAgICAxICAgICAtPiAtMAorZHFkdmk1NTUgZGl2aWRlaW50IC0xLjAgICAwICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmk1NTYgZGl2aWRlaW50IC0xLjAgIC0wICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmk1NTcgZGl2aWRlaW50ICAxLjAgICAwICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmk1NTggZGl2aWRlaW50ICAxLjAgIC0wICAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkcWR2aTU2MSBkaXZpZGVpbnQgIDAgICAgLTEuMCAgIC0+IC0wCitkcWR2aTU2MiBkaXZpZGVpbnQgLTAgICAgLTEuMCAgIC0+ICAwCitkcWR2aTU2MyBkaXZpZGVpbnQgIDAgICAgIDEuMCAgIC0+ICAwCitkcWR2aTU2NCBkaXZpZGVpbnQgLTAgICAgIDEuMCAgIC0+IC0wCitkcWR2aTU2NSBkaXZpZGVpbnQgLTEgICAgIDAuMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTU2NiBkaXZpZGVpbnQgLTEgICAgLTAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTU2NyBkaXZpZGVpbnQgIDEgICAgIDAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTU2OCBkaXZpZGVpbnQgIDEgICAgLTAuMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKK2RxZHZpNTcxIGRpdmlkZWludCAgMC4wICAtMS4wICAgLT4gLTAKK2RxZHZpNTcyIGRpdmlkZWludCAtMC4wICAtMS4wICAgLT4gIDAKK2RxZHZpNTczIGRpdmlkZWludCAgMC4wICAgMS4wICAgLT4gIDAKK2RxZHZpNTc0IGRpdmlkZWludCAtMC4wICAgMS4wICAgLT4gLTAKK2RxZHZpNTc1IGRpdmlkZWludCAtMS4wICAgMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpNTc2IGRpdmlkZWludCAtMS4wICAtMC4wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpNTc3IGRpdmlkZWludCAgMS4wICAgMC4wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpNTc4IGRpdmlkZWludCAgMS4wICAtMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworLS0gU3BlY2lhbHMKK2RxZHZpNTgwIGRpdmlkZWludCAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk1ODEgZGl2aWRlaW50ICBJbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK2RxZHZpNTgyIGRpdmlkZWludCAgSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitkcWR2aTU4MyBkaXZpZGVpbnQgIEluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorZHFkdmk1ODQgZGl2aWRlaW50ICBJbmYgICAwICAgICAtPiAgSW5maW5pdHkKK2RxZHZpNTg1IGRpdmlkZWludCAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitkcWR2aTU4NiBkaXZpZGVpbnQgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorZHFkdmk1ODcgZGl2aWRlaW50ICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWR2aTU4OCBkaXZpZGVpbnQgLTEwMDAgIEluZiAgIC0+IC0wCitkcWR2aTU4OSBkaXZpZGVpbnQgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNTkwIGRpdmlkZWludCAtMSAgICAgSW5mICAgLT4gLTAKK2RxZHZpNTkxIGRpdmlkZWludCAtMCAgICAgSW5mICAgLT4gLTAKK2RxZHZpNTkyIGRpdmlkZWludCAgMCAgICAgSW5mICAgLT4gIDAKK2RxZHZpNTkzIGRpdmlkZWludCAgMSAgICAgSW5mICAgLT4gIDAKK2RxZHZpNTk0IGRpdmlkZWludCAgMTAwMCAgSW5mICAgLT4gIDAKK2RxZHZpNTk1IGRpdmlkZWludCAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcWR2aTYwMCBkaXZpZGVpbnQgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjAxIGRpdmlkZWludCAtSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitkcWR2aTYwMiBkaXZpZGVpbnQgLUluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorZHFkdmk2MDMgZGl2aWRlaW50IC1JbmYgIC0wICAgICAtPiAgSW5maW5pdHkKK2RxZHZpNjA0IGRpdmlkZWludCAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitkcWR2aTYwNSBkaXZpZGVpbnQgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZHFkdmk2MDYgZGl2aWRlaW50IC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2RxZHZpNjA3IGRpdmlkZWludCAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2MDggZGl2aWRlaW50IC0xMDAwICBJbmYgICAtPiAtMAorZHFkdmk2MDkgZGl2aWRlaW50IC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWR2aTYxMCBkaXZpZGVpbnQgLTEgICAgLUluZiAgIC0+ICAwCitkcWR2aTYxMSBkaXZpZGVpbnQgLTAgICAgLUluZiAgIC0+ICAwCitkcWR2aTYxMiBkaXZpZGVpbnQgIDAgICAgLUluZiAgIC0+IC0wCitkcWR2aTYxMyBkaXZpZGVpbnQgIDEgICAgLUluZiAgIC0+IC0wCitkcWR2aTYxNCBkaXZpZGVpbnQgIDEwMDAgLUluZiAgIC0+IC0wCitkcWR2aTYxNSBkaXZpZGVpbnQgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFkdmk2MjEgZGl2aWRlaW50ICBOYU4gLUluZiAgICAtPiAgTmFOCitkcWR2aTYyMiBkaXZpZGVpbnQgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RxZHZpNjIzIGRpdmlkZWludCAgTmFOIC0xICAgICAgLT4gIE5hTgorZHFkdmk2MjQgZGl2aWRlaW50ICBOYU4gLTAgICAgICAtPiAgTmFOCitkcWR2aTYyNSBkaXZpZGVpbnQgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2RxZHZpNjI2IGRpdmlkZWludCAgTmFOICAxICAgICAgLT4gIE5hTgorZHFkdmk2MjcgZGl2aWRlaW50ICBOYU4gIDEwMDAgICAtPiAgTmFOCitkcWR2aTYyOCBkaXZpZGVpbnQgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RxZHZpNjI5IGRpdmlkZWludCAgTmFOICBOYU4gICAgLT4gIE5hTgorZHFkdmk2MzAgZGl2aWRlaW50IC1JbmYgIE5hTiAgICAtPiAgTmFOCitkcWR2aTYzMSBkaXZpZGVpbnQgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RxZHZpNjMyIGRpdmlkZWludCAtMSAgICBOYU4gICAgLT4gIE5hTgorZHFkdmk2MzMgZGl2aWRlaW50IC0wICAgIE5hTiAgICAtPiAgTmFOCitkcWR2aTYzNCBkaXZpZGVpbnQgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RxZHZpNjM1IGRpdmlkZWludCAgMSAgICBOYU4gICAgLT4gIE5hTgorZHFkdmk2MzYgZGl2aWRlaW50ICAxMDAwIE5hTiAgICAtPiAgTmFOCitkcWR2aTYzNyBkaXZpZGVpbnQgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZHFkdmk2NDEgZGl2aWRlaW50ICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NDIgZGl2aWRlaW50ICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NDMgZGl2aWRlaW50ICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NDQgZGl2aWRlaW50ICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NDUgZGl2aWRlaW50ICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NDYgZGl2aWRlaW50ICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NDcgZGl2aWRlaW50ICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NDggZGl2aWRlaW50ICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NDkgZGl2aWRlaW50ICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NTAgZGl2aWRlaW50ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NTEgZGl2aWRlaW50IC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NTIgZGl2aWRlaW50IC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NTMgZGl2aWRlaW50IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NTQgZGl2aWRlaW50IC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NTUgZGl2aWRlaW50ICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NTYgZGl2aWRlaW50ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NTcgZGl2aWRlaW50ICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NTggZGl2aWRlaW50ICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NTkgZGl2aWRlaW50ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcWR2aTY2MSBkaXZpZGVpbnQgIE5hTjkgLUluZiAgIC0+ICBOYU45CitkcWR2aTY2MiBkaXZpZGVpbnQgIE5hTjggIDEwMDAgIC0+ICBOYU44CitkcWR2aTY2MyBkaXZpZGVpbnQgIE5hTjcgIEluZiAgIC0+ICBOYU43CitkcWR2aTY2NCBkaXZpZGVpbnQgLU5hTjYgIE5hTjUgIC0+IC1OYU42CitkcWR2aTY2NSBkaXZpZGVpbnQgLUluZiAgIE5hTjQgIC0+ICBOYU40CitkcWR2aTY2NiBkaXZpZGVpbnQgLTEwMDAgIE5hTjMgIC0+ICBOYU4zCitkcWR2aTY2NyBkaXZpZGVpbnQgIEluZiAgLU5hTjIgIC0+IC1OYU4yCisKK2RxZHZpNjcxIGRpdmlkZWludCAtc05hTjk5IC1JbmYgICAgLT4gLU5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkcWR2aTY3MiBkaXZpZGVpbnQgIHNOYU45OCAtMSAgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NzMgZGl2aWRlaW50ICBzTmFOOTcgIE5hTiAgICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjc0IGRpdmlkZWludCAgc05hTjk2IHNOYU45NCAgLT4gIE5hTjk2IEludmFsaWRfb3BlcmF0aW9uCitkcWR2aTY3NSBkaXZpZGVpbnQgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NzYgZGl2aWRlaW50IC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjc3IGRpdmlkZWludCAgMCAgICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkcWR2aTY3OCBkaXZpZGVpbnQgIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NzkgZGl2aWRlaW50ICBOYU4gICAgc05hTjg5ICAtPiAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworLS0gR3l1cmlzIGV4YW1wbGUKK2RxZHZpNzAwIGRpdmlkZWludCA4LjMzNjgwNDQxODA5NDA0MDk4OTYzMDAwNjgxOTg4MTcwOUUtNjE0MyA4LjMzNjgwNDQxODA5NDA0MDk4OTYzMDAwNjgxOTg4OTAwMEUtNjE0MyAtPiAwCisKKy0tIE51bGwgdGVzdHMKK2RxZHZpOTAwIGRpdmlkZWludCAgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWR2aTkwMSBkaXZpZGVpbnQgICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUVuY29kZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUVuY29kZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZWRmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxRW5jb2RlLmRlY1Rlc3QKQEAgLTAsMCArMSw0NzcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFFbmNvZGUuZGVjVGVzdCAtLSBkZWNpbWFsIHNpeHRlZW4tYnl0ZSBmb3JtYXQgdGVzdGNhc2VzICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMCwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gW1ByZXZpb3VzbHkgY2FsbGVkIGRlY2ltYWwxMjguZGVjVGVzdF0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBzZXQgb2YgdGVzdHMgaXMgZm9yIHRoZSBzaXh0ZWVuLWJ5dGUgY29uY3JldGUgcmVwcmVzZW50YXRpb24uCistLSBJdHMgY2hhcmFjdGVyaXN0aWNzIGFyZToKKy0tCistLSAgIDEgYml0ICBzaWduCistLSAgIDUgYml0cyBjb21iaW5hdGlvbiBmaWVsZAorLS0gIDEyIGJpdHMgZXhwb25lbnQgY29udGludWF0aW9uCistLSAxMTAgYml0cyBjb2VmZmljaWVudCBjb250aW51YXRpb24KKy0tCistLSBUb3RhbCBleHBvbmVudCBsZW5ndGggMTQgYml0cworLS0gVG90YWwgY29lZmZpY2llbnQgbGVuZ3RoIDExNCBiaXRzICgzNCBkaWdpdHMpCistLQorLS0gRWxpbWl0ID0gMTIyODcgKG1heGltdW0gZW5jb2RlZCBleHBvbmVudCkKKy0tIEVtYXggICA9ICA2MTQ0IChsYXJnZXN0IGV4cG9uZW50IHZhbHVlKQorLS0gRW1pbiAgID0gLTYxNDMgKHNtYWxsZXN0IGV4cG9uZW50IHZhbHVlKQorLS0gYmlhcyAgID0gIDYxNzYgKHN1YnRyYWN0ZWQgZnJvbSBlbmNvZGVkIGV4cG9uZW50KSA9IC1FdGlueQorCistLSBUaGUgdGVzdGNhc2VzIGhlcmUgaGF2ZSBvbmx5IGV4YWN0bHkgcmVwcmVzZW50YWJsZSBkYXRhIG9uIHRoZQorLS0gJ2xlZnQtaGFuZC1zaWRlJzsgcm91bmRpbmcgZnJvbSBzdHJpbmdzIGlzIHRlc3RlZCBpbiAnYmFzZScKKy0tIHRlc3RjYXNlIGdyb3Vwcy4KKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCisKKy0tIEdlbmVyYWwgdGVzdGNhc2VzCistLSAobW9zdGx5IGRlcml2ZWQgZnJvbSB0aGUgU3RyYXdtYW4gNCBkb2N1bWVudCBhbmQgZXhhbXBsZXMpCitkZWNxMDAxIGFwcGx5ICAgI0EyMDc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwIC0+IC03LjUwCitkZWNxMDAyIGFwcGx5ICAgLTcuNTAgICAgICAgICAgICAgLT4gI0EyMDc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwCistLSBkZXJpdmF0aXZlIGNhbm9uaWNhbCBwbGFpbiBzdHJpbmdzCitkZWNxMDAzIGFwcGx5ICAgI0EyMDg0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwIC0+IC03LjUwRSszCitkZWNxMDA0IGFwcGx5ICAgLTcuNTBFKzMgICAgICAgICAgLT4gI0EyMDg0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwCitkZWNxMDA1IGFwcGx5ICAgI0EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwIC0+IC03NTAKK2RlY3EwMDYgYXBwbHkgICAtNzUwICAgICAgICAgICAgICAtPiAjQTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzRDAKK2RlY3EwMDcgYXBwbHkgICAjQTIwN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzRDAgLT4gLTc1LjAKK2RlY3EwMDggYXBwbHkgICAtNzUuMCAgICAgICAgICAgICAtPiAjQTIwN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzRDAKK2RlY3EwMDkgYXBwbHkgICAjQTIwNzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzRDAgLT4gLTAuNzUwCitkZWNxMDEwIGFwcGx5ICAgLTAuNzUwICAgICAgICAgICAgLT4gI0EyMDc0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwCitkZWNxMDExIGFwcGx5ICAgI0EyMDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwIC0+IC0wLjA3NTAKK2RlY3EwMTIgYXBwbHkgICAtMC4wNzUwICAgICAgICAgICAtPiAjQTIwNzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzRDAKK2RlY3EwMTMgYXBwbHkgICAjQTIwNjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzRDAgLT4gLTAuMDAwNzUwCitkZWNxMDE0IGFwcGx5ICAgLTAuMDAwNzUwICAgICAgICAgLT4gI0EyMDY4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwCitkZWNxMDE1IGFwcGx5ICAgI0EyMDYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwIC0+IC0wLjAwMDAwNzUwCitkZWNxMDE2IGFwcGx5ICAgLTAuMDAwMDA3NTAgICAgICAgLT4gI0EyMDYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwCitkZWNxMDE3IGFwcGx5ICAgI0EyMDVjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwIC0+IC03LjUwRS03CitkZWNxMDE4IGFwcGx5ICAgLTcuNTBFLTcgICAgICAgICAgLT4gI0EyMDVjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwCisKKy0tIE5vcm1hbGl0eQorZGVjcTAyMCBhcHBseSAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtPiAjMjYwODEzNGI5YzFlMjhlNTZmM2MxMjcxNzc4MjM1MzQKK2RlY3EwMjEgYXBwbHkgIC0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLT4gI2E2MDgxMzRiOWMxZTI4ZTU2ZjNjMTI3MTc3ODIzNTM0CitkZWNxMDIyIGFwcGx5ICAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgIC0+ICMyNjA4MDkxMjQ0OTEyNDQ5MTI0NDkxMjQ0OTEyNDQ5MQorCistLSBObWF4IGFuZCBzaW1pbGFyCitkZWNxMDMxIGFwcGx5ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZGVjcTAzMiBhcHBseSAgICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZGVjcTAzMyBhcHBseSAgIDEuMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0RSs2MTQ0IC0+ICM0N2ZmZDM0YjljMWUyOGU1NmYzYzEyNzE3NzgyMzUzNAorZGVjcTAzNCBhcHBseSAgICM0N2ZmZDM0YjljMWUyOGU1NmYzYzEyNzE3NzgyMzUzNCAtPiAxLjIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNEUrNjE0NAorLS0gZm9sZC1kb3ducyAobW9yZSBiZWxvdykKK2RlY3EwMzUgYXBwbHkgICAxLjIzRSs2MTQ0ICAgIC0+ICM0N2ZmZDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNxMDM2IGFwcGx5ICAgIzQ3ZmZkMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDEuMjMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0CitkZWNxMDM3IGFwcGx5ICAgMUUrNjE0NCAgICAgICAtPiAjNDdmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTAzOCBhcHBseSAgICM0N2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NAorCitkZWNxMDUxIGFwcGx5ICAgMTIzNDUgICAgICAgICAgICAgICAgICAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0OWM1CitkZWNxMDUyIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0OWM1ICAgICAgIC0+IDEyMzQ1CitkZWNxMDUzIGFwcGx5ICAgMTIzNCAgICAgICAgICAgICAgICAgICAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNTM0CitkZWNxMDU0IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNTM0ICAgICAgIC0+IDEyMzQKK2RlY3EwNTUgYXBwbHkgICAxMjMgICAgICAgICAgICAgICAgICAgICAtPiAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYTMKK2RlY3EwNTYgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYTMgICAgICAgLT4gMTIzCitkZWNxMDU3IGFwcGx5ICAgMTIgICAgICAgICAgICAgICAgICAgICAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyCitkZWNxMDU4IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyICAgICAgIC0+IDEyCitkZWNxMDU5IGFwcGx5ICAgMSAgICAgICAgICAgICAgICAgICAgICAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkZWNxMDYwIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgIC0+IDEKK2RlY3EwNjEgYXBwbHkgICAxLjIzICAgICAgICAgICAgICAgICAgICAtPiAjMjIwNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYTMKK2RlY3EwNjIgYXBwbHkgICAjMjIwNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYTMgICAgICAgLT4gMS4yMworZGVjcTA2MyBhcHBseSAgIDEyMy40NSAgICAgICAgICAgICAgICAgIC0+ICMyMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDljNQorZGVjcTA2NCBhcHBseSAgICMyMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDljNSAgICAgICAtPiAxMjMuNDUKKworLS0gTm1pbiBhbmQgYmVsb3cKK2RlY3EwNzEgYXBwbHkgICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIzAwMDg0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkZWNxMDcyIGFwcGx5ICAgIzAwMDg0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgICAgIC0+IDFFLTYxNDMKK2RlY3EwNzMgYXBwbHkgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLT4gIzA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxMDc0IGFwcGx5ICAgIzA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkZWNxMDc1IGFwcGx5ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMgIC0+ICMwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZGVjcTA3NiBhcHBseSAgICMwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MworCitkZWNxMDc3IGFwcGx5ICAgMC4xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0+ICMwMDAwMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgIFN1Ym5vcm1hbAorZGVjcTA3OCBhcHBseSAgICMwMDAwMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ0ICBTdWJub3JtYWwKK2RlY3EwNzkgYXBwbHkgICAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMEUtNjE0MyAgLT4gIzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwICAgICAgU3Vibm9ybWFsCitkZWNxMDgwIGFwcGx5ICAgIzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwICAgICAgICAgIC0+IDEuMEUtNjE3NSAgICAgICAgICAgICAgU3Vibm9ybWFsCitkZWNxMDgxIGFwcGx5ICAgMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MyAgIC0+ICMwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgIFN1Ym5vcm1hbAorZGVjcTA4MiBhcHBseSAgICMwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgICAtPiAxRS02MTc1ICAgICAgICAgICAgICAgIFN1Ym5vcm1hbAorZGVjcTA4MyBhcHBseSAgIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRS02MTQzICAtPiAjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICBTdWJub3JtYWwKK2RlY3EwODQgYXBwbHkgICAjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICAgICAgLT4gMUUtNjE3NiAgICAgICAgICAgICAgICAgU3Vibm9ybWFsCisKKy0tIHVuZGVyZmxvd3MgY2Fubm90IGJlIHRlc3RlZCBmb3Igc2ltcGxlIGNvcGllcywgY2hlY2sgZWRnZSBjYXNlcworZGVjcTA5MCBhcHBseSAgIDFlLTYxNzYgICAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIFN1Ym5vcm1hbAorZGVjcTEwMCBhcHBseSAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OWUtNjE3NiAtPiAjMDAwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgIFN1Ym5vcm1hbAorCistLSBzYW1lIGFnYWluLCBuZWdhdGl2ZXMKKy0tIE5tYXggYW5kIHNpbWlsYXIKK2RlY3ExMjIgYXBwbHkgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gI2Y3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkZWNxMTIzIGFwcGx5ICAgI2Y3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZGVjcTEyNCBhcHBseSAgLTEuMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0RSs2MTQ0IC0+ICNjN2ZmZDM0YjljMWUyOGU1NmYzYzEyNzE3NzgyMzUzNAorZGVjcTEyNSBhcHBseSAgICNjN2ZmZDM0YjljMWUyOGU1NmYzYzEyNzE3NzgyMzUzNCAtPiAtMS4yMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzRFKzYxNDQKKy0tIGZvbGQtZG93bnMgKG1vcmUgYmVsb3cpCitkZWNxMTMwIGFwcGx5ICAtMS4yM0UrNjE0NCAgICAtPiAjYzdmZmQzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTEzMSBhcHBseSAgICNjN2ZmZDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMS4yMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDQKK2RlY3ExMzIgYXBwbHkgIC0xRSs2MTQ0ICAgICAgIC0+ICNjN2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNxMTMzIGFwcGx5ICAgI2M3ZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NAorCitkZWNxMTUxIGFwcGx5ICAtMTIzNDUgICAgICAgICAgICAgICAgICAgLT4gI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0OWM1CitkZWNxMTUyIGFwcGx5ICAgI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0OWM1ICAgICAgIC0+IC0xMjM0NQorZGVjcTE1MyBhcHBseSAgLTEyMzQgICAgICAgICAgICAgICAgICAgIC0+ICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUzNAorZGVjcTE1NCBhcHBseSAgICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUzNCAgICAgICAtPiAtMTIzNAorZGVjcTE1NSBhcHBseSAgLTEyMyAgICAgICAgICAgICAgICAgICAgIC0+ICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBhMworZGVjcTE1NiBhcHBseSAgICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBhMyAgICAgICAtPiAtMTIzCitkZWNxMTU3IGFwcGx5ICAtMTIgICAgICAgICAgICAgICAgICAgICAgLT4gI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyCitkZWNxMTU4IGFwcGx5ICAgI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyICAgICAgIC0+IC0xMgorZGVjcTE1OSBhcHBseSAgLTEgICAgICAgICAgICAgICAgICAgICAgIC0+ICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZGVjcTE2MCBhcHBseSAgICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAtPiAtMQorZGVjcTE2MSBhcHBseSAgLTEuMjMgICAgICAgICAgICAgICAgICAgIC0+ICNhMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBhMworZGVjcTE2MiBhcHBseSAgICNhMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBhMyAgICAgICAtPiAtMS4yMworZGVjcTE2MyBhcHBseSAgLTEyMy40NSAgICAgICAgICAgICAgICAgIC0+ICNhMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDljNQorZGVjcTE2NCBhcHBseSAgICNhMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDljNSAgICAgICAtPiAtMTIzLjQ1CisKKy0tIE5taW4gYW5kIGJlbG93CitkZWNxMTcxIGFwcGx5ICAtMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICM4MDA4NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZGVjcTE3MiBhcHBseSAgICM4MDA4NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgICAtPiAtMUUtNjE0MworZGVjcTE3MyBhcHBseSAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAjODQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3ExNzQgYXBwbHkgICAjODQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkZWNxMTc1IGFwcGx5ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMgIC0+ICM4NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZGVjcTE3NiBhcHBseSAgICM4NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMKKworZGVjcTE3NyBhcHBseSAgLTAuMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAjODAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICBTdWJub3JtYWwKK2RlY3ExNzggYXBwbHkgICAjODAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDQgIFN1Ym5vcm1hbAorZGVjcTE3OSBhcHBseSAgLTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwRS02MTQzICAtPiAjODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAgICAgICBTdWJub3JtYWwKK2RlY3ExODAgYXBwbHkgICAjODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAgICAgICAgICAgLT4gLTEuMEUtNjE3NSAgICAgICAgICAgICAgU3Vibm9ybWFsCitkZWNxMTgxIGFwcGx5ICAtMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MyAgIC0+ICM4MDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgIFN1Ym5vcm1hbAorZGVjcTE4MiBhcHBseSAgICM4MDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgICAtPiAtMUUtNjE3NSAgICAgICAgICAgICAgICBTdWJub3JtYWwKK2RlY3ExODMgYXBwbHkgIC0wLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MyAgLT4gIzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgU3Vibm9ybWFsCitkZWNxMTg0IGFwcGx5ICAgIzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgICAgIC0+IC0xRS02MTc2ICAgICAgICAgICAgICAgICBTdWJub3JtYWwKKworLS0gdW5kZXJmbG93IGVkZ2UgY2FzZXMKK2RlY3ExOTAgYXBwbHkgICAtMWUtNjE3NiAgICAgICAgICAgICAgICAgIC0+ICM4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgU3Vibm9ybWFsCitkZWNxMjAwIGFwcGx5ICAgLTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OWUtNjE3NiAtPiAjODAwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgIFN1Ym5vcm1hbAorCistLSB6ZXJvcworZGVjcTQwMCBhcHBseSAgIDBFLTgwMDAgICAgICAgICAgICAgICAgIC0+ICMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjcTQwMSBhcHBseSAgIDBFLTYxNzcgICAgICAgICAgICAgICAgIC0+ICMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjcTQwMiBhcHBseSAgIDBFLTYxNzYgICAgICAgICAgICAgICAgIC0+ICMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTQwMyBhcHBseSAgICMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAwRS02MTc2CitkZWNxNDA0IGFwcGx5ICAgMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0+ICMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTQwNSBhcHBseSAgICMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAwRS02MTc2CitkZWNxNDA2IGFwcGx5ICAgMEUtMiAgICAgICAgICAgICAgICAgICAgLT4gIzIyMDc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNDA3IGFwcGx5ICAgIzIyMDc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDAuMDAKK2RlY3E0MDggYXBwbHkgICAwICAgICAgICAgICAgICAgICAgICAgICAtPiAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E0MDkgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMAorZGVjcTQxMCBhcHBseSAgIDBFKzMgICAgICAgICAgICAgICAgICAgIC0+ICMyMjA4YzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTQxMSBhcHBseSAgICMyMjA4YzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAwRSszCitkZWNxNDEyIGFwcGx5ICAgMEUrNjExMSAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNDEzIGFwcGx5ICAgIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDBFKzYxMTEKKy0tIGNsYW1wZWQgemVyb3MuLi4KK2RlY3E0MTQgYXBwbHkgICAwRSs2MTEyICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY3E0MTUgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMEUrNjExMQorZGVjcTQxNiBhcHBseSAgIDBFKzYxNDQgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjcTQxNyBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAwRSs2MTExCitkZWNxNDE4IGFwcGx5ICAgMEUrODAwMCAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNxNDE5IGFwcGx5ICAgIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDBFKzYxMTEKKworLS0gbmVnYXRpdmUgemVyb3MKK2RlY3E0MjAgYXBwbHkgIC0wRS04MDAwICAgICAgICAgICAgICAgICAtPiAjODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY3E0MjEgYXBwbHkgIC0wRS02MTc3ICAgICAgICAgICAgICAgICAtPiAjODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY3E0MjIgYXBwbHkgIC0wRS02MTc2ICAgICAgICAgICAgICAgICAtPiAjODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E0MjMgYXBwbHkgICAjODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gLTBFLTYxNzYKK2RlY3E0MjQgYXBwbHkgIC0wLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLT4gIzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNDI1IGFwcGx5ICAgIzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRS02MTc2CitkZWNxNDI2IGFwcGx5ICAtMEUtMiAgICAgICAgICAgICAgICAgICAgLT4gI2EyMDc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNDI3IGFwcGx5ICAgI2EyMDc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wLjAwCitkZWNxNDI4IGFwcGx5ICAtMCAgICAgICAgICAgICAgICAgICAgICAgLT4gI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNDI5IGFwcGx5ICAgI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wCitkZWNxNDMwIGFwcGx5ICAtMEUrMyAgICAgICAgICAgICAgICAgICAgLT4gI2EyMDhjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNDMxIGFwcGx5ICAgI2EyMDhjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRSszCitkZWNxNDMyIGFwcGx5ICAtMEUrNjExMSAgICAgICAgICAgICAgICAgLT4gI2MzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNDMzIGFwcGx5ICAgI2MzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRSs2MTExCistLSBjbGFtcGVkIHplcm9zLi4uCitkZWNxNDM0IGFwcGx5ICAtMEUrNjExMiAgICAgICAgICAgICAgICAgLT4gI2MzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNxNDM1IGFwcGx5ICAgI2MzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRSs2MTExCitkZWNxNDM2IGFwcGx5ICAtMEUrNjE0NCAgICAgICAgICAgICAgICAgLT4gI2MzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNxNDM3IGFwcGx5ICAgI2MzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRSs2MTExCitkZWNxNDM4IGFwcGx5ICAtMEUrODAwMCAgICAgICAgICAgICAgICAgLT4gI2MzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNxNDM5IGFwcGx5ICAgI2MzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRSs2MTExCisKKy0tIGV4cG9uZW50IGxlbmd0aHMKK2RlY3E0NDAgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcgICAgICAgLT4gNworZGVjcTQ0MSBhcHBseSAgIDcgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3CitkZWNxNDQyIGFwcGx5ICAgIzIyMGE0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3ICAgICAgIC0+IDdFKzkKK2RlY3E0NDMgYXBwbHkgICA3RSs5IC0+ICMyMjBhNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNworZGVjcTQ0NCBhcHBseSAgICMyMjIwYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNyAgICAgICAtPiA3RSs5OQorZGVjcTQ0NSBhcHBseSAgIDdFKzk5IC0+ICMyMjIwYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNworZGVjcTQ0NiBhcHBseSAgICMyMzAxYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNyAgICAgICAtPiA3RSs5OTkKK2RlY3E0NDcgYXBwbHkgICA3RSs5OTkgLT4gIzIzMDFjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3CitkZWNxNDQ4IGFwcGx5ICAgIzQzZTNjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3ICAgICAgIC0+IDdFKzU5OTkKK2RlY3E0NDkgYXBwbHkgICA3RSs1OTk5IC0+ICM0M2UzYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNworCistLSBTcGVjaWFscworZGVjcTUwMCBhcHBseSAgIEluZmluaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E1MDEgYXBwbHkgICAjNzg3ODc4Nzg3ODc4Nzg3ODc4Nzg3ODc4Nzg3ODc4NzggLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNTAyIGFwcGx5ICAgIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IEluZmluaXR5CitkZWNxNTAzIGFwcGx5ICAgIzc5Nzk3OTc5Nzk3OTc5Nzk3OTc5Nzk3OTc5Nzk3OTc5IC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTUwNCBhcHBseSAgICM3OTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiBJbmZpbml0eQorZGVjcTUwNSBhcHBseSAgICM3YTdhN2E3YTdhN2E3YTdhN2E3YTdhN2E3YTdhN2E3YSAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E1MDYgYXBwbHkgICAjN2EwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gSW5maW5pdHkKK2RlY3E1MDcgYXBwbHkgICAjN2I3YjdiN2I3YjdiN2I3YjdiN2I3YjdiN2I3YjdiN2IgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNTA4IGFwcGx5ICAgIzdiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IEluZmluaXR5CisKK2RlY3E1MDkgYXBwbHkgICBOYU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNTEwIGFwcGx5ICAgIzdjN2M3YzdjN2M3YzdjN2M3YzdjN2M3YzdjN2M3YzdjIC0+ICM3YzAwM2M3YzdjN2M3YzdjN2M3YzdjN2M3YzdjN2M3YworZGVjcTUxMSBhcHBseSAgICM3YzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiBOYU4KK2RlY3E1MTIgYXBwbHkgICAjN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2QgLT4gIzdjMDAzZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkCitkZWNxNTEzIGFwcGx5ICAgIzdkMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IE5hTgorZGVjcTUxNCBhcHBseSAgICM3ZTdlN2U3ZTdlN2U3ZTdlN2U3ZTdlN2U3ZTdlN2U3ZSAtPiAjN2UwMDNlN2U3YzdlN2U3ZTdlN2M3ZTdlN2U3ZTdjN2UKK2RlY3E1MTUgYXBwbHkgICAjN2UwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gc05hTgorZGVjcTUxNiBhcHBseSAgICM3ZjdmN2Y3ZjdmN2Y3ZjdmN2Y3ZjdmN2Y3ZjdmN2Y3ZiAtPiAjN2UwMDNmN2Y3YzdmN2Y3ZjdmN2M3ZjdmN2Y3ZjdjN2YKK2RlY3E1MTcgYXBwbHkgICAjN2YwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gc05hTgorZGVjcTUxOCBhcHBseSAgICM3ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZiAtPiBzTmFOOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkZWNxNTE5IGFwcGx5ICAgIzdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorCitkZWNxNTIwIGFwcGx5ICAgLUluZmluaXR5ICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICNmODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTUyMSBhcHBseSAgICNmODc4Nzg3ODc4Nzg3ODc4Nzg3ODc4Nzg3ODc4Nzg3OCAtPiAjZjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E1MjIgYXBwbHkgICAjZjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gLUluZmluaXR5CitkZWNxNTIzIGFwcGx5ICAgI2Y5Nzk3OTc5Nzk3OTc5Nzk3OTc5Nzk3OTc5Nzk3OTc5IC0+ICNmODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTUyNCBhcHBseSAgICNmOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAtSW5maW5pdHkKK2RlY3E1MjUgYXBwbHkgICAjZmE3YTdhN2E3YTdhN2E3YTdhN2E3YTdhN2E3YTdhN2EgLT4gI2Y4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNTI2IGFwcGx5ICAgI2ZhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IC1JbmZpbml0eQorZGVjcTUyNyBhcHBseSAgICNmYjdiN2I3YjdiN2I3YjdiN2I3YjdiN2I3YjdiN2I3YiAtPiAjZjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E1MjggYXBwbHkgICAjZmIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gLUluZmluaXR5CisKK2RlY3E1MjkgYXBwbHkgICAtTmFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gI2ZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNTMwIGFwcGx5ICAgI2ZjN2M3YzdjN2M3YzdjN2M3YzdjN2M3YzdjN2M3YzdjIC0+ICNmYzAwM2M3YzdjN2M3YzdjN2M3YzdjN2M3YzdjN2M3YworZGVjcTUzMSBhcHBseSAgICNmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAtTmFOCitkZWNxNTMyIGFwcGx5ICAgI2ZkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkIC0+ICNmYzAwM2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZAorZGVjcTUzMyBhcHBseSAgICNmZDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAtTmFOCitkZWNxNTM0IGFwcGx5ICAgI2ZlN2U3ZTdlN2U3ZTdlN2U3ZTdlN2U3ZTdlN2U3ZTdlIC0+ICNmZTAwM2U3ZTdjN2U3ZTdlN2U3YzdlN2U3ZTdlN2M3ZQorZGVjcTUzNSBhcHBseSAgICNmZTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAtc05hTgorZGVjcTUzNiBhcHBseSAgICNmZjdmN2Y3ZjdmN2Y3ZjdmN2Y3ZjdmN2Y3ZjdmN2Y3ZiAtPiAjZmUwMDNmN2Y3YzdmN2Y3ZjdmN2M3ZjdmN2Y3ZjdjN2YKK2RlY3E1MzcgYXBwbHkgICAjZmYwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gLXNOYU4KK2RlY3E1MzggYXBwbHkgICAjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgLT4gLXNOYU45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RlY3E1MzkgYXBwbHkgICAjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgLT4gI2ZlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCisKK2RlY3E1NDAgYXBwbHkgICBOYU4gICAgICAgICAgICAgICAtPiAjN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E1NDEgYXBwbHkgICBOYU4wICAgICAgICAgICAgICAtPiAjN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E1NDIgYXBwbHkgICBOYU4xICAgICAgICAgICAgICAtPiAjN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RlY3E1NDMgYXBwbHkgICBOYU4xMiAgICAgICAgICAgICAtPiAjN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIKK2RlY3E1NDQgYXBwbHkgICBOYU43OSAgICAgICAgICAgICAtPiAjN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzkKK2RlY3E1NDUgYXBwbHkgICBOYU4xMjM0NSAgICAgICAgICAtPiAjN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ5YzUKK2RlY3E1NDYgYXBwbHkgICBOYU4xMjM0NTYgICAgICAgICAtPiAjN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjhlNTYKK2RlY3E1NDcgYXBwbHkgICBOYU43OTk3OTkgICAgICAgICAtPiAjN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZjdmZGYKK2RlY3E1NDggYXBwbHkgICBOYU43OTk3OTk3OTk3OTk3OTk3OTk3OTk3OTk3OTk3OTk3OTkgIC0+ICM3YzAwM2RmZjdmZGZmN2ZkZmY3ZmRmZjdmZGZmN2ZkZgorZGVjcTU0OSBhcHBseSAgIE5hTjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkZWNxNTUwIGFwcGx5ICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAtPiAjNmUwODBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKworLS0gZm9sZC1kb3duIGZ1bGwgc2VxdWVuY2UKK2RlY3E2MDEgYXBwbHkgICAxRSs2MTQ0ICAgICAgICAgICAgICAgICAtPiAjNDdmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYwMiBhcHBseSAgICM0N2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NAorZGVjcTYwMyBhcHBseSAgIDFFKzYxNDMgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNxNjA0IGFwcGx5ICAgIzQzZmZjODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDMKK2RlY3E2MDUgYXBwbHkgICAxRSs2MTQyICAgICAgICAgICAgICAgICAtPiAjNDNmZmMxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYwNiBhcHBseSAgICM0M2ZmYzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDIKK2RlY3E2MDcgYXBwbHkgICAxRSs2MTQxICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYwOCBhcHBseSAgICM0M2ZmYzAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MQorZGVjcTYwOSBhcHBseSAgIDFFKzYxNDAgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNxNjEwIGFwcGx5ICAgIzQzZmZjMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDAKK2RlY3E2MTEgYXBwbHkgICAxRSs2MTM5ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYxMiBhcHBseSAgICM0M2ZmYzAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzkKK2RlY3E2MTMgYXBwbHkgICAxRSs2MTM4ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYxNCBhcHBseSAgICM0M2ZmYzAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjEzOAorZGVjcTYxNSBhcHBseSAgIDFFKzYxMzcgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMDAwODAwMDAwMDAwMDAwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNxNjE2IGFwcGx5ICAgIzQzZmZjMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzcKK2RlY3E2MTcgYXBwbHkgICAxRSs2MTM2ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYxOCBhcHBseSAgICM0M2ZmYzAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzYKK2RlY3E2MTkgYXBwbHkgICAxRSs2MTM1ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYyMCBhcHBseSAgICM0M2ZmYzAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjEzNQorZGVjcTYyMSBhcHBseSAgIDFFKzYxMzQgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNxNjIyIGFwcGx5ICAgIzQzZmZjMDAwMDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzQKK2RlY3E2MjMgYXBwbHkgICAxRSs2MTMzICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYyNCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzMKK2RlY3E2MjUgYXBwbHkgICAxRSs2MTMyICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYyNiBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjEzMgorZGVjcTYyNyBhcHBseSAgIDFFKzYxMzEgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNxNjI4IGFwcGx5ICAgIzQzZmZjMDAwMDAwMDAwMDgwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzEKK2RlY3E2MjkgYXBwbHkgICAxRSs2MTMwICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYzMCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzAKK2RlY3E2MzEgYXBwbHkgICAxRSs2MTI5ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYzMiBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMEUrNjEyOQorZGVjcTYzMyBhcHBseSAgIDFFKzYxMjggICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNxNjM0IGFwcGx5ICAgIzQzZmZjMDAwMDAwMDAwMDAwMjAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDBFKzYxMjgKK2RlY3E2MzUgYXBwbHkgICAxRSs2MTI3ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYzNiBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDBFKzYxMjcKK2RlY3E2MzcgYXBwbHkgICAxRSs2MTI2ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYzOCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrNjEyNgorZGVjcTYzOSBhcHBseSAgIDFFKzYxMjUgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDgwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNxNjQwIGFwcGx5ICAgIzQzZmZjMDAwMDAwMDAwMDAwMDAwODAwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDBFKzYxMjUKK2RlY3E2NDEgYXBwbHkgICAxRSs2MTI0ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTY0MiBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDBFKzYxMjQKK2RlY3E2NDMgYXBwbHkgICAxRSs2MTIzICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTY0NCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMEUrNjEyMworZGVjcTY0NSBhcHBseSAgIDFFKzYxMjIgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMCBDbGFtcGVkCitkZWNxNjQ2IGFwcGx5ICAgIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDBFKzYxMjIKK2RlY3E2NDcgYXBwbHkgICAxRSs2MTIxICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAwMDAgQ2xhbXBlZAorZGVjcTY0OCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDBFKzYxMjEKK2RlY3E2NDkgYXBwbHkgICAxRSs2MTIwICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwNDAwMDAwMDAgQ2xhbXBlZAorZGVjcTY1MCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMEUrNjEyMAorZGVjcTY1MSBhcHBseSAgIDFFKzYxMTkgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwODAwMDAwMCBDbGFtcGVkCitkZWNxNjUyIGFwcGx5ICAgIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDA4MDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDBFKzYxMTkKK2RlY3E2NTMgYXBwbHkgICAxRSs2MTE4ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAgQ2xhbXBlZAorZGVjcTY1NCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDBFKzYxMTgKK2RlY3E2NTUgYXBwbHkgICAxRSs2MTE3ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAgQ2xhbXBlZAorZGVjcTY1NiBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMCAgICAgICAtPiAxLjAwMDAwMEUrNjExNworZGVjcTY1NyBhcHBseSAgIDFFKzYxMTYgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMCBDbGFtcGVkCitkZWNxNjU4IGFwcGx5ICAgIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwMDAwICAgICAgIC0+IDEuMDAwMDBFKzYxMTYKK2RlY3E2NTkgYXBwbHkgICAxRSs2MTE1ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMDAgQ2xhbXBlZAorZGVjcTY2MCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDAwMCAgICAgICAtPiAxLjAwMDBFKzYxMTUKK2RlY3E2NjEgYXBwbHkgICAxRSs2MTE0ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MDAgQ2xhbXBlZAorZGVjcTY2MiBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMCAgICAgICAtPiAxLjAwMEUrNjExNAorZGVjcTY2MyBhcHBseSAgIDFFKzYxMTMgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MCBDbGFtcGVkCitkZWNxNjY0IGFwcGx5ICAgIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgwICAgICAgIC0+IDEuMDBFKzYxMTMKK2RlY3E2NjUgYXBwbHkgICAxRSs2MTEyICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAgQ2xhbXBlZAorZGVjcTY2NiBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMCAgICAgICAtPiAxLjBFKzYxMTIKK2RlY3E2NjcgYXBwbHkgICAxRSs2MTExICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RlY3E2NjggYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICAgLT4gMUUrNjExMQorZGVjcTY2OSBhcHBseSAgIDFFKzYxMTAgICAgICAgICAgICAgICAgIC0+ICM0M2ZmODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZGVjcTY3MCBhcHBseSAgICM0M2ZmODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAtPiAxRSs2MTEwCisKKy0tIFNlbGVjdGVkIERQRCBjb2RlcworZGVjcTcwMCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAwCitkZWNxNzAxIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5ICAgICAgIC0+IDkKK2RlY3E3MDIgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAgICAgICAgLT4gMTAKK2RlY3E3MDMgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTkgICAgICAgLT4gMTkKK2RlY3E3MDQgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAgICAgICAgLT4gMjAKK2RlY3E3MDUgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjkgICAgICAgLT4gMjkKK2RlY3E3MDYgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzAgICAgICAgLT4gMzAKK2RlY3E3MDcgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzkgICAgICAgLT4gMzkKK2RlY3E3MDggYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDAgICAgICAgLT4gNDAKK2RlY3E3MDkgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDkgICAgICAgLT4gNDkKK2RlY3E3MTAgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNTAgICAgICAgLT4gNTAKK2RlY3E3MTEgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNTkgICAgICAgLT4gNTkKK2RlY3E3MTIgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjAgICAgICAgLT4gNjAKK2RlY3E3MTMgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjkgICAgICAgLT4gNjkKK2RlY3E3MTQgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzAgICAgICAgLT4gNzAKK2RlY3E3MTUgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzEgICAgICAgLT4gNzEKK2RlY3E3MTYgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzIgICAgICAgLT4gNzIKK2RlY3E3MTcgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzMgICAgICAgLT4gNzMKK2RlY3E3MTggYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzQgICAgICAgLT4gNzQKK2RlY3E3MTkgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzUgICAgICAgLT4gNzUKK2RlY3E3MjAgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzYgICAgICAgLT4gNzYKK2RlY3E3MjEgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzcgICAgICAgLT4gNzcKK2RlY3E3MjIgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzggICAgICAgLT4gNzgKK2RlY3E3MjMgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzkgICAgICAgLT4gNzkKKworZGVjcTczMCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI5ZSAgICAgICAtPiA5OTQKK2RlY3E3MzEgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyOWYgICAgICAgLT4gOTk1CitkZWNxNzMyIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMmEwICAgICAgIC0+IDUyMAorZGVjcTczMyBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJhMSAgICAgICAtPiA1MjEKKworLS0gRFBEOiBvbmUgb2YgZWFjaCBvZiB0aGUgaHVmZm1hbiBncm91cHMKK2RlY3E3NDAgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzZjcgICAgICAgLT4gNzc3CitkZWNxNzQxIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM2Y4ICAgICAgIC0+IDc3OAorZGVjcTc0MiBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNlYiAgICAgICAtPiA3ODcKK2RlY3E3NDMgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzN2QgICAgICAgLT4gODc3CitkZWNxNzQ0IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzlmICAgICAgIC0+IDk5NworZGVjcTc0NSBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNiZiAgICAgICAtPiA5NzkKK2RlY3E3NDYgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzZGYgICAgICAgLT4gNzk5CitkZWNxNzQ3IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDZlICAgICAgIC0+IDg4OAorCisKKy0tIERQRCBhbGwtaGlnaHMgY2FzZXMgKGluY2x1ZGVzIHRoZSAyNCByZWR1bmRhbnQgY29kZXMpCitkZWNxNzUwIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDZlICAgICAgIC0+IDg4OAorZGVjcTc1MSBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE2ZSAgICAgICAtPiA4ODgKK2RlY3E3NTIgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyNmUgICAgICAgLT4gODg4CitkZWNxNzUzIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzZlICAgICAgIC0+IDg4OAorZGVjcTc1NCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2ZiAgICAgICAtPiA4ODkKK2RlY3E3NTUgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxNmYgICAgICAgLT4gODg5CitkZWNxNzU2IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjZmICAgICAgIC0+IDg4OQorZGVjcTc1NyBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDM2ZiAgICAgICAtPiA4ODkKKworZGVjcTc2MCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3ZSAgICAgICAtPiA4OTgKK2RlY3E3NjEgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxN2UgICAgICAgLT4gODk4CitkZWNxNzYyIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjdlICAgICAgIC0+IDg5OAorZGVjcTc2MyBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDM3ZSAgICAgICAtPiA4OTgKK2RlY3E3NjQgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwN2YgICAgICAgLT4gODk5CitkZWNxNzY1IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTdmICAgICAgIC0+IDg5OQorZGVjcTc2NiBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3ZiAgICAgICAtPiA4OTkKK2RlY3E3NjcgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzN2YgICAgICAgLT4gODk5CisKK2RlY3E3NzAgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZWUgICAgICAgLT4gOTg4CitkZWNxNzcxIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMWVlICAgICAgIC0+IDk4OAorZGVjcTc3MiBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJlZSAgICAgICAtPiA5ODgKK2RlY3E3NzMgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzZWUgICAgICAgLT4gOTg4CitkZWNxNzc0IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGVmICAgICAgIC0+IDk4OQorZGVjcTc3NSBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFlZiAgICAgICAtPiA5ODkKK2RlY3E3NzYgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyZWYgICAgICAgLT4gOTg5CitkZWNxNzc3IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM2VmICAgICAgIC0+IDk4OQorCitkZWNxNzgwIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZlICAgICAgIC0+IDk5OAorZGVjcTc4MSBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFmZSAgICAgICAtPiA5OTgKK2RlY3E3ODIgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyZmUgICAgICAgLT4gOTk4CitkZWNxNzgzIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM2ZlICAgICAgIC0+IDk5OAorZGVjcTc4NCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZiAgICAgICAtPiA5OTkKK2RlY3E3ODUgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxZmYgICAgICAgLT4gOTk5CitkZWNxNzg2IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMmZmICAgICAgIC0+IDk5OQorZGVjcTc4NyBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNmZiAgICAgICAtPiA5OTkKKworLS0gTWlzY2VsbGFuZW91cyAodGVzdGVycycgcXVlcmllcywgZXRjLikKKworZGVjcTc5MCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYzAwMCAgICAgICAtPiAzMDAwMAorZGVjcTc5MSBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzgwMCAgICAgICAtPiA4OTAwMDAKK2RlY3E3OTIgYXBwbHkgICAzMDAwMCAtPiAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGMwMDAKK2RlY3E3OTMgYXBwbHkgICA4OTAwMDAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3ODAwCisKKy0tIHZhbHVlcyBhcm91bmQgW3VdaW50MzIgZWRnZXMgKHplcm9zIGRvbmUgZWFybGllcikKK2RlY3E4MDAgYXBwbHkgLTIxNDc0ODM2NDYgIC0+ICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDA4Yzc4YWY0NgorZGVjcTgwMSBhcHBseSAtMjE0NzQ4MzY0NyAgLT4gI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDhjNzhhZjQ3CitkZWNxODAyIGFwcGx5IC0yMTQ3NDgzNjQ4ICAtPiAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwOGM3OGFmNDgKK2RlY3E4MDMgYXBwbHkgLTIxNDc0ODM2NDkgIC0+ICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDA4Yzc4YWY0OQorZGVjcTgwNCBhcHBseSAgMjE0NzQ4MzY0NiAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDhjNzhhZjQ2CitkZWNxODA1IGFwcGx5ICAyMTQ3NDgzNjQ3ICAtPiAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwOGM3OGFmNDcKK2RlY3E4MDYgYXBwbHkgIDIxNDc0ODM2NDggIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDA4Yzc4YWY0OAorZGVjcTgwNyBhcHBseSAgMjE0NzQ4MzY0OSAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDhjNzhhZjQ5CitkZWNxODA4IGFwcGx5ICA0Mjk0OTY3Mjk0ICAtPiAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAxMTVhZmI1NWEKK2RlY3E4MDkgYXBwbHkgIDQyOTQ5NjcyOTUgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDExNWFmYjU1YgorZGVjcTgxMCBhcHBseSAgNDI5NDk2NzI5NiAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMTE1YWZiNTdhCitkZWNxODExIGFwcGx5ICA0Mjk0OTY3Mjk3ICAtPiAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAxMTVhZmI1N2IKKworZGVjcTgyMCBhcHBseSAgI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDhjNzhhZjQ2IC0+IC0yMTQ3NDgzNjQ2CitkZWNxODIxIGFwcGx5ICAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwOGM3OGFmNDcgLT4gLTIxNDc0ODM2NDcKK2RlY3E4MjIgYXBwbHkgICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDA4Yzc4YWY0OCAtPiAtMjE0NzQ4MzY0OAorZGVjcTgyMyBhcHBseSAgI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDhjNzhhZjQ5IC0+IC0yMTQ3NDgzNjQ5CitkZWNxODI0IGFwcGx5ICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwOGM3OGFmNDYgLT4gIDIxNDc0ODM2NDYKK2RlY3E4MjUgYXBwbHkgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDA4Yzc4YWY0NyAtPiAgMjE0NzQ4MzY0NworZGVjcTgyNiBhcHBseSAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDhjNzhhZjQ4IC0+ICAyMTQ3NDgzNjQ4CitkZWNxODI3IGFwcGx5ICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwOGM3OGFmNDkgLT4gIDIxNDc0ODM2NDkKK2RlY3E4MjggYXBwbHkgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDExNWFmYjU1YSAtPiAgNDI5NDk2NzI5NAorZGVjcTgyOSBhcHBseSAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMTE1YWZiNTViIC0+ICA0Mjk0OTY3Mjk1CitkZWNxODMwIGFwcGx5ICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAxMTVhZmI1N2EgLT4gIDQyOTQ5NjcyOTYKK2RlY3E4MzEgYXBwbHkgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDExNWFmYjU3YiAtPiAgNDI5NDk2NzI5NworCistLSBWRyB0ZXN0Y2FzZQorZGVjcTg0MCBhcHBseSAgICAjMjA4MDAwMDAwMDAwMDAwMEYyOTQwMDAwMDAxNzI2MzYgLT4gOC44MTEyNTAwMDAwMDAwMTM0OTQzNkUtMTU0OAorZGVjcTg0MSBhcHBseSAgICAjMjA4MDAwMDAwMDAwMDAwMDgwMDAwMDAwMDAwMDAwMDAgLT4gOC4wMDAwMDAwMDAwMDAwMDAwMDBFLTE1NTAKK2RlY3E4NDIgYXBwbHkgICAgIzFFRjk4NDkwMDAwMDAwMDEwRjZFNEUwMDAwMDAwMDAwIC0+IDcuMDQ5MDAwMDAwMDAwMDEwNzk1NDg4MDAwMDAwMDAwMDAwRS0zMDk3CitkZWNxODQzIG11bHRpcGx5ICMyMDgwMDAwMDAwMDAwMDAwODAwMDAwMDAwMDAwMDAwMCAjMjA4MDAwMDAwMDAwMDAwMEYyOTQwMDAwMDAxNzI2MzYgLT4gIzFFRjk4NDkwMDAwMDAwMDEwRjZFNEUwMDAwMDAwMDAwIFJvdW5kZWQKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUZNQS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUZNQS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ODQ1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxRk1BLmRlY1Rlc3QKQEAgLTAsMCArMSwxNzg2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxRk1BLmRlY1Rlc3QgLS0gZGVjUXVhZCBGdXNlZCBNdWx0aXBseSBBZGQgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gVGhlc2UgdGVzdHMgY29tcHJlc2UgdGhyZWUgcGFydHM6CistLSAgIDEuIFNhbml0eSBjaGVja3MgYW5kIG90aGVyIHRocmVlLW9wZXJhbmQgdGVzdHMgKGVzcGVjaWFsbHkgdGhvc2UKKy0tICAgICAgd2hlcmUgdGhlIGZ1c2VkIG9wZXJhdGlvbiBtYWtlcyBhIGRpZmZlcmVuY2UpCistLSAgIDIuIE11bHRpcGx5IHRlc3RzICh0aGlyZCBvcGVyYW5kIGlzIG5ldXRyYWwgemVybyBbMEUrZW1heF0pCistLSAgIDMuIEFkZGl0aW9uIHRlc3RzIChmaXJzdCBvcGVyYW5kIGlzIDEpCistLSBUaGUgbXVsdGlwbHkgYW5kIGFkZGl0aW9uIHRlc3RzIGFyZSBleHRlbnNpdmUgYmVjYXVzZSBGTUEgbWF5IGhhdmUKKy0tIGl0cyBvd24gZGVkaWNhdGVkIG11bHRpcGxpY2F0aW9uIG9yIGFkZGl0aW9uIHJvdXRpbmUocyksIGFuZCB0aGV5CistLSBhbHNvIGluaGVyZW50bHkgY2hlY2sgdGhlIGxlZnQtdG8tcmlnaHQgcHJvcGVydGllcy4KKworLS0gU2FuaXR5IGNoZWNrcworZHFmbWEwMDAxIGZtYSAgMSAgIDEgICAxIC0+ICAgMgorZHFmbWEwMDAyIGZtYSAgMSAgIDEgICAyIC0+ICAgMworZHFmbWEwMDAzIGZtYSAgMiAgIDIgICAzIC0+ICAgNworZHFmbWEwMDA0IGZtYSAgOSAgIDkgICA5IC0+ICA5MAorZHFmbWEwMDA1IGZtYSAtMSAgIDEgICAxIC0+ICAgMAorZHFmbWEwMDA2IGZtYSAtMSAgIDEgICAyIC0+ICAgMQorZHFmbWEwMDA3IGZtYSAtMiAgIDIgICAzIC0+ICAtMQorZHFmbWEwMDA4IGZtYSAtOSAgIDkgICA5IC0+IC03MgorZHFmbWEwMDExIGZtYSAgMSAgLTEgICAxIC0+ICAgMAorZHFmbWEwMDEyIGZtYSAgMSAgLTEgICAyIC0+ICAgMQorZHFmbWEwMDEzIGZtYSAgMiAgLTIgICAzIC0+ICAtMQorZHFmbWEwMDE0IGZtYSAgOSAgLTkgICA5IC0+IC03MgorZHFmbWEwMDE1IGZtYSAgMSAgIDEgIC0xIC0+ICAgMAorZHFmbWEwMDE2IGZtYSAgMSAgIDEgIC0yIC0+ICAtMQorZHFmbWEwMDE3IGZtYSAgMiAgIDIgIC0zIC0+ICAgMQorZHFmbWEwMDE4IGZtYSAgOSAgIDkgIC05IC0+ICA3MgorCistLSBub24taW50ZWdlciBleGFjdHMKK2RxZm1hMDEwMCAgZm1hICAgIDI1LjIgICA2My42ICAgLTQzOCAgLT4gIDExNjQuNzIKK2RxZm1hMDEwMSAgZm1hICAgMC4zMDEgIDAuMzgwICAgIDMzNCAgLT4gIDMzNC4xMTQzODAKK2RxZm1hMDEwMiAgZm1hICAgIDQ5LjIgICAtNC44ICAgMjMuMyAgLT4gIC0yMTIuODYKK2RxZm1hMDEwMyAgZm1hICAgIDQuMjIgIDAuMDc5ICAtOTQuNiAgLT4gIC05NC4yNjY2MgorZHFmbWEwMTA0ICBmbWEgICAgIDkwMyAgMC43OTcgIDAuODg3ICAtPiAgNzIwLjU3OAorZHFmbWEwMTA1ICBmbWEgICAgNi4xMyAgIC0xNjEgICA2NS45ICAtPiAgLTkyMS4wMworZHFmbWEwMTA2ICBmbWEgICAgMjguMiAgICA3MjcgICA1LjQ1ICAtPiAgMjA1MDYuODUKK2RxZm1hMDEwNyAgZm1hICAgICAgIDQgICAgNjA1ICAgIDY4OCAgLT4gIDMxMDgKK2RxZm1hMDEwOCAgZm1hICAgIDkzLjMgICAwLjE5ICAwLjIyNiAgLT4gIDE3Ljk1MworZHFmbWEwMTA5ICBmbWEgICAwLjE2OSAgIC0zNDEgICA1LjYxICAtPiAgLTUyLjAxOQorZHFmbWEwMTEwICBmbWEgICAtNzIuMiAgICAgMzAgIC01MS4yICAtPiAgLTIyMTcuMgorZHFmbWEwMTExICBmbWEgIC0wLjQwOSAgICAgMTMgICAyMC40ICAtPiAgMTUuMDgzCitkcWZtYTAxMTIgIGZtYSAgICAgMzE3ICAgNzcuMCAgIDE5LjAgIC0+ICAyNDQyOC4wCitkcWZtYTAxMTMgIGZtYSAgICAgIDQ3ICAgNi41OCAgIDEuNjIgIC0+ICAzMTAuODgKK2RxZm1hMDExNCAgZm1hICAgIDEuMzYgIDAuOTg0ICAwLjQ5MyAgLT4gIDEuODMxMjQKK2RxZm1hMDExNSAgZm1hICAgIDcyLjcgICAgMjc0ICAgMS41NiAgLT4gIDE5OTIxLjM2CitkcWZtYTAxMTYgIGZtYSAgICAgMzM1ICAgIDg0NyAgICAgODMgIC0+ICAyODM4MjgKK2RxZm1hMDExNyAgZm1hICAgICA2NjYgIDAuMjQ3ICAgMjUuNCAgLT4gIDE4OS45MDIKK2RxZm1hMDExOCAgZm1hICAgLTMuODcgICAzLjA2ICAgNzguMCAgLT4gIDY2LjE1NzgKK2RxZm1hMDExOSAgZm1hICAgMC43NDIgICAgMTkyICAgMzUuNiAgLT4gIDE3OC4wNjQKK2RxZm1hMDEyMCAgZm1hICAgLTkxLjYgICA1LjI5ICAwLjE1MyAgLT4gIC00ODQuNDExCisKKy0tIGNhc2VzIHdoZXJlIHJlc3VsdCBpcyBkaWZmZXJlbnQgZnJvbSBzZXBhcmF0ZSBtdWx0aXBseSArIGFkZDsgZWFjaAorLS0gaXMgcHJlY2VkZWQgYnkgdGhlIHJlc3VsdCBvZiB1bmZ1c2VkIG11bHRpcGx5IGFuZCBhZGQKKy0tIFt0aGlzIGlzIGFib3V0IDIwJSBvZiBhbGwgc2ltaWxhciAgY2FzZXMgaW4gZ2VuZXJhbF0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDQuNTAwMTE5MDAyMTAwMDAwMjA5NDY5NzI5Mzc1Njk4Nzc4RSszOAorZHFmbWEwMjAyICBmbWEgICAgICAgNjg1Mzc5ODU4NjEzNTU4NjQ0NTcuNTY5NCAgICAgIDY1NjU4NzU3NjI5NzIwODY2MDUuODU5NjkgICAgICAgMzU4OTI2MzQ0NDcyMzY3NTMuMTcyODEyICAtPiAgNC41MDAxMTkwMDIxMDAwMDAyMDk0Njk3MjkzNzU2OTg3NzlFKzM4IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgNS45OTYyNDg0Njk1ODQ1OTQzNDY4NTg4ODE2MjAxODU1MTRFKzQxCitkcWZtYTAyMDggIGZtYSAgICAgICAgICA4OTI2MTgyMjM0NDcyNzYyODU3MS45ICAgICAgNjcxNzU5NTg0NTY1NDEzMTM4MzMzNi44OSAgICAgIDUwNjEwMzY0OTcyODg3OTYwNzYyNjYuMTEgIC0+ICA1Ljk5NjI0ODQ2OTU4NDU5NDM0Njg1ODg4MTYyMDE4NTUxM0UrNDEgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxLjg5OTI0Mjk2ODY3ODI1NjkyNDAyMTU5NDc3MDg3NDA3MEUrMzQKK2RxZm1hMDIxMCAgZm1hICAgICAgIDMyMDUwNjIzNzIzMjQ0ODY4NS40OTU5NzEgICAgICAgNTkyNTc1OTc3NjQwMTc5NjcuOTg0NDQ4ICAgICAgMzIwNTYxNTIzOTA3NzcxMTU4OTkxMi44NSAgLT4gIDEuODk5MjQyOTY4Njc4MjU2OTI0MDIxNTk0NzcwODc0MDcxRSszNCBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDcuMDc4NTk2OTc4ODQyODA5NTM3OTI5Njk5OTU0ODYwMzA5RSszNworZHFmbWEwMjE1ICBmbWEgICAgICAgIDIyMDI0Nzg0MzI1OTExMjI2My4xNzk5NSAgICAgICAzMjEzOTIzNDAyODc5ODc5NzkwMDIuODAgICAgICAgIDQ3NTMzMjc5ODE5OTk3MTY3NjU1NDQwICAtPiAgNy4wNzg1OTY5Nzg4NDI4MDk1Mzc5Mjk2OTk5NTQ4NjAzMDhFKzM3IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMS4yMjQ5NTU2Njc1ODE0Mjc1NTk3NTQxMDY4NjIzNTA3NDNFKzM3CitkcWZtYTAyMjYgIGZtYSAgICAgICAyMzg4MDcyOTc5MDM2ODg4MDQxMi4xNDQ5ICAgICAgIDUxMjk0NzMzMzgyNzA2NDcxOS41NTQwNyAgICAgIDIxNzExNzQzODQxOTU5MDgyNDUwMi45NjMgIC0+ICAxLjIyNDk1NTY2NzU4MTQyNzU1OTc1NDEwNjg2MjM1MDc0NEUrMzcgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAtMi41MzAwOTQwNDMyNTMxNDg4MDYyNzIyNzYzNjg1NzkxNDRFKzQyCitkcWZtYTAyMjkgIGZtYSAgICAgICAgMjUzOTg5MjM1NzAxNjA5OTcwNi40MTI2ICAgICAgLTk5NjE0MjIzMjY2NzUwNDgxNzcxNzQzNSAgICAgICA1MzY4MjA4MjU5ODMxNTk0OTQyNS45MzcgIC0+ICAtMi41MzAwOTQwNDMyNTMxNDg4MDYyNzIyNzYzNjg1NzkxNDNFKzQyIEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMS43MTMzODcwODU3NTk3MTE5NTQzMTkzOTE0MTI3ODg0NTRFKzM3CitkcWZtYTAyMzMgIGZtYSAgICAgICAgNDU0NjMzOTQ5MTM0MTYyNDQ2NC4wODA0ICAgICAgICAgICAgMzc2ODcxNzg2NDE2OTIwNTU4MSAgICAgICA4MzU3ODk4MDI3ODY5MDM5NTE4NC42MjAgIC0+ICAxLjcxMzM4NzA4NTc1OTcxMTk1NDMxOTM5MTQxMjc4ODQ1M0UrMzcgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICA0LjA2MjI3NTY2MzQwNTgyMzcxNjQxMTU3OTExNzc3MTU0N0UrMzUKK2RxZm1hMDIzNSAgZm1hICAgICAgICA0MDkyNDIxMTk0MzM4MTYxMzEuNDIyNTMgICAgICA5OTI2MzM4MTUxNjY3NDE1MDEuNDc3MjQ5ICAgICAgICA3MDE3OTYzNjU0NDQxNjc1NjEyOTU0NiAgLT4gIDQuMDYyMjc1NjYzNDA1ODIzNzE2NDExNTc5MTE3NzcxNTQ4RSszNSBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDYuMDAyNjA0MzI3NzMyNTY4NDkwNTYyMjQ5ODc1MzA2ODIzRSs0NworZHFmbWEwMjU4ICBmbWEgICAgICAgIDgxNzk0MTMzNjU5MzU0MTc0MjE1OTY4NCAgICAgICA3MzM4NjczMzk3NjkzMTA3MjkyNjY1OTggICAgICA3ODU2Mzg0NDY1MDk0MjQxOTMxMTgzMC44ICAtPiAgNi4wMDI2MDQzMjc3MzI1Njg0OTA1NjIyNDk4NzUzMDY4MjJFKzQ3IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgLTIuMDI3MDIyNTE0MzgxNDUyMTk3NTEwMTAzMzk1MjgzODc0RSszOQorZHFmbWEwMjY0ICBmbWEgICAgICAgMzg3NjE3MzEwMTY5MTYxMjcwLjczNzUzMiAgICAgLTUyMjk0NDI3MDM0MTQ5NTYwNjEyMTYuNjIgICAgICA1NzY2NTY2NjgxNjY1Mjk2NzE1MDQ3My41ICAtPiAgLTIuMDI3MDIyNTE0MzgxNDUyMTk3NTEwMTAzMzk1MjgzODczRSszOSBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIC03Ljg1NjUyNTAzOTgwMzU1NDAwMTE0NDA4OTg0MjczMDM2MUUrMzcKK2RxZm1hMDI2NyAgZm1hICAgICAgLTg0NzY1NTg0NTcyMDU2NTI3NDcwMS4yMTAgICAgICAgIDkyNjg1MzE2NTY0MTE3NzM5LjgzOTg0ICAgICAgMjI3ODA5NTAwNDEzNzY0MjQ0MjkuNTY4NiAgLT4gIC03Ljg1NjUyNTAzOTgwMzU1NDAwMTE0NDA4OTg0MjczMDM2MEUrMzcgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxLjY5NTUxNTU2MjAxMTUyMDc0NjEyNTYwNzUwMjIzNzU1OUUrMzgKK2RxZm1hMDI2OCAgZm1hICAgICAgICAgIDIxNTkwMjkwMzY1MTI3Njg1LjM2NzUgICAgICAgNzg1MzEzOTIyNzU3NjU0MTM3OTQyNi44ICAgICAgIC0zMjc1ODU5NDM3MjM2MTgwLjc2MTU0NCAgLT4gIDEuNjk1NTE1NTYyMDExNTIwNzQ2MTI1NjA3NTAyMjM3NTU4RSszOCBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIC04LjQ0ODQyMjkzNTc4MzI4OTIxOTc0ODExNTAzODAxNDcxMEUrMzgKK2RxZm1hMDI2OSAgZm1hICAgICAgLTk3NDMyMDYzNjI3Mjg2MjY5Ny45NzE1ODYgICAgICA4NjcxMDkxMDM2NDE4NjAyNDc0NDAuNzU2ICAgICAgICAtOTc3NTE3MDc3NTkwMjQ1NDc2Mi45OCAgLT4gIC04LjQ0ODQyMjkzNTc4MzI4OTIxOTc0ODExNTAzODAxNDcwOUUrMzggSW5leGFjdCBSb3VuZGVkCisKKy0tIENhc2VzIHdoZXJlIG11bHRpcGx5IHdvdWxkIG92ZXJmbG93IG9yIHVuZGVyZmxvdyBpZiBzZXBhcmF0ZQorZHFmbWEwMzAwICBmbWEgICA5ZSs2MTQ0ICAgIDEwICAgMCAgICAgICAgIC0+IEluZmluaXR5ICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMDMwMSAgZm1hICAgMWUrNjE0NCAgICAxMCAgIDAgICAgICAgICAtPiBJbmZpbml0eSAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWZtYTAzMDIgIGZtYSAgIDFlKzYxNDQgICAgMTAgICAtMWUrNjE0NCAgLT4gOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDQgQ2xhbXBlZAorZHFmbWEwMzAzICBmbWEgICAxZSs2MTQ0ICAgIDEwICAgLTllKzYxNDQgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0IENsYW1wZWQKKy0tIHN1Ym5vcm1hbCBldGMuCitkcWZtYTAzMDUgIGZtYSAgIDFlLTYxNzYgICAgMC4xICAwICAgICAgICAgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWZtYTAzMDYgIGZtYSAgIDFlLTYxNzYgICAgMC4xICAxICAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWZtYTAzMDcgIGZtYSAgIDFlLTYxNzYgICAgMC4xICAxZS02MTc2ICAgLT4gMUUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLSBJbmZpbml0ZSBjb21iaW5hdGlvbnMKK2RxZm1hMDgwMCBmbWEgIEluZiAgIEluZiAgIEluZiAgICAtPiAgSW5maW5pdHkKK2RxZm1hMDgwMSBmbWEgIEluZiAgIEluZiAgLUluZiAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTA4MDIgZm1hICBJbmYgIC1JbmYgICBJbmYgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEwODAzIGZtYSAgSW5mICAtSW5mICAtSW5mICAgIC0+IC1JbmZpbml0eQorZHFmbWEwODA0IGZtYSAtSW5mICAgSW5mICAgSW5mICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMDgwNSBmbWEgLUluZiAgIEluZiAgLUluZiAgICAtPiAtSW5maW5pdHkKK2RxZm1hMDgwNiBmbWEgLUluZiAgLUluZiAgIEluZiAgICAtPiAgSW5maW5pdHkKK2RxZm1hMDgwNyBmbWEgLUluZiAgLUluZiAgLUluZiAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIFRyaXBsZSBOYU4gcHJvcGFnYXRpb24KK2RxZm1hMDkwMCBmbWEgIE5hTjIgIE5hTjMgIE5hTjUgICAtPiAgTmFOMgorZHFmbWEwOTAxIGZtYSAgMCAgICAgTmFOMyAgTmFONSAgIC0+ICBOYU4zCitkcWZtYTA5MDIgZm1hICAwICAgICAwICAgICBOYU41ICAgLT4gIE5hTjUKKy0tIGZpcnN0IHNOYU4gd2lucyAoY29uc2lkZXIgcU5hTiBmcm9tIGVhcmxpZXIgc05hTiBiZWluZworLS0gb3ZlcnJpZGRlbiBieSBhbiBzTmFOIGluIHRoaXJkIG9wZXJhbmQpCitkcWZtYTA5MDMgZm1hICBzTmFOMSBzTmFOMiBzTmFOMyAgLT4gIE5hTjEgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMDkwNCBmbWEgIDAgICAgIHNOYU4yIHNOYU4zICAtPiAgTmFOMiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEwOTA1IGZtYSAgMCAgICAgMCAgICAgc05hTjMgIC0+ICBOYU4zIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTA5MDYgZm1hICBzTmFOMSBzTmFOMiBzTmFOMyAgLT4gIE5hTjEgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMDkwNyBmbWEgIE5hTjcgIHNOYU4yIHNOYU4zICAtPiAgTmFOMiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEwOTA4IGZtYSAgTmFONyAgTmFONSAgc05hTjMgIC0+ICBOYU4zIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE1VTFRJUExJQ0FUSU9OIFRFU1RTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkcWZtYTIwMDAgZm1hICAyICAgICAgMiAgIDBlKzYxNDQgIC0+IDQKK2RxZm1hMjAwMSBmbWEgIDIgICAgICAzICAgMGUrNjE0NCAgLT4gNgorZHFmbWEyMDAyIGZtYSAgNSAgICAgIDEgICAwZSs2MTQ0ICAtPiA1CitkcWZtYTIwMDMgZm1hICA1ICAgICAgMiAgIDBlKzYxNDQgIC0+IDEwCitkcWZtYTIwMDQgZm1hICAxLjIwICAgMiAgIDBlKzYxNDQgIC0+IDIuNDAKK2RxZm1hMjAwNSBmbWEgIDEuMjAgICAwICAgMGUrNjE0NCAgLT4gMC4wMAorZHFmbWEyMDA2IGZtYSAgMS4yMCAgLTIgICAwZSs2MTQ0ICAtPiAtMi40MAorZHFmbWEyMDA3IGZtYSAgLTEuMjAgIDIgICAwZSs2MTQ0ICAtPiAtMi40MAorZHFmbWEyMDA4IGZtYSAgLTEuMjAgIDAgICAwZSs2MTQ0ICAtPiAwLjAwCitkcWZtYTIwMDkgZm1hICAtMS4yMCAtMiAgIDBlKzYxNDQgIC0+IDIuNDAKK2RxZm1hMjAxMCBmbWEgIDUuMDkgNy4xICAgMGUrNjE0NCAgLT4gMzYuMTM5CitkcWZtYTIwMTEgZm1hICAyLjUgICAgNCAgIDBlKzYxNDQgIC0+IDEwLjAKK2RxZm1hMjAxMiBmbWEgIDIuNTAgICA0ICAgMGUrNjE0NCAgLT4gMTAuMDAKK2RxZm1hMjAxMyBmbWEgIDEuMjM0NTY3ODkgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgMGUrNjE0NCAgLT4gMS4yMzQ1Njc4OTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgUm91bmRlZAorZHFmbWEyMDE1IGZtYSAgMi41MCAgIDQgICAwZSs2MTQ0ICAtPiAxMC4wMAorZHFmbWEyMDE2IGZtYSAgIDkuOTk5OTk5OTk5OTk5OTk5OTkgIDkuOTk5OTk5OTk5OTk5OTk5OTkgICAwZSs2MTQ0ICAtPiAgOTkuOTk5OTk5OTk5OTk5OTk5ODAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWZtYTIwMTcgZm1hICAgOS45OTk5OTk5OTk5OTk5OTk5OSAtOS45OTk5OTk5OTk5OTk5OTk5OSAgIDBlKzYxNDQgIC0+IC05OS45OTk5OTk5OTk5OTk5OTk4MDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjAxOCBmbWEgIC05Ljk5OTk5OTk5OTk5OTk5OTk5ICA5Ljk5OTk5OTk5OTk5OTk5OTk5ICAgMGUrNjE0NCAgLT4gLTk5Ljk5OTk5OTk5OTk5OTk5OTgwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFmbWEyMDE5IGZtYSAgLTkuOTk5OTk5OTk5OTk5OTk5OTkgLTkuOTk5OTk5OTk5OTk5OTk5OTkgICAwZSs2MTQ0ICAtPiAgOTkuOTk5OTk5OTk5OTk5OTk5ODAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHplcm9zLCBldGMuCitkcWZtYTIwMjEgZm1hICAgMCAgICAgIDAgICAgICAgMGUrNjE0NCAgLT4gIDAKK2RxZm1hMjAyMiBmbWEgICAwICAgICAtMCAgICAgICAwZSs2MTQ0ICAtPiAgMAorZHFmbWEyMDIzIGZtYSAgLTAgICAgICAwICAgICAgIDBlKzYxNDQgIC0+ICAwCitkcWZtYTIwMjQgZm1hICAtMCAgICAgLTAgICAgICAgMGUrNjE0NCAgLT4gIDAKK2RxZm1hMjAyNSBmbWEgIC0wLjAgICAtMC4wICAgICAwZSs2MTQ0ICAtPiAgMC4wMAorZHFmbWEyMDI2IGZtYSAgLTAuMCAgIC0wLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAwCitkcWZtYTIwMjcgZm1hICAtMC4wICAgLTAuMCAgICAgMGUrNjE0NCAgLT4gIDAuMDAKK2RxZm1hMjAyOCBmbWEgIC0wLjAgICAtMC4wICAgICAwZSs2MTQ0ICAtPiAgMC4wMAorZHFmbWEyMDMwIGZtYSAgIDUuMDAgICAxRS0zICAgIDBlKzYxNDQgIC0+ICAwLjAwNTAwCitkcWZtYTIwMzEgZm1hICAgMDAuMDAgIDAuMDAwICAgMGUrNjE0NCAgLT4gIDAuMDAwMDAKK2RxZm1hMjAzMiBmbWEgICAwMC4wMCAgMEUtMyAgICAwZSs2MTQ0ICAtPiAgMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2RxZm1hMjAzMyBmbWEgICAwRS0zICAgMDAuMDAgICAwZSs2MTQ0ICAtPiAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK2RxZm1hMjAzNCBmbWEgIC01LjAwICAgMUUtMyAgICAwZSs2MTQ0ICAtPiAtMC4wMDUwMAorZHFmbWEyMDM1IGZtYSAgLTAwLjAwICAwLjAwMCAgIDBlKzYxNDQgIC0+ICAwLjAwMDAwCitkcWZtYTIwMzYgZm1hICAtMDAuMDAgIDBFLTMgICAgMGUrNjE0NCAgLT4gIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitkcWZtYTIwMzcgZm1hICAtMEUtMyAgIDAwLjAwICAgMGUrNjE0NCAgLT4gIDAuMDAwMDAgICAgIC0tIGxocyBpcyAwCitkcWZtYTIwMzggZm1hICAgNS4wMCAgLTFFLTMgICAgMGUrNjE0NCAgLT4gLTAuMDA1MDAKK2RxZm1hMjAzOSBmbWEgICAwMC4wMCAtMC4wMDAgICAwZSs2MTQ0ICAtPiAgMC4wMDAwMAorZHFmbWEyMDQwIGZtYSAgIDAwLjAwIC0wRS0zICAgIDBlKzYxNDQgIC0+ICAwLjAwMDAwICAgICAtLSByaHMgaXMgMAorZHFmbWEyMDQxIGZtYSAgIDBFLTMgIC0wMC4wMCAgIDBlKzYxNDQgIC0+ICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorZHFmbWEyMDQyIGZtYSAgLTUuMDAgIC0xRS0zICAgIDBlKzYxNDQgIC0+ICAwLjAwNTAwCitkcWZtYTIwNDMgZm1hICAtMDAuMDAgLTAuMDAwICAgMGUrNjE0NCAgLT4gIDAuMDAwMDAKK2RxZm1hMjA0NCBmbWEgIC0wMC4wMCAtMEUtMyAgICAwZSs2MTQ0ICAtPiAgMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2RxZm1hMjA0NSBmbWEgIC0wRS0zICAtMDAuMDAgICAwZSs2MTQ0ICAtPiAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKKworLS0gZXhhbXBsZXMgZnJvbSBkZWNhcml0aAorZHFmbWEyMDUwIGZtYSAgMS4yMCAzICAgICAgICAgIDBlKzYxNDQgIC0+IDMuNjAKK2RxZm1hMjA1MSBmbWEgIDcgICAgMyAgICAgICAgICAwZSs2MTQ0ICAtPiAyMQorZHFmbWEyMDUyIGZtYSAgMC45ICAwLjggICAgICAgIDBlKzYxNDQgIC0+IDAuNzIKK2RxZm1hMjA1MyBmbWEgIDAuOSAgLTAgICAgICAgICAwZSs2MTQ0ICAtPiAwLjAKK2RxZm1hMjA1NCBmbWEgIDY1NDMyMSA2NTQzMjEgICAwZSs2MTQ0ICAtPiA0MjgxMzU5NzEwNDEKKworZHFmbWEyMDYwIGZtYSAgMTIzLjQ1IDFlNyAgICAwZSs2MTQ0ICAtPiAgMS4yMzQ1RSs5CitkcWZtYTIwNjEgZm1hICAxMjMuNDUgMWU4ICAgIDBlKzYxNDQgIC0+ICAxLjIzNDVFKzEwCitkcWZtYTIwNjIgZm1hICAxMjMuNDUgMWUrOSAgIDBlKzYxNDQgIC0+ICAxLjIzNDVFKzExCitkcWZtYTIwNjMgZm1hICAxMjMuNDUgMWUxMCAgIDBlKzYxNDQgIC0+ICAxLjIzNDVFKzEyCitkcWZtYTIwNjQgZm1hICAxMjMuNDUgMWUxMSAgIDBlKzYxNDQgIC0+ICAxLjIzNDVFKzEzCitkcWZtYTIwNjUgZm1hICAxMjMuNDUgMWUxMiAgIDBlKzYxNDQgIC0+ICAxLjIzNDVFKzE0CitkcWZtYTIwNjYgZm1hICAxMjMuNDUgMWUxMyAgIDBlKzYxNDQgIC0+ICAxLjIzNDVFKzE1CisKKworLS0gdGVzdCBzb21lIGludGVybWVkaWF0ZSBsZW5ndGhzCistLSAgICAgICAgICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorZHFmbWEyMDgwIGZtYSAgMC4xIDEyMzAxMjM0NTY0NTY3ODkgICAgICAgMGUrNjE0NCAgLT4gMTIzMDEyMzQ1NjQ1Njc4LjkKK2RxZm1hMjA4NCBmbWEgIDAuMSAxMjMwMTIzNDU2NDU2Nzg5ICAgICAgIDBlKzYxNDQgIC0+IDEyMzAxMjM0NTY0NTY3OC45CitkcWZtYTIwOTAgZm1hICAxMjMwMTIzNDU2NDU2Nzg5ICAgICAwLjEgICAwZSs2MTQ0ICAtPiAxMjMwMTIzNDU2NDU2NzguOQorZHFmbWEyMDk0IGZtYSAgMTIzMDEyMzQ1NjQ1Njc4OSAgICAgMC4xICAgMGUrNjE0NCAgLT4gMTIzMDEyMzQ1NjQ1Njc4LjkKKworLS0gdGVzdCBzb21lIG1vcmUgZWRnZSBjYXNlcyBhbmQgY2FycmllcworZHFmbWEyMTAxIGZtYSAgOSA5ICAgICAwZSs2MTQ0ICAtPiA4MQorZHFmbWEyMTAyIGZtYSAgOSA5MCAgICAgMGUrNjE0NCAgLT4gODEwCitkcWZtYTIxMDMgZm1hICA5IDkwMCAgICAgMGUrNjE0NCAgLT4gODEwMAorZHFmbWEyMTA0IGZtYSAgOSA5MDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMAorZHFmbWEyMTA1IGZtYSAgOSA5MDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwCitkcWZtYTIxMDYgZm1hICA5IDkwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMAorZHFmbWEyMTA3IGZtYSAgOSA5MDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMAorZHFmbWEyMTA4IGZtYSAgOSA5MDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwCitkcWZtYTIxMDkgZm1hICA5IDkwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMAorZHFmbWEyMTEwIGZtYSAgOSA5MDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMAorZHFmbWEyMTExIGZtYSAgOSA5MDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwCitkcWZtYTIxMTIgZm1hICA5IDkwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMAorZHFmbWEyMTEzIGZtYSAgOSA5MDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMDAwMAorZHFmbWEyMTE0IGZtYSAgOSA5MDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwCitkcWZtYTIxMTUgZm1hICA5IDkwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMAorLS1kcWZtYTIxMTYgZm1hICA5IDkwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwCistLWRxZm1hMjExNyBmbWEgIDkgOTAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMAorLS1kcWZtYTIxMTggZm1hICA5IDkwMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMAorLS1kcWZtYTIxMTkgZm1hICA5IDkwMDAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwCistLWRxZm1hMjEyMCBmbWEgIDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMAorLS1kcWZtYTIxMjEgZm1hICA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMAorLS1kcWZtYTIxMjIgZm1hICA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwCistLWRxZm1hMjEyMyBmbWEgIDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorLS0gdGVzdCBzb21lIG1vcmUgZWRnZSBjYXNlcyB3aXRob3V0IGNhcnJpZXMKK2RxZm1hMjEzMSBmbWEgIDMgMyAgICAgMGUrNjE0NCAgLT4gOQorZHFmbWEyMTMyIGZtYSAgMyAzMCAgICAgMGUrNjE0NCAgLT4gOTAKK2RxZm1hMjEzMyBmbWEgIDMgMzAwICAgICAwZSs2MTQ0ICAtPiA5MDAKK2RxZm1hMjEzNCBmbWEgIDMgMzAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMAorZHFmbWEyMTM1IGZtYSAgMyAzMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAKK2RxZm1hMjEzNiBmbWEgIDMgMzAwMDAwICAgICAwZSs2MTQ0ICAtPiA5MDAwMDAKK2RxZm1hMjEzNyBmbWEgIDMgMzAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMAorZHFmbWEyMTM4IGZtYSAgMyAzMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAKK2RxZm1hMjEzOSBmbWEgIDMgMzAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA5MDAwMDAwMDAKK2RxZm1hMjE0MCBmbWEgIDMgMzAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMAorZHFmbWEyMTQxIGZtYSAgMyAzMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAKK2RxZm1hMjE0MiBmbWEgIDMgMzAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA5MDAwMDAwMDAwMDAKK2RxZm1hMjE0MyBmbWEgIDMgMzAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAwMAorZHFmbWEyMTQ0IGZtYSAgMyAzMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAwMDAKK2RxZm1hMjE0NSBmbWEgIDMgMzAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA5MDAwMDAwMDAwMDAwMDAKK2RxZm1hMjE0NiBmbWEgIDMgMzAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMTQ3IGZtYSAgMyAzMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjE0OCBmbWEgIDMgMzAwMDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjE0OSBmbWEgIDMgMzAwMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMTUwIGZtYSAgMyAzMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjE1MSBmbWEgIDMgMzAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjE1MiBmbWEgIDMgMzAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMTUzIGZtYSAgMyAzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworZHFmbWEyMjYzIGZtYSAgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgIDBlKzYxNDQgIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MTE5OTI4Mjk2IEluZXhhY3QgUm91bmRlZAorCistLSB0ZXN0IHNvbWUgZWRnZSBjYXNlcyB3aXRoIGV4YWN0IHJvdW5kaW5nCitkcWZtYTIzMDEgZm1hICA5MDAwMDAwMDAwMDAwMDAwMDAgOSAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzAyIGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzAzIGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWZtYTIzMDQgZm1hICA5MDAwMDAwMDAwMDAwMDAwMDAgOTAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzA1IGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzA2IGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWZtYTIzMDcgZm1hICA5MDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzA4IGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzA5IGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWZtYTIzMTAgZm1hICA5MDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzExIGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzEyIGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWZtYTIzMTMgZm1hICA5MDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzE0IGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzE1IGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWZtYTIzMTYgZm1hICA5MDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzE3IGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4LjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgIFJvdW5kZWQKK2RxZm1hMjMxOCBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDguMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNSAgUm91bmRlZAorZHFmbWEyMzE5IGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDguMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNiAgUm91bmRlZAorZHFmbWEyMzIwIGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4LjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzcgIFJvdW5kZWQKK2RxZm1hMjMyMSBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDguMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszOCAgUm91bmRlZAorZHFmbWEyMzIyIGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDguMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszOSAgUm91bmRlZAorZHFmbWEyMzIzIGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4LjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNDAgIFJvdW5kZWQKKworLS0gdHJ5emVyb3MgY2FzZXMKK2RxZm1hMjUwNCAgZm1hICAgMEUtNDI2MCAxMDAwRS00MjYwICAgIDBlKzYxNDQgIC0+IDBFLTYxNzYgQ2xhbXBlZAorZHFmbWEyNTA1ICBmbWEgICAxMDBFKzQyNjAgMEUrNDI2MCAgICAgMGUrNjE0NCAgLT4gMEUrNjExMSBDbGFtcGVkCisKKy0tIG1peGVkIHdpdGggemVyb3MKK2RxZm1hMjU0MSBmbWEgICAwICAgIC0xICAgICAgIDBlKzYxNDQgIC0+ICAwCitkcWZtYTI1NDIgZm1hICAtMCAgICAtMSAgICAgICAwZSs2MTQ0ICAtPiAgMAorZHFmbWEyNTQzIGZtYSAgIDAgICAgIDEgICAgICAgMGUrNjE0NCAgLT4gIDAKK2RxZm1hMjU0NCBmbWEgIC0wICAgICAxICAgICAgIDBlKzYxNDQgIC0+ICAwCitkcWZtYTI1NDUgZm1hICAtMSAgICAgMCAgICAgICAwZSs2MTQ0ICAtPiAgMAorZHFmbWEyNTQ2IGZtYSAgLTEgICAgLTAgICAgICAgMGUrNjE0NCAgLT4gIDAKK2RxZm1hMjU0NyBmbWEgICAxICAgICAwICAgICAgIDBlKzYxNDQgIC0+ICAwCitkcWZtYTI1NDggZm1hICAgMSAgICAtMCAgICAgICAwZSs2MTQ0ICAtPiAgMAorCitkcWZtYTI1NTEgZm1hICAgMC4wICAtMSAgICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NTIgZm1hICAtMC4wICAtMSAgICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NTMgZm1hICAgMC4wICAgMSAgICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NTQgZm1hICAtMC4wICAgMSAgICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NTUgZm1hICAtMS4wICAgMCAgICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NTYgZm1hICAtMS4wICAtMCAgICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NTcgZm1hICAgMS4wICAgMCAgICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NTggZm1hICAgMS4wICAtMCAgICAgICAwZSs2MTQ0ICAtPiAgMC4wCisKK2RxZm1hMjU2MSBmbWEgICAwICAgIC0xLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAKK2RxZm1hMjU2MiBmbWEgIC0wICAgIC0xLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAKK2RxZm1hMjU2MyBmbWEgICAwICAgICAxLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAKK2RxZm1hMjU2NCBmbWEgIC0wICAgICAxLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAKK2RxZm1hMjU2NSBmbWEgIC0xICAgICAwLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAKK2RxZm1hMjU2NiBmbWEgIC0xICAgIC0wLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAKK2RxZm1hMjU2NyBmbWEgICAxICAgICAwLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAKK2RxZm1hMjU2OCBmbWEgICAxICAgIC0wLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAKKworZHFmbWEyNTcxIGZtYSAgIDAuMCAgLTEuMCAgICAgMGUrNjE0NCAgLT4gIDAuMDAKK2RxZm1hMjU3MiBmbWEgIC0wLjAgIC0xLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAwCitkcWZtYTI1NzMgZm1hICAgMC4wICAgMS4wICAgICAwZSs2MTQ0ICAtPiAgMC4wMAorZHFmbWEyNTc0IGZtYSAgLTAuMCAgIDEuMCAgICAgMGUrNjE0NCAgLT4gIDAuMDAKK2RxZm1hMjU3NSBmbWEgIC0xLjAgICAwLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAwCitkcWZtYTI1NzYgZm1hICAtMS4wICAtMC4wICAgICAwZSs2MTQ0ICAtPiAgMC4wMAorZHFmbWEyNTc3IGZtYSAgIDEuMCAgIDAuMCAgICAgMGUrNjE0NCAgLT4gIDAuMDAKK2RxZm1hMjU3OCBmbWEgICAxLjAgIC0wLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAwCitkcWZtYTI1NzkgZm1hICAgMS4wICAgMC4wICAgICAwZSs2MTQ0ICAtPiAgMC4wMAorZHFmbWEyNTMwIGZtYSAgLTEuMCAgLTAuMCAgICAgMGUrNjE0NCAgLT4gIDAuMDAKK2RxZm1hMjUzMSBmbWEgIC0xLjAgICAwLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAwCitkcWZtYTI1MzIgZm1hICAgMS4wICAtMC4wICAgIC0wZSs2MTQ0ICAtPiAtMC4wMAorZHFmbWEyNTMzIGZtYSAgIDEuMCAgIDAuMCAgICAtMGUrNjE0NCAgLT4gIDAuMDAKK2RxZm1hMjUzNCBmbWEgIC0xLjAgIC0wLjAgICAgLTBlKzYxNDQgIC0+ICAwLjAwCitkcWZtYTI1MzUgZm1hICAtMS4wICAgMC4wICAgIC0wZSs2MTQ0ICAtPiAtMC4wMAorCisKKy0tIFNwZWNpYWxzCitkcWZtYTI1ODAgZm1hICAgSW5mICAtSW5mICAgICAwZSs2MTQ0ICAtPiAtSW5maW5pdHkKK2RxZm1hMjU4MSBmbWEgICBJbmYgIC0xMDAwICAgIDBlKzYxNDQgIC0+IC1JbmZpbml0eQorZHFmbWEyNTgyIGZtYSAgIEluZiAgLTEgICAgICAgMGUrNjE0NCAgLT4gLUluZmluaXR5CitkcWZtYTI1ODMgZm1hICAgSW5mICAtMCAgICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNTg0IGZtYSAgIEluZiAgIDAgICAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjU4NSBmbWEgICBJbmYgICAxICAgICAgIDBlKzYxNDQgIC0+ICBJbmZpbml0eQorZHFmbWEyNTg2IGZtYSAgIEluZiAgIDEwMDAgICAgMGUrNjE0NCAgLT4gIEluZmluaXR5CitkcWZtYTI1ODcgZm1hICAgSW5mICAgSW5mICAgICAwZSs2MTQ0ICAtPiAgSW5maW5pdHkKK2RxZm1hMjU4OCBmbWEgIC0xMDAwICBJbmYgICAgIDBlKzYxNDQgIC0+IC1JbmZpbml0eQorZHFmbWEyNTg5IGZtYSAgLUluZiAgIEluZiAgICAgMGUrNjE0NCAgLT4gLUluZmluaXR5CitkcWZtYTI1OTAgZm1hICAtMSAgICAgSW5mICAgICAwZSs2MTQ0ICAtPiAtSW5maW5pdHkKK2RxZm1hMjU5MSBmbWEgIC0wICAgICBJbmYgICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI1OTIgZm1hICAgMCAgICAgSW5mICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNTkzIGZtYSAgIDEgICAgIEluZiAgICAgMGUrNjE0NCAgLT4gIEluZmluaXR5CitkcWZtYTI1OTQgZm1hICAgMTAwMCAgSW5mICAgICAwZSs2MTQ0ICAtPiAgSW5maW5pdHkKK2RxZm1hMjU5NSBmbWEgICBJbmYgICBJbmYgICAgIDBlKzYxNDQgIC0+ICBJbmZpbml0eQorCitkcWZtYTI2MDAgZm1hICAtSW5mICAtSW5mICAgICAwZSs2MTQ0ICAtPiAgSW5maW5pdHkKK2RxZm1hMjYwMSBmbWEgIC1JbmYgIC0xMDAwICAgIDBlKzYxNDQgIC0+ICBJbmZpbml0eQorZHFmbWEyNjAyIGZtYSAgLUluZiAgLTEgICAgICAgMGUrNjE0NCAgLT4gIEluZmluaXR5CitkcWZtYTI2MDMgZm1hICAtSW5mICAtMCAgICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjA0IGZtYSAgLUluZiAgIDAgICAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjYwNSBmbWEgIC1JbmYgICAxICAgICAgIDBlKzYxNDQgIC0+IC1JbmZpbml0eQorZHFmbWEyNjA2IGZtYSAgLUluZiAgIDEwMDAgICAgMGUrNjE0NCAgLT4gLUluZmluaXR5CitkcWZtYTI2MDcgZm1hICAtSW5mICAgSW5mICAgICAwZSs2MTQ0ICAtPiAtSW5maW5pdHkKK2RxZm1hMjYwOCBmbWEgIC0xMDAwICBJbmYgICAgIDBlKzYxNDQgIC0+IC1JbmZpbml0eQorZHFmbWEyNjA5IGZtYSAgLUluZiAgLUluZiAgICAgMGUrNjE0NCAgLT4gIEluZmluaXR5CitkcWZtYTI2MTAgZm1hICAtMSAgICAtSW5mICAgICAwZSs2MTQ0ICAtPiAgSW5maW5pdHkKK2RxZm1hMjYxMSBmbWEgIC0wICAgIC1JbmYgICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2MTIgZm1hICAgMCAgICAtSW5mICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjEzIGZtYSAgIDEgICAgLUluZiAgICAgMGUrNjE0NCAgLT4gLUluZmluaXR5CitkcWZtYTI2MTQgZm1hICAgMTAwMCAtSW5mICAgICAwZSs2MTQ0ICAtPiAtSW5maW5pdHkKK2RxZm1hMjYxNSBmbWEgICBJbmYgIC1JbmYgICAgIDBlKzYxNDQgIC0+IC1JbmZpbml0eQorCitkcWZtYTI2MjEgZm1hICAgTmFOIC1JbmYgICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MjIgZm1hICAgTmFOIC0xMDAwICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MjMgZm1hICAgTmFOIC0xICAgICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MjQgZm1hICAgTmFOIC0wICAgICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MjUgZm1hICAgTmFOICAwICAgICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MjYgZm1hICAgTmFOICAxICAgICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MjcgZm1hICAgTmFOICAxMDAwICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MjggZm1hICAgTmFOICBJbmYgICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MjkgZm1hICAgTmFOICBOYU4gICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MzAgZm1hICAtSW5mICBOYU4gICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MzEgZm1hICAtMTAwMCBOYU4gICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MzIgZm1hICAtMSAgICBOYU4gICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MzMgZm1hICAtMCAgICBOYU4gICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MzQgZm1hICAgMCAgICBOYU4gICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MzUgZm1hICAgMSAgICBOYU4gICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MzYgZm1hICAgMTAwMCBOYU4gICAgICAwZSs2MTQ0ICAtPiAgTmFOCitkcWZtYTI2MzcgZm1hICAgSW5mICBOYU4gICAgICAwZSs2MTQ0ICAtPiAgTmFOCisKK2RxZm1hMjY0MSBmbWEgICBzTmFOIC1JbmYgICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NDIgZm1hICAgc05hTiAtMTAwMCAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjQzIGZtYSAgIHNOYU4gLTEgICAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY0NCBmbWEgICBzTmFOIC0wICAgICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NDUgZm1hICAgc05hTiAgMCAgICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjQ2IGZtYSAgIHNOYU4gIDEgICAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY0NyBmbWEgICBzTmFOICAxMDAwICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NDggZm1hICAgc05hTiAgTmFOICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjQ5IGZtYSAgIHNOYU4gc05hTiAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY1MCBmbWEgICBOYU4gIHNOYU4gICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NTEgZm1hICAtSW5mICBzTmFOICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjUyIGZtYSAgLTEwMDAgc05hTiAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY1MyBmbWEgIC0xICAgIHNOYU4gICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NTQgZm1hICAtMCAgICBzTmFOICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjU1IGZtYSAgIDAgICAgc05hTiAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY1NiBmbWEgICAxICAgIHNOYU4gICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NTcgZm1hICAgMTAwMCBzTmFOICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjU4IGZtYSAgIEluZiAgc05hTiAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY1OSBmbWEgICBOYU4gIHNOYU4gICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxZm1hMjY2MSBmbWEgICBOYU45IC1JbmYgICAgIDBlKzYxNDQgIC0+ICBOYU45CitkcWZtYTI2NjIgZm1hICAgTmFOOCAgOTk5ICAgICAwZSs2MTQ0ICAtPiAgTmFOOAorZHFmbWEyNjYzIGZtYSAgIE5hTjcxIEluZiAgICAgMGUrNjE0NCAgLT4gIE5hTjcxCitkcWZtYTI2NjQgZm1hICAgTmFONiAgTmFONSAgICAwZSs2MTQ0ICAtPiAgTmFONgorZHFmbWEyNjY1IGZtYSAgLUluZiAgIE5hTjQgICAgMGUrNjE0NCAgLT4gIE5hTjQKK2RxZm1hMjY2NiBmbWEgIC05OTkgICBOYU4zMyAgIDBlKzYxNDQgIC0+ICBOYU4zMworZHFmbWEyNjY3IGZtYSAgIEluZiAgIE5hTjIgICAgMGUrNjE0NCAgLT4gIE5hTjIKKworZHFmbWEyNjcxIGZtYSAgIHNOYU45OSAtSW5mICAgICAgMGUrNjE0NCAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NzIgZm1hICAgc05hTjk4IC0xMSAgICAgICAwZSs2MTQ0ICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY3MyBmbWEgICBzTmFOOTcgIE5hTiAgICAgIDBlKzYxNDQgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjc0IGZtYSAgIHNOYU4xNiBzTmFOOTQgICAgMGUrNjE0NCAgLT4gIE5hTjE2IEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NzUgZm1hICAgTmFOOTUgIHNOYU45MyAgICAwZSs2MTQ0ICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY3NiBmbWEgIC1JbmYgICAgc05hTjkyICAgIDBlKzYxNDQgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjc3IGZtYSAgIDA4OCAgICBzTmFOOTEgICAgMGUrNjE0NCAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NzggZm1hICAgSW5mICAgIHNOYU45MCAgICAwZSs2MTQ0ICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY3OSBmbWEgICBOYU4gICAgc05hTjg5ICAgIDBlKzYxNDQgIC0+ICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCitkcWZtYTI2ODEgZm1hICAtTmFOOSAtSW5mICAgICAwZSs2MTQ0ICAtPiAtTmFOOQorZHFmbWEyNjgyIGZtYSAgLU5hTjggIDk5OSAgICAgMGUrNjE0NCAgLT4gLU5hTjgKK2RxZm1hMjY4MyBmbWEgIC1OYU43MSBJbmYgICAgIDBlKzYxNDQgIC0+IC1OYU43MQorZHFmbWEyNjg0IGZtYSAgLU5hTjYgLU5hTjUgICAgMGUrNjE0NCAgLT4gLU5hTjYKK2RxZm1hMjY4NSBmbWEgIC1JbmYgIC1OYU40ICAgIDBlKzYxNDQgIC0+IC1OYU40CitkcWZtYTI2ODYgZm1hICAtOTk5ICAtTmFOMzMgICAwZSs2MTQ0ICAtPiAtTmFOMzMKK2RxZm1hMjY4NyBmbWEgICBJbmYgIC1OYU4yICAgIDBlKzYxNDQgIC0+IC1OYU4yCisKK2RxZm1hMjY5MSBmbWEgIC1zTmFOOTkgLUluZiAgICAgIDBlKzYxNDQgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjkyIGZtYSAgLXNOYU45OCAtMTEgICAgICAgMGUrNjE0NCAgLT4gLU5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2OTMgZm1hICAtc05hTjk3ICBOYU4gICAgICAwZSs2MTQ0ICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY5NCBmbWEgIC1zTmFOMTYgLXNOYU45NCAgIDBlKzYxNDQgIC0+IC1OYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjk1IGZtYSAgLU5hTjk1ICAtc05hTjkzICAgMGUrNjE0NCAgLT4gLU5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2OTYgZm1hICAtSW5mICAgIC1zTmFOOTIgICAwZSs2MTQ0ICAtPiAtTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY5NyBmbWEgICAwODggICAgLXNOYU45MSAgIDBlKzYxNDQgIC0+IC1OYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjk4IGZtYSAgIEluZiAgICAtc05hTjkwICAgMGUrNjE0NCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2OTkgZm1hICAtTmFOICAgIC1zTmFOODkgICAwZSs2MTQ0ICAtPiAtTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworZHFmbWEyNzAxIGZtYSAgLU5hTiAgLUluZiAgICAgMGUrNjE0NCAgLT4gLU5hTgorZHFmbWEyNzAyIGZtYSAgLU5hTiAgIDk5OSAgICAgMGUrNjE0NCAgLT4gLU5hTgorZHFmbWEyNzAzIGZtYSAgLU5hTiAgIEluZiAgICAgMGUrNjE0NCAgLT4gLU5hTgorZHFmbWEyNzA0IGZtYSAgLU5hTiAgLU5hTiAgICAgMGUrNjE0NCAgLT4gLU5hTgorZHFmbWEyNzA1IGZtYSAgLUluZiAgLU5hTjAgICAgMGUrNjE0NCAgLT4gLU5hTgorZHFmbWEyNzA2IGZtYSAgLTk5OSAgLU5hTiAgICAgMGUrNjE0NCAgLT4gLU5hTgorZHFmbWEyNzA3IGZtYSAgIEluZiAgLU5hTiAgICAgMGUrNjE0NCAgLT4gLU5hTgorCitkcWZtYTI3MTEgZm1hICAtc05hTiAgIC1JbmYgICAgICAwZSs2MTQ0ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI3MTIgZm1hICAtc05hTiAgIC0xMSAgICAgICAwZSs2MTQ0ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI3MTMgZm1hICAtc05hTjAwICBOYU4gICAgICAwZSs2MTQ0ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI3MTQgZm1hICAtc05hTiAgIC1zTmFOICAgICAwZSs2MTQ0ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI3MTUgZm1hICAtTmFOICAgIC1zTmFOICAgICAwZSs2MTQ0ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI3MTYgZm1hICAtSW5mICAgIC1zTmFOICAgICAwZSs2MTQ0ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI3MTcgZm1hICAgMDg4ICAgIC1zTmFOICAgICAwZSs2MTQ0ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI3MTggZm1hICAgSW5mICAgIC1zTmFOICAgICAwZSs2MTQ0ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI3MTkgZm1hICAtTmFOICAgIC1zTmFOICAgICAwZSs2MTQ0ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgLi4gbm90ZSBzdWJub3JtYWwgcmVzdWx0cworLS0gc2lnbnMKK2RxZm1hMjc1MSBmbWEgICAxZSs0Mjc3ICAxZSszMzExICAgMGUrNjE0NCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFmbWEyNzUyIGZtYSAgIDFlKzQyNzcgLTFlKzMzMTEgICAwZSs2MTQ0ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI3NTMgZm1hICAtMWUrNDI3NyAgMWUrMzMxMSAgIDBlKzYxNDQgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjc1NCBmbWEgIC0xZSs0Mjc3IC0xZSszMzExICAgMGUrNjE0NCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFmbWEyNzU1IGZtYSAgIDFlLTQyNzcgIDFlLTMzMTEgICAwZSs2MTQ0ICAtPiAgMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWZtYTI3NTYgZm1hICAgMWUtNDI3NyAtMWUtMzMxMSAgIDBlKzYxNDQgIC0+IC0wRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZm1hMjc1NyBmbWEgIC0xZS00Mjc3ICAxZS0zMzExICAgMGUrNjE0NCAgLT4gLTBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFmbWEyNzU4IGZtYSAgLTFlLTQyNzcgLTFlLTMzMTEgICAwZSs2MTQ0ICAtPiAgMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tICdzdWJub3JtYWwnIGJvdW5kYXJ5IChhbGwgaGFyZCB1bmRlcmZsb3cgb3Igb3ZlcmZsb3cgaW4gYmFzZSBhcml0aGVtdGljKQorZHFmbWEyNzYwIGZtYSAgMWUtNjA2OSAxZS0xMDEgICAwZSs2MTQ0ICAtPiAxRS02MTcwIFN1Ym5vcm1hbAorZHFmbWEyNzYxIGZtYSAgMWUtNjA2OSAxZS0xMDIgICAwZSs2MTQ0ICAtPiAxRS02MTcxIFN1Ym5vcm1hbAorZHFmbWEyNzYyIGZtYSAgMWUtNjA2OSAxZS0xMDMgICAwZSs2MTQ0ICAtPiAxRS02MTcyIFN1Ym5vcm1hbAorZHFmbWEyNzYzIGZtYSAgMWUtNjA2OSAxZS0xMDQgICAwZSs2MTQ0ICAtPiAxRS02MTczIFN1Ym5vcm1hbAorZHFmbWEyNzY0IGZtYSAgMWUtNjA2OSAxZS0xMDUgICAwZSs2MTQ0ICAtPiAxRS02MTc0IFN1Ym5vcm1hbAorZHFmbWEyNzY1IGZtYSAgMWUtNjA2OSAxZS0xMDYgICAwZSs2MTQ0ICAtPiAxRS02MTc1IFN1Ym5vcm1hbAorZHFmbWEyNzY2IGZtYSAgMWUtNjA2OSAxZS0xMDcgICAwZSs2MTQ0ICAtPiAxRS02MTc2IFN1Ym5vcm1hbAorZHFmbWEyNzY3IGZtYSAgMWUtNjA2OSAxZS0xMDggICAwZSs2MTQ0ICAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZm1hMjc2OCBmbWEgIDFlLTYwNjkgMWUtMTA5ICAgMGUrNjE0NCAgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWZtYTI3NjkgZm1hICAxZS02MDY5IDFlLTExMCAgIDBlKzYxNDQgIC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorLS0gW25vIGVxdWl2YWxlbnQgb2YgJ3N1Ym5vcm1hbCcgZm9yIG92ZXJmbG93XQorZHFmbWEyNzcwIGZtYSAgMWUrNDAgMWUrNjEwMSAgIDBlKzYxNDQgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQxIENsYW1wZWQKK2RxZm1hMjc3MSBmbWEgIDFlKzQwIDFlKzYxMDIgICAwZSs2MTQ0ICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDIgIENsYW1wZWQKK2RxZm1hMjc3MiBmbWEgIDFlKzQwIDFlKzYxMDMgICAwZSs2MTQ0ICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzICBDbGFtcGVkCitkcWZtYTI3NzMgZm1hICAxZSs0MCAxZSs2MTA0ICAgMGUrNjE0NCAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDQgIENsYW1wZWQKK2RxZm1hMjc3NCBmbWEgIDFlKzQwIDFlKzYxMDUgICAwZSs2MTQ0ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjc3NSBmbWEgIDFlKzQwIDFlKzYxMDYgICAwZSs2MTQ0ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjc3NiBmbWEgIDFlKzQwIDFlKzYxMDcgICAwZSs2MTQ0ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjc3NyBmbWEgIDFlKzQwIDFlKzYxMDggICAwZSs2MTQ0ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjc3OCBmbWEgIDFlKzQwIDFlKzYxMDkgICAwZSs2MTQ0ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjc3OSBmbWEgIDFlKzQwIDFlKzYxMTAgICAwZSs2MTQ0ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworZHFmbWEyODAxIGZtYSAgIDEuMDAwMEUtNjE3MiAgMSAgICAgICAwZSs2MTQ0ICAtPiAxLjAwMDBFLTYxNzIgU3Vibm9ybWFsCitkcWZtYTI4MDIgZm1hICAgMS4wMDBFLTYxNzIgICAxZS0xICAgIDBlKzYxNDQgIC0+IDEuMDAwRS02MTczICBTdWJub3JtYWwKK2RxZm1hMjgwMyBmbWEgICAxLjAwRS02MTcyICAgIDFlLTIgICAgMGUrNjE0NCAgLT4gMS4wMEUtNjE3NCAgIFN1Ym5vcm1hbAorZHFmbWEyODA0IGZtYSAgIDEuMEUtNjE3MiAgICAgMWUtMyAgICAwZSs2MTQ0ICAtPiAxLjBFLTYxNzUgICAgU3Vibm9ybWFsCitkcWZtYTI4MDUgZm1hICAgMS4wRS02MTcyICAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDFFLTYxNzYgICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkcWZtYTI4MDYgZm1hICAgMS4zRS02MTcyICAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDFFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MDcgZm1hICAgMS41RS02MTcyICAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MDggZm1hICAgMS43RS02MTcyICAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MDkgZm1hICAgMi4zRS02MTcyICAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MTAgZm1hICAgMi41RS02MTcyICAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MTEgZm1hICAgMi43RS02MTcyICAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDNFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MTIgZm1hICAgMS40OUUtNjE3MiAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDFFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MTMgZm1hICAgMS41MEUtNjE3MiAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MTQgZm1hICAgMS41MUUtNjE3MiAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MTUgZm1hICAgMi40OUUtNjE3MiAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MTYgZm1hICAgMi41MEUtNjE3MiAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MTcgZm1hICAgMi41MUUtNjE3MiAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDNFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RxZm1hMjgxOCBmbWEgICAxRS02MTcyICAgICAgIDFlLTQgICAgMGUrNjE0NCAgLT4gMUUtNjE3NiAgICAgU3Vibm9ybWFsCitkcWZtYTI4MTkgZm1hICAgM0UtNjE3MiAgICAgICAxZS01ICAgIDBlKzYxNDQgIC0+IDBFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZm1hMjgyMCBmbWEgICA1RS02MTcyICAgICAgIDFlLTUgICAgMGUrNjE0NCAgLT4gMEUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFmbWEyODIxIGZtYSAgIDdFLTYxNzIgICAgICAgMWUtNSAgICAwZSs2MTQ0ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODIyIGZtYSAgIDlFLTYxNzIgICAgICAgMWUtNSAgICAwZSs2MTQ0ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODIzIGZtYSAgIDkuOUUtNjE3MiAgICAgMWUtNSAgICAwZSs2MTQ0ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkcWZtYTI4MjQgZm1hICAgMUUtNjE3MiAgICAgIC0xZS00ICAgIDBlKzYxNDQgIC0+IC0xRS02MTc2ICAgIFN1Ym5vcm1hbAorZHFmbWEyODI1IGZtYSAgIDNFLTYxNzIgICAgICAtMWUtNSAgICAwZSs2MTQ0ICAtPiAtMEUtNjE3NiAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWZtYTI4MjYgZm1hICAtNUUtNjE3MiAgICAgICAxZS01ICAgIDBlKzYxNDQgIC0+IC0wRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZm1hMjgyNyBmbWEgICA3RS02MTcyICAgICAgLTFlLTUgICAgMGUrNjE0NCAgLT4gLTFFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjgyOCBmbWEgIC05RS02MTcyICAgICAgIDFlLTUgICAgMGUrNjE0NCAgLT4gLTFFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjgyOSBmbWEgICA5LjlFLTYxNzIgICAgLTFlLTUgICAgMGUrNjE0NCAgLT4gLTFFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjgzMCBmbWEgICAzLjBFLTYxNzIgICAgLTFlLTUgICAgMGUrNjE0NCAgLT4gLTBFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitkcWZtYTI4MzEgZm1hICAgMS4wRS01OTc3ICAgICAxZS0yMDAgICAwZSs2MTQ0ICAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZm1hMjgzMiBmbWEgICAxLjBFLTU5NzcgICAgIDFlLTE5OSAgIDBlKzYxNDQgIC0+IDFFLTYxNzYgICAgU3Vibm9ybWFsIFJvdW5kZWQKK2RxZm1hMjgzMyBmbWEgICAxLjBFLTU5NzcgICAgIDFlLTE5OCAgIDBlKzYxNDQgIC0+IDEuMEUtNjE3NSAgICBTdWJub3JtYWwKK2RxZm1hMjgzNCBmbWEgICAyLjBFLTU5NzcgICAgIDJlLTE5OCAgIDBlKzYxNDQgIC0+IDQuMEUtNjE3NSAgICBTdWJub3JtYWwKK2RxZm1hMjgzNSBmbWEgICA0LjBFLTU5NzcgICAgIDRlLTE5OCAgIDBlKzYxNDQgIC0+IDEuNjBFLTYxNzQgICBTdWJub3JtYWwKK2RxZm1hMjgzNiBmbWEgIDEwLjBFLTU5NzcgICAgMTBlLTE5OCAgIDBlKzYxNDQgIC0+IDEuMDAwRS02MTczICBTdWJub3JtYWwKK2RxZm1hMjgzNyBmbWEgIDMwLjBFLTU5NzcgICAgMzBlLTE5OCAgIDBlKzYxNDQgIC0+IDkuMDAwRS02MTczICBTdWJub3JtYWwKK2RxZm1hMjgzOCBmbWEgIDQwLjBFLTU5ODIgICAgNDBlLTE2NiAgIDBlKzYxNDQgIC0+IDEuNjAwMEUtNjE0NSBTdWJub3JtYWwKK2RxZm1hMjgzOSBmbWEgIDQwLjBFLTU5ODIgICAgNDBlLTE2NSAgIDBlKzYxNDQgIC0+IDEuNjAwMEUtNjE0NCBTdWJub3JtYWwKK2RxZm1hMjg0MCBmbWEgIDQwLjBFLTU5ODIgICAgNDBlLTE2NCAgIDBlKzYxNDQgIC0+IDEuNjAwMEUtNjE0MworCistLSBMb25nIG9wZXJhbmQgb3ZlcmZsb3cgbWF5IGJlIGEgZGlmZmVyZW50IHBhdGgKK2RxZm1hMjg3MCBmbWEgIDEwMCAgOS45OTlFKzYxNDMgICAgICAgMGUrNjE0NCAgLT4gIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZHFmbWEyODcxIGZtYSAgMTAwIC05Ljk5OUUrNjE0MyAgICAgICAwZSs2MTQ0ICAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitkcWZtYTI4NzIgZm1hICAgICAgIDkuOTk5RSs2MTQzIDEwMCAgIDBlKzYxNDQgIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2RxZm1hMjg3MyBmbWEgICAgICAtOS45OTlFKzYxNDMgMTAwICAgMGUrNjE0NCAgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorCistLSBjaGVjayBmb3IgZG91YmxlLXJvdW5kZWQgc3Vibm9ybWFscworZHFmbWEyODgxIGZtYSAgIDEuMjM0N0UtNjEzMyAxLjIzNDdFLTQwICAgIDBlKzYxNDQgIC0+ICAxLjUyNEUtNjE3MyBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFmbWEyODgyIGZtYSAgIDEuMjM0RS02MTMzIDEuMjM0RS00MCAgICAgIDBlKzYxNDQgIC0+ICAxLjUyM0UtNjE3MyBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFmbWEyODgzIGZtYSAgIDEuMjNFLTYxMzMgIDEuMjNFLTQwICAgICAgIDBlKzYxNDQgIC0+ICAxLjUxM0UtNjE3MyBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFmbWEyODg0IGZtYSAgIDEuMkUtNjEzMyAgIDEuMkUtNDAgICAgICAgIDBlKzYxNDQgIC0+ICAxLjQ0RS02MTczICBTdWJub3JtYWwKK2RxZm1hMjg4NSBmbWEgICAxLjJFLTYxMzMgICAxLjJFLTQxICAgICAgICAwZSs2MTQ0ICAtPiAgMS40NEUtNjE3NCAgU3Vibm9ybWFsCitkcWZtYTI4ODYgZm1hICAgMS4yRS02MTMzICAgMS4yRS00MiAgICAgICAgMGUrNjE0NCAgLT4gIDEuNEUtNjE3NSAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkcWZtYTI4ODcgZm1hICAgMS4yRS02MTMzICAgMS4zRS00MiAgICAgICAgMGUrNjE0NCAgLT4gIDEuNkUtNjE3NSAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkcWZtYTI4ODggZm1hICAgMS4zRS02MTMzICAgMS4zRS00MiAgICAgICAgMGUrNjE0NCAgLT4gIDEuN0UtNjE3NSAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkcWZtYTI4ODkgZm1hICAgMS4zRS02MTMzICAgMS4zRS00MyAgICAgICAgMGUrNjE0NCAgLT4gICAgMkUtNjE3NiAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkcWZtYTI4OTAgZm1hICAgMS4zRS02MTM0ICAgMS4zRS00MyAgICAgICAgMGUrNjE0NCAgLT4gICAgMEUtNjE3NiAgIENsYW1wZWQgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKworZHFmbWEyODkxIGZtYSAgIDEuMjM0NUUtMzkgICAgMS4yMzRFLTYxMzMgICAwZSs2MTQ0ICAtPiAgMS41MjM0RS02MTcyIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkcWZtYTI4OTIgZm1hICAgMS4yMzQ1NkUtMzkgICAxLjIzNEUtNjEzMyAgIDBlKzYxNDQgIC0+ICAxLjUyMzRFLTYxNzIgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxZm1hMjg5MyBmbWEgICAxLjIzNDVFLTQwICAgMS4yMzRFLTYxMzMgICAwZSs2MTQ0ICAtPiAgMS41MjNFLTYxNzMgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkcWZtYTI4OTQgZm1hICAgMS4yMzQ1NkUtNDAgIDEuMjM0RS02MTMzICAgMGUrNjE0NCAgLT4gIDEuNTIzRS02MTczICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFmbWEyODk1IGZtYSAgIDEuMjM0NUUtNDEgICAxLjIzNEUtNjEzMyAgIDBlKzYxNDQgIC0+ICAxLjUyRS02MTc0ICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxZm1hMjg5NiBmbWEgICAxLjIzNDU2RS00MSAgMS4yMzRFLTYxMzMgICAwZSs2MTQ0ICAtPiAgMS41MkUtNjE3NCAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIE5vdyBleHBsb3JlIHRoZSBjYXNlIHdoZXJlIHdlIGdldCBhIG5vcm1hbCByZXN1bHQgd2l0aCBVbmRlcmZsb3cKKy0tIHByb3ZlIG9wZXJhbmRzIGFyZSBleGFjdAorZHFmbWEyOTA2IGZtYSAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQzICAxICAgICAgICAgICAgICAgICAgICAgICAgIDBlKzYxNDQgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQzCitkcWZtYTI5MDcgZm1hICAgICAgICAgICAgICAgICAgICAgICAgMSAgMC4wOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgICAwZSs2MTQ0ICAtPiAwLjA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CistLSB0aGUgbmV4dCByb3VuZHMgdG8gTm1pbgorZHFmbWEyOTA4IGZtYSAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQzICAwLjA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgIDBlKzYxNDQgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCisKKy0tIGh1Z2VzdAorZHFmbWEyOTA5IGZtYSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgMGUrNjE0NCAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzY3IEluZXhhY3QgUm91bmRlZAorCistLSBFeGFtcGxlcyBmcm9tIFNRTCBwcm9wb3NhbCAoS3Jpc2huYSBLdWxrYXJuaSkKK3ByZWNpc2lvbjogICAzNAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK2RxZm1hMjEwMDEgIGZtYSAgMTMwRS0yICAxMjBFLTIgICAwZSs2MTQ0ICAtPiAxLjU2MDAKK2RxZm1hMjEwMDIgIGZtYSAgMTMwRS0yICAxMkUtMSAgICAwZSs2MTQ0ICAtPiAxLjU2MAorZHFmbWEyMTAwMyAgZm1hICAxMzBFLTIgIDFFMCAgICAgIDBlKzYxNDQgIC0+IDEuMzAKK2RxZm1hMjEwMDQgIGZtYSAgMUUyICAgICAxRTQgICAgICAwZSs2MTQ0ICAtPiAxRSs2CisKKy0tIE51bGwgdGVzdHMKK2RxZm1hMjk5MCBmbWEgIDEwICAjICAgMGUrNjE0NCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI5OTEgZm1hICAgIyAxMCAgIDBlKzYxNDQgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCisKKy0tIEFERElUSU9OIFRFU1RTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBbZmlyc3QgZ3JvdXAgYXJlICdxdWljayBjb25maWRlbmNlIGNoZWNrJ10KK2RxYWRkMzAwMSBmbWEgIDEgIDEgICAgICAgMSAgICAgICAtPiAgMgorZHFhZGQzMDAyIGZtYSAgMSAgMiAgICAgICAzICAgICAgIC0+ICA1CitkcWFkZDMwMDMgZm1hICAxICAnNS43NScgICczLjMnICAgLT4gIDkuMDUKK2RxYWRkMzAwNCBmbWEgIDEgICc1JyAgICAgJy0zJyAgICAtPiAgMgorZHFhZGQzMDA1IGZtYSAgMSAgJy01JyAgICAnLTMnICAgIC0+ICAtOAorZHFhZGQzMDA2IGZtYSAgMSAgJy03JyAgICAnMi41JyAgIC0+ICAtNC41CitkcWFkZDMwMDcgZm1hICAxICAnMC43JyAgICcwLjMnICAgLT4gIDEuMAorZHFhZGQzMDA4IGZtYSAgMSAgJzEuMjUnICAnMS4yNScgIC0+ICAyLjUwCitkcWFkZDMwMDkgZm1hICAxICAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDAwJyAtPiAnMi4yMzQ1Njc4OScKK2RxYWRkMzAxMCBmbWEgIDEgICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMTEnIC0+ICcyLjIzNDU2ODAwJworCistLSAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorZHFhZGQzMDExIGZtYSAgMSAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NicgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMwMTIgZm1hICAxICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ1JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCitkcWFkZDMwMTMgZm1hICAxICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkMzAxNCBmbWEgIDEgICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjQ5JyAgIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzAxNSBmbWEgIDEgICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjQ5OScgIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzAxNiBmbWEgIDEgICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjQ5OTknIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzAxNyBmbWEgIDEgICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjUwMDAnIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzAxOCBmbWEgIDEgICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjUwMDEnIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzAxOSBmbWEgIDEgICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjUwMScgIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzAyMCBmbWEgIDEgICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjUxJyAgIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQzMDIxIGZtYSAgMSAgMCAxIC0+IDEKK2RxYWRkMzAyMiBmbWEgIDEgIDEgMSAtPiAyCitkcWFkZDMwMjMgZm1hICAxICAyIDEgLT4gMworZHFhZGQzMDI0IGZtYSAgMSAgMyAxIC0+IDQKK2RxYWRkMzAyNSBmbWEgIDEgIDQgMSAtPiA1CitkcWFkZDMwMjYgZm1hICAxICA1IDEgLT4gNgorZHFhZGQzMDI3IGZtYSAgMSAgNiAxIC0+IDcKK2RxYWRkMzAyOCBmbWEgIDEgIDcgMSAtPiA4CitkcWFkZDMwMjkgZm1hICAxICA4IDEgLT4gOQorZHFhZGQzMDMwIGZtYSAgMSAgOSAxIC0+IDEwCisKKy0tIHNvbWUgY2FycnlpbmcgZWZmZWN0cworZHFhZGQzMDMxIGZtYSAgMSAgJzAuOTk5OCcgICcwLjAwMDAnIC0+ICcwLjk5OTgnCitkcWFkZDMwMzIgZm1hICAxICAnMC45OTk4JyAgJzAuMDAwMScgLT4gJzAuOTk5OScKK2RxYWRkMzAzMyBmbWEgIDEgICcwLjk5OTgnICAnMC4wMDAyJyAtPiAnMS4wMDAwJworZHFhZGQzMDM0IGZtYSAgMSAgJzAuOTk5OCcgICcwLjAwMDMnIC0+ICcxLjAwMDEnCisKK2RxYWRkMzAzNSBmbWEgIDEgICc3MCcgICcxMDAwMGUrMzQnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMDM2IGZtYSAgMSAgJzcwMCcgICcxMDAwMGUrMzQnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMDM3IGZtYSAgMSAgJzcwMDAnICAnMTAwMDBlKzM0JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzAzOCBmbWEgIDEgICc3MDAwMCcgICcxMDAwMGUrMzQnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMDM5IGZtYSAgMSAgJzcwMDAwMCcgICcxMDAwMGUrMzQnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwN0UrMzgnIFJvdW5kZWQKKworLS0gc3ltbWV0cnk6CitkcWFkZDMwNDAgZm1hICAxICAnMTAwMDBlKzM0JyAgJzcwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzA0MSBmbWEgIDEgICcxMDAwMGUrMzQnICAnNzAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzA0MiBmbWEgIDEgICcxMDAwMGUrMzQnICAnNzAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszOCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMwNDQgZm1hICAxICAnMTAwMDBlKzM0JyAgJzcwMDAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzA0NSBmbWEgIDEgICcxMDAwMGUrMzQnICAnNzAwMDAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDdFKzM4JyBSb3VuZGVkCisKKy0tIHNhbWUsIHdpdGhvdXQgcm91bmRpbmcKK2RxYWRkMzA0NiBmbWEgIDEgICcxMDAwMGUrOScgICc3JyAtPiAnMTAwMDAwMDAwMDAwMDcnCitkcWFkZDMwNDcgZm1hICAxICAnMTAwMDBlKzknICAnNzAnIC0+ICcxMDAwMDAwMDAwMDA3MCcKK2RxYWRkMzA0OCBmbWEgIDEgICcxMDAwMGUrOScgICc3MDAnIC0+ICcxMDAwMDAwMDAwMDcwMCcKK2RxYWRkMzA0OSBmbWEgIDEgICcxMDAwMGUrOScgICc3MDAwJyAtPiAnMTAwMDAwMDAwMDcwMDAnCitkcWFkZDMwNTAgZm1hICAxICAnMTAwMDBlKzknICAnNzAwMDAnIC0+ICcxMDAwMDAwMDA3MDAwMCcKK2RxYWRkMzA1MSBmbWEgIDEgICcxMDAwMGUrOScgICc3MDAwMDAnIC0+ICcxMDAwMDAwMDcwMDAwMCcKK2RxYWRkMzA1MiBmbWEgIDEgICcxMDAwMGUrOScgICc3MDAwMDAwJyAtPiAnMTAwMDAwMDcwMDAwMDAnCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjYXJpdGgKK2RxYWRkMzA1MyBmbWEgIDEgICcxMicgJzcuMDAnIC0+ICcxOS4wMCcKK2RxYWRkMzA1NCBmbWEgIDEgICcxLjMnICctMS4wNycgLT4gJzAuMjMnCitkcWFkZDMwNTUgZm1hICAxICAnMS4zJyAnLTEuMzAnIC0+ICcwLjAwJworZHFhZGQzMDU2IGZtYSAgMSAgJzEuMycgJy0yLjA3JyAtPiAnLTAuNzcnCitkcWFkZDMwNTcgZm1hICAxICAnMUUrMicgJzFFKzQnIC0+ICcxLjAxRSs0JworCistLSBsZWFkaW5nIHplcm8gcHJlc2VydmF0aW9uCitkcWFkZDMwNjEgZm1hICAxICAxICcwLjAwMDEnIC0+ICcxLjAwMDEnCitkcWFkZDMwNjIgZm1hICAxICAxICcwLjAwMDAxJyAtPiAnMS4wMDAwMScKK2RxYWRkMzA2MyBmbWEgIDEgIDEgJzAuMDAwMDAxJyAtPiAnMS4wMDAwMDEnCitkcWFkZDMwNjQgZm1hICAxICAxICcwLjAwMDAwMDEnIC0+ICcxLjAwMDAwMDEnCitkcWFkZDMwNjUgZm1hICAxICAxICcwLjAwMDAwMDAxJyAtPiAnMS4wMDAwMDAwMScKKworLS0gc29tZSBmdW5ueSB6ZXJvcyBbaW4gY2FzZSBvZiBiYWQgc2lnbnVtXQorZHFhZGQzMDcwIGZtYSAgMSAgMSAgMCAgICAtPiAxCitkcWFkZDMwNzEgZm1hICAxICAxIDAuICAgIC0+IDEKK2RxYWRkMzA3MiBmbWEgIDEgIDEgIC4wICAgLT4gMS4wCitkcWFkZDMwNzMgZm1hICAxICAxIDAuMCAgIC0+IDEuMAorZHFhZGQzMDc0IGZtYSAgMSAgMSAwLjAwICAtPiAxLjAwCitkcWFkZDMwNzUgZm1hICAxICAgMCAgMSAgIC0+IDEKK2RxYWRkMzA3NiBmbWEgIDEgIDAuICAxICAgLT4gMQorZHFhZGQzMDc3IGZtYSAgMSAgIC4wIDEgICAtPiAxLjAKK2RxYWRkMzA3OCBmbWEgIDEgIDAuMCAxICAgLT4gMS4wCitkcWFkZDMwNzkgZm1hICAxICAwLjAwIDEgIC0+IDEuMDAKKworLS0gc29tZSBjYXJyaWVzCitkcWFkZDMwODAgZm1hICAxICA5OTk5OTk5OTggMSAgLT4gOTk5OTk5OTk5CitkcWFkZDMwODEgZm1hICAxICA5OTk5OTk5OTkgMSAgLT4gMTAwMDAwMDAwMAorZHFhZGQzMDgyIGZtYSAgMSAgIDk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMAorZHFhZGQzMDgzIGZtYSAgMSAgICA5OTk5OTk5IDEgIC0+IDEwMDAwMDAwCitkcWFkZDMwODQgZm1hICAxICAgICA5OTk5OTkgMSAgLT4gMTAwMDAwMAorZHFhZGQzMDg1IGZtYSAgMSAgICAgIDk5OTk5IDEgIC0+IDEwMDAwMAorZHFhZGQzMDg2IGZtYSAgMSAgICAgICA5OTk5IDEgIC0+IDEwMDAwCitkcWFkZDMwODcgZm1hICAxICAgICAgICA5OTkgMSAgLT4gMTAwMAorZHFhZGQzMDg4IGZtYSAgMSAgICAgICAgIDk5IDEgIC0+IDEwMAorZHFhZGQzMDg5IGZtYSAgMSAgICAgICAgICA5IDEgIC0+IDEwCisKKworLS0gbW9yZSBMSFMgc3dhcHMKK2RxYWRkMzA5MCBmbWEgIDEgICctNTYyNjdFLTEwJyAgIDAgLT4gICctMC4wMDAwMDU2MjY3JworZHFhZGQzMDkxIGZtYSAgMSAgJy01NjI2N0UtNicgICAgMCAtPiAgJy0wLjA1NjI2NycKK2RxYWRkMzA5MiBmbWEgIDEgICctNTYyNjdFLTUnICAgIDAgLT4gICctMC41NjI2NycKK2RxYWRkMzA5MyBmbWEgIDEgICctNTYyNjdFLTQnICAgIDAgLT4gICctNS42MjY3JworZHFhZGQzMDk0IGZtYSAgMSAgJy01NjI2N0UtMycgICAgMCAtPiAgJy01Ni4yNjcnCitkcWFkZDMwOTUgZm1hICAxICAnLTU2MjY3RS0yJyAgICAwIC0+ICAnLTU2Mi42NycKK2RxYWRkMzA5NiBmbWEgIDEgICctNTYyNjdFLTEnICAgIDAgLT4gICctNTYyNi43JworZHFhZGQzMDk3IGZtYSAgMSAgJy01NjI2N0UtMCcgICAgMCAtPiAgJy01NjI2NycKK2RxYWRkMzA5OCBmbWEgIDEgICctNUUtMTAnICAgICAgIDAgLT4gICctNUUtMTAnCitkcWFkZDMwOTkgZm1hICAxICAnLTVFLTcnICAgICAgICAwIC0+ICAnLTVFLTcnCitkcWFkZDMxMDAgZm1hICAxICAnLTVFLTYnICAgICAgICAwIC0+ICAnLTAuMDAwMDA1JworZHFhZGQzMTAxIGZtYSAgMSAgJy01RS01JyAgICAgICAgMCAtPiAgJy0wLjAwMDA1JworZHFhZGQzMTAyIGZtYSAgMSAgJy01RS00JyAgICAgICAgMCAtPiAgJy0wLjAwMDUnCitkcWFkZDMxMDMgZm1hICAxICAnLTVFLTEnICAgICAgICAwIC0+ICAnLTAuNScKK2RxYWRkMzEwNCBmbWEgIDEgICctNUUwJyAgICAgICAgIDAgLT4gICctNScKK2RxYWRkMzEwNSBmbWEgIDEgICctNUUxJyAgICAgICAgIDAgLT4gICctNTAnCitkcWFkZDMxMDYgZm1hICAxICAnLTVFNScgICAgICAgICAwIC0+ICAnLTUwMDAwMCcKK2RxYWRkMzEwNyBmbWEgIDEgICctNUUzMycgICAgICAgIDAgLT4gICctNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcKK2RxYWRkMzEwOCBmbWEgIDEgICctNUUzNCcgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0JyAgUm91bmRlZAorZHFhZGQzMTA5IGZtYSAgMSAgJy01RTM1JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzUnICBSb3VuZGVkCitkcWFkZDMxMTAgZm1hICAxICAnLTVFMzYnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNicgIFJvdW5kZWQKK2RxYWRkMzExMSBmbWEgIDEgICctNUUxMDAnICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzEwMCcgUm91bmRlZAorCistLSBtb3JlIFJIUyBzd2FwcworZHFhZGQzMTEzIGZtYSAgMSAgMCAgJy01NjI2N0UtMTAnIC0+ICAnLTAuMDAwMDA1NjI2NycKK2RxYWRkMzExNCBmbWEgIDEgIDAgICctNTYyNjdFLTYnICAtPiAgJy0wLjA1NjI2NycKK2RxYWRkMzExNiBmbWEgIDEgIDAgICctNTYyNjdFLTUnICAtPiAgJy0wLjU2MjY3JworZHFhZGQzMTE3IGZtYSAgMSAgMCAgJy01NjI2N0UtNCcgIC0+ICAnLTUuNjI2NycKK2RxYWRkMzExOSBmbWEgIDEgIDAgICctNTYyNjdFLTMnICAtPiAgJy01Ni4yNjcnCitkcWFkZDMxMjAgZm1hICAxICAwICAnLTU2MjY3RS0yJyAgLT4gICctNTYyLjY3JworZHFhZGQzMTIxIGZtYSAgMSAgMCAgJy01NjI2N0UtMScgIC0+ICAnLTU2MjYuNycKK2RxYWRkMzEyMiBmbWEgIDEgIDAgICctNTYyNjdFLTAnICAtPiAgJy01NjI2NycKK2RxYWRkMzEyMyBmbWEgIDEgIDAgICctNUUtMTAnICAgICAtPiAgJy01RS0xMCcKK2RxYWRkMzEyNCBmbWEgIDEgIDAgICctNUUtNycgICAgICAtPiAgJy01RS03JworZHFhZGQzMTI1IGZtYSAgMSAgMCAgJy01RS02JyAgICAgIC0+ICAnLTAuMDAwMDA1JworZHFhZGQzMTI2IGZtYSAgMSAgMCAgJy01RS01JyAgICAgIC0+ICAnLTAuMDAwMDUnCitkcWFkZDMxMjcgZm1hICAxICAwICAnLTVFLTQnICAgICAgLT4gICctMC4wMDA1JworZHFhZGQzMTI4IGZtYSAgMSAgMCAgJy01RS0xJyAgICAgIC0+ICAnLTAuNScKK2RxYWRkMzEyOSBmbWEgIDEgIDAgICctNUUwJyAgICAgICAtPiAgJy01JworZHFhZGQzMTMwIGZtYSAgMSAgMCAgJy01RTEnICAgICAgIC0+ICAnLTUwJworZHFhZGQzMTMxIGZtYSAgMSAgMCAgJy01RTUnICAgICAgIC0+ICAnLTUwMDAwMCcKK2RxYWRkMzEzMiBmbWEgIDEgIDAgICctNUUzMycgICAgICAtPiAgJy01MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFhZGQzMTMzIGZtYSAgMSAgMCAgJy01RTM0JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCcgICBSb3VuZGVkCitkcWFkZDMxMzQgZm1hICAxICAwICAnLTVFMzUnICAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM1JyAgIFJvdW5kZWQKK2RxYWRkMzEzNSBmbWEgIDEgIDAgICctNUUzNicgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzYnICAgUm91bmRlZAorZHFhZGQzMTM2IGZtYSAgMSAgMCAgJy01RTEwMCcgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSsxMDAnICBSb3VuZGVkCisKKy0tIHJlbGF0ZWQKK2RxYWRkMzEzNyBmbWEgIDEgICAxICAnMEUtMzknICAgICAgLT4gICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgIFJvdW5kZWQKK2RxYWRkMzEzOCBmbWEgIDEgIC0xICAnMEUtMzknICAgICAgLT4gICctMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2RxYWRkMzEzOSBmbWEgIDEgICcwRS0zOScgMSAgICAgICAgLT4gICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgIFJvdW5kZWQKK2RxYWRkMzE0MCBmbWEgIDEgICcwRS0zOScgLTEgICAgICAgLT4gICctMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2RxYWRkMzE0MSBmbWEgIDEgIDFFKzI5ICAgMC4wMDAwICAgLT4gICcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMDAwMCcKK2RxYWRkMzE0MiBmbWEgIDEgIDFFKzI5ICAgMC4wMDAwMCAgLT4gICcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMDAwMCcgIFJvdW5kZWQKK2RxYWRkMzE0MyBmbWEgIDEgIDAuMDAwICAgMUUrMzAgICAgLT4gICcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjAwMCcKK2RxYWRkMzE0NCBmbWEgIDEgIDAuMDAwMCAgMUUrMzAgICAgLT4gICcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjAwMCcgIFJvdW5kZWQKKworLS0gW3NvbWUgb2YgdGhlIG5leHQgZ3JvdXAgYXJlIHJlYWxseSBjb25zdHJ1Y3RvciB0ZXN0c10KK2RxYWRkMzE0NiBmbWEgIDEgICcwMC4wJyAgMCAgICAgICAtPiAgJzAuMCcKK2RxYWRkMzE0NyBmbWEgIDEgICcwLjAwJyAgMCAgICAgICAtPiAgJzAuMDAnCitkcWFkZDMxNDggZm1hICAxICAgMCAgICAgICcwLjAwJyAgLT4gICcwLjAwJworZHFhZGQzMTQ5IGZtYSAgMSAgIDAgICAgICAnMDAuMCcgIC0+ICAnMC4wJworZHFhZGQzMTUwIGZtYSAgMSAgJzAwLjAnICAnMC4wMCcgIC0+ICAnMC4wMCcKK2RxYWRkMzE1MSBmbWEgIDEgICcwLjAwJyAgJzAwLjAnICAtPiAgJzAuMDAnCitkcWFkZDMxNTIgZm1hICAxICAnMycgICAgICcuMycgICAgLT4gICczLjMnCitkcWFkZDMxNTMgZm1hICAxICAnMy4nICAgICcuMycgICAgLT4gICczLjMnCitkcWFkZDMxNTQgZm1hICAxICAnMy4wJyAgICcuMycgICAgLT4gICczLjMnCitkcWFkZDMxNTUgZm1hICAxICAnMy4wMCcgICcuMycgICAgLT4gICczLjMwJworZHFhZGQzMTU2IGZtYSAgMSAgJzMnICAgICAnMycgICAgIC0+ICAnNicKK2RxYWRkMzE1NyBmbWEgIDEgICczJyAgICAgJyszJyAgICAtPiAgJzYnCitkcWFkZDMxNTggZm1hICAxICAnMycgICAgICctMycgICAgLT4gICcwJworZHFhZGQzMTU5IGZtYSAgMSAgJzAuMycgICAnLTAuMycgIC0+ICAnMC4wJworZHFhZGQzMTYwIGZtYSAgMSAgJzAuMDMnICAnLTAuMDMnIC0+ICAnMC4wMCcKKworLS0gdHJ5IGJvcmRlcmxpbmUgcHJlY2lzaW9uLCB3aXRoIGNhcnJpZXMsIGV0Yy4KK2RxYWRkMzE2MSBmbWEgIDEgICcxRSsxMicgJy0xJyAgICAtPiAnOTk5OTk5OTk5OTk5JworZHFhZGQzMTYyIGZtYSAgMSAgJzFFKzEyJyAgJzEuMTEnIC0+ICcxMDAwMDAwMDAwMDAxLjExJworZHFhZGQzMTYzIGZtYSAgMSAgJzEuMTEnICAnMUUrMTInIC0+ICcxMDAwMDAwMDAwMDAxLjExJworZHFhZGQzMTY0IGZtYSAgMSAgJy0xJyAgICAnMUUrMTInIC0+ICc5OTk5OTk5OTk5OTknCitkcWFkZDMxNjUgZm1hICAxICAnN0UrMTInICctMScgICAgLT4gJzY5OTk5OTk5OTk5OTknCitkcWFkZDMxNjYgZm1hICAxICAnN0UrMTInICAnMS4xMScgLT4gJzcwMDAwMDAwMDAwMDEuMTEnCitkcWFkZDMxNjcgZm1hICAxICAnMS4xMScgICc3RSsxMicgLT4gJzcwMDAwMDAwMDAwMDEuMTEnCitkcWFkZDMxNjggZm1hICAxICAnLTEnICAgICc3RSsxMicgLT4gJzY5OTk5OTk5OTk5OTknCisKK3JvdW5kaW5nOiBoYWxmX3VwCitkcWFkZDMxNzAgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTY3JyAtPiAnNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMTcxIGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU2NicgLT4gJzUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzE3MiBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NjUnIC0+ICc1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMxNzMgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTY0JyAtPiAnNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMTc0IGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1MycgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzE3NSBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTInIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMxNzYgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUxJyAtPiAnNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMTc3IGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1MCcgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JyBSb3VuZGVkCitkcWFkZDMxNzggZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTQ1JyAtPiAnNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMTc5IGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0NCcgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzE4MCBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NDMnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMxODEgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTQyJyAtPiAnNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMTgyIGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0MScgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzE4MyBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NDAnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCcgUm91bmRlZAorCistLSBhbmQgc29tZSBtb3JlLCBpbmNsdWRpbmcgcmVzaWR1ZSBlZmZlY3RzIGFuZCBkaWZmZXJlbnQgcm91bmRpbmdzCityb3VuZGluZzogaGFsZl91cAorZHFhZGQzMjAwIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknCitkcWFkZDMyMDEgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMDIgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMDMgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMDQgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMDUgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMDYgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMDcgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMDggZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMDkgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMTAgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMTEgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMTIgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMTMgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMTQgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMTUgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMTYgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcKK2RxYWRkMzIxNyBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjAwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzIxOCBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzIxOSBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZHFhZGQzMjIwIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknCitkcWFkZDMyMjEgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMjIgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMjMgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMjQgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMjUgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMjYgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMjcgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMjggZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMjkgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMzAgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMzEgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMzIgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMzMgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMzQgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMzUgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMzYgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcKK2RxYWRkMzIzNyBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzIzOCBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzIzOSBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitkcWFkZDMyNDAgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OCcgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNDEgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OCcgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNDIgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OCcgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkcWFkZDMyNTAgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScKK2RxYWRkMzI1MSBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI1MiBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI1MyBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI1NCBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI1NSBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI1NiBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI1NyBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI1OCBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI1OSBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI2MCBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI2MSBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI2MiBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI2MyBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI2NCBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI2NSBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI2NiBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJworZHFhZGQzMjY3IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjY4IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjY5IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCistLSAxIGluIGxhc3QgcGxhY2UgdGVzdHMKK3JvdW5kaW5nOiBoYWxmX3VwCitkcWFkZDMzMDEgZm1hICAxICAgLTEgICAxICAgICAgLT4gICAwCitkcWFkZDMzMDIgZm1hICAxICAgIDAgICAxICAgICAgLT4gICAxCitkcWFkZDMzMDMgZm1hICAxICAgIDEgICAxICAgICAgLT4gICAyCitkcWFkZDMzMDQgZm1hICAxICAgMTIgICAxICAgICAgLT4gIDEzCitkcWFkZDMzMDUgZm1hICAxICAgOTggICAxICAgICAgLT4gIDk5CitkcWFkZDMzMDYgZm1hICAxICAgOTkgICAxICAgICAgLT4gMTAwCitkcWFkZDMzMDcgZm1hICAxICAxMDAgICAxICAgICAgLT4gMTAxCitkcWFkZDMzMDggZm1hICAxICAxMDEgICAxICAgICAgLT4gMTAyCitkcWFkZDMzMDkgZm1hICAxICAgLTEgIC0xICAgICAgLT4gIC0yCitkcWFkZDMzMTAgZm1hICAxICAgIDAgIC0xICAgICAgLT4gIC0xCitkcWFkZDMzMTEgZm1hICAxICAgIDEgIC0xICAgICAgLT4gICAwCitkcWFkZDMzMTIgZm1hICAxICAgMTIgIC0xICAgICAgLT4gIDExCitkcWFkZDMzMTMgZm1hICAxICAgOTggIC0xICAgICAgLT4gIDk3CitkcWFkZDMzMTQgZm1hICAxICAgOTkgIC0xICAgICAgLT4gIDk4CitkcWFkZDMzMTUgZm1hICAxICAxMDAgIC0xICAgICAgLT4gIDk5CitkcWFkZDMzMTYgZm1hICAxICAxMDEgIC0xICAgICAgLT4gMTAwCisKK2RxYWRkMzMyMSBmbWEgIDEgIC0wLjAxICAwLjAxICAgIC0+ICAwLjAwCitkcWFkZDMzMjIgZm1hICAxICAgMC4wMCAgMC4wMSAgICAtPiAgMC4wMQorZHFhZGQzMzIzIGZtYSAgMSAgIDAuMDEgIDAuMDEgICAgLT4gIDAuMDIKK2RxYWRkMzMyNCBmbWEgIDEgICAwLjEyICAwLjAxICAgIC0+ICAwLjEzCitkcWFkZDMzMjUgZm1hICAxICAgMC45OCAgMC4wMSAgICAtPiAgMC45OQorZHFhZGQzMzI2IGZtYSAgMSAgIDAuOTkgIDAuMDEgICAgLT4gIDEuMDAKK2RxYWRkMzMyNyBmbWEgIDEgICAxLjAwICAwLjAxICAgIC0+ICAxLjAxCitkcWFkZDMzMjggZm1hICAxICAgMS4wMSAgMC4wMSAgICAtPiAgMS4wMgorZHFhZGQzMzI5IGZtYSAgMSAgLTAuMDEgLTAuMDEgICAgLT4gLTAuMDIKK2RxYWRkMzMzMCBmbWEgIDEgICAwLjAwIC0wLjAxICAgIC0+IC0wLjAxCitkcWFkZDMzMzEgZm1hICAxICAgMC4wMSAtMC4wMSAgICAtPiAgMC4wMAorZHFhZGQzMzMyIGZtYSAgMSAgIDAuMTIgLTAuMDEgICAgLT4gIDAuMTEKK2RxYWRkMzMzMyBmbWEgIDEgICAwLjk4IC0wLjAxICAgIC0+ICAwLjk3CitkcWFkZDMzMzQgZm1hICAxICAgMC45OSAtMC4wMSAgICAtPiAgMC45OAorZHFhZGQzMzM1IGZtYSAgMSAgIDEuMDAgLTAuMDEgICAgLT4gIDAuOTkKK2RxYWRkMzMzNiBmbWEgIDEgICAxLjAxIC0wLjAxICAgIC0+ICAxLjAwCisKKy0tIHNvbWUgbW9yZSBjYXNlcyB3aGVyZSBhZGRpbmcgMCBhZmZlY3RzIHRoZSBjb2VmZmljaWVudAorZHFhZGQzMzQwIGZtYSAgMSAgMUUrMyAgICAwICAgIC0+ICAgICAgICAgMTAwMAorZHFhZGQzMzQxIGZtYSAgMSAgMUUrMzMgICAwICAgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxYWRkMzM0MiBmbWEgIDEgIDFFKzM0ICAgMCAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCAgUm91bmRlZAorZHFhZGQzMzQzIGZtYSAgMSAgMUUrMzUgICAwICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM1ICBSb3VuZGVkCistLSB3aGljaCBzaW1wbHkgZm9sbG93IGZyb20gdGhlc2UgY2FzZXMgLi4uCitkcWFkZDMzNDQgZm1hICAxICAxRSszICAgIDEgICAgLT4gICAgICAgICAxMDAxCitkcWFkZDMzNDUgZm1hICAxICAxRSszMyAgIDEgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFhZGQzMzQ2IGZtYSAgMSAgMUUrMzQgICAxICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzM0NyBmbWEgIDEgIDFFKzM1ICAgMSAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNSAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMzNDggZm1hICAxICAxRSszICAgIDcgICAgLT4gICAgICAgICAxMDA3CitkcWFkZDMzNDkgZm1hICAxICAxRSszMyAgIDcgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNworZHFhZGQzMzUwIGZtYSAgMSAgMUUrMzQgICA3ICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFKzM0ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzM1MSBmbWEgIDEgIDFFKzM1ICAgNyAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNSAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRyeXplcm9zIGNhc2VzCityb3VuZGluZzogICAgaGFsZl91cAorZHFhZGQzMzYwICBmbWEgIDEgIDBFKzUwIDEwMDAwRSsxICAtPiAxLjAwMDBFKzUKK2RxYWRkMzM2MSAgZm1hICAxICAwRS01MCAxMDAwMEUrMSAgLT4gMTAwMDAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgUm91bmRlZAorZHFhZGQzMzYyICBmbWEgIDEgIDEwMDAwRSsxIDBFLTUwICAtPiAxMDAwMDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBSb3VuZGVkCitkcWFkZDMzNjMgIGZtYSAgMSAgMTAwMDBFKzEgMTAwMDBFLTUwICAtPiAxMDAwMDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBSb3VuZGVkIEluZXhhY3QKK2RxYWRkMzM2NCAgZm1hICAxICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLT4gMEUrNjExMQorLS0gICAgICAgICAgICAxIDIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorCistLSBhIGN1cmlvc2l0eSBmcm9tIEpTUiAxMyB0ZXN0aW5nCityb3VuZGluZzogICAgaGFsZl9kb3duCitkcWFkZDMzNzAgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODE0CitkcWFkZDMzNzEgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MUUrMzQgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogICAgaGFsZl91cAorZHFhZGQzMzcyIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxNAorZHFhZGQzMzczIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODFFKzM0IFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorZHFhZGQzMzc0IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxNAorZHFhZGQzMzc1IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODFFKzM0IFJvdW5kZWQgSW5leGFjdAorCistLSB1bHAgcmVwbGFjZW1lbnQgdGVzdHMKK2RxYWRkMzQwMCBmbWEgIDEgICAgMSAgIDc3ZS0zMiAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3CitkcWFkZDM0MDEgZm1hICAxICAgIDEgICA3N2UtMzMgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzcKK2RxYWRkMzQwMiBmbWEgIDEgICAgMSAgIDc3ZS0zNCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzQwMyBmbWEgIDEgICAgMSAgIDc3ZS0zNSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzQwNCBmbWEgIDEgICAgMSAgIDc3ZS0zNiAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzQwNSBmbWEgIDEgICAgMSAgIDc3ZS0zNyAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzQwNiBmbWEgIDEgICAgMSAgIDc3ZS0yOTkgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQzNDEwIGZtYSAgMSAgIDEwICAgNzdlLTMyICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3CitkcWFkZDM0MTEgZm1hICAxICAgMTAgICA3N2UtMzMgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MTIgZm1hICAxICAgMTAgICA3N2UtMzQgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MTMgZm1hICAxICAgMTAgICA3N2UtMzUgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MTQgZm1hICAxICAgMTAgICA3N2UtMzYgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MTUgZm1hICAxICAgMTAgICA3N2UtMzcgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MTYgZm1hICAxICAgMTAgICA3N2UtMjk5ICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMzQyMCBmbWEgIDEgICA3N2UtMzIgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3CitkcWFkZDM0MjEgZm1hICAxICAgNzdlLTMzICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzcKK2RxYWRkMzQyMiBmbWEgIDEgICA3N2UtMzQgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzQyMyBmbWEgIDEgICA3N2UtMzUgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzQyNCBmbWEgIDEgICA3N2UtMzYgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzQyNSBmbWEgIDEgICA3N2UtMzcgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzQyNiBmbWEgIDEgICA3N2UtMjk5ICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQzNDMwIGZtYSAgMSAgIDc3ZS0zMiAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3CitkcWFkZDM0MzEgZm1hICAxICAgNzdlLTMzICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MzIgZm1hICAxICAgNzdlLTM0ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MzMgZm1hICAxICAgNzdlLTM1ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MzQgZm1hICAxICAgNzdlLTM2ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MzUgZm1hICAxICAgNzdlLTM3ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MzYgZm1hICAxICAgNzdlLTI5OSAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlIHVscHMKK2RxYWRkMzY0NDAgZm1hICAxICAgIDEgICAtNzdlLTMyICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY0NDEgZm1hICAxICAgIDEgICAtNzdlLTMzICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDM2NDQyIGZtYSAgMSAgICAxICAgLTc3ZS0zNCAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY0NDMgZm1hICAxICAgIDEgICAtNzdlLTM1ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0NDQgZm1hICAxICAgIDEgICAtNzdlLTM2ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0NDUgZm1hICAxICAgIDEgICAtNzdlLTM3ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjQ0NiBmbWEgIDEgICAgMSAgIC03N2UtOTkgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMzY0NTAgZm1hICAxICAgMTAgICAtNzdlLTMyICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDM2NDUxIGZtYSAgMSAgIDEwICAgLTc3ZS0zMyAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY0NTIgZm1hICAxICAgMTAgICAtNzdlLTM0ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0NTMgZm1hICAxICAgMTAgICAtNzdlLTM1ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0NTQgZm1hICAxICAgMTAgICAtNzdlLTM2ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjQ1NSBmbWEgIDEgICAxMCAgIC03N2UtMzcgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDU2IGZtYSAgMSAgIDEwICAgLTc3ZS05OSAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQzNjQ2MCBmbWEgIDEgICAtNzdlLTMyICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjQ2MSBmbWEgIDEgICAtNzdlLTMzICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY0NjIgZm1hICAxICAgLTc3ZS0zNCAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjQ2MyBmbWEgIDEgICAtNzdlLTM1ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjQ2NCBmbWEgIDEgICAtNzdlLTM2ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjQ2NSBmbWEgIDEgICAtNzdlLTM3ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDY2IGZtYSAgMSAgIC03N2UtOTkgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQzNjQ3MCBmbWEgIDEgICAtNzdlLTMyICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY0NzEgZm1hICAxICAgLTc3ZS0zMyAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjQ3MiBmbWEgIDEgICAtNzdlLTM0ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjQ3MyBmbWEgIDEgICAtNzdlLTM1ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjQ3NCBmbWEgIDEgICAtNzdlLTM2ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDc1IGZtYSAgMSAgIC03N2UtMzcgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0NzYgZm1hICAxICAgLTc3ZS05OSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBuZWdhdGl2ZSB1bHBzCitkcWFkZDM2NDgwIGZtYSAgMSAgIC0xICAgIDc3ZS0zMiAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjQ4MSBmbWEgIDEgICAtMSAgICA3N2UtMzMgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDM2NDgyIGZtYSAgMSAgIC0xICAgIDc3ZS0zNCAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDM2NDgzIGZtYSAgMSAgIC0xICAgIDc3ZS0zNSAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjQ4NCBmbWEgIDEgICAtMSAgICA3N2UtMzYgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0ODUgZm1hICAxICAgLTEgICAgNzdlLTM3ICAgICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0ODYgZm1hICAxICAgLTEgICAgNzdlLTk5ICAgICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQzNjQ5MCBmbWEgIDEgIC0xMCAgICA3N2UtMzIgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDM2NDkxIGZtYSAgMSAgLTEwICAgIDc3ZS0zMyAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDM2NDkyIGZtYSAgMSAgLTEwICAgIDc3ZS0zNCAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjQ5MyBmbWEgIDEgIC0xMCAgICA3N2UtMzUgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0OTQgZm1hICAxICAtMTAgICAgNzdlLTM2ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0OTUgZm1hICAxICAtMTAgICAgNzdlLTM3ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0OTYgZm1hICAxICAtMTAgICAgNzdlLTk5ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQzNjUwMCBmbWEgIDEgICAgNzdlLTMyICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY1MDEgZm1hICAxICAgIDc3ZS0zMyAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjUwMiBmbWEgIDEgICAgNzdlLTM0ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjUwMyBmbWEgIDEgICAgNzdlLTM1ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1MDQgZm1hICAxICAgIDc3ZS0zNiAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTA1IGZtYSAgMSAgICA3N2UtMzcgICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTA2IGZtYSAgMSAgICA3N2UtOTkgICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMzY1MTAgZm1hICAxICAgIDc3ZS0zMiAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjUxMSBmbWEgIDEgICAgNzdlLTMzICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjUxMiBmbWEgIDEgICAgNzdlLTM0ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1MTMgZm1hICAxICAgIDc3ZS0zNSAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTE0IGZtYSAgMSAgICA3N2UtMzYgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTE1IGZtYSAgMSAgICA3N2UtMzcgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTE2IGZtYSAgMSAgICA3N2UtOTkgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGFuZCBzb21lIG1vcmUgcmVzaWR1ZSBlZmZlY3RzIGFuZCBkaWZmZXJlbnQgcm91bmRpbmdzCityb3VuZGluZzogaGFsZl91cAorZHFhZGQzNjU0MCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JworZHFhZGQzNjU0MSBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NDIgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTQzIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU0NCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NDUgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTQ2IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU0NyBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NDggZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTQ5IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU1MCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NTEgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTUyIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU1MyBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NTQgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTU1IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU1NiBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJworZHFhZGQzNjU1NyBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAwMDAwMSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NTggZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTU5IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCitkcWFkZDM2NTYwIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknCitkcWFkZDM2NTYxIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU2MiBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NjMgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTY0IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU2NSBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NjYgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTY3IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU2OCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NjkgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTcwIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU3MSBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NzIgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTczIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU3NCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NzUgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTc2IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnCitkcWFkZDM2NTc3IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU3OCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NzkgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitkcWFkZDM3NTQwIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODgnIDAuNDk5OTk5OTk5ICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzU0MSBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg4JyAwLjUgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NDIgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OCcgMC41MDAwMDAwMDEgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkcWFkZDM3NTUwIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknCitkcWFkZDM3NTUxIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzU1MiBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NTMgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTU0IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzU1NSBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NTYgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTU3IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzU1OCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NTkgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTYwIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzU2MSBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NjIgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTYzIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzU2NCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NjUgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTY2IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnCitkcWFkZDM3NTY3IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzU2OCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NjkgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIG1vcmUgemVyb3MsIGV0Yy4KK3JvdW5kaW5nOiBoYWxmX2V2ZW4KKworZHFhZGQzNzcwMSBmbWEgIDEgIDUuMDAgMS4wMEUtMyAtPiA1LjAwMTAwCitkcWFkZDM3NzAyIGZtYSAgMSAgMDAuMDAgMC4wMDAgIC0+IDAuMDAwCitkcWFkZDM3NzAzIGZtYSAgMSAgMDAuMDAgMEUtMyAgIC0+IDAuMDAwCitkcWFkZDM3NzA0IGZtYSAgMSAgMEUtMyAgMDAuMDAgIC0+IDAuMDAwCisKK2RxYWRkMzc3MTAgZm1hICAxICAwRSszICAwMC4wMCAgLT4gMC4wMAorZHFhZGQzNzcxMSBmbWEgIDEgIDBFKzMgIDAwLjAgICAtPiAwLjAKK2RxYWRkMzc3MTIgZm1hICAxICAwRSszICAwMC4gICAgLT4gMAorZHFhZGQzNzcxMyBmbWEgIDEgIDBFKzMgIDAwLkUrMSAtPiAwRSsxCitkcWFkZDM3NzE0IGZtYSAgMSAgMEUrMyAgMDAuRSsyIC0+IDBFKzIKK2RxYWRkMzc3MTUgZm1hICAxICAwRSszICAwMC5FKzMgLT4gMEUrMworZHFhZGQzNzcxNiBmbWEgIDEgIDBFKzMgIDAwLkUrNCAtPiAwRSszCitkcWFkZDM3NzE3IGZtYSAgMSAgMEUrMyAgMDAuRSs1IC0+IDBFKzMKK2RxYWRkMzc3MTggZm1hICAxICAwRSszICAtMDAuMCAgIC0+IDAuMAorZHFhZGQzNzcxOSBmbWEgIDEgIDBFKzMgIC0wMC4gICAgLT4gMAorZHFhZGQzNzczMSBmbWEgIDEgIDBFKzMgIC0wMC5FKzEgLT4gMEUrMQorCitkcWFkZDM3NzIwIGZtYSAgMSAgMDAuMDAgIDBFKzMgIC0+IDAuMDAKK2RxYWRkMzc3MjEgZm1hICAxICAwMC4wICAgMEUrMyAgLT4gMC4wCitkcWFkZDM3NzIyIGZtYSAgMSAgMDAuICAgIDBFKzMgIC0+IDAKK2RxYWRkMzc3MjMgZm1hICAxICAwMC5FKzEgMEUrMyAgLT4gMEUrMQorZHFhZGQzNzcyNCBmbWEgIDEgIDAwLkUrMiAwRSszICAtPiAwRSsyCitkcWFkZDM3NzI1IGZtYSAgMSAgMDAuRSszIDBFKzMgIC0+IDBFKzMKK2RxYWRkMzc3MjYgZm1hICAxICAwMC5FKzQgMEUrMyAgLT4gMEUrMworZHFhZGQzNzcyNyBmbWEgIDEgIDAwLkUrNSAwRSszICAtPiAwRSszCitkcWFkZDM3NzI4IGZtYSAgMSAgLTAwLjAwIDBFKzMgIC0+IDAuMDAKK2RxYWRkMzc3MjkgZm1hICAxICAtMDAuMCAgMEUrMyAgLT4gMC4wCitkcWFkZDM3NzMwIGZtYSAgMSAgLTAwLiAgIDBFKzMgIC0+IDAKKworZHFhZGQzNzczMiBmbWEgIDEgICAwICAgICAwICAgICAtPiAgMAorZHFhZGQzNzczMyBmbWEgIDEgICAwICAgIC0wICAgICAtPiAgMAorZHFhZGQzNzczNCBmbWEgIDEgIC0wICAgICAwICAgICAtPiAgMAorZHFhZGQzNzczNSBmbWEgIDEgIC0wICAgIC0wICAgICAtPiAtMCAgICAgLS0gSUVFRSA4NTQgc3BlY2lhbCBjYXNlCisKK2RxYWRkMzc3MzYgZm1hICAxICAgMSAgICAtMSAgICAgLT4gIDAKK2RxYWRkMzc3MzcgZm1hICAxICAtMSAgICAtMSAgICAgLT4gLTIKK2RxYWRkMzc3MzggZm1hICAxICAgMSAgICAgMSAgICAgLT4gIDIKK2RxYWRkMzc3MzkgZm1hICAxICAtMSAgICAgMSAgICAgLT4gIDAKKworZHFhZGQzNzc0MSBmbWEgIDEgICAwICAgIC0xICAgICAtPiAtMQorZHFhZGQzNzc0MiBmbWEgIDEgIC0wICAgIC0xICAgICAtPiAtMQorZHFhZGQzNzc0MyBmbWEgIDEgICAwICAgICAxICAgICAtPiAgMQorZHFhZGQzNzc0NCBmbWEgIDEgIC0wICAgICAxICAgICAtPiAgMQorZHFhZGQzNzc0NSBmbWEgIDEgIC0xICAgICAwICAgICAtPiAtMQorZHFhZGQzNzc0NiBmbWEgIDEgIC0xICAgIC0wICAgICAtPiAtMQorZHFhZGQzNzc0NyBmbWEgIDEgICAxICAgICAwICAgICAtPiAgMQorZHFhZGQzNzc0OCBmbWEgIDEgICAxICAgIC0wICAgICAtPiAgMQorCitkcWFkZDM3NzUxIGZtYSAgMSAgIDAuMCAgLTEgICAgIC0+IC0xLjAKK2RxYWRkMzc3NTIgZm1hICAxICAtMC4wICAtMSAgICAgLT4gLTEuMAorZHFhZGQzNzc1MyBmbWEgIDEgICAwLjAgICAxICAgICAtPiAgMS4wCitkcWFkZDM3NzU0IGZtYSAgMSAgLTAuMCAgIDEgICAgIC0+ICAxLjAKK2RxYWRkMzc3NTUgZm1hICAxICAtMS4wICAgMCAgICAgLT4gLTEuMAorZHFhZGQzNzc1NiBmbWEgIDEgIC0xLjAgIC0wICAgICAtPiAtMS4wCitkcWFkZDM3NzU3IGZtYSAgMSAgIDEuMCAgIDAgICAgIC0+ICAxLjAKK2RxYWRkMzc3NTggZm1hICAxICAgMS4wICAtMCAgICAgLT4gIDEuMAorCitkcWFkZDM3NzYxIGZtYSAgMSAgIDAgICAgLTEuMCAgIC0+IC0xLjAKK2RxYWRkMzc3NjIgZm1hICAxICAtMCAgICAtMS4wICAgLT4gLTEuMAorZHFhZGQzNzc2MyBmbWEgIDEgICAwICAgICAxLjAgICAtPiAgMS4wCitkcWFkZDM3NzY0IGZtYSAgMSAgLTAgICAgIDEuMCAgIC0+ICAxLjAKK2RxYWRkMzc3NjUgZm1hICAxICAtMSAgICAgMC4wICAgLT4gLTEuMAorZHFhZGQzNzc2NiBmbWEgIDEgIC0xICAgIC0wLjAgICAtPiAtMS4wCitkcWFkZDM3NzY3IGZtYSAgMSAgIDEgICAgIDAuMCAgIC0+ICAxLjAKK2RxYWRkMzc3NjggZm1hICAxICAgMSAgICAtMC4wICAgLT4gIDEuMAorCitkcWFkZDM3NzcxIGZtYSAgMSAgIDAuMCAgLTEuMCAgIC0+IC0xLjAKK2RxYWRkMzc3NzIgZm1hICAxICAtMC4wICAtMS4wICAgLT4gLTEuMAorZHFhZGQzNzc3MyBmbWEgIDEgICAwLjAgICAxLjAgICAtPiAgMS4wCitkcWFkZDM3Nzc0IGZtYSAgMSAgLTAuMCAgIDEuMCAgIC0+ICAxLjAKK2RxYWRkMzc3NzUgZm1hICAxICAtMS4wICAgMC4wICAgLT4gLTEuMAorZHFhZGQzNzc3NiBmbWEgIDEgIC0xLjAgIC0wLjAgICAtPiAtMS4wCitkcWFkZDM3Nzc3IGZtYSAgMSAgIDEuMCAgIDAuMCAgIC0+ICAxLjAKK2RxYWRkMzc3NzggZm1hICAxICAgMS4wICAtMC4wICAgLT4gIDEuMAorCistLSBTcGVjaWFscworZHFhZGQzNzc4MCBmbWEgIDEgIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxYWRkMzc3ODEgZm1hICAxICAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkcWFkZDM3NzgyIGZtYSAgMSAgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZHFhZGQzNzc4MyBmbWEgIDEgIC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2RxYWRkMzc3ODQgZm1hICAxICAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitkcWFkZDM3Nzg1IGZtYSAgMSAgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZHFhZGQzNzc4NiBmbWEgIDEgIC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2RxYWRkMzc3ODcgZm1hICAxICAtMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitkcWFkZDM3Nzg4IGZtYSAgMSAgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFhZGQzNzc4OSBmbWEgIDEgIC0xICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxYWRkMzc3OTAgZm1hICAxICAtMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitkcWFkZDM3NzkxIGZtYSAgMSAgIDAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFhZGQzNzc5MiBmbWEgIDEgICAxICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxYWRkMzc3OTMgZm1hICAxICAgMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitkcWFkZDM3Nzk0IGZtYSAgMSAgIEluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK2RxYWRkMzc4MDAgZm1hICAxICAgSW5mICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkMzc4MDEgZm1hICAxICAgSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitkcWFkZDM3ODAyIGZtYSAgMSAgIEluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorZHFhZGQzNzgwMyBmbWEgIDEgICBJbmYgIC0wICAgICAtPiAgSW5maW5pdHkKK2RxYWRkMzc4MDQgZm1hICAxICAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitkcWFkZDM3ODA1IGZtYSAgMSAgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorZHFhZGQzNzgwNiBmbWEgIDEgICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK2RxYWRkMzc4MDcgZm1hICAxICAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkcWFkZDM3ODA4IGZtYSAgMSAgLTEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFhZGQzNzgwOSBmbWEgIDEgIC1JbmYgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzgxMCBmbWEgIDEgIC0xICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxYWRkMzc4MTEgZm1hICAxICAtMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcWFkZDM3ODEyIGZtYSAgMSAgIDAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFhZGQzNzgxMyBmbWEgIDEgICAxICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxYWRkMzc4MTQgZm1hICAxICAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitkcWFkZDM3ODE1IGZtYSAgMSAgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorCitkcWFkZDM3ODIxIGZtYSAgMSAgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2RxYWRkMzc4MjIgZm1hICAxICAgTmFOIC0xMDAwICAgLT4gIE5hTgorZHFhZGQzNzgyMyBmbWEgIDEgICBOYU4gLTEgICAgICAtPiAgTmFOCitkcWFkZDM3ODI0IGZtYSAgMSAgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2RxYWRkMzc4MjUgZm1hICAxICAgTmFOICAwICAgICAgLT4gIE5hTgorZHFhZGQzNzgyNiBmbWEgIDEgICBOYU4gIDEgICAgICAtPiAgTmFOCitkcWFkZDM3ODI3IGZtYSAgMSAgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2RxYWRkMzc4MjggZm1hICAxICAgTmFOICBJbmYgICAgLT4gIE5hTgorZHFhZGQzNzgyOSBmbWEgIDEgICBOYU4gIE5hTiAgICAtPiAgTmFOCitkcWFkZDM3ODMwIGZtYSAgMSAgLUluZiAgTmFOICAgIC0+ICBOYU4KK2RxYWRkMzc4MzEgZm1hICAxICAtMTAwMCBOYU4gICAgLT4gIE5hTgorZHFhZGQzNzgzMiBmbWEgIDEgIC0xICAgIE5hTiAgICAtPiAgTmFOCitkcWFkZDM3ODMzIGZtYSAgMSAgLTAgICAgTmFOICAgIC0+ICBOYU4KK2RxYWRkMzc4MzQgZm1hICAxICAgMCAgICBOYU4gICAgLT4gIE5hTgorZHFhZGQzNzgzNSBmbWEgIDEgICAxICAgIE5hTiAgICAtPiAgTmFOCitkcWFkZDM3ODM2IGZtYSAgMSAgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2RxYWRkMzc4MzcgZm1hICAxICAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkcWFkZDM3ODQxIGZtYSAgMSAgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODQyIGZtYSAgMSAgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODQzIGZtYSAgMSAgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODQ0IGZtYSAgMSAgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODQ1IGZtYSAgMSAgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODQ2IGZtYSAgMSAgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODQ3IGZtYSAgMSAgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODQ4IGZtYSAgMSAgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODQ5IGZtYSAgMSAgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODUwIGZtYSAgMSAgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODUxIGZtYSAgMSAgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODUyIGZtYSAgMSAgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODUzIGZtYSAgMSAgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODU0IGZtYSAgMSAgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODU1IGZtYSAgMSAgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODU2IGZtYSAgMSAgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODU3IGZtYSAgMSAgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODU4IGZtYSAgMSAgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODU5IGZtYSAgMSAgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxYWRkMzc4NjEgZm1hICAxICAgTmFOMSAgIC1JbmYgICAgLT4gIE5hTjEKK2RxYWRkMzc4NjIgZm1hICAxICArTmFOMiAgIC0xMDAwICAgLT4gIE5hTjIKK2RxYWRkMzc4NjMgZm1hICAxICAgTmFOMyAgICAxMDAwICAgLT4gIE5hTjMKK2RxYWRkMzc4NjQgZm1hICAxICAgTmFONCAgICBJbmYgICAgLT4gIE5hTjQKK2RxYWRkMzc4NjUgZm1hICAxICAgTmFONSAgICtOYU42ICAgLT4gIE5hTjUKK2RxYWRkMzc4NjYgZm1hICAxICAtSW5mICAgICBOYU43ICAgLT4gIE5hTjcKK2RxYWRkMzc4NjcgZm1hICAxICAtMTAwMCAgICBOYU44ICAgLT4gIE5hTjgKK2RxYWRkMzc4NjggZm1hICAxICAgMTAwMCAgICBOYU45ICAgLT4gIE5hTjkKK2RxYWRkMzc4NjkgZm1hICAxICAgSW5mICAgICtOYU4xMCAgLT4gIE5hTjEwCitkcWFkZDM3ODcxIGZtYSAgMSAgIHNOYU4xMSAgLUluZiAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkMzc4NzIgZm1hICAxICAgc05hTjEyICAtMTAwMCAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg3MyBmbWEgIDEgICBzTmFOMTMgICAxMDAwICAtPiAgTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODc0IGZtYSAgMSAgIHNOYU4xNCAgIE5hTjE3IC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkMzc4NzUgZm1hICAxICAgc05hTjE1ICBzTmFOMTggLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg3NiBmbWEgIDEgICBOYU4xNiAgIHNOYU4xOSAtPiAgTmFOMTkgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODc3IGZtYSAgMSAgLUluZiAgICArc05hTjIwIC0+ICBOYU4yMCAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkMzc4NzggZm1hICAxICAtMTAwMCAgICBzTmFOMjEgLT4gIE5hTjIxICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg3OSBmbWEgIDEgICAxMDAwICAgIHNOYU4yMiAtPiAgTmFOMjIgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODgwIGZtYSAgMSAgIEluZiAgICAgc05hTjIzIC0+ICBOYU4yMyAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkMzc4ODEgZm1hICAxICArTmFOMjUgICtzTmFOMjQgLT4gIE5hTjI0ICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg4MiBmbWEgIDEgIC1OYU4yNiAgICBOYU4yOCAtPiAtTmFOMjYKK2RxYWRkMzc4ODMgZm1hICAxICAtc05hTjI3ICBzTmFOMjkgLT4gLU5hTjI3ICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg4NCBmbWEgIDEgICAxMDAwICAgIC1OYU4zMCAtPiAtTmFOMzAKK2RxYWRkMzc4ODUgZm1hICAxICAgMTAwMCAgIC1zTmFOMzEgLT4gLU5hTjMxICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBIZXJlIHdlIGV4cGxvcmUgbmVhciB0aGUgYm91bmRhcnkgb2Ygcm91bmRpbmcgYSBzdWJub3JtYWwgdG8gTm1pbgorZHFhZGQzNzU3NSBmbWEgIDEgICAxRS02MTQzIC0xRS02MTc2IC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0IFN1Ym5vcm1hbAorZHFhZGQzNzU3NiBmbWEgIDEgIC0xRS02MTQzICsxRS02MTc2IC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0IFN1Ym5vcm1hbAorCistLSBjaGVjayBvdmVyZmxvdyBlZGdlIGNhc2UKKy0tICAgICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorZHFhZGQzNzk3MiBhcHBseSAgICAgICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcWFkZDM3OTczIGZtYSAgMSAgICAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAxICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTc0IGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICAxICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTc1IGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICAxRSs2MTExICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc5NzYgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDlFKzYxMTAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk3NyBmbWEgIDEgICAgICAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAgOEUrNjExMCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTc4IGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICA3RSs2MTEwICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc5NzkgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDZFKzYxMTAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk4MCBmbWEgIDEgICAgICAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAgNUUrNjExMCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTgxIGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICA0RSs2MTEwICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc5ODIgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDNFKzYxMTAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk4MyBmbWEgIDEgICAgICAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAgMkUrNjExMCAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTg0IGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICAxRSs2MTEwICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQzNzk4NSBhcHBseSAgICAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFhZGQzNzk4NiBmbWEgIDEgICAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtMSAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc5ODcgZm1hICAxICAgICAgLTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgLTEgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTg4IGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC0xRSs2MTExICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTg5IGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC05RSs2MTEwICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTkwIGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC04RSs2MTEwICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTkxIGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC03RSs2MTEwICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTkyIGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC02RSs2MTEwICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTkzIGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC01RSs2MTEwICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTk0IGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC00RSs2MTEwICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTk1IGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC0zRSs2MTEwICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTk2IGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC0yRSs2MTEwICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTk3IGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC0xRSs2MTEwICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCisKKy0tIEFuZCBmb3Igcm91bmQgZG93biBmdWxsIGFuZCBzdWJub3JtYWwgcmVzdWx0cworcm91bmRpbmc6ICAgICBkb3duCitkcWFkZDM3MTEwMCBmbWEgIDEgIDFlKzIgLTFlLTYxNDMgICAgLT4gOTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgUm91bmRlZCBJbmV4YWN0CitkcWFkZDM3MTEwMSBmbWEgIDEgIDFlKzEgLTFlLTYxNDMgICAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMDMgZm1hICAxICAgICsxIC0xZS02MTQzICAgIC0+IDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDM3MTEwNCBmbWEgIDEgIDFlLTEgLTFlLTYxNDMgICAgLT4gMC4wOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDM3MTEwNSBmbWEgIDEgIDFlLTIgLTFlLTYxNDMgICAgLT4gMC4wMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMDYgZm1hICAxICAxZS0zIC0xZS02MTQzICAgIC0+IDAuMDAwOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDM3MTEwNyBmbWEgIDEgIDFlLTQgLTFlLTYxNDMgICAgLT4gMC4wMDAwOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDM3MTEwOCBmbWEgIDEgIDFlLTUgLTFlLTYxNDMgICAgLT4gMC4wMDAwMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMDkgZm1hICAxICAxZS02IC0xZS02MTQzICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS03ICBSb3VuZGVkIEluZXhhY3QKKworcm91bmRpbmc6ICAgICBjZWlsaW5nCitkcWFkZDM3MTExMCBmbWEgIDEgIC0xZSsyICsxZS02MTQzICAgLT4gLTk5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMTEgZm1hICAxICAtMWUrMSArMWUtNjE0MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDM3MTExMyBmbWEgIDEgICAgIC0xICsxZS02MTQzICAgLT4gLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDM3MTExNCBmbWEgIDEgIC0xZS0xICsxZS02MTQzICAgLT4gLTAuMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMTUgZm1hICAxICAtMWUtMiArMWUtNjE0MyAgIC0+IC0wLjAwOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDM3MTExNiBmbWEgIDEgIC0xZS0zICsxZS02MTQzICAgLT4gLTAuMDAwOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDM3MTExNyBmbWEgIDEgIC0xZS00ICsxZS02MTQzICAgLT4gLTAuMDAwMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMTggZm1hICAxICAtMWUtNSArMWUtNjE0MyAgIC0+IC0wLjAwMDAwOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDM3MTExOSBmbWEgIDEgIC0xZS02ICsxZS02MTQzICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS03ICBSb3VuZGVkIEluZXhhY3QKKworLS0gdGVzdHMgYmFzZWQgb24gR3VubmFyIERlZ25ib2wncyBlZGdlIGNhc2UKK3JvdW5kaW5nOiAgICAgaGFsZl9ldmVuCisKK2RxYWRkMzcxMzAwIGZtYSAgMSAgMUUzNCAgLTAuNSAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzEwIGZtYSAgMSAgMUUzNCAgLTAuNTEgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzExIGZtYSAgMSAgMUUzNCAgLTAuNTAxICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzEyIGZtYSAgMSAgMUUzNCAgLTAuNTAwMSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzEzIGZtYSAgMSAgMUUzNCAgLTAuNTAwMDEgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzE0IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAxICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzE1IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzE2IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDEgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzE3IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAxICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzE4IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzE5IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMDEgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzIwIGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzIxIGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzIyIGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMDEgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzIzIGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzI0IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMDAwMSAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzI1IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMDAwMCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzI2IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMDAwICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzI3IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMDAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzI4IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMCAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzI5IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMDAwICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzMwIGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMDAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzMxIGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwMCAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzMyIGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAwICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzMzIGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMDAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzM0IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwMCAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzM1IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAwICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzM2IGZtYSAgMSAgMUUzNCAgLTAuNTAwMDAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzM3IGZtYSAgMSAgMUUzNCAgLTAuNTAwMCAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzM4IGZtYSAgMSAgMUUzNCAgLTAuNTAwICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzM5IGZtYSAgMSAgMUUzNCAgLTAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQzNzEzNDAgZm1hICAxICAxRTM0ICAtNTAwMDAwMC4wMDAwMTAwMDEgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTAwMDAwMCAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNDEgZm1hICAxICAxRTM0ICAtNTAwMDAwMC4wMDAwMDAwMDEgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTAwMDAwMCAgICAgIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDM3MTM0OSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40ICAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNTAgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDkgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzUxIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OSAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM1MiBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5ICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNTMgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTkgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzU0IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OSAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM1NSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5ICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNTYgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTkgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzU3IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OSAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM1OCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5ICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNTkgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTkgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzYwIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OSAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM2MSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5ICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNjIgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTkgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzYzIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTk5OSAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM2NCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OTk5ICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNjUgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwMCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzY3IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMCAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM2OCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMCAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNjkgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMCAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzcwIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM3MSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMCAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNzIgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMCAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzczIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMCAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM3NCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMCAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNzUgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMCAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzc2IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMCAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM3NyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMCAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNzggZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMCAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzc5IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMCAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM4MCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MCAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzODEgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNSAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzgyIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM4MyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzODQgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDEgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzg1IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDEgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM4NiBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDEgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzODcgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDEgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzg4IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDEgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM4OSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDEgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzOTAgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDEgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzkxIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDEgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM5MiBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDEgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzOTMgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDEgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzk0IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDEgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM5NSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDEgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzOTYgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTEgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKKworLS0gTW9yZSBHRCBlZGdlIGNhc2VzLCB3aGVyZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHVuYWRqdXN0ZWQKKy0tIGV4cG9uZW50cyBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBwcmVjaXNpb24gYW5kIG9uZSBzaWRlIGlzIDAKK2RxYWRkMzcxNDIwIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgICAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQyMSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xICAtPiAwLjExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNDIyIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIgIC0+IDAuMDExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNDIzIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMgIC0+IDAuMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQyNCBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS00ICAtPiAwLjAwMDExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNDI1IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTUgIC0+IDAuMDAwMDExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNDI2IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTYgIC0+IDAuMDAwMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQyNyBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS03ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtNworZHFhZGQzNzE0MjggZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtOCAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTgKK2RxYWRkMzcxNDI5IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTkgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS05CitkcWFkZDM3MTQzMCBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTAKK2RxYWRkMzcxNDMxIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTExIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMQorZHFhZGQzNzE0MzIgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTIgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEyCitkcWFkZDM3MTQzMyBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMyAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTMKK2RxYWRkMzcxNDM0IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE0IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNAorZHFhZGQzNzE0MzUgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTUgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE1CitkcWFkZDM3MTQzNiBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNiAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTYKK2RxYWRkMzcxNDM3IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE3IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNworZHFhZGQzNzE0MzggZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTggLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE4CitkcWFkZDM3MTQzOSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xOSAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTkKK2RxYWRkMzcxNDQwIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMAorZHFhZGQzNzE0NDEgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjEgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIxCitkcWFkZDM3MTQ0MiBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMiAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjIKK2RxYWRkMzcxNDQzIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIzIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMworZHFhZGQzNzE0NDQgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjQgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI0CitkcWFkZDM3MTQ0NSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNSAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjUKK2RxYWRkMzcxNDQ2IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI2IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNgorZHFhZGQzNzE0NDcgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjcgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI3CitkcWFkZDM3MTQ0OCBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yOCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjgKK2RxYWRkMzcxNDQ5IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI5IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yOQorZHFhZGQzNzE0NTAgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMwCitkcWFkZDM3MTQ1MSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMSAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzEKK2RxYWRkMzcxNDUyIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMyIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMgorZHFhZGQzNzE0NTMgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzMgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMzCitkcWFkZDM3MTQ1NCBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzQKK2RxYWRkMzcxNDU1IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM1IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNQorZHFhZGQzNzE0NTYgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzYgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM2CisKKy0tIHNhbWUsIHJldmVyc2VkIDAKK2RxYWRkMzcxNDYwIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgICAgIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNDYxIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEgIDAgLT4gMC4xMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQ2MiBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yICAwIC0+IDAuMDExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNDYzIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMgIDAgLT4gMC4wMDExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNDY0IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTQgIDAgLT4gMC4wMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQ2NSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS01ICAwIC0+IDAuMDAwMDExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNDY2IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTYgIDAgLT4gMC4wMDAwMDExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNDY3IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTcgIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTcKK2RxYWRkMzcxNDY4IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTggIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTgKK2RxYWRkMzcxNDY5IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTkgIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTkKK2RxYWRkMzcxNDcwIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEwIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEwCitkcWFkZDM3MTQ3MSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMSAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMQorZHFhZGQzNzE0NzIgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTIgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTIKK2RxYWRkMzcxNDczIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEzIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEzCitkcWFkZDM3MTQ3NCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNCAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNAorZHFhZGQzNzE0NzUgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTUgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTUKK2RxYWRkMzcxNDc2IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE2IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE2CitkcWFkZDM3MTQ3NyBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNyAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNworZHFhZGQzNzE0NzggZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTggMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTgKK2RxYWRkMzcxNDc5IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE5IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE5CitkcWFkZDM3MTQ4MCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMCAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMAorZHFhZGQzNzE0ODEgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjEgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjEKK2RxYWRkMzcxNDgyIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIyIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIyCitkcWFkZDM3MTQ4MyBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMyAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMworZHFhZGQzNzE0ODQgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjQgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjQKK2RxYWRkMzcxNDg1IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI1IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI1CitkcWFkZDM3MTQ4NiBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNiAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNgorZHFhZGQzNzE0ODcgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjcgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjcKK2RxYWRkMzcxNDg4IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI4IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI4CitkcWFkZDM3MTQ4OSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yOSAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yOQorZHFhZGQzNzE0OTAgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzAgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzAKK2RxYWRkMzcxNDkxIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMxIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMxCitkcWFkZDM3MTQ5MiBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMiAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMgorZHFhZGQzNzE0OTMgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzMgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzMKK2RxYWRkMzcxNDk0IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM0IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM0CitkcWFkZDM3MTQ5NSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNSAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNQorZHFhZGQzNzE0OTYgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzYgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzYKKworLS0gc2FtZSwgRXMgb24gdGhlIDAKK2RxYWRkMzcxNTAwIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTAgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MDEgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMSAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUwMiBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0yICAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTAzIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTMgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MDQgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtNCAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUwNSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS01ICAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTA2IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTYgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MDcgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtNyAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUwOCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS04ICAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTA5IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTkgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MTAgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUxMSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMSAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTEyIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTEyICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MTMgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTMgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUxNCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNCAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTE1IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTE1ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MTYgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTYgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUxNyBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNyAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTE4IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTE4ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MTkgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTkgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUyMCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0yMCAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTIxIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTIxICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MjIgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjIgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUyMyBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0yMyAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTI0IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTI0ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MjUgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjUgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUyNiBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0yNiAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTI3IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTI3ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MjggZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjggIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUyOSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0yOSAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTMwIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTMwICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MzEgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMzEgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUzMiBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0zMiAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTMzIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTMzICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorLS0gbmV4dCBmb3VyIGZsYWcgUm91bmRlZCBiZWNhdXNlIHRoZSAwIGV4dGVuZHMgdGhlIHJlc3VsdAorZHFhZGQzNzE1MzQgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMzQgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKK2RxYWRkMzcxNTM1IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTM1ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitkcWFkZDM3MTUzNiBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0zNiAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZHFhZGQzNzE1MzcgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMzcgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKKworLS0gc3VtIG9mIHR3byBvcHBvc2l0ZS1zaWduIG9wZXJhbmRzIGlzIGV4YWN0bHkgMCBhbmQgZmxvb3IgPT4gLTAKK3JvdW5kaW5nOiAgICBoYWxmX3VwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDM3MTYwMCBmbWEgIDEgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTYwMSBmbWEgIDEgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTYwMiBmbWEgIDEgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTYwMyBmbWEgIDEgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZHFhZGQzNzE2MTEgZm1hICAxICAtMTEgICAgICAxMSAgICAtPiAgMAorZHFhZGQzNzE2MTIgZm1hICAxICAgMTEgICAgIC0xMSAgICAtPiAgMAorLS0gb3ZlcmZsb3cKK2RxYWRkMzcxNjEzIGZtYSAgOUU2MTQ0IDEwICAgMSAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzE2MTQgZm1hIC05RTYxNDQgMTAgICAxICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RxYWRkMzcxNjIwIGZtYSAgMSAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNjIxIGZtYSAgMSAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNjIyIGZtYSAgMSAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNjIzIGZtYSAgMSAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkcWFkZDM3MTYzMSBmbWEgIDEgIC0xMSAgICAgIDExICAgIC0+ICAwCitkcWFkZDM3MTYzMiBmbWEgIDEgICAxMSAgICAgLTExICAgIC0+ICAwCistLSBvdmVyZmxvdworZHFhZGQzNzE2MzMgZm1hICA5RTYxNDQgMTAgICAxICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTYzNCBmbWEgLTlFNjE0NCAxMCAgIDEgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZHFhZGQzNzE2NDAgZm1hICAxICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQzNzE2NDEgZm1hICAxICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQzNzE2NDIgZm1hICAxICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQzNzE2NDMgZm1hICAxICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RxYWRkMzcxNjUxIGZtYSAgMSAgLTExICAgICAgMTEgICAgLT4gIDAKK2RxYWRkMzcxNjUyIGZtYSAgMSAgIDExICAgICAtMTEgICAgLT4gIDAKKy0tIG92ZXJmbG93CitkcWFkZDM3MTY1MyBmbWEgIDlFNjE0NCAxMCAgIDEgICAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxNjU0IGZtYSAtOUU2MTQ0IDEwICAgMSAgICAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgdXAKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RxYWRkMzcxNjYwIGZtYSAgMSAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNjYxIGZtYSAgMSAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNjYyIGZtYSAgMSAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNjYzIGZtYSAgMSAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkcWFkZDM3MTY3MSBmbWEgIDEgIC0xMSAgICAgIDExICAgIC0+ICAwCitkcWFkZDM3MTY3MiBmbWEgIDEgICAxMSAgICAgLTExICAgIC0+ICAwCistLSBvdmVyZmxvdworZHFhZGQzNzE2NzMgZm1hICA5RTYxNDQgMTAgICAxICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTY3NCBmbWEgLTlFNjE0NCAxMCAgIDEgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGRvd24KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RxYWRkMzcxNjgwIGZtYSAgMSAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNjgxIGZtYSAgMSAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNjgyIGZtYSAgMSAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNjgzIGZtYSAgMSAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkcWFkZDM3MTY5MSBmbWEgIDEgIC0xMSAgICAgIDExICAgIC0+ICAwCitkcWFkZDM3MTY5MiBmbWEgIDEgICAxMSAgICAgLTExICAgIC0+ICAwCistLSBvdmVyZmxvdworZHFhZGQzNzE2OTMgZm1hICA5RTYxNDQgMTAgICAxICAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTY5NCBmbWEgLTlFNjE0NCAxMCAgIDEgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGNlaWxpbmcKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RxYWRkMzcxNzAwIGZtYSAgMSAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNzAxIGZtYSAgMSAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNzAyIGZtYSAgMSAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNzAzIGZtYSAgMSAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkcWFkZDM3MTcxMSBmbWEgIDEgIC0xMSAgICAgIDExICAgIC0+ICAwCitkcWFkZDM3MTcxMiBmbWEgIDEgICAxMSAgICAgLTExICAgIC0+ICAwCistLSBvdmVyZmxvdworZHFhZGQzNzE3MTMgZm1hICA5RTYxNDQgMTAgICAxICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTcxNCBmbWEgLTlFNjE0NCAxMCAgIDEgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0gYW5kIHRoZSBleHRyYS1zcGVjaWFsIHVnbHkgY2FzZTsgdW51c3VhbCBtaW51c2VzIG1hcmtlZCBieSAtLSAqCityb3VuZGluZzogICAgZmxvb3IKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RxYWRkMzcxNzIwIGZtYSAgMSAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNzIxIGZtYSAgMSAgLTAgICAgICAgIDBFLTE5ICAtPiAtMEUtMTkgICAgICAgICAgIC0tICoKK2RxYWRkMzcxNzIyIGZtYSAgMSAgIDAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkgICAgICAgICAgIC0tICoKK2RxYWRkMzcxNzIzIGZtYSAgMSAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkcWFkZDM3MTczMSBmbWEgIDEgIC0xMSAgICAgIDExICAgIC0+ICAtMCAgICAgICAgICAgICAgICAtLSAqCitkcWFkZDM3MTczMiBmbWEgIDEgICAxMSAgICAgLTExICAgIC0+ICAtMCAgICAgICAgICAgICAgICAtLSAqCistLSBvdmVyZmxvdworZHFhZGQzNzE3MzMgZm1hICA5RTYxNDQgMTAgICAxICAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTczNCBmbWEgLTlFNjE0NCAxMCAgIDEgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIDA1dXAKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RxYWRkMzcxNzQwIGZtYSAgMSAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNzQxIGZtYSAgMSAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNzQyIGZtYSAgMSAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNzQzIGZtYSAgMSAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkcWFkZDM3MTc1MSBmbWEgIDEgIC0xMSAgICAgIDExICAgIC0+ICAwCitkcWFkZDM3MTc1MiBmbWEgIDEgICAxMSAgICAgLTExICAgIC0+ICAwCistLSBvdmVyZmxvdworZHFhZGQzNzE3NTMgZm1hICA5RTYxNDQgMTAgICAxICAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTc1NCBmbWEgLTlFNjE0NCAxMCAgIDEgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0gRXhhbXBsZXMgZnJvbSBTUUwgcHJvcG9zYWwgKEtyaXNobmEgS3Vsa2FybmkpCitkcWFkZDM3MTc2MSBmbWEgIDEgIDEzMEUtMiAgICAxMjBFLTIgICAgLT4gMi41MAorZHFhZGQzNzE3NjIgZm1hICAxICAxMzBFLTIgICAgMTJFLTEgICAgIC0+IDIuNTAKK2RxYWRkMzcxNzYzIGZtYSAgMSAgMTMwRS0yICAgIDFFMCAgICAgICAtPiAyLjMwCitkcWFkZDM3MTc2NCBmbWEgIDEgIDFFMiAgICAgICAxRTQgICAgICAgLT4gMS4wMUUrNAorZHFhZGQzNzE3NjUgZm1hICAxICAxMzBFLTIgICAtMTIwRS0yIC0+IDAuMTAKK2RxYWRkMzcxNzY2IGZtYSAgMSAgMTMwRS0yICAgLTEyRS0xICAtPiAwLjEwCitkcWFkZDM3MTc2NyBmbWEgIDEgIDEzMEUtMiAgIC0xRTAgICAgLT4gMC4zMAorZHFhZGQzNzE3NjggZm1hICAxICAxRTIgICAgICAtMUU0ICAgIC0+IC05LjlFKzMKKworLS0gR2FwcHkgY29lZmZpY2llbnRzOyBjaGVjayByZXNpZHVlIGhhbmRsaW5nIGV2ZW4gd2l0aCBmdWxsIGNvZWZmaWNpZW50IGdhcAorcm91bmRpbmc6IGhhbGZfZXZlbgorCitkcWFkZDM3NTAwMSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTcKK2RxYWRkMzc1MDAyIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAwLjYgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NyAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAwMyBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgMC4wNiAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMDQgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTMgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDA1IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS00ICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAwNiBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtNSAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMDcgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTYgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDA4IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS03ICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAwOSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtOCAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMTAgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTkgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDExIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xMCAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAxMiBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTEgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMTMgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTEyICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDE0IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xMyAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAxNSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTQgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMTYgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTE1ICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDE3IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xNiAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAxOCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTcgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMTkgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTE4ICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDIwIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xOSAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAyMSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMjAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorCistLSB3aWRlbmluZyBzZWNvbmQgYXJndW1lbnQgYXQgZ2FwCitkcWFkZDM3NTAzMCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDEgICAgICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc5CitkcWFkZDM3NTAzMSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMSAgICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEKK2RxYWRkMzc1MDMyIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMiAgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIKK2RxYWRkMzc1MDMzIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjMgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzCitkcWFkZDM3NTAzNCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNCAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQKK2RxYWRkMzc1MDM1IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NSAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDUKK2RxYWRkMzc1MDM2IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTYgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2CitkcWFkZDM3NTAzNyBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2NyAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1NjcKK2RxYWRkMzc1MDM4IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3OCAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzgKK2RxYWRkMzc1MDM5IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODkgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA0MCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1ICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNDEgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NTAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDQyIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUxICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA0MyBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1MDEgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNDQgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NTAwMSAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDQ1IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUwMDAxICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA0NiBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDEgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNDcgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NTAwMDAwMSAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDQ4IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUwMDAwMDAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA0OSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAxMjM0NTYKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2RxYWRkMzc1MDUwIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMjM0NTY3NzUwMDAwMDAwICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDIzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA1MSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAzNDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNTIgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDQ1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDA0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDUzIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwNTY3NzUwMDAwMDAwICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA1NCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDA2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwNjc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNTUgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDAwMDc3NTAwMDAwMDAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDA3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDU2IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwMDAwNzUwMDAwMDAwICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA1NyBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDAwMDA1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNjAgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAyMzQ1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDYxIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDM0NTY3NzUwMDAwMDAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA2MiBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwNDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDQ1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNjMgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDA1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwNTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDY0IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwMDY3NzUwMDAwMDAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDA2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA2NSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDAwNzc1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNjYgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDAwMDA3NTAwMDAwMDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDY3IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwMDAwMDUwMDAwMDAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCistLSBmYXItb3V0IHJlc2lkdWVzIChmdWxsIGNvZWZmaWNpZW50IGdhcCBpcyAxNisxNSBkaWdpdHMpCityb3VuZGluZzogdXAKK2RxYWRkMzc1MDcwIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtOCAgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEKK2RxYWRkMzc1MDcxIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtOSAgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA3MiBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTEwICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNzMgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xMSAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDc0IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMTIgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA3NSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTEzICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNzYgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xNCAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDc3IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMTUgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA3OCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTE2ICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNzkgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xNyAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDgwIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMTggICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA4MSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTE5ICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwODIgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0yMCAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDgzIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMjUgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA4NCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTMwICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwODUgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0zMSAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDg2IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMzIgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA4NyBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTMzICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwODggZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0zNCAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDg5IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMzUgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCisKKy0tIERlc3RydWN0aXZlIHN1YnRyYWN0IChmcm9tIHJlbWFpbmRlciB0ZXN0cykKKworLS0gKysrIHNvbWUgb2YgdGhlc2Ugd2lsbCBiZSBvZmYtYnktb25lIHJlbWFpbmRlciB2cyByZW1haW5kZXJOZWFyCisKK2RxZm1hNDAwMCAgZm1hICAtMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzMyAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIC0+ICAtMC4yMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzMKK2RxZm1hNDAwMSAgZm1hICAtMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIyMiAgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIC0+ICAtMC4zNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIyMgorZHFmbWE0MDAyICBmbWEgIC0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMTExICAgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgLT4gIC0wLjQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDExMTEKK2RxZm1hNDAwMyAgZm1hICAgLTMwODY0MTk3MjUzMDg2NDE5NzI1MzA4NjQxOTcyNTMxNCAgIDQuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyNTUgIC0+ICAtMS4zMDg2NDE5NzI1MzA4NjQxOTcyNTMwODY0MTk3MjUzMTQKK2RxZm1hNDAwNCAgZm1hICAgLTMwODY0MTk3MjUzMDg2NDE5NzI1MzA4NjQxOTcyNTMwOCAgIDQuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIC0+ICAxLjY5MTM1ODAyNzQ2OTEzNTgwMjc0NjkxMzU4MDI3NDY5MgorZHFmbWE0MDA1ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjUyICAgICA0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgLT4gIC0xLjMwODY0MjE5NzUzMDg2NDIxOTc1MzA4NjQyMTk3NDgKK2RxZm1hNDAwNiAgZm1hICAgLTI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NyAgICA0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIC0+ICAxLjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ3CitkcWZtYTQwMDcgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDcgICA0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAtPiAgLTAuNzUzMDg2NDIxOTc1MzA4NjQyMTk3NTMwODY0MjE5NzUzCitkcWZtYTQwMDggIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDcgICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAtPiAgLTEuMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ3CitkcWZtYTQwMDkgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDYgICAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAtPiAgMS41MzA4NjQyMTk3NTMwODY0MjE5NzUzMDg2NDIxOTc1NAorZHFmbWE0MDEwICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQyICAgICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgLT4gIC0wLjY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDIKK2RxZm1hNDAxMSAgZm1hICAtMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzMiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIC0+ICAwLjc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2OAorZHFmbWE0MDEyICBmbWEgIC0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjIxICAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgLT4gIDAuNjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NzkKK2RxZm1hNDAxMyAgZm1hICAtMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTExMCAgICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIC0+ICAwLjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg4OTAKK2RxZm1hNDAxNCAgZm1hICAgLTMwODY0MTk3MjUzMDg2NDE5NzI1MzA4NjQxOTcyNTMxMyAgIDQuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyNTUgIC0+ICAyLjY5MTM1ODAyNzQ2OTEzNTgwMjc0NjkxMzU4MDI3NDY4NworZHFmbWE0MDE1ICBmbWEgICAtMzA4NjQxOTcyNTMwODY0MTk3MjUzMDg2NDE5NzI1MzA4ICAgNC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgLT4gIDEuNjkxMzU4MDI3NDY5MTM1ODAyNzQ2OTEzNTgwMjc0NjkyCitkcWZtYTQwMTYgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNTEgICAgIDQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAtPiAgMy42OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjUxCitkcWZtYTQwMTcgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDcgICAgNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAtPiAgMS40NjkxMzU3ODAyNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NworZHFmbWE0MDE4ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ2ICAgNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgLT4gIDQuMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ2CitkcWZtYTQwMTkgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDEgICAgIDUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAtPiAgNC4zMDg2NDIxOTc1MzA4NjQyMTk3NTMwODY0MjE5NzU5CisKKy0tIE51bGwgdGVzdHMKK2RxYWRkMzk5OTAgZm1hICAxICAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkMzk5OTEgZm1hICAxICAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxSW52ZXJ0LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxSW52ZXJ0LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyY2ZjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFJbnZlcnQuZGVjVGVzdApAQCAtMCwwICsxLDI0NSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcUludmVydC5kZWNUZXN0IC0tIGRpZ2l0d2lzZSBsb2dpY2FsIElOVkVSVCBmb3IgZGVjUXVhZHMgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjayAodHJ1dGggdGFibGUpCitkcWludjAwMSBpbnZlcnQgICAgICAgICAgICAgMCAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWludjAwMiBpbnZlcnQgICAgICAgICAgICAgMSAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwCitkcWludjAwMyBpbnZlcnQgICAgICAgICAgICAxMCAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxCitkcWludjAwNCBpbnZlcnQgICAgIDExMTExMTExMSAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAwCitkcWludjAwNSBpbnZlcnQgICAgIDAwMDAwMDAwMCAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCistLSBhbmQgYXQgbXNkIGFuZCBtc2QtMQorZHFpbnYwMDcgaW52ZXJ0IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWludjAwOCBpbnZlcnQgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2RxaW52MDA5IGludmVydCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFpbnYwMTAgaW52ZXJ0IDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAxMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWludjAxMSBpbnZlcnQgMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAtPiAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxaW52MDEyIGludmVydCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgICAgICAgMAorZHFpbnYwMTMgaW52ZXJ0IDAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgLT4gICAxMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWludjAxNCBpbnZlcnQgMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAtPiAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworLS0gVmFyaW91cyBsZW5ndGhzCitkcWludjYwMCBpbnZlcnQgMDExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMSAtPiAgIDEwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAKK2RxaW52NjAxIGludmVydCAwMDExMTExMTExMTExMTExMTEwMTAxMTExMTExMTExMTExIC0+ICAgMTEwMDAwMDAwMDAwMDAwMDAwMTAxMDAwMDAwMDAwMDAwMAorZHFpbnY2MDIgaW52ZXJ0IDAxMDExMTExMTExMTExMTExMDExMTAxMTExMTExMTExMTEgLT4gICAxMDEwMDAwMDAwMDAwMDAwMDEwMDAxMDAwMDAwMDAwMDAwCitkcWludjYwMyBpbnZlcnQgMDExMDExMTExMTExMTExMTAxMTExMTAxMTExMTExMTExMSAtPiAgIDEwMDEwMDAwMDAwMDAwMDAxMDAwMDAxMDAwMDAwMDAwMDAKK2RxaW52NjA0IGludmVydCAwMTExMDExMTExMTExMTEwMTExMTExMTAxMTExMTExMTExIC0+ICAgMTAwMDEwMDAwMDAwMDAwMTAwMDAwMDAxMDAwMDAwMDAwMAorZHFpbnY2MDUgaW52ZXJ0IDAxMTExMDExMTExMTExMDExMTExMTExMTAxMTExMTExMTEgLT4gICAxMDAwMDEwMDAwMDAwMDEwMDAwMDAwMDAxMDAwMDAwMDAwCitkcWludjYwNiBpbnZlcnQgMDExMTExMDExMTExMTAxMTExMTExMTExMTAxMTExMTExMSAtPiAgIDEwMDAwMDEwMDAwMDAxMDAwMDAwMDAwMDAxMDAwMDAwMDAKK2RxaW52NjA3IGludmVydCAwMTExMTExMDExMTEwMTExMTExMTExMTExMTAxMTExMTExIC0+ICAgMTAwMDAwMDEwMDAwMTAwMDAwMDAwMDAwMDAxMDAwMDAwMAorZHFpbnY2MDggaW52ZXJ0IDAxMTExMTExMDExMDExMTExMTExMTExMTExMTAxMTExMTEgLT4gICAxMDAwMDAwMDEwMDEwMDAwMDAwMDAwMDAwMDAxMDAwMDAwCitkcWludjYwOSBpbnZlcnQgMDExMTExMTExMDAxMTExMTExMTExMTExMTExMTAxMTExMSAtPiAgIDEwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAKK2RxaW52NjEwIGludmVydCAwMTExMTExMTEwMDExMTExMTExMTExMTExMTExMTAxMTExIC0+ICAgMTAwMDAwMDAwMTEwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMAorZHFpbnY2MTEgaW52ZXJ0IDAxMTExMTExMDExMDExMTExMTExMTExMTExMTExMTAxMTEgLT4gICAxMDAwMDAwMDEwMDEwMDAwMDAwMDAwMDAwMDAwMDAxMDAwCitkcWludjYxMiBpbnZlcnQgMDExMTExMTAxMTExMDExMTExMTExMTExMTExMTExMTAxMSAtPiAgIDEwMDAwMDAxMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAxMDAKK2RxaW52NjEzIGludmVydCAwMTExMTEwMTExMTExMDExMTExMTExMTExMTExMTExMTAxIC0+ICAgMTAwMDAwMTAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAxMAorZHFpbnY2MTQgaW52ZXJ0IDAxMTExMDExMTExMTExMDExMTExMTExMTExMTExMTExMTAgLT4gICAxMDAwMDEwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAxCitkcWludjYxNSBpbnZlcnQgMDExMTAxMTExMTExMTExMDExMTExMTExMTExMTExMTExMSAtPiAgIDEwMDAxMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAKK2RxaW52NjE2IGludmVydCAwMTEwMTExMTExMTExMTExMDExMTExMTExMTExMTExMTEwIC0+ICAgMTAwMTAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMQorZHFpbnY2MTcgaW52ZXJ0IDAxMDExMTExMTExMTExMTExMDExMTExMTExMTExMTExMDEgLT4gICAxMDEwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDEwCitkcWludjYxOCBpbnZlcnQgMDAxMTExMTExMTExMTExMTExMDExMTExMTExMTExMTAxMSAtPiAgIDExMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAxMDAKK2RxaW52NjE5IGludmVydCAwMTAxMTExMTExMTExMTExMTExMDExMTExMTExMTEwMTExIC0+ICAgMTAxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMTAwMAorZHFpbnY2MjAgaW52ZXJ0IDAxMTAxMTExMTExMTExMTExMTExMDExMTExMTExMDExMTEgLT4gICAxMDAxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDEwMDAwCitkcWludjYyMSBpbnZlcnQgMDExMTAxMTExMTExMTExMTExMTExMDExMTExMTAxMTExMSAtPiAgIDEwMDAxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAxMDAwMDAKK2RxaW52NjIyIGludmVydCAwMTExMTAxMTExMTExMTExMTExMTExMDExMTEwMTExMTExIC0+ICAgMTAwMDAxMDAwMDAwMDAwMDAwMDAwMDEwMDAwMTAwMDAwMAorZHFpbnY2MjMgaW52ZXJ0IDAxMTExMTAxMTExMTExMTExMTExMTExMDExMDExMTExMTEgLT4gICAxMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDEwMDEwMDAwMDAwCitkcWludjYyNCBpbnZlcnQgMDExMTExMTAxMTExMTExMTExMTExMTExMDAxMTExMTExMSAtPiAgIDEwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAKK2RxaW52NjI1IGludmVydCAwMTExMTExMTAxMTExMTExMTExMTExMTEwMDExMTExMTExIC0+ICAgMTAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMTEwMDAwMDAwMAorZHFpbnY2MjYgaW52ZXJ0IDAxMTExMTExMTAxMTExMTExMTExMTExMDExMDExMTExMTEgLT4gICAxMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDEwMDEwMDAwMDAwCitkcWludjYyNyBpbnZlcnQgMDExMTExMTExMTAxMTExMTExMTExMTAxMTExMDExMTExMSAtPiAgIDEwMDAwMDAwMDAxMDAwMDAwMDAwMDAxMDAwMDEwMDAwMDAKK2RxaW52NjI4IGludmVydCAwMTExMTExMTExMTAxMTExMTExMTEwMTExMTExMDExMTExIC0+ICAgMTAwMDAwMDAwMDAxMDAwMDAwMDAwMTAwMDAwMDEwMDAwMAorZHFpbnY2MjkgaW52ZXJ0IDAxMTExMTExMTExMTAxMTExMTExMDExMTExMTExMDExMTEgLT4gICAxMDAwMDAwMDAwMDAxMDAwMDAwMDEwMDAwMDAwMDEwMDAwCitkcWludjYzMCBpbnZlcnQgMDExMTExMTExMTExMTAxMTExMTAxMTExMTExMTExMDExMSAtPiAgIDEwMDAwMDAwMDAwMDAxMDAwMDAxMDAwMDAwMDAwMDEwMDAKK2RxaW52NjMxIGludmVydCAwMTExMTExMTExMTExMTAxMTEwMTExMTExMTExMTExMDExIC0+ICAgMTAwMDAwMDAwMDAwMDAxMDAwMTAwMDAwMDAwMDAwMDEwMAorZHFpbnY2MzIgaW52ZXJ0IDAxMTExMTExMTExMTExMTAxMDExMTExMTExMTExMTExMDEgLT4gICAxMDAwMDAwMDAwMDAwMDAxMDEwMDAwMDAwMDAwMDAwMDEwCitkcWludjYzMyBpbnZlcnQgMDExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMCAtPiAgIDEwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDEKKworZHFpbnYwMjEgaW52ZXJ0IDExMTExMTExMSAgICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMAorZHFpbnYwMjIgaW52ZXJ0IDExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMAorZHFpbnYwMjMgaW52ZXJ0ICAxMTExMTExMSAgICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMAorZHFpbnYwMjUgaW52ZXJ0ICAgMTExMTExMSAgICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMAorZHFpbnYwMjYgaW52ZXJ0ICAgIDExMTExMSAgICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMAorZHFpbnYwMjcgaW52ZXJ0ICAgICAxMTExMSAgICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMAorZHFpbnYwMjggaW52ZXJ0ICAgICAgMTExMSAgICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDAwMAorZHFpbnYwMjkgaW52ZXJ0ICAgICAgIDExMSAgICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMAorZHFpbnYwMzEgaW52ZXJ0ICAgICAgICAxMSAgICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMAorZHFpbnYwMzIgaW52ZXJ0ICAgICAgICAgMSAgICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMAorZHFpbnYwMzMgaW52ZXJ0IDExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMAorZHFpbnYwMzQgaW52ZXJ0IDExMTExMTExMTExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMAorZHFpbnYwMzUgaW52ZXJ0IDExMTExMTExMTEgICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAwMAorZHFpbnYwMzYgaW52ZXJ0IDExMTExMTExMSAgICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMAorCitkcWludjA0MCBpbnZlcnQgMDExMTExMTExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMAorZHFpbnYwNDEgaW52ZXJ0IDEwMTExMTExMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMTAwMDAwMDAKK2RxaW52MDQyIGludmVydCAxMTAxMTExMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDAxMDAwMDAwCitkcWludjA0MyBpbnZlcnQgMTExMDExMTExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDEwMDAwMAorZHFpbnYwNDQgaW52ZXJ0IDExMTEwMTExMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMTAwMDAKK2RxaW52MDQ1IGludmVydCAxMTExMTAxMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAxMDAwCitkcWludjA0NiBpbnZlcnQgMTExMTExMDExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDEwMAorZHFpbnYwNDcgaW52ZXJ0IDExMTExMTEwMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMTAKK2RxaW52MDQ4IGludmVydCAxMTExMTExMTAgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAxCitkcWludjA0OSBpbnZlcnQgMDExMTExMDExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDEwMAorZHFpbnYwNTAgaW52ZXJ0IDEwMTExMTEwMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMTAwMDAwMTAKK2RxaW52MDUxIGludmVydCAxMTAxMTExMTAgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDAxMDAwMDAxCitkcWludjA1MiBpbnZlcnQgMTExMDExMTAxICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDEwMDAxMAorZHFpbnYwNTMgaW52ZXJ0IDExMTEwMTAxMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMTAxMDAKK2RxaW52MDU0IGludmVydCAxMTExMTAxMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAxMDAwCitkcWludjA1NSBpbnZlcnQgMTExMTAxMDExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAxMDEwMAorZHFpbnYwNTYgaW52ZXJ0IDExMTAxMTEwMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMDAxMDAwMTAKK2RxaW52MDU3IGludmVydCAxMTAxMTExMTAgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDAxMDAwMDAxCitkcWludjA1OCBpbnZlcnQgMTAxMTExMTAxICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAxMDAwMDAxMAorZHFpbnYwNTkgaW52ZXJ0IDAxMTExMTAxMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAxMDAKKworZHFpbnYwODAgaW52ZXJ0IDEwMDAwMDAwMTExMTExMTEgICAtPiAxMTExMTExMTExMTExMTExMTEwMTExMTExMTAwMDAwMDAwCitkcWludjA4MSBpbnZlcnQgMDEwMDAwMDEwMTExMTExMSAgIC0+IDExMTExMTExMTExMTExMTExMTEwMTExMTEwMTAwMDAwMDAKK2RxaW52MDgyIGludmVydCAwMDEwMDAwMTEwMTExMTExICAgLT4gMTExMTExMTExMTExMTExMTExMTEwMTExMTAwMTAwMDAwMAorZHFpbnYwODMgaW52ZXJ0IDAwMDEwMDAxMTEwMTExMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTEwMTExMDAwMTAwMDAwCitkcWludjA4NCBpbnZlcnQgMDAwMDEwMDExMTEwMTExMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTEwMTEwMDAwMTAwMDAKK2RxaW52MDg1IGludmVydCAwMDAwMDEwMTExMTEwMTExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTEwMTAwMDAwMTAwMAorZHFpbnYwODYgaW52ZXJ0IDAwMDAwMDExMTExMTEwMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMTAwCitkcWludjA4NyBpbnZlcnQgMDAwMDAxMDExMTExMTEwMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMDEwMDAwMDAwMTAKK2RxaW52MDg4IGludmVydCAwMDAwMTAwMTExMTExMTEwICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTAxMTAwMDAwMDAwMQorZHFpbnYwODkgaW52ZXJ0IDAwMDEwMDAwMTExMTEwMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTEwMTExMTAwMDAwMTAwCitkcWludjA5MCBpbnZlcnQgMDAxMDAwMDEwMTExMTEwMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMDExMTEwMTAwMDAwMTAKK2RxaW52MDkxIGludmVydCAwMTAwMDAwMTEwMTExMTEwICAgLT4gMTExMTExMTExMTExMTExMTExMTAxMTExMTAwMTAwMDAwMQorZHFpbnYwOTIgaW52ZXJ0IDEwMDAwMDAxMTEwMTExMDEgICAtPiAxMTExMTExMTExMTExMTExMTEwMTExMTExMDAwMTAwMDEwCitkcWludjA5MyBpbnZlcnQgMDEwMDAwMDExMTEwMTAxMSAgIC0+IDExMTExMTExMTExMTExMTExMTEwMTExMTEwMDAwMTAxMDAKK2RxaW52MDk0IGludmVydCAwMDEwMDAwMTExMTEwMTExICAgLT4gMTExMTExMTExMTExMTExMTExMTEwMTExMTAwMDAwMTAwMAorZHFpbnYwOTUgaW52ZXJ0IDAwMDEwMDAxMTExMDEwMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTEwMTExMDAwMDEwMTAwCitkcWludjA5NiBpbnZlcnQgMDAwMDEwMDExMTAxMTEwMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTEwMTEwMDAxMDAwMTAKK2RxaW52MDk3IGludmVydCAwMDAwMDEwMTEwMTExMTEwICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTEwMTAwMTAwMDAwMQorZHFpbnYwOTggaW52ZXJ0IDAwMDAwMDExMDExMTExMDEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTEwMDEwMDAwMDEwCitkcWludjA5OSBpbnZlcnQgMDAwMDAxMDAxMTExMTAxMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMDExMDAwMDAxMDAKKworLS0gYW5kIG1vcmUgdGhvcm91Z2ggTVNEL0xTRCB0ZXN0cyBbOCBhbmQgOSBtZ2h0IGJlIGVuY29kZWQgZGlmZmVyZW50bHkuLi5dCitkcWludjE1MSBpbnZlcnQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorZHFpbnYxNTIgaW52ZXJ0IDExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgICAgICAgICAgIDExMTExMTExMTExMTExMTEKK2RxaW52MTUzIGludmVydCAxMDAwMDAwMDAwMDAwMDAwMDAxMTExMTExMTExMTExMTExIC0+ICAgMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwCitkcWludjE1NCBpbnZlcnQgMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgICAgICAgICAgIDExMTExMTExMTExMTExMQorZHFpbnYxNTUgaW52ZXJ0IDAxMDAwMDAwMDAwMDAwMDAwMDAxMTExMTExMTExMTExMTEgLT4gIDEwMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAKK2RxaW52MTU2IGludmVydCAxMDExMTExMTExMTExMTExMTEwMTAwMDAwMDAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwMDAwMDAwMDAxMDExMTExMTExMTExMTExCitkcWludjE1NyBpbnZlcnQgMTEwMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMSAtPiAgICAxMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMAorZHFpbnYxNTggaW52ZXJ0IDExMTAxMTExMTExMTExMTExMTAwMTExMTExMTExMTExMTEgLT4gICAgIDEwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAKKworLS0gbm9uLTAvMSBzaG91bGQgbm90IGJlIGFjY2VwdGVkLCBub3Igc2hvdWxkIHNpZ25zCitkcWludjIyMCBpbnZlcnQgMTExMTExMTEyICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyMjEgaW52ZXJ0IDMzMzMzMzMzMyAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjIyIGludmVydCA1NTU1NTU1NTUgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjIyMyBpbnZlcnQgNzc3Nzc3Nzc3ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyMjQgaW52ZXJ0IDk5OTk5OTk5OSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjI1IGludmVydCAyMjIyMjIyMjIgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjIyNiBpbnZlcnQgNDQ0NDQ0NDQ0ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyMjcgaW52ZXJ0IDY2NjY2NjY2NiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjI4IGludmVydCA4ODg4ODg4ODggICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjIyOSBpbnZlcnQgOTk5OTk5OTk5ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyMzAgaW52ZXJ0IDk5OTk5OTk5OSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjMxIGludmVydCA5OTk5OTk5OTkgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjIzMiBpbnZlcnQgOTk5OTk5OTk5ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYSBmZXcgcmFuZG9tcworZHFpbnYyNDAgaW52ZXJ0ICA1Njc0Njg2ODkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjQxIGludmVydCAgNTY3MzY3Njg5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI0MiBpbnZlcnQgLTYzMTkxNzc3MiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyNDMgaW52ZXJ0IC03NTYyNTMyNTcgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjQ0IGludmVydCAgODM1NTkwMTQ5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRAorZHFpbnYyNTAgaW52ZXJ0ICAyMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjUxIGludmVydCAgMzAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI1MiBpbnZlcnQgIDQwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyNTMgaW52ZXJ0ICA1MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjU0IGludmVydCAgNjAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI1NSBpbnZlcnQgIDcwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyNTYgaW52ZXJ0ICA4MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjU3IGludmVydCAgOTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRC0xCitkcWludjI3MCBpbnZlcnQgIDAyMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyNzEgaW52ZXJ0ICAwMzAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjcyIGludmVydCAgMDQwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI3MyBpbnZlcnQgIDA1MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyNzQgaW52ZXJ0ICAxNjAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52Mjc1IGludmVydCAgMTcwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI3NiBpbnZlcnQgIDE4MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyNzcgaW52ZXJ0ICAxOTAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTFNECitkcWludjI4MCBpbnZlcnQgIDAwMTAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyODEgaW52ZXJ0ICAwMDAxMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjgyIGludmVydCAgMDAwMDAwMDExMTAwMDExMTAwMDExMTEwMDAwMDAwMDAwNCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI4MyBpbnZlcnQgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMTAwMDAwMDAwMDUgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyODQgaW52ZXJ0ICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDA2IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52Mjg1IGludmVydCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAwNyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI4NiBpbnZlcnQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAwMDAwMDggLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyODcgaW52ZXJ0ICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDA5IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTWlkZGllCitkcWludjI4OCBpbnZlcnQgIDAwMTAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMjAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyODkgaW52ZXJ0ICAwMDAxMDAwMTExMDAwMTExMDAwMTExMDAwMDMwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjkwIGludmVydCAgMDAwMDAwMDExMTAwMDExMTAwMDExMTEwMDA0MDAwMDAxMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI5MSBpbnZlcnQgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMTAwNTAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyOTIgaW52ZXJ0ICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAxMDYwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjkzIGludmVydCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDE3MDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI5NCBpbnZlcnQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwODAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyOTUgaW52ZXJ0ICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDkxMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHNpZ25zCitkcWludjI5NiBpbnZlcnQgLTEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52Mjk5IGludmVydCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAgLT4gIDExMTExMTAwMDExMTAwMDExMTAwMDExMTExMDExMTExMQorCistLSBObWF4LCBObWluLCBOdGlueS1saWtlCitkcWludjM0MSBpbnZlcnQgIDkuOTk5OTk5OTlFKzI5OTggIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYzNDIgaW52ZXJ0ICAxRS0yOTk4ICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MzQzIGludmVydCAgMS4wMDAwMDAwMEUtMjk5OCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjM0NCBpbnZlcnQgIDFFLTIwNzggICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYzNDUgaW52ZXJ0ICAtMUUtMjA3OCAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MzQ2IGludmVydCAgLTEuMDAwMDAwMDBFLTI5OTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjM0NyBpbnZlcnQgIC0xRS0yOTk4ICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYzNDggaW52ZXJ0ICAtOS45OTk5OTk5OUUrMjk5OCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQSBmZXcgb3RoZXIgbm9uLWludGVnZXJzCitkcWludjM2MSBpbnZlcnQgIDEuMCAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYzNjIgaW52ZXJ0ICAxRSsxICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MzYzIGludmVydCAgMC4wICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjM2NCBpbnZlcnQgIDBFKzEgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYzNjUgaW52ZXJ0ICA5LjkgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MzY2IGludmVydCAgOUUrMSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEFsbCBTcGVjaWFscyBhcmUgaW4gZXJyb3IKK2RxaW52Nzg4IGludmVydCAtSW5mICAgICAtPiBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWludjc5NCBpbnZlcnQgIEluZiAgICAgLT4gTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4MjEgaW52ZXJ0ICBOYU4gICAgIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxaW52ODQxIGludmVydCAgc05hTiAgICAtPiBOYU4gIEludmFsaWRfb3BlcmF0aW9uCistLSBwcm9wYWdhdGluZyBOYU5zCitkcWludjg2MSBpbnZlcnQgIE5hTjEgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg2MiBpbnZlcnQgK05hTjIgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg2MyBpbnZlcnQgIE5hTjMgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg2NCBpbnZlcnQgIE5hTjQgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg2NSBpbnZlcnQgIE5hTjUgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg3MSBpbnZlcnQgIHNOYU4xMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg3MiBpbnZlcnQgIHNOYU4xMiAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg3MyBpbnZlcnQgIHNOYU4xMyAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg3NCBpbnZlcnQgIHNOYU4xNCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg3NSBpbnZlcnQgIHNOYU4xNSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg3NiBpbnZlcnQgIE5hTjE2ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg4MSBpbnZlcnQgK05hTjI1ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg4MiBpbnZlcnQgLU5hTjI2ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg4MyBpbnZlcnQgLXNOYU4yNyAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTG9nQi5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUxvZ0IuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDlmM2RjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUxvZ0IuZGVjVGVzdApAQCAtMCwwICsxLDE2MCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcUxvZ0IuZGVjVGVzdCAtLSBpbnRlZ3JhbCA3NTRyIGFkanVzdGVkIGV4cG9uZW50LCBmb3IgZGVjUXVhZHMgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDA1LCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIGJhc2ljcworZHFsb2diMDAwIGxvZ2IgIDAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZHFsb2diMDAxIGxvZ2IgIDFFLTYxNzYgICAgICAgICAgIC0+IC02MTc2CitkcWxvZ2IwMDIgbG9nYiAgMUUtNjE0MyAgICAgICAgICAgLT4gLTYxNDMKK2RxbG9nYjAwMyBsb2diICAwLjAwMSAgICAgICAgICAgICAtPiAtMworZHFsb2diMDA0IGxvZ2IgIDAuMDMgICAgICAgICAgICAgIC0+IC0yCitkcWxvZ2IwMDUgbG9nYiAgMSAgICAgICAgICAgICAgICAgLT4gIDAKK2RxbG9nYjAwNiBsb2diICAyICAgICAgICAgICAgICAgICAtPiAgMAorZHFsb2diMDA3IGxvZ2IgIDIuNSAgICAgICAgICAgICAgIC0+ICAwCitkcWxvZ2IwMDggbG9nYiAgMi41MCAgICAgICAgICAgICAgLT4gIDAKK2RxbG9nYjAwOSBsb2diICAyLjUwMCAgICAgICAgICAgICAtPiAgMAorZHFsb2diMDEwIGxvZ2IgIDEwICAgICAgICAgICAgICAgIC0+ICAxCitkcWxvZ2IwMTEgbG9nYiAgNzAgICAgICAgICAgICAgICAgLT4gIDEKK2RxbG9nYjAxMiBsb2diICAxMDAgICAgICAgICAgICAgICAtPiAgMgorZHFsb2diMDEzIGxvZ2IgIDI1MCAgICAgICAgICAgICAgIC0+ICAyCitkcWxvZ2IwMTQgbG9nYiAgOUUrNjE0NCAgICAgICAgICAgLT4gIDYxNDQKK2RxbG9nYjAxNSBsb2diICtJbmZpbml0eSAgICAgICAgICAtPiAgSW5maW5pdHkKKworLS0gbmVnYXRpdmVzIGFwcGVhciB0byBiZSB0cmVhdGVkIGFzIHBvc2l0aXZlcworZHFsb2diMDIxIGxvZ2IgLTAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZHFsb2diMDIyIGxvZ2IgLTFFLTYxNzYgICAgICAgICAgIC0+IC02MTc2CitkcWxvZ2IwMjMgbG9nYiAtOUUtNjE0MyAgICAgICAgICAgLT4gLTYxNDMKK2RxbG9nYjAyNCBsb2diIC0wLjAwMSAgICAgICAgICAgICAtPiAtMworZHFsb2diMDI1IGxvZ2IgLTEgICAgICAgICAgICAgICAgIC0+ICAwCitkcWxvZ2IwMjYgbG9nYiAtMiAgICAgICAgICAgICAgICAgLT4gIDAKK2RxbG9nYjAyNyBsb2diIC0xMCAgICAgICAgICAgICAgICAtPiAgMQorZHFsb2diMDI4IGxvZ2IgLTcwICAgICAgICAgICAgICAgIC0+ICAxCitkcWxvZ2IwMjkgbG9nYiAtMTAwICAgICAgICAgICAgICAgLT4gIDIKK2RxbG9nYjAzMCBsb2diIC05RSs2MTQ0ICAgICAgICAgICAtPiAgNjE0NAorZHFsb2diMDMxIGxvZ2IgLUluZmluaXR5ICAgICAgICAgIC0+ICBJbmZpbml0eQorCistLSB6ZXJvcworZHFsb2diMTExIGxvZ2IgICAgICAgICAgMCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZHFsb2diMTEyIGxvZ2IgICAgICAgICAtMCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZHFsb2diMTEzIGxvZ2IgICAgICAgMEUrNCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZHFsb2diMTE0IGxvZ2IgICAgICAtMEUrNCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZHFsb2diMTE1IGxvZ2IgICAgIDAuMDAwMCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZHFsb2diMTE2IGxvZ2IgICAgLTAuMDAwMCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZHFsb2diMTE3IGxvZ2IgICAgICAwRS0xNDEgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZHFsb2diMTE4IGxvZ2IgICAgIC0wRS0xNDEgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZHFsb2diMTIxIGxvZ2IgICAyNjgyNjgyNjggICAgICAgIC0+IDgKK2RxbG9nYjEyMiBsb2diICAtMjY4MjY4MjY4ICAgICAgICAtPiA4CitkcWxvZ2IxMjMgbG9nYiAgIDEzNDEzNDEzNCAgICAgICAgLT4gOAorZHFsb2diMTI0IGxvZ2IgIC0xMzQxMzQxMzQgICAgICAgIC0+IDgKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RxbG9nYjEzMSBsb2diICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC0+ICA2MTQ0CitkcWxvZ2IxMzIgbG9nYiAgMUUtNjE0MyAgICAgICAgICAgICAgICAgICAtPiAtNjE0MworZHFsb2diMTMzIGxvZ2IgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgLT4gLTYxNDMKK2RxbG9nYjEzNCBsb2diICAxRS02MTc2ICAgICAgICAgICAgICAgICAgIC0+IC02MTc2CisKK2RxbG9nYjEzNSBsb2diICAtMUUtNjE3NiAgICAgICAgICAgICAgICAgIC0+IC02MTc2CitkcWxvZ2IxMzYgbG9nYiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAtNjE0MworZHFsb2diMTM3IGxvZ2IgIC0xRS02MTQzICAgICAgICAgICAgICAgICAgLT4gLTYxNDMKK2RxbG9nYjE2MTQgbG9nYiAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAgNjE0NAorCistLSBvbmVzCitkcWxvZ2IwMDYxIGxvZ2IgIDEgICAgICAgICAgICAgICAgIC0+ICAgMAorZHFsb2diMDA2MiBsb2diICAxLjAgICAgICAgICAgICAgICAtPiAgIDAKK2RxbG9nYjAwNjMgbG9nYiAgMS4wMDAwMDAwMDAwMDAwMDAgLT4gICAwCisKKy0tIG5vdGFibGUgY2FzZXMgLS0gZXhhY3QgcG93ZXJzIG9mIDEwCitkcWxvZ2IxMTAwIGxvZ2IgMSAgICAgICAgICAgICAtPiAwCitkcWxvZ2IxMTAxIGxvZ2IgMTAgICAgICAgICAgICAtPiAxCitkcWxvZ2IxMTAyIGxvZ2IgMTAwICAgICAgICAgICAtPiAyCitkcWxvZ2IxMTAzIGxvZ2IgMTAwMCAgICAgICAgICAtPiAzCitkcWxvZ2IxMTA0IGxvZ2IgMTAwMDAgICAgICAgICAtPiA0CitkcWxvZ2IxMTA1IGxvZ2IgMTAwMDAwICAgICAgICAtPiA1CitkcWxvZ2IxMTA2IGxvZ2IgMTAwMDAwMCAgICAgICAtPiA2CitkcWxvZ2IxMTA3IGxvZ2IgMTAwMDAwMDAgICAgICAtPiA3CitkcWxvZ2IxMTA4IGxvZ2IgMTAwMDAwMDAwICAgICAtPiA4CitkcWxvZ2IxMTA5IGxvZ2IgMTAwMDAwMDAwMCAgICAtPiA5CitkcWxvZ2IxMTEwIGxvZ2IgMTAwMDAwMDAwMDAgICAtPiAxMAorZHFsb2diMTExMSBsb2diIDEwMDAwMDAwMDAwMCAgLT4gMTEKK2RxbG9nYjExMTIgbG9nYiAxMDAwMDAwMDAwMDAwIC0+IDEyCitkcWxvZ2IxMTEzIGxvZ2IgMC4wMDAwMDAwMDAwMSAtPiAtMTEKK2RxbG9nYjExMTQgbG9nYiAwLjAwMDAwMDAwMDEgLT4gLTEwCitkcWxvZ2IxMTE1IGxvZ2IgMC4wMDAwMDAwMDEgLT4gLTkKK2RxbG9nYjExMTYgbG9nYiAwLjAwMDAwMDAxIC0+IC04CitkcWxvZ2IxMTE3IGxvZ2IgMC4wMDAwMDAxIC0+IC03CitkcWxvZ2IxMTE4IGxvZ2IgMC4wMDAwMDEgLT4gLTYKK2RxbG9nYjExMTkgbG9nYiAwLjAwMDAxIC0+IC01CitkcWxvZ2IxMTIwIGxvZ2IgMC4wMDAxIC0+IC00CitkcWxvZ2IxMTIxIGxvZ2IgMC4wMDEgLT4gLTMKK2RxbG9nYjExMjIgbG9nYiAwLjAxIC0+IC0yCitkcWxvZ2IxMTIzIGxvZ2IgMC4xIC0+IC0xCitkcWxvZ2IxMTI0IGxvZ2IgMUUtOTkgIC0+IC05OQorZHFsb2diMTEyNSBsb2diIDFFLTEwMCAtPiAtMTAwCitkcWxvZ2IxMTI3IGxvZ2IgMUUtMjk5IC0+IC0yOTkKK2RxbG9nYjExMjYgbG9nYiAxRS02MTQzIC0+IC02MTQzCisKKy0tIHN1Z2dlc3Rpb25zIGZyb20gSWxhbiBOZWhhbWEKK2RxbG9nYjE0MDAgbG9nYiAxMEUtMyAgICAtPiAtMgorZHFsb2diMTQwMSBsb2diIDEwRS0yICAgIC0+IC0xCitkcWxvZ2IxNDAyIGxvZ2IgMTAwRS0yICAgLT4gIDAKK2RxbG9nYjE0MDMgbG9nYiAxMDAwRS0yICAtPiAgMQorZHFsb2diMTQwNCBsb2diIDEwMDAwRS0yIC0+ICAyCitkcWxvZ2IxNDA1IGxvZ2IgMTBFLTEgICAgLT4gIDAKK2RxbG9nYjE0MDYgbG9nYiAxMDBFLTEgICAtPiAgMQorZHFsb2diMTQwNyBsb2diIDEwMDBFLTEgIC0+ICAyCitkcWxvZ2IxNDA4IGxvZ2IgMTAwMDBFLTEgLT4gIDMKK2RxbG9nYjE0MDkgbG9nYiAxMEUwICAgICAtPiAgMQorZHFsb2diMTQxMCBsb2diIDEwMEUwICAgIC0+ICAyCitkcWxvZ2IxNDExIGxvZ2IgMTAwMEUwICAgLT4gIDMKK2RxbG9nYjE0MTIgbG9nYiAxMDAwMEUwICAtPiAgNAorZHFsb2diMTQxMyBsb2diIDEwRTEgICAgIC0+ICAyCitkcWxvZ2IxNDE0IGxvZ2IgMTAwRTEgICAgLT4gIDMKK2RxbG9nYjE0MTUgbG9nYiAxMDAwRTEgICAtPiAgNAorZHFsb2diMTQxNiBsb2diIDEwMDAwRTEgIC0+ICA1CitkcWxvZ2IxNDE3IGxvZ2IgMTBFMiAgICAgLT4gIDMKK2RxbG9nYjE0MTggbG9nYiAxMDBFMiAgICAtPiAgNAorZHFsb2diMTQxOSBsb2diIDEwMDBFMiAgIC0+ICA1CitkcWxvZ2IxNDIwIGxvZ2IgMTAwMDBFMiAgLT4gIDYKKworLS0gc3BlY2lhbCB2YWx1ZXMKK2RxbG9nYjgyMCAgbG9nYiAgIEluZmluaXR5IC0+ICAgSW5maW5pdHkKK2RxbG9nYjgyMSAgbG9nYiAgIDAgICAgICAgIC0+ICAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFsb2diODIyICBsb2diICAgTmFOICAgICAgLT4gICBOYU4KK2RxbG9nYjgyMyAgbG9nYiAgIHNOYU4gICAgIC0+ICAgTmFOICAgICBJbnZhbGlkX29wZXJhdGlvbgorLS0gcHJvcGFnYXRpbmcgTmFOcworZHFsb2diODI0ICBsb2diICAgc05hTjEyMyAgLT4gICBOYU4xMjMgIEludmFsaWRfb3BlcmF0aW9uCitkcWxvZ2I4MjUgIGxvZ2IgICAtc05hTjMyMSAtPiAgLU5hTjMyMSAgSW52YWxpZF9vcGVyYXRpb24KK2RxbG9nYjgyNiAgbG9nYiAgIE5hTjQ1NiAgIC0+ICAgTmFONDU2CitkcWxvZ2I4MjcgIGxvZ2IgICAtTmFONjU0ICAtPiAgLU5hTjY1NAorZHFsb2diODI4ICBsb2diICAgTmFOMSAgICAgLT4gICBOYU4xCisKKy0tIE51bGwgdGVzdAorZHFsb2diOTAwICBsb2diICMgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWF4LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWF4LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyZDRiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFNYXguZGVjVGVzdApAQCAtMCwwICsxLDMyMiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcU1heC5kZWNUZXN0IC0tIGRlY1F1YWQgbWF4bnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIHdlIGFzc3VtZSB0aGF0IGJhc2UgY29tcGFyaXNvbiBpcyB0ZXN0ZWQgaW4gY29tcGFyZS5kZWNUZXN0LCBzbworLS0gdGhlc2UgbWFpbmx5IGNvdmVyIHNwZWNpYWwgY2FzZXMgYW5kIHJvdW5kaW5nCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkcW1heDAwMSBtYXggIC0yICAtMiAgLT4gLTIKK2RxbWF4MDAyIG1heCAgLTIgIC0xICAtPiAtMQorZHFtYXgwMDMgbWF4ICAtMiAgIDAgIC0+ICAwCitkcW1heDAwNCBtYXggIC0yICAgMSAgLT4gIDEKK2RxbWF4MDA1IG1heCAgLTIgICAyICAtPiAgMgorZHFtYXgwMDYgbWF4ICAtMSAgLTIgIC0+IC0xCitkcW1heDAwNyBtYXggIC0xICAtMSAgLT4gLTEKK2RxbWF4MDA4IG1heCAgLTEgICAwICAtPiAgMAorZHFtYXgwMDkgbWF4ICAtMSAgIDEgIC0+ICAxCitkcW1heDAxMCBtYXggIC0xICAgMiAgLT4gIDIKK2RxbWF4MDExIG1heCAgIDAgIC0yICAtPiAgMAorZHFtYXgwMTIgbWF4ICAgMCAgLTEgIC0+ICAwCitkcW1heDAxMyBtYXggICAwICAgMCAgLT4gIDAKK2RxbWF4MDE0IG1heCAgIDAgICAxICAtPiAgMQorZHFtYXgwMTUgbWF4ICAgMCAgIDIgIC0+ICAyCitkcW1heDAxNiBtYXggICAxICAtMiAgLT4gIDEKK2RxbWF4MDE3IG1heCAgIDEgIC0xICAtPiAgMQorZHFtYXgwMTggbWF4ICAgMSAgIDAgIC0+ICAxCitkcW1heDAxOSBtYXggICAxICAgMSAgLT4gIDEKK2RxbWF4MDIwIG1heCAgIDEgICAyICAtPiAgMgorZHFtYXgwMjEgbWF4ICAgMiAgLTIgIC0+ICAyCitkcW1heDAyMiBtYXggICAyICAtMSAgLT4gIDIKK2RxbWF4MDIzIG1heCAgIDIgICAwICAtPiAgMgorZHFtYXgwMjUgbWF4ICAgMiAgIDEgIC0+ICAyCitkcW1heDAyNiBtYXggICAyICAgMiAgLT4gIDIKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RxbWF4MDMwIG1heCAgIDAgICAgIDAgICAtPiAgMAorZHFtYXgwMzEgbWF4ICAgMCAgICAtMCAgIC0+ICAwCitkcW1heDAzMiBtYXggICAwICAgIC0wLjAgLT4gIDAKK2RxbWF4MDMzIG1heCAgIDAgICAgIDAuMCAtPiAgMAorZHFtYXgwMzQgbWF4ICAtMCAgICAgMCAgIC0+ICAwICAgIC0tIG5vdGU6IC0wID0gMCwgYnV0IDAgY2hvc2VuCitkcW1heDAzNSBtYXggIC0wICAgIC0wICAgLT4gLTAKK2RxbWF4MDM2IG1heCAgLTAgICAgLTAuMCAtPiAtMC4wCitkcW1heDAzNyBtYXggIC0wICAgICAwLjAgLT4gIDAuMAorZHFtYXgwMzggbWF4ICAgMC4wICAgMCAgIC0+ICAwCitkcW1heDAzOSBtYXggICAwLjAgIC0wICAgLT4gIDAuMAorZHFtYXgwNDAgbWF4ICAgMC4wICAtMC4wIC0+ICAwLjAKK2RxbWF4MDQxIG1heCAgIDAuMCAgIDAuMCAtPiAgMC4wCitkcW1heDA0MiBtYXggIC0wLjAgICAwICAgLT4gIDAKK2RxbWF4MDQzIG1heCAgLTAuMCAgLTAgICAtPiAtMC4wCitkcW1heDA0NCBtYXggIC0wLjAgIC0wLjAgLT4gLTAuMAorZHFtYXgwNDUgbWF4ICAtMC4wICAgMC4wIC0+ICAwLjAKKworZHFtYXgwNTAgbWF4ICAtMEUxICAgMEUxIC0+ICAwRSsxCitkcW1heDA1MSBtYXggIC0wRTIgICAwRTIgLT4gIDBFKzIKK2RxbWF4MDUyIG1heCAgLTBFMiAgIDBFMSAtPiAgMEUrMQorZHFtYXgwNTMgbWF4ICAtMEUxICAgMEUyIC0+ICAwRSsyCitkcW1heDA1NCBtYXggICAwRTEgIC0wRTEgLT4gIDBFKzEKK2RxbWF4MDU1IG1heCAgIDBFMiAgLTBFMiAtPiAgMEUrMgorZHFtYXgwNTYgbWF4ICAgMEUyICAtMEUxIC0+ICAwRSsyCitkcW1heDA1NyBtYXggICAwRTEgIC0wRTIgLT4gIDBFKzEKKworZHFtYXgwNTggbWF4ICAgMEUxICAgMEUxIC0+ICAwRSsxCitkcW1heDA1OSBtYXggICAwRTIgICAwRTIgLT4gIDBFKzIKK2RxbWF4MDYwIG1heCAgIDBFMiAgIDBFMSAtPiAgMEUrMgorZHFtYXgwNjEgbWF4ICAgMEUxICAgMEUyIC0+ICAwRSsyCitkcW1heDA2MiBtYXggIC0wRTEgIC0wRTEgLT4gLTBFKzEKK2RxbWF4MDYzIG1heCAgLTBFMiAgLTBFMiAtPiAtMEUrMgorZHFtYXgwNjQgbWF4ICAtMEUyICAtMEUxIC0+IC0wRSsxCitkcW1heDA2NSBtYXggIC0wRTEgIC0wRTIgLT4gLTBFKzEKKworLS0gU3BlY2lhbHMKK2RxbWF4MDkwIG1heCAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CitkcW1heDA5MSBtYXggIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZHFtYXgwOTIgbWF4ICBJbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RxbWF4MDkzIG1heCAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkcW1heDA5NCBtYXggIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZHFtYXgwOTUgbWF4ICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2RxbWF4MDk2IG1heCAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkcW1heDA5NyBtYXggIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFtYXgwOTggbWF4IC0xMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbWF4MDk5IG1heCAtSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkcW1heDEwMCBtYXggLTEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFtYXgxMDEgbWF4IC0wICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbWF4MTAyIG1heCAgMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcW1heDEwMyBtYXggIDEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFtYXgxMDQgbWF4ICAxMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbWF4MTA1IG1heCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RxbWF4MTIwIG1heCAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkcW1heDEyMSBtYXggLUluZiAgLTEwMDAgIC0+IC0xMDAwCitkcW1heDEyMiBtYXggLUluZiAgLTEgICAgIC0+IC0xCitkcW1heDEyMyBtYXggLUluZiAgLTAgICAgIC0+IC0wCitkcW1heDEyNCBtYXggLUluZiAgIDAgICAgIC0+ICAwCitkcW1heDEyNSBtYXggLUluZiAgIDEgICAgIC0+ICAxCitkcW1heDEyNiBtYXggLUluZiAgIDEwMDAgIC0+ICAxMDAwCitkcW1heDEyNyBtYXggLUluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFtYXgxMjggbWF4IC1JbmYgIC1JbmYgICAtPiAgLUluZmluaXR5CitkcW1heDEyOSBtYXggLTEwMDAgLUluZiAgIC0+ICAtMTAwMAorZHFtYXgxMzAgbWF4IC0xICAgIC1JbmYgICAtPiAgLTEKK2RxbWF4MTMxIG1heCAtMCAgICAtSW5mICAgLT4gIC0wCitkcW1heDEzMiBtYXggIDAgICAgLUluZiAgIC0+ICAwCitkcW1heDEzMyBtYXggIDEgICAgLUluZiAgIC0+ICAxCitkcW1heDEzNCBtYXggIDEwMDAgLUluZiAgIC0+ICAxMDAwCitkcW1heDEzNSBtYXggIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorCistLSAyMDA0LjA4LjAyIDc1NHIgY2hvb3NlcyBudW1iZXIgb3ZlciBOYU4gaW4gbWl4ZWQgY2FzZXMKK2RxbWF4MTQxIG1heCAgTmFOIC1JbmYgICAgLT4gLUluZmluaXR5CitkcW1heDE0MiBtYXggIE5hTiAtMTAwMCAgIC0+IC0xMDAwCitkcW1heDE0MyBtYXggIE5hTiAtMSAgICAgIC0+IC0xCitkcW1heDE0NCBtYXggIE5hTiAtMCAgICAgIC0+IC0wCitkcW1heDE0NSBtYXggIE5hTiAgMCAgICAgIC0+ICAwCitkcW1heDE0NiBtYXggIE5hTiAgMSAgICAgIC0+ICAxCitkcW1heDE0NyBtYXggIE5hTiAgMTAwMCAgIC0+ICAxMDAwCitkcW1heDE0OCBtYXggIE5hTiAgSW5mICAgIC0+ICBJbmZpbml0eQorZHFtYXgxNDkgbWF4ICBOYU4gIE5hTiAgICAtPiAgTmFOCitkcW1heDE1MCBtYXggLUluZiAgTmFOICAgIC0+IC1JbmZpbml0eQorZHFtYXgxNTEgbWF4IC0xMDAwIE5hTiAgICAtPiAtMTAwMAorZHFtYXgxNTIgbWF4IC0xICAgIE5hTiAgICAtPiAtMQorZHFtYXgxNTMgbWF4IC0wICAgIE5hTiAgICAtPiAtMAorZHFtYXgxNTQgbWF4ICAwICAgIE5hTiAgICAtPiAgMAorZHFtYXgxNTUgbWF4ICAxICAgIE5hTiAgICAtPiAgMQorZHFtYXgxNTYgbWF4ICAxMDAwIE5hTiAgICAtPiAgMTAwMAorZHFtYXgxNTcgbWF4ICBJbmYgIE5hTiAgICAtPiAgSW5maW5pdHkKKworZHFtYXgxNjEgbWF4ICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNjIgbWF4ICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNjMgbWF4ICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNjQgbWF4ICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNjUgbWF4ICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNjYgbWF4ICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNjcgbWF4ICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNjggbWF4ICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNjkgbWF4ICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNzAgbWF4ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNzEgbWF4IC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNzIgbWF4IC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNzMgbWF4IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNzQgbWF4IC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNzUgbWF4ICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNzYgbWF4ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNzcgbWF4ICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNzggbWF4ICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxNzkgbWF4ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcW1heDE4MSBtYXggIE5hTjkgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbWF4MTgyIG1heCAgTmFOOCAgICAgOSAgIC0+ICA5CitkcW1heDE4MyBtYXggLU5hTjcgICBJbmYgICAtPiAgSW5maW5pdHkKKworZHFtYXgxODQgbWF4IC1OYU4xICAgTmFOMTEgLT4gLU5hTjEKK2RxbWF4MTg1IG1heCAgTmFOMiAgIE5hTjEyIC0+ICBOYU4yCitkcW1heDE4NiBtYXggLU5hTjEzIC1OYU43ICAtPiAtTmFOMTMKK2RxbWF4MTg3IG1heCAgTmFOMTQgLU5hTjUgIC0+ICBOYU4xNAorCitkcW1heDE4OCBtYXggLUluZiAgICBOYU40ICAtPiAtSW5maW5pdHkKK2RxbWF4MTg5IG1heCAtOSAgICAgLU5hTjMgIC0+IC05CitkcW1heDE5MCBtYXggIEluZiAgICBOYU4yICAtPiAgSW5maW5pdHkKKworZHFtYXgxOTEgbWF4ICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTkyIG1heCAgc05hTjk4IC0xICAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkcW1heDE5MyBtYXggLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxOTQgbWF4ICBzTmFOOTYgc05hTjk0ICAtPiAgTmFOOTYgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTk1IG1heCAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkcW1heDE5NiBtYXggLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxOTcgbWF4ICAwICAgICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTk4IG1heCAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkcW1heDE5OSBtYXggIE5hTiAgICBzTmFOODkgIC0+ICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvbGQgcm91bmRpbmcgY2hlY2tzCitkcW1heDIyMSBtYXggMTIzNDU2NzgwMDAgMSAgLT4gMTIzNDU2NzgwMDAKK2RxbWF4MjIyIG1heCAxIDEyMzQ1Njc4MDAwICAtPiAxMjM0NTY3ODAwMAorZHFtYXgyMjMgbWF4IDEyMzQ1Njc4MDAgIDEgIC0+IDEyMzQ1Njc4MDAKK2RxbWF4MjI0IG1heCAxIDEyMzQ1Njc4MDAgICAtPiAxMjM0NTY3ODAwCitkcW1heDIyNSBtYXggMTIzNDU2Nzg5MCAgMSAgLT4gMTIzNDU2Nzg5MAorZHFtYXgyMjYgbWF4IDEgMTIzNDU2Nzg5MCAgIC0+IDEyMzQ1Njc4OTAKK2RxbWF4MjI3IG1heCAxMjM0NTY3ODkxICAxICAtPiAxMjM0NTY3ODkxCitkcW1heDIyOCBtYXggMSAxMjM0NTY3ODkxICAgLT4gMTIzNDU2Nzg5MQorZHFtYXgyMjkgbWF4IDEyMzQ1Njc4OTAxIDEgIC0+IDEyMzQ1Njc4OTAxCitkcW1heDIzMCBtYXggMSAxMjM0NTY3ODkwMSAgLT4gMTIzNDU2Nzg5MDEKK2RxbWF4MjMxIG1heCAxMjM0NTY3ODk2ICAxICAtPiAxMjM0NTY3ODk2CitkcW1heDIzMiBtYXggMSAxMjM0NTY3ODk2ICAgLT4gMTIzNDU2Nzg5NgorZHFtYXgyMzMgbWF4IC0xMjM0NTY3ODkxICAxIC0+IDEKK2RxbWF4MjM0IG1heCAxIC0xMjM0NTY3ODkxICAtPiAxCitkcW1heDIzNSBtYXggLTEyMzQ1Njc4OTAxIDEgLT4gMQorZHFtYXgyMzYgbWF4IDEgLTEyMzQ1Njc4OTAxIC0+IDEKK2RxbWF4MjM3IG1heCAtMTIzNDU2Nzg5NiAgMSAtPiAxCitkcW1heDIzOCBtYXggMSAtMTIzNDU2Nzg5NiAgLT4gMQorCistLSBmcm9tIGV4YW1wbGVzCitkcW1heDI4MCBtYXggJzMnICAgJzInICAtPiAgJzMnCitkcW1heDI4MSBtYXggJy0xMCcgJzMnICAtPiAgJzMnCitkcW1heDI4MiBtYXggJzEuMCcgJzEnICAtPiAgJzEnCitkcW1heDI4MyBtYXggJzEnICcxLjAnICAtPiAgJzEnCitkcW1heDI4NCBtYXggJzcnICdOYU4nICAtPiAgJzcnCisKKy0tIGV4cGFuZGVkIGxpc3QgZnJvbSBtaW4vbWF4IDc1NHIgcHVycGxlIHByb3NlCistLSBbZXhwbGljaXQgdGVzdHMgZm9yIGV4cG9uZW50IG9yZGVyaW5nXQorZHFtYXg0MDEgbWF4ICBJbmYgICAgMS4xICAgICAtPiAgSW5maW5pdHkKK2RxbWF4NDAyIG1heCAgMS4xICAgIDEgICAgICAgLT4gIDEuMQorZHFtYXg0MDMgbWF4ICAxICAgICAgMS4wICAgICAtPiAgMQorZHFtYXg0MDQgbWF4ICAxLjAgICAgMC4xICAgICAtPiAgMS4wCitkcW1heDQwNSBtYXggIDAuMSAgICAwLjEwICAgIC0+ICAwLjEKK2RxbWF4NDA2IG1heCAgMC4xMCAgIDAuMTAwICAgLT4gIDAuMTAKK2RxbWF4NDA3IG1heCAgMC4xMCAgIDAgICAgICAgLT4gIDAuMTAKK2RxbWF4NDA4IG1heCAgMCAgICAgIDAuMCAgICAgLT4gIDAKK2RxbWF4NDA5IG1heCAgMC4wICAgLTAgICAgICAgLT4gIDAuMAorZHFtYXg0MTAgbWF4ICAwLjAgICAtMC4wICAgICAtPiAgMC4wCitkcW1heDQxMSBtYXggIDAuMDAgIC0wLjAgICAgIC0+ICAwLjAwCitkcW1heDQxMiBtYXggIDAuMCAgIC0wLjAwICAgIC0+ICAwLjAKK2RxbWF4NDEzIG1heCAgMCAgICAgLTAuMCAgICAgLT4gIDAKK2RxbWF4NDE0IG1heCAgMCAgICAgLTAgICAgICAgLT4gIDAKK2RxbWF4NDE1IG1heCAtMC4wICAgLTAgICAgICAgLT4gLTAuMAorZHFtYXg0MTYgbWF4IC0wICAgICAtMC4xMDAgICAtPiAtMAorZHFtYXg0MTcgbWF4IC0wLjEwMCAtMC4xMCAgICAtPiAtMC4xMDAKK2RxbWF4NDE4IG1heCAtMC4xMCAgLTAuMSAgICAgLT4gLTAuMTAKK2RxbWF4NDE5IG1heCAtMC4xICAgLTEuMCAgICAgLT4gLTAuMQorZHFtYXg0MjAgbWF4IC0xLjAgICAtMSAgICAgICAtPiAtMS4wCitkcW1heDQyMSBtYXggLTEgICAgIC0xLjEgICAgIC0+IC0xCitkcW1heDQyMyBtYXggLTEuMSAgIC1JbmYgICAgIC0+IC0xLjEKKy0tIHNhbWUgd2l0aCBvcGVyYW5kcyByZXZlcnNlZAorZHFtYXg0MzEgbWF4ICAxLjEgICAgSW5mICAgICAtPiAgSW5maW5pdHkKK2RxbWF4NDMyIG1heCAgMSAgICAgIDEuMSAgICAgLT4gIDEuMQorZHFtYXg0MzMgbWF4ICAxLjAgICAgMSAgICAgICAtPiAgMQorZHFtYXg0MzQgbWF4ICAwLjEgICAgMS4wICAgICAtPiAgMS4wCitkcW1heDQzNSBtYXggIDAuMTAgICAwLjEgICAgIC0+ICAwLjEKK2RxbWF4NDM2IG1heCAgMC4xMDAgIDAuMTAgICAgLT4gIDAuMTAKK2RxbWF4NDM3IG1heCAgMCAgICAgIDAuMTAgICAgLT4gIDAuMTAKK2RxbWF4NDM4IG1heCAgMC4wICAgIDAgICAgICAgLT4gIDAKK2RxbWF4NDM5IG1heCAtMCAgICAgIDAuMCAgICAgLT4gIDAuMAorZHFtYXg0NDAgbWF4IC0wLjAgICAgMC4wICAgICAtPiAgMC4wCitkcW1heDQ0MSBtYXggLTAuMCAgICAwLjAwICAgIC0+ICAwLjAwCitkcW1heDQ0MiBtYXggLTAuMDAgICAwLjAgICAgIC0+ICAwLjAKK2RxbWF4NDQzIG1heCAtMC4wICAgIDAgICAgICAgLT4gIDAKK2RxbWF4NDQ0IG1heCAtMCAgICAgIDAgICAgICAgLT4gIDAKK2RxbWF4NDQ1IG1heCAtMCAgICAgLTAuMCAgICAgLT4gLTAuMAorZHFtYXg0NDYgbWF4IC0wLjEwMCAtMCAgICAgICAtPiAtMAorZHFtYXg0NDcgbWF4IC0wLjEwICAtMC4xMDAgICAtPiAtMC4xMDAKK2RxbWF4NDQ4IG1heCAtMC4xICAgLTAuMTAgICAgLT4gLTAuMTAKK2RxbWF4NDQ5IG1heCAtMS4wICAgLTAuMSAgICAgLT4gLTAuMQorZHFtYXg0NTAgbWF4IC0xICAgICAtMS4wICAgICAtPiAtMS4wCitkcW1heDQ1MSBtYXggLTEuMSAgIC0xICAgICAgIC0+IC0xCitkcW1heDQ1MyBtYXggLUluZiAgIC0xLjEgICAgIC0+IC0xLjEKKy0tIGxhcmdpZXMKK2RxbWF4NDYwIG1heCAgMTAwMCAgIDFFKzMgICAgLT4gIDFFKzMKK2RxbWF4NDYxIG1heCAgMUUrMyAgIDEwMDAgICAgLT4gIDFFKzMKK2RxbWF4NDYyIG1heCAgMTAwMCAgLTFFKzMgICAgLT4gIDEwMDAKK2RxbWF4NDYzIG1heCAgMUUrMyAgLTEwMDAgICAgLT4gIDFFKzMKK2RxbWF4NDY0IG1heCAtMTAwMCAgIDFFKzMgICAgLT4gIDFFKzMKK2RxbWF4NDY1IG1heCAtMUUrMyAgIDEwMDAgICAgLT4gIDEwMDAKK2RxbWF4NDY2IG1heCAtMTAwMCAgLTFFKzMgICAgLT4gLTEwMDAKK2RxbWF4NDY3IG1heCAtMUUrMyAgLTEwMDAgICAgLT4gLTEwMDAKKworLS0gbWlzYWxpZ25tZW50IHRyYXBzIGZvciBsaXR0bGUtZW5kaWFuCitkcW1heDQ3MSBtYXggICAgICAxLjAgICAgICAgMC4xICAtPiAxLjAKK2RxbWF4NDcyIG1heCAgICAgIDAuMSAgICAgICAxLjAgIC0+IDEuMAorZHFtYXg0NzMgbWF4ICAgICAxMC4wICAgICAgIDAuMSAgLT4gMTAuMAorZHFtYXg0NzQgbWF4ICAgICAgMC4xICAgICAgMTAuMCAgLT4gMTAuMAorZHFtYXg0NzUgbWF4ICAgICAgMTAwICAgICAgIDEuMCAgLT4gMTAwCitkcW1heDQ3NiBtYXggICAgICAxLjAgICAgICAgMTAwICAtPiAxMDAKK2RxbWF4NDc3IG1heCAgICAgMTAwMCAgICAgIDEwLjAgIC0+IDEwMDAKK2RxbWF4NDc4IG1heCAgICAgMTAuMCAgICAgIDEwMDAgIC0+IDEwMDAKK2RxbWF4NDc5IG1heCAgICAxMDAwMCAgICAgMTAwLjAgIC0+IDEwMDAwCitkcW1heDQ4MCBtYXggICAgMTAwLjAgICAgIDEwMDAwICAtPiAxMDAwMAorZHFtYXg0ODEgbWF4ICAgMTAwMDAwICAgIDEwMDAuMCAgLT4gMTAwMDAwCitkcW1heDQ4MiBtYXggICAxMDAwLjAgICAgMTAwMDAwICAtPiAxMDAwMDAKK2RxbWF4NDgzIG1heCAgMTAwMDAwMCAgIDEwMDAwLjAgIC0+IDEwMDAwMDAKK2RxbWF4NDg0IG1heCAgMTAwMDAuMCAgIDEwMDAwMDAgIC0+IDEwMDAwMDAKKworLS0gc3Vibm9ybWFscworZHFtYXg1MTAgbWF4ICAxLjAwRS02MTQzICAgICAgIDAgIC0+ICAgMS4wMEUtNjE0MworZHFtYXg1MTEgbWF4ICAwLjFFLTYxNDMgICAgICAgIDAgIC0+ICAgMUUtNjE0NCAgICBTdWJub3JtYWwKK2RxbWF4NTEyIG1heCAgMC4xMEUtNjE0MyAgICAgICAwICAtPiAgIDEuMEUtNjE0NCAgU3Vibm9ybWFsCitkcW1heDUxMyBtYXggIDAuMTAwRS02MTQzICAgICAgMCAgLT4gICAxLjAwRS02MTQ0IFN1Ym5vcm1hbAorZHFtYXg1MTQgbWF4ICAwLjAxRS02MTQzICAgICAgIDAgIC0+ICAgMUUtNjE0NSAgICBTdWJub3JtYWwKK2RxbWF4NTE1IG1heCAgMC45OTlFLTYxNDMgICAgICAwICAtPiAgIDkuOTlFLTYxNDQgU3Vibm9ybWFsCitkcW1heDUxNiBtYXggIDAuMDk5RS02MTQzICAgICAgMCAgLT4gICA5LjlFLTYxNDUgIFN1Ym5vcm1hbAorZHFtYXg1MTcgbWF4ICAwLjAwOUUtNjE0MyAgICAgIDAgIC0+ICAgOUUtNjE0NiAgICBTdWJub3JtYWwKK2RxbWF4NTE4IG1heCAgMC4wMDFFLTYxNDMgICAgICAwICAtPiAgIDFFLTYxNDYgICAgU3Vibm9ybWFsCitkcW1heDUxOSBtYXggIDAuMDAwOUUtNjE0MyAgICAgMCAgLT4gICA5RS02MTQ3ICAgIFN1Ym5vcm1hbAorZHFtYXg1MjAgbWF4ICAwLjAwMDFFLTYxNDMgICAgIDAgIC0+ICAgMUUtNjE0NyAgICBTdWJub3JtYWwKKworZHFtYXg1MzAgbWF4IC0xLjAwRS02MTQzICAgICAgIDAgIC0+ICAgMAorZHFtYXg1MzEgbWF4IC0wLjFFLTYxNDMgICAgICAgIDAgIC0+ICAgMAorZHFtYXg1MzIgbWF4IC0wLjEwRS02MTQzICAgICAgIDAgIC0+ICAgMAorZHFtYXg1MzMgbWF4IC0wLjEwMEUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtYXg1MzQgbWF4IC0wLjAxRS02MTQzICAgICAgIDAgIC0+ICAgMAorZHFtYXg1MzUgbWF4IC0wLjk5OUUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtYXg1MzYgbWF4IC0wLjA5OUUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtYXg1MzcgbWF4IC0wLjAwOUUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtYXg1MzggbWF4IC0wLjAwMUUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtYXg1MzkgbWF4IC0wLjAwMDlFLTYxNDMgICAgIDAgIC0+ICAgMAorZHFtYXg1NDAgbWF4IC0wLjAwMDFFLTYxNDMgICAgIDAgIC0+ICAgMAorCistLSBOdWxsIHRlc3RzCitkcW1heDkwMCBtYXggMTAgICMgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXg5MDEgbWF4ICAjIDEwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFNYXhNYWcuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFNYXhNYWcuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjIxZTgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU1heE1hZy5kZWNUZXN0CkBAIC0wLDAgKzEsMzA0IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxTWF4TWFnLmRlY1Rlc3QgLS0gZGVjUXVhZCBtYXhudW1tYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gd2UgYXNzdW1lIHRoYXQgYmFzZSBjb21wYXJpc29uIGlzIHRlc3RlZCBpbiBjb21wYXJlLmRlY1Rlc3QsIHNvCistLSB0aGVzZSBtYWlubHkgY292ZXIgc3BlY2lhbCBjYXNlcyBhbmQgcm91bmRpbmcKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RxbXhnMDAxIG1heG1hZyAgLTIgIC0yICAtPiAtMgorZHFteGcwMDIgbWF4bWFnICAtMiAgLTEgIC0+IC0yCitkcW14ZzAwMyBtYXhtYWcgIC0yICAgMCAgLT4gLTIKK2RxbXhnMDA0IG1heG1hZyAgLTIgICAxICAtPiAtMgorZHFteGcwMDUgbWF4bWFnICAtMiAgIDIgIC0+ICAyCitkcW14ZzAwNiBtYXhtYWcgIC0xICAtMiAgLT4gLTIKK2RxbXhnMDA3IG1heG1hZyAgLTEgIC0xICAtPiAtMQorZHFteGcwMDggbWF4bWFnICAtMSAgIDAgIC0+IC0xCitkcW14ZzAwOSBtYXhtYWcgIC0xICAgMSAgLT4gIDEKK2RxbXhnMDEwIG1heG1hZyAgLTEgICAyICAtPiAgMgorZHFteGcwMTEgbWF4bWFnICAgMCAgLTIgIC0+IC0yCitkcW14ZzAxMiBtYXhtYWcgICAwICAtMSAgLT4gLTEKK2RxbXhnMDEzIG1heG1hZyAgIDAgICAwICAtPiAgMAorZHFteGcwMTQgbWF4bWFnICAgMCAgIDEgIC0+ICAxCitkcW14ZzAxNSBtYXhtYWcgICAwICAgMiAgLT4gIDIKK2RxbXhnMDE2IG1heG1hZyAgIDEgIC0yICAtPiAtMgorZHFteGcwMTcgbWF4bWFnICAgMSAgLTEgIC0+ICAxCitkcW14ZzAxOCBtYXhtYWcgICAxICAgMCAgLT4gIDEKK2RxbXhnMDE5IG1heG1hZyAgIDEgICAxICAtPiAgMQorZHFteGcwMjAgbWF4bWFnICAgMSAgIDIgIC0+ICAyCitkcW14ZzAyMSBtYXhtYWcgICAyICAtMiAgLT4gIDIKK2RxbXhnMDIyIG1heG1hZyAgIDIgIC0xICAtPiAgMgorZHFteGcwMjMgbWF4bWFnICAgMiAgIDAgIC0+ICAyCitkcW14ZzAyNSBtYXhtYWcgICAyICAgMSAgLT4gIDIKK2RxbXhnMDI2IG1heG1hZyAgIDIgICAyICAtPiAgMgorCistLSBleHRlbmRlZCB6ZXJvcworZHFteGcwMzAgbWF4bWFnICAgMCAgICAgMCAgIC0+ICAwCitkcW14ZzAzMSBtYXhtYWcgICAwICAgIC0wICAgLT4gIDAKK2RxbXhnMDMyIG1heG1hZyAgIDAgICAgLTAuMCAtPiAgMAorZHFteGcwMzMgbWF4bWFnICAgMCAgICAgMC4wIC0+ICAwCitkcW14ZzAzNCBtYXhtYWcgIC0wICAgICAwICAgLT4gIDAgICAgLS0gbm90ZTogLTAgPSAwLCBidXQgMCBjaG9zZW4KK2RxbXhnMDM1IG1heG1hZyAgLTAgICAgLTAgICAtPiAtMAorZHFteGcwMzYgbWF4bWFnICAtMCAgICAtMC4wIC0+IC0wLjAKK2RxbXhnMDM3IG1heG1hZyAgLTAgICAgIDAuMCAtPiAgMC4wCitkcW14ZzAzOCBtYXhtYWcgICAwLjAgICAwICAgLT4gIDAKK2RxbXhnMDM5IG1heG1hZyAgIDAuMCAgLTAgICAtPiAgMC4wCitkcW14ZzA0MCBtYXhtYWcgICAwLjAgIC0wLjAgLT4gIDAuMAorZHFteGcwNDEgbWF4bWFnICAgMC4wICAgMC4wIC0+ICAwLjAKK2RxbXhnMDQyIG1heG1hZyAgLTAuMCAgIDAgICAtPiAgMAorZHFteGcwNDMgbWF4bWFnICAtMC4wICAtMCAgIC0+IC0wLjAKK2RxbXhnMDQ0IG1heG1hZyAgLTAuMCAgLTAuMCAtPiAtMC4wCitkcW14ZzA0NSBtYXhtYWcgIC0wLjAgICAwLjAgLT4gIDAuMAorCitkcW14ZzA1MCBtYXhtYWcgIC0wRTEgICAwRTEgLT4gIDBFKzEKK2RxbXhnMDUxIG1heG1hZyAgLTBFMiAgIDBFMiAtPiAgMEUrMgorZHFteGcwNTIgbWF4bWFnICAtMEUyICAgMEUxIC0+ICAwRSsxCitkcW14ZzA1MyBtYXhtYWcgIC0wRTEgICAwRTIgLT4gIDBFKzIKK2RxbXhnMDU0IG1heG1hZyAgIDBFMSAgLTBFMSAtPiAgMEUrMQorZHFteGcwNTUgbWF4bWFnICAgMEUyICAtMEUyIC0+ICAwRSsyCitkcW14ZzA1NiBtYXhtYWcgICAwRTIgIC0wRTEgLT4gIDBFKzIKK2RxbXhnMDU3IG1heG1hZyAgIDBFMSAgLTBFMiAtPiAgMEUrMQorCitkcW14ZzA1OCBtYXhtYWcgICAwRTEgICAwRTEgLT4gIDBFKzEKK2RxbXhnMDU5IG1heG1hZyAgIDBFMiAgIDBFMiAtPiAgMEUrMgorZHFteGcwNjAgbWF4bWFnICAgMEUyICAgMEUxIC0+ICAwRSsyCitkcW14ZzA2MSBtYXhtYWcgICAwRTEgICAwRTIgLT4gIDBFKzIKK2RxbXhnMDYyIG1heG1hZyAgLTBFMSAgLTBFMSAtPiAtMEUrMQorZHFteGcwNjMgbWF4bWFnICAtMEUyICAtMEUyIC0+IC0wRSsyCitkcW14ZzA2NCBtYXhtYWcgIC0wRTIgIC0wRTEgLT4gLTBFKzEKK2RxbXhnMDY1IG1heG1hZyAgLTBFMSAgLTBFMiAtPiAtMEUrMQorCistLSBTcGVjaWFscworZHFteGcwOTAgbWF4bWFnICBJbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKK2RxbXhnMDkxIG1heG1hZyAgSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitkcW14ZzA5MiBtYXhtYWcgIEluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorZHFteGcwOTMgbWF4bWFnICBJbmYgIC0wICAgICAtPiAgSW5maW5pdHkKK2RxbXhnMDk0IG1heG1hZyAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitkcW14ZzA5NSBtYXhtYWcgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorZHFteGcwOTYgbWF4bWFnICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK2RxbXhnMDk3IG1heG1hZyAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkcW14ZzA5OCBtYXhtYWcgLTEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFteGcwOTkgbWF4bWFnIC1JbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbXhnMTAwIG1heG1hZyAtMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcW14ZzEwMSBtYXhtYWcgLTAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFteGcxMDIgbWF4bWFnICAwICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbXhnMTAzIG1heG1hZyAgMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcW14ZzEwNCBtYXhtYWcgIDEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFteGcxMDUgbWF4bWFnICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZHFteGcxMjAgbWF4bWFnIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbXhnMTIxIG1heG1hZyAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkcW14ZzEyMiBtYXhtYWcgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZHFteGcxMjMgbWF4bWFnIC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2RxbXhnMTI0IG1heG1hZyAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitkcW14ZzEyNSBtYXhtYWcgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZHFteGcxMjYgbWF4bWFnIC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2RxbXhnMTI3IG1heG1hZyAtSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkcW14ZzEyOCBtYXhtYWcgLUluZiAgLUluZiAgIC0+ICAtSW5maW5pdHkKK2RxbXhnMTI5IG1heG1hZyAtMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitkcW14ZzEzMCBtYXhtYWcgLTEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFteGcxMzEgbWF4bWFnIC0wICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbXhnMTMyIG1heG1hZyAgMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitkcW14ZzEzMyBtYXhtYWcgIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFteGcxMzQgbWF4bWFnICAxMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbXhnMTM1IG1heG1hZyAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CisKKy0tIDIwMDQuMDguMDIgNzU0ciBjaG9vc2VzIG51bWJlciBvdmVyIE5hTiBpbiBtaXhlZCBjYXNlcworZHFteGcxNDEgbWF4bWFnICBOYU4gLUluZiAgICAtPiAtSW5maW5pdHkKK2RxbXhnMTQyIG1heG1hZyAgTmFOIC0xMDAwICAgLT4gLTEwMDAKK2RxbXhnMTQzIG1heG1hZyAgTmFOIC0xICAgICAgLT4gLTEKK2RxbXhnMTQ0IG1heG1hZyAgTmFOIC0wICAgICAgLT4gLTAKK2RxbXhnMTQ1IG1heG1hZyAgTmFOICAwICAgICAgLT4gIDAKK2RxbXhnMTQ2IG1heG1hZyAgTmFOICAxICAgICAgLT4gIDEKK2RxbXhnMTQ3IG1heG1hZyAgTmFOICAxMDAwICAgLT4gIDEwMDAKK2RxbXhnMTQ4IG1heG1hZyAgTmFOICBJbmYgICAgLT4gIEluZmluaXR5CitkcW14ZzE0OSBtYXhtYWcgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RxbXhnMTUwIG1heG1hZyAtSW5mICBOYU4gICAgLT4gLUluZmluaXR5CitkcW14ZzE1MSBtYXhtYWcgLTEwMDAgTmFOICAgIC0+IC0xMDAwCitkcW14ZzE1MiBtYXhtYWcgLTEgICAgTmFOICAgIC0+IC0xCitkcW14ZzE1MyBtYXhtYWcgLTAgICAgTmFOICAgIC0+IC0wCitkcW14ZzE1NCBtYXhtYWcgIDAgICAgTmFOICAgIC0+ICAwCitkcW14ZzE1NSBtYXhtYWcgIDEgICAgTmFOICAgIC0+ICAxCitkcW14ZzE1NiBtYXhtYWcgIDEwMDAgTmFOICAgIC0+ICAxMDAwCitkcW14ZzE1NyBtYXhtYWcgIEluZiAgTmFOICAgIC0+ICBJbmZpbml0eQorCitkcW14ZzE2MSBtYXhtYWcgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE2MiBtYXhtYWcgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE2MyBtYXhtYWcgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE2NCBtYXhtYWcgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE2NSBtYXhtYWcgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE2NiBtYXhtYWcgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE2NyBtYXhtYWcgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE2OCBtYXhtYWcgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE2OSBtYXhtYWcgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE3MCBtYXhtYWcgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE3MSBtYXhtYWcgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE3MiBtYXhtYWcgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE3MyBtYXhtYWcgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE3NCBtYXhtYWcgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE3NSBtYXhtYWcgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE3NiBtYXhtYWcgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE3NyBtYXhtYWcgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE3OCBtYXhtYWcgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE3OSBtYXhtYWcgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxbXhnMTgxIG1heG1hZyAgTmFOOSAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFteGcxODIgbWF4bWFnICBOYU44ICAgICA5ICAgLT4gIDkKK2RxbXhnMTgzIG1heG1hZyAtTmFONyAgIEluZiAgIC0+ICBJbmZpbml0eQorCitkcW14ZzE4NCBtYXhtYWcgLU5hTjEgICBOYU4xMSAtPiAtTmFOMQorZHFteGcxODUgbWF4bWFnICBOYU4yICAgTmFOMTIgLT4gIE5hTjIKK2RxbXhnMTg2IG1heG1hZyAtTmFOMTMgLU5hTjcgIC0+IC1OYU4xMworZHFteGcxODcgbWF4bWFnICBOYU4xNCAtTmFONSAgLT4gIE5hTjE0CisKK2RxbXhnMTg4IG1heG1hZyAtSW5mICAgIE5hTjQgIC0+IC1JbmZpbml0eQorZHFteGcxODkgbWF4bWFnIC05ICAgICAtTmFOMyAgLT4gLTkKK2RxbXhnMTkwIG1heG1hZyAgSW5mICAgIE5hTjIgIC0+ICBJbmZpbml0eQorCitkcW14ZzE5MSBtYXhtYWcgIHNOYU45OSAtSW5mICAgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxOTIgbWF4bWFnICBzTmFOOTggLTEgICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RxbXhnMTkzIG1heG1hZyAtc05hTjk3ICBOYU4gICAgLT4gLU5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE5NCBtYXhtYWcgIHNOYU45NiBzTmFOOTQgIC0+ICBOYU45NiBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxOTUgbWF4bWFnICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RxbXhnMTk2IG1heG1hZyAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE5NyBtYXhtYWcgIDAgICAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxOTggbWF4bWFnICBJbmYgICAtc05hTjkwICAtPiAtTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXhnMTk5IG1heG1hZyAgTmFOICAgIHNOYU44OSAgLT4gIE5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG9sZCByb3VuZGluZyBjaGVja3MKK2RxbXhnMjIxIG1heG1hZyAxMjM0NTY3ODAwMCAxICAtPiAxMjM0NTY3ODAwMAorZHFteGcyMjIgbWF4bWFnIDEgMTIzNDU2NzgwMDAgIC0+IDEyMzQ1Njc4MDAwCitkcW14ZzIyMyBtYXhtYWcgMTIzNDU2NzgwMCAgMSAgLT4gMTIzNDU2NzgwMAorZHFteGcyMjQgbWF4bWFnIDEgMTIzNDU2NzgwMCAgIC0+IDEyMzQ1Njc4MDAKK2RxbXhnMjI1IG1heG1hZyAxMjM0NTY3ODkwICAxICAtPiAxMjM0NTY3ODkwCitkcW14ZzIyNiBtYXhtYWcgMSAxMjM0NTY3ODkwICAgLT4gMTIzNDU2Nzg5MAorZHFteGcyMjcgbWF4bWFnIDEyMzQ1Njc4OTEgIDEgIC0+IDEyMzQ1Njc4OTEKK2RxbXhnMjI4IG1heG1hZyAxIDEyMzQ1Njc4OTEgICAtPiAxMjM0NTY3ODkxCitkcW14ZzIyOSBtYXhtYWcgMTIzNDU2Nzg5MDEgMSAgLT4gMTIzNDU2Nzg5MDEKK2RxbXhnMjMwIG1heG1hZyAxIDEyMzQ1Njc4OTAxICAtPiAxMjM0NTY3ODkwMQorZHFteGcyMzEgbWF4bWFnIDEyMzQ1Njc4OTYgIDEgIC0+IDEyMzQ1Njc4OTYKK2RxbXhnMjMyIG1heG1hZyAxIDEyMzQ1Njc4OTYgICAtPiAxMjM0NTY3ODk2CitkcW14ZzIzMyBtYXhtYWcgLTEyMzQ1Njc4OTEgIDEgLT4gLTEyMzQ1Njc4OTEKK2RxbXhnMjM0IG1heG1hZyAxIC0xMjM0NTY3ODkxICAtPiAtMTIzNDU2Nzg5MQorZHFteGcyMzUgbWF4bWFnIC0xMjM0NTY3ODkwMSAxIC0+IC0xMjM0NTY3ODkwMQorZHFteGcyMzYgbWF4bWFnIDEgLTEyMzQ1Njc4OTAxIC0+IC0xMjM0NTY3ODkwMQorZHFteGcyMzcgbWF4bWFnIC0xMjM0NTY3ODk2ICAxIC0+IC0xMjM0NTY3ODk2CitkcW14ZzIzOCBtYXhtYWcgMSAtMTIzNDU2Nzg5NiAgLT4gLTEyMzQ1Njc4OTYKKworLS0gZnJvbSBleGFtcGxlcworZHFteGcyODAgbWF4bWFnICczJyAgICcyJyAgLT4gICczJworZHFteGcyODEgbWF4bWFnICctMTAnICczJyAgLT4gICctMTAnCitkcW14ZzI4MiBtYXhtYWcgJzEuMCcgJzEnICAtPiAgJzEnCitkcW14ZzI4MyBtYXhtYWcgJzEnICcxLjAnICAtPiAgJzEnCitkcW14ZzI4NCBtYXhtYWcgJzcnICdOYU4nICAtPiAgJzcnCisKKy0tIGV4cGFuZGVkIGxpc3QgZnJvbSBtaW4vbWF4IDc1NHIgcHVycGxlIHByb3NlCistLSBbZXhwbGljaXQgdGVzdHMgZm9yIGV4cG9uZW50IG9yZGVyaW5nXQorZHFteGc0MDEgbWF4bWFnICBJbmYgICAgMS4xICAgICAtPiAgSW5maW5pdHkKK2RxbXhnNDAyIG1heG1hZyAgMS4xICAgIDEgICAgICAgLT4gIDEuMQorZHFteGc0MDMgbWF4bWFnICAxICAgICAgMS4wICAgICAtPiAgMQorZHFteGc0MDQgbWF4bWFnICAxLjAgICAgMC4xICAgICAtPiAgMS4wCitkcW14ZzQwNSBtYXhtYWcgIDAuMSAgICAwLjEwICAgIC0+ICAwLjEKK2RxbXhnNDA2IG1heG1hZyAgMC4xMCAgIDAuMTAwICAgLT4gIDAuMTAKK2RxbXhnNDA3IG1heG1hZyAgMC4xMCAgIDAgICAgICAgLT4gIDAuMTAKK2RxbXhnNDA4IG1heG1hZyAgMCAgICAgIDAuMCAgICAgLT4gIDAKK2RxbXhnNDA5IG1heG1hZyAgMC4wICAgLTAgICAgICAgLT4gIDAuMAorZHFteGc0MTAgbWF4bWFnICAwLjAgICAtMC4wICAgICAtPiAgMC4wCitkcW14ZzQxMSBtYXhtYWcgIDAuMDAgIC0wLjAgICAgIC0+ICAwLjAwCitkcW14ZzQxMiBtYXhtYWcgIDAuMCAgIC0wLjAwICAgIC0+ICAwLjAKK2RxbXhnNDEzIG1heG1hZyAgMCAgICAgLTAuMCAgICAgLT4gIDAKK2RxbXhnNDE0IG1heG1hZyAgMCAgICAgLTAgICAgICAgLT4gIDAKK2RxbXhnNDE1IG1heG1hZyAtMC4wICAgLTAgICAgICAgLT4gLTAuMAorZHFteGc0MTYgbWF4bWFnIC0wICAgICAtMC4xMDAgICAtPiAtMC4xMDAKK2RxbXhnNDE3IG1heG1hZyAtMC4xMDAgLTAuMTAgICAgLT4gLTAuMTAwCitkcW14ZzQxOCBtYXhtYWcgLTAuMTAgIC0wLjEgICAgIC0+IC0wLjEwCitkcW14ZzQxOSBtYXhtYWcgLTAuMSAgIC0xLjAgICAgIC0+IC0xLjAKK2RxbXhnNDIwIG1heG1hZyAtMS4wICAgLTEgICAgICAgLT4gLTEuMAorZHFteGc0MjEgbWF4bWFnIC0xICAgICAtMS4xICAgICAtPiAtMS4xCitkcW14ZzQyMyBtYXhtYWcgLTEuMSAgIC1JbmYgICAgIC0+IC1JbmZpbml0eQorLS0gc2FtZSB3aXRoIG9wZXJhbmRzIHJldmVyc2VkCitkcW14ZzQzMSBtYXhtYWcgIDEuMSAgICBJbmYgICAgIC0+ICBJbmZpbml0eQorZHFteGc0MzIgbWF4bWFnICAxICAgICAgMS4xICAgICAtPiAgMS4xCitkcW14ZzQzMyBtYXhtYWcgIDEuMCAgICAxICAgICAgIC0+ICAxCitkcW14ZzQzNCBtYXhtYWcgIDAuMSAgICAxLjAgICAgIC0+ICAxLjAKK2RxbXhnNDM1IG1heG1hZyAgMC4xMCAgIDAuMSAgICAgLT4gIDAuMQorZHFteGc0MzYgbWF4bWFnICAwLjEwMCAgMC4xMCAgICAtPiAgMC4xMAorZHFteGc0MzcgbWF4bWFnICAwICAgICAgMC4xMCAgICAtPiAgMC4xMAorZHFteGc0MzggbWF4bWFnICAwLjAgICAgMCAgICAgICAtPiAgMAorZHFteGc0MzkgbWF4bWFnIC0wICAgICAgMC4wICAgICAtPiAgMC4wCitkcW14ZzQ0MCBtYXhtYWcgLTAuMCAgICAwLjAgICAgIC0+ICAwLjAKK2RxbXhnNDQxIG1heG1hZyAtMC4wICAgIDAuMDAgICAgLT4gIDAuMDAKK2RxbXhnNDQyIG1heG1hZyAtMC4wMCAgIDAuMCAgICAgLT4gIDAuMAorZHFteGc0NDMgbWF4bWFnIC0wLjAgICAgMCAgICAgICAtPiAgMAorZHFteGc0NDQgbWF4bWFnIC0wICAgICAgMCAgICAgICAtPiAgMAorZHFteGc0NDUgbWF4bWFnIC0wICAgICAtMC4wICAgICAtPiAtMC4wCitkcW14ZzQ0NiBtYXhtYWcgLTAuMTAwIC0wICAgICAgIC0+IC0wLjEwMAorZHFteGc0NDcgbWF4bWFnIC0wLjEwICAtMC4xMDAgICAtPiAtMC4xMDAKK2RxbXhnNDQ4IG1heG1hZyAtMC4xICAgLTAuMTAgICAgLT4gLTAuMTAKK2RxbXhnNDQ5IG1heG1hZyAtMS4wICAgLTAuMSAgICAgLT4gLTEuMAorZHFteGc0NTAgbWF4bWFnIC0xICAgICAtMS4wICAgICAtPiAtMS4wCitkcW14ZzQ1MSBtYXhtYWcgLTEuMSAgIC0xICAgICAgIC0+IC0xLjEKK2RxbXhnNDUzIG1heG1hZyAtSW5mICAgLTEuMSAgICAgLT4gLUluZmluaXR5CistLSBsYXJnaWVzCitkcW14ZzQ2MCBtYXhtYWcgIDEwMDAgICAxRSszICAgIC0+ICAxRSszCitkcW14ZzQ2MSBtYXhtYWcgIDFFKzMgICAxMDAwICAgIC0+ICAxRSszCitkcW14ZzQ2MiBtYXhtYWcgIDEwMDAgIC0xRSszICAgIC0+ICAxMDAwCitkcW14ZzQ2MyBtYXhtYWcgIDFFKzMgIC0xMDAwICAgIC0+ICAxRSszCitkcW14ZzQ2NCBtYXhtYWcgLTEwMDAgICAxRSszICAgIC0+ICAxRSszCitkcW14ZzQ2NSBtYXhtYWcgLTFFKzMgICAxMDAwICAgIC0+ICAxMDAwCitkcW14ZzQ2NiBtYXhtYWcgLTEwMDAgIC0xRSszICAgIC0+IC0xMDAwCitkcW14ZzQ2NyBtYXhtYWcgLTFFKzMgIC0xMDAwICAgIC0+IC0xMDAwCisKKy0tIHN1Ym5vcm1hbHMKK2RxbXhnNTEwIG1heG1hZyAgMS4wMEUtNjE0MyAgICAgICAwICAtPiAgIDEuMDBFLTYxNDMKK2RxbXhnNTExIG1heG1hZyAgMC4xRS02MTQzICAgICAgICAwICAtPiAgIDFFLTYxNDQgICAgU3Vibm9ybWFsCitkcW14ZzUxMiBtYXhtYWcgIDAuMTBFLTYxNDMgICAgICAgMCAgLT4gICAxLjBFLTYxNDQgIFN1Ym5vcm1hbAorZHFteGc1MTMgbWF4bWFnICAwLjEwMEUtNjE0MyAgICAgIDAgIC0+ICAgMS4wMEUtNjE0NCBTdWJub3JtYWwKK2RxbXhnNTE0IG1heG1hZyAgMC4wMUUtNjE0MyAgICAgICAwICAtPiAgIDFFLTYxNDUgICAgU3Vibm9ybWFsCitkcW14ZzUxNSBtYXhtYWcgIDAuOTk5RS02MTQzICAgICAgMCAgLT4gICA5Ljk5RS02MTQ0IFN1Ym5vcm1hbAorZHFteGc1MTYgbWF4bWFnICAwLjA5OUUtNjE0MyAgICAgIDAgIC0+ICAgOS45RS02MTQ1ICBTdWJub3JtYWwKK2RxbXhnNTE3IG1heG1hZyAgMC4wMDlFLTYxNDMgICAgICAwICAtPiAgIDlFLTYxNDYgICAgU3Vibm9ybWFsCitkcW14ZzUxOCBtYXhtYWcgIDAuMDAxRS02MTQzICAgICAgMCAgLT4gICAxRS02MTQ2ICAgIFN1Ym5vcm1hbAorZHFteGc1MTkgbWF4bWFnICAwLjAwMDlFLTYxNDMgICAgIDAgIC0+ICAgOUUtNjE0NyAgICBTdWJub3JtYWwKK2RxbXhnNTIwIG1heG1hZyAgMC4wMDAxRS02MTQzICAgICAwICAtPiAgIDFFLTYxNDcgICAgU3Vibm9ybWFsCisKK2RxbXhnNTMwIG1heG1hZyAtMS4wMEUtNjE0MyAgICAgICAwICAtPiAgLTEuMDBFLTYxNDMKK2RxbXhnNTMxIG1heG1hZyAtMC4xRS02MTQzICAgICAgICAwICAtPiAgLTFFLTYxNDQgICAgU3Vibm9ybWFsCitkcW14ZzUzMiBtYXhtYWcgLTAuMTBFLTYxNDMgICAgICAgMCAgLT4gIC0xLjBFLTYxNDQgIFN1Ym5vcm1hbAorZHFteGc1MzMgbWF4bWFnIC0wLjEwMEUtNjE0MyAgICAgIDAgIC0+ICAtMS4wMEUtNjE0NCBTdWJub3JtYWwKK2RxbXhnNTM0IG1heG1hZyAtMC4wMUUtNjE0MyAgICAgICAwICAtPiAgLTFFLTYxNDUgICAgU3Vibm9ybWFsCitkcW14ZzUzNSBtYXhtYWcgLTAuOTk5RS02MTQzICAgICAgMCAgLT4gIC05Ljk5RS02MTQ0IFN1Ym5vcm1hbAorZHFteGc1MzYgbWF4bWFnIC0wLjA5OUUtNjE0MyAgICAgIDAgIC0+ICAtOS45RS02MTQ1ICBTdWJub3JtYWwKK2RxbXhnNTM3IG1heG1hZyAtMC4wMDlFLTYxNDMgICAgICAwICAtPiAgLTlFLTYxNDYgICAgU3Vibm9ybWFsCitkcW14ZzUzOCBtYXhtYWcgLTAuMDAxRS02MTQzICAgICAgMCAgLT4gIC0xRS02MTQ2ICAgIFN1Ym5vcm1hbAorZHFteGc1MzkgbWF4bWFnIC0wLjAwMDlFLTYxNDMgICAgIDAgIC0+ICAtOUUtNjE0NyAgICBTdWJub3JtYWwKK2RxbXhnNTQwIG1heG1hZyAtMC4wMDAxRS02MTQzICAgICAwICAtPiAgLTFFLTYxNDcgICAgU3Vibm9ybWFsCisKKy0tIE51bGwgdGVzdHMKK2RxbXhnOTAwIG1heG1hZyAxMCAgIyAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzkwMSBtYXhtYWcgICMgMTAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWluLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWluLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3ZjRjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFNaW4uZGVjVGVzdApAQCAtMCwwICsxLDMwOSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcU1pbi5kZWNUZXN0IC0tIGRlY1F1YWQgbWlubnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIHdlIGFzc3VtZSB0aGF0IGJhc2UgY29tcGFyaXNvbiBpcyB0ZXN0ZWQgaW4gY29tcGFyZS5kZWNUZXN0LCBzbworLS0gdGhlc2UgbWFpbmx5IGNvdmVyIHNwZWNpYWwgY2FzZXMgYW5kIHJvdW5kaW5nCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkcW1pbjAwMSBtaW4gIC0yICAtMiAgLT4gLTIKK2RxbWluMDAyIG1pbiAgLTIgIC0xICAtPiAtMgorZHFtaW4wMDMgbWluICAtMiAgIDAgIC0+IC0yCitkcW1pbjAwNCBtaW4gIC0yICAgMSAgLT4gLTIKK2RxbWluMDA1IG1pbiAgLTIgICAyICAtPiAtMgorZHFtaW4wMDYgbWluICAtMSAgLTIgIC0+IC0yCitkcW1pbjAwNyBtaW4gIC0xICAtMSAgLT4gLTEKK2RxbWluMDA4IG1pbiAgLTEgICAwICAtPiAtMQorZHFtaW4wMDkgbWluICAtMSAgIDEgIC0+IC0xCitkcW1pbjAxMCBtaW4gIC0xICAgMiAgLT4gLTEKK2RxbWluMDExIG1pbiAgIDAgIC0yICAtPiAtMgorZHFtaW4wMTIgbWluICAgMCAgLTEgIC0+IC0xCitkcW1pbjAxMyBtaW4gICAwICAgMCAgLT4gIDAKK2RxbWluMDE0IG1pbiAgIDAgICAxICAtPiAgMAorZHFtaW4wMTUgbWluICAgMCAgIDIgIC0+ICAwCitkcW1pbjAxNiBtaW4gICAxICAtMiAgLT4gLTIKK2RxbWluMDE3IG1pbiAgIDEgIC0xICAtPiAtMQorZHFtaW4wMTggbWluICAgMSAgIDAgIC0+ICAwCitkcW1pbjAxOSBtaW4gICAxICAgMSAgLT4gIDEKK2RxbWluMDIwIG1pbiAgIDEgICAyICAtPiAgMQorZHFtaW4wMjEgbWluICAgMiAgLTIgIC0+IC0yCitkcW1pbjAyMiBtaW4gICAyICAtMSAgLT4gLTEKK2RxbWluMDIzIG1pbiAgIDIgICAwICAtPiAgMAorZHFtaW4wMjUgbWluICAgMiAgIDEgIC0+ICAxCitkcW1pbjAyNiBtaW4gICAyICAgMiAgLT4gIDIKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RxbWluMDMwIG1pbiAgIDAgICAgIDAgICAtPiAgMAorZHFtaW4wMzEgbWluICAgMCAgICAtMCAgIC0+IC0wCitkcW1pbjAzMiBtaW4gICAwICAgIC0wLjAgLT4gLTAuMAorZHFtaW4wMzMgbWluICAgMCAgICAgMC4wIC0+ICAwLjAKK2RxbWluMDM0IG1pbiAgLTAgICAgIDAgICAtPiAtMAorZHFtaW4wMzUgbWluICAtMCAgICAtMCAgIC0+IC0wCitkcW1pbjAzNiBtaW4gIC0wICAgIC0wLjAgLT4gLTAKK2RxbWluMDM3IG1pbiAgLTAgICAgIDAuMCAtPiAtMAorZHFtaW4wMzggbWluICAgMC4wICAgMCAgIC0+ICAwLjAKK2RxbWluMDM5IG1pbiAgIDAuMCAgLTAgICAtPiAtMAorZHFtaW4wNDAgbWluICAgMC4wICAtMC4wIC0+IC0wLjAKK2RxbWluMDQxIG1pbiAgIDAuMCAgIDAuMCAtPiAgMC4wCitkcW1pbjA0MiBtaW4gIC0wLjAgICAwICAgLT4gLTAuMAorZHFtaW4wNDMgbWluICAtMC4wICAtMCAgIC0+IC0wCitkcW1pbjA0NCBtaW4gIC0wLjAgIC0wLjAgLT4gLTAuMAorZHFtaW4wNDUgbWluICAtMC4wICAgMC4wIC0+IC0wLjAKKworZHFtaW4wNDYgbWluICAgMEUxICAtMEUxIC0+IC0wRSsxCitkcW1pbjA0NyBtaW4gIC0wRTEgICAwRTIgLT4gLTBFKzEKK2RxbWluMDQ4IG1pbiAgIDBFMiAgIDBFMSAtPiAgMEUrMQorZHFtaW4wNDkgbWluICAgMEUxICAgMEUyIC0+ICAwRSsxCitkcW1pbjA1MCBtaW4gIC0wRTMgIC0wRTIgLT4gLTBFKzMKK2RxbWluMDUxIG1pbiAgLTBFMiAgLTBFMyAtPiAtMEUrMworCistLSBTcGVjaWFscworZHFtaW4wOTAgbWluICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbWluMDkxIG1pbiAgSW5mICAtMTAwMCAgLT4gLTEwMDAKK2RxbWluMDkyIG1pbiAgSW5mICAtMSAgICAgLT4gLTEKK2RxbWluMDkzIG1pbiAgSW5mICAtMCAgICAgLT4gLTAKK2RxbWluMDk0IG1pbiAgSW5mICAgMCAgICAgLT4gIDAKK2RxbWluMDk1IG1pbiAgSW5mICAgMSAgICAgLT4gIDEKK2RxbWluMDk2IG1pbiAgSW5mICAgMTAwMCAgLT4gIDEwMDAKK2RxbWluMDk3IG1pbiAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkcW1pbjA5OCBtaW4gLTEwMDAgIEluZiAgIC0+IC0xMDAwCitkcW1pbjA5OSBtaW4gLUluZiAgIEluZiAgIC0+IC1JbmZpbml0eQorZHFtaW4xMDAgbWluIC0xICAgICBJbmYgICAtPiAtMQorZHFtaW4xMDEgbWluIC0wICAgICBJbmYgICAtPiAtMAorZHFtaW4xMDIgbWluICAwICAgICBJbmYgICAtPiAgMAorZHFtaW4xMDMgbWluICAxICAgICBJbmYgICAtPiAgMQorZHFtaW4xMDQgbWluICAxMDAwICBJbmYgICAtPiAgMTAwMAorZHFtaW4xMDUgbWluICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZHFtaW4xMjAgbWluIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbWluMTIxIG1pbiAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkcW1pbjEyMiBtaW4gLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZHFtaW4xMjMgbWluIC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2RxbWluMTI0IG1pbiAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitkcW1pbjEyNSBtaW4gLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZHFtaW4xMjYgbWluIC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2RxbWluMTI3IG1pbiAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitkcW1pbjEyOCBtaW4gLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtaW4xMjkgbWluIC0xMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbWluMTMwIG1pbiAtMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkcW1pbjEzMSBtaW4gLTAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtaW4xMzIgbWluICAwICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbWluMTMzIG1pbiAgMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkcW1pbjEzNCBtaW4gIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtaW4xMzUgbWluICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKKworLS0gMjAwNC4wOC4wMiA3NTRyIGNob29zZXMgbnVtYmVyIG92ZXIgTmFOIGluIG1peGVkIGNhc2VzCitkcW1pbjE0MSBtaW4gIE5hTiAtSW5mICAgIC0+ICAtSW5maW5pdHkKK2RxbWluMTQyIG1pbiAgTmFOIC0xMDAwICAgLT4gIC0xMDAwCitkcW1pbjE0MyBtaW4gIE5hTiAtMSAgICAgIC0+ICAtMQorZHFtaW4xNDQgbWluICBOYU4gLTAgICAgICAtPiAgLTAKK2RxbWluMTQ1IG1pbiAgTmFOICAwICAgICAgLT4gIDAKK2RxbWluMTQ2IG1pbiAgTmFOICAxICAgICAgLT4gIDEKK2RxbWluMTQ3IG1pbiAgTmFOICAxMDAwICAgLT4gIDEwMDAKK2RxbWluMTQ4IG1pbiAgTmFOICBJbmYgICAgLT4gIEluZmluaXR5CitkcW1pbjE0OSBtaW4gIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RxbWluMTUwIG1pbiAtSW5mICBOYU4gICAgLT4gLUluZmluaXR5CitkcW1pbjE1MSBtaW4gLTEwMDAgTmFOICAgIC0+IC0xMDAwCitkcW1pbjE1MiBtaW4gLTEgICAtTmFOICAgIC0+IC0xCitkcW1pbjE1MyBtaW4gLTAgICAgTmFOICAgIC0+IC0wCitkcW1pbjE1NCBtaW4gIDAgICAtTmFOICAgIC0+ICAwCitkcW1pbjE1NSBtaW4gIDEgICAgTmFOICAgIC0+ICAxCitkcW1pbjE1NiBtaW4gIDEwMDAgTmFOICAgIC0+ICAxMDAwCitkcW1pbjE1NyBtaW4gIEluZiAgTmFOICAgIC0+ICBJbmZpbml0eQorCitkcW1pbjE2MSBtaW4gIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE2MiBtaW4gIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE2MyBtaW4gIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE2NCBtaW4gIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE2NSBtaW4gLXNOYU4gIDAgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE2NiBtaW4gLXNOYU4gIDEgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE2NyBtaW4gIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE2OCBtaW4gIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE2OSBtaW4gIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE3MCBtaW4gIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE3MSBtaW4gLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE3MiBtaW4gLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE3MyBtaW4gLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE3NCBtaW4gLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE3NSBtaW4gIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE3NiBtaW4gIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE3NyBtaW4gIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE3OCBtaW4gIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE3OSBtaW4gIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxbWluMTgxIG1pbiAgTmFOOSAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbWluMTgyIG1pbiAtTmFOOCAgICA5OTkwICAtPiAgOTk5MAorZHFtaW4xODMgbWluICBOYU43MSAgIEluZiAgIC0+ICBJbmZpbml0eQorCitkcW1pbjE4NCBtaW4gIE5hTjEgICAgTmFONTQgLT4gIE5hTjEKK2RxbWluMTg1IG1pbiAgTmFOMjIgIC1OYU41MyAtPiAgTmFOMjIKK2RxbWluMTg2IG1pbiAtTmFOMyAgICBOYU42ICAtPiAtTmFOMworZHFtaW4xODcgbWluIC1OYU40NCAgIE5hTjcgIC0+IC1OYU40NAorCitkcW1pbjE4OCBtaW4gLUluZiAgICAgTmFONDEgLT4gLUluZmluaXR5CitkcW1pbjE4OSBtaW4gLTk5OTkgICAtTmFOMzMgLT4gLTk5OTkKK2RxbWluMTkwIG1pbiAgSW5mICAgICBOYU4yICAtPiAgSW5maW5pdHkKKworZHFtaW4xOTEgbWluICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RxbWluMTkyIG1pbiAgc05hTjk4IC0xMSAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE5MyBtaW4gLXNOYU45NyAgTmFOOCAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xOTQgbWluICBzTmFONjkgc05hTjk0ICAtPiAgTmFONjkgSW52YWxpZF9vcGVyYXRpb24KK2RxbWluMTk1IG1pbiAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE5NiBtaW4gLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xOTcgbWluICAwODggICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RxbWluMTk4IG1pbiAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE5OSBtaW4gIE5hTiAgICBzTmFOODYgIC0+ICBOYU44NiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvbGQgcm91bmRpbmcgY2hlY2tzCitkcW1pbjIyMSBtaW4gLTEyMzQ1Njc4MDAwIDEgIC0+IC0xMjM0NTY3ODAwMAorZHFtaW4yMjIgbWluIDEgLTEyMzQ1Njc4MDAwICAtPiAtMTIzNDU2NzgwMDAKK2RxbWluMjIzIG1pbiAtMTIzNDU2NzgwMCAgMSAgLT4gLTEyMzQ1Njc4MDAKK2RxbWluMjI0IG1pbiAxIC0xMjM0NTY3ODAwICAgLT4gLTEyMzQ1Njc4MDAKK2RxbWluMjI1IG1pbiAtMTIzNDU2Nzg5MCAgMSAgLT4gLTEyMzQ1Njc4OTAKK2RxbWluMjI2IG1pbiAxIC0xMjM0NTY3ODkwICAgLT4gLTEyMzQ1Njc4OTAKK2RxbWluMjI3IG1pbiAtMTIzNDU2Nzg5MSAgMSAgLT4gLTEyMzQ1Njc4OTEKK2RxbWluMjI4IG1pbiAxIC0xMjM0NTY3ODkxICAgLT4gLTEyMzQ1Njc4OTEKK2RxbWluMjI5IG1pbiAtMTIzNDU2Nzg5MDEgMSAgLT4gLTEyMzQ1Njc4OTAxCitkcW1pbjIzMCBtaW4gMSAtMTIzNDU2Nzg5MDEgIC0+IC0xMjM0NTY3ODkwMQorZHFtaW4yMzEgbWluIC0xMjM0NTY3ODk2ICAxICAtPiAtMTIzNDU2Nzg5NgorZHFtaW4yMzIgbWluIDEgLTEyMzQ1Njc4OTYgICAtPiAtMTIzNDU2Nzg5NgorZHFtaW4yMzMgbWluIDEyMzQ1Njc4OTEgIDEgICAtPiAxCitkcW1pbjIzNCBtaW4gMSAxMjM0NTY3ODkxICAgIC0+IDEKK2RxbWluMjM1IG1pbiAxMjM0NTY3ODkwMSAxICAgLT4gMQorZHFtaW4yMzYgbWluIDEgMTIzNDU2Nzg5MDEgICAtPiAxCitkcW1pbjIzNyBtaW4gMTIzNDU2Nzg5NiAgMSAgIC0+IDEKK2RxbWluMjM4IG1pbiAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCistLSBmcm9tIGV4YW1wbGVzCitkcW1pbjI4MCBtaW4gJzMnICAgJzInICAtPiAgJzInCitkcW1pbjI4MSBtaW4gJy0xMCcgJzMnICAtPiAgJy0xMCcKK2RxbWluMjgyIG1pbiAnMS4wJyAnMScgIC0+ICAnMS4wJworZHFtaW4yODMgbWluICcxJyAnMS4wJyAgLT4gICcxLjAnCitkcW1pbjI4NCBtaW4gJzcnICdOYU4nICAtPiAgJzcnCisKKy0tIGV4cGFuZGVkIGxpc3QgZnJvbSBtaW4vbWF4IDc1NHIgcHVycGxlIHByb3NlCistLSBbZXhwbGljaXQgdGVzdHMgZm9yIGV4cG9uZW50IG9yZGVyaW5nXQorZHFtaW40MDEgbWluICBJbmYgICAgMS4xICAgICAtPiAgMS4xCitkcW1pbjQwMiBtaW4gIDEuMSAgICAxICAgICAgIC0+ICAxCitkcW1pbjQwMyBtaW4gIDEgICAgICAxLjAgICAgIC0+ICAxLjAKK2RxbWluNDA0IG1pbiAgMS4wICAgIDAuMSAgICAgLT4gIDAuMQorZHFtaW40MDUgbWluICAwLjEgICAgMC4xMCAgICAtPiAgMC4xMAorZHFtaW40MDYgbWluICAwLjEwICAgMC4xMDAgICAtPiAgMC4xMDAKK2RxbWluNDA3IG1pbiAgMC4xMCAgIDAgICAgICAgLT4gIDAKK2RxbWluNDA4IG1pbiAgMCAgICAgIDAuMCAgICAgLT4gIDAuMAorZHFtaW40MDkgbWluICAwLjAgICAtMCAgICAgICAtPiAtMAorZHFtaW40MTAgbWluICAwLjAgICAtMC4wICAgICAtPiAtMC4wCitkcW1pbjQxMSBtaW4gIDAuMDAgIC0wLjAgICAgIC0+IC0wLjAKK2RxbWluNDEyIG1pbiAgMC4wICAgLTAuMDAgICAgLT4gLTAuMDAKK2RxbWluNDEzIG1pbiAgMCAgICAgLTAuMCAgICAgLT4gLTAuMAorZHFtaW40MTQgbWluICAwICAgICAtMCAgICAgICAtPiAtMAorZHFtaW40MTUgbWluIC0wLjAgICAtMCAgICAgICAtPiAtMAorZHFtaW40MTYgbWluIC0wICAgICAtMC4xMDAgICAtPiAtMC4xMDAKK2RxbWluNDE3IG1pbiAtMC4xMDAgLTAuMTAgICAgLT4gLTAuMTAKK2RxbWluNDE4IG1pbiAtMC4xMCAgLTAuMSAgICAgLT4gLTAuMQorZHFtaW40MTkgbWluIC0wLjEgICAtMS4wICAgICAtPiAtMS4wCitkcW1pbjQyMCBtaW4gLTEuMCAgIC0xICAgICAgIC0+IC0xCitkcW1pbjQyMSBtaW4gLTEgICAgIC0xLjEgICAgIC0+IC0xLjEKK2RxbWluNDIzIG1pbiAtMS4xICAgLUluZiAgICAgLT4gLUluZmluaXR5CistLSBzYW1lIHdpdGggb3BlcmFuZHMgcmV2ZXJzZWQKK2RxbWluNDMxIG1pbiAgMS4xICAgIEluZiAgICAgLT4gIDEuMQorZHFtaW40MzIgbWluICAxICAgICAgMS4xICAgICAtPiAgMQorZHFtaW40MzMgbWluICAxLjAgICAgMSAgICAgICAtPiAgMS4wCitkcW1pbjQzNCBtaW4gIDAuMSAgICAxLjAgICAgIC0+ICAwLjEKK2RxbWluNDM1IG1pbiAgMC4xMCAgIDAuMSAgICAgLT4gIDAuMTAKK2RxbWluNDM2IG1pbiAgMC4xMDAgIDAuMTAgICAgLT4gIDAuMTAwCitkcW1pbjQzNyBtaW4gIDAgICAgICAwLjEwICAgIC0+ICAwCitkcW1pbjQzOCBtaW4gIDAuMCAgICAwICAgICAgIC0+ICAwLjAKK2RxbWluNDM5IG1pbiAtMCAgICAgIDAuMCAgICAgLT4gLTAKK2RxbWluNDQwIG1pbiAtMC4wICAgIDAuMCAgICAgLT4gLTAuMAorZHFtaW40NDEgbWluIC0wLjAgICAgMC4wMCAgICAtPiAtMC4wCitkcW1pbjQ0MiBtaW4gLTAuMDAgICAwLjAgICAgIC0+IC0wLjAwCitkcW1pbjQ0MyBtaW4gLTAuMCAgICAwICAgICAgIC0+IC0wLjAKK2RxbWluNDQ0IG1pbiAtMCAgICAgIDAgICAgICAgLT4gLTAKK2RxbWluNDQ1IG1pbiAtMCAgICAgLTAuMCAgICAgLT4gLTAKK2RxbWluNDQ2IG1pbiAtMC4xMDAgLTAgICAgICAgLT4gLTAuMTAwCitkcW1pbjQ0NyBtaW4gLTAuMTAgIC0wLjEwMCAgIC0+IC0wLjEwCitkcW1pbjQ0OCBtaW4gLTAuMSAgIC0wLjEwICAgIC0+IC0wLjEKK2RxbWluNDQ5IG1pbiAtMS4wICAgLTAuMSAgICAgLT4gLTEuMAorZHFtaW40NTAgbWluIC0xICAgICAtMS4wICAgICAtPiAtMQorZHFtaW40NTEgbWluIC0xLjEgICAtMSAgICAgICAtPiAtMS4xCitkcW1pbjQ1MyBtaW4gLUluZiAgIC0xLjEgICAgIC0+IC1JbmZpbml0eQorLS0gbGFyZ2llcworZHFtaW40NjAgbWluICAxMDAwICAgMUUrMyAgICAtPiAgMTAwMAorZHFtaW40NjEgbWluICAxRSszICAgMTAwMCAgICAtPiAgMTAwMAorZHFtaW40NjIgbWluICAxMDAwICAtMUUrMyAgICAtPiAtMUUrMworZHFtaW40NjMgbWluICAxRSszICAtMzg0ICAgIC0+IC0zODQKK2RxbWluNDY0IG1pbiAtMzg0ICAgMUUrMyAgICAtPiAtMzg0CitkcW1pbjQ2NSBtaW4gLTFFKzMgICAxMDAwICAgIC0+IC0xRSszCitkcW1pbjQ2NiBtaW4gLTM4NCAgLTFFKzMgICAgLT4gLTFFKzMKK2RxbWluNDY3IG1pbiAtMUUrMyAgLTM4NCAgICAtPiAtMUUrMworCistLSBtaXNhbGlnbm1lbnQgdHJhcHMgZm9yIGxpdHRsZS1lbmRpYW4KK2RxbWluNDcxIG1pbiAgICAgIDEuMCAgICAgICAwLjEgIC0+IDAuMQorZHFtaW40NzIgbWluICAgICAgMC4xICAgICAgIDEuMCAgLT4gMC4xCitkcW1pbjQ3MyBtaW4gICAgIDEwLjAgICAgICAgMC4xICAtPiAwLjEKK2RxbWluNDc0IG1pbiAgICAgIDAuMSAgICAgIDEwLjAgIC0+IDAuMQorZHFtaW40NzUgbWluICAgICAgMTAwICAgICAgIDEuMCAgLT4gMS4wCitkcW1pbjQ3NiBtaW4gICAgICAxLjAgICAgICAgMTAwICAtPiAxLjAKK2RxbWluNDc3IG1pbiAgICAgMTAwMCAgICAgIDEwLjAgIC0+IDEwLjAKK2RxbWluNDc4IG1pbiAgICAgMTAuMCAgICAgIDEwMDAgIC0+IDEwLjAKK2RxbWluNDc5IG1pbiAgICAxMDAwMCAgICAgMTAwLjAgIC0+IDEwMC4wCitkcW1pbjQ4MCBtaW4gICAgMTAwLjAgICAgIDEwMDAwICAtPiAxMDAuMAorZHFtaW40ODEgbWluICAgMTAwMDAwICAgIDEwMDAuMCAgLT4gMTAwMC4wCitkcW1pbjQ4MiBtaW4gICAxMDAwLjAgICAgMTAwMDAwICAtPiAxMDAwLjAKK2RxbWluNDgzIG1pbiAgMTAwMDAwMCAgIDEwMDAwLjAgIC0+IDEwMDAwLjAKK2RxbWluNDg0IG1pbiAgMTAwMDAuMCAgIDEwMDAwMDAgIC0+IDEwMDAwLjAKKworLS0gc3Vibm9ybWFscworZHFtaW41MTAgbWluICAxLjAwRS02MTQzICAgICAgIDAgIC0+ICAgMAorZHFtaW41MTEgbWluICAwLjFFLTYxNDMgICAgICAgIDAgIC0+ICAgMAorZHFtaW41MTIgbWluICAwLjEwRS02MTQzICAgICAgIDAgIC0+ICAgMAorZHFtaW41MTMgbWluICAwLjEwMEUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtaW41MTQgbWluICAwLjAxRS02MTQzICAgICAgIDAgIC0+ICAgMAorZHFtaW41MTUgbWluICAwLjk5OUUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtaW41MTYgbWluICAwLjA5OUUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtaW41MTcgbWluICAwLjAwOUUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtaW41MTggbWluICAwLjAwMUUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtaW41MTkgbWluICAwLjAwMDlFLTYxNDMgICAgIDAgIC0+ICAgMAorZHFtaW41MjAgbWluICAwLjAwMDFFLTYxNDMgICAgIDAgIC0+ICAgMAorCitkcW1pbjUzMCBtaW4gLTEuMDBFLTYxNDMgICAgICAgMCAgLT4gIC0xLjAwRS02MTQzCitkcW1pbjUzMSBtaW4gLTAuMUUtNjE0MyAgICAgICAgMCAgLT4gIC0xRS02MTQ0ICAgIFN1Ym5vcm1hbAorZHFtaW41MzIgbWluIC0wLjEwRS02MTQzICAgICAgIDAgIC0+ICAtMS4wRS02MTQ0ICBTdWJub3JtYWwKK2RxbWluNTMzIG1pbiAtMC4xMDBFLTYxNDMgICAgICAwICAtPiAgLTEuMDBFLTYxNDQgU3Vibm9ybWFsCitkcW1pbjUzNCBtaW4gLTAuMDFFLTYxNDMgICAgICAgMCAgLT4gIC0xRS02MTQ1ICAgIFN1Ym5vcm1hbAorZHFtaW41MzUgbWluIC0wLjk5OUUtNjE0MyAgICAgIDAgIC0+ICAtOS45OUUtNjE0NCBTdWJub3JtYWwKK2RxbWluNTM2IG1pbiAtMC4wOTlFLTYxNDMgICAgICAwICAtPiAgLTkuOUUtNjE0NSAgU3Vibm9ybWFsCitkcW1pbjUzNyBtaW4gLTAuMDA5RS02MTQzICAgICAgMCAgLT4gIC05RS02MTQ2ICAgIFN1Ym5vcm1hbAorZHFtaW41MzggbWluIC0wLjAwMUUtNjE0MyAgICAgIDAgIC0+ICAtMUUtNjE0NiAgICBTdWJub3JtYWwKK2RxbWluNTM5IG1pbiAtMC4wMDA5RS02MTQzICAgICAwICAtPiAgLTlFLTYxNDcgICAgU3Vibm9ybWFsCitkcW1pbjU0MCBtaW4gLTAuMDAwMUUtNjE0MyAgICAgMCAgLT4gIC0xRS02MTQ3ICAgIFN1Ym5vcm1hbAorCisKKy0tIE51bGwgdGVzdHMKK2RxbWluOTAwIG1pbiAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxbWluOTAxIG1pbiAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFNaW5NYWcuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFNaW5NYWcuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGMyZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU1pbk1hZy5kZWNUZXN0CkBAIC0wLDAgKzEsMjkzIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxTWluTWFnLmRlY1Rlc3QgLS0gZGVjUXVhZCBtaW5udW1tYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gd2UgYXNzdW1lIHRoYXQgYmFzZSBjb21wYXJpc29uIGlzIHRlc3RlZCBpbiBjb21wYXJlLmRlY1Rlc3QsIHNvCistLSB0aGVzZSBtYWlubHkgY292ZXIgc3BlY2lhbCBjYXNlcyBhbmQgcm91bmRpbmcKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RxbW5nMDAxIG1pbm1hZyAgLTIgIC0yICAtPiAtMgorZHFtbmcwMDIgbWlubWFnICAtMiAgLTEgIC0+IC0xCitkcW1uZzAwMyBtaW5tYWcgIC0yICAgMCAgLT4gIDAKK2RxbW5nMDA0IG1pbm1hZyAgLTIgICAxICAtPiAgMQorZHFtbmcwMDUgbWlubWFnICAtMiAgIDIgIC0+IC0yCitkcW1uZzAwNiBtaW5tYWcgIC0xICAtMiAgLT4gLTEKK2RxbW5nMDA3IG1pbm1hZyAgLTEgIC0xICAtPiAtMQorZHFtbmcwMDggbWlubWFnICAtMSAgIDAgIC0+ICAwCitkcW1uZzAwOSBtaW5tYWcgIC0xICAgMSAgLT4gLTEKK2RxbW5nMDEwIG1pbm1hZyAgLTEgICAyICAtPiAtMQorZHFtbmcwMTEgbWlubWFnICAgMCAgLTIgIC0+ICAwCitkcW1uZzAxMiBtaW5tYWcgICAwICAtMSAgLT4gIDAKK2RxbW5nMDEzIG1pbm1hZyAgIDAgICAwICAtPiAgMAorZHFtbmcwMTQgbWlubWFnICAgMCAgIDEgIC0+ICAwCitkcW1uZzAxNSBtaW5tYWcgICAwICAgMiAgLT4gIDAKK2RxbW5nMDE2IG1pbm1hZyAgIDEgIC0yICAtPiAgMQorZHFtbmcwMTcgbWlubWFnICAgMSAgLTEgIC0+IC0xCitkcW1uZzAxOCBtaW5tYWcgICAxICAgMCAgLT4gIDAKK2RxbW5nMDE5IG1pbm1hZyAgIDEgICAxICAtPiAgMQorZHFtbmcwMjAgbWlubWFnICAgMSAgIDIgIC0+ICAxCitkcW1uZzAyMSBtaW5tYWcgICAyICAtMiAgLT4gLTIKK2RxbW5nMDIyIG1pbm1hZyAgIDIgIC0xICAtPiAtMQorZHFtbmcwMjMgbWlubWFnICAgMiAgIDAgIC0+ICAwCitkcW1uZzAyNSBtaW5tYWcgICAyICAgMSAgLT4gIDEKK2RxbW5nMDI2IG1pbm1hZyAgIDIgICAyICAtPiAgMgorCistLSBleHRlbmRlZCB6ZXJvcworZHFtbmcwMzAgbWlubWFnICAgMCAgICAgMCAgIC0+ICAwCitkcW1uZzAzMSBtaW5tYWcgICAwICAgIC0wICAgLT4gLTAKK2RxbW5nMDMyIG1pbm1hZyAgIDAgICAgLTAuMCAtPiAtMC4wCitkcW1uZzAzMyBtaW5tYWcgICAwICAgICAwLjAgLT4gIDAuMAorZHFtbmcwMzQgbWlubWFnICAtMCAgICAgMCAgIC0+IC0wCitkcW1uZzAzNSBtaW5tYWcgIC0wICAgIC0wICAgLT4gLTAKK2RxbW5nMDM2IG1pbm1hZyAgLTAgICAgLTAuMCAtPiAtMAorZHFtbmcwMzcgbWlubWFnICAtMCAgICAgMC4wIC0+IC0wCitkcW1uZzAzOCBtaW5tYWcgICAwLjAgICAwICAgLT4gIDAuMAorZHFtbmcwMzkgbWlubWFnICAgMC4wICAtMCAgIC0+IC0wCitkcW1uZzA0MCBtaW5tYWcgICAwLjAgIC0wLjAgLT4gLTAuMAorZHFtbmcwNDEgbWlubWFnICAgMC4wICAgMC4wIC0+ICAwLjAKK2RxbW5nMDQyIG1pbm1hZyAgLTAuMCAgIDAgICAtPiAtMC4wCitkcW1uZzA0MyBtaW5tYWcgIC0wLjAgIC0wICAgLT4gLTAKK2RxbW5nMDQ0IG1pbm1hZyAgLTAuMCAgLTAuMCAtPiAtMC4wCitkcW1uZzA0NSBtaW5tYWcgIC0wLjAgICAwLjAgLT4gLTAuMAorCitkcW1uZzA0NiBtaW5tYWcgICAwRTEgIC0wRTEgLT4gLTBFKzEKK2RxbW5nMDQ3IG1pbm1hZyAgLTBFMSAgIDBFMiAtPiAtMEUrMQorZHFtbmcwNDggbWlubWFnICAgMEUyICAgMEUxIC0+ICAwRSsxCitkcW1uZzA0OSBtaW5tYWcgICAwRTEgICAwRTIgLT4gIDBFKzEKK2RxbW5nMDUwIG1pbm1hZyAgLTBFMyAgLTBFMiAtPiAtMEUrMworZHFtbmcwNTEgbWlubWFnICAtMEUyICAtMEUzIC0+IC0wRSszCisKKy0tIFNwZWNpYWxzCitkcW1uZzA5MCBtaW5tYWcgIEluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtbmcwOTEgbWlubWFnICBJbmYgIC0xMDAwICAtPiAtMTAwMAorZHFtbmcwOTIgbWlubWFnICBJbmYgIC0xICAgICAtPiAtMQorZHFtbmcwOTMgbWlubWFnICBJbmYgIC0wICAgICAtPiAtMAorZHFtbmcwOTQgbWlubWFnICBJbmYgICAwICAgICAtPiAgMAorZHFtbmcwOTUgbWlubWFnICBJbmYgICAxICAgICAtPiAgMQorZHFtbmcwOTYgbWlubWFnICBJbmYgICAxMDAwICAtPiAgMTAwMAorZHFtbmcwOTcgbWlubWFnICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbW5nMDk4IG1pbm1hZyAtMTAwMCAgSW5mICAgLT4gLTEwMDAKK2RxbW5nMDk5IG1pbm1hZyAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitkcW1uZzEwMCBtaW5tYWcgLTEgICAgIEluZiAgIC0+IC0xCitkcW1uZzEwMSBtaW5tYWcgLTAgICAgIEluZiAgIC0+IC0wCitkcW1uZzEwMiBtaW5tYWcgIDAgICAgIEluZiAgIC0+ICAwCitkcW1uZzEwMyBtaW5tYWcgIDEgICAgIEluZiAgIC0+ICAxCitkcW1uZzEwNCBtaW5tYWcgIDEwMDAgIEluZiAgIC0+ICAxMDAwCitkcW1uZzEwNSBtaW5tYWcgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorCitkcW1uZzEyMCBtaW5tYWcgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtbmcxMjEgbWlubWFnIC1JbmYgIC0xMDAwICAtPiAtMTAwMAorZHFtbmcxMjIgbWlubWFnIC1JbmYgIC0xICAgICAtPiAtMQorZHFtbmcxMjMgbWlubWFnIC1JbmYgIC0wICAgICAtPiAtMAorZHFtbmcxMjQgbWlubWFnIC1JbmYgICAwICAgICAtPiAgMAorZHFtbmcxMjUgbWlubWFnIC1JbmYgICAxICAgICAtPiAgMQorZHFtbmcxMjYgbWlubWFnIC1JbmYgICAxMDAwICAtPiAgMTAwMAorZHFtbmcxMjcgbWlubWFnIC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK2RxbW5nMTI4IG1pbm1hZyAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkcW1uZzEyOSBtaW5tYWcgLTEwMDAgLUluZiAgIC0+IC0xMDAwCitkcW1uZzEzMCBtaW5tYWcgLTEgICAgLUluZiAgIC0+IC0xCitkcW1uZzEzMSBtaW5tYWcgLTAgICAgLUluZiAgIC0+IC0wCitkcW1uZzEzMiBtaW5tYWcgIDAgICAgLUluZiAgIC0+ICAwCitkcW1uZzEzMyBtaW5tYWcgIDEgICAgLUluZiAgIC0+ICAxCitkcW1uZzEzNCBtaW5tYWcgIDEwMDAgLUluZiAgIC0+ICAxMDAwCitkcW1uZzEzNSBtaW5tYWcgIEluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorCistLSAyMDA0LjA4LjAyIDc1NHIgY2hvb3NlcyBudW1iZXIgb3ZlciBOYU4gaW4gbWl4ZWQgY2FzZXMKK2RxbW5nMTQxIG1pbm1hZyAgTmFOIC1JbmYgICAgLT4gIC1JbmZpbml0eQorZHFtbmcxNDIgbWlubWFnICBOYU4gLTEwMDAgICAtPiAgLTEwMDAKK2RxbW5nMTQzIG1pbm1hZyAgTmFOIC0xICAgICAgLT4gIC0xCitkcW1uZzE0NCBtaW5tYWcgIE5hTiAtMCAgICAgIC0+ICAtMAorZHFtbmcxNDUgbWlubWFnICBOYU4gIDAgICAgICAtPiAgMAorZHFtbmcxNDYgbWlubWFnICBOYU4gIDEgICAgICAtPiAgMQorZHFtbmcxNDcgbWlubWFnICBOYU4gIDEwMDAgICAtPiAgMTAwMAorZHFtbmcxNDggbWlubWFnICBOYU4gIEluZiAgICAtPiAgSW5maW5pdHkKK2RxbW5nMTQ5IG1pbm1hZyAgTmFOICBOYU4gICAgLT4gIE5hTgorZHFtbmcxNTAgbWlubWFnIC1JbmYgIE5hTiAgICAtPiAtSW5maW5pdHkKK2RxbW5nMTUxIG1pbm1hZyAtMTAwMCBOYU4gICAgLT4gLTEwMDAKK2RxbW5nMTUyIG1pbm1hZyAtMSAgIC1OYU4gICAgLT4gLTEKK2RxbW5nMTUzIG1pbm1hZyAtMCAgICBOYU4gICAgLT4gLTAKK2RxbW5nMTU0IG1pbm1hZyAgMCAgIC1OYU4gICAgLT4gIDAKK2RxbW5nMTU1IG1pbm1hZyAgMSAgICBOYU4gICAgLT4gIDEKK2RxbW5nMTU2IG1pbm1hZyAgMTAwMCBOYU4gICAgLT4gIDEwMDAKK2RxbW5nMTU3IG1pbm1hZyAgSW5mICBOYU4gICAgLT4gIEluZmluaXR5CisKK2RxbW5nMTYxIG1pbm1hZyAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTYyIG1pbm1hZyAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTYzIG1pbm1hZyAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTY0IG1pbm1hZyAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTY1IG1pbm1hZyAtc05hTiAgMCAgICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTY2IG1pbm1hZyAtc05hTiAgMSAgICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTY3IG1pbm1hZyAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTY4IG1pbm1hZyAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTY5IG1pbm1hZyAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTcwIG1pbm1hZyAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTcxIG1pbm1hZyAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTcyIG1pbm1hZyAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTczIG1pbm1hZyAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTc0IG1pbm1hZyAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTc1IG1pbm1hZyAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTc2IG1pbm1hZyAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTc3IG1pbm1hZyAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTc4IG1pbm1hZyAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTc5IG1pbm1hZyAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHFtbmcxODEgbWlubWFnICBOYU45ICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtbmcxODIgbWlubWFnIC1OYU44ICAgIDk5OTAgIC0+ICA5OTkwCitkcW1uZzE4MyBtaW5tYWcgIE5hTjcxICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RxbW5nMTg0IG1pbm1hZyAgTmFOMSAgICBOYU41NCAtPiAgTmFOMQorZHFtbmcxODUgbWlubWFnICBOYU4yMiAgLU5hTjUzIC0+ICBOYU4yMgorZHFtbmcxODYgbWlubWFnIC1OYU4zICAgIE5hTjYgIC0+IC1OYU4zCitkcW1uZzE4NyBtaW5tYWcgLU5hTjQ0ICAgTmFONyAgLT4gLU5hTjQ0CisKK2RxbW5nMTg4IG1pbm1hZyAtSW5mICAgICBOYU40MSAtPiAtSW5maW5pdHkKK2RxbW5nMTg5IG1pbm1hZyAtOTk5OSAgIC1OYU4zMyAtPiAtOTk5OQorZHFtbmcxOTAgbWlubWFnICBJbmYgICAgIE5hTjIgIC0+ICBJbmZpbml0eQorCitkcW1uZzE5MSBtaW5tYWcgIHNOYU45OSAtSW5mICAgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZHFtbmcxOTIgbWlubWFnICBzTmFOOTggLTExICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTkzIG1pbm1hZyAtc05hTjk3ICBOYU44ICAgLT4gLU5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE5NCBtaW5tYWcgIHNOYU42OSBzTmFOOTQgIC0+ICBOYU42OSBJbnZhbGlkX29wZXJhdGlvbgorZHFtbmcxOTUgbWlubWFnICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTk2IG1pbm1hZyAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE5NyBtaW5tYWcgIDA4OCAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZHFtbmcxOTggbWlubWFnICBJbmYgICAtc05hTjkwICAtPiAtTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTk5IG1pbm1hZyAgTmFOICAgIHNOYU44NiAgLT4gIE5hTjg2IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG9sZCByb3VuZGluZyBjaGVja3MKK2RxbW5nMjIxIG1pbm1hZyAtMTIzNDU2NzgwMDAgMSAgLT4gMQorZHFtbmcyMjIgbWlubWFnIDEgLTEyMzQ1Njc4MDAwICAtPiAxCitkcW1uZzIyMyBtaW5tYWcgLTEyMzQ1Njc4MDAgIDEgIC0+IDEKK2RxbW5nMjI0IG1pbm1hZyAxIC0xMjM0NTY3ODAwICAgLT4gMQorZHFtbmcyMjUgbWlubWFnIC0xMjM0NTY3ODkwICAxICAtPiAxCitkcW1uZzIyNiBtaW5tYWcgMSAtMTIzNDU2Nzg5MCAgIC0+IDEKK2RxbW5nMjI3IG1pbm1hZyAtMTIzNDU2Nzg5MSAgMSAgLT4gMQorZHFtbmcyMjggbWlubWFnIDEgLTEyMzQ1Njc4OTEgICAtPiAxCitkcW1uZzIyOSBtaW5tYWcgLTEyMzQ1Njc4OTAxIDEgIC0+IDEKK2RxbW5nMjMwIG1pbm1hZyAxIC0xMjM0NTY3ODkwMSAgLT4gMQorZHFtbmcyMzEgbWlubWFnIC0xMjM0NTY3ODk2ICAxICAtPiAxCitkcW1uZzIzMiBtaW5tYWcgMSAtMTIzNDU2Nzg5NiAgIC0+IDEKK2RxbW5nMjMzIG1pbm1hZyAxMjM0NTY3ODkxICAxICAgLT4gMQorZHFtbmcyMzQgbWlubWFnIDEgMTIzNDU2Nzg5MSAgICAtPiAxCitkcW1uZzIzNSBtaW5tYWcgMTIzNDU2Nzg5MDEgMSAgIC0+IDEKK2RxbW5nMjM2IG1pbm1hZyAxIDEyMzQ1Njc4OTAxICAgLT4gMQorZHFtbmcyMzcgbWlubWFnIDEyMzQ1Njc4OTYgIDEgICAtPiAxCitkcW1uZzIzOCBtaW5tYWcgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworLS0gZnJvbSBleGFtcGxlcworZHFtbmcyODAgbWlubWFnICczJyAgICcyJyAgLT4gICcyJworZHFtbmcyODEgbWlubWFnICctMTAnICczJyAgLT4gICczJworZHFtbmcyODIgbWlubWFnICcxLjAnICcxJyAgLT4gICcxLjAnCitkcW1uZzI4MyBtaW5tYWcgJzEnICcxLjAnICAtPiAgJzEuMCcKK2RxbW5nMjg0IG1pbm1hZyAnNycgJ05hTicgIC0+ICAnNycKKworLS0gZXhwYW5kZWQgbGlzdCBmcm9tIG1pbi9tYXggNzU0ciBwdXJwbGUgcHJvc2UKKy0tIFtleHBsaWNpdCB0ZXN0cyBmb3IgZXhwb25lbnQgb3JkZXJpbmddCitkcW1uZzQwMSBtaW5tYWcgIEluZiAgICAxLjEgICAgIC0+ICAxLjEKK2RxbW5nNDAyIG1pbm1hZyAgMS4xICAgIDEgICAgICAgLT4gIDEKK2RxbW5nNDAzIG1pbm1hZyAgMSAgICAgIDEuMCAgICAgLT4gIDEuMAorZHFtbmc0MDQgbWlubWFnICAxLjAgICAgMC4xICAgICAtPiAgMC4xCitkcW1uZzQwNSBtaW5tYWcgIDAuMSAgICAwLjEwICAgIC0+ICAwLjEwCitkcW1uZzQwNiBtaW5tYWcgIDAuMTAgICAwLjEwMCAgIC0+ICAwLjEwMAorZHFtbmc0MDcgbWlubWFnICAwLjEwICAgMCAgICAgICAtPiAgMAorZHFtbmc0MDggbWlubWFnICAwICAgICAgMC4wICAgICAtPiAgMC4wCitkcW1uZzQwOSBtaW5tYWcgIDAuMCAgIC0wICAgICAgIC0+IC0wCitkcW1uZzQxMCBtaW5tYWcgIDAuMCAgIC0wLjAgICAgIC0+IC0wLjAKK2RxbW5nNDExIG1pbm1hZyAgMC4wMCAgLTAuMCAgICAgLT4gLTAuMAorZHFtbmc0MTIgbWlubWFnICAwLjAgICAtMC4wMCAgICAtPiAtMC4wMAorZHFtbmc0MTMgbWlubWFnICAwICAgICAtMC4wICAgICAtPiAtMC4wCitkcW1uZzQxNCBtaW5tYWcgIDAgICAgIC0wICAgICAgIC0+IC0wCitkcW1uZzQxNSBtaW5tYWcgLTAuMCAgIC0wICAgICAgIC0+IC0wCitkcW1uZzQxNiBtaW5tYWcgLTAgICAgIC0wLjEwMCAgIC0+IC0wCitkcW1uZzQxNyBtaW5tYWcgLTAuMTAwIC0wLjEwICAgIC0+IC0wLjEwCitkcW1uZzQxOCBtaW5tYWcgLTAuMTAgIC0wLjEgICAgIC0+IC0wLjEKK2RxbW5nNDE5IG1pbm1hZyAtMC4xICAgLTEuMCAgICAgLT4gLTAuMQorZHFtbmc0MjAgbWlubWFnIC0xLjAgICAtMSAgICAgICAtPiAtMQorZHFtbmc0MjEgbWlubWFnIC0xICAgICAtMS4xICAgICAtPiAtMQorZHFtbmc0MjMgbWlubWFnIC0xLjEgICAtSW5mICAgICAtPiAtMS4xCistLSBzYW1lIHdpdGggb3BlcmFuZHMgcmV2ZXJzZWQKK2RxbW5nNDMxIG1pbm1hZyAgMS4xICAgIEluZiAgICAgLT4gIDEuMQorZHFtbmc0MzIgbWlubWFnICAxICAgICAgMS4xICAgICAtPiAgMQorZHFtbmc0MzMgbWlubWFnICAxLjAgICAgMSAgICAgICAtPiAgMS4wCitkcW1uZzQzNCBtaW5tYWcgIDAuMSAgICAxLjAgICAgIC0+ICAwLjEKK2RxbW5nNDM1IG1pbm1hZyAgMC4xMCAgIDAuMSAgICAgLT4gIDAuMTAKK2RxbW5nNDM2IG1pbm1hZyAgMC4xMDAgIDAuMTAgICAgLT4gIDAuMTAwCitkcW1uZzQzNyBtaW5tYWcgIDAgICAgICAwLjEwICAgIC0+ICAwCitkcW1uZzQzOCBtaW5tYWcgIDAuMCAgICAwICAgICAgIC0+ICAwLjAKK2RxbW5nNDM5IG1pbm1hZyAtMCAgICAgIDAuMCAgICAgLT4gLTAKK2RxbW5nNDQwIG1pbm1hZyAtMC4wICAgIDAuMCAgICAgLT4gLTAuMAorZHFtbmc0NDEgbWlubWFnIC0wLjAgICAgMC4wMCAgICAtPiAtMC4wCitkcW1uZzQ0MiBtaW5tYWcgLTAuMDAgICAwLjAgICAgIC0+IC0wLjAwCitkcW1uZzQ0MyBtaW5tYWcgLTAuMCAgICAwICAgICAgIC0+IC0wLjAKK2RxbW5nNDQ0IG1pbm1hZyAtMCAgICAgIDAgICAgICAgLT4gLTAKK2RxbW5nNDQ1IG1pbm1hZyAtMCAgICAgLTAuMCAgICAgLT4gLTAKK2RxbW5nNDQ2IG1pbm1hZyAtMC4xMDAgLTAgICAgICAgLT4gLTAKK2RxbW5nNDQ3IG1pbm1hZyAtMC4xMCAgLTAuMTAwICAgLT4gLTAuMTAKK2RxbW5nNDQ4IG1pbm1hZyAtMC4xICAgLTAuMTAgICAgLT4gLTAuMQorZHFtbmc0NDkgbWlubWFnIC0xLjAgICAtMC4xICAgICAtPiAtMC4xCitkcW1uZzQ1MCBtaW5tYWcgLTEgICAgIC0xLjAgICAgIC0+IC0xCitkcW1uZzQ1MSBtaW5tYWcgLTEuMSAgIC0xICAgICAgIC0+IC0xCitkcW1uZzQ1MyBtaW5tYWcgLUluZiAgIC0xLjEgICAgIC0+IC0xLjEKKy0tIGxhcmdpZXMKK2RxbW5nNDYwIG1pbm1hZyAgMTAwMCAgIDFFKzMgICAgLT4gIDEwMDAKK2RxbW5nNDYxIG1pbm1hZyAgMUUrMyAgIDEwMDAgICAgLT4gIDEwMDAKK2RxbW5nNDYyIG1pbm1hZyAgMTAwMCAgLTFFKzMgICAgLT4gLTFFKzMKK2RxbW5nNDYzIG1pbm1hZyAgMUUrMyAgIC0zODQgICAgLT4gLTM4NAorZHFtbmc0NjQgbWlubWFnIC0zODQgICAgMUUrMyAgICAtPiAtMzg0CitkcW1uZzQ2NSBtaW5tYWcgLTFFKzMgICAxMDAwICAgIC0+IC0xRSszCitkcW1uZzQ2NiBtaW5tYWcgLTM4NCAgIC0xRSszICAgIC0+IC0zODQKK2RxbW5nNDY3IG1pbm1hZyAtMUUrMyAgIC0zODQgICAgLT4gLTM4NAorCistLSBzdWJub3JtYWxzCitkcW1uZzUxMCBtaW5tYWcgIDEuMDBFLTYxNDMgICAgICAgMCAgLT4gICAwCitkcW1uZzUxMSBtaW5tYWcgIDAuMUUtNjE0MyAgICAgICAgMCAgLT4gICAwCitkcW1uZzUxMiBtaW5tYWcgIDAuMTBFLTYxNDMgICAgICAgMCAgLT4gICAwCitkcW1uZzUxMyBtaW5tYWcgIDAuMTAwRS02MTQzICAgICAgMCAgLT4gICAwCitkcW1uZzUxNCBtaW5tYWcgIDAuMDFFLTYxNDMgICAgICAgMCAgLT4gICAwCitkcW1uZzUxNSBtaW5tYWcgIDAuOTk5RS02MTQzICAgICAgMCAgLT4gICAwCitkcW1uZzUxNiBtaW5tYWcgIDAuMDk5RS02MTQzICAgICAgMCAgLT4gICAwCitkcW1uZzUxNyBtaW5tYWcgIDAuMDA5RS02MTQzICAgICAgMCAgLT4gICAwCitkcW1uZzUxOCBtaW5tYWcgIDAuMDAxRS02MTQzICAgICAgMCAgLT4gICAwCitkcW1uZzUxOSBtaW5tYWcgIDAuMDAwOUUtNjE0MyAgICAgMCAgLT4gICAwCitkcW1uZzUyMCBtaW5tYWcgIDAuMDAwMUUtNjE0MyAgICAgMCAgLT4gICAwCisKK2RxbW5nNTMwIG1pbm1hZyAtMS4wMEUtNjE0MyAgICAgICAwICAtPiAgIDAKK2RxbW5nNTMxIG1pbm1hZyAtMC4xRS02MTQzICAgICAgICAwICAtPiAgIDAKK2RxbW5nNTMyIG1pbm1hZyAtMC4xMEUtNjE0MyAgICAgICAwICAtPiAgIDAKK2RxbW5nNTMzIG1pbm1hZyAtMC4xMDBFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbW5nNTM0IG1pbm1hZyAtMC4wMUUtNjE0MyAgICAgICAwICAtPiAgIDAKK2RxbW5nNTM1IG1pbm1hZyAtMC45OTlFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbW5nNTM2IG1pbm1hZyAtMC4wOTlFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbW5nNTM3IG1pbm1hZyAtMC4wMDlFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbW5nNTM4IG1pbm1hZyAtMC4wMDFFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbW5nNTM5IG1pbm1hZyAtMC4wMDA5RS02MTQzICAgICAwICAtPiAgIDAKK2RxbW5nNTQwIG1pbm1hZyAtMC4wMDAxRS02MTQzICAgICAwICAtPiAgIDAKKworCistLSBOdWxsIHRlc3RzCitkcW1uZzkwMCBtaW5tYWcgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzkwMSBtaW5tYWcgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWludXMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFNaW51cy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTQ2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWludXMuZGVjVGVzdApAQCAtMCwwICsxLDg4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxTWludXMuZGVjVGVzdCAtLSBkZWNRdWFkIDAteCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNRdWFkcy4KK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjaworZHFtbnMwMDEgbWludXMgICAgICAgKzcuNTAgIC0+IC03LjUwCisKKy0tIEluZmluaXRpZXMKK2RxbW5zMDExIG1pbnVzICBJbmZpbml0eSAgICAtPiAtSW5maW5pdHkKK2RxbW5zMDEyIG1pbnVzICAtSW5maW5pdHkgICAtPiBJbmZpbml0eQorCistLSBOYU5zLCAwIHBheWxvYWQKK2RxbW5zMDIxIG1pbnVzICAgICAgICAgTmFOICAtPiBOYU4KK2RxbW5zMDIyIG1pbnVzICAgICAgICAtTmFOICAtPiAtTmFOCitkcW1uczAyMyBtaW51cyAgICAgICAgc05hTiAgLT4gTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtbnMwMjQgbWludXMgICAgICAgLXNOYU4gIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorZHFtbnMwMzEgbWludXMgICAgICAgTmFOMTMgIC0+IE5hTjEzCitkcW1uczAzMiBtaW51cyAgICAgIC1OYU4xMyAgLT4gLU5hTjEzCitkcW1uczAzMyBtaW51cyAgICAgIHNOYU4xMyAgLT4gTmFOMTMgICBJbnZhbGlkX29wZXJhdGlvbgorZHFtbnMwMzQgbWludXMgICAgIC1zTmFOMTMgIC0+IC1OYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5zMDM1IG1pbnVzICAgICAgIE5hTjcwICAtPiBOYU43MAorZHFtbnMwMzYgbWludXMgICAgICAtTmFONzAgIC0+IC1OYU43MAorZHFtbnMwMzcgbWludXMgICAgICBzTmFOMTAxIC0+IE5hTjEwMSAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5zMDM4IG1pbnVzICAgICAtc05hTjEwMSAtPiAtTmFOMTAxIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGZpbml0ZXMKK2RxbW5zMTAxIG1pbnVzICAgICAgICAgIDcgICAtPiAtNworZHFtbnMxMDIgbWludXMgICAgICAgICAtNyAgIC0+IDcKK2RxbW5zMTAzIG1pbnVzICAgICAgICAgNzUgICAtPiAtNzUKK2RxbW5zMTA0IG1pbnVzICAgICAgICAtNzUgICAtPiA3NQorZHFtbnMxMDUgbWludXMgICAgICAgNy41MCAgIC0+IC03LjUwCitkcW1uczEwNiBtaW51cyAgICAgIC03LjUwICAgLT4gNy41MAorZHFtbnMxMDcgbWludXMgICAgICAgNy41MDAgIC0+IC03LjUwMAorZHFtbnMxMDggbWludXMgICAgICAtNy41MDAgIC0+IDcuNTAwCisKKy0tIHplcm9zCitkcW1uczExMSBtaW51cyAgICAgICAgICAwICAgLT4gMAorZHFtbnMxMTIgbWludXMgICAgICAgICAtMCAgIC0+IDAKK2RxbW5zMTEzIG1pbnVzICAgICAgIDBFKzQgICAtPiAwRSs0CitkcW1uczExNCBtaW51cyAgICAgIC0wRSs0ICAgLT4gMEUrNAorZHFtbnMxMTUgbWludXMgICAgIDAuMDAwMCAgIC0+IDAuMDAwMAorZHFtbnMxMTYgbWludXMgICAgLTAuMDAwMCAgIC0+IDAuMDAwMAorZHFtbnMxMTcgbWludXMgICAgICAwRS0xNDEgIC0+IDBFLTE0MQorZHFtbnMxMTggbWludXMgICAgIC0wRS0xNDEgIC0+IDBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZHFtbnMxMjEgbWludXMgICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyICAgIC0+IC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcW1uczEyMiBtaW51cyAgLTI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIgICAgLT4gIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIKK2RxbW5zMTIzIG1pbnVzICAgMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MSAgICAtPiAtMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MQorZHFtbnMxMjQgbWludXMgIC0xMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxICAgIC0+ICAxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcW1uczEzMSBtaW51cyAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbW5zMTMyIG1pbnVzICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IC0xRS02MTQzCitkcW1uczEzMyBtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxbW5zMTM0IG1pbnVzICAxRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IC0xRS02MTc2IFN1Ym5vcm1hbAorCitkcW1uczEzNSBtaW51cyAgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE3NiBTdWJub3JtYWwKK2RxbW5zMTM2IG1pbnVzICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFtbnMxMzcgbWludXMgIC0xRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDFFLTYxNDMKK2RxbW5zMTM4IG1pbnVzICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU11bHRpcGx5LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTXVsdGlwbHkuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg3YTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU11bHRpcGx5LmRlY1Rlc3QKQEAgLTAsMCArMSw1ODkgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFNdWx0aXBseS5kZWNUZXN0IC0tIGRlY1F1YWQgbXVsdGlwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyBhcmUgZm9yIGRlY1F1YWRzIG9ubHk7IGFsbCBhcmd1bWVudHMgYXJlCistLSByZXByZXNlbnRhYmxlIGluIGEgZGVjUXVhZAorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZHFtdWwwMDAgbXVsdGlwbHkgMiAgICAgIDIgLT4gNAorZHFtdWwwMDEgbXVsdGlwbHkgMiAgICAgIDMgLT4gNgorZHFtdWwwMDIgbXVsdGlwbHkgNSAgICAgIDEgLT4gNQorZHFtdWwwMDMgbXVsdGlwbHkgNSAgICAgIDIgLT4gMTAKK2RxbXVsMDA0IG11bHRpcGx5IDEuMjAgICAyIC0+IDIuNDAKK2RxbXVsMDA1IG11bHRpcGx5IDEuMjAgICAwIC0+IDAuMDAKK2RxbXVsMDA2IG11bHRpcGx5IDEuMjAgIC0yIC0+IC0yLjQwCitkcW11bDAwNyBtdWx0aXBseSAtMS4yMCAgMiAtPiAtMi40MAorZHFtdWwwMDggbXVsdGlwbHkgLTEuMjAgIDAgLT4gLTAuMDAKK2RxbXVsMDA5IG11bHRpcGx5IC0xLjIwIC0yIC0+IDIuNDAKK2RxbXVsMDEwIG11bHRpcGx5IDUuMDkgNy4xIC0+IDM2LjEzOQorZHFtdWwwMTEgbXVsdGlwbHkgMi41ICAgIDQgLT4gMTAuMAorZHFtdWwwMTIgbXVsdGlwbHkgMi41MCAgIDQgLT4gMTAuMDAKK2RxbXVsMDEzIG11bHRpcGx5IDEuMjM0NTY3ODkgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEuMjM0NTY3ODkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIFJvdW5kZWQKK2RxbXVsMDE1IG11bHRpcGx5IDIuNTAgICA0IC0+IDEwLjAwCitkcW11bDAxNiBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTk5OSAgOS45OTk5OTk5OTk5OTk5OTk5OSAtPiAgOTkuOTk5OTk5OTk5OTk5OTk5ODAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcW11bDAxNyBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTk5OSAtOS45OTk5OTk5OTk5OTk5OTk5OSAtPiAtOTkuOTk5OTk5OTk5OTk5OTk5ODAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcW11bDAxOCBtdWx0aXBseSAtOS45OTk5OTk5OTk5OTk5OTk5OSAgOS45OTk5OTk5OTk5OTk5OTk5OSAtPiAtOTkuOTk5OTk5OTk5OTk5OTk5ODAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcW11bDAxOSBtdWx0aXBseSAtOS45OTk5OTk5OTk5OTk5OTk5OSAtOS45OTk5OTk5OTk5OTk5OTk5OSAtPiAgOTkuOTk5OTk5OTk5OTk5OTk5ODAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHplcm9zLCBldGMuCitkcW11bDAyMSBtdWx0aXBseSAgMCAgICAgIDAgICAgIC0+ICAwCitkcW11bDAyMiBtdWx0aXBseSAgMCAgICAgLTAgICAgIC0+IC0wCitkcW11bDAyMyBtdWx0aXBseSAtMCAgICAgIDAgICAgIC0+IC0wCitkcW11bDAyNCBtdWx0aXBseSAtMCAgICAgLTAgICAgIC0+ICAwCitkcW11bDAyNSBtdWx0aXBseSAtMC4wICAgLTAuMCAgIC0+ICAwLjAwCitkcW11bDAyNiBtdWx0aXBseSAtMC4wICAgLTAuMCAgIC0+ICAwLjAwCitkcW11bDAyNyBtdWx0aXBseSAtMC4wICAgLTAuMCAgIC0+ICAwLjAwCitkcW11bDAyOCBtdWx0aXBseSAtMC4wICAgLTAuMCAgIC0+ICAwLjAwCitkcW11bDAzMCBtdWx0aXBseSAgNS4wMCAgIDFFLTMgIC0+ICAwLjAwNTAwCitkcW11bDAzMSBtdWx0aXBseSAgMDAuMDAgIDAuMDAwIC0+ICAwLjAwMDAwCitkcW11bDAzMiBtdWx0aXBseSAgMDAuMDAgIDBFLTMgIC0+ICAwLjAwMDAwICAgICAtLSByaHMgaXMgMAorZHFtdWwwMzMgbXVsdGlwbHkgIDBFLTMgICAwMC4wMCAtPiAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK2RxbXVsMDM0IG11bHRpcGx5IC01LjAwICAgMUUtMyAgLT4gLTAuMDA1MDAKK2RxbXVsMDM1IG11bHRpcGx5IC0wMC4wMCAgMC4wMDAgLT4gLTAuMDAwMDAKK2RxbXVsMDM2IG11bHRpcGx5IC0wMC4wMCAgMEUtMyAgLT4gLTAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitkcW11bDAzNyBtdWx0aXBseSAtMEUtMyAgIDAwLjAwIC0+IC0wLjAwMDAwICAgICAtLSBsaHMgaXMgMAorZHFtdWwwMzggbXVsdGlwbHkgIDUuMDAgIC0xRS0zICAtPiAtMC4wMDUwMAorZHFtdWwwMzkgbXVsdGlwbHkgIDAwLjAwIC0wLjAwMCAtPiAtMC4wMDAwMAorZHFtdWwwNDAgbXVsdGlwbHkgIDAwLjAwIC0wRS0zICAtPiAtMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2RxbXVsMDQxIG11bHRpcGx5ICAwRS0zICAtMDAuMDAgLT4gLTAuMDAwMDAgICAgIC0tIGxocyBpcyAwCitkcW11bDA0MiBtdWx0aXBseSAtNS4wMCAgLTFFLTMgIC0+ICAwLjAwNTAwCitkcW11bDA0MyBtdWx0aXBseSAtMDAuMDAgLTAuMDAwIC0+ICAwLjAwMDAwCitkcW11bDA0NCBtdWx0aXBseSAtMDAuMDAgLTBFLTMgIC0+ICAwLjAwMDAwICAgICAtLSByaHMgaXMgMAorZHFtdWwwNDUgbXVsdGlwbHkgLTBFLTMgIC0wMC4wMCAtPiAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKKworLS0gZXhhbXBsZXMgZnJvbSBkZWNhcml0aAorZHFtdWwwNTAgbXVsdGlwbHkgMS4yMCAzICAgICAgICAtPiAzLjYwCitkcW11bDA1MSBtdWx0aXBseSA3ICAgIDMgICAgICAgIC0+IDIxCitkcW11bDA1MiBtdWx0aXBseSAwLjkgIDAuOCAgICAgIC0+IDAuNzIKK2RxbXVsMDUzIG11bHRpcGx5IDAuOSAgLTAgICAgICAgLT4gLTAuMAorZHFtdWwwNTQgbXVsdGlwbHkgNjU0MzIxIDY1NDMyMSAtPiA0MjgxMzU5NzEwNDEKKworZHFtdWwwNjAgbXVsdGlwbHkgMTIzLjQ1IDFlNyAgLT4gIDEuMjM0NUUrOQorZHFtdWwwNjEgbXVsdGlwbHkgMTIzLjQ1IDFlOCAgLT4gIDEuMjM0NUUrMTAKK2RxbXVsMDYyIG11bHRpcGx5IDEyMy40NSAxZSs5IC0+ICAxLjIzNDVFKzExCitkcW11bDA2MyBtdWx0aXBseSAxMjMuNDUgMWUxMCAtPiAgMS4yMzQ1RSsxMgorZHFtdWwwNjQgbXVsdGlwbHkgMTIzLjQ1IDFlMTEgLT4gIDEuMjM0NUUrMTMKK2RxbXVsMDY1IG11bHRpcGx5IDEyMy40NSAxZTEyIC0+ICAxLjIzNDVFKzE0CitkcW11bDA2NiBtdWx0aXBseSAxMjMuNDUgMWUxMyAtPiAgMS4yMzQ1RSsxNQorCisKKy0tIHRlc3Qgc29tZSBpbnRlcm1lZGlhdGUgbGVuZ3RocworLS0gICAgICAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RxbXVsMDgwIG11bHRpcGx5IDAuMSAxMjMwMTIzNDU2NDU2Nzg5ICAgICAtPiAxMjMwMTIzNDU2NDU2NzguOQorZHFtdWwwODQgbXVsdGlwbHkgMC4xIDEyMzAxMjM0NTY0NTY3ODkgICAgIC0+IDEyMzAxMjM0NTY0NTY3OC45CitkcW11bDA5MCBtdWx0aXBseSAxMjMwMTIzNDU2NDU2Nzg5ICAgICAwLjEgLT4gMTIzMDEyMzQ1NjQ1Njc4LjkKK2RxbXVsMDk0IG11bHRpcGx5IDEyMzAxMjM0NTY0NTY3ODkgICAgIDAuMSAtPiAxMjMwMTIzNDU2NDU2NzguOQorCistLSB0ZXN0IHNvbWUgbW9yZSBlZGdlIGNhc2VzIGFuZCBjYXJyaWVzCitkcW11bDEwMSBtdWx0aXBseSA5IDkgICAtPiA4MQorZHFtdWwxMDIgbXVsdGlwbHkgOSA5MCAgIC0+IDgxMAorZHFtdWwxMDMgbXVsdGlwbHkgOSA5MDAgICAtPiA4MTAwCitkcW11bDEwNCBtdWx0aXBseSA5IDkwMDAgICAtPiA4MTAwMAorZHFtdWwxMDUgbXVsdGlwbHkgOSA5MDAwMCAgIC0+IDgxMDAwMAorZHFtdWwxMDYgbXVsdGlwbHkgOSA5MDAwMDAgICAtPiA4MTAwMDAwCitkcW11bDEwNyBtdWx0aXBseSA5IDkwMDAwMDAgICAtPiA4MTAwMDAwMAorZHFtdWwxMDggbXVsdGlwbHkgOSA5MDAwMDAwMCAgIC0+IDgxMDAwMDAwMAorZHFtdWwxMDkgbXVsdGlwbHkgOSA5MDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwCitkcW11bDExMCBtdWx0aXBseSA5IDkwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMAorZHFtdWwxMTEgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMAorZHFtdWwxMTIgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwCitkcW11bDExMyBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMAorZHFtdWwxMTQgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMAorZHFtdWwxMTUgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwCistLWRxbXVsMTE2IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwCistLWRxbXVsMTE3IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAKKy0tZHFtdWwxMTggbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwCistLWRxbXVsMTE5IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwCistLWRxbXVsMTIwIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tZHFtdWwxMjEgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwCistLWRxbXVsMTIyIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwCistLWRxbXVsMTIzIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tIHRlc3Qgc29tZSBtb3JlIGVkZ2UgY2FzZXMgd2l0aG91dCBjYXJyaWVzCitkcW11bDEzMSBtdWx0aXBseSAzIDMgICAtPiA5CitkcW11bDEzMiBtdWx0aXBseSAzIDMwICAgLT4gOTAKK2RxbXVsMTMzIG11bHRpcGx5IDMgMzAwICAgLT4gOTAwCitkcW11bDEzNCBtdWx0aXBseSAzIDMwMDAgICAtPiA5MDAwCitkcW11bDEzNSBtdWx0aXBseSAzIDMwMDAwICAgLT4gOTAwMDAKK2RxbXVsMTM2IG11bHRpcGx5IDMgMzAwMDAwICAgLT4gOTAwMDAwCitkcW11bDEzNyBtdWx0aXBseSAzIDMwMDAwMDAgICAtPiA5MDAwMDAwCitkcW11bDEzOCBtdWx0aXBseSAzIDMwMDAwMDAwICAgLT4gOTAwMDAwMDAKK2RxbXVsMTM5IG11bHRpcGx5IDMgMzAwMDAwMDAwICAgLT4gOTAwMDAwMDAwCitkcW11bDE0MCBtdWx0aXBseSAzIDMwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwCitkcW11bDE0MSBtdWx0aXBseSAzIDMwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAKK2RxbXVsMTQyIG11bHRpcGx5IDMgMzAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwCitkcW11bDE0MyBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwCitkcW11bDE0NCBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAKK2RxbXVsMTQ1IG11bHRpcGx5IDMgMzAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwCitkcW11bDE0NiBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAwCitkcW11bDE0NyBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTQ4IG11bHRpcGx5IDMgMzAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDE0OSBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDE1MCBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTUxIG11bHRpcGx5IDMgMzAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDE1MiBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDE1MyBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworZHFtdWwyNjMgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTExOTkyODI5NiBJbmV4YWN0IFJvdW5kZWQKKworLS0gdGVzdCBzb21lIGVkZ2UgY2FzZXMgd2l0aCBleGFjdCByb3VuZGluZworZHFtdWwzMDEgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDMwMiBtdWx0aXBseSA5MDAwMDAwMDAwMDAwMDAwMDAgOTAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMDMgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMDQgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDMwNSBtdWx0aXBseSA5MDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMDYgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMDcgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDMwOCBtdWx0aXBseSA5MDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMDkgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMTAgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDMxMSBtdWx0aXBseSA5MDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMTIgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMTMgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDMxNCBtdWx0aXBseSA5MDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMTUgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMTYgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDMxNyBtdWx0aXBseSA5MDAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAtPiA4LjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgIFJvdW5kZWQKK2RxbXVsMzE4IG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAtPiA4LjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzUgIFJvdW5kZWQKK2RxbXVsMzE5IG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM2ICBSb3VuZGVkCitkcW11bDMyMCBtdWx0aXBseSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAtPiA4LjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzcgIFJvdW5kZWQKK2RxbXVsMzIxIG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAtPiA4LjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzggIFJvdW5kZWQKK2RxbXVsMzIyIG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM5ICBSb3VuZGVkCitkcW11bDMyMyBtdWx0aXBseSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAtPiA4LjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNDAgIFJvdW5kZWQKKworLS0gdHJ5emVyb3MgY2FzZXMKK2RxbXVsNTA0ICBtdWx0aXBseSAgMEUtNDI2MCAxMDAwRS00MjYwICAtPiAwRS02MTc2IENsYW1wZWQKK2RxbXVsNTA1ICBtdWx0aXBseSAgMTAwRSs0MjYwIDBFKzQyNjAgICAtPiAwRSs2MTExIENsYW1wZWQKKworLS0gbWl4ZWQgd2l0aCB6ZXJvcworZHFtdWw1NDEgbXVsdGlwbHkgIDAgICAgLTEgICAgIC0+IC0wCitkcW11bDU0MiBtdWx0aXBseSAtMCAgICAtMSAgICAgLT4gIDAKK2RxbXVsNTQzIG11bHRpcGx5ICAwICAgICAxICAgICAtPiAgMAorZHFtdWw1NDQgbXVsdGlwbHkgLTAgICAgIDEgICAgIC0+IC0wCitkcW11bDU0NSBtdWx0aXBseSAtMSAgICAgMCAgICAgLT4gLTAKK2RxbXVsNTQ2IG11bHRpcGx5IC0xICAgIC0wICAgICAtPiAgMAorZHFtdWw1NDcgbXVsdGlwbHkgIDEgICAgIDAgICAgIC0+ICAwCitkcW11bDU0OCBtdWx0aXBseSAgMSAgICAtMCAgICAgLT4gLTAKKworZHFtdWw1NTEgbXVsdGlwbHkgIDAuMCAgLTEgICAgIC0+IC0wLjAKK2RxbXVsNTUyIG11bHRpcGx5IC0wLjAgIC0xICAgICAtPiAgMC4wCitkcW11bDU1MyBtdWx0aXBseSAgMC4wICAgMSAgICAgLT4gIDAuMAorZHFtdWw1NTQgbXVsdGlwbHkgLTAuMCAgIDEgICAgIC0+IC0wLjAKK2RxbXVsNTU1IG11bHRpcGx5IC0xLjAgICAwICAgICAtPiAtMC4wCitkcW11bDU1NiBtdWx0aXBseSAtMS4wICAtMCAgICAgLT4gIDAuMAorZHFtdWw1NTcgbXVsdGlwbHkgIDEuMCAgIDAgICAgIC0+ICAwLjAKK2RxbXVsNTU4IG11bHRpcGx5ICAxLjAgIC0wICAgICAtPiAtMC4wCisKK2RxbXVsNTYxIG11bHRpcGx5ICAwICAgIC0xLjAgICAtPiAtMC4wCitkcW11bDU2MiBtdWx0aXBseSAtMCAgICAtMS4wICAgLT4gIDAuMAorZHFtdWw1NjMgbXVsdGlwbHkgIDAgICAgIDEuMCAgIC0+ICAwLjAKK2RxbXVsNTY0IG11bHRpcGx5IC0wICAgICAxLjAgICAtPiAtMC4wCitkcW11bDU2NSBtdWx0aXBseSAtMSAgICAgMC4wICAgLT4gLTAuMAorZHFtdWw1NjYgbXVsdGlwbHkgLTEgICAgLTAuMCAgIC0+ICAwLjAKK2RxbXVsNTY3IG11bHRpcGx5ICAxICAgICAwLjAgICAtPiAgMC4wCitkcW11bDU2OCBtdWx0aXBseSAgMSAgICAtMC4wICAgLT4gLTAuMAorCitkcW11bDU3MSBtdWx0aXBseSAgMC4wICAtMS4wICAgLT4gLTAuMDAKK2RxbXVsNTcyIG11bHRpcGx5IC0wLjAgIC0xLjAgICAtPiAgMC4wMAorZHFtdWw1NzMgbXVsdGlwbHkgIDAuMCAgIDEuMCAgIC0+ICAwLjAwCitkcW11bDU3NCBtdWx0aXBseSAtMC4wICAgMS4wICAgLT4gLTAuMDAKK2RxbXVsNTc1IG11bHRpcGx5IC0xLjAgICAwLjAgICAtPiAtMC4wMAorZHFtdWw1NzYgbXVsdGlwbHkgLTEuMCAgLTAuMCAgIC0+ICAwLjAwCitkcW11bDU3NyBtdWx0aXBseSAgMS4wICAgMC4wICAgLT4gIDAuMDAKK2RxbXVsNTc4IG11bHRpcGx5ICAxLjAgIC0wLjAgICAtPiAtMC4wMAorCisKKy0tIFNwZWNpYWxzCitkcW11bDU4MCBtdWx0aXBseSAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkcW11bDU4MSBtdWx0aXBseSAgSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkcW11bDU4MiBtdWx0aXBseSAgSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitkcW11bDU4MyBtdWx0aXBseSAgSW5mICAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNTg0IG11bHRpcGx5ICBJbmYgICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw1ODUgbXVsdGlwbHkgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorZHFtdWw1ODYgbXVsdGlwbHkgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorZHFtdWw1ODcgbXVsdGlwbHkgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFtdWw1ODggbXVsdGlwbHkgLTEwMDAgIEluZiAgIC0+IC1JbmZpbml0eQorZHFtdWw1ODkgbXVsdGlwbHkgLUluZiAgIEluZiAgIC0+IC1JbmZpbml0eQorZHFtdWw1OTAgbXVsdGlwbHkgLTEgICAgIEluZiAgIC0+IC1JbmZpbml0eQorZHFtdWw1OTEgbXVsdGlwbHkgLTAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDU5MiBtdWx0aXBseSAgMCAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNTkzIG11bHRpcGx5ICAxICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbXVsNTk0IG11bHRpcGx5ICAxMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbXVsNTk1IG11bHRpcGx5ICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZHFtdWw2MDAgbXVsdGlwbHkgLUluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorZHFtdWw2MDEgbXVsdGlwbHkgLUluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZHFtdWw2MDIgbXVsdGlwbHkgLUluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorZHFtdWw2MDMgbXVsdGlwbHkgLUluZiAgLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDYwNCBtdWx0aXBseSAtSW5mICAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjA1IG11bHRpcGx5IC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RxbXVsNjA2IG11bHRpcGx5IC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2RxbXVsNjA3IG11bHRpcGx5IC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK2RxbXVsNjA4IG11bHRpcGx5IC0xMDAwICBJbmYgICAtPiAtSW5maW5pdHkKK2RxbXVsNjA5IG11bHRpcGx5IC1JbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKK2RxbXVsNjEwIG11bHRpcGx5IC0xICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2RxbXVsNjExIG11bHRpcGx5IC0wICAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2MTIgbXVsdGlwbHkgIDAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDYxMyBtdWx0aXBseSAgMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkcW11bDYxNCBtdWx0aXBseSAgMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitkcW11bDYxNSBtdWx0aXBseSAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5CisKK2RxbXVsNjIxIG11bHRpcGx5ICBOYU4gLUluZiAgICAtPiAgTmFOCitkcW11bDYyMiBtdWx0aXBseSAgTmFOIC0xMDAwICAgLT4gIE5hTgorZHFtdWw2MjMgbXVsdGlwbHkgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2RxbXVsNjI0IG11bHRpcGx5ICBOYU4gLTAgICAgICAtPiAgTmFOCitkcW11bDYyNSBtdWx0aXBseSAgTmFOICAwICAgICAgLT4gIE5hTgorZHFtdWw2MjYgbXVsdGlwbHkgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2RxbXVsNjI3IG11bHRpcGx5ICBOYU4gIDEwMDAgICAtPiAgTmFOCitkcW11bDYyOCBtdWx0aXBseSAgTmFOICBJbmYgICAgLT4gIE5hTgorZHFtdWw2MjkgbXVsdGlwbHkgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RxbXVsNjMwIG11bHRpcGx5IC1JbmYgIE5hTiAgICAtPiAgTmFOCitkcW11bDYzMSBtdWx0aXBseSAtMTAwMCBOYU4gICAgLT4gIE5hTgorZHFtdWw2MzIgbXVsdGlwbHkgLTEgICAgTmFOICAgIC0+ICBOYU4KK2RxbXVsNjMzIG11bHRpcGx5IC0wICAgIE5hTiAgICAtPiAgTmFOCitkcW11bDYzNCBtdWx0aXBseSAgMCAgICBOYU4gICAgLT4gIE5hTgorZHFtdWw2MzUgbXVsdGlwbHkgIDEgICAgTmFOICAgIC0+ICBOYU4KK2RxbXVsNjM2IG11bHRpcGx5ICAxMDAwIE5hTiAgICAtPiAgTmFOCitkcW11bDYzNyBtdWx0aXBseSAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkcW11bDY0MSBtdWx0aXBseSAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjQyIG11bHRpcGx5ICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NDMgbXVsdGlwbHkgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY0NCBtdWx0aXBseSAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjQ1IG11bHRpcGx5ICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NDYgbXVsdGlwbHkgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY0NyBtdWx0aXBseSAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjQ4IG11bHRpcGx5ICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NDkgbXVsdGlwbHkgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY1MCBtdWx0aXBseSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjUxIG11bHRpcGx5IC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NTIgbXVsdGlwbHkgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY1MyBtdWx0aXBseSAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjU0IG11bHRpcGx5IC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NTUgbXVsdGlwbHkgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY1NiBtdWx0aXBseSAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjU3IG11bHRpcGx5ICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NTggbXVsdGlwbHkgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY1OSBtdWx0aXBseSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHFtdWw2NjEgbXVsdGlwbHkgIE5hTjkgLUluZiAgIC0+ICBOYU45CitkcW11bDY2MiBtdWx0aXBseSAgTmFOOCAgOTk5ICAgLT4gIE5hTjgKK2RxbXVsNjYzIG11bHRpcGx5ICBOYU43MSBJbmYgICAtPiAgTmFONzEKK2RxbXVsNjY0IG11bHRpcGx5ICBOYU42ICBOYU41ICAtPiAgTmFONgorZHFtdWw2NjUgbXVsdGlwbHkgLUluZiAgIE5hTjQgIC0+ICBOYU40CitkcW11bDY2NiBtdWx0aXBseSAtOTk5ICAgTmFOMzMgLT4gIE5hTjMzCitkcW11bDY2NyBtdWx0aXBseSAgSW5mICAgTmFOMiAgLT4gIE5hTjIKKworZHFtdWw2NzEgbXVsdGlwbHkgIHNOYU45OSAtSW5mICAgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NzIgbXVsdGlwbHkgIHNOYU45OCAtMTEgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NzMgbXVsdGlwbHkgIHNOYU45NyAgTmFOICAgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NzQgbXVsdGlwbHkgIHNOYU4xNiBzTmFOOTQgIC0+ICBOYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NzUgbXVsdGlwbHkgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NzYgbXVsdGlwbHkgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NzcgbXVsdGlwbHkgIDA4OCAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NzggbXVsdGlwbHkgIEluZiAgICBzTmFOOTAgIC0+ICBOYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NzkgbXVsdGlwbHkgIE5hTiAgICBzTmFOODkgIC0+ICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCitkcW11bDY4MSBtdWx0aXBseSAtTmFOOSAtSW5mICAgLT4gLU5hTjkKK2RxbXVsNjgyIG11bHRpcGx5IC1OYU44ICA5OTkgICAtPiAtTmFOOAorZHFtdWw2ODMgbXVsdGlwbHkgLU5hTjcxIEluZiAgIC0+IC1OYU43MQorZHFtdWw2ODQgbXVsdGlwbHkgLU5hTjYgLU5hTjUgIC0+IC1OYU42CitkcW11bDY4NSBtdWx0aXBseSAtSW5mICAtTmFONCAgLT4gLU5hTjQKK2RxbXVsNjg2IG11bHRpcGx5IC05OTkgIC1OYU4zMyAtPiAtTmFOMzMKK2RxbXVsNjg3IG11bHRpcGx5ICBJbmYgIC1OYU4yICAtPiAtTmFOMgorCitkcW11bDY5MSBtdWx0aXBseSAtc05hTjk5IC1JbmYgICAgLT4gLU5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY5MiBtdWx0aXBseSAtc05hTjk4IC0xMSAgICAgLT4gLU5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY5MyBtdWx0aXBseSAtc05hTjk3ICBOYU4gICAgLT4gLU5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY5NCBtdWx0aXBseSAtc05hTjE2IC1zTmFOOTQgLT4gLU5hTjE2IEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY5NSBtdWx0aXBseSAtTmFOOTUgIC1zTmFOOTMgLT4gLU5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY5NiBtdWx0aXBseSAtSW5mICAgIC1zTmFOOTIgLT4gLU5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY5NyBtdWx0aXBseSAgMDg4ICAgIC1zTmFOOTEgLT4gLU5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY5OCBtdWx0aXBseSAgSW5mICAgIC1zTmFOOTAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY5OSBtdWx0aXBseSAtTmFOICAgIC1zTmFOODkgLT4gLU5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKK2RxbXVsNzAxIG11bHRpcGx5IC1OYU4gIC1JbmYgICAtPiAtTmFOCitkcW11bDcwMiBtdWx0aXBseSAtTmFOICAgOTk5ICAgLT4gLU5hTgorZHFtdWw3MDMgbXVsdGlwbHkgLU5hTiAgIEluZiAgIC0+IC1OYU4KK2RxbXVsNzA0IG11bHRpcGx5IC1OYU4gIC1OYU4gICAtPiAtTmFOCitkcW11bDcwNSBtdWx0aXBseSAtSW5mICAtTmFOMCAgLT4gLU5hTgorZHFtdWw3MDYgbXVsdGlwbHkgLTk5OSAgLU5hTiAgIC0+IC1OYU4KK2RxbXVsNzA3IG11bHRpcGx5ICBJbmYgIC1OYU4gICAtPiAtTmFOCisKK2RxbXVsNzExIG11bHRpcGx5IC1zTmFOICAgLUluZiAgICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDcxMiBtdWx0aXBseSAtc05hTiAgIC0xMSAgICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw3MTMgbXVsdGlwbHkgLXNOYU4wMCAgTmFOICAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNzE0IG11bHRpcGx5IC1zTmFOICAgLXNOYU4gICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDcxNSBtdWx0aXBseSAtTmFOICAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw3MTYgbXVsdGlwbHkgLUluZiAgICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNzE3IG11bHRpcGx5ICAwODggICAgLXNOYU4gICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDcxOCBtdWx0aXBseSAgSW5mICAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw3MTkgbXVsdGlwbHkgLU5hTiAgICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cyAuLiBub3RlIHN1Ym5vcm1hbCByZXN1bHRzCistLSBzaWducworZHFtdWw3NTEgbXVsdGlwbHkgIDFlKzQyNzcgIDFlKzMzMTEgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFtdWw3NTIgbXVsdGlwbHkgIDFlKzQyNzcgLTFlKzMzMTEgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFtdWw3NTMgbXVsdGlwbHkgLTFlKzQyNzcgIDFlKzMzMTEgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFtdWw3NTQgbXVsdGlwbHkgLTFlKzQyNzcgLTFlKzMzMTEgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFtdWw3NTUgbXVsdGlwbHkgIDFlLTQyNzcgIDFlLTMzMTEgLT4gIDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFtdWw3NTYgbXVsdGlwbHkgIDFlLTQyNzcgLTFlLTMzMTEgLT4gLTBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFtdWw3NTcgbXVsdGlwbHkgLTFlLTQyNzcgIDFlLTMzMTEgLT4gLTBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFtdWw3NTggbXVsdGlwbHkgLTFlLTQyNzcgLTFlLTMzMTEgLT4gIDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSAnc3Vibm9ybWFsJyBib3VuZGFyeSAoYWxsIGhhcmQgdW5kZXJmbG93IG9yIG92ZXJmbG93IGluIGJhc2UgYXJpdGhlbXRpYykKK2RxbXVsNzYwIG11bHRpcGx5IDFlLTYwNjkgMWUtMTAxIC0+IDFFLTYxNzAgU3Vibm9ybWFsCitkcW11bDc2MSBtdWx0aXBseSAxZS02MDY5IDFlLTEwMiAtPiAxRS02MTcxIFN1Ym5vcm1hbAorZHFtdWw3NjIgbXVsdGlwbHkgMWUtNjA2OSAxZS0xMDMgLT4gMUUtNjE3MiBTdWJub3JtYWwKK2RxbXVsNzYzIG11bHRpcGx5IDFlLTYwNjkgMWUtMTA0IC0+IDFFLTYxNzMgU3Vibm9ybWFsCitkcW11bDc2NCBtdWx0aXBseSAxZS02MDY5IDFlLTEwNSAtPiAxRS02MTc0IFN1Ym5vcm1hbAorZHFtdWw3NjUgbXVsdGlwbHkgMWUtNjA2OSAxZS0xMDYgLT4gMUUtNjE3NSBTdWJub3JtYWwKK2RxbXVsNzY2IG11bHRpcGx5IDFlLTYwNjkgMWUtMTA3IC0+IDFFLTYxNzYgU3Vibm9ybWFsCitkcW11bDc2NyBtdWx0aXBseSAxZS02MDY5IDFlLTEwOCAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxbXVsNzY4IG11bHRpcGx5IDFlLTYwNjkgMWUtMTA5IC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFtdWw3NjkgbXVsdGlwbHkgMWUtNjA2OSAxZS0xMTAgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCistLSBbbm8gZXF1aXZhbGVudCBvZiAnc3Vibm9ybWFsJyBmb3Igb3ZlcmZsb3ddCitkcW11bDc3MCBtdWx0aXBseSAxZSs0MCAxZSs2MTAxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQxIENsYW1wZWQKK2RxbXVsNzcxIG11bHRpcGx5IDFlKzQwIDFlKzYxMDIgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQyICBDbGFtcGVkCitkcW11bDc3MiBtdWx0aXBseSAxZSs0MCAxZSs2MTAzIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDMgIENsYW1wZWQKK2RxbXVsNzczIG11bHRpcGx5IDFlKzQwIDFlKzYxMDQgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDQgIENsYW1wZWQKK2RxbXVsNzc0IG11bHRpcGx5IDFlKzQwIDFlKzYxMDUgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcW11bDc3NSBtdWx0aXBseSAxZSs0MCAxZSs2MTA2IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFtdWw3NzYgbXVsdGlwbHkgMWUrNDAgMWUrNjEwNyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsNzc3IG11bHRpcGx5IDFlKzQwIDFlKzYxMDggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcW11bDc3OCBtdWx0aXBseSAxZSs0MCAxZSs2MTA5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFtdWw3NzkgbXVsdGlwbHkgMWUrNDAgMWUrNjExMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworZHFtdWw4MDEgbXVsdGlwbHkgIDEuMDAwMEUtNjE3MiAgMSAgICAgLT4gMS4wMDAwRS02MTcyIFN1Ym5vcm1hbAorZHFtdWw4MDIgbXVsdGlwbHkgIDEuMDAwRS02MTcyICAgMWUtMSAgLT4gMS4wMDBFLTYxNzMgIFN1Ym5vcm1hbAorZHFtdWw4MDMgbXVsdGlwbHkgIDEuMDBFLTYxNzIgICAgMWUtMiAgLT4gMS4wMEUtNjE3NCAgIFN1Ym5vcm1hbAorZHFtdWw4MDQgbXVsdGlwbHkgIDEuMEUtNjE3MiAgICAgMWUtMyAgLT4gMS4wRS02MTc1ICAgIFN1Ym5vcm1hbAorZHFtdWw4MDUgbXVsdGlwbHkgIDEuMEUtNjE3MiAgICAgMWUtNCAgLT4gMUUtNjE3NiAgICAgU3Vibm9ybWFsIFJvdW5kZWQKK2RxbXVsODA2IG11bHRpcGx5ICAxLjNFLTYxNzIgICAgIDFlLTQgIC0+IDFFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW11bDgwNyBtdWx0aXBseSAgMS41RS02MTcyICAgICAxZS00ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFtdWw4MDggbXVsdGlwbHkgIDEuN0UtNjE3MiAgICAgMWUtNCAgLT4gMkUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsODA5IG11bHRpcGx5ICAyLjNFLTYxNzIgICAgIDFlLTQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW11bDgxMCBtdWx0aXBseSAgMi41RS02MTcyICAgICAxZS00ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFtdWw4MTEgbXVsdGlwbHkgIDIuN0UtNjE3MiAgICAgMWUtNCAgLT4gM0UtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsODEyIG11bHRpcGx5ICAxLjQ5RS02MTcyICAgIDFlLTQgIC0+IDFFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW11bDgxMyBtdWx0aXBseSAgMS41MEUtNjE3MiAgICAxZS00ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFtdWw4MTQgbXVsdGlwbHkgIDEuNTFFLTYxNzIgICAgMWUtNCAgLT4gMkUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsODE1IG11bHRpcGx5ICAyLjQ5RS02MTcyICAgIDFlLTQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW11bDgxNiBtdWx0aXBseSAgMi41MEUtNjE3MiAgICAxZS00ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFtdWw4MTcgbXVsdGlwbHkgIDIuNTFFLTYxNzIgICAgMWUtNCAgLT4gM0UtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZHFtdWw4MTggbXVsdGlwbHkgIDFFLTYxNzIgICAgICAgMWUtNCAgLT4gMUUtNjE3NiAgICAgU3Vibm9ybWFsCitkcW11bDgxOSBtdWx0aXBseSAgM0UtNjE3MiAgICAgICAxZS01ICAtPiAwRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcW11bDgyMCBtdWx0aXBseSAgNUUtNjE3MiAgICAgICAxZS01ICAtPiAwRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcW11bDgyMSBtdWx0aXBseSAgN0UtNjE3MiAgICAgICAxZS01ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFtdWw4MjIgbXVsdGlwbHkgIDlFLTYxNzIgICAgICAgMWUtNSAgLT4gMUUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsODIzIG11bHRpcGx5ICA5LjlFLTYxNzIgICAgIDFlLTUgIC0+IDFFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RxbXVsODI0IG11bHRpcGx5ICAxRS02MTcyICAgICAgLTFlLTQgIC0+IC0xRS02MTc2ICAgIFN1Ym5vcm1hbAorZHFtdWw4MjUgbXVsdGlwbHkgIDNFLTYxNzIgICAgICAtMWUtNSAgLT4gLTBFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFtdWw4MjYgbXVsdGlwbHkgLTVFLTYxNzIgICAgICAgMWUtNSAgLT4gLTBFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFtdWw4MjcgbXVsdGlwbHkgIDdFLTYxNzIgICAgICAtMWUtNSAgLT4gLTFFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsODI4IG11bHRpcGx5IC05RS02MTcyICAgICAgIDFlLTUgIC0+IC0xRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW11bDgyOSBtdWx0aXBseSAgOS45RS02MTcyICAgIC0xZS01ICAtPiAtMUUtNjE3NiAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFtdWw4MzAgbXVsdGlwbHkgIDMuMEUtNjE3MiAgICAtMWUtNSAgLT4gLTBFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitkcW11bDgzMSBtdWx0aXBseSAgMS4wRS01OTc3ICAgICAxZS0yMDAgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcW11bDgzMiBtdWx0aXBseSAgMS4wRS01OTc3ICAgICAxZS0xOTkgLT4gMUUtNjE3NiAgICBTdWJub3JtYWwgUm91bmRlZAorZHFtdWw4MzMgbXVsdGlwbHkgIDEuMEUtNTk3NyAgICAgMWUtMTk4IC0+IDEuMEUtNjE3NSAgICBTdWJub3JtYWwKK2RxbXVsODM0IG11bHRpcGx5ICAyLjBFLTU5NzcgICAgIDJlLTE5OCAtPiA0LjBFLTYxNzUgICAgU3Vibm9ybWFsCitkcW11bDgzNSBtdWx0aXBseSAgNC4wRS01OTc3ICAgICA0ZS0xOTggLT4gMS42MEUtNjE3NCAgIFN1Ym5vcm1hbAorZHFtdWw4MzYgbXVsdGlwbHkgMTAuMEUtNTk3NyAgICAxMGUtMTk4IC0+IDEuMDAwRS02MTczICBTdWJub3JtYWwKK2RxbXVsODM3IG11bHRpcGx5IDMwLjBFLTU5NzcgICAgMzBlLTE5OCAtPiA5LjAwMEUtNjE3MyAgU3Vibm9ybWFsCitkcW11bDgzOCBtdWx0aXBseSA0MC4wRS01OTgyICAgIDQwZS0xNjYgLT4gMS42MDAwRS02MTQ1IFN1Ym5vcm1hbAorZHFtdWw4MzkgbXVsdGlwbHkgNDAuMEUtNTk4MiAgICA0MGUtMTY1IC0+IDEuNjAwMEUtNjE0NCBTdWJub3JtYWwKK2RxbXVsODQwIG11bHRpcGx5IDQwLjBFLTU5ODIgICAgNDBlLTE2NCAtPiAxLjYwMDBFLTYxNDMKKworLS0gTG9uZyBvcGVyYW5kIG92ZXJmbG93IG1heSBiZSBhIGRpZmZlcmVudCBwYXRoCitkcW11bDg3MCBtdWx0aXBseSAxMDAgIDkuOTk5RSs2MTQzICAgICAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitkcW11bDg3MSBtdWx0aXBseSAxMDAgLTkuOTk5RSs2MTQzICAgICAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitkcW11bDg3MiBtdWx0aXBseSAgICAgIDkuOTk5RSs2MTQzIDEwMCAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitkcW11bDg3MyBtdWx0aXBseSAgICAgLTkuOTk5RSs2MTQzIDEwMCAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCisKKy0tIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitkcW11bDg4MSBtdWx0aXBseSAgMS4yMzQ3RS02MTMzIDEuMjM0N0UtNDAgIC0+ICAxLjUyNEUtNjE3MyBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFtdWw4ODIgbXVsdGlwbHkgIDEuMjM0RS02MTMzIDEuMjM0RS00MCAgICAtPiAgMS41MjNFLTYxNzMgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxbXVsODgzIG11bHRpcGx5ICAxLjIzRS02MTMzICAxLjIzRS00MCAgICAgLT4gIDEuNTEzRS02MTczIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkcW11bDg4NCBtdWx0aXBseSAgMS4yRS02MTMzICAgMS4yRS00MCAgICAgIC0+ICAxLjQ0RS02MTczICBTdWJub3JtYWwKK2RxbXVsODg1IG11bHRpcGx5ICAxLjJFLTYxMzMgICAxLjJFLTQxICAgICAgLT4gIDEuNDRFLTYxNzQgIFN1Ym5vcm1hbAorZHFtdWw4ODYgbXVsdGlwbHkgIDEuMkUtNjEzMyAgIDEuMkUtNDIgICAgICAtPiAgMS40RS02MTc1ICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2RxbXVsODg3IG11bHRpcGx5ICAxLjJFLTYxMzMgICAxLjNFLTQyICAgICAgLT4gIDEuNkUtNjE3NSAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkcW11bDg4OCBtdWx0aXBseSAgMS4zRS02MTMzICAgMS4zRS00MiAgICAgIC0+ICAxLjdFLTYxNzUgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZHFtdWw4ODkgbXVsdGlwbHkgIDEuM0UtNjEzMyAgIDEuM0UtNDMgICAgICAtPiAgICAyRS02MTc2ICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2RxbXVsODkwIG11bHRpcGx5ICAxLjNFLTYxMzQgICAxLjNFLTQzICAgICAgLT4gICAgMEUtNjE3NiAgIENsYW1wZWQgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKworZHFtdWw4OTEgbXVsdGlwbHkgIDEuMjM0NUUtMzkgICAgMS4yMzRFLTYxMzMgLT4gIDEuNTIzNEUtNjE3MiBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFtdWw4OTIgbXVsdGlwbHkgIDEuMjM0NTZFLTM5ICAgMS4yMzRFLTYxMzMgLT4gIDEuNTIzNEUtNjE3MiBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFtdWw4OTMgbXVsdGlwbHkgIDEuMjM0NUUtNDAgICAxLjIzNEUtNjEzMyAtPiAgMS41MjNFLTYxNzMgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkcW11bDg5NCBtdWx0aXBseSAgMS4yMzQ1NkUtNDAgIDEuMjM0RS02MTMzIC0+ICAxLjUyM0UtNjE3MyAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxbXVsODk1IG11bHRpcGx5ICAxLjIzNDVFLTQxICAgMS4yMzRFLTYxMzMgLT4gIDEuNTJFLTYxNzQgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFtdWw4OTYgbXVsdGlwbHkgIDEuMjM0NTZFLTQxICAxLjIzNEUtNjEzMyAtPiAgMS41MkUtNjE3NCAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIE5vdyBleHBsb3JlIHRoZSBjYXNlIHdoZXJlIHdlIGdldCBhIG5vcm1hbCByZXN1bHQgd2l0aCBVbmRlcmZsb3cKKy0tIHByb3ZlIG9wZXJhbmRzIGFyZSBleGFjdAorZHFtdWw5MDYgbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQzICAxICAgICAgICAgICAgICAgICAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0MworZHFtdWw5MDcgbXVsdGlwbHkgICAgICAgICAgICAgICAgICAgICAgIDEgIDAuMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgIC0+IDAuMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKKy0tIHRoZSBuZXh0IHJvdW5kcyB0byBObWluCitkcW11bDkwOCBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFLTYxNDMgIDAuMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCisKKy0tIGh1Z2VzdAorZHFtdWw5MDkgbXVsdGlwbHkgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RSs2NyBJbmV4YWN0IFJvdW5kZWQKKy0tIFZHIGNhc2UKK2RxbXVsOTEwIG11bHRpcGx5IDguODExMjUwMDAwMDAwMDEzNDk0MzZFLTE1NDggOC4wMDAwMDAwMDAwMDAwMDAwMDBFLTE1NTAgLT4gNy4wNDkwMDAwMDAwMDAwMTA3OTU0ODgwMDAwMDAwMDAwMDBFLTMwOTcgUm91bmRlZAorCistLSBFeGFtcGxlcyBmcm9tIFNRTCBwcm9wb3NhbCAoS3Jpc2huYSBLdWxrYXJuaSkKK3ByZWNpc2lvbjogICAzNAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK2RxbXVsOTExICBtdWx0aXBseSAxMzBFLTIgIDEyMEUtMiAtPiAxLjU2MDAKK2RxbXVsOTEyICBtdWx0aXBseSAxMzBFLTIgIDEyRS0xICAtPiAxLjU2MAorZHFtdWw5MTMgIG11bHRpcGx5IDEzMEUtMiAgMUUwICAgIC0+IDEuMzAKK2RxbXVsOTE0ICBtdWx0aXBseSAxRTIgICAgIDFFNCAgICAtPiAxRSs2CisKKy0tIHBvd2VyLW9mLXRlbiBlZGdlIGNhc2VzCitkcW11bDEwMDEgbXVsdGlwbHkgIDEgICAgICAxMCAgICAgICAgICAgICAgIC0+IDEwCitkcW11bDEwMDIgbXVsdGlwbHkgIDEgICAgICAxMDAgICAgICAgICAgICAgIC0+IDEwMAorZHFtdWwxMDAzIG11bHRpcGx5ICAxICAgICAgMTAwMCAgICAgICAgICAgICAtPiAxMDAwCitkcW11bDEwMDQgbXVsdGlwbHkgIDEgICAgICAxMDAwMCAgICAgICAgICAgIC0+IDEwMDAwCitkcW11bDEwMDUgbXVsdGlwbHkgIDEgICAgICAxMDAwMDAgICAgICAgICAgIC0+IDEwMDAwMAorZHFtdWwxMDA2IG11bHRpcGx5ICAxICAgICAgMTAwMDAwMCAgICAgICAgICAtPiAxMDAwMDAwCitkcW11bDEwMDcgbXVsdGlwbHkgIDEgICAgICAxMDAwMDAwMCAgICAgICAgIC0+IDEwMDAwMDAwCitkcW11bDEwMDggbXVsdGlwbHkgIDEgICAgICAxMDAwMDAwMDAgICAgICAgIC0+IDEwMDAwMDAwMAorZHFtdWwxMDA5IG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMCAgICAgICAtPiAxMDAwMDAwMDAwCitkcW11bDEwMTAgbXVsdGlwbHkgIDEgICAgICAxMDAwMDAwMDAwMCAgICAgIC0+IDEwMDAwMDAwMDAwCitkcW11bDEwMTEgbXVsdGlwbHkgIDEgICAgICAxMDAwMDAwMDAwMDAgICAgIC0+IDEwMDAwMDAwMDAwMAorZHFtdWwxMDEyIG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAwMCAgICAtPiAxMDAwMDAwMDAwMDAwCitkcW11bDEwMTMgbXVsdGlwbHkgIDEgICAgICAxMDAwMDAwMDAwMDAwMCAgIC0+IDEwMDAwMDAwMDAwMDAwCitkcW11bDEwMTQgbXVsdGlwbHkgIDEgICAgICAxMDAwMDAwMDAwMDAwMDAgIC0+IDEwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDE1IG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwCisKK2RxbXVsMTAxNiBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDE3IG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDE4IG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDEwMTkgbXVsdGlwbHkgIDEgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDIwIG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKK2RxbXVsMTAyMSBtdWx0aXBseSAgMTAgICAgIDEgICAgICAgICAgICAgICAgLT4gMTAKK2RxbXVsMTAyMiBtdWx0aXBseSAgMTAgICAgIDEwICAgICAgICAgICAgICAgLT4gMTAwCitkcW11bDEwMjMgbXVsdGlwbHkgIDEwICAgICAxMDAgICAgICAgICAgICAgIC0+IDEwMDAKK2RxbXVsMTAyNCBtdWx0aXBseSAgMTAgICAgIDEwMDAgICAgICAgICAgICAgLT4gMTAwMDAKK2RxbXVsMTAyNSBtdWx0aXBseSAgMTAgICAgIDEwMDAwICAgICAgICAgICAgLT4gMTAwMDAwCitkcW11bDEwMjYgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAgICAgICAgICAgIC0+IDEwMDAwMDAKK2RxbXVsMTAyNyBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAgICAgICAgICAgLT4gMTAwMDAwMDAKK2RxbXVsMTAyOCBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwICAgICAgICAgLT4gMTAwMDAwMDAwCitkcW11bDEwMjkgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAgICAgICAgIC0+IDEwMDAwMDAwMDAKK2RxbXVsMTAzMCBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAgICAgICAgLT4gMTAwMDAwMDAwMDAKK2RxbXVsMTAzMSBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwICAgICAgLT4gMTAwMDAwMDAwMDAwCitkcW11bDEwMzIgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAwMDAgICAgIC0+IDEwMDAwMDAwMDAwMDAKK2RxbXVsMTAzMyBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwMDAgICAgLT4gMTAwMDAwMDAwMDAwMDAKK2RxbXVsMTAzNCBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwMDAwICAgLT4gMTAwMDAwMDAwMDAwMDAwCitkcW11bDEwMzUgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAwMDAwMDAgIC0+IDEwMDAwMDAwMDAwMDAwMDAKKworZHFtdWwxMDM2IG11bHRpcGx5ICAxMCAgICAgMTAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTAzNyBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDM4IG11bHRpcGx5ICAxMCAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTAzOSBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTA0MCBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKK2RxbXVsMTA0MSBtdWx0aXBseSAgMTAwICAgIDAuMSAgICAgICAgICAgICAgLT4gMTAuMAorZHFtdWwxMDQyIG11bHRpcGx5ICAxMDAgICAgMSAgICAgICAgICAgICAgICAtPiAxMDAKK2RxbXVsMTA0MyBtdWx0aXBseSAgMTAwICAgIDEwICAgICAgICAgICAgICAgLT4gMTAwMAorZHFtdWwxMDQ0IG11bHRpcGx5ICAxMDAgICAgMTAwICAgICAgICAgICAgICAtPiAxMDAwMAorZHFtdWwxMDQ1IG11bHRpcGx5ICAxMDAgICAgMTAwMCAgICAgICAgICAgICAtPiAxMDAwMDAKK2RxbXVsMTA0NiBtdWx0aXBseSAgMTAwICAgIDEwMDAwICAgICAgICAgICAgLT4gMTAwMDAwMAorZHFtdWwxMDQ3IG11bHRpcGx5ICAxMDAgICAgMTAwMDAwICAgICAgICAgICAtPiAxMDAwMDAwMAorZHFtdWwxMDQ4IG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMCAgICAgICAgICAtPiAxMDAwMDAwMDAKK2RxbXVsMTA0OSBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAwICAgICAgICAgLT4gMTAwMDAwMDAwMAorZHFtdWwxMDUwIG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwICAgICAgICAtPiAxMDAwMDAwMDAwMAorZHFtdWwxMDUxIG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMCAgICAgICAtPiAxMDAwMDAwMDAwMDAKK2RxbXVsMTA1MiBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAwMDAwICAgICAgLT4gMTAwMDAwMDAwMDAwMAorZHFtdWwxMDUzIG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMDAwICAgICAtPiAxMDAwMDAwMDAwMDAwMAorZHFtdWwxMDU0IG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMDAwMCAgICAtPiAxMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTA1NSBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAwMDAwMDAwICAgLT4gMTAwMDAwMDAwMDAwMDAwMAorCitkcW11bDEwNTYgbXVsdGlwbHkgIDEwMCAgICAxMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDEwNTcgbXVsdGlwbHkgIDEwMCAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDU4IG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDU5IG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDEwNjAgbXVsdGlwbHkgIDEwMCAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKK2RxbXVsMTA2MSBtdWx0aXBseSAgMTAwMCAgIDAuMDEgICAgICAgICAgICAgLT4gMTAuMDAKK2RxbXVsMTA2MiBtdWx0aXBseSAgMTAwMCAgIDAuMSAgICAgICAgICAgICAgLT4gMTAwLjAKK2RxbXVsMTA2MyBtdWx0aXBseSAgMTAwMCAgIDEgICAgICAgICAgICAgICAgLT4gMTAwMAorZHFtdWwxMDY0IG11bHRpcGx5ICAxMDAwICAgMTAgICAgICAgICAgICAgICAtPiAxMDAwMAorZHFtdWwxMDY1IG11bHRpcGx5ICAxMDAwICAgMTAwICAgICAgICAgICAgICAtPiAxMDAwMDAKK2RxbXVsMTA2NiBtdWx0aXBseSAgMTAwMCAgIDEwMDAgICAgICAgICAgICAgLT4gMTAwMDAwMAorZHFtdWwxMDY3IG11bHRpcGx5ICAxMDAwICAgMTAwMDAgICAgICAgICAgICAtPiAxMDAwMDAwMAorZHFtdWwxMDY4IG11bHRpcGx5ICAxMDAwICAgMTAwMDAwICAgICAgICAgICAtPiAxMDAwMDAwMDAKK2RxbXVsMTA2OSBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAgICAgICAgICAgLT4gMTAwMDAwMDAwMAorZHFtdWwxMDcwIG11bHRpcGx5ICAxMDAwICAgMTAwMDAwMDAgICAgICAgICAtPiAxMDAwMDAwMDAwMAorZHFtdWwxMDcxIG11bHRpcGx5ICAxMDAwICAgMTAwMDAwMDAwICAgICAgICAtPiAxMDAwMDAwMDAwMDAKK2RxbXVsMTA3MiBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwMDAgICAgICAgLT4gMTAwMDAwMDAwMDAwMAorZHFtdWwxMDczIG11bHRpcGx5ICAxMDAwICAgMTAwMDAwMDAwMDAgICAgICAtPiAxMDAwMDAwMDAwMDAwMAorZHFtdWwxMDc0IG11bHRpcGx5ICAxMDAwICAgMTAwMDAwMDAwMDAwICAgICAtPiAxMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTA3NSBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwMDAwMDAgICAgLT4gMTAwMDAwMDAwMDAwMDAwMAorCitkcW11bDEwNzYgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTA3NyBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTA3OCBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDc5IG11bHRpcGx5ICAxMDAwICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTA4MCBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCitkcW11bDEwODEgbXVsdGlwbHkgIDEwMDAwICAwLjAwMSAgICAgICAgICAgIC0+IDEwLjAwMAorZHFtdWwxMDgyIG11bHRpcGx5ICAxMDAwMCAgMC4wMSAgICAgICAgICAgICAtPiAxMDAuMDAKK2RxbXVsMTA4MyBtdWx0aXBseSAgMTAwMDAgIDAuMSAgICAgICAgICAgICAgLT4gMTAwMC4wCitkcW11bDEwODQgbXVsdGlwbHkgIDEwMDAwICAxICAgICAgICAgICAgICAgIC0+IDEwMDAwCitkcW11bDEwODUgbXVsdGlwbHkgIDEwMDAwICAxMCAgICAgICAgICAgICAgIC0+IDEwMDAwMAorZHFtdWwxMDg2IG11bHRpcGx5ICAxMDAwMCAgMTAwICAgICAgICAgICAgICAtPiAxMDAwMDAwCitkcW11bDEwODcgbXVsdGlwbHkgIDEwMDAwICAxMDAwICAgICAgICAgICAgIC0+IDEwMDAwMDAwCitkcW11bDEwODggbXVsdGlwbHkgIDEwMDAwICAxMDAwMCAgICAgICAgICAgIC0+IDEwMDAwMDAwMAorZHFtdWwxMDg5IG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwICAgICAgICAgICAtPiAxMDAwMDAwMDAwCitkcW11bDEwOTAgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwICAgICAgICAgIC0+IDEwMDAwMDAwMDAwCitkcW11bDEwOTEgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMCAgICAgICAgIC0+IDEwMDAwMDAwMDAwMAorZHFtdWwxMDkyIG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwMDAwICAgICAgICAtPiAxMDAwMDAwMDAwMDAwCitkcW11bDEwOTMgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMDAwICAgICAgIC0+IDEwMDAwMDAwMDAwMDAwCitkcW11bDEwOTQgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMDAwMCAgICAgIC0+IDEwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDk1IG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwMDAwMDAwICAgICAtPiAxMDAwMDAwMDAwMDAwMDAwCisKK2RxbXVsMTA5NiBtdWx0aXBseSAgMTAwMDAgIDEwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDEwOTcgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTA5OCBtdWx0aXBseSAgMTAwMDAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDEwOTkgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDExMDAgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCitkcW11bDExMDcgbXVsdGlwbHkgIDEwMDAwICAgOTk5OTk5OTk5OTkgICAgIC0+ICA5OTk5OTk5OTk5OTAwMDAKK2RxbXVsMTEwOCBtdWx0aXBseSAgMTAwMDAgICA5OTk5OTk5OTk5OSAgICAgLT4gIDk5OTk5OTk5OTk5MDAwMAorCistLSBOdWxsIHRlc3RzCitkcW11bDk5OTAgbXVsdGlwbHkgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDk5OTEgbXVsdGlwbHkgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFOZXh0TWludXMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFOZXh0TWludXMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTc3YjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU5leHRNaW51cy5kZWNUZXN0CkBAIC0wLDAgKzEsMTI2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxTmV4dE1pbnVzLmRlY1Rlc3QgLS0gZGVjUXVhZCBuZXh0IHRoYXQgaXMgbGVzcyBbNzU0ciBuZXh0ZG93bl0gICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNRdWFkcy4KK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2RxbmV4dG0wMDEgbmV4dG1pbnVzICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTQKK2RxbmV4dG0wMDIgbmV4dG1pbnVzICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUKK2RxbmV4dG0wMDMgbmV4dG1pbnVzICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTcgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYKK2RxbmV4dG0wMDQgbmV4dG1pbnVzICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTggLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTcKK2RxbmV4dG0wMDUgbmV4dG1pbnVzICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgKK2RxbmV4dG0wMDYgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dG0wMDcgbmV4dG1pbnVzICAxLjAgICAgICAgICAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0bTAwOCBuZXh0bWludXMgIDEgICAgICAgICAgIC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHRtMDA5IG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbmV4dG0wMTAgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMiAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0bTAxMSBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCitkcW5leHRtMDEyIG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKK2RxbmV4dG0wMTMgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNAorZHFuZXh0bTAxNCBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1CitkcW5leHRtMDE1IG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYKK2RxbmV4dG0wMTYgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOCAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNworZHFuZXh0bTAxNyBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4CitkcW5leHRtMDE4IG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkKK2RxbmV4dG0wMTkgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMAorZHFuZXh0bTAyMCBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExCisKK2RxbmV4dG0wMjEgbmV4dG1pbnVzIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYKK2RxbmV4dG0wMjIgbmV4dG1pbnVzIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTcKK2RxbmV4dG0wMjMgbmV4dG1pbnVzIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTcgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgKK2RxbmV4dG0wMjQgbmV4dG1pbnVzIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTggLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dG0wMjUgbmV4dG1pbnVzIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFuZXh0bTAyNiBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHRtMDI3IG5leHRtaW51cyAtMS4wICAgICAgICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0bTAyOCBuZXh0bWludXMgLTEgICAgICAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dG0wMjkgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgorZHFuZXh0bTAzMCBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzCitkcW5leHRtMDMxIG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKK2RxbmV4dG0wMzIgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNCAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNQorZHFuZXh0bTAzMyBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2CitkcW5leHRtMDM0IG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcKK2RxbmV4dG0wMzUgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNyAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOAorZHFuZXh0bTAzNiBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5CitkcW5leHRtMDM3IG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAKK2RxbmV4dG0wMzggbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMCAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMQorZHFuZXh0bTAzOSBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyCisKKy0tIHVsdHJhLXRpbnkgaW5wdXRzCitkcW5leHRtMDYyIG5leHRtaW51cyAgMUUtNjE3NiAgICAgICAgIC0+ICAgMEUtNjE3NgorZHFuZXh0bTA2NSBuZXh0bWludXMgLTFFLTYxNzYgICAgICAgICAtPiAgLTJFLTYxNzYKKworLS0gWmVyb3MKK2RxbmV4dG0xMDAgbmV4dG1pbnVzIC0wICAgICAgICAgICAtPiAtMUUtNjE3NgorZHFuZXh0bTEwMSBuZXh0bWludXMgIDAgICAgICAgICAgIC0+IC0xRS02MTc2CitkcW5leHRtMTAyIG5leHRtaW51cyAgMC4wMCAgICAgICAgLT4gLTFFLTYxNzYKK2RxbmV4dG0xMDMgbmV4dG1pbnVzIC0wLjAwICAgICAgICAtPiAtMUUtNjE3NgorZHFuZXh0bTEwNCBuZXh0bWludXMgIDBFLTMwMCAgICAgIC0+IC0xRS02MTc2CitkcW5leHRtMTA1IG5leHRtaW51cyAgMEUrMzAwICAgICAgLT4gLTFFLTYxNzYKK2RxbmV4dG0xMDYgbmV4dG1pbnVzICAwRSszMDAwMCAgICAtPiAtMUUtNjE3NgorZHFuZXh0bTEwNyBuZXh0bWludXMgLTBFKzMwMDAwICAgIC0+IC0xRS02MTc2CisKKy0tIHNwZWNpYWxzCitkcW5leHRtMTUwIG5leHRtaW51cyAgIEluZiAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dG0xNTEgbmV4dG1pbnVzICAtSW5mICAgIC0+IC1JbmZpbml0eQorZHFuZXh0bTE1MiBuZXh0bWludXMgICBOYU4gICAgLT4gIE5hTgorZHFuZXh0bTE1MyBuZXh0bWludXMgIHNOYU4gICAgLT4gIE5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHRtMTU0IG5leHRtaW51cyAgIE5hTjc3ICAtPiAgTmFONzcKK2RxbmV4dG0xNTUgbmV4dG1pbnVzICBzTmFOODggIC0+ICBOYU44OCBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0bTE1NiBuZXh0bWludXMgIC1OYU4gICAgLT4gLU5hTgorZHFuZXh0bTE1NyBuZXh0bWludXMgLXNOYU4gICAgLT4gLU5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHRtMTU4IG5leHRtaW51cyAgLU5hTjc3ICAtPiAtTmFONzcKK2RxbmV4dG0xNTkgbmV4dG1pbnVzIC1zTmFOODggIC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBObWF4LCBObWluLCBOdGlueSwgc3Vibm9ybWFscworZHFuZXh0bTE3MCBuZXh0bWludXMgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzYxNDQKK2RxbmV4dG0xNzEgbmV4dG1pbnVzICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUrNjE0NCAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3RSs2MTQ0CitkcW5leHRtMTcyIG5leHRtaW51cyAgMUUtNjE0MyAgICAgICAgICAgICAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0CitkcW5leHRtMTczIG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0CitkcW5leHRtMTc0IG5leHRtaW51cyAgOUUtNjE3NiAgICAgICAgICAgICAgICAgICAtPiA4RS02MTc2CitkcW5leHRtMTc1IG5leHRtaW51cyAgOS45RS02MTc1ICAgICAgICAgICAgICAgICAtPiA5LjhFLTYxNzUKK2RxbmV4dG0xNzYgbmV4dG1pbnVzICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ3ICAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFLTYxNDcKK2RxbmV4dG0xNzcgbmV4dG1pbnVzICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0ICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFLTYxNDQKK2RxbmV4dG0xNzggbmV4dG1pbnVzICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RS02MTQ0ICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTdFLTYxNDQKK2RxbmV4dG0xNzkgbmV4dG1pbnVzICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3RS02MTQ0ICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTZFLTYxNDQKK2RxbmV4dG0xODAgbmV4dG1pbnVzICAwRS02MTc2ICAgICAgICAgICAgICAgICAgIC0+IC0xRS02MTc2CitkcW5leHRtMTgxIG5leHRtaW51cyAgMUUtNjE3NiAgICAgICAgICAgICAgICAgICAtPiAwRS02MTc2CitkcW5leHRtMTgyIG5leHRtaW51cyAgMkUtNjE3NiAgICAgICAgICAgICAgICAgICAtPiAxRS02MTc2CisKK2RxbmV4dG0xODMgbmV4dG1pbnVzICAtMEUtNjE3NiAgICAgICAgICAgICAgICAgIC0+IC0xRS02MTc2CitkcW5leHRtMTg0IG5leHRtaW51cyAgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAtPiAtMkUtNjE3NgorZHFuZXh0bTE4NSBuZXh0bWludXMgIC0yRS02MTc2ICAgICAgICAgICAgICAgICAgLT4gLTNFLTYxNzYKK2RxbmV4dG0xODYgbmV4dG1pbnVzICAtMTBFLTYxNzYgICAgICAgICAgICAgICAgIC0+IC0xLjFFLTYxNzUKK2RxbmV4dG0xODcgbmV4dG1pbnVzICAtMTAwRS02MTc2ICAgICAgICAgICAgICAgIC0+IC0xLjAxRS02MTc0CitkcW5leHRtMTg4IG5leHRtaW51cyAgLTEwMDAwMEUtNjE3NiAgICAgICAgICAgICAtPiAtMS4wMDAwMUUtNjE3MQorZHFuZXh0bTE4OSBuZXh0bWludXMgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRS02MTQzCitkcW5leHRtMTkwIG5leHRtaW51cyAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMKK2RxbmV4dG0xOTEgbmV4dG1pbnVzICAtMUUtNjE0MyAgICAgICAgICAgICAgICAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MworZHFuZXh0bTE5MiBuZXh0bWludXMgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUrNjE0NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHRtMTkzIG5leHRtaW51cyAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAtSW5maW5pdHkKKworLS0gTnVsbCB0ZXN0cworZHFuZXh0bTkwMCBuZXh0bWludXMgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFOZXh0UGx1cy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU5leHRQbHVzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4ZTljZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFOZXh0UGx1cy5kZWNUZXN0CkBAIC0wLDAgKzEsMTI0IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxTmV4dFBsdXMuZGVjVGVzdCAtLSBkZWNRdWFkIG5leHQgdGhhdCBpcyBncmVhdGVyIFs3NTRyIG5leHR1cF0gICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNRdWFkcy4KK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2RxbmV4dHAwMDEgbmV4dHBsdXMgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NSAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NgorZHFuZXh0cDAwMiBuZXh0cGx1cyAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3CitkcW5leHRwMDAzIG5leHRwbHVzICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTcgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgKK2RxbmV4dHAwMDQgbmV4dHBsdXMgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0cDAwNSBuZXh0cGx1cyAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbmV4dHAwMDYgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHRwMDA3IG5leHRwbHVzICAxLjAgICAgICAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHRwMDA4IG5leHRwbHVzICAxICAgICAgICAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHRwMDA5IG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgorZHFuZXh0cDAxMCBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKK2RxbmV4dHAwMTEgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0CitkcW5leHRwMDEyIG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNCAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNQorZHFuZXh0cDAxMyBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYKK2RxbmV4dHAwMTQgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3CitkcW5leHRwMDE1IG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOAorZHFuZXh0cDAxNiBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkKK2RxbmV4dHAwMTcgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwCitkcW5leHRwMDE4IG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMCAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMQorZHFuZXh0cDAxOSBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIKKworZHFuZXh0cDAyMSBuZXh0cGx1cyAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk0CitkcW5leHRwMDIyIG5leHRwbHVzIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUKK2RxbmV4dHAwMjMgbmV4dHBsdXMgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NyAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NgorZHFuZXh0cDAyNCBuZXh0cGx1cyAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3CitkcW5leHRwMDI1IG5leHRwbHVzIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgKK2RxbmV4dHAwMjYgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0cDAyNyBuZXh0cGx1cyAtMS4wICAgICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHAwMjggbmV4dHBsdXMgLTEgICAgICAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHRwMDI5IG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFuZXh0cDAzMCBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dHAwMzEgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCitkcW5leHRwMDMyIG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNCAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMworZHFuZXh0cDAzMyBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKK2RxbmV4dHAwMzQgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1CitkcW5leHRwMDM1IG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNyAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNgorZHFuZXh0cDAzNiBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcKK2RxbmV4dHAwMzcgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4CitkcW5leHRwMDM4IG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMCAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOQorZHFuZXh0cDAzOSBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAKK2RxbmV4dHAwNDAgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExCisKKy0tIFplcm9zCitkcW5leHRwMTAwIG5leHRwbHVzICAwICAgICAgICAgICAtPiAgMUUtNjE3NgorZHFuZXh0cDEwMSBuZXh0cGx1cyAgMC4wMCAgICAgICAgLT4gIDFFLTYxNzYKK2RxbmV4dHAxMDIgbmV4dHBsdXMgIDBFLTMwMCAgICAgIC0+ICAxRS02MTc2CitkcW5leHRwMTAzIG5leHRwbHVzICAwRSszMDAgICAgICAtPiAgMUUtNjE3NgorZHFuZXh0cDEwNCBuZXh0cGx1cyAgMEUrMzAwMDAgICAgLT4gIDFFLTYxNzYKK2RxbmV4dHAxMDUgbmV4dHBsdXMgLTAgICAgICAgICAgIC0+ICAxRS02MTc2CitkcW5leHRwMTA2IG5leHRwbHVzIC0wLjAwICAgICAgICAtPiAgMUUtNjE3NgorZHFuZXh0cDEwNyBuZXh0cGx1cyAtMEUtMzAwICAgICAgLT4gIDFFLTYxNzYKK2RxbmV4dHAxMDggbmV4dHBsdXMgLTBFKzMwMCAgICAgIC0+ICAxRS02MTc2CitkcW5leHRwMTA5IG5leHRwbHVzIC0wRSszMDAwMCAgICAtPiAgMUUtNjE3NgorCistLSBzcGVjaWFscworZHFuZXh0cDE1MCBuZXh0cGx1cyAgIEluZiAgICAtPiAgSW5maW5pdHkKK2RxbmV4dHAxNTEgbmV4dHBsdXMgIC1JbmYgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHRwMTUyIG5leHRwbHVzICAgTmFOICAgIC0+ICBOYU4KK2RxbmV4dHAxNTMgbmV4dHBsdXMgIHNOYU4gICAgLT4gIE5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHRwMTU0IG5leHRwbHVzICAgTmFONzcgIC0+ICBOYU43NworZHFuZXh0cDE1NSBuZXh0cGx1cyAgc05hTjg4ICAtPiAgTmFOODggSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHAxNTYgbmV4dHBsdXMgIC1OYU4gICAgLT4gLU5hTgorZHFuZXh0cDE1NyBuZXh0cGx1cyAtc05hTiAgICAtPiAtTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHAxNTggbmV4dHBsdXMgIC1OYU43NyAgLT4gLU5hTjc3CitkcW5leHRwMTU5IG5leHRwbHVzIC1zTmFOODggIC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBObWF4LCBObWluLCBOdGlueSwgc3Vibm9ybWFscworZHFuZXh0cDE3MCBuZXh0cGx1cyAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzYxNDQKK2RxbmV4dHAxNzEgbmV4dHBsdXMgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUrNjE0NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3RSs2MTQ0CitkcW5leHRwMTcyIG5leHRwbHVzICAtMUUtNjE0MyAgICAgICAgICAgICAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0CitkcW5leHRwMTczIG5leHRwbHVzICAtMS4wMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0CitkcW5leHRwMTc0IG5leHRwbHVzICAtOUUtNjE3NiAgICAgICAgICAgICAgICAgIC0+IC04RS02MTc2CitkcW5leHRwMTc1IG5leHRwbHVzICAtOS45RS02MTc1ICAgICAgICAgICAgICAgIC0+IC05LjhFLTYxNzUKK2RxbmV4dHAxNzYgbmV4dHBsdXMgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ3ICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFLTYxNDcKK2RxbmV4dHAxNzcgbmV4dHBsdXMgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0ICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFLTYxNDQKK2RxbmV4dHAxNzggbmV4dHBsdXMgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RS02MTQ0ICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTdFLTYxNDQKK2RxbmV4dHAxNzkgbmV4dHBsdXMgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3RS02MTQ0ICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTZFLTYxNDQKK2RxbmV4dHAxODAgbmV4dHBsdXMgIC0wRS02MTc2ICAgICAgICAgICAgICAgICAgLT4gIDFFLTYxNzYKK2RxbmV4dHAxODEgbmV4dHBsdXMgIC0xRS02MTc2ICAgICAgICAgICAgICAgICAgLT4gLTBFLTYxNzYKK2RxbmV4dHAxODIgbmV4dHBsdXMgIC0yRS02MTc2ICAgICAgICAgICAgICAgICAgLT4gLTFFLTYxNzYKKworZHFuZXh0cDE4MyBuZXh0cGx1cyAgIDBFLTYxNzYgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE3NgorZHFuZXh0cDE4NCBuZXh0cGx1cyAgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAtPiAgMkUtNjE3NgorZHFuZXh0cDE4NSBuZXh0cGx1cyAgIDJFLTYxNzYgICAgICAgICAgICAgICAgICAtPiAgM0UtNjE3NgorZHFuZXh0cDE4NiBuZXh0cGx1cyAgIDEwRS02MTc2ICAgICAgICAgICAgICAgICAtPiAgMS4xRS02MTc1CitkcW5leHRwMTg3IG5leHRwbHVzICAgMTAwRS02MTc2ICAgICAgICAgICAgICAgIC0+ICAxLjAxRS02MTc0CitkcW5leHRwMTg4IG5leHRwbHVzICAgMTAwMDAwRS02MTc2ICAgICAgICAgICAgIC0+ICAxLjAwMDAxRS02MTcxCitkcW5leHRwMTg5IG5leHRwbHVzICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MworZHFuZXh0cDE5MCBuZXh0cGx1cyAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMKK2RxbmV4dHAxOTEgbmV4dHBsdXMgICAxRS02MTQzICAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRS02MTQzCitkcW5leHRwMTkyIG5leHRwbHVzICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzYxNDQgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0cDE5MyBuZXh0cGx1cyAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAgSW5maW5pdHkKKworLS0gTnVsbCB0ZXN0cworZHFuZXh0cDkwMCBuZXh0cGx1cyAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU5leHRUb3dhcmQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFOZXh0VG93YXJkLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3ZTdmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFOZXh0VG93YXJkLmRlY1Rlc3QKQEAgLTAsMCArMSwzNzUgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFOZXh0VG93YXJkLmRlY1Rlc3QgLS0gZGVjUXVhZCBuZXh0IHRvd2FyZCByaHMgWzc1NHIgbmV4dGFmdGVyXSAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY1F1YWRzLgorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworCistLSBTYW5pdHkgY2hlY2sgd2l0aCBhIHNjYXR0ZXJpbmcgb2YgbnVtZXJpY3MKK2RxbmV4dHQwMDEgbmV4dHRvd2FyZCAgIDEwICAgIDEwICAgLT4gIDEwCitkcW5leHR0MDAyIG5leHR0b3dhcmQgIC0xMCAgIC0xMCAgIC0+IC0xMAorZHFuZXh0dDAwMyBuZXh0dG93YXJkICAgMSAgICAgMTAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dHQwMDQgbmV4dHRvd2FyZCAgIDEgICAgLTEwICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDAwNSBuZXh0dG93YXJkICAtMSAgICAgMTAgICAtPiAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0MDA2IG5leHR0b3dhcmQgIC0xICAgIC0xMCAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0dDAwNyBuZXh0dG93YXJkICAgMCAgICAgMTAgICAtPiAgMUUtNjE3NiAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDAwOCBuZXh0dG93YXJkICAgMCAgICAtMTAgICAtPiAtMUUtNjE3NiAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDAwOSBuZXh0dG93YXJkICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgK0luZmluaXR5IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQwMTAgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC1JbmZpbml0eSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0MDExIG5leHR0b3dhcmQgICAgICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIDEwICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbmV4dHQwMTIgbmV4dHRvd2FyZCAgIDEwICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDAxMyBuZXh0dG93YXJkICAgICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IC0xMCAgLT4gLTEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW5leHR0MDE0IG5leHR0b3dhcmQgIC0xMCAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHQwMTUgbmV4dHRvd2FyZCAgICAgICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCAgMTAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDAxNiBuZXh0dG93YXJkICAgMTAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4ICAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0MDE3IG5leHR0b3dhcmQgICAgICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTggLTEwICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHQwMTggbmV4dHRvd2FyZCAgLTEwIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorCistLS0tLS0tIGxocz1yaHMKKy0tIGZpbml0ZXMKK2RxbmV4dHQxMDEgbmV4dHRvd2FyZCAgICAgICAgICA3ICAgICAgIDcgLT4gIDcKK2RxbmV4dHQxMDIgbmV4dHRvd2FyZCAgICAgICAgIC03ICAgICAgLTcgLT4gLTcKK2RxbmV4dHQxMDMgbmV4dHRvd2FyZCAgICAgICAgIDc1ICAgICAgNzUgLT4gIDc1CitkcW5leHR0MTA0IG5leHR0b3dhcmQgICAgICAgIC03NSAgICAgLTc1IC0+IC03NQorZHFuZXh0dDEwNSBuZXh0dG93YXJkICAgICAgIDcuNTAgICAgIDcuNSAtPiAgNy41MAorZHFuZXh0dDEwNiBuZXh0dG93YXJkICAgICAgLTcuNTAgICAtNy41MCAtPiAtNy41MAorZHFuZXh0dDEwNyBuZXh0dG93YXJkICAgICAgIDcuNTAwIDcuNTAwMCAtPiAgNy41MDAKK2RxbmV4dHQxMDggbmV4dHRvd2FyZCAgICAgIC03LjUwMCAgIC03LjUgLT4gLTcuNTAwCisKKy0tIHplcm9zCitkcW5leHR0MTExIG5leHR0b3dhcmQgICAgICAgICAgMCAgICAgICAwIC0+ICAwCitkcW5leHR0MTEyIG5leHR0b3dhcmQgICAgICAgICAtMCAgICAgIC0wIC0+IC0wCitkcW5leHR0MTEzIG5leHR0b3dhcmQgICAgICAgMEUrNCAgICAgICAwIC0+ICAwRSs0CitkcW5leHR0MTE0IG5leHR0b3dhcmQgICAgICAtMEUrNCAgICAgIC0wIC0+IC0wRSs0CitkcW5leHR0MTE1IG5leHR0b3dhcmQgICAgIDAuMDAwMDAwMDAwMDAgICAwLjAwMDAwMDAwMDAwMCAtPiAgMEUtMTEKK2RxbmV4dHQxMTYgbmV4dHRvd2FyZCAgICAtMC4wMDAwMDAwMDAwMCAgLTAuMDAgICAgICAgICAgIC0+IC0wRS0xMQorZHFuZXh0dDExNyBuZXh0dG93YXJkICAgICAgMEUtMTQxICAgICAgMCAtPiAgMEUtMTQxCitkcW5leHR0MTE4IG5leHR0b3dhcmQgICAgIC0wRS0xNDEgICAtMDAwIC0+IC0wRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RxbmV4dHQxMjEgbmV4dHRvd2FyZCAgIDI2ODI2ODI2OCAgICAyNjgyNjgyNjggLT4gICAyNjgyNjgyNjgKK2RxbmV4dHQxMjIgbmV4dHRvd2FyZCAgLTI2ODI2ODI2OCAgIC0yNjgyNjgyNjggLT4gIC0yNjgyNjgyNjgKK2RxbmV4dHQxMjMgbmV4dHRvd2FyZCAgIDEzNDEzNDEzNCAgICAxMzQxMzQxMzQgLT4gICAxMzQxMzQxMzQKK2RxbmV4dHQxMjQgbmV4dHRvd2FyZCAgLTEzNDEzNDEzNCAgIC0xMzQxMzQxMzQgLT4gIC0xMzQxMzQxMzQKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RxbmV4dHQxMzEgbmV4dHRvd2FyZCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDEzMiBuZXh0dG93YXJkICAxRS02MTQzICAgICAgICAgICAxRS02MTQzICAgICAgICAgICAgLT4gICAxRS02MTQzCitkcW5leHR0MTMzIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxbmV4dHQxMzQgbmV4dHRvd2FyZCAgMUUtNjE3NiAgICAgICAgICAgMUUtNjE3NiAgICAgICAgICAgIC0+ICAgMUUtNjE3NgorCitkcW5leHR0MTM1IG5leHR0b3dhcmQgIC0xRS02MTc2ICAgICAgICAgIC0xRS02MTc2ICAgICAgICAgICAtPiAgLTFFLTYxNzYKK2RxbmV4dHQxMzYgbmV4dHRvd2FyZCAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFuZXh0dDEzNyBuZXh0dG93YXJkICAtMUUtNjE0MyAgICAgICAgICAtMUUtNjE0MyAgICAgICAgICAgLT4gIC0xRS02MTQzCitkcW5leHR0MTM4IG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0+ICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKKworLS0tLS0tLSBsaHM8cmhzCitkcW5leHR0MjAxIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NSBJbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NgorZHFuZXh0dDIwMiBuZXh0dG93YXJkICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYgSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTcKK2RxbmV4dHQyMDMgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3IEluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4CitkcW5leHR0MjA0IG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCBJbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDIwNSBuZXh0dG93YXJkICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFuZXh0dDIwNiBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0dDIwNyBuZXh0dG93YXJkICAxLjAgICAgICAgICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHR0MjA4IG5leHR0b3dhcmQgIDEgICAgICAgICAgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dHQyMDkgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKK2RxbmV4dHQyMTAgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKK2RxbmV4dHQyMTEgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKK2RxbmV4dHQyMTIgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUKK2RxbmV4dHQyMTMgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYKK2RxbmV4dHQyMTQgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcKK2RxbmV4dHQyMTUgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgKK2RxbmV4dHQyMTYgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkKK2RxbmV4dHQyMTcgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAKK2RxbmV4dHQyMTggbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEKK2RxbmV4dHQyMTkgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIKKworZHFuZXh0dDIyMSBuZXh0dG93YXJkIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUgSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTQKK2RxbmV4dHQyMjIgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2IEluZmluaXR5IC0+IC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUKK2RxbmV4dHQyMjMgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3IEluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2CitkcW5leHR0MjI0IG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NworZHFuZXh0dDIyNSBuZXh0dG93YXJkIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgKK2RxbmV4dHQyMjYgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIEluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0MjI3IG5leHR0b3dhcmQgLTEuMCAgICAgICAgIEluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0MjI4IG5leHR0b3dhcmQgLTEgICAgICAgICAgIEluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0MjI5IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW5leHR0MjMwIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHR0MjMxIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCitkcW5leHR0MjMyIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzCitkcW5leHR0MjMzIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0CitkcW5leHR0MjM0IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1CitkcW5leHR0MjM1IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2CitkcW5leHR0MjM2IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3CitkcW5leHR0MjM3IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4CitkcW5leHR0MjM4IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5CitkcW5leHR0MjM5IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwCitkcW5leHR0MjQwIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExCisKKy0tIFplcm9zCitkcW5leHR0MzAwIG5leHR0b3dhcmQgIDAgICAgICAgICAgIEluZmluaXR5IC0+ICAxRS02MTc2ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDMwMSBuZXh0dG93YXJkICAwLjAwICAgICAgICBJbmZpbml0eSAtPiAgMUUtNjE3NiAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzMDIgbmV4dHRvd2FyZCAgMEUtMzAwICAgICAgSW5maW5pdHkgLT4gIDFFLTYxNzYgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0MzAzIG5leHR0b3dhcmQgIDBFKzMwMCAgICAgIEluZmluaXR5IC0+ICAxRS02MTc2ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDMwNCBuZXh0dG93YXJkICAwRSszMDAwMCAgICBJbmZpbml0eSAtPiAgMUUtNjE3NiAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzMDUgbmV4dHRvd2FyZCAtMCAgICAgICAgICAgSW5maW5pdHkgLT4gIDFFLTYxNzYgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0MzA2IG5leHR0b3dhcmQgLTAuMDAgICAgICAgIEluZmluaXR5IC0+ICAxRS02MTc2ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDMwNyBuZXh0dG93YXJkIC0wRS0zMDAgICAgICBJbmZpbml0eSAtPiAgMUUtNjE3NiAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzMDggbmV4dHRvd2FyZCAtMEUrMzAwICAgICAgSW5maW5pdHkgLT4gIDFFLTYxNzYgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0MzA5IG5leHR0b3dhcmQgLTBFKzMwMDAwICAgIEluZmluaXR5IC0+ICAxRS02MTc2ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLSBzcGVjaWFscworZHFuZXh0dDM1MCBuZXh0dG93YXJkICAgSW5mICAgIEluZmluaXR5IC0+ICBJbmZpbml0eQorZHFuZXh0dDM1MSBuZXh0dG93YXJkICAtSW5mICAgIEluZmluaXR5IC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDM1MiBuZXh0dG93YXJkICAgTmFOICAgIEluZmluaXR5IC0+ICBOYU4KK2RxbmV4dHQzNTMgbmV4dHRvd2FyZCAgc05hTiAgICBJbmZpbml0eSAtPiAgTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQzNTQgbmV4dHRvd2FyZCAgIE5hTjc3ICBJbmZpbml0eSAtPiAgTmFONzcKK2RxbmV4dHQzNTUgbmV4dHRvd2FyZCAgc05hTjg4ICBJbmZpbml0eSAtPiAgTmFOODggSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQzNTYgbmV4dHRvd2FyZCAgLU5hTiAgICBJbmZpbml0eSAtPiAtTmFOCitkcW5leHR0MzU3IG5leHR0b3dhcmQgLXNOYU4gICAgSW5maW5pdHkgLT4gLU5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0MzU4IG5leHR0b3dhcmQgIC1OYU43NyAgSW5maW5pdHkgLT4gLU5hTjc3CitkcW5leHR0MzU5IG5leHR0b3dhcmQgLXNOYU44OCAgSW5maW5pdHkgLT4gLU5hTjg4IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5tYXgsIE5taW4sIE50aW55LCBzdWJub3JtYWxzCitkcW5leHR0MzcwIG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgSW5maW5pdHkgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUrNjE0NAorZHFuZXh0dDM3MSBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzYxNDQgIEluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTdFKzYxNDQKK2RxbmV4dHQzNzIgbmV4dHRvd2FyZCAgLTFFLTYxNDMgICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFLTYxNDQgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0MzczIG5leHR0b3dhcmQgIC0xLjAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgSW5maW5pdHkgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDM3NCBuZXh0dG93YXJkICAtOUUtNjE3NiAgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAtOEUtNjE3NiAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzNzUgbmV4dHRvd2FyZCAgLTkuOUUtNjE3NSAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gLTkuOEUtNjE3NSAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Mzc2IG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ3ICAgICAgSW5maW5pdHkgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RS02MTQ3ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDM3NyBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NCAgIEluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUtNjE0NCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzNzggbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFLTYxNDQgICBJbmZpbml0eSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTdFLTYxNDQgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Mzc5IG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3RS02MTQ0ICAgSW5maW5pdHkgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2RS02MTQ0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDM4MCBuZXh0dG93YXJkICAtMEUtNjE3NiAgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAgMUUtNjE3NiAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzODEgbmV4dHRvd2FyZCAgLTFFLTYxNzYgICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gLTBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFuZXh0dDM4MiBuZXh0dG93YXJkICAtMkUtNjE3NiAgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAtMUUtNjE3NiAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZHFuZXh0dDM4MyBuZXh0dG93YXJkICAgMEUtNjE3NiAgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAgMUUtNjE3NiAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzODQgbmV4dHRvd2FyZCAgIDFFLTYxNzYgICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gIDJFLTYxNzYgICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Mzg1IG5leHR0b3dhcmQgICAyRS02MTc2ICAgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+ICAzRS02MTc2ICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDM4NiBuZXh0dG93YXJkICAgMTBFLTYxNzYgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAgMS4xRS02MTc1ICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzODcgbmV4dHRvd2FyZCAgIDEwMEUtNjE3NiAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gIDEuMDFFLTYxNzQgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Mzg4IG5leHR0b3dhcmQgICAxMDAwMDBFLTYxNzYgICAgICAgICAgICAgSW5maW5pdHkgIC0+ICAxLjAwMDAxRS02MTcxICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDM4OSBuZXh0dG93YXJkICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIEluZmluaXR5ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMKK2RxbmV4dHQzOTAgbmV4dHRvd2FyZCAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICBJbmZpbml0eSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRS02MTQzCitkcW5leHR0MzkxIG5leHR0b3dhcmQgICAxRS02MTQzICAgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MworZHFuZXh0dDM5MiBuZXh0dG93YXJkICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTdFKzYxNDQgIEluZmluaXR5ICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzYxNDQKK2RxbmV4dHQzOTMgbmV4dHRvd2FyZCAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RSs2MTQ0ICBJbmZpbml0eSAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHR0Mzk0IG5leHR0b3dhcmQgICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgSW5maW5pdHkgIC0+ICBJbmZpbml0eSAgICAgICAgICAgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLS0tLS0tIGxocz5yaHMKK2RxbmV4dHQ0MDEgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTQKK2RxbmV4dHQ0MDIgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUKK2RxbmV4dHQ0MDMgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYKK2RxbmV4dHQ0MDQgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTcKK2RxbmV4dHQ0MDUgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgKK2RxbmV4dHQ0MDYgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHQ0MDcgbmV4dHRvd2FyZCAgMS4wICAgICAgICAgIC1JbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDQwOCBuZXh0dG93YXJkICAxICAgICAgICAgICAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0NDA5IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbmV4dHQ0MTAgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0dDQxMSBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMyAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCitkcW5leHR0NDEyIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKK2RxbmV4dHQ0MTMgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNAorZHFuZXh0dDQxNCBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNiAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1CitkcW5leHR0NDE1IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYKK2RxbmV4dHQ0MTYgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNworZHFuZXh0dDQxNyBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOSAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4CitkcW5leHR0NDE4IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkKK2RxbmV4dHQ0MTkgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMAorZHFuZXh0dDQyMCBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMiAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExCisKK2RxbmV4dHQ0MjEgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1ICAtSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYKK2RxbmV4dHQ0MjIgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2ICAtSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTcKK2RxbmV4dHQ0MjMgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3ICAtSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgKK2RxbmV4dHQ0MjQgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4ICAtSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHQ0MjUgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFuZXh0dDQyNiBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHR0NDI3IG5leHR0b3dhcmQgLTEuMCAgICAgICAgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0dDQyOCBuZXh0dG93YXJkIC0xICAgICAgICAgICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dHQ0MjkgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgorZHFuZXh0dDQzMCBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMiAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzCitkcW5leHR0NDMxIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKK2RxbmV4dHQ0MzIgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNQorZHFuZXh0dDQzMyBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNSAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2CitkcW5leHR0NDM0IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcKK2RxbmV4dHQ0MzUgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOAorZHFuZXh0dDQzNiBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOCAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5CitkcW5leHR0NDM3IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAKK2RxbmV4dHQ0MzggbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMQorZHFuZXh0dDQzOSBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMSAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyCisKKy0tIFplcm9zCitkcW5leHR0NTAwIG5leHR0b3dhcmQgLTAgICAgICAgICAgICAtSW5maW5pdHkgLT4gLTFFLTYxNzYgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDUwMSBuZXh0dG93YXJkICAwICAgICAgICAgICAgLUluZmluaXR5IC0+IC0xRS02MTc2ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ1MDIgbmV4dHRvd2FyZCAgMC4wMCAgICAgICAgIC1JbmZpbml0eSAtPiAtMUUtNjE3NiAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0NTAzIG5leHR0b3dhcmQgLTAuMDAgICAgICAgICAtSW5maW5pdHkgLT4gLTFFLTYxNzYgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDUwNCBuZXh0dG93YXJkICAwRS0zMDAgICAgICAgLUluZmluaXR5IC0+IC0xRS02MTc2ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ1MDUgbmV4dHRvd2FyZCAgMEUrMzAwICAgICAgIC1JbmZpbml0eSAtPiAtMUUtNjE3NiAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0NTA2IG5leHR0b3dhcmQgIDBFKzMwMDAwICAgICAtSW5maW5pdHkgLT4gLTFFLTYxNzYgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDUwNyBuZXh0dG93YXJkIC0wRSszMDAwMCAgICAgLUluZmluaXR5IC0+IC0xRS02MTc2ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gc3BlY2lhbHMKK2RxbmV4dHQ1NTAgbmV4dHRvd2FyZCAgIEluZiAgICAgLUluZmluaXR5IC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDU1MSBuZXh0dG93YXJkICAtSW5mICAgICAtSW5maW5pdHkgLT4gLUluZmluaXR5CitkcW5leHR0NTUyIG5leHR0b3dhcmQgICBOYU4gICAgIC1JbmZpbml0eSAtPiAgTmFOCitkcW5leHR0NTUzIG5leHR0b3dhcmQgIHNOYU4gICAgIC1JbmZpbml0eSAtPiAgTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ1NTQgbmV4dHRvd2FyZCAgIE5hTjc3ICAgLUluZmluaXR5IC0+ICBOYU43NworZHFuZXh0dDU1NSBuZXh0dG93YXJkICBzTmFOODggICAtSW5maW5pdHkgLT4gIE5hTjg4IEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0NTU2IG5leHR0b3dhcmQgIC1OYU4gICAgIC1JbmZpbml0eSAtPiAtTmFOCitkcW5leHR0NTU3IG5leHR0b3dhcmQgLXNOYU4gICAgIC1JbmZpbml0eSAtPiAtTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ1NTggbmV4dHRvd2FyZCAgLU5hTjc3ICAgLUluZmluaXR5IC0+IC1OYU43NworZHFuZXh0dDU1OSBuZXh0dG93YXJkIC1zTmFOODggICAtSW5maW5pdHkgLT4gLU5hTjg4IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5tYXgsIE5taW4sIE50aW55LCBzdWJub3JtYWxzCitkcW5leHR0NjcwIG5leHR0b3dhcmQgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLUluZmluaXR5ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUrNjE0NAorZHFuZXh0dDY3MSBuZXh0dG93YXJkICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUrNjE0NCAgIC1JbmZpbml0eSAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTdFKzYxNDQKK2RxbmV4dHQ2NzIgbmV4dHRvd2FyZCAgMUUtNjE0MyAgICAgICAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFLTYxNDQgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ2NzMgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFLTYxNDQgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ2NzQgbmV4dHRvd2FyZCAgOUUtNjE3NiAgICAgICAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IDhFLTYxNzYgICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ2NzUgbmV4dHRvd2FyZCAgOS45RS02MTc1ICAgICAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IDkuOEUtNjE3NSAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ2NzYgbmV4dHRvd2FyZCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NyAgICAgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFLTYxNDcgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ2NzcgbmV4dHRvd2FyZCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NCAgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFLTYxNDQgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ2NzggbmV4dHRvd2FyZCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUtNjE0NCAgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTdFLTYxNDQgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ2NzkgbmV4dHRvd2FyZCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5N0UtNjE0NCAgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTZFLTYxNDQgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ2ODAgbmV4dHRvd2FyZCAgMEUtNjE3NiAgICAgICAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IC0xRS02MTc2ICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ2ODEgbmV4dHRvd2FyZCAgMUUtNjE3NiAgICAgICAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IDBFLTYxNzYgICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFuZXh0dDY4MiBuZXh0dG93YXJkICAyRS02MTc2ICAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gMUUtNjE3NiAgICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorCitkcW5leHR0NjgzIG5leHR0b3dhcmQgIC0wRS02MTc2ICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtMUUtNjE3NiAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Njg0IG5leHR0b3dhcmQgIC0xRS02MTc2ICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtMkUtNjE3NiAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Njg1IG5leHR0b3dhcmQgIC0yRS02MTc2ICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtM0UtNjE3NiAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Njg2IG5leHR0b3dhcmQgIC0xMEUtNjE3NiAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtMS4xRS02MTc1ICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Njg3IG5leHR0b3dhcmQgIC0xMDBFLTYxNzYgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtMS4wMUUtNjE3NCAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Njg4IG5leHR0b3dhcmQgIC0xMDAwMDBFLTYxNzYgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtMS4wMDAwMUUtNjE3MSAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Njg5IG5leHR0b3dhcmQgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgLUluZmluaXR5ICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMKK2RxbmV4dHQ2OTAgbmV4dHRvd2FyZCAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtSW5maW5pdHkgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MworZHFuZXh0dDY5MSBuZXh0dG93YXJkICAtMUUtNjE0MyAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRS02MTQzCitkcW5leHR0NjkyIG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUrNjE0NCAgLUluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQ2OTMgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtSW5maW5pdHkgIC0+IC1JbmZpbml0eSAgICAgICAgICAgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLS0tLS0tIFNwZWNpYWxzCitkcW5leHR0NzgwIG5leHR0b3dhcmQgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFuZXh0dDc4MSBuZXh0dG93YXJkIC1JbmYgIC0xMDAwICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQ3ODIgbmV4dHRvd2FyZCAtSW5mICAtMSAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHR0NzgzIG5leHR0b3dhcmQgLUluZiAgLTAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDc4NCBuZXh0dG93YXJkIC1JbmYgICAwICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQ3ODUgbmV4dHRvd2FyZCAtSW5mICAgMSAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHR0Nzg2IG5leHR0b3dhcmQgLUluZiAgIDEwMDAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDc4NyBuZXh0dG93YXJkIC0xMDAwIC1JbmYgICAtPiAtMTAwMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dHQ3ODggbmV4dHRvd2FyZCAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkcW5leHR0Nzg5IG5leHR0b3dhcmQgLTEgICAgLUluZiAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0dDc5MCBuZXh0dG93YXJkIC0wICAgIC1JbmYgICAtPiAtMUUtNjE3NiAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ3OTEgbmV4dHRvd2FyZCAgMCAgICAtSW5mICAgLT4gLTFFLTYxNzYgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0NzkyIG5leHR0b3dhcmQgIDEgICAgLUluZiAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHQ3OTMgbmV4dHRvd2FyZCAgMTAwMCAtSW5mICAgLT4gIDk5OS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0Nzk0IG5leHR0b3dhcmQgIEluZiAgLUluZiAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorCitkcW5leHR0ODAwIG5leHR0b3dhcmQgIEluZiAgLUluZiAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDgwMSBuZXh0dG93YXJkICBJbmYgIC0xMDAwICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQ4MDIgbmV4dHRvd2FyZCAgSW5mICAtMSAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHR0ODAzIG5leHR0b3dhcmQgIEluZiAgLTAgICAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDgwNCBuZXh0dG93YXJkICBJbmYgICAwICAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQ4MDUgbmV4dHRvd2FyZCAgSW5mICAgMSAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHR0ODA2IG5leHR0b3dhcmQgIEluZiAgIDEwMDAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDgwNyBuZXh0dG93YXJkICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbmV4dHQ4MDggbmV4dHRvd2FyZCAtMTAwMCAgSW5mICAgLT4gLTk5OS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0ODA5IG5leHR0b3dhcmQgLUluZiAgIEluZiAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDgxMCBuZXh0dG93YXJkIC0xICAgICBJbmYgICAtPiAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0ODExIG5leHR0b3dhcmQgLTAgICAgIEluZiAgIC0+ICAxRS02MTc2ICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDgxMiBuZXh0dG93YXJkICAwICAgICBJbmYgICAtPiAgMUUtNjE3NiAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ4MTMgbmV4dHRvd2FyZCAgMSAgICAgSW5mICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHR0ODE0IG5leHR0b3dhcmQgIDEwMDAgIEluZiAgIC0+ICAxMDAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0dDgxNSBuZXh0dG93YXJkICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZHFuZXh0dDgyMSBuZXh0dG93YXJkICBOYU4gLUluZiAgICAtPiAgTmFOCitkcW5leHR0ODIyIG5leHR0b3dhcmQgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RxbmV4dHQ4MjMgbmV4dHRvd2FyZCAgTmFOIC0xICAgICAgLT4gIE5hTgorZHFuZXh0dDgyNCBuZXh0dG93YXJkICBOYU4gLTAgICAgICAtPiAgTmFOCitkcW5leHR0ODI1IG5leHR0b3dhcmQgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2RxbmV4dHQ4MjYgbmV4dHRvd2FyZCAgTmFOICAxICAgICAgLT4gIE5hTgorZHFuZXh0dDgyNyBuZXh0dG93YXJkICBOYU4gIDEwMDAgICAtPiAgTmFOCitkcW5leHR0ODI4IG5leHR0b3dhcmQgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RxbmV4dHQ4MjkgbmV4dHRvd2FyZCAgTmFOICBOYU4gICAgLT4gIE5hTgorZHFuZXh0dDgzMCBuZXh0dG93YXJkIC1JbmYgIE5hTiAgICAtPiAgTmFOCitkcW5leHR0ODMxIG5leHR0b3dhcmQgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RxbmV4dHQ4MzIgbmV4dHRvd2FyZCAtMSAgICBOYU4gICAgLT4gIE5hTgorZHFuZXh0dDgzMyBuZXh0dG93YXJkIC0wICAgIE5hTiAgICAtPiAgTmFOCitkcW5leHR0ODM0IG5leHR0b3dhcmQgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RxbmV4dHQ4MzUgbmV4dHRvd2FyZCAgMSAgICBOYU4gICAgLT4gIE5hTgorZHFuZXh0dDgzNiBuZXh0dG93YXJkICAxMDAwIE5hTiAgICAtPiAgTmFOCitkcW5leHR0ODM3IG5leHR0b3dhcmQgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZHFuZXh0dDg0MSBuZXh0dG93YXJkICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg0MiBuZXh0dG93YXJkICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg0MyBuZXh0dG93YXJkICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg0NCBuZXh0dG93YXJkICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg0NSBuZXh0dG93YXJkICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg0NiBuZXh0dG93YXJkICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg0NyBuZXh0dG93YXJkICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg0OCBuZXh0dG93YXJkICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg0OSBuZXh0dG93YXJkICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg1MCBuZXh0dG93YXJkICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg1MSBuZXh0dG93YXJkIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg1MiBuZXh0dG93YXJkIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg1MyBuZXh0dG93YXJkIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg1NCBuZXh0dG93YXJkIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg1NSBuZXh0dG93YXJkICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg1NiBuZXh0dG93YXJkICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg1NyBuZXh0dG93YXJkICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg1OCBuZXh0dG93YXJkICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg1OSBuZXh0dG93YXJkICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcW5leHR0ODYxIG5leHR0b3dhcmQgIE5hTjEgICAtSW5mICAgIC0+ICBOYU4xCitkcW5leHR0ODYyIG5leHR0b3dhcmQgK05hTjIgICAtMTAwMCAgIC0+ICBOYU4yCitkcW5leHR0ODYzIG5leHR0b3dhcmQgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCitkcW5leHR0ODY0IG5leHR0b3dhcmQgIE5hTjQgICAgSW5mICAgIC0+ICBOYU40CitkcW5leHR0ODY1IG5leHR0b3dhcmQgIE5hTjUgICArTmFONiAgIC0+ICBOYU41CitkcW5leHR0ODY2IG5leHR0b3dhcmQgLUluZiAgICAgTmFONyAgIC0+ICBOYU43CitkcW5leHR0ODY3IG5leHR0b3dhcmQgLTEwMDAgICAgTmFOOCAgIC0+ICBOYU44CitkcW5leHR0ODY4IG5leHR0b3dhcmQgIDEwMDAgICAgTmFOOSAgIC0+ICBOYU45CitkcW5leHR0ODY5IG5leHR0b3dhcmQgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorZHFuZXh0dDg3MSBuZXh0dG93YXJkICBzTmFOMTEgIC1JbmYgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0ODcyIG5leHR0b3dhcmQgIHNOYU4xMiAgLTEwMDAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NzMgbmV4dHRvd2FyZCAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg3NCBuZXh0dG93YXJkICBzTmFOMTQgICBOYU4xNyAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0ODc1IG5leHR0b3dhcmQgIHNOYU4xNSAgc05hTjE4IC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NzYgbmV4dHRvd2FyZCAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg3NyBuZXh0dG93YXJkIC1JbmYgICAgK3NOYU4yMCAtPiAgTmFOMjAgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0ODc4IG5leHR0b3dhcmQgLTEwMDAgICAgc05hTjIxIC0+ICBOYU4yMSAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NzkgbmV4dHRvd2FyZCAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg4MCBuZXh0dG93YXJkICBJbmYgICAgIHNOYU4yMyAtPiAgTmFOMjMgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0ODgxIG5leHR0b3dhcmQgK05hTjI1ICArc05hTjI0IC0+ICBOYU4yNCAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4ODIgbmV4dHRvd2FyZCAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2CitkcW5leHR0ODgzIG5leHR0b3dhcmQgLXNOYU4yNyAgc05hTjI5IC0+IC1OYU4yNyAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4ODQgbmV4dHRvd2FyZCAgMTAwMCAgICAtTmFOMzAgLT4gLU5hTjMwCitkcW5leHR0ODg1IG5leHR0b3dhcmQgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0cworZHFuZXh0dDkwMCBuZXh0dG93YXJkIDEgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0OTAxIG5leHR0b3dhcmQgIyAgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU9yLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxT3IuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQzNGIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU9yLmRlY1Rlc3QKQEAgLTAsMCArMSw0MDEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFPci5kZWNUZXN0IC0tIGRpZ2l0d2lzZSBsb2dpY2FsIE9SIGZvciBkZWNRdWFkcyAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sgKHRydXRoIHRhYmxlKQorZHFvcjAwMSBvciAgICAgICAgICAgICAwICAgIDAgLT4gICAgMAorZHFvcjAwMiBvciAgICAgICAgICAgICAwICAgIDEgLT4gICAgMQorZHFvcjAwMyBvciAgICAgICAgICAgICAxICAgIDAgLT4gICAgMQorZHFvcjAwNCBvciAgICAgICAgICAgICAxICAgIDEgLT4gICAgMQorZHFvcjAwNSBvciAgICAgICAgICAxMTAwIDEwMTAgLT4gMTExMAorLS0gYW5kIGF0IG1zZCBhbmQgbXNkLTEKK2Rxb3IwMDYgb3IgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCitkcW9yMDA3IG9yIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxb3IwMDggb3IgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFvcjAwOSBvciAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW9yMDEwIG9yIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorZHFvcjAxMSBvciAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW9yMDEyIG9yIDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxb3IwMTMgb3IgMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCistLSBWYXJpb3VzIGxlbmd0aHMKK2Rxb3I2MDEgb3IgMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjAyIG9yIDEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYwMyBvciAxMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MDQgb3IgMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjA1IG9yIDExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYwNiBvciAxMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MDcgb3IgMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjA4IG9yIDExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYwOSBvciAxMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MTAgb3IgMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjExIG9yIDExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYxMiBvciAxMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MTMgb3IgMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjE0IG9yIDExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYxNSBvciAxMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MTYgb3IgMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjE3IG9yIDExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYxOCBvciAxMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MTkgb3IgMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjIwIG9yIDExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYyMSBvciAxMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExIDExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MjIgb3IgMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMSAxMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjIzIG9yIDExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTEgMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYyNCBvciAxMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExIDExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MjUgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMSAxMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjI2IG9yIDExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTEgMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYyNyBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExIDExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2Mjggb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMSAxMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjI5IG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTEgMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYzMCBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExIDExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MzEgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMSAxMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjMyIG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTEgMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYzMyBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxIDEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MzQgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCisKK2Rxb3I2NDEgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjQyIG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDEgMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY0MyBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExIDExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NDQgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMSAxMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjQ1IG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTEgMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY0NiBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExIDExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NDcgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMSAxMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjQ4IG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTEgMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY0OSBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExIDExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NTAgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMSAxMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjUxIG9yIDExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTEgMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY1MiBvciAxMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExIDExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NTMgb3IgMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMSAxMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjU0IG9yIDExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTEgMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY1NSBvciAxMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExIDExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NTYgb3IgMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjU3IG9yIDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAgMTAxMDEwMTAxMDEwMTAxMDAwMTAxMDEwMTAxMDEwMTAxMCAgLT4gMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMAorZHFvcjY1OCBvciAxMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NTkgb3IgMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjYwIG9yIDExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY2MSBvciAxMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NjIgb3IgMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjYzIG9yIDExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY2NCBvciAxMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NjUgb3IgMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjY2IG9yIDAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEgMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDAwMTAxMDEwMSAgLT4gIDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMQorZHFvcjY2NyBvciAxMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2Njggb3IgMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjY5IG9yIDExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY3MCBvciAxMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NzEgb3IgMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjcyIG9yIDExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY3MyBvciAxMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NzQgb3IgMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjc1IG9yIDAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMAorZHFvcjY3NiBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAKKworZHFvcjY4MSBvciAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDAxMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTAgIC0+ICAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2ODIgb3IgMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMDExMTExMTEwMTAxMTExMTExMTExMTExMTExMTExMTAxICAtPiAxMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjgzIG9yIDExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTEwMTExMTEwMTExMDExMTExMTExMTExMTExMTExMTAxMSAgLT4gMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY4NCBvciAxMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTAxMTEwMTExMTEwMTExMTExMTExMTExMTExMTAxMTEgIC0+IDExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2ODUgb3IgMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMDEwMTExMTExMTAxMTExMTExMTExMTExMTAxMTExICAtPiAxMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjg2IG9yIDExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTEwMTExMTExMTExMDExMTExMTExMTExMTAxMTExMSAgLT4gMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY4NyBvciAxMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTEwMTAxMTExMTExMTEwMTExMTExMTExMTAxMTExMTEgIC0+IDExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2ODggb3IgMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTEwMTExMDExMTExMTExMTAxMTExMTExMTAxMTExMTExICAtPiAxMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjg5IG9yIDExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTEgMTEwMTExMTEwMTExMTExMTExMDExMTExMTAxMTExMTExMSAgLT4gMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY5MCBvciAxMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExIDEwMTExMTExMTAxMTExMTExMTEwMTExMTAxMTExMTExMTAgIC0+IDExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2OTEgb3IgMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMSAwMTExMTExMTExMDExMTExMTExMTAxMTAxMTExMTExMTAxICAtPiAxMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjkyIG9yIDExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTEwMTExMTExMTExMDAxMTExMTExMTAxMSAgLT4gMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY5MyBvciAxMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTAxMTExMTExMTAwMTExMTExMTAxMTEgIC0+IDExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2OTQgb3IgMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMDExMTExMTAxMTAxMTExMTAxMTExICAtPiAxMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExCitkcW9yNjk1IG9yIDExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTEwMTExMTAxMTExMDExMTAxMTExMSAgLT4gMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMQorZHFvcjY5NiBvciAxMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTAxMTAxMTExMTEwMTAxMTExMTEgIC0+IDExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTEKK2Rxb3I2OTcgb3IgMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMDAxMTExMTExMTAxMTExMTExICAtPiAxMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExCitkcW9yNjk4IG9yIDExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTAwMTExMTExMTAxMDExMTExMSAgLT4gMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMQorZHFvcjY5OSBvciAxMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTAxMTAxMTExMTAxMTEwMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTEKK2Rxb3I3MDAgb3IgMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTAxMTExMDExMTAxMTExMTAxMTExICAtPiAxMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExCitkcW9yNzAxIG9yIDExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTEgMTExMTExMTExMTExMTAxMTExMTEwMTAxMTExMTExMDExMSAgLT4gMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMQorZHFvcjcwMiBvciAxMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExIDExMTExMTExMTExMTAxMTExMTExMTAxMTExMTExMTEwMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTEKK2Rxb3I3MDMgb3IgMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMSAxMTExMTExMTExMTAxMTExMTExMTAxMDExMTExMTExMTAxICAtPiAxMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExCitkcW9yNzA0IG9yIDExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTEgMTExMTExMTExMTAxMTExMTExMTAxMTEwMTExMTExMTExMCAgLT4gMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMQorZHFvcjcwNSBvciAxMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExIDAxMTExMTExMTAxMTExMTExMTAxMTExMTAxMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTEKK2Rxb3I3MDYgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMSAxMDExMTExMTAxMTExMTExMTAxMTExMTExMDExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExCitkcW9yNzA3IG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTEgMTEwMTExMTAxMTExMTExMTAxMTExMTExMTEwMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMQorZHFvcjcwOCBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExIDExMTAxMTAxMTExMTExMTAxMTExMTExMTExMTAxMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTEKK2Rxb3I3MDkgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMSAxMTExMDAxMTExMTExMTAxMTExMTExMTExMTExMDExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExCitkcW9yNzEwIG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTEgMTExMTAwMTExMTExMTAxMTExMTExMTExMTExMTEwMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMQorZHFvcjcxMSBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExIDExMTAxMTAxMTExMTAxMTExMTExMTExMTExMTExMTAxMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTEKK2Rxb3I3MTIgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMSAxMTAxMTExMDExMTAxMTExMTExMTExMTExMTExMTExMDExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExCitkcW9yNzEzIG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDEgMTAxMTExMTEwMTAxMTExMTExMTExMTExMTExMTExMTEwMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMQorZHFvcjcxNCBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwIDAxMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAKKworCisKKy0tICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAxMjM0NTY3ODkwMTIzNDU2CitkcW9yMDIwIG9yIDExMTExMTExMTExMTExMTEgICAgIDExMTExMTExMTExMTExMTEgIC0+ICAxMTExMTExMTExMTExMTExCitkcW9yMDIxIG9yICAxMTExMTExMTExMTExMTEgICAgICAxMTExMTExMTExMTExMTEgIC0+ICAgMTExMTExMTExMTExMTExCitkcW9yMDIyIG9yICAgMTExMTExMTExMTExMTEgICAgICAgMTExMTExMTExMTExMTEgIC0+ICAgIDExMTExMTExMTExMTExCitkcW9yMDIzIG9yICAgIDExMTExMTExMTExMTEgICAgICAgIDExMTExMTExMTExMTEgIC0+ICAgICAxMTExMTExMTExMTExCitkcW9yMDI0IG9yICAgICAxMTExMTExMTExMTEgICAgICAgICAxMTExMTExMTExMTEgIC0+ICAgICAgMTExMTExMTExMTExCitkcW9yMDI1IG9yICAgICAgMTExMTExMTExMTEgICAgICAgICAgMTExMTExMTExMTEgIC0+ICAgICAgIDExMTExMTExMTExCitkcW9yMDI2IG9yICAgICAgIDExMTExMTExMTEgICAgICAgICAgIDExMTExMTExMTEgIC0+ICAgICAgICAxMTExMTExMTExCitkcW9yMDI3IG9yICAgICAgICAxMTExMTExMTEgICAgICAgICAgICAxMTExMTExMTEgIC0+ICAgICAgICAgMTExMTExMTExCitkcW9yMDI4IG9yICAgICAgICAgMTExMTExMTEgICAgICAgICAgICAgMTExMTExMTEgIC0+ICAgICAgICAgIDExMTExMTExCitkcW9yMDI5IG9yICAgICAgICAgIDExMTExMTEgICAgICAgICAgICAgIDExMTExMTEgIC0+ICAgICAgICAgICAxMTExMTExCitkcW9yMDMwIG9yICAgICAgICAgICAxMTExMTEgICAgICAgICAgICAgICAxMTExMTEgIC0+ICAgICAgICAgICAgMTExMTExCitkcW9yMDMxIG9yICAgICAgICAgICAgMTExMTEgICAgICAgICAgICAgICAgMTExMTEgIC0+ICAgICAgICAgICAgIDExMTExCitkcW9yMDMyIG9yICAgICAgICAgICAgIDExMTEgICAgICAgICAgICAgICAgIDExMTEgIC0+ICAgICAgICAgICAgICAxMTExCitkcW9yMDMzIG9yICAgICAgICAgICAgICAxMTEgICAgICAgICAgICAgICAgICAxMTEgIC0+ICAgICAgICAgICAgICAgMTExCitkcW9yMDM0IG9yICAgICAgICAgICAgICAgMTEgICAgICAgICAgICAgICAgICAgMTEgIC0+ICAgICAgICAgICAgICAgIDExCitkcW9yMDM1IG9yICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgIDEgIC0+ICAgICAgICAgICAgICAgICAxCitkcW9yMDM2IG9yICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgIDAgIC0+ICAgICAgICAgICAgICAgICAwCisKK2Rxb3IwNDIgb3IgIDExMTExMTExMDAwMDAwMCAgICAgMTExMTExMTExMDAwMDAwMCAgLT4gIDExMTExMTExMTAwMDAwMDAKK2Rxb3IwNDMgb3IgICAxMTExMTExMDAwMDAwMCAgICAgMTAwMDAwMDEwMDAwMDAwMCAgLT4gIDEwMTExMTExMTAwMDAwMDAKK2Rxb3IwNDQgb3IgICAgMTExMTExMDAwMDAwMCAgICAgMTAwMDAwMTAwMDAwMDAwMCAgLT4gIDEwMDExMTExMTAwMDAwMDAKK2Rxb3IwNDUgb3IgICAgIDExMTExMDAwMDAwMCAgICAgMTAwMDAxMDAwMDAwMDAwMCAgLT4gIDEwMDAxMTExMTAwMDAwMDAKK2Rxb3IwNDYgb3IgICAgICAxMTExMDAwMDAwMCAgICAgMTAwMDEwMDAwMDAwMDAwMCAgLT4gIDEwMDAxMTExMTAwMDAwMDAKK2Rxb3IwNDcgb3IgICAgICAgMTExMDAwMDAwMCAgICAgMTAwMTAwMDAwMDAwMDAwMCAgLT4gIDEwMDEwMDExMTAwMDAwMDAKK2Rxb3IwNDggb3IgICAgICAgIDExMDAwMDAwMCAgICAgMTAxMDAwMDAwMDAwMDAwMCAgLT4gIDEwMTAwMDAxMTAwMDAwMDAKK2Rxb3IwNDkgb3IgICAgICAgICAxMDAwMDAwMCAgICAgMTEwMDAwMDAwMDAwMDAwMCAgLT4gIDExMDAwMDAwMTAwMDAwMDAKKworZHFvcjA5MCBvciAwMTExMTExMTEgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorZHFvcjA5MSBvciAxMDExMTExMTEgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorZHFvcjA5MiBvciAxMTAxMTExMTEgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorZHFvcjA5MyBvciAxMTEwMTExMTEgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorZHFvcjA5NCBvciAxMTExMDExMTEgIDExMTEwMTExMSAgLT4gIDExMTEwMTExMQorZHFvcjA5NSBvciAxMTExMTAxMTEgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorZHFvcjA5NiBvciAxMTExMTEwMTEgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorZHFvcjA5NyBvciAxMTExMTExMDEgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorZHFvcjA5OCBvciAxMTExMTExMTAgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorCitkcW9yMTAwIG9yIDExMTEwMTExMSAgMDExMTExMTExICAtPiAgMTExMTExMTExCitkcW9yMTAxIG9yIDExMTEwMTExMSAgMTAxMTExMTExICAtPiAgMTExMTExMTExCitkcW9yMTAyIG9yIDExMTEwMTExMSAgMTEwMTExMTExICAtPiAgMTExMTExMTExCitkcW9yMTAzIG9yIDExMTEwMTExMSAgMTExMDExMTExICAtPiAgMTExMTExMTExCitkcW9yMTA0IG9yIDExMTEwMTExMSAgMTExMTAxMTExICAtPiAgMTExMTAxMTExCitkcW9yMTA1IG9yIDExMTEwMTExMSAgMTExMTEwMTExICAtPiAgMTExMTExMTExCitkcW9yMTA2IG9yIDExMTEwMTExMSAgMTExMTExMDExICAtPiAgMTExMTExMTExCitkcW9yMTA3IG9yIDExMTEwMTExMSAgMTExMTExMTAxICAtPiAgMTExMTExMTExCitkcW9yMTA4IG9yIDExMTEwMTExMSAgMTExMTExMTEwICAtPiAgMTExMTExMTExCisKKy0tIG5vbi0wLzEgc2hvdWxkIG5vdCBiZSBhY2NlcHRlZCwgbm9yIHNob3VsZCBzaWducworZHFvcjIyMCBvciAxMTExMTExMTIgIDExMTExMTExMSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjIyMSBvciAzMzMzMzMzMzMgIDMzMzMzMzMzMyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjIyMiBvciA1NTU1NTU1NTUgIDU1NTU1NTU1NSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjIyMyBvciA3Nzc3Nzc3NzcgIDc3Nzc3Nzc3NyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjIyNCBvciA5OTk5OTk5OTkgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjIyNSBvciAyMjIyMjIyMjIgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjIyNiBvciA0NDQ0NDQ0NDQgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjIyNyBvciA2NjY2NjY2NjYgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjIyOCBvciA4ODg4ODg4ODggIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjIyOSBvciA5OTk5OTk5OTkgIDIyMjIyMjIyMiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjIzMCBvciA5OTk5OTk5OTkgIDQ0NDQ0NDQ0NCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjIzMSBvciA5OTk5OTk5OTkgIDY2NjY2NjY2NiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjIzMiBvciA5OTk5OTk5OTkgIDg4ODg4ODg4OCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYSBmZXcgcmFuZG9tcworZHFvcjI0MCBvciAgNTY3NDY4Njg5IC05MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI0MSBvciAgNTY3MzY3Njg5ICA5MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI0MiBvciAtNjMxOTE3NzcyIC03MDYwMTQ2MzQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI0MyBvciAtNzU2MjUzMjU3ICAxMzg1NzkyMzQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI0NCBvciAgODM1NTkwMTQ5ICA1Njc0MzU0MDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QKK2Rxb3IyNTAgb3IgIDIwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjUxIG9yICA3MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI1MiBvciAgODAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNTMgb3IgIDkwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjU0IG9yICAyMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI1NSBvciAgNzAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNTYgb3IgIDgwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjU3IG9yICA5MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI1OCBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAyMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNTkgb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgNzAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjYwIG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDgwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI2MSBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCA5MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNjIgb3IgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMjAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjYzIG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDcwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI2NCBvciAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCA4MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNjUgb3IgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgOTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRC0xCitkcW9yMjcwIG9yICAwMjAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTExMDAwMDAwMDAwMTAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI3MSBvciAgMDcwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDEwMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNzIgb3IgIDA4MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMTAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjczIG9yICAwOTAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI3NCBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDEwMDAwMCAwMjAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNzUgb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMTAwMDAgMDcwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjc2IG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAxMDAwIDA4MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI3NyBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDEwMCAwOTAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTFNECitkcW9yMjgwIG9yICAwMDEwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAyIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMDAwMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI4MSBvciAgMDAwMTAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwNyAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDExIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyODIgb3IgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTExMDAwMDAwMDAwMDggMTAwMDAwMDExMTAwMDExMTAwMDExMTAxMDAwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjgzIG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDEwMDAwMDAwMDA5IDEwMDAwMDAxMTEwMDAxMTEwMDAxMTExMDAwMDAwMDAwMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI4NCBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMDAwMCAwMDAxMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyODUgb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMDAwMDAgMDAxMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwNyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjg2IG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMDAwMDAwIDAxMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDggLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI4NyBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDA5IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTWlkZGllCitkcW9yMjg4IG9yICAwMDEwMDAwMTExMDAwMTExMDAwMTExMDAwMDIwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI4OSBvciAgMDAwMTAwMDExMTAwMDExMTAwMDExMTAwMDA3MDAwMDAwMSAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyOTAgb3IgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTExMDAwODAwMDAwMTAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjkxIG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDEwMDkwMDAwMTAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI5MiBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMTAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDIwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyOTMgb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMTAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDA3MDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjk0IG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMTAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwODAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI5NSBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDkwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHNpZ25zCitkcW9yMjk2IG9yIC0xMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIC0wMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyOTcgb3IgLTEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgIDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI5OCBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAtMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjk5IG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwICAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDExMDAwMTAwIC0+ICAxMDAwMDAxMTExMDAxMTExMDAxMTExMDAwMDExMDAwMTAwCisKKy0tIE5tYXgsIE5taW4sIE50aW55LWxpa2UKK2Rxb3IzMzEgb3IgIDIgICA5Ljk5OTk5OTk5RSsxOTk5ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjMzMiBvciAgMyAgIDFFLTE5OTkgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzMzIG9yICA0ICAgMS4wMDAwMDAwMEUtMTk5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzMzQgb3IgIDUgICAxRS0xMDA5ICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjMzNSBvciAgNiAgIC0xRS0xMDA5ICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzM2IG9yICA3ICAgLTEuMDAwMDAwMDBFLTE5OTkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzMzcgb3IgIDggICAtMUUtMTk5OSAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjMzOCBvciAgOSAgIC05Ljk5OTk5OTk5RSsxOTk5ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzQxIG9yICA5Ljk5OTk5OTk5RSsyOTk5ICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzNDIgb3IgIDFFLTI5OTkgICAgICAgICAgICAgIDAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM0MyBvciAgMS4wMDAwMDAwMEUtMjk5OSAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzQ0IG9yICAxRS0xMDA5ICAgICAgICAgICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzNDUgb3IgIC0xRS0xMDA5ICAgICAgICAgICAgLTEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM0NiBvciAgLTEuMDAwMDAwMDBFLTI5OTkgICAgMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzQ3IG9yICAtMUUtMjk5OSAgICAgICAgICAgICAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzNDggb3IgIC05Ljk5OTk5OTk5RSsyOTk5ICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBIGZldyBvdGhlciBub24taW50ZWdlcnMKK2Rxb3IzNjEgb3IgIDEuMCAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM2MiBvciAgMUUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzYzIG9yICAwLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzNjQgb3IgIDBFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM2NSBvciAgOS45ICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzY2IG9yICA5RSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzNzEgb3IgIDAgMS4wICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM3MiBvciAgMCAxRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzczIG9yICAwIDAuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzNzQgb3IgIDAgMEUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM3NSBvciAgMCA5LjkgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzc2IG9yICAwIDlFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQWxsIFNwZWNpYWxzIGFyZSBpbiBlcnJvcgorZHFvcjc4MCBvciAtSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yNzgxIG9yIC1JbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I3ODIgb3IgLUluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjc4MyBvciAtSW5mICAtMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yNzg0IG9yIC1JbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I3ODUgb3IgLUluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjc4NiBvciAtSW5mICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yNzg3IG9yIC0xMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I3ODggb3IgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjc4OSBvciAtMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yNzkwIG9yIC0wICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I3OTEgb3IgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjc5MiBvciAgMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yNzkzIG9yICAxMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I3OTQgb3IgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcW9yODAwIG9yICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MDEgb3IgIEluZiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgwMiBvciAgSW5mICAtMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODAzIG9yICBJbmYgIC0wICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MDQgb3IgIEluZiAgIDAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgwNSBvciAgSW5mICAgMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODA2IG9yICBJbmYgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MDcgb3IgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgwOCBvciAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODA5IG9yIC1JbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MTAgb3IgLTEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgxMSBvciAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODEyIG9yICAwICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MTMgb3IgIDEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgxNCBvciAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODE1IG9yICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFvcjgyMSBvciAgTmFOIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODIyIG9yICBOYU4gLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MjMgb3IgIE5hTiAtMSAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgyNCBvciAgTmFOIC0wICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODI1IG9yICBOYU4gIDAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MjYgb3IgIE5hTiAgMSAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgyNyBvciAgTmFOICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODI4IG9yICBOYU4gIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4Mjkgb3IgIE5hTiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgzMCBvciAtSW5mICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODMxIG9yIC0xMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MzIgb3IgLTEgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgzMyBvciAtMCAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODM0IG9yICAwICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MzUgb3IgIDEgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgzNiBvciAgMTAwMCBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODM3IG9yICBJbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFvcjg0MSBvciAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NDIgb3IgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODQzIG9yICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg0NCBvciAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NDUgb3IgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODQ2IG9yICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg0NyBvciAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NDggb3IgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODQ5IG9yICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg1MCBvciAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NTEgb3IgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODUyIG9yIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg1MyBvciAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NTQgb3IgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODU1IG9yICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg1NiBvciAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NTcgb3IgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODU4IG9yICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg1OSBvciAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHFvcjg2MSBvciAgTmFOMSAgIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODYyIG9yICtOYU4yICAgLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NjMgb3IgIE5hTjMgICAgMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg2NCBvciAgTmFONCAgICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODY1IG9yICBOYU41ICAgK05hTjYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NjYgb3IgLUluZiAgICAgTmFONyAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg2NyBvciAtMTAwMCAgICBOYU44ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODY4IG9yICAxMDAwICAgIE5hTjkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4Njkgb3IgIEluZiAgICArTmFOMTAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg3MSBvciAgc05hTjExICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODcyIG9yICBzTmFOMTIgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NzMgb3IgIHNOYU4xMyAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg3NCBvciAgc05hTjE0ICAgTmFOMTcgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODc1IG9yICBzTmFOMTUgIHNOYU4xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NzYgb3IgIE5hTjE2ICAgc05hTjE5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg3NyBvciAtSW5mICAgICtzTmFOMjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODc4IG9yIC0xMDAwICAgIHNOYU4yMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4Nzkgb3IgIDEwMDAgICAgc05hTjIyIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg4MCBvciAgSW5mICAgICBzTmFOMjMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODgxIG9yICtOYU4yNSAgK3NOYU4yNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4ODIgb3IgLU5hTjI2ICAgIE5hTjI4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg4MyBvciAtc05hTjI3ICBzTmFOMjkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODg0IG9yICAxMDAwICAgIC1OYU4zMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4ODUgb3IgIDEwMDAgICAtc05hTjMxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVBsdXMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFQbHVzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlY2FhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFQbHVzLmRlY1Rlc3QKQEAgLTAsMCArMSw4OCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcVBsdXMuZGVjVGVzdCAtLSBkZWNRdWFkIDAreCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjUXVhZHMuCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sKK2RxcGxzMDAxIHBsdXMgICAgICAgKzcuNTAgIC0+IDcuNTAKKworLS0gSW5maW5pdGllcworZHFwbHMwMTEgcGx1cyAgSW5maW5pdHkgICAgLT4gSW5maW5pdHkKK2RxcGxzMDEyIHBsdXMgIC1JbmZpbml0eSAgIC0+IC1JbmZpbml0eQorCistLSBOYU5zLCAwIHBheWxvYWQKK2RkcWxzMDIxIHBsdXMgICAgICAgICBOYU4gIC0+IE5hTgorZGRxbHMwMjIgcGx1cyAgICAgICAgLU5hTiAgLT4gLU5hTgorZGRxbHMwMjMgcGx1cyAgICAgICAgc05hTiAgLT4gTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxbHMwMjQgcGx1cyAgICAgICAtc05hTiAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOYU5zLCBub24tMCBwYXlsb2FkCitkZHFsczAzMSBwbHVzICAgICAgIE5hTjEzICAtPiBOYU4xMworZGRxbHMwMzIgcGx1cyAgICAgIC1OYU4xMyAgLT4gLU5hTjEzCitkZHFsczAzMyBwbHVzICAgICAgc05hTjEzICAtPiBOYU4xMyAgIEludmFsaWRfb3BlcmF0aW9uCitkZHFsczAzNCBwbHVzICAgICAtc05hTjEzICAtPiAtTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitkZHFsczAzNSBwbHVzICAgICAgIE5hTjcwICAtPiBOYU43MAorZGRxbHMwMzYgcGx1cyAgICAgIC1OYU43MCAgLT4gLU5hTjcwCitkZHFsczAzNyBwbHVzICAgICAgc05hTjEwMSAtPiBOYU4xMDEgIEludmFsaWRfb3BlcmF0aW9uCitkZHFsczAzOCBwbHVzICAgICAtc05hTjEwMSAtPiAtTmFOMTAxIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGZpbml0ZXMKK2RxcGxzMTAxIHBsdXMgICAgICAgICAgNyAgIC0+IDcKK2RxcGxzMTAyIHBsdXMgICAgICAgICAtNyAgIC0+IC03CitkcXBsczEwMyBwbHVzICAgICAgICAgNzUgICAtPiA3NQorZHFwbHMxMDQgcGx1cyAgICAgICAgLTc1ICAgLT4gLTc1CitkcXBsczEwNSBwbHVzICAgICAgIDcuNTAgICAtPiA3LjUwCitkcXBsczEwNiBwbHVzICAgICAgLTcuNTAgICAtPiAtNy41MAorZHFwbHMxMDcgcGx1cyAgICAgICA3LjUwMCAgLT4gNy41MDAKK2RxcGxzMTA4IHBsdXMgICAgICAtNy41MDAgIC0+IC03LjUwMAorCistLSB6ZXJvcworZHFwbHMxMTEgcGx1cyAgICAgICAgICAwICAgLT4gMAorZHFwbHMxMTIgcGx1cyAgICAgICAgIC0wICAgLT4gMAorZHFwbHMxMTMgcGx1cyAgICAgICAwRSs0ICAgLT4gMEUrNAorZHFwbHMxMTQgcGx1cyAgICAgIC0wRSs0ICAgLT4gMEUrNAorZHFwbHMxMTUgcGx1cyAgICAgMC4wMDAwICAgLT4gMC4wMDAwCitkcXBsczExNiBwbHVzICAgIC0wLjAwMDAgICAtPiAwLjAwMDAKK2RxcGxzMTE3IHBsdXMgICAgICAwRS0xNDEgIC0+IDBFLTE0MQorZHFwbHMxMTggcGx1cyAgICAgLTBFLTE0MSAgLT4gMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitkcXBsczEyMSBwbHVzICAgMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MiAgICAtPiAgMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MgorZHFwbHMxMjIgcGx1cyAgLTI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIgICAgLT4gLTI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIKK2RxcGxzMTIzIHBsdXMgICAxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxICAgIC0+ICAxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxCitkcXBsczEyNCBwbHVzICAtMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MSAgICAtPiAtMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MQorCistLSBObWF4LCBObWluLCBOdGlueQorZHFwbHMxMzEgcGx1cyAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxcGxzMTMyIHBsdXMgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDFFLTYxNDMKK2RxcGxzMTMzIHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkcXBsczEzNCBwbHVzICAxRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxRS02MTc2IFN1Ym5vcm1hbAorCitkcXBsczEzNSBwbHVzICAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IC0xRS02MTc2IFN1Ym5vcm1hbAorZHFwbHMxMzYgcGx1cyAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxcGxzMTM3IHBsdXMgIC0xRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gLTFFLTYxNDMKK2RxcGxzMTM4IHBsdXMgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxUXVhbnRpemUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFRdWFudGl6ZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDcxYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxUXVhbnRpemUuZGVjVGVzdApAQCAtMCwwICsxLDgzNiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcVF1YW50aXplLmRlY1Rlc3QgLS0gZGVjUXVhZCBxdWFudGl6ZSBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIE1vc3Qgb2YgdGhlIHRlc3RzIGhlcmUgYXNzdW1lIGEgInJlZ3VsYXIgcGF0dGVybiIsIHdoZXJlIHRoZQorLS0gc2lnbiBhbmQgY29lZmZpY2llbnQgYXJlICsxLgorLS0gMjAwNC4wMy4xNSBVbmRlcmZsb3cgZm9yIHF1YW50aXplIGlzIHN1cHByZXNzZWQKKy0tIDIwMDUuMDYuMDggTW9yZSBleHRlbnNpdmUgdGVzdHMgZm9yICdkb2VzIG5vdCBmaXQnCistLSBbRm9ya2VkIGZyb20gcXVhbnRpemUuZGVjVGVzdCAyMDA2LjExLjI1XQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkcXF1YTAwMSBxdWFudGl6ZSAwICAgICAgIDFlMCAgIC0+IDAKK2RxcXVhMDAyIHF1YW50aXplIDEgICAgICAgMWUwICAgLT4gMQorZHFxdWEwMDMgcXVhbnRpemUgMC4xICAgIDFlKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEwMDUgcXVhbnRpemUgMC4xICAgIDFlKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEwMDYgcXVhbnRpemUgMC4xICAgICAxZTAgICAtPiAwIEluZXhhY3QgUm91bmRlZAorZHFxdWEwMDcgcXVhbnRpemUgMC4xICAgIDFlLTEgICAtPiAwLjEKK2RxcXVhMDA4IHF1YW50aXplIDAuMSAgICAxZS0yICAgLT4gMC4xMAorZHFxdWEwMDkgcXVhbnRpemUgMC4xICAgIDFlLTMgICAtPiAwLjEwMAorZHFxdWEwMTAgcXVhbnRpemUgMC45ICAgIDFlKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEwMTEgcXVhbnRpemUgMC45ICAgIDFlKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEwMTIgcXVhbnRpemUgMC45ICAgIDFlKzAgICAtPiAxIEluZXhhY3QgUm91bmRlZAorZHFxdWEwMTMgcXVhbnRpemUgMC45ICAgIDFlLTEgICAtPiAwLjkKK2RxcXVhMDE0IHF1YW50aXplIDAuOSAgICAxZS0yICAgLT4gMC45MAorZHFxdWEwMTUgcXVhbnRpemUgMC45ICAgIDFlLTMgICAtPiAwLjkwMAorLS0gbmVnYXRpdmVzCitkcXF1YTAyMSBxdWFudGl6ZSAtMCAgICAgIDFlMCAgIC0+IC0wCitkcXF1YTAyMiBxdWFudGl6ZSAtMSAgICAgIDFlMCAgIC0+IC0xCitkcXF1YTAyMyBxdWFudGl6ZSAtMC4xICAgMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEwMjUgcXVhbnRpemUgLTAuMSAgIDFlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDI2IHF1YW50aXplIC0wLjEgICAgMWUwICAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTAyNyBxdWFudGl6ZSAtMC4xICAgMWUtMSAgIC0+IC0wLjEKK2RxcXVhMDI4IHF1YW50aXplIC0wLjEgICAxZS0yICAgLT4gLTAuMTAKK2RxcXVhMDI5IHF1YW50aXplIC0wLjEgICAxZS0zICAgLT4gLTAuMTAwCitkcXF1YTAzMCBxdWFudGl6ZSAtMC45ICAgMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEwMzEgcXVhbnRpemUgLTAuOSAgIDFlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDMyIHF1YW50aXplIC0wLjkgICAxZSswICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTAzMyBxdWFudGl6ZSAtMC45ICAgMWUtMSAgIC0+IC0wLjkKK2RxcXVhMDM0IHF1YW50aXplIC0wLjkgICAxZS0yICAgLT4gLTAuOTAKK2RxcXVhMDM1IHF1YW50aXplIC0wLjkgICAxZS0zICAgLT4gLTAuOTAwCitkcXF1YTAzNiBxdWFudGl6ZSAtMC41ICAgMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEwMzcgcXVhbnRpemUgLTAuNSAgIDFlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDM4IHF1YW50aXplIC0wLjUgICAxZSswICAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTAzOSBxdWFudGl6ZSAtMC41ICAgMWUtMSAgIC0+IC0wLjUKK2RxcXVhMDQwIHF1YW50aXplIC0wLjUgICAxZS0yICAgLT4gLTAuNTAKK2RxcXVhMDQxIHF1YW50aXplIC0wLjUgICAxZS0zICAgLT4gLTAuNTAwCitkcXF1YTA0MiBxdWFudGl6ZSAtMC45ICAgMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEwNDMgcXVhbnRpemUgLTAuOSAgIDFlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDQ0IHF1YW50aXplIC0wLjkgICAxZSswICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA0NSBxdWFudGl6ZSAtMC45ICAgMWUtMSAgIC0+IC0wLjkKK2RxcXVhMDQ2IHF1YW50aXplIC0wLjkgICAxZS0yICAgLT4gLTAuOTAKK2RxcXVhMDQ3IHF1YW50aXplIC0wLjkgICAxZS0zICAgLT4gLTAuOTAwCisKKy0tIGV4YW1wbGVzIGZyb20gU3BlY2lmaWNhdGlvbgorZHFxdWEwNjAgcXVhbnRpemUgMi4xNyAgIDAuMDAxICAtPiAyLjE3MAorZHFxdWEwNjEgcXVhbnRpemUgMi4xNyAgIDAuMDEgICAtPiAyLjE3CitkcXF1YTA2MiBxdWFudGl6ZSAyLjE3ICAgMC4xICAgIC0+IDIuMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDYzIHF1YW50aXplIDIuMTcgICAxZSswICAgLT4gMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDY0IHF1YW50aXplIDIuMTcgICAxZSsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDY1IHF1YW50aXplIC1JbmYgICAgSW5mICAgLT4gLUluZmluaXR5CitkcXF1YTA2NiBxdWFudGl6ZSAyICAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWEwNjcgcXVhbnRpemUgLTAuMSAgICAxICAgICAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDY4IHF1YW50aXplIC0wICAgICAgMWUrNSAgICAgLT4gLTBFKzUKK2RxcXVhMDY5IHF1YW50aXplICsxMjM0NTEyMzQ1Njc4OTk4NzY1NDMyMTY3ODkwMTIzNDUuNiAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWEwNzAgcXVhbnRpemUgLTk4NzY1MTIzNDU2Nzg5OTg3NjU0MzIxNDMzNTIzNjQ1MC42IDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTA3MSBxdWFudGl6ZSAyMTcgICAgMWUtMSAgIC0+IDIxNy4wCitkcXF1YTA3MiBxdWFudGl6ZSAyMTcgICAgMWUrMCAgIC0+IDIxNworZHFxdWEwNzMgcXVhbnRpemUgMjE3ICAgIDFlKzEgICAtPiAyLjJFKzIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA3NCBxdWFudGl6ZSAyMTcgICAgMWUrMiAgIC0+IDJFKzIgSW5leGFjdCBSb3VuZGVkCisKKy0tIGdlbmVyYWwgdGVzdHMgLi4KK2RxcXVhMDg5IHF1YW50aXplIDEyICAgICAxZSs0ICAgLT4gMEUrNCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDkwIHF1YW50aXplIDEyICAgICAxZSszICAgLT4gMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDkxIHF1YW50aXplIDEyICAgICAxZSsyICAgLT4gMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDkyIHF1YW50aXplIDEyICAgICAxZSsxICAgLT4gMUUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDkzIHF1YW50aXplIDEuMjM0NSAxZS0yICAgLT4gMS4yMyBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDk0IHF1YW50aXplIDEuMjM1NSAxZS0yICAgLT4gMS4yNCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDk1IHF1YW50aXplIDEuMjM0NSAxZS02ICAgLT4gMS4yMzQ1MDAKK2RxcXVhMDk2IHF1YW50aXplIDkuOTk5OSAxZS0yICAgLT4gMTAuMDAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA5NyBxdWFudGl6ZSAwLjAwMDEgMWUtMiAgIC0+IDAuMDAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA5OCBxdWFudGl6ZSAwLjAwMSAgMWUtMiAgIC0+IDAuMDAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA5OSBxdWFudGl6ZSAwLjAwOSAgMWUtMiAgIC0+IDAuMDEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEwMCBxdWFudGl6ZSA5MiAgICAgMWUrMiAgIC0+IDFFKzIgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMTAxIHF1YW50aXplIC0xICAgICAgMWUwICAgLT4gIC0xCitkcXF1YTEwMiBxdWFudGl6ZSAtMSAgICAgMWUtMSAgIC0+ICAtMS4wCitkcXF1YTEwMyBxdWFudGl6ZSAtMSAgICAgMWUtMiAgIC0+ICAtMS4wMAorZHFxdWExMDQgcXVhbnRpemUgIDAgICAgICAxZTAgICAtPiAgMAorZHFxdWExMDUgcXVhbnRpemUgIDAgICAgIDFlLTEgICAtPiAgMC4wCitkcXF1YTEwNiBxdWFudGl6ZSAgMCAgICAgMWUtMiAgIC0+ICAwLjAwCitkcXF1YTEwNyBxdWFudGl6ZSAgMC4wMCAgIDFlMCAgIC0+ICAwCitkcXF1YTEwOCBxdWFudGl6ZSAgMCAgICAgMWUrMSAgIC0+ICAwRSsxCitkcXF1YTEwOSBxdWFudGl6ZSAgMCAgICAgMWUrMiAgIC0+ICAwRSsyCitkcXF1YTExMCBxdWFudGl6ZSArMSAgICAgIDFlMCAgIC0+ICAxCitkcXF1YTExMSBxdWFudGl6ZSArMSAgICAgMWUtMSAgIC0+ICAxLjAKK2RxcXVhMTEyIHF1YW50aXplICsxICAgICAxZS0yICAgLT4gIDEuMDAKKworZHFxdWExMjAgcXVhbnRpemUgICAxLjA0ICAxZS0zIC0+ICAxLjA0MAorZHFxdWExMjEgcXVhbnRpemUgICAxLjA0ICAxZS0yIC0+ICAxLjA0CitkcXF1YTEyMiBxdWFudGl6ZSAgIDEuMDQgIDFlLTEgLT4gIDEuMCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTIzIHF1YW50aXplICAgMS4wNCAgIDFlMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTI0IHF1YW50aXplICAgMS4wNSAgMWUtMyAtPiAgMS4wNTAKK2RxcXVhMTI1IHF1YW50aXplICAgMS4wNSAgMWUtMiAtPiAgMS4wNQorZHFxdWExMjYgcXVhbnRpemUgICAxLjA1ICAxZS0xIC0+ICAxLjAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEzMSBxdWFudGl6ZSAgIDEuMDUgICAxZTAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEzMiBxdWFudGl6ZSAgIDEuMDYgIDFlLTMgLT4gIDEuMDYwCitkcXF1YTEzMyBxdWFudGl6ZSAgIDEuMDYgIDFlLTIgLT4gIDEuMDYKK2RxcXVhMTM0IHF1YW50aXplICAgMS4wNiAgMWUtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorZHFxdWExMzUgcXVhbnRpemUgICAxLjA2ICAgMWUwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTE0MCBxdWFudGl6ZSAgIC0xMCAgICAxZS0yICAtPiAgLTEwLjAwCitkcXF1YTE0MSBxdWFudGl6ZSAgICsxICAgICAxZS0yICAtPiAgMS4wMAorZHFxdWExNDIgcXVhbnRpemUgICArMTAgICAgMWUtMiAgLT4gIDEwLjAwCitkcXF1YTE0MyBxdWFudGl6ZSAgIDFFKzM3ICAxZS0yICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTE0NCBxdWFudGl6ZSAgIDFFLTM3ICAxZS0yICAtPiAgMC4wMCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTQ1IHF1YW50aXplICAgMUUtMyAgIDFlLTIgIC0+ICAwLjAwIEluZXhhY3QgUm91bmRlZAorZHFxdWExNDYgcXVhbnRpemUgICAxRS0yICAgMWUtMiAgLT4gIDAuMDEKK2RxcXVhMTQ3IHF1YW50aXplICAgMUUtMSAgIDFlLTIgIC0+ICAwLjEwCitkcXF1YTE0OCBxdWFudGl6ZSAgIDBFLTM3ICAxZS0yICAtPiAgMC4wMAorCitkcXF1YTE1MCBxdWFudGl6ZSAgIDEuMDYwMCAxZS01IC0+ICAxLjA2MDAwCitkcXF1YTE1MSBxdWFudGl6ZSAgIDEuMDYwMCAxZS00IC0+ICAxLjA2MDAKK2RxcXVhMTUyIHF1YW50aXplICAgMS4wNjAwIDFlLTMgLT4gIDEuMDYwIFJvdW5kZWQKK2RxcXVhMTUzIHF1YW50aXplICAgMS4wNjAwIDFlLTIgLT4gIDEuMDYgUm91bmRlZAorZHFxdWExNTQgcXVhbnRpemUgICAxLjA2MDAgMWUtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorZHFxdWExNTUgcXVhbnRpemUgICAxLjA2MDAgIDFlMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKKworLS0gYSBjb3VwbGUgd2hlcmUgcm91bmRpbmcgd2FzIGRpZmZlcmVudCBpbiBiYXNlIHRlc3RzCityb3VuZGluZzogICAgaGFsZl91cAorZHFxdWExNTcgcXVhbnRpemUgLTAuNSAgIDFlKzAgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTU4IHF1YW50aXplICAgMS4wNSAgMWUtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorZHFxdWExNTkgcXVhbnRpemUgICAxLjA2ICAgMWUwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBiYXNlIHRlc3RzIHdpdGggbm9uLTEgY29lZmZpY2llbnRzCitkcXF1YTE2MSBxdWFudGl6ZSAwICAgICAgLTllMCAgIC0+IDAKK2RxcXVhMTYyIHF1YW50aXplIDEgICAgICAtN2UwICAgLT4gMQorZHFxdWExNjMgcXVhbnRpemUgMC4xICAgLTFlKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWExNjUgcXVhbnRpemUgMC4xICAgIDBlKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWExNjYgcXVhbnRpemUgMC4xICAgICAyZTAgICAtPiAwIEluZXhhY3QgUm91bmRlZAorZHFxdWExNjcgcXVhbnRpemUgMC4xICAgIDNlLTEgICAtPiAwLjEKK2RxcXVhMTY4IHF1YW50aXplIDAuMSAgIDQ0ZS0yICAgLT4gMC4xMAorZHFxdWExNjkgcXVhbnRpemUgMC4xICA1NTVlLTMgICAtPiAwLjEwMAorZHFxdWExNzAgcXVhbnRpemUgMC45IDY2NjZlKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWExNzEgcXVhbnRpemUgMC45IC03NzdlKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWExNzIgcXVhbnRpemUgMC45ICAtODhlKzAgICAtPiAxIEluZXhhY3QgUm91bmRlZAorZHFxdWExNzMgcXVhbnRpemUgMC45ICAgLTllLTEgICAtPiAwLjkKK2RxcXVhMTc0IHF1YW50aXplIDAuOSAgICAwZS0yICAgLT4gMC45MAorZHFxdWExNzUgcXVhbnRpemUgMC45ICAxLjFlLTMgICAtPiAwLjkwMDAKKy0tIG5lZ2F0aXZlcworZHFxdWExODEgcXVhbnRpemUgLTAgICAgMS4xZTAgICAtPiAtMC4wCitkcXF1YTE4MiBxdWFudGl6ZSAtMSAgICAgLTFlMCAgIC0+IC0xCitkcXF1YTE4MyBxdWFudGl6ZSAtMC4xICAxMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWExODUgcXVhbnRpemUgLTAuMSAxMTFlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTg2IHF1YW50aXplIC0wLjEgICA3MWUwICAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE4NyBxdWFudGl6ZSAtMC4xIC05MWUtMSAgIC0+IC0wLjEKK2RxcXVhMTg4IHF1YW50aXplIC0wLjEgLS4xZS0yICAgLT4gLTAuMTAwCitkcXF1YTE4OSBxdWFudGl6ZSAtMC4xICAtMWUtMyAgIC0+IC0wLjEwMAorZHFxdWExOTAgcXVhbnRpemUgLTAuOSAgIDBlKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTkxIHF1YW50aXplIC0wLjkgIC0wZSsxICAgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE5MiBxdWFudGl6ZSAtMC45IC0xMGUrMCAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAorZHFxdWExOTMgcXVhbnRpemUgLTAuOSAxMDBlLTEgICAtPiAtMC45CitkcXF1YTE5NCBxdWFudGl6ZSAtMC45IDk5OWUtMiAgIC0+IC0wLjkwCisKKy0tICt2ZSBleHBvbmVudHMgLi4KK2RxcXVhMjAxIHF1YW50aXplICAgLTEgICAxZSswIC0+ICAtMQorZHFxdWEyMDIgcXVhbnRpemUgICAtMSAgIDFlKzEgLT4gIC0wRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMDMgcXVhbnRpemUgICAtMSAgIDFlKzIgLT4gIC0wRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMDQgcXVhbnRpemUgICAgMCAgIDFlKzAgLT4gIDAKK2RxcXVhMjA1IHF1YW50aXplICAgIDAgICAxZSsxIC0+ICAwRSsxCitkcXF1YTIwNiBxdWFudGl6ZSAgICAwICAgMWUrMiAtPiAgMEUrMgorZHFxdWEyMDcgcXVhbnRpemUgICArMSAgIDFlKzAgLT4gIDEKK2RxcXVhMjA4IHF1YW50aXplICAgKzEgICAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMDkgcXVhbnRpemUgICArMSAgIDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMjIwIHF1YW50aXplICAgMS4wNCAxZSszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMjEgcXVhbnRpemUgICAxLjA0IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIyMiBxdWFudGl6ZSAgIDEuMDQgMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjIzIHF1YW50aXplICAgMS4wNCAxZSswIC0+ICAxIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMjQgcXVhbnRpemUgICAxLjA1IDFlKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIyNSBxdWFudGl6ZSAgIDEuMDUgMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjI2IHF1YW50aXplICAgMS4wNSAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMjcgcXVhbnRpemUgICAxLjA1IDFlKzAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIyOCBxdWFudGl6ZSAgIDEuMDUgMWUrMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjI5IHF1YW50aXplICAgMS4wNSAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMzAgcXVhbnRpemUgICAxLjA1IDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIzMSBxdWFudGl6ZSAgIDEuMDUgMWUrMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjMyIHF1YW50aXplICAgMS4wNiAxZSszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMzMgcXVhbnRpemUgICAxLjA2IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIzNCBxdWFudGl6ZSAgIDEuMDYgMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjM1IHF1YW50aXplICAgMS4wNiAxZSswIC0+ICAxIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTI0MCBxdWFudGl6ZSAgIC0xMCAgIDFlKzEgIC0+ICAtMUUrMSBSb3VuZGVkCitkcXF1YTI0MSBxdWFudGl6ZSAgICsxICAgIDFlKzEgIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEyNDIgcXVhbnRpemUgICArMTAgICAxZSsxICAtPiAgMUUrMSBSb3VuZGVkCitkcXF1YTI0MyBxdWFudGl6ZSAgIDFFKzEgIDFlKzEgIC0+ICAxRSsxICAgICAgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK2RxcXVhMjQ0IHF1YW50aXplICAgMUUrMiAgMWUrMSAgLT4gIDEuMEUrMiAgICAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorZHFxdWEyNDUgcXVhbnRpemUgICAxRSszICAxZSsxICAtPiAgMS4wMEUrMyAgICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitkcXF1YTI0NiBxdWFudGl6ZSAgIDFFKzQgIDFlKzEgIC0+ICAxLjAwMEUrNCAgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK2RxcXVhMjQ3IHF1YW50aXplICAgMUUrNSAgMWUrMSAgLT4gIDEuMDAwMEUrNSAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorZHFxdWEyNDggcXVhbnRpemUgICAxRSs2ICAxZSsxICAtPiAgMS4wMDAwMEUrNiAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitkcXF1YTI0OSBxdWFudGl6ZSAgIDFFKzcgIDFlKzEgIC0+ICAxLjAwMDAwMEUrNyAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK2RxcXVhMjUwIHF1YW50aXplICAgMUUrOCAgMWUrMSAgLT4gIDEuMDAwMDAwMEUrOCAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorZHFxdWEyNTEgcXVhbnRpemUgICAxRSs5ICAxZSsxICAtPiAgMS4wMDAwMDAwMEUrOSAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCistLSBuZXh0IG9uZSB0cmllcyB0byBhZGQgOSB6ZXJvcworZHFxdWEyNTIgcXVhbnRpemUgICAxRSszNyAxZSsxICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTI1MyBxdWFudGl6ZSAgIDFFLTM3IDFlKzEgIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEyNTQgcXVhbnRpemUgICAxRS0yICAxZSsxICAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjU1IHF1YW50aXplICAgMEUtMzcgMWUrMSAgLT4gIDBFKzEKK2RxcXVhMjU2IHF1YW50aXplICAtMEUtMzcgMWUrMSAgLT4gLTBFKzEKK2RxcXVhMjU3IHF1YW50aXplICAtMEUtMSAgMWUrMSAgLT4gLTBFKzEKK2RxcXVhMjU4IHF1YW50aXplICAtMCAgICAgMWUrMSAgLT4gLTBFKzEKK2RxcXVhMjU5IHF1YW50aXplICAtMEUrMSAgMWUrMSAgLT4gLTBFKzEKKworZHFxdWEyNjAgcXVhbnRpemUgICAtMTAgICAxZSsyICAtPiAgLTBFKzIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTI2MSBxdWFudGl6ZSAgICsxICAgIDFlKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEyNjIgcXVhbnRpemUgICArMTAgICAxZSsyICAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjYzIHF1YW50aXplICAgMUUrMSAgMWUrMiAgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTI2NCBxdWFudGl6ZSAgIDFFKzIgIDFlKzIgIC0+ICAxRSsyCitkcXF1YTI2NSBxdWFudGl6ZSAgIDFFKzMgIDFlKzIgIC0+ICAxLjBFKzMKK2RxcXVhMjY2IHF1YW50aXplICAgMUUrNCAgMWUrMiAgLT4gIDEuMDBFKzQKK2RxcXVhMjY3IHF1YW50aXplICAgMUUrNSAgMWUrMiAgLT4gIDEuMDAwRSs1CitkcXF1YTI2OCBxdWFudGl6ZSAgIDFFKzYgIDFlKzIgIC0+ICAxLjAwMDBFKzYKK2RxcXVhMjY5IHF1YW50aXplICAgMUUrNyAgMWUrMiAgLT4gIDEuMDAwMDBFKzcKK2RxcXVhMjcwIHF1YW50aXplICAgMUUrOCAgMWUrMiAgLT4gIDEuMDAwMDAwRSs4CitkcXF1YTI3MSBxdWFudGl6ZSAgIDFFKzkgIDFlKzIgIC0+ICAxLjAwMDAwMDBFKzkKK2RxcXVhMjcyIHF1YW50aXplICAgMUUrMTAgMWUrMiAgLT4gIDEuMDAwMDAwMDBFKzEwCitkcXF1YTI3MyBxdWFudGl6ZSAgIDFFLTEwIDFlKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEyNzQgcXVhbnRpemUgICAxRS0yICAxZSsyICAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjc1IHF1YW50aXplICAgMEUtMTAgMWUrMiAgLT4gIDBFKzIKKworZHFxdWEyODAgcXVhbnRpemUgICAtMTAgICAxZSszICAtPiAgLTBFKzMgSW5leGFjdCBSb3VuZGVkCitkcXF1YTI4MSBxdWFudGl6ZSAgICsxICAgIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZHFxdWEyODIgcXVhbnRpemUgICArMTAgICAxZSszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjgzIHF1YW50aXplICAgMUUrMSAgMWUrMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkcXF1YTI4NCBxdWFudGl6ZSAgIDFFKzIgIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZHFxdWEyODUgcXVhbnRpemUgICAxRSszICAxZSszICAtPiAgMUUrMworZHFxdWEyODYgcXVhbnRpemUgICAxRSs0ICAxZSszICAtPiAgMS4wRSs0CitkcXF1YTI4NyBxdWFudGl6ZSAgIDFFKzUgIDFlKzMgIC0+ICAxLjAwRSs1CitkcXF1YTI4OCBxdWFudGl6ZSAgIDFFKzYgIDFlKzMgIC0+ICAxLjAwMEUrNgorZHFxdWEyODkgcXVhbnRpemUgICAxRSs3ICAxZSszICAtPiAgMS4wMDAwRSs3CitkcXF1YTI5MCBxdWFudGl6ZSAgIDFFKzggIDFlKzMgIC0+ICAxLjAwMDAwRSs4CitkcXF1YTI5MSBxdWFudGl6ZSAgIDFFKzkgIDFlKzMgIC0+ICAxLjAwMDAwMEUrOQorZHFxdWEyOTIgcXVhbnRpemUgICAxRSsxMCAxZSszICAtPiAgMS4wMDAwMDAwRSsxMAorZHFxdWEyOTMgcXVhbnRpemUgICAxRS0xMCAxZSszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjk0IHF1YW50aXplICAgMUUtMiAgMWUrMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkcXF1YTI5NSBxdWFudGl6ZSAgIDBFLTEwIDFlKzMgIC0+ICAwRSszCisKKy0tIHJvdW5kIHVwIGZyb20gYmVsb3cgW3NpZ24gd3JvbmcgaW4gSklUIGNvbXBpbGVyIG9uY2VdCitkcXF1YTMwMCBxdWFudGl6ZSAgIDAuMDA3OCAxZS01IC0+ICAwLjAwNzgwCitkcXF1YTMwMSBxdWFudGl6ZSAgIDAuMDA3OCAxZS00IC0+ICAwLjAwNzgKK2RxcXVhMzAyIHF1YW50aXplICAgMC4wMDc4IDFlLTMgLT4gIDAuMDA4IEluZXhhY3QgUm91bmRlZAorZHFxdWEzMDMgcXVhbnRpemUgICAwLjAwNzggMWUtMiAtPiAgMC4wMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzA0IHF1YW50aXplICAgMC4wMDc4IDFlLTEgLT4gIDAuMCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzA1IHF1YW50aXplICAgMC4wMDc4ICAxZTAgLT4gIDAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTMwNiBxdWFudGl6ZSAgIDAuMDA3OCAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEzMDcgcXVhbnRpemUgICAwLjAwNzggMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworZHFxdWEzMTAgcXVhbnRpemUgIC0wLjAwNzggMWUtNSAtPiAtMC4wMDc4MAorZHFxdWEzMTEgcXVhbnRpemUgIC0wLjAwNzggMWUtNCAtPiAtMC4wMDc4CitkcXF1YTMxMiBxdWFudGl6ZSAgLTAuMDA3OCAxZS0zIC0+IC0wLjAwOCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzEzIHF1YW50aXplICAtMC4wMDc4IDFlLTIgLT4gLTAuMDEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTMxNCBxdWFudGl6ZSAgLTAuMDA3OCAxZS0xIC0+IC0wLjAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTMxNSBxdWFudGl6ZSAgLTAuMDA3OCAgMWUwIC0+IC0wIEluZXhhY3QgUm91bmRlZAorZHFxdWEzMTYgcXVhbnRpemUgIC0wLjAwNzggMWUrMSAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzE3IHF1YW50aXplICAtMC4wMDc4IDFlKzIgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMzIwIHF1YW50aXplICAgMC4wNzggMWUtNSAtPiAgMC4wNzgwMAorZHFxdWEzMjEgcXVhbnRpemUgICAwLjA3OCAxZS00IC0+ICAwLjA3ODAKK2RxcXVhMzIyIHF1YW50aXplICAgMC4wNzggMWUtMyAtPiAgMC4wNzgKK2RxcXVhMzIzIHF1YW50aXplICAgMC4wNzggMWUtMiAtPiAgMC4wOCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzI0IHF1YW50aXplICAgMC4wNzggMWUtMSAtPiAgMC4xIEluZXhhY3QgUm91bmRlZAorZHFxdWEzMjUgcXVhbnRpemUgICAwLjA3OCAgMWUwIC0+ICAwIEluZXhhY3QgUm91bmRlZAorZHFxdWEzMjYgcXVhbnRpemUgICAwLjA3OCAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEzMjcgcXVhbnRpemUgICAwLjA3OCAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTMzMCBxdWFudGl6ZSAgLTAuMDc4IDFlLTUgLT4gLTAuMDc4MDAKK2RxcXVhMzMxIHF1YW50aXplICAtMC4wNzggMWUtNCAtPiAtMC4wNzgwCitkcXF1YTMzMiBxdWFudGl6ZSAgLTAuMDc4IDFlLTMgLT4gLTAuMDc4CitkcXF1YTMzMyBxdWFudGl6ZSAgLTAuMDc4IDFlLTIgLT4gLTAuMDggSW5leGFjdCBSb3VuZGVkCitkcXF1YTMzNCBxdWFudGl6ZSAgLTAuMDc4IDFlLTEgLT4gLTAuMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzM1IHF1YW50aXplICAtMC4wNzggIDFlMCAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzM2IHF1YW50aXplICAtMC4wNzggMWUrMSAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzM3IHF1YW50aXplICAtMC4wNzggMWUrMiAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworZHFxdWEzNDAgcXVhbnRpemUgICAwLjc4IDFlLTUgLT4gIDAuNzgwMDAKK2RxcXVhMzQxIHF1YW50aXplICAgMC43OCAxZS00IC0+ICAwLjc4MDAKK2RxcXVhMzQyIHF1YW50aXplICAgMC43OCAxZS0zIC0+ICAwLjc4MAorZHFxdWEzNDMgcXVhbnRpemUgICAwLjc4IDFlLTIgLT4gIDAuNzgKK2RxcXVhMzQ0IHF1YW50aXplICAgMC43OCAxZS0xIC0+ICAwLjggSW5leGFjdCBSb3VuZGVkCitkcXF1YTM0NSBxdWFudGl6ZSAgIDAuNzggIDFlMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzQ2IHF1YW50aXplICAgMC43OCAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEzNDcgcXVhbnRpemUgICAwLjc4IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMzUwIHF1YW50aXplICAtMC43OCAxZS01IC0+IC0wLjc4MDAwCitkcXF1YTM1MSBxdWFudGl6ZSAgLTAuNzggMWUtNCAtPiAtMC43ODAwCitkcXF1YTM1MiBxdWFudGl6ZSAgLTAuNzggMWUtMyAtPiAtMC43ODAKK2RxcXVhMzUzIHF1YW50aXplICAtMC43OCAxZS0yIC0+IC0wLjc4CitkcXF1YTM1NCBxdWFudGl6ZSAgLTAuNzggMWUtMSAtPiAtMC44IEluZXhhY3QgUm91bmRlZAorZHFxdWEzNTUgcXVhbnRpemUgIC0wLjc4ICAxZTAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTM1NiBxdWFudGl6ZSAgLTAuNzggMWUrMSAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzU3IHF1YW50aXplICAtMC43OCAxZSsyIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTM2MCBxdWFudGl6ZSAgIDcuOCAxZS01IC0+ICA3LjgwMDAwCitkcXF1YTM2MSBxdWFudGl6ZSAgIDcuOCAxZS00IC0+ICA3LjgwMDAKK2RxcXVhMzYyIHF1YW50aXplICAgNy44IDFlLTMgLT4gIDcuODAwCitkcXF1YTM2MyBxdWFudGl6ZSAgIDcuOCAxZS0yIC0+ICA3LjgwCitkcXF1YTM2NCBxdWFudGl6ZSAgIDcuOCAxZS0xIC0+ICA3LjgKK2RxcXVhMzY1IHF1YW50aXplICAgNy44ICAxZTAgLT4gIDggSW5leGFjdCBSb3VuZGVkCitkcXF1YTM2NiBxdWFudGl6ZSAgIDcuOCAxZSsxIC0+ICAxRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEzNjcgcXVhbnRpemUgICA3LjggMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzY4IHF1YW50aXplICAgNy44IDFlKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMzcwIHF1YW50aXplICAtNy44IDFlLTUgLT4gLTcuODAwMDAKK2RxcXVhMzcxIHF1YW50aXplICAtNy44IDFlLTQgLT4gLTcuODAwMAorZHFxdWEzNzIgcXVhbnRpemUgIC03LjggMWUtMyAtPiAtNy44MDAKK2RxcXVhMzczIHF1YW50aXplICAtNy44IDFlLTIgLT4gLTcuODAKK2RxcXVhMzc0IHF1YW50aXplICAtNy44IDFlLTEgLT4gLTcuOAorZHFxdWEzNzUgcXVhbnRpemUgIC03LjggIDFlMCAtPiAtOCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzc2IHF1YW50aXplICAtNy44IDFlKzEgLT4gLTFFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTM3NyBxdWFudGl6ZSAgLTcuOCAxZSsyIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEzNzggcXVhbnRpemUgIC03LjggMWUrMyAtPiAtMEUrMyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBpbmRpdmlkdWFscworZHFxdWEzODAgcXVhbnRpemUgICAxMTIyMzM0NDU1NjY3Nzg4OTkxMjM0NTY3MzUyMzY0LjUwNiAxZS0yIC0+IDExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1NjczNTIzNjQuNTEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTM4MSBxdWFudGl6ZSAgIDExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1NjczNTIzNjQ1LjA2IDFlLTIgLT4gMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2NzM1MjM2NDUuMDYKK2RxcXVhMzgyIHF1YW50aXplICAgMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2NzM1MjM2NDUwLjYgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhMzgzIHF1YW50aXplICAgMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2NzM1MjM2NDUwNiAgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhMzg0IHF1YW50aXplICAtMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2NzM1MjM2NC41MDYgMWUtMiAtPiAtMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2NzM1MjM2NC41MSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzg1IHF1YW50aXplICAtMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2NzM1MjM2NDUuMDYgMWUtMiAtPiAtMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2NzM1MjM2NDUuMDYKK2RxcXVhMzg2IHF1YW50aXplICAtMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2NzM1MjM2NDUwLjYgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhMzg3IHF1YW50aXplICAtMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2NzM1MjM2NDUwNiAgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcm91bmRpbmc6IGRvd24KK2RxcXVhMzg5IHF1YW50aXplICAgMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2NzM1MjM2NDUwLjYgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdW5kaW5nOiBoYWxmX3VwCisKKy0tIGFuZCBhIGZldyBtb3JlIGZyb20gZS1tYWlsIGRpc2N1c3Npb25zCitkcXF1YTM5MSBxdWFudGl6ZSAgMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2Nzg5MTIuMzQ1NjcgIDFlLTMgLT4gMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2Nzg5MTIuMzQ2ICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTM5MiBxdWFudGl6ZSAgMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2Nzg5MTIzLjQ1NjcgIDFlLTMgLT4gMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2Nzg5MTIzLjQ1NyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTM5MyBxdWFudGl6ZSAgMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2Nzg5MTIzNDU2Ny4gIDFlLTMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHNvbWUgOTk5OSByb3VuZC11cCBjYXNlcworZHFxdWE0MDAgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgMWUtNSAgLT4gIDkuOTk5MDAKK2RxcXVhNDAxIHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTQgIC0+ICA5Ljk5OTAKK2RxcXVhNDAyIHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTMgIC0+ICA5Ljk5OQorZHFxdWE0MDMgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgMWUtMiAgLT4gMTAuMDAgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MDQgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgMWUtMSAgLT4gMTAuMCAgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MDUgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgIDFlMCAgLT4gMTAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MDYgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgIDFlMSAgLT4gMUUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MDcgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgIDFlMiAgLT4gMEUrMiAgICAgIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTQxMCBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAxZS01ICAtPiAgMC45OTkwMAorZHFxdWE0MTEgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtNCAgLT4gIDAuOTk5MAorZHFxdWE0MTIgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtMyAgLT4gIDAuOTk5CitkcXF1YTQxMyBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAxZS0yICAtPiAgMS4wMCAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQxNCBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAxZS0xICAtPiAgMS4wICAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQxNSBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAgMWUwICAtPiAgMSAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQxNiBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAgMWUxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhNDIwIHF1YW50aXplICAgMC4wOTk5ICAgICAgIDFlLTUgIC0+ICAwLjA5OTkwCitkcXF1YTQyMSBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS00ICAtPiAgMC4wOTk5CitkcXF1YTQyMiBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS0zICAtPiAgMC4xMDAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQyMyBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS0yICAtPiAgMC4xMCAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQyNCBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS0xICAtPiAgMC4xICAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQyNSBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAgMWUwICAtPiAgMCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQyNiBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAgMWUxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhNDMwIHF1YW50aXplICAgMC4wMDk5OSAgICAgIDFlLTUgIC0+ICAwLjAwOTk5CitkcXF1YTQzMSBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAxZS00ICAtPiAgMC4wMTAwICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQzMiBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAxZS0zICAtPiAgMC4wMTAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQzMyBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAxZS0yICAtPiAgMC4wMSAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQzNCBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAxZS0xICAtPiAgMC4wICAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQzNSBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAgMWUwICAtPiAgMCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQzNiBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAgMWUxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhNDQwIHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTUgIC0+ICAwLjAwMTAwICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDQxIHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTQgIC0+ICAwLjAwMTAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDQyIHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTMgIC0+ICAwLjAwMSAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDQzIHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTIgIC0+ICAwLjAwICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDQ0IHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTEgIC0+ICAwLjAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDQ1IHF1YW50aXplICAgMC4wMDA5OTkgICAgICAxZTAgIC0+ICAwICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDQ2IHF1YW50aXplICAgMC4wMDA5OTkgICAgICAxZTEgIC0+IDBFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKKworZHFxdWExMDAxIHF1YW50aXplICAwLjAwMCAgICAgICAgMC4wMDEgLT4gIDAuMDAwCitkcXF1YTEwMDIgcXVhbnRpemUgIDAuMDAxICAgICAgICAwLjAwMSAtPiAgMC4wMDEKK2RxcXVhMTAwMyBxdWFudGl6ZSAgMC4wMDEyICAgICAgIDAuMDAxIC0+ICAwLjAwMSAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEwMDQgcXVhbnRpemUgIDAuMDAxOCAgICAgICAwLjAwMSAtPiAgMC4wMDIgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMDA1IHF1YW50aXplICAwLjUwMSAgICAgICAgMC4wMDEgLT4gIDAuNTAxCitkcXF1YTEwMDYgcXVhbnRpemUgIDAuNTAxMiAgICAgICAwLjAwMSAtPiAgMC41MDEgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMDA3IHF1YW50aXplICAwLjUwMTggICAgICAgMC4wMDEgLT4gIDAuNTAyICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTAwOCBxdWFudGl6ZSAgMC45OTkgICAgICAgIDAuMDAxIC0+ICAwLjk5OQorCitkcXF1YTQ4MSBxdWFudGl6ZSAxMjM0NTY3ODAwMCAxZSszIC0+IDEuMjM0NTY3OEUrMTAgUm91bmRlZAorZHFxdWE0ODIgcXVhbnRpemUgMTIzNDU2NzgwMCAgMWUrMSAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK2RxcXVhNDgzIHF1YW50aXplIDEyMzQ1Njc4OTAgIDFlKzEgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCitkcXF1YTQ4NCBxdWFudGl6ZSAxMjM0NTY3ODkxICAxZSsxIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQ4NSBxdWFudGl6ZSAxMjM0NTY3ODkwMSAxZSsyIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorZHFxdWE0ODYgcXVhbnRpemUgMTIzNDU2Nzg5NiAgMWUrMSAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorLS0gYSBwb3RlbnRpYWwgZG91YmxlLXJvdW5kCitkcXF1YTQ4NyBxdWFudGl6ZSAxMjM0Ljk4NzY0MyAxZS00IC0+IDEyMzQuOTg3NiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDg4IHF1YW50aXplIDEyMzQuOTg3NjQ3IDFlLTQgLT4gMTIzNC45ODc2IEluZXhhY3QgUm91bmRlZAorCitkcXF1YTQ5MSBxdWFudGl6ZSAxMjM0NTY3ODAwMCAxZSszIC0+IDEuMjM0NTY3OEUrMTAgUm91bmRlZAorZHFxdWE0OTIgcXVhbnRpemUgMTIzNDU2NzgwMCAgMWUrMSAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK2RxcXVhNDkzIHF1YW50aXplIDEyMzQ1Njc4OTAgIDFlKzEgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCitkcXF1YTQ5NCBxdWFudGl6ZSAxMjM0NTY3ODkxICAxZSsxIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQ5NSBxdWFudGl6ZSAxMjM0NTY3ODkwMSAxZSsyIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorZHFxdWE0OTYgcXVhbnRpemUgMTIzNDU2Nzg5NiAgMWUrMSAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorZHFxdWE0OTcgcXVhbnRpemUgMTIzNC45ODc2NDMgMWUtNCAtPiAxMjM0Ljk4NzYgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQ5OCBxdWFudGl6ZSAxMjM0Ljk4NzY0NyAxZS00IC0+IDEyMzQuOTg3NiBJbmV4YWN0IFJvdW5kZWQKKworLS0gWmVyb3MKK2RxcXVhNTAwIHF1YW50aXplICAgMCAgICAgMWUxIC0+ICAwRSsxCitkcXF1YTUwMSBxdWFudGl6ZSAgIDAgICAgIDFlMCAtPiAgMAorZHFxdWE1MDIgcXVhbnRpemUgICAwICAgIDFlLTEgLT4gIDAuMAorZHFxdWE1MDMgcXVhbnRpemUgICAwLjAgIDFlLTEgLT4gIDAuMAorZHFxdWE1MDQgcXVhbnRpemUgICAwLjAgICAxZTAgLT4gIDAKK2RxcXVhNTA1IHF1YW50aXplICAgMC4wICAxZSsxIC0+ICAwRSsxCitkcXF1YTUwNiBxdWFudGl6ZSAgIDBFKzEgMWUtMSAtPiAgMC4wCitkcXF1YTUwNyBxdWFudGl6ZSAgIDBFKzEgIDFlMCAtPiAgMAorZHFxdWE1MDggcXVhbnRpemUgICAwRSsxIDFlKzEgLT4gIDBFKzEKK2RxcXVhNTA5IHF1YW50aXplICAtMCAgICAgMWUxIC0+IC0wRSsxCitkcXF1YTUxMCBxdWFudGl6ZSAgLTAgICAgIDFlMCAtPiAtMAorZHFxdWE1MTEgcXVhbnRpemUgIC0wICAgIDFlLTEgLT4gLTAuMAorZHFxdWE1MTIgcXVhbnRpemUgIC0wLjAgIDFlLTEgLT4gLTAuMAorZHFxdWE1MTMgcXVhbnRpemUgIC0wLjAgICAxZTAgLT4gLTAKK2RxcXVhNTE0IHF1YW50aXplICAtMC4wICAxZSsxIC0+IC0wRSsxCitkcXF1YTUxNSBxdWFudGl6ZSAgLTBFKzEgMWUtMSAtPiAtMC4wCitkcXF1YTUxNiBxdWFudGl6ZSAgLTBFKzEgIDFlMCAtPiAtMAorZHFxdWE1MTcgcXVhbnRpemUgIC0wRSsxIDFlKzEgLT4gLTBFKzEKKy0tICM1MTkgaGVyZSBvbmNlIGEgcHJvYmxlbQorZHFxdWE1MTggcXVhbnRpemUgIDAgICAgMEUtMyAgLT4gMC4wMDAKK2RxcXVhNTE5IHF1YW50aXplICAwICAgIDBFLTMzIC0+IDBFLTMzCitkcXF1YTUyMCBxdWFudGl6ZSAgMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIDBFLTMzIC0+IDBFLTMzCitkcXF1YTUyMSBxdWFudGl6ZSAgMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIDBFLTMzIC0+IDBFLTMzCisKKy0tIFNvbWUgbm9uLXplcm9zIHdpdGggbG90cyBvZiBwYWRkaW5nIG9uIHRoZSByaWdodAorZHFxdWE1MjMgcXVhbnRpemUgICAxICAgMEUtMzMgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxcXVhNTI0IHF1YW50aXplICAxMiAgIDBFLTMyIC0+IDEyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXF1YTUyNSBxdWFudGl6ZSAxMjMgICAwRS0zMSAtPiAxMjMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFxdWE1MjYgcXVhbnRpemUgMTIzICAgMEUtMzIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTUyNyBxdWFudGl6ZSAxMjMuNCAwRS0zMSAtPiAxMjMuNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFxdWE1MjggcXVhbnRpemUgMTIzLjQgMEUtMzIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIFN1c3BpY2lvdXMgUkhTIHZhbHVlcworZHFxdWE1MzAgcXVhbnRpemUgICAxLjIzNCAgICAxZTM1OSAtPiAwRSszNTkgSW5leGFjdCBSb3VuZGVkCitkcXF1YTUzMSBxdWFudGl6ZSAxMjMuNDU2ICAgIDFlMzU5IC0+IDBFKzM1OSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNTMyIHF1YW50aXplICAgMS4yMzQgICAgMWUzNTkgLT4gMEUrMzU5IEluZXhhY3QgUm91bmRlZAorZHFxdWE1MzMgcXVhbnRpemUgMTIzLjQ1NiAgICAxZTM1OSAtPiAwRSszNTkgSW5leGFjdCBSb3VuZGVkCistLSBuZXh0IGZvdXIgYXJlICJ3b24ndCBmaXQiIG92ZXJmbG93cworZHFxdWE1MzYgcXVhbnRpemUgICAxLjIzNCAgIDFlLTI5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNTM3IHF1YW50aXplIDEyMy40NTYgICAxZS0yOTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTUzOCBxdWFudGl6ZSAgIDEuMjM0ICAgMWUtMjk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE1MzkgcXVhbnRpemUgMTIzLjQ1NiAgIDFlLTI5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFxdWE1NDIgcXVhbnRpemUgICAxLjIzNEUrMjk5ICAgIDFlMjk5IC0+IDFFKzI5OSAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNTQzIHF1YW50aXplICAgMS4yMzRFKzI5OCAgICAxZTI5OSAtPiAwRSsyOTkgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTU0NCBxdWFudGl6ZSAgIDEuMjM0ICAgICAgICAgMWUyOTkgLT4gMEUrMjk5ICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE1NDcgcXVhbnRpemUgICAwICAgICAgICAgICAgMWUtMjk5IC0+IDBFLTI5OQorLS0gbmV4dCB0d28gYXJlICJ3b24ndCBmaXQiIG92ZXJmbG93cworZHFxdWE1NDggcXVhbnRpemUgICAxLjIzNCAgICAgICAgMWUtMjk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE1NDkgcXVhbnRpemUgICAxLjIzNCAgICAgICAgMWUtMzAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gW21vcmUgYmVsb3ddCisKKy0tIFNwZWNpYWxzCitkcXF1YTU4MCBxdWFudGl6ZSAgSW5mICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2RxcXVhNTgxIHF1YW50aXplICBJbmYgIDFlLTI5OSAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTU4MiBxdWFudGl6ZSAgSW5mICAxZS0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE1ODMgcXVhbnRpemUgIEluZiAgIDFlMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNTg0IHF1YW50aXplICBJbmYgICAxZTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTU4NSBxdWFudGl6ZSAgSW5mICAgMWUyOTkgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE1ODYgcXVhbnRpemUgIEluZiAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcXF1YTU4NyBxdWFudGl6ZSAtMTAwMCAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE1ODggcXVhbnRpemUgLUluZiAgICAgSW5mICAgLT4gIC1JbmZpbml0eQorZHFxdWE1ODkgcXVhbnRpemUgLTEgICAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNTkwIHF1YW50aXplICAwICAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTU5MSBxdWFudGl6ZSAgMSAgICAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE1OTIgcXVhbnRpemUgIDEwMDAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNTkzIHF1YW50aXplICBJbmYgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFxdWE1OTQgcXVhbnRpemUgIEluZiAgMWUtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNTk1IHF1YW50aXplIC0wICAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK2RxcXVhNjAwIHF1YW50aXplIC1JbmYgICAgLUluZiAgIC0+ICAtSW5maW5pdHkKK2RxcXVhNjAxIHF1YW50aXplIC1JbmYgIDFlLTI5OSAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTYwMiBxdWFudGl6ZSAtSW5mICAxZS0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2MDMgcXVhbnRpemUgLUluZiAgIDFlMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjA0IHF1YW50aXplIC1JbmYgICAxZTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTYwNSBxdWFudGl6ZSAtSW5mICAgMWUyOTkgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2MDYgcXVhbnRpemUgLUluZiAgICAgSW5mICAgLT4gIC1JbmZpbml0eQorZHFxdWE2MDcgcXVhbnRpemUgLTEwMDAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjA4IHF1YW50aXplIC1JbmYgICAgLUluZiAgIC0+ICAtSW5maW5pdHkKK2RxcXVhNjA5IHF1YW50aXplIC0xICAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTYxMCBxdWFudGl6ZSAgMCAgICAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2MTEgcXVhbnRpemUgIDEgICAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjEyIHF1YW50aXplICAxMDAwICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTYxMyBxdWFudGl6ZSAgSW5mICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2RxcXVhNjE0IHF1YW50aXplIC1JbmYgIDFlLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTYxNSBxdWFudGl6ZSAtMCAgICAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCitkcXF1YTYyMSBxdWFudGl6ZSAgTmFOICAgLUluZiAgICAtPiAgTmFOCitkcXF1YTYyMiBxdWFudGl6ZSAgTmFOIDFlLTI5OSAgICAtPiAgTmFOCitkcXF1YTYyMyBxdWFudGl6ZSAgTmFOIDFlLTEgICAgICAtPiAgTmFOCitkcXF1YTYyNCBxdWFudGl6ZSAgTmFOICAxZTAgICAgICAtPiAgTmFOCitkcXF1YTYyNSBxdWFudGl6ZSAgTmFOICAxZTEgICAgICAtPiAgTmFOCitkcXF1YTYyNiBxdWFudGl6ZSAgTmFOICAxZTI5OSAgICAtPiAgTmFOCitkcXF1YTYyNyBxdWFudGl6ZSAgTmFOICAgIEluZiAgICAtPiAgTmFOCitkcXF1YTYyOCBxdWFudGl6ZSAgTmFOICAgIE5hTiAgICAtPiAgTmFOCitkcXF1YTYyOSBxdWFudGl6ZSAtSW5mICAgIE5hTiAgICAtPiAgTmFOCitkcXF1YTYzMCBxdWFudGl6ZSAtMTAwMCAgIE5hTiAgICAtPiAgTmFOCitkcXF1YTYzMSBxdWFudGl6ZSAtMSAgICAgIE5hTiAgICAtPiAgTmFOCitkcXF1YTYzMiBxdWFudGl6ZSAgMCAgICAgIE5hTiAgICAtPiAgTmFOCitkcXF1YTYzMyBxdWFudGl6ZSAgMSAgICAgIE5hTiAgICAtPiAgTmFOCitkcXF1YTYzNCBxdWFudGl6ZSAgMTAwMCAgIE5hTiAgICAtPiAgTmFOCitkcXF1YTYzNSBxdWFudGl6ZSAgSW5mICAgIE5hTiAgICAtPiAgTmFOCitkcXF1YTYzNiBxdWFudGl6ZSAgTmFOIDFlLTAgICAgICAtPiAgTmFOCitkcXF1YTYzNyBxdWFudGl6ZSAtMCAgICAgIE5hTiAgICAtPiAgTmFOCisKK2RxcXVhNjQxIHF1YW50aXplICBzTmFOICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY0MiBxdWFudGl6ZSAgc05hTiAxZS0yOTkgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2NDMgcXVhbnRpemUgIHNOYU4gMWUtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjQ0IHF1YW50aXplICBzTmFOICAxZTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY0NSBxdWFudGl6ZSAgc05hTiAgMWUxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2NDYgcXVhbnRpemUgIHNOYU4gIDFlMjk5ICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjQ3IHF1YW50aXplICBzTmFOICAgIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY0OCBxdWFudGl6ZSAgc05hTiAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2NDkgcXVhbnRpemUgIE5hTiAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjUwIHF1YW50aXplIC1JbmYgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY1MSBxdWFudGl6ZSAtMTAwMCAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2NTIgcXVhbnRpemUgLTEgICAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjUzIHF1YW50aXplICAwICAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY1NCBxdWFudGl6ZSAgMSAgICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2NTUgcXVhbnRpemUgIDEwMDAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjU2IHF1YW50aXplICBJbmYgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY1NyBxdWFudGl6ZSAgTmFOICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2NTggcXVhbnRpemUgIHNOYU4gMWUtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjU5IHF1YW50aXplIC0wICAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxcXVhNjYxIHF1YW50aXplICBOYU45IC1JbmYgICAtPiAgTmFOOQorZHFxdWE2NjIgcXVhbnRpemUgIE5hTjggIDkxOSAgIC0+ICBOYU44CitkcXF1YTY2MyBxdWFudGl6ZSAgTmFONzEgSW5mICAgLT4gIE5hTjcxCitkcXF1YTY2NCBxdWFudGl6ZSAgTmFONiAgTmFONSAgLT4gIE5hTjYKK2RxcXVhNjY1IHF1YW50aXplIC1JbmYgICBOYU40ICAtPiAgTmFONAorZHFxdWE2NjYgcXVhbnRpemUgLTkxOSAgIE5hTjMxIC0+ICBOYU4zMQorZHFxdWE2NjcgcXVhbnRpemUgIEluZiAgIE5hTjIgIC0+ICBOYU4yCisKK2RxcXVhNjcxIHF1YW50aXplICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjcyIHF1YW50aXplICBzTmFOOTggLTExICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjczIHF1YW50aXplICBzTmFOOTcgIE5hTiAgICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjc0IHF1YW50aXplICBzTmFOMTYgc05hTjk0ICAtPiAgTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjc1IHF1YW50aXplICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjc2IHF1YW50aXplIC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjc3IHF1YW50aXplICAwODggICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjc4IHF1YW50aXplICBJbmYgICAgc05hTjkwICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjc5IHF1YW50aXplICBOYU4gICAgc05hTjg4ICAtPiAgTmFOODggSW52YWxpZF9vcGVyYXRpb24KKworZHFxdWE2ODEgcXVhbnRpemUgLU5hTjkgLUluZiAgIC0+IC1OYU45CitkcXF1YTY4MiBxdWFudGl6ZSAtTmFOOCAgOTE5ICAgLT4gLU5hTjgKK2RxcXVhNjgzIHF1YW50aXplIC1OYU43MSBJbmYgICAtPiAtTmFONzEKK2RxcXVhNjg0IHF1YW50aXplIC1OYU42IC1OYU41ICAtPiAtTmFONgorZHFxdWE2ODUgcXVhbnRpemUgLUluZiAgLU5hTjQgIC0+IC1OYU40CitkcXF1YTY4NiBxdWFudGl6ZSAtOTE5ICAtTmFOMzEgLT4gLU5hTjMxCitkcXF1YTY4NyBxdWFudGl6ZSAgSW5mICAtTmFOMiAgLT4gLU5hTjIKKworZHFxdWE2OTEgcXVhbnRpemUgLXNOYU45OSAtSW5mICAgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2OTIgcXVhbnRpemUgLXNOYU45OCAtMTEgICAgIC0+IC1OYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2OTMgcXVhbnRpemUgLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2OTQgcXVhbnRpemUgLXNOYU4xNiBzTmFOOTQgIC0+IC1OYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2OTUgcXVhbnRpemUgLU5hTjk1IC1zTmFOOTMgIC0+IC1OYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2OTYgcXVhbnRpemUgLUluZiAgIC1zTmFOOTIgIC0+IC1OYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2OTcgcXVhbnRpemUgIDA4OCAgIC1zTmFOOTEgIC0+IC1OYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2OTggcXVhbnRpemUgIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2OTkgcXVhbnRpemUgIE5hTiAgIC1zTmFOODggIC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3cKK2RxcXVhNzEwIHF1YW50aXplICAxLjAwRS02MTQzICAgMWUtNjE0MyAgLT4gICAxRS02MTQzICAgUm91bmRlZAorZHFxdWE3MTEgcXVhbnRpemUgIDAuMUUtNjE0MyAgICAyZS02MTQ0ICAtPiAgIDFFLTYxNDQgICBTdWJub3JtYWwKK2RxcXVhNzEyIHF1YW50aXplICAwLjEwRS02MTQzICAgM2UtNjE0NCAgLT4gICAxRS02MTQ0ICAgU3Vibm9ybWFsIFJvdW5kZWQKK2RxcXVhNzEzIHF1YW50aXplICAwLjEwMEUtNjE0MyAgNGUtNjE0NCAgLT4gICAxRS02MTQ0ICAgU3Vibm9ybWFsIFJvdW5kZWQKK2RxcXVhNzE0IHF1YW50aXplICAwLjAxRS02MTQzICAgNWUtNjE0NSAgLT4gICAxRS02MTQ1ICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorZHFxdWE3MTUgcXVhbnRpemUgIDAuOTk5RS02MTQzICAxZS02MTQzICAtPiAgIDFFLTYxNDMgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNzE2IHF1YW50aXplICAwLjA5OUUtNjE0MyAxMGUtNjE0NCAgLT4gICAxRS02MTQ0ICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorCitkcXF1YTcxNyBxdWFudGl6ZSAgMC4wMDlFLTYxNDMgIDFlLTYxNDUgIC0+ICAgMUUtNjE0NSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwKK2RxcXVhNzE4IHF1YW50aXplICAwLjAwMUUtNjE0MyAgMWUtNjE0NSAgLT4gICAwRS02MTQ1ICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTcxOSBxdWFudGl6ZSAgMC4wMDA5RS02MTQzIDFlLTYxNDUgIC0+ICAgMEUtNjE0NSAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE3MjAgcXVhbnRpemUgIDAuMDAwMUUtNjE0MyAxZS02MTQ1ICAtPiAgIDBFLTYxNDUgICBJbmV4YWN0IFJvdW5kZWQKKworZHFxdWE3MzAgcXVhbnRpemUgLTEuMDBFLTYxNDMgICAxZS02MTQzICAtPiAgLTFFLTYxNDMgICAgIFJvdW5kZWQKK2RxcXVhNzMxIHF1YW50aXplIC0wLjFFLTYxNDMgICAgMWUtNjE0MyAgLT4gIC0wRS02MTQzICAgICBSb3VuZGVkIEluZXhhY3QKK2RxcXVhNzMyIHF1YW50aXplIC0wLjEwRS02MTQzICAgMWUtNjE0MyAgLT4gIC0wRS02MTQzICAgICBSb3VuZGVkIEluZXhhY3QKK2RxcXVhNzMzIHF1YW50aXplIC0wLjEwMEUtNjE0MyAgMWUtNjE0MyAgLT4gIC0wRS02MTQzICAgICBSb3VuZGVkIEluZXhhY3QKK2RxcXVhNzM0IHF1YW50aXplIC0wLjAxRS02MTQzICAgMWUtNjE0MyAgLT4gIC0wRS02MTQzICAgICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCitkcXF1YTczNSBxdWFudGl6ZSAtMC45OTlFLTYxNDMgOTBlLTYxNDMgIC0+ICAtMUUtNjE0MyAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTczNiBxdWFudGl6ZSAtMC4wOTlFLTYxNDMgLTFlLTYxNDMgIC0+ICAtMEUtNjE0MyAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTczNyBxdWFudGl6ZSAtMC4wMDlFLTYxNDMgLTFlLTYxNDMgIC0+ICAtMEUtNjE0MyAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTczOCBxdWFudGl6ZSAtMC4wMDFFLTYxNDMgLTBlLTYxNDMgIC0+ICAtMEUtNjE0MyAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTczOSBxdWFudGl6ZSAtMC4wMDAxRS02MTQzIDBlLTYxNDMgIC0+ICAtMEUtNjE0MyAgICAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhNzQwIHF1YW50aXplIC0xLjAwRS02MTQzICAgMWUtNjE0NCAtPiAgLTEuMEUtNjE0MyAgIFJvdW5kZWQKK2RxcXVhNzQxIHF1YW50aXplIC0wLjFFLTYxNDMgICAgMWUtNjE0NCAtPiAgLTFFLTYxNDQgICAgU3Vibm9ybWFsCitkcXF1YTc0MiBxdWFudGl6ZSAtMC4xMEUtNjE0MyAgIDFlLTYxNDQgLT4gIC0xRS02MTQ0ICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkcXF1YTc0MyBxdWFudGl6ZSAtMC4xMDBFLTYxNDMgIDFlLTYxNDQgLT4gIC0xRS02MTQ0ICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkcXF1YTc0NCBxdWFudGl6ZSAtMC4wMUUtNjE0MyAgIDFlLTYxNDQgLT4gIC0wRS02MTQ0ICAgIEluZXhhY3QgUm91bmRlZAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIEVtaW4KK2RxcXVhNzQ1IHF1YW50aXplIC0wLjk5OUUtNjE0MyAgMWUtNjE0NCAtPiAgLTEuMEUtNjE0MyAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE3NDYgcXVhbnRpemUgLTAuMDk5RS02MTQzICAxZS02MTQ0IC0+ICAtMUUtNjE0NCAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCitkcXF1YTc0NyBxdWFudGl6ZSAtMC4wMDlFLTYxNDMgIDFlLTYxNDQgLT4gIC0wRS02MTQ0ICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE3NDggcXVhbnRpemUgLTAuMDAxRS02MTQzICAxZS02MTQ0IC0+ICAtMEUtNjE0NCAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNzQ5IHF1YW50aXplIC0wLjAwMDFFLTYxNDMgMWUtNjE0NCAtPiAgLTBFLTYxNDQgICAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhNzUwIHF1YW50aXplIC0xLjAwRS02MTQzICAgMWUtNjE0NSAtPiAgLTEuMDBFLTYxNDMKK2RxcXVhNzUxIHF1YW50aXplIC0wLjFFLTYxNDMgICAgMWUtNjE0NSAtPiAgLTEuMEUtNjE0NCAgU3Vibm9ybWFsCitkcXF1YTc1MiBxdWFudGl6ZSAtMC4xMEUtNjE0MyAgIDFlLTYxNDUgLT4gIC0xLjBFLTYxNDQgIFN1Ym5vcm1hbAorZHFxdWE3NTMgcXVhbnRpemUgLTAuMTAwRS02MTQzICAxZS02MTQ1IC0+ICAtMS4wRS02MTQ0ICBTdWJub3JtYWwgUm91bmRlZAorZHFxdWE3NTQgcXVhbnRpemUgLTAuMDFFLTYxNDMgICAxZS02MTQ1IC0+ICAtMUUtNjE0NSAgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCitkcXF1YTc1NSBxdWFudGl6ZSAtMC45OTlFLTYxNDMgIDFlLTYxNDUgLT4gIC0xLjAwRS02MTQzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNzU2IHF1YW50aXplIC0wLjA5OUUtNjE0MyAgMWUtNjE0NSAtPiAgLTEuMEUtNjE0NCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorZHFxdWE3NTcgcXVhbnRpemUgLTAuMDA5RS02MTQzICAxZS02MTQ1IC0+ICAtMUUtNjE0NSAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCitkcXF1YTc1OCBxdWFudGl6ZSAtMC4wMDFFLTYxNDMgIDFlLTYxNDUgLT4gIC0wRS02MTQ1ICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE3NTkgcXVhbnRpemUgLTAuMDAwMUUtNjE0MyAxZS02MTQ1IC0+ICAtMEUtNjE0NSAgICBJbmV4YWN0IFJvdW5kZWQKKworZHFxdWE3NjAgcXVhbnRpemUgLTEuMDBFLTYxNDMgICAxZS02MTQ2IC0+ICAtMS4wMDBFLTYxNDMKK2RxcXVhNzYxIHF1YW50aXplIC0wLjFFLTYxNDMgICAgMWUtNjE0NiAtPiAgLTEuMDBFLTYxNDQgIFN1Ym5vcm1hbAorZHFxdWE3NjIgcXVhbnRpemUgLTAuMTBFLTYxNDMgICAxZS02MTQ2IC0+ICAtMS4wMEUtNjE0NCAgU3Vibm9ybWFsCitkcXF1YTc2MyBxdWFudGl6ZSAtMC4xMDBFLTYxNDMgIDFlLTYxNDYgLT4gIC0xLjAwRS02MTQ0ICBTdWJub3JtYWwKK2RxcXVhNzY0IHF1YW50aXplIC0wLjAxRS02MTQzICAgMWUtNjE0NiAtPiAgLTEuMEUtNjE0NSAgIFN1Ym5vcm1hbAorZHFxdWE3NjUgcXVhbnRpemUgLTAuOTk5RS02MTQzICAxZS02MTQ2IC0+ICAtOS45OUUtNjE0NCAgU3Vibm9ybWFsCitkcXF1YTc2NiBxdWFudGl6ZSAtMC4wOTlFLTYxNDMgIDFlLTYxNDYgLT4gIC05LjlFLTYxNDUgICBTdWJub3JtYWwKK2RxcXVhNzY3IHF1YW50aXplIC0wLjAwOUUtNjE0MyAgMWUtNjE0NiAtPiAgLTlFLTYxNDYgICAgIFN1Ym5vcm1hbAorZHFxdWE3NjggcXVhbnRpemUgLTAuMDAxRS02MTQzICAxZS02MTQ2IC0+ICAtMUUtNjE0NiAgICAgU3Vibm9ybWFsCitkcXF1YTc2OSBxdWFudGl6ZSAtMC4wMDAxRS02MTQzIDFlLTYxNDYgLT4gIC0wRS02MTQ2ICAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gTW9yZSBmcm9tIEZ1bmcgTGVlCistLSB0aGUgbmV4dCBmb3VyIHdvdWxkIGFwcGVhciB0byBiZSBpbiBlcnJvciwgYnV0IHRoZXkgYXJlIG1pc2xlYWRpbmcgKHRoZQorLS0gb3BlcmFuZHMgd2lsbCBiZSBjbGFtcGVkIHRvIGEgbG93ZXIgZXhwb25lbnQpIGFuZCBzbyBhcmUgb21pdHRlZAorLS0gZHFxdWExMDIxIHF1YW50aXplICA4LjY2NjY2NjY2NjY2NjAwMEUrNjE0NCAgMS4wMDAwMDAwMDAwMDAwMDBFKzYxNDQgLT4gIDguNjY2NjY2NjY2NjY2MDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0ICBDbGFtcGVkCistLSBkcXF1YTEwMjIgcXVhbnRpemUgLTguNjY2NjY2NjY2NjY2MDAwRSs2MTQ0ICAxLjAwMDAwMDAwMDAwMDAwMEUrNjE0NCAtPiAtOC42NjY2NjY2NjY2NjYwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDQgIENsYW1wZWQKKy0tIGRxcXVhMTAyNyBxdWFudGl6ZSA4LjY2NjY2NjY2NjY2NjAwMEUrMzIzICAxRSszMSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGRxcXVhMTAzMCBxdWFudGl6ZSA4LjY2NjY2NjY2RSszICAgICAgICAgICAxRSszICAgICAtPiA5RSszIEluZXhhY3QgUm91bmRlZAorCistLSBJbnQgYW5kIHVJbnQzMiBlZGdlIHZhbHVlcyBmb3IgdGVzdGluZyBjb252ZXJzaW9ucworZHFxdWExMDQwIHF1YW50aXplIC0yMTQ3NDgzNjQ2ICAgICAwIC0+IC0yMTQ3NDgzNjQ2CitkcXF1YTEwNDEgcXVhbnRpemUgLTIxNDc0ODM2NDcgICAgIDAgLT4gLTIxNDc0ODM2NDcKK2RxcXVhMTA0MiBxdWFudGl6ZSAtMjE0NzQ4MzY0OCAgICAgMCAtPiAtMjE0NzQ4MzY0OAorZHFxdWExMDQzIHF1YW50aXplIC0yMTQ3NDgzNjQ5ICAgICAwIC0+IC0yMTQ3NDgzNjQ5CitkcXF1YTEwNDQgcXVhbnRpemUgIDIxNDc0ODM2NDYgICAgIDAgLT4gIDIxNDc0ODM2NDYKK2RxcXVhMTA0NSBxdWFudGl6ZSAgMjE0NzQ4MzY0NyAgICAgMCAtPiAgMjE0NzQ4MzY0NworZHFxdWExMDQ2IHF1YW50aXplICAyMTQ3NDgzNjQ4ICAgICAwIC0+ICAyMTQ3NDgzNjQ4CitkcXF1YTEwNDcgcXVhbnRpemUgIDIxNDc0ODM2NDkgICAgIDAgLT4gIDIxNDc0ODM2NDkKK2RxcXVhMTA0OCBxdWFudGl6ZSAgNDI5NDk2NzI5NCAgICAgMCAtPiAgNDI5NDk2NzI5NAorZHFxdWExMDQ5IHF1YW50aXplICA0Mjk0OTY3Mjk1ICAgICAwIC0+ICA0Mjk0OTY3Mjk1CitkcXF1YTEwNTAgcXVhbnRpemUgIDQyOTQ5NjcyOTYgICAgIDAgLT4gIDQyOTQ5NjcyOTYKK2RxcXVhMTA1MSBxdWFudGl6ZSAgNDI5NDk2NzI5NyAgICAgMCAtPiAgNDI5NDk2NzI5NworCistLSBSb3VuZGluZyBzd2F0aGUKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2RxcXVhMTEwMCBxdWFudGl6ZSAgMS4yMzAwICAgIDEuMDAgICAgLT4gIDEuMjMgIFJvdW5kZWQKK2RxcXVhMTEwMSBxdWFudGl6ZSAgMS4yMzAxICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMTAyIHF1YW50aXplICAxLjIzMTAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTExMDMgcXVhbnRpemUgIDEuMjM1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTEwNCBxdWFudGl6ZSAgMS4yMzUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMTA1IHF1YW50aXplICAxLjI0NTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTExMDYgcXVhbnRpemUgIDEuMjQ1MSAgICAxLjAwICAgIC0+ICAxLjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTEwNyBxdWFudGl6ZSAgMS4yMzYwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMTA4IHF1YW50aXplICAxLjIzNzAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTExMDkgcXVhbnRpemUgIDEuMjM5OSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK2RxcXVhMTIwMCBxdWFudGl6ZSAgMS4yMzAwICAgIDEuMDAgICAgLT4gIDEuMjMgIFJvdW5kZWQKK2RxcXVhMTIwMSBxdWFudGl6ZSAgMS4yMzAxICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMjAyIHF1YW50aXplICAxLjIzMTAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEyMDMgcXVhbnRpemUgIDEuMjM1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTIwNCBxdWFudGl6ZSAgMS4yMzUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMjA1IHF1YW50aXplICAxLjI0NTAgICAgMS4wMCAgICAtPiAgMS4yNSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEyMDYgcXVhbnRpemUgIDEuMjQ1MSAgICAxLjAwICAgIC0+ICAxLjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTIwNyBxdWFudGl6ZSAgMS4yMzYwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMjA4IHF1YW50aXplICAxLjIzNzAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEyMDkgcXVhbnRpemUgIDEuMjM5OSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZG93bgorZHFxdWExMzAwIHF1YW50aXplICAxLjIzMDAgICAgMS4wMCAgICAtPiAgMS4yMyAgUm91bmRlZAorZHFxdWExMzAxIHF1YW50aXplICAxLjIzMDEgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEzMDIgcXVhbnRpemUgIDEuMjMxMCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTMwMyBxdWFudGl6ZSAgMS4yMzUwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMzA0IHF1YW50aXplICAxLjIzNTEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEzMDUgcXVhbnRpemUgIDEuMjQ1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTMwNiBxdWFudGl6ZSAgMS4yNDUxICAgIDEuMDAgICAgLT4gIDEuMjUgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMzA3IHF1YW50aXplICAxLjIzNjAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEzMDggcXVhbnRpemUgIDEuMjM3MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTMwOSBxdWFudGl6ZSAgMS4yMzk5ICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogdXAKK2RxcXVhMTQwMCBxdWFudGl6ZSAgMS4yMzAwICAgIDEuMDAgICAgLT4gIDEuMjMgIFJvdW5kZWQKK2RxcXVhMTQwMSBxdWFudGl6ZSAgMS4yMzAxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNDAyIHF1YW50aXplICAxLjIzMTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE0MDMgcXVhbnRpemUgIDEuMjM1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTQwNCBxdWFudGl6ZSAgMS4yMzUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNDA1IHF1YW50aXplICAxLjI0NTAgICAgMS4wMCAgICAtPiAgMS4yNSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE0MDYgcXVhbnRpemUgIDEuMjQ1MSAgICAxLjAwICAgIC0+ICAxLjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTQwNyBxdWFudGl6ZSAgMS4yMzYwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNDA4IHF1YW50aXplICAxLjIzNzAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE0MDkgcXVhbnRpemUgIDEuMjM5OSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTQxMSBxdWFudGl6ZSAtMS4yMzk5ICAgIDEuMDAgICAgLT4gLTEuMjQgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorZHFxdWExNTAwIHF1YW50aXplICAxLjIzMDAgICAgMS4wMCAgICAtPiAgMS4yMyAgUm91bmRlZAorZHFxdWExNTAxIHF1YW50aXplICAxLjIzMDEgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE1MDIgcXVhbnRpemUgIDEuMjMxMCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTUwMyBxdWFudGl6ZSAgMS4yMzUwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNTA0IHF1YW50aXplICAxLjIzNTEgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE1MDUgcXVhbnRpemUgIDEuMjQ1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTUwNiBxdWFudGl6ZSAgMS4yNDUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNTA3IHF1YW50aXplICAxLjIzNjAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE1MDggcXVhbnRpemUgIDEuMjM3MCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTUwOSBxdWFudGl6ZSAgMS4yMzk5ICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNTExIHF1YW50aXplIC0xLjIzOTkgICAgMS4wMCAgICAtPiAtMS4yMyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBjZWlsaW5nCitkcXF1YTE2MDAgcXVhbnRpemUgIDEuMjMwMCAgICAxLjAwICAgIC0+ICAxLjIzICBSb3VuZGVkCitkcXF1YTE2MDEgcXVhbnRpemUgIDEuMjMwMSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTYwMiBxdWFudGl6ZSAgMS4yMzEwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNjAzIHF1YW50aXplICAxLjIzNTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE2MDQgcXVhbnRpemUgIDEuMjM1MSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTYwNSBxdWFudGl6ZSAgMS4yNDUwICAgIDEuMDAgICAgLT4gIDEuMjUgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNjA2IHF1YW50aXplICAxLjI0NTEgICAgMS4wMCAgICAtPiAgMS4yNSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE2MDcgcXVhbnRpemUgIDEuMjM2MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTYwOCBxdWFudGl6ZSAgMS4yMzcwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNjA5IHF1YW50aXplICAxLjIzOTkgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE2MTEgcXVhbnRpemUgLTEuMjM5OSAgICAxLjAwICAgIC0+IC0xLjIzICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGZsb29yCitkcXF1YTE3MDAgcXVhbnRpemUgIDEuMjMwMCAgICAxLjAwICAgIC0+ICAxLjIzICBSb3VuZGVkCitkcXF1YTE3MDEgcXVhbnRpemUgIDEuMjMwMSAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTcwMiBxdWFudGl6ZSAgMS4yMzEwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNzAzIHF1YW50aXplICAxLjIzNTAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE3MDQgcXVhbnRpemUgIDEuMjM1MSAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTcwNSBxdWFudGl6ZSAgMS4yNDUwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNzA2IHF1YW50aXplICAxLjI0NTEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE3MDcgcXVhbnRpemUgIDEuMjM2MCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTcwOCBxdWFudGl6ZSAgMS4yMzcwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNzA5IHF1YW50aXplICAxLjIzOTkgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE3MTEgcXVhbnRpemUgLTEuMjM5OSAgICAxLjAwICAgIC0+IC0xLjI0ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IDA1dXAKK2RxcXVhMTgwMCBxdWFudGl6ZSAgMS4yMDAwICAgIDEuMDAgICAgLT4gIDEuMjAgIFJvdW5kZWQKK2RxcXVhMTgwMSBxdWFudGl6ZSAgMS4yMDAxICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZHFxdWExODAyIHF1YW50aXplICAxLjIwMTAgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE4MDMgcXVhbnRpemUgIDEuMjA1MCAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTgwNCBxdWFudGl6ZSAgMS4yMDUxICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZHFxdWExODA3IHF1YW50aXplICAxLjIwNjAgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE4MDggcXVhbnRpemUgIDEuMjA3MCAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTgwOSBxdWFudGl6ZSAgMS4yMDk5ICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZHFxdWExODExIHF1YW50aXplIC0xLjIwOTkgICAgMS4wMCAgICAtPiAtMS4yMSAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMTkwMCBxdWFudGl6ZSAgMS4yMTAwICAgIDEuMDAgICAgLT4gIDEuMjEgIFJvdW5kZWQKK2RxcXVhMTkwMSBxdWFudGl6ZSAgMS4yMTAxICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZHFxdWExOTAyIHF1YW50aXplICAxLjIxMTAgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE5MDMgcXVhbnRpemUgIDEuMjE1MCAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTkwNCBxdWFudGl6ZSAgMS4yMTUxICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZHFxdWExOTA3IHF1YW50aXplICAxLjIxNjAgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE5MDggcXVhbnRpemUgIDEuMjE3MCAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTkwOSBxdWFudGl6ZSAgMS4yMTk5ICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZHFxdWExOTExIHF1YW50aXplIC0xLjIxOTkgICAgMS4wMCAgICAtPiAtMS4yMSAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMjAwMCBxdWFudGl6ZSAgMS4yNDAwICAgIDEuMDAgICAgLT4gIDEuMjQgIFJvdW5kZWQKK2RxcXVhMjAwMSBxdWFudGl6ZSAgMS4yNDAxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMDAyIHF1YW50aXplICAxLjI0MTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIwMDMgcXVhbnRpemUgIDEuMjQ1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjAwNCBxdWFudGl6ZSAgMS4yNDUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMDA3IHF1YW50aXplICAxLjI0NjAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIwMDggcXVhbnRpemUgIDEuMjQ3MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjAwOSBxdWFudGl6ZSAgMS4yNDk5ICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMDExIHF1YW50aXplIC0xLjI0OTkgICAgMS4wMCAgICAtPiAtMS4yNCAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMjEwMCBxdWFudGl6ZSAgMS4yNTAwICAgIDEuMDAgICAgLT4gIDEuMjUgIFJvdW5kZWQKK2RxcXVhMjEwMSBxdWFudGl6ZSAgMS4yNTAxICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMTAyIHF1YW50aXplICAxLjI1MTAgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIxMDMgcXVhbnRpemUgIDEuMjU1MCAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjEwNCBxdWFudGl6ZSAgMS4yNTUxICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMTA3IHF1YW50aXplICAxLjI1NjAgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIxMDggcXVhbnRpemUgIDEuMjU3MCAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjEwOSBxdWFudGl6ZSAgMS4yNTk5ICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMTExIHF1YW50aXplIC0xLjI1OTkgICAgMS4wMCAgICAtPiAtMS4yNiAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMjIwMCBxdWFudGl6ZSAgMS4yNjAwICAgIDEuMDAgICAgLT4gIDEuMjYgIFJvdW5kZWQKK2RxcXVhMjIwMSBxdWFudGl6ZSAgMS4yNjAxICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMjAyIHF1YW50aXplICAxLjI2MTAgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIyMDMgcXVhbnRpemUgIDEuMjY1MCAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjIwNCBxdWFudGl6ZSAgMS4yNjUxICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMjA3IHF1YW50aXplICAxLjI2NjAgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIyMDggcXVhbnRpemUgIDEuMjY3MCAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjIwOSBxdWFudGl6ZSAgMS4yNjk5ICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMjExIHF1YW50aXplIC0xLjI2OTkgICAgMS4wMCAgICAtPiAtMS4yNiAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMjMwMCBxdWFudGl6ZSAgMS4yOTAwICAgIDEuMDAgICAgLT4gIDEuMjkgIFJvdW5kZWQKK2RxcXVhMjMwMSBxdWFudGl6ZSAgMS4yOTAxICAgIDEuMDAgICAgLT4gIDEuMjkgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMzAyIHF1YW50aXplICAxLjI5MTAgICAgMS4wMCAgICAtPiAgMS4yOSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIzMDMgcXVhbnRpemUgIDEuMjk1MCAgICAxLjAwICAgIC0+ICAxLjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjMwNCBxdWFudGl6ZSAgMS4yOTUxICAgIDEuMDAgICAgLT4gIDEuMjkgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMzA3IHF1YW50aXplICAxLjI5NjAgICAgMS4wMCAgICAtPiAgMS4yOSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIzMDggcXVhbnRpemUgIDEuMjk3MCAgICAxLjAwICAgIC0+ICAxLjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjMwOSBxdWFudGl6ZSAgMS4yOTk5ICAgIDEuMDAgICAgLT4gIDEuMjkgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMzExIHF1YW50aXplIC0xLjI5OTkgICAgMS4wMCAgICAtPiAtMS4yOSAgSW5leGFjdCBSb3VuZGVkCisKKy0tIE51bGwgdGVzdHMKK2RxcXVhOTk4IHF1YW50aXplIDEwICAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTk5OSBxdWFudGl6ZSAgIyAxZTEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVJlZHVjZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVJlZHVjZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MzVlNmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxUmVkdWNlLmRlY1Rlc3QKQEAgLTAsMCArMSwxODMgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFSZWR1Y2UuZGVjVGVzdCAtLSByZW1vdmUgdHJhaWxpbmcgemVyb3MgZnJvbSBhIGRlY1F1YWQgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMywgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2RxcmVkMDAxIHJlZHVjZSAnMScgICAgICAtPiAnMScKK2RxcmVkMDAyIHJlZHVjZSAnLTEnICAgICAtPiAnLTEnCitkcXJlZDAwMyByZWR1Y2UgJzEuMDAnICAgLT4gJzEnCitkcXJlZDAwNCByZWR1Y2UgJy0xLjAwJyAgLT4gJy0xJworZHFyZWQwMDUgcmVkdWNlICcwJyAgICAgIC0+ICcwJworZHFyZWQwMDYgcmVkdWNlICcwLjAwJyAgIC0+ICcwJworZHFyZWQwMDcgcmVkdWNlICcwMC4wJyAgIC0+ICcwJworZHFyZWQwMDggcmVkdWNlICcwMC4wMCcgIC0+ICcwJworZHFyZWQwMDkgcmVkdWNlICcwMCcgICAgIC0+ICcwJworZHFyZWQwMTAgcmVkdWNlICcwRSsxJyAgIC0+ICcwJworZHFyZWQwMTEgcmVkdWNlICcwRSs1JyAgIC0+ICcwJworCitkcXJlZDAxMiByZWR1Y2UgJy0yJyAgICAgLT4gJy0yJworZHFyZWQwMTMgcmVkdWNlICcyJyAgICAgIC0+ICcyJworZHFyZWQwMTQgcmVkdWNlICctMi4wMCcgIC0+ICctMicKK2RxcmVkMDE1IHJlZHVjZSAnMi4wMCcgICAtPiAnMicKK2RxcmVkMDE2IHJlZHVjZSAnLTAnICAgICAtPiAnLTAnCitkcXJlZDAxNyByZWR1Y2UgJy0wLjAwJyAgLT4gJy0wJworZHFyZWQwMTggcmVkdWNlICctMDAuMCcgIC0+ICctMCcKK2RxcmVkMDE5IHJlZHVjZSAnLTAwLjAwJyAtPiAnLTAnCitkcXJlZDAyMCByZWR1Y2UgJy0wMCcgICAgLT4gJy0wJworZHFyZWQwMjEgcmVkdWNlICctMEUrNScgICAtPiAnLTAnCitkcXJlZDAyMiByZWR1Y2UgJy0wRSsxJyAgLT4gJy0wJworCitkcXJlZDAzMCByZWR1Y2UgJyswLjEnICAgICAgICAgICAgLT4gJzAuMScKK2RxcmVkMDMxIHJlZHVjZSAnLTAuMScgICAgICAgICAgICAtPiAnLTAuMScKK2RxcmVkMDMyIHJlZHVjZSAnKzAuMDEnICAgICAgICAgICAtPiAnMC4wMScKK2RxcmVkMDMzIHJlZHVjZSAnLTAuMDEnICAgICAgICAgICAtPiAnLTAuMDEnCitkcXJlZDAzNCByZWR1Y2UgJyswLjAwMScgICAgICAgICAgLT4gJzAuMDAxJworZHFyZWQwMzUgcmVkdWNlICctMC4wMDEnICAgICAgICAgIC0+ICctMC4wMDEnCitkcXJlZDAzNiByZWR1Y2UgJyswLjAwMDAwMScgICAgICAgLT4gJzAuMDAwMDAxJworZHFyZWQwMzcgcmVkdWNlICctMC4wMDAwMDEnICAgICAgIC0+ICctMC4wMDAwMDEnCitkcXJlZDAzOCByZWR1Y2UgJyswLjAwMDAwMDAwMDAwMScgLT4gJzFFLTEyJworZHFyZWQwMzkgcmVkdWNlICctMC4wMDAwMDAwMDAwMDEnIC0+ICctMUUtMTInCisKK2RxcmVkMDQxIHJlZHVjZSAxLjEgICAgICAgIC0+IDEuMQorZHFyZWQwNDIgcmVkdWNlIDEuMTAgICAgICAgLT4gMS4xCitkcXJlZDA0MyByZWR1Y2UgMS4xMDAgICAgICAtPiAxLjEKK2RxcmVkMDQ0IHJlZHVjZSAxLjExMCAgICAgIC0+IDEuMTEKK2RxcmVkMDQ1IHJlZHVjZSAtMS4xICAgICAgIC0+IC0xLjEKK2RxcmVkMDQ2IHJlZHVjZSAtMS4xMCAgICAgIC0+IC0xLjEKK2RxcmVkMDQ3IHJlZHVjZSAtMS4xMDAgICAgIC0+IC0xLjEKK2RxcmVkMDQ4IHJlZHVjZSAtMS4xMTAgICAgIC0+IC0xLjExCitkcXJlZDA0OSByZWR1Y2UgOS45ICAgICAgICAtPiA5LjkKK2RxcmVkMDUwIHJlZHVjZSA5LjkwICAgICAgIC0+IDkuOQorZHFyZWQwNTEgcmVkdWNlIDkuOTAwICAgICAgLT4gOS45CitkcXJlZDA1MiByZWR1Y2UgOS45OTAgICAgICAtPiA5Ljk5CitkcXJlZDA1MyByZWR1Y2UgLTkuOSAgICAgICAtPiAtOS45CitkcXJlZDA1NCByZWR1Y2UgLTkuOTAgICAgICAtPiAtOS45CitkcXJlZDA1NSByZWR1Y2UgLTkuOTAwICAgICAtPiAtOS45CitkcXJlZDA1NiByZWR1Y2UgLTkuOTkwICAgICAtPiAtOS45OQorCistLSBzb21lIHRyYWlsaW5nIGZyYWN0aW9uYWwgemVyb3Mgd2l0aCB6ZXJvcyBpbiB1bml0cworZHFyZWQwNjAgcmVkdWNlICAxMC4wICAgICAgICAtPiAxRSsxCitkcXJlZDA2MSByZWR1Y2UgIDEwLjAwICAgICAgIC0+IDFFKzEKK2RxcmVkMDYyIHJlZHVjZSAgMTAwLjAgICAgICAgLT4gMUUrMgorZHFyZWQwNjMgcmVkdWNlICAxMDAuMDAgICAgICAtPiAxRSsyCitkcXJlZDA2NCByZWR1Y2UgIDEuMTAwMEUrMyAgIC0+IDEuMUUrMworZHFyZWQwNjUgcmVkdWNlICAxLjEwMDAwRSszICAtPiAxLjFFKzMKK2RxcmVkMDY2IHJlZHVjZSAtMTAuMCAgICAgICAgLT4gLTFFKzEKK2RxcmVkMDY3IHJlZHVjZSAtMTAuMDAgICAgICAgLT4gLTFFKzEKK2RxcmVkMDY4IHJlZHVjZSAtMTAwLjAgICAgICAgLT4gLTFFKzIKK2RxcmVkMDY5IHJlZHVjZSAtMTAwLjAwICAgICAgLT4gLTFFKzIKK2RxcmVkMDcwIHJlZHVjZSAtMS4xMDAwRSszICAgLT4gLTEuMUUrMworZHFyZWQwNzEgcmVkdWNlIC0xLjEwMDAwRSszICAtPiAtMS4xRSszCisKKy0tIHNvbWUgaW5zaWduaWZpY2FudCB0cmFpbGluZyB6ZXJvcyB3aXRoIHBvc2l0aXZlIGV4cG9uZW50CitkcXJlZDA4MCByZWR1Y2UgIDEwRSsxICAgICAgIC0+IDFFKzIKK2RxcmVkMDgxIHJlZHVjZSAgMTAwRSsxICAgICAgLT4gMUUrMworZHFyZWQwODIgcmVkdWNlICAxLjBFKzIgICAgICAtPiAxRSsyCitkcXJlZDA4MyByZWR1Y2UgIDEuMEUrMyAgICAgIC0+IDFFKzMKK2RxcmVkMDg0IHJlZHVjZSAgMS4xRSszICAgICAgLT4gMS4xRSszCitkcXJlZDA4NSByZWR1Y2UgIDEuMDBFKzMgICAgIC0+IDFFKzMKK2RxcmVkMDg2IHJlZHVjZSAgMS4xMEUrMyAgICAgLT4gMS4xRSszCitkcXJlZDA4NyByZWR1Y2UgLTEwRSsxICAgICAgIC0+IC0xRSsyCitkcXJlZDA4OCByZWR1Y2UgLTEwMEUrMSAgICAgIC0+IC0xRSszCitkcXJlZDA4OSByZWR1Y2UgLTEuMEUrMiAgICAgIC0+IC0xRSsyCitkcXJlZDA5MCByZWR1Y2UgLTEuMEUrMyAgICAgIC0+IC0xRSszCitkcXJlZDA5MSByZWR1Y2UgLTEuMUUrMyAgICAgIC0+IC0xLjFFKzMKK2RxcmVkMDkyIHJlZHVjZSAtMS4wMEUrMyAgICAgLT4gLTFFKzMKK2RxcmVkMDkzIHJlZHVjZSAtMS4xMEUrMyAgICAgLT4gLTEuMUUrMworCistLSBzb21lIHNpZ25pZmljYW50IHRyYWlsaW5nIHplcm9zLCB3ZXJlIHdlIHRvIGJlIHRyaW1taW5nCitkcXJlZDEwMCByZWR1Y2UgIDExICAgICAgICAgIC0+IDExCitkcXJlZDEwMSByZWR1Y2UgIDEwICAgICAgICAgIC0+IDFFKzEKK2RxcmVkMTAyIHJlZHVjZSAgMTAuICAgICAgICAgLT4gMUUrMQorZHFyZWQxMDMgcmVkdWNlICAxLjFFKzEgICAgICAtPiAxMQorZHFyZWQxMDQgcmVkdWNlICAxLjBFKzEgICAgICAtPiAxRSsxCitkcXJlZDEwNSByZWR1Y2UgIDEuMTBFKzIgICAgIC0+IDEuMUUrMgorZHFyZWQxMDYgcmVkdWNlICAxLjAwRSsyICAgICAtPiAxRSsyCitkcXJlZDEwNyByZWR1Y2UgIDEuMTAwRSszICAgIC0+IDEuMUUrMworZHFyZWQxMDggcmVkdWNlICAxLjAwMEUrMyAgICAtPiAxRSszCitkcXJlZDEwOSByZWR1Y2UgIDEuMDAwMDAwRSs2IC0+IDFFKzYKK2RxcmVkMTEwIHJlZHVjZSAtMTEgICAgICAgICAgLT4gLTExCitkcXJlZDExMSByZWR1Y2UgLTEwICAgICAgICAgIC0+IC0xRSsxCitkcXJlZDExMiByZWR1Y2UgLTEwLiAgICAgICAgIC0+IC0xRSsxCitkcXJlZDExMyByZWR1Y2UgLTEuMUUrMSAgICAgIC0+IC0xMQorZHFyZWQxMTQgcmVkdWNlIC0xLjBFKzEgICAgICAtPiAtMUUrMQorZHFyZWQxMTUgcmVkdWNlIC0xLjEwRSsyICAgICAtPiAtMS4xRSsyCitkcXJlZDExNiByZWR1Y2UgLTEuMDBFKzIgICAgIC0+IC0xRSsyCitkcXJlZDExNyByZWR1Y2UgLTEuMTAwRSszICAgIC0+IC0xLjFFKzMKK2RxcmVkMTE4IHJlZHVjZSAtMS4wMDBFKzMgICAgLT4gLTFFKzMKK2RxcmVkMTE5IHJlZHVjZSAtMS4wMDAwMEUrNSAgLT4gLTFFKzUKK2RxcmVkMTIwIHJlZHVjZSAtMS4wMDAwMDBFKzYgLT4gLTFFKzYKK2RxcmVkMTIxIHJlZHVjZSAtMTAuMDAwMDBFKzYgLT4gLTFFKzcKK2RxcmVkMTIyIHJlZHVjZSAtMTAwLjAwMDBFKzYgLT4gLTFFKzgKK2RxcmVkMTIzIHJlZHVjZSAtMTAwMC4wMDBFKzYgLT4gLTFFKzkKK2RxcmVkMTI0IHJlZHVjZSAtMTAwMDAuMDBFKzYgLT4gLTFFKzEwCitkcXJlZDEyNSByZWR1Y2UgLTEwMDAwMC4wRSs2IC0+IC0xRSsxMQorZHFyZWQxMjYgcmVkdWNlIC0xMDAwMDAwLkUrNiAtPiAtMUUrMTIKKworLS0gZXhhbXBsZXMgZnJvbSBkZWNBcml0aAorZHFyZWQxNDAgcmVkdWNlICcyLjEnICAgICAtPiAgJzIuMScKK2RxcmVkMTQxIHJlZHVjZSAnLTIuMCcgICAgLT4gICctMicKK2RxcmVkMTQyIHJlZHVjZSAnMS4yMDAnICAgLT4gICcxLjInCitkcXJlZDE0MyByZWR1Y2UgJy0xMjAnICAgIC0+ICAnLTEuMkUrMicKK2RxcmVkMTQ0IHJlZHVjZSAnMTIwLjAwJyAgLT4gICcxLjJFKzInCitkcXJlZDE0NSByZWR1Y2UgJzAuMDAnICAgIC0+ICAnMCcKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKKy0tIG5vdGUgb3JpZ2FtaSBlZmZlY3Qgb24gc29tZSBvZiB0aGVzZQorZHFyZWQxNTEgcmVkdWNlICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcXJlZDE1MiByZWR1Y2UgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MDAwMDAwMDAwRSs2MTQwICAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwMDAwMEUrNjE0MAorZHFyZWQxNTMgcmVkdWNlICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MDAwMEUrNjE0NCAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwMDAwRSs2MTQ0CitkcXJlZDE1NCByZWR1Y2UgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgLT4gMUUtNjE0MworZHFyZWQxNTUgcmVkdWNlICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgIC0+IDFFLTYxNDMKK2RxcmVkMTU2IHJlZHVjZSAgMi4wMDBFLTYxNzMgICAgICAgICAgICAgICAtPiAyRS02MTczICAgU3Vibm9ybWFsCitkcXJlZDE1NyByZWR1Y2UgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgLT4gMUUtNjE3NiAgIFN1Ym5vcm1hbAorCitkcXJlZDE2MSByZWR1Y2UgIC0xRS02MTc2ICAgICAgICAgICAgICAgICAgLT4gLTFFLTYxNzYgIFN1Ym5vcm1hbAorZHFyZWQxNjIgcmVkdWNlICAtMi4wMDBFLTYxNzMgICAgICAgICAgICAgIC0+IC0yRS02MTczICBTdWJub3JtYWwKK2RxcmVkMTYzIHJlZHVjZSAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAtMUUtNjE0MworZHFyZWQxNjQgcmVkdWNlICAtMUUtNjE0MyAgICAgICAgICAgICAgICAgIC0+IC0xRS02MTQzCitkcXJlZDE2NSByZWR1Y2UgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTAwMDAwMDAwMEUrNjE0MCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MDAwMDBFKzYxNDAKK2RxcmVkMTY2IHJlZHVjZSAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwMDAwRSs2MTQ0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTAwMDBFKzYxNDQKK2RxcmVkMTY3IHJlZHVjZSAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwRSs2MTQ0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTBFKzYxNDQKK2RxcmVkMTY4IHJlZHVjZSAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxcmVkMTY5IHJlZHVjZSAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwRSs2MTQ0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTBFKzYxNDQKKworCistLSBzcGVjaWFscyAocmVkdWNlIGRvZXMgbm90IGFmZmVjdCBwYXlsb2FkKQorZHFyZWQ4MjAgcmVkdWNlICdJbmYnICAgIC0+ICdJbmZpbml0eScKK2RxcmVkODIxIHJlZHVjZSAnLUluZicgICAtPiAnLUluZmluaXR5JworZHFyZWQ4MjIgcmVkdWNlICAgTmFOICAgIC0+ICBOYU4KK2RxcmVkODIzIHJlZHVjZSAgc05hTiAgICAtPiAgTmFOICAgIEludmFsaWRfb3BlcmF0aW9uCitkcXJlZDgyNCByZWR1Y2UgICBOYU4xMDEgLT4gIE5hTjEwMQorZHFyZWQ4MjUgcmVkdWNlICBzTmFOMDEwIC0+ICBOYU4xMCAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVkODI3IHJlZHVjZSAgLU5hTiAgICAtPiAtTmFOCitkcXJlZDgyOCByZWR1Y2UgLXNOYU4gICAgLT4gLU5hTiAgICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZWQ4MjkgcmVkdWNlICAtTmFOMTAxIC0+IC1OYU4xMDEKK2RxcmVkODMwIHJlZHVjZSAtc05hTjAxMCAtPiAtTmFOMTAgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdAorZHFyZWQ5MDAgcmVkdWNlICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVJlbWFpbmRlci5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVJlbWFpbmRlci5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MGQzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxUmVtYWluZGVyLmRlY1Rlc3QKQEAgLTAsMCArMSw1OTcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFSZW1haW5kZXIuZGVjVGVzdCAtLSBkZWNRdWFkIHJlbWFpbmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzIChhcyBiYXNlLCBhYm92ZSkKK2RxcmVtMDAxIHJlbWFpbmRlciAgMSAgICAgMSAgICAtPiAgMAorZHFyZW0wMDIgcmVtYWluZGVyICAyICAgICAxICAgIC0+ICAwCitkcXJlbTAwMyByZW1haW5kZXIgIDEgICAgIDIgICAgLT4gIDEKK2RxcmVtMDA0IHJlbWFpbmRlciAgMiAgICAgMiAgICAtPiAgMAorZHFyZW0wMDUgcmVtYWluZGVyICAwICAgICAxICAgIC0+ICAwCitkcXJlbTAwNiByZW1haW5kZXIgIDAgICAgIDIgICAgLT4gIDAKK2RxcmVtMDA3IHJlbWFpbmRlciAgMSAgICAgMyAgICAtPiAgMQorZHFyZW0wMDggcmVtYWluZGVyICAyICAgICAzICAgIC0+ICAyCitkcXJlbTAwOSByZW1haW5kZXIgIDMgICAgIDMgICAgLT4gIDAKKworZHFyZW0wMTAgcmVtYWluZGVyICAyLjQgICAxICAgIC0+ICAwLjQKK2RxcmVtMDExIHJlbWFpbmRlciAgMi40ICAgLTEgICAtPiAgMC40CitkcXJlbTAxMiByZW1haW5kZXIgIC0yLjQgIDEgICAgLT4gIC0wLjQKK2RxcmVtMDEzIHJlbWFpbmRlciAgLTIuNCAgLTEgICAtPiAgLTAuNAorZHFyZW0wMTQgcmVtYWluZGVyICAyLjQwICAxICAgIC0+ICAwLjQwCitkcXJlbTAxNSByZW1haW5kZXIgIDIuNDAwIDEgICAgLT4gIDAuNDAwCitkcXJlbTAxNiByZW1haW5kZXIgIDIuNCAgIDIgICAgLT4gIDAuNAorZHFyZW0wMTcgcmVtYWluZGVyICAyLjQwMCAyICAgIC0+ICAwLjQwMAorZHFyZW0wMTggcmVtYWluZGVyICAyLiAgICAyICAgIC0+ICAwCitkcXJlbTAxOSByZW1haW5kZXIgIDIwICAgIDIwICAgLT4gIDAKKworZHFyZW0wMjAgcmVtYWluZGVyICAxODcgICAxODcgICAgLT4gIDAKK2RxcmVtMDIxIHJlbWFpbmRlciAgNSAgICAgMiAgICAgIC0+ICAxCitkcXJlbTAyMiByZW1haW5kZXIgIDUgICAgIDIuMCAgICAtPiAgMS4wCitkcXJlbTAyMyByZW1haW5kZXIgIDUgICAgIDIuMDAwICAtPiAgMS4wMDAKK2RxcmVtMDI0IHJlbWFpbmRlciAgNSAgICAgMC4yMDAgIC0+ICAwLjAwMAorZHFyZW0wMjUgcmVtYWluZGVyICA1ICAgICAwLjIwMCAgLT4gIDAuMDAwCisKK2RxcmVtMDMwIHJlbWFpbmRlciAgMSAgICAgMiAgICAgIC0+ICAxCitkcXJlbTAzMSByZW1haW5kZXIgIDEgICAgIDQgICAgICAtPiAgMQorZHFyZW0wMzIgcmVtYWluZGVyICAxICAgICA4ICAgICAgLT4gIDEKKworZHFyZW0wMzMgcmVtYWluZGVyICAxICAgICAxNiAgICAgLT4gIDEKK2RxcmVtMDM0IHJlbWFpbmRlciAgMSAgICAgMzIgICAgIC0+ICAxCitkcXJlbTAzNSByZW1haW5kZXIgIDEgICAgIDY0ICAgICAtPiAgMQorZHFyZW0wNDAgcmVtYWluZGVyICAxICAgIC0yICAgICAgLT4gIDEKK2RxcmVtMDQxIHJlbWFpbmRlciAgMSAgICAtNCAgICAgIC0+ICAxCitkcXJlbTA0MiByZW1haW5kZXIgIDEgICAgLTggICAgICAtPiAgMQorZHFyZW0wNDMgcmVtYWluZGVyICAxICAgIC0xNiAgICAgLT4gIDEKK2RxcmVtMDQ0IHJlbWFpbmRlciAgMSAgICAtMzIgICAgIC0+ICAxCitkcXJlbTA0NSByZW1haW5kZXIgIDEgICAgLTY0ICAgICAtPiAgMQorZHFyZW0wNTAgcmVtYWluZGVyIC0xICAgICAyICAgICAgLT4gIC0xCitkcXJlbTA1MSByZW1haW5kZXIgLTEgICAgIDQgICAgICAtPiAgLTEKK2RxcmVtMDUyIHJlbWFpbmRlciAtMSAgICAgOCAgICAgIC0+ICAtMQorZHFyZW0wNTMgcmVtYWluZGVyIC0xICAgICAxNiAgICAgLT4gIC0xCitkcXJlbTA1NCByZW1haW5kZXIgLTEgICAgIDMyICAgICAtPiAgLTEKK2RxcmVtMDU1IHJlbWFpbmRlciAtMSAgICAgNjQgICAgIC0+ICAtMQorZHFyZW0wNjAgcmVtYWluZGVyIC0xICAgIC0yICAgICAgLT4gIC0xCitkcXJlbTA2MSByZW1haW5kZXIgLTEgICAgLTQgICAgICAtPiAgLTEKK2RxcmVtMDYyIHJlbWFpbmRlciAtMSAgICAtOCAgICAgIC0+ICAtMQorZHFyZW0wNjMgcmVtYWluZGVyIC0xICAgIC0xNiAgICAgLT4gIC0xCitkcXJlbTA2NCByZW1haW5kZXIgLTEgICAgLTMyICAgICAtPiAgLTEKK2RxcmVtMDY1IHJlbWFpbmRlciAtMSAgICAtNjQgICAgIC0+ICAtMQorCitkcXJlbTA2NiByZW1haW5kZXIgIDk5OTk5OTk5OSAgICAgMSAgLT4gMAorZHFyZW0wNjcgcmVtYWluZGVyICA5OTk5OTk5OTkuNCAgIDEgIC0+IDAuNAorZHFyZW0wNjggcmVtYWluZGVyICA5OTk5OTk5OTkuNSAgIDEgIC0+IDAuNQorZHFyZW0wNjkgcmVtYWluZGVyICA5OTk5OTk5OTkuOSAgIDEgIC0+IDAuOQorZHFyZW0wNzAgcmVtYWluZGVyICA5OTk5OTk5OTkuOTk5IDEgIC0+IDAuOTk5CitkcXJlbTA3MSByZW1haW5kZXIgIDk5OTk5OS45OTk5OTkgMSAgLT4gMC45OTk5OTkKK2RxcmVtMDcyIHJlbWFpbmRlciAgOSAgICAgICAgICAgICAxICAtPiAwCisKK2RxcmVtMDgwIHJlbWFpbmRlciAgMC4gICAgICAgICAgICAxICAtPiAwCitkcXJlbTA4MSByZW1haW5kZXIgIC4wICAgICAgICAgICAgMSAgLT4gMC4wCitkcXJlbTA4MiByZW1haW5kZXIgIDAuMDAgICAgICAgICAgMSAgLT4gMC4wMAorZHFyZW0wODMgcmVtYWluZGVyICAwLjAwRSs5ICAgICAgIDEgIC0+IDAKK2RxcmVtMDg0IHJlbWFpbmRlciAgMC4wMEUrMyAgICAgICAxICAtPiAwCitkcXJlbTA4NSByZW1haW5kZXIgIDAuMDBFKzIgICAgICAgMSAgLT4gMAorZHFyZW0wODYgcmVtYWluZGVyICAwLjAwRSsxICAgICAgIDEgIC0+IDAuMAorZHFyZW0wODcgcmVtYWluZGVyICAwLjAwRSswICAgICAgIDEgIC0+IDAuMDAKK2RxcmVtMDg4IHJlbWFpbmRlciAgMC4wMEUtMCAgICAgICAxICAtPiAwLjAwCitkcXJlbTA4OSByZW1haW5kZXIgIDAuMDBFLTEgICAgICAgMSAgLT4gMC4wMDAKK2RxcmVtMDkwIHJlbWFpbmRlciAgMC4wMEUtMiAgICAgICAxICAtPiAwLjAwMDAKK2RxcmVtMDkxIHJlbWFpbmRlciAgMC4wMEUtMyAgICAgICAxICAtPiAwLjAwMDAwCitkcXJlbTA5MiByZW1haW5kZXIgIDAuMDBFLTQgICAgICAgMSAgLT4gMC4wMDAwMDAKK2RxcmVtMDkzIHJlbWFpbmRlciAgMC4wMEUtNSAgICAgICAxICAtPiAwRS03CitkcXJlbTA5NCByZW1haW5kZXIgIDAuMDBFLTYgICAgICAgMSAgLT4gMEUtOAorZHFyZW0wOTUgcmVtYWluZGVyICAwLjAwMDBFLTUwICAgIDEgIC0+IDBFLTU0CisKKy0tIFZhcmlvdXMgZmxhdm91cnMgb2YgcmVtYWluZGVyIGJ5IDAKK2RxcmVtMTAxIHJlbWFpbmRlciAgMCAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFyZW0xMDIgcmVtYWluZGVyICAwICAgICAgLTAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcXJlbTEwMyByZW1haW5kZXIgLTAgICAgICAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxcmVtMTA0IHJlbWFpbmRlciAtMCAgICAgIC0wICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFyZW0xMDUgcmVtYWluZGVyICAwLjBFNSAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcXJlbTEwNiByZW1haW5kZXIgIDAuMDAwICAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKKy0tIFtTb21lIHRoaW5rIHRoaXMgbmV4dCBncm91cCBzaG91bGQgYmUgRGl2aXNpb25fYnlfemVybyBleGNlcHRpb24sIGJ1dAorLS0gSUVFRSA4NTQgaXMgZXhwbGljaXQgdGhhdCBpdCBpcyBJbnZhbGlkIG9wZXJhdGlvbiAuLiBmb3IKKy0tIHJlbWFpbmRlci1uZWFyLCBhbnl3YXldCitkcXJlbTEwNyByZW1haW5kZXIgIDAuMDAwMSAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0xMDggcmVtYWluZGVyICAwLjAxICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMTA5IHJlbWFpbmRlciAgMC4xICAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTExMCByZW1haW5kZXIgIDEgICAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0xMTEgcmVtYWluZGVyICAxICAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMTEyIHJlbWFpbmRlciAxMCAgICAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTExMyByZW1haW5kZXIgMUUrMTAwICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0xMTQgcmVtYWluZGVyIDFFKzM4MCAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMTE1IHJlbWFpbmRlciAgMC4wMDAxIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTExNiByZW1haW5kZXIgIDAuMDEgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0xMTkgcmVtYWluZGVyICAwLjEgICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMTIwIHJlbWFpbmRlciAgMSAgICAgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTEyMSByZW1haW5kZXIgIDEgICAgICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0xMjIgcmVtYWluZGVyIDEwICAgICAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMTIzIHJlbWFpbmRlciAxRSsxMDAgIC0wLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTEyNCByZW1haW5kZXIgMUUrMzg0ICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYW5kIHplcm9zIG9uIGxlZnQKK2RxcmVtMTMwIHJlbWFpbmRlciAgMCAgICAgIDEgICAtPiAgMAorZHFyZW0xMzEgcmVtYWluZGVyICAwICAgICAtMSAgIC0+ICAwCitkcXJlbTEzMiByZW1haW5kZXIgIDAuMCAgICAxICAgLT4gIDAuMAorZHFyZW0xMzMgcmVtYWluZGVyICAwLjAgICAtMSAgIC0+ICAwLjAKK2RxcmVtMTM0IHJlbWFpbmRlciAtMCAgICAgIDEgICAtPiAtMAorZHFyZW0xMzUgcmVtYWluZGVyIC0wICAgICAtMSAgIC0+IC0wCitkcXJlbTEzNiByZW1haW5kZXIgLTAuMCAgICAxICAgLT4gLTAuMAorZHFyZW0xMzcgcmVtYWluZGVyIC0wLjAgICAtMSAgIC0+IC0wLjAKKworLS0gMC41ZXJzCitkcXJlbTE0MyByZW1haW5kZXIgICAwLjUgIDIgICAgIC0+ICAwLjUKK2RxcmVtMTQ0IHJlbWFpbmRlciAgIDAuNSAgMi4xICAgLT4gIDAuNQorZHFyZW0xNDUgcmVtYWluZGVyICAgMC41ICAyLjAxICAtPiAgMC41MAorZHFyZW0xNDYgcmVtYWluZGVyICAgMC41ICAyLjAwMSAtPiAgMC41MDAKK2RxcmVtMTQ3IHJlbWFpbmRlciAgIDAuNTAgMiAgICAgLT4gIDAuNTAKK2RxcmVtMTQ4IHJlbWFpbmRlciAgIDAuNTAgMi4wMSAgLT4gIDAuNTAKK2RxcmVtMTQ5IHJlbWFpbmRlciAgIDAuNTAgMi4wMDEgLT4gIDAuNTAwCisKKy0tIHN0ZWFkaWVzCitkcXJlbTE1MCByZW1haW5kZXIgIDEgIDEgICAtPiAwCitkcXJlbTE1MSByZW1haW5kZXIgIDEgIDIgICAtPiAxCitkcXJlbTE1MiByZW1haW5kZXIgIDEgIDMgICAtPiAxCitkcXJlbTE1MyByZW1haW5kZXIgIDEgIDQgICAtPiAxCitkcXJlbTE1NCByZW1haW5kZXIgIDEgIDUgICAtPiAxCitkcXJlbTE1NSByZW1haW5kZXIgIDEgIDYgICAtPiAxCitkcXJlbTE1NiByZW1haW5kZXIgIDEgIDcgICAtPiAxCitkcXJlbTE1NyByZW1haW5kZXIgIDEgIDggICAtPiAxCitkcXJlbTE1OCByZW1haW5kZXIgIDEgIDkgICAtPiAxCitkcXJlbTE1OSByZW1haW5kZXIgIDEgIDEwICAtPiAxCitkcXJlbTE2MCByZW1haW5kZXIgIDEgIDEgICAtPiAwCitkcXJlbTE2MSByZW1haW5kZXIgIDIgIDEgICAtPiAwCitkcXJlbTE2MiByZW1haW5kZXIgIDMgIDEgICAtPiAwCitkcXJlbTE2MyByZW1haW5kZXIgIDQgIDEgICAtPiAwCitkcXJlbTE2NCByZW1haW5kZXIgIDUgIDEgICAtPiAwCitkcXJlbTE2NSByZW1haW5kZXIgIDYgIDEgICAtPiAwCitkcXJlbTE2NiByZW1haW5kZXIgIDcgIDEgICAtPiAwCitkcXJlbTE2NyByZW1haW5kZXIgIDggIDEgICAtPiAwCitkcXJlbTE2OCByZW1haW5kZXIgIDkgIDEgICAtPiAwCitkcXJlbTE2OSByZW1haW5kZXIgIDEwIDEgICAtPiAwCisKKy0tIHNvbWUgZGlmZmVyZW5jZXMgZnJvbSByZW1haW5kZXJOZWFyCitkcXJlbTE3MSByZW1haW5kZXIgICAwLjQgIDEuMDIwIC0+ICAwLjQwMAorZHFyZW0xNzIgcmVtYWluZGVyICAgMC41MCAxLjAyMCAtPiAgMC41MDAKK2RxcmVtMTczIHJlbWFpbmRlciAgIDAuNTEgMS4wMjAgLT4gIDAuNTEwCitkcXJlbTE3NCByZW1haW5kZXIgICAwLjUyIDEuMDIwIC0+ICAwLjUyMAorZHFyZW0xNzUgcmVtYWluZGVyICAgMC42ICAxLjAyMCAtPiAgMC42MDAKKworLS0gTW9yZSBmbGF2b3VycyBvZiByZW1haW5kZXIgYnkgMAorZHFyZW0yMDEgcmVtYWluZGVyICAwICAgICAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxcmVtMjAyIHJlbWFpbmRlciAgMC4wRTUgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcXJlbTIwMyByZW1haW5kZXIgIDAuMDAwICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFyZW0yMDQgcmVtYWluZGVyICAwLjAwMDEgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0yMDUgcmVtYWluZGVyICAwLjAxICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0yMDYgcmVtYWluZGVyICAwLjEgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0yMDcgcmVtYWluZGVyICAxICAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0yMDggcmVtYWluZGVyICAxICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0yMDkgcmVtYWluZGVyIDEwICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0yMTAgcmVtYWluZGVyIDFFKzEwMCAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0yMTEgcmVtYWluZGVyIDFFKzM4MCAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBzb21lIGRpZmZlcmVuY2VzIGZyb20gcmVtYWluZGVyTmVhcgorZHFyZW0yMzEgcmVtYWluZGVyICAtMC40ICAxLjAyMCAtPiAtMC40MDAKK2RxcmVtMjMyIHJlbWFpbmRlciAgLTAuNTAgMS4wMjAgLT4gLTAuNTAwCitkcXJlbTIzMyByZW1haW5kZXIgIC0wLjUxIDEuMDIwIC0+IC0wLjUxMAorZHFyZW0yMzQgcmVtYWluZGVyICAtMC41MiAxLjAyMCAtPiAtMC41MjAKK2RxcmVtMjM1IHJlbWFpbmRlciAgLTAuNiAgMS4wMjAgLT4gLTAuNjAwCisKKy0tIGhpZ2ggWHMKK2RxcmVtMjQwIHJlbWFpbmRlciAgMUUrMiAgMS4wMCAgLT4gIDAuMDAKKworLS0gZHFyZW0zeHggYXJlIGZyb20gRGlhZ0JpZ0RlY2ltYWwKK2RxcmVtMzAxIHJlbWFpbmRlciAgIDEgICAgMyAgICAgLT4gIDEKK2RxcmVtMzAyIHJlbWFpbmRlciAgIDUgICAgNSAgICAgLT4gIDAKK2RxcmVtMzAzIHJlbWFpbmRlciAgIDEzICAgMTAgICAgLT4gIDMKK2RxcmVtMzA0IHJlbWFpbmRlciAgIDEzICAgNTAgICAgLT4gIDEzCitkcXJlbTMwNSByZW1haW5kZXIgICAxMyAgIDEwMCAgIC0+ICAxMworZHFyZW0zMDYgcmVtYWluZGVyICAgMTMgICAxMDAwICAtPiAgMTMKK2RxcmVtMzA3IHJlbWFpbmRlciAgIC4xMyAgICAxICAgLT4gIDAuMTMKK2RxcmVtMzA4IHJlbWFpbmRlciAgIDAuMTMzICAxICAgLT4gIDAuMTMzCitkcXJlbTMwOSByZW1haW5kZXIgICAwLjEwMzMgMSAgIC0+ICAwLjEwMzMKK2RxcmVtMzEwIHJlbWFpbmRlciAgIDEuMDMzICAxICAgLT4gIDAuMDMzCitkcXJlbTMxMSByZW1haW5kZXIgICAxMC4zMyAgMSAgIC0+ICAwLjMzCitkcXJlbTMxMiByZW1haW5kZXIgICAxMC4zMyAxMCAgIC0+ICAwLjMzCitkcXJlbTMxMyByZW1haW5kZXIgICAxMDMuMyAgMSAgIC0+ICAwLjMKK2RxcmVtMzE0IHJlbWFpbmRlciAgIDEzMyAgIDEwICAgLT4gIDMKK2RxcmVtMzE1IHJlbWFpbmRlciAgIDEwMzMgIDEwICAgLT4gIDMKK2RxcmVtMzE2IHJlbWFpbmRlciAgIDEwMzMgIDUwICAgLT4gIDMzCitkcXJlbTMxNyByZW1haW5kZXIgICAxMDEuMCAgMyAgIC0+ICAyLjAKK2RxcmVtMzE4IHJlbWFpbmRlciAgIDEwMi4wICAzICAgLT4gIDAuMAorZHFyZW0zMTkgcmVtYWluZGVyICAgMTAzLjAgIDMgICAtPiAgMS4wCitkcXJlbTMyMCByZW1haW5kZXIgICAyLjQwICAgMSAgIC0+ICAwLjQwCitkcXJlbTMyMSByZW1haW5kZXIgICAyLjQwMCAgMSAgIC0+ICAwLjQwMAorZHFyZW0zMjIgcmVtYWluZGVyICAgMi40ICAgIDEgICAtPiAgMC40CitkcXJlbTMyMyByZW1haW5kZXIgICAyLjQgICAgMiAgIC0+ICAwLjQKK2RxcmVtMzI0IHJlbWFpbmRlciAgIDIuNDAwICAyICAgLT4gIDAuNDAwCitkcXJlbTMyNSByZW1haW5kZXIgICAxICAgMC4zICAgIC0+ICAwLjEKK2RxcmVtMzI2IHJlbWFpbmRlciAgIDEgICAwLjMwICAgLT4gIDAuMTAKK2RxcmVtMzI3IHJlbWFpbmRlciAgIDEgICAwLjMwMCAgLT4gIDAuMTAwCitkcXJlbTMyOCByZW1haW5kZXIgICAxICAgMC4zMDAwIC0+ICAwLjEwMDAKK2RxcmVtMzI5IHJlbWFpbmRlciAgIDEuMCAgICAwLjMgLT4gIDAuMQorZHFyZW0zMzAgcmVtYWluZGVyICAgMS4wMCAgIDAuMyAtPiAgMC4xMAorZHFyZW0zMzEgcmVtYWluZGVyICAgMS4wMDAgIDAuMyAtPiAgMC4xMDAKK2RxcmVtMzMyIHJlbWFpbmRlciAgIDEuMDAwMCAwLjMgLT4gIDAuMTAwMAorZHFyZW0zMzMgcmVtYWluZGVyICAgMC41ICAyICAgICAtPiAgMC41CitkcXJlbTMzNCByZW1haW5kZXIgICAwLjUgIDIuMSAgIC0+ICAwLjUKK2RxcmVtMzM1IHJlbWFpbmRlciAgIDAuNSAgMi4wMSAgLT4gIDAuNTAKK2RxcmVtMzM2IHJlbWFpbmRlciAgIDAuNSAgMi4wMDEgLT4gIDAuNTAwCitkcXJlbTMzNyByZW1haW5kZXIgICAwLjUwIDIgICAgIC0+ICAwLjUwCitkcXJlbTMzOCByZW1haW5kZXIgICAwLjUwIDIuMDEgIC0+ICAwLjUwCitkcXJlbTMzOSByZW1haW5kZXIgICAwLjUwIDIuMDAxIC0+ICAwLjUwMAorCitkcXJlbTM0MCByZW1haW5kZXIgICAwLjUgICAwLjUwMDAwMDEgICAgLT4gIDAuNTAwMDAwMAorZHFyZW0zNDEgcmVtYWluZGVyICAgMC41ICAgMC41MDAwMDAwMSAgICAtPiAgMC41MDAwMDAwMAorZHFyZW0zNDIgcmVtYWluZGVyICAgMC41ICAgMC41MDAwMDAwMDEgICAgLT4gIDAuNTAwMDAwMDAwCitkcXJlbTM0MyByZW1haW5kZXIgICAwLjUgICAwLjUwMDAwMDAwMDEgICAgLT4gIDAuNTAwMDAwMDAwMAorZHFyZW0zNDQgcmVtYWluZGVyICAgMC41ICAgMC41MDAwMDAwMDAwMSAgICAtPiAgMC41MDAwMDAwMDAwMAorZHFyZW0zNDUgcmVtYWluZGVyICAgMC41ICAgMC40OTk5OTk5ICAgIC0+ICAxRS03CitkcXJlbTM0NiByZW1haW5kZXIgICAwLjUgICAwLjQ5OTk5OTk5ICAgIC0+ICAxRS04CitkcXJlbTM0NyByZW1haW5kZXIgICAwLjUgICAwLjQ5OTk5OTk5OSAgICAtPiAgMUUtOQorZHFyZW0zNDggcmVtYWluZGVyICAgMC41ICAgMC40OTk5OTk5OTk5ICAgIC0+ICAxRS0xMAorZHFyZW0zNDkgcmVtYWluZGVyICAgMC41ICAgMC40OTk5OTk5OTk5OSAgICAtPiAgMUUtMTEKK2RxcmVtMzUwIHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OTk5OTk5ICAgIC0+ICAxRS0xMgorCitkcXJlbTM1MSByZW1haW5kZXIgICAwLjAzICA3ICAtPiAgMC4wMworZHFyZW0zNTIgcmVtYWluZGVyICAgNSAgIDIgICAgLT4gIDEKK2RxcmVtMzUzIHJlbWFpbmRlciAgIDQuMSAgIDIgICAgLT4gIDAuMQorZHFyZW0zNTQgcmVtYWluZGVyICAgNC4wMSAgIDIgICAgLT4gIDAuMDEKK2RxcmVtMzU1IHJlbWFpbmRlciAgIDQuMDAxICAgMiAgICAtPiAgMC4wMDEKK2RxcmVtMzU2IHJlbWFpbmRlciAgIDQuMDAwMSAgIDIgICAgLT4gIDAuMDAwMQorZHFyZW0zNTcgcmVtYWluZGVyICAgNC4wMDAwMSAgIDIgICAgLT4gIDAuMDAwMDEKK2RxcmVtMzU4IHJlbWFpbmRlciAgIDQuMDAwMDAxICAgMiAgICAtPiAgMC4wMDAwMDEKK2RxcmVtMzU5IHJlbWFpbmRlciAgIDQuMDAwMDAwMSAgIDIgICAgLT4gIDFFLTcKKworZHFyZW0zNjAgcmVtYWluZGVyICAgMS4yICAgMC43MzQ1IC0+ICAwLjQ2NTUKK2RxcmVtMzYxIHJlbWFpbmRlciAgIDAuOCAgIDEyICAgICAtPiAgMC44CitkcXJlbTM2MiByZW1haW5kZXIgICAwLjggICAwLjIgICAgLT4gIDAuMAorZHFyZW0zNjMgcmVtYWluZGVyICAgMC44ICAgMC4zICAgIC0+ICAwLjIKK2RxcmVtMzY0IHJlbWFpbmRlciAgIDAuODAwICAgMTIgICAtPiAgMC44MDAKK2RxcmVtMzY1IHJlbWFpbmRlciAgIDAuODAwICAgMS43ICAtPiAgMC44MDAKK2RxcmVtMzY2IHJlbWFpbmRlciAgIDIuNDAwICAgMiAgICAtPiAgMC40MDAKKworZHFyZW0zNzEgcmVtYWluZGVyICAgMi40MDAgIDIgICAgICAgIC0+ICAwLjQwMAorCitkcXJlbTM4MSByZW1haW5kZXIgMTIzNDUgIDEgICAgICAgICAtPiAgMAorZHFyZW0zODIgcmVtYWluZGVyIDEyMzQ1ICAxLjAwMDEgICAgLT4gIDAuNzY1NworZHFyZW0zODMgcmVtYWluZGVyIDEyMzQ1ICAxLjAwMSAgICAgLT4gIDAuNjY4CitkcXJlbTM4NCByZW1haW5kZXIgMTIzNDUgIDEuMDEgICAgICAtPiAgMC43OAorZHFyZW0zODUgcmVtYWluZGVyIDEyMzQ1ICAxLjEgICAgICAgLT4gIDAuOAorZHFyZW0zODYgcmVtYWluZGVyIDEyMzU1ICA0ICAgICAgICAgLT4gIDMKK2RxcmVtMzg3IHJlbWFpbmRlciAxMjM0NSAgNCAgICAgICAgIC0+ICAxCitkcXJlbTM4OCByZW1haW5kZXIgMTIzNTUgIDQuMDAwMSAgICAtPiAgMi42OTEyCitkcXJlbTM4OSByZW1haW5kZXIgMTIzNDUgIDQuMDAwMSAgICAtPiAgMC42OTE0CitkcXJlbTM5MCByZW1haW5kZXIgMTIzNDUgIDQuOSAgICAgICAtPiAgMS45CitkcXJlbTM5MSByZW1haW5kZXIgMTIzNDUgIDQuOTkgICAgICAtPiAgNC43MworZHFyZW0zOTIgcmVtYWluZGVyIDEyMzQ1ICA0Ljk5OSAgICAgLT4gIDIuNDY5CitkcXJlbTM5MyByZW1haW5kZXIgMTIzNDUgIDQuOTk5OSAgICAtPiAgMC4yNDY5CitkcXJlbTM5NCByZW1haW5kZXIgMTIzNDUgIDUgICAgICAgICAtPiAgMAorZHFyZW0zOTUgcmVtYWluZGVyIDEyMzQ1ICA1LjAwMDEgICAgLT4gIDQuNzUzMgorZHFyZW0zOTYgcmVtYWluZGVyIDEyMzQ1ICA1LjAwMSAgICAgLT4gIDIuNTMyCitkcXJlbTM5NyByZW1haW5kZXIgMTIzNDUgIDUuMDEgICAgICAtPiAgMC4zNgorZHFyZW0zOTggcmVtYWluZGVyIDEyMzQ1ICA1LjEgICAgICAgLT4gIDMuMAorCistLSB0aGUgbmFzdHkgZGl2aXNpb24tYnktMSBjYXNlcworZHFyZW00MDEgcmVtYWluZGVyICAgMC41ICAgICAgICAgMSAgIC0+ICAwLjUKK2RxcmVtNDAyIHJlbWFpbmRlciAgIDAuNTUgICAgICAgIDEgICAtPiAgMC41NQorZHFyZW00MDMgcmVtYWluZGVyICAgMC41NTUgICAgICAgMSAgIC0+ICAwLjU1NQorZHFyZW00MDQgcmVtYWluZGVyICAgMC41NTU1ICAgICAgMSAgIC0+ICAwLjU1NTUKK2RxcmVtNDA1IHJlbWFpbmRlciAgIDAuNTU1NTUgICAgIDEgICAtPiAgMC41NTU1NQorZHFyZW00MDYgcmVtYWluZGVyICAgMC41NTU1NTUgICAgMSAgIC0+ICAwLjU1NTU1NQorZHFyZW00MDcgcmVtYWluZGVyICAgMC41NTU1NTU1ICAgMSAgIC0+ICAwLjU1NTU1NTUKK2RxcmVtNDA4IHJlbWFpbmRlciAgIDAuNTU1NTU1NTUgIDEgICAtPiAgMC41NTU1NTU1NQorZHFyZW00MDkgcmVtYWluZGVyICAgMC41NTU1NTU1NTUgMSAgIC0+ICAwLjU1NTU1NTU1NQorCistLSBmb2xkZG93bnMKK2RxcmVtNDIxIHJlbWFpbmRlciAgIDFFKzYxNDQgICAgICAgIDEgIC0+ICAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RxcmVtNDIyIHJlbWFpbmRlciAgIDFFKzYxNDQgIDFFKzYxNDMgIC0+ICAgMEUrNjExMSBDbGFtcGVkCitkcXJlbTQyMyByZW1haW5kZXIgICAxRSs2MTQ0ICAyRSs2MTQzICAtPiAgIDBFKzYxMTEgQ2xhbXBlZAorZHFyZW00MjQgcmVtYWluZGVyICAgMUUrNjE0NCAgM0UrNjE0MyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzIENsYW1wZWQKK2RxcmVtNDI1IHJlbWFpbmRlciAgIDFFKzYxNDQgIDRFKzYxNDMgIC0+ICAgMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MyBDbGFtcGVkCitkcXJlbTQyNiByZW1haW5kZXIgICAxRSs2MTQ0ICA1RSs2MTQzICAtPiAgIDBFKzYxMTEgQ2xhbXBlZAorZHFyZW00MjcgcmVtYWluZGVyICAgMUUrNjE0NCAgNkUrNjE0MyAgLT4gICA0LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzIENsYW1wZWQKK2RxcmVtNDI4IHJlbWFpbmRlciAgIDFFKzYxNDQgIDdFKzYxNDMgIC0+ICAgMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MyBDbGFtcGVkCitkcXJlbTQyOSByZW1haW5kZXIgICAxRSs2MTQ0ICA4RSs2MTQzICAtPiAgIDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDMgQ2xhbXBlZAorZHFyZW00MzAgcmVtYWluZGVyICAgMUUrNjE0NCAgOUUrNjE0MyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzIENsYW1wZWQKKy0tIHRpbmllcworZHFyZW00MzEgcmVtYWluZGVyICAgMUUtNjE3NSAgMUUtNjE3NiAgLT4gICAwRS02MTc2CitkcXJlbTQzMiByZW1haW5kZXIgICAxRS02MTc1ICAyRS02MTc2ICAtPiAgIDBFLTYxNzYKK2RxcmVtNDMzIHJlbWFpbmRlciAgIDFFLTYxNzUgIDNFLTYxNzYgIC0+ICAgMUUtNjE3NiBTdWJub3JtYWwKK2RxcmVtNDM0IHJlbWFpbmRlciAgIDFFLTYxNzUgIDRFLTYxNzYgIC0+ICAgMkUtNjE3NiBTdWJub3JtYWwKK2RxcmVtNDM1IHJlbWFpbmRlciAgIDFFLTYxNzUgIDVFLTYxNzYgIC0+ICAgMEUtNjE3NgorZHFyZW00MzYgcmVtYWluZGVyICAgMUUtNjE3NSAgNkUtNjE3NiAgLT4gICA0RS02MTc2IFN1Ym5vcm1hbAorZHFyZW00MzcgcmVtYWluZGVyICAgMUUtNjE3NSAgN0UtNjE3NiAgLT4gICAzRS02MTc2IFN1Ym5vcm1hbAorZHFyZW00MzggcmVtYWluZGVyICAgMUUtNjE3NSAgOEUtNjE3NiAgLT4gICAyRS02MTc2IFN1Ym5vcm1hbAorZHFyZW00MzkgcmVtYWluZGVyICAgMUUtNjE3NSAgOUUtNjE3NiAgLT4gICAxRS02MTc2IFN1Ym5vcm1hbAorZHFyZW00NDAgcmVtYWluZGVyICAgMUUtNjE3NSAxMEUtNjE3NiAgLT4gICAwRS02MTc2CitkcXJlbTQ0MSByZW1haW5kZXIgICAxRS02MTc1IDExRS02MTc2ICAtPiAxLjBFLTYxNzUgU3Vibm9ybWFsCitkcXJlbTQ0MiByZW1haW5kZXIgMTAwRS02MTc1IDExRS02MTc2ICAtPiAxLjBFLTYxNzUgU3Vibm9ybWFsCitkcXJlbTQ0MyByZW1haW5kZXIgMTAwRS02MTc1IDIwRS02MTc2ICAtPiAgIDBFLTYxNzYKK2RxcmVtNDQ0IHJlbWFpbmRlciAxMDBFLTYxNzUgMjFFLTYxNzYgIC0+IDEuM0UtNjE3NSBTdWJub3JtYWwKK2RxcmVtNDQ1IHJlbWFpbmRlciAxMDBFLTYxNzUgMzBFLTYxNzYgIC0+IDEuMEUtNjE3NSBTdWJub3JtYWwKKworLS0gemVybyBzaWducworZHFyZW02NTAgcmVtYWluZGVyICAxICAxIC0+ICAwCitkcXJlbTY1MSByZW1haW5kZXIgLTEgIDEgLT4gLTAKK2RxcmVtNjUyIHJlbWFpbmRlciAgMSAtMSAtPiAgMAorZHFyZW02NTMgcmVtYWluZGVyIC0xIC0xIC0+IC0wCitkcXJlbTY1NCByZW1haW5kZXIgIDAgIDEgLT4gIDAKK2RxcmVtNjU1IHJlbWFpbmRlciAtMCAgMSAtPiAtMAorZHFyZW02NTYgcmVtYWluZGVyICAwIC0xIC0+ICAwCitkcXJlbTY1NyByZW1haW5kZXIgLTAgLTEgLT4gLTAKK2RxcmVtNjU4IHJlbWFpbmRlciAgMC4wMCAgMSAgLT4gIDAuMDAKK2RxcmVtNjU5IHJlbWFpbmRlciAtMC4wMCAgMSAgLT4gLTAuMDAKKworLS0gU3BlY2lhbHMKK2RxcmVtNjgwIHJlbWFpbmRlciAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW02ODEgcmVtYWluZGVyICBJbmYgIC0xMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTY4MiByZW1haW5kZXIgIEluZiAgLTEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNjgzIHJlbWFpbmRlciAgSW5mICAgMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW02ODQgcmVtYWluZGVyICBJbmYgIC0wICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTY4NSByZW1haW5kZXIgIEluZiAgIDEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNjg2IHJlbWFpbmRlciAgSW5mICAgMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW02ODcgcmVtYWluZGVyICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTY4OCByZW1haW5kZXIgLTEwMDAgIEluZiAgIC0+IC0xMDAwCitkcXJlbTY4OSByZW1haW5kZXIgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNjkxIHJlbWFpbmRlciAtMSAgICAgSW5mICAgLT4gLTEKK2RxcmVtNjkyIHJlbWFpbmRlciAgMCAgICAgSW5mICAgLT4gIDAKK2RxcmVtNjkzIHJlbWFpbmRlciAtMCAgICAgSW5mICAgLT4gLTAKK2RxcmVtNjk0IHJlbWFpbmRlciAgMSAgICAgSW5mICAgLT4gIDEKK2RxcmVtNjk1IHJlbWFpbmRlciAgMTAwMCAgSW5mICAgLT4gIDEwMDAKK2RxcmVtNjk2IHJlbWFpbmRlciAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcXJlbTcwMCByZW1haW5kZXIgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzAxIHJlbWFpbmRlciAtSW5mICAtMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03MDIgcmVtYWluZGVyIC1JbmYgIC0xICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTcwMyByZW1haW5kZXIgLUluZiAgLTAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzA0IHJlbWFpbmRlciAtSW5mICAgMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03MDUgcmVtYWluZGVyIC1JbmYgICAxICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTcwNiByZW1haW5kZXIgLUluZiAgIDEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzA3IHJlbWFpbmRlciAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03MDggcmVtYWluZGVyIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTcwOSByZW1haW5kZXIgLTEwMDAgIEluZiAgIC0+IC0xMDAwCitkcXJlbTcxMCByZW1haW5kZXIgLTEgICAgLUluZiAgIC0+IC0xCitkcXJlbTcxMSByZW1haW5kZXIgLTAgICAgLUluZiAgIC0+IC0wCitkcXJlbTcxMiByZW1haW5kZXIgIDAgICAgLUluZiAgIC0+ICAwCitkcXJlbTcxMyByZW1haW5kZXIgIDEgICAgLUluZiAgIC0+ICAxCitkcXJlbTcxNCByZW1haW5kZXIgIDEwMDAgLUluZiAgIC0+ICAxMDAwCitkcXJlbTcxNSByZW1haW5kZXIgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFyZW03MjEgcmVtYWluZGVyICBOYU4gLUluZiAgICAtPiAgTmFOCitkcXJlbTcyMiByZW1haW5kZXIgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RxcmVtNzIzIHJlbWFpbmRlciAgTmFOIC0xICAgICAgLT4gIE5hTgorZHFyZW03MjQgcmVtYWluZGVyICBOYU4gLTAgICAgICAtPiAgTmFOCitkcXJlbTcyNSByZW1haW5kZXIgLU5hTiAgMCAgICAgIC0+IC1OYU4KK2RxcmVtNzI2IHJlbWFpbmRlciAgTmFOICAxICAgICAgLT4gIE5hTgorZHFyZW03MjcgcmVtYWluZGVyICBOYU4gIDEwMDAgICAtPiAgTmFOCitkcXJlbTcyOCByZW1haW5kZXIgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RxcmVtNzI5IHJlbWFpbmRlciAgTmFOIC1OYU4gICAgLT4gIE5hTgorZHFyZW03MzAgcmVtYWluZGVyIC1JbmYgIE5hTiAgICAtPiAgTmFOCitkcXJlbTczMSByZW1haW5kZXIgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RxcmVtNzMyIHJlbWFpbmRlciAtMSAgICBOYU4gICAgLT4gIE5hTgorZHFyZW03MzMgcmVtYWluZGVyIC0wICAgLU5hTiAgICAtPiAtTmFOCitkcXJlbTczNCByZW1haW5kZXIgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RxcmVtNzM1IHJlbWFpbmRlciAgMSAgIC1OYU4gICAgLT4gLU5hTgorZHFyZW03MzYgcmVtYWluZGVyICAxMDAwIE5hTiAgICAtPiAgTmFOCitkcXJlbTczNyByZW1haW5kZXIgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZHFyZW03NDEgcmVtYWluZGVyICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NDIgcmVtYWluZGVyICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NDMgcmVtYWluZGVyIC1zTmFOIC0xICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NDQgcmVtYWluZGVyICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NDUgcmVtYWluZGVyICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NDYgcmVtYWluZGVyICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NDcgcmVtYWluZGVyICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NDkgcmVtYWluZGVyICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NTAgcmVtYWluZGVyICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NTEgcmVtYWluZGVyICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NTIgcmVtYWluZGVyIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NTMgcmVtYWluZGVyIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NTQgcmVtYWluZGVyIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NTUgcmVtYWluZGVyIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NTYgcmVtYWluZGVyICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NTcgcmVtYWluZGVyICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NTggcmVtYWluZGVyICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NTkgcmVtYWluZGVyICBJbmYgLXNOYU4gICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdpbmcgTmFOcworZHFyZW03NjAgcmVtYWluZGVyICBOYU4xICAgTmFONyAgIC0+ICBOYU4xCitkcXJlbTc2MSByZW1haW5kZXIgc05hTjIgICBOYU44ICAgLT4gIE5hTjIgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzYyIHJlbWFpbmRlciAgTmFOMyAgc05hTjkgICAtPiAgTmFOOSBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NjMgcmVtYWluZGVyIHNOYU40ICBzTmFOMTAgIC0+ICBOYU40IEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTc2NCByZW1haW5kZXIgICAgMTUgICBOYU4xMSAgLT4gIE5hTjExCitkcXJlbTc2NSByZW1haW5kZXIgIE5hTjYgICBOYU4xMiAgLT4gIE5hTjYKK2RxcmVtNzY2IHJlbWFpbmRlciAgSW5mICAgIE5hTjEzICAtPiAgTmFOMTMKK2RxcmVtNzY3IHJlbWFpbmRlciAgTmFOMTQgIC1JbmYgICAtPiAgTmFOMTQKK2RxcmVtNzY4IHJlbWFpbmRlciAgICAwICAgIE5hTjE1ICAtPiAgTmFOMTUKK2RxcmVtNzY5IHJlbWFpbmRlciAgTmFOMTYgICAtMCAgICAtPiAgTmFOMTYKKworLS0gZWRnZSBjYXNlcyBvZiBpbXBvc3NpYmxlCitkcXJlbTc3MCAgcmVtYWluZGVyICAxMjM0NTY4ODg4ODg4ODg3Nzc3Nzc3Nzc3ODkwMTIzNDU2ICAxMCAgICAtPiAgNgorZHFyZW03NzEgIHJlbWFpbmRlciAgMTIzNDU2ODg4ODg4ODg4Nzc3Nzc3Nzc3Nzg5MDEyMzQ1NiAgIDEgICAgLT4gIDAKK2RxcmVtNzcyICByZW1haW5kZXIgIDEyMzQ1Njg4ODg4ODg4ODc3Nzc3Nzc3Nzc4OTAxMjM0NTYgICAwLjEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFyZW03NzMgIHJlbWFpbmRlciAgMTIzNDU2ODg4ODg4ODg4Nzc3Nzc3Nzc3Nzg5MDEyMzQ1NiAgIDAuMDEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKKy0tIGxvbmcgb3BlcmFuZCBjaGVja3MKK2RxcmVtODAxIHJlbWFpbmRlciAxMjM0NTY3ODAwMCAxMDAgLT4gMAorZHFyZW04MDIgcmVtYWluZGVyIDEgMTIzNDU2NzgwMDAgICAtPiAxCitkcXJlbTgwMyByZW1haW5kZXIgMTIzNDU2NzgwMCAgMTAgIC0+IDAKK2RxcmVtODA0IHJlbWFpbmRlciAxIDEyMzQ1Njc4MDAgICAgLT4gMQorZHFyZW04MDUgcmVtYWluZGVyIDEyMzQ1Njc4OTAgIDEwICAtPiAwCitkcXJlbTgwNiByZW1haW5kZXIgMSAxMjM0NTY3ODkwICAgIC0+IDEKK2RxcmVtODA3IHJlbWFpbmRlciAxMjM0NTY3ODkxICAxMCAgLT4gMQorZHFyZW04MDggcmVtYWluZGVyIDEgMTIzNDU2Nzg5MSAgICAtPiAxCitkcXJlbTgwOSByZW1haW5kZXIgMTIzNDU2Nzg5MDEgMTAwIC0+IDEKK2RxcmVtODEwIHJlbWFpbmRlciAxIDEyMzQ1Njc4OTAxICAgLT4gMQorZHFyZW04MTEgcmVtYWluZGVyIDEyMzQ1Njc4OTYgIDEwICAtPiA2CitkcXJlbTgxMiByZW1haW5kZXIgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworZHFyZW04MjEgcmVtYWluZGVyIDEyMzQ1Njc4MDAwIDEwMCAtPiAwCitkcXJlbTgyMiByZW1haW5kZXIgMSAxMjM0NTY3ODAwMCAgIC0+IDEKK2RxcmVtODIzIHJlbWFpbmRlciAxMjM0NTY3ODAwICAxMCAgLT4gMAorZHFyZW04MjQgcmVtYWluZGVyIDEgMTIzNDU2NzgwMCAgICAtPiAxCitkcXJlbTgyNSByZW1haW5kZXIgMTIzNDU2Nzg5MCAgMTAgIC0+IDAKK2RxcmVtODI2IHJlbWFpbmRlciAxIDEyMzQ1Njc4OTAgICAgLT4gMQorZHFyZW04MjcgcmVtYWluZGVyIDEyMzQ1Njc4OTEgIDEwICAtPiAxCitkcXJlbTgyOCByZW1haW5kZXIgMSAxMjM0NTY3ODkxICAgIC0+IDEKK2RxcmVtODI5IHJlbWFpbmRlciAxMjM0NTY3ODkwMSAxMDAgLT4gMQorZHFyZW04MzAgcmVtYWluZGVyIDEgMTIzNDU2Nzg5MDEgICAtPiAxCitkcXJlbTgzMSByZW1haW5kZXIgMTIzNDU2Nzg5NiAgMTAgIC0+IDYKK2RxcmVtODMyIHJlbWFpbmRlciAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCistLSBmcm9tIGRpdmlkZWludAorZHFyZW04NDAgcmVtYWluZGVyICAxMDAwMDAwMDAuMCAgIDEgIC0+ICAwLjAKK2RxcmVtODQxIHJlbWFpbmRlciAgMTAwMDAwMDAwLjQgICAxICAtPiAgMC40CitkcXJlbTg0MiByZW1haW5kZXIgIDEwMDAwMDAwMC41ICAgMSAgLT4gIDAuNQorZHFyZW04NDMgcmVtYWluZGVyICAxMDAwMDAwMDAuOSAgIDEgIC0+ICAwLjkKK2RxcmVtODQ0IHJlbWFpbmRlciAgMTAwMDAwMDAwLjk5OSAxICAtPiAgMC45OTkKK2RxcmVtODUwIHJlbWFpbmRlciAgMTAwMDAwMDAzICAgICA1ICAtPiAgMworZHFyZW04NTEgcmVtYWluZGVyICAxMDAwMDAwMyAgICAgIDUgIC0+ICAzCitkcXJlbTg1MiByZW1haW5kZXIgIDEwMDAwMDMgICAgICAgNSAgLT4gIDMKK2RxcmVtODUzIHJlbWFpbmRlciAgMTAwMDAzICAgICAgICA1ICAtPiAgMworZHFyZW04NTQgcmVtYWluZGVyICAxMDAwMyAgICAgICAgIDUgIC0+ICAzCitkcXJlbTg1NSByZW1haW5kZXIgIDEwMDMgICAgICAgICAgNSAgLT4gIDMKK2RxcmVtODU2IHJlbWFpbmRlciAgMTAzICAgICAgICAgICA1ICAtPiAgMworZHFyZW04NTcgcmVtYWluZGVyICAxMyAgICAgICAgICAgIDUgIC0+ICAzCitkcXJlbTg1OCByZW1haW5kZXIgIDEgICAgICAgICAgICAgNSAgLT4gIDEKKworLS0gVmxhZGltaXIncyBjYXNlcyAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RxcmVtODYwIHJlbWFpbmRlciAxMjMuMGUxIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2RxcmVtODYxIHJlbWFpbmRlciAxMjMwICAgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2RxcmVtODYyIHJlbWFpbmRlciAxMi4zZTIgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2RxcmVtODYzIHJlbWFpbmRlciAxLjIzZTMgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2RxcmVtODY0IHJlbWFpbmRlciAxMjNlMSAgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2RxcmVtODcwIHJlbWFpbmRlciAxMjNlMSAgICAxMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODcxIHJlbWFpbmRlciAxMjNlMSAgICAgMTAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODcyIHJlbWFpbmRlciAxMjNlMSAgICAgIDEwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODczIHJlbWFpbmRlciAxMjNlMSAgICAgICAxMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODc0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgMTAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODc1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgIDEwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODc2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAxMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODc3IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgMTAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODc4IHJlbWFpbmRlciAxMjMwICAgICAgICAgICAgMTAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODc5IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgIDEwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODgwIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAxMDAwMDAwIC0+IDEyMzAKK2RxcmVtODgxIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgMTAwMDAwIC0+IDEyMzAKK2RxcmVtODgyIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgIDEwMDAwIC0+IDEyMzAKK2RxcmVtODgzIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAxMDAwIC0+ICAyMzAKK2RxcmVtODg0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgMTAwIC0+ICAgMzAKK2RxcmVtODg1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgIDEwIC0+ICAgIDAKK2RxcmVtODg2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgICAxIC0+ICAgIDAKKworZHFyZW04OTAgcmVtYWluZGVyIDEyM2UxICAgIDIwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW04OTEgcmVtYWluZGVyIDEyM2UxICAgICAyMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW04OTIgcmVtYWluZGVyIDEyM2UxICAgICAgMjAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW04OTMgcmVtYWluZGVyIDEyM2UxICAgICAgIDIwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW04OTQgcmVtYWluZGVyIDEyM2UxICAgICAgICAyMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW04OTUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgMjAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW04OTYgcmVtYWluZGVyIDEyM2UxICAgICAgICAgIDIwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW04OTcgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAyMDAwMDAwMDAgLT4gMTIzMAorZHFyZW04OTkgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgMjAwMDAwMDAgLT4gMTIzMAorZHFyZW05MDAgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgIDIwMDAwMDAgLT4gMTIzMAorZHFyZW05MDEgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAyMDAwMDAgLT4gMTIzMAorZHFyZW05MDIgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgMjAwMDAgLT4gMTIzMAorZHFyZW05MDMgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgIDIwMDAgLT4gMTIzMAorZHFyZW05MDQgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAyMDAgLT4gICAzMAorZHFyZW05MDUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgMjAgLT4gICAxMAorZHFyZW05MDYgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgIDIgLT4gICAgMAorCitkcXJlbTkxMCByZW1haW5kZXIgMTIzZTEgICAgNTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkxMSByZW1haW5kZXIgMTIzZTEgICAgIDUwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkxMiByZW1haW5kZXIgMTIzZTEgICAgICA1MDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkxMyByZW1haW5kZXIgMTIzZTEgICAgICAgNTAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkxNCByZW1haW5kZXIgMTIzZTEgICAgICAgIDUwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkxNSByZW1haW5kZXIgMTIzZTEgICAgICAgICA1MDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkxNiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgNTAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkxNyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgIDUwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkxOSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICA1MDAwMDAwMCAtPiAxMjMwCitkcXJlbTkyMCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgNTAwMDAwMCAtPiAxMjMwCitkcXJlbTkyMSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgIDUwMDAwMCAtPiAxMjMwCitkcXJlbTkyMiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICA1MDAwMCAtPiAxMjMwCitkcXJlbTkyMyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgNTAwMCAtPiAxMjMwCitkcXJlbTkyNCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgIDUwMCAtPiAgMjMwCitkcXJlbTkyNSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICA1MCAtPiAgIDMwCitkcXJlbTkyNiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAgNSAtPiAgICAwCisKK2RxcmVtOTMwIHJlbWFpbmRlciAxMjNlMSAgICA5MDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtOTMxIHJlbWFpbmRlciAxMjNlMSAgICAgOTAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtOTMyIHJlbWFpbmRlciAxMjNlMSAgICAgIDkwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtOTMzIHJlbWFpbmRlciAxMjNlMSAgICAgICA5MDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtOTM0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgOTAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtOTM1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgIDkwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtOTM2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICA5MDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtOTM3IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgOTAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtOTM5IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgIDkwMDAwMDAwIC0+IDEyMzAKK2RxcmVtOTQwIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICA5MDAwMDAwIC0+IDEyMzAKK2RxcmVtOTQxIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgOTAwMDAwIC0+IDEyMzAKK2RxcmVtOTQyIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgIDkwMDAwIC0+IDEyMzAKK2RxcmVtOTQzIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICA5MDAwIC0+IDEyMzAKK2RxcmVtOTQ0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgOTAwIC0+ICAzMzAKK2RxcmVtOTQ1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgIDkwIC0+ICAgNjAKK2RxcmVtOTQ2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgICA5IC0+ICAgIDYKKworZHFyZW05NTAgcmVtYWluZGVyIDEyM2UxICAgMTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTk2MSByZW1haW5kZXIgMTIzZTEgICAyOTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2RxcmVtOTYyIHJlbWFpbmRlciAxMjNlMSAgIDM5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFyZW05NjMgcmVtYWluZGVyIDEyM2UxICAgNDk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkcXJlbTk2NCByZW1haW5kZXIgMTIzZTEgICA1OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2RxcmVtOTY1IHJlbWFpbmRlciAxMjNlMSAgIDY5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFyZW05NjYgcmVtYWluZGVyIDEyM2UxICAgNzk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkcXJlbTk2NyByZW1haW5kZXIgMTIzZTEgICA4OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2RxcmVtOTY4IHJlbWFpbmRlciAxMjNlMSAgIDk5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFyZW05NjkgcmVtYWluZGVyIDEyM2UxICAgOTg3NjU0MzIxMDk4NzY1NCAtPiAxMjMwCisKK2RxcmVtOTgwIHJlbWFpbmRlciAxMjNlMSAxMDAwRTI5OSAtPiAxLjIzRSszICAtLSAxMjNFKzEgaW50ZXJuYWxseQorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIFtmcm9tIGRpdmlkZV0KK2RxcmVtMTA1MSByZW1haW5kZXIgIDFlKzI3NyAgMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFyZW0xMDUyIHJlbWFpbmRlciAgMWUrMjc3IC0xZS0zMTEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcXJlbTEwNTMgcmVtYWluZGVyIC0xZSsyNzcgIDFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RxcmVtMTA1NCByZW1haW5kZXIgLTFlKzI3NyAtMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFyZW0xMDU1IHJlbWFpbmRlciAgMWUtMjc3ICAxZSszMTEgLT4gIDFFLTI3NworZHFyZW0xMDU2IHJlbWFpbmRlciAgMWUtMjc3IC0xZSszMTEgLT4gIDFFLTI3NworZHFyZW0xMDU3IHJlbWFpbmRlciAtMWUtMjc3ICAxZSszMTEgLT4gLTFFLTI3NworZHFyZW0xMDU4IHJlbWFpbmRlciAtMWUtMjc3IC0xZSszMTEgLT4gLTFFLTI3NworCistLSBHeXVyaXMgZXhhbXBsZQorZHFyZW0xMDcwIHJlbWFpbmRlciA4LjMzNjgwNDQxODA5NDA0MDk4OTYzMDAwNjgxOTg4MTcwOUUtNjE0MyA4LjMzNjgwNDQxODA5NDA0MDk4OTYzMDAwNjgxOTg4OTAwMEUtNjE0MyAtPiA4LjMzNjgwNDQxODA5NDA0MDk4OTYzMDAwNjgxOTg4MTcwOUUtNjE0MworCistLSBkZXN0cnVjdGl2ZSBzdWJ0cmFjdAorZHFyZW0xMTIwICByZW1haW5kZXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgMC43NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjgKK2RxcmVtMTEyMSAgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgLT4gICAwLjY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4Nzc5CitkcXJlbTExMjIgIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAgIDAuNTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODg5MAorZHFyZW0xMTIzICByZW1haW5kZXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyNTUgIDQuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgMi42OTEzNTgwMjc0NjkxMzU4MDI3NDY5MTM1ODAyNzQ2ODcKK2RxcmVtMTEyNCAgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICA0LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgLT4gIDEuNjkxMzU4MDI3NDY5MTM1ODAyNzQ2OTEzNTgwMjc0NjkyCitkcXJlbTExMjUgIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICA0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIC0+ICAgIDMuNjkxMzU3ODAyNDY5MTM1NzgwMjQ2OTEzNTc4MDI1MQorZHFyZW0xMTI2ICByZW1haW5kZXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICA0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAtPiAgIDEuNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDcKK2RxcmVtMTEyNyAgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICA0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgLT4gIDQuMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ2CitkcXJlbTExMjggIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAgIDQuMzA4NjQyMTk3NTMwODY0MjE5NzUzMDg2NDIxOTc1OQorCistLSBOdWxsIHRlc3RzCitkcXJlbTEwMDAgcmVtYWluZGVyIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0xMDAxIHJlbWFpbmRlciAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVJlbWFpbmRlck5lYXIuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFSZW1haW5kZXJOZWFyLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkMjczZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFSZW1haW5kZXJOZWFyLmRlY1Rlc3QKQEAgLTAsMCArMSw2MzEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFSZW1haW5kZXJOZWFyLmRlY1Rlc3QgLS0gZGVjUXVhZCByZW1haW5kZXItbmVhciAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzIChhcyBiYXNlLCBhYm92ZSkKK2Rxcm1uMDAxIHJlbWFpbmRlcm5lYXIgIDEgICAgIDEgICAgLT4gIDAKK2Rxcm1uMDAyIHJlbWFpbmRlcm5lYXIgIDIgICAgIDEgICAgLT4gIDAKK2Rxcm1uMDAzIHJlbWFpbmRlcm5lYXIgIDEgICAgIDIgICAgLT4gIDEKK2Rxcm1uMDA0IHJlbWFpbmRlcm5lYXIgIDIgICAgIDIgICAgLT4gIDAKK2Rxcm1uMDA1IHJlbWFpbmRlcm5lYXIgIDAgICAgIDEgICAgLT4gIDAKK2Rxcm1uMDA2IHJlbWFpbmRlcm5lYXIgIDAgICAgIDIgICAgLT4gIDAKK2Rxcm1uMDA3IHJlbWFpbmRlcm5lYXIgIDEgICAgIDMgICAgLT4gIDEKK2Rxcm1uMDA4IHJlbWFpbmRlcm5lYXIgIDIgICAgIDMgICAgLT4gLTEKK2Rxcm1uMDA5IHJlbWFpbmRlcm5lYXIgIDMgICAgIDMgICAgLT4gIDAKKworZHFybW4wMTAgcmVtYWluZGVybmVhciAgMi40ICAgMSAgICAtPiAgMC40CitkcXJtbjAxMSByZW1haW5kZXJuZWFyICAyLjQgICAtMSAgIC0+ICAwLjQKK2Rxcm1uMDEyIHJlbWFpbmRlcm5lYXIgIC0yLjQgIDEgICAgLT4gIC0wLjQKK2Rxcm1uMDEzIHJlbWFpbmRlcm5lYXIgIC0yLjQgIC0xICAgLT4gIC0wLjQKK2Rxcm1uMDE0IHJlbWFpbmRlcm5lYXIgIDIuNDAgIDEgICAgLT4gIDAuNDAKK2Rxcm1uMDE1IHJlbWFpbmRlcm5lYXIgIDIuNDAwIDEgICAgLT4gIDAuNDAwCitkcXJtbjAxNiByZW1haW5kZXJuZWFyICAyLjQgICAyICAgIC0+ICAwLjQKK2Rxcm1uMDE3IHJlbWFpbmRlcm5lYXIgIDIuNDAwIDIgICAgLT4gIDAuNDAwCitkcXJtbjAxOCByZW1haW5kZXJuZWFyICAyLiAgICAyICAgIC0+ICAwCitkcXJtbjAxOSByZW1haW5kZXJuZWFyICAyMCAgICAyMCAgIC0+ICAwCisKK2Rxcm1uMDIwIHJlbWFpbmRlcm5lYXIgIDE4NyAgIDE4NyAgICAtPiAgMAorZHFybW4wMjEgcmVtYWluZGVybmVhciAgNSAgICAgMiAgICAgIC0+ICAxCitkcXJtbjAyMiByZW1haW5kZXJuZWFyICA1ICAgICAyLjAgICAgLT4gIDEuMAorZHFybW4wMjMgcmVtYWluZGVybmVhciAgNSAgICAgMi4wMDAgIC0+ICAxLjAwMAorZHFybW4wMjQgcmVtYWluZGVybmVhciAgNSAgICAgMC4yMDAgIC0+ICAwLjAwMAorZHFybW4wMjUgcmVtYWluZGVybmVhciAgNSAgICAgMC4yMDAgIC0+ICAwLjAwMAorCitkcXJtbjAzMCByZW1haW5kZXJuZWFyICAxICAgICAyICAgICAgLT4gIDEKK2Rxcm1uMDMxIHJlbWFpbmRlcm5lYXIgIDEgICAgIDQgICAgICAtPiAgMQorZHFybW4wMzIgcmVtYWluZGVybmVhciAgMSAgICAgOCAgICAgIC0+ICAxCisKK2Rxcm1uMDMzIHJlbWFpbmRlcm5lYXIgIDEgICAgIDE2ICAgICAtPiAgMQorZHFybW4wMzQgcmVtYWluZGVybmVhciAgMSAgICAgMzIgICAgIC0+ICAxCitkcXJtbjAzNSByZW1haW5kZXJuZWFyICAxICAgICA2NCAgICAgLT4gIDEKK2Rxcm1uMDQwIHJlbWFpbmRlcm5lYXIgIDEgICAgLTIgICAgICAtPiAgMQorZHFybW4wNDEgcmVtYWluZGVybmVhciAgMSAgICAtNCAgICAgIC0+ICAxCitkcXJtbjA0MiByZW1haW5kZXJuZWFyICAxICAgIC04ICAgICAgLT4gIDEKK2Rxcm1uMDQzIHJlbWFpbmRlcm5lYXIgIDEgICAgLTE2ICAgICAtPiAgMQorZHFybW4wNDQgcmVtYWluZGVybmVhciAgMSAgICAtMzIgICAgIC0+ICAxCitkcXJtbjA0NSByZW1haW5kZXJuZWFyICAxICAgIC02NCAgICAgLT4gIDEKK2Rxcm1uMDUwIHJlbWFpbmRlcm5lYXIgLTEgICAgIDIgICAgICAtPiAgLTEKK2Rxcm1uMDUxIHJlbWFpbmRlcm5lYXIgLTEgICAgIDQgICAgICAtPiAgLTEKK2Rxcm1uMDUyIHJlbWFpbmRlcm5lYXIgLTEgICAgIDggICAgICAtPiAgLTEKK2Rxcm1uMDUzIHJlbWFpbmRlcm5lYXIgLTEgICAgIDE2ICAgICAtPiAgLTEKK2Rxcm1uMDU0IHJlbWFpbmRlcm5lYXIgLTEgICAgIDMyICAgICAtPiAgLTEKK2Rxcm1uMDU1IHJlbWFpbmRlcm5lYXIgLTEgICAgIDY0ICAgICAtPiAgLTEKK2Rxcm1uMDYwIHJlbWFpbmRlcm5lYXIgLTEgICAgLTIgICAgICAtPiAgLTEKK2Rxcm1uMDYxIHJlbWFpbmRlcm5lYXIgLTEgICAgLTQgICAgICAtPiAgLTEKK2Rxcm1uMDYyIHJlbWFpbmRlcm5lYXIgLTEgICAgLTggICAgICAtPiAgLTEKK2Rxcm1uMDYzIHJlbWFpbmRlcm5lYXIgLTEgICAgLTE2ICAgICAtPiAgLTEKK2Rxcm1uMDY0IHJlbWFpbmRlcm5lYXIgLTEgICAgLTMyICAgICAtPiAgLTEKK2Rxcm1uMDY1IHJlbWFpbmRlcm5lYXIgLTEgICAgLTY0ICAgICAtPiAgLTEKKworZHFybW4wNjYgcmVtYWluZGVybmVhciAgICAgICAgICA5LjkgICAxICAtPiAtMC4xCitkcXJtbjA2NyByZW1haW5kZXJuZWFyICAgICAgICAgOTkuNyAgIDEgIC0+IC0wLjMKK2Rxcm1uMDY4IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OSAgICAgMSAgLT4gMAorZHFybW4wNjkgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5LjQgICAxICAtPiAwLjQKK2Rxcm1uMDcwIHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OS41ICAgMSAgLT4gLTAuNQorZHFybW4wNzEgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5LjkgICAxICAtPiAtMC4xCitkcXJtbjA3MiByZW1haW5kZXJuZWFyICA5OTk5OTk5OTkuOTk5IDEgIC0+IC0wLjAwMQorZHFybW4wNzMgcmVtYWluZGVybmVhciAgOTk5OTk5Ljk5OTk5OSAxICAtPiAtMC4wMDAwMDEKK2Rxcm1uMDc0IHJlbWFpbmRlcm5lYXIgIDkgICAgICAgICAgICAgMSAgLT4gMAorZHFybW4wNzUgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5OTk5OTk5OSAxICAtPiAwCitkcXJtbjA3NiByZW1haW5kZXJuZWFyICA5OTk5OTk5OTk5OTk5OTk5IDIgIC0+IC0xCitkcXJtbjA3NyByZW1haW5kZXJuZWFyICA5OTk5OTk5OTk5OTk5OTk5IDMgIC0+IDAKK2Rxcm1uMDc4IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OTk5OTk5OTkgNCAgLT4gLTEKKworZHFybW4wODAgcmVtYWluZGVybmVhciAgMC4gICAgICAgICAgICAxICAtPiAwCitkcXJtbjA4MSByZW1haW5kZXJuZWFyICAuMCAgICAgICAgICAgIDEgIC0+IDAuMAorZHFybW4wODIgcmVtYWluZGVybmVhciAgMC4wMCAgICAgICAgICAxICAtPiAwLjAwCitkcXJtbjA4MyByZW1haW5kZXJuZWFyICAwLjAwRSs5ICAgICAgIDEgIC0+IDAKK2Rxcm1uMDg0IHJlbWFpbmRlcm5lYXIgIDAuMDBFKzMgICAgICAgMSAgLT4gMAorZHFybW4wODUgcmVtYWluZGVybmVhciAgMC4wMEUrMiAgICAgICAxICAtPiAwCitkcXJtbjA4NiByZW1haW5kZXJuZWFyICAwLjAwRSsxICAgICAgIDEgIC0+IDAuMAorZHFybW4wODcgcmVtYWluZGVybmVhciAgMC4wMEUrMCAgICAgICAxICAtPiAwLjAwCitkcXJtbjA4OCByZW1haW5kZXJuZWFyICAwLjAwRS0wICAgICAgIDEgIC0+IDAuMDAKK2Rxcm1uMDg5IHJlbWFpbmRlcm5lYXIgIDAuMDBFLTEgICAgICAgMSAgLT4gMC4wMDAKK2Rxcm1uMDkwIHJlbWFpbmRlcm5lYXIgIDAuMDBFLTIgICAgICAgMSAgLT4gMC4wMDAwCitkcXJtbjA5MSByZW1haW5kZXJuZWFyICAwLjAwRS0zICAgICAgIDEgIC0+IDAuMDAwMDAKK2Rxcm1uMDkyIHJlbWFpbmRlcm5lYXIgIDAuMDBFLTQgICAgICAgMSAgLT4gMC4wMDAwMDAKK2Rxcm1uMDkzIHJlbWFpbmRlcm5lYXIgIDAuMDBFLTUgICAgICAgMSAgLT4gMEUtNworZHFybW4wOTQgcmVtYWluZGVybmVhciAgMC4wMEUtNiAgICAgICAxICAtPiAwRS04CitkcXJtbjA5NSByZW1haW5kZXJuZWFyICAwLjAwMDBFLTUwICAgIDEgIC0+IDBFLTU0CisKKy0tIFZhcmlvdXMgZmxhdm91cnMgb2YgcmVtYWluZGVybmVhciBieSAwCitkcXJtbjEwMSByZW1haW5kZXJuZWFyICAwICAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcXJtbjEwMiByZW1haW5kZXJuZWFyICAwICAgICAgLTAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcXJtbjEwMyByZW1haW5kZXJuZWFyIC0wICAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcXJtbjEwNCByZW1haW5kZXJuZWFyIC0wICAgICAgLTAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcXJtbjEwNSByZW1haW5kZXJuZWFyICAwLjBFNSAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcXJtbjEwNiByZW1haW5kZXJuZWFyICAwLjAwMCAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCistLSBbU29tZSB0aGluayB0aGlzIG5leHQgZ3JvdXAgc2hvdWxkIGJlIERpdmlzaW9uX2J5X3plcm8gZXhjZXB0aW9uLCBidXQKKy0tIElFRUUgODU0IGlzIGV4cGxpY2l0IHRoYXQgaXQgaXMgSW52YWxpZCBvcGVyYXRpb24gLi4gZm9yCistLSByZW1haW5kZXItbmVhciwgYW55d2F5XQorZHFybW4xMDcgcmVtYWluZGVybmVhciAgMC4wMDAxICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjEwOCByZW1haW5kZXJuZWFyICAwLjAxICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMTA5IHJlbWFpbmRlcm5lYXIgIDAuMSAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4xMTAgcmVtYWluZGVybmVhciAgMSAgICAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjExMSByZW1haW5kZXJuZWFyICAxICAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMTEyIHJlbWFpbmRlcm5lYXIgMTAgICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4xMTMgcmVtYWluZGVybmVhciAxRSsxMDAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjExNCByZW1haW5kZXJuZWFyIDFFKzM4MCAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMTE1IHJlbWFpbmRlcm5lYXIgIDAuMDAwMSAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4xMTYgcmVtYWluZGVybmVhciAgMC4wMSAgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjExOSByZW1haW5kZXJuZWFyICAwLjEgICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMTIwIHJlbWFpbmRlcm5lYXIgIDEgICAgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4xMjEgcmVtYWluZGVybmVhciAgMSAgICAgIC0wLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjEyMiByZW1haW5kZXJuZWFyIDEwICAgICAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMTIzIHJlbWFpbmRlcm5lYXIgMUUrMTAwICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4xMjQgcmVtYWluZGVybmVhciAxRSszODQgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhbmQgemVyb3Mgb24gbGVmdAorZHFybW4xMzAgcmVtYWluZGVybmVhciAgMCAgICAgIDEgICAtPiAgMAorZHFybW4xMzEgcmVtYWluZGVybmVhciAgMCAgICAgLTEgICAtPiAgMAorZHFybW4xMzIgcmVtYWluZGVybmVhciAgMC4wICAgIDEgICAtPiAgMC4wCitkcXJtbjEzMyByZW1haW5kZXJuZWFyICAwLjAgICAtMSAgIC0+ICAwLjAKK2Rxcm1uMTM0IHJlbWFpbmRlcm5lYXIgLTAgICAgICAxICAgLT4gLTAKK2Rxcm1uMTM1IHJlbWFpbmRlcm5lYXIgLTAgICAgIC0xICAgLT4gLTAKK2Rxcm1uMTM2IHJlbWFpbmRlcm5lYXIgLTAuMCAgICAxICAgLT4gLTAuMAorZHFybW4xMzcgcmVtYWluZGVybmVhciAtMC4wICAgLTEgICAtPiAtMC4wCisKKy0tIDAuNWVycworZHFybW4xNDMgcmVtYWluZGVybmVhciAgIDAuNSAgMiAgICAgLT4gIDAuNQorZHFybW4xNDQgcmVtYWluZGVybmVhciAgIDAuNSAgMi4xICAgLT4gIDAuNQorZHFybW4xNDUgcmVtYWluZGVybmVhciAgIDAuNSAgMi4wMSAgLT4gIDAuNTAKK2Rxcm1uMTQ2IHJlbWFpbmRlcm5lYXIgICAwLjUgIDIuMDAxIC0+ICAwLjUwMAorZHFybW4xNDcgcmVtYWluZGVybmVhciAgIDAuNTAgMiAgICAgLT4gIDAuNTAKK2Rxcm1uMTQ4IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIuMDEgIC0+ICAwLjUwCitkcXJtbjE0OSByZW1haW5kZXJuZWFyICAgMC41MCAyLjAwMSAtPiAgMC41MDAKKworLS0gc3RlYWRpZXMKK2Rxcm1uMTUwIHJlbWFpbmRlcm5lYXIgIDEgIDEgICAtPiAwCitkcXJtbjE1MSByZW1haW5kZXJuZWFyICAxICAyICAgLT4gMQorZHFybW4xNTIgcmVtYWluZGVybmVhciAgMSAgMyAgIC0+IDEKK2Rxcm1uMTUzIHJlbWFpbmRlcm5lYXIgIDEgIDQgICAtPiAxCitkcXJtbjE1NCByZW1haW5kZXJuZWFyICAxICA1ICAgLT4gMQorZHFybW4xNTUgcmVtYWluZGVybmVhciAgMSAgNiAgIC0+IDEKK2Rxcm1uMTU2IHJlbWFpbmRlcm5lYXIgIDEgIDcgICAtPiAxCitkcXJtbjE1NyByZW1haW5kZXJuZWFyICAxICA4ICAgLT4gMQorZHFybW4xNTggcmVtYWluZGVybmVhciAgMSAgOSAgIC0+IDEKK2Rxcm1uMTU5IHJlbWFpbmRlcm5lYXIgIDEgIDEwICAtPiAxCitkcXJtbjE2MCByZW1haW5kZXJuZWFyICAxICAxICAgLT4gMAorZHFybW4xNjEgcmVtYWluZGVybmVhciAgMiAgMSAgIC0+IDAKK2Rxcm1uMTYyIHJlbWFpbmRlcm5lYXIgIDMgIDEgICAtPiAwCitkcXJtbjE2MyByZW1haW5kZXJuZWFyICA0ICAxICAgLT4gMAorZHFybW4xNjQgcmVtYWluZGVybmVhciAgNSAgMSAgIC0+IDAKK2Rxcm1uMTY1IHJlbWFpbmRlcm5lYXIgIDYgIDEgICAtPiAwCitkcXJtbjE2NiByZW1haW5kZXJuZWFyICA3ICAxICAgLT4gMAorZHFybW4xNjcgcmVtYWluZGVybmVhciAgOCAgMSAgIC0+IDAKK2Rxcm1uMTY4IHJlbWFpbmRlcm5lYXIgIDkgIDEgICAtPiAwCitkcXJtbjE2OSByZW1haW5kZXJuZWFyICAxMCAxICAgLT4gMAorCistLSBzb21lIGRpZmZlcmVuY2VzIGZyb20gcmVtYWluZGVyCitkcXJtbjE3MSByZW1haW5kZXJuZWFyICAgMC40ICAxLjAyMCAtPiAgMC40MDAKK2Rxcm1uMTcyIHJlbWFpbmRlcm5lYXIgICAwLjUwIDEuMDIwIC0+ICAwLjUwMAorZHFybW4xNzMgcmVtYWluZGVybmVhciAgIDAuNTEgMS4wMjAgLT4gIDAuNTEwCitkcXJtbjE3NCByZW1haW5kZXJuZWFyICAgMC41MiAxLjAyMCAtPiAtMC41MDAKK2Rxcm1uMTc1IHJlbWFpbmRlcm5lYXIgICAwLjYgIDEuMDIwIC0+IC0wLjQyMAorCistLSBNb3JlIGZsYXZvdXJzIG9mIHJlbWFpbmRlcm5lYXIgYnkgMAorZHFybW4yMDEgcmVtYWluZGVybmVhciAgMCAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcXJtbjIwMiByZW1haW5kZXJuZWFyICAwLjBFNSAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2Rxcm1uMjAzIHJlbWFpbmRlcm5lYXIgIDAuMDAwICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFybW4yMDQgcmVtYWluZGVybmVhciAgMC4wMDAxIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMjA1IHJlbWFpbmRlcm5lYXIgIDAuMDEgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjIwNiByZW1haW5kZXJuZWFyICAwLjEgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4yMDcgcmVtYWluZGVybmVhciAgMSAgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMjA4IHJlbWFpbmRlcm5lYXIgIDEgICAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjIwOSByZW1haW5kZXJuZWFyIDEwICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4yMTAgcmVtYWluZGVybmVhciAxRSsxMDAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMjExIHJlbWFpbmRlcm5lYXIgMUUrMzgwICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHRlc3RzIGZyb20gdGhlIGV4dGVuZGVkIHNwZWNpZmljYXRpb24KK2Rxcm1uMjIxIHJlbWFpbmRlcm5lYXIgMi4xICAgICAzICAgLT4gLTAuOQorZHFybW4yMjIgcmVtYWluZGVybmVhciAgMTAgICAgIDYgICAtPiAtMgorZHFybW4yMjMgcmVtYWluZGVybmVhciAgMTAgICAgIDMgICAtPiAgMQorZHFybW4yMjQgcmVtYWluZGVybmVhciAtMTAgICAgIDMgICAtPiAtMQorZHFybW4yMjUgcmVtYWluZGVybmVhciAgMTAuMiAgIDEgICAtPiAwLjIKK2Rxcm1uMjI2IHJlbWFpbmRlcm5lYXIgIDEwICAgICAwLjMgLT4gMC4xCitkcXJtbjIyNyByZW1haW5kZXJuZWFyICAgMy42ICAgMS4zIC0+IC0wLjMKKworLS0gc29tZSBkaWZmZXJlbmNlcyBmcm9tIHJlbWFpbmRlcgorZHFybW4yMzEgcmVtYWluZGVybmVhciAgLTAuNCAgMS4wMjAgLT4gLTAuNDAwCitkcXJtbjIzMiByZW1haW5kZXJuZWFyICAtMC41MCAxLjAyMCAtPiAtMC41MDAKK2Rxcm1uMjMzIHJlbWFpbmRlcm5lYXIgIC0wLjUxIDEuMDIwIC0+IC0wLjUxMAorZHFybW4yMzQgcmVtYWluZGVybmVhciAgLTAuNTIgMS4wMjAgLT4gIDAuNTAwCitkcXJtbjIzNSByZW1haW5kZXJuZWFyICAtMC42ICAxLjAyMCAtPiAgMC40MjAKKworLS0gaGlnaCBYcworZHFybW4yNDAgcmVtYWluZGVybmVhciAgMUUrMiAgMS4wMCAgLT4gIDAuMDAKKworLS0gZHFybW4zeHggYXJlIGZyb20gRGlhZ0JpZ0RlY2ltYWwKK2Rxcm1uMzAxIHJlbWFpbmRlcm5lYXIgICAxICAgIDMgICAgIC0+ICAxCitkcXJtbjMwMiByZW1haW5kZXJuZWFyICAgNSAgICA1ICAgICAtPiAgMAorZHFybW4zMDMgcmVtYWluZGVybmVhciAgIDEzICAgMTAgICAgLT4gIDMKK2Rxcm1uMzA0IHJlbWFpbmRlcm5lYXIgICAxMyAgIDUwICAgIC0+ICAxMworZHFybW4zMDUgcmVtYWluZGVybmVhciAgIDEzICAgMTAwICAgLT4gIDEzCitkcXJtbjMwNiByZW1haW5kZXJuZWFyICAgMTMgICAxMDAwICAtPiAgMTMKK2Rxcm1uMzA3IHJlbWFpbmRlcm5lYXIgICAuMTMgICAgMSAgIC0+ICAwLjEzCitkcXJtbjMwOCByZW1haW5kZXJuZWFyICAgMC4xMzMgIDEgICAtPiAgMC4xMzMKK2Rxcm1uMzA5IHJlbWFpbmRlcm5lYXIgICAwLjEwMzMgMSAgIC0+ICAwLjEwMzMKK2Rxcm1uMzEwIHJlbWFpbmRlcm5lYXIgICAxLjAzMyAgMSAgIC0+ICAwLjAzMworZHFybW4zMTEgcmVtYWluZGVybmVhciAgIDEwLjMzICAxICAgLT4gIDAuMzMKK2Rxcm1uMzEyIHJlbWFpbmRlcm5lYXIgICAxMC4zMyAxMCAgIC0+ICAwLjMzCitkcXJtbjMxMyByZW1haW5kZXJuZWFyICAgMTAzLjMgIDEgICAtPiAgMC4zCitkcXJtbjMxNCByZW1haW5kZXJuZWFyICAgMTMzICAgMTAgICAtPiAgMworZHFybW4zMTUgcmVtYWluZGVybmVhciAgIDEwMzMgIDEwICAgLT4gIDMKK2Rxcm1uMzE2IHJlbWFpbmRlcm5lYXIgICAxMDMzICA1MCAgIC0+IC0xNworZHFybW4zMTcgcmVtYWluZGVybmVhciAgIDEwMS4wICAzICAgLT4gLTEuMAorZHFybW4zMTggcmVtYWluZGVybmVhciAgIDEwMi4wICAzICAgLT4gIDAuMAorZHFybW4zMTkgcmVtYWluZGVybmVhciAgIDEwMy4wICAzICAgLT4gIDEuMAorZHFybW4zMjAgcmVtYWluZGVybmVhciAgIDIuNDAgICAxICAgLT4gIDAuNDAKK2Rxcm1uMzIxIHJlbWFpbmRlcm5lYXIgICAyLjQwMCAgMSAgIC0+ICAwLjQwMAorZHFybW4zMjIgcmVtYWluZGVybmVhciAgIDIuNCAgICAxICAgLT4gIDAuNAorZHFybW4zMjMgcmVtYWluZGVybmVhciAgIDIuNCAgICAyICAgLT4gIDAuNAorZHFybW4zMjQgcmVtYWluZGVybmVhciAgIDIuNDAwICAyICAgLT4gIDAuNDAwCitkcXJtbjMyNSByZW1haW5kZXJuZWFyICAgMSAgIDAuMyAgICAtPiAgMC4xCitkcXJtbjMyNiByZW1haW5kZXJuZWFyICAgMSAgIDAuMzAgICAtPiAgMC4xMAorZHFybW4zMjcgcmVtYWluZGVybmVhciAgIDEgICAwLjMwMCAgLT4gIDAuMTAwCitkcXJtbjMyOCByZW1haW5kZXJuZWFyICAgMSAgIDAuMzAwMCAtPiAgMC4xMDAwCitkcXJtbjMyOSByZW1haW5kZXJuZWFyICAgMS4wICAgIDAuMyAtPiAgMC4xCitkcXJtbjMzMCByZW1haW5kZXJuZWFyICAgMS4wMCAgIDAuMyAtPiAgMC4xMAorZHFybW4zMzEgcmVtYWluZGVybmVhciAgIDEuMDAwICAwLjMgLT4gIDAuMTAwCitkcXJtbjMzMiByZW1haW5kZXJuZWFyICAgMS4wMDAwIDAuMyAtPiAgMC4xMDAwCitkcXJtbjMzMyByZW1haW5kZXJuZWFyICAgMC41ICAyICAgICAtPiAgMC41CitkcXJtbjMzNCByZW1haW5kZXJuZWFyICAgMC41ICAyLjEgICAtPiAgMC41CitkcXJtbjMzNSByZW1haW5kZXJuZWFyICAgMC41ICAyLjAxICAtPiAgMC41MAorZHFybW4zMzYgcmVtYWluZGVybmVhciAgIDAuNSAgMi4wMDEgLT4gIDAuNTAwCitkcXJtbjMzNyByZW1haW5kZXJuZWFyICAgMC41MCAyICAgICAtPiAgMC41MAorZHFybW4zMzggcmVtYWluZGVybmVhciAgIDAuNTAgMi4wMSAgLT4gIDAuNTAKK2Rxcm1uMzM5IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIuMDAxIC0+ICAwLjUwMAorCitkcXJtbjM0MCByZW1haW5kZXJuZWFyICAgMC41ICAgMC41MDAwMDAxICAgIC0+ICAtMUUtNworZHFybW4zNDEgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNTAwMDAwMDEgICAgLT4gIC0xRS04CitkcXJtbjM0MiByZW1haW5kZXJuZWFyICAgMC41ICAgMC41MDAwMDAwMDEgICAgLT4gIC0xRS05CitkcXJtbjM0MyByZW1haW5kZXJuZWFyICAgMC41ICAgMC41MDAwMDAwMDAxICAgIC0+ICAtMUUtMTAKK2Rxcm1uMzQ0IHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjUwMDAwMDAwMDAxICAgIC0+ICAtMUUtMTEKK2Rxcm1uMzQ1IHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjQ5OTk5OTkgICAgLT4gIDFFLTcKK2Rxcm1uMzQ2IHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjQ5OTk5OTk5ICAgIC0+ICAxRS04CitkcXJtbjM0NyByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5OTkgICAgLT4gIDFFLTkKK2Rxcm1uMzQ4IHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjQ5OTk5OTk5OTkgICAgLT4gIDFFLTEwCitkcXJtbjM0OSByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5OTk5OSAgICAtPiAgMUUtMTEKK2Rxcm1uMzUwIHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjQ5OTk5OTk5OTk5OSAgICAtPiAgMUUtMTIKKworZHFybW4zNTEgcmVtYWluZGVybmVhciAgIDAuMDMgIDcgIC0+ICAwLjAzCitkcXJtbjM1MiByZW1haW5kZXJuZWFyICAgNSAgIDIgICAgLT4gIDEKK2Rxcm1uMzUzIHJlbWFpbmRlcm5lYXIgICA0LjEgICAyICAgIC0+ICAwLjEKK2Rxcm1uMzU0IHJlbWFpbmRlcm5lYXIgICA0LjAxICAgMiAgICAtPiAgMC4wMQorZHFybW4zNTUgcmVtYWluZGVybmVhciAgIDQuMDAxICAgMiAgICAtPiAgMC4wMDEKK2Rxcm1uMzU2IHJlbWFpbmRlcm5lYXIgICA0LjAwMDEgICAyICAgIC0+ICAwLjAwMDEKK2Rxcm1uMzU3IHJlbWFpbmRlcm5lYXIgICA0LjAwMDAxICAgMiAgICAtPiAgMC4wMDAwMQorZHFybW4zNTggcmVtYWluZGVybmVhciAgIDQuMDAwMDAxICAgMiAgICAtPiAgMC4wMDAwMDEKK2Rxcm1uMzU5IHJlbWFpbmRlcm5lYXIgICA0LjAwMDAwMDEgICAyICAgIC0+ICAxRS03CisKK2Rxcm1uMzYwIHJlbWFpbmRlcm5lYXIgICAxLjIgICAwLjczNDUgLT4gLTAuMjY5MAorZHFybW4zNjEgcmVtYWluZGVybmVhciAgIDAuOCAgIDEyICAgICAtPiAgMC44CitkcXJtbjM2MiByZW1haW5kZXJuZWFyICAgMC44ICAgMC4yICAgIC0+ICAwLjAKK2Rxcm1uMzYzIHJlbWFpbmRlcm5lYXIgICAwLjggICAwLjMgICAgLT4gLTAuMQorZHFybW4zNjQgcmVtYWluZGVybmVhciAgIDAuODAwICAgMTIgICAtPiAgMC44MDAKK2Rxcm1uMzY1IHJlbWFpbmRlcm5lYXIgICAwLjgwMCAgIDEuNyAgLT4gIDAuODAwCitkcXJtbjM2NiByZW1haW5kZXJuZWFyICAgMi40MDAgICAyICAgIC0+ICAwLjQwMAorCistLSByb3VuZCB0byBldmVuCitkcXJtbjM3MSByZW1haW5kZXJuZWFyICAgMTIxICAgICAyICAgIC0+ICAxCitkcXJtbjM3MiByZW1haW5kZXJuZWFyICAgMTIyICAgICAyICAgIC0+ICAwCitkcXJtbjM3MyByZW1haW5kZXJuZWFyICAgMTIzICAgICAyICAgIC0+IC0xCitkcXJtbjM3NCByZW1haW5kZXJuZWFyICAgMTI0ICAgICAyICAgIC0+ICAwCitkcXJtbjM3NSByZW1haW5kZXJuZWFyICAgMTI1ICAgICAyICAgIC0+ICAxCitkcXJtbjM3NiByZW1haW5kZXJuZWFyICAgMTI2ICAgICAyICAgIC0+ICAwCitkcXJtbjM3NyByZW1haW5kZXJuZWFyICAgMTI3ICAgICAyICAgIC0+IC0xCisKK2Rxcm1uMzgxIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEgICAgICAgICAtPiAgMAorZHFybW4zODIgcmVtYWluZGVybmVhciAxMjM0NSAgMS4wMDAxICAgIC0+IC0wLjIzNDQKK2Rxcm1uMzgzIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEuMDAxICAgICAtPiAtMC4zMzMKK2Rxcm1uMzg0IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEuMDEgICAgICAtPiAtMC4yMworZHFybW4zODUgcmVtYWluZGVybmVhciAxMjM0NSAgMS4xICAgICAgIC0+IC0wLjMKK2Rxcm1uMzg2IHJlbWFpbmRlcm5lYXIgMTIzNTUgIDQgICAgICAgICAtPiAtMQorZHFybW4zODcgcmVtYWluZGVybmVhciAxMjM0NSAgNCAgICAgICAgIC0+ICAxCitkcXJtbjM4OCByZW1haW5kZXJuZWFyIDEyMzU1ICA0LjAwMDEgICAgLT4gLTEuMzA4OQorZHFybW4zODkgcmVtYWluZGVybmVhciAxMjM0NSAgNC4wMDAxICAgIC0+ICAwLjY5MTQKK2Rxcm1uMzkwIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuOSAgICAgICAtPiAgMS45CitkcXJtbjM5MSByZW1haW5kZXJuZWFyIDEyMzQ1ICA0Ljk5ICAgICAgLT4gLTAuMjYKK2Rxcm1uMzkyIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuOTk5ICAgICAtPiAgMi40NjkKK2Rxcm1uMzkzIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuOTk5OSAgICAtPiAgMC4yNDY5CitkcXJtbjM5NCByZW1haW5kZXJuZWFyIDEyMzQ1ICA1ICAgICAgICAgLT4gIDAKK2Rxcm1uMzk1IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDUuMDAwMSAgICAtPiAtMC4yNDY5CitkcXJtbjM5NiByZW1haW5kZXJuZWFyIDEyMzQ1ICA1LjAwMSAgICAgLT4gLTIuNDY5CitkcXJtbjM5NyByZW1haW5kZXJuZWFyIDEyMzQ1ICA1LjAxICAgICAgLT4gIDAuMzYKK2Rxcm1uMzk4IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDUuMSAgICAgICAtPiAtMi4xCisKKy0tIHRoZSBuYXN0eSBkaXZpc2lvbi1ieS0xIGNhc2VzCitkcXJtbjQwMSByZW1haW5kZXJuZWFyICAgMC40ICAgICAgICAgMSAgIC0+ICAwLjQKK2Rxcm1uNDAyIHJlbWFpbmRlcm5lYXIgICAwLjQ1ICAgICAgICAxICAgLT4gIDAuNDUKK2Rxcm1uNDAzIHJlbWFpbmRlcm5lYXIgICAwLjQ1NSAgICAgICAxICAgLT4gIDAuNDU1CitkcXJtbjQwNCByZW1haW5kZXJuZWFyICAgMC40NTU1ICAgICAgMSAgIC0+ICAwLjQ1NTUKK2Rxcm1uNDA1IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1ICAgICAxICAgLT4gIDAuNDU1NTUKK2Rxcm1uNDA2IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NSAgICAxICAgLT4gIDAuNDU1NTU1CitkcXJtbjQwNyByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1ICAgMSAgIC0+ICAwLjQ1NTU1NTUKK2Rxcm1uNDA4IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTU1ICAxICAgLT4gIDAuNDU1NTU1NTUKK2Rxcm1uNDA5IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTU1NSAxICAgLT4gIDAuNDU1NTU1NTU1CistLSB3aXRoIHNwaWxsLi4uIFs0MTIgZXhlcmNpc2VzIHN0aWNrdGFiIGxvb3BdCitkcXJtbjQxMSByZW1haW5kZXJuZWFyICAgMC41ICAgICAgICAgMSAgIC0+ICAwLjUKK2Rxcm1uNDEyIHJlbWFpbmRlcm5lYXIgICAwLjU1ICAgICAgICAxICAgLT4gLTAuNDUKK2Rxcm1uNDEzIHJlbWFpbmRlcm5lYXIgICAwLjU1NSAgICAgICAxICAgLT4gLTAuNDQ1CitkcXJtbjQxNCByZW1haW5kZXJuZWFyICAgMC41NTU1ICAgICAgMSAgIC0+IC0wLjQ0NDUKK2Rxcm1uNDE1IHJlbWFpbmRlcm5lYXIgICAwLjU1NTU1ICAgICAxICAgLT4gLTAuNDQ0NDUKK2Rxcm1uNDE2IHJlbWFpbmRlcm5lYXIgICAwLjU1NTU1NSAgICAxICAgLT4gLTAuNDQ0NDQ1CitkcXJtbjQxNyByZW1haW5kZXJuZWFyICAgMC41NTU1NTU1ICAgMSAgIC0+IC0wLjQ0NDQ0NDUKK2Rxcm1uNDE4IHJlbWFpbmRlcm5lYXIgICAwLjU1NTU1NTU1ICAxICAgLT4gLTAuNDQ0NDQ0NDUKK2Rxcm1uNDE5IHJlbWFpbmRlcm5lYXIgICAwLjU1NTU1NTU1NSAxICAgLT4gLTAuNDQ0NDQ0NDQ1CisKKy0tIGZvbGRkb3ducworZHFybW40MjEgcmVtYWluZGVybmVhciAgIDFFKzYxNDQgICAgICAgIDEgIC0+ICAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2Rxcm1uNDIyIHJlbWFpbmRlcm5lYXIgICAxRSs2MTQ0ICAxRSs2MTQzICAtPiAgIDBFKzYxMTEgQ2xhbXBlZAorZHFybW40MjMgcmVtYWluZGVybmVhciAgIDFFKzYxNDQgIDJFKzYxNDMgIC0+ICAgMEUrNjExMSBDbGFtcGVkCitkcXJtbjQyNCByZW1haW5kZXJuZWFyICAgMUUrNjE0NCAgM0UrNjE0MyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzIENsYW1wZWQKK2Rxcm1uNDI1IHJlbWFpbmRlcm5lYXIgICAxRSs2MTQ0ICA0RSs2MTQzICAtPiAgIDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDMgQ2xhbXBlZAorZHFybW40MjYgcmVtYWluZGVybmVhciAgIDFFKzYxNDQgIDVFKzYxNDMgIC0+ICAgMEUrNjExMSBDbGFtcGVkCitkcXJtbjQyNyByZW1haW5kZXJuZWFyICAgMUUrNjE0NCAgNkUrNjE0MyAgLT4gIC0yLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzIENsYW1wZWQKK2Rxcm1uNDI4IHJlbWFpbmRlcm5lYXIgICAxRSs2MTQ0ICA3RSs2MTQzICAtPiAgIDMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDMgQ2xhbXBlZAorZHFybW40MjkgcmVtYWluZGVybmVhciAgIDFFKzYxNDQgIDhFKzYxNDMgIC0+ICAgMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MyBDbGFtcGVkCitkcXJtbjQzMCByZW1haW5kZXJuZWFyICAgMUUrNjE0NCAgOUUrNjE0MyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzIENsYW1wZWQKKy0tIHRpbmllcworZHFybW40MzEgcmVtYWluZGVybmVhciAgIDFFLTYxNzUgIDFFLTYxNzYgIC0+ICAgMEUtNjE3NgorZHFybW40MzIgcmVtYWluZGVybmVhciAgIDFFLTYxNzUgIDJFLTYxNzYgIC0+ICAgMEUtNjE3NgorZHFybW40MzMgcmVtYWluZGVybmVhciAgIDFFLTYxNzUgIDNFLTYxNzYgIC0+ICAgMUUtNjE3NiBTdWJub3JtYWwKK2Rxcm1uNDM0IHJlbWFpbmRlcm5lYXIgICAxRS02MTc1ICA0RS02MTc2ICAtPiAgIDJFLTYxNzYgU3Vibm9ybWFsCitkcXJtbjQzNSByZW1haW5kZXJuZWFyICAgMUUtNjE3NSAgNUUtNjE3NiAgLT4gICAwRS02MTc2CitkcXJtbjQzNiByZW1haW5kZXJuZWFyICAgMUUtNjE3NSAgNkUtNjE3NiAgLT4gIC0yRS02MTc2IFN1Ym5vcm1hbAorZHFybW40MzcgcmVtYWluZGVybmVhciAgIDFFLTYxNzUgIDdFLTYxNzYgIC0+ICAgM0UtNjE3NiBTdWJub3JtYWwKK2Rxcm1uNDM4IHJlbWFpbmRlcm5lYXIgICAxRS02MTc1ICA4RS02MTc2ICAtPiAgIDJFLTYxNzYgU3Vibm9ybWFsCitkcXJtbjQzOSByZW1haW5kZXJuZWFyICAgMUUtNjE3NSAgOUUtNjE3NiAgLT4gICAxRS02MTc2IFN1Ym5vcm1hbAorZHFybW40NDAgcmVtYWluZGVybmVhciAgIDFFLTYxNzUgMTBFLTYxNzYgIC0+ICAgMEUtNjE3NgorZHFybW40NDEgcmVtYWluZGVybmVhciAgIDFFLTYxNzUgMTFFLTYxNzYgIC0+ICAtMUUtNjE3NiBTdWJub3JtYWwKK2Rxcm1uNDQyIHJlbWFpbmRlcm5lYXIgMTAwRS02MTc1IDExRS02MTc2ICAtPiAgLTFFLTYxNzYgU3Vibm9ybWFsCitkcXJtbjQ0MyByZW1haW5kZXJuZWFyIDEwMEUtNjE3NSAyMEUtNjE3NiAgLT4gICAwRS02MTc2CitkcXJtbjQ0NCByZW1haW5kZXJuZWFyIDEwMEUtNjE3NSAyMUUtNjE3NiAgLT4gIC04RS02MTc2IFN1Ym5vcm1hbAorZHFybW40NDUgcmVtYWluZGVybmVhciAxMDBFLTYxNzUgMzBFLTYxNzYgIC0+IDEuMEUtNjE3NSBTdWJub3JtYWwKKworLS0gemVybyBzaWducworZHFybW42NTAgcmVtYWluZGVybmVhciAgMSAgMSAtPiAgMAorZHFybW42NTEgcmVtYWluZGVybmVhciAtMSAgMSAtPiAtMAorZHFybW42NTIgcmVtYWluZGVybmVhciAgMSAtMSAtPiAgMAorZHFybW42NTMgcmVtYWluZGVybmVhciAtMSAtMSAtPiAtMAorZHFybW42NTQgcmVtYWluZGVybmVhciAgMCAgMSAtPiAgMAorZHFybW42NTUgcmVtYWluZGVybmVhciAtMCAgMSAtPiAtMAorZHFybW42NTYgcmVtYWluZGVybmVhciAgMCAtMSAtPiAgMAorZHFybW42NTcgcmVtYWluZGVybmVhciAtMCAtMSAtPiAtMAorZHFybW42NTggcmVtYWluZGVybmVhciAgMC4wMCAgMSAgLT4gIDAuMDAKK2Rxcm1uNjU5IHJlbWFpbmRlcm5lYXIgLTAuMDAgIDEgIC0+IC0wLjAwCisKKy0tIFNwZWNpYWxzCitkcXJtbjY4MCByZW1haW5kZXJuZWFyICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjY4MSByZW1haW5kZXJuZWFyICBJbmYgIC0xMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjY4MiByZW1haW5kZXJuZWFyICBJbmYgIC0xICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjY4MyByZW1haW5kZXJuZWFyICBJbmYgICAwICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjY4NCByZW1haW5kZXJuZWFyICBJbmYgIC0wICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjY4NSByZW1haW5kZXJuZWFyICBJbmYgICAxICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjY4NiByZW1haW5kZXJuZWFyICBJbmYgICAxMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjY4NyByZW1haW5kZXJuZWFyICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjY4OCByZW1haW5kZXJuZWFyIC0xMDAwICBJbmYgICAtPiAtMTAwMAorZHFybW42ODkgcmVtYWluZGVybmVhciAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW42OTEgcmVtYWluZGVybmVhciAtMSAgICAgSW5mICAgLT4gLTEKK2Rxcm1uNjkyIHJlbWFpbmRlcm5lYXIgIDAgICAgIEluZiAgIC0+ICAwCitkcXJtbjY5MyByZW1haW5kZXJuZWFyIC0wICAgICBJbmYgICAtPiAtMAorZHFybW42OTQgcmVtYWluZGVybmVhciAgMSAgICAgSW5mICAgLT4gIDEKK2Rxcm1uNjk1IHJlbWFpbmRlcm5lYXIgIDEwMDAgIEluZiAgIC0+ICAxMDAwCitkcXJtbjY5NiByZW1haW5kZXJuZWFyICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rxcm1uNzAwIHJlbWFpbmRlcm5lYXIgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzAxIHJlbWFpbmRlcm5lYXIgLUluZiAgLTEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzAyIHJlbWFpbmRlcm5lYXIgLUluZiAgLTEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzAzIHJlbWFpbmRlcm5lYXIgLUluZiAgLTAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzA0IHJlbWFpbmRlcm5lYXIgLUluZiAgIDAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzA1IHJlbWFpbmRlcm5lYXIgLUluZiAgIDEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzA2IHJlbWFpbmRlcm5lYXIgLUluZiAgIDEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzA3IHJlbWFpbmRlcm5lYXIgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzA4IHJlbWFpbmRlcm5lYXIgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzA5IHJlbWFpbmRlcm5lYXIgLTEwMDAgIEluZiAgIC0+IC0xMDAwCitkcXJtbjcxMCByZW1haW5kZXJuZWFyIC0xICAgIC1JbmYgICAtPiAtMQorZHFybW43MTEgcmVtYWluZGVybmVhciAtMCAgICAtSW5mICAgLT4gLTAKK2Rxcm1uNzEyIHJlbWFpbmRlcm5lYXIgIDAgICAgLUluZiAgIC0+ICAwCitkcXJtbjcxMyByZW1haW5kZXJuZWFyICAxICAgIC1JbmYgICAtPiAgMQorZHFybW43MTQgcmVtYWluZGVybmVhciAgMTAwMCAtSW5mICAgLT4gIDEwMDAKK2Rxcm1uNzE1IHJlbWFpbmRlcm5lYXIgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFybW43MjEgcmVtYWluZGVybmVhciAgTmFOIC1JbmYgICAgLT4gIE5hTgorZHFybW43MjIgcmVtYWluZGVybmVhciAgTmFOIC0xMDAwICAgLT4gIE5hTgorZHFybW43MjMgcmVtYWluZGVybmVhciAgTmFOIC0xICAgICAgLT4gIE5hTgorZHFybW43MjQgcmVtYWluZGVybmVhciAgTmFOIC0wICAgICAgLT4gIE5hTgorZHFybW43MjUgcmVtYWluZGVybmVhciAtTmFOICAwICAgICAgLT4gLU5hTgorZHFybW43MjYgcmVtYWluZGVybmVhciAgTmFOICAxICAgICAgLT4gIE5hTgorZHFybW43MjcgcmVtYWluZGVybmVhciAgTmFOICAxMDAwICAgLT4gIE5hTgorZHFybW43MjggcmVtYWluZGVybmVhciAgTmFOICBJbmYgICAgLT4gIE5hTgorZHFybW43MjkgcmVtYWluZGVybmVhciAgTmFOIC1OYU4gICAgLT4gIE5hTgorZHFybW43MzAgcmVtYWluZGVybmVhciAtSW5mICBOYU4gICAgLT4gIE5hTgorZHFybW43MzEgcmVtYWluZGVybmVhciAtMTAwMCBOYU4gICAgLT4gIE5hTgorZHFybW43MzIgcmVtYWluZGVybmVhciAtMSAgICBOYU4gICAgLT4gIE5hTgorZHFybW43MzMgcmVtYWluZGVybmVhciAtMCAgIC1OYU4gICAgLT4gLU5hTgorZHFybW43MzQgcmVtYWluZGVybmVhciAgMCAgICBOYU4gICAgLT4gIE5hTgorZHFybW43MzUgcmVtYWluZGVybmVhciAgMSAgIC1OYU4gICAgLT4gLU5hTgorZHFybW43MzYgcmVtYWluZGVybmVhciAgMTAwMCBOYU4gICAgLT4gIE5hTgorZHFybW43MzcgcmVtYWluZGVybmVhciAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkcXJtbjc0MSByZW1haW5kZXJuZWFyICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NDIgcmVtYWluZGVybmVhciAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzQzIHJlbWFpbmRlcm5lYXIgLXNOYU4gLTEgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc0NCByZW1haW5kZXJuZWFyICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NDUgcmVtYWluZGVybmVhciAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzQ2IHJlbWFpbmRlcm5lYXIgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc0NyByZW1haW5kZXJuZWFyICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NDkgcmVtYWluZGVybmVhciAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzUwIHJlbWFpbmRlcm5lYXIgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc1MSByZW1haW5kZXJuZWFyICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NTIgcmVtYWluZGVybmVhciAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzUzIHJlbWFpbmRlcm5lYXIgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc1NCByZW1haW5kZXJuZWFyIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NTUgcmVtYWluZGVybmVhciAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzU2IHJlbWFpbmRlcm5lYXIgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc1NyByZW1haW5kZXJuZWFyICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NTggcmVtYWluZGVybmVhciAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzU5IHJlbWFpbmRlcm5lYXIgIEluZiAtc05hTiAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2luZyBOYU5zCitkcXJtbjc2MCByZW1haW5kZXJuZWFyICBOYU4xICAgTmFONyAgIC0+ICBOYU4xCitkcXJtbjc2MSByZW1haW5kZXJuZWFyIHNOYU4yICAgTmFOOCAgIC0+ICBOYU4yIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc2MiByZW1haW5kZXJuZWFyICBOYU4zICBzTmFOOSAgIC0+ICBOYU45IEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc2MyByZW1haW5kZXJuZWFyIHNOYU40ICBzTmFOMTAgIC0+ICBOYU40IEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc2NCByZW1haW5kZXJuZWFyICAgIDE1ICAgTmFOMTEgIC0+ICBOYU4xMQorZHFybW43NjUgcmVtYWluZGVybmVhciAgTmFONiAgIE5hTjEyICAtPiAgTmFONgorZHFybW43NjYgcmVtYWluZGVybmVhciAgSW5mICAgIE5hTjEzICAtPiAgTmFOMTMKK2Rxcm1uNzY3IHJlbWFpbmRlcm5lYXIgIE5hTjE0ICAtSW5mICAgLT4gIE5hTjE0CitkcXJtbjc2OCByZW1haW5kZXJuZWFyICAgIDAgICAgTmFOMTUgIC0+ICBOYU4xNQorZHFybW43NjkgcmVtYWluZGVybmVhciAgTmFOMTYgICAtMCAgICAtPiAgTmFOMTYKKworLS0gZWRnZSBjYXNlcyBvZiBpbXBvc3NpYmxlCitkcXJtbjc3MCAgcmVtYWluZGVybmVhciAgMTIzNDUwMDAwMDAwMDAwMDAwMDAwMDA2Nzg5MDEyMzQ1NiAgMTAgICAgLT4gLTQKK2Rxcm1uNzcxICByZW1haW5kZXJuZWFyICAxMjM0NTAwMDAwMDAwMDAwMDAwMDAwMDY3ODkwMTIzNDU2ICAgMSAgICAtPiAgMAorZHFybW43NzIgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1MDAwMDAwMDAwMDAwMDAwMDAwNjc4OTAxMjM0NTYgICAwLjEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFybW43NzMgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1MDAwMDAwMDAwMDAwMDAwMDAwNjc4OTAxMjM0NTYgICAwLjAxIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCistLSBsb25nIG9wZXJhbmQgY2hlY2tzCitkcXJtbjgwMSByZW1haW5kZXJuZWFyIDEyMzQ1Njc4MDAwIDEwMCAtPiAwCitkcXJtbjgwMiByZW1haW5kZXJuZWFyIDEgMTIzNDU2NzgwMDAgICAtPiAxCitkcXJtbjgwMyByZW1haW5kZXJuZWFyIDEyMzQ1Njc4MDAgIDEwICAtPiAwCitkcXJtbjgwNCByZW1haW5kZXJuZWFyIDEgMTIzNDU2NzgwMCAgICAtPiAxCitkcXJtbjgwNSByZW1haW5kZXJuZWFyIDEyMzQ1Njc4OTAgIDEwICAtPiAwCitkcXJtbjgwNiByZW1haW5kZXJuZWFyIDEgMTIzNDU2Nzg5MCAgICAtPiAxCitkcXJtbjgwNyByZW1haW5kZXJuZWFyIDEyMzQ1Njc4OTEgIDEwICAtPiAxCitkcXJtbjgwOCByZW1haW5kZXJuZWFyIDEgMTIzNDU2Nzg5MSAgICAtPiAxCitkcXJtbjgwOSByZW1haW5kZXJuZWFyIDEyMzQ1Njc4OTAxIDEwMCAtPiAxCitkcXJtbjgxMCByZW1haW5kZXJuZWFyIDEgMTIzNDU2Nzg5MDEgICAtPiAxCitkcXJtbjgxMSByZW1haW5kZXJuZWFyIDEyMzQ1Njc4OTYgIDEwICAtPiAtNAorZHFybW44MTIgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCitkcXJtbjgyMSByZW1haW5kZXJuZWFyIDEyMzQ1Njc4MDAwIDEwMCAtPiAwCitkcXJtbjgyMiByZW1haW5kZXJuZWFyIDEgMTIzNDU2NzgwMDAgICAtPiAxCitkcXJtbjgyMyByZW1haW5kZXJuZWFyIDEyMzQ1Njc4MDAgIDEwICAtPiAwCitkcXJtbjgyNCByZW1haW5kZXJuZWFyIDEgMTIzNDU2NzgwMCAgICAtPiAxCitkcXJtbjgyNSByZW1haW5kZXJuZWFyIDEyMzQ1Njc4OTAgIDEwICAtPiAwCitkcXJtbjgyNiByZW1haW5kZXJuZWFyIDEgMTIzNDU2Nzg5MCAgICAtPiAxCitkcXJtbjgyNyByZW1haW5kZXJuZWFyIDEyMzQ1Njc4OTEgIDEwICAtPiAxCitkcXJtbjgyOCByZW1haW5kZXJuZWFyIDEgMTIzNDU2Nzg5MSAgICAtPiAxCitkcXJtbjgyOSByZW1haW5kZXJuZWFyIDEyMzQ1Njc4OTAxIDEwMCAtPiAxCitkcXJtbjgzMCByZW1haW5kZXJuZWFyIDEgMTIzNDU2Nzg5MDEgICAtPiAxCitkcXJtbjgzMSByZW1haW5kZXJuZWFyIDEyMzQ1Njc4OTYgIDEwICAtPiAtNAorZHFybW44MzIgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCistLSBmcm9tIGRpdmlkZWludAorZHFybW44NDAgcmVtYWluZGVybmVhciAgMTAwMDAwMDAwLjAgICAxICAtPiAgMC4wCitkcXJtbjg0MSByZW1haW5kZXJuZWFyICAxMDAwMDAwMDAuNCAgIDEgIC0+ICAwLjQKK2Rxcm1uODQyIHJlbWFpbmRlcm5lYXIgIDEwMDAwMDAwMC41ICAgMSAgLT4gIDAuNQorZHFybW44NDMgcmVtYWluZGVybmVhciAgMTAwMDAwMDAwLjkgICAxICAtPiAtMC4xCitkcXJtbjg0NCByZW1haW5kZXJuZWFyICAxMDAwMDAwMDAuOTk5IDEgIC0+IC0wLjAwMQorZHFybW44NTAgcmVtYWluZGVybmVhciAgMTAwMDAwMDAzICAgICA1ICAtPiAtMgorZHFybW44NTEgcmVtYWluZGVybmVhciAgMTAwMDAwMDMgICAgICA1ICAtPiAtMgorZHFybW44NTIgcmVtYWluZGVybmVhciAgMTAwMDAwMyAgICAgICA1ICAtPiAtMgorZHFybW44NTMgcmVtYWluZGVybmVhciAgMTAwMDAzICAgICAgICA1ICAtPiAtMgorZHFybW44NTQgcmVtYWluZGVybmVhciAgMTAwMDMgICAgICAgICA1ICAtPiAtMgorZHFybW44NTUgcmVtYWluZGVybmVhciAgMTAwMyAgICAgICAgICA1ICAtPiAtMgorZHFybW44NTYgcmVtYWluZGVybmVhciAgMTAzICAgICAgICAgICA1ICAtPiAtMgorZHFybW44NTcgcmVtYWluZGVybmVhciAgMTMgICAgICAgICAgICA1ICAtPiAtMgorZHFybW44NTggcmVtYWluZGVybmVhciAgMSAgICAgICAgICAgICA1ICAtPiAgMQorCistLSBWbGFkaW1pcidzIGNhc2VzICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorZHFybW44NjAgcmVtYWluZGVybmVhciAxMjMuMGUxIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2Rxcm1uODYxIHJlbWFpbmRlcm5lYXIgMTIzMCAgICAxMDAwMDAwMDAwMDAwMDAwICAtPiAxMjMwCitkcXJtbjg2MiByZW1haW5kZXJuZWFyIDEyLjNlMiAgMTAwMDAwMDAwMDAwMDAwMCAgLT4gMTIzMAorZHFybW44NjMgcmVtYWluZGVybmVhciAxLjIzZTMgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2Rxcm1uODY0IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwICAtPiAxMjMwCitkcXJtbjg3MCByZW1haW5kZXJuZWFyIDEyM2UxICAgIDEwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW44NzEgcmVtYWluZGVybmVhciAxMjNlMSAgICAgMTAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODcyIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAxMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjg3MyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgIDEwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW44NzQgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgMTAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODc1IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAxMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjg3NiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgIDEwMDAwMDAwMDAgLT4gMTIzMAorZHFybW44NzcgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgMTAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODc4IHJlbWFpbmRlcm5lYXIgMTIzMCAgICAgICAgICAgIDEwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjg3OSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgMTAwMDAwMDAgLT4gMTIzMAorZHFybW44ODAgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAxMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODgxIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgIDEwMDAwMCAtPiAxMjMwCitkcXJtbjg4MiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgMTAwMDAgLT4gMTIzMAorZHFybW44ODMgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAxMDAwIC0+ICAyMzAKK2Rxcm1uODg0IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgIDEwMCAtPiAgIDMwCitkcXJtbjg4NSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICAgMTAgLT4gICAgMAorZHFybW44ODYgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgICAxIC0+ICAgIDAKKworZHFybW44OTAgcmVtYWluZGVybmVhciAxMjNlMSAgICAyMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODkxIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgIDIwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjg5MiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgMjAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW44OTMgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAyMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODk0IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgIDIwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjg5NSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgMjAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW44OTYgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAyMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODk3IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgIDIwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjg5OSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgMjAwMDAwMDAgLT4gMTIzMAorZHFybW45MDAgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAyMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTAxIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgIDIwMDAwMCAtPiAxMjMwCitkcXJtbjkwMiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgMjAwMDAgLT4gMTIzMAorZHFybW45MDMgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAyMDAwIC0+IC03NzAKK2Rxcm1uOTA0IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgIDIwMCAtPiAgIDMwCitkcXJtbjkwNSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICAgMjAgLT4gIC0xMAorZHFybW45MDYgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgICAyIC0+ICAgIDAKKworZHFybW45MTAgcmVtYWluZGVybmVhciAxMjNlMSAgICA1MDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTExIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgIDUwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjkxMiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgNTAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW45MTMgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICA1MDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTE0IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgIDUwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjkxNSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgNTAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW45MTYgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICA1MDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTE3IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgIDUwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjkxOSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgNTAwMDAwMDAgLT4gMTIzMAorZHFybW45MjAgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICA1MDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTIxIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgIDUwMDAwMCAtPiAxMjMwCitkcXJtbjkyMiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgNTAwMDAgLT4gMTIzMAorZHFybW45MjMgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICA1MDAwIC0+IDEyMzAKK2Rxcm1uOTI0IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgIDUwMCAtPiAgMjMwCitkcXJtbjkyNSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICAgNTAgLT4gIC0yMAorZHFybW45MjYgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgICA1IC0+ICAgIDAKKworZHFybW45MzAgcmVtYWluZGVybmVhciAxMjNlMSAgICA5MDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTMxIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgIDkwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjkzMiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgOTAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW45MzMgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICA5MDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTM0IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgIDkwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjkzNSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgOTAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW45MzYgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICA5MDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTM3IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgIDkwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjkzOSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgOTAwMDAwMDAgLT4gMTIzMAorZHFybW45NDAgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICA5MDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTQxIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgIDkwMDAwMCAtPiAxMjMwCitkcXJtbjk0MiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgOTAwMDAgLT4gMTIzMAorZHFybW45NDMgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICA5MDAwIC0+IDEyMzAKK2Rxcm1uOTQ0IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgIDkwMCAtPiAgMzMwCitkcXJtbjk0NSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICAgOTAgLT4gIC0zMAorZHFybW45NDYgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgICA5IC0+ICAgLTMKKworZHFybW45NTAgcmVtYWluZGVybmVhciAxMjNlMSAgIDEwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW45NjEgcmVtYWluZGVybmVhciAxMjNlMSAgIDI5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFybW45NjIgcmVtYWluZGVybmVhciAxMjNlMSAgIDM5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFybW45NjMgcmVtYWluZGVybmVhciAxMjNlMSAgIDQ5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFybW45NjQgcmVtYWluZGVybmVhciAxMjNlMSAgIDU5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFybW45NjUgcmVtYWluZGVybmVhciAxMjNlMSAgIDY5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFybW45NjYgcmVtYWluZGVybmVhciAxMjNlMSAgIDc5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFybW45NjcgcmVtYWluZGVybmVhciAxMjNlMSAgIDg5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFybW45NjggcmVtYWluZGVybmVhciAxMjNlMSAgIDk5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFybW45NjkgcmVtYWluZGVybmVhciAxMjNlMSAgIDk4NzY1NDMyMTA5ODc2NTQgLT4gMTIzMAorCitkcXJtbjk4MCByZW1haW5kZXJuZWFyIDEyM2UxIDEwMDBFMjk5IC0+IDEuMjNFKzMgIC0tIDEyM0UrMSBpbnRlcm5hbGx5CisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgW2Zyb20gZGl2aWRlXQorZHFybW4xMDUxIHJlbWFpbmRlcm5lYXIgIDFlKzI3NyAgMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFybW4xMDUyIHJlbWFpbmRlcm5lYXIgIDFlKzI3NyAtMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFybW4xMDUzIHJlbWFpbmRlcm5lYXIgLTFlKzI3NyAgMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFybW4xMDU0IHJlbWFpbmRlcm5lYXIgLTFlKzI3NyAtMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFybW4xMDU1IHJlbWFpbmRlcm5lYXIgIDFlLTI3NyAgMWUrMzExIC0+ICAxRS0yNzcKK2Rxcm1uMTA1NiByZW1haW5kZXJuZWFyICAxZS0yNzcgLTFlKzMxMSAtPiAgMUUtMjc3CitkcXJtbjEwNTcgcmVtYWluZGVybmVhciAtMWUtMjc3ICAxZSszMTEgLT4gLTFFLTI3NworZHFybW4xMDU4IHJlbWFpbmRlcm5lYXIgLTFlLTI3NyAtMWUrMzExIC0+IC0xRS0yNzcKKworLS0gR3l1cmlzIGV4YW1wbGUKK2Rxcm1uMTA3MCByZW1haW5kZXIgOC4zMzY4MDQ0MTgwOTQwNDA5ODk2MzAwMDY4MTk4ODE3MDlFLTYxNDMgOC4zMzY4MDQ0MTgwOTQwNDA5ODk2MzAwMDY4MTk4ODkwMDBFLTYxNDMgLT4gOC4zMzY4MDQ0MTgwOTQwNDA5ODk2MzAwMDY4MTk4ODE3MDlFLTYxNDMKKworLS0gZGVzdHJ1Y3RpdmUgc3VidHJhY3QKK2Rxcm1uMTEwMSAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAtMC4yMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzMKK2Rxcm1uMTEwMiAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAgLTAuMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMjIKK2Rxcm1uMTEwMyAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAgIC0wLjQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDExMTEKK2Rxcm1uMTEwNCAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTI1NSAgNC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAtMS4zMDg2NDE5NzI1MzA4NjQxOTcyNTMwODY0MTk3MjUzMTQKK2Rxcm1uMTEwNSAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgNC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAgMS42OTEzNTgwMjc0NjkxMzU4MDI3NDY5MTM1ODAyNzQ2OTIKK2Rxcm1uMTEwNiAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICA0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIC0+ICAgIC0xLjMwODY0MjE5NzUzMDg2NDIxOTc1MzA4NjQyMTk3NDgKK2Rxcm1uMTEwNyAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIDQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIC0+ICAgIDEuNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDcKK2Rxcm1uMTEwOCAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIC0+ICAtMC43NTMwODY0MjE5NzUzMDg2NDIxOTc1MzA4NjQyMTk3NTMKK2Rxcm1uMTEwOSAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAtMS4yNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDcKK2Rxcm1uMTExMCAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIDUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAgIDEuNTMwODY0MjE5NzUzMDg2NDIxOTc1MzA4NjQyMTk3NTQKK2Rxcm1uMTExMSAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAgIC0wLjY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDIKKworLS0gTnVsbCB0ZXN0cworZHFybW4xMDAwIHJlbWFpbmRlcm5lYXIgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjEwMDEgcmVtYWluZGVybmVhciAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVJvdGF0ZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVJvdGF0ZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkY2Y5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxUm90YXRlLmRlY1Rlc3QKQEAgLTAsMCArMSwyOTggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFSb3RhdGUuZGVjVGVzdCAtLSByb3RhdGUgZGVjUXVhZCBjb2VmZmljaWVudCBsZWZ0IG9yIHJpZ2h0ICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sKK2Rxcm90MDAxIHJvdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAwICAtPiAgMAorZHFyb3QwMDIgcm90YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgIDIgIC0+ICAwCitkcXJvdDAwMyByb3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgMiAgLT4gIDEwMAorZHFyb3QwMDQgcm90YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgMzMgIC0+ICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXJvdDAwNSByb3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAzNCAgLT4gIDEKK2Rxcm90MDA2IHJvdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgIC0xICAtPiAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFyb3QwMDcgcm90YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgLTIgIC0+ICAwCitkcXJvdDAwOCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMSAgLT4gIDQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMKK2Rxcm90MDA5IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIC0zMyAtPiAgMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MQorZHFyb3QwMTAgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTM0IC0+ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CitkcXJvdDAxMSByb3RhdGUgIDk5MzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMzMgLT4gIDkzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDkKK2Rxcm90MDEyIHJvdGF0ZSAgOTkzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIC0zNCAtPiAgOTkzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorCistLSByaHMgbXVzdCBiZSBhbiBpbnRlZ2VyCitkcXJvdDAxNSByb3RhdGUgICAgICAgIDEgICAgMS41ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3QwMTYgcm90YXRlICAgICAgICAxICAgIDEuMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90MDE3IHJvdGF0ZSAgICAgICAgMSAgICAwLjEgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDAxOCByb3RhdGUgICAgICAgIDEgICAgMC4wICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3QwMTkgcm90YXRlICAgICAgICAxICAgIDFFKzEgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90MDIwIHJvdGF0ZSAgICAgICAgMSAgICAxRSs5OSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDAyMSByb3RhdGUgICAgICAgIDEgICAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3QwMjIgcm90YXRlICAgICAgICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGFuZCB8cmhzfCA8PSBwcmVjaXNpb24KK2Rxcm90MDI1IHJvdGF0ZSAgICAgICAgMSAgICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDAyNiByb3RhdGUgICAgICAgIDEgICAgLTM1ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3QwMjcgcm90YXRlICAgICAgICAxICAgICAzNSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90MDI4IHJvdGF0ZSAgICAgICAgMSAgICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGZ1bGwgcGF0dGVybgorZHFyb3QwMzAgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTM0ICAtPiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CitkcXJvdDAzMSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMzMgIC0+IDIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEKK2Rxcm90MDMyIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0zMiAgLT4gMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMgorZHFyb3QwMzMgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTMxICAtPiA0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzCitkcXJvdDAzNCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMzAgIC0+IDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQKK2Rxcm90MDM1IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yOSAgLT4gNjc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NQorZHFyb3QwMzYgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTI4ICAtPiA3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2CitkcXJvdDAzNyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjcgIC0+IDg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1NjcKK2Rxcm90MDM4IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yNiAgLT4gOTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3OAorZHFyb3QwMzkgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTI1ICAtPiAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5CitkcXJvdDA0MCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjQgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAKK2Rxcm90MDQxIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yMyAgLT4gMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMQorZHFyb3QwNDIgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTIyICAtPiAzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyCitkcXJvdDA0MyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjEgIC0+IDQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjMKK2Rxcm90MDQ0IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yMCAgLT4gNTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNAorZHFyb3QwNDUgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTE5ICAtPiA2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1CitkcXJvdDA0NyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTggIC0+IDc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTYKK2Rxcm90MDQ4IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xNyAgLT4gODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2NworZHFyb3QwNDkgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTE2ICAtPiA5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4CitkcXJvdDA1MCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTUgIC0+ICAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkKK2Rxcm90MDUxIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xNCAgLT4gMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MAorZHFyb3QwNTIgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTEzICAtPiAyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxCitkcXJvdDA1MyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTIgIC0+IDM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIKK2Rxcm90MDU0IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xMSAgLT4gNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMworZHFyb3QwNTUgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTEwICAtPiA1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CitkcXJvdDA1NiByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtOSAgIC0+IDY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUKK2Rxcm90MDU3IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC04ICAgLT4gNzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1NgorZHFyb3QwNTggcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTcgICAtPiA4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3CitkcXJvdDA1OSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtNiAgIC0+IDkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2NzgKK2Rxcm90MDYwIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC01ICAgLT4gIDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorZHFyb3QwNjEgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTQgICAtPiAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwCitkcXJvdDA2MiByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMyAgIC0+IDIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEKK2Rxcm90MDYzIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yICAgLT4gMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMgorZHFyb3QwNjQgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTEgICAtPiA0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzCitkcXJvdDA2NSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQKKworZHFyb3QwNjYgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzAgICAtPiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CitkcXJvdDA2NyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMSAgIC0+IDIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEKK2Rxcm90MDY4IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyICAgLT4gMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMgorZHFyb3QwNjkgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzMgICAtPiA0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzCitkcXJvdDA3MCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArNCAgIC0+IDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQKK2Rxcm90MDcxIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICs1ICAgLT4gNjc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NQorZHFyb3QwNzIgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzYgICAtPiA3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2CitkcXJvdDA3MyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArNyAgIC0+IDg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1NjcKK2Rxcm90MDc0IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICs4ICAgLT4gOTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3OAorZHFyb3QwNzUgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzkgICAtPiAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5CitkcXJvdDA3NiByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAKK2Rxcm90MDc3IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsxMSAgLT4gMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMQorZHFyb3QwNzggcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzEyICAtPiAzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyCitkcXJvdDA3OSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTMgIC0+IDQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjMKK2Rxcm90MDgwIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsxNCAgLT4gNTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNAorZHFyb3QwODEgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzE1ICAtPiA2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1CitkcXJvdDA4MiByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTYgIC0+IDc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTYKK2Rxcm90MDgzIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsxNyAgLT4gODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2NworZHFyb3QwODQgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzE4ICAtPiA5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4CitkcXJvdDA4NSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTkgIC0+ICAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkKK2Rxcm90MDg2IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyMCAgLT4gMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MAorZHFyb3QwODcgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzIxICAtPiAyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxCitkcXJvdDA4OCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjIgIC0+IDM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIKK2Rxcm90MDg5IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyMyAgLT4gNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMworZHFyb3QwOTAgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzI0ICAtPiA1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CitkcXJvdDA5MSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjUgIC0+IDY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUKK2Rxcm90MDkyIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyNiAgLT4gNzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1NgorZHFyb3QwOTMgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzI3ICAtPiA4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3CitkcXJvdDA5NCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjggIC0+IDkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2NzgKK2Rxcm90MDk1IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyOSAgLT4gIDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorZHFyb3QwOTYgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzMwICAtPiAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwCitkcXJvdDA5NyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMzEgIC0+IDIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEKK2Rxcm90MDk4IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICszMiAgLT4gMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMgorZHFyb3QwOTkgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzMzICAtPiA0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzCitkcXJvdDEwMCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMzQgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQKKworLS0gemVyb3MKK2Rxcm90MjcwIHJvdGF0ZSAgMEUtMTAgICAgICAgICAgICAgICsyOSAgIC0+ICAgMEUtMTAKK2Rxcm90MjcxIHJvdGF0ZSAgMEUtMTAgICAgICAgICAgICAgIC0yOSAgIC0+ICAgMEUtMTAKK2Rxcm90MjcyIHJvdGF0ZSAgMC4wMDAgICAgICAgICAgICAgICsyOSAgIC0+ICAgMC4wMDAKK2Rxcm90MjczIHJvdGF0ZSAgMC4wMDAgICAgICAgICAgICAgIC0yOSAgIC0+ICAgMC4wMDAKK2Rxcm90Mjc0IHJvdGF0ZSAgMEUrMTAgICAgICAgICAgICAgICsyOSAgIC0+ICAgMEUrMTAKK2Rxcm90Mjc1IHJvdGF0ZSAgMEUrMTAgICAgICAgICAgICAgIC0yOSAgIC0+ICAgMEUrMTAKK2Rxcm90Mjc2IHJvdGF0ZSAtMEUtMTAgICAgICAgICAgICAgICsyOSAgIC0+ICAtMEUtMTAKK2Rxcm90Mjc3IHJvdGF0ZSAtMEUtMTAgICAgICAgICAgICAgIC0yOSAgIC0+ICAtMEUtMTAKK2Rxcm90Mjc4IHJvdGF0ZSAtMC4wMDAgICAgICAgICAgICAgICsyOSAgIC0+ICAtMC4wMDAKK2Rxcm90Mjc5IHJvdGF0ZSAtMC4wMDAgICAgICAgICAgICAgIC0yOSAgIC0+ICAtMC4wMDAKK2Rxcm90MjgwIHJvdGF0ZSAtMEUrMTAgICAgICAgICAgICAgICsyOSAgIC0+ICAtMEUrMTAKK2Rxcm90MjgxIHJvdGF0ZSAtMEUrMTAgICAgICAgICAgICAgIC0yOSAgIC0+ICAtMEUrMTAKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2Rxcm90MTQxIHJvdGF0ZSAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgIC0xICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFyb3QxNDIgcm90YXRlICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAgLTMzIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcXJvdDE0MyByb3RhdGUgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgICAgMSAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2Rxcm90MTQ0IHJvdGF0ZSAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgICAzMyAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFyb3QxNDUgcm90YXRlICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTEwCitkcXJvdDE0NiByb3RhdGUgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzMgLT4gMS4wRS02MTQyCitkcXJvdDE0NyByb3RhdGUgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLT4gMS4wRS02MTQyCitkcXJvdDE0OCByb3RhdGUgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxMTAKK2Rxcm90MTUxIHJvdGF0ZSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgIC0xICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ0CitkcXJvdDE1MiByb3RhdGUgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMzMgLT4gMUUtNjE3NgorZHFyb3QxNTMgcm90YXRlICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIDEgIC0+IDFFLTYxNzYKK2Rxcm90MTU0IHJvdGF0ZSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgICAzMyAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ0CitkcXJvdDE1NSByb3RhdGUgIDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMSAgLT4gOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NAorZHFyb3QxNTYgcm90YXRlICA5LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgLTMzIC0+IDlFLTYxNzYKK2Rxcm90MTU3IHJvdGF0ZSAgOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgICAxICAtPiA5RS02MTc2CitkcXJvdDE1OCByb3RhdGUgIDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgMzMgLT4gOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NAorZHFyb3QxNjAgcm90YXRlICAxRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkcXJvdDE2MSByb3RhdGUgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzMgLT4gMS4wRS02MTc1CitkcXJvdDE2MiByb3RhdGUgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLT4gMS4wRS02MTc1CitkcXJvdDE2MyByb3RhdGUgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKKy0tICBuZWdhdGl2ZXMKK2Rxcm90MTcxIHJvdGF0ZSAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgIC0xICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2Rxcm90MTcyIHJvdGF0ZSAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgIC0zMyAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2Rxcm90MTczIHJvdGF0ZSAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgICAxICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2Rxcm90MTc0IHJvdGF0ZSAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgICAzMyAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2Rxcm90MTc1IHJvdGF0ZSAtMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxMTAKK2Rxcm90MTc2IHJvdGF0ZSAtMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMyAtPiAtMS4wRS02MTQyCitkcXJvdDE3NyByb3RhdGUgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLT4gLTEuMEUtNjE0MgorZHFyb3QxNzggcm90YXRlIC0xRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjExMAorZHFyb3QxODEgcm90YXRlIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgLTEgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ0CitkcXJvdDE4MiByb3RhdGUgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMzMgLT4gLTFFLTYxNzYKK2Rxcm90MTgzIHJvdGF0ZSAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgICAxICAtPiAtMUUtNjE3NgorZHFyb3QxODQgcm90YXRlIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIDMzIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ0CitkcXJvdDE4NSByb3RhdGUgLTkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMSAgLT4gLTkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDQKK2Rxcm90MTg2IHJvdGF0ZSAtOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgIC0zMyAtPiAtOUUtNjE3NgorZHFyb3QxODcgcm90YXRlIC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIDEgIC0+IC05RS02MTc2CitkcXJvdDE4OCByb3RhdGUgLTkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgMzMgLT4gLTkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDQKK2Rxcm90MTkwIHJvdGF0ZSAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2Rxcm90MTkxIHJvdGF0ZSAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMyAtPiAtMS4wRS02MTc1CitkcXJvdDE5MiByb3RhdGUgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLT4gLTEuMEUtNjE3NQorZHFyb3QxOTMgcm90YXRlIC0xRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworCistLSBtb3JlIG5lZ2F0aXZlcyAob2Ygc2FuaXRpZXMpCitkcXJvdDIwMSByb3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAgICAgMCAgLT4gLTAKK2Rxcm90MjAyIHJvdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMCAgICAyICAtPiAtMAorZHFyb3QyMDMgcm90YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICAgIDIgIC0+IC0xMDAKK2Rxcm90MjA0IHJvdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgIDMzICAtPiAtMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFyb3QyMDUgcm90YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICAgMzQgIC0+IC0xCitkcXJvdDIwNiByb3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgICAtMSAgLT4gLTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxcm90MjA3IHJvdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMCAgIC0yICAtPiAtMAorZHFyb3QyMDggcm90YXRlIC0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTEgIC0+IC00MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzCitkcXJvdDIwOSByb3RhdGUgLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMzMgLT4gLTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEKK2Rxcm90MjEwIHJvdGF0ZSAtMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIC0zNCAtPiAtMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorZHFyb3QyMTEgcm90YXRlIC05OTM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTMzIC0+IC05MzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ5CitkcXJvdDIxMiByb3RhdGUgLTk5MzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMzQgLT4gLTk5MzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQKKworCistLSBTcGVjaWFsczsgTmFOcyBhcmUgaGFuZGxlZCBhcyB1c3VhbAorZHFyb3Q3ODEgcm90YXRlIC1JbmYgIC04ICAgICAtPiAtSW5maW5pdHkKK2Rxcm90NzgyIHJvdGF0ZSAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitkcXJvdDc4MyByb3RhdGUgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorZHFyb3Q3ODQgcm90YXRlIC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK2Rxcm90Nzg1IHJvdGF0ZSAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkcXJvdDc4NiByb3RhdGUgLUluZiAgIDggICAgIC0+IC1JbmZpbml0eQorZHFyb3Q3ODcgcm90YXRlIC0xMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90Nzg4IHJvdGF0ZSAtSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDc4OSByb3RhdGUgLTEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q3OTAgcm90YXRlIC0wICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90NzkxIHJvdGF0ZSAgMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDc5MiByb3RhdGUgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q3OTMgcm90YXRlICAxMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90Nzk0IHJvdGF0ZSAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rxcm90ODAwIHJvdGF0ZSAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDgwMSByb3RhdGUgIEluZiAgLTggICAgIC0+IEluZmluaXR5CitkcXJvdDgwMiByb3RhdGUgIEluZiAgLTEgICAgIC0+IEluZmluaXR5CitkcXJvdDgwMyByb3RhdGUgIEluZiAgLTAgICAgIC0+IEluZmluaXR5CitkcXJvdDgwNCByb3RhdGUgIEluZiAgIDAgICAgIC0+IEluZmluaXR5CitkcXJvdDgwNSByb3RhdGUgIEluZiAgIDEgICAgIC0+IEluZmluaXR5CitkcXJvdDgwNiByb3RhdGUgIEluZiAgIDggICAgIC0+IEluZmluaXR5CitkcXJvdDgwNyByb3RhdGUgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4MDggcm90YXRlIC0xMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODA5IHJvdGF0ZSAtSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDgxMCByb3RhdGUgLTEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4MTEgcm90YXRlIC0wICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODEyIHJvdGF0ZSAgMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDgxMyByb3RhdGUgIDEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4MTQgcm90YXRlICAxMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODE1IHJvdGF0ZSAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rxcm90ODIxIHJvdGF0ZSAgTmFOIC1JbmYgICAgLT4gIE5hTgorZHFyb3Q4MjIgcm90YXRlICBOYU4gLTEwMDAgICAtPiAgTmFOCitkcXJvdDgyMyByb3RhdGUgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2Rxcm90ODI0IHJvdGF0ZSAgTmFOIC0wICAgICAgLT4gIE5hTgorZHFyb3Q4MjUgcm90YXRlICBOYU4gIDAgICAgICAtPiAgTmFOCitkcXJvdDgyNiByb3RhdGUgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2Rxcm90ODI3IHJvdGF0ZSAgTmFOICAxMDAwICAgLT4gIE5hTgorZHFyb3Q4Mjggcm90YXRlICBOYU4gIEluZiAgICAtPiAgTmFOCitkcXJvdDgyOSByb3RhdGUgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2Rxcm90ODMwIHJvdGF0ZSAtSW5mICBOYU4gICAgLT4gIE5hTgorZHFyb3Q4MzEgcm90YXRlIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkcXJvdDgzMiByb3RhdGUgLTEgICAgTmFOICAgIC0+ICBOYU4KK2Rxcm90ODMzIHJvdGF0ZSAtMCAgICBOYU4gICAgLT4gIE5hTgorZHFyb3Q4MzQgcm90YXRlICAwICAgIE5hTiAgICAtPiAgTmFOCitkcXJvdDgzNSByb3RhdGUgIDEgICAgTmFOICAgIC0+ICBOYU4KK2Rxcm90ODM2IHJvdGF0ZSAgMTAwMCBOYU4gICAgLT4gIE5hTgorZHFyb3Q4Mzcgcm90YXRlICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2Rxcm90ODQxIHJvdGF0ZSAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODQyIHJvdGF0ZSAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODQzIHJvdGF0ZSAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODQ0IHJvdGF0ZSAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODQ1IHJvdGF0ZSAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODQ2IHJvdGF0ZSAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODQ3IHJvdGF0ZSAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODQ4IHJvdGF0ZSAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODQ5IHJvdGF0ZSAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODUwIHJvdGF0ZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODUxIHJvdGF0ZSAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODUyIHJvdGF0ZSAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODUzIHJvdGF0ZSAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODU0IHJvdGF0ZSAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODU1IHJvdGF0ZSAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODU2IHJvdGF0ZSAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODU3IHJvdGF0ZSAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODU4IHJvdGF0ZSAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODU5IHJvdGF0ZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHFyb3Q4NjEgcm90YXRlICBOYU4xICAgLUluZiAgICAtPiAgTmFOMQorZHFyb3Q4NjIgcm90YXRlICtOYU4yICAgLTEwMDAgICAtPiAgTmFOMgorZHFyb3Q4NjMgcm90YXRlICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworZHFyb3Q4NjQgcm90YXRlICBOYU40ICAgIEluZiAgICAtPiAgTmFONAorZHFyb3Q4NjUgcm90YXRlICBOYU41ICAgK05hTjYgICAtPiAgTmFONQorZHFyb3Q4NjYgcm90YXRlIC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworZHFyb3Q4Njcgcm90YXRlIC0xMDAwICAgIE5hTjggICAtPiAgTmFOOAorZHFyb3Q4Njggcm90YXRlICAxMDAwICAgIE5hTjkgICAtPiAgTmFOOQorZHFyb3Q4Njkgcm90YXRlICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK2Rxcm90ODcxIHJvdGF0ZSAgc05hTjExICAtSW5mICAgLT4gIE5hTjExICBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4NzIgcm90YXRlICBzTmFOMTIgIC0xMDAwICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg3MyByb3RhdGUgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODc0IHJvdGF0ZSAgc05hTjE0ICAgTmFOMTcgLT4gIE5hTjE0ICBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4NzUgcm90YXRlICBzTmFOMTUgIHNOYU4xOCAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg3NiByb3RhdGUgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODc3IHJvdGF0ZSAtSW5mICAgICtzTmFOMjAgLT4gIE5hTjIwICBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4Nzggcm90YXRlIC0xMDAwICAgIHNOYU4yMSAtPiAgTmFOMjEgIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg3OSByb3RhdGUgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODgwIHJvdGF0ZSAgSW5mICAgICBzTmFOMjMgLT4gIE5hTjIzICBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4ODEgcm90YXRlICtOYU4yNSAgK3NOYU4yNCAtPiAgTmFOMjQgIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg4MiByb3RhdGUgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorZHFyb3Q4ODMgcm90YXRlIC1zTmFOMjcgIHNOYU4yOSAtPiAtTmFOMjcgIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg4NCByb3RhdGUgIDEwMDAgICAgLU5hTjMwIC0+IC1OYU4zMAorZHFyb3Q4ODUgcm90YXRlICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxU2FtZVF1YW50dW0uZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFTYW1lUXVhbnR1bS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1N2NkYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxU2FtZVF1YW50dW0uZGVjVGVzdApAQCAtMCwwICsxLDM4OSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcVNhbWVRdWFudHVtLmRlY1Rlc3QgLS0gY2hlY2sgZGVjUXVhZCBxdWFudHVtcyBtYXRjaCAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDAxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjUXVhZHMuCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkcXNhbXEwMDEgc2FtZXF1YW50dW0gIDAgICAgICAwICAgICAgLT4gIDEKK2Rxc2FtcTAwMiBzYW1lcXVhbnR1bSAgMCAgICAgIDEgICAgICAtPiAgMQorZHFzYW1xMDAzIHNhbWVxdWFudHVtICAxICAgICAgMCAgICAgIC0+ICAxCitkcXNhbXEwMDQgc2FtZXF1YW50dW0gIDEgICAgICAxICAgICAgLT4gIDEKKworZHFzYW1xMDExIHNhbWVxdWFudHVtICAxMCAgICAgMUUrMSAgIC0+IDAKK2Rxc2FtcTAxMiBzYW1lcXVhbnR1bSAgMTBFKzEgIDEwRSsxICAtPiAxCitkcXNhbXEwMTMgc2FtZXF1YW50dW0gIDEwMCAgICAxMEUrMSAgLT4gMAorZHFzYW1xMDE0IHNhbWVxdWFudHVtICAxMDAgICAgMUUrMiAgIC0+IDAKK2Rxc2FtcTAxNSBzYW1lcXVhbnR1bSAgMC4xICAgIDFFLTIgICAtPiAwCitkcXNhbXEwMTYgc2FtZXF1YW50dW0gIDAuMSAgICAxRS0xICAgLT4gMQorZHFzYW1xMDE3IHNhbWVxdWFudHVtICAwLjEgICAgMUUtMCAgIC0+IDAKK2Rxc2FtcTAxOCBzYW1lcXVhbnR1bSAgOTk5ICAgIDk5OSAgICAtPiAxCitkcXNhbXEwMTkgc2FtZXF1YW50dW0gIDk5OUUtMSA5OS45ICAgLT4gMQorZHFzYW1xMDIwIHNhbWVxdWFudHVtICAxMTFFLTEgMjIuMiAgIC0+IDEKK2Rxc2FtcTAyMSBzYW1lcXVhbnR1bSAgMTExRS0xIDEyMzQuMiAtPiAxCisKKy0tIHplcm9zCitkcXNhbXEwMzAgc2FtZXF1YW50dW0gIDAuMCAgICAxLjEgICAgLT4gMQorZHFzYW1xMDMxIHNhbWVxdWFudHVtICAwLjAgICAgMS4xMSAgIC0+IDAKK2Rxc2FtcTAzMiBzYW1lcXVhbnR1bSAgMC4wICAgIDAgICAgICAtPiAwCitkcXNhbXEwMzMgc2FtZXF1YW50dW0gIDAuMCAgICAwLjAgICAgLT4gMQorZHFzYW1xMDM0IHNhbWVxdWFudHVtICAwLjAgICAgMC4wMCAgIC0+IDAKK2Rxc2FtcTAzNSBzYW1lcXVhbnR1bSAgMEUrMSAgIDBFKzAgICAtPiAwCitkcXNhbXEwMzYgc2FtZXF1YW50dW0gIDBFKzEgICAwRSsxICAgLT4gMQorZHFzYW1xMDM3IHNhbWVxdWFudHVtICAwRSsxICAgMEUrMiAgIC0+IDAKK2Rxc2FtcTAzOCBzYW1lcXVhbnR1bSAgMEUtMTcgIDBFLTE2ICAtPiAwCitkcXNhbXEwMzkgc2FtZXF1YW50dW0gIDBFLTE3ICAwRS0xNyAgLT4gMQorZHFzYW1xMDQwIHNhbWVxdWFudHVtICAwRS0xNyAgMEUtMTggIC0+IDAKK2Rxc2FtcTA0MSBzYW1lcXVhbnR1bSAgMEUtMTcgIDAuMEUtMTUgLT4gMAorZHFzYW1xMDQyIHNhbWVxdWFudHVtICAwRS0xNyAgMC4wRS0xNiAtPiAxCitkcXNhbXEwNDMgc2FtZXF1YW50dW0gIDBFLTE3ICAwLjBFLTE3IC0+IDAKK2Rxc2FtcTA0NCBzYW1lcXVhbnR1bSAtMEUtMTcgIDAuMEUtMTYgLT4gMQorZHFzYW1xMDQ1IHNhbWVxdWFudHVtICAwRS0xNyAtMC4wRS0xNyAtPiAwCitkcXNhbXEwNDYgc2FtZXF1YW50dW0gIDBFLTE3IC0wLjBFLTE2IC0+IDEKK2Rxc2FtcTA0NyBzYW1lcXVhbnR1bSAtMEUtMTcgIDAuMEUtMTcgLT4gMAorZHFzYW1xMDQ4IHNhbWVxdWFudHVtIC0wRS0xNyAtMC4wRS0xNiAtPiAxCitkcXNhbXEwNDkgc2FtZXF1YW50dW0gLTBFLTE3IC0wLjBFLTE3IC0+IDAKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2Rxc2FtcTA1MSBzYW1lcXVhbnR1bSAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAxCitkcXNhbXEwNTIgc2FtZXF1YW50dW0gIDFFLTYxNDMgICAgICAgICAgICAgMUUtNjE0MyAgICAgICAgICAgLT4gMQorZHFzYW1xMDUzIHNhbWVxdWFudHVtICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0+IDEKK2Rxc2FtcTA1NCBzYW1lcXVhbnR1bSAgMUUtNjE3NiAgICAgICAgICAgICAxRS02MTc2ICAgICAgICAgICAtPiAxCitkcXNhbXEwNTUgc2FtZXF1YW50dW0gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gMQorZHFzYW1xMDU2IHNhbWVxdWFudHVtICAxRS02MTQzICAgICAgICAgICAgIDFFLTYxNDMgICAgICAgICAgIC0+IDEKK2Rxc2FtcTA1NyBzYW1lcXVhbnR1bSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAxCitkcXNhbXEwNTggc2FtZXF1YW50dW0gIDFFLTYxNzYgICAgICAgICAgICAgMUUtNjE3NiAgICAgICAgICAgLT4gMQorCitkcXNhbXEwNjEgc2FtZXF1YW50dW0gIC0xRS02MTc2ICAgICAgICAgICAgLTFFLTYxNzYgICAgICAgICAgLT4gMQorZHFzYW1xMDYyIHNhbWVxdWFudHVtICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzIC0+IDEKK2Rxc2FtcTA2MyBzYW1lcXVhbnR1bSAgLTFFLTYxNDMgICAgICAgICAgICAtMUUtNjE0MyAgICAgICAgICAtPiAxCitkcXNhbXEwNjQgc2FtZXF1YW50dW0gIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLT4gMQorZHFzYW1xMDY1IHNhbWVxdWFudHVtICAtMUUtNjE3NiAgICAgICAgICAgIC0xRS02MTc2ICAgICAgICAgIC0+IDEKK2Rxc2FtcTA2NiBzYW1lcXVhbnR1bSAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAtPiAxCitkcXNhbXEwNjcgc2FtZXF1YW50dW0gIC0xRS02MTQzICAgICAgICAgICAgLTFFLTYxNDMgICAgICAgICAgLT4gMQorZHFzYW1xMDY4IHNhbWVxdWFudHVtICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+IDEKKworZHFzYW1xMDcxIHNhbWVxdWFudHVtICAtNEUtNjE3NiAgICAgICAgICAgIC0xRS02MTc2ICAgICAgICAgIC0+IDEKK2Rxc2FtcTA3MiBzYW1lcXVhbnR1bSAgLTQuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDAwMEUtNjE0MyAtPiAxCitkcXNhbXEwNzMgc2FtZXF1YW50dW0gIC00RS02MTQzICAgICAgICAgICAgLTFFLTYxNDMgICAgICAgICAgLT4gMQorZHFzYW1xMDc0IHNhbWVxdWFudHVtICAtNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC05Ljk5OTQ5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+IDEKK2Rxc2FtcTA3NSBzYW1lcXVhbnR1bSAgLTRFLTYxNzYgICAgICAgICAgICAtMUUtNjE3NiAgICAgICAgICAtPiAxCitkcXNhbXEwNzYgc2FtZXF1YW50dW0gIC00LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgLTEuMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgLT4gMQorZHFzYW1xMDc3IHNhbWVxdWFudHVtICAtNEUtNjE0MyAgICAgICAgICAgIC0xRS02MTQzICAgICAgICAgIC0+IDEKK2Rxc2FtcTA3OCBzYW1lcXVhbnR1bSAgLTQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAtOS45NDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtPiAxCisKK2Rxc2FtcTA4MSBzYW1lcXVhbnR1bSAgLTRFLTEwMDYgICAgICAgICAgIC0xRS02MTc2ICAgICAgICAgIC0+IDAKK2Rxc2FtcTA4MiBzYW1lcXVhbnR1bSAgLTQuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtMS4wMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjEzNiAtPiAwCitkcXNhbXEwODMgc2FtZXF1YW50dW0gIC00RS02MTQwICAgICAgICAgICAtMUUtNjE0MyAgICAgICAgICAtPiAwCitkcXNhbXEwODQgc2FtZXF1YW50dW0gIC00Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLTkuOTk5NDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMzYgLT4gMAorZHFzYW1xMDg1IHNhbWVxdWFudHVtICAtNEUtMTAwNiAgICAgICAgICAgLTFFLTYxNzYgICAgICAgICAgLT4gMAorZHFzYW1xMDg2IHNhbWVxdWFudHVtICAtNC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgIC0xLjAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTM2IC0+IDAKK2Rxc2FtcTA4NyBzYW1lcXVhbnR1bSAgLTRFLTYxMzMgICAgICAgICAgIC0xRS02MTQzICAgICAgICAgIC0+IDAKK2Rxc2FtcTA4OCBzYW1lcXVhbnR1bSAgLTQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAtOS45NDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjEzNiAtPiAwCisKKy0tIHNwZWNpYWxzICYgY29tYmluYXRpb25zCitkcXNhbXEwMTEwIHNhbWVxdWFudHVtICAtSW5mICAgIC1JbmYgICAtPiAxCitkcXNhbXEwMTExIHNhbWVxdWFudHVtICAtSW5mICAgICBJbmYgICAtPiAxCitkcXNhbXEwMTEyIHNhbWVxdWFudHVtICAtSW5mICAgICBOYU4gICAtPiAwCitkcXNhbXEwMTEzIHNhbWVxdWFudHVtICAtSW5mICAgIC03RSszICAtPiAwCitkcXNhbXEwMTE0IHNhbWVxdWFudHVtICAtSW5mICAgIC03ICAgICAtPiAwCitkcXNhbXEwMTE1IHNhbWVxdWFudHVtICAtSW5mICAgIC03RS0zICAtPiAwCitkcXNhbXEwMTE2IHNhbWVxdWFudHVtICAtSW5mICAgIC0wRS0zICAtPiAwCitkcXNhbXEwMTE3IHNhbWVxdWFudHVtICAtSW5mICAgIC0wICAgICAtPiAwCitkcXNhbXEwMTE4IHNhbWVxdWFudHVtICAtSW5mICAgIC0wRSszICAtPiAwCitkcXNhbXEwMTE5IHNhbWVxdWFudHVtICAtSW5mICAgICAwRS0zICAtPiAwCitkcXNhbXEwMTIwIHNhbWVxdWFudHVtICAtSW5mICAgICAwICAgICAtPiAwCitkcXNhbXEwMTIxIHNhbWVxdWFudHVtICAtSW5mICAgICAwRSszICAtPiAwCitkcXNhbXEwMTIyIHNhbWVxdWFudHVtICAtSW5mICAgICA3RS0zICAtPiAwCitkcXNhbXEwMTIzIHNhbWVxdWFudHVtICAtSW5mICAgICA3ICAgICAtPiAwCitkcXNhbXEwMTI0IHNhbWVxdWFudHVtICAtSW5mICAgICA3RSszICAtPiAwCitkcXNhbXEwMTI1IHNhbWVxdWFudHVtICAtSW5mICAgICBzTmFOICAtPiAwCisKK2Rxc2FtcTAyMTAgc2FtZXF1YW50dW0gICBJbmYgICAgLUluZiAgIC0+IDEKK2Rxc2FtcTAyMTEgc2FtZXF1YW50dW0gICBJbmYgICAgIEluZiAgIC0+IDEKK2Rxc2FtcTAyMTIgc2FtZXF1YW50dW0gICBJbmYgICAgIE5hTiAgIC0+IDAKK2Rxc2FtcTAyMTMgc2FtZXF1YW50dW0gICBJbmYgICAgLTdFKzMgIC0+IDAKK2Rxc2FtcTAyMTQgc2FtZXF1YW50dW0gICBJbmYgICAgLTcgICAgIC0+IDAKK2Rxc2FtcTAyMTUgc2FtZXF1YW50dW0gICBJbmYgICAgLTdFLTMgIC0+IDAKK2Rxc2FtcTAyMTYgc2FtZXF1YW50dW0gICBJbmYgICAgLTBFLTMgIC0+IDAKK2Rxc2FtcTAyMTcgc2FtZXF1YW50dW0gICBJbmYgICAgLTAgICAgIC0+IDAKK2Rxc2FtcTAyMTggc2FtZXF1YW50dW0gICBJbmYgICAgLTBFKzMgIC0+IDAKK2Rxc2FtcTAyMTkgc2FtZXF1YW50dW0gICBJbmYgICAgIDBFLTMgIC0+IDAKK2Rxc2FtcTAyMjAgc2FtZXF1YW50dW0gICBJbmYgICAgIDAgICAgIC0+IDAKK2Rxc2FtcTAyMjEgc2FtZXF1YW50dW0gICBJbmYgICAgIDBFKzMgIC0+IDAKK2Rxc2FtcTAyMjIgc2FtZXF1YW50dW0gICBJbmYgICAgIDdFLTMgIC0+IDAKK2Rxc2FtcTAyMjMgc2FtZXF1YW50dW0gICBJbmYgICAgIDcgICAgIC0+IDAKK2Rxc2FtcTAyMjQgc2FtZXF1YW50dW0gICBJbmYgICAgIDdFKzMgIC0+IDAKK2Rxc2FtcTAyMjUgc2FtZXF1YW50dW0gICBJbmYgICAgIHNOYU4gIC0+IDAKKworZHFzYW1xMDMxMCBzYW1lcXVhbnR1bSAgIE5hTiAgICAtSW5mICAgLT4gMAorZHFzYW1xMDMxMSBzYW1lcXVhbnR1bSAgIE5hTiAgICAgSW5mICAgLT4gMAorZHFzYW1xMDMxMiBzYW1lcXVhbnR1bSAgIE5hTiAgICAgTmFOICAgLT4gMQorZHFzYW1xMDMxMyBzYW1lcXVhbnR1bSAgIE5hTiAgICAtN0UrMyAgLT4gMAorZHFzYW1xMDMxNCBzYW1lcXVhbnR1bSAgIE5hTiAgICAtNyAgICAgLT4gMAorZHFzYW1xMDMxNSBzYW1lcXVhbnR1bSAgIE5hTiAgICAtN0UtMyAgLT4gMAorZHFzYW1xMDMxNiBzYW1lcXVhbnR1bSAgIE5hTiAgICAtMEUtMyAgLT4gMAorZHFzYW1xMDMxNyBzYW1lcXVhbnR1bSAgIE5hTiAgICAtMCAgICAgLT4gMAorZHFzYW1xMDMxOCBzYW1lcXVhbnR1bSAgIE5hTiAgICAtMEUrMyAgLT4gMAorZHFzYW1xMDMxOSBzYW1lcXVhbnR1bSAgIE5hTiAgICAgMEUtMyAgLT4gMAorZHFzYW1xMDMyMCBzYW1lcXVhbnR1bSAgIE5hTiAgICAgMCAgICAgLT4gMAorZHFzYW1xMDMyMSBzYW1lcXVhbnR1bSAgIE5hTiAgICAgMEUrMyAgLT4gMAorZHFzYW1xMDMyMiBzYW1lcXVhbnR1bSAgIE5hTiAgICAgN0UtMyAgLT4gMAorZHFzYW1xMDMyMyBzYW1lcXVhbnR1bSAgIE5hTiAgICAgNyAgICAgLT4gMAorZHFzYW1xMDMyNCBzYW1lcXVhbnR1bSAgIE5hTiAgICAgN0UrMyAgLT4gMAorZHFzYW1xMDMyNSBzYW1lcXVhbnR1bSAgIE5hTiAgICAgc05hTiAgLT4gMQorCitkcXNhbXEwNDEwIHNhbWVxdWFudHVtICAtN0UrMyAgICAtSW5mICAgLT4gMAorZHFzYW1xMDQxMSBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIEluZiAgIC0+IDAKK2Rxc2FtcTA0MTIgc2FtZXF1YW50dW0gIC03RSszICAgICBOYU4gICAtPiAwCitkcXNhbXEwNDEzIHNhbWVxdWFudHVtICAtN0UrMyAgICAtN0UrMyAgLT4gMQorZHFzYW1xMDQxNCBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLTcgICAgIC0+IDAKK2Rxc2FtcTA0MTUgc2FtZXF1YW50dW0gIC03RSszICAgIC03RS0zICAtPiAwCitkcXNhbXEwNDE2IHNhbWVxdWFudHVtICAtN0UrMyAgICAtMEUtMyAgLT4gMAorZHFzYW1xMDQxNyBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLTAgICAgIC0+IDAKK2Rxc2FtcTA0MTggc2FtZXF1YW50dW0gIC03RSszICAgIC0wRSszICAtPiAxCitkcXNhbXEwNDE5IHNhbWVxdWFudHVtICAtN0UrMyAgICAgMEUtMyAgLT4gMAorZHFzYW1xMDQyMCBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIDAgICAgIC0+IDAKK2Rxc2FtcTA0MjEgc2FtZXF1YW50dW0gIC03RSszICAgICAwRSszICAtPiAxCitkcXNhbXEwNDIyIHNhbWVxdWFudHVtICAtN0UrMyAgICAgN0UtMyAgLT4gMAorZHFzYW1xMDQyMyBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIDcgICAgIC0+IDAKK2Rxc2FtcTA0MjQgc2FtZXF1YW50dW0gIC03RSszICAgICA3RSszICAtPiAxCitkcXNhbXEwNDI1IHNhbWVxdWFudHVtICAtN0UrMyAgICAgc05hTiAgLT4gMAorCitkcXNhbXEwNTEwIHNhbWVxdWFudHVtICAtNyAgICAgIC1JbmYgICAtPiAwCitkcXNhbXEwNTExIHNhbWVxdWFudHVtICAtNyAgICAgICBJbmYgICAtPiAwCitkcXNhbXEwNTEyIHNhbWVxdWFudHVtICAtNyAgICAgICBOYU4gICAtPiAwCitkcXNhbXEwNTEzIHNhbWVxdWFudHVtICAtNyAgICAgIC03RSszICAtPiAwCitkcXNhbXEwNTE0IHNhbWVxdWFudHVtICAtNyAgICAgIC03ICAgICAtPiAxCitkcXNhbXEwNTE1IHNhbWVxdWFudHVtICAtNyAgICAgIC03RS0zICAtPiAwCitkcXNhbXEwNTE2IHNhbWVxdWFudHVtICAtNyAgICAgIC0wRS0zICAtPiAwCitkcXNhbXEwNTE3IHNhbWVxdWFudHVtICAtNyAgICAgIC0wICAgICAtPiAxCitkcXNhbXEwNTE4IHNhbWVxdWFudHVtICAtNyAgICAgIC0wRSszICAtPiAwCitkcXNhbXEwNTE5IHNhbWVxdWFudHVtICAtNyAgICAgICAwRS0zICAtPiAwCitkcXNhbXEwNTIwIHNhbWVxdWFudHVtICAtNyAgICAgICAwICAgICAtPiAxCitkcXNhbXEwNTIxIHNhbWVxdWFudHVtICAtNyAgICAgICAwRSszICAtPiAwCitkcXNhbXEwNTIyIHNhbWVxdWFudHVtICAtNyAgICAgICA3RS0zICAtPiAwCitkcXNhbXEwNTIzIHNhbWVxdWFudHVtICAtNyAgICAgICA3ICAgICAtPiAxCitkcXNhbXEwNTI0IHNhbWVxdWFudHVtICAtNyAgICAgICA3RSszICAtPiAwCitkcXNhbXEwNTI1IHNhbWVxdWFudHVtICAtNyAgICAgICBzTmFOICAtPiAwCisKK2Rxc2FtcTA2MTAgc2FtZXF1YW50dW0gIC03RS0zICAgIC1JbmYgICAtPiAwCitkcXNhbXEwNjExIHNhbWVxdWFudHVtICAtN0UtMyAgICAgSW5mICAgLT4gMAorZHFzYW1xMDYxMiBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIE5hTiAgIC0+IDAKK2Rxc2FtcTA2MTMgc2FtZXF1YW50dW0gIC03RS0zICAgIC03RSszICAtPiAwCitkcXNhbXEwNjE0IHNhbWVxdWFudHVtICAtN0UtMyAgICAtNyAgICAgLT4gMAorZHFzYW1xMDYxNSBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLTdFLTMgIC0+IDEKK2Rxc2FtcTA2MTYgc2FtZXF1YW50dW0gIC03RS0zICAgIC0wRS0zICAtPiAxCitkcXNhbXEwNjE3IHNhbWVxdWFudHVtICAtN0UtMyAgICAtMCAgICAgLT4gMAorZHFzYW1xMDYxOCBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLTBFKzMgIC0+IDAKK2Rxc2FtcTA2MTkgc2FtZXF1YW50dW0gIC03RS0zICAgICAwRS0zICAtPiAxCitkcXNhbXEwNjIwIHNhbWVxdWFudHVtICAtN0UtMyAgICAgMCAgICAgLT4gMAorZHFzYW1xMDYyMSBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIDBFKzMgIC0+IDAKK2Rxc2FtcTA2MjIgc2FtZXF1YW50dW0gIC03RS0zICAgICA3RS0zICAtPiAxCitkcXNhbXEwNjIzIHNhbWVxdWFudHVtICAtN0UtMyAgICAgNyAgICAgLT4gMAorZHFzYW1xMDYyNCBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIDdFKzMgIC0+IDAKK2Rxc2FtcTA2MjUgc2FtZXF1YW50dW0gIC03RS0zICAgICBzTmFOICAtPiAwCisKK2Rxc2FtcTA3MTAgc2FtZXF1YW50dW0gIC0wRS0zICAgIC1JbmYgICAtPiAwCitkcXNhbXEwNzExIHNhbWVxdWFudHVtICAtMEUtMyAgICAgSW5mICAgLT4gMAorZHFzYW1xMDcxMiBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIE5hTiAgIC0+IDAKK2Rxc2FtcTA3MTMgc2FtZXF1YW50dW0gIC0wRS0zICAgIC03RSszICAtPiAwCitkcXNhbXEwNzE0IHNhbWVxdWFudHVtICAtMEUtMyAgICAtNyAgICAgLT4gMAorZHFzYW1xMDcxNSBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLTdFLTMgIC0+IDEKK2Rxc2FtcTA3MTYgc2FtZXF1YW50dW0gIC0wRS0zICAgIC0wRS0zICAtPiAxCitkcXNhbXEwNzE3IHNhbWVxdWFudHVtICAtMEUtMyAgICAtMCAgICAgLT4gMAorZHFzYW1xMDcxOCBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLTBFKzMgIC0+IDAKK2Rxc2FtcTA3MTkgc2FtZXF1YW50dW0gIC0wRS0zICAgICAwRS0zICAtPiAxCitkcXNhbXEwNzIwIHNhbWVxdWFudHVtICAtMEUtMyAgICAgMCAgICAgLT4gMAorZHFzYW1xMDcyMSBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIDBFKzMgIC0+IDAKK2Rxc2FtcTA3MjIgc2FtZXF1YW50dW0gIC0wRS0zICAgICA3RS0zICAtPiAxCitkcXNhbXEwNzIzIHNhbWVxdWFudHVtICAtMEUtMyAgICAgNyAgICAgLT4gMAorZHFzYW1xMDcyNCBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIDdFKzMgIC0+IDAKK2Rxc2FtcTA3MjUgc2FtZXF1YW50dW0gIC0wRS0zICAgICBzTmFOICAtPiAwCisKK2Rxc2FtcTA4MTAgc2FtZXF1YW50dW0gIC0wICAgICAgLUluZiAgIC0+IDAKK2Rxc2FtcTA4MTEgc2FtZXF1YW50dW0gIC0wICAgICAgIEluZiAgIC0+IDAKK2Rxc2FtcTA4MTIgc2FtZXF1YW50dW0gIC0wICAgICAgIE5hTiAgIC0+IDAKK2Rxc2FtcTA4MTMgc2FtZXF1YW50dW0gIC0wICAgICAgLTdFKzMgIC0+IDAKK2Rxc2FtcTA4MTQgc2FtZXF1YW50dW0gIC0wICAgICAgLTcgICAgIC0+IDEKK2Rxc2FtcTA4MTUgc2FtZXF1YW50dW0gIC0wICAgICAgLTdFLTMgIC0+IDAKK2Rxc2FtcTA4MTYgc2FtZXF1YW50dW0gIC0wICAgICAgLTBFLTMgIC0+IDAKK2Rxc2FtcTA4MTcgc2FtZXF1YW50dW0gIC0wICAgICAgLTAgICAgIC0+IDEKK2Rxc2FtcTA4MTggc2FtZXF1YW50dW0gIC0wICAgICAgLTBFKzMgIC0+IDAKK2Rxc2FtcTA4MTkgc2FtZXF1YW50dW0gIC0wICAgICAgIDBFLTMgIC0+IDAKK2Rxc2FtcTA4MjAgc2FtZXF1YW50dW0gIC0wICAgICAgIDAgICAgIC0+IDEKK2Rxc2FtcTA4MjEgc2FtZXF1YW50dW0gIC0wICAgICAgIDBFKzMgIC0+IDAKK2Rxc2FtcTA4MjIgc2FtZXF1YW50dW0gIC0wICAgICAgIDdFLTMgIC0+IDAKK2Rxc2FtcTA4MjMgc2FtZXF1YW50dW0gIC0wICAgICAgIDcgICAgIC0+IDEKK2Rxc2FtcTA4MjQgc2FtZXF1YW50dW0gIC0wICAgICAgIDdFKzMgIC0+IDAKK2Rxc2FtcTA4MjUgc2FtZXF1YW50dW0gIC0wICAgICAgIHNOYU4gIC0+IDAKKworZHFzYW1xMDkxMCBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLUluZiAgIC0+IDAKK2Rxc2FtcTA5MTEgc2FtZXF1YW50dW0gIC0wRSszICAgICBJbmYgICAtPiAwCitkcXNhbXEwOTEyIHNhbWVxdWFudHVtICAtMEUrMyAgICAgTmFOICAgLT4gMAorZHFzYW1xMDkxMyBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLTdFKzMgIC0+IDEKK2Rxc2FtcTA5MTQgc2FtZXF1YW50dW0gIC0wRSszICAgIC03ICAgICAtPiAwCitkcXNhbXEwOTE1IHNhbWVxdWFudHVtICAtMEUrMyAgICAtN0UtMyAgLT4gMAorZHFzYW1xMDkxNiBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLTBFLTMgIC0+IDAKK2Rxc2FtcTA5MTcgc2FtZXF1YW50dW0gIC0wRSszICAgIC0wICAgICAtPiAwCitkcXNhbXEwOTE4IHNhbWVxdWFudHVtICAtMEUrMyAgICAtMEUrMyAgLT4gMQorZHFzYW1xMDkxOSBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIDBFLTMgIC0+IDAKK2Rxc2FtcTA5MjAgc2FtZXF1YW50dW0gIC0wRSszICAgICAwICAgICAtPiAwCitkcXNhbXEwOTIxIHNhbWVxdWFudHVtICAtMEUrMyAgICAgMEUrMyAgLT4gMQorZHFzYW1xMDkyMiBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIDdFLTMgIC0+IDAKK2Rxc2FtcTA5MjMgc2FtZXF1YW50dW0gIC0wRSszICAgICA3ICAgICAtPiAwCitkcXNhbXEwOTI0IHNhbWVxdWFudHVtICAtMEUrMyAgICAgN0UrMyAgLT4gMQorZHFzYW1xMDkyNSBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIHNOYU4gIC0+IDAKKworZHFzYW1xMTExMCBzYW1lcXVhbnR1bSAgMEUtMyAgICAtSW5mICAgLT4gMAorZHFzYW1xMTExMSBzYW1lcXVhbnR1bSAgMEUtMyAgICAgSW5mICAgLT4gMAorZHFzYW1xMTExMiBzYW1lcXVhbnR1bSAgMEUtMyAgICAgTmFOICAgLT4gMAorZHFzYW1xMTExMyBzYW1lcXVhbnR1bSAgMEUtMyAgICAtN0UrMyAgLT4gMAorZHFzYW1xMTExNCBzYW1lcXVhbnR1bSAgMEUtMyAgICAtNyAgICAgLT4gMAorZHFzYW1xMTExNSBzYW1lcXVhbnR1bSAgMEUtMyAgICAtN0UtMyAgLT4gMQorZHFzYW1xMTExNiBzYW1lcXVhbnR1bSAgMEUtMyAgICAtMEUtMyAgLT4gMQorZHFzYW1xMTExNyBzYW1lcXVhbnR1bSAgMEUtMyAgICAtMCAgICAgLT4gMAorZHFzYW1xMTExOCBzYW1lcXVhbnR1bSAgMEUtMyAgICAtMEUrMyAgLT4gMAorZHFzYW1xMTExOSBzYW1lcXVhbnR1bSAgMEUtMyAgICAgMEUtMyAgLT4gMQorZHFzYW1xMTEyMCBzYW1lcXVhbnR1bSAgMEUtMyAgICAgMCAgICAgLT4gMAorZHFzYW1xMTEyMSBzYW1lcXVhbnR1bSAgMEUtMyAgICAgMEUrMyAgLT4gMAorZHFzYW1xMTEyMiBzYW1lcXVhbnR1bSAgMEUtMyAgICAgN0UtMyAgLT4gMQorZHFzYW1xMTEyMyBzYW1lcXVhbnR1bSAgMEUtMyAgICAgNyAgICAgLT4gMAorZHFzYW1xMTEyNCBzYW1lcXVhbnR1bSAgMEUtMyAgICAgN0UrMyAgLT4gMAorZHFzYW1xMTEyNSBzYW1lcXVhbnR1bSAgMEUtMyAgICAgc05hTiAgLT4gMAorCitkcXNhbXExMjEwIHNhbWVxdWFudHVtICAwICAgICAgIC1JbmYgICAtPiAwCitkcXNhbXExMjExIHNhbWVxdWFudHVtICAwICAgICAgICBJbmYgICAtPiAwCitkcXNhbXExMjEyIHNhbWVxdWFudHVtICAwICAgICAgICBOYU4gICAtPiAwCitkcXNhbXExMjEzIHNhbWVxdWFudHVtICAwICAgICAgIC03RSszICAtPiAwCitkcXNhbXExMjE0IHNhbWVxdWFudHVtICAwICAgICAgIC03ICAgICAtPiAxCitkcXNhbXExMjE1IHNhbWVxdWFudHVtICAwICAgICAgIC03RS0zICAtPiAwCitkcXNhbXExMjE2IHNhbWVxdWFudHVtICAwICAgICAgIC0wRS0zICAtPiAwCitkcXNhbXExMjE3IHNhbWVxdWFudHVtICAwICAgICAgIC0wICAgICAtPiAxCitkcXNhbXExMjE4IHNhbWVxdWFudHVtICAwICAgICAgIC0wRSszICAtPiAwCitkcXNhbXExMjE5IHNhbWVxdWFudHVtICAwICAgICAgICAwRS0zICAtPiAwCitkcXNhbXExMjIwIHNhbWVxdWFudHVtICAwICAgICAgICAwICAgICAtPiAxCitkcXNhbXExMjIxIHNhbWVxdWFudHVtICAwICAgICAgICAwRSszICAtPiAwCitkcXNhbXExMjIyIHNhbWVxdWFudHVtICAwICAgICAgICA3RS0zICAtPiAwCitkcXNhbXExMjIzIHNhbWVxdWFudHVtICAwICAgICAgICA3ICAgICAtPiAxCitkcXNhbXExMjI0IHNhbWVxdWFudHVtICAwICAgICAgICA3RSszICAtPiAwCitkcXNhbXExMjI1IHNhbWVxdWFudHVtICAwICAgICAgICBzTmFOICAtPiAwCisKK2Rxc2FtcTEzMTAgc2FtZXF1YW50dW0gIDBFKzMgICAgLUluZiAgIC0+IDAKK2Rxc2FtcTEzMTEgc2FtZXF1YW50dW0gIDBFKzMgICAgIEluZiAgIC0+IDAKK2Rxc2FtcTEzMTIgc2FtZXF1YW50dW0gIDBFKzMgICAgIE5hTiAgIC0+IDAKK2Rxc2FtcTEzMTMgc2FtZXF1YW50dW0gIDBFKzMgICAgLTdFKzMgIC0+IDEKK2Rxc2FtcTEzMTQgc2FtZXF1YW50dW0gIDBFKzMgICAgLTcgICAgIC0+IDAKK2Rxc2FtcTEzMTUgc2FtZXF1YW50dW0gIDBFKzMgICAgLTdFLTMgIC0+IDAKK2Rxc2FtcTEzMTYgc2FtZXF1YW50dW0gIDBFKzMgICAgLTBFLTMgIC0+IDAKK2Rxc2FtcTEzMTcgc2FtZXF1YW50dW0gIDBFKzMgICAgLTAgICAgIC0+IDAKK2Rxc2FtcTEzMTggc2FtZXF1YW50dW0gIDBFKzMgICAgLTBFKzMgIC0+IDEKK2Rxc2FtcTEzMTkgc2FtZXF1YW50dW0gIDBFKzMgICAgIDBFLTMgIC0+IDAKK2Rxc2FtcTEzMjAgc2FtZXF1YW50dW0gIDBFKzMgICAgIDAgICAgIC0+IDAKK2Rxc2FtcTEzMjEgc2FtZXF1YW50dW0gIDBFKzMgICAgIDBFKzMgIC0+IDEKK2Rxc2FtcTEzMjIgc2FtZXF1YW50dW0gIDBFKzMgICAgIDdFLTMgIC0+IDAKK2Rxc2FtcTEzMjMgc2FtZXF1YW50dW0gIDBFKzMgICAgIDcgICAgIC0+IDAKK2Rxc2FtcTEzMjQgc2FtZXF1YW50dW0gIDBFKzMgICAgIDdFKzMgIC0+IDEKK2Rxc2FtcTEzMjUgc2FtZXF1YW50dW0gIDBFKzMgICAgIHNOYU4gIC0+IDAKKworZHFzYW1xMTQxMCBzYW1lcXVhbnR1bSAgN0UtMyAgICAtSW5mICAgLT4gMAorZHFzYW1xMTQxMSBzYW1lcXVhbnR1bSAgN0UtMyAgICAgSW5mICAgLT4gMAorZHFzYW1xMTQxMiBzYW1lcXVhbnR1bSAgN0UtMyAgICAgTmFOICAgLT4gMAorZHFzYW1xMTQxMyBzYW1lcXVhbnR1bSAgN0UtMyAgICAtN0UrMyAgLT4gMAorZHFzYW1xMTQxNCBzYW1lcXVhbnR1bSAgN0UtMyAgICAtNyAgICAgLT4gMAorZHFzYW1xMTQxNSBzYW1lcXVhbnR1bSAgN0UtMyAgICAtN0UtMyAgLT4gMQorZHFzYW1xMTQxNiBzYW1lcXVhbnR1bSAgN0UtMyAgICAtMEUtMyAgLT4gMQorZHFzYW1xMTQxNyBzYW1lcXVhbnR1bSAgN0UtMyAgICAtMCAgICAgLT4gMAorZHFzYW1xMTQxOCBzYW1lcXVhbnR1bSAgN0UtMyAgICAtMEUrMyAgLT4gMAorZHFzYW1xMTQxOSBzYW1lcXVhbnR1bSAgN0UtMyAgICAgMEUtMyAgLT4gMQorZHFzYW1xMTQyMCBzYW1lcXVhbnR1bSAgN0UtMyAgICAgMCAgICAgLT4gMAorZHFzYW1xMTQyMSBzYW1lcXVhbnR1bSAgN0UtMyAgICAgMEUrMyAgLT4gMAorZHFzYW1xMTQyMiBzYW1lcXVhbnR1bSAgN0UtMyAgICAgN0UtMyAgLT4gMQorZHFzYW1xMTQyMyBzYW1lcXVhbnR1bSAgN0UtMyAgICAgNyAgICAgLT4gMAorZHFzYW1xMTQyNCBzYW1lcXVhbnR1bSAgN0UtMyAgICAgN0UrMyAgLT4gMAorZHFzYW1xMTQyNSBzYW1lcXVhbnR1bSAgN0UtMyAgICAgc05hTiAgLT4gMAorCitkcXNhbXExNTEwIHNhbWVxdWFudHVtICA3ICAgICAgLUluZiAgIC0+IDAKK2Rxc2FtcTE1MTEgc2FtZXF1YW50dW0gIDcgICAgICAgSW5mICAgLT4gMAorZHFzYW1xMTUxMiBzYW1lcXVhbnR1bSAgNyAgICAgICBOYU4gICAtPiAwCitkcXNhbXExNTEzIHNhbWVxdWFudHVtICA3ICAgICAgLTdFKzMgIC0+IDAKK2Rxc2FtcTE1MTQgc2FtZXF1YW50dW0gIDcgICAgICAtNyAgICAgLT4gMQorZHFzYW1xMTUxNSBzYW1lcXVhbnR1bSAgNyAgICAgIC03RS0zICAtPiAwCitkcXNhbXExNTE2IHNhbWVxdWFudHVtICA3ICAgICAgLTBFLTMgIC0+IDAKK2Rxc2FtcTE1MTcgc2FtZXF1YW50dW0gIDcgICAgICAtMCAgICAgLT4gMQorZHFzYW1xMTUxOCBzYW1lcXVhbnR1bSAgNyAgICAgIC0wRSszICAtPiAwCitkcXNhbXExNTE5IHNhbWVxdWFudHVtICA3ICAgICAgIDBFLTMgIC0+IDAKK2Rxc2FtcTE1MjAgc2FtZXF1YW50dW0gIDcgICAgICAgMCAgICAgLT4gMQorZHFzYW1xMTUyMSBzYW1lcXVhbnR1bSAgNyAgICAgICAwRSszICAtPiAwCitkcXNhbXExNTIyIHNhbWVxdWFudHVtICA3ICAgICAgIDdFLTMgIC0+IDAKK2Rxc2FtcTE1MjMgc2FtZXF1YW50dW0gIDcgICAgICAgNyAgICAgLT4gMQorZHFzYW1xMTUyNCBzYW1lcXVhbnR1bSAgNyAgICAgICA3RSszICAtPiAwCitkcXNhbXExNTI1IHNhbWVxdWFudHVtICA3ICAgICAgIHNOYU4gIC0+IDAKKworZHFzYW1xMTYxMCBzYW1lcXVhbnR1bSAgN0UrMyAgICAtSW5mICAgLT4gMAorZHFzYW1xMTYxMSBzYW1lcXVhbnR1bSAgN0UrMyAgICAgSW5mICAgLT4gMAorZHFzYW1xMTYxMiBzYW1lcXVhbnR1bSAgN0UrMyAgICAgTmFOICAgLT4gMAorZHFzYW1xMTYxMyBzYW1lcXVhbnR1bSAgN0UrMyAgICAtN0UrMyAgLT4gMQorZHFzYW1xMTYxNCBzYW1lcXVhbnR1bSAgN0UrMyAgICAtNyAgICAgLT4gMAorZHFzYW1xMTYxNSBzYW1lcXVhbnR1bSAgN0UrMyAgICAtN0UtMyAgLT4gMAorZHFzYW1xMTYxNiBzYW1lcXVhbnR1bSAgN0UrMyAgICAtMEUtMyAgLT4gMAorZHFzYW1xMTYxNyBzYW1lcXVhbnR1bSAgN0UrMyAgICAtMCAgICAgLT4gMAorZHFzYW1xMTYxOCBzYW1lcXVhbnR1bSAgN0UrMyAgICAtMEUrMyAgLT4gMQorZHFzYW1xMTYxOSBzYW1lcXVhbnR1bSAgN0UrMyAgICAgMEUtMyAgLT4gMAorZHFzYW1xMTYyMCBzYW1lcXVhbnR1bSAgN0UrMyAgICAgMCAgICAgLT4gMAorZHFzYW1xMTYyMSBzYW1lcXVhbnR1bSAgN0UrMyAgICAgMEUrMyAgLT4gMQorZHFzYW1xMTYyMiBzYW1lcXVhbnR1bSAgN0UrMyAgICAgN0UtMyAgLT4gMAorZHFzYW1xMTYyMyBzYW1lcXVhbnR1bSAgN0UrMyAgICAgNyAgICAgLT4gMAorZHFzYW1xMTYyNCBzYW1lcXVhbnR1bSAgN0UrMyAgICAgN0UrMyAgLT4gMQorZHFzYW1xMTYyNSBzYW1lcXVhbnR1bSAgN0UrMyAgICAgc05hTiAgLT4gMAorCitkcXNhbXExNzEwIHNhbWVxdWFudHVtICBzTmFOICAgIC1JbmYgICAtPiAwCitkcXNhbXExNzExIHNhbWVxdWFudHVtICBzTmFOICAgICBJbmYgICAtPiAwCitkcXNhbXExNzEyIHNhbWVxdWFudHVtICBzTmFOICAgICBOYU4gICAtPiAxCitkcXNhbXExNzEzIHNhbWVxdWFudHVtICBzTmFOICAgIC03RSszICAtPiAwCitkcXNhbXExNzE0IHNhbWVxdWFudHVtICBzTmFOICAgIC03ICAgICAtPiAwCitkcXNhbXExNzE1IHNhbWVxdWFudHVtICBzTmFOICAgIC03RS0zICAtPiAwCitkcXNhbXExNzE2IHNhbWVxdWFudHVtICBzTmFOICAgIC0wRS0zICAtPiAwCitkcXNhbXExNzE3IHNhbWVxdWFudHVtICBzTmFOICAgIC0wICAgICAtPiAwCitkcXNhbXExNzE4IHNhbWVxdWFudHVtICBzTmFOICAgIC0wRSszICAtPiAwCitkcXNhbXExNzE5IHNhbWVxdWFudHVtICBzTmFOICAgICAwRS0zICAtPiAwCitkcXNhbXExNzIwIHNhbWVxdWFudHVtICBzTmFOICAgICAwICAgICAtPiAwCitkcXNhbXExNzIxIHNhbWVxdWFudHVtICBzTmFOICAgICAwRSszICAtPiAwCitkcXNhbXExNzIyIHNhbWVxdWFudHVtICBzTmFOICAgICA3RS0zICAtPiAwCitkcXNhbXExNzIzIHNhbWVxdWFudHVtICBzTmFOICAgICA3ICAgICAtPiAwCitkcXNhbXExNzI0IHNhbWVxdWFudHVtICBzTmFOICAgICA3RSszICAtPiAwCitkcXNhbXExNzI1IHNhbWVxdWFudHVtICBzTmFOICAgICBzTmFOICAtPiAxCistLSBub2lzeSBOYU5zCitkcXNhbXExNzMwIHNhbWVxdWFudHVtICBzTmFOMyAgICBzTmFOMyAtPiAxCitkcXNhbXExNzMxIHNhbWVxdWFudHVtICBzTmFOMyAgICBzTmFONCAtPiAxCitkcXNhbXExNzMyIHNhbWVxdWFudHVtICAgTmFOMyAgICAgTmFOMyAtPiAxCitkcXNhbXExNzMzIHNhbWVxdWFudHVtICAgTmFOMyAgICAgTmFONCAtPiAxCitkcXNhbXExNzM0IHNhbWVxdWFudHVtICBzTmFOMyAgICAgMyAgICAtPiAwCitkcXNhbXExNzM1IHNhbWVxdWFudHVtICAgTmFOMyAgICAgMyAgICAtPiAwCitkcXNhbXExNzM2IHNhbWVxdWFudHVtICAgICAgNCAgICBzTmFONCAtPiAwCitkcXNhbXExNzM3IHNhbWVxdWFudHVtICAgICAgMyAgICAgTmFOMyAtPiAwCitkcXNhbXExNzM4IHNhbWVxdWFudHVtICAgIEluZiAgICBzTmFONCAtPiAwCitkcXNhbXExNzM5IHNhbWVxdWFudHVtICAgLUluZiAgICAgTmFOMyAtPiAwCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFTY2FsZUIuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFTY2FsZUIuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDVkYzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVNjYWxlQi5kZWNUZXN0CkBAIC0wLDAgKzEsMjYwIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxU2NhbGViQi5kZWNUZXN0IC0tIHNjYWxlIGEgZGVjUXVhZCBieSBwb3dlcnMgb2YgMTAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gTWF4IHxyaHN8IGlzIDIqKDYxNDQrMzQpID0gMTIzNTYKKworLS0gU2FuaXR5IGNoZWNrcworZHFzY2IwMDEgc2NhbGViICAgICAgIDcuNTAgICAxMCAtPiA3LjUwRSsxMAorZHFzY2IwMDIgc2NhbGViICAgICAgIDcuNTAgICAgMyAtPiA3LjUwRSszCitkcXNjYjAwMyBzY2FsZWIgICAgICAgNy41MCAgICAyIC0+IDc1MAorZHFzY2IwMDQgc2NhbGViICAgICAgIDcuNTAgICAgMSAtPiA3NS4wCitkcXNjYjAwNSBzY2FsZWIgICAgICAgNy41MCAgICAwIC0+IDcuNTAKK2Rxc2NiMDA2IHNjYWxlYiAgICAgICA3LjUwICAgLTEgLT4gMC43NTAKK2Rxc2NiMDA3IHNjYWxlYiAgICAgICA3LjUwICAgLTIgLT4gMC4wNzUwCitkcXNjYjAwOCBzY2FsZWIgICAgICAgNy41MCAgLTEwIC0+IDcuNTBFLTEwCitkcXNjYjAwOSBzY2FsZWIgICAgICAtNy41MCAgICAzIC0+IC03LjUwRSszCitkcXNjYjAxMCBzY2FsZWIgICAgICAtNy41MCAgICAyIC0+IC03NTAKK2Rxc2NiMDExIHNjYWxlYiAgICAgIC03LjUwICAgIDEgLT4gLTc1LjAKK2Rxc2NiMDEyIHNjYWxlYiAgICAgIC03LjUwICAgIDAgLT4gLTcuNTAKK2Rxc2NiMDEzIHNjYWxlYiAgICAgIC03LjUwICAgLTEgLT4gLTAuNzUwCisKKy0tIEluZmluaXRpZXMKK2Rxc2NiMDE0IHNjYWxlYiAgSW5maW5pdHkgICAxIC0+IEluZmluaXR5CitkcXNjYjAxNSBzY2FsZWIgIC1JbmZpbml0eSAgMiAtPiAtSW5maW5pdHkKK2Rxc2NiMDE2IHNjYWxlYiAgSW5maW5pdHkgIC0xIC0+IEluZmluaXR5CitkcXNjYjAxNyBzY2FsZWIgIC1JbmZpbml0eSAtMiAtPiAtSW5maW5pdHkKKworLS0gTmV4dCB0d28gYXJlIHNvbWV3aGF0IHVuZGVmaW5lZCBpbiA3NTRyOyB0cmVhdCBhcyBub24taW50ZWdlcgorZHFzY2IwMTggc2NhbGViICAxMCAgSW5maW5pdHkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjAxOSBzY2FsZWIgIDEwIC1JbmZpbml0eSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gTmFOcyBhcmUgdW5kZWZpbmVkIGluIDc1NHI7IGFzc3VtZSB1c3VhbCBwcm9jZXNzaW5nCistLSBOYU5zLCAwIHBheWxvYWQKK2Rxc2NiMDIxIHNjYWxlYiAgICAgICAgIE5hTiAgMSAtPiBOYU4KK2Rxc2NiMDIyIHNjYWxlYiAgICAgICAgLU5hTiAtMSAtPiAtTmFOCitkcXNjYjAyMyBzY2FsZWIgICAgICAgIHNOYU4gIDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjAyNCBzY2FsZWIgICAgICAgLXNOYU4gIDEgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IwMjUgc2NhbGViICAgIDQgICAgTmFOICAgIC0+IE5hTgorZHFzY2IwMjYgc2NhbGViIC1JbmYgICAtTmFOICAgIC0+IC1OYU4KK2Rxc2NiMDI3IHNjYWxlYiAgICA0ICAgc05hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMDI4IHNjYWxlYiAgSW5mICAtc05hTiAgICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG5vbi1pbnRlZ2VyIFJIUworZHFzY2IwMzAgc2NhbGViICAxLjIzICAgIDEgICAgLT4gIDEyLjMKK2Rxc2NiMDMxIHNjYWxlYiAgMS4yMyAgICAxLjAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMDMyIHNjYWxlYiAgMS4yMyAgICAxLjEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMDMzIHNjYWxlYiAgMS4yMyAgICAxLjAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMDM0IHNjYWxlYiAgMS4yMyAgICAwLjAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMDM1IHNjYWxlYiAgMS4yMyAgICAwLjExIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMDM2IHNjYWxlYiAgMS4yMyAgICAwLjk5OTk5OTk5OSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjAzNyBzY2FsZWIgIDEuMjMgICAtMSAgICAtPiAgMC4xMjMKK2Rxc2NiMDYxNCBzY2FsZWIgIDEuMjMgICAtMS4wMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjAzOSBzY2FsZWIgIDEuMjMgICAtMS4xICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjA0MCBzY2FsZWIgIDEuMjMgICAtMS4wMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjA0MSBzY2FsZWIgIDEuMjMgICAtMC4wMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjA0MiBzY2FsZWIgIDEuMjMgICAtMC4xMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjA0MyBzY2FsZWIgIDEuMjMgICAtMC45OTk5OTk5OTkgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IwNDQgc2NhbGViICAxLjIzICAgIDAuMSAgICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMDQ1IHNjYWxlYiAgMS4yMyAgICAxRSsxICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjA0NiBzY2FsZWIgIDEuMjMgICAgMS4xMjM0RSs2ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IwNDcgc2NhbGViICAxLjIzICAgIDEuMTIzRSs0ICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gb3V0LW9mIHJhbmdlIFJIUworZHFzY2IxMjAgc2NhbGViICAxLjIzICAgIDEyMzU1ICAgICAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rxc2NiMTIxIHNjYWxlYiAgMS4yMyAgICAxMjM1NiAgICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcXNjYjEyMiBzY2FsZWIgIDEuMjMgICAgMTIzNTcgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IxMjMgc2NhbGViICAxLjIzICAgIDEyMzU4ICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMTI0IHNjYWxlYiAgMS4yMyAgIC0xMjM1NSAgICAgICAtPiAgMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcXNjYjEyNSBzY2FsZWIgIDEuMjMgICAtMTIzNTYgICAgICAgLT4gIDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFzY2IxMjYgc2NhbGViICAxLjIzICAgLTEyMzU3ICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMTI3IHNjYWxlYiAgMS4yMyAgIC0xMjM1OCAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2Rxc2NiODYxIHNjYWxlYiAgTmFOMDEgICAtSW5mICAgICAtPiAgTmFOMQorZHFzY2I4NjIgc2NhbGViIC1OYU4wMiAgIC0xMDAwICAgIC0+IC1OYU4yCitkcXNjYjg2MyBzY2FsZWIgIE5hTjAzICAgIDEwMDAgICAgLT4gIE5hTjMKK2Rxc2NiODY0IHNjYWxlYiAgTmFOMDQgICAgSW5mICAgICAtPiAgTmFONAorZHFzY2I4NjUgc2NhbGViICBOYU4wNSAgICBOYU42MSAgIC0+ICBOYU41CitkcXNjYjg2NiBzY2FsZWIgLUluZiAgICAgLU5hTjcxICAgLT4gLU5hTjcxCitkcXNjYjg2NyBzY2FsZWIgLTEwMDAgICAgIE5hTjgxICAgLT4gIE5hTjgxCitkcXNjYjg2OCBzY2FsZWIgIDEwMDAgICAgIE5hTjkxICAgLT4gIE5hTjkxCitkcXNjYjg2OSBzY2FsZWIgIEluZiAgICAgIE5hTjEwMSAgLT4gIE5hTjEwMQorZHFzY2I4NzEgc2NhbGViICBzTmFOMDExICAtSW5mICAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiODcyIHNjYWxlYiAgc05hTjAxMiAgLTEwMDAgICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjg3MyBzY2FsZWIgLXNOYU4wMTMgICAxMDAwICAgLT4gLU5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2I4NzQgc2NhbGViICBzTmFOMDE0ICAgTmFOMTcxIC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiODc1IHNjYWxlYiAgc05hTjAxNSAgc05hTjE4MSAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjg3NiBzY2FsZWIgIE5hTjAxNiAgIHNOYU4xOTEgLT4gIE5hTjE5MSBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2I4Nzcgc2NhbGViIC1JbmYgICAgICBzTmFOMjAxIC0+ICBOYU4yMDEgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiODc4IHNjYWxlYiAtMTAwMCAgICAgc05hTjIxMSAtPiAgTmFOMjExIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjg3OSBzY2FsZWIgIDEwMDAgICAgLXNOYU4yMjEgLT4gLU5hTjIyMSBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2I4ODAgc2NhbGViICBJbmYgICAgICBzTmFOMjMxIC0+ICBOYU4yMzEgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiODgxIHNjYWxlYiAgTmFOMDI1ICAgc05hTjI0MSAtPiAgTmFOMjQxIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGZpbml0ZXMKK2Rxc2NiMDUxIHNjYWxlYiAgICAgICAgICA3ICAgLTIgIC0+IDAuMDcKK2Rxc2NiMDUyIHNjYWxlYiAgICAgICAgIC03ICAgLTIgIC0+IC0wLjA3CitkcXNjYjA1MyBzY2FsZWIgICAgICAgICA3NSAgIC0yICAtPiAwLjc1CitkcXNjYjA1NCBzY2FsZWIgICAgICAgIC03NSAgIC0yICAtPiAtMC43NQorZHFzY2IwNTUgc2NhbGViICAgICAgIDcuNTAgICAtMiAgLT4gMC4wNzUwCitkcXNjYjA1NiBzY2FsZWIgICAgICAtNy41MCAgIC0yICAtPiAtMC4wNzUwCitkcXNjYjA1NyBzY2FsZWIgICAgICAgNy41MDAgIC0yICAtPiAwLjA3NTAwCitkcXNjYjA1OCBzY2FsZWIgICAgICAtNy41MDAgIC0yICAtPiAtMC4wNzUwMAorZHFzY2IwNjEgc2NhbGViICAgICAgICAgIDcgICAtMSAgLT4gMC43CitkcXNjYjA2MiBzY2FsZWIgICAgICAgICAtNyAgIC0xICAtPiAtMC43CitkcXNjYjA2MyBzY2FsZWIgICAgICAgICA3NSAgIC0xICAtPiA3LjUKK2Rxc2NiMDY0IHNjYWxlYiAgICAgICAgLTc1ICAgLTEgIC0+IC03LjUKK2Rxc2NiMDY1IHNjYWxlYiAgICAgICA3LjUwICAgLTEgIC0+IDAuNzUwCitkcXNjYjA2NiBzY2FsZWIgICAgICAtNy41MCAgIC0xICAtPiAtMC43NTAKK2Rxc2NiMDY3IHNjYWxlYiAgICAgICA3LjUwMCAgLTEgIC0+IDAuNzUwMAorZHFzY2IwNjggc2NhbGViICAgICAgLTcuNTAwICAtMSAgLT4gLTAuNzUwMAorZHFzY2IwNzEgc2NhbGViICAgICAgICAgIDcgICAgMCAgLT4gNworZHFzY2IwNzIgc2NhbGViICAgICAgICAgLTcgICAgMCAgLT4gLTcKK2Rxc2NiMDczIHNjYWxlYiAgICAgICAgIDc1ICAgIDAgIC0+IDc1CitkcXNjYjA3NCBzY2FsZWIgICAgICAgIC03NSAgICAwICAtPiAtNzUKK2Rxc2NiMDc1IHNjYWxlYiAgICAgICA3LjUwICAgIDAgIC0+IDcuNTAKK2Rxc2NiMDc2IHNjYWxlYiAgICAgIC03LjUwICAgIDAgIC0+IC03LjUwCitkcXNjYjA3NyBzY2FsZWIgICAgICAgNy41MDAgICAwICAtPiA3LjUwMAorZHFzY2IwNzggc2NhbGViICAgICAgLTcuNTAwICAgMCAgLT4gLTcuNTAwCitkcXNjYjA4MSBzY2FsZWIgICAgICAgICAgNyAgICAxICAtPiA3RSsxCitkcXNjYjA4MiBzY2FsZWIgICAgICAgICAtNyAgICAxICAtPiAtN0UrMQorZHFzY2IwODMgc2NhbGViICAgICAgICAgNzUgICAgMSAgLT4gNy41RSsyCitkcXNjYjA4NCBzY2FsZWIgICAgICAgIC03NSAgICAxICAtPiAtNy41RSsyCitkcXNjYjA4NSBzY2FsZWIgICAgICAgNy41MCAgICAxICAtPiA3NS4wCitkcXNjYjA4NiBzY2FsZWIgICAgICAtNy41MCAgICAxICAtPiAtNzUuMAorZHFzY2IwODcgc2NhbGViICAgICAgIDcuNTAwICAgMSAgLT4gNzUuMDAKK2Rxc2NiMDg4IHNjYWxlYiAgICAgIC03LjUwMCAgIDEgIC0+IC03NS4wMAorZHFzY2IwOTEgc2NhbGViICAgICAgICAgIDcgICAgMiAgLT4gN0UrMgorZHFzY2IwOTIgc2NhbGViICAgICAgICAgLTcgICAgMiAgLT4gLTdFKzIKK2Rxc2NiMDkzIHNjYWxlYiAgICAgICAgIDc1ICAgIDIgIC0+IDcuNUUrMworZHFzY2IwOTQgc2NhbGViICAgICAgICAtNzUgICAgMiAgLT4gLTcuNUUrMworZHFzY2IwOTUgc2NhbGViICAgICAgIDcuNTAgICAgMiAgLT4gNzUwCitkcXNjYjA5NiBzY2FsZWIgICAgICAtNy41MCAgICAyICAtPiAtNzUwCitkcXNjYjA5NyBzY2FsZWIgICAgICAgNy41MDAgICAyICAtPiA3NTAuMAorZHFzY2IwOTggc2NhbGViICAgICAgLTcuNTAwICAgMiAgLT4gLTc1MC4wCisKKy0tIHplcm9zCitkcXNjYjExMSBzY2FsZWIgICAgICAgICAgMCAgMSAtPiAwRSsxCitkcXNjYjExMiBzY2FsZWIgICAgICAgICAtMCAgMiAtPiAtMEUrMgorZHFzY2IxMTMgc2NhbGViICAgICAgIDBFKzQgIDMgLT4gMEUrNworZHFzY2IxMTQgc2NhbGViICAgICAgLTBFKzQgIDQgLT4gLTBFKzgKK2Rxc2NiMTE1IHNjYWxlYiAgICAgMC4wMDAwICA1IC0+IDBFKzEKK2Rxc2NiMTE2IHNjYWxlYiAgICAtMC4wMDAwICA2IC0+IC0wRSsyCitkcXNjYjExNyBzY2FsZWIgICAgICAwRS0xNDEgNyAtPiAwRS0xMzQKK2Rxc2NiMTE4IHNjYWxlYiAgICAgLTBFLTE0MSA4IC0+IC0wRS0xMzMKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2Rxc2NiMTMyIHNjYWxlYiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICs2MTQ0IC0+IEluZmluaXR5ICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFzY2IxMzMgc2NhbGViICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgKzEwIC0+IEluZmluaXR5ICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rxc2NiMTM0IHNjYWxlYiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICsxICAtPiBJbmZpbml0eSAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcXNjYjEzNSBzY2FsZWIgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgMCAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2Rxc2NiMTM2IHNjYWxlYiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0xICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0MworZHFzY2IxMzcgc2NhbGViICAxRS02MTQzICAgICAgICAgICArMSAgLT4gMUUtNjE0MgorZHFzY2IxNjE0IHNjYWxlYiAgMUUtNjE0MyAgICAgICAgICAgLTAgIC0+IDFFLTYxNDMKK2Rxc2NiMTM5IHNjYWxlYiAgMUUtNjE0MyAgICAgICAgICAgLTEgIC0+IDFFLTYxNDQgICAgICAgICAgU3Vibm9ybWFsCitkcXNjYjE0MCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICArMSAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDIKK2Rxc2NiMTQxIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFzY2IxNDIgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTEgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDQgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMTQzIHNjYWxlYiAgMUUtNjE3NiAgICAgICAgICArMSAgLT4gMUUtNjE3NSAgICAgICAgIFN1Ym5vcm1hbAorZHFzY2IxNDQgc2NhbGViICAxRS02MTc2ICAgICAgICAgIC0wICAtPiAxRS02MTc2ICAgICAgICAgU3Vibm9ybWFsCitkcXNjYjE0NSBzY2FsZWIgIDFFLTYxNzYgICAgICAgICAgLTEgIC0+IDBFLTYxNzYgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK2Rxc2NiMTUwIHNjYWxlYiAgLTFFLTYxNzYgICAgICAgICArMSAgLT4gLTFFLTYxNzUgICAgICAgIFN1Ym5vcm1hbAorZHFzY2IxNTEgc2NhbGViICAtMUUtNjE3NiAgICAgICAgIC0wICAtPiAtMUUtNjE3NiAgICAgICAgU3Vibm9ybWFsCitkcXNjYjE1MiBzY2FsZWIgIC0xRS02MTc2ICAgICAgICAgLTEgIC0+IC0wRS02MTc2ICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcXNjYjE1MyBzY2FsZWIgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyArMSAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQyCitkcXNjYjE1NCBzY2FsZWIgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyArMCAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkcXNjYjE1NSBzY2FsZWIgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAtMSAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDQgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMTU2IHNjYWxlYiAgLTFFLTYxNDMgICAgICAgICAgKzEgIC0+IC0xRS02MTQyCitkcXNjYjE1NyBzY2FsZWIgIC0xRS02MTQzICAgICAgICAgIC0wICAtPiAtMUUtNjE0MworZHFzY2IxNTggc2NhbGViICAtMUUtNjE0MyAgICAgICAgICAtMSAgLT4gLTFFLTYxNDQgICAgICAgICAgU3Vibm9ybWFsCitkcXNjYjE1OSBzY2FsZWIgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCArMSAgLT4gLUluZmluaXR5ICAgICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rxc2NiMTYwIHNjYWxlYiAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICswICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2Rxc2NiMTYxIHNjYWxlYiAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0xICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDMKK2Rxc2NiMTYyIHNjYWxlYiAgLTlFKzYxNDQgICAgICAgICAgKzEgIC0+IC1JbmZpbml0eSAgICAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcXNjYjE2MyBzY2FsZWIgIC0xRSs2MTQ0ICAgICAgICAgICsxICAtPiAtSW5maW5pdHkgICAgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLSBzb21lIE9yaWdhbWkKKy0tICh0aGVzZSBjaGVjayB0aGF0IG92ZXJmbG93IGlzIGJlaW5nIGRvbmUgY29ycmVjdGx5KQorZHFzY2IxNzEgc2NhbGViICAgMTAwMEUrNjEwOSAgKzEgLT4gMS4wMDBFKzYxMTMKK2Rxc2NiMTcyIHNjYWxlYiAgIDEwMDBFKzYxMTAgICsxIC0+IDEuMDAwRSs2MTE0CitkcXNjYjE3MyBzY2FsZWIgICAxMDAwRSs2MTExICArMSAtPiAxLjAwMDBFKzYxMTUgICAgICAgICAgICAgICAgICAgIENsYW1wZWQKK2Rxc2NiMTc0IHNjYWxlYiAgIDEwMDBFKzYxMTIgICsxIC0+IDEuMDAwMDBFKzYxMTYgICAgICAgICAgICAgICAgICAgQ2xhbXBlZAorZHFzY2IxNzUgc2NhbGViICAgMTAwMEUrNjExMyAgKzEgLT4gMS4wMDAwMDBFKzYxMTcgICAgICAgICAgICAgICAgICBDbGFtcGVkCitkcXNjYjE3NiBzY2FsZWIgICAxMDAwRSs2MTE0ICArMSAtPiAxLjAwMDAwMDBFKzYxMTggICAgICAgICAgICAgICAgIENsYW1wZWQKK2Rxc2NiMTc3IHNjYWxlYiAgIDEwMDBFKzYxMzEgICsxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTM1ICAgICAgICAgICAgICAgIENsYW1wZWQKK2Rxc2NiMTc4IHNjYWxlYiAgIDEwMDBFKzYxMzIgICsxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjEzNiAgICAgICAgICAgICAgIENsYW1wZWQKK2Rxc2NiMTc5IHNjYWxlYiAgIDEwMDBFKzYxMzMgICsxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzcgICAgICAgICAgICAgIENsYW1wZWQKK2Rxc2NiMTgwIHNjYWxlYiAgIDEwMDBFKzYxMzQgICsxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTM4ICAgICAgICAgICAgIENsYW1wZWQKK2Rxc2NiMTgxIHNjYWxlYiAgIDEwMDBFKzYxMzUgICsxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjEzOSAgICAgICAgICAgIENsYW1wZWQKK2Rxc2NiMTgyIHNjYWxlYiAgIDEwMDBFKzYxMzYgICsxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDAgICAgICAgICAgIENsYW1wZWQKK2Rxc2NiMTgzIHNjYWxlYiAgIDEwMDBFKzYxMzcgICsxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQxICAgICAgICAgIENsYW1wZWQKK2Rxc2NiMTg0IHNjYWxlYiAgIDEwMDBFKzYxMzggICsxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MiAgICAgICAgIENsYW1wZWQKK2Rxc2NiMTg1IHNjYWxlYiAgIDEwMDBFKzYxMzkgICsxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDMgICAgICAgIENsYW1wZWQKK2Rxc2NiMTg2IHNjYWxlYiAgIDEwMDBFKzYxNDAgICsxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0ICAgICAgIENsYW1wZWQKK2Rxc2NiMTg3IHNjYWxlYiAgIDEwMDBFKzYxNDEgICsxIC0+IEluZmluaXR5ICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLSBhbmQgYSBmZXcgbW9yZSBzdWJub3JtYWwgdHJ1bmNhdGlvbnMKKy0tICh0aGVzZSBjaGVjayB0aGF0IHVuZGVyZmxvdyBpcyBiZWluZyBkb25lIGNvcnJlY3RseSkKK2Rxc2NiMjIxIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFzY2IyMjIgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTEgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDQgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjIzIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0yICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDUgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjI0IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0zICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NiBTdWJub3JtYWwgUm91bmRlZAorZHFzY2IyMjUgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTQgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDcgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjI2IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC01ICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDggU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjI3IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC02ICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0OSBTdWJub3JtYWwgUm91bmRlZAorZHFzY2IyMjggc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTcgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNTAgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjI5IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC04ICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNTEgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjMwIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC05ICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE1MiBTdWJub3JtYWwgUm91bmRlZAorZHFzY2IyMzEgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTEwIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNTMgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjMyIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0xMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNTQgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjMzIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0xMiAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE1NSBTdWJub3JtYWwgUm91bmRlZAorZHFzY2IyMzQgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTEzIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNTYgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjM1IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0xNCAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNTcgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjM2IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0xNSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMEUtNjE1OCBTdWJub3JtYWwgUm91bmRlZAorZHFzY2IyMzcgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTE2IC0+IDEuMDAwMDAwMDAwMDAwMDAwMDBFLTYxNTkgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjM4IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0xNyAtPiAxLjAwMDAwMDAwMDAwMDAwMDBFLTYxNjAgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjM5IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0xOCAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtNjE2MSBTdWJub3JtYWwgUm91bmRlZAorZHFzY2IyMDIgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTE5IC0+IDEuMDAwMDAwMDAwMDAwMDBFLTYxNjIgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjAzIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0yMCAtPiAxLjAwMDAwMDAwMDAwMDBFLTYxNjMgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjA0IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0yMSAtPiAxLjAwMDAwMDAwMDAwMEUtNjE2NCBTdWJub3JtYWwgUm91bmRlZAorZHFzY2IyMDUgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTIyIC0+IDEuMDAwMDAwMDAwMDBFLTYxNjUgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjA2IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0yMyAtPiAxLjAwMDAwMDAwMDBFLTYxNjYgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjA3IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0yNCAtPiAxLjAwMDAwMDAwMEUtNjE2NyBTdWJub3JtYWwgUm91bmRlZAorZHFzY2IyMDggc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTI1IC0+IDEuMDAwMDAwMDBFLTYxNjggU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjA5IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0yNiAtPiAxLjAwMDAwMDBFLTYxNjkgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjEwIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0yNyAtPiAxLjAwMDAwMEUtNjE3MCBTdWJub3JtYWwgUm91bmRlZAorZHFzY2IyMTEgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTI4IC0+IDEuMDAwMDBFLTYxNzEgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjEyIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0yOSAtPiAxLjAwMDBFLTYxNzIgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjEzIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0zMCAtPiAxLjAwMEUtNjE3MyBTdWJub3JtYWwgUm91bmRlZAorZHFzY2IyMTQgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTMxIC0+IDEuMDBFLTYxNzQgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjE1IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0zMiAtPiAxLjBFLTYxNzUgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjE2IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0zMyAtPiAxRS02MTc2IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIxNyBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMzQgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcXNjYjIxOCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMzUgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxU2hpZnQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFTaGlmdC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNjkyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxU2hpZnQuZGVjVGVzdApAQCAtMCwwICsxLDI5OCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcVNoaWZ0LmRlY1Rlc3QgLS0gc2hpZnQgZGVjUXVhZCBjb2VmZmljaWVudCBsZWZ0IG9yIHJpZ2h0ICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjaworZHFzaGkwMDEgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgMCAgLT4gIDAKK2Rxc2hpMDAyIHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgIDIgIC0+ICAwCitkcXNoaTAwMyBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAyICAtPiAgMTAwCitkcXNoaTAwNCBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgIDMzICAtPiAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwMDUgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAzNCAgLT4gIDAKK2Rxc2hpMDA2IHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgLTEgIC0+ICAwCitkcXNoaTAwNyBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgIC0yICAtPiAgMAorZHFzaGkwMDggc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMSAgLT4gIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMworZHFzaGkwMDkgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMzMgLT4gIDEKK2Rxc2hpMDEwIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTM0IC0+ICAwCitkcXNoaTAxMSBzaGlmdCAgOTkzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIC0zMyAtPiAgOQorZHFzaGkwMTIgc2hpZnQgIDk5MzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMzQgLT4gIDAKKworLS0gcmhzIG11c3QgYmUgYW4gaW50ZWdlcgorZHFzaGkwMTUgc2hpZnQgICAgICAgIDEgICAgMS41ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGkwMTYgc2hpZnQgICAgICAgIDEgICAgMS4wICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGkwMTcgc2hpZnQgICAgICAgIDEgICAgMC4xICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGkwMTggc2hpZnQgICAgICAgIDEgICAgMC4wICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGkwMTkgc2hpZnQgICAgICAgIDEgICAgMUUrMSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGkwMjAgc2hpZnQgICAgICAgIDEgICAgMUUrOTkgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGkwMjEgc2hpZnQgICAgICAgIDEgICAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGkwMjIgc2hpZnQgICAgICAgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYW5kIHxyaHN8IDw9IHByZWNpc2lvbgorZHFzaGkwMjUgc2hpZnQgICAgICAgIDEgICAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGkwMjYgc2hpZnQgICAgICAgIDEgICAgLTM1ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGkwMjcgc2hpZnQgICAgICAgIDEgICAgIDM1ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGkwMjggc2hpZnQgICAgICAgIDEgICAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBmdWxsIHNoaWZ0aW5nIHBhdHRlcm4KK2Rxc2hpMDMwIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTM0ICAtPiAwCitkcXNoaTAzMSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0zMyAgLT4gMQorZHFzaGkwMzIgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMzIgIC0+IDEyCitkcXNoaTAzMyBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0zMSAgLT4gMTIzCitkcXNoaTAzNCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0zMCAgLT4gMTIzNAorZHFzaGkwMzUgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjkgIC0+IDEyMzQ1CitkcXNoaTAzNiBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yOCAgLT4gMTIzNDU2CitkcXNoaTAzNyBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yNyAgLT4gMTIzNDU2NworZHFzaGkwMzggc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjYgIC0+IDEyMzQ1Njc4CitkcXNoaTAzOSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yNSAgLT4gMTIzNDU2Nzg5CitkcXNoaTA0MCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yNCAgLT4gMTIzNDU2Nzg5MAorZHFzaGkwNDEgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjMgIC0+IDEyMzQ1Njc4OTAxCitkcXNoaTA0MiBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yMiAgLT4gMTIzNDU2Nzg5MDEyCitkcXNoaTA0MyBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yMSAgLT4gMTIzNDU2Nzg5MDEyMworZHFzaGkwNDQgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjAgIC0+IDEyMzQ1Njc4OTAxMjM0CitkcXNoaTA0NSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xOSAgLT4gMTIzNDU2Nzg5MDEyMzQ1CitkcXNoaTA0NyBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xOCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZHFzaGkwNDggc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTcgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3CitkcXNoaTA0OSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xNiAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4CitkcXNoaTA1MCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xNSAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OQorZHFzaGkwNTEgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTQgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwCitkcXNoaTA1MiBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xMyAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxCitkcXNoaTA1MyBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xMiAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMgorZHFzaGkwNTQgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTEgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzCitkcXNoaTA1NSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xMCAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CitkcXNoaTA1NiBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC05ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NQorZHFzaGkwNTcgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtOCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2CitkcXNoaTA1OCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC03ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3CitkcXNoaTA1OSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC02ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3OAorZHFzaGkwNjAgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtNSAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CitkcXNoaTA2MSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC00ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwCitkcXNoaTA2MiBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0zICAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMQorZHFzaGkwNjMgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMiAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyCitkcXNoaTA2NCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xICAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzCitkcXNoaTA2NSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0wICAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorCitkcXNoaTA2NiBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICswICAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorZHFzaGkwNjcgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMSAgIC0+IDIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAKK2Rxc2hpMDY4IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzIgICAtPiAzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAwCitkcXNoaTA2OSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICszICAgLT4gNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAwMAorZHFzaGkwNzAgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArNCAgIC0+IDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAwMDAKK2Rxc2hpMDcxIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzUgICAtPiA2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAwMDAwCitkcXNoaTA3MiBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICs2ICAgLT4gNzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAwMDAwMAorZHFzaGkwNzMgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArNyAgIC0+IDg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAwMDAwMDAKK2Rxc2hpMDc0IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzggICAtPiA5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwCitkcXNoaTA3NSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICs5ICAgLT4gIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwMAorZHFzaGkwNzYgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwMDAKK2Rxc2hpMDc3IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzExICAtPiAyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwMDAwCitkcXNoaTA3OCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsxMiAgLT4gMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwMDAwMAorZHFzaGkwNzkgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTMgIC0+IDQ1Njc4OTAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDgwIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzE0ICAtPiA1Njc4OTAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwMDAwMDAwCitkcXNoaTA4MSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsxNSAgLT4gNjc4OTAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwODIgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTYgIC0+IDc4OTAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDgzIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzE3ICAtPiA4OTAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwMDAwMDAwMDAwCitkcXNoaTA4NCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsxOCAgLT4gOTAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwODUgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTkgIC0+ICAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDg2IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzIwICAtPiAxMjM0NTY3ODkwMTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXNoaTA4NyBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyMSAgLT4gMjM0NTY3ODkwMTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwODggc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjIgIC0+IDM0NTY3ODkwMTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDg5IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzIzICAtPiA0NTY3ODkwMTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXNoaTA5MCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyNCAgLT4gNTY3ODkwMTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwOTEgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjUgIC0+IDY3ODkwMTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDkyIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzI2ICAtPiA3ODkwMTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXNoaTA5MyBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyNyAgLT4gODkwMTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwOTQgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjggIC0+IDkwMTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDk1IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzI5ICAtPiAgMTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXNoaTA5NiBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICszMCAgLT4gMTIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwOTcgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMzEgIC0+IDIzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDk4IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzMyICAtPiAzNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXNoaTA5OSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICszMyAgLT4gNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkxMDAgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMzQgIC0+IDAKKworLS0gemVyb3MKK2Rxc2hpMjcwIHNoaWZ0ICAwRS0xMCAgICAgICAgICAgICAgKzI5ICAgLT4gICAwRS0xMAorZHFzaGkyNzEgc2hpZnQgIDBFLTEwICAgICAgICAgICAgICAtMjkgICAtPiAgIDBFLTEwCitkcXNoaTI3MiBzaGlmdCAgMC4wMDAgICAgICAgICAgICAgICsyOSAgIC0+ICAgMC4wMDAKK2Rxc2hpMjczIHNoaWZ0ICAwLjAwMCAgICAgICAgICAgICAgLTI5ICAgLT4gICAwLjAwMAorZHFzaGkyNzQgc2hpZnQgIDBFKzEwICAgICAgICAgICAgICArMjkgICAtPiAgIDBFKzEwCitkcXNoaTI3NSBzaGlmdCAgMEUrMTAgICAgICAgICAgICAgIC0yOSAgIC0+ICAgMEUrMTAKK2Rxc2hpMjc2IHNoaWZ0IC0wRS0xMCAgICAgICAgICAgICAgKzI5ICAgLT4gIC0wRS0xMAorZHFzaGkyNzcgc2hpZnQgLTBFLTEwICAgICAgICAgICAgICAtMjkgICAtPiAgLTBFLTEwCitkcXNoaTI3OCBzaGlmdCAtMC4wMDAgICAgICAgICAgICAgICsyOSAgIC0+ICAtMC4wMDAKK2Rxc2hpMjc5IHNoaWZ0IC0wLjAwMCAgICAgICAgICAgICAgLTI5ICAgLT4gIC0wLjAwMAorZHFzaGkyODAgc2hpZnQgLTBFKzEwICAgICAgICAgICAgICArMjkgICAtPiAgLTBFKzEwCitkcXNoaTI4MSBzaGlmdCAtMEUrMTAgICAgICAgICAgICAgIC0yOSAgIC0+ICAtMEUrMTAKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2Rxc2hpMTQxIHNoaWZ0ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAgLTEgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDMKK2Rxc2hpMTQyIHNoaWZ0ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAgLTMzIC0+IDlFKzYxMTEKK2Rxc2hpMTQzIHNoaWZ0ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAgIDEgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwRSs2MTQ0CitkcXNoaTE0NCBzaGlmdCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgICAzMyAtPiA5LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NAorZHFzaGkxNDUgc2hpZnQgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgLT4gMEUtNjE0MworZHFzaGkxNDYgc2hpZnQgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzMgLT4gMEUtNjE0MworZHFzaGkxNDcgc2hpZnQgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLT4gMS4wRS02MTQyCitkcXNoaTE0OCBzaGlmdCAgMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMyAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjExMAorZHFzaGkxNTEgc2hpZnQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMSAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NAorZHFzaGkxNTIgc2hpZnQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMzMgLT4gMUUtNjE3NgorZHFzaGkxNTMgc2hpZnQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgMSAgLT4gMEUtNjE3NgorZHFzaGkxNTQgc2hpZnQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgMzMgLT4gMEUtNjE3NgorZHFzaGkxNTUgc2hpZnQgIDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMSAgLT4gOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NAorZHFzaGkxNTYgc2hpZnQgIDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMzMgLT4gOUUtNjE3NgorZHFzaGkxNTcgc2hpZnQgIDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgMSAgLT4gMEUtNjE3NgorZHFzaGkxNTggc2hpZnQgIDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgMzMgLT4gMEUtNjE3NgorZHFzaGkxNjAgc2hpZnQgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgLT4gMEUtNjE3NgorZHFzaGkxNjEgc2hpZnQgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzMgLT4gMEUtNjE3NgorZHFzaGkxNjIgc2hpZnQgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLT4gMS4wRS02MTc1CitkcXNoaTE2MyBzaGlmdCAgMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMyAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworLS0gIG5lZ2F0aXZlcworZHFzaGkxNzEgc2hpZnQgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgICAtMSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDMKK2Rxc2hpMTcyIHNoaWZ0IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAgLTMzIC0+IC05RSs2MTExCitkcXNoaTE3MyBzaGlmdCAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgICAxICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTBFKzYxNDQKK2Rxc2hpMTc0IHNoaWZ0IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAgIDMzIC0+IC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NAorZHFzaGkxNzUgc2hpZnQgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgLT4gLTBFLTYxNDMKK2Rxc2hpMTc2IHNoaWZ0IC0xRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMzIC0+IC0wRS02MTQzCitkcXNoaTE3NyBzaGlmdCAtMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAtPiAtMS4wRS02MTQyCitkcXNoaTE3OCBzaGlmdCAtMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMyAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxMTAKK2Rxc2hpMTgxIHNoaWZ0IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgLTEgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ0CitkcXNoaTE4MiBzaGlmdCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgIC0zMyAtPiAtMUUtNjE3NgorZHFzaGkxODMgc2hpZnQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgMSAgLT4gLTBFLTYxNzYKK2Rxc2hpMTg0IHNoaWZ0IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIDMzIC0+IC0wRS02MTc2CitkcXNoaTE4NSBzaGlmdCAtOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgIC0xICAtPiAtOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NAorZHFzaGkxODYgc2hpZnQgLTkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMzMgLT4gLTlFLTYxNzYKK2Rxc2hpMTg3IHNoaWZ0IC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIDEgIC0+IC0wRS02MTc2CitkcXNoaTE4OCBzaGlmdCAtOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgICAzMyAtPiAtMEUtNjE3NgorZHFzaGkxOTAgc2hpZnQgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgLT4gLTBFLTYxNzYKK2Rxc2hpMTkxIHNoaWZ0IC0xRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMzIC0+IC0wRS02MTc2CitkcXNoaTE5MiBzaGlmdCAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAtPiAtMS4wRS02MTc1CitkcXNoaTE5MyBzaGlmdCAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMyAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKKworLS0gbW9yZSBuZWdhdGl2ZXMgKG9mIHNhbml0aWVzKQorZHFzaGkyMDEgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAgICAgMCAgLT4gLTAKK2Rxc2hpMjAyIHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wICAgIDIgIC0+IC0wCitkcXNoaTIwMyBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgICAyICAtPiAtMTAwCitkcXNoaTIwNCBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgIDMzICAtPiAtMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkyMDUgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgICAzNCAgLT4gLTAKK2Rxc2hpMjA2IHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICAgLTEgIC0+IC0wCitkcXNoaTIwNyBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMCAgIC0yICAtPiAtMAorZHFzaGkyMDggc2hpZnQgLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMSAgLT4gLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMworZHFzaGkyMDkgc2hpZnQgLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMzMgLT4gLTEKK2Rxc2hpMjEwIHNoaWZ0IC0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTM0IC0+IC0wCitkcXNoaTIxMSBzaGlmdCAtOTkzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIC0zMyAtPiAtOQorZHFzaGkyMTIgc2hpZnQgLTk5MzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMzQgLT4gLTAKKworCistLSBTcGVjaWFsczsgTmFOcyBhcmUgaGFuZGxlZCBhcyB1c3VhbAorZHFzaGk3ODEgc2hpZnQgLUluZiAgLTggICAgIC0+IC1JbmZpbml0eQorZHFzaGk3ODIgc2hpZnQgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZHFzaGk3ODMgc2hpZnQgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorZHFzaGk3ODQgc2hpZnQgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZHFzaGk3ODUgc2hpZnQgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZHFzaGk3ODYgc2hpZnQgLUluZiAgIDggICAgIC0+IC1JbmZpbml0eQorZHFzaGk3ODcgc2hpZnQgLTEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk3ODggc2hpZnQgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk3ODkgc2hpZnQgLTEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk3OTAgc2hpZnQgLTAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk3OTEgc2hpZnQgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk3OTIgc2hpZnQgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk3OTMgc2hpZnQgIDEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk3OTQgc2hpZnQgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcXNoaTgwMCBzaGlmdCAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTgwMSBzaGlmdCAgSW5mICAtOCAgICAgLT4gSW5maW5pdHkKK2Rxc2hpODAyIHNoaWZ0ICBJbmYgIC0xICAgICAtPiBJbmZpbml0eQorZHFzaGk4MDMgc2hpZnQgIEluZiAgLTAgICAgIC0+IEluZmluaXR5CitkcXNoaTgwNCBzaGlmdCAgSW5mICAgMCAgICAgLT4gSW5maW5pdHkKK2Rxc2hpODA1IHNoaWZ0ICBJbmYgICAxICAgICAtPiBJbmZpbml0eQorZHFzaGk4MDYgc2hpZnQgIEluZiAgIDggICAgIC0+IEluZmluaXR5CitkcXNoaTgwNyBzaGlmdCAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTgwOCBzaGlmdCAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTgwOSBzaGlmdCAtSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTgxMCBzaGlmdCAtMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTgxMSBzaGlmdCAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTgxMiBzaGlmdCAgMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTgxMyBzaGlmdCAgMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTgxNCBzaGlmdCAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTgxNSBzaGlmdCAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rxc2hpODIxIHNoaWZ0ICBOYU4gLUluZiAgICAtPiAgTmFOCitkcXNoaTgyMiBzaGlmdCAgTmFOIC0xMDAwICAgLT4gIE5hTgorZHFzaGk4MjMgc2hpZnQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2Rxc2hpODI0IHNoaWZ0ICBOYU4gLTAgICAgICAtPiAgTmFOCitkcXNoaTgyNSBzaGlmdCAgTmFOICAwICAgICAgLT4gIE5hTgorZHFzaGk4MjYgc2hpZnQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2Rxc2hpODI3IHNoaWZ0ICBOYU4gIDEwMDAgICAtPiAgTmFOCitkcXNoaTgyOCBzaGlmdCAgTmFOICBJbmYgICAgLT4gIE5hTgorZHFzaGk4Mjkgc2hpZnQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2Rxc2hpODMwIHNoaWZ0IC1JbmYgIE5hTiAgICAtPiAgTmFOCitkcXNoaTgzMSBzaGlmdCAtMTAwMCBOYU4gICAgLT4gIE5hTgorZHFzaGk4MzIgc2hpZnQgLTEgICAgTmFOICAgIC0+ICBOYU4KK2Rxc2hpODMzIHNoaWZ0IC0wICAgIE5hTiAgICAtPiAgTmFOCitkcXNoaTgzNCBzaGlmdCAgMCAgICBOYU4gICAgLT4gIE5hTgorZHFzaGk4MzUgc2hpZnQgIDEgICAgTmFOICAgIC0+ICBOYU4KK2Rxc2hpODM2IHNoaWZ0ICAxMDAwIE5hTiAgICAtPiAgTmFOCitkcXNoaTgzNyBzaGlmdCAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkcXNoaTg0MSBzaGlmdCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODQyIHNoaWZ0ICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NDMgc2hpZnQgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg0NCBzaGlmdCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODQ1IHNoaWZ0ICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NDYgc2hpZnQgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg0NyBzaGlmdCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODQ4IHNoaWZ0ICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NDkgc2hpZnQgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg1MCBzaGlmdCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODUxIHNoaWZ0IC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NTIgc2hpZnQgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg1MyBzaGlmdCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODU0IHNoaWZ0IC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NTUgc2hpZnQgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg1NiBzaGlmdCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODU3IHNoaWZ0ICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NTggc2hpZnQgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg1OSBzaGlmdCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHFzaGk4NjEgc2hpZnQgIE5hTjEgICAtSW5mICAgIC0+ICBOYU4xCitkcXNoaTg2MiBzaGlmdCArTmFOMiAgIC0xMDAwICAgLT4gIE5hTjIKK2Rxc2hpODYzIHNoaWZ0ICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworZHFzaGk4NjQgc2hpZnQgIE5hTjQgICAgSW5mICAgIC0+ICBOYU40CitkcXNoaTg2NSBzaGlmdCAgTmFONSAgICtOYU42ICAgLT4gIE5hTjUKK2Rxc2hpODY2IHNoaWZ0IC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworZHFzaGk4Njcgc2hpZnQgLTEwMDAgICAgTmFOOCAgIC0+ICBOYU44CitkcXNoaTg2OCBzaGlmdCAgMTAwMCAgICBOYU45ICAgLT4gIE5hTjkKK2Rxc2hpODY5IHNoaWZ0ICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK2Rxc2hpODcxIHNoaWZ0ICBzTmFOMTEgIC1JbmYgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg3MiBzaGlmdCAgc05hTjEyICAtMTAwMCAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NzMgc2hpZnQgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODc0IHNoaWZ0ICBzTmFOMTQgICBOYU4xNyAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg3NSBzaGlmdCAgc05hTjE1ICBzTmFOMTggLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NzYgc2hpZnQgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODc3IHNoaWZ0IC1JbmYgICAgK3NOYU4yMCAtPiAgTmFOMjAgIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg3OCBzaGlmdCAtMTAwMCAgICBzTmFOMjEgLT4gIE5hTjIxICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4Nzkgc2hpZnQgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODgwIHNoaWZ0ICBJbmYgICAgIHNOYU4yMyAtPiAgTmFOMjMgIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg4MSBzaGlmdCArTmFOMjUgICtzTmFOMjQgLT4gIE5hTjI0ICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4ODIgc2hpZnQgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorZHFzaGk4ODMgc2hpZnQgLXNOYU4yNyAgc05hTjI5IC0+IC1OYU4yNyAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODg0IHNoaWZ0ICAxMDAwICAgIC1OYU4zMCAtPiAtTmFOMzAKK2Rxc2hpODg1IHNoaWZ0ICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxU3VidHJhY3QuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFTdWJ0cmFjdC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTcyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxU3VidHJhY3QuZGVjVGVzdApAQCAtMCwwICsxLDYzNSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcVN1YnRyYWN0LmRlY1Rlc3QgLS0gZGVjUXVhZCBzdWJ0cmFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgc2V0IG9mIHRlc3RzIGFyZSBmb3IgZGVjUXVhZHMgb25seTsgYWxsIGFyZ3VtZW50cyBhcmUKKy0tIHJlcHJlc2VudGFibGUgaW4gYSBkZWNRdWFkCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBbZmlyc3QgZ3JvdXAgYXJlICdxdWljayBjb25maWRlbmNlIGNoZWNrJ10KK2Rxc3ViMDAxIHN1YnRyYWN0ICAwICAgMCAgLT4gJzAnCitkcXN1YjAwMiBzdWJ0cmFjdCAgMSAgIDEgIC0+ICcwJworZHFzdWIwMDMgc3VidHJhY3QgIDEgICAyICAtPiAnLTEnCitkcXN1YjAwNCBzdWJ0cmFjdCAgMiAgIDEgIC0+ICcxJworZHFzdWIwMDUgc3VidHJhY3QgIDIgICAyICAtPiAnMCcKK2Rxc3ViMDA2IHN1YnRyYWN0ICAzICAgMiAgLT4gJzEnCitkcXN1YjAwNyBzdWJ0cmFjdCAgMiAgIDMgIC0+ICctMScKKworZHFzdWIwMTEgc3VidHJhY3QgLTAgICAwICAtPiAnLTAnCitkcXN1YjAxMiBzdWJ0cmFjdCAtMSAgIDEgIC0+ICctMicKK2Rxc3ViMDEzIHN1YnRyYWN0IC0xICAgMiAgLT4gJy0zJworZHFzdWIwMTQgc3VidHJhY3QgLTIgICAxICAtPiAnLTMnCitkcXN1YjAxNSBzdWJ0cmFjdCAtMiAgIDIgIC0+ICctNCcKK2Rxc3ViMDE2IHN1YnRyYWN0IC0zICAgMiAgLT4gJy01JworZHFzdWIwMTcgc3VidHJhY3QgLTIgICAzICAtPiAnLTUnCisKK2Rxc3ViMDIxIHN1YnRyYWN0ICAwICAtMCAgLT4gJzAnCitkcXN1YjAyMiBzdWJ0cmFjdCAgMSAgLTEgIC0+ICcyJworZHFzdWIwMjMgc3VidHJhY3QgIDEgIC0yICAtPiAnMycKK2Rxc3ViMDI0IHN1YnRyYWN0ICAyICAtMSAgLT4gJzMnCitkcXN1YjAyNSBzdWJ0cmFjdCAgMiAgLTIgIC0+ICc0JworZHFzdWIwMjYgc3VidHJhY3QgIDMgIC0yICAtPiAnNScKK2Rxc3ViMDI3IHN1YnRyYWN0ICAyICAtMyAgLT4gJzUnCisKK2Rxc3ViMDMwIHN1YnRyYWN0ICAxMSAgMSAgLT4gMTAKK2Rxc3ViMDMxIHN1YnRyYWN0ICAxMCAgMSAgLT4gIDkKK2Rxc3ViMDMyIHN1YnRyYWN0ICA5ICAgMSAgLT4gIDgKK2Rxc3ViMDMzIHN1YnRyYWN0ICAxICAgMSAgLT4gIDAKK2Rxc3ViMDM0IHN1YnRyYWN0ICAwICAgMSAgLT4gLTEKK2Rxc3ViMDM1IHN1YnRyYWN0IC0xICAgMSAgLT4gLTIKK2Rxc3ViMDM2IHN1YnRyYWN0IC05ICAgMSAgLT4gLTEwCitkcXN1YjAzNyBzdWJ0cmFjdCAtMTAgIDEgIC0+IC0xMQorZHFzdWIwMzggc3VidHJhY3QgLTExICAxICAtPiAtMTIKKworZHFzdWIwNDAgc3VidHJhY3QgJzUuNzUnICczLjMnICAtPiAnMi40NScKK2Rxc3ViMDQxIHN1YnRyYWN0ICc1JyAgICAnLTMnICAgLT4gJzgnCitkcXN1YjA0MiBzdWJ0cmFjdCAnLTUnICAgJy0zJyAgIC0+ICctMicKK2Rxc3ViMDQzIHN1YnRyYWN0ICctNycgICAnMi41JyAgLT4gJy05LjUnCitkcXN1YjA0NCBzdWJ0cmFjdCAnMC43JyAgJzAuMycgIC0+ICcwLjQnCitkcXN1YjA0NSBzdWJ0cmFjdCAnMS4zJyAgJzAuMycgIC0+ICcxLjAnCitkcXN1YjA0NiBzdWJ0cmFjdCAnMS4yNScgJzEuMjUnIC0+ICcwLjAwJworCitkcXN1YjA1MCBzdWJ0cmFjdCAnMS4yMzQ1Njc4OScgICAgJzEuMDAwMDAwMDAnIC0+ICcwLjIzNDU2Nzg5JworZHFzdWIwNTEgc3VidHJhY3QgJzEuMjM0NTY3ODknICAgICcxLjAwMDAwMDg5JyAtPiAnMC4yMzQ1NjcwMCcKKworZHFzdWIwNjAgc3VidHJhY3QgJzcwJyAgICAnMTAwMDBlKzM0JyAtPiAnLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszOCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjA2MSBzdWJ0cmFjdCAnNzAwJyAgICAnMTAwMDBlKzM0JyAtPiAnLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszOCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjA2MiBzdWJ0cmFjdCAnNzAwMCcgICAgJzEwMDAwZSszNCcgLT4gJy05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrMzcnIEluZXhhY3QgUm91bmRlZAorZHFzdWIwNjMgc3VidHJhY3QgJzcwMDAwJyAgICAnMTAwMDBlKzM0JyAtPiAnLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkzRSszNycgUm91bmRlZAorZHFzdWIwNjQgc3VidHJhY3QgJzcwMDAwMCcgICAgJzEwMDAwZSszNCcgLT4gJy05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkzMEUrMzcnIFJvdW5kZWQKKyAgLS0gc3ltbWV0cnk6CitkcXN1YjA2NSBzdWJ0cmFjdCAnMTAwMDBlKzM0JyAgICAnNzAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFzdWIwNjYgc3VidHJhY3QgJzEwMDAwZSszNCcgICAgJzcwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszOCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjA2NyBzdWJ0cmFjdCAnMTAwMDBlKzM0JyAgICAnNzAwMCcgLT4gJzkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSszNycgSW5leGFjdCBSb3VuZGVkCitkcXN1YjA2OCBzdWJ0cmFjdCAnMTAwMDBlKzM0JyAgICAnNzAwMDAnIC0+ICc5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5M0UrMzcnIFJvdW5kZWQKK2Rxc3ViMDY5IHN1YnRyYWN0ICcxMDAwMGUrMzQnICAgICc3MDAwMDAnIC0+ICc5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkzMEUrMzcnIFJvdW5kZWQKKworICAtLSBzb21lIG9mIHRoZSBuZXh0IGdyb3VwIGFyZSByZWFsbHkgY29uc3RydWN0b3IgdGVzdHMKK2Rxc3ViMDkwIHN1YnRyYWN0ICcwMC4wJyAgICAnMC4wJyAgLT4gJzAuMCcKK2Rxc3ViMDkxIHN1YnRyYWN0ICcwMC4wJyAgICAnMC4wMCcgLT4gJzAuMDAnCitkcXN1YjA5MiBzdWJ0cmFjdCAnMC4wMCcgICAgJzAwLjAnIC0+ICcwLjAwJworZHFzdWIwOTMgc3VidHJhY3QgJzAwLjAnICAgICcwLjAwJyAtPiAnMC4wMCcKK2Rxc3ViMDk0IHN1YnRyYWN0ICcwLjAwJyAgICAnMDAuMCcgLT4gJzAuMDAnCitkcXN1YjA5NSBzdWJ0cmFjdCAnMycgICAgJy4zJyAgIC0+ICcyLjcnCitkcXN1YjA5NiBzdWJ0cmFjdCAnMy4nICAgJy4zJyAgIC0+ICcyLjcnCitkcXN1YjA5NyBzdWJ0cmFjdCAnMy4wJyAgJy4zJyAgIC0+ICcyLjcnCitkcXN1YjA5OCBzdWJ0cmFjdCAnMy4wMCcgJy4zJyAgIC0+ICcyLjcwJworZHFzdWIwOTkgc3VidHJhY3QgJzMnICAgICczJyAgICAtPiAnMCcKK2Rxc3ViMTAwIHN1YnRyYWN0ICczJyAgICAnKzMnICAgLT4gJzAnCitkcXN1YjEwMSBzdWJ0cmFjdCAnMycgICAgJy0zJyAgIC0+ICc2JworZHFzdWIxMDIgc3VidHJhY3QgJzMnICAgICcwLjMnICAtPiAnMi43JworZHFzdWIxMDMgc3VidHJhY3QgJzMuJyAgICcwLjMnICAtPiAnMi43JworZHFzdWIxMDQgc3VidHJhY3QgJzMuMCcgICcwLjMnICAtPiAnMi43JworZHFzdWIxMDUgc3VidHJhY3QgJzMuMDAnICcwLjMnICAtPiAnMi43MCcKK2Rxc3ViMTA2IHN1YnRyYWN0ICczJyAgICAnMy4wJyAgLT4gJzAuMCcKK2Rxc3ViMTA3IHN1YnRyYWN0ICczJyAgICAnKzMuMCcgLT4gJzAuMCcKK2Rxc3ViMTA4IHN1YnRyYWN0ICczJyAgICAnLTMuMCcgLT4gJzYuMCcKKworLS0gdGhlIGFib3ZlIGFsbCBmcm9tIGFkZDsgbWFzc2FnZWQgYW5kIGV4dGVuZGVkLiAgTm93IHNvbWUgbmV3IG9uZXMuLi4KKy0tIFtwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGZvciBjb21wYXJpc29uc10KKy0tIE5COiAteEUtOCBiZWxvdyB3ZXJlIG5vbi1leHBvbmVudHMgcHJlLUFOU0kgWDMtMjc0LCBhbmQgLTFFLTcgb3IgMEUtNworLS0gd2l0aCBpbnB1dCByb3VuZGluZy4KK2Rxc3ViMTIwIHN1YnRyYWN0ICAnMTAuMjM0NTY3ODQnICAgICcxMC4yMzQ1Njc4OScgIC0+ICctNUUtOCcKK2Rxc3ViMTIxIHN1YnRyYWN0ICAnMTAuMjM0NTY3ODUnICAgICcxMC4yMzQ1Njc4OScgIC0+ICctNEUtOCcKK2Rxc3ViMTIyIHN1YnRyYWN0ICAnMTAuMjM0NTY3ODYnICAgICcxMC4yMzQ1Njc4OScgIC0+ICctM0UtOCcKK2Rxc3ViMTIzIHN1YnRyYWN0ICAnMTAuMjM0NTY3ODcnICAgICcxMC4yMzQ1Njc4OScgIC0+ICctMkUtOCcKK2Rxc3ViMTI0IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODgnICAgICcxMC4yMzQ1Njc4OScgIC0+ICctMUUtOCcKK2Rxc3ViMTI1IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODknICAgICcxMC4yMzQ1Njc4OScgIC0+ICcwRS04JworZHFzdWIxMjYgc3VidHJhY3QgICcxMC4yMzQ1Njc5MCcgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJzFFLTgnCitkcXN1YjEyNyBzdWJ0cmFjdCAgJzEwLjIzNDU2NzkxJyAgICAnMTAuMjM0NTY3ODknICAtPiAnMkUtOCcKK2Rxc3ViMTI4IHN1YnRyYWN0ICAnMTAuMjM0NTY3OTInICAgICcxMC4yMzQ1Njc4OScgIC0+ICczRS04JworZHFzdWIxMjkgc3VidHJhY3QgICcxMC4yMzQ1Njc5MycgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJzRFLTgnCitkcXN1YjEzMCBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzk0JyAgICAnMTAuMjM0NTY3ODknICAtPiAnNUUtOCcKK2Rxc3ViMTMxIHN1YnRyYWN0ICAnMTAuMjM0NTY3ODEnICAgICcxMC4yMzQ1Njc4NicgIC0+ICctNUUtOCcKK2Rxc3ViMTMyIHN1YnRyYWN0ICAnMTAuMjM0NTY3ODInICAgICcxMC4yMzQ1Njc4NicgIC0+ICctNEUtOCcKK2Rxc3ViMTMzIHN1YnRyYWN0ICAnMTAuMjM0NTY3ODMnICAgICcxMC4yMzQ1Njc4NicgIC0+ICctM0UtOCcKK2Rxc3ViMTM0IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODQnICAgICcxMC4yMzQ1Njc4NicgIC0+ICctMkUtOCcKK2Rxc3ViMTM1IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODUnICAgICcxMC4yMzQ1Njc4NicgIC0+ICctMUUtOCcKK2Rxc3ViMTM2IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODYnICAgICcxMC4yMzQ1Njc4NicgIC0+ICcwRS04JworZHFzdWIxMzcgc3VidHJhY3QgICcxMC4yMzQ1Njc4NycgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJzFFLTgnCitkcXN1YjEzOCBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg4JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnMkUtOCcKK2Rxc3ViMTM5IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODknICAgICcxMC4yMzQ1Njc4NicgIC0+ICczRS04JworZHFzdWIxNDAgc3VidHJhY3QgICcxMC4yMzQ1Njc5MCcgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJzRFLTgnCitkcXN1YjE0MSBzdWJ0cmFjdCAgJzEwLjIzNDU2NzkxJyAgICAnMTAuMjM0NTY3ODYnICAtPiAnNUUtOCcKK2Rxc3ViMTQyIHN1YnRyYWN0ICAnMScgICAgICAgICAgICAgICcwLjk5OTk5OTk5OScgIC0+ICcxRS05JworZHFzdWIxNDMgc3VidHJhY3QgICcwLjk5OTk5OTk5OScgICAgJzEnICAgICAgICAgICAgLT4gJy0xRS05JworZHFzdWIxNDQgc3VidHJhY3QgICctMTAuMjM0NTY3ODAnICAgJy0xMC4yMzQ1Njc4NicgLT4gJzZFLTgnCitkcXN1YjE0NSBzdWJ0cmFjdCAgJy0xMC4yMzQ1Njc5MCcgICAnLTEwLjIzNDU2Nzg2JyAtPiAnLTRFLTgnCitkcXN1YjE0NiBzdWJ0cmFjdCAgJy0xMC4yMzQ1Njc5MScgICAnLTEwLjIzNDU2Nzg2JyAtPiAnLTVFLTgnCisKKy0tIGFkZGl0aW9uYWwgc2NhbGVkIGFyaXRobWV0aWMgdGVzdHMgWzAuOTcgcHJvYmxlbV0KK2Rxc3ViMTYwIHN1YnRyYWN0ICcwJyAgICAgJy4xJyAgICAgIC0+ICctMC4xJworZHFzdWIxNjEgc3VidHJhY3QgJzAwJyAgICAnLjk3OTgzJyAgLT4gJy0wLjk3OTgzJworZHFzdWIxNjIgc3VidHJhY3QgJzAnICAgICAnLjknICAgICAgLT4gJy0wLjknCitkcXN1YjE2MyBzdWJ0cmFjdCAnMCcgICAgICcwLjEwMicgICAtPiAnLTAuMTAyJworZHFzdWIxNjQgc3VidHJhY3QgJzAnICAgICAnLjQnICAgICAgLT4gJy0wLjQnCitkcXN1YjE2NSBzdWJ0cmFjdCAnMCcgICAgICcuMzA3JyAgICAtPiAnLTAuMzA3JworZHFzdWIxNjYgc3VidHJhY3QgJzAnICAgICAnLjQzODIyJyAgLT4gJy0wLjQzODIyJworZHFzdWIxNjcgc3VidHJhY3QgJzAnICAgICAnLjkxMScgICAgLT4gJy0wLjkxMScKK2Rxc3ViMTY4IHN1YnRyYWN0ICcuMCcgICAgJy4wMicgICAgIC0+ICctMC4wMicKK2Rxc3ViMTY5IHN1YnRyYWN0ICcwMCcgICAgJy4zOTInICAgIC0+ICctMC4zOTInCitkcXN1YjE3MCBzdWJ0cmFjdCAnMCcgICAgICcuMjYnICAgICAtPiAnLTAuMjYnCitkcXN1YjE3MSBzdWJ0cmFjdCAnMCcgICAgICcwLjUxJyAgICAtPiAnLTAuNTEnCitkcXN1YjE3MiBzdWJ0cmFjdCAnMCcgICAgICcuMjIzNCcgICAtPiAnLTAuMjIzNCcKK2Rxc3ViMTczIHN1YnRyYWN0ICcwJyAgICAgJy4yJyAgICAgIC0+ICctMC4yJworZHFzdWIxNzQgc3VidHJhY3QgJy4wJyAgICAnLjAwMDgnICAgLT4gJy0wLjAwMDgnCistLSAwLiBvbiBsZWZ0CitkcXN1YjE4MCBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMScgICAgICAtPiAnMC4xJworZHFzdWIxODEgc3VidHJhY3QgJzAuMDAnICAgICctLjk3OTgzJyAgLT4gJzAuOTc5ODMnCitkcXN1YjE4MiBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uOScgICAgICAtPiAnMC45JworZHFzdWIxODMgc3VidHJhY3QgJzAuMCcgICAgICctMC4xMDInICAgLT4gJzAuMTAyJworZHFzdWIxODQgc3VidHJhY3QgJzAuMCcgICAgICctLjQnICAgICAgLT4gJzAuNCcKK2Rxc3ViMTg1IHN1YnRyYWN0ICcwLjAnICAgICAnLS4zMDcnICAgIC0+ICcwLjMwNycKK2Rxc3ViMTg2IHN1YnRyYWN0ICcwLjAnICAgICAnLS40MzgyMicgIC0+ICcwLjQzODIyJworZHFzdWIxODcgc3VidHJhY3QgJzAuMCcgICAgICctLjkxMScgICAgLT4gJzAuOTExJworZHFzdWIxODggc3VidHJhY3QgJzAuMCcgICAgICctLjAyJyAgICAgLT4gJzAuMDInCitkcXN1YjE4OSBzdWJ0cmFjdCAnMC4wMCcgICAgJy0uMzkyJyAgICAtPiAnMC4zOTInCitkcXN1YjE5MCBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMjYnICAgICAtPiAnMC4yNicKK2Rxc3ViMTkxIHN1YnRyYWN0ICcwLjAnICAgICAnLTAuNTEnICAgIC0+ICcwLjUxJworZHFzdWIxOTIgc3VidHJhY3QgJzAuMCcgICAgICctLjIyMzQnICAgLT4gJzAuMjIzNCcKK2Rxc3ViMTkzIHN1YnRyYWN0ICcwLjAnICAgICAnLS4yJyAgICAgIC0+ICcwLjInCitkcXN1YjE5NCBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMDAwOCcgICAtPiAnMC4wMDA4JworLS0gbmVnYXRpdmVzIG9mIHNhbWUKK2Rxc3ViMjAwIHN1YnRyYWN0ICcwJyAgICAgJy0uMScgICAgICAtPiAnMC4xJworZHFzdWIyMDEgc3VidHJhY3QgJzAwJyAgICAnLS45Nzk4MycgIC0+ICcwLjk3OTgzJworZHFzdWIyMDIgc3VidHJhY3QgJzAnICAgICAnLS45JyAgICAgIC0+ICcwLjknCitkcXN1YjIwMyBzdWJ0cmFjdCAnMCcgICAgICctMC4xMDInICAgLT4gJzAuMTAyJworZHFzdWIyMDQgc3VidHJhY3QgJzAnICAgICAnLS40JyAgICAgIC0+ICcwLjQnCitkcXN1YjIwNSBzdWJ0cmFjdCAnMCcgICAgICctLjMwNycgICAgLT4gJzAuMzA3JworZHFzdWIyMDYgc3VidHJhY3QgJzAnICAgICAnLS40MzgyMicgIC0+ICcwLjQzODIyJworZHFzdWIyMDcgc3VidHJhY3QgJzAnICAgICAnLS45MTEnICAgIC0+ICcwLjkxMScKK2Rxc3ViMjA4IHN1YnRyYWN0ICcuMCcgICAgJy0uMDInICAgICAtPiAnMC4wMicKK2Rxc3ViMjA5IHN1YnRyYWN0ICcwMCcgICAgJy0uMzkyJyAgICAtPiAnMC4zOTInCitkcXN1YjIxMCBzdWJ0cmFjdCAnMCcgICAgICctLjI2JyAgICAgLT4gJzAuMjYnCitkcXN1YjIxMSBzdWJ0cmFjdCAnMCcgICAgICctMC41MScgICAgLT4gJzAuNTEnCitkcXN1YjIxMiBzdWJ0cmFjdCAnMCcgICAgICctLjIyMzQnICAgLT4gJzAuMjIzNCcKK2Rxc3ViMjEzIHN1YnRyYWN0ICcwJyAgICAgJy0uMicgICAgICAtPiAnMC4yJworZHFzdWIyMTQgc3VidHJhY3QgJy4wJyAgICAnLS4wMDA4JyAgIC0+ICcwLjAwMDgnCisKKy0tIG1vcmUgZml4ZWQsIExIUyBzd2FwcyBbcmVhbGx5IHRoZSBzYW1lIGFzIHRlc3RjYXNlcyB1bmRlciBhZGRdCitkcXN1YjIyMCBzdWJ0cmFjdCAnLTU2MjY3RS0xMicgMCAgLT4gJy01LjYyNjdFLTgnCitkcXN1YjIyMSBzdWJ0cmFjdCAnLTU2MjY3RS0xMScgMCAgLT4gJy01LjYyNjdFLTcnCitkcXN1YjIyMiBzdWJ0cmFjdCAnLTU2MjY3RS0xMCcgMCAgLT4gJy0wLjAwMDAwNTYyNjcnCitkcXN1YjIyMyBzdWJ0cmFjdCAnLTU2MjY3RS05JyAgMCAgLT4gJy0wLjAwMDA1NjI2NycKK2Rxc3ViMjI0IHN1YnRyYWN0ICctNTYyNjdFLTgnICAwICAtPiAnLTAuMDAwNTYyNjcnCitkcXN1YjIyNSBzdWJ0cmFjdCAnLTU2MjY3RS03JyAgMCAgLT4gJy0wLjAwNTYyNjcnCitkcXN1YjIyNiBzdWJ0cmFjdCAnLTU2MjY3RS02JyAgMCAgLT4gJy0wLjA1NjI2NycKK2Rxc3ViMjI3IHN1YnRyYWN0ICctNTYyNjdFLTUnICAwICAtPiAnLTAuNTYyNjcnCitkcXN1YjIyOCBzdWJ0cmFjdCAnLTU2MjY3RS0yJyAgMCAgLT4gJy01NjIuNjcnCitkcXN1YjIyOSBzdWJ0cmFjdCAnLTU2MjY3RS0xJyAgMCAgLT4gJy01NjI2LjcnCitkcXN1YjIzMCBzdWJ0cmFjdCAnLTU2MjY3RS0wJyAgMCAgLT4gJy01NjI2NycKKy0tIHN5bW1ldHJ5IC4uLgorZHFzdWIyNDAgc3VidHJhY3QgMCAnLTU2MjY3RS0xMicgIC0+ICc1LjYyNjdFLTgnCitkcXN1YjI0MSBzdWJ0cmFjdCAwICctNTYyNjdFLTExJyAgLT4gJzUuNjI2N0UtNycKK2Rxc3ViMjQyIHN1YnRyYWN0IDAgJy01NjI2N0UtMTAnICAtPiAnMC4wMDAwMDU2MjY3JworZHFzdWIyNDMgc3VidHJhY3QgMCAnLTU2MjY3RS05JyAgIC0+ICcwLjAwMDA1NjI2NycKK2Rxc3ViMjQ0IHN1YnRyYWN0IDAgJy01NjI2N0UtOCcgICAtPiAnMC4wMDA1NjI2NycKK2Rxc3ViMjQ1IHN1YnRyYWN0IDAgJy01NjI2N0UtNycgICAtPiAnMC4wMDU2MjY3JworZHFzdWIyNDYgc3VidHJhY3QgMCAnLTU2MjY3RS02JyAgIC0+ICcwLjA1NjI2NycKK2Rxc3ViMjQ3IHN1YnRyYWN0IDAgJy01NjI2N0UtNScgICAtPiAnMC41NjI2NycKK2Rxc3ViMjQ4IHN1YnRyYWN0IDAgJy01NjI2N0UtMicgICAtPiAnNTYyLjY3JworZHFzdWIyNDkgc3VidHJhY3QgMCAnLTU2MjY3RS0xJyAgIC0+ICc1NjI2LjcnCitkcXN1YjI1MCBzdWJ0cmFjdCAwICctNTYyNjdFLTAnICAgLT4gJzU2MjY3JworCistLSBub3cgc29tZSBtb3JlIGZyb20gdGhlICduZXcnIGFkZAorZHFzdWIzMDEgc3VidHJhY3QgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAwMCcgLT4gJzAuMjM0NTY3ODknCitkcXN1YjMwMiBzdWJ0cmFjdCAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDExJyAtPiAnMC4yMzQ1Njc3OCcKKworLS0gc29tZSBjYXJyeWluZyBlZmZlY3RzCitkcXN1YjMyMSBzdWJ0cmFjdCAnMC45OTk4JyAgJzAuMDAwMCcgLT4gJzAuOTk5OCcKK2Rxc3ViMzIyIHN1YnRyYWN0ICcwLjk5OTgnICAnMC4wMDAxJyAtPiAnMC45OTk3JworZHFzdWIzMjMgc3VidHJhY3QgJzAuOTk5OCcgICcwLjAwMDInIC0+ICcwLjk5OTYnCitkcXN1YjMyNCBzdWJ0cmFjdCAnMC45OTk4JyAgJzAuMDAwMycgLT4gJzAuOTk5NScKK2Rxc3ViMzI1IHN1YnRyYWN0ICcwLjk5OTgnICAnLTAuMDAwMCcgLT4gJzAuOTk5OCcKK2Rxc3ViMzI2IHN1YnRyYWN0ICcwLjk5OTgnICAnLTAuMDAwMScgLT4gJzAuOTk5OScKK2Rxc3ViMzI3IHN1YnRyYWN0ICcwLjk5OTgnICAnLTAuMDAwMicgLT4gJzEuMDAwMCcKK2Rxc3ViMzI4IHN1YnRyYWN0ICcwLjk5OTgnICAnLTAuMDAwMycgLT4gJzEuMDAwMScKKworLS0gaW50ZXJuYWwgYm91bmRhcmllcworZHFzdWIzNDYgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcnICAgLT4gJzk5OTk5OTk5OTk5OTMnCitkcXN1YjM0NyBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAnICAgLT4gJzk5OTk5OTk5OTk5MzAnCitkcXN1YjM0OCBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAwJyAgIC0+ICc5OTk5OTk5OTk5MzAwJworZHFzdWIzNDkgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwMDAnICAgLT4gJzk5OTk5OTk5OTMwMDAnCitkcXN1YjM1MCBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAwMDAnICAgLT4gJzk5OTk5OTk5MzAwMDAnCitkcXN1YjM1MSBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAwMDAwJyAgIC0+ICc5OTk5OTk5MzAwMDAwJworZHFzdWIzNTIgc3VidHJhY3QgJzcnICcxMDAwMGUrOScgICAtPiAnLTk5OTk5OTk5OTk5OTMnCitkcXN1YjM1MyBzdWJ0cmFjdCAnNzAnICcxMDAwMGUrOScgICAtPiAnLTk5OTk5OTk5OTk5MzAnCitkcXN1YjM1NCBzdWJ0cmFjdCAnNzAwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTk5MzAwJworZHFzdWIzNTUgc3VidHJhY3QgJzcwMDAnICcxMDAwMGUrOScgICAtPiAnLTk5OTk5OTk5OTMwMDAnCitkcXN1YjM1NiBzdWJ0cmFjdCAnNzAwMDAnICcxMDAwMGUrOScgICAtPiAnLTk5OTk5OTk5MzAwMDAnCitkcXN1YjM1NyBzdWJ0cmFjdCAnNzAwMDAwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5MzAwMDAwJworCistLSB6ZXJvIHByZXNlcnZhdGlvbgorZHFzdWIzNjEgc3VidHJhY3QgMSAnMC4wMDAxJyAtPiAnMC45OTk5JworZHFzdWIzNjIgc3VidHJhY3QgMSAnMC4wMDAwMScgLT4gJzAuOTk5OTknCitkcXN1YjM2MyBzdWJ0cmFjdCAxICcwLjAwMDAwMScgLT4gJzAuOTk5OTk5JworZHFzdWIzNjQgc3VidHJhY3QgMSAnMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFzdWIzNjUgc3VidHJhY3QgMSAnMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViMzY2IHN1YnRyYWN0IDEgJzAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorCistLSBzb21lIGZ1bm55IHplcm9zIFtpbiBjYXNlIG9mIGJhZCBzaWdudW1dCitkcXN1YjM3MCBzdWJ0cmFjdCAxICAwICAtPiAxCitkcXN1YjM3MSBzdWJ0cmFjdCAxIDAuICAtPiAxCitkcXN1YjM3MiBzdWJ0cmFjdCAxICAuMCAtPiAxLjAKK2Rxc3ViMzczIHN1YnRyYWN0IDEgMC4wIC0+IDEuMAorZHFzdWIzNzQgc3VidHJhY3QgIDAgIDEgLT4gLTEKK2Rxc3ViMzc1IHN1YnRyYWN0IDAuICAxIC0+IC0xCitkcXN1YjM3NiBzdWJ0cmFjdCAgLjAgMSAtPiAtMS4wCitkcXN1YjM3NyBzdWJ0cmFjdCAwLjAgMSAtPiAtMS4wCisKKy0tIGxlYWRpbmcgMCBkaWdpdCBiZWZvcmUgcm91bmQKK2Rxc3ViOTEwIHN1YnRyYWN0IC0xMDM1MTkzNjIgLTUxODk3OTU1LjMgLT4gLTUxNjIxNDA2LjcKK2Rxc3ViOTExIHN1YnRyYWN0IDE1OTU3OS40NDQgODk4MjcuNTIyOSAtPiA2OTc1MS45MjExCisKK2Rxc3ViOTIwIHN1YnRyYWN0IDMzMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2IDMzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTY2IC0+IDI5OS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFzdWI5MjEgc3VidHJhY3QgMzMzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTYgMzMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NjUgLT4gMzAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcXN1YjkyMiBzdWJ0cmFjdCAxMzMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NiAzMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2NSAtPiAgOTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUKK2Rxc3ViOTIzIHN1YnRyYWN0IDEzMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2IDMzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTY0IC0+ICA5OS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NgorZHFzdWI5MjQgc3VidHJhY3QgMTMzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTYgMzMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NDAgLT4gMTAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIgUm91bmRlZAorZHFzdWI5MjUgc3VidHJhY3QgMTMzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTYgNDMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NjAgLT4gIDkwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXN1YjkyNiBzdWJ0cmFjdCAxMzMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NiA0My4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2MSAtPiAgODkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2Rxc3ViOTI3IHN1YnRyYWN0IDEzMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2IDQzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTY2IC0+ICA4OS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NAorZHFzdWI5Mjggc3VidHJhY3QgMTAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTYgOTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NjYgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk0CitkcXN1YjkyOSBzdWJ0cmFjdCAxMDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NiA5OS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2NiAtPiAgIDEuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTQKKworLS0gbW9yZSBMSFMgc3dhcHMgW3dlcmUgZml4ZWRdCitkcXN1YjM5MCBzdWJ0cmFjdCAnLTU2MjY3RS0xMCcgICAwIC0+ICAnLTAuMDAwMDA1NjI2NycKK2Rxc3ViMzkxIHN1YnRyYWN0ICctNTYyNjdFLTYnICAgIDAgLT4gICctMC4wNTYyNjcnCitkcXN1YjM5MiBzdWJ0cmFjdCAnLTU2MjY3RS01JyAgICAwIC0+ICAnLTAuNTYyNjcnCitkcXN1YjM5MyBzdWJ0cmFjdCAnLTU2MjY3RS00JyAgICAwIC0+ICAnLTUuNjI2NycKK2Rxc3ViMzk0IHN1YnRyYWN0ICctNTYyNjdFLTMnICAgIDAgLT4gICctNTYuMjY3JworZHFzdWIzOTUgc3VidHJhY3QgJy01NjI2N0UtMicgICAgMCAtPiAgJy01NjIuNjcnCitkcXN1YjM5NiBzdWJ0cmFjdCAnLTU2MjY3RS0xJyAgICAwIC0+ICAnLTU2MjYuNycKK2Rxc3ViMzk3IHN1YnRyYWN0ICctNTYyNjdFLTAnICAgIDAgLT4gICctNTYyNjcnCitkcXN1YjM5OCBzdWJ0cmFjdCAnLTVFLTEwJyAgICAgICAwIC0+ICAnLTVFLTEwJworZHFzdWIzOTkgc3VidHJhY3QgJy01RS03JyAgICAgICAgMCAtPiAgJy01RS03JworZHFzdWI0MDAgc3VidHJhY3QgJy01RS02JyAgICAgICAgMCAtPiAgJy0wLjAwMDAwNScKK2Rxc3ViNDAxIHN1YnRyYWN0ICctNUUtNScgICAgICAgIDAgLT4gICctMC4wMDAwNScKK2Rxc3ViNDAyIHN1YnRyYWN0ICctNUUtNCcgICAgICAgIDAgLT4gICctMC4wMDA1JworZHFzdWI0MDMgc3VidHJhY3QgJy01RS0xJyAgICAgICAgMCAtPiAgJy0wLjUnCitkcXN1YjQwNCBzdWJ0cmFjdCAnLTVFMCcgICAgICAgICAwIC0+ICAnLTUnCitkcXN1YjQwNSBzdWJ0cmFjdCAnLTVFMScgICAgICAgICAwIC0+ICAnLTUwJworZHFzdWI0MDYgc3VidHJhY3QgJy01RTUnICAgICAgICAgMCAtPiAgJy01MDAwMDAnCitkcXN1YjQwNyBzdWJ0cmFjdCAnLTVFMzMnICAgICAgICAwIC0+ICAnLTUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcXN1YjQwOCBzdWJ0cmFjdCAnLTVFMzQnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCcgIFJvdW5kZWQKK2Rxc3ViNDA5IHN1YnRyYWN0ICctNUUzNScgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM1JyAgUm91bmRlZAorZHFzdWI0MTAgc3VidHJhY3QgJy01RTM2JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzYnICBSb3VuZGVkCitkcXN1YjQxMSBzdWJ0cmFjdCAnLTVFMTAwJyAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSsxMDAnIFJvdW5kZWQKKworLS0gbW9yZSBSSFMgc3dhcHMgW3dlcmUgZml4ZWRdCitkcXN1YjQyMCBzdWJ0cmFjdCAwICAnLTU2MjY3RS0xMCcgLT4gICcwLjAwMDAwNTYyNjcnCitkcXN1YjQyMSBzdWJ0cmFjdCAwICAnLTU2MjY3RS02JyAgLT4gICcwLjA1NjI2NycKK2Rxc3ViNDIyIHN1YnRyYWN0IDAgICctNTYyNjdFLTUnICAtPiAgJzAuNTYyNjcnCitkcXN1YjQyMyBzdWJ0cmFjdCAwICAnLTU2MjY3RS00JyAgLT4gICc1LjYyNjcnCitkcXN1YjQyNCBzdWJ0cmFjdCAwICAnLTU2MjY3RS0zJyAgLT4gICc1Ni4yNjcnCitkcXN1YjQyNSBzdWJ0cmFjdCAwICAnLTU2MjY3RS0yJyAgLT4gICc1NjIuNjcnCitkcXN1YjQyNiBzdWJ0cmFjdCAwICAnLTU2MjY3RS0xJyAgLT4gICc1NjI2LjcnCitkcXN1YjQyNyBzdWJ0cmFjdCAwICAnLTU2MjY3RS0wJyAgLT4gICc1NjI2NycKK2Rxc3ViNDI4IHN1YnRyYWN0IDAgICctNUUtMTAnICAgICAtPiAgJzVFLTEwJworZHFzdWI0Mjkgc3VidHJhY3QgMCAgJy01RS03JyAgICAgIC0+ICAnNUUtNycKK2Rxc3ViNDMwIHN1YnRyYWN0IDAgICctNUUtNicgICAgICAtPiAgJzAuMDAwMDA1JworZHFzdWI0MzEgc3VidHJhY3QgMCAgJy01RS01JyAgICAgIC0+ICAnMC4wMDAwNScKK2Rxc3ViNDMyIHN1YnRyYWN0IDAgICctNUUtNCcgICAgICAtPiAgJzAuMDAwNScKK2Rxc3ViNDMzIHN1YnRyYWN0IDAgICctNUUtMScgICAgICAtPiAgJzAuNScKK2Rxc3ViNDM0IHN1YnRyYWN0IDAgICctNUUwJyAgICAgICAtPiAgJzUnCitkcXN1YjQzNSBzdWJ0cmFjdCAwICAnLTVFMScgICAgICAgLT4gICc1MCcKK2Rxc3ViNDM2IHN1YnRyYWN0IDAgICctNUU1JyAgICAgICAtPiAgJzUwMDAwMCcKK2Rxc3ViNDM3IHN1YnRyYWN0IDAgICctNUUzMycgICAgICAtPiAgJzUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcXN1YjQzOCBzdWJ0cmFjdCAwICAnLTVFMzQnICAgICAgLT4gICc1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQnICAgUm91bmRlZAorZHFzdWI0Mzkgc3VidHJhY3QgMCAgJy01RTM1JyAgICAgIC0+ICAnNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM1JyAgIFJvdW5kZWQKK2Rxc3ViNDQwIHN1YnRyYWN0IDAgICctNUUzNicgICAgICAtPiAgJzUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNicgICBSb3VuZGVkCitkcXN1YjQ0MSBzdWJ0cmFjdCAwICAnLTVFMTAwJyAgICAgLT4gICc1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMTAwJyAgUm91bmRlZAorCisKKy0tIHRyeSBib3JkZXJsaW5lIHByZWNpc2lvbiwgd2l0aCBjYXJyaWVzLCBldGMuCitkcXN1YjQ2MSBzdWJ0cmFjdCAnMUUrMTYnICcxJyAgICAgICAgLT4gJzk5OTk5OTk5OTk5OTk5OTknCitkcXN1YjQ2MiBzdWJ0cmFjdCAnMUUrMTInICctMS4xMTEnICAgLT4gJzEwMDAwMDAwMDAwMDEuMTExJworZHFzdWI0NjMgc3VidHJhY3QgJzEuMTExJyAgJy0xRSsxMicgIC0+ICcxMDAwMDAwMDAwMDAxLjExMScKK2Rxc3ViNDY0IHN1YnRyYWN0ICctMScgICAgJy0xRSsxNicgICAtPiAnOTk5OTk5OTk5OTk5OTk5OScKK2Rxc3ViNDY1IHN1YnRyYWN0ICc3RSsxNScgJzEnICAgICAgICAtPiAnNjk5OTk5OTk5OTk5OTk5OScKK2Rxc3ViNDY2IHN1YnRyYWN0ICc3RSsxMicgJy0xLjExMScgICAtPiAnNzAwMDAwMDAwMDAwMS4xMTEnCitkcXN1YjQ2NyBzdWJ0cmFjdCAnMS4xMTEnICAnLTdFKzEyJyAgLT4gJzcwMDAwMDAwMDAwMDEuMTExJworZHFzdWI0Njggc3VidHJhY3QgJy0xJyAgICAnLTdFKzE1JyAgIC0+ICc2OTk5OTk5OTk5OTk5OTk5JworCistLSAgICAgICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAxIDIzNDU2Nzg5MDEyMzQ1CitkcXN1YjQ3MCBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NjMnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjQ3MSBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NjInIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjQ3MiBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NjEnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjQ3MyBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NjAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjQ3NCBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTknIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjQ3NSBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTgnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjQ3NiBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTcnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjQ3NyBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZHFzdWI0Nzggc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFzdWI0Nzkgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0JyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4JworZHFzdWI0ODAgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUzJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3JworZHFzdWI0ODEgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUyJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2JworZHFzdWI0ODIgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUxJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1JworZHFzdWI0ODMgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUwJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk0JworCistLSBhbmQgc29tZSBtb3JlLCBpbmNsdWRpbmcgcmVzaWR1ZSBlZmZlY3RzIGFuZCBkaWZmZXJlbnQgcm91bmRpbmdzCityb3VuZGluZzogaGFsZl91cAorZHFzdWI1MDAgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknCitkcXN1YjUwMSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUwMiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUwMyBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUwNCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUwNSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUwNiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUwNyBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUwOCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUwOSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUxMCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUxMSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUxMiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUxMyBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUxNCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUxNSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUxNiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcKK2Rxc3ViNTE3IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAxLjAwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTE4IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTE5IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZHFzdWI1MjAgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknCitkcXN1YjUyMSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUyMiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUyMyBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUyNCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUyNSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUyNiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUyNyBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUyOCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUyOSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUzMCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUzMSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUzMiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUzMyBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUzNCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUzNSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUzNiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcKK2Rxc3ViNTM3IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTM4IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTM5IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitkcXN1YjU0MCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU0MSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU0MiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4NycgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkcXN1YjU1MCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScKK2Rxc3ViNTUxIHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTUyIHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTUzIHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTU0IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTU1IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTU2IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTU3IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTU4IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTU5IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTYwIHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTYxIHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTYyIHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTYzIHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTY0IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTY1IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTY2IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JworZHFzdWI1Njcgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1Njggc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1Njkgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorCistLSBzeW1tZXRyeS4uLgorcm91bmRpbmc6IGhhbGZfdXAKK2Rxc3ViNjAwIHN1YnRyYWN0IDAgICAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScKK2Rxc3ViNjAxIHN1YnRyYWN0IDAuMDAwMDAwMDAxICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYwMiBzdWJ0cmFjdCAwLjAwMDAwMSAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MDMgc3VidHJhY3QgMC4xICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjA0IHN1YnRyYWN0IDAuNCAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYwNSBzdWJ0cmFjdCAwLjQ5ICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MDYgc3VidHJhY3QgMC40OTk5OTkgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjA3IHN1YnRyYWN0IDAuNDk5OTk5OTk5ICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYwOCBzdWJ0cmFjdCAwLjUgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MDkgc3VidHJhY3QgMC41MDAwMDAwMDEgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjEwIHN1YnRyYWN0IDAuNTAwMDAxICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYxMSBzdWJ0cmFjdCAwLjUxICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MTIgc3VidHJhY3QgMC42ICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjEzIHN1YnRyYWN0IDAuOSAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYxNCBzdWJ0cmFjdCAwLjk5OTk5ICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MTUgc3VidHJhY3QgMC45OTk5OTk5OTkgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjE2IHN1YnRyYWN0IDEgICAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcKK2Rxc3ViNjE3IHN1YnRyYWN0IDEuMDAwMDAwMDAxICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYxOCBzdWJ0cmFjdCAxLjAwMDAxICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MTkgc3VidHJhY3QgMS4xICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZHFzdWI2MjAgc3VidHJhY3QgMCAgICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JworZHFzdWI2MjEgc3VidHJhY3QgMC4wMDAwMDAwMDEgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjIyIHN1YnRyYWN0IDAuMDAwMDAxICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYyMyBzdWJ0cmFjdCAwLjEgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MjQgc3VidHJhY3QgMC40ICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjI1IHN1YnRyYWN0IDAuNDkgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYyNiBzdWJ0cmFjdCAwLjQ5OTk5OSAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI2Mjcgc3VidHJhY3QgMC40OTk5OTk5OTkgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjI4IHN1YnRyYWN0IDAuNSAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYyOSBzdWJ0cmFjdCAwLjUwMDAwMDAwMSAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MzAgc3VidHJhY3QgMC41MDAwMDEgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjMxIHN1YnRyYWN0IDAuNTEgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYzMiBzdWJ0cmFjdCAwLjYgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MzMgc3VidHJhY3QgMC45ICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjM0IHN1YnRyYWN0IDAuOTk5OTkgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYzNSBzdWJ0cmFjdCAwLjk5OTk5OTk5OSAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MzYgc3VidHJhY3QgMSAgICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JworZHFzdWI2Mzcgc3VidHJhY3QgMS4wMDAwMDAwMSAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjM4IHN1YnRyYWN0IDEuMDAwMDEgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYzOSBzdWJ0cmFjdCAxLjEgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorLS0gY3JpdGljYWwgZmV3IHdpdGggZXZlbiBib3R0b20gZGlnaXQuLi4KK2Rxc3ViNjQwIHN1YnRyYWN0IDAuNDk5OTk5OTk5ICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjY0MSBzdWJ0cmFjdCAwLjUgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2NDIgc3VidHJhY3QgMC41MDAwMDAwMDEgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGRvd24KK2Rxc3ViNjUwIHN1YnRyYWN0IDAgICAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScKK2Rxc3ViNjUxIHN1YnRyYWN0IDAuMDAwMDAwMDAxICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjY1MiBzdWJ0cmFjdCAwLjAwMDAwMSAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2NTMgc3VidHJhY3QgMC4xICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjU0IHN1YnRyYWN0IDAuNCAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjY1NSBzdWJ0cmFjdCAwLjQ5ICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2NTYgc3VidHJhY3QgMC40OTk5OTkgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjU3IHN1YnRyYWN0IDAuNDk5OTk5OTk5ICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjY1OCBzdWJ0cmFjdCAwLjUgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2NTkgc3VidHJhY3QgMC41MDAwMDAwMDEgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjYwIHN1YnRyYWN0IDAuNTAwMDAxICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjY2MSBzdWJ0cmFjdCAwLjUxICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2NjIgc3VidHJhY3QgMC42ICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjYzIHN1YnRyYWN0IDAuOSAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjY2NCBzdWJ0cmFjdCAwLjk5OTk5ICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2NjUgc3VidHJhY3QgMC45OTk5OTk5OTkgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjY2IHN1YnRyYWN0IDEgICAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcKK2Rxc3ViNjY3IHN1YnRyYWN0IDEuMDAwMDAwMDEgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4NycgSW5leGFjdCBSb3VuZGVkCitkcXN1YjY2OCBzdWJ0cmFjdCAxLjAwMDAxICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2Njkgc3VidHJhY3QgMS4xICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKKworCistLSBsb3RzIG9mIGxlYWRpbmcgemVyb3MgaW4gaW50ZXJtZWRpYXRlIHJlc3VsdCwgYW5kIHNob3dpbmcgZWZmZWN0cyBvZgorLS0gaW5wdXQgcm91bmRpbmcgd291bGQgaGF2ZSBhZmZlY3RlZCB0aGUgZm9sbG93aW5nCityb3VuZGluZzogaGFsZl91cAorZHFzdWI2NzAgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg4LjEnIC0+IDAuOQorZHFzdWI2NzEgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg4LjknIC0+IDAuMQorZHFzdWI2NzIgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg5LjEnIC0+IC0wLjEKK2Rxc3ViNjczIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OS41JyAtPiAtMC41CitkcXN1YjY3NCBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODkuOScgLT4gLTAuOQorCityb3VuZGluZzogaGFsZl9ldmVuCitkcXN1YjY4MCBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODguMScgLT4gMC45CitkcXN1YjY4MSBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODguOScgLT4gMC4xCitkcXN1YjY4MiBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODkuMScgLT4gLTAuMQorZHFzdWI2ODMgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg5LjUnIC0+IC0wLjUKK2Rxc3ViNjg0IHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OS45JyAtPiAtMC45CisKK2Rxc3ViNjg1IHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg4JyAnMTIzNDU2NzQ1Njc4Ny4xJyAtPiAwLjkKK2Rxc3ViNjg2IHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg4JyAnMTIzNDU2NzQ1Njc4Ny45JyAtPiAwLjEKK2Rxc3ViNjg3IHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg4JyAnMTIzNDU2NzQ1Njc4OC4xJyAtPiAtMC4xCitkcXN1YjY4OCBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OCcgJzEyMzQ1Njc0NTY3ODguNScgLT4gLTAuNQorZHFzdWI2ODkgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODgnICcxMjM0NTY3NDU2Nzg4LjknIC0+IC0wLjkKKworcm91bmRpbmc6IGRvd24KK2Rxc3ViNjkwIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OC4xJyAtPiAwLjkKK2Rxc3ViNjkxIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OC45JyAtPiAwLjEKK2Rxc3ViNjkyIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OS4xJyAtPiAtMC4xCitkcXN1YjY5MyBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODkuNScgLT4gLTAuNQorZHFzdWI2OTQgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg5LjknIC0+IC0wLjkKKworLS0gU3BlY2lhbHMKK2Rxc3ViNzgwIHN1YnRyYWN0IC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK2Rxc3ViNzgxIHN1YnRyYWN0IC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2Rxc3ViNzgyIHN1YnRyYWN0IC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2Rxc3ViNzgzIHN1YnRyYWN0IC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2Rxc3ViNzg0IHN1YnRyYWN0IC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2Rxc3ViNzg1IHN1YnRyYWN0IC1JbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK2Rxc3ViNzg3IHN1YnRyYWN0IC0xMDAwICBJbmYgICAtPiAtSW5maW5pdHkKK2Rxc3ViNzg4IHN1YnRyYWN0IC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK2Rxc3ViNzg5IHN1YnRyYWN0IC0xICAgICBJbmYgICAtPiAtSW5maW5pdHkKK2Rxc3ViNzkwIHN1YnRyYWN0ICAwICAgICBJbmYgICAtPiAtSW5maW5pdHkKK2Rxc3ViNzkxIHN1YnRyYWN0ICAxICAgICBJbmYgICAtPiAtSW5maW5pdHkKK2Rxc3ViNzkyIHN1YnRyYWN0ICAxMDAwICBJbmYgICAtPiAtSW5maW5pdHkKKworZHFzdWI4MDAgc3VidHJhY3QgIEluZiAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1YjgwMSBzdWJ0cmFjdCAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkcXN1YjgwMiBzdWJ0cmFjdCAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitkcXN1YjgwMyBzdWJ0cmFjdCAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitkcXN1YjgwNCBzdWJ0cmFjdCAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkcXN1YjgwNSBzdWJ0cmFjdCAgSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitkcXN1YjgwNiBzdWJ0cmFjdCAgSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitkcXN1YjgwNyBzdWJ0cmFjdCAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CitkcXN1YjgwOCBzdWJ0cmFjdCAtMTAwMCAtSW5mICAgLT4gIEluZmluaXR5CitkcXN1YjgwOSBzdWJ0cmFjdCAtSW5mICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODEwIHN1YnRyYWN0IC0xICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2Rxc3ViODExIHN1YnRyYWN0IC0wICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2Rxc3ViODEyIHN1YnRyYWN0ICAwICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2Rxc3ViODEzIHN1YnRyYWN0ICAxICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2Rxc3ViODE0IHN1YnRyYWN0ICAxMDAwIC1JbmYgICAtPiAgSW5maW5pdHkKK2Rxc3ViODE1IHN1YnRyYWN0ICBJbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKKworZHFzdWI4MjEgc3VidHJhY3QgIE5hTiAgIEluZiAgIC0+ICBOYU4KK2Rxc3ViODIyIHN1YnRyYWN0IC1OYU4gICAxMDAwICAtPiAtTmFOCitkcXN1YjgyMyBzdWJ0cmFjdCAgTmFOICAgMSAgICAgLT4gIE5hTgorZHFzdWI4MjQgc3VidHJhY3QgIE5hTiAgIDAgICAgIC0+ICBOYU4KK2Rxc3ViODI1IHN1YnRyYWN0ICBOYU4gIC0wICAgICAtPiAgTmFOCitkcXN1YjgyNiBzdWJ0cmFjdCAgTmFOICAtMSAgICAgLT4gIE5hTgorZHFzdWI4Mjcgc3VidHJhY3QgIE5hTiAgLTEwMDAgIC0+ICBOYU4KK2Rxc3ViODI4IHN1YnRyYWN0ICBOYU4gIC1JbmYgICAtPiAgTmFOCitkcXN1YjgyOSBzdWJ0cmFjdCAtTmFOICAgTmFOICAgLT4gLU5hTgorZHFzdWI4MzAgc3VidHJhY3QgLUluZiAgIE5hTiAgIC0+ICBOYU4KK2Rxc3ViODMxIHN1YnRyYWN0IC0xMDAwICBOYU4gICAtPiAgTmFOCitkcXN1YjgzMiBzdWJ0cmFjdCAtMSAgICAgTmFOICAgLT4gIE5hTgorZHFzdWI4MzMgc3VidHJhY3QgLTAgICAgIE5hTiAgIC0+ICBOYU4KK2Rxc3ViODM0IHN1YnRyYWN0ICAwICAgICBOYU4gICAtPiAgTmFOCitkcXN1YjgzNSBzdWJ0cmFjdCAgMSAgICAgTmFOICAgLT4gIE5hTgorZHFzdWI4MzYgc3VidHJhY3QgIDEwMDAgLU5hTiAgIC0+IC1OYU4KK2Rxc3ViODM3IHN1YnRyYWN0ICBJbmYgICBOYU4gICAtPiAgTmFOCisKK2Rxc3ViODQxIHN1YnRyYWN0ICBzTmFOICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4NDIgc3VidHJhY3QgLXNOYU4gIDEwMDAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg0MyBzdWJ0cmFjdCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODQ0IHN1YnRyYWN0ICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4NDUgc3VidHJhY3QgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg0NiBzdWJ0cmFjdCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODQ3IHN1YnRyYWN0ICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4NDggc3VidHJhY3QgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg0OSBzdWJ0cmFjdCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODUwIHN1YnRyYWN0ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4NTEgc3VidHJhY3QgLUluZiAtc05hTiAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg1MiBzdWJ0cmFjdCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODUzIHN1YnRyYWN0IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4NTQgc3VidHJhY3QgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg1NSBzdWJ0cmFjdCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODU2IHN1YnRyYWN0ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4NTcgc3VidHJhY3QgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg1OCBzdWJ0cmFjdCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODU5IHN1YnRyYWN0ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcXN1Yjg2MSBzdWJ0cmFjdCAgTmFOMDEgICAtSW5mICAgICAtPiAgTmFOMQorZHFzdWI4NjIgc3VidHJhY3QgLU5hTjAyICAgLTEwMDAgICAgLT4gLU5hTjIKK2Rxc3ViODYzIHN1YnRyYWN0ICBOYU4wMyAgICAxMDAwICAgIC0+ICBOYU4zCitkcXN1Yjg2NCBzdWJ0cmFjdCAgTmFOMDQgICAgSW5mICAgICAtPiAgTmFONAorZHFzdWI4NjUgc3VidHJhY3QgIE5hTjA1ICAgIE5hTjYxICAgLT4gIE5hTjUKK2Rxc3ViODY2IHN1YnRyYWN0IC1JbmYgICAgIC1OYU43MSAgIC0+IC1OYU43MQorZHFzdWI4Njcgc3VidHJhY3QgLTEwMDAgICAgIE5hTjgxICAgLT4gIE5hTjgxCitkcXN1Yjg2OCBzdWJ0cmFjdCAgMTAwMCAgICAgTmFOOTEgICAtPiAgTmFOOTEKK2Rxc3ViODY5IHN1YnRyYWN0ICBJbmYgICAgICBOYU4xMDEgIC0+ICBOYU4xMDEKK2Rxc3ViODcxIHN1YnRyYWN0ICBzTmFOMDExICAtSW5mICAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODcyIHN1YnRyYWN0ICBzTmFOMDEyICAtMTAwMCAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODczIHN1YnRyYWN0IC1zTmFOMDEzICAgMTAwMCAgIC0+IC1OYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODc0IHN1YnRyYWN0ICBzTmFOMDE0ICAgTmFOMTcxIC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODc1IHN1YnRyYWN0ICBzTmFOMDE1ICBzTmFOMTgxIC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODc2IHN1YnRyYWN0ICBOYU4wMTYgICBzTmFOMTkxIC0+ICBOYU4xOTEgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODc3IHN1YnRyYWN0IC1JbmYgICAgICBzTmFOMjAxIC0+ICBOYU4yMDEgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODc4IHN1YnRyYWN0IC0xMDAwICAgICBzTmFOMjExIC0+ICBOYU4yMTEgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODc5IHN1YnRyYWN0ICAxMDAwICAgIC1zTmFOMjIxIC0+IC1OYU4yMjEgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODgwIHN1YnRyYWN0ICBJbmYgICAgICBzTmFOMjMxIC0+ICBOYU4yMzEgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODgxIHN1YnRyYWN0ICBOYU4wMjUgICBzTmFOMjQxIC0+ICBOYU4yNDEgSW52YWxpZF9vcGVyYXRpb24KKworLS0gZWRnZSBjYXNlIHNwaWxscworZHFzdWI5MDEgc3VidHJhY3QgIDIuRS0zICAxLjAwMiAgLT4gLTEuMDAwCitkcXN1YjkwMiBzdWJ0cmFjdCAgMi4wRS0zICAxLjAwMiAgLT4gLTEuMDAwMAorZHFzdWI5MDMgc3VidHJhY3QgIDIuMDBFLTMgIDEuMDAyMCAgLT4gLTEuMDAwMDAKK2Rxc3ViOTA0IHN1YnRyYWN0ICAyLjAwMEUtMyAgMS4wMDIwMCAgLT4gLTEuMDAwMDAwCitkcXN1YjkwNSBzdWJ0cmFjdCAgMi4wMDAwRS0zICAxLjAwMjAwMCAgLT4gLTEuMDAwMDAwMAorZHFzdWI5MDYgc3VidHJhY3QgIDIuMDAwMDBFLTMgIDEuMDAyMDAwMCAgLT4gLTEuMDAwMDAwMDAKK2Rxc3ViOTA3IHN1YnRyYWN0ICAyLjAwMDAwMEUtMyAgMS4wMDIwMDAwMCAgLT4gLTEuMDAwMDAwMDAwCitkcXN1YjkwOCBzdWJ0cmFjdCAgMi4wMDAwMDAwRS0zICAxLjAwMjAwMDAwMCAgLT4gLTEuMDAwMDAwMDAwMAorCistLSBzdWJub3JtYWxzIGFuZCBvdmVyZmxvd3MgY292ZXJlZCB1bmRlciBBZGQKKworLS0gRXhhbXBsZXMgZnJvbSBTUUwgcHJvcG9zYWwgKEtyaXNobmEgS3Vsa2FybmkpCitkcXN1YjExMjUgIHN1YnRyYWN0IDEzMEUtMiAgMTIwRS0yIC0+IDAuMTAKK2Rxc3ViMTEyNiAgc3VidHJhY3QgMTMwRS0yICAxMkUtMSAgLT4gMC4xMAorZHFzdWIxMTI3ICBzdWJ0cmFjdCAxMzBFLTIgIDFFMCAgICAtPiAwLjMwCitkcXN1YjExMjggIHN1YnRyYWN0IDFFMiAgICAgMUU0ICAgIC0+IC05LjlFKzMKKworLS0gTnVsbCB0ZXN0cworZHFzdWI5OTkwIHN1YnRyYWN0IDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI5OTkxIHN1YnRyYWN0ICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVRvSW50ZWdyYWwuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFUb0ludGVncmFsLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1NWRlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFUb0ludGVncmFsLmRlY1Rlc3QKQEAgLTAsMCArMSwyNTcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFUb0ludGVncmFsLmRlY1Rlc3QgLS0gcm91bmQgUXVhZCB0byBpbnRlZ3JhbCB2YWx1ZSAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyB0ZXN0cyB0aGUgZXh0ZW5kZWQgc3BlY2lmaWNhdGlvbiAncm91bmQtdG8taW50ZWdyYWwKKy0tIHZhbHVlLWV4YWN0JyBvcGVyYXRpb25zIChmcm9tIElFRUUgODU0LCBsYXRlciBtb2RpZmllZCBpbiA3NTRyKS4KKy0tIEFsbCBub24temVybyByZXN1bHRzIGFyZSBkZWZpbmVkIGFzIGJlaW5nIHRob3NlIGZyb20gZWl0aGVyIGNvcHkgb3IKKy0tIHF1YW50aXplLCBzbyB0aG9zZSBhcmUgYXNzdW1lZCB0byBoYXZlIGJlZW4gdGVzdGVkIGV4dGVuc2l2ZWx5CistLSBlbHNld2hlcmU7IHRoZSB0ZXN0cyBoZXJlIGFyZSBmb3IgaW50ZWdyaXR5LCByb3VuZGluZyBtb2RlLCBldGMuCistLSBBbHNvLCBpdCBpcyBhc3N1bWVkIHRoZSB0ZXN0IGhhcm5lc3Mgd2lsbCB1c2UgdGhlc2UgdGVzdHMgZm9yIGJvdGgKKy0tIFRvSW50ZWdyYWxFeGFjdCAod2hpY2ggZG9lcyBzZXQgSW5leGFjdCkgYW5kIHRoZSBmaXhlZC1uYW1lCistLSBmdW5jdGlvbnMgKHdoaWNoIGRvIG5vdCBzZXQgSW5leGFjdCkuCisKKy0tIE5vdGUgdGhhdCBkZWNOdW1iZXIgaW1wbGVtZW50cyBhbiBlYXJsaWVyIGRlZmluaXRpb24gb2YgdG9JbnRlZ3JhbAorLS0gd2hpY2ggbmV2ZXIgc2V0cyBJbmV4YWN0OyB0aGUgZGVjVGVzdCBvcGVyYXRvciBmb3IgdGhhdCBpcyBjYWxsZWQKKy0tICd0b2ludGVncmFsJyBpbnN0ZWFkIG9mICd0b2ludGVncmFseCcuCisKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2RxaW50eDAwMSB0b2ludGVncmFseCAgICAgIDAgICAgIC0+ICAwCitkcWludHgwMDIgdG9pbnRlZ3JhbHggICAgICAwLjAgICAtPiAgMAorZHFpbnR4MDAzIHRvaW50ZWdyYWx4ICAgICAgMC4xICAgLT4gIDAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDA0IHRvaW50ZWdyYWx4ICAgICAgMC4yICAgLT4gIDAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDA1IHRvaW50ZWdyYWx4ICAgICAgMC4zICAgLT4gIDAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDA2IHRvaW50ZWdyYWx4ICAgICAgMC40ICAgLT4gIDAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDA3IHRvaW50ZWdyYWx4ICAgICAgMC41ICAgLT4gIDAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDA4IHRvaW50ZWdyYWx4ICAgICAgMC42ICAgLT4gIDEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDA5IHRvaW50ZWdyYWx4ICAgICAgMC43ICAgLT4gIDEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDEwIHRvaW50ZWdyYWx4ICAgICAgMC44ICAgLT4gIDEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDExIHRvaW50ZWdyYWx4ICAgICAgMC45ICAgLT4gIDEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDEyIHRvaW50ZWdyYWx4ICAgICAgMSAgICAgLT4gIDEKK2RxaW50eDAxMyB0b2ludGVncmFseCAgICAgIDEuMCAgIC0+ICAxICBSb3VuZGVkCitkcWludHgwMTQgdG9pbnRlZ3JhbHggICAgICAxLjEgICAtPiAgMSAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwMTUgdG9pbnRlZ3JhbHggICAgICAxLjIgICAtPiAgMSAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwMTYgdG9pbnRlZ3JhbHggICAgICAxLjMgICAtPiAgMSAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwMTcgdG9pbnRlZ3JhbHggICAgICAxLjQgICAtPiAgMSAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwMTggdG9pbnRlZ3JhbHggICAgICAxLjUgICAtPiAgMiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwMTkgdG9pbnRlZ3JhbHggICAgICAxLjYgICAtPiAgMiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwMjAgdG9pbnRlZ3JhbHggICAgICAxLjcgICAtPiAgMiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwMjEgdG9pbnRlZ3JhbHggICAgICAxLjggICAtPiAgMiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwMjIgdG9pbnRlZ3JhbHggICAgICAxLjkgICAtPiAgMiAgSW5leGFjdCBSb3VuZGVkCistLSBuZWdhdGl2ZXMKK2RxaW50eDAzMSB0b2ludGVncmFseCAgICAgLTAgICAgIC0+IC0wCitkcWludHgwMzIgdG9pbnRlZ3JhbHggICAgIC0wLjAgICAtPiAtMAorZHFpbnR4MDMzIHRvaW50ZWdyYWx4ICAgICAtMC4xICAgLT4gLTAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDM0IHRvaW50ZWdyYWx4ICAgICAtMC4yICAgLT4gLTAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDM1IHRvaW50ZWdyYWx4ICAgICAtMC4zICAgLT4gLTAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDM2IHRvaW50ZWdyYWx4ICAgICAtMC40ICAgLT4gLTAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDM3IHRvaW50ZWdyYWx4ICAgICAtMC41ICAgLT4gLTAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDM4IHRvaW50ZWdyYWx4ICAgICAtMC42ICAgLT4gLTEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDM5IHRvaW50ZWdyYWx4ICAgICAtMC43ICAgLT4gLTEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDQwIHRvaW50ZWdyYWx4ICAgICAtMC44ICAgLT4gLTEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDQxIHRvaW50ZWdyYWx4ICAgICAtMC45ICAgLT4gLTEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDQyIHRvaW50ZWdyYWx4ICAgICAtMSAgICAgLT4gLTEKK2RxaW50eDA0MyB0b2ludGVncmFseCAgICAgLTEuMCAgIC0+IC0xICBSb3VuZGVkCitkcWludHgwNDQgdG9pbnRlZ3JhbHggICAgIC0xLjEgICAtPiAtMSAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwNDUgdG9pbnRlZ3JhbHggICAgIC0xLjIgICAtPiAtMSAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwNDYgdG9pbnRlZ3JhbHggICAgIC0xLjMgICAtPiAtMSAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwNDcgdG9pbnRlZ3JhbHggICAgIC0xLjQgICAtPiAtMSAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwNDggdG9pbnRlZ3JhbHggICAgIC0xLjUgICAtPiAtMiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwNDkgdG9pbnRlZ3JhbHggICAgIC0xLjYgICAtPiAtMiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwNTAgdG9pbnRlZ3JhbHggICAgIC0xLjcgICAtPiAtMiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwNTEgdG9pbnRlZ3JhbHggICAgIC0xLjggICAtPiAtMiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwNTIgdG9pbnRlZ3JhbHggICAgIC0xLjkgICAtPiAtMiAgSW5leGFjdCBSb3VuZGVkCistLSBuZXh0IHR3byB3b3VsZCBiZSBOYU4gdXNpbmcgcXVhbnRpemUoeCwgMCkKK2RxaW50eDA1MyB0b2ludGVncmFseCAgICAxMEUrNjAgIC0+IDEuMEUrNjEKK2RxaW50eDA1NCB0b2ludGVncmFseCAgIC0xMEUrNjAgIC0+IC0xLjBFKzYxCisKKy0tIG51bWJlcnMgYXJvdW5kIHByZWNpc2lvbgorZHFpbnR4MDYwIHRvaW50ZWdyYWx4ICc1NjI2N0UtMTcnICAgLT4gJzAnICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwNjEgdG9pbnRlZ3JhbHggJzU2MjY3RS01JyAgICAtPiAnMScgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDA2MiB0b2ludGVncmFseCAnNTYyNjdFLTInICAgIC0+ICc1NjMnICAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDYzIHRvaW50ZWdyYWx4ICc1NjI2N0UtMScgICAgLT4gJzU2MjcnICAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwNjUgdG9pbnRlZ3JhbHggJzU2MjY3RS0wJyAgICAtPiAnNTYyNjcnCitkcWludHgwNjYgdG9pbnRlZ3JhbHggJzU2MjY3RSswJyAgICAtPiAnNTYyNjcnCitkcWludHgwNjcgdG9pbnRlZ3JhbHggJzU2MjY3RSsxJyAgICAtPiAnNS42MjY3RSs1JworZHFpbnR4MDY4IHRvaW50ZWdyYWx4ICc1NjI2N0UrOScgICAgLT4gJzUuNjI2N0UrMTMnCitkcWludHgwNjkgdG9pbnRlZ3JhbHggJzU2MjY3RSsxMCcgICAtPiAnNS42MjY3RSsxNCcKK2RxaW50eDA3MCB0b2ludGVncmFseCAnNTYyNjdFKzExJyAgIC0+ICc1LjYyNjdFKzE1JworZHFpbnR4MDcxIHRvaW50ZWdyYWx4ICc1NjI2N0UrMTInICAgLT4gJzUuNjI2N0UrMTYnCitkcWludHgwNzIgdG9pbnRlZ3JhbHggJzU2MjY3RSsxMycgICAtPiAnNS42MjY3RSsxNycKK2RxaW50eDA3MyB0b2ludGVncmFseCAnMS4yM0UrOTYnICAgIC0+ICcxLjIzRSs5NicKK2RxaW50eDA3NCB0b2ludGVncmFseCAnMS4yM0UrNjE0NCcgIC0+ICM0N2ZmZDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBDbGFtcGVkCisKK2RxaW50eDA4MCB0b2ludGVncmFseCAnLTU2MjY3RS0xMCcgIC0+ICctMCcgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDA4MSB0b2ludGVncmFseCAnLTU2MjY3RS01JyAgIC0+ICctMScgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDA4MiB0b2ludGVncmFseCAnLTU2MjY3RS0yJyAgIC0+ICctNTYzJyAgICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDA4MyB0b2ludGVncmFseCAnLTU2MjY3RS0xJyAgIC0+ICctNTYyNycgICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDA4NSB0b2ludGVncmFseCAnLTU2MjY3RS0wJyAgIC0+ICctNTYyNjcnCitkcWludHgwODYgdG9pbnRlZ3JhbHggJy01NjI2N0UrMCcgICAtPiAnLTU2MjY3JworZHFpbnR4MDg3IHRvaW50ZWdyYWx4ICctNTYyNjdFKzEnICAgLT4gJy01LjYyNjdFKzUnCitkcWludHgwODggdG9pbnRlZ3JhbHggJy01NjI2N0UrOScgICAtPiAnLTUuNjI2N0UrMTMnCitkcWludHgwODkgdG9pbnRlZ3JhbHggJy01NjI2N0UrMTAnICAtPiAnLTUuNjI2N0UrMTQnCitkcWludHgwOTAgdG9pbnRlZ3JhbHggJy01NjI2N0UrMTEnICAtPiAnLTUuNjI2N0UrMTUnCitkcWludHgwOTEgdG9pbnRlZ3JhbHggJy01NjI2N0UrMTInICAtPiAnLTUuNjI2N0UrMTYnCitkcWludHgwOTIgdG9pbnRlZ3JhbHggJy01NjI2N0UrMTMnICAtPiAnLTUuNjI2N0UrMTcnCitkcWludHgwOTMgdG9pbnRlZ3JhbHggJy0xLjIzRSs5NicgICAtPiAnLTEuMjNFKzk2JworZHFpbnR4MDk0IHRvaW50ZWdyYWx4ICctMS4yM0UrNjE0NCcgLT4gI2M3ZmZkMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKKworLS0gc3Vibm9ybWFsIGlucHV0cworZHFpbnR4MTAwIHRvaW50ZWdyYWx4ICAgICAgICAxRS0yOTkgLT4gMCAgSW5leGFjdCBSb3VuZGVkCitkcWludHgxMDEgdG9pbnRlZ3JhbHggICAgICAwLjFFLTI5OSAtPiAwICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDEwMiB0b2ludGVncmFseCAgICAgMC4wMUUtMjk5IC0+IDAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MTAzIHRvaW50ZWdyYWx4ICAgICAgICAwRS0yOTkgLT4gMAorCistLSBzcGVjaWFscyBhbmQgemVyb3MKK2RxaW50eDEyMCB0b2ludGVncmFseCAnSW5mJyAgICAgICAtPiAgSW5maW5pdHkKK2RxaW50eDEyMSB0b2ludGVncmFseCAnLUluZicgICAgICAtPiAtSW5maW5pdHkKK2RxaW50eDEyMiB0b2ludGVncmFseCAgIE5hTiAgICAgICAtPiAgTmFOCitkcWludHgxMjMgdG9pbnRlZ3JhbHggIHNOYU4gICAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxaW50eDEyNCB0b2ludGVncmFseCAgICAgMCAgICAgICAtPiAgMAorZHFpbnR4MTI1IHRvaW50ZWdyYWx4ICAgIC0wICAgICAgIC0+IC0wCitkcWludHgxMjYgdG9pbnRlZ3JhbHggICAgIDAuMDAwICAgLT4gIDAKK2RxaW50eDEyNyB0b2ludGVncmFseCAgICAgMC4wMCAgICAtPiAgMAorZHFpbnR4MTI4IHRvaW50ZWdyYWx4ICAgICAwLjAgICAgIC0+ICAwCitkcWludHgxMjkgdG9pbnRlZ3JhbHggICAgIDAgICAgICAgLT4gIDAKK2RxaW50eDEzMCB0b2ludGVncmFseCAgICAgMEUtMyAgICAtPiAgMAorZHFpbnR4MTMxIHRvaW50ZWdyYWx4ICAgICAwRS0yICAgIC0+ICAwCitkcWludHgxMzIgdG9pbnRlZ3JhbHggICAgIDBFLTEgICAgLT4gIDAKK2RxaW50eDEzMyB0b2ludGVncmFseCAgICAgMEUtMCAgICAtPiAgMAorZHFpbnR4MTM0IHRvaW50ZWdyYWx4ICAgICAwRSsxICAgIC0+ICAwRSsxCitkcWludHgxMzUgdG9pbnRlZ3JhbHggICAgIDBFKzIgICAgLT4gIDBFKzIKK2RxaW50eDEzNiB0b2ludGVncmFseCAgICAgMEUrMyAgICAtPiAgMEUrMworZHFpbnR4MTM3IHRvaW50ZWdyYWx4ICAgICAwRSs0ICAgIC0+ICAwRSs0CitkcWludHgxMzggdG9pbnRlZ3JhbHggICAgIDBFKzUgICAgLT4gIDBFKzUKK2RxaW50eDEzOSB0b2ludGVncmFseCAgICAtMC4wMDAgICAtPiAtMAorZHFpbnR4MTQwIHRvaW50ZWdyYWx4ICAgIC0wLjAwICAgIC0+IC0wCitkcWludHgxNDEgdG9pbnRlZ3JhbHggICAgLTAuMCAgICAgLT4gLTAKK2RxaW50eDE0MiB0b2ludGVncmFseCAgICAtMCAgICAgICAtPiAtMAorZHFpbnR4MTQzIHRvaW50ZWdyYWx4ICAgIC0wRS0zICAgIC0+IC0wCitkcWludHgxNDQgdG9pbnRlZ3JhbHggICAgLTBFLTIgICAgLT4gLTAKK2RxaW50eDE0NSB0b2ludGVncmFseCAgICAtMEUtMSAgICAtPiAtMAorZHFpbnR4MTQ2IHRvaW50ZWdyYWx4ICAgIC0wRS0wICAgIC0+IC0wCitkcWludHgxNDcgdG9pbnRlZ3JhbHggICAgLTBFKzEgICAgLT4gLTBFKzEKK2RxaW50eDE0OCB0b2ludGVncmFseCAgICAtMEUrMiAgICAtPiAtMEUrMgorZHFpbnR4MTQ5IHRvaW50ZWdyYWx4ICAgIC0wRSszICAgIC0+IC0wRSszCitkcWludHgxNTAgdG9pbnRlZ3JhbHggICAgLTBFKzQgICAgLT4gLTBFKzQKK2RxaW50eDE1MSB0b2ludGVncmFseCAgICAtMEUrNSAgICAtPiAtMEUrNQorLS0gcHJvcGFnYXRpbmcgTmFOcworZHFpbnR4MTUyIHRvaW50ZWdyYWx4ICAgTmFOODA4ICAgIC0+ICBOYU44MDgKK2RxaW50eDE1MyB0b2ludGVncmFseCAgc05hTjA4MCAgICAtPiAgTmFOODAgIEludmFsaWRfb3BlcmF0aW9uCitkcWludHgxNTQgdG9pbnRlZ3JhbHggIC1OYU44MDggICAgLT4gLU5hTjgwOAorZHFpbnR4MTU1IHRvaW50ZWdyYWx4IC1zTmFOMDgwICAgIC0+IC1OYU44MCAgSW52YWxpZF9vcGVyYXRpb24KK2RxaW50eDE1NiB0b2ludGVncmFseCAgLU5hTiAgICAgICAtPiAtTmFOCitkcWludHgxNTcgdG9pbnRlZ3JhbHggLXNOYU4gICAgICAgLT4gLU5hTiAgICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBleGFtcGxlcworcm91bmRpbmc6ICAgIGhhbGZfdXAKK2RxaW50eDIwMCB0b2ludGVncmFseCAgICAgMi4xICAgIC0+IDIgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIwMSB0b2ludGVncmFseCAgIDEwMCAgICAgIC0+IDEwMAorZHFpbnR4MjAyIHRvaW50ZWdyYWx4ICAgMTAwLjAgICAgLT4gMTAwICAgICAgICAgIFJvdW5kZWQKK2RxaW50eDIwMyB0b2ludGVncmFseCAgIDEwMS41ICAgIC0+IDEwMiAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIwNCB0b2ludGVncmFseCAgLTEwMS41ICAgIC0+IC0xMDIgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIwNSB0b2ludGVncmFseCAgIDEwRSs1ICAgIC0+IDEuMEUrNgorZHFpbnR4MjA2IHRvaW50ZWdyYWx4ICA3Ljg5RSs3NyAgLT4gNy44OUUrNzcKK2RxaW50eDIwNyB0b2ludGVncmFseCAgIC1JbmYgICAgIC0+IC1JbmZpbml0eQorCisKKy0tIGFsbCByb3VuZGluZyBtb2Rlcworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorZHFpbnR4MjEwIHRvaW50ZWdyYWx4ICAgICA1NS41ICAgLT4gIDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIxMSB0b2ludGVncmFseCAgICAgNTYuNSAgIC0+ICA1NiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMTIgdG9pbnRlZ3JhbHggICAgIDU3LjUgICAtPiAgNTggIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjEzIHRvaW50ZWdyYWx4ICAgIC01NS41ICAgLT4gLTU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIxNCB0b2ludGVncmFseCAgICAtNTYuNSAgIC0+IC01NiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMTUgdG9pbnRlZ3JhbHggICAgLTU3LjUgICAtPiAtNTggIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgaGFsZl91cAorCitkcWludHgyMjAgdG9pbnRlZ3JhbHggICAgIDU1LjUgICAtPiAgNTYgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjIxIHRvaW50ZWdyYWx4ICAgICA1Ni41ICAgLT4gIDU3ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIyMiB0b2ludGVncmFseCAgICAgNTcuNSAgIC0+ICA1OCAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMjMgdG9pbnRlZ3JhbHggICAgLTU1LjUgICAtPiAtNTYgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjI0IHRvaW50ZWdyYWx4ICAgIC01Ni41ICAgLT4gLTU3ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIyNSB0b2ludGVncmFseCAgICAtNTcuNSAgIC0+IC01OCAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KKworZHFpbnR4MjMwIHRvaW50ZWdyYWx4ICAgICA1NS41ICAgLT4gIDU1ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIzMSB0b2ludGVncmFseCAgICAgNTYuNSAgIC0+ICA1NiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMzIgdG9pbnRlZ3JhbHggICAgIDU3LjUgICAtPiAgNTcgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjMzIHRvaW50ZWdyYWx4ICAgIC01NS41ICAgLT4gLTU1ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIzNCB0b2ludGVncmFseCAgICAtNTYuNSAgIC0+IC01NiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMzUgdG9pbnRlZ3JhbHggICAgLTU3LjUgICAtPiAtNTcgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgdXAKKworZHFpbnR4MjQwIHRvaW50ZWdyYWx4ICAgICA1NS4zICAgLT4gIDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI0MSB0b2ludGVncmFseCAgICAgNTYuMyAgIC0+ICA1NyAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNDIgdG9pbnRlZ3JhbHggICAgIDU3LjMgICAtPiAgNTggIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjQzIHRvaW50ZWdyYWx4ICAgIC01NS4zICAgLT4gLTU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI0NCB0b2ludGVncmFseCAgICAtNTYuMyAgIC0+IC01NyAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNDUgdG9pbnRlZ3JhbHggICAgLTU3LjMgICAtPiAtNTggIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgZG93bgorCitkcWludHgyNTAgdG9pbnRlZ3JhbHggICAgIDU1LjcgICAtPiAgNTUgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjUxIHRvaW50ZWdyYWx4ICAgICA1Ni43ICAgLT4gIDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI1MiB0b2ludGVncmFseCAgICAgNTcuNyAgIC0+ICA1NyAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNTMgdG9pbnRlZ3JhbHggICAgLTU1LjcgICAtPiAtNTUgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjU0IHRvaW50ZWdyYWx4ICAgIC01Ni43ICAgLT4gLTU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI1NSB0b2ludGVncmFseCAgICAtNTcuNyAgIC0+IC01NyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBjZWlsaW5nCisKK2RxaW50eDI2MCB0b2ludGVncmFseCAgICAgNTUuMyAgIC0+ICA1NiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNjEgdG9pbnRlZ3JhbHggICAgIDU2LjMgICAtPiAgNTcgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjYyIHRvaW50ZWdyYWx4ICAgICA1Ny4zICAgLT4gIDU4ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI2MyB0b2ludGVncmFseCAgICAtNTUuMyAgIC0+IC01NSAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNjQgdG9pbnRlZ3JhbHggICAgLTU2LjMgICAtPiAtNTYgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjY1IHRvaW50ZWdyYWx4ICAgIC01Ny4zICAgLT4gLTU3ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGZsb29yCisKK2RxaW50eDI3MCB0b2ludGVncmFseCAgICAgNTUuNyAgIC0+ICA1NSAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNzEgdG9pbnRlZ3JhbHggICAgIDU2LjcgICAtPiAgNTYgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjcyIHRvaW50ZWdyYWx4ICAgICA1Ny43ICAgLT4gIDU3ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI3MyB0b2ludGVncmFseCAgICAtNTUuNyAgIC0+IC01NiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNzQgdG9pbnRlZ3JhbHggICAgLTU2LjcgICAtPiAtNTcgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4Mjc1IHRvaW50ZWdyYWx4ICAgIC01Ny43ICAgLT4gLTU4ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gSW50IGFuZCB1SW50MzIgZWRnZSB2YWx1ZXMgZm9yIHRlc3RpbmcgY29udmVyc2lvbnMKK2RxaW50eDMwMCB0b2ludGVncmFseCAtMjE0NzQ4MzY0NiAgLT4gLTIxNDc0ODM2NDYKK2RxaW50eDMwMSB0b2ludGVncmFseCAtMjE0NzQ4MzY0NyAgLT4gLTIxNDc0ODM2NDcKK2RxaW50eDMwMiB0b2ludGVncmFseCAtMjE0NzQ4MzY0OCAgLT4gLTIxNDc0ODM2NDgKK2RxaW50eDMwMyB0b2ludGVncmFseCAtMjE0NzQ4MzY0OSAgLT4gLTIxNDc0ODM2NDkKK2RxaW50eDMwNCB0b2ludGVncmFseCAgMjE0NzQ4MzY0NiAgLT4gIDIxNDc0ODM2NDYKK2RxaW50eDMwNSB0b2ludGVncmFseCAgMjE0NzQ4MzY0NyAgLT4gIDIxNDc0ODM2NDcKK2RxaW50eDMwNiB0b2ludGVncmFseCAgMjE0NzQ4MzY0OCAgLT4gIDIxNDc0ODM2NDgKK2RxaW50eDMwNyB0b2ludGVncmFseCAgMjE0NzQ4MzY0OSAgLT4gIDIxNDc0ODM2NDkKK2RxaW50eDMwOCB0b2ludGVncmFseCAgNDI5NDk2NzI5NCAgLT4gIDQyOTQ5NjcyOTQKK2RxaW50eDMwOSB0b2ludGVncmFseCAgNDI5NDk2NzI5NSAgLT4gIDQyOTQ5NjcyOTUKK2RxaW50eDMxMCB0b2ludGVncmFseCAgNDI5NDk2NzI5NiAgLT4gIDQyOTQ5NjcyOTYKK2RxaW50eDMxMSB0b2ludGVncmFseCAgNDI5NDk2NzI5NyAgLT4gIDQyOTQ5NjcyOTcKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVhvci5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVhvci5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMTZlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxWG9yLmRlY1Rlc3QKQEAgLTAsMCArMSw0MTAgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFYb3IuZGVjVGVzdCAtLSBkaWdpdHdpc2UgbG9naWNhbCBYT1IgZm9yIGRlY1F1YWRzICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sgKHRydXRoIHRhYmxlKQorZHF4b3IwMDEgeG9yICAgICAgICAgICAgIDAgICAgMCAtPiAgICAwCitkcXhvcjAwMiB4b3IgICAgICAgICAgICAgMCAgICAxIC0+ICAgIDEKK2RxeG9yMDAzIHhvciAgICAgICAgICAgICAxICAgIDAgLT4gICAgMQorZHF4b3IwMDQgeG9yICAgICAgICAgICAgIDEgICAgMSAtPiAgICAwCitkcXhvcjAwNSB4b3IgICAgICAgICAgMTEwMCAxMDEwIC0+ICAxMTAKKy0tIGFuZCBhdCBtc2QgYW5kIG1zZC0xCitkcXhvcjAwNiB4b3IgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCitkcXhvcjAwNyB4b3IgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3IwMDggeG9yIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yMDA5IHhvciAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgIDAKK2RxeG9yMDEwIHhvciAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgIDAKK2RxeG9yMDExIHhvciAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjAxMiB4b3IgMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3IwMTMgeG9yIDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorCistLSBWYXJpb3VzIGxlbmd0aHMKKy0tICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CitkcXhvcjYwMSB4b3IgMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYwMiB4b3IgMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYwMyB4b3IgMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYwNCB4b3IgMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYwNSB4b3IgMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYwNiB4b3IgMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYwNyB4b3IgMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYwOCB4b3IgMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYwOSB4b3IgMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYxMCB4b3IgMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYxMSB4b3IgMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYxMiB4b3IgMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYxMyB4b3IgMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYxNCB4b3IgMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYxNSB4b3IgMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYxNiB4b3IgMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYxNyB4b3IgMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYxOCB4b3IgMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYxOSB4b3IgMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwCitkcXhvcjYyMCB4b3IgMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwCitkcXhvcjYyMSB4b3IgMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwCitkcXhvcjYyMiB4b3IgMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwCitkcXhvcjYyMyB4b3IgMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwCitkcXhvcjYyNCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwCitkcXhvcjYyNSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwCitkcXhvcjYyNiB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwCitkcXhvcjYyNyB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwCitkcXhvcjYyOCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwCitkcXhvcjYyOSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwCitkcXhvcjYzMCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwCitkcXhvcjYzMSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwCitkcXhvcjYzMiB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwCitkcXhvcjYzMyB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCitkcXhvcjYzNCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKK2RxeG9yNjQxIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjQyIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+ICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjQzIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+ICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjQ0IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjQ1IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+ICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjQ2IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+ICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjQ3IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+ICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjQ4IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+ICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjQ5IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+ICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjUwIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTEgIC0+ICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjUxIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTEgIC0+ICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjUyIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTEgIC0+ICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjUzIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTEgIC0+ICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjU0IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTEgIC0+ICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjU1IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTEgIC0+ICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjU2IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTEgIC0+ICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjU3IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTEgIC0+ICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjU4IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTEgIC0+ICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjU5IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTEgIC0+ICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjYwIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTEgIC0+ICAgICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAKK2RxeG9yNjYxIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTEgIC0+ICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAKK2RxeG9yNjYyIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTEgIC0+ICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAKK2RxeG9yNjYzIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTEgIC0+ICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAKK2RxeG9yNjY0IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTEgIC0+ICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAKK2RxeG9yNjY1IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTEgIC0+ICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAKK2RxeG9yNjY2IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTEgIC0+ICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwMDAKK2RxeG9yNjY3IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTEgIC0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMDAKK2RxeG9yNjY4IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTEgIC0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAKK2RxeG9yNjY5IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTEgIC0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAKK2RxeG9yNjcwIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTEgIC0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAKK2RxeG9yNjcxIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTEgIC0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAKK2RxeG9yNjcyIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTEgIC0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAKK2RxeG9yNjczIHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDEgIC0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKK2RxeG9yNjc0IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgIC0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKK2RxeG9yNjc1IHhvciAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxeG9yNjc2IHhvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgIC0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworCitkcXhvcjAyMSB4b3IgMTExMTExMTExMDAwMDAwMCAgICAgMTExMTExMTExMDAwMDAwMCAgLT4gIDAKK2RxeG9yMDIyIHhvciAgMTExMTExMTEwMDAwMDAwICAgICAgMTExMTExMTEwMDAwMDAwICAtPiAgMAorZHF4b3IwMjMgeG9yICAgMTExMTExMTAwMDAwMDAgICAgICAgMTExMTExMTAwMDAwMDAgIC0+ICAwCitkcXhvcjAyNCB4b3IgICAgMTExMTExMDAwMDAwMCAgICAgICAgMTExMTExMDAwMDAwMCAgLT4gIDAKK2RxeG9yMDI1IHhvciAgICAgMTExMTEwMDAwMDAwICAgICAgICAgMTExMTEwMDAwMDAwICAtPiAgMAorZHF4b3IwMjYgeG9yICAgICAgMTExMTAwMDAwMDAgICAgICAgICAgMTExMTAwMDAwMDAgIC0+ICAwCitkcXhvcjAyNyB4b3IgICAgICAgMTExMDAwMDAwMCAgICAgICAgICAgMTExMDAwMDAwMCAgLT4gIDAKK2RxeG9yMDI4IHhvciAgICAgICAgMTEwMDAwMDAwICAgICAgICAgICAgMTEwMDAwMDAwICAtPiAgMAorZHF4b3IwMjkgeG9yICAgICAgICAgMTAwMDAwMDAgICAgICAgICAgICAgMTAwMDAwMDAgIC0+ICAwCitkcXhvcjAzMCB4b3IgICAgICAgICAgMTAwMDAwMCAgICAgICAgICAgICAgMTAwMDAwMCAgLT4gIDAKK2RxeG9yMDMxIHhvciAgICAgICAgICAgMTAwMDAwICAgICAgICAgICAgICAgMTAwMDAwICAtPiAgMAorZHF4b3IwMzIgeG9yICAgICAgICAgICAgMTAwMDAgICAgICAgICAgICAgICAgMTAwMDAgIC0+ICAwCitkcXhvcjAzMyB4b3IgICAgICAgICAgICAgMTAwMCAgICAgICAgICAgICAgICAgMTAwMCAgLT4gIDAKK2RxeG9yMDM0IHhvciAgICAgICAgICAgICAgMTAwICAgICAgICAgICAgICAgICAgMTAwICAtPiAgMAorZHF4b3IwMzUgeG9yICAgICAgICAgICAgICAgMTAgICAgICAgICAgICAgICAgICAgMTAgIC0+ICAwCitkcXhvcjAzNiB4b3IgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgMSAgLT4gIDAKKworZHF4b3IwNDAgeG9yIDExMTExMTExMSAgMTExMTExMTExMTExICAtPiAgMTExMDAwMDAwMDAwCitkcXhvcjA0MSB4b3IgIDExMTExMTExICAxMTExMTExMTExMTEgIC0+ICAxMTExMDAwMDAwMDAKK2RxeG9yMDQyIHhvciAgMTExMTExMTEgICAgIDExMTExMTExMSAgLT4gIDEwMDAwMDAwMAorZHF4b3IwNDMgeG9yICAgMTExMTExMSAgICAgMTAwMDAwMDEwICAtPiAgMTAxMTExMTAxCitkcXhvcjA0NCB4b3IgICAgMTExMTExICAgICAxMDAwMDAxMDAgIC0+ICAxMDAxMTEwMTEKK2RxeG9yMDQ1IHhvciAgICAgMTExMTEgICAgIDEwMDAwMTAwMCAgLT4gIDEwMDAxMDExMQorZHF4b3IwNDYgeG9yICAgICAgMTExMSAgICAgMTAwMDEwMDAwICAtPiAgMTAwMDExMTExCitkcXhvcjA0NyB4b3IgICAgICAgMTExICAgICAxMDAxMDAwMDAgIC0+ICAxMDAxMDAxMTEKK2RxeG9yMDQ4IHhvciAgICAgICAgMTEgICAgIDEwMTAwMDAwMCAgLT4gIDEwMTAwMDAxMQorZHF4b3IwNDkgeG9yICAgICAgICAgMSAgICAgMTEwMDAwMDAwICAtPiAgMTEwMDAwMDAxCisKK2RxeG9yMDUwIHhvciAxMTExMTExMTExICAxICAtPiAgMTExMTExMTExMAorZHF4b3IwNTEgeG9yICAxMTExMTExMTEgIDEgIC0+ICAxMTExMTExMTAKK2RxeG9yMDUyIHhvciAgIDExMTExMTExICAxICAtPiAgMTExMTExMTAKK2RxeG9yMDUzIHhvciAgICAxMTExMTExICAxICAtPiAgMTExMTExMAorZHF4b3IwNTQgeG9yICAgICAxMTExMTEgIDEgIC0+ICAxMTExMTAKK2RxeG9yMDU1IHhvciAgICAgIDExMTExICAxICAtPiAgMTExMTAKK2RxeG9yMDU2IHhvciAgICAgICAxMTExICAxICAtPiAgMTExMAorZHF4b3IwNTcgeG9yICAgICAgICAxMTEgIDEgIC0+ICAxMTAKK2RxeG9yMDU4IHhvciAgICAgICAgIDExICAxICAtPiAgMTAKK2RxeG9yMDU5IHhvciAgICAgICAgICAxICAxICAtPiAgMAorCitkcXhvcjA2MCB4b3IgMTExMTExMTExMSAgMCAgLT4gIDExMTExMTExMTEKK2RxeG9yMDYxIHhvciAgMTExMTExMTExICAwICAtPiAgMTExMTExMTExCitkcXhvcjA2MiB4b3IgICAxMTExMTExMSAgMCAgLT4gIDExMTExMTExCitkcXhvcjA2MyB4b3IgICAgMTExMTExMSAgMCAgLT4gIDExMTExMTEKK2RxeG9yMDY0IHhvciAgICAgMTExMTExICAwICAtPiAgMTExMTExCitkcXhvcjA2NSB4b3IgICAgICAxMTExMSAgMCAgLT4gIDExMTExCitkcXhvcjA2NiB4b3IgICAgICAgMTExMSAgMCAgLT4gIDExMTEKK2RxeG9yMDY3IHhvciAgICAgICAgMTExICAwICAtPiAgMTExCitkcXhvcjA2OCB4b3IgICAgICAgICAxMSAgMCAgLT4gIDExCitkcXhvcjA2OSB4b3IgICAgICAgICAgMSAgMCAgLT4gIDEKKworZHF4b3IwNzAgeG9yIDEgIDExMTExMTExMTEgIC0+ICAxMTExMTExMTEwCitkcXhvcjA3MSB4b3IgMSAgIDExMTExMTExMSAgLT4gIDExMTExMTExMAorZHF4b3IwNzIgeG9yIDEgICAgMTExMTExMTEgIC0+ICAxMTExMTExMAorZHF4b3IwNzMgeG9yIDEgICAgIDExMTExMTEgIC0+ICAxMTExMTEwCitkcXhvcjA3NCB4b3IgMSAgICAgIDExMTExMSAgLT4gIDExMTExMAorZHF4b3IwNzUgeG9yIDEgICAgICAgMTExMTEgIC0+ICAxMTExMAorZHF4b3IwNzYgeG9yIDEgICAgICAgIDExMTEgIC0+ICAxMTEwCitkcXhvcjA3NyB4b3IgMSAgICAgICAgIDExMSAgLT4gIDExMAorZHF4b3IwNzggeG9yIDEgICAgICAgICAgMTEgIC0+ICAxMAorZHF4b3IwNzkgeG9yIDEgICAgICAgICAgIDEgIC0+ICAwCisKK2RxeG9yMDgwIHhvciAwICAxMTExMTExMTExICAtPiAgMTExMTExMTExMQorZHF4b3IwODEgeG9yIDAgICAxMTExMTExMTEgIC0+ICAxMTExMTExMTEKK2RxeG9yMDgyIHhvciAwICAgIDExMTExMTExICAtPiAgMTExMTExMTEKK2RxeG9yMDgzIHhvciAwICAgICAxMTExMTExICAtPiAgMTExMTExMQorZHF4b3IwODQgeG9yIDAgICAgICAxMTExMTEgIC0+ICAxMTExMTEKK2RxeG9yMDg1IHhvciAwICAgICAgIDExMTExICAtPiAgMTExMTEKK2RxeG9yMDg2IHhvciAwICAgICAgICAxMTExICAtPiAgMTExMQorZHF4b3IwODcgeG9yIDAgICAgICAgICAxMTEgIC0+ICAxMTEKK2RxeG9yMDg4IHhvciAwICAgICAgICAgIDExICAtPiAgMTEKK2RxeG9yMDg5IHhvciAwICAgICAgICAgICAxICAtPiAgMQorCitkcXhvcjA5MCB4b3IgMDExMTExMTExICAxMTExMDExMTEgIC0+ICAxMDAwMTAwMDAKK2RxeG9yMDkxIHhvciAxMDExMTExMTEgIDExMTEwMTExMSAgLT4gICAxMDAxMDAwMAorZHF4b3IwOTIgeG9yIDExMDExMTExMSAgMTExMTAxMTExICAtPiAgICAxMDEwMDAwCitkcXhvcjA5MyB4b3IgMTExMDExMTExICAxMTExMDExMTEgIC0+ICAgICAxMTAwMDAKK2RxeG9yMDk0IHhvciAxMTExMDExMTEgIDExMTEwMTExMSAgLT4gICAgICAgICAgMAorZHF4b3IwOTUgeG9yIDExMTExMDExMSAgMTExMTAxMTExICAtPiAgICAgIDExMDAwCitkcXhvcjA5NiB4b3IgMTExMTExMDExICAxMTExMDExMTEgIC0+ICAgICAgMTAxMDAKK2RxeG9yMDk3IHhvciAxMTExMTExMDEgIDExMTEwMTExMSAgLT4gICAgICAxMDAxMAorZHF4b3IwOTggeG9yIDExMTExMTExMCAgMTExMTAxMTExICAtPiAgICAgIDEwMDAxCisKK2RxeG9yMTAwIHhvciAxMTExMDExMTEgIDAxMTExMTExMSAgLT4gIDEwMDAxMDAwMAorZHF4b3IxMDEgeG9yIDExMTEwMTExMSAgMTAxMTExMTExICAtPiAgIDEwMDEwMDAwCitkcXhvcjEwMiB4b3IgMTExMTAxMTExICAxMTAxMTExMTEgIC0+ICAgIDEwMTAwMDAKK2RxeG9yMTAzIHhvciAxMTExMDExMTEgIDExMTAxMTExMSAgLT4gICAgIDExMDAwMAorZHF4b3IxMDQgeG9yIDExMTEwMTExMSAgMTExMTAxMTExICAtPiAgICAgICAgICAwCitkcXhvcjEwNSB4b3IgMTExMTAxMTExICAxMTExMTAxMTEgIC0+ICAgICAgMTEwMDAKK2RxeG9yMTA2IHhvciAxMTExMDExMTEgIDExMTExMTAxMSAgLT4gICAgICAxMDEwMAorZHF4b3IxMDcgeG9yIDExMTEwMTExMSAgMTExMTExMTAxICAtPiAgICAgIDEwMDEwCitkcXhvcjEwOCB4b3IgMTExMTAxMTExICAxMTExMTExMTAgIC0+ICAgICAgMTAwMDEKKworLS0gbm9uLTAvMSBzaG91bGQgbm90IGJlIGFjY2VwdGVkLCBub3Igc2hvdWxkIHNpZ25zCitkcXhvcjIyMCB4b3IgMTExMTExMTEyICAxMTExMTExMTEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjIxIHhvciAzMzMzMzMzMzMgIDMzMzMzMzMzMyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyMjIgeG9yIDU1NTU1NTU1NSAgNTU1NTU1NTU1ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjIyMyB4b3IgNzc3Nzc3Nzc3ICA3Nzc3Nzc3NzcgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjI0IHhvciA5OTk5OTk5OTkgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyMjUgeG9yIDIyMjIyMjIyMiAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjIyNiB4b3IgNDQ0NDQ0NDQ0ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjI3IHhvciA2NjY2NjY2NjYgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyMjggeG9yIDg4ODg4ODg4OCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjIyOSB4b3IgOTk5OTk5OTk5ICAyMjIyMjIyMjIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjMwIHhvciA5OTk5OTk5OTkgIDQ0NDQ0NDQ0NCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyMzEgeG9yIDk5OTk5OTk5OSAgNjY2NjY2NjY2ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjIzMiB4b3IgOTk5OTk5OTk5ICA4ODg4ODg4ODggIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGEgZmV3IHJhbmRvbXMKK2RxeG9yMjQwIHhvciAgNTY3NDY4Njg5IC05MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNDEgeG9yICA1NjczNjc2ODkgIDkzNDk4MTk0MiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI0MiB4b3IgLTYzMTkxNzc3MiAtNzA2MDE0NjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjQzIHhvciAtNzU2MjUzMjU3ICAxMzg1NzkyMzQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNDQgeG9yICA4MzU1OTAxNDkgIDU2NzQzNTQwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRAorZHF4b3IyNTAgeG9yICAyMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNTEgeG9yICA3MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNTIgeG9yICA4MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNTMgeG9yICA5MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNTQgeG9yICAyMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNTUgeG9yICA3MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNTYgeG9yICA4MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNTcgeG9yICA5MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNTggeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDIwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNTkgeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDcwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNjAgeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDgwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNjEgeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDkwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNjIgeG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDIwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNjMgeG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDcwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNjQgeG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDgwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNjUgeG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDkwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QtMQorZHF4b3IyNzAgeG9yICAwMjAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTExMDAwMDAwMDAwMTAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNzEgeG9yICAwNzAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMTAwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNzIgeG9yICAwODAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNzMgeG9yICAwOTAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNzQgeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMTAwMDAwIDAyMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNzUgeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDEwMDAwIDA3MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNzYgeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAxMDAwIDA4MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNzcgeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMTAwIDA5MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBMU0QKK2RxeG9yMjgwIHhvciAgMDAxMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMiAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjgxIHhvciAgMDAwMTAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwNyAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDExIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjgyIHhvciAgMDAwMDAwMDExMTAwMDExMTAwMDExMTEwMDAwMDAwMDAwOCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDEwMDAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjgzIHhvciAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAxMDAwMDAwMDAwOSAxMDAwMDAwMTExMDAwMTExMDAwMTExMTAwMDAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjg0IHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMDAwMCAwMDAxMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjg1IHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAwMCAwMDEwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDA3IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjg2IHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDAwMDAwMCAwMTAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDA4IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjg3IHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDA5IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTWlkZGllCitkcXhvcjI4OCB4b3IgIDAwMTAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMjAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI4OSB4b3IgIDAwMDEwMDAxMTEwMDAxMTEwMDAxMTEwMDAwNzAwMDAwMDEgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI5MCB4b3IgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTExMDAwODAwMDAwMTAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI5MSB4b3IgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMTAwOTAwMDAxMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI5MiB4b3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDEwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAyMDEwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI5MyB4b3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMTAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDA3MDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI5NCB4b3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAxMDAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDA4MDAwMTAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI5NSB4b3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDA5MDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBzaWducworZHF4b3IyOTYgeG9yIC0xMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIC0wMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjk3IHhvciAtMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAgMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI5OCB4b3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgLTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyOTkgeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwICAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDExMDAwMTAwIC0+ICAxMDAwMDAxMDAxMDAxMDAxMDAxMDAxMDAwMDEwMDAwMTAwCisKKy0tIE5tYXgsIE5taW4sIE50aW55LWxpa2UKK2RxeG9yMzMxIHhvciAgMiAgIDkuOTk5OTk5OTlFKzk5OSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjMzMiB4b3IgIDMgICAxRS05OTkgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzMzMgeG9yICA0ICAgMS4wMDAwMDAwMEUtMjgyMSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzM0IHhvciAgNSAgIDFFLTkwMCAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjMzNSB4b3IgIDYgICAtMUUtOTAwICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzMzYgeG9yICA3ICAgLTEuMDAwMDAwMDBFLTk5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzM3IHhvciAgOCAgIC0xRS05OTkgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjMzOCB4b3IgIDkgICAtOS45OTk5OTk5OUUrOTk5ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzNDEgeG9yICA5Ljk5OTk5OTk5RSs5OTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzQyIHhvciAgMUUtOTk5ICAgICAgICAgICAgICAgMDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM0MyB4b3IgIDEuMDAwMDAwMDBFLTk5OSAgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzNDQgeG9yICAxRS05MDggICAgICAgICAgICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzQ1IHhvciAgLTFFLTkwNyAgICAgICAgICAgICAtMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM0NiB4b3IgIC0xLjAwMDAwMDAwRS05OTkgICAgIDE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzNDcgeG9yICAtMUUtOTk5ICAgICAgICAgICAgICAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzQ4IHhvciAgLTkuOTk5OTk5OTlFKzI5OTEgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEEgZmV3IG90aGVyIG5vbi1pbnRlZ2VycworZHF4b3IzNjEgeG9yICAxLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzYyIHhvciAgMUUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM2MyB4b3IgIDAuMCAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzNjQgeG9yICAwRSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzY1IHhvciAgOS45ICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM2NiB4b3IgIDlFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzNzEgeG9yICAwIDEuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzcyIHhvciAgMCAxRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM3MyB4b3IgIDAgMC4wICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzNzQgeG9yICAwIDBFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzc1IHhvciAgMCA5LjkgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM3NiB4b3IgIDAgOUUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBbGwgU3BlY2lhbHMgYXJlIGluIGVycm9yCitkcXhvcjc4MCB4b3IgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I3ODEgeG9yIC1JbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yNzgyIHhvciAtSW5mICAtMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjc4MyB4b3IgLUluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I3ODQgeG9yIC1JbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yNzg1IHhvciAtSW5mICAgMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjc4NiB4b3IgLUluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I3ODcgeG9yIC0xMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yNzg4IHhvciAtSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjc4OSB4b3IgLTEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I3OTAgeG9yIC0wICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yNzkxIHhvciAgMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjc5MiB4b3IgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I3OTMgeG9yICAxMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yNzk0IHhvciAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RxeG9yODAwIHhvciAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgwMSB4b3IgIEluZiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MDIgeG9yICBJbmYgIC0xICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODAzIHhvciAgSW5mICAtMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgwNCB4b3IgIEluZiAgIDAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MDUgeG9yICBJbmYgICAxICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODA2IHhvciAgSW5mICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgwNyB4b3IgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MDggeG9yIC0xMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODA5IHhvciAtSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgxMCB4b3IgLTEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MTEgeG9yIC0wICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODEyIHhvciAgMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgxMyB4b3IgIDEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MTQgeG9yICAxMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODE1IHhvciAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RxeG9yODIxIHhvciAgTmFOIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgyMiB4b3IgIE5hTiAtMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MjMgeG9yICBOYU4gLTEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODI0IHhvciAgTmFOIC0wICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgyNSB4b3IgIE5hTiAgMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MjYgeG9yICBOYU4gIDEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODI3IHhvciAgTmFOICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgyOCB4b3IgIE5hTiAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MjkgeG9yICBOYU4gIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODMwIHhvciAtSW5mICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgzMSB4b3IgLTEwMDAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MzIgeG9yIC0xICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODMzIHhvciAtMCAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgzNCB4b3IgIDAgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MzUgeG9yICAxICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODM2IHhvciAgMTAwMCBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgzNyB4b3IgIEluZiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcXhvcjg0MSB4b3IgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg0MiB4b3IgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg0MyB4b3IgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg0NCB4b3IgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg0NSB4b3IgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg0NiB4b3IgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg0NyB4b3IgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg0OCB4b3IgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg0OSB4b3IgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg1MCB4b3IgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg1MSB4b3IgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg1MiB4b3IgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg1MyB4b3IgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg1NCB4b3IgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg1NSB4b3IgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg1NiB4b3IgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg1NyB4b3IgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg1OCB4b3IgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg1OSB4b3IgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxeG9yODYxIHhvciAgTmFOMSAgIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg2MiB4b3IgK05hTjIgICAtMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NjMgeG9yICBOYU4zICAgIDEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODY0IHhvciAgTmFONCAgICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg2NSB4b3IgIE5hTjUgICArTmFONiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NjYgeG9yIC1JbmYgICAgIE5hTjcgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODY3IHhvciAtMTAwMCAgICBOYU44ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg2OCB4b3IgIDEwMDAgICAgTmFOOSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NjkgeG9yICBJbmYgICAgK05hTjEwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODcxIHhvciAgc05hTjExICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg3MiB4b3IgIHNOYU4xMiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NzMgeG9yICBzTmFOMTMgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODc0IHhvciAgc05hTjE0ICAgTmFOMTcgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg3NSB4b3IgIHNOYU4xNSAgc05hTjE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NzYgeG9yICBOYU4xNiAgIHNOYU4xOSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODc3IHhvciAtSW5mICAgICtzTmFOMjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg3OCB4b3IgLTEwMDAgICAgc05hTjIxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NzkgeG9yICAxMDAwICAgIHNOYU4yMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODgwIHhvciAgSW5mICAgICBzTmFOMjMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg4MSB4b3IgK05hTjI1ICArc05hTjI0IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4ODIgeG9yIC1OYU4yNiAgICBOYU4yOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODgzIHhvciAtc05hTjI3ICBzTmFOMjkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg4NCB4b3IgIDEwMDAgICAgLU5hTjMwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4ODUgeG9yICAxMDAwICAgLXNOYU4zMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHNCYXNlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RzQmFzZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNWU1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RzQmFzZS5kZWNUZXN0CkBAIC0wLDAgKzEsMTA2MiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkc0Jhc2UuZGVjVGVzdCAtLSBiYXNlIGRlY1NpbmdsZSA8LS0+IHN0cmluZyBjb252ZXJzaW9ucyAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgZmlsZSB0ZXN0cyBiYXNlIGNvbnZlcnNpb25zIGZyb20gc3RyaW5nIHRvIGEgZGVjaW1hbCBudW1iZXIKKy0tIGFuZCBiYWNrIHRvIGEgc3RyaW5nIChpbiBTY2llbnRpZmljIGZvcm0pCisKKy0tIE5vdGUgdGhhdCB1bmxpa2Ugb3RoZXIgb3BlcmF0aW9ucyB0aGUgb3BlcmFuZCBpcyBzdWJqZWN0IHRvIHJvdW5kaW5nCistLSB0byBjb25mb3JtIHRvIGVtYXggYW5kIHByZWNpc2lvbiBzZXR0aW5ncyAodGhhdCBpcywgbnVtYmVycyB3aWxsCistLSBjb25mb3JtIHRvIHJ1bGVzIGFuZCBleHBvbmVudCB3aWxsIGJlIGluIHBlcm1pdHRlZCByYW5nZSkuICBUaGUKKy0tICdsZWZ0IGhhbmQgc2lkZScsIHRoZXJlZm9yZSwgbWF5IGhhdmUgbnVtYmVycyB0aGF0IGNhbm5vdCBiZQorLS0gcmVwcmVzZW50ZWQgaW4gYSBkZWNTaW5nbGUuICBTb21lIHRlc3RjYXNlcyBnbyB0byB0aGUgbGltaXQgb2YgdGhlCistLSBuZXh0LXdpZGVyIGZvcm1hdCwgYW5kIGhlbmNlIHRoZXNlIHRlc3RjYXNlcyBtYXkgYWxzbyBiZSB1c2VkIHRvCistLSB0ZXN0IG5hcnJvd2luZyBhbmQgd2lkZW5pbmcgb3BlcmF0aW9ucy4KKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgNworbWF4RXhwb25lbnQ6IDk2CittaW5FeHBvbmVudDogLTk1Cityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2RzYmFzMDAxIHRvU2NpICAgICAgIDAgLT4gMAorZHNiYXMwMDIgdG9TY2kgICAgICAgMSAtPiAxCitkc2JhczAwMyB0b1NjaSAgICAgMS4wIC0+IDEuMAorZHNiYXMwMDQgdG9TY2kgICAgMS4wMCAtPiAxLjAwCitkc2JhczAwNSB0b1NjaSAgICAgIDEwIC0+IDEwCitkc2JhczAwNiB0b1NjaSAgICAxMDAwIC0+IDEwMDAKK2RzYmFzMDA3IHRvU2NpICAgIDEwLjAgLT4gMTAuMAorZHNiYXMwMDggdG9TY2kgICAgMTAuMSAtPiAxMC4xCitkc2JhczAwOSB0b1NjaSAgICAxMC40IC0+IDEwLjQKK2RzYmFzMDEwIHRvU2NpICAgIDEwLjUgLT4gMTAuNQorZHNiYXMwMTEgdG9TY2kgICAgMTAuNiAtPiAxMC42Citkc2JhczAxMiB0b1NjaSAgICAxMC45IC0+IDEwLjkKK2RzYmFzMDEzIHRvU2NpICAgIDExLjAgLT4gMTEuMAorZHNiYXMwMTQgdG9TY2kgIDEuMjM0IC0+IDEuMjM0Citkc2JhczAxNSB0b1NjaSAgMC4xMjMgLT4gMC4xMjMKK2RzYmFzMDE2IHRvU2NpICAwLjAxMiAtPiAwLjAxMgorZHNiYXMwMTcgdG9TY2kgIC0wICAgIC0+IC0wCitkc2JhczAxOCB0b1NjaSAgLTAuMCAgLT4gLTAuMAorZHNiYXMwMTkgdG9TY2kgLTAwLjAwIC0+IC0wLjAwCisKK2RzYmFzMDIxIHRvU2NpICAgICAtMSAtPiAtMQorZHNiYXMwMjIgdG9TY2kgICAtMS4wIC0+IC0xLjAKK2RzYmFzMDIzIHRvU2NpICAgLTAuMSAtPiAtMC4xCitkc2JhczAyNCB0b1NjaSAgIC05LjEgLT4gLTkuMQorZHNiYXMwMjUgdG9TY2kgICAtOS4xMSAtPiAtOS4xMQorZHNiYXMwMjYgdG9TY2kgICAtOS4xMTkgLT4gLTkuMTE5Citkc2JhczAyNyB0b1NjaSAgIC05Ljk5OSAtPiAtOS45OTkKKworZHNiYXMwMzAgdG9TY2kgICcxMjM0LjU2NycgICAtPiAnMTIzNC41NjcnCitkc2JhczAzMSB0b1NjaSAgJzEyMzQuMDAwJyAgIC0+ICcxMjM0LjAwMCcKK2RzYmFzMDMyIHRvU2NpICAgJzEyMzQ5MTInICAgLT4gJzEyMzQ5MTInCitkc2JhczAzMyB0b1NjaSAgICcwLjAwMDAxMjM0NTY3JyAgIC0+ICcwLjAwMDAxMjM0NTY3JworZHNiYXMwMzQgdG9TY2kgICcwLjAwMDAwMTIzNDU2NycgICAtPiAnMC4wMDAwMDEyMzQ1NjcnCitkc2JhczAzNSB0b1NjaSAnMC4wMDAwMDAxMjM0NTY3JyAgIC0+ICcxLjIzNDU2N0UtNycKK2RzYmFzMDM2IHRvU2NpICcwLjAwMDAwMDAxMjM0NTY3JyAgLT4gJzEuMjM0NTY3RS04JworCitkc2JhczAzNyB0b1NjaSAnMC4xMjM0NTY0JyAgIC0+ICcwLjEyMzQ1NjQnCitkc2JhczAzOCB0b1NjaSAnMC4xMjM0NTY1JyAgIC0+ICcwLjEyMzQ1NjUnCisKKy0tIHRlc3QgZmluaXRlIGJvdW5kcyAoTmVncyBvZiwgdGhlbiAwLCBOdGlueSwgTm1pbiwgb3RoZXIsIE5tYXgpCitkc2JzbjAwMSB0b1NjaSAtOS45OTk5OTlFKzk2IC0+IC05Ljk5OTk5OUUrOTYKK2RzYnNuMDAyIHRvU2NpIC0xRS05NSAtPiAtMUUtOTUKK2RzYnNuMDAzIHRvU2NpIC0xRS0xMDEgLT4gLTFFLTEwMSBTdWJub3JtYWwKK2RzYnNuMDA0IHRvU2NpIC0wIC0+IC0wCitkc2JzbjAwNSB0b1NjaSArMCAtPiAgMAorZHNic24wMDYgdG9TY2kgKzFFLTEwMSAtPiAgMUUtMTAxIFN1Ym5vcm1hbAorZHNic24wMDcgdG9TY2kgKzFFLTk1IC0+ICAxRS05NQorZHNic24wMDggdG9TY2kgKzkuOTk5OTk5RSs5NiAtPiAgOS45OTk5OTlFKzk2CisKKy0tIFN0cmluZyBbbWFueSBtb3JlIGV4YW1wbGVzIGFyZSBpbXBsaWNpdGx5IHRlc3RlZCBlbHNld2hlcmVdCistLSBzdHJpbmdzIHdpdGhvdXQgRSBjYW5ub3QgZ2VuZXJhdGUgRSBpbiByZXN1bHQKK2RzYmFzMDQwIHRvU2NpICIxMiIgICAgICAgIC0+ICcxMicKK2RzYmFzMDQxIHRvU2NpICItNzYiICAgICAgIC0+ICctNzYnCitkc2JhczA0MiB0b1NjaSAiMTIuNzYiICAgICAtPiAnMTIuNzYnCitkc2JhczA0MyB0b1NjaSAiKzEyLjc2IiAgICAtPiAnMTIuNzYnCitkc2JhczA0NCB0b1NjaSAiMDEyLjc2IiAgICAtPiAnMTIuNzYnCitkc2JhczA0NSB0b1NjaSAiKzAuMDAzIiAgICAtPiAnMC4wMDMnCitkc2JhczA0NiB0b1NjaSAiMTcuIiAgICAgICAtPiAnMTcnCitkc2JhczA0NyB0b1NjaSAiLjUiICAgICAgICAtPiAnMC41JworZHNiYXMwNDggdG9TY2kgIjA0NCIgICAgICAgLT4gJzQ0JworZHNiYXMwNDkgdG9TY2kgIjAwNDQiICAgICAgLT4gJzQ0JworZHNiYXMwNTAgdG9TY2kgIjAuMDAwNSIgICAgICAtPiAnMC4wMDA1JworZHNiYXMwNTEgdG9TY2kgIjAwLjAwMDA1IiAgICAtPiAnMC4wMDAwNScKK2RzYmFzMDUyIHRvU2NpICIwLjAwMDAwNSIgICAgLT4gJzAuMDAwMDA1JworZHNiYXMwNTMgdG9TY2kgIjAuMDAwMDA1MCIgICAtPiAnMC4wMDAwMDUwJworZHNiYXMwNTQgdG9TY2kgIjAuMDAwMDAwNSIgICAtPiAnNUUtNycKK2RzYmFzMDU1IHRvU2NpICIwLjAwMDAwMDA1IiAgLT4gJzVFLTgnCitkc2JhczA1NiB0b1NjaSAiMTI2NzguNTQiIC0+ICcxMjY3OC41NCcKK2RzYmFzMDU3IHRvU2NpICIyNjc4LjU0MyIgLT4gJzI2NzguNTQzJworZHNiYXMwNTggdG9TY2kgIjM0NTY3OC41IiAtPiAnMzQ1Njc4LjUnCitkc2JhczA1OSB0b1NjaSAiMDY3OC41NDMyIiAtPiAnNjc4LjU0MzInCitkc2JhczA2MCB0b1NjaSAiNjc4LjU0MzIiIC0+ICc2NzguNTQzMicKK2RzYmFzMDYxIHRvU2NpICIrNjc4LjU0MzIiIC0+ICc2NzguNTQzMicKK2RzYmFzMDYyIHRvU2NpICIrMDY3OC41NDMyIiAtPiAnNjc4LjU0MzInCitkc2JhczA2MyB0b1NjaSAiKzAwNjc4LjU0MzIiIC0+ICc2NzguNTQzMicKK2RzYmFzMDY0IHRvU2NpICItNjc4LjU0MzIiICAtPiAnLTY3OC41NDMyJworZHNiYXMwNjUgdG9TY2kgIi0wNjc4LjU0MzIiICAtPiAnLTY3OC41NDMyJworZHNiYXMwNjYgdG9TY2kgIi0wMDY3OC41NDMyIiAgLT4gJy02NzguNTQzMicKKy0tIGV4YW1wbGVzCitkc2JhczA2NyB0b1NjaSAiNUUtNiIgICAgICAgIC0+ICcwLjAwMDAwNScKK2RzYmFzMDY4IHRvU2NpICI1MEUtNyIgICAgICAgLT4gJzAuMDAwMDA1MCcKK2RzYmFzMDY5IHRvU2NpICI1RS03IiAgICAgICAgLT4gJzVFLTcnCisKKy0tIFtObyBleG90aWNzIGFzIG5vIFVuaWNvZGVdCisKKy0tIHJvdW5kZWQgd2l0aCBkb3RzIGluIGFsbCAoaW5jbHVkaW5nIGVkZ2UpIHBsYWNlcworZHNiYXMwNzEgdG9TY2kgIC4xMjM0NTY3ODkwMTIzNDU2ICAtPiAwLjEyMzQ1NjggSW5leGFjdCBSb3VuZGVkCitkc2JhczA3MiB0b1NjaSAgMS4yMzQ1Njc4OTAxMjM0NTYgIC0+IDEuMjM0NTY4IEluZXhhY3QgUm91bmRlZAorZHNiYXMwNzMgdG9TY2kgIDEyLjM0NTY3ODkwMTIzNDU2ICAtPiAxMi4zNDU2OCBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMDc0IHRvU2NpICAxMjMuNDU2Nzg5MDEyMzQ1NiAgLT4gMTIzLjQ1NjggSW5leGFjdCBSb3VuZGVkCitkc2JhczA3NSB0b1NjaSAgMTIzNC41Njc4OTAxMjM0NTYgIC0+IDEyMzQuNTY4IEluZXhhY3QgUm91bmRlZAorZHNiYXMwNzYgdG9TY2kgIDEyMzQ1LjY3ODkwMTIzNDU2ICAtPiAxMjM0NS42OCBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMDc3IHRvU2NpICAxMjM0NTYuNzg5MDEyMzQ1NiAgLT4gMTIzNDU2LjggSW5leGFjdCBSb3VuZGVkCitkc2JhczA3OCB0b1NjaSAgMTIzNDU2Ny44OTAxMjM0NTYgIC0+IDEyMzQ1NjggIEluZXhhY3QgUm91bmRlZAorZHNiYXMwNzkgdG9TY2kgIDEyMzQ1Njc4LjkwMTIzNDU2ICAtPiAxLjIzNDU2OEUrNyBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMDgwIHRvU2NpICAxMjM0NTY3ODkuMDEyMzQ1NiAgLT4gMS4yMzQ1NjhFKzggSW5leGFjdCBSb3VuZGVkCitkc2JhczA4MSB0b1NjaSAgMTIzNDU2Nzg5MC4xMjM0NTYgIC0+IDEuMjM0NTY4RSs5IEluZXhhY3QgUm91bmRlZAorZHNiYXMwODIgdG9TY2kgIDEyMzQ1Njc4OTAxLjIzNDU2ICAtPiAxLjIzNDU2OEUrMTAgSW5leGFjdCBSb3VuZGVkCitkc2JhczA4MyB0b1NjaSAgMTIzNDU2Nzg5MDEyLjM0NTYgIC0+IDEuMjM0NTY4RSsxMSBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMDg0IHRvU2NpICAxMjM0NTY3ODkwMTIzLjQ1NiAgLT4gMS4yMzQ1NjhFKzEyIEluZXhhY3QgUm91bmRlZAorZHNiYXMwODUgdG9TY2kgIDEyMzQ1Njc4OTAxMjM0LjU2ICAtPiAxLjIzNDU2OEUrMTMgSW5leGFjdCBSb3VuZGVkCitkc2JhczA4NiB0b1NjaSAgMTIzNDU2Nzg5MDEyMzQ1LjYgIC0+IDEuMjM0NTY4RSsxNCBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMDg3IHRvU2NpICAxMjM0NTY3ODkwMTIzNDU2LiAgLT4gMS4yMzQ1NjhFKzE1IEluZXhhY3QgUm91bmRlZAorZHNiYXMwODggdG9TY2kgIDEyMzQ1Njc4OTAxMjM0NTYgICAtPiAxLjIzNDU2OEUrMTUgSW5leGFjdCBSb3VuZGVkCisKKy0tIE51bWJlcnMgd2l0aCBFCitkc2JhczEzMCB0b1NjaSAiMC4wMDBFLTEiICAtPiAnMC4wMDAwJworZHNiYXMxMzEgdG9TY2kgIjAuMDAwRS0yIiAgLT4gJzAuMDAwMDAnCitkc2JhczEzMiB0b1NjaSAiMC4wMDBFLTMiICAtPiAnMC4wMDAwMDAnCitkc2JhczEzMyB0b1NjaSAiMC4wMDBFLTQiICAtPiAnMEUtNycKK2RzYmFzMTM0IHRvU2NpICIwLjAwRS0yIiAgIC0+ICcwLjAwMDAnCitkc2JhczEzNSB0b1NjaSAiMC4wMEUtMyIgICAtPiAnMC4wMDAwMCcKK2RzYmFzMTM2IHRvU2NpICIwLjAwRS00IiAgIC0+ICcwLjAwMDAwMCcKK2RzYmFzMTM3IHRvU2NpICIwLjAwRS01IiAgIC0+ICcwRS03JworZHNiYXMxMzggdG9TY2kgIiswRSs5IiAgICAgLT4gJzBFKzknCitkc2JhczEzOSB0b1NjaSAiLTBFKzkiICAgICAtPiAnLTBFKzknCitkc2JhczE0MCB0b1NjaSAiMUUrOSIgICAgICAtPiAnMUUrOScKK2RzYmFzMTQxIHRvU2NpICIxZSswOSIgICAgIC0+ICcxRSs5JworZHNiYXMxNDIgdG9TY2kgIjFFKzkwIiAgICAgLT4gJzFFKzkwJworZHNiYXMxNDMgdG9TY2kgIisxRSswMDkiICAgLT4gJzFFKzknCitkc2JhczE0NCB0b1NjaSAiMEUrOSIgICAgICAtPiAnMEUrOScKK2RzYmFzMTQ1IHRvU2NpICIxRSs5IiAgICAgIC0+ICcxRSs5JworZHNiYXMxNDYgdG9TY2kgIjFFKzA5IiAgICAgLT4gJzFFKzknCitkc2JhczE0NyB0b1NjaSAiMWUrOTAiICAgICAtPiAnMUUrOTAnCitkc2JhczE0OCB0b1NjaSAiMUUrMDA5IiAgICAtPiAnMUUrOScKK2RzYmFzMTQ5IHRvU2NpICIwMDBFKzkiICAgIC0+ICcwRSs5JworZHNiYXMxNTAgdG9TY2kgIjFFOSIgICAgICAgLT4gJzFFKzknCitkc2JhczE1MSB0b1NjaSAiMWUwOSIgICAgICAtPiAnMUUrOScKK2RzYmFzMTUyIHRvU2NpICIxRTkwIiAgICAgIC0+ICcxRSs5MCcKK2RzYmFzMTUzIHRvU2NpICIxRTAwOSIgICAgIC0+ICcxRSs5JworZHNiYXMxNTQgdG9TY2kgIjBFOSIgICAgICAgLT4gJzBFKzknCitkc2JhczE1NSB0b1NjaSAiMC4wMDBlKzAiICAtPiAnMC4wMDAnCitkc2JhczE1NiB0b1NjaSAiMC4wMDBFLTEiICAtPiAnMC4wMDAwJworZHNiYXMxNTcgdG9TY2kgIjRFKzkiICAgICAgLT4gJzRFKzknCitkc2JhczE1OCB0b1NjaSAiNDRFKzkiICAgICAtPiAnNC40RSsxMCcKK2RzYmFzMTU5IHRvU2NpICIwLjczZS03IiAgIC0+ICc3LjNFLTgnCitkc2JhczE2MCB0b1NjaSAiMDBFKzkiICAgICAtPiAnMEUrOScKK2RzYmFzMTYxIHRvU2NpICIwMEUtOSIgICAgIC0+ICcwRS05JworZHNiYXMxNjIgdG9TY2kgIjEwRSs5IiAgICAgLT4gJzEuMEUrMTAnCitkc2JhczE2MyB0b1NjaSAiMTBFKzA5IiAgICAtPiAnMS4wRSsxMCcKK2RzYmFzMTY0IHRvU2NpICIxMGUrOTAiICAgIC0+ICcxLjBFKzkxJworZHNiYXMxNjUgdG9TY2kgIjEwRSswMDkiICAgLT4gJzEuMEUrMTAnCitkc2JhczE2NiB0b1NjaSAiMTAwZSs5IiAgICAtPiAnMS4wMEUrMTEnCitkc2JhczE2NyB0b1NjaSAiMTAwZSswOSIgICAtPiAnMS4wMEUrMTEnCitkc2JhczE2OCB0b1NjaSAiMTAwRSs5MCIgICAtPiAnMS4wMEUrOTInCitkc2JhczE2OSB0b1NjaSAiMTAwZSswMDkiICAtPiAnMS4wMEUrMTEnCisKK2RzYmFzMTcwIHRvU2NpICIxLjI2NSIgICAgIC0+ICcxLjI2NScKK2RzYmFzMTcxIHRvU2NpICIxLjI2NUUtMjAiIC0+ICcxLjI2NUUtMjAnCitkc2JhczE3MiB0b1NjaSAiMS4yNjVFLTgiICAtPiAnMS4yNjVFLTgnCitkc2JhczE3MyB0b1NjaSAiMS4yNjVFLTQiICAtPiAnMC4wMDAxMjY1JworZHNiYXMxNzQgdG9TY2kgIjEuMjY1RS0zIiAgLT4gJzAuMDAxMjY1JworZHNiYXMxNzUgdG9TY2kgIjEuMjY1RS0yIiAgLT4gJzAuMDEyNjUnCitkc2JhczE3NiB0b1NjaSAiMS4yNjVFLTEiICAtPiAnMC4xMjY1JworZHNiYXMxNzcgdG9TY2kgIjEuMjY1RS0wIiAgLT4gJzEuMjY1JworZHNiYXMxNzggdG9TY2kgIjEuMjY1RSsxIiAgLT4gJzEyLjY1JworZHNiYXMxNzkgdG9TY2kgIjEuMjY1RSsyIiAgLT4gJzEyNi41JworZHNiYXMxODAgdG9TY2kgIjEuMjY1RSszIiAgLT4gJzEyNjUnCitkc2JhczE4MSB0b1NjaSAiMS4yNjVFKzQiICAtPiAnMS4yNjVFKzQnCitkc2JhczE4MiB0b1NjaSAiMS4yNjVFKzgiICAtPiAnMS4yNjVFKzgnCitkc2JhczE4MyB0b1NjaSAiMS4yNjVFKzIwIiAtPiAnMS4yNjVFKzIwJworCitkc2JhczE5MCB0b1NjaSAiMTIuNjUiICAgICAtPiAnMTIuNjUnCitkc2JhczE5MSB0b1NjaSAiMTIuNjVFLTIwIiAtPiAnMS4yNjVFLTE5JworZHNiYXMxOTIgdG9TY2kgIjEyLjY1RS04IiAgLT4gJzEuMjY1RS03JworZHNiYXMxOTMgdG9TY2kgIjEyLjY1RS00IiAgLT4gJzAuMDAxMjY1JworZHNiYXMxOTQgdG9TY2kgIjEyLjY1RS0zIiAgLT4gJzAuMDEyNjUnCitkc2JhczE5NSB0b1NjaSAiMTIuNjVFLTIiICAtPiAnMC4xMjY1JworZHNiYXMxOTYgdG9TY2kgIjEyLjY1RS0xIiAgLT4gJzEuMjY1JworZHNiYXMxOTcgdG9TY2kgIjEyLjY1RS0wIiAgLT4gJzEyLjY1JworZHNiYXMxOTggdG9TY2kgIjEyLjY1RSsxIiAgLT4gJzEyNi41JworZHNiYXMxOTkgdG9TY2kgIjEyLjY1RSsyIiAgLT4gJzEyNjUnCitkc2JhczIwMCB0b1NjaSAiMTIuNjVFKzMiICAtPiAnMS4yNjVFKzQnCitkc2JhczIwMSB0b1NjaSAiMTIuNjVFKzQiICAtPiAnMS4yNjVFKzUnCitkc2JhczIwMiB0b1NjaSAiMTIuNjVFKzgiICAtPiAnMS4yNjVFKzknCitkc2JhczIwMyB0b1NjaSAiMTIuNjVFKzIwIiAtPiAnMS4yNjVFKzIxJworCitkc2JhczIxMCB0b1NjaSAiMTI2LjUiICAgICAtPiAnMTI2LjUnCitkc2JhczIxMSB0b1NjaSAiMTI2LjVFLTIwIiAtPiAnMS4yNjVFLTE4JworZHNiYXMyMTIgdG9TY2kgIjEyNi41RS04IiAgLT4gJzAuMDAwMDAxMjY1JworZHNiYXMyMTMgdG9TY2kgIjEyNi41RS00IiAgLT4gJzAuMDEyNjUnCitkc2JhczIxNCB0b1NjaSAiMTI2LjVFLTMiICAtPiAnMC4xMjY1JworZHNiYXMyMTUgdG9TY2kgIjEyNi41RS0yIiAgLT4gJzEuMjY1JworZHNiYXMyMTYgdG9TY2kgIjEyNi41RS0xIiAgLT4gJzEyLjY1JworZHNiYXMyMTcgdG9TY2kgIjEyNi41RS0wIiAgLT4gJzEyNi41JworZHNiYXMyMTggdG9TY2kgIjEyNi41RSsxIiAgLT4gJzEyNjUnCitkc2JhczIxOSB0b1NjaSAiMTI2LjVFKzIiICAtPiAnMS4yNjVFKzQnCitkc2JhczIyMCB0b1NjaSAiMTI2LjVFKzMiICAtPiAnMS4yNjVFKzUnCitkc2JhczIyMSB0b1NjaSAiMTI2LjVFKzQiICAtPiAnMS4yNjVFKzYnCitkc2JhczIyMiB0b1NjaSAiMTI2LjVFKzgiICAtPiAnMS4yNjVFKzEwJworZHNiYXMyMjMgdG9TY2kgIjEyNi41RSsyMCIgLT4gJzEuMjY1RSsyMicKKworZHNiYXMyMzAgdG9TY2kgIjEyNjUiICAgICAtPiAnMTI2NScKK2RzYmFzMjMxIHRvU2NpICIxMjY1RS0yMCIgLT4gJzEuMjY1RS0xNycKK2RzYmFzMjMyIHRvU2NpICIxMjY1RS04IiAgLT4gJzAuMDAwMDEyNjUnCitkc2JhczIzMyB0b1NjaSAiMTI2NUUtNCIgIC0+ICcwLjEyNjUnCitkc2JhczIzNCB0b1NjaSAiMTI2NUUtMyIgIC0+ICcxLjI2NScKK2RzYmFzMjM1IHRvU2NpICIxMjY1RS0yIiAgLT4gJzEyLjY1JworZHNiYXMyMzYgdG9TY2kgIjEyNjVFLTEiICAtPiAnMTI2LjUnCitkc2JhczIzNyB0b1NjaSAiMTI2NUUtMCIgIC0+ICcxMjY1JworZHNiYXMyMzggdG9TY2kgIjEyNjVFKzEiICAtPiAnMS4yNjVFKzQnCitkc2JhczIzOSB0b1NjaSAiMTI2NUUrMiIgIC0+ICcxLjI2NUUrNScKK2RzYmFzMjQwIHRvU2NpICIxMjY1RSszIiAgLT4gJzEuMjY1RSs2JworZHNiYXMyNDEgdG9TY2kgIjEyNjVFKzQiICAtPiAnMS4yNjVFKzcnCitkc2JhczI0MiB0b1NjaSAiMTI2NUUrOCIgIC0+ICcxLjI2NUUrMTEnCitkc2JhczI0MyB0b1NjaSAiMTI2NUUrMjAiIC0+ICcxLjI2NUUrMjMnCisKK2RzYmFzMjUwIHRvU2NpICIwLjEyNjUiICAgICAtPiAnMC4xMjY1JworZHNiYXMyNTEgdG9TY2kgIjAuMTI2NUUtMjAiIC0+ICcxLjI2NUUtMjEnCitkc2JhczI1MiB0b1NjaSAiMC4xMjY1RS04IiAgLT4gJzEuMjY1RS05JworZHNiYXMyNTMgdG9TY2kgIjAuMTI2NUUtNCIgIC0+ICcwLjAwMDAxMjY1JworZHNiYXMyNTQgdG9TY2kgIjAuMTI2NUUtMyIgIC0+ICcwLjAwMDEyNjUnCitkc2JhczI1NSB0b1NjaSAiMC4xMjY1RS0yIiAgLT4gJzAuMDAxMjY1JworZHNiYXMyNTYgdG9TY2kgIjAuMTI2NUUtMSIgIC0+ICcwLjAxMjY1JworZHNiYXMyNTcgdG9TY2kgIjAuMTI2NUUtMCIgIC0+ICcwLjEyNjUnCitkc2JhczI1OCB0b1NjaSAiMC4xMjY1RSsxIiAgLT4gJzEuMjY1JworZHNiYXMyNTkgdG9TY2kgIjAuMTI2NUUrMiIgIC0+ICcxMi42NScKK2RzYmFzMjYwIHRvU2NpICIwLjEyNjVFKzMiICAtPiAnMTI2LjUnCitkc2JhczI2MSB0b1NjaSAiMC4xMjY1RSs0IiAgLT4gJzEyNjUnCitkc2JhczI2MiB0b1NjaSAiMC4xMjY1RSs4IiAgLT4gJzEuMjY1RSs3JworZHNiYXMyNjMgdG9TY2kgIjAuMTI2NUUrMjAiIC0+ICcxLjI2NUUrMTknCisKKy0tIHNvbWUgbW9yZSBuZWdhdGl2ZSB6ZXJvcyBbc3lzdGVtYXRpYyB0ZXN0cyBiZWxvd10KK2RzYmFzMjkwIHRvU2NpICItMC4wMDBFLTEiICAtPiAnLTAuMDAwMCcKK2RzYmFzMjkxIHRvU2NpICItMC4wMDBFLTIiICAtPiAnLTAuMDAwMDAnCitkc2JhczI5MiB0b1NjaSAiLTAuMDAwRS0zIiAgLT4gJy0wLjAwMDAwMCcKK2RzYmFzMjkzIHRvU2NpICItMC4wMDBFLTQiICAtPiAnLTBFLTcnCitkc2JhczI5NCB0b1NjaSAiLTAuMDBFLTIiICAgLT4gJy0wLjAwMDAnCitkc2JhczI5NSB0b1NjaSAiLTAuMDBFLTMiICAgLT4gJy0wLjAwMDAwJworZHNiYXMyOTYgdG9TY2kgIi0wLjBFLTIiICAgIC0+ICctMC4wMDAnCitkc2JhczI5NyB0b1NjaSAiLTAuMEUtMyIgICAgLT4gJy0wLjAwMDAnCitkc2JhczI5OCB0b1NjaSAiLTBFLTIiICAgICAgLT4gJy0wLjAwJworZHNiYXMyOTkgdG9TY2kgIi0wRS0zIiAgICAgIC0+ICctMC4wMDAnCisKKy0tIEVuZ2luZWVyaW5nIG5vdGF0aW9uIHRlc3RzCitkc2JhczMwMSAgdG9TY2kgMTBlMTIgIC0+IDEuMEUrMTMKK2RzYmFzMzAyICB0b0VuZyAxMGUxMiAgLT4gMTBFKzEyCitkc2JhczMwMyAgdG9TY2kgMTBlMTEgIC0+IDEuMEUrMTIKK2RzYmFzMzA0ICB0b0VuZyAxMGUxMSAgLT4gMS4wRSsxMgorZHNiYXMzMDUgIHRvU2NpIDEwZTEwICAtPiAxLjBFKzExCitkc2JhczMwNiAgdG9FbmcgMTBlMTAgIC0+IDEwMEUrOQorZHNiYXMzMDcgIHRvU2NpIDEwZTkgICAtPiAxLjBFKzEwCitkc2JhczMwOCAgdG9FbmcgMTBlOSAgIC0+IDEwRSs5Citkc2JhczMwOSAgdG9TY2kgMTBlOCAgIC0+IDEuMEUrOQorZHNiYXMzMTAgIHRvRW5nIDEwZTggICAtPiAxLjBFKzkKK2RzYmFzMzExICB0b1NjaSAxMGU3ICAgLT4gMS4wRSs4Citkc2JhczMxMiAgdG9FbmcgMTBlNyAgIC0+IDEwMEUrNgorZHNiYXMzMTMgIHRvU2NpIDEwZTYgICAtPiAxLjBFKzcKK2RzYmFzMzE0ICB0b0VuZyAxMGU2ICAgLT4gMTBFKzYKK2RzYmFzMzE1ICB0b1NjaSAxMGU1ICAgLT4gMS4wRSs2Citkc2JhczMxNiAgdG9FbmcgMTBlNSAgIC0+IDEuMEUrNgorZHNiYXMzMTcgIHRvU2NpIDEwZTQgICAtPiAxLjBFKzUKK2RzYmFzMzE4ICB0b0VuZyAxMGU0ICAgLT4gMTAwRSszCitkc2JhczMxOSAgdG9TY2kgMTBlMyAgIC0+IDEuMEUrNAorZHNiYXMzMjAgIHRvRW5nIDEwZTMgICAtPiAxMEUrMworZHNiYXMzMjEgIHRvU2NpIDEwZTIgICAtPiAxLjBFKzMKK2RzYmFzMzIyICB0b0VuZyAxMGUyICAgLT4gMS4wRSszCitkc2JhczMyMyAgdG9TY2kgMTBlMSAgIC0+IDEuMEUrMgorZHNiYXMzMjQgIHRvRW5nIDEwZTEgICAtPiAxMDAKK2RzYmFzMzI1ICB0b1NjaSAxMGUwICAgLT4gMTAKK2RzYmFzMzI2ICB0b0VuZyAxMGUwICAgLT4gMTAKK2RzYmFzMzI3ICB0b1NjaSAxMGUtMSAgLT4gMS4wCitkc2JhczMyOCAgdG9FbmcgMTBlLTEgIC0+IDEuMAorZHNiYXMzMjkgIHRvU2NpIDEwZS0yICAtPiAwLjEwCitkc2JhczMzMCAgdG9FbmcgMTBlLTIgIC0+IDAuMTAKK2RzYmFzMzMxICB0b1NjaSAxMGUtMyAgLT4gMC4wMTAKK2RzYmFzMzMyICB0b0VuZyAxMGUtMyAgLT4gMC4wMTAKK2RzYmFzMzMzICB0b1NjaSAxMGUtNCAgLT4gMC4wMDEwCitkc2JhczMzNCAgdG9FbmcgMTBlLTQgIC0+IDAuMDAxMAorZHNiYXMzMzUgIHRvU2NpIDEwZS01ICAtPiAwLjAwMDEwCitkc2JhczMzNiAgdG9FbmcgMTBlLTUgIC0+IDAuMDAwMTAKK2RzYmFzMzM3ICB0b1NjaSAxMGUtNiAgLT4gMC4wMDAwMTAKK2RzYmFzMzM4ICB0b0VuZyAxMGUtNiAgLT4gMC4wMDAwMTAKK2RzYmFzMzM5ICB0b1NjaSAxMGUtNyAgLT4gMC4wMDAwMDEwCitkc2JhczM0MCAgdG9FbmcgMTBlLTcgIC0+IDAuMDAwMDAxMAorZHNiYXMzNDEgIHRvU2NpIDEwZS04ICAtPiAxLjBFLTcKK2RzYmFzMzQyICB0b0VuZyAxMGUtOCAgLT4gMTAwRS05Citkc2JhczM0MyAgdG9TY2kgMTBlLTkgIC0+IDEuMEUtOAorZHNiYXMzNDQgIHRvRW5nIDEwZS05ICAtPiAxMEUtOQorZHNiYXMzNDUgIHRvU2NpIDEwZS0xMCAtPiAxLjBFLTkKK2RzYmFzMzQ2ICB0b0VuZyAxMGUtMTAgLT4gMS4wRS05Citkc2JhczM0NyAgdG9TY2kgMTBlLTExIC0+IDEuMEUtMTAKK2RzYmFzMzQ4ICB0b0VuZyAxMGUtMTEgLT4gMTAwRS0xMgorZHNiYXMzNDkgIHRvU2NpIDEwZS0xMiAtPiAxLjBFLTExCitkc2JhczM1MCAgdG9FbmcgMTBlLTEyIC0+IDEwRS0xMgorZHNiYXMzNTEgIHRvU2NpIDEwZS0xMyAtPiAxLjBFLTEyCitkc2JhczM1MiAgdG9FbmcgMTBlLTEzIC0+IDEuMEUtMTIKKworZHNiYXMzNjEgIHRvU2NpIDdFMTIgIC0+IDdFKzEyCitkc2JhczM2MiAgdG9FbmcgN0UxMiAgLT4gN0UrMTIKK2RzYmFzMzYzICB0b1NjaSA3RTExICAtPiA3RSsxMQorZHNiYXMzNjQgIHRvRW5nIDdFMTEgIC0+IDcwMEUrOQorZHNiYXMzNjUgIHRvU2NpIDdFMTAgIC0+IDdFKzEwCitkc2JhczM2NiAgdG9FbmcgN0UxMCAgLT4gNzBFKzkKK2RzYmFzMzY3ICB0b1NjaSA3RTkgICAtPiA3RSs5Citkc2JhczM2OCAgdG9FbmcgN0U5ICAgLT4gN0UrOQorZHNiYXMzNjkgIHRvU2NpIDdFOCAgIC0+IDdFKzgKK2RzYmFzMzcwICB0b0VuZyA3RTggICAtPiA3MDBFKzYKK2RzYmFzMzcxICB0b1NjaSA3RTcgICAtPiA3RSs3Citkc2JhczM3MiAgdG9FbmcgN0U3ICAgLT4gNzBFKzYKK2RzYmFzMzczICB0b1NjaSA3RTYgICAtPiA3RSs2Citkc2JhczM3NCAgdG9FbmcgN0U2ICAgLT4gN0UrNgorZHNiYXMzNzUgIHRvU2NpIDdFNSAgIC0+IDdFKzUKK2RzYmFzMzc2ICB0b0VuZyA3RTUgICAtPiA3MDBFKzMKK2RzYmFzMzc3ICB0b1NjaSA3RTQgICAtPiA3RSs0Citkc2JhczM3OCAgdG9FbmcgN0U0ICAgLT4gNzBFKzMKK2RzYmFzMzc5ICB0b1NjaSA3RTMgICAtPiA3RSszCitkc2JhczM4MCAgdG9FbmcgN0UzICAgLT4gN0UrMworZHNiYXMzODEgIHRvU2NpIDdFMiAgIC0+IDdFKzIKK2RzYmFzMzgyICB0b0VuZyA3RTIgICAtPiA3MDAKK2RzYmFzMzgzICB0b1NjaSA3RTEgICAtPiA3RSsxCitkc2JhczM4NCAgdG9FbmcgN0UxICAgLT4gNzAKK2RzYmFzMzg1ICB0b1NjaSA3RTAgICAtPiA3Citkc2JhczM4NiAgdG9FbmcgN0UwICAgLT4gNworZHNiYXMzODcgIHRvU2NpIDdFLTEgIC0+IDAuNworZHNiYXMzODggIHRvRW5nIDdFLTEgIC0+IDAuNworZHNiYXMzODkgIHRvU2NpIDdFLTIgIC0+IDAuMDcKK2RzYmFzMzkwICB0b0VuZyA3RS0yICAtPiAwLjA3Citkc2JhczM5MSAgdG9TY2kgN0UtMyAgLT4gMC4wMDcKK2RzYmFzMzkyICB0b0VuZyA3RS0zICAtPiAwLjAwNworZHNiYXMzOTMgIHRvU2NpIDdFLTQgIC0+IDAuMDAwNworZHNiYXMzOTQgIHRvRW5nIDdFLTQgIC0+IDAuMDAwNworZHNiYXMzOTUgIHRvU2NpIDdFLTUgIC0+IDAuMDAwMDcKK2RzYmFzMzk2ICB0b0VuZyA3RS01ICAtPiAwLjAwMDA3Citkc2JhczM5NyAgdG9TY2kgN0UtNiAgLT4gMC4wMDAwMDcKK2RzYmFzMzk4ICB0b0VuZyA3RS02ICAtPiAwLjAwMDAwNworZHNiYXMzOTkgIHRvU2NpIDdFLTcgIC0+IDdFLTcKK2RzYmFzNDAwICB0b0VuZyA3RS03ICAtPiA3MDBFLTkKK2RzYmFzNDAxICB0b1NjaSA3RS04ICAtPiA3RS04Citkc2JhczQwMiAgdG9FbmcgN0UtOCAgLT4gNzBFLTkKK2RzYmFzNDAzICB0b1NjaSA3RS05ICAtPiA3RS05Citkc2JhczQwNCAgdG9FbmcgN0UtOSAgLT4gN0UtOQorZHNiYXM0MDUgIHRvU2NpIDdFLTEwIC0+IDdFLTEwCitkc2JhczQwNiAgdG9FbmcgN0UtMTAgLT4gNzAwRS0xMgorZHNiYXM0MDcgIHRvU2NpIDdFLTExIC0+IDdFLTExCitkc2JhczQwOCAgdG9FbmcgN0UtMTEgLT4gNzBFLTEyCitkc2JhczQwOSAgdG9TY2kgN0UtMTIgLT4gN0UtMTIKK2RzYmFzNDEwICB0b0VuZyA3RS0xMiAtPiA3RS0xMgorZHNiYXM0MTEgIHRvU2NpIDdFLTEzIC0+IDdFLTEzCitkc2JhczQxMiAgdG9FbmcgN0UtMTMgLT4gNzAwRS0xNQorCistLSBFeGFjdHMgcmVtYWluIGV4YWN0IHVwIHRvIHByZWNpc2lvbiAuLgorZHNiYXM0MjAgIHRvU2NpICAgIDEwMCAtPiAxMDAKK2RzYmFzNDIyICB0b1NjaSAgIDEwMDAgLT4gMTAwMAorZHNiYXM0MjQgIHRvU2NpICA5OTkuOSAtPiAgOTk5LjkKK2RzYmFzNDI2ICB0b1NjaSAxMDAwLjAgLT4gMTAwMC4wCitkc2JhczQyOCAgdG9TY2kgMTAwMC4xIC0+IDEwMDAuMQorZHNiYXM0MzAgIHRvU2NpIDEwMDAwIC0+IDEwMDAwCitkc2JhczQzMiAgdG9TY2kgMTAwMCAgICAgICAgLT4gMTAwMAorZHNiYXM0MzQgIHRvU2NpIDEwMDAwICAgICAgIC0+IDEwMDAwCitkc2JhczQzNiAgdG9TY2kgMTAwMDAwICAgICAgLT4gMTAwMDAwCitkc2JhczQzOCAgdG9TY2kgMTAwMDAwMCAgICAgLT4gMTAwMDAwMAorZHNiYXM0NDAgIHRvU2NpIDEwMDAwMDAwICAgIC0+IDEuMDAwMDAwRSs3ICAgUm91bmRlZAorZHNiYXM0NDIgIHRvU2NpIDEwMDAwMDAwICAgIC0+IDEuMDAwMDAwRSs3ICAgUm91bmRlZAorZHNiYXM0NDQgIHRvU2NpIDEwMDAwMDAzICAgIC0+IDEuMDAwMDAwRSs3ICAgUm91bmRlZCBJbmV4YWN0Citkc2JhczQ0NiAgdG9TY2kgMTAwMDAwMDUgICAgLT4gMS4wMDAwMDBFKzcgICBSb3VuZGVkIEluZXhhY3QKK2RzYmFzNDQ4ICB0b1NjaSAxMDAwMDAwNTAgICAtPiAxLjAwMDAwMEUrOCAgIFJvdW5kZWQgSW5leGFjdAorZHNiYXM0NTAgIHRvU2NpIDEwMDAwMDA5ICAgIC0+IDEuMDAwMDAxRSs3ICAgUm91bmRlZCBJbmV4YWN0Citkc2JhczQ1MiAgdG9TY2kgMTAwMDAwMDAwICAgLT4gMS4wMDAwMDBFKzggICBSb3VuZGVkCitkc2JhczQ1NCAgdG9TY2kgMTAwMDAwMDAzICAgLT4gMS4wMDAwMDBFKzggICBSb3VuZGVkIEluZXhhY3QKK2RzYmFzNDU2ICB0b1NjaSAxMDAwMDAwMDUgICAtPiAxLjAwMDAwMEUrOCAgIFJvdW5kZWQgSW5leGFjdAorZHNiYXM0NTggIHRvU2NpIDEwMDAwMDAwOSAgIC0+IDEuMDAwMDAwRSs4ICAgUm91bmRlZCBJbmV4YWN0Citkc2JhczQ2MCAgdG9TY2kgMTAwMDAwMDAwMCAgLT4gMS4wMDAwMDBFKzkgICBSb3VuZGVkCitkc2JhczQ2MiAgdG9TY2kgMTAwMDAwMDMwMCAgLT4gMS4wMDAwMDBFKzkgICBSb3VuZGVkIEluZXhhY3QKK2RzYmFzNDY0ICB0b1NjaSAxMDAwMDAwNTAwICAtPiAxLjAwMDAwMEUrOSAgIFJvdW5kZWQgSW5leGFjdAorZHNiYXM0NjYgIHRvU2NpIDEwMDAwMDA5MDAgIC0+IDEuMDAwMDAxRSs5ICAgUm91bmRlZCBJbmV4YWN0Citkc2JhczQ2OCAgdG9TY2kgMTAwMDAwMDAwMDAgLT4gMS4wMDAwMDBFKzEwICBSb3VuZGVkCitkc2JhczQ3MCAgdG9TY2kgMTAwMDAwMDMwMDAgLT4gMS4wMDAwMDBFKzEwICBSb3VuZGVkIEluZXhhY3QKK2RzYmFzNDcyICB0b1NjaSAxMDAwMDAwNTAwMCAtPiAxLjAwMDAwMEUrMTAgIFJvdW5kZWQgSW5leGFjdAorZHNiYXM0NzQgIHRvU2NpIDEwMDAwMDA5MDAwIC0+IDEuMDAwMDAxRSsxMCAgUm91bmRlZCBJbmV4YWN0CisKKy0tIGNoZWNrIHJvdW5kaW5nIG1vZGVzIGhlZWRlZAorcm91bmRpbmc6ICBjZWlsaW5nCitkc2JzcjQwMSAgdG9TY2kgIDEuMTEyMzQ1MCAgICAtPiAgMS4xMTIzNDUgIFJvdW5kZWQKK2RzYnNyNDAyICB0b1NjaSAgMS4xMTIzNDU0OSAgIC0+ICAxLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjQwMyAgdG9TY2kgIDEuMTEyMzQ1NTAgICAtPiAgMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I0MDQgIHRvU2NpICAxLjExMjM0NTUxICAgLT4gIDEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgdXAKK2RzYnNyNDA1ICB0b1NjaSAgMS4xMTIzNDUwICAgIC0+ICAxLjExMjM0NSAgUm91bmRlZAorZHNic3I0MDYgIHRvU2NpICAxLjExMjM0NTQ5ICAgLT4gIDEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNDA3ICB0b1NjaSAgMS4xMTIzNDU1MCAgIC0+ICAxLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjQwOCAgdG9TY2kgIDEuMTEyMzQ1NTEgICAtPiAgMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBmbG9vcgorZHNic3I0MTAgIHRvU2NpICAxLjExMjM0NTAgICAgLT4gIDEuMTEyMzQ1ICBSb3VuZGVkCitkc2JzcjQxMSAgdG9TY2kgIDEuMTEyMzQ1NDkgICAtPiAgMS4xMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHNic3I0MTIgIHRvU2NpICAxLjExMjM0NTUwICAgLT4gIDEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNDEzICB0b1NjaSAgMS4xMTIzNDU1MSAgIC0+ICAxLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfZG93bgorZHNic3I0MTUgIHRvU2NpICAxLjExMjM0NTAgICAgLT4gIDEuMTEyMzQ1ICBSb3VuZGVkCitkc2JzcjQxNiAgdG9TY2kgIDEuMTEyMzQ1NDkgICAtPiAgMS4xMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHNic3I0MTcgIHRvU2NpICAxLjExMjM0NTUwICAgLT4gIDEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNDE4ICB0b1NjaSAgMS4xMTIzNDY1MCAgIC0+ICAxLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjQxOSAgdG9TY2kgIDEuMTEyMzQ1NTEgICAtPiAgMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX2V2ZW4KK2RzYnNyNDIxICB0b1NjaSAgMS4xMTIzNDUwICAgIC0+ICAxLjExMjM0NSAgUm91bmRlZAorZHNic3I0MjIgIHRvU2NpICAxLjExMjM0NTQ5ICAgLT4gIDEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNDIzICB0b1NjaSAgMS4xMTIzNDU1MCAgIC0+ICAxLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjQyNCAgdG9TY2kgIDEuMTEyMzQ2NTAgICAtPiAgMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I0MjUgIHRvU2NpICAxLjExMjM0NTUxICAgLT4gIDEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgZG93bgorZHNic3I0MjYgIHRvU2NpICAxLjExMjM0NTAgICAgLT4gIDEuMTEyMzQ1ICBSb3VuZGVkCitkc2JzcjQyNyAgdG9TY2kgIDEuMTEyMzQ1NDkgICAtPiAgMS4xMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHNic3I0MjggIHRvU2NpICAxLjExMjM0NTUwICAgLT4gIDEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNDI5ICB0b1NjaSAgMS4xMTIzNDU1MSAgIC0+ICAxLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfdXAKK2RzYnNyNDMxICB0b1NjaSAgMS4xMTIzNDUwICAgIC0+ICAxLjExMjM0NSAgUm91bmRlZAorZHNic3I0MzIgIHRvU2NpICAxLjExMjM0NTQ5ICAgLT4gIDEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNDMzICB0b1NjaSAgMS4xMTIzNDU1MCAgIC0+ICAxLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjQzNCAgdG9TY2kgIDEuMTEyMzQ2NTAgICAtPiAgMS4xMTIzNDcgIFJvdW5kZWQgSW5leGFjdAorZHNic3I0MzUgIHRvU2NpICAxLjExMjM0NTUxICAgLT4gIDEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKKy0tIG5lZ2F0aXZlcworcm91bmRpbmc6ICBjZWlsaW5nCitkc2JzcjUwMSAgdG9TY2kgLTEuMTEyMzQ1MCAgICAtPiAtMS4xMTIzNDUgIFJvdW5kZWQKK2RzYnNyNTAyICB0b1NjaSAtMS4xMTIzNDU0OSAgIC0+IC0xLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjUwMyAgdG9TY2kgLTEuMTEyMzQ1NTAgICAtPiAtMS4xMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHNic3I1MDQgIHRvU2NpIC0xLjExMjM0NTUxICAgLT4gLTEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgdXAKK2RzYnNyNTA1ICB0b1NjaSAtMS4xMTIzNDUwICAgIC0+IC0xLjExMjM0NSAgUm91bmRlZAorZHNic3I1MDYgIHRvU2NpIC0xLjExMjM0NTQ5ICAgLT4gLTEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNTA3ICB0b1NjaSAtMS4xMTIzNDU1MCAgIC0+IC0xLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjUwOCAgdG9TY2kgLTEuMTEyMzQ1NTEgICAtPiAtMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBmbG9vcgorZHNic3I1MTAgIHRvU2NpIC0xLjExMjM0NTAgICAgLT4gLTEuMTEyMzQ1ICBSb3VuZGVkCitkc2JzcjUxMSAgdG9TY2kgLTEuMTEyMzQ1NDkgICAtPiAtMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I1MTIgIHRvU2NpIC0xLjExMjM0NTUwICAgLT4gLTEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNTEzICB0b1NjaSAtMS4xMTIzNDU1MSAgIC0+IC0xLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfZG93bgorZHNic3I1MTUgIHRvU2NpIC0xLjExMjM0NTAgICAgLT4gLTEuMTEyMzQ1ICBSb3VuZGVkCitkc2JzcjUxNiAgdG9TY2kgLTEuMTEyMzQ1NDkgICAtPiAtMS4xMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHNic3I1MTcgIHRvU2NpIC0xLjExMjM0NTUwICAgLT4gLTEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNTE4ICB0b1NjaSAtMS4xMTIzNDY1MCAgIC0+IC0xLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjUxOSAgdG9TY2kgLTEuMTEyMzQ1NTEgICAtPiAtMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX2V2ZW4KK2RzYnNyNTIxICB0b1NjaSAtMS4xMTIzNDUwICAgIC0+IC0xLjExMjM0NSAgUm91bmRlZAorZHNic3I1MjIgIHRvU2NpIC0xLjExMjM0NTQ5ICAgLT4gLTEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNTIzICB0b1NjaSAtMS4xMTIzNDU1MCAgIC0+IC0xLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjUyNCAgdG9TY2kgLTEuMTEyMzQ2NTAgICAtPiAtMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I1MjUgIHRvU2NpIC0xLjExMjM0NTUxICAgLT4gLTEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgZG93bgorZHNic3I1MjYgIHRvU2NpIC0xLjExMjM0NTAgICAgLT4gLTEuMTEyMzQ1ICBSb3VuZGVkCitkc2JzcjUyNyAgdG9TY2kgLTEuMTEyMzQ1NDkgICAtPiAtMS4xMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHNic3I1MjggIHRvU2NpIC0xLjExMjM0NTUwICAgLT4gLTEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNTI5ICB0b1NjaSAtMS4xMTIzNDU1MSAgIC0+IC0xLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfdXAKK2RzYnNyNTMxICB0b1NjaSAtMS4xMTIzNDUwICAgIC0+IC0xLjExMjM0NSAgUm91bmRlZAorZHNic3I1MzIgIHRvU2NpIC0xLjExMjM0NTQ5ICAgLT4gLTEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNTMzICB0b1NjaSAtMS4xMTIzNDU1MCAgIC0+IC0xLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjUzNCAgdG9TY2kgLTEuMTEyMzQ2NTAgICAtPiAtMS4xMTIzNDcgIFJvdW5kZWQgSW5leGFjdAorZHNic3I1MzUgIHRvU2NpIC0xLjExMjM0NTUxICAgLT4gLTEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKKworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBUaGUgJ2JhZGRpZXMnIHRlc3RzIGZyb20gRGlhZ0JpZ0RlY2ltYWwsIHBsdXMgc29tZSBuZXcgb25lcworZHNiYXM1MDAgdG9TY2kgJzEuLjInICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUwMSB0b1NjaSAnLicgICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTAyIHRvU2NpICcuLicgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MDMgdG9TY2kgJysrMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUwNCB0b1NjaSAnLS0xJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTA1IHRvU2NpICctKzEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MDYgdG9TY2kgJystMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUwNyB0b1NjaSAnMTJlJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTA4IHRvU2NpICcxMmUrKycgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MDkgdG9TY2kgJzEyZjQnICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUxMCB0b1NjaSAnICsxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTExIHRvU2NpICcrIDEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MTIgdG9TY2kgJzEyICcgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUxMyB0b1NjaSAnICsgMScgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTE0IHRvU2NpICcgLSAxICcgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MTUgdG9TY2kgJ3gnICAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUxNiB0b1NjaSAnLTEtJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTE3IHRvU2NpICcxMi0nICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MTggdG9TY2kgJzMrJyAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUxOSB0b1NjaSAnJyAgICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTIwIHRvU2NpICcxZS0nICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MjEgdG9TY2kgJzdlOTk5OTlhJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUyMiB0b1NjaSAnN2UxMjM1Njc4OTB4JyAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTIzIHRvU2NpICc3ZTEyMzU2Nzg5MDEyeCcgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MjQgdG9TY2kgJycgICAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUyNSB0b1NjaSAnZTEwMCcgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTI2IHRvU2NpICdcdTBlNWEnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MjcgdG9TY2kgJ1x1MGI2NScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUyOCB0b1NjaSAnMTIzLDY1JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTI5IHRvU2NpICcxLjM0LjUnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MzAgdG9TY2kgJy4xMjMuNScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUzMSB0b1NjaSAnMDEuMzUuJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTMyIHRvU2NpICcwMS4zNS0nICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MzMgdG9TY2kgJzAwMDAuLicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUzNCB0b1NjaSAnLjAwMDAuJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTM1IHRvU2NpICcwMC4uMDAnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MzYgdG9TY2kgJzExMWUqMTIzJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUzNyB0b1NjaSAnMTExZTEyMy0nICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTM4IHRvU2NpICcxMTFlKzEyKycgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MzkgdG9TY2kgJzExMWUxLTMtJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU0MCB0b1NjaSAnMTExZTEqMjMnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTQxIHRvU2NpICcxMTFlMWUrMycgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NDIgdG9TY2kgJzFlMS4wJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU0MyB0b1NjaSAnMWUxMjNlJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTQ0IHRvU2NpICd0ZW4nICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NDUgdG9TY2kgJ09ORScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU0NiB0b1NjaSAnMWUuMScgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTQ3IHRvU2NpICcxZTEuJyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NDggdG9TY2kgJzFlZScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU0OSB0b1NjaSAnZSsxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTUwIHRvU2NpICcxLjIzLjQnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NTEgdG9TY2kgJzEuMi4xJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU1MiB0b1NjaSAnMUUrMS4yJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTUzIHRvU2NpICcxRSsxLjIuMycgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NTQgdG9TY2kgJzFFKysxJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU1NSB0b1NjaSAnMUUtLTEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTU2IHRvU2NpICcxRSstMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NTcgdG9TY2kgJzFFLSsxJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU1OCB0b1NjaSAnMUUnJzEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTU5IHRvU2NpICIxRSIiMSIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NjAgdG9TY2kgIjFFIiIiIiIgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CistLSBOZWFyLXNwZWNpYWxzCitkc2JhczU2MSB0b1NjaSAicU5hTiIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTYyIHRvU2NpICJOYU5xIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NjMgdG9TY2kgIk5hTnMiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU2NCB0b1NjaSAiSW5maSIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTY1IHRvU2NpICJJbmZpbiIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NjYgdG9TY2kgIkluZmluaSIgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU2NyB0b1NjaSAiSW5maW5pdCIgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTY4IHRvU2NpICItSW5maW5pdCIgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NjkgdG9TY2kgIjBJbmYiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU3MCB0b1NjaSAiOUluZiIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTcxIHRvU2NpICItMEluZiIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NzIgdG9TY2kgIi05SW5mIiAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU3MyB0b1NjaSAiLXNOYSIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTc0IHRvU2NpICJ4TmFOIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NzUgdG9TY2kgIjBzTmFOIiAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CisKKy0tIHNvbWUgYmFkZGllcyB3aXRoIGRvdHMgYW5kIEVzIGFuZCBkb3RzIGFuZCBzcGVjaWFscworZHNiYXM1NzYgdG9TY2kgICdlKzEnICAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NzcgdG9TY2kgICcuZSsxJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NzggdG9TY2kgICcrLmUrMScgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NzkgdG9TY2kgICctLmUrJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1ODAgdG9TY2kgICctLmUnICAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1ODEgdG9TY2kgICdFKzEnICAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1ODIgdG9TY2kgICcuRSsxJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1ODMgdG9TY2kgICcrLkUrMScgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1ODQgdG9TY2kgICctLkUrJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1ODUgdG9TY2kgICctLkUnICAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorCitkc2JhczU4NiB0b1NjaSAgJy5OYU4nICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU4NyB0b1NjaSAgJy0uTmFOJyAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU4OCB0b1NjaSAgJysuc05hTicgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU4OSB0b1NjaSAgJysuSW5mJyAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU5MCB0b1NjaSAgJy5JbmZpbml0eScgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CisKKy0tIFplcm9zCitkc2JhczYwMSB0b1NjaSAwLjAwMDAwMDAwMCAgICAgICAtPiAwRS05Citkc2JhczYwMiB0b1NjaSAwLjAwMDAwMDAwICAgICAgICAtPiAwRS04Citkc2JhczYwMyB0b1NjaSAwLjAwMDAwMDAgICAgICAgICAtPiAwRS03Citkc2JhczYwNCB0b1NjaSAwLjAwMDAwMCAgICAgICAgICAtPiAwLjAwMDAwMAorZHNiYXM2MDUgdG9TY2kgMC4wMDAwMCAgICAgICAgICAgLT4gMC4wMDAwMAorZHNiYXM2MDYgdG9TY2kgMC4wMDAwICAgICAgICAgICAgLT4gMC4wMDAwCitkc2JhczYwNyB0b1NjaSAwLjAwMCAgICAgICAgICAgICAtPiAwLjAwMAorZHNiYXM2MDggdG9TY2kgMC4wMCAgICAgICAgICAgICAgLT4gMC4wMAorZHNiYXM2MDkgdG9TY2kgMC4wICAgICAgICAgICAgICAgLT4gMC4wCitkc2JhczYxMCB0b1NjaSAgLjAgICAgICAgICAgICAgICAtPiAwLjAKK2RzYmFzNjExIHRvU2NpIDAuICAgICAgICAgICAgICAgIC0+IDAKK2RzYmFzNjEyIHRvU2NpIC0uMCAgICAgICAgICAgICAgIC0+IC0wLjAKK2RzYmFzNjEzIHRvU2NpIC0wLiAgICAgICAgICAgICAgIC0+IC0wCitkc2JhczYxNCB0b1NjaSAtMC4wICAgICAgICAgICAgICAtPiAtMC4wCitkc2JhczYxNSB0b1NjaSAtMC4wMCAgICAgICAgICAgICAtPiAtMC4wMAorZHNiYXM2MTYgdG9TY2kgLTAuMDAwICAgICAgICAgICAgLT4gLTAuMDAwCitkc2JhczYxNyB0b1NjaSAtMC4wMDAwICAgICAgICAgICAtPiAtMC4wMDAwCitkc2JhczYxOCB0b1NjaSAtMC4wMDAwMCAgICAgICAgICAtPiAtMC4wMDAwMAorZHNiYXM2MTkgdG9TY2kgLTAuMDAwMDAwICAgICAgICAgLT4gLTAuMDAwMDAwCitkc2JhczYyMCB0b1NjaSAtMC4wMDAwMDAwICAgICAgICAtPiAtMEUtNworZHNiYXM2MjEgdG9TY2kgLTAuMDAwMDAwMDAgICAgICAgLT4gLTBFLTgKK2RzYmFzNjIyIHRvU2NpIC0wLjAwMDAwMDAwMCAgICAgIC0+IC0wRS05CisKK2RzYmFzNjMwIHRvU2NpICAwLjAwRSswICAgICAgICAgIC0+IDAuMDAKK2RzYmFzNjMxIHRvU2NpICAwLjAwRSsxICAgICAgICAgIC0+IDAuMAorZHNiYXM2MzIgdG9TY2kgIDAuMDBFKzIgICAgICAgICAgLT4gMAorZHNiYXM2MzMgdG9TY2kgIDAuMDBFKzMgICAgICAgICAgLT4gMEUrMQorZHNiYXM2MzQgdG9TY2kgIDAuMDBFKzQgICAgICAgICAgLT4gMEUrMgorZHNiYXM2MzUgdG9TY2kgIDAuMDBFKzUgICAgICAgICAgLT4gMEUrMworZHNiYXM2MzYgdG9TY2kgIDAuMDBFKzYgICAgICAgICAgLT4gMEUrNAorZHNiYXM2MzcgdG9TY2kgIDAuMDBFKzcgICAgICAgICAgLT4gMEUrNQorZHNiYXM2MzggdG9TY2kgIDAuMDBFKzggICAgICAgICAgLT4gMEUrNgorZHNiYXM2MzkgdG9TY2kgIDAuMDBFKzkgICAgICAgICAgLT4gMEUrNworCitkc2JhczY0MCB0b1NjaSAgMC4wRSswICAgICAgICAgICAtPiAwLjAKK2RzYmFzNjQxIHRvU2NpICAwLjBFKzEgICAgICAgICAgIC0+IDAKK2RzYmFzNjQyIHRvU2NpICAwLjBFKzIgICAgICAgICAgIC0+IDBFKzEKK2RzYmFzNjQzIHRvU2NpICAwLjBFKzMgICAgICAgICAgIC0+IDBFKzIKK2RzYmFzNjQ0IHRvU2NpICAwLjBFKzQgICAgICAgICAgIC0+IDBFKzMKK2RzYmFzNjQ1IHRvU2NpICAwLjBFKzUgICAgICAgICAgIC0+IDBFKzQKK2RzYmFzNjQ2IHRvU2NpICAwLjBFKzYgICAgICAgICAgIC0+IDBFKzUKK2RzYmFzNjQ3IHRvU2NpICAwLjBFKzcgICAgICAgICAgIC0+IDBFKzYKK2RzYmFzNjQ4IHRvU2NpICAwLjBFKzggICAgICAgICAgIC0+IDBFKzcKK2RzYmFzNjQ5IHRvU2NpICAwLjBFKzkgICAgICAgICAgIC0+IDBFKzgKKworZHNiYXM2NTAgdG9TY2kgIDBFKzAgICAgICAgICAgICAgLT4gMAorZHNiYXM2NTEgdG9TY2kgIDBFKzEgICAgICAgICAgICAgLT4gMEUrMQorZHNiYXM2NTIgdG9TY2kgIDBFKzIgICAgICAgICAgICAgLT4gMEUrMgorZHNiYXM2NTMgdG9TY2kgIDBFKzMgICAgICAgICAgICAgLT4gMEUrMworZHNiYXM2NTQgdG9TY2kgIDBFKzQgICAgICAgICAgICAgLT4gMEUrNAorZHNiYXM2NTUgdG9TY2kgIDBFKzUgICAgICAgICAgICAgLT4gMEUrNQorZHNiYXM2NTYgdG9TY2kgIDBFKzYgICAgICAgICAgICAgLT4gMEUrNgorZHNiYXM2NTcgdG9TY2kgIDBFKzcgICAgICAgICAgICAgLT4gMEUrNworZHNiYXM2NTggdG9TY2kgIDBFKzggICAgICAgICAgICAgLT4gMEUrOAorZHNiYXM2NTkgdG9TY2kgIDBFKzkgICAgICAgICAgICAgLT4gMEUrOQorCitkc2JhczY2MCB0b1NjaSAgMC4wRS0wICAgICAgICAgICAtPiAwLjAKK2RzYmFzNjYxIHRvU2NpICAwLjBFLTEgICAgICAgICAgIC0+IDAuMDAKK2RzYmFzNjYyIHRvU2NpICAwLjBFLTIgICAgICAgICAgIC0+IDAuMDAwCitkc2JhczY2MyB0b1NjaSAgMC4wRS0zICAgICAgICAgICAtPiAwLjAwMDAKK2RzYmFzNjY0IHRvU2NpICAwLjBFLTQgICAgICAgICAgIC0+IDAuMDAwMDAKK2RzYmFzNjY1IHRvU2NpICAwLjBFLTUgICAgICAgICAgIC0+IDAuMDAwMDAwCitkc2JhczY2NiB0b1NjaSAgMC4wRS02ICAgICAgICAgICAtPiAwRS03Citkc2JhczY2NyB0b1NjaSAgMC4wRS03ICAgICAgICAgICAtPiAwRS04Citkc2JhczY2OCB0b1NjaSAgMC4wRS04ICAgICAgICAgICAtPiAwRS05Citkc2JhczY2OSB0b1NjaSAgMC4wRS05ICAgICAgICAgICAtPiAwRS0xMAorCitkc2JhczY3MCB0b1NjaSAgMC4wMEUtMCAgICAgICAgICAtPiAwLjAwCitkc2JhczY3MSB0b1NjaSAgMC4wMEUtMSAgICAgICAgICAtPiAwLjAwMAorZHNiYXM2NzIgdG9TY2kgIDAuMDBFLTIgICAgICAgICAgLT4gMC4wMDAwCitkc2JhczY3MyB0b1NjaSAgMC4wMEUtMyAgICAgICAgICAtPiAwLjAwMDAwCitkc2JhczY3NCB0b1NjaSAgMC4wMEUtNCAgICAgICAgICAtPiAwLjAwMDAwMAorZHNiYXM2NzUgdG9TY2kgIDAuMDBFLTUgICAgICAgICAgLT4gMEUtNworZHNiYXM2NzYgdG9TY2kgIDAuMDBFLTYgICAgICAgICAgLT4gMEUtOAorZHNiYXM2NzcgdG9TY2kgIDAuMDBFLTcgICAgICAgICAgLT4gMEUtOQorZHNiYXM2NzggdG9TY2kgIDAuMDBFLTggICAgICAgICAgLT4gMEUtMTAKK2RzYmFzNjc5IHRvU2NpICAwLjAwRS05ICAgICAgICAgIC0+IDBFLTExCisKK2RzYmFzNjgwIHRvU2NpICAwMDAwMDAuICAgICAgICAgIC0+ICAwCitkc2JhczY4MSB0b1NjaSAgIDAwMDAwLiAgICAgICAgICAtPiAgMAorZHNiYXM2ODIgdG9TY2kgICAgMDAwMC4gICAgICAgICAgLT4gIDAKK2RzYmFzNjgzIHRvU2NpICAgICAwMDAuICAgICAgICAgIC0+ICAwCitkc2JhczY4NCB0b1NjaSAgICAgIDAwLiAgICAgICAgICAtPiAgMAorZHNiYXM2ODUgdG9TY2kgICAgICAgMC4gICAgICAgICAgLT4gIDAKK2RzYmFzNjg2IHRvU2NpICArMDAwMDAuICAgICAgICAgIC0+ICAwCitkc2JhczY4NyB0b1NjaSAgLTAwMDAwLiAgICAgICAgICAtPiAtMAorZHNiYXM2ODggdG9TY2kgICswLiAgICAgICAgICAgICAgLT4gIDAKK2RzYmFzNjg5IHRvU2NpICAtMC4gICAgICAgICAgICAgIC0+IC0wCisKKy0tIFNwZWNpYWxzCitkc2JhczcwMCB0b1NjaSAiTmFOIiAgICAgICAgICAgICAtPiBOYU4KK2RzYmFzNzAxIHRvU2NpICJuYW4iICAgICAgICAgICAgIC0+IE5hTgorZHNiYXM3MDIgdG9TY2kgIm5BbiIgICAgICAgICAgICAgLT4gTmFOCitkc2JhczcwMyB0b1NjaSAiTkFOIiAgICAgICAgICAgICAtPiBOYU4KK2RzYmFzNzA0IHRvU2NpICIrTmFOIiAgICAgICAgICAgIC0+IE5hTgorZHNiYXM3MDUgdG9TY2kgIituYW4iICAgICAgICAgICAgLT4gTmFOCitkc2JhczcwNiB0b1NjaSAiK25BbiIgICAgICAgICAgICAtPiBOYU4KK2RzYmFzNzA3IHRvU2NpICIrTkFOIiAgICAgICAgICAgIC0+IE5hTgorZHNiYXM3MDggdG9TY2kgIi1OYU4iICAgICAgICAgICAgLT4gLU5hTgorZHNiYXM3MDkgdG9TY2kgIi1uYW4iICAgICAgICAgICAgLT4gLU5hTgorZHNiYXM3MTAgdG9TY2kgIi1uQW4iICAgICAgICAgICAgLT4gLU5hTgorZHNiYXM3MTEgdG9TY2kgIi1OQU4iICAgICAgICAgICAgLT4gLU5hTgorZHNiYXM3MTIgdG9TY2kgJ05hTjAnICAgICAgICAgICAgLT4gTmFOCitkc2JhczcxMyB0b1NjaSAnTmFOMScgICAgICAgICAgICAtPiBOYU4xCitkc2JhczcxNCB0b1NjaSAnTmFOMTInICAgICAgICAgICAtPiBOYU4xMgorZHNiYXM3MTUgdG9TY2kgJ05hTjEyMycgICAgICAgICAgLT4gTmFOMTIzCitkc2JhczcxNiB0b1NjaSAnTmFOMTIzNCcgICAgICAgICAtPiBOYU4xMjM0Citkc2JhczcxNyB0b1NjaSAnTmFOMDEnICAgICAgICAgICAtPiBOYU4xCitkc2JhczcxOCB0b1NjaSAnTmFOMDEyJyAgICAgICAgICAtPiBOYU4xMgorZHNiYXM3MTkgdG9TY2kgJ05hTjAxMjMnICAgICAgICAgLT4gTmFOMTIzCitkc2JhczcyMCB0b1NjaSAnTmFOMDEyMzQnICAgICAgICAtPiBOYU4xMjM0Citkc2JhczcyMSB0b1NjaSAnTmFOMDAxJyAgICAgICAgICAtPiBOYU4xCitkc2JhczcyMiB0b1NjaSAnTmFOMDAxMicgICAgICAgICAtPiBOYU4xMgorZHNiYXM3MjMgdG9TY2kgJ05hTjAwMTIzJyAgICAgICAgLT4gTmFOMTIzCitkc2JhczcyNCB0b1NjaSAnTmFOMDAxMjM0JyAgICAgICAtPiBOYU4xMjM0Citkc2JhczcyNSB0b1NjaSAnTmFOMTIzNDU2Nzg5MDEyMzQ1NicgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczcyNiB0b1NjaSAnTmFOMTIzZSsxJyAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNzI3IHRvU2NpICdOYU4xMi40NScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM3MjggdG9TY2kgJ05hTi0xMicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczcyOSB0b1NjaSAnTmFOKzEyJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKKworZHNiYXM3MzAgdG9TY2kgInNOYU4iICAgICAgICAgICAgLT4gc05hTgorZHNiYXM3MzEgdG9TY2kgInNuYW4iICAgICAgICAgICAgLT4gc05hTgorZHNiYXM3MzIgdG9TY2kgIlNuQW4iICAgICAgICAgICAgLT4gc05hTgorZHNiYXM3MzMgdG9TY2kgIlNOQU4iICAgICAgICAgICAgLT4gc05hTgorZHNiYXM3MzQgdG9TY2kgIitzTmFOIiAgICAgICAgICAgLT4gc05hTgorZHNiYXM3MzUgdG9TY2kgIitzbmFuIiAgICAgICAgICAgLT4gc05hTgorZHNiYXM3MzYgdG9TY2kgIitTbkFuIiAgICAgICAgICAgLT4gc05hTgorZHNiYXM3MzcgdG9TY2kgIitTTkFOIiAgICAgICAgICAgLT4gc05hTgorZHNiYXM3MzggdG9TY2kgIi1zTmFOIiAgICAgICAgICAgLT4gLXNOYU4KK2RzYmFzNzM5IHRvU2NpICItc25hbiIgICAgICAgICAgIC0+IC1zTmFOCitkc2Jhczc0MCB0b1NjaSAiLVNuQW4iICAgICAgICAgICAtPiAtc05hTgorZHNiYXM3NDEgdG9TY2kgIi1TTkFOIiAgICAgICAgICAgLT4gLXNOYU4KK2RzYmFzNzQyIHRvU2NpICdzTmFOMDAwMCcgICAgICAgIC0+IHNOYU4KK2RzYmFzNzQzIHRvU2NpICdzTmFONycgICAgICAgICAgIC0+IHNOYU43Citkc2Jhczc0NCB0b1NjaSAnc05hTjAwNzIzNCcgICAgICAtPiBzTmFONzIzNAorZHNiYXM3NDUgdG9TY2kgJ3NOYU43MjM0NTYxMjM0NTY3ODkwJyAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNzQ2IHRvU2NpICdzTmFONzIuNDUnICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM3NDcgdG9TY2kgJ3NOYU4tNzInICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CisKK2RzYmFzNzQ4IHRvU2NpICJJbmYiICAgICAgICAgICAgIC0+IEluZmluaXR5Citkc2Jhczc0OSB0b1NjaSAiaW5mIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorZHNiYXM3NTAgdG9TY2kgImlOZiIgICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RzYmFzNzUxIHRvU2NpICJJTkYiICAgICAgICAgICAgIC0+IEluZmluaXR5Citkc2Jhczc1MiB0b1NjaSAiK0luZiIgICAgICAgICAgICAtPiBJbmZpbml0eQorZHNiYXM3NTMgdG9TY2kgIitpbmYiICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RzYmFzNzU0IHRvU2NpICIraU5mIiAgICAgICAgICAgIC0+IEluZmluaXR5Citkc2Jhczc1NSB0b1NjaSAiK0lORiIgICAgICAgICAgICAtPiBJbmZpbml0eQorZHNiYXM3NTYgdG9TY2kgIi1JbmYiICAgICAgICAgICAgLT4gLUluZmluaXR5Citkc2Jhczc1NyB0b1NjaSAiLWluZiIgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2RzYmFzNzU4IHRvU2NpICItaU5mIiAgICAgICAgICAgIC0+IC1JbmZpbml0eQorZHNiYXM3NTkgdG9TY2kgIi1JTkYiICAgICAgICAgICAgLT4gLUluZmluaXR5CisKK2RzYmFzNzYwIHRvU2NpICJJbmZpbml0eSIgICAgICAgIC0+IEluZmluaXR5Citkc2Jhczc2MSB0b1NjaSAiaW5maW5pdHkiICAgICAgICAtPiBJbmZpbml0eQorZHNiYXM3NjIgdG9TY2kgImlOZkluSXRZIiAgICAgICAgLT4gSW5maW5pdHkKK2RzYmFzNzYzIHRvU2NpICJJTkZJTklUWSIgICAgICAgIC0+IEluZmluaXR5Citkc2Jhczc2NCB0b1NjaSAiK0luZmluaXR5IiAgICAgICAtPiBJbmZpbml0eQorZHNiYXM3NjUgdG9TY2kgIitpbmZpbml0eSIgICAgICAgLT4gSW5maW5pdHkKK2RzYmFzNzY2IHRvU2NpICIraU5mSW5JdFkiICAgICAgIC0+IEluZmluaXR5Citkc2Jhczc2NyB0b1NjaSAiK0lORklOSVRZIiAgICAgICAtPiBJbmZpbml0eQorZHNiYXM3NjggdG9TY2kgIi1JbmZpbml0eSIgICAgICAgLT4gLUluZmluaXR5Citkc2Jhczc2OSB0b1NjaSAiLWluZmluaXR5IiAgICAgICAtPiAtSW5maW5pdHkKK2RzYmFzNzcwIHRvU2NpICItaU5mSW5JdFkiICAgICAgIC0+IC1JbmZpbml0eQorZHNiYXM3NzEgdG9TY2kgIi1JTkZJTklUWSIgICAgICAgLT4gLUluZmluaXR5CisKKy0tIFNwZWNpYWxzIGFuZCB6ZXJvcyBmb3IgdG9FbmcKK2RzYmFzdDc3MiB0b0VuZyAiTmFOIiAgICAgICAgICAgICAgLT4gTmFOCitkc2Jhc3Q3NzMgdG9FbmcgIi1JbmZpbml0eSIgICAgICAgIC0+IC1JbmZpbml0eQorZHNiYXN0Nzc0IHRvRW5nICItc05hTiIgICAgICAgICAgICAtPiAtc05hTgorZHNiYXN0Nzc1IHRvRW5nICItTmFOIiAgICAgICAgICAgICAtPiAtTmFOCitkc2Jhc3Q3NzYgdG9FbmcgIitJbmZpbml0eSIgICAgICAgIC0+IEluZmluaXR5Citkc2Jhc3Q3NzggdG9FbmcgIitzTmFOIiAgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzdDc3OSB0b0VuZyAiK05hTiIgICAgICAgICAgICAgLT4gTmFOCitkc2Jhc3Q3ODAgdG9FbmcgIklORklOSVRZIiAgICAgICAgIC0+IEluZmluaXR5Citkc2Jhc3Q3ODEgdG9FbmcgIlNOQU4iICAgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzdDc4MiB0b0VuZyAiTkFOIiAgICAgICAgICAgICAgLT4gTmFOCitkc2Jhc3Q3ODMgdG9FbmcgImluZmluaXR5IiAgICAgICAgIC0+IEluZmluaXR5Citkc2Jhc3Q3ODQgdG9FbmcgInNuYW4iICAgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzdDc4NSB0b0VuZyAibmFuIiAgICAgICAgICAgICAgLT4gTmFOCitkc2Jhc3Q3ODYgdG9FbmcgIkluRklOSVRZIiAgICAgICAgIC0+IEluZmluaXR5Citkc2Jhc3Q3ODcgdG9FbmcgIlNuQU4iICAgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzdDc4OCB0b0VuZyAibkFOIiAgICAgICAgICAgICAgLT4gTmFOCitkc2Jhc3Q3ODkgdG9FbmcgImlOZmluaXR5IiAgICAgICAgIC0+IEluZmluaXR5Citkc2Jhc3Q3OTAgdG9FbmcgInNOYW4iICAgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzdDc5MSB0b0VuZyAiTmFuIiAgICAgICAgICAgICAgLT4gTmFOCitkc2Jhc3Q3OTIgdG9FbmcgIkluZmluaXR5IiAgICAgICAgIC0+IEluZmluaXR5Citkc2Jhc3Q3OTMgdG9FbmcgInNOYU4iICAgICAgICAgICAgIC0+IHNOYU4KKworLS0gWmVybyB0b0VuZywgZXRjLgorZHNiYXN0ODAwIHRvRW5nIDBlKzEgICAgICAgICAgICAgIC0+ICIwLjAwRSszIiAgLS0gZG9jIGV4YW1wbGUKKworZHNiYXN0ODAxIHRvRW5nIDAuMDAwMDAwMDAwICAgICAgIC0+IDBFLTkKK2RzYmFzdDgwMiB0b0VuZyAwLjAwMDAwMDAwICAgICAgICAtPiAwLjAwRS02Citkc2Jhc3Q4MDMgdG9FbmcgMC4wMDAwMDAwICAgICAgICAgLT4gMC4wRS02Citkc2Jhc3Q4MDQgdG9FbmcgMC4wMDAwMDAgICAgICAgICAgLT4gMC4wMDAwMDAKK2RzYmFzdDgwNSB0b0VuZyAwLjAwMDAwICAgICAgICAgICAtPiAwLjAwMDAwCitkc2Jhc3Q4MDYgdG9FbmcgMC4wMDAwICAgICAgICAgICAgLT4gMC4wMDAwCitkc2Jhc3Q4MDcgdG9FbmcgMC4wMDAgICAgICAgICAgICAgLT4gMC4wMDAKK2RzYmFzdDgwOCB0b0VuZyAwLjAwICAgICAgICAgICAgICAtPiAwLjAwCitkc2Jhc3Q4MDkgdG9FbmcgMC4wICAgICAgICAgICAgICAgLT4gMC4wCitkc2Jhc3Q4MTAgdG9FbmcgIC4wICAgICAgICAgICAgICAgLT4gMC4wCitkc2Jhc3Q4MTEgdG9FbmcgMC4gICAgICAgICAgICAgICAgLT4gMAorZHNiYXN0ODEyIHRvRW5nIC0uMCAgICAgICAgICAgICAgIC0+IC0wLjAKK2RzYmFzdDgxMyB0b0VuZyAtMC4gICAgICAgICAgICAgICAtPiAtMAorZHNiYXN0ODE0IHRvRW5nIC0wLjAgICAgICAgICAgICAgIC0+IC0wLjAKK2RzYmFzdDgxNSB0b0VuZyAtMC4wMCAgICAgICAgICAgICAtPiAtMC4wMAorZHNiYXN0ODE2IHRvRW5nIC0wLjAwMCAgICAgICAgICAgIC0+IC0wLjAwMAorZHNiYXN0ODE3IHRvRW5nIC0wLjAwMDAgICAgICAgICAgIC0+IC0wLjAwMDAKK2RzYmFzdDgxOCB0b0VuZyAtMC4wMDAwMCAgICAgICAgICAtPiAtMC4wMDAwMAorZHNiYXN0ODE5IHRvRW5nIC0wLjAwMDAwMCAgICAgICAgIC0+IC0wLjAwMDAwMAorZHNiYXN0ODIwIHRvRW5nIC0wLjAwMDAwMDAgICAgICAgIC0+IC0wLjBFLTYKK2RzYmFzdDgyMSB0b0VuZyAtMC4wMDAwMDAwMCAgICAgICAtPiAtMC4wMEUtNgorZHNiYXN0ODIyIHRvRW5nIC0wLjAwMDAwMDAwMCAgICAgIC0+IC0wRS05CisKK2RzYmFzdDgzMCB0b0VuZyAgMC4wMEUrMCAgICAgICAgICAtPiAwLjAwCitkc2Jhc3Q4MzEgdG9FbmcgIDAuMDBFKzEgICAgICAgICAgLT4gMC4wCitkc2Jhc3Q4MzIgdG9FbmcgIDAuMDBFKzIgICAgICAgICAgLT4gMAorZHNiYXN0ODMzIHRvRW5nICAwLjAwRSszICAgICAgICAgIC0+IDAuMDBFKzMKK2RzYmFzdDgzNCB0b0VuZyAgMC4wMEUrNCAgICAgICAgICAtPiAwLjBFKzMKK2RzYmFzdDgzNSB0b0VuZyAgMC4wMEUrNSAgICAgICAgICAtPiAwRSszCitkc2Jhc3Q4MzYgdG9FbmcgIDAuMDBFKzYgICAgICAgICAgLT4gMC4wMEUrNgorZHNiYXN0ODM3IHRvRW5nICAwLjAwRSs3ICAgICAgICAgIC0+IDAuMEUrNgorZHNiYXN0ODM4IHRvRW5nICAwLjAwRSs4ICAgICAgICAgIC0+IDBFKzYKK2RzYmFzdDgzOSB0b0VuZyAgMC4wMEUrOSAgICAgICAgICAtPiAwLjAwRSs5CisKK2RzYmFzdDg0MCB0b0VuZyAgMC4wRSswICAgICAgICAgICAtPiAwLjAKK2RzYmFzdDg0MSB0b0VuZyAgMC4wRSsxICAgICAgICAgICAtPiAwCitkc2Jhc3Q4NDIgdG9FbmcgIDAuMEUrMiAgICAgICAgICAgLT4gMC4wMEUrMworZHNiYXN0ODQzIHRvRW5nICAwLjBFKzMgICAgICAgICAgIC0+IDAuMEUrMworZHNiYXN0ODQ0IHRvRW5nICAwLjBFKzQgICAgICAgICAgIC0+IDBFKzMKK2RzYmFzdDg0NSB0b0VuZyAgMC4wRSs1ICAgICAgICAgICAtPiAwLjAwRSs2Citkc2Jhc3Q4NDYgdG9FbmcgIDAuMEUrNiAgICAgICAgICAgLT4gMC4wRSs2Citkc2Jhc3Q4NDcgdG9FbmcgIDAuMEUrNyAgICAgICAgICAgLT4gMEUrNgorZHNiYXN0ODQ4IHRvRW5nICAwLjBFKzggICAgICAgICAgIC0+IDAuMDBFKzkKK2RzYmFzdDg0OSB0b0VuZyAgMC4wRSs5ICAgICAgICAgICAtPiAwLjBFKzkKKworZHNiYXN0ODUwIHRvRW5nICAwRSswICAgICAgICAgICAgIC0+IDAKK2RzYmFzdDg1MSB0b0VuZyAgMEUrMSAgICAgICAgICAgICAtPiAwLjAwRSszCitkc2Jhc3Q4NTIgdG9FbmcgIDBFKzIgICAgICAgICAgICAgLT4gMC4wRSszCitkc2Jhc3Q4NTMgdG9FbmcgIDBFKzMgICAgICAgICAgICAgLT4gMEUrMworZHNiYXN0ODU0IHRvRW5nICAwRSs0ICAgICAgICAgICAgIC0+IDAuMDBFKzYKK2RzYmFzdDg1NSB0b0VuZyAgMEUrNSAgICAgICAgICAgICAtPiAwLjBFKzYKK2RzYmFzdDg1NiB0b0VuZyAgMEUrNiAgICAgICAgICAgICAtPiAwRSs2Citkc2Jhc3Q4NTcgdG9FbmcgIDBFKzcgICAgICAgICAgICAgLT4gMC4wMEUrOQorZHNiYXN0ODU4IHRvRW5nICAwRSs4ICAgICAgICAgICAgIC0+IDAuMEUrOQorZHNiYXN0ODU5IHRvRW5nICAwRSs5ICAgICAgICAgICAgIC0+IDBFKzkKKworZHNiYXN0ODYwIHRvRW5nICAwLjBFLTAgICAgICAgICAgIC0+IDAuMAorZHNiYXN0ODYxIHRvRW5nICAwLjBFLTEgICAgICAgICAgIC0+IDAuMDAKK2RzYmFzdDg2MiB0b0VuZyAgMC4wRS0yICAgICAgICAgICAtPiAwLjAwMAorZHNiYXN0ODYzIHRvRW5nICAwLjBFLTMgICAgICAgICAgIC0+IDAuMDAwMAorZHNiYXN0ODY0IHRvRW5nICAwLjBFLTQgICAgICAgICAgIC0+IDAuMDAwMDAKK2RzYmFzdDg2NSB0b0VuZyAgMC4wRS01ICAgICAgICAgICAtPiAwLjAwMDAwMAorZHNiYXN0ODY2IHRvRW5nICAwLjBFLTYgICAgICAgICAgIC0+IDAuMEUtNgorZHNiYXN0ODY3IHRvRW5nICAwLjBFLTcgICAgICAgICAgIC0+IDAuMDBFLTYKK2RzYmFzdDg2OCB0b0VuZyAgMC4wRS04ICAgICAgICAgICAtPiAwRS05Citkc2Jhc3Q4NjkgdG9FbmcgIDAuMEUtOSAgICAgICAgICAgLT4gMC4wRS05CisKK2RzYmFzdDg3MCB0b0VuZyAgMC4wMEUtMCAgICAgICAgICAtPiAwLjAwCitkc2Jhc3Q4NzEgdG9FbmcgIDAuMDBFLTEgICAgICAgICAgLT4gMC4wMDAKK2RzYmFzdDg3MiB0b0VuZyAgMC4wMEUtMiAgICAgICAgICAtPiAwLjAwMDAKK2RzYmFzdDg3MyB0b0VuZyAgMC4wMEUtMyAgICAgICAgICAtPiAwLjAwMDAwCitkc2Jhc3Q4NzQgdG9FbmcgIDAuMDBFLTQgICAgICAgICAgLT4gMC4wMDAwMDAKK2RzYmFzdDg3NSB0b0VuZyAgMC4wMEUtNSAgICAgICAgICAtPiAwLjBFLTYKK2RzYmFzdDg3NiB0b0VuZyAgMC4wMEUtNiAgICAgICAgICAtPiAwLjAwRS02Citkc2Jhc3Q4NzcgdG9FbmcgIDAuMDBFLTcgICAgICAgICAgLT4gMEUtOQorZHNiYXN0ODc4IHRvRW5nICAwLjAwRS04ICAgICAgICAgIC0+IDAuMEUtOQorZHNiYXN0ODc5IHRvRW5nICAwLjAwRS05ICAgICAgICAgIC0+IDAuMDBFLTkKKworLS0gbG9uZyBpbnB1dCBzdHJpbmdzCitkc2JhczgwMSB0b3NjaSAgICAgICAgICAnMDEyMzQ1NjcnIC0+IDEyMzQ1NjcKK2RzYmFzODAyIHRvc2NpICAgICAgICAgJzAwMTIzNDU2NycgLT4gMTIzNDU2NworZHNiYXM4MDMgdG9zY2kgICAgICAgICcwMDAxMjM0NTY3JyAtPiAxMjM0NTY3Citkc2JhczgwNCB0b3NjaSAgICAgICAnMDAwMDEyMzQ1NjcnIC0+IDEyMzQ1NjcKK2RzYmFzODA1IHRvc2NpICAgICAgJzAwMDAwMTIzNDU2NycgLT4gMTIzNDU2NworZHNiYXM4MDYgdG9zY2kgICAgICcwMDAwMDAxMjM0NTY3JyAtPiAxMjM0NTY3Citkc2JhczgwNyB0b3NjaSAgICAnMDAwMDAwMDEyMzQ1NjcnIC0+IDEyMzQ1NjcKK2RzYmFzODA4IHRvc2NpICAgJzAwMDAwMDAwMTIzNDU2NycgLT4gMTIzNDU2NworZHNiYXM4MDkgdG9zY2kgICcwMDAwMDAwMDAxMjM0NTY3JyAtPiAxMjM0NTY3Citkc2JhczgxMCB0b3NjaSAnMDAwMDAwMDAwMDEyMzQ1NjcnIC0+IDEyMzQ1NjcKKworZHNiYXM4MTEgdG9zY2kgICAgICAgICAgJzAuMTIzNDU2NycgLT4gICAgICAwLjEyMzQ1NjcKK2RzYmFzODEyIHRvc2NpICAgICAgICAgJzAuMDEyMzQ1NjcnIC0+ICAgICAwLjAxMjM0NTY3Citkc2JhczgxMyB0b3NjaSAgICAgICAgJzAuMDAxMjM0NTY3JyAtPiAgICAwLjAwMTIzNDU2NworZHNiYXM4MTQgdG9zY2kgICAgICAgJzAuMDAwMTIzNDU2NycgLT4gICAwLjAwMDEyMzQ1NjcKK2RzYmFzODE1IHRvc2NpICAgICAgJzAuMDAwMDEyMzQ1NjcnIC0+ICAwLjAwMDAxMjM0NTY3Citkc2JhczgxNiB0b3NjaSAgICAgJzAuMDAwMDAxMjM0NTY3JyAtPiAwLjAwMDAwMTIzNDU2NworZHNiYXM4MTcgdG9zY2kgICAgJzAuMDAwMDAwMTIzNDU2NycgLT4gICAgICAgMS4yMzQ1NjdFLTcKK2RzYmFzODE4IHRvc2NpICAgJzAuMDAwMDAwMDEyMzQ1NjcnIC0+ICAgICAgIDEuMjM0NTY3RS04Citkc2JhczgxOSB0b3NjaSAgJzAuMDAwMDAwMDAxMjM0NTY3JyAtPiAgICAgICAxLjIzNDU2N0UtOQorZHNiYXM4MjAgdG9zY2kgJzAuMDAwMDAwMDAwMTIzNDU2NycgLT4gICAgICAgMS4yMzQ1NjdFLTEwCisKK2RzYmFzODIxIHRvc2NpICcxMjM0NTY3OTAnICAgICAgICAgLT4gMS4yMzQ1NjhFKzggSW5leGFjdCBSb3VuZGVkCitkc2JhczgyMiB0b3NjaSAnMTIzNDU2NzkwMScgICAgICAgIC0+IDEuMjM0NTY4RSs5ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzODIzIHRvc2NpICcxMjM0NTY3OTAxMicgICAgICAgLT4gMS4yMzQ1NjhFKzEwIEluZXhhY3QgUm91bmRlZAorZHNiYXM4MjQgdG9zY2kgJzEyMzQ1Njc5MDEyMycgICAgICAtPiAxLjIzNDU2OEUrMTEgSW5leGFjdCBSb3VuZGVkCitkc2JhczgyNSB0b3NjaSAnMTIzNDU2NzkwMTIzNCcgICAgIC0+IDEuMjM0NTY4RSsxMiBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzODI2IHRvc2NpICcxMjM0NTY3OTAxMjM0NScgICAgLT4gMS4yMzQ1NjhFKzEzIEluZXhhY3QgUm91bmRlZAorZHNiYXM4MjcgdG9zY2kgJzEyMzQ1Njc5MDEyMzQ1NicgICAtPiAxLjIzNDU2OEUrMTQgSW5leGFjdCBSb3VuZGVkCitkc2JhczgyOCB0b3NjaSAnMTIzNDU2NzkwMTIzNDU2NycgIC0+IDEuMjM0NTY4RSsxNSBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzODI5IHRvc2NpICcxMjM0NTY3ODkwMTIzNDU2JyAgLT4gMS4yMzQ1NjhFKzE1IEluZXhhY3QgUm91bmRlZAorCistLSBzdWJub3JtYWxzIGFuZCBvdmVyZmxvd3MKK2RzYmFzOTA2IHRvU2NpICc5OWU5OTk5OTk5OTknICAgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTA3IHRvU2NpICc5OTllOTk5OTk5OTk5JyAgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTA4IHRvU2NpICcwLjllLTk5OTk5OTk5OScgICAgIC0+IDBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkc2JhczkwOSB0b1NjaSAnMC4wOWUtOTk5OTk5OTk5JyAgICAtPiAwRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiYXM5MTAgdG9TY2kgJzAuMWUxMDAwMDAwMDAwJyAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHNiYXM5MTEgdG9TY2kgJzEwZS0xMDAwMDAwMDAwJyAgICAgLT4gMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzOTEyIHRvU2NpICcwLjllOTk5OTk5OTk5OScgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTEzIHRvU2NpICc5OWUtOTk5OTk5OTk5OScgICAgIC0+IDBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkc2JhczkxNCB0b1NjaSAnMTExZTk5OTk5OTk5OTknICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkc2JhczkxNSB0b1NjaSAnMTExMWUtOTk5OTk5OTk5OScgICAtPiAwRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiYXM5MTYgdG9TY2kgJzExMTFlLTk5OTk5OTk5OTk5JyAgLT4gMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzOTE3IHRvU2NpICc3ZTEwMDAwMDAwMDAnICAgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5lZ2F0aXZlcyB0aGUgc2FtZQorZHNiYXM5MTggdG9TY2kgJy05OWU5OTk5OTk5OTknICAgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTE5IHRvU2NpICctOTk5ZTk5OTk5OTk5OScgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkc2JhczkyMCB0b1NjaSAnLTAuOWUtOTk5OTk5OTk5JyAgICAtPiAtMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzOTIxIHRvU2NpICctMC4wOWUtOTk5OTk5OTk5JyAgIC0+IC0wRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiYXM5MjIgdG9TY2kgJy0wLjFlMTAwMDAwMDAwMCcgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTIzIHRvU2NpICctMTBlLTEwMDAwMDAwMDAnICAgIC0+IC0wRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiYXM5MjQgdG9TY2kgJy0wLjllOTk5OTk5OTk5OScgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTI1IHRvU2NpICctOTllLTk5OTk5OTk5OTknICAgIC0+IC0wRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiYXM5MjYgdG9TY2kgJy0xMTFlOTk5OTk5OTk5OScgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTI3IHRvU2NpICctMTExMWUtOTk5OTk5OTk5OScgIC0+IC0wRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiYXM5MjggdG9TY2kgJy0xMTExZS05OTk5OTk5OTk5OScgLT4gLTBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkc2JhczkyOSB0b1NjaSAnLTdlMTAwMDAwMDAwMCcgICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorCistLSBvdmVyZmxvdyByZXN1bHRzIGF0IGRpZmZlcmVudCByb3VuZGluZyBtb2Rlcworcm91bmRpbmc6ICBjZWlsaW5nCitkc2JhczkzMCB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHNiYXM5MzEgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLTkuOTk5OTk5RSs5NiBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIHVwCitkc2JhczkzMiB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHNiYXM5MzMgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgZG93bgorZHNiYXM5MzQgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIDkuOTk5OTk5RSs5NiBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkc2JhczkzNSB0b1NjaSAnLTdlMTAwMDAnICAtPiAtOS45OTk5OTlFKzk2IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgZmxvb3IKK2RzYmFzOTM2IHRvU2NpICAnN2UxMDAwMCcgIC0+ICA5Ljk5OTk5OUUrOTYgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHNiYXM5MzcgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICBoYWxmX3VwCitkc2JhczkzOCB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHNiYXM5MzkgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitkc2Jhczk0MCB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHNiYXM5NDEgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgaGFsZl9kb3duCitkc2Jhczk0MiB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHNiYXM5NDMgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICBoYWxmX2V2ZW4KKworLS0gTm93IGNoZWNrIDg1NC83NTRyIHNvbWUgc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93IHRvIDAKK2RzYmVtNDAwIHRvU2NpICAxLjAwMDBFLTg2ICAgICAtPiAxLjAwMDBFLTg2Citkc2JlbTQwMSB0b1NjaSAgMC4xRS05NyAgICAgICAgLT4gMUUtOTggICAgICAgU3Vibm9ybWFsCitkc2JlbTQwMiB0b1NjaSAgMC4xMDAwRS05NyAgICAgLT4gMS4wMDBFLTk4ICAgU3Vibm9ybWFsCitkc2JlbTQwMyB0b1NjaSAgMC4wMTAwRS05NyAgICAgLT4gMS4wMEUtOTkgICAgU3Vibm9ybWFsCitkc2JlbTQwNCB0b1NjaSAgMC4wMDEwRS05NyAgICAgLT4gMS4wRS0xMDAgICAgIFN1Ym5vcm1hbAorZHNiZW00MDUgdG9TY2kgIDAuMDAwMUUtOTcgICAgIC0+IDFFLTEwMSAgICAgICBTdWJub3JtYWwKK2RzYmVtNDA2IHRvU2NpICAwLjAwMDEwRS05NyAgICAtPiAxRS0xMDEgICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkc2JlbTQwNyB0b1NjaSAgMC4wMDAxM0UtOTcgICAgLT4gMUUtMTAxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00MDggdG9TY2kgIDAuMDAwMTVFLTk3ICAgIC0+IDJFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDA5IHRvU2NpICAwLjAwMDE3RS05NyAgICAtPiAyRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQxMCB0b1NjaSAgMC4wMDAyM0UtOTcgICAgLT4gMkUtMTAxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00MTEgdG9TY2kgIDAuMDAwMjVFLTk3ICAgIC0+IDJFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDEyIHRvU2NpICAwLjAwMDI3RS05NyAgICAtPiAzRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQxMyB0b1NjaSAgMC4wMDAxNDlFLTk3ICAgLT4gMUUtMTAxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00MTQgdG9TY2kgIDAuMDAwMTUwRS05NyAgIC0+IDJFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDE1IHRvU2NpICAwLjAwMDE1MUUtOTcgICAtPiAyRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQxNiB0b1NjaSAgMC4wMDAyNDlFLTk3ICAgLT4gMkUtMTAxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00MTcgdG9TY2kgIDAuMDAwMjUwRS05NyAgIC0+IDJFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDE4IHRvU2NpICAwLjAwMDI1MUUtOTcgICAtPiAzRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQxOSB0b1NjaSAgMC4wMDAwOUUtOTcgICAgLT4gMUUtMTAxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00MjAgdG9TY2kgIDAuMDAwMDVFLTk3ICAgIC0+IDBFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiZW00MjEgdG9TY2kgIDAuMDAwMDNFLTk3ICAgIC0+IDBFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiZW00MjIgdG9TY2kgIDAuMDAwMDA5RS05NyAgIC0+IDBFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiZW00MjMgdG9TY2kgIDAuMDAwMDA1RS05NyAgIC0+IDBFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiZW00MjQgdG9TY2kgIDAuMDAwMDAzRS05NyAgIC0+IDBFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitkc2JlbTQyNSB0b1NjaSAgMC4wMDEwNDlFLTk3ICAgLT4gMS4wRS0xMDAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00MjYgdG9TY2kgIDAuMDAxMDUwRS05NyAgIC0+IDEuMEUtMTAwICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDI3IHRvU2NpICAwLjAwMTA1MUUtOTcgICAtPiAxLjFFLTEwMCAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQyOCB0b1NjaSAgMC4wMDExNDlFLTk3ICAgLT4gMS4xRS0xMDAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00MjkgdG9TY2kgIDAuMDAxMTUwRS05NyAgIC0+IDEuMkUtMTAwICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDMwIHRvU2NpICAwLjAwMTE1MUUtOTcgICAtPiAxLjJFLTEwMCAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RzYmVtNDMyIHRvU2NpICAwLjAxMDA0OUUtOTcgICAtPiAxLjAwRS05OSAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDMzIHRvU2NpICAwLjAxMDA1MEUtOTcgICAtPiAxLjAwRS05OSAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDM0IHRvU2NpICAwLjAxMDA1MUUtOTcgICAtPiAxLjAxRS05OSAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDM1IHRvU2NpICAwLjAxMDE0OUUtOTcgICAtPiAxLjAxRS05OSAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDM2IHRvU2NpICAwLjAxMDE1MEUtOTcgICAtPiAxLjAyRS05OSAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDM3IHRvU2NpICAwLjAxMDE1MUUtOTcgICAtPiAxLjAyRS05OSAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZHNiZW00NDAgdG9TY2kgIDAuMTAxMDNFLTk3ICAgIC0+IDEuMDEwRS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NDEgdG9TY2kgIDAuMTAxMDVFLTk3ICAgIC0+IDEuMDEwRS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NDIgdG9TY2kgIDAuMTAxMDdFLTk3ICAgIC0+IDEuMDExRS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NDMgdG9TY2kgIDAuMTAxMTNFLTk3ICAgIC0+IDEuMDExRS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NDQgdG9TY2kgIDAuMTAxMTVFLTk3ICAgIC0+IDEuMDEyRS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NDUgdG9TY2kgIDAuMTAxMTdFLTk3ICAgIC0+IDEuMDEyRS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkc2JlbTQ1MCB0b1NjaSAgMS4xMDczMEUtOTggICAgLT4gMS4xMDdFLTk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQ1MSB0b1NjaSAgMS4xMDc1MEUtOTggICAgLT4gMS4xMDhFLTk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQ1MiB0b1NjaSAgMS4xMDc3MEUtOTggICAgLT4gMS4xMDhFLTk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQ1MyB0b1NjaSAgMS4xMDgzMEUtOTggICAgLT4gMS4xMDhFLTk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQ1NCB0b1NjaSAgMS4xMDg1MEUtOTggICAgLT4gMS4xMDhFLTk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQ1NSB0b1NjaSAgMS4xMDg3MEUtOTggICAgLT4gMS4xMDlFLTk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIG1ha2Ugc3VyZSBzaWduIE9LCitkc2JlbTQ1NiB0b1NjaSAgLTAuMTAxMDNFLTk3ICAgLT4gLTEuMDEwRS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NTcgdG9TY2kgIC0wLjEwMTA1RS05NyAgIC0+IC0xLjAxMEUtOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDU4IHRvU2NpICAtMC4xMDEwN0UtOTcgICAtPiAtMS4wMTFFLTk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQ1OSB0b1NjaSAgLTAuMTAxMTNFLTk3ICAgLT4gLTEuMDExRS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NjAgdG9TY2kgIC0wLjEwMTE1RS05NyAgIC0+IC0xLjAxMkUtOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDYxIHRvU2NpICAtMC4xMDExN0UtOTcgICAtPiAtMS4wMTJFLTk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tICc5OTlzJyBjYXNlcworZHNiZW00NjQgdG9TY2kgIDk5OTk5OUUtOTggICAgICAgICAtPiA5Ljk5OTk5RS05MworZHNiZW00NjUgdG9TY2kgIDk5OTk5LjBFLTk3ICAgICAgICAtPiA5Ljk5OTkwRS05MworZHNiZW00NjYgdG9TY2kgIDk5OTk5LkUtOTcgICAgICAgICAtPiA5Ljk5OTlFLTkzCitkc2JlbTQ2NyB0b1NjaSAgOTk5OS45RS05NyAgICAgICAgIC0+IDkuOTk5OUUtOTQKK2RzYmVtNDY4IHRvU2NpICA5OTkuOTlFLTk3ICAgICAgICAgLT4gOS45OTk5RS05NQorZHNiZW00NjkgdG9TY2kgIDk5Ljk5OUUtOTcgICAgICAgICAtPiA5Ljk5OTlFLTk2IFN1Ym5vcm1hbAorZHNiZW00NzAgdG9TY2kgIDkuOTk5OUUtOTcgICAgICAgICAtPiA5Ljk5OTlFLTk3IFN1Ym5vcm1hbAorZHNiZW00NzEgdG9TY2kgIDAuOTk5OTlFLTk3ICAgICAgICAtPiAxLjAwMDBFLTk3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQ3MiB0b1NjaSAgMC4wOTk5OTlFLTk3ICAgICAgIC0+IDEuMDAwRS05OCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDczIHRvU2NpICAwLjAwOTk5OTlFLTk3ICAgICAgLT4gMS4wMEUtOTkgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NzQgdG9TY2kgIDAuMDAwOTk5OTlFLTk3ICAgICAtPiAxLjBFLTEwMCAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQ3NSB0b1NjaSAgMC4wMDAwOTk5OTlFLTk3ICAgIC0+IDFFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDc2IHRvU2NpICAwLjAwMDAwOTk5OTlFLTk3ICAgLT4gMEUtMTAxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkc2JlbTQ3NyB0b1NjaSAgMC4wMDAwMDA5OTk5OUUtOTcgIC0+IDBFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiZW00NzggdG9TY2kgIDAuMDAwMDAwMDk5OTk5RS05NyAtPiAwRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gRXhwb25lbnRzIHdpdGggaW5zaWduaWZpY2FudCBsZWFkaW5nIHplcm9zCitkc2JhczEwMDEgdG9TY2kgIDFlOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHNiYXMxMDAyIHRvU2NpICAxZTA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkc2JhczEwMDMgdG9TY2kgIDFlMDA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkc2JhczEwMDQgdG9TY2kgIDFlMDAwOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHNiYXMxMDA1IHRvU2NpICAxZTAwMDAwMDAwMDAwMDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMTAwNiB0b1NjaSAgMWUwMDAwMDAwMDAwMDEwMDAwMDAwMDcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkc2JhczEwMDcgdG9TY2kgIDFlLTk5OTk5OTk5OSAtPiAwRS0xMDEgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiYXMxMDA4IHRvU2NpICAxZS0wOTk5OTk5OTk5IC0+IDBFLTEwMSAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzMTAwOSB0b1NjaSAgMWUtMDA5OTk5OTk5OTkgLT4gMEUtMTAxICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkc2JhczEwMTAgdG9TY2kgIDFlLTAwMDk5OTk5OTk5OSAtPiAwRS0xMDEgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiYXMxMDExIHRvU2NpICAxZS0wMDAwMDAwMDAwMDA5OTk5OTk5OTkgLT4gMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzMTAxMiB0b1NjaSAgMWUtMDAwMDAwMDAwMDAxMDAwMDAwMDA3IC0+IDBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitkc2JhczEwNDEgdG9TY2kgICAgIDEuMTE1MjQ0NEUtOTYgLT4gIDEuMTE1MjRFLTk2IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93Citkc2JhczEwNDIgdG9TY2kgICAgIDEuMTE1MjQ0NUUtOTYgLT4gIDEuMTE1MjRFLTk2IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93Citkc2JhczEwNDMgdG9TY2kgICAgIDEuMTE1MjQ0NkUtOTYgLT4gIDEuMTE1MjRFLTk2IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIGNsYW1wZWQgemVyb3MgW3NlZSBhbHNvIGNsYW1wLmRlY1Rlc3RdCitkc2JhczEwNzUgdG9TY2kgICAwZSsxMDAwMCAgLT4gIDBFKzkwICAgQ2xhbXBlZAorZHNiYXMxMDc2IHRvU2NpICAgMGUtMTAwMDAgIC0+ICAwRS0xMDEgIENsYW1wZWQKK2RzYmFzMTA3NyB0b1NjaSAgLTBlKzEwMDAwICAtPiAtMEUrOTAgICBDbGFtcGVkCitkc2JhczEwNzggdG9TY2kgIC0wZS0xMDAwMCAgLT4gLTBFLTEwMSAgQ2xhbXBlZAorCistLSBleHRyZW1lIHZhbHVlcyBmcm9tIG5leHQtd2lkZXIKK2RzYmFzMTEwMSB0b1NjaSAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkc2JhczExMDIgdG9TY2kgLTFFLTM4MyAtPiAtMEUtMTAxIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2RzYmFzMTEwMyB0b1NjaSAtMUUtMzk4IC0+IC0wRS0xMDEgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZHNiYXMxMTA0IHRvU2NpIC0wIC0+IC0wCitkc2JhczExMDUgdG9TY2kgKzAgLT4gIDAKK2RzYmFzMTEwNiB0b1NjaSArMUUtMzk4IC0+ICAwRS0xMDEgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZHNiYXMxMTA3IHRvU2NpICsxRS0zODMgLT4gIDBFLTEwMSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitkc2JhczExMDggdG9TY2kgKzkuOTk5OTk5OTk5OTk5OTk5RSszODQgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLSBuYXJyb3dpbmcgY2FzZQorZHNiYXMxMTEwIHRvU2NpIDIuMDAwMDAwMDAwMDAwMDAwRS05OSAtPiAyLjAwRS05OSBSb3VuZGVkIFN1Ym5vcm1hbApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kc0VuY29kZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kc0VuY29kZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxODU3OGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RzRW5jb2RlLmRlY1Rlc3QKQEAgLTAsMCArMSwzNzIgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHNFbmNvZGUuZGVjVGVzdCAtLSBkZWNpbWFsIGZvdXItYnl0ZSBmb3JtYXQgdGVzdGNhc2VzICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMCwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gW1ByZXZpb3VzbHkgY2FsbGVkIGRlY2ltYWwzMi5kZWNUZXN0XQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyBpcyBmb3IgdGhlIGZvdXItYnl0ZSBjb25jcmV0ZSByZXByZXNlbnRhdGlvbi4KKy0tIEl0cyBjaGFyYWN0ZXJpc3RpY3MgYXJlOgorLS0KKy0tICAxIGJpdCAgc2lnbgorLS0gIDUgYml0cyBjb21iaW5hdGlvbiBmaWVsZAorLS0gIDYgYml0cyBleHBvbmVudCBjb250aW51YXRpb24KKy0tIDIwIGJpdHMgY29lZmZpY2llbnQgY29udGludWF0aW9uCistLQorLS0gVG90YWwgZXhwb25lbnQgbGVuZ3RoIDggYml0cworLS0gVG90YWwgY29lZmZpY2llbnQgbGVuZ3RoIDI0IGJpdHMgKDcgZGlnaXRzKQorLS0KKy0tIEVsaW1pdCA9ICAxOTEgKG1heGltdW0gZW5jb2RlZCBleHBvbmVudCkKKy0tIEVtYXggICA9ICAgOTYgKGxhcmdlc3QgZXhwb25lbnQgdmFsdWUpCistLSBFbWluICAgPSAgLTk1IChzbWFsbGVzdCBleHBvbmVudCB2YWx1ZSkKKy0tIGJpYXMgICA9ICAxMDEgKHN1YnRyYWN0ZWQgZnJvbSBlbmNvZGVkIGV4cG9uZW50KSA9IC1FdGlueQorCistLSBUaGUgdGVzdGNhc2VzIGhlcmUgaGF2ZSBvbmx5IGV4YWN0bHkgcmVwcmVzZW50YWJsZSBkYXRhIG9uIHRoZQorLS0gJ2xlZnQtaGFuZC1zaWRlJzsgcm91bmRpbmcgZnJvbSBzdHJpbmdzIGlzIHRlc3RlZCBpbiAnYmFzZScKKy0tIHRlc3RjYXNlIGdyb3Vwcy4KKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgNworcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5NgorbWluRXhwb25lbnQ6IC05NQorCistLSBHZW5lcmFsIHRlc3RjYXNlcworLS0gKG1vc3RseSBkZXJpdmVkIGZyb20gdGhlIFN0cmF3bWFuIDQgZG9jdW1lbnQgYW5kIGV4YW1wbGVzKQorZGVjczAwMSBhcHBseSAgICNBMjMwMDNEMCAgICAgICAgICAtPiAtNy41MAorZGVjczAwMiBhcHBseSAgIC03LjUwICAgICAgICAgICAgICAtPiAjQTIzMDAzRDAKKy0tIGRlcml2YXRpdmUgY2Fub25pY2FsIHBsYWluIHN0cmluZ3MKK2RlY3MwMDMgYXBwbHkgICAjQTI2MDAzRDAgICAgICAgICAtPiAtNy41MEUrMworZGVjczAwNCBhcHBseSAgIC03LjUwRSszICAgICAgICAgIC0+ICNBMjYwMDNEMAorZGVjczAwNSBhcHBseSAgICNBMjUwMDNEMCAgICAgICAgIC0+IC03NTAKK2RlY3MwMDYgYXBwbHkgICAtNzUwICAgICAgICAgICAgICAtPiAjQTI1MDAzRDAKK2RlY3MwMDcgYXBwbHkgICAjQTI0MDAzRDAgICAgICAgICAtPiAtNzUuMAorZGVjczAwOCBhcHBseSAgIC03NS4wICAgICAgICAgICAgIC0+ICNBMjQwMDNEMAorZGVjczAwOSBhcHBseSAgICNBMjIwMDNEMCAgICAgICAgIC0+IC0wLjc1MAorZGVjczAxMCBhcHBseSAgIC0wLjc1MCAgICAgICAgICAgIC0+ICNBMjIwMDNEMAorZGVjczAxMSBhcHBseSAgICNBMjEwMDNEMCAgICAgICAgIC0+IC0wLjA3NTAKK2RlY3MwMTIgYXBwbHkgICAtMC4wNzUwICAgICAgICAgICAtPiAjQTIxMDAzRDAKK2RlY3MwMTMgYXBwbHkgICAjQTFmMDAzRDAgICAgICAgICAtPiAtMC4wMDA3NTAKK2RlY3MwMTQgYXBwbHkgICAtMC4wMDA3NTAgICAgICAgICAtPiAjQTFmMDAzRDAKK2RlY3MwMTUgYXBwbHkgICAjQTFkMDAzRDAgICAgICAgICAtPiAtMC4wMDAwMDc1MAorZGVjczAxNiBhcHBseSAgIC0wLjAwMDAwNzUwICAgICAgIC0+ICNBMWQwMDNEMAorZGVjczAxNyBhcHBseSAgICNBMWMwMDNEMCAgICAgICAgIC0+IC03LjUwRS03CitkZWNzMDE4IGFwcGx5ICAgLTcuNTBFLTcgICAgICAgICAgLT4gI0ExYzAwM0QwCisKKy0tIE5vcm1hbGl0eQorZGVjczAyMCBhcHBseSAgIDEyMzQ1NjcgICAgICAgICAgICAtPiAjMjY1NGQyZTcKK2RlY3MwMjEgYXBwbHkgIC0xMjM0NTY3ICAgICAgICAgICAgLT4gI2E2NTRkMmU3CitkZWNzMDIyIGFwcGx5ICAgMTExMTExMSAgICAgICAgICAgIC0+ICMyNjUyNDQ5MQorCistLSBObWF4IGFuZCBzaW1pbGFyCitkZWNzMDMxIGFwcGx5ICAgOS45OTk5OTlFKzk2ICAgICAgICAgICAgLT4gIzc3ZjNmY2ZmCitkZWNzMDMyIGFwcGx5ICAgIzc3ZjNmY2ZmICAgICAgICAgICAgICAgLT4gOS45OTk5OTlFKzk2CitkZWNzMDMzIGFwcGx5ICAgMS4yMzQ1NjdFKzk2ICAgICAgICAgICAgLT4gIzQ3ZjRkMmU3CitkZWNzMDM0IGFwcGx5ICAgIzQ3ZjRkMmU3ICAgICAgICAgICAgICAgLT4gMS4yMzQ1NjdFKzk2CistLSBmb2xkLWRvd25zIChtb3JlIGJlbG93KQorZGVjczAzNSBhcHBseSAgIDEuMjNFKzk2ICAgICAgICAgICAgICAgIC0+ICM0N2Y0YzAwMCBDbGFtcGVkCitkZWNzMDM2IGFwcGx5ICAgIzQ3ZjRjMDAwICAgICAgICAgICAgICAgLT4gMS4yMzAwMDBFKzk2CitkZWNzMDM3IGFwcGx5ICAgMUUrOTYgICAgICAgICAgICAgICAgICAgLT4gIzQ3ZjAwMDAwIENsYW1wZWQKK2RlY3MwMzggYXBwbHkgICAjNDdmMDAwMDAgICAgICAgICAgICAgICAtPiAxLjAwMDAwMEUrOTYKKworZGVjczA1MSBhcHBseSAgIDEyMzQ1ICAgICAgICAgICAgICAgICAgIC0+ICMyMjUwNDljNQorZGVjczA1MiBhcHBseSAgICMyMjUwNDljNSAgICAgICAgICAgICAgIC0+IDEyMzQ1CitkZWNzMDUzIGFwcGx5ICAgMTIzNCAgICAgICAgICAgICAgICAgICAgLT4gIzIyNTAwNTM0CitkZWNzMDU0IGFwcGx5ICAgIzIyNTAwNTM0ICAgICAgICAgICAgICAgLT4gMTIzNAorZGVjczA1NSBhcHBseSAgIDEyMyAgICAgICAgICAgICAgICAgICAgIC0+ICMyMjUwMDBhMworZGVjczA1NiBhcHBseSAgICMyMjUwMDBhMyAgICAgICAgICAgICAgIC0+IDEyMworZGVjczA1NyBhcHBseSAgIDEyICAgICAgICAgICAgICAgICAgICAgIC0+ICMyMjUwMDAxMgorZGVjczA1OCBhcHBseSAgICMyMjUwMDAxMiAgICAgICAgICAgICAgIC0+IDEyCitkZWNzMDU5IGFwcGx5ICAgMSAgICAgICAgICAgICAgICAgICAgICAgLT4gIzIyNTAwMDAxCitkZWNzMDYwIGFwcGx5ICAgIzIyNTAwMDAxICAgICAgICAgICAgICAgLT4gMQorZGVjczA2MSBhcHBseSAgIDEuMjMgICAgICAgICAgICAgICAgICAgIC0+ICMyMjMwMDBhMworZGVjczA2MiBhcHBseSAgICMyMjMwMDBhMyAgICAgICAgICAgICAgIC0+IDEuMjMKK2RlY3MwNjMgYXBwbHkgICAxMjMuNDUgICAgICAgICAgICAgICAgICAtPiAjMjIzMDQ5YzUKK2RlY3MwNjQgYXBwbHkgICAjMjIzMDQ5YzUgICAgICAgICAgICAgICAtPiAxMjMuNDUKKworLS0gTm1pbiBhbmQgYmVsb3cKK2RlY3MwNzEgYXBwbHkgICAxRS05NSAgICAgICAgICAgICAgICAgICAtPiAjMDA2MDAwMDEKK2RlY3MwNzIgYXBwbHkgICAjMDA2MDAwMDEgICAgICAgICAgICAgICAtPiAxRS05NQorZGVjczA3MyBhcHBseSAgIDEuMDAwMDAwRS05NSAgICAgICAgICAgIC0+ICMwNDAwMDAwMAorZGVjczA3NCBhcHBseSAgICMwNDAwMDAwMCAgICAgICAgICAgICAgIC0+IDEuMDAwMDAwRS05NQorZGVjczA3NSBhcHBseSAgIDEuMDAwMDAxRS05NSAgICAgICAgICAgIC0+ICMwNDAwMDAwMQorZGVjczA3NiBhcHBseSAgICMwNDAwMDAwMSAgICAgICAgICAgICAgIC0+IDEuMDAwMDAxRS05NQorCitkZWNzMDc3IGFwcGx5ICAgMC4xMDAwMDBFLTk1ICAgICAgICAgICAgLT4gIzAwMDIwMDAwICAgICBTdWJub3JtYWwKK2RlY3MwN3ggYXBwbHkgICAxLjAwMDAwRS05NiAgICAgICAgICAgICAtPiAxLjAwMDAwRS05NiAgIFN1Ym5vcm1hbAorZGVjczA3OCBhcHBseSAgICMwMDAyMDAwMCAgICAgICAgICAgICAgIC0+IDEuMDAwMDBFLTk2ICAgU3Vibm9ybWFsCitkZWNzMDc5IGFwcGx5ICAgMC4wMDAwMTBFLTk1ICAgICAgICAgICAgLT4gIzAwMDAwMDEwICAgICBTdWJub3JtYWwKK2RlY3MwODAgYXBwbHkgICAjMDAwMDAwMTAgICAgICAgICAgICAgICAtPiAxLjBFLTEwMCAgICAgIFN1Ym5vcm1hbAorZGVjczA4MSBhcHBseSAgIDAuMDAwMDAxRS05NSAgICAgICAgICAgIC0+ICMwMDAwMDAwMSAgICAgU3Vibm9ybWFsCitkZWNzMDgyIGFwcGx5ICAgIzAwMDAwMDAxICAgICAgICAgICAgICAgLT4gMUUtMTAxICAgICAgICBTdWJub3JtYWwKK2RlY3MwODMgYXBwbHkgICAxZS0xMDEgICAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDEgICAgIFN1Ym5vcm1hbAorZGVjczA4NCBhcHBseSAgICMwMDAwMDAwMSAgICAgICAgICAgICAgIC0+IDFFLTEwMSAgICAgICAgU3Vibm9ybWFsCitkZWNzMDh4IGFwcGx5ICAgMWUtMTAxICAgICAgICAgICAgICAgICAgLT4gMUUtMTAxICAgICAgICBTdWJub3JtYWwKKworLS0gdW5kZXJmbG93cyBjYW5ub3QgYmUgdGVzdGVkOyBqdXN0IGNoZWNrIGVkZ2UgY2FzZQorZGVjczA5MCBhcHBseSAgIDFlLTEwMSAgICAgICAgICAgICAgICAgIC0+ICMwMDAwMDAwMSAgU3Vibm9ybWFsCisKKy0tIHNhbWUgYWdhaW4sIG5lZ2F0aXZlcyAtLQorCistLSBObWF4IGFuZCBzaW1pbGFyCitkZWNzMTIyIGFwcGx5ICAtOS45OTk5OTlFKzk2ICAgICAgICAgICAgLT4gI2Y3ZjNmY2ZmCitkZWNzMTIzIGFwcGx5ICAgI2Y3ZjNmY2ZmICAgICAgICAgICAgICAgLT4gLTkuOTk5OTk5RSs5NgorZGVjczEyNCBhcHBseSAgLTEuMjM0NTY3RSs5NiAgICAgICAgICAgIC0+ICNjN2Y0ZDJlNworZGVjczEyNSBhcHBseSAgICNjN2Y0ZDJlNyAgICAgICAgICAgICAgIC0+IC0xLjIzNDU2N0UrOTYKKy0tIGZvbGQtZG93bnMgKG1vcmUgYmVsb3cpCitkZWNzMTMwIGFwcGx5ICAtMS4yM0UrOTYgICAgICAgICAgICAgICAgLT4gI2M3ZjRjMDAwIENsYW1wZWQKK2RlY3MxMzEgYXBwbHkgICAjYzdmNGMwMDAgICAgICAgICAgICAgICAtPiAtMS4yMzAwMDBFKzk2CitkZWNzMTMyIGFwcGx5ICAtMUUrOTYgICAgICAgICAgICAgICAgICAgLT4gI2M3ZjAwMDAwIENsYW1wZWQKK2RlY3MxMzMgYXBwbHkgICAjYzdmMDAwMDAgICAgICAgICAgICAgICAtPiAtMS4wMDAwMDBFKzk2CisKK2RlY3MxNTEgYXBwbHkgIC0xMjM0NSAgICAgICAgICAgICAgICAgICAtPiAjYTI1MDQ5YzUKK2RlY3MxNTIgYXBwbHkgICAjYTI1MDQ5YzUgICAgICAgICAgICAgICAtPiAtMTIzNDUKK2RlY3MxNTMgYXBwbHkgIC0xMjM0ICAgICAgICAgICAgICAgICAgICAtPiAjYTI1MDA1MzQKK2RlY3MxNTQgYXBwbHkgICAjYTI1MDA1MzQgICAgICAgICAgICAgICAtPiAtMTIzNAorZGVjczE1NSBhcHBseSAgLTEyMyAgICAgICAgICAgICAgICAgICAgIC0+ICNhMjUwMDBhMworZGVjczE1NiBhcHBseSAgICNhMjUwMDBhMyAgICAgICAgICAgICAgIC0+IC0xMjMKK2RlY3MxNTcgYXBwbHkgIC0xMiAgICAgICAgICAgICAgICAgICAgICAtPiAjYTI1MDAwMTIKK2RlY3MxNTggYXBwbHkgICAjYTI1MDAwMTIgICAgICAgICAgICAgICAtPiAtMTIKK2RlY3MxNTkgYXBwbHkgIC0xICAgICAgICAgICAgICAgICAgICAgICAtPiAjYTI1MDAwMDEKK2RlY3MxNjAgYXBwbHkgICAjYTI1MDAwMDEgICAgICAgICAgICAgICAtPiAtMQorZGVjczE2MSBhcHBseSAgLTEuMjMgICAgICAgICAgICAgICAgICAgIC0+ICNhMjMwMDBhMworZGVjczE2MiBhcHBseSAgICNhMjMwMDBhMyAgICAgICAgICAgICAgIC0+IC0xLjIzCitkZWNzMTYzIGFwcGx5ICAtMTIzLjQ1ICAgICAgICAgICAgICAgICAgLT4gI2EyMzA0OWM1CitkZWNzMTY0IGFwcGx5ICAgI2EyMzA0OWM1ICAgICAgICAgICAgICAgLT4gLTEyMy40NQorCistLSBObWluIGFuZCBiZWxvdworZGVjczE3MSBhcHBseSAgLTFFLTk1ICAgICAgICAgICAgICAgICAgIC0+ICM4MDYwMDAwMQorZGVjczE3MiBhcHBseSAgICM4MDYwMDAwMSAgICAgICAgICAgICAgIC0+IC0xRS05NQorZGVjczE3MyBhcHBseSAgLTEuMDAwMDAwRS05NSAgICAgICAgICAgIC0+ICM4NDAwMDAwMAorZGVjczE3NCBhcHBseSAgICM4NDAwMDAwMCAgICAgICAgICAgICAgIC0+IC0xLjAwMDAwMEUtOTUKK2RlY3MxNzUgYXBwbHkgIC0xLjAwMDAwMUUtOTUgICAgICAgICAgICAtPiAjODQwMDAwMDEKK2RlY3MxNzYgYXBwbHkgICAjODQwMDAwMDEgICAgICAgICAgICAgICAtPiAtMS4wMDAwMDFFLTk1CisKK2RlY3MxNzcgYXBwbHkgIC0wLjEwMDAwMEUtOTUgICAgICAgICAgICAtPiAjODAwMjAwMDAgICAgIFN1Ym5vcm1hbAorZGVjczE3OCBhcHBseSAgICM4MDAyMDAwMCAgICAgICAgICAgICAgIC0+IC0xLjAwMDAwRS05NiAgU3Vibm9ybWFsCitkZWNzMTc5IGFwcGx5ICAtMC4wMDAwMTBFLTk1ICAgICAgICAgICAgLT4gIzgwMDAwMDEwICAgICBTdWJub3JtYWwKK2RlY3MxODAgYXBwbHkgICAjODAwMDAwMTAgICAgICAgICAgICAgICAtPiAtMS4wRS0xMDAgICAgIFN1Ym5vcm1hbAorZGVjczE4MSBhcHBseSAgLTAuMDAwMDAxRS05NSAgICAgICAgICAgIC0+ICM4MDAwMDAwMSAgICAgU3Vibm9ybWFsCitkZWNzMTgyIGFwcGx5ICAgIzgwMDAwMDAxICAgICAgICAgICAgICAgLT4gLTFFLTEwMSAgICAgICBTdWJub3JtYWwKK2RlY3MxODMgYXBwbHkgIC0xZS0xMDEgICAgICAgICAgICAgICAgICAtPiAjODAwMDAwMDEgICAgIFN1Ym5vcm1hbAorZGVjczE4NCBhcHBseSAgICM4MDAwMDAwMSAgICAgICAgICAgICAgIC0+IC0xRS0xMDEgICAgICAgU3Vibm9ybWFsCisKKy0tIHVuZGVyZmxvdyBlZGdlIGNhc2UKK2RlY3MxOTAgYXBwbHkgIC0xZS0xMDEgICAgICAgICAgICAgICAgICAtPiAjODAwMDAwMDEgIFN1Ym5vcm1hbAorCistLSB6ZXJvcworZGVjczQwMCBhcHBseSAgIDBFLTQwMCAgICAgICAgICAgICAgICAgIC0+ICMwMDAwMDAwMCAgQ2xhbXBlZAorZGVjczQwMSBhcHBseSAgIDBFLTEwMSAgICAgICAgICAgICAgICAgIC0+ICMwMDAwMDAwMAorZGVjczQwMiBhcHBseSAgICMwMDAwMDAwMCAgICAgICAgICAgICAgIC0+IDBFLTEwMQorZGVjczQwMyBhcHBseSAgIDAuMDAwMDAwRS05NSAgICAgICAgICAgIC0+ICMwMDAwMDAwMAorZGVjczQwNCBhcHBseSAgICMwMDAwMDAwMCAgICAgICAgICAgICAgIC0+IDBFLTEwMQorZGVjczQwNSBhcHBseSAgIDBFLTIgICAgICAgICAgICAgICAgICAgIC0+ICMyMjMwMDAwMAorZGVjczQwNiBhcHBseSAgICMyMjMwMDAwMCAgICAgICAgICAgICAgIC0+IDAuMDAKK2RlY3M0MDcgYXBwbHkgICAwICAgICAgICAgICAgICAgICAgICAgICAtPiAjMjI1MDAwMDAKK2RlY3M0MDggYXBwbHkgICAjMjI1MDAwMDAgICAgICAgICAgICAgICAtPiAwCitkZWNzNDA5IGFwcGx5ICAgMEUrMyAgICAgICAgICAgICAgICAgICAgLT4gIzIyODAwMDAwCitkZWNzNDEwIGFwcGx5ICAgIzIyODAwMDAwICAgICAgICAgICAgICAgLT4gMEUrMworZGVjczQxMSBhcHBseSAgIDBFKzkwICAgICAgICAgICAgICAgICAgIC0+ICM0M2YwMDAwMAorZGVjczQxMiBhcHBseSAgICM0M2YwMDAwMCAgICAgICAgICAgICAgIC0+IDBFKzkwCistLSBjbGFtcGVkIHplcm9zLi4uCitkZWNzNDEzIGFwcGx5ICAgMEUrOTEgICAgICAgICAgICAgICAgICAgLT4gIzQzZjAwMDAwICBDbGFtcGVkCitkZWNzNDE0IGFwcGx5ICAgIzQzZjAwMDAwICAgICAgICAgICAgICAgLT4gMEUrOTAKK2RlY3M0MTUgYXBwbHkgICAwRSs5NiAgICAgICAgICAgICAgICAgICAtPiAjNDNmMDAwMDAgIENsYW1wZWQKK2RlY3M0MTYgYXBwbHkgICAjNDNmMDAwMDAgICAgICAgICAgICAgICAtPiAwRSs5MAorZGVjczQxNyBhcHBseSAgIDBFKzQwMCAgICAgICAgICAgICAgICAgIC0+ICM0M2YwMDAwMCAgQ2xhbXBlZAorZGVjczQxOCBhcHBseSAgICM0M2YwMDAwMCAgICAgICAgICAgICAgIC0+IDBFKzkwCisKKy0tIG5lZ2F0aXZlIHplcm9zCitkZWNzNDIwIGFwcGx5ICAgLTBFLTQwMCAgICAgICAgICAgICAgICAgLT4gIzgwMDAwMDAwICBDbGFtcGVkCitkZWNzNDIxIGFwcGx5ICAgLTBFLTEwMSAgICAgICAgICAgICAgICAgLT4gIzgwMDAwMDAwCitkZWNzNDIyIGFwcGx5ICAgIzgwMDAwMDAwICAgICAgICAgICAgICAgLT4gLTBFLTEwMQorZGVjczQyMyBhcHBseSAgIC0wLjAwMDAwMEUtOTUgICAgICAgICAgIC0+ICM4MDAwMDAwMAorZGVjczQyNCBhcHBseSAgICM4MDAwMDAwMCAgICAgICAgICAgICAgIC0+IC0wRS0xMDEKK2RlY3M0MjUgYXBwbHkgICAtMEUtMiAgICAgICAgICAgICAgICAgICAtPiAjYTIzMDAwMDAKK2RlY3M0MjYgYXBwbHkgICAjYTIzMDAwMDAgICAgICAgICAgICAgICAtPiAtMC4wMAorZGVjczQyNyBhcHBseSAgIC0wICAgICAgICAgICAgICAgICAgICAgIC0+ICNhMjUwMDAwMAorZGVjczQyOCBhcHBseSAgICNhMjUwMDAwMCAgICAgICAgICAgICAgIC0+IC0wCitkZWNzNDI5IGFwcGx5ICAgLTBFKzMgICAgICAgICAgICAgICAgICAgLT4gI2EyODAwMDAwCitkZWNzNDMwIGFwcGx5ICAgI2EyODAwMDAwICAgICAgICAgICAgICAgLT4gLTBFKzMKK2RlY3M0MzEgYXBwbHkgICAtMEUrOTAgICAgICAgICAgICAgICAgICAtPiAjYzNmMDAwMDAKK2RlY3M0MzIgYXBwbHkgICAjYzNmMDAwMDAgICAgICAgICAgICAgICAtPiAtMEUrOTAKKy0tIGNsYW1wZWQgemVyb3MuLi4KK2RlY3M0MzMgYXBwbHkgICAtMEUrOTEgICAgICAgICAgICAgICAgICAtPiAjYzNmMDAwMDAgIENsYW1wZWQKK2RlY3M0MzQgYXBwbHkgICAjYzNmMDAwMDAgICAgICAgICAgICAgICAtPiAtMEUrOTAKK2RlY3M0MzUgYXBwbHkgICAtMEUrOTYgICAgICAgICAgICAgICAgICAtPiAjYzNmMDAwMDAgIENsYW1wZWQKK2RlY3M0MzYgYXBwbHkgICAjYzNmMDAwMDAgICAgICAgICAgICAgICAtPiAtMEUrOTAKK2RlY3M0MzcgYXBwbHkgICAtMEUrNDAwICAgICAgICAgICAgICAgICAtPiAjYzNmMDAwMDAgIENsYW1wZWQKK2RlY3M0MzggYXBwbHkgICAjYzNmMDAwMDAgICAgICAgICAgICAgICAtPiAtMEUrOTAKKworLS0gU3BlY2lhbHMKK2RlY3M1MDAgYXBwbHkgICBJbmZpbml0eSAgLT4gIzc4MDAwMDAwCitkZWNzNTAxIGFwcGx5ICAgIzc4Nzg3ODc4IC0+ICM3ODAwMDAwMAorZGVjczUwMiBhcHBseSAgICM3ODAwMDAwMCAtPiBJbmZpbml0eQorZGVjczUwMyBhcHBseSAgICM3OTc5Nzk3OSAtPiAjNzgwMDAwMDAKK2RlY3M1MDQgYXBwbHkgICAjNzkwMDAwMDAgLT4gSW5maW5pdHkKK2RlY3M1MDUgYXBwbHkgICAjN2E3YTdhN2EgLT4gIzc4MDAwMDAwCitkZWNzNTA2IGFwcGx5ICAgIzdhMDAwMDAwIC0+IEluZmluaXR5CitkZWNzNTA3IGFwcGx5ICAgIzdiN2I3YjdiIC0+ICM3ODAwMDAwMAorZGVjczUwOCBhcHBseSAgICM3YjAwMDAwMCAtPiBJbmZpbml0eQorZGVjczUwOSBhcHBseSAgICM3YzdjN2M3YyAtPiAjN2MwYzdjN2MKKworZGVjczUxMCBhcHBseSAgIE5hTiAgICAgICAtPiAjN2MwMDAwMDAKK2RlY3M1MTEgYXBwbHkgICAjN2MwMDAwMDAgLT4gTmFOCitkZWNzNTEyIGFwcGx5ICAgIzdkN2Q3ZDdkIC0+ICM3YzBkN2Q3ZAorZGVjczUxMyBhcHBseSAgICM3ZDAwMDAwMCAtPiBOYU4KK2RlY3M1MTQgYXBwbHkgICAjN2U3ZTdlN2UgLT4gIzdlMGU3YzdlCitkZWNzNTE1IGFwcGx5ICAgIzdlMDAwMDAwIC0+IHNOYU4KK2RlY3M1MTYgYXBwbHkgICAjN2Y3ZjdmN2YgLT4gIzdlMGY3YzdmCitkZWNzNTE3IGFwcGx5ICAgIzdmMDAwMDAwIC0+IHNOYU4KK2RlY3M1MTggYXBwbHkgICAjN2ZmZmZmZmYgLT4gc05hTjk5OTk5OQorZGVjczUxOSBhcHBseSAgICM3ZmZmZmZmZiAtPiAjN2UwM2ZjZmYKKworZGVjczUyMCBhcHBseSAgIC1JbmZpbml0eSAtPiAjZjgwMDAwMDAKK2RlY3M1MjEgYXBwbHkgICAjZjg3ODc4NzggLT4gI2Y4MDAwMDAwCitkZWNzNTIyIGFwcGx5ICAgI2Y4MDAwMDAwIC0+IC1JbmZpbml0eQorZGVjczUyMyBhcHBseSAgICNmOTc5Nzk3OSAtPiAjZjgwMDAwMDAKK2RlY3M1MjQgYXBwbHkgICAjZjkwMDAwMDAgLT4gLUluZmluaXR5CitkZWNzNTI1IGFwcGx5ICAgI2ZhN2E3YTdhIC0+ICNmODAwMDAwMAorZGVjczUyNiBhcHBseSAgICNmYTAwMDAwMCAtPiAtSW5maW5pdHkKK2RlY3M1MjcgYXBwbHkgICAjZmI3YjdiN2IgLT4gI2Y4MDAwMDAwCitkZWNzNTI4IGFwcGx5ICAgI2ZiMDAwMDAwIC0+IC1JbmZpbml0eQorCitkZWNzNTI5IGFwcGx5ICAgLU5hTiAgICAgIC0+ICNmYzAwMDAwMAorZGVjczUzMCBhcHBseSAgICNmYzdjN2M3YyAtPiAjZmMwYzdjN2MKK2RlY3M1MzEgYXBwbHkgICAjZmMwMDAwMDAgLT4gLU5hTgorZGVjczUzMiBhcHBseSAgICNmZDdkN2Q3ZCAtPiAjZmMwZDdkN2QKK2RlY3M1MzMgYXBwbHkgICAjZmQwMDAwMDAgLT4gLU5hTgorZGVjczUzNCBhcHBseSAgICNmZTdlN2U3ZSAtPiAjZmUwZTdjN2UKK2RlY3M1MzUgYXBwbHkgICAjZmUwMDAwMDAgLT4gLXNOYU4KK2RlY3M1MzYgYXBwbHkgICAjZmY3ZjdmN2YgLT4gI2ZlMGY3YzdmCitkZWNzNTM3IGFwcGx5ICAgI2ZmMDAwMDAwIC0+IC1zTmFOCitkZWNzNTM4IGFwcGx5ICAgI2ZmZmZmZmZmIC0+IC1zTmFOOTk5OTk5CitkZWNzNTM5IGFwcGx5ICAgI2ZmZmZmZmZmIC0+ICNmZTAzZmNmZgorCistLSBkaWFnbm9zdGljIE5hTnMKK2RlY3M1NDAgYXBwbHkgICBOYU4gICAgICAgLT4gIzdjMDAwMDAwCitkZWNzNTQxIGFwcGx5ICAgTmFOMCAgICAgIC0+ICM3YzAwMDAwMAorZGVjczU0MiBhcHBseSAgIE5hTjEgICAgICAtPiAjN2MwMDAwMDEKK2RlY3M1NDMgYXBwbHkgICBOYU4xMiAgICAgLT4gIzdjMDAwMDEyCitkZWNzNTQ0IGFwcGx5ICAgTmFONzkgICAgIC0+ICM3YzAwMDA3OQorZGVjczU0NSBhcHBseSAgIE5hTjEyMzQ1ICAgLT4gIzdjMDA0OWM1CitkZWNzNTQ2IGFwcGx5ICAgTmFOMTIzNDU2ICAtPiAjN2MwMjhlNTYKK2RlY3M1NDcgYXBwbHkgICBOYU43OTk3OTkgIC0+ICM3YzBmN2ZkZgorZGVjczU0OCBhcHBseSAgIE5hTjk5OTk5OSAgLT4gIzdjMDNmY2ZmCisKKworLS0gZm9sZC1kb3duIGZ1bGwgc2VxdWVuY2UKK2RlY3M2MDEgYXBwbHkgICAxRSs5NiAgICAgICAgICAgICAgICAgICAtPiAjNDdmMDAwMDAgQ2xhbXBlZAorZGVjczYwMiBhcHBseSAgICM0N2YwMDAwMCAgICAgICAgICAgICAgIC0+IDEuMDAwMDAwRSs5NgorZGVjczYwMyBhcHBseSAgIDFFKzk1ICAgICAgICAgICAgICAgICAgIC0+ICM0M2YyMDAwMCBDbGFtcGVkCitkZWNzNjA0IGFwcGx5ICAgIzQzZjIwMDAwICAgICAgICAgICAgICAgLT4gMS4wMDAwMEUrOTUKK2RlY3M2MDUgYXBwbHkgICAxRSs5NCAgICAgICAgICAgICAgICAgICAtPiAjNDNmMDQwMDAgQ2xhbXBlZAorZGVjczYwNiBhcHBseSAgICM0M2YwNDAwMCAgICAgICAgICAgICAgIC0+IDEuMDAwMEUrOTQKK2RlY3M2MDcgYXBwbHkgICAxRSs5MyAgICAgICAgICAgICAgICAgICAtPiAjNDNmMDA0MDAgQ2xhbXBlZAorZGVjczYwOCBhcHBseSAgICM0M2YwMDQwMCAgICAgICAgICAgICAgIC0+IDEuMDAwRSs5MworZGVjczYwOSBhcHBseSAgIDFFKzkyICAgICAgICAgICAgICAgICAgIC0+ICM0M2YwMDA4MCBDbGFtcGVkCitkZWNzNjEwIGFwcGx5ICAgIzQzZjAwMDgwICAgICAgICAgICAgICAgLT4gMS4wMEUrOTIKK2RlY3M2MTEgYXBwbHkgICAxRSs5MSAgICAgICAgICAgICAgICAgICAtPiAjNDNmMDAwMTAgQ2xhbXBlZAorZGVjczYxMiBhcHBseSAgICM0M2YwMDAxMCAgICAgICAgICAgICAgIC0+IDEuMEUrOTEKK2RlY3M2MTMgYXBwbHkgICAxRSs5MCAgICAgICAgICAgICAgICAgICAtPiAjNDNmMDAwMDEKK2RlY3M2MTQgYXBwbHkgICAjNDNmMDAwMDEgICAgICAgICAgICAgICAtPiAxRSs5MAorCisKKy0tIFNlbGVjdGVkIERQRCBjb2RlcworZGVjczcwMCBhcHBseSAgICMyMjUwMDAwMCAgICAgICAtPiAwCitkZWNzNzAxIGFwcGx5ICAgIzIyNTAwMDA5ICAgICAgIC0+IDkKK2RlY3M3MDIgYXBwbHkgICAjMjI1MDAwMTAgICAgICAgLT4gMTAKK2RlY3M3MDMgYXBwbHkgICAjMjI1MDAwMTkgICAgICAgLT4gMTkKK2RlY3M3MDQgYXBwbHkgICAjMjI1MDAwMjAgICAgICAgLT4gMjAKK2RlY3M3MDUgYXBwbHkgICAjMjI1MDAwMjkgICAgICAgLT4gMjkKK2RlY3M3MDYgYXBwbHkgICAjMjI1MDAwMzAgICAgICAgLT4gMzAKK2RlY3M3MDcgYXBwbHkgICAjMjI1MDAwMzkgICAgICAgLT4gMzkKK2RlY3M3MDggYXBwbHkgICAjMjI1MDAwNDAgICAgICAgLT4gNDAKK2RlY3M3MDkgYXBwbHkgICAjMjI1MDAwNDkgICAgICAgLT4gNDkKK2RlY3M3MTAgYXBwbHkgICAjMjI1MDAwNTAgICAgICAgLT4gNTAKK2RlY3M3MTEgYXBwbHkgICAjMjI1MDAwNTkgICAgICAgLT4gNTkKK2RlY3M3MTIgYXBwbHkgICAjMjI1MDAwNjAgICAgICAgLT4gNjAKK2RlY3M3MTMgYXBwbHkgICAjMjI1MDAwNjkgICAgICAgLT4gNjkKK2RlY3M3MTQgYXBwbHkgICAjMjI1MDAwNzAgICAgICAgLT4gNzAKK2RlY3M3MTUgYXBwbHkgICAjMjI1MDAwNzEgICAgICAgLT4gNzEKK2RlY3M3MTYgYXBwbHkgICAjMjI1MDAwNzIgICAgICAgLT4gNzIKK2RlY3M3MTcgYXBwbHkgICAjMjI1MDAwNzMgICAgICAgLT4gNzMKK2RlY3M3MTggYXBwbHkgICAjMjI1MDAwNzQgICAgICAgLT4gNzQKK2RlY3M3MTkgYXBwbHkgICAjMjI1MDAwNzUgICAgICAgLT4gNzUKK2RlY3M3MjAgYXBwbHkgICAjMjI1MDAwNzYgICAgICAgLT4gNzYKK2RlY3M3MjEgYXBwbHkgICAjMjI1MDAwNzcgICAgICAgLT4gNzcKK2RlY3M3MjIgYXBwbHkgICAjMjI1MDAwNzggICAgICAgLT4gNzgKK2RlY3M3MjMgYXBwbHkgICAjMjI1MDAwNzkgICAgICAgLT4gNzkKKworZGVjczczMCBhcHBseSAgICMyMjUwMDI5ZSAgICAgICAtPiA5OTQKK2RlY3M3MzEgYXBwbHkgICAjMjI1MDAyOWYgICAgICAgLT4gOTk1CitkZWNzNzMyIGFwcGx5ICAgIzIyNTAwMmEwICAgICAgIC0+IDUyMAorZGVjczczMyBhcHBseSAgICMyMjUwMDJhMSAgICAgICAtPiA1MjEKKworLS0gRFBEOiBvbmUgb2YgZWFjaCBvZiB0aGUgaHVmZm1hbiBncm91cHMKK2RlY3M3NDAgYXBwbHkgICAjMjI1MDAzZjcgICAgICAgLT4gNzc3CitkZWNzNzQxIGFwcGx5ICAgIzIyNTAwM2Y4ICAgICAgIC0+IDc3OAorZGVjczc0MiBhcHBseSAgICMyMjUwMDNlYiAgICAgICAtPiA3ODcKK2RlY3M3NDMgYXBwbHkgICAjMjI1MDAzN2QgICAgICAgLT4gODc3CitkZWNzNzQ0IGFwcGx5ICAgIzIyNTAwMzlmICAgICAgIC0+IDk5NworZGVjczc0NSBhcHBseSAgICMyMjUwMDNiZiAgICAgICAtPiA5NzkKK2RlY3M3NDYgYXBwbHkgICAjMjI1MDAzZGYgICAgICAgLT4gNzk5CitkZWNzNzQ3IGFwcGx5ICAgIzIyNTAwMDZlICAgICAgIC0+IDg4OAorCisKKy0tIERQRCBhbGwtaGlnaHMgY2FzZXMgKGluY2x1ZGVzIHRoZSAyNCByZWR1bmRhbnQgY29kZXMpCitkZWNzNzUwIGFwcGx5ICAgIzIyNTAwMDZlICAgICAgIC0+IDg4OAorZGVjczc1MSBhcHBseSAgICMyMjUwMDE2ZSAgICAgICAtPiA4ODgKK2RlY3M3NTIgYXBwbHkgICAjMjI1MDAyNmUgICAgICAgLT4gODg4CitkZWNzNzUzIGFwcGx5ICAgIzIyNTAwMzZlICAgICAgIC0+IDg4OAorZGVjczc1NCBhcHBseSAgICMyMjUwMDA2ZiAgICAgICAtPiA4ODkKK2RlY3M3NTUgYXBwbHkgICAjMjI1MDAxNmYgICAgICAgLT4gODg5CitkZWNzNzU2IGFwcGx5ICAgIzIyNTAwMjZmICAgICAgIC0+IDg4OQorZGVjczc1NyBhcHBseSAgICMyMjUwMDM2ZiAgICAgICAtPiA4ODkKKworZGVjczc2MCBhcHBseSAgICMyMjUwMDA3ZSAgICAgICAtPiA4OTgKK2RlY3M3NjEgYXBwbHkgICAjMjI1MDAxN2UgICAgICAgLT4gODk4CitkZWNzNzYyIGFwcGx5ICAgIzIyNTAwMjdlICAgICAgIC0+IDg5OAorZGVjczc2MyBhcHBseSAgICMyMjUwMDM3ZSAgICAgICAtPiA4OTgKK2RlY3M3NjQgYXBwbHkgICAjMjI1MDAwN2YgICAgICAgLT4gODk5CitkZWNzNzY1IGFwcGx5ICAgIzIyNTAwMTdmICAgICAgIC0+IDg5OQorZGVjczc2NiBhcHBseSAgICMyMjUwMDI3ZiAgICAgICAtPiA4OTkKK2RlY3M3NjcgYXBwbHkgICAjMjI1MDAzN2YgICAgICAgLT4gODk5CisKK2RlY3M3NzAgYXBwbHkgICAjMjI1MDAwZWUgICAgICAgLT4gOTg4CitkZWNzNzcxIGFwcGx5ICAgIzIyNTAwMWVlICAgICAgIC0+IDk4OAorZGVjczc3MiBhcHBseSAgICMyMjUwMDJlZSAgICAgICAtPiA5ODgKK2RlY3M3NzMgYXBwbHkgICAjMjI1MDAzZWUgICAgICAgLT4gOTg4CitkZWNzNzc0IGFwcGx5ICAgIzIyNTAwMGVmICAgICAgIC0+IDk4OQorZGVjczc3NSBhcHBseSAgICMyMjUwMDFlZiAgICAgICAtPiA5ODkKK2RlY3M3NzYgYXBwbHkgICAjMjI1MDAyZWYgICAgICAgLT4gOTg5CitkZWNzNzc3IGFwcGx5ICAgIzIyNTAwM2VmICAgICAgIC0+IDk4OQorCitkZWNzNzgwIGFwcGx5ICAgIzIyNTAwMGZlICAgICAgIC0+IDk5OAorZGVjczc4MSBhcHBseSAgICMyMjUwMDFmZSAgICAgICAtPiA5OTgKK2RlY3M3ODIgYXBwbHkgICAjMjI1MDAyZmUgICAgICAgLT4gOTk4CitkZWNzNzgzIGFwcGx5ICAgIzIyNTAwM2ZlICAgICAgIC0+IDk5OAorZGVjczc4NCBhcHBseSAgICMyMjUwMDBmZiAgICAgICAtPiA5OTkKK2RlY3M3ODUgYXBwbHkgICAjMjI1MDAxZmYgICAgICAgLT4gOTk5CitkZWNzNzg2IGFwcGx5ICAgIzIyNTAwMmZmICAgICAgIC0+IDk5OQorZGVjczc4NyBhcHBseSAgICMyMjUwMDNmZiAgICAgICAtPiA5OTkKKworLS0gbmFycm93aW5nIGNhc2UKK2RlY3M3OTAgYXBwbHkgMi4wMEUtOTkgLT4gIzAwMDAwMTAwIFN1Ym5vcm1hbAorZGVjczc5MSBhcHBseSAjMDAwMDAxMDAgLT4gMi4wMEUtOTkgU3Vibm9ybWFsCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2V4cC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9leHAuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWI5OTBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9leHAuZGVjVGVzdApAQCAtMCwwICsxLDY3NCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBleHAuZGVjVGVzdCAtLSBkZWNpbWFsIG5hdHVyYWwgZXhwb25lbnRpYXRpb24gICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDA1LCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRlc3RzIG9mIHRoZSBleHBvbmVudGlhbCBmdW50aW9uLiAgQ3VycmVudGx5IGFsbCB0ZXN0Y2FzZXMgaGVyZQorLS0gc2hvdyByZXN1bHRzIHdoaWNoIGFyZSBjb3JyZWN0bHkgcm91bmRlZCAod2l0aGluIDw9IDAuNSB1bHApLgorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIGJhc2ljcyAoZXhhbXBsZXMgaW4gc3BlY2lmaWNpYXRpb24sIGV0Yy4pCitleHB4MDAxIGV4cCAgLUluZmluaXR5ICAgICAtPiAwCitleHB4MDAyIGV4cCAgLTEwICAgICAgICAgICAtPiAwLjAwMDA0NTM5OTkyOTggSW5leGFjdCBSb3VuZGVkCitleHB4MDAzIGV4cCAgLTEgICAgICAgICAgICAtPiAwLjM2Nzg3OTQ0MSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMDQgZXhwICAgMCAgICAgICAgICAgIC0+IDEKK2V4cHgwMDUgZXhwICAtMCAgICAgICAgICAgIC0+IDEKK2V4cHgwMDYgZXhwICAgMSAgICAgICAgICAgIC0+IDIuNzE4MjgxODMgIEluZXhhY3QgUm91bmRlZAorZXhweDAwNyBleHAgICAwLjY5MzE0NzE4MSAgLT4gMi4wMDAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitleHB4MDA4IGV4cCAgIDEwICAgICAgICAgICAtPiAyMjAyNi40NjU4ICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMDkgZXhwICArSW5maW5pdHkgICAgIC0+IEluZmluaXR5CisKKy0tIHRpbnkgZWRnZSBjYXNlcworcHJlY2lzaW9uOiAgIDcKK2V4cHgwMTEgZXhwICAwLjEgICAgICAgICAgLT4gIDEuMTA1MTcxICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMTIgZXhwICAwLjAxICAgICAgICAgLT4gIDEuMDEwMDUwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMTMgZXhwICAwLjAwMSAgICAgICAgLT4gIDEuMDAxMDAxICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMTQgZXhwICAwLjAwMDEgICAgICAgLT4gIDEuMDAwMTAwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMTUgZXhwICAwLjAwMDAxICAgICAgLT4gIDEuMDAwMDEwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMTYgZXhwICAwLjAwMDAwMSAgICAgLT4gIDEuMDAwMDAxICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMTcgZXhwICAwLjAwMDAwMDEgICAgLT4gIDEuMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMTggZXhwICAwLjAwMDAwMDMgICAgLT4gIDEuMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMTkgZXhwICAwLjAwMDAwMDQgICAgLT4gIDEuMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMjAgZXhwICAwLjAwMDAwMDUgICAgLT4gIDEuMDAwMDAxICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMjEgZXhwICAwLjAwMDAwMDggICAgLT4gIDEuMDAwMDAxICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMjIgZXhwICAwLjAwMDAwMDkgICAgLT4gIDEuMDAwMDAxICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMjMgZXhwICAwLjAwMDAwMTAgICAgLT4gIDEuMDAwMDAxICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMjQgZXhwICAwLjAwMDAwMTEgICAgLT4gIDEuMDAwMDAxICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMjUgZXhwICAwLjAwMDAwMDA5ICAgLT4gIDEuMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMjYgZXhwICAwLjAwMDAwMDA1ICAgLT4gIDEuMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMjcgZXhwICAwLjAwMDAwMDA0ICAgLT4gIDEuMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMjggZXhwICAwLjAwMDAwMDAxICAgLT4gIDEuMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKKworLS0gYW5kIHNvbWUgbW9yZSB6ZXJvcworZXhweDAzMCBleHAgIDAuMDAwMDAwMDAgICAtPiAgMQorZXhweDAzMSBleHAgIDBFKzEwMCAgICAgICAtPiAgMQorZXhweDAzMiBleHAgIDBFLTEwMCAgICAgICAtPiAgMQorZXhweDAzMyBleHAgLTAuMDAwMDAwMDAgICAtPiAgMQorZXhweDAzNCBleHAgLTBFKzEwMCAgICAgICAtPiAgMQorZXhweDAzNSBleHAgLTBFLTEwMCAgICAgICAtPiAgMQorCistLSBiYXNpYyBlPTAsIGU9MSwgZT0yLCBlPTQsIGU+PTggY2FzZXMKK3ByZWNpc2lvbjogICA3CitleHB4MDQxIGV4cCAgMSAgICAgICAgICAtPiAgMi43MTgyODIgIEluZXhhY3QgUm91bmRlZAorZXhweDA0MiBleHAgLTEgICAgICAgICAgLT4gIDAuMzY3ODc5NCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwNDMgZXhwICAxMCAgICAgICAgIC0+ICAyMjAyNi40NyAgSW5leGFjdCBSb3VuZGVkCitleHB4MDQ0IGV4cCAtMTAgICAgICAgICAtPiAgMC4wMDAwNDUzOTk5MyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwNDUgZXhwICAxMDAgICAgICAgIC0+ICAyLjY4ODExN0UrNDMgIEluZXhhY3QgUm91bmRlZAorZXhweDA0NiBleHAgLTEwMCAgICAgICAgLT4gIDMuNzIwMDc2RS00NCAgSW5leGFjdCBSb3VuZGVkCitleHB4MDQ3IGV4cCAgMTAwMCAgICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitleHB4MDQ4IGV4cCAtMTAwMCAgICAgICAtPiAgMEUtMzg5IFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZCBTdWJub3JtYWwKK2V4cHgwNDkgZXhwICAxMDAwMDAwMDAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwNTAgZXhwIC0xMDAwMDAwMDAgIC0+ICAwRS0zODkgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkIFN1Ym5vcm1hbAorCistLSBtaXNjZWxsYW5lYQorLS0gc2ltaWxhciB0byAnVkYgYnVnJyB0ZXN0LCBhdCAxNywgYnV0IHdpdGggbGFzdCBkaWdpdCBjb3JyZWN0ZWQgZm9yIGRlY2ltYWwKK3ByZWNpc2lvbjogMTYKK2V4cHgwNTUgZXhwIC01LjQyNDEwMzExMjg3NDQxNDU5MTcyRSsyIC0+IDIuNzE3NjU4NDg2ODg0NTcyRS0yMzYgSW5leGFjdCBSb3VuZGVkCistLSAgcmVzdWx0IGZyb20gTmV0UmV4eC9KYXZhIHByb3RvdHlwZSAtPiAyLjcxNzY1ODQ4Njg4NDU3MjExMTc2Nzc5Mjk2Mjg2MTcyNDYwNTQ0NTk2NDQ3MTExMDhFLTIzNgorLS0gICByZXN1bHQgZnJvbSBSZXh4IChzZXJpZXMpIHZlcnNpb24gLT4gMi43MTc2NTg0ODY4ODQ1NzIxMTE3Njc3OTI5NjI4NjE3MjQ2MDU0NDZFLTIzNgorcHJlY2lzaW9uOiAxNworZXhweDA1NiBleHAgLTUuNDI0MTAzMTEyODc0NDE0NTkxNzJFKzIgLT4gMi43MTc2NTg0ODY4ODQ1NzIxRS0yMzYgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE4CitleHB4MDU3IGV4cCAtNS40MjQxMDMxMTI4NzQ0MTQ1OTE3MkUrMiAtPiAyLjcxNzY1ODQ4Njg4NDU3MjExRS0yMzYgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE5CitleHB4MDU4IGV4cCAtNS40MjQxMDMxMTI4NzQ0MTQ1OTE3MkUrMiAtPiAyLjcxNzY1ODQ4Njg4NDU3MjExMkUtMjM2IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMAorZXhweDA1OSBleHAgLTUuNDI0MTAzMTEyODc0NDE0NTkxNzJFKzIgLT4gMi43MTc2NTg0ODY4ODQ1NzIxMTE4RS0yMzYgSW5leGFjdCBSb3VuZGVkCisKKy0tIHJvdW5kaW5nIGluIGFyZWFzIG9mIC4uNTAwLi4sIC4uNDk5Li4sIC4uMTAwLi4sIC4uOTk5Li4gc2VxdWVuY2VzCitwcmVjaXNpb246ICAgNTAKK2V4cHgxMDEgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5ODc4NTAwMDAyNzMzNzQ5OTUwNzkyNTAwNzM4MTEgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMzEKK2V4cHgxMDIgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5ODc4NTAwMDAyNyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAzMAorZXhweDEwMyBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4Nzg1MDAwMDMgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDI5CitleHB4MTA0IGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTg3ODUwMDAwICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjgKK2V4cHgxMDUgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5ODc4NTAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAyNworZXhweDEwNiBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4Nzg1MDAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDI2CitleHB4MTA3IGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTg3ODUwICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjUKK2V4cHgxMDggZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5ODc4NSAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAyNAorZXhweDEwOSBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4NzkgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDIzCitleHB4MTEwIGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTg4ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjIKK2V4cHgxMTEgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5OSAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAyMQorZXhweDExMiBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMDQwNTAwMDAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDIwCitleHB4MTEzIGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDA1MDAwICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTkKK2V4cHgxMTQgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0MDUwMCAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAxOAorZXhweDExNSBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMDQwNTAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDE3CitleHB4MTE2IGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDA1ICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTYKK2V4cHgxMTcgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0MCAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAxNQorZXhweDExOCBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMDQgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDE0CitleHB4MTE5IGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTMKK2V4cHgxMjAgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMCAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAxMgorZXhweDEyMSBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDExCitleHB4MTIyIGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTAKK2V4cHgxMjMgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMCAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgOQorZXhweDEyNCBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICA4CitleHB4MTI1IGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDcKK2V4cHgxMjYgZXhwIC05RS04IC0+IDAuOTk5OTk5OSAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgNgorZXhweDEyNyBleHAgLTlFLTggLT4gMS4wMDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICA1CitleHB4MTI4IGV4cCAtOUUtOCAtPiAxLjAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDQKK2V4cHgxMjkgZXhwIC05RS04IC0+IDEuMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgMworZXhweDEzMCBleHAgLTlFLTggLT4gMS4wMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICAyCitleHB4MTMxIGV4cCAtOUUtOCAtPiAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDEKK2V4cHgxMzIgZXhwIC05RS04IC0+IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworCistLSBzYW5pdHkgY2hlY2tzLCB3aXRoIGl0ZXJhdGlvbiBjb3VudHMgW25vcm1hbGl6ZWQgc28gMDw9fHh8PDFdCitwcmVjaXNpb246ICAgNTAKKworZXhweDIxMCBleHAgMCAtPiAxCistLSBpdGVyYXRpb25zOiAyCitleHB4MjExIGV4cCAtMUUtNDAgLT4gMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDgKK2V4cHgyMTIgZXhwIC05RS03IC0+IDAuOTk5OTk5MTAwMDAwNDA0OTk5ODc4NTAwMDI3MzM3NDk1MDc5MjUwNzM4MTEyNDA1MTAgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiA2CitleHB4MjEzIGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTg3ODUwMDAwMjczMzc0OTk1MDc5MjUwMDczODExIEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMTUKK2V4cHgyMTQgZXhwIC0wLjAwMyAtPiAwLjk5NzAwNDQ5NTUwMzM3Mjk3NjAxMjA2NjIzNDA5NzU2MDkxMDc0MTc3NDgwNDg5ODQ1IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMTQKK2V4cHgyMTUgZXhwIC0wLjAwMSAtPiAwLjk5OTAwMDQ5OTgzMzM3NDk5MTY2ODA1NTM1NzE2NzY1NTk3NDcwMjM1NTkwMjM2MDA4IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMjYKK2V4cHgyMTYgZXhwIC0wLjEgLT4gMC45MDQ4Mzc0MTgwMzU5NTk1NzMxNjQyNDkwNTk0NDY0MzY2MjExOTQ3MDUzNjA5ODA0MCBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDM5CitleHB4MjE3IGV4cCAtMC43IC0+IDAuNDk2NTg1MzAzNzkxNDA5NTE0NzA0ODAwMDkzMzk3NTI4OTYxNzA3NjY3MTY1NzExODIgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiA0MQorZXhweDIxOCBleHAgLTAuOSAtPiAwLjQwNjU2OTY1OTc0MDU5OTExMTg4MzQ1NDIzOTY0NTYyNTk4NzgzMzcwMzM3NjE3MDM4IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogNDMKK2V4cHgyMTkgZXhwIC0wLjk5IC0+IDAuMzcxNTc2NjkxMDIyMDQ1NjkwNTMxNTI0MTE5OTA4MjAxMzg2OTE4MDI4ODU0OTA1MDEgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyNgorZXhweDIyMCBleHAgLTEgLT4gMC4zNjc4Nzk0NDExNzE0NDIzMjE1OTU1MjM3NzAxNjE0NjA4Njc0NDU4MTExMzEwMzE3NyBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDI2CitleHB4MjIxIGV4cCAtMS4wMSAtPiAwLjM2NDIxODk3OTU3MTUyMzMxOTc1NzA0NjI5NTYzNzM0NTQ4OTU5NTg5MTM5MTkyNDgyIEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMjcKK2V4cHgyMjIgZXhwIC0xLjEgLT4gMC4zMzI4NzEwODM2OTgwNzk1NTMyODg4NDY5MDY0MzEzMTU1MjE2MTI0Nzk1MjE1NjkyMSBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDI4CitleHB4MjIzIGV4cCAtMS41IC0+IDAuMjIzMTMwMTYwMTQ4NDI5ODI4OTMzMjgwNDcwNzY0MDEyNTIxMzQyMTcxNjI5MzYxMDggSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAzMAorZXhweDIyNCBleHAgLTIgLT4gMC4xMzUzMzUyODMyMzY2MTI2OTE4OTM5OTk0OTQ5NzI0ODQ0MDM0MDc2MzE1NDU5MDk1OCBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDM2CitleHB4MjI1IGV4cCAtNSAtPiAwLjAwNjczNzk0Njk5OTA4NTQ2NzA5NjYzNjA0ODQyMzE0ODQyNDI0ODg0OTU4NTAyNzM1NTEgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyNgorZXhweDIyNiBleHAgLTEwIC0+IDAuMDAwMDQ1Mzk5OTI5NzYyNDg0ODUxNTM1NTkxNTE1NTYwNTUwNjEwMjM3OTE4MDg4ODY2NTY1IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMjgKK2V4cHgyMjcgZXhwIC0xNCAtPiA4LjMxNTI4NzE5MTAzNTY3ODg0MDYzOTg1MTQyNTY1MjYyMjk0NjA3NjU4MzY0OTg0NTdFLTcgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyOQorZXhweDIyOCBleHAgLTE1IC0+IDMuMDU5MDIzMjA1MDE4MjU3ODgzNzE0Nzk0OTc3MDIyODk2MzkzNzA4MjA3ODA4MTg1NkUtNyBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDMwCitleHB4MjMzIGV4cCAwIC0+IDEKKy0tIGl0ZXJhdGlvbnM6IDIKK2V4cHgyMzQgZXhwIDFFLTQwIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDcKK2V4cHgyMzUgZXhwIDlFLTcgLT4gMS4wMDAwMDA5MDAwMDA0MDUwMDAxMjE1MDAwMjczMzc1MDQ5MjA3NTA3MzgxMTI1OTQ5IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogNgorZXhweDIzNiBleHAgOUUtOCAtPiAxLjAwMDAwMDA5MDAwMDAwNDA1MDAwMDEyMTUwMDAwMjczMzc1MDA0OTIwNzUwMDczODEgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAxNQorZXhweDIzNyBleHAgMC4wMDMgLT4gMS4wMDMwMDQ1MDQ1MDMzNzcwMjYwMTI5MzQwOTEzNDg5MDAyMDUzMzE4NzI3MTk1NjE5IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMTMKK2V4cHgyMzggZXhwIDAuMDAxIC0+IDEuMDAxMDAwNTAwMTY2NzA4MzQxNjY4MDU1NzUzOTkzMDU4MzExNTYzMDc2MjAwNTgwNyBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDI1CitleHB4MjM5IGV4cCAwLjEgLT4gMS4xMDUxNzA5MTgwNzU2NDc2MjQ4MTE3MDc4MjY0OTAyNDY2NjgyMjQ1NDcxOTQ3Mzc1IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMzgKK2V4cHgyNDAgZXhwIDAuNyAtPiAyLjAxMzc1MjcwNzQ3MDQ3NjUyMTYyNDU0OTM4ODU4MzA2NTI3MDAxNzU0MjM5NDE0NTkgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiA0MQorZXhweDI0MSBleHAgMC45IC0+IDIuNDU5NjAzMTExMTU2OTQ5NjYzODAwMTI2NTYzNjAyNDcwNjk1NDIxNzcyMzA2NDQwMSBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDQyCitleHB4MjQyIGV4cCAwLjk5IC0+IDIuNjkxMjM0NDcyMzQ5MjYyMjg5MDk5ODc5NDA0MDcxMDEzOTcyMTgwMjkzMTg0MTAzMCBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDI2CitleHB4MjQzIGV4cCAxIC0+IDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYyNDk3NzU3MjQ3MDkzNzAwMCBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDI2CitleHB4MjQ0IGV4cCAxLjAxIC0+IDIuNzQ1NjAxMDE1MDE2OTE2NDkzOTg5Nzc2MzE2NjYwMzg3NjI0MDczNzUwODE5NTk2MCBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDI2CitleHB4MjQ1IGV4cCAxLjEgLT4gMy4wMDQxNjYwMjM5NDY0MzMxMTIwNTg0MDc5NTM1ODg2NzIzOTMyODI2ODEwMjYwMTYzIEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMjgKK2V4cHgyNDYgZXhwIDEuNSAtPiA0LjQ4MTY4OTA3MDMzODA2NDgyMjYwMjA1NTQ2MDExOTI3NTgxOTAwNTc0OTg2ODM2OTcgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyOQorZXhweDI0NyBleHAgMiAtPiA3LjM4OTA1NjA5ODkzMDY1MDIyNzIzMDQyNzQ2MDU3NTAwNzgxMzE4MDMxNTU3MDU1MTggSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAzNgorZXhweDI0OCBleHAgNSAtPiAxNDguNDEzMTU5MTAyNTc2NjAzNDIxMTE1NTgwMDQwNTUyMjc5NjIzNDg3NjY3NTkzODggSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyNgorZXhweDI0OSBleHAgMTAgLT4gMjIwMjYuNDY1Nzk0ODA2NzE2NTE2OTU3OTAwNjQ1Mjg0MjQ0MzY2MzUzNTEyNjE4NTU3IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMjgKK2V4cHgyNTAgZXhwIDE0IC0+IDEyMDI2MDQuMjg0MTY0Nzc2Nzc3NzQ5MjM2NzcwNzY3ODU5NDQ5NDEyNDg2NTQzMzc2MSBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDI4CitleHB4MjUxIGV4cCAxNSAtPiAzMjY5MDE3LjM3MjQ3MjExMDYzOTMwMTg1NTA0NjA5MTcyMTMxNTUwNTczODU0MzgyMDAgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyOQorCistLSBhIGJpZ2dpZSBbcmVzdWx0IHZlcmlmaWVkIDMgd2F5c10KK3ByZWNpc2lvbjogMjUwCitleHB4MjYwIGV4cCAxIC0+IDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYyNDk3NzU3MjQ3MDkzNjk5OTU5NTc0OTY2OTY3NjI3NzI0MDc2NjMwMzUzNTQ3NTk0NTcxMzgyMTc4NTI1MTY2NDI3NDI3NDY2MzkxOTMyMDAzMDU5OTIxODE3NDEzNTk2NjI5MDQzNTcyOTAwMzM0Mjk1MjYwNTk1NjMwNzM4MTMyMzI4NjI3OTQzNDkwNzYzMjMzODI5ODgwNzUzMTk1MjUxMDE5MDExNTczODM0MTg3OTMwNzAyMTU0MDg5MTQ5OTM0ODg0MTY3NTA5MjQ0NzYxNDYwNjY4IEluZXhhY3QgUm91bmRlZAorCistLSBleHRyZW1lIHJhbmdlIGJvdW5kYXJpZXMKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDk5OTk5OQorbWluRXhwb25lbnQ6IC05OTk5OTkKKy0tIE50aW55IGJvdW5kYXJ5CitleHB4MjkwIGV4cCAgLTIzMDI2MTguMDIyMzMyNTI5IC0+IDBFLTEwMDAwMTQgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZXhweDI5MSBleHAgIC0yMzAyNjE4LjAyMjMzMjUyOCAtPiAxRS0xMDAwMDE0IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCistLSBObWF4LzEwIGFuZCBObWF4IGJvdW5kYXJ5CitleHB4MjkyIGV4cCAgMjMwMjU4Mi43OTA0MDg5NTIgLT4gOS45OTk5OTk5OTMxMDAyNzdFKzk5OTk5OCAgSW5leGFjdCBSb3VuZGVkCitleHB4MjkzIGV4cCAgMjMwMjU4Mi43OTA0MDg5NTMgLT4gMS4wMDAwMDAwMDAzMTAwMjhFKzk5OTk5OSAgSW5leGFjdCBSb3VuZGVkCitleHB4Mjk0IGV4cCAgMjMwMjU4NS4wOTI5OTM5NDYgLT4gOS45OTk5OTkwMDMxNTk4NzBFKzk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgyOTUgZXhwICAyMzAyNTg1LjA5Mjk5NDAzNiAtPiA5Ljk5OTk5OTkwMzE1OTgyMUUrOTk5OTk5IEluZXhhY3QgUm91bmRlZAorZXhweDI5NiBleHAgIDIzMDI1ODUuMDkyOTk0MDQ1IC0+IDkuOTk5OTk5OTkzMTU5ODIwRSs5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitleHB4Mjk3IGV4cCAgMjMwMjU4NS4wOTI5OTQwNDYgLT4gSW5maW5pdHkgT3ZlcmZsb3cgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gMDwteDw8MSBlZmZlY3RzCitwcmVjaXNpb246ICAgIDMwCitleHB4MzIwIGV4cCAtNC45OTk5OTk5OTk5OTk5RS04IC0+IDAuOTk5OTk5OTUwMDAwMDAxMjUwMDAwOTc5MTY2NjE3IEluZXhhY3QgUm91bmRlZAorZXhweDMyMSBleHAgLTUuMDAwMDAwMDAwMDAwMEUtOCAtPiAwLjk5OTk5OTk1MDAwMDAwMTI0OTk5OTk3OTE2NjY2NyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzMjIgZXhwIC01LjAwMDAwMDAwMDAwMDFFLTggLT4gMC45OTk5OTk5NTAwMDAwMDEyNDk5OTg5NzkxNjY3MTcgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDIwCitleHB4MzIzIGV4cCAtNC45OTk5OTk5OTk5OTk5RS04IC0+IDAuOTk5OTk5OTUwMDAwMDAxMjUwMDAgSW5leGFjdCBSb3VuZGVkCitleHB4MzI0IGV4cCAtNS4wMDAwMDAwMDAwMDAwRS04IC0+IDAuOTk5OTk5OTUwMDAwMDAxMjUwMDAgSW5leGFjdCBSb3VuZGVkCitleHB4MzI1IGV4cCAtNS4wMDAwMDAwMDAwMDAxRS04IC0+IDAuOTk5OTk5OTUwMDAwMDAxMjUwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDE0CitleHB4MzI2IGV4cCAtNC45OTk5OTk5OTk5OTk5RS04IC0+IDAuOTk5OTk5OTUwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitleHB4MzI3IGV4cCAtNS4wMDAwMDAwMDAwMDAwRS04IC0+IDAuOTk5OTk5OTUwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitleHB4MzI4IGV4cCAtNS4wMDAwMDAwMDAwMDAxRS04IC0+IDAuOTk5OTk5OTUwMDAwMDAgSW5leGFjdCBSb3VuZGVkCistLSBvdmVycHJlY2lzZSBhbmQgMDwteDw8MQorcHJlY2lzaW9uOiAgICA4CitleHB4MzMwIGV4cCAtNC45OTk5OTk5OTk5OTk5RS04IC0+IDAuOTk5OTk5OTUgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4MzMxIGV4cCAtNS4wMDAwMDAwMDAwMDAwRS04IC0+IDAuOTk5OTk5OTUgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4MzMyIGV4cCAtNS4wMDAwMDAwMDAwMDAxRS04IC0+IDAuOTk5OTk5OTUgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDcKK2V4cHgzMzMgZXhwIC00Ljk5OTk5OTk5OTk5OTlFLTggLT4gMS4wMDAwMDAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzMzQgZXhwIC01LjAwMDAwMDAwMDAwMDBFLTggLT4gMS4wMDAwMDAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzMzUgZXhwIC01LjAwMDAwMDAwMDAwMDFFLTggLT4gMS4wMDAwMDAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgMworZXhweDMzNiBleHAgLTQuOTk5OTk5OTk5OTk5OUUtOCAtPiAxLjAwICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDMzNyBleHAgLTUuMDAwMDAwMDAwMDAwMEUtOCAtPiAxLjAwICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDMzOCBleHAgLTUuMDAwMDAwMDAwMDAwMUUtOCAtPiAxLjAwICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorCistLSAwPHg8PDEgZWZmZWN0cworcHJlY2lzaW9uOiAgICAzMAorZXhweDM0MCBleHAgIDQuOTk5OTk5OTk5OTk5OUUtOCAtPiAxLjAwMDAwMDA1MDAwMDAwMTI0OTk5OTAyMDgzMzI4ICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzNDEgZXhwICA1LjAwMDAwMDAwMDAwMDBFLTggLT4gMS4wMDAwMDAwNTAwMDAwMDEyNTAwMDAwMjA4MzMzMyAgSW5leGFjdCBSb3VuZGVkCitleHB4MzQyIGV4cCAgNS4wMDAwMDAwMDAwMDAxRS04IC0+IDEuMDAwMDAwMDUwMDAwMDAxMjUwMDAxMDIwODMzMzggIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICAyMAorZXhweDM0MyBleHAgIDQuOTk5OTk5OTk5OTk5OUUtOCAtPiAxLjAwMDAwMDA1MDAwMDAwMTI1MDAgIEluZXhhY3QgUm91bmRlZAorZXhweDM0NCBleHAgIDUuMDAwMDAwMDAwMDAwMEUtOCAtPiAxLjAwMDAwMDA1MDAwMDAwMTI1MDAgIEluZXhhY3QgUm91bmRlZAorZXhweDM0NSBleHAgIDUuMDAwMDAwMDAwMDAwMUUtOCAtPiAxLjAwMDAwMDA1MDAwMDAwMTI1MDAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICAxNAorZXhweDM0NiBleHAgIDQuOTk5OTk5OTk5OTk5OUUtOCAtPiAxLjAwMDAwMDA1MDAwMDAgIEluZXhhY3QgUm91bmRlZAorZXhweDM0NyBleHAgIDUuMDAwMDAwMDAwMDAwMEUtOCAtPiAxLjAwMDAwMDA1MDAwMDAgIEluZXhhY3QgUm91bmRlZAorZXhweDM0OCBleHAgIDUuMDAwMDAwMDAwMDAwMUUtOCAtPiAxLjAwMDAwMDA1MDAwMDAgIEluZXhhY3QgUm91bmRlZAorLS0gb3ZlcnByZWNpc2UgYW5kIDA8eDw8MQorcHJlY2lzaW9uOiAgICA4CitleHB4MzUwIGV4cCAgNC45OTk5OTk5OTk5OTk5RS04IC0+IDEuMDAwMDAwMSAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4MzUxIGV4cCAgNS4wMDAwMDAwMDAwMDAwRS04IC0+IDEuMDAwMDAwMSAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4MzUyIGV4cCAgNS4wMDAwMDAwMDAwMDAxRS04IC0+IDEuMDAwMDAwMSAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDcKK2V4cHgzNTMgZXhwICA0Ljk5OTk5OTk5OTk5OTlFLTggLT4gMS4wMDAwMDAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzNTQgZXhwICA1LjAwMDAwMDAwMDAwMDBFLTggLT4gMS4wMDAwMDAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzNTUgZXhwICA1LjAwMDAwMDAwMDAwMDFFLTggLT4gMS4wMDAwMDAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgMworZXhweDM1NiBleHAgIDQuOTk5OTk5OTk5OTk5OUUtOCAtPiAxLjAwICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDM1NyBleHAgIDUuMDAwMDAwMDAwMDAwMEUtOCAtPiAxLjAwICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDM1OCBleHAgIDUuMDAwMDAwMDAwMDAwMUUtOCAtPiAxLjAwICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorCistLSBjYXNlcyBuZWFyIDEgICAgICAgICAgICAgIC0tICAxIDIzNDU2Nzg5MDEyMzQ1Njc4OTAKK3ByZWNpc2lvbjogICAgMjAKK2V4cHg0MDEgZXhwIDAuOTk5OTk5OTk5OTk5OTYgIC0+IDIuNzE4MjgxODI4NDU4OTM2NTA0MSAgSW5leGFjdCBSb3VuZGVkCitleHB4NDAyIGV4cCAwLjk5OTk5OTk5OTk5OTk3ICAtPiAyLjcxODI4MTgyODQ1ODk2MzY4NjkgIEluZXhhY3QgUm91bmRlZAorZXhweDQwMyBleHAgMC45OTk5OTk5OTk5OTk5OCAgLT4gMi43MTgyODE4Mjg0NTg5OTA4Njk3ICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MDQgZXhwIDAuOTk5OTk5OTk5OTk5OTkgIC0+IDIuNzE4MjgxODI4NDU5MDE4MDUyNSAgSW5leGFjdCBSb3VuZGVkCitleHB4NDA1IGV4cCAxLjAwMDAwMDAwMDAwMDAgICAtPiAyLjcxODI4MTgyODQ1OTA0NTIzNTQgIEluZXhhY3QgUm91bmRlZAorZXhweDQwNiBleHAgMS4wMDAwMDAwMDAwMDAxICAgLT4gMi43MTgyODE4Mjg0NTkzMTcwNjM1ICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MDcgZXhwIDEuMDAwMDAwMDAwMDAwMiAgIC0+IDIuNzE4MjgxODI4NDU5NTg4ODkxNyAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDE0CitleHB4NDExIGV4cCAwLjk5OTk5OTk5OTk5OTk2ICAtPiAyLjcxODI4MTgyODQ1ODkgIEluZXhhY3QgUm91bmRlZAorZXhweDQxMiBleHAgMC45OTk5OTk5OTk5OTk5NyAgLT4gMi43MTgyODE4Mjg0NTkwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MTMgZXhwIDAuOTk5OTk5OTk5OTk5OTggIC0+IDIuNzE4MjgxODI4NDU5MCAgSW5leGFjdCBSb3VuZGVkCitleHB4NDE0IGV4cCAwLjk5OTk5OTk5OTk5OTk5ICAtPiAyLjcxODI4MTgyODQ1OTAgIEluZXhhY3QgUm91bmRlZAorZXhweDQxNSBleHAgMS4wMDAwMDAwMDAwMDAwICAgLT4gMi43MTgyODE4Mjg0NTkwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MTYgZXhwIDEuMDAwMDAwMDAwMDAwMSAgIC0+IDIuNzE4MjgxODI4NDU5MyAgSW5leGFjdCBSb3VuZGVkCitleHB4NDE3IGV4cCAxLjAwMDAwMDAwMDAwMDIgICAtPiAyLjcxODI4MTgyODQ1OTYgIEluZXhhY3QgUm91bmRlZAorLS0gb3ZlcnByZWNpc2UuLi4KK3ByZWNpc2lvbjogICAgNworZXhweDQyMSBleHAgMC45OTk5OTk5OTk5OTk5NiAgLT4gMi43MTgyODIgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MjIgZXhwIDAuOTk5OTk5OTk5OTk5OTcgIC0+IDIuNzE4MjgyICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NDIzIGV4cCAwLjk5OTk5OTk5OTk5OTk4ICAtPiAyLjcxODI4MiAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDQyNCBleHAgMC45OTk5OTk5OTk5OTk5OSAgLT4gMi43MTgyODIgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MjUgZXhwIDEuMDAwMDAwMDAwMDAwMSAgIC0+IDIuNzE4MjgyICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NDI2IGV4cCAxLjAwMDAwMDAwMDAwMDIgICAtPiAyLjcxODI4MiAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDQyNyBleHAgMS4wMDAwMDAwMDAwMDAzICAgLT4gMi43MTgyODIgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgMgorZXhweDQzMSBleHAgMC45OTk5OTk5OTk5OTk5NiAgLT4gMi43ICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MzIgZXhwIDAuOTk5OTk5OTk5OTk5OTcgIC0+IDIuNyAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NDMzIGV4cCAwLjk5OTk5OTk5OTk5OTk4ICAtPiAyLjcgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDQzNCBleHAgMC45OTk5OTk5OTk5OTk5OSAgLT4gMi43ICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MzUgZXhwIDEuMDAwMDAwMDAwMDAwMSAgIC0+IDIuNyAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NDM2IGV4cCAxLjAwMDAwMDAwMDAwMDIgICAtPiAyLjcgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDQzNyBleHAgMS4wMDAwMDAwMDAwMDAzICAgLT4gMi43ICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gYmFzaWNzIGF0IGxvdyBwcmVjaXNpb25zCitwcmVjaXNpb246IDMKK2V4cHg1MDEgZXhwICAtSW5maW5pdHkgICAgIC0+IDAKK2V4cHg1MDIgZXhwICAtMTAgICAgICAgICAgIC0+IDAuMDAwMDQ1NCAgIEluZXhhY3QgUm91bmRlZAorZXhweDUwMyBleHAgIC0xICAgICAgICAgICAgLT4gMC4zNjggICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NTA0IGV4cCAgIDAgICAgICAgICAgICAtPiAxCitleHB4NTA1IGV4cCAgLTAgICAgICAgICAgICAtPiAxCitleHB4NTA2IGV4cCAgIDEgICAgICAgICAgICAtPiAyLjcyICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg1MDcgZXhwICAgMC42OTMxNDcxODEgIC0+IDIuMDAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDUwOCBleHAgICAxMCAgICAgICAgICAgLT4gMi4yMEUrNCAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NTA5IGV4cCAgK0luZmluaXR5ICAgICAtPiBJbmZpbml0eQorcHJlY2lzaW9uOiAyCitleHB4NTExIGV4cCAgLUluZmluaXR5ICAgICAtPiAwCitleHB4NTEyIGV4cCAgLTEwICAgICAgICAgICAtPiAwLjAwMDA0NSAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg1MTMgZXhwICAtMSAgICAgICAgICAgIC0+IDAuMzcgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDUxNCBleHAgICAwICAgICAgICAgICAgLT4gMQorZXhweDUxNSBleHAgIC0wICAgICAgICAgICAgLT4gMQorZXhweDUxNiBleHAgICAxICAgICAgICAgICAgLT4gMi43ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NTE3IGV4cCAgIDAuNjkzMTQ3MTgxICAtPiAyLjAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg1MTggZXhwICAgMTAgICAgICAgICAgIC0+IDIuMkUrNCAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDUxOSBleHAgICtJbmZpbml0eSAgICAgLT4gSW5maW5pdHkKK3ByZWNpc2lvbjogMQorZXhweDUyMSBleHAgIC1JbmZpbml0eSAgICAgLT4gMAorZXhweDUyMiBleHAgIC0xMCAgICAgICAgICAgLT4gMC4wMDAwNSAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NTIzIGV4cCAgLTEgICAgICAgICAgICAtPiAwLjQgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg1MjQgZXhwICAgMCAgICAgICAgICAgIC0+IDEKK2V4cHg1MjUgZXhwICAtMCAgICAgICAgICAgIC0+IDEKK2V4cHg1MjYgZXhwICAgMSAgICAgICAgICAgIC0+IDMgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDUyNyBleHAgICAwLjY5MzE0NzE4MSAgLT4gMiAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NTI4IGV4cCAgIDEwICAgICAgICAgICAtPiAyRSs0ICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg1MjkgZXhwICArSW5maW5pdHkgICAgIC0+IEluZmluaXR5CisKKy0tIG92ZXJmbG93cywgaW5jbHVkaW5nIHNvbWUgb3ZlcnByZWNpc2UgYm9yZGVybGluZXMKK3ByZWNpc2lvbjogICA3CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXhweDcwMSBleHAgIDEwMDAwMDAwMDAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDcwMiBleHAgIDEwMDAwMDAwMCAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDcwMyBleHAgIDEwMDAwMDAwICAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDcwNCBleHAgIDEwMDAwMDAgICAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDcwNSBleHAgIDEwMDAwMCAgICAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDcwNiBleHAgIDEwMDAwICAgICAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDcwNyBleHAgIDEwMDAgICAgICAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDcwOCBleHAgIDg4Ni40OTUyNjA4IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDcwOSBleHAgIDg4Ni40OTUyNjA3IC0+IDkuOTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitleHB4NzEwIGV4cCAgODg2LjQ5NTI3ICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitleHB4NzExIGV4cCAgODg2LjQ5NTI2ICAgLT4gOS45OTk5OTJFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAxNgorZXhweDcyMSBleHAgIDg4Ni40OTUyNjA4MDI3MDc1ODgzIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDcyMiBleHAgIDg4Ni40OTUyNjA4MDI3MDc1ODgyIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitleHB4NzIzIGV4cCAgODg2LjQ5NTI2MDgwMjcwNzU5ICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitleHB4NzI0IGV4cCAgODg2LjQ5NTI2MDgwMjcwNzU4ICAgLT4gOS45OTk5OTk5OTk5OTk5MTdFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MjUgZXhwICA4ODYuNDk1MjYwODAyNzA3NiAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MjYgZXhwICA4ODYuNDk1MjYwODAyNzA3NSAgICAtPiA5Ljk5OTk5OTk5OTk5OTExN0UrMzg0IEluZXhhY3QgUm91bmRlZAorLS0gYW5kIGJ5IHNwZWNpYWwgcmVxdWVzdCAuLi4KK3ByZWNpc2lvbjogICAxNQorZXhweDczMSBleHAgIDg4Ni40OTUyNjA4MDI3MDggICAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDczMiBleHAgIDg4Ni40OTUyNjA4MDI3MDcgICAgIC0+IDkuOTk5OTk5OTk5OTk0MTJFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MzMgZXhwICA4ODYuNDk1MjYwODAyNzA2ICAgICAtPiA5Ljk5OTk5OTk5OTk4NDEyRSszODQgSW5leGFjdCBSb3VuZGVkCittYXhFeHBvbmVudDogOTk5CittaW5FeHBvbmVudDogLTk5OQorZXhweDczNSBleHAgIDIzMDIuNTg1MDkyOTk0MDUgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitleHB4NzM2IGV4cCAgMjMwMi41ODUwOTI5OTQwNCAgICAtPiA5Ljk5OTk5OTk5OTk0MzE2RSs5OTkgSW5leGFjdCBSb3VuZGVkCitleHB4NzM3IGV4cCAgMjMwMi41ODUwOTI5OTQwMyAgICAtPiA5Ljk5OTk5OTk5OTg0MzE2RSs5OTkgSW5leGFjdCBSb3VuZGVkCisKKy0tIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvd3MsIGluY2x1ZGluZyB1bmRlcmZsb3ctdG8temVybyBlZGdlIHBvaW50CitwcmVjaXNpb246ICAgNworbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4cHg3NTEgZXhwIC0xMDAwMDAwMDAwICAgLT4gIDBFLTM4OSBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQgU3Vibm9ybWFsCitleHB4NzUyIGV4cCAtMTAwMDAwMDAwICAgIC0+ICAwRS0zODkgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkIFN1Ym5vcm1hbAorZXhweDc1MyBleHAgLTEwMDAwMDAwICAgICAtPiAgMEUtMzg5IFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZCBTdWJub3JtYWwKK2V4cHg3NTQgZXhwIC0xMDAwMDAwICAgICAgLT4gIDBFLTM4OSBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQgU3Vibm9ybWFsCitleHB4NzU1IGV4cCAtMTAwMDAwICAgICAgIC0+ICAwRS0zODkgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkIFN1Ym5vcm1hbAorZXhweDc1NiBleHAgLTEwMDAwICAgICAgICAtPiAgMEUtMzg5IFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZCBTdWJub3JtYWwKK2V4cHg3NTcgZXhwIC0xMDAwICAgICAgICAgLT4gIDBFLTM4OSBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQgU3Vibm9ybWFsCitleHB4NzU4IGV4cCAtODgxLjg5MDA5ICAgIC0+ICAxLjAwMDAwMUUtMzgzIEluZXhhY3QgUm91bmRlZAorZXhweDc1OSBleHAgLTg4MS44OTAxICAgICAtPiAgOS45OTk5MUUtMzg0ICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZXhweDc2MCBleHAgLTg4NSAgICAgICAgICAtPiAgNC40NjA1RS0zODUgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZXhweDc2MSBleHAgLTg4OCAgICAgICAgICAtPiAgMi4yMjFFLTM4NiAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZXhweDc2MiBleHAgLTg5MCAgICAgICAgICAtPiAgMy4wMUUtMzg3ICAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZXhweDc2MyBleHAgLTg5Mi45ICAgICAgICAtPiAgMS43RS0zODggICAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZXhweDc2NCBleHAgLTg5MyAgICAgICAgICAtPiAgMS41RS0zODggICAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZXhweDc2NSBleHAgLTg5My41ICAgICAgICAtPiAgOUUtMzg5ICAgICAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZXhweDc2NiBleHAgLTg5NS43MDU2ICAgICAtPiAgMUUtMzg5ICAgICAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZXhweDc2OSBleHAgLTg5NS44ICAgICAgICAtPiAgMUUtMzg5ICAgICAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZXhweDc3MCBleHAgLTg5NS43MyAgICAgICAtPiAgMUUtMzg5ICAgICAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZXhweDc3MSBleHAgLTg5Ni4zOTg3ICAgICAtPiAgMUUtMzg5ICAgICAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZXhweDc3MiBleHAgLTg5Ni4zOTg4ICAgICAtPiAgMEUtMzg5ICAgICAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbCBDbGFtcGVkCitleHB4NzczIGV4cCAtODk4LjAwODEgICAgIC0+ICAwRS0zODkgICAgICAgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsIENsYW1wZWQKK2V4cHg3NzQgZXhwIC04OTguMDA4MiAgICAgLT4gIDBFLTM4OSAgICAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwgQ2xhbXBlZAorCistLSBzcGVjaWFsIHZhbHVlcworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK2V4cHg4MjAgZXhwICAgSW5mICAgIC0+IEluZmluaXR5CitleHB4ODIxIGV4cCAgLUluZiAgICAtPiAwCitleHB4ODIyIGV4cCAgIE5hTiAgICAtPiBOYU4KK2V4cHg4MjMgZXhwICBzTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gcHJvcGFnYXRpbmcgTmFOcworZXhweDgyNCBleHAgIHNOYU4xMjMgLT4gIE5hTjEyMyBJbnZhbGlkX29wZXJhdGlvbgorZXhweDgyNSBleHAgLXNOYU4zMjEgLT4gLU5hTjMyMSBJbnZhbGlkX29wZXJhdGlvbgorZXhweDgyNiBleHAgICBOYU40NTYgLT4gIE5hTjQ1NgorZXhweDgyNyBleHAgIC1OYU42NTQgLT4gLU5hTjY1NAorZXhweDgyOCBleHAgICBOYU4xICAgLT4gIE5hTjEKKworLS0gSW52YWxpZCBvcGVyYXRpb25zIGR1ZSB0byByZXN0cmljdGlvbnMKKy0tIFtuZXh0IHR3byBwcm9iYWJseSBza2lwcGVkIGJ5IG1vc3QgdGVzdCBoYXJuZXNzZXNdCitwcmVjaXNpb246IDEwMDAwMDAwMAorZXhweDkwMSBleHAgIC1JbmZpbml0eSAgICAgLT4gTmFOIEludmFsaWRfY29udGV4dAorcHJlY2lzaW9uOiAgOTk5OTk5OTkKK2V4cHg5MDIgZXhwICAtSW5maW5pdHkgICAgIC0+IE5hTiBJbnZhbGlkX2NvbnRleHQKKworcHJlY2lzaW9uOiA5CittYXhFeHBvbmVudDogICAxMDAwMDAwCittaW5FeHBvbmVudDogICAtOTk5OTk5CitleHB4OTAzIGV4cCAgLUluZmluaXR5ICAgICAtPiBOYU4gSW52YWxpZF9jb250ZXh0CittYXhFeHBvbmVudDogICAgOTk5OTk5CittaW5FeHBvbmVudDogICAtOTk5OTk5CitleHB4OTA0IGV4cCAgLUluZmluaXR5ICAgICAtPiAwCittYXhFeHBvbmVudDogICAgOTk5OTk5CittaW5FeHBvbmVudDogIC0xMDAwMDAwCitleHB4OTA1IGV4cCAgLUluZmluaXR5ICAgICAtPiBOYU4gSW52YWxpZF9jb250ZXh0CittYXhFeHBvbmVudDogICAgOTk5OTk5CittaW5FeHBvbmVudDogICAtOTk5OTk4CitleHB4OTA2IGV4cCAgLUluZmluaXR5ICAgICAtPiAwCisKKy0tCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIE51bGwgdGVzdAorZXhweDkwMCBleHAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKworLS0gUmFuZG9tcyBQPTUwLCB3aXRoaW4gMC05OTkKK1ByZWNpc2lvbjogNTAKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHB4MTUwMSBleHAgNjU2LjM1Mzk3OTUwNTkwMjg1NjEyMjY2MDk1NTk2NTM5OTM0MjEzOTQzODcyODg1NzI4ICAtPiAxLjEyNDM3NTc2MTA2NDAzMTk3ODM2MTExNzg1Mjg4Mzk2NTI2NzIwNjI4MjAwNDAzMTRFKzI4NSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTAyIGV4cCAwLjkzNjIwNTcxMDkzNjUyODAwMjI1MDM4NTUwNjAwNzgwMzIyODMxMjM2MDgyNzgxNDcxIC0+IDIuNTUwMjg2NTEzMDk4NjE3NjY4OTE5OTcxMTg1NzgyNTc3MTMxMTE3ODA0Njg0MjAwOSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTAzIGV4cCAwLjAwMDAwMDAwMDAwMDAwMDA4MzQwNzg1ODU2NjAxNTE0NzE0MTgzMzczODc0MTA1NzkxIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDgzNDA3ODU4NTY2MDE1MTUwNjIwMjY5MTc0MDI1MjUxMiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTA0IGV4cCAwLjAwMDA5MTc0MDU3MjYyODg3Nzg5NjI1NzQ1NTc0Njg2NTQ1MTYzMTY4Nzg4NDU2MjAzIC0+IDEuMDAwMDkxNzQ0NzgwOTIzOTAwNTE0NjcyMjM0MTI1MTUyNDA4MTAwNjA1MTQ3MzI3MyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTA1IGV4cCAzMy45MDkxMTY4OTc5NzM3OTc3MzU2NTc3NTE1OTEwMTQ5MjY2MjkwNTExMTc1NDEyNDMgIC0+IDUzMjc3MzE4MTAyNTAwMi4wMzU0MzYxODkwMTMwNjcyNjQ5NTg3MDQ3NjYxNzIzMjIyOSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTA2IGV4cCAwLjAwMDAwNzQwNDcwNDEzMDA0NDA2NTkyMTI0NTc1Mjk1Mjc4NDU2OTM2ODA5NTg3MzExIC0+IDEuMDAwMDA3NDA0NzMxNTQ0OTMzMzU5MDA2NjM5NTY3MDMwNjEzNTU2Nzg4OTIxMDgxNCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTA3IGV4cCAwLjAwMDAwMDAwMDAwMTI0ODU0OTIyMjIyMTA4ODAyNDUzNzQ2OTIyNDgzMDcxNDQ1NDkyIC0+IDEuMDAwMDAwMDAwMDAxMjQ4NTQ5MjIyMjIxODY3NDYyMTE3NjIzOTkxMTQyNDk2ODI2MyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTA4IGV4cCA0LjE3OTMyODA2NzQxNTU2NTk3OTQyODY5NTExNTk0MzA2NTEyNTgzNTYwMTQzOTEzODIgIC0+IDY1LjMyMTk0NjUyMDE0NzE5OTQwNDE5OTc4NzgxMTMzNjg2MDA4Nzk3NTExODI3ODE4NSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTA5IGV4cCA0ODUuNDM1OTU3NDU0NjA2NTU4OTM3NDYxNzk4OTAyNTU1Mjk5MTkyMjE1NTAyMDE2ODYgIC0+IDYuNjM5ODQwMzkyMDQ1OTYxNzI1NTk1MDQ3Njk1MzEyOTM3NzQ1OTg0NTM2NjU4NTQ2M0UrMjEwIEluZXhhY3QgUm91bmRlZAorZXhweDE1MTAgZXhwIDAuMDAwMDAwMDAwMDM1NDcyNTk4MDY1OTA4NTYwMzI1Mjc4NzUxNTc4MzAzMjgxNTY1OTcgLT4gMS4wMDAwMDAwMDAwMzU0NzI1OTgwNjY1Mzc3MTI5MzIwNTg5NDA2NzE1MDAwNjg1NTE1IEluZXhhY3QgUm91bmRlZAorZXhweDE1MTEgZXhwIDAuMDAwMDAwMDAwMDAwMDA3NTk2MjE0OTczMzkxMDQwNDc5MzA2MTY0Nzg2MzUwNDI2NzggLT4gMS4wMDAwMDAwMDAwMDAwMDc1OTYyMTQ5NzMzOTEwNjkzMzA1NDcxMjU3NzE1NDYzODg3IEluZXhhY3QgUm91bmRlZAorZXhweDE1MTIgZXhwIDkuNzk1OTE2ODgyMTc2MDMzOTMwNDU3MTU5NTQ3NDQ4MDY0MDI4NjA3MjcyMDIzMzc5NiAgLT4gMTc5NjAuMjYxMTQ2MDQyOTU1MTc5MTY0MzAzNjUzNDEyNjUwNzUxNjgxNDM2MzUyNDM3IEluZXhhY3QgUm91bmRlZAorZXhweDE1MTMgZXhwIDAuMDAwMDAwMDA1NjY2NDIwMDYyNTgyOTA1MjY3ODM5MDE0NTExOTQ5NDMxNjQ1MzU1ODEgLT4gMS4wMDAwMDAwMDU2NjY0MjAwNzg2MzcwNjM0NjA5ODMyNDM4ODE1NjY1MjQ5MzQ3NjUwIEluZXhhY3QgUm91bmRlZAorZXhweDE1MTQgZXhwIDc0MS4yOTg4ODc5MTEzNDI5ODE5NDA4ODgyNzU3MjM3NDcxODk0MDkyNTgyMDAyNzM1NCAgLT4gOC43NTAxNjk0MDA2MzE3MzMyODA4MTI4OTQ2NjY2NDAyNjIyNDMyMDY0OTIzMTk4NzMxRSszMjEgSW5leGFjdCBSb3VuZGVkCitleHB4MTUxNSBleHAgMDMyLjc1NTczMDAzNTUyNTE3NjY4ODA4NTI5MDk5ODk3MTUzNzEwODg3MDE0OTQ3OTM1ICAtPiAxNjgxMjUxOTY1Nzg2NzguMTc3MjU4NDExMDg2MTc5NTU5MDQ0MjUzNDU2MzEwOTIzMzkgSW5leGFjdCBSb3VuZGVkCitleHB4MTUxNiBleHAgNDIuMzMzNzAwNzI2NDI5MzMzMzA4NTk0MjY1NTUzNDIyOTAyNDYzNzM3Mzk5NDM3NjQ0ICAtPiAyNDI4MjQ1Njc1ODY0MTcyNDc1LjQ2ODExMTk0OTMwNDU2NTc3OTczMDkzNjk2NzIwMTIgSW5leGFjdCBSb3VuZGVkCitleHB4MTUxNyBleHAgMC4wMDAwMDAwMDAwMDAwMDU1OTY4MjYxNjg3NjQ5MTg4ODE5NzYwOTE1ODgwMjgzNTc5OCAtPiAxLjAwMDAwMDAwMDAwMDAwNTU5NjgyNjE2ODc2NDkzNDU0NDIwNzY3MzI3Mzk1NzcwNDkgSW5leGFjdCBSb3VuZGVkCitleHB4MTUxOCBleHAgMC4wMDAwMDAwMDAwMDA4MDcwMzY4ODY2ODI4MDE5MzU4NDc1ODMwMDk3MzU0OTQ4NjMxMiAtPiAxLjAwMDAwMDAwMDAwMDgwNzAzNjg4NjY4MzEyNzU5MDExNTgxNjQzMjE4Njc5MTQzNDIgSW5leGFjdCBSb3VuZGVkCitleHB4MTUxOSBleHAgNjQwLjcyMzk2MDEyNzk2NTA5NDgyMzgyNzEyODkxNzA5MDcyNTcwNjUzNjA2ODM4MjUxICAtPiAxLjgzMTgwOTQ5OTA2ODMzOTQyMjkzMDQxMzMwNjg5ODM5MTQyMzY5OTUzMjY4OTEwNDVFKzI3OCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTIwIGV4cCAwLjAwMDAwMDAwMDAwMDAwNTA5NDU4OTIyMTY3NjMxMDcxNDE2OTQ4MTEyMjE5NTEyMjI0IC0+IDEuMDAwMDAwMDAwMDAwMDA1MDk0NTg5MjIxNjc2MzIzNjkxNTg5MTQ5OTMyNDM1ODU1NiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTIxIGV4cCA2Ljc2NzAzOTQzMTQzMTUyMDYzNzg2MjUyMjE1ODM5NzM0MTQ2NjA3Mjc5NjAyNDEzOTUgIC0+IDg2OC43MzYxMzAxMjgyMjAzMTM2NzgwNjI0ODY5NzA5Mjg4NDQxNTExOTU2ODI3MTMxNSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTIyIGV4cCAwNC44MjMyMTc0MDc0MTI5NjM1MDY2MzgyNjcyMjY4OTEwMjQxMzgwNTQ3ODMxMjI1NDggIC0+IDEyNC4zNjQ1NzkyOTU4ODgzNzEyOTczMTgyMTA3NzU4NjcwNTUwNTU2NTkwNDIwNTM2NiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTIzIGV4cCAxOTMuNTEzMDc4Nzg3MDExOTY0MDM5OTEyMDg0ODI1MjAxMTUzNTk2OTAxMDYxNDM2MTUgIC0+IDEuMTAwNjgzMDg3Mjg1NDcxNTY3NzM5MDkxNDY1NTQ1MjI2MTU1MDc2ODk1NzU3NjAzNEUrODQgSW5leGFjdCBSb3VuZGVkCitleHB4MTUyNCBleHAgNS43MzA3NzQ5MDM4MzAzNjUwNTM5MjAwMzQ1OTAxMjEwNDk3MDE1NjE3MzkzOTcwNDYzICAtPiAzMDguMjA4MDA3NDMxMDY4NDMwODM1MjI3MjE1MjM3MTU2NDU5NTA1NzQ4NjY0OTUxOTYgSW5leGFjdCBSb3VuZGVkCitleHB4MTUyNSBleHAgMC4wMDAwMDAwMDAwMDA5NTIxNzgyNTE5OTc5Nzk2NTIwMDU0MTE2OTEyMzc0MzUwMDI2NyAtPiAxLjAwMDAwMDAwMDAwMDk1MjE3ODI1MTk5ODQzMjk3MzcxNzIwMDc5OTEzOTAzODEyNzMgSW5leGFjdCBSb3VuZGVkCitleHB4MTUyNiBleHAgMC4wMDAyNzEzMTQ0MDk0OTE4MzM3MDk2NjM5MzY4MjYxNzkzMDE1MzQ5NTAyODkxOTE0MCAtPiAxLjAwMDI3MTM1MTIxODU3NTEwMjI5MDYwNTgxNjA0ODA2MDY1OTg3NTQ5MTM2MDczNjQgSW5leGFjdCBSb3VuZGVkCitleHB4MTUyNyBleHAgMC4wMDAwMDAwMDA2NDUwMzA1OTExNDY4MDY4MjM0MzAwMjMxNTY2MjA2OTI3MjcwNzEyMyAtPiAxLjAwMDAwMDAwMDY0NTAzMDU5MTM1NDgzOTA1NTIzMjM1MTc0MDM2MTMxMzU0OTY2MzMgSW5leGFjdCBSb3VuZGVkCitleHB4MTUyOCBleHAgMC4wMDAwMDAwMDAwMDAwMDA5NTYxNjY0MzUwNjUyNzI4ODg2NjIzNTIzODU0ODQ0MDU5MyAtPiAxLjAwMDAwMDAwMDAwMDAwMDk1NjE2NjQzNTA2NTI3MzM0NTc4OTQ3ODE1ODIwMDkwOTQgSW5leGFjdCBSb3VuZGVkCitleHB4MTUyOSBleHAgMC4wMDAwMDAwMDAwMDAwMDA4NjQ0OTk0MjgxMTY3ODY1MDI0NDQ1OTU1MDI1Mjc0MzQzMyAtPiAxLjAwMDAwMDAwMDAwMDAwMDg2NDQ5OTQyODExNjc4Njg3NjEyNDIyNjEwOTY1Mjk5ODYgSW5leGFjdCBSb3VuZGVkCitleHB4MTUzMCBleHAgMC4wNjIyMzQ4ODM1NTYzNTM1OTk2NTY4MzA1MzE1NzcyOTIwNDk4ODM4MTg4NzYyMTg1MCAtPiAxLjA2NDIxMjI4MTMzOTI0MDY2NTc3ODk2ODg5MzE4Mzg5MTkzMjM4MjYyNTA2MzA4MzEgSW5leGFjdCBSb3VuZGVkCitleHB4MTUzMSBleHAgMC4wMDAwMDQwMDcxMDgwNzgwNDQyOTQzNTUwMjY1NzEzMTkxMjMwODY4MDY3NDA1NzA1MyAtPiAxLjAwMDAwNDAwNzExNjEwNjUxMjU5MjU2MjA4OTAwMTkzMTk4MzIxMjc4NjM1NTkyNjAgSW5leGFjdCBSb3VuZGVkCitleHB4MTUzMiBleHAgODUuNTIyNzk2ODk0NzQ0NTc2MjExNTczMjMyMDU1NDk0NTUxNDI5Mjk3ODc4NDEzMDE3ICAtPiAxMzg3MDA3MzY4NjQwNDIyODQ1Mjc1Nzc5OTc3MDI1MTA4NTE3Ny44NTMzMzczNjg5MzUgSW5leGFjdCBSb3VuZGVkCitleHB4MTUzMyBleHAgOS4xNDk2NzIwODExMzYzNjc4Njk2OTM4MDM2Mzc5NzU2NjYzNTQ4MzUzMzk5OTU0MzYzICAtPiA5NDExLjM1MzcxMjI4MzI3NDMzODY3ODM1OTc2MjkxNjE3NjMwNTczNzAwMzQ0OTUxNTcgSW5leGFjdCBSb3VuZGVkCitleHB4MTUzNCBleHAgOC4yMjE1NzA1MjQwNzg4Mjk0NDcyOTQ0MzgyMDU2MzMwNTE2NzM4NTc3Nzg1MTc3OTQyICAtPiAzNzIwLjM0MDY4MTMzODMwNzY5NTM4OTk2NTQ3MDE2MTUwODQ0MjU1OTgzNzc3NTgxODkgSW5leGFjdCBSb3VuZGVkCitleHB4MTUzNSBleHAgMC4wMDAwMDAwMDAxNTc3MjA2NDU2OTY0MDYxMzE0MjgyMzIwMzcyNjgyMTA3NjIzOTU2MSAtPiAxLjAwMDAwMDAwMDE1NzcyMDY0NTcwODg0NDAzMjQ2ODMzMTU3ODgzNTg5MjYxMjk4MzAgSW5leGFjdCBSb3VuZGVkCitleHB4MTUzNiBleHAgMC41ODE3OTM0NjQ3Mzk1OTUzMTQzMjYyNDE1MzU3Njg4MzQ0MDYyNTUzODAxNzUzMjQ4MCAtPiAxLjc4OTI0NDUwMTgyNzUzNjAxNjM3OTcwMjIzNzI2NTU4MzcxODg0MjMxOTQ4NjM2MDUgSW5leGFjdCBSb3VuZGVkCitleHB4MTUzNyBleHAgMzMuNTU1NzI2MTk3MTQ5NTI1MDYxNDU1NTE3Nzg0ODcwNTcwNDcwODMzNDk4MDk2NTU5ICAtPiAzNzQxNjgwNjk4OTYzMjQuNjI1NzgwNzMxNDg5OTM1MjY2MjYzMDcwOTU4NTQ0MDc5NTIgSW5leGFjdCBSb3VuZGVkCitleHB4MTUzOCBleHAgOS43ODk4MDc5ODAzOTA2MjE1MDk0MTQwMDEwMDA5NTgzMzc1NTM3MjU5ODEwMzk4NjU5ICAtPiAxNzg1MC44NzgxMTk5MTIyMDg4ODgyMTcxMDA5OTgwMTk5ODY2MzQ2MjAzNjg1Mzg0MjYgSW5leGFjdCBSb3VuZGVkCitleHB4MTUzOSBleHAgODkuMTU3Njk3MzI3MTc0NTIxNTQyNTAyNDQ3OTUzMDMyNTM2NTQxMDM4NjM2OTY2MzQ3ICAtPiA1MjU2NDkxNTIzMjAxNjY1MDM3NzEyMjQxNDkzMzA0NDgwODk1NTAuNjcyOTM4MjkyMjcgSW5leGFjdCBSb3VuZGVkCitleHB4MTU0MCBleHAgMjUuMDIyOTQ3NjAwMTIzMzI4OTEyMDI5MDUxODk3MTcxMzE5NTczMzIyODg4NTE0ODg1ICAtPiA3MzY3NjM0MzQ0Mi45NTI1MTc4MjQzNDU0MzE0Mzc2ODMxNTMzMDQ2NDU4NTE5NjA1MjQgSW5leGFjdCBSb3VuZGVkCisKKy0tIGV4cCgxKSBhdCAzNAorUHJlY2lzaW9uOiAzNAorZXhweDEyMDAgZXhwIDEgLT4gMi43MTgyODE4Mjg0NTkwNDUyMzUzNjAyODc0NzEzNTI2NjIgSW5leGFjdCBSb3VuZGVkCisKKy0tIFJhbmRvbXMgUD0zNCwgd2l0aGluIDAtOTk5CitQcmVjaXNpb246IDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCitleHB4MTIwMSBleHAgMzA5LjU5NDg4NTU4MjE1MTAyMTI5OTY3MDA2NDUwODcxODggIC0+IDIuODUzMzE5NjkyOTAxMzg3NTIxMjAxNzM4MDE1MDUwNzI0RSsxMzQgSW5leGFjdCBSb3VuZGVkCitleHB4MTIwMiBleHAgOS45MzY1NDMwNjg3MDYyMTE0MjA0MjI4MDM5NjI2ODAxNjQgIC0+IDIwNjcyLjE1ODM5MjAzMTcxODc3NDc2NTExMDkzMjc2MDIyIEluZXhhY3QgUm91bmRlZAorZXhweDEyMDMgZXhwIDYuMzA3ODcwMzIzODgxNTA1Njg0NDI5ODM5NDkxNzA3OTA4ICAtPiA1NDguODc0Nzc3NzA1NDYzNzI5NjEzNzI3NzM5MTc1NDY2NSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjA0IGV4cCAwLjAwMDM1NDMyODEzODk0Mzg0MjA1MzUyMDEzMDgyODI1MDMgLT4gMS4wMDAzNTQzOTA5MjA1NzM3NDYxNjQ3MzMzNTA4NDMxNTUgSW5leGFjdCBSb3VuZGVkCitleHB4MTIwNSBleHAgMC4wMDAwMDM3MDg3NDUzMzYzOTE4Mzc1NTk4Mzk0OTIwMjI5IC0+IDEuMDAwMDAzNzA4NzUyMjEzNzk2MzI0ODQxOTIwMTg5MzIzIEluZXhhY3QgUm91bmRlZAorZXhweDEyMDYgZXhwIDAuMDAyMDQzMjMxMjY4NzUxMjQzODA0MDIyMjQ0NDExNjU4NSAtPiAxLjAwMjA0NTMyMDA4ODE2NDgyNjAxMzU2MTYzMDk3NTMwOCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjA3IGV4cCA2Ljg1NjMxMzM0MDAzMjE3NzY3MjU1MDM0MzIxNjEyOTU4NiAgLT4gOTQ5Ljg1ODc5ODE2MDQxNDQxNDc5ODM1ODk2NjA1MjQzOTYgSW5leGFjdCBSb3VuZGVkCitleHB4MTIwOCBleHAgMC4wMDAwMDAwMDAwNDAyMDk0OTI4MzMzODE1NjQzMzI2NDE4IC0+IDEuMDAwMDAwMDAwMDQwMjA5NDkyODM0MTg5OTY1OTg5NjEyIEluZXhhY3QgUm91bmRlZAorZXhweDEyMDkgZXhwIDAuMDA0OTYxMDc4NDcyMjQxMjExNzYzMjY0NzAwMzU0NTgzOSAtPiAxLjAwNDk3MzQwNDk5NzkwMTk4NzAzOTU4OTAyOTI3NzgzMyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjEwIGV4cCAwLjAwMDA4OTE0NzE4ODM3MjQwNjY5MDk3NDY3ODY3MDI2ODYgLT4gMS4wMDAwODkxNTExNjIxMDEwODU0MTI3ODAwODgyNjY2OTkgSW5leGFjdCBSb3VuZGVkCitleHB4MTIxMSBleHAgMDguNTk5NzkxNzAzNzYwNjE4OTA2ODQ3MjMyMTExMTI1NjYgIC0+IDU0MzAuNTI4MzE0OTIwOTA1NzE0NjE1MzM5MjczNzM4MDk3IEluZXhhY3QgUm91bmRlZAorZXhweDEyMTIgZXhwIDkuNDczMTE3MDM5MzQxMDAzODU0ODcyNzc4MTEyNzUyNTkwICAtPiAxMzAwNS4zNjIzNDMzMTIyNDk1MzQ2MDA1NTg5NzkxMzkxNyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjEzIGV4cCAwLjA5OTkwNjA3MjQ2OTIyMDc2NDg0Mjk5Njk5OTkzMTAxMTggLT4gMS4xMDUwNjcxMTY5NzUxOTA2MDIyOTYwNTI3MDA3MjY4MDIgSW5leGFjdCBSb3VuZGVkCitleHB4MTIxNCBleHAgMC4wMDAwMDAwOTI3ODA0NTMzNTU1ODc3ODg0MDgyMjY5MjQ3IC0+IDEuMDAwMDAwMDkyNzgwNDU3NjU5Njk0MTgzOTU0NzQwNzcyIEluZXhhY3QgUm91bmRlZAorZXhweDEyMTUgZXhwIDAuMDM3NjU3ODU4Mzg3Mjg4OTkxNjI5ODc3MjgxODI2NTY3NyAtPiAxLjAzODM3NTkwMDQ4OTc3MTk0NjQ3Nzg1NzgxODQ0NzU1NiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjE2IGV4cCAyNjEuNjg5NjQxMTY5NzUzOTUyNDkxMTUzNjExNjcxMjMwNyAgLT4gNC40NzA2MTM1NjIxMjc0NjUwOTUyNDE2MDAxNzQ5NDE0NjBFKzExMyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjE3IGV4cCAwLjA3MDk5OTc0MjMyNjkxNjI5ODA4NzU4MjQyMTM4ODk2MjYgLT4gMS4wNzM1ODA5NDkyMzU0MDc5NDk0MTc4MTQ0ODU1MzMxNzIgSW5leGFjdCBSb3VuZGVkCitleHB4MTIxOCBleHAgMC4wMDAwMDAwNDQ0NjA1NTgzMjk1MTY5ODk1MjM1NjU4NzMxIC0+IDEuMDAwMDAwMDQ0NDYwNTU5MzE3ODg3NjI3NjU3NTkzOTAwIEluZXhhY3QgUm91bmRlZAorZXhweDEyMTkgZXhwIDAuMDAwMDAyMTIyNDA3Mjg1NDc3NzUxMjI4MTM2OTgxNTE4NSAtPiAxLjAwMDAwMjEyMjQwOTUzNzc4NTY4NzM5MDYzMTA3MDkwNiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjIwIGV4cCA1NDcuNTE3NDQ2MjU3NDE1Njg4NTQ3MzU1ODQ4NTQ3NTA1MiAgLT4gNi4wNzg2MjkyNDczODM4MDc5NDI2MTIxMTQ1Nzk3Mjg2NzJFKzIzNyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjIxIGV4cCAwLjAwMDAwMDkwNjc1OTgwNDE2MTUxOTIwMDIzMzk4NDQ2NzAgLT4gMS4wMDAwMDA5MDY3NjAyMTUyNjgzMTQ2ODAxMTUzNzQzODcgSW5leGFjdCBSb3VuZGVkCitleHB4MTIyMiBleHAgMC4wMzE2NDc2NTAwMzA4MDY1MzY1ODAzNDU1NTMzMjQ0NjAzIC0+IDEuMDMyMTUzNzYxODgwMTg3OTc3NjU4Mzg3OTYxNzY5MDM0IEluZXhhY3QgUm91bmRlZAorZXhweDEyMjMgZXhwIDg0LjQ2MTYwNTMwMzc3NjQ1MTAxODMzOTk2NzA2Mzg0NDczICAtPiA0Ljc5OTY0NDk5NTg5Nzk2ODM4MzUwMzI2OTg3MTY5Nzg1NkUrMzYgSW5leGFjdCBSb3VuZGVkCitleHB4MTIyNCBleHAgMC4wMDAwMDAwMDAwNTIwNTk5NzQwMjkwODQ4MDE4OTA0MTQ1IC0+IDEuMDAwMDAwMDAwMDUyMDU5OTc0MDMwNDM5OTIyMzM4MzkzIEluZXhhY3QgUm91bmRlZAorZXhweDEyMjUgZXhwIDAuMDAwMDAwNjc0ODUzMDY0MDA5MzYyMDY2NTY1MTcyNjcwOCAtPiAxLjAwMDAwMDY3NDg1MzI5MTcyMjc0MjI5MjMzMTgxMjk5NyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjI2IGV4cCAwLjAwMDAwMDAxMTY4NTMxMTk3NjEwNDIwMjA1MDc5MTYxNjkgLT4gMS4wMDAwMDAwMTE2ODUzMTIwNDQzNzc0NjAzMDYxNjUyMDMgSW5leGFjdCBSb3VuZGVkCitleHB4MTIyNyBleHAgMC4wMDIyNTkzODE4MDk0MjU4NjM2NzI3NjE2ODg2NjkzMjgwIC0+IDEuMDAyMjYxOTM2MTM1ODc2ODkzNzA3MDk0ODQ1NTQzNDYxIEluZXhhY3QgUm91bmRlZAorZXhweDEyMjggZXhwIDAuMDAyOTM5ODg1NzY3MzQ3ODkxMjI0OTg1NjUwOTY2NzUxNyAtPiAxLjAwMjk0NDIxMTQ2OTQ5NTA4NjgxMzA4NzY1MTI4NzAxMiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjI5IGV4cCAwLjc1MTE0ODAwMjk5Mjg4MDI3NzUzNzYyNzA1NTc2MzY5NjMgLT4gMi4xMTk0MzE3MzQ1MTAzMjAxNjk4MDY5NzY1NjkzNjY3ODkgSW5leGFjdCBSb3VuZGVkCitleHB4MTIzMCBleHAgMTc0Ljk0MzE5NTIxNzY3NTA2NzExNTA4ODY0MjMwNDg0NDcgIC0+IDkuNDgxMjIyMzA1Mzc0OTU1MDExNDY0NjE5NDY4MDQ0MDUxRSs3NSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjMxIGV4cCAwLjAwMDA4MTA2MTI0NTE2OTQxMzYxMjkxOTk4OTUxNjQ0MjQgLT4gMS4wMDAwODEwNjQ1MzA3MjA5MjQxODY2MTUxNDk2NDY5MjAgSW5leGFjdCBSb3VuZGVkCitleHB4MTIzMiBleHAgNTEuMDY4ODg5ODk3MDI2NjkyODgxODA5NDYyNzI0OTkwMzUgIC0+IDE1MDk4NjEzODg4NjE5MTY1MDczOTU5Ljg5ODk2MDE4NzQ5IEluZXhhY3QgUm91bmRlZAorZXhweDEyMzMgZXhwIDAuMDAwMDAwMDAwNTk5Mjg4NzU5OTQzNzA5MzY1MTQ5NDUxMCAtPiAxLjAwMDAwMDAwMDU5OTI4ODc2MDEyMzI4Mjg3NDA4Mjc1OCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjM0IGV4cCA3MTQuODU0OTA0Njc2MTA1NDg1NjMxMTEwODgyODkwMzk3MiAgLT4gMi44Njc3NDQ1NDQ4OTEwODExMTczODE1OTUwODA0ODA3ODRFKzMxMCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjM1IGV4cCAwLjAwMDAwMDAwMDQ0NjgyNDc4MDI5OTA2NDM2NDU2MDcxMTAgLT4gMS4wMDAwMDAwMDA0NDY4MjQ3ODAzOTg4OTA1NTY3MjAyMzMgSW5leGFjdCBSb3VuZGVkCitleHB4MTIzNiBleHAgODMxLjU4MTgxNTE1ODk4OTAzNjYzMjM1NTE2NzIwNDM3MDkgIC0+IDEuNDE3MDc3NDA5MTgyNjI0OTY5NDM1OTM4MDYyMjYxNjU1RSszNjEgSW5leGFjdCBSb3VuZGVkCitleHB4MTIzNyBleHAgMC4wMDAwMDAwMDA2ODY4MzIzODI1MTc5NjA1NzQ3MTA4MDQ0IC0+IDEuMDAwMDAwMDAwNjg2ODMyMzgyNzUzODI5OTM1NjAyNDU0IEluZXhhY3QgUm91bmRlZAorZXhweDEyMzggZXhwIDAuMDAwMDAwMTMwNjc0MDI2NjQwODk3Njg0MDIyODQ0MDI1NSAtPiAxLjAwMDAwMDEzMDY3NDAzNTE3ODc0ODY3NTE4NzY0ODA5OCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjM5IGV4cCAwLjMxODIyMTA2MDkwMjIyNjc3MDQ4MTE1MDI0MTIzMzUxNjMgLT4gMS4zNzQ2ODAxMTU2Njc3OTgxODU3NTg5MjcyNDc4OTQ4NTkgSW5leGFjdCBSb3VuZGVkCitleHB4MTI0MCBleHAgMC4wMTQ3NzQxMjM0MTc5MTA0NDM3NDQwMjY0NjQ0Mjk1NTAxIC0+IDEuMDE0ODgzODAwMjM5OTUwNjgyNjI4Mjc3NTM0ODM5MjIyIEluZXhhY3QgUm91bmRlZAorCistLSBSYW5kb21zIFA9MTYsIHdpdGhpbiAwLTk5CitQcmVjaXNpb246IDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXhweDExMDEgZXhwIDguNDczMDExNTI3MDEzNzI0ICAtPiA0NzgzLjkwMDY0Mzk2OTI0NiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTAyIGV4cCAwLjAwMDAwNTU3NTMwMjI3NjQgLT4gMS4wMDAwMDU1NzUzMTc4MTggSW5leGFjdCBSb3VuZGVkCitleHB4MTEwMyBleHAgMC4wMDAwMzIzNDc0MTE0NDgyIC0+IDEuMDAwMDMyMzQ3OTM0NjMxIEluZXhhY3QgUm91bmRlZAorZXhweDExMDQgZXhwIDY0LjU0Mzc0MTM4NTQ0MTY2ICAtPiAxLjA3Mzk2NjQ3NjE3MzUzMUUrMjggSW5leGFjdCBSb3VuZGVkCitleHB4MTEwNSBleHAgOTAuNDcyMDMyNDY0MTY1NjkgIC0+IDEuOTU2NjEwODg3MjUwNjQzRSszOSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTA2IGV4cCA5LjI5OTkzMTUzMjM0Mjc1NyAgLT4gMTA5MzcuMjcwMzMzMjUyMjcgSW5leGFjdCBSb3VuZGVkCitleHB4MTEwNyBleHAgOC43NTk2Nzg0Mzc4NTIyMDMgIC0+IDYzNzIuMDYyMjM0NDk1MzgxIEluZXhhY3QgUm91bmRlZAorZXhweDExMDggZXhwIDAuMDAwMDkzMTc1NTEyNzE3MiAtPiAxLjAwMDA5MzE3OTg1MzY5MCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTA5IGV4cCAwLjAwMDAwMjgxMDExNTgzNzMgLT4gMS4wMDAwMDI4MTAxMTk3ODYgSW5leGFjdCBSb3VuZGVkCitleHB4MTExMCBleHAgMC4wMDAwMDA4MDA4MTMwOTE5IC0+IDEuMDAwMDAwODAwODEzNDEzIEluZXhhY3QgUm91bmRlZAorZXhweDExMTEgZXhwIDguMzM5NzcxNzIyMjk5MDQ5ICAtPiA0MTg3LjEzMzgwMzA4MTg3OCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTEyIGV4cCAwLjAwMjYxNDA0OTc5OTU0NzQgLT4gMS4wMDI2MTc0Njk0MDY3NTAgSW5leGFjdCBSb3VuZGVkCitleHB4MTExMyBleHAgMC43NDc4MDMzMzU2MjYxNzcxIC0+IDIuMTEyMzU0NzgxOTc1NDE4IEluZXhhY3QgUm91bmRlZAorZXhweDExMTQgZXhwIDUxLjc3NjYzNzYxODI3OTY2ICAtPiAzLjA2NDEzNTgwMTEyMDM2NUUrMjIgSW5leGFjdCBSb3VuZGVkCitleHB4MTExNSBleHAgMC4xNTI0OTg5NzgzMDYxMDEyIC0+IDEuMTY0NzQxMjcyMDg0OTU1IEluZXhhY3QgUm91bmRlZAorZXhweDExMTYgZXhwIDAuMDA2NjI5ODc5ODY2OTIxOSAtPiAxLjAwNjY1MTkwNjE3MDc5MSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTE3IGV4cCA5Ljk1NTE0MTg2NTUzNDk2MCAgLT4gMjEwNjAuMjMzMzQyODcwMzggSW5leGFjdCBSb3VuZGVkCitleHB4MTExOCBleHAgOTIuMzQ1MDMwNTkxOTg0ODMgIC0+IDEuMjczMzE4OTkzNDgxMjI2RSs0MCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTE5IGV4cCAwLjAwMDA3MDkzODg2NzczNDYgLT4gMS4wMDAwNzA5NDEzODM5NTYgSW5leGFjdCBSb3VuZGVkCitleHB4MTEyMCBleHAgNzkuMTI4ODMwMzY0MzMyMDQgIC0+IDIuMzE4NTM4ODk5Mzg5MjQzRSszNCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTIxIGV4cCAwLjAwMDAwOTA4ODE1NDg4NzMgLT4gMS4wMDAwMDkwODgxOTYxODUgSW5leGFjdCBSb3VuZGVkCitleHB4MTEyMiBleHAgMC4wNDI0ODI4ODA5NjAzNDExIC0+IDEuMDQzMzk4MTk0MjQ1NzIwIEluZXhhY3QgUm91bmRlZAorZXhweDExMjMgZXhwIDAuODAwOTAzNTg5MTQyNzQxNiAtPiAyLjIyNzU1MjgxMTkzMzMxMCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTI0IGV4cCA4LjgyNTc4NjE2NzI4MzEwMiAgLT4gNjgwNy41NDA0NTUyODk5OTUgSW5leGFjdCBSb3VuZGVkCitleHB4MTEyNSBleHAgMS41MzU0NTcyNDk3NDYyNzUgIC0+IDQuNjQzNDQ4MjYwMTQ2ODQ5IEluZXhhY3QgUm91bmRlZAorZXhweDExMjYgZXhwIDY5LjAyMjU0MjU0MzU1ODAwICAtPiA5LjQ2NDc1NDUwMDY3MDY1M0UrMjkgSW5leGFjdCBSb3VuZGVkCitleHB4MTEyNyBleHAgMC4wMDA3MDUwNTU0MzY4NzEzIC0+IDEuMDAwNzA1MzA0MDQ2ODgwIEluZXhhY3QgUm91bmRlZAorZXhweDExMjggZXhwIDAuMDAwMDA4MTIwNjU0OTUwNCAtPiAxLjAwMDAwODEyMDY4NzkyMyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTI5IGV4cCAwLjYyMTc3NDg1NDY0MTEzNyAgLT4gMS44NjIyMzAyOTg1NTQ5MDMgSW5leGFjdCBSb3VuZGVkCitleHB4MTEzMCBleHAgMy44NDc2MjkwMzE0MDQzNTQgIC0+IDQ2Ljg4MTc3NjEzNTY4MjAzIEluZXhhY3QgUm91bmRlZAorZXhweDExMzEgZXhwIDI0LjgxMjUwMTg0Njk3NzMyICAtPiA1OTY5NDI2ODQ1Ni4xOTk2NiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTMyIGV4cCA1LjEwNzU0NjUwMDUxNjA0NCAgLT4gMTY1LjI2NDM4MDk3NTU2NzAgSW5leGFjdCBSb3VuZGVkCitleHB4MTEzMyBleHAgNzkuMTc4MTA5NDM5NTE5ODYgIC0+IDIuNDM1NjU2MzcyNTQxMzYwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTM0IGV4cCAwLjAwNTEzOTQ2OTU2NjcwMTUgLT4gMS4wMDUxNTI2OTkyOTUzMDEgSW5leGFjdCBSb3VuZGVkCitleHB4MTEzNSBleHAgNTcuNDQ1MDQ0ODg1MDE3MjUgIC0+IDguODcyOTA4NTY2OTI5Njg4RSsyNCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTM2IGV4cCAwLjAwMDA1MDgzODg5NjgwMzYgLT4gMS4wMDAwNTA4NDAxODkxMjIgSW5leGFjdCBSb3VuZGVkCitleHB4MTEzNyBleHAgNjkuNzEzMDk5MzIxNDg5OTcgIC0+IDEuODg4MDUzNzQwNjkzNTQxRSszMCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTM4IGV4cCAwLjAwNjQxODM0MTI5ODE1MDIgLT4gMS4wMDY0Mzg5ODI5ODg4MzUgSW5leGFjdCBSb3VuZGVkCitleHB4MTEzOSBleHAgOS4zNDY5OTEyMjA4MTQ2NzcgIC0+IDExNDY0LjI3ODAyMDM1MDgyIEluZXhhY3QgUm91bmRlZAorZXhweDExNDAgZXhwIDMzLjA5MDg3MTM5OTk5MTUyICAtPiAyMzUwNjIyMjkxNjg3NjMuNSBJbmV4YWN0IFJvdW5kZWQKKworLS0gUmFuZG9tcyBQPTcsIHdpdGhpbiAwLTkKK1ByZWNpc2lvbjogNworbWF4RXhwb25lbnQ6IDk2CittaW5FeHBvbmVudDogLTk1CitleHB4MTAwMSBleHAgMi4zOTU0NDEgIC0+IDEwLjk3MzA0IEluZXhhY3QgUm91bmRlZAorZXhweDEwMDIgZXhwIDAuNjQwNjc3OSAtPiAxLjg5Nzc2NyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDAzIGV4cCAwLjU2MTgyMTggLT4gMS43NTM4NjUgSW5leGFjdCBSb3VuZGVkCitleHB4MTAwNCBleHAgMy4wNTUxMjAgIC0+IDIxLjIyMzczIEluZXhhY3QgUm91bmRlZAorZXhweDEwMDUgZXhwIDEuNTM2NzkyICAtPiA0LjY0OTY1MCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDA2IGV4cCAwLjA4MDE1OTEgLT4gMS4wODM0NTkgSW5leGFjdCBSb3VuZGVkCitleHB4MTAwNyBleHAgMC4wOTY2ODc1IC0+IDEuMTAxNTE2IEluZXhhY3QgUm91bmRlZAorZXhweDEwMDggZXhwIDAuMDY0Njc2MSAtPiAxLjA2NjgxMyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDA5IGV4cCAwLjAwOTU2NzAgLT4gMS4wMDk2MTMgSW5leGFjdCBSb3VuZGVkCitleHB4MTAxMCBleHAgMi45NTY4NTkgIC0+IDE5LjIzNzQ1IEluZXhhY3QgUm91bmRlZAorZXhweDEwMTEgZXhwIDcuNTA0Njc5ICAtPiAxODE2LjUyMiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDEyIGV4cCAwLjAwNDUyNTkgLT4gMS4wMDQ1MzYgSW5leGFjdCBSb3VuZGVkCitleHB4MTAxMyBleHAgMy44MTAwNzEgIC0+IDQ1LjE1MzY0IEluZXhhY3QgUm91bmRlZAorZXhweDEwMTQgZXhwIDEuNTAyMzkwICAtPiA0LjQ5MjQxMyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDE1IGV4cCAwLjAzMjE1MjMgLT4gMS4wMzI2NzUgSW5leGFjdCBSb3VuZGVkCitleHB4MTAxNiBleHAgMC4wMDU3MjE0IC0+IDEuMDA1NzM4IEluZXhhY3QgUm91bmRlZAorZXhweDEwMTcgZXhwIDkuODExNDQ1ICAtPiAxODI0MS4zMyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDE4IGV4cCAzLjI0NTI0OSAgLT4gMjUuNjY4MTAgSW5leGFjdCBSb3VuZGVkCitleHB4MTAxOSBleHAgMC4zMTg5NzQyIC0+IDEuMzc1NzE2IEluZXhhY3QgUm91bmRlZAorZXhweDEwMjAgZXhwIDAuODYyMTYxMCAtPiAyLjM2ODI3MyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDIxIGV4cCAwLjAxMjI1MTEgLT4gMS4wMTIzMjYgSW5leGFjdCBSb3VuZGVkCitleHB4MTAyMiBleHAgMi4yMDIwODggIC0+IDkuMDQzODc3IEluZXhhY3QgUm91bmRlZAorZXhweDEwMjMgZXhwIDguNzc4MjAzICAtPiA2NDkxLjIwMiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDI0IGV4cCAwLjE4OTYyNzkgLT4gMS4yMDg4MDAgSW5leGFjdCBSb3VuZGVkCitleHB4MTAyNSBleHAgMC40NTEwOTQ3IC0+IDEuNTcwMDMwIEluZXhhY3QgUm91bmRlZAorZXhweDEwMjYgZXhwIDAuMjc2NDEzICAtPiAxLjMxODM5MiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDI3IGV4cCA0LjQ5MDA2NyAgLT4gODkuMTI3NDIgSW5leGFjdCBSb3VuZGVkCitleHB4MTAyOCBleHAgMC4wNDM5Nzg2IC0+IDEuMDQ0OTYwIEluZXhhY3QgUm91bmRlZAorZXhweDEwMjkgZXhwIDAuODE2ODI0NSAtPiAyLjI2MzMwMSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDMwIGV4cCAwLjAzOTE2NTggLT4gMS4wMzk5NDMgSW5leGFjdCBSb3VuZGVkCitleHB4MTAzMSBleHAgOS4yNjE4MTYgIC0+IDEwNTI4LjI0IEluZXhhY3QgUm91bmRlZAorZXhweDEwMzIgZXhwIDkuNjExMTg2ICAtPiAxNDkzMC44NyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDMzIGV4cCA5LjExODEyNSAgLT4gOTExOS4wODcgSW5leGFjdCBSb3VuZGVkCitleHB4MTAzNCBleHAgOS40NjkwODMgIC0+IDEyOTUzLjAwIEluZXhhY3QgUm91bmRlZAorZXhweDEwMzUgZXhwIDAuMDQ5OTk4MyAtPiAxLjA1MTI2OSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDM2IGV4cCAwLjAwNTA3NDYgLT4gMS4wMDUwODcgSW5leGFjdCBSb3VuZGVkCitleHB4MTAzNyBleHAgMC4wMDE0Njk2IC0+IDEuMDAxNDcxIEluZXhhY3QgUm91bmRlZAorZXhweDEwMzggZXhwIDkuMTM4NDk0ICAtPiA5MzA2LjczOSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDM5IGV4cCAwLjAwNjU0MzYgLT4gMS4wMDY1NjUgSW5leGFjdCBSb3VuZGVkCitleHB4MTA0MCBleHAgMC43Mjg0ODAzIC0+IDIuMDcxOTMwIEluZXhhY3QgUm91bmRlZAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2V4dHJhLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2V4dHJhLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzMGQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZXh0cmEuZGVjVGVzdApAQCAtMCwwICsxLDI4MzAgQEAKK3ZlcnNpb246ID8uPz8KKworZXh0ZW5kZWQ6IDEKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KKworLS0gdGVzdGluZyBmb2xkZG93biBhbmQgY2xhbXBpbmcKK21heGV4cG9uZW50OiA5CittaW5leHBvbmVudDogLTkKK3ByZWNpc2lvbjogNgorY2xhbXA6IDEKK2V4dHIwMDAwIGFwcGx5IDFFKzExIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXh0cjAwMDEgYXBwbHkgMUUrMTAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitleHRyMDAwMiBhcHBseSAxRSs5IC0+IDEuMDAwMDBFKzkgQ2xhbXBlZAorZXh0cjAwMDMgYXBwbHkgMUUrOCAtPiAxLjAwMDBFKzggQ2xhbXBlZAorZXh0cjAwMDQgYXBwbHkgMUUrNyAtPiAxLjAwMEUrNyBDbGFtcGVkCitleHRyMDAwNSBhcHBseSAxRSs2IC0+IDEuMDBFKzYgQ2xhbXBlZAorZXh0cjAwMDYgYXBwbHkgMUUrNSAtPiAxLjBFKzUgQ2xhbXBlZAorZXh0cjAwMDcgYXBwbHkgMUUrNCAtPiAxRSs0CitleHRyMDAwOCBhcHBseSAxRSszIC0+IDFFKzMKK2V4dHIwMDA5IGFwcGx5IDFFKzIgLT4gMUUrMgorZXh0cjAwMTAgYXBwbHkgMUUrMSAtPiAxRSsxCitleHRyMDAxMSBhcHBseSAxIC0+IDEKK2V4dHIwMDEyIGFwcGx5IDFFLTEgLT4gMC4xCitleHRyMDAxMyBhcHBseSAxRS0yIC0+IDAuMDEKK2V4dHIwMDE0IGFwcGx5IDFFLTMgLT4gMC4wMDEKK2V4dHIwMDE1IGFwcGx5IDFFLTQgLT4gMC4wMDAxCitleHRyMDAxNiBhcHBseSAxRS01IC0+IDAuMDAwMDEKK2V4dHIwMDE3IGFwcGx5IDFFLTYgLT4gMC4wMDAwMDEKK2V4dHIwMDE4IGFwcGx5IDFFLTcgLT4gMUUtNworZXh0cjAwMTkgYXBwbHkgMUUtOCAtPiAxRS04CitleHRyMDAyMCBhcHBseSAxRS05IC0+IDFFLTkKK2V4dHIwMDIxIGFwcGx5IDFFLTEwIC0+IDFFLTEwIFN1Ym5vcm1hbAorZXh0cjAwMjIgYXBwbHkgMUUtMTEgLT4gMUUtMTEgU3Vibm9ybWFsCitleHRyMDAyMyBhcHBseSAxRS0xMiAtPiAxRS0xMiBTdWJub3JtYWwKK2V4dHIwMDI0IGFwcGx5IDFFLTEzIC0+IDFFLTEzIFN1Ym5vcm1hbAorZXh0cjAwMjUgYXBwbHkgMUUtMTQgLT4gMUUtMTQgU3Vibm9ybWFsCitleHRyMDAyNiBhcHBseSAxRS0xNSAtPiAwRS0xNCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitleHRyMDAyNyBhcHBseSAxRS0xNiAtPiAwRS0xNCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitjbGFtcDogMAorCistLSBsYXJnZSBwcmVjaXNpb24sIHNtYWxsIG1pbmltdW0gYW5kIG1heGltdW0gZXhwb25lbnQ7IGluIHRoaXMgY2FzZQorLS0gaXQncyBwb3NzaWJsZSB0aGF0IGZvbGRkb3duIGlzIHJlcXVpcmVkIG9uIGEgc3Vibm9ybWFsIHJlc3VsdAorbWF4ZXhwb25lbnQ6IDkKK21pbmV4cG9uZW50OiAtOQorcHJlY2lzaW9uOiAyNAorY2xhbXA6IDEKK2V4dHIwMTAwIGFwcGx5IDFFKzExIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXh0cjAxMDEgYXBwbHkgMUUrMTAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitleHRyMDEwMiBhcHBseSAxRSs5IC0+IDEwMDAwMDAwMDAuMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMDMgYXBwbHkgMUUrOCAtPiAxMDAwMDAwMDAuMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMDQgYXBwbHkgMUUrNyAtPiAxMDAwMDAwMC4wMDAwMDAwMDAwMDAwMCBDbGFtcGVkCitleHRyMDEwNSBhcHBseSAxRSs2IC0+IDEwMDAwMDAuMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMDYgYXBwbHkgMUUrNSAtPiAxMDAwMDAuMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMDcgYXBwbHkgMUUrNCAtPiAxMDAwMC4wMDAwMDAwMDAwMDAwMCBDbGFtcGVkCitleHRyMDEwOCBhcHBseSAxRSszIC0+IDEwMDAuMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMDkgYXBwbHkgMUUrMiAtPiAxMDAuMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMTAgYXBwbHkgMUUrMSAtPiAxMC4wMDAwMDAwMDAwMDAwMCBDbGFtcGVkCitleHRyMDExMSBhcHBseSAxIC0+ICAgIDEuMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMTIgYXBwbHkgMUUtMSAtPiAwLjEwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2V4dHIwMTEzIGFwcGx5IDFFLTIgLT4gMC4wMTAwMDAwMDAwMDAwMCBDbGFtcGVkCitleHRyMDExNCBhcHBseSAxRS0zIC0+IDAuMDAxMDAwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMTUgYXBwbHkgMUUtNCAtPiAwLjAwMDEwMDAwMDAwMDAwIENsYW1wZWQKK2V4dHIwMTE2IGFwcGx5IDFFLTUgLT4gMC4wMDAwMTAwMDAwMDAwMCBDbGFtcGVkCitleHRyMDExNyBhcHBseSAxRS02IC0+IDAuMDAwMDAxMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMTggYXBwbHkgMUUtNyAtPiAxLjAwMDAwMDBFLTcgQ2xhbXBlZAorZXh0cjAxMTkgYXBwbHkgMUUtOCAtPiAxLjAwMDAwMEUtOCBDbGFtcGVkCitleHRyMDEyMCBhcHBseSAxRS05IC0+IDEuMDAwMDBFLTkgQ2xhbXBlZAorZXh0cjAxMjEgYXBwbHkgMUUtMTAgLT4gMS4wMDAwRS0xMCBTdWJub3JtYWwgQ2xhbXBlZAorZXh0cjAxMjIgYXBwbHkgMUUtMTEgLT4gMS4wMDBFLTExIFN1Ym5vcm1hbCBDbGFtcGVkCitleHRyMDEyMyBhcHBseSAxRS0xMiAtPiAxLjAwRS0xMiBTdWJub3JtYWwgQ2xhbXBlZAorZXh0cjAxMjQgYXBwbHkgMUUtMTMgLT4gMS4wRS0xMyBTdWJub3JtYWwgQ2xhbXBlZAorZXh0cjAxMjUgYXBwbHkgMUUtMTQgLT4gMUUtMTQgU3Vibm9ybWFsCitleHRyMDEyNiBhcHBseSAxRS0xNSAtPiAxRS0xNSBTdWJub3JtYWwKK2V4dHIwMTI3IGFwcGx5IDFFLTE2IC0+IDFFLTE2IFN1Ym5vcm1hbAorZXh0cjAxMjggYXBwbHkgMUUtMTcgLT4gMUUtMTcgU3Vibm9ybWFsCitleHRyMDEyOSBhcHBseSAxRS0xOCAtPiAxRS0xOCBTdWJub3JtYWwKK2V4dHIwMTMwIGFwcGx5IDFFLTE5IC0+IDFFLTE5IFN1Ym5vcm1hbAorZXh0cjAxMzEgYXBwbHkgMUUtMjAgLT4gMUUtMjAgU3Vibm9ybWFsCitleHRyMDEzMiBhcHBseSAxRS0yMSAtPiAxRS0yMSBTdWJub3JtYWwKK2V4dHIwMTMzIGFwcGx5IDFFLTIyIC0+IDFFLTIyIFN1Ym5vcm1hbAorZXh0cjAxMzQgYXBwbHkgMUUtMjMgLT4gMUUtMjMgU3Vibm9ybWFsCitleHRyMDEzNSBhcHBseSAxRS0yNCAtPiAxRS0yNCBTdWJub3JtYWwKK2V4dHIwMTM2IGFwcGx5IDFFLTI1IC0+IDFFLTI1IFN1Ym5vcm1hbAorZXh0cjAxMzcgYXBwbHkgMUUtMjYgLT4gMUUtMjYgU3Vibm9ybWFsCitleHRyMDEzOCBhcHBseSAxRS0yNyAtPiAxRS0yNyBTdWJub3JtYWwKK2V4dHIwMTM5IGFwcGx5IDFFLTI4IC0+IDFFLTI4IFN1Ym5vcm1hbAorZXh0cjAxNDAgYXBwbHkgMUUtMjkgLT4gMUUtMjkgU3Vibm9ybWFsCitleHRyMDE0MSBhcHBseSAxRS0zMCAtPiAxRS0zMCBTdWJub3JtYWwKK2V4dHIwMTQyIGFwcGx5IDFFLTMxIC0+IDFFLTMxIFN1Ym5vcm1hbAorZXh0cjAxNDMgYXBwbHkgMUUtMzIgLT4gMUUtMzIgU3Vibm9ybWFsCitleHRyMDE0NCBhcHBseSAxRS0zMyAtPiAwRS0zMiBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitleHRyMDE0NSBhcHBseSAxRS0zNCAtPiAwRS0zMiBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitjbGFtcDogMAorCistLSBzb21lIGJ1Z2d5IGFkZGl0aW9uIGNhc2VzIGZyb20gUHl0aG9uIDIuNS54CittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA2CitleHRyMTAwMCBhZGQgMEUrMTAwMCAwRSsyMDAwIC0+IDBFKzk5OSBDbGFtcGVkCitleHRyMTAwMSBhZGQgMEUrMTAwNCAwRSsxMDAxIC0+IDBFKzk5OSBDbGFtcGVkCitjbGFtcDogMQorZXh0cjEwMDIgYWRkIDBFKzEwMDAgMEUrMTAwMCAtPiAwRSs5OTQgQ2xhbXBlZAorY2xhbXA6IDAKK2V4dHIxMDAzIGFkZCAwRSsxMDAwIDBFLTEwMDUgLT4gMEUtMTAwNCBDbGFtcGVkCitleHRyMTAwNCBhZGQgMEUtMTAwNiAwIC0+IDBFLTEwMDQgQ2xhbXBlZAorZXh0cjEwMDUgYWRkIDFFKzEwMDAgLTFFKzEwMDAgLT4gMEUrOTk5IENsYW1wZWQKK2V4dHIxMDA2IGFkZCAtMy4xRSsxMDA0IDMuMUUrMTAwNCAtPiAwRSs5OTkgQ2xhbXBlZAorY2xhbXA6IDEKK2V4dHIxMDA3IGFkZCAxRSs5OTggLTFFKzk5OCAtPiAwRSs5OTQgQ2xhbXBlZAorY2xhbXA6IDAKK2V4dHIxMDA4IGFkZCAyRS0xMDA1IC0yRS0xMDA1IC0+IDBFLTEwMDQgQ2xhbXBlZAorZXh0cjEwMDkgYWRkIC0zLjFFLTEwMDUgMy4xRS0xMDA1IC0+IDBFLTEwMDQgQ2xhbXBlZAorCitwcmVjaXNpb246IDMKK2V4dHIxMDEwIGFkZCA5OTk0OS45IDAuMjAwMDAwIC0+IDEuMDBFKzUgSW5leGFjdCBSb3VuZGVkCitleHRyMTAxMSBhZGQgOTk5NDkuOSAwLjEwMDAwMCAtPiAxLjAwRSs1IEluZXhhY3QgUm91bmRlZAorZXh0cjEwMTIgYWRkIDk5ODQ5LjkgMC4yMDAwMDAgLT4gOS45OUUrNCBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxMDEzIGFkZCA5OTg0OS45IDAuMTAwMDAwIC0+IDkuOThFKzQgSW5leGFjdCBSb3VuZGVkCitleHRyMTAxNCBhZGQgMS4wMTQ5IDAuMDAwMTEgLT4gMS4wMiBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxMDE1IGFkZCAxLjAxNDkgMC4wMDAxMCAtPiAxLjAyIEluZXhhY3QgUm91bmRlZAorZXh0cjEwMTYgYWRkIDEuMDE0OSAwLjAwMDA5IC0+IDEuMDEgSW5leGFjdCBSb3VuZGVkCitleHRyMTAxNyBhZGQgMS4wMDQ5IDAuMDAwMTEgLT4gMS4wMSBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxMDE4IGFkZCAxLjAwNDkgMC4wMDAxMCAtPiAxLjAwIEluZXhhY3QgUm91bmRlZAorZXh0cjEwMTkgYWRkIDEuMDA0OSAwLjAwMDA5IC0+IDEuMDAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZG93bgorZXh0cjEwMjAgYWRkIDk5OTk5LjkgMC4yMDAwMDAgLT4gMS4wMEUrNSBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxMDIxIGFkZCA5OTk5OS44IDAuMjAwMDAwIC0+IDEuMDBFKzUgUm91bmRlZAorZXh0cjEwMjIgYWRkIDk5OTk5LjcgMC4yMDAwMDAgLT4gOS45OUUrNCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KKworLS0gYSBidWcgaW4gX3Jlc2NhbGUgY2F1c2VkIHRoZSBmb2xsb3dpbmcgdG8gZmFpbCBpbiBQeXRob24gMi41LjEKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDYKK2V4dHIxMTAwIGFkZCAwRSsxMDAwIDFFKzEwMDAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitleHRyMTEwMSByZW1haW5kZXIgMUUrMTAwMCAyRSsxMDAwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLSB0ZXN0cyBmb3Igc2NhbGViIGluIGNhc2Ugd2hlcmUgaW5wdXQgcHJlY2lzaW9uID4gY29udGV4dCBwcmVjaXNpb24uCistLSBSZXN1bHQgc2hvdWxkIGJlIHJvdW5kZWQuICAoVGhpcyBpc24ndCB0b3RhbGx5IGNsZWFyIGZyb20gdGhlCistLSBzcGVjaWZpY2F0aW9uLCBidXQgdGhlIHRyZWF0bWVudCBvZiB1bmRlcmZsb3cgaW4gdGhlIHRlc3RjYXNlcworLS0gc3VnZ2VzdHMgdGhhdCByb3VuZGluZyBzaG91bGQgb2NjdXIgaW4gZ2VuZXJhbC4gIEZ1cnRoZXJtb3JlLCBpdCdzCistLSB0aGUgd2F5IHRoYXQgdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBiZWhhdmVzLikKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDMKK2V4dHIxMjAwIHNjYWxlYiAxMjM0IDEgLT4gMS4yM0UrNCBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxMjAxIHNjYWxlYiA1Njc4IDAgLT4gNS42OEUrMyBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxMjAyIHNjYWxlYiAtOTEwNSAtMSAtPiAtOTEwIEluZXhhY3QgUm91bmRlZAorCistLSBJbnZhbGlkIG9wZXJhdGlvbiBmcm9tIDAgKiBpbmZpbml0eSBpbiBmbWEKKy0tIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBhIHRoaXJkLWFyZ3VtZW50IHNOYU4KK2V4dHIxMzAwIGZtYSAwIEluZiBzTmFOMTIzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZXh0cjEzMDEgZm1hIEluZiAwIHNOYU40NTYgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitleHRyMTMwMiBmbWEgMEUxMjMgLUluZiBzTmFONzg5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZXh0cjEzMDIgZm1hIC1JbmYgMEUtNDU2IHNOYU4xNDggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG1heC9taW4vbWF4X21hZy9taW5fbWFnIGJ1ZyBpbiAyLjUuMi8yLjYvMy4wOiBtYXgoTmFOLCBmaW5pdGUpIGdhdmUKKy0tIGluY29ycmVjdCBhbnN3ZXJzIHdoZW4gdGhlIGZpbml0ZSBudW1iZXIgcmVxdWlyZWQgcm91bmRpbmc7IHNpbWlsYXJseQorLS0gZm9yIHRoZSBvdGhlciB0aHJlIGZ1bmN0aW9ucworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogNgorcm91bmRpbmc6IGhhbGZfZXZlbgorZXh0cjE0MDAgbWF4IE5hTiAxMjM0NTY3IC0+IDEuMjM0NTdFKzYgSW5leGFjdCBSb3VuZGVkCitleHRyMTQwMSBtYXggMzE0MTU5MEUtMTIzIE5hTjE3MjkgLT4gMy4xNDE1OUUtMTE3IFJvdW5kZWQKK2V4dHIxNDAyIG1heCAtNy42NTQzMjEgLU5hTiAtPiAtNy42NTQzMiBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxNDEwIG1pbiAtTmFOIC03NjU0MzIuMSAtPiAtNzY1NDMyIEluZXhhY3QgUm91bmRlZAorZXh0cjE0MTEgbWluIDMxNDE1OTIgTmFOIC0+IDMuMTQxNTlFKzYgSW5leGFjdCBSb3VuZGVkCitleHRyMTQyMCBtYXhfbWFnIDAuMTExMTExMSAtTmFOMTIzIC0+IDAuMTExMTExIEluZXhhY3QgUm91bmRlZAorZXh0cjE0MjEgbWF4X21hZyBOYU45OTk5OTk5OTkgMC4wMDEyMzQ1NjcgLT4gMC4wMDEyMzQ1NyBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxNDMwIG1pbl9tYWcgOTE4MTcxNjE1MSAtTmFOIC0+IDkuMTgxNzJFKzkgSW5leGFjdCBSb3VuZGVkCitleHRyMTQzMSBtaW5fbWFnIE5hTjQgMS44MTgxODBFMTAwIC0+IDEuODE4MThFKzEwMCBSb3VuZGVkCisKKy0tIElzc3VlICM2Nzk0OiB3aGVuIGNvbXBhcmluZyBOYU5zIHVzaW5nIGNvbXBhcmVfdG90YWwsIHBheWxvYWRzCistLSBzaG91bGQgYmUgY29tcGFyZWQgYXMgdGhvdWdoIHBvc2l0aXZlIGludGVnZXJzOyBub3QKKy0tIGxleGljb2dyYXBoaWNhbGx5IGFzIHN0cmluZ3MuCitleHRyMTUwMCBjb21wYXJldG90YWwgTmFOMTIzIE5hTjQ1IC0+IDEKK2V4dHIxNTAxIGNvbXBhcmV0b3RhbCBzTmFOMTIzIHNOYU40NSAtPiAxCitleHRyMTUwMiBjb21wYXJldG90YWwgLU5hTjEyMyAtTmFONDUgLT4gLTEKK2V4dHIxNTAzIGNvbXBhcmV0b3RhbCAtc05hTjEyMyAtc05hTjQ1IC0+IC0xCitleHRyMTUwNCBjb21wYXJldG90YWwgTmFONDUgTmFOMTIzIC0+IC0xCitleHRyMTUwNSBjb21wYXJldG90YWwgc05hTjQ1IHNOYU4xMjMgLT4gLTEKK2V4dHIxNTA2IGNvbXBhcmV0b3RhbCAtTmFONDUgLU5hTjEyMyAtPiAxCitleHRyMTUwNyBjb21wYXJldG90YWwgLXNOYU40NSAtc05hTjEyMyAtPiAxCisKK2V4dHIxNTEwIGNvbXBhcmV0b3RhbCAtc05hTjYzNDUwNzQ4ODU0MTcyNDE2IC1zTmFOOTExOTkzIC0+IC0xCitleHRyMTUxMSBjb21wYXJldG90bWFnIE5hTjEyMjIyMjIyMjIyMjIgLU5hTjk5OTk5OSAtPiAxCisKKy0tIElzc3VlICM3MjMzOiByb3RhdGUgYW5kIHNjYWxlIHNob3VsZCB0cnVuY2F0ZSBhbiBhcmd1bWVudAorLS0gb2YgbGVuZ3RoIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCBwcmVjaXNpb24uCitwcmVjaXNpb246IDQKK2V4dHIxNjAwIHJvdGF0ZSAxMjM0NTY3IC01IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZXh0cjE2MDEgcm90YXRlIDEyMzQ1NjcgLTQgLT4gNDU2NworZXh0cjE2MDIgcm90YXRlIDEyMzQ1NjcgLTMgLT4gNTY3NAorZXh0cjE2MDMgcm90YXRlIDEyMzQ1NjcgLTIgLT4gNjc0NQorZXh0cjE2MDQgcm90YXRlIDEyMzQ1NjcgLTEgLT4gNzQ1NgorZXh0cjE2MDUgcm90YXRlIDEyMzQ1NjcgMCAtPiA0NTY3CitleHRyMTYwNiByb3RhdGUgMTIzNDU2NyAxIC0+IDU2NzQKK2V4dHIxNjA3IHJvdGF0ZSAxMjM0NTY3IDIgLT4gNjc0NQorZXh0cjE2MDggcm90YXRlIDEyMzQ1NjcgMyAtPiA3NDU2CitleHRyMTYwOSByb3RhdGUgMTIzNDU2NyA0IC0+IDQ1NjcKK2V4dHIxNjEwIHJvdGF0ZSAxMjM0NTY3IDUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2V4dHIxNjUwIHNoaWZ0IDEyMzQ1NjcgLTUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitleHRyMTY1MSBzaGlmdCAxMjM0NTY3IC00IC0+IDAKK2V4dHIxNjUyIHNoaWZ0IDEyMzQ1NjcgLTMgLT4gNAorZXh0cjE2NTMgc2hpZnQgMTIzNDU2NyAtMiAtPiA0NQorZXh0cjE2NTQgc2hpZnQgMTIzNDU2NyAtMSAtPiA0NTYKK2V4dHIxNjU1IHNoaWZ0IDEyMzQ1NjcgMCAtPiA0NTY3CitleHRyMTY1NiBzaGlmdCAxMjM0NTY3IDEgLT4gNTY3MAorZXh0cjE2NTcgc2hpZnQgMTIzNDU2NyAyIC0+IDY3MDAKK2V4dHIxNjU4IHNoaWZ0IDEyMzQ1NjcgMyAtPiA3MDAwCitleHRyMTY1OSBzaGlmdCAxMjM0NTY3IDQgLT4gMAorZXh0cjE2NjAgc2hpZnQgMTIzNDU2NyA1IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBDYXNlcyB3aGVyZSB0aGUgcG93ZXIgZnVuY3Rpb24gd2FzIGltcG9zc2libHkgc2xvdyB0byBkZXRlcm1pbmUgdGhhdCB0aGUKKy0tIHJlc3VsdCBpcyBpbmV4YWN0LiAgVGhhbmtzIFN0ZWZhbiBLcmFoIGZvciBpZGVudGlmeWluZyB0aGlzIHByb2JsZW0uCitwcmVjaXNpb246IDE2CittYXhFeHBvbmVudDogOTk5OTk5OTk5CittaW5FeHBvbmVudDogLTk5OTk5OTk5OQorZXh0cjE3MDAgcG93ZXIgMTAgMWUtOTk5OTk5OTk5IC0+IDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZXh0cjE3MDEgcG93ZXIgMTAwLjAgLTU1Ny43MWUtNzQyODg4ODg4IC0+IDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZXh0cjE3MDIgcG93ZXIgMTAgMWUtMTAwIC0+IDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBBbm90aGVyIG9uZSAoc2VlIGlzc3VlICMxMjA4MCkuICBUaGFua3MgYWdhaW4gdG8gU3RlZmFuIEtyYWguCitleHRyMTcwMyBwb3dlciA0IC0xLjJlLTk5OTk5OTk5OSAtPiAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gQSBjb3VwbGUgb2YgaW50ZXJlc3RpbmcgZXhhY3QgY2FzZXMgZm9yIHBvd2VyLiAgTm90ZSB0aGF0IHRoZSBzcGVjaWZpY2F0aW9uCistLSByZXF1aXJlcyB0aGVzZSB0byBiZSByZXBvcnRlZCBhcyBJbmV4YWN0LgorZXh0cjE3MTAgcG93ZXIgMWUzNzUgNTZlLTMgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzIxIEluZXhhY3QgUm91bmRlZAorZXh0cjE3MTEgcG93ZXIgMTAwMDAgMC43NSAtPiAxMDAwLjAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxNzEyIHBvd2VyIDFlLTI0IDAuODc1IC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0yMSBJbmV4YWN0IFJvdW5kZWQKKworLS0gU29tZSBtb3JlIGV4YWN0IGNhc2VzLCBleGVyY2lzaW5nIHBvd2VyIHdpdGggbmVnYXRpdmUgc2Vjb25kIGFyZ3VtZW50LgorZXh0cjE3MjAgcG93ZXIgNDAwIC0wLjUgLT4gMC4wNTAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxNzIxIHBvd2VyIDQwOTYgLTAuNzUgLT4gMC4wMDE5NTMxMjUwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitleHRyMTcyMiBwb3dlciA2MjVlNCAtMC4yNSAtPiAwLjAyMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBOb25leGFjdCBjYXNlcywgdG8gZXhlcmNpc2Ugc29tZSBvZiB0aGUgZWFybHkgZXhpdCBjb25kaXRpb25zIGZyb20KKy0tIF9wb3dlcl9leGFjdC4KK2V4dHIxNzMwIHBvd2VyIDIwNDggLTAuNzUgLT4gMC4wMDMyODQ3NTE2MjIwODQ4MjIgSW5leGFjdCBSb3VuZGVkCisKKworLS0gVGVzdHMgZm9yIHRoZSBpc18qIGJvb2xlYW4gb3BlcmF0aW9ucworcHJlY2lzaW9uOiA5CittYXhFeHBvbmVudDogOTk5CittaW5FeHBvbmVudDogLTk5OQorCitib29sMDAwMCBpc2Nhbm9uaWNhbCAwRS0yMDAwIC0+IDEKK2Jvb2wwMDAxIGlzY2Fub25pY2FsIC0wRS0yMDAwIC0+IDEKK2Jvb2wwMDAyIGlzY2Fub25pY2FsIDBFLTEwMDggLT4gMQorYm9vbDAwMDMgaXNjYW5vbmljYWwgLTBFLTEwMDggLT4gMQorYm9vbDAwMDQgaXNjYW5vbmljYWwgMEUtMTAwNyAtPiAxCitib29sMDAwNSBpc2Nhbm9uaWNhbCAtMEUtMTAwNyAtPiAxCitib29sMDAwNiBpc2Nhbm9uaWNhbCAwRS0xMDA2IC0+IDEKK2Jvb2wwMDA3IGlzY2Fub25pY2FsIC0wRS0xMDA2IC0+IDEKK2Jvb2wwMDA4IGlzY2Fub25pY2FsIDBFLTEwMDAgLT4gMQorYm9vbDAwMDkgaXNjYW5vbmljYWwgLTBFLTEwMDAgLT4gMQorYm9vbDAwMTAgaXNjYW5vbmljYWwgMEUtOTk5IC0+IDEKK2Jvb2wwMDExIGlzY2Fub25pY2FsIC0wRS05OTkgLT4gMQorYm9vbDAwMTIgaXNjYW5vbmljYWwgMEUtOTk4IC0+IDEKK2Jvb2wwMDEzIGlzY2Fub25pY2FsIC0wRS05OTggLT4gMQorYm9vbDAwMTQgaXNjYW5vbmljYWwgMEUtMTAwIC0+IDEKK2Jvb2wwMDE1IGlzY2Fub25pY2FsIC0wRS0xMDAgLT4gMQorYm9vbDAwMTYgaXNjYW5vbmljYWwgMC4wMDAwMDAgLT4gMQorYm9vbDAwMTcgaXNjYW5vbmljYWwgLTAuMDAwMDAwIC0+IDEKK2Jvb2wwMDE4IGlzY2Fub25pY2FsIDAuMDAwIC0+IDEKK2Jvb2wwMDE5IGlzY2Fub25pY2FsIC0wLjAwMCAtPiAxCitib29sMDAyMCBpc2Nhbm9uaWNhbCAwLjAwIC0+IDEKK2Jvb2wwMDIxIGlzY2Fub25pY2FsIC0wLjAwIC0+IDEKK2Jvb2wwMDIyIGlzY2Fub25pY2FsIDAuMCAtPiAxCitib29sMDAyMyBpc2Nhbm9uaWNhbCAtMC4wIC0+IDEKK2Jvb2wwMDI0IGlzY2Fub25pY2FsIDAgLT4gMQorYm9vbDAwMjUgaXNjYW5vbmljYWwgLTAgLT4gMQorYm9vbDAwMjYgaXNjYW5vbmljYWwgMEUrMSAtPiAxCitib29sMDAyNyBpc2Nhbm9uaWNhbCAtMEUrMSAtPiAxCitib29sMDAyOCBpc2Nhbm9uaWNhbCAwRSsyIC0+IDEKK2Jvb2wwMDI5IGlzY2Fub25pY2FsIC0wRSsyIC0+IDEKK2Jvb2wwMDMwIGlzY2Fub25pY2FsIDBFKzMgLT4gMQorYm9vbDAwMzEgaXNjYW5vbmljYWwgLTBFKzMgLT4gMQorYm9vbDAwMzIgaXNjYW5vbmljYWwgMEUrNiAtPiAxCitib29sMDAzMyBpc2Nhbm9uaWNhbCAtMEUrNiAtPiAxCitib29sMDAzNCBpc2Nhbm9uaWNhbCAwRSsxMDAgLT4gMQorYm9vbDAwMzUgaXNjYW5vbmljYWwgLTBFKzEwMCAtPiAxCitib29sMDAzNiBpc2Nhbm9uaWNhbCAwRSs5OTAgLT4gMQorYm9vbDAwMzcgaXNjYW5vbmljYWwgLTBFKzk5MCAtPiAxCitib29sMDAzOCBpc2Nhbm9uaWNhbCAwRSs5OTEgLT4gMQorYm9vbDAwMzkgaXNjYW5vbmljYWwgLTBFKzk5MSAtPiAxCitib29sMDA0MCBpc2Nhbm9uaWNhbCAwRSs5OTIgLT4gMQorYm9vbDAwNDEgaXNjYW5vbmljYWwgLTBFKzk5MiAtPiAxCitib29sMDA0MiBpc2Nhbm9uaWNhbCAwRSs5OTggLT4gMQorYm9vbDAwNDMgaXNjYW5vbmljYWwgLTBFKzk5OCAtPiAxCitib29sMDA0NCBpc2Nhbm9uaWNhbCAwRSs5OTkgLT4gMQorYm9vbDAwNDUgaXNjYW5vbmljYWwgLTBFKzk5OSAtPiAxCitib29sMDA0NiBpc2Nhbm9uaWNhbCAwRSsxMDAwIC0+IDEKK2Jvb2wwMDQ3IGlzY2Fub25pY2FsIC0wRSsxMDAwIC0+IDEKK2Jvb2wwMDQ4IGlzY2Fub25pY2FsIDBFKzIwMDAgLT4gMQorYm9vbDAwNDkgaXNjYW5vbmljYWwgLTBFKzIwMDAgLT4gMQorYm9vbDAwNTAgaXNjYW5vbmljYWwgMUUtMjAwMCAtPiAxCitib29sMDA1MSBpc2Nhbm9uaWNhbCAtMUUtMjAwMCAtPiAxCitib29sMDA1MiBpc2Nhbm9uaWNhbCAxRS0xMDA4IC0+IDEKK2Jvb2wwMDUzIGlzY2Fub25pY2FsIC0xRS0xMDA4IC0+IDEKK2Jvb2wwMDU0IGlzY2Fub25pY2FsIDFFLTEwMDcgLT4gMQorYm9vbDAwNTUgaXNjYW5vbmljYWwgLTFFLTEwMDcgLT4gMQorYm9vbDAwNTYgaXNjYW5vbmljYWwgMUUtMTAwNiAtPiAxCitib29sMDA1NyBpc2Nhbm9uaWNhbCAtMUUtMTAwNiAtPiAxCitib29sMDA1OCBpc2Nhbm9uaWNhbCAxRS0xMDAwIC0+IDEKK2Jvb2wwMDU5IGlzY2Fub25pY2FsIC0xRS0xMDAwIC0+IDEKK2Jvb2wwMDYwIGlzY2Fub25pY2FsIDFFLTk5OSAtPiAxCitib29sMDA2MSBpc2Nhbm9uaWNhbCAtMUUtOTk5IC0+IDEKK2Jvb2wwMDYyIGlzY2Fub25pY2FsIDFFLTk5OCAtPiAxCitib29sMDA2MyBpc2Nhbm9uaWNhbCAtMUUtOTk4IC0+IDEKK2Jvb2wwMDY0IGlzY2Fub25pY2FsIDFFLTEwMCAtPiAxCitib29sMDA2NSBpc2Nhbm9uaWNhbCAtMUUtMTAwIC0+IDEKK2Jvb2wwMDY2IGlzY2Fub25pY2FsIDAuMDAwMDAxIC0+IDEKK2Jvb2wwMDY3IGlzY2Fub25pY2FsIC0wLjAwMDAwMSAtPiAxCitib29sMDA2OCBpc2Nhbm9uaWNhbCAwLjAwMSAtPiAxCitib29sMDA2OSBpc2Nhbm9uaWNhbCAtMC4wMDEgLT4gMQorYm9vbDAwNzAgaXNjYW5vbmljYWwgMC4wMSAtPiAxCitib29sMDA3MSBpc2Nhbm9uaWNhbCAtMC4wMSAtPiAxCitib29sMDA3MiBpc2Nhbm9uaWNhbCAwLjEgLT4gMQorYm9vbDAwNzMgaXNjYW5vbmljYWwgLTAuMSAtPiAxCitib29sMDA3NCBpc2Nhbm9uaWNhbCAxIC0+IDEKK2Jvb2wwMDc1IGlzY2Fub25pY2FsIC0xIC0+IDEKK2Jvb2wwMDc2IGlzY2Fub25pY2FsIDFFKzEgLT4gMQorYm9vbDAwNzcgaXNjYW5vbmljYWwgLTFFKzEgLT4gMQorYm9vbDAwNzggaXNjYW5vbmljYWwgMUUrMiAtPiAxCitib29sMDA3OSBpc2Nhbm9uaWNhbCAtMUUrMiAtPiAxCitib29sMDA4MCBpc2Nhbm9uaWNhbCAxRSszIC0+IDEKK2Jvb2wwMDgxIGlzY2Fub25pY2FsIC0xRSszIC0+IDEKK2Jvb2wwMDgyIGlzY2Fub25pY2FsIDFFKzYgLT4gMQorYm9vbDAwODMgaXNjYW5vbmljYWwgLTFFKzYgLT4gMQorYm9vbDAwODQgaXNjYW5vbmljYWwgMUUrMTAwIC0+IDEKK2Jvb2wwMDg1IGlzY2Fub25pY2FsIC0xRSsxMDAgLT4gMQorYm9vbDAwODYgaXNjYW5vbmljYWwgMUUrOTkwIC0+IDEKK2Jvb2wwMDg3IGlzY2Fub25pY2FsIC0xRSs5OTAgLT4gMQorYm9vbDAwODggaXNjYW5vbmljYWwgMUUrOTkxIC0+IDEKK2Jvb2wwMDg5IGlzY2Fub25pY2FsIC0xRSs5OTEgLT4gMQorYm9vbDAwOTAgaXNjYW5vbmljYWwgMUUrOTkyIC0+IDEKK2Jvb2wwMDkxIGlzY2Fub25pY2FsIC0xRSs5OTIgLT4gMQorYm9vbDAwOTIgaXNjYW5vbmljYWwgMUUrOTk4IC0+IDEKK2Jvb2wwMDkzIGlzY2Fub25pY2FsIC0xRSs5OTggLT4gMQorYm9vbDAwOTQgaXNjYW5vbmljYWwgMUUrOTk5IC0+IDEKK2Jvb2wwMDk1IGlzY2Fub25pY2FsIC0xRSs5OTkgLT4gMQorYm9vbDAwOTYgaXNjYW5vbmljYWwgMUUrMTAwMCAtPiAxCitib29sMDA5NyBpc2Nhbm9uaWNhbCAtMUUrMTAwMCAtPiAxCitib29sMDA5OCBpc2Nhbm9uaWNhbCAxRSsyMDAwIC0+IDEKK2Jvb2wwMDk5IGlzY2Fub25pY2FsIC0xRSsyMDAwIC0+IDEKK2Jvb2wwMTAwIGlzY2Fub25pY2FsIDlFLTIwMDAgLT4gMQorYm9vbDAxMDEgaXNjYW5vbmljYWwgLTlFLTIwMDAgLT4gMQorYm9vbDAxMDIgaXNjYW5vbmljYWwgOUUtMTAwOCAtPiAxCitib29sMDEwMyBpc2Nhbm9uaWNhbCAtOUUtMTAwOCAtPiAxCitib29sMDEwNCBpc2Nhbm9uaWNhbCA5RS0xMDA3IC0+IDEKK2Jvb2wwMTA1IGlzY2Fub25pY2FsIC05RS0xMDA3IC0+IDEKK2Jvb2wwMTA2IGlzY2Fub25pY2FsIDlFLTEwMDYgLT4gMQorYm9vbDAxMDcgaXNjYW5vbmljYWwgLTlFLTEwMDYgLT4gMQorYm9vbDAxMDggaXNjYW5vbmljYWwgOUUtMTAwMCAtPiAxCitib29sMDEwOSBpc2Nhbm9uaWNhbCAtOUUtMTAwMCAtPiAxCitib29sMDExMCBpc2Nhbm9uaWNhbCA5RS05OTkgLT4gMQorYm9vbDAxMTEgaXNjYW5vbmljYWwgLTlFLTk5OSAtPiAxCitib29sMDExMiBpc2Nhbm9uaWNhbCA5RS05OTggLT4gMQorYm9vbDAxMTMgaXNjYW5vbmljYWwgLTlFLTk5OCAtPiAxCitib29sMDExNCBpc2Nhbm9uaWNhbCA5RS0xMDAgLT4gMQorYm9vbDAxMTUgaXNjYW5vbmljYWwgLTlFLTEwMCAtPiAxCitib29sMDExNiBpc2Nhbm9uaWNhbCAwLjAwMDAwOSAtPiAxCitib29sMDExNyBpc2Nhbm9uaWNhbCAtMC4wMDAwMDkgLT4gMQorYm9vbDAxMTggaXNjYW5vbmljYWwgMC4wMDkgLT4gMQorYm9vbDAxMTkgaXNjYW5vbmljYWwgLTAuMDA5IC0+IDEKK2Jvb2wwMTIwIGlzY2Fub25pY2FsIDAuMDkgLT4gMQorYm9vbDAxMjEgaXNjYW5vbmljYWwgLTAuMDkgLT4gMQorYm9vbDAxMjIgaXNjYW5vbmljYWwgMC45IC0+IDEKK2Jvb2wwMTIzIGlzY2Fub25pY2FsIC0wLjkgLT4gMQorYm9vbDAxMjQgaXNjYW5vbmljYWwgOSAtPiAxCitib29sMDEyNSBpc2Nhbm9uaWNhbCAtOSAtPiAxCitib29sMDEyNiBpc2Nhbm9uaWNhbCA5RSsxIC0+IDEKK2Jvb2wwMTI3IGlzY2Fub25pY2FsIC05RSsxIC0+IDEKK2Jvb2wwMTI4IGlzY2Fub25pY2FsIDlFKzIgLT4gMQorYm9vbDAxMjkgaXNjYW5vbmljYWwgLTlFKzIgLT4gMQorYm9vbDAxMzAgaXNjYW5vbmljYWwgOUUrMyAtPiAxCitib29sMDEzMSBpc2Nhbm9uaWNhbCAtOUUrMyAtPiAxCitib29sMDEzMiBpc2Nhbm9uaWNhbCA5RSs2IC0+IDEKK2Jvb2wwMTMzIGlzY2Fub25pY2FsIC05RSs2IC0+IDEKK2Jvb2wwMTM0IGlzY2Fub25pY2FsIDlFKzEwMCAtPiAxCitib29sMDEzNSBpc2Nhbm9uaWNhbCAtOUUrMTAwIC0+IDEKK2Jvb2wwMTM2IGlzY2Fub25pY2FsIDlFKzk5MCAtPiAxCitib29sMDEzNyBpc2Nhbm9uaWNhbCAtOUUrOTkwIC0+IDEKK2Jvb2wwMTM4IGlzY2Fub25pY2FsIDlFKzk5MSAtPiAxCitib29sMDEzOSBpc2Nhbm9uaWNhbCAtOUUrOTkxIC0+IDEKK2Jvb2wwMTQwIGlzY2Fub25pY2FsIDlFKzk5MiAtPiAxCitib29sMDE0MSBpc2Nhbm9uaWNhbCAtOUUrOTkyIC0+IDEKK2Jvb2wwMTQyIGlzY2Fub25pY2FsIDlFKzk5OCAtPiAxCitib29sMDE0MyBpc2Nhbm9uaWNhbCAtOUUrOTk4IC0+IDEKK2Jvb2wwMTQ0IGlzY2Fub25pY2FsIDlFKzk5OSAtPiAxCitib29sMDE0NSBpc2Nhbm9uaWNhbCAtOUUrOTk5IC0+IDEKK2Jvb2wwMTQ2IGlzY2Fub25pY2FsIDlFKzEwMDAgLT4gMQorYm9vbDAxNDcgaXNjYW5vbmljYWwgLTlFKzEwMDAgLT4gMQorYm9vbDAxNDggaXNjYW5vbmljYWwgOUUrMjAwMCAtPiAxCitib29sMDE0OSBpc2Nhbm9uaWNhbCAtOUUrMjAwMCAtPiAxCitib29sMDE1MCBpc2Nhbm9uaWNhbCA5Ljk5OTk5OTk5RS0yMDAwIC0+IDEKK2Jvb2wwMTUxIGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RS0yMDAwIC0+IDEKK2Jvb2wwMTUyIGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFLTEwMDggLT4gMQorYm9vbDAxNTMgaXNjYW5vbmljYWwgLTkuOTk5OTk5OTlFLTEwMDggLT4gMQorYm9vbDAxNTQgaXNjYW5vbmljYWwgOS45OTk5OTk5OUUtMTAwNyAtPiAxCitib29sMDE1NSBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUtMTAwNyAtPiAxCitib29sMDE1NiBpc2Nhbm9uaWNhbCA5Ljk5OTk5OTk5RS0xMDA2IC0+IDEKK2Jvb2wwMTU3IGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RS0xMDA2IC0+IDEKK2Jvb2wwMTU4IGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFLTEwMDAgLT4gMQorYm9vbDAxNTkgaXNjYW5vbmljYWwgLTkuOTk5OTk5OTlFLTEwMDAgLT4gMQorYm9vbDAxNjAgaXNjYW5vbmljYWwgOS45OTk5OTk5OUUtOTk5IC0+IDEKK2Jvb2wwMTYxIGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RS05OTkgLT4gMQorYm9vbDAxNjIgaXNjYW5vbmljYWwgOS45OTk5OTk5OUUtOTk4IC0+IDEKK2Jvb2wwMTYzIGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RS05OTggLT4gMQorYm9vbDAxNjQgaXNjYW5vbmljYWwgOS45OTk5OTk5OUUtMTAwIC0+IDEKK2Jvb2wwMTY1IGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RS0xMDAgLT4gMQorYm9vbDAxNjYgaXNjYW5vbmljYWwgMC4wMDAwMDk5OTk5OTk5OSAtPiAxCitib29sMDE2NyBpc2Nhbm9uaWNhbCAtMC4wMDAwMDk5OTk5OTk5OSAtPiAxCitib29sMDE2OCBpc2Nhbm9uaWNhbCAwLjAwOTk5OTk5OTk5IC0+IDEKK2Jvb2wwMTY5IGlzY2Fub25pY2FsIC0wLjAwOTk5OTk5OTk5IC0+IDEKK2Jvb2wwMTcwIGlzY2Fub25pY2FsIDAuMDk5OTk5OTk5OSAtPiAxCitib29sMDE3MSBpc2Nhbm9uaWNhbCAtMC4wOTk5OTk5OTk5IC0+IDEKK2Jvb2wwMTcyIGlzY2Fub25pY2FsIDAuOTk5OTk5OTk5IC0+IDEKK2Jvb2wwMTczIGlzY2Fub25pY2FsIC0wLjk5OTk5OTk5OSAtPiAxCitib29sMDE3NCBpc2Nhbm9uaWNhbCA5Ljk5OTk5OTk5IC0+IDEKK2Jvb2wwMTc1IGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5IC0+IDEKK2Jvb2wwMTc2IGlzY2Fub25pY2FsIDk5Ljk5OTk5OTkgLT4gMQorYm9vbDAxNzcgaXNjYW5vbmljYWwgLTk5Ljk5OTk5OTkgLT4gMQorYm9vbDAxNzggaXNjYW5vbmljYWwgOTk5Ljk5OTk5OSAtPiAxCitib29sMDE3OSBpc2Nhbm9uaWNhbCAtOTk5Ljk5OTk5OSAtPiAxCitib29sMDE4MCBpc2Nhbm9uaWNhbCA5OTk5Ljk5OTk5IC0+IDEKK2Jvb2wwMTgxIGlzY2Fub25pY2FsIC05OTk5Ljk5OTk5IC0+IDEKK2Jvb2wwMTgyIGlzY2Fub25pY2FsIDk5OTk5OTkuOTkgLT4gMQorYm9vbDAxODMgaXNjYW5vbmljYWwgLTk5OTk5OTkuOTkgLT4gMQorYm9vbDAxODQgaXNjYW5vbmljYWwgOS45OTk5OTk5OUUrMTAwIC0+IDEKK2Jvb2wwMTg1IGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RSsxMDAgLT4gMQorYm9vbDAxODYgaXNjYW5vbmljYWwgOS45OTk5OTk5OUUrOTkwIC0+IDEKK2Jvb2wwMTg3IGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RSs5OTAgLT4gMQorYm9vbDAxODggaXNjYW5vbmljYWwgOS45OTk5OTk5OUUrOTkxIC0+IDEKK2Jvb2wwMTg5IGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RSs5OTEgLT4gMQorYm9vbDAxOTAgaXNjYW5vbmljYWwgOS45OTk5OTk5OUUrOTkyIC0+IDEKK2Jvb2wwMTkxIGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RSs5OTIgLT4gMQorYm9vbDAxOTIgaXNjYW5vbmljYWwgOS45OTk5OTk5OUUrOTk4IC0+IDEKK2Jvb2wwMTkzIGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RSs5OTggLT4gMQorYm9vbDAxOTQgaXNjYW5vbmljYWwgOS45OTk5OTk5OUUrOTk5IC0+IDEKK2Jvb2wwMTk1IGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RSs5OTkgLT4gMQorYm9vbDAxOTYgaXNjYW5vbmljYWwgOS45OTk5OTk5OUUrMTAwMCAtPiAxCitib29sMDE5NyBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUrMTAwMCAtPiAxCitib29sMDE5OCBpc2Nhbm9uaWNhbCA5Ljk5OTk5OTk5RSsyMDAwIC0+IDEKK2Jvb2wwMTk5IGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RSsyMDAwIC0+IDEKK2Jvb2wwMjAwIGlzY2Fub25pY2FsIEluZmluaXR5IC0+IDEKK2Jvb2wwMjAxIGlzY2Fub25pY2FsIC1JbmZpbml0eSAtPiAxCitib29sMDIwMiBpc2Nhbm9uaWNhbCBOYU4gLT4gMQorYm9vbDAyMDMgaXNjYW5vbmljYWwgLU5hTiAtPiAxCitib29sMDIwNCBpc2Nhbm9uaWNhbCBOYU4xMjMgLT4gMQorYm9vbDAyMDUgaXNjYW5vbmljYWwgLU5hTjEyMyAtPiAxCitib29sMDIwNiBpc2Nhbm9uaWNhbCBzTmFOIC0+IDEKK2Jvb2wwMjA3IGlzY2Fub25pY2FsIC1zTmFOIC0+IDEKK2Jvb2wwMjA4IGlzY2Fub25pY2FsIHNOYU4xMjMgLT4gMQorYm9vbDAyMDkgaXNjYW5vbmljYWwgLXNOYU4xMjMgLT4gMQorYm9vbDAyMTAgaXNmaW5pdGUgMEUtMjAwMCAtPiAxCitib29sMDIxMSBpc2Zpbml0ZSAtMEUtMjAwMCAtPiAxCitib29sMDIxMiBpc2Zpbml0ZSAwRS0xMDA4IC0+IDEKK2Jvb2wwMjEzIGlzZmluaXRlIC0wRS0xMDA4IC0+IDEKK2Jvb2wwMjE0IGlzZmluaXRlIDBFLTEwMDcgLT4gMQorYm9vbDAyMTUgaXNmaW5pdGUgLTBFLTEwMDcgLT4gMQorYm9vbDAyMTYgaXNmaW5pdGUgMEUtMTAwNiAtPiAxCitib29sMDIxNyBpc2Zpbml0ZSAtMEUtMTAwNiAtPiAxCitib29sMDIxOCBpc2Zpbml0ZSAwRS0xMDAwIC0+IDEKK2Jvb2wwMjE5IGlzZmluaXRlIC0wRS0xMDAwIC0+IDEKK2Jvb2wwMjIwIGlzZmluaXRlIDBFLTk5OSAtPiAxCitib29sMDIyMSBpc2Zpbml0ZSAtMEUtOTk5IC0+IDEKK2Jvb2wwMjIyIGlzZmluaXRlIDBFLTk5OCAtPiAxCitib29sMDIyMyBpc2Zpbml0ZSAtMEUtOTk4IC0+IDEKK2Jvb2wwMjI0IGlzZmluaXRlIDBFLTEwMCAtPiAxCitib29sMDIyNSBpc2Zpbml0ZSAtMEUtMTAwIC0+IDEKK2Jvb2wwMjI2IGlzZmluaXRlIDAuMDAwMDAwIC0+IDEKK2Jvb2wwMjI3IGlzZmluaXRlIC0wLjAwMDAwMCAtPiAxCitib29sMDIyOCBpc2Zpbml0ZSAwLjAwMCAtPiAxCitib29sMDIyOSBpc2Zpbml0ZSAtMC4wMDAgLT4gMQorYm9vbDAyMzAgaXNmaW5pdGUgMC4wMCAtPiAxCitib29sMDIzMSBpc2Zpbml0ZSAtMC4wMCAtPiAxCitib29sMDIzMiBpc2Zpbml0ZSAwLjAgLT4gMQorYm9vbDAyMzMgaXNmaW5pdGUgLTAuMCAtPiAxCitib29sMDIzNCBpc2Zpbml0ZSAwIC0+IDEKK2Jvb2wwMjM1IGlzZmluaXRlIC0wIC0+IDEKK2Jvb2wwMjM2IGlzZmluaXRlIDBFKzEgLT4gMQorYm9vbDAyMzcgaXNmaW5pdGUgLTBFKzEgLT4gMQorYm9vbDAyMzggaXNmaW5pdGUgMEUrMiAtPiAxCitib29sMDIzOSBpc2Zpbml0ZSAtMEUrMiAtPiAxCitib29sMDI0MCBpc2Zpbml0ZSAwRSszIC0+IDEKK2Jvb2wwMjQxIGlzZmluaXRlIC0wRSszIC0+IDEKK2Jvb2wwMjQyIGlzZmluaXRlIDBFKzYgLT4gMQorYm9vbDAyNDMgaXNmaW5pdGUgLTBFKzYgLT4gMQorYm9vbDAyNDQgaXNmaW5pdGUgMEUrMTAwIC0+IDEKK2Jvb2wwMjQ1IGlzZmluaXRlIC0wRSsxMDAgLT4gMQorYm9vbDAyNDYgaXNmaW5pdGUgMEUrOTkwIC0+IDEKK2Jvb2wwMjQ3IGlzZmluaXRlIC0wRSs5OTAgLT4gMQorYm9vbDAyNDggaXNmaW5pdGUgMEUrOTkxIC0+IDEKK2Jvb2wwMjQ5IGlzZmluaXRlIC0wRSs5OTEgLT4gMQorYm9vbDAyNTAgaXNmaW5pdGUgMEUrOTkyIC0+IDEKK2Jvb2wwMjUxIGlzZmluaXRlIC0wRSs5OTIgLT4gMQorYm9vbDAyNTIgaXNmaW5pdGUgMEUrOTk4IC0+IDEKK2Jvb2wwMjUzIGlzZmluaXRlIC0wRSs5OTggLT4gMQorYm9vbDAyNTQgaXNmaW5pdGUgMEUrOTk5IC0+IDEKK2Jvb2wwMjU1IGlzZmluaXRlIC0wRSs5OTkgLT4gMQorYm9vbDAyNTYgaXNmaW5pdGUgMEUrMTAwMCAtPiAxCitib29sMDI1NyBpc2Zpbml0ZSAtMEUrMTAwMCAtPiAxCitib29sMDI1OCBpc2Zpbml0ZSAwRSsyMDAwIC0+IDEKK2Jvb2wwMjU5IGlzZmluaXRlIC0wRSsyMDAwIC0+IDEKK2Jvb2wwMjYwIGlzZmluaXRlIDFFLTIwMDAgLT4gMQorYm9vbDAyNjEgaXNmaW5pdGUgLTFFLTIwMDAgLT4gMQorYm9vbDAyNjIgaXNmaW5pdGUgMUUtMTAwOCAtPiAxCitib29sMDI2MyBpc2Zpbml0ZSAtMUUtMTAwOCAtPiAxCitib29sMDI2NCBpc2Zpbml0ZSAxRS0xMDA3IC0+IDEKK2Jvb2wwMjY1IGlzZmluaXRlIC0xRS0xMDA3IC0+IDEKK2Jvb2wwMjY2IGlzZmluaXRlIDFFLTEwMDYgLT4gMQorYm9vbDAyNjcgaXNmaW5pdGUgLTFFLTEwMDYgLT4gMQorYm9vbDAyNjggaXNmaW5pdGUgMUUtMTAwMCAtPiAxCitib29sMDI2OSBpc2Zpbml0ZSAtMUUtMTAwMCAtPiAxCitib29sMDI3MCBpc2Zpbml0ZSAxRS05OTkgLT4gMQorYm9vbDAyNzEgaXNmaW5pdGUgLTFFLTk5OSAtPiAxCitib29sMDI3MiBpc2Zpbml0ZSAxRS05OTggLT4gMQorYm9vbDAyNzMgaXNmaW5pdGUgLTFFLTk5OCAtPiAxCitib29sMDI3NCBpc2Zpbml0ZSAxRS0xMDAgLT4gMQorYm9vbDAyNzUgaXNmaW5pdGUgLTFFLTEwMCAtPiAxCitib29sMDI3NiBpc2Zpbml0ZSAwLjAwMDAwMSAtPiAxCitib29sMDI3NyBpc2Zpbml0ZSAtMC4wMDAwMDEgLT4gMQorYm9vbDAyNzggaXNmaW5pdGUgMC4wMDEgLT4gMQorYm9vbDAyNzkgaXNmaW5pdGUgLTAuMDAxIC0+IDEKK2Jvb2wwMjgwIGlzZmluaXRlIDAuMDEgLT4gMQorYm9vbDAyODEgaXNmaW5pdGUgLTAuMDEgLT4gMQorYm9vbDAyODIgaXNmaW5pdGUgMC4xIC0+IDEKK2Jvb2wwMjgzIGlzZmluaXRlIC0wLjEgLT4gMQorYm9vbDAyODQgaXNmaW5pdGUgMSAtPiAxCitib29sMDI4NSBpc2Zpbml0ZSAtMSAtPiAxCitib29sMDI4NiBpc2Zpbml0ZSAxRSsxIC0+IDEKK2Jvb2wwMjg3IGlzZmluaXRlIC0xRSsxIC0+IDEKK2Jvb2wwMjg4IGlzZmluaXRlIDFFKzIgLT4gMQorYm9vbDAyODkgaXNmaW5pdGUgLTFFKzIgLT4gMQorYm9vbDAyOTAgaXNmaW5pdGUgMUUrMyAtPiAxCitib29sMDI5MSBpc2Zpbml0ZSAtMUUrMyAtPiAxCitib29sMDI5MiBpc2Zpbml0ZSAxRSs2IC0+IDEKK2Jvb2wwMjkzIGlzZmluaXRlIC0xRSs2IC0+IDEKK2Jvb2wwMjk0IGlzZmluaXRlIDFFKzEwMCAtPiAxCitib29sMDI5NSBpc2Zpbml0ZSAtMUUrMTAwIC0+IDEKK2Jvb2wwMjk2IGlzZmluaXRlIDFFKzk5MCAtPiAxCitib29sMDI5NyBpc2Zpbml0ZSAtMUUrOTkwIC0+IDEKK2Jvb2wwMjk4IGlzZmluaXRlIDFFKzk5MSAtPiAxCitib29sMDI5OSBpc2Zpbml0ZSAtMUUrOTkxIC0+IDEKK2Jvb2wwMzAwIGlzZmluaXRlIDFFKzk5MiAtPiAxCitib29sMDMwMSBpc2Zpbml0ZSAtMUUrOTkyIC0+IDEKK2Jvb2wwMzAyIGlzZmluaXRlIDFFKzk5OCAtPiAxCitib29sMDMwMyBpc2Zpbml0ZSAtMUUrOTk4IC0+IDEKK2Jvb2wwMzA0IGlzZmluaXRlIDFFKzk5OSAtPiAxCitib29sMDMwNSBpc2Zpbml0ZSAtMUUrOTk5IC0+IDEKK2Jvb2wwMzA2IGlzZmluaXRlIDFFKzEwMDAgLT4gMQorYm9vbDAzMDcgaXNmaW5pdGUgLTFFKzEwMDAgLT4gMQorYm9vbDAzMDggaXNmaW5pdGUgMUUrMjAwMCAtPiAxCitib29sMDMwOSBpc2Zpbml0ZSAtMUUrMjAwMCAtPiAxCitib29sMDMxMCBpc2Zpbml0ZSA5RS0yMDAwIC0+IDEKK2Jvb2wwMzExIGlzZmluaXRlIC05RS0yMDAwIC0+IDEKK2Jvb2wwMzEyIGlzZmluaXRlIDlFLTEwMDggLT4gMQorYm9vbDAzMTMgaXNmaW5pdGUgLTlFLTEwMDggLT4gMQorYm9vbDAzMTQgaXNmaW5pdGUgOUUtMTAwNyAtPiAxCitib29sMDMxNSBpc2Zpbml0ZSAtOUUtMTAwNyAtPiAxCitib29sMDMxNiBpc2Zpbml0ZSA5RS0xMDA2IC0+IDEKK2Jvb2wwMzE3IGlzZmluaXRlIC05RS0xMDA2IC0+IDEKK2Jvb2wwMzE4IGlzZmluaXRlIDlFLTEwMDAgLT4gMQorYm9vbDAzMTkgaXNmaW5pdGUgLTlFLTEwMDAgLT4gMQorYm9vbDAzMjAgaXNmaW5pdGUgOUUtOTk5IC0+IDEKK2Jvb2wwMzIxIGlzZmluaXRlIC05RS05OTkgLT4gMQorYm9vbDAzMjIgaXNmaW5pdGUgOUUtOTk4IC0+IDEKK2Jvb2wwMzIzIGlzZmluaXRlIC05RS05OTggLT4gMQorYm9vbDAzMjQgaXNmaW5pdGUgOUUtMTAwIC0+IDEKK2Jvb2wwMzI1IGlzZmluaXRlIC05RS0xMDAgLT4gMQorYm9vbDAzMjYgaXNmaW5pdGUgMC4wMDAwMDkgLT4gMQorYm9vbDAzMjcgaXNmaW5pdGUgLTAuMDAwMDA5IC0+IDEKK2Jvb2wwMzI4IGlzZmluaXRlIDAuMDA5IC0+IDEKK2Jvb2wwMzI5IGlzZmluaXRlIC0wLjAwOSAtPiAxCitib29sMDMzMCBpc2Zpbml0ZSAwLjA5IC0+IDEKK2Jvb2wwMzMxIGlzZmluaXRlIC0wLjA5IC0+IDEKK2Jvb2wwMzMyIGlzZmluaXRlIDAuOSAtPiAxCitib29sMDMzMyBpc2Zpbml0ZSAtMC45IC0+IDEKK2Jvb2wwMzM0IGlzZmluaXRlIDkgLT4gMQorYm9vbDAzMzUgaXNmaW5pdGUgLTkgLT4gMQorYm9vbDAzMzYgaXNmaW5pdGUgOUUrMSAtPiAxCitib29sMDMzNyBpc2Zpbml0ZSAtOUUrMSAtPiAxCitib29sMDMzOCBpc2Zpbml0ZSA5RSsyIC0+IDEKK2Jvb2wwMzM5IGlzZmluaXRlIC05RSsyIC0+IDEKK2Jvb2wwMzQwIGlzZmluaXRlIDlFKzMgLT4gMQorYm9vbDAzNDEgaXNmaW5pdGUgLTlFKzMgLT4gMQorYm9vbDAzNDIgaXNmaW5pdGUgOUUrNiAtPiAxCitib29sMDM0MyBpc2Zpbml0ZSAtOUUrNiAtPiAxCitib29sMDM0NCBpc2Zpbml0ZSA5RSsxMDAgLT4gMQorYm9vbDAzNDUgaXNmaW5pdGUgLTlFKzEwMCAtPiAxCitib29sMDM0NiBpc2Zpbml0ZSA5RSs5OTAgLT4gMQorYm9vbDAzNDcgaXNmaW5pdGUgLTlFKzk5MCAtPiAxCitib29sMDM0OCBpc2Zpbml0ZSA5RSs5OTEgLT4gMQorYm9vbDAzNDkgaXNmaW5pdGUgLTlFKzk5MSAtPiAxCitib29sMDM1MCBpc2Zpbml0ZSA5RSs5OTIgLT4gMQorYm9vbDAzNTEgaXNmaW5pdGUgLTlFKzk5MiAtPiAxCitib29sMDM1MiBpc2Zpbml0ZSA5RSs5OTggLT4gMQorYm9vbDAzNTMgaXNmaW5pdGUgLTlFKzk5OCAtPiAxCitib29sMDM1NCBpc2Zpbml0ZSA5RSs5OTkgLT4gMQorYm9vbDAzNTUgaXNmaW5pdGUgLTlFKzk5OSAtPiAxCitib29sMDM1NiBpc2Zpbml0ZSA5RSsxMDAwIC0+IDEKK2Jvb2wwMzU3IGlzZmluaXRlIC05RSsxMDAwIC0+IDEKK2Jvb2wwMzU4IGlzZmluaXRlIDlFKzIwMDAgLT4gMQorYm9vbDAzNTkgaXNmaW5pdGUgLTlFKzIwMDAgLT4gMQorYm9vbDAzNjAgaXNmaW5pdGUgOS45OTk5OTk5OUUtMjAwMCAtPiAxCitib29sMDM2MSBpc2Zpbml0ZSAtOS45OTk5OTk5OUUtMjAwMCAtPiAxCitib29sMDM2MiBpc2Zpbml0ZSA5Ljk5OTk5OTk5RS0xMDA4IC0+IDEKK2Jvb2wwMzYzIGlzZmluaXRlIC05Ljk5OTk5OTk5RS0xMDA4IC0+IDEKK2Jvb2wwMzY0IGlzZmluaXRlIDkuOTk5OTk5OTlFLTEwMDcgLT4gMQorYm9vbDAzNjUgaXNmaW5pdGUgLTkuOTk5OTk5OTlFLTEwMDcgLT4gMQorYm9vbDAzNjYgaXNmaW5pdGUgOS45OTk5OTk5OUUtMTAwNiAtPiAxCitib29sMDM2NyBpc2Zpbml0ZSAtOS45OTk5OTk5OUUtMTAwNiAtPiAxCitib29sMDM2OCBpc2Zpbml0ZSA5Ljk5OTk5OTk5RS0xMDAwIC0+IDEKK2Jvb2wwMzY5IGlzZmluaXRlIC05Ljk5OTk5OTk5RS0xMDAwIC0+IDEKK2Jvb2wwMzcwIGlzZmluaXRlIDkuOTk5OTk5OTlFLTk5OSAtPiAxCitib29sMDM3MSBpc2Zpbml0ZSAtOS45OTk5OTk5OUUtOTk5IC0+IDEKK2Jvb2wwMzcyIGlzZmluaXRlIDkuOTk5OTk5OTlFLTk5OCAtPiAxCitib29sMDM3MyBpc2Zpbml0ZSAtOS45OTk5OTk5OUUtOTk4IC0+IDEKK2Jvb2wwMzc0IGlzZmluaXRlIDkuOTk5OTk5OTlFLTEwMCAtPiAxCitib29sMDM3NSBpc2Zpbml0ZSAtOS45OTk5OTk5OUUtMTAwIC0+IDEKK2Jvb2wwMzc2IGlzZmluaXRlIDAuMDAwMDA5OTk5OTk5OTkgLT4gMQorYm9vbDAzNzcgaXNmaW5pdGUgLTAuMDAwMDA5OTk5OTk5OTkgLT4gMQorYm9vbDAzNzggaXNmaW5pdGUgMC4wMDk5OTk5OTk5OSAtPiAxCitib29sMDM3OSBpc2Zpbml0ZSAtMC4wMDk5OTk5OTk5OSAtPiAxCitib29sMDM4MCBpc2Zpbml0ZSAwLjA5OTk5OTk5OTkgLT4gMQorYm9vbDAzODEgaXNmaW5pdGUgLTAuMDk5OTk5OTk5OSAtPiAxCitib29sMDM4MiBpc2Zpbml0ZSAwLjk5OTk5OTk5OSAtPiAxCitib29sMDM4MyBpc2Zpbml0ZSAtMC45OTk5OTk5OTkgLT4gMQorYm9vbDAzODQgaXNmaW5pdGUgOS45OTk5OTk5OSAtPiAxCitib29sMDM4NSBpc2Zpbml0ZSAtOS45OTk5OTk5OSAtPiAxCitib29sMDM4NiBpc2Zpbml0ZSA5OS45OTk5OTk5IC0+IDEKK2Jvb2wwMzg3IGlzZmluaXRlIC05OS45OTk5OTk5IC0+IDEKK2Jvb2wwMzg4IGlzZmluaXRlIDk5OS45OTk5OTkgLT4gMQorYm9vbDAzODkgaXNmaW5pdGUgLTk5OS45OTk5OTkgLT4gMQorYm9vbDAzOTAgaXNmaW5pdGUgOTk5OS45OTk5OSAtPiAxCitib29sMDM5MSBpc2Zpbml0ZSAtOTk5OS45OTk5OSAtPiAxCitib29sMDM5MiBpc2Zpbml0ZSA5OTk5OTk5Ljk5IC0+IDEKK2Jvb2wwMzkzIGlzZmluaXRlIC05OTk5OTk5Ljk5IC0+IDEKK2Jvb2wwMzk0IGlzZmluaXRlIDkuOTk5OTk5OTlFKzEwMCAtPiAxCitib29sMDM5NSBpc2Zpbml0ZSAtOS45OTk5OTk5OUUrMTAwIC0+IDEKK2Jvb2wwMzk2IGlzZmluaXRlIDkuOTk5OTk5OTlFKzk5MCAtPiAxCitib29sMDM5NyBpc2Zpbml0ZSAtOS45OTk5OTk5OUUrOTkwIC0+IDEKK2Jvb2wwMzk4IGlzZmluaXRlIDkuOTk5OTk5OTlFKzk5MSAtPiAxCitib29sMDM5OSBpc2Zpbml0ZSAtOS45OTk5OTk5OUUrOTkxIC0+IDEKK2Jvb2wwNDAwIGlzZmluaXRlIDkuOTk5OTk5OTlFKzk5MiAtPiAxCitib29sMDQwMSBpc2Zpbml0ZSAtOS45OTk5OTk5OUUrOTkyIC0+IDEKK2Jvb2wwNDAyIGlzZmluaXRlIDkuOTk5OTk5OTlFKzk5OCAtPiAxCitib29sMDQwMyBpc2Zpbml0ZSAtOS45OTk5OTk5OUUrOTk4IC0+IDEKK2Jvb2wwNDA0IGlzZmluaXRlIDkuOTk5OTk5OTlFKzk5OSAtPiAxCitib29sMDQwNSBpc2Zpbml0ZSAtOS45OTk5OTk5OUUrOTk5IC0+IDEKK2Jvb2wwNDA2IGlzZmluaXRlIDkuOTk5OTk5OTlFKzEwMDAgLT4gMQorYm9vbDA0MDcgaXNmaW5pdGUgLTkuOTk5OTk5OTlFKzEwMDAgLT4gMQorYm9vbDA0MDggaXNmaW5pdGUgOS45OTk5OTk5OUUrMjAwMCAtPiAxCitib29sMDQwOSBpc2Zpbml0ZSAtOS45OTk5OTk5OUUrMjAwMCAtPiAxCitib29sMDQxMCBpc2Zpbml0ZSBJbmZpbml0eSAtPiAwCitib29sMDQxMSBpc2Zpbml0ZSAtSW5maW5pdHkgLT4gMAorYm9vbDA0MTIgaXNmaW5pdGUgTmFOIC0+IDAKK2Jvb2wwNDEzIGlzZmluaXRlIC1OYU4gLT4gMAorYm9vbDA0MTQgaXNmaW5pdGUgTmFOMTIzIC0+IDAKK2Jvb2wwNDE1IGlzZmluaXRlIC1OYU4xMjMgLT4gMAorYm9vbDA0MTYgaXNmaW5pdGUgc05hTiAtPiAwCitib29sMDQxNyBpc2Zpbml0ZSAtc05hTiAtPiAwCitib29sMDQxOCBpc2Zpbml0ZSBzTmFOMTIzIC0+IDAKK2Jvb2wwNDE5IGlzZmluaXRlIC1zTmFOMTIzIC0+IDAKK2Jvb2wwNDIwIGlzaW5maW5pdGUgMEUtMjAwMCAtPiAwCitib29sMDQyMSBpc2luZmluaXRlIC0wRS0yMDAwIC0+IDAKK2Jvb2wwNDIyIGlzaW5maW5pdGUgMEUtMTAwOCAtPiAwCitib29sMDQyMyBpc2luZmluaXRlIC0wRS0xMDA4IC0+IDAKK2Jvb2wwNDI0IGlzaW5maW5pdGUgMEUtMTAwNyAtPiAwCitib29sMDQyNSBpc2luZmluaXRlIC0wRS0xMDA3IC0+IDAKK2Jvb2wwNDI2IGlzaW5maW5pdGUgMEUtMTAwNiAtPiAwCitib29sMDQyNyBpc2luZmluaXRlIC0wRS0xMDA2IC0+IDAKK2Jvb2wwNDI4IGlzaW5maW5pdGUgMEUtMTAwMCAtPiAwCitib29sMDQyOSBpc2luZmluaXRlIC0wRS0xMDAwIC0+IDAKK2Jvb2wwNDMwIGlzaW5maW5pdGUgMEUtOTk5IC0+IDAKK2Jvb2wwNDMxIGlzaW5maW5pdGUgLTBFLTk5OSAtPiAwCitib29sMDQzMiBpc2luZmluaXRlIDBFLTk5OCAtPiAwCitib29sMDQzMyBpc2luZmluaXRlIC0wRS05OTggLT4gMAorYm9vbDA0MzQgaXNpbmZpbml0ZSAwRS0xMDAgLT4gMAorYm9vbDA0MzUgaXNpbmZpbml0ZSAtMEUtMTAwIC0+IDAKK2Jvb2wwNDM2IGlzaW5maW5pdGUgMC4wMDAwMDAgLT4gMAorYm9vbDA0MzcgaXNpbmZpbml0ZSAtMC4wMDAwMDAgLT4gMAorYm9vbDA0MzggaXNpbmZpbml0ZSAwLjAwMCAtPiAwCitib29sMDQzOSBpc2luZmluaXRlIC0wLjAwMCAtPiAwCitib29sMDQ0MCBpc2luZmluaXRlIDAuMDAgLT4gMAorYm9vbDA0NDEgaXNpbmZpbml0ZSAtMC4wMCAtPiAwCitib29sMDQ0MiBpc2luZmluaXRlIDAuMCAtPiAwCitib29sMDQ0MyBpc2luZmluaXRlIC0wLjAgLT4gMAorYm9vbDA0NDQgaXNpbmZpbml0ZSAwIC0+IDAKK2Jvb2wwNDQ1IGlzaW5maW5pdGUgLTAgLT4gMAorYm9vbDA0NDYgaXNpbmZpbml0ZSAwRSsxIC0+IDAKK2Jvb2wwNDQ3IGlzaW5maW5pdGUgLTBFKzEgLT4gMAorYm9vbDA0NDggaXNpbmZpbml0ZSAwRSsyIC0+IDAKK2Jvb2wwNDQ5IGlzaW5maW5pdGUgLTBFKzIgLT4gMAorYm9vbDA0NTAgaXNpbmZpbml0ZSAwRSszIC0+IDAKK2Jvb2wwNDUxIGlzaW5maW5pdGUgLTBFKzMgLT4gMAorYm9vbDA0NTIgaXNpbmZpbml0ZSAwRSs2IC0+IDAKK2Jvb2wwNDUzIGlzaW5maW5pdGUgLTBFKzYgLT4gMAorYm9vbDA0NTQgaXNpbmZpbml0ZSAwRSsxMDAgLT4gMAorYm9vbDA0NTUgaXNpbmZpbml0ZSAtMEUrMTAwIC0+IDAKK2Jvb2wwNDU2IGlzaW5maW5pdGUgMEUrOTkwIC0+IDAKK2Jvb2wwNDU3IGlzaW5maW5pdGUgLTBFKzk5MCAtPiAwCitib29sMDQ1OCBpc2luZmluaXRlIDBFKzk5MSAtPiAwCitib29sMDQ1OSBpc2luZmluaXRlIC0wRSs5OTEgLT4gMAorYm9vbDA0NjAgaXNpbmZpbml0ZSAwRSs5OTIgLT4gMAorYm9vbDA0NjEgaXNpbmZpbml0ZSAtMEUrOTkyIC0+IDAKK2Jvb2wwNDYyIGlzaW5maW5pdGUgMEUrOTk4IC0+IDAKK2Jvb2wwNDYzIGlzaW5maW5pdGUgLTBFKzk5OCAtPiAwCitib29sMDQ2NCBpc2luZmluaXRlIDBFKzk5OSAtPiAwCitib29sMDQ2NSBpc2luZmluaXRlIC0wRSs5OTkgLT4gMAorYm9vbDA0NjYgaXNpbmZpbml0ZSAwRSsxMDAwIC0+IDAKK2Jvb2wwNDY3IGlzaW5maW5pdGUgLTBFKzEwMDAgLT4gMAorYm9vbDA0NjggaXNpbmZpbml0ZSAwRSsyMDAwIC0+IDAKK2Jvb2wwNDY5IGlzaW5maW5pdGUgLTBFKzIwMDAgLT4gMAorYm9vbDA0NzAgaXNpbmZpbml0ZSAxRS0yMDAwIC0+IDAKK2Jvb2wwNDcxIGlzaW5maW5pdGUgLTFFLTIwMDAgLT4gMAorYm9vbDA0NzIgaXNpbmZpbml0ZSAxRS0xMDA4IC0+IDAKK2Jvb2wwNDczIGlzaW5maW5pdGUgLTFFLTEwMDggLT4gMAorYm9vbDA0NzQgaXNpbmZpbml0ZSAxRS0xMDA3IC0+IDAKK2Jvb2wwNDc1IGlzaW5maW5pdGUgLTFFLTEwMDcgLT4gMAorYm9vbDA0NzYgaXNpbmZpbml0ZSAxRS0xMDA2IC0+IDAKK2Jvb2wwNDc3IGlzaW5maW5pdGUgLTFFLTEwMDYgLT4gMAorYm9vbDA0NzggaXNpbmZpbml0ZSAxRS0xMDAwIC0+IDAKK2Jvb2wwNDc5IGlzaW5maW5pdGUgLTFFLTEwMDAgLT4gMAorYm9vbDA0ODAgaXNpbmZpbml0ZSAxRS05OTkgLT4gMAorYm9vbDA0ODEgaXNpbmZpbml0ZSAtMUUtOTk5IC0+IDAKK2Jvb2wwNDgyIGlzaW5maW5pdGUgMUUtOTk4IC0+IDAKK2Jvb2wwNDgzIGlzaW5maW5pdGUgLTFFLTk5OCAtPiAwCitib29sMDQ4NCBpc2luZmluaXRlIDFFLTEwMCAtPiAwCitib29sMDQ4NSBpc2luZmluaXRlIC0xRS0xMDAgLT4gMAorYm9vbDA0ODYgaXNpbmZpbml0ZSAwLjAwMDAwMSAtPiAwCitib29sMDQ4NyBpc2luZmluaXRlIC0wLjAwMDAwMSAtPiAwCitib29sMDQ4OCBpc2luZmluaXRlIDAuMDAxIC0+IDAKK2Jvb2wwNDg5IGlzaW5maW5pdGUgLTAuMDAxIC0+IDAKK2Jvb2wwNDkwIGlzaW5maW5pdGUgMC4wMSAtPiAwCitib29sMDQ5MSBpc2luZmluaXRlIC0wLjAxIC0+IDAKK2Jvb2wwNDkyIGlzaW5maW5pdGUgMC4xIC0+IDAKK2Jvb2wwNDkzIGlzaW5maW5pdGUgLTAuMSAtPiAwCitib29sMDQ5NCBpc2luZmluaXRlIDEgLT4gMAorYm9vbDA0OTUgaXNpbmZpbml0ZSAtMSAtPiAwCitib29sMDQ5NiBpc2luZmluaXRlIDFFKzEgLT4gMAorYm9vbDA0OTcgaXNpbmZpbml0ZSAtMUUrMSAtPiAwCitib29sMDQ5OCBpc2luZmluaXRlIDFFKzIgLT4gMAorYm9vbDA0OTkgaXNpbmZpbml0ZSAtMUUrMiAtPiAwCitib29sMDUwMCBpc2luZmluaXRlIDFFKzMgLT4gMAorYm9vbDA1MDEgaXNpbmZpbml0ZSAtMUUrMyAtPiAwCitib29sMDUwMiBpc2luZmluaXRlIDFFKzYgLT4gMAorYm9vbDA1MDMgaXNpbmZpbml0ZSAtMUUrNiAtPiAwCitib29sMDUwNCBpc2luZmluaXRlIDFFKzEwMCAtPiAwCitib29sMDUwNSBpc2luZmluaXRlIC0xRSsxMDAgLT4gMAorYm9vbDA1MDYgaXNpbmZpbml0ZSAxRSs5OTAgLT4gMAorYm9vbDA1MDcgaXNpbmZpbml0ZSAtMUUrOTkwIC0+IDAKK2Jvb2wwNTA4IGlzaW5maW5pdGUgMUUrOTkxIC0+IDAKK2Jvb2wwNTA5IGlzaW5maW5pdGUgLTFFKzk5MSAtPiAwCitib29sMDUxMCBpc2luZmluaXRlIDFFKzk5MiAtPiAwCitib29sMDUxMSBpc2luZmluaXRlIC0xRSs5OTIgLT4gMAorYm9vbDA1MTIgaXNpbmZpbml0ZSAxRSs5OTggLT4gMAorYm9vbDA1MTMgaXNpbmZpbml0ZSAtMUUrOTk4IC0+IDAKK2Jvb2wwNTE0IGlzaW5maW5pdGUgMUUrOTk5IC0+IDAKK2Jvb2wwNTE1IGlzaW5maW5pdGUgLTFFKzk5OSAtPiAwCitib29sMDUxNiBpc2luZmluaXRlIDFFKzEwMDAgLT4gMAorYm9vbDA1MTcgaXNpbmZpbml0ZSAtMUUrMTAwMCAtPiAwCitib29sMDUxOCBpc2luZmluaXRlIDFFKzIwMDAgLT4gMAorYm9vbDA1MTkgaXNpbmZpbml0ZSAtMUUrMjAwMCAtPiAwCitib29sMDUyMCBpc2luZmluaXRlIDlFLTIwMDAgLT4gMAorYm9vbDA1MjEgaXNpbmZpbml0ZSAtOUUtMjAwMCAtPiAwCitib29sMDUyMiBpc2luZmluaXRlIDlFLTEwMDggLT4gMAorYm9vbDA1MjMgaXNpbmZpbml0ZSAtOUUtMTAwOCAtPiAwCitib29sMDUyNCBpc2luZmluaXRlIDlFLTEwMDcgLT4gMAorYm9vbDA1MjUgaXNpbmZpbml0ZSAtOUUtMTAwNyAtPiAwCitib29sMDUyNiBpc2luZmluaXRlIDlFLTEwMDYgLT4gMAorYm9vbDA1MjcgaXNpbmZpbml0ZSAtOUUtMTAwNiAtPiAwCitib29sMDUyOCBpc2luZmluaXRlIDlFLTEwMDAgLT4gMAorYm9vbDA1MjkgaXNpbmZpbml0ZSAtOUUtMTAwMCAtPiAwCitib29sMDUzMCBpc2luZmluaXRlIDlFLTk5OSAtPiAwCitib29sMDUzMSBpc2luZmluaXRlIC05RS05OTkgLT4gMAorYm9vbDA1MzIgaXNpbmZpbml0ZSA5RS05OTggLT4gMAorYm9vbDA1MzMgaXNpbmZpbml0ZSAtOUUtOTk4IC0+IDAKK2Jvb2wwNTM0IGlzaW5maW5pdGUgOUUtMTAwIC0+IDAKK2Jvb2wwNTM1IGlzaW5maW5pdGUgLTlFLTEwMCAtPiAwCitib29sMDUzNiBpc2luZmluaXRlIDAuMDAwMDA5IC0+IDAKK2Jvb2wwNTM3IGlzaW5maW5pdGUgLTAuMDAwMDA5IC0+IDAKK2Jvb2wwNTM4IGlzaW5maW5pdGUgMC4wMDkgLT4gMAorYm9vbDA1MzkgaXNpbmZpbml0ZSAtMC4wMDkgLT4gMAorYm9vbDA1NDAgaXNpbmZpbml0ZSAwLjA5IC0+IDAKK2Jvb2wwNTQxIGlzaW5maW5pdGUgLTAuMDkgLT4gMAorYm9vbDA1NDIgaXNpbmZpbml0ZSAwLjkgLT4gMAorYm9vbDA1NDMgaXNpbmZpbml0ZSAtMC45IC0+IDAKK2Jvb2wwNTQ0IGlzaW5maW5pdGUgOSAtPiAwCitib29sMDU0NSBpc2luZmluaXRlIC05IC0+IDAKK2Jvb2wwNTQ2IGlzaW5maW5pdGUgOUUrMSAtPiAwCitib29sMDU0NyBpc2luZmluaXRlIC05RSsxIC0+IDAKK2Jvb2wwNTQ4IGlzaW5maW5pdGUgOUUrMiAtPiAwCitib29sMDU0OSBpc2luZmluaXRlIC05RSsyIC0+IDAKK2Jvb2wwNTUwIGlzaW5maW5pdGUgOUUrMyAtPiAwCitib29sMDU1MSBpc2luZmluaXRlIC05RSszIC0+IDAKK2Jvb2wwNTUyIGlzaW5maW5pdGUgOUUrNiAtPiAwCitib29sMDU1MyBpc2luZmluaXRlIC05RSs2IC0+IDAKK2Jvb2wwNTU0IGlzaW5maW5pdGUgOUUrMTAwIC0+IDAKK2Jvb2wwNTU1IGlzaW5maW5pdGUgLTlFKzEwMCAtPiAwCitib29sMDU1NiBpc2luZmluaXRlIDlFKzk5MCAtPiAwCitib29sMDU1NyBpc2luZmluaXRlIC05RSs5OTAgLT4gMAorYm9vbDA1NTggaXNpbmZpbml0ZSA5RSs5OTEgLT4gMAorYm9vbDA1NTkgaXNpbmZpbml0ZSAtOUUrOTkxIC0+IDAKK2Jvb2wwNTYwIGlzaW5maW5pdGUgOUUrOTkyIC0+IDAKK2Jvb2wwNTYxIGlzaW5maW5pdGUgLTlFKzk5MiAtPiAwCitib29sMDU2MiBpc2luZmluaXRlIDlFKzk5OCAtPiAwCitib29sMDU2MyBpc2luZmluaXRlIC05RSs5OTggLT4gMAorYm9vbDA1NjQgaXNpbmZpbml0ZSA5RSs5OTkgLT4gMAorYm9vbDA1NjUgaXNpbmZpbml0ZSAtOUUrOTk5IC0+IDAKK2Jvb2wwNTY2IGlzaW5maW5pdGUgOUUrMTAwMCAtPiAwCitib29sMDU2NyBpc2luZmluaXRlIC05RSsxMDAwIC0+IDAKK2Jvb2wwNTY4IGlzaW5maW5pdGUgOUUrMjAwMCAtPiAwCitib29sMDU2OSBpc2luZmluaXRlIC05RSsyMDAwIC0+IDAKK2Jvb2wwNTcwIGlzaW5maW5pdGUgOS45OTk5OTk5OUUtMjAwMCAtPiAwCitib29sMDU3MSBpc2luZmluaXRlIC05Ljk5OTk5OTk5RS0yMDAwIC0+IDAKK2Jvb2wwNTcyIGlzaW5maW5pdGUgOS45OTk5OTk5OUUtMTAwOCAtPiAwCitib29sMDU3MyBpc2luZmluaXRlIC05Ljk5OTk5OTk5RS0xMDA4IC0+IDAKK2Jvb2wwNTc0IGlzaW5maW5pdGUgOS45OTk5OTk5OUUtMTAwNyAtPiAwCitib29sMDU3NSBpc2luZmluaXRlIC05Ljk5OTk5OTk5RS0xMDA3IC0+IDAKK2Jvb2wwNTc2IGlzaW5maW5pdGUgOS45OTk5OTk5OUUtMTAwNiAtPiAwCitib29sMDU3NyBpc2luZmluaXRlIC05Ljk5OTk5OTk5RS0xMDA2IC0+IDAKK2Jvb2wwNTc4IGlzaW5maW5pdGUgOS45OTk5OTk5OUUtMTAwMCAtPiAwCitib29sMDU3OSBpc2luZmluaXRlIC05Ljk5OTk5OTk5RS0xMDAwIC0+IDAKK2Jvb2wwNTgwIGlzaW5maW5pdGUgOS45OTk5OTk5OUUtOTk5IC0+IDAKK2Jvb2wwNTgxIGlzaW5maW5pdGUgLTkuOTk5OTk5OTlFLTk5OSAtPiAwCitib29sMDU4MiBpc2luZmluaXRlIDkuOTk5OTk5OTlFLTk5OCAtPiAwCitib29sMDU4MyBpc2luZmluaXRlIC05Ljk5OTk5OTk5RS05OTggLT4gMAorYm9vbDA1ODQgaXNpbmZpbml0ZSA5Ljk5OTk5OTk5RS0xMDAgLT4gMAorYm9vbDA1ODUgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUtMTAwIC0+IDAKK2Jvb2wwNTg2IGlzaW5maW5pdGUgMC4wMDAwMDk5OTk5OTk5OSAtPiAwCitib29sMDU4NyBpc2luZmluaXRlIC0wLjAwMDAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wwNTg4IGlzaW5maW5pdGUgMC4wMDk5OTk5OTk5OSAtPiAwCitib29sMDU4OSBpc2luZmluaXRlIC0wLjAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wwNTkwIGlzaW5maW5pdGUgMC4wOTk5OTk5OTk5IC0+IDAKK2Jvb2wwNTkxIGlzaW5maW5pdGUgLTAuMDk5OTk5OTk5OSAtPiAwCitib29sMDU5MiBpc2luZmluaXRlIDAuOTk5OTk5OTk5IC0+IDAKK2Jvb2wwNTkzIGlzaW5maW5pdGUgLTAuOTk5OTk5OTk5IC0+IDAKK2Jvb2wwNTk0IGlzaW5maW5pdGUgOS45OTk5OTk5OSAtPiAwCitib29sMDU5NSBpc2luZmluaXRlIC05Ljk5OTk5OTk5IC0+IDAKK2Jvb2wwNTk2IGlzaW5maW5pdGUgOTkuOTk5OTk5OSAtPiAwCitib29sMDU5NyBpc2luZmluaXRlIC05OS45OTk5OTk5IC0+IDAKK2Jvb2wwNTk4IGlzaW5maW5pdGUgOTk5Ljk5OTk5OSAtPiAwCitib29sMDU5OSBpc2luZmluaXRlIC05OTkuOTk5OTk5IC0+IDAKK2Jvb2wwNjAwIGlzaW5maW5pdGUgOTk5OS45OTk5OSAtPiAwCitib29sMDYwMSBpc2luZmluaXRlIC05OTk5Ljk5OTk5IC0+IDAKK2Jvb2wwNjAyIGlzaW5maW5pdGUgOTk5OTk5OS45OSAtPiAwCitib29sMDYwMyBpc2luZmluaXRlIC05OTk5OTk5Ljk5IC0+IDAKK2Jvb2wwNjA0IGlzaW5maW5pdGUgOS45OTk5OTk5OUUrMTAwIC0+IDAKK2Jvb2wwNjA1IGlzaW5maW5pdGUgLTkuOTk5OTk5OTlFKzEwMCAtPiAwCitib29sMDYwNiBpc2luZmluaXRlIDkuOTk5OTk5OTlFKzk5MCAtPiAwCitib29sMDYwNyBpc2luZmluaXRlIC05Ljk5OTk5OTk5RSs5OTAgLT4gMAorYm9vbDA2MDggaXNpbmZpbml0ZSA5Ljk5OTk5OTk5RSs5OTEgLT4gMAorYm9vbDA2MDkgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUrOTkxIC0+IDAKK2Jvb2wwNjEwIGlzaW5maW5pdGUgOS45OTk5OTk5OUUrOTkyIC0+IDAKK2Jvb2wwNjExIGlzaW5maW5pdGUgLTkuOTk5OTk5OTlFKzk5MiAtPiAwCitib29sMDYxMiBpc2luZmluaXRlIDkuOTk5OTk5OTlFKzk5OCAtPiAwCitib29sMDYxMyBpc2luZmluaXRlIC05Ljk5OTk5OTk5RSs5OTggLT4gMAorYm9vbDA2MTQgaXNpbmZpbml0ZSA5Ljk5OTk5OTk5RSs5OTkgLT4gMAorYm9vbDA2MTUgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUrOTk5IC0+IDAKK2Jvb2wwNjE2IGlzaW5maW5pdGUgOS45OTk5OTk5OUUrMTAwMCAtPiAwCitib29sMDYxNyBpc2luZmluaXRlIC05Ljk5OTk5OTk5RSsxMDAwIC0+IDAKK2Jvb2wwNjE4IGlzaW5maW5pdGUgOS45OTk5OTk5OUUrMjAwMCAtPiAwCitib29sMDYxOSBpc2luZmluaXRlIC05Ljk5OTk5OTk5RSsyMDAwIC0+IDAKK2Jvb2wwNjIwIGlzaW5maW5pdGUgSW5maW5pdHkgLT4gMQorYm9vbDA2MjEgaXNpbmZpbml0ZSAtSW5maW5pdHkgLT4gMQorYm9vbDA2MjIgaXNpbmZpbml0ZSBOYU4gLT4gMAorYm9vbDA2MjMgaXNpbmZpbml0ZSAtTmFOIC0+IDAKK2Jvb2wwNjI0IGlzaW5maW5pdGUgTmFOMTIzIC0+IDAKK2Jvb2wwNjI1IGlzaW5maW5pdGUgLU5hTjEyMyAtPiAwCitib29sMDYyNiBpc2luZmluaXRlIHNOYU4gLT4gMAorYm9vbDA2MjcgaXNpbmZpbml0ZSAtc05hTiAtPiAwCitib29sMDYyOCBpc2luZmluaXRlIHNOYU4xMjMgLT4gMAorYm9vbDA2MjkgaXNpbmZpbml0ZSAtc05hTjEyMyAtPiAwCitib29sMDYzMCBpc25hbiAwRS0yMDAwIC0+IDAKK2Jvb2wwNjMxIGlzbmFuIC0wRS0yMDAwIC0+IDAKK2Jvb2wwNjMyIGlzbmFuIDBFLTEwMDggLT4gMAorYm9vbDA2MzMgaXNuYW4gLTBFLTEwMDggLT4gMAorYm9vbDA2MzQgaXNuYW4gMEUtMTAwNyAtPiAwCitib29sMDYzNSBpc25hbiAtMEUtMTAwNyAtPiAwCitib29sMDYzNiBpc25hbiAwRS0xMDA2IC0+IDAKK2Jvb2wwNjM3IGlzbmFuIC0wRS0xMDA2IC0+IDAKK2Jvb2wwNjM4IGlzbmFuIDBFLTEwMDAgLT4gMAorYm9vbDA2MzkgaXNuYW4gLTBFLTEwMDAgLT4gMAorYm9vbDA2NDAgaXNuYW4gMEUtOTk5IC0+IDAKK2Jvb2wwNjQxIGlzbmFuIC0wRS05OTkgLT4gMAorYm9vbDA2NDIgaXNuYW4gMEUtOTk4IC0+IDAKK2Jvb2wwNjQzIGlzbmFuIC0wRS05OTggLT4gMAorYm9vbDA2NDQgaXNuYW4gMEUtMTAwIC0+IDAKK2Jvb2wwNjQ1IGlzbmFuIC0wRS0xMDAgLT4gMAorYm9vbDA2NDYgaXNuYW4gMC4wMDAwMDAgLT4gMAorYm9vbDA2NDcgaXNuYW4gLTAuMDAwMDAwIC0+IDAKK2Jvb2wwNjQ4IGlzbmFuIDAuMDAwIC0+IDAKK2Jvb2wwNjQ5IGlzbmFuIC0wLjAwMCAtPiAwCitib29sMDY1MCBpc25hbiAwLjAwIC0+IDAKK2Jvb2wwNjUxIGlzbmFuIC0wLjAwIC0+IDAKK2Jvb2wwNjUyIGlzbmFuIDAuMCAtPiAwCitib29sMDY1MyBpc25hbiAtMC4wIC0+IDAKK2Jvb2wwNjU0IGlzbmFuIDAgLT4gMAorYm9vbDA2NTUgaXNuYW4gLTAgLT4gMAorYm9vbDA2NTYgaXNuYW4gMEUrMSAtPiAwCitib29sMDY1NyBpc25hbiAtMEUrMSAtPiAwCitib29sMDY1OCBpc25hbiAwRSsyIC0+IDAKK2Jvb2wwNjU5IGlzbmFuIC0wRSsyIC0+IDAKK2Jvb2wwNjYwIGlzbmFuIDBFKzMgLT4gMAorYm9vbDA2NjEgaXNuYW4gLTBFKzMgLT4gMAorYm9vbDA2NjIgaXNuYW4gMEUrNiAtPiAwCitib29sMDY2MyBpc25hbiAtMEUrNiAtPiAwCitib29sMDY2NCBpc25hbiAwRSsxMDAgLT4gMAorYm9vbDA2NjUgaXNuYW4gLTBFKzEwMCAtPiAwCitib29sMDY2NiBpc25hbiAwRSs5OTAgLT4gMAorYm9vbDA2NjcgaXNuYW4gLTBFKzk5MCAtPiAwCitib29sMDY2OCBpc25hbiAwRSs5OTEgLT4gMAorYm9vbDA2NjkgaXNuYW4gLTBFKzk5MSAtPiAwCitib29sMDY3MCBpc25hbiAwRSs5OTIgLT4gMAorYm9vbDA2NzEgaXNuYW4gLTBFKzk5MiAtPiAwCitib29sMDY3MiBpc25hbiAwRSs5OTggLT4gMAorYm9vbDA2NzMgaXNuYW4gLTBFKzk5OCAtPiAwCitib29sMDY3NCBpc25hbiAwRSs5OTkgLT4gMAorYm9vbDA2NzUgaXNuYW4gLTBFKzk5OSAtPiAwCitib29sMDY3NiBpc25hbiAwRSsxMDAwIC0+IDAKK2Jvb2wwNjc3IGlzbmFuIC0wRSsxMDAwIC0+IDAKK2Jvb2wwNjc4IGlzbmFuIDBFKzIwMDAgLT4gMAorYm9vbDA2NzkgaXNuYW4gLTBFKzIwMDAgLT4gMAorYm9vbDA2ODAgaXNuYW4gMUUtMjAwMCAtPiAwCitib29sMDY4MSBpc25hbiAtMUUtMjAwMCAtPiAwCitib29sMDY4MiBpc25hbiAxRS0xMDA4IC0+IDAKK2Jvb2wwNjgzIGlzbmFuIC0xRS0xMDA4IC0+IDAKK2Jvb2wwNjg0IGlzbmFuIDFFLTEwMDcgLT4gMAorYm9vbDA2ODUgaXNuYW4gLTFFLTEwMDcgLT4gMAorYm9vbDA2ODYgaXNuYW4gMUUtMTAwNiAtPiAwCitib29sMDY4NyBpc25hbiAtMUUtMTAwNiAtPiAwCitib29sMDY4OCBpc25hbiAxRS0xMDAwIC0+IDAKK2Jvb2wwNjg5IGlzbmFuIC0xRS0xMDAwIC0+IDAKK2Jvb2wwNjkwIGlzbmFuIDFFLTk5OSAtPiAwCitib29sMDY5MSBpc25hbiAtMUUtOTk5IC0+IDAKK2Jvb2wwNjkyIGlzbmFuIDFFLTk5OCAtPiAwCitib29sMDY5MyBpc25hbiAtMUUtOTk4IC0+IDAKK2Jvb2wwNjk0IGlzbmFuIDFFLTEwMCAtPiAwCitib29sMDY5NSBpc25hbiAtMUUtMTAwIC0+IDAKK2Jvb2wwNjk2IGlzbmFuIDAuMDAwMDAxIC0+IDAKK2Jvb2wwNjk3IGlzbmFuIC0wLjAwMDAwMSAtPiAwCitib29sMDY5OCBpc25hbiAwLjAwMSAtPiAwCitib29sMDY5OSBpc25hbiAtMC4wMDEgLT4gMAorYm9vbDA3MDAgaXNuYW4gMC4wMSAtPiAwCitib29sMDcwMSBpc25hbiAtMC4wMSAtPiAwCitib29sMDcwMiBpc25hbiAwLjEgLT4gMAorYm9vbDA3MDMgaXNuYW4gLTAuMSAtPiAwCitib29sMDcwNCBpc25hbiAxIC0+IDAKK2Jvb2wwNzA1IGlzbmFuIC0xIC0+IDAKK2Jvb2wwNzA2IGlzbmFuIDFFKzEgLT4gMAorYm9vbDA3MDcgaXNuYW4gLTFFKzEgLT4gMAorYm9vbDA3MDggaXNuYW4gMUUrMiAtPiAwCitib29sMDcwOSBpc25hbiAtMUUrMiAtPiAwCitib29sMDcxMCBpc25hbiAxRSszIC0+IDAKK2Jvb2wwNzExIGlzbmFuIC0xRSszIC0+IDAKK2Jvb2wwNzEyIGlzbmFuIDFFKzYgLT4gMAorYm9vbDA3MTMgaXNuYW4gLTFFKzYgLT4gMAorYm9vbDA3MTQgaXNuYW4gMUUrMTAwIC0+IDAKK2Jvb2wwNzE1IGlzbmFuIC0xRSsxMDAgLT4gMAorYm9vbDA3MTYgaXNuYW4gMUUrOTkwIC0+IDAKK2Jvb2wwNzE3IGlzbmFuIC0xRSs5OTAgLT4gMAorYm9vbDA3MTggaXNuYW4gMUUrOTkxIC0+IDAKK2Jvb2wwNzE5IGlzbmFuIC0xRSs5OTEgLT4gMAorYm9vbDA3MjAgaXNuYW4gMUUrOTkyIC0+IDAKK2Jvb2wwNzIxIGlzbmFuIC0xRSs5OTIgLT4gMAorYm9vbDA3MjIgaXNuYW4gMUUrOTk4IC0+IDAKK2Jvb2wwNzIzIGlzbmFuIC0xRSs5OTggLT4gMAorYm9vbDA3MjQgaXNuYW4gMUUrOTk5IC0+IDAKK2Jvb2wwNzI1IGlzbmFuIC0xRSs5OTkgLT4gMAorYm9vbDA3MjYgaXNuYW4gMUUrMTAwMCAtPiAwCitib29sMDcyNyBpc25hbiAtMUUrMTAwMCAtPiAwCitib29sMDcyOCBpc25hbiAxRSsyMDAwIC0+IDAKK2Jvb2wwNzI5IGlzbmFuIC0xRSsyMDAwIC0+IDAKK2Jvb2wwNzMwIGlzbmFuIDlFLTIwMDAgLT4gMAorYm9vbDA3MzEgaXNuYW4gLTlFLTIwMDAgLT4gMAorYm9vbDA3MzIgaXNuYW4gOUUtMTAwOCAtPiAwCitib29sMDczMyBpc25hbiAtOUUtMTAwOCAtPiAwCitib29sMDczNCBpc25hbiA5RS0xMDA3IC0+IDAKK2Jvb2wwNzM1IGlzbmFuIC05RS0xMDA3IC0+IDAKK2Jvb2wwNzM2IGlzbmFuIDlFLTEwMDYgLT4gMAorYm9vbDA3MzcgaXNuYW4gLTlFLTEwMDYgLT4gMAorYm9vbDA3MzggaXNuYW4gOUUtMTAwMCAtPiAwCitib29sMDczOSBpc25hbiAtOUUtMTAwMCAtPiAwCitib29sMDc0MCBpc25hbiA5RS05OTkgLT4gMAorYm9vbDA3NDEgaXNuYW4gLTlFLTk5OSAtPiAwCitib29sMDc0MiBpc25hbiA5RS05OTggLT4gMAorYm9vbDA3NDMgaXNuYW4gLTlFLTk5OCAtPiAwCitib29sMDc0NCBpc25hbiA5RS0xMDAgLT4gMAorYm9vbDA3NDUgaXNuYW4gLTlFLTEwMCAtPiAwCitib29sMDc0NiBpc25hbiAwLjAwMDAwOSAtPiAwCitib29sMDc0NyBpc25hbiAtMC4wMDAwMDkgLT4gMAorYm9vbDA3NDggaXNuYW4gMC4wMDkgLT4gMAorYm9vbDA3NDkgaXNuYW4gLTAuMDA5IC0+IDAKK2Jvb2wwNzUwIGlzbmFuIDAuMDkgLT4gMAorYm9vbDA3NTEgaXNuYW4gLTAuMDkgLT4gMAorYm9vbDA3NTIgaXNuYW4gMC45IC0+IDAKK2Jvb2wwNzUzIGlzbmFuIC0wLjkgLT4gMAorYm9vbDA3NTQgaXNuYW4gOSAtPiAwCitib29sMDc1NSBpc25hbiAtOSAtPiAwCitib29sMDc1NiBpc25hbiA5RSsxIC0+IDAKK2Jvb2wwNzU3IGlzbmFuIC05RSsxIC0+IDAKK2Jvb2wwNzU4IGlzbmFuIDlFKzIgLT4gMAorYm9vbDA3NTkgaXNuYW4gLTlFKzIgLT4gMAorYm9vbDA3NjAgaXNuYW4gOUUrMyAtPiAwCitib29sMDc2MSBpc25hbiAtOUUrMyAtPiAwCitib29sMDc2MiBpc25hbiA5RSs2IC0+IDAKK2Jvb2wwNzYzIGlzbmFuIC05RSs2IC0+IDAKK2Jvb2wwNzY0IGlzbmFuIDlFKzEwMCAtPiAwCitib29sMDc2NSBpc25hbiAtOUUrMTAwIC0+IDAKK2Jvb2wwNzY2IGlzbmFuIDlFKzk5MCAtPiAwCitib29sMDc2NyBpc25hbiAtOUUrOTkwIC0+IDAKK2Jvb2wwNzY4IGlzbmFuIDlFKzk5MSAtPiAwCitib29sMDc2OSBpc25hbiAtOUUrOTkxIC0+IDAKK2Jvb2wwNzcwIGlzbmFuIDlFKzk5MiAtPiAwCitib29sMDc3MSBpc25hbiAtOUUrOTkyIC0+IDAKK2Jvb2wwNzcyIGlzbmFuIDlFKzk5OCAtPiAwCitib29sMDc3MyBpc25hbiAtOUUrOTk4IC0+IDAKK2Jvb2wwNzc0IGlzbmFuIDlFKzk5OSAtPiAwCitib29sMDc3NSBpc25hbiAtOUUrOTk5IC0+IDAKK2Jvb2wwNzc2IGlzbmFuIDlFKzEwMDAgLT4gMAorYm9vbDA3NzcgaXNuYW4gLTlFKzEwMDAgLT4gMAorYm9vbDA3NzggaXNuYW4gOUUrMjAwMCAtPiAwCitib29sMDc3OSBpc25hbiAtOUUrMjAwMCAtPiAwCitib29sMDc4MCBpc25hbiA5Ljk5OTk5OTk5RS0yMDAwIC0+IDAKK2Jvb2wwNzgxIGlzbmFuIC05Ljk5OTk5OTk5RS0yMDAwIC0+IDAKK2Jvb2wwNzgyIGlzbmFuIDkuOTk5OTk5OTlFLTEwMDggLT4gMAorYm9vbDA3ODMgaXNuYW4gLTkuOTk5OTk5OTlFLTEwMDggLT4gMAorYm9vbDA3ODQgaXNuYW4gOS45OTk5OTk5OUUtMTAwNyAtPiAwCitib29sMDc4NSBpc25hbiAtOS45OTk5OTk5OUUtMTAwNyAtPiAwCitib29sMDc4NiBpc25hbiA5Ljk5OTk5OTk5RS0xMDA2IC0+IDAKK2Jvb2wwNzg3IGlzbmFuIC05Ljk5OTk5OTk5RS0xMDA2IC0+IDAKK2Jvb2wwNzg4IGlzbmFuIDkuOTk5OTk5OTlFLTEwMDAgLT4gMAorYm9vbDA3ODkgaXNuYW4gLTkuOTk5OTk5OTlFLTEwMDAgLT4gMAorYm9vbDA3OTAgaXNuYW4gOS45OTk5OTk5OUUtOTk5IC0+IDAKK2Jvb2wwNzkxIGlzbmFuIC05Ljk5OTk5OTk5RS05OTkgLT4gMAorYm9vbDA3OTIgaXNuYW4gOS45OTk5OTk5OUUtOTk4IC0+IDAKK2Jvb2wwNzkzIGlzbmFuIC05Ljk5OTk5OTk5RS05OTggLT4gMAorYm9vbDA3OTQgaXNuYW4gOS45OTk5OTk5OUUtMTAwIC0+IDAKK2Jvb2wwNzk1IGlzbmFuIC05Ljk5OTk5OTk5RS0xMDAgLT4gMAorYm9vbDA3OTYgaXNuYW4gMC4wMDAwMDk5OTk5OTk5OSAtPiAwCitib29sMDc5NyBpc25hbiAtMC4wMDAwMDk5OTk5OTk5OSAtPiAwCitib29sMDc5OCBpc25hbiAwLjAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wwNzk5IGlzbmFuIC0wLjAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wwODAwIGlzbmFuIDAuMDk5OTk5OTk5OSAtPiAwCitib29sMDgwMSBpc25hbiAtMC4wOTk5OTk5OTk5IC0+IDAKK2Jvb2wwODAyIGlzbmFuIDAuOTk5OTk5OTk5IC0+IDAKK2Jvb2wwODAzIGlzbmFuIC0wLjk5OTk5OTk5OSAtPiAwCitib29sMDgwNCBpc25hbiA5Ljk5OTk5OTk5IC0+IDAKK2Jvb2wwODA1IGlzbmFuIC05Ljk5OTk5OTk5IC0+IDAKK2Jvb2wwODA2IGlzbmFuIDk5Ljk5OTk5OTkgLT4gMAorYm9vbDA4MDcgaXNuYW4gLTk5Ljk5OTk5OTkgLT4gMAorYm9vbDA4MDggaXNuYW4gOTk5Ljk5OTk5OSAtPiAwCitib29sMDgwOSBpc25hbiAtOTk5Ljk5OTk5OSAtPiAwCitib29sMDgxMCBpc25hbiA5OTk5Ljk5OTk5IC0+IDAKK2Jvb2wwODExIGlzbmFuIC05OTk5Ljk5OTk5IC0+IDAKK2Jvb2wwODEyIGlzbmFuIDk5OTk5OTkuOTkgLT4gMAorYm9vbDA4MTMgaXNuYW4gLTk5OTk5OTkuOTkgLT4gMAorYm9vbDA4MTQgaXNuYW4gOS45OTk5OTk5OUUrMTAwIC0+IDAKK2Jvb2wwODE1IGlzbmFuIC05Ljk5OTk5OTk5RSsxMDAgLT4gMAorYm9vbDA4MTYgaXNuYW4gOS45OTk5OTk5OUUrOTkwIC0+IDAKK2Jvb2wwODE3IGlzbmFuIC05Ljk5OTk5OTk5RSs5OTAgLT4gMAorYm9vbDA4MTggaXNuYW4gOS45OTk5OTk5OUUrOTkxIC0+IDAKK2Jvb2wwODE5IGlzbmFuIC05Ljk5OTk5OTk5RSs5OTEgLT4gMAorYm9vbDA4MjAgaXNuYW4gOS45OTk5OTk5OUUrOTkyIC0+IDAKK2Jvb2wwODIxIGlzbmFuIC05Ljk5OTk5OTk5RSs5OTIgLT4gMAorYm9vbDA4MjIgaXNuYW4gOS45OTk5OTk5OUUrOTk4IC0+IDAKK2Jvb2wwODIzIGlzbmFuIC05Ljk5OTk5OTk5RSs5OTggLT4gMAorYm9vbDA4MjQgaXNuYW4gOS45OTk5OTk5OUUrOTk5IC0+IDAKK2Jvb2wwODI1IGlzbmFuIC05Ljk5OTk5OTk5RSs5OTkgLT4gMAorYm9vbDA4MjYgaXNuYW4gOS45OTk5OTk5OUUrMTAwMCAtPiAwCitib29sMDgyNyBpc25hbiAtOS45OTk5OTk5OUUrMTAwMCAtPiAwCitib29sMDgyOCBpc25hbiA5Ljk5OTk5OTk5RSsyMDAwIC0+IDAKK2Jvb2wwODI5IGlzbmFuIC05Ljk5OTk5OTk5RSsyMDAwIC0+IDAKK2Jvb2wwODMwIGlzbmFuIEluZmluaXR5IC0+IDAKK2Jvb2wwODMxIGlzbmFuIC1JbmZpbml0eSAtPiAwCitib29sMDgzMiBpc25hbiBOYU4gLT4gMQorYm9vbDA4MzMgaXNuYW4gLU5hTiAtPiAxCitib29sMDgzNCBpc25hbiBOYU4xMjMgLT4gMQorYm9vbDA4MzUgaXNuYW4gLU5hTjEyMyAtPiAxCitib29sMDgzNiBpc25hbiBzTmFOIC0+IDEKK2Jvb2wwODM3IGlzbmFuIC1zTmFOIC0+IDEKK2Jvb2wwODM4IGlzbmFuIHNOYU4xMjMgLT4gMQorYm9vbDA4MzkgaXNuYW4gLXNOYU4xMjMgLT4gMQorYm9vbDA4NDAgaXNub3JtYWwgMEUtMjAwMCAtPiAwCitib29sMDg0MSBpc25vcm1hbCAtMEUtMjAwMCAtPiAwCitib29sMDg0MiBpc25vcm1hbCAwRS0xMDA4IC0+IDAKK2Jvb2wwODQzIGlzbm9ybWFsIC0wRS0xMDA4IC0+IDAKK2Jvb2wwODQ0IGlzbm9ybWFsIDBFLTEwMDcgLT4gMAorYm9vbDA4NDUgaXNub3JtYWwgLTBFLTEwMDcgLT4gMAorYm9vbDA4NDYgaXNub3JtYWwgMEUtMTAwNiAtPiAwCitib29sMDg0NyBpc25vcm1hbCAtMEUtMTAwNiAtPiAwCitib29sMDg0OCBpc25vcm1hbCAwRS0xMDAwIC0+IDAKK2Jvb2wwODQ5IGlzbm9ybWFsIC0wRS0xMDAwIC0+IDAKK2Jvb2wwODUwIGlzbm9ybWFsIDBFLTk5OSAtPiAwCitib29sMDg1MSBpc25vcm1hbCAtMEUtOTk5IC0+IDAKK2Jvb2wwODUyIGlzbm9ybWFsIDBFLTk5OCAtPiAwCitib29sMDg1MyBpc25vcm1hbCAtMEUtOTk4IC0+IDAKK2Jvb2wwODU0IGlzbm9ybWFsIDBFLTEwMCAtPiAwCitib29sMDg1NSBpc25vcm1hbCAtMEUtMTAwIC0+IDAKK2Jvb2wwODU2IGlzbm9ybWFsIDAuMDAwMDAwIC0+IDAKK2Jvb2wwODU3IGlzbm9ybWFsIC0wLjAwMDAwMCAtPiAwCitib29sMDg1OCBpc25vcm1hbCAwLjAwMCAtPiAwCitib29sMDg1OSBpc25vcm1hbCAtMC4wMDAgLT4gMAorYm9vbDA4NjAgaXNub3JtYWwgMC4wMCAtPiAwCitib29sMDg2MSBpc25vcm1hbCAtMC4wMCAtPiAwCitib29sMDg2MiBpc25vcm1hbCAwLjAgLT4gMAorYm9vbDA4NjMgaXNub3JtYWwgLTAuMCAtPiAwCitib29sMDg2NCBpc25vcm1hbCAwIC0+IDAKK2Jvb2wwODY1IGlzbm9ybWFsIC0wIC0+IDAKK2Jvb2wwODY2IGlzbm9ybWFsIDBFKzEgLT4gMAorYm9vbDA4NjcgaXNub3JtYWwgLTBFKzEgLT4gMAorYm9vbDA4NjggaXNub3JtYWwgMEUrMiAtPiAwCitib29sMDg2OSBpc25vcm1hbCAtMEUrMiAtPiAwCitib29sMDg3MCBpc25vcm1hbCAwRSszIC0+IDAKK2Jvb2wwODcxIGlzbm9ybWFsIC0wRSszIC0+IDAKK2Jvb2wwODcyIGlzbm9ybWFsIDBFKzYgLT4gMAorYm9vbDA4NzMgaXNub3JtYWwgLTBFKzYgLT4gMAorYm9vbDA4NzQgaXNub3JtYWwgMEUrMTAwIC0+IDAKK2Jvb2wwODc1IGlzbm9ybWFsIC0wRSsxMDAgLT4gMAorYm9vbDA4NzYgaXNub3JtYWwgMEUrOTkwIC0+IDAKK2Jvb2wwODc3IGlzbm9ybWFsIC0wRSs5OTAgLT4gMAorYm9vbDA4NzggaXNub3JtYWwgMEUrOTkxIC0+IDAKK2Jvb2wwODc5IGlzbm9ybWFsIC0wRSs5OTEgLT4gMAorYm9vbDA4ODAgaXNub3JtYWwgMEUrOTkyIC0+IDAKK2Jvb2wwODgxIGlzbm9ybWFsIC0wRSs5OTIgLT4gMAorYm9vbDA4ODIgaXNub3JtYWwgMEUrOTk4IC0+IDAKK2Jvb2wwODgzIGlzbm9ybWFsIC0wRSs5OTggLT4gMAorYm9vbDA4ODQgaXNub3JtYWwgMEUrOTk5IC0+IDAKK2Jvb2wwODg1IGlzbm9ybWFsIC0wRSs5OTkgLT4gMAorYm9vbDA4ODYgaXNub3JtYWwgMEUrMTAwMCAtPiAwCitib29sMDg4NyBpc25vcm1hbCAtMEUrMTAwMCAtPiAwCitib29sMDg4OCBpc25vcm1hbCAwRSsyMDAwIC0+IDAKK2Jvb2wwODg5IGlzbm9ybWFsIC0wRSsyMDAwIC0+IDAKK2Jvb2wwODkwIGlzbm9ybWFsIDFFLTIwMDAgLT4gMAorYm9vbDA4OTEgaXNub3JtYWwgLTFFLTIwMDAgLT4gMAorYm9vbDA4OTIgaXNub3JtYWwgMUUtMTAwOCAtPiAwCitib29sMDg5MyBpc25vcm1hbCAtMUUtMTAwOCAtPiAwCitib29sMDg5NCBpc25vcm1hbCAxRS0xMDA3IC0+IDAKK2Jvb2wwODk1IGlzbm9ybWFsIC0xRS0xMDA3IC0+IDAKK2Jvb2wwODk2IGlzbm9ybWFsIDFFLTEwMDYgLT4gMAorYm9vbDA4OTcgaXNub3JtYWwgLTFFLTEwMDYgLT4gMAorYm9vbDA4OTggaXNub3JtYWwgMUUtMTAwMCAtPiAwCitib29sMDg5OSBpc25vcm1hbCAtMUUtMTAwMCAtPiAwCitib29sMDkwMCBpc25vcm1hbCAxRS05OTkgLT4gMQorYm9vbDA5MDEgaXNub3JtYWwgLTFFLTk5OSAtPiAxCitib29sMDkwMiBpc25vcm1hbCAxRS05OTggLT4gMQorYm9vbDA5MDMgaXNub3JtYWwgLTFFLTk5OCAtPiAxCitib29sMDkwNCBpc25vcm1hbCAxRS0xMDAgLT4gMQorYm9vbDA5MDUgaXNub3JtYWwgLTFFLTEwMCAtPiAxCitib29sMDkwNiBpc25vcm1hbCAwLjAwMDAwMSAtPiAxCitib29sMDkwNyBpc25vcm1hbCAtMC4wMDAwMDEgLT4gMQorYm9vbDA5MDggaXNub3JtYWwgMC4wMDEgLT4gMQorYm9vbDA5MDkgaXNub3JtYWwgLTAuMDAxIC0+IDEKK2Jvb2wwOTEwIGlzbm9ybWFsIDAuMDEgLT4gMQorYm9vbDA5MTEgaXNub3JtYWwgLTAuMDEgLT4gMQorYm9vbDA5MTIgaXNub3JtYWwgMC4xIC0+IDEKK2Jvb2wwOTEzIGlzbm9ybWFsIC0wLjEgLT4gMQorYm9vbDA5MTQgaXNub3JtYWwgMSAtPiAxCitib29sMDkxNSBpc25vcm1hbCAtMSAtPiAxCitib29sMDkxNiBpc25vcm1hbCAxRSsxIC0+IDEKK2Jvb2wwOTE3IGlzbm9ybWFsIC0xRSsxIC0+IDEKK2Jvb2wwOTE4IGlzbm9ybWFsIDFFKzIgLT4gMQorYm9vbDA5MTkgaXNub3JtYWwgLTFFKzIgLT4gMQorYm9vbDA5MjAgaXNub3JtYWwgMUUrMyAtPiAxCitib29sMDkyMSBpc25vcm1hbCAtMUUrMyAtPiAxCitib29sMDkyMiBpc25vcm1hbCAxRSs2IC0+IDEKK2Jvb2wwOTIzIGlzbm9ybWFsIC0xRSs2IC0+IDEKK2Jvb2wwOTI0IGlzbm9ybWFsIDFFKzEwMCAtPiAxCitib29sMDkyNSBpc25vcm1hbCAtMUUrMTAwIC0+IDEKK2Jvb2wwOTI2IGlzbm9ybWFsIDFFKzk5MCAtPiAxCitib29sMDkyNyBpc25vcm1hbCAtMUUrOTkwIC0+IDEKK2Jvb2wwOTI4IGlzbm9ybWFsIDFFKzk5MSAtPiAxCitib29sMDkyOSBpc25vcm1hbCAtMUUrOTkxIC0+IDEKK2Jvb2wwOTMwIGlzbm9ybWFsIDFFKzk5MiAtPiAxCitib29sMDkzMSBpc25vcm1hbCAtMUUrOTkyIC0+IDEKK2Jvb2wwOTMyIGlzbm9ybWFsIDFFKzk5OCAtPiAxCitib29sMDkzMyBpc25vcm1hbCAtMUUrOTk4IC0+IDEKK2Jvb2wwOTM0IGlzbm9ybWFsIDFFKzk5OSAtPiAxCitib29sMDkzNSBpc25vcm1hbCAtMUUrOTk5IC0+IDEKK2Jvb2wwOTM2IGlzbm9ybWFsIDFFKzEwMDAgLT4gMQorYm9vbDA5MzcgaXNub3JtYWwgLTFFKzEwMDAgLT4gMQorYm9vbDA5MzggaXNub3JtYWwgMUUrMjAwMCAtPiAxCitib29sMDkzOSBpc25vcm1hbCAtMUUrMjAwMCAtPiAxCitib29sMDk0MCBpc25vcm1hbCA5RS0yMDAwIC0+IDAKK2Jvb2wwOTQxIGlzbm9ybWFsIC05RS0yMDAwIC0+IDAKK2Jvb2wwOTQyIGlzbm9ybWFsIDlFLTEwMDggLT4gMAorYm9vbDA5NDMgaXNub3JtYWwgLTlFLTEwMDggLT4gMAorYm9vbDA5NDQgaXNub3JtYWwgOUUtMTAwNyAtPiAwCitib29sMDk0NSBpc25vcm1hbCAtOUUtMTAwNyAtPiAwCitib29sMDk0NiBpc25vcm1hbCA5RS0xMDA2IC0+IDAKK2Jvb2wwOTQ3IGlzbm9ybWFsIC05RS0xMDA2IC0+IDAKK2Jvb2wwOTQ4IGlzbm9ybWFsIDlFLTEwMDAgLT4gMAorYm9vbDA5NDkgaXNub3JtYWwgLTlFLTEwMDAgLT4gMAorYm9vbDA5NTAgaXNub3JtYWwgOUUtOTk5IC0+IDEKK2Jvb2wwOTUxIGlzbm9ybWFsIC05RS05OTkgLT4gMQorYm9vbDA5NTIgaXNub3JtYWwgOUUtOTk4IC0+IDEKK2Jvb2wwOTUzIGlzbm9ybWFsIC05RS05OTggLT4gMQorYm9vbDA5NTQgaXNub3JtYWwgOUUtMTAwIC0+IDEKK2Jvb2wwOTU1IGlzbm9ybWFsIC05RS0xMDAgLT4gMQorYm9vbDA5NTYgaXNub3JtYWwgMC4wMDAwMDkgLT4gMQorYm9vbDA5NTcgaXNub3JtYWwgLTAuMDAwMDA5IC0+IDEKK2Jvb2wwOTU4IGlzbm9ybWFsIDAuMDA5IC0+IDEKK2Jvb2wwOTU5IGlzbm9ybWFsIC0wLjAwOSAtPiAxCitib29sMDk2MCBpc25vcm1hbCAwLjA5IC0+IDEKK2Jvb2wwOTYxIGlzbm9ybWFsIC0wLjA5IC0+IDEKK2Jvb2wwOTYyIGlzbm9ybWFsIDAuOSAtPiAxCitib29sMDk2MyBpc25vcm1hbCAtMC45IC0+IDEKK2Jvb2wwOTY0IGlzbm9ybWFsIDkgLT4gMQorYm9vbDA5NjUgaXNub3JtYWwgLTkgLT4gMQorYm9vbDA5NjYgaXNub3JtYWwgOUUrMSAtPiAxCitib29sMDk2NyBpc25vcm1hbCAtOUUrMSAtPiAxCitib29sMDk2OCBpc25vcm1hbCA5RSsyIC0+IDEKK2Jvb2wwOTY5IGlzbm9ybWFsIC05RSsyIC0+IDEKK2Jvb2wwOTcwIGlzbm9ybWFsIDlFKzMgLT4gMQorYm9vbDA5NzEgaXNub3JtYWwgLTlFKzMgLT4gMQorYm9vbDA5NzIgaXNub3JtYWwgOUUrNiAtPiAxCitib29sMDk3MyBpc25vcm1hbCAtOUUrNiAtPiAxCitib29sMDk3NCBpc25vcm1hbCA5RSsxMDAgLT4gMQorYm9vbDA5NzUgaXNub3JtYWwgLTlFKzEwMCAtPiAxCitib29sMDk3NiBpc25vcm1hbCA5RSs5OTAgLT4gMQorYm9vbDA5NzcgaXNub3JtYWwgLTlFKzk5MCAtPiAxCitib29sMDk3OCBpc25vcm1hbCA5RSs5OTEgLT4gMQorYm9vbDA5NzkgaXNub3JtYWwgLTlFKzk5MSAtPiAxCitib29sMDk4MCBpc25vcm1hbCA5RSs5OTIgLT4gMQorYm9vbDA5ODEgaXNub3JtYWwgLTlFKzk5MiAtPiAxCitib29sMDk4MiBpc25vcm1hbCA5RSs5OTggLT4gMQorYm9vbDA5ODMgaXNub3JtYWwgLTlFKzk5OCAtPiAxCitib29sMDk4NCBpc25vcm1hbCA5RSs5OTkgLT4gMQorYm9vbDA5ODUgaXNub3JtYWwgLTlFKzk5OSAtPiAxCitib29sMDk4NiBpc25vcm1hbCA5RSsxMDAwIC0+IDEKK2Jvb2wwOTg3IGlzbm9ybWFsIC05RSsxMDAwIC0+IDEKK2Jvb2wwOTg4IGlzbm9ybWFsIDlFKzIwMDAgLT4gMQorYm9vbDA5ODkgaXNub3JtYWwgLTlFKzIwMDAgLT4gMQorYm9vbDA5OTAgaXNub3JtYWwgOS45OTk5OTk5OUUtMjAwMCAtPiAwCitib29sMDk5MSBpc25vcm1hbCAtOS45OTk5OTk5OUUtMjAwMCAtPiAwCitib29sMDk5MiBpc25vcm1hbCA5Ljk5OTk5OTk5RS0xMDA4IC0+IDAKK2Jvb2wwOTkzIGlzbm9ybWFsIC05Ljk5OTk5OTk5RS0xMDA4IC0+IDAKK2Jvb2wwOTk0IGlzbm9ybWFsIDkuOTk5OTk5OTlFLTEwMDcgLT4gMAorYm9vbDA5OTUgaXNub3JtYWwgLTkuOTk5OTk5OTlFLTEwMDcgLT4gMAorYm9vbDA5OTYgaXNub3JtYWwgOS45OTk5OTk5OUUtMTAwNiAtPiAwCitib29sMDk5NyBpc25vcm1hbCAtOS45OTk5OTk5OUUtMTAwNiAtPiAwCitib29sMDk5OCBpc25vcm1hbCA5Ljk5OTk5OTk5RS0xMDAwIC0+IDAKK2Jvb2wwOTk5IGlzbm9ybWFsIC05Ljk5OTk5OTk5RS0xMDAwIC0+IDAKK2Jvb2wxMDAwIGlzbm9ybWFsIDkuOTk5OTk5OTlFLTk5OSAtPiAxCitib29sMTAwMSBpc25vcm1hbCAtOS45OTk5OTk5OUUtOTk5IC0+IDEKK2Jvb2wxMDAyIGlzbm9ybWFsIDkuOTk5OTk5OTlFLTk5OCAtPiAxCitib29sMTAwMyBpc25vcm1hbCAtOS45OTk5OTk5OUUtOTk4IC0+IDEKK2Jvb2wxMDA0IGlzbm9ybWFsIDkuOTk5OTk5OTlFLTEwMCAtPiAxCitib29sMTAwNSBpc25vcm1hbCAtOS45OTk5OTk5OUUtMTAwIC0+IDEKK2Jvb2wxMDA2IGlzbm9ybWFsIDAuMDAwMDA5OTk5OTk5OTkgLT4gMQorYm9vbDEwMDcgaXNub3JtYWwgLTAuMDAwMDA5OTk5OTk5OTkgLT4gMQorYm9vbDEwMDggaXNub3JtYWwgMC4wMDk5OTk5OTk5OSAtPiAxCitib29sMTAwOSBpc25vcm1hbCAtMC4wMDk5OTk5OTk5OSAtPiAxCitib29sMTAxMCBpc25vcm1hbCAwLjA5OTk5OTk5OTkgLT4gMQorYm9vbDEwMTEgaXNub3JtYWwgLTAuMDk5OTk5OTk5OSAtPiAxCitib29sMTAxMiBpc25vcm1hbCAwLjk5OTk5OTk5OSAtPiAxCitib29sMTAxMyBpc25vcm1hbCAtMC45OTk5OTk5OTkgLT4gMQorYm9vbDEwMTQgaXNub3JtYWwgOS45OTk5OTk5OSAtPiAxCitib29sMTAxNSBpc25vcm1hbCAtOS45OTk5OTk5OSAtPiAxCitib29sMTAxNiBpc25vcm1hbCA5OS45OTk5OTk5IC0+IDEKK2Jvb2wxMDE3IGlzbm9ybWFsIC05OS45OTk5OTk5IC0+IDEKK2Jvb2wxMDE4IGlzbm9ybWFsIDk5OS45OTk5OTkgLT4gMQorYm9vbDEwMTkgaXNub3JtYWwgLTk5OS45OTk5OTkgLT4gMQorYm9vbDEwMjAgaXNub3JtYWwgOTk5OS45OTk5OSAtPiAxCitib29sMTAyMSBpc25vcm1hbCAtOTk5OS45OTk5OSAtPiAxCitib29sMTAyMiBpc25vcm1hbCA5OTk5OTk5Ljk5IC0+IDEKK2Jvb2wxMDIzIGlzbm9ybWFsIC05OTk5OTk5Ljk5IC0+IDEKK2Jvb2wxMDI0IGlzbm9ybWFsIDkuOTk5OTk5OTlFKzEwMCAtPiAxCitib29sMTAyNSBpc25vcm1hbCAtOS45OTk5OTk5OUUrMTAwIC0+IDEKK2Jvb2wxMDI2IGlzbm9ybWFsIDkuOTk5OTk5OTlFKzk5MCAtPiAxCitib29sMTAyNyBpc25vcm1hbCAtOS45OTk5OTk5OUUrOTkwIC0+IDEKK2Jvb2wxMDI4IGlzbm9ybWFsIDkuOTk5OTk5OTlFKzk5MSAtPiAxCitib29sMTAyOSBpc25vcm1hbCAtOS45OTk5OTk5OUUrOTkxIC0+IDEKK2Jvb2wxMDMwIGlzbm9ybWFsIDkuOTk5OTk5OTlFKzk5MiAtPiAxCitib29sMTAzMSBpc25vcm1hbCAtOS45OTk5OTk5OUUrOTkyIC0+IDEKK2Jvb2wxMDMyIGlzbm9ybWFsIDkuOTk5OTk5OTlFKzk5OCAtPiAxCitib29sMTAzMyBpc25vcm1hbCAtOS45OTk5OTk5OUUrOTk4IC0+IDEKK2Jvb2wxMDM0IGlzbm9ybWFsIDkuOTk5OTk5OTlFKzk5OSAtPiAxCitib29sMTAzNSBpc25vcm1hbCAtOS45OTk5OTk5OUUrOTk5IC0+IDEKK2Jvb2wxMDM2IGlzbm9ybWFsIDkuOTk5OTk5OTlFKzEwMDAgLT4gMQorYm9vbDEwMzcgaXNub3JtYWwgLTkuOTk5OTk5OTlFKzEwMDAgLT4gMQorYm9vbDEwMzggaXNub3JtYWwgOS45OTk5OTk5OUUrMjAwMCAtPiAxCitib29sMTAzOSBpc25vcm1hbCAtOS45OTk5OTk5OUUrMjAwMCAtPiAxCitib29sMTA0MCBpc25vcm1hbCBJbmZpbml0eSAtPiAwCitib29sMTA0MSBpc25vcm1hbCAtSW5maW5pdHkgLT4gMAorYm9vbDEwNDIgaXNub3JtYWwgTmFOIC0+IDAKK2Jvb2wxMDQzIGlzbm9ybWFsIC1OYU4gLT4gMAorYm9vbDEwNDQgaXNub3JtYWwgTmFOMTIzIC0+IDAKK2Jvb2wxMDQ1IGlzbm9ybWFsIC1OYU4xMjMgLT4gMAorYm9vbDEwNDYgaXNub3JtYWwgc05hTiAtPiAwCitib29sMTA0NyBpc25vcm1hbCAtc05hTiAtPiAwCitib29sMTA0OCBpc25vcm1hbCBzTmFOMTIzIC0+IDAKK2Jvb2wxMDQ5IGlzbm9ybWFsIC1zTmFOMTIzIC0+IDAKK2Jvb2wxMDUwIGlzcW5hbiAwRS0yMDAwIC0+IDAKK2Jvb2wxMDUxIGlzcW5hbiAtMEUtMjAwMCAtPiAwCitib29sMTA1MiBpc3FuYW4gMEUtMTAwOCAtPiAwCitib29sMTA1MyBpc3FuYW4gLTBFLTEwMDggLT4gMAorYm9vbDEwNTQgaXNxbmFuIDBFLTEwMDcgLT4gMAorYm9vbDEwNTUgaXNxbmFuIC0wRS0xMDA3IC0+IDAKK2Jvb2wxMDU2IGlzcW5hbiAwRS0xMDA2IC0+IDAKK2Jvb2wxMDU3IGlzcW5hbiAtMEUtMTAwNiAtPiAwCitib29sMTA1OCBpc3FuYW4gMEUtMTAwMCAtPiAwCitib29sMTA1OSBpc3FuYW4gLTBFLTEwMDAgLT4gMAorYm9vbDEwNjAgaXNxbmFuIDBFLTk5OSAtPiAwCitib29sMTA2MSBpc3FuYW4gLTBFLTk5OSAtPiAwCitib29sMTA2MiBpc3FuYW4gMEUtOTk4IC0+IDAKK2Jvb2wxMDYzIGlzcW5hbiAtMEUtOTk4IC0+IDAKK2Jvb2wxMDY0IGlzcW5hbiAwRS0xMDAgLT4gMAorYm9vbDEwNjUgaXNxbmFuIC0wRS0xMDAgLT4gMAorYm9vbDEwNjYgaXNxbmFuIDAuMDAwMDAwIC0+IDAKK2Jvb2wxMDY3IGlzcW5hbiAtMC4wMDAwMDAgLT4gMAorYm9vbDEwNjggaXNxbmFuIDAuMDAwIC0+IDAKK2Jvb2wxMDY5IGlzcW5hbiAtMC4wMDAgLT4gMAorYm9vbDEwNzAgaXNxbmFuIDAuMDAgLT4gMAorYm9vbDEwNzEgaXNxbmFuIC0wLjAwIC0+IDAKK2Jvb2wxMDcyIGlzcW5hbiAwLjAgLT4gMAorYm9vbDEwNzMgaXNxbmFuIC0wLjAgLT4gMAorYm9vbDEwNzQgaXNxbmFuIDAgLT4gMAorYm9vbDEwNzUgaXNxbmFuIC0wIC0+IDAKK2Jvb2wxMDc2IGlzcW5hbiAwRSsxIC0+IDAKK2Jvb2wxMDc3IGlzcW5hbiAtMEUrMSAtPiAwCitib29sMTA3OCBpc3FuYW4gMEUrMiAtPiAwCitib29sMTA3OSBpc3FuYW4gLTBFKzIgLT4gMAorYm9vbDEwODAgaXNxbmFuIDBFKzMgLT4gMAorYm9vbDEwODEgaXNxbmFuIC0wRSszIC0+IDAKK2Jvb2wxMDgyIGlzcW5hbiAwRSs2IC0+IDAKK2Jvb2wxMDgzIGlzcW5hbiAtMEUrNiAtPiAwCitib29sMTA4NCBpc3FuYW4gMEUrMTAwIC0+IDAKK2Jvb2wxMDg1IGlzcW5hbiAtMEUrMTAwIC0+IDAKK2Jvb2wxMDg2IGlzcW5hbiAwRSs5OTAgLT4gMAorYm9vbDEwODcgaXNxbmFuIC0wRSs5OTAgLT4gMAorYm9vbDEwODggaXNxbmFuIDBFKzk5MSAtPiAwCitib29sMTA4OSBpc3FuYW4gLTBFKzk5MSAtPiAwCitib29sMTA5MCBpc3FuYW4gMEUrOTkyIC0+IDAKK2Jvb2wxMDkxIGlzcW5hbiAtMEUrOTkyIC0+IDAKK2Jvb2wxMDkyIGlzcW5hbiAwRSs5OTggLT4gMAorYm9vbDEwOTMgaXNxbmFuIC0wRSs5OTggLT4gMAorYm9vbDEwOTQgaXNxbmFuIDBFKzk5OSAtPiAwCitib29sMTA5NSBpc3FuYW4gLTBFKzk5OSAtPiAwCitib29sMTA5NiBpc3FuYW4gMEUrMTAwMCAtPiAwCitib29sMTA5NyBpc3FuYW4gLTBFKzEwMDAgLT4gMAorYm9vbDEwOTggaXNxbmFuIDBFKzIwMDAgLT4gMAorYm9vbDEwOTkgaXNxbmFuIC0wRSsyMDAwIC0+IDAKK2Jvb2wxMTAwIGlzcW5hbiAxRS0yMDAwIC0+IDAKK2Jvb2wxMTAxIGlzcW5hbiAtMUUtMjAwMCAtPiAwCitib29sMTEwMiBpc3FuYW4gMUUtMTAwOCAtPiAwCitib29sMTEwMyBpc3FuYW4gLTFFLTEwMDggLT4gMAorYm9vbDExMDQgaXNxbmFuIDFFLTEwMDcgLT4gMAorYm9vbDExMDUgaXNxbmFuIC0xRS0xMDA3IC0+IDAKK2Jvb2wxMTA2IGlzcW5hbiAxRS0xMDA2IC0+IDAKK2Jvb2wxMTA3IGlzcW5hbiAtMUUtMTAwNiAtPiAwCitib29sMTEwOCBpc3FuYW4gMUUtMTAwMCAtPiAwCitib29sMTEwOSBpc3FuYW4gLTFFLTEwMDAgLT4gMAorYm9vbDExMTAgaXNxbmFuIDFFLTk5OSAtPiAwCitib29sMTExMSBpc3FuYW4gLTFFLTk5OSAtPiAwCitib29sMTExMiBpc3FuYW4gMUUtOTk4IC0+IDAKK2Jvb2wxMTEzIGlzcW5hbiAtMUUtOTk4IC0+IDAKK2Jvb2wxMTE0IGlzcW5hbiAxRS0xMDAgLT4gMAorYm9vbDExMTUgaXNxbmFuIC0xRS0xMDAgLT4gMAorYm9vbDExMTYgaXNxbmFuIDAuMDAwMDAxIC0+IDAKK2Jvb2wxMTE3IGlzcW5hbiAtMC4wMDAwMDEgLT4gMAorYm9vbDExMTggaXNxbmFuIDAuMDAxIC0+IDAKK2Jvb2wxMTE5IGlzcW5hbiAtMC4wMDEgLT4gMAorYm9vbDExMjAgaXNxbmFuIDAuMDEgLT4gMAorYm9vbDExMjEgaXNxbmFuIC0wLjAxIC0+IDAKK2Jvb2wxMTIyIGlzcW5hbiAwLjEgLT4gMAorYm9vbDExMjMgaXNxbmFuIC0wLjEgLT4gMAorYm9vbDExMjQgaXNxbmFuIDEgLT4gMAorYm9vbDExMjUgaXNxbmFuIC0xIC0+IDAKK2Jvb2wxMTI2IGlzcW5hbiAxRSsxIC0+IDAKK2Jvb2wxMTI3IGlzcW5hbiAtMUUrMSAtPiAwCitib29sMTEyOCBpc3FuYW4gMUUrMiAtPiAwCitib29sMTEyOSBpc3FuYW4gLTFFKzIgLT4gMAorYm9vbDExMzAgaXNxbmFuIDFFKzMgLT4gMAorYm9vbDExMzEgaXNxbmFuIC0xRSszIC0+IDAKK2Jvb2wxMTMyIGlzcW5hbiAxRSs2IC0+IDAKK2Jvb2wxMTMzIGlzcW5hbiAtMUUrNiAtPiAwCitib29sMTEzNCBpc3FuYW4gMUUrMTAwIC0+IDAKK2Jvb2wxMTM1IGlzcW5hbiAtMUUrMTAwIC0+IDAKK2Jvb2wxMTM2IGlzcW5hbiAxRSs5OTAgLT4gMAorYm9vbDExMzcgaXNxbmFuIC0xRSs5OTAgLT4gMAorYm9vbDExMzggaXNxbmFuIDFFKzk5MSAtPiAwCitib29sMTEzOSBpc3FuYW4gLTFFKzk5MSAtPiAwCitib29sMTE0MCBpc3FuYW4gMUUrOTkyIC0+IDAKK2Jvb2wxMTQxIGlzcW5hbiAtMUUrOTkyIC0+IDAKK2Jvb2wxMTQyIGlzcW5hbiAxRSs5OTggLT4gMAorYm9vbDExNDMgaXNxbmFuIC0xRSs5OTggLT4gMAorYm9vbDExNDQgaXNxbmFuIDFFKzk5OSAtPiAwCitib29sMTE0NSBpc3FuYW4gLTFFKzk5OSAtPiAwCitib29sMTE0NiBpc3FuYW4gMUUrMTAwMCAtPiAwCitib29sMTE0NyBpc3FuYW4gLTFFKzEwMDAgLT4gMAorYm9vbDExNDggaXNxbmFuIDFFKzIwMDAgLT4gMAorYm9vbDExNDkgaXNxbmFuIC0xRSsyMDAwIC0+IDAKK2Jvb2wxMTUwIGlzcW5hbiA5RS0yMDAwIC0+IDAKK2Jvb2wxMTUxIGlzcW5hbiAtOUUtMjAwMCAtPiAwCitib29sMTE1MiBpc3FuYW4gOUUtMTAwOCAtPiAwCitib29sMTE1MyBpc3FuYW4gLTlFLTEwMDggLT4gMAorYm9vbDExNTQgaXNxbmFuIDlFLTEwMDcgLT4gMAorYm9vbDExNTUgaXNxbmFuIC05RS0xMDA3IC0+IDAKK2Jvb2wxMTU2IGlzcW5hbiA5RS0xMDA2IC0+IDAKK2Jvb2wxMTU3IGlzcW5hbiAtOUUtMTAwNiAtPiAwCitib29sMTE1OCBpc3FuYW4gOUUtMTAwMCAtPiAwCitib29sMTE1OSBpc3FuYW4gLTlFLTEwMDAgLT4gMAorYm9vbDExNjAgaXNxbmFuIDlFLTk5OSAtPiAwCitib29sMTE2MSBpc3FuYW4gLTlFLTk5OSAtPiAwCitib29sMTE2MiBpc3FuYW4gOUUtOTk4IC0+IDAKK2Jvb2wxMTYzIGlzcW5hbiAtOUUtOTk4IC0+IDAKK2Jvb2wxMTY0IGlzcW5hbiA5RS0xMDAgLT4gMAorYm9vbDExNjUgaXNxbmFuIC05RS0xMDAgLT4gMAorYm9vbDExNjYgaXNxbmFuIDAuMDAwMDA5IC0+IDAKK2Jvb2wxMTY3IGlzcW5hbiAtMC4wMDAwMDkgLT4gMAorYm9vbDExNjggaXNxbmFuIDAuMDA5IC0+IDAKK2Jvb2wxMTY5IGlzcW5hbiAtMC4wMDkgLT4gMAorYm9vbDExNzAgaXNxbmFuIDAuMDkgLT4gMAorYm9vbDExNzEgaXNxbmFuIC0wLjA5IC0+IDAKK2Jvb2wxMTcyIGlzcW5hbiAwLjkgLT4gMAorYm9vbDExNzMgaXNxbmFuIC0wLjkgLT4gMAorYm9vbDExNzQgaXNxbmFuIDkgLT4gMAorYm9vbDExNzUgaXNxbmFuIC05IC0+IDAKK2Jvb2wxMTc2IGlzcW5hbiA5RSsxIC0+IDAKK2Jvb2wxMTc3IGlzcW5hbiAtOUUrMSAtPiAwCitib29sMTE3OCBpc3FuYW4gOUUrMiAtPiAwCitib29sMTE3OSBpc3FuYW4gLTlFKzIgLT4gMAorYm9vbDExODAgaXNxbmFuIDlFKzMgLT4gMAorYm9vbDExODEgaXNxbmFuIC05RSszIC0+IDAKK2Jvb2wxMTgyIGlzcW5hbiA5RSs2IC0+IDAKK2Jvb2wxMTgzIGlzcW5hbiAtOUUrNiAtPiAwCitib29sMTE4NCBpc3FuYW4gOUUrMTAwIC0+IDAKK2Jvb2wxMTg1IGlzcW5hbiAtOUUrMTAwIC0+IDAKK2Jvb2wxMTg2IGlzcW5hbiA5RSs5OTAgLT4gMAorYm9vbDExODcgaXNxbmFuIC05RSs5OTAgLT4gMAorYm9vbDExODggaXNxbmFuIDlFKzk5MSAtPiAwCitib29sMTE4OSBpc3FuYW4gLTlFKzk5MSAtPiAwCitib29sMTE5MCBpc3FuYW4gOUUrOTkyIC0+IDAKK2Jvb2wxMTkxIGlzcW5hbiAtOUUrOTkyIC0+IDAKK2Jvb2wxMTkyIGlzcW5hbiA5RSs5OTggLT4gMAorYm9vbDExOTMgaXNxbmFuIC05RSs5OTggLT4gMAorYm9vbDExOTQgaXNxbmFuIDlFKzk5OSAtPiAwCitib29sMTE5NSBpc3FuYW4gLTlFKzk5OSAtPiAwCitib29sMTE5NiBpc3FuYW4gOUUrMTAwMCAtPiAwCitib29sMTE5NyBpc3FuYW4gLTlFKzEwMDAgLT4gMAorYm9vbDExOTggaXNxbmFuIDlFKzIwMDAgLT4gMAorYm9vbDExOTkgaXNxbmFuIC05RSsyMDAwIC0+IDAKK2Jvb2wxMjAwIGlzcW5hbiA5Ljk5OTk5OTk5RS0yMDAwIC0+IDAKK2Jvb2wxMjAxIGlzcW5hbiAtOS45OTk5OTk5OUUtMjAwMCAtPiAwCitib29sMTIwMiBpc3FuYW4gOS45OTk5OTk5OUUtMTAwOCAtPiAwCitib29sMTIwMyBpc3FuYW4gLTkuOTk5OTk5OTlFLTEwMDggLT4gMAorYm9vbDEyMDQgaXNxbmFuIDkuOTk5OTk5OTlFLTEwMDcgLT4gMAorYm9vbDEyMDUgaXNxbmFuIC05Ljk5OTk5OTk5RS0xMDA3IC0+IDAKK2Jvb2wxMjA2IGlzcW5hbiA5Ljk5OTk5OTk5RS0xMDA2IC0+IDAKK2Jvb2wxMjA3IGlzcW5hbiAtOS45OTk5OTk5OUUtMTAwNiAtPiAwCitib29sMTIwOCBpc3FuYW4gOS45OTk5OTk5OUUtMTAwMCAtPiAwCitib29sMTIwOSBpc3FuYW4gLTkuOTk5OTk5OTlFLTEwMDAgLT4gMAorYm9vbDEyMTAgaXNxbmFuIDkuOTk5OTk5OTlFLTk5OSAtPiAwCitib29sMTIxMSBpc3FuYW4gLTkuOTk5OTk5OTlFLTk5OSAtPiAwCitib29sMTIxMiBpc3FuYW4gOS45OTk5OTk5OUUtOTk4IC0+IDAKK2Jvb2wxMjEzIGlzcW5hbiAtOS45OTk5OTk5OUUtOTk4IC0+IDAKK2Jvb2wxMjE0IGlzcW5hbiA5Ljk5OTk5OTk5RS0xMDAgLT4gMAorYm9vbDEyMTUgaXNxbmFuIC05Ljk5OTk5OTk5RS0xMDAgLT4gMAorYm9vbDEyMTYgaXNxbmFuIDAuMDAwMDA5OTk5OTk5OTkgLT4gMAorYm9vbDEyMTcgaXNxbmFuIC0wLjAwMDAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wxMjE4IGlzcW5hbiAwLjAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wxMjE5IGlzcW5hbiAtMC4wMDk5OTk5OTk5OSAtPiAwCitib29sMTIyMCBpc3FuYW4gMC4wOTk5OTk5OTk5IC0+IDAKK2Jvb2wxMjIxIGlzcW5hbiAtMC4wOTk5OTk5OTk5IC0+IDAKK2Jvb2wxMjIyIGlzcW5hbiAwLjk5OTk5OTk5OSAtPiAwCitib29sMTIyMyBpc3FuYW4gLTAuOTk5OTk5OTk5IC0+IDAKK2Jvb2wxMjI0IGlzcW5hbiA5Ljk5OTk5OTk5IC0+IDAKK2Jvb2wxMjI1IGlzcW5hbiAtOS45OTk5OTk5OSAtPiAwCitib29sMTIyNiBpc3FuYW4gOTkuOTk5OTk5OSAtPiAwCitib29sMTIyNyBpc3FuYW4gLTk5Ljk5OTk5OTkgLT4gMAorYm9vbDEyMjggaXNxbmFuIDk5OS45OTk5OTkgLT4gMAorYm9vbDEyMjkgaXNxbmFuIC05OTkuOTk5OTk5IC0+IDAKK2Jvb2wxMjMwIGlzcW5hbiA5OTk5Ljk5OTk5IC0+IDAKK2Jvb2wxMjMxIGlzcW5hbiAtOTk5OS45OTk5OSAtPiAwCitib29sMTIzMiBpc3FuYW4gOTk5OTk5OS45OSAtPiAwCitib29sMTIzMyBpc3FuYW4gLTk5OTk5OTkuOTkgLT4gMAorYm9vbDEyMzQgaXNxbmFuIDkuOTk5OTk5OTlFKzEwMCAtPiAwCitib29sMTIzNSBpc3FuYW4gLTkuOTk5OTk5OTlFKzEwMCAtPiAwCitib29sMTIzNiBpc3FuYW4gOS45OTk5OTk5OUUrOTkwIC0+IDAKK2Jvb2wxMjM3IGlzcW5hbiAtOS45OTk5OTk5OUUrOTkwIC0+IDAKK2Jvb2wxMjM4IGlzcW5hbiA5Ljk5OTk5OTk5RSs5OTEgLT4gMAorYm9vbDEyMzkgaXNxbmFuIC05Ljk5OTk5OTk5RSs5OTEgLT4gMAorYm9vbDEyNDAgaXNxbmFuIDkuOTk5OTk5OTlFKzk5MiAtPiAwCitib29sMTI0MSBpc3FuYW4gLTkuOTk5OTk5OTlFKzk5MiAtPiAwCitib29sMTI0MiBpc3FuYW4gOS45OTk5OTk5OUUrOTk4IC0+IDAKK2Jvb2wxMjQzIGlzcW5hbiAtOS45OTk5OTk5OUUrOTk4IC0+IDAKK2Jvb2wxMjQ0IGlzcW5hbiA5Ljk5OTk5OTk5RSs5OTkgLT4gMAorYm9vbDEyNDUgaXNxbmFuIC05Ljk5OTk5OTk5RSs5OTkgLT4gMAorYm9vbDEyNDYgaXNxbmFuIDkuOTk5OTk5OTlFKzEwMDAgLT4gMAorYm9vbDEyNDcgaXNxbmFuIC05Ljk5OTk5OTk5RSsxMDAwIC0+IDAKK2Jvb2wxMjQ4IGlzcW5hbiA5Ljk5OTk5OTk5RSsyMDAwIC0+IDAKK2Jvb2wxMjQ5IGlzcW5hbiAtOS45OTk5OTk5OUUrMjAwMCAtPiAwCitib29sMTI1MCBpc3FuYW4gSW5maW5pdHkgLT4gMAorYm9vbDEyNTEgaXNxbmFuIC1JbmZpbml0eSAtPiAwCitib29sMTI1MiBpc3FuYW4gTmFOIC0+IDEKK2Jvb2wxMjUzIGlzcW5hbiAtTmFOIC0+IDEKK2Jvb2wxMjU0IGlzcW5hbiBOYU4xMjMgLT4gMQorYm9vbDEyNTUgaXNxbmFuIC1OYU4xMjMgLT4gMQorYm9vbDEyNTYgaXNxbmFuIHNOYU4gLT4gMAorYm9vbDEyNTcgaXNxbmFuIC1zTmFOIC0+IDAKK2Jvb2wxMjU4IGlzcW5hbiBzTmFOMTIzIC0+IDAKK2Jvb2wxMjU5IGlzcW5hbiAtc05hTjEyMyAtPiAwCitib29sMTI2MCBpc3NpZ25lZCAwRS0yMDAwIC0+IDAKK2Jvb2wxMjYxIGlzc2lnbmVkIC0wRS0yMDAwIC0+IDEKK2Jvb2wxMjYyIGlzc2lnbmVkIDBFLTEwMDggLT4gMAorYm9vbDEyNjMgaXNzaWduZWQgLTBFLTEwMDggLT4gMQorYm9vbDEyNjQgaXNzaWduZWQgMEUtMTAwNyAtPiAwCitib29sMTI2NSBpc3NpZ25lZCAtMEUtMTAwNyAtPiAxCitib29sMTI2NiBpc3NpZ25lZCAwRS0xMDA2IC0+IDAKK2Jvb2wxMjY3IGlzc2lnbmVkIC0wRS0xMDA2IC0+IDEKK2Jvb2wxMjY4IGlzc2lnbmVkIDBFLTEwMDAgLT4gMAorYm9vbDEyNjkgaXNzaWduZWQgLTBFLTEwMDAgLT4gMQorYm9vbDEyNzAgaXNzaWduZWQgMEUtOTk5IC0+IDAKK2Jvb2wxMjcxIGlzc2lnbmVkIC0wRS05OTkgLT4gMQorYm9vbDEyNzIgaXNzaWduZWQgMEUtOTk4IC0+IDAKK2Jvb2wxMjczIGlzc2lnbmVkIC0wRS05OTggLT4gMQorYm9vbDEyNzQgaXNzaWduZWQgMEUtMTAwIC0+IDAKK2Jvb2wxMjc1IGlzc2lnbmVkIC0wRS0xMDAgLT4gMQorYm9vbDEyNzYgaXNzaWduZWQgMC4wMDAwMDAgLT4gMAorYm9vbDEyNzcgaXNzaWduZWQgLTAuMDAwMDAwIC0+IDEKK2Jvb2wxMjc4IGlzc2lnbmVkIDAuMDAwIC0+IDAKK2Jvb2wxMjc5IGlzc2lnbmVkIC0wLjAwMCAtPiAxCitib29sMTI4MCBpc3NpZ25lZCAwLjAwIC0+IDAKK2Jvb2wxMjgxIGlzc2lnbmVkIC0wLjAwIC0+IDEKK2Jvb2wxMjgyIGlzc2lnbmVkIDAuMCAtPiAwCitib29sMTI4MyBpc3NpZ25lZCAtMC4wIC0+IDEKK2Jvb2wxMjg0IGlzc2lnbmVkIDAgLT4gMAorYm9vbDEyODUgaXNzaWduZWQgLTAgLT4gMQorYm9vbDEyODYgaXNzaWduZWQgMEUrMSAtPiAwCitib29sMTI4NyBpc3NpZ25lZCAtMEUrMSAtPiAxCitib29sMTI4OCBpc3NpZ25lZCAwRSsyIC0+IDAKK2Jvb2wxMjg5IGlzc2lnbmVkIC0wRSsyIC0+IDEKK2Jvb2wxMjkwIGlzc2lnbmVkIDBFKzMgLT4gMAorYm9vbDEyOTEgaXNzaWduZWQgLTBFKzMgLT4gMQorYm9vbDEyOTIgaXNzaWduZWQgMEUrNiAtPiAwCitib29sMTI5MyBpc3NpZ25lZCAtMEUrNiAtPiAxCitib29sMTI5NCBpc3NpZ25lZCAwRSsxMDAgLT4gMAorYm9vbDEyOTUgaXNzaWduZWQgLTBFKzEwMCAtPiAxCitib29sMTI5NiBpc3NpZ25lZCAwRSs5OTAgLT4gMAorYm9vbDEyOTcgaXNzaWduZWQgLTBFKzk5MCAtPiAxCitib29sMTI5OCBpc3NpZ25lZCAwRSs5OTEgLT4gMAorYm9vbDEyOTkgaXNzaWduZWQgLTBFKzk5MSAtPiAxCitib29sMTMwMCBpc3NpZ25lZCAwRSs5OTIgLT4gMAorYm9vbDEzMDEgaXNzaWduZWQgLTBFKzk5MiAtPiAxCitib29sMTMwMiBpc3NpZ25lZCAwRSs5OTggLT4gMAorYm9vbDEzMDMgaXNzaWduZWQgLTBFKzk5OCAtPiAxCitib29sMTMwNCBpc3NpZ25lZCAwRSs5OTkgLT4gMAorYm9vbDEzMDUgaXNzaWduZWQgLTBFKzk5OSAtPiAxCitib29sMTMwNiBpc3NpZ25lZCAwRSsxMDAwIC0+IDAKK2Jvb2wxMzA3IGlzc2lnbmVkIC0wRSsxMDAwIC0+IDEKK2Jvb2wxMzA4IGlzc2lnbmVkIDBFKzIwMDAgLT4gMAorYm9vbDEzMDkgaXNzaWduZWQgLTBFKzIwMDAgLT4gMQorYm9vbDEzMTAgaXNzaWduZWQgMUUtMjAwMCAtPiAwCitib29sMTMxMSBpc3NpZ25lZCAtMUUtMjAwMCAtPiAxCitib29sMTMxMiBpc3NpZ25lZCAxRS0xMDA4IC0+IDAKK2Jvb2wxMzEzIGlzc2lnbmVkIC0xRS0xMDA4IC0+IDEKK2Jvb2wxMzE0IGlzc2lnbmVkIDFFLTEwMDcgLT4gMAorYm9vbDEzMTUgaXNzaWduZWQgLTFFLTEwMDcgLT4gMQorYm9vbDEzMTYgaXNzaWduZWQgMUUtMTAwNiAtPiAwCitib29sMTMxNyBpc3NpZ25lZCAtMUUtMTAwNiAtPiAxCitib29sMTMxOCBpc3NpZ25lZCAxRS0xMDAwIC0+IDAKK2Jvb2wxMzE5IGlzc2lnbmVkIC0xRS0xMDAwIC0+IDEKK2Jvb2wxMzIwIGlzc2lnbmVkIDFFLTk5OSAtPiAwCitib29sMTMyMSBpc3NpZ25lZCAtMUUtOTk5IC0+IDEKK2Jvb2wxMzIyIGlzc2lnbmVkIDFFLTk5OCAtPiAwCitib29sMTMyMyBpc3NpZ25lZCAtMUUtOTk4IC0+IDEKK2Jvb2wxMzI0IGlzc2lnbmVkIDFFLTEwMCAtPiAwCitib29sMTMyNSBpc3NpZ25lZCAtMUUtMTAwIC0+IDEKK2Jvb2wxMzI2IGlzc2lnbmVkIDAuMDAwMDAxIC0+IDAKK2Jvb2wxMzI3IGlzc2lnbmVkIC0wLjAwMDAwMSAtPiAxCitib29sMTMyOCBpc3NpZ25lZCAwLjAwMSAtPiAwCitib29sMTMyOSBpc3NpZ25lZCAtMC4wMDEgLT4gMQorYm9vbDEzMzAgaXNzaWduZWQgMC4wMSAtPiAwCitib29sMTMzMSBpc3NpZ25lZCAtMC4wMSAtPiAxCitib29sMTMzMiBpc3NpZ25lZCAwLjEgLT4gMAorYm9vbDEzMzMgaXNzaWduZWQgLTAuMSAtPiAxCitib29sMTMzNCBpc3NpZ25lZCAxIC0+IDAKK2Jvb2wxMzM1IGlzc2lnbmVkIC0xIC0+IDEKK2Jvb2wxMzM2IGlzc2lnbmVkIDFFKzEgLT4gMAorYm9vbDEzMzcgaXNzaWduZWQgLTFFKzEgLT4gMQorYm9vbDEzMzggaXNzaWduZWQgMUUrMiAtPiAwCitib29sMTMzOSBpc3NpZ25lZCAtMUUrMiAtPiAxCitib29sMTM0MCBpc3NpZ25lZCAxRSszIC0+IDAKK2Jvb2wxMzQxIGlzc2lnbmVkIC0xRSszIC0+IDEKK2Jvb2wxMzQyIGlzc2lnbmVkIDFFKzYgLT4gMAorYm9vbDEzNDMgaXNzaWduZWQgLTFFKzYgLT4gMQorYm9vbDEzNDQgaXNzaWduZWQgMUUrMTAwIC0+IDAKK2Jvb2wxMzQ1IGlzc2lnbmVkIC0xRSsxMDAgLT4gMQorYm9vbDEzNDYgaXNzaWduZWQgMUUrOTkwIC0+IDAKK2Jvb2wxMzQ3IGlzc2lnbmVkIC0xRSs5OTAgLT4gMQorYm9vbDEzNDggaXNzaWduZWQgMUUrOTkxIC0+IDAKK2Jvb2wxMzQ5IGlzc2lnbmVkIC0xRSs5OTEgLT4gMQorYm9vbDEzNTAgaXNzaWduZWQgMUUrOTkyIC0+IDAKK2Jvb2wxMzUxIGlzc2lnbmVkIC0xRSs5OTIgLT4gMQorYm9vbDEzNTIgaXNzaWduZWQgMUUrOTk4IC0+IDAKK2Jvb2wxMzUzIGlzc2lnbmVkIC0xRSs5OTggLT4gMQorYm9vbDEzNTQgaXNzaWduZWQgMUUrOTk5IC0+IDAKK2Jvb2wxMzU1IGlzc2lnbmVkIC0xRSs5OTkgLT4gMQorYm9vbDEzNTYgaXNzaWduZWQgMUUrMTAwMCAtPiAwCitib29sMTM1NyBpc3NpZ25lZCAtMUUrMTAwMCAtPiAxCitib29sMTM1OCBpc3NpZ25lZCAxRSsyMDAwIC0+IDAKK2Jvb2wxMzU5IGlzc2lnbmVkIC0xRSsyMDAwIC0+IDEKK2Jvb2wxMzYwIGlzc2lnbmVkIDlFLTIwMDAgLT4gMAorYm9vbDEzNjEgaXNzaWduZWQgLTlFLTIwMDAgLT4gMQorYm9vbDEzNjIgaXNzaWduZWQgOUUtMTAwOCAtPiAwCitib29sMTM2MyBpc3NpZ25lZCAtOUUtMTAwOCAtPiAxCitib29sMTM2NCBpc3NpZ25lZCA5RS0xMDA3IC0+IDAKK2Jvb2wxMzY1IGlzc2lnbmVkIC05RS0xMDA3IC0+IDEKK2Jvb2wxMzY2IGlzc2lnbmVkIDlFLTEwMDYgLT4gMAorYm9vbDEzNjcgaXNzaWduZWQgLTlFLTEwMDYgLT4gMQorYm9vbDEzNjggaXNzaWduZWQgOUUtMTAwMCAtPiAwCitib29sMTM2OSBpc3NpZ25lZCAtOUUtMTAwMCAtPiAxCitib29sMTM3MCBpc3NpZ25lZCA5RS05OTkgLT4gMAorYm9vbDEzNzEgaXNzaWduZWQgLTlFLTk5OSAtPiAxCitib29sMTM3MiBpc3NpZ25lZCA5RS05OTggLT4gMAorYm9vbDEzNzMgaXNzaWduZWQgLTlFLTk5OCAtPiAxCitib29sMTM3NCBpc3NpZ25lZCA5RS0xMDAgLT4gMAorYm9vbDEzNzUgaXNzaWduZWQgLTlFLTEwMCAtPiAxCitib29sMTM3NiBpc3NpZ25lZCAwLjAwMDAwOSAtPiAwCitib29sMTM3NyBpc3NpZ25lZCAtMC4wMDAwMDkgLT4gMQorYm9vbDEzNzggaXNzaWduZWQgMC4wMDkgLT4gMAorYm9vbDEzNzkgaXNzaWduZWQgLTAuMDA5IC0+IDEKK2Jvb2wxMzgwIGlzc2lnbmVkIDAuMDkgLT4gMAorYm9vbDEzODEgaXNzaWduZWQgLTAuMDkgLT4gMQorYm9vbDEzODIgaXNzaWduZWQgMC45IC0+IDAKK2Jvb2wxMzgzIGlzc2lnbmVkIC0wLjkgLT4gMQorYm9vbDEzODQgaXNzaWduZWQgOSAtPiAwCitib29sMTM4NSBpc3NpZ25lZCAtOSAtPiAxCitib29sMTM4NiBpc3NpZ25lZCA5RSsxIC0+IDAKK2Jvb2wxMzg3IGlzc2lnbmVkIC05RSsxIC0+IDEKK2Jvb2wxMzg4IGlzc2lnbmVkIDlFKzIgLT4gMAorYm9vbDEzODkgaXNzaWduZWQgLTlFKzIgLT4gMQorYm9vbDEzOTAgaXNzaWduZWQgOUUrMyAtPiAwCitib29sMTM5MSBpc3NpZ25lZCAtOUUrMyAtPiAxCitib29sMTM5MiBpc3NpZ25lZCA5RSs2IC0+IDAKK2Jvb2wxMzkzIGlzc2lnbmVkIC05RSs2IC0+IDEKK2Jvb2wxMzk0IGlzc2lnbmVkIDlFKzEwMCAtPiAwCitib29sMTM5NSBpc3NpZ25lZCAtOUUrMTAwIC0+IDEKK2Jvb2wxMzk2IGlzc2lnbmVkIDlFKzk5MCAtPiAwCitib29sMTM5NyBpc3NpZ25lZCAtOUUrOTkwIC0+IDEKK2Jvb2wxMzk4IGlzc2lnbmVkIDlFKzk5MSAtPiAwCitib29sMTM5OSBpc3NpZ25lZCAtOUUrOTkxIC0+IDEKK2Jvb2wxNDAwIGlzc2lnbmVkIDlFKzk5MiAtPiAwCitib29sMTQwMSBpc3NpZ25lZCAtOUUrOTkyIC0+IDEKK2Jvb2wxNDAyIGlzc2lnbmVkIDlFKzk5OCAtPiAwCitib29sMTQwMyBpc3NpZ25lZCAtOUUrOTk4IC0+IDEKK2Jvb2wxNDA0IGlzc2lnbmVkIDlFKzk5OSAtPiAwCitib29sMTQwNSBpc3NpZ25lZCAtOUUrOTk5IC0+IDEKK2Jvb2wxNDA2IGlzc2lnbmVkIDlFKzEwMDAgLT4gMAorYm9vbDE0MDcgaXNzaWduZWQgLTlFKzEwMDAgLT4gMQorYm9vbDE0MDggaXNzaWduZWQgOUUrMjAwMCAtPiAwCitib29sMTQwOSBpc3NpZ25lZCAtOUUrMjAwMCAtPiAxCitib29sMTQxMCBpc3NpZ25lZCA5Ljk5OTk5OTk5RS0yMDAwIC0+IDAKK2Jvb2wxNDExIGlzc2lnbmVkIC05Ljk5OTk5OTk5RS0yMDAwIC0+IDEKK2Jvb2wxNDEyIGlzc2lnbmVkIDkuOTk5OTk5OTlFLTEwMDggLT4gMAorYm9vbDE0MTMgaXNzaWduZWQgLTkuOTk5OTk5OTlFLTEwMDggLT4gMQorYm9vbDE0MTQgaXNzaWduZWQgOS45OTk5OTk5OUUtMTAwNyAtPiAwCitib29sMTQxNSBpc3NpZ25lZCAtOS45OTk5OTk5OUUtMTAwNyAtPiAxCitib29sMTQxNiBpc3NpZ25lZCA5Ljk5OTk5OTk5RS0xMDA2IC0+IDAKK2Jvb2wxNDE3IGlzc2lnbmVkIC05Ljk5OTk5OTk5RS0xMDA2IC0+IDEKK2Jvb2wxNDE4IGlzc2lnbmVkIDkuOTk5OTk5OTlFLTEwMDAgLT4gMAorYm9vbDE0MTkgaXNzaWduZWQgLTkuOTk5OTk5OTlFLTEwMDAgLT4gMQorYm9vbDE0MjAgaXNzaWduZWQgOS45OTk5OTk5OUUtOTk5IC0+IDAKK2Jvb2wxNDIxIGlzc2lnbmVkIC05Ljk5OTk5OTk5RS05OTkgLT4gMQorYm9vbDE0MjIgaXNzaWduZWQgOS45OTk5OTk5OUUtOTk4IC0+IDAKK2Jvb2wxNDIzIGlzc2lnbmVkIC05Ljk5OTk5OTk5RS05OTggLT4gMQorYm9vbDE0MjQgaXNzaWduZWQgOS45OTk5OTk5OUUtMTAwIC0+IDAKK2Jvb2wxNDI1IGlzc2lnbmVkIC05Ljk5OTk5OTk5RS0xMDAgLT4gMQorYm9vbDE0MjYgaXNzaWduZWQgMC4wMDAwMDk5OTk5OTk5OSAtPiAwCitib29sMTQyNyBpc3NpZ25lZCAtMC4wMDAwMDk5OTk5OTk5OSAtPiAxCitib29sMTQyOCBpc3NpZ25lZCAwLjAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wxNDI5IGlzc2lnbmVkIC0wLjAwOTk5OTk5OTk5IC0+IDEKK2Jvb2wxNDMwIGlzc2lnbmVkIDAuMDk5OTk5OTk5OSAtPiAwCitib29sMTQzMSBpc3NpZ25lZCAtMC4wOTk5OTk5OTk5IC0+IDEKK2Jvb2wxNDMyIGlzc2lnbmVkIDAuOTk5OTk5OTk5IC0+IDAKK2Jvb2wxNDMzIGlzc2lnbmVkIC0wLjk5OTk5OTk5OSAtPiAxCitib29sMTQzNCBpc3NpZ25lZCA5Ljk5OTk5OTk5IC0+IDAKK2Jvb2wxNDM1IGlzc2lnbmVkIC05Ljk5OTk5OTk5IC0+IDEKK2Jvb2wxNDM2IGlzc2lnbmVkIDk5Ljk5OTk5OTkgLT4gMAorYm9vbDE0MzcgaXNzaWduZWQgLTk5Ljk5OTk5OTkgLT4gMQorYm9vbDE0MzggaXNzaWduZWQgOTk5Ljk5OTk5OSAtPiAwCitib29sMTQzOSBpc3NpZ25lZCAtOTk5Ljk5OTk5OSAtPiAxCitib29sMTQ0MCBpc3NpZ25lZCA5OTk5Ljk5OTk5IC0+IDAKK2Jvb2wxNDQxIGlzc2lnbmVkIC05OTk5Ljk5OTk5IC0+IDEKK2Jvb2wxNDQyIGlzc2lnbmVkIDk5OTk5OTkuOTkgLT4gMAorYm9vbDE0NDMgaXNzaWduZWQgLTk5OTk5OTkuOTkgLT4gMQorYm9vbDE0NDQgaXNzaWduZWQgOS45OTk5OTk5OUUrMTAwIC0+IDAKK2Jvb2wxNDQ1IGlzc2lnbmVkIC05Ljk5OTk5OTk5RSsxMDAgLT4gMQorYm9vbDE0NDYgaXNzaWduZWQgOS45OTk5OTk5OUUrOTkwIC0+IDAKK2Jvb2wxNDQ3IGlzc2lnbmVkIC05Ljk5OTk5OTk5RSs5OTAgLT4gMQorYm9vbDE0NDggaXNzaWduZWQgOS45OTk5OTk5OUUrOTkxIC0+IDAKK2Jvb2wxNDQ5IGlzc2lnbmVkIC05Ljk5OTk5OTk5RSs5OTEgLT4gMQorYm9vbDE0NTAgaXNzaWduZWQgOS45OTk5OTk5OUUrOTkyIC0+IDAKK2Jvb2wxNDUxIGlzc2lnbmVkIC05Ljk5OTk5OTk5RSs5OTIgLT4gMQorYm9vbDE0NTIgaXNzaWduZWQgOS45OTk5OTk5OUUrOTk4IC0+IDAKK2Jvb2wxNDUzIGlzc2lnbmVkIC05Ljk5OTk5OTk5RSs5OTggLT4gMQorYm9vbDE0NTQgaXNzaWduZWQgOS45OTk5OTk5OUUrOTk5IC0+IDAKK2Jvb2wxNDU1IGlzc2lnbmVkIC05Ljk5OTk5OTk5RSs5OTkgLT4gMQorYm9vbDE0NTYgaXNzaWduZWQgOS45OTk5OTk5OUUrMTAwMCAtPiAwCitib29sMTQ1NyBpc3NpZ25lZCAtOS45OTk5OTk5OUUrMTAwMCAtPiAxCitib29sMTQ1OCBpc3NpZ25lZCA5Ljk5OTk5OTk5RSsyMDAwIC0+IDAKK2Jvb2wxNDU5IGlzc2lnbmVkIC05Ljk5OTk5OTk5RSsyMDAwIC0+IDEKK2Jvb2wxNDYwIGlzc2lnbmVkIEluZmluaXR5IC0+IDAKK2Jvb2wxNDYxIGlzc2lnbmVkIC1JbmZpbml0eSAtPiAxCitib29sMTQ2MiBpc3NpZ25lZCBOYU4gLT4gMAorYm9vbDE0NjMgaXNzaWduZWQgLU5hTiAtPiAxCitib29sMTQ2NCBpc3NpZ25lZCBOYU4xMjMgLT4gMAorYm9vbDE0NjUgaXNzaWduZWQgLU5hTjEyMyAtPiAxCitib29sMTQ2NiBpc3NpZ25lZCBzTmFOIC0+IDAKK2Jvb2wxNDY3IGlzc2lnbmVkIC1zTmFOIC0+IDEKK2Jvb2wxNDY4IGlzc2lnbmVkIHNOYU4xMjMgLT4gMAorYm9vbDE0NjkgaXNzaWduZWQgLXNOYU4xMjMgLT4gMQorYm9vbDE0NzAgaXNzbmFuIDBFLTIwMDAgLT4gMAorYm9vbDE0NzEgaXNzbmFuIC0wRS0yMDAwIC0+IDAKK2Jvb2wxNDcyIGlzc25hbiAwRS0xMDA4IC0+IDAKK2Jvb2wxNDczIGlzc25hbiAtMEUtMTAwOCAtPiAwCitib29sMTQ3NCBpc3NuYW4gMEUtMTAwNyAtPiAwCitib29sMTQ3NSBpc3NuYW4gLTBFLTEwMDcgLT4gMAorYm9vbDE0NzYgaXNzbmFuIDBFLTEwMDYgLT4gMAorYm9vbDE0NzcgaXNzbmFuIC0wRS0xMDA2IC0+IDAKK2Jvb2wxNDc4IGlzc25hbiAwRS0xMDAwIC0+IDAKK2Jvb2wxNDc5IGlzc25hbiAtMEUtMTAwMCAtPiAwCitib29sMTQ4MCBpc3NuYW4gMEUtOTk5IC0+IDAKK2Jvb2wxNDgxIGlzc25hbiAtMEUtOTk5IC0+IDAKK2Jvb2wxNDgyIGlzc25hbiAwRS05OTggLT4gMAorYm9vbDE0ODMgaXNzbmFuIC0wRS05OTggLT4gMAorYm9vbDE0ODQgaXNzbmFuIDBFLTEwMCAtPiAwCitib29sMTQ4NSBpc3NuYW4gLTBFLTEwMCAtPiAwCitib29sMTQ4NiBpc3NuYW4gMC4wMDAwMDAgLT4gMAorYm9vbDE0ODcgaXNzbmFuIC0wLjAwMDAwMCAtPiAwCitib29sMTQ4OCBpc3NuYW4gMC4wMDAgLT4gMAorYm9vbDE0ODkgaXNzbmFuIC0wLjAwMCAtPiAwCitib29sMTQ5MCBpc3NuYW4gMC4wMCAtPiAwCitib29sMTQ5MSBpc3NuYW4gLTAuMDAgLT4gMAorYm9vbDE0OTIgaXNzbmFuIDAuMCAtPiAwCitib29sMTQ5MyBpc3NuYW4gLTAuMCAtPiAwCitib29sMTQ5NCBpc3NuYW4gMCAtPiAwCitib29sMTQ5NSBpc3NuYW4gLTAgLT4gMAorYm9vbDE0OTYgaXNzbmFuIDBFKzEgLT4gMAorYm9vbDE0OTcgaXNzbmFuIC0wRSsxIC0+IDAKK2Jvb2wxNDk4IGlzc25hbiAwRSsyIC0+IDAKK2Jvb2wxNDk5IGlzc25hbiAtMEUrMiAtPiAwCitib29sMTUwMCBpc3NuYW4gMEUrMyAtPiAwCitib29sMTUwMSBpc3NuYW4gLTBFKzMgLT4gMAorYm9vbDE1MDIgaXNzbmFuIDBFKzYgLT4gMAorYm9vbDE1MDMgaXNzbmFuIC0wRSs2IC0+IDAKK2Jvb2wxNTA0IGlzc25hbiAwRSsxMDAgLT4gMAorYm9vbDE1MDUgaXNzbmFuIC0wRSsxMDAgLT4gMAorYm9vbDE1MDYgaXNzbmFuIDBFKzk5MCAtPiAwCitib29sMTUwNyBpc3NuYW4gLTBFKzk5MCAtPiAwCitib29sMTUwOCBpc3NuYW4gMEUrOTkxIC0+IDAKK2Jvb2wxNTA5IGlzc25hbiAtMEUrOTkxIC0+IDAKK2Jvb2wxNTEwIGlzc25hbiAwRSs5OTIgLT4gMAorYm9vbDE1MTEgaXNzbmFuIC0wRSs5OTIgLT4gMAorYm9vbDE1MTIgaXNzbmFuIDBFKzk5OCAtPiAwCitib29sMTUxMyBpc3NuYW4gLTBFKzk5OCAtPiAwCitib29sMTUxNCBpc3NuYW4gMEUrOTk5IC0+IDAKK2Jvb2wxNTE1IGlzc25hbiAtMEUrOTk5IC0+IDAKK2Jvb2wxNTE2IGlzc25hbiAwRSsxMDAwIC0+IDAKK2Jvb2wxNTE3IGlzc25hbiAtMEUrMTAwMCAtPiAwCitib29sMTUxOCBpc3NuYW4gMEUrMjAwMCAtPiAwCitib29sMTUxOSBpc3NuYW4gLTBFKzIwMDAgLT4gMAorYm9vbDE1MjAgaXNzbmFuIDFFLTIwMDAgLT4gMAorYm9vbDE1MjEgaXNzbmFuIC0xRS0yMDAwIC0+IDAKK2Jvb2wxNTIyIGlzc25hbiAxRS0xMDA4IC0+IDAKK2Jvb2wxNTIzIGlzc25hbiAtMUUtMTAwOCAtPiAwCitib29sMTUyNCBpc3NuYW4gMUUtMTAwNyAtPiAwCitib29sMTUyNSBpc3NuYW4gLTFFLTEwMDcgLT4gMAorYm9vbDE1MjYgaXNzbmFuIDFFLTEwMDYgLT4gMAorYm9vbDE1MjcgaXNzbmFuIC0xRS0xMDA2IC0+IDAKK2Jvb2wxNTI4IGlzc25hbiAxRS0xMDAwIC0+IDAKK2Jvb2wxNTI5IGlzc25hbiAtMUUtMTAwMCAtPiAwCitib29sMTUzMCBpc3NuYW4gMUUtOTk5IC0+IDAKK2Jvb2wxNTMxIGlzc25hbiAtMUUtOTk5IC0+IDAKK2Jvb2wxNTMyIGlzc25hbiAxRS05OTggLT4gMAorYm9vbDE1MzMgaXNzbmFuIC0xRS05OTggLT4gMAorYm9vbDE1MzQgaXNzbmFuIDFFLTEwMCAtPiAwCitib29sMTUzNSBpc3NuYW4gLTFFLTEwMCAtPiAwCitib29sMTUzNiBpc3NuYW4gMC4wMDAwMDEgLT4gMAorYm9vbDE1MzcgaXNzbmFuIC0wLjAwMDAwMSAtPiAwCitib29sMTUzOCBpc3NuYW4gMC4wMDEgLT4gMAorYm9vbDE1MzkgaXNzbmFuIC0wLjAwMSAtPiAwCitib29sMTU0MCBpc3NuYW4gMC4wMSAtPiAwCitib29sMTU0MSBpc3NuYW4gLTAuMDEgLT4gMAorYm9vbDE1NDIgaXNzbmFuIDAuMSAtPiAwCitib29sMTU0MyBpc3NuYW4gLTAuMSAtPiAwCitib29sMTU0NCBpc3NuYW4gMSAtPiAwCitib29sMTU0NSBpc3NuYW4gLTEgLT4gMAorYm9vbDE1NDYgaXNzbmFuIDFFKzEgLT4gMAorYm9vbDE1NDcgaXNzbmFuIC0xRSsxIC0+IDAKK2Jvb2wxNTQ4IGlzc25hbiAxRSsyIC0+IDAKK2Jvb2wxNTQ5IGlzc25hbiAtMUUrMiAtPiAwCitib29sMTU1MCBpc3NuYW4gMUUrMyAtPiAwCitib29sMTU1MSBpc3NuYW4gLTFFKzMgLT4gMAorYm9vbDE1NTIgaXNzbmFuIDFFKzYgLT4gMAorYm9vbDE1NTMgaXNzbmFuIC0xRSs2IC0+IDAKK2Jvb2wxNTU0IGlzc25hbiAxRSsxMDAgLT4gMAorYm9vbDE1NTUgaXNzbmFuIC0xRSsxMDAgLT4gMAorYm9vbDE1NTYgaXNzbmFuIDFFKzk5MCAtPiAwCitib29sMTU1NyBpc3NuYW4gLTFFKzk5MCAtPiAwCitib29sMTU1OCBpc3NuYW4gMUUrOTkxIC0+IDAKK2Jvb2wxNTU5IGlzc25hbiAtMUUrOTkxIC0+IDAKK2Jvb2wxNTYwIGlzc25hbiAxRSs5OTIgLT4gMAorYm9vbDE1NjEgaXNzbmFuIC0xRSs5OTIgLT4gMAorYm9vbDE1NjIgaXNzbmFuIDFFKzk5OCAtPiAwCitib29sMTU2MyBpc3NuYW4gLTFFKzk5OCAtPiAwCitib29sMTU2NCBpc3NuYW4gMUUrOTk5IC0+IDAKK2Jvb2wxNTY1IGlzc25hbiAtMUUrOTk5IC0+IDAKK2Jvb2wxNTY2IGlzc25hbiAxRSsxMDAwIC0+IDAKK2Jvb2wxNTY3IGlzc25hbiAtMUUrMTAwMCAtPiAwCitib29sMTU2OCBpc3NuYW4gMUUrMjAwMCAtPiAwCitib29sMTU2OSBpc3NuYW4gLTFFKzIwMDAgLT4gMAorYm9vbDE1NzAgaXNzbmFuIDlFLTIwMDAgLT4gMAorYm9vbDE1NzEgaXNzbmFuIC05RS0yMDAwIC0+IDAKK2Jvb2wxNTcyIGlzc25hbiA5RS0xMDA4IC0+IDAKK2Jvb2wxNTczIGlzc25hbiAtOUUtMTAwOCAtPiAwCitib29sMTU3NCBpc3NuYW4gOUUtMTAwNyAtPiAwCitib29sMTU3NSBpc3NuYW4gLTlFLTEwMDcgLT4gMAorYm9vbDE1NzYgaXNzbmFuIDlFLTEwMDYgLT4gMAorYm9vbDE1NzcgaXNzbmFuIC05RS0xMDA2IC0+IDAKK2Jvb2wxNTc4IGlzc25hbiA5RS0xMDAwIC0+IDAKK2Jvb2wxNTc5IGlzc25hbiAtOUUtMTAwMCAtPiAwCitib29sMTU4MCBpc3NuYW4gOUUtOTk5IC0+IDAKK2Jvb2wxNTgxIGlzc25hbiAtOUUtOTk5IC0+IDAKK2Jvb2wxNTgyIGlzc25hbiA5RS05OTggLT4gMAorYm9vbDE1ODMgaXNzbmFuIC05RS05OTggLT4gMAorYm9vbDE1ODQgaXNzbmFuIDlFLTEwMCAtPiAwCitib29sMTU4NSBpc3NuYW4gLTlFLTEwMCAtPiAwCitib29sMTU4NiBpc3NuYW4gMC4wMDAwMDkgLT4gMAorYm9vbDE1ODcgaXNzbmFuIC0wLjAwMDAwOSAtPiAwCitib29sMTU4OCBpc3NuYW4gMC4wMDkgLT4gMAorYm9vbDE1ODkgaXNzbmFuIC0wLjAwOSAtPiAwCitib29sMTU5MCBpc3NuYW4gMC4wOSAtPiAwCitib29sMTU5MSBpc3NuYW4gLTAuMDkgLT4gMAorYm9vbDE1OTIgaXNzbmFuIDAuOSAtPiAwCitib29sMTU5MyBpc3NuYW4gLTAuOSAtPiAwCitib29sMTU5NCBpc3NuYW4gOSAtPiAwCitib29sMTU5NSBpc3NuYW4gLTkgLT4gMAorYm9vbDE1OTYgaXNzbmFuIDlFKzEgLT4gMAorYm9vbDE1OTcgaXNzbmFuIC05RSsxIC0+IDAKK2Jvb2wxNTk4IGlzc25hbiA5RSsyIC0+IDAKK2Jvb2wxNTk5IGlzc25hbiAtOUUrMiAtPiAwCitib29sMTYwMCBpc3NuYW4gOUUrMyAtPiAwCitib29sMTYwMSBpc3NuYW4gLTlFKzMgLT4gMAorYm9vbDE2MDIgaXNzbmFuIDlFKzYgLT4gMAorYm9vbDE2MDMgaXNzbmFuIC05RSs2IC0+IDAKK2Jvb2wxNjA0IGlzc25hbiA5RSsxMDAgLT4gMAorYm9vbDE2MDUgaXNzbmFuIC05RSsxMDAgLT4gMAorYm9vbDE2MDYgaXNzbmFuIDlFKzk5MCAtPiAwCitib29sMTYwNyBpc3NuYW4gLTlFKzk5MCAtPiAwCitib29sMTYwOCBpc3NuYW4gOUUrOTkxIC0+IDAKK2Jvb2wxNjA5IGlzc25hbiAtOUUrOTkxIC0+IDAKK2Jvb2wxNjEwIGlzc25hbiA5RSs5OTIgLT4gMAorYm9vbDE2MTEgaXNzbmFuIC05RSs5OTIgLT4gMAorYm9vbDE2MTIgaXNzbmFuIDlFKzk5OCAtPiAwCitib29sMTYxMyBpc3NuYW4gLTlFKzk5OCAtPiAwCitib29sMTYxNCBpc3NuYW4gOUUrOTk5IC0+IDAKK2Jvb2wxNjE1IGlzc25hbiAtOUUrOTk5IC0+IDAKK2Jvb2wxNjE2IGlzc25hbiA5RSsxMDAwIC0+IDAKK2Jvb2wxNjE3IGlzc25hbiAtOUUrMTAwMCAtPiAwCitib29sMTYxOCBpc3NuYW4gOUUrMjAwMCAtPiAwCitib29sMTYxOSBpc3NuYW4gLTlFKzIwMDAgLT4gMAorYm9vbDE2MjAgaXNzbmFuIDkuOTk5OTk5OTlFLTIwMDAgLT4gMAorYm9vbDE2MjEgaXNzbmFuIC05Ljk5OTk5OTk5RS0yMDAwIC0+IDAKK2Jvb2wxNjIyIGlzc25hbiA5Ljk5OTk5OTk5RS0xMDA4IC0+IDAKK2Jvb2wxNjIzIGlzc25hbiAtOS45OTk5OTk5OUUtMTAwOCAtPiAwCitib29sMTYyNCBpc3NuYW4gOS45OTk5OTk5OUUtMTAwNyAtPiAwCitib29sMTYyNSBpc3NuYW4gLTkuOTk5OTk5OTlFLTEwMDcgLT4gMAorYm9vbDE2MjYgaXNzbmFuIDkuOTk5OTk5OTlFLTEwMDYgLT4gMAorYm9vbDE2MjcgaXNzbmFuIC05Ljk5OTk5OTk5RS0xMDA2IC0+IDAKK2Jvb2wxNjI4IGlzc25hbiA5Ljk5OTk5OTk5RS0xMDAwIC0+IDAKK2Jvb2wxNjI5IGlzc25hbiAtOS45OTk5OTk5OUUtMTAwMCAtPiAwCitib29sMTYzMCBpc3NuYW4gOS45OTk5OTk5OUUtOTk5IC0+IDAKK2Jvb2wxNjMxIGlzc25hbiAtOS45OTk5OTk5OUUtOTk5IC0+IDAKK2Jvb2wxNjMyIGlzc25hbiA5Ljk5OTk5OTk5RS05OTggLT4gMAorYm9vbDE2MzMgaXNzbmFuIC05Ljk5OTk5OTk5RS05OTggLT4gMAorYm9vbDE2MzQgaXNzbmFuIDkuOTk5OTk5OTlFLTEwMCAtPiAwCitib29sMTYzNSBpc3NuYW4gLTkuOTk5OTk5OTlFLTEwMCAtPiAwCitib29sMTYzNiBpc3NuYW4gMC4wMDAwMDk5OTk5OTk5OSAtPiAwCitib29sMTYzNyBpc3NuYW4gLTAuMDAwMDA5OTk5OTk5OTkgLT4gMAorYm9vbDE2MzggaXNzbmFuIDAuMDA5OTk5OTk5OTkgLT4gMAorYm9vbDE2MzkgaXNzbmFuIC0wLjAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wxNjQwIGlzc25hbiAwLjA5OTk5OTk5OTkgLT4gMAorYm9vbDE2NDEgaXNzbmFuIC0wLjA5OTk5OTk5OTkgLT4gMAorYm9vbDE2NDIgaXNzbmFuIDAuOTk5OTk5OTk5IC0+IDAKK2Jvb2wxNjQzIGlzc25hbiAtMC45OTk5OTk5OTkgLT4gMAorYm9vbDE2NDQgaXNzbmFuIDkuOTk5OTk5OTkgLT4gMAorYm9vbDE2NDUgaXNzbmFuIC05Ljk5OTk5OTk5IC0+IDAKK2Jvb2wxNjQ2IGlzc25hbiA5OS45OTk5OTk5IC0+IDAKK2Jvb2wxNjQ3IGlzc25hbiAtOTkuOTk5OTk5OSAtPiAwCitib29sMTY0OCBpc3NuYW4gOTk5Ljk5OTk5OSAtPiAwCitib29sMTY0OSBpc3NuYW4gLTk5OS45OTk5OTkgLT4gMAorYm9vbDE2NTAgaXNzbmFuIDk5OTkuOTk5OTkgLT4gMAorYm9vbDE2NTEgaXNzbmFuIC05OTk5Ljk5OTk5IC0+IDAKK2Jvb2wxNjUyIGlzc25hbiA5OTk5OTk5Ljk5IC0+IDAKK2Jvb2wxNjUzIGlzc25hbiAtOTk5OTk5OS45OSAtPiAwCitib29sMTY1NCBpc3NuYW4gOS45OTk5OTk5OUUrMTAwIC0+IDAKK2Jvb2wxNjU1IGlzc25hbiAtOS45OTk5OTk5OUUrMTAwIC0+IDAKK2Jvb2wxNjU2IGlzc25hbiA5Ljk5OTk5OTk5RSs5OTAgLT4gMAorYm9vbDE2NTcgaXNzbmFuIC05Ljk5OTk5OTk5RSs5OTAgLT4gMAorYm9vbDE2NTggaXNzbmFuIDkuOTk5OTk5OTlFKzk5MSAtPiAwCitib29sMTY1OSBpc3NuYW4gLTkuOTk5OTk5OTlFKzk5MSAtPiAwCitib29sMTY2MCBpc3NuYW4gOS45OTk5OTk5OUUrOTkyIC0+IDAKK2Jvb2wxNjYxIGlzc25hbiAtOS45OTk5OTk5OUUrOTkyIC0+IDAKK2Jvb2wxNjYyIGlzc25hbiA5Ljk5OTk5OTk5RSs5OTggLT4gMAorYm9vbDE2NjMgaXNzbmFuIC05Ljk5OTk5OTk5RSs5OTggLT4gMAorYm9vbDE2NjQgaXNzbmFuIDkuOTk5OTk5OTlFKzk5OSAtPiAwCitib29sMTY2NSBpc3NuYW4gLTkuOTk5OTk5OTlFKzk5OSAtPiAwCitib29sMTY2NiBpc3NuYW4gOS45OTk5OTk5OUUrMTAwMCAtPiAwCitib29sMTY2NyBpc3NuYW4gLTkuOTk5OTk5OTlFKzEwMDAgLT4gMAorYm9vbDE2NjggaXNzbmFuIDkuOTk5OTk5OTlFKzIwMDAgLT4gMAorYm9vbDE2NjkgaXNzbmFuIC05Ljk5OTk5OTk5RSsyMDAwIC0+IDAKK2Jvb2wxNjcwIGlzc25hbiBJbmZpbml0eSAtPiAwCitib29sMTY3MSBpc3NuYW4gLUluZmluaXR5IC0+IDAKK2Jvb2wxNjcyIGlzc25hbiBOYU4gLT4gMAorYm9vbDE2NzMgaXNzbmFuIC1OYU4gLT4gMAorYm9vbDE2NzQgaXNzbmFuIE5hTjEyMyAtPiAwCitib29sMTY3NSBpc3NuYW4gLU5hTjEyMyAtPiAwCitib29sMTY3NiBpc3NuYW4gc05hTiAtPiAxCitib29sMTY3NyBpc3NuYW4gLXNOYU4gLT4gMQorYm9vbDE2NzggaXNzbmFuIHNOYU4xMjMgLT4gMQorYm9vbDE2NzkgaXNzbmFuIC1zTmFOMTIzIC0+IDEKK2Jvb2wxNjgwIGlzc3Vibm9ybWFsIDBFLTIwMDAgLT4gMAorYm9vbDE2ODEgaXNzdWJub3JtYWwgLTBFLTIwMDAgLT4gMAorYm9vbDE2ODIgaXNzdWJub3JtYWwgMEUtMTAwOCAtPiAwCitib29sMTY4MyBpc3N1Ym5vcm1hbCAtMEUtMTAwOCAtPiAwCitib29sMTY4NCBpc3N1Ym5vcm1hbCAwRS0xMDA3IC0+IDAKK2Jvb2wxNjg1IGlzc3Vibm9ybWFsIC0wRS0xMDA3IC0+IDAKK2Jvb2wxNjg2IGlzc3Vibm9ybWFsIDBFLTEwMDYgLT4gMAorYm9vbDE2ODcgaXNzdWJub3JtYWwgLTBFLTEwMDYgLT4gMAorYm9vbDE2ODggaXNzdWJub3JtYWwgMEUtMTAwMCAtPiAwCitib29sMTY4OSBpc3N1Ym5vcm1hbCAtMEUtMTAwMCAtPiAwCitib29sMTY5MCBpc3N1Ym5vcm1hbCAwRS05OTkgLT4gMAorYm9vbDE2OTEgaXNzdWJub3JtYWwgLTBFLTk5OSAtPiAwCitib29sMTY5MiBpc3N1Ym5vcm1hbCAwRS05OTggLT4gMAorYm9vbDE2OTMgaXNzdWJub3JtYWwgLTBFLTk5OCAtPiAwCitib29sMTY5NCBpc3N1Ym5vcm1hbCAwRS0xMDAgLT4gMAorYm9vbDE2OTUgaXNzdWJub3JtYWwgLTBFLTEwMCAtPiAwCitib29sMTY5NiBpc3N1Ym5vcm1hbCAwLjAwMDAwMCAtPiAwCitib29sMTY5NyBpc3N1Ym5vcm1hbCAtMC4wMDAwMDAgLT4gMAorYm9vbDE2OTggaXNzdWJub3JtYWwgMC4wMDAgLT4gMAorYm9vbDE2OTkgaXNzdWJub3JtYWwgLTAuMDAwIC0+IDAKK2Jvb2wxNzAwIGlzc3Vibm9ybWFsIDAuMDAgLT4gMAorYm9vbDE3MDEgaXNzdWJub3JtYWwgLTAuMDAgLT4gMAorYm9vbDE3MDIgaXNzdWJub3JtYWwgMC4wIC0+IDAKK2Jvb2wxNzAzIGlzc3Vibm9ybWFsIC0wLjAgLT4gMAorYm9vbDE3MDQgaXNzdWJub3JtYWwgMCAtPiAwCitib29sMTcwNSBpc3N1Ym5vcm1hbCAtMCAtPiAwCitib29sMTcwNiBpc3N1Ym5vcm1hbCAwRSsxIC0+IDAKK2Jvb2wxNzA3IGlzc3Vibm9ybWFsIC0wRSsxIC0+IDAKK2Jvb2wxNzA4IGlzc3Vibm9ybWFsIDBFKzIgLT4gMAorYm9vbDE3MDkgaXNzdWJub3JtYWwgLTBFKzIgLT4gMAorYm9vbDE3MTAgaXNzdWJub3JtYWwgMEUrMyAtPiAwCitib29sMTcxMSBpc3N1Ym5vcm1hbCAtMEUrMyAtPiAwCitib29sMTcxMiBpc3N1Ym5vcm1hbCAwRSs2IC0+IDAKK2Jvb2wxNzEzIGlzc3Vibm9ybWFsIC0wRSs2IC0+IDAKK2Jvb2wxNzE0IGlzc3Vibm9ybWFsIDBFKzEwMCAtPiAwCitib29sMTcxNSBpc3N1Ym5vcm1hbCAtMEUrMTAwIC0+IDAKK2Jvb2wxNzE2IGlzc3Vibm9ybWFsIDBFKzk5MCAtPiAwCitib29sMTcxNyBpc3N1Ym5vcm1hbCAtMEUrOTkwIC0+IDAKK2Jvb2wxNzE4IGlzc3Vibm9ybWFsIDBFKzk5MSAtPiAwCitib29sMTcxOSBpc3N1Ym5vcm1hbCAtMEUrOTkxIC0+IDAKK2Jvb2wxNzIwIGlzc3Vibm9ybWFsIDBFKzk5MiAtPiAwCitib29sMTcyMSBpc3N1Ym5vcm1hbCAtMEUrOTkyIC0+IDAKK2Jvb2wxNzIyIGlzc3Vibm9ybWFsIDBFKzk5OCAtPiAwCitib29sMTcyMyBpc3N1Ym5vcm1hbCAtMEUrOTk4IC0+IDAKK2Jvb2wxNzI0IGlzc3Vibm9ybWFsIDBFKzk5OSAtPiAwCitib29sMTcyNSBpc3N1Ym5vcm1hbCAtMEUrOTk5IC0+IDAKK2Jvb2wxNzI2IGlzc3Vibm9ybWFsIDBFKzEwMDAgLT4gMAorYm9vbDE3MjcgaXNzdWJub3JtYWwgLTBFKzEwMDAgLT4gMAorYm9vbDE3MjggaXNzdWJub3JtYWwgMEUrMjAwMCAtPiAwCitib29sMTcyOSBpc3N1Ym5vcm1hbCAtMEUrMjAwMCAtPiAwCitib29sMTczMCBpc3N1Ym5vcm1hbCAxRS0yMDAwIC0+IDEKK2Jvb2wxNzMxIGlzc3Vibm9ybWFsIC0xRS0yMDAwIC0+IDEKK2Jvb2wxNzMyIGlzc3Vibm9ybWFsIDFFLTEwMDggLT4gMQorYm9vbDE3MzMgaXNzdWJub3JtYWwgLTFFLTEwMDggLT4gMQorYm9vbDE3MzQgaXNzdWJub3JtYWwgMUUtMTAwNyAtPiAxCitib29sMTczNSBpc3N1Ym5vcm1hbCAtMUUtMTAwNyAtPiAxCitib29sMTczNiBpc3N1Ym5vcm1hbCAxRS0xMDA2IC0+IDEKK2Jvb2wxNzM3IGlzc3Vibm9ybWFsIC0xRS0xMDA2IC0+IDEKK2Jvb2wxNzM4IGlzc3Vibm9ybWFsIDFFLTEwMDAgLT4gMQorYm9vbDE3MzkgaXNzdWJub3JtYWwgLTFFLTEwMDAgLT4gMQorYm9vbDE3NDAgaXNzdWJub3JtYWwgMUUtOTk5IC0+IDAKK2Jvb2wxNzQxIGlzc3Vibm9ybWFsIC0xRS05OTkgLT4gMAorYm9vbDE3NDIgaXNzdWJub3JtYWwgMUUtOTk4IC0+IDAKK2Jvb2wxNzQzIGlzc3Vibm9ybWFsIC0xRS05OTggLT4gMAorYm9vbDE3NDQgaXNzdWJub3JtYWwgMUUtMTAwIC0+IDAKK2Jvb2wxNzQ1IGlzc3Vibm9ybWFsIC0xRS0xMDAgLT4gMAorYm9vbDE3NDYgaXNzdWJub3JtYWwgMC4wMDAwMDEgLT4gMAorYm9vbDE3NDcgaXNzdWJub3JtYWwgLTAuMDAwMDAxIC0+IDAKK2Jvb2wxNzQ4IGlzc3Vibm9ybWFsIDAuMDAxIC0+IDAKK2Jvb2wxNzQ5IGlzc3Vibm9ybWFsIC0wLjAwMSAtPiAwCitib29sMTc1MCBpc3N1Ym5vcm1hbCAwLjAxIC0+IDAKK2Jvb2wxNzUxIGlzc3Vibm9ybWFsIC0wLjAxIC0+IDAKK2Jvb2wxNzUyIGlzc3Vibm9ybWFsIDAuMSAtPiAwCitib29sMTc1MyBpc3N1Ym5vcm1hbCAtMC4xIC0+IDAKK2Jvb2wxNzU0IGlzc3Vibm9ybWFsIDEgLT4gMAorYm9vbDE3NTUgaXNzdWJub3JtYWwgLTEgLT4gMAorYm9vbDE3NTYgaXNzdWJub3JtYWwgMUUrMSAtPiAwCitib29sMTc1NyBpc3N1Ym5vcm1hbCAtMUUrMSAtPiAwCitib29sMTc1OCBpc3N1Ym5vcm1hbCAxRSsyIC0+IDAKK2Jvb2wxNzU5IGlzc3Vibm9ybWFsIC0xRSsyIC0+IDAKK2Jvb2wxNzYwIGlzc3Vibm9ybWFsIDFFKzMgLT4gMAorYm9vbDE3NjEgaXNzdWJub3JtYWwgLTFFKzMgLT4gMAorYm9vbDE3NjIgaXNzdWJub3JtYWwgMUUrNiAtPiAwCitib29sMTc2MyBpc3N1Ym5vcm1hbCAtMUUrNiAtPiAwCitib29sMTc2NCBpc3N1Ym5vcm1hbCAxRSsxMDAgLT4gMAorYm9vbDE3NjUgaXNzdWJub3JtYWwgLTFFKzEwMCAtPiAwCitib29sMTc2NiBpc3N1Ym5vcm1hbCAxRSs5OTAgLT4gMAorYm9vbDE3NjcgaXNzdWJub3JtYWwgLTFFKzk5MCAtPiAwCitib29sMTc2OCBpc3N1Ym5vcm1hbCAxRSs5OTEgLT4gMAorYm9vbDE3NjkgaXNzdWJub3JtYWwgLTFFKzk5MSAtPiAwCitib29sMTc3MCBpc3N1Ym5vcm1hbCAxRSs5OTIgLT4gMAorYm9vbDE3NzEgaXNzdWJub3JtYWwgLTFFKzk5MiAtPiAwCitib29sMTc3MiBpc3N1Ym5vcm1hbCAxRSs5OTggLT4gMAorYm9vbDE3NzMgaXNzdWJub3JtYWwgLTFFKzk5OCAtPiAwCitib29sMTc3NCBpc3N1Ym5vcm1hbCAxRSs5OTkgLT4gMAorYm9vbDE3NzUgaXNzdWJub3JtYWwgLTFFKzk5OSAtPiAwCitib29sMTc3NiBpc3N1Ym5vcm1hbCAxRSsxMDAwIC0+IDAKK2Jvb2wxNzc3IGlzc3Vibm9ybWFsIC0xRSsxMDAwIC0+IDAKK2Jvb2wxNzc4IGlzc3Vibm9ybWFsIDFFKzIwMDAgLT4gMAorYm9vbDE3NzkgaXNzdWJub3JtYWwgLTFFKzIwMDAgLT4gMAorYm9vbDE3ODAgaXNzdWJub3JtYWwgOUUtMjAwMCAtPiAxCitib29sMTc4MSBpc3N1Ym5vcm1hbCAtOUUtMjAwMCAtPiAxCitib29sMTc4MiBpc3N1Ym5vcm1hbCA5RS0xMDA4IC0+IDEKK2Jvb2wxNzgzIGlzc3Vibm9ybWFsIC05RS0xMDA4IC0+IDEKK2Jvb2wxNzg0IGlzc3Vibm9ybWFsIDlFLTEwMDcgLT4gMQorYm9vbDE3ODUgaXNzdWJub3JtYWwgLTlFLTEwMDcgLT4gMQorYm9vbDE3ODYgaXNzdWJub3JtYWwgOUUtMTAwNiAtPiAxCitib29sMTc4NyBpc3N1Ym5vcm1hbCAtOUUtMTAwNiAtPiAxCitib29sMTc4OCBpc3N1Ym5vcm1hbCA5RS0xMDAwIC0+IDEKK2Jvb2wxNzg5IGlzc3Vibm9ybWFsIC05RS0xMDAwIC0+IDEKK2Jvb2wxNzkwIGlzc3Vibm9ybWFsIDlFLTk5OSAtPiAwCitib29sMTc5MSBpc3N1Ym5vcm1hbCAtOUUtOTk5IC0+IDAKK2Jvb2wxNzkyIGlzc3Vibm9ybWFsIDlFLTk5OCAtPiAwCitib29sMTc5MyBpc3N1Ym5vcm1hbCAtOUUtOTk4IC0+IDAKK2Jvb2wxNzk0IGlzc3Vibm9ybWFsIDlFLTEwMCAtPiAwCitib29sMTc5NSBpc3N1Ym5vcm1hbCAtOUUtMTAwIC0+IDAKK2Jvb2wxNzk2IGlzc3Vibm9ybWFsIDAuMDAwMDA5IC0+IDAKK2Jvb2wxNzk3IGlzc3Vibm9ybWFsIC0wLjAwMDAwOSAtPiAwCitib29sMTc5OCBpc3N1Ym5vcm1hbCAwLjAwOSAtPiAwCitib29sMTc5OSBpc3N1Ym5vcm1hbCAtMC4wMDkgLT4gMAorYm9vbDE4MDAgaXNzdWJub3JtYWwgMC4wOSAtPiAwCitib29sMTgwMSBpc3N1Ym5vcm1hbCAtMC4wOSAtPiAwCitib29sMTgwMiBpc3N1Ym5vcm1hbCAwLjkgLT4gMAorYm9vbDE4MDMgaXNzdWJub3JtYWwgLTAuOSAtPiAwCitib29sMTgwNCBpc3N1Ym5vcm1hbCA5IC0+IDAKK2Jvb2wxODA1IGlzc3Vibm9ybWFsIC05IC0+IDAKK2Jvb2wxODA2IGlzc3Vibm9ybWFsIDlFKzEgLT4gMAorYm9vbDE4MDcgaXNzdWJub3JtYWwgLTlFKzEgLT4gMAorYm9vbDE4MDggaXNzdWJub3JtYWwgOUUrMiAtPiAwCitib29sMTgwOSBpc3N1Ym5vcm1hbCAtOUUrMiAtPiAwCitib29sMTgxMCBpc3N1Ym5vcm1hbCA5RSszIC0+IDAKK2Jvb2wxODExIGlzc3Vibm9ybWFsIC05RSszIC0+IDAKK2Jvb2wxODEyIGlzc3Vibm9ybWFsIDlFKzYgLT4gMAorYm9vbDE4MTMgaXNzdWJub3JtYWwgLTlFKzYgLT4gMAorYm9vbDE4MTQgaXNzdWJub3JtYWwgOUUrMTAwIC0+IDAKK2Jvb2wxODE1IGlzc3Vibm9ybWFsIC05RSsxMDAgLT4gMAorYm9vbDE4MTYgaXNzdWJub3JtYWwgOUUrOTkwIC0+IDAKK2Jvb2wxODE3IGlzc3Vibm9ybWFsIC05RSs5OTAgLT4gMAorYm9vbDE4MTggaXNzdWJub3JtYWwgOUUrOTkxIC0+IDAKK2Jvb2wxODE5IGlzc3Vibm9ybWFsIC05RSs5OTEgLT4gMAorYm9vbDE4MjAgaXNzdWJub3JtYWwgOUUrOTkyIC0+IDAKK2Jvb2wxODIxIGlzc3Vibm9ybWFsIC05RSs5OTIgLT4gMAorYm9vbDE4MjIgaXNzdWJub3JtYWwgOUUrOTk4IC0+IDAKK2Jvb2wxODIzIGlzc3Vibm9ybWFsIC05RSs5OTggLT4gMAorYm9vbDE4MjQgaXNzdWJub3JtYWwgOUUrOTk5IC0+IDAKK2Jvb2wxODI1IGlzc3Vibm9ybWFsIC05RSs5OTkgLT4gMAorYm9vbDE4MjYgaXNzdWJub3JtYWwgOUUrMTAwMCAtPiAwCitib29sMTgyNyBpc3N1Ym5vcm1hbCAtOUUrMTAwMCAtPiAwCitib29sMTgyOCBpc3N1Ym5vcm1hbCA5RSsyMDAwIC0+IDAKK2Jvb2wxODI5IGlzc3Vibm9ybWFsIC05RSsyMDAwIC0+IDAKK2Jvb2wxODMwIGlzc3Vibm9ybWFsIDkuOTk5OTk5OTlFLTIwMDAgLT4gMQorYm9vbDE4MzEgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFLTIwMDAgLT4gMQorYm9vbDE4MzIgaXNzdWJub3JtYWwgOS45OTk5OTk5OUUtMTAwOCAtPiAxCitib29sMTgzMyBpc3N1Ym5vcm1hbCAtOS45OTk5OTk5OUUtMTAwOCAtPiAxCitib29sMTgzNCBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RS0xMDA3IC0+IDEKK2Jvb2wxODM1IGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RS0xMDA3IC0+IDEKK2Jvb2wxODM2IGlzc3Vibm9ybWFsIDkuOTk5OTk5OTlFLTEwMDYgLT4gMQorYm9vbDE4MzcgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFLTEwMDYgLT4gMQorYm9vbDE4MzggaXNzdWJub3JtYWwgOS45OTk5OTk5OUUtMTAwMCAtPiAxCitib29sMTgzOSBpc3N1Ym5vcm1hbCAtOS45OTk5OTk5OUUtMTAwMCAtPiAxCitib29sMTg0MCBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RS05OTkgLT4gMAorYm9vbDE4NDEgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFLTk5OSAtPiAwCitib29sMTg0MiBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RS05OTggLT4gMAorYm9vbDE4NDMgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFLTk5OCAtPiAwCitib29sMTg0NCBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RS0xMDAgLT4gMAorYm9vbDE4NDUgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFLTEwMCAtPiAwCitib29sMTg0NiBpc3N1Ym5vcm1hbCAwLjAwMDAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wxODQ3IGlzc3Vibm9ybWFsIC0wLjAwMDAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wxODQ4IGlzc3Vibm9ybWFsIDAuMDA5OTk5OTk5OTkgLT4gMAorYm9vbDE4NDkgaXNzdWJub3JtYWwgLTAuMDA5OTk5OTk5OTkgLT4gMAorYm9vbDE4NTAgaXNzdWJub3JtYWwgMC4wOTk5OTk5OTk5IC0+IDAKK2Jvb2wxODUxIGlzc3Vibm9ybWFsIC0wLjA5OTk5OTk5OTkgLT4gMAorYm9vbDE4NTIgaXNzdWJub3JtYWwgMC45OTk5OTk5OTkgLT4gMAorYm9vbDE4NTMgaXNzdWJub3JtYWwgLTAuOTk5OTk5OTk5IC0+IDAKK2Jvb2wxODU0IGlzc3Vibm9ybWFsIDkuOTk5OTk5OTkgLT4gMAorYm9vbDE4NTUgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTkgLT4gMAorYm9vbDE4NTYgaXNzdWJub3JtYWwgOTkuOTk5OTk5OSAtPiAwCitib29sMTg1NyBpc3N1Ym5vcm1hbCAtOTkuOTk5OTk5OSAtPiAwCitib29sMTg1OCBpc3N1Ym5vcm1hbCA5OTkuOTk5OTk5IC0+IDAKK2Jvb2wxODU5IGlzc3Vibm9ybWFsIC05OTkuOTk5OTk5IC0+IDAKK2Jvb2wxODYwIGlzc3Vibm9ybWFsIDk5OTkuOTk5OTkgLT4gMAorYm9vbDE4NjEgaXNzdWJub3JtYWwgLTk5OTkuOTk5OTkgLT4gMAorYm9vbDE4NjIgaXNzdWJub3JtYWwgOTk5OTk5OS45OSAtPiAwCitib29sMTg2MyBpc3N1Ym5vcm1hbCAtOTk5OTk5OS45OSAtPiAwCitib29sMTg2NCBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RSsxMDAgLT4gMAorYm9vbDE4NjUgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFKzEwMCAtPiAwCitib29sMTg2NiBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RSs5OTAgLT4gMAorYm9vbDE4NjcgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFKzk5MCAtPiAwCitib29sMTg2OCBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RSs5OTEgLT4gMAorYm9vbDE4NjkgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFKzk5MSAtPiAwCitib29sMTg3MCBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RSs5OTIgLT4gMAorYm9vbDE4NzEgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFKzk5MiAtPiAwCitib29sMTg3MiBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RSs5OTggLT4gMAorYm9vbDE4NzMgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFKzk5OCAtPiAwCitib29sMTg3NCBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RSs5OTkgLT4gMAorYm9vbDE4NzUgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFKzk5OSAtPiAwCitib29sMTg3NiBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RSsxMDAwIC0+IDAKK2Jvb2wxODc3IGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RSsxMDAwIC0+IDAKK2Jvb2wxODc4IGlzc3Vibm9ybWFsIDkuOTk5OTk5OTlFKzIwMDAgLT4gMAorYm9vbDE4NzkgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFKzIwMDAgLT4gMAorYm9vbDE4ODAgaXNzdWJub3JtYWwgSW5maW5pdHkgLT4gMAorYm9vbDE4ODEgaXNzdWJub3JtYWwgLUluZmluaXR5IC0+IDAKK2Jvb2wxODgyIGlzc3Vibm9ybWFsIE5hTiAtPiAwCitib29sMTg4MyBpc3N1Ym5vcm1hbCAtTmFOIC0+IDAKK2Jvb2wxODg0IGlzc3Vibm9ybWFsIE5hTjEyMyAtPiAwCitib29sMTg4NSBpc3N1Ym5vcm1hbCAtTmFOMTIzIC0+IDAKK2Jvb2wxODg2IGlzc3Vibm9ybWFsIHNOYU4gLT4gMAorYm9vbDE4ODcgaXNzdWJub3JtYWwgLXNOYU4gLT4gMAorYm9vbDE4ODggaXNzdWJub3JtYWwgc05hTjEyMyAtPiAwCitib29sMTg4OSBpc3N1Ym5vcm1hbCAtc05hTjEyMyAtPiAwCitib29sMTg5MCBpc3plcm8gMEUtMjAwMCAtPiAxCitib29sMTg5MSBpc3plcm8gLTBFLTIwMDAgLT4gMQorYm9vbDE4OTIgaXN6ZXJvIDBFLTEwMDggLT4gMQorYm9vbDE4OTMgaXN6ZXJvIC0wRS0xMDA4IC0+IDEKK2Jvb2wxODk0IGlzemVybyAwRS0xMDA3IC0+IDEKK2Jvb2wxODk1IGlzemVybyAtMEUtMTAwNyAtPiAxCitib29sMTg5NiBpc3plcm8gMEUtMTAwNiAtPiAxCitib29sMTg5NyBpc3plcm8gLTBFLTEwMDYgLT4gMQorYm9vbDE4OTggaXN6ZXJvIDBFLTEwMDAgLT4gMQorYm9vbDE4OTkgaXN6ZXJvIC0wRS0xMDAwIC0+IDEKK2Jvb2wxOTAwIGlzemVybyAwRS05OTkgLT4gMQorYm9vbDE5MDEgaXN6ZXJvIC0wRS05OTkgLT4gMQorYm9vbDE5MDIgaXN6ZXJvIDBFLTk5OCAtPiAxCitib29sMTkwMyBpc3plcm8gLTBFLTk5OCAtPiAxCitib29sMTkwNCBpc3plcm8gMEUtMTAwIC0+IDEKK2Jvb2wxOTA1IGlzemVybyAtMEUtMTAwIC0+IDEKK2Jvb2wxOTA2IGlzemVybyAwLjAwMDAwMCAtPiAxCitib29sMTkwNyBpc3plcm8gLTAuMDAwMDAwIC0+IDEKK2Jvb2wxOTA4IGlzemVybyAwLjAwMCAtPiAxCitib29sMTkwOSBpc3plcm8gLTAuMDAwIC0+IDEKK2Jvb2wxOTEwIGlzemVybyAwLjAwIC0+IDEKK2Jvb2wxOTExIGlzemVybyAtMC4wMCAtPiAxCitib29sMTkxMiBpc3plcm8gMC4wIC0+IDEKK2Jvb2wxOTEzIGlzemVybyAtMC4wIC0+IDEKK2Jvb2wxOTE0IGlzemVybyAwIC0+IDEKK2Jvb2wxOTE1IGlzemVybyAtMCAtPiAxCitib29sMTkxNiBpc3plcm8gMEUrMSAtPiAxCitib29sMTkxNyBpc3plcm8gLTBFKzEgLT4gMQorYm9vbDE5MTggaXN6ZXJvIDBFKzIgLT4gMQorYm9vbDE5MTkgaXN6ZXJvIC0wRSsyIC0+IDEKK2Jvb2wxOTIwIGlzemVybyAwRSszIC0+IDEKK2Jvb2wxOTIxIGlzemVybyAtMEUrMyAtPiAxCitib29sMTkyMiBpc3plcm8gMEUrNiAtPiAxCitib29sMTkyMyBpc3plcm8gLTBFKzYgLT4gMQorYm9vbDE5MjQgaXN6ZXJvIDBFKzEwMCAtPiAxCitib29sMTkyNSBpc3plcm8gLTBFKzEwMCAtPiAxCitib29sMTkyNiBpc3plcm8gMEUrOTkwIC0+IDEKK2Jvb2wxOTI3IGlzemVybyAtMEUrOTkwIC0+IDEKK2Jvb2wxOTI4IGlzemVybyAwRSs5OTEgLT4gMQorYm9vbDE5MjkgaXN6ZXJvIC0wRSs5OTEgLT4gMQorYm9vbDE5MzAgaXN6ZXJvIDBFKzk5MiAtPiAxCitib29sMTkzMSBpc3plcm8gLTBFKzk5MiAtPiAxCitib29sMTkzMiBpc3plcm8gMEUrOTk4IC0+IDEKK2Jvb2wxOTMzIGlzemVybyAtMEUrOTk4IC0+IDEKK2Jvb2wxOTM0IGlzemVybyAwRSs5OTkgLT4gMQorYm9vbDE5MzUgaXN6ZXJvIC0wRSs5OTkgLT4gMQorYm9vbDE5MzYgaXN6ZXJvIDBFKzEwMDAgLT4gMQorYm9vbDE5MzcgaXN6ZXJvIC0wRSsxMDAwIC0+IDEKK2Jvb2wxOTM4IGlzemVybyAwRSsyMDAwIC0+IDEKK2Jvb2wxOTM5IGlzemVybyAtMEUrMjAwMCAtPiAxCitib29sMTk0MCBpc3plcm8gMUUtMjAwMCAtPiAwCitib29sMTk0MSBpc3plcm8gLTFFLTIwMDAgLT4gMAorYm9vbDE5NDIgaXN6ZXJvIDFFLTEwMDggLT4gMAorYm9vbDE5NDMgaXN6ZXJvIC0xRS0xMDA4IC0+IDAKK2Jvb2wxOTQ0IGlzemVybyAxRS0xMDA3IC0+IDAKK2Jvb2wxOTQ1IGlzemVybyAtMUUtMTAwNyAtPiAwCitib29sMTk0NiBpc3plcm8gMUUtMTAwNiAtPiAwCitib29sMTk0NyBpc3plcm8gLTFFLTEwMDYgLT4gMAorYm9vbDE5NDggaXN6ZXJvIDFFLTEwMDAgLT4gMAorYm9vbDE5NDkgaXN6ZXJvIC0xRS0xMDAwIC0+IDAKK2Jvb2wxOTUwIGlzemVybyAxRS05OTkgLT4gMAorYm9vbDE5NTEgaXN6ZXJvIC0xRS05OTkgLT4gMAorYm9vbDE5NTIgaXN6ZXJvIDFFLTk5OCAtPiAwCitib29sMTk1MyBpc3plcm8gLTFFLTk5OCAtPiAwCitib29sMTk1NCBpc3plcm8gMUUtMTAwIC0+IDAKK2Jvb2wxOTU1IGlzemVybyAtMUUtMTAwIC0+IDAKK2Jvb2wxOTU2IGlzemVybyAwLjAwMDAwMSAtPiAwCitib29sMTk1NyBpc3plcm8gLTAuMDAwMDAxIC0+IDAKK2Jvb2wxOTU4IGlzemVybyAwLjAwMSAtPiAwCitib29sMTk1OSBpc3plcm8gLTAuMDAxIC0+IDAKK2Jvb2wxOTYwIGlzemVybyAwLjAxIC0+IDAKK2Jvb2wxOTYxIGlzemVybyAtMC4wMSAtPiAwCitib29sMTk2MiBpc3plcm8gMC4xIC0+IDAKK2Jvb2wxOTYzIGlzemVybyAtMC4xIC0+IDAKK2Jvb2wxOTY0IGlzemVybyAxIC0+IDAKK2Jvb2wxOTY1IGlzemVybyAtMSAtPiAwCitib29sMTk2NiBpc3plcm8gMUUrMSAtPiAwCitib29sMTk2NyBpc3plcm8gLTFFKzEgLT4gMAorYm9vbDE5NjggaXN6ZXJvIDFFKzIgLT4gMAorYm9vbDE5NjkgaXN6ZXJvIC0xRSsyIC0+IDAKK2Jvb2wxOTcwIGlzemVybyAxRSszIC0+IDAKK2Jvb2wxOTcxIGlzemVybyAtMUUrMyAtPiAwCitib29sMTk3MiBpc3plcm8gMUUrNiAtPiAwCitib29sMTk3MyBpc3plcm8gLTFFKzYgLT4gMAorYm9vbDE5NzQgaXN6ZXJvIDFFKzEwMCAtPiAwCitib29sMTk3NSBpc3plcm8gLTFFKzEwMCAtPiAwCitib29sMTk3NiBpc3plcm8gMUUrOTkwIC0+IDAKK2Jvb2wxOTc3IGlzemVybyAtMUUrOTkwIC0+IDAKK2Jvb2wxOTc4IGlzemVybyAxRSs5OTEgLT4gMAorYm9vbDE5NzkgaXN6ZXJvIC0xRSs5OTEgLT4gMAorYm9vbDE5ODAgaXN6ZXJvIDFFKzk5MiAtPiAwCitib29sMTk4MSBpc3plcm8gLTFFKzk5MiAtPiAwCitib29sMTk4MiBpc3plcm8gMUUrOTk4IC0+IDAKK2Jvb2wxOTgzIGlzemVybyAtMUUrOTk4IC0+IDAKK2Jvb2wxOTg0IGlzemVybyAxRSs5OTkgLT4gMAorYm9vbDE5ODUgaXN6ZXJvIC0xRSs5OTkgLT4gMAorYm9vbDE5ODYgaXN6ZXJvIDFFKzEwMDAgLT4gMAorYm9vbDE5ODcgaXN6ZXJvIC0xRSsxMDAwIC0+IDAKK2Jvb2wxOTg4IGlzemVybyAxRSsyMDAwIC0+IDAKK2Jvb2wxOTg5IGlzemVybyAtMUUrMjAwMCAtPiAwCitib29sMTk5MCBpc3plcm8gOUUtMjAwMCAtPiAwCitib29sMTk5MSBpc3plcm8gLTlFLTIwMDAgLT4gMAorYm9vbDE5OTIgaXN6ZXJvIDlFLTEwMDggLT4gMAorYm9vbDE5OTMgaXN6ZXJvIC05RS0xMDA4IC0+IDAKK2Jvb2wxOTk0IGlzemVybyA5RS0xMDA3IC0+IDAKK2Jvb2wxOTk1IGlzemVybyAtOUUtMTAwNyAtPiAwCitib29sMTk5NiBpc3plcm8gOUUtMTAwNiAtPiAwCitib29sMTk5NyBpc3plcm8gLTlFLTEwMDYgLT4gMAorYm9vbDE5OTggaXN6ZXJvIDlFLTEwMDAgLT4gMAorYm9vbDE5OTkgaXN6ZXJvIC05RS0xMDAwIC0+IDAKK2Jvb2wyMDAwIGlzemVybyA5RS05OTkgLT4gMAorYm9vbDIwMDEgaXN6ZXJvIC05RS05OTkgLT4gMAorYm9vbDIwMDIgaXN6ZXJvIDlFLTk5OCAtPiAwCitib29sMjAwMyBpc3plcm8gLTlFLTk5OCAtPiAwCitib29sMjAwNCBpc3plcm8gOUUtMTAwIC0+IDAKK2Jvb2wyMDA1IGlzemVybyAtOUUtMTAwIC0+IDAKK2Jvb2wyMDA2IGlzemVybyAwLjAwMDAwOSAtPiAwCitib29sMjAwNyBpc3plcm8gLTAuMDAwMDA5IC0+IDAKK2Jvb2wyMDA4IGlzemVybyAwLjAwOSAtPiAwCitib29sMjAwOSBpc3plcm8gLTAuMDA5IC0+IDAKK2Jvb2wyMDEwIGlzemVybyAwLjA5IC0+IDAKK2Jvb2wyMDExIGlzemVybyAtMC4wOSAtPiAwCitib29sMjAxMiBpc3plcm8gMC45IC0+IDAKK2Jvb2wyMDEzIGlzemVybyAtMC45IC0+IDAKK2Jvb2wyMDE0IGlzemVybyA5IC0+IDAKK2Jvb2wyMDE1IGlzemVybyAtOSAtPiAwCitib29sMjAxNiBpc3plcm8gOUUrMSAtPiAwCitib29sMjAxNyBpc3plcm8gLTlFKzEgLT4gMAorYm9vbDIwMTggaXN6ZXJvIDlFKzIgLT4gMAorYm9vbDIwMTkgaXN6ZXJvIC05RSsyIC0+IDAKK2Jvb2wyMDIwIGlzemVybyA5RSszIC0+IDAKK2Jvb2wyMDIxIGlzemVybyAtOUUrMyAtPiAwCitib29sMjAyMiBpc3plcm8gOUUrNiAtPiAwCitib29sMjAyMyBpc3plcm8gLTlFKzYgLT4gMAorYm9vbDIwMjQgaXN6ZXJvIDlFKzEwMCAtPiAwCitib29sMjAyNSBpc3plcm8gLTlFKzEwMCAtPiAwCitib29sMjAyNiBpc3plcm8gOUUrOTkwIC0+IDAKK2Jvb2wyMDI3IGlzemVybyAtOUUrOTkwIC0+IDAKK2Jvb2wyMDI4IGlzemVybyA5RSs5OTEgLT4gMAorYm9vbDIwMjkgaXN6ZXJvIC05RSs5OTEgLT4gMAorYm9vbDIwMzAgaXN6ZXJvIDlFKzk5MiAtPiAwCitib29sMjAzMSBpc3plcm8gLTlFKzk5MiAtPiAwCitib29sMjAzMiBpc3plcm8gOUUrOTk4IC0+IDAKK2Jvb2wyMDMzIGlzemVybyAtOUUrOTk4IC0+IDAKK2Jvb2wyMDM0IGlzemVybyA5RSs5OTkgLT4gMAorYm9vbDIwMzUgaXN6ZXJvIC05RSs5OTkgLT4gMAorYm9vbDIwMzYgaXN6ZXJvIDlFKzEwMDAgLT4gMAorYm9vbDIwMzcgaXN6ZXJvIC05RSsxMDAwIC0+IDAKK2Jvb2wyMDM4IGlzemVybyA5RSsyMDAwIC0+IDAKK2Jvb2wyMDM5IGlzemVybyAtOUUrMjAwMCAtPiAwCitib29sMjA0MCBpc3plcm8gOS45OTk5OTk5OUUtMjAwMCAtPiAwCitib29sMjA0MSBpc3plcm8gLTkuOTk5OTk5OTlFLTIwMDAgLT4gMAorYm9vbDIwNDIgaXN6ZXJvIDkuOTk5OTk5OTlFLTEwMDggLT4gMAorYm9vbDIwNDMgaXN6ZXJvIC05Ljk5OTk5OTk5RS0xMDA4IC0+IDAKK2Jvb2wyMDQ0IGlzemVybyA5Ljk5OTk5OTk5RS0xMDA3IC0+IDAKK2Jvb2wyMDQ1IGlzemVybyAtOS45OTk5OTk5OUUtMTAwNyAtPiAwCitib29sMjA0NiBpc3plcm8gOS45OTk5OTk5OUUtMTAwNiAtPiAwCitib29sMjA0NyBpc3plcm8gLTkuOTk5OTk5OTlFLTEwMDYgLT4gMAorYm9vbDIwNDggaXN6ZXJvIDkuOTk5OTk5OTlFLTEwMDAgLT4gMAorYm9vbDIwNDkgaXN6ZXJvIC05Ljk5OTk5OTk5RS0xMDAwIC0+IDAKK2Jvb2wyMDUwIGlzemVybyA5Ljk5OTk5OTk5RS05OTkgLT4gMAorYm9vbDIwNTEgaXN6ZXJvIC05Ljk5OTk5OTk5RS05OTkgLT4gMAorYm9vbDIwNTIgaXN6ZXJvIDkuOTk5OTk5OTlFLTk5OCAtPiAwCitib29sMjA1MyBpc3plcm8gLTkuOTk5OTk5OTlFLTk5OCAtPiAwCitib29sMjA1NCBpc3plcm8gOS45OTk5OTk5OUUtMTAwIC0+IDAKK2Jvb2wyMDU1IGlzemVybyAtOS45OTk5OTk5OUUtMTAwIC0+IDAKK2Jvb2wyMDU2IGlzemVybyAwLjAwMDAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wyMDU3IGlzemVybyAtMC4wMDAwMDk5OTk5OTk5OSAtPiAwCitib29sMjA1OCBpc3plcm8gMC4wMDk5OTk5OTk5OSAtPiAwCitib29sMjA1OSBpc3plcm8gLTAuMDA5OTk5OTk5OTkgLT4gMAorYm9vbDIwNjAgaXN6ZXJvIDAuMDk5OTk5OTk5OSAtPiAwCitib29sMjA2MSBpc3plcm8gLTAuMDk5OTk5OTk5OSAtPiAwCitib29sMjA2MiBpc3plcm8gMC45OTk5OTk5OTkgLT4gMAorYm9vbDIwNjMgaXN6ZXJvIC0wLjk5OTk5OTk5OSAtPiAwCitib29sMjA2NCBpc3plcm8gOS45OTk5OTk5OSAtPiAwCitib29sMjA2NSBpc3plcm8gLTkuOTk5OTk5OTkgLT4gMAorYm9vbDIwNjYgaXN6ZXJvIDk5Ljk5OTk5OTkgLT4gMAorYm9vbDIwNjcgaXN6ZXJvIC05OS45OTk5OTk5IC0+IDAKK2Jvb2wyMDY4IGlzemVybyA5OTkuOTk5OTk5IC0+IDAKK2Jvb2wyMDY5IGlzemVybyAtOTk5Ljk5OTk5OSAtPiAwCitib29sMjA3MCBpc3plcm8gOTk5OS45OTk5OSAtPiAwCitib29sMjA3MSBpc3plcm8gLTk5OTkuOTk5OTkgLT4gMAorYm9vbDIwNzIgaXN6ZXJvIDk5OTk5OTkuOTkgLT4gMAorYm9vbDIwNzMgaXN6ZXJvIC05OTk5OTk5Ljk5IC0+IDAKK2Jvb2wyMDc0IGlzemVybyA5Ljk5OTk5OTk5RSsxMDAgLT4gMAorYm9vbDIwNzUgaXN6ZXJvIC05Ljk5OTk5OTk5RSsxMDAgLT4gMAorYm9vbDIwNzYgaXN6ZXJvIDkuOTk5OTk5OTlFKzk5MCAtPiAwCitib29sMjA3NyBpc3plcm8gLTkuOTk5OTk5OTlFKzk5MCAtPiAwCitib29sMjA3OCBpc3plcm8gOS45OTk5OTk5OUUrOTkxIC0+IDAKK2Jvb2wyMDc5IGlzemVybyAtOS45OTk5OTk5OUUrOTkxIC0+IDAKK2Jvb2wyMDgwIGlzemVybyA5Ljk5OTk5OTk5RSs5OTIgLT4gMAorYm9vbDIwODEgaXN6ZXJvIC05Ljk5OTk5OTk5RSs5OTIgLT4gMAorYm9vbDIwODIgaXN6ZXJvIDkuOTk5OTk5OTlFKzk5OCAtPiAwCitib29sMjA4MyBpc3plcm8gLTkuOTk5OTk5OTlFKzk5OCAtPiAwCitib29sMjA4NCBpc3plcm8gOS45OTk5OTk5OUUrOTk5IC0+IDAKK2Jvb2wyMDg1IGlzemVybyAtOS45OTk5OTk5OUUrOTk5IC0+IDAKK2Jvb2wyMDg2IGlzemVybyA5Ljk5OTk5OTk5RSsxMDAwIC0+IDAKK2Jvb2wyMDg3IGlzemVybyAtOS45OTk5OTk5OUUrMTAwMCAtPiAwCitib29sMjA4OCBpc3plcm8gOS45OTk5OTk5OUUrMjAwMCAtPiAwCitib29sMjA4OSBpc3plcm8gLTkuOTk5OTk5OTlFKzIwMDAgLT4gMAorYm9vbDIwOTAgaXN6ZXJvIEluZmluaXR5IC0+IDAKK2Jvb2wyMDkxIGlzemVybyAtSW5maW5pdHkgLT4gMAorYm9vbDIwOTIgaXN6ZXJvIE5hTiAtPiAwCitib29sMjA5MyBpc3plcm8gLU5hTiAtPiAwCitib29sMjA5NCBpc3plcm8gTmFOMTIzIC0+IDAKK2Jvb2wyMDk1IGlzemVybyAtTmFOMTIzIC0+IDAKK2Jvb2wyMDk2IGlzemVybyBzTmFOIC0+IDAKK2Jvb2wyMDk3IGlzemVybyAtc05hTiAtPiAwCitib29sMjA5OCBpc3plcm8gc05hTjEyMyAtPiAwCitib29sMjA5OSBpc3plcm8gLXNOYU4xMjMgLT4gMAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFRoZSBmb2xsb3dpbmcgdGVzdHMgKHB3bXgwIHRocm91Z2ggcHdteDQ0MCkgYXJlIGZvciB0aGUgICAgICAgICAgICAtLQorLS0gdGhyZWUtYXJndW1lbnQgdmVyc2lvbiBvZiBwb3dlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgcG93KHgsIHksIHopIDo9IHgqKnkgJSB6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBOb3RlIHRoYXQgdGhlIHRocmVlLWFyZ3VtZW50IHZlcnNpb24gb2YgcG93ZXIgaXMgKm5vdCogcGFydCBvZiAgICAgLS0KKy0tIHRoZSBJQk0gR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgc3BlY2lmaWNhdGlvbi4gIFF1ZXN0aW9ucyAgICAgICAtLQorLS0gYWJvdXQgaXQsIG9yIGFib3V0IHRoZXNlIHRlc3RjYXNlcywgc2hvdWxkIGdvIHRvIG9uZSBvZiB0aGUgICAgICAgIC0tCistLSBQeXRob24gZGVjaW1hbCBhdXRob3JzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlbmRlZDogMQorcHJlY2lzaW9uOiA5Cityb3VuZGluZzogZG93bgorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworLS0gU21hbGwgbnVtYmVycworLS0gTm90ZSB0aGF0IHBvd2VyKDAsIDAsIG0pIGlzIGFuIGVycm9yIGZvciBhbnkgbQorcHdteDAgcG93ZXIgMCAtMCAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDEgcG93ZXIgMCAtMCAyIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDIgcG93ZXIgMCAtMCAzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDMgcG93ZXIgMCAtMCA0IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDQgcG93ZXIgMCAtMCAtMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXg1IHBvd2VyIDAgLTAgLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214NiBwb3dlciAwIDAgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXg3IHBvd2VyIDAgMCAyIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDggcG93ZXIgMCAwIDMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214OSBwb3dlciAwIDAgNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxMCBwb3dlciAwIDAgLTEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MTEgcG93ZXIgMCAwIC0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDEyIHBvd2VyIDAgMSAxIC0+IDAKK3B3bXgxMyBwb3dlciAwIDEgMiAtPiAwCitwd214MTQgcG93ZXIgMCAxIDMgLT4gMAorcHdteDE1IHBvd2VyIDAgMSA0IC0+IDAKK3B3bXgxNiBwb3dlciAwIDEgLTEgLT4gMAorcHdteDE3IHBvd2VyIDAgMSAtMiAtPiAwCitwd214MTggcG93ZXIgMCAyIDEgLT4gMAorcHdteDE5IHBvd2VyIDAgMiAyIC0+IDAKK3B3bXgyMCBwb3dlciAwIDIgMyAtPiAwCitwd214MjEgcG93ZXIgMCAyIDQgLT4gMAorcHdteDIyIHBvd2VyIDAgMiAtMSAtPiAwCitwd214MjMgcG93ZXIgMCAyIC0yIC0+IDAKK3B3bXgyNCBwb3dlciAwIDMgMSAtPiAwCitwd214MjUgcG93ZXIgMCAzIDIgLT4gMAorcHdteDI2IHBvd2VyIDAgMyAzIC0+IDAKK3B3bXgyNyBwb3dlciAwIDMgNCAtPiAwCitwd214MjggcG93ZXIgMCAzIC0xIC0+IDAKK3B3bXgyOSBwb3dlciAwIDMgLTIgLT4gMAorcHdteDMwIHBvd2VyIDAgNCAxIC0+IDAKK3B3bXgzMSBwb3dlciAwIDQgMiAtPiAwCitwd214MzIgcG93ZXIgMCA0IDMgLT4gMAorcHdteDMzIHBvd2VyIDAgNCA0IC0+IDAKK3B3bXgzNCBwb3dlciAwIDQgLTEgLT4gMAorcHdteDM1IHBvd2VyIDAgNCAtMiAtPiAwCitwd214MzYgcG93ZXIgMCA1IDEgLT4gMAorcHdteDM3IHBvd2VyIDAgNSAyIC0+IDAKK3B3bXgzOCBwb3dlciAwIDUgMyAtPiAwCitwd214MzkgcG93ZXIgMCA1IDQgLT4gMAorcHdteDQwIHBvd2VyIDAgNSAtMSAtPiAwCitwd214NDEgcG93ZXIgMCA1IC0yIC0+IDAKK3B3bXg0MiBwb3dlciAxIC0wIDEgLT4gMAorcHdteDQzIHBvd2VyIDEgLTAgMiAtPiAxCitwd214NDQgcG93ZXIgMSAtMCAzIC0+IDEKK3B3bXg0NSBwb3dlciAxIC0wIDQgLT4gMQorcHdteDQ2IHBvd2VyIDEgLTAgLTEgLT4gMAorcHdteDQ3IHBvd2VyIDEgLTAgLTIgLT4gMQorcHdteDQ4IHBvd2VyIDEgMCAxIC0+IDAKK3B3bXg0OSBwb3dlciAxIDAgMiAtPiAxCitwd214NTAgcG93ZXIgMSAwIDMgLT4gMQorcHdteDUxIHBvd2VyIDEgMCA0IC0+IDEKK3B3bXg1MiBwb3dlciAxIDAgLTEgLT4gMAorcHdteDUzIHBvd2VyIDEgMCAtMiAtPiAxCitwd214NTQgcG93ZXIgMSAxIDEgLT4gMAorcHdteDU1IHBvd2VyIDEgMSAyIC0+IDEKK3B3bXg1NiBwb3dlciAxIDEgMyAtPiAxCitwd214NTcgcG93ZXIgMSAxIDQgLT4gMQorcHdteDU4IHBvd2VyIDEgMSAtMSAtPiAwCitwd214NTkgcG93ZXIgMSAxIC0yIC0+IDEKK3B3bXg2MCBwb3dlciAxIDIgMSAtPiAwCitwd214NjEgcG93ZXIgMSAyIDIgLT4gMQorcHdteDYyIHBvd2VyIDEgMiAzIC0+IDEKK3B3bXg2MyBwb3dlciAxIDIgNCAtPiAxCitwd214NjQgcG93ZXIgMSAyIC0xIC0+IDAKK3B3bXg2NSBwb3dlciAxIDIgLTIgLT4gMQorcHdteDY2IHBvd2VyIDEgMyAxIC0+IDAKK3B3bXg2NyBwb3dlciAxIDMgMiAtPiAxCitwd214NjggcG93ZXIgMSAzIDMgLT4gMQorcHdteDY5IHBvd2VyIDEgMyA0IC0+IDEKK3B3bXg3MCBwb3dlciAxIDMgLTEgLT4gMAorcHdteDcxIHBvd2VyIDEgMyAtMiAtPiAxCitwd214NzIgcG93ZXIgMSA0IDEgLT4gMAorcHdteDczIHBvd2VyIDEgNCAyIC0+IDEKK3B3bXg3NCBwb3dlciAxIDQgMyAtPiAxCitwd214NzUgcG93ZXIgMSA0IDQgLT4gMQorcHdteDc2IHBvd2VyIDEgNCAtMSAtPiAwCitwd214NzcgcG93ZXIgMSA0IC0yIC0+IDEKK3B3bXg3OCBwb3dlciAxIDUgMSAtPiAwCitwd214NzkgcG93ZXIgMSA1IDIgLT4gMQorcHdteDgwIHBvd2VyIDEgNSAzIC0+IDEKK3B3bXg4MSBwb3dlciAxIDUgNCAtPiAxCitwd214ODIgcG93ZXIgMSA1IC0xIC0+IDAKK3B3bXg4MyBwb3dlciAxIDUgLTIgLT4gMQorcHdteDg0IHBvd2VyIDIgLTAgMSAtPiAwCitwd214ODUgcG93ZXIgMiAtMCAyIC0+IDEKK3B3bXg4NiBwb3dlciAyIC0wIDMgLT4gMQorcHdteDg3IHBvd2VyIDIgLTAgNCAtPiAxCitwd214ODggcG93ZXIgMiAtMCAtMSAtPiAwCitwd214ODkgcG93ZXIgMiAtMCAtMiAtPiAxCitwd214OTAgcG93ZXIgMiAwIDEgLT4gMAorcHdteDkxIHBvd2VyIDIgMCAyIC0+IDEKK3B3bXg5MiBwb3dlciAyIDAgMyAtPiAxCitwd214OTMgcG93ZXIgMiAwIDQgLT4gMQorcHdteDk0IHBvd2VyIDIgMCAtMSAtPiAwCitwd214OTUgcG93ZXIgMiAwIC0yIC0+IDEKK3B3bXg5NiBwb3dlciAyIDEgMSAtPiAwCitwd214OTcgcG93ZXIgMiAxIDIgLT4gMAorcHdteDk4IHBvd2VyIDIgMSAzIC0+IDIKK3B3bXg5OSBwb3dlciAyIDEgNCAtPiAyCitwd214MTAwIHBvd2VyIDIgMSAtMSAtPiAwCitwd214MTAxIHBvd2VyIDIgMSAtMiAtPiAwCitwd214MTAyIHBvd2VyIDIgMiAxIC0+IDAKK3B3bXgxMDMgcG93ZXIgMiAyIDIgLT4gMAorcHdteDEwNCBwb3dlciAyIDIgMyAtPiAxCitwd214MTA1IHBvd2VyIDIgMiA0IC0+IDAKK3B3bXgxMDYgcG93ZXIgMiAyIC0xIC0+IDAKK3B3bXgxMDcgcG93ZXIgMiAyIC0yIC0+IDAKK3B3bXgxMDggcG93ZXIgMiAzIDEgLT4gMAorcHdteDEwOSBwb3dlciAyIDMgMiAtPiAwCitwd214MTEwIHBvd2VyIDIgMyAzIC0+IDIKK3B3bXgxMTEgcG93ZXIgMiAzIDQgLT4gMAorcHdteDExMiBwb3dlciAyIDMgLTEgLT4gMAorcHdteDExMyBwb3dlciAyIDMgLTIgLT4gMAorcHdteDExNCBwb3dlciAyIDQgMSAtPiAwCitwd214MTE1IHBvd2VyIDIgNCAyIC0+IDAKK3B3bXgxMTYgcG93ZXIgMiA0IDMgLT4gMQorcHdteDExNyBwb3dlciAyIDQgNCAtPiAwCitwd214MTE4IHBvd2VyIDIgNCAtMSAtPiAwCitwd214MTE5IHBvd2VyIDIgNCAtMiAtPiAwCitwd214MTIwIHBvd2VyIDIgNSAxIC0+IDAKK3B3bXgxMjEgcG93ZXIgMiA1IDIgLT4gMAorcHdteDEyMiBwb3dlciAyIDUgMyAtPiAyCitwd214MTIzIHBvd2VyIDIgNSA0IC0+IDAKK3B3bXgxMjQgcG93ZXIgMiA1IC0xIC0+IDAKK3B3bXgxMjUgcG93ZXIgMiA1IC0yIC0+IDAKK3B3bXgxMjYgcG93ZXIgMyAtMCAxIC0+IDAKK3B3bXgxMjcgcG93ZXIgMyAtMCAyIC0+IDEKK3B3bXgxMjggcG93ZXIgMyAtMCAzIC0+IDEKK3B3bXgxMjkgcG93ZXIgMyAtMCA0IC0+IDEKK3B3bXgxMzAgcG93ZXIgMyAtMCAtMSAtPiAwCitwd214MTMxIHBvd2VyIDMgLTAgLTIgLT4gMQorcHdteDEzMiBwb3dlciAzIDAgMSAtPiAwCitwd214MTMzIHBvd2VyIDMgMCAyIC0+IDEKK3B3bXgxMzQgcG93ZXIgMyAwIDMgLT4gMQorcHdteDEzNSBwb3dlciAzIDAgNCAtPiAxCitwd214MTM2IHBvd2VyIDMgMCAtMSAtPiAwCitwd214MTM3IHBvd2VyIDMgMCAtMiAtPiAxCitwd214MTM4IHBvd2VyIDMgMSAxIC0+IDAKK3B3bXgxMzkgcG93ZXIgMyAxIDIgLT4gMQorcHdteDE0MCBwb3dlciAzIDEgMyAtPiAwCitwd214MTQxIHBvd2VyIDMgMSA0IC0+IDMKK3B3bXgxNDIgcG93ZXIgMyAxIC0xIC0+IDAKK3B3bXgxNDMgcG93ZXIgMyAxIC0yIC0+IDEKK3B3bXgxNDQgcG93ZXIgMyAyIDEgLT4gMAorcHdteDE0NSBwb3dlciAzIDIgMiAtPiAxCitwd214MTQ2IHBvd2VyIDMgMiAzIC0+IDAKK3B3bXgxNDcgcG93ZXIgMyAyIDQgLT4gMQorcHdteDE0OCBwb3dlciAzIDIgLTEgLT4gMAorcHdteDE0OSBwb3dlciAzIDIgLTIgLT4gMQorcHdteDE1MCBwb3dlciAzIDMgMSAtPiAwCitwd214MTUxIHBvd2VyIDMgMyAyIC0+IDEKK3B3bXgxNTIgcG93ZXIgMyAzIDMgLT4gMAorcHdteDE1MyBwb3dlciAzIDMgNCAtPiAzCitwd214MTU0IHBvd2VyIDMgMyAtMSAtPiAwCitwd214MTU1IHBvd2VyIDMgMyAtMiAtPiAxCitwd214MTU2IHBvd2VyIDMgNCAxIC0+IDAKK3B3bXgxNTcgcG93ZXIgMyA0IDIgLT4gMQorcHdteDE1OCBwb3dlciAzIDQgMyAtPiAwCitwd214MTU5IHBvd2VyIDMgNCA0IC0+IDEKK3B3bXgxNjAgcG93ZXIgMyA0IC0xIC0+IDAKK3B3bXgxNjEgcG93ZXIgMyA0IC0yIC0+IDEKK3B3bXgxNjIgcG93ZXIgMyA1IDEgLT4gMAorcHdteDE2MyBwb3dlciAzIDUgMiAtPiAxCitwd214MTY0IHBvd2VyIDMgNSAzIC0+IDAKK3B3bXgxNjUgcG93ZXIgMyA1IDQgLT4gMworcHdteDE2NiBwb3dlciAzIDUgLTEgLT4gMAorcHdteDE2NyBwb3dlciAzIDUgLTIgLT4gMQorcHdteDE2OCBwb3dlciAtMCAtMCAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDE2OSBwb3dlciAtMCAtMCAyIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDE3MCBwb3dlciAtMCAtMCAzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDE3MSBwb3dlciAtMCAtMCA0IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDE3MiBwb3dlciAtMCAtMCAtMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxNzMgcG93ZXIgLTAgLTAgLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MTc0IHBvd2VyIC0wIDAgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxNzUgcG93ZXIgLTAgMCAyIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDE3NiBwb3dlciAtMCAwIDMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MTc3IHBvd2VyIC0wIDAgNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxNzggcG93ZXIgLTAgMCAtMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxNzkgcG93ZXIgLTAgMCAtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxODAgcG93ZXIgLTAgMSAxIC0+IC0wCitwd214MTgxIHBvd2VyIC0wIDEgMiAtPiAtMAorcHdteDE4MiBwb3dlciAtMCAxIDMgLT4gLTAKK3B3bXgxODMgcG93ZXIgLTAgMSA0IC0+IC0wCitwd214MTg0IHBvd2VyIC0wIDEgLTEgLT4gLTAKK3B3bXgxODUgcG93ZXIgLTAgMSAtMiAtPiAtMAorcHdteDE4NiBwb3dlciAtMCAyIDEgLT4gMAorcHdteDE4NyBwb3dlciAtMCAyIDIgLT4gMAorcHdteDE4OCBwb3dlciAtMCAyIDMgLT4gMAorcHdteDE4OSBwb3dlciAtMCAyIDQgLT4gMAorcHdteDE5MCBwb3dlciAtMCAyIC0xIC0+IDAKK3B3bXgxOTEgcG93ZXIgLTAgMiAtMiAtPiAwCitwd214MTkyIHBvd2VyIC0wIDMgMSAtPiAtMAorcHdteDE5MyBwb3dlciAtMCAzIDIgLT4gLTAKK3B3bXgxOTQgcG93ZXIgLTAgMyAzIC0+IC0wCitwd214MTk1IHBvd2VyIC0wIDMgNCAtPiAtMAorcHdteDE5NiBwb3dlciAtMCAzIC0xIC0+IC0wCitwd214MTk3IHBvd2VyIC0wIDMgLTIgLT4gLTAKK3B3bXgxOTggcG93ZXIgLTAgNCAxIC0+IDAKK3B3bXgxOTkgcG93ZXIgLTAgNCAyIC0+IDAKK3B3bXgyMDAgcG93ZXIgLTAgNCAzIC0+IDAKK3B3bXgyMDEgcG93ZXIgLTAgNCA0IC0+IDAKK3B3bXgyMDIgcG93ZXIgLTAgNCAtMSAtPiAwCitwd214MjAzIHBvd2VyIC0wIDQgLTIgLT4gMAorcHdteDIwNCBwb3dlciAtMCA1IDEgLT4gLTAKK3B3bXgyMDUgcG93ZXIgLTAgNSAyIC0+IC0wCitwd214MjA2IHBvd2VyIC0wIDUgMyAtPiAtMAorcHdteDIwNyBwb3dlciAtMCA1IDQgLT4gLTAKK3B3bXgyMDggcG93ZXIgLTAgNSAtMSAtPiAtMAorcHdteDIwOSBwb3dlciAtMCA1IC0yIC0+IC0wCitwd214MjEwIHBvd2VyIC0xIC0wIDEgLT4gMAorcHdteDIxMSBwb3dlciAtMSAtMCAyIC0+IDEKK3B3bXgyMTIgcG93ZXIgLTEgLTAgMyAtPiAxCitwd214MjEzIHBvd2VyIC0xIC0wIDQgLT4gMQorcHdteDIxNCBwb3dlciAtMSAtMCAtMSAtPiAwCitwd214MjE1IHBvd2VyIC0xIC0wIC0yIC0+IDEKK3B3bXgyMTYgcG93ZXIgLTEgMCAxIC0+IDAKK3B3bXgyMTcgcG93ZXIgLTEgMCAyIC0+IDEKK3B3bXgyMTggcG93ZXIgLTEgMCAzIC0+IDEKK3B3bXgyMTkgcG93ZXIgLTEgMCA0IC0+IDEKK3B3bXgyMjAgcG93ZXIgLTEgMCAtMSAtPiAwCitwd214MjIxIHBvd2VyIC0xIDAgLTIgLT4gMQorcHdteDIyMiBwb3dlciAtMSAxIDEgLT4gLTAKK3B3bXgyMjMgcG93ZXIgLTEgMSAyIC0+IC0xCitwd214MjI0IHBvd2VyIC0xIDEgMyAtPiAtMQorcHdteDIyNSBwb3dlciAtMSAxIDQgLT4gLTEKK3B3bXgyMjYgcG93ZXIgLTEgMSAtMSAtPiAtMAorcHdteDIyNyBwb3dlciAtMSAxIC0yIC0+IC0xCitwd214MjI4IHBvd2VyIC0xIDIgMSAtPiAwCitwd214MjI5IHBvd2VyIC0xIDIgMiAtPiAxCitwd214MjMwIHBvd2VyIC0xIDIgMyAtPiAxCitwd214MjMxIHBvd2VyIC0xIDIgNCAtPiAxCitwd214MjMyIHBvd2VyIC0xIDIgLTEgLT4gMAorcHdteDIzMyBwb3dlciAtMSAyIC0yIC0+IDEKK3B3bXgyMzQgcG93ZXIgLTEgMyAxIC0+IC0wCitwd214MjM1IHBvd2VyIC0xIDMgMiAtPiAtMQorcHdteDIzNiBwb3dlciAtMSAzIDMgLT4gLTEKK3B3bXgyMzcgcG93ZXIgLTEgMyA0IC0+IC0xCitwd214MjM4IHBvd2VyIC0xIDMgLTEgLT4gLTAKK3B3bXgyMzkgcG93ZXIgLTEgMyAtMiAtPiAtMQorcHdteDI0MCBwb3dlciAtMSA0IDEgLT4gMAorcHdteDI0MSBwb3dlciAtMSA0IDIgLT4gMQorcHdteDI0MiBwb3dlciAtMSA0IDMgLT4gMQorcHdteDI0MyBwb3dlciAtMSA0IDQgLT4gMQorcHdteDI0NCBwb3dlciAtMSA0IC0xIC0+IDAKK3B3bXgyNDUgcG93ZXIgLTEgNCAtMiAtPiAxCitwd214MjQ2IHBvd2VyIC0xIDUgMSAtPiAtMAorcHdteDI0NyBwb3dlciAtMSA1IDIgLT4gLTEKK3B3bXgyNDggcG93ZXIgLTEgNSAzIC0+IC0xCitwd214MjQ5IHBvd2VyIC0xIDUgNCAtPiAtMQorcHdteDI1MCBwb3dlciAtMSA1IC0xIC0+IC0wCitwd214MjUxIHBvd2VyIC0xIDUgLTIgLT4gLTEKKworLS0gUmFuZG9tbHkgY2hvc2VuIGxhcmdlciB2YWx1ZXMKK3B3bXgyNTIgcG93ZXIgMCA0IDcgLT4gMAorcHdteDI1MyBwb3dlciAtNCA1IC05IC0+IC03Citwd214MjU0IHBvd2VyIC01IDQgLTkgLT4gNAorcHdteDI1NSBwb3dlciAtNTAgMjkgMiAtPiAtMAorcHdteDI1NiBwb3dlciAtMSA4MyAzIC0+IC0xCitwd214MjU3IHBvd2VyIC01NSA2NSAtNzUgLT4gLTI1Citwd214MjU4IHBvd2VyIC02MTMgMTUxIC0zMDIgLT4gLTkKK3B3bXgyNTkgcG93ZXIgNTUxIDIzIC0zNSAtPiAzMQorcHdteDI2MCBwb3dlciA1MSAxNDIgOTQyIC0+IDkKK3B3bXgyNjEgcG93ZXIgNjg4NiA5MjA0IC02MDkxIC0+IDUwMzQKK3B3bXgyNjIgcG93ZXIgMzA1NyA1ODkwIC0zIC0+IDAKK3B3bXgyNjMgcG93ZXIgNTYgNDQzOCA1MzY1IC0+IDUyMQorcHdteDI2NCBwb3dlciA5NjIzNyAzNTY2OSAtNDY2NjkgLT4gMzA3MTcKK3B3bXgyNjUgcG93ZXIgNDAwMTEgMzQzNzUgLTU3NjExIC0+IDYyNQorcHdteDI2NiBwb3dlciA0NDMxNyAzODQ5MyAtMTIxOTYgLT4gMTEwODEKK3B3bXgyNjcgcG93ZXIgLTI4MjM2OCA4OTU2MzMgLTIzNTg3MCAtPiAtMjIwOTI4Citwd214MjY4IHBvd2VyIDc3MzI4IDg1MjU1MyAtNDA1NTI5IC0+IDEyOTE3MworcHdteDI2OSBwb3dlciAtOTI5NjU5IDg1NTcxMyA2NTAzNDggLT4gLTkwODAzCitwd214MjcwIHBvd2VyIDkwNzA1NyA2NTc0MzA5IDQ5MjQ3NjggLT4gMzAxODI1NworcHdteDI3MSBwb3dlciAtMjg4Nzc1NyAzMTk4NDkyIC01ODY0MzUyIC0+IDM0NDAxMTMKK3B3bXgyNzIgcG93ZXIgLTI0NzMxMCA2NTczNzEgLTc0MTU3MzkgLT4gLTEzMDE4NDAKK3B3bXgyNzMgcG93ZXIgLTgzOTkwNDYgNDUzMzQwODcgLTIyMzk1MDIwIC0+IC0xODUxNTg5NgorcHdteDI3NCBwb3dlciA3OTYyMTM5NyA0ODUwMjM2IDE0ODY1NTUgLT4gOTI4NzA2Citwd214Mjc1IHBvd2VyIDk2MDEyMjUxIDI3OTcxOTAxIDY5NjA5MDMxIC0+IDUwMDI4NzI5Citwd214Mjc2IHBvd2VyIC05MDczMzU0ODEgNzQxMjc5ODYgNTgyMzMwMDE3IC0+IDUxNTI3MTg3Citwd214Mjc3IHBvd2VyIC0xNDExOTI5NjAgODIxMDYzODI2IC0yNjA4Nzc5MjggLT4gMTEyMzE4NTYwCitwd214Mjc4IHBvd2VyIC01MDE3MTE3MDIgOTM0MzU1OTk0IDgyMTM1MTQzIC0+IDY2NTg2OTk1Citwd214Mjc5IHBvd2VyIC05MjU2MzU4MDc1IDg5MDA5MDAxMzggLTQ2NzIyMjAzMSAtPiA5NTgwMDI0NgorcHdteDI4MCBwb3dlciAtNzAzMTk2NDI5MSAxNzUxMjU3NDgzIC05MzUzMzQ0OTggLT4gLTYwNzYyNjYwOQorcHdteDI4MSBwb3dlciA4NDk0MzE0OTcxIDg3NDAxOTcyNTIgMTA3NTIyNDkxIC0+IDE3MzczNjU1Citwd214MjgyIHBvd2VyIDg4MzA2MjE2ODkwIDg3NDc3Mzc0MTY2IC0yMzQ5ODA3NiAtPiAxNTEyOTUyOAorcHdteDI4MyBwb3dlciAtMzM5Mzk0MzI0NzggNzE3MDE5NjIzOSAyMjEzMzU4MyAtPiAtMTEwMTcwMzYKK3B3bXgyODQgcG93ZXIgMTk0NjYyMjI3NjcgMzA0MTA3MTA2MTQgMzA1NzUyMDU2IC0+IDE5MTUwOTUzNworcHdteDI4NSBwb3dlciAtODY0OTQyNDk0MDA4IDM3MDU1ODg5OTYzOCAzNDY2ODg4NTYgLT4gNTY5NTY3NjgKK3B3bXgyODYgcG93ZXIgLTUyNTQwNjIyNTYwMyAzNDU3MDAyMjY4OTggMjM3MTYzNjIxIC0+IDU2Nzg5NTM0Citwd214Mjg3IHBvd2VyIDQ2NDYxMjIxNTk1NSAzMTI0NzQ2MjE2NTEgLTMyOTQ4NTcwMCAtPiAxODUzOTc1Citwd214Mjg4IHBvd2VyIC0xNjY0MjgzMDMxMjQ0IDM3NzQ0NzQ2Njk4NTUgOTE5MDIyODY3IC0+IC01MTYwMzQ1MjAKK3B3bXgyODkgcG93ZXIgLTM0NzI0Mzg1MDY5MTMgNzQwNzMyNzU0OTk5NSAtNDUxMjA2ODU0IC0+IC03NDU5NDc2MQorcHdteDI5MCBwb3dlciAtNDIyMzY2MjE1Mjk0OSA2ODkxMDY5Mjc5MDY5IDQ5OTg0MzUwMyAtPiAtODAxMzUyOTAKK3B3bXgyOTEgcG93ZXIgLTQ0MDIyMTE5Mjc2ODE2IDgxNjgyNjYxNzAzMjYgNTY5Njc5NTA5IC0+IDM3NTczNDQ3NQorcHdteDI5MiBwb3dlciAtNjYxOTU4OTEyMDc5MDIgMTI1MzI2OTA1NTU4NzUgLTI0MzI2MjEyOSAtPiAtMTEzMTg2ODMzCitwd214MjkzIHBvd2VyIC02OTAzOTkxMTI2MzE2NCA1MjcyNjYwNTg1NzY3MyAzNjA2MjUxOTYgLT4gLTI2ODY2Mjc0OAorcHdteDI5NCBwb3dlciAtMjk5MDEwMTE2Njk5MjA4IDg4NTA5MjU4OTM1OTIzMSAtNzMxMzEwMTIzIC0+IC0xMDQxMDM3NjUKK3B3bXgyOTUgcG93ZXIgLTIwMjQ5NTc3NjI5OTc1OCA1MDExNTkxMjI5NDMxNDUgLTY4NjIzNDg3MCAtPiAtMTM1NTExODc4Citwd214Mjk2IHBvd2VyIC01OTU0MTE0NzgwODc2NzYgODM2MjY5MjcwNDcyNDgxIC0yMTQ2MTQ5MDEgLT4gLTE4MzQ0MDgxOQorcHdteDI5NyBwb3dlciAtMTM5NTU1MzgxMDU2MjI5IDEzMjQ4MDg1MjAwMjA1MDcgLTIyODk0NDczOCAtPiAtMjE4OTkxNDczCitwd214Mjk4IHBvd2VyIDc4NDYzNTYyNTA3NzA1NDMgMTc5ODA0NTA1MTAzNjgxNCAtMTAxMDI4OTg1IC0+IDc4MDUxNzkKK3B3bXgyOTkgcG93ZXIgLTQyOTgwMTU4NjI3MDk0MTUgNjA0OTY2OTQ0ODQ0MjA5IDg4MDIxMjg5MyAtPiAtODc0MDg2NzEKK3B3bXgzMDAgcG93ZXIgLTM3Mzg0ODk3NTM4OTEwODkzIDc2MDIyMjA2OTk1NjU5Mjk1IC05MzA1MTI4NDIgLT4gLTY5Nzc1NzE1NworcHdteDMwMSBwb3dlciA4MjE2NjY1OTAyODAwNTQ0MyAyMzM3NTQwODI1MTc2NzcwNCA4MTcyNzA3MDAgLT4gNzcwNjk3MDAxCitwd214MzAyIHBvd2VyIDk3NDIwMzAxMTk4MTY1NjQxIDcyMjEzMjgyOTgzNDE2OTI0IDk0NzUxOTcxNiAtPiA2MTA3MTE3MjEKK3B3bXgzMDMgcG93ZXIgOTEzMzgyMDQzNDUzMjQzNjA3IDQ0OTY4MTcwNzI0ODUwMDI2MiAyMTExMzU1NDUgLT4gNzk1NDQ4OTkKK3B3bXgzMDQgcG93ZXIgLTMxMzgyMzYxMzQxODA1MjE3MSA1MzQ1Nzk0MDk2MTAxNDI5MzcgLTk0MzA2Mjk2OCAtPiAtNDQ2MDAxMzc5Citwd214MzA1IHBvd2VyIC05MjgxMDY1MTY4OTQ0OTQwOTMgNzYwMDIwMTc3MzMwMTE2NTA5IC01MDA0Mzk5NCAtPiAtNDYwMTA1NzUKK3B3bXgzMDYgcG93ZXIgNDY5MjE0NjYwMTY3OTQzOTc5NiA0NTY1MzU0NTExODA2NzY3ODA0IC02NjczMzkwNzUgLT4gNDgwMjcyMDgxCitwd214MzA3IHBvd2VyIDk3MjIyNTY2MzM1MDkxNzc5MzAgNzI3NjU2ODc5MTg2MDUwNTc5MCA3OTI2NzUzMjEgLT4gMTgyODc5NzUyCitwd214MzA4IHBvd2VyIDg2ODk4OTk0ODQ4MzAwNjQyMjggNDI5MDgyOTY3MTI5NjE1MjYxIC04NDQ1NTU2MzcgLT4gMjcwMzc0NTU3CisKKy0tIEFsbCBpbnB1dHMgbXVzdCBiZSBpbnRlZ2VycworcHdteDMwOSBwb3dlciAyLjEgMyAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDMxMCBwb3dlciAwLjQgMSA1IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDMxMSBwb3dlciAyIDMuMSA1IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDMxMiBwb3dlciAxMyAtMS4yIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDMxMyBwb3dlciAyIDMgNS4xIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBTZWNvbmQgYXJndW1lbnQgbXVzdCBiZSBub25uZWdhdGl2ZSAoLTAgaXMgb2theSkKK3B3bXgzMTQgcG93ZXIgMiAtMyA1IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDMxNSBwb3dlciA3IC0xIDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MzE2IHBvd2VyIDAgLTIgNiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gVGhpcmQgYXJndW1lbnQgbXVzdCBiZSBub256ZXJvCitwd214MzE3IHBvd2VyIDEzIDEwMDMgMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgzMTggcG93ZXIgMSAwIDBFKzk4NyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgzMTkgcG93ZXIgMCAyIC0wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBJbnRlZ2VycyBhcmUgZmluZSwgbm8gbWF0dGVyIGhvdyB0aGV5J3JlIGV4cHJlc3NlZAorcHdteDMyMCBwb3dlciAxMy4wIDExNy4wMCAxRSsyIC0+IDMzCitwd214MzIxIHBvd2VyIC0yRSszIDEuMUUrMTAgLTEyMzIzIC0+IDQ4MTEKK3B3bXgzMjIgcG93ZXIgMjAgMEUtMzAwIDE0MyAtPiAxCitwd214MzIzIHBvd2VyIC0yMCAtMEUrMTAwNSAxMTc5IC0+IDEKK3B3bXgzMjQgcG93ZXIgMEUtMTAwMSAxNyA1LjZFKzQgLT4gMAorCistLSBNb2R1bHVzIG11c3Qgbm90IGV4Y2VlZCBwcmVjaXNpb24KK3B3bXgzMjUgcG93ZXIgMCAxIDEyMzQ1Njc4OTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MzI2IHBvd2VyIDEgMCAxMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDMyNyBwb3dlciAtMjMgNSAtMTAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgzMjggcG93ZXIgNDE1NTcgMjEzIC05OTk5OTk5OTkgLT4gNDc2NTA0NTYKK3B3bXgzMjkgcG93ZXIgLTIxMzQgMTk5IDk5OTk5OTk5NyAtPiAtOTQ2OTU3OTEyCisKKy0tIEh1Z2UgYmFzZSBzaG91bGRuJ3QgcHJlc2VudCBhbnkgcHJvYmxlbXMKK3B3bXgzMzAgcG93ZXIgMS4yM0UrMTIzNDU2NzkxIDEwMTIzODk4IDE3MjkxMDY1IC0+IDU2NzQwNDUKKworLS0gTGFyZ2UgZXhwb25lbnQsIG1heSBiZSBzbG93CistLSAoaWYgc2Vjb25kIGFyZ3VtZW50IGlzIDFFbiB0aGVuIGV4cGVjdCBPKG4pIHJ1bm5pbmcgdGltZSkKK3B3bXgzMzEgcG93ZXIgMTAwMDI4ODg5NiA5Ljg3RSsxMjM0NyA5MzM3OTkwOCAtPiA0MzIyNDkyNAorCistLSBUcmlwbGUgTmFOIHByb3BhZ2F0aW9uIChhZGFwdGVkIGZyb20gZXhhbXBsZXMgaW4gZm1hLmRlY1Rlc3QpCitwd214NDAwIHBvd2VyICBOYU4yICBOYU4zICBOYU41ICAgLT4gIE5hTjIKK3B3bXg0MDEgcG93ZXIgIDEgICAgIE5hTjMgIE5hTjUgICAtPiAgTmFOMworcHdteDQwMiBwb3dlciAgMSAgICAgMSAgICAgTmFONSAgIC0+ICBOYU41Citwd214NDAzIHBvd2VyICBzTmFOMSBzTmFOMiBzTmFOMyAgLT4gIE5hTjEgSW52YWxpZF9vcGVyYXRpb24KK3B3bXg0MDQgcG93ZXIgIDEgICAgIHNOYU4yIHNOYU4zICAtPiAgTmFOMiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDQwNSBwb3dlciAgMSAgICAgMSAgICAgc05hTjMgIC0+ICBOYU4zIEludmFsaWRfb3BlcmF0aW9uCitwd214NDA2IHBvd2VyICBzTmFOMSBzTmFOMiBzTmFOMyAgLT4gIE5hTjEgSW52YWxpZF9vcGVyYXRpb24KK3B3bXg0MDcgcG93ZXIgIE5hTjcgIHNOYU4yIHNOYU4zICAtPiAgTmFOMiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDQwOCBwb3dlciAgTmFONyAgTmFONSAgc05hTjMgIC0+ICBOYU4zIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEluZmluaXRpZXMgbm90IGFsbG93ZWQKK3B3bXg0MTAgcG93ZXIgSW5mIDEgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXg0MTEgcG93ZXIgMSBJbmYgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXg0MTIgcG93ZXIgMSAxIEluZiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXg0MTMgcG93ZXIgLUluZiAxIDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214NDE0IHBvd2VyIDEgLUluZiAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDQxNSBwb3dlciAxIDEgLUluZiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gSnVzdCBmb3IgZnVuOiAxNzI5IGlzIGEgQ2FybWljaGFlbCBudW1iZXIKK3B3bXg0MjAgcG93ZXIgMCAxNzI4IDE3MjkgLT4gMAorcHdteDQyMSBwb3dlciAxIDE3MjggMTcyOSAtPiAxCitwd214NDIyIHBvd2VyIDIgMTcyOCAxNzI5IC0+IDEKK3B3bXg0MjMgcG93ZXIgMyAxNzI4IDE3MjkgLT4gMQorcHdteDQyNCBwb3dlciA0IDE3MjggMTcyOSAtPiAxCitwd214NDI1IHBvd2VyIDUgMTcyOCAxNzI5IC0+IDEKK3B3bXg0MjYgcG93ZXIgNiAxNzI4IDE3MjkgLT4gMQorcHdteDQyNyBwb3dlciA3IDE3MjggMTcyOSAtPiA3NDIKK3B3bXg0MjggcG93ZXIgOCAxNzI4IDE3MjkgLT4gMQorcHdteDQyOSBwb3dlciA5IDE3MjggMTcyOSAtPiAxCitwd214NDMwIHBvd2VyIDEwIDE3MjggMTcyOSAtPiAxCitwd214NDMxIHBvd2VyIDExIDE3MjggMTcyOSAtPiAxCitwd214NDMyIHBvd2VyIDEyIDE3MjggMTcyOSAtPiAxCitwd214NDMzIHBvd2VyIDEzIDE3MjggMTcyOSAtPiA1MzMKK3B3bXg0MzQgcG93ZXIgMTQgMTcyOCAxNzI5IC0+IDc0MgorcHdteDQzNSBwb3dlciAxNSAxNzI4IDE3MjkgLT4gMQorcHdteDQzNiBwb3dlciAxNiAxNzI4IDE3MjkgLT4gMQorcHdteDQzNyBwb3dlciAxNyAxNzI4IDE3MjkgLT4gMQorcHdteDQzOCBwb3dlciAxOCAxNzI4IDE3MjkgLT4gMQorcHdteDQzOSBwb3dlciAxOSAxNzI4IDE3MjkgLT4gNDU2Citwd214NDQwIHBvd2VyIDIwIDE3MjggMTcyOSAtPiAxCisKKy0tIHBsdXMgYW5kIG1pbnVzIHplcm8gaW4gdmFyaW91cyByb3VuZGluZyBtb2RlcyAoc2VlIGlzc3VlIDExMTMxKQorZXh0ZW5kZWQ6IDEKK3ByZWNpc2lvbjogOQorbWF4ZXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworcm91bmRpbmc6IGhhbGZfZXZlbgorcGx1eDEwMDAgcGx1cyAwLjAgLT4gMC4wCitwbHV4MTAwMSBwbHVzIC0wLjAgLT4gMC4wCittaW54MTAwMCBtaW51cyAwLjAgLT4gMC4wCittaW54MTAwMSBtaW51cyAtMC4wIC0+IDAuMAorYWJzeDEwMDAgYWJzIDAuMCAtPiAwLjAKK2Fic3gxMDAxIGFicyAtMC4wIC0+IDAuMAorCityb3VuZGluZzogaGFsZl91cAorcGx1eDEwMTAgcGx1cyAwLjAgLT4gMC4wCittaW54MTAxMCBtaW51cyAwLjAgLT4gMC4wCitwbHV4MTAxMSBwbHVzIC0wLjAgLT4gMC4wCittaW54MTAxMSBtaW51cyAtMC4wIC0+IDAuMAorYWJzeDEwMTAgYWJzIDAuMCAtPiAwLjAKK2Fic3gxMDExIGFicyAtMC4wIC0+IDAuMAorCityb3VuZGluZzogY2VpbGluZworcGx1eDEwMjAgcGx1cyAwLjAgLT4gMC4wCittaW54MTAyMCBtaW51cyAwLjAgLT4gMC4wCitwbHV4MTAyMSBwbHVzIC0wLjAgLT4gMC4wCittaW54MTAyMSBtaW51cyAtMC4wIC0+IDAuMAorYWJzeDEwMjAgYWJzIDAuMCAtPiAwLjAKK2Fic3gxMDIxIGFicyAtMC4wIC0+IDAuMAorCityb3VuZGluZzogZmxvb3IKK3BsdXgxMDMwIHBsdXMgMC4wIC0+IDAuMAorbWlueDEwMzAgbWludXMgMC4wIC0+IC0wLjAKK3BsdXgxMDMxIHBsdXMgLTAuMCAtPiAtMC4wCittaW54MTAzMSBtaW51cyAtMC4wIC0+IDAuMAorYWJzeDEwMzAgYWJzIDAuMCAtPiAwLjAKK2Fic3gxMDMxIGFicyAtMC4wIC0+IDAuMAorCityb3VuZGluZzogZG93bgorcGx1eDEwNDAgcGx1cyAwLjAgLT4gMC4wCittaW54MTA0MCBtaW51cyAwLjAgLT4gMC4wCitwbHV4MTA0MSBwbHVzIC0wLjAgLT4gMC4wCittaW54MTA0MSBtaW51cyAtMC4wIC0+IDAuMAorYWJzeDEwNDAgYWJzIDAuMCAtPiAwLjAKK2Fic3gxMDQxIGFicyAtMC4wIC0+IDAuMAorCityb3VuZGluZzogdXAKK3BsdXgxMDUwIHBsdXMgMC4wIC0+IDAuMAorbWlueDEwNTAgbWludXMgMC4wIC0+IDAuMAorcGx1eDEwNTEgcGx1cyAtMC4wIC0+IDAuMAorbWlueDEwNTEgbWludXMgLTAuMCAtPiAwLjAKK2Fic3gxMDUwIGFicyAwLjAgLT4gMC4wCithYnN4MTA1MSBhYnMgLTAuMCAtPiAwLjAKKworcm91bmRpbmc6IGhhbGZfZG93bgorcGx1eDEwNjAgcGx1cyAwLjAgLT4gMC4wCittaW54MTA2MCBtaW51cyAwLjAgLT4gMC4wCitwbHV4MTA2MSBwbHVzIC0wLjAgLT4gMC4wCittaW54MTA2MSBtaW51cyAtMC4wIC0+IDAuMAorYWJzeDEwNjAgYWJzIDAuMCAtPiAwLjAKK2Fic3gxMDYxIGFicyAtMC4wIC0+IDAuMAorCityb3VuZGluZzogMDV1cAorcGx1eDEwNzAgcGx1cyAwLjAgLT4gMC4wCittaW54MTA3MCBtaW51cyAwLjAgLT4gMC4wCitwbHV4MTA3MSBwbHVzIC0wLjAgLT4gMC4wCittaW54MTA3MSBtaW51cyAtMC4wIC0+IDAuMAorYWJzeDEwNzAgYWJzIDAuMCAtPiAwLjAKK2Fic3gxMDcxIGFicyAtMC4wIC0+IDAuMApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9mbWEuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZm1hLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxOTdlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZm1hLmRlY1Rlc3QKQEAgLTAsMCArMSwzNDI2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGZtYS5kZWNUZXN0IC0tIGRlY2ltYWwgZnVzZWQgbXVsdGlwbHkgYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworLS0gVGhlc2UgdGVzdHMgY29tcHJlc2UgdGhyZWUgcGFydHM6CistLSAgIDEuIFNhbml0eSBjaGVja3MgYW5kIG90aGVyIHRocmVlLW9wZXJhbmQgdGVzdHMgKGVzcGVjaWFsbHkgdGhvc2UKKy0tICAgICAgd2hlcmUgdGhlIGZ1c2VkIG9wZXJhdGlvbiBtYWtlcyBhIGRpZmZlcmVuY2UpCistLSAgIDIuIE11bHRpcGx5IHRlc3RzICh0aGlyZCBvcGVyYW5kIGlzIG5ldXRyYWwgemVybyBbMEUrZW1heF0pCistLSAgIDMuIEFkZGl0aW9uIHRlc3RzIChmaXJzdCBvcGVyYW5kIGlzIDEpCistLSBUaGUgbXVsdGlwbHkgYW5kIGFkZGl0aW9uIHRlc3RzIGFyZSBleHRlbnNpdmUgYmVjYXVzZSBGTUEgbWF5IGhhdmUKKy0tIGl0cyBvd24gZGVkaWNhdGVkIG11bHRpcGxpY2F0aW9uIG9yIGFkZGl0aW9uIHJvdXRpbmUocyksIGFuZCB0aGV5CistLSBhbHNvIGluaGVyZW50bHkgY2hlY2sgdGhlIGxlZnQtdG8tcmlnaHQgcHJvcGVydGllcy4KKworLS0gU2FuaXR5IGNoZWNrcworZm1heDAwMDEgZm1hICAxICAgMSAgIDEgLT4gICAyCitmbWF4MDAwMiBmbWEgIDEgICAxICAgMiAtPiAgIDMKK2ZtYXgwMDAzIGZtYSAgMiAgIDIgICAzIC0+ICAgNworZm1heDAwMDQgZm1hICA5ICAgOSAgIDkgLT4gIDkwCitmbWF4MDAwNSBmbWEgLTEgICAxICAgMSAtPiAgIDAKK2ZtYXgwMDA2IGZtYSAtMSAgIDEgICAyIC0+ICAgMQorZm1heDAwMDcgZm1hIC0yICAgMiAgIDMgLT4gIC0xCitmbWF4MDAwOCBmbWEgLTkgICA5ICAgOSAtPiAtNzIKK2ZtYXgwMDExIGZtYSAgMSAgLTEgICAxIC0+ICAgMAorZm1heDAwMTIgZm1hICAxICAtMSAgIDIgLT4gICAxCitmbWF4MDAxMyBmbWEgIDIgIC0yICAgMyAtPiAgLTEKK2ZtYXgwMDE0IGZtYSAgOSAgLTkgICA5IC0+IC03MgorZm1heDAwMTUgZm1hICAxICAgMSAgLTEgLT4gICAwCitmbWF4MDAxNiBmbWEgIDEgICAxICAtMiAtPiAgLTEKK2ZtYXgwMDE3IGZtYSAgMiAgIDIgIC0zIC0+ICAgMQorZm1heDAwMTggZm1hICA5ICAgOSAgLTkgLT4gIDcyCitmbWF4MDAxOSBmbWEgIDMgICA1ICAgNyAtPiAgMjIKK2ZtYXgwMDI5IGZtYSAgMyAgLTUgICA3IC0+ICAtOAorCistLSBub24taW50ZWdlciBleGFjdHMKK2ZtYTAxMDAgIGZtYSAgICAyNS4yICAgNjMuNiAgIC00MzggIC0+ICAxMTY0LjcyCitmbWEwMTAxICBmbWEgICAwLjMwMSAgMC4zODAgICAgMzM0ICAtPiAgMzM0LjExNDM4MAorZm1hMDEwMiAgZm1hICAgIDQ5LjIgICAtNC44ICAgMjMuMyAgLT4gIC0yMTIuODYKK2ZtYTAxMDMgIGZtYSAgICA0LjIyICAwLjA3OSAgLTk0LjYgIC0+ICAtOTQuMjY2NjIKK2ZtYTAxMDQgIGZtYSAgICAgOTAzICAwLjc5NyAgMC44ODcgIC0+ICA3MjAuNTc4CitmbWEwMTA1ICBmbWEgICAgNi4xMyAgIC0xNjEgICA2NS45ICAtPiAgLTkyMS4wMworZm1hMDEwNiAgZm1hICAgIDI4LjIgICAgNzI3ICAgNS40NSAgLT4gIDIwNTA2Ljg1CitmbWEwMTA3ICBmbWEgICAgICAgNCAgICA2MDUgICAgNjg4ICAtPiAgMzEwOAorZm1hMDEwOCAgZm1hICAgIDkzLjMgICAwLjE5ICAwLjIyNiAgLT4gIDE3Ljk1MworZm1hMDEwOSAgZm1hICAgMC4xNjkgICAtMzQxICAgNS42MSAgLT4gIC01Mi4wMTkKK2ZtYTAxMTAgIGZtYSAgIC03Mi4yICAgICAzMCAgLTUxLjIgIC0+ICAtMjIxNy4yCitmbWEwMTExICBmbWEgIC0wLjQwOSAgICAgMTMgICAyMC40ICAtPiAgMTUuMDgzCitmbWEwMTEyICBmbWEgICAgIDMxNyAgIDc3LjAgICAxOS4wICAtPiAgMjQ0MjguMAorZm1hMDExMyAgZm1hICAgICAgNDcgICA2LjU4ICAgMS42MiAgLT4gIDMxMC44OAorZm1hMDExNCAgZm1hICAgIDEuMzYgIDAuOTg0ICAwLjQ5MyAgLT4gIDEuODMxMjQKK2ZtYTAxMTUgIGZtYSAgICA3Mi43ICAgIDI3NCAgIDEuNTYgIC0+ICAxOTkyMS4zNgorZm1hMDExNiAgZm1hICAgICAzMzUgICAgODQ3ICAgICA4MyAgLT4gIDI4MzgyOAorZm1hMDExNyAgZm1hICAgICA2NjYgIDAuMjQ3ICAgMjUuNCAgLT4gIDE4OS45MDIKK2ZtYTAxMTggIGZtYSAgIC0zLjg3ICAgMy4wNiAgIDc4LjAgIC0+ICA2Ni4xNTc4CitmbWEwMTE5ICBmbWEgICAwLjc0MiAgICAxOTIgICAzNS42ICAtPiAgMTc4LjA2NAorZm1hMDEyMCAgZm1hICAgLTkxLjYgICA1LjI5ICAwLjE1MyAgLT4gIC00ODQuNDExCisKKy0tIGNhc2VzIHdoZXJlIHJlc3VsdCBpcyBkaWZmZXJlbnQgZnJvbSBzZXBhcmF0ZSBtdWx0aXBseSArIGFkZDsgZWFjaAorLS0gaXMgcHJlY2VkZWQgYnkgdGhlIHJlc3VsdCBvZiB1bmZ1c2VkIG11bHRpcGx5IGFuZCBhZGQKKy0tIFt0aGlzIGlzIGFib3V0IDIwJSBvZiBhbGwgc2ltaWxhciAgY2FzZXMgaW4gZ2VuZXJhbF0KKy0tICAgICAgICAgICAgICAgODg4NTY1MjkwICAgMTU1Ny45NjkzMCAgLTg2MDg3Ljc1NzggIC0+IDEuMzg0MzU3MzVFKzEyCitmbWEwMjAxICBmbWEgICAgIDg4ODU2NTI5MCAgIDE1NTcuOTY5MzAgIC04NjA4Ny43NTc4ICAtPiAxLjM4NDM1NzM2RSsxMiAgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAtODU1MTkzNDIuOSAgICA3MzUxNTU0MTkgICAgIDQyMDEwNDMxICAtPiAtNi4yODcwMDA4NEUrMTYKK2ZtYTAyMDUgIGZtYSAgIC04NTUxOTM0Mi45ICAgIDczNTE1NTQxOSAgICAgNDIwMTA0MzEgIC0+IC02LjI4NzAwMDgzRSsxNiBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgIC05ODAyNS41ICAtMjk0NjAzLjQ3MiAgIDEwNDE0MzQ4LjIgIC0+IDIuODg4OTA2NjlFKzEwCitmbWEwMjA4ICBmbWEgICAgICAtOTgwMjUuNSAgLTI5NDYwMy40NzIgICAxMDQxNDM0OC4yICAtPiAyLjg4ODkwNjcwRSsxMCAgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgNTk2NzYyNy4zOSAgIDgzNTI2NTQwLjYgICA0OTg0OTQuODEwICAtPiA0Ljk4NDU1MjcxRSsxNAorZm1hMDIxMSAgZm1hICAgIDU5Njc2MjcuMzkgICA4MzUyNjU0MC42ICAgNDk4NDk0LjgxMCAgLT4gNC45ODQ1NTI3MkUrMTQgIEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAzNDU2Ljk0MzMgICAgODc0LjM5NTE4ICAgMTk3ODY2LjYxNSAgLT4gIDMyMjA2MDEuMTgKK2ZtYTAyMTYgIGZtYSAgICAgMzQ1Ni45NDMzICAgIDg3NC4zOTUxOCAgIDE5Nzg2Ni42MTUgIC0+ICAzMjIwNjAxLjE3ICAgICBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICA2Mjc2OS44Mjg3ICAgMjA5Ni45ODkyNyAgICA0OC40MjAzMTcgIC0+ICAxMzE2Mjc3MDUKK2ZtYTAyMTggIGZtYSAgICA2Mjc2OS44Mjg3ICAgMjA5Ni45ODkyNyAgICA0OC40MjAzMTcgIC0+ICAxMzE2Mjc3MDYgICAgICBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgLTY4LjgxNTAwICAgNTk5NjExMTMuOSAgICAgLTg5ODg4NjIgIC0+IC00LjEzNTIxMjkxRSs5CitmbWEwMjE5ICBmbWEgICAgIC02OC44MTUwMCAgIDU5OTYxMTEzLjkgICAgIC04OTg4ODYyICAtPiAtNC4xMzUyMTI5MkUrOSAgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgMjEyNjM0MS4wMiAgIDYzNDkxLjUxNTIgICAgMzAyNDI3NDU1ICAtPiAxLjM1MzA3MDQwRSsxMQorZm1hMDIyNiAgZm1hICAgIDIxMjYzNDEuMDIgICA2MzQ5MS41MTUyICAgIDMwMjQyNzQ1NSAgLT4gMS4zNTMwNzA0MUUrMTEgIEluZXhhY3QgUm91bmRlZAorCisKKy0tIEluZmluaXRlIGNvbWJpbmF0aW9ucworZm1heDA4MDAgZm1hICBJbmYgICBJbmYgICBJbmYgICAgLT4gIEluZmluaXR5CitmbWF4MDgwMSBmbWEgIEluZiAgIEluZiAgLUluZiAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MDgwMiBmbWEgIEluZiAgLUluZiAgIEluZiAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MDgwMyBmbWEgIEluZiAgLUluZiAgLUluZiAgICAtPiAtSW5maW5pdHkKK2ZtYXgwODA0IGZtYSAtSW5mICAgSW5mICAgSW5mICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgwODA1IGZtYSAtSW5mICAgSW5mICAtSW5mICAgIC0+IC1JbmZpbml0eQorZm1heDA4MDYgZm1hIC1JbmYgIC1JbmYgICBJbmYgICAgLT4gIEluZmluaXR5CitmbWF4MDgwNyBmbWEgLUluZiAgLUluZiAgLUluZiAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MDgwOCBmbWEgLUluZiAgIDAgICAgICAgMSAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MDgwOSBmbWEgLUluZiAgIDAgICAgIE5hTiAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIFRyaXBsZSBOYU4gcHJvcGFnYXRpb24KK2ZtYXgwOTAwIGZtYSAgTmFOMiAgTmFOMyAgTmFONSAgIC0+ICBOYU4yCitmbWF4MDkwMSBmbWEgIDAgICAgIE5hTjMgIE5hTjUgICAtPiAgTmFOMworZm1heDA5MDIgZm1hICAwICAgICAwICAgICBOYU41ICAgLT4gIE5hTjUKKy0tIGZpcnN0IHNOYU4gd2lucyAoY29uc2lkZXIgcU5hTiBmcm9tIGVhcmxpZXIgc05hTiBiZWluZworLS0gb3ZlcnJpZGRlbiBieSBhbiBzTmFOIGluIHRoaXJkIG9wZXJhbmQpCitmbWF4MDkwMyBmbWEgIHNOYU4xIHNOYU4yIHNOYU4zICAtPiAgTmFOMSBJbnZhbGlkX29wZXJhdGlvbgorZm1heDA5MDQgZm1hICAwICAgICBzTmFOMiBzTmFOMyAgLT4gIE5hTjIgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgwOTA1IGZtYSAgMCAgICAgMCAgICAgc05hTjMgIC0+ICBOYU4zIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MDkwNiBmbWEgIHNOYU4xIHNOYU4yIHNOYU4zICAtPiAgTmFOMSBJbnZhbGlkX29wZXJhdGlvbgorZm1heDA5MDcgZm1hICBOYU43ICBzTmFOMiBzTmFOMyAgLT4gIE5hTjIgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgwOTA4IGZtYSAgTmFONyAgTmFONSAgc05hTjMgIC0+ICBOYU4zIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE1VTFRJUExJQ0FUSU9OIFRFU1RTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gc2FuaXR5IGNoZWNrcyAoYXMgYmFzZSwgYWJvdmUpCitmbWF4MjAwMCBmbWEgMiAgICAgIDIgIDBFKzk5OTk5OSAgLT4gNAorZm1heDIwMDEgZm1hIDIgICAgICAzICAwRSs5OTk5OTkgIC0+IDYKK2ZtYXgyMDAyIGZtYSA1ICAgICAgMSAgMEUrOTk5OTk5ICAtPiA1CitmbWF4MjAwMyBmbWEgNSAgICAgIDIgIDBFKzk5OTk5OSAgLT4gMTAKK2ZtYXgyMDA0IGZtYSAxLjIwICAgMiAgMEUrOTk5OTk5ICAtPiAyLjQwCitmbWF4MjAwNSBmbWEgMS4yMCAgIDAgIDBFKzk5OTk5OSAgLT4gMC4wMAorZm1heDIwMDYgZm1hIDEuMjAgIC0yICAwRSs5OTk5OTkgIC0+IC0yLjQwCitmbWF4MjAwNyBmbWEgLTEuMjAgIDIgIDBFKzk5OTk5OSAgLT4gLTIuNDAKK2ZtYXgyMDA4IGZtYSAtMS4yMCAgMCAgMEUrOTk5OTk5ICAtPiAwLjAwCitmbWF4MjAwOSBmbWEgLTEuMjAgLTIgIDBFKzk5OTk5OSAgLT4gMi40MAorZm1heDIwMTAgZm1hIDUuMDkgNy4xICAwRSs5OTk5OTkgIC0+IDM2LjEzOQorZm1heDIwMTEgZm1hIDIuNSAgICA0ICAwRSs5OTk5OTkgIC0+IDEwLjAKK2ZtYXgyMDEyIGZtYSAyLjUwICAgNCAgMEUrOTk5OTk5ICAtPiAxMC4wMAorZm1heDIwMTMgZm1hIDEuMjM0NTY3ODkgMS4wMDAwMDAwMCAgMEUrOTk5OTk5ICAtPiAxLjIzNDU2Nzg5IFJvdW5kZWQKK2ZtYXgyMDE0IGZtYSA5Ljk5OTk5OTk5OSA5Ljk5OTk5OTk5OSAgMEUrOTk5OTk5ICAtPiAxMDAuMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDIwMTUgZm1hIDIuNTAgICA0ICAwRSs5OTk5OTkgIC0+IDEwLjAwCitwcmVjaXNpb246IDYKK2ZtYXgyMDE2IGZtYSAyLjUwICAgNCAgMEUrOTk5OTk5ICAtPiAxMC4wMAorZm1heDIwMTcgZm1hICA5Ljk5OTk5OSAgOS45OTk5OTkgIDBFKzk5OTk5OSAgLT4gIDEwMC4wMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MjAxOCBmbWEgIDkuOTk5OTk5IC05Ljk5OTk5OSAgMEUrOTk5OTk5ICAtPiAtMTAwLjAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyMDE5IGZtYSAtOS45OTk5OTkgIDkuOTk5OTk5ICAwRSs5OTk5OTkgIC0+IC0xMDAuMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDIwMjAgZm1hIC05Ljk5OTk5OSAtOS45OTk5OTkgIDBFKzk5OTk5OSAgLT4gIDEwMC4wMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIDE5OTkuMTIuMjE6IG5leHQgb25lIGlzIGEgZWRnZSBjYXNlIGlmIGludGVybWVkaWF0ZSBsb25ncyBhcmUgdXNlZAorcHJlY2lzaW9uOiAxNQorZm1heDIwNTkgZm1hIDk5OTk5OTk5OTk5OSA5NzY1NjI1ICAwRSs5OTk5OTkgIC0+IDkuNzY1NjI0OTk5OTkwMjNFKzE4IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMAorZm1heDIxNjAgZm1hIDk5OTk5OTk5OTk5OSA5NzY1NjI1ICAwRSs5OTk5OTkgIC0+IDk3NjU2MjQ5OTk5OTAyMzQzNzUKK3ByZWNpc2lvbjogOQorLS0tLS0KKworLS0gemVyb3MsIGV0Yy4KK2ZtYXgyMDIxIGZtYSAgMCAgICAgIDAgICAgICAwRSs5OTk5OTkgIC0+ICAwCitmbWF4MjAyMiBmbWEgIDAgICAgIC0wICAgICAgMEUrOTk5OTk5ICAtPiAgMAorZm1heDIwMjMgZm1hIC0wICAgICAgMCAgICAgIDBFKzk5OTk5OSAgLT4gIDAKK2ZtYXgyMDI0IGZtYSAtMCAgICAgLTAgICAgICAwRSs5OTk5OTkgIC0+ICAwCitmbWF4MjAyNSBmbWEgLTAuMCAgIC0wLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wMAorZm1heDIwMjYgZm1hIC0wLjAgICAtMC4wICAgIDBFKzk5OTk5OSAgLT4gIDAuMDAKK2ZtYXgyMDI3IGZtYSAtMC4wICAgLTAuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAwCitmbWF4MjAyOCBmbWEgLTAuMCAgIC0wLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wMAorZm1heDIwMzAgZm1hICA1LjAwICAgMUUtMyAgIDBFKzk5OTk5OSAgLT4gIDAuMDA1MDAKK2ZtYXgyMDMxIGZtYSAgMDAuMDAgIDAuMDAwICAwRSs5OTk5OTkgIC0+ICAwLjAwMDAwCitmbWF4MjAzMiBmbWEgIDAwLjAwICAwRS0zICAgMEUrOTk5OTk5ICAtPiAgMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2ZtYXgyMDMzIGZtYSAgMEUtMyAgIDAwLjAwICAwRSs5OTk5OTkgIC0+ICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorZm1heDIwMzQgZm1hIC01LjAwICAgMUUtMyAgIDBFKzk5OTk5OSAgLT4gLTAuMDA1MDAKK2ZtYXgyMDM1IGZtYSAtMDAuMDAgIDAuMDAwICAwRSs5OTk5OTkgIC0+ICAwLjAwMDAwCitmbWF4MjAzNiBmbWEgLTAwLjAwICAwRS0zICAgMEUrOTk5OTk5ICAtPiAgMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2ZtYXgyMDM3IGZtYSAtMEUtMyAgIDAwLjAwICAwRSs5OTk5OTkgIC0+ICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorZm1heDIwMzggZm1hICA1LjAwICAtMUUtMyAgIDBFKzk5OTk5OSAgLT4gLTAuMDA1MDAKK2ZtYXgyMDM5IGZtYSAgMDAuMDAgLTAuMDAwICAwRSs5OTk5OTkgIC0+ICAwLjAwMDAwCitmbWF4MjA0MCBmbWEgIDAwLjAwIC0wRS0zICAgMEUrOTk5OTk5ICAtPiAgMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2ZtYXgyMDQxIGZtYSAgMEUtMyAgLTAwLjAwICAwRSs5OTk5OTkgIC0+ICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorZm1heDIwNDIgZm1hIC01LjAwICAtMUUtMyAgIDBFKzk5OTk5OSAgLT4gIDAuMDA1MDAKK2ZtYXgyMDQzIGZtYSAtMDAuMDAgLTAuMDAwICAwRSs5OTk5OTkgIC0+ICAwLjAwMDAwCitmbWF4MjA0NCBmbWEgLTAwLjAwIC0wRS0zICAgMEUrOTk5OTk5ICAtPiAgMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2ZtYXgyMDQ1IGZtYSAtMEUtMyAgLTAwLjAwICAwRSs5OTk5OTkgIC0+ICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorCistLSBleGFtcGxlcyBmcm9tIGRlY2FyaXRoIG11bHRpcGx5CitmbWF4MjA1MCBmbWEgMS4yMCAzICAgICAgICAgMEUrOTk5OTk5ICAtPiAzLjYwCitmbWF4MjA1MSBmbWEgNyAgICAzICAgICAgICAgMEUrOTk5OTk5ICAtPiAyMQorZm1heDIwNTIgZm1hIDAuOSAgMC44ICAgICAgIDBFKzk5OTk5OSAgLT4gMC43MgorZm1heDIwNTMgZm1hIDAuOSAgLTAgICAgICAgIDBFKzk5OTk5OSAgLT4gMC4wCitmbWF4MjA1NCBmbWEgNjU0MzIxIDY1NDMyMSAgMEUrOTk5OTk5ICAtPiA0LjI4MTM1OTcxRSsxMSAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgyMDYwIGZtYSAxMjMuNDUgMWU3ICAgMEUrOTk5OTk5ICAtPiAgMS4yMzQ1RSs5CitmbWF4MjA2MSBmbWEgMTIzLjQ1IDFlOCAgIDBFKzk5OTk5OSAgLT4gIDEuMjM0NUUrMTAKK2ZtYXgyMDYyIGZtYSAxMjMuNDUgMWUrOSAgMEUrOTk5OTk5ICAtPiAgMS4yMzQ1RSsxMQorZm1heDIwNjMgZm1hIDEyMy40NSAxZTEwICAwRSs5OTk5OTkgIC0+ICAxLjIzNDVFKzEyCitmbWF4MjA2NCBmbWEgMTIzLjQ1IDFlMTEgIDBFKzk5OTk5OSAgLT4gIDEuMjM0NUUrMTMKK2ZtYXgyMDY1IGZtYSAxMjMuNDUgMWUxMiAgMEUrOTk5OTk5ICAtPiAgMS4yMzQ1RSsxNAorZm1heDIwNjYgZm1hIDEyMy40NSAxZTEzICAwRSs5OTk5OTkgIC0+ICAxLjIzNDVFKzE1CisKKworLS0gdGVzdCBzb21lIGludGVybWVkaWF0ZSBsZW5ndGhzCitwcmVjaXNpb246IDkKK2ZtYXgyMDgwIGZtYSAwLjEgMTIzNDU2Nzg5ICAgICAgICAgICAwRSs5OTk5OTkgIC0+IDEyMzQ1Njc4LjkKK2ZtYXgyMDgxIGZtYSAwLjEgMTIzNDU2Nzg5MSAgICAgICAgICAwRSs5OTk5OTkgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyMDgyIGZtYSAwLjEgMTIzNDU2Nzg5MTIgICAgICAgICAwRSs5OTk5OTkgIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MjA4MyBmbWEgMC4xIDEyMzQ1Njc4OTEyMzQ1ICAgICAgMEUrOTk5OTk5ICAtPiAxLjIzNDU2Nzg5RSsxMiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyMDg0IGZtYSAwLjEgMTIzNDU2Nzg5ICAgICAgICAgICAwRSs5OTk5OTkgIC0+IDEyMzQ1Njc4LjkKK3ByZWNpc2lvbjogOAorZm1heDIwODUgZm1hIDAuMSAxMjM0NTY3ODkxMiAgICAgICAgIDBFKzk5OTk5OSAgLT4gMS4yMzQ1Njc5RSs5IEluZXhhY3QgUm91bmRlZAorZm1heDIwODYgZm1hIDAuMSAxMjM0NTY3ODkxMjM0NSAgICAgIDBFKzk5OTk5OSAgLT4gMS4yMzQ1Njc5RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNworZm1heDIwODcgZm1hIDAuMSAxMjM0NTY3ODkxMiAgICAgICAgIDBFKzk5OTk5OSAgLT4gMS4yMzQ1NjhFKzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MjA4OCBmbWEgMC4xIDEyMzQ1Njc4OTEyMzQ1ICAgICAgMEUrOTk5OTk5ICAtPiAxLjIzNDU2OEUrMTIgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogOQorZm1heDIwOTAgZm1hIDEyMzQ1Njc4OSAgICAgICAgICAwLjEgIDBFKzk5OTk5OSAgLT4gMTIzNDU2NzguOQorZm1heDIwOTEgZm1hIDEyMzQ1Njc4OTEgICAgICAgICAwLjEgIDBFKzk5OTk5OSAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorZm1heDIwOTIgZm1hIDEyMzQ1Njc4OTEyICAgICAgICAwLjEgIDBFKzk5OTk5OSAgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyMDkzIGZtYSAxMjM0NTY3ODkxMjM0NSAgICAgMC4xICAwRSs5OTk5OTkgIC0+IDEuMjM0NTY3ODlFKzEyIEluZXhhY3QgUm91bmRlZAorZm1heDIwOTQgZm1hIDEyMzQ1Njc4OSAgICAgICAgICAwLjEgIDBFKzk5OTk5OSAgLT4gMTIzNDU2NzguOQorcHJlY2lzaW9uOiA4CitmbWF4MjA5NSBmbWEgMTIzNDU2Nzg5MTIgICAgICAgIDAuMSAgMEUrOTk5OTk5ICAtPiAxLjIzNDU2NzlFKzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MjA5NiBmbWEgMTIzNDU2Nzg5MTIzNDUgICAgIDAuMSAgMEUrOTk5OTk5ICAtPiAxLjIzNDU2NzlFKzEyIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA3CitmbWF4MjA5NyBmbWEgMTIzNDU2Nzg5MTIgICAgICAgIDAuMSAgMEUrOTk5OTk5ICAtPiAxLjIzNDU2OEUrOSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyMDk4IGZtYSAxMjM0NTY3ODkxMjM0NSAgICAgMC4xICAwRSs5OTk5OTkgIC0+IDEuMjM0NTY4RSsxMiBJbmV4YWN0IFJvdW5kZWQKKworLS0gdGVzdCBzb21lIG1vcmUgZWRnZSBjYXNlcyBhbmQgY2FycmllcworbWF4ZXhwb25lbnQ6IDk5OTkKK21pbmV4cG9uZW50OiAtOTk5OQorcHJlY2lzaW9uOiAzMworZm1heDIxMDEgZm1hIDkgOSAgICAwRSs5OTk5OTkgIC0+IDgxCitmbWF4MjEwMiBmbWEgOSA5MCAgICAwRSs5OTk5OTkgIC0+IDgxMAorZm1heDIxMDMgZm1hIDkgOTAwICAgIDBFKzk5OTk5OSAgLT4gODEwMAorZm1heDIxMDQgZm1hIDkgOTAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwCitmbWF4MjEwNSBmbWEgOSA5MDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMAorZm1heDIxMDYgZm1hIDkgOTAwMDAwICAgIDBFKzk5OTk5OSAgLT4gODEwMDAwMAorZm1heDIxMDcgZm1hIDkgOTAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwCitmbWF4MjEwOCBmbWEgOSA5MDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMAorZm1heDIxMDkgZm1hIDkgOTAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gODEwMDAwMDAwMAorZm1heDIxMTAgZm1hIDkgOTAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwCitmbWF4MjExMSBmbWEgOSA5MDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMAorZm1heDIxMTIgZm1hIDkgOTAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gODEwMDAwMDAwMDAwMAorZm1heDIxMTMgZm1hIDkgOTAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMDAwCitmbWF4MjExNCBmbWEgOSA5MDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMDAwMAorZm1heDIxMTUgZm1hIDkgOTAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gODEwMDAwMDAwMDAwMDAwMAorZm1heDIxMTYgZm1hIDkgOTAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMDAwMDAwCitmbWF4MjExNyBmbWEgOSA5MDAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMAorZm1heDIxMTggZm1hIDkgOTAwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMAorZm1heDIxMTkgZm1hIDkgOTAwMDAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwCitmbWF4MjEyMCBmbWEgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMAorZm1heDIxMjEgZm1hIDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMAorZm1heDIxMjIgZm1hIDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitmbWF4MjEyMyBmbWEgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorLS0gdGVzdCBzb21lIG1vcmUgZWRnZSBjYXNlcyB3aXRob3V0IGNhcnJpZXMKK2ZtYXgyMTMxIGZtYSAzIDMgICAgMEUrOTk5OTk5ICAtPiA5CitmbWF4MjEzMiBmbWEgMyAzMCAgICAwRSs5OTk5OTkgIC0+IDkwCitmbWF4MjEzMyBmbWEgMyAzMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAKK2ZtYXgyMTM0IGZtYSAzIDMwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwCitmbWF4MjEzNSBmbWEgMyAzMDAwMCAgICAwRSs5OTk5OTkgIC0+IDkwMDAwCitmbWF4MjEzNiBmbWEgMyAzMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAKK2ZtYXgyMTM3IGZtYSAzIDMwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwCitmbWF4MjEzOCBmbWEgMyAzMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDkwMDAwMDAwCitmbWF4MjEzOSBmbWEgMyAzMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAKK2ZtYXgyMTQwIGZtYSAzIDMwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwCitmbWF4MjE0MSBmbWEgMyAzMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDkwMDAwMDAwMDAwCitmbWF4MjE0MiBmbWEgMyAzMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMDAKK2ZtYXgyMTQzIGZtYSAzIDMwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMDAwCitmbWF4MjE0NCBmbWEgMyAzMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDkwMDAwMDAwMDAwMDAwCitmbWF4MjE0NSBmbWEgMyAzMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMDAwMDAKK2ZtYXgyMTQ2IGZtYSAzIDMwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMDAwMDAwCitmbWF4MjE0NyBmbWEgMyAzMDAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDkwMDAwMDAwMDAwMDAwMDAwCitmbWF4MjE0OCBmbWEgMyAzMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAKK2ZtYXgyMTQ5IGZtYSAzIDMwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwCitmbWF4MjE1MCBmbWEgMyAzMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDkwMDAwMDAwMDAwMDAwMDAwMDAwCitmbWF4MjE1MSBmbWEgMyAzMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwMDAKK2ZtYXgyMTUyIGZtYSAzIDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwCitmbWF4MjE1MyBmbWEgMyAzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKK21heGV4cG9uZW50OiA5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5CitwcmVjaXNpb246IDkKKy0tIHRlc3Qgc29tZSBjYXNlcyB0aGF0IGFyZSBjbG9zZSB0byBleHBvbmVudCBvdmVyZmxvdy91bmRlcmZsb3cKK2ZtYXgyMTcwIGZtYSAxIDllOTk5OTk5ICAgICAwRSs5OTk5OTkgIC0+IDlFKzk5OTk5OQorZm1heDIxNzEgZm1hIDEgOS45ZTk5OTk5OSAgIDBFKzk5OTk5OSAgLT4gOS45RSs5OTk5OTkKK2ZtYXgyMTcyIGZtYSAxIDkuOTllOTk5OTk5ICAwRSs5OTk5OTkgIC0+IDkuOTlFKzk5OTk5OQorZm1heDIxNzMgZm1hIDllOTk5OTk5ICAgIDEgIDBFKzk5OTk5OSAgLT4gOUUrOTk5OTk5CitmbWF4MjE3NCBmbWEgOS45ZTk5OTk5OSAgMSAgMEUrOTk5OTk5ICAtPiA5LjlFKzk5OTk5OQorZm1heDIxNzYgZm1hIDkuOTllOTk5OTk5IDEgIDBFKzk5OTk5OSAgLT4gOS45OUUrOTk5OTk5CitmbWF4MjE3NyBmbWEgMSA5Ljk5OTk5ZTk5OTk5OSAgMEUrOTk5OTk5ICAtPiA5Ljk5OTk5RSs5OTk5OTkKK2ZtYXgyMTc4IGZtYSA5Ljk5OTk5ZTk5OTk5OSAxICAwRSs5OTk5OTkgIC0+IDkuOTk5OTlFKzk5OTk5OQorCitmbWF4MjE4MCBmbWEgMC4xIDllLTk5OTk5OCAgICAwRSs5OTk5OTkgIC0+IDlFLTk5OTk5OQorZm1heDIxODEgZm1hIDAuMSA5OWUtOTk5OTk4ICAgMEUrOTk5OTk5ICAtPiA5LjlFLTk5OTk5OAorZm1heDIxODIgZm1hIDAuMSA5OTllLTk5OTk5OCAgMEUrOTk5OTk5ICAtPiA5Ljk5RS05OTk5OTcKKworZm1heDIxODMgZm1hIDAuMSA5ZS05OTk5OTggICAgICAwRSs5OTk5OTkgIC0+IDlFLTk5OTk5OQorZm1heDIxODQgZm1hIDAuMSA5OWUtOTk5OTk4ICAgICAwRSs5OTk5OTkgIC0+IDkuOUUtOTk5OTk4CitmbWF4MjE4NSBmbWEgMC4xIDk5OWUtOTk5OTk4ICAgIDBFKzk5OTk5OSAgLT4gOS45OUUtOTk5OTk3CitmbWF4MjE4NiBmbWEgMC4xIDk5OWUtOTk5OTk3ICAgIDBFKzk5OTk5OSAgLT4gOS45OUUtOTk5OTk2CitmbWF4MjE4NyBmbWEgMC4xIDk5OTllLTk5OTk5NyAgIDBFKzk5OTk5OSAgLT4gOS45OTlFLTk5OTk5NQorZm1heDIxODggZm1hIDAuMSA5OTk5OWUtOTk5OTk3ICAwRSs5OTk5OTkgIC0+IDkuOTk5OUUtOTk5OTk0CisKK2ZtYXgyMTkwIGZtYSAxIDllLTk5OTk5OCAgICAwRSs5OTk5OTkgIC0+IDlFLTk5OTk5OAorZm1heDIxOTEgZm1hIDEgOTllLTk5OTk5OCAgIDBFKzk5OTk5OSAgLT4gOS45RS05OTk5OTcKK2ZtYXgyMTkyIGZtYSAxIDk5OWUtOTk5OTk4ICAwRSs5OTk5OTkgIC0+IDkuOTlFLTk5OTk5NgorZm1heDIxOTMgZm1hIDllLTk5OTk5OCAgIDEgIDBFKzk5OTk5OSAgLT4gOUUtOTk5OTk4CitmbWF4MjE5NCBmbWEgOTllLTk5OTk5OCAgMSAgMEUrOTk5OTk5ICAtPiA5LjlFLTk5OTk5NworZm1heDIxOTUgZm1hIDk5OWUtOTk5OTk4IDEgIDBFKzk5OTk5OSAgLT4gOS45OUUtOTk5OTk2CisKKy0tIGxvbmcgb3BlcmFuZCB0cmlhbmdsZQorcHJlY2lzaW9uOiAzMworZm1heDIyNDYgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUxMTk5MjgzMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzIKK2ZtYXgyMjQ3IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MTE5OTI4MyAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMxCitmbWF4MjI0OCBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTExOTkyOCAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMAorZm1heDIyNDkgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUxMTk5MyAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjkKK2ZtYXgyMjUwIGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MTE5OSAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI4CitmbWF4MjI1MSBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTEyMCAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNworZm1heDIyNTIgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUxMiAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjYKK2ZtYXgyMjUzIGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MSAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI1CitmbWF4MjI1NCBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNAorZm1heDIyNTUgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNyAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjMKK2ZtYXgyMjU2IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MiAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIyCitmbWF4MjI1NyBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOSAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMQorZm1heDIyNTggZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MiAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjAKK2ZtYXgyMjU5IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NyAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE5CitmbWF4MjI2MCBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NyAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxOAorZm1heDIyNjEgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MzM3MCAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTcKK2ZtYXgyMjYyIGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMzNyAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE2CitmbWF4MjI2MyBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkzNCAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNQorZm1heDIyNjQgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MyAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTQKK2ZtYXgyMjY1IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOSAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEzCitmbWF4MjI2NiBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMiAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMgorZm1heDIyNjcgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMSAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTEKK2ZtYXgyMjY4IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MCAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEwCitmbWF4MjI2OSBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwOCAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgOQorZm1heDIyNzAgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MSAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDgKK2ZtYXgyMjcxIGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOSAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA3CitmbWF4MjI3MiBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNgorZm1heDIyNzMgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNQorZm1heDIyNzQgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMS40NTQzRSs1ICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNAorZm1heDIyNzUgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMS40NTRFKzUgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAzCitmbWF4MjI3NiBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxLjQ1RSs1ICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMgorZm1heDIyNzcgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMS41RSs1ICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMQorZm1heDIyNzggZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMUUrNSAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRlc3Qgc29tZSBlZGdlIGNhc2VzIHdpdGggZXhhY3Qgcm91bmRpbmcKK21heGV4cG9uZW50OiA5OTk5CittaW5leHBvbmVudDogLTk5OTkKK3ByZWNpc2lvbjogOQorZm1heDIzMDEgZm1hIDkgOSAgICAwRSs5OTk5OTkgIC0+IDgxCitmbWF4MjMwMiBmbWEgOSA5MCAgICAwRSs5OTk5OTkgIC0+IDgxMAorZm1heDIzMDMgZm1hIDkgOTAwICAgIDBFKzk5OTk5OSAgLT4gODEwMAorZm1heDIzMDQgZm1hIDkgOTAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwCitmbWF4MjMwNSBmbWEgOSA5MDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMAorZm1heDIzMDYgZm1hIDkgOTAwMDAwICAgIDBFKzk5OTk5OSAgLT4gODEwMDAwMAorZm1heDIzMDcgZm1hIDkgOTAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwCitmbWF4MjMwOCBmbWEgOSA5MDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMAorZm1heDIzMDkgZm1hIDkgOTAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrOSAgIFJvdW5kZWQKK2ZtYXgyMzEwIGZtYSA5IDkwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4LjEwMDAwMDAwRSsxMCAgUm91bmRlZAorZm1heDIzMTEgZm1hIDkgOTAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4LjEwMDAwMDAwRSsxMSAgUm91bmRlZAorZm1heDIzMTIgZm1hIDkgOTAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMTIgIFJvdW5kZWQKK2ZtYXgyMzEzIGZtYSA5IDkwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4LjEwMDAwMDAwRSsxMyAgUm91bmRlZAorZm1heDIzMTQgZm1hIDkgOTAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4LjEwMDAwMDAwRSsxNCAgUm91bmRlZAorZm1heDIzMTUgZm1hIDkgOTAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMTUgIFJvdW5kZWQKK2ZtYXgyMzE2IGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4LjEwMDAwMDAwRSsxNiAgUm91bmRlZAorZm1heDIzMTcgZm1hIDkgOTAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4LjEwMDAwMDAwRSsxNyAgUm91bmRlZAorZm1heDIzMTggZm1hIDkgOTAwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMTggIFJvdW5kZWQKK2ZtYXgyMzE5IGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4LjEwMDAwMDAwRSsxOSAgUm91bmRlZAorZm1heDIzMjAgZm1hIDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4LjEwMDAwMDAwRSsyMCAgUm91bmRlZAorZm1heDIzMjEgZm1hIDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMjEgIFJvdW5kZWQKK2ZtYXgyMzIyIGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4LjEwMDAwMDAwRSsyMiAgUm91bmRlZAorZm1heDIzMjMgZm1hIDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4LjEwMDAwMDAwRSsyMyAgUm91bmRlZAorCistLSBmYXN0cGF0aCBicmVha2VycworcHJlY2lzaW9uOiAgIDI5CitmbWF4MjMzMCBmbWEgMS40OTE4MjQ2OTc2NDEyNzAzMTc4MjQ4NTI5NTI4MzcyMjQgMS4xMDUxNzA5MTgwNzU2NDc2MjQ4MTE3MDc4MjY0OTAyNDY1MTQ2NzU2Mjg2MTQ1NjI4ODM1MzczNDU3NDc2MDMgIDBFKzk5OTk5OSAgLT4gMS42NDg3MjEyNzA3MDAxMjgxNDY4NDg2NTA3ODc4IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDU1CitmbWF4MjMzMSBmbWEgMC44OTU4MzQxMzUyOTY1MjgyNTA2NzY4NTQ1ODI4NzY1MTE3ODAzODczNzE3Mjg0ODkxMDQwNDI4IDAuODk1ODM0MTM1Mjk2NTI4MjUwNjc2ODU0NTgyODc2NTExNzgwMzg3MzcxNzI4NDg5MTA0MDQyOCAgMEUrOTk5OTk5ICAtPiAwLjgwMjUxODc5Nzk2MjQ3ODQ4Mjk4NDI1NTM4Mjk5MzQwNjk5NTU4OTA5ODM2OTY3NTIyMjgyOTkgSW5leGFjdCBSb3VuZGVkCisKKworLS0gdHJ5emVyb3MgY2FzZXMKK3ByZWNpc2lvbjogICA3Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDkyCittaW5leHBvbmVudDogLTkyCitmbWF4MjUwNCAgZm1hICAwRS02MCAxMDAwRS02MCAgIDBFKzk5OTk5OSAgLT4gMEUtOTggQ2xhbXBlZAorZm1heDI1MDUgIGZtYSAgMTAwRSs2MCAwRSs2MCAgICAwRSs5OTk5OTkgIC0+IDBFKzkyIENsYW1wZWQKKworLS0gbWl4ZWQgd2l0aCB6ZXJvcworbWF4ZXhwb25lbnQ6IDk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTkKK3ByZWNpc2lvbjogOQorZm1heDI1NDEgZm1hICAwICAgIC0xICAgICAgMEUrOTk5OTk5ICAtPiAgMAorZm1heDI1NDIgZm1hIC0wICAgIC0xICAgICAgMEUrOTk5OTk5ICAtPiAgMAorZm1heDI1NDMgZm1hICAwICAgICAxICAgICAgMEUrOTk5OTk5ICAtPiAgMAorZm1heDI1NDQgZm1hIC0wICAgICAxICAgICAgMEUrOTk5OTk5ICAtPiAgMAorZm1heDI1NDUgZm1hIC0xICAgICAwICAgICAgMEUrOTk5OTk5ICAtPiAgMAorZm1heDI1NDYgZm1hIC0xICAgIC0wICAgICAgMEUrOTk5OTk5ICAtPiAgMAorZm1heDI1NDcgZm1hICAxICAgICAwICAgICAgMEUrOTk5OTk5ICAtPiAgMAorZm1heDI1NDggZm1hICAxICAgIC0wICAgICAgMEUrOTk5OTk5ICAtPiAgMAorCitmbWF4MjU1MSBmbWEgIDAuMCAgLTEgICAgICAwRSs5OTk5OTkgIC0+ICAwLjAKK2ZtYXgyNTUyIGZtYSAtMC4wICAtMSAgICAgIDBFKzk5OTk5OSAgLT4gIDAuMAorZm1heDI1NTMgZm1hICAwLjAgICAxICAgICAgMEUrOTk5OTk5ICAtPiAgMC4wCitmbWF4MjU1NCBmbWEgLTAuMCAgIDEgICAgICAwRSs5OTk5OTkgIC0+ICAwLjAKK2ZtYXgyNTU1IGZtYSAtMS4wICAgMCAgICAgIDBFKzk5OTk5OSAgLT4gIDAuMAorZm1heDI1NTYgZm1hIC0xLjAgIC0wICAgICAgMEUrOTk5OTk5ICAtPiAgMC4wCitmbWF4MjU1NyBmbWEgIDEuMCAgIDAgICAgICAwRSs5OTk5OTkgIC0+ICAwLjAKK2ZtYXgyNTU4IGZtYSAgMS4wICAtMCAgICAgIDBFKzk5OTk5OSAgLT4gIDAuMAorCitmbWF4MjU2MSBmbWEgIDAgICAgLTEuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAKK2ZtYXgyNTYyIGZtYSAtMCAgICAtMS4wICAgIDBFKzk5OTk5OSAgLT4gIDAuMAorZm1heDI1NjMgZm1hICAwICAgICAxLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wCitmbWF4MjU2NCBmbWEgLTAgICAgIDEuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAKK2ZtYXgyNTY1IGZtYSAtMSAgICAgMC4wICAgIDBFKzk5OTk5OSAgLT4gIDAuMAorZm1heDI1NjYgZm1hIC0xICAgIC0wLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wCitmbWF4MjU2NyBmbWEgIDEgICAgIDAuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAKK2ZtYXgyNTY4IGZtYSAgMSAgICAtMC4wICAgIDBFKzk5OTk5OSAgLT4gIDAuMAorCitmbWF4MjU3MSBmbWEgIDAuMCAgLTEuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAwCitmbWF4MjU3MiBmbWEgLTAuMCAgLTEuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAwCitmbWF4MjU3MyBmbWEgIDAuMCAgIDEuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAwCitmbWF4MjU3NCBmbWEgLTAuMCAgIDEuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAwCitmbWF4MjU3NSBmbWEgLTEuMCAgIDAuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAwCitmbWF4MjU3NiBmbWEgLTEuMCAgLTAuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAwCitmbWF4MjU3NyBmbWEgIDEuMCAgIDAuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAwCitmbWF4MjU3OCBmbWEgIDEuMCAgLTAuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAwCisKKworLS0gU3BlY2lhbHMKK2ZtYXgyNTgwIGZtYSAgSW5mICAtSW5mICAgIDBFKzk5OTk5OSAgLT4gLUluZmluaXR5CitmbWF4MjU4MSBmbWEgIEluZiAgLTEwMDAgICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eQorZm1heDI1ODIgZm1hICBJbmYgIC0xICAgICAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkKK2ZtYXgyNTgzIGZtYSAgSW5mICAtMCAgICAgIDBFKzk5OTk5OSAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNTg0IGZtYSAgSW5mICAgMCAgICAgIDBFKzk5OTk5OSAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNTg1IGZtYSAgSW5mICAgMSAgICAgIDBFKzk5OTk5OSAgLT4gIEluZmluaXR5CitmbWF4MjU4NiBmbWEgIEluZiAgIDEwMDAgICAwRSs5OTk5OTkgIC0+ICBJbmZpbml0eQorZm1heDI1ODcgZm1hICBJbmYgICBJbmYgICAgMEUrOTk5OTk5ICAtPiAgSW5maW5pdHkKK2ZtYXgyNTg4IGZtYSAtMTAwMCAgSW5mICAgIDBFKzk5OTk5OSAgLT4gLUluZmluaXR5CitmbWF4MjU4OSBmbWEgLUluZiAgIEluZiAgICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eQorZm1heDI1OTAgZm1hIC0xICAgICBJbmYgICAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkKK2ZtYXgyNTkxIGZtYSAtMCAgICAgSW5mICAgIDBFKzk5OTk5OSAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNTkyIGZtYSAgMCAgICAgSW5mICAgIDBFKzk5OTk5OSAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNTkzIGZtYSAgMSAgICAgSW5mICAgIDBFKzk5OTk5OSAgLT4gIEluZmluaXR5CitmbWF4MjU5NCBmbWEgIDEwMDAgIEluZiAgICAwRSs5OTk5OTkgIC0+ICBJbmZpbml0eQorZm1heDI1OTUgZm1hICBJbmYgICBJbmYgICAgMEUrOTk5OTk5ICAtPiAgSW5maW5pdHkKKworZm1heDI2MDAgZm1hIC1JbmYgIC1JbmYgICAgMEUrOTk5OTk5ICAtPiAgSW5maW5pdHkKK2ZtYXgyNjAxIGZtYSAtSW5mICAtMTAwMCAgIDBFKzk5OTk5OSAgLT4gIEluZmluaXR5CitmbWF4MjYwMiBmbWEgLUluZiAgLTEgICAgICAwRSs5OTk5OTkgIC0+ICBJbmZpbml0eQorZm1heDI2MDMgZm1hIC1JbmYgIC0wICAgICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2MDQgZm1hIC1JbmYgICAwICAgICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2MDUgZm1hIC1JbmYgICAxICAgICAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkKK2ZtYXgyNjA2IGZtYSAtSW5mICAgMTAwMCAgIDBFKzk5OTk5OSAgLT4gLUluZmluaXR5CitmbWF4MjYwNyBmbWEgLUluZiAgIEluZiAgICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eQorZm1heDI2MDggZm1hIC0xMDAwICBJbmYgICAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkKK2ZtYXgyNjA5IGZtYSAtSW5mICAtSW5mICAgIDBFKzk5OTk5OSAgLT4gIEluZmluaXR5CitmbWF4MjYxMCBmbWEgLTEgICAgLUluZiAgICAwRSs5OTk5OTkgIC0+ICBJbmZpbml0eQorZm1heDI2MTEgZm1hIC0wICAgIC1JbmYgICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2MTIgZm1hICAwICAgIC1JbmYgICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2MTMgZm1hICAxICAgIC1JbmYgICAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkKK2ZtYXgyNjE0IGZtYSAgMTAwMCAtSW5mICAgIDBFKzk5OTk5OSAgLT4gLUluZmluaXR5CitmbWF4MjYxNSBmbWEgIEluZiAgLUluZiAgICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eQorCitmbWF4MjYyMSBmbWEgIE5hTiAtSW5mICAgICAwRSs5OTk5OTkgIC0+ICBOYU4KK2ZtYXgyNjIyIGZtYSAgTmFOIC0xMDAwICAgIDBFKzk5OTk5OSAgLT4gIE5hTgorZm1heDI2MjMgZm1hICBOYU4gLTEgICAgICAgMEUrOTk5OTk5ICAtPiAgTmFOCitmbWF4MjYyNCBmbWEgIE5hTiAtMCAgICAgICAwRSs5OTk5OTkgIC0+ICBOYU4KK2ZtYXgyNjI1IGZtYSAgTmFOICAwICAgICAgIDBFKzk5OTk5OSAgLT4gIE5hTgorZm1heDI2MjYgZm1hICBOYU4gIDEgICAgICAgMEUrOTk5OTk5ICAtPiAgTmFOCitmbWF4MjYyNyBmbWEgIE5hTiAgMTAwMCAgICAwRSs5OTk5OTkgIC0+ICBOYU4KK2ZtYXgyNjI4IGZtYSAgTmFOICBJbmYgICAgIDBFKzk5OTk5OSAgLT4gIE5hTgorZm1heDI2MjkgZm1hICBOYU4gIE5hTiAgICAgMEUrOTk5OTk5ICAtPiAgTmFOCitmbWF4MjYzMCBmbWEgLUluZiAgTmFOICAgICAwRSs5OTk5OTkgIC0+ICBOYU4KK2ZtYXgyNjMxIGZtYSAtMTAwMCBOYU4gICAgIDBFKzk5OTk5OSAgLT4gIE5hTgorZm1heDI2MzIgZm1hIC0xICAgIE5hTiAgICAgMEUrOTk5OTk5ICAtPiAgTmFOCitmbWF4MjYzMyBmbWEgLTAgICAgTmFOICAgICAwRSs5OTk5OTkgIC0+ICBOYU4KK2ZtYXgyNjM0IGZtYSAgMCAgICBOYU4gICAgIDBFKzk5OTk5OSAgLT4gIE5hTgorZm1heDI2MzUgZm1hICAxICAgIE5hTiAgICAgMEUrOTk5OTk5ICAtPiAgTmFOCitmbWF4MjYzNiBmbWEgIDEwMDAgTmFOICAgICAwRSs5OTk5OTkgIC0+ICBOYU4KK2ZtYXgyNjM3IGZtYSAgSW5mICBOYU4gICAgIDBFKzk5OTk5OSAgLT4gIE5hTgorCitmbWF4MjY0MSBmbWEgIHNOYU4gLUluZiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY0MiBmbWEgIHNOYU4gLTEwMDAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY0MyBmbWEgIHNOYU4gLTEgICAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY0NCBmbWEgIHNOYU4gLTAgICAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY0NSBmbWEgIHNOYU4gIDAgICAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY0NiBmbWEgIHNOYU4gIDEgICAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY0NyBmbWEgIHNOYU4gIDEwMDAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY0OCBmbWEgIHNOYU4gIE5hTiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY0OSBmbWEgIHNOYU4gc05hTiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY1MCBmbWEgIE5hTiAgc05hTiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY1MSBmbWEgLUluZiAgc05hTiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY1MiBmbWEgLTEwMDAgc05hTiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY1MyBmbWEgLTEgICAgc05hTiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY1NCBmbWEgLTAgICAgc05hTiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY1NSBmbWEgIDAgICAgc05hTiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY1NiBmbWEgIDEgICAgc05hTiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY1NyBmbWEgIDEwMDAgc05hTiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY1OCBmbWEgIEluZiAgc05hTiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY1OSBmbWEgIE5hTiAgc05hTiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2ZtYXgyNjYxIGZtYSAgTmFOOSAtSW5mICAgIDBFKzk5OTk5OSAgLT4gIE5hTjkKK2ZtYXgyNjYyIGZtYSAgTmFOOCAgOTk5ICAgIDBFKzk5OTk5OSAgLT4gIE5hTjgKK2ZtYXgyNjYzIGZtYSAgTmFONzEgSW5mICAgIDBFKzk5OTk5OSAgLT4gIE5hTjcxCitmbWF4MjY2NCBmbWEgIE5hTjYgIE5hTjUgICAwRSs5OTk5OTkgIC0+ICBOYU42CitmbWF4MjY2NSBmbWEgLUluZiAgIE5hTjQgICAwRSs5OTk5OTkgIC0+ICBOYU40CitmbWF4MjY2NiBmbWEgLTk5OSAgIE5hTjMzICAwRSs5OTk5OTkgIC0+ICBOYU4zMworZm1heDI2NjcgZm1hICBJbmYgICBOYU4yICAgMEUrOTk5OTk5ICAtPiAgTmFOMgorCitmbWF4MjY3MSBmbWEgIHNOYU45OSAtSW5mICAgICAwRSs5OTk5OTkgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NzIgZm1hICBzTmFOOTggLTExICAgICAgMEUrOTk5OTk5ICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjczIGZtYSAgc05hTjk3ICBOYU4gICAgIDBFKzk5OTk5OSAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY3NCBmbWEgIHNOYU4xNiBzTmFOOTQgICAwRSs5OTk5OTkgIC0+ICBOYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NzUgZm1hICBOYU45NSAgc05hTjkzICAgMEUrOTk5OTk5ICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjc2IGZtYSAtSW5mICAgIHNOYU45MiAgIDBFKzk5OTk5OSAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY3NyBmbWEgIDA4OCAgICBzTmFOOTEgICAwRSs5OTk5OTkgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NzggZm1hICBJbmYgICAgc05hTjkwICAgMEUrOTk5OTk5ICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjc5IGZtYSAgTmFOICAgIHNOYU44OSAgIDBFKzk5OTk5OSAgLT4gIE5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKK2ZtYXgyNjgxIGZtYSAtTmFOOSAtSW5mICAgIDBFKzk5OTk5OSAgLT4gLU5hTjkKK2ZtYXgyNjgyIGZtYSAtTmFOOCAgOTk5ICAgIDBFKzk5OTk5OSAgLT4gLU5hTjgKK2ZtYXgyNjgzIGZtYSAtTmFONzEgSW5mICAgIDBFKzk5OTk5OSAgLT4gLU5hTjcxCitmbWF4MjY4NCBmbWEgLU5hTjYgLU5hTjUgICAwRSs5OTk5OTkgIC0+IC1OYU42CitmbWF4MjY4NSBmbWEgLUluZiAgLU5hTjQgICAwRSs5OTk5OTkgIC0+IC1OYU40CitmbWF4MjY4NiBmbWEgLTk5OSAgLU5hTjMzICAwRSs5OTk5OTkgIC0+IC1OYU4zMworZm1heDI2ODcgZm1hICBJbmYgIC1OYU4yICAgMEUrOTk5OTk5ICAtPiAtTmFOMgorCitmbWF4MjY5MSBmbWEgLXNOYU45OSAtSW5mICAgICAwRSs5OTk5OTkgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2OTIgZm1hIC1zTmFOOTggLTExICAgICAgMEUrOTk5OTk5ICAtPiAtTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjkzIGZtYSAtc05hTjk3ICBOYU4gICAgIDBFKzk5OTk5OSAgLT4gLU5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY5NCBmbWEgLXNOYU4xNiAtc05hTjk0ICAwRSs5OTk5OTkgIC0+IC1OYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2OTUgZm1hIC1OYU45NSAgLXNOYU45MyAgMEUrOTk5OTk5ICAtPiAtTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjk2IGZtYSAtSW5mICAgIC1zTmFOOTIgIDBFKzk5OTk5OSAgLT4gLU5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY5NyBmbWEgIDA4OCAgICAtc05hTjkxICAwRSs5OTk5OTkgIC0+IC1OYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2OTggZm1hICBJbmYgICAgLXNOYU45MCAgMEUrOTk5OTk5ICAtPiAtTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjk5IGZtYSAtTmFOICAgIC1zTmFOODkgIDBFKzk5OTk5OSAgLT4gLU5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKK2ZtYXgyNzAxIGZtYSAtTmFOICAtSW5mICAgIDBFKzk5OTk5OSAgLT4gLU5hTgorZm1heDI3MDIgZm1hIC1OYU4gICA5OTkgICAgMEUrOTk5OTk5ICAtPiAtTmFOCitmbWF4MjcwMyBmbWEgLU5hTiAgIEluZiAgICAwRSs5OTk5OTkgIC0+IC1OYU4KK2ZtYXgyNzA0IGZtYSAtTmFOICAtTmFOICAgIDBFKzk5OTk5OSAgLT4gLU5hTgorZm1heDI3MDUgZm1hIC1JbmYgIC1OYU4wICAgMEUrOTk5OTk5ICAtPiAtTmFOCitmbWF4MjcwNiBmbWEgLTk5OSAgLU5hTiAgICAwRSs5OTk5OTkgIC0+IC1OYU4KK2ZtYXgyNzA3IGZtYSAgSW5mICAtTmFOICAgIDBFKzk5OTk5OSAgLT4gLU5hTgorCitmbWF4MjcxMSBmbWEgLXNOYU4gICAtSW5mICAgICAwRSs5OTk5OTkgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNzEyIGZtYSAtc05hTiAgIC0xMSAgICAgIDBFKzk5OTk5OSAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI3MTMgZm1hIC1zTmFOMDAgIE5hTiAgICAgMEUrOTk5OTk5ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjcxNCBmbWEgLXNOYU4gICAtc05hTiAgICAwRSs5OTk5OTkgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNzE1IGZtYSAtTmFOICAgIC1zTmFOICAgIDBFKzk5OTk5OSAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI3MTYgZm1hIC1JbmYgICAgLXNOYU4gICAgMEUrOTk5OTk5ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjcxNyBmbWEgIDA4OCAgICAtc05hTiAgICAwRSs5OTk5OTkgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNzE4IGZtYSAgSW5mICAgIC1zTmFOICAgIDBFKzk5OTk5OSAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI3MTkgZm1hIC1OYU4gICAgLXNOYU4gICAgMEUrOTk5OTk5ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgLi4gbm90ZSBzdWJub3JtYWwgcmVzdWx0cworbWF4ZXhwb25lbnQ6IDk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTkKK2ZtYXgyNzMwIGZtYSArMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSs5OTk5OTkgIDBFKzk5OTk5OSAgLT4gSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitmbWF4MjczMSBmbWEgOUUrOTk5OTk5ICsxLjIzNDU2Nzg5MDEyMzQ1RS0wICAwRSs5OTk5OTkgIC0+IEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZm1heDI3MzIgZm1hICswLjEwMCA5RS05OTk5OTkgIDBFKzk5OTk5OSAgLT4gOS4wMEUtMTAwMDAwMCBTdWJub3JtYWwKK2ZtYXgyNzMzIGZtYSA5RS05OTk5OTkgKzAuMTAwICAwRSs5OTk5OTkgIC0+IDkuMDBFLTEwMDAwMDAgU3Vibm9ybWFsCitmbWF4MjczNSBmbWEgLTEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5ICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2ZtYXgyNzM2IGZtYSA5RSs5OTk5OTkgLTEuMjM0NTY3ODkwMTIzNDVFLTAgIDBFKzk5OTk5OSAgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZm1heDI3MzcgZm1hIC0wLjEwMCA5RS05OTk5OTkgIDBFKzk5OTk5OSAgLT4gLTkuMDBFLTEwMDAwMDAgU3Vibm9ybWFsCitmbWF4MjczOCBmbWEgOUUtOTk5OTk5IC0wLjEwMCAgMEUrOTk5OTk5ICAtPiAtOS4wMEUtMTAwMDAwMCBTdWJub3JtYWwKKworLS0gc2lnbnMKK2ZtYXgyNzUxIGZtYSAgMWUrNzc3Nzc3ICAxZSs0MTExMTEgIDBFKzk5OTk5OSAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDI3NTIgZm1hICAxZSs3Nzc3NzcgLTFlKzQxMTExMSAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4Mjc1MyBmbWEgLTFlKzc3Nzc3NyAgMWUrNDExMTExICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyNzU0IGZtYSAtMWUrNzc3Nzc3IC0xZSs0MTExMTEgIDBFKzk5OTk5OSAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDI3NTUgZm1hICAxZS03Nzc3NzcgIDFlLTQxMTExMSAgMEUrOTk5OTk5ICAtPiAgMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitmbWF4Mjc1NiBmbWEgIDFlLTc3Nzc3NyAtMWUtNDExMTExICAwRSs5OTk5OTkgIC0+IC0wRS0xMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2ZtYXgyNzU3IGZtYSAtMWUtNzc3Nzc3ICAxZS00MTExMTEgIDBFKzk5OTk5OSAgLT4gLTBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZm1heDI3NTggZm1hIC0xZS03Nzc3NzcgLTFlLTQxMTExMSAgMEUrOTk5OTk5ICAtPiAgMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tICdzdWJub3JtYWwnIGJvdW5kYXJ5IChhbGwgaGFyZCB1bmRlcmZsb3cgb3Igb3ZlcmZsb3cgaW4gYmFzZSBhcml0aGVtdGljKQorcHJlY2lzaW9uOiA5CitmbWF4Mjc2MCBmbWEgMWUtNjAwMDAwIDFlLTQwMDAwMSAgMEUrOTk5OTk5ICAtPiAxRS0xMDAwMDAxIFN1Ym5vcm1hbAorZm1heDI3NjEgZm1hIDFlLTYwMDAwMCAxZS00MDAwMDIgIDBFKzk5OTk5OSAgLT4gMUUtMTAwMDAwMiBTdWJub3JtYWwKK2ZtYXgyNzYyIGZtYSAxZS02MDAwMDAgMWUtNDAwMDAzICAwRSs5OTk5OTkgIC0+IDFFLTEwMDAwMDMgU3Vibm9ybWFsCitmbWF4Mjc2MyBmbWEgMWUtNjAwMDAwIDFlLTQwMDAwNCAgMEUrOTk5OTk5ICAtPiAxRS0xMDAwMDA0IFN1Ym5vcm1hbAorZm1heDI3NjQgZm1hIDFlLTYwMDAwMCAxZS00MDAwMDUgIDBFKzk5OTk5OSAgLT4gMUUtMTAwMDAwNSBTdWJub3JtYWwKK2ZtYXgyNzY1IGZtYSAxZS02MDAwMDAgMWUtNDAwMDA2ICAwRSs5OTk5OTkgIC0+IDFFLTEwMDAwMDYgU3Vibm9ybWFsCitmbWF4Mjc2NiBmbWEgMWUtNjAwMDAwIDFlLTQwMDAwNyAgMEUrOTk5OTk5ICAtPiAxRS0xMDAwMDA3IFN1Ym5vcm1hbAorZm1heDI3NjcgZm1hIDFlLTYwMDAwMCAxZS00MDAwMDggIDBFKzk5OTk5OSAgLT4gMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitmbWF4Mjc2OCBmbWEgMWUtNjAwMDAwIDFlLTQwMDAwOSAgMEUrOTk5OTk5ICAtPiAwRS0xMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2ZtYXgyNzY5IGZtYSAxZS02MDAwMDAgMWUtNDAwMDEwICAwRSs5OTk5OTkgIC0+IDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorLS0gW25vIGVxdWl2YWxlbnQgb2YgJ3N1Ym5vcm1hbCcgZm9yIG92ZXJmbG93XQorZm1heDI3NzAgZm1hIDFlKzYwMDAwMCAxZSs0MDAwMDEgIDBFKzk5OTk5OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4Mjc3MSBmbWEgMWUrNjAwMDAwIDFlKzQwMDAwMiAgMEUrOTk5OTk5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyNzcyIGZtYSAxZSs2MDAwMDAgMWUrNDAwMDAzICAwRSs5OTk5OTkgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDI3NzMgZm1hIDFlKzYwMDAwMCAxZSs0MDAwMDQgIDBFKzk5OTk5OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4Mjc3NCBmbWEgMWUrNjAwMDAwIDFlKzQwMDAwNSAgMEUrOTk5OTk5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyNzc1IGZtYSAxZSs2MDAwMDAgMWUrNDAwMDA2ICAwRSs5OTk5OTkgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDI3NzYgZm1hIDFlKzYwMDAwMCAxZSs0MDAwMDcgIDBFKzk5OTk5OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4Mjc3NyBmbWEgMWUrNjAwMDAwIDFlKzQwMDAwOCAgMEUrOTk5OTk5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyNzc4IGZtYSAxZSs2MDAwMDAgMWUrNDAwMDA5ICAwRSs5OTk5OTkgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDI3NzkgZm1hIDFlKzYwMDAwMCAxZSs0MDAwMTAgIDBFKzk5OTk5OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tICdzdWJub3JtYWwnIHRlc3QgZWRnZSBjb25kaXRpb24gYXQgaGlnaGVyIHByZWNpc2lvbnMKK3ByZWNpc2lvbjogOTkKK2ZtYXgyNzgwIGZtYSAxZS02MDAwMDAgMWUtNDAwMDA3ICAwRSs5OTk5OTkgIC0+IDFFLTEwMDAwMDcgU3Vibm9ybWFsCitmbWF4Mjc4MSBmbWEgMWUtNjAwMDAwIDFlLTQwMDAwOCAgMEUrOTk5OTk5ICAtPiAxRS0xMDAwMDA4IFN1Ym5vcm1hbAorZm1heDI3ODIgZm1hIDFlLTYwMDAwMCAxZS00MDAwOTcgIDBFKzk5OTk5OSAgLT4gMUUtMTAwMDA5NyBTdWJub3JtYWwKK2ZtYXgyNzgzIGZtYSAxZS02MDAwMDAgMWUtNDAwMDk4ICAwRSs5OTk5OTkgIC0+IDBFLTEwMDAwOTcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcHJlY2lzaW9uOiA5OTkKK2ZtYXgyNzg0IGZtYSAxZS02MDAwMDAgMWUtNDAwOTk3ICAwRSs5OTk5OTkgIC0+IDFFLTEwMDA5OTcgU3Vibm9ybWFsCitmbWF4Mjc4NSBmbWEgMWUtNjAwMDAwIDFlLTQwMDk5OCAgMEUrOTk5OTk5ICAtPiAwRS0xMDAwOTk3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gdGVzdCBzdWJub3JtYWxzIHJvdW5kaW5nCitwcmVjaXNpb246ICAgNQorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworZm1heDI4MDEgZm1hICAxLjAwMDBFLTk5OSAgMSAgICAgIDBFKzk5OTk5OSAgLT4gMS4wMDAwRS05OTkKK2ZtYXgyODAyIGZtYSAgMS4wMDBFLTk5OSAgIDFlLTEgICAwRSs5OTk5OTkgIC0+IDEuMDAwRS0xMDAwIFN1Ym5vcm1hbAorZm1heDI4MDMgZm1hICAxLjAwRS05OTkgICAgMWUtMiAgIDBFKzk5OTk5OSAgLT4gMS4wMEUtMTAwMSAgU3Vibm9ybWFsCitmbWF4MjgwNCBmbWEgIDEuMEUtOTk5ICAgICAxZS0zICAgMEUrOTk5OTk5ICAtPiAxLjBFLTEwMDIgICBTdWJub3JtYWwKK2ZtYXgyODA1IGZtYSAgMS4wRS05OTkgICAgIDFlLTQgICAwRSs5OTk5OTkgIC0+IDFFLTEwMDMgICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitmbWF4MjgwNiBmbWEgIDEuM0UtOTk5ICAgICAxZS00ICAgMEUrOTk5OTk5ICAtPiAxRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZm1heDI4MDcgZm1hICAxLjVFLTk5OSAgICAgMWUtNCAgIDBFKzk5OTk5OSAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyODA4IGZtYSAgMS43RS05OTkgICAgIDFlLTQgICAwRSs5OTk5OTkgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitmbWF4MjgwOSBmbWEgIDIuM0UtOTk5ICAgICAxZS00ICAgMEUrOTk5OTk5ICAtPiAyRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZm1heDI4MTAgZm1hICAyLjVFLTk5OSAgICAgMWUtNCAgIDBFKzk5OTk5OSAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyODExIGZtYSAgMi43RS05OTkgICAgIDFlLTQgICAwRSs5OTk5OTkgIC0+IDNFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitmbWF4MjgxMiBmbWEgIDEuNDlFLTk5OSAgICAxZS00ICAgMEUrOTk5OTk5ICAtPiAxRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZm1heDI4MTMgZm1hICAxLjUwRS05OTkgICAgMWUtNCAgIDBFKzk5OTk5OSAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyODE0IGZtYSAgMS41MUUtOTk5ICAgIDFlLTQgICAwRSs5OTk5OTkgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitmbWF4MjgxNSBmbWEgIDIuNDlFLTk5OSAgICAxZS00ICAgMEUrOTk5OTk5ICAtPiAyRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZm1heDI4MTYgZm1hICAyLjUwRS05OTkgICAgMWUtNCAgIDBFKzk5OTk5OSAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyODE3IGZtYSAgMi41MUUtOTk5ICAgIDFlLTQgICAwRSs5OTk5OTkgIC0+IDNFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgyODE4IGZtYSAgMUUtOTk5ICAgICAgIDFlLTQgICAwRSs5OTk5OTkgIC0+IDFFLTEwMDMgICAgIFN1Ym5vcm1hbAorZm1heDI4MTkgZm1hICAzRS05OTkgICAgICAgMWUtNSAgIDBFKzk5OTk5OSAgLT4gMEUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZm1heDI4MjAgZm1hICA1RS05OTkgICAgICAgMWUtNSAgIDBFKzk5OTk5OSAgLT4gMEUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZm1heDI4MjEgZm1hICA3RS05OTkgICAgICAgMWUtNSAgIDBFKzk5OTk5OSAgLT4gMUUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyODIyIGZtYSAgOUUtOTk5ICAgICAgIDFlLTUgICAwRSs5OTk5OTkgIC0+IDFFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitmbWF4MjgyMyBmbWEgIDkuOUUtOTk5ICAgICAxZS01ICAgMEUrOTk5OTk5ICAtPiAxRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitmbWF4MjgyNCBmbWEgIDFFLTk5OSAgICAgIC0xZS00ICAgMEUrOTk5OTk5ICAtPiAtMUUtMTAwMyAgICBTdWJub3JtYWwKK2ZtYXgyODI1IGZtYSAgM0UtOTk5ICAgICAgLTFlLTUgICAwRSs5OTk5OTkgIC0+IC0wRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2ZtYXgyODI2IGZtYSAtNUUtOTk5ICAgICAgIDFlLTUgICAwRSs5OTk5OTkgIC0+IC0wRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2ZtYXgyODI3IGZtYSAgN0UtOTk5ICAgICAgLTFlLTUgICAwRSs5OTk5OTkgIC0+IC0xRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitmbWF4MjgyOCBmbWEgLTlFLTk5OSAgICAgICAxZS01ICAgMEUrOTk5OTk5ICAtPiAtMUUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZm1heDI4MjkgZm1hICA5LjlFLTk5OSAgICAtMWUtNSAgIDBFKzk5OTk5OSAgLT4gLTFFLTEwMDMgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyODMwIGZtYSAgMy4wRS05OTkgICAgLTFlLTUgICAwRSs5OTk5OTkgIC0+IC0wRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworZm1heDI4MzEgZm1hICAxLjBFLTUwMSAgICAgMWUtNTAxICAwRSs5OTk5OTkgIC0+IDEuMEUtMTAwMiAgIFN1Ym5vcm1hbAorZm1heDI4MzIgZm1hICAyLjBFLTUwMSAgICAgMmUtNTAxICAwRSs5OTk5OTkgIC0+IDQuMEUtMTAwMiAgIFN1Ym5vcm1hbAorZm1heDI4MzMgZm1hICA0LjBFLTUwMSAgICAgNGUtNTAxICAwRSs5OTk5OTkgIC0+IDEuNjBFLTEwMDEgIFN1Ym5vcm1hbAorZm1heDI4MzQgZm1hIDEwLjBFLTUwMSAgICAxMGUtNTAxICAwRSs5OTk5OTkgIC0+IDEuMDAwRS0xMDAwIFN1Ym5vcm1hbAorZm1heDI4MzUgZm1hIDMwLjBFLTUwMSAgICAzMGUtNTAxICAwRSs5OTk5OTkgIC0+IDkuMDAwRS0xMDAwIFN1Ym5vcm1hbAorZm1heDI4MzYgZm1hIDQwLjBFLTUwMSAgICA0MGUtNTAxICAwRSs5OTk5OTkgIC0+IDEuNjAwMEUtOTk5CisKKy0tIHNxdWFyZXMKK2ZtYXgyODQwIGZtYSAgMUUtNTAyICAgICAgIDFlLTUwMiAgMEUrOTk5OTk5ICAtPiAwRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitmbWF4Mjg0MSBmbWEgIDFFLTUwMSAgICAgICAxZS01MDEgIDBFKzk5OTk5OSAgLT4gMUUtMTAwMiAgICAgU3Vibm9ybWFsCitmbWF4Mjg0MiBmbWEgIDJFLTUwMSAgICAgICAyZS01MDEgIDBFKzk5OTk5OSAgLT4gNEUtMTAwMiAgICAgU3Vibm9ybWFsCitmbWF4Mjg0MyBmbWEgIDRFLTUwMSAgICAgICA0ZS01MDEgIDBFKzk5OTk5OSAgLT4gMS42RS0xMDAxICAgU3Vibm9ybWFsCitmbWF4Mjg0NCBmbWEgMTBFLTUwMSAgICAgIDEwZS01MDEgIDBFKzk5OTk5OSAgLT4gMS4wMEUtMTAwMCAgU3Vibm9ybWFsCitmbWF4Mjg0NSBmbWEgMzBFLTUwMSAgICAgIDMwZS01MDEgIDBFKzk5OTk5OSAgLT4gOS4wMEUtMTAwMCAgU3Vibm9ybWFsCitmbWF4Mjg0NiBmbWEgNDBFLTUwMSAgICAgIDQwZS01MDEgIDBFKzk5OTk5OSAgLT4gMS42MDBFLTk5OQorCistLSBjdWJlcworZm1heDI4NTAgZm1hICAxRS02NzAgICAgIDFlLTMzNSAgMEUrOTk5OTk5ICAtPiAwRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2ZtYXgyODUxIGZtYSAgMUUtNjY4ICAgICAxZS0zMzQgIDBFKzk5OTk5OSAgLT4gMUUtMTAwMiAgICBTdWJub3JtYWwKK2ZtYXgyODUyIGZtYSAgNEUtNjY4ICAgICAyZS0zMzQgIDBFKzk5OTk5OSAgLT4gOEUtMTAwMiAgICBTdWJub3JtYWwKK2ZtYXgyODUzIGZtYSAgOUUtNjY4ICAgICAzZS0zMzQgIDBFKzk5OTk5OSAgLT4gMi43RS0xMDAxICBTdWJub3JtYWwKK2ZtYXgyODU0IGZtYSAxNkUtNjY4ICAgICA0ZS0zMzQgIDBFKzk5OTk5OSAgLT4gNi40RS0xMDAxICBTdWJub3JtYWwKK2ZtYXgyODU1IGZtYSAyNUUtNjY4ICAgICA1ZS0zMzQgIDBFKzk5OTk5OSAgLT4gMS4yNUUtMTAwMCBTdWJub3JtYWwKK2ZtYXgyODU2IGZtYSAxMEUtNjY4ICAgMTAwZS0zMzQgIDBFKzk5OTk5OSAgLT4gMS4wMDBFLTk5OQorCistLSB0ZXN0IGRlcml2ZWQgZnJvbSByZXN1bHQgb2YgMC4wOTkgKiogOTk5IGF0IDE1IGRpZ2l0cyB3aXRoIHVubGltaXRlZCBleHBvbmVudAorcHJlY2lzaW9uOiAxOQorZm1heDI4NjAgZm1hICA2NjM2ODUxNTU3OTk0NTc4NzE2RS01MjAgNjYzNjg1MTU1Nzk5NDU3ODcxNkUtNTIwICAwRSs5OTk5OTkgIC0+IDQuNDA0Nzc5ODYwMjg1NTFFLTEwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gTG9uZyBvcGVyYW5kIG92ZXJmbG93IG1heSBiZSBhIGRpZmZlcmVudCBwYXRoCitwcmVjaXNpb246IDMKK21heEV4cG9uZW50OiA5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5CitmbWF4Mjg3MCBmbWEgMSAgOS45OTlFKzk5OTk5OSAgICAwRSs5OTk5OTkgIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2ZtYXgyODcxIGZtYSAxIC05Ljk5OUUrOTk5OTk5ICAgIDBFKzk5OTk5OSAgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZm1heDI4NzIgZm1hICAgIDkuOTk5RSs5OTk5OTkgMSAgMEUrOTk5OTk5ICAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitmbWF4Mjg3MyBmbWEgICAtOS45OTlFKzk5OTk5OSAxICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworLS0gY2hlY2sgZm9yIGRvdWJsZS1yb3VuZGVkIHN1Ym5vcm1hbHMKK3ByZWNpc2lvbjogICA1CittYXhleHBvbmVudDogNzkKK21pbmV4cG9uZW50OiAtNzkKK2ZtYXgyODgxIGZtYSAgMS4yMzQ3RS00MCAgMS4yMzQ3RS00MCAgIDBFKzk5OTk5OSAgLT4gIDEuNTI0RS04MCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgyODgyIGZtYSAgMS4yMzRFLTQwICAxLjIzNEUtNDAgICAgIDBFKzk5OTk5OSAgLT4gIDEuNTIzRS04MCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgyODgzIGZtYSAgMS4yM0UtNDAgICAxLjIzRS00MCAgICAgIDBFKzk5OTk5OSAgLT4gIDEuNTEzRS04MCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgyODg0IGZtYSAgMS4yRS00MCAgICAxLjJFLTQwICAgICAgIDBFKzk5OTk5OSAgLT4gIDEuNDRFLTgwICAgU3Vibm9ybWFsCitmbWF4Mjg4NSBmbWEgIDEuMkUtNDAgICAgMS4yRS00MSAgICAgICAwRSs5OTk5OTkgIC0+ICAxLjQ0RS04MSAgIFN1Ym5vcm1hbAorZm1heDI4ODYgZm1hICAxLjJFLTQwICAgIDEuMkUtNDIgICAgICAgMEUrOTk5OTk5ICAtPiAgMS40RS04MiAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDI4ODcgZm1hICAxLjJFLTQwICAgIDEuM0UtNDIgICAgICAgMEUrOTk5OTk5ICAtPiAgMS42RS04MiAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDI4ODggZm1hICAxLjNFLTQwICAgIDEuM0UtNDIgICAgICAgMEUrOTk5OTk5ICAtPiAgMS43RS04MiAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDI4ODkgZm1hICAxLjNFLTQwICAgIDEuM0UtNDMgICAgICAgMEUrOTk5OTk5ICAtPiAgICAyRS04MyAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDI4OTAgZm1hICAxLjNFLTQxICAgIDEuM0UtNDMgICAgICAgMEUrOTk5OTk5ICAtPiAgICAwRS04MyAgICBDbGFtcGVkIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CisKK2ZtYXgyODkxIGZtYSAgMS4yMzQ1RS0zOSAgIDEuMjM0RS00MCAgIDBFKzk5OTk5OSAgLT4gIDEuNTIzNEUtNzkgSW5leGFjdCBSb3VuZGVkCitmbWF4Mjg5MiBmbWEgIDEuMjM0NTZFLTM5ICAxLjIzNEUtNDAgICAwRSs5OTk5OTkgIC0+ICAxLjUyMzRFLTc5IEluZXhhY3QgUm91bmRlZAorZm1heDI4OTMgZm1hICAxLjIzNDVFLTQwICAgMS4yMzRFLTQwICAgMEUrOTk5OTk5ICAtPiAgMS41MjNFLTgwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDI4OTQgZm1hICAxLjIzNDU2RS00MCAgMS4yMzRFLTQwICAgMEUrOTk5OTk5ICAtPiAgMS41MjNFLTgwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDI4OTUgZm1hICAxLjIzNDVFLTQxICAgMS4yMzRFLTQwICAgMEUrOTk5OTk5ICAtPiAgMS41MkUtODEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDI4OTYgZm1hICAxLjIzNDU2RS00MSAgMS4yMzRFLTQwICAgMEUrOTk5OTk5ICAtPiAgMS41MkUtODEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCistLSBOb3cgZXhwbG9yZSB0aGUgY2FzZSB3aGVyZSB3ZSBnZXQgYSBub3JtYWwgcmVzdWx0IHdpdGggVW5kZXJmbG93CitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworCitmbWF4MjkwMCBmbWEgIDAuMzAwMDAwMDAwMEUtMTkxIDAuMzAwMDAwMDAwMEUtMTkxICAwRSs5OTk5OTkgIC0+IDkuMDAwMDAwMDAwMDAwMDBFLTM4NCBTdWJub3JtYWwgUm91bmRlZAorZm1heDI5MDEgZm1hICAwLjMwMDAwMDAwMDFFLTE5MSAwLjMwMDAwMDAwMDFFLTE5MSAgMEUrOTk5OTk5ICAtPiA5LjAwMDAwMDAwNjAwMDAwRS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2ZtYXgyOTAyIGZtYSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5ICAgICAgICAgIDBFKzk5OTk5OSAgLT4gOS45OTk5OTk5OTk5OTAwMEUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitmbWF4MjkwMyBmbWEgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTkgICAgICAgICAwRSs5OTk5OTkgIC0+IDkuOTk5OTk5OTk5OTk5MDBFLTM4NCBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZm1heDI5MDQgZm1hICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5OSAgICAgICAgMEUrOTk5OTk5ICAtPiA5Ljk5OTk5OTk5OTk5OTkwRS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2ZtYXgyOTA1IGZtYSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTk5ICAgICAgIDBFKzk5OTk5OSAgLT4gOS45OTk5OTk5OTk5OTk5OUUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCistLSBwcm92ZSBvcGVyYW5kcyBhcmUgZXhhY3QKK2ZtYXgyOTA2IGZtYSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMSAgICAgICAgICAgICAgICAgICAgICAgIDBFKzk5OTk5OSAgLT4gOS45OTk5OTk5OTk5OTk5OTlFLTM4MworZm1heDI5MDcgZm1hICAgICAgICAgICAgICAgICAgICAgICAxICAwLjA5OTk5OTk5OTk5OTk5OTk5ICAgICAgMEUrOTk5OTk5ICAtPiAwLjA5OTk5OTk5OTk5OTk5OTk5CistLSB0aGUgbmV4dCByb3VuZHMgdG8gTm1pbgorZm1heDI5MDggZm1hICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5OTk5ICAgICAgMEUrOTk5OTk5ICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitmbWF4MjkwOSBmbWEgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTk5OTk5ICAgICAwRSs5OTk5OTkgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2ZtYXgyOTEwIGZtYSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTk5OTk5ICAgIDBFKzk5OTk5OSAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZm1heDI5MTEgZm1hICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5OTk5OTk5ICAgMEUrOTk5OTk5ICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCisKKy0tIEV4YW1wbGVzIGZyb20gU1FMIHByb3Bvc2FsIChLcmlzaG5hIEt1bGthcm5pKQorcHJlY2lzaW9uOiAgIDM0Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0MworZm1heDI5MjEgIGZtYSAxMzBFLTIgIDEyMEUtMiAgMEUrOTk5OTk5ICAtPiAxLjU2MDAKK2ZtYXgyOTIyICBmbWEgMTMwRS0yICAxMkUtMSAgIDBFKzk5OTk5OSAgLT4gMS41NjAKK2ZtYXgyOTIzICBmbWEgMTMwRS0yICAxRTAgICAgIDBFKzk5OTk5OSAgLT4gMS4zMAorCistLSBOdWxsIHRlc3RzCitmbWF4Mjk5MCBmbWEgICMgMTAgIDBFKzk5OTk5OSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mjk5MSBmbWEgMTAgICMgIDBFKzk5OTk5OSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEFERElUSU9OIFRFU1RTIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCistLSBbZmlyc3QgZ3JvdXAgYXJlICdxdWljayBjb25maWRlbmNlIGNoZWNrJ10KK2ZtYXgzMDAxIGZtYSAgMSAgIDEgICAgICAgMSAgICAgICAtPiAgMgorZm1heDMwMDIgZm1hICAxICAgMiAgICAgICAzICAgICAgIC0+ICA1CitmbWF4MzAwMyBmbWEgIDEgICAnNS43NScgICczLjMnICAgLT4gIDkuMDUKK2ZtYXgzMDA0IGZtYSAgMSAgICc1JyAgICAgJy0zJyAgICAtPiAgMgorZm1heDMwMDUgZm1hICAxICAgJy01JyAgICAnLTMnICAgIC0+ICAtOAorZm1heDMwMDYgZm1hICAxICAgJy03JyAgICAnMi41JyAgIC0+ICAtNC41CitmbWF4MzAwNyBmbWEgIDEgICAnMC43JyAgICcwLjMnICAgLT4gIDEuMAorZm1heDMwMDggZm1hICAxICAgJzEuMjUnICAnMS4yNScgIC0+ICAyLjUwCitmbWF4MzAwOSBmbWEgIDEgICAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDAwJyAtPiAnMi4yMzQ1Njc4OScKK2ZtYXgzMDEwIGZtYSAgMSAgICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMTEnIC0+ICcyLjIzNDU2ODAwJworCitmbWF4MzAxMSBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NScgLT4gJzEuMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZm1heDMwMTIgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0MCcgICcwLjU1NTU1NTU1NTUnIC0+ICcxLjAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDEzIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTUwJyAtPiAnMC45OTk5OTk5OTknIEluZXhhY3QgUm91bmRlZAorZm1heDMwMTQgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDknICAgICcwJyAtPiAnMC40NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZm1heDMwMTUgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDk5JyAgICcwJyAtPiAnMC40NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZm1heDMwMTYgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDk5OScgICcwJyAtPiAnMC40NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZm1heDMwMTcgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NTAwMCcgICcwJyAtPiAnMC40NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorZm1heDMwMTggZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NTAwMScgICcwJyAtPiAnMC40NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorZm1heDMwMTkgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NTAxJyAgICcwJyAtPiAnMC40NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorZm1heDMwMjAgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NTEnICAgICcwJyAtPiAnMC40NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzAyMSBmbWEgIDEgICAwIDEgLT4gMQorZm1heDMwMjIgZm1hICAxICAgMSAxIC0+IDIKK2ZtYXgzMDIzIGZtYSAgMSAgIDIgMSAtPiAzCitmbWF4MzAyNCBmbWEgIDEgICAzIDEgLT4gNAorZm1heDMwMjUgZm1hICAxICAgNCAxIC0+IDUKK2ZtYXgzMDI2IGZtYSAgMSAgIDUgMSAtPiA2CitmbWF4MzAyNyBmbWEgIDEgICA2IDEgLT4gNworZm1heDMwMjggZm1hICAxICAgNyAxIC0+IDgKK2ZtYXgzMDI5IGZtYSAgMSAgIDggMSAtPiA5CitmbWF4MzAzMCBmbWEgIDEgICA5IDEgLT4gMTAKKworLS0gc29tZSBjYXJyeWluZyBlZmZlY3RzCitmbWF4MzAzMSBmbWEgIDEgICAnMC45OTk4JyAgJzAuMDAwMCcgLT4gJzAuOTk5OCcKK2ZtYXgzMDMyIGZtYSAgMSAgICcwLjk5OTgnICAnMC4wMDAxJyAtPiAnMC45OTk5JworZm1heDMwMzMgZm1hICAxICAgJzAuOTk5OCcgICcwLjAwMDInIC0+ICcxLjAwMDAnCitmbWF4MzAzNCBmbWEgIDEgICAnMC45OTk4JyAgJzAuMDAwMycgLT4gJzEuMDAwMScKKworZm1heDMwMzUgZm1hICAxICAgJzcwJyAgJzEwMDAwZSs5JyAtPiAnMS4wMDAwMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorZm1heDMwMzYgZm1hICAxICAgJzcwMCcgICcxMDAwMGUrOScgLT4gJzEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDM3IGZtYSAgMSAgICc3MDAwJyAgJzEwMDAwZSs5JyAtPiAnMS4wMDAwMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorZm1heDMwMzggZm1hICAxICAgJzcwMDAwJyAgJzEwMDAwZSs5JyAtPiAnMS4wMDAwMDAwMUUrMTMnIEluZXhhY3QgUm91bmRlZAorZm1heDMwMzkgZm1hICAxICAgJzcwMDAwMCcgICcxMDAwMGUrOScgLT4gJzEuMDAwMDAwMDdFKzEzJyBSb3VuZGVkCisKKy0tIHN5bW1ldHJ5OgorZm1heDMwNDAgZm1hICAxICAgJzEwMDAwZSs5JyAgJzcwJyAtPiAnMS4wMDAwMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorZm1heDMwNDEgZm1hICAxICAgJzEwMDAwZSs5JyAgJzcwMCcgLT4gJzEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDQyIGZtYSAgMSAgICcxMDAwMGUrOScgICc3MDAwJyAtPiAnMS4wMDAwMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorZm1heDMwNDQgZm1hICAxICAgJzEwMDAwZSs5JyAgJzcwMDAwJyAtPiAnMS4wMDAwMDAwMUUrMTMnIEluZXhhY3QgUm91bmRlZAorZm1heDMwNDUgZm1hICAxICAgJzEwMDAwZSs5JyAgJzcwMDAwMCcgLT4gJzEuMDAwMDAwMDdFKzEzJyBSb3VuZGVkCisKKy0tIHNhbWUsIGhpZ2hlciBwcmVjaXNpb24KK3ByZWNpc2lvbjogMTUKK2ZtYXgzMDQ2IGZtYSAgMSAgICcxMDAwMGUrOScgICc3JyAtPiAnMTAwMDAwMDAwMDAwMDcnCitmbWF4MzA0NyBmbWEgIDEgICAnMTAwMDBlKzknICAnNzAnIC0+ICcxMDAwMDAwMDAwMDA3MCcKK2ZtYXgzMDQ4IGZtYSAgMSAgICcxMDAwMGUrOScgICc3MDAnIC0+ICcxMDAwMDAwMDAwMDcwMCcKK2ZtYXgzMDQ5IGZtYSAgMSAgICcxMDAwMGUrOScgICc3MDAwJyAtPiAnMTAwMDAwMDAwMDcwMDAnCitmbWF4MzA1MCBmbWEgIDEgICAnMTAwMDBlKzknICAnNzAwMDAnIC0+ICcxMDAwMDAwMDA3MDAwMCcKK2ZtYXgzMDUxIGZtYSAgMSAgICcxMDAwMGUrOScgICc3MDAwMDAnIC0+ICcxMDAwMDAwMDcwMDAwMCcKK2ZtYXgzMDUyIGZtYSAgMSAgICcxMDAwMGUrOScgICc3MDAwMDAwJyAtPiAnMTAwMDAwMDcwMDAwMDAnCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjYXJpdGgKK2ZtYXgzMDUzIGZtYSAgMSAgICcxMicgJzcuMDAnIC0+ICcxOS4wMCcKK2ZtYXgzMDU0IGZtYSAgMSAgICcxLjMnICctMS4wNycgLT4gJzAuMjMnCitmbWF4MzA1NSBmbWEgIDEgICAnMS4zJyAnLTEuMzAnIC0+ICcwLjAwJworZm1heDMwNTYgZm1hICAxICAgJzEuMycgJy0yLjA3JyAtPiAnLTAuNzcnCitmbWF4MzA1NyBmbWEgIDEgICAnMUUrMicgJzFFKzQnIC0+ICcxLjAxRSs0JworCistLSB6ZXJvIHByZXNlcnZhdGlvbgorcHJlY2lzaW9uOiA2CitmbWF4MzA2MCBmbWEgIDEgICAnMTAwMDBlKzknICAnNzAwMDAnIC0+ICcxLjAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCitmbWF4MzA2MSBmbWEgIDEgICAxICcwLjAwMDEnIC0+ICcxLjAwMDEnCitmbWF4MzA2MiBmbWEgIDEgICAxICcwLjAwMDAxJyAtPiAnMS4wMDAwMScKK2ZtYXgzMDYzIGZtYSAgMSAgIDEgJzAuMDAwMDAxJyAtPiAnMS4wMDAwMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzA2NCBmbWEgIDEgICAxICcwLjAwMDAwMDEnIC0+ICcxLjAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDY1IGZtYSAgMSAgIDEgJzAuMDAwMDAwMDEnIC0+ICcxLjAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBmdW5ueSB6ZXJvcyBbaW4gY2FzZSBvZiBiYWQgc2lnbnVtXQorZm1heDMwNzAgZm1hICAxICAgMSAgMCAgICAtPiAxCitmbWF4MzA3MSBmbWEgIDEgICAxIDAuICAgIC0+IDEKK2ZtYXgzMDcyIGZtYSAgMSAgIDEgIC4wICAgLT4gMS4wCitmbWF4MzA3MyBmbWEgIDEgICAxIDAuMCAgIC0+IDEuMAorZm1heDMwNzQgZm1hICAxICAgMSAwLjAwICAtPiAxLjAwCitmbWF4MzA3NSBmbWEgIDEgICAgMCAgMSAgIC0+IDEKK2ZtYXgzMDc2IGZtYSAgMSAgIDAuICAxICAgLT4gMQorZm1heDMwNzcgZm1hICAxICAgIC4wIDEgICAtPiAxLjAKK2ZtYXgzMDc4IGZtYSAgMSAgIDAuMCAxICAgLT4gMS4wCitmbWF4MzA3OSBmbWEgIDEgICAwLjAwIDEgIC0+IDEuMDAKKworcHJlY2lzaW9uOiA5CisKKy0tIHNvbWUgY2FycmllcworZm1heDMwODAgZm1hICAxICAgOTk5OTk5OTk4IDEgIC0+IDk5OTk5OTk5OQorZm1heDMwODEgZm1hICAxICAgOTk5OTk5OTk5IDEgIC0+IDEuMDAwMDAwMDBFKzkgUm91bmRlZAorZm1heDMwODIgZm1hICAxICAgIDk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMAorZm1heDMwODMgZm1hICAxICAgICA5OTk5OTk5IDEgIC0+IDEwMDAwMDAwCitmbWF4MzA4NCBmbWEgIDEgICAgICA5OTk5OTkgMSAgLT4gMTAwMDAwMAorZm1heDMwODUgZm1hICAxICAgICAgIDk5OTk5IDEgIC0+IDEwMDAwMAorZm1heDMwODYgZm1hICAxICAgICAgICA5OTk5IDEgIC0+IDEwMDAwCitmbWF4MzA4NyBmbWEgIDEgICAgICAgICA5OTkgMSAgLT4gMTAwMAorZm1heDMwODggZm1hICAxICAgICAgICAgIDk5IDEgIC0+IDEwMAorZm1heDMwODkgZm1hICAxICAgICAgICAgICA5IDEgIC0+IDEwCisKKworLS0gbW9yZSBMSFMgc3dhcHMKK2ZtYXgzMDkwIGZtYSAgMSAgICctNTYyNjdFLTEwJyAgIDAgLT4gICctMC4wMDAwMDU2MjY3JworZm1heDMwOTEgZm1hICAxICAgJy01NjI2N0UtNicgICAgMCAtPiAgJy0wLjA1NjI2NycKK2ZtYXgzMDkyIGZtYSAgMSAgICctNTYyNjdFLTUnICAgIDAgLT4gICctMC41NjI2NycKK2ZtYXgzMDkzIGZtYSAgMSAgICctNTYyNjdFLTQnICAgIDAgLT4gICctNS42MjY3JworZm1heDMwOTQgZm1hICAxICAgJy01NjI2N0UtMycgICAgMCAtPiAgJy01Ni4yNjcnCitmbWF4MzA5NSBmbWEgIDEgICAnLTU2MjY3RS0yJyAgICAwIC0+ICAnLTU2Mi42NycKK2ZtYXgzMDk2IGZtYSAgMSAgICctNTYyNjdFLTEnICAgIDAgLT4gICctNTYyNi43JworZm1heDMwOTcgZm1hICAxICAgJy01NjI2N0UtMCcgICAgMCAtPiAgJy01NjI2NycKK2ZtYXgzMDk4IGZtYSAgMSAgICctNUUtMTAnICAgICAgIDAgLT4gICctNUUtMTAnCitmbWF4MzA5OSBmbWEgIDEgICAnLTVFLTcnICAgICAgICAwIC0+ICAnLTVFLTcnCitmbWF4MzEwMCBmbWEgIDEgICAnLTVFLTYnICAgICAgICAwIC0+ICAnLTAuMDAwMDA1JworZm1heDMxMDEgZm1hICAxICAgJy01RS01JyAgICAgICAgMCAtPiAgJy0wLjAwMDA1JworZm1heDMxMDIgZm1hICAxICAgJy01RS00JyAgICAgICAgMCAtPiAgJy0wLjAwMDUnCitmbWF4MzEwMyBmbWEgIDEgICAnLTVFLTEnICAgICAgICAwIC0+ICAnLTAuNScKK2ZtYXgzMTA0IGZtYSAgMSAgICctNUUwJyAgICAgICAgIDAgLT4gICctNScKK2ZtYXgzMTA1IGZtYSAgMSAgICctNUUxJyAgICAgICAgIDAgLT4gICctNTAnCitmbWF4MzEwNiBmbWEgIDEgICAnLTVFNScgICAgICAgICAwIC0+ICAnLTUwMDAwMCcKK2ZtYXgzMTA3IGZtYSAgMSAgICctNUU4JyAgICAgICAgIDAgLT4gICctNTAwMDAwMDAwJworZm1heDMxMDggZm1hICAxICAgJy01RTknICAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwRSs5JyAgIFJvdW5kZWQKK2ZtYXgzMTA5IGZtYSAgMSAgICctNUUxMCcgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMEUrMTAnICBSb3VuZGVkCitmbWF4MzExMCBmbWEgIDEgICAnLTVFMTEnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDBFKzExJyAgUm91bmRlZAorZm1heDMxMTEgZm1hICAxICAgJy01RTEwMCcgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwRSsxMDAnIFJvdW5kZWQKKworLS0gbW9yZSBSSFMgc3dhcHMKK2ZtYXgzMTEzIGZtYSAgMSAgIDAgICctNTYyNjdFLTEwJyAtPiAgJy0wLjAwMDAwNTYyNjcnCitmbWF4MzExNCBmbWEgIDEgICAwICAnLTU2MjY3RS02JyAgLT4gICctMC4wNTYyNjcnCitmbWF4MzExNiBmbWEgIDEgICAwICAnLTU2MjY3RS01JyAgLT4gICctMC41NjI2NycKK2ZtYXgzMTE3IGZtYSAgMSAgIDAgICctNTYyNjdFLTQnICAtPiAgJy01LjYyNjcnCitmbWF4MzExOSBmbWEgIDEgICAwICAnLTU2MjY3RS0zJyAgLT4gICctNTYuMjY3JworZm1heDMxMjAgZm1hICAxICAgMCAgJy01NjI2N0UtMicgIC0+ICAnLTU2Mi42NycKK2ZtYXgzMTIxIGZtYSAgMSAgIDAgICctNTYyNjdFLTEnICAtPiAgJy01NjI2LjcnCitmbWF4MzEyMiBmbWEgIDEgICAwICAnLTU2MjY3RS0wJyAgLT4gICctNTYyNjcnCitmbWF4MzEyMyBmbWEgIDEgICAwICAnLTVFLTEwJyAgICAgLT4gICctNUUtMTAnCitmbWF4MzEyNCBmbWEgIDEgICAwICAnLTVFLTcnICAgICAgLT4gICctNUUtNycKK2ZtYXgzMTI1IGZtYSAgMSAgIDAgICctNUUtNicgICAgICAtPiAgJy0wLjAwMDAwNScKK2ZtYXgzMTI2IGZtYSAgMSAgIDAgICctNUUtNScgICAgICAtPiAgJy0wLjAwMDA1JworZm1heDMxMjcgZm1hICAxICAgMCAgJy01RS00JyAgICAgIC0+ICAnLTAuMDAwNScKK2ZtYXgzMTI4IGZtYSAgMSAgIDAgICctNUUtMScgICAgICAtPiAgJy0wLjUnCitmbWF4MzEyOSBmbWEgIDEgICAwICAnLTVFMCcgICAgICAgLT4gICctNScKK2ZtYXgzMTMwIGZtYSAgMSAgIDAgICctNUUxJyAgICAgICAtPiAgJy01MCcKK2ZtYXgzMTMxIGZtYSAgMSAgIDAgICctNUU1JyAgICAgICAtPiAgJy01MDAwMDAnCitmbWF4MzEzMiBmbWEgIDEgICAwICAnLTVFOCcgICAgICAgLT4gICctNTAwMDAwMDAwJworZm1heDMxMzMgZm1hICAxICAgMCAgJy01RTknICAgICAgIC0+ICAnLTUuMDAwMDAwMDBFKzknICAgIFJvdW5kZWQKK2ZtYXgzMTM0IGZtYSAgMSAgIDAgICctNUUxMCcgICAgICAtPiAgJy01LjAwMDAwMDAwRSsxMCcgICBSb3VuZGVkCitmbWF4MzEzNSBmbWEgIDEgICAwICAnLTVFMTEnICAgICAgLT4gICctNS4wMDAwMDAwMEUrMTEnICAgUm91bmRlZAorZm1heDMxMzYgZm1hICAxICAgMCAgJy01RTEwMCcgICAgIC0+ICAnLTUuMDAwMDAwMDBFKzEwMCcgIFJvdW5kZWQKKworLS0gcmVsYXRlZAorZm1heDMxMzcgZm1hICAxICAgIDEgICcwRS0xMicgICAgICAtPiAgJzEuMDAwMDAwMDAnICBSb3VuZGVkCitmbWF4MzEzOCBmbWEgIDEgICAtMSAgJzBFLTEyJyAgICAgIC0+ICAnLTEuMDAwMDAwMDAnIFJvdW5kZWQKK2ZtYXgzMTM5IGZtYSAgMSAgICcwRS0xMicgMSAgICAgICAgLT4gICcxLjAwMDAwMDAwJyAgUm91bmRlZAorZm1heDMxNDAgZm1hICAxICAgJzBFLTEyJyAtMSAgICAgICAtPiAgJy0xLjAwMDAwMDAwJyBSb3VuZGVkCitmbWF4MzE0MSBmbWEgIDEgICAxRSs0ICAgIDAuMDAwMCAgIC0+ICAnMTAwMDAuMDAwMCcKK2ZtYXgzMTQyIGZtYSAgMSAgIDFFKzQgICAgMC4wMDAwMCAgLT4gICcxMDAwMC4wMDAwJyAgUm91bmRlZAorZm1heDMxNDMgZm1hICAxICAgMC4wMDAgICAxRSs1ICAgICAtPiAgJzEwMDAwMC4wMDAnCitmbWF4MzE0NCBmbWEgIDEgICAwLjAwMDAgIDFFKzUgICAgIC0+ICAnMTAwMDAwLjAwMCcgIFJvdW5kZWQKKworLS0gW3NvbWUgb2YgdGhlIG5leHQgZ3JvdXAgYXJlIHJlYWxseSBjb25zdHJ1Y3RvciB0ZXN0c10KK2ZtYXgzMTQ2IGZtYSAgMSAgICcwMC4wJyAgMCAgICAgICAtPiAgJzAuMCcKK2ZtYXgzMTQ3IGZtYSAgMSAgICcwLjAwJyAgMCAgICAgICAtPiAgJzAuMDAnCitmbWF4MzE0OCBmbWEgIDEgICAgMCAgICAgICcwLjAwJyAgLT4gICcwLjAwJworZm1heDMxNDkgZm1hICAxICAgIDAgICAgICAnMDAuMCcgIC0+ICAnMC4wJworZm1heDMxNTAgZm1hICAxICAgJzAwLjAnICAnMC4wMCcgIC0+ICAnMC4wMCcKK2ZtYXgzMTUxIGZtYSAgMSAgICcwLjAwJyAgJzAwLjAnICAtPiAgJzAuMDAnCitmbWF4MzE1MiBmbWEgIDEgICAnMycgICAgICcuMycgICAgLT4gICczLjMnCitmbWF4MzE1MyBmbWEgIDEgICAnMy4nICAgICcuMycgICAgLT4gICczLjMnCitmbWF4MzE1NCBmbWEgIDEgICAnMy4wJyAgICcuMycgICAgLT4gICczLjMnCitmbWF4MzE1NSBmbWEgIDEgICAnMy4wMCcgICcuMycgICAgLT4gICczLjMwJworZm1heDMxNTYgZm1hICAxICAgJzMnICAgICAnMycgICAgIC0+ICAnNicKK2ZtYXgzMTU3IGZtYSAgMSAgICczJyAgICAgJyszJyAgICAtPiAgJzYnCitmbWF4MzE1OCBmbWEgIDEgICAnMycgICAgICctMycgICAgLT4gICcwJworZm1heDMxNTkgZm1hICAxICAgJzAuMycgICAnLTAuMycgIC0+ICAnMC4wJworZm1heDMxNjAgZm1hICAxICAgJzAuMDMnICAnLTAuMDMnIC0+ICAnMC4wMCcKKworLS0gdHJ5IGJvcmRlcmxpbmUgcHJlY2lzaW9uLCB3aXRoIGNhcnJpZXMsIGV0Yy4KK3ByZWNpc2lvbjogMTUKK2ZtYXgzMTYxIGZtYSAgMSAgICcxRSsxMicgJy0xJyAgICAtPiAnOTk5OTk5OTk5OTk5JworZm1heDMxNjIgZm1hICAxICAgJzFFKzEyJyAgJzEuMTEnIC0+ICcxMDAwMDAwMDAwMDAxLjExJworZm1heDMxNjMgZm1hICAxICAgJzEuMTEnICAnMUUrMTInIC0+ICcxMDAwMDAwMDAwMDAxLjExJworZm1heDMxNjQgZm1hICAxICAgJy0xJyAgICAnMUUrMTInIC0+ICc5OTk5OTk5OTk5OTknCitmbWF4MzE2NSBmbWEgIDEgICAnN0UrMTInICctMScgICAgLT4gJzY5OTk5OTk5OTk5OTknCitmbWF4MzE2NiBmbWEgIDEgICAnN0UrMTInICAnMS4xMScgLT4gJzcwMDAwMDAwMDAwMDEuMTEnCitmbWF4MzE2NyBmbWEgIDEgICAnMS4xMScgICc3RSsxMicgLT4gJzcwMDAwMDAwMDAwMDEuMTEnCitmbWF4MzE2OCBmbWEgIDEgICAnLTEnICAgICc3RSsxMicgLT4gJzY5OTk5OTk5OTk5OTknCisKKy0tICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NSAgICAgIDEyMzQ1Njc4OTAxMjM0NSAgICAgIDEgMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTcwIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU2MycgLT4gJzEuMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZm1heDMxNzEgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTYyJyAtPiAnMS4wMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzE3MiBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NjEnIC0+ICcxLjAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTczIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU2MCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZm1heDMxNzQgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU5JyAtPiAnMS4wMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzE3NSBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTgnIC0+ICcxLjAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTc2IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NycgLT4gJzEuMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZm1heDMxNzcgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZm1heDMxNzggZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1JyAtPiAnMC45OTk5OTk5OTk5OTk5OTknCitmbWF4MzE3OSBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTQnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OCcKK2ZtYXgzMTgwIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1MycgLT4gJzAuOTk5OTk5OTk5OTk5OTk3JworZm1heDMxODEgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTUyJyAtPiAnMC45OTk5OTk5OTk5OTk5OTYnCitmbWF4MzE4MiBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTEnIC0+ICcwLjk5OTk5OTk5OTk5OTk5NScKK2ZtYXgzMTgzIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1MCcgLT4gJzAuOTk5OTk5OTk5OTk5OTk0JworCistLSBhbmQgc29tZSBtb3JlLCBpbmNsdWRpbmcgcmVzaWR1ZSBlZmZlY3RzIGFuZCBkaWZmZXJlbnQgcm91bmRpbmdzCitwcmVjaXNpb246IDkKK3JvdW5kaW5nOiBoYWxmX3VwCitmbWF4MzIwMCBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjM0NTY3ODknCitmbWF4MzIwMSBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyMDIgZm1hICAxICAgJzEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjAzIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIwNCBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyMDUgZm1hICAxICAgJzEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjA2IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIwNyBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyMDggZm1hICAxICAgJzEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjA5IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIxMCBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMTEgZm1hICAxICAgJzEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjEyIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIxMyBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMTQgZm1hICAxICAgJzEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjE1IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIxNiBmbWEgIDEgICAnMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnCitmbWF4MzIxNyBmbWEgIDEgICAnMTIzNDU2Nzg5JyAxLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMTggZm1hICAxICAgJzEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjE5IGZtYSAgMSAgICcxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2ZtYXgzMjIwIGZtYSAgMSAgICcxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScKK2ZtYXgzMjIxIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIyMiBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyMjMgZm1hICAxICAgJzEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjI0IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIyNSBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyMjYgZm1hICAxICAgJzEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjI3IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIyOCBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMjkgZm1hICAxICAgJzEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjMwIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIzMSBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMzIgZm1hICAxICAgJzEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjMzIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIzNCBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMzUgZm1hICAxICAgJzEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjM2IGZtYSAgMSAgICcxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcKK2ZtYXgzMjM3IGZtYSAgMSAgICcxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIzOCBmbWEgIDEgICAnMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMzkgZm1hICAxICAgJzEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitmbWF4MzI0MCBmbWEgIDEgICAnMTIzNDU2Nzg4JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZm1heDMyNDEgZm1hICAxICAgJzEyMzQ1Njc4OCcgMC41ICAgICAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjQyIGZtYSAgMSAgICcxMjM0NTY3ODgnIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitmbWF4MzI1MCBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjM0NTY3ODknCitmbWF4MzI1MSBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyNTIgZm1hICAxICAgJzEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjUzIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI1NCBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyNTUgZm1hICAxICAgJzEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjU2IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI1NyBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyNTggZm1hICAxICAgJzEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjU5IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI2MCBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyNjEgZm1hICAxICAgJzEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjYyIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI2MyBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyNjQgZm1hICAxICAgJzEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjY1IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI2NiBmbWEgIDEgICAnMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnCitmbWF4MzI2NyBmbWEgIDEgICAnMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyNjggZm1hICAxICAgJzEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjY5IGZtYSAgMSAgICcxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIGlucHV0IHByZXBhcmF0aW9uIHRlc3RzIChvcGVyYW5kcyBzaG91bGQgbm90IGJlIHJvdW5kZWQpCitwcmVjaXNpb246IDMKK3JvdW5kaW5nOiBoYWxmX3VwCisKK2ZtYXgzMjcwIGZtYSAgMSAgICcxMjM0NTY3ODkwMDAwMCcgIDk5OTk5OTk5OTk5OTkgLT4gICcyLjIzRSsxMycgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI3MSBmbWEgIDEgICAgJzk5OTk5OTk5OTk5OTknIDEyMzQ1Njc4OTAwMDAwIC0+ICAnMi4yM0UrMTMnIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzI3MiBmbWEgIDEgICAnMTJFKzMnICAnMzQ0NCcgICAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorZm1heDMyNzMgZm1hICAxICAgJzEyRSszJyAgJzM0NDYnICAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjc0IGZtYSAgMSAgICcxMkUrMycgICczNDQ5LjknIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI3NSBmbWEgIDEgICAnMTJFKzMnICAnMzQ1MC4wJyAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorZm1heDMyNzYgZm1hICAxICAgJzEyRSszJyAgJzM0NTAuMScgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjc3IGZtYSAgMSAgICcxMkUrMycgICczNDU0JyAgIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI3OCBmbWEgIDEgICAnMTJFKzMnICAnMzQ1NicgICAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzI4MSBmbWEgIDEgICAnMzQ0NCcgICAnMTJFKzMnICAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorZm1heDMyODIgZm1hICAxICAgJzM0NDYnICAgJzEyRSszJyAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjgzIGZtYSAgMSAgICczNDQ5LjknICcxMkUrMycgIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI4NCBmbWEgIDEgICAnMzQ1MC4wJyAnMTJFKzMnICAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorZm1heDMyODUgZm1hICAxICAgJzM0NTAuMScgJzEyRSszJyAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjg2IGZtYSAgMSAgICczNDU0JyAgICcxMkUrMycgIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI4NyBmbWEgIDEgICAnMzQ1NicgICAnMTJFKzMnICAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9kb3duCitmbWF4MzI5MSBmbWEgIDEgICAnMzQ0NCcgICAnMTJFKzMnICAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorZm1heDMyOTIgZm1hICAxICAgJzM0NDYnICAgJzEyRSszJyAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjkzIGZtYSAgMSAgICczNDQ5LjknICcxMkUrMycgIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI5NCBmbWEgIDEgICAnMzQ1MC4wJyAnMTJFKzMnICAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorZm1heDMyOTUgZm1hICAxICAgJzM0NTAuMScgJzEyRSszJyAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjk2IGZtYSAgMSAgICczNDU0JyAgICcxMkUrMycgIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI5NyBmbWEgIDEgICAnMzQ1NicgICAnMTJFKzMnICAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorCistLSAxIGluIGxhc3QgcGxhY2UgdGVzdHMKK3JvdW5kaW5nOiBoYWxmX3VwCitmbWF4MzMwMSBmbWEgIDEgICAgLTEgICAxICAgICAgLT4gICAwCitmbWF4MzMwMiBmbWEgIDEgICAgIDAgICAxICAgICAgLT4gICAxCitmbWF4MzMwMyBmbWEgIDEgICAgIDEgICAxICAgICAgLT4gICAyCitmbWF4MzMwNCBmbWEgIDEgICAgMTIgICAxICAgICAgLT4gIDEzCitmbWF4MzMwNSBmbWEgIDEgICAgOTggICAxICAgICAgLT4gIDk5CitmbWF4MzMwNiBmbWEgIDEgICAgOTkgICAxICAgICAgLT4gMTAwCitmbWF4MzMwNyBmbWEgIDEgICAxMDAgICAxICAgICAgLT4gMTAxCitmbWF4MzMwOCBmbWEgIDEgICAxMDEgICAxICAgICAgLT4gMTAyCitmbWF4MzMwOSBmbWEgIDEgICAgLTEgIC0xICAgICAgLT4gIC0yCitmbWF4MzMxMCBmbWEgIDEgICAgIDAgIC0xICAgICAgLT4gIC0xCitmbWF4MzMxMSBmbWEgIDEgICAgIDEgIC0xICAgICAgLT4gICAwCitmbWF4MzMxMiBmbWEgIDEgICAgMTIgIC0xICAgICAgLT4gIDExCitmbWF4MzMxMyBmbWEgIDEgICAgOTggIC0xICAgICAgLT4gIDk3CitmbWF4MzMxNCBmbWEgIDEgICAgOTkgIC0xICAgICAgLT4gIDk4CitmbWF4MzMxNSBmbWEgIDEgICAxMDAgIC0xICAgICAgLT4gIDk5CitmbWF4MzMxNiBmbWEgIDEgICAxMDEgIC0xICAgICAgLT4gMTAwCisKK2ZtYXgzMzIxIGZtYSAgMSAgIC0wLjAxICAwLjAxICAgIC0+ICAwLjAwCitmbWF4MzMyMiBmbWEgIDEgICAgMC4wMCAgMC4wMSAgICAtPiAgMC4wMQorZm1heDMzMjMgZm1hICAxICAgIDAuMDEgIDAuMDEgICAgLT4gIDAuMDIKK2ZtYXgzMzI0IGZtYSAgMSAgICAwLjEyICAwLjAxICAgIC0+ICAwLjEzCitmbWF4MzMyNSBmbWEgIDEgICAgMC45OCAgMC4wMSAgICAtPiAgMC45OQorZm1heDMzMjYgZm1hICAxICAgIDAuOTkgIDAuMDEgICAgLT4gIDEuMDAKK2ZtYXgzMzI3IGZtYSAgMSAgICAxLjAwICAwLjAxICAgIC0+ICAxLjAxCitmbWF4MzMyOCBmbWEgIDEgICAgMS4wMSAgMC4wMSAgICAtPiAgMS4wMgorZm1heDMzMjkgZm1hICAxICAgLTAuMDEgLTAuMDEgICAgLT4gLTAuMDIKK2ZtYXgzMzMwIGZtYSAgMSAgICAwLjAwIC0wLjAxICAgIC0+IC0wLjAxCitmbWF4MzMzMSBmbWEgIDEgICAgMC4wMSAtMC4wMSAgICAtPiAgMC4wMAorZm1heDMzMzIgZm1hICAxICAgIDAuMTIgLTAuMDEgICAgLT4gIDAuMTEKK2ZtYXgzMzMzIGZtYSAgMSAgICAwLjk4IC0wLjAxICAgIC0+ICAwLjk3CitmbWF4MzMzNCBmbWEgIDEgICAgMC45OSAtMC4wMSAgICAtPiAgMC45OAorZm1heDMzMzUgZm1hICAxICAgIDEuMDAgLTAuMDEgICAgLT4gIDAuOTkKK2ZtYXgzMzM2IGZtYSAgMSAgICAxLjAxIC0wLjAxICAgIC0+ICAxLjAwCisKKy0tIHNvbWUgbW9yZSBjYXNlcyB3aGVyZSBmbWEgIDEgIGluZyAwIGFmZmVjdHMgdGhlIGNvZWZmaWNpZW50CitwcmVjaXNpb246IDkKK2ZtYXgzMzQwIGZtYSAgMSAgIDFFKzMgICAgMCAgICAtPiAgICAgICAgIDEwMDAKK2ZtYXgzMzQxIGZtYSAgMSAgIDFFKzggICAgMCAgICAtPiAgICAxMDAwMDAwMDAKK2ZtYXgzMzQyIGZtYSAgMSAgIDFFKzkgICAgMCAgICAtPiAgIDEuMDAwMDAwMDBFKzkgICBSb3VuZGVkCitmbWF4MzM0MyBmbWEgIDEgICAxRSsxMCAgIDAgICAgLT4gICAxLjAwMDAwMDAwRSsxMCAgUm91bmRlZAorLS0gd2hpY2ggc2ltcGx5IGZvbGxvdyBmcm9tIHRoZXNlIGNhc2VzIC4uLgorZm1heDMzNDQgZm1hICAxICAgMUUrMyAgICAxICAgIC0+ICAgICAgICAgMTAwMQorZm1heDMzNDUgZm1hICAxICAgMUUrOCAgICAxICAgIC0+ICAgIDEwMDAwMDAwMQorZm1heDMzNDYgZm1hICAxICAgMUUrOSAgICAxICAgIC0+ICAgMS4wMDAwMDAwMEUrOSAgIEluZXhhY3QgUm91bmRlZAorZm1heDMzNDcgZm1hICAxICAgMUUrMTAgICAxICAgIC0+ICAgMS4wMDAwMDAwMEUrMTAgIEluZXhhY3QgUm91bmRlZAorZm1heDMzNDggZm1hICAxICAgMUUrMyAgICA3ICAgIC0+ICAgICAgICAgMTAwNworZm1heDMzNDkgZm1hICAxICAgMUUrOCAgICA3ICAgIC0+ICAgIDEwMDAwMDAwNworZm1heDMzNTAgZm1hICAxICAgMUUrOSAgICA3ICAgIC0+ICAgMS4wMDAwMDAwMUUrOSAgIEluZXhhY3QgUm91bmRlZAorZm1heDMzNTEgZm1hICAxICAgMUUrMTAgICA3ICAgIC0+ICAgMS4wMDAwMDAwMEUrMTAgIEluZXhhY3QgUm91bmRlZAorCistLSB0cnl6ZXJvcyBjYXNlcworcHJlY2lzaW9uOiAgIDcKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTIKK21pbmV4cG9uZW50OiAtOTIKK2ZtYXgzMzYxICBmbWEgIDEgICAwRSs1MCAxMDAwMEUrMSAgLT4gMS4wMDAwRSs1CitmbWF4MzM2MiAgZm1hICAxICAgMTAwMDBFKzEgMEUtNTAgIC0+IDEwMDAwMC4wICBSb3VuZGVkCitmbWF4MzM2MyAgZm1hICAxICAgMTAwMDBFKzEgMTAwMDBFLTUwICAtPiAxMDAwMDAuMCAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzM2NCAgZm1hICAxICAgOS45OTk5OTlFKzkyIC05Ljk5OTk5OUUrOTIgLT4gMEUrODYKKworLS0gYSBjdXJpb3NpdHkgZnJvbSBKU1IgMTMgdGVzdGluZworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorcHJlY2lzaW9uOiAgIDEwCitmbWF4MzM3MCBmbWEgIDEgICA5OTk5OTk5OSA4MTUxMiAtPiAxMDAwODE1MTEKK3ByZWNpc2lvbjogICAgICA2CitmbWF4MzM3MSBmbWEgIDEgICA5OTk5OTk5OSA4MTUxMiAtPiAxLjAwMDgyRSs4IFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK3ByZWNpc2lvbjogICAxMAorZm1heDMzNzIgZm1hICAxICAgOTk5OTk5OTkgODE1MTIgLT4gMTAwMDgxNTExCitwcmVjaXNpb246ICAgICAgNgorZm1heDMzNzMgZm1hICAxICAgOTk5OTk5OTkgODE1MTIgLT4gMS4wMDA4MkUrOCBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK3ByZWNpc2lvbjogICAxMAorZm1heDMzNzQgZm1hICAxICAgOTk5OTk5OTkgODE1MTIgLT4gMTAwMDgxNTExCitwcmVjaXNpb246ICAgICAgNgorZm1heDMzNzUgZm1hICAxICAgOTk5OTk5OTkgODE1MTIgLT4gMS4wMDA4MkUrOCBSb3VuZGVkIEluZXhhY3QKKworLS0gdWxwIHJlcGxhY2VtZW50IHRlc3RzCitwcmVjaXNpb246IDkKK21heGV4cG9uZW50OiA5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5CitmbWF4MzQwMCBmbWEgIDEgICAgIDEgICA3N2UtNyAgICAgICAtPiAgMS4wMDAwMDc3CitmbWF4MzQwMSBmbWEgIDEgICAgIDEgICA3N2UtOCAgICAgICAtPiAgMS4wMDAwMDA3NworZm1heDM0MDIgZm1hICAxICAgICAxICAgNzdlLTkgICAgICAgLT4gIDEuMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitmbWF4MzQwMyBmbWEgIDEgICAgIDEgICA3N2UtMTAgICAgICAtPiAgMS4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDA0IGZtYSAgMSAgICAgMSAgIDc3ZS0xMSAgICAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0MDUgZm1hICAxICAgICAxICAgNzdlLTEyICAgICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQwNiBmbWEgIDEgICAgIDEgICA3N2UtOTk5ICAgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDA3IGZtYSAgMSAgICAgMSAgIDc3ZS05OTk5OTkgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzQxMCBmbWEgIDEgICAgMTAgICA3N2UtNyAgICAgICAtPiAgMTAuMDAwMDA3NworZm1heDM0MTEgZm1hICAxICAgIDEwICAgNzdlLTggICAgICAgLT4gIDEwLjAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitmbWF4MzQxMiBmbWEgIDEgICAgMTAgICA3N2UtOSAgICAgICAtPiAgMTAuMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDEzIGZtYSAgMSAgICAxMCAgIDc3ZS0xMCAgICAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0MTQgZm1hICAxICAgIDEwICAgNzdlLTExICAgICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQxNSBmbWEgIDEgICAgMTAgICA3N2UtMTIgICAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDE2IGZtYSAgMSAgICAxMCAgIDc3ZS05OTkgICAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0MTcgZm1hICAxICAgIDEwICAgNzdlLTk5OTk5OSAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNDIwIGZtYSAgMSAgICA3N2UtNyAgICAgICAgMSAgIC0+ICAxLjAwMDAwNzcKK2ZtYXgzNDIxIGZtYSAgMSAgICA3N2UtOCAgICAgICAgMSAgIC0+ICAxLjAwMDAwMDc3CitmbWF4MzQyMiBmbWEgIDEgICAgNzdlLTkgICAgICAgIDEgICAtPiAgMS4wMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDIzIGZtYSAgMSAgICA3N2UtMTAgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM0MjQgZm1hICAxICAgIDc3ZS0xMSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQyNSBmbWEgIDEgICAgNzdlLTEyICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDI2IGZtYSAgMSAgICA3N2UtOTk5ICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0MjcgZm1hICAxICAgIDc3ZS05OTk5OTkgICAxICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNDMwIGZtYSAgMSAgICA3N2UtNyAgICAgICAxMCAgIC0+ICAxMC4wMDAwMDc3CitmbWF4MzQzMSBmbWEgIDEgICAgNzdlLTggICAgICAgMTAgICAtPiAgMTAuMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDMyIGZtYSAgMSAgICA3N2UtOSAgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM0MzMgZm1hICAxICAgIDc3ZS0xMCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQzNCBmbWEgIDEgICAgNzdlLTExICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDM1IGZtYSAgMSAgICA3N2UtMTIgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0MzYgZm1hICAxICAgIDc3ZS05OTkgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQzNyBmbWEgIDEgICAgNzdlLTk5OTk5OSAgMTAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmUgdWxwcworZm1heDM0NDAgZm1hICAxICAgICAxICAgLTc3ZS03ICAgICAgIC0+ICAwLjk5OTk5MjMKK2ZtYXgzNDQxIGZtYSAgMSAgICAgMSAgIC03N2UtOCAgICAgICAtPiAgMC45OTk5OTkyMworZm1heDM0NDIgZm1hICAxICAgICAxICAgLTc3ZS05ICAgICAgIC0+ICAwLjk5OTk5OTkyMworZm1heDM0NDMgZm1hICAxICAgICAxICAgLTc3ZS0xMCAgICAgIC0+ICAwLjk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDQ0IGZtYSAgMSAgICAgMSAgIC03N2UtMTEgICAgICAtPiAgMC45OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ0NSBmbWEgIDEgICAgIDEgICAtNzdlLTEyICAgICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ0NiBmbWEgIDEgICAgIDEgICAtNzdlLTk5OSAgICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ0NyBmbWEgIDEgICAgIDEgICAtNzdlLTk5OTk5OSAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNDUwIGZtYSAgMSAgICAxMCAgIC03N2UtNyAgICAgICAtPiAgIDkuOTk5OTkyMworZm1heDM0NTEgZm1hICAxICAgIDEwICAgLTc3ZS04ICAgICAgIC0+ICAgOS45OTk5OTkyMworZm1heDM0NTIgZm1hICAxICAgIDEwICAgLTc3ZS05ICAgICAgIC0+ICAgOS45OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDUzIGZtYSAgMSAgICAxMCAgIC03N2UtMTAgICAgICAtPiAgIDkuOTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ1NCBmbWEgIDEgICAgMTAgICAtNzdlLTExICAgICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ1NSBmbWEgIDEgICAgMTAgICAtNzdlLTEyICAgICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ1NiBmbWEgIDEgICAgMTAgICAtNzdlLTk5OSAgICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ1NyBmbWEgIDEgICAgMTAgICAtNzdlLTk5OTk5OSAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNDYwIGZtYSAgMSAgICAtNzdlLTcgICAgICAgIDEgICAtPiAgMC45OTk5OTIzCitmbWF4MzQ2MSBmbWEgIDEgICAgLTc3ZS04ICAgICAgICAxICAgLT4gIDAuOTk5OTk5MjMKK2ZtYXgzNDYyIGZtYSAgMSAgICAtNzdlLTkgICAgICAgIDEgICAtPiAgMC45OTk5OTk5MjMKK2ZtYXgzNDYzIGZtYSAgMSAgICAtNzdlLTEwICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ2NCBmbWEgIDEgICAgLTc3ZS0xMSAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM0NjUgZm1hICAxICAgIC03N2UtMTIgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0NjYgZm1hICAxICAgIC03N2UtOTk5ICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0NjcgZm1hICAxICAgIC03N2UtOTk5OTk5ICAgMSAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzQ3MCBmbWEgIDEgICAgLTc3ZS03ICAgICAgIDEwICAgLT4gICA5Ljk5OTk5MjMKK2ZtYXgzNDcxIGZtYSAgMSAgICAtNzdlLTggICAgICAgMTAgICAtPiAgIDkuOTk5OTk5MjMKK2ZtYXgzNDcyIGZtYSAgMSAgICAtNzdlLTkgICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ3MyBmbWEgIDEgICAgLTc3ZS0xMCAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM0NzQgZm1hICAxICAgIC03N2UtMTEgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0NzUgZm1hICAxICAgIC03N2UtMTIgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0NzYgZm1hICAxICAgIC03N2UtOTk5ICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0NzcgZm1hICAxICAgIC03N2UtOTk5OTk5ICAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBuZWdhdGl2ZSB1bHBzCitmbWF4MzQ4MCBmbWEgIDEgICAgLTEgICAgNzdlLTcgICAgICAgLT4gIC0wLjk5OTk5MjMKK2ZtYXgzNDgxIGZtYSAgMSAgICAtMSAgICA3N2UtOCAgICAgICAtPiAgLTAuOTk5OTk5MjMKK2ZtYXgzNDgyIGZtYSAgMSAgICAtMSAgICA3N2UtOSAgICAgICAtPiAgLTAuOTk5OTk5OTIzCitmbWF4MzQ4MyBmbWEgIDEgICAgLTEgICAgNzdlLTEwICAgICAgLT4gIC0wLjk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDg0IGZtYSAgMSAgICAtMSAgICA3N2UtMTEgICAgICAtPiAgLTAuOTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM0ODUgZm1hICAxICAgIC0xICAgIDc3ZS0xMiAgICAgIC0+ICAtMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDg2IGZtYSAgMSAgICAtMSAgICA3N2UtOTk5ICAgICAtPiAgLTEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ4NyBmbWEgIDEgICAgLTEgICAgNzdlLTk5OTk5OSAgLT4gIC0xLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzQ5MCBmbWEgIDEgICAtMTAgICAgNzdlLTcgICAgICAgLT4gICAtOS45OTk5OTIzCitmbWF4MzQ5MSBmbWEgIDEgICAtMTAgICAgNzdlLTggICAgICAgLT4gICAtOS45OTk5OTkyMworZm1heDM0OTIgZm1hICAxICAgLTEwICAgIDc3ZS05ICAgICAgIC0+ICAgLTkuOTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ5MyBmbWEgIDEgICAtMTAgICAgNzdlLTEwICAgICAgLT4gICAtOS45OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDk0IGZtYSAgMSAgIC0xMCAgICA3N2UtMTEgICAgICAtPiAgLTEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ5NSBmbWEgIDEgICAtMTAgICAgNzdlLTEyICAgICAgLT4gIC0xMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0OTYgZm1hICAxICAgLTEwICAgIDc3ZS05OTkgICAgIC0+ICAtMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDk3IGZtYSAgMSAgIC0xMCAgICA3N2UtOTk5OTk5ICAtPiAgLTEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNTAwIGZtYSAgMSAgICAgNzdlLTcgICAgICAgLTEgICAtPiAgLTAuOTk5OTkyMworZm1heDM1MDEgZm1hICAxICAgICA3N2UtOCAgICAgICAtMSAgIC0+ICAtMC45OTk5OTkyMworZm1heDM1MDIgZm1hICAxICAgICA3N2UtOSAgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5MjMKK2ZtYXgzNTAzIGZtYSAgMSAgICAgNzdlLTEwICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZm1heDM1MDQgZm1hICAxICAgICA3N2UtMTEgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzUwNSBmbWEgIDEgICAgIDc3ZS0xMiAgICAgIC0xICAgLT4gIC0xLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM1MDYgZm1hICAxICAgICA3N2UtOTk5ICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNTA3IGZtYSAgMSAgICAgNzdlLTk5OTk5OSAgLTEgICAtPiAgLTEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNTEwIGZtYSAgMSAgICAgNzdlLTcgICAgICAgLTEwICAtPiAgIC05Ljk5OTk5MjMKK2ZtYXgzNTExIGZtYSAgMSAgICAgNzdlLTggICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTIzCitmbWF4MzUxMiBmbWEgIDEgICAgIDc3ZS05ICAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNTEzIGZtYSAgMSAgICAgNzdlLTEwICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM1MTQgZm1hICAxICAgICA3N2UtMTEgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNTE1IGZtYSAgMSAgICAgNzdlLTEyICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzUxNiBmbWEgIDEgICAgIDc3ZS05OTkgICAgIC0xMCAgLT4gIC0xMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM1MTcgZm1hICAxICAgICA3N2UtOTk5OTk5ICAtMTAgIC0+ICAtMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworCistLSBsb25nIG9wZXJhbmRzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CitmbWF4MzUyMSBmbWEgIDEgICAxMjM0NTY3ODAwMCAwIC0+IDEuMjM0NTY3ODBFKzEwIFJvdW5kZWQKK2ZtYXgzNTIyIGZtYSAgMSAgIDAgMTIzNDU2NzgwMDAgLT4gMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorZm1heDM1MjMgZm1hICAxICAgMTIzNDU2NzgwMCAgMCAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK2ZtYXgzNTI0IGZtYSAgMSAgIDAgMTIzNDU2NzgwMCAgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCitmbWF4MzUyNSBmbWEgIDEgICAxMjM0NTY3ODkwICAwIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorZm1heDM1MjYgZm1hICAxICAgMCAxMjM0NTY3ODkwICAtPiAxLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK2ZtYXgzNTI3IGZtYSAgMSAgIDEyMzQ1Njc4OTEgIDAgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNTI4IGZtYSAgMSAgIDAgMTIzNDU2Nzg5MSAgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNTI5IGZtYSAgMSAgIDEyMzQ1Njc4OTAxIDAgLT4gMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzUzMCBmbWEgIDEgICAwIDEyMzQ1Njc4OTAxIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorZm1heDM1MzEgZm1hICAxICAgMTIzNDU2Nzg5NiAgMCAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorZm1heDM1MzIgZm1hICAxICAgMCAxMjM0NTY3ODk2ICAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDE1CistLSBzdGlsbCBjaGVja2luZworZm1heDM1NDEgZm1hICAxICAgMTIzNDU2NzgwMDAgMCAtPiAxMjM0NTY3ODAwMAorZm1heDM1NDIgZm1hICAxICAgMCAxMjM0NTY3ODAwMCAtPiAxMjM0NTY3ODAwMAorZm1heDM1NDMgZm1hICAxICAgMTIzNDU2NzgwMCAgMCAtPiAxMjM0NTY3ODAwCitmbWF4MzU0NCBmbWEgIDEgICAwIDEyMzQ1Njc4MDAgIC0+IDEyMzQ1Njc4MDAKK2ZtYXgzNTQ1IGZtYSAgMSAgIDEyMzQ1Njc4OTAgIDAgLT4gMTIzNDU2Nzg5MAorZm1heDM1NDYgZm1hICAxICAgMCAxMjM0NTY3ODkwICAtPiAxMjM0NTY3ODkwCitmbWF4MzU0NyBmbWEgIDEgICAxMjM0NTY3ODkxICAwIC0+IDEyMzQ1Njc4OTEKK2ZtYXgzNTQ4IGZtYSAgMSAgIDAgMTIzNDU2Nzg5MSAgLT4gMTIzNDU2Nzg5MQorZm1heDM1NDkgZm1hICAxICAgMTIzNDU2Nzg5MDEgMCAtPiAxMjM0NTY3ODkwMQorZm1heDM1NTAgZm1hICAxICAgMCAxMjM0NTY3ODkwMSAtPiAxMjM0NTY3ODkwMQorZm1heDM1NTEgZm1hICAxICAgMTIzNDU2Nzg5NiAgMCAtPiAxMjM0NTY3ODk2CitmbWF4MzU1MiBmbWEgIDEgICAwIDEyMzQ1Njc4OTYgIC0+IDEyMzQ1Njc4OTYKKworLS0gdmVyaWZ5IGEgcXVlcnkKK3ByZWNpc2lvbjogICAgMTYKK21heEV4cG9uZW50OiArMzk0CittaW5FeHBvbmVudDogLTM5Mworcm91bmRpbmc6ICAgICBkb3duCitmbWF4MzU2MSBmbWEgIDEgICAxZS0zOTggOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IEluZXhhY3QgUm91bmRlZAorZm1heDM1NjIgZm1hICAxICAgICAgICAwIDkuMDAwMDAwMDAwMDAwMDAwRSszODQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBSb3VuZGVkCistLSBhbmQgdXNpbmcgZGVjaW1hbDY0IGJvdW5kcy4uLgorcHJlY2lzaW9uOiAgICAxNgorbWF4RXhwb25lbnQ6ICszODQKK21pbkV4cG9uZW50OiAtMzgzCityb3VuZGluZzogICAgIGRvd24KK2ZtYXgzNTYzIGZtYSAgMSAgIDFlLTM4OCA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgSW5leGFjdCBSb3VuZGVkCitmbWF4MzU2NCBmbWEgIDEgICAgICAgIDAgOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IFJvdW5kZWQKKworCistLSBzb21lIG1vcmUgcmVzaWR1ZSBlZmZlY3RzIHdpdGggZXh0cmVtZSByb3VuZGluZworcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiBoYWxmX3VwCitmbWF4MzYwMSBmbWEgIDEgICAxMjM0NTY3ODkgIDAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2ZtYXgzNjAyIGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZG93bgorZm1heDM2MDMgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZmxvb3IKK2ZtYXgzNjA0IGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGNlaWxpbmcKK2ZtYXgzNjA1IGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC4wMDAwMDEgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IHVwCitmbWF4MzYwNiBmbWEgIDEgICAxMjM0NTY3ODkgIDAuMDAwMDAxIC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBkb3duCitmbWF4MzYwNyBmbWEgIDEgICAxMjM0NTY3ODkgIDAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK2ZtYXgzNjExIGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZXZlbgorZm1heDM2MTIgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9kb3duCitmbWF4MzYxMyBmbWEgIDEgICAxMjM0NTY3ODkgLTAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBmbG9vcgorZm1heDM2MTQgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjAwMDAwMSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogY2VpbGluZworZm1heDM2MTUgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogdXAKK2ZtYXgzNjE2IGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGRvd24KK2ZtYXgzNjE3IGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC4wMDAwMDEgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorZm1heDM2MjEgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9ldmVuCitmbWF4MzYyMiBmbWEgIDEgICAxMjM0NTY3ODkgIDAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK2ZtYXgzNjIzIGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC40OTk5OTkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGZsb29yCitmbWF4MzYyNCBmbWEgIDEgICAxMjM0NTY3ODkgIDAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBjZWlsaW5nCitmbWF4MzYyNSBmbWEgIDEgICAxMjM0NTY3ODkgIDAuNDk5OTk5IC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiB1cAorZm1heDM2MjYgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjQ5OTk5OSAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZG93bgorZm1heDM2MjcgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX3VwCitmbWF4MzYzMSBmbWEgIDEgICAxMjM0NTY3ODkgLTAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2ZtYXgzNjMyIGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC40OTk5OTkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZG93bgorZm1heDM2MzMgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZmxvb3IKK2ZtYXgzNjM0IGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC40OTk5OTkgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGNlaWxpbmcKK2ZtYXgzNjM1IGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC40OTk5OTkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IHVwCitmbWF4MzYzNiBmbWEgIDEgICAxMjM0NTY3ODkgLTAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBkb3duCitmbWF4MzYzNyBmbWEgIDEgICAxMjM0NTY3ODkgLTAuNDk5OTk5IC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK2ZtYXgzNjQxIGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC41MDAwMDEgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZXZlbgorZm1heDM2NDIgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjUwMDAwMSAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9kb3duCitmbWF4MzY0MyBmbWEgIDEgICAxMjM0NTY3ODkgIDAuNTAwMDAxIC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBmbG9vcgorZm1heDM2NDQgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjUwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogY2VpbGluZworZm1heDM2NDUgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjUwMDAwMSAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogdXAKK2ZtYXgzNjQ2IGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC41MDAwMDEgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGRvd24KK2ZtYXgzNjQ3IGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC41MDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorZm1heDM2NTEgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjUwMDAwMSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9ldmVuCitmbWF4MzY1MiBmbWEgIDEgICAxMjM0NTY3ODkgLTAuNTAwMDAxIC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK2ZtYXgzNjUzIGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC41MDAwMDEgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGZsb29yCitmbWF4MzY1NCBmbWEgIDEgICAxMjM0NTY3ODkgLTAuNTAwMDAxIC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBjZWlsaW5nCitmbWF4MzY1NSBmbWEgIDEgICAxMjM0NTY3ODkgLTAuNTAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiB1cAorZm1heDM2NTYgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjUwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZG93bgorZm1heDM2NTcgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjUwMDAwMSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCisKKy0tIGxvbmcgb3BlcmFuZCB0cmlhbmdsZQorcm91bmRpbmc6IGhhbGZfdXAKK3ByZWNpc2lvbjogIDM3CitmbWF4MzY2MCBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMTQ4MzQ1MzgKK3ByZWNpc2lvbjogIDM2CitmbWF4MzY2MSBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMTQ4MzQ1NCAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAzNQorZm1heDM2NjIgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTE0ODM0NSAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMzQKK2ZtYXgzNjYzIGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMzNzExNDgzNSAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDMzCitmbWF4MzY2NCBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMTQ4MyAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAzMgorZm1heDM2NjUgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTE0OCAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMzEKK2ZtYXgzNjY2IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMzNzExNSAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDMwCitmbWF4MzY2NyBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMSAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyOQorZm1heDM2NjggZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjgKK2ZtYXgzNjY5IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMzNyAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDI3CitmbWF4MzY3MCBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzNCAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyNgorZm1heDM2NzEgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMyAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjUKK2ZtYXgzNjcyIGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMiAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDI0CitmbWF4MzY3MyBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MiAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyMworZm1heDM2NzQgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OSAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjIKK2ZtYXgzNjc1IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzOSAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDIxCitmbWF4MzY3NiBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2NCAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyMAorZm1heDM2NzcgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNiAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTkKK2ZtYXgzNjc4IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyNCAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDE4CitmbWF4MzY3OSBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMiAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxNworZm1heDM2ODAgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMCAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTYKK2ZtYXgzNjgxIGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMSAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDE1CitmbWF4MzY4MiBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMSAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxNAorZm1heDM2ODMgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMiAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTMKK2ZtYXgzNjg0IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MiAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDEyCitmbWF4MzY4NSBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNCAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxMQorZm1heDM2ODYgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTAKK2ZtYXgzNjg3IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg0NzExNzQxN0UrMTAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA5CitmbWF4MzY4OCBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOS44NDcxMTc0MkUrMTAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgOAorZm1heDM2ODkgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDkuODQ3MTE3NEUrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDcKK2ZtYXgzNjkwIGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg0NzExN0UrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDYKK2ZtYXgzNjkxIGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg0NzEyRSsxMCAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgNQorZm1heDM2OTIgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDkuODQ3MUUrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDQKK2ZtYXgzNjkzIGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg0N0UrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDMKK2ZtYXgzNjk0IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg1RSsxMCAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMgorZm1heDM2OTUgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDkuOEUrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDEKK2ZtYXgzNjk2IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiAxRSsxMSAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG1vcmUgemVyb3MsIGV0Yy4KK3JvdW5kaW5nOiBoYWxmX3VwCitwcmVjaXNpb246ICAgOQorCitmbWF4MzcwMSBmbWEgIDEgICA1LjAwIDEuMDBFLTMgLT4gNS4wMDEwMAorZm1heDM3MDIgZm1hICAxICAgMDAuMDAgMC4wMDAgIC0+IDAuMDAwCitmbWF4MzcwMyBmbWEgIDEgICAwMC4wMCAwRS0zICAgLT4gMC4wMDAKK2ZtYXgzNzA0IGZtYSAgMSAgIDBFLTMgIDAwLjAwICAtPiAwLjAwMAorCitmbWF4MzcxMCBmbWEgIDEgICAwRSszICAwMC4wMCAgLT4gMC4wMAorZm1heDM3MTEgZm1hICAxICAgMEUrMyAgMDAuMCAgIC0+IDAuMAorZm1heDM3MTIgZm1hICAxICAgMEUrMyAgMDAuICAgIC0+IDAKK2ZtYXgzNzEzIGZtYSAgMSAgIDBFKzMgIDAwLkUrMSAtPiAwRSsxCitmbWF4MzcxNCBmbWEgIDEgICAwRSszICAwMC5FKzIgLT4gMEUrMgorZm1heDM3MTUgZm1hICAxICAgMEUrMyAgMDAuRSszIC0+IDBFKzMKK2ZtYXgzNzE2IGZtYSAgMSAgIDBFKzMgIDAwLkUrNCAtPiAwRSszCitmbWF4MzcxNyBmbWEgIDEgICAwRSszICAwMC5FKzUgLT4gMEUrMworZm1heDM3MTggZm1hICAxICAgMEUrMyAgLTAwLjAgICAtPiAwLjAKK2ZtYXgzNzE5IGZtYSAgMSAgIDBFKzMgIC0wMC4gICAgLT4gMAorZm1heDM3MzEgZm1hICAxICAgMEUrMyAgLTAwLkUrMSAtPiAwRSsxCisKK2ZtYXgzNzIwIGZtYSAgMSAgIDAwLjAwICAwRSszICAtPiAwLjAwCitmbWF4MzcyMSBmbWEgIDEgICAwMC4wICAgMEUrMyAgLT4gMC4wCitmbWF4MzcyMiBmbWEgIDEgICAwMC4gICAgMEUrMyAgLT4gMAorZm1heDM3MjMgZm1hICAxICAgMDAuRSsxIDBFKzMgIC0+IDBFKzEKK2ZtYXgzNzI0IGZtYSAgMSAgIDAwLkUrMiAwRSszICAtPiAwRSsyCitmbWF4MzcyNSBmbWEgIDEgICAwMC5FKzMgMEUrMyAgLT4gMEUrMworZm1heDM3MjYgZm1hICAxICAgMDAuRSs0IDBFKzMgIC0+IDBFKzMKK2ZtYXgzNzI3IGZtYSAgMSAgIDAwLkUrNSAwRSszICAtPiAwRSszCitmbWF4MzcyOCBmbWEgIDEgICAtMDAuMDAgMEUrMyAgLT4gMC4wMAorZm1heDM3MjkgZm1hICAxICAgLTAwLjAgIDBFKzMgIC0+IDAuMAorZm1heDM3MzAgZm1hICAxICAgLTAwLiAgIDBFKzMgIC0+IDAKKworZm1heDM3MzIgZm1hICAxICAgIDAgICAgIDAgICAgIC0+ICAwCitmbWF4MzczMyBmbWEgIDEgICAgMCAgICAtMCAgICAgLT4gIDAKK2ZtYXgzNzM0IGZtYSAgMSAgIC0wICAgICAwICAgICAtPiAgMAorZm1heDM3MzUgZm1hICAxICAgLTAgICAgLTAgICAgIC0+IC0wICAgICAtLSBJRUVFIDg1NCBzcGVjaWFsIGNhc2UKKworZm1heDM3MzYgZm1hICAxICAgIDEgICAgLTEgICAgIC0+ICAwCitmbWF4MzczNyBmbWEgIDEgICAtMSAgICAtMSAgICAgLT4gLTIKK2ZtYXgzNzM4IGZtYSAgMSAgICAxICAgICAxICAgICAtPiAgMgorZm1heDM3MzkgZm1hICAxICAgLTEgICAgIDEgICAgIC0+ICAwCisKK2ZtYXgzNzQxIGZtYSAgMSAgICAwICAgIC0xICAgICAtPiAtMQorZm1heDM3NDIgZm1hICAxICAgLTAgICAgLTEgICAgIC0+IC0xCitmbWF4Mzc0MyBmbWEgIDEgICAgMCAgICAgMSAgICAgLT4gIDEKK2ZtYXgzNzQ0IGZtYSAgMSAgIC0wICAgICAxICAgICAtPiAgMQorZm1heDM3NDUgZm1hICAxICAgLTEgICAgIDAgICAgIC0+IC0xCitmbWF4Mzc0NiBmbWEgIDEgICAtMSAgICAtMCAgICAgLT4gLTEKK2ZtYXgzNzQ3IGZtYSAgMSAgICAxICAgICAwICAgICAtPiAgMQorZm1heDM3NDggZm1hICAxICAgIDEgICAgLTAgICAgIC0+ICAxCisKK2ZtYXgzNzUxIGZtYSAgMSAgICAwLjAgIC0xICAgICAtPiAtMS4wCitmbWF4Mzc1MiBmbWEgIDEgICAtMC4wICAtMSAgICAgLT4gLTEuMAorZm1heDM3NTMgZm1hICAxICAgIDAuMCAgIDEgICAgIC0+ICAxLjAKK2ZtYXgzNzU0IGZtYSAgMSAgIC0wLjAgICAxICAgICAtPiAgMS4wCitmbWF4Mzc1NSBmbWEgIDEgICAtMS4wICAgMCAgICAgLT4gLTEuMAorZm1heDM3NTYgZm1hICAxICAgLTEuMCAgLTAgICAgIC0+IC0xLjAKK2ZtYXgzNzU3IGZtYSAgMSAgICAxLjAgICAwICAgICAtPiAgMS4wCitmbWF4Mzc1OCBmbWEgIDEgICAgMS4wICAtMCAgICAgLT4gIDEuMAorCitmbWF4Mzc2MSBmbWEgIDEgICAgMCAgICAtMS4wICAgLT4gLTEuMAorZm1heDM3NjIgZm1hICAxICAgLTAgICAgLTEuMCAgIC0+IC0xLjAKK2ZtYXgzNzYzIGZtYSAgMSAgICAwICAgICAxLjAgICAtPiAgMS4wCitmbWF4Mzc2NCBmbWEgIDEgICAtMCAgICAgMS4wICAgLT4gIDEuMAorZm1heDM3NjUgZm1hICAxICAgLTEgICAgIDAuMCAgIC0+IC0xLjAKK2ZtYXgzNzY2IGZtYSAgMSAgIC0xICAgIC0wLjAgICAtPiAtMS4wCitmbWF4Mzc2NyBmbWEgIDEgICAgMSAgICAgMC4wICAgLT4gIDEuMAorZm1heDM3NjggZm1hICAxICAgIDEgICAgLTAuMCAgIC0+ICAxLjAKKworZm1heDM3NzEgZm1hICAxICAgIDAuMCAgLTEuMCAgIC0+IC0xLjAKK2ZtYXgzNzcyIGZtYSAgMSAgIC0wLjAgIC0xLjAgICAtPiAtMS4wCitmbWF4Mzc3MyBmbWEgIDEgICAgMC4wICAgMS4wICAgLT4gIDEuMAorZm1heDM3NzQgZm1hICAxICAgLTAuMCAgIDEuMCAgIC0+ICAxLjAKK2ZtYXgzNzc1IGZtYSAgMSAgIC0xLjAgICAwLjAgICAtPiAtMS4wCitmbWF4Mzc3NiBmbWEgIDEgICAtMS4wICAtMC4wICAgLT4gLTEuMAorZm1heDM3NzcgZm1hICAxICAgIDEuMCAgIDAuMCAgIC0+ICAxLjAKK2ZtYXgzNzc4IGZtYSAgMSAgICAxLjAgIC0wLjAgICAtPiAgMS4wCisKKy0tIFNwZWNpYWxzCitmbWF4Mzc4MCBmbWEgIDEgICAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4Mzc4MSBmbWEgIDEgICAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitmbWF4Mzc4MiBmbWEgIDEgICAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitmbWF4Mzc4MyBmbWEgIDEgICAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitmbWF4Mzc4NCBmbWEgIDEgICAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitmbWF4Mzc4NSBmbWEgIDEgICAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitmbWF4Mzc4NiBmbWEgIDEgICAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitmbWF4Mzc4NyBmbWEgIDEgICAtMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4Mzc4OCBmbWEgIDEgICAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4Mzc4OSBmbWEgIDEgICAtMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4Mzc5MCBmbWEgIDEgICAtMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4Mzc5MSBmbWEgIDEgICAgMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4Mzc5MiBmbWEgIDEgICAgMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4Mzc5MyBmbWEgIDEgICAgMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4Mzc5NCBmbWEgIDEgICAgSW5mICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworZm1heDM4MDAgZm1hICAxICAgIEluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzgwMSBmbWEgIDEgICAgSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitmbWF4MzgwMiBmbWEgIDEgICAgSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitmbWF4MzgwMyBmbWEgIDEgICAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitmbWF4MzgwNCBmbWEgIDEgICAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitmbWF4MzgwNSBmbWEgIDEgICAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitmbWF4MzgwNiBmbWEgIDEgICAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitmbWF4MzgwNyBmbWEgIDEgICAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitmbWF4MzgwOCBmbWEgIDEgICAtMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitmbWF4MzgwOSBmbWEgIDEgICAtSW5mICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODEwIGZtYSAgMSAgIC0xICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2ZtYXgzODExIGZtYSAgMSAgIC0wICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2ZtYXgzODEyIGZtYSAgMSAgICAwICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2ZtYXgzODEzIGZtYSAgMSAgICAxICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2ZtYXgzODE0IGZtYSAgMSAgICAxMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2ZtYXgzODE1IGZtYSAgMSAgICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZm1heDM4MjEgZm1hICAxICAgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2ZtYXgzODIyIGZtYSAgMSAgICBOYU4gLTEwMDAgICAtPiAgTmFOCitmbWF4MzgyMyBmbWEgIDEgICAgTmFOIC0xICAgICAgLT4gIE5hTgorZm1heDM4MjQgZm1hICAxICAgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2ZtYXgzODI1IGZtYSAgMSAgICBOYU4gIDAgICAgICAtPiAgTmFOCitmbWF4MzgyNiBmbWEgIDEgICAgTmFOICAxICAgICAgLT4gIE5hTgorZm1heDM4MjcgZm1hICAxICAgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2ZtYXgzODI4IGZtYSAgMSAgICBOYU4gIEluZiAgICAtPiAgTmFOCitmbWF4MzgyOSBmbWEgIDEgICAgTmFOICBOYU4gICAgLT4gIE5hTgorZm1heDM4MzAgZm1hICAxICAgLUluZiAgTmFOICAgIC0+ICBOYU4KK2ZtYXgzODMxIGZtYSAgMSAgIC0xMDAwIE5hTiAgICAtPiAgTmFOCitmbWF4MzgzMiBmbWEgIDEgICAtMSAgICBOYU4gICAgLT4gIE5hTgorZm1heDM4MzMgZm1hICAxICAgLTAgICAgTmFOICAgIC0+ICBOYU4KK2ZtYXgzODM0IGZtYSAgMSAgICAwICAgIE5hTiAgICAtPiAgTmFOCitmbWF4MzgzNSBmbWEgIDEgICAgMSAgICBOYU4gICAgLT4gIE5hTgorZm1heDM4MzYgZm1hICAxICAgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2ZtYXgzODM3IGZtYSAgMSAgICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2ZtYXgzODQxIGZtYSAgMSAgICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NDIgZm1hICAxICAgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg0MyBmbWEgIDEgICAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODQ0IGZtYSAgMSAgICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NDUgZm1hICAxICAgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg0NiBmbWEgIDEgICAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODQ3IGZtYSAgMSAgICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NDggZm1hICAxICAgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg0OSBmbWEgIDEgICAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODUwIGZtYSAgMSAgICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NTEgZm1hICAxICAgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg1MiBmbWEgIDEgICAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODUzIGZtYSAgMSAgIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NTQgZm1hICAxICAgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg1NSBmbWEgIDEgICAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODU2IGZtYSAgMSAgICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NTcgZm1hICAxICAgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg1OCBmbWEgIDEgICAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODU5IGZtYSAgMSAgICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitmbWF4Mzg2MSBmbWEgIDEgICAgTmFOMSAgIC1JbmYgICAgLT4gIE5hTjEKK2ZtYXgzODYyIGZtYSAgMSAgICtOYU4yICAgLTEwMDAgICAtPiAgTmFOMgorZm1heDM4NjMgZm1hICAxICAgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCitmbWF4Mzg2NCBmbWEgIDEgICAgTmFONCAgICBJbmYgICAgLT4gIE5hTjQKK2ZtYXgzODY1IGZtYSAgMSAgICBOYU41ICAgK05hTjYgICAtPiAgTmFONQorZm1heDM4NjYgZm1hICAxICAgLUluZiAgICAgTmFONyAgIC0+ICBOYU43CitmbWF4Mzg2NyBmbWEgIDEgICAtMTAwMCAgICBOYU44ICAgLT4gIE5hTjgKK2ZtYXgzODY4IGZtYSAgMSAgICAxMDAwICAgIE5hTjkgICAtPiAgTmFOOQorZm1heDM4NjkgZm1hICAxICAgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorZm1heDM4NzEgZm1hICAxICAgIHNOYU4xMSAgLUluZiAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODcyIGZtYSAgMSAgICBzTmFOMTIgIC0xMDAwICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg3MyBmbWEgIDEgICAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NzQgZm1hICAxICAgIHNOYU4xNCAgIE5hTjE3IC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODc1IGZtYSAgMSAgICBzTmFOMTUgIHNOYU4xOCAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg3NiBmbWEgIDEgICAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NzcgZm1hICAxICAgLUluZiAgICArc05hTjIwIC0+ICBOYU4yMCAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODc4IGZtYSAgMSAgIC0xMDAwICAgIHNOYU4yMSAtPiAgTmFOMjEgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg3OSBmbWEgIDEgICAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4ODAgZm1hICAxICAgIEluZiAgICAgc05hTjIzIC0+ICBOYU4yMyAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODgxIGZtYSAgMSAgICtOYU4yNSAgK3NOYU4yNCAtPiAgTmFOMjQgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg4MiBmbWEgIDEgICAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2CitmbWF4Mzg4MyBmbWEgIDEgICAtc05hTjI3ICBzTmFOMjkgLT4gLU5hTjI3ICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4ODQgZm1hICAxICAgIDEwMDAgICAgLU5hTjMwIC0+IC1OYU4zMAorZm1heDM4ODUgZm1hICAxICAgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gb3ZlcmZsb3csIHVuZGVyZmxvdyBhbmQgc3Vibm9ybWFsIHRlc3RzCittYXhleHBvbmVudDogOTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OQorcHJlY2lzaW9uOiA5CitmbWF4Mzg5MCBmbWEgIDEgICAxRSs5OTk5OTkgICAgIDlFKzk5OTk5OSAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDM4OTEgZm1hICAxICAgOUUrOTk5OTk5ICAgICAxRSs5OTk5OTkgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzODkyIGZtYSAgMSAgIC0xLjFFLTk5OTk5OSAgMUUtOTk5OTk5ICAgLT4gLTFFLTEwMDAwMDAgICAgU3Vibm9ybWFsCitmbWF4Mzg5MyBmbWEgIDEgICAxRS05OTk5OTkgICAgLTEuMWUtOTk5OTk5IC0+IC0xRS0xMDAwMDAwICAgIFN1Ym5vcm1hbAorZm1heDM4OTQgZm1hICAxICAgLTEuMDAwMUUtOTk5OTk5ICAxRS05OTk5OTkgICAtPiAtMUUtMTAwMDAwMyBTdWJub3JtYWwKK2ZtYXgzODk1IGZtYSAgMSAgIDFFLTk5OTk5OSAgICAtMS4wMDAxZS05OTk5OTkgLT4gLTFFLTEwMDAwMDMgU3Vibm9ybWFsCitmbWF4Mzg5NiBmbWEgIDEgICAtMUUrOTk5OTk5ICAgLTlFKzk5OTk5OSAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzODk3IGZtYSAgMSAgIC05RSs5OTk5OTkgICAtMUUrOTk5OTk5ICAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDM4OTggZm1hICAxICAgKzEuMUUtOTk5OTk5IC0xRS05OTk5OTkgICAtPiAxRS0xMDAwMDAwICAgU3Vibm9ybWFsCitmbWF4Mzg5OSBmbWEgIDEgICAtMUUtOTk5OTk5ICAgKzEuMWUtOTk5OTk5IC0+IDFFLTEwMDAwMDAgICAgU3Vibm9ybWFsCitmbWF4MzkwMCBmbWEgIDEgICArMS4wMDAxRS05OTk5OTkgLTFFLTk5OTk5OSAgIC0+IDFFLTEwMDAwMDMgU3Vibm9ybWFsCitmbWF4MzkwMSBmbWEgIDEgICAtMUUtOTk5OTk5ICAgKzEuMDAwMWUtOTk5OTk5IC0+IDFFLTEwMDAwMDMgU3Vibm9ybWFsCitmbWF4MzkwMiBmbWEgIDEgICAtMUUrOTk5OTk5ICAgKzlFKzk5OTk5OSAgIC0+ICA4RSs5OTk5OTkKK2ZtYXgzOTAzIGZtYSAgMSAgIC05RSs5OTk5OTkgICArMUUrOTk5OTk5ICAgLT4gLThFKzk5OTk5OQorCitwcmVjaXNpb246IDMKK2ZtYXgzOTA0IGZtYSAgMSAgICAgICAgMCAtOS45OTlFKzk5OTk5OSAgIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2ZtYXgzOTA1IGZtYSAgMSAgICAgICAgICAtOS45OTlFKzk5OTk5OSAwIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2ZtYXgzOTA2IGZtYSAgMSAgICAgICAgMCAgOS45OTlFKzk5OTk5OSAgIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2ZtYXgzOTA3IGZtYSAgMSAgICAgICAgICAgOS45OTlFKzk5OTk5OSAwIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworcHJlY2lzaW9uOiAzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorZm1heDM5MTAgZm1hICAxICAgIDEuMDBFLTk5OSAgIDAgICAgLT4gICAxLjAwRS05OTkKK2ZtYXgzOTExIGZtYSAgMSAgICAwLjFFLTk5OSAgICAwICAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbAorZm1heDM5MTIgZm1hICAxICAgIDAuMTBFLTk5OSAgIDAgICAgLT4gICAxLjBFLTEwMDAgU3Vibm9ybWFsCitmbWF4MzkxMyBmbWEgIDEgICAgMC4xMDBFLTk5OSAgMCAgICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorZm1heDM5MTQgZm1hICAxICAgIDAuMDFFLTk5OSAgIDAgICAgLT4gICAxRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gTm1pbgorZm1heDM5MTUgZm1hICAxICAgIDAuOTk5RS05OTkgIDAgICAgLT4gICAxLjAwRS05OTkgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzOTE2IGZtYSAgMSAgICAwLjA5OUUtOTk5ICAwICAgIC0+ICAgMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzkxNyBmbWEgIDEgICAgMC4wMDlFLTk5OSAgMCAgICAtPiAgIDFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDM5MTggZm1hICAxICAgIDAuMDAxRS05OTkgIDAgICAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM5MTkgZm1hICAxICAgIDAuMDAwOUUtOTk5IDAgICAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM5MjAgZm1hICAxICAgIDAuMDAwMUUtOTk5IDAgICAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCitmbWF4MzkzMCBmbWEgIDEgICAtMS4wMEUtOTk5ICAgMCAgICAtPiAgLTEuMDBFLTk5OQorZm1heDM5MzEgZm1hICAxICAgLTAuMUUtOTk5ICAgIDAgICAgLT4gIC0xRS0xMDAwICAgU3Vibm9ybWFsCitmbWF4MzkzMiBmbWEgIDEgICAtMC4xMEUtOTk5ICAgMCAgICAtPiAgLTEuMEUtMTAwMCBTdWJub3JtYWwKK2ZtYXgzOTMzIGZtYSAgMSAgIC0wLjEwMEUtOTk5ICAwICAgIC0+ICAtMS4wRS0xMDAwIFN1Ym5vcm1hbCBSb3VuZGVkCitmbWF4MzkzNCBmbWEgIDEgICAtMC4wMUUtOTk5ICAgMCAgICAtPiAgLTFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBObWluCitmbWF4MzkzNSBmbWEgIDEgICAtMC45OTlFLTk5OSAgMCAgICAtPiAgLTEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDM5MzYgZm1hICAxICAgLTAuMDk5RS05OTkgIDAgICAgLT4gIC0xLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzOTM3IGZtYSAgMSAgIC0wLjAwOUUtOTk5ICAwICAgIC0+ICAtMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzkzOCBmbWEgIDEgICAtMC4wMDFFLTk5OSAgMCAgICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzkzOSBmbWEgIDEgICAtMC4wMDA5RS05OTkgMCAgICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4Mzk0MCBmbWEgIDEgICAtMC4wMDAxRS05OTkgMCAgICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCisKKy0tIHNvbWUgbm9uLXplcm8gc3Vibm9ybWFsIGZtYSAgMSAgcworZm1heDM5NTAgZm1hICAxICAgIDEuMDBFLTk5OSAgICAwLjFFLTk5OSAgLT4gICAxLjEwRS05OTkKK2ZtYXgzOTUxIGZtYSAgMSAgICAwLjFFLTk5OSAgICAgMC4xRS05OTkgIC0+ICAgMkUtMTAwMCAgICBTdWJub3JtYWwKK2ZtYXgzOTUyIGZtYSAgMSAgICAwLjEwRS05OTkgICAgMC4xRS05OTkgIC0+ICAgMi4wRS0xMDAwICBTdWJub3JtYWwKK2ZtYXgzOTUzIGZtYSAgMSAgICAwLjEwMEUtOTk5ICAgMC4xRS05OTkgIC0+ICAgMi4wRS0xMDAwICBTdWJub3JtYWwgUm91bmRlZAorZm1heDM5NTQgZm1hICAxICAgIDAuMDFFLTk5OSAgICAwLjFFLTk5OSAgLT4gICAxLjFFLTEwMDAgIFN1Ym5vcm1hbAorZm1heDM5NTUgZm1hICAxICAgIDAuOTk5RS05OTkgICAwLjFFLTk5OSAgLT4gICAxLjEwRS05OTkgIEluZXhhY3QgUm91bmRlZAorZm1heDM5NTYgZm1hICAxICAgIDAuMDk5RS05OTkgICAwLjFFLTk5OSAgLT4gICAyLjBFLTEwMDAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4Mzk1NyBmbWEgIDEgICAgMC4wMDlFLTk5OSAgIDAuMUUtOTk5ICAtPiAgIDEuMUUtMTAwMCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzOTU4IGZtYSAgMSAgICAwLjAwMUUtOTk5ICAgMC4xRS05OTkgIC0+ICAgMS4wRS0xMDAwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDM5NTkgZm1hICAxICAgIDAuMDAwOUUtOTk5ICAwLjFFLTk5OSAgLT4gICAxLjBFLTEwMDAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4Mzk2MCBmbWEgIDEgICAgMC4wMDAxRS05OTkgIDAuMUUtOTk5ICAtPiAgIDEuMEUtMTAwMCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKy0tIG5lZ2F0aXZlcy4uLgorZm1heDM5NjEgZm1hICAxICAgIDEuMDBFLTk5OSAgIC0wLjFFLTk5OSAgLT4gICA5LjBFLTEwMDAgIFN1Ym5vcm1hbAorZm1heDM5NjIgZm1hICAxICAgIDAuMUUtOTk5ICAgIC0wLjFFLTk5OSAgLT4gICAwRS0xMDAwCitmbWF4Mzk2MyBmbWEgIDEgICAgMC4xMEUtOTk5ICAgLTAuMUUtOTk5ICAtPiAgIDBFLTEwMDEKK2ZtYXgzOTY0IGZtYSAgMSAgICAwLjEwMEUtOTk5ICAtMC4xRS05OTkgIC0+ICAgMEUtMTAwMSAgICBDbGFtcGVkCitmbWF4Mzk2NSBmbWEgIDEgICAgMC4wMUUtOTk5ICAgLTAuMUUtOTk5ICAtPiAgIC05RS0xMDAxICAgU3Vibm9ybWFsCitmbWF4Mzk2NiBmbWEgIDEgICAgMC45OTlFLTk5OSAgLTAuMUUtOTk5ICAtPiAgIDkuMEUtMTAwMCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzOTY3IGZtYSAgMSAgICAwLjA5OUUtOTk5ICAtMC4xRS05OTkgIC0+ICAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4Mzk2OCBmbWEgIDEgICAgMC4wMDlFLTk5OSAgLTAuMUUtOTk5ICAtPiAgIC05RS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzOTY5IGZtYSAgMSAgICAwLjAwMUUtOTk5ICAtMC4xRS05OTkgIC0+ICAgLTEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDM5NzAgZm1hICAxICAgIDAuMDAwOUUtOTk5IC0wLjFFLTk5OSAgLT4gICAtMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4Mzk3MSBmbWEgIDEgICAgMC4wMDAxRS05OTkgLTAuMUUtOTk5ICAtPiAgIC0xLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworLS0gc29tZSAncmVhbCcgbnVtYmVycworbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK3ByZWNpc2lvbjogOAorZm1heDM1NjYgZm1hICAxICAgOTk5OTkwNjE3MzVFLTM5NCAgMEUtMzk0IC0+IDkuOTk5OTA2RS0zODQgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK3ByZWNpc2lvbjogNworZm1heDM1NjcgZm1hICAxICAgOTk5OTkwNjE3MzVFLTM5NCAgMEUtMzk0IC0+IDkuOTk5OTFFLTM4NCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorcHJlY2lzaW9uOiA2CitmbWF4MzU2OCBmbWEgIDEgICA5OTk5OTA2MTczNUUtMzk0ICAwRS0zOTQgLT4gOS45OTk5RS0zODQgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKKworLS0gbm93IHRoZSBjYXNlIHdoZXJlIHdlIGNhbiBnZXQgdW5kZXJmbG93IGJ1dCB0aGUgcmVzdWx0IGlzIG5vcm1hbAorLS0gW25vdGUgdGhpcyBjYW4ndCBoYXBwZW4gaWYgdGhlIG9wZXJhbmRzIGFyZSBhbHNvIGJvdW5kZWQsIGFzIHdlCistLSBjYW5ub3QgcmVwcmVzZW50IDFFLTM5OSwgZm9yIGV4YW1wbGVdCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworCitmbWF4MzU3MSBmbWEgIDEgICAgICAgICAxRS0zODMgICAgICAgMCAgLT4gMUUtMzgzCitmbWF4MzU3MiBmbWEgIDEgICAgICAgICAxRS0zODQgICAgICAgMCAgLT4gMUUtMzg0ICAgU3Vibm9ybWFsCitmbWF4MzU3MyBmbWEgIDEgICAgICAgICAxRS0zODMgIDFFLTM4NCAgLT4gMS4xRS0zODMKK2ZtYXgzNTc0IHN1YnRyYWN0ICAxRS0zODMgIDFFLTM4NCAgLT4gICA5RS0zODQgU3Vibm9ybWFsCisKKy0tIEhlcmUgd2UgZXhwbG9yZSB0aGUgYm91bmRhcnkgb2Ygcm91bmRpbmcgYSBzdWJub3JtYWwgdG8gTm1pbgorZm1heDM1NzUgc3VidHJhY3QgIDFFLTM4MyAgMUUtMzk4ICAtPiAgIDkuOTk5OTk5OTk5OTk5OTlFLTM4NCAgU3Vibm9ybWFsCitmbWF4MzU3NiBzdWJ0cmFjdCAgMUUtMzgzICAxRS0zOTggIC0+ICAgOS45OTk5OTk5OTk5OTk5OUUtMzg0ICBTdWJub3JtYWwKK2ZtYXgzNTc3IHN1YnRyYWN0ICAxRS0zODMgIDFFLTM5OSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitmbWF4MzU3OCBzdWJ0cmFjdCAgMUUtMzgzICAxRS00MDAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZm1heDM1Nzkgc3VidHJhY3QgIDFFLTM4MyAgMUUtNDAxICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2ZtYXgzNTgwIHN1YnRyYWN0ICAxRS0zODMgIDFFLTQwMiAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCisKKy0tIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitwcmVjaXNpb246ICAgNQorbWF4ZXhwb25lbnQ6IDc5CittaW5leHBvbmVudDogLTc5CistLSBBZGQ6IGxocyBhbmQgcmhzIDAKK2ZtYXgzMTAwMSBmbWEgIDEgICAgICAgICAxLjUyNDQ0RS04MCAwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMDAyIGZtYSAgMSAgICAgICAgIDEuNTI0NDVFLTgwIDAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzEwMDMgZm1hICAxICAgICAgICAgMS41MjQ0NkUtODAgMCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTAwNCBmbWEgIDEgICAgICAgICAwIDEuNTI0NDRFLTgwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMDA1IGZtYSAgMSAgICAgICAgIDAgMS41MjQ0NUUtODAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzEwMDYgZm1hICAxICAgICAgICAgMCAxLjUyNDQ2RS04MCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworLS0gQWRkOiBsaHMgPj4gcmhzIGFuZCB2aWNlIHZlcnNhCitmbWF4MzEwMTEgZm1hICAxICAgICAgICAgMS41MjQ0NEUtODAgMUUtMTAwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMDEyIGZtYSAgMSAgICAgICAgIDEuNTI0NDVFLTgwIDFFLTEwMCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTAxMyBmbWEgIDEgICAgICAgICAxLjUyNDQ2RS04MCAxRS0xMDAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzEwMTQgZm1hICAxICAgICAgICAgMUUtMTAwIDEuNTI0NDRFLTgwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMDE1IGZtYSAgMSAgICAgICAgIDFFLTEwMCAxLjUyNDQ1RS04MCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTAxNiBmbWEgIDEgICAgICAgICAxRS0xMDAgMS41MjQ0NkUtODAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIEFkZDogbGhzICsgcmhzIGZtYSAgMSAgaXRpb24gY2FycmllZCBvdXQKK2ZtYXgzMTAyMSBmbWEgIDEgICAgICAgICAxLjUyNDQzRS04MCAxLjAwMDAxRS04MCAgLT4gMi41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzEwMjIgZm1hICAxICAgICAgICAgMS41MjQ0NEUtODAgMS4wMDAwMUUtODAgIC0+IDIuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMDIzIGZtYSAgMSAgICAgICAgIDEuNTI0NDVFLTgwIDEuMDAwMDFFLTgwICAtPiAyLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTAyNCBmbWEgIDEgICAgICAgICAxLjAwMDAxRS04MCAgMS41MjQ0M0UtODAgLT4gMi41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzEwMjUgZm1hICAxICAgICAgICAgMS4wMDAwMUUtODAgIDEuNTI0NDRFLTgwIC0+IDIuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMDI2IGZtYSAgMSAgICAgICAgIDEuMDAwMDFFLTgwICAxLjUyNDQ1RS04MCAtPiAyLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworLS0gQW5kIGZvciByb3VuZCBkb3duIGZ1bGwgYW5kIHN1Ym5vcm1hbCByZXN1bHRzCitwcmVjaXNpb246ICAgIDE2CittYXhFeHBvbmVudDogKzM4NAorbWluRXhwb25lbnQ6IC0zODMKK3JvdW5kaW5nOiAgICAgZG93bgorCitmbWF4MzExMDAgZm1hICAxICAgMWUrMiAtMWUtMzgzICAgIC0+IDk5Ljk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorZm1heDMxMTAxIGZtYSAgMSAgIDFlKzEgLTFlLTM4MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMDMgZm1hICAxICAgICArMSAtMWUtMzgzICAgIC0+IDAuOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMDQgZm1hICAxICAgMWUtMSAtMWUtMzgzICAgIC0+IDAuMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDMxMTA1IGZtYSAgMSAgIDFlLTIgLTFlLTM4MyAgICAtPiAwLjAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMDYgZm1hICAxICAgMWUtMyAtMWUtMzgzICAgIC0+IDAuMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMDcgZm1hICAxICAgMWUtNCAtMWUtMzgzICAgIC0+IDAuMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDMxMTA4IGZtYSAgMSAgIDFlLTUgLTFlLTM4MyAgICAtPiAwLjAwMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMDkgZm1hICAxICAgMWUtNiAtMWUtMzgzICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RS03ICBSb3VuZGVkIEluZXhhY3QKKworcm91bmRpbmc6ICAgICBjZWlsaW5nCitmbWF4MzExMTAgZm1hICAxICAgLTFlKzIgKzFlLTM4MyAgIC0+IC05OS45OTk5OTk5OTk5OTk5OSBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzMTExMSBmbWEgIDEgICAtMWUrMSArMWUtMzgzICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzMTExMyBmbWEgIDEgICAgICAtMSArMWUtMzgzICAgLT4gLTAuOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMTQgZm1hICAxICAgLTFlLTEgKzFlLTM4MyAgIC0+IC0wLjA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzMTExNSBmbWEgIDEgICAtMWUtMiArMWUtMzgzICAgLT4gLTAuMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzMTExNiBmbWEgIDEgICAtMWUtMyArMWUtMzgzICAgLT4gLTAuMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMTcgZm1hICAxICAgLTFlLTQgKzFlLTM4MyAgIC0+IC0wLjAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzMTExOCBmbWEgIDEgICAtMWUtNSArMWUtMzgzICAgLT4gLTAuMDAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzMTExOSBmbWEgIDEgICAtMWUtNiArMWUtMzgzICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RS03ICBSb3VuZGVkIEluZXhhY3QKKworcm91bmRpbmc6ICAgICBkb3duCitwcmVjaXNpb246ICAgIDcKK21heEV4cG9uZW50OiArOTYKK21pbkV4cG9uZW50OiAtOTUKK2ZtYXgzMTEzMCBmbWEgIDEgICAgIDEgICAgICAgICAgICAtMWUtMjAwICAtPiAwLjk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorLS0gc3Vibm9ybWFsIGJvdW5kYXJ5CitmbWF4MzExMzEgZm1hICAxICAgICAxLjAwMDAwMEUtOTQgIC0xZS0yMDAgIC0+ICA5Ljk5OTk5OUUtOTUgIFJvdW5kZWQgSW5leGFjdAorZm1heDMxMTMyIGZtYSAgMSAgICAgMS4wMDAwMDFFLTk1ICAtMWUtMjAwICAtPiAgMS4wMDAwMDBFLTk1ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzMTEzMyBmbWEgIDEgICAgIDEuMDAwMDAwRS05NSAgLTFlLTIwMCAgLT4gIDkuOTk5OTlFLTk2ICBSb3VuZGVkIEluZXhhY3QgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMTM0IGZtYSAgMSAgICAgMC45OTk5OTlFLTk1ICAtMWUtMjAwICAtPiAgOS45OTk5OEUtOTYgIFJvdW5kZWQgSW5leGFjdCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzExMzUgZm1hICAxICAgICAwLjAwMTAwMEUtOTUgIC0xZS0yMDAgIC0+ICA5Ljk5RS05OSAgUm91bmRlZCBJbmV4YWN0IFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTEzNiBmbWEgIDEgICAgIDAuMDAwOTk5RS05NSAgLTFlLTIwMCAgLT4gIDkuOThFLTk5ICBSb3VuZGVkIEluZXhhY3QgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMTM3IGZtYSAgMSAgICAgMS4wMDAwMDBFLTk1ICAtMWUtMTAxICAtPiAgOS45OTk5OUUtOTYgIFN1Ym5vcm1hbAorZm1heDMxMTM4IGZtYSAgMSAgICAgICAgMTAwMDBFLTEwMSAtMWUtMjAwICAtPiAgOS45OTlFLTk4ICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDMxMTM5IGZtYSAgMSAgICAgICAgIDEwMDBFLTEwMSAtMWUtMjAwICAtPiAgOS45OUUtOTkgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDMxMTQwIGZtYSAgMSAgICAgICAgICAxMDBFLTEwMSAtMWUtMjAwICAtPiAgOS45RS0xMDAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDMxMTQxIGZtYSAgMSAgICAgICAgICAgMTBFLTEwMSAtMWUtMjAwICAtPiAgOUUtMTAxICAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDMxMTQyIGZtYSAgMSAgICAgICAgICAgIDFFLTEwMSAtMWUtMjAwICAtPiAgMEUtMTAxICAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzExNDMgZm1hICAxICAgICAgICAgICAgMEUtMTAxIC0xZS0yMDAgIC0+IC0wRS0xMDEgICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTE0NCBmbWEgIDEgICAgICAgICAgICAxRS0xMDIgLTFlLTIwMCAgLT4gIDBFLTEwMSAgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCitmbWF4MzExNTEgZm1hICAxICAgICAgICAxMDAwMEUtMTAyIC0xZS0yMDAgIC0+ICA5Ljk5RS05OSAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzMTE1MiBmbWEgIDEgICAgICAgICAxMDAwRS0xMDIgLTFlLTIwMCAgLT4gIDkuOUUtMTAwICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDMxMTUzIGZtYSAgMSAgICAgICAgICAxMDBFLTEwMiAtMWUtMjAwICAtPiAgOUUtMTAxICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzMTE1NCBmbWEgIDEgICAgICAgICAgIDEwRS0xMDIgLTFlLTIwMCAgLT4gIDBFLTEwMSAgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxMTU1IGZtYSAgMSAgICAgICAgICAgIDFFLTEwMiAtMWUtMjAwICAtPiAgMEUtMTAxICAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzExNTYgZm1hICAxICAgICAgICAgICAgMEUtMTAyIC0xZS0yMDAgIC0+IC0wRS0xMDEgICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTE1NyBmbWEgIDEgICAgICAgICAgICAxRS0xMDMgLTFlLTIwMCAgLT4gIDBFLTEwMSAgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCitmbWF4MzExNjAgZm1hICAxICAgICAgICAgIDEwMEUtMTA1IC0xZS0xMDEgIC0+IC0wRS0xMDEgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxMTYxIGZtYSAgMSAgICAgICAgICAxMDBFLTEwNSAtMWUtMjAxICAtPiAgMEUtMTAxIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworLS0gdGVzdHMgYmFzZWQgb24gR3VubmFyIERlZ25ib2wncyBlZGdlIGNhc2UKK3ByZWNpc2lvbjogICAxNQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK2ZtYXgzMTIwMCBmbWEgIDEgICAxRTE1ICAtMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMEUrMTUgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEyMDEgZm1hICAxICAgMUUxNSAgLTAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDBFKzE1IEluZXhhY3QgUm91bmRlZAorZm1heDMxMjEwIGZtYSAgMSAgIDFFMTUgIC0wLjUxICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTIxMSBmbWEgIDEgICAxRTE1ICAtMC41MDEgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEyMTIgZm1hICAxICAgMUUxNSAgLTAuNTAwMSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMjEzIGZtYSAgMSAgIDFFMTUgIC0wLjUwMDAxICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTIxNCBmbWEgIDEgICAxRTE1ICAtMC41MDAwMDEgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEyMTUgZm1hICAxICAgMUUxNSAgLTAuNTAwMDAwMSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMjE2IGZtYSAgMSAgIDFFMTUgIC0wLjUwMDAwMDAxICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTIxNyBmbWEgIDEgICAxRTE1ICAtMC41MDAwMDAwMDEgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEyMTggZm1hICAxICAgMUUxNSAgLTAuNTAwMDAwMDAwMSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMjE5IGZtYSAgMSAgIDFFMTUgIC0wLjUwMDAwMDAwMDAxICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTIyMCBmbWEgIDEgICAxRTE1ICAtMC41MDAwMDAwMDAwMDEgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEyMjEgZm1hICAxICAgMUUxNSAgLTAuNTAwMDAwMDAwMDAwMSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMjIyIGZtYSAgMSAgIDFFMTUgIC0wLjUwMDAwMDAwMDAwMDAxICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTIyMyBmbWEgIDEgICAxRTE1ICAtMC41MDAwMDAwMDAwMDAwMDEgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEyMjQgZm1hICAxICAgMUUxNSAgLTAuNTAwMDAwMDAwMDAwMDAwMSAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMjI1IGZtYSAgMSAgIDFFMTUgIC0wLjUwMDAwMDAwMDAwMDAwMDAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwRSsxNSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTIzMCBmbWEgIDEgICAxRTE1ICAtNTAwMDAwMC4wMDAwMDAwMDEgICAtPiAgOTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogICAxNgorCitmbWF4MzEzMDAgZm1hICAxICAgMUUxNiAgLTAuNSAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMxMCBmbWEgIDEgICAxRTE2ICAtMC41MSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzExIGZtYSAgMSAgIDFFMTYgIC0wLjUwMSAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMTIgZm1hICAxICAgMUUxNiAgLTAuNTAwMSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMxMyBmbWEgIDEgICAxRTE2ICAtMC41MDAwMSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzE0IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMSAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMTUgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMxNiBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzE3IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMSAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMTggZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMDAwMSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMxOSBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzIwIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMSAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMjEgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMyMiBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzIzIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMjQgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMDAwMSAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMyNSBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzI2IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMCAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMjcgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMDAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMyOCBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzI5IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMzAgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMDAwMDAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMzMSBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzMyIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMCAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMzMgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMDAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMzNCBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzM1IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMCAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMzYgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMzNyBmbWEgIDEgICAxRTE2ICAtMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzM4IGZtYSAgMSAgIDFFMTYgIC0wLjUwMCAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMzkgZm1hICAxICAgMUUxNiAgLTAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKKworZm1heDMxMzQwIGZtYSAgMSAgIDFFMTYgIC01MDAwMDAwLjAwMDAxMDAwMSAgIC0+ICA5OTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzNDEgZm1hICAxICAgMUUxNiAgLTUwMDAwMDAuMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTUwMDAwMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworZm1heDMxMzQ5IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40ICAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzUwIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzUxIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTkgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzUyIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5ICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzUzIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzU0IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTkgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzU1IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5ICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzU2IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzU3IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTkgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzU4IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5ICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzU5IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzYwIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTkgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzYxIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5ICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzYyIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzYzIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OTkgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzY0IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OTk5ICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzY1IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzY3IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzY4IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMCAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzY5IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzcwIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzcxIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMCAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzcyIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzczIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzc0IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMCAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzc1IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzc2IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzc3IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMCAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzc4IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzc5IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzgwIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MCAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzgxIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzgyIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzgzIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzg0IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzg1IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAxICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzg2IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDEgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzg3IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMSAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzg4IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAxICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzg5IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDEgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzkwIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMSAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzkxIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAxICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzkyIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDEgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzkzIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMSAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzk0IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAxICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzk1IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDEgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzk2IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MSAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorCistLSBNb3JlIEdEIGVkZ2UgY2FzZXMsIHdoZXJlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdW5hZGp1c3RlZAorLS0gZXhwb25lbnRzIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHByZWNpc2lvbiBhbmQgb25lIHNpZGUgaXMgMAorcHJlY2lzaW9uOiAgIDE1Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworZm1heDMxNDAwIGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDUgICAgIC0+IDEuMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQwMSBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xICAtPiAwLjEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDAyIGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDVFLTIgIC0+IDAuMDEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDAzIGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDVFLTMgIC0+IDAuMDAxMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQwNCBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS00ICAtPiAwLjAwMDEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDA1IGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDVFLTUgIC0+IDAuMDAwMDEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDA2IGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDVFLTYgIC0+IDAuMDAwMDAxMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQwNyBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS03ICAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS03CitmbWF4MzE0MDggZm1hICAxICAgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtOCAgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtOAorZm1heDMxNDA5IGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDVFLTkgIC0+IDEuMjM0NTY3ODkwMTIzNDVFLTkKK2ZtYXgzMTQxMCBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xMCAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xMAorZm1heDMxNDExIGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDVFLTExIC0+IDEuMjM0NTY3ODkwMTIzNDVFLTExCitmbWF4MzE0MTIgZm1hICAxICAgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTIgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTIKK2ZtYXgzMTQxMyBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xMyAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xMworZm1heDMxNDE0IGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDVFLTE0IC0+IDEuMjM0NTY3ODkwMTIzNDVFLTE0CitmbWF4MzE0MTUgZm1hICAxICAgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTUgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTUKK2ZtYXgzMTQxNiBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xNiAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xNgorZm1heDMxNDE3IGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDVFLTE3IC0+IDEuMjM0NTY3ODkwMTIzNDVFLTE3CitmbWF4MzE0MTggZm1hICAxICAgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTggLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTgKK2ZtYXgzMTQxOSBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xOSAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xOQorCistLSBzYW1lLCBwcmVjaXNpb24gMTYuLgorcHJlY2lzaW9uOiAgIDE2CitmbWF4MzE0MjAgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDUgICAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0MjEgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEgIC0+IDAuMTEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDIyIGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0yICAtPiAwLjAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0MjMgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTMgIC0+IDAuMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0MjQgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTQgIC0+IDAuMDAwMTEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDI1IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS01ICAtPiAwLjAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0MjYgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTYgIC0+IDAuMDAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0MjcgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTcgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS03CitmbWF4MzE0MjggZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTggIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS04CitmbWF4MzE0MjkgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTkgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS05CitmbWF4MzE0MzAgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMAorZm1heDMxNDMxIGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMSAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEKK2ZtYXgzMTQzMiBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEyCitmbWF4MzE0MzMgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEzIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMworZm1heDMxNDM0IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQKK2ZtYXgzMTQzNSBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE1CitmbWF4MzE0MzYgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE2IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNgorZm1heDMxNDM3IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNyAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcKK2ZtYXgzMTQzOCBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTggLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE4CitmbWF4MzE0MzkgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE5IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOQorCistLSBzYW1lLCByZXZlcnNlZCAwCitmbWF4MzE0NDAgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgICAgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ0MSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMSAgMCAtPiAwLjExMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ0MiBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMiAgMCAtPiAwLjAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NDMgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTMgIDAgLT4gMC4wMDExMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ0NCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtNCAgMCAtPiAwLjAwMDExMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ0NSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtNSAgMCAtPiAwLjAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NDYgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTYgIDAgLT4gMC4wMDAwMDExMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ0NyBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtNyAgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtNworZm1heDMxNDQ4IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS04ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS04CitmbWF4MzE0NDkgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTkgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTkKK2ZtYXgzMTQ1MCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTAgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTAKK2ZtYXgzMTQ1MSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEKK2ZtYXgzMTQ1MiBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIKK2ZtYXgzMTQ1MyBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTMgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTMKK2ZtYXgzMTQ1NCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQKK2ZtYXgzMTQ1NSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUKK2ZtYXgzMTQ1NiBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTYgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTYKK2ZtYXgzMTQ1NyBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcKK2ZtYXgzMTQ1OCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTggMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTgKK2ZtYXgzMTQ1OSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTkgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTkKKworLS0gc2FtZSwgRXMgb24gdGhlIDAKK2ZtYXgzMTQ2MCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NjEgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDYyIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0yICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ2MyBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMyAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NjQgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTQgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDY1IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS01ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ2NiBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNiAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NjcgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTcgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDY4IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS04ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ2OSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtOSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NzAgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEwICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDcxIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ3MiBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTIgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NzMgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEzICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDc0IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNCAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ3NSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTUgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CistLSBuZXh0IGZvdXIgZmxhZyBSb3VuZGVkIGJlY2F1c2UgdGhlIDAgZXh0ZW5kcyB0aGUgcmVzdWx0CitmbWF4MzE0NzYgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE2ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitmbWF4MzE0NzcgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE3ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitmbWF4MzE0NzggZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE4ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitmbWF4MzE0NzkgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE5ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCisKKy0tIHN1bSBvZiB0d28gb3Bwb3NpdGUtc2lnbiBvcGVyYW5kcyBpcyBleGFjdGx5IDAgYW5kIGZsb29yID0+IC0wCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK3JvdW5kaW5nOiAgICBoYWxmX3VwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitmbWF4MzE1MDAgZm1hICAxICAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTUwMSBmbWEgIDEgICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNTAyIGZtYSAgMSAgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitmbWF4MzE1MDMgZm1hICAxICAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2ZtYXgzMTUwNCBmbWEgIDEgICAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTA1IGZtYSAgMSAgIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1MDYgZm1hICAxICAgIDBFLTQwMCAgLTBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTUwNyBmbWEgIDEgICAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworZm1heDMxNTExIGZtYSAgMSAgICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE1MTIgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTUxMyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNTE0IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitmbWF4MzE1MTUgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTUxNiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTE3IGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1MTggZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZm1heDMxNTIwIGZtYSAgMSAgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzE1MjEgZm1hICAxICAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTUyMiBmbWEgIDEgICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNTIzIGZtYSAgMSAgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CitmbWF4MzE1MjQgZm1hICAxICAgIDBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTUyNSBmbWEgIDEgICAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTI2IGZtYSAgMSAgICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1MjcgZm1hICAxICAgLTBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQKKy0tIGluZXhhY3QgemVyb3MKK2ZtYXgzMTUzMSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNTMyIGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE1MzMgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTUzNCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZm1heDMxNTM1IGZtYSAgMSAgICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE1MzYgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTUzNyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTM4IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2ZtYXgzMTU0MCBmbWEgIDEgICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNTQxIGZtYSAgMSAgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzE1NDIgZm1hICAxICAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTU0MyBmbWEgIDEgICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorZm1heDMxNTQ0IGZtYSAgMSAgICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1NDUgZm1hICAxICAgLTBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTU0NiBmbWEgIDEgICAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTQ3IGZtYSAgMSAgIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCitmbWF4MzE1NTEgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTU1MiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNTUzIGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE1NTQgZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2ZtYXgzMTU1NSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNTU2IGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1NTcgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTU1OCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCityb3VuZGluZzogICAgdXAKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2ZtYXgzMTU2MCBmbWEgIDEgICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNTYxIGZtYSAgMSAgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzE1NjIgZm1hICAxICAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTU2MyBmbWEgIDEgICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorZm1heDMxNTY0IGZtYSAgMSAgICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1NjUgZm1hICAxICAgLTBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTU2NiBmbWEgIDEgICAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTY3IGZtYSAgMSAgIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCitmbWF4MzE1NzEgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitmbWF4MzE1NzIgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitmbWF4MzE1NzMgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitmbWF4MzE1NzQgZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitmbWF4MzE1NzUgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitmbWF4MzE1NzYgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTU3NyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTc4IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDEgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworCityb3VuZGluZzogICAgZG93bgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZm1heDMxNTgwIGZtYSAgMSAgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzE1ODEgZm1hICAxICAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTU4MiBmbWEgIDEgICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNTgzIGZtYSAgMSAgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CitmbWF4MzE1ODQgZm1hICAxICAgIDBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTU4NSBmbWEgIDEgICAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTg2IGZtYSAgMSAgICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1ODcgZm1hICAxICAgLTBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQKKy0tIGluZXhhY3QgemVyb3MKK2ZtYXgzMTU5MSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNTkyIGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE1OTMgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTU5NCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZm1heDMxNTk1IGZtYSAgMSAgICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE1OTYgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTU5NyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTk4IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICBjZWlsaW5nCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitmbWF4MzE2MDAgZm1hICAxICAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTYwMSBmbWEgIDEgICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNjAyIGZtYSAgMSAgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitmbWF4MzE2MDMgZm1hICAxICAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2ZtYXgzMTYwNCBmbWEgIDEgICAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNjA1IGZtYSAgMSAgIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE2MDYgZm1hICAxICAgIDBFLTQwMCAgLTBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTYwNyBmbWEgIDEgICAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworZm1heDMxNjExIGZtYSAgMSAgICAxRS00MDEgICAxRS00MDAgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDMxNjEyIGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDAgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDMxNjEzIGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE2MTQgZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2ZtYXgzMTYxNSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAxIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzMTYxNiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNjE3IGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE2MTggZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworLS0gYW5kIHRoZSBleHRyYS1zcGVjaWFsIHVnbHkgY2FzZTsgdW51c3VhbCBtaW51c2VzIG1hcmtlZCBieSAtLSAqCityb3VuZGluZzogICAgZmxvb3IKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2ZtYXgzMTYyMCBmbWEgIDEgICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNjIxIGZtYSAgMSAgIC0wICAgICAgICAwRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCitmbWF4MzE2MjIgZm1hICAxICAgIDAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkgICAgICAgICAgIC0tICoKK2ZtYXgzMTYyMyBmbWEgIDEgICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorZm1heDMxNjI0IGZtYSAgMSAgICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE2MjUgZm1hICAxICAgLTBFLTQwMCAgIDBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQgIC0tICoKK2ZtYXgzMTYyNiBmbWEgIDEgICAgMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZCAgLS0gKgorZm1heDMxNjI3IGZtYSAgMSAgIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCitmbWF4MzE2MzEgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTYzMiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNjMzIGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDMxNjM0IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZm1heDMxNjM1IGZtYSAgMSAgICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE2MzYgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMSAtPiAtMEUtMzk4IENsYW1wZWQgIC0tICoKK2ZtYXgzMTYzNyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggQ2xhbXBlZCAgLS0gKgorZm1heDMxNjM4IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDEgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworCistLSBCaWdEZWNpbWFsIHByb2JsZW0gdGVzdGNhc2VzIDIwMDYuMDEuMjMKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworcm91bmRpbmc6ICBkb3duCitwcmVjaXNpb246IDcKK2ZtYXgzMTY1MSBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwMDhFKzYKK3ByZWNpc2lvbjogNgorZm1heDMxNjUyIGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDAwOEUrNgorcHJlY2lzaW9uOiA1CitmbWF4MzE2NTMgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMDBFKzYgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNAorZm1heDMxNjU0IGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDBFKzYgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMKK2ZtYXgzMTY1NSBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDBFKzYgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyCitmbWF4MzE2NTYgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjBFKzYgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMQorZm1heDMxNjU3IGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMUUrNiAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitwcmVjaXNpb246IDcKK2ZtYXgzMTY2MSBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwMDhFKzYKK3ByZWNpc2lvbjogNgorZm1heDMxNjYyIGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDAwOEUrNgorcHJlY2lzaW9uOiA1CitmbWF4MzE2NjMgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMDFFKzYgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNAorZm1heDMxNjY0IGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDBFKzYgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMKK2ZtYXgzMTY2NSBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDBFKzYgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyCitmbWF4MzE2NjYgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjBFKzYgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMQorZm1heDMxNjY3IGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMUUrNiAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgdXAKK3ByZWNpc2lvbjogNworZm1heDMxNjcxIGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDAwOEUrNgorcHJlY2lzaW9uOiA2CitmbWF4MzE2NzIgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMDA4RSs2CitwcmVjaXNpb246IDUKK2ZtYXgzMTY3MyBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwMUUrNiAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0CitmbWF4MzE2NzQgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMUUrNiAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMworZm1heDMxNjc1IGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMUUrNiAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIKK2ZtYXgzMTY3NiBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMUUrNiAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxCitmbWF4MzE2NzcgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAyRSs2ICAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAgIDM0Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0MworLS0gRXhhbXBsZXMgZnJvbSBTUUwgcHJvcG9zYWwgKEtyaXNobmEgS3Vsa2FybmkpCitmbWF4MzE3MDEgIGZtYSAgMSAgIDEzMEUtMiAgICAxMjBFLTIgICAgLT4gMi41MAorZm1heDMxNzAyICBmbWEgIDEgICAxMzBFLTIgICAgMTJFLTEgICAgIC0+IDIuNTAKK2ZtYXgzMTcwMyAgZm1hICAxICAgMTMwRS0yICAgIDFFMCAgICAgICAtPiAyLjMwCitmbWF4MzE3MDQgIGZtYSAgMSAgIDFFMiAgICAgICAxRTQgICAgICAgLT4gMS4wMUUrNAorZm1heDMxNzA1ICBzdWJ0cmFjdCAxMzBFLTIgIDEyMEUtMiAtPiAwLjEwCitmbWF4MzE3MDYgIHN1YnRyYWN0IDEzMEUtMiAgMTJFLTEgIC0+IDAuMTAKK2ZtYXgzMTcwNyAgc3VidHJhY3QgMTMwRS0yICAxRTAgICAgLT4gMC4zMAorZm1heDMxNzA4ICBzdWJ0cmFjdCAxRTIgICAgIDFFNCAgICAtPiAtOS45RSszCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gU2FtZSBhcyBhYm92ZSwgdXNpbmcgZGVjaW1hbDY0IGRlZmF1bHQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworLS0gW2ZpcnN0IGdyb3VwIGFyZSAncXVpY2sgY29uZmlkZW5jZSBjaGVjayddCitmbWF4MzYwMDEgZm1hICAxICAgMSAgICAgICAxICAgICAgIC0+ICAyCitmbWF4MzYwMDIgZm1hICAxICAgMiAgICAgICAzICAgICAgIC0+ICA1CitmbWF4MzYwMDMgZm1hICAxICAgJzUuNzUnICAnMy4zJyAgIC0+ICA5LjA1CitmbWF4MzYwMDQgZm1hICAxICAgJzUnICAgICAnLTMnICAgIC0+ICAyCitmbWF4MzYwMDUgZm1hICAxICAgJy01JyAgICAnLTMnICAgIC0+ICAtOAorZm1heDM2MDA2IGZtYSAgMSAgICctNycgICAgJzIuNScgICAtPiAgLTQuNQorZm1heDM2MDA3IGZtYSAgMSAgICcwLjcnICAgJzAuMycgICAtPiAgMS4wCitmbWF4MzYwMDggZm1hICAxICAgJzEuMjUnICAnMS4yNScgIC0+ICAyLjUwCitmbWF4MzYwMDkgZm1hICAxICAgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAwMCcgLT4gJzIuMjM0NTY3ODknCitmbWF4MzYwMTAgZm1hICAxICAgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAxMScgLT4gJzIuMjM0NTY4MDAnCisKK2ZtYXgzNjAxMSBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDEyIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQwJyAgJzAuNTU1NTU1NTU1NTU1NTU1NTUnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwMTMgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1MCcgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwMTQgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ5JyAgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwMTUgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ5OScgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwMTYgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ5OTknICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwMTcgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDUwMDAnICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwMTggZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDUwMDEnICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwMTkgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDUwMScgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwMjAgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDUxJyAgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNjAyMSBmbWEgIDEgICAwIDEgLT4gMQorZm1heDM2MDIyIGZtYSAgMSAgIDEgMSAtPiAyCitmbWF4MzYwMjMgZm1hICAxICAgMiAxIC0+IDMKK2ZtYXgzNjAyNCBmbWEgIDEgICAzIDEgLT4gNAorZm1heDM2MDI1IGZtYSAgMSAgIDQgMSAtPiA1CitmbWF4MzYwMjYgZm1hICAxICAgNSAxIC0+IDYKK2ZtYXgzNjAyNyBmbWEgIDEgICA2IDEgLT4gNworZm1heDM2MDI4IGZtYSAgMSAgIDcgMSAtPiA4CitmbWF4MzYwMjkgZm1hICAxICAgOCAxIC0+IDkKK2ZtYXgzNjAzMCBmbWEgIDEgICA5IDEgLT4gMTAKKworLS0gc29tZSBjYXJyeWluZyBlZmZlY3RzCitmbWF4MzYwMzEgZm1hICAxICAgJzAuOTk5OCcgICcwLjAwMDAnIC0+ICcwLjk5OTgnCitmbWF4MzYwMzIgZm1hICAxICAgJzAuOTk5OCcgICcwLjAwMDEnIC0+ICcwLjk5OTknCitmbWF4MzYwMzMgZm1hICAxICAgJzAuOTk5OCcgICcwLjAwMDInIC0+ICcxLjAwMDAnCitmbWF4MzYwMzQgZm1hICAxICAgJzAuOTk5OCcgICcwLjAwMDMnIC0+ICcxLjAwMDEnCisKK2ZtYXgzNjAzNSBmbWEgIDEgICAnNzAnICAgICAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwMzYgZm1hICAxICAgJzcwMCcgICAgICcxMDAwMGUrMTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDM3IGZtYSAgMSAgICc3MDAwJyAgICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjAzOCBmbWEgIDEgICAnNzAwMDAnICAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAxRSsyMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwMzkgZm1hICAxICAgJzcwMDAwMCcgICcxMDAwMGUrMTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwN0UrMjAnIFJvdW5kZWQKKworLS0gc3ltbWV0cnk6CitmbWF4MzYwNDAgZm1hICAxICAgJzEwMDAwZSsxNicgICc3MCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwNDEgZm1hICAxICAgJzEwMDAwZSsxNicgICc3MDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDQyIGZtYSAgMSAgICcxMDAwMGUrMTYnICAnNzAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwNDQgZm1hICAxICAgJzEwMDAwZSsxNicgICc3MDAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAxRSsyMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwNDUgZm1hICAxICAgJzEwMDAwZSsxNicgICc3MDAwMDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwN0UrMjAnIFJvdW5kZWQKKworZm1heDM2MDQ2IGZtYSAgMSAgICcxMDAwMGUrOScgICc3JyAtPiAnMTAwMDAwMDAwMDAwMDcnCitmbWF4MzYwNDcgZm1hICAxICAgJzEwMDAwZSs5JyAgJzcwJyAtPiAnMTAwMDAwMDAwMDAwNzAnCitmbWF4MzYwNDggZm1hICAxICAgJzEwMDAwZSs5JyAgJzcwMCcgLT4gJzEwMDAwMDAwMDAwNzAwJworZm1heDM2MDQ5IGZtYSAgMSAgICcxMDAwMGUrOScgICc3MDAwJyAtPiAnMTAwMDAwMDAwMDcwMDAnCitmbWF4MzYwNTAgZm1hICAxICAgJzEwMDAwZSs5JyAgJzcwMDAwJyAtPiAnMTAwMDAwMDAwNzAwMDAnCitmbWF4MzYwNTEgZm1hICAxICAgJzEwMDAwZSs5JyAgJzcwMDAwMCcgLT4gJzEwMDAwMDAwNzAwMDAwJworCistLSBleGFtcGxlcyBmcm9tIGRlY2FyaXRoCitmbWF4MzYwNTMgZm1hICAxICAgJzEyJyAnNy4wMCcgLT4gJzE5LjAwJworZm1heDM2MDU0IGZtYSAgMSAgICcxLjMnICctMS4wNycgLT4gJzAuMjMnCitmbWF4MzYwNTUgZm1hICAxICAgJzEuMycgJy0xLjMwJyAtPiAnMC4wMCcKK2ZtYXgzNjA1NiBmbWEgIDEgICAnMS4zJyAnLTIuMDcnIC0+ICctMC43NycKK2ZtYXgzNjA1NyBmbWEgIDEgICAnMUUrMicgJzFFKzQnIC0+ICcxLjAxRSs0JworCistLSBmcm9tIGFib3ZlCitmbWF4MzYwNjEgZm1hICAxICAgMSAnMC4xJyAtPiAnMS4xJworZm1heDM2MDYyIGZtYSAgMSAgIDEgJzAuMDEnIC0+ICcxLjAxJworZm1heDM2MDYzIGZtYSAgMSAgIDEgJzAuMDAxJyAtPiAnMS4wMDEnCitmbWF4MzYwNjQgZm1hICAxICAgMSAnMC4wMDAxJyAtPiAnMS4wMDAxJworZm1heDM2MDY1IGZtYSAgMSAgIDEgJzAuMDAwMDEnIC0+ICcxLjAwMDAxJworZm1heDM2MDY2IGZtYSAgMSAgIDEgJzAuMDAwMDAxJyAtPiAnMS4wMDAwMDEnCitmbWF4MzYwNjcgZm1hICAxICAgMSAnMC4wMDAwMDAxJyAtPiAnMS4wMDAwMDAxJworZm1heDM2MDY4IGZtYSAgMSAgIDEgJzAuMDAwMDAwMDEnIC0+ICcxLjAwMDAwMDAxJworCistLSBzb21lIGZ1bm55IHplcm9zIFtpbiBjYXNlIG9mIGJhZCBzaWdudW1dCitmbWF4MzYwNzAgZm1hICAxICAgMSAgMCAgICAtPiAxCitmbWF4MzYwNzEgZm1hICAxICAgMSAwLiAgICAtPiAxCitmbWF4MzYwNzIgZm1hICAxICAgMSAgLjAgICAtPiAxLjAKK2ZtYXgzNjA3MyBmbWEgIDEgICAxIDAuMCAgIC0+IDEuMAorZm1heDM2MDc0IGZtYSAgMSAgIDEgMC4wMCAgLT4gMS4wMAorZm1heDM2MDc1IGZtYSAgMSAgICAwICAxICAgLT4gMQorZm1heDM2MDc2IGZtYSAgMSAgIDAuICAxICAgLT4gMQorZm1heDM2MDc3IGZtYSAgMSAgICAuMCAxICAgLT4gMS4wCitmbWF4MzYwNzggZm1hICAxICAgMC4wIDEgICAtPiAxLjAKK2ZtYXgzNjA3OSBmbWEgIDEgICAwLjAwIDEgIC0+IDEuMDAKKworLS0gc29tZSBjYXJyaWVzCitmbWF4MzYwODAgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OCAxICAtPiA5OTk5OTk5OTk5OTk5OTk5CitmbWF4MzYwODEgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAxICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgUm91bmRlZAorZm1heDM2MDgyIGZtYSAgMSAgICA5OTk5OTk5OTk5OTk5OTkgMSAgLT4gMTAwMDAwMDAwMDAwMDAwMAorZm1heDM2MDgzIGZtYSAgMSAgICAgIDk5OTk5OTk5OTk5OTkgMSAgLT4gMTAwMDAwMDAwMDAwMDAKK2ZtYXgzNjA4NCBmbWEgIDEgICAgICAgIDk5OTk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMDAwMAorZm1heDM2MDg1IGZtYSAgMSAgICAgICAgICA5OTk5OTk5OTkgMSAgLT4gMTAwMDAwMDAwMAorZm1heDM2MDg2IGZtYSAgMSAgICAgICAgICAgIDk5OTk5OTkgMSAgLT4gMTAwMDAwMDAKK2ZtYXgzNjA4NyBmbWEgIDEgICAgICAgICAgICAgIDk5OTk5IDEgIC0+IDEwMDAwMAorZm1heDM2MDg4IGZtYSAgMSAgICAgICAgICAgICAgICA5OTkgMSAgLT4gMTAwMAorZm1heDM2MDg5IGZtYSAgMSAgICAgICAgICAgICAgICAgIDkgMSAgLT4gMTAKKworCistLSBtb3JlIExIUyBzd2FwcworZm1heDM2MDkwIGZtYSAgMSAgICctNTYyNjdFLTEwJyAgIDAgLT4gICctMC4wMDAwMDU2MjY3JworZm1heDM2MDkxIGZtYSAgMSAgICctNTYyNjdFLTYnICAgIDAgLT4gICctMC4wNTYyNjcnCitmbWF4MzYwOTIgZm1hICAxICAgJy01NjI2N0UtNScgICAgMCAtPiAgJy0wLjU2MjY3JworZm1heDM2MDkzIGZtYSAgMSAgICctNTYyNjdFLTQnICAgIDAgLT4gICctNS42MjY3JworZm1heDM2MDk0IGZtYSAgMSAgICctNTYyNjdFLTMnICAgIDAgLT4gICctNTYuMjY3JworZm1heDM2MDk1IGZtYSAgMSAgICctNTYyNjdFLTInICAgIDAgLT4gICctNTYyLjY3JworZm1heDM2MDk2IGZtYSAgMSAgICctNTYyNjdFLTEnICAgIDAgLT4gICctNTYyNi43JworZm1heDM2MDk3IGZtYSAgMSAgICctNTYyNjdFLTAnICAgIDAgLT4gICctNTYyNjcnCitmbWF4MzYwOTggZm1hICAxICAgJy01RS0xMCcgICAgICAgMCAtPiAgJy01RS0xMCcKK2ZtYXgzNjA5OSBmbWEgIDEgICAnLTVFLTcnICAgICAgICAwIC0+ICAnLTVFLTcnCitmbWF4MzYxMDAgZm1hICAxICAgJy01RS02JyAgICAgICAgMCAtPiAgJy0wLjAwMDAwNScKK2ZtYXgzNjEwMSBmbWEgIDEgICAnLTVFLTUnICAgICAgICAwIC0+ICAnLTAuMDAwMDUnCitmbWF4MzYxMDIgZm1hICAxICAgJy01RS00JyAgICAgICAgMCAtPiAgJy0wLjAwMDUnCitmbWF4MzYxMDMgZm1hICAxICAgJy01RS0xJyAgICAgICAgMCAtPiAgJy0wLjUnCitmbWF4MzYxMDQgZm1hICAxICAgJy01RTAnICAgICAgICAgMCAtPiAgJy01JworZm1heDM2MTA1IGZtYSAgMSAgICctNUUxJyAgICAgICAgIDAgLT4gICctNTAnCitmbWF4MzYxMDYgZm1hICAxICAgJy01RTUnICAgICAgICAgMCAtPiAgJy01MDAwMDAnCitmbWF4MzYxMDcgZm1hICAxICAgJy01RTE1JyAgICAgICAgMCAtPiAgJy01MDAwMDAwMDAwMDAwMDAwJworZm1heDM2MTA4IGZtYSAgMSAgICctNUUxNicgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE2JyAgIFJvdW5kZWQKK2ZtYXgzNjEwOSBmbWEgIDEgICAnLTVFMTcnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNycgIFJvdW5kZWQKK2ZtYXgzNjExMCBmbWEgIDEgICAnLTVFMTgnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxOCcgIFJvdW5kZWQKK2ZtYXgzNjExMSBmbWEgIDEgICAnLTVFMTAwJyAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxMDAnIFJvdW5kZWQKKworLS0gbW9yZSBSSFMgc3dhcHMKK2ZtYXgzNjExMyBmbWEgIDEgICAwICAnLTU2MjY3RS0xMCcgLT4gICctMC4wMDAwMDU2MjY3JworZm1heDM2MTE0IGZtYSAgMSAgIDAgICctNTYyNjdFLTYnICAtPiAgJy0wLjA1NjI2NycKK2ZtYXgzNjExNiBmbWEgIDEgICAwICAnLTU2MjY3RS01JyAgLT4gICctMC41NjI2NycKK2ZtYXgzNjExNyBmbWEgIDEgICAwICAnLTU2MjY3RS00JyAgLT4gICctNS42MjY3JworZm1heDM2MTE5IGZtYSAgMSAgIDAgICctNTYyNjdFLTMnICAtPiAgJy01Ni4yNjcnCitmbWF4MzYxMjAgZm1hICAxICAgMCAgJy01NjI2N0UtMicgIC0+ICAnLTU2Mi42NycKK2ZtYXgzNjEyMSBmbWEgIDEgICAwICAnLTU2MjY3RS0xJyAgLT4gICctNTYyNi43JworZm1heDM2MTIyIGZtYSAgMSAgIDAgICctNTYyNjdFLTAnICAtPiAgJy01NjI2NycKK2ZtYXgzNjEyMyBmbWEgIDEgICAwICAnLTVFLTEwJyAgICAgLT4gICctNUUtMTAnCitmbWF4MzYxMjQgZm1hICAxICAgMCAgJy01RS03JyAgICAgIC0+ICAnLTVFLTcnCitmbWF4MzYxMjUgZm1hICAxICAgMCAgJy01RS02JyAgICAgIC0+ICAnLTAuMDAwMDA1JworZm1heDM2MTI2IGZtYSAgMSAgIDAgICctNUUtNScgICAgICAtPiAgJy0wLjAwMDA1JworZm1heDM2MTI3IGZtYSAgMSAgIDAgICctNUUtNCcgICAgICAtPiAgJy0wLjAwMDUnCitmbWF4MzYxMjggZm1hICAxICAgMCAgJy01RS0xJyAgICAgIC0+ICAnLTAuNScKK2ZtYXgzNjEyOSBmbWEgIDEgICAwICAnLTVFMCcgICAgICAgLT4gICctNScKK2ZtYXgzNjEzMCBmbWEgIDEgICAwICAnLTVFMScgICAgICAgLT4gICctNTAnCitmbWF4MzYxMzEgZm1hICAxICAgMCAgJy01RTUnICAgICAgIC0+ICAnLTUwMDAwMCcKK2ZtYXgzNjEzMiBmbWEgIDEgICAwICAnLTVFMTUnICAgICAgLT4gICctNTAwMDAwMDAwMDAwMDAwMCcKK2ZtYXgzNjEzMyBmbWEgIDEgICAwICAnLTVFMTYnICAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE2JyAgIFJvdW5kZWQKK2ZtYXgzNjEzNCBmbWEgIDEgICAwICAnLTVFMTcnICAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE3JyAgIFJvdW5kZWQKK2ZtYXgzNjEzNSBmbWEgIDEgICAwICAnLTVFMTgnICAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE4JyAgIFJvdW5kZWQKK2ZtYXgzNjEzNiBmbWEgIDEgICAwICAnLTVFMTAwJyAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzEwMCcgIFJvdW5kZWQKKworLS0gcmVsYXRlZAorZm1heDM2MTM3IGZtYSAgMSAgICAxICAnMEUtMTknICAgICAgLT4gICcxLjAwMDAwMDAwMDAwMDAwMCcgIFJvdW5kZWQKK2ZtYXgzNjEzOCBmbWEgIDEgICAtMSAgJzBFLTE5JyAgICAgIC0+ICAnLTEuMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCitmbWF4MzYxMzkgZm1hICAxICAgJzBFLTE5JyAxICAgICAgICAtPiAgJzEuMDAwMDAwMDAwMDAwMDAwJyAgUm91bmRlZAorZm1heDM2MTQwIGZtYSAgMSAgICcwRS0xOScgLTEgICAgICAgLT4gICctMS4wMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2ZtYXgzNjE0MSBmbWEgIDEgICAxRSsxMSAgIDAuMDAwMCAgIC0+ICAnMTAwMDAwMDAwMDAwLjAwMDAnCitmbWF4MzYxNDIgZm1hICAxICAgMUUrMTEgICAwLjAwMDAwICAtPiAgJzEwMDAwMDAwMDAwMC4wMDAwJyAgUm91bmRlZAorZm1heDM2MTQzIGZtYSAgMSAgIDAuMDAwICAgMUUrMTIgICAgLT4gICcxMDAwMDAwMDAwMDAwLjAwMCcKK2ZtYXgzNjE0NCBmbWEgIDEgICAwLjAwMDAgIDFFKzEyICAgIC0+ICAnMTAwMDAwMDAwMDAwMC4wMDAnICBSb3VuZGVkCisKKy0tIFtzb21lIG9mIHRoZSBuZXh0IGdyb3VwIGFyZSByZWFsbHkgY29uc3RydWN0b3IgdGVzdHNdCitmbWF4MzYxNDYgZm1hICAxICAgJzAwLjAnICAwICAgICAgIC0+ICAnMC4wJworZm1heDM2MTQ3IGZtYSAgMSAgICcwLjAwJyAgMCAgICAgICAtPiAgJzAuMDAnCitmbWF4MzYxNDggZm1hICAxICAgIDAgICAgICAnMC4wMCcgIC0+ICAnMC4wMCcKK2ZtYXgzNjE0OSBmbWEgIDEgICAgMCAgICAgICcwMC4wJyAgLT4gICcwLjAnCitmbWF4MzYxNTAgZm1hICAxICAgJzAwLjAnICAnMC4wMCcgIC0+ICAnMC4wMCcKK2ZtYXgzNjE1MSBmbWEgIDEgICAnMC4wMCcgICcwMC4wJyAgLT4gICcwLjAwJworZm1heDM2MTUyIGZtYSAgMSAgICczJyAgICAgJy4zJyAgICAtPiAgJzMuMycKK2ZtYXgzNjE1MyBmbWEgIDEgICAnMy4nICAgICcuMycgICAgLT4gICczLjMnCitmbWF4MzYxNTQgZm1hICAxICAgJzMuMCcgICAnLjMnICAgIC0+ICAnMy4zJworZm1heDM2MTU1IGZtYSAgMSAgICczLjAwJyAgJy4zJyAgICAtPiAgJzMuMzAnCitmbWF4MzYxNTYgZm1hICAxICAgJzMnICAgICAnMycgICAgIC0+ICAnNicKK2ZtYXgzNjE1NyBmbWEgIDEgICAnMycgICAgICcrMycgICAgLT4gICc2JworZm1heDM2MTU4IGZtYSAgMSAgICczJyAgICAgJy0zJyAgICAtPiAgJzAnCitmbWF4MzYxNTkgZm1hICAxICAgJzAuMycgICAnLTAuMycgIC0+ICAnMC4wJworZm1heDM2MTYwIGZtYSAgMSAgICcwLjAzJyAgJy0wLjAzJyAtPiAgJzAuMDAnCisKKy0tIHRyeSBib3JkZXJsaW5lIHByZWNpc2lvbiwgd2l0aCBjYXJyaWVzLCBldGMuCitmbWF4MzYxNjEgZm1hICAxICAgJzFFKzEzJyAnLTEnICAgIC0+ICc5OTk5OTk5OTk5OTk5JworZm1heDM2MTYyIGZtYSAgMSAgICcxRSsxMycgICcxLjExJyAtPiAnMTAwMDAwMDAwMDAwMDEuMTEnCitmbWF4MzYxNjMgZm1hICAxICAgJzEuMTEnICAnMUUrMTMnIC0+ICcxMDAwMDAwMDAwMDAwMS4xMScKK2ZtYXgzNjE2NCBmbWEgIDEgICAnLTEnICAgICcxRSsxMycgLT4gJzk5OTk5OTk5OTk5OTknCitmbWF4MzYxNjUgZm1hICAxICAgJzdFKzEzJyAnLTEnICAgIC0+ICc2OTk5OTk5OTk5OTk5OScKK2ZtYXgzNjE2NiBmbWEgIDEgICAnN0UrMTMnICAnMS4xMScgLT4gJzcwMDAwMDAwMDAwMDAxLjExJworZm1heDM2MTY3IGZtYSAgMSAgICcxLjExJyAgJzdFKzEzJyAtPiAnNzAwMDAwMDAwMDAwMDEuMTEnCitmbWF4MzYxNjggZm1hICAxICAgJy0xJyAgICAnN0UrMTMnIC0+ICc2OTk5OTk5OTk5OTk5OScKKworLS0gICAgICAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgMSAyMzQ1Njc4OTAxMjM0NTYKK2ZtYXgzNjE3MCBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2MycgLT4gJzEuMDAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjE3MSBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2MicgLT4gJzEuMDAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjE3MiBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2MScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjE3MyBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2MCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjE3NCBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1OScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjE3NSBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1OCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjE3NiBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NycgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjE3NyBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NicgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCitmbWF4MzYxNzggZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTUnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTknCitmbWF4MzYxNzkgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTQnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTgnCitmbWF4MzYxODAgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTMnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTcnCitmbWF4MzYxODEgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTInIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTYnCitmbWF4MzYxODIgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTEnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTUnCitmbWF4MzYxODMgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTAnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTQnCisKKy0tIGFuZCBzb21lIG1vcmUsIGluY2x1ZGluZyByZXNpZHVlIGVmZmVjdHMgYW5kIGRpZmZlcmVudCByb3VuZGluZ3MKK3JvdW5kaW5nOiBoYWxmX3VwCitmbWF4MzYyMDAgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknCitmbWF4MzYyMDEgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAyIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMyBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDQgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA1IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNiBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDcgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA4IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwOSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMTAgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjExIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIxMiBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMTMgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjE0IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIxNSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMTYgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnCitmbWF4MzYyMTcgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjE4IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIxOSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2ZtYXgzNjIyMCBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScKK2ZtYXgzNjIyMSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMjIgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjIzIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIyNCBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMjUgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjI2IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIyNyBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMjggZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjI5IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIzMCBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMzEgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjMyIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIzMyBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMzQgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjM1IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIzNiBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcKK2ZtYXgzNjIzNyBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMzggZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjM5IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitmbWF4MzYyNDAgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODgnIDAuNDk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjQxIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg4JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI0MiBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OCcgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitmbWF4MzYyNTAgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknCitmbWF4MzYyNTEgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjUyIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI1MyBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyNTQgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjU1IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI1NiBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyNTcgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjU4IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI1OSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyNjAgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjYxIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI2MiBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyNjMgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjY0IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI2NSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyNjYgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnCitmbWF4MzYyNjcgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjY4IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI2OSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIDEgaW4gbGFzdCBwbGFjZSB0ZXN0cworcm91bmRpbmc6IGhhbGZfZXZlbgorZm1heDM2MzAxIGZtYSAgMSAgICAtMSAgIDEgICAgICAtPiAgIDAKK2ZtYXgzNjMwMiBmbWEgIDEgICAgIDAgICAxICAgICAgLT4gICAxCitmbWF4MzYzMDMgZm1hICAxICAgICAxICAgMSAgICAgIC0+ICAgMgorZm1heDM2MzA0IGZtYSAgMSAgICAxMiAgIDEgICAgICAtPiAgMTMKK2ZtYXgzNjMwNSBmbWEgIDEgICAgOTggICAxICAgICAgLT4gIDk5CitmbWF4MzYzMDYgZm1hICAxICAgIDk5ICAgMSAgICAgIC0+IDEwMAorZm1heDM2MzA3IGZtYSAgMSAgIDEwMCAgIDEgICAgICAtPiAxMDEKK2ZtYXgzNjMwOCBmbWEgIDEgICAxMDEgICAxICAgICAgLT4gMTAyCitmbWF4MzYzMDkgZm1hICAxICAgIC0xICAtMSAgICAgIC0+ICAtMgorZm1heDM2MzEwIGZtYSAgMSAgICAgMCAgLTEgICAgICAtPiAgLTEKK2ZtYXgzNjMxMSBmbWEgIDEgICAgIDEgIC0xICAgICAgLT4gICAwCitmbWF4MzYzMTIgZm1hICAxICAgIDEyICAtMSAgICAgIC0+ICAxMQorZm1heDM2MzEzIGZtYSAgMSAgICA5OCAgLTEgICAgICAtPiAgOTcKK2ZtYXgzNjMxNCBmbWEgIDEgICAgOTkgIC0xICAgICAgLT4gIDk4CitmbWF4MzYzMTUgZm1hICAxICAgMTAwICAtMSAgICAgIC0+ICA5OQorZm1heDM2MzE2IGZtYSAgMSAgIDEwMSAgLTEgICAgICAtPiAxMDAKKworZm1heDM2MzIxIGZtYSAgMSAgIC0wLjAxICAwLjAxICAgIC0+ICAwLjAwCitmbWF4MzYzMjIgZm1hICAxICAgIDAuMDAgIDAuMDEgICAgLT4gIDAuMDEKK2ZtYXgzNjMyMyBmbWEgIDEgICAgMC4wMSAgMC4wMSAgICAtPiAgMC4wMgorZm1heDM2MzI0IGZtYSAgMSAgICAwLjEyICAwLjAxICAgIC0+ICAwLjEzCitmbWF4MzYzMjUgZm1hICAxICAgIDAuOTggIDAuMDEgICAgLT4gIDAuOTkKK2ZtYXgzNjMyNiBmbWEgIDEgICAgMC45OSAgMC4wMSAgICAtPiAgMS4wMAorZm1heDM2MzI3IGZtYSAgMSAgICAxLjAwICAwLjAxICAgIC0+ICAxLjAxCitmbWF4MzYzMjggZm1hICAxICAgIDEuMDEgIDAuMDEgICAgLT4gIDEuMDIKK2ZtYXgzNjMyOSBmbWEgIDEgICAtMC4wMSAtMC4wMSAgICAtPiAtMC4wMgorZm1heDM2MzMwIGZtYSAgMSAgICAwLjAwIC0wLjAxICAgIC0+IC0wLjAxCitmbWF4MzYzMzEgZm1hICAxICAgIDAuMDEgLTAuMDEgICAgLT4gIDAuMDAKK2ZtYXgzNjMzMiBmbWEgIDEgICAgMC4xMiAtMC4wMSAgICAtPiAgMC4xMQorZm1heDM2MzMzIGZtYSAgMSAgICAwLjk4IC0wLjAxICAgIC0+ICAwLjk3CitmbWF4MzYzMzQgZm1hICAxICAgIDAuOTkgLTAuMDEgICAgLT4gIDAuOTgKK2ZtYXgzNjMzNSBmbWEgIDEgICAgMS4wMCAtMC4wMSAgICAtPiAgMC45OQorZm1heDM2MzM2IGZtYSAgMSAgICAxLjAxIC0wLjAxICAgIC0+ICAxLjAwCisKKy0tIHNvbWUgbW9yZSBjYXNlcyB3aGVyZSBmbWEgIDEgIGluZyAwIGFmZmVjdHMgdGhlIGNvZWZmaWNpZW50CitmbWF4MzYzNDAgZm1hICAxICAgMUUrMyAgICAwICAgIC0+ICAgICAgICAgMTAwMAorZm1heDM2MzQxIGZtYSAgMSAgIDFFKzE1ICAgMCAgICAtPiAgICAxMDAwMDAwMDAwMDAwMDAwCitmbWF4MzYzNDIgZm1hICAxICAgMUUrMTYgICAwICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2ICBSb3VuZGVkCitmbWF4MzYzNDMgZm1hICAxICAgMUUrMTcgICAwICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzE3ICBSb3VuZGVkCistLSB3aGljaCBzaW1wbHkgZm9sbG93IGZyb20gdGhlc2UgY2FzZXMgLi4uCitmbWF4MzYzNDQgZm1hICAxICAgMUUrMyAgICAxICAgIC0+ICAgICAgICAgMTAwMQorZm1heDM2MzQ1IGZtYSAgMSAgIDFFKzE1ICAgMSAgICAtPiAgICAxMDAwMDAwMDAwMDAwMDAxCitmbWF4MzYzNDYgZm1hICAxICAgMUUrMTYgICAxICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjM0NyBmbWEgIDEgICAxRSsxNyAgIDEgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUrMTcgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MzQ4IGZtYSAgMSAgIDFFKzMgICAgNyAgICAtPiAgICAgICAgIDEwMDcKK2ZtYXgzNjM0OSBmbWEgIDEgICAxRSsxNSAgIDcgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwNworZm1heDM2MzUwIGZtYSAgMSAgIDFFKzE2ICAgNyAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAxRSsxNiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYzNTEgZm1hICAxICAgMUUrMTcgICA3ICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzE3ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gdHJ5emVyb3MgY2FzZXMKK2ZtYXgzNjM2MSAgZm1hICAxICAgMEUrNTAgMTAwMDBFKzEgIC0+IDEuMDAwMEUrNQorZm1heDM2MzYyICBmbWEgIDEgICAxMDAwMEUrMSAwRS01MCAgLT4gMTAwMDAwLjAwMDAwMDAwMDAgIFJvdW5kZWQKK2ZtYXgzNjM2MyAgZm1hICAxICAgMTAwMDBFKzEgMTAwMDBFLTUwICAtPiAxMDAwMDAuMDAwMDAwMDAwMCAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzYzNjQgIGZtYSAgMSAgIDEyLjM0ICAgIDBlLTM5OCAgLT4gMTIuMzQwMDAwMDAwMDAwMDAgIFJvdW5kZWQKKworLS0gdWxwIHJlcGxhY2VtZW50IHRlc3RzCitmbWF4MzY0MDAgZm1hICAxICAgICAxICAgNzdlLTE0ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwNzcKK2ZtYXgzNjQwMSBmbWEgIDEgICAgIDEgICA3N2UtMTUgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwNzcKK2ZtYXgzNjQwMiBmbWEgIDEgICAgIDEgICA3N2UtMTYgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0MDMgZm1hICAxICAgICAxICAgNzdlLTE3ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDA0IGZtYSAgMSAgICAgMSAgIDc3ZS0xOCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQwNSBmbWEgIDEgICAgIDEgICA3N2UtMTkgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0MDYgZm1hICAxICAgICAxICAgNzdlLTk5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzY0MTAgZm1hICAxICAgIDEwICAgNzdlLTE0ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDc3CitmbWF4MzY0MTEgZm1hICAxICAgIDEwICAgNzdlLTE1ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZm1heDM2NDEyIGZtYSAgMSAgICAxMCAgIDc3ZS0xNiAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQxMyBmbWEgIDEgICAgMTAgICA3N2UtMTcgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0MTQgZm1hICAxICAgIDEwICAgNzdlLTE4ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDE1IGZtYSAgMSAgICAxMCAgIDc3ZS0xOSAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQxNiBmbWEgIDEgICAgMTAgICA3N2UtOTkgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNjQyMCBmbWEgIDEgICAgNzdlLTE0ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDA3NworZm1heDM2NDIxIGZtYSAgMSAgICA3N2UtMTUgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDA3NworZm1heDM2NDIyIGZtYSAgMSAgICA3N2UtMTYgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQyMyBmbWEgIDEgICAgNzdlLTE3ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0MjQgZm1hICAxICAgIDc3ZS0xOCAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDI1IGZtYSAgMSAgICA3N2UtMTkgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQyNiBmbWEgIDEgICAgNzdlLTk5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNjQzMCBmbWEgIDEgICAgNzdlLTE0ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwNzcKK2ZtYXgzNjQzMSBmbWEgIDEgICAgNzdlLTE1ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0MzIgZm1hICAxICAgIDc3ZS0xNiAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDMzIGZtYSAgMSAgICA3N2UtMTcgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQzNCBmbWEgIDEgICAgNzdlLTE4ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0MzUgZm1hICAxICAgIDc3ZS0xOSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDM2IGZtYSAgMSAgICA3N2UtOTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmUgdWxwcworZm1heDM2NDQwIGZtYSAgMSAgICAgMSAgIC03N2UtMTQgICAgICAtPiAgMC45OTk5OTk5OTk5OTkyMworZm1heDM2NDQxIGZtYSAgMSAgICAgMSAgIC03N2UtMTUgICAgICAtPiAgMC45OTk5OTk5OTk5OTk5MjMKK2ZtYXgzNjQ0MiBmbWEgIDEgICAgIDEgICAtNzdlLTE2ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTkyMworZm1heDM2NDQzIGZtYSAgMSAgICAgMSAgIC03N2UtMTcgICAgICAtPiAgMC45OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDQ0IGZtYSAgMSAgICAgMSAgIC03N2UtMTggICAgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM2NDQ1IGZtYSAgMSAgICAgMSAgIC03N2UtMTkgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0NDYgZm1hICAxICAgICAxICAgLTc3ZS05OSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZm1heDM2NDUwIGZtYSAgMSAgICAxMCAgIC03N2UtMTQgICAgICAtPiAgIDkuOTk5OTk5OTk5OTk5MjMKK2ZtYXgzNjQ1MSBmbWEgIDEgICAgMTAgICAtNzdlLTE1ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTkyMworZm1heDM2NDUyIGZtYSAgMSAgICAxMCAgIC03N2UtMTYgICAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDUzIGZtYSAgMSAgICAxMCAgIC03N2UtMTcgICAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM2NDU0IGZtYSAgMSAgICAxMCAgIC03N2UtMTggICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0NTUgZm1hICAxICAgIDEwICAgLTc3ZS0xOSAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ1NiBmbWEgIDEgICAgMTAgICAtNzdlLTk5ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzY0NjAgZm1hICAxICAgIC03N2UtMTQgICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OTk5OTIzCitmbWF4MzY0NjEgZm1hICAxICAgIC03N2UtMTUgICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OTk5OTkyMworZm1heDM2NDYyIGZtYSAgMSAgICAtNzdlLTE2ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTIzCitmbWF4MzY0NjMgZm1hICAxICAgIC03N2UtMTcgICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0NjQgZm1hICAxICAgIC03N2UtMTggICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0NjUgZm1hICAxICAgIC03N2UtMTkgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ2NiBmbWEgIDEgICAgLTc3ZS05OSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzY0NzAgZm1hICAxICAgIC03N2UtMTQgICAgICAxMCAgIC0+ICAgOS45OTk5OTk5OTk5OTkyMworZm1heDM2NDcxIGZtYSAgMSAgICAtNzdlLTE1ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTIzCitmbWF4MzY0NzIgZm1hICAxICAgIC03N2UtMTYgICAgICAxMCAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0NzMgZm1hICAxICAgIC03N2UtMTcgICAgICAxMCAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0NzQgZm1hICAxICAgIC03N2UtMTggICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ3NSBmbWEgIDEgICAgLTc3ZS0xOSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDc2IGZtYSAgMSAgICAtNzdlLTk5ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlIHVscHMKK2ZtYXgzNjQ4MCBmbWEgIDEgICAgLTEgICAgNzdlLTE0ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTIzCitmbWF4MzY0ODEgZm1hICAxICAgIC0xICAgIDc3ZS0xNSAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5MjMKK2ZtYXgzNjQ4MiBmbWEgIDEgICAgLTEgICAgNzdlLTE2ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5MjMKK2ZtYXgzNjQ4MyBmbWEgIDEgICAgLTEgICAgNzdlLTE3ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0ODQgZm1hICAxICAgIC0xICAgIDc3ZS0xOCAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM2NDg1IGZtYSAgMSAgICAtMSAgICA3N2UtMTkgICAgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDg2IGZtYSAgMSAgICAtMSAgICA3N2UtOTkgICAgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzY0OTAgZm1hICAxICAgLTEwICAgIDc3ZS0xNCAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5MjMKK2ZtYXgzNjQ5MSBmbWEgIDEgICAtMTAgICAgNzdlLTE1ICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTk5MjMKK2ZtYXgzNjQ5MiBmbWEgIDEgICAtMTAgICAgNzdlLTE2ICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0OTMgZm1hICAxICAgLTEwICAgIDc3ZS0xNyAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM2NDk0IGZtYSAgMSAgIC0xMCAgICA3N2UtMTggICAgICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDk1IGZtYSAgMSAgIC0xMCAgICA3N2UtMTkgICAgICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDk2IGZtYSAgMSAgIC0xMCAgICA3N2UtOTkgICAgICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzY1MDAgZm1hICAxICAgICA3N2UtMTQgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTkyMworZm1heDM2NTAxIGZtYSAgMSAgICAgNzdlLTE1ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTIzCitmbWF4MzY1MDIgZm1hICAxICAgICA3N2UtMTYgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTIzCitmbWF4MzY1MDMgZm1hICAxICAgICA3N2UtMTcgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZm1heDM2NTA0IGZtYSAgMSAgICAgNzdlLTE4ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjUwNSBmbWEgIDEgICAgIDc3ZS0xOSAgICAgIC0xICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjUwNiBmbWEgIDEgICAgIDc3ZS05OSAgICAgIC0xICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZm1heDM2NTEwIGZtYSAgMSAgICAgNzdlLTE0ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTIzCitmbWF4MzY1MTEgZm1hICAxICAgICA3N2UtMTUgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTIzCitmbWF4MzY1MTIgZm1hICAxICAgICA3N2UtMTYgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZm1heDM2NTEzIGZtYSAgMSAgICAgNzdlLTE3ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjUxNCBmbWEgIDEgICAgIDc3ZS0xOCAgICAgIC0xMCAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjUxNSBmbWEgIDEgICAgIDc3ZS0xOSAgICAgIC0xMCAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjUxNiBmbWEgIDEgICAgIDc3ZS05OSAgICAgIC0xMCAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworCistLSBsb25nIG9wZXJhbmRzCitmbWF4MzY1MjEgZm1hICAxICAgMTAxMjM0NTYyMzQ1Njc4MDAwIDAgLT4gMS4wMTIzNDU2MjM0NTY3ODBFKzE3IFJvdW5kZWQKK2ZtYXgzNjUyMiBmbWEgIDEgICAwIDEwMTIzNDU2MjM0NTY3ODAwMCAtPiAxLjAxMjM0NTYyMzQ1Njc4MEUrMTcgUm91bmRlZAorZm1heDM2NTIzIGZtYSAgMSAgIDEwMTIzNDU2MjM0NTY3ODAwICAwIC0+IDEuMDEyMzQ1NjIzNDU2NzgwRSsxNiBSb3VuZGVkCitmbWF4MzY1MjQgZm1hICAxICAgMCAxMDEyMzQ1NjIzNDU2NzgwMCAgLT4gMS4wMTIzNDU2MjM0NTY3ODBFKzE2IFJvdW5kZWQKK2ZtYXgzNjUyNSBmbWEgIDEgICAxMDEyMzQ1NjIzNDU2Nzg5MCAgMCAtPiAxLjAxMjM0NTYyMzQ1Njc4OUUrMTYgUm91bmRlZAorZm1heDM2NTI2IGZtYSAgMSAgIDAgMTAxMjM0NTYyMzQ1Njc4OTAgIC0+IDEuMDEyMzQ1NjIzNDU2Nzg5RSsxNiBSb3VuZGVkCitmbWF4MzY1MjcgZm1hICAxICAgMTAxMjM0NTYyMzQ1Njc4OTEgIDAgLT4gMS4wMTIzNDU2MjM0NTY3ODlFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2NTI4IGZtYSAgMSAgIDAgMTAxMjM0NTYyMzQ1Njc4OTEgIC0+IDEuMDEyMzQ1NjIzNDU2Nzg5RSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjUyOSBmbWEgIDEgICAxMDEyMzQ1NjIzNDU2Nzg5MDEgMCAtPiAxLjAxMjM0NTYyMzQ1Njc4OUUrMTcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY1MzAgZm1hICAxICAgMCAxMDEyMzQ1NjIzNDU2Nzg5MDEgLT4gMS4wMTIzNDU2MjM0NTY3ODlFKzE3IEluZXhhY3QgUm91bmRlZAorZm1heDM2NTMxIGZtYSAgMSAgIDEwMTIzNDU2MjM0NTY3ODk2ICAwIC0+IDEuMDEyMzQ1NjIzNDU2NzkwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjUzMiBmbWEgIDEgICAwIDEwMTIzNDU2MjM0NTY3ODk2ICAtPiAxLjAxMjM0NTYyMzQ1Njc5MEUrMTYgSW5leGFjdCBSb3VuZGVkCisKKy0tIHZlcmlmeSBhIHF1ZXJ5Cityb3VuZGluZzogICAgIGRvd24KK2ZtYXgzNjU2MSBmbWEgIDEgICAxZS0zOTggOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IEluZXhhY3QgUm91bmRlZAorZm1heDM2NTYyIGZtYSAgMSAgICAgICAgMCA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszODQgUm91bmRlZAorLS0gYW5kIHVzaW5nIGRlY2ltYWw2NCBib3VuZHMuLi4KK3JvdW5kaW5nOiAgICAgZG93bgorZm1heDM2NTYzIGZtYSAgMSAgIDFlLTM4OCA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY1NjQgZm1hICAxICAgICAgICAwIDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCBSb3VuZGVkCisKKy0tIG1vcmUgemVyb3MsIGV0Yy4KK3JvdW5kaW5nOiBoYWxmX2V2ZW4KKworZm1heDM2NzAxIGZtYSAgMSAgIDUuMDAgMS4wMEUtMyAtPiA1LjAwMTAwCitmbWF4MzY3MDIgZm1hICAxICAgMDAuMDAgMC4wMDAgIC0+IDAuMDAwCitmbWF4MzY3MDMgZm1hICAxICAgMDAuMDAgMEUtMyAgIC0+IDAuMDAwCitmbWF4MzY3MDQgZm1hICAxICAgMEUtMyAgMDAuMDAgIC0+IDAuMDAwCisKK2ZtYXgzNjcxMCBmbWEgIDEgICAwRSszICAwMC4wMCAgLT4gMC4wMAorZm1heDM2NzExIGZtYSAgMSAgIDBFKzMgIDAwLjAgICAtPiAwLjAKK2ZtYXgzNjcxMiBmbWEgIDEgICAwRSszICAwMC4gICAgLT4gMAorZm1heDM2NzEzIGZtYSAgMSAgIDBFKzMgIDAwLkUrMSAtPiAwRSsxCitmbWF4MzY3MTQgZm1hICAxICAgMEUrMyAgMDAuRSsyIC0+IDBFKzIKK2ZtYXgzNjcxNSBmbWEgIDEgICAwRSszICAwMC5FKzMgLT4gMEUrMworZm1heDM2NzE2IGZtYSAgMSAgIDBFKzMgIDAwLkUrNCAtPiAwRSszCitmbWF4MzY3MTcgZm1hICAxICAgMEUrMyAgMDAuRSs1IC0+IDBFKzMKK2ZtYXgzNjcxOCBmbWEgIDEgICAwRSszICAtMDAuMCAgIC0+IDAuMAorZm1heDM2NzE5IGZtYSAgMSAgIDBFKzMgIC0wMC4gICAgLT4gMAorZm1heDM2NzMxIGZtYSAgMSAgIDBFKzMgIC0wMC5FKzEgLT4gMEUrMQorCitmbWF4MzY3MjAgZm1hICAxICAgMDAuMDAgIDBFKzMgIC0+IDAuMDAKK2ZtYXgzNjcyMSBmbWEgIDEgICAwMC4wICAgMEUrMyAgLT4gMC4wCitmbWF4MzY3MjIgZm1hICAxICAgMDAuICAgIDBFKzMgIC0+IDAKK2ZtYXgzNjcyMyBmbWEgIDEgICAwMC5FKzEgMEUrMyAgLT4gMEUrMQorZm1heDM2NzI0IGZtYSAgMSAgIDAwLkUrMiAwRSszICAtPiAwRSsyCitmbWF4MzY3MjUgZm1hICAxICAgMDAuRSszIDBFKzMgIC0+IDBFKzMKK2ZtYXgzNjcyNiBmbWEgIDEgICAwMC5FKzQgMEUrMyAgLT4gMEUrMworZm1heDM2NzI3IGZtYSAgMSAgIDAwLkUrNSAwRSszICAtPiAwRSszCitmbWF4MzY3MjggZm1hICAxICAgLTAwLjAwIDBFKzMgIC0+IDAuMDAKK2ZtYXgzNjcyOSBmbWEgIDEgICAtMDAuMCAgMEUrMyAgLT4gMC4wCitmbWF4MzY3MzAgZm1hICAxICAgLTAwLiAgIDBFKzMgIC0+IDAKKworZm1heDM2NzMyIGZtYSAgMSAgICAwICAgICAwICAgICAtPiAgMAorZm1heDM2NzMzIGZtYSAgMSAgICAwICAgIC0wICAgICAtPiAgMAorZm1heDM2NzM0IGZtYSAgMSAgIC0wICAgICAwICAgICAtPiAgMAorZm1heDM2NzM1IGZtYSAgMSAgIC0wICAgIC0wICAgICAtPiAtMCAgICAgLS0gSUVFRSA4NTQgc3BlY2lhbCBjYXNlCisKK2ZtYXgzNjczNiBmbWEgIDEgICAgMSAgICAtMSAgICAgLT4gIDAKK2ZtYXgzNjczNyBmbWEgIDEgICAtMSAgICAtMSAgICAgLT4gLTIKK2ZtYXgzNjczOCBmbWEgIDEgICAgMSAgICAgMSAgICAgLT4gIDIKK2ZtYXgzNjczOSBmbWEgIDEgICAtMSAgICAgMSAgICAgLT4gIDAKKworZm1heDM2NzQxIGZtYSAgMSAgICAwICAgIC0xICAgICAtPiAtMQorZm1heDM2NzQyIGZtYSAgMSAgIC0wICAgIC0xICAgICAtPiAtMQorZm1heDM2NzQzIGZtYSAgMSAgICAwICAgICAxICAgICAtPiAgMQorZm1heDM2NzQ0IGZtYSAgMSAgIC0wICAgICAxICAgICAtPiAgMQorZm1heDM2NzQ1IGZtYSAgMSAgIC0xICAgICAwICAgICAtPiAtMQorZm1heDM2NzQ2IGZtYSAgMSAgIC0xICAgIC0wICAgICAtPiAtMQorZm1heDM2NzQ3IGZtYSAgMSAgICAxICAgICAwICAgICAtPiAgMQorZm1heDM2NzQ4IGZtYSAgMSAgICAxICAgIC0wICAgICAtPiAgMQorCitmbWF4MzY3NTEgZm1hICAxICAgIDAuMCAgLTEgICAgIC0+IC0xLjAKK2ZtYXgzNjc1MiBmbWEgIDEgICAtMC4wICAtMSAgICAgLT4gLTEuMAorZm1heDM2NzUzIGZtYSAgMSAgICAwLjAgICAxICAgICAtPiAgMS4wCitmbWF4MzY3NTQgZm1hICAxICAgLTAuMCAgIDEgICAgIC0+ICAxLjAKK2ZtYXgzNjc1NSBmbWEgIDEgICAtMS4wICAgMCAgICAgLT4gLTEuMAorZm1heDM2NzU2IGZtYSAgMSAgIC0xLjAgIC0wICAgICAtPiAtMS4wCitmbWF4MzY3NTcgZm1hICAxICAgIDEuMCAgIDAgICAgIC0+ICAxLjAKK2ZtYXgzNjc1OCBmbWEgIDEgICAgMS4wICAtMCAgICAgLT4gIDEuMAorCitmbWF4MzY3NjEgZm1hICAxICAgIDAgICAgLTEuMCAgIC0+IC0xLjAKK2ZtYXgzNjc2MiBmbWEgIDEgICAtMCAgICAtMS4wICAgLT4gLTEuMAorZm1heDM2NzYzIGZtYSAgMSAgICAwICAgICAxLjAgICAtPiAgMS4wCitmbWF4MzY3NjQgZm1hICAxICAgLTAgICAgIDEuMCAgIC0+ICAxLjAKK2ZtYXgzNjc2NSBmbWEgIDEgICAtMSAgICAgMC4wICAgLT4gLTEuMAorZm1heDM2NzY2IGZtYSAgMSAgIC0xICAgIC0wLjAgICAtPiAtMS4wCitmbWF4MzY3NjcgZm1hICAxICAgIDEgICAgIDAuMCAgIC0+ICAxLjAKK2ZtYXgzNjc2OCBmbWEgIDEgICAgMSAgICAtMC4wICAgLT4gIDEuMAorCitmbWF4MzY3NzEgZm1hICAxICAgIDAuMCAgLTEuMCAgIC0+IC0xLjAKK2ZtYXgzNjc3MiBmbWEgIDEgICAtMC4wICAtMS4wICAgLT4gLTEuMAorZm1heDM2NzczIGZtYSAgMSAgICAwLjAgICAxLjAgICAtPiAgMS4wCitmbWF4MzY3NzQgZm1hICAxICAgLTAuMCAgIDEuMCAgIC0+ICAxLjAKK2ZtYXgzNjc3NSBmbWEgIDEgICAtMS4wICAgMC4wICAgLT4gLTEuMAorZm1heDM2Nzc2IGZtYSAgMSAgIC0xLjAgIC0wLjAgICAtPiAtMS4wCitmbWF4MzY3NzcgZm1hICAxICAgIDEuMCAgIDAuMCAgIC0+ICAxLjAKK2ZtYXgzNjc3OCBmbWEgIDEgICAgMS4wICAtMC4wICAgLT4gIDEuMAorCistLSBTcGVjaWFscworZm1heDM2NzgwIGZtYSAgMSAgIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2ZtYXgzNjc4MSBmbWEgIDEgICAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitmbWF4MzY3ODIgZm1hICAxICAgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZm1heDM2NzgzIGZtYSAgMSAgIC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2ZtYXgzNjc4NCBmbWEgIDEgICAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitmbWF4MzY3ODUgZm1hICAxICAgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZm1heDM2Nzg2IGZtYSAgMSAgIC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2ZtYXgzNjc4NyBmbWEgIDEgICAtMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4MzY3ODggZm1hICAxICAgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM2Nzg5IGZtYSAgMSAgIC0xICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2ZtYXgzNjc5MCBmbWEgIDEgICAtMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4MzY3OTEgZm1hICAxICAgIDAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM2NzkyIGZtYSAgMSAgICAxICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2ZtYXgzNjc5MyBmbWEgIDEgICAgMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4MzY3OTQgZm1hICAxICAgIEluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK2ZtYXgzNjgwMCBmbWEgIDEgICAgSW5mICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzNjgwMSBmbWEgIDEgICAgSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitmbWF4MzY4MDIgZm1hICAxICAgIEluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorZm1heDM2ODAzIGZtYSAgMSAgICBJbmYgIC0wICAgICAtPiAgSW5maW5pdHkKK2ZtYXgzNjgwNCBmbWEgIDEgICAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitmbWF4MzY4MDUgZm1hICAxICAgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorZm1heDM2ODA2IGZtYSAgMSAgICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK2ZtYXgzNjgwNyBmbWEgIDEgICAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitmbWF4MzY4MDggZm1hICAxICAgLTEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorZm1heDM2ODA5IGZtYSAgMSAgIC1JbmYgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODEwIGZtYSAgMSAgIC0xICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2ZtYXgzNjgxMSBmbWEgIDEgICAtMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitmbWF4MzY4MTIgZm1hICAxICAgIDAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZm1heDM2ODEzIGZtYSAgMSAgICAxICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2ZtYXgzNjgxNCBmbWEgIDEgICAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitmbWF4MzY4MTUgZm1hICAxICAgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorCitmbWF4MzY4MjEgZm1hICAxICAgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2ZtYXgzNjgyMiBmbWEgIDEgICAgTmFOIC0xMDAwICAgLT4gIE5hTgorZm1heDM2ODIzIGZtYSAgMSAgICBOYU4gLTEgICAgICAtPiAgTmFOCitmbWF4MzY4MjQgZm1hICAxICAgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2ZtYXgzNjgyNSBmbWEgIDEgICAgTmFOICAwICAgICAgLT4gIE5hTgorZm1heDM2ODI2IGZtYSAgMSAgICBOYU4gIDEgICAgICAtPiAgTmFOCitmbWF4MzY4MjcgZm1hICAxICAgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2ZtYXgzNjgyOCBmbWEgIDEgICAgTmFOICBJbmYgICAgLT4gIE5hTgorZm1heDM2ODI5IGZtYSAgMSAgICBOYU4gIE5hTiAgICAtPiAgTmFOCitmbWF4MzY4MzAgZm1hICAxICAgLUluZiAgTmFOICAgIC0+ICBOYU4KK2ZtYXgzNjgzMSBmbWEgIDEgICAtMTAwMCBOYU4gICAgLT4gIE5hTgorZm1heDM2ODMyIGZtYSAgMSAgIC0xICAgIE5hTiAgICAtPiAgTmFOCitmbWF4MzY4MzMgZm1hICAxICAgLTAgICAgTmFOICAgIC0+ICBOYU4KK2ZtYXgzNjgzNCBmbWEgIDEgICAgMCAgICBOYU4gICAgLT4gIE5hTgorZm1heDM2ODM1IGZtYSAgMSAgICAxICAgIE5hTiAgICAtPiAgTmFOCitmbWF4MzY4MzYgZm1hICAxICAgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2ZtYXgzNjgzNyBmbWEgIDEgICAgSW5mICBOYU4gICAgLT4gIE5hTgorCitmbWF4MzY4NDEgZm1hICAxICAgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NDIgZm1hICAxICAgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NDMgZm1hICAxICAgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NDQgZm1hICAxICAgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NDUgZm1hICAxICAgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NDYgZm1hICAxICAgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NDcgZm1hICAxICAgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NDggZm1hICAxICAgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NDkgZm1hICAxICAgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NTAgZm1hICAxICAgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NTEgZm1hICAxICAgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NTIgZm1hICAxICAgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NTMgZm1hICAxICAgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NTQgZm1hICAxICAgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NTUgZm1hICAxICAgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NTYgZm1hICAxICAgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NTcgZm1hICAxICAgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NTggZm1hICAxICAgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NTkgZm1hICAxICAgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2ZtYXgzNjg2MSBmbWEgIDEgICAgTmFOMSAgIC1JbmYgICAgLT4gIE5hTjEKK2ZtYXgzNjg2MiBmbWEgIDEgICArTmFOMiAgIC0xMDAwICAgLT4gIE5hTjIKK2ZtYXgzNjg2MyBmbWEgIDEgICAgTmFOMyAgICAxMDAwICAgLT4gIE5hTjMKK2ZtYXgzNjg2NCBmbWEgIDEgICAgTmFONCAgICBJbmYgICAgLT4gIE5hTjQKK2ZtYXgzNjg2NSBmbWEgIDEgICAgTmFONSAgICtOYU42ICAgLT4gIE5hTjUKK2ZtYXgzNjg2NiBmbWEgIDEgICAtSW5mICAgICBOYU43ICAgLT4gIE5hTjcKK2ZtYXgzNjg2NyBmbWEgIDEgICAtMTAwMCAgICBOYU44ICAgLT4gIE5hTjgKK2ZtYXgzNjg2OCBmbWEgIDEgICAgMTAwMCAgICBOYU45ICAgLT4gIE5hTjkKK2ZtYXgzNjg2OSBmbWEgIDEgICAgSW5mICAgICtOYU4xMCAgLT4gIE5hTjEwCitmbWF4MzY4NzEgZm1hICAxICAgIHNOYU4xMSAgLUluZiAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzNjg3MiBmbWEgIDEgICAgc05hTjEyICAtMTAwMCAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODczIGZtYSAgMSAgICBzTmFOMTMgICAxMDAwICAtPiAgTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NzQgZm1hICAxICAgIHNOYU4xNCAgIE5hTjE3IC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzNjg3NSBmbWEgIDEgICAgc05hTjE1ICBzTmFOMTggLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODc2IGZtYSAgMSAgICBOYU4xNiAgIHNOYU4xOSAtPiAgTmFOMTkgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NzcgZm1hICAxICAgLUluZiAgICArc05hTjIwIC0+ICBOYU4yMCAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzNjg3OCBmbWEgIDEgICAtMTAwMCAgICBzTmFOMjEgLT4gIE5hTjIxICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODc5IGZtYSAgMSAgICAxMDAwICAgIHNOYU4yMiAtPiAgTmFOMjIgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4ODAgZm1hICAxICAgIEluZiAgICAgc05hTjIzIC0+ICBOYU4yMyAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzNjg4MSBmbWEgIDEgICArTmFOMjUgICtzTmFOMjQgLT4gIE5hTjI0ICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODgyIGZtYSAgMSAgIC1OYU4yNiAgICBOYU4yOCAtPiAtTmFOMjYKK2ZtYXgzNjg4MyBmbWEgIDEgICAtc05hTjI3ICBzTmFOMjkgLT4gLU5hTjI3ICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODg0IGZtYSAgMSAgICAxMDAwICAgIC1OYU4zMCAtPiAtTmFOMzAKK2ZtYXgzNjg4NSBmbWEgIDEgICAgMTAwMCAgIC1zTmFOMzEgLT4gLU5hTjMxICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBub3cgdGhlIGNhc2Ugd2hlcmUgd2UgY2FuIGdldCB1bmRlcmZsb3cgYnV0IHRoZSByZXN1bHQgaXMgbm9ybWFsCistLSBbbm90ZSB0aGlzIGNhbid0IGhhcHBlbiBpZiB0aGUgb3BlcmFuZHMgYXJlIGFsc28gYm91bmRlZCwgYXMgd2UKKy0tIGNhbm5vdCByZXByZXNlbnQgMUUtMzk5LCBmb3IgZXhhbXBsZV0KKworZm1heDM2NTcxIGZtYSAgMSAgICAgICAgIDFFLTM4MyAgICAgICAwICAtPiAxRS0zODMKK2ZtYXgzNjU3MiBmbWEgIDEgICAgICAgICAxRS0zODQgICAgICAgMCAgLT4gMUUtMzg0ICAgU3Vibm9ybWFsCitmbWF4MzY1NzMgZm1hICAxICAgICAgICAgMUUtMzgzICAxRS0zODQgIC0+IDEuMUUtMzgzCitmbWF4MzY1NzQgc3VidHJhY3QgIDFFLTM4MyAgMUUtMzg0ICAtPiAgIDlFLTM4NCBTdWJub3JtYWwKKworLS0gSGVyZSB3ZSBleHBsb3JlIHRoZSBib3VuZGFyeSBvZiByb3VuZGluZyBhIHN1Ym5vcm1hbCB0byBObWluCitmbWF4MzY1NzUgc3VidHJhY3QgIDFFLTM4MyAgMUUtMzk4ICAtPiAgIDkuOTk5OTk5OTk5OTk5OTlFLTM4NCAgU3Vibm9ybWFsCitmbWF4MzY1NzYgc3VidHJhY3QgIDFFLTM4MyAgMUUtMzk4ICAtPiAgIDkuOTk5OTk5OTk5OTk5OTlFLTM4NCAgU3Vibm9ybWFsCitmbWF4MzY1Nzcgc3VidHJhY3QgIDFFLTM4MyAgMUUtMzk5ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2ZtYXgzNjU3OCBzdWJ0cmFjdCAgMUUtMzgzICAxRS00MDAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZm1heDM2NTc5IHN1YnRyYWN0ICAxRS0zODMgIDFFLTQwMSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitmbWF4MzY1ODAgc3VidHJhY3QgIDFFLTM4MyAgMUUtNDAyICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKKworLS0gY2hlY2sgb3ZlcmZsb3cgZWRnZSBjYXNlCistLSAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2ZtYXgzNjk3MiBhcHBseSAgICAgICAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2ZtYXgzNjk3MyBmbWEgIDEgICAgICAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgMSAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY5NzQgZm1hICAxICAgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDEgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTc1IGZtYSAgMSAgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAxRSszNjkgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTc2IGZtYSAgMSAgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA5RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTc3IGZtYSAgMSAgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA4RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTc4IGZtYSAgMSAgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA3RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTc5IGZtYSAgMSAgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA2RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTgwIGZtYSAgMSAgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA1RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTgxIGZtYSAgMSAgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA0RSszNjggIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY5ODIgZm1hICAxICAgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDNFKzM2OCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk4MyBmbWEgIDEgICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgMkUrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTg0IGZtYSAgMSAgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAxRSszNjggIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNjk4NSBhcHBseSAgICAgICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitmbWF4MzY5ODYgZm1hICAxICAgICAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLTEgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk4NyBmbWEgIDEgICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMSAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTg4IGZtYSAgMSAgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0xRSszNjkgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk4OSBmbWEgIDEgICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtOUUrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY5OTAgZm1hICAxICAgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLThFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTkxIGZtYSAgMSAgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC03RSszNjggIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk5MiBmbWEgIDEgICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtNkUrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY5OTMgZm1hICAxICAgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTVFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTk0IGZtYSAgMSAgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC00RSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTk1IGZtYSAgMSAgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0zRSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTk2IGZtYSAgMSAgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0yRSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTk3IGZtYSAgMSAgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0xRSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorCistLSBBbmQgZm9yIHJvdW5kIGRvd24gZnVsbCBhbmQgc3Vibm9ybWFsIHJlc3VsdHMKK3JvdW5kaW5nOiAgICAgZG93bgorZm1heDM2MTEwMCBmbWEgIDEgICAxZSsyIC0xZS0zODMgICAgLT4gOTkuOTk5OTk5OTk5OTk5OTkgUm91bmRlZCBJbmV4YWN0CitmbWF4MzYxMTAxIGZtYSAgMSAgIDFlKzEgLTFlLTM4MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzYxMTAzIGZtYSAgMSAgICAgKzEgLTFlLTM4MyAgICAtPiAwLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTEwNCBmbWEgIDEgICAxZS0xIC0xZS0zODMgICAgLT4gMC4wOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzYxMTA1IGZtYSAgMSAgIDFlLTIgLTFlLTM4MyAgICAtPiAwLjAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzYxMTA2IGZtYSAgMSAgIDFlLTMgLTFlLTM4MyAgICAtPiAwLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTEwNyBmbWEgIDEgICAxZS00IC0xZS0zODMgICAgLT4gMC4wMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzYxMTA4IGZtYSAgMSAgIDFlLTUgLTFlLTM4MyAgICAtPiAwLjAwMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzYxMTA5IGZtYSAgMSAgIDFlLTYgLTFlLTM4MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICAgY2VpbGluZworZm1heDM2MTExMCBmbWEgIDEgICAtMWUrMiArMWUtMzgzICAgLT4gLTk5Ljk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTExMSBmbWEgIDEgICAtMWUrMSArMWUtMzgzICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzNjExMTMgZm1hICAxICAgICAgLTEgKzFlLTM4MyAgIC0+IC0wLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTExNCBmbWEgIDEgICAtMWUtMSArMWUtMzgzICAgLT4gLTAuMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTExNSBmbWEgIDEgICAtMWUtMiArMWUtMzgzICAgLT4gLTAuMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzNjExMTYgZm1hICAxICAgLTFlLTMgKzFlLTM4MyAgIC0+IC0wLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTExNyBmbWEgIDEgICAtMWUtNCArMWUtMzgzICAgLT4gLTAuMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTExOCBmbWEgIDEgICAtMWUtNSArMWUtMzgzICAgLT4gLTAuMDAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzNjExMTkgZm1hICAxICAgLTFlLTYgKzFlLTM4MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKKy0tIHRlc3RzIGJhc2VkIG9uIEd1bm5hciBEZWduYm9sJ3MgZWRnZSBjYXNlCityb3VuZGluZzogICAgIGhhbGZfZXZlbgorCitmbWF4MzYxMzAwIGZtYSAgMSAgIDFFMTYgIC0wLjUgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzEwIGZtYSAgMSAgIDFFMTYgIC0wLjUxICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzExIGZtYSAgMSAgIDFFMTYgIC0wLjUwMSAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzEyIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDEgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzEzIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAxICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzE0IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMSAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzE1IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDEgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzE2IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAxICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzE3IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMSAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzE4IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDEgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzE5IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAxICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzIwIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMSAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzIxIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDEgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzIyIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAxICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzIzIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzI0IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzI1IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMDAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzI2IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMCAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzI3IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzI4IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzI5IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzMwIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzMxIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzMyIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMCAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzMzIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzM0IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzM1IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMCAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzM2IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzM3IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzM4IGZtYSAgMSAgIDFFMTYgIC0wLjUwMCAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzM5IGZtYSAgMSAgIDFFMTYgIC0wLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNjEzNDAgZm1hICAxICAgMUUxNiAgLTUwMDAwMDAuMDAwMDEwMDAxICAgLT4gIDk5OTk5OTk5OTUwMDAwMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNDEgZm1hICAxICAgMUUxNiAgLTUwMDAwMDAuMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTUwMDAwMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworZm1heDM2MTM0OSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNCAgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNTAgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5ICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzUxIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTkgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM1MiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNTMgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5ICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzU0IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTkgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM1NSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNTYgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5ICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzU3IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTkgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM1OCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNTkgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5ICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzYwIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTkgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM2MSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNjIgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTk5ICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzYzIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OTkgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM2NCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5OSAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNjUgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMDAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzY3IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM2OCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNjkgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzcwIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM3MSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNzIgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzczIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM3NCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNzUgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzc2IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM3NyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNzggZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzc5IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM4MCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzODEgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzgyIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM4MyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzODQgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAxICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzg1IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAxICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM4NiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzODcgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAxICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzg4IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAxICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM4OSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAxICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzOTAgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAxICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzkxIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAxICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM5MiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAxICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzOTMgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAxICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzk0IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAxICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM5NSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAxICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzOTYgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUxICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCisKKy0tIE1vcmUgR0QgZWRnZSBjYXNlcywgd2hlcmUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB1bmFkanVzdGVkCistLSBleHBvbmVudHMgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gcHJlY2lzaW9uIGFuZCBvbmUgc2lkZSBpcyAwCitmbWF4MzYxNDIwIGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1ICAgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQyMSBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMSAgLT4gMC4xMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDIyIGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0yICAtPiAwLjAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDIzIGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0zICAtPiAwLjAwMTEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQyNCBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNCAgLT4gMC4wMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDI1IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS01ICAtPiAwLjAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDI2IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS02ICAtPiAwLjAwMDAwMTEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQyNyBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNyAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTcKK2ZtYXgzNjE0MjggZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTggIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS04CitmbWF4MzYxNDI5IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS05ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOQorZm1heDM2MTQzMCBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEwCitmbWF4MzYxNDMxIGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMSAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEKK2ZtYXgzNjE0MzIgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEyIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMgorZm1heDM2MTQzMyBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTMgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEzCitmbWF4MzYxNDM0IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQKK2ZtYXgzNjE0MzUgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE1IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNQorZm1heDM2MTQzNiBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTYgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE2CitmbWF4MzYxNDM3IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNyAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcKK2ZtYXgzNjE0MzggZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE4IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOAorZm1heDM2MTQzOSBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTkgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE5CisKKy0tIHNhbWUsIHJldmVyc2VkIDAKK2ZtYXgzNjE0NDAgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgICAgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NDEgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTEgIDAgLT4gMC4xMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDQyIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0yICAwIC0+IDAuMDExMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NDMgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTMgIDAgLT4gMC4wMDExMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NDQgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTQgIDAgLT4gMC4wMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDQ1IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS01ICAwIC0+IDAuMDAwMDExMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NDYgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTYgIDAgLT4gMC4wMDAwMDExMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NDcgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTcgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTcKK2ZtYXgzNjE0NDggZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTggIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTgKK2ZtYXgzNjE0NDkgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTkgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTkKK2ZtYXgzNjE0NTAgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTEwIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEwCitmbWF4MzYxNDUxIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMSAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMQorZm1heDM2MTQ1MiBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIKK2ZtYXgzNjE0NTMgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTEzIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEzCitmbWF4MzYxNDU0IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNCAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNAorZm1heDM2MTQ1NSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUKK2ZtYXgzNjE0NTYgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTE2IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE2CitmbWF4MzYxNDU3IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNyAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNworZm1heDM2MTQ1OCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTggMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTgKK2ZtYXgzNjE0NTkgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTE5IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE5CisKKy0tIHNhbWUsIEVzIG9uIHRoZSAwCitmbWF4MzYxNDYwIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0wICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NjEgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQ2MiBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMiAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDYzIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0zICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NjQgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTQgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQ2NSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDY2IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS02ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NjcgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTcgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQ2OCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtOCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDY5IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS05ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NzAgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEwICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQ3MSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTEgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDcyIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMiAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NzMgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEzICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQ3NCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTQgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDc1IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKKy0tIG5leHQgZm91ciBmbGFnIFJvdW5kZWQgYmVjYXVzZSB0aGUgMCBleHRlbmRzIHRoZSByZXN1bHQKK2ZtYXgzNjE0NzYgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE2ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitmbWF4MzYxNDc3IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNyAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZm1heDM2MTQ3OCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTggIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKK2ZtYXgzNjE0NzkgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE5ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCisKKy0tIHN1bSBvZiB0d28gb3Bwb3NpdGUtc2lnbiBvcGVyYW5kcyBpcyBleGFjdGx5IDAgYW5kIGZsb29yID0+IC0wCityb3VuZGluZzogICAgaGFsZl91cAorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZm1heDM2MTUwMCBmbWEgIDEgICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTUwMSBmbWEgIDEgICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTUwMiBmbWEgIDEgICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTUwMyBmbWEgIDEgICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorZm1heDM2MTUwNCBmbWEgIDEgICAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTUwNSBmbWEgIDEgICAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTUwNiBmbWEgIDEgICAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTUwNyBmbWEgIDEgICAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworZm1heDM2MTUxMSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTUxMiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTUxMyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTUxNCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZm1heDM2MTUxNSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTUxNiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTUxNyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTUxOCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCityb3VuZGluZzogICAgaGFsZl9kb3duCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitmbWF4MzYxNTIwIGZtYSAgMSAgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNTIxIGZtYSAgMSAgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNTIyIGZtYSAgMSAgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNTIzIGZtYSAgMSAgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CitmbWF4MzYxNTI0IGZtYSAgMSAgICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTI1IGZtYSAgMSAgIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTI2IGZtYSAgMSAgICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTI3IGZtYSAgMSAgIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCitmbWF4MzYxNTMxIGZtYSAgMSAgICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNTMyIGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNTMzIGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNTM0IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitmbWF4MzYxNTM1IGZtYSAgMSAgICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNTM2IGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTM3IGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTM4IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2ZtYXgzNjE1NDAgZm1hICAxICAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzNjE1NDEgZm1hICAxICAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzNjE1NDIgZm1hICAxICAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzNjE1NDMgZm1hICAxICAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2ZtYXgzNjE1NDQgZm1hICAxICAgIDBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzNjE1NDUgZm1hICAxICAgLTBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzNjE1NDYgZm1hICAxICAgIDBFLTQwMCAgLTBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzNjE1NDcgZm1hICAxICAgLTBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQKKy0tIGluZXhhY3QgemVyb3MKK2ZtYXgzNjE1NTEgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzNjE1NTIgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzNjE1NTMgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzNjE1NTQgZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2ZtYXgzNjE1NTUgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzNjE1NTYgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzNjE1NTcgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzNjE1NTggZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworcm91bmRpbmc6ICAgIHVwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitmbWF4MzYxNTYwIGZtYSAgMSAgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNTYxIGZtYSAgMSAgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNTYyIGZtYSAgMSAgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNTYzIGZtYSAgMSAgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CitmbWF4MzYxNTY0IGZtYSAgMSAgICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTY1IGZtYSAgMSAgIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTY2IGZtYSAgMSAgICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTY3IGZtYSAgMSAgIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCitmbWF4MzYxNTcxIGZtYSAgMSAgICAxRS00MDEgICAxRS00MDAgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDM2MTU3MiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAwIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzNjE1NzMgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitmbWF4MzYxNTc0IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZm1heDM2MTU3NSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAxIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzNjE1NzYgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzNjE1NzcgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzNjE1NzggZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CisKK3JvdW5kaW5nOiAgICBkb3duCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitmbWF4MzYxNTgwIGZtYSAgMSAgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNTgxIGZtYSAgMSAgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNTgyIGZtYSAgMSAgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNTgzIGZtYSAgMSAgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CitmbWF4MzYxNTg0IGZtYSAgMSAgICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTg1IGZtYSAgMSAgIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTg2IGZtYSAgMSAgICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTg3IGZtYSAgMSAgIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCitmbWF4MzYxNTkxIGZtYSAgMSAgICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNTkyIGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNTkzIGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNTk0IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitmbWF4MzYxNTk1IGZtYSAgMSAgICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNTk2IGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTk3IGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTk4IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICBjZWlsaW5nCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitmbWF4MzYxNjAwIGZtYSAgMSAgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNjAxIGZtYSAgMSAgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNjAyIGZtYSAgMSAgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNjAzIGZtYSAgMSAgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CitmbWF4MzYxNjA0IGZtYSAgMSAgICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNjA1IGZtYSAgMSAgIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNjA2IGZtYSAgMSAgICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNjA3IGZtYSAgMSAgIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCitmbWF4MzYxNjExIGZtYSAgMSAgICAxRS00MDEgICAxRS00MDAgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDM2MTYxMiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAwIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzNjE2MTMgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzNjE2MTQgZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2ZtYXgzNjE2MTUgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitmbWF4MzYxNjE2IGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNjE3IGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNjE4IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKKy0tIGFuZCB0aGUgZXh0cmEtc3BlY2lhbCB1Z2x5IGNhc2U7IHVudXN1YWwgbWludXNlcyBtYXJrZWQgYnkgLS0gKgorcm91bmRpbmc6ICAgIGZsb29yCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitmbWF4MzYxNjIwIGZtYSAgMSAgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNjIxIGZtYSAgMSAgIC0wICAgICAgICAwRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCitmbWF4MzYxNjIyIGZtYSAgMSAgICAwICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCitmbWF4MzYxNjIzIGZtYSAgMSAgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CitmbWF4MzYxNjI0IGZtYSAgMSAgICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNjI1IGZtYSAgMSAgIC0wRS00MDAgICAwRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkICAtLSAqCitmbWF4MzYxNjI2IGZtYSAgMSAgICAwRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkICAtLSAqCitmbWF4MzYxNjI3IGZtYSAgMSAgIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCitmbWF4MzYxNjMxIGZtYSAgMSAgICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNjMyIGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNjMzIGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDM2MTYzNCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAwIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2ZtYXgzNjE2MzUgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzNjE2MzYgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMSAtPiAtMEUtMzk4IENsYW1wZWQgIC0tICoKK2ZtYXgzNjE2MzcgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IENsYW1wZWQgIC0tICoKK2ZtYXgzNjE2MzggZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CisKKy0tIEV4YW1wbGVzIGZyb20gU1FMIHByb3Bvc2FsIChLcmlzaG5hIEt1bGthcm5pKQorZm1heDM2MTcwMSBmbWEgIDEgICAxMzBFLTIgICAgMTIwRS0yICAgIC0+IDIuNTAKK2ZtYXgzNjE3MDIgZm1hICAxICAgMTMwRS0yICAgIDEyRS0xICAgICAtPiAyLjUwCitmbWF4MzYxNzAzIGZtYSAgMSAgIDEzMEUtMiAgICAxRTAgICAgICAgLT4gMi4zMAorZm1heDM2MTcwNCBmbWEgIDEgICAxRTIgICAgICAgMUU0ICAgICAgIC0+IDEuMDFFKzQKK2ZtYXgzNjE3MDUgc3VidHJhY3QgMTMwRS0yICAxMjBFLTIgLT4gMC4xMAorZm1heDM2MTcwNiBzdWJ0cmFjdCAxMzBFLTIgIDEyRS0xICAtPiAwLjEwCitmbWF4MzYxNzA3IHN1YnRyYWN0IDEzMEUtMiAgMUUwICAgIC0+IDAuMzAKK2ZtYXgzNjE3MDggc3VidHJhY3QgMUUyICAgICAxRTQgICAgLT4gLTkuOUUrMworCistLSBHYXBweSBjb2VmZmljaWVudHM7IGNoZWNrIHJlc2lkdWUgaGFuZGxpbmcgZXZlbiB3aXRoIGZ1bGwgY29lZmZpY2llbnQgZ2FwCityb3VuZGluZzogaGFsZl9ldmVuCisKK2ZtYXgzNjIwMDEgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiAxICAgICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NworZm1heDM2MjAwMiBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDAuNiAgICAtPiAxMjM0NTY3ODkwMTIzNDU3ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMDMgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiAwLjA2ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDA0IGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMyAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAwNSBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDZFLTQgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMDYgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS01ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDA3IGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtNiAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAwOCBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDZFLTcgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMDkgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS04ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDEwIGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtOSAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAxMSBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDZFLTEwICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMTIgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xMSAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDEzIGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTIgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAxNCBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDZFLTEzICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMTUgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xNCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDE2IGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTUgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAxNyBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDZFLTE2ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMTggZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xNyAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDE5IGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTggIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAyMCBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDZFLTE5ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMjEgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0yMCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHdpZGVuaW5nIHNlY29uZCBhcmd1bWVudCBhdCBnYXAKK2ZtYXgzNjIwMzAgZm1hICAxICAgMTIzNDU2NzggMSAgICAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzkKK2ZtYXgzNjIwMzEgZm1hICAxICAgMTIzNDU2NzggMC4xICAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMQorZm1heDM2MjAzMiBmbWEgIDEgICAxMjM0NTY3OCAwLjEyICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMgorZm1heDM2MjAzMyBmbWEgIDEgICAxMjM0NTY3OCAwLjEyMyAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjMKK2ZtYXgzNjIwMzQgZm1hICAxICAgMTIzNDU2NzggMC4xMjM0ICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNAorZm1heDM2MjAzNSBmbWEgIDEgICAxMjM0NTY3OCAwLjEyMzQ1ICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NQorZm1heDM2MjAzNiBmbWEgIDEgICAxMjM0NTY3OCAwLjEyMzQ1NiAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTYKK2ZtYXgzNjIwMzcgZm1hICAxICAgMTIzNDU2NzggMC4xMjM0NTY3ICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NworZm1heDM2MjAzOCBmbWEgIDEgICAxMjM0NTY3OCAwLjEyMzQ1Njc4ICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OAorZm1heDM2MjAzOSBmbWEgIDEgICAxMjM0NTY3OCAwLjEyMzQ1Njc4OSAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNDAgZm1hICAxICAgMTIzNDU2NzggMC4xMjM0NTY3ODUgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzggSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDQxIGZtYSAgMSAgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MCAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA0MiBmbWEgIDEgICAxMjM0NTY3OCAwLjEyMzQ1Njc4NTEgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNDMgZm1hICAxICAgMTIzNDU2NzggMC4xMjM0NTY3ODUwMSAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDQ0IGZtYSAgMSAgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAxICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA0NSBmbWEgIDEgICAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDEgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNDYgZm1hICAxICAgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAwMSAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDQ3IGZtYSAgMSAgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDAxICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA0OCBmbWEgIDEgICAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNDkgZm1hICAxICAgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzggSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDEyMzQ1Ngorcm91bmRpbmc6IGhhbGZfZXZlbgorZm1heDM2MjA1MCBmbWEgIDEgICAxMjM0NTY3OCAwLjAyMzQ1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNTEgZm1hICAxICAgMTIzNDU2NzggMC4wMDM0NTY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAzNDU2NzggSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDUyIGZtYSAgMSAgIDEyMzQ1Njc4IDAuMDAwNDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDQ1Njc4IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA1MyBmbWEgIDEgICAxMjM0NTY3OCAwLjAwMDA1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwNTY3OCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNTQgZm1hICAxICAgMTIzNDU2NzggMC4wMDAwMDY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDA2NzggSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDU1IGZtYSAgMSAgIDEyMzQ1Njc4IDAuMDAwMDAwNzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDc4IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA1NiBmbWEgIDEgICAxMjM0NTY3OCAwLjAwMDAwMDA3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNTcgZm1hICAxICAgMTIzNDU2NzggMC4wMDAwMDAwMDUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDYwIGZtYSAgMSAgIDEyMzQ1Njc4IDAuMDIzNDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA2MSBmbWEgIDEgICAxMjM0NTY3OCAwLjAwMzQ1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNjIgZm1hICAxICAgMTIzNDU2NzggMC4wMDA0NTY3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwNDU2NzggSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDYzIGZtYSAgMSAgIDEyMzQ1Njc4IDAuMDAwMDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDA1Njc4IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA2NCBmbWEgIDEgICAxMjM0NTY3OCAwLjAwMDAwNjc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwMDY3OCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNjUgZm1hICAxICAgMTIzNDU2NzggMC4wMDAwMDA3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwMDAwNzggSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDY2IGZtYSAgMSAgIDEyMzQ1Njc4IDAuMDAwMDAwMDc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA2NyBmbWEgIDEgICAxMjM0NTY3OCAwLjAwMDAwMDAwNTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKKy0tIGZhci1vdXQgcmVzaWR1ZXMgKGZ1bGwgY29lZmZpY2llbnQgZ2FwIGlzIDE2KzE1IGRpZ2l0cykKK3JvdW5kaW5nOiB1cAorZm1heDM2MjA3MCBmbWEgIDEgICAxMjM0NTY3OCAxRS04ICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMQorZm1heDM2MjA3MSBmbWEgIDEgICAxMjM0NTY3OCAxRS05ICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNzIgZm1hICAxICAgMTIzNDU2NzggMUUtMTAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDczIGZtYSAgMSAgIDEyMzQ1Njc4IDFFLTExICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA3NCBmbWEgIDEgICAxMjM0NTY3OCAxRS0xMiAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNzUgZm1hICAxICAgMTIzNDU2NzggMUUtMTMgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDc2IGZtYSAgMSAgIDEyMzQ1Njc4IDFFLTE0ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA3NyBmbWEgIDEgICAxMjM0NTY3OCAxRS0xNSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNzggZm1hICAxICAgMTIzNDU2NzggMUUtMTYgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDc5IGZtYSAgMSAgIDEyMzQ1Njc4IDFFLTE3ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA4MCBmbWEgIDEgICAxMjM0NTY3OCAxRS0xOCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwODEgZm1hICAxICAgMTIzNDU2NzggMUUtMTkgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDgyIGZtYSAgMSAgIDEyMzQ1Njc4IDFFLTIwICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA4MyBmbWEgIDEgICAxMjM0NTY3OCAxRS0yNSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwODQgZm1hICAxICAgMTIzNDU2NzggMUUtMzAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDg1IGZtYSAgMSAgIDEyMzQ1Njc4IDFFLTMxICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA4NiBmbWEgIDEgICAxMjM0NTY3OCAxRS0zMiAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwODcgZm1hICAxICAgMTIzNDU2NzggMUUtMzMgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDg4IGZtYSAgMSAgIDEyMzQ1Njc4IDFFLTM0ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA4OSBmbWEgIDEgICAxMjM0NTY3OCAxRS0zNSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKKworLS0gcGF5bG9hZCBkZWNhcGl0YXRlIHgzCitwcmVjaXNpb246IDUKK2ZtYXgzNjMwMDAgZm1hICAxIDEgIHNOYU4xMjM0NTY3ODkwICAgICAtPiAgTmFONjc4OTAgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzYzMDAxIGZtYSAgICAxIC1zTmFOMTIzNDUxMjM0NSAxICAgLT4gLU5hTjEyMzQ1ICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2MzAwMiBmbWEgICAgICAgc05hTjEyMzQ1NTQzMjEgMSAxIC0+ICBOYU41NDMyMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0cworZm1heDM5OTkwIGZtYSAgMSAgIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM5OTkxIGZtYSAgMSAgICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9pbmV4YWN0LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2luZXhhY3QuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWNlYWU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9pbmV4YWN0LmRlY1Rlc3QKQEAgLTAsMCArMSwyMTUgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gaW5leGFjdC5kZWNUZXN0IC0tIGRlY2ltYWwgaW5leGFjdCBhbmQgcm91bmRlZCBlZGdlIGNhc2VzICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorCitpbngwMDEgYWRkIDEgICAgICAgICAgMSAgICAgICAgICAgICAgLT4gMgoraW54MDAyIGFkZCAxMjM0NTY3ODkgIDAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4OQoraW54MDAzIGFkZCAxMjM0NTY3ODkgIDAuMCAgICAgICAgICAgIC0+IDEyMzQ1Njc4OSBSb3VuZGVkCitpbngwMDQgYWRkIDEyMzQ1Njc4OSAgMC4wMCAgICAgICAgICAgLT4gMTIzNDU2Nzg5IFJvdW5kZWQKK2lueDAwNSBhZGQgMTIzNDU2Nzg5ICAxICAgICAgICAgICAgICAtPiAxMjM0NTY3OTAKK2lueDAwNiBhZGQgMTIzNDU2Nzg5ICAwLjEgICAgICAgICAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMDcgYWRkIDEyMzQ1Njc4OSAgMC4wMSAgICAgICAgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDA4IGFkZCAxMjM0NTY3ODkgIDAuMDAxICAgICAgICAgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDAwOSBhZGQgMTIzNDU2Nzg5ICAwLjAwMDAwMSAgICAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMTAgYWRkIDEyMzQ1Njc4OSAgMC4wMDAwMDAwMDEgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDExIGFkZCAxMjM0NTY3ODkgIDAuMDAwMDAwMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKKworaW54MDEyIGFkZCAxMjM0NTY3ODkgIDAuOSAgICAgICAgICAgIC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK2lueDAxMyBhZGQgMTIzNDU2Nzg5ICAwLjA5ICAgICAgICAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMTQgYWRkIDEyMzQ1Njc4OSAgMC4wMDkgICAgICAgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDE1IGFkZCAxMjM0NTY3ODkgIDAuMDAwMDA5ICAgICAgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDAxNiBhZGQgMTIzNDU2Nzg5ICAwLjAwMDAwMDAwOSAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMTcgYWRkIDEyMzQ1Njc4OSAgMC4wMDAwMDAwMDAwMDkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorCitpbngwMjEgYWRkIDEgICAgICAgICAgLTEgICAgICAgICAgICAgIC0+IDAKK2lueDAyMiBhZGQgMTIzNDU2Nzg5ICAtMCAgICAgICAgICAgICAgLT4gMTIzNDU2Nzg5CitpbngwMjMgYWRkIDEyMzQ1Njc4OSAgLTAuMCAgICAgICAgICAgIC0+IDEyMzQ1Njc4OSBSb3VuZGVkCitpbngwMjQgYWRkIDEyMzQ1Njc4OSAgLTAuMDAgICAgICAgICAgIC0+IDEyMzQ1Njc4OSBSb3VuZGVkCitpbngwMjUgYWRkIDEyMzQ1Njc4OSAgLTEgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4OAoraW54MDI2IGFkZCAxMjM0NTY3ODkgIC0wLjEgICAgICAgICAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMjcgYWRkIDEyMzQ1Njc4OSAgLTAuMDEgICAgICAgICAgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDAyOCBhZGQgMTIzNDU2Nzg5ICAtMC4wMDEgICAgICAgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDI5IGFkZCAxMjM0NTY3ODkgIC0wLjAwMDAwMSAgICAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMzAgYWRkIDEyMzQ1Njc4OSAgLTAuMDAwMDAwMDAxICAgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDAzMSBhZGQgMTIzNDU2Nzg5ICAtMC4wMDAwMDAwMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDMyIGFkZCAxMjM0NTY3ODkgIC0wLjkgICAgICAgICAgICAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCitpbngwMzMgYWRkIDEyMzQ1Njc4OSAgLTAuMDkgICAgICAgICAgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDAzNCBhZGQgMTIzNDU2Nzg5ICAtMC4wMDkgICAgICAgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDM1IGFkZCAxMjM0NTY3ODkgIC0wLjAwMDAwOSAgICAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMzYgYWRkIDEyMzQ1Njc4OSAgLTAuMDAwMDAwMDA5ICAgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDAzNyBhZGQgMTIzNDU2Nzg5ICAtMC4wMDAwMDAwMDAwMDkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorCitpbngwNDIgYWRkICAwICAgICAgICAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OQoraW54MDQzIGFkZCAgMC4wICAgICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgUm91bmRlZAoraW54MDQ0IGFkZCAgMC4wMCAgICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgUm91bmRlZAoraW54MDQ1IGFkZCAgMSAgICAgICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3OTAKK2lueDA0NiBhZGQgIDAuMSAgICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDQ3IGFkZCAgMC4wMSAgICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNDggYWRkICAwLjAwMSAgICAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA0OSBhZGQgIDAuMDAwMDAxICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDUwIGFkZCAgMC4wMDAwMDAwMDEgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNTEgYWRkICAwLjAwMDAwMDAwMDAwMSAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA1MiBhZGQgIDAuOSAgICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAoraW54MDUzIGFkZCAgMC4wOSAgICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNTQgYWRkICAwLjAwOSAgICAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA1NSBhZGQgIDAuMDAwMDA5ICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDU2IGFkZCAgMC4wMDAwMDAwMDkgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNTcgYWRkICAwLjAwMDAwMDAwMDAwOSAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKKworaW54MDYyIGFkZCAgLTAgICAgICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkKK2lueDA2MyBhZGQgIC0wLjAgICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IFJvdW5kZWQKK2lueDA2NCBhZGQgIC0wLjAwICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IFJvdW5kZWQKK2lueDA2NSBhZGQgIC0xICAgICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg4CitpbngwNjYgYWRkICAtMC4xICAgICAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA2NyBhZGQgIC0wLjAxICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDY4IGFkZCAgLTAuMDAxICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNjkgYWRkICAtMC4wMDAwMDEgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA3MCBhZGQgIC0wLjAwMDAwMDAwMSAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDcxIGFkZCAgLTAuMDAwMDAwMDAwMDAxIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNzIgYWRkICAtMC45ICAgICAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKK2lueDA3MyBhZGQgIC0wLjA5ICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDc0IGFkZCAgLTAuMDA5ICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNzUgYWRkICAtMC4wMDAwMDkgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA3NiBhZGQgIC0wLjAwMDAwMDAwOSAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDc3IGFkZCAgLTAuMDAwMDAwMDAwMDA5IDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNvbWUgYm91bmRhcmllcworaW54MDgxIGFkZCAgICA5OTk5OTk5OTkgICAgICAgICAgIDAgICAgIC0+IDk5OTk5OTk5OQoraW54MDgyIGFkZCAgMC45OTk5OTk5OTkgMC4wMDAwMDAwMDAgICAgIC0+IDAuOTk5OTk5OTk5CitpbngwODMgYWRkICAgIDk5OTk5OTk5OSAgICAgICAgICAgMSAgICAgLT4gMS4wMDAwMDAwMEUrOSBSb3VuZGVkCitpbngwODQgYWRkICAwLjk5OTk5OTk5OSAwLjAwMDAwMDAwMSAgICAgLT4gMS4wMDAwMDAwMCAgICBSb3VuZGVkCitpbngwODUgYWRkICAgIDk5OTk5OTk5OSAgICAgICAgICAgMiAgICAgLT4gMS4wMDAwMDAwMEUrOSBJbmV4YWN0IFJvdW5kZWQKK2lueDA4NiBhZGQgIDAuOTk5OTk5OTk5IDAuMDAwMDAwMDAyICAgICAtPiAxLjAwMDAwMDAwICAgIEluZXhhY3QgUm91bmRlZAoraW54MDg3IGFkZCAgICA5OTk5OTk5OTkgICAgICAgICAgIDMgICAgIC0+IDEuMDAwMDAwMDBFKzkgSW5leGFjdCBSb3VuZGVkCitpbngwODkgYWRkICAwLjk5OTk5OTk5OSAwLjAwMDAwMDAwMyAgICAgLT4gMS4wMDAwMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gbWludXMsIHBsdXMsIGFuZCBzdWJ0cmFjdCBhbGwgYXNzdW1lZCB0byB3b3JrIGxpa2UgYWRkLgorCistLSBtdWx0aXBseQorcHJlY2lzaW9uOiA4CitpbngxMDEgbXVsdGlwbHkgIDEwMDAgIDEwMDAgICAgICAgIC0+ICAxMDAwMDAwCitpbngxMDIgbXVsdGlwbHkgIDkwMDAgIDkwMDAgICAgICAgIC0+IDgxMDAwMDAwCitpbngxMDMgbXVsdGlwbHkgIDk5OTkgIDk5OTkgICAgICAgIC0+IDk5OTgwMDAxCitpbngxMDQgbXVsdGlwbHkgIDEwMDAgMTAwMDAgICAgICAgIC0+IDEwMDAwMDAwCitpbngxMDUgbXVsdGlwbHkgMTAwMDAgMTAwMDAgICAgICAgIC0+IDEuMDAwMDAwMEUrOCBSb3VuZGVkCitpbngxMDYgbXVsdGlwbHkgMTAwMDEgMTAwMDAgICAgICAgIC0+IDEuMDAwMTAwMEUrOCBSb3VuZGVkCitpbngxMDcgbXVsdGlwbHkgMTAwMDEgMTAwMDEgICAgICAgIC0+IDEuMDAwMjAwMEUrOCBJbmV4YWN0IFJvdW5kZWQKK2lueDEwOCBtdWx0aXBseSAxMDEwMSAxMDAwMSAgICAgICAgLT4gMS4wMTAyMDEwRSs4IEluZXhhY3QgUm91bmRlZAoraW54MTA5IG11bHRpcGx5IDEwMDAxIDEwMTAxICAgICAgICAtPiAxLjAxMDIwMTBFKzggSW5leGFjdCBSb3VuZGVkCisKKy0tIGRpdmlkZQorcHJlY2lzaW9uOiA0CitpbngyMDEgZGl2aWRlICAxMDAwICAxMDAwICAgICAgICAtPiAgMQoraW54MjAyIGRpdmlkZSAgMTAwMCAgICAgMSAgICAgICAgLT4gIDEwMDAKK2lueDIwMyBkaXZpZGUgIDEwMDAgICAgIDIgICAgICAgIC0+ICAgNTAwCitpbngyMDQgZGl2aWRlICAxMDAwICAgICAzICAgICAgICAtPiAgIDMzMy4zICBJbmV4YWN0IFJvdW5kZWQKK2lueDIwNSBkaXZpZGUgIDEwMDAgICAgIDQgICAgICAgIC0+ICAgMjUwCitpbngyMDYgZGl2aWRlICAxMDAwICAgICA1ICAgICAgICAtPiAgIDIwMAoraW54MjA3IGRpdmlkZSAgMTAwMCAgICAgNiAgICAgICAgLT4gICAxNjYuNyAgSW5leGFjdCBSb3VuZGVkCitpbngyMDggZGl2aWRlICAxMDAwICAgICA3ICAgICAgICAtPiAgIDE0Mi45ICBJbmV4YWN0IFJvdW5kZWQKK2lueDIwOSBkaXZpZGUgIDEwMDAgICAgIDggICAgICAgIC0+ICAgMTI1CitpbngyMTAgZGl2aWRlICAxMDAwICAgICA5ICAgICAgICAtPiAgIDExMS4xICBJbmV4YWN0IFJvdW5kZWQKK2lueDIxMSBkaXZpZGUgIDEwMDAgICAgMTAgICAgICAgIC0+ICAgMTAwCisKK2lueDIyMCBkaXZpZGUgICAgIDEgICAgIDEgICAgICAgIC0+ICAgMQoraW54MjIxIGRpdmlkZSAgICAgMSAgICAgMiAgICAgICAgLT4gICAwLjUKK2lueDIyMiBkaXZpZGUgICAgIDEgICAgIDQgICAgICAgIC0+ICAgMC4yNQoraW54MjIzIGRpdmlkZSAgICAgMSAgICAgOCAgICAgICAgLT4gICAwLjEyNQoraW54MjI0IGRpdmlkZSAgICAgMSAgICAxNiAgICAgICAgLT4gICAwLjA2MjUKK2lueDIyNSBkaXZpZGUgICAgIDEgICAgMzIgICAgICAgIC0+ICAgMC4wMzEyNQoraW54MjI2IGRpdmlkZSAgICAgMSAgICA2NCAgICAgICAgLT4gICAwLjAxNTYzICBJbmV4YWN0IFJvdW5kZWQKK2lueDIyNyBkaXZpZGUgICAgIDEgICAxMjggICAgICAgIC0+ICAgMC4wMDc4MTMgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogNQoraW54MjMwIGRpdmlkZSAgICAgMSAgICAgMSAgICAgICAgLT4gICAxCitpbngyMzEgZGl2aWRlICAgICAxICAgICAyICAgICAgICAtPiAgIDAuNQoraW54MjMyIGRpdmlkZSAgICAgMSAgICAgNCAgICAgICAgLT4gICAwLjI1CitpbngyMzMgZGl2aWRlICAgICAxICAgICA4ICAgICAgICAtPiAgIDAuMTI1CitpbngyMzQgZGl2aWRlICAgICAxICAgIDE2ICAgICAgICAtPiAgIDAuMDYyNQoraW54MjM1IGRpdmlkZSAgICAgMSAgICAzMiAgICAgICAgLT4gICAwLjAzMTI1CitpbngyMzYgZGl2aWRlICAgICAxICAgIDY0ICAgICAgICAtPiAgIDAuMDE1NjI1CitpbngyMzcgZGl2aWRlICAgICAxICAgMTI4ICAgICAgICAtPiAgIDAuMDA3ODEyNQorCitwcmVjaXNpb246IDMKK2lueDI0MCBkaXZpZGUgICAgIDEgICAgIDEgICAgICAgIC0+ICAgMQoraW54MjQxIGRpdmlkZSAgICAgMSAgICAgMiAgICAgICAgLT4gICAwLjUKK2lueDI0MiBkaXZpZGUgICAgIDEgICAgIDQgICAgICAgIC0+ICAgMC4yNQoraW54MjQzIGRpdmlkZSAgICAgMSAgICAgOCAgICAgICAgLT4gICAwLjEyNQoraW54MjQ0IGRpdmlkZSAgICAgMSAgICAxNiAgICAgICAgLT4gICAwLjA2MjUKK2lueDI0NSBkaXZpZGUgICAgIDEgICAgMzIgICAgICAgIC0+ICAgMC4wMzEzICAgSW5leGFjdCBSb3VuZGVkCitpbngyNDYgZGl2aWRlICAgICAxICAgIDY0ICAgICAgICAtPiAgIDAuMDE1NiAgIEluZXhhY3QgUm91bmRlZAoraW54MjQ3IGRpdmlkZSAgICAgMSAgIDEyOCAgICAgICAgLT4gICAwLjAwNzgxICBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAyCitpbngyNTAgZGl2aWRlICAgICAxICAgICAxICAgICAgICAtPiAgIDEKK2lueDI1MSBkaXZpZGUgICAgIDEgICAgIDIgICAgICAgIC0+ICAgMC41CitpbngyNTIgZGl2aWRlICAgICAxICAgICA0ICAgICAgICAtPiAgIDAuMjUKK2lueDI1MyBkaXZpZGUgICAgIDEgICAgIDggICAgICAgIC0+ICAgMC4xMyAgICAgSW5leGFjdCBSb3VuZGVkCitpbngyNTQgZGl2aWRlICAgICAxICAgIDE2ICAgICAgICAtPiAgIDAuMDYzICAgIEluZXhhY3QgUm91bmRlZAoraW54MjU1IGRpdmlkZSAgICAgMSAgICAzMiAgICAgICAgLT4gICAwLjAzMSAgICBJbmV4YWN0IFJvdW5kZWQKK2lueDI1NiBkaXZpZGUgICAgIDEgICAgNjQgICAgICAgIC0+ICAgMC4wMTYgICAgSW5leGFjdCBSb3VuZGVkCitpbngyNTcgZGl2aWRlICAgICAxICAgMTI4ICAgICAgICAtPiAgIDAuMDA3OCAgIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDEKK2lueDI2MCBkaXZpZGUgICAgIDEgICAgIDEgICAgICAgIC0+ICAgMQoraW54MjYxIGRpdmlkZSAgICAgMSAgICAgMiAgICAgICAgLT4gICAwLjUKK2lueDI2MiBkaXZpZGUgICAgIDEgICAgIDQgICAgICAgIC0+ICAgMC4zICAgICAgSW5leGFjdCBSb3VuZGVkCitpbngyNjMgZGl2aWRlICAgICAxICAgICA4ICAgICAgICAtPiAgIDAuMSAgICAgIEluZXhhY3QgUm91bmRlZAoraW54MjY0IGRpdmlkZSAgICAgMSAgICAxNiAgICAgICAgLT4gICAwLjA2ICAgICBJbmV4YWN0IFJvdW5kZWQKK2lueDI2NSBkaXZpZGUgICAgIDEgICAgMzIgICAgICAgIC0+ICAgMC4wMyAgICAgSW5leGFjdCBSb3VuZGVkCitpbngyNjYgZGl2aWRlICAgICAxICAgIDY0ICAgICAgICAtPiAgIDAuMDIgICAgIEluZXhhY3QgUm91bmRlZAoraW54MjY3IGRpdmlkZSAgICAgMSAgIDEyOCAgICAgICAgLT4gICAwLjAwOCAgICBJbmV4YWN0IFJvdW5kZWQKKworCistLSBwb3dlcgorcHJlY2lzaW9uOiA0CitpbngzMDEgcG93ZXIgICAgMC41ICAgICAyICAgICAgICAtPiAgIDAuMjUKK2lueDMwMiBwb3dlciAgICAwLjUgICAgIDQgICAgICAgIC0+ICAgMC4wNjI1CitpbngzMDMgcG93ZXIgICAgMC41ICAgICA4ICAgICAgICAtPiAgIDAuMDAzOTA2ICAgSW5leGFjdCBSb3VuZGVkCitpbngzMDQgcG93ZXIgICAgMC41ICAgIDE2ICAgICAgICAtPiAgIDAuMDAwMDE1MjYgSW5leGFjdCBSb3VuZGVkCitpbngzMDUgcG93ZXIgICAgMC41ICAgIDMyICAgICAgICAtPiAgIDIuMzI4RS0xMCAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGNvbXBhcmUsIGRpdmlkZUludGVnZXIsIGFuZCByZW1haW5kZXIgYXJlIGFsd2F5cyBleGFjdAorCistLSByZXNjYWxlCitwcmVjaXNpb246IDQKK2lueDQwMSByZXNjYWxlIDAgICAgICAgMCAgIC0+IDAKK2lueDQwMiByZXNjYWxlIDEgICAgICAgMCAgIC0+IDEKK2lueDQwMyByZXNjYWxlIDAuMSAgICArMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCitpbng0MDQgcmVzY2FsZSAwLjEgICAgKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAoraW54NDA1IHJlc2NhbGUgMC4xICAgICAwICAgLT4gMCBJbmV4YWN0IFJvdW5kZWQKK2lueDQwNiByZXNjYWxlIDAuMSAgICAtMSAgIC0+IDAuMQoraW54NDA3IHJlc2NhbGUgMC4xICAgIC0yICAgLT4gMC4xMAorCistLSBsb25nIG9wZXJhbmRzIGNhdXNlIHJvdW5kaW5nIHRvbworcHJlY2lzaW9uOiA5Citpbng4MDEgcGx1cyAgMTIzNDU2Nzg5ICAtPiAxMjM0NTY3ODkKK2lueDgwMiBwbHVzICAxMjM0NTY3ODkwIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAoraW54ODAzIHBsdXMgIDEyMzQ1Njc4OTEgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK2lueDgwNCBwbHVzICAxMjM0NTY3ODkyIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitpbng4MDUgcGx1cyAgMTIzNDU2Nzg5OSAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAoraW54ODA2IHBsdXMgIDEyMzQ1Njc5MDAgLT4gMS4yMzQ1Njc5MEUrOSBSb3VuZGVkCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvaW52ZXJ0LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2ludmVydC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjdiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2ludmVydC5kZWNUZXN0CkBAIC0wLDAgKzEsMTc2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGludmVydC5kZWNUZXN0IC0tIGRpZ2l0d2lzZSBsb2dpY2FsIElOVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworLS0gU2FuaXR5IGNoZWNrICh0cnV0aCB0YWJsZSksIGFuZCBleGFtcGxlcyBmcm9tIGRlY0FyaXRoCitpbnZ4MDAxIGludmVydCAgICAgICAgICAgICAwIC0+IDExMTExMTExMQoraW52eDAwMiBpbnZlcnQgICAgICAgICAgICAgMSAtPiAxMTExMTExMTAKK2ludngwMDMgaW52ZXJ0ICAgICAgICAgICAgMTAgLT4gMTExMTExMTAxCitpbnZ4MDA0IGludmVydCAgICAgMTExMTExMTExIC0+ICAgICAgICAgMAoraW52eDAwNSBpbnZlcnQgICAgIDAwMDAwMDAwMCAtPiAxMTExMTExMTEKK2ludngwMDYgaW52ZXJ0ICAgICAxMDEwMTAxMDEgLT4gJzEwMTAxMDEwJworLS0gYW5kIGF0IG1zZCBhbmQgbXNkLTEKK2ludngwMDcgaW52ZXJ0IDAwMDAwMDAwMCAtPiAgIDExMTExMTExMQoraW52eDAwOSBpbnZlcnQgMTAwMDAwMDAwIC0+ICAgIDExMTExMTExCitpbnZ4MDExIGludmVydCAwMDAwMDAwMDAgLT4gICAxMTExMTExMTEKK2ludngwMTMgaW52ZXJ0IDAxMDAwMDAwMCAtPiAgIDEwMTExMTExMQorCistLSBWYXJpb3VzIGxlbmd0aHMKKy0tICAgICAgICAgICAgIDEyMzQ1Njc4OSAgICAgICAgIDEyMzQ1Njc4OQoraW52eDAyMSBpbnZlcnQgMTExMTExMTExICAgICAtPiAgMAoraW52eDAyMiBpbnZlcnQgMTExMTExMTExMTExICAtPiAgMAoraW52eDAyMyBpbnZlcnQgIDExMTExMTExICAgICAtPiAgMTAwMDAwMDAwCitpbnZ4MDI1IGludmVydCAgIDExMTExMTEgICAgIC0+ICAxMTAwMDAwMDAKK2ludngwMjYgaW52ZXJ0ICAgIDExMTExMSAgICAgLT4gIDExMTAwMDAwMAoraW52eDAyNyBpbnZlcnQgICAgIDExMTExICAgICAtPiAgMTExMTAwMDAwCitpbnZ4MDI4IGludmVydCAgICAgIDExMTEgICAgIC0+ICAxMTExMTAwMDAKK2ludngwMjkgaW52ZXJ0ICAgICAgIDExMSAgICAgLT4gIDExMTExMTAwMAoraW52eDAzMSBpbnZlcnQgICAgICAgIDExICAgICAtPiAgMTExMTExMTAwCitpbnZ4MDMyIGludmVydCAgICAgICAgIDEgICAgIC0+ICAxMTExMTExMTAKK2ludngwMzMgaW52ZXJ0IDExMTExMTExMTExMSAgLT4gIDAKK2ludngwMzQgaW52ZXJ0IDExMTExMTExMTExICAgLT4gIDAKK2ludngwMzUgaW52ZXJ0IDExMTExMTExMTEgICAgLT4gIDAKK2ludngwMzYgaW52ZXJ0IDExMTExMTExMSAgICAgLT4gIDAKKworaW52eDA4MCBpbnZlcnQgMDExMTExMTExICAgLT4gIDEwMDAwMDAwMAoraW52eDA4MSBpbnZlcnQgMTAxMTExMTExICAgLT4gICAxMDAwMDAwMAoraW52eDA4MiBpbnZlcnQgMTEwMTExMTExICAgLT4gICAgMTAwMDAwMAoraW52eDA4MyBpbnZlcnQgMTExMDExMTExICAgLT4gICAgIDEwMDAwMAoraW52eDA4NCBpbnZlcnQgMTExMTAxMTExICAgLT4gICAgICAxMDAwMAoraW52eDA4NSBpbnZlcnQgMTExMTEwMTExICAgLT4gICAgICAgMTAwMAoraW52eDA4NiBpbnZlcnQgMTExMTExMDExICAgLT4gICAgICAgIDEwMAoraW52eDA4NyBpbnZlcnQgMTExMTExMTAxICAgLT4gICAgICAgICAxMAoraW52eDA4OCBpbnZlcnQgMTExMTExMTEwICAgLT4gICAgICAgICAgMQoraW52eDA4OSBpbnZlcnQgMDExMTExMDExICAgLT4gIDEwMDAwMDEwMAoraW52eDA5MCBpbnZlcnQgMTAxMTExMTAxICAgLT4gICAxMDAwMDAxMAoraW52eDA5MSBpbnZlcnQgMTEwMTExMTEwICAgLT4gICAgMTAwMDAwMQoraW52eDA5MiBpbnZlcnQgMTExMDExMTAxICAgLT4gICAgIDEwMDAxMAoraW52eDA5MyBpbnZlcnQgMTExMTAxMDExICAgLT4gICAgICAxMDEwMAoraW52eDA5NCBpbnZlcnQgMTExMTEwMTExICAgLT4gICAgICAgMTAwMAoraW52eDA5NSBpbnZlcnQgMTExMTAxMDExICAgLT4gICAgICAxMDEwMAoraW52eDA5NiBpbnZlcnQgMTExMDExMTAxICAgLT4gICAgIDEwMDAxMAoraW52eDA5NyBpbnZlcnQgMTEwMTExMTEwICAgLT4gICAgMTAwMDAwMQoraW52eDA5OCBpbnZlcnQgMTAxMTExMTAxICAgLT4gICAxMDAwMDAxMAoraW52eDA5OSBpbnZlcnQgMDExMTExMDExICAgLT4gIDEwMDAwMDEwMAorCistLSBub24tMC8xIHNob3VsZCBub3QgYmUgYWNjZXB0ZWQsIG5vciBzaG91bGQgc2lnbnMKK2ludngyMjAgaW52ZXJ0IDExMTExMTExMiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyMjEgaW52ZXJ0IDMzMzMzMzMzMyAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyMjIgaW52ZXJ0IDU1NTU1NTU1NSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyMjMgaW52ZXJ0IDc3Nzc3Nzc3NyAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyMjQgaW52ZXJ0IDk5OTk5OTk5OSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyMjUgaW52ZXJ0IDIyMjIyMjIyMiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyMjYgaW52ZXJ0IDQ0NDQ0NDQ0NCAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyMjcgaW52ZXJ0IDY2NjY2NjY2NiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyMjggaW52ZXJ0IDg4ODg4ODg4OCAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyMjkgaW52ZXJ0IDk5OTk5OTk5OSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyMzAgaW52ZXJ0IDk5OTk5OTk5OSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyMzEgaW52ZXJ0IDk5OTk5OTk5OSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyMzIgaW52ZXJ0IDk5OTk5OTk5OSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGEgZmV3IHJhbmRvbXMKK2ludngyNDAgaW52ZXJ0ICA1Njc0Njg2ODkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyNDEgaW52ZXJ0ICA1NjczNjc2ODkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyNDIgaW52ZXJ0IC02MzE5MTc3NzIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyNDMgaW52ZXJ0IC03NTYyNTMyNTcgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyNDQgaW52ZXJ0ICA4MzU1OTAxNDkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNECitpbnZ4MjUwIGludmVydCAgMjAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjUxIGludmVydCAgMzAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjUyIGludmVydCAgNDAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjUzIGludmVydCAgNTAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjU0IGludmVydCAgNjAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjU1IGludmVydCAgNzAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjU2IGludmVydCAgODAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjU3IGludmVydCAgOTAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRC0xCitpbnZ4MjcwIGludmVydCAgMDIxMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjcxIGludmVydCAgMDMwMTAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjcyIGludmVydCAgMDQwMDEwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjczIGludmVydCAgMDUwMDAxMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4Mjc0IGludmVydCAgMTYwMDAwMTAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4Mjc1IGludmVydCAgMTcwMDAwMDEwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4Mjc2IGludmVydCAgMTgwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4Mjc3IGludmVydCAgMTkwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IExTRAoraW52eDI4MCBpbnZlcnQgIDAwMDAwMDAwMiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI4MSBpbnZlcnQgIDAwMDAwMDAwMyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI4MiBpbnZlcnQgIDAwMDAwMDAwNCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI4MyBpbnZlcnQgIDAwMDAwMDAwNSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI4NCBpbnZlcnQgIDEwMTAwMDAwNiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI4NSBpbnZlcnQgIDEwMDEwMDAwNyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI4NiBpbnZlcnQgIDEwMDAxMDAwOCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI4NyBpbnZlcnQgIDEwMDAwMTAwOSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNaWRkaWUKK2ludngyODggaW52ZXJ0ICAwMDAwMjAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyODkgaW52ZXJ0ICAwMDAwMzAwMDEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyOTAgaW52ZXJ0ICAwMDAwNDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyOTEgaW52ZXJ0ICAwMDAwNTAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyOTIgaW52ZXJ0ICAxMDEwNjAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyOTMgaW52ZXJ0ICAxMDAxNzAwMTAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyOTQgaW52ZXJ0ICAxMDAwODAxMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyOTUgaW52ZXJ0ICAxMDAwOTEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHNpZ25zCitpbnZ4Mjk2IGludmVydCAtMTAwMDAxMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4Mjk5IGludmVydCAgMTAwMDAxMDAwICAtPiAgMTExMTAxMTEKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2ludngzNDEgaW52ZXJ0ICA5Ljk5OTk5OTk5RSs5OTkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngzNDIgaW52ZXJ0ICAxRS05OTkgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngzNDMgaW52ZXJ0ICAxLjAwMDAwMDAwRS05OTkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngzNDQgaW52ZXJ0ICAxRS0xMDA3ICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngzNDUgaW52ZXJ0ICAtMUUtMTAwNyAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngzNDYgaW52ZXJ0ICAtMS4wMDAwMDAwMEUtOTk5ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngzNDcgaW52ZXJ0ICAtMUUtOTk5ICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngzNDggaW52ZXJ0ICAtOS45OTk5OTk5OUUrOTk5ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQSBmZXcgb3RoZXIgbm9uLWludGVnZXJzCitpbnZ4MzYxIGludmVydCAgMS4wICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MzYyIGludmVydCAgMUUrMSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MzYzIGludmVydCAgMC4wICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MzY0IGludmVydCAgMEUrMSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MzY1IGludmVydCAgOS45ICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MzY2IGludmVydCAgOUUrMSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEFsbCBTcGVjaWFscyBhcmUgaW4gZXJyb3IKK2ludng3ODggaW52ZXJ0IC1JbmYgICAgIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ludng3OTQgaW52ZXJ0ICBJbmYgICAgIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ludng4MjEgaW52ZXJ0ICBOYU4gICAgIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ludng4NDEgaW52ZXJ0ICBzTmFOICAgIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2ludng4NjEgaW52ZXJ0ICBOYU4xICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDg2MiBpbnZlcnQgK05hTjIgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4ODYzIGludmVydCAgTmFOMyAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludng4NjQgaW52ZXJ0ICBOYU40ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDg2NSBpbnZlcnQgIE5hTjUgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4ODcxIGludmVydCAgc05hTjExICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludng4NzIgaW52ZXJ0ICBzTmFOMTIgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDg3MyBpbnZlcnQgIHNOYU4xMyAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4ODc0IGludmVydCAgc05hTjE0ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludng4NzUgaW52ZXJ0ICBzTmFOMTUgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDg3NiBpbnZlcnQgIE5hTjE2ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4ODgxIGludmVydCArTmFOMjUgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludng4ODIgaW52ZXJ0IC1OYU4yNiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDg4MyBpbnZlcnQgLXNOYU4yNyAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2xuLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2xuLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwMmFmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbG4uZGVjVGVzdApAQCAtMCwwICsxLDYxMSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBsbi5kZWNUZXN0IC0tIGRlY2ltYWwgbmF0dXJhbCBsb2dhcml0aG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDA1LCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIGJhc2ljcyAoZXhhbXBsZXMgaW4gc3BlY2lmaWNhdGlvbikKK3ByZWNpc2lvbjogOQorbG54czAwMSBsbiAgMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5CitsbnhzMDAyIGxuICAxLjAwMCAgICAgICAgICAgICAtPiAgIDAKK2xueHMwMDMgbG4gIDIuNzE4MjgxODMgICAgICAgIC0+ICAgMS4wMDAwMDAwMCAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54czAwNCBsbiAgMTAgICAgICAgICAgICAgICAgLT4gICAyLjMwMjU4NTA5ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbnhzMDA1IGxuICtJbmZpbml0eSAgICAgICAgICAtPiAgSW5maW5pdHkKKworCistLSBiYXNpY3MKK3ByZWNpc2lvbjogICAxNgorbG54MDAwMSBsbiAgMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5CitsbngwMDAyIGxuICAxRS05ICAgICAgICAgICAgICAtPiAtMjAuNzIzMjY1ODM2OTQ2NDEgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAwMDMgbG4gIDAuMDAwNyAgICAgICAgICAgIC0+ICAtNy4yNjQ0MzAyMjI5MjA4NjkgIEluZXhhY3QgUm91bmRlZAorbG54MDAwNCBsbiAgMC4xICAgICAgICAgICAgICAgLT4gIC0yLjMwMjU4NTA5Mjk5NDA0NiAgSW5leGFjdCBSb3VuZGVkCitsbngwMDA1IGxuICAwLjcgICAgICAgICAgICAgICAtPiAgLTAuMzU2Njc0OTQzOTM4NzMyNCBJbmV4YWN0IFJvdW5kZWQKK2xueDAwMDYgbG4gIDEgICAgICAgICAgICAgICAgIC0+ICAgMAorbG54MDAwNyBsbiAgMS4wMDAgICAgICAgICAgICAgLT4gICAwCitsbngwMDA4IGxuICAxLjUgICAgICAgICAgICAgICAtPiAgIDAuNDA1NDY1MTA4MTA4MTY0NCBJbmV4YWN0IFJvdW5kZWQKK2xueDAwMDkgbG4gIDIgICAgICAgICAgICAgICAgIC0+ICAgMC42OTMxNDcxODA1NTk5NDUzIEluZXhhY3QgUm91bmRlZAorbG54MDAxMCBsbiAgMi43MTgyODE4Mjg0NTkwNDUgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitsbngwMDExIGxuICAyLjcxODI4MTgyODQ1OTA0NiAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK2xueDAwMTIgbG4gIDIuNzE4MjgxODI4NDU5MDQ3IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDEgIEluZXhhY3QgUm91bmRlZAorbG54MDAxMyBsbiAgMTAgICAgICAgICAgICAgICAgLT4gICAyLjMwMjU4NTA5Mjk5NDA0NiAgSW5leGFjdCBSb3VuZGVkCitsbngwMDE0IGxuICAxMC41ICAgICAgICAgICAgICAtPiAgIDIuMzUxMzc1MjU3MTYzNDc4ICBJbmV4YWN0IFJvdW5kZWQKK2xueDAwMTUgbG4gIDk5OTkgICAgICAgICAgICAgIC0+ICAgOS4yMTAyNDAzNjY5NzU4NDkgIEluZXhhY3QgUm91bmRlZAorbG54MDAxNiBsbiAgMUU2ICAgICAgICAgICAgICAgLT4gIDEzLjgxNTUxMDU1Nzk2NDI3ICAgSW5leGFjdCBSb3VuZGVkCitsbngwMDE3IGxuICAxRSs5ICAgICAgICAgICAgICAtPiAgMjAuNzIzMjY1ODM2OTQ2NDEgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAwMTggbG4gK0luZmluaXR5ICAgICAgICAgIC0+ICBJbmZpbml0eQorCistLSBub3RhYmxlIGNhc2VzCistLSBuZWdhdGl2ZXMKK2xueDAwMjEgbG4gLTFFLTkgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbG54MDAyMiBsbiAtMC4wMDA3ICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsbngwMDIzIGxuIC0wLjEgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xueDAwMjQgbG4gLTAuNyAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbG54MDAyNSBsbiAtMSAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsbngwMDI2IGxuIC0xLjUgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xueDAwMjcgbG4gLTIgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbG54MDAyOSBsbiAtMTAuNSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsbngwMDI4IGxuIC05OTk5ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xueDAwMzAgbG4gLTIuNzE4MjgxODI4NDU5MDQ1IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbG54MDAzMSBsbiAtMi43MTgyODE4Mjg0NTkwNDYgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsbngwMDMyIGxuIC0wICAgICAgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2xueDAwMzMgbG4gLTBFKzE3ICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorbG54MDAzNCBsbiAtMEUtMTcgICAgICAgICAgICAgLT4gLUluZmluaXR5CistLSBvdGhlciB6ZXJvcworbG54MDA0MSBsbiAgMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5CitsbngwMDQyIGxuICAwRSsxNyAgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2xueDAwNDMgbG4gIDBFLTE3ICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorLS0gaW5maW5pdGllcworbG54MDA0NSBsbiAtSW5maW5pdHkgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsbngwMDQ2IGxuICtJbmZpbml0eSAgICAgICAgICAtPiBJbmZpbml0eQorLS0gb25lcworbG54MDA1MCBsbiAgMSAgICAgICAgICAgICAgICAgLT4gICAwCitsbngwMDUxIGxuICAxLjAgICAgICAgICAgICAgICAtPiAgIDAKK2xueDAwNTIgbG4gIDEuMDAwMDAwMDAwMDAwMDAwIC0+ICAgMAorbG54MDA1MyBsbiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAwCisKKy0tIGxvd2VyIHByZWNpc2lvbiBiYXNpY3MKK1ByZWNpc2lvbjogNworbG54MDEwMSBsbiAgMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5CitsbngwMTAyIGxuICAxRS05ICAgICAgICAgICAgICAtPiAtMjAuNzIzMjcgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMDMgbG4gIDAuMDAwNyAgICAgICAgICAgIC0+ICAtNy4yNjQ0MzAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEwNCBsbiAgMC4xICAgICAgICAgICAgICAgLT4gIC0yLjMwMjU4NSAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTA1IGxuICAwLjcgICAgICAgICAgICAgICAtPiAgLTAuMzU2Njc0OSAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMDYgbG4gIDEgICAgICAgICAgICAgICAgIC0+ICAgMAorbG54MDEwNyBsbiAgMS41ICAgICAgICAgICAgICAgLT4gICAwLjQwNTQ2NTEgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTA4IGxuICAyICAgICAgICAgICAgICAgICAtPiAgIDAuNjkzMTQ3MiAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMDkgbG4gIDIuNzE4MjgxODI4NDU5MDQ1IC0+ICAgMS4wMDAwMDAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDExMCBsbiAgMi43MTgyODE4Mjg0NTkwNDYgLT4gICAxLjAwMDAwMCAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTExIGxuICAyLjcxODI4MTgyODQ1OTA0NyAtPiAgIDEuMDAwMDAwICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMTIgbG4gIDEwICAgICAgICAgICAgICAgIC0+ICAgMi4zMDI1ODUgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDExMyBsbiAgMTAuNSAgICAgICAgICAgICAgLT4gICAyLjM1MTM3NSAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTE0IGxuICA5OTk5ICAgICAgICAgICAgICAtPiAgIDkuMjEwMjQwICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMTUgbG4gIDFFNiAgICAgICAgICAgICAgIC0+ICAxMy44MTU1MSAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDExNiBsbiAgMUUrOSAgICAgICAgICAgICAgLT4gIDIwLjcyMzI3ICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTE3IGxuICtJbmZpbml0eSAgICAgICAgICAtPiAgSW5maW5pdHkKK1ByZWNpc2lvbjogMgorbG54MDEyMSBsbiAgMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5CitsbngwMTIyIGxuICAxRS05ICAgICAgICAgICAgICAtPiAtMjEgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMjMgbG4gIDAuMDAwNyAgICAgICAgICAgIC0+ICAtNy4zICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEyNCBsbiAgMC4xICAgICAgICAgICAgICAgLT4gIC0yLjMgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTI1IGxuICAwLjcgICAgICAgICAgICAgICAtPiAgLTAuMzYgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMjYgbG4gIDEgICAgICAgICAgICAgICAgIC0+ICAgMAorbG54MDEyNyBsbiAgMS41ICAgICAgICAgICAgICAgLT4gICAwLjQxICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTI4IGxuICAyICAgICAgICAgICAgICAgICAtPiAgIDAuNjkgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMjkgbG4gIDIuNzE4MjgxODI4NDU5MDQ1IC0+ICAgMS4wICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEzMCBsbiAgMi43MTgyODE4Mjg0NTkwNDYgLT4gICAxLjAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTMxIGxuICAyLjcxODI4MTgyODQ1OTA0NyAtPiAgIDEuMCAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMzIgbG4gIDEwICAgICAgICAgICAgICAgIC0+ICAgMi4zICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEzMyBsbiAgMTAuNSAgICAgICAgICAgICAgLT4gICAyLjQgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTM0IGxuICA5OTk5ICAgICAgICAgICAgICAtPiAgIDkuMiAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMzUgbG4gIDFFNiAgICAgICAgICAgICAgIC0+ICAxNCAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEzNiBsbiAgMUUrOSAgICAgICAgICAgICAgLT4gIDIxICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTM3IGxuICtJbmZpbml0eSAgICAgICAgICAtPiAgSW5maW5pdHkKK1ByZWNpc2lvbjogMQorbG54MDE0MSBsbiAgMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5CitsbngwMTQyIGxuICAxRS05ICAgICAgICAgICAgICAtPiAtMkUrMSAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxNDMgbG4gIDAuMDAwNyAgICAgICAgICAgIC0+ICAtNyAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDE0NCBsbiAgMC4xICAgICAgICAgICAgICAgLT4gIC0yICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTQ1IGxuICAwLjcgICAgICAgICAgICAgICAtPiAgLTAuNCAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxNDYgbG4gIDEgICAgICAgICAgICAgICAgIC0+ICAgMAorbG54MDE0NyBsbiAgMS41ICAgICAgICAgICAgICAgLT4gICAwLjQgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTQ4IGxuICAyICAgICAgICAgICAgICAgICAtPiAgIDAuNyAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxNDkgbG4gIDIuNzE4MjgxODI4NDU5MDQ1IC0+ICAgMSAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDE1MCBsbiAgMi43MTgyODE4Mjg0NTkwNDYgLT4gICAxICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTUxIGxuICAyLjcxODI4MTgyODQ1OTA0NyAtPiAgIDEgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxNTIgbG4gIDEwICAgICAgICAgICAgICAgIC0+ICAgMiAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDE1MyBsbiAgMTAuNSAgICAgICAgICAgICAgLT4gICAyICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTU0IGxuICA5OTk5ICAgICAgICAgICAgICAtPiAgIDkgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxNTUgbG4gIDFFNiAgICAgICAgICAgICAgIC0+ICAxRSsxICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDE1NiBsbiAgMUUrOSAgICAgICAgICAgICAgLT4gIDJFKzEgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTU3IGxuICtJbmZpbml0eSAgICAgICAgICAtPiAgSW5maW5pdHkKKworLS0gZ3JvdXAgbG93LXByZWNpc2lvbiBsbigxKXM6CitwcmVjaXNpb246IDEKK2xueDAxNjEgbG4gIDEgLT4gMAorcHJlY2lzaW9uOiAyCitsbngwMTYyIGxuICAxIC0+IDAKK3ByZWNpc2lvbjogMworbG54MDE2MyBsbiAgMSAtPiAwCitwcmVjaXNpb246IDQKK2xueDAxNjQgbG4gIDEgLT4gMAorcHJlY2lzaW9uOiA1CitsbngwMTY1IGxuICAxIC0+IDAKK3ByZWNpc2lvbjogNgorbG54MDE2NiBsbiAgMSAtPiAwCitwcmVjaXNpb246IDcKK2xueDAxNjcgbG4gIDEgLT4gMAorcHJlY2lzaW9uOiA4CitsbngwMTY4IGxuICAxIC0+IDAKKworLS0gZWRnZS10ZXN0IGxuKDIpIGFuZCBsbigxMCkgaW4gY2FzZSBvZiBsb29rYXNpZGVzCitwcmVjaXNpb246IDQ1CitsbngyMDEgIGxuICAyIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc2NTY4MDc1NTAwMTM0ICBJbmV4YWN0IFJvdW5kZWQKK2xueDIwMiAgbG4gMTAgLT4gMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQyMDc2MDExMDE0OSAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0NAorbG54MjAzICBsbiAgMiAtPiAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NjU2ODA3NTUwMDEzICAgSW5leGFjdCBSb3VuZGVkCitsbngyMDQgIGxuIDEwIC0+IDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MjA3NjAxMTAxNSAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDMKK2xueDIwNSAgbG4gIDIgLT4gMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzY1NjgwNzU1MDAxICAgIEluZXhhY3QgUm91bmRlZAorbG54MjA2ICBsbiAxMCAtPiAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDM2NDIwNzYwMTEwMSAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQyCitsbngyMDcgIGxuICAyIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc2NTY4MDc1NTAwICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDIwOCAgbG4gMTAgLT4gMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQyMDc2MDExMCAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0MQorbG54MjA5ICBsbiAgMiAtPiAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NjU2ODA3NTUwICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngyMTAgIGxuIDEwIC0+IDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MjA3NjAxMSAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDAKK2xueDIxMSAgbG4gIDIgLT4gMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzY1NjgwNzU1ICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MjEyICBsbiAxMCAtPiAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDM2NDIwNzYwMSAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM5CitsbngyMTMgIGxuICAyIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc2NTY4MDc2ICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDIxNCAgbG4gMTAgLT4gMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQyMDc2MCAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzOAorbG54MjE1ICBsbiAgMiAtPiAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NjU2ODA4ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngyMTYgIGxuIDEwIC0+IDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MjA3NiAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzcKK2xueDIxNyAgbG4gIDIgLT4gMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzY1NjgxICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MjE4ICBsbiAxMCAtPiAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDM2NDIwOCAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM2CitsbngyMTkgIGxuICAyIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc2NTY4ICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDIyMCAgbG4gMTAgLT4gMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQyMSAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzNQorbG54MjIxICBsbiAgMiAtPiAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NjU3ICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngyMjIgIGxuIDEwIC0+IDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MiAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzQKK2xueDIyMyAgbG4gIDIgLT4gMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzY2ICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MjI0ICBsbiAxMCAtPiAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDM2NCAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMzCitsbngyMjUgIGxuICAyIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc3ICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDIyNiAgbG4gMTAgLT4gMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNiAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMgorbG54MjI3ICBsbiAgMiAtPiAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE4ICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngyMjggIGxuIDEwIC0+IDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0NCAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzEKK2xueDIyOSAgbG4gIDIgLT4gMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgyICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MjMwICBsbiAxMCAtPiAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NCAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMwCitsbngyMzEgIGxuICAyIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4ICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDIzMiAgbG4gMTAgLT4gMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2OCAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorCistLSBleHRyZW1lIGlucHV0IHJhbmdlIHZhbHVlcworbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK1ByZWNpc2lvbjogMTYKKworbG54MDkwMSBsbiAxZS00MDAgICAgLT4gLTkyMS4wMzQwMzcxOTc2MTgzICBJbmV4YWN0IFJvdW5kZWQKK2xueDA5MDIgbG4gMWUrNDAwICAgIC0+ICA5MjEuMDM0MDM3MTk3NjE4MyAgSW5leGFjdCBSb3VuZGVkCitsbngwOTAzIGxuIDFlLTk5OTk5OSAtPiAtMjMwMjU4Mi43OTA0MDg5NTMgIEluZXhhY3QgUm91bmRlZAorbG54MDkwNCBsbiAxZSs5OTk5OTkgLT4gIDIzMDI1ODIuNzkwNDA4OTUzICBJbmV4YWN0IFJvdW5kZWQKK2xueDA5MDUgbG4gMWUtMTAwMDAxMyAgICAgICAgICAgICAgICAtPiAtMjMwMjYxNS4wMjY2MDAyNTUgIEluZXhhY3QgUm91bmRlZAorbG54MDkwNiBsbiAyZS0xMDAwMDEzICAgICAgICAgICAgICAgIC0+IC0yMzAyNjE0LjMzMzQ1MzA3NCAgSW5leGFjdCBSb3VuZGVkCisKK2xueDA5MTAgbG4gOS45OTk5OTllKzk5OTk5OSAgICAgICAgICAtPiAgMjMwMjU4NS4wOTI5OTM5NDYgIEluZXhhY3QgUm91bmRlZAorbG54MDkxMSBsbiA5Ljk5OTk5OTllKzk5OTk5OSAgICAgICAgIC0+ICAyMzAyNTg1LjA5Mjk5NDAzNiAgSW5leGFjdCBSb3VuZGVkCitsbngwOTEyIGxuIDkuOTk5OTk5OTllKzk5OTk5OSAgICAgICAgLT4gIDIzMDI1ODUuMDkyOTk0MDQ1ICBJbmV4YWN0IFJvdW5kZWQKK2xueDA5MTMgbG4gOS45OTk5OTk5OTllKzk5OTk5OSAgICAgICAtPiAgMjMwMjU4NS4wOTI5OTQwNDYgIEluZXhhY3QgUm91bmRlZAorbG54MDkxNCBsbiA5Ljk5OTk5OTk5OTk5OWUrOTk5OTk5ICAgIC0+ICAyMzAyNTg1LjA5Mjk5NDA0NiAgSW5leGFjdCBSb3VuZGVkCitsbngwOTE1IGxuIDkuOTk5OTk5OTk5OTk5OTk5ZSs5OTk5OTkgLT4gIDIzMDI1ODUuMDkyOTk0MDQ2ICBJbmV4YWN0IFJvdW5kZWQKK2xueDA5MTYgbG4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTllKzk5OTk5OSAtPiAgMjMwMjU4NS4wOTI5OTQwNDYgIEluZXhhY3QgUm91bmRlZAorCistLSByYW5kb21zCistLSBQPTUwLCB3aXRoaW4gMC05OTkKK1ByZWNpc2lvbjogNTAKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitsbngxNTAxIGxuIDAuMDAwOTg4MDA5MDY1NzQ0ODYzODg2MDQ2MDg0Nzc4Njk4MTI1MTg4NTcwMjM3Njg5NTEgLT4gLTYuOTE5ODE4Njg0NDAzMzc4Nzk5NTk0NTE0NzgzNjk1NTU4NjAwOTU0ODUxMzA0MzY4OSBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MDIgbG4gMTU4LjE1ODY2NjI0NjY0NjIzMDcwMTg0NTk1MDQ1MzA0MTQ1OTQ5OTAwNzE0OTg3ODI3ICAtPiA1LjA2MzU5ODc0NTg4OTU2NDc0NTQ5MDc4MDY1MDc1MDM4MjU2MDI3NTgzOTIyODc2ODQgSW5leGFjdCBSb3VuZGVkCitsbngxNTAzIGxuIDAuMDA1NjU2NjE0MTIwNTk1NzE5MjUwNDAyODU4MTQwMjE3OTk3NzUyNDkyODgzMDkzMjEgLT4gLTUuMTc0OTI5Nzc3Njc2MDYzMjEwMjA0NzU0MDMwMDQ5MTU1MDkzMTY1MTMxODk3NTIzNyBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MDQgbG4gMC4wMDAwMDAwNjkxNDIzMjUzMjYyMDQ4OTYwMjAwODQwMjA5MTY2NjU0NzkwMzE4MDYwNyAtPiAtMTYuNDg3MDk4NzcwODc3ODI1MzA4MTM4OTc2ODE4Njg4NzcxNjM4MTcyMzMzMDM0MzQ3IEluZXhhY3QgUm91bmRlZAorbG54MTUwNSBsbiAwLjAwMDI1MzgwMzc0NjIxMjk3NjU3NTA0NjYxNTQwNzQ5MzU1MjUxMjMxNzcwMDcwNzIzIC0+IC04LjI3ODk0OTI0MjMwMDUwMDMyMDUyNDIxNjI3NDE1NjkwMzMxMjQyNjAzMjE5NTQ1ODkgSW5leGFjdCBSb3VuZGVkCitsbngxNTA2IGxuIDgzLjAzMzY1NDA2Mzg3NzQyNjI2MTEwODU5MjU5OTE4MjQxODk1MzQ0MjY3NzU1NDgwNiAgLT4gNC40MTkyNDU5OTYyNjQ3MTM3OTc2OTQ5MjQ5ODEwODE1Njk4NDY1MDMxNjA5ODQzNjY5IEluZXhhY3QgUm91bmRlZAorbG54MTUwNyBsbiAwLjAwMDAwMDAwNDE2ODYzMjI4MDkyNDgxNjUxNjI3NzM0NjY4NDQwNjYzNjc4MTE4NzI5IC0+IC0xOS4yOTU2Nzc4NDUxMjIxNDE3NzI3OTEyOTQ1OTk3MTQ5NTAxNzUyODQ5MTU2NjY0MzAgSW5leGFjdCBSb3VuZGVkCitsbngxNTA4IGxuIDAuMDAwMDAxNDA4NDc4NzMxODc4MjA1NzAxODEyMTQyNzE5NjA1MTEwODA1MjM0NTc2NjkgLT4gLTEzLjQ3MzAwMDM0OTU4MTk2NzE4OTY2ODMwNTMxNDM4NDk1MjI1MTU1NjgwOTQ4MDMzOSBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MDkgbG4gNjYuMTc2MTA2NTU1MTgxNTI3MTAxNjMwMzUxMTI3NTgzOTQ0Njg5NzUyMDY5MTMyNTIyICAtPiA0LjE5MjMxOTQ2OTYyMzI1MDU4ODM2NjYxNzExMTY5NjYxMzc2OTQwMTM0MzE1MDQyNTIgSW5leGFjdCBSb3VuZGVkCitsbngxNTEwIGxuIDAuMDAwMDAwMDAwMDAwMDk4OTkwNDM0ODc0MDM1OTA5MDAxMTE2MDIwMjQ1NjIyOTc5MDggLT4gLTI5Ljk0Mzc1MzE2Njg3Nzg0MDk4NTgyMTUwODExMjkxNzk5MTUwNjY1NjU0NTE3NDE2MyBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MTEgbG4gMC4wMDAwMDAwMDAwMDMyNDYxODI5NjcyMTc0NzA5NzUxMDQ1MzM4ODY4MzkxMjczMzU2OSAtPiAtMjYuNDUzNTQxMjgxNDQ0NTg2ODE5MDA5NTQ2NDE4NTc3NTA3MTYzMzYyNTkwMTM5NDIyIEluZXhhY3QgUm91bmRlZAorbG54MTUxMiBsbiA3Mi42NDY5Njg4MTg0NjM1NDY0NDk0OTkxNDc1NzkwMjM1NTUwMDgzOTI4NjA0MjMzODUgIC0+IDQuMjg1NjExNjY2MDY4OTY0Njg4Mjg1MjEyODg1MzQyMzU2NjI3NjcxODIzMDQyNjQ3OSBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MTMgbG4gMC4wMDAwMDAwMDAwMDAwMDA2Njc1NTQ4MzEyNDYzNTYxMjU3NDI2MzE1MzgyNTk5MDUyMyAtPiAtMzQuOTQyOTEwMTQyODAyNzY5MzE5MjYyODc1MDgwMzk4ODUyNDkxNTg4NzA3MTcyNDgzIEluZXhhY3QgUm91bmRlZAorbG54MTUxNCBsbiA2MS4wMDI5MTA0NDcyMDIzOTgyMDQxMTQ5MDk0NTE4NTExMTE0MjQ2NTc2NzE5MTEwMDIgIC0+IDQuMTEwOTIxNTc1Mjg0MzM3NzMyMzM2MzE4MjA1MTQ0NjE3NzA2NjQzNDAzODA5NjUyOSBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MTUgbG4gOTE3LjA2OTE3NjExMzMxOTgwOTk5MjI3ODkzNTg0MDEwNTQ0NTQyMzEyMjM5MTc0Nzc0ICAtPiA2LjgyMTE4MjkwNjgzMDMxMTQxMjg3NTI0NTM2NjE5NDY0NDY5Nzk3ODc4MjYyODI5MDcgSW5leGFjdCBSb3VuZGVkCitsbngxNTE2IGxuIDAuMDAwMDAwMDAxNzA4MjM3OTQ4ODM2NzMwODMzNTg1NDk3NDkwNzg5NzIwMDM5NjUxOTQgLT4gLTIwLjE4NzgwMzQzNjk3NjE1MDQ3NzI5NzI0NjY2Njc3MTYyNjgyNzA1NzE5MTAyMzAwNCBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MTcgbG4gMC41MzczMTc2Nzg0NTM1ODIyNDQ0NTgwOTc2MTMxNTE1OTI0OTg5ODU2NjU0MjkxMDY0OSAtPiAtMC42MjExNjU3NzkzOTk2ODQwOTIxMTczNjQxMzYyODIzNjI4NTE2MDA0ODM1NzAwMDk2MSBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MTggbG4gMC4wMDAwMDAwMDAwMDAwMDAwODk2NTI5MTM5Mjg4MjgwNDE2MTI5OTc1ODcwODAzMzM3MyAtPiAtMzYuOTUwNTg1OTcwOTgwODU3Mzc2MDgxMjY1MDczMjc2MzAzNjcwODIwMDU2OTE2MjA2IEluZXhhY3QgUm91bmRlZAorbG54MTUxOSBsbiAwLjAwMDAwMDAwMDA2OTkwMjQ0OTE2MDI2NDI5OTA0NDk4Mjc4OTgyNTMwMTcwMjk1NjY4IC0+IC0yMy4zODM5MjA0MjkyNDQ0NTc1NzgzNzM1MjM1MDg0Mjc3ODMxNDQ1ODk0ODA0MjA3NTMgSW5leGFjdCBSb3VuZGVkCitsbngxNTIwIGxuIDQuMDMxMjU0Mjk3NzA3MDMwMDA3MDUwNjA2NDY2NjUzNjQ3ODM3MzgwMTk4ODU0MDYxNCAgLT4gMS4zOTQwNzc1Njc2NTkyNDUxOTQ1Nzk1NzUyNzk2NDIxMzkxODcxMzAyMDI0NzYzMzA1IEluZXhhY3QgUm91bmRlZAorbG54MTUyMSBsbiAyNzEuODQ5OTEzMTE1NTE4NzU2MDE0MzI1MTg4MTk1NjIzOTE2OTkzMjQ2MzIzOTY0MjMgIC0+IDUuNjA1MjUwMTIzOTg3Mzg2MjUxNzkxNjY3OTc0NzE0NjUzOTgwODA3NzQzMTg3MzQ3OCBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MjIgbG4gNy40MTE4NjcxNjI5MzczODY0NjY3MjI5NDQ1NzQ2ODYyMzE0NDQzODk1NDA0ODE4Njg5ICAtPiAyLjAwMzA4MjM4NjM3MDYzNDQ2MjgyMzkxNDc2MzkzMTgyODk5NjE5MTcwNjAxMjExNDEgSW5leGFjdCBSb3VuZGVkCitsbngxNTIzIGxuIDAuMDAwMDAwMDAwMDAwMDIwMjYzMTE0NTI2MjUzNjQ5MDUzNTczMjE2NjQxODYwMzQyNTggLT4gLTMxLjUyOTk3NDE4MDA1NDQzODc5MjA0Mzg1Njg3NzMxNDA0Mzc5NDMyMDk1MTEzNDc1NCBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MjQgbG4gMC4wMDAwMDAwMDAwMDAwOTU2MzM5ODY1MTI2MTc1Njk1MjM5ODI1MDYyNDczNzgwOTM0NyAtPiAtMjkuOTc4MjQ4MTMwNTc2OTcyOTUzMTQxMjg0MTM2OTYyNjcwMDIxMzY4ODM0NzkyNTc5IEluZXhhY3QgUm91bmRlZAorbG54MTUyNSBsbiAwLjAwMDAwMDAwMDA5NTU2NzcyNjY5NDA5ODU4NjUzMDI2NTU4MjIzNDY1MTk3ODA4OTkxIC0+IC0yMy4wNzExODU5Mzk3NDgyODU1NDEyMjgyMDYxNjE0NzI5NTY2NjExOTY5NTY3NDExODYgSW5leGFjdCBSb3VuZGVkCitsbngxNTI2IGxuIDYuODQ0MTY0ODI5ODAyNzMwMTI5MjM0MjA1NzI0ODczNzMyNjE1MjI1MDc5NDAyNjc2MSAgLT4gMS45MjMzOTY0Mzk1ODAxOTQ2NTk3MjcyNTg5NDczNDE3OTQ4MDI0MzYxMDA1MDgyOTA4IEluZXhhY3QgUm91bmRlZAorbG54MTUyNyBsbiAwLjAwMDAwMDAwMDAwMDczMDU5Njk5ODg0NDM5OTc5Mzk0OTQ1ODIyMDM1NzA0MjY0NTc3IC0+IC0yNy45NDQ5MTQzODgzNTM3MjQ3MTg4MzYxMDE4Mjg2Nzc3NzE5NjcxMjg1MDk2MDMxNTggSW5leGFjdCBSb3VuZGVkCitsbngxNTI4IGxuIDAuMDAwMDAwMDAwMDAwMDAwMDI2MTAwNzgyODA0MTkwODIyNjMxMzgwNjQ3NDU0MTY3ODcgLT4gLTM4LjE4NDU2NjM2NzUxNjIwNzg4NTU3Mzc3MzMyMDEzNTk2NTc5ODcxNzEyMDczNTExNSBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MjkgbG4gMC4wMDAwMDAwMDAwMDAwMDAwMDE1MDI1OTUxNzE2NjI5NDI0MzA4ODU0NjgwNjA4MzI4MyAtPiAtNDEuMDM5MzM3OTQ2MjY2Njc2MTA4NTM4MTcwODM3NTgwMDUxNjk5NjE4MzM0OTI4NDIxIEluZXhhY3QgUm91bmRlZAorbG54MTUzMCBsbiAwLjAwMDAwMDAwMDAwMDAwMDg3OTE5MTYwNTQxNzE0NTgwNzA3MTgxOTY5NzA4NTAyMDkxIC0+IC0zNC42Njc1Mjg4MTg4Mjc2NzE1MDc1MTQzMTk3NDQwNDc0NDA2OTYxODczNTg2NzY4NDggSW5leGFjdCBSb3VuZGVkCitsbngxNTMxIGxuIDAuMDAwMDAwMDAwMDAzOTU3MjY3MjUxMjA3ODc3NjMyNzE4NDk1Nzc3MDgwNjg1ODQ1OTggLT4gLTI2LjI1NTQ2NzQxNjk2MTM1Nzc0MTgxODczNTc4NzIyNjY3MTkzODY3ODQyNDc0ODQzMSBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MzIgbG4gMC4wMDAwMDAwMDAwMjAxNDMzNDkwMTY2OTM2NjIxODAxODM3NzIxMzE1MDcxNTkzODM1NSAtPiAtMjQuNjI4MTQ2OTU1NjM1MzU5MDM1Mjg5MTIzMDI3MzE5OTY5MjAxNjkzNzM3MTU5MTA4IEluZXhhY3QgUm91bmRlZAorbG54MTUzMyBsbiAwLjAwMDAwMDA4MDk3OTI3MTAxMTAxMDkzMTE3NzUzOTM4NzY2MjQxNDQyODk2MDMwNjM3IC0+IC0xNi4zMjkwNzI2Mjg0Njk3MTUxNzg2MzcxNzgzNjU3MTAzNzMzOTgyMDMxOTA5Mzc0NTQgSW5leGFjdCBSb3VuZGVkCitsbngxNTM0IGxuIDAuMDAwMDAwMDAwMDAwMTcxMTU4MzQxNjI2MzI4NjQzOTIwMzk2NjgxMTYyNDM5ODQxNzYgLT4gLTI5LjM5NjE4NzI5MjQzNDg5ODIyNTQ1MzYyNjc5NDQ1OTI4NTE1NzI2MzE3NzUyODAzNCBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MzUgbG4gMC4zOTE2ODMxNzU5Mzg2NjMzNDA4NzMwNTQ1OTkzMzcyMzg2NDI5NDg1NzA4NjEwNTAzNSAtPiAtMC45MzczMDE5OTA2Mjc1NzI0MDQ4NTgzNjYzNzMwNjc4NTAzNzM2ODc0NjczNzY5MzAyOSBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MzYgbG4gNzkuMzM1MDM2Nzk4OTcxNTE1MDI2NTE5NjMwMTAzMzI1MzY5NzI5NjM3NTE0MTI3NjE3ICAtPiA0LjM3MzY3OTg1NzAyODc4Mjg4MjM3NzIxNDk3MzUxNzA0MzEwMTA2MTY5NjE5NzY5NjUgSW5leGFjdCBSb3VuZGVkCitsbngxNTM3IGxuIDAuMDAwMDAwMDAwMDAwMDAwNTYwMDQ5NTIxMjk5MjYxMzc0MTM2MDIxMTY1OTE0OTM2MjUgLT4gLTM1LjExODUwNjQ2MzE4MTg3MDAyMDczMDY4NTg4NDMzMzAwMDI0MTAzOTAyODEyNzIxMyBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MzggbG4gMC4wMDAwMDAwNjAwNjAzNTkwNzg0Mzg5MDkxODgzMjQ4MTA5OTY2MDYzOTU1MzY2NjA3OCAtPiAtMTYuNjI3OTE1Nzk1NzQ3MTEyNTY2NTMyNzA1OTc0ODUzMTE0NDU0NDA1MDEwNDcyMDQzIEluZXhhY3QgUm91bmRlZAorbG54MTUzOSBsbiAwLjAwMDAwMDAwMDg1MjQyMDI0OTM3NDE0OTA2MzcxMzMzODI2NTc0NjMyNDUwNTg3NTkwIC0+IC0yMC44ODI5NDE0NjAyNjgxMDEwODAxODY0ODIyMzA2NTc3NzQ5OTcyNzM0OTQxMDcyMjEgSW5leGFjdCBSb3VuZGVkCitsbngxNTQwIGxuIDAuMDAwMDAwMDAwMDAwNDM2NzEwOTk0OTkyNjIzNTAzMTYxNzMyNDY1NTA3NzE5NTE1NjEgLT4gLTI4LjQ1OTUwNDc1NzI4NTYzOTIyMTc3NjMwNTk2ODQ2OTA1ODg1NDU1ODcyNjU5Mzk0NSBJbmV4YWN0IFJvdW5kZWQKKworLS0gUD0zNCwgd2l0aGluIDAtOTk5CitQcmVjaXNpb246IDM0CitsbngxMjAxIGxuIDAuMDA4NjczMjg4MDgxNTkyNzE4Mjk5NzU2NjgxMDMzNDM5NCAtPiAtNC43NDc1MDczMTE5MjA4NDQ3NTI0ODY5MzgxODc5NzM3MjEgSW5leGFjdCBSb3VuZGVkCitsbngxMjAyIGxuIDAuMDAwNzEwNDEwMzY5MzQ2MDI2MDYwOTc5MjIyMjU2OTg1NCAtPiAtNy4yNDk2Njc3Njk5MDM1MDMwMjMwMDU1NDkyNTAzNDc2OTUgSW5leGFjdCBSb3VuZGVkCitsbngxMjAzIGxuIDc4Ni44Mzk4OTQ1Mzg1MTA1MTkwNjk3NTQxNDkzMzkyNzQyICAtPiA2LjY2ODAyNDc5MDAzMTgzNjM0MDQ3MTgyNDE0NzAxMDU0NiBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMDQgbG4gMC43NzIzMDczNjIwMjgyNjg3NjU2ODk1MTkwMTcxOTY3Mzk5IC0+IC0wLjI1ODM3MjY3MDg1MDY4NTA4Njg3ODY4MTYyMzgyMTczMjYgSW5leGFjdCBSb3VuZGVkCitsbngxMjA1IGxuIDAuMDA2MTA1Nzk1MTUxNzE5NzYzMTI4NzE4MzkzODQxMjIwMCAtPiAtNS4wOTg1MTY5MzM5MTg3OTczNDcwNjQ0NTQxMDM3NDI2MzUgSW5leGFjdCBSb3VuZGVkCitsbngxMjA2IGxuIDAuNjE4MTM3OTcwODE4NDM5MzczMDEwMzkxNzU2MjQ5ODc0NSAtPiAtMC40ODEwNDM1OTI2OTAzMzY1MDg3NDYzMzg3NzYwMzUwMDIxIEluZXhhY3QgUm91bmRlZAorbG54MTIwNyBsbiAwOS4xMzg4ODI2MTIyOTAzOTk4OTExMDc1MzM4OTA5Njc2MCAgLT4gMi4yMTI1MzgxMjU1MDc5NzU1NzQ1MDk1NjMwMjc2OTYwMjEgSW5leGFjdCBSb3VuZGVkCitsbngxMjA4IGxuIDgwMi4wMTA1NDE3MDYzMTQzNjk2NDk3MjkyMTU4MTQ3MTc0ICAtPiA2LjY4NzEyMTc1MjA1MjM0MTczNzIzNDgzMjIwMzM1MDIxNCBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMDkgbG4gNzc4Ljc3NDk3MTAzODc3NzM3MTM1MjMwMjg0OTczMzMwNTggIC0+IDYuNjU3NzIyMTM1MTI2OTM1NDcyMDg2NjI1MDMxNDEzMDMxIEluZXhhY3QgUm91bmRlZAorbG54MTIxMCBsbiAwLjAwMjQ0NTcyOTU4OTUzNDY1MDI1MTM1Njc2NzkzOTA2MTYgLT4gLTYuMDEzNDExNzk5OTQwMjQ1MzQ1MzIxMzQ4MjkwMzk4NTE3IEluZXhhY3QgUm91bmRlZAorbG54MTIxMSBsbiAwLjAwMDA1MTEyOTY5NDc4NzI4MjgzMTAzMzg4NjQyMTc4NjAgLT4gLTkuODgxMTQ1MTE4MjM3MjgxNzk4MDgxNTczMTMxNzExNjM2IEluZXhhY3QgUm91bmRlZAorbG54MTIxMiBsbiAwLjAwMDAyNDY4MDM1MDg2MDI1NTQ5MjQ5Mzg2ODUxNTU2NTggLT4gLTEwLjYwOTUwMzE0MjY0ODI1NjYxODI1MzYwOTcxNDMwMjE4IEluZXhhY3QgUm91bmRlZAorbG54MTIxMyBsbiA5LjAyNzg5ODE5OTI1MzUxMTY2ODI0Mjk3Nzc2NjYxNjA4MiAgLT4gMi4yMDAzMTk1ODI3Nzg4OTkwMjk3ODYwMTc4MzA1NTcyOTMgSW5leGFjdCBSb3VuZGVkCitsbngxMjE0IGxuIDAuMDk5MTgxMjM5NjU0MjUwNTYzMTg1MDY5MjgwMDkwNDE4OCAtPiAtMi4zMTA4MDYzOTg5NjQ2NzIyNTg4MjMwNDMxODA0MDAzODQgSW5leGFjdCBSb3VuZGVkCitsbngxMjE1IGxuIDAuMDAwMDAwMDAwMDA3MDIzODgxMDE0MzAyODgxMTIyMzkyNCAtPiAtMjUuNjgxNzA1MTk5NjE2MzY2NDcxNzQ3MTQ1MzgyOTAwNzUgSW5leGFjdCBSb3VuZGVkCitsbngxMjE2IGxuIDIuNjMwMTAxNjY1MzQyODI2NDk0NzMwMzk0NzI5MzEzMTY3ICAtPiAwLjk2NzAyMjUwMTQ2NjQzNjc0NjUxMjgyNDMwMzk3NDk1NTkgSW5leGFjdCBSb3VuZGVkCitsbngxMjE3IGxuIDAuMDA1Njg3ODkyODU5NDM1OTU4NzY5MTUyNjA2MzI1NDY4MyAtPiAtNS4xNjk0MTU0MjI5MDQwMzc4MTk3MzY2MzczOTk0NDUwOTYgSW5leGFjdCBSb3VuZGVkCitsbngxMjE4IGxuIDU2Ny4zNDM2MDQ3MTIxMDU3ODQzOTA4MTA2NTczMDk1NTkwICAtPiA2LjM0MDk2NTEyNDk2NDI1ODQ4NjQ2MzQ0NDM2MDc4Nzk3MCBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMTkgbG4gMS4xOTkyOTEyNDgxMjQ2NTU5OTY2MTQ2MDU3NDU2NDk3MjUgIC0+IDAuMTgxNzMwNzU1NzQyNTkxMTgwNTc2NTA4Nzc1NTY3NTY1NyBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMjAgbG4gMjUuMDIwNTA0NDg1ODIwMzEwOTg2OTYyNjc0NzkxMzU1NTcgIC0+IDMuMjE5Njk1NjY4MTM3NjU5MTM5NTQ0MTc4OTA1NDU5MzE3IEluZXhhY3QgUm91bmRlZAorbG54MTIyMSBsbiAwLjAwMDAwMDAwMDAwMDk5Mzk1OTcwMjM1NTg3NTY5NjEzMDAgLT4gLTI3LjYzNzA3OTcyOTk2NTM3NjM2NTA0Mzk2NTU4MjU5MDU4IEluZXhhY3QgUm91bmRlZAorbG54MTIyMiBsbiAwLjAwMDAwMDc5ODg1NTE2NzAxNTk0Mjk3MTY1MDY0MzA0MDMgLT4gLTE0LjA0MDA4NjE3NTQyNTk3MjMwOTg4MTk4NjEyMzc2NDE1IEluZXhhY3QgUm91bmRlZAorbG54MTIyMyBsbiA0LjY4MTUxNTgwMDE3NjEyOTE4NDg3Mzc3MDYwNTU4OTc5NSAgLT4gMS41NDM2MjE5NDY0MTUzODMzMzg5NzIxMjQ0NDU0NDU3NDggSW5leGFjdCBSb3VuZGVkCitsbngxMjI0IGxuIDE1Ljk1MTI2NjY5MTYxMTAzMDExMjA2NjU4NzQ5MzQ1NzgxICAtPiAyLjc2OTUzODI0MjQ3OTQ4MzUzOTI3NTk4NjM5NTQ0MzUzOSBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMjUgbG4gMC4wMzAxNjI2NzgzOTIyMjExMjEzNjc1NDU3Mjc5MDc2MDY2IC0+IC0zLjUwMTE0OTkzMzY3NzI4MzM0MTAyMzkzMjI4MTgyNjM0MSBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMjYgbG4gMDAwLjAwNDA1NDQwNjQ4ODE4MjE3NzA1Mjg0NzUxODU2NzQgIC0+IC01LjUwNzk1MDk2NzU1NzAyMTY3MTY0NzE2NTg4OTYwODMyNCBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMjcgbG4gMjkuMDE2MTcwOTU5MzU1OTM3OTIwOTU5MTM3ODUxMDAzNjAgIC0+IDMuMzY3ODUzMjkzODYyNzQ1NjUxODg4NDUwMDA0NDczMjk3IEluZXhhY3QgUm91bmRlZAorbG54MTIyOCBsbiA3OC4wMTgzNjE2NzM0NDczNjczMzAyNDgwNDI0MzE5NTMyMyAgLT4gNC4zNTY5NDQyMDUwNTU3Njg1NzU5ODc3ODEzNzUwMDM5OTIgSW5leGFjdCBSb3VuZGVkCitsbngxMjI5IGxuIDAuMDAwMDAwMDA5NjU0NTMxOTMxNjk2NTMyMTE1ODYzNDg5MyAtPiAtMTguNDU1ODM4NDAxNjA5NjU4MTQ0NjIwOTU0NzczNjUwMTMgSW5leGFjdCBSb3VuZGVkCitsbngxMjMwIGxuIDk3Ljk1NDc1MjM3NzIwNTc5NzUyNzcwNTg3MTg1MDc0NDI4ICAtPiA0LjU4NDUwNTY2MTYxMjgxMjc0MjIwODYxOTM1ODIxNDcyOSBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMzEgbG4gNTI4LjA2MDkyNjIwNTA0MjMyNDY0MDI1NjQyMjg0MzIzNzEgIC0+IDYuMjY5MjExNjY3NTg5MTM4MTEzMzk2NTgzODk0MzE1OTU2IEluZXhhY3QgUm91bmRlZAorbG54MTIzMiBsbiAwLjAwMDAwMDIyNTAwNjQzNDk3MzI5Njk2OTY2NjA0NTI5NzIgLT4gLTE1LjMwNzEzNjgzNTI2OTYzOTk2NzEyMTY3NzAxNzM4NzI0IEluZXhhY3QgUm91bmRlZAorbG54MTIzMyBsbiA0Ny45NzA2MzYzNzc2Nzk5ODY1ODU2NzE5OTA0OTcyNTc1NCAgLT4gMy44NzA1ODkwODE1ODU2NjA2OTIxOTU5ODk4NTQ4NDIzNzIgSW5leGFjdCBSb3VuZGVkCitsbngxMjM0IGxuIDAuMDAwNTM5NDMxMTM0NDU0MTQzMjMxODg1MzUxMzQxNDM2MSAtPiAtNy41MjQ5OTU0MjgzOTM5MjU5MzQwODcxMjY3MDI5NzQxMjEgSW5leGFjdCBSb3VuZGVkCitsbngxMjM1IGxuIDAuMDAwMDAwMDA5MDk3MzM4NTY0OTU2NzQ3MTY3NDk3MjYzMyAtPiAtMTguNTE1MjgzOTMxNTg5MzE3ODM0NDcwMzUwMDQxMjU3OTEgSW5leGFjdCBSb3VuZGVkCitsbngxMjM2IGxuIDAuMDAwMDAwMDAwMDIzODc3NjQ5MDIyNzU3NjE5NzMxNzk3NyAtPiAtMjQuNDU4MDc4MjgxODgzODk1NjEzMzExNTg4NzkyMDcyNjIgSW5leGFjdCBSb3VuZGVkCitsbngxMjM3IGxuIDAuMDAwMDIzNjU4NzAwMDIzMTkyMTUzMjE0NTMyNjIxODc1OCAtPiAtMTAuNjUxNzc5NjQ0OTk4MjMzMTQ5NTI0MjkyNzc5NzkwMzQgSW5leGFjdCBSb3VuZGVkCitsbngxMjM4IGxuIDQ5OS4xMjc3NDQ4ODQ2MTMwNzA5ODI3MTU0NTU2MTI1OTQyICAtPiA2LjIxMjg2MjA2NDc2MTQyNzk2NzQ2MTE4ODA4MzUxNDc3NCBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMzkgbG4gMC4wMDAwMDAzOTYwMTkyMzAwMjg0Nzg3NjYzNzEyNDE3NjQ3IC0+IC0xNC43NDE4MDMwNjYxOTI5ODU0ODA5MzY5NzYwODI5MzI4NCBJbmV4YWN0IFJvdW5kZWQKK2xueDEyNDAgbG4gNDEuMDgyNjgzNTA4Mjk0Nzc0NTE2NjcyMjg4OTI0OTUxMzYgIC0+IDMuNzE1NTg2NzA2ODg3Mjc4MDM5MTczNTg0ODU5MjE4OTYwIEluZXhhY3QgUm91bmRlZAorCistLSBQPTE2LCB3aXRoaW4gMC05OQorUHJlY2lzaW9uOiAxNgorbG54MTEwMSBsbiA3Ljk2NDg3NTI2MTAzMzk0OCAgLT4gMi4wNzUwNDEyODIzNTIyNDEgSW5leGFjdCBSb3VuZGVkCitsbngxMTAyIGxuIDEzLjU0NTI3Mzk2ODQ1Mzk0ICAtPiAyLjYwNjAzNzcwMTg3MDI2MyBJbmV4YWN0IFJvdW5kZWQKK2xueDExMDMgbG4gMC4wMDA4MDI2NTU0MzQxMzMxIC0+IC03LjEyNzU4NTAzNDMyMTgxNCBJbmV4YWN0IFJvdW5kZWQKK2xueDExMDQgbG4gMC4wMDAwMDMwNTgyMjMzMjYxIC0+IC0xMi42OTc2NzY0MjMwMDYyNSBJbmV4YWN0IFJvdW5kZWQKK2xueDExMDUgbG4gMC4wMDA0NDc3NDk3NTA5NjcyIC0+IC03LjcxMTI3NjA3MzIxMDc2NiBJbmV4YWN0IFJvdW5kZWQKK2xueDExMDYgbG4gNy42MTYyNjg2MjI0NzQzNzEgIC0+IDIuMDMwMjg2NTY3Njc1MTQ4IEluZXhhY3QgUm91bmRlZAorbG54MTEwNyBsbiA1MS41ODMyOTkyNTgwNjM4MSAgLT4gMy45NDMxOTc5NjIzMDk1NjkgSW5leGFjdCBSb3VuZGVkCitsbngxMTA4IGxuIDAuMDAxODE5NzQ5Nzk1MTI2MyAtPiAtNi4zMDkwNTYyNjI1NDkzNDUgSW5leGFjdCBSb3VuZGVkCitsbngxMTA5IGxuIDIuOTU2MjgyNDU3MDcyOTg0ICAtPiAxLjA4MzkzMjU1MjMzNDU3NSBJbmV4YWN0IFJvdW5kZWQKK2xueDExMTAgbG4gMC4zODQzMzI1NTc5MTg5OTA2IC0+IC0wLjk1NjI0NzA2NDk0MDA1NTggSW5leGFjdCBSb3VuZGVkCitsbngxMTExIGxuIDAuMDA3NDQ2NjMyOTI2NTY2MyAtPiAtNC44OTk5OTMzMDQ5MTkyMzcgSW5leGFjdCBSb3VuZGVkCitsbngxMTEyIGxuIDAuMDAwMzM3MjQ3ODUzMjk5MyAtPiAtNy45OTQ2OTI0MjgyMDYzNzggSW5leGFjdCBSb3VuZGVkCitsbngxMTEzIGxuIDAuMDA4NDc5MjI2MzE2NzgwOSAtPiAtNC43NzAxMzYwNjk1NjkyNzEgSW5leGFjdCBSb3VuZGVkCitsbngxMTE0IGxuIDUuOTI2NzU2OTk4MTUxMTAyICAtPiAxLjc3OTQ3NzE4MjgzNDMwNSBJbmV4YWN0IFJvdW5kZWQKK2xueDExMTUgbG4gOS4wMjU2OTkxNTIxODA4OTcgIC0+IDIuMjAwMDc1OTY5NjA0MTE5IEluZXhhY3QgUm91bmRlZAorbG54MTExNiBsbiAxLjkxMDEyNDY0MzUzMzUyNiAgLT4gMC42NDcxNjg0OTgzMjM4MTgzIEluZXhhY3QgUm91bmRlZAorbG54MTExNyBsbiAwLjgxNTg5MjI3MTE0MTEwMjAgLT4gLTAuMjAzNDcyOTUzMzkzOTM4NyBJbmV4YWN0IFJvdW5kZWQKK2xueDExMTggbG4gMC4wMDY3MDgwMDE2NDc1MzIyIC0+IC01LjAwNDQ1NDE4OTQxNDEzOSBJbmV4YWN0IFJvdW5kZWQKK2xueDExMTkgbG4gMC4wMDQ3NTgzMjQyMDkyNzE2IC0+IC01LjM0Nzg1OTcyOTYwMTA5NCBJbmV4YWN0IFJvdW5kZWQKK2xueDExMjAgbG4gMC4wMzg2NjQ3NDExNjQxMzM5IC0+IC0zLjI1MjgyNzE3NTI2MzExMyBJbmV4YWN0IFJvdW5kZWQKK2xueDExMjEgbG4gMC4wMDUwMjI2NDI3ODQxNzYxIC0+IC01LjI5Mzc5OTAzMjc3NDEzMSBJbmV4YWN0IFJvdW5kZWQKK2xueDExMjIgbG4gNi45Mjc5Mzc1NDE2MzcyNjEgIC0+IDEuOTM1NTYyMTU1ODY2OTA2IEluZXhhY3QgUm91bmRlZAorbG54MTEyMyBsbiAwLjAwMDAwOTU3NDUzNDM1MTMgLT4gLTExLjU1NjQwMzY1NTc5ODE0IEluZXhhY3QgUm91bmRlZAorbG54MTEyNCBsbiAxLjYwMjQ2NTQ5Mjk1NjUzOCAgLT4gMC40NzE1NDMzNzYzMjQzOTM2IEluZXhhY3QgUm91bmRlZAorbG54MTEyNSBsbiAzOC45ODQxNTYyNTA4NzUzNSAgLT4gMy42NjMxNTUzMTM2MTAyMTMgSW5leGFjdCBSb3VuZGVkCitsbngxMTI2IGxuIDUuMzQzMTgyMDQyMjc2NzM0ICAtPiAxLjY3NTgyMTM2MzU2ODExMiBJbmV4YWN0IFJvdW5kZWQKK2xueDExMjcgbG4gNTUuODk3NjM3MDMyNDU4MTYgIC0+IDQuMDIzNTIyMTA3OTM0MTEwIEluZXhhY3QgUm91bmRlZAorbG54MTEyOCBsbiAwLjc0NDUyNTc4MTAyODA4NDcgLT4gLTAuMjk1MDA3Nzk4ODEwMTAzMCBJbmV4YWN0IFJvdW5kZWQKK2xueDExMjkgbG4gMS42MzE0MDczMTQ5NDYwOTQgIC0+IDAuNDg5NDQzMDI1NzIwMTI0OCBJbmV4YWN0IFJvdW5kZWQKK2xueDExMzAgbG4gMC4wMDA1NDYyNDUxOTMyNjAyIC0+IC03LjUxMjQ0MjYxMTExNjg1MiBJbmV4YWN0IFJvdW5kZWQKK2xueDExMzEgbG4gMC4wMDAwODY0MTczMjY5MzYyIC0+IC05LjM1NjMyMjM1OTAxNzMxNyBJbmV4YWN0IFJvdW5kZWQKK2xueDExMzIgbG4gNS4yMjcxNjE3MTkxMzI4NDkgIC0+IDEuNjUzODY4NDM4NDM5NjM3IEluZXhhY3QgUm91bmRlZAorbG54MTEzMyBsbiA2MC41NzA3ODQ2Njk0MTk5OCAgLT4gNC4xMDM4MTI2NzU2NjI0NTIgSW5leGFjdCBSb3VuZGVkCitsbngxMTM0IGxuIDAuMDk5Mjg2NDMyNTMzMzE2MCAtPiAtMi4zMDk3NDYzNDgzNTAzMTggSW5leGFjdCBSb3VuZGVkCitsbngxMTM1IGxuIDA5LjQ4NTY0MjY4NDQ3MzI1ICAtPiAyLjI0OTc3OTM1OTA3NDk4MyBJbmV4YWN0IFJvdW5kZWQKK2xueDExMzYgbG4gMC4wMDM2MTA2MDg5MzU1NjM0IC0+IC01LjYyMzg3ODg0MDY1MDc4NyBJbmV4YWN0IFJvdW5kZWQKK2xueDExMzcgbG4gMS44MDUxNzY4NjU1ODcxNzIgIC0+IDAuNTkwNjU4NTczNDU5MzcwNyBJbmV4YWN0IFJvdW5kZWQKK2xueDExMzggbG4gNjIuNTkzNjMyNTk2NDIyNTUgIC0+IDQuMTM2NjYzNTU3MjIwNTU5IEluZXhhY3QgUm91bmRlZAorbG54MTEzOSBsbiA0LjM3MzgyODI2MTEzNzIwMSAgLT4gMS40NzU2Mzg2NTc5MTIwMDAgSW5leGFjdCBSb3VuZGVkCitsbngxMTQwIGxuIDAuOTk0NDgzNTI0MTQ4NzM4ICAtPiAtMC4wMDU1MzE3NDc3OTQ5Mzg2OTAgSW5leGFjdCBSb3VuZGVkCisKKy0tIFA9Nywgd2l0aGluIDAtOQorUHJlY2lzaW9uOiA3CitsbngxMDAxIGxuIDAuMDkxMjAyNSAtPiAtMi4zOTQ2NzMgSW5leGFjdCBSb3VuZGVkCitsbngxMDAyIGxuIDAuOTcyODYyNiAtPiAtMC4wMjc1MTI0MiBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMDMgbG4gMC4zODg2MDMyIC0+IC0wLjk0NTE5NjUgSW5leGFjdCBSb3VuZGVkCitsbngxMDA0IGxuIDguNzk4NjM5ICAtPiAyLjE3NDU5NyBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMDUgbG4gMi40NTkxMjEgIC0+IDAuODk5ODA0MCBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMDYgbG4gMi4wMTMxOTMgIC0+IDAuNjk5NzIyMCBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMDcgbG4gOS4wNjQ4NTcgIC0+IDIuMjA0NDA1IEluZXhhY3QgUm91bmRlZAorbG54MTAwOCBsbiA1Ljc5NjQxNyAgLT4gMS43NTcyNDAgSW5leGFjdCBSb3VuZGVkCitsbngxMDA5IGxuIDAuMTE0MzQ3MSAtPiAtMi4xNjg1MTcgSW5leGFjdCBSb3VuZGVkCitsbngxMDEwIGxuIDAuNTM0MTU0MiAtPiAtMC42MjcwNzA3IEluZXhhY3QgUm91bmRlZAorbG54MTAxMSBsbiA2LjY5Mzc4MSAgLT4gMS45MDExNzkgSW5leGFjdCBSb3VuZGVkCitsbngxMDEyIGxuIDAuMDA4MTc3OSAtPiAtNC44MDYzMjAgSW5leGFjdCBSb3VuZGVkCitsbngxMDEzIGxuIDguMzEzNjE2ICAtPiAyLjExNzg5NSBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMTQgbG4gMy40ODY5MjUgIC0+IDEuMjQ5MDIwIEluZXhhY3QgUm91bmRlZAorbG54MTAxNSBsbiAwLjE4MDE0MDEgLT4gLTEuNzE0MDIwIEluZXhhY3QgUm91bmRlZAorbG54MTAxNiBsbiAwLjUyMjcxNDggLT4gLTAuNjQ4NzE5MyBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMTcgbG4gNy44MTgxMTEgIC0+IDIuMDU2NDQzIEluZXhhY3QgUm91bmRlZAorbG54MTAxOCBsbiAwLjA4NzA2NzEgLT4gLTIuNDQxMDc2IEluZXhhY3QgUm91bmRlZAorbG54MTAxOSBsbiA4LjE1Mzk2NiAgLT4gMi4wOTg1MDQgSW5leGFjdCBSb3VuZGVkCitsbngxMDIwIGxuIDIuMDQwOTc1ICAtPiAwLjcxMzQyNzYgSW5leGFjdCBSb3VuZGVkCitsbngxMDIxIGxuIDEuNDgxNjQyICAtPiAwLjM5MzE1MDkgSW5leGFjdCBSb3VuZGVkCitsbngxMDIyIGxuIDAuMjYxMDEyMyAtPiAtMS4zNDMxODggSW5leGFjdCBSb3VuZGVkCitsbngxMDIzIGxuIDAuNDY2NzIzICAtPiAtMC43NjIwMTkzIEluZXhhY3QgUm91bmRlZAorbG54MTAyNCBsbiAwLjA1MTg3NTYgLT4gLTIuOTU4OTA3IEluZXhhY3QgUm91bmRlZAorbG54MTAyNSBsbiAyLjA1NjQxMCAgLT4gMC43MjA5NjE3IEluZXhhY3QgUm91bmRlZAorbG54MTAyNiBsbiAwLjE4MTUyMiAgLT4gLTEuNzA2Mzc4IEluZXhhY3QgUm91bmRlZAorbG54MTAyNyBsbiAwLjUxNTU1MSAgLT4gLTAuNjYyNTE5MCBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMjggbG4gOC40MjUwODkgIC0+IDIuMTMxMjE0IEluZXhhY3QgUm91bmRlZAorbG54MTAyOSBsbiAyLjA3NzA5MSAgLT4gMC43MzA5Njg0IEluZXhhY3QgUm91bmRlZAorbG54MTAzMCBsbiA2LjIxMjcwNSAgLT4gMS44MjY1OTYgSW5leGFjdCBSb3VuZGVkCitsbngxMDMxIGxuIDUuNzI5MzQzICAtPiAxLjc0NTYwMSBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMzIgbG4gNC44MzEyNTEgIC0+IDEuNTc1MTA1IEluZXhhY3QgUm91bmRlZAorbG54MTAzMyBsbiAyLjAyOTc2MCAgLT4gMC43MDc5MTc2IEluZXhhY3QgUm91bmRlZAorbG54MTAzNCBsbiA4LjYxNTA2MCAgLT4gMi4xNTM1MTIgSW5leGFjdCBSb3VuZGVkCitsbngxMDM1IGxuIDAuMDYxMTUxMSAtPiAtMi43OTQ0MDcgSW5leGFjdCBSb3VuZGVkCitsbngxMDM2IGxuIDUuMTk1MjY5ICAtPiAxLjY0Nzc0OCBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMzcgbG4gOS42MTc2ODYgIC0+IDIuMjYzNjA0IEluZXhhY3QgUm91bmRlZAorbG54MTAzOCBsbiAwLjAwNDkzODIgLT4gLTUuMzEwNzU0IEluZXhhY3QgUm91bmRlZAorbG54MTAzOSBsbiAyLjc4Njg0MCAgLT4gMS4wMjQ5MDggSW5leGFjdCBSb3VuZGVkCitsbngxMDQwIGxuIDAuMDA5MTA3MyAtPiAtNC42OTg2NzkgSW5leGFjdCBSb3VuZGVkCisKKy0tIGZyb20gaGVyZSAzLWRpZ2l0IHRlc3RzIGFyZSBiYXNlZCBvbiByZXZlcnNlIGV4cCB0ZXN0cworcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK2xueDAwMSAgbG4gMCAgICAgICAgICAgLT4gIC1JbmZpbml0eQorbG54MDAyICBsbiAwLjM2Nzg3OTQ0MSAtPiAgLTEuMDAwMDAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMDMgIGxuIDEgICAgICAgICAgIC0+ICAgMAorbG54MDA1ICBsbiAyLjcxODI4MTgzICAtPiAgIDEuMDAwMDAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMDYgIGxuIDIuMDAwMDAwMDAgIC0+ICAgMC42OTMxNDcxODEgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAwNyAgbG4gK0luZmluaXR5ICAgLT4gICBJbmZpbml0eQorCistLSB0aW55IGVkZ2UgY2FzZXMKK3ByZWNpc2lvbjogICA3CitsbngwMTEgIGxuIDEuMTA1MTcxIC0+ICAwLjEwMDAwMDEgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTIgIGxuIDEuMDEwMDUwIC0+ICAwLjAwOTk5OTgzNSAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTMgIGxuIDEuMDAwMDEwIC0+ICAwLjAwMDAwOTk5OTk1MCAgSW5leGFjdCBSb3VuZGVkCitsbngwMTQgIGxuIDEuMDAwMDAxIC0+ICA5Ljk5OTk5NUUtNyAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTUgIGxuIDEuMDAwMDAwIC0+ICAwCisKKy0tIGJhc2ljIGU9MCwgZT0xLCBlPTIsIGU9NCwgZT49OCBjYXNlcworcHJlY2lzaW9uOiAgIDcKK2xueDA0MSAgbG4gMi43MTgyODIgICAgICAtPiAgMS4wMDAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwNDIgIGxuIDAuMzY3ODc5NCAgICAgLT4gLTEuMDAwMDAwICAgIEluZXhhY3QgUm91bmRlZAorbG54MDQzICBsbiAyMjAyNi40NyAgICAgIC0+ICAxMC4wMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDA0NCAgbG4gMC4wMDAwNDUzOTk5MyAtPiAtMTAuMDAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwNDUgIGxuIDIuNjg4MTE3RSs0MyAgLT4gIDEwMC4wMDAwICAgIEluZXhhY3QgUm91bmRlZAorbG54MDQ2ICBsbiAzLjcyMDA3NkUtNDQgIC0+IC0xMDAuMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDA0NyAgbG4gSW5maW5pdHkgICAgICAtPiAgSW5maW5pdHkKK2xueDA0OCAgbG4gMEUtMzg5ICAgICAgICAtPiAtSW5maW5pdHkKKworLS0gbWlzY2VsbGFuZWEKK3ByZWNpc2lvbjogMTYKK2xueDA1NSAgbG4gMi43MTc2NTg0ODY4ODQ1NzJFLTIzNiAgICAgLT4gLTU0Mi40MTAzMTEyODc0NDE1ICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNworbG54MDU2ICBsbiAyLjcxNzY1ODQ4Njg4NDU3MjFFLTIzNiAgICAtPiAtNTQyLjQxMDMxMTI4NzQ0MTQ2ICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE4CitsbngwNTcgIGxuIDIuNzE3NjU4NDg2ODg0NTcyMTFFLTIzNiAgIC0+IC01NDIuNDEwMzExMjg3NDQxNDU5ICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTkKK2xueDA1OCAgbG4gMi43MTc2NTg0ODY4ODQ1NzIxMTJFLTIzNiAgLT4gLTU0Mi40MTAzMTEyODc0NDE0NTkyICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMAorbG54MDU5ICBsbiAyLjcxNzY1ODQ4Njg4NDU3MjExMThFLTIzNiAtPiAtNTQyLjQxMDMxMTI4NzQ0MTQ1OTE3ICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGlucHV0cyBlbmRpbmcgaW4gLi41MDAuLiwgLi40OTkuLiwgLi4xMDAuLiwgLi45OTkuLiBzZXF1ZW5jZXMKK3ByZWNpc2lvbjogICA1MAorbG54MTAyICBsbiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTg3ODUwMDAwMjcgLT4gLTkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzMzc0OTk1MzgyOTk5NjQ0NjEyNDg2MTc1MEUtOCAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMzAKK2xueDEwMyAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4Nzg1MDAwMDMgLT4gLTguOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTczMzc0OTlFLTggICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAyOQorbG54MTA0ICBsbiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTg3ODUwMDAwIC0+IC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3MzM3NTBFLTggICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjgKK2xueDEwNSAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4Nzg1MDAwIC0+IC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3MzM3NUUtOCAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjcKK2xueDEwNiAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4Nzg1MDAgLT4gLTkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjczMzhFLTggICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAyNgorbG54MTA3ICBsbiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTg3ODUwIC0+IC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3MzRFLTggICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjUKK2xueDEwOCAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4Nzg1IC0+IC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3M0UtOCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjQKK2xueDEwOSAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4NzkgLT4gLTguOTk5OTk5OTk5OTk5OTk5OTUwMDAwMjdFLTggICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAyMworbG54MTEwICBsbiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTg4IC0+IC04Ljk5OTk5OTk5OTk5OTk5OTg1MDAwMDNFLTggICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjIKK2xueDExMSAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk5IC0+IC04Ljk5OTk5OTk5OTk5OTk5Nzg1MDAwMEUtOCAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjEKK2xueDExMiAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNTAwMDAgLT4gLTguOTk5OTk5OTk5OTk5OTg3ODUwMDBFLTggICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAyMAorbG54MTEzICBsbiAwLjk5OTk5OTkxMDAwMDAwNDA1MDAwIC0+IC04Ljk5OTk5OTk5OTk5OTk4Nzg1MDBFLTggICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTkKK2xueDExNCAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNTAwIC0+IC04Ljk5OTk5OTk5OTk5OTk4Nzg1MEUtOCAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTgKK2xueDExNSAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNTAgLT4gLTguOTk5OTk5OTk5OTk5OTg3ODVFLTggICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5leHQgbWF5IGJlIGEgPiAwLjV1bHAgY2FzZTsgYSBtb3JlIHByZWNpc2UgYW5zd2VyIGlzOgorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC04Ljk5OTk5OTk5OTk5OTk4Nzg0OTk5OTE4RS04CitwcmVjaXNpb246ICAgMTcKK2xueDExNiAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNSAtPiAtOC45OTk5OTk5OTk5OTk5ODc4RS04ICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTYKK2xueDExNyAgbG4gMC45OTk5OTk5MTAwMDAwMDQwIC0+IC05LjAwMDAwMDAwNDk5OTk4OEUtOCAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDE1CitsbngxMTggIGxuIDAuOTk5OTk5OTEwMDAwMDA0IC0+IC05LjAwMDAwMDAwNDk5OTk5RS04ICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTQKK2xueDExOSAgbG4gMC45OTk5OTk5MTAwMDAwMCAtPiAtOS4wMDAwMDA0MDUwMDAwRS04ICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTMKK2xueDEyMCAgbG4gMC45OTk5OTk5MTAwMDAwIC0+IC05LjAwMDAwMDQwNTAwMEUtOCAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAxMgorbG54MTIxICBsbiAwLjk5OTk5OTkxMDAwMCAtPiAtOS4wMDAwMDA0MDUwMEUtOCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTEKK2xueDEyMiAgbG4gMC45OTk5OTk5MTAwMCAtPiAtOS4wMDAwMDA0MDUwRS04ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTAKK2xueDEyMyAgbG4gMC45OTk5OTk5MTAwIC0+IC05LjAwMDAwMDQwNUUtOCAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgOQorbG54MTI0ICBsbiAwLjk5OTk5OTkxMCAtPiAtOS4wMDAwMDA0MUUtOCAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDgKK2xueDEyNSAgbG4gMC45OTk5OTk5MSAtPiAtOS4wMDAwMDA0RS04ICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDcKK2xueDEyNiAgbG4gMC45OTk5OTk5IC0+IC0xLjAwMDAwMEUtNyAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAxNgorbG54MTI2YiBsbiAwLjk5OTk5OTkgLT4gLTEuMDAwMDAwMDUwMDAwMDAzRS03ICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICA2CitsbngxMjcgIGxuIDAuOTk5OTk5IC0+IC0wLjAwMDAwMTAwMDAwICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDUKK2xueDEyOCAgbG4gMC45OTk5OSAtPiAtMC4wMDAwMTAwMDAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgNAorbG54MTI5ICBsbiAwLjk5OTkgLT4gLTAuMDAwMTAwMCAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICAzCitsbngxMzAgIGxuIDAuOTk5IC0+IC0wLjAwMTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDIKK2xueDEzMSAgbG4gMC45OSAtPiAtMC4wMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgMQorbG54MTMyICBsbiAwLjkgLT4gLTAuMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorCisKKy0tIGNhc2VzIG5lYXIgMSAgICAgICAgICAgICAgLS0gIDEgMjM0NTY3ODkwMTIzNDU2Nzg5MAorcHJlY2lzaW9uOiAgICAyMAorbG54NDAxICBsbiAyLjcxODI4MTgyODQ1ODkzNjUwNDEgLT4gMC45OTk5OTk5OTk5OTk5NjAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2xueDQwMiAgbG4gMi43MTgyODE4Mjg0NTg5NjM2ODY5IC0+IDAuOTk5OTk5OTk5OTk5OTcwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitsbng0MDMgIGxuIDIuNzE4MjgxODI4NDU4OTkwODY5NyAtPiAwLjk5OTk5OTk5OTk5OTk3OTk5OTk5IEluZXhhY3QgUm91bmRlZAorbG54NDA0ICBsbiAyLjcxODI4MTgyODQ1OTAxODA1MjUgLT4gMC45OTk5OTk5OTk5OTk5ODk5OTk5OCBJbmV4YWN0IFJvdW5kZWQKK2xueDQwNSAgbG4gMi43MTgyODE4Mjg0NTkwNDUyMzU0IC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitsbng0MDYgIGxuIDIuNzE4MjgxODI4NDU5MzE3MDYzNSAtPiAxLjAwMDAwMDAwMDAwMDEwMDAwMDAgIEluZXhhY3QgUm91bmRlZAorbG54NDA3ICBsbiAyLjcxODI4MTgyODQ1OTU4ODg5MTcgLT4gMS4wMDAwMDAwMDAwMDAyMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgMTQKK2xueDQxMSAgbG4gMi43MTgyODE4Mjg0NTg5IC0+IDAuOTk5OTk5OTk5OTk5OTUgICAgSW5leGFjdCBSb3VuZGVkCitsbng0MTMgIGxuIDIuNzE4MjgxODI4NDU5MCAtPiAwLjk5OTk5OTk5OTk5OTk4ICAgIEluZXhhY3QgUm91bmRlZAorbG54NDE2ICBsbiAyLjcxODI4MTgyODQ1OTEgLT4gMS4wMDAwMDAwMDAwMDAwICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDQxNyAgbG4gMi43MTgyODE4Mjg0NTkyIC0+IDEuMDAwMDAwMDAwMDAwMSAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG92ZXJmbG93cywgaW5jbHVkaW5nIHNvbWUgZXhwIG92ZXJwcmVjaXNlIGJvcmRlcmxpbmVzCitwcmVjaXNpb246ICAgNworbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2xueDcwOSAgbG4gOS45OTk5OTlFKzM4NCAtPiAgODg2LjQ5NTMgICAgIEluZXhhY3QgUm91bmRlZAorbG54NzExICBsbiA5Ljk5OTk5MkUrMzg0IC0+ICA4ODYuNDk1MyAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTYKK2xueDcyMiAgbG4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtPiAgODg2LjQ5NTI2MDgwMjcwNzYgICAgIEluZXhhY3QgUm91bmRlZAorbG54NzI0ICBsbiA5Ljk5OTk5OTk5OTk5OTkxN0UrMzg0IC0+ICA4ODYuNDk1MjYwODAyNzA3NiAgICAgSW5leGFjdCBSb3VuZGVkCitsbng3MjYgIGxuIDkuOTk5OTk5OTk5OTk5MTE3RSszODQgLT4gIDg4Ni40OTUyNjA4MDI3MDc1ICAgICBJbmV4YWN0IFJvdW5kZWQKKy0tIGFuZCBtb3JlLi4uCitwcmVjaXNpb246ICAgMTUKK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5Citsbng3MzEgIGxuIDkuOTk5OTk5OTk5OTk5OTlFKzk5OSAtPiAyMzAyLjU4NTA5Mjk5NDA1ICAgICAgIEluZXhhY3QgUm91bmRlZAorLS0gbmV4dCBtYXkgYmUgYSA+IDAuNXVscCBjYXNlOyBhIG1vcmUgcHJlY2lzZSBhbnN3ZXIgaXM6CistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzAyLjU4NTA5Mjk5NDA0NDk1MDAxNzk5MTQ1NDQyCitsbng3MzIgIGxuIDkuOTk5OTk5OTk5OTkyNjZFKzk5OSAtPiAyMzAyLjU4NTA5Mjk5NDA0ICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54NzMzICBsbiA5Ljk5OTk5OTk5OTk5MjY1RSs5OTkgLT4gMjMwMi41ODUwOTI5OTQwNCAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDczNCAgbG4gOS45OTk5OTk5OTk5OTI2NEUrOTk5IC0+IDIzMDIuNTg1MDkyOTk0MDQgICAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvd3MgZm9yIGV4cCwgaW5jbHVkaW5nIHVuZGVyZmxvdy10by16ZXJvIGVkZ2UgcG9pbnQKK3ByZWNpc2lvbjogICA3CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworbG54NzUxICBsbiAwRS0zODkgLT4gLUluZmluaXR5Citsbng3NTggIGxuIDEuMDAwMDAxRS0zODMgLT4gLTg4MS44OTAxICAgICAgSW5leGFjdCBSb3VuZGVkCitsbng3NTkgIGxuIDkuOTk5OTFFLTM4NCAtPiAtODgxLjg5MDEgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbng3NjAgIGxuIDQuNDYwNUUtMzg1IC0+IC04ODUuMDAwMCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbng3NjEgIGxuIDIuMjIxRS0zODYgLT4gLTg4Ny45OTk5ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbng3NjIgIGxuIDMuMDFFLTM4NyAtPiAtODg5Ljk5ODUgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbng3NjMgIGxuIDEuN0UtMzg4IC0+IC04OTIuODcyNCAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbng3NjQgIGxuIDEuNUUtMzg4IC0+IC04OTIuOTk3NiAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbng3NjUgIGxuIDlFLTM4OSAtPiAtODkzLjUwODQgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbng3NjYgIGxuIDFFLTM4OSAtPiAtODk1LjcwNTYgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbng3NzQgIGxuIDBFLTM4OSAtPiAtSW5maW5pdHkKKworLS0gc3BlY2lhbCB2YWx1ZXMKK2xueDgyMCAgbG4gSW5maW5pdHkgLT4gICBJbmZpbml0eQorbG54ODIxICBsbiAwICAgICAgICAtPiAgLUluZmluaXR5Citsbng4MjIgIGxuIE5hTiAgICAgIC0+ICAgTmFOCitsbng4MjMgIGxuIHNOYU4gICAgIC0+ICAgTmFOICAgICBJbnZhbGlkX29wZXJhdGlvbgorLS0gcHJvcGFnYXRpbmcgTmFOcworbG54ODI0ICBsbiBzTmFOMTIzICAtPiAgIE5hTjEyMyAgSW52YWxpZF9vcGVyYXRpb24KK2xueDgyNSAgbG4gLXNOYU4zMjEgLT4gIC1OYU4zMjEgIEludmFsaWRfb3BlcmF0aW9uCitsbng4MjYgIGxuIE5hTjQ1NiAgIC0+ICAgTmFONDU2Citsbng4MjcgIGxuIC1OYU42NTQgIC0+ICAtTmFONjU0Citsbng4MjggIGxuIE5hTjEgICAgIC0+ICAgTmFOMQorCistLSBJbnZhbGlkIG9wZXJhdGlvbnMgZHVlIHRvIHJlc3RyaWN0aW9ucworLS0gW25leHQgdHdvIHByb2JhYmx5IHNraXBwZWQgYnkgbW9zdCB0ZXN0IGhhcm5lc3Nlc10KK3ByZWNpc2lvbjogMTAwMDAwMDAwCitsbng5MDEgIGxuIDEgLT4gIE5hTiAgICAgICAgICAgIEludmFsaWRfY29udGV4dAorcHJlY2lzaW9uOiAgOTk5OTk5OTkKK2xueDkwMiAgbG4gMCAtPiAgTmFOICAgICAgICAgICAgSW52YWxpZF9jb250ZXh0CisKK3ByZWNpc2lvbjogOQorbWF4RXhwb25lbnQ6ICAgMTAwMDAwMAorbWluRXhwb25lbnQ6ICAgLTk5OTk5OQorbG54OTAzICBsbiAxICAgLT4gIE5hTiAgICAgICAgICBJbnZhbGlkX2NvbnRleHQKK21heEV4cG9uZW50OiAgICA5OTk5OTkKK21pbkV4cG9uZW50OiAgIC05OTk5OTkKK2xueDkwNCAgbG4gMCAtPiAgLUluZmluaXR5CittYXhFeHBvbmVudDogICAgOTk5OTk5CittaW5FeHBvbmVudDogIC0xMDAwMDAwCitsbng5MDUgIGxuIDEgICAtPiAgTmFOICAgICAgICAgIEludmFsaWRfY29udGV4dAorbWF4RXhwb25lbnQ6ICAgIDk5OTk5OQorbWluRXhwb25lbnQ6ICAgLTk5OTk5OAorbG54OTA2ICBsbiAwIC0+ICAtSW5maW5pdHkKKworLS0gcGF5bG9hZCBkZWNhcGl0YXRlCitwcmVjaXNpb246IDUKK2xueDkxMCAgbG4gLXNOYU4xMjM0NTY3ODkwIC0+IC1OYU42Nzg5MCAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0Citsbng5MDAgIGxuICMgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2xvZzEwLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2xvZzEwLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwMmYwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbG9nMTAuZGVjVGVzdApAQCAtMCwwICsxLDU1MSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBsb2cxMC5kZWNUZXN0IC0tIGRlY2ltYWwgbG9nYXJpdGhtIGluIGJhc2UgMTAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDA1LCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgZW1waGFzaXNlcyB0aGUgdGVzdGluZyBvZiBub3RhYmxlIGNhc2VzLCBhcyB0aGV5IHdpbGwgb2Z0ZW4KKy0tIGhhdmUgdW51c3VhbCBwYXRocyAoZXNwZWNpYWxseSB0aGUgMTAqKm4gcmVzdWx0cykuCisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIGV4YW1wbGVzIGluIHNwZWNpZmljYXRpb24KK3ByZWNpc2lvbjogICA5Citsb2d4czAwMCBsb2cxMCAgMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5Citsb2d4czAwMSBsb2cxMCAgMC4wMDEgICAgICAgICAgICAgLT4gLTMKK2xvZ3hzMDAyIGxvZzEwICAxICAgICAgICAgICAgICAgICAtPiAgMAorbG9neHMwMDMgbG9nMTAgIDIgICAgICAgICAgICAgICAgIC0+ICAwLjMwMTAyOTk5NiAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG9neHMwMDQgbG9nMTAgIDEwICAgICAgICAgICAgICAgIC0+ICAxCitsb2d4czAwNSBsb2cxMCAgNzAgICAgICAgICAgICAgICAgLT4gIDEuODQ1MDk4MDQgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsb2d4czAwNiBsb2cxMCArSW5maW5pdHkgICAgICAgICAgLT4gIEluZmluaXR5CisKKworLS0gYmFzaWNzIChleGFtcGxlcyBpbiBzcGVjaWZpY2F0aW9uLCBldGMuKQorcHJlY2lzaW9uOiAgIDE2Citsb2d4MDAwMCBsb2cxMCAgMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5Citsb2d4MDAwMSBsb2cxMCAgN0UtMTAwMCAgICAgICAgICAgLT4gLTk5OS4xNTQ5MDE5NTk5ODU3ICAgSW5leGFjdCBSb3VuZGVkCitsb2d4MDAwMiBsb2cxMCAgMS4xRS05ICAgICAgICAgICAgLT4gLTguOTU4NjA3MzE0ODQxNzc1ICAgSW5leGFjdCBSb3VuZGVkCitsb2d4MDAwMyBsb2cxMCAgMC4wMDA3ICAgICAgICAgICAgLT4gLTMuMTU0OTAxOTU5OTg1NzQzICAgSW5leGFjdCBSb3VuZGVkCitsb2d4MDAwNCBsb2cxMCAgMC4xMSAgICAgICAgICAgICAgLT4gLTAuOTU4NjA3MzE0ODQxNzc1MCAgSW5leGFjdCBSb3VuZGVkCitsb2d4MDAwNSBsb2cxMCAgMC43ICAgICAgICAgICAgICAgLT4gLTAuMTU0OTAxOTU5OTg1NzQzMiAgSW5leGFjdCBSb3VuZGVkCitsb2d4MDAwNiBsb2cxMCAgMSAgICAgICAgICAgICAgICAgLT4gIDAKK2xvZ3gwMDA3IGxvZzEwICAxLjUgICAgICAgICAgICAgICAtPiAgMC4xNzYwOTEyNTkwNTU2ODEyICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDA4IGxvZzEwICAyICAgICAgICAgICAgICAgICAtPiAgMC4zMDEwMjk5OTU2NjM5ODEyICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDA5IGxvZzEwICAyLjcxODI4MTgyODQ1OTA0NSAtPiAgMC40MzQyOTQ0ODE5MDMyNTE4ICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDEwIGxvZzEwICAyLjcxODI4MTgyODQ1OTA0NiAtPiAgMC40MzQyOTQ0ODE5MDMyNTE5ICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDExIGxvZzEwICAyLjcxODI4MTgyODQ1OTA0NyAtPiAgMC40MzQyOTQ0ODE5MDMyNTIxICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDEyIGxvZzEwICA3ICAgICAgICAgICAgICAgICAtPiAgMC44NDUwOTgwNDAwMTQyNTY4ICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDEzIGxvZzEwICAxMCAgICAgICAgICAgICAgICAtPiAgMQorbG9neDAwMTQgbG9nMTAgIDEwLjUgICAgICAgICAgICAgIC0+ICAxLjAyMTE4OTI5OTA2OTkzOCAgIEluZXhhY3QgUm91bmRlZAorbG9neDAwMTUgbG9nMTAgIDExICAgICAgICAgICAgICAgIC0+ICAxLjA0MTM5MjY4NTE1ODIyNSAgIEluZXhhY3QgUm91bmRlZAorbG9neDAwMTYgbG9nMTAgIDcwICAgICAgICAgICAgICAgIC0+ICAxLjg0NTA5ODA0MDAxNDI1NyAgIEluZXhhY3QgUm91bmRlZAorbG9neDAwMTcgbG9nMTAgIDk5OTkgICAgICAgICAgICAgIC0+ICAzLjk5OTk1NjU2ODM4MDE5MiAgIEluZXhhY3QgUm91bmRlZAorbG9neDAwMTggbG9nMTAgIDEuMjFFNiAgICAgICAgICAgIC0+ICA2LjA4Mjc4NTM3MDMxNjQ1MCAgIEluZXhhY3QgUm91bmRlZAorbG9neDAwMTkgbG9nMTAgIDEuMUUrOSAgICAgICAgICAgIC0+ICA5LjA0MTM5MjY4NTE1ODIyNSAgIEluZXhhY3QgUm91bmRlZAorbG9neDAwMjAgbG9nMTAgIDdFKzEwMDAgICAgICAgICAgIC0+ICAxMDAwLjg0NTA5ODA0MDAxNCAgIEluZXhhY3QgUm91bmRlZAorbG9neDAwMjEgbG9nMTAgK0luZmluaXR5ICAgICAgICAgIC0+ICBJbmZpbml0eQorCistLSBub3RhYmxlIGNhc2VzCistLSBuZWdhdGl2ZXMKK2xvZ3gwMDMxIGxvZzEwIC0xRS05ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xvZ3gwMDMyIGxvZzEwIC0wLjAwMDcgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xvZ3gwMDMzIGxvZzEwIC0wLjEgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xvZ3gwMDM0IGxvZzEwIC0wLjcgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xvZ3gwMDM1IGxvZzEwIC0xICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xvZ3gwMDM2IGxvZzEwIC0xLjUgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xvZ3gwMDM3IGxvZzEwIC0yICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xvZ3gwMDM4IGxvZzEwIC0xMC41ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xvZ3gwMDM5IGxvZzEwIC0xMC41ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xvZ3gwMDQwIGxvZzEwIC05OTk5ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xvZ3gwMDQxIGxvZzEwIC0xMCAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xvZ3gwMDQyIGxvZzEwIC0wICAgICAgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2xvZ3gwMDQzIGxvZzEwIC0wRSsxNyAgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2xvZ3gwMDQ0IGxvZzEwIC0wRS0xNyAgICAgICAgICAgICAtPiAtSW5maW5pdHkKKy0tIG90aGVyIHplcm9zCitsb2d4MDA1MSBsb2cxMCAgMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5Citsb2d4MDA1MiBsb2cxMCAgMEUrMTcgICAgICAgICAgICAgLT4gLUluZmluaXR5Citsb2d4MDA1MyBsb2cxMCAgMEUtMTcgICAgICAgICAgICAgLT4gLUluZmluaXR5CistLSBpbmZpbml0aWVzCitsb2d4MDA1NSBsb2cxMCAtSW5maW5pdHkgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsb2d4MDA1NiBsb2cxMCArSW5maW5pdHkgICAgICAgICAgLT4gSW5maW5pdHkKKy0tIG9uZXMKK2xvZ3gwMDYxIGxvZzEwICAxICAgICAgICAgICAgICAgICAtPiAgIDAKK2xvZ3gwMDYyIGxvZzEwICAxLjAgICAgICAgICAgICAgICAtPiAgIDAKK2xvZ3gwMDYzIGxvZzEwICAxLjAwMDAwMDAwMDAwMDAwMCAtPiAgIDAKK2xvZ3gwMDY0IGxvZzEwICAxLjAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgIDAKKworLS0gbm90YWJsZSBjYXNlcyAtLSBleGFjdCBwb3dlcnMgb2YgMTAKK2xvZ3gxMTAwIGxvZzEwIDEgICAgICAgICAgICAgLT4gMAorbG9neDExMDEgbG9nMTAgMTAgICAgICAgICAgICAtPiAxCitsb2d4MTEwMiBsb2cxMCAxMDAgICAgICAgICAgIC0+IDIKK2xvZ3gxMTAzIGxvZzEwIDEwMDAgICAgICAgICAgLT4gMworbG9neDExMDQgbG9nMTAgMTAwMDAgICAgICAgICAtPiA0Citsb2d4MTEwNSBsb2cxMCAxMDAwMDAgICAgICAgIC0+IDUKK2xvZ3gxMTA2IGxvZzEwIDEwMDAwMDAgICAgICAgLT4gNgorbG9neDExMDcgbG9nMTAgMTAwMDAwMDAgICAgICAtPiA3Citsb2d4MTEwOCBsb2cxMCAxMDAwMDAwMDAgICAgIC0+IDgKK2xvZ3gxMTA5IGxvZzEwIDEwMDAwMDAwMDAgICAgLT4gOQorbG9neDExMTAgbG9nMTAgMTAwMDAwMDAwMDAgICAtPiAxMAorbG9neDExMTEgbG9nMTAgMTAwMDAwMDAwMDAwICAtPiAxMQorbG9neDExMTIgbG9nMTAgMTAwMDAwMDAwMDAwMCAtPiAxMgorbG9neDExMTMgbG9nMTAgMC4wMDAwMDAwMDAwMSAtPiAtMTEKK2xvZ3gxMTE0IGxvZzEwIDAuMDAwMDAwMDAwMSAtPiAtMTAKK2xvZ3gxMTE1IGxvZzEwIDAuMDAwMDAwMDAxIC0+IC05Citsb2d4MTExNiBsb2cxMCAwLjAwMDAwMDAxIC0+IC04Citsb2d4MTExNyBsb2cxMCAwLjAwMDAwMDEgLT4gLTcKK2xvZ3gxMTE4IGxvZzEwIDAuMDAwMDAxIC0+IC02Citsb2d4MTExOSBsb2cxMCAwLjAwMDAxIC0+IC01Citsb2d4MTEyMCBsb2cxMCAwLjAwMDEgLT4gLTQKK2xvZ3gxMTIxIGxvZzEwIDAuMDAxIC0+IC0zCitsb2d4MTEyMiBsb2cxMCAwLjAxIC0+IC0yCitsb2d4MTEyMyBsb2cxMCAwLjEgLT4gLTEKK2xvZ3gxMTI0IGxvZzEwIDFFLTk5ICAtPiAtOTkKK2xvZ3gxMTI1IGxvZzEwIDFFLTEwMCAtPiAtMTAwCitsb2d4MTEyNiBsb2cxMCAxRS0zODMgLT4gLTM4MworCistLSBjaGVjayBub3JtYWxseSBleGFjdCBjYXNlcyByb3VuZCBwcm9wZXJseQorcHJlY2lzaW9uOiAxCitsb2d4MTE0MSBsb2cxMCAxMDAwMDAwMDAwMCAgIC0+IDFFKzEgICAgICAgICBSb3VuZGVkCitsb2d4MTE0MiBsb2cxMCAxMDAwMDAwMDAwMDAwIC0+IDFFKzEgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE0MyBsb2cxMCAxRSsxMDAgICAgICAgIC0+IDFFKzIgICAgICAgICBSb3VuZGVkCitsb2d4MTE0NCBsb2cxMCAxRSsxMjMgICAgICAgIC0+IDFFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE0NSBsb2cxMCAxRSsxMjYgICAgICAgIC0+IDFFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE0NiBsb2cxMCAxRSs5MTYgICAgICAgIC0+IDlFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE0NyBsb2cxMCAxRSs5OTkgICAgICAgIC0+IDFFKzMgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMgorbG9neDExNTEgbG9nMTAgMTAwMDAwMDAwMDAgICAtPiAxMAorbG9neDExNTIgbG9nMTAgMTAwMDAwMDAwMDAwMCAtPiAxMgorbG9neDExNTMgbG9nMTAgMUUrMTAwICAgICAgICAtPiAxLjBFKzIgICAgICAgICBSb3VuZGVkCitsb2d4MTE1NCBsb2cxMCAxRSsxMjMgICAgICAgIC0+IDEuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMTU1IGxvZzEwIDFFKzEyNiAgICAgICAgLT4gMS4zRSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNTYgbG9nMTAgMUUrOTE2ICAgICAgICAtPiA5LjJFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE1NyBsb2cxMCAxRSs5OTkgICAgICAgIC0+IDEuMEUrMyBJbmV4YWN0IFJvdW5kZWQKKy0tIHNvbWUgaGFsZi13YXkgcG9pbnQgcm91bmRzLCBvdGhlciBjYXNlcywgYW5kIG5lZ2F0aXZlcworbG9neDExNTggbG9nMTAgMUUrMTI1ICAgICAgICAtPiAxLjJFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE1OSBsb2cxMCAxRSsxMzUgICAgICAgIC0+IDEuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMTYwIGxvZzEwIDFFKzEyOSAgICAgICAgLT4gMS4zRSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNjEgbG9nMTAgMUUrMTMxICAgICAgICAtPiAxLjNFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE2MiBsb2cxMCAxRS0xMjMgICAgICAgIC0+IC0xLjJFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE2MyBsb2cxMCAxRS0xMjYgICAgICAgIC0+IC0xLjNFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE2NCBsb2cxMCAxRS05MTYgICAgICAgIC0+IC05LjJFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE2NSBsb2cxMCAxRS05OTkgICAgICAgIC0+IC0xLjBFKzMgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE2NiBsb2cxMCAxRS0xMjUgICAgICAgIC0+IC0xLjJFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE2NyBsb2cxMCAxRS0xMzUgICAgICAgIC0+IC0xLjRFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE2OCBsb2cxMCAxRS0xMjkgICAgICAgIC0+IC0xLjNFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE2OSBsb2cxMCAxRS0xMzEgICAgICAgIC0+IC0xLjNFKzIgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMworbG9neDExNzEgbG9nMTAgMTAwMDAwMDAwMDAgICAtPiAxMAorbG9neDExNzIgbG9nMTAgMTAwMDAwMDAwMDAwMCAtPiAxMgorbG9neDExNzMgbG9nMTAgMUUrMTAwICAgICAgICAtPiAxMDAKK2xvZ3gxMTc0IGxvZzEwIDFFKzEyMyAgICAgICAgLT4gMTIzCitsb2d4MTE3NSBsb2cxMCAxRSsxMjYgICAgICAgIC0+IDEyNgorbG9neDExNzYgbG9nMTAgMUUrOTE2ICAgICAgICAtPiA5MTYKK2xvZ3gxMTc3IGxvZzEwIDFFKzk5OSAgICAgICAgLT4gOTk5CisKKy0tIGxvZzEwKDIpIC4uIHRlc3RzIGJvdGggbG4oMikgYW5kIGxuKDEwKSBjb25zdGFudHMsIHRvbworcHJlY2lzaW9uOiA1MAorbG9neDEyMDEgbG9nMTAgMiAgICAgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgxODk4ODE0NjIxMSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMjAyIGxvZzEwIDIuMDAwIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTg5ODgxNDYyMTEgSW5leGFjdCBSb3VuZGVkCitsb2d4MTIwMyBsb2cxMCAwLjJFMSAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4MTQ2MjExIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0OQorbG9neDEyMDQgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4MTQ2MjEgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQ4Citsb2d4MTIwNSBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTg5ODgxNDYyICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDcKK2xvZ3gxMjA2IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgxODk4ODE0NiAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0NgorbG9neDEyMDcgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4MTUgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQ1Citsb2d4MTIwOCBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTg5ODgxICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDQKK2xvZ3gxMjA5IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgxODk4OCAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0MworbG9neDEyMTAgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTkgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQyCitsb2d4MTIxMSBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTkwICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDEKK2xvZ3gxMjEyIGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0MAorbG9neDEyMTMgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODIgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM5Citsb2d4MTIxNCBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4ICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzgKK2xvZ3gxMjE1IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NyAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzNworbG9neDEyMTYgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjggICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM2Citsb2d4MTIxNyBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI3ICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzUKK2xvZ3gxMjE4IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMyAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzNAorbG9neDEyMTkgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMzCitsb2d4MTIyMCBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzIKK2xvZ3gxMjIxIGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMQorbG9neDEyMjIgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDUgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMwCitsb2d4MTIyMyBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0ICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjkKK2xvZ3gxMjI0IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MiAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyOAorbG9neDEyMjUgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI3Citsb2d4MTIyNiBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk1ICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjYKK2xvZ3gxMjI3IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OSAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNQorbG9neDEyMjggbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODkgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI0Citsb2d4MTIyOSBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM5ICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjMKK2xvZ3gxMjMwIGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3NCAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMgorbG9neDEyMzEgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIxCitsb2d4MTIzMiBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjAKK2xvZ3gxMjMzIGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxOQorbG9neDEyMzQgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE4Citsb2d4MTIzNSBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTcKK2xvZ3gxMjM2IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODEyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNgorbG9neDEyMzcgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE1Citsb2d4MTIzOCBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTQKK2xvZ3gxMjM5IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMworbG9neDEyNDAgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2NDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEyCitsb2d4MTI0MSBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTEKK2xvZ3gxMjQyIGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMAorbG9neDEyNDMgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA5Citsb2d4MTI0NCBsb2cxMCAyIC0+IDAuMzAxMDI5OTk2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDgKK2xvZ3gxMjQ1IGxvZzEwIDIgLT4gMC4zMDEwMzAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNworbG9neDEyNDYgbG9nMTAgMiAtPiAwLjMwMTAzMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA2Citsb2d4MTI0NyBsb2cxMCAyIC0+IDAuMzAxMDMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDUKK2xvZ3gxMjQ4IGxvZzEwIDIgLT4gMC4zMDEwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNAorbG9neDEyNDkgbG9nMTAgMiAtPiAwLjMwMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAzCitsb2d4MTI1MCBsb2cxMCAyIC0+IDAuMzAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDIKK2xvZ3gxMjUxIGxvZzEwIDIgLT4gMC4zMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMQorbG9neDEyNTIgbG9nMTAgMiAtPiAwLjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gTW9yZSBjbG9zZS10by1lLCBldGMuLCB0ZXN0cworcHJlY2lzaW9uOiAgIDM0Citsb2d4MTMwMSBsb2cxMCAyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MSAgLT4gMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDQ4IEluZXhhY3QgUm91bmRlZAorbG9neDEzMDIgbG9nMTAgMi43MTgyODE4Mjg0NTkwNDUyMzUzNjAyODc0NzEzNTI2NjIgIC0+IDAuNDM0Mjk0NDgxOTAzMjUxODI3NjUxMTI4OTE4OTE2NjA1MCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzAzIGxvZzEwIDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYzICAtPiAwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwNTIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTMwNCBsb2cxMCAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgLT4gLTQuMzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDczRS0zMyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzA1IGxvZzEwIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAtPiAtNC4zNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwNTNFLTM0IEluZXhhY3QgUm91bmRlZAorbG9neDEzMDYgbG9nMTAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IC0+IC00LjM0Mjk0NDgxOTAzMjUxODI3NjUxMTI4OTE4OTE2NjA1MUUtMzUgSW5leGFjdCBSb3VuZGVkCitsb2d4MTMwNyBsb2cxMCAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gMAorbG9neDEzMDggbG9nMTAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIC0+IDQuMzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDUxRS0zNSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzA5IGxvZzEwIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiA0LjM0Mjk0NDgxOTAzMjUxODI3NjUxMTI4OTE4OTE2NjA0OUUtMzQgSW5leGFjdCBSb3VuZGVkCitsb2d4MTMxMCBsb2cxMCAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgLT4gNC4zNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwMjlFLTMzIEluZXhhY3QgUm91bmRlZAorLS0gbG93ZXIgcAorcHJlY2lzaW9uOiAgICA3Citsb2d4MTMyMCBsb2cxMCAwLjk5OTk5OSAgICAtPiAtNC4zNDI5NDdFLTcgIEluZXhhY3QgUm91bmRlZAorbG9neDEzMjEgbG9nMTAgMC45OTk5OTk5ICAgLT4gLTQuMzQyOTQ1RS04ICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzIyIGxvZzEwIDAuOTk5OTk5OTkgIC0+IC00LjM0Mjk0NUUtOSAgSW5leGFjdCBSb3VuZGVkCitsb2d4MTMyMyBsb2cxMCAwLjk5OTk5OTk5OSAtPiAtNC4zNDI5NDVFLTEwIEluZXhhY3QgUm91bmRlZAorbG9neDEzMjQgbG9nMTAgMS4wMDAwMDAwMCAgLT4gIDAKK2xvZ3gxMzI1IGxvZzEwIDEuMDAwMDAwMDEgIC0+ICA0LjM0Mjk0NUUtOSAgSW5leGFjdCBSb3VuZGVkCitsb2d4MTMyNiBsb2cxMCAxLjAwMDAwMDEgICAtPiAgNC4zNDI5NDVFLTggIEluZXhhY3QgUm91bmRlZAorbG9neDEzMjcgbG9nMTAgMS4wMDAwMDEgICAgLT4gIDQuMzQyOTQzRS03ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVhciAxMF4zCitwcmVjaXNpb246ICAgOQorbG9neDEzMzEgbG9nMTAgIDk5OS45OTk5OTk4ICAtPiAzLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorbG9neDEzMzIgbG9nMTAgIDk5OS45OTk5OTk5ICAtPiAzLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorbG9neDEzMzMgbG9nMTAgMTAwMC4wMDAwMDAgICAtPiAzCitsb2d4MTMzNCBsb2cxMCAxMDAwLjAwMDAwMSAgIC0+IDMuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitsb2d4MTMzNSBsb2cxMCAxMDAwLjAwMDAwMiAgIC0+IDMuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE2Citsb2d4MTM0MSBsb2cxMCAgOTk5Ljk5OTk5OTggIC0+IDIuOTk5OTk5OTk5OTEzMTQxIEluZXhhY3QgUm91bmRlZAorbG9neDEzNDIgbG9nMTAgIDk5OS45OTk5OTk5ICAtPiAyLjk5OTk5OTk5OTk1NjU3MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzQzIGxvZzEwIDEwMDAuMDAwMDAwICAgLT4gMworbG9neDEzNDQgbG9nMTAgMTAwMC4wMDAwMDEgICAtPiAzLjAwMDAwMDAwMDQzNDI5NCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzQ1IGxvZzEwIDEwMDAuMDAwMDAyICAgLT4gMy4wMDAwMDAwMDA4Njg1ODkgSW5leGFjdCBSb3VuZGVkCisKKy0tIHN1Z2dlc3Rpb25zIGZyb20gSWxhbiBOZWhhbWEKK2xvZ3gxNDAwIGxvZzEwIDEwRS0zICAgIC0+IC0yCitsb2d4MTQwMSBsb2cxMCAxMEUtMiAgICAtPiAtMQorbG9neDE0MDIgbG9nMTAgMTAwRS0yICAgLT4gIDAKK2xvZ3gxNDAzIGxvZzEwIDEwMDBFLTIgIC0+ICAxCitsb2d4MTQwNCBsb2cxMCAxMDAwMEUtMiAtPiAgMgorbG9neDE0MDUgbG9nMTAgMTBFLTEgICAgLT4gIDAKK2xvZ3gxNDA2IGxvZzEwIDEwMEUtMSAgIC0+ICAxCitsb2d4MTQwNyBsb2cxMCAxMDAwRS0xICAtPiAgMgorbG9neDE0MDggbG9nMTAgMTAwMDBFLTEgLT4gIDMKK2xvZ3gxNDA5IGxvZzEwIDEwRTAgICAgIC0+ICAxCitsb2d4MTQxMCBsb2cxMCAxMDBFMCAgICAtPiAgMgorbG9neDE0MTEgbG9nMTAgMTAwMEUwICAgLT4gIDMKK2xvZ3gxNDEyIGxvZzEwIDEwMDAwRTAgIC0+ICA0Citsb2d4MTQxMyBsb2cxMCAxMEUxICAgICAtPiAgMgorbG9neDE0MTQgbG9nMTAgMTAwRTEgICAgLT4gIDMKK2xvZ3gxNDE1IGxvZzEwIDEwMDBFMSAgIC0+ICA0Citsb2d4MTQxNiBsb2cxMCAxMDAwMEUxICAtPiAgNQorbG9neDE0MTcgbG9nMTAgMTBFMiAgICAgLT4gIDMKK2xvZ3gxNDE4IGxvZzEwIDEwMEUyICAgIC0+ICA0Citsb2d4MTQxOSBsb2cxMCAxMDAwRTIgICAtPiAgNQorbG9neDE0MjAgbG9nMTAgMTAwMDBFMiAgLT4gIDYKKworLS0gUmFuZG9tcworLS0gUD01MCwgd2l0aGluIDAtOTk5OQorUHJlY2lzaW9uOiA1MAorbG9neDI1MDEgbG9nMTAgMC4wMDAzNTQ0ODAwMTY2Nzk2ODE0MTc3NTg5MTI0Njk5MTkxMjY1NTk2MTE2MzM0NTkwNCAtPiAgLTMuNDUwNDA4MjQyNTQxMTc3NTI5MDg2NDA1MzMxODI0NzI3NDk0NDY4NTU4NjE4ODUwNSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTAyIGxvZzEwIDcwLjYzNjQ1NTcyNjQyNDMxMTIyODI1NTMzODYzNzkzNTMzMDgyNjk5NTEzNjU5NzY0NCAgLT4gICAxLjg0OTAyODg5OTg0MDg0OTIwNDU3OTMwNzAyNTUzMDIzMzU1NTgxNDA5NzU3MTkyNDcgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUwMyBsb2cxMCAwLjAwMDAwMDAwMDAwMDAwMjMzNTUwMzYyNDczODIxODg5MDYwODEyODA0MDYzMDQwMTY5IC0+IC0xNC42MzE2MTk0NTQzNDM4MzQ4NTgwMjM1NzgyOTkxNDI4NjY1NTc3MTc5MDQyMjM2NjcgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUwNCBsb2cxMCA5Ny43ODM2Mjg2MjE1MjMyNDQ2Nzk5MDEyNjAzNTgyODY4OTg5NTg4MzIxMzU0MzM3NjQgIC0+ICAgMS45OTAyNjYxNDkzMjI0MjE5NTE3ODk3NjU3OTY0MzYyNTcxNjkwNTkyNzM0NDA3MzMwIEluZXhhY3QgUm91bmRlZAorbG9neDI1MDUgbG9nMTAgMDA2Mi4yMzc3MTM1MzE1ODU4MzkyODAyNjEyODEyMDIyODA3ODM4NTk5NTcyMDE3MzQyICAtPiAgIDEuNzk0MDUzNjI5MzA4NTA2NjE5OTI4NzYzMjcyNTAyNjgzNzAxODQ4NjUzMzU0NDE0MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTA2IGxvZzEwIDYuMzc2NzYzNDY1MjA3MTA1MzYxOTk3NzYwMjgwNDcyNDEyOTY1Mjk4MTc0Nzg3OTUzMiAgLT4gICAwLjgwNDYwMDMwNzg5ODI1OTYxNjE1MTAwMTYzNTc2MDgwNzYxMzI2ODU3Mzc0MDk4NjQ0IEluZXhhY3QgUm91bmRlZAorbG9neDI1MDcgbG9nMTAgNjMuMjk3MDg4OTgxMzEzMjc4NTI5MzA2NTMzODE0MTk1MDY4ODUwNTMyNjY2NjU4Nzk4ICAtPiAgIDEuODAxMzgzNzM3MzcyNDQyNzA5MjQxNzE3MDE0OTA5ODYxNDQxMDg0OTM1MzgzOTY3MyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTA4IGxvZzEwIDAuMDAwMDAwNzcyMzk2OTMzMTY4ODE3OTc3MTc4MjAxMTA4OTgxNjc3MjE2MDIyOTkxODcgLT4gIC02LjExMjE1OTQ1OTI3MTg1NTA2MTM3NzM4ODYyNDE5NTE5NjYyNjQ4MjY3NjAzMTAwNDcgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUwOSBsb2cxMCAwLjAwMDAwMDAzOTUzNTgwMzU5NzgwMTg1NTM0ODMwNTcyNDYxOTIyNTI3ODMxMzk1MDAyIC0+ICAtNy40MDMwMDk0MjkzODMzODQ3MTM2MjUyNTQ3MDY5OTA1NDc3MjEzNTQxNzg3MTc3NTYxIEluZXhhY3QgUm91bmRlZAorbG9neDI1MTAgbG9nMTAgNzU0LjYyOTA1ODE3MzY5OTg5MTY5MTg4OTk4MTExNTI3MjcyNjg4NzkxNTQ0NTc3MjA0ICAtPiAgIDIuODc3NzMzNTI0Mzc2MTMwMDA0Nzc1ODUzNDMwNDM3MTkxMjA5OTk1ODA1NzU0NTQxNiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTExIGxvZzEwIDAuMDAwMDAwNDgzNjAzNzg0MTAyNDE0Mjg5MzY2MDcxNDcwNTYyODMyODI4NDkxNTgzMTIgLT4gIC02LjMxNTUxMDMwOTUzMDkzNTM0NTc2MDQwMzgzOTc5ODAwOTE2NTA3NjAzNDYzMzQ1MTIgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUxMiBsb2cxMCAwLjAwMDA3NTA5MDM3NTgzNjQ1NjEyNTc3MTk2MTA0NTkxNjcyMDgwNTQyOTMyMTY2MDg5IC0+ICAtNC4xMjQ0MTU3MjE5NzAwMTY2MzE0MDEyMzQ0NzA1NTM4MDg4MDMwNTkyODk2MTExMDI2IEluZXhhY3QgUm91bmRlZAorbG9neDI1MTMgbG9nMTAgMC4wMDAwMDAwMDAwMDcwNTQ3NTk0NDYzODkxNTA1MzQxOTgzOTA2MzU2Nzg5ODA5MjA2NCAtPiAtMTEuMTUxNTE3NzkwMjU2NDY2MDQ4NTUzODEwMDAyNTI1ODY4MTk4MTc4MTY3OTUwMzc3IEluZXhhY3QgUm91bmRlZAorbG9neDI1MTQgbG9nMTAgOS42MjEwMzAwNDYwNDk3NjU3OTE3NDQ1NDEwOTQ3MDk5NjMzNDc5NjA5MTY1MTIwNjYxICAtPiAgIDAuOTgzMjIxNTcwOTMyNjA5NzgyMDY2MzM5MjI4Nzc3MTYwNzg2ODM1MTg2MTc3Njg0MTEgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUxNSBsb2cxMCAwLjAwMDAwMDAwMDUwMTUwMzYxMzg2NTU1NTI3NDk2NjA3MjQ1OTc2MTIwODY0OTg1NjExIC0+ICAtOS4yOTk3MjU5MzMwNzk4MjYxMDQwNDExMDg2ODM1NTYzMjM0MzkwOTM0OTM0NjI5MzQwIEluZXhhY3QgUm91bmRlZAorbG9neDI1MTYgbG9nMTAgMDk4LjI0NzU0MDI5NzMxOTk0MTI1Nzk3NzIzNTQ1MzMzNjc3NjA0NDkwMDc0ODEwNzUxICAtPiAgIDEuOTkyMzIxNjg2Mjg3NDMzNzA3Nzc5NTI3ODYyOTM1MTA2MDgxOTEwNTY3OTY3MDYzMyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTE3IGxvZzEwIDcuNTA5MTk5ODE1MDA0Njk5NDMyMDQ0MTQ2Mzg1NDMwMTYyNDc0MjQ5MTAxNTc1Mjk4MCAgLT4gICAwLjg3NTU5MzY2MDc4MDA1OTI0MDgwNzY2NDY5MTU4NzYzNDk5NzI1NDE0MDI0MTI4NzgxIEluZXhhY3QgUm91bmRlZAorbG9neDI1MTggbG9nMTAgMC4wMDAwMDAwMDAwMDA3OTU0MDU3MTI3MzMzMDA3NTE5MzY2ODU5Njk0MjI2ODU0MjQyNSAtPiAtMTIuMDk5NDExMjk0MTY1MTc2MDI4ODE3MzA1MTA4NDc1MzI2MzI1MDA2MjUwOTM2OTYzIEluZXhhY3QgUm91bmRlZAorbG9neDI1MTkgbG9nMTAgMC4wMDAwMDA0MjM5NTAzNDc5OTU1NTIxNTc4MjkwNzUxNTA3NDEzNDE1NDkxNTQ5MTcwMSAtPiAgLTYuMzcyNjg1MDAzOTEyNTM4MTEzNDA2OTQ1MDgwMjEwODg5MzA3NTYwNDQ2NDEzNTI5NyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTIwIGxvZzEwIDU2LjY4MzM3NjMwNDY3NDM1NTQ4MTkwNTAyMzE0NTIzODc5OTkwOTMwMTczMjY5NDk4MiAgLT4gICAxLjc1MzQ1NTcxMDc4NTM0ODA0MzU3MDM0MjE4MjYwNzc2MDYyNTA2MzY1ODAwOTE3NTQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUyMSBsb2cxMCA0OC43MzQwMzM4MTE0NDQxOTUwNzA4MDc2MDY3MjE1MTcxNjk4MTA0MzgwNDk1ODEyMjcgIC0+ICAgMS42ODc4MzIzNjAyNzQxMDY1MTkwOTQyNjU0NzEwMDQ5NDMzODA4MjA4MjkxNTY0MDQ5IEluZXhhY3QgUm91bmRlZAorbG9neDI1MjIgbG9nMTAgMC4wMDA3NDgzMDMxMDkzMDA0Njg2NTAwOTg1MTcwNjk4OTQzMDIyODU2MTg4MDIyMTA2MyAtPiAgLTMuMTI1OTIyNDUwMjIwOTk3NDA4MjIyMzY2NzcxMjAxNjQ0NTU3MjQzMTc5MTkyMDYxOCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTIzIGxvZzEwIDM2LjY3NzM0ODg4NTExMTU5MzM4NDAyMDgzNjcyMDM5NjI2MjQ5NzEyMjcwODU5ODM1OSAgLT4gICAxLjU2NDM5NzkzNjQyNjA3OTYwODY3NTQ1MzAyODIzMDI2MDU0Nzc1Njc0NjkzOTU0MjUgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUyNCBsb2cxMCAwLjAwMDAwMDAwMDAwMDAwMDA0NDk1Njc4NTYwNDgwNDMyODU4ODEyNDE5MTQ1ODMzNzQ0IC0+IC0xNi4zNDcyMDQ3NDgyMzk3NDA1MTAwMTQzMjA2MzAzNjMyNDQwMTU5MTYwMjk2MTk1NjEgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUyNSBsb2cxMCA5NTA5LjU4NTQwMTM2NTA2NDI3OTkzNzQxNTkxMzE5NDAxMDg3NDg1OTQ3NzQzMDcxMDQgIC0+ICAgMy45NzgxNjE1ODI5OTE2MzI2NzQxMTAwMTY2NTE5NzI2ODI0NDMwOTQ1NDA2MzAyNjYxIEluZXhhY3QgUm91bmRlZAorbG9neDI1MjYgbG9nMTAgMC4wNzgzNDg5MTI2ODY4OTE3NzAxNDA0NDQ1NDc5MzYwODcxNTI3NjYxNTc0MzgxOTA5NyAtPiAgLTEuMTA1OTY3MDI2MjE5NzY0MzE0NzgwNTUxNzM5ODYyMTI4ODg5NzY2OTg3Njk5NjM0OCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTI3IGxvZzEwIDAuMDAwMDAwMjk1ODQ1Mjk4ODA3MDYxMjg0NDQ0NTQ2ODg0NTQ5OTkwMzI4MDE5MDQ3OTQgLT4gIC02LjUyODkzNTMyNzU4MTQwNDM3MTAwNzY1MjY5MjA1NjY3MjE1NzAzNzUwMjY5MTcyMDYgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUyOCBsb2cxMCAzLjA3MTM0OTY1NDQ0OTc2MTgwOTg3OTQzMzI3ODc3NzIxODYxNzY5ODEwMTE5MDQyOTQgIC0+ICAgMC40ODczMjkyNjEwMzg5NjgyODU0NjQyNDM0MTAyOTQ5MjQ2ODEwMDQzMTQxNDA3Mjk5NCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTI5IGxvZzEwIDM1Mi42NjM5MjY3MDc4ODgxNjQ3NDQwNzQ0Mjc4NTQ2MDgwMzgzMzkyNzEzNjQxMzk0MyAgLT4gICAyLjU0NzM2MTAzODgxOTk1NjI3MTQ3MDk4MzYzOTgyNDM5MzMzMjAyODQwNzcwMDgzMTQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUzMCBsb2cxMCAwLjAwMzA0NzQzMTI1MTgxODc2MjY3MjEwNTE2NTI3MzYxNzQyMTg1NjE3MDkxODAxNjUwIC0+ICAtMi41MTYwNjYwODMwMTYzOTgxOTY3Nzc0MTI0NzQ1MzExNDk3NDQ3MDUwMDU2NDAwMjA3IEluZXhhY3QgUm91bmRlZAorbG9neDI1MzEgbG9nMTAgMC4wMDAwMDA3NjEyMDUzNTg5NDk1MjEzNjQ5OTI1MDM2NDYwNDUzODExNzcyOTQzNzE4MyAtPiAgLTYuMTE4NDk4MTYyOTA0NzA1MTUzMjQ0ODQxMzg2Mzk1MDc3NjQ5NjY1MjQ4MzAxOTQxNSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTMyIGxvZzEwIDc2OS44ODc5NTk3ODUzNDM1MzA1Mjk2NTI4NjE5NTA1MzczNTAwNzQ3MzE4NzczNTgxNSAgLT4gICAyLjg4NjQyNzUyNzc4NjI2NTI3MDk5ODY0OTg1ODEwNjQxMTc5NTAyODg3OTgyMjIxMDAgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUzMyBsb2cxMCAwLjAwMDAwMDAwMDAwMDAwMDQxMjk3NDk0ODA4NjEyMjI2MzA0NjE5NTcwMDE2MzM2MTg4IC0+IC0xNS4zODQwNzYyOTI3NDU0MTU5MTc1MTA2Njg0NTQzNjE4Njg2NTk0Njg2Njk4MDQ3MTAgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUzNCBsb2cxMCA4NjAuODg4NjQ1OTU3MTQ0MjY5NDAyNDc5NDA5NjAyNTg1NTg4NzY5MDM3NDE5NjY5NzQgIC0+ICAgMi45MzQ5NDY5ODAwNTU0Mjc3OTE1OTIwMjc4MDkwNjQ3MjgzMjMzNDQwODU5MTU1MTc2IEluZXhhY3QgUm91bmRlZAorbG9neDI1MzUgbG9nMTAgNTgzOS4wMzI4ODEyOTk0Nzg3MjM1OTAwMTc4NTg3MzcxMDUxMDk2ODk4NjgzOTcyNDQ0ICAtPiAgIDMuNzY2MzQwOTIwODk3MjM5MjU2OTI2OTEyNTUzOTQzODg3NDczNzE0NzkwNjIzODU0MyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTM2IGxvZzEwIDAuMDAwMDAwMjg1MzI3MTAxNTEyODQ4NDA0NzE2NzA0OTcxMTI4MjEyMDE1OTgzNzc4NDEgLT4gIC02LjU0NDY1Njk3NTM1MTQwMjc2NzU4Nzg4Nzk4NDMyMzgwNjU0ODg0OTA2MTgxNTk0OTAgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUzNyBsb2cxMCAwLjAwMDAwMDAwMDAwMDAwMDA5NzM0NDkwMDU5OTMxNjM4NDgzNDQ1NjMxODM1NjUxNTgxIC0+IC0xNi4wMTE2ODY3OTQwMTEyNzExMzU5Nzg2MzM4ODA4NjQyNzg2OTIyNTQyNDMxMDY5MzEgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUzOCBsb2cxMCA1Ljg2MTA5NDk1MjY0Mzk1Mjk0ODkyNTIzMDI0NjM0NTAzMDI5ODE1MTE3MTQxNDQzMzAgIC0+ICAgMC43Njc5Nzg3NTcyMjQ1MjU0OTI4MTAyODU1MjA2NzY0NTczMjQ5MDkyOTM2MTk1MjI3OCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTM5IGxvZzEwIDYuNjI4MjQzMjIyMTExNTkyMzM3MjE1MTE0ODk5MDEzNzE3OTYxMTk3NzU3NjMyNzIwNiAgLT4gICAwLjgyMTM5ODQzNjM5MjI3MjEzMjExMDEyMDQ0MDAwNzg1NzU3MjY3MTU1NzM2MDcxMzYxIEluZXhhY3QgUm91bmRlZAorbG9neDI1NDAgbG9nMTAgMC4wMDAwMDAwMDAwMTk5NDA3MTg2MjM4Njg0NjYyNjk1NDgxOTkyMzkyMzM0NDQxMzQ1NCAtPiAtMTAuNzAwMjU5MTk0NjMyMzM5OTgwMjY2NTU5MjI0NDQ3MjEyMjYwMTE1MDIxNjM3NjI2IEluZXhhY3QgUm91bmRlZAorCistLSBQPTM0LCB3aXRoaW4gMC05OTk5CitQcmVjaXNpb246IDM0Citsb2d4MjIwMSBsb2cxMCAxLjUyMjUxMzIwMzg4OTcxNDE3OTA4ODMyNzMyODg2NDE4MyAgLT4gMC4xODI1NjEwNjc3MDk4ODk2MjUwNDk2NjUxMzMwNDkyMTA5IEluZXhhY3QgUm91bmRlZAorbG9neDIyMDIgbG9nMTAgMC4xNzExMjM3NzQ3Njk3MTczMTYxNTQwODA4ODg5MzA0MDQgIC0+IC0wLjc2NjY4OTY0ODM1NDg0NjI1ODI0NjE4OTgwOTI3NjQ0MDggSW5leGFjdCBSb3VuZGVkCitsb2d4MjIwMyBsb2cxMCAwLjAwMDAwMDA5OTc0NjcyMzYyNTE3MTQyODMxMDQ5NjM4MzggLT4gLTcuMDAxMTAxMzYwNjUyNTE4Mjc0MjcxNTY5MDEwMzEyMTE1IEluZXhhY3QgUm91bmRlZAorbG9neDIyMDQgbG9nMTAgMC4wMDA4ODU2MTAzNjI0MTIyNDc5NzY5NjQ3NTQzNDY4NjMzIC0+IC0zLjA1Mjc1NzMxMDQ3NjA3MDg5MTgzMDQ5MDMyNzEzODE5MCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjA1IGxvZzEwIDEuOTM4Mjc0ODY4NzM4MDMyOTMwNzA5NDk4MjIxMjM2NzU4ICAtPiAwLjI4NzQxNTM2NDgyNTk0NDk1MjAyMDE1MzYxNzE3MTQ1OTQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIwNiBsb2cxMCA0NzkuNTY2Nzg0NzgyMzgyNjcxMzA4MjYxMzQ0NTAxMDA5NyAgLT4gMi42ODA4NDkwOTU4NTAzNjEwNjg3MDkxNjUxNTcyODY0MzUgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIwNyBsb2cxMCA4ODU2LjEzNjU5OTE3ODgyMDIwMjE0MTgyMzE1NzMzNjgwNCAgLT4gMy45NDcyNDQzMDY1ODQ3NjcxMDE0ODA0NTQyNjE5NTA1NTkgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIwOCBsb2cxMCAwLjAwMDA5MTEwMjYzMTg4MDE5MDM5ODI2NDI4NzEzNDQ4NTggLT4gLTQuMDQwNDY5MDc2NDM0OTc5Mzk4NDM4NjE3NDY0MDMzODI2IEluZXhhY3QgUm91bmRlZAorbG9neDIyMDkgbG9nMTAgMC4wMDAwMDAwMDAwMDE3MjcxMTEyNjUwNDI3NDE0NzMyNjMwIC0+IC0xMS43NjI2Nzk2ODMxNDAzODc0ODk5NTE3ODIxMjY1NDkyMSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjEwIGxvZzEwIDYuOTYyNjA1MzcwMDc4ODg1NjQ3NjM5NTAzNTQ4MjI5Njk1ICAtPiAwLjg0Mjc3MTc4MDcyMDAzMjIzNTI2ODYzOTY5MjU5OTIyNTAgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIxMSBsb2cxMCAwLjMzNTQ4MDQ0Mjg5OTI3OTMxMzI4NTU5MjM1NDE2OTI3ODEgLT4gLTAuNDc0MzMyNzkyMzAxMjE1OTE3MDk2NzYzNjA3MDg0NDgzNCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjEyIGxvZzEwIDIuMDc5ODY0MjU3NDc0ODU5MDA4MjUyMTY1ODM2NjYzNTA0ICAtPiAwLjMxODAzNDk5MTYxOTgwNTkwNDY4MTI1MDY3NDEzODg4NTYgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIxMyBsb2cxMCAyODA1LjQ3OTUyOTI5MjkzOTQ5OTIyMDI3Njk4NjYyMTk4OCAgLT4gMy40NDgwMDcxMDQxMzk5NzQzNDQ1NjU5Nzg3ODA2MjQ3NDQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIxNCBsb2cxMCA2Ni40NTczMTEzMzAzNDE4NzM3NDU1NzAyODUzNzIxMzk0OSAgLT4gMS44MjI1NDI3NjcwMDU2NDQwNDE2NjE1MjA5MzYyMjMwODYgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIxNSBsb2cxMCAwLjAwMDAwMDEyMDY1MjEyNjE3NjI2ODE3MzgyNzQ4MjI4MzUgLT4gLTYuOTE4NDY1MDIwMzkwMjE2OTY5NTYxNDk0NzU1NzY3MzE4IEluZXhhY3QgUm91bmRlZAorbG9neDIyMTYgbG9nMTAgMC4wMDAwMDAwMDAxODg0ODkxOTE2MjY0NDAxMTYwNDcyMzgxIC0+IC05LjcyNDcxMzU0ODExOTA2NTM4NjA5MTkzMzAwNzUyODYzMyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjE3IGxvZzEwIDAuMDAwMDAxNTQ2NzI3OTU1MTcyNjMyNjU4MTMxNDU4Mjc1OSAtPiAtNS44MTA1ODYwNjUwNzA0MzUzODM3NTU3NTk1MTQ2MDg3MzggSW5leGFjdCBSb3VuZGVkCitsb2d4MjIxOCBsb2cxMCAwLjAwOTA3NzYzMTY3MjgwNjg1ODY3NDQ2MzM5MTQxMzU5NTIgLT4gLTIuMDQyMDI3NDQyODQzNzQ1ODg0NTAzMjgwOTU0MzkwMTE0IEluZXhhY3QgUm91bmRlZAorbG9neDIyMTkgbG9nMTAgMC4wMDAwMDAwMDAwMDI0NTQxMTA2NTI4NzEzMzkzNzQwMDMwIC0+IC0xMS42MTAxMDU4NTkzNTYzNTcxMzA5MDExOTE1NjA2OTQ3OSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjIwIGxvZzEwIDE0LjEyOTM2ODc5Mzg1ODYzNDEwMDgxMDg3NzUwNjQ1ODU2ICAtPiAxLjE1MDEyMjc2MDg5NTQ2Njk4OTg0MTA1NzM4NTc0MjY2MiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjIxIGxvZzEwIDAuMDAwMDAzNjkxMjQ4MTgzMTM5MjkyMjkyMjY0NzIzMTM5MiAtPiAtNS40MzI4MjY3NTM3ODk4OTIyODM1NTYyMTEzODA4MjQyMDMgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIyMiBsb2cxMCAwLjAwMDAwMDAwMDQwNjc0Nzc1MjU0MjA0MjQyNzAxMzg3MzQgLT4gLTkuMzkwNjc0ODM4MDUwMDczMTIyODU3ODY4MDEyNDc1MDYwIEluZXhhY3QgUm91bmRlZAorbG9neDIyMjMgbG9nMTAgNzA4MC4xMjI1NjI3MDUzOTk3NDQ5NjkzMTk1ODk4MDYxOTQgIC0+IDMuODUwMDQwNzc1NzQ3MTAzMzE4NzI0MzMwMDQ3NTQ2OTE2IEluZXhhY3QgUm91bmRlZAorbG9neDIyMjQgbG9nMTAgMjYxLjM0OTE0MTEzNjM2NzkyMDkxNzU1MjQ3OTAyNTU3MjUgIC0+IDIuNDE3MjIxMDc3MjI3NTM2MzE5NjU1Njk5NTE3NTMwODU1IEluZXhhY3QgUm91bmRlZAorbG9neDIyMjUgbG9nMTAgMDAzLjk5NDU1ODE0NDk5MTUyNDAwOTQ3MjgzODAwNDE0OTQgIC0+IDAuNjAxNDY4NzQ3MTUzMTk4ODI2MDgyMzA2Njk5Nzg0NTY5MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjI2IGxvZzEwIDAuMDAwMDAwMDAwMDU4MzU0OTE2NDU4ODQ5NTIwNjc2Nzg0MCAtPiAtMTAuMjMzOTIyNTQ4MzQxODI2NzcwMjMyMzE3MTM1MTkzNDEgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIyNyBsb2cxMCA5NTY3Ljk2MTgzMjYwNzI0MDI3ODM0Mjc2MTA4ODQ4NzQ4NCAgLT4gMy45ODA4MTk0MzQyMTExMDc2MzE1NjkzODYxNDcwMTYzNjggSW5leGFjdCBSb3VuZGVkCitsb2d4MjIyOCBsb2cxMCAwNi4yNjU5Mjk3OTE2MDM0Mjk3Mjc3NzIxOTgyODg2NzAzMyAgLT4gMC43OTY5ODU1MjQzOTY2MjIxNDA4NTk1MDI0MDEyNTc0NzI5IEluZXhhY3QgUm91bmRlZAorbG9neDIyMjkgbG9nMTAgMC4wMDAwMDAwMDAwNTg5ODQ3MDQ2NTk4MDY3MjczMjg3MzE5IC0+IC0xMC4yMjkyNjA1OTA3ODIwNjIxODcxNzc1NTI1MzU4MjkwNyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjMwIGxvZzEwIDU2Ny45Mzg4NjQ4MjM1NTg5MjA0NzY5NDQyODYzNzI0OTk3ICAtPiAyLjc1NDMwMTU4OTA1ODMxMzU3NjQ3MjM4MDI2MjkwNzYzOCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjMxIGxvZzEwIDAzOS43NzkwMzI1NDgwMDM3Nzc4OTE4MTYyMjY0ODgzNDE1ICAtPiAxLjU5OTY1NDIxNjU5MjAxOTE5OTYzOTI4NTMwODk5Nzg4NiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjMyIGxvZzEwIDAuMDAwMDAwMDAwNTEyMzk1MTkyMTg5NDE2MjE0OTgxNzIwNyAtPiAtOS4yOTAzOTQ5NTM4OTg4NjI2OTQ4NDczMjcxMzcyNDI2OTAgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIzMyBsb2cxMCAwLjAwMDAwMDAwMDAwMzg1MDA5OTk3MjM2MzY5MDQyNzY3MjMgLT4gLTExLjQxNDUyNzk5MzM3OTI0MDU2MTg2ODY3MzI0ODU0NjkxIEluZXhhY3QgUm91bmRlZAorbG9neDIyMzQgbG9nMTAgMC4wMDA2NzI2NTAwNjU4OTc3NzU5ODI1NjE2NTM3OTM1ODY0IC0+IC0zLjE3MjIxMDgxMDkyMjc2ODcyNTY4NzY3MTg0OTQyMTc5MiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjM1IGxvZzEwIDI2MC4yNDAwMjUwNDc1OTY3NTI4NDI5OTQzNzc5MTI2NTA3ICAtPiAyLjQxNTM3NDA5MjA3Mzc5OTIwNDIzNjgwMTM4MzA3MDA2NCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjM2IGxvZzEwIDAuMDAwMDAwMDAwNjEwMTk0MjMzOTM4NTEwMjU4NTA0MjU0OCAtPiAtOS4yMTQ1MzE5MDA1NjIwNDY1NTcxOTEyNjEyMjY2MzI1MDkgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIzNyBsb2cxMCAwLjAwMDAwMDAwMTA4NDY4Njc1MDEzODI3NDY3NjAwNjY1NTcgLT4gLTguOTY0Njk1NjY0ODgzMjgyNDA2MzU5ODc0MjQyMzg3MjM2IEluZXhhY3QgUm91bmRlZAorbG9neDIyMzggbG9nMTAgNjAuMjQwNzgzNzU1Njg4MTQ3NjkwMTAzMzM3MTE1MDk5MjggIC0+IDEuNzc5ODkwNjEzNTY3MDg0MjUzMTY4MzczMjY2NjQ4OTIyIEluZXhhY3QgUm91bmRlZAorbG9neDIyMzkgbG9nMTAgMC4wMDEyMDU4NzM4NzExNzU3NjY5MzM3NjAwMjUyOTg2MDkzIC0+IC0yLjkxODY5ODExNTAxMjYwNTkxNTc1MzcyODIyMDg5NjAxMCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjQwIGxvZzEwIDIzMC45NDUwOTMwMTk3ODQxNjAwNjExNTAzMDk1MTg1NjAwICAtPiAyLjM2MzUwODczOTA1NjgyMjg0Njc0Mjk0MjU5OTYyODk2NiBJbmV4YWN0IFJvdW5kZWQKKworLS0gUD0xNiwgd2l0aGluIDAtOTk5CitQcmVjaXNpb246IDE2Citsb2d4MjEwMSBsb2cxMCAwLjAwNzIwNjcxMTk2MDUxODQgLT4gLTIuMTQyMjYyODM1NTczMDM4IEluZXhhY3QgUm91bmRlZAorbG9neDIxMDIgbG9nMTAgNTAzLjY4Mjg0ODIyMjY2MjQgIC0+IDIuNzAyMTU3MTYyMTk1NjUyIEluZXhhY3QgUm91bmRlZAorbG9neDIxMDMgbG9nMTAgNjQuOTYwNzQ0NDc4MjE4MTUgIC0+IDEuODEyNjUwOTkzNDY0MTc0IEluZXhhY3QgUm91bmRlZAorbG9neDIxMDQgbG9nMTAgNDguNzU0MDg1OTc0NjcyNDYgIC0+IDEuNjg4MDExMDE4ODQyNjAwIEluZXhhY3QgUm91bmRlZAorbG9neDIxMDUgbG9nMTAgMC4wMzI5MDA5ODM5MjY5NTg3IC0+IC0xLjQ4Mjc5MTExMzk3NTI4MCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTA2IGxvZzEwIDIyMy41MzIwNDE1MDYwNjMzICAtPiAyLjM0OTMzOTc4NDUyMzQxMCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTA3IGxvZzEwIDczLjEyNzY1MDAyMjkyMTk0ICAtPiAxLjg2NDA4MTYxNzQ3NjI2OCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTA4IGxvZzEwIDQ4Ny4zNzQ5Mzc4MzU4NTA5ICAtPiAyLjY4Nzg2MzE5MjgwMjI1MiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTA5IGxvZzEwIDAuMDAwMDAxOTY3MTk4NzYyMSAtPiAtNS43MDYxNTE3NTc1NTc5MjYgSW5leGFjdCBSb3VuZGVkCitsb2d4MjExMCBsb2cxMCAwLjA1NzA2ODA2NjA2MDk3ODQgLT4gLTEuMjQzNjA2ODQ0Njk3ODczIEluZXhhY3QgUm91bmRlZAorbG9neDIxMTEgbG9nMTAgMzMuMTAzMTE2Mzg3ODg5OTggIC0+IDEuNTE5ODY4ODgwOTc2NzczIEluZXhhY3QgUm91bmRlZAorbG9neDIxMTIgbG9nMTAgMC4wNjg3MzgyNjk5MTg3MDc3IC0+IC0xLjE2MjgwMTQwMjg2ODE4NSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTEzIGxvZzEwIDI1OC45NDE2MTkzNjI2NDg0ICAtPiAyLjQxMzIwMTg1OTY1NDE0NSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTE0IGxvZzEwIDAuMDAwNTMwNjEwMDEzNjczNiAtPiAtMy4yNzUyMjQ1NTgyNjk3MjUgSW5leGFjdCBSb3VuZGVkCitsb2d4MjExNSBsb2cxMCA2NS43ODQ5MDM5MzQwODU3MiAgLT4gMS44MTgxMjYyNDQ4MjUxMDkgSW5leGFjdCBSb3VuZGVkCitsb2d4MjExNiBsb2cxMCA1MDQuMjMyODg0MjA3MzUxMCAgLT4gMi43MDI2MzExNjUzNDY5NTggSW5leGFjdCBSb3VuZGVkCitsb2d4MjExNyBsb2cxMCA5LjQxNzQzMjc1NTgxNTAyNyAgLT4gMC45NzM5MzI1Mjc4NTI0NTAzIEluZXhhY3QgUm91bmRlZAorbG9neDIxMTggbG9nMTAgMDA2LjcwNTQ4MzUzNTU0OTggIC0+IDAuODI2NDMwMTAwNDk0NzY0MCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTE5IGxvZzEwIDAuMDkxNzAxMjI3MjM2MzkxNSAtPiAtMS4wMzc2MjQ4NTIxMzMzOTkgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEyMCBsb2cxMCA1Ljk1OTQwNDM4NTI0NDkyMSAgLT4gMC43NzUyMDI4NTYxOTUzNDAxIEluZXhhY3QgUm91bmRlZAorbG9neDIxMjEgbG9nMTAgMC4wMDAxMjA5NzU5MTQ4NDg2IC0+IC0zLjkxNzMwMTA4NDk2ODkwMyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTIyIGxvZzEwIDAuMDAwNDcwNjExMjEzOTgzOCAtPiAtMy4zMjczMzc3Mjg0MjgwMzkgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEyMyBsb2cxMCAwLjAwNjk3MDA0NTczNzcwNDYgLT4gLTIuMTU2NzY0MzcyMDM1NzcxIEluZXhhY3QgUm91bmRlZAorbG9neDIxMjQgbG9nMTAgMC41MTU1NTg0NTY5ODUyNjE5IC0+IC0wLjI4NzcyMjA4NDc4MDUwMjUgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEyNSBsb2cxMCA4OC4wNjAwNTg4NTYwNzQxNCAgLT4gMS45NDQ3Nzg5NzEzODk5MTMgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEyNiBsb2cxMCAwLjA0NDgyNDAwMzgyMTk4NjYgLT4gLTEuMzQ4NDg5MzUzNTA5NzA5IEluZXhhY3QgUm91bmRlZAorbG9neDIxMjcgbG9nMTAgMy40MTk2MjI0ODQwNTk1NjUgIC0+IDAuNTMzOTc4MTYzOTEwMTE0NSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTI4IGxvZzEwIDUuMTcxMTIzMzUzODU4NzIxICAtPiAwLjcxMzU4NDg5NzcxNDI4NTQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEyOSBsb2cxMCAwLjAwMDIxMzMxODgzMTk4MDcgLT4gLTMuNjcwOTcwODAyOTQ1ODcyIEluZXhhY3QgUm91bmRlZAorbG9neDIxMzAgbG9nMTAgNDYuMjEwODY3MDMxMzY5NjYgIC0+IDEuNjY0NzQ0MTE3MDQ1MTQ5IEluZXhhY3QgUm91bmRlZAorbG9neDIxMzEgbG9nMTAgMC4wMDAwNjMxMDUzNzE0NDE1IC0+IC00LjE5OTkzMzY3MjYzOTg4MCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTMyIGxvZzEwIDc4LjY2MDE5MTk2ODcwNjk4ICAtPiAxLjg5NTc1NTAwMTk2MjQ2OSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTMzIGxvZzEwIDAuMDAwNzE1MjI3ODM1MTE4OCAtPiAtMy4xNDU1NTU1OTIwODIyOTcgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEzNCBsb2cxMCA0NS41MjUwOTgxOTkyODUzNiAgLT4gMS42NTgyNTA4OTEyNTY4OTIgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEzNSBsb2cxMCAwLjAwMDA3MDMyMjc3OTU3NDAgLT4gLTQuMTUyOTAzOTcxNjk3MTgzIEluZXhhY3QgUm91bmRlZAorbG9neDIxMzYgbG9nMTAgMjYuMjQ0Mzg2NDE0MjY2NjkgIC0+IDEuNDE5MDM2NDIzNTUwNTk5IEluZXhhY3QgUm91bmRlZAorbG9neDIxMzcgbG9nMTAgMC4wMDAwMDQ0NjU0ODI5NTM1IC0+IC01LjM1MDEzMTU2NDE2NjgxNyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTM4IGxvZzEwIDAuNzM2MDcwMjczMzA2MjUyOSAtPiAtMC4xMzMwODA3MjExODkzNjExIEluZXhhY3QgUm91bmRlZAorbG9neDIxMzkgbG9nMTAgOC40MTcwNTkxNzY0Njk2NTUgIC0+IDAuOTI1MTYwMzgwNTExMjc3OCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTQwIGxvZzEwIDAuMDAwMjkyNjU3MDc2Nzk2OCAtPiAtMy41MzM2NDA5Njk2NjQ4MTggSW5leGFjdCBSb3VuZGVkCisKKy0tIFA9Nywgd2l0aGluIDAtOTkKK1ByZWNpc2lvbjogNworbG9neDIwMDEgbG9nMTAgNTcuMjYwODkgIC0+IDEuNzU3ODU4IEluZXhhY3QgUm91bmRlZAorbG9neDIwMDIgbG9nMTAgMC4wNTc1NDIxIC0+IC0xLjI0MDAxNCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDAzIGxvZzEwIDAuNTkxODQ2NSAtPiAtMC4yMjc3OTA5IEluZXhhY3QgUm91bmRlZAorbG9neDIwMDQgbG9nMTAgMC4wMDY4Nzc2IC0+IC0yLjE2MjU2MyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDA1IGxvZzEwIDAuMDA2NjgzMyAtPiAtMi4xNzUwMDkgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAwNiBsb2cxMCA5LjkyNjk2MyAgLT4gMC45OTY4MTY0IEluZXhhY3QgUm91bmRlZAorbG9neDIwMDcgbG9nMTAgMC4wMDQxODUyIC0+IC0yLjM3ODI4NCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDA4IGxvZzEwIDg0LjE1NDEyICAtPiAxLjkyNTA3NSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDA5IGxvZzEwIDIuNDY2ODU2ICAtPiAwLjM5MjE0MzggSW5leGFjdCBSb3VuZGVkCitsb2d4MjAxMCBsb2cxMCAwLjAwNTgwNDcgLT4gLTIuMjM2MjIwIEluZXhhY3QgUm91bmRlZAorbG9neDIwMTEgbG9nMTAgOS44ODUxNTQgIC0+IDAuOTk0OTgzNCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDEyIGxvZzEwIDAuNjY2NzY1NCAtPiAtMC4xNzYwMjY5IEluZXhhY3QgUm91bmRlZAorbG9neDIwMTMgbG9nMTAgMzQuNjU3MzYgIC0+IDEuNTM5Nzk1IEluZXhhY3QgUm91bmRlZAorbG9neDIwMTQgbG9nMTAgMC4wMDI2ODg0IC0+IC0yLjU3MDUwNiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDE1IGxvZzEwIDAuMDQzMjc2NyAtPiAtMS4zNjM3NDYgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAxNiBsb2cxMCA2Ni4wMTQwNyAgLT4gMS44MTk2MzcgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAxNyBsb2cxMCAwLjAwNzA1NzIgLT4gLTIuMTUxMzY4IEluZXhhY3QgUm91bmRlZAorbG9neDIwMTggbG9nMTAgMC4wNzMxNjEzIC0+IC0xLjEzNTcxOSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDE5IGxvZzEwIDkuODM4OTgzICAtPiAwLjk5Mjk1MDIgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAyMCBsb2cxMCAxNS44OTY5NiAgLT4gMS4yMDEzMTQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAyMSBsb2cxMCA4LjQ1OTI0NyAgLT4gMC45MjczMzE3IEluZXhhY3QgUm91bmRlZAorbG9neDIwMjIgbG9nMTAgMC4wMDEwODczIC0+IC0yLjk2MzY1MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDIzIGxvZzEwIDAuNjQ5ODYxOSAtPiAtMC4xODcxNzg5IEluZXhhY3QgUm91bmRlZAorbG9neDIwMjQgbG9nMTAgMC4wODQ3MDA4IC0+IC0xLjA3MjExMiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDI1IGxvZzEwIDAuMDA3NTQ4OSAtPiAtMi4xMjIxMTYgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAyNiBsb2cxMCA1MS4xMTE1MiAgLT4gMS43MDg1MTkgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAyNyBsb2cxMCAwLjcyMzM4NjYgLT4gLTAuMTQwNjI5NSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDI4IGxvZzEwIDIuMjU0NzIxICAtPiAwLjM1MzA5MjggSW5leGFjdCBSb3VuZGVkCitsb2d4MjAyOSBsb2cxMCA2LjU2ODQ0NCAgLT4gMC44MTc0NjI1IEluZXhhY3QgUm91bmRlZAorbG9neDIwMzAgbG9nMTAgODMuNzI2MzkgIC0+IDEuOTIyODYyIEluZXhhY3QgUm91bmRlZAorbG9neDIwMzEgbG9nMTAgNi43MjA1ODUgIC0+IDAuODI3NDA3MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDMyIGxvZzEwIDg3LjkwMzY2ICAtPiAxLjk0NDAwNyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDMzIGxvZzEwIDAuMDQzMzMyNCAtPiAtMS4zNjMxODcgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAzNCBsb2cxMCAzNC42MzkxMiAgLT4gMS41Mzk1NjcgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAzNSBsb2cxMCAwLjgwODkwNTkgLT4gLTAuMDkyMTAyMDAgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAzNiBsb2cxMCA3Ljc5MzQwNSAgLT4gMC44OTE3MjcyIEluZXhhY3QgUm91bmRlZAorbG9neDIwMzcgbG9nMTAgMC4wMDQxNzU3IC0+IC0yLjM3OTI3MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDM4IGxvZzEwIDcuMTM1NDE3ICAtPiAwLjg1MzQxOTQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAzOSBsb2cxMCAxMi40OTU3MCAgLT4gMS4wOTY3NjEgSW5leGFjdCBSb3VuZGVkCitsb2d4MjA0MCBsb2cxMCA2LjM1NjI3NiAgLT4gMC44MDMyMDI3IEluZXhhY3QgUm91bmRlZAorCistLS0tLS0tLQorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzcGVjaWFsIHZhbHVlcworbG9neDgyMCAgbG9nMTAgICBJbmZpbml0eSAtPiAgIEluZmluaXR5Citsb2d4ODIxICBsb2cxMCAgIDAgICAgICAgIC0+ICAtSW5maW5pdHkKK2xvZ3g4MjIgIGxvZzEwICAgTmFOICAgICAgLT4gICBOYU4KK2xvZ3g4MjMgIGxvZzEwICAgc05hTiAgICAgLT4gICBOYU4gICAgIEludmFsaWRfb3BlcmF0aW9uCistLSBwcm9wYWdhdGluZyBOYU5zCitsb2d4ODI0ICBsb2cxMCAgIHNOYU4xMjMgIC0+ICAgTmFOMTIzICBJbnZhbGlkX29wZXJhdGlvbgorbG9neDgyNSAgbG9nMTAgICAtc05hTjMyMSAtPiAgLU5hTjMyMSAgSW52YWxpZF9vcGVyYXRpb24KK2xvZ3g4MjYgIGxvZzEwICAgTmFONDU2ICAgLT4gICBOYU40NTYKK2xvZ3g4MjcgIGxvZzEwICAgLU5hTjY1NCAgLT4gIC1OYU42NTQKK2xvZ3g4MjggIGxvZzEwICAgTmFOMSAgICAgLT4gICBOYU4xCisKKworLS0gSW52YWxpZCBvcGVyYXRpb25zIGR1ZSB0byByZXN0cmljdGlvbnMKKy0tIFtuZXh0IHR3byBwcm9iYWJseSBza2lwcGVkIGJ5IG1vc3QgdGVzdCBoYXJuZXNzZXNdCitwcmVjaXNpb246IDEwMDAwMDAwMAorbG9neDkwMSAgbG9nMTAgMSAtPiAgTmFOICAgICAgICAgICAgSW52YWxpZF9jb250ZXh0CitwcmVjaXNpb246ICA5OTk5OTk5OQorbG9neDkwMiAgbG9nMTAgMCAtPiAgTmFOICAgICAgICAgICAgSW52YWxpZF9jb250ZXh0CisKK3ByZWNpc2lvbjogOQorbWF4RXhwb25lbnQ6ICAgMTAwMDAwMAorbWluRXhwb25lbnQ6ICAgLTk5OTk5OQorbG9neDkwMyAgbG9nMTAgMSAgIC0+ICBOYU4gICAgICAgICAgICBJbnZhbGlkX2NvbnRleHQKK21heEV4cG9uZW50OiAgICA5OTk5OTkKK21pbkV4cG9uZW50OiAgIC05OTk5OTkKK2xvZ3g5MDQgIGxvZzEwIDAgLT4gIC1JbmZpbml0eQorbWF4RXhwb25lbnQ6ICAgIDk5OTk5OQorbWluRXhwb25lbnQ6ICAtMTAwMDAwMAorbG9neDkwNSAgbG9nMTAgMSAgIC0+ICBOYU4gICAgICAgICAgICBJbnZhbGlkX2NvbnRleHQKK21heEV4cG9uZW50OiAgICA5OTk5OTkKK21pbkV4cG9uZW50OiAgIC05OTk5OTgKK2xvZ3g5MDYgIGxvZzEwIDAgLT4gIC1JbmZpbml0eQorCistLSBOdWxsIHRlc3QKK2xvZ3g5MDAgIGxvZzEwICMgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2xvZ2IuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbG9nYi5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzkwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2xvZ2IuZGVjVGVzdApAQCAtMCwwICsxLDE4OCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBsb2diLmRlY1Rlc3QgLS0gcmV0dXJuIGludGVncmFsIGFkanVzdGVkIGV4cG9uZW50IGFzIHBlciA3NTRyICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDA1LCAyMDA5LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgZW1waGFzaXNlcyB0aGUgdGVzdGluZyBvZiBub3RhYmxlIGNhc2VzLCBhcyB0aGV5IHdpbGwgb2Z0ZW4KKy0tIGhhdmUgdW51c3VhbCBwYXRocyAoZXNwZWNpYWxseSB0aGUgMTAqKm4gcmVzdWx0cykuCisKK2V4dGVuZGVkOiAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorCistLSBiYXNpY3MgJiBleGFtcGxlcworcHJlY2lzaW9uOiAgIDkKK2xvZ2J4MDAxIGxvZ2IgIDAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworbG9nYngwMDIgbG9nYiAgMUUtOTk5ICAgICAgICAgICAgLT4gLTk5OQorbG9nYngwMDMgbG9nYiAgOUUtOTk5ICAgICAgICAgICAgLT4gLTk5OQorbG9nYngwMDQgbG9nYiAgMC4wMDEgICAgICAgICAgICAgLT4gLTMKK2xvZ2J4MDA1IGxvZ2IgIDAuMDMgICAgICAgICAgICAgIC0+IC0yCitsb2dieDAwNiBsb2diICAxICAgICAgICAgICAgICAgICAtPiAgMAorbG9nYngwMDcgbG9nYiAgMiAgICAgICAgICAgICAgICAgLT4gIDAKK2xvZ2J4MDA4IGxvZ2IgIDIuNSAgICAgICAgICAgICAgIC0+ICAwCitsb2dieDAwOSBsb2diICAyLjUwICAgICAgICAgICAgICAtPiAgMAorbG9nYngwMTAgbG9nYiAgMTAgICAgICAgICAgICAgICAgLT4gIDEKK2xvZ2J4MDExIGxvZ2IgIDcwICAgICAgICAgICAgICAgIC0+ICAxCitsb2dieDAxMiBsb2diICAxMDAgICAgICAgICAgICAgICAtPiAgMgorbG9nYngwMTMgbG9nYiAgMjUwICAgICAgICAgICAgICAgLT4gIDIKK2xvZ2J4MDE0IGxvZ2IgK0luZmluaXR5ICAgICAgICAgIC0+ICBJbmZpbml0eQorCistLSBuZWdhdGl2ZXMgYXJlIHRyZWF0ZWQgYXMgcG9zaXRpdmVzCitsb2dieDAyMSBsb2diIC0wICAgICAgICAgICAgICAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2xvZ2J4MDIyIGxvZ2IgLTFFLTk5OSAgICAgICAgICAgIC0+IC05OTkKK2xvZ2J4MDIzIGxvZ2IgLTlFLTk5OSAgICAgICAgICAgIC0+IC05OTkKK2xvZ2J4MDI0IGxvZ2IgLTAuMDAxICAgICAgICAgICAgIC0+IC0zCitsb2dieDAyNSBsb2diIC0xICAgICAgICAgICAgICAgICAtPiAgMAorbG9nYngwMjYgbG9nYiAtMiAgICAgICAgICAgICAgICAgLT4gIDAKK2xvZ2J4MDI3IGxvZ2IgLTEwICAgICAgICAgICAgICAgIC0+ICAxCitsb2dieDAyOCBsb2diIC03MCAgICAgICAgICAgICAgICAtPiAgMQorbG9nYngwMjkgbG9nYiAtMTAwICAgICAgICAgICAgICAgLT4gIDIKK2xvZ2J4MDMwIGxvZ2IgLTEwMDAwMDAwMCAgICAgICAgIC0+ICA4Citsb2dieDAzMSBsb2diIC1JbmZpbml0eSAgICAgICAgICAtPiAgSW5maW5pdHkKKworLS0gemVyb3MKK2xvZ2J4MTExIGxvZ2IgICAgICAgICAgMCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworbG9nYngxMTIgbG9nYiAgICAgICAgIC0wICAgLT4gLUluZmluaXR5ICBEaXZpc2lvbl9ieV96ZXJvCitsb2dieDExMyBsb2diICAgICAgIDBFKzQgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2xvZ2J4MTE0IGxvZ2IgICAgICAtMEUrNCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworbG9nYngxMTUgbG9nYiAgICAgMC4wMDAwICAgLT4gLUluZmluaXR5ICBEaXZpc2lvbl9ieV96ZXJvCitsb2dieDExNiBsb2diICAgIC0wLjAwMDAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2xvZ2J4MTE3IGxvZ2IgICAgICAwRS0xNDEgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworbG9nYngxMTggbG9nYiAgICAgLTBFLTE0MSAgLT4gLUluZmluaXR5ICBEaXZpc2lvbl9ieV96ZXJvCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitsb2dieDEyMSBsb2diICAgMjY4MjY4MjY4ICAgICAgICAtPiA4Citsb2dieDEyMiBsb2diICAtMjY4MjY4MjY4ICAgICAgICAtPiA4Citsb2dieDEyMyBsb2diICAgMTM0MTM0MTM0ICAgICAgICAtPiA4Citsb2dieDEyNCBsb2diICAtMTM0MTM0MTM0ICAgICAgICAtPiA4CisKKy0tIE5tYXgsIE5taW4sIE50aW55Citsb2dieDEzMSBsb2diICA5Ljk5OTk5OTk5RSs5OTkgICAtPiA5OTkKK2xvZ2J4MTMyIGxvZ2IgIDFFLTk5OSAgICAgICAgICAgIC0+IC05OTkKK2xvZ2J4MTMzIGxvZ2IgIDEuMDAwMDAwMDBFLTk5OSAgIC0+IC05OTkKK2xvZ2J4MTM0IGxvZ2IgIDFFLTEwMDcgICAgICAgICAgIC0+IC0xMDA3CisKK2xvZ2J4MTM1IGxvZ2IgIC0xRS0xMDA3ICAgICAgICAgIC0+IC0xMDA3Citsb2dieDEzNiBsb2diICAtMS4wMDAwMDAwMEUtOTk5ICAtPiAtOTk5Citsb2dieDEzNyBsb2diICAtMUUtOTk5ICAgICAgICAgICAtPiAtOTk5Citsb2dieDEzOCBsb2diICAtOS45OTk5OTk5OUUrOTk5ICAtPiAgOTk5CisKKy0tIG9uZXMKK2xvZ2J4MDA2MSBsb2diICAxICAgICAgICAgICAgICAgICAtPiAgIDAKK2xvZ2J4MDA2MiBsb2diICAxLjAgICAgICAgICAgICAgICAtPiAgIDAKK2xvZ2J4MDA2MyBsb2diICAxLjAwMDAwMDAwMDAwMDAwMCAtPiAgIDAKK2xvZ2J4MDA2NCBsb2diICAxLjAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgIDAKKworLS0gbm90YWJsZSBjYXNlcyAtLSBleGFjdCBwb3dlcnMgb2YgMTAKK2xvZ2J4MTEwMCBsb2diIDEgICAgICAgICAgICAgLT4gMAorbG9nYngxMTAxIGxvZ2IgMTAgICAgICAgICAgICAtPiAxCitsb2dieDExMDIgbG9nYiAxMDAgICAgICAgICAgIC0+IDIKK2xvZ2J4MTEwMyBsb2diIDEwMDAgICAgICAgICAgLT4gMworbG9nYngxMTA0IGxvZ2IgMTAwMDAgICAgICAgICAtPiA0Citsb2dieDExMDUgbG9nYiAxMDAwMDAgICAgICAgIC0+IDUKK2xvZ2J4MTEwNiBsb2diIDEwMDAwMDAgICAgICAgLT4gNgorbG9nYngxMTA3IGxvZ2IgMTAwMDAwMDAgICAgICAtPiA3Citsb2dieDExMDggbG9nYiAxMDAwMDAwMDAgICAgIC0+IDgKK2xvZ2J4MTEwOSBsb2diIDEwMDAwMDAwMDAgICAgLT4gOQorbG9nYngxMTEwIGxvZ2IgMTAwMDAwMDAwMDAgICAtPiAxMAorbG9nYngxMTExIGxvZ2IgMTAwMDAwMDAwMDAwICAtPiAxMQorbG9nYngxMTEyIGxvZ2IgMTAwMDAwMDAwMDAwMCAtPiAxMgorbG9nYngxMTEzIGxvZ2IgMC4wMDAwMDAwMDAwMSAtPiAtMTEKK2xvZ2J4MTExNCBsb2diIDAuMDAwMDAwMDAwMSAtPiAtMTAKK2xvZ2J4MTExNSBsb2diIDAuMDAwMDAwMDAxIC0+IC05Citsb2dieDExMTYgbG9nYiAwLjAwMDAwMDAxIC0+IC04Citsb2dieDExMTcgbG9nYiAwLjAwMDAwMDEgLT4gLTcKK2xvZ2J4MTExOCBsb2diIDAuMDAwMDAxIC0+IC02Citsb2dieDExMTkgbG9nYiAwLjAwMDAxIC0+IC01Citsb2dieDExMjAgbG9nYiAwLjAwMDEgLT4gLTQKK2xvZ2J4MTEyMSBsb2diIDAuMDAxIC0+IC0zCitsb2dieDExMjIgbG9nYiAwLjAxIC0+IC0yCitsb2dieDExMjMgbG9nYiAwLjEgLT4gLTEKK2xvZ2J4MTEyNCBsb2diIDFFLTk5ICAtPiAtOTkKK2xvZ2J4MTEyNSBsb2diIDFFLTEwMCAtPiAtMTAwCitsb2dieDExMjYgbG9nYiAxRS0zODMgLT4gLTM4MworbG9nYngxMTI3IGxvZ2IgMUUtOTk5IC0+IC05OTkKKworLS0gc3VnZ2VzdGlvbnMgZnJvbSBJbGFuIE5laGFtYQorbG9nYngxNDAwIGxvZ2IgMTBFLTMgICAgLT4gLTIKK2xvZ2J4MTQwMSBsb2diIDEwRS0yICAgIC0+IC0xCitsb2dieDE0MDIgbG9nYiAxMDBFLTIgICAtPiAgMAorbG9nYngxNDAzIGxvZ2IgMTAwMEUtMiAgLT4gIDEKK2xvZ2J4MTQwNCBsb2diIDEwMDAwRS0yIC0+ICAyCitsb2dieDE0MDUgbG9nYiAxMEUtMSAgICAtPiAgMAorbG9nYngxNDA2IGxvZ2IgMTAwRS0xICAgLT4gIDEKK2xvZ2J4MTQwNyBsb2diIDEwMDBFLTEgIC0+ICAyCitsb2dieDE0MDggbG9nYiAxMDAwMEUtMSAtPiAgMworbG9nYngxNDA5IGxvZ2IgMTBFMCAgICAgLT4gIDEKK2xvZ2J4MTQxMCBsb2diIDEwMEUwICAgIC0+ICAyCitsb2dieDE0MTEgbG9nYiAxMDAwRTAgICAtPiAgMworbG9nYngxNDEyIGxvZ2IgMTAwMDBFMCAgLT4gIDQKK2xvZ2J4MTQxMyBsb2diIDEwRTEgICAgIC0+ICAyCitsb2dieDE0MTQgbG9nYiAxMDBFMSAgICAtPiAgMworbG9nYngxNDE1IGxvZ2IgMTAwMEUxICAgLT4gIDQKK2xvZ2J4MTQxNiBsb2diIDEwMDAwRTEgIC0+ICA1Citsb2dieDE0MTcgbG9nYiAxMEUyICAgICAtPiAgMworbG9nYngxNDE4IGxvZ2IgMTAwRTIgICAgLT4gIDQKK2xvZ2J4MTQxOSBsb2diIDEwMDBFMiAgIC0+ICA1Citsb2dieDE0MjAgbG9nYiAxMDAwMEUyICAtPiAgNgorCistLSBpbmV4YWN0cworcHJlY2lzaW9uOiAyCitsb2dieDE1MDAgbG9nYiAxMDAwMEUyICAgICAgIC0+ICA2Citsb2dieDE1MDEgbG9nYiAxRSs5OSAgICAgICAgIC0+ICA5OQorbG9nYngxNTAyIGxvZ2IgMUUtOTkgICAgICAgICAtPiAtOTkKK2xvZ2J4MTUwMyBsb2diIDFFKzEwMCAgICAgICAgLT4gIDEuMEUrMiAgUm91bmRlZAorbG9nYngxNTA0IGxvZ2IgMUUrOTk5ICAgICAgICAtPiAgMS4wRSszICBJbmV4YWN0IFJvdW5kZWQKK2xvZ2J4MTUwNSBsb2diIDFFLTEwMCAgICAgICAgLT4gLTEuMEUrMiAgUm91bmRlZAorbG9nYngxNTA2IGxvZ2IgMUUtOTk5ICAgICAgICAtPiAtMS4wRSszICBJbmV4YWN0IFJvdW5kZWQKK2xvZ2J4MTUwNyBsb2diIDFFLTExMTEgICAgICAgLT4gLTEuMUUrMyAgSW5leGFjdCBSb3VuZGVkCitsb2dieDE1MDggbG9nYiAxRS0zMzMzICAgICAgIC0+IC0zLjNFKzMgIEluZXhhY3QgUm91bmRlZAorbG9nYngxNTA5IGxvZ2IgMUUtNjY2NiAgICAgICAtPiAtNi43RSszICBJbmV4YWN0IFJvdW5kZWQKK2xvZ2J4MTUxMCBsb2diIDFFKzk5OTk5OTk5OSAgLT4gIDEuMEUrOSAgSW5leGFjdCBSb3VuZGVkCitsb2dieDE1MTEgbG9nYiAxRS05OTk5OTk5OTkgIC0+IC0xLjBFKzkgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxCitsb2dieDE1MTcgbG9nYiAxRS0xMTExICAgICAgIC0+IC0xRSszICAgIEluZXhhY3QgUm91bmRlZAorbG9nYngxNTE4IGxvZ2IgMUUtMzMzMyAgICAgICAtPiAtM0UrMyAgICBJbmV4YWN0IFJvdW5kZWQKK2xvZ2J4MTUxOSBsb2diIDFFLTY2NjYgICAgICAgLT4gLTdFKzMgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDgKK2xvZ2J4MTUyMCBsb2diIDFFKzk5OTk5OTk5OSAgLT4gIDEuMDAwMDAwMEUrOSBJbmV4YWN0IFJvdW5kZWQKK2xvZ2J4MTUyMSBsb2diIDFFLTk5OTk5OTk5OSAgLT4gLTEuMDAwMDAwMEUrOSBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogOQorbG9nYngxNTIzIGxvZ2IgMUUrOTk5OTk5OTk5ICAtPiAgOTk5OTk5OTk5Citsb2dieDE1MjQgbG9nYiAxRS05OTk5OTk5OTkgIC0+IC05OTk5OTk5OTkKKworLS0gc3BlY2lhbCB2YWx1ZXMKK3ByZWNpc2lvbjogOQorbG9nYng4MjAgIGxvZ2IgICBJbmZpbml0eSAtPiAgIEluZmluaXR5Citsb2dieDgyMSAgbG9nYiAgLUluZmluaXR5IC0+ICAgSW5maW5pdHkKK2xvZ2J4ODIyICBsb2diICAgMCAgICAgICAgLT4gIC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitsb2dieDgyMyAgbG9nYiAgIE5hTiAgICAgIC0+ICAgTmFOCitsb2dieDgyNCAgbG9nYiAgIHNOYU4gICAgIC0+ICAgTmFOICAgICBJbnZhbGlkX29wZXJhdGlvbgorLS0gcHJvcGFnYXRpbmcgTmFOcworbG9nYng4MjUgIGxvZ2IgICBzTmFOMTIzICAtPiAgIE5hTjEyMyAgSW52YWxpZF9vcGVyYXRpb24KK2xvZ2J4ODI2ICBsb2diICAgLXNOYU4zMjEgLT4gIC1OYU4zMjEgIEludmFsaWRfb3BlcmF0aW9uCitsb2dieDgyNyAgbG9nYiAgIE5hTjQ1NiAgIC0+ICAgTmFONDU2Citsb2dieDgyOCAgbG9nYiAgIC1OYU42NTQgIC0+ICAtTmFONjU0Citsb2dieDgyOSAgbG9nYiAgIE5hTjEgICAgIC0+ICAgTmFOMQorCistLSBOdWxsIHRlc3QKK2xvZ2J4OTAwICBsb2diICMgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL21heC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9tYXguZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmI1NzFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9tYXguZGVjVGVzdApAQCAtMCwwICsxLDQyNCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBtYXguZGVjVGVzdCAtLSBkZWNpbWFsIG1heGltdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIHdlIGFzc3VtZSB0aGF0IGJhc2UgY29tcGFyaXNvbiBpcyB0ZXN0ZWQgaW4gY29tcGFyZS5kZWNUZXN0LCBzbworLS0gdGhlc2UgbWFpbmx5IGNvdmVyIHNwZWNpYWwgY2FzZXMgYW5kIHJvdW5kaW5nCisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIHNhbml0eSBjaGVja3MKK21heHgwMDEgbWF4ICAtMiAgLTIgIC0+IC0yCittYXh4MDAyIG1heCAgLTIgIC0xICAtPiAtMQorbWF4eDAwMyBtYXggIC0yICAgMCAgLT4gIDAKK21heHgwMDQgbWF4ICAtMiAgIDEgIC0+ICAxCittYXh4MDA1IG1heCAgLTIgICAyICAtPiAgMgorbWF4eDAwNiBtYXggIC0xICAtMiAgLT4gLTEKK21heHgwMDcgbWF4ICAtMSAgLTEgIC0+IC0xCittYXh4MDA4IG1heCAgLTEgICAwICAtPiAgMAorbWF4eDAwOSBtYXggIC0xICAgMSAgLT4gIDEKK21heHgwMTAgbWF4ICAtMSAgIDIgIC0+ICAyCittYXh4MDExIG1heCAgIDAgIC0yICAtPiAgMAorbWF4eDAxMiBtYXggICAwICAtMSAgLT4gIDAKK21heHgwMTMgbWF4ICAgMCAgIDAgIC0+ICAwCittYXh4MDE0IG1heCAgIDAgICAxICAtPiAgMQorbWF4eDAxNSBtYXggICAwICAgMiAgLT4gIDIKK21heHgwMTYgbWF4ICAgMSAgLTIgIC0+ICAxCittYXh4MDE3IG1heCAgIDEgIC0xICAtPiAgMQorbWF4eDAxOCBtYXggICAxICAgMCAgLT4gIDEKK21heHgwMTkgbWF4ICAgMSAgIDEgIC0+ICAxCittYXh4MDIwIG1heCAgIDEgICAyICAtPiAgMgorbWF4eDAyMSBtYXggICAyICAtMiAgLT4gIDIKK21heHgwMjIgbWF4ICAgMiAgLTEgIC0+ICAyCittYXh4MDIzIG1heCAgIDIgICAwICAtPiAgMgorbWF4eDAyNSBtYXggICAyICAgMSAgLT4gIDIKK21heHgwMjYgbWF4ICAgMiAgIDIgIC0+ICAyCisKKy0tIGV4dGVuZGVkIHplcm9zCittYXh4MDMwIG1heCAgIDAgICAgIDAgICAtPiAgMAorbWF4eDAzMSBtYXggICAwICAgIC0wICAgLT4gIDAKK21heHgwMzIgbWF4ICAgMCAgICAtMC4wIC0+ICAwCittYXh4MDMzIG1heCAgIDAgICAgIDAuMCAtPiAgMAorbWF4eDAzNCBtYXggIC0wICAgICAwICAgLT4gIDAgICAgLS0gbm90ZTogLTAgPSAwLCBidXQgMCBjaG9zZW4KK21heHgwMzUgbWF4ICAtMCAgICAtMCAgIC0+IC0wCittYXh4MDM2IG1heCAgLTAgICAgLTAuMCAtPiAtMC4wCittYXh4MDM3IG1heCAgLTAgICAgIDAuMCAtPiAgMC4wCittYXh4MDM4IG1heCAgIDAuMCAgIDAgICAtPiAgMAorbWF4eDAzOSBtYXggICAwLjAgIC0wICAgLT4gIDAuMAorbWF4eDA0MCBtYXggICAwLjAgIC0wLjAgLT4gIDAuMAorbWF4eDA0MSBtYXggICAwLjAgICAwLjAgLT4gIDAuMAorbWF4eDA0MiBtYXggIC0wLjAgICAwICAgLT4gIDAKK21heHgwNDMgbWF4ICAtMC4wICAtMCAgIC0+IC0wLjAKK21heHgwNDQgbWF4ICAtMC4wICAtMC4wIC0+IC0wLjAKK21heHgwNDUgbWF4ICAtMC4wICAgMC4wIC0+ICAwLjAKKworbWF4eDA1MCBtYXggIC0wRTEgICAwRTEgLT4gIDBFKzEKK21heHgwNTEgbWF4ICAtMEUyICAgMEUyIC0+ICAwRSsyCittYXh4MDUyIG1heCAgLTBFMiAgIDBFMSAtPiAgMEUrMQorbWF4eDA1MyBtYXggIC0wRTEgICAwRTIgLT4gIDBFKzIKK21heHgwNTQgbWF4ICAgMEUxICAtMEUxIC0+ICAwRSsxCittYXh4MDU1IG1heCAgIDBFMiAgLTBFMiAtPiAgMEUrMgorbWF4eDA1NiBtYXggICAwRTIgIC0wRTEgLT4gIDBFKzIKK21heHgwNTcgbWF4ICAgMEUxICAtMEUyIC0+ICAwRSsxCisKK21heHgwNTggbWF4ICAgMEUxICAgMEUxIC0+ICAwRSsxCittYXh4MDU5IG1heCAgIDBFMiAgIDBFMiAtPiAgMEUrMgorbWF4eDA2MCBtYXggICAwRTIgICAwRTEgLT4gIDBFKzIKK21heHgwNjEgbWF4ICAgMEUxICAgMEUyIC0+ICAwRSsyCittYXh4MDYyIG1heCAgLTBFMSAgLTBFMSAtPiAtMEUrMQorbWF4eDA2MyBtYXggIC0wRTIgIC0wRTIgLT4gLTBFKzIKK21heHgwNjQgbWF4ICAtMEUyICAtMEUxIC0+IC0wRSsxCittYXh4MDY1IG1heCAgLTBFMSAgLTBFMiAtPiAtMEUrMQorCistLSBTcGVjaWFscworcHJlY2lzaW9uOiA5CittYXh4MDkwIG1heCAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CittYXh4MDkxIG1heCAgSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CittYXh4MDkyIG1heCAgSW5mICAtMSAgICAgLT4gIEluZmluaXR5CittYXh4MDkzIG1heCAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CittYXh4MDk0IG1heCAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CittYXh4MDk1IG1heCAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CittYXh4MDk2IG1heCAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CittYXh4MDk3IG1heCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CittYXh4MDk4IG1heCAtMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CittYXh4MDk5IG1heCAtSW5mICAgSW5mICAgLT4gIEluZmluaXR5CittYXh4MTAwIG1heCAtMSAgICAgSW5mICAgLT4gIEluZmluaXR5CittYXh4MTAxIG1heCAtMCAgICAgSW5mICAgLT4gIEluZmluaXR5CittYXh4MTAyIG1heCAgMCAgICAgSW5mICAgLT4gIEluZmluaXR5CittYXh4MTAzIG1heCAgMSAgICAgSW5mICAgLT4gIEluZmluaXR5CittYXh4MTA0IG1heCAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CittYXh4MTA1IG1heCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK21heHgxMjAgbWF4IC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK21heHgxMjEgbWF4IC1JbmYgIC0xMDAwICAtPiAtMTAwMAorbWF4eDEyMiBtYXggLUluZiAgLTEgICAgIC0+IC0xCittYXh4MTIzIG1heCAtSW5mICAtMCAgICAgLT4gLTAKK21heHgxMjQgbWF4IC1JbmYgICAwICAgICAtPiAgMAorbWF4eDEyNSBtYXggLUluZiAgIDEgICAgIC0+ICAxCittYXh4MTI2IG1heCAtSW5mICAgMTAwMCAgLT4gIDEwMDAKK21heHgxMjcgbWF4IC1JbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK21heHgxMjggbWF4IC1JbmYgIC1JbmYgICAtPiAgLUluZmluaXR5CittYXh4MTI5IG1heCAtMTAwMCAtSW5mICAgLT4gIC0xMDAwCittYXh4MTMwIG1heCAtMSAgICAtSW5mICAgLT4gIC0xCittYXh4MTMxIG1heCAtMCAgICAtSW5mICAgLT4gIC0wCittYXh4MTMyIG1heCAgMCAgICAtSW5mICAgLT4gIDAKK21heHgxMzMgbWF4ICAxICAgIC1JbmYgICAtPiAgMQorbWF4eDEzNCBtYXggIDEwMDAgLUluZiAgIC0+ICAxMDAwCittYXh4MTM1IG1heCAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CisKKy0tIDIwMDQuMDguMDIgNzU0ciBjaG9vc2VzIG51bWJlciBvdmVyIE5hTiBpbiBtaXhlZCBjYXNlcworbWF4eDE0MSBtYXggIE5hTiAtSW5mICAgIC0+IC1JbmZpbml0eQorbWF4eDE0MiBtYXggIE5hTiAtMTAwMCAgIC0+IC0xMDAwCittYXh4MTQzIG1heCAgTmFOIC0xICAgICAgLT4gLTEKK21heHgxNDQgbWF4ICBOYU4gLTAgICAgICAtPiAtMAorbWF4eDE0NSBtYXggIE5hTiAgMCAgICAgIC0+ICAwCittYXh4MTQ2IG1heCAgTmFOICAxICAgICAgLT4gIDEKK21heHgxNDcgbWF4ICBOYU4gIDEwMDAgICAtPiAgMTAwMAorbWF4eDE0OCBtYXggIE5hTiAgSW5mICAgIC0+ICBJbmZpbml0eQorbWF4eDE0OSBtYXggIE5hTiAgTmFOICAgIC0+ICBOYU4KK21heHgxNTAgbWF4IC1JbmYgIE5hTiAgICAtPiAtSW5maW5pdHkKK21heHgxNTEgbWF4IC0xMDAwIE5hTiAgICAtPiAtMTAwMAorbWF4eDE1MiBtYXggLTEgICAgTmFOICAgIC0+IC0xCittYXh4MTUzIG1heCAtMCAgICBOYU4gICAgLT4gLTAKK21heHgxNTQgbWF4ICAwICAgIE5hTiAgICAtPiAgMAorbWF4eDE1NSBtYXggIDEgICAgTmFOICAgIC0+ICAxCittYXh4MTU2IG1heCAgMTAwMCBOYU4gICAgLT4gIDEwMDAKK21heHgxNTcgbWF4ICBJbmYgIE5hTiAgICAtPiAgSW5maW5pdHkKKworbWF4eDE2MSBtYXggIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTYyIG1heCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxNjMgbWF4ICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbWF4eDE2NCBtYXggIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTY1IG1heCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxNjYgbWF4ICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbWF4eDE2NyBtYXggIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTY4IG1heCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxNjkgbWF4ICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbWF4eDE3MCBtYXggIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTcxIG1heCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxNzIgbWF4IC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbWF4eDE3MyBtYXggLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTc0IG1heCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxNzUgbWF4ICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbWF4eDE3NiBtYXggIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTc3IG1heCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxNzggbWF4ICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbWF4eDE3OSBtYXggIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK21heHgxODEgbWF4ICBOYU45ICAtSW5mICAgLT4gLUluZmluaXR5CittYXh4MTgyIG1heCAgTmFOOCAgICAgOSAgIC0+ICA5CittYXh4MTgzIG1heCAtTmFONyAgIEluZiAgIC0+ICBJbmZpbml0eQorCittYXh4MTg0IG1heCAtTmFOMSAgIE5hTjExIC0+IC1OYU4xCittYXh4MTg1IG1heCAgTmFOMiAgIE5hTjEyIC0+ICBOYU4yCittYXh4MTg2IG1heCAtTmFOMTMgLU5hTjcgIC0+IC1OYU4xMworbWF4eDE4NyBtYXggIE5hTjE0IC1OYU41ICAtPiAgTmFOMTQKKworbWF4eDE4OCBtYXggLUluZiAgICBOYU40ICAtPiAtSW5maW5pdHkKK21heHgxODkgbWF4IC05ICAgICAtTmFOMyAgLT4gLTkKK21heHgxOTAgbWF4ICBJbmYgICAgTmFOMiAgLT4gIEluZmluaXR5CisKK21heHgxOTEgbWF4ICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK21heHgxOTIgbWF4ICBzTmFOOTggLTEgICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK21heHgxOTMgbWF4IC1zTmFOOTcgIE5hTiAgICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK21heHgxOTQgbWF4ICBzTmFOOTYgc05hTjk0ICAtPiAgTmFOOTYgSW52YWxpZF9vcGVyYXRpb24KK21heHgxOTUgbWF4ICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK21heHgxOTYgbWF4IC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK21heHgxOTcgbWF4ICAwICAgICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK21heHgxOTggbWF4ICBJbmYgICAtc05hTjkwICAtPiAtTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxOTkgbWF4ICBOYU4gICAgc05hTjg5ICAtPiAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcm91bmRpbmcgY2hlY2tzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CittYXh4MjAxIG1heCAxMjM0NTY3ODAwMCAxICAtPiAxLjIzNDU2NzgwRSsxMCBSb3VuZGVkCittYXh4MjAyIG1heCAxIDEyMzQ1Njc4MDAwICAtPiAxLjIzNDU2NzgwRSsxMCBSb3VuZGVkCittYXh4MjAzIG1heCAxMjM0NTY3ODAwICAxICAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK21heHgyMDQgbWF4IDEgMTIzNDU2NzgwMCAgIC0+IDEuMjM0NTY3ODBFKzkgUm91bmRlZAorbWF4eDIwNSBtYXggMTIzNDU2Nzg5MCAgMSAgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCittYXh4MjA2IG1heCAxIDEyMzQ1Njc4OTAgICAtPiAxLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK21heHgyMDcgbWF4IDEyMzQ1Njc4OTEgIDEgIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCittYXh4MjA4IG1heCAxIDEyMzQ1Njc4OTEgICAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorbWF4eDIwOSBtYXggMTIzNDU2Nzg5MDEgMSAgLT4gMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCittYXh4MjEwIG1heCAxIDEyMzQ1Njc4OTAxICAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK21heHgyMTEgbWF4IDEyMzQ1Njc4OTYgIDEgIC0+IDEuMjM0NTY3OTBFKzkgSW5leGFjdCBSb3VuZGVkCittYXh4MjEyIG1heCAxIDEyMzQ1Njc4OTYgICAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorbWF4eDIxMyBtYXggLTEyMzQ1Njc4OTEgIDEgLT4gMQorbWF4eDIxNCBtYXggMSAtMTIzNDU2Nzg5MSAgLT4gMQorbWF4eDIxNSBtYXggLTEyMzQ1Njc4OTAxIDEgLT4gMQorbWF4eDIxNiBtYXggMSAtMTIzNDU2Nzg5MDEgLT4gMQorbWF4eDIxNyBtYXggLTEyMzQ1Njc4OTYgIDEgLT4gMQorbWF4eDIxOCBtYXggMSAtMTIzNDU2Nzg5NiAgLT4gMQorCitwcmVjaXNpb246IDE1CittYXh4MjIxIG1heCAxMjM0NTY3ODAwMCAxICAtPiAxMjM0NTY3ODAwMAorbWF4eDIyMiBtYXggMSAxMjM0NTY3ODAwMCAgLT4gMTIzNDU2NzgwMDAKK21heHgyMjMgbWF4IDEyMzQ1Njc4MDAgIDEgIC0+IDEyMzQ1Njc4MDAKK21heHgyMjQgbWF4IDEgMTIzNDU2NzgwMCAgIC0+IDEyMzQ1Njc4MDAKK21heHgyMjUgbWF4IDEyMzQ1Njc4OTAgIDEgIC0+IDEyMzQ1Njc4OTAKK21heHgyMjYgbWF4IDEgMTIzNDU2Nzg5MCAgIC0+IDEyMzQ1Njc4OTAKK21heHgyMjcgbWF4IDEyMzQ1Njc4OTEgIDEgIC0+IDEyMzQ1Njc4OTEKK21heHgyMjggbWF4IDEgMTIzNDU2Nzg5MSAgIC0+IDEyMzQ1Njc4OTEKK21heHgyMjkgbWF4IDEyMzQ1Njc4OTAxIDEgIC0+IDEyMzQ1Njc4OTAxCittYXh4MjMwIG1heCAxIDEyMzQ1Njc4OTAxICAtPiAxMjM0NTY3ODkwMQorbWF4eDIzMSBtYXggMTIzNDU2Nzg5NiAgMSAgLT4gMTIzNDU2Nzg5NgorbWF4eDIzMiBtYXggMSAxMjM0NTY3ODk2ICAgLT4gMTIzNDU2Nzg5NgorbWF4eDIzMyBtYXggLTEyMzQ1Njc4OTEgIDEgLT4gMQorbWF4eDIzNCBtYXggMSAtMTIzNDU2Nzg5MSAgLT4gMQorbWF4eDIzNSBtYXggLTEyMzQ1Njc4OTAxIDEgLT4gMQorbWF4eDIzNiBtYXggMSAtMTIzNDU2Nzg5MDEgLT4gMQorbWF4eDIzNyBtYXggLTEyMzQ1Njc4OTYgIDEgLT4gMQorbWF4eDIzOCBtYXggMSAtMTIzNDU2Nzg5NiAgLT4gMQorCistLSBmcm9tIGV4YW1wbGVzCittYXh4MjgwIG1heCAnMycgICAnMicgIC0+ICAnMycKK21heHgyODEgbWF4ICctMTAnICczJyAgLT4gICczJworbWF4eDI4MiBtYXggJzEuMCcgJzEnICAtPiAgJzEnCittYXh4MjgzIG1heCAnMScgJzEuMCcgIC0+ICAnMScKK21heHgyODQgbWF4ICc3JyAnTmFOJyAgLT4gICc3JworCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uLgorbWF4RXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK21heHgzMzAgbWF4ICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiAgOUUrOTk5OTk5OTk5CittYXh4MzMxIG1heCA5RSs5OTk5OTk5OTkgKzEuMjM0NTY3ODkwMTIzNDVFLTAgLT4gIDlFKzk5OTk5OTk5OQorbWF4eDMzMiBtYXggKzAuMTAwIDlFLTk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+ICAwLjEwMAorbWF4eDMzMyBtYXggOUUtOTk5OTk5OTk5ICswLjEwMCAgICAgICAgICAgICAgIC0+ICAwLjEwMAorbWF4eDMzNSBtYXggLTEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5IC0+ICA5RSs5OTk5OTk5OTkKK21heHgzMzYgbWF4IDlFKzk5OTk5OTk5OSAtMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAgOUUrOTk5OTk5OTk5CittYXh4MzM3IG1heCAtMC4xMDAgOUUtOTk5OTk5OTk5ICAgICAgICAgICAgICAgLT4gIDlFLTk5OTk5OTk5OQorbWF4eDMzOCBtYXggOUUtOTk5OTk5OTk5IC0wLjEwMCAgICAgICAgICAgICAgIC0+ICA5RS05OTk5OTk5OTkKKworbWF4eDMzOSBtYXggMWUtNTk5OTk5OTk5IDFlLTQwMDAwMDAwMSAgIC0+ICAxRS00MDAwMDAwMDEKK21heHgzNDAgbWF4IDFlLTU5OTk5OTk5OSAxZS00MDAwMDAwMDAgICAtPiAgMUUtNDAwMDAwMDAwCittYXh4MzQxIG1heCAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDAwICAgLT4gIDFFLTQwMDAwMDAwMAorbWF4eDM0MiBtYXggOWUtOTk5OTk5OTk4IDAuMDEgICAgICAgICAgIC0+ICAwLjAxCittYXh4MzQzIG1heCA5ZS05OTk5OTk5OTggMC4xICAgICAgICAgICAgLT4gIDAuMQorbWF4eDM0NCBtYXggMC4wMSA5ZS05OTk5OTk5OTggICAgICAgICAgIC0+ICAwLjAxCittYXh4MzQ1IG1heCAxZTU5OTk5OTk5OSAxZTQwMDAwMDAwMSAgICAgLT4gIDFFKzU5OTk5OTk5OQorbWF4eDM0NiBtYXggMWU1OTk5OTk5OTkgMWU0MDAwMDAwMDAgICAgIC0+ICAxRSs1OTk5OTk5OTkKK21heHgzNDcgbWF4IDFlNjAwMDAwMDAwIDFlNDAwMDAwMDAwICAgICAtPiAgMUUrNjAwMDAwMDAwCittYXh4MzQ4IG1heCA5ZTk5OTk5OTk5OCAxMDAgICAgICAgICAgICAgLT4gIDlFKzk5OTk5OTk5OAorbWF4eDM0OSBtYXggOWU5OTk5OTk5OTggMTAgICAgICAgICAgICAgIC0+ICA5RSs5OTk5OTk5OTgKK21heHgzNTAgbWF4IDEwMCAgOWU5OTk5OTk5OTggICAgICAgICAgICAtPiAgOUUrOTk5OTk5OTk4CistLSBzaWducworbWF4eDM1MSBtYXggIDFlKzc3Nzc3Nzc3NyAgMWUrNDExMTExMTExIC0+ICAxRSs3Nzc3Nzc3NzcKK21heHgzNTIgbWF4ICAxZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAtPiAgMUUrNzc3Nzc3Nzc3CittYXh4MzUzIG1heCAtMWUrNzc3Nzc3Nzc3ICAxZSs0MTExMTExMTEgLT4gIDFFKzQxMTExMTExMQorbWF4eDM1NCBtYXggLTFlKzc3Nzc3Nzc3NyAtMWUrNDExMTExMTExIC0+IC0xRSs0MTExMTExMTEKK21heHgzNTUgbWF4ICAxZS03Nzc3Nzc3NzcgIDFlLTQxMTExMTExMSAtPiAgMUUtNDExMTExMTExCittYXh4MzU2IG1heCAgMWUtNzc3Nzc3Nzc3IC0xZS00MTExMTExMTEgLT4gIDFFLTc3Nzc3Nzc3NworbWF4eDM1NyBtYXggLTFlLTc3Nzc3Nzc3NyAgMWUtNDExMTExMTExIC0+ICAxRS00MTExMTExMTEKK21heHgzNTggbWF4IC0xZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAtPiAtMUUtNzc3Nzc3Nzc3CisKKy0tIGV4cGFuZGVkIGxpc3QgZnJvbSBtaW4vbWF4IDc1NHIgcHVycGxlIHByb3NlCistLSBbZXhwbGljaXQgdGVzdHMgZm9yIGV4cG9uZW50IG9yZGVyaW5nXQorbWF4eDQwMSBtYXggIEluZiAgICAxLjEgICAgIC0+ICBJbmZpbml0eQorbWF4eDQwMiBtYXggIDEuMSAgICAxICAgICAgIC0+ICAxLjEKK21heHg0MDMgbWF4ICAxICAgICAgMS4wICAgICAtPiAgMQorbWF4eDQwNCBtYXggIDEuMCAgICAwLjEgICAgIC0+ICAxLjAKK21heHg0MDUgbWF4ICAwLjEgICAgMC4xMCAgICAtPiAgMC4xCittYXh4NDA2IG1heCAgMC4xMCAgIDAuMTAwICAgLT4gIDAuMTAKK21heHg0MDcgbWF4ICAwLjEwICAgMCAgICAgICAtPiAgMC4xMAorbWF4eDQwOCBtYXggIDAgICAgICAwLjAgICAgIC0+ICAwCittYXh4NDA5IG1heCAgMC4wICAgLTAgICAgICAgLT4gIDAuMAorbWF4eDQxMCBtYXggIDAuMCAgIC0wLjAgICAgIC0+ICAwLjAKK21heHg0MTEgbWF4ICAwLjAwICAtMC4wICAgICAtPiAgMC4wMAorbWF4eDQxMiBtYXggIDAuMCAgIC0wLjAwICAgIC0+ICAwLjAKK21heHg0MTMgbWF4ICAwICAgICAtMC4wICAgICAtPiAgMAorbWF4eDQxNCBtYXggIDAgICAgIC0wICAgICAgIC0+ICAwCittYXh4NDE1IG1heCAtMC4wICAgLTAgICAgICAgLT4gLTAuMAorbWF4eDQxNiBtYXggLTAgICAgIC0wLjEwMCAgIC0+IC0wCittYXh4NDE3IG1heCAtMC4xMDAgLTAuMTAgICAgLT4gLTAuMTAwCittYXh4NDE4IG1heCAtMC4xMCAgLTAuMSAgICAgLT4gLTAuMTAKK21heHg0MTkgbWF4IC0wLjEgICAtMS4wICAgICAtPiAtMC4xCittYXh4NDIwIG1heCAtMS4wICAgLTEgICAgICAgLT4gLTEuMAorbWF4eDQyMSBtYXggLTEgICAgIC0xLjEgICAgIC0+IC0xCittYXh4NDIzIG1heCAtMS4xICAgLUluZiAgICAgLT4gLTEuMQorLS0gc2FtZSB3aXRoIG9wZXJhbmRzIHJldmVyc2VkCittYXh4NDMxIG1heCAgMS4xICAgIEluZiAgICAgLT4gIEluZmluaXR5CittYXh4NDMyIG1heCAgMSAgICAgIDEuMSAgICAgLT4gIDEuMQorbWF4eDQzMyBtYXggIDEuMCAgICAxICAgICAgIC0+ICAxCittYXh4NDM0IG1heCAgMC4xICAgIDEuMCAgICAgLT4gIDEuMAorbWF4eDQzNSBtYXggIDAuMTAgICAwLjEgICAgIC0+ICAwLjEKK21heHg0MzYgbWF4ICAwLjEwMCAgMC4xMCAgICAtPiAgMC4xMAorbWF4eDQzNyBtYXggIDAgICAgICAwLjEwICAgIC0+ICAwLjEwCittYXh4NDM4IG1heCAgMC4wICAgIDAgICAgICAgLT4gIDAKK21heHg0MzkgbWF4IC0wICAgICAgMC4wICAgICAtPiAgMC4wCittYXh4NDQwIG1heCAtMC4wICAgIDAuMCAgICAgLT4gIDAuMAorbWF4eDQ0MSBtYXggLTAuMCAgICAwLjAwICAgIC0+ICAwLjAwCittYXh4NDQyIG1heCAtMC4wMCAgIDAuMCAgICAgLT4gIDAuMAorbWF4eDQ0MyBtYXggLTAuMCAgICAwICAgICAgIC0+ICAwCittYXh4NDQ0IG1heCAtMCAgICAgIDAgICAgICAgLT4gIDAKK21heHg0NDUgbWF4IC0wICAgICAtMC4wICAgICAtPiAtMC4wCittYXh4NDQ2IG1heCAtMC4xMDAgLTAgICAgICAgLT4gLTAKK21heHg0NDcgbWF4IC0wLjEwICAtMC4xMDAgICAtPiAtMC4xMDAKK21heHg0NDggbWF4IC0wLjEgICAtMC4xMCAgICAtPiAtMC4xMAorbWF4eDQ0OSBtYXggLTEuMCAgIC0wLjEgICAgIC0+IC0wLjEKK21heHg0NTAgbWF4IC0xICAgICAtMS4wICAgICAtPiAtMS4wCittYXh4NDUxIG1heCAtMS4xICAgLTEgICAgICAgLT4gLTEKK21heHg0NTMgbWF4IC1JbmYgICAtMS4xICAgICAtPiAtMS4xCistLSBsYXJnaWVzCittYXh4NDYwIG1heCAgMTAwMCAgIDFFKzMgICAgLT4gIDFFKzMKK21heHg0NjEgbWF4ICAxRSszICAgMTAwMCAgICAtPiAgMUUrMworbWF4eDQ2MiBtYXggIDEwMDAgIC0xRSszICAgIC0+ICAxMDAwCittYXh4NDYzIG1heCAgMUUrMyAgLTEwMDAgICAgLT4gIDFFKzMKK21heHg0NjQgbWF4IC0xMDAwICAgMUUrMyAgICAtPiAgMUUrMworbWF4eDQ2NSBtYXggLTFFKzMgICAxMDAwICAgIC0+ICAxMDAwCittYXh4NDY2IG1heCAtMTAwMCAgLTFFKzMgICAgLT4gLTEwMDAKK21heHg0NjcgbWF4IC0xRSszICAtMTAwMCAgICAtPiAtMTAwMAorCistLSByb3VuZGluZyAocmVzdWx0cyB0cmVhdGVkIGFzIHRob3VnaCBwbHVzKQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogMworCittYXh4NDcwIG1heCAgMSAgICAgIC41ICAgICAtPiAgMQorbWF4eDQ3MSBtYXggIDEwICAgICA1ICAgICAgLT4gIDEwCittYXh4NDcyIG1heCAgMTAwICAgIDUwICAgICAtPiAgMTAwCittYXh4NDczIG1heCAgMTAwMCAgIDUwMCAgICAtPiAgMS4wMEUrMyBSb3VuZGVkCittYXh4NDc0IG1heCAgMTAwMDAgIDUwMDAgICAtPiAgMS4wMEUrNCBSb3VuZGVkCittYXh4NDc1IG1heCAgNiAgICAgIC41ICAgICAtPiAgNgorbWF4eDQ3NiBtYXggIDY2ICAgICA1ICAgICAgLT4gIDY2CittYXh4NDc3IG1heCAgNjY2ICAgIDUwICAgICAtPiAgNjY2CittYXh4NDc4IG1heCAgNjY2NiAgIDUwMCAgICAtPiAgNi42N0UrMyBSb3VuZGVkIEluZXhhY3QKK21heHg0NzkgbWF4ICA2NjY2NiAgNTAwMCAgIC0+ICA2LjY3RSs0IFJvdW5kZWQgSW5leGFjdAorbWF4eDQ4MCBtYXggIDMzMzMzICA1MDAwICAgLT4gIDMuMzNFKzQgUm91bmRlZCBJbmV4YWN0CittYXh4NDgxIG1heCAgLjUgICAgIDEgICAgICAtPiAgMQorbWF4eDQ4MiBtYXggIC41ICAgICAxMCAgICAgLT4gIDEwCittYXh4NDgzIG1heCAgLjUgICAgIDEwMCAgICAtPiAgMTAwCittYXh4NDg0IG1heCAgLjUgICAgIDEwMDAgICAtPiAgMS4wMEUrMyBSb3VuZGVkCittYXh4NDg1IG1heCAgLjUgICAgIDEwMDAwICAtPiAgMS4wMEUrNCBSb3VuZGVkCittYXh4NDg2IG1heCAgLjUgICAgIDYgICAgICAtPiAgNgorbWF4eDQ4NyBtYXggIC41ICAgICA2NiAgICAgLT4gIDY2CittYXh4NDg4IG1heCAgLjUgICAgIDY2NiAgICAtPiAgNjY2CittYXh4NDg5IG1heCAgLjUgICAgIDY2NjYgICAtPiAgNi42N0UrMyBSb3VuZGVkIEluZXhhY3QKK21heHg0OTAgbWF4ICAuNSAgICAgNjY2NjYgIC0+ICA2LjY3RSs0IFJvdW5kZWQgSW5leGFjdAorbWF4eDQ5MSBtYXggIC41ICAgICAzMzMzMyAgLT4gIDMuMzNFKzQgUm91bmRlZCBJbmV4YWN0CisKKy0tIG92ZXJmbG93IHRlc3RzCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcHJlY2lzaW9uOiAzCittYXh4NTAwIG1heCA5Ljk5OUUrOTk5OTk5OTk5ICAwIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK21heHg1MDEgbWF4IC05Ljk5OUUrOTk5OTk5OTk5IDAgLT4gIDAKKworLS0gc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93CitwcmVjaXNpb246IDMKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CittYXh4NTEwIG1heCAgMS4wMEUtOTk5ICAgICAgIDAgIC0+ICAgMS4wMEUtOTk5CittYXh4NTExIG1heCAgMC4xRS05OTkgICAgICAgIDAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbAorbWF4eDUxMiBtYXggIDAuMTBFLTk5OSAgICAgICAwICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwKK21heHg1MTMgbWF4ICAwLjEwMEUtOTk5ICAgICAgMCAgLT4gICAxLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK21heHg1MTQgbWF4ICAwLjAxRS05OTkgICAgICAgMCAgLT4gICAxRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gTm1pbgorbWF4eDUxNSBtYXggIDAuOTk5RS05OTkgICAgICAwICAtPiAgIDEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbWF4eDUxNiBtYXggIDAuMDk5RS05OTkgICAgICAwICAtPiAgIDEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbWF4eDUxNyBtYXggIDAuMDA5RS05OTkgICAgICAwICAtPiAgIDFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbWF4eDUxOCBtYXggIDAuMDAxRS05OTkgICAgICAwICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCittYXh4NTE5IG1heCAgMC4wMDA5RS05OTkgICAgIDAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK21heHg1MjAgbWF4ICAwLjAwMDFFLTk5OSAgICAgMCAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCittYXh4NTMwIG1heCAtMS4wMEUtOTk5ICAgICAgIDAgIC0+ICAgMAorbWF4eDUzMSBtYXggLTAuMUUtOTk5ICAgICAgICAwICAtPiAgIDAKK21heHg1MzIgbWF4IC0wLjEwRS05OTkgICAgICAgMCAgLT4gICAwCittYXh4NTMzIG1heCAtMC4xMDBFLTk5OSAgICAgIDAgIC0+ICAgMAorbWF4eDUzNCBtYXggLTAuMDFFLTk5OSAgICAgICAwICAtPiAgIDAKK21heHg1MzUgbWF4IC0wLjk5OUUtOTk5ICAgICAgMCAgLT4gICAwCittYXh4NTM2IG1heCAtMC4wOTlFLTk5OSAgICAgIDAgIC0+ICAgMAorbWF4eDUzNyBtYXggLTAuMDA5RS05OTkgICAgICAwICAtPiAgIDAKK21heHg1MzggbWF4IC0wLjAwMUUtOTk5ICAgICAgMCAgLT4gICAwCittYXh4NTM5IG1heCAtMC4wMDA5RS05OTkgICAgIDAgIC0+ICAgMAorbWF4eDU0MCBtYXggLTAuMDAwMUUtOTk5ICAgICAwICAtPiAgIDAKKworLS0gbWlzYWxpZ25tZW50IHRyYXBzIGZvciBsaXR0bGUtZW5kaWFuCitwcmVjaXNpb246IDkKK21heHg1NTEgbWF4ICAgICAgMS4wICAgICAgIDAuMSAgLT4gMS4wCittYXh4NTUyIG1heCAgICAgIDAuMSAgICAgICAxLjAgIC0+IDEuMAorbWF4eDU1MyBtYXggICAgIDEwLjAgICAgICAgMC4xICAtPiAxMC4wCittYXh4NTU0IG1heCAgICAgIDAuMSAgICAgIDEwLjAgIC0+IDEwLjAKK21heHg1NTUgbWF4ICAgICAgMTAwICAgICAgIDEuMCAgLT4gMTAwCittYXh4NTU2IG1heCAgICAgIDEuMCAgICAgICAxMDAgIC0+IDEwMAorbWF4eDU1NyBtYXggICAgIDEwMDAgICAgICAxMC4wICAtPiAxMDAwCittYXh4NTU4IG1heCAgICAgMTAuMCAgICAgIDEwMDAgIC0+IDEwMDAKK21heHg1NTkgbWF4ICAgIDEwMDAwICAgICAxMDAuMCAgLT4gMTAwMDAKK21heHg1NjAgbWF4ICAgIDEwMC4wICAgICAxMDAwMCAgLT4gMTAwMDAKK21heHg2NjEgbWF4ICAgMTAwMDAwICAgIDEwMDAuMCAgLT4gMTAwMDAwCittYXh4NjYyIG1heCAgIDEwMDAuMCAgICAxMDAwMDAgIC0+IDEwMDAwMAorbWF4eDY2MyBtYXggIDEwMDAwMDAgICAxMDAwMC4wICAtPiAxMDAwMDAwCittYXh4NjY0IG1heCAgMTAwMDAuMCAgIDEwMDAwMDAgIC0+IDEwMDAwMDAKKworLS0gcGF5bG9hZCBkZWNhcGl0YXRlCitwcmVjaXNpb246IDUKK21heHg2NzAgbWF4ICAgICAgMTEgLXNOYU4xMjM0NTY3ODkwMSAtPiAtTmFONzg5MDEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdHMKK21heHg5MDAgbWF4IDEwICAjICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK21heHg5MDEgbWF4ICAjIDEwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbWF4bWFnLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL21heG1hZy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NWU5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL21heG1hZy5kZWNUZXN0CkBAIC0wLDAgKzEsNDA0IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIG1heG1hZy5kZWNUZXN0IC0tIGRlY2ltYWwgbWF4aW11bSBieSBtYWduaXR1ZGUgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gd2UgYXNzdW1lIHRoYXQgYmFzZSBjb21wYXJpc29uIGlzIHRlc3RlZCBpbiBjb21wYXJlLmRlY1Rlc3QsIHNvCistLSB0aGVzZSBtYWlubHkgY292ZXIgc3BlY2lhbCBjYXNlcyBhbmQgcm91bmRpbmcKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworLS0gc2FuaXR5IGNoZWNrcworbXhneDAwMSBtYXhtYWcgIC0yICAtMiAgLT4gLTIKK214Z3gwMDIgbWF4bWFnICAtMiAgLTEgIC0+IC0yCitteGd4MDAzIG1heG1hZyAgLTIgICAwICAtPiAtMgorbXhneDAwNCBtYXhtYWcgIC0yICAgMSAgLT4gLTIKK214Z3gwMDUgbWF4bWFnICAtMiAgIDIgIC0+ICAyCitteGd4MDA2IG1heG1hZyAgLTEgIC0yICAtPiAtMgorbXhneDAwNyBtYXhtYWcgIC0xICAtMSAgLT4gLTEKK214Z3gwMDggbWF4bWFnICAtMSAgIDAgIC0+IC0xCitteGd4MDA5IG1heG1hZyAgLTEgICAxICAtPiAgMQorbXhneDAxMCBtYXhtYWcgIC0xICAgMiAgLT4gIDIKK214Z3gwMTEgbWF4bWFnICAgMCAgLTIgIC0+IC0yCitteGd4MDEyIG1heG1hZyAgIDAgIC0xICAtPiAtMQorbXhneDAxMyBtYXhtYWcgICAwICAgMCAgLT4gIDAKK214Z3gwMTQgbWF4bWFnICAgMCAgIDEgIC0+ICAxCitteGd4MDE1IG1heG1hZyAgIDAgICAyICAtPiAgMgorbXhneDAxNiBtYXhtYWcgICAxICAtMiAgLT4gLTIKK214Z3gwMTcgbWF4bWFnICAgMSAgLTEgIC0+ICAxCitteGd4MDE4IG1heG1hZyAgIDEgICAwICAtPiAgMQorbXhneDAxOSBtYXhtYWcgICAxICAgMSAgLT4gIDEKK214Z3gwMjAgbWF4bWFnICAgMSAgIDIgIC0+ICAyCitteGd4MDIxIG1heG1hZyAgIDIgIC0yICAtPiAgMgorbXhneDAyMiBtYXhtYWcgICAyICAtMSAgLT4gIDIKK214Z3gwMjMgbWF4bWFnICAgMiAgIDAgIC0+ICAyCitteGd4MDI1IG1heG1hZyAgIDIgICAxICAtPiAgMgorbXhneDAyNiBtYXhtYWcgICAyICAgMiAgLT4gIDIKKworLS0gZXh0ZW5kZWQgemVyb3MKK214Z3gwMzAgbWF4bWFnICAgMCAgICAgMCAgIC0+ICAwCitteGd4MDMxIG1heG1hZyAgIDAgICAgLTAgICAtPiAgMAorbXhneDAzMiBtYXhtYWcgICAwICAgIC0wLjAgLT4gIDAKK214Z3gwMzMgbWF4bWFnICAgMCAgICAgMC4wIC0+ICAwCitteGd4MDM0IG1heG1hZyAgLTAgICAgIDAgICAtPiAgMCAgICAtLSBub3RlOiAtMCA9IDAsIGJ1dCAwIGNob3NlbgorbXhneDAzNSBtYXhtYWcgIC0wICAgIC0wICAgLT4gLTAKK214Z3gwMzYgbWF4bWFnICAtMCAgICAtMC4wIC0+IC0wLjAKK214Z3gwMzcgbWF4bWFnICAtMCAgICAgMC4wIC0+ICAwLjAKK214Z3gwMzggbWF4bWFnICAgMC4wICAgMCAgIC0+ICAwCitteGd4MDM5IG1heG1hZyAgIDAuMCAgLTAgICAtPiAgMC4wCitteGd4MDQwIG1heG1hZyAgIDAuMCAgLTAuMCAtPiAgMC4wCitteGd4MDQxIG1heG1hZyAgIDAuMCAgIDAuMCAtPiAgMC4wCitteGd4MDQyIG1heG1hZyAgLTAuMCAgIDAgICAtPiAgMAorbXhneDA0MyBtYXhtYWcgIC0wLjAgIC0wICAgLT4gLTAuMAorbXhneDA0NCBtYXhtYWcgIC0wLjAgIC0wLjAgLT4gLTAuMAorbXhneDA0NSBtYXhtYWcgIC0wLjAgICAwLjAgLT4gIDAuMAorCitteGd4MDUwIG1heG1hZyAgLTBFMSAgIDBFMSAtPiAgMEUrMQorbXhneDA1MSBtYXhtYWcgIC0wRTIgICAwRTIgLT4gIDBFKzIKK214Z3gwNTIgbWF4bWFnICAtMEUyICAgMEUxIC0+ICAwRSsxCitteGd4MDUzIG1heG1hZyAgLTBFMSAgIDBFMiAtPiAgMEUrMgorbXhneDA1NCBtYXhtYWcgICAwRTEgIC0wRTEgLT4gIDBFKzEKK214Z3gwNTUgbWF4bWFnICAgMEUyICAtMEUyIC0+ICAwRSsyCitteGd4MDU2IG1heG1hZyAgIDBFMiAgLTBFMSAtPiAgMEUrMgorbXhneDA1NyBtYXhtYWcgICAwRTEgIC0wRTIgLT4gIDBFKzEKKworbXhneDA1OCBtYXhtYWcgICAwRTEgICAwRTEgLT4gIDBFKzEKK214Z3gwNTkgbWF4bWFnICAgMEUyICAgMEUyIC0+ICAwRSsyCitteGd4MDYwIG1heG1hZyAgIDBFMiAgIDBFMSAtPiAgMEUrMgorbXhneDA2MSBtYXhtYWcgICAwRTEgICAwRTIgLT4gIDBFKzIKK214Z3gwNjIgbWF4bWFnICAtMEUxICAtMEUxIC0+IC0wRSsxCitteGd4MDYzIG1heG1hZyAgLTBFMiAgLTBFMiAtPiAtMEUrMgorbXhneDA2NCBtYXhtYWcgIC0wRTIgIC0wRTEgLT4gLTBFKzEKK214Z3gwNjUgbWF4bWFnICAtMEUxICAtMEUyIC0+IC0wRSsxCisKKy0tIFNwZWNpYWxzCitwcmVjaXNpb246IDkKK214Z3gwOTAgbWF4bWFnICBJbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKK214Z3gwOTEgbWF4bWFnICBJbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK214Z3gwOTIgbWF4bWFnICBJbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK214Z3gwOTMgbWF4bWFnICBJbmYgIC0wICAgICAtPiAgSW5maW5pdHkKK214Z3gwOTQgbWF4bWFnICBJbmYgICAwICAgICAtPiAgSW5maW5pdHkKK214Z3gwOTUgbWF4bWFnICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK214Z3gwOTYgbWF4bWFnICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK214Z3gwOTcgbWF4bWFnICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK214Z3gwOTggbWF4bWFnIC0xMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK214Z3gwOTkgbWF4bWFnIC1JbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK214Z3gxMDAgbWF4bWFnIC0xICAgICBJbmYgICAtPiAgSW5maW5pdHkKK214Z3gxMDEgbWF4bWFnIC0wICAgICBJbmYgICAtPiAgSW5maW5pdHkKK214Z3gxMDIgbWF4bWFnICAwICAgICBJbmYgICAtPiAgSW5maW5pdHkKK214Z3gxMDMgbWF4bWFnICAxICAgICBJbmYgICAtPiAgSW5maW5pdHkKK214Z3gxMDQgbWF4bWFnICAxMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK214Z3gxMDUgbWF4bWFnICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworbXhneDEyMCBtYXhtYWcgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorbXhneDEyMSBtYXhtYWcgLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorbXhneDEyMiBtYXhtYWcgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorbXhneDEyMyBtYXhtYWcgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorbXhneDEyNCBtYXhtYWcgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorbXhneDEyNSBtYXhtYWcgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorbXhneDEyNiBtYXhtYWcgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorbXhneDEyNyBtYXhtYWcgLUluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorbXhneDEyOCBtYXhtYWcgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorbXhneDEyOSBtYXhtYWcgLTEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorbXhneDEzMCBtYXhtYWcgLTEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorbXhneDEzMSBtYXhtYWcgLTAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorbXhneDEzMiBtYXhtYWcgIDAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorbXhneDEzMyBtYXhtYWcgIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorbXhneDEzNCBtYXhtYWcgIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorbXhneDEzNSBtYXhtYWcgIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorCistLSAyMDA0LjA4LjAyIDc1NHIgY2hvb3NlcyBudW1iZXIgb3ZlciBOYU4gaW4gbWl4ZWQgY2FzZXMKK214Z3gxNDEgbWF4bWFnICBOYU4gLUluZiAgICAtPiAtSW5maW5pdHkKK214Z3gxNDIgbWF4bWFnICBOYU4gLTEwMDAgICAtPiAtMTAwMAorbXhneDE0MyBtYXhtYWcgIE5hTiAtMSAgICAgIC0+IC0xCitteGd4MTQ0IG1heG1hZyAgTmFOIC0wICAgICAgLT4gLTAKK214Z3gxNDUgbWF4bWFnICBOYU4gIDAgICAgICAtPiAgMAorbXhneDE0NiBtYXhtYWcgIE5hTiAgMSAgICAgIC0+ICAxCitteGd4MTQ3IG1heG1hZyAgTmFOICAxMDAwICAgLT4gIDEwMDAKK214Z3gxNDggbWF4bWFnICBOYU4gIEluZiAgICAtPiAgSW5maW5pdHkKK214Z3gxNDkgbWF4bWFnICBOYU4gIE5hTiAgICAtPiAgTmFOCitteGd4MTUwIG1heG1hZyAtSW5mICBOYU4gICAgLT4gLUluZmluaXR5CitteGd4MTUxIG1heG1hZyAtMTAwMCBOYU4gICAgLT4gLTEwMDAKK214Z3gxNTIgbWF4bWFnIC0xICAgIE5hTiAgICAtPiAtMQorbXhneDE1MyBtYXhtYWcgLTAgICAgTmFOICAgIC0+IC0wCitteGd4MTU0IG1heG1hZyAgMCAgICBOYU4gICAgLT4gIDAKK214Z3gxNTUgbWF4bWFnICAxICAgIE5hTiAgICAtPiAgMQorbXhneDE1NiBtYXhtYWcgIDEwMDAgTmFOICAgIC0+ICAxMDAwCitteGd4MTU3IG1heG1hZyAgSW5mICBOYU4gICAgLT4gIEluZmluaXR5CisKK214Z3gxNjEgbWF4bWFnICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE2MiBtYXhtYWcgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTYzIG1heG1hZyAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK214Z3gxNjQgbWF4bWFnICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE2NSBtYXhtYWcgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTY2IG1heG1hZyAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK214Z3gxNjcgbWF4bWFnICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE2OCBtYXhtYWcgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTY5IG1heG1hZyAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK214Z3gxNzAgbWF4bWFnICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE3MSBtYXhtYWcgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTcyIG1heG1hZyAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK214Z3gxNzMgbWF4bWFnIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE3NCBtYXhtYWcgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTc1IG1heG1hZyAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK214Z3gxNzYgbWF4bWFnICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE3NyBtYXhtYWcgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTc4IG1heG1hZyAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK214Z3gxNzkgbWF4bWFnICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitteGd4MTgxIG1heG1hZyAgTmFOOSAgLUluZiAgIC0+IC1JbmZpbml0eQorbXhneDE4MiBtYXhtYWcgIE5hTjggICAgIDkgICAtPiAgOQorbXhneDE4MyBtYXhtYWcgLU5hTjcgICBJbmYgICAtPiAgSW5maW5pdHkKKworbXhneDE4NCBtYXhtYWcgLU5hTjEgICBOYU4xMSAtPiAtTmFOMQorbXhneDE4NSBtYXhtYWcgIE5hTjIgICBOYU4xMiAtPiAgTmFOMgorbXhneDE4NiBtYXhtYWcgLU5hTjEzIC1OYU43ICAtPiAtTmFOMTMKK214Z3gxODcgbWF4bWFnICBOYU4xNCAtTmFONSAgLT4gIE5hTjE0CisKK214Z3gxODggbWF4bWFnIC1JbmYgICAgTmFONCAgLT4gLUluZmluaXR5CitteGd4MTg5IG1heG1hZyAtOSAgICAgLU5hTjMgIC0+IC05CitteGd4MTkwIG1heG1hZyAgSW5mICAgIE5hTjIgIC0+ICBJbmZpbml0eQorCitteGd4MTkxIG1heG1hZyAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitteGd4MTkyIG1heG1hZyAgc05hTjk4IC0xICAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitteGd4MTkzIG1heG1hZyAtc05hTjk3ICBOYU4gICAgLT4gLU5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitteGd4MTk0IG1heG1hZyAgc05hTjk2IHNOYU45NCAgLT4gIE5hTjk2IEludmFsaWRfb3BlcmF0aW9uCitteGd4MTk1IG1heG1hZyAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTk2IG1heG1hZyAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTk3IG1heG1hZyAgMCAgICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTk4IG1heG1hZyAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTk5IG1heG1hZyAgTmFOICAgIHNOYU44OSAgLT4gIE5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHJvdW5kaW5nIGNoZWNrcworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogOQorbXhneDIwMSBtYXhtYWcgMTIzNDU2NzgwMDAgMSAgLT4gMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorbXhneDIwMiBtYXhtYWcgMSAxMjM0NTY3ODAwMCAgLT4gMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorbXhneDIwMyBtYXhtYWcgMTIzNDU2NzgwMCAgMSAgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCitteGd4MjA0IG1heG1hZyAxIDEyMzQ1Njc4MDAgICAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK214Z3gyMDUgbWF4bWFnIDEyMzQ1Njc4OTAgIDEgIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorbXhneDIwNiBtYXhtYWcgMSAxMjM0NTY3ODkwICAgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCitteGd4MjA3IG1heG1hZyAxMjM0NTY3ODkxICAxICAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorbXhneDIwOCBtYXhtYWcgMSAxMjM0NTY3ODkxICAgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK214Z3gyMDkgbWF4bWFnIDEyMzQ1Njc4OTAxIDEgIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorbXhneDIxMCBtYXhtYWcgMSAxMjM0NTY3ODkwMSAgLT4gMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCitteGd4MjExIG1heG1hZyAxMjM0NTY3ODk2ICAxICAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorbXhneDIxMiBtYXhtYWcgMSAxMjM0NTY3ODk2ICAgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKK214Z3gyMTMgbWF4bWFnIC0xMjM0NTY3ODkxICAxIC0+IC0xLjIzNDU2Nzg5RSs5ICAgSW5leGFjdCBSb3VuZGVkCitteGd4MjE0IG1heG1hZyAxIC0xMjM0NTY3ODkxICAtPiAtMS4yMzQ1Njc4OUUrOSAgIEluZXhhY3QgUm91bmRlZAorbXhneDIxNSBtYXhtYWcgLTEyMzQ1Njc4OTAxIDEgLT4gLTEuMjM0NTY3ODlFKzEwICBJbmV4YWN0IFJvdW5kZWQKK214Z3gyMTYgbWF4bWFnIDEgLTEyMzQ1Njc4OTAxIC0+IC0xLjIzNDU2Nzg5RSsxMCAgSW5leGFjdCBSb3VuZGVkCitteGd4MjE3IG1heG1hZyAtMTIzNDU2Nzg5NiAgMSAtPiAtMS4yMzQ1Njc5MEUrOSAgIEluZXhhY3QgUm91bmRlZAorbXhneDIxOCBtYXhtYWcgMSAtMTIzNDU2Nzg5NiAgLT4gLTEuMjM0NTY3OTBFKzkgICBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAxNQorbXhneDIyMSBtYXhtYWcgMTIzNDU2NzgwMDAgMSAgLT4gMTIzNDU2NzgwMDAKK214Z3gyMjIgbWF4bWFnIDEgMTIzNDU2NzgwMDAgIC0+IDEyMzQ1Njc4MDAwCitteGd4MjIzIG1heG1hZyAxMjM0NTY3ODAwICAxICAtPiAxMjM0NTY3ODAwCitteGd4MjI0IG1heG1hZyAxIDEyMzQ1Njc4MDAgICAtPiAxMjM0NTY3ODAwCitteGd4MjI1IG1heG1hZyAxMjM0NTY3ODkwICAxICAtPiAxMjM0NTY3ODkwCitteGd4MjI2IG1heG1hZyAxIDEyMzQ1Njc4OTAgICAtPiAxMjM0NTY3ODkwCitteGd4MjI3IG1heG1hZyAxMjM0NTY3ODkxICAxICAtPiAxMjM0NTY3ODkxCitteGd4MjI4IG1heG1hZyAxIDEyMzQ1Njc4OTEgICAtPiAxMjM0NTY3ODkxCitteGd4MjI5IG1heG1hZyAxMjM0NTY3ODkwMSAxICAtPiAxMjM0NTY3ODkwMQorbXhneDIzMCBtYXhtYWcgMSAxMjM0NTY3ODkwMSAgLT4gMTIzNDU2Nzg5MDEKK214Z3gyMzEgbWF4bWFnIDEyMzQ1Njc4OTYgIDEgIC0+IDEyMzQ1Njc4OTYKK214Z3gyMzIgbWF4bWFnIDEgMTIzNDU2Nzg5NiAgIC0+IDEyMzQ1Njc4OTYKK214Z3gyMzMgbWF4bWFnIC0xMjM0NTY3ODkxICAxIC0+IC0xMjM0NTY3ODkxCitteGd4MjM0IG1heG1hZyAxIC0xMjM0NTY3ODkxICAtPiAtMTIzNDU2Nzg5MQorbXhneDIzNSBtYXhtYWcgLTEyMzQ1Njc4OTAxIDEgLT4gLTEyMzQ1Njc4OTAxCitteGd4MjM2IG1heG1hZyAxIC0xMjM0NTY3ODkwMSAtPiAtMTIzNDU2Nzg5MDEKK214Z3gyMzcgbWF4bWFnIC0xMjM0NTY3ODk2ICAxIC0+IC0xMjM0NTY3ODk2CitteGd4MjM4IG1heG1hZyAxIC0xMjM0NTY3ODk2ICAtPiAtMTIzNDU2Nzg5NgorCistLSBmcm9tIGV4YW1wbGVzCitteGd4MjgwIG1heG1hZyAnMycgICAnMicgIC0+ICAnMycKK214Z3gyODEgbWF4bWFnICctMTAnICczJyAgLT4gICctMTAnCitteGd4MjgyIG1heG1hZyAnMS4wJyAnMScgIC0+ICAnMScKK214Z3gyODMgbWF4bWFnICcxJyAnMS4wJyAgLT4gICcxJworbXhneDI4NCBtYXhtYWcgJzcnICdOYU4nICAtPiAgJzcnCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgLi4uCittYXhFeHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorbXhneDMzMCBtYXhtYWcgKzEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5IC0+ICA5RSs5OTk5OTk5OTkKK214Z3gzMzEgbWF4bWFnIDlFKzk5OTk5OTk5OSArMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAgOUUrOTk5OTk5OTk5CitteGd4MzMyIG1heG1hZyArMC4xMDAgOUUtOTk5OTk5OTk5ICAgICAgICAgICAgICAgLT4gIDAuMTAwCitteGd4MzMzIG1heG1hZyA5RS05OTk5OTk5OTkgKzAuMTAwICAgICAgICAgICAgICAgLT4gIDAuMTAwCitteGd4MzM1IG1heG1hZyAtMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSs5OTk5OTk5OTkgLT4gIDlFKzk5OTk5OTk5OQorbXhneDMzNiBtYXhtYWcgOUUrOTk5OTk5OTk5IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+ICA5RSs5OTk5OTk5OTkKK214Z3gzMzcgbWF4bWFnIC0wLjEwMCA5RS05OTk5OTk5OTkgICAgICAgICAgICAgICAtPiAgLTAuMTAwCitteGd4MzM4IG1heG1hZyA5RS05OTk5OTk5OTkgLTAuMTAwICAgICAgICAgICAgICAgLT4gIC0wLjEwMAorCitteGd4MzM5IG1heG1hZyAxZS01OTk5OTk5OTkgMWUtNDAwMDAwMDAxICAgLT4gIDFFLTQwMDAwMDAwMQorbXhneDM0MCBtYXhtYWcgMWUtNTk5OTk5OTk5IDFlLTQwMDAwMDAwMCAgIC0+ICAxRS00MDAwMDAwMDAKK214Z3gzNDEgbWF4bWFnIDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMDAgICAtPiAgMUUtNDAwMDAwMDAwCitteGd4MzQyIG1heG1hZyA5ZS05OTk5OTk5OTggMC4wMSAgICAgICAgICAgLT4gIDAuMDEKK214Z3gzNDMgbWF4bWFnIDllLTk5OTk5OTk5OCAwLjEgICAgICAgICAgICAtPiAgMC4xCitteGd4MzQ0IG1heG1hZyAwLjAxIDllLTk5OTk5OTk5OCAgICAgICAgICAgLT4gIDAuMDEKK214Z3gzNDUgbWF4bWFnIDFlNTk5OTk5OTk5IDFlNDAwMDAwMDAxICAgICAtPiAgMUUrNTk5OTk5OTk5CitteGd4MzQ2IG1heG1hZyAxZTU5OTk5OTk5OSAxZTQwMDAwMDAwMCAgICAgLT4gIDFFKzU5OTk5OTk5OQorbXhneDM0NyBtYXhtYWcgMWU2MDAwMDAwMDAgMWU0MDAwMDAwMDAgICAgIC0+ICAxRSs2MDAwMDAwMDAKK214Z3gzNDggbWF4bWFnIDllOTk5OTk5OTk4IDEwMCAgICAgICAgICAgICAtPiAgOUUrOTk5OTk5OTk4CitteGd4MzQ5IG1heG1hZyA5ZTk5OTk5OTk5OCAxMCAgICAgICAgICAgICAgLT4gIDlFKzk5OTk5OTk5OAorbXhneDM1MCBtYXhtYWcgMTAwICA5ZTk5OTk5OTk5OCAgICAgICAgICAgIC0+ICA5RSs5OTk5OTk5OTgKKy0tIHNpZ25zCitteGd4MzUxIG1heG1hZyAgMWUrNzc3Nzc3Nzc3ICAxZSs0MTExMTExMTEgLT4gIDFFKzc3Nzc3Nzc3NworbXhneDM1MiBtYXhtYWcgIDFlKzc3Nzc3Nzc3NyAtMWUrNDExMTExMTExIC0+ICAxRSs3Nzc3Nzc3NzcKK214Z3gzNTMgbWF4bWFnIC0xZSs3Nzc3Nzc3NzcgIDFlKzQxMTExMTExMSAtPiAtMUUrNzc3Nzc3Nzc3CitteGd4MzU0IG1heG1hZyAtMWUrNzc3Nzc3Nzc3IC0xZSs0MTExMTExMTEgLT4gLTFFKzc3Nzc3Nzc3NworbXhneDM1NSBtYXhtYWcgIDFlLTc3Nzc3Nzc3NyAgMWUtNDExMTExMTExIC0+ICAxRS00MTExMTExMTEKK214Z3gzNTYgbWF4bWFnICAxZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAtPiAtMUUtNDExMTExMTExCitteGd4MzU3IG1heG1hZyAtMWUtNzc3Nzc3Nzc3ICAxZS00MTExMTExMTEgLT4gIDFFLTQxMTExMTExMQorbXhneDM1OCBtYXhtYWcgLTFlLTc3Nzc3Nzc3NyAtMWUtNDExMTExMTExIC0+IC0xRS00MTExMTExMTEKKworLS0gZXhwYW5kZWQgbGlzdCBmcm9tIG1pbi9tYXggNzU0ciBwdXJwbGUgcHJvc2UKKy0tIFtleHBsaWNpdCB0ZXN0cyBmb3IgZXhwb25lbnQgb3JkZXJpbmddCitteGd4NDAxIG1heG1hZyAgSW5mICAgIDEuMSAgICAgLT4gIEluZmluaXR5CitteGd4NDAyIG1heG1hZyAgMS4xICAgIDEgICAgICAgLT4gIDEuMQorbXhneDQwMyBtYXhtYWcgIDEgICAgICAxLjAgICAgIC0+ICAxCitteGd4NDA0IG1heG1hZyAgMS4wICAgIDAuMSAgICAgLT4gIDEuMAorbXhneDQwNSBtYXhtYWcgIDAuMSAgICAwLjEwICAgIC0+ICAwLjEKK214Z3g0MDYgbWF4bWFnICAwLjEwICAgMC4xMDAgICAtPiAgMC4xMAorbXhneDQwNyBtYXhtYWcgIDAuMTAgICAwICAgICAgIC0+ICAwLjEwCitteGd4NDA4IG1heG1hZyAgMCAgICAgIDAuMCAgICAgLT4gIDAKK214Z3g0MDkgbWF4bWFnICAwLjAgICAtMCAgICAgICAtPiAgMC4wCitteGd4NDEwIG1heG1hZyAgMC4wICAgLTAuMCAgICAgLT4gIDAuMAorbXhneDQxMSBtYXhtYWcgIDAuMDAgIC0wLjAgICAgIC0+ICAwLjAwCitteGd4NDEyIG1heG1hZyAgMC4wICAgLTAuMDAgICAgLT4gIDAuMAorbXhneDQxMyBtYXhtYWcgIDAgICAgIC0wLjAgICAgIC0+ICAwCitteGd4NDE0IG1heG1hZyAgMCAgICAgLTAgICAgICAgLT4gIDAKK214Z3g0MTUgbWF4bWFnIC0wLjAgICAtMCAgICAgICAtPiAtMC4wCitteGd4NDE2IG1heG1hZyAtMCAgICAgLTAuMTAwICAgLT4gLTAuMTAwCitteGd4NDE3IG1heG1hZyAtMC4xMDAgLTAuMTAgICAgLT4gLTAuMTAwCitteGd4NDE4IG1heG1hZyAtMC4xMCAgLTAuMSAgICAgLT4gLTAuMTAKK214Z3g0MTkgbWF4bWFnIC0wLjEgICAtMS4wICAgICAtPiAtMS4wCitteGd4NDIwIG1heG1hZyAtMS4wICAgLTEgICAgICAgLT4gLTEuMAorbXhneDQyMSBtYXhtYWcgLTEgICAgIC0xLjEgICAgIC0+IC0xLjEKK214Z3g0MjMgbWF4bWFnIC0xLjEgICAtSW5mICAgICAtPiAtSW5maW5pdHkKKy0tIHNhbWUgd2l0aCBvcGVyYW5kcyByZXZlcnNlZAorbXhneDQzMSBtYXhtYWcgIDEuMSAgICBJbmYgICAgIC0+ICBJbmZpbml0eQorbXhneDQzMiBtYXhtYWcgIDEgICAgICAxLjEgICAgIC0+ICAxLjEKK214Z3g0MzMgbWF4bWFnICAxLjAgICAgMSAgICAgICAtPiAgMQorbXhneDQzNCBtYXhtYWcgIDAuMSAgICAxLjAgICAgIC0+ICAxLjAKK214Z3g0MzUgbWF4bWFnICAwLjEwICAgMC4xICAgICAtPiAgMC4xCitteGd4NDM2IG1heG1hZyAgMC4xMDAgIDAuMTAgICAgLT4gIDAuMTAKK214Z3g0MzcgbWF4bWFnICAwICAgICAgMC4xMCAgICAtPiAgMC4xMAorbXhneDQzOCBtYXhtYWcgIDAuMCAgICAwICAgICAgIC0+ICAwCitteGd4NDM5IG1heG1hZyAtMCAgICAgIDAuMCAgICAgLT4gIDAuMAorbXhneDQ0MCBtYXhtYWcgLTAuMCAgICAwLjAgICAgIC0+ICAwLjAKK214Z3g0NDEgbWF4bWFnIC0wLjAgICAgMC4wMCAgICAtPiAgMC4wMAorbXhneDQ0MiBtYXhtYWcgLTAuMDAgICAwLjAgICAgIC0+ICAwLjAKK214Z3g0NDMgbWF4bWFnIC0wLjAgICAgMCAgICAgICAtPiAgMAorbXhneDQ0NCBtYXhtYWcgLTAgICAgICAwICAgICAgIC0+ICAwCitteGd4NDQ1IG1heG1hZyAtMCAgICAgLTAuMCAgICAgLT4gLTAuMAorbXhneDQ0NiBtYXhtYWcgLTAuMTAwIC0wICAgICAgIC0+IC0wLjEwMAorbXhneDQ0NyBtYXhtYWcgLTAuMTAgIC0wLjEwMCAgIC0+IC0wLjEwMAorbXhneDQ0OCBtYXhtYWcgLTAuMSAgIC0wLjEwICAgIC0+IC0wLjEwCitteGd4NDQ5IG1heG1hZyAtMS4wICAgLTAuMSAgICAgLT4gLTEuMAorbXhneDQ1MCBtYXhtYWcgLTEgICAgIC0xLjAgICAgIC0+IC0xLjAKK214Z3g0NTEgbWF4bWFnIC0xLjEgICAtMSAgICAgICAtPiAtMS4xCitteGd4NDUzIG1heG1hZyAtSW5mICAgLTEuMSAgICAgLT4gLUluZmluaXR5CistLSBsYXJnaWVzCitteGd4NDYwIG1heG1hZyAgMTAwMCAgIDFFKzMgICAgLT4gIDFFKzMKK214Z3g0NjEgbWF4bWFnICAxRSszICAgMTAwMCAgICAtPiAgMUUrMworbXhneDQ2MiBtYXhtYWcgIDEwMDAgIC0xRSszICAgIC0+ICAxMDAwCitteGd4NDYzIG1heG1hZyAgMUUrMyAgLTEwMDAgICAgLT4gIDFFKzMKK214Z3g0NjQgbWF4bWFnIC0xMDAwICAgMUUrMyAgICAtPiAgMUUrMworbXhneDQ2NSBtYXhtYWcgLTFFKzMgICAxMDAwICAgIC0+ICAxMDAwCitteGd4NDY2IG1heG1hZyAtMTAwMCAgLTFFKzMgICAgLT4gLTEwMDAKK214Z3g0NjcgbWF4bWFnIC0xRSszICAtMTAwMCAgICAtPiAtMTAwMAorCistLSByb3VuZGluZyAocmVzdWx0cyB0cmVhdGVkIGFzIHRob3VnaCBwbHVzKQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogMworCitteGd4NDcwIG1heG1hZyAgMSAgICAgIC41ICAgICAtPiAgMQorbXhneDQ3MSBtYXhtYWcgIDEwICAgICA1ICAgICAgLT4gIDEwCitteGd4NDcyIG1heG1hZyAgMTAwICAgIDUwICAgICAtPiAgMTAwCitteGd4NDczIG1heG1hZyAgMTAwMCAgIDUwMCAgICAtPiAgMS4wMEUrMyBSb3VuZGVkCitteGd4NDc0IG1heG1hZyAgMTAwMDAgIDUwMDAgICAtPiAgMS4wMEUrNCBSb3VuZGVkCitteGd4NDc1IG1heG1hZyAgNiAgICAgIC41ICAgICAtPiAgNgorbXhneDQ3NiBtYXhtYWcgIDY2ICAgICA1ICAgICAgLT4gIDY2CitteGd4NDc3IG1heG1hZyAgNjY2ICAgIDUwICAgICAtPiAgNjY2CitteGd4NDc4IG1heG1hZyAgNjY2NiAgIDUwMCAgICAtPiAgNi42N0UrMyBSb3VuZGVkIEluZXhhY3QKK214Z3g0NzkgbWF4bWFnICA2NjY2NiAgNTAwMCAgIC0+ICA2LjY3RSs0IFJvdW5kZWQgSW5leGFjdAorbXhneDQ4MCBtYXhtYWcgIDMzMzMzICA1MDAwICAgLT4gIDMuMzNFKzQgUm91bmRlZCBJbmV4YWN0CitteGd4NDgxIG1heG1hZyAgLjUgICAgIDEgICAgICAtPiAgMQorbXhneDQ4MiBtYXhtYWcgIC41ICAgICAxMCAgICAgLT4gIDEwCitteGd4NDgzIG1heG1hZyAgLjUgICAgIDEwMCAgICAtPiAgMTAwCitteGd4NDg0IG1heG1hZyAgLjUgICAgIDEwMDAgICAtPiAgMS4wMEUrMyBSb3VuZGVkCitteGd4NDg1IG1heG1hZyAgLjUgICAgIDEwMDAwICAtPiAgMS4wMEUrNCBSb3VuZGVkCitteGd4NDg2IG1heG1hZyAgLjUgICAgIDYgICAgICAtPiAgNgorbXhneDQ4NyBtYXhtYWcgIC41ICAgICA2NiAgICAgLT4gIDY2CitteGd4NDg4IG1heG1hZyAgLjUgICAgIDY2NiAgICAtPiAgNjY2CitteGd4NDg5IG1heG1hZyAgLjUgICAgIDY2NjYgICAtPiAgNi42N0UrMyBSb3VuZGVkIEluZXhhY3QKK214Z3g0OTAgbWF4bWFnICAuNSAgICAgNjY2NjYgIC0+ICA2LjY3RSs0IFJvdW5kZWQgSW5leGFjdAorbXhneDQ5MSBtYXhtYWcgIC41ICAgICAzMzMzMyAgLT4gIDMuMzNFKzQgUm91bmRlZCBJbmV4YWN0CisKKy0tIG92ZXJmbG93IHRlc3RzCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcHJlY2lzaW9uOiAzCitteGd4NTAwIG1heG1hZyA5Ljk5OUUrOTk5OTk5OTk5ICAwIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK214Z3g1MDEgbWF4bWFnIC05Ljk5OUUrOTk5OTk5OTk5IDAgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3cKK3ByZWNpc2lvbjogMworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK214Z3g1MTAgbWF4bWFnICAxLjAwRS05OTkgICAgICAgMCAgLT4gICAxLjAwRS05OTkKK214Z3g1MTEgbWF4bWFnICAwLjFFLTk5OSAgICAgICAgMCAgLT4gICAxRS0xMDAwICAgU3Vibm9ybWFsCitteGd4NTEyIG1heG1hZyAgMC4xMEUtOTk5ICAgICAgIDAgIC0+ICAgMS4wRS0xMDAwIFN1Ym5vcm1hbAorbXhneDUxMyBtYXhtYWcgIDAuMTAwRS05OTkgICAgICAwICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorbXhneDUxNCBtYXhtYWcgIDAuMDFFLTk5OSAgICAgICAwICAtPiAgIDFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBObWluCitteGd4NTE1IG1heG1hZyAgMC45OTlFLTk5OSAgICAgIDAgIC0+ICAgMS4wMEUtOTk5IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitteGd4NTE2IG1heG1hZyAgMC4wOTlFLTk5OSAgICAgIDAgIC0+ICAgMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitteGd4NTE3IG1heG1hZyAgMC4wMDlFLTk5OSAgICAgIDAgIC0+ICAgMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitteGd4NTE4IG1heG1hZyAgMC4wMDFFLTk5OSAgICAgIDAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK214Z3g1MTkgbWF4bWFnICAwLjAwMDlFLTk5OSAgICAgMCAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorbXhneDUyMCBtYXhtYWcgIDAuMDAwMUUtOTk5ICAgICAwICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCisKK214Z3g1MzAgbWF4bWFnIC0xLjAwRS05OTkgICAgICAgMCAgLT4gIC0xLjAwRS05OTkKK214Z3g1MzEgbWF4bWFnIC0wLjFFLTk5OSAgICAgICAgMCAgLT4gIC0xRS0xMDAwICAgU3Vibm9ybWFsCitteGd4NTMyIG1heG1hZyAtMC4xMEUtOTk5ICAgICAgIDAgIC0+ICAtMS4wRS0xMDAwIFN1Ym5vcm1hbAorbXhneDUzMyBtYXhtYWcgLTAuMTAwRS05OTkgICAgICAwICAtPiAgLTEuMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorbXhneDUzNCBtYXhtYWcgLTAuMDFFLTk5OSAgICAgICAwICAtPiAgLTFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byAtTm1pbgorbXhneDUzNSBtYXhtYWcgLTAuOTk5RS05OTkgICAgICAwICAtPiAgLTEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbXhneDUzNiBtYXhtYWcgLTAuMDk5RS05OTkgICAgICAwICAtPiAgLTEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbXhneDUzNyBtYXhtYWcgLTAuMDA5RS05OTkgICAgICAwICAtPiAgLTFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbXhneDUzOCBtYXhtYWcgLTAuMDAxRS05OTkgICAgICAwICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitteGd4NTM5IG1heG1hZyAtMC4wMDA5RS05OTkgICAgIDAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK214Z3g1NDAgbWF4bWFnIC0wLjAwMDFFLTk5OSAgICAgMCAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCistLSBOdWxsIHRlc3RzCitteGd4OTAwIG1heG1hZyAxMCAgIyAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitteGd4OTAxIG1heG1hZyAgIyAxMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL21pbi5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9taW4uZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmY3NTgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9taW4uZGVjVGVzdApAQCAtMCwwICsxLDQwNyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBtaW4uZGVjVGVzdCAtLSBkZWNpbWFsIG1pbmltdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIHdlIGFzc3VtZSB0aGF0IGJhc2UgY29tcGFyaXNvbiBpcyB0ZXN0ZWQgaW4gY29tcGFyZS5kZWNUZXN0LCBzbworLS0gdGhlc2UgbWFpbmx5IGNvdmVyIHNwZWNpYWwgY2FzZXMgYW5kIHJvdW5kaW5nCisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIHNhbml0eSBjaGVja3MKK21ubXgwMDEgbWluICAtMiAgLTIgIC0+IC0yCittbm14MDAyIG1pbiAgLTIgIC0xICAtPiAtMgorbW5teDAwMyBtaW4gIC0yICAgMCAgLT4gLTIKK21ubXgwMDQgbWluICAtMiAgIDEgIC0+IC0yCittbm14MDA1IG1pbiAgLTIgICAyICAtPiAtMgorbW5teDAwNiBtaW4gIC0xICAtMiAgLT4gLTIKK21ubXgwMDcgbWluICAtMSAgLTEgIC0+IC0xCittbm14MDA4IG1pbiAgLTEgICAwICAtPiAtMQorbW5teDAwOSBtaW4gIC0xICAgMSAgLT4gLTEKK21ubXgwMTAgbWluICAtMSAgIDIgIC0+IC0xCittbm14MDExIG1pbiAgIDAgIC0yICAtPiAtMgorbW5teDAxMiBtaW4gICAwICAtMSAgLT4gLTEKK21ubXgwMTMgbWluICAgMCAgIDAgIC0+ICAwCittbm14MDE0IG1pbiAgIDAgICAxICAtPiAgMAorbW5teDAxNSBtaW4gICAwICAgMiAgLT4gIDAKK21ubXgwMTYgbWluICAgMSAgLTIgIC0+IC0yCittbm14MDE3IG1pbiAgIDEgIC0xICAtPiAtMQorbW5teDAxOCBtaW4gICAxICAgMCAgLT4gIDAKK21ubXgwMTkgbWluICAgMSAgIDEgIC0+ICAxCittbm14MDIwIG1pbiAgIDEgICAyICAtPiAgMQorbW5teDAyMSBtaW4gICAyICAtMiAgLT4gLTIKK21ubXgwMjIgbWluICAgMiAgLTEgIC0+IC0xCittbm14MDIzIG1pbiAgIDIgICAwICAtPiAgMAorbW5teDAyNSBtaW4gICAyICAgMSAgLT4gIDEKK21ubXgwMjYgbWluICAgMiAgIDIgIC0+ICAyCisKKy0tIGV4dGVuZGVkIHplcm9zCittbm14MDMwIG1pbiAgIDAgICAgIDAgICAtPiAgMAorbW5teDAzMSBtaW4gICAwICAgIC0wICAgLT4gLTAKK21ubXgwMzIgbWluICAgMCAgICAtMC4wIC0+IC0wLjAKK21ubXgwMzMgbWluICAgMCAgICAgMC4wIC0+ICAwLjAKK21ubXgwMzQgbWluICAtMCAgICAgMCAgIC0+IC0wCittbm14MDM1IG1pbiAgLTAgICAgLTAgICAtPiAtMAorbW5teDAzNiBtaW4gIC0wICAgIC0wLjAgLT4gLTAKK21ubXgwMzcgbWluICAtMCAgICAgMC4wIC0+IC0wCittbm14MDM4IG1pbiAgIDAuMCAgIDAgICAtPiAgMC4wCittbm14MDM5IG1pbiAgIDAuMCAgLTAgICAtPiAtMAorbW5teDA0MCBtaW4gICAwLjAgIC0wLjAgLT4gLTAuMAorbW5teDA0MSBtaW4gICAwLjAgICAwLjAgLT4gIDAuMAorbW5teDA0MiBtaW4gIC0wLjAgICAwICAgLT4gLTAuMAorbW5teDA0MyBtaW4gIC0wLjAgIC0wICAgLT4gLTAKK21ubXgwNDQgbWluICAtMC4wICAtMC4wIC0+IC0wLjAKK21ubXgwNDUgbWluICAtMC4wICAgMC4wIC0+IC0wLjAKKworbW5teDA0NiBtaW4gICAwRTEgIC0wRTEgLT4gLTBFKzEKK21ubXgwNDcgbWluICAtMEUxICAgMEUyIC0+IC0wRSsxCittbm14MDQ4IG1pbiAgIDBFMiAgIDBFMSAtPiAgMEUrMQorbW5teDA0OSBtaW4gICAwRTEgICAwRTIgLT4gIDBFKzEKK21ubXgwNTAgbWluICAtMEUzICAtMEUyIC0+IC0wRSszCittbm14MDUxIG1pbiAgLTBFMiAgLTBFMyAtPiAtMEUrMworCistLSBTcGVjaWFscworcHJlY2lzaW9uOiA5Cittbm14MDkwIG1pbiAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5Cittbm14MDkxIG1pbiAgSW5mICAtMTAwMCAgLT4gLTEwMDAKK21ubXgwOTIgbWluICBJbmYgIC0xICAgICAtPiAtMQorbW5teDA5MyBtaW4gIEluZiAgLTAgICAgIC0+IC0wCittbm14MDk0IG1pbiAgSW5mICAgMCAgICAgLT4gIDAKK21ubXgwOTUgbWluICBJbmYgICAxICAgICAtPiAgMQorbW5teDA5NiBtaW4gIEluZiAgIDEwMDAgIC0+ICAxMDAwCittbm14MDk3IG1pbiAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5Cittbm14MDk4IG1pbiAtMTAwMCAgSW5mICAgLT4gLTEwMDAKK21ubXgwOTkgbWluIC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK21ubXgxMDAgbWluIC0xICAgICBJbmYgICAtPiAtMQorbW5teDEwMSBtaW4gLTAgICAgIEluZiAgIC0+IC0wCittbm14MTAyIG1pbiAgMCAgICAgSW5mICAgLT4gIDAKK21ubXgxMDMgbWluICAxICAgICBJbmYgICAtPiAgMQorbW5teDEwNCBtaW4gIDEwMDAgIEluZiAgIC0+ICAxMDAwCittbm14MTA1IG1pbiAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK21ubXgxMjAgbWluIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK21ubXgxMjEgbWluIC1JbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK21ubXgxMjIgbWluIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK21ubXgxMjMgbWluIC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK21ubXgxMjQgbWluIC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK21ubXgxMjUgbWluIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK21ubXgxMjYgbWluIC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK21ubXgxMjcgbWluIC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK21ubXgxMjggbWluIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK21ubXgxMjkgbWluIC0xMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK21ubXgxMzAgbWluIC0xICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK21ubXgxMzEgbWluIC0wICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK21ubXgxMzIgbWluICAwICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK21ubXgxMzMgbWluICAxICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK21ubXgxMzQgbWluICAxMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK21ubXgxMzUgbWluICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKKworLS0gMjAwNC4wOC4wMiA3NTRyIGNob29zZXMgbnVtYmVyIG92ZXIgTmFOIGluIG1peGVkIGNhc2VzCittbm14MTQxIG1pbiAgTmFOIC1JbmYgICAgLT4gIC1JbmZpbml0eQorbW5teDE0MiBtaW4gIE5hTiAtMTAwMCAgIC0+ICAtMTAwMAorbW5teDE0MyBtaW4gIE5hTiAtMSAgICAgIC0+ICAtMQorbW5teDE0NCBtaW4gIE5hTiAtMCAgICAgIC0+ICAtMAorbW5teDE0NSBtaW4gIE5hTiAgMCAgICAgIC0+ICAwCittbm14MTQ2IG1pbiAgTmFOICAxICAgICAgLT4gIDEKK21ubXgxNDcgbWluICBOYU4gIDEwMDAgICAtPiAgMTAwMAorbW5teDE0OCBtaW4gIE5hTiAgSW5mICAgIC0+ICBJbmZpbml0eQorbW5teDE0OSBtaW4gIE5hTiAgTmFOICAgIC0+ICBOYU4KK21ubXgxNTAgbWluIC1JbmYgIE5hTiAgICAtPiAtSW5maW5pdHkKK21ubXgxNTEgbWluIC0xMDAwIE5hTiAgICAtPiAtMTAwMAorbW5teDE1MiBtaW4gLTEgICAtTmFOICAgIC0+IC0xCittbm14MTUzIG1pbiAtMCAgICBOYU4gICAgLT4gLTAKK21ubXgxNTQgbWluICAwICAgLU5hTiAgICAtPiAgMAorbW5teDE1NSBtaW4gIDEgICAgTmFOICAgIC0+ICAxCittbm14MTU2IG1pbiAgMTAwMCBOYU4gICAgLT4gIDEwMDAKK21ubXgxNTcgbWluICBJbmYgIE5hTiAgICAtPiAgSW5maW5pdHkKKworbW5teDE2MSBtaW4gIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbm14MTYyIG1pbiAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21ubXgxNjMgbWluICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE2NCBtaW4gIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbm14MTY1IG1pbiAtc05hTiAgMCAgICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21ubXgxNjYgbWluIC1zTmFOICAxICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE2NyBtaW4gIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbm14MTY4IG1pbiAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21ubXgxNjkgbWluICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE3MCBtaW4gIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbm14MTcxIG1pbiAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21ubXgxNzIgbWluIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE3MyBtaW4gLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbm14MTc0IG1pbiAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21ubXgxNzUgbWluICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE3NiBtaW4gIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbm14MTc3IG1pbiAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21ubXgxNzggbWluICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE3OSBtaW4gIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK21ubXgxODEgbWluICBOYU45ICAgLUluZiAgIC0+IC1JbmZpbml0eQorbW5teDE4MiBtaW4gLU5hTjggICAgOTk5MCAgLT4gIDk5OTAKK21ubXgxODMgbWluICBOYU43MSAgIEluZiAgIC0+ICBJbmZpbml0eQorCittbm14MTg0IG1pbiAgTmFOMSAgICBOYU41NCAtPiAgTmFOMQorbW5teDE4NSBtaW4gIE5hTjIyICAtTmFONTMgLT4gIE5hTjIyCittbm14MTg2IG1pbiAtTmFOMyAgICBOYU42ICAtPiAtTmFOMworbW5teDE4NyBtaW4gLU5hTjQ0ICAgTmFONyAgLT4gLU5hTjQ0CisKK21ubXgxODggbWluIC1JbmYgICAgIE5hTjQxIC0+IC1JbmZpbml0eQorbW5teDE4OSBtaW4gLTk5OTkgICAtTmFOMzMgLT4gLTk5OTkKK21ubXgxOTAgbWluICBJbmYgICAgIE5hTjIgIC0+ICBJbmZpbml0eQorCittbm14MTkxIG1pbiAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCittbm14MTkyIG1pbiAgc05hTjk4IC0xMSAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCittbm14MTkzIG1pbiAtc05hTjk3ICBOYU44ICAgLT4gLU5hTjk3IEludmFsaWRfb3BlcmF0aW9uCittbm14MTk0IG1pbiAgc05hTjY5IHNOYU45NCAgLT4gIE5hTjY5IEludmFsaWRfb3BlcmF0aW9uCittbm14MTk1IG1pbiAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCittbm14MTk2IG1pbiAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCittbm14MTk3IG1pbiAgMDg4ICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCittbm14MTk4IG1pbiAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCittbm14MTk5IG1pbiAgTmFOICAgIHNOYU44NiAgLT4gIE5hTjg2IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHJvdW5kaW5nIGNoZWNrcyAtLSBjaG9zZW4gaXMgcm91bmRlZCwgb3Igbm90CittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5Cittbm14MjAxIG1pbiAtMTIzNDU2NzgwMDAgMSAgLT4gLTEuMjM0NTY3ODBFKzEwIFJvdW5kZWQKK21ubXgyMDIgbWluIDEgLTEyMzQ1Njc4MDAwICAtPiAtMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorbW5teDIwMyBtaW4gLTEyMzQ1Njc4MDAgIDEgIC0+IC0xLjIzNDU2NzgwRSs5IFJvdW5kZWQKK21ubXgyMDQgbWluIDEgLTEyMzQ1Njc4MDAgICAtPiAtMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCittbm14MjA1IG1pbiAtMTIzNDU2Nzg5MCAgMSAgLT4gLTEuMjM0NTY3ODlFKzkgUm91bmRlZAorbW5teDIwNiBtaW4gMSAtMTIzNDU2Nzg5MCAgIC0+IC0xLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK21ubXgyMDcgbWluIC0xMjM0NTY3ODkxICAxICAtPiAtMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK21ubXgyMDggbWluIDEgLTEyMzQ1Njc4OTEgICAtPiAtMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK21ubXgyMDkgbWluIC0xMjM0NTY3ODkwMSAxICAtPiAtMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCittbm14MjEwIG1pbiAxIC0xMjM0NTY3ODkwMSAgLT4gLTEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorbW5teDIxMSBtaW4gLTEyMzQ1Njc4OTYgIDEgIC0+IC0xLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorbW5teDIxMiBtaW4gMSAtMTIzNDU2Nzg5NiAgIC0+IC0xLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorbW5teDIxMyBtaW4gMTIzNDU2Nzg5MSAgMSAgIC0+IDEKK21ubXgyMTQgbWluIDEgMTIzNDU2Nzg5MSAgICAtPiAxCittbm14MjE1IG1pbiAxMjM0NTY3ODkwMSAxICAgLT4gMQorbW5teDIxNiBtaW4gMSAxMjM0NTY3ODkwMSAgIC0+IDEKK21ubXgyMTcgbWluIDEyMzQ1Njc4OTYgIDEgICAtPiAxCittbm14MjE4IG1pbiAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCitwcmVjaXNpb246IDE1Cittbm14MjIxIG1pbiAtMTIzNDU2NzgwMDAgMSAgLT4gLTEyMzQ1Njc4MDAwCittbm14MjIyIG1pbiAxIC0xMjM0NTY3ODAwMCAgLT4gLTEyMzQ1Njc4MDAwCittbm14MjIzIG1pbiAtMTIzNDU2NzgwMCAgMSAgLT4gLTEyMzQ1Njc4MDAKK21ubXgyMjQgbWluIDEgLTEyMzQ1Njc4MDAgICAtPiAtMTIzNDU2NzgwMAorbW5teDIyNSBtaW4gLTEyMzQ1Njc4OTAgIDEgIC0+IC0xMjM0NTY3ODkwCittbm14MjI2IG1pbiAxIC0xMjM0NTY3ODkwICAgLT4gLTEyMzQ1Njc4OTAKK21ubXgyMjcgbWluIC0xMjM0NTY3ODkxICAxICAtPiAtMTIzNDU2Nzg5MQorbW5teDIyOCBtaW4gMSAtMTIzNDU2Nzg5MSAgIC0+IC0xMjM0NTY3ODkxCittbm14MjI5IG1pbiAtMTIzNDU2Nzg5MDEgMSAgLT4gLTEyMzQ1Njc4OTAxCittbm14MjMwIG1pbiAxIC0xMjM0NTY3ODkwMSAgLT4gLTEyMzQ1Njc4OTAxCittbm14MjMxIG1pbiAtMTIzNDU2Nzg5NiAgMSAgLT4gLTEyMzQ1Njc4OTYKK21ubXgyMzIgbWluIDEgLTEyMzQ1Njc4OTYgICAtPiAtMTIzNDU2Nzg5NgorbW5teDIzMyBtaW4gMTIzNDU2Nzg5MSAgMSAgIC0+IDEKK21ubXgyMzQgbWluIDEgMTIzNDU2Nzg5MSAgICAtPiAxCittbm14MjM1IG1pbiAxMjM0NTY3ODkwMSAxICAgLT4gMQorbW5teDIzNiBtaW4gMSAxMjM0NTY3ODkwMSAgIC0+IDEKK21ubXgyMzcgbWluIDEyMzQ1Njc4OTYgIDEgICAtPiAxCittbm14MjM4IG1pbiAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCistLSBmcm9tIGV4YW1wbGVzCittbm14MjgwIG1pbiAnMycgICAnMicgIC0+ICAnMicKK21ubXgyODEgbWluICctMTAnICczJyAgLT4gICctMTAnCittbm14MjgyIG1pbiAnMS4wJyAnMScgIC0+ICAnMS4wJworbW5teDI4MyBtaW4gJzEnICcxLjAnICAtPiAgJzEuMCcKK21ubXgyODQgbWluICc3JyAnTmFOJyAgLT4gICc3JworCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uIHN1Ym5vcm1hbCByZXN1bHRzIFtpbnB1dHNdIG5vdyBhbGxvd2VkCittYXhFeHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorbW5teDMzMCBtaW4gLTEuMjM0NTY3ODkwMTIzNDVFLTAgLTlFKzk5OTk5OTk5OSAtPiAtOUUrOTk5OTk5OTk5Cittbm14MzMxIG1pbiAtOUUrOTk5OTk5OTk5IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+IC05RSs5OTk5OTk5OTkKK21ubXgzMzIgbWluIC0wLjEwMCAtOUUtOTk5OTk5OTk5ICAgICAgICAgICAgICAgLT4gLTAuMTAwCittbm14MzMzIG1pbiAtOUUtOTk5OTk5OTk5IC0wLjEwMCAgICAgICAgICAgICAgIC0+IC0wLjEwMAorbW5teDMzNSBtaW4gKzEuMjM0NTY3ODkwMTIzNDVFLTAgLTlFKzk5OTk5OTk5OSAtPiAtOUUrOTk5OTk5OTk5Cittbm14MzM2IG1pbiAtOUUrOTk5OTk5OTk5IDEuMjM0NTY3ODkwMTIzNDVFLTAgIC0+IC05RSs5OTk5OTk5OTkKK21ubXgzMzcgbWluICswLjEwMCAtOUUtOTk5OTk5OTk5ICAgICAgICAgICAgICAgLT4gLTlFLTk5OTk5OTk5OQorbW5teDMzOCBtaW4gLTlFLTk5OTk5OTk5OSAwLjEwMCAgICAgICAgICAgICAgICAtPiAtOUUtOTk5OTk5OTk5CisKK21ubXgzMzkgbWluIC0xZS01OTk5OTk5OTkgLTFlLTQwMDAwMDAwMSAgIC0+ICAtMUUtNDAwMDAwMDAxCittbm14MzQwIG1pbiAtMWUtNTk5OTk5OTk5IC0xZS00MDAwMDAwMDAgICAtPiAgLTFFLTQwMDAwMDAwMAorbW5teDM0MSBtaW4gLTFlLTYwMDAwMDAwMCAtMWUtNDAwMDAwMDAwICAgLT4gIC0xRS00MDAwMDAwMDAKK21ubXgzNDIgbWluIC05ZS05OTk5OTk5OTggLTAuMDEgICAgICAgICAgIC0+ICAtMC4wMQorbW5teDM0MyBtaW4gLTllLTk5OTk5OTk5OCAtMC4xICAgICAgICAgICAgLT4gIC0wLjEKK21ubXgzNDQgbWluIC0wLjAxICAgICAgICAgLTllLTk5OTk5OTk5OCAgIC0+ICAtMC4wMQorbW5teDM0NSBtaW4gLTFlNTk5OTk5OTk5ICAtMWU0MDAwMDAwMDEgICAgLT4gIC0xRSs1OTk5OTk5OTkKK21ubXgzNDYgbWluIC0xZTU5OTk5OTk5OSAgLTFlNDAwMDAwMDAwICAgIC0+ICAtMUUrNTk5OTk5OTk5Cittbm14MzQ3IG1pbiAtMWU2MDAwMDAwMDAgIC0xZTQwMDAwMDAwMCAgICAtPiAgLTFFKzYwMDAwMDAwMAorbW5teDM0OCBtaW4gLTllOTk5OTk5OTk4ICAtMTAwICAgICAgICAgICAgLT4gIC05RSs5OTk5OTk5OTgKK21ubXgzNDkgbWluIC05ZTk5OTk5OTk5OCAgLTEwICAgICAgICAgICAgIC0+ICAtOUUrOTk5OTk5OTk4Cittbm14MzUwIG1pbiAtMTAwICAgICAgICAgIC05ZTk5OTk5OTk5OCAgICAtPiAgLTlFKzk5OTk5OTk5OAorLS0gc2lnbnMKK21ubXgzNTEgbWluIC0xZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAtPiAtMUUrNzc3Nzc3Nzc3Cittbm14MzUyIG1pbiAtMWUrNzc3Nzc3Nzc3ICsxZSs0MTExMTExMTEgLT4gLTFFKzc3Nzc3Nzc3NworbW5teDM1MyBtaW4gKzFlKzc3Nzc3Nzc3NyAtMWUrNDExMTExMTExIC0+IC0xRSs0MTExMTExMTEKK21ubXgzNTQgbWluICsxZSs3Nzc3Nzc3NzcgKzFlKzQxMTExMTExMSAtPiAgMUUrNDExMTExMTExCittbm14MzU1IG1pbiAtMWUtNzc3Nzc3Nzc3IC0xZS00MTExMTExMTEgLT4gLTFFLTQxMTExMTExMQorbW5teDM1NiBtaW4gLTFlLTc3Nzc3Nzc3NyArMWUtNDExMTExMTExIC0+IC0xRS03Nzc3Nzc3NzcKK21ubXgzNTcgbWluICsxZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAtPiAtMUUtNDExMTExMTExCittbm14MzU4IG1pbiArMWUtNzc3Nzc3Nzc3ICsxZS00MTExMTExMTEgLT4gIDFFLTc3Nzc3Nzc3NworCistLSBleHBhbmRlZCBsaXN0IGZyb20gbWluL21heCA3NTRyIHB1cnBsZSBwcm9zZQorLS0gW2V4cGxpY2l0IHRlc3RzIGZvciBleHBvbmVudCBvcmRlcmluZ10KK21ubXg0MDEgbWluICBJbmYgICAgMS4xICAgICAtPiAgMS4xCittbm14NDAyIG1pbiAgMS4xICAgIDEgICAgICAgLT4gIDEKK21ubXg0MDMgbWluICAxICAgICAgMS4wICAgICAtPiAgMS4wCittbm14NDA0IG1pbiAgMS4wICAgIDAuMSAgICAgLT4gIDAuMQorbW5teDQwNSBtaW4gIDAuMSAgICAwLjEwICAgIC0+ICAwLjEwCittbm14NDA2IG1pbiAgMC4xMCAgIDAuMTAwICAgLT4gIDAuMTAwCittbm14NDA3IG1pbiAgMC4xMCAgIDAgICAgICAgLT4gIDAKK21ubXg0MDggbWluICAwICAgICAgMC4wICAgICAtPiAgMC4wCittbm14NDA5IG1pbiAgMC4wICAgLTAgICAgICAgLT4gLTAKK21ubXg0MTAgbWluICAwLjAgICAtMC4wICAgICAtPiAtMC4wCittbm14NDExIG1pbiAgMC4wMCAgLTAuMCAgICAgLT4gLTAuMAorbW5teDQxMiBtaW4gIDAuMCAgIC0wLjAwICAgIC0+IC0wLjAwCittbm14NDEzIG1pbiAgMCAgICAgLTAuMCAgICAgLT4gLTAuMAorbW5teDQxNCBtaW4gIDAgICAgIC0wICAgICAgIC0+IC0wCittbm14NDE1IG1pbiAtMC4wICAgLTAgICAgICAgLT4gLTAKK21ubXg0MTYgbWluIC0wICAgICAtMC4xMDAgICAtPiAtMC4xMDAKK21ubXg0MTcgbWluIC0wLjEwMCAtMC4xMCAgICAtPiAtMC4xMAorbW5teDQxOCBtaW4gLTAuMTAgIC0wLjEgICAgIC0+IC0wLjEKK21ubXg0MTkgbWluIC0wLjEgICAtMS4wICAgICAtPiAtMS4wCittbm14NDIwIG1pbiAtMS4wICAgLTEgICAgICAgLT4gLTEKK21ubXg0MjEgbWluIC0xICAgICAtMS4xICAgICAtPiAtMS4xCittbm14NDIzIG1pbiAtMS4xICAgLUluZiAgICAgLT4gLUluZmluaXR5CistLSBzYW1lIHdpdGggb3BlcmFuZHMgcmV2ZXJzZWQKK21ubXg0MzEgbWluICAxLjEgICAgSW5mICAgICAtPiAgMS4xCittbm14NDMyIG1pbiAgMSAgICAgIDEuMSAgICAgLT4gIDEKK21ubXg0MzMgbWluICAxLjAgICAgMSAgICAgICAtPiAgMS4wCittbm14NDM0IG1pbiAgMC4xICAgIDEuMCAgICAgLT4gIDAuMQorbW5teDQzNSBtaW4gIDAuMTAgICAwLjEgICAgIC0+ICAwLjEwCittbm14NDM2IG1pbiAgMC4xMDAgIDAuMTAgICAgLT4gIDAuMTAwCittbm14NDM3IG1pbiAgMCAgICAgIDAuMTAgICAgLT4gIDAKK21ubXg0MzggbWluICAwLjAgICAgMCAgICAgICAtPiAgMC4wCittbm14NDM5IG1pbiAtMCAgICAgIDAuMCAgICAgLT4gLTAKK21ubXg0NDAgbWluIC0wLjAgICAgMC4wICAgICAtPiAtMC4wCittbm14NDQxIG1pbiAtMC4wICAgIDAuMDAgICAgLT4gLTAuMAorbW5teDQ0MiBtaW4gLTAuMDAgICAwLjAgICAgIC0+IC0wLjAwCittbm14NDQzIG1pbiAtMC4wICAgIDAgICAgICAgLT4gLTAuMAorbW5teDQ0NCBtaW4gLTAgICAgICAwICAgICAgIC0+IC0wCittbm14NDQ1IG1pbiAtMCAgICAgLTAuMCAgICAgLT4gLTAKK21ubXg0NDYgbWluIC0wLjEwMCAtMCAgICAgICAtPiAtMC4xMDAKK21ubXg0NDcgbWluIC0wLjEwICAtMC4xMDAgICAtPiAtMC4xMAorbW5teDQ0OCBtaW4gLTAuMSAgIC0wLjEwICAgIC0+IC0wLjEKK21ubXg0NDkgbWluIC0xLjAgICAtMC4xICAgICAtPiAtMS4wCittbm14NDUwIG1pbiAtMSAgICAgLTEuMCAgICAgLT4gLTEKK21ubXg0NTEgbWluIC0xLjEgICAtMSAgICAgICAtPiAtMS4xCittbm14NDUzIG1pbiAtSW5mICAgLTEuMSAgICAgLT4gLUluZmluaXR5CistLSBsYXJnaWVzCittbm14NDYwIG1pbiAgMTAwMCAgIDFFKzMgICAgLT4gIDEwMDAKK21ubXg0NjEgbWluICAxRSszICAgMTAwMCAgICAtPiAgMTAwMAorbW5teDQ2MiBtaW4gIDEwMDAgIC0xRSszICAgIC0+IC0xRSszCittbm14NDYzIG1pbiAgMUUrMyAgLTEwMDAgICAgLT4gLTEwMDAKK21ubXg0NjQgbWluIC0xMDAwICAgMUUrMyAgICAtPiAtMTAwMAorbW5teDQ2NSBtaW4gLTFFKzMgICAxMDAwICAgIC0+IC0xRSszCittbm14NDY2IG1pbiAtMTAwMCAgLTFFKzMgICAgLT4gLTFFKzMKK21ubXg0NjcgbWluIC0xRSszICAtMTAwMCAgICAtPiAtMUUrMworCistLSByb3VuZGluZyAocmVzdWx0cyB0cmVhdGVkIGFzIHRob3VnaCBwbHVzKQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogMworCittbm14NDcwIG1pbiAgMSAgICAgIDUgICAgICAtPiAgMQorbW5teDQ3MSBtaW4gIDEwICAgICA1MCAgICAgLT4gIDEwCittbm14NDcyIG1pbiAgMTAwICAgIDUwMCAgICAtPiAgMTAwCittbm14NDczIG1pbiAgMTAwMCAgIDUwMDAgICAtPiAgMS4wMEUrMyBSb3VuZGVkCittbm14NDc0IG1pbiAgMTAwMDAgIDUwMDAwICAtPiAgMS4wMEUrNCBSb3VuZGVkCittbm14NDc1IG1pbiAgNiAgICAgIDUwICAgICAtPiAgNgorbW5teDQ3NiBtaW4gIDY2ICAgICA1MDAgICAgLT4gIDY2Cittbm14NDc3IG1pbiAgNjY2ICAgIDUwMDAgICAtPiAgNjY2Cittbm14NDc4IG1pbiAgNjY2NiAgIDUwMDAwICAtPiAgNi42N0UrMyBSb3VuZGVkIEluZXhhY3QKK21ubXg0NzkgbWluICA2NjY2NiAgNTAwMDAwIC0+ICA2LjY3RSs0IFJvdW5kZWQgSW5leGFjdAorbW5teDQ4MCBtaW4gIDMzMzMzICA1MDAwMDAgLT4gIDMuMzNFKzQgUm91bmRlZCBJbmV4YWN0Cittbm14NDgxIG1pbiAgNzU0MDEgIDEgICAgICAtPiAgMQorbW5teDQ4MiBtaW4gIDc1NDAyICAxMCAgICAgLT4gIDEwCittbm14NDgzIG1pbiAgNzU0MDMgIDEwMCAgICAtPiAgMTAwCittbm14NDg0IG1pbiAgNzU0MDQgIDEwMDAgICAtPiAgMS4wMEUrMyBSb3VuZGVkCittbm14NDg1IG1pbiAgNzU0MDUgIDEwMDAwICAtPiAgMS4wMEUrNCBSb3VuZGVkCittbm14NDg2IG1pbiAgNzU0MDYgIDYgICAgICAtPiAgNgorbW5teDQ4NyBtaW4gIDc1NDA3ICA2NiAgICAgLT4gIDY2Cittbm14NDg4IG1pbiAgNzU0MDggIDY2NiAgICAtPiAgNjY2Cittbm14NDg5IG1pbiAgNzU0MDkgIDY2NjYgICAtPiAgNi42N0UrMyBSb3VuZGVkIEluZXhhY3QKK21ubXg0OTAgbWluICA3NTQxMCAgNjY2NjYgIC0+ICA2LjY3RSs0IFJvdW5kZWQgSW5leGFjdAorbW5teDQ5MSBtaW4gIDc1NDExICAzMzMzMyAgLT4gIDMuMzNFKzQgUm91bmRlZCBJbmV4YWN0CisKKworLS0gb3ZlcmZsb3cgdGVzdHMKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitwcmVjaXNpb246IDMKK21ubXg1MDAgbWluIDkuOTk5RSs5OTk5OTk5OTkgIDAgLT4gIDAKK21ubXg1MDEgbWluIC05Ljk5OUUrOTk5OTk5OTk5IDAgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3cKK3ByZWNpc2lvbjogMworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK21ubXg1MTAgbWluICAxLjAwRS05OTkgICAgICAgMCAgLT4gICAwCittbm14NTExIG1pbiAgMC4xRS05OTkgICAgICAgIDAgIC0+ICAgMAorbW5teDUxMiBtaW4gIDAuMTBFLTk5OSAgICAgICAwICAtPiAgIDAKK21ubXg1MTMgbWluICAwLjEwMEUtOTk5ICAgICAgMCAgLT4gICAwCittbm14NTE0IG1pbiAgMC4wMUUtOTk5ICAgICAgIDAgIC0+ICAgMAorbW5teDUxNSBtaW4gIDAuOTk5RS05OTkgICAgICAwICAtPiAgIDAKK21ubXg1MTYgbWluICAwLjA5OUUtOTk5ICAgICAgMCAgLT4gICAwCittbm14NTE3IG1pbiAgMC4wMDlFLTk5OSAgICAgIDAgIC0+ICAgMAorbW5teDUxOCBtaW4gIDAuMDAxRS05OTkgICAgICAwICAtPiAgIDAKK21ubXg1MTkgbWluICAwLjAwMDlFLTk5OSAgICAgMCAgLT4gICAwCittbm14NTIwIG1pbiAgMC4wMDAxRS05OTkgICAgIDAgIC0+ICAgMAorCittbm14NTMwIG1pbiAtMS4wMEUtOTk5ICAgICAgIDAgIC0+ICAtMS4wMEUtOTk5Cittbm14NTMxIG1pbiAtMC4xRS05OTkgICAgICAgIDAgIC0+ICAtMUUtMTAwMCAgIFN1Ym5vcm1hbAorbW5teDUzMiBtaW4gLTAuMTBFLTk5OSAgICAgICAwICAtPiAgLTEuMEUtMTAwMCBTdWJub3JtYWwKK21ubXg1MzMgbWluIC0wLjEwMEUtOTk5ICAgICAgMCAgLT4gIC0xLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK21ubXg1MzQgbWluIC0wLjAxRS05OTkgICAgICAgMCAgLT4gIC0xRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gTm1pbgorbW5teDUzNSBtaW4gLTAuOTk5RS05OTkgICAgICAwICAtPiAgLTEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbW5teDUzNiBtaW4gLTAuMDk5RS05OTkgICAgICAwICAtPiAgLTEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbW5teDUzNyBtaW4gLTAuMDA5RS05OTkgICAgICAwICAtPiAgLTFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbW5teDUzOCBtaW4gLTAuMDAxRS05OTkgICAgICAwICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCittbm14NTM5IG1pbiAtMC4wMDA5RS05OTkgICAgIDAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK21ubXg1NDAgbWluIC0wLjAwMDFFLTk5OSAgICAgMCAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCistLSBtaXNhbGlnbm1lbnQgdHJhcHMgZm9yIGxpdHRsZS1lbmRpYW4KK3ByZWNpc2lvbjogOQorbW5teDU1MSBtaW4gICAgICAxLjAgICAgICAgMC4xICAtPiAwLjEKK21ubXg1NTIgbWluICAgICAgMC4xICAgICAgIDEuMCAgLT4gMC4xCittbm14NTUzIG1pbiAgICAgMTAuMCAgICAgICAwLjEgIC0+IDAuMQorbW5teDU1NCBtaW4gICAgICAwLjEgICAgICAxMC4wICAtPiAwLjEKK21ubXg1NTUgbWluICAgICAgMTAwICAgICAgIDEuMCAgLT4gMS4wCittbm14NTU2IG1pbiAgICAgIDEuMCAgICAgICAxMDAgIC0+IDEuMAorbW5teDU1NyBtaW4gICAgIDEwMDAgICAgICAxMC4wICAtPiAxMC4wCittbm14NTU4IG1pbiAgICAgMTAuMCAgICAgIDEwMDAgIC0+IDEwLjAKK21ubXg1NTkgbWluICAgIDEwMDAwICAgICAxMDAuMCAgLT4gMTAwLjAKK21ubXg1NjAgbWluICAgIDEwMC4wICAgICAxMDAwMCAgLT4gMTAwLjAKK21ubXg1NjEgbWluICAgMTAwMDAwICAgIDEwMDAuMCAgLT4gMTAwMC4wCittbm14NTYyIG1pbiAgIDEwMDAuMCAgICAxMDAwMDAgIC0+IDEwMDAuMAorbW5teDU2MyBtaW4gIDEwMDAwMDAgICAxMDAwMC4wICAtPiAxMDAwMC4wCittbm14NTY0IG1pbiAgMTAwMDAuMCAgIDEwMDAwMDAgIC0+IDEwMDAwLjAKKworLS0gTnVsbCB0ZXN0cworbW5tOTAwIG1pbiAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK21ubTkwMSBtaW4gICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL21pbm1hZy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9taW5tYWcuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWFjMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9taW5tYWcuZGVjVGVzdApAQCAtMCwwICsxLDM5MCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBtaW5tYWcuZGVjVGVzdCAtLSBkZWNpbWFsIG1pbmltdW0gYnkgbWFnbml0dWRlICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIHdlIGFzc3VtZSB0aGF0IGJhc2UgY29tcGFyaXNvbiBpcyB0ZXN0ZWQgaW4gY29tcGFyZS5kZWNUZXN0LCBzbworLS0gdGhlc2UgbWFpbmx5IGNvdmVyIHNwZWNpYWwgY2FzZXMgYW5kIHJvdW5kaW5nCisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIHNhbml0eSBjaGVja3MKK21uZ3gwMDEgbWlubWFnICAtMiAgLTIgIC0+IC0yCittbmd4MDAyIG1pbm1hZyAgLTIgIC0xICAtPiAtMQorbW5neDAwMyBtaW5tYWcgIC0yICAgMCAgLT4gIDAKK21uZ3gwMDQgbWlubWFnICAtMiAgIDEgIC0+ICAxCittbmd4MDA1IG1pbm1hZyAgLTIgICAyICAtPiAtMgorbW5neDAwNiBtaW5tYWcgIC0xICAtMiAgLT4gLTEKK21uZ3gwMDcgbWlubWFnICAtMSAgLTEgIC0+IC0xCittbmd4MDA4IG1pbm1hZyAgLTEgICAwICAtPiAgMAorbW5neDAwOSBtaW5tYWcgIC0xICAgMSAgLT4gLTEKK21uZ3gwMTAgbWlubWFnICAtMSAgIDIgIC0+IC0xCittbmd4MDExIG1pbm1hZyAgIDAgIC0yICAtPiAgMAorbW5neDAxMiBtaW5tYWcgICAwICAtMSAgLT4gIDAKK21uZ3gwMTMgbWlubWFnICAgMCAgIDAgIC0+ICAwCittbmd4MDE0IG1pbm1hZyAgIDAgICAxICAtPiAgMAorbW5neDAxNSBtaW5tYWcgICAwICAgMiAgLT4gIDAKK21uZ3gwMTYgbWlubWFnICAgMSAgLTIgIC0+ICAxCittbmd4MDE3IG1pbm1hZyAgIDEgIC0xICAtPiAtMQorbW5neDAxOCBtaW5tYWcgICAxICAgMCAgLT4gIDAKK21uZ3gwMTkgbWlubWFnICAgMSAgIDEgIC0+ICAxCittbmd4MDIwIG1pbm1hZyAgIDEgICAyICAtPiAgMQorbW5neDAyMSBtaW5tYWcgICAyICAtMiAgLT4gLTIKK21uZ3gwMjIgbWlubWFnICAgMiAgLTEgIC0+IC0xCittbmd4MDIzIG1pbm1hZyAgIDIgICAwICAtPiAgMAorbW5neDAyNSBtaW5tYWcgICAyICAgMSAgLT4gIDEKK21uZ3gwMjYgbWlubWFnICAgMiAgIDIgIC0+ICAyCisKKy0tIGV4dGVuZGVkIHplcm9zCittbmd4MDMwIG1pbm1hZyAgIDAgICAgIDAgICAtPiAgMAorbW5neDAzMSBtaW5tYWcgICAwICAgIC0wICAgLT4gLTAKK21uZ3gwMzIgbWlubWFnICAgMCAgICAtMC4wIC0+IC0wLjAKK21uZ3gwMzMgbWlubWFnICAgMCAgICAgMC4wIC0+ICAwLjAKK21uZ3gwMzQgbWlubWFnICAtMCAgICAgMCAgIC0+IC0wCittbmd4MDM1IG1pbm1hZyAgLTAgICAgLTAgICAtPiAtMAorbW5neDAzNiBtaW5tYWcgIC0wICAgIC0wLjAgLT4gLTAKK21uZ3gwMzcgbWlubWFnICAtMCAgICAgMC4wIC0+IC0wCittbmd4MDM4IG1pbm1hZyAgIDAuMCAgIDAgICAtPiAgMC4wCittbmd4MDM5IG1pbm1hZyAgIDAuMCAgLTAgICAtPiAtMAorbW5neDA0MCBtaW5tYWcgICAwLjAgIC0wLjAgLT4gLTAuMAorbW5neDA0MSBtaW5tYWcgICAwLjAgICAwLjAgLT4gIDAuMAorbW5neDA0MiBtaW5tYWcgIC0wLjAgICAwICAgLT4gLTAuMAorbW5neDA0MyBtaW5tYWcgIC0wLjAgIC0wICAgLT4gLTAKK21uZ3gwNDQgbWlubWFnICAtMC4wICAtMC4wIC0+IC0wLjAKK21uZ3gwNDUgbWlubWFnICAtMC4wICAgMC4wIC0+IC0wLjAKKworbW5neDA0NiBtaW5tYWcgICAwRTEgIC0wRTEgLT4gLTBFKzEKK21uZ3gwNDcgbWlubWFnICAtMEUxICAgMEUyIC0+IC0wRSsxCittbmd4MDQ4IG1pbm1hZyAgIDBFMiAgIDBFMSAtPiAgMEUrMQorbW5neDA0OSBtaW5tYWcgICAwRTEgICAwRTIgLT4gIDBFKzEKK21uZ3gwNTAgbWlubWFnICAtMEUzICAtMEUyIC0+IC0wRSszCittbmd4MDUxIG1pbm1hZyAgLTBFMiAgLTBFMyAtPiAtMEUrMworCistLSBTcGVjaWFscworcHJlY2lzaW9uOiA5Cittbmd4MDkwIG1pbm1hZyAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5Cittbmd4MDkxIG1pbm1hZyAgSW5mICAtMTAwMCAgLT4gLTEwMDAKK21uZ3gwOTIgbWlubWFnICBJbmYgIC0xICAgICAtPiAtMQorbW5neDA5MyBtaW5tYWcgIEluZiAgLTAgICAgIC0+IC0wCittbmd4MDk0IG1pbm1hZyAgSW5mICAgMCAgICAgLT4gIDAKK21uZ3gwOTUgbWlubWFnICBJbmYgICAxICAgICAtPiAgMQorbW5neDA5NiBtaW5tYWcgIEluZiAgIDEwMDAgIC0+ICAxMDAwCittbmd4MDk3IG1pbm1hZyAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5Cittbmd4MDk4IG1pbm1hZyAtMTAwMCAgSW5mICAgLT4gLTEwMDAKK21uZ3gwOTkgbWlubWFnIC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK21uZ3gxMDAgbWlubWFnIC0xICAgICBJbmYgICAtPiAtMQorbW5neDEwMSBtaW5tYWcgLTAgICAgIEluZiAgIC0+IC0wCittbmd4MTAyIG1pbm1hZyAgMCAgICAgSW5mICAgLT4gIDAKK21uZ3gxMDMgbWlubWFnICAxICAgICBJbmYgICAtPiAgMQorbW5neDEwNCBtaW5tYWcgIDEwMDAgIEluZiAgIC0+ICAxMDAwCittbmd4MTA1IG1pbm1hZyAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK21uZ3gxMjAgbWlubWFnIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK21uZ3gxMjEgbWlubWFnIC1JbmYgIC0xMDAwICAtPiAtMTAwMAorbW5neDEyMiBtaW5tYWcgLUluZiAgLTEgICAgIC0+IC0xCittbmd4MTIzIG1pbm1hZyAtSW5mICAtMCAgICAgLT4gLTAKK21uZ3gxMjQgbWlubWFnIC1JbmYgICAwICAgICAtPiAgMAorbW5neDEyNSBtaW5tYWcgLUluZiAgIDEgICAgIC0+ICAxCittbmd4MTI2IG1pbm1hZyAtSW5mICAgMTAwMCAgLT4gIDEwMDAKK21uZ3gxMjcgbWlubWFnIC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK21uZ3gxMjggbWlubWFnIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK21uZ3gxMjkgbWlubWFnIC0xMDAwIC1JbmYgICAtPiAtMTAwMAorbW5neDEzMCBtaW5tYWcgLTEgICAgLUluZiAgIC0+IC0xCittbmd4MTMxIG1pbm1hZyAtMCAgICAtSW5mICAgLT4gLTAKK21uZ3gxMzIgbWlubWFnICAwICAgIC1JbmYgICAtPiAgMAorbW5neDEzMyBtaW5tYWcgIDEgICAgLUluZiAgIC0+ICAxCittbmd4MTM0IG1pbm1hZyAgMTAwMCAtSW5mICAgLT4gIDEwMDAKK21uZ3gxMzUgbWlubWFnICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKKworLS0gMjAwNC4wOC4wMiA3NTRyIGNob29zZXMgbnVtYmVyIG92ZXIgTmFOIGluIG1peGVkIGNhc2VzCittbmd4MTQxIG1pbm1hZyAgTmFOIC1JbmYgICAgLT4gIC1JbmZpbml0eQorbW5neDE0MiBtaW5tYWcgIE5hTiAtMTAwMCAgIC0+ICAtMTAwMAorbW5neDE0MyBtaW5tYWcgIE5hTiAtMSAgICAgIC0+ICAtMQorbW5neDE0NCBtaW5tYWcgIE5hTiAtMCAgICAgIC0+ICAtMAorbW5neDE0NSBtaW5tYWcgIE5hTiAgMCAgICAgIC0+ICAwCittbmd4MTQ2IG1pbm1hZyAgTmFOICAxICAgICAgLT4gIDEKK21uZ3gxNDcgbWlubWFnICBOYU4gIDEwMDAgICAtPiAgMTAwMAorbW5neDE0OCBtaW5tYWcgIE5hTiAgSW5mICAgIC0+ICBJbmZpbml0eQorbW5neDE0OSBtaW5tYWcgIE5hTiAgTmFOICAgIC0+ICBOYU4KK21uZ3gxNTAgbWlubWFnIC1JbmYgIE5hTiAgICAtPiAtSW5maW5pdHkKK21uZ3gxNTEgbWlubWFnIC0xMDAwIE5hTiAgICAtPiAtMTAwMAorbW5neDE1MiBtaW5tYWcgLTEgICAtTmFOICAgIC0+IC0xCittbmd4MTUzIG1pbm1hZyAtMCAgICBOYU4gICAgLT4gLTAKK21uZ3gxNTQgbWlubWFnICAwICAgLU5hTiAgICAtPiAgMAorbW5neDE1NSBtaW5tYWcgIDEgICAgTmFOICAgIC0+ICAxCittbmd4MTU2IG1pbm1hZyAgMTAwMCBOYU4gICAgLT4gIDEwMDAKK21uZ3gxNTcgbWlubWFnICBJbmYgIE5hTiAgICAtPiAgSW5maW5pdHkKKworbW5neDE2MSBtaW5tYWcgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTYyIG1pbm1hZyAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21uZ3gxNjMgbWlubWFnICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE2NCBtaW5tYWcgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTY1IG1pbm1hZyAtc05hTiAgMCAgICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21uZ3gxNjYgbWlubWFnIC1zTmFOICAxICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE2NyBtaW5tYWcgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTY4IG1pbm1hZyAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21uZ3gxNjkgbWlubWFnICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE3MCBtaW5tYWcgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTcxIG1pbm1hZyAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21uZ3gxNzIgbWlubWFnIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE3MyBtaW5tYWcgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTc0IG1pbm1hZyAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21uZ3gxNzUgbWlubWFnICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE3NiBtaW5tYWcgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTc3IG1pbm1hZyAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21uZ3gxNzggbWlubWFnICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE3OSBtaW5tYWcgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK21uZ3gxODEgbWlubWFnICBOYU45ICAgLUluZiAgIC0+IC1JbmZpbml0eQorbW5neDE4MiBtaW5tYWcgLU5hTjggICAgOTk5MCAgLT4gIDk5OTAKK21uZ3gxODMgbWlubWFnICBOYU43MSAgIEluZiAgIC0+ICBJbmZpbml0eQorCittbmd4MTg0IG1pbm1hZyAgTmFOMSAgICBOYU41NCAtPiAgTmFOMQorbW5neDE4NSBtaW5tYWcgIE5hTjIyICAtTmFONTMgLT4gIE5hTjIyCittbmd4MTg2IG1pbm1hZyAtTmFOMyAgICBOYU42ICAtPiAtTmFOMworbW5neDE4NyBtaW5tYWcgLU5hTjQ0ICAgTmFONyAgLT4gLU5hTjQ0CisKK21uZ3gxODggbWlubWFnIC1JbmYgICAgIE5hTjQxIC0+IC1JbmZpbml0eQorbW5neDE4OSBtaW5tYWcgLTk5OTkgICAtTmFOMzMgLT4gLTk5OTkKK21uZ3gxOTAgbWlubWFnICBJbmYgICAgIE5hTjIgIC0+ICBJbmZpbml0eQorCittbmd4MTkxIG1pbm1hZyAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCittbmd4MTkyIG1pbm1hZyAgc05hTjk4IC0xMSAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCittbmd4MTkzIG1pbm1hZyAtc05hTjk3ICBOYU44ICAgLT4gLU5hTjk3IEludmFsaWRfb3BlcmF0aW9uCittbmd4MTk0IG1pbm1hZyAgc05hTjY5IHNOYU45NCAgLT4gIE5hTjY5IEludmFsaWRfb3BlcmF0aW9uCittbmd4MTk1IG1pbm1hZyAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTk2IG1pbm1hZyAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTk3IG1pbm1hZyAgMDg4ICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTk4IG1pbm1hZyAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTk5IG1pbm1hZyAgTmFOICAgIHNOYU44NiAgLT4gIE5hTjg2IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHJvdW5kaW5nIGNoZWNrcyAtLSBjaG9zZW4gaXMgcm91bmRlZCwgb3Igbm90CittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5Cittbmd4MjAxIG1pbm1hZyAtMTIzNDU2NzgwMDAgMSAgLT4gMQorbW5neDIwMiBtaW5tYWcgMSAtMTIzNDU2NzgwMDAgIC0+IDEKK21uZ3gyMDMgbWlubWFnIC0xMjM0NTY3ODAwICAxICAtPiAxCittbmd4MjA0IG1pbm1hZyAxIC0xMjM0NTY3ODAwICAgLT4gMQorbW5neDIwNSBtaW5tYWcgLTEyMzQ1Njc4OTAgIDEgIC0+IDEKK21uZ3gyMDYgbWlubWFnIDEgLTEyMzQ1Njc4OTAgICAtPiAxCittbmd4MjA3IG1pbm1hZyAtMTIzNDU2Nzg5MSAgMSAgLT4gMQorbW5neDIwOCBtaW5tYWcgMSAtMTIzNDU2Nzg5MSAgIC0+IDEKK21uZ3gyMDkgbWlubWFnIC0xMjM0NTY3ODkwMSAxICAtPiAxCittbmd4MjEwIG1pbm1hZyAxIC0xMjM0NTY3ODkwMSAgLT4gMQorbW5neDIxMSBtaW5tYWcgLTEyMzQ1Njc4OTYgIDEgIC0+IDEKK21uZ3gyMTIgbWlubWFnIDEgLTEyMzQ1Njc4OTYgICAtPiAxCittbmd4MjEzIG1pbm1hZyAxMjM0NTY3ODkxICAxICAgLT4gMQorbW5neDIxNCBtaW5tYWcgMSAxMjM0NTY3ODkxICAgIC0+IDEKK21uZ3gyMTUgbWlubWFnIDEyMzQ1Njc4OTAxIDEgICAtPiAxCittbmd4MjE2IG1pbm1hZyAxIDEyMzQ1Njc4OTAxICAgLT4gMQorbW5neDIxNyBtaW5tYWcgMTIzNDU2Nzg5NiAgMSAgIC0+IDEKK21uZ3gyMTggbWlubWFnIDEgMTIzNDU2Nzg5NiAgICAtPiAxCisKK3ByZWNpc2lvbjogMTUKK21uZ3gyMjEgbWlubWFnIC0xMjM0NTY3ODAwMCAxICAtPiAxCittbmd4MjIyIG1pbm1hZyAxIC0xMjM0NTY3ODAwMCAgLT4gMQorbW5neDIyMyBtaW5tYWcgLTEyMzQ1Njc4MDAgIDEgIC0+IDEKK21uZ3gyMjQgbWlubWFnIDEgLTEyMzQ1Njc4MDAgICAtPiAxCittbmd4MjI1IG1pbm1hZyAtMTIzNDU2Nzg5MCAgMSAgLT4gMQorbW5neDIyNiBtaW5tYWcgMSAtMTIzNDU2Nzg5MCAgIC0+IDEKK21uZ3gyMjcgbWlubWFnIC0xMjM0NTY3ODkxICAxICAtPiAxCittbmd4MjI4IG1pbm1hZyAxIC0xMjM0NTY3ODkxICAgLT4gMQorbW5neDIyOSBtaW5tYWcgLTEyMzQ1Njc4OTAxIDEgIC0+IDEKK21uZ3gyMzAgbWlubWFnIDEgLTEyMzQ1Njc4OTAxICAtPiAxCittbmd4MjMxIG1pbm1hZyAtMTIzNDU2Nzg5NiAgMSAgLT4gMQorbW5neDIzMiBtaW5tYWcgMSAtMTIzNDU2Nzg5NiAgIC0+IDEKK21uZ3gyMzMgbWlubWFnIDEyMzQ1Njc4OTEgIDEgICAtPiAxCittbmd4MjM0IG1pbm1hZyAxIDEyMzQ1Njc4OTEgICAgLT4gMQorbW5neDIzNSBtaW5tYWcgMTIzNDU2Nzg5MDEgMSAgIC0+IDEKK21uZ3gyMzYgbWlubWFnIDEgMTIzNDU2Nzg5MDEgICAtPiAxCittbmd4MjM3IG1pbm1hZyAxMjM0NTY3ODk2ICAxICAgLT4gMQorbW5neDIzOCBtaW5tYWcgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworLS0gZnJvbSBleGFtcGxlcworbW5neDI4MCBtaW5tYWcgJzMnICAgJzInICAtPiAgJzInCittbmd4MjgxIG1pbm1hZyAnLTEwJyAnMycgIC0+ICAnMycKK21uZ3gyODIgbWlubWFnICcxLjAnICcxJyAgLT4gICcxLjAnCittbmd4MjgzIG1pbm1hZyAnMScgJzEuMCcgIC0+ICAnMS4wJworbW5neDI4NCBtaW5tYWcgJzcnICdOYU4nICAtPiAgJzcnCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgLi4gc3Vibm9ybWFsIHJlc3VsdHMgW2lucHV0c10gbm93IGFsbG93ZWQKK21heEV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5Cittbmd4MzMwIG1pbm1hZyAtMS4yMzQ1Njc4OTAxMjM0NUUtMCAtOUUrOTk5OTk5OTk5IC0+IC0xLjIzNDU2Nzg5MDEyMzQ1Cittbmd4MzMxIG1pbm1hZyAtOUUrOTk5OTk5OTk5IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+IC0xLjIzNDU2Nzg5MDEyMzQ1Cittbmd4MzMyIG1pbm1hZyAtMC4xMDAgLTlFLTk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+IC05RS05OTk5OTk5OTkKK21uZ3gzMzMgbWlubWFnIC05RS05OTk5OTk5OTkgLTAuMTAwICAgICAgICAgICAgICAgLT4gLTlFLTk5OTk5OTk5OQorbW5neDMzNSBtaW5tYWcgKzEuMjM0NTY3ODkwMTIzNDVFLTAgLTlFKzk5OTk5OTk5OSAtPiAgMS4yMzQ1Njc4OTAxMjM0NQorbW5neDMzNiBtaW5tYWcgLTlFKzk5OTk5OTk5OSAxLjIzNDU2Nzg5MDEyMzQ1RS0wICAtPiAgMS4yMzQ1Njc4OTAxMjM0NQorbW5neDMzNyBtaW5tYWcgKzAuMTAwIC05RS05OTk5OTk5OTkgICAgICAgICAgICAgICAtPiAtOUUtOTk5OTk5OTk5Cittbmd4MzM4IG1pbm1hZyAtOUUtOTk5OTk5OTk5IDAuMTAwICAgICAgICAgICAgICAgIC0+IC05RS05OTk5OTk5OTkKKworbW5neDMzOSBtaW5tYWcgLTFlLTU5OTk5OTk5OSAtMWUtNDAwMDAwMDAxICAgLT4gIC0xRS01OTk5OTk5OTkKK21uZ3gzNDAgbWlubWFnIC0xZS01OTk5OTk5OTkgLTFlLTQwMDAwMDAwMCAgIC0+ICAtMUUtNTk5OTk5OTk5Cittbmd4MzQxIG1pbm1hZyAtMWUtNjAwMDAwMDAwIC0xZS00MDAwMDAwMDAgICAtPiAgLTFFLTYwMDAwMDAwMAorbW5neDM0MiBtaW5tYWcgLTllLTk5OTk5OTk5OCAtMC4wMSAgICAgICAgICAgLT4gIC05RS05OTk5OTk5OTgKK21uZ3gzNDMgbWlubWFnIC05ZS05OTk5OTk5OTggLTAuMSAgICAgICAgICAgIC0+ICAtOUUtOTk5OTk5OTk4Cittbmd4MzQ0IG1pbm1hZyAtMC4wMSAgICAgICAgIC05ZS05OTk5OTk5OTggICAtPiAgLTlFLTk5OTk5OTk5OAorbW5neDM0NSBtaW5tYWcgLTFlNTk5OTk5OTk5ICAtMWU0MDAwMDAwMDEgICAgLT4gIC0xRSs0MDAwMDAwMDEKK21uZ3gzNDYgbWlubWFnIC0xZTU5OTk5OTk5OSAgLTFlNDAwMDAwMDAwICAgIC0+ICAtMUUrNDAwMDAwMDAwCittbmd4MzQ3IG1pbm1hZyAtMWU2MDAwMDAwMDAgIC0xZTQwMDAwMDAwMCAgICAtPiAgLTFFKzQwMDAwMDAwMAorbW5neDM0OCBtaW5tYWcgLTllOTk5OTk5OTk4ICAtMTAwICAgICAgICAgICAgLT4gIC0xMDAKK21uZ3gzNDkgbWlubWFnIC05ZTk5OTk5OTk5OCAgLTEwICAgICAgICAgICAgIC0+ICAtMTAKK21uZ3gzNTAgbWlubWFnIC0xMDAgICAgICAgICAgLTllOTk5OTk5OTk4ICAgIC0+ICAtMTAwCistLSBzaWducworbW5neDM1MSBtaW5tYWcgLTFlKzc3Nzc3Nzc3NyAtMWUrNDExMTExMTExIC0+IC0xRSs0MTExMTExMTEKK21uZ3gzNTIgbWlubWFnIC0xZSs3Nzc3Nzc3NzcgKzFlKzQxMTExMTExMSAtPiAgMUUrNDExMTExMTExCittbmd4MzUzIG1pbm1hZyArMWUrNzc3Nzc3Nzc3IC0xZSs0MTExMTExMTEgLT4gLTFFKzQxMTExMTExMQorbW5neDM1NCBtaW5tYWcgKzFlKzc3Nzc3Nzc3NyArMWUrNDExMTExMTExIC0+ICAxRSs0MTExMTExMTEKK21uZ3gzNTUgbWlubWFnIC0xZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAtPiAtMUUtNzc3Nzc3Nzc3Cittbmd4MzU2IG1pbm1hZyAtMWUtNzc3Nzc3Nzc3ICsxZS00MTExMTExMTEgLT4gLTFFLTc3Nzc3Nzc3NworbW5neDM1NyBtaW5tYWcgKzFlLTc3Nzc3Nzc3NyAtMWUtNDExMTExMTExIC0+ICAxRS03Nzc3Nzc3NzcKK21uZ3gzNTggbWlubWFnICsxZS03Nzc3Nzc3NzcgKzFlLTQxMTExMTExMSAtPiAgMUUtNzc3Nzc3Nzc3CisKKy0tIGV4cGFuZGVkIGxpc3QgZnJvbSBtaW4vbWF4IDc1NHIgcHVycGxlIHByb3NlCistLSBbZXhwbGljaXQgdGVzdHMgZm9yIGV4cG9uZW50IG9yZGVyaW5nXQorbW5neDQwMSBtaW5tYWcgIEluZiAgICAxLjEgICAgIC0+ICAxLjEKK21uZ3g0MDIgbWlubWFnICAxLjEgICAgMSAgICAgICAtPiAgMQorbW5neDQwMyBtaW5tYWcgIDEgICAgICAxLjAgICAgIC0+ICAxLjAKK21uZ3g0MDQgbWlubWFnICAxLjAgICAgMC4xICAgICAtPiAgMC4xCittbmd4NDA1IG1pbm1hZyAgMC4xICAgIDAuMTAgICAgLT4gIDAuMTAKK21uZ3g0MDYgbWlubWFnICAwLjEwICAgMC4xMDAgICAtPiAgMC4xMDAKK21uZ3g0MDcgbWlubWFnICAwLjEwICAgMCAgICAgICAtPiAgMAorbW5neDQwOCBtaW5tYWcgIDAgICAgICAwLjAgICAgIC0+ICAwLjAKK21uZ3g0MDkgbWlubWFnICAwLjAgICAtMCAgICAgICAtPiAtMAorbW5neDQxMCBtaW5tYWcgIDAuMCAgIC0wLjAgICAgIC0+IC0wLjAKK21uZ3g0MTEgbWlubWFnICAwLjAwICAtMC4wICAgICAtPiAtMC4wCittbmd4NDEyIG1pbm1hZyAgMC4wICAgLTAuMDAgICAgLT4gLTAuMDAKK21uZ3g0MTMgbWlubWFnICAwICAgICAtMC4wICAgICAtPiAtMC4wCittbmd4NDE0IG1pbm1hZyAgMCAgICAgLTAgICAgICAgLT4gLTAKK21uZ3g0MTUgbWlubWFnIC0wLjAgICAtMCAgICAgICAtPiAtMAorbW5neDQxNiBtaW5tYWcgLTAgICAgIC0wLjEwMCAgIC0+IC0wCittbmd4NDE3IG1pbm1hZyAtMC4xMDAgLTAuMTAgICAgLT4gLTAuMTAKK21uZ3g0MTggbWlubWFnIC0wLjEwICAtMC4xICAgICAtPiAtMC4xCittbmd4NDE5IG1pbm1hZyAtMC4xICAgLTEuMCAgICAgLT4gLTAuMQorbW5neDQyMCBtaW5tYWcgLTEuMCAgIC0xICAgICAgIC0+IC0xCittbmd4NDIxIG1pbm1hZyAtMSAgICAgLTEuMSAgICAgLT4gLTEKK21uZ3g0MjMgbWlubWFnIC0xLjEgICAtSW5mICAgICAtPiAtMS4xCistLSBzYW1lIHdpdGggb3BlcmFuZHMgcmV2ZXJzZWQKK21uZ3g0MzEgbWlubWFnICAxLjEgICAgSW5mICAgICAtPiAgMS4xCittbmd4NDMyIG1pbm1hZyAgMSAgICAgIDEuMSAgICAgLT4gIDEKK21uZ3g0MzMgbWlubWFnICAxLjAgICAgMSAgICAgICAtPiAgMS4wCittbmd4NDM0IG1pbm1hZyAgMC4xICAgIDEuMCAgICAgLT4gIDAuMQorbW5neDQzNSBtaW5tYWcgIDAuMTAgICAwLjEgICAgIC0+ICAwLjEwCittbmd4NDM2IG1pbm1hZyAgMC4xMDAgIDAuMTAgICAgLT4gIDAuMTAwCittbmd4NDM3IG1pbm1hZyAgMCAgICAgIDAuMTAgICAgLT4gIDAKK21uZ3g0MzggbWlubWFnICAwLjAgICAgMCAgICAgICAtPiAgMC4wCittbmd4NDM5IG1pbm1hZyAtMCAgICAgIDAuMCAgICAgLT4gLTAKK21uZ3g0NDAgbWlubWFnIC0wLjAgICAgMC4wICAgICAtPiAtMC4wCittbmd4NDQxIG1pbm1hZyAtMC4wICAgIDAuMDAgICAgLT4gLTAuMAorbW5neDQ0MiBtaW5tYWcgLTAuMDAgICAwLjAgICAgIC0+IC0wLjAwCittbmd4NDQzIG1pbm1hZyAtMC4wICAgIDAgICAgICAgLT4gLTAuMAorbW5neDQ0NCBtaW5tYWcgLTAgICAgICAwICAgICAgIC0+IC0wCittbmd4NDQ1IG1pbm1hZyAtMCAgICAgLTAuMCAgICAgLT4gLTAKK21uZ3g0NDYgbWlubWFnIC0wLjEwMCAtMCAgICAgICAtPiAtMAorbW5neDQ0NyBtaW5tYWcgLTAuMTAgIC0wLjEwMCAgIC0+IC0wLjEwCittbmd4NDQ4IG1pbm1hZyAtMC4xICAgLTAuMTAgICAgLT4gLTAuMQorbW5neDQ0OSBtaW5tYWcgLTEuMCAgIC0wLjEgICAgIC0+IC0wLjEKK21uZ3g0NTAgbWlubWFnIC0xICAgICAtMS4wICAgICAtPiAtMQorbW5neDQ1MSBtaW5tYWcgLTEuMSAgIC0xICAgICAgIC0+IC0xCittbmd4NDUzIG1pbm1hZyAtSW5mICAgLTEuMSAgICAgLT4gLTEuMQorLS0gbGFyZ2llcworbW5neDQ2MCBtaW5tYWcgIDEwMDAgICAxRSszICAgIC0+ICAxMDAwCittbmd4NDYxIG1pbm1hZyAgMUUrMyAgIDEwMDAgICAgLT4gIDEwMDAKK21uZ3g0NjIgbWlubWFnICAxMDAwICAtMUUrMyAgICAtPiAtMUUrMworbW5neDQ2MyBtaW5tYWcgIDFFKzMgIC0xMDAwICAgIC0+IC0xMDAwCittbmd4NDY0IG1pbm1hZyAtMTAwMCAgIDFFKzMgICAgLT4gLTEwMDAKK21uZ3g0NjUgbWlubWFnIC0xRSszICAgMTAwMCAgICAtPiAtMUUrMworbW5neDQ2NiBtaW5tYWcgLTEwMDAgIC0xRSszICAgIC0+IC0xRSszCittbmd4NDY3IG1pbm1hZyAtMUUrMyAgLTEwMDAgICAgLT4gLTFFKzMKKworLS0gcm91bmRpbmcgKHJlc3VsdHMgdHJlYXRlZCBhcyB0aG91Z2ggcGx1cykKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitwcmVjaXNpb246IDMKKworbW5neDQ3MCBtaW5tYWcgIDEgICAgICA1ICAgICAgLT4gIDEKK21uZ3g0NzEgbWlubWFnICAxMCAgICAgNTAgICAgIC0+ICAxMAorbW5neDQ3MiBtaW5tYWcgIDEwMCAgICA1MDAgICAgLT4gIDEwMAorbW5neDQ3MyBtaW5tYWcgIDEwMDAgICA1MDAwICAgLT4gIDEuMDBFKzMgUm91bmRlZAorbW5neDQ3NCBtaW5tYWcgIDEwMDAwICA1MDAwMCAgLT4gIDEuMDBFKzQgUm91bmRlZAorbW5neDQ3NSBtaW5tYWcgIDYgICAgICA1MCAgICAgLT4gIDYKK21uZ3g0NzYgbWlubWFnICA2NiAgICAgNTAwICAgIC0+ICA2NgorbW5neDQ3NyBtaW5tYWcgIDY2NiAgICA1MDAwICAgLT4gIDY2NgorbW5neDQ3OCBtaW5tYWcgIDY2NjYgICA1MDAwMCAgLT4gIDYuNjdFKzMgUm91bmRlZCBJbmV4YWN0Cittbmd4NDc5IG1pbm1hZyAgNjY2NjYgIDUwMDAwMCAtPiAgNi42N0UrNCBSb3VuZGVkIEluZXhhY3QKK21uZ3g0ODAgbWlubWFnICAzMzMzMyAgNTAwMDAwIC0+ICAzLjMzRSs0IFJvdW5kZWQgSW5leGFjdAorbW5neDQ4MSBtaW5tYWcgIDc1NDAxICAxICAgICAgLT4gIDEKK21uZ3g0ODIgbWlubWFnICA3NTQwMiAgMTAgICAgIC0+ICAxMAorbW5neDQ4MyBtaW5tYWcgIDc1NDAzICAxMDAgICAgLT4gIDEwMAorbW5neDQ4NCBtaW5tYWcgIDc1NDA0ICAxMDAwICAgLT4gIDEuMDBFKzMgUm91bmRlZAorbW5neDQ4NSBtaW5tYWcgIDc1NDA1ICAxMDAwMCAgLT4gIDEuMDBFKzQgUm91bmRlZAorbW5neDQ4NiBtaW5tYWcgIDc1NDA2ICA2ICAgICAgLT4gIDYKK21uZ3g0ODcgbWlubWFnICA3NTQwNyAgNjYgICAgIC0+ICA2NgorbW5neDQ4OCBtaW5tYWcgIDc1NDA4ICA2NjYgICAgLT4gIDY2NgorbW5neDQ4OSBtaW5tYWcgIDc1NDA5ICA2NjY2ICAgLT4gIDYuNjdFKzMgUm91bmRlZCBJbmV4YWN0Cittbmd4NDkwIG1pbm1hZyAgNzU0MTAgIDY2NjY2ICAtPiAgNi42N0UrNCBSb3VuZGVkIEluZXhhY3QKK21uZ3g0OTEgbWlubWFnICA3NTQxMSAgMzMzMzMgIC0+ICAzLjMzRSs0IFJvdW5kZWQgSW5leGFjdAorCisKKy0tIG92ZXJmbG93IHRlc3RzCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcHJlY2lzaW9uOiAzCittbmd4NTAwIG1pbm1hZyA5Ljk5OUUrOTk5OTk5OTk5ICAwIC0+ICAwCittbmd4NTAxIG1pbm1hZyAtOS45OTlFKzk5OTk5OTk5OSAwIC0+ICAwCisKKy0tIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvdworcHJlY2lzaW9uOiAzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorbW5neDUxMCBtaW5tYWcgIDEuMDBFLTk5OSAgICAgICAwICAtPiAgIDAKK21uZ3g1MTEgbWlubWFnICAwLjFFLTk5OSAgICAgICAgMCAgLT4gICAwCittbmd4NTEyIG1pbm1hZyAgMC4xMEUtOTk5ICAgICAgIDAgIC0+ICAgMAorbW5neDUxMyBtaW5tYWcgIDAuMTAwRS05OTkgICAgICAwICAtPiAgIDAKK21uZ3g1MTQgbWlubWFnICAwLjAxRS05OTkgICAgICAgMCAgLT4gICAwCittbmd4NTE1IG1pbm1hZyAgMC45OTlFLTk5OSAgICAgIDAgIC0+ICAgMAorbW5neDUxNiBtaW5tYWcgIDAuMDk5RS05OTkgICAgICAwICAtPiAgIDAKK21uZ3g1MTcgbWlubWFnICAwLjAwOUUtOTk5ICAgICAgMCAgLT4gICAwCittbmd4NTE4IG1pbm1hZyAgMC4wMDFFLTk5OSAgICAgIDAgIC0+ICAgMAorbW5neDUxOSBtaW5tYWcgIDAuMDAwOUUtOTk5ICAgICAwICAtPiAgIDAKK21uZ3g1MjAgbWlubWFnICAwLjAwMDFFLTk5OSAgICAgMCAgLT4gICAwCisKK21uZ3g1MzAgbWlubWFnIC0xLjAwRS05OTkgICAgICAgMCAgLT4gICAwCittbmd4NTMxIG1pbm1hZyAtMC4xRS05OTkgICAgICAgIDAgIC0+ICAgMAorbW5neDUzMiBtaW5tYWcgLTAuMTBFLTk5OSAgICAgICAwICAtPiAgIDAKK21uZ3g1MzMgbWlubWFnIC0wLjEwMEUtOTk5ICAgICAgMCAgLT4gICAwCittbmd4NTM0IG1pbm1hZyAtMC4wMUUtOTk5ICAgICAgIDAgIC0+ICAgMAorbW5neDUzNSBtaW5tYWcgLTAuOTk5RS05OTkgICAgICAwICAtPiAgIDAKK21uZ3g1MzYgbWlubWFnIC0wLjA5OUUtOTk5ICAgICAgMCAgLT4gICAwCittbmd4NTM3IG1pbm1hZyAtMC4wMDlFLTk5OSAgICAgIDAgIC0+ICAgMAorbW5neDUzOCBtaW5tYWcgLTAuMDAxRS05OTkgICAgICAwICAtPiAgIDAKK21uZ3g1MzkgbWlubWFnIC0wLjAwMDlFLTk5OSAgICAgMCAgLT4gICAwCittbmd4NTQwIG1pbm1hZyAtMC4wMDAxRS05OTkgICAgIDAgIC0+ICAgMAorCisKKy0tIE51bGwgdGVzdHMKK21uZzkwMCBtaW5tYWcgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCittbmc5MDEgbWlubWFnICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9taW51cy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9taW51cy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NzQ5YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL21pbnVzLmRlY1Rlc3QKQEAgLTAsMCArMSwxODIgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gbWludXMuZGVjVGVzdCAtLSBkZWNpbWFsIG5lZ2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyBwcmltYXJpbHkgdGVzdHMgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgb3BlcmF0b3IuCistLSBTdWJ0cmFjdGlvbiwgcm91bmRpbmcsIGFuZCBtb3JlIG92ZXJmbG93cyBhcmUgdGVzdGVkIGVsc2V3aGVyZS4KKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworbWlueDAwMSBtaW51cyAnMScgICAgICAtPiAnLTEnCittaW54MDAyIG1pbnVzICctMScgICAgIC0+ICcxJworbWlueDAwMyBtaW51cyAnMS4wMCcgICAtPiAnLTEuMDAnCittaW54MDA0IG1pbnVzICctMS4wMCcgIC0+ICcxLjAwJworbWlueDAwNSBtaW51cyAnMCcgICAgICAtPiAnMCcKK21pbngwMDYgbWludXMgJzAuMDAnICAgLT4gJzAuMDAnCittaW54MDA3IG1pbnVzICcwMC4wJyAgIC0+ICcwLjAnCittaW54MDA4IG1pbnVzICcwMC4wMCcgIC0+ICcwLjAwJworbWlueDAwOSBtaW51cyAnMDAnICAgICAtPiAnMCcKKworbWlueDAxMCBtaW51cyAnLTInICAgICAtPiAnMicKK21pbngwMTEgbWludXMgJzInICAgICAgLT4gJy0yJworbWlueDAxMiBtaW51cyAnLTIuMDAnICAtPiAnMi4wMCcKK21pbngwMTMgbWludXMgJzIuMDAnICAgLT4gJy0yLjAwJworbWlueDAxNCBtaW51cyAnLTAnICAgICAtPiAnMCcKK21pbngwMTUgbWludXMgJy0wLjAwJyAgLT4gJzAuMDAnCittaW54MDE2IG1pbnVzICctMDAuMCcgIC0+ICcwLjAnCittaW54MDE3IG1pbnVzICctMDAuMDAnIC0+ICcwLjAwJworbWlueDAxOCBtaW51cyAnLTAwJyAgICAtPiAnMCcKKworLS0gImxocyIgemVyb3MgaW4gcGx1cyBhbmQgbWludXMgaGF2ZSBleHBvbmVudCA9IG9wZXJhbmQKK21pbngwMjAgbWludXMgJy0wRTMnICAgLT4gJzBFKzMnCittaW54MDIxIG1pbnVzICctMEUyJyAgIC0+ICcwRSsyJworbWlueDAyMiBtaW51cyAnLTBFMScgICAtPiAnMEUrMScKK21pbngwMjMgbWludXMgJy0wRTAnICAgLT4gJzAnCittaW54MDI0IG1pbnVzICcrMEUwJyAgIC0+ICcwJworbWlueDAyNSBtaW51cyAnKzBFMScgICAtPiAnMEUrMScKK21pbngwMjYgbWludXMgJyswRTInICAgLT4gJzBFKzInCittaW54MDI3IG1pbnVzICcrMEUzJyAgIC0+ICcwRSszJworCittaW54MDMwIG1pbnVzICctNUUzJyAgIC0+ICc1RSszJworbWlueDAzMSBtaW51cyAnLTVFOCcgICAtPiAnNUUrOCcKK21pbngwMzIgbWludXMgJy01RTEzJyAgLT4gJzVFKzEzJworbWlueDAzMyBtaW51cyAnLTVFMTgnICAtPiAnNUUrMTgnCittaW54MDM0IG1pbnVzICcrNUUzJyAgIC0+ICctNUUrMycKK21pbngwMzUgbWludXMgJys1RTgnICAgLT4gJy01RSs4JworbWlueDAzNiBtaW51cyAnKzVFMTMnICAtPiAnLTVFKzEzJworbWlueDAzNyBtaW51cyAnKzVFMTgnICAtPiAnLTVFKzE4JworCittaW54MDUwIG1pbnVzICctMjAwMDAwMCcgLT4gJzIwMDAwMDAnCittaW54MDUxIG1pbnVzICcyMDAwMDAwJyAgLT4gJy0yMDAwMDAwJworcHJlY2lzaW9uOiA3CittaW54MDUyIG1pbnVzICctMjAwMDAwMCcgLT4gJzIwMDAwMDAnCittaW54MDUzIG1pbnVzICcyMDAwMDAwJyAgLT4gJy0yMDAwMDAwJworcHJlY2lzaW9uOiA2CittaW54MDU0IG1pbnVzICctMjAwMDAwMCcgLT4gJzIuMDAwMDBFKzYnIFJvdW5kZWQKK21pbngwNTUgbWludXMgJzIwMDAwMDAnICAtPiAnLTIuMDAwMDBFKzYnIFJvdW5kZWQKK3ByZWNpc2lvbjogMworbWlueDA1NiBtaW51cyAnLTIwMDAwMDAnIC0+ICcyLjAwRSs2JyBSb3VuZGVkCittaW54MDU3IG1pbnVzICcyMDAwMDAwJyAgLT4gJy0yLjAwRSs2JyBSb3VuZGVkCisKKy0tIG1vcmUgZml4ZWQsIHBvdGVudGlhbCBMSFMgc3dhcHMvb3ZlcmxheXMgaWYgZG9uZSBieSAwIHN1YnRyYWN0IHgKK3ByZWNpc2lvbjogOQorbWlueDA2MCBtaW51cyAnNTYyNjdFLTEwJyAgIC0+ICctMC4wMDAwMDU2MjY3JworbWlueDA2MSBtaW51cyAnNTYyNjdFLTUnICAgIC0+ICctMC41NjI2NycKK21pbngwNjIgbWludXMgJzU2MjY3RS0yJyAgICAtPiAnLTU2Mi42NycKK21pbngwNjMgbWludXMgJzU2MjY3RS0xJyAgICAtPiAnLTU2MjYuNycKK21pbngwNjUgbWludXMgJzU2MjY3RS0wJyAgICAtPiAnLTU2MjY3JworbWlueDA2NiBtaW51cyAnNTYyNjdFKzAnICAgIC0+ICctNTYyNjcnCittaW54MDY3IG1pbnVzICc1NjI2N0UrMScgICAgLT4gJy01LjYyNjdFKzUnCittaW54MDY4IG1pbnVzICc1NjI2N0UrMicgICAgLT4gJy01LjYyNjdFKzYnCittaW54MDY5IG1pbnVzICc1NjI2N0UrMycgICAgLT4gJy01LjYyNjdFKzcnCittaW54MDcwIG1pbnVzICc1NjI2N0UrNCcgICAgLT4gJy01LjYyNjdFKzgnCittaW54MDcxIG1pbnVzICc1NjI2N0UrNScgICAgLT4gJy01LjYyNjdFKzknCittaW54MDcyIG1pbnVzICc1NjI2N0UrNicgICAgLT4gJy01LjYyNjdFKzEwJworbWlueDA4MCBtaW51cyAnLTU2MjY3RS0xMCcgIC0+ICcwLjAwMDAwNTYyNjcnCittaW54MDgxIG1pbnVzICctNTYyNjdFLTUnICAgLT4gJzAuNTYyNjcnCittaW54MDgyIG1pbnVzICctNTYyNjdFLTInICAgLT4gJzU2Mi42NycKK21pbngwODMgbWludXMgJy01NjI2N0UtMScgICAtPiAnNTYyNi43JworbWlueDA4NSBtaW51cyAnLTU2MjY3RS0wJyAgIC0+ICc1NjI2NycKK21pbngwODYgbWludXMgJy01NjI2N0UrMCcgICAtPiAnNTYyNjcnCittaW54MDg3IG1pbnVzICctNTYyNjdFKzEnICAgLT4gJzUuNjI2N0UrNScKK21pbngwODggbWludXMgJy01NjI2N0UrMicgICAtPiAnNS42MjY3RSs2JworbWlueDA4OSBtaW51cyAnLTU2MjY3RSszJyAgIC0+ICc1LjYyNjdFKzcnCittaW54MDkwIG1pbnVzICctNTYyNjdFKzQnICAgLT4gJzUuNjI2N0UrOCcKK21pbngwOTEgbWludXMgJy01NjI2N0UrNScgICAtPiAnNS42MjY3RSs5JworbWlueDA5MiBtaW51cyAnLTU2MjY3RSs2JyAgIC0+ICc1LjYyNjdFKzEwJworCisKKy0tIG92ZXJmbG93IHRlc3RzCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcHJlY2lzaW9uOiAzCittaW54MTAwIG1pbnVzIDkuOTk5RSs5OTk5OTk5OTkgIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK21pbngxMDEgbWludXMgLTkuOTk5RSs5OTk5OTk5OTkgLT4gIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3cKK3ByZWNpc2lvbjogMworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK21pbngxMTAgbWludXMgIDEuMDBFLTk5OSAgICAgICAgLT4gIC0xLjAwRS05OTkKK21pbngxMTEgbWludXMgIDAuMUUtOTk5ICAgICAgICAgLT4gIC0xRS0xMDAwICAgU3Vibm9ybWFsCittaW54MTEyIG1pbnVzICAwLjEwRS05OTkgICAgICAgIC0+ICAtMS4wRS0xMDAwIFN1Ym5vcm1hbAorbWlueDExMyBtaW51cyAgMC4xMDBFLTk5OSAgICAgICAtPiAgLTEuMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorbWlueDExNCBtaW51cyAgMC4wMUUtOTk5ICAgICAgICAtPiAgLTFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCittaW54MTE1IG1pbnVzICAwLjk5OUUtOTk5ICAgICAgIC0+ICAtMS4wMEUtOTk5IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CittaW54MTE2IG1pbnVzICAwLjA5OUUtOTk5ICAgICAgIC0+ICAtMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CittaW54MTE3IG1pbnVzICAwLjAwOUUtOTk5ICAgICAgIC0+ICAtMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CittaW54MTE4IG1pbnVzICAwLjAwMUUtOTk5ICAgICAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK21pbngxMTkgbWludXMgIDAuMDAwOUUtOTk5ICAgICAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorbWlueDEyMCBtaW51cyAgMC4wMDAxRS05OTkgICAgICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCisKK21pbngxMzAgbWludXMgLTEuMDBFLTk5OSAgICAgICAgLT4gICAxLjAwRS05OTkKK21pbngxMzEgbWludXMgLTAuMUUtOTk5ICAgICAgICAgLT4gICAxRS0xMDAwICAgU3Vibm9ybWFsCittaW54MTMyIG1pbnVzIC0wLjEwRS05OTkgICAgICAgIC0+ICAgMS4wRS0xMDAwIFN1Ym5vcm1hbAorbWlueDEzMyBtaW51cyAtMC4xMDBFLTk5OSAgICAgICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorbWlueDEzNCBtaW51cyAtMC4wMUUtOTk5ICAgICAgICAtPiAgIDFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCittaW54MTM1IG1pbnVzIC0wLjk5OUUtOTk5ICAgICAgIC0+ICAgMS4wMEUtOTk5IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CittaW54MTM2IG1pbnVzIC0wLjA5OUUtOTk5ICAgICAgIC0+ICAgMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CittaW54MTM3IG1pbnVzIC0wLjAwOUUtOTk5ICAgICAgIC0+ICAgMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CittaW54MTM4IG1pbnVzIC0wLjAwMUUtOTk5ICAgICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK21pbngxMzkgbWludXMgLTAuMDAwOUUtOTk5ICAgICAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorbWlueDE0MCBtaW51cyAtMC4wMDAxRS05OTkgICAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCisKKworLS0gbG9uZyBvcGVyYW5kIGNoZWNrcworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogOQorbWlueDMwMSBtaW51cyAxMjM0NTY3ODAwMCAgLT4gLTEuMjM0NTY3ODBFKzEwIFJvdW5kZWQKK21pbngzMDIgbWludXMgMTIzNDU2NzgwMCAgIC0+IC0xLjIzNDU2NzgwRSs5IFJvdW5kZWQKK21pbngzMDMgbWludXMgMTIzNDU2Nzg5MCAgIC0+IC0xLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK21pbngzMDQgbWludXMgMTIzNDU2Nzg5MSAgIC0+IC0xLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorbWlueDMwNSBtaW51cyAxMjM0NTY3ODkwMSAgLT4gLTEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorbWlueDMwNiBtaW51cyAxMjM0NTY3ODk2ICAgLT4gLTEuMjM0NTY3OTBFKzkgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMTUKKy0tIHN0aWxsIGNoZWNraW5nCittaW54MzIxIG1pbnVzIDEyMzQ1Njc4MDAwICAtPiAtMTIzNDU2NzgwMDAKK21pbngzMjIgbWludXMgMTIzNDU2NzgwMCAgIC0+IC0xMjM0NTY3ODAwCittaW54MzIzIG1pbnVzIDEyMzQ1Njc4OTAgICAtPiAtMTIzNDU2Nzg5MAorbWlueDMyNCBtaW51cyAxMjM0NTY3ODkxICAgLT4gLTEyMzQ1Njc4OTEKK21pbngzMjUgbWludXMgMTIzNDU2Nzg5MDEgIC0+IC0xMjM0NTY3ODkwMQorbWlueDMyNiBtaW51cyAxMjM0NTY3ODk2ICAgLT4gLTEyMzQ1Njc4OTYKKworLS0gc3BlY2lhbHMKK21pbng0MjAgbWludXMgJ0luZicgICAgLT4gJy1JbmZpbml0eScKK21pbng0MjEgbWludXMgJy1JbmYnICAgLT4gJ0luZmluaXR5JworbWlueDQyMiBtaW51cyAgIE5hTiAgICAtPiAgTmFOCittaW54NDIzIG1pbnVzICBzTmFOICAgIC0+ICBOYU4gICAgSW52YWxpZF9vcGVyYXRpb24KK21pbng0MjQgbWludXMgICBOYU4yNTUgLT4gIE5hTjI1NQorbWlueDQyNSBtaW51cyAgc05hTjI1NiAtPiAgTmFOMjU2IEludmFsaWRfb3BlcmF0aW9uCittaW54NDI2IG1pbnVzICAtTmFOICAgIC0+IC1OYU4KK21pbng0MjcgbWludXMgLXNOYU4gICAgLT4gLU5hTiAgICBJbnZhbGlkX29wZXJhdGlvbgorbWlueDQyOCBtaW51cyAgLU5hTjI1NSAtPiAtTmFOMjU1CittaW54NDI5IG1pbnVzIC1zTmFOMjU2IC0+IC1OYU4yNTYgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0cworbWlueDkwMCBtaW51cyAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9tdWx0aXBseS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9tdWx0aXBseS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMjNkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL211bHRpcGx5LmRlY1Rlc3QKQEAgLTAsMCArMSw3MzEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gbXVsdGlwbHkuZGVjVGVzdCAtLSBkZWNpbWFsIG11bHRpcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCistLSBzYW5pdHkgY2hlY2tzIChhcyBiYXNlLCBhYm92ZSkKK211bHgwMDAgbXVsdGlwbHkgMiAgICAgIDIgLT4gNAorbXVseDAwMSBtdWx0aXBseSAyICAgICAgMyAtPiA2CittdWx4MDAyIG11bHRpcGx5IDUgICAgICAxIC0+IDUKK211bHgwMDMgbXVsdGlwbHkgNSAgICAgIDIgLT4gMTAKK211bHgwMDQgbXVsdGlwbHkgMS4yMCAgIDIgLT4gMi40MAorbXVseDAwNSBtdWx0aXBseSAxLjIwICAgMCAtPiAwLjAwCittdWx4MDA2IG11bHRpcGx5IDEuMjAgIC0yIC0+IC0yLjQwCittdWx4MDA3IG11bHRpcGx5IC0xLjIwICAyIC0+IC0yLjQwCittdWx4MDA4IG11bHRpcGx5IC0xLjIwICAwIC0+IC0wLjAwCittdWx4MDA5IG11bHRpcGx5IC0xLjIwIC0yIC0+IDIuNDAKK211bHgwMTAgbXVsdGlwbHkgNS4wOSA3LjEgLT4gMzYuMTM5CittdWx4MDExIG11bHRpcGx5IDIuNSAgICA0IC0+IDEwLjAKK211bHgwMTIgbXVsdGlwbHkgMi41MCAgIDQgLT4gMTAuMDAKK211bHgwMTMgbXVsdGlwbHkgMS4yMzQ1Njc4OSAxLjAwMDAwMDAwIC0+IDEuMjM0NTY3ODkgUm91bmRlZAorbXVseDAxNCBtdWx0aXBseSA5Ljk5OTk5OTk5OSA5Ljk5OTk5OTk5OSAtPiAxMDAuMDAwMDAwIEluZXhhY3QgUm91bmRlZAorbXVseDAxNSBtdWx0aXBseSAyLjUwICAgNCAtPiAxMC4wMAorcHJlY2lzaW9uOiA2CittdWx4MDE2IG11bHRpcGx5IDIuNTAgICA0IC0+IDEwLjAwCittdWx4MDE3IG11bHRpcGx5ICA5Ljk5OTk5OTk5OSAgOS45OTk5OTk5OTkgLT4gIDEwMC4wMDAgSW5leGFjdCBSb3VuZGVkCittdWx4MDE4IG11bHRpcGx5ICA5Ljk5OTk5OTk5OSAtOS45OTk5OTk5OTkgLT4gLTEwMC4wMDAgSW5leGFjdCBSb3VuZGVkCittdWx4MDE5IG11bHRpcGx5IC05Ljk5OTk5OTk5OSAgOS45OTk5OTk5OTkgLT4gLTEwMC4wMDAgSW5leGFjdCBSb3VuZGVkCittdWx4MDIwIG11bHRpcGx5IC05Ljk5OTk5OTk5OSAtOS45OTk5OTk5OTkgLT4gIDEwMC4wMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIDE5OTkuMTIuMjE6IG5leHQgb25lIGlzIGEgZWRnZSBjYXNlIGlmIGludGVybWVkaWF0ZSBsb25ncyBhcmUgdXNlZAorcHJlY2lzaW9uOiAxNQorbXVseDA1OSBtdWx0aXBseSA5OTk5OTk5OTk5OTkgOTc2NTYyNSAtPiA5Ljc2NTYyNDk5OTk5MDIzRSsxOCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzAKK211bHgxNjAgbXVsdGlwbHkgOTk5OTk5OTk5OTk5IDk3NjU2MjUgLT4gOTc2NTYyNDk5OTk5MDIzNDM3NQorcHJlY2lzaW9uOiA5CistLS0tLQorCistLSB6ZXJvcywgZXRjLgorbXVseDAyMSBtdWx0aXBseSAgMCAgICAgIDAgICAgIC0+ICAwCittdWx4MDIyIG11bHRpcGx5ICAwICAgICAtMCAgICAgLT4gLTAKK211bHgwMjMgbXVsdGlwbHkgLTAgICAgICAwICAgICAtPiAtMAorbXVseDAyNCBtdWx0aXBseSAtMCAgICAgLTAgICAgIC0+ICAwCittdWx4MDI1IG11bHRpcGx5IC0wLjAgICAtMC4wICAgLT4gIDAuMDAKK211bHgwMjYgbXVsdGlwbHkgLTAuMCAgIC0wLjAgICAtPiAgMC4wMAorbXVseDAyNyBtdWx0aXBseSAtMC4wICAgLTAuMCAgIC0+ICAwLjAwCittdWx4MDI4IG11bHRpcGx5IC0wLjAgICAtMC4wICAgLT4gIDAuMDAKK211bHgwMzAgbXVsdGlwbHkgIDUuMDAgICAxRS0zICAtPiAgMC4wMDUwMAorbXVseDAzMSBtdWx0aXBseSAgMDAuMDAgIDAuMDAwIC0+ICAwLjAwMDAwCittdWx4MDMyIG11bHRpcGx5ICAwMC4wMCAgMEUtMyAgLT4gIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCittdWx4MDMzIG11bHRpcGx5ICAwRS0zICAgMDAuMDAgLT4gIDAuMDAwMDAgICAgIC0tIGxocyBpcyAwCittdWx4MDM0IG11bHRpcGx5IC01LjAwICAgMUUtMyAgLT4gLTAuMDA1MDAKK211bHgwMzUgbXVsdGlwbHkgLTAwLjAwICAwLjAwMCAtPiAtMC4wMDAwMAorbXVseDAzNiBtdWx0aXBseSAtMDAuMDAgIDBFLTMgIC0+IC0wLjAwMDAwICAgICAtLSByaHMgaXMgMAorbXVseDAzNyBtdWx0aXBseSAtMEUtMyAgIDAwLjAwIC0+IC0wLjAwMDAwICAgICAtLSBsaHMgaXMgMAorbXVseDAzOCBtdWx0aXBseSAgNS4wMCAgLTFFLTMgIC0+IC0wLjAwNTAwCittdWx4MDM5IG11bHRpcGx5ICAwMC4wMCAtMC4wMDAgLT4gLTAuMDAwMDAKK211bHgwNDAgbXVsdGlwbHkgIDAwLjAwIC0wRS0zICAtPiAtMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK211bHgwNDEgbXVsdGlwbHkgIDBFLTMgIC0wMC4wMCAtPiAtMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK211bHgwNDIgbXVsdGlwbHkgLTUuMDAgIC0xRS0zICAtPiAgMC4wMDUwMAorbXVseDA0MyBtdWx0aXBseSAtMDAuMDAgLTAuMDAwIC0+ICAwLjAwMDAwCittdWx4MDQ0IG11bHRpcGx5IC0wMC4wMCAtMEUtMyAgLT4gIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCittdWx4MDQ1IG11bHRpcGx5IC0wRS0zICAtMDAuMDAgLT4gIDAuMDAwMDAgICAgIC0tIGxocyBpcyAwCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjYXJpdGgKK211bHgwNTAgbXVsdGlwbHkgMS4yMCAzICAgICAgICAtPiAzLjYwCittdWx4MDUxIG11bHRpcGx5IDcgICAgMyAgICAgICAgLT4gMjEKK211bHgwNTIgbXVsdGlwbHkgMC45ICAwLjggICAgICAtPiAwLjcyCittdWx4MDUzIG11bHRpcGx5IDAuOSAgLTAgICAgICAgLT4gLTAuMAorbXVseDA1NCBtdWx0aXBseSA2NTQzMjEgNjU0MzIxIC0+IDQuMjgxMzU5NzFFKzExICBJbmV4YWN0IFJvdW5kZWQKKworbXVseDA2MCBtdWx0aXBseSAxMjMuNDUgMWU3ICAtPiAgMS4yMzQ1RSs5CittdWx4MDYxIG11bHRpcGx5IDEyMy40NSAxZTggIC0+ICAxLjIzNDVFKzEwCittdWx4MDYyIG11bHRpcGx5IDEyMy40NSAxZSs5IC0+ICAxLjIzNDVFKzExCittdWx4MDYzIG11bHRpcGx5IDEyMy40NSAxZTEwIC0+ICAxLjIzNDVFKzEyCittdWx4MDY0IG11bHRpcGx5IDEyMy40NSAxZTExIC0+ICAxLjIzNDVFKzEzCittdWx4MDY1IG11bHRpcGx5IDEyMy40NSAxZTEyIC0+ICAxLjIzNDVFKzE0CittdWx4MDY2IG11bHRpcGx5IDEyMy40NSAxZTEzIC0+ICAxLjIzNDVFKzE1CisKKworLS0gdGVzdCBzb21lIGludGVybWVkaWF0ZSBsZW5ndGhzCitwcmVjaXNpb246IDkKK211bHgwODAgbXVsdGlwbHkgMC4xIDEyMzQ1Njc4OSAgICAgICAgICAtPiAxMjM0NTY3OC45CittdWx4MDgxIG11bHRpcGx5IDAuMSAxMjM0NTY3ODkxICAgICAgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorbXVseDA4MiBtdWx0aXBseSAwLjEgMTIzNDU2Nzg5MTIgICAgICAgIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCittdWx4MDgzIG11bHRpcGx5IDAuMSAxMjM0NTY3ODkxMjM0NSAgICAgLT4gMS4yMzQ1Njc4OUUrMTIgSW5leGFjdCBSb3VuZGVkCittdWx4MDg0IG11bHRpcGx5IDAuMSAxMjM0NTY3ODkgICAgICAgICAgLT4gMTIzNDU2NzguOQorcHJlY2lzaW9uOiA4CittdWx4MDg1IG11bHRpcGx5IDAuMSAxMjM0NTY3ODkxMiAgICAgICAgLT4gMS4yMzQ1Njc5RSs5IEluZXhhY3QgUm91bmRlZAorbXVseDA4NiBtdWx0aXBseSAwLjEgMTIzNDU2Nzg5MTIzNDUgICAgIC0+IDEuMjM0NTY3OUUrMTIgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDcKK211bHgwODcgbXVsdGlwbHkgMC4xIDEyMzQ1Njc4OTEyICAgICAgICAtPiAxLjIzNDU2OEUrOSBJbmV4YWN0IFJvdW5kZWQKK211bHgwODggbXVsdGlwbHkgMC4xIDEyMzQ1Njc4OTEyMzQ1ICAgICAtPiAxLjIzNDU2OEUrMTIgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogOQorbXVseDA5MCBtdWx0aXBseSAxMjM0NTY3ODkgICAgICAgICAgMC4xIC0+IDEyMzQ1Njc4LjkKK211bHgwOTEgbXVsdGlwbHkgMTIzNDU2Nzg5MSAgICAgICAgIDAuMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCittdWx4MDkyIG11bHRpcGx5IDEyMzQ1Njc4OTEyICAgICAgICAwLjEgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK211bHgwOTMgbXVsdGlwbHkgMTIzNDU2Nzg5MTIzNDUgICAgIDAuMSAtPiAxLjIzNDU2Nzg5RSsxMiBJbmV4YWN0IFJvdW5kZWQKK211bHgwOTQgbXVsdGlwbHkgMTIzNDU2Nzg5ICAgICAgICAgIDAuMSAtPiAxMjM0NTY3OC45CitwcmVjaXNpb246IDgKK211bHgwOTUgbXVsdGlwbHkgMTIzNDU2Nzg5MTIgICAgICAgIDAuMSAtPiAxLjIzNDU2NzlFKzkgSW5leGFjdCBSb3VuZGVkCittdWx4MDk2IG11bHRpcGx5IDEyMzQ1Njc4OTEyMzQ1ICAgICAwLjEgLT4gMS4yMzQ1Njc5RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNworbXVseDA5NyBtdWx0aXBseSAxMjM0NTY3ODkxMiAgICAgICAgMC4xIC0+IDEuMjM0NTY4RSs5IEluZXhhY3QgUm91bmRlZAorbXVseDA5OCBtdWx0aXBseSAxMjM0NTY3ODkxMjM0NSAgICAgMC4xIC0+IDEuMjM0NTY4RSsxMiBJbmV4YWN0IFJvdW5kZWQKKworLS0gdGVzdCBzb21lIG1vcmUgZWRnZSBjYXNlcyBhbmQgY2FycmllcworbWF4ZXhwb25lbnQ6IDk5OTkKK21pbmV4cG9uZW50OiAtOTk5OQorcHJlY2lzaW9uOiAzMworbXVseDEwMSBtdWx0aXBseSA5IDkgICAtPiA4MQorbXVseDEwMiBtdWx0aXBseSA5IDkwICAgLT4gODEwCittdWx4MTAzIG11bHRpcGx5IDkgOTAwICAgLT4gODEwMAorbXVseDEwNCBtdWx0aXBseSA5IDkwMDAgICAtPiA4MTAwMAorbXVseDEwNSBtdWx0aXBseSA5IDkwMDAwICAgLT4gODEwMDAwCittdWx4MTA2IG11bHRpcGx5IDkgOTAwMDAwICAgLT4gODEwMDAwMAorbXVseDEwNyBtdWx0aXBseSA5IDkwMDAwMDAgICAtPiA4MTAwMDAwMAorbXVseDEwOCBtdWx0aXBseSA5IDkwMDAwMDAwICAgLT4gODEwMDAwMDAwCittdWx4MTA5IG11bHRpcGx5IDkgOTAwMDAwMDAwICAgLT4gODEwMDAwMDAwMAorbXVseDExMCBtdWx0aXBseSA5IDkwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMAorbXVseDExMSBtdWx0aXBseSA5IDkwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwCittdWx4MTEyIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMAorbXVseDExMyBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMAorbXVseDExNCBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwCittdWx4MTE1IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMAorbXVseDExNiBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMAorbXVseDExNyBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwCittdWx4MTE4IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMAorbXVseDExOSBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMAorbXVseDEyMCBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwCittdWx4MTIxIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMAorbXVseDEyMiBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorbXVseDEyMyBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCistLSB0ZXN0IHNvbWUgbW9yZSBlZGdlIGNhc2VzIHdpdGhvdXQgY2FycmllcworbXVseDEzMSBtdWx0aXBseSAzIDMgICAtPiA5CittdWx4MTMyIG11bHRpcGx5IDMgMzAgICAtPiA5MAorbXVseDEzMyBtdWx0aXBseSAzIDMwMCAgIC0+IDkwMAorbXVseDEzNCBtdWx0aXBseSAzIDMwMDAgICAtPiA5MDAwCittdWx4MTM1IG11bHRpcGx5IDMgMzAwMDAgICAtPiA5MDAwMAorbXVseDEzNiBtdWx0aXBseSAzIDMwMDAwMCAgIC0+IDkwMDAwMAorbXVseDEzNyBtdWx0aXBseSAzIDMwMDAwMDAgICAtPiA5MDAwMDAwCittdWx4MTM4IG11bHRpcGx5IDMgMzAwMDAwMDAgICAtPiA5MDAwMDAwMAorbXVseDEzOSBtdWx0aXBseSAzIDMwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMAorbXVseDE0MCBtdWx0aXBseSAzIDMwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwCittdWx4MTQxIG11bHRpcGx5IDMgMzAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMAorbXVseDE0MiBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMAorbXVseDE0MyBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwCittdWx4MTQ0IG11bHRpcGx5IDMgMzAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMAorbXVseDE0NSBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMDAwMAorbXVseDE0NiBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAwCittdWx4MTQ3IG11bHRpcGx5IDMgMzAwMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAwMAorbXVseDE0OCBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMDAwMDAwMAorbXVseDE0OSBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwCittdWx4MTUwIG11bHRpcGx5IDMgMzAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwMAorbXVseDE1MSBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMDAwMDAwMDAwMAorbXVseDE1MiBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwCittdWx4MTUzIG11bHRpcGx5IDMgMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcHJlY2lzaW9uOiA5CistLSB0ZXN0IHNvbWUgY2FzZXMgdGhhdCBhcmUgY2xvc2UgdG8gZXhwb25lbnQgb3ZlcmZsb3cvdW5kZXJmbG93CittdWx4MTcwIG11bHRpcGx5IDEgOWU5OTk5OTk5OTkgICAgLT4gOUUrOTk5OTk5OTk5CittdWx4MTcxIG11bHRpcGx5IDEgOS45ZTk5OTk5OTk5OSAgLT4gOS45RSs5OTk5OTk5OTkKK211bHgxNzIgbXVsdGlwbHkgMSA5Ljk5ZTk5OTk5OTk5OSAtPiA5Ljk5RSs5OTk5OTk5OTkKK211bHgxNzMgbXVsdGlwbHkgOWU5OTk5OTk5OTkgICAgMSAtPiA5RSs5OTk5OTk5OTkKK211bHgxNzQgbXVsdGlwbHkgOS45ZTk5OTk5OTk5OSAgMSAtPiA5LjlFKzk5OTk5OTk5OQorbXVseDE3NiBtdWx0aXBseSA5Ljk5ZTk5OTk5OTk5OSAxIC0+IDkuOTlFKzk5OTk5OTk5OQorbXVseDE3NyBtdWx0aXBseSAxIDkuOTk5OTk5OTllOTk5OTk5OTk5IC0+IDkuOTk5OTk5OTlFKzk5OTk5OTk5OQorbXVseDE3OCBtdWx0aXBseSA5Ljk5OTk5OTk5ZTk5OTk5OTk5OSAxIC0+IDkuOTk5OTk5OTlFKzk5OTk5OTk5OQorCittdWx4MTgwIG11bHRpcGx5IDAuMSA5ZS05OTk5OTk5OTggICAtPiA5RS05OTk5OTk5OTkKK211bHgxODEgbXVsdGlwbHkgMC4xIDk5ZS05OTk5OTk5OTggIC0+IDkuOUUtOTk5OTk5OTk4CittdWx4MTgyIG11bHRpcGx5IDAuMSA5OTllLTk5OTk5OTk5OCAtPiA5Ljk5RS05OTk5OTk5OTcKKworbXVseDE4MyBtdWx0aXBseSAwLjEgOWUtOTk5OTk5OTk4ICAgICAtPiA5RS05OTk5OTk5OTkKK211bHgxODQgbXVsdGlwbHkgMC4xIDk5ZS05OTk5OTk5OTggICAgLT4gOS45RS05OTk5OTk5OTgKK211bHgxODUgbXVsdGlwbHkgMC4xIDk5OWUtOTk5OTk5OTk4ICAgLT4gOS45OUUtOTk5OTk5OTk3CittdWx4MTg2IG11bHRpcGx5IDAuMSA5OTllLTk5OTk5OTk5NyAgIC0+IDkuOTlFLTk5OTk5OTk5NgorbXVseDE4NyBtdWx0aXBseSAwLjEgOTk5OWUtOTk5OTk5OTk3ICAtPiA5Ljk5OUUtOTk5OTk5OTk1CittdWx4MTg4IG11bHRpcGx5IDAuMSA5OTk5OWUtOTk5OTk5OTk3IC0+IDkuOTk5OUUtOTk5OTk5OTk0CisKK211bHgxOTAgbXVsdGlwbHkgMSA5ZS05OTk5OTk5OTggICAtPiA5RS05OTk5OTk5OTgKK211bHgxOTEgbXVsdGlwbHkgMSA5OWUtOTk5OTk5OTk4ICAtPiA5LjlFLTk5OTk5OTk5NworbXVseDE5MiBtdWx0aXBseSAxIDk5OWUtOTk5OTk5OTk4IC0+IDkuOTlFLTk5OTk5OTk5NgorbXVseDE5MyBtdWx0aXBseSA5ZS05OTk5OTk5OTggICAxIC0+IDlFLTk5OTk5OTk5OAorbXVseDE5NCBtdWx0aXBseSA5OWUtOTk5OTk5OTk4ICAxIC0+IDkuOUUtOTk5OTk5OTk3CittdWx4MTk1IG11bHRpcGx5IDk5OWUtOTk5OTk5OTk4IDEgLT4gOS45OUUtOTk5OTk5OTk2CisKK211bHgxOTYgbXVsdGlwbHkgMWUtNTk5OTk5OTk5IDFlLTQwMDAwMDAwMCAtPiAxRS05OTk5OTk5OTkKK211bHgxOTcgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTM5OTk5OTk5OSAtPiAxRS05OTk5OTk5OTkKK211bHgxOTggbXVsdGlwbHkgMS4yZS01OTk5OTk5OTkgMS4yZS00MDAwMDAwMDAgLT4gMS40NEUtOTk5OTk5OTk5CittdWx4MTk5IG11bHRpcGx5IDEuMmUtNjAwMDAwMDAwIDEuMmUtMzk5OTk5OTk5IC0+IDEuNDRFLTk5OTk5OTk5OQorCittdWx4MjAxIG11bHRpcGx5IDFlNTk5OTk5OTk5IDFlNDAwMDAwMDAwIC0+IDFFKzk5OTk5OTk5OQorbXVseDIwMiBtdWx0aXBseSAxZTYwMDAwMDAwMCAxZTM5OTk5OTk5OSAtPiAxRSs5OTk5OTk5OTkKK211bHgyMDMgbXVsdGlwbHkgMS4yZTU5OTk5OTk5OSAxLjJlNDAwMDAwMDAwIC0+IDEuNDRFKzk5OTk5OTk5OQorbXVseDIwNCBtdWx0aXBseSAxLjJlNjAwMDAwMDAwIDEuMmUzOTk5OTk5OTkgLT4gMS40NEUrOTk5OTk5OTk5CisKKy0tIGxvbmcgb3BlcmFuZCB0cmlhbmdsZQorcHJlY2lzaW9uOiAzMworbXVseDI0NiBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MTE5OTI4MzAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMyCittdWx4MjQ3IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUxMTk5MjgzICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzEKK211bHgyNDggbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTExOTkyOCAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMAorbXVseDI0OSBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MTE5OTMgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI5CittdWx4MjUwIG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUxMTk5ICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjgKK211bHgyNTEgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTEyMCAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNworbXVseDI1MiBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MTIgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI2CittdWx4MjUzIG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUxICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjUKK211bHgyNTQgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNAorbXVseDI1NSBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTcgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIzCittdWx4MjU2IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkyICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjIKK211bHgyNTcgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOSAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMQorbXVseDI1OCBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzIgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIwCittdWx4MjU5IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3ICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTkKK211bHgyNjAgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NyAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxOAorbXVseDI2MSBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNzAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE3CittdWx4MjYyIG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzM3ICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTYKK211bHgyNjMgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzNCAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNQorbXVseDI2NCBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE0CittdWx4MjY1IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5ICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTMKK211bHgyNjYgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMiAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMgorbXVseDI2NyBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDEgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDExCittdWx4MjY4IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTAKK211bHgyNjkgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwOCAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgOQorbXVseDI3MCBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTEgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA4CittdWx4MjcxIG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5ICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDcKK211bHgyNzIgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNgorbXVseDI3MyBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDUKK211bHgyNzQgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxLjQ1NDNFKzUgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA0CittdWx4Mjc1IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMS40NTRFKzUgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAzCittdWx4Mjc2IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMS40NUUrNSAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDIKK211bHgyNzcgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxLjVFKzUgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxCittdWx4Mjc4IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMUUrNSAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRlc3Qgc29tZSBlZGdlIGNhc2VzIHdpdGggZXhhY3Qgcm91bmRpbmcKK21heGV4cG9uZW50OiA5OTk5CittaW5leHBvbmVudDogLTk5OTkKK3ByZWNpc2lvbjogOQorbXVseDMwMSBtdWx0aXBseSA5IDkgICAtPiA4MQorbXVseDMwMiBtdWx0aXBseSA5IDkwICAgLT4gODEwCittdWx4MzAzIG11bHRpcGx5IDkgOTAwICAgLT4gODEwMAorbXVseDMwNCBtdWx0aXBseSA5IDkwMDAgICAtPiA4MTAwMAorbXVseDMwNSBtdWx0aXBseSA5IDkwMDAwICAgLT4gODEwMDAwCittdWx4MzA2IG11bHRpcGx5IDkgOTAwMDAwICAgLT4gODEwMDAwMAorbXVseDMwNyBtdWx0aXBseSA5IDkwMDAwMDAgICAtPiA4MTAwMDAwMAorbXVseDMwOCBtdWx0aXBseSA5IDkwMDAwMDAwICAgLT4gODEwMDAwMDAwCittdWx4MzA5IG11bHRpcGx5IDkgOTAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMEUrOSAgIFJvdW5kZWQKK211bHgzMTAgbXVsdGlwbHkgOSA5MDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMEUrMTAgIFJvdW5kZWQKK211bHgzMTEgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzExICBSb3VuZGVkCittdWx4MzEyIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMEUrMTIgIFJvdW5kZWQKK211bHgzMTMgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMEUrMTMgIFJvdW5kZWQKK211bHgzMTQgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzE0ICBSb3VuZGVkCittdWx4MzE1IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMEUrMTUgIFJvdW5kZWQKK211bHgzMTYgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMEUrMTYgIFJvdW5kZWQKK211bHgzMTcgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzE3ICBSb3VuZGVkCittdWx4MzE4IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMEUrMTggIFJvdW5kZWQKK211bHgzMTkgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMEUrMTkgIFJvdW5kZWQKK211bHgzMjAgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzIwICBSb3VuZGVkCittdWx4MzIxIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMEUrMjEgIFJvdW5kZWQKK211bHgzMjIgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMEUrMjIgIFJvdW5kZWQKK211bHgzMjMgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzIzICBSb3VuZGVkCisKKy0tIGZhc3RwYXRoIGJyZWFrZXJzCitwcmVjaXNpb246ICAgMjkKK211bHgzMzAgbXVsdGlwbHkgMS40OTE4MjQ2OTc2NDEyNzAzMTc4MjQ4NTI5NTI4MzcyMjQgMS4xMDUxNzA5MTgwNzU2NDc2MjQ4MTE3MDc4MjY0OTAyNDY1MTQ2NzU2Mjg2MTQ1NjI4ODM1MzczNDU3NDc2MDMgLT4gMS42NDg3MjEyNzA3MDAxMjgxNDY4NDg2NTA3ODc4IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDU1CittdWx4MzMxIG11bHRpcGx5IDAuODk1ODM0MTM1Mjk2NTI4MjUwNjc2ODU0NTgyODc2NTExNzgwMzg3MzcxNzI4NDg5MTA0MDQyOCAwLjg5NTgzNDEzNTI5NjUyODI1MDY3Njg1NDU4Mjg3NjUxMTc4MDM4NzM3MTcyODQ4OTEwNDA0MjggLT4gMC44MDI1MTg3OTc5NjI0Nzg0ODI5ODQyNTUzODI5OTM0MDY5OTU1ODkwOTgzNjk2NzUyMjI4Mjk5IEluZXhhY3QgUm91bmRlZAorCisKKy0tIHRyeXplcm9zIGNhc2VzCitwcmVjaXNpb246ICAgNworcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5MgorbWluZXhwb25lbnQ6IC05MgorbXVseDUwNCAgbXVsdGlwbHkgIDBFLTYwIDEwMDBFLTYwICAtPiAwRS05OCBDbGFtcGVkCittdWx4NTA1ICBtdWx0aXBseSAgMTAwRSs2MCAwRSs2MCAgIC0+IDBFKzkyIENsYW1wZWQKKworLS0gbWl4ZWQgd2l0aCB6ZXJvcworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogOQorbXVseDU0MSBtdWx0aXBseSAgMCAgICAtMSAgICAgLT4gLTAKK211bHg1NDIgbXVsdGlwbHkgLTAgICAgLTEgICAgIC0+ICAwCittdWx4NTQzIG11bHRpcGx5ICAwICAgICAxICAgICAtPiAgMAorbXVseDU0NCBtdWx0aXBseSAtMCAgICAgMSAgICAgLT4gLTAKK211bHg1NDUgbXVsdGlwbHkgLTEgICAgIDAgICAgIC0+IC0wCittdWx4NTQ2IG11bHRpcGx5IC0xICAgIC0wICAgICAtPiAgMAorbXVseDU0NyBtdWx0aXBseSAgMSAgICAgMCAgICAgLT4gIDAKK211bHg1NDggbXVsdGlwbHkgIDEgICAgLTAgICAgIC0+IC0wCisKK211bHg1NTEgbXVsdGlwbHkgIDAuMCAgLTEgICAgIC0+IC0wLjAKK211bHg1NTIgbXVsdGlwbHkgLTAuMCAgLTEgICAgIC0+ICAwLjAKK211bHg1NTMgbXVsdGlwbHkgIDAuMCAgIDEgICAgIC0+ICAwLjAKK211bHg1NTQgbXVsdGlwbHkgLTAuMCAgIDEgICAgIC0+IC0wLjAKK211bHg1NTUgbXVsdGlwbHkgLTEuMCAgIDAgICAgIC0+IC0wLjAKK211bHg1NTYgbXVsdGlwbHkgLTEuMCAgLTAgICAgIC0+ICAwLjAKK211bHg1NTcgbXVsdGlwbHkgIDEuMCAgIDAgICAgIC0+ICAwLjAKK211bHg1NTggbXVsdGlwbHkgIDEuMCAgLTAgICAgIC0+IC0wLjAKKworbXVseDU2MSBtdWx0aXBseSAgMCAgICAtMS4wICAgLT4gLTAuMAorbXVseDU2MiBtdWx0aXBseSAtMCAgICAtMS4wICAgLT4gIDAuMAorbXVseDU2MyBtdWx0aXBseSAgMCAgICAgMS4wICAgLT4gIDAuMAorbXVseDU2NCBtdWx0aXBseSAtMCAgICAgMS4wICAgLT4gLTAuMAorbXVseDU2NSBtdWx0aXBseSAtMSAgICAgMC4wICAgLT4gLTAuMAorbXVseDU2NiBtdWx0aXBseSAtMSAgICAtMC4wICAgLT4gIDAuMAorbXVseDU2NyBtdWx0aXBseSAgMSAgICAgMC4wICAgLT4gIDAuMAorbXVseDU2OCBtdWx0aXBseSAgMSAgICAtMC4wICAgLT4gLTAuMAorCittdWx4NTcxIG11bHRpcGx5ICAwLjAgIC0xLjAgICAtPiAtMC4wMAorbXVseDU3MiBtdWx0aXBseSAtMC4wICAtMS4wICAgLT4gIDAuMDAKK211bHg1NzMgbXVsdGlwbHkgIDAuMCAgIDEuMCAgIC0+ICAwLjAwCittdWx4NTc0IG11bHRpcGx5IC0wLjAgICAxLjAgICAtPiAtMC4wMAorbXVseDU3NSBtdWx0aXBseSAtMS4wICAgMC4wICAgLT4gLTAuMDAKK211bHg1NzYgbXVsdGlwbHkgLTEuMCAgLTAuMCAgIC0+ICAwLjAwCittdWx4NTc3IG11bHRpcGx5ICAxLjAgICAwLjAgICAtPiAgMC4wMAorbXVseDU3OCBtdWx0aXBseSAgMS4wICAtMC4wICAgLT4gLTAuMDAKKworCistLSBTcGVjaWFscworbXVseDU4MCBtdWx0aXBseSAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5CittdWx4NTgxIG11bHRpcGx5ICBJbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK211bHg1ODIgbXVsdGlwbHkgIEluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorbXVseDU4MyBtdWx0aXBseSAgSW5mICAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg1ODQgbXVsdGlwbHkgIEluZiAgIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NTg1IG11bHRpcGx5ICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK211bHg1ODYgbXVsdGlwbHkgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorbXVseDU4NyBtdWx0aXBseSAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CittdWx4NTg4IG11bHRpcGx5IC0xMDAwICBJbmYgICAtPiAtSW5maW5pdHkKK211bHg1ODkgbXVsdGlwbHkgLUluZiAgIEluZiAgIC0+IC1JbmZpbml0eQorbXVseDU5MCBtdWx0aXBseSAtMSAgICAgSW5mICAgLT4gLUluZmluaXR5CittdWx4NTkxIG11bHRpcGx5IC0wICAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDU5MiBtdWx0aXBseSAgMCAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg1OTMgbXVsdGlwbHkgIDEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorbXVseDU5NCBtdWx0aXBseSAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CittdWx4NTk1IG11bHRpcGx5ICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworbXVseDYwMCBtdWx0aXBseSAtSW5mICAtSW5mICAgLT4gIEluZmluaXR5CittdWx4NjAxIG11bHRpcGx5IC1JbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK211bHg2MDIgbXVsdGlwbHkgLUluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorbXVseDYwMyBtdWx0aXBseSAtSW5mICAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2MDQgbXVsdGlwbHkgLUluZiAgIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjA1IG11bHRpcGx5IC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK211bHg2MDYgbXVsdGlwbHkgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorbXVseDYwNyBtdWx0aXBseSAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CittdWx4NjA4IG11bHRpcGx5IC0xMDAwICBJbmYgICAtPiAtSW5maW5pdHkKK211bHg2MDkgbXVsdGlwbHkgLUluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorbXVseDYxMCBtdWx0aXBseSAtMSAgICAtSW5mICAgLT4gIEluZmluaXR5CittdWx4NjExIG11bHRpcGx5IC0wICAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDYxMiBtdWx0aXBseSAgMCAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2MTMgbXVsdGlwbHkgIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorbXVseDYxNCBtdWx0aXBseSAgMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CittdWx4NjE1IG11bHRpcGx5ICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKKworbXVseDYyMSBtdWx0aXBseSAgTmFOIC1JbmYgICAgLT4gIE5hTgorbXVseDYyMiBtdWx0aXBseSAgTmFOIC0xMDAwICAgLT4gIE5hTgorbXVseDYyMyBtdWx0aXBseSAgTmFOIC0xICAgICAgLT4gIE5hTgorbXVseDYyNCBtdWx0aXBseSAgTmFOIC0wICAgICAgLT4gIE5hTgorbXVseDYyNSBtdWx0aXBseSAgTmFOICAwICAgICAgLT4gIE5hTgorbXVseDYyNiBtdWx0aXBseSAgTmFOICAxICAgICAgLT4gIE5hTgorbXVseDYyNyBtdWx0aXBseSAgTmFOICAxMDAwICAgLT4gIE5hTgorbXVseDYyOCBtdWx0aXBseSAgTmFOICBJbmYgICAgLT4gIE5hTgorbXVseDYyOSBtdWx0aXBseSAgTmFOICBOYU4gICAgLT4gIE5hTgorbXVseDYzMCBtdWx0aXBseSAtSW5mICBOYU4gICAgLT4gIE5hTgorbXVseDYzMSBtdWx0aXBseSAtMTAwMCBOYU4gICAgLT4gIE5hTgorbXVseDYzMiBtdWx0aXBseSAtMSAgICBOYU4gICAgLT4gIE5hTgorbXVseDYzMyBtdWx0aXBseSAtMCAgICBOYU4gICAgLT4gIE5hTgorbXVseDYzNCBtdWx0aXBseSAgMCAgICBOYU4gICAgLT4gIE5hTgorbXVseDYzNSBtdWx0aXBseSAgMSAgICBOYU4gICAgLT4gIE5hTgorbXVseDYzNiBtdWx0aXBseSAgMTAwMCBOYU4gICAgLT4gIE5hTgorbXVseDYzNyBtdWx0aXBseSAgSW5mICBOYU4gICAgLT4gIE5hTgorCittdWx4NjQxIG11bHRpcGx5ICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY0MiBtdWx0aXBseSAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NDMgbXVsdGlwbHkgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjQ0IG11bHRpcGx5ICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY0NSBtdWx0aXBseSAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NDYgbXVsdGlwbHkgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjQ3IG11bHRpcGx5ICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY0OCBtdWx0aXBseSAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NDkgbXVsdGlwbHkgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjUwIG11bHRpcGx5ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY1MSBtdWx0aXBseSAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NTIgbXVsdGlwbHkgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjUzIG11bHRpcGx5IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY1NCBtdWx0aXBseSAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NTUgbXVsdGlwbHkgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjU2IG11bHRpcGx5ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY1NyBtdWx0aXBseSAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NTggbXVsdGlwbHkgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjU5IG11bHRpcGx5ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCittdWx4NjYxIG11bHRpcGx5ICBOYU45IC1JbmYgICAtPiAgTmFOOQorbXVseDY2MiBtdWx0aXBseSAgTmFOOCAgOTk5ICAgLT4gIE5hTjgKK211bHg2NjMgbXVsdGlwbHkgIE5hTjcxIEluZiAgIC0+ICBOYU43MQorbXVseDY2NCBtdWx0aXBseSAgTmFONiAgTmFONSAgLT4gIE5hTjYKK211bHg2NjUgbXVsdGlwbHkgLUluZiAgIE5hTjQgIC0+ICBOYU40CittdWx4NjY2IG11bHRpcGx5IC05OTkgICBOYU4zMyAtPiAgTmFOMzMKK211bHg2NjcgbXVsdGlwbHkgIEluZiAgIE5hTjIgIC0+ICBOYU4yCisKK211bHg2NzEgbXVsdGlwbHkgIHNOYU45OSAtSW5mICAgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY3MiBtdWx0aXBseSAgc05hTjk4IC0xMSAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCittdWx4NjczIG11bHRpcGx5ICBzTmFOOTcgIE5hTiAgICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NzQgbXVsdGlwbHkgIHNOYU4xNiBzTmFOOTQgIC0+ICBOYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY3NSBtdWx0aXBseSAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCittdWx4Njc2IG11bHRpcGx5IC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NzcgbXVsdGlwbHkgIDA4OCAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY3OCBtdWx0aXBseSAgSW5mICAgIHNOYU45MCAgLT4gIE5hTjkwIEludmFsaWRfb3BlcmF0aW9uCittdWx4Njc5IG11bHRpcGx5ICBOYU4gICAgc05hTjg5ICAtPiAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworbXVseDY4MSBtdWx0aXBseSAtTmFOOSAtSW5mICAgLT4gLU5hTjkKK211bHg2ODIgbXVsdGlwbHkgLU5hTjggIDk5OSAgIC0+IC1OYU44CittdWx4NjgzIG11bHRpcGx5IC1OYU43MSBJbmYgICAtPiAtTmFONzEKK211bHg2ODQgbXVsdGlwbHkgLU5hTjYgLU5hTjUgIC0+IC1OYU42CittdWx4Njg1IG11bHRpcGx5IC1JbmYgIC1OYU40ICAtPiAtTmFONAorbXVseDY4NiBtdWx0aXBseSAtOTk5ICAtTmFOMzMgLT4gLU5hTjMzCittdWx4Njg3IG11bHRpcGx5ICBJbmYgIC1OYU4yICAtPiAtTmFOMgorCittdWx4NjkxIG11bHRpcGx5IC1zTmFOOTkgLUluZiAgICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK211bHg2OTIgbXVsdGlwbHkgLXNOYU45OCAtMTEgICAgIC0+IC1OYU45OCBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY5MyBtdWx0aXBseSAtc05hTjk3ICBOYU4gICAgLT4gLU5hTjk3IEludmFsaWRfb3BlcmF0aW9uCittdWx4Njk0IG11bHRpcGx5IC1zTmFOMTYgLXNOYU45NCAtPiAtTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK211bHg2OTUgbXVsdGlwbHkgLU5hTjk1ICAtc05hTjkzIC0+IC1OYU45MyBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY5NiBtdWx0aXBseSAtSW5mICAgIC1zTmFOOTIgLT4gLU5hTjkyIEludmFsaWRfb3BlcmF0aW9uCittdWx4Njk3IG11bHRpcGx5ICAwODggICAgLXNOYU45MSAtPiAtTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK211bHg2OTggbXVsdGlwbHkgIEluZiAgICAtc05hTjkwIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY5OSBtdWx0aXBseSAtTmFOICAgIC1zTmFOODkgLT4gLU5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKK211bHg3MDEgbXVsdGlwbHkgLU5hTiAgLUluZiAgIC0+IC1OYU4KK211bHg3MDIgbXVsdGlwbHkgLU5hTiAgIDk5OSAgIC0+IC1OYU4KK211bHg3MDMgbXVsdGlwbHkgLU5hTiAgIEluZiAgIC0+IC1OYU4KK211bHg3MDQgbXVsdGlwbHkgLU5hTiAgLU5hTiAgIC0+IC1OYU4KK211bHg3MDUgbXVsdGlwbHkgLUluZiAgLU5hTjAgIC0+IC1OYU4KK211bHg3MDYgbXVsdGlwbHkgLTk5OSAgLU5hTiAgIC0+IC1OYU4KK211bHg3MDcgbXVsdGlwbHkgIEluZiAgLU5hTiAgIC0+IC1OYU4KKworbXVseDcxMSBtdWx0aXBseSAtc05hTiAgIC1JbmYgICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorbXVseDcxMiBtdWx0aXBseSAtc05hTiAgIC0xMSAgICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorbXVseDcxMyBtdWx0aXBseSAtc05hTjAwICBOYU4gICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorbXVseDcxNCBtdWx0aXBseSAtc05hTiAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorbXVseDcxNSBtdWx0aXBseSAtTmFOICAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorbXVseDcxNiBtdWx0aXBseSAtSW5mICAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorbXVseDcxNyBtdWx0aXBseSAgMDg4ICAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorbXVseDcxOCBtdWx0aXBseSAgSW5mICAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorbXVseDcxOSBtdWx0aXBseSAtTmFOICAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uIG5vdGUgc3Vibm9ybWFsIHJlc3VsdHMKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CittdWx4NzMwIG11bHRpcGx5ICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK211bHg3MzEgbXVsdGlwbHkgOUUrOTk5OTk5OTk5ICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+IEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorbXVseDczMiBtdWx0aXBseSArMC4xMDAgOUUtOTk5OTk5OTk5IC0+IDkuMDBFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCittdWx4NzMzIG11bHRpcGx5IDlFLTk5OTk5OTk5OSArMC4xMDAgLT4gOS4wMEUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK211bHg3MzUgbXVsdGlwbHkgLTEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5IC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK211bHg3MzYgbXVsdGlwbHkgOUUrOTk5OTk5OTk5IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK211bHg3MzcgbXVsdGlwbHkgLTAuMTAwIDlFLTk5OTk5OTk5OSAtPiAtOS4wMEUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK211bHg3MzggbXVsdGlwbHkgOUUtOTk5OTk5OTk5IC0wLjEwMCAtPiAtOS4wMEUtMTAwMDAwMDAwMCBTdWJub3JtYWwKKworbXVseDczOSBtdWx0aXBseSAxZS01OTk5OTk5OTkgMWUtNDAwMDAwMDAxIC0+IDFFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCittdWx4NzQwIG11bHRpcGx5IDFlLTU5OTk5OTk5OSAxZS00MDAwMDAwMDAgLT4gMUUtOTk5OTk5OTk5CittdWx4NzQxIG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMDAgLT4gMUUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK211bHg3NDIgbXVsdGlwbHkgOWUtOTk5OTk5OTk4IDAuMDEgLT4gOUUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK211bHg3NDMgbXVsdGlwbHkgOWUtOTk5OTk5OTk4IDAuMSAgLT4gOUUtOTk5OTk5OTk5CittdWx4NzQ0IG11bHRpcGx5IDAuMDEgOWUtOTk5OTk5OTk4IC0+IDlFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCittdWx4NzQ1IG11bHRpcGx5IDFlNTk5OTk5OTk5IDFlNDAwMDAwMDAxIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbXVseDc0NiBtdWx0aXBseSAxZTU5OTk5OTk5OSAxZTQwMDAwMDAwMCAtPiAxRSs5OTk5OTk5OTkKK211bHg3NDcgbXVsdGlwbHkgMWU2MDAwMDAwMDAgMWU0MDAwMDAwMDAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4NzQ4IG11bHRpcGx5IDllOTk5OTk5OTk4IDEwMCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4NzQ5IG11bHRpcGx5IDllOTk5OTk5OTk4IDEwICAgLT4gOS4wRSs5OTk5OTk5OTkKK211bHg3NTAgbXVsdGlwbHkgMTAwICA5ZTk5OTk5OTk5OCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKy0tIHNpZ25zCittdWx4NzUxIG11bHRpcGx5ICAxZSs3Nzc3Nzc3NzcgIDFlKzQxMTExMTExMSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4NzUyIG11bHRpcGx5ICAxZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4NzUzIG11bHRpcGx5IC0xZSs3Nzc3Nzc3NzcgIDFlKzQxMTExMTExMSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4NzU0IG11bHRpcGx5IC0xZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4NzU1IG11bHRpcGx5ICAxZS03Nzc3Nzc3NzcgIDFlLTQxMTExMTExMSAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCittdWx4NzU2IG11bHRpcGx5ICAxZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCittdWx4NzU3IG11bHRpcGx5IC0xZS03Nzc3Nzc3NzcgIDFlLTQxMTExMTExMSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCittdWx4NzU4IG11bHRpcGx5IC0xZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tICdzdWJub3JtYWwnIGJvdW5kYXJ5IChhbGwgaGFyZCB1bmRlcmZsb3cgb3Igb3ZlcmZsb3cgaW4gYmFzZSBhcml0aGVtdGljKQorcHJlY2lzaW9uOiA5CittdWx4NzYwIG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMDEgLT4gMUUtMTAwMDAwMDAwMSBTdWJub3JtYWwKK211bHg3NjEgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAwMiAtPiAxRS0xMDAwMDAwMDAyIFN1Ym5vcm1hbAorbXVseDc2MiBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDAzIC0+IDFFLTEwMDAwMDAwMDMgU3Vibm9ybWFsCittdWx4NzYzIG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMDQgLT4gMUUtMTAwMDAwMDAwNCBTdWJub3JtYWwKK211bHg3NjQgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAwNSAtPiAxRS0xMDAwMDAwMDA1IFN1Ym5vcm1hbAorbXVseDc2NSBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDA2IC0+IDFFLTEwMDAwMDAwMDYgU3Vibm9ybWFsCittdWx4NzY2IG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMDcgLT4gMUUtMTAwMDAwMDAwNyBTdWJub3JtYWwKK211bHg3NjcgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAwOCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK211bHg3NjggbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAwOSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK211bHg3NjkgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAxMCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKy0tIFtubyBlcXVpdmFsZW50IG9mICdzdWJub3JtYWwnIGZvciBvdmVyZmxvd10KK211bHg3NzAgbXVsdGlwbHkgMWUrNjAwMDAwMDAwIDFlKzQwMDAwMDAwMSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK211bHg3NzEgbXVsdGlwbHkgMWUrNjAwMDAwMDAwIDFlKzQwMDAwMDAwMiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK211bHg3NzIgbXVsdGlwbHkgMWUrNjAwMDAwMDAwIDFlKzQwMDAwMDAwMyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK211bHg3NzMgbXVsdGlwbHkgMWUrNjAwMDAwMDAwIDFlKzQwMDAwMDAwNCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK211bHg3NzQgbXVsdGlwbHkgMWUrNjAwMDAwMDAwIDFlKzQwMDAwMDAwNSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK211bHg3NzUgbXVsdGlwbHkgMWUrNjAwMDAwMDAwIDFlKzQwMDAwMDAwNiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK211bHg3NzYgbXVsdGlwbHkgMWUrNjAwMDAwMDAwIDFlKzQwMDAwMDAwNyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK211bHg3NzcgbXVsdGlwbHkgMWUrNjAwMDAwMDAwIDFlKzQwMDAwMDAwOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK211bHg3NzggbXVsdGlwbHkgMWUrNjAwMDAwMDAwIDFlKzQwMDAwMDAwOSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK211bHg3NzkgbXVsdGlwbHkgMWUrNjAwMDAwMDAwIDFlKzQwMDAwMDAxMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0gJ3N1Ym5vcm1hbCcgdGVzdCBlZGdlIGNvbmRpdGlvbiBhdCBoaWdoZXIgcHJlY2lzaW9ucworcHJlY2lzaW9uOiA5OQorbXVseDc4MCBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDA3IC0+IDFFLTEwMDAwMDAwMDcgU3Vibm9ybWFsCittdWx4NzgxIG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMDggLT4gMUUtMTAwMDAwMDAwOCBTdWJub3JtYWwKK211bHg3ODIgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDA5NyAtPiAxRS0xMDAwMDAwMDk3IFN1Ym5vcm1hbAorbXVseDc4MyBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDk4IC0+IDBFLTEwMDAwMDAwOTcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcHJlY2lzaW9uOiA5OTkKK211bHg3ODQgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDk5NyAtPiAxRS0xMDAwMDAwOTk3IFN1Ym5vcm1hbAorbXVseDc4NSBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDAwOTk4IC0+IDBFLTEwMDAwMDA5OTcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSBmb2xsb3dpbmcgdGVzdGNhc2VzIFt0aHJvdWdoIG11bHg4MDBdIG5vdCB5ZXQgcnVuIGFnYWluc3QgY29kZQorcHJlY2lzaW9uOiA5OTk5CittdWx4Nzg2IG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDk5OTcgLT4gMUUtMTAwMDAwOTk5NyBTdWJub3JtYWwKK211bHg3ODcgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwOTk5OCAtPiAwRS0xMDAwMDA5OTk3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3ByZWNpc2lvbjogOTk5OTkKK211bHg3ODggbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDA5OTk5NyAtPiAxRS0xMDAwMDk5OTk3IFN1Ym5vcm1hbAorbXVseDc4OSBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDk5OTk4IC0+IDBFLTEwMDAwOTk5OTcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcHJlY2lzaW9uOiA5OTk5OTkKK211bHg3OTAgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDk5OTk5NyAtPiAxRS0xMDAwOTk5OTk3IFN1Ym5vcm1hbAorbXVseDc5MSBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwOTk5OTk4IC0+IDBFLTEwMDA5OTk5OTcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcHJlY2lzaW9uOiA5OTk5OTk5CittdWx4NzkyIG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDk5OTk5OTcgLT4gMUUtMTAwOTk5OTk5NyBTdWJub3JtYWwKK211bHg3OTMgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwOTk5OTk5OCAtPiAwRS0xMDA5OTk5OTk3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3ByZWNpc2lvbjogOTk5OTk5OTkKK211bHg3OTQgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQ5OTk5OTk5NyAtPiAxRS0xMDk5OTk5OTk3IFN1Ym5vcm1hbAorbXVseDc5NSBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDk5OTk5OTk4IC0+IDBFLTEwOTk5OTk5OTcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcHJlY2lzaW9uOiA5OTk5OTk5OTkKK211bHg3OTYgbXVsdGlwbHkgMWUtOTk5OTk5OTk5IDFlLTk5OTk5OTk5NyAtPiAxRS0xOTk5OTk5OTk2IFN1Ym5vcm1hbAorbXVseDc5NyBtdWx0aXBseSAxZS05OTk5OTk5OTkgMWUtOTk5OTk5OTk4IC0+IDFFLTE5OTk5OTk5OTcgU3Vibm9ybWFsCittdWx4Nzk4IG11bHRpcGx5IDFlLTk5OTk5OTk5OSAxZS05OTk5OTk5OTkgLT4gMEUtMTk5OTk5OTk5NyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCittdWx4Nzk5IG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMDcgLT4gMUUtMTAwMDAwMDAwNyBTdWJub3JtYWwKK211bHg4MDAgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAwOCAtPiAxRS0xMDAwMDAwMDA4IFN1Ym5vcm1hbAorCistLSB0ZXN0IHN1Ym5vcm1hbHMgcm91bmRpbmcKK3ByZWNpc2lvbjogICA1CittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCittdWx4ODAxIG11bHRpcGx5ICAxLjAwMDBFLTk5OSAgMSAgICAgLT4gMS4wMDAwRS05OTkKK211bHg4MDIgbXVsdGlwbHkgIDEuMDAwRS05OTkgICAxZS0xICAtPiAxLjAwMEUtMTAwMCBTdWJub3JtYWwKK211bHg4MDMgbXVsdGlwbHkgIDEuMDBFLTk5OSAgICAxZS0yICAtPiAxLjAwRS0xMDAxICBTdWJub3JtYWwKK211bHg4MDQgbXVsdGlwbHkgIDEuMEUtOTk5ICAgICAxZS0zICAtPiAxLjBFLTEwMDIgICBTdWJub3JtYWwKK211bHg4MDUgbXVsdGlwbHkgIDEuMEUtOTk5ICAgICAxZS00ICAtPiAxRS0xMDAzICAgICBTdWJub3JtYWwgUm91bmRlZAorbXVseDgwNiBtdWx0aXBseSAgMS4zRS05OTkgICAgIDFlLTQgIC0+IDFFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCittdWx4ODA3IG11bHRpcGx5ICAxLjVFLTk5OSAgICAgMWUtNCAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK211bHg4MDggbXVsdGlwbHkgIDEuN0UtOTk5ICAgICAxZS00ICAtPiAyRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbXVseDgwOSBtdWx0aXBseSAgMi4zRS05OTkgICAgIDFlLTQgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCittdWx4ODEwIG11bHRpcGx5ICAyLjVFLTk5OSAgICAgMWUtNCAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK211bHg4MTEgbXVsdGlwbHkgIDIuN0UtOTk5ICAgICAxZS00ICAtPiAzRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbXVseDgxMiBtdWx0aXBseSAgMS40OUUtOTk5ICAgIDFlLTQgIC0+IDFFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCittdWx4ODEzIG11bHRpcGx5ICAxLjUwRS05OTkgICAgMWUtNCAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK211bHg4MTQgbXVsdGlwbHkgIDEuNTFFLTk5OSAgICAxZS00ICAtPiAyRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbXVseDgxNSBtdWx0aXBseSAgMi40OUUtOTk5ICAgIDFlLTQgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCittdWx4ODE2IG11bHRpcGx5ICAyLjUwRS05OTkgICAgMWUtNCAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK211bHg4MTcgbXVsdGlwbHkgIDIuNTFFLTk5OSAgICAxZS00ICAtPiAzRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCittdWx4ODE4IG11bHRpcGx5ICAxRS05OTkgICAgICAgMWUtNCAgLT4gMUUtMTAwMyAgICAgU3Vibm9ybWFsCittdWx4ODE5IG11bHRpcGx5ICAzRS05OTkgICAgICAgMWUtNSAgLT4gMEUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorbXVseDgyMCBtdWx0aXBseSAgNUUtOTk5ICAgICAgIDFlLTUgIC0+IDBFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK211bHg4MjEgbXVsdGlwbHkgIDdFLTk5OSAgICAgICAxZS01ICAtPiAxRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbXVseDgyMiBtdWx0aXBseSAgOUUtOTk5ICAgICAgIDFlLTUgIC0+IDFFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCittdWx4ODIzIG11bHRpcGx5ICA5LjlFLTk5OSAgICAgMWUtNSAgLT4gMUUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworbXVseDgyNCBtdWx0aXBseSAgMUUtOTk5ICAgICAgLTFlLTQgIC0+IC0xRS0xMDAzICAgIFN1Ym5vcm1hbAorbXVseDgyNSBtdWx0aXBseSAgM0UtOTk5ICAgICAgLTFlLTUgIC0+IC0wRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK211bHg4MjYgbXVsdGlwbHkgLTVFLTk5OSAgICAgICAxZS01ICAtPiAtMEUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCittdWx4ODI3IG11bHRpcGx5ICA3RS05OTkgICAgICAtMWUtNSAgLT4gLTFFLTEwMDMgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK211bHg4MjggbXVsdGlwbHkgLTlFLTk5OSAgICAgICAxZS01ICAtPiAtMUUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbXVseDgyOSBtdWx0aXBseSAgOS45RS05OTkgICAgLTFlLTUgIC0+IC0xRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCittdWx4ODMwIG11bHRpcGx5ICAzLjBFLTk5OSAgICAtMWUtNSAgLT4gLTBFLTEwMDMgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCittdWx4ODMxIG11bHRpcGx5ICAxLjBFLTUwMSAgICAgMWUtNTAxIC0+IDEuMEUtMTAwMiAgIFN1Ym5vcm1hbAorbXVseDgzMiBtdWx0aXBseSAgMi4wRS01MDEgICAgIDJlLTUwMSAtPiA0LjBFLTEwMDIgICBTdWJub3JtYWwKK211bHg4MzMgbXVsdGlwbHkgIDQuMEUtNTAxICAgICA0ZS01MDEgLT4gMS42MEUtMTAwMSAgU3Vibm9ybWFsCittdWx4ODM0IG11bHRpcGx5IDEwLjBFLTUwMSAgICAxMGUtNTAxIC0+IDEuMDAwRS0xMDAwIFN1Ym5vcm1hbAorbXVseDgzNSBtdWx0aXBseSAzMC4wRS01MDEgICAgMzBlLTUwMSAtPiA5LjAwMEUtMTAwMCBTdWJub3JtYWwKK211bHg4MzYgbXVsdGlwbHkgNDAuMEUtNTAxICAgIDQwZS01MDEgLT4gMS42MDAwRS05OTkKKworLS0gc3F1YXJlcworbXVseDg0MCBtdWx0aXBseSAgMUUtNTAyICAgICAgIDFlLTUwMiAtPiAwRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCittdWx4ODQxIG11bHRpcGx5ICAxRS01MDEgICAgICAgMWUtNTAxIC0+IDFFLTEwMDIgICAgIFN1Ym5vcm1hbAorbXVseDg0MiBtdWx0aXBseSAgMkUtNTAxICAgICAgIDJlLTUwMSAtPiA0RS0xMDAyICAgICBTdWJub3JtYWwKK211bHg4NDMgbXVsdGlwbHkgIDRFLTUwMSAgICAgICA0ZS01MDEgLT4gMS42RS0xMDAxICAgU3Vibm9ybWFsCittdWx4ODQ0IG11bHRpcGx5IDEwRS01MDEgICAgICAxMGUtNTAxIC0+IDEuMDBFLTEwMDAgIFN1Ym5vcm1hbAorbXVseDg0NSBtdWx0aXBseSAzMEUtNTAxICAgICAgMzBlLTUwMSAtPiA5LjAwRS0xMDAwICBTdWJub3JtYWwKK211bHg4NDYgbXVsdGlwbHkgNDBFLTUwMSAgICAgIDQwZS01MDEgLT4gMS42MDBFLTk5OQorCistLSBjdWJlcworbXVseDg1MCBtdWx0aXBseSAgMUUtNjcwICAgICAxZS0zMzUgLT4gMEUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCittdWx4ODUxIG11bHRpcGx5ICAxRS02NjggICAgIDFlLTMzNCAtPiAxRS0xMDAyICAgIFN1Ym5vcm1hbAorbXVseDg1MiBtdWx0aXBseSAgNEUtNjY4ICAgICAyZS0zMzQgLT4gOEUtMTAwMiAgICBTdWJub3JtYWwKK211bHg4NTMgbXVsdGlwbHkgIDlFLTY2OCAgICAgM2UtMzM0IC0+IDIuN0UtMTAwMSAgU3Vibm9ybWFsCittdWx4ODU0IG11bHRpcGx5IDE2RS02NjggICAgIDRlLTMzNCAtPiA2LjRFLTEwMDEgIFN1Ym5vcm1hbAorbXVseDg1NSBtdWx0aXBseSAyNUUtNjY4ICAgICA1ZS0zMzQgLT4gMS4yNUUtMTAwMCBTdWJub3JtYWwKK211bHg4NTYgbXVsdGlwbHkgMTBFLTY2OCAgIDEwMGUtMzM0IC0+IDEuMDAwRS05OTkKKworLS0gdGVzdCBkZXJpdmVkIGZyb20gcmVzdWx0IG9mIDAuMDk5ICoqIDk5OSBhdCAxNSBkaWdpdHMgd2l0aCB1bmxpbWl0ZWQgZXhwb25lbnQKK3ByZWNpc2lvbjogMTkKK211bHg4NjAgbXVsdGlwbHkgIDY2MzY4NTE1NTc5OTQ1Nzg3MTZFLTUyMCA2NjM2ODUxNTU3OTk0NTc4NzE2RS01MjAgLT4gNC40MDQ3Nzk4NjAyODU1MUUtMTAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLSBMb25nIG9wZXJhbmQgb3ZlcmZsb3cgbWF5IGJlIGEgZGlmZmVyZW50IHBhdGgKK3ByZWNpc2lvbjogMworbWF4RXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK211bHg4NzAgbXVsdGlwbHkgMSAgOS45OTlFKzk5OTk5OTk5OSAgIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK211bHg4NzEgbXVsdGlwbHkgMSAtOS45OTlFKzk5OTk5OTk5OSAgIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK211bHg4NzIgbXVsdGlwbHkgICAgOS45OTlFKzk5OTk5OTk5OSAxIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK211bHg4NzMgbXVsdGlwbHkgICAtOS45OTlFKzk5OTk5OTk5OSAxIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworLS0gY2hlY2sgZm9yIGRvdWJsZS1yb3VuZGVkIHN1Ym5vcm1hbHMKK3ByZWNpc2lvbjogICA1CittYXhleHBvbmVudDogNzkKK21pbmV4cG9uZW50OiAtNzkKK211bHg4ODEgbXVsdGlwbHkgIDEuMjM0N0UtNDAgIDEuMjM0N0UtNDAgIC0+ICAxLjUyNEUtODAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CittdWx4ODgyIG11bHRpcGx5ICAxLjIzNEUtNDAgIDEuMjM0RS00MCAgICAtPiAgMS41MjNFLTgwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbXVseDg4MyBtdWx0aXBseSAgMS4yM0UtNDAgICAxLjIzRS00MCAgICAgLT4gIDEuNTEzRS04MCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK211bHg4ODQgbXVsdGlwbHkgIDEuMkUtNDAgICAgMS4yRS00MCAgICAgIC0+ICAxLjQ0RS04MCAgIFN1Ym5vcm1hbAorbXVseDg4NSBtdWx0aXBseSAgMS4yRS00MCAgICAxLjJFLTQxICAgICAgLT4gIDEuNDRFLTgxICAgU3Vibm9ybWFsCittdWx4ODg2IG11bHRpcGx5ICAxLjJFLTQwICAgIDEuMkUtNDIgICAgICAtPiAgMS40RS04MiAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworbXVseDg4NyBtdWx0aXBseSAgMS4yRS00MCAgICAxLjNFLTQyICAgICAgLT4gIDEuNkUtODIgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK211bHg4ODggbXVsdGlwbHkgIDEuM0UtNDAgICAgMS4zRS00MiAgICAgIC0+ICAxLjdFLTgyICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CittdWx4ODg5IG11bHRpcGx5ICAxLjNFLTQwICAgIDEuM0UtNDMgICAgICAtPiAgICAyRS04MyAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworbXVseDg5MCBtdWx0aXBseSAgMS4zRS00MSAgICAxLjNFLTQzICAgICAgLT4gICAgMEUtODMgICAgQ2xhbXBlZCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworCittdWx4ODkxIG11bHRpcGx5ICAxLjIzNDVFLTM5ICAgMS4yMzRFLTQwICAtPiAgMS41MjM0RS03OSBJbmV4YWN0IFJvdW5kZWQKK211bHg4OTIgbXVsdGlwbHkgIDEuMjM0NTZFLTM5ICAxLjIzNEUtNDAgIC0+ICAxLjUyMzRFLTc5IEluZXhhY3QgUm91bmRlZAorbXVseDg5MyBtdWx0aXBseSAgMS4yMzQ1RS00MCAgIDEuMjM0RS00MCAgLT4gIDEuNTIzRS04MCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK211bHg4OTQgbXVsdGlwbHkgIDEuMjM0NTZFLTQwICAxLjIzNEUtNDAgIC0+ICAxLjUyM0UtODAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CittdWx4ODk1IG11bHRpcGx5ICAxLjIzNDVFLTQxICAgMS4yMzRFLTQwICAtPiAgMS41MkUtODEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbXVseDg5NiBtdWx0aXBseSAgMS4yMzQ1NkUtNDEgIDEuMjM0RS00MCAgLT4gIDEuNTJFLTgxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworLS0gTm93IGV4cGxvcmUgdGhlIGNhc2Ugd2hlcmUgd2UgZ2V0IGEgbm9ybWFsIHJlc3VsdCB3aXRoIFVuZGVyZmxvdworcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKKworbXVseDkwMCBtdWx0aXBseSAgMC4zMDAwMDAwMDAwRS0xOTEgMC4zMDAwMDAwMDAwRS0xOTEgLT4gOS4wMDAwMDAwMDAwMDAwMEUtMzg0IFN1Ym5vcm1hbCBSb3VuZGVkCittdWx4OTAxIG11bHRpcGx5ICAwLjMwMDAwMDAwMDFFLTE5MSAwLjMwMDAwMDAwMDFFLTE5MSAtPiA5LjAwMDAwMDAwNjAwMDAwRS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK211bHg5MDIgbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OSAgICAgICAgIC0+IDkuOTk5OTk5OTk5OTkwMDBFLTM4NCBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorbXVseDkwMyBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OSAgICAgICAgLT4gOS45OTk5OTk5OTk5OTkwMEUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCittdWx4OTA0IG11bHRpcGx5ICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5OSAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTkwRS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK211bHg5MDUgbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTk5OSAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTlFLTM4NCBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorLS0gcHJvdmUgb3BlcmFuZHMgYXJlIGV4YWN0CittdWx4OTA2IG11bHRpcGx5ICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAxICAgICAgICAgICAgICAgICAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzCittdWx4OTA3IG11bHRpcGx5ICAgICAgICAgICAgICAgICAgICAgICAxICAwLjA5OTk5OTk5OTk5OTk5OTk5ICAgICAtPiAwLjA5OTk5OTk5OTk5OTk5OTk5CistLSB0aGUgbmV4dCByb3VuZHMgdG8gTm1pbgorbXVseDkwOCBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTk5OSAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorbXVseDkwOSBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTk5OTkgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorbXVseDkxMCBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTk5OTk5ICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorbXVseDkxMSBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTk5OTk5OSAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorCisKKy0tIEV4YW1wbGVzIGZyb20gU1FMIHByb3Bvc2FsIChLcmlzaG5hIEt1bGthcm5pKQorcHJlY2lzaW9uOiAgIDM0Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0MworbXVseDEwMDEgIG11bHRpcGx5IDEzMEUtMiAgMTIwRS0yIC0+IDEuNTYwMAorbXVseDEwMDIgIG11bHRpcGx5IDEzMEUtMiAgMTJFLTEgIC0+IDEuNTYwCittdWx4MTAwMyAgbXVsdGlwbHkgMTMwRS0yICAxRTAgICAgLT4gMS4zMAorbXVseDEwMDQgIG11bHRpcGx5IDFFMiAgICAgMUU0ICAgIC0+IDFFKzYKKworLS0gcGF5bG9hZCBkZWNhcGl0YXRlCitwcmVjaXNpb246IDUKK211bHgxMDEwICBtdWx0aXBseSAxMSAtc05hTjEyMzQ1Njc4OTAgLT4gLU5hTjY3ODkwICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOdWxsIHRlc3RzCittdWx4OTkwIG11bHRpcGx5IDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbXVseDk5MSBtdWx0aXBseSAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9uZXh0bWludXMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbmV4dG1pbnVzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxYzUyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbmV4dG1pbnVzLmRlY1Rlc3QKQEAgLTAsMCArMSwxNDggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gbmV4dG1pbnVzLmRlY1Rlc3QgLS0gZGVjaW1hbCBuZXh0IHRoYXQgaXMgbGVzcyBbNzU0ciBuZXh0ZG93bl0gICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCituZXh0bTAwMSBuZXh0bWludXMgIDAuOTk5OTk5OTk1IC0+ICAgMC45OTk5OTk5OTQKK25leHRtMDAyIG5leHRtaW51cyAgMC45OTk5OTk5OTYgLT4gICAwLjk5OTk5OTk5NQorbmV4dG0wMDMgbmV4dG1pbnVzICAwLjk5OTk5OTk5NyAtPiAgIDAuOTk5OTk5OTk2CituZXh0bTAwNCBuZXh0bWludXMgIDAuOTk5OTk5OTk4IC0+ICAgMC45OTk5OTk5OTcKK25leHRtMDA1IG5leHRtaW51cyAgMC45OTk5OTk5OTkgLT4gICAwLjk5OTk5OTk5OAorbmV4dG0wMDYgbmV4dG1pbnVzICAxLjAwMDAwMDAwICAtPiAgIDAuOTk5OTk5OTk5CituZXh0bTAwNyBuZXh0bWludXMgIDEuMCAgICAgICAgIC0+ICAgMC45OTk5OTk5OTkKK25leHRtMDA4IG5leHRtaW51cyAgMSAgICAgICAgICAgLT4gICAwLjk5OTk5OTk5OQorbmV4dG0wMDkgbmV4dG1pbnVzICAxLjAwMDAwMDAxICAtPiAgIDEuMDAwMDAwMDAKK25leHRtMDEwIG5leHRtaW51cyAgMS4wMDAwMDAwMiAgLT4gICAxLjAwMDAwMDAxCituZXh0bTAxMSBuZXh0bWludXMgIDEuMDAwMDAwMDMgIC0+ICAgMS4wMDAwMDAwMgorbmV4dG0wMTIgbmV4dG1pbnVzICAxLjAwMDAwMDA0ICAtPiAgIDEuMDAwMDAwMDMKK25leHRtMDEzIG5leHRtaW51cyAgMS4wMDAwMDAwNSAgLT4gICAxLjAwMDAwMDA0CituZXh0bTAxNCBuZXh0bWludXMgIDEuMDAwMDAwMDYgIC0+ICAgMS4wMDAwMDAwNQorbmV4dG0wMTUgbmV4dG1pbnVzICAxLjAwMDAwMDA3ICAtPiAgIDEuMDAwMDAwMDYKK25leHRtMDE2IG5leHRtaW51cyAgMS4wMDAwMDAwOCAgLT4gICAxLjAwMDAwMDA3CituZXh0bTAxNyBuZXh0bWludXMgIDEuMDAwMDAwMDkgIC0+ICAgMS4wMDAwMDAwOAorbmV4dG0wMTggbmV4dG1pbnVzICAxLjAwMDAwMDEwICAtPiAgIDEuMDAwMDAwMDkKK25leHRtMDE5IG5leHRtaW51cyAgMS4wMDAwMDAxMSAgLT4gICAxLjAwMDAwMDEwCituZXh0bTAyMCBuZXh0bWludXMgIDEuMDAwMDAwMTIgIC0+ICAgMS4wMDAwMDAxMQorCituZXh0bTAyMSBuZXh0bWludXMgLTAuOTk5OTk5OTk1IC0+ICAtMC45OTk5OTk5OTYKK25leHRtMDIyIG5leHRtaW51cyAtMC45OTk5OTk5OTYgLT4gIC0wLjk5OTk5OTk5NworbmV4dG0wMjMgbmV4dG1pbnVzIC0wLjk5OTk5OTk5NyAtPiAgLTAuOTk5OTk5OTk4CituZXh0bTAyNCBuZXh0bWludXMgLTAuOTk5OTk5OTk4IC0+ICAtMC45OTk5OTk5OTkKK25leHRtMDI1IG5leHRtaW51cyAtMC45OTk5OTk5OTkgLT4gIC0xLjAwMDAwMDAwCituZXh0bTAyNiBuZXh0bWludXMgLTEuMDAwMDAwMDAgIC0+ICAtMS4wMDAwMDAwMQorbmV4dG0wMjcgbmV4dG1pbnVzIC0xLjAgICAgICAgICAtPiAgLTEuMDAwMDAwMDEKK25leHRtMDI4IG5leHRtaW51cyAtMSAgICAgICAgICAgLT4gIC0xLjAwMDAwMDAxCituZXh0bTAyOSBuZXh0bWludXMgLTEuMDAwMDAwMDEgIC0+ICAtMS4wMDAwMDAwMgorbmV4dG0wMzAgbmV4dG1pbnVzIC0xLjAwMDAwMDAyICAtPiAgLTEuMDAwMDAwMDMKK25leHRtMDMxIG5leHRtaW51cyAtMS4wMDAwMDAwMyAgLT4gIC0xLjAwMDAwMDA0CituZXh0bTAzMiBuZXh0bWludXMgLTEuMDAwMDAwMDQgIC0+ICAtMS4wMDAwMDAwNQorbmV4dG0wMzMgbmV4dG1pbnVzIC0xLjAwMDAwMDA1ICAtPiAgLTEuMDAwMDAwMDYKK25leHRtMDM0IG5leHRtaW51cyAtMS4wMDAwMDAwNiAgLT4gIC0xLjAwMDAwMDA3CituZXh0bTAzNSBuZXh0bWludXMgLTEuMDAwMDAwMDcgIC0+ICAtMS4wMDAwMDAwOAorbmV4dG0wMzYgbmV4dG1pbnVzIC0xLjAwMDAwMDA4ICAtPiAgLTEuMDAwMDAwMDkKK25leHRtMDM3IG5leHRtaW51cyAtMS4wMDAwMDAwOSAgLT4gIC0xLjAwMDAwMDEwCituZXh0bTAzOCBuZXh0bWludXMgLTEuMDAwMDAwMTAgIC0+ICAtMS4wMDAwMDAxMQorbmV4dG0wMzkgbmV4dG1pbnVzIC0xLjAwMDAwMDExICAtPiAgLTEuMDAwMDAwMTIKKworLS0gaW5wdXQgb3BlcmFuZCBpcyA+cHJlY2lzaW9uCituZXh0bTA0MSBuZXh0bWludXMgIDEuMDAwMDAwMTA5OTggIC0+ICAgMS4wMDAwMDAxMAorbmV4dG0wNDIgbmV4dG1pbnVzICAxLjAwMDAwMDEwOTk5ICAtPiAgIDEuMDAwMDAwMTAKK25leHRtMDQzIG5leHRtaW51cyAgMS4wMDAwMDAxMTAwMCAgLT4gICAxLjAwMDAwMDEwCituZXh0bTA0NCBuZXh0bWludXMgIDEuMDAwMDAwMTEwMDEgIC0+ICAgMS4wMDAwMDAxMQorbmV4dG0wNDUgbmV4dG1pbnVzICAxLjAwMDAwMDExMDAyICAtPiAgIDEuMDAwMDAwMTEKK25leHRtMDQ2IG5leHRtaW51cyAgMS4wMDAwMDAxMTAwMiAgLT4gICAxLjAwMDAwMDExCituZXh0bTA0NyBuZXh0bWludXMgIDEuMDAwMDAwMTEwNTIgIC0+ICAgMS4wMDAwMDAxMQorbmV4dG0wNDggbmV4dG1pbnVzICAxLjAwMDAwMDExNTUyICAtPiAgIDEuMDAwMDAwMTEKK25leHRtMDQ5IG5leHRtaW51cyAtMS4wMDAwMDAxMDk5OCAgLT4gIC0xLjAwMDAwMDExCituZXh0bTA1MCBuZXh0bWludXMgLTEuMDAwMDAwMTA5OTkgIC0+ICAtMS4wMDAwMDAxMQorbmV4dG0wNTEgbmV4dG1pbnVzIC0xLjAwMDAwMDExMDAwICAtPiAgLTEuMDAwMDAwMTIKK25leHRtMDUyIG5leHRtaW51cyAtMS4wMDAwMDAxMTAwMSAgLT4gIC0xLjAwMDAwMDEyCituZXh0bTA1MyBuZXh0bWludXMgLTEuMDAwMDAwMTEwMDIgIC0+ICAtMS4wMDAwMDAxMgorbmV4dG0wNTQgbmV4dG1pbnVzIC0xLjAwMDAwMDExMDAyICAtPiAgLTEuMDAwMDAwMTIKK25leHRtMDU1IG5leHRtaW51cyAtMS4wMDAwMDAxMTA1MiAgLT4gIC0xLjAwMDAwMDEyCituZXh0bTA1NiBuZXh0bWludXMgLTEuMDAwMDAwMTE1NTIgIC0+ICAtMS4wMDAwMDAxMgorLS0gdWx0cmEtdGlueSBpbnB1dHMKK25leHRtMDYwIG5leHRtaW51cyAgMUUtOTk5OTkgICAgICAgLT4gICAwRS0zOTEKK25leHRtMDYxIG5leHRtaW51cyAgMUUtOTk5OTk5OTk5ICAgLT4gICAwRS0zOTEKK25leHRtMDYyIG5leHRtaW51cyAgMUUtMzkxICAgICAgICAgLT4gICAwRS0zOTEKK25leHRtMDYzIG5leHRtaW51cyAtMUUtOTk5OTkgICAgICAgLT4gIC0xRS0zOTEKK25leHRtMDY0IG5leHRtaW51cyAtMUUtOTk5OTk5OTk5ICAgLT4gIC0xRS0zOTEKK25leHRtMDY1IG5leHRtaW51cyAtMUUtMzkxICAgICAgICAgLT4gIC0yRS0zOTEKKworLS0gWmVyb3MKK25leHRtMTAwIG5leHRtaW51cyAtMCAgICAgICAgICAgLT4gLTFFLTM5MQorbmV4dG0xMDEgbmV4dG1pbnVzICAwICAgICAgICAgICAtPiAtMUUtMzkxCituZXh0bTEwMiBuZXh0bWludXMgIDAuMDAgICAgICAgIC0+IC0xRS0zOTEKK25leHRtMTAzIG5leHRtaW51cyAtMC4wMCAgICAgICAgLT4gLTFFLTM5MQorbmV4dG0xMDQgbmV4dG1pbnVzICAwRS0zMDAgICAgICAtPiAtMUUtMzkxCituZXh0bTEwNSBuZXh0bWludXMgIDBFKzMwMCAgICAgIC0+IC0xRS0zOTEKK25leHRtMTA2IG5leHRtaW51cyAgMEUrMzAwMDAgICAgLT4gLTFFLTM5MQorbmV4dG0xMDcgbmV4dG1pbnVzIC0wRSszMDAwMCAgICAtPiAtMUUtMzkxCisKK3ByZWNpc2lvbjogOQorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKKy0tIHNwZWNpYWxzCituZXh0bTE1MCBuZXh0bWludXMgICBJbmYgICAgLT4gIDkuOTk5OTk5OTlFKzk5OQorbmV4dG0xNTEgbmV4dG1pbnVzICAtSW5mICAgIC0+IC1JbmZpbml0eQorbmV4dG0xNTIgbmV4dG1pbnVzICAgTmFOICAgIC0+ICBOYU4KK25leHRtMTUzIG5leHRtaW51cyAgc05hTiAgICAtPiAgTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK25leHRtMTU0IG5leHRtaW51cyAgIE5hTjc3ICAtPiAgTmFONzcKK25leHRtMTU1IG5leHRtaW51cyAgc05hTjg4ICAtPiAgTmFOODggSW52YWxpZF9vcGVyYXRpb24KK25leHRtMTU2IG5leHRtaW51cyAgLU5hTiAgICAtPiAtTmFOCituZXh0bTE1NyBuZXh0bWludXMgLXNOYU4gICAgLT4gLU5hTiAgIEludmFsaWRfb3BlcmF0aW9uCituZXh0bTE1OCBuZXh0bWludXMgIC1OYU43NyAgLT4gLU5hTjc3CituZXh0bTE1OSBuZXh0bWludXMgLXNOYU44OCAgLT4gLU5hTjg4IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5tYXgsIE5taW4sIE50aW55LCBzdWJub3JtYWxzCituZXh0bTE3MCBuZXh0bWludXMgIDkuOTk5OTk5OTlFKzk5OSAgIC0+IDkuOTk5OTk5OThFKzk5OQorbmV4dG0xNzEgbmV4dG1pbnVzICA5Ljk5OTk5OTk4RSs5OTkgICAtPiA5Ljk5OTk5OTk3RSs5OTkKK25leHRtMTcyIG5leHRtaW51cyAgMUUtOTk5ICAgICAgICAgICAgLT4gOS45OTk5OTk5RS0xMDAwCituZXh0bTE3MyBuZXh0bWludXMgIDEuMDAwMDAwMDBFLTk5OSAgIC0+IDkuOTk5OTk5OUUtMTAwMAorbmV4dG0xNzQgbmV4dG1pbnVzICA5RS0xMDA3ICAgICAgICAgICAtPiA4RS0xMDA3CituZXh0bTE3NSBuZXh0bWludXMgIDkuOUUtMTAwNiAgICAgICAgIC0+IDkuOEUtMTAwNgorbmV4dG0xNzYgbmV4dG1pbnVzICA5Ljk5OTlFLTEwMDMgICAgICAtPiA5Ljk5OThFLTEwMDMKK25leHRtMTc3IG5leHRtaW51cyAgOS45OTk5OTk5RS0xMDAwICAgLT4gOS45OTk5OTk4RS0xMDAwCituZXh0bTE3OCBuZXh0bWludXMgIDkuOTk5OTk5OEUtMTAwMCAgIC0+IDkuOTk5OTk5N0UtMTAwMAorbmV4dG0xNzkgbmV4dG1pbnVzICA5Ljk5OTk5OTdFLTEwMDAgICAtPiA5Ljk5OTk5OTZFLTEwMDAKK25leHRtMTgwIG5leHRtaW51cyAgMEUtMTAwNyAgICAgICAgICAgLT4gLTFFLTEwMDcKK25leHRtMTgxIG5leHRtaW51cyAgMUUtMTAwNyAgICAgICAgICAgLT4gMEUtMTAwNworbmV4dG0xODIgbmV4dG1pbnVzICAyRS0xMDA3ICAgICAgICAgICAtPiAxRS0xMDA3CisKK25leHRtMTgzIG5leHRtaW51cyAgLTBFLTEwMDcgICAgICAgICAgLT4gLTFFLTEwMDcKK25leHRtMTg0IG5leHRtaW51cyAgLTFFLTEwMDcgICAgICAgICAgLT4gLTJFLTEwMDcKK25leHRtMTg1IG5leHRtaW51cyAgLTJFLTEwMDcgICAgICAgICAgLT4gLTNFLTEwMDcKK25leHRtMTg2IG5leHRtaW51cyAgLTEwRS0xMDA3ICAgICAgICAgLT4gLTEuMUUtMTAwNgorbmV4dG0xODcgbmV4dG1pbnVzICAtMTAwRS0xMDA3ICAgICAgICAtPiAtMS4wMUUtMTAwNQorbmV4dG0xODggbmV4dG1pbnVzICAtMTAwMDAwRS0xMDA3ICAgICAtPiAtMS4wMDAwMUUtMTAwMgorbmV4dG0xODkgbmV4dG1pbnVzICAtMS4wMDAwRS05OTkgICAgICAtPiAtMS4wMDAwMDAwMUUtOTk5CituZXh0bTE5MCBuZXh0bWludXMgIC0xLjAwMDAwMDAwRS05OTkgIC0+IC0xLjAwMDAwMDAxRS05OTkKK25leHRtMTkxIG5leHRtaW51cyAgLTFFLTk5OSAgICAgICAgICAgLT4gLTEuMDAwMDAwMDFFLTk5OQorbmV4dG0xOTIgbmV4dG1pbnVzICAtOS45OTk5OTk5OEUrOTk5ICAtPiAtOS45OTk5OTk5OUUrOTk5CituZXh0bTE5MyBuZXh0bWludXMgIC05Ljk5OTk5OTk5RSs5OTkgIC0+IC1JbmZpbml0eQorCistLSBOdWxsIHRlc3RzCituZXh0bTkwMCBuZXh0bWludXMgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbmV4dHBsdXMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbmV4dHBsdXMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjZlMzI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9uZXh0cGx1cy5kZWNUZXN0CkBAIC0wLDAgKzEsMTUwIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIG5leHRwbHVzLmRlY1Rlc3QgLS0gZGVjaW1hbCBuZXh0IHRoYXQgaXMgZ3JlYXRlciBbNzU0ciBuZXh0dXBdICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworbmV4dHAwMDEgbmV4dHBsdXMgIDAuOTk5OTk5OTk1IC0+ICAgMC45OTk5OTk5OTYKK25leHRwMDAyIG5leHRwbHVzICAwLjk5OTk5OTk5NiAtPiAgIDAuOTk5OTk5OTk3CituZXh0cDAwMyBuZXh0cGx1cyAgMC45OTk5OTk5OTcgLT4gICAwLjk5OTk5OTk5OAorbmV4dHAwMDQgbmV4dHBsdXMgIDAuOTk5OTk5OTk4IC0+ICAgMC45OTk5OTk5OTkKK25leHRwMDA1IG5leHRwbHVzICAwLjk5OTk5OTk5OSAtPiAgIDEuMDAwMDAwMDAKK25leHRwMDA2IG5leHRwbHVzICAxLjAwMDAwMDAwICAtPiAgIDEuMDAwMDAwMDEKK25leHRwMDA3IG5leHRwbHVzICAxLjAgICAgICAgICAtPiAgIDEuMDAwMDAwMDEKK25leHRwMDA4IG5leHRwbHVzICAxICAgICAgICAgICAtPiAgIDEuMDAwMDAwMDEKK25leHRwMDA5IG5leHRwbHVzICAxLjAwMDAwMDAxICAtPiAgIDEuMDAwMDAwMDIKK25leHRwMDEwIG5leHRwbHVzICAxLjAwMDAwMDAyICAtPiAgIDEuMDAwMDAwMDMKK25leHRwMDExIG5leHRwbHVzICAxLjAwMDAwMDAzICAtPiAgIDEuMDAwMDAwMDQKK25leHRwMDEyIG5leHRwbHVzICAxLjAwMDAwMDA0ICAtPiAgIDEuMDAwMDAwMDUKK25leHRwMDEzIG5leHRwbHVzICAxLjAwMDAwMDA1ICAtPiAgIDEuMDAwMDAwMDYKK25leHRwMDE0IG5leHRwbHVzICAxLjAwMDAwMDA2ICAtPiAgIDEuMDAwMDAwMDcKK25leHRwMDE1IG5leHRwbHVzICAxLjAwMDAwMDA3ICAtPiAgIDEuMDAwMDAwMDgKK25leHRwMDE2IG5leHRwbHVzICAxLjAwMDAwMDA4ICAtPiAgIDEuMDAwMDAwMDkKK25leHRwMDE3IG5leHRwbHVzICAxLjAwMDAwMDA5ICAtPiAgIDEuMDAwMDAwMTAKK25leHRwMDE4IG5leHRwbHVzICAxLjAwMDAwMDEwICAtPiAgIDEuMDAwMDAwMTEKK25leHRwMDE5IG5leHRwbHVzICAxLjAwMDAwMDExICAtPiAgIDEuMDAwMDAwMTIKKworbmV4dHAwMjEgbmV4dHBsdXMgLTAuOTk5OTk5OTk1IC0+ICAtMC45OTk5OTk5OTQKK25leHRwMDIyIG5leHRwbHVzIC0wLjk5OTk5OTk5NiAtPiAgLTAuOTk5OTk5OTk1CituZXh0cDAyMyBuZXh0cGx1cyAtMC45OTk5OTk5OTcgLT4gIC0wLjk5OTk5OTk5NgorbmV4dHAwMjQgbmV4dHBsdXMgLTAuOTk5OTk5OTk4IC0+ICAtMC45OTk5OTk5OTcKK25leHRwMDI1IG5leHRwbHVzIC0wLjk5OTk5OTk5OSAtPiAgLTAuOTk5OTk5OTk4CituZXh0cDAyNiBuZXh0cGx1cyAtMS4wMDAwMDAwMCAgLT4gIC0wLjk5OTk5OTk5OQorbmV4dHAwMjcgbmV4dHBsdXMgLTEuMCAgICAgICAgIC0+ICAtMC45OTk5OTk5OTkKK25leHRwMDI4IG5leHRwbHVzIC0xICAgICAgICAgICAtPiAgLTAuOTk5OTk5OTk5CituZXh0cDAyOSBuZXh0cGx1cyAtMS4wMDAwMDAwMSAgLT4gIC0xLjAwMDAwMDAwCituZXh0cDAzMCBuZXh0cGx1cyAtMS4wMDAwMDAwMiAgLT4gIC0xLjAwMDAwMDAxCituZXh0cDAzMSBuZXh0cGx1cyAtMS4wMDAwMDAwMyAgLT4gIC0xLjAwMDAwMDAyCituZXh0cDAzMiBuZXh0cGx1cyAtMS4wMDAwMDAwNCAgLT4gIC0xLjAwMDAwMDAzCituZXh0cDAzMyBuZXh0cGx1cyAtMS4wMDAwMDAwNSAgLT4gIC0xLjAwMDAwMDA0CituZXh0cDAzNCBuZXh0cGx1cyAtMS4wMDAwMDAwNiAgLT4gIC0xLjAwMDAwMDA1CituZXh0cDAzNSBuZXh0cGx1cyAtMS4wMDAwMDAwNyAgLT4gIC0xLjAwMDAwMDA2CituZXh0cDAzNiBuZXh0cGx1cyAtMS4wMDAwMDAwOCAgLT4gIC0xLjAwMDAwMDA3CituZXh0cDAzNyBuZXh0cGx1cyAtMS4wMDAwMDAwOSAgLT4gIC0xLjAwMDAwMDA4CituZXh0cDAzOCBuZXh0cGx1cyAtMS4wMDAwMDAxMCAgLT4gIC0xLjAwMDAwMDA5CituZXh0cDAzOSBuZXh0cGx1cyAtMS4wMDAwMDAxMSAgLT4gIC0xLjAwMDAwMDEwCituZXh0cDA0MCBuZXh0cGx1cyAtMS4wMDAwMDAxMiAgLT4gIC0xLjAwMDAwMDExCisKKy0tIGlucHV0IG9wZXJhbmQgaXMgPnByZWNpc2lvbgorbmV4dHAwNDEgbmV4dHBsdXMgIDEuMDAwMDAwMTA5OTggIC0+ICAgMS4wMDAwMDAxMQorbmV4dHAwNDIgbmV4dHBsdXMgIDEuMDAwMDAwMTA5OTkgIC0+ICAgMS4wMDAwMDAxMQorbmV4dHAwNDMgbmV4dHBsdXMgIDEuMDAwMDAwMTEwMDAgIC0+ICAgMS4wMDAwMDAxMgorbmV4dHAwNDQgbmV4dHBsdXMgIDEuMDAwMDAwMTEwMDEgIC0+ICAgMS4wMDAwMDAxMgorbmV4dHAwNDUgbmV4dHBsdXMgIDEuMDAwMDAwMTEwMDIgIC0+ICAgMS4wMDAwMDAxMgorbmV4dHAwNDYgbmV4dHBsdXMgIDEuMDAwMDAwMTEwMDIgIC0+ICAgMS4wMDAwMDAxMgorbmV4dHAwNDcgbmV4dHBsdXMgIDEuMDAwMDAwMTEwNTIgIC0+ICAgMS4wMDAwMDAxMgorbmV4dHAwNDggbmV4dHBsdXMgIDEuMDAwMDAwMTE1NTIgIC0+ICAgMS4wMDAwMDAxMgorbmV4dHAwNDkgbmV4dHBsdXMgLTEuMDAwMDAwMTA5OTggIC0+ICAtMS4wMDAwMDAxMAorbmV4dHAwNTAgbmV4dHBsdXMgLTEuMDAwMDAwMTA5OTkgIC0+ICAtMS4wMDAwMDAxMAorbmV4dHAwNTEgbmV4dHBsdXMgLTEuMDAwMDAwMTEwMDAgIC0+ICAtMS4wMDAwMDAxMAorbmV4dHAwNTIgbmV4dHBsdXMgLTEuMDAwMDAwMTEwMDEgIC0+ICAtMS4wMDAwMDAxMQorbmV4dHAwNTMgbmV4dHBsdXMgLTEuMDAwMDAwMTEwMDIgIC0+ICAtMS4wMDAwMDAxMQorbmV4dHAwNTQgbmV4dHBsdXMgLTEuMDAwMDAwMTEwMDIgIC0+ICAtMS4wMDAwMDAxMQorbmV4dHAwNTUgbmV4dHBsdXMgLTEuMDAwMDAwMTEwNTIgIC0+ICAtMS4wMDAwMDAxMQorbmV4dHAwNTYgbmV4dHBsdXMgLTEuMDAwMDAwMTE1NTIgIC0+ICAtMS4wMDAwMDAxMQorLS0gdWx0cmEtdGlueSBpbnB1dHMKK25leHRwMDYwIG5leHRwbHVzICAxRS05OTk5OSAgICAgICAtPiAgIDFFLTM5MQorbmV4dHAwNjEgbmV4dHBsdXMgIDFFLTk5OTk5OTk5OSAgIC0+ICAgMUUtMzkxCituZXh0cDA2MiBuZXh0cGx1cyAgMUUtMzkxICAgICAgICAgLT4gICAyRS0zOTEKK25leHRwMDYzIG5leHRwbHVzIC0xRS05OTk5OSAgICAgICAtPiAgLTBFLTM5MQorbmV4dHAwNjQgbmV4dHBsdXMgLTFFLTk5OTk5OTk5OSAgIC0+ICAtMEUtMzkxCituZXh0cDA2NSBuZXh0cGx1cyAtMUUtMzkxICAgICAgICAgLT4gIC0wRS0zOTEKKworLS0gWmVyb3MKK25leHRwMTAwIG5leHRwbHVzICAwICAgICAgICAgICAtPiAgMUUtMzkxCituZXh0cDEwMSBuZXh0cGx1cyAgMC4wMCAgICAgICAgLT4gIDFFLTM5MQorbmV4dHAxMDIgbmV4dHBsdXMgIDBFLTMwMCAgICAgIC0+ICAxRS0zOTEKK25leHRwMTAzIG5leHRwbHVzICAwRSszMDAgICAgICAtPiAgMUUtMzkxCituZXh0cDEwNCBuZXh0cGx1cyAgMEUrMzAwMDAgICAgLT4gIDFFLTM5MQorbmV4dHAxMDUgbmV4dHBsdXMgLTAgICAgICAgICAgIC0+ICAxRS0zOTEKK25leHRwMTA2IG5leHRwbHVzIC0wLjAwICAgICAgICAtPiAgMUUtMzkxCituZXh0cDEwNyBuZXh0cGx1cyAtMEUtMzAwICAgICAgLT4gIDFFLTM5MQorbmV4dHAxMDggbmV4dHBsdXMgLTBFKzMwMCAgICAgIC0+ICAxRS0zOTEKK25leHRwMTA5IG5leHRwbHVzIC0wRSszMDAwMCAgICAtPiAgMUUtMzkxCisKK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKKy0tIHNwZWNpYWxzCituZXh0cDE1MCBuZXh0cGx1cyAgIEluZiAgICAtPiAgSW5maW5pdHkKK25leHRwMTUxIG5leHRwbHVzICAtSW5mICAgIC0+IC05Ljk5OTk5OTk5RSs5OTkKK25leHRwMTUyIG5leHRwbHVzICAgTmFOICAgIC0+ICBOYU4KK25leHRwMTUzIG5leHRwbHVzICBzTmFOICAgIC0+ICBOYU4gICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHAxNTQgbmV4dHBsdXMgICBOYU43NyAgLT4gIE5hTjc3CituZXh0cDE1NSBuZXh0cGx1cyAgc05hTjg4ICAtPiAgTmFOODggSW52YWxpZF9vcGVyYXRpb24KK25leHRwMTU2IG5leHRwbHVzICAtTmFOICAgIC0+IC1OYU4KK25leHRwMTU3IG5leHRwbHVzIC1zTmFOICAgIC0+IC1OYU4gICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHAxNTggbmV4dHBsdXMgIC1OYU43NyAgLT4gLU5hTjc3CituZXh0cDE1OSBuZXh0cGx1cyAtc05hTjg4ICAtPiAtTmFOODggSW52YWxpZF9vcGVyYXRpb24KKworLS0gTm1heCwgTm1pbiwgTnRpbnksIHN1Ym5vcm1hbHMKK25leHRwMTcwIG5leHRwbHVzICA5Ljk5OTk5OTk5RSs5OTkgICAtPiBJbmZpbml0eQorbmV4dHAxNzEgbmV4dHBsdXMgIDkuOTk5OTk5OThFKzk5OSAgIC0+IDkuOTk5OTk5OTlFKzk5OQorbmV4dHAxNzIgbmV4dHBsdXMgIDFFLTk5OSAgICAgICAgICAgIC0+IDEuMDAwMDAwMDFFLTk5OQorbmV4dHAxNzMgbmV4dHBsdXMgIDEuMDAwMDAwMDBFLTk5OSAgIC0+IDEuMDAwMDAwMDFFLTk5OQorbmV4dHAxNzQgbmV4dHBsdXMgIDlFLTEwMDcgICAgICAgICAgIC0+IDEuMEUtMTAwNgorbmV4dHAxNzUgbmV4dHBsdXMgIDkuOUUtMTAwNiAgICAgICAgIC0+IDEuMDBFLTEwMDUKK25leHRwMTc2IG5leHRwbHVzICA5Ljk5OTlFLTEwMDMgICAgICAtPiAxLjAwMDAwRS0xMDAyCituZXh0cDE3NyBuZXh0cGx1cyAgOS45OTk5OTk5RS0xMDAwICAgLT4gMS4wMDAwMDAwMEUtOTk5CituZXh0cDE3OCBuZXh0cGx1cyAgOS45OTk5OTk4RS0xMDAwICAgLT4gOS45OTk5OTk5RS0xMDAwCituZXh0cDE3OSBuZXh0cGx1cyAgOS45OTk5OTk3RS0xMDAwICAgLT4gOS45OTk5OTk4RS0xMDAwCituZXh0cDE4MCBuZXh0cGx1cyAgMEUtMTAwNyAgICAgICAgICAgLT4gMUUtMTAwNworbmV4dHAxODEgbmV4dHBsdXMgIDFFLTEwMDcgICAgICAgICAgIC0+IDJFLTEwMDcKK25leHRwMTgyIG5leHRwbHVzICAyRS0xMDA3ICAgICAgICAgICAtPiAzRS0xMDA3CisKK25leHRwMTgzIG5leHRwbHVzICAtMEUtMTAwNyAgICAgICAgICAtPiAgMUUtMTAwNworbmV4dHAxODQgbmV4dHBsdXMgIC0xRS0xMDA3ICAgICAgICAgIC0+IC0wRS0xMDA3CituZXh0cDE4NSBuZXh0cGx1cyAgLTJFLTEwMDcgICAgICAgICAgLT4gLTFFLTEwMDcKK25leHRwMTg2IG5leHRwbHVzICAtMTBFLTEwMDcgICAgICAgICAtPiAtOUUtMTAwNworbmV4dHAxODcgbmV4dHBsdXMgIC0xMDBFLTEwMDcgICAgICAgIC0+IC05LjlFLTEwMDYKK25leHRwMTg4IG5leHRwbHVzICAtMTAwMDAwRS0xMDA3ICAgICAtPiAtOS45OTk5RS0xMDAzCituZXh0cDE4OSBuZXh0cGx1cyAgLTEuMDAwMEUtOTk5ICAgICAgLT4gLTkuOTk5OTk5OUUtMTAwMAorbmV4dHAxOTAgbmV4dHBsdXMgIC0xLjAwMDAwMDAwRS05OTkgIC0+IC05Ljk5OTk5OTlFLTEwMDAKK25leHRwMTkxIG5leHRwbHVzICAtMUUtOTk5ICAgICAgICAgICAtPiAtOS45OTk5OTk5RS0xMDAwCituZXh0cDE5MiBuZXh0cGx1cyAgLTkuOTk5OTk5OThFKzk5OSAgLT4gLTkuOTk5OTk5OTdFKzk5OQorbmV4dHAxOTMgbmV4dHBsdXMgIC05Ljk5OTk5OTk5RSs5OTkgIC0+IC05Ljk5OTk5OTk4RSs5OTkKKworLS0gTnVsbCB0ZXN0cworbmV4dHA5MDAgbmV4dHBsdXMgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbmV4dHRvd2FyZC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9uZXh0dG93YXJkLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyMzg1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbmV4dHRvd2FyZC5kZWNUZXN0CkBAIC0wLDAgKzEsNDI2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIG5leHR0b3dhcmQuZGVjVGVzdCAtLSBkZWNpbWFsIG5leHQgdG93YXJkIHJocyBbNzU0ciBuZXh0YWZ0ZXJdICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworLS0gU2FuaXR5IGNoZWNrIHdpdGggYSBzY2F0dGVyaW5nIG9mIG51bWVyaWNzCituZXh0dDAwMSBuZXh0dG93YXJkICAgMTAgICAgMTAgICAtPiAgMTAKK25leHR0MDAyIG5leHR0b3dhcmQgIC0xMCAgIC0xMCAgIC0+IC0xMAorbmV4dHQwMDMgbmV4dHRvd2FyZCAgIDEgICAgIDEwICAgLT4gIDEuMDAwMDAwMDEKK25leHR0MDA0IG5leHR0b3dhcmQgICAxICAgIC0xMCAgIC0+ICAwLjk5OTk5OTk5OQorbmV4dHQwMDUgbmV4dHRvd2FyZCAgLTEgICAgIDEwICAgLT4gLTAuOTk5OTk5OTk5CituZXh0dDAwNiBuZXh0dG93YXJkICAtMSAgICAtMTAgICAtPiAtMS4wMDAwMDAwMQorbmV4dHQwMDcgbmV4dHRvd2FyZCAgIDAgICAgIDEwICAgLT4gIDFFLTM5MSAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQwMDggbmV4dHRvd2FyZCAgIDAgICAgLTEwICAgLT4gLTFFLTM5MSAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQwMDkgbmV4dHRvd2FyZCAgIDkuOTk5OTk5OTlFKzM4NCArSW5maW5pdHkgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbmV4dHQwMTAgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTlFKzM4NCAtSW5maW5pdHkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLS0tLS0tIGxocz1yaHMKKy0tIGZpbml0ZXMKK25leHR0MTAxIG5leHR0b3dhcmQgICAgICAgICAgNyAgICAgICA3IC0+ICA3CituZXh0dDEwMiBuZXh0dG93YXJkICAgICAgICAgLTcgICAgICAtNyAtPiAtNworbmV4dHQxMDMgbmV4dHRvd2FyZCAgICAgICAgIDc1ICAgICAgNzUgLT4gIDc1CituZXh0dDEwNCBuZXh0dG93YXJkICAgICAgICAtNzUgICAgIC03NSAtPiAtNzUKK25leHR0MTA1IG5leHR0b3dhcmQgICAgICAgNy41MCAgICAgNy41IC0+ICA3LjUwCituZXh0dDEwNiBuZXh0dG93YXJkICAgICAgLTcuNTAgICAtNy41MCAtPiAtNy41MAorbmV4dHQxMDcgbmV4dHRvd2FyZCAgICAgICA3LjUwMCA3LjUwMDAgLT4gIDcuNTAwCituZXh0dDEwOCBuZXh0dG93YXJkICAgICAgLTcuNTAwICAgLTcuNSAtPiAtNy41MDAKKworLS0gemVyb3MKK25leHR0MTExIG5leHR0b3dhcmQgICAgICAgICAgMCAgICAgICAwIC0+ICAwCituZXh0dDExMiBuZXh0dG93YXJkICAgICAgICAgLTAgICAgICAtMCAtPiAtMAorbmV4dHQxMTMgbmV4dHRvd2FyZCAgICAgICAwRSs0ICAgICAgIDAgLT4gIDBFKzQKK25leHR0MTE0IG5leHR0b3dhcmQgICAgICAtMEUrNCAgICAgIC0wIC0+IC0wRSs0CituZXh0dDExNSBuZXh0dG93YXJkICAgICAwLjAwMDAgMC4wMDAwMCAtPiAgMC4wMDAwCituZXh0dDExNiBuZXh0dG93YXJkICAgIC0wLjAwMDAgICAtMC4wMCAtPiAtMC4wMDAwCituZXh0dDExNyBuZXh0dG93YXJkICAgICAgMEUtMTQxICAgICAgMCAtPiAgMEUtMTQxCituZXh0dDExOCBuZXh0dG93YXJkICAgICAtMEUtMTQxICAgLTAwMCAtPiAtMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCituZXh0dDEyMSBuZXh0dG93YXJkICAgMjY4MjY4MjY4ICAgIDI2ODI2ODI2OCAtPiAgIDI2ODI2ODI2OAorbmV4dHQxMjIgbmV4dHRvd2FyZCAgLTI2ODI2ODI2OCAgIC0yNjgyNjgyNjggLT4gIC0yNjgyNjgyNjgKK25leHR0MTIzIG5leHR0b3dhcmQgICAxMzQxMzQxMzQgICAgMTM0MTM0MTM0IC0+ICAgMTM0MTM0MTM0CituZXh0dDEyNCBuZXh0dG93YXJkICAtMTM0MTM0MTM0ICAgLTEzNDEzNDEzNCAtPiAgLTEzNDEzNDEzNAorCistLSBObWF4LCBObWluLCBOdGlueQorbmV4dHQxMzEgbmV4dHRvd2FyZCAgOS45OTk5OTk5OUUrMzg0ICA5Ljk5OTk5OTk5RSszODQgICAtPiAgIDkuOTk5OTk5OTlFKzM4NAorbmV4dHQxMzIgbmV4dHRvd2FyZCAgMUUtMzgzICAgICAgICAgICAxRS0zODMgICAgICAgICAgICAtPiAgIDFFLTM4MworbmV4dHQxMzMgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMEUtMzgzICAxLjAwMDAwMDAwRS0zODMgICAtPiAgIDEuMDAwMDAwMDBFLTM4MworbmV4dHQxMzQgbmV4dHRvd2FyZCAgMUUtMzkxICAgICAgICAgICAxRS0zOTEgICAgICAgICAgICAtPiAgIDFFLTM5MQorCituZXh0dDEzNSBuZXh0dG93YXJkICAtMUUtMzkxICAgICAgICAgIC0xRS0zOTEgICAgICAgICAgIC0+ICAtMUUtMzkxCituZXh0dDEzNiBuZXh0dG93YXJkICAtMS4wMDAwMDAwMEUtMzgzIC0xLjAwMDAwMDAwRS0zODMgIC0+ICAtMS4wMDAwMDAwMEUtMzgzCituZXh0dDEzNyBuZXh0dG93YXJkICAtMUUtMzgzICAgICAgICAgIC0xRS0zODMgICAgICAgICAgIC0+ICAtMUUtMzgzCituZXh0dDEzOCBuZXh0dG93YXJkICAtOS45OTk5OTk5OUUrMzg0IC05Ljk5OTk5OTk5RSszODQgIC0+ICAtOS45OTk5OTk5OUUrMzg0CisKKy0tLS0tLS0gbGhzPHJocworbmV4dHQyMDEgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTUgSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5NgorbmV4dHQyMDIgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTYgSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5NworbmV4dHQyMDMgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTcgSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OAorbmV4dHQyMDQgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTggSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OQorbmV4dHQyMDUgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTkgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwCituZXh0dDIwNiBuZXh0dG93YXJkICAxLjAwMDAwMDAwICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDEKK25leHR0MjA3IG5leHR0b3dhcmQgIDEuMCAgICAgICAgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMQorbmV4dHQyMDggbmV4dHRvd2FyZCAgMSAgICAgICAgICAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAxCituZXh0dDIwOSBuZXh0dG93YXJkICAxLjAwMDAwMDAxICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDIKK25leHR0MjEwIG5leHR0b3dhcmQgIDEuMDAwMDAwMDIgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMworbmV4dHQyMTEgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMyAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDA0CituZXh0dDIxMiBuZXh0dG93YXJkICAxLjAwMDAwMDA0ICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDUKK25leHR0MjEzIG5leHR0b3dhcmQgIDEuMDAwMDAwMDUgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwNgorbmV4dHQyMTQgbmV4dHRvd2FyZCAgMS4wMDAwMDAwNiAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDA3CituZXh0dDIxNSBuZXh0dG93YXJkICAxLjAwMDAwMDA3ICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDgKK25leHR0MjE2IG5leHR0b3dhcmQgIDEuMDAwMDAwMDggIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwOQorbmV4dHQyMTcgbmV4dHRvd2FyZCAgMS4wMDAwMDAwOSAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDEwCituZXh0dDIxOCBuZXh0dG93YXJkICAxLjAwMDAwMDEwICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMTEKK25leHR0MjE5IG5leHR0b3dhcmQgIDEuMDAwMDAwMTEgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAxMgorCituZXh0dDIyMSBuZXh0dG93YXJkIC0wLjk5OTk5OTk5NSBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk0CituZXh0dDIyMiBuZXh0dG93YXJkIC0wLjk5OTk5OTk5NiBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk1CituZXh0dDIyMyBuZXh0dG93YXJkIC0wLjk5OTk5OTk5NyBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk2CituZXh0dDIyNCBuZXh0dG93YXJkIC0wLjk5OTk5OTk5OCBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk3CituZXh0dDIyNSBuZXh0dG93YXJkIC0wLjk5OTk5OTk5OSBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk4CituZXh0dDIyNiBuZXh0dG93YXJkIC0xLjAwMDAwMDAwICBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5CituZXh0dDIyNyBuZXh0dG93YXJkIC0xLjAgICAgICAgICBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5CituZXh0dDIyOCBuZXh0dG93YXJkIC0xICAgICAgICAgICBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5CituZXh0dDIyOSBuZXh0dG93YXJkIC0xLjAwMDAwMDAxICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAKK25leHR0MjMwIG5leHR0b3dhcmQgLTEuMDAwMDAwMDIgIEluZmluaXR5IC0+ICAtMS4wMDAwMDAwMQorbmV4dHQyMzEgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMyAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAyCituZXh0dDIzMiBuZXh0dG93YXJkIC0xLjAwMDAwMDA0ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDMKK25leHR0MjMzIG5leHR0b3dhcmQgLTEuMDAwMDAwMDUgIEluZmluaXR5IC0+ICAtMS4wMDAwMDAwNAorbmV4dHQyMzQgbmV4dHRvd2FyZCAtMS4wMDAwMDAwNiAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDA1CituZXh0dDIzNSBuZXh0dG93YXJkIC0xLjAwMDAwMDA3ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDYKK25leHR0MjM2IG5leHR0b3dhcmQgLTEuMDAwMDAwMDggIEluZmluaXR5IC0+ICAtMS4wMDAwMDAwNworbmV4dHQyMzcgbmV4dHRvd2FyZCAtMS4wMDAwMDAwOSAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDA4CituZXh0dDIzOCBuZXh0dG93YXJkIC0xLjAwMDAwMDEwICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDkKK25leHR0MjM5IG5leHR0b3dhcmQgLTEuMDAwMDAwMTEgIEluZmluaXR5IC0+ICAtMS4wMDAwMDAxMAorbmV4dHQyNDAgbmV4dHRvd2FyZCAtMS4wMDAwMDAxMiAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDExCisKKy0tIGlucHV0IG9wZXJhbmQgaXMgPnByZWNpc2lvbgorbmV4dHQyNDEgbmV4dHRvd2FyZCAgMS4wMDAwMDAxMDk5OCAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDExCituZXh0dDI0MiBuZXh0dG93YXJkICAxLjAwMDAwMDEwOTk5ICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMTEKK25leHR0MjQzIG5leHR0b3dhcmQgIDEuMDAwMDAwMTEwMDAgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAxMgorbmV4dHQyNDQgbmV4dHRvd2FyZCAgMS4wMDAwMDAxMTAwMSAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDEyCituZXh0dDI0NSBuZXh0dG93YXJkICAxLjAwMDAwMDExMDAyICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMTIKK25leHR0MjQ2IG5leHR0b3dhcmQgIDEuMDAwMDAwMTEwMDIgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAxMgorbmV4dHQyNDcgbmV4dHRvd2FyZCAgMS4wMDAwMDAxMTA1MiAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDEyCituZXh0dDI0OCBuZXh0dG93YXJkICAxLjAwMDAwMDExNTUyICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMTIKK25leHR0MjQ5IG5leHR0b3dhcmQgLTEuMDAwMDAwMTA5OTggIEluZmluaXR5IC0+ICAtMS4wMDAwMDAxMAorbmV4dHQyNTAgbmV4dHRvd2FyZCAtMS4wMDAwMDAxMDk5OSAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDEwCituZXh0dDI1MSBuZXh0dG93YXJkIC0xLjAwMDAwMDExMDAwICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMTAKK25leHR0MjUyIG5leHR0b3dhcmQgLTEuMDAwMDAwMTEwMDEgIEluZmluaXR5IC0+ICAtMS4wMDAwMDAxMQorbmV4dHQyNTMgbmV4dHRvd2FyZCAtMS4wMDAwMDAxMTAwMiAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDExCituZXh0dDI1NCBuZXh0dG93YXJkIC0xLjAwMDAwMDExMDAyICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMTEKK25leHR0MjU1IG5leHR0b3dhcmQgLTEuMDAwMDAwMTEwNTIgIEluZmluaXR5IC0+ICAtMS4wMDAwMDAxMQorbmV4dHQyNTYgbmV4dHRvd2FyZCAtMS4wMDAwMDAxMTU1MiAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDExCistLSB1bHRyYS10aW55IGlucHV0cworbmV4dHQyNjAgbmV4dHRvd2FyZCAgMUUtOTk5OTkgICAgICAgSW5maW5pdHkgLT4gICAxRS0zOTEgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MjYxIG5leHR0b3dhcmQgIDFFLTk5OTk5OTk5OSAgIEluZmluaXR5IC0+ICAgMUUtMzkxICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDI2MiBuZXh0dG93YXJkICAxRS0zOTEgICAgICAgICBJbmZpbml0eSAtPiAgIDJFLTM5MSAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQyNjMgbmV4dHRvd2FyZCAtMUUtOTk5OTkgICAgICAgSW5maW5pdHkgLT4gIC0wRS0zOTEgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorbmV4dHQyNjQgbmV4dHRvd2FyZCAtMUUtOTk5OTk5OTk5ICAgSW5maW5pdHkgLT4gIC0wRS0zOTEgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorbmV4dHQyNjUgbmV4dHRvd2FyZCAtMUUtMzkxICAgICAgICAgSW5maW5pdHkgLT4gIC0wRS0zOTEgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSBaZXJvcworbmV4dHQzMDAgbmV4dHRvd2FyZCAgMCAgICAgICAgICAgSW5maW5pdHkgLT4gIDFFLTM5MSAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzAxIG5leHR0b3dhcmQgIDAuMDAgICAgICAgIEluZmluaXR5IC0+ICAxRS0zOTEgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDMwMiBuZXh0dG93YXJkICAwRS0zMDAgICAgICBJbmZpbml0eSAtPiAgMUUtMzkxICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzMDMgbmV4dHRvd2FyZCAgMEUrMzAwICAgICAgSW5maW5pdHkgLT4gIDFFLTM5MSAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzA0IG5leHR0b3dhcmQgIDBFKzMwMDAwICAgIEluZmluaXR5IC0+ICAxRS0zOTEgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDMwNSBuZXh0dG93YXJkIC0wICAgICAgICAgICBJbmZpbml0eSAtPiAgMUUtMzkxICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzMDYgbmV4dHRvd2FyZCAtMC4wMCAgICAgICAgSW5maW5pdHkgLT4gIDFFLTM5MSAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzA3IG5leHR0b3dhcmQgLTBFLTMwMCAgICAgIEluZmluaXR5IC0+ICAxRS0zOTEgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDMwOCBuZXh0dG93YXJkIC0wRSszMDAgICAgICBJbmZpbml0eSAtPiAgMUUtMzkxICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzMDkgbmV4dHRvd2FyZCAtMEUrMzAwMDAgICAgSW5maW5pdHkgLT4gIDFFLTM5MSAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gc3BlY2lhbHMKK25leHR0MzUwIG5leHR0b3dhcmQgICBJbmYgICAgSW5maW5pdHkgLT4gIEluZmluaXR5CituZXh0dDM1MSBuZXh0dG93YXJkICAtSW5mICAgIEluZmluaXR5IC0+IC05Ljk5OTk5OTk5RSszODQKK25leHR0MzUyIG5leHR0b3dhcmQgICBOYU4gICAgSW5maW5pdHkgLT4gIE5hTgorbmV4dHQzNTMgbmV4dHRvd2FyZCAgc05hTiAgICBJbmZpbml0eSAtPiAgTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0MzU0IG5leHR0b3dhcmQgICBOYU43NyAgSW5maW5pdHkgLT4gIE5hTjc3CituZXh0dDM1NSBuZXh0dG93YXJkICBzTmFOODggIEluZmluaXR5IC0+ICBOYU44OCBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQzNTYgbmV4dHRvd2FyZCAgLU5hTiAgICBJbmZpbml0eSAtPiAtTmFOCituZXh0dDM1NyBuZXh0dG93YXJkIC1zTmFOICAgIEluZmluaXR5IC0+IC1OYU4gICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQzNTggbmV4dHRvd2FyZCAgLU5hTjc3ICBJbmZpbml0eSAtPiAtTmFONzcKK25leHR0MzU5IG5leHR0b3dhcmQgLXNOYU44OCAgSW5maW5pdHkgLT4gLU5hTjg4IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5tYXgsIE5taW4sIE50aW55LCBzdWJub3JtYWxzCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorbmV4dHQzNzAgbmV4dHRvd2FyZCAgOS45OTk5OTk5OUUrOTk5ICAgSW5maW5pdHkgLT4gSW5maW5pdHkgICAgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbmV4dHQzNzEgbmV4dHRvd2FyZCAgOS45OTk5OTk5OEUrOTk5ICAgSW5maW5pdHkgLT4gOS45OTk5OTk5OUUrOTk5CituZXh0dDM3MiBuZXh0dG93YXJkICAxRS05OTkgICAgICAgICAgICBJbmZpbml0eSAtPiAxLjAwMDAwMDAxRS05OTkKK25leHR0MzczIG5leHR0b3dhcmQgIDEuMDAwMDAwMDBFLTk5OSAgIEluZmluaXR5IC0+IDEuMDAwMDAwMDFFLTk5OQorbmV4dHQzNzQgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTlFLTk5OSAgSW5maW5pdHkgLT4gMS4wMDAwMDAwMEUtOTk5CituZXh0dDM3NSBuZXh0dG93YXJkICAwLjk5OTk5OTk5RS05OTkgICBJbmZpbml0eSAtPiAxLjAwMDAwMDAwRS05OTkKK25leHR0Mzc2IG5leHR0b3dhcmQgIDlFLTEwMDcgICAgICAgICAgIEluZmluaXR5IC0+IDEuMEUtMTAwNiAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzNzcgbmV4dHRvd2FyZCAgOS45RS0xMDA2ICAgICAgICAgSW5maW5pdHkgLT4gMS4wMEUtMTAwNSAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDM3OCBuZXh0dG93YXJkICA5Ljk5OTlFLTEwMDMgICAgICBJbmZpbml0eSAtPiAxLjAwMDAwRS0xMDAyICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0Mzc5IG5leHR0b3dhcmQgIDkuOTk5OTk5OEUtMTAwMCAgIEluZmluaXR5IC0+IDkuOTk5OTk5OUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzODAgbmV4dHRvd2FyZCAgOS45OTk5OTk3RS0xMDAwICAgSW5maW5pdHkgLT4gOS45OTk5OTk4RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDM4MSBuZXh0dG93YXJkICAwRS0xMDA3ICAgICAgICAgICBJbmZpbml0eSAtPiAxRS0xMDA3ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzgyIG5leHR0b3dhcmQgIDFFLTEwMDcgICAgICAgICAgIEluZmluaXR5IC0+IDJFLTEwMDcgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzODMgbmV4dHRvd2FyZCAgMkUtMTAwNyAgICAgICAgICAgSW5maW5pdHkgLT4gM0UtMTAwNyAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK25leHR0Mzg1IG5leHR0b3dhcmQgIC0wRS0xMDA3ICAgICAgICAgIEluZmluaXR5IC0+ICAxRS0xMDA3ICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzODYgbmV4dHRvd2FyZCAgLTFFLTEwMDcgICAgICAgICAgSW5maW5pdHkgLT4gLTBFLTEwMDcgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK25leHR0Mzg3IG5leHR0b3dhcmQgIC0yRS0xMDA3ICAgICAgICAgIEluZmluaXR5IC0+IC0xRS0xMDA3ICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzODggbmV4dHRvd2FyZCAgLTEwRS0xMDA3ICAgICAgICAgSW5maW5pdHkgLT4gLTlFLTEwMDcgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDM4OSBuZXh0dG93YXJkICAtMTAwRS0xMDA3ICAgICAgICBJbmZpbml0eSAtPiAtOS45RS0xMDA2ICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzkwIG5leHR0b3dhcmQgIC0xMDAwMDBFLTEwMDcgICAgIEluZmluaXR5IC0+IC05Ljk5OTlFLTEwMDMgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzOTEgbmV4dHRvd2FyZCAgLTEuMDAwMEUtOTk5ICAgICAgSW5maW5pdHkgLT4gLTkuOTk5OTk5OUUtMTAwMCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzkyIG5leHR0b3dhcmQgIC0xLjAwMDAwMDAwRS05OTkgIEluZmluaXR5IC0+IC05Ljk5OTk5OTlFLTEwMDAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDM5MyBuZXh0dG93YXJkICAtMUUtOTk5ICAgICAgICAgICBJbmZpbml0eSAtPiAtOS45OTk5OTk5RS0xMDAwICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzOTQgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OThFKzk5OSAgSW5maW5pdHkgLT4gLTkuOTk5OTk5OTdFKzk5OQorbmV4dHQzOTUgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTlFKzk5OSAgSW5maW5pdHkgLT4gLTkuOTk5OTk5OThFKzk5OQorCistLS0tLS0tIGxocz5yaHMKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCituZXh0dDQwMSBuZXh0dG93YXJkICAwLjk5OTk5OTk5NSAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTQKK25leHR0NDAyIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk2ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5NQorbmV4dHQ0MDMgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTcgIC1JbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk2CituZXh0dDQwNCBuZXh0dG93YXJkICAwLjk5OTk5OTk5OCAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTcKK25leHR0NDA1IG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OAorbmV4dHQ0MDYgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMCAgIC1JbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk5CituZXh0dDQwNyBuZXh0dG93YXJkICAxLjAgICAgICAgICAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTkKK25leHR0NDA4IG5leHR0b3dhcmQgIDEgICAgICAgICAgICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OQorbmV4dHQ0MDkgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMSAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAKK25leHR0NDEwIG5leHR0b3dhcmQgIDEuMDAwMDAwMDIgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAxCituZXh0dDQxMSBuZXh0dG93YXJkICAxLjAwMDAwMDAzICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMgorbmV4dHQ0MTIgbmV4dHRvd2FyZCAgMS4wMDAwMDAwNCAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDMKK25leHR0NDEzIG5leHR0b3dhcmQgIDEuMDAwMDAwMDUgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDA0CituZXh0dDQxNCBuZXh0dG93YXJkICAxLjAwMDAwMDA2ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwNQorbmV4dHQ0MTUgbmV4dHRvd2FyZCAgMS4wMDAwMDAwNyAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDYKK25leHR0NDE2IG5leHR0b3dhcmQgIDEuMDAwMDAwMDggICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDA3CituZXh0dDQxNyBuZXh0dG93YXJkICAxLjAwMDAwMDA5ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwOAorbmV4dHQ0MTggbmV4dHRvd2FyZCAgMS4wMDAwMDAxMCAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDkKK25leHR0NDE5IG5leHR0b3dhcmQgIDEuMDAwMDAwMTEgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDEwCituZXh0dDQyMCBuZXh0dG93YXJkICAxLjAwMDAwMDEyICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAxMQorCituZXh0dDQyMSBuZXh0dG93YXJkIC0wLjk5OTk5OTk5NSAgLUluZmluaXR5IC0+ICAtMC45OTk5OTk5OTYKK25leHR0NDIyIG5leHR0b3dhcmQgLTAuOTk5OTk5OTk2ICAtSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5NworbmV4dHQ0MjMgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTcgIC1JbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk4CituZXh0dDQyNCBuZXh0dG93YXJkIC0wLjk5OTk5OTk5OCAgLUluZmluaXR5IC0+ICAtMC45OTk5OTk5OTkKK25leHR0NDI1IG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5ICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwCituZXh0dDQyNiBuZXh0dG93YXJkIC0xLjAwMDAwMDAwICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMQorbmV4dHQ0MjcgbmV4dHRvd2FyZCAtMS4wICAgICAgICAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDEKK25leHR0NDI4IG5leHR0b3dhcmQgLTEgICAgICAgICAgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAxCituZXh0dDQyOSBuZXh0dG93YXJkIC0xLjAwMDAwMDAxICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMgorbmV4dHQ0MzAgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMiAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDMKK25leHR0NDMxIG5leHR0b3dhcmQgLTEuMDAwMDAwMDMgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDA0CituZXh0dDQzMiBuZXh0dG93YXJkIC0xLjAwMDAwMDA0ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwNQorbmV4dHQ0MzMgbmV4dHRvd2FyZCAtMS4wMDAwMDAwNSAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDYKK25leHR0NDM0IG5leHR0b3dhcmQgLTEuMDAwMDAwMDYgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDA3CituZXh0dDQzNSBuZXh0dG93YXJkIC0xLjAwMDAwMDA3ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwOAorbmV4dHQ0MzYgbmV4dHRvd2FyZCAtMS4wMDAwMDAwOCAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDkKK25leHR0NDM3IG5leHR0b3dhcmQgLTEuMDAwMDAwMDkgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDEwCituZXh0dDQzOCBuZXh0dG93YXJkIC0xLjAwMDAwMDEwICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAxMQorbmV4dHQ0MzkgbmV4dHRvd2FyZCAtMS4wMDAwMDAxMSAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMTIKKworLS0gaW5wdXQgb3BlcmFuZCBpcyA+cHJlY2lzaW9uCituZXh0dDQ0MSBuZXh0dG93YXJkICAxLjAwMDAwMDEwOTk4ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAxMAorbmV4dHQ0NDIgbmV4dHRvd2FyZCAgMS4wMDAwMDAxMDk5OSAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMTAKK25leHR0NDQzIG5leHR0b3dhcmQgIDEuMDAwMDAwMTEwMDAgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDEwCituZXh0dDQ0NCBuZXh0dG93YXJkICAxLjAwMDAwMDExMDAxICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAxMQorbmV4dHQ0NDUgbmV4dHRvd2FyZCAgMS4wMDAwMDAxMTAwMiAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMTEKK25leHR0NDQ2IG5leHR0b3dhcmQgIDEuMDAwMDAwMTEwMDIgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDExCituZXh0dDQ0NyBuZXh0dG93YXJkICAxLjAwMDAwMDExMDUyICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAxMQorbmV4dHQ0NDggbmV4dHRvd2FyZCAgMS4wMDAwMDAxMTU1MiAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMTEKK25leHR0NDQ5IG5leHR0b3dhcmQgLTEuMDAwMDAwMTA5OTggICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDExCituZXh0dDQ1MCBuZXh0dG93YXJkIC0xLjAwMDAwMDEwOTk5ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAxMQorbmV4dHQ0NTEgbmV4dHRvd2FyZCAtMS4wMDAwMDAxMTAwMCAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMTIKK25leHR0NDUyIG5leHR0b3dhcmQgLTEuMDAwMDAwMTEwMDEgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDEyCituZXh0dDQ1MyBuZXh0dG93YXJkIC0xLjAwMDAwMDExMDAyICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAxMgorbmV4dHQ0NTQgbmV4dHRvd2FyZCAtMS4wMDAwMDAxMTAwMiAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMTIKK25leHR0NDU1IG5leHR0b3dhcmQgLTEuMDAwMDAwMTEwNTIgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDEyCituZXh0dDQ1NiBuZXh0dG93YXJkIC0xLjAwMDAwMDExNTUyICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAxMgorLS0gdWx0cmEtdGlueSBpbnB1dHMKK25leHR0NDYwIG5leHR0b3dhcmQgIDFFLTk5OTk5ICAgICAgICAtSW5maW5pdHkgLT4gICAwRS0zOTEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK25leHR0NDYxIG5leHR0b3dhcmQgIDFFLTk5OTk5OTk5OSAgICAtSW5maW5pdHkgLT4gICAwRS0zOTEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK25leHR0NDYyIG5leHR0b3dhcmQgIDFFLTM5MSAgICAgICAgICAtSW5maW5pdHkgLT4gICAwRS0zOTEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK25leHR0NDYzIG5leHR0b3dhcmQgLTFFLTk5OTk5ICAgICAgICAtSW5maW5pdHkgLT4gIC0xRS0zOTEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDQ2NCBuZXh0dG93YXJkIC0xRS05OTk5OTk5OTkgICAgLUluZmluaXR5IC0+ICAtMUUtMzkxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ0NjUgbmV4dHRvd2FyZCAtMUUtMzkxICAgICAgICAgIC1JbmZpbml0eSAtPiAgLTJFLTM5MSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gWmVyb3MKK25leHR0NTAwIG5leHR0b3dhcmQgLTAgICAgICAgICAgICAtSW5maW5pdHkgLT4gLTFFLTM5MSAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDUwMSBuZXh0dG93YXJkICAwICAgICAgICAgICAgLUluZmluaXR5IC0+IC0xRS0zOTEgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1MDIgbmV4dHRvd2FyZCAgMC4wMCAgICAgICAgIC1JbmZpbml0eSAtPiAtMUUtMzkxICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTAzIG5leHR0b3dhcmQgLTAuMDAgICAgICAgICAtSW5maW5pdHkgLT4gLTFFLTM5MSAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDUwNCBuZXh0dG93YXJkICAwRS0zMDAgICAgICAgLUluZmluaXR5IC0+IC0xRS0zOTEgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1MDUgbmV4dHRvd2FyZCAgMEUrMzAwICAgICAgIC1JbmZpbml0eSAtPiAtMUUtMzkxICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTA2IG5leHR0b3dhcmQgIDBFKzMwMDAwICAgICAtSW5maW5pdHkgLT4gLTFFLTM5MSAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDUwNyBuZXh0dG93YXJkIC0wRSszMDAwMCAgICAgLUluZmluaXR5IC0+IC0xRS0zOTEgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1MDggbmV4dHRvd2FyZCAgMC4wMCAgICAgICAgIC0wLjAwMDAgICAtPiAtMC4wMAorCistLSBzcGVjaWFscworbmV4dHQ1NTAgbmV4dHRvd2FyZCAgIEluZiAgICAgLUluZmluaXR5IC0+ICA5Ljk5OTk5OTk5RSszODQKK25leHR0NTUxIG5leHR0b3dhcmQgIC1JbmYgICAgIC1JbmZpbml0eSAtPiAtSW5maW5pdHkKK25leHR0NTUyIG5leHR0b3dhcmQgICBOYU4gICAgIC1JbmZpbml0eSAtPiAgTmFOCituZXh0dDU1MyBuZXh0dG93YXJkICBzTmFOICAgICAtSW5maW5pdHkgLT4gIE5hTiAgIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDU1NCBuZXh0dG93YXJkICAgTmFONzcgICAtSW5maW5pdHkgLT4gIE5hTjc3CituZXh0dDU1NSBuZXh0dG93YXJkICBzTmFOODggICAtSW5maW5pdHkgLT4gIE5hTjg4IEludmFsaWRfb3BlcmF0aW9uCituZXh0dDU1NiBuZXh0dG93YXJkICAtTmFOICAgICAtSW5maW5pdHkgLT4gLU5hTgorbmV4dHQ1NTcgbmV4dHRvd2FyZCAtc05hTiAgICAgLUluZmluaXR5IC0+IC1OYU4gICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ1NTggbmV4dHRvd2FyZCAgLU5hTjc3ICAgLUluZmluaXR5IC0+IC1OYU43NworbmV4dHQ1NTkgbmV4dHRvd2FyZCAtc05hTjg4ICAgLUluZmluaXR5IC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBObWF4LCBObWluLCBOdGlueSwgc3Vibm9ybWFscworbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK25leHR0NTcwIG5leHR0b3dhcmQgIDkuOTk5OTk5OTlFKzk5OSAgICAtSW5maW5pdHkgLT4gOS45OTk5OTk5OEUrOTk5CituZXh0dDU3MSBuZXh0dG93YXJkICA5Ljk5OTk5OTk4RSs5OTkgICAgLUluZmluaXR5IC0+IDkuOTk5OTk5OTdFKzk5OQorbmV4dHQ1NzIgbmV4dHRvd2FyZCAgMUUtOTk5ICAgICAgICAgICAgIC1JbmZpbml0eSAtPiA5Ljk5OTk5OTlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTczIG5leHR0b3dhcmQgIDEuMDAwMDAwMDBFLTk5OSAgICAtSW5maW5pdHkgLT4gOS45OTk5OTk5RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDU3NCBuZXh0dG93YXJkICA5RS0xMDA3ICAgICAgICAgICAgLUluZmluaXR5IC0+IDhFLTEwMDcgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1NzUgbmV4dHRvd2FyZCAgOS45RS0xMDA2ICAgICAgICAgIC1JbmZpbml0eSAtPiA5LjhFLTEwMDYgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTc2IG5leHR0b3dhcmQgIDkuOTk5OUUtMTAwMyAgICAgICAtSW5maW5pdHkgLT4gOS45OTk4RS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDU3NyBuZXh0dG93YXJkICA5Ljk5OTk5OTlFLTEwMDAgICAgLUluZmluaXR5IC0+IDkuOTk5OTk5OEUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1NzggbmV4dHRvd2FyZCAgOS45OTk5OTk4RS0xMDAwICAgIC1JbmZpbml0eSAtPiA5Ljk5OTk5OTdFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTc5IG5leHR0b3dhcmQgIDkuOTk5OTk5N0UtMTAwMCAgICAtSW5maW5pdHkgLT4gOS45OTk5OTk2RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDU4MCBuZXh0dG93YXJkICAwRS0xMDA3ICAgICAgICAgICAgLUluZmluaXR5IC0+IC0xRS0xMDA3ICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1ODEgbmV4dHRvd2FyZCAgMUUtMTAwNyAgICAgICAgICAgIC1JbmZpbml0eSAtPiAwRS0xMDA3ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorbmV4dHQ1ODIgbmV4dHRvd2FyZCAgMkUtMTAwNyAgICAgICAgICAgIC1JbmZpbml0eSAtPiAxRS0xMDA3ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworbmV4dHQ1ODMgbmV4dHRvd2FyZCAgLTBFLTEwMDcgICAgICAgICAgIC1JbmZpbml0eSAtPiAtMUUtMTAwNyAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTg0IG5leHR0b3dhcmQgIC0xRS0xMDA3ICAgICAgICAgICAtSW5maW5pdHkgLT4gLTJFLTEwMDcgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDU4NSBuZXh0dG93YXJkICAtMkUtMTAwNyAgICAgICAgICAgLUluZmluaXR5IC0+IC0zRS0xMDA3ICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1ODYgbmV4dHRvd2FyZCAgLTEwRS0xMDA3ICAgICAgICAgIC1JbmZpbml0eSAtPiAtMS4xRS0xMDA2ICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTg3IG5leHR0b3dhcmQgIC0xMDBFLTEwMDcgICAgICAgICAtSW5maW5pdHkgLT4gLTEuMDFFLTEwMDUgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDU4OCBuZXh0dG93YXJkICAtMTAwMDAwRS0xMDA3ICAgICAgLUluZmluaXR5IC0+IC0xLjAwMDAxRS0xMDAyICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1ODkgbmV4dHRvd2FyZCAgLTEuMDAwMEUtOTk5ICAgICAgIC1JbmZpbml0eSAtPiAtMS4wMDAwMDAwMUUtOTk5CituZXh0dDU5MCBuZXh0dG93YXJkICAtMS4wMDAwMDAwMEUtOTk5ICAgLUluZmluaXR5IC0+IC0xLjAwMDAwMDAxRS05OTkKK25leHR0NTkxIG5leHR0b3dhcmQgIC0xRS05OTkgICAgICAgICAgICAtSW5maW5pdHkgLT4gLTEuMDAwMDAwMDFFLTk5OQorbmV4dHQ1OTIgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OThFKzk5OSAgIC1JbmZpbml0eSAtPiAtOS45OTk5OTk5OUUrOTk5CituZXh0dDU5MyBuZXh0dG93YXJkICAtOS45OTk5OTk5OUUrOTk5ICAgLUluZmluaXR5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworCisKKworLS0tLS0tLSBTcGVjaWFscworbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKK25leHR0NzgwIG5leHR0b3dhcmQgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorbmV4dHQ3ODEgbmV4dHRvd2FyZCAtSW5mICAtMTAwMCAgLT4gLTkuOTk5OTk5OTlFKzM4NAorbmV4dHQ3ODIgbmV4dHRvd2FyZCAtSW5mICAtMSAgICAgLT4gLTkuOTk5OTk5OTlFKzM4NAorbmV4dHQ3ODMgbmV4dHRvd2FyZCAtSW5mICAtMCAgICAgLT4gLTkuOTk5OTk5OTlFKzM4NAorbmV4dHQ3ODQgbmV4dHRvd2FyZCAtSW5mICAgMCAgICAgLT4gLTkuOTk5OTk5OTlFKzM4NAorbmV4dHQ3ODUgbmV4dHRvd2FyZCAtSW5mICAgMSAgICAgLT4gLTkuOTk5OTk5OTlFKzM4NAorbmV4dHQ3ODYgbmV4dHRvd2FyZCAtSW5mICAgMTAwMCAgLT4gLTkuOTk5OTk5OTlFKzM4NAorbmV4dHQ3ODcgbmV4dHRvd2FyZCAtMTAwMCAtSW5mICAgLT4gLTEwMDAuMDAwMDEKK25leHR0Nzg4IG5leHR0b3dhcmQgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorbmV4dHQ3ODkgbmV4dHRvd2FyZCAtMSAgICAtSW5mICAgLT4gLTEuMDAwMDAwMDEKK25leHR0NzkwIG5leHR0b3dhcmQgLTAgICAgLUluZiAgIC0+IC0xRS0zOTEgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDc5MSBuZXh0dG93YXJkICAwICAgIC1JbmYgICAtPiAtMUUtMzkxICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ3OTIgbmV4dHRvd2FyZCAgMSAgICAtSW5mICAgLT4gIDAuOTk5OTk5OTk5CituZXh0dDc5MyBuZXh0dG93YXJkICAxMDAwIC1JbmYgICAtPiAgOTk5Ljk5OTk5OQorbmV4dHQ3OTQgbmV4dHRvd2FyZCAgSW5mICAtSW5mICAgLT4gIDkuOTk5OTk5OTlFKzM4NAorCituZXh0dDgwMCBuZXh0dG93YXJkICBJbmYgIC1JbmYgICAtPiAgOS45OTk5OTk5OUUrMzg0CituZXh0dDgwMSBuZXh0dG93YXJkICBJbmYgIC0xMDAwICAtPiAgOS45OTk5OTk5OUUrMzg0CituZXh0dDgwMiBuZXh0dG93YXJkICBJbmYgIC0xICAgICAtPiAgOS45OTk5OTk5OUUrMzg0CituZXh0dDgwMyBuZXh0dG93YXJkICBJbmYgIC0wICAgICAtPiAgOS45OTk5OTk5OUUrMzg0CituZXh0dDgwNCBuZXh0dG93YXJkICBJbmYgICAwICAgICAtPiAgOS45OTk5OTk5OUUrMzg0CituZXh0dDgwNSBuZXh0dG93YXJkICBJbmYgICAxICAgICAtPiAgOS45OTk5OTk5OUUrMzg0CituZXh0dDgwNiBuZXh0dG93YXJkICBJbmYgICAxMDAwICAtPiAgOS45OTk5OTk5OUUrMzg0CituZXh0dDgwNyBuZXh0dG93YXJkICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK25leHR0ODA4IG5leHR0b3dhcmQgLTEwMDAgIEluZiAgIC0+IC05OTkuOTk5OTk5CituZXh0dDgwOSBuZXh0dG93YXJkIC1JbmYgICBJbmYgICAtPiAtOS45OTk5OTk5OUUrMzg0CituZXh0dDgxMCBuZXh0dG93YXJkIC0xICAgICBJbmYgICAtPiAtMC45OTk5OTk5OTkKK25leHR0ODExIG5leHR0b3dhcmQgLTAgICAgIEluZiAgIC0+ICAxRS0zOTEgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDgxMiBuZXh0dG93YXJkICAwICAgICBJbmYgICAtPiAgMUUtMzkxICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ4MTMgbmV4dHRvd2FyZCAgMSAgICAgSW5mICAgLT4gIDEuMDAwMDAwMDEKK25leHR0ODE0IG5leHR0b3dhcmQgIDEwMDAgIEluZiAgIC0+ICAxMDAwLjAwMDAxCituZXh0dDgxNSBuZXh0dG93YXJkICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworbmV4dHQ4MjEgbmV4dHRvd2FyZCAgTmFOIC1JbmYgICAgLT4gIE5hTgorbmV4dHQ4MjIgbmV4dHRvd2FyZCAgTmFOIC0xMDAwICAgLT4gIE5hTgorbmV4dHQ4MjMgbmV4dHRvd2FyZCAgTmFOIC0xICAgICAgLT4gIE5hTgorbmV4dHQ4MjQgbmV4dHRvd2FyZCAgTmFOIC0wICAgICAgLT4gIE5hTgorbmV4dHQ4MjUgbmV4dHRvd2FyZCAgTmFOICAwICAgICAgLT4gIE5hTgorbmV4dHQ4MjYgbmV4dHRvd2FyZCAgTmFOICAxICAgICAgLT4gIE5hTgorbmV4dHQ4MjcgbmV4dHRvd2FyZCAgTmFOICAxMDAwICAgLT4gIE5hTgorbmV4dHQ4MjggbmV4dHRvd2FyZCAgTmFOICBJbmYgICAgLT4gIE5hTgorbmV4dHQ4MjkgbmV4dHRvd2FyZCAgTmFOICBOYU4gICAgLT4gIE5hTgorbmV4dHQ4MzAgbmV4dHRvd2FyZCAtSW5mICBOYU4gICAgLT4gIE5hTgorbmV4dHQ4MzEgbmV4dHRvd2FyZCAtMTAwMCBOYU4gICAgLT4gIE5hTgorbmV4dHQ4MzIgbmV4dHRvd2FyZCAtMSAgICBOYU4gICAgLT4gIE5hTgorbmV4dHQ4MzMgbmV4dHRvd2FyZCAtMCAgICBOYU4gICAgLT4gIE5hTgorbmV4dHQ4MzQgbmV4dHRvd2FyZCAgMCAgICBOYU4gICAgLT4gIE5hTgorbmV4dHQ4MzUgbmV4dHRvd2FyZCAgMSAgICBOYU4gICAgLT4gIE5hTgorbmV4dHQ4MzYgbmV4dHRvd2FyZCAgMTAwMCBOYU4gICAgLT4gIE5hTgorbmV4dHQ4MzcgbmV4dHRvd2FyZCAgSW5mICBOYU4gICAgLT4gIE5hTgorCituZXh0dDg0MSBuZXh0dG93YXJkICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NDIgbmV4dHRvd2FyZCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODQzIG5leHR0b3dhcmQgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg0NCBuZXh0dG93YXJkICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NDUgbmV4dHRvd2FyZCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODQ2IG5leHR0b3dhcmQgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg0NyBuZXh0dG93YXJkICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NDggbmV4dHRvd2FyZCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODQ5IG5leHR0b3dhcmQgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg1MCBuZXh0dG93YXJkICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NTEgbmV4dHRvd2FyZCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODUyIG5leHR0b3dhcmQgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg1MyBuZXh0dG93YXJkIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NTQgbmV4dHRvd2FyZCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODU1IG5leHR0b3dhcmQgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg1NiBuZXh0dG93YXJkICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NTcgbmV4dHRvd2FyZCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODU4IG5leHR0b3dhcmQgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg1OSBuZXh0dG93YXJkICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCituZXh0dDg2MSBuZXh0dG93YXJkICBOYU4xICAgLUluZiAgICAtPiAgTmFOMQorbmV4dHQ4NjIgbmV4dHRvd2FyZCArTmFOMiAgIC0xMDAwICAgLT4gIE5hTjIKK25leHR0ODYzIG5leHR0b3dhcmQgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCituZXh0dDg2NCBuZXh0dG93YXJkICBOYU40ICAgIEluZiAgICAtPiAgTmFONAorbmV4dHQ4NjUgbmV4dHRvd2FyZCAgTmFONSAgICtOYU42ICAgLT4gIE5hTjUKK25leHR0ODY2IG5leHR0b3dhcmQgLUluZiAgICAgTmFONyAgIC0+ICBOYU43CituZXh0dDg2NyBuZXh0dG93YXJkIC0xMDAwICAgIE5hTjggICAtPiAgTmFOOAorbmV4dHQ4NjggbmV4dHRvd2FyZCAgMTAwMCAgICBOYU45ICAgLT4gIE5hTjkKK25leHR0ODY5IG5leHR0b3dhcmQgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorbmV4dHQ4NzEgbmV4dHRvd2FyZCAgc05hTjExICAtSW5mICAgLT4gIE5hTjExICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NzIgbmV4dHRvd2FyZCAgc05hTjEyICAtMTAwMCAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NzMgbmV4dHRvd2FyZCAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NzQgbmV4dHRvd2FyZCAgc05hTjE0ICAgTmFOMTcgLT4gIE5hTjE0ICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NzUgbmV4dHRvd2FyZCAgc05hTjE1ICBzTmFOMTggLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NzYgbmV4dHRvd2FyZCAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NzcgbmV4dHRvd2FyZCAtSW5mICAgICtzTmFOMjAgLT4gIE5hTjIwICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NzggbmV4dHRvd2FyZCAtMTAwMCAgICBzTmFOMjEgLT4gIE5hTjIxICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NzkgbmV4dHRvd2FyZCAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4ODAgbmV4dHRvd2FyZCAgSW5mICAgICBzTmFOMjMgLT4gIE5hTjIzICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4ODEgbmV4dHRvd2FyZCArTmFOMjUgICtzTmFOMjQgLT4gIE5hTjI0ICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4ODIgbmV4dHRvd2FyZCAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2CituZXh0dDg4MyBuZXh0dG93YXJkIC1zTmFOMjcgIHNOYU4yOSAtPiAtTmFOMjcgIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg4NCBuZXh0dG93YXJkICAxMDAwICAgIC1OYU4zMCAtPiAtTmFOMzAKK25leHR0ODg1IG5leHR0b3dhcmQgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0cworbmV4dHQ5MDAgbmV4dHRvd2FyZCAxICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ5MDEgbmV4dHRvd2FyZCAjICAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL29yLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL29yLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFlYmZmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvb3IuZGVjVGVzdApAQCAtMCwwICsxLDMzNCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBvci5kZWNUZXN0IC0tIGRpZ2l0d2lzZSBsb2dpY2FsIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5CisKKy0tIFNhbml0eSBjaGVjayAodHJ1dGggdGFibGUpCitvcngwMDEgb3IgICAgICAgICAgICAgMCAgICAwIC0+ICAgIDAKK29yeDAwMiBvciAgICAgICAgICAgICAwICAgIDEgLT4gICAgMQorb3J4MDAzIG9yICAgICAgICAgICAgIDEgICAgMCAtPiAgICAxCitvcngwMDQgb3IgICAgICAgICAgICAgMSAgICAxIC0+ICAgIDEKK29yeDAwNSBvciAgICAgICAgICAxMTAwIDEwMTAgLT4gMTExMAorLS0gYW5kIGF0IG1zZCBhbmQgbXNkLTEKK29yeDAwNiBvciAwMDAwMDAwMDAgMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCitvcngwMDcgb3IgMDAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMAorb3J4MDA4IG9yIDEwMDAwMDAwMCAwMDAwMDAwMDAgLT4gICAxMDAwMDAwMDAKK29yeDAwOSBvciAxMDAwMDAwMDAgMTAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwCitvcngwMTAgb3IgMDAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorb3J4MDExIG9yIDAwMDAwMDAwMCAwMTAwMDAwMDAgLT4gICAgMTAwMDAwMDAKK29yeDAxMiBvciAwMTAwMDAwMDAgMDAwMDAwMDAwIC0+ICAgIDEwMDAwMDAwCitvcngwMTMgb3IgMDEwMDAwMDAwIDAxMDAwMDAwMCAtPiAgICAxMDAwMDAwMAorCistLSBWYXJpb3VzIGxlbmd0aHMKKy0tICAgICAgICAxMjM0NTY3ODkgICAgIDEyMzQ1Njc4OSAgICAgIDEyMzQ1Njc4OQorb3J4MDIxIG9yIDExMTExMTExMSAgICAgMTExMTExMTExICAtPiAgMTExMTExMTExCitvcngwMjIgb3IgMTExMTExMTExMTExICAxMTExMTExMTEgIC0+ICAxMTExMTExMTEKK29yeDAyMyBvciAgMTExMTExMTEgICAgICAxMTExMTExMSAgLT4gICAxMTExMTExMQorb3J4MDI1IG9yICAgMTExMTExMSAgICAgICAxMTExMTExICAtPiAgICAxMTExMTExCitvcngwMjYgb3IgICAgMTExMTExICAgICAgICAxMTExMTEgIC0+ICAgICAxMTExMTEKK29yeDAyNyBvciAgICAgMTExMTEgICAgICAgICAxMTExMSAgLT4gICAgICAxMTExMQorb3J4MDI4IG9yICAgICAgMTExMSAgICAgICAgICAxMTExICAtPiAgICAgICAxMTExCitvcngwMjkgb3IgICAgICAgMTExICAgICAgICAgICAxMTEgIC0+ICAgICAgICAxMTEKK29yeDAzMSBvciAgICAgICAgMTEgICAgICAgICAgICAxMSAgLT4gICAgICAgICAxMQorb3J4MDMyIG9yICAgICAgICAgMSAgICAgICAgICAgICAxICAtPiAgICAgICAgICAxCitvcngwMzMgb3IgMTExMTExMTExMTExIDExMTExMTExMTEgIC0+ICAxMTExMTExMTEKK29yeDAzNCBvciAxMTExMTExMTExMSAxMTExMTExMTExMSAgLT4gIDExMTExMTExMQorb3J4MDM1IG9yIDExMTExMTExMTEgMTExMTExMTExMTExICAtPiAgMTExMTExMTExCitvcngwMzYgb3IgMTExMTExMTExIDExMTExMTExMTExMTEgIC0+ICAxMTExMTExMTEKKworb3J4MDQwIG9yIDExMTExMTExMSAgMTExMTExMTExMTExICAtPiAgMTExMTExMTExCitvcngwNDEgb3IgIDExMTExMTExICAxMTExMTExMTExMTEgIC0+ICAxMTExMTExMTEKK29yeDA0MiBvciAgMTExMTExMTEgICAgIDExMTExMTExMSAgLT4gIDExMTExMTExMQorb3J4MDQzIG9yICAgMTExMTExMSAgICAgMTAwMDAwMDEwICAtPiAgMTAxMTExMTExCitvcngwNDQgb3IgICAgMTExMTExICAgICAxMDAwMDAxMDAgIC0+ICAxMDAxMTExMTEKK29yeDA0NSBvciAgICAgMTExMTEgICAgIDEwMDAwMTAwMCAgLT4gIDEwMDAxMTExMQorb3J4MDQ2IG9yICAgICAgMTExMSAgICAgMTAwMDEwMDAwICAtPiAgMTAwMDExMTExCitvcngwNDcgb3IgICAgICAgMTExICAgICAxMDAxMDAwMDAgIC0+ICAxMDAxMDAxMTEKK29yeDA0OCBvciAgICAgICAgMTEgICAgIDEwMTAwMDAwMCAgLT4gIDEwMTAwMDAxMQorb3J4MDQ5IG9yICAgICAgICAgMSAgICAgMTEwMDAwMDAwICAtPiAgMTEwMDAwMDAxCisKK29yeDA1MCBvciAxMTExMTExMTExICAxICAtPiAgMTExMTExMTExCitvcngwNTEgb3IgIDExMTExMTExMSAgMSAgLT4gIDExMTExMTExMQorb3J4MDUyIG9yICAgMTExMTExMTEgIDEgIC0+ICAxMTExMTExMQorb3J4MDUzIG9yICAgIDExMTExMTEgIDEgIC0+ICAxMTExMTExCitvcngwNTQgb3IgICAgIDExMTExMSAgMSAgLT4gIDExMTExMQorb3J4MDU1IG9yICAgICAgMTExMTEgIDEgIC0+ICAxMTExMQorb3J4MDU2IG9yICAgICAgIDExMTEgIDEgIC0+ICAxMTExCitvcngwNTcgb3IgICAgICAgIDExMSAgMSAgLT4gIDExMQorb3J4MDU4IG9yICAgICAgICAgMTEgIDEgIC0+ICAxMQorb3J4MDU5IG9yICAgICAgICAgIDEgIDEgIC0+ICAxCisKK29yeDA2MCBvciAxMTExMTExMTExICAwICAtPiAgMTExMTExMTExCitvcngwNjEgb3IgIDExMTExMTExMSAgMCAgLT4gIDExMTExMTExMQorb3J4MDYyIG9yICAgMTExMTExMTEgIDAgIC0+ICAxMTExMTExMQorb3J4MDYzIG9yICAgIDExMTExMTEgIDAgIC0+ICAxMTExMTExCitvcngwNjQgb3IgICAgIDExMTExMSAgMCAgLT4gIDExMTExMQorb3J4MDY1IG9yICAgICAgMTExMTEgIDAgIC0+ICAxMTExMQorb3J4MDY2IG9yICAgICAgIDExMTEgIDAgIC0+ICAxMTExCitvcngwNjcgb3IgICAgICAgIDExMSAgMCAgLT4gIDExMQorb3J4MDY4IG9yICAgICAgICAgMTEgIDAgIC0+ICAxMQorb3J4MDY5IG9yICAgICAgICAgIDEgIDAgIC0+ICAxCisKK29yeDA3MCBvciAxICAxMTExMTExMTExICAtPiAgMTExMTExMTExCitvcngwNzEgb3IgMSAgIDExMTExMTExMSAgLT4gIDExMTExMTExMQorb3J4MDcyIG9yIDEgICAgMTExMTExMTEgIC0+ICAxMTExMTExMQorb3J4MDczIG9yIDEgICAgIDExMTExMTEgIC0+ICAxMTExMTExCitvcngwNzQgb3IgMSAgICAgIDExMTExMSAgLT4gIDExMTExMQorb3J4MDc1IG9yIDEgICAgICAgMTExMTEgIC0+ICAxMTExMQorb3J4MDc2IG9yIDEgICAgICAgIDExMTEgIC0+ICAxMTExCitvcngwNzcgb3IgMSAgICAgICAgIDExMSAgLT4gIDExMQorb3J4MDc4IG9yIDEgICAgICAgICAgMTEgIC0+ICAxMQorb3J4MDc5IG9yIDEgICAgICAgICAgIDEgIC0+ICAxCisKK29yeDA4MCBvciAwICAxMTExMTExMTExICAtPiAgMTExMTExMTExCitvcngwODEgb3IgMCAgIDExMTExMTExMSAgLT4gIDExMTExMTExMQorb3J4MDgyIG9yIDAgICAgMTExMTExMTEgIC0+ICAxMTExMTExMQorb3J4MDgzIG9yIDAgICAgIDExMTExMTEgIC0+ICAxMTExMTExCitvcngwODQgb3IgMCAgICAgIDExMTExMSAgLT4gIDExMTExMQorb3J4MDg1IG9yIDAgICAgICAgMTExMTEgIC0+ICAxMTExMQorb3J4MDg2IG9yIDAgICAgICAgIDExMTEgIC0+ICAxMTExCitvcngwODcgb3IgMCAgICAgICAgIDExMSAgLT4gIDExMQorb3J4MDg4IG9yIDAgICAgICAgICAgMTEgIC0+ICAxMQorb3J4MDg5IG9yIDAgICAgICAgICAgIDEgIC0+ICAxCisKK29yeDA5MCBvciAwMTExMTExMTEgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorb3J4MDkxIG9yIDEwMTExMTExMSAgMTExMTAxMTExICAtPiAgMTExMTExMTExCitvcngwOTIgb3IgMTEwMTExMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK29yeDA5MyBvciAxMTEwMTExMTEgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorb3J4MDk0IG9yIDExMTEwMTExMSAgMTExMTAxMTExICAtPiAgMTExMTAxMTExCitvcngwOTUgb3IgMTExMTEwMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK29yeDA5NiBvciAxMTExMTEwMTEgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorb3J4MDk3IG9yIDExMTExMTEwMSAgMTExMTAxMTExICAtPiAgMTExMTExMTExCitvcngwOTggb3IgMTExMTExMTEwICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKKworb3J4MTAwIG9yIDExMTEwMTExMSAgMDExMTExMTExICAtPiAgMTExMTExMTExCitvcngxMDEgb3IgMTExMTAxMTExICAxMDExMTExMTEgIC0+ICAxMTExMTExMTEKK29yeDEwMiBvciAxMTExMDExMTEgIDExMDExMTExMSAgLT4gIDExMTExMTExMQorb3J4MTAzIG9yIDExMTEwMTExMSAgMTExMDExMTExICAtPiAgMTExMTExMTExCitvcngxMDQgb3IgMTExMTAxMTExICAxMTExMDExMTEgIC0+ICAxMTExMDExMTEKK29yeDEwNSBvciAxMTExMDExMTEgIDExMTExMDExMSAgLT4gIDExMTExMTExMQorb3J4MTA2IG9yIDExMTEwMTExMSAgMTExMTExMDExICAtPiAgMTExMTExMTExCitvcngxMDcgb3IgMTExMTAxMTExICAxMTExMTExMDEgIC0+ICAxMTExMTExMTEKK29yeDEwOCBvciAxMTExMDExMTEgIDExMTExMTExMCAgLT4gIDExMTExMTExMQorCistLSBub24tMC8xIHNob3VsZCBub3QgYmUgYWNjZXB0ZWQsIG5vciBzaG91bGQgc2lnbnMKK29yeDIyMCBvciAxMTExMTExMTIgIDExMTExMTExMSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjIxIG9yIDMzMzMzMzMzMyAgMzMzMzMzMzMzICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyMjIgb3IgNTU1NTU1NTU1ICA1NTU1NTU1NTUgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDIyMyBvciA3Nzc3Nzc3NzcgIDc3Nzc3Nzc3NyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjI0IG9yIDk5OTk5OTk5OSAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyMjUgb3IgMjIyMjIyMjIyICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDIyNiBvciA0NDQ0NDQ0NDQgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjI3IG9yIDY2NjY2NjY2NiAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyMjggb3IgODg4ODg4ODg4ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDIyOSBvciA5OTk5OTk5OTkgIDIyMjIyMjIyMiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjMwIG9yIDk5OTk5OTk5OSAgNDQ0NDQ0NDQ0ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyMzEgb3IgOTk5OTk5OTk5ICA2NjY2NjY2NjYgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDIzMiBvciA5OTk5OTk5OTkgIDg4ODg4ODg4OCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYSBmZXcgcmFuZG9tcworb3J4MjQwIG9yICA1Njc0Njg2ODkgLTkzNDk4MTk0MiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNDEgb3IgIDU2NzM2NzY4OSAgOTM0OTgxOTQyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI0MiBvciAtNjMxOTE3NzcyIC03MDYwMTQ2MzQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjQzIG9yIC03NTYyNTMyNTcgIDEzODU3OTIzNCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNDQgb3IgIDgzNTU5MDE0OSAgNTY3NDM1NDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNECitvcngyNTAgb3IgIDIwMDAwMDAwMCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjUxIG9yICA3MDAwMDAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI1MiBvciAgODAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNTMgb3IgIDkwMDAwMDAwMCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjU0IG9yICAyMDAwMDAwMDAgMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI1NSBvciAgNzAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNTYgb3IgIDgwMDAwMDAwMCAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjU3IG9yICA5MDAwMDAwMDAgMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI1OCBvciAgMTAwMDAwMDAwIDIwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNTkgb3IgIDEwMDAwMDAwMCA3MDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjYwIG9yICAxMDAwMDAwMDAgODAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI2MSBvciAgMTAwMDAwMDAwIDkwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNjIgb3IgIDAwMDAwMDAwMCAyMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjYzIG9yICAwMDAwMDAwMDAgNzAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI2NCBvciAgMDAwMDAwMDAwIDgwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNjUgb3IgIDAwMDAwMDAwMCA5MDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QtMQorb3J4MjcwIG9yICAwMjAwMDAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI3MSBvciAgMDcwMTAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNzIgb3IgIDA4MDAxMDAwMCAxMDAwMDAwMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjczIG9yICAwOTAwMDEwMDAgMTAwMDAwMDEwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI3NCBvciAgMTAwMDAwMTAwIDAyMDAxMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNzUgb3IgIDEwMDAwMDAwMCAwNzAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Mjc2IG9yICAxMDAwMDAwMTAgMDgwMDEwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI3NyBvciAgMTAwMDAwMDAwIDA5MDAwMDAxMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IExTRAorb3J4MjgwIG9yICAwMDEwMDAwMDIgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI4MSBvciAgMDAwMDAwMDA3IDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyODIgb3IgIDAwMDAwMDAwOCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjgzIG9yICAwMDAwMDAwMDkgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI4NCBvciAgMTAwMDAwMDAwIDAwMDEwMDAwMiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyODUgb3IgIDEwMDEwMDAwMCAwMDEwMDAwMDcgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Mjg2IG9yICAxMDAwMTAwMDAgMDEwMDAwMDA4IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI4NyBvciAgMTAwMDAxMDAwIDEwMDAwMDAwOSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1pZGRpZQorb3J4Mjg4IG9yICAwMDEwMjAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI4OSBvciAgMDAwMDcwMDAxIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyOTAgb3IgIDAwMDA4MDAwMCAxMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjkxIG9yICAwMDAwOTAwMDAgMTAwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI5MiBvciAgMTAwMDAwMDEwIDAwMDAyMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyOTMgb3IgIDEwMDEwMDAwMCAwMDAwNzAwMTAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Mjk0IG9yICAxMDAwMTAxMDAgMDAwMDgwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI5NSBvciAgMTAwMDAxMDAwIDAwMDA5MDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBzaWducworb3J4Mjk2IG9yIC0xMDAwMDEwMDAgLTAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyOTcgb3IgLTEwMDAwMTAwMCAgMDAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI5OCBvciAgMTAwMDAxMDAwIC0wMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Mjk5IG9yICAxMDAwMDEwMDAgIDAwMDAxMTAwMCAtPiAgMTAwMDExMDAwCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitvcngzMzEgb3IgIDIgICA5Ljk5OTk5OTk5RSs5OTkgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzMyIG9yICAzICAgMUUtOTk5ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDMzMyBvciAgNCAgIDEuMDAwMDAwMDBFLTk5OSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzMzQgb3IgIDUgICAxRS0xMDA3ICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzM1IG9yICA2ICAgLTFFLTEwMDcgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDMzNiBvciAgNyAgIC0xLjAwMDAwMDAwRS05OTkgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzMzcgb3IgIDggICAtMUUtOTk5ICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzM4IG9yICA5ICAgLTkuOTk5OTk5OTlFKzk5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDM0MSBvciAgOS45OTk5OTk5OUUrOTk5ICAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNDIgb3IgIDFFLTk5OSAgICAgICAgICAgICAgIDAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzQzIG9yICAxLjAwMDAwMDAwRS05OTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDM0NCBvciAgMUUtMTAwNyAgICAgICAgICAgICAgMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNDUgb3IgIC0xRS0xMDA3ICAgICAgICAgICAgLTEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzQ2IG9yICAtMS4wMDAwMDAwMEUtOTk5ICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDM0NyBvciAgLTFFLTk5OSAgICAgICAgICAgICAgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNDggb3IgIC05Ljk5OTk5OTk5RSs5OTkgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBIGZldyBvdGhlciBub24taW50ZWdlcnMKK29yeDM2MSBvciAgMS4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNjIgb3IgIDFFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzYzIG9yICAwLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDM2NCBvciAgMEUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNjUgb3IgIDkuOSAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzY2IG9yICA5RSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDM3MSBvciAgMCAxLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNzIgb3IgIDAgMUUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzczIG9yICAwIDAuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDM3NCBvciAgMCAwRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNzUgb3IgIDAgOS45ICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Mzc2IG9yICAwIDlFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQWxsIFNwZWNpYWxzIGFyZSBpbiBlcnJvcgorb3J4NzgwIG9yIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDc4MSBvciAtSW5mICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng3ODIgb3IgLUluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4NzgzIG9yIC1JbmYgIC0wICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDc4NCBvciAtSW5mICAgMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng3ODUgb3IgLUluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Nzg2IG9yIC1JbmYgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDc4NyBvciAtMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng3ODggb3IgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Nzg5IG9yIC0xICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDc5MCBvciAtMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng3OTEgb3IgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4NzkyIG9yICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDc5MyBvciAgMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng3OTQgb3IgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitvcng4MDAgb3IgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODAxIG9yICBJbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgwMiBvciAgSW5mICAtMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MDMgb3IgIEluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODA0IG9yICBJbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgwNSBvciAgSW5mICAgMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MDYgb3IgIEluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODA3IG9yICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgwOCBvciAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MDkgb3IgLUluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODEwIG9yIC0xICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgxMSBvciAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MTIgb3IgIDAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODEzIG9yICAxICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgxNCBvciAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MTUgb3IgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitvcng4MjEgb3IgIE5hTiAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODIyIG9yICBOYU4gLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgyMyBvciAgTmFOIC0xICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MjQgb3IgIE5hTiAtMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODI1IG9yICBOYU4gIDAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgyNiBvciAgTmFOICAxICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4Mjcgb3IgIE5hTiAgMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODI4IG9yICBOYU4gIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgyOSBvciAgTmFOICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MzAgb3IgLUluZiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODMxIG9yIC0xMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgzMiBvciAtMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MzMgb3IgLTAgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODM0IG9yICAwICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgzNSBvciAgMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MzYgb3IgIDEwMDAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODM3IG9yICBJbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworb3J4ODQxIG9yICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODQyIG9yICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODQzIG9yICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODQ0IG9yICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODQ1IG9yICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODQ2IG9yICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODQ3IG9yICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODQ4IG9yICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODQ5IG9yICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODUwIG9yICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODUxIG9yIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODUyIG9yIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODUzIG9yIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODU0IG9yIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODU1IG9yICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODU2IG9yICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODU3IG9yICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODU4IG9yICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODU5IG9yICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitvcng4NjEgb3IgIE5hTjEgICAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODYyIG9yICtOYU4yICAgLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg2MyBvciAgTmFOMyAgICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4NjQgb3IgIE5hTjQgICAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODY1IG9yICBOYU41ICAgK05hTjYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg2NiBvciAtSW5mICAgICBOYU43ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4Njcgb3IgLTEwMDAgICAgTmFOOCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODY4IG9yICAxMDAwICAgIE5hTjkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg2OSBvciAgSW5mICAgICtOYU4xMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4NzEgb3IgIHNOYU4xMSAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODcyIG9yICBzTmFOMTIgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg3MyBvciAgc05hTjEzICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4NzQgb3IgIHNOYU4xNCAgIE5hTjE3IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODc1IG9yICBzTmFOMTUgIHNOYU4xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg3NiBvciAgTmFOMTYgICBzTmFOMTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4Nzcgb3IgLUluZiAgICArc05hTjIwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODc4IG9yIC0xMDAwICAgIHNOYU4yMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg3OSBvciAgMTAwMCAgICBzTmFOMjIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4ODAgb3IgIEluZiAgICAgc05hTjIzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODgxIG9yICtOYU4yNSAgK3NOYU4yNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg4MiBvciAtTmFOMjYgICAgTmFOMjggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4ODMgb3IgLXNOYU4yNyAgc05hTjI5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODg0IG9yICAxMDAwICAgIC1OYU4zMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg4NSBvciAgMTAwMCAgIC1zTmFOMzEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3BsdXMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcGx1cy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTg0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3BsdXMuZGVjVGVzdApAQCAtMCwwICsxLDE5NSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBwbHVzLmRlY1Rlc3QgLS0gZGVjaW1hbCBtb25hZGljIGFkZGl0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgc2V0IG9mIHRlc3RzIHByaW1hcmlseSB0ZXN0cyB0aGUgZXhpc3RlbmNlIG9mIHRoZSBvcGVyYXRvci4KKy0tIEFkZGl0aW9uIGFuZCByb3VuZGluZywgYW5kIG1vc3Qgb3ZlcmZsb3dzLCBhcmUgdGVzdGVkIGVsc2V3aGVyZS4KKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworcGx1eDAwMSBwbHVzICcxJyAgICAgIC0+ICcxJworcGx1eDAwMiBwbHVzICctMScgICAgIC0+ICctMScKK3BsdXgwMDMgcGx1cyAnMS4wMCcgICAtPiAnMS4wMCcKK3BsdXgwMDQgcGx1cyAnLTEuMDAnICAtPiAnLTEuMDAnCitwbHV4MDA1IHBsdXMgJzAnICAgICAgLT4gJzAnCitwbHV4MDA2IHBsdXMgJzAuMDAnICAgLT4gJzAuMDAnCitwbHV4MDA3IHBsdXMgJzAwLjAnICAgLT4gJzAuMCcKK3BsdXgwMDggcGx1cyAnMDAuMDAnICAtPiAnMC4wMCcKK3BsdXgwMDkgcGx1cyAnMDAnICAgICAtPiAnMCcKKworcGx1eDAxMCBwbHVzICctMicgICAgIC0+ICctMicKK3BsdXgwMTEgcGx1cyAnMicgICAgICAtPiAnMicKK3BsdXgwMTIgcGx1cyAnLTIuMDAnICAtPiAnLTIuMDAnCitwbHV4MDEzIHBsdXMgJzIuMDAnICAgLT4gJzIuMDAnCitwbHV4MDE0IHBsdXMgJy0wJyAgICAgLT4gJzAnCitwbHV4MDE1IHBsdXMgJy0wLjAwJyAgLT4gJzAuMDAnCitwbHV4MDE2IHBsdXMgJy0wMC4wJyAgLT4gJzAuMCcKK3BsdXgwMTcgcGx1cyAnLTAwLjAwJyAtPiAnMC4wMCcKK3BsdXgwMTggcGx1cyAnLTAwJyAgICAtPiAnMCcKKworcGx1eDAyMCBwbHVzICctMjAwMDAwMCcgLT4gJy0yMDAwMDAwJworcGx1eDAyMSBwbHVzICcyMDAwMDAwJyAgLT4gJzIwMDAwMDAnCitwcmVjaXNpb246IDcKK3BsdXgwMjIgcGx1cyAnLTIwMDAwMDAnIC0+ICctMjAwMDAwMCcKK3BsdXgwMjMgcGx1cyAnMjAwMDAwMCcgIC0+ICcyMDAwMDAwJworcHJlY2lzaW9uOiA2CitwbHV4MDI0IHBsdXMgJy0yMDAwMDAwJyAtPiAnLTIuMDAwMDBFKzYnIFJvdW5kZWQKK3BsdXgwMjUgcGx1cyAnMjAwMDAwMCcgIC0+ICcyLjAwMDAwRSs2JyBSb3VuZGVkCitwcmVjaXNpb246IDMKK3BsdXgwMjYgcGx1cyAnLTIwMDAwMDAnIC0+ICctMi4wMEUrNicgUm91bmRlZAorcGx1eDAyNyBwbHVzICcyMDAwMDAwJyAgLT4gJzIuMDBFKzYnIFJvdW5kZWQKKworLS0gbW9yZSBmaXhlZCwgcG90ZW50aWFsIExIUyBzd2FwcyBpZiBkb25lIGJ5IGFkZCAwCitwcmVjaXNpb246IDkKK3BsdXgwNjAgcGx1cyAnNTYyNjdFLTEwJyAgIC0+ICcwLjAwMDAwNTYyNjcnCitwbHV4MDYxIHBsdXMgJzU2MjY3RS01JyAgICAtPiAnMC41NjI2NycKK3BsdXgwNjIgcGx1cyAnNTYyNjdFLTInICAgIC0+ICc1NjIuNjcnCitwbHV4MDYzIHBsdXMgJzU2MjY3RS0xJyAgICAtPiAnNTYyNi43JworcGx1eDA2NSBwbHVzICc1NjI2N0UtMCcgICAgLT4gJzU2MjY3JworcGx1eDA2NiBwbHVzICc1NjI2N0UrMCcgICAgLT4gJzU2MjY3JworcGx1eDA2NyBwbHVzICc1NjI2N0UrMScgICAgLT4gJzUuNjI2N0UrNScKK3BsdXgwNjggcGx1cyAnNTYyNjdFKzInICAgIC0+ICc1LjYyNjdFKzYnCitwbHV4MDY5IHBsdXMgJzU2MjY3RSszJyAgICAtPiAnNS42MjY3RSs3JworcGx1eDA3MCBwbHVzICc1NjI2N0UrNCcgICAgLT4gJzUuNjI2N0UrOCcKK3BsdXgwNzEgcGx1cyAnNTYyNjdFKzUnICAgIC0+ICc1LjYyNjdFKzknCitwbHV4MDcyIHBsdXMgJzU2MjY3RSs2JyAgICAtPiAnNS42MjY3RSsxMCcKK3BsdXgwODAgcGx1cyAnLTU2MjY3RS0xMCcgIC0+ICctMC4wMDAwMDU2MjY3JworcGx1eDA4MSBwbHVzICctNTYyNjdFLTUnICAgLT4gJy0wLjU2MjY3JworcGx1eDA4MiBwbHVzICctNTYyNjdFLTInICAgLT4gJy01NjIuNjcnCitwbHV4MDgzIHBsdXMgJy01NjI2N0UtMScgICAtPiAnLTU2MjYuNycKK3BsdXgwODUgcGx1cyAnLTU2MjY3RS0wJyAgIC0+ICctNTYyNjcnCitwbHV4MDg2IHBsdXMgJy01NjI2N0UrMCcgICAtPiAnLTU2MjY3JworcGx1eDA4NyBwbHVzICctNTYyNjdFKzEnICAgLT4gJy01LjYyNjdFKzUnCitwbHV4MDg4IHBsdXMgJy01NjI2N0UrMicgICAtPiAnLTUuNjI2N0UrNicKK3BsdXgwODkgcGx1cyAnLTU2MjY3RSszJyAgIC0+ICctNS42MjY3RSs3JworcGx1eDA5MCBwbHVzICctNTYyNjdFKzQnICAgLT4gJy01LjYyNjdFKzgnCitwbHV4MDkxIHBsdXMgJy01NjI2N0UrNScgICAtPiAnLTUuNjI2N0UrOScKK3BsdXgwOTIgcGx1cyAnLTU2MjY3RSs2JyAgIC0+ICctNS42MjY3RSsxMCcKKworLS0gImxocyIgemVyb3MgaW4gcGx1cyBhbmQgbWludXMgaGF2ZSBleHBvbmVudCA9IG9wZXJhbmQKK3BsdXgxMjAgcGx1cyAnLTBFMycgICAtPiAnMEUrMycKK3BsdXgxMjEgcGx1cyAnLTBFMicgICAtPiAnMEUrMicKK3BsdXgxMjIgcGx1cyAnLTBFMScgICAtPiAnMEUrMScKK3BsdXgxMjMgcGx1cyAnLTBFMCcgICAtPiAnMCcKK3BsdXgxMjQgcGx1cyAnKzBFMCcgICAtPiAnMCcKK3BsdXgxMjUgcGx1cyAnKzBFMScgICAtPiAnMEUrMScKK3BsdXgxMjYgcGx1cyAnKzBFMicgICAtPiAnMEUrMicKK3BsdXgxMjcgcGx1cyAnKzBFMycgICAtPiAnMEUrMycKKworcGx1eDEzMCBwbHVzICctNUUzJyAgIC0+ICctNUUrMycKK3BsdXgxMzEgcGx1cyAnLTVFOCcgICAtPiAnLTVFKzgnCitwbHV4MTMyIHBsdXMgJy01RTEzJyAgLT4gJy01RSsxMycKK3BsdXgxMzMgcGx1cyAnLTVFMTgnICAtPiAnLTVFKzE4JworcGx1eDEzNCBwbHVzICcrNUUzJyAgIC0+ICc1RSszJworcGx1eDEzNSBwbHVzICcrNUU4JyAgIC0+ICc1RSs4JworcGx1eDEzNiBwbHVzICcrNUUxMycgIC0+ICc1RSsxMycKK3BsdXgxMzcgcGx1cyAnKzVFMTgnICAtPiAnNUUrMTgnCisKKy0tIHNwZWNpYWxzCitwbHV4MTUwIHBsdXMgJ0luZicgICAgLT4gJ0luZmluaXR5JworcGx1eDE1MSBwbHVzICctSW5mJyAgIC0+ICctSW5maW5pdHknCitwbHV4MTUyIHBsdXMgICBOYU4gICAgLT4gIE5hTgorcGx1eDE1MyBwbHVzICBzTmFOICAgIC0+ICBOYU4gICBJbnZhbGlkX29wZXJhdGlvbgorcGx1eDE1NCBwbHVzICAgTmFONzcgIC0+ICBOYU43NworcGx1eDE1NSBwbHVzICBzTmFOODggIC0+ICBOYU44OCBJbnZhbGlkX29wZXJhdGlvbgorcGx1eDE1NiBwbHVzICAtTmFOICAgIC0+IC1OYU4KK3BsdXgxNTcgcGx1cyAtc05hTiAgICAtPiAtTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK3BsdXgxNTggcGx1cyAgLU5hTjc3ICAtPiAtTmFONzcKK3BsdXgxNTkgcGx1cyAtc05hTjg4ICAtPiAtTmFOODggSW52YWxpZF9vcGVyYXRpb24KKworLS0gb3ZlcmZsb3cgdGVzdHMKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitwcmVjaXNpb246IDMKK3BsdXgxNjAgcGx1cyA5Ljk5OUUrOTk5OTk5OTk5ICAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitwbHV4MTYxIHBsdXMgLTkuOTk5RSs5OTk5OTk5OTkgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3cKK3ByZWNpc2lvbjogMworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3BsdXgyMTAgcGx1cyAgMS4wMEUtOTk5ICAgICAgICAtPiAgIDEuMDBFLTk5OQorcGx1eDIxMSBwbHVzICAwLjFFLTk5OSAgICAgICAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbAorcGx1eDIxMiBwbHVzICAwLjEwRS05OTkgICAgICAgIC0+ICAgMS4wRS0xMDAwIFN1Ym5vcm1hbAorcGx1eDIxMyBwbHVzICAwLjEwMEUtOTk5ICAgICAgIC0+ICAgMS4wRS0xMDAwIFN1Ym5vcm1hbCBSb3VuZGVkCitwbHV4MjE0IHBsdXMgIDAuMDFFLTk5OSAgICAgICAgLT4gICAxRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorcGx1eDIxNSBwbHVzICAwLjk5OUUtOTk5ICAgICAgIC0+ICAgMS4wMEUtOTk5IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitwbHV4MjE2IHBsdXMgIDAuMDk5RS05OTkgICAgICAgLT4gICAxLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK3BsdXgyMTcgcGx1cyAgMC4wMDlFLTk5OSAgICAgICAtPiAgIDFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworcGx1eDIxOCBwbHVzICAwLjAwMUUtOTk5ICAgICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK3BsdXgyMTkgcGx1cyAgMC4wMDA5RS05OTkgICAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitwbHV4MjIwIHBsdXMgIDAuMDAwMUUtOTk5ICAgICAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCitwbHV4MjMwIHBsdXMgLTEuMDBFLTk5OSAgICAgICAgLT4gIC0xLjAwRS05OTkKK3BsdXgyMzEgcGx1cyAtMC4xRS05OTkgICAgICAgICAtPiAgLTFFLTEwMDAgICBTdWJub3JtYWwKK3BsdXgyMzIgcGx1cyAtMC4xMEUtOTk5ICAgICAgICAtPiAgLTEuMEUtMTAwMCBTdWJub3JtYWwKK3BsdXgyMzMgcGx1cyAtMC4xMDBFLTk5OSAgICAgICAtPiAgLTEuMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorcGx1eDIzNCBwbHVzIC0wLjAxRS05OTkgICAgICAgIC0+ICAtMUUtMTAwMSAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIEVtaW4KK3BsdXgyMzUgcGx1cyAtMC45OTlFLTk5OSAgICAgICAtPiAgLTEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworcGx1eDIzNiBwbHVzIC0wLjA5OUUtOTk5ICAgICAgIC0+ICAtMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitwbHV4MjM3IHBsdXMgLTAuMDA5RS05OTkgICAgICAgLT4gIC0xRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK3BsdXgyMzggcGx1cyAtMC4wMDFFLTk5OSAgICAgICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitwbHV4MjM5IHBsdXMgLTAuMDAwOUUtOTk5ICAgICAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorcGx1eDI0MCBwbHVzIC0wLjAwMDFFLTk5OSAgICAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKKworLS0gc3Vibm9ybWFscyBjbGFtcGVkIHRvIDAtRXRpbnkKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK3BsdXgyNTEgcGx1cyA3RS0zOTggICAgIC0+IDdFLTM5OCBTdWJub3JtYWwKK3BsdXgyNTIgcGx1cyAwRS0zOTggICAgIC0+IDBFLTM5OAorcGx1eDI1MyBwbHVzIDdFLTM5OSAgICAgLT4gMUUtMzk4IFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwbHV4MjU0IHBsdXMgNEUtMzk5ICAgICAtPiAwRS0zOTggQ2xhbXBlZCBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorcGx1eDI1NSBwbHVzIDdFLTQwMCAgICAgLT4gMEUtMzk4IENsYW1wZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3BsdXgyNTYgcGx1cyA3RS00MDEgICAgIC0+IDBFLTM5OCBDbGFtcGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwbHV4MjU3IHBsdXMgMEUtMzk5ICAgICAtPiAwRS0zOTggQ2xhbXBlZAorcGx1eDI1OCBwbHVzIDBFLTQwMCAgICAgLT4gMEUtMzk4IENsYW1wZWQKK3BsdXgyNTkgcGx1cyAwRS00MDEgICAgIC0+IDBFLTM5OCBDbGFtcGVkCisKKy0tIGxvbmcgb3BlcmFuZCBjaGVja3MKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK3BsdXgzMDEgcGx1cyAxMjM0NTY3ODAwMCAgLT4gMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorcGx1eDMwMiBwbHVzIDEyMzQ1Njc4MDAgICAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK3BsdXgzMDMgcGx1cyAxMjM0NTY3ODkwICAgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCitwbHV4MzA0IHBsdXMgMTIzNDU2Nzg5MSAgIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitwbHV4MzA1IHBsdXMgMTIzNDU2Nzg5MDEgIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorcGx1eDMwNiBwbHVzIDEyMzQ1Njc4OTYgICAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorCistLSBzdGlsbCBjaGVja2luZworcHJlY2lzaW9uOiAxNQorcGx1eDMyMSBwbHVzIDEyMzQ1Njc4MDAwICAtPiAxMjM0NTY3ODAwMAorcGx1eDMyMiBwbHVzIDEyMzQ1Njc4MDAgICAtPiAxMjM0NTY3ODAwCitwbHV4MzIzIHBsdXMgMTIzNDU2Nzg5MCAgIC0+IDEyMzQ1Njc4OTAKK3BsdXgzMjQgcGx1cyAxMjM0NTY3ODkxICAgLT4gMTIzNDU2Nzg5MQorcGx1eDMyNSBwbHVzIDEyMzQ1Njc4OTAxICAtPiAxMjM0NTY3ODkwMQorcGx1eDMyNiBwbHVzIDEyMzQ1Njc4OTYgICAtPiAxMjM0NTY3ODk2CitwcmVjaXNpb246IDkKKworLS0gTnVsbCB0ZXN0cworcGx1OTAwIHBsdXMgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcG93ZXIuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcG93ZXIuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2YxNDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9wb3dlci5kZWNUZXN0CkBAIC0wLDAgKzEsMTYyNCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBwb3dlci5kZWNUZXN0IC0tIGRlY2ltYWwgZXhwb25lbnRpYXRpb24gW3Bvd2VyKHgsIHkpXSAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEluIGFkZGl0aW9uIHRvIHRoZSBwb3dlciBvcGVyYXRvciB0ZXN0Y2FzZXMgaGVyZSwgc2VlIGFsc28gdGhlIGZpbGUKKy0tIHBvd2Vyc3FydC5kZWNUZXN0IHdoaWNoIGluY2x1ZGVzIGFsbCB0aGUgdGVzdHMgZnJvbQorLS0gc3F1YXJlcm9vdC5kZWNUZXN0IGltcGxlbWVudGVkIHVzaW5nIHBvd2VyKHgsIDAuNSkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKKworLS0gYmFzZSBjaGVja3MuICBOb3RlIDAqKjAgaXMgYW4gZXJyb3IuCitwb3d4MDAxIHBvd2VyICAgICcwJyAgJzAnICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwb3d4MDAyIHBvd2VyICAgICcwJyAgJzEnICAgICAgICAgLT4gJzAnCitwb3d4MDAzIHBvd2VyICAgICcwJyAgJzInICAgICAgICAgLT4gJzAnCitwb3d4MDA0IHBvd2VyICAgICcxJyAgJzAnICAgICAgICAgLT4gJzEnCitwb3d4MDA1IHBvd2VyICAgICcxJyAgJzEnICAgICAgICAgLT4gJzEnCitwb3d4MDA2IHBvd2VyICAgICcxJyAgJzInICAgICAgICAgLT4gJzEnCisKK3Bvd3gwMTAgcG93ZXIgICAgJzInICAnMCcgICAgICAgICAtPiAnMScKK3Bvd3gwMTEgcG93ZXIgICAgJzInICAnMScgICAgICAgICAtPiAnMicKK3Bvd3gwMTIgcG93ZXIgICAgJzInICAnMicgICAgICAgICAtPiAnNCcKK3Bvd3gwMTMgcG93ZXIgICAgJzInICAnMycgICAgICAgICAtPiAnOCcKK3Bvd3gwMTQgcG93ZXIgICAgJzInICAnNCcgICAgICAgICAtPiAnMTYnCitwb3d4MDE1IHBvd2VyICAgICcyJyAgJzUnICAgICAgICAgLT4gJzMyJworcG93eDAxNiBwb3dlciAgICAnMicgICc2JyAgICAgICAgIC0+ICc2NCcKK3Bvd3gwMTcgcG93ZXIgICAgJzInICAnNycgICAgICAgICAtPiAnMTI4JworcG93eDAxOCBwb3dlciAgICAnMicgICc4JyAgICAgICAgIC0+ICcyNTYnCitwb3d4MDE5IHBvd2VyICAgICcyJyAgJzknICAgICAgICAgLT4gJzUxMicKK3Bvd3gwMjAgcG93ZXIgICAgJzInICAnMTAnICAgICAgICAtPiAnMTAyNCcKK3Bvd3gwMjEgcG93ZXIgICAgJzInICAnMTEnICAgICAgICAtPiAnMjA0OCcKK3Bvd3gwMjIgcG93ZXIgICAgJzInICAnMTInICAgICAgICAtPiAnNDA5NicKK3Bvd3gwMjMgcG93ZXIgICAgJzInICAnMTUnICAgICAgICAtPiAnMzI3NjgnCitwb3d4MDI0IHBvd2VyICAgICcyJyAgJzE2JyAgICAgICAgLT4gJzY1NTM2JworcG93eDAyNSBwb3dlciAgICAnMicgICczMScgICAgICAgIC0+ICcyMTQ3NDgzNjQ4JworLS0gTkIgMCBub3Qgc3RyaXBwZWQgaW4gbmV4dAorcG93eDAyNiBwb3dlciAgICAnMicgICczMicgICAgICAgIC0+ICc0Mjk0OTY3Mjk2JworCitwcmVjaXNpb246IDkKK3Bvd3gwMjcgcG93ZXIgICAgJzInICAnMzEnICAgICAgICAtPiAnMi4xNDc0ODM2NUUrOScgSW5leGFjdCBSb3VuZGVkCistLSBOQiAwIG5vdCBzdHJpcHBlZCBpbiBuZXh0Citwb3d4MDI4IHBvd2VyICAgICcyJyAgJzMyJyAgICAgICAgLT4gJzQuMjk0OTY3MzBFKzknIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMAorcG93eDAyOSBwb3dlciAgICAnMicgICczMScgICAgICAgIC0+ICcyMTQ3NDgzNjQ4JworcG93eDAzMCBwb3dlciAgICAnMicgICczMicgICAgICAgIC0+ICc0Mjk0OTY3Mjk2JworcHJlY2lzaW9uOiA5CisKK3Bvd3gwMzEgcG93ZXIgICAgJzMnICAnMicgICAgICAgICAtPiA5Citwb3d4MDMyIHBvd2VyICAgICc0JyAgJzInICAgICAgICAgLT4gMTYKK3Bvd3gwMzMgcG93ZXIgICAgJzUnICAnMicgICAgICAgICAtPiAyNQorcG93eDAzNCBwb3dlciAgICAnNicgICcyJyAgICAgICAgIC0+IDM2Citwb3d4MDM1IHBvd2VyICAgICc3JyAgJzInICAgICAgICAgLT4gNDkKK3Bvd3gwMzYgcG93ZXIgICAgJzgnICAnMicgICAgICAgICAtPiA2NAorcG93eDAzNyBwb3dlciAgICAnOScgICcyJyAgICAgICAgIC0+IDgxCitwb3d4MDM4IHBvd2VyICAgICcxMCcgJzInICAgICAgICAgLT4gMTAwCitwb3d4MDM5IHBvd2VyICAgICcxMScgJzInICAgICAgICAgLT4gMTIxCitwb3d4MDQwIHBvd2VyICAgICcxMicgJzInICAgICAgICAgLT4gMTQ0CisKK3Bvd3gwNDEgcG93ZXIgICAgJzMnICAnMycgICAgICAgICAtPiAyNworcG93eDA0MiBwb3dlciAgICAnNCcgICczJyAgICAgICAgIC0+IDY0Citwb3d4MDQzIHBvd2VyICAgICc1JyAgJzMnICAgICAgICAgLT4gMTI1Citwb3d4MDQ0IHBvd2VyICAgICc2JyAgJzMnICAgICAgICAgLT4gMjE2Citwb3d4MDQ1IHBvd2VyICAgICc3JyAgJzMnICAgICAgICAgLT4gMzQzCitwb3d4MDQ3IHBvd2VyICAgJy0zJyAgJzMnICAgICAgICAgLT4gLTI3Citwb3d4MDQ4IHBvd2VyICAgJy00JyAgJzMnICAgICAgICAgLT4gLTY0Citwb3d4MDQ5IHBvd2VyICAgJy01JyAgJzMnICAgICAgICAgLT4gLTEyNQorcG93eDA1MCBwb3dlciAgICctNicgICczJyAgICAgICAgIC0+IC0yMTYKK3Bvd3gwNTEgcG93ZXIgICAnLTcnICAnMycgICAgICAgICAtPiAtMzQzCisKK3Bvd3gwNTIgcG93ZXIgICAnMTAnICAnMCcgICAgICAgICAtPiAxCitwb3d4MDUzIHBvd2VyICAgJzEwJyAgJzEnICAgICAgICAgLT4gMTAKK3Bvd3gwNTQgcG93ZXIgICAnMTAnICAnMicgICAgICAgICAtPiAxMDAKK3Bvd3gwNTUgcG93ZXIgICAnMTAnICAnMycgICAgICAgICAtPiAxMDAwCitwb3d4MDU2IHBvd2VyICAgJzEwJyAgJzQnICAgICAgICAgLT4gMTAwMDAKK3Bvd3gwNTcgcG93ZXIgICAnMTAnICAnNScgICAgICAgICAtPiAxMDAwMDAKK3Bvd3gwNTggcG93ZXIgICAnMTAnICAnNicgICAgICAgICAtPiAxMDAwMDAwCitwb3d4MDU5IHBvd2VyICAgJzEwJyAgJzcnICAgICAgICAgLT4gMTAwMDAwMDAKK3Bvd3gwNjAgcG93ZXIgICAnMTAnICAnOCcgICAgICAgICAtPiAxMDAwMDAwMDAKK3Bvd3gwNjEgcG93ZXIgICAnMTAnICAnOScgICAgICAgICAtPiAxLjAwMDAwMDAwRSs5IFJvdW5kZWQKK3Bvd3gwNjIgcG93ZXIgICAnMTAnICAnMjInICAgICAgICAtPiAxLjAwMDAwMDAwRSsyMiBSb3VuZGVkCitwb3d4MDYzIHBvd2VyICAgJzEwJyAgJzc3JyAgICAgICAgLT4gMS4wMDAwMDAwMEUrNzcgUm91bmRlZAorcG93eDA2NCBwb3dlciAgICcxMCcgICc5OScgICAgICAgIC0+IDEuMDAwMDAwMDBFKzk5IFJvdW5kZWQKKworcG93eDA3MCBwb3dlciAgJzAuMycgICcwJyAgICAgICAgICAgLT4gJzEnCitwb3d4MDcxIHBvd2VyICAnMC4zJyAgJzEnICAgICAgICAgICAtPiAnMC4zJworcG93eDA3MiBwb3dlciAgJzAuMycgICcxLjAwJyAgICAgICAgLT4gJzAuMycKK3Bvd3gwNzMgcG93ZXIgICcwLjMnICAnMi4wMCcgICAgICAgIC0+ICcwLjA5JworcG93eDA3NCBwb3dlciAgJzAuMycgICcyLjAwMDAwMDAwMCcgLT4gJzAuMDknCitwb3d4MDc1IHBvd2VyICAnNi4wJyAgJzEnICAgICAgICAgICAtPiAnNi4wJyAgICAgLS0gTkIgemVyb3Mgbm90IHN0cmlwcGVkCitwb3d4MDc2IHBvd2VyICAnNi4wJyAgJzInICAgICAgICAgICAtPiAnMzYuMDAnICAgLS0gLi4KK3Bvd3gwNzcgcG93ZXIgICAnLTMnICAnMicgICAgICAgICAgIC0+ICc5JyAgICAgICAtLSBmcm9tIE5ldFJleHggYm9vaworcG93eDA3OCBwb3dlciAgICAnNCcgICczJyAgICAgICAgICAgLT4gJzY0JyAgICAgIC0tIC4uIChzb3J0IG9mKQorCitwb3d4MDgwIHBvd2VyICAgMC4xICAgIDAgICAgICAgICAgICAtPiAxCitwb3d4MDgxIHBvd2VyICAgMC4xICAgIDEgICAgICAgICAgICAtPiAwLjEKK3Bvd3gwODIgcG93ZXIgICAwLjEgICAgMiAgICAgICAgICAgIC0+IDAuMDEKK3Bvd3gwODMgcG93ZXIgICAwLjEgICAgMyAgICAgICAgICAgIC0+IDAuMDAxCitwb3d4MDg0IHBvd2VyICAgMC4xICAgIDQgICAgICAgICAgICAtPiAwLjAwMDEKK3Bvd3gwODUgcG93ZXIgICAwLjEgICAgNSAgICAgICAgICAgIC0+IDAuMDAwMDEKK3Bvd3gwODYgcG93ZXIgICAwLjEgICAgNiAgICAgICAgICAgIC0+IDAuMDAwMDAxCitwb3d4MDg3IHBvd2VyICAgMC4xICAgIDcgICAgICAgICAgICAtPiAxRS03Citwb3d4MDg4IHBvd2VyICAgMC4xICAgIDggICAgICAgICAgICAtPiAxRS04Citwb3d4MDg5IHBvd2VyICAgMC4xICAgIDkgICAgICAgICAgICAtPiAxRS05CisKK3Bvd3gwOTAgcG93ZXIgICAxMDEgICAgMiAgICAgICAgICAgIC0+IDEwMjAxCitwb3d4MDkxIHBvd2VyICAgMTAxICAgIDMgICAgICAgICAgICAtPiAxMDMwMzAxCitwb3d4MDkyIHBvd2VyICAgMTAxICAgIDQgICAgICAgICAgICAtPiAxMDQwNjA0MDEKK3Bvd3gwOTMgcG93ZXIgICAxMDEgICAgNSAgICAgICAgICAgIC0+IDEuMDUxMDEwMDVFKzEwIEluZXhhY3QgUm91bmRlZAorcG93eDA5NCBwb3dlciAgIDEwMSAgICA2ICAgICAgICAgICAgLT4gMS4wNjE1MjAxNUUrMTIgSW5leGFjdCBSb3VuZGVkCitwb3d4MDk1IHBvd2VyICAgMTAxICAgIDcgICAgICAgICAgICAtPiAxLjA3MjEzNTM1RSsxNCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmUgcG93ZXJzCitwb3d4MDk5IHBvd2VyICAnMScgICctMScgICAgLT4gMQorcG93eDEwMCBwb3dlciAgJzMnICAnLTEnICAgIC0+IDAuMzMzMzMzMzMzIEluZXhhY3QgUm91bmRlZAorcG93eDEwMSBwb3dlciAgJzInICAnLTEnICAgIC0+IDAuNQorcG93eDEwMiBwb3dlciAgJzInICAnLTInICAgIC0+IDAuMjUKK3Bvd3gxMDMgcG93ZXIgICcyJyAgJy00JyAgICAtPiAwLjA2MjUKK3Bvd3gxMDQgcG93ZXIgICcyJyAgJy04JyAgICAtPiAwLjAwMzkwNjI1Citwb3d4MTA1IHBvd2VyICAnMicgICctMTYnICAgLT4gMC4wMDAwMTUyNTg3ODkxIEluZXhhY3QgUm91bmRlZAorcG93eDEwNiBwb3dlciAgJzInICAnLTMyJyAgIC0+IDIuMzI4MzA2NDRFLTEwIEluZXhhY3QgUm91bmRlZAorcG93eDEwOCBwb3dlciAgJzInICAnLTY0JyAgIC0+IDUuNDIxMDEwODZFLTIwIEluZXhhY3QgUm91bmRlZAorcG93eDExMCBwb3dlciAgJzEwJyAgJy04JyAgIC0+IDFFLTgKK3Bvd3gxMTEgcG93ZXIgICcxMCcgICctNycgICAtPiAxRS03Citwb3d4MTEyIHBvd2VyICAnMTAnICAnLTYnICAgLT4gMC4wMDAwMDEKK3Bvd3gxMTMgcG93ZXIgICcxMCcgICctNScgICAtPiAwLjAwMDAxCitwb3d4MTE0IHBvd2VyICAnMTAnICAnLTQnICAgLT4gMC4wMDAxCitwb3d4MTE1IHBvd2VyICAnMTAnICAnLTMnICAgLT4gMC4wMDEKK3Bvd3gxMTYgcG93ZXIgICcxMCcgICctMicgICAtPiAwLjAxCitwb3d4MTE3IHBvd2VyICAnMTAnICAnLTEnICAgLT4gMC4xCitwb3d4MTIxIHBvd2VyICAnMTAnICAnLTc3JyAgLT4gJzFFLTc3JworcG93eDEyMiBwb3dlciAgJzEwJyAgJy0yMicgIC0+ICcxRS0yMicKKworcG93eDEyMyBwb3dlciAgICcyJyAgJy0xJyAgIC0+ICcwLjUnCitwb3d4MTI0IHBvd2VyICAgJzInICAnLTInICAgLT4gJzAuMjUnCitwb3d4MTI1IHBvd2VyICAgJzInICAnLTQnICAgLT4gJzAuMDYyNScKKworcG93eDEyNiBwb3dlciAgICcwJyAgJy0xJyAgIC0+IEluZmluaXR5Citwb3d4MTI3IHBvd2VyICAgJzAnICAnLTInICAgLT4gSW5maW5pdHkKK3Bvd3gxMjggcG93ZXIgICAtMCAgICctMScgICAtPiAtSW5maW5pdHkKK3Bvd3gxMjkgcG93ZXIgICAtMCAgICctMicgICAtPiBJbmZpbml0eQorCistLSAiMC41IiB0ZXN0cyBmcm9tIG9yaWdpbmFsIFJleHggZGlhZ25vc3RpY3MgW2xvb3AgdW5yb2xsZWRdCitwb3d4MjAwIHBvd2VyICAgMC41ICAgIDAgICAgLT4gMQorcG93eDIwMSBwb3dlciAgIDAuNSAgICAxICAgIC0+IDAuNQorcG93eDIwMiBwb3dlciAgIDAuNSAgICAyICAgIC0+IDAuMjUKK3Bvd3gyMDMgcG93ZXIgICAwLjUgICAgMyAgICAtPiAwLjEyNQorcG93eDIwNCBwb3dlciAgIDAuNSAgICA0ICAgIC0+IDAuMDYyNQorcG93eDIwNSBwb3dlciAgIDAuNSAgICA1ICAgIC0+IDAuMDMxMjUKK3Bvd3gyMDYgcG93ZXIgICAwLjUgICAgNiAgICAtPiAwLjAxNTYyNQorcG93eDIwNyBwb3dlciAgIDAuNSAgICA3ICAgIC0+IDAuMDA3ODEyNQorcG93eDIwOCBwb3dlciAgIDAuNSAgICA4ICAgIC0+IDAuMDAzOTA2MjUKK3Bvd3gyMDkgcG93ZXIgICAwLjUgICAgOSAgICAtPiAwLjAwMTk1MzEyNQorcG93eDIxMCBwb3dlciAgIDAuNSAgIDEwICAgIC0+IDAuMDAwOTc2NTYyNQorCitwb3d4MjExIHBvd2VyIDEgIDEwMDAwMDAwMCAgLT4gMQorcG93eDIxMiBwb3dlciAxICA5OTk5OTk5OTggIC0+IDEKK3Bvd3gyMTMgcG93ZXIgMSAgOTk5OTk5OTk5ICAtPiAxCisKKworLS0gVGhlIFZpZW5uYSBjYXNlLiAgQ2hlY2tzIGJvdGggc2V0dXAgYW5kIDEvYWNjIHdvcmtpbmcgcHJlY2lzaW9uCistLSBNb2RpZmllZCAxOTk4LjEyLjE0IGFzIFJIUyBubyBsb25nZXIgcm91bmRlZCBiZWZvcmUgdXNlIChtdXN0IGZpdCkKKy0tIE1vZGlmaWVkIDE5OTAuMDIuMDQgYXMgTEhTIGlzIG5vdyByb3VuZGVkIChpbnN0ZWFkIG9mIHRydW5jYXRlZCB0byBndWFyZCkKKy0tICAgICcxMjM0NTY3ODlFKzEwJyAgICAtLSBsaHMgLi4gcm91bmRlZCB0byAxLjIzRSsxOAorLS0gICAgJy0xLjIzMDAwZSsyJyAgICAgIC0tIHJocyAuLiBbd2FzOiAtMS4yMzQ1NWUrMiwgcm91bmRzIHRvIC0xMjNdCistLSBNb2RpZmllZCAyMDAyLjEwLjA2IC0tIGZpbmFsbHksIG5vIGlucHV0IHJvdW5kaW5nCistLSBXaXRoIGlucHV0IHJvdW5kaW5nLCByZXN1bHQgd291bGQgYmUgOC43NEUtMjIyNgorcHJlY2lzaW9uOiAzCittYXhleHBvbmVudDogNTAwMAorbWluZXhwb25lbnQ6IC01MDAwCitwb3d4MjE5IHBvd2VyICcxMjM0NTY3ODlFKzEwJyAnLTEuMjMwMDBlKzInIC0+ICc1LjU0RS0yMjI2JyBJbmV4YWN0IFJvdW5kZWQKKworLS0gemVyb3MKK21heGV4cG9uZW50OiArOTYKK21pbmV4cG9uZW50OiAtOTUKK3ByZWNpc2lvbjogNworcG93eDIyMyBwb3dlciAgICAgICAgICAwRS0zMCAzICAtPiAgMAorcG93eDIyNCBwb3dlciAgICAgICAgICAwRS0xMCAzICAtPiAgMAorcG93eDIyNSBwb3dlciAgICAgICAgICAwRS0xICAzICAtPiAgMAorcG93eDIyNiBwb3dlciAgICAgICAgICAwRSswICAzICAtPiAgMAorcG93eDIyNyBwb3dlciAgICAgICAgICAwICAgICAzICAtPiAgMAorcG93eDIyOCBwb3dlciAgICAgICAgICAwRSsxICAzICAtPiAgMAorcG93eDIyOSBwb3dlciAgICAgICAgICAwRSsxMCAzICAtPiAgMAorcG93eDIzMCBwb3dlciAgICAgICAgICAwRSszMCAzICAtPiAgMAorcG93eDIzMSBwb3dlciAgICAgMyAgICAwRS0zMCAgICAtPiAgMQorcG93eDIzMiBwb3dlciAgICAgMyAgICAwRS0xMCAgICAtPiAgMQorcG93eDIzMyBwb3dlciAgICAgMyAgICAwRS0xICAgICAtPiAgMQorcG93eDIzNCBwb3dlciAgICAgMyAgICAwRSswICAgICAtPiAgMQorcG93eDIzNSBwb3dlciAgICAgMyAgICAwICAgICAgICAtPiAgMQorcG93eDIzNiBwb3dlciAgICAgMyAgICAwRSsxICAgICAtPiAgMQorcG93eDIzNyBwb3dlciAgICAgMyAgICAwRSsxMCAgICAtPiAgMQorcG93eDIzOCBwb3dlciAgICAgMyAgICAwRSszMCAgICAtPiAgMQorcG93eDIzOSBwb3dlciAgICAgICAgICAwRS0zMCAtMyAtPiAgSW5maW5pdHkKK3Bvd3gyNDAgcG93ZXIgICAgICAgICAgMEUtMTAgLTMgLT4gIEluZmluaXR5Citwb3d4MjQxIHBvd2VyICAgICAgICAgIDBFLTEgIC0zIC0+ICBJbmZpbml0eQorcG93eDI0MiBwb3dlciAgICAgICAgICAwRSswICAtMyAtPiAgSW5maW5pdHkKK3Bvd3gyNDMgcG93ZXIgICAgICAgICAgMCAgICAgLTMgLT4gIEluZmluaXR5Citwb3d4MjQ0IHBvd2VyICAgICAgICAgIDBFKzEgIC0zIC0+ICBJbmZpbml0eQorcG93eDI0NSBwb3dlciAgICAgICAgICAwRSsxMCAtMyAtPiAgSW5maW5pdHkKK3Bvd3gyNDYgcG93ZXIgICAgICAgICAgMEUrMzAgLTMgLT4gIEluZmluaXR5Citwb3d4MjQ3IHBvd2VyICAgIC0zICAgIDBFLTMwICAgIC0+ICAxCitwb3d4MjQ4IHBvd2VyICAgIC0zICAgIDBFLTEwICAgIC0+ICAxCitwb3d4MjQ5IHBvd2VyICAgIC0zICAgIDBFLTEgICAgIC0+ICAxCitwb3d4MjUwIHBvd2VyICAgIC0zICAgIDBFKzAgICAgIC0+ICAxCitwb3d4MjUxIHBvd2VyICAgIC0zICAgIDAgICAgICAgIC0+ICAxCitwb3d4MjUyIHBvd2VyICAgIC0zICAgIDBFKzEgICAgIC0+ICAxCitwb3d4MjUzIHBvd2VyICAgIC0zICAgIDBFKzEwICAgIC0+ICAxCitwb3d4MjU0IHBvd2VyICAgIC0zICAgIDBFKzMwICAgIC0+ICAxCisKKy0tIGEgZmV3IGxocyBuZWdhdGl2ZXMKK3ByZWNpc2lvbjogOQorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3Bvd3gyNjAgcG93ZXIgICAtMTAgICAnMCcgICAgICAgICAtPiAxCitwb3d4MjYxIHBvd2VyICAgLTEwICAgJzEnICAgICAgICAgLT4gLTEwCitwb3d4MjYyIHBvd2VyICAgLTEwICAgJzInICAgICAgICAgLT4gMTAwCitwb3d4MjYzIHBvd2VyICAgLTEwICAgJzMnICAgICAgICAgLT4gLTEwMDAKK3Bvd3gyNjQgcG93ZXIgICAtMTAgICAnNCcgICAgICAgICAtPiAxMDAwMAorcG93eDI2NSBwb3dlciAgIC0xMCAgICc1JyAgICAgICAgIC0+IC0xMDAwMDAKK3Bvd3gyNjYgcG93ZXIgICAtMTAgICAnNicgICAgICAgICAtPiAxMDAwMDAwCitwb3d4MjY3IHBvd2VyICAgLTEwICAgJzcnICAgICAgICAgLT4gLTEwMDAwMDAwCitwb3d4MjY4IHBvd2VyICAgLTEwICAgJzgnICAgICAgICAgLT4gMTAwMDAwMDAwCitwb3d4MjY5IHBvd2VyICAgLTEwICAgJzknICAgICAgICAgLT4gLTEuMDAwMDAwMDBFKzkgUm91bmRlZAorcG93eDI3MCBwb3dlciAgIC0xMCAgICcyMicgICAgICAgIC0+IDEuMDAwMDAwMDBFKzIyIFJvdW5kZWQKK3Bvd3gyNzEgcG93ZXIgICAtMTAgICAnNzcnICAgICAgICAtPiAtMS4wMDAwMDAwMEUrNzcgUm91bmRlZAorcG93eDI3MiBwb3dlciAgIC0xMCAgICc5OScgICAgICAgIC0+IC0xLjAwMDAwMDAwRSs5OSBSb3VuZGVkCisKKy0tIHNvbWUgbW9yZSBlZGdlIGNhc2VzCitwcmVjaXNpb246ICAgMTUKK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5Citwb3d4MzkxIHBvd2VyICAwLjEgICA5OTkgLT4gMUUtOTk5Citwb3d4MzkyIHBvd2VyICAwLjA5OSA5OTkgLT4gNC4zNjA3MzIwNjJFLTEwMDQgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzOTMgcG93ZXIgIDAuMDk4IDk5OSAtPiAxLjcxNzMxRS0xMDA4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4Mzk0IHBvd2VyICAwLjA5NyA5OTkgLT4gNkUtMTAxMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDM5NSBwb3dlciAgMC4wOTYgOTk5IC0+IDBFLTEwMTMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDM5NiBwb3dlciAgMC4wMSAgOTk5IC0+IDBFLTEwMTMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDM5NyBwb3dlciAgMC4wMiAxMDAwMDAwMDAgLT4gMEUtMTAxMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIG11bHRpcGx5IHRlc3RzIGFyZSBoZXJlIHRvIGFpZCBjaGVja2luZyBhbmQgdGVzdCBmb3IgY29uc2lzdGVudCBoYW5kbGluZworLS0gb2YgdW5kZXJmbG93CitwcmVjaXNpb246IDUKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CisKKy0tIHNxdWFyZXMKK211bHg0MDAgbXVsdGlwbHkgIDFFLTUwMiAgICAgMWUtNTAyIC0+IDBFLTEwMDMgICAgU3Vibm9ybWFsIEluZXhhY3QgVW5kZXJmbG93IFJvdW5kZWQgQ2xhbXBlZAorbXVseDQwMSBtdWx0aXBseSAgMUUtNTAxICAgICAxZS01MDEgLT4gMUUtMTAwMiAgICBTdWJub3JtYWwKK211bHg0MDIgbXVsdGlwbHkgIDJFLTUwMSAgICAgMmUtNTAxIC0+IDRFLTEwMDIgICAgU3Vibm9ybWFsCittdWx4NDAzIG11bHRpcGx5ICA0RS01MDEgICAgIDRlLTUwMSAtPiAxLjZFLTEwMDEgIFN1Ym5vcm1hbAorbXVseDQwNCBtdWx0aXBseSAxMEUtNTAxICAgIDEwZS01MDEgLT4gMS4wMEUtMTAwMCBTdWJub3JtYWwKK211bHg0MDUgbXVsdGlwbHkgMzBFLTUwMSAgICAzMGUtNTAxIC0+IDkuMDBFLTEwMDAgU3Vibm9ybWFsCittdWx4NDA2IG11bHRpcGx5IDQwRS01MDEgICAgNDBlLTUwMSAtPiAxLjYwMEUtOTk5CisKK3Bvd3g0MDAgcG93ZXIgICAgIDFFLTUwMiAgICAgMiAgICAgIC0+IDBFLTEwMDMgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDQwMSBwb3dlciAgICAgMUUtNTAxICAgICAyICAgICAgLT4gMUUtMTAwMiAgICBTdWJub3JtYWwKK3Bvd3g0MDIgcG93ZXIgICAgIDJFLTUwMSAgICAgMiAgICAgIC0+IDRFLTEwMDIgICAgU3Vibm9ybWFsCitwb3d4NDAzIHBvd2VyICAgICA0RS01MDEgICAgIDIgICAgICAtPiAxLjZFLTEwMDEgIFN1Ym5vcm1hbAorcG93eDQwNCBwb3dlciAgICAxMEUtNTAxICAgICAyICAgICAgLT4gMS4wMEUtMTAwMCBTdWJub3JtYWwKK3Bvd3g0MDUgcG93ZXIgICAgMzBFLTUwMSAgICAgMiAgICAgIC0+IDkuMDBFLTEwMDAgU3Vibm9ybWFsCitwb3d4NDA2IHBvd2VyICAgIDQwRS01MDEgICAgIDIgICAgICAtPiAxLjYwMEUtOTk5CisKKy0tIGN1YmVzCittdWx4NDEwIG11bHRpcGx5ICAxRS02NzAgICAgIDFlLTMzNSAtPiAwRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK211bHg0MTEgbXVsdGlwbHkgIDFFLTY2OCAgICAgMWUtMzM0IC0+IDFFLTEwMDIgICAgU3Vibm9ybWFsCittdWx4NDEyIG11bHRpcGx5ICA0RS02NjggICAgIDJlLTMzNCAtPiA4RS0xMDAyICAgIFN1Ym5vcm1hbAorbXVseDQxMyBtdWx0aXBseSAgOUUtNjY4ICAgICAzZS0zMzQgLT4gMi43RS0xMDAxICBTdWJub3JtYWwKK211bHg0MTQgbXVsdGlwbHkgMTZFLTY2OCAgICAgNGUtMzM0IC0+IDYuNEUtMTAwMSAgU3Vibm9ybWFsCittdWx4NDE1IG11bHRpcGx5IDI1RS02NjggICAgIDVlLTMzNCAtPiAxLjI1RS0xMDAwIFN1Ym5vcm1hbAorbXVseDQxNiBtdWx0aXBseSAxMEUtNjY4ICAgMTAwZS0zMzQgLT4gMS4wMDBFLTk5OQorCitwb3d4NDEwIHBvd2VyICAgICAxRS0zMzUgICAgIDMgICAgICAtPiAwRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3g0MTEgcG93ZXIgICAgIDFFLTMzNCAgICAgMyAgICAgIC0+IDFFLTEwMDIgICAgU3Vibm9ybWFsCitwb3d4NDEyIHBvd2VyICAgICAyRS0zMzQgICAgIDMgICAgICAtPiA4RS0xMDAyICAgIFN1Ym5vcm1hbAorcG93eDQxMyBwb3dlciAgICAgM0UtMzM0ICAgICAzICAgICAgLT4gMi43RS0xMDAxICBTdWJub3JtYWwKK3Bvd3g0MTQgcG93ZXIgICAgIDRFLTMzNCAgICAgMyAgICAgIC0+IDYuNEUtMTAwMSAgU3Vibm9ybWFsCitwb3d4NDE1IHBvd2VyICAgICA1RS0zMzQgICAgIDMgICAgICAtPiAxLjI1RS0xMDAwIFN1Ym5vcm1hbAorcG93eDQxNiBwb3dlciAgICAxMEUtMzM0ICAgICAzICAgICAgLT4gMS4wMDBFLTk5OQorCistLSBuZWdhdGl2ZSBwb3dlcnMsIHRlc3Rpbmcgc3Vibm9ybWFscworcHJlY2lzaW9uOiAgIDUKK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5Citwb3d4NDIxIHBvd2VyICAyLjVFLTUwMSAgICAgLTIgICAgICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NDIyIHBvd2VyICAyLjVFLTUwMCAgICAgLTIgICAgICAgICAtPiAgMS42RSs5OTkKKworcG93eDQyMyBwb3dlciAgMi41RSs0OTkgICAgIC0yICAgICAgICAgLT4gIDEuNkUtOTk5Citwb3d4NDI0IHBvd2VyICAyLjVFKzUwMCAgICAgLTIgICAgICAgICAtPiAgMS42RS0xMDAxIFN1Ym5vcm1hbAorcG93eDQyNSBwb3dlciAgMi41RSs1MDEgICAgIC0yICAgICAgICAgLT4gICAgMkUtMTAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDQyNiBwb3dlciAgMi41RSs1MDIgICAgIC0yICAgICAgICAgLT4gICAgMEUtMTAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK3Bvd3g0MjcgcG93ZXIgMC4yNUUrNDk5ICAgICAtMiAgICAgICAgIC0+ICAxLjZFLTk5NworcG93eDQyOCBwb3dlciAwLjI1RSs1MDAgICAgIC0yICAgICAgICAgLT4gIDEuNkUtOTk5Citwb3d4NDI5IHBvd2VyIDAuMjVFKzUwMSAgICAgLTIgICAgICAgICAtPiAgMS42RS0xMDAxIFN1Ym5vcm1hbAorcG93eDQzMCBwb3dlciAwLjI1RSs1MDIgICAgIC0yICAgICAgICAgLT4gICAgMkUtMTAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDQzMSBwb3dlciAwLjI1RSs1MDMgICAgIC0yICAgICAgICAgLT4gICAgMEUtMTAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK3Bvd3g0MzIgcG93ZXIgMC4wNEUrNDk5ICAgICAtMiAgICAgICAgIC0+ICA2LjI1RS05OTYKK3Bvd3g0MzMgcG93ZXIgMC4wNEUrNTAwICAgICAtMiAgICAgICAgIC0+ICA2LjI1RS05OTgKK3Bvd3g0MzQgcG93ZXIgMC4wNEUrNTAxICAgICAtMiAgICAgICAgIC0+ICA2LjI1RS0xMDAwIFN1Ym5vcm1hbAorcG93eDQzNSBwb3dlciAwLjA0RSs1MDIgICAgIC0yICAgICAgICAgLT4gICA2LjJFLTEwMDIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzYgcG93ZXIgMC4wNEUrNTAzICAgICAtMiAgICAgICAgIC0+ICAgICAxRS0xMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4NDM3IHBvd2VyIDAuMDRFKzUwNCAgICAgLTIgICAgICAgICAtPiAgICAgMEUtMTAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK3Bvd3g0NDEgcG93ZXIgMC4wNEUrMzM0ICAgICAtMyAgICAgICAgIC0+ICAxLjU2MjVFLTk5OAorcG93eDQ0MiBwb3dlciAwLjA0RSszMzUgICAgIC0zICAgICAgICAgLT4gICAgMS41NkUtMTAwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDQ0MyBwb3dlciAwLjA0RSszMzYgICAgIC0zICAgICAgICAgLT4gICAgICAgMEUtMTAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4NDQ0IHBvd2VyIDAuMjVFKzMzMyAgICAgLTMgICAgICAgICAtPiAgICAgNi40RS05OTgKK3Bvd3g0NDUgcG93ZXIgMC4yNUUrMzM0ICAgICAtMyAgICAgICAgIC0+ICAgICA2LjRFLTEwMDEgU3Vibm9ybWFsCitwb3d4NDQ2IHBvd2VyIDAuMjVFKzMzNSAgICAgLTMgICAgICAgICAtPiAgICAgICAxRS0xMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4NDQ3IHBvd2VyIDAuMjVFKzMzNiAgICAgLTMgICAgICAgICAtPiAgICAgICAwRS0xMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKy0tIGNoZWNrIHNpZ24gZm9yIGN1YmVzICBhbmQgYSBmZXcgc3F1YXJlcworcG93eDQ0OCBwb3dlciAtMC4wNEUrMzM0ICAgIC0zICAgICAgICAgLT4gLTEuNTYyNUUtOTk4Citwb3d4NDQ5IHBvd2VyIC0wLjA0RSszMzUgICAgLTMgICAgICAgICAtPiAgIC0xLjU2RS0xMDAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4NDUwIHBvd2VyIC0wLjA0RSszMzYgICAgLTMgICAgICAgICAtPiAgICAgIC0wRS0xMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3g0NTEgcG93ZXIgLTAuMjVFKzMzMyAgICAtMyAgICAgICAgIC0+ICAgIC02LjRFLTk5OAorcG93eDQ1MiBwb3dlciAtMC4yNUUrMzM0ICAgIC0zICAgICAgICAgLT4gICAgLTYuNEUtMTAwMSBTdWJub3JtYWwKK3Bvd3g0NTMgcG93ZXIgLTAuMjVFKzMzNSAgICAtMyAgICAgICAgIC0+ICAgICAgLTFFLTEwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0NTQgcG93ZXIgLTAuMjVFKzMzNiAgICAtMyAgICAgICAgIC0+ICAgICAgLTBFLTEwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDQ1NSBwb3dlciAtMC4wNEUrNDk5ICAgIC0yICAgICAgICAgLT4gICAgNi4yNUUtOTk2Citwb3d4NDU2IHBvd2VyIC0wLjA0RSs1MDAgICAgLTIgICAgICAgICAtPiAgICA2LjI1RS05OTgKK3Bvd3g0NTcgcG93ZXIgLTAuMDRFKzUwMSAgICAtMiAgICAgICAgIC0+ICAgIDYuMjVFLTEwMDAgU3Vibm9ybWFsCitwb3d4NDU4IHBvd2VyIC0wLjA0RSs1MDIgICAgLTIgICAgICAgICAtPiAgICAgNi4yRS0xMDAyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRlc3QgLTBzCitwcmVjaXNpb246IDkKK3Bvd3g1NjAgcG93ZXIgIDAgIDAgICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g1NjEgcG93ZXIgIDAgLTAgICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g1NjIgcG93ZXIgLTAgIDAgICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g1NjMgcG93ZXIgLTAgLTAgICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g1NjQgcG93ZXIgIDEgIDAgICAgICAgIC0+ICAxCitwb3d4NTY1IHBvd2VyICAxIC0wICAgICAgICAtPiAgMQorcG93eDU2NiBwb3dlciAtMSAgMCAgICAgICAgLT4gIDEKK3Bvd3g1NjcgcG93ZXIgLTEgLTAgICAgICAgIC0+ICAxCitwb3d4NTY4IHBvd2VyICAwICAxICAgICAgICAtPiAgMAorcG93eDU2OSBwb3dlciAgMCAtMSAgICAgICAgLT4gIEluZmluaXR5Citwb3d4NTcwIHBvd2VyIC0wICAxICAgICAgICAtPiAtMAorcG93eDU3MSBwb3dlciAtMCAtMSAgICAgICAgLT4gLUluZmluaXR5Citwb3d4NTcyIHBvd2VyICAwICAyICAgICAgICAtPiAgMAorcG93eDU3MyBwb3dlciAgMCAtMiAgICAgICAgLT4gIEluZmluaXR5Citwb3d4NTc0IHBvd2VyIC0wICAyICAgICAgICAtPiAgMAorcG93eDU3NSBwb3dlciAtMCAtMiAgICAgICAgLT4gIEluZmluaXR5Citwb3d4NTc2IHBvd2VyICAwICAzICAgICAgICAtPiAgMAorcG93eDU3NyBwb3dlciAgMCAtMyAgICAgICAgLT4gIEluZmluaXR5Citwb3d4NTc4IHBvd2VyIC0wICAzICAgICAgICAtPiAtMAorcG93eDU3OSBwb3dlciAtMCAtMyAgICAgICAgLT4gLUluZmluaXR5CisKKy0tIFNwZWNpYWxzCitwb3d4NTgwIHBvd2VyICBJbmYgIC1JbmYgICAtPiAgMAorcG93eDU4MSBwb3dlciAgSW5mICAtMTAwMCAgLT4gIDAKK3Bvd3g1ODIgcG93ZXIgIEluZiAgLTEgICAgIC0+ICAwCitwb3d4NTgzIHBvd2VyICBJbmYgIC0wLjUgICAtPiAgMAorcG93eDU4NCBwb3dlciAgSW5mICAtMCAgICAgLT4gIDEKK3Bvd3g1ODUgcG93ZXIgIEluZiAgIDAgICAgIC0+ICAxCitwb3d4NTg2IHBvd2VyICBJbmYgICAwLjUgICAtPiAgSW5maW5pdHkKK3Bvd3g1ODcgcG93ZXIgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorcG93eDU4OCBwb3dlciAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5Citwb3d4NTg5IHBvd2VyICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK3Bvd3g1OTAgcG93ZXIgLTEwMDAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NTkxIHBvd2VyIC1JbmYgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDU5MiBwb3dlciAtMSAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g1OTMgcG93ZXIgLTAuNSAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NTk0IHBvd2VyIC0wICAgICBJbmYgICAtPiAgMAorcG93eDU5NSBwb3dlciAgMCAgICAgSW5mICAgLT4gIDAKK3Bvd3g1OTYgcG93ZXIgIDAuNSAgIEluZiAgIC0+ICAwCitwb3d4NTk3IHBvd2VyICAxICAgICBJbmYgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g1OTggcG93ZXIgIDEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorcG93eDU5OSBwb3dlciAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK3Bvd3g2MDAgcG93ZXIgLUluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjAxIHBvd2VyIC1JbmYgIC0xMDAwICAtPiAgMAorcG93eDYwMiBwb3dlciAtSW5mICAtMSAgICAgLT4gLTAKK3Bvd3g2MDMgcG93ZXIgLUluZiAgLTAuNSAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjA0IHBvd2VyIC1JbmYgIC0wICAgICAtPiAgMQorcG93eDYwNSBwb3dlciAtSW5mICAgMCAgICAgLT4gIDEKK3Bvd3g2MDYgcG93ZXIgLUluZiAgIDAuNSAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjA3IHBvd2VyIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK3Bvd3g2MDggcG93ZXIgLUluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorcG93eDYwOSBwb3dlciAtSW5mICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2MTAgcG93ZXIgLTEwMDAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjExIHBvd2VyIC1JbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDYxMiBwb3dlciAtMSAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2MTMgcG93ZXIgLTAuNSAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjE0IHBvd2VyIC0wICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK3Bvd3g2MTUgcG93ZXIgIDAgICAgLUluZiAgIC0+ICBJbmZpbml0eQorcG93eDYxNiBwb3dlciAgMC41ICAtSW5mICAgLT4gIEluZmluaXR5Citwb3d4NjE3IHBvd2VyICAxICAgIC1JbmYgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g2MTggcG93ZXIgIDEwMDAgLUluZiAgIC0+ICAwCitwb3d4NjE5IHBvd2VyICBJbmYgIC1JbmYgICAtPiAgMAorCitwb3d4NjIxIHBvd2VyICBOYU4gLUluZiAgICAtPiAgTmFOCitwb3d4NjIyIHBvd2VyICBOYU4gLTEwMDAgICAtPiAgTmFOCitwb3d4NjIzIHBvd2VyICBOYU4gLTEgICAgICAtPiAgTmFOCitwb3d4NjI0IHBvd2VyICBOYU4gLTAuNSAgICAtPiAgTmFOCitwb3d4NjI1IHBvd2VyICBOYU4gLTAgICAgICAtPiAgTmFOCitwb3d4NjI2IHBvd2VyICBOYU4gIDAgICAgICAtPiAgTmFOCitwb3d4NjI3IHBvd2VyICBOYU4gIDAuNSAgICAtPiAgTmFOCitwb3d4NjI4IHBvd2VyICBOYU4gIDEgICAgICAtPiAgTmFOCitwb3d4NjI5IHBvd2VyICBOYU4gIDEwMDAgICAtPiAgTmFOCitwb3d4NjMwIHBvd2VyICBOYU4gIEluZiAgICAtPiAgTmFOCitwb3d4NjMxIHBvd2VyICBOYU4gIE5hTiAgICAtPiAgTmFOCitwb3d4NjMyIHBvd2VyIC1JbmYgIE5hTiAgICAtPiAgTmFOCitwb3d4NjMzIHBvd2VyIC0xMDAwIE5hTiAgICAtPiAgTmFOCitwb3d4NjM0IHBvd2VyIC0xICAgIE5hTiAgICAtPiAgTmFOCitwb3d4NjM1IHBvd2VyIC0wICAgIE5hTiAgICAtPiAgTmFOCitwb3d4NjM2IHBvd2VyICAwICAgIE5hTiAgICAtPiAgTmFOCitwb3d4NjM3IHBvd2VyICAxICAgIE5hTiAgICAtPiAgTmFOCitwb3d4NjM4IHBvd2VyICAxMDAwIE5hTiAgICAtPiAgTmFOCitwb3d4NjM5IHBvd2VyICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK3Bvd3g2NDEgcG93ZXIgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjQyIHBvd2VyICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY0MyBwb3dlciAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NDQgcG93ZXIgIHNOYU4gLTAuNSAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjQ1IHBvd2VyICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY0NiBwb3dlciAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NDcgcG93ZXIgIHNOYU4gIDAuNSAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjQ4IHBvd2VyICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY0OSBwb3dlciAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NTAgcG93ZXIgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjUxIHBvd2VyICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY1MiBwb3dlciAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NTMgcG93ZXIgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjU0IHBvd2VyIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY1NSBwb3dlciAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NTYgcG93ZXIgLTAuNSAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjU3IHBvd2VyIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY1OCBwb3dlciAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NTkgcG93ZXIgIDAuNSAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjYwIHBvd2VyICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY2MSBwb3dlciAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NjIgcG93ZXIgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjYzIHBvd2VyICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOYU4gcHJvcGFnYXRpb24KK3Bvd3g2NzAgcG93ZXIgIE5hTjMgIHNOYU43ICAtPiAgTmFONyAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NzEgcG93ZXIgIHNOYU44ICBOYU42ICAtPiAgTmFOOCAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NzIgcG93ZXIgIDEgICAgIHNOYU43ICAtPiAgTmFONyAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NzMgcG93ZXIgIHNOYU44ICAxICAgICAtPiAgTmFOOCAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NzQgcG93ZXIgIEluZiAgIHNOYU43ICAtPiAgTmFONyAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NzUgcG93ZXIgIHNOYU44ICBJbmYgICAtPiAgTmFOOCAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NzYgcG93ZXIgIEluZiAgICBOYU45ICAtPiAgTmFOOQorcG93eDY3NyBwb3dlciAgTmFONiAgIEluZiAgIC0+ICBOYU42Citwb3d4Njc4IHBvd2VyICAxICAgICAgTmFONSAgLT4gIE5hTjUKK3Bvd3g2NzkgcG93ZXIgIE5hTjIgICAxICAgICAtPiAgTmFOMgorcG93eDY4MCBwb3dlciAgTmFOMiAgIE5hbjQgIC0+ICBOYU4yCitwb3d4NjgxIHBvd2VyICBOYU4gICAgTmFuNCAgLT4gIE5hTgorcG93eDY4MiBwb3dlciAgTmFOMzQ1IE5hbiAgIC0+ICBOYU4zNDUKK3Bvd3g2ODMgcG93ZXIgIEluZiAgICAtc05hTjcgLT4gLU5hTjcgIEludmFsaWRfb3BlcmF0aW9uCitwb3d4Njg0IHBvd2VyICAtc05hTjggIEluZiAgIC0+IC1OYU44ICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY4NSBwb3dlciAgSW5mICAgIC1OYU45ICAtPiAtTmFOOQorcG93eDY4NiBwb3dlciAgLU5hTjYgICBJbmYgICAtPiAtTmFONgorcG93eDY4NyBwb3dlciAgLU5hTjIgIC1OYW40ICAtPiAtTmFOMgorCistLSBsb25nIG9wZXJhbmQgYW5kIFJIUyByYW5nZSBjaGVja3MKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK3Bvd3g3MDEgcG93ZXIgMTIzNDU2NzgwMDAgMSAtPiAxLjIzNDU2NzgwRSsxMCBSb3VuZGVkCitwb3d4NzAyIHBvd2VyIDEyMzQ1Njc4MDAgIDEgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCitwb3d4NzAzIHBvd2VyIDEyMzQ1Njc4OTAgIDEgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCitwb3d4NzA0IHBvd2VyIDEyMzQ1Njc4OTEgIDEgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g3MDUgcG93ZXIgMTIzNDU2Nzg5MDEgMSAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g3MDYgcG93ZXIgMTIzNDU2Nzg5NiAgMSAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDE1CistLSBzdGlsbCBjaGVja2luZworcG93eDc0MSBwb3dlciAxMjM0NTY3ODAwMCAxIC0+IDEyMzQ1Njc4MDAwCitwb3d4NzQyIHBvd2VyIDEyMzQ1Njc4MDAgIDEgLT4gMTIzNDU2NzgwMAorcG93eDc0MyBwb3dlciAxMjM0NTY3ODkwICAxIC0+IDEyMzQ1Njc4OTAKK3Bvd3g3NDQgcG93ZXIgMTIzNDU2Nzg5MSAgMSAtPiAxMjM0NTY3ODkxCitwb3d4NzQ1IHBvd2VyIDEyMzQ1Njc4OTAxIDEgLT4gMTIzNDU2Nzg5MDEKK3Bvd3g3NDYgcG93ZXIgMTIzNDU2Nzg5NiAgMSAtPiAxMjM0NTY3ODk2CisKK21heGV4cG9uZW50OiA5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5CitwcmVjaXNpb246IDkKKworLS0gbmVhciBvdXQtb2YtcmFuZ2UgZWRnZSBjYXNlcworcG93eDE2MyBwb3dlciAgICcxMCcgICc5OTk5OTknIC0+ICcxLjAwMDAwMDAwRSs5OTk5OTknIFJvdW5kZWQKK3Bvd3gxNjQgcG93ZXIgICAnMTAnICAnOTk5OTk4JyAtPiAnMS4wMDAwMDAwMEUrOTk5OTk4JyBSb3VuZGVkCitwb3d4MTY1IHBvd2VyICAgJzEwJyAgJzk5OTk5NycgLT4gJzEuMDAwMDAwMDBFKzk5OTk5NycgUm91bmRlZAorcG93eDE2NiBwb3dlciAgICcxMCcgICczMzMzMzMnIC0+ICcxLjAwMDAwMDAwRSszMzMzMzMnIFJvdW5kZWQKK3Bvd3gxODMgcG93ZXIgICAnNycgICAnMTAwMDAwMCcgIC0+IDEuMDk2NTE0MTlFKzg0NTA5OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxODQgcG93ZXIgICAnNycgICAnMTAwMDAwMScgIC0+IDcuNjc1NTk5MzRFKzg0NTA5OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxODYgcG93ZXIgICAnNycgICAnLTEwMDAwMDEnIC0+IDEuMzAyODI5ODZFLTg0NTA5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxODcgcG93ZXIgICAnNycgICAnLTEwMDAwMDAnIC0+IDkuMTE5ODA5MDFFLTg0NTA5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMTggcG93ZXIgICcxMCcgICctMzMzMzMzJyAgIC0+IDFFLTMzMzMzMworcG93eDExOSBwb3dlciAgJzEwJyAgJy05OTk5OTgnICAgLT4gMUUtOTk5OTk4Citwb3d4MTIwIHBvd2VyICAnMTAnICAnLTk5OTk5OScgICAtPiAxRS05OTk5OTkKK3Bvd3gxODEgcG93ZXIgICAnNycgICAnOTk5OTk4JyAgIC0+IDIuMjM3Nzg0MDZFKzg0NTA5NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxODIgcG93ZXIgICAnNycgICAnOTk5OTk5JyAgIC0+IDEuNTY2NDQ4ODRFKzg0NTA5NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxODkgcG93ZXIgICAnNycgICAnLTk5OTk5OScgIC0+IDYuMzgzODY2MzFFLTg0NTA5OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxOTAgcG93ZXIgICAnNycgICAnLTk5OTk5OCcgIC0+IDQuNDY4NzA2NDFFLTg0NTA5NyBJbmV4YWN0IFJvdW5kZWQKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cworcHJlY2lzaW9uOiA5CisKK3Bvd3gyNzcgcG93ZXIgIDkgICAgICAgICAgICAgOTk5OTk5IC0+IDMuNTkwODQ2MjlFKzk1NDI0MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyNzggcG93ZXIgIDkuOTk5OTk5OTkgICAgOTk5OTk5IC0+IDkuOTkwMDA1MDFFKzk5OTk5OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyNzkgcG93ZXIgMTAgICAgICAgICAgICAgOTk5OTk5IC0+IDEuMDAwMDAwMDBFKzk5OTk5OSAgICAgICAgIFJvdW5kZWQKK3Bvd3gyODAgcG93ZXIgMTAuMDAwMDAwMSAgICAgOTk5OTk5IC0+IDEuMDEwMDUwMTZFKzk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyODEgcG93ZXIgMTAuMDAwMDAxICAgICAgOTk5OTk5IC0+IDEuMTA1MTcwODBFKzk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyODIgcG93ZXIgMTAuMDAwMDEgICAgICAgOTk5OTk5IC0+IDIuNzE4Mjc3NzVFKzk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyODMgcG93ZXIgMTAuMDAwMSAgICAgICAgOTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDI4NSBwb3dlciAxMSAgICAgICAgICAgICA5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4Mjg2IHBvd2VyIDEyICAgICAgICAgICAgIDk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyODcgcG93ZXIgOTk5ICAgICAgICAgICAgOTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDI4OCBwb3dlciA5OTk5OTk5OTkgICAgICA5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4Mjg5IHBvd2VyIDkuOUU5OTk5OTk5OTkgIDk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcG93eDI5MCBwb3dlciAwLjUgICAgICAgICAgICA5OTk5OTkgLT4gMi4wMjAwNjgxMkUtMzAxMDMwIEluZXhhY3QgUm91bmRlZAorcG93eDI5MSBwb3dlciAwLjEgICAgICAgICAgICA5OTk5OTkgLT4gMUUtOTk5OTk5ICAtLSB1bnJvdW5kZWQKK3Bvd3gyOTIgcG93ZXIgMC4wOSAgICAgICAgICAgOTk5OTk5IC0+IDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDI5MyBwb3dlciAwLjA1ICAgICAgICAgICA5OTk5OTkgLT4gMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4Mjk0IHBvd2VyIDAuMDEgICAgICAgICAgIDk5OTk5OSAtPiAwRS0xMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gyOTUgcG93ZXIgMC4wMDAxICAgICAgICAgOTk5OTk5IC0+IDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDI5NyBwb3dlciAwLjAwMDAwMDEgICAgICA5OTk5OTkgLT4gMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4Mjk4IHBvd2VyIDAuMDAwMDAwMDAwMSAgIDk5OTk5OSAtPiAwRS0xMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gyOTkgcG93ZXIgMUUtOTk5OTk5OTk5ICAgOTk5OTk5IC0+IDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitwb3d4MzEwIHBvd2VyIC05ICAgICAgICAgICAgIDk5OTk5OSAtPiAtMy41OTA4NDYyOUUrOTU0MjQxIEluZXhhY3QgUm91bmRlZAorcG93eDMxMSBwb3dlciAtMTAgICAgICAgICAgICA5OTk5OTkgLT4gLTEuMDAwMDAwMDBFKzk5OTk5OSBSb3VuZGVkCitwb3d4MzEyIHBvd2VyIC0xMC4wMDAxICAgICAgIDk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEzIHBvd2VyIC0xMC4xICAgICAgICAgIDk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MzE0IHBvd2VyIC0xMSAgICAgICAgICAgIDk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MzE1IHBvd2VyIC0xMiAgICAgICAgICAgIDk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MzE2IHBvd2VyIC05OTkgICAgICAgICAgIDk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MzE3IHBvd2VyIC05OTk5OTkgICAgICAgIDk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MzE4IHBvd2VyIC05OTk5OTk5OTkgICAgIDk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MzE5IHBvd2VyIC05LjlFOTk5OTk5OTk5IDk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK3Bvd3gzMjAgcG93ZXIgLTAuNSAgICAgICAgICAgOTk5OTk5IC0+IC0yLjAyMDA2ODEyRS0zMDEwMzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxIHBvd2VyIC0wLjEgICAgICAgICAgIDk5OTk5OSAtPiAtMUUtOTk5OTk5Citwb3d4MzIyIHBvd2VyIC0wLjA5ICAgICAgICAgIDk5OTk5OSAtPiAtMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzIzIHBvd2VyIC0wLjA1ICAgICAgICAgIDk5OTk5OSAtPiAtMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzI0IHBvd2VyIC0wLjAxICAgICAgICAgIDk5OTk5OSAtPiAtMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzI1IHBvd2VyIC0wLjAwMDEgICAgICAgIDk5OTk5OSAtPiAtMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzI3IHBvd2VyIC0wLjAwMDAwMDEgICAgIDk5OTk5OSAtPiAtMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzI4IHBvd2VyIC0wLjAwMDAwMDAwMDEgIDk5OTk5OSAtPiAtMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzI5IHBvd2VyIC0xRS05OTk5OTk5OTkgIDk5OTk5OSAtPiAtMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIG5vdGUgbm8gdHJpbSBvZiBuZXh0IHJlc3VsdAorcG93eDMzMCBwb3dlciAtOSAgICAgICAgICAgICA5OTk5OTggLT4gIDMuOTg5ODI5MjFFKzk1NDI0MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMzEgcG93ZXIgLTEwICAgICAgICAgICAgOTk5OTk4IC0+ICAxLjAwMDAwMDAwRSs5OTk5OTggUm91bmRlZAorcG93eDMzMiBwb3dlciAtMTAuMDAwMSAgICAgICA5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMzMyBwb3dlciAtMTAuMSAgICAgICAgICA5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMzNCBwb3dlciAtMTEgICAgICAgICAgICA5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMzNSBwb3dlciAtMTIgICAgICAgICAgICA5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMzNiBwb3dlciAtOTk5ICAgICAgICAgICA5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMzNyBwb3dlciAtOTk5OTk5ICAgICAgICA5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMzOCBwb3dlciAtOTk5OTk5OTk5ICAgICA5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMzOSBwb3dlciAtOS45RTk5OTk5OTk5OSA5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCitwb3d4MzQwIHBvd2VyIC0wLjUgICAgICAgICAgIDk5OTk5OCAtPiAgNC4wNDAxMzYyNEUtMzAxMDMwIEluZXhhY3QgUm91bmRlZAorcG93eDM0MSBwb3dlciAtMC4xICAgICAgICAgICA5OTk5OTggLT4gIDFFLTk5OTk5OCAgLS0gTkIgZXhhY3QgdW5yb3VuZGVkCitwb3d4MzQyIHBvd2VyIC0wLjA5ICAgICAgICAgIDk5OTk5OCAtPiAgMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzQzIHBvd2VyIC0wLjA1ICAgICAgICAgIDk5OTk5OCAtPiAgMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzQ0IHBvd2VyIC0wLjAxICAgICAgICAgIDk5OTk5OCAtPiAgMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzQ1IHBvd2VyIC0wLjAwMDEgICAgICAgIDk5OTk5OCAtPiAgMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzQ3IHBvd2VyIC0wLjAwMDAwMDEgICAgIDk5OTk5OCAtPiAgMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzQ4IHBvd2VyIC0wLjAwMDAwMDAwMDEgIDk5OTk5OCAtPiAgMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzQ5IHBvd2VyIC0xRS05OTk5OTk5OTkgIDk5OTk5OCAtPiAgMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIHNvbWUgc3Vibm9ybWFscworcHJlY2lzaW9uOiA5CistLSBbcHJlY2lzaW9uIGlzIDksIHNvIHNtYWxsZXN0IGV4cG9uZW50IGlzIC0xMDAwMDAwMDA3Citwb3d4MzUwIHBvd2VyICAxZS0xICAgICAgICAgIDUwMDAwMCAtPiAgMUUtNTAwMDAwCitwb3d4MzUxIHBvd2VyICAxZS0yICAgICAgICAgIDk5OTk5OSAtPiAgMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MzUyIHBvd2VyICAxZS0yICAgICAgICAgIDUwMDAwMCAtPiAgMUUtMTAwMDAwMCBTdWJub3JtYWwKK3Bvd3gzNTMgcG93ZXIgIDFlLTIgICAgICAgICAgNTAwMDAxIC0+ICAxRS0xMDAwMDAyIFN1Ym5vcm1hbAorcG93eDM1NCBwb3dlciAgMWUtMiAgICAgICAgICA1MDAwMDIgLT4gIDFFLTEwMDAwMDQgU3Vibm9ybWFsCitwb3d4MzU1IHBvd2VyICAxZS0yICAgICAgICAgIDUwMDAwMyAtPiAgMUUtMTAwMDAwNiBTdWJub3JtYWwKK3Bvd3gzNTYgcG93ZXIgIDFlLTIgICAgICAgICAgNTAwMDA0IC0+ICAwRS0xMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworcG93eDM2MCBwb3dlciAgMC4wMTAwMDEgICAgICA1MDAwMDAgLT4gIDUuMTcxNzYwODJFLTk5OTk3OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNjEgcG93ZXIgIDAuMDEwMDAwMDAxICAgNTAwMDAwIC0+ICAxLjA1MTI3MTFFLTEwMDAwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNjIgcG93ZXIgIDAuMDEwMDAwMDAxICAgNTAwMDAxIC0+ICAxLjA1MTI3RS0xMDAwMDAyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYzIHBvd2VyICAwLjAxMDAwMDAwMDkgIDUwMDAwMCAtPiAgMS4wNDYwMjc5RS0xMDAwMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4MzY0IHBvd2VyICAwLjAxMDAwMDAwMDEgIDUwMDAwMCAtPiAgMS4wMDUwMTI1RS0xMDAwMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4MzY1IHBvd2VyICAwLjAxICAgICAgICAgIDUwMDAwMCAtPiAgMUUtMTAwMDAwMCBTdWJub3JtYWwKK3Bvd3gzNjYgcG93ZXIgIDAuMDA5OTk5OTk5OSAgNTAwMDAwIC0+ICA5Ljk1MDEyNUUtMTAwMDAwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDM2NyBwb3dlciAgMC4wMDk5OTk5OTk4ICA1MDAwMDAgLT4gIDkuOTAwNDk4RS0xMDAwMDAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4MzY4IHBvd2VyICAwLjAwOTk5OTk5OTcgIDUwMDAwMCAtPiAgOS44NTExMTlFLTEwMDAwMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNjkgcG93ZXIgIDAuMDA5OTk5OTk5NiAgNTAwMDAwIC0+ICA5LjgwMTk4N0UtMTAwMDAwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDM3MCBwb3dlciAgMC4wMDkgICAgICAgICA1MDAwMDAgLT4gIDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSAxL3N1Ym5vcm1hbCAtPiBvdmVyZmxvdworcG93eDM3MSBwb3dlciAgMWUtMSAgICAgICAgIC01MDAwMDAgLT4gIDFFKzUwMDAwMAorcG93eDM3MiBwb3dlciAgMWUtMiAgICAgICAgIC05OTk5OTkgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDM3MyBwb3dlciAgMWUtMiAgICAgICAgIC01MDAwMDAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDM3NCBwb3dlciAgMWUtMiAgICAgICAgIC01MDAwMDEgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDM3NSBwb3dlciAgMWUtMiAgICAgICAgIC01MDAwMDIgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDM3NiBwb3dlciAgMWUtMiAgICAgICAgIC01MDAwMDMgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDM3NyBwb3dlciAgMWUtMiAgICAgICAgIC01MDAwMDQgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCitwb3d4MzgxIHBvd2VyICAwLjAxMDAwMSAgICAgLTUwMDAwMCAtPiAgMS45MzM1Nzc0M0UrOTk5OTc4IEluZXhhY3QgUm91bmRlZAorcG93eDM4MiBwb3dlciAgMC4wMTAwMDAwMDEgIC01MDAwMDAgLT4gIDkuNTEyMjk0MjdFKzk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzODMgcG93ZXIgIDAuMDEwMDAwMDAxICAtNTAwMDAxIC0+ICBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitwb3d4Mzg0IHBvd2VyICAwLjAxMDAwMDAwMDkgLTUwMDAwMCAtPiAgOS41NTk5NzQ4NEUrOTk5OTk5IEluZXhhY3QgUm91bmRlZAorcG93eDM4NSBwb3dlciAgMC4wMTAwMDAwMDAxIC01MDAwMDAgLT4gIDkuOTUwMTI0NzlFKzk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzODYgcG93ZXIgIDAuMDEgICAgICAgICAtNTAwMDAwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzODcgcG93ZXIgIDAuMDA5OTk5ICAgICAtNTAwMDAwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmUgcG93ZXIgZ2l2aW5nIHN1Ym5vcm1hbAorcG93eDM4OCBwb3dlciAgMTAwLjAwMDAwMSAgIC01MDAwMDAgLT4gIDkuOTUwMTI1RS0xMDAwMDAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKworLS0gdGVzdCBzb21lICdmYWxzZSBpbnRlZ2VyJyBib3VuZGFyaWVzCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitwb3d4NTAxIHBvd2VyICAxMDAgIDFFKzEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzIwICAgICBSb3VuZGVkCitwb3d4NTAyIHBvd2VyICAxMDAgIDFFKzIgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzIwMCAgICBSb3VuZGVkCitwb3d4NTAzIHBvd2VyICAxMDAgIDFFKzMgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTA0IHBvd2VyICAxMDAgIDFFKzQgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTA1IHBvd2VyICAxMDAgIDFFKzUgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTA2IHBvd2VyICAxMDAgIDFFKzYgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTA3IHBvd2VyICAxMDAgIDFFKzcgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTA4IHBvd2VyICAxMDAgIDFFKzggICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTA5IHBvd2VyICAxMDAgIDFFKzkgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTEwIHBvd2VyICAxMDAgIDFFKzEwICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTExIHBvd2VyICAxMDAgIDFFKzExICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTEyIHBvd2VyICAxMDAgIDFFKzEyICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTEzIHBvd2VyICAxMDAgIDFFKzEzICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTE0IHBvd2VyICAxMDAgIDFFKzE0ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTE1IHBvd2VyICAxMDAgIDFFKzE1ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTE2IHBvd2VyICAxMDAgIDFFKzE2ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTE3IHBvd2VyICAxMDAgIDFFKzE3ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTE4IHBvd2VyICAxMDAgIDFFKzE4ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTE5IHBvd2VyICAxMDAgIDFFKzE5ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTIwIHBvd2VyICAxMDAgIDFFKzIwICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTIxIHBvd2VyICAxMDAgIDFFKzIxICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTIyIHBvd2VyICAxMDAgIDFFKzIyICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTIzIHBvd2VyICAxMDAgIDFFKzIzICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTI0IHBvd2VyICAxMDAgIDFFKzI0ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTI1IHBvd2VyICAxMDAgIDFFKzI1ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTI2IHBvd2VyICAxMDAgIDFFKzI2ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTI3IHBvd2VyICAxMDAgIDFFKzI3ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTI4IHBvd2VyICAxMDAgIDFFKzI4ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTI5IHBvd2VyICAxMDAgIDFFKzI5ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTMwIHBvd2VyICAxMDAgIDFFKzMwICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTMxIHBvd2VyICAxMDAgIDFFKzQwICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTMyIHBvd2VyICAxMDAgIDFFKzUwICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTMzIHBvd2VyICAxMDAgIDFFKzEwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NTM0IHBvd2VyICAxMDAgIDFFKzM4MyAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tIGEgY2hlY2sgZm9yIGRvdWJsZS1yb3VuZGVkIHN1Ym5vcm1hbHMKK3ByZWNpc2lvbjogICA1CittYXhleHBvbmVudDogNzkKK21pbmV4cG9uZW50OiAtNzkKK3Bvd3g3NTAgcG93ZXIgICAgIDEuMjM0N0UtNDAgIDIgICAgICAtPiAgMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIE51bGwgdGVzdHMKK3Bvd3g5MDAgcG93ZXIgIDEgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g5MDEgcG93ZXIgICMgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gQmVsb3cgaGVyZSBhcmUgdGVzdHMgd2l0aCBhIHByZWNpc2lvbiBvciBjb250ZXh0IG91dHNpZGUgb2YgdGhlICAtLQorLS0gZGVjTnVtYmVyICdtYXRoZW1hdGljYWwgZnVuY3Rpb25zJyByZXN0cmljdGVkIHJhbmdlLiAgVGhlc2UgICAgICAtLQorLS0gcmVtYWluIHN1cHBvcnRlZCBpbiBkZWNOdW1iZXIgdG8gbWluaW1pemUgYnJlYWthZ2UsIGJ1dCBtYXkgYmUgICAtLQorLS0gb3V0c2lkZSB0aGUgcmFuZ2Ugb2Ygb3RoZXIgaW1wbGVtZW50YXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogOQorcG93eDEwNjMgcG93ZXIgICAnMTAnICAnOTk5OTk5OTk5JyAtPiAnMS4wMDAwMDAwMEUrOTk5OTk5OTk5JyBSb3VuZGVkCitwb3d4MTA2NCBwb3dlciAgICcxMCcgICc5OTk5OTk5OTgnIC0+ICcxLjAwMDAwMDAwRSs5OTk5OTk5OTgnIFJvdW5kZWQKK3Bvd3gxMDY1IHBvd2VyICAgJzEwJyAgJzk5OTk5OTk5NycgLT4gJzEuMDAwMDAwMDBFKzk5OTk5OTk5NycgUm91bmRlZAorcG93eDEwNjYgcG93ZXIgICAnMTAnICAnMzMzMzMzMzMzJyAtPiAnMS4wMDAwMDAwMEUrMzMzMzMzMzMzJyBSb3VuZGVkCistLSBuZXh0IHR3byBhcmUgaW50ZWdlci1vdXQtb2YgcmFuZ2UKK3Bvd3gxMTgzIHBvd2VyICAgJzcnICAgJzEwMDAwMDAwMDAnICAtPiBOYU4gSW52YWxpZF9jb250ZXh0Citwb3d4MTE4NCBwb3dlciAgICc3JyAgICcxMDAwMDAwMDAxJyAgLT4gTmFOIEludmFsaWRfY29udGV4dAorcG93eDExODYgcG93ZXIgICAnNycgICAnLTEwMDAwMDAwMDEnIC0+IDEuMzgyNDM2MzBFLTg0NTA5ODA0MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMTg3IHBvd2VyICAgJzcnICAgJy0xMDAwMDAwMDAwJyAtPiA5LjY3NzA1NDExRS04NDUwOTgwNDEgSW5leGFjdCBSb3VuZGVkCisKKy0tIG91dC1vZi1yYW5nZSBlZGdlIGNhc2VzCitwb3d4MTExOCBwb3dlciAgJzEwJyAgJy0zMzMzMzMzMzMnICAgLT4gMUUtMzMzMzMzMzMzCitwb3d4MTExOSBwb3dlciAgJzEwJyAgJy05OTk5OTk5OTgnICAgLT4gMUUtOTk5OTk5OTk4Citwb3d4MTEyMCBwb3dlciAgJzEwJyAgJy05OTk5OTk5OTknICAgLT4gMUUtOTk5OTk5OTk5Citwb3d4MTE4MSBwb3dlciAgICc3JyAgICc5OTk5OTk5OTgnICAgLT4gMi4xMDg5MjMxM0UrODQ1MDk4MDM4IEluZXhhY3QgUm91bmRlZAorcG93eDExODIgcG93ZXIgICAnNycgICAnOTk5OTk5OTk5JyAgIC0+IDEuNDc2MjQ2MTlFKzg0NTA5ODAzOSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMTg5IHBvd2VyICAgJzcnICAgJy05OTk5OTk5OTknICAtPiA2Ljc3MzkzNzg3RS04NDUwOTgwNDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MTE5MCBwb3dlciAgICc3JyAgICctOTk5OTk5OTk4JyAgLT4gNC43NDE3NTY1MUUtODQ1MDk4MDM5IEluZXhhY3QgUm91bmRlZAorCistLSBBIChyYXJlKSBjYXNlIHdoZXJlIHRoZSBsYXN0IGRpZ2l0IGlzIG5vdCB3aXRoaW4gMC41IFVMUCB3aXRoIGNsYXNzaWMgcHJlY2lzaW9uCitwcmVjaXNpb246IDkKK3Bvd3gxMjE1IHBvd2VyICItMjE5NzE1NzUuMEUrMzE0NTQ0NDEiICItNyIgLT4gIi00LjA0NTQ5NTAyRS0yMjAxODExMzkiIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMAorcG93eDEyMTYgcG93ZXIgIi0yMTk3MTU3NS4wRSszMTQ1NDQ0MSIgIi03IiAtPiAiLTQuMDQ1NDk1MDI0OTMyNDg5MTc4OEUtMjIwMTgxMTM5IiBJbmV4YWN0IFJvdW5kZWQKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cworcHJlY2lzaW9uOiA5Citwb3d4MTI4MCBwb3dlciAgOSAgICAgICAgICAgIDk5OTk5OTk5OSAtPiAzLjA1NTUwMDU0RSs5NTQyNDI1MDggSW5leGFjdCBSb3VuZGVkCitwb3d4MTI4MSBwb3dlciAxMCAgICAgICAgICAgIDk5OTk5OTk5OSAtPiAxLjAwMDAwMDAwRSs5OTk5OTk5OTkgUm91bmRlZAorcG93eDEyODIgcG93ZXIgMTAuMDAwMSAgICAgICA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTI4MyBwb3dlciAxMC4xICAgICAgICAgIDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMjg0IHBvd2VyIDExICAgICAgICAgICAgOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEyODUgcG93ZXIgMTIgICAgICAgICAgICA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTI4NiBwb3dlciA5OTkgICAgICAgICAgIDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMjg3IHBvd2VyIDk5OTk5OSAgICAgICAgOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEyODggcG93ZXIgOTk5OTk5OTk5ICAgICA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTI4OSBwb3dlciA5LjlFOTk5OTk5OTk5IDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcG93eDEyOTAgcG93ZXIgMC41ICAgICAgICAgICA5OTk5OTk5OTkgLT4gNC4zMzU1OTU5NEUtMzAxMDI5OTk2IEluZXhhY3QgUm91bmRlZAorcG93eDEyOTEgcG93ZXIgMC4xICAgICAgICAgICA5OTk5OTk5OTkgLT4gMUUtOTk5OTk5OTk5ICAtLSB1bnJvdW5kZWQKK3Bvd3gxMjkyIHBvd2VyIDAuMDkgICAgICAgICAgOTk5OTk5OTk5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEyOTMgcG93ZXIgMC4wNSAgICAgICAgICA5OTk5OTk5OTkgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTI5NCBwb3dlciAwLjAxICAgICAgICAgIDk5OTk5OTk5OSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMjk1IHBvd2VyIDAuMDAwMSAgICAgICAgOTk5OTk5OTk5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEyOTcgcG93ZXIgMC4wMDAwMDAxICAgICA5OTk5OTk5OTkgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTI5OCBwb3dlciAwLjAwMDAwMDAwMDEgIDk5OTk5OTk5OSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMjk5IHBvd2VyIDFFLTk5OTk5OTk5OSAgOTk5OTk5OTk5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitwb3d4MTMxMCBwb3dlciAtOSAgICAgICAgICAgICA5OTk5OTk5OTkgLT4gLTMuMDU1NTAwNTRFKzk1NDI0MjUwOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzExIHBvd2VyIC0xMCAgICAgICAgICAgIDk5OTk5OTk5OSAtPiAtMS4wMDAwMDAwMEUrOTk5OTk5OTk5IFJvdW5kZWQKK3Bvd3gxMzEyIHBvd2VyIC0xMC4wMDAxICAgICAgIDk5OTk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTMxMyBwb3dlciAtMTAuMSAgICAgICAgICA5OTk5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEzMTQgcG93ZXIgLTExICAgICAgICAgICAgOTk5OTk5OTk5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzE1IHBvd2VyIC0xMiAgICAgICAgICAgIDk5OTk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTMxNiBwb3dlciAtOTk5ICAgICAgICAgICA5OTk5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEzMTcgcG93ZXIgLTk5OTk5OSAgICAgICAgOTk5OTk5OTk5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzE4IHBvd2VyIC05OTk5OTk5OTkgICAgIDk5OTk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTMxOSBwb3dlciAtOS45RTk5OTk5OTk5OSA5OTk5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCitwb3d4MTMyMCBwb3dlciAtMC41ICAgICAgICAgICA5OTk5OTk5OTkgLT4gLTQuMzM1NTk1OTRFLTMwMTAyOTk5NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzIxIHBvd2VyIC0wLjEgICAgICAgICAgIDk5OTk5OTk5OSAtPiAtMUUtOTk5OTk5OTk5Citwb3d4MTMyMiBwb3dlciAtMC4wOSAgICAgICAgICA5OTk5OTk5OTkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEzMjMgcG93ZXIgLTAuMDUgICAgICAgICAgOTk5OTk5OTk5IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMzI0IHBvd2VyIC0wLjAxICAgICAgICAgIDk5OTk5OTk5OSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTMyNSBwb3dlciAtMC4wMDAxICAgICAgICA5OTk5OTk5OTkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEzMjcgcG93ZXIgLTAuMDAwMDAwMSAgICAgOTk5OTk5OTk5IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMzI4IHBvd2VyIC0wLjAwMDAwMDAwMDEgIDk5OTk5OTk5OSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTMyOSBwb3dlciAtMUUtOTk5OTk5OTk5ICA5OTk5OTk5OTkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSBub3RlIG5vIHRyaW0gb2YgbmV4dCByZXN1bHQKK3Bvd3gxMzMwIHBvd2VyIC05ICAgICAgICAgICAgIDk5OTk5OTk5OCAtPiAgMy4zOTUwMDA2MEUrOTU0MjQyNTA3IEluZXhhY3QgUm91bmRlZAorcG93eDEzMzEgcG93ZXIgLTEwICAgICAgICAgICAgOTk5OTk5OTk4IC0+ICAxLjAwMDAwMDAwRSs5OTk5OTk5OTggUm91bmRlZAorcG93eDEzMzIgcG93ZXIgLTEwLjAwMDEgICAgICAgOTk5OTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzMzIHBvd2VyIC0xMC4xICAgICAgICAgIDk5OTk5OTk5OCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTMzNCBwb3dlciAtMTEgICAgICAgICAgICA5OTk5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEzMzUgcG93ZXIgLTEyICAgICAgICAgICAgOTk5OTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzM2IHBvd2VyIC05OTkgICAgICAgICAgIDk5OTk5OTk5OCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTMzNyBwb3dlciAtOTk5OTk5ICAgICAgICA5OTk5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEzMzggcG93ZXIgLTk5OTk5OTk5OSAgICAgOTk5OTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzM5IHBvd2VyIC05LjlFOTk5OTk5OTk5IDk5OTk5OTk5OCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK3Bvd3gxMzQwIHBvd2VyIC0wLjUgICAgICAgICAgIDk5OTk5OTk5OCAtPiAgOC42NzExOTE4N0UtMzAxMDI5OTk2IEluZXhhY3QgUm91bmRlZAorcG93eDEzNDEgcG93ZXIgLTAuMSAgICAgICAgICAgOTk5OTk5OTk4IC0+ICAxRS05OTk5OTk5OTggIC0tIE5CIGV4YWN0IHVucm91bmRlZAorcG93eDEzNDIgcG93ZXIgLTAuMDkgICAgICAgICAgOTk5OTk5OTk4IC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMzQzIHBvd2VyIC0wLjA1ICAgICAgICAgIDk5OTk5OTk5OCAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTM0NCBwb3dlciAtMC4wMSAgICAgICAgICA5OTk5OTk5OTggLT4gIDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEzNDUgcG93ZXIgLTAuMDAwMSAgICAgICAgOTk5OTk5OTk4IC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMzQ3IHBvd2VyIC0wLjAwMDAwMDEgICAgIDk5OTk5OTk5OCAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTM0OCBwb3dlciAtMC4wMDAwMDAwMDAxICA5OTk5OTk5OTggLT4gIDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEzNDkgcG93ZXIgLTFFLTk5OTk5OTk5OSAgOTk5OTk5OTk4IC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gc29tZSBzdWJub3JtYWxzCitwcmVjaXNpb246IDkKKy0tIFtwcmVjaXNpb24gaXMgOSwgc28gc21hbGxlc3QgZXhwb25lbnQgaXMgLTEwMDAwMDAwMDcKK3Bvd3gxMzUwIHBvd2VyICAxZS0xICAgICAgICAgIDUwMDAwMDAwMCAtPiAgMUUtNTAwMDAwMDAwCitwb3d4MTM1MSBwb3dlciAgMWUtMiAgICAgICAgICA5OTk5OTk5OTkgLT4gIDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEzNTIgcG93ZXIgIDFlLTIgICAgICAgICAgNTAwMDAwMDAwIC0+ICAxRS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorcG93eDEzNTMgcG93ZXIgIDFlLTIgICAgICAgICAgNTAwMDAwMDAxIC0+ICAxRS0xMDAwMDAwMDAyIFN1Ym5vcm1hbAorcG93eDEzNTQgcG93ZXIgIDFlLTIgICAgICAgICAgNTAwMDAwMDAyIC0+ICAxRS0xMDAwMDAwMDA0IFN1Ym5vcm1hbAorcG93eDEzNTUgcG93ZXIgIDFlLTIgICAgICAgICAgNTAwMDAwMDAzIC0+ICAxRS0xMDAwMDAwMDA2IFN1Ym5vcm1hbAorcG93eDEzNTYgcG93ZXIgIDFlLTIgICAgICAgICAgNTAwMDAwMDA0IC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworcG93eDEzNjAgcG93ZXIgIDAuMDEwMDAxICAgICAgNTAwMDAwMDAwIC0+ICA0LjM0OTQxOTg4RS05OTk5NzgyODcgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM2MSBwb3dlciAgMC4wMTAwMDAwMDEgICA1MDAwMDAwMDAgLT4gIDUuMTg0NjkyNTdFLTk5OTk5OTk3OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzYyIHBvd2VyICAwLjAxMDAwMDAwMSAgIDUwMDAwMDAwMSAtPiAgNS4xODQ2OTMwOUUtOTk5OTk5OTgxIEluZXhhY3QgUm91bmRlZAorcG93eDEzNjMgcG93ZXIgIDAuMDEwMDAwMDAwOSAgNTAwMDAwMDAwIC0+ICAzLjQ5MzQyMDAzRS05OTk5OTk5ODEgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM2NCBwb3dlciAgMC4wMTAwMDAwMDAxICA1MDAwMDAwMDAgLT4gIDEuNDg0MTMxNTVFLTk5OTk5OTk5OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzY1IHBvd2VyICAwLjAxICAgICAgICAgIDUwMDAwMDAwMCAtPiAgMUUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK3Bvd3gxMzY2IHBvd2VyICAwLjAwOTk5OTk5OTkgIDUwMDAwMDAwMCAtPiAgNi43Mzc5RS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM2NyBwb3dlciAgMC4wMDk5OTk5OTk4ICA1MDAwMDAwMDAgLT4gIDQuNTRFLTEwMDAwMDAwMDUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzY4IHBvd2VyICAwLjAwOTk5OTk5OTcgIDUwMDAwMDAwMCAtPiAgM0UtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDEzNjkgcG93ZXIgIDAuMDA5OTk5OTk5NiAgNTAwMDAwMDAwIC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMzcwIHBvd2VyICAwLjAwOSAgICAgICAgIDUwMDAwMDAwMCAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIDEvc3Vibm9ybWFsIC0+IG92ZXJmbG93Citwb3d4MTM3MSBwb3dlciAgMWUtMSAgICAgICAgIC01MDAwMDAwMDAgLT4gIDFFKzUwMDAwMDAwMAorcG93eDEzNzIgcG93ZXIgIDFlLTIgICAgICAgICAtOTk5OTk5OTk5IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzczIHBvd2VyICAxZS0yICAgICAgICAgLTUwMDAwMDAwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM3NCBwb3dlciAgMWUtMiAgICAgICAgIC01MDAwMDAwMDEgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEzNzUgcG93ZXIgIDFlLTIgICAgICAgICAtNTAwMDAwMDAyIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzc2IHBvd2VyICAxZS0yICAgICAgICAgLTUwMDAwMDAwMyAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM3NyBwb3dlciAgMWUtMiAgICAgICAgIC01MDAwMDAwMDQgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCitwb3d4MTM4MSBwb3dlciAgMC4wMTAwMDEgICAgIC01MDAwMDAwMDAgLT4gIDIuMjk5MTU3MTlFKzk5OTk3ODI4NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzgyIHBvd2VyICAwLjAxMDAwMDAwMSAgLTUwMDAwMDAwMCAtPiAgMS45Mjg3NTQ2N0UrOTk5OTk5OTc4IEluZXhhY3QgUm91bmRlZAorcG93eDEzODMgcG93ZXIgIDAuMDEwMDAwMDAxICAtNTAwMDAwMDAxIC0+ICAxLjkyODc1NDQ4RSs5OTk5OTk5ODAgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM4NCBwb3dlciAgMC4wMTAwMDAwMDA5IC01MDAwMDAwMDAgLT4gIDIuODYyNTI0MzhFKzk5OTk5OTk4MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzg1IHBvd2VyICAwLjAxMDAwMDAwMDEgLTUwMDAwMDAwMCAtPiAgNi43Mzc5NDcxN0UrOTk5OTk5OTk3IEluZXhhY3QgUm91bmRlZAorcG93eDEzODYgcG93ZXIgIDAuMDEgICAgICAgICAtNTAwMDAwMDAwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzg3IHBvd2VyICAwLjAwOTk5OSAgICAgLTUwMDAwMDAwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlIHBvd2VyIGdpdmluZyBzdWJub3JtYWwKK3Bvd3gxMzg4IHBvd2VyICAxMDAuMDAwMDAxICAgLTUwMDAwMDAwMCAtPiAgNi43Mzc5RS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIEJlbG93IGhlcmUgYXJlIHRoZSB0ZXN0cyB3aXRoIGEgbm9uLWludGVnZXIgcmhzLCBpbmNsdWRpbmcgdGhlICAgLS0KKy0tIHRlc3RzIHRoYXQgcHJldmlvdXNseSBjYXVzZWQgSW52YWxpZCBvcGVyYXRpb24uICBBbiBpbnRlZ2VyLW9ubHkgLS0KKy0tIChvbiByaHMpIGltcGxlbWVudGF0aW9uIHNob3VsZCBoYW5kbGUgYWxsIHRoZSB0ZXN0cyBhYm92ZSBhcyAgICAgLS0KKy0tIHNob3duLCBhbmQgd291bGQgZmxhZyBtb3N0IG9mIHRoZSBmb2xsb3dpbmcgdGVzdHMgYXMgSW52YWxpZC4gICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKKworcG93eDIwMDAgcG93ZXIgNyAnMTAwMDAwMDAwMDAnICAgICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDAxIHBvd2VyIDIgJzIuMDAwMDAxJyAgICAgICAgICAgLT4gNC4wMDAwMDI3NzI1ODk2ODMgSW5leGFjdCBSb3VuZGVkCitwb3d4MjAwMiBwb3dlciAyICcyLjAwMDAwMDAwJyAgICAgICAgIC0+IDQKK3Bvd3gyMDAzIHBvd2VyIDIgJzIuMDAwMDAwMDAxJyAgICAgICAgLT4gNC4wMDAwMDAwMDI3NzI1ODkgSW5leGFjdCBSb3VuZGVkCitwb3d4MjAwNCBwb3dlciAyICcyLjAwMDAwMDAwMDEnICAgICAgIC0+IDQuMDAwMDAwMDAwMjc3MjU5IEluZXhhY3QgUm91bmRlZAorcG93eDIwMDUgcG93ZXIgMiAnMi4wMDAwMDAwMDAwMScgICAgICAtPiA0LjAwMDAwMDAwMDAyNzcyNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDA2IHBvd2VyIDIgJzIuMDAwMDAwMDAwMDAxJyAgICAgLT4gNC4wMDAwMDAwMDAwMDI3NzMgSW5leGFjdCBSb3VuZGVkCitwb3d4MjAwNyBwb3dlciAyICcyLjAwMDAwMDAwMDAwMDEnICAgIC0+IDQuMDAwMDAwMDAwMDAwMjc3IEluZXhhY3QgUm91bmRlZAorcG93eDIwMDggcG93ZXIgMiAnMi4wMDAwMDAwMDAwMDAwMScgICAtPiA0LjAwMDAwMDAwMDAwMDAyOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDA5IHBvd2VyIDIgJzIuMDAwMDAwMDAwMDAwMDAxJyAgLT4gNC4wMDAwMDAwMDAwMDAwMDMgSW5leGFjdCBSb3VuZGVkCitwb3d4MjAxMCBwb3dlciAyICcyLjAwMDAwMDAwMDAwMDAwMDEnIC0+IDQuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgMSAyMzQ1Njc4OTAxMjM0NTYKKworcG93eDIwMTEgcG93ZXIgMSAxMjM0IC0+IDEKK3ByZWNpc2lvbjogNAorcG93eDIwMTIgcG93ZXIgMSAxMjM0IC0+IDEKK3ByZWNpc2lvbjogMworcG93eDIwMTMgcG93ZXIgMSAxMjM0ICAgICAtPiAxCitwb3d4MjAxNCBwb3dlciAxIDEyLjM0ZSsyIC0+IDEKK3Bvd3gyMDE1IHBvd2VyIDEgMTIuMyAgICAgLT4gMS4wMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDE2IHBvd2VyIDEgMTIuMCAgICAgLT4gMQorcG93eDIwMTcgcG93ZXIgMSAxLjAxICAgICAtPiAxLjAwIEluZXhhY3QgUm91bmRlZAorcG93eDIwMTggcG93ZXIgMiAxLjAwICAgICAtPiAyCitwb3d4MjAxOSBwb3dlciAyIDIuMDAgICAgIC0+IDQKK3ByZWNpc2lvbjogOQorcG93eDIwMzAgcG93ZXIgMSAxLjAwMDEgICAgICAgICAgIC0+IDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjAzMSBwb3dlciAxIDEuMDAwMDAwMSAgICAgICAgLT4gMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDMyIHBvd2VyIDEgMS4wMDAwMDAwMDAxICAgICAtPiAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcG93eDIwMzMgcG93ZXIgMSAxLjAwMDAwMDAwMDAwMDEgIC0+IDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDUKK3Bvd3gyMDM0IHBvd2VyIDEgMS4wMDAxICAgICAgICAgICAtPiAxLjAwMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjAzNSBwb3dlciAxIDEuMDAwMDAwMSAgICAgICAgLT4gMS4wMDAwIEluZXhhY3QgUm91bmRlZAorcG93eDIwMzYgcG93ZXIgMSAxLjAwMDAwMDAwMDEgICAgIC0+IDEuMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDM3IHBvd2VyIDEgMS4wMDAwMDAwMDAwMDAxICAtPiAxLjAwMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjAzOCBwb3dlciAxIDEuMDAwMDAwMDAwMDAwMSAgLT4gMS4wMDAwIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogY2VpbGluZworcHJlY2lzaW9uOiAzCitwb3d4MjAzOSBwb3dlciAxIDEuMDEgICAgIC0+IDEuMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjA0MCBwb3dlciAxIDEyLjMgICAgIC0+IDEuMDAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9ldmVuCisKKy0tIDEgKiogYW55IGludGVnZXIsIGluY2x1ZGluZyBiaWcgb25lcywgc2hvdWxkIGJlIGV4YWN0Citwb3d4MjA0MSBwb3dlciAxIDEwMDAwMDAwMDAgICAtPiAxCitwb3d4MjA0MiBwb3dlciAxIDk5OTk5OTk5OTkgICAtPiAxCitwb3d4MjA0MyBwb3dlciAxIDEyMzQ1Njc4MDAwICAtPiAxCitwb3d4MjA0NCBwb3dlciAxIDEyMzQ1Njc4MDAgICAtPiAxCitwb3d4MjA0NSBwb3dlciAxIDEyMzQ1Njc4OTAgICAtPiAxCitwb3d4MjA0NiBwb3dlciAxIDExMjM0NTY3ODkxICAtPiAxCitwb3d4MjA0NyBwb3dlciAxIDEyMzQ1Njc4OTAxICAtPiAxCitwb3d4MjA0OCBwb3dlciAxIDEyMzQ1Njc4OTYgICAtPiAxCitwb3d4MjA0OSBwb3dlciAxIC0xMjM0NTY3ODk2ICAtPiAxCitwb3d4MjA1MSBwb3dlciAxIDEwMDAwMDAwMDAgICAtPiAxCitwb3d4MjA1MiBwb3dlciAxIC0xMDAwMDAwMDAwICAtPiAxCitwb3d4MjA1MyBwb3dlciAxIDEyMzQ1Njc4MDAwICAtPiAxCitwb3d4MjA1NCBwb3dlciAxIC0xMjM0NTY3ODk2ICAtPiAxCitwb3d4MjA1NSBwb3dlciAxIDEwMDAwMDAwMDAgICAtPiAxCitwb3d4MjA1NiBwb3dlciAxIDQzMDAwMDAwMDAgICAtPiAxCitwb3d4MjA1NyBwb3dlciAxIC0xMDAwMDAwMDAwICAtPiAxCistLSBuZWdhdGl2ZXMgLi4uIGJ1dCBub3Qgb3V0IG9mIHJhbmdlIGZvciBkZWNOdW1iZXIKK3Bvd3gyMDYxIHBvd2VyIC0xIDEwMDAwMCAgIC0+IDEKK3Bvd3gyMDYyIHBvd2VyIC0xIDk5OTk5OSAgIC0+IC0xCitwb3d4MjA2MyBwb3dlciAtMSAxMjc4MDAwICAtPiAxCitwb3d4MjA2NCBwb3dlciAtMSAxMjc4MDMgICAtPiAtMQorcG93eDIwNjUgcG93ZXIgLTEgMTI3ODkwICAgLT4gMQorcG93eDIwNjYgcG93ZXIgLTEgMTE2Nzg5MSAgLT4gLTEKK3Bvd3gyMDY3IHBvd2VyIC0xIDEyNzg5MDEgIC0+IC0xCitwb3d4MjA2OCBwb3dlciAtMSAxMjc4OTYgICAtPiAxCitwb3d4MjA2OSBwb3dlciAtMSAtMTY3ODk3ICAtPiAtMQorcG93eDIwNzEgcG93ZXIgLTEgMTAwMDAwICAgLT4gMQorcG93eDIwNzIgcG93ZXIgLTEgLTEwMDAwMSAgLT4gLTEKK3Bvd3gyMDczIHBvd2VyIC0xIDEyNzgwMDAgIC0+IDEKK3Bvd3gyMDc0IHBvd2VyIC0xIC0xNjc4OTYgIC0+IDEKK3Bvd3gyMDc1IHBvd2VyIC0xIDEwMDAwMCAgIC0+IDEKK3Bvd3gyMDc2IHBvd2VyIC0xIC0xMDAwMDkgIC0+IC0xCisKKy0tIFRoZSBhYm92ZSB3ZXJlIGRlcml2ZWQgZnJvbSB0aGUgZWFybGllciB2ZXJzaW9uIG9mIHBvd2VyLmRlY1Rlc3Q7CistLSBub3cgc3RhcnQgbmV3IHRlc3RzIGZvciBwb3dlcih4LHkpIGZvciBub24taW50ZWdlciB5CitwcmVjaXNpb246IDkKKworLS0gdGVzdHMgZnJvbSBzcGVjaWZpY2F0aW9uCitwb3d4MjA4MSBwb3dlciAyICAgICAgICAgICAzICAgIC0+ICAnOCcKK3Bvd3gyMDgyIHBvd2VyIC0yICAgICAgICAgIDMgICAgLT4gICctOCcKK3Bvd3gyMDgzIHBvd2VyIDIgICAgICAgICAgLTMgICAgLT4gICcwLjEyNScKK3Bvd3gyMDg0IHBvd2VyIDEuNyAgICAgICAgJzgnICAgLT4gICc2OS43NTc1NzQ0JyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDg1IHBvd2VyIDEwIDAuMzAxMDI5OTk2ICAgLT4gIDIuMDAwMDAwMDAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDg2IHBvd2VyIEluZmluaXR5ICAgJy0xJyAgLT4gICcwJworcG93eDIwODcgcG93ZXIgSW5maW5pdHkgICAnMCcgICAtPiAgJzEnCitwb3d4MjA4OCBwb3dlciBJbmZpbml0eSAgICcxJyAgIC0+ICAnSW5maW5pdHknCitwb3d4MjA4OSBwb3dlciAtSW5maW5pdHkgICctMScgIC0+ICAnLTAnCitwb3d4MjA5MCBwb3dlciAtSW5maW5pdHkgICcwJyAgIC0+ICAnMScKK3Bvd3gyMDkxIHBvd2VyIC1JbmZpbml0eSAgJzEnICAgLT4gICctSW5maW5pdHknCitwb3d4MjA5MiBwb3dlciAtSW5maW5pdHkgICcyJyAgIC0+ICAnSW5maW5pdHknCitwb3d4MjA5MyBwb3dlciAwICAwICAgICAgICAgICAgIC0+ICAnTmFOJyBJbnZhbGlkX29wZXJhdGlvbgorCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCisKKy0tIGJhc2ljcworcG93eDIxMDAgcG93ZXIgMUUtNyAgICAgMUUtNyAgIC0+IDAuOTk5OTk4Mzg4MTkxNzMzOSAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMDEgcG93ZXIgMC4wMDMgICAgMUUtNyAgIC0+IDAuOTk5OTk5NDE5MDg1ODY5NyAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMDIgcG93ZXIgMC43ICAgICAgMUUtNyAgIC0+IDAuOTk5OTk5OTY0MzMyNTA2MiAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMDMgcG93ZXIgMS4yICAgICAgMUUtNyAgIC0+IDEuMDAwMDAwMDE4MjMyMTU2ICAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMDQgcG93ZXIgNzEgICAgICAgMUUtNyAgIC0+IDEuMDAwMDAwNDI2MjY4MDc5ICAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMDUgcG93ZXIgOUUrOSAgICAgMUUtNyAgIC0+IDEuMDAwMDAyMjkyMDUxNjY4ICAgICAgIEluZXhhY3QgUm91bmRlZAorCitwb3d4MjExMCBwb3dlciAxRS03ICAgICAwLjAwMyAgLT4gMC45NTI3OTYxNjQwMjM2NTE5ICAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjExMSBwb3dlciAwLjAwMyAgICAwLjAwMyAgLT4gMC45ODI3MjM1NTAzMzY2Nzk3ICAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjExMiBwb3dlciAwLjcgICAgICAwLjAwMyAgLT4gMC45OTg5MzA1NDc0NDA2MjA3ICAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjExMyBwb3dlciAxLjIgICAgICAwLjAwMyAgLT4gMS4wMDA1NDcxMTQyODI4MzQgICAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjExNCBwb3dlciA3MSAgICAgICAwLjAwMyAgLT4gMS4wMTI4NzAxNTYyNzM1NDUgICAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjExNSBwb3dlciA5RSs5ICAgICAwLjAwMyAgLT4gMS4wNzExODA2NzEyNzg3ODcgICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3Bvd3gyMTIwIHBvd2VyIDFFLTcgICAgIDAuNyAgICAtPiAwLjAwMDAxMjU4OTI1NDExNzk0MTY3ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTIxIHBvd2VyIDAuMDAzICAgIDAuNyAgICAtPiAwLjAxNzEzODk3NjMwMjgxMDMwICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTIyIHBvd2VyIDAuNyAgICAgIDAuNyAgICAtPiAwLjc3OTA1NTkxMjY3MDQ0OTEgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTIzIHBvd2VyIDEuMiAgICAgIDAuNyAgICAtPiAxLjEzNjEyNjk3NzE5ODg4OSAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTI0IHBvd2VyIDcxICAgICAgIDAuNyAgICAtPiAxOS43NjQyNzMwMDA5Mzg3MCAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTI1IHBvd2VyIDlFKzkgICAgIDAuNyAgICAtPiA5Mjg5MDE2Ljk3Njg1MzcxMCAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcG93eDIxMzAgcG93ZXIgMUUtNyAgICAgMS4yICAgIC0+IDMuOTgxMDcxNzA1NTM0OTczRS05ICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMzEgcG93ZXIgMC4wMDMgICAgMS4yICAgIC0+IDAuMDAwOTM4NzQwMzkzMzU5NTY5NCAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMzIgcG93ZXIgMC43ICAgICAgMS4yICAgIC0+IDAuNjUxODA0OTQwNTY2Mzg2NCAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMzMgcG93ZXIgMS4yICAgICAgMS4yICAgIC0+IDEuMjQ0NTY0NzQ3MjAzOTc4ICAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMzQgcG93ZXIgNzEgICAgICAgMS4yICAgIC0+IDE2Ni41MzY3MjQ0NjM4NTUyICAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMzUgcG93ZXIgOUUrOSAgICAgMS4yICAgIC0+IDg4MTIzMzUyNjEyNC44NzkxICAgICAgIEluZXhhY3QgUm91bmRlZAorCitwb3d4MjE0MCBwb3dlciAxRS03ICAgICA3MSAgICAgLT4gMEUtMzk4ICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwgQ2xhbXBlZAorcG93eDIxNDEgcG93ZXIgMC4wMDMgICAgNzEgICAgIC0+IDcuNTA5NDY2NTE0OTc5NzI1RS0xODAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxNDIgcG93ZXIgMC43ICAgICAgNzEgICAgIC0+IDEuMDA0NTI1MjExMjY5MDc5RS0xMSAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxNDMgcG93ZXIgMS4yICAgICAgNzEgICAgIC0+IDQxODY2Ni43NDgzMTg2NTE1ICAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxNDQgcG93ZXIgNzEgICAgICAgNzEgICAgIC0+IDIuNzUwMDYzNzM0ODM0NjE2RSsxMzEgIEluZXhhY3QgUm91bmRlZAorcG93eDIxNDUgcG93ZXIgOUUrOSAgICAgNzEgICAgIC0+IEluZmluaXR5ICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZCBPdmVyZmxvdworCitwb3d4MjE1MCBwb3dlciAxRS03ICAgICA5RSs5ICAgLT4gMEUtMzk4ICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwgQ2xhbXBlZAorcG93eDIxNTEgcG93ZXIgMC4wMDMgICAgOUUrOSAgIC0+IDBFLTM5OCAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsIENsYW1wZWQKK3Bvd3gyMTUyIHBvd2VyIDAuNyAgICAgIDlFKzkgICAtPiAwRS0zOTggICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbCBDbGFtcGVkCitwb3d4MjE1MyBwb3dlciAxLjIgICAgICA5RSs5ICAgLT4gSW5maW5pdHkgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkIE92ZXJmbG93Citwb3d4MjE1NCBwb3dlciA3MSAgICAgICA5RSs5ICAgLT4gSW5maW5pdHkgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkIE92ZXJmbG93Citwb3d4MjE1NSBwb3dlciA5RSs5ICAgICA5RSs5ICAgLT4gSW5maW5pdHkgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkIE92ZXJmbG93CisKKy0tIG51bWJlciBsaW5lIG1pbGVzdG9uZXMgd2l0aCBsaHM8MSBhbmQgbGhzPjEKKworLS0gT3ZlcmZsb3cgYm91bmRhcnkgKE5tYXgpCitwb3d4MjIwMiBwb3dlciA3MSAgICAgMjA3Ljk2NjY1MTU4Mzk4MzIwMCAtPiBJbmZpbml0eSBJbmV4YWN0IFJvdW5kZWQgT3ZlcmZsb3cKK3Bvd3gyMjAxIHBvd2VyIDcxICAgICAyMDcuOTY2NjUxNTgzOTgzMTk5IC0+IDkuOTk5OTk5OTk5OTk5OTk0RSszODQgSW5leGFjdCBSb3VuZGVkCitwb3d4MjIwNCBwb3dlciAwLjAwMyAtMTUyLjYwMzQ0OTgxNzA5MzU3NyAtPiBJbmZpbml0eSBJbmV4YWN0IFJvdW5kZWQgT3ZlcmZsb3cKK3Bvd3gyMjAzIHBvd2VyIDAuMDAzIC0xNTIuNjAzNDQ5ODE3MDkzNTc2IC0+IDkuOTk5OTk5OTk5OTk5OTk0RSszODQgSW5leGFjdCBSb3VuZGVkCisKKy0tIE5taW4gYm91bmRhcnkKK3Bvd3gyMjExIHBvd2VyIDcxICAgIC0yMDYuODg2MzA1MzQxOTg4NDgwIC0+IDEuMDAwMDAwMDAwMDAwMDA1RS0zODMgSW5leGFjdCBSb3VuZGVkCitwb3d4MjIxMiBwb3dlciA3MSAgICAtMjA2Ljg4NjMwNTM0MTk4ODQ4MSAtPiAxLjAwMDAwMDAwMDAwMDAwMUUtMzgzIEluZXhhY3QgUm91bmRlZAorcG93eDIyMTMgcG93ZXIgNzEgICAgLTIwNi44ODYzMDUzNDE5ODg0ODIgLT4gOS45OTk5OTk5OTk5OTk5N0UtMzg0ICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorcG93eDIyMTQgcG93ZXIgNzEgICAgLTIwNi44ODYzMDUzNDE5ODg0ODMgLT4gOS45OTk5OTk5OTk5OTk5MkUtMzg0ICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOS45OTk5OTk5OTk5OTk5MjQ1NjUzNTcwMTk4MjAKKworcG93eDIyMTUgcG93ZXIgMC4wMDMgIDE1MS44MTA3MDQ2MjMyMzg1NDMgLT4gMS4wMDAwMDAwMDAwMDAwMDlFLTM4MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMjE2IHBvd2VyIDAuMDAzICAxNTEuODEwNzA0NjIzMjM4NTQ0IC0+IDEuMDAwMDAwMDAwMDAwMDAzRS0zODMgSW5leGFjdCBSb3VuZGVkCitwb3d4MjIxNyBwb3dlciAwLjAwMyAgMTUxLjgxMDcwNDYyMzIzODU0NSAtPiA5Ljk5OTk5OTk5OTk5OTk3RS0zODQgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsCitwb3d4MjIxOCBwb3dlciAwLjAwMyAgMTUxLjgxMDcwNDYyMzIzODU0NiAtPiA5Ljk5OTk5OTk5OTk5OTkxRS0zODQgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsCisKKy0tIE50aW55IGJvdW5kYXJ5LCB0aGVzZSBlZGdlIGNhc2VzIGRldGVybWluZWQgdXNpbmcgaGFsZl91cCByb3VuZGluZworcm91bmRpbmc6IGhhbGZfdXAKK3Bvd3gyMjIxIHBvd2VyIDcxICAgIC0yMTUuMTUxNTEwNDY5MjIwNDk4IC0+IDFFLTM5OCAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorcG93eDIyMjIgcG93ZXIgNzEgICAgLTIxNS4xNTE1MTA0NjkyMjA0OTkgLT4gMUUtMzk4ICAgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsCitwb3d4MjIyMyBwb3dlciA3MSAgICAtMjE1LjE1MTUxMDQ2OTIyMDUwMCAtPiAwRS0zOTggICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwgQ2xhbXBlZAorcG93eDIyMjQgcG93ZXIgNzEgICAgLTIxNS4xNTE1MTA0NjkyMjA1MDEgLT4gMEUtMzk4ICAgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsIENsYW1wZWQKKworcG93eDIyMjUgcG93ZXIgMC4wMDMgIDE1Ny44NzU2MTM2MTgyODU2OTEgLT4gMUUtMzk4ICAgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsCitwb3d4MjIyNiBwb3dlciAwLjAwMyAgMTU3Ljg3NTYxMzYxODI4NTY5MiAtPiAxRS0zOTggICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK3Bvd3gyMjI3IHBvd2VyIDAuMDAzICAxNTcuODc1NjEzNjE4Mjg1NjkzIC0+IDBFLTM5OCAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbCBDbGFtcGVkCitwb3d4MjIyOCBwb3dlciAwLjAwMyAgMjIwICAgICAgICAgICAgICAgICAtPiAwRS0zOTggICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwgQ2xhbXBlZAorcm91bmRpbmc6IGhhbGZfZXZlbgorCistLSBwb3dlcigxMCwgeSkgYXJlIGltcG9ydGFudCAuLi4KKworLS0gSW50ZWdlciBwb3dlcnMgYXJlIGV4YWN0LCB1bmxlc3Mgb3Zlci91bmRlcmZsb3cKK3Bvd3gyMzAxIHBvd2VyIDEwICAgICAzODUgICAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDIzMDIgcG93ZXIgMTAgICAgIDM4NCAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBSb3VuZGVkCitwb3d4MjMwMyBwb3dlciAxMCAgICAgIDE3ICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMTcgUm91bmRlZAorcG93eDIzMDQgcG93ZXIgMTAgICAgICAxNiAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzE2IFJvdW5kZWQKK3Bvd3gyMzA1IHBvd2VyIDEwICAgICAgMTUgICAgIC0+IDEwMDAwMDAwMDAwMDAwMDAKK3Bvd3gyMzA2IHBvd2VyIDEwICAgICAgMTAgICAgIC0+IDEwMDAwMDAwMDAwCitwb3d4MjMwNyBwb3dlciAxMCAgICAgICA1ICAgICAtPiAxMDAwMDAKK3Bvd3gyMzA4IHBvd2VyIDEwICAgICAgIDEgICAgIC0+IDEwCitwb3d4MjMwOSBwb3dlciAxMCAgICAgICAwICAgICAtPiAxCitwb3d4MjMxMCBwb3dlciAxMCAgICAgIC0xICAgICAtPiAwLjEKK3Bvd3gyMzExIHBvd2VyIDEwICAgICAgLTUgICAgIC0+IDAuMDAwMDEKK3Bvd3gyMzEyIHBvd2VyIDEwICAgICAgLTYgICAgIC0+IDAuMDAwMDAxCitwb3d4MjMxMyBwb3dlciAxMCAgICAgIC03ICAgICAtPiAxRS03Citwb3d4MjMxNCBwb3dlciAxMCAgICAgIC04ICAgICAtPiAxRS04Citwb3d4MjMxNSBwb3dlciAxMCAgICAgIC05ICAgICAtPiAxRS05Citwb3d4MjMxNiBwb3dlciAxMCAgICAgLTEwICAgICAtPiAxRS0xMAorcG93eDIzMTcgcG93ZXIgMTAgICAgLTM4MyAgICAgLT4gMUUtMzgzCitwb3d4MjMxOCBwb3dlciAxMCAgICAtMzg0ICAgICAtPiAxRS0zODQgU3Vibm9ybWFsCitwb3d4MjMxOSBwb3dlciAxMCAgICAtMzg1ICAgICAtPiAxRS0zODUgU3Vibm9ybWFsCitwb3d4MjMyMCBwb3dlciAxMCAgICAtMzk3ICAgICAtPiAxRS0zOTcgU3Vibm9ybWFsCitwb3d4MjMyMSBwb3dlciAxMCAgICAtMzk4ICAgICAtPiAxRS0zOTggU3Vibm9ybWFsCitwb3d4MjMyMiBwb3dlciAxMCAgICAtMzk5ICAgICAtPiAwRS0zOTggU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDIzMjMgcG93ZXIgMTAgICAgLTQwMCAgICAgLT4gMEUtMzk4IFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gSW5kZXBlbmRlbnQgc2FuaXR5IGNoZWNrOiAxOTYxIEdvZGZyZXkgJiBTaWRkb25zIGZvdXItZmlndXJlIGxvZ3MKK3Bvd3gyMzUxIHBvd2VyIDEwICAgMC4wMDAwICAgIC0+IDEKK3Bvd3gyMzUyIHBvd2VyIDEwICAgMC4zMDEwICAgIC0+IDEuOTk5ODYxODY5NjMyNzQ0IEluZXhhY3QgUm91bmRlZAorcG93eDIzNTMgcG93ZXIgMTAgICAwLjQ3NzEgICAgLT4gMi45OTk4NTMxODExOTA3OTMgSW5leGFjdCBSb3VuZGVkCitwb3d4MjM1NCBwb3dlciAxMCAgIDAuNjAyMSAgICAtPiA0LjAwMDM2ODUxMDQ2MTI1MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzU1IHBvd2VyIDEwICAgMC42OTkwICAgIC0+IDUuMDAwMzQ1MzQ5NzY5Nzg1IEluZXhhY3QgUm91bmRlZAorcG93eDIzNTYgcG93ZXIgMTAgICAwLjc3ODIgICAgLT4gNi4wMDA2NzM1Mzg2NDExNjQgSW5leGFjdCBSb3VuZGVkCitwb3d4MjM1NyBwb3dlciAxMCAgIDAuODQ1MSAgICAtPiA3LjAwMDAzMTU5MTMwODk2OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzU4IHBvd2VyIDEwICAgMC45MDMxICAgIC0+IDguMDAwMTg0NDQ4NTUwOTkwIEluZXhhY3QgUm91bmRlZAorcG93eDIzNTkgcG93ZXIgMTAgICAwLjk1NDIgICAgLT4gOC45OTkxMTkxMDg3MDA1MjAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjM2MCBwb3dlciAxMCAgIDAuOTk1NiAgICAtPiA5Ljg5OTE5Nzc1MDgwNTg0MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzYxIHBvd2VyIDEwICAgMC45OTk2ICAgIC0+IDkuOTkwNzkzODk5ODQ0NjE4IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0Citwb3d4MjM3MSBwb3dlciAxMCAgIDAuMDAwMCAgICAtPiAxCitwb3d4MjM3MiBwb3dlciAxMCAgIDAuMzAxMCAgICAtPiAyLjAwMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzczIHBvd2VyIDEwICAgMC40NzcxICAgIC0+IDMuMDAwIEluZXhhY3QgUm91bmRlZAorcG93eDIzNzQgcG93ZXIgMTAgICAwLjYwMjEgICAgLT4gNC4wMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjM3NSBwb3dlciAxMCAgIDAuNjk5MCAgICAtPiA1LjAwMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzc2IHBvd2VyIDEwICAgMC43NzgyICAgIC0+IDYuMDAxIEluZXhhY3QgUm91bmRlZAorcG93eDIzNzcgcG93ZXIgMTAgICAwLjg0NTEgICAgLT4gNy4wMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjM3OCBwb3dlciAxMCAgIDAuOTAzMSAgICAtPiA4LjAwMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzc5IHBvd2VyIDEwICAgMC45NTQyICAgIC0+IDguOTk5IEluZXhhY3QgUm91bmRlZAorcG93eDIzODAgcG93ZXIgMTAgICAwLjk5NTYgICAgLT4gOS44OTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MjM4MSBwb3dlciAxMCAgIDAuOTk5NiAgICAtPiA5Ljk5MSBJbmV4YWN0IFJvdW5kZWQKKworLS0gMTAqKnggfj0yIChpbnZlcnNlIG9mIHRoZSB0ZXN0IGluIGxvZzEwLmRlY1Rlc3QpCitwcmVjaXNpb246IDUwCitwb3d4MjQwMSBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4MTQ2MjExIC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDkKK3Bvd3gyNDAyIHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTg5ODgxNDYyMSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDgKK3Bvd3gyNDAzIHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTg5ODgxNDYyIC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQ3Citwb3d4MjQwNCBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4MTQ2IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDYKK3Bvd3gyNDA1IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTg5ODgxNSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDUKK3Bvd3gyNDA2IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTg5ODgxIC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQ0Citwb3d4MjQwNyBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDMKK3Bvd3gyNDA4IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTg5OSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDIKK3Bvd3gyNDA5IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTkwIC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQxCitwb3d4MjQxMCBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE5IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDAKK3Bvd3gyNDExIHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MiAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzkKK3Bvd3gyNDEyIHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM4Citwb3d4MjQxMyBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc3IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzcKK3Bvd3gyNDE0IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2OCAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzYKK3Bvd3gyNDE1IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI3IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM1Citwb3d4MjQxNiBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAzIC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzQKK3Bvd3gyNDE3IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMCAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzMKK3Bvd3gyNDE4IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzIC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMyCitwb3d4MjQxOSBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzEKK3Bvd3gyNDIwIHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzAKK3Bvd3gyNDIxIHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI1IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI5Citwb3d4MjQyMiBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyIC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjgKK3Bvd3gyNDIzIHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NyAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjcKK3Bvd3gyNDI0IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk1IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI2Citwb3d4MjQyNSBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjUKK3Bvd3gyNDI2IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4OSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjQKK3Bvd3gyNDI3IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM5IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIzCitwb3d4MjQyOCBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzc0IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjIKK3Bvd3gyNDI5IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNyAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjEKK3Bvd3gyNDMwIHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MjE0IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIwCitwb3d4MjQzMSBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxIC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTkKK3Bvd3gyNDMyIHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1MiAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTgKK3Bvd3gyNDMzIHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMTk1IC0+IDIuMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE3Citwb3d4MjQzNCBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTIwIC0+IDIuMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTYKK3Bvd3gyNDM1IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxMiAtPiAyLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTUKK3Bvd3gyNDM2IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjYzOTgxIC0+IDIuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE0Citwb3d4MjQzNyBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4IC0+IDIuMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTMKK3Bvd3gyNDM4IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjY0MCAtPiAyLjAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTIKK3Bvd3gyNDM5IHBvd2VyIDEwIDAuMzAxMDI5OTk1NjY0IC0+IDIuMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDExCitwb3d4MjQ0MCBwb3dlciAxMCAwLjMwMTAyOTk5NTY2IC0+IDIuMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTAKK3Bvd3gyNDQxIHBvd2VyIDEwIDAuMzAxMDI5OTk1NyAtPiAyLjAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDkKK3Bvd3gyNDQyIHBvd2VyIDEwIDAuMzAxMDI5OTk2IC0+IDIuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA4Citwb3d4MjQ0MyBwb3dlciAxMCAwLjMwMTAzMDAwIC0+IDIuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDcKK3Bvd3gyNDQ0IHBvd2VyIDEwIDAuMzAxMDMwMCAtPiAyLjAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDYKK3Bvd3gyNDQ1IHBvd2VyIDEwIDAuMzAxMDMwIC0+IDIuMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA1Citwb3d4MjQ0NiBwb3dlciAxMCAwLjMwMTAzIC0+IDIuMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDQKK3Bvd3gyNDQ3IHBvd2VyIDEwIDAuMzAxMCAtPiAyLjAwMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDMKK3Bvd3gyNDQ4IHBvd2VyIDEwIDAuMzAxIC0+IDIuMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyCitwb3d4MjQ0OSBwb3dlciAxMCAwLjMwIC0+IDIuMCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDEKK3Bvd3gyNDUwIHBvd2VyIDEwIDAuMyAtPiAyIEluZXhhY3QgUm91bmRlZAorCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIENsb3NlLXRvLWUgdGVzdHMKK3ByZWNpc2lvbjogICAzNAorcG93eDI1MDAgcG93ZXIgMTAgMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDQ4ICAgICAtPiAyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjUwMSBwb3dlciAxMCAwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwNDkgICAgIC0+IDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYxICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyNTAyIHBvd2VyIDEwIDAuNDM0Mjk0NDgxOTAzMjUxODI3NjUxMTI4OTE4OTE2NjA1MCAgICAgLT4gMi43MTgyODE4Mjg0NTkwNDUyMzUzNjAyODc0NzEzNTI2NjIgIEluZXhhY3QgUm91bmRlZAorcG93eDI1MDMgcG93ZXIgMTAgMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDUxICAgICAtPiAyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MyAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjUwNCBwb3dlciAxMCAwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwNTIgICAgIC0+IDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYzICBJbmV4YWN0IFJvdW5kZWQKKworLS0gZSoqZSwgMTYtPjM0Citwb3d4MjUwNSBwb3dlciAyLjcxODI4MTgyODQ1OTA0NSAyLjcxODI4MTgyODQ1OTA0NSAtPiAnMTUuMTU0MjYyMjQxNDc5MjU3MDU2MzM3Mzk1MTMwOTgyMTknIEluZXhhY3QgUm91bmRlZAorCistLSBTZXF1ZW5jZSBhcm91bmQgYW4gaW50ZWdlcgorcG93eDI1MTIgcG93ZXIgMTAgMi45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3ICAgICAtPiA5OTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MyAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjUxMyBwb3dlciAxMCAyLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTggICAgIC0+IDk5OS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyNTE0IHBvd2VyIDEwIDIuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgLT4gOTk5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTggIEluZXhhY3QgUm91bmRlZAorcG93eDI1MTUgcG93ZXIgMTAgMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAtPiAxMDAwCitwb3d4MjUxNiBwb3dlciAxMCAzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgIC0+IDEwMDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyNTE3IHBvd2VyIDEwIDMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMiAgICAgLT4gMTAwMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIEluZXhhY3QgUm91bmRlZAorcG93eDI1MTggcG93ZXIgMTAgMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzICAgICAtPiAxMDAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHJhbmRvbWx5IGdlbmVyYXRlZCB0ZXN0cworbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKKworLS0gUD0zNCwgd2l0aGluIDAtOTk5IC0tIHBvc2l0aXZlIGFyZzIKK1ByZWNpc2lvbjogMzQKK3Bvd3gzMjAxIHBvd2VyIDUuMzAxNTU3NzQ0MTMxOTY5MjQ5MTQ1OTA0NjExMjkwNzM1ICAzNjkuMzE3NTY0Nzk4NDQzNTUzNDI0MzgxMzQ2NjM4MDU3OSAtPiAzLjQyNzE2NTY3NjM0NTY4ODI0MDAyMzExMzMyNjYwMzk2MEUrMjY3IEluZXhhY3QgUm91bmRlZAorcG93eDMyMDIgcG93ZXIgMC4wMDAwMDAwMDAwNTA2ODc1NjU1ODE5MTY1OTczNzM4MjI1IDIxLjkzNTE0MTAyNzA0NDY2NDM0MTIxODI2OTY1MTk2ODc4IC0+IDEuNDk4MTY5ODYwMDMzNDg3MzIxNTY2NjU5NDk1MzQwNzg5RS0yMjYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIwMyBwb3dlciA5Ny44ODg3NzY4MDcyMTUxOTkxNzg1ODAwNzgxMDQ5NDA0MyAgNS4xNTk4OTg0NDUyNDI3OTM0NzA0NzY2NzMxMDk4OTk1NTQgLT4gMTg3MDU5NDI5MDQuNDMyOTA0NjcyODE0NDk1NTk0Mjc5ODIgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjA0IHBvd2VyIDcuMzgwNDQxMDE1NTk0Mzk5NzQ3OTczOTI0MzgwNDkzNzk5ICAxNy45MzYxNDE3MzkwNDgxODMxMzUwNzUyNTEwOTAzMzI4OCAtPiAzNzE1NzU3OTg1ODIwMDc2LjI3MzMzNjA4MjcwMjU3NzI3NCAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDMyMDUgcG93ZXIgMi4wNDU2MjM2Mjc2NDczNTA5MTg4MTkyMTkxNjk4NTUwNDAgIDEwODIuOTk5NjUyNDA3NDMwNjk3OTU4MTc1OTY2OTk2MjU0IC0+IDQuMjA4ODA2NDM1MDA2NzA0ODY3NDQ3MTUwOTA0Mjc5ODU0RSszMzYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIwNiBwb3dlciAwLjAwMDAwMDA3NjI1ODI4NzMxMTIxMTg5MjYxNDI5NTU0MjMgMjAuMzA1MzQyMzcwNTUwNzM5OTY5NzUyMDM4NjQxNzA0MzIgLT4gMi45Njc1NzQyNzg2NzcwMTMwOTA2OTcxMzAzNDkxOTg4NzdFLTE0NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjA3IHBvd2VyIDAuMDAwMDAwMDAwMDE5NDA5MTQ3MDkwNzgxNDg1NTY2MDUzNSAxNC43MTE2NDIxMzk0NzcyMjIzODg1NjgzNTQ0MDI0MjkxMSAtPiAyLjU2NDM5MTM5NzQ2OTU1NDczNTAzNzE1ODM0NTk2MzI4MEUtMTU4IEluZXhhY3QgUm91bmRlZAorcG93eDMyMDggcG93ZXIgMC4wMDAwMDAwMDAwNTA5NDM0MTg1MzgyODE4NTk2ODUzNTA0IDIwLjk3MDUxNDk4MjA0MTg4Mjc3MzQ3MjAzNzM1NDIxNTk1IC0+IDEuNDIwMTU3MzcyNzQ4MDgzMDAwOTI3MTM4Njc4NDE3MjcyRS0yMTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIwOSBwb3dlciAwLjAwMDUzODkyMTcyMTIwNzMzMDczMDEzOTU3NTA3NDUxMTkgNDMuOTY3OTgyMjU0ODU3NDczMTU4NTg2Nzg3NTU1Mzg5NzEgLT4gMS45NTc4NTAxODU3ODEyOTIwMDc5Nzc4OTg2MjYxMzcyNDBFLTE0NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjEwIHBvd2VyIDQ5OC41NjkwMTA1OTg5MTM2MDUwNDQ0MDc3NDQ3NDExMTk4ICAxMjguMTAzODgxMzgwNzI0MzM3NTg3ODgzMTEwNDc0NTgwMyAtPiAzLjg4MjIxMjk3MDkwMzg5MzEyNzAwOTEwMjI5MzU5NjI2OEUrMzQ1IEluZXhhY3QgUm91bmRlZAorcG93eDMyMTEgcG93ZXIgMC4wMDAwMDAwOTM1NDI4OTE4NjM3MzAzOTU0MjgxOTM4OTc1IDUuNzM2OTMzNDU0ODYzMjc4NTk3NDYwMDkxNTk2NDk2MDk5IC0+IDQuNzMzMjE5NjQ0NTQwNDk2MTUyNDAzOTY3ODIzNjM1MTk1RS00MSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxMiBwb3dlciA4LjU4MTU4Njc4NDczNDE2MTMwOTE4MDM2MzExMDEyNjM1MiAgMjUyLjAyMjk0NTk5Njg4Njk3ODQ2NDMzNzQ5ODE0NzcyMDggLT4gMS45MDc0NjQ4NDI0NTg2NzQ2MjIzNTYxNzc4NTAwNDk4NzNFKzIzNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjEzIHBvd2VyIDI5NC4xMDA1MzAyOTUxNjIxNzA5MTQzMzIwNzk1Mjc4MzA1ICAxNTUuNTQ2NjM3NDE0MTcwODYxNTk3NTExMTAxNDY2MzcyMiAtPiA5LjI1MTcxNzAzMzI5MjA3Mjk1OTE2NjczNzI4MDcyOTcyOEUrMzgzIEluZXhhY3QgUm91bmRlZAorcG93eDMyMTQgcG93ZXIgMC4wMDAwMDAwMDQxMjUzMzQzNjU0Mzk2ODY1ODU1NzIyMDkwIDE5LjAwMTcwOTc0NzYwNDI1NTc2MjQ3NjYyMTI1MTEwNDcyIC0+IDQuNzc5NTY2Mjg4NTUzODY0NDA1NzkwOTIxMzUzNTkzNTEyRS0xNjAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxNSBwb3dlciAwLjAwMDAwMDAwMDAwNDY5MTIyNTczNTIxNDEzOTUxODQwOTIgMjQuNjYwODk1MjMxNDg3MjkyNjkwOTg3NzMyMzY2MzY4NzggLT4gNC4yMDUxMjY4NzQwNDg1OTc4NDk0NzY3MjM1MzgwNTc1MjdFLTI4MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjE2IHBvd2VyIDAuMDAwMDAwMDAwMDAzNjc5NjY3NDI5NjUyMDYzOTQ1MDQ5NCAyMi4wOTcxMzk1NjkwMDY5NDY4OTIzNDMzNTkxMjUyMzA3OCAtPiAyLjE3MzA4MTg0MzgzNzUzOTgxODQ3MjA3MTMxNjQyMDQwNUUtMjUzIEluZXhhY3QgUm91bmRlZAorcG93eDMyMTcgcG93ZXIgOS42NTk4ODcxMDAzMDMwMzc2NTc5MzQzNzIxNDg1Njc2ODUgIDI3Ny4zNzY1NjY1NDI0MzIwODc1OTkzMDI2NDA0NDkyMjE2IC0+IDEuNjE0OTc0MDQzMTQ1NTE5MzgyNzQ5NzQwNjE2NjY1MDQxRSsyNzMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxOCBwb3dlciAwLjAwMDAwODMyMzEzMTA2NDIyMjkyMDQzOTg5NDMwNzY0MDMgMjkuMzMxMjMyMTE3ODIxMzE0NjY0NzEzNTkxMjgxOTAzNzIgLT4gMS4wMTMzMzA0Mzk3ODY2NjAyMTA3NTcyMjY1OTc3ODUzMjhFLTE0OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjE5IHBvd2VyIDAuMDkzODA4NDg1OTA4NjQ1MDk1NDk1Njg2MzcyNTY1MzY2NCAyNjIuNjA5MTkxODE5OTkwNTI3MjgzNzI4Njc4NDk3NTAxMiAtPiAxLjI2MjgwMjQ4NTI4NjMwMTA2Njk2NzU1NTgyMTUwOTM0NEUtMjcwIEluZXhhY3QgUm91bmRlZAorcG93eDMyMjAgcG93ZXIgOC4xOTQ5MjY5Nzc1ODA5MDAxNDU2OTYzMDU5MTAyMjMzMDQgIDE4NC4zNzA1MTMzOTQ1NTQ2MjAyMDEyOTk1NDg1Mjk3MjQ4IC0+IDIuNjk2MzUzOTEwOTA3ODI0MDE2NjkwMDIxNDk1ODI4NTg0RSsxNjggSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyMSBwb3dlciA3Mi4zOTU5NDU5NDY1MzA4NTE2MTUyMjI4NTExNDU2NjEyMCAgMTY4Ljc3MjE5MDk0ODkzMjE0MDIxNTIwMzM5Mzk4MzY3MjUgLT4gNy4zNzk4NTgyOTM2MzA0NjAwNDMzNjE1ODQ0MTA3OTUwMzFFKzMxMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjIyIHBvd2VyIDAuMDAwMDAwMDAwMDAwMzQzNjg1NjAxMDE0NDE4NTQ0NTUzNyAyNi4zNDMyOTg2ODk2MTI3NDk4ODk5NDQ1MjUyNjE3ODk4MyAtPiA0LjU4NTM3OTU3MzU5NTg2NTY4OTYwNTU2NzcyMDE5Mjc2OEUtMzI5IEluZXhhY3QgUm91bmRlZAorcG93eDMyMjMgcG93ZXIgMjAuMTgzNjU2MzM3NjIyMjY1NTAyNTQ1NDI0ODk0OTI2MjMgIDEyNy4yMDk5NzA1MjM3MDIxMzUwMTAzNjc4MDcyNzA3NzkwIC0+IDEuMDIwOTE5NjI5MzM2OTc5MzUzNjkwMjcxNzYyMjA2MDYwRSsxNjYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyNCBwb3dlciAwLjAwMDAwMDA1NTM3MjM5OTA3NjE1MzAyOTAxMjkyNjgxMzEgOC4xNTc1OTc1NjYxMzQ3NTQ2MzgwMTUxOTk1MDExNjI0MDUgLT4gNi4zNDkwMzA1MTMzOTYxNDc0ODA5NTQ0NzQ2MTUwNjcxNDVFLTYwICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjI1IHBvd2VyIDAuMDAwMTAyODc0MjY3NDI2NTg0MDY1NjYxNDY4MjYxODAzNSA5My45OTg0MjMxNzMwNjYwMzc5Nzk2NTQ3MDI4MTcxNjQ4MiAtPiAxLjQ1NTg3MTExMDIyMjczNjUzMTg1NDk5MDM5Nzc2OTk0MEUtMzc1IEluZXhhY3QgUm91bmRlZAorcG93eDMyMjYgcG93ZXIgOTUuOTAxOTUxNTI3NzU1NDM4NzY0ODk3NDYzNDMyNjYwNTAgIDE0My41OTkyODUwMDAyMjExNTA5Nzc3NzIwNzk5MzUyNDc1IC0+IDMuODgxNTQwMDE1ODQ4NTMwNDA1MTg5ODM0MzY2NTg4NTY3RSsyODQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyNyBwb3dlciAwLjAwMDAwMDAwMDAwNDE3ODM3NDcwNTcyMzM4NzgzNjAzMzMgMTIuMTQ1OTExNjc3NjQ5OTM1MDY4MjEzMzQ3NjA5NTQ0MzAgLT4gNi4xOTA5OTg1NTc0NTY4ODU5ODUxMjQ1OTI4MDczODMxNjNFLTEzOSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjI4IHBvd2VyIDAuNTU3MjgzMDQ5NzA4Njc0MDc5ODQzNDkxNzA5MDAxODc2OCAxMDAxLjkyMTgxMTI2MzkxOTUyMjIzMDMzMDI0MTM0OTE2NiAtPiAzLjg3MTE0NTE1ODUzNzE3MDQ1MDA5MzgzMzg4MTYyNTgzOEUtMjU1IEluZXhhY3QgUm91bmRlZAorcG93eDMyMjkgcG93ZXIgNTE2LjQ3NTQ3NTk3NzkwOTM5NTQ3OTA4MTM4ODEzMzMyMzIgIDI5LjIzODEyNDYzMTI2MzA5MDU3ODAwNzkzNjQ1MzM2MzQzIC0+IDIuMTEwOTg2MTkyNDA4ODc4Mjk0MDEyNDUwMDUyOTI5MTg1RSs3OSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzMCBwb3dlciAwLjAwMDA4MzU4OTIwOTk0NjQ1ODQ3NzY4NDcyOTkwMjA3MDYgMjcuNjQyNzk5OTI4ODQ4NDM4Nzc0NTM1OTI2NTkzNDE1ODggLT4gMS44OTE1MzUwOTg5MDU1MDY2ODk1MTIzNzYyMjQ5NDMyOTNFLTExMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjMxIHBvd2VyIDcyLjQ1ODM2NTc3NzQ4NTcxODM4MTM5OTAwMTY1MTg0OTU1ICAxNjYuMjU2Mjg5MDczNTAzMjU0NTA5MTY4ODAxNTE2MDA4NCAtPiAxLjc4NDA5MTU0OTA0MTU2MTUxNjkyMzA5MjU0MjkzOTE0MUUrMzA5IEluZXhhY3QgUm91bmRlZAorcG93eDMyMzIgcG93ZXIgMzA1LjE4MjMzMTc2NDMzMzU5MjQwMDc2Mjk1NjMwMDkwMzIgIDgzLjAxMDY1MTU5NTA4NDcyODg0MjE5MjkwMTM2MzE5NjIzIC0+IDEuNzU3NDkzMTM2MTY0Mzk1MjI5NjAyNDU2NzgyNzc5MTEwRSsyMDYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzMyBwb3dlciA3LjEwODUyNzEwMjk1MTcxMzYwMzU0MjgzNTc5MTczMzc4NiAgMTQ1LjcwNTc4NTI3NjYyMzYzNjU0NTA0NjM0Mjg4MjE5NDggLT4gMS4yODU5MzQ3NzQxMTMxMDQzNjI2NjM2MTk4OTY1NTA1MjhFKzEyNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjM0IHBvd2VyIDYuNDcxMzkzNTAzMTc1NDY0ODI4MTQ5MzY1Njk3MDQ5ODI0ICA2NC4xMTc0MTkzNzI2MjQ1NTcyNTI4NDc1NDE3MTk5NTcyMCAtPiA5Ljk3ODk5MDM1NTg4MTgwMzE5NTI4MDAyNzUzMzAxMTY5OUUrNTEgIEluZXhhY3QgUm91bmRlZAorcG93eDMyMzUgcG93ZXIgMzkuNzI4OTgwOTQxMzg0NTk4ODU2NjIzODA4NjYyNjgzODUgIDIzOS45Njc3Mjg4MDE3NDQ3NDAwNzg2NjcyNzc5NzM1MTY4IC0+IDUuNDIyMjE4MjA4NTE3MDk4MzM1ODMyODQ4NDg3Mzc1MDg2RSszODMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzNiBwb3dlciAwLjAwMDI4NjU1OTIzMzI3MzY5NzMwMDAxODMyODczMjk5MzMgOTAuMzQ3MzM4Njk1OTA1ODM3ODcwNjU2NDI1MzI2NDEwOTYgLT4gOC4yOTM3MzMxMjY5NzYyMTIwMzMyMDkyNDMyNTcxMzY3OTZFLTMyMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjM3IHBvd2VyIDAuMDAwMDAxMTM0MzM4NDM5NDg2NDgxMTE5NTA3NzM1NzkzNiAxLjkyNjU2ODI4NTUyODM5OTY1Njc4OTE0MDgwOTM5OTM5NiAtPiAzLjUxNjA1NTYzOTM3ODM1MDE0Njg3NDI2MTA3NzQ3MDE0MkUtMTIgIEluZXhhY3QgUm91bmRlZAorcG93eDMyMzggcG93ZXIgMC4wMDAwMDAwMDM1MzIxNjEwMjk1MDY1Mjk5Mzg0ODg5MjI0IDcuNTgzODYxNzc4ODI0Mjg0MDkyNDM0MDg1MjY1MjY1NTgyIC0+IDcuOTcwODk5ODIzODE3MzY5NzY0MzgxOTc2Mjg2NTM2MjMwRS02NSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzOSBwb3dlciA2NTcuNTAyODMwMTU2OTM1MjY3NzU0Mzc3MDc1ODM0NjY4MyAgOTAuNTU3Nzg0NTM4MTE5NjUxMTYyMDAyMDYwMjAxNzI3NTggLT4gMS41MjI1MzA4OTg1ODE1NjQyMDA2NTUxNjA2NjU3MjMyNjhFKzI1NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjQwIHBvd2VyIDguNDg0NzU2Mzk4MzI1NzQ4ODc5NDUwNTc3NTIwMjUxNDQ3ICAzODkuNzQ2ODI5MjQ3NjI2MjQ3ODU3ODI4MDUzMTIyMjQxNyAtPiA4LjU5NTE0MjgwMzU4NzM2ODA5MzM5MjUxMDMxMDgxMTIxOEUrMzYxIEluZXhhY3QgUm91bmRlZAorCistLSBQPTE2LCB3aXRoaW4gMC05OSAtLSBwb3NpdGl2ZSBhcmcyCitQcmVjaXNpb246IDE2Citwb3d4MzEwMSBwb3dlciAwLjAwMDAyMTU1MjQ2MzkyMjMgNDguMzc1MzI1MjIzNTUyNTIgLT4gMS44MDQ2NjMyNTcyODcyNzdFLTIyNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTAyIHBvd2VyIDAwLjgwNzA1ODU2MjI3OTk5ICAyNzA2Ljc3NzUzNTEyMTM5MSAtPiAxLjAyOTYyNTA2NTg3NjE1N0UtMjUyIEluZXhhY3QgUm91bmRlZAorcG93eDMxMDMgcG93ZXIgMy40NDU0NDE2NzYzODM2ODkgIDQyOC41MTg1ODkyNDU1ODMwIC0+IDEuNjU3NDAxNjgzMDk2NDU0RSsyMzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEwNCBwb3dlciAwLjAwNDAxNTg2ODk0OTU4MjYgMTU5LjU3MjU1NTg4MTYyNDAgLT4gNC4yNTU3NDM2NjU3NjI0OTJFLTM4MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTA1IHBvd2VyIDAuMDAwMDg0MTU1MzI4MTIxNSAzOC4zMjUwNDQxMzQ1Mzk0NCAtPiA2LjczODY1MzkwMjUxMjA1MkUtMTU3IEluZXhhY3QgUm91bmRlZAorcG93eDMxMDYgcG93ZXIgMC43MzIyNjEwMjUyNTcxMzUzIDUwMi4xMjU0NDU3Njc0MTE4IC0+IDEuMTA5OTc4MTI2OTg1OTQzRS02OCAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEwNyBwb3dlciAxMC43NTA1MjUzMjE0NDg4MCAgNjcuMzQxODA2MDQ3MzQ3ODEgLT4gMi44NzMwMTUwMTk0NzAxODlFKzY5ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTA4IHBvd2VyIDI2LjIwNDI1OTUyOTQ1NjE3ICAxMDQuNjAwMjY3MTE4NjQ4OCAtPiAyLjMwMTg1OTM1NTc3NzAzMEUrMTQ4IEluZXhhY3QgUm91bmRlZAorcG93eDMxMDkgcG93ZXIgMC4wMDAwMDU1NzM3NDczODUwIDMxLjE2Mjg1ODU5MDA1NDI0IC0+IDEuODgzMzQ4NDcwMTAwNDQ2RS0xNjQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzExMCBwb3dlciA2MS4wNjA5NjAxMTM2MDcwMCAgMTAuOTM2MDg0MzkwODg3MjYgLT4gMy4zODI2ODY0NzMwMjgyNDlFKzE5ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTExIHBvd2VyIDkuMzQwODgwODUzMjU3MTM3ICAxNzkuOTA5NDkzODEzMTcyNiAtPiAzLjgxOTI5OTc5NTkzNzY5NkUrMTc0IEluZXhhY3QgUm91bmRlZAorcG93eDMxMTIgcG93ZXIgMC4wMDAwMDUwNzY3MzcxNzU2IDcyLjAzMzQ2Mzk0MTg2NzQxIC0+IDQuMjE2MjM2NjkxNTY5ODY5RS0zODIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzExMyBwb3dlciA2LjgzODQ3ODgwNzg2MDU5NiAgNDcuNDk2NjU1OTA2MDIyODUgLT4gNC41NDc2MjE2MzAwOTkyMDNFKzM5ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTE0IHBvd2VyIDAuMTI5OTMyNDM0NjQzOTA4MSAzOTcuNzQ0MDUyMzU3NjkzOCAtPiAzLjA2NTA0NzcwNTU1Mzk4MUUtMzUzIEluZXhhY3QgUm91bmRlZAorcG93eDMxMTUgcG93ZXIgMC4wMDAzNDE4MDQ3MDM0MjY0IDIwLjAwNTE2NzkxNTEyMDE4IC0+IDQuNTQ2MTg5NjY1MzgwNDg3RS03MCAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzExNiBwb3dlciAwLjAwMDEyNzY4OTk2MTE3MTUgNzguMTI5NjgyODczNTU3MDMgLT4gNS45NjAyMTc0MDUwNjM5OTVFLTMwNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTE3IHBvd2VyIDI1LjkzMTYwNTg4MTgwNTA5ICAyNTIuNjI0NTA3MTAwNDYyMCAtPiAxLjQ3MjE3MTU5NzU4OTE0NkUrMzU3IEluZXhhY3QgUm91bmRlZAorcG93eDMxMTggcG93ZXIgMzUuNDc1MTY4NTc3NjMxNzggIDg2LjE0NzIzMDM3MzYwOTI1IC0+IDMuMzI0Mjk5OTA4NDgxMTI1RSsxMzMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzExOSBwb3dlciAwLjAwMDAwNDgxNzEwODY3MjEgNDMuMzE5NjU2MDMwMzg2NjYgLT4gNC41NzIzMzE1MTY2MTYyMjhFLTIzMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTIwIHBvd2VyIDE3Ljk3NjUyNjgxMDk3ODUxICAxNDQuNDY4NDU3NjU1MDI5MiAtPiAxLjg0MjUwOTkwNjA5Nzg2MEUrMTgxIEluZXhhY3QgUm91bmRlZAorcG93eDMxMjEgcG93ZXIgMy42MjI3NjUxNDE1MTg3MjkgIDMwNS4xOTQ4NjgwMzQ0OTUwIC0+IDQuMTMyMzIwOTY3NTc4NzA0RSsxNzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEyMiBwb3dlciAwLjAwODA5NTkwMDI0NTM1MTkgMTQzLjk4OTk0NDQ5NDU2MjcgLT4gNi40NzQ2Mjc4MTI5NDcwNDdFLTMwMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTIzIHBvd2VyIDkuODQxNjk5OTI3Mjc2NTcxICAyOTkuMjQ2NjY2ODgzNzE4OCAtPiAxLjQ4OTA5NzY1NjIwODczNkUrMjk3IEluZXhhY3QgUm91bmRlZAorcG93eDMxMjQgcG93ZXIgMC4wNzg2NjU5MjA2MjMyMzU1IDM0Ny40NzUwNzk2OTYyNTcwIC0+IDIuMDU3NjQ4MDk2NDY5MjVFLTM4NCAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK3Bvd3gzMTI1IHBvd2VyIDAuMDAwMDA4NDQ1OTc5MjY0NSA1Mi40NzM0ODY5MDc0NTQ4NyAtPiA2LjA3NjI1MTg3NjUxNjk0MkUtMjY3IEluZXhhY3QgUm91bmRlZAorcG93eDMxMjYgcG93ZXIgMjcuODY1ODk5MDk5Njc1MDQgIDE5MS43Mjk2NTM3MTAyMjgzIC0+IDEuMTU3MDY0MTEyOTg5Mzg2RSsyNzcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEyNyBwb3dlciAwLjAwMDA0MTk5MDc5MzcyMzQgNTguNDQ5NTc3MDI3MzA3NjcgLT4gMS40OTY5NTA2NzIwNzUxNjJFLTI1NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTI4IHBvd2VyIDAuMDAwMDY2NDk3NzczOTM4MiA4MC4wNjc0OTIxMzI2MTg3NiAtPiAzLjQ4ODUxNzYyMDEwNzg3NUUtMzM1IEluZXhhY3QgUm91bmRlZAorcG93eDMxMjkgcG93ZXIgNTguNDk1NTQ0ODQ4ODY2NTYgIDEyNS44NDgwNzY4MzczNDk5IC0+IDIuNDQ5MDg5ODYyMTQ2NjQwRSsyMjIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEzMCBwb3dlciAxNS4wMjgyMDA2MDAyNDQ0OSAgMjEyLjM1Mjc5ODg5NzMzMzggLT4gOC4zMDc5MTM5MzI2ODIwNjdFKzI0OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTMxIHBvd2VyIDAuMDAwMjY1MDA4OTk0Mjk5MiAzMC45MjE3MzEyMzY3ODc2MSAtPiAyLjUxNzgyNzY2NDgzNjE0N0UtMTExIEluZXhhY3QgUm91bmRlZAorcG93eDMxMzIgcG93ZXIgMC4wMDA3MzQyOTc3NDI2NTc4IDY5LjQ5MTY4ODgwNzQxMTIzIC0+IDEuNjAwMTY4NjY1Njc0NDQwRS0yMTggSW5leGFjdCBSb3VuZGVkCitwb3d4MzEzMyBwb3dlciAwLjAwNjM4MTYwNjg2NTA2MjkgMTUwLjE0MDAwOTQxODM4MTIgLT4gMi43MDUwNTcyOTU3OTkwMDFFLTMzMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTM0IHBvd2VyIDkuOTEyOTIxMTIyNzI4NzkxICAyOTcuODI3NDAxMzYzMzQxMSAtPiA0Ljk2NzYyNDk5MzQzODkwMEUrMjk2IEluZXhhY3QgUm91bmRlZAorcG93eDMxMzUgcG93ZXIgMS45ODg2MDM1NjM5ODkyNDUgIDc2OC40ODYyOTY3OTIyMTgyIC0+IDIuNjkyODQyNDc0ODk5NTk2RSsyMjkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEzNiBwb3dlciA4LjQxODAxNDUxOTUxNzY5MSAgMTY0LjI0MzEzNTk5ODA3MjUgLT4gOS4xMDYyMTE1ODU4ODg4MzZFKzE1MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTM3IHBvd2VyIDYuMDY4ODIzNjA0NDUwNjg2ICAxMjAuMjk1NTIxMjM2NTgzNyAtPiAxLjU5OTQzMTkxODEwNTk4MkUrOTQgIEluZXhhY3QgUm91bmRlZAorcG93eDMxMzggcG93ZXIgNTYuOTAwNjI3MzgzMDM4NTAgIDU0LjkwNDY4Mjk0NjgzNjQ1IC0+IDIuMzEyODM5MTc3OTAyNDI4RSs5NiAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEzOSBwb3dlciA1LjcxMDkwNTEzOTc1MDg3MSAgNzMuNDQ2MDg3NTI5NjIxNTYgLT4gMy43NzU4NzYwNTM3MDk5MjlFKzU1ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTQwIHBvd2VyIDAuMDAwMDAxNzQ0Njc2MTIwMyAxLjIyMzk4MTQ5MjIyODg5OSAtPiA4Ljk1MjkzNjU5NTQ2NTYzNUUtOCAgIEluZXhhY3QgUm91bmRlZAorCistLSBQPTcsIHdpdGhpbiAwLTkgLS0gcG9zaXRpdmUgYXJnMgorUHJlY2lzaW9uOiA3Citwb3d4MzAwMSBwb3dlciA4LjczODY4OSAgNTUuOTY1MjMgLT4gNC44NzgxODBFKzUyICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDAyIHBvd2VyIDAuMDQwNDc2MyAxNDcuNDk2NSAtPiAzLjY4OTcyMkUtMjA2IEluZXhhY3QgUm91bmRlZAorcG93eDMwMDMgcG93ZXIgMC4wNjA0MjMyIDc2LjY5Nzc4IC0+IDMuMzE5MTgzRS05NCAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAwNCBwb3dlciAwLjAwNTg4NTUgMTA3LjUwMTggLT4gMS43Njg4NzVFLTI0MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDA1IHBvd2VyIDIuMDU4MzAyICAxMTczLjA1MCAtPiA1Ljc3ODg5OUUrMzY3IEluZXhhY3QgUm91bmRlZAorcG93eDMwMDYgcG93ZXIgMC4wMDU2OTk4IDg1LjcwMTU3IC0+IDQuNzE2NzgzRS0xOTMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAwNyBwb3dlciAwLjgxNjkyOTcgMzY5My41MzcgLT4gNC40NzU5NjJFLTMyNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDA4IHBvd2VyIDAuMjgxMDE1MyA2NTkuOTU2OCAtPiAxLjUzMzE3N0UtMzY0IEluZXhhY3QgUm91bmRlZAorcG93eDMwMDkgcG93ZXIgNC42MTc0NzggIDE1LjY4MzA4IC0+IDIuNjI5NzQ4RSsxMCAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAxMCBwb3dlciAwLjAyOTY0MTggMjQ0LjIzMDIgLT4gNi4yMDc5NDlFLTM3NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDExIHBvd2VyIDAuMDAzNjQ1NiAxMjcuOTk4NyAtPiA4LjEyMDg5MUUtMzEzIEluZXhhY3QgUm91bmRlZAorcG93eDMwMTIgcG93ZXIgMC41MDEyODEzIDU3Ny41NDE4IC0+IDYuMDg4ODAyRS0xNzQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAxMyBwb3dlciAwLjAwMzMyNzUgMTE5Ljk4MDAgLT4gNS4wNTUwNDlFLTI5OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDE0IHBvd2VyIDAuMDAzNzY1MiAxMTEuNzA5MiAtPiAxLjU2MDM1MUUtMjcxIEluZXhhY3QgUm91bmRlZAorcG93eDMwMTUgcG93ZXIgMC42NDYzMjUyIDIzOS4wNTY4IC0+IDQuODY0NTY0RS00NiAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAxNiBwb3dlciA0Ljc4NDM3OCAgNDc1LjA1MjEgLT4gOC45NjQ0NjBFKzMyMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDE3IHBvd2VyIDQuNjEwMzA1ICA1NjMuMTc5MSAtPiA2LjI5MDI5OEUrMzczIEluZXhhY3QgUm91bmRlZAorcG93eDMwMTggcG93ZXIgMC4wMTc1MTY3IDgwLjUyMjA4IC0+IDMuNjIzNDcyRS0xNDIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAxOSBwb3dlciA1LjIzODMwNyAgMzU2Ljc5NDQgLT4gNC4wMTE0NjFFKzI1NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDIwIHBvd2VyIDAuMDAwMzUyNyA5Ni4yNjM0NyAtPiA0LjM3NzkzMkUtMzMzIEluZXhhY3QgUm91bmRlZAorcG93eDMwMjEgcG93ZXIgMC4wMDE1MTU1IDEzNi4wNTE2IC0+IDIuNTcxMTNFLTM4NCAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK3Bvd3gzMDIyIHBvd2VyIDUuNzUzNTczICAyNzMuMjM0MCAtPiA0LjM3MzE4NEUrMjA3IEluZXhhY3QgUm91bmRlZAorcG93eDMwMjMgcG93ZXIgNy43Nzg2NjUgIDMzMi43OTE3IC0+IDMuMDYwNjQwRSsyOTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAyNCBwb3dlciAxLjQzMjQ3OSAgMjA0Ni4wNjQgLT4gMi4zMjU4MjlFKzMxOSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDI1IHBvd2VyIDUuNjEwNTE2ICAxMzYuNDU2MyAtPiAxLjYwNzUwMkUrMTAyIEluZXhhY3QgUm91bmRlZAorcG93eDMwMjYgcG93ZXIgMC4wMDUwNjk3IDEzNy40NTEzIC0+IDMuNTIyMzE1RS0zMTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAyNyBwb3dlciA1LjY3ODczNyAgODUuMTYyNTMgLT4gMS43MTM5MDlFKzY0ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDI4IHBvd2VyIDAuMDgxNjE2NyAyMzYuMTk3MyAtPiA5LjIyODgwMkUtMjU4IEluZXhhY3QgUm91bmRlZAorcG93eDMwMjkgcG93ZXIgMC4yNjAyODA1IDU2Mi4wMTU3IC0+IDIuOTQ0NTU2RS0zMjkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAzMCBwb3dlciAwLjAwODA5MzYgMjQuMjUzNjcgLT4gMS44Mzk3NTVFLTUxICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDMxIHBvd2VyIDQuMDkyMDE2ICA4Mi45NDYwMyAtPiA1LjcyNDk0OEUrNTAgIEluZXhhY3QgUm91bmRlZAorcG93eDMwMzIgcG93ZXIgMC4wMDc4MjU1IDcuMjA0MTg0IC0+IDYuNjc1MzQyRS0xNiAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAzMyBwb3dlciAwLjk5MTc2OTMgMjk4NDYuNDQgLT4gNy40MzAxNzdFLTEwOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDM0IHBvd2VyIDEuNjEwMzgwICAzMDEuMjQ2NyAtPiAyLjE3MDE0MkUrNjIgIEluZXhhY3QgUm91bmRlZAorcG93eDMwMzUgcG93ZXIgMC4wNTg4MjM2IDIxMi4xMDk3IC0+IDEuMDIzMTk2RS0yNjEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAzNiBwb3dlciAyLjQ5ODA2OSAgNTMxLjQ2NDcgLT4gMi4wNTQ1NjFFKzIxMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDM3IHBvd2VyIDkuOTY0MzQyICAzMjYuNTQzOCAtPiAxLjA4OTQ1MkUrMzI2IEluZXhhY3QgUm91bmRlZAorcG93eDMwMzggcG93ZXIgMC4wODIwNjI2IDI2OC44NzE4IC0+IDEuMTA3MzUwRS0yOTIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAzOSBwb3dlciA2LjE3NjQ4NiAgMzYwLjc3NzkgLT4gMS45MTQ0NDlFKzI4NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDQwIHBvd2VyIDQuMjA2MzYzICAxNi4xNzI4OCAtPiAxLjIzMTMxNEUrMTAgIEluZXhhY3QgUm91bmRlZAorCistLSBQPTM0LCB3aXRoaW4gMC05OTkgLS0gbmVnYXRpdmUgYXJnMgorUHJlY2lzaW9uOiAzNAorcG93eDM3MDEgcG93ZXIgMzc2LjA5MTUyNzAwMDAxMDk0ODY2MzM0MDI4MjcwMDc5MDIgIC0zNS42OTgyMjM0OTkwNDEwMjEzMTY0OTI0MzcwMTk1ODQ2MyAtPiAxLjE2NTcyMjgzMTIyNTUwNjQ1NzgyODY1MzQxMzIwMDE0M0UtOTIgIEluZXhhY3QgUm91bmRlZAorcG93eDM3MDIgcG93ZXIgMC4wMDAwMDAwNTAzNzQ3NDQwMDc0NjEzMTkxNjY1ODQ1MzE0IC05LjUyMDMwODM0MTQ5Nzk3OTA5MzAyMTgxMzU3MTQ1MDU3NSAtPiAzLjAwMDQzMjQ3ODg2MTg4Mzk1Mzk3Nzk3MTIyNjc3MDQxMEUrNjkgIEluZXhhY3QgUm91bmRlZAorcG93eDM3MDMgcG93ZXIgMjkwLjY4NTg3MzE0OTUzMzk3NzgzMzc5NTM0MDc5MzgzMDggIC0xMTguNTQ1OTA0ODU5Nzc4OTY5MzI5MjQ1NTY3MzQyODM2NyAtPiA5LjM1Nzk2OTA0NzExMzk4OTIzODM5MjUyNzU2NTIwMDMwMkUtMjkzIEluZXhhY3QgUm91bmRlZAorcG93eDM3MDQgcG93ZXIgNC41OTg4NjQ2MDc2MjAwNTIwNjI5MDg3MDA5Mjg0NTQxODIgIC0yOTkuODMyMzY2NzY5ODkzMTEyNTcyMDIxODUzNzQ4Mzc1MyAtPiAyLjA2OTY0MTI2OTg1NTQxMzUzOTU3OTEyODExNDQ0ODQ3OEUtMTk5IEluZXhhY3QgUm91bmRlZAorcG93eDM3MDUgcG93ZXIgMi41NTY5NTI2NzY5ODY4MzA2NDU3MDgzNDkyNTQ5Mzg5MDMgIC00MjUuMTc1NTM3MzI1MTk0MTM4MzE0Nzk5ODkyNDcwMzU5MyAtPiA0LjQyODc5OTc3NzgzMzU5ODY1NDI2MDg4Mzg2MTUxNDYzOEUtMTc0IEluZXhhY3QgUm91bmRlZAorcG93eDM3MDYgcG93ZXIgMC4wMDAwMDA1NjU2MTk4NzYzNDA0MjIxOTg2NjQwNjEwMTE4IC0zMi44MzM2MTM4MDY3ODMwMTMyMTIzMDAyODczMDA3NTMxNSAtPiAxLjM0MDI3MDYyMjQwMTgyOTE0NTk2ODQ3NzYwMTAyOTI1MUUrMjA1IEluZXhhY3QgUm91bmRlZAorcG93eDM3MDcgcG93ZXIgMDEyLjQ4NDE5Nzg2NDI0NTI5NjA3NTA4MDE0MTAzNzIxMjUgIC0yMTQuMzczNDI5MTgyODcxMjk2MjgwOTg2NjY2MzMyMTkyMSAtPiA5LjMxOTg1Nzc1MTE3MDYwMzE0MDQ1OTA1NzUzNTk3MTIwMkUtMjM2IEluZXhhY3QgUm91bmRlZAorcG93eDM3MDggcG93ZXIgMC4wMDAwMDAwMDU2MDQxNTg2MTQ4MDY2OTE5MTc0MzE1NTUxIC0zNy4yMTEyOTA0OTIxMzg1ODM0MTUyODAzMzM0MzExNjUzMyAtPiAxLjExODM0NTAxMDY1MjQ1NDMxMzE4NjcwMjM0MTg3MzE2OUUrMzA3IEluZXhhY3QgUm91bmRlZAorcG93eDM3MDkgcG93ZXIgMC4wNjk0NTY5MjE4OTQxODMzNzY3MTk5OTk4ODA0MjAyMTUyIC04LjY5NzUwOTA3MjM2ODk3MzkzMjUwMTIzOTgxNTY3NzczMiAtPiAxMTg2Mjg2Njk5NS41MTAyNjQ4OTAzMjgzODE3NDI5MDI3MSAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDM3MTAgcG93ZXIgNi4zODA5ODQwMjQyNTk0NTAzOTg3MjkyNDM1MjIzNTQxNDQgIC00NTEuMDYzNTY5Njg4OTE5MzU2MTQ1Nzk4NTQ4NjM2NjgyNyAtPiA4LjgwMDM1MzEwOTM4NzMyMjQ3NDgwOTMyNTY3MDMxNDMzMEUtMzY0IEluZXhhY3QgUm91bmRlZAorcG93eDM3MTEgcG93ZXIgNzg2LjAyNjQ4NDA3NTY4MDkwNDgyODgwMDcyMDQ5MTc4MDEgIC00My4wOTkzNTM4NDY3ODc2Mjc3MzA1NzM0MjE2MTcxODU0MCAtPiAxLjYxNjMyNDE4MzM2NTY0NDEzMzk3OTU4NTQxOTkyNTkzNEUtMTI1IEluZXhhY3QgUm91bmRlZAorcG93eDM3MTIgcG93ZXIgOTYuMDc4MzY0MjcxMTMyMDQ3NDQxMDEyODc5NDg0NDUxMzAgIC0xODUuMTQxNDU3MjU0NjMzMDAyNDM4ODkxNDcyMDI3MTg3NiAtPiA4LjU4NjMyMDgxNTIxODM4MzAwNDAyMzI2NDk4MDAxODYxMEUtMzY4IEluZXhhY3QgUm91bmRlZAorcG93eDM3MTMgcG93ZXIgMC4wMDAwMDAwMDAyMzMyMTg5Nzk2ODU1ODcwNjU5NzkyNDA2IC01Ljc3OTU2MTYxMzE2NDYyODA3Njg4MDYwOTg5Mzc1MzMyNyAtPiA0LjY3ODQ1MDc3NTg3NjM4NTc5MzYxODU3MDQ4MzM0NTA2NkUrNTUgIEluZXhhY3QgUm91bmRlZAorcG93eDM3MTQgcG93ZXIgMC43MjU0MTQ2NjcyMDI0NjAyMjQyMzY5OTQzMjM3OTY4ODU3IC0yMTE1LjUxMjg5MTM5NzgyODYxNTcxMDEzMDA5MjI0NTY5MSAtPiA4LjUzOTA4MDk1ODA0MTY4OTI4ODIwMjExMTQwMzEwMjQ5NUUrMjk0IEluZXhhY3QgUm91bmRlZAorcG93eDM3MTUgcG93ZXIgMC4wMDE3MzgwNTQzNjQ5NzAyODY0Nzk2MTQ0MDA4NTkyMTM3IC02LjMwNzY2ODAxNzc2MTAyMjc4ODIyMDU3ODYzMzUzODcxMyAtPiAyNTYzMDkxNDE0NTkwNzU2NTEuMjI3NTc5ODAxNzY5NTAxNyAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDM3MTYgcG93ZXIgMDUuMjk0OTg3NTg5NTIyNzY5MDgyNjc2NDkxMTYxNDIzNzkgIC0yODcuMzIzMzg5NjczNDEwMzQ0Mjk5MTk4MTA1NjEzNDE2NyAtPiAxLjAzOTEzMDAyNzg0NzQ4OTM2NDAwOTM2ODYwODEwNDI5MUUtMjA4IEluZXhhY3QgUm91bmRlZAorcG93eDM3MTcgcG93ZXIgMTUuNjQ0MDM1OTM4NjU5MzI2MjIwMDM0NjI3NzkxMDQxNzggIC0xMTAuNTI5NjYzMzM1ODA2MzI2NzQ3ODYwOTAzMjAwMjQ3NSAtPiA5Ljc1MDU0MDI3NjAyNjUyNDUyNzM3NTEyNTk4MDI5NjE0MkUtMTMzIEluZXhhY3QgUm91bmRlZAorcG93eDM3MTggcG93ZXIgODkuNjk2MzkwMDY3NjE1NzEwODc2MzQ5NDUwNzczNzM1MDggIC0xODEuMzIwOTkxNDEzOTM1NzY2NTYwOTI2ODMzOTQyMjYyNyAtPiA4LjMzNTAzNDIzMjI3Nzc2MjkyNDUzOTM5NTYzMjAyNTI4MUUtMzU1IEluZXhhY3QgUm91bmRlZAorcG93eDM3MTkgcG93ZXIgNi45NzQwODc0ODM3MzEwMDYzNTk5MTQ5MTQxMTAxMzUwNTggIC0xNzQuNjgxNTYyNTc0NjcxMDM0NTE3MzYxNTUwODE3OTg0MiAtPiA0LjU1MzA3MjI2NTEyMjAxMTE3NjY0MTU5MDEwOTU2ODAzMUUtMTQ4IEluZXhhY3QgUm91bmRlZAorcG93eDM3MjAgcG93ZXIgMC4wMDM0MzkzMDI0MDEwNTU0ODIxMTMwNTUzNzcyNjgxOTkzIC05My42MDkzMTU5ODQxMzkxOTI3MjU5NTQ5NzEwMDQ5NzM2NCAtPiA0LjA2NzQ2ODg1NTgxNzE0NTUzOTU4OTk4ODM0OTQ0OTM5NEUrMjMwIEluZXhhY3QgUm91bmRlZAorcG93eDM3MjEgcG93ZXIgNjMuMzI4MzQwNzIzMDAzNzkxNTUwNTM3MzcyNjA5NjU2MzMgIC0xNjguMzkyNjc5OTQzNTA4ODMyNDgyNTc1MTQ0Njk1NzYxNiAtPiA0LjIwNzkwNzgzNTQ2MjY0MDQ3MTYxNzUxOTUwMTc0MTA5NEUtMzA0IEluZXhhY3QgUm91bmRlZAorcG93eDM3MjIgcG93ZXIgMDAuMDAyMTYwODgxNzQyMDYyNzYzNjkwMTEyNTU5MDc3ODUgIC03MC4xMjI3OTU2Mjg1NTQ0Mjc4NDc1Nzg3NDUwODk5MTAxMyAtPiA4LjAwMDY1NzE0MzM3ODE4NzAyOTYwOTM0MzQzNTA2NzA1N0UrMTg2IEluZXhhY3QgUm91bmRlZAorcG93eDM3MjMgcG93ZXIgOTM0LjU5NTc5ODI3MDM1NDU4OTM1NzIxMzQzOTMwMDQzNzUgIC0xMDIuMjI4NzczNTU2NTg3ODI1MjQ4NDAzMTQyNjAyNjcyNiAtPiAyLjA3MzgxMzc2OTIwOTI1NzYxNzI0NjU0NDQyNDgyNzI0MEUtMzA0IEluZXhhY3QgUm91bmRlZAorcG93eDM3MjQgcG93ZXIgMTA3LjkxMTY3OTI1NTg3OTM5MjE4NzM5OTU4ODU0NDExNzcgIC00NC4xMTk0MTA5MjI2MDg2OTc4NjMxMzgzODE4MTQ5OTE1OCAtPiAyLjAwNTQ3NjUzMzYzMTE4MzI2ODkxMjU1MjE2ODc1OTU5NUUtOTAgIEluZXhhY3QgUm91bmRlZAorcG93eDM3MjUgcG93ZXIgMC4wMDAwMDAwMDAwMTg4MDQ5ODI3MzgxNDI4MTkxNzY5MjYyIC0xOS4zMjExODkxNzE5MjI0MjAyNzk2Njg0NzUwMTcyNDA3MyAtPiAxLjcxMzE3NDI5NzEwMDkxODg1NzA1MzMzODI4NjM4OTAzNEUrMjA3IEluZXhhY3QgUm91bmRlZAorcG93eDM3MjYgcG93ZXIgNjE0Ljk4MjA5MDczNjYyNDgxNDIxNjY2MzYyNTkwMjc3MjggIC00LjA2OTkxMzI1NzAzMDc5MTU4NjY0NTI1MDAzNTY5ODEyMyAtPiA0LjQ2MjQzMjU3MjU3NjkzNTc1MjcxMzg3NjI5Mzc0NjcxN0UtMTIgIEluZXhhY3QgUm91bmRlZAorcG93eDM3MjcgcG93ZXIgNzUyLjA2NTUxNzU3NjkxODIwOTYxNjU2NTEyNzQwNDk0MjIgIC0yMi41OTI5MjA2MDM0ODc5NzQ3MjAxMzU5ODM3ODMzNDM3MCAtPiAxLjAzOTg4MTUyNjY5NDYzNTIwNTA0MDE5MjUzMTUwNDEzMUUtNjUgIEluZXhhY3QgUm91bmRlZAorcG93eDM3MjggcG93ZXIgNzIuMjA0NDY2MzIwNDc2NTk0NDk2MTYxNzU0NTYwNTkwMTMgIC0xNzUuNDcwNTM1NjQwMTg1MzkyNDAyMDg0MjM1NjYwNTA3MiAtPiA3LjUyOTU0MDE3NTc5MTU4MjQyMTk2Njk0NzgxNDU0OTAyOEUtMzI3IEluZXhhY3QgUm91bmRlZAorcG93eDM3MjkgcG93ZXIgNTE4LjgzNDY0ODY2MDA0MDM0MDU3NjQwNTU4NDc5Mzc0MTYgIC02NS44NzMyMDI2ODU5Mjc2MTU4ODc1Njk2MzIxNTU4ODIzMiAtPiAxLjQyMDE4OTQyNjk5MjE3MDkzNjk1ODg5MTE4MDA3MzE1MUUtMTc5IEluZXhhY3QgUm91bmRlZAorcG93eDM3MzAgcG93ZXIgMy40NTcxNjQzNzIwMDM5NjA1NzY0NTM0NTg1MDIyNzA3MTYgIC00NDAuMzIwMTExODE3Nzg2MTI3MzgxNDUyOTcxMzQ0MzY5OCAtPiA2LjE3NjQxODU5NTc1MTIwMTI4NzE4NjI5MjY2NDI1NzM2OUUtMjM4IEluZXhhY3QgUm91bmRlZAorcG93eDM3MzEgcG93ZXIgNy45MDgzNTI3OTMzNDQxODk3MjA3Mzk0Njc2NzU1MDM5OTEgIC0yOTguNjY0NjExMjg5NDcxOTY4MDM5NDE1MjY2NDc0MDI1NSAtPiA1LjkzNTg1NzEyMDIyOTE0NzYzODEwNDY3NTA1NzY5NTEyNUUtMjY5IEluZXhhY3QgUm91bmRlZAorcG93eDM3MzIgcG93ZXIgMC4wMDAwMDA0Mjk3Mzk5NDAzNzg4NTk1MDI3OTI2MDc1MDg2IC0yMi42NjUwNDYxNzE4NTA3MTI5MzU4ODgxNzUwMTQ2ODMzOSAtPiAyLjAxMjI3MDQwNTUyMDYwMDgyMDQ2OTY2NTE0NTYzNjIwNEUrMTQ0IEluZXhhY3QgUm91bmRlZAorcG93eDM3MzMgcG93ZXIgMC4wMDAwMDA4NTkyMTI0MDk3MzIyOTY2MzU0ODY4NzE2NDQzIC05LjkxMzEwOTU4NjU1ODAzMDIwNDc4OTUyMDE5MDE4MDkwNiAtPiAxLjM1NDk1ODc2Mzg0MzMxMDIzNzA0NjgxODgzMjc1NTIxNUUrNjAgIEluZXhhY3QgUm91bmRlZAorcG93eDM3MzQgcG93ZXIgMTYxLjQ4MDYwODA1NjEyNTgxMDU4ODA5MDc0NzA5ODk5MjUgIC03MC43MjkwNzgzNzQzNDgxNDI2MTcxNjMxMTk5MDI3MTU3OCAtPiA2LjYzMjU1NTAwMzY5ODk0NTU0NDk0MTMyOTg3MjkwMTkyOUUtMTU3IEluZXhhY3QgUm91bmRlZAorcG93eDM3MzUgcG93ZXIgMC4wMDAwMDAwMDkwNjY5NTY4NjI0MTczODMyNzA1NjMxOTE4IC0zNi41Mzc1OTYyNDYxMzY2NTk0MDEyNzA1ODQzOTEwNjY0MCAtPiA3LjE2MTgwODQwMTAyMzQxNDczNTQyODEzMDExMjk0MTU1OUUrMjkzIEluZXhhY3QgUm91bmRlZAorcG93eDM3MzYgcG93ZXIgMC4wMDAwMDAwMDAwMDI5NDQwMjk1OTc4MzY1NzA5MzQyNzUyIC0xLjI5NzM1NDIzODczODkyMTk4ODg4NDQyMTExNzczMTU2MiAtPiA5MTE3MzEwNjA1NzkyOTEuNzY2MTI2NzM1ODg3MjkxNzM4MCAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDM3MzcgcG93ZXIgMjEuMzc0NzcyMjAxNDQ4MzIxNzIxNzU0NjA0MjUxNDM2OTIgIC03Ni45NTk0OTkzMzY0MDUzOTIyNjQ3NTY4Njk5NzQ3Nzg4OSAtPiA0LjQ4MTc0MTI0MjQxODA5MTkxNDAxMTk2MjM5OTkxMjg4NUUtMTAzIEluZXhhY3QgUm91bmRlZAorcG93eDM3MzggcG93ZXIgMC4wMDAwMDAwMDAwMTg2NjU3Nzk4MjAxNjM2MzQyMTUwOTAzIC0yMC4xODI5NjI0MDM1MDY3ODI0NTU2NzA0OTE2MTczMDkwOSAtPiAzLjQ4Mzk1NDAwNzExNDkwMDQwNjkwNjMzODUyNjU3NTY3MkUrMjE2IEluZXhhY3QgUm91bmRlZAorcG93eDM3MzkgcG93ZXIgMC4wMDA2NTIyNDY0NzkyOTYwMTkxOTg1OTk2OTU5MTI2NzkyIC04MC4wMzc2MjQ5MTQ4MzUxNDY3OTg4NjUwNDA5OTE5NDQxNCAtPiA5LjI2NjU0ODUxMzYxNDIxNTU1NzIyODQ2NzUxNzA1MzAzNUUrMjU0IEluZXhhY3QgUm91bmRlZAorcG93eDM3NDAgcG93ZXIgMC4wMDAwMDAwMDMyODUxMzQzNjk0MjAwNTY4OTY2MTY4MDU1IC0yMS41MzQ2MjExNjkyNjM3NTUxMjI0MjQwMzE2MDAwODAyNiAtPiA0Ljg3MzIwMTY3OTY2ODQ1NTI0MDg2MTM3NjIxMzYwMTE4OUUrMTgyIEluZXhhY3QgUm91bmRlZAorCistLSBQPTE2LCB3aXRoaW4gMC05OSAtLSBuZWdhdGl2ZSBhcmcyCitQcmVjaXNpb246IDE2Citwb3d4MzYwMSBwb3dlciAwLjAwMDAxNTEzMzg3NDg0NzQgLTQwLjg0NjU1NjE4MzY0Njg4IC0+IDcuNjI4NDcwODI0MTM3NzU1RSsxOTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYwMiBwb3dlciAwLjE1NDI3NzE4NDg2NTQ4NjIgLTQzNS44ODMwMDA5NDY2ODAwIC0+IDYuMzg5ODE3MTc3ODAwNzQ0RSszNTMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYwMyBwb3dlciA0OC4yODQ3Nzc0OTM2NzM2NCAgLTIxOC41OTI5MjA5OTAyMDUwIC0+IDguNTMxMDQ5NTMyNTc2MTU0RS0zNjkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYwNCBwb3dlciA3Ljk2MDc3NTg5MTU4NDkxMSAgLTEyLjc4MTEzNzMyMTgyNTA1IC0+IDMuMDUzMjcwODg5NzY5NDg4RS0xMiAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYwNSBwb3dlciAwLjk0MzAzNDA2NTE4NjMwNTggLTkwMTAuNDcwMDU2OTEzNzQ4IC0+IDMuMzEzMzc0NjU0OTIzODA3RSsyMjkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYwNiBwb3dlciAwLjAwMDAyMDI2NjE1MDE2MDIgLTY1LjU3OTE1MjA3MzgzMzA2IC0+IDUuOTk3Mzc5MTc2NTM2NDY0RSszMDcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYwNyBwb3dlciAwNC4zMzAwNzQ0MDc5ODM5MCAgLTIzMi4wNDc2ODM0NjY2NTg4IC0+IDIuMDA3ODI3MTgzMDEwNDU2RS0xNDggSW5leGFjdCBSb3VuZGVkCitwb3d4MzYwOCBwb3dlciAwLjAwMDAxNDE5NDQ2NDM5MTQgLTExLjMyNDA3OTIxOTU4NzE3IC0+IDcuOTAyOTM0NDg1MDc0ODQ2RSs1NCAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYwOSBwb3dlciAwLjAwMDAwMjE5Nzc3NTgyNjEgLTUzLjUzNzA2MTM4MjUzMzA3IC0+IDguMTk1NjMxNzcyMzE3ODE1RSszMDIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYxMCBwb3dlciAzOS41MTI5NzY1NTQ3NDE4OCAgLTE5LjQwMzcwOTc2MDEyMzI2IC0+IDEuMDQwNjk5NjA4MDcyNjU5RS0zMSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYxMSBwb3dlciAzOC43MTIxMDIzMjQ4ODc3NSAgLTY2LjU4MzQxNjE4MjI3OTIxIC0+IDEuODg2ODU1MDY2MTQ2NDk1RS0xMDYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYxMiBwb3dlciAwLjAwMDA4MDQyMzUyMjkwNjIgLTYuNzE1MjA3OTQ4OTkyODU5IC0+IDMuMTM0NzU3ODY0Mzg5MzMzRSsyNyAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYxMyBwb3dlciAwLjAwMDAwNzM1NDcwOTIzOTkgLTExLjI3NzI1Njg1NzE5OTM0IC0+IDcuNzgxNDI4MzkwOTUzNjk1RSs1NyAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYxNCBwb3dlciA1Mi43MjE4MTI3MjU5OTMxNiAgLTE4Ni4xNDIyMzExNjA3NDM1IC0+IDIuOTE2NjAxOTk4NzQ0MTc3RS0zMjEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYxNSBwb3dlciAwLjA5Njk1MTk5NjMwODMzMDYgLTI4MC44MjIwODYyMTUxMzY5IC0+IDMuOTU1OTA2ODg1OTcwOTg3RSsyODQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYxNiBwb3dlciA5NC4wNzI2MzMwMjE1MDA4MSAgLTE0OC4yMDMxMTQ2MDcxMjMwIC0+IDMuMzYxOTU4OTkwNzUyNDkwRS0yOTMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYxNyBwb3dlciA4NS44MDI4Njk2NTA1MzcwNCAgLTkwLjIxNDUzNjk1ODEzNzU5IC0+IDMuNzE1NjAyNDI5NjQ1Nzk4RS0xNzUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYxOCBwb3dlciAwMy41MjY5OTg1ODE1MjI1OSAgLTQ5Mi4wNDE0MzYyNTM5MTk2IC0+IDQuNTA3MzA5MjIwMDgxMDkyRS0yNzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYxOSBwb3dlciAwLjA1MDgyNzgwODYzOTYwNjggLTE4MS4wODcxNzMxNTcyMTY3IC0+IDIuMDM0NDI4MDEzMDE3OTQ5RSsyMzQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYyMCBwb3dlciAwLjM5NTU3Njc0MDMwMzE3MiAgLTkxNS41NTI0NTA3NDMyMzkyIC0+IDUuNzA2NTg1MTg3NDM3NTc4RSszNjggSW5leGFjdCBSb3VuZGVkCitwb3d4MzYyMSBwb3dlciAzOC4wNjEwNTgyNjc4OTIwMiAgLTQ5Ljc1OTEzNzUzNDM1MzM1IC0+IDIuMjczMTg4OTkxNDMxNzM4RS03OSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYyMiBwb3dlciAwLjAwMDM2NTY3NDg5MTA2NDYgLTczLjI4OTg4NDkxMzEwMzU0IC0+IDcuNzY4OTM2OTQwNTY4NzYzRSsyNTEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYyMyBwb3dlciAwLjAwMDAwMDYzNzM1NTE4MDkgLTUxLjMwODI1MjM0MjAwNjkwIC0+IDcuNjk3NjE4MTY3NzAxOTg1RSszMTcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYyNCBwb3dlciA4Mi40MTcyOTkyMDY3Mzg1NiAgLTM1LjczMzE5NjMxNjI1Njk5IC0+IDMuNDI0MDQyMzU0NTg1NTI5RS02OSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYyNSBwb3dlciAwLjc4NDU4MjE0NTMxMjc2NzAgLTk3MS40OTgyMDI4ODk3NjYzIC0+IDIuMjgzNDE1NTI3NjYxMDg5RSsxMDIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYyNiBwb3dlciA0Ljg0MDk4MzY3MzQzMzQ5NyAgLTE4Mi4zNzMwNDUyMzcwNTE1IC0+IDEuMjIwNTkxNDA3OTI3NzcwRS0xMjUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYyNyBwb3dlciAwLjAwMDAwMDYxMzc1OTIxMzkgLTIuMTIyMTM5NDc0NDMxNDg0IC0+IDE1MjMxMjE3MDM0ODM5LjI5ICAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYyOCBwb3dlciAwLjAwMDM2NTc5NjI4NjI5ODQgLTM1Ljk3OTkzNzgyNDQ4MDk5IC0+IDQuNTEyNzAxMzE5MjUwODM5RSsxMjMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYyOSBwb3dlciA0MC45MzY5MzAwNDQ0MzE1MCAgLTE2NS4xMzYyNDA4NzkyOTk3IC0+IDYuMDQ0Mjc2NDExMDU3MjM5RS0yNjcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYzMCBwb3dlciAwLjI5NDE1NTI1ODMwMjg4OTggLTE3LjQxMDQ2MjY0OTQ1ODkyIC0+IDE3ODc4MzMxMDMuNTAzMzQ2ICAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYzMSBwb3dlciA2My45OTMzNTEzNTM2OTk3NyAgLTY5LjkyNDE3MjA1MTY4NTc5IC0+IDUuMDk5MzU5ODA0ODcyNTA5RS0xMjcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYzMiBwb3dlciAwLjAwMDA2NTc5MjQ0NjczODggLTg5LjE0NDk3MjkzNTg4MzEzIC0+IDYuMTQ1ODc4MjY2Njg4NTIxRSszNzIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYzMyBwb3dlciAxMS4zNTA3MTI1MDMzOTE0NyAgLTMyMy4zNzA1ODY1NjE0NTQyIC0+IDYuODYzNjI2MjQ4NzY2Nzc1RS0zNDIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYzNCBwb3dlciAyMy44ODAyNDcxODQ3MDg5NSAgLTI3Ny43MTE3NTEzMzI5NTEwIC0+IDIuMDA2NDQxNDIyNjEyODE1RS0zODMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYzNSBwb3dlciAwLjAwMDAwMDkxMTE5Mzk5MTQgLTU4LjUxNzgyOTQ2OTI5MTgyIC0+IDIuOTU0MzUyODgzOTk2NzczRSszNTMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYzNiBwb3dlciAwLjAwMDA4NzgxNzkwNDg3ODIgLTc1LjgxMDYwNDIwMjM4NjY5IC0+IDMuMzA2ODc4NDU1MjA3NTg1RSszMDcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYzNyBwb3dlciAwNy4zOTE5MDU2NDI3Mzc3OSAgLTI4Ny41MDQ3MzA3MjQ0NjM2IC0+IDEuNjkyMDgwMzU0NjU5ODA1RS0yNTAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYzOCBwb3dlciAwLjAwMDAyOTgzMTA4MTk3OTkgLTEuODQ0NzQwMzc3NzU5MzU1IC0+IDIyMjg3NDcxOC43MjM4ODg4ICAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYzOSBwb3dlciAwLjAwMDAwMDY0MTI5MjkzODQgLTI4LjI0ODUwMDc4MjI5MjkwIC0+IDguNzM3MTY0MjMwNjY2NTI5RSsxNzQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzY0MCBwb3dlciAwLjAwMDAwMTAyMDI5NjU5OTggLTQ3LjE3NTczNzAxOTU2NDk4IC0+IDQuMzkyODQ1MzA2MDQ5MzQxRSsyODIgSW5leGFjdCBSb3VuZGVkCisKKy0tIFA9Nywgd2l0aGluIDAtOSAtLSBuZWdhdGl2ZSBhcmcyCitQcmVjaXNpb246IDcKK3Bvd3gzNTAxIHBvd2VyIDAuMzI2MzI0ICAtNzEuOTY1MDkgIC0+IDEuMDAwNjczRSszNSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUwMiBwb3dlciAwLjAwMTc2MzUgLTAuNzE4Njk2NyAtPiA5NS4yODQxOSAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDM1MDMgcG93ZXIgOC41NjQxNTUgIC0yNTMuMDg5OSAgLT4gOC44NTA1MTJFLTIzNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTA0IHBvd2VyIDguOTg3MjcyICAtMi4xNTU3ODkgIC0+IDAuMDA4NzkzODU5ICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUwNSBwb3dlciA5LjYwNDg1NiAgLTEzOS45NjMwICAtPiAzLjA3MzQ5MkUtMTM4IEluZXhhY3QgUm91bmRlZAorcG93eDM1MDYgcG93ZXIgMC44NDcyOTE5IC0yNTM5LjA4NSAgLT4gNS4zNzI2ODZFKzE4MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTA3IHBvd2VyIDUuMzEyMzI5ICAtNjAuMzI5NjUgIC0+IDEuNzUzMTIxRS00NCAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUwOCBwb3dlciAwLjAzMzgyOTQgLTEwMC41NDQwICAtPiA3LjQyMzkzOUUrMTQ3IEluZXhhY3QgUm91bmRlZAorcG93eDM1MDkgcG93ZXIgMC4wMDE3Nzc3IC0xMzAuODU4MyAgLT4gNy41NjU2MjlFKzM1OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTEwIHBvd2VyIDguMDE2MTU0ICAtNDA1LjU2ODkgIC0+IDIuMzk1OTc3RS0zNjcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUxMSBwb3dlciA1LjAxNjU3MCAgLTMyNy44OTA2ICAtPiAyLjIwMzc4NEUtMjMwIEluZXhhY3QgUm91bmRlZAorcG93eDM1MTIgcG93ZXIgMC44MTYxNzQzIC03NDQuNTI3NiAgLT4gNC43ODY4OTlFKzY1ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTEzIHBvd2VyIDAuMDY2NjM0MyAtMTY0LjczMjAgIC0+IDUuOTUxMjQwRSsxOTMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUxNCBwb3dlciAwLjA4MDM5NjYgLTIwMi4yNjY2ICAtPiAyLjcxNTUxMkUrMjIxIEluZXhhY3QgUm91bmRlZAorcG93eDM1MTUgcG93ZXIgMC4wMDE0NzUyIC0xMi41NTU0NyAgLT4gMy41MTg5MDVFKzM1ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTE2IHBvd2VyIDkuNzM3NTY1ICAtMTQuNjk2MTUgIC0+IDIuOTc1NjcyRS0xNSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUxNyBwb3dlciAwLjY2MzQxNzIgLTE1Mi43MzA4ICAtPiAxLjY1NDQ1OEUrMjcgIEluZXhhY3QgUm91bmRlZAorcG93eDM1MTggcG93ZXIgMC4wMDA5MzM3IC0zMy4zMjkzOSAgLT4gOS41NzUwMzlFKzEwMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTE5IHBvd2VyIDguNjc5OTIyICAtMjI0LjQxOTQgIC0+IDIuMzkyNDQ2RS0yMTEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUyMCBwb3dlciA3LjM5MDQ5NCAgLTE2MS45NDgzICAtPiAyLjA4ODM3NUUtMTQxIEluZXhhY3QgUm91bmRlZAorcG93eDM1MjEgcG93ZXIgMC40NjMxNDg5IC00MTcuMTY3MyAgLT4gMi44MjExMDZFKzEzOSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTIyIHBvd2VyIDAuMDA5NTQ3MSAtNy42Nzc0NTggIC0+IDMuMjMxODU1RSsxNSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUyMyBwb3dlciA2LjU2NjMzOSAgLTE3Ni4xODY3ICAtPiA5Ljk2NTYzM0UtMTQ1IEluZXhhY3QgUm91bmRlZAorcG93eDM1MjQgcG93ZXIgMi42OTYxMjggIC0yNi4xNTUwMSAgLT4gNS40MTk3MzFFLTEyICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTI1IHBvd2VyIDAuNDQ2NDM2NiAtODUyLjE4OTMgIC0+IDIuOTU3NzI1RSsyOTggSW5leGFjdCBSb3VuZGVkCitwb3d4MzUyNiBwb3dlciAwLjQ3NzIwMDYgLTkyMS40MTExICAtPiAxLjExODEwNUUrMjk2IEluZXhhY3QgUm91bmRlZAorcG93eDM1MjcgcG93ZXIgOC45MjM2OTYgIC0zNTkuMjIxMSAgLT4gMy41MDE1NzNFLTM0MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTI4IHBvd2VyIDAuMDAxODAwOCAtNjYuOTEyNTIgIC0+IDQuNDAyNzE4RSsxODMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUyOSBwb3dlciAwLjA4MTE5NjQgLTkyLjgzMjc4ICAtPiAxLjcwMTExMUUrMTAxIEluZXhhY3QgUm91bmRlZAorcG93eDM1MzAgcG93ZXIgMC4wNzExMjE5IC01OC45NDM0NyAgLT4gNC42NDQxNDhFKzY3ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTMxIHBvd2VyIDcuOTU4MTIxICAtNTAuNjYxMjMgIC0+IDIuMzExMTYxRS00NiAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUzMiBwb3dlciA2LjEwNjQ2NiAgLTgxLjgzNjEwICAtPiA0Ljk0MzI4NUUtNjUgIEluZXhhY3QgUm91bmRlZAorcG93eDM1MzMgcG93ZXIgNC41NTc2MzQgIC0xMjkuNTI2OCAgLT4gNC43Mzc5MTdFLTg2ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTM0IHBvd2VyIDAuMDAyNzM0OCAtOS4xODAxMzUgIC0+IDMuMzgzNTI0RSsyMyAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUzNSBwb3dlciAwLjAwODM5MjQgLTQ2LjI0MDE2ICAtPiA5Ljk5NjIxMkUrOTUgIEluZXhhY3QgUm91bmRlZAorcG93eDM1MzYgcG93ZXIgMi4xMzg1MjMgIC00Ny4yNTg5NyAgLT4gMi41MDcwMDlFLTE2ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTM3IHBvd2VyIDEuNjI2NzI4ICAtMTU3My44MzAgIC0+IDIuNjY4MTE3RS0zMzMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUzOCBwb3dlciAwLjA4MjYxNSAgLTE2NC41ODQyICAtPiAxLjcxNzg4MkUrMTc4IEluZXhhY3QgUm91bmRlZAorcG93eDM1MzkgcG93ZXIgNy42MzYwMDMgIC0zNjMuNjc2MyAgLT4gOC4zNjYxNzRFLTMyMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTQwIHBvd2VyIDAuMDAyMTQ4MSAtMTM4LjAwNjUgIC0+IDEuNTYyNTA1RSszNjggSW5leGFjdCBSb3VuZGVkCisKKworLS0gSW52YWxpZCBvcGVyYXRpb25zIGR1ZSB0byByZXN0cmljdGlvbnMKKy0tIFtuZXh0IHR3byBwcm9iYWJseSBza2lwcGVkIGJ5IG1vc3QgdGVzdCBoYXJuZXNzZXNdCitwcmVjaXNpb246IDEwMDAwMDAwMAorcG93eDQwMDEgIHBvd2VyIDEgMS4xIC0+ICBOYU4gICAgICAgICBJbnZhbGlkX2NvbnRleHQKK3ByZWNpc2lvbjogIDk5OTk5OTk5Citwb3d4NDAwMiAgcG93ZXIgMSAxLjEgLT4gIE5hTiAgICAgICAgIEludmFsaWRfY29udGV4dAorCitwcmVjaXNpb246IDkKK21heEV4cG9uZW50OiAgIDEwMDAwMDAKK21pbkV4cG9uZW50OiAgIC05OTk5OTkKK3Bvd3g0MDAzICBwb3dlciAxIDEuMSAgLT4gIE5hTiAgICAgICAgSW52YWxpZF9jb250ZXh0CittYXhFeHBvbmVudDogICAgOTk5OTk5CittaW5FeHBvbmVudDogICAtOTk5OTk5Citwb3d4NDAwNCAgcG93ZXIgMSAxLjEgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorbWF4RXhwb25lbnQ6ICAgIDk5OTk5OQorbWluRXhwb25lbnQ6ICAtMTAwMDAwMAorcG93eDQwMDUgIHBvd2VyIDEgMS4xICAtPiAgTmFOICAgICAgICBJbnZhbGlkX2NvbnRleHQKK21heEV4cG9uZW50OiAgICA5OTk5OTkKK21pbkV4cG9uZW50OiAgIC05OTk5OTgKK3Bvd3g0MDA2ICBwb3dlciAxIDEuMSAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG9wZXJhbmQgcmFuZ2UgdmlvbGF0aW9ucworcG93eDQwMDcgIHBvd2VyIDEgICAgICAgICAgICAgMS4xRSs5OTk5OTkgIC0+ICAxCitwb3d4NDAwOCAgcG93ZXIgMSAgICAgICAgICAgICAxLjFFKzEwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcG93eDQwMDkgIHBvd2VyIDEuMUUrOTk5OTk5ICAgMS4xICAgICAgICAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MDEwICBwb3dlciAxLjFFKzEwMDAwMDAgIDEuMSAgICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NDAxMSAgcG93ZXIgMSAgICAgICAgICAgICAxLjFFLTE5OTk5OTcgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDAxMiAgcG93ZXIgMSAgICAgICAgICAgICAxLjFFLTE5OTk5OTggLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcG93eDQwMTMgIHBvd2VyIDEuMUUtMTk5OTk5NyAgMS4xICAgICAgICAgIC0+ICAwRS0xMDAwMDA2IFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZCBTdWJub3JtYWwKK3Bvd3g0MDE0ICBwb3dlciAxLjFFLTE5OTk5OTggIDEuMSAgICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHJvdW5kaW5nIG1vZGVzIC0tIHBvd2VyIGlzIHNlbnNpdGl2ZQorcHJlY2lzaW9uOiAgIDcKK21heEV4cG9uZW50OiA5OQorbWluRXhwb25lbnQ6IC05OQorCistLSAgIDAuNyAgKiogMy4zID0+ICAgMC4zMDgxOTM1NDA1MzQxODk0MzgyMgorLS0gICAwLjcgICoqIDMuNCA9PiAgIDAuMjk3Mzk0Nzc2MzgyNzI1MzM4NTQKKy0tICAtMS4yICAqKiAxNyAgPT4gLTIyLjE4NjExMTA2NzQwNDM2OTkyCistLSAgLTEuMyAgKiogMTcgID0+IC04Ni41MDQxNTkxOTM4MTMzNzkzMworLS0gICAwLjUgICoqIDExICA9PiAgIDAuMDAwNDg4MjgxMjUKKy0tICAgMy4xNSAqKiAzICAgPT4gIDMxLjI1NTg3NQorCityb3VuZGluZzogdXAKK3Bvd3g0MTAwICBwb3dlciAgICAgIDAuNyAgMy4zIC0+ICAwLjMwODE5MzYgSW5leGFjdCBSb3VuZGVkCitwb3d4NDEwMSAgcG93ZXIgICAgICAwLjcgIDMuNCAtPiAgMC4yOTczOTQ4IEluZXhhY3QgUm91bmRlZAorcG93eDQxMDIgIHBvd2VyICAgICAtMS4yICAxNyAgLT4gLTIyLjE4NjEyICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTAzICBwb3dlciAgICAgLTEuMyAgMTcgIC0+IC04Ni41MDQxNiAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDEwNCAgcG93ZXIgIDE3IDgxLjI3MTE1ICAtPiA5Ljk5OTk3NEUrOTkgSW5leGFjdCBSb3VuZGVkCitwb3d4NDEwNSAgcG93ZXIgIDE3IDgxLjI3MTE2ICAtPiBJbmZpbml0eSAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitwb3d4NDEyMCAgcG93ZXIgICAgICAwLjcgIDMuMyAtPiAgMC4zMDgxOTM1IEluZXhhY3QgUm91bmRlZAorcG93eDQxMjEgIHBvd2VyICAgICAgMC43ICAzLjQgLT4gIDAuMjk3Mzk0NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTIyICBwb3dlciAgICAgLTEuMiAgMTcgIC0+IC0yMi4xODYxMSAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDEyMyAgcG93ZXIgICAgIC0xLjMgIDE3ICAtPiAtODYuNTA0MTUgIEluZXhhY3QgUm91bmRlZAorcG93eDQxMjQgIHBvd2VyICAxNyA4MS4yNzExNSAgLT4gOS45OTk5NzNFKzk5IEluZXhhY3QgUm91bmRlZAorcG93eDQxMjUgIHBvd2VyICAxNyA4MS4yNzExNiAgLT4gOS45OTk5OTlFKzk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZmxvb3IKK3Bvd3g0MTQwICBwb3dlciAgICAgIDAuNyAgMy4zIC0+ICAwLjMwODE5MzUgSW5leGFjdCBSb3VuZGVkCitwb3d4NDE0MSAgcG93ZXIgICAgICAwLjcgIDMuNCAtPiAgMC4yOTczOTQ3IEluZXhhY3QgUm91bmRlZAorcG93eDQxNDIgIHBvd2VyICAgICAtMS4yICAxNyAgLT4gLTIyLjE4NjEyICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTQzICBwb3dlciAgICAgLTEuMyAgMTcgIC0+IC04Ni41MDQxNiAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDE0NCAgcG93ZXIgIDE3IDgxLjI3MTE1ICAtPiA5Ljk5OTk3M0UrOTkgSW5leGFjdCBSb3VuZGVkCitwb3d4NDE0NSAgcG93ZXIgIDE3IDgxLjI3MTE2ICAtPiA5Ljk5OTk5OUUrOTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBjZWlsaW5nCitwb3d4NDE2MCAgcG93ZXIgICAgICAwLjcgIDMuMyAtPiAgMC4zMDgxOTM2IEluZXhhY3QgUm91bmRlZAorcG93eDQxNjEgIHBvd2VyICAgICAgMC43ICAzLjQgLT4gIDAuMjk3Mzk0OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTYyICBwb3dlciAgICAgLTEuMiAgMTcgIC0+IC0yMi4xODYxMSAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDE2MyAgcG93ZXIgICAgIC0xLjMgIDE3ICAtPiAtODYuNTA0MTUgIEluZXhhY3QgUm91bmRlZAorcG93eDQxNjQgIHBvd2VyICAxNyA4MS4yNzExNSAgLT4gOS45OTk5NzRFKzk5IEluZXhhY3QgUm91bmRlZAorcG93eDQxNjUgIHBvd2VyICAxNyA4MS4yNzExNiAgLT4gSW5maW5pdHkgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorcG93eDQxODAgIHBvd2VyICAgICAgMC43ICAzLjMgLT4gIDAuMzA4MTkzNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTgxICBwb3dlciAgICAgIDAuNyAgMy40IC0+ICAwLjI5NzM5NDggSW5leGFjdCBSb3VuZGVkCitwb3d4NDE4MiAgcG93ZXIgICAgIC0xLjIgIDE3ICAtPiAtMjIuMTg2MTEgIEluZXhhY3QgUm91bmRlZAorcG93eDQxODMgIHBvd2VyICAgICAtMS4zICAxNyAgLT4gLTg2LjUwNDE2ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTg0ICBwb3dlciAgICAgIDAuNSAgMTEgIC0+ICAwLjAwMDQ4ODI4MTMgSW5leGFjdCBSb3VuZGVkCitwb3d4NDE4NSAgcG93ZXIgICAgICAzLjE1ICAzICAtPiAgMzEuMjU1ODggIEluZXhhY3QgUm91bmRlZAorcG93eDQxODYgIHBvd2VyICAxNyA4MS4yNzExNSAgLT4gOS45OTk5NzRFKzk5IEluZXhhY3QgUm91bmRlZAorcG93eDQxODcgIHBvd2VyICAxNyA4MS4yNzExNiAgLT4gSW5maW5pdHkgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCitwb3d4NDIwMCAgcG93ZXIgICAgICAwLjcgIDMuMyAtPiAgMC4zMDgxOTM1IEluZXhhY3QgUm91bmRlZAorcG93eDQyMDEgIHBvd2VyICAgICAgMC43ICAzLjQgLT4gIDAuMjk3Mzk0OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MjAyICBwb3dlciAgICAgLTEuMiAgMTcgIC0+IC0yMi4xODYxMSAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDIwMyAgcG93ZXIgICAgIC0xLjMgIDE3ICAtPiAtODYuNTA0MTYgIEluZXhhY3QgUm91bmRlZAorcG93eDQyMDQgIHBvd2VyICAgICAgMC41ICAxMSAgLT4gIDAuMDAwNDg4MjgxMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MjA1ICBwb3dlciAgICAgIDMuMTUgIDMgIC0+ICAzMS4yNTU4OCAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDIwNiAgcG93ZXIgIDE3IDgxLjI3MTE1ICAtPiA5Ljk5OTk3NEUrOTkgSW5leGFjdCBSb3VuZGVkCitwb3d4NDIwNyAgcG93ZXIgIDE3IDgxLjI3MTE2ICAtPiBJbmZpbml0eSAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK3Bvd3g0MjIwICBwb3dlciAgICAgIDAuNyAgMy4zIC0+ICAwLjMwODE5MzUgSW5leGFjdCBSb3VuZGVkCitwb3d4NDIyMSAgcG93ZXIgICAgICAwLjcgIDMuNCAtPiAgMC4yOTczOTQ4IEluZXhhY3QgUm91bmRlZAorcG93eDQyMjIgIHBvd2VyICAgICAtMS4yICAxNyAgLT4gLTIyLjE4NjExICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MjIzICBwb3dlciAgICAgLTEuMyAgMTcgIC0+IC04Ni41MDQxNiAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDIyNCAgcG93ZXIgICAgICAwLjUgIDExICAtPiAgMC4wMDA0ODgyODEyIEluZXhhY3QgUm91bmRlZAorcG93eDQyMjUgIHBvd2VyICAgICAgMy4xNSAgMyAgLT4gIDMxLjI1NTg3ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MjI2ICBwb3dlciAgICAgLTMuMTUgIDMgIC0+IC0zMS4yNTU4NyAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDIyNyAgcG93ZXIgIDE3IDgxLjI3MTE1ICAtPiA5Ljk5OTk3NEUrOTkgSW5leGFjdCBSb3VuZGVkCitwb3d4NDIyOCAgcG93ZXIgIDE3IDgxLjI3MTE2ICAtPiBJbmZpbml0eSAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKworLS0gbW9yZSByb3VuZGluZyB0ZXN0cyBhcyBwZXIgSWxhbiBOZWhhbWEncyBzdWdnZXN0aW9ucyAmIGFuYWx5c2lzCistLSB0aGVzZSBhcmUgbGlrZWx5IHRvIHNob3cgPiAwLjUgdWxwIGVycm9yIGZvciB2ZXJ5IHNtYWxsIHBvd2VycworcHJlY2lzaW9uOiAgIDcKK21heEV4cG9uZW50OiA5NgorbWluRXhwb25lbnQ6IC05NQorCistLSBGb3IgeD1uZXh0ZnAoMSk9MS4wMC4uMDAxICh3aGVyZSB0aGUgbnVtYmVyIG9mIDBzIGlzIHByZWNpc2lvbi0yKQorLS0gICBwb3dlcih4LHkpPXggd2hlbiB0aGUgcm91bmRpbmcgaXMgdXAgKGUuZy4sIHRvd2FyZF9wb3NfaW5mIG9yCistLSAgIGNlaWwpIGZvciBhbnkgeSBpbiAoMCwxXS4KK3JvdW5kaW5nOiBjZWlsaW5nCitwb3d4NDMwMSAgcG93ZXIgIDEuMDAwMDAxIDAgICAgICAgICAgLT4gMQorLS0gVGhlIG5leHQgdGVzdCBzaG91bGQgYmUgc2tpcHBlZCBmb3IgZGVjTnVtYmVyCitwb3d4NDMwMiAgcG93ZXIgIDEuMDAwMDAxIDFlLTEwMSAgICAgLT4gMS4wMDAwMDEgICBJbmV4YWN0IFJvdW5kZWQKKy0tIFRoZSBuZXh0IHRlc3Qgc2hvdWxkIGJlIHNraXBwZWQgZm9yIGRlY051bWJlcgorcG93eDQzMDMgIHBvd2VyICAxLjAwMDAwMSAxZS05NSAgICAgIC0+IDEuMDAwMDAxICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDMwNCAgcG93ZXIgIDEuMDAwMDAxIDFlLTEwICAgICAgLT4gMS4wMDAwMDEgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzA1ICBwb3dlciAgMS4wMDAwMDEgMC4xICAgICAgICAtPiAxLjAwMDAwMSAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzMDYgIHBvd2VyICAxLjAwMDAwMSAwLjEyMzQ1NjcgIC0+IDEuMDAwMDAxICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDMwNyAgcG93ZXIgIDEuMDAwMDAxIDAuNyAgICAgICAgLT4gMS4wMDAwMDEgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzA4ICBwb3dlciAgMS4wMDAwMDEgMC45OTk5OTk5ICAtPiAxLjAwMDAwMSAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzMDkgIHBvd2VyICAxLjAwMDAwMSAxLjAwMDAwMCAgIC0+IDEuMDAwMDAxCistLSAgIHBvd2VyKHgseSk9MSB3aGVuIHRoZSByb3VuZGluZyBpcyBkb3duIChlLmcuIHRvd2FyZF96ZXJvIG9yCistLSAgIGZsb29yKSBmb3IgYW55IHkgaW4gWzAsMSkuCityb3VuZGluZzogZmxvb3IKK3Bvd3g0MzIxICBwb3dlciAgMS4wMDAwMDEgMCAgICAgICAgICAtPiAxCitwb3d4NDMyMiAgcG93ZXIgIDEuMDAwMDAxIDFlLTEwMSAgICAgLT4gMS4wMDAwMDAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzIzICBwb3dlciAgMS4wMDAwMDEgMWUtOTUgICAgICAtPiAxLjAwMDAwMCAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzMjQgIHBvd2VyICAxLjAwMDAwMSAxZS0xMCAgICAgIC0+IDEuMDAwMDAwICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDMyNSAgcG93ZXIgIDEuMDAwMDAxIDAuMSAgICAgICAgLT4gMS4wMDAwMDAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzI2ICBwb3dlciAgMS4wMDAwMDEgMC4xMjM0NTY3ICAtPiAxLjAwMDAwMCAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzMjcgIHBvd2VyICAxLjAwMDAwMSAwLjcgICAgICAgIC0+IDEuMDAwMDAwICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDMyOCAgcG93ZXIgIDEuMDAwMDAxIDAuOTk5OTk5OSAgLT4gMS4wMDAwMDAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzI5ICBwb3dlciAgMS4wMDAwMDEgMS4wMDAwMDAgICAtPiAxLjAwMDAwMQorCistLSBGb3IgeD1wcmV2ZnAoMSk9MC45OS4uOTkgKHdoZXJlIHRoZSBudW1iZXIgb2YgOXMgaXMgcHJlY2lzaW9uKQorLS0gICBwb3dlcih4LHkpPXggd2hlbiB0aGUgcm91bmRpbmcgaXMgZG93biBmb3IgYW55IHkgaW4gKDAsMV0uCityb3VuZGluZzogZmxvb3IKK3Bvd3g0MzQxICBwb3dlciAgMC45OTk5OTk5IDAgICAgICAgICAgLT4gMQorLS0gVGhlIG5leHQgdGVzdCBzaG91bGQgYmUgc2tpcHBlZCBmb3IgZGVjTnVtYmVyCitwb3d4NDM0MiAgcG93ZXIgIDAuOTk5OTk5OSAxZS0xMDEgICAgIC0+IDAuOTk5OTk5OSAgIEluZXhhY3QgUm91bmRlZAorLS0gVGhlIG5leHQgdGVzdCBzaG91bGQgYmUgc2tpcHBlZCBmb3IgZGVjTnVtYmVyCitwb3d4NDM0MyAgcG93ZXIgIDAuOTk5OTk5OSAxZS05NSAgICAgIC0+IDAuOTk5OTk5OSAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzNDQgIHBvd2VyICAwLjk5OTk5OTkgMWUtMTAgICAgICAtPiAwLjk5OTk5OTkgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzQ1ICBwb3dlciAgMC45OTk5OTk5IDAuMSAgICAgICAgLT4gMC45OTk5OTk5ICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDM0NiAgcG93ZXIgIDAuOTk5OTk5OSAwLjEyMzQ1NjcgIC0+IDAuOTk5OTk5OSAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzNDcgIHBvd2VyICAwLjk5OTk5OTkgMC43ICAgICAgICAtPiAwLjk5OTk5OTkgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzQ4ICBwb3dlciAgMC45OTk5OTk5IDAuOTk5OTk5OSAgLT4gMC45OTk5OTk5ICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDM0OSAgcG93ZXIgIDAuOTk5OTk5OSAxLjAwMDAwMCAgIC0+IDAuOTk5OTk5OQorLS0gICBwb3dlcih4LHkpPTEgd2hlbiB0aGUgcm91bmRpbmcgaXMgdXAgZm9yIGFueSB5IGluICgwLDFdLgorcm91bmRpbmc6IGNlaWxpbmcKK3Bvd3g0MzYxICBwb3dlciAgMC45OTk5OTk5IDAgICAgICAgICAgLT4gMQorcG93eDQzNjIgIHBvd2VyICAwLjk5OTk5OTkgMWUtMTAxICAgICAtPiAxLjAwMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzYzICBwb3dlciAgMC45OTk5OTk5IDFlLTk1ICAgICAgLT4gMS4wMDAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDM2NCAgcG93ZXIgIDAuOTk5OTk5OSAxZS0xMCAgICAgIC0+IDEuMDAwMDAwICAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzNjUgIHBvd2VyICAwLjk5OTk5OTkgMC4xICAgICAgICAtPiAxLjAwMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzY2ICBwb3dlciAgMC45OTk5OTk5IDAuMTIzNDU2NyAgLT4gMS4wMDAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDM2NyAgcG93ZXIgIDAuOTk5OTk5OSAwLjcgICAgICAgIC0+IDEuMDAwMDAwICAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzNjggIHBvd2VyICAwLjk5OTk5OTkgMC45OTk5OTk5ICAtPiAxLjAwMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzY5ICBwb3dlciAgMC45OTk5OTk5IDEuMDAwMDAwICAgLT4gMC45OTk5OTk5CisKKy0tIEZvciB4PW5leHRmcCgwKQorLS0gICBwb3dlcih4LHkpPTAgd2hlbiB0aGUgcm91bmRpbmcgaXMgZG93biBmb3IgYW55IHkgbGFyZ2VyIHRoYW4gMS4KK3JvdW5kaW5nOiBmbG9vcgorcG93eDQzODIgIHBvd2VyICAxZS0xMDEgICAgMCAgICAgICAgICAtPiAxCitwb3d4NDM4MyAgcG93ZXIgIDFlLTEwMSAgICAwLjk5OTk5OTkgIC0+IDFFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDQzODQgIHBvd2VyICAxZS0xMDEgICAgMS4wMDAwMDAgICAtPiAxRS0xMDEgU3Vibm9ybWFsCitwb3d4NDM4NSAgcG93ZXIgIDFlLTEwMSAgICAxLjAwMDAwMSAgIC0+IDBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4NDM4NiAgcG93ZXIgIDFlLTEwMSAgICAyLjAwMDAwMCAgIC0+IDBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3Bvd2Vyc3FydC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9wb3dlcnNxcnQuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjBiOTQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9wb3dlcnNxcnQuZGVjVGVzdApAQCAtMCwwICsxLDI5NzAgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gcG93ZXJzcXJ0LmRlY1Rlc3QgLS0gZGVjaW1hbCBzcXVhcmUgcm9vdCwgdXNpbmcgcG93ZXIgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNCwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIHRha2VuIGZyb20gc3F1YXJlcm9vdC5kZWNUZXN0IGJ1dCBhcmUKKy0tIGV2YWx1YXRlZCB1c2luZyB0aGUgcG93ZXIgb3BlcmF0b3IuICBUaGUgZGlmZmVyZW5jZXMgaW4gcmVzdWx0cworLS0gKDE1MyBvdXQgb2YgMjg1NikgZmFsbCBpbnRvIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcmllczoKKy0tCistLSAgICB4ICAgICoqIDAuNSAoeD4wKSBoYXMgbm8gcHJlZmVycmVkIGV4cG9uZW50LCBhbmQgaXMgSW5leGFjdAorLS0gICAgICAgICAgICAgICAgKGFuZCBoZW5jZSBmdWxsIHByZWNpc2lvbik7IGFsbW9zdCBhbGwgZGlmZmVyZW5jZXMgYXJlCistLSAgICAgICAgICAgICAgICBpbiB0aGlzIGNhdGVnb3J5CistLSAgICAwLjAwICoqIDAuNSBiZWNvbWVzIDAgKG5vdCAwLjApLCBldGMuCistLSAgIC0wICAgICoqIDAuNSBiZWNvbWVzIDAgKG5ldmVyIC0wKQorLS0gICAgU29tZSBleGFjdCBzdWJub3JtYWxzIGJlY29tZSBpbmV4YWN0IGFuZCBoZW5jZSB1bmRlcmZsb3dzCisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworLS0gYmFzaWNzCitwd3N4MDAxICBwb3dlciAxICAgICAgICAwLjUgLT4gMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwMDIgIHBvd2VyIC0xICAgICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3gwMDMgIHBvd2VyIDEuMDAgICAgIDAuNSAtPiAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDAwNCAgcG93ZXIgLTEuMDAgICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdzeDAwNSAgcG93ZXIgMCAgICAgICAgMC41IC0+IDAKK3B3c3gwMDYgIHBvd2VyIDAwLjAgICAgIDAuNSAtPiAwCitwd3N4MDA3ICBwb3dlciAwLjAwICAgICAwLjUgLT4gMAorcHdzeDAwOCAgcG93ZXIgMDAuMDAgICAgMC41IC0+IDAKK3B3c3gwMDkgIHBvd2VyIDAwLjAwMCAgIDAuNSAtPiAwCitwd3N4MDEwICBwb3dlciAwMC4wMDAwICAwLjUgLT4gMAorcHdzeDAxMSAgcG93ZXIgMDAgICAgICAgMC41IC0+IDAKKworcHdzeDAxMiAgcG93ZXIgLTIgICAgICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdzeDAxMyAgcG93ZXIgMiAgICAgICAgMC41IC0+IDEuNDE0MjEzNTYgSW5leGFjdCBSb3VuZGVkCitwd3N4MDE0ICBwb3dlciAtMi4wMCAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDE1ICBwb3dlciAyLjAwICAgICAwLjUgLT4gMS40MTQyMTM1NiBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwMTYgIHBvd2VyIC0wICAgICAgIDAuNSAtPiAwCitwd3N4MDE3ICBwb3dlciAtMC4wICAgICAwLjUgLT4gMAorcHdzeDAxOCAgcG93ZXIgLTAwLjAwICAgMC41IC0+IDAKK3B3c3gwMTkgIHBvd2VyIC0wMC4wMDAgIDAuNSAtPiAwCitwd3N4MDIwICBwb3dlciAtMC4wMDAwICAwLjUgLT4gMAorcHdzeDAyMSAgcG93ZXIgLTBFKzkgICAgMC41IC0+IDAKK3B3c3gwMjIgIHBvd2VyIC0wRSsxMCAgIDAuNSAtPiAwCitwd3N4MDIzICBwb3dlciAtMEUrMTEgICAwLjUgLT4gMAorcHdzeDAyNCAgcG93ZXIgLTBFKzEyICAgMC41IC0+IDAKK3B3c3gwMjUgIHBvd2VyIC0wMCAgICAgIDAuNSAtPiAwCitwd3N4MDI2ICBwb3dlciAwRSs1ICAgICAwLjUgLT4gMAorcHdzeDAyNyAgcG93ZXIgNC4wICAgICAgMC41IC0+IDIuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDI4ICBwb3dlciA0LjAwICAgICAwLjUgLT4gMi4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworcHdzeDAzMCAgcG93ZXIgKzAuMSAgICAgICAgICAgICAwLjUgLT4gMC4zMTYyMjc3NjYgSW5leGFjdCBSb3VuZGVkCitwd3N4MDMxICBwb3dlciAtMC4xICAgICAgICAgICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3gwMzIgIHBvd2VyICswLjAxICAgICAgICAgICAgMC41IC0+IDAuMTAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDAzMyAgcG93ZXIgLTAuMDEgICAgICAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDM0ICBwb3dlciArMC4wMDEgICAgICAgICAgIDAuNSAtPiAwLjAzMTYyMjc3NjYgSW5leGFjdCBSb3VuZGVkCitwd3N4MDM1ICBwb3dlciAtMC4wMDEgICAgICAgICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3gwMzYgIHBvd2VyICswLjAwMDAwMSAgICAgICAgMC41IC0+IDAuMDAxMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDM3ICBwb3dlciAtMC4wMDAwMDEgICAgICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3gwMzggIHBvd2VyICswLjAwMDAwMDAwMDAwMSAgMC41IC0+IDAuMDAwMDAxMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDM5ICBwb3dlciAtMC4wMDAwMDAwMDAwMDEgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcHdzeDA0MSAgcG93ZXIgMS4xICAgICAgICAgMC41IC0+IDEuMDQ4ODA4ODUgSW5leGFjdCBSb3VuZGVkCitwd3N4MDQyICBwb3dlciAxLjEwICAgICAgICAwLjUgLT4gMS4wNDg4MDg4NSBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNDMgIHBvd2VyIDEuMTAwICAgICAgIDAuNSAtPiAxLjA0ODgwODg1IEluZXhhY3QgUm91bmRlZAorcHdzeDA0NCAgcG93ZXIgMS4xMTAgICAgICAgMC41IC0+IDEuMDUzNTY1MzggSW5leGFjdCBSb3VuZGVkCitwd3N4MDQ1ICBwb3dlciAtMS4xICAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDQ2ICBwb3dlciAtMS4xMCAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDQ3ICBwb3dlciAtMS4xMDAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDQ4ICBwb3dlciAtMS4xMTAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDQ5ICBwb3dlciA5LjkgICAgICAgICAwLjUgLT4gMy4xNDY0MjY1NCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNTAgIHBvd2VyIDkuOTAgICAgICAgIDAuNSAtPiAzLjE0NjQyNjU0IEluZXhhY3QgUm91bmRlZAorcHdzeDA1MSAgcG93ZXIgOS45MDAgICAgICAgMC41IC0+IDMuMTQ2NDI2NTQgSW5leGFjdCBSb3VuZGVkCitwd3N4MDUyICBwb3dlciA5Ljk5MCAgICAgICAwLjUgLT4gMy4xNjA2OTYxMyBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNTMgIHBvd2VyIC05LjkgICAgICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3gwNTQgIHBvd2VyIC05LjkwICAgICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3gwNTUgIHBvd2VyIC05LjkwMCAgICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3gwNTYgIHBvd2VyIC05Ljk5MCAgICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcHdzeDA2MCAgcG93ZXIgIDEgICAgICAgICAgICAwLjUgLT4gMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNjEgIHBvd2VyICAxLjAgICAgICAgICAgMC41IC0+IDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDYyICBwb3dlciAgMS4wMCAgICAgICAgIDAuNSAtPiAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA2MyAgcG93ZXIgIDEwLjAgICAgICAgICAwLjUgLT4gMy4xNjIyNzc2NiBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNjQgIHBvd2VyICAxMC4wICAgICAgICAgMC41IC0+IDMuMTYyMjc3NjYgSW5leGFjdCBSb3VuZGVkCitwd3N4MDY1ICBwb3dlciAgMTAuMCAgICAgICAgIDAuNSAtPiAzLjE2MjI3NzY2IEluZXhhY3QgUm91bmRlZAorcHdzeDA2NiAgcG93ZXIgIDEwLjAwICAgICAgICAwLjUgLT4gMy4xNjIyNzc2NiBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNjcgIHBvd2VyICAxMDAgICAgICAgICAgMC41IC0+IDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDY4ICBwb3dlciAgMTAwLjAgICAgICAgIDAuNSAtPiAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA2OSAgcG93ZXIgIDEwMC4wMCAgICAgICAwLjUgLT4gMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNzAgIHBvd2VyICAxLjEwMDBFKzMgICAgMC41IC0+IDMzLjE2NjI0NzkgSW5leGFjdCBSb3VuZGVkCitwd3N4MDcxICBwb3dlciAgMS4xMDAwMEUrMyAgIDAuNSAtPiAzMy4xNjYyNDc5IEluZXhhY3QgUm91bmRlZAorcHdzeDA3MiAgcG93ZXIgLTEwLjAgICAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDczICBwb3dlciAtMTAuMDAgICAgICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3gwNzQgIHBvd2VyIC0xMDAuMCAgICAgICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdzeDA3NSAgcG93ZXIgLTEwMC4wMCAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDc2ICBwb3dlciAtMS4xMDAwRSszICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3gwNzcgIHBvd2VyIC0xLjEwMDAwRSszICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBmYW1vdXMgc3F1YXJlcworcHdzeDA4MCAgcG93ZXIgICAgIDEgICAwLjUgLT4gMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwODEgIHBvd2VyICAgICA0ICAgMC41IC0+IDIuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDgyICBwb3dlciAgICAgOSAgIDAuNSAtPiAzLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA4MyAgcG93ZXIgICAgMTYgICAwLjUgLT4gNC4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwODQgIHBvd2VyICAgIDI1ICAgMC41IC0+IDUuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDg1ICBwb3dlciAgICAzNiAgIDAuNSAtPiA2LjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA4NiAgcG93ZXIgICAgNDkgICAwLjUgLT4gNy4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwODcgIHBvd2VyICAgIDY0ICAgMC41IC0+IDguMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDg4ICBwb3dlciAgICA4MSAgIDAuNSAtPiA5LjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA4OSAgcG93ZXIgICAxMDAgICAwLjUgLT4gMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwOTAgIHBvd2VyICAgMTIxICAgMC41IC0+IDExLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDkxICBwb3dlciAgIDE0NCAgIDAuNSAtPiAxMi4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA5MiAgcG93ZXIgICAxNjkgICAwLjUgLT4gMTMuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwOTMgIHBvd2VyICAgMjU2ICAgMC41IC0+IDE2LjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDk0ICBwb3dlciAgMTAyNCAgIDAuNSAtPiAzMi4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA5NSAgcG93ZXIgIDQwOTYgICAwLjUgLT4gNjQuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMDAgIHBvd2VyICAgMC4wMSAgMC41IC0+IDAuMTAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDEwMSAgcG93ZXIgICAwLjA0ICAwLjUgLT4gMC4yMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTAyICBwb3dlciAgIDAuMDkgIDAuNSAtPiAwLjMwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMDMgIHBvd2VyICAgMC4xNiAgMC41IC0+IDAuNDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDEwNCAgcG93ZXIgICAwLjI1ICAwLjUgLT4gMC41MDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTA1ICBwb3dlciAgIDAuMzYgIDAuNSAtPiAwLjYwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMDYgIHBvd2VyICAgMC40OSAgMC41IC0+IDAuNzAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDEwNyAgcG93ZXIgICAwLjY0ICAwLjUgLT4gMC44MDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTA4ICBwb3dlciAgIDAuODEgIDAuNSAtPiAwLjkwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMDkgIHBvd2VyICAgMS4wMCAgMC41IC0+IDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTEwICBwb3dlciAgIDEuMjEgIDAuNSAtPiAxLjEwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDExMSAgcG93ZXIgICAxLjQ0ICAwLjUgLT4gMS4yMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMTIgIHBvd2VyICAgMS42OSAgMC41IC0+IDEuMzAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTEzICBwb3dlciAgIDIuNTYgIDAuNSAtPiAxLjYwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDExNCAgcG93ZXIgIDEwLjI0ICAwLjUgLT4gMy4yMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMTUgIHBvd2VyICA0MC45NiAgMC41IC0+IDYuNDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIFByZWNpc2lvbiAxIHNxdWFyZXJvb3QgdGVzdHMgW2V4aGF1c3RpdmUsIHBsdXMgZXhwb25lbnQgYWRqdXN0c10KK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246ICAgMQorcHdzeDEyMDEgIHBvd2VyIDAuMSAgMC41IC0+IDAuMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIwMiAgcG93ZXIgMC4wMSAgMC41IC0+IDAuMSBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjAzICBwb3dlciAxLjBFLTEgIDAuNSAtPiAwLjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMDQgIHBvd2VyIDEuMDBFLTIgIDAuNSAtPiAwLjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMDUgIHBvd2VyIDFFLTMgIDAuNSAtPiAwLjAzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjA2ICBwb3dlciAxRSsxICAwLjUgLT4gMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIwNyAgcG93ZXIgMUUrMiAgMC41IC0+IDFFKzEgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIwOCAgcG93ZXIgMUUrMyAgMC41IC0+IDNFKzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMDkgIHBvd2VyIDAuMiAgMC41IC0+IDAuNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIxMCAgcG93ZXIgMC4wMiAgMC41IC0+IDAuMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIxMSAgcG93ZXIgMi4wRS0xICAwLjUgLT4gMC40ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjEyICBwb3dlciAyLjAwRS0yICAwLjUgLT4gMC4xICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjEzICBwb3dlciAyRS0zICAwLjUgLT4gMC4wNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIxNCAgcG93ZXIgMkUrMSAgMC41IC0+IDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMTUgIHBvd2VyIDJFKzIgIDAuNSAtPiAxRSsxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjE2ICBwb3dlciAyRSszICAwLjUgLT4gNEUrMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIxNyAgcG93ZXIgMC4zICAwLjUgLT4gMC41ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjE4ICBwb3dlciAwLjAzICAwLjUgLT4gMC4yICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjE5ICBwb3dlciAzLjBFLTEgIDAuNSAtPiAwLjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMjAgIHBvd2VyIDMuMDBFLTIgIDAuNSAtPiAwLjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMjEgIHBvd2VyIDNFLTMgIDAuNSAtPiAwLjA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjIyICBwb3dlciAzRSsxICAwLjUgLT4gNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIyMyAgcG93ZXIgM0UrMiAgMC41IC0+IDJFKzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMjQgIHBvd2VyIDNFKzMgIDAuNSAtPiA1RSsxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjI1ICBwb3dlciAwLjQgIDAuNSAtPiAwLjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMjYgIHBvd2VyIDAuMDQgIDAuNSAtPiAwLjIgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIyNyAgcG93ZXIgNC4wRS0xICAwLjUgLT4gMC42ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjI4ICBwb3dlciA0LjAwRS0yICAwLjUgLT4gMC4yICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjI5ICBwb3dlciA0RS0zICAwLjUgLT4gMC4wNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIzMCAgcG93ZXIgNEUrMSAgMC41IC0+IDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMzEgIHBvd2VyIDRFKzIgIDAuNSAtPiAyRSsxIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMzIgIHBvd2VyIDRFKzMgIDAuNSAtPiA2RSsxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjMzICBwb3dlciAwLjUgIDAuNSAtPiAwLjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMzQgIHBvd2VyIDAuMDUgIDAuNSAtPiAwLjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMzUgIHBvd2VyIDUuMEUtMSAgMC41IC0+IDAuNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIzNiAgcG93ZXIgNS4wMEUtMiAgMC41IC0+IDAuMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIzNyAgcG93ZXIgNUUtMyAgMC41IC0+IDAuMDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMzggIHBvd2VyIDVFKzEgIDAuNSAtPiA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjM5ICBwb3dlciA1RSsyICAwLjUgLT4gMkUrMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI0MCAgcG93ZXIgNUUrMyAgMC41IC0+IDdFKzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNDEgIHBvd2VyIDAuNiAgMC41IC0+IDAuOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI0MiAgcG93ZXIgMC4wNiAgMC41IC0+IDAuMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI0MyAgcG93ZXIgNi4wRS0xICAwLjUgLT4gMC44ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjQ0ICBwb3dlciA2LjAwRS0yICAwLjUgLT4gMC4yICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjQ1ICBwb3dlciA2RS0zICAwLjUgLT4gMC4wOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI0NiAgcG93ZXIgNkUrMSAgMC41IC0+IDggIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNDcgIHBvd2VyIDZFKzIgIDAuNSAtPiAyRSsxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjQ4ICBwb3dlciA2RSszICAwLjUgLT4gOEUrMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI0OSAgcG93ZXIgMC43ICAwLjUgLT4gMC44ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjUwICBwb3dlciAwLjA3ICAwLjUgLT4gMC4zICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjUxICBwb3dlciA3LjBFLTEgIDAuNSAtPiAwLjggIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNTIgIHBvd2VyIDcuMDBFLTIgIDAuNSAtPiAwLjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNTMgIHBvd2VyIDdFLTMgIDAuNSAtPiAwLjA4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjU0ICBwb3dlciA3RSsxICAwLjUgLT4gOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI1NSAgcG93ZXIgN0UrMiAgMC41IC0+IDNFKzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNTYgIHBvd2VyIDdFKzMgIDAuNSAtPiA4RSsxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjU3ICBwb3dlciAwLjggIDAuNSAtPiAwLjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNTggIHBvd2VyIDAuMDggIDAuNSAtPiAwLjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNTkgIHBvd2VyIDguMEUtMSAgMC41IC0+IDAuOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI2MCAgcG93ZXIgOC4wMEUtMiAgMC41IC0+IDAuMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI2MSAgcG93ZXIgOEUtMyAgMC41IC0+IDAuMDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNjIgIHBvd2VyIDhFKzEgIDAuNSAtPiA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjYzICBwb3dlciA4RSsyICAwLjUgLT4gM0UrMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI2NCAgcG93ZXIgOEUrMyAgMC41IC0+IDlFKzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNjUgIHBvd2VyIDAuOSAgMC41IC0+IDAuOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI2NiAgcG93ZXIgMC4wOSAgMC41IC0+IDAuMyBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjY3ICBwb3dlciA5LjBFLTEgIDAuNSAtPiAwLjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNjggIHBvd2VyIDkuMDBFLTIgIDAuNSAtPiAwLjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNjkgIHBvd2VyIDlFLTMgIDAuNSAtPiAwLjA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjcwICBwb3dlciA5RSsxICAwLjUgLT4gOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI3MSAgcG93ZXIgOUUrMiAgMC41IC0+IDNFKzEgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI3MiAgcG93ZXIgOUUrMyAgMC41IC0+IDlFKzEgIEluZXhhY3QgUm91bmRlZAorCistLSBQcmVjaXNpb24gMiBzcXVhcmVyb290IHRlc3RzIFtleGhhdXN0aXZlLCBwbHVzIGV4cG9uZW50IGFkanVzdHNdCityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiAgIDIKK3B3c3gyMjAxICBwb3dlciAwLjEgIDAuNSAtPiAwLjMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjAyICBwb3dlciAwLjAxICAwLjUgLT4gMC4xMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjAzICBwb3dlciAxLjBFLTEgIDAuNSAtPiAwLjMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjA0ICBwb3dlciAxLjAwRS0yICAwLjUgLT4gMC4xMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjA1ICBwb3dlciAxRS0zICAwLjUgLT4gMC4wMzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMDYgIHBvd2VyIDFFKzEgIDAuNSAtPiAzLjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMDcgIHBvd2VyIDFFKzIgIDAuNSAtPiAxMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjA4ICBwb3dlciAxRSszICAwLjUgLT4gMzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMDkgIHBvd2VyIDAuMiAgMC41IC0+IDAuNDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMTAgIHBvd2VyIDAuMDIgIDAuNSAtPiAwLjE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjExICBwb3dlciAyLjBFLTEgIDAuNSAtPiAwLjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjEyICBwb3dlciAyLjAwRS0yICAwLjUgLT4gMC4xNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIxMyAgcG93ZXIgMkUtMyAgMC41IC0+IDAuMDQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjE0ICBwb3dlciAyRSsxICAwLjUgLT4gNC41ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjE1ICBwb3dlciAyRSsyICAwLjUgLT4gMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMTYgIHBvd2VyIDJFKzMgIDAuNSAtPiA0NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIxNyAgcG93ZXIgMC4zICAwLjUgLT4gMC41NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIxOCAgcG93ZXIgMC4wMyAgMC41IC0+IDAuMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMTkgIHBvd2VyIDMuMEUtMSAgMC41IC0+IDAuNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMjAgIHBvd2VyIDMuMDBFLTIgIDAuNSAtPiAwLjE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjIxICBwb3dlciAzRS0zICAwLjUgLT4gMC4wNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMjIgIHBvd2VyIDNFKzEgIDAuNSAtPiA1LjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMjMgIHBvd2VyIDNFKzIgIDAuNSAtPiAxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIyNCAgcG93ZXIgM0UrMyAgMC41IC0+IDU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjI1ICBwb3dlciAwLjQgIDAuNSAtPiAwLjYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjI2ICBwb3dlciAwLjA0ICAwLjUgLT4gMC4yMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjI3ICBwb3dlciA0LjBFLTEgIDAuNSAtPiAwLjYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjI4ICBwb3dlciA0LjAwRS0yICAwLjUgLT4gMC4yMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjI5ICBwb3dlciA0RS0zICAwLjUgLT4gMC4wNjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMzAgIHBvd2VyIDRFKzEgIDAuNSAtPiA2LjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMzEgIHBvd2VyIDRFKzIgIDAuNSAtPiAyMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjMyICBwb3dlciA0RSszICAwLjUgLT4gNjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMzMgIHBvd2VyIDAuNSAgMC41IC0+IDAuNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMzQgIHBvd2VyIDAuMDUgIDAuNSAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjM1ICBwb3dlciA1LjBFLTEgIDAuNSAtPiAwLjcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjM2ICBwb3dlciA1LjAwRS0yICAwLjUgLT4gMC4yMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIzNyAgcG93ZXIgNUUtMyAgMC41IC0+IDAuMDcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjM4ICBwb3dlciA1RSsxICAwLjUgLT4gNy4xICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjM5ICBwb3dlciA1RSsyICAwLjUgLT4gMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNDAgIHBvd2VyIDVFKzMgIDAuNSAtPiA3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI0MSAgcG93ZXIgMC42ICAwLjUgLT4gMC43NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI0MiAgcG93ZXIgMC4wNiAgMC41IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNDMgIHBvd2VyIDYuMEUtMSAgMC41IC0+IDAuNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNDQgIHBvd2VyIDYuMDBFLTIgIDAuNSAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjQ1ICBwb3dlciA2RS0zICAwLjUgLT4gMC4wNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNDYgIHBvd2VyIDZFKzEgIDAuNSAtPiA3LjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNDcgIHBvd2VyIDZFKzIgIDAuNSAtPiAyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI0OCAgcG93ZXIgNkUrMyAgMC41IC0+IDc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjQ5ICBwb3dlciAwLjcgIDAuNSAtPiAwLjg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjUwICBwb3dlciAwLjA3ICAwLjUgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI1MSAgcG93ZXIgNy4wRS0xICAwLjUgLT4gMC44NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI1MiAgcG93ZXIgNy4wMEUtMiAgMC41IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNTMgIHBvd2VyIDdFLTMgIDAuNSAtPiAwLjA4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI1NCAgcG93ZXIgN0UrMSAgMC41IC0+IDguNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI1NSAgcG93ZXIgN0UrMiAgMC41IC0+IDI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjU2ICBwb3dlciA3RSszICAwLjUgLT4gODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNTcgIHBvd2VyIDAuOCAgMC41IC0+IDAuODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNTggIHBvd2VyIDAuMDggIDAuNSAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjU5ICBwb3dlciA4LjBFLTEgIDAuNSAtPiAwLjg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjYwICBwb3dlciA4LjAwRS0yICAwLjUgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI2MSAgcG93ZXIgOEUtMyAgMC41IC0+IDAuMDg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjYyICBwb3dlciA4RSsxICAwLjUgLT4gOC45ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjYzICBwb3dlciA4RSsyICAwLjUgLT4gMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNjQgIHBvd2VyIDhFKzMgIDAuNSAtPiA4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI2NSAgcG93ZXIgMC45ICAwLjUgLT4gMC45NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI2NiAgcG93ZXIgMC4wOSAgMC41IC0+IDAuMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNjcgIHBvd2VyIDkuMEUtMSAgMC41IC0+IDAuOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNjggIHBvd2VyIDkuMDBFLTIgIDAuNSAtPiAwLjMwIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNjkgIHBvd2VyIDlFLTMgIDAuNSAtPiAwLjA5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI3MCAgcG93ZXIgOUUrMSAgMC41IC0+IDkuNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI3MSAgcG93ZXIgOUUrMiAgMC41IC0+IDMwIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNzIgIHBvd2VyIDlFKzMgIDAuNSAtPiA5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI3MyAgcG93ZXIgMC4xMCAgMC41IC0+IDAuMzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNzQgIHBvd2VyIDAuMDEwICAwLjUgLT4gMC4xMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjc1ICBwb3dlciAxMC4wRS0xICAwLjUgLT4gMS4wIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNzYgIHBvd2VyIDEwLjAwRS0yICAwLjUgLT4gMC4zMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI3NyAgcG93ZXIgMTBFLTMgIDAuNSAtPiAwLjEwIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNzggIHBvd2VyIDEwRSsxICAwLjUgLT4gMTAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI3OSAgcG93ZXIgMTBFKzIgIDAuNSAtPiAzMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI4MCAgcG93ZXIgMTBFKzMgIDAuNSAtPiAxLjBFKzIgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI4MSAgcG93ZXIgMC4xMSAgMC41IC0+IDAuMzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyODIgIHBvd2VyIDAuMDExICAwLjUgLT4gMC4xMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI4MyAgcG93ZXIgMTEuMEUtMSAgMC41IC0+IDEuMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI4NCAgcG93ZXIgMTEuMDBFLTIgIDAuNSAtPiAwLjMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjg1ICBwb3dlciAxMUUtMyAgMC41IC0+IDAuMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyODYgIHBvd2VyIDExRSsxICAwLjUgLT4gMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyODcgIHBvd2VyIDExRSsyICAwLjUgLT4gMzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyODggIHBvd2VyIDExRSszICAwLjUgLT4gMS4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjg5ICBwb3dlciAwLjEyICAwLjUgLT4gMC4zNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI5MCAgcG93ZXIgMC4wMTIgIDAuNSAtPiAwLjExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjkxICBwb3dlciAxMi4wRS0xICAwLjUgLT4gMS4xICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjkyICBwb3dlciAxMi4wMEUtMiAgMC41IC0+IDAuMzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyOTMgIHBvd2VyIDEyRS0zICAwLjUgLT4gMC4xMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI5NCAgcG93ZXIgMTJFKzEgIDAuNSAtPiAxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI5NSAgcG93ZXIgMTJFKzIgIDAuNSAtPiAzNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI5NiAgcG93ZXIgMTJFKzMgIDAuNSAtPiAxLjFFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyOTcgIHBvd2VyIDAuMTMgIDAuNSAtPiAwLjM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjk4ICBwb3dlciAwLjAxMyAgMC41IC0+IDAuMTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyOTkgIHBvd2VyIDEzLjBFLTEgIDAuNSAtPiAxLjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMDAgIHBvd2VyIDEzLjAwRS0yICAwLjUgLT4gMC4zNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMwMSAgcG93ZXIgMTNFLTMgIDAuNSAtPiAwLjExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzAyICBwb3dlciAxM0UrMSAgMC41IC0+IDExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzAzICBwb3dlciAxM0UrMiAgMC41IC0+IDM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzA0ICBwb3dlciAxM0UrMyAgMC41IC0+IDEuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMwNSAgcG93ZXIgMC4xNCAgMC41IC0+IDAuMzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMDYgIHBvd2VyIDAuMDE0ICAwLjUgLT4gMC4xMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMwNyAgcG93ZXIgMTQuMEUtMSAgMC41IC0+IDEuMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMwOCAgcG93ZXIgMTQuMDBFLTIgIDAuNSAtPiAwLjM3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzA5ICBwb3dlciAxNEUtMyAgMC41IC0+IDAuMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMTAgIHBvd2VyIDE0RSsxICAwLjUgLT4gMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMTEgIHBvd2VyIDE0RSsyICAwLjUgLT4gMzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMTIgIHBvd2VyIDE0RSszICAwLjUgLT4gMS4yRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzEzICBwb3dlciAwLjE1ICAwLjUgLT4gMC4zOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMxNCAgcG93ZXIgMC4wMTUgIDAuNSAtPiAwLjEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzE1ICBwb3dlciAxNS4wRS0xICAwLjUgLT4gMS4yICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzE2ICBwb3dlciAxNS4wMEUtMiAgMC41IC0+IDAuMzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMTcgIHBvd2VyIDE1RS0zICAwLjUgLT4gMC4xMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMxOCAgcG93ZXIgMTVFKzEgIDAuNSAtPiAxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMxOSAgcG93ZXIgMTVFKzIgIDAuNSAtPiAzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMyMCAgcG93ZXIgMTVFKzMgIDAuNSAtPiAxLjJFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMjEgIHBvd2VyIDAuMTYgIDAuNSAtPiAwLjQwIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMjIgIHBvd2VyIDAuMDE2ICAwLjUgLT4gMC4xMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMyMyAgcG93ZXIgMTYuMEUtMSAgMC41IC0+IDEuMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMyNCAgcG93ZXIgMTYuMDBFLTIgIDAuNSAtPiAwLjQwIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMjUgIHBvd2VyIDE2RS0zICAwLjUgLT4gMC4xMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMyNiAgcG93ZXIgMTZFKzEgIDAuNSAtPiAxMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMyNyAgcG93ZXIgMTZFKzIgIDAuNSAtPiA0MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzI4ICBwb3dlciAxNkUrMyAgMC41IC0+IDEuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMyOSAgcG93ZXIgMC4xNyAgMC41IC0+IDAuNDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMzAgIHBvd2VyIDAuMDE3ICAwLjUgLT4gMC4xMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMzMSAgcG93ZXIgMTcuMEUtMSAgMC41IC0+IDEuMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMzMiAgcG93ZXIgMTcuMDBFLTIgIDAuNSAtPiAwLjQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzMzICBwb3dlciAxN0UtMyAgMC41IC0+IDAuMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMzQgIHBvd2VyIDE3RSsxICAwLjUgLT4gMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMzUgIHBvd2VyIDE3RSsyICAwLjUgLT4gNDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMzYgIHBvd2VyIDE3RSszICAwLjUgLT4gMS4zRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzM3ICBwb3dlciAwLjE4ICAwLjUgLT4gMC40MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMzOCAgcG93ZXIgMC4wMTggIDAuNSAtPiAwLjEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzM5ICBwb3dlciAxOC4wRS0xICAwLjUgLT4gMS4zICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzQwICBwb3dlciAxOC4wMEUtMiAgMC41IC0+IDAuNDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNDEgIHBvd2VyIDE4RS0zICAwLjUgLT4gMC4xMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM0MiAgcG93ZXIgMThFKzEgIDAuNSAtPiAxMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM0MyAgcG93ZXIgMThFKzIgIDAuNSAtPiA0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM0NCAgcG93ZXIgMThFKzMgIDAuNSAtPiAxLjNFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNDUgIHBvd2VyIDAuMTkgIDAuNSAtPiAwLjQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzQ2ICBwb3dlciAwLjAxOSAgMC41IC0+IDAuMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNDcgIHBvd2VyIDE5LjBFLTEgIDAuNSAtPiAxLjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNDggIHBvd2VyIDE5LjAwRS0yICAwLjUgLT4gMC40NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM0OSAgcG93ZXIgMTlFLTMgIDAuNSAtPiAwLjE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzUwICBwb3dlciAxOUUrMSAgMC41IC0+IDE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzUxICBwb3dlciAxOUUrMiAgMC41IC0+IDQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzUyICBwb3dlciAxOUUrMyAgMC41IC0+IDEuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM1MyAgcG93ZXIgMC4yMCAgMC41IC0+IDAuNDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNTQgIHBvd2VyIDAuMDIwICAwLjUgLT4gMC4xNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM1NSAgcG93ZXIgMjAuMEUtMSAgMC41IC0+IDEuNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM1NiAgcG93ZXIgMjAuMDBFLTIgIDAuNSAtPiAwLjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzU3ICBwb3dlciAyMEUtMyAgMC41IC0+IDAuMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNTggIHBvd2VyIDIwRSsxICAwLjUgLT4gMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNTkgIHBvd2VyIDIwRSsyICAwLjUgLT4gNDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNjAgIHBvd2VyIDIwRSszICAwLjUgLT4gMS40RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzYxICBwb3dlciAwLjIxICAwLjUgLT4gMC40NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM2MiAgcG93ZXIgMC4wMjEgIDAuNSAtPiAwLjE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzYzICBwb3dlciAyMS4wRS0xICAwLjUgLT4gMS40ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzY0ICBwb3dlciAyMS4wMEUtMiAgMC41IC0+IDAuNDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNjUgIHBvd2VyIDIxRS0zICAwLjUgLT4gMC4xNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM2NiAgcG93ZXIgMjFFKzEgIDAuNSAtPiAxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM2NyAgcG93ZXIgMjFFKzIgIDAuNSAtPiA0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM2OCAgcG93ZXIgMjFFKzMgIDAuNSAtPiAxLjRFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNjkgIHBvd2VyIDAuMjIgIDAuNSAtPiAwLjQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzcwICBwb3dlciAwLjAyMiAgMC41IC0+IDAuMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNzEgIHBvd2VyIDIyLjBFLTEgIDAuNSAtPiAxLjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNzIgIHBvd2VyIDIyLjAwRS0yICAwLjUgLT4gMC40NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM3MyAgcG93ZXIgMjJFLTMgIDAuNSAtPiAwLjE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzc0ICBwb3dlciAyMkUrMSAgMC41IC0+IDE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzc1ICBwb3dlciAyMkUrMiAgMC41IC0+IDQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzc2ICBwb3dlciAyMkUrMyAgMC41IC0+IDEuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM3NyAgcG93ZXIgMC4yMyAgMC41IC0+IDAuNDggIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNzggIHBvd2VyIDAuMDIzICAwLjUgLT4gMC4xNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM3OSAgcG93ZXIgMjMuMEUtMSAgMC41IC0+IDEuNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM4MCAgcG93ZXIgMjMuMDBFLTIgIDAuNSAtPiAwLjQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzgxICBwb3dlciAyM0UtMyAgMC41IC0+IDAuMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzODIgIHBvd2VyIDIzRSsxICAwLjUgLT4gMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzODMgIHBvd2VyIDIzRSsyICAwLjUgLT4gNDggIEluZXhhY3QgUm91bmRlZAorcHdzeDIzODQgIHBvd2VyIDIzRSszICAwLjUgLT4gMS41RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzg1ICBwb3dlciAwLjI0ICAwLjUgLT4gMC40OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM4NiAgcG93ZXIgMC4wMjQgIDAuNSAtPiAwLjE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzg3ICBwb3dlciAyNC4wRS0xICAwLjUgLT4gMS41ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzg4ICBwb3dlciAyNC4wMEUtMiAgMC41IC0+IDAuNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzODkgIHBvd2VyIDI0RS0zICAwLjUgLT4gMC4xNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM5MCAgcG93ZXIgMjRFKzEgIDAuNSAtPiAxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM5MSAgcG93ZXIgMjRFKzIgIDAuNSAtPiA0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM5MiAgcG93ZXIgMjRFKzMgIDAuNSAtPiAxLjVFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzOTMgIHBvd2VyIDAuMjUgIDAuNSAtPiAwLjUwIEluZXhhY3QgUm91bmRlZAorcHdzeDIzOTQgIHBvd2VyIDAuMDI1ICAwLjUgLT4gMC4xNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM5NSAgcG93ZXIgMjUuMEUtMSAgMC41IC0+IDEuNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM5NiAgcG93ZXIgMjUuMDBFLTIgIDAuNSAtPiAwLjUwIEluZXhhY3QgUm91bmRlZAorcHdzeDIzOTcgIHBvd2VyIDI1RS0zICAwLjUgLT4gMC4xNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM5OCAgcG93ZXIgMjVFKzEgIDAuNSAtPiAxNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM5OSAgcG93ZXIgMjVFKzIgIDAuNSAtPiA1MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDAwICBwb3dlciAyNUUrMyAgMC41IC0+IDEuNkUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQwMSAgcG93ZXIgMC4yNiAgMC41IC0+IDAuNTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MDIgIHBvd2VyIDAuMDI2ICAwLjUgLT4gMC4xNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQwMyAgcG93ZXIgMjYuMEUtMSAgMC41IC0+IDEuNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQwNCAgcG93ZXIgMjYuMDBFLTIgIDAuNSAtPiAwLjUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDA1ICBwb3dlciAyNkUtMyAgMC41IC0+IDAuMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MDYgIHBvd2VyIDI2RSsxICAwLjUgLT4gMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MDcgIHBvd2VyIDI2RSsyICAwLjUgLT4gNTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MDggIHBvd2VyIDI2RSszICAwLjUgLT4gMS42RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDA5ICBwb3dlciAwLjI3ICAwLjUgLT4gMC41MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQxMCAgcG93ZXIgMC4wMjcgIDAuNSAtPiAwLjE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDExICBwb3dlciAyNy4wRS0xICAwLjUgLT4gMS42ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDEyICBwb3dlciAyNy4wMEUtMiAgMC41IC0+IDAuNTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MTMgIHBvd2VyIDI3RS0zICAwLjUgLT4gMC4xNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQxNCAgcG93ZXIgMjdFKzEgIDAuNSAtPiAxNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQxNSAgcG93ZXIgMjdFKzIgIDAuNSAtPiA1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQxNiAgcG93ZXIgMjdFKzMgIDAuNSAtPiAxLjZFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MTcgIHBvd2VyIDAuMjggIDAuNSAtPiAwLjUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDE4ICBwb3dlciAwLjAyOCAgMC41IC0+IDAuMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MTkgIHBvd2VyIDI4LjBFLTEgIDAuNSAtPiAxLjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MjAgIHBvd2VyIDI4LjAwRS0yICAwLjUgLT4gMC41MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQyMSAgcG93ZXIgMjhFLTMgIDAuNSAtPiAwLjE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDIyICBwb3dlciAyOEUrMSAgMC41IC0+IDE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDIzICBwb3dlciAyOEUrMiAgMC41IC0+IDUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDI0ICBwb3dlciAyOEUrMyAgMC41IC0+IDEuN0UrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQyNSAgcG93ZXIgMC4yOSAgMC41IC0+IDAuNTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MjYgIHBvd2VyIDAuMDI5ICAwLjUgLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQyNyAgcG93ZXIgMjkuMEUtMSAgMC41IC0+IDEuNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQyOCAgcG93ZXIgMjkuMDBFLTIgIDAuNSAtPiAwLjU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDI5ICBwb3dlciAyOUUtMyAgMC41IC0+IDAuMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MzAgIHBvd2VyIDI5RSsxICAwLjUgLT4gMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MzEgIHBvd2VyIDI5RSsyICAwLjUgLT4gNTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MzIgIHBvd2VyIDI5RSszICAwLjUgLT4gMS43RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDMzICBwb3dlciAwLjMwICAwLjUgLT4gMC41NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQzNCAgcG93ZXIgMC4wMzAgIDAuNSAtPiAwLjE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDM1ICBwb3dlciAzMC4wRS0xICAwLjUgLT4gMS43ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDM2ICBwb3dlciAzMC4wMEUtMiAgMC41IC0+IDAuNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MzcgIHBvd2VyIDMwRS0zICAwLjUgLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQzOCAgcG93ZXIgMzBFKzEgIDAuNSAtPiAxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQzOSAgcG93ZXIgMzBFKzIgIDAuNSAtPiA1NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ0MCAgcG93ZXIgMzBFKzMgIDAuNSAtPiAxLjdFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NDEgIHBvd2VyIDAuMzEgIDAuNSAtPiAwLjU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDQyICBwb3dlciAwLjAzMSAgMC41IC0+IDAuMTggIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NDMgIHBvd2VyIDMxLjBFLTEgIDAuNSAtPiAxLjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NDQgIHBvd2VyIDMxLjAwRS0yICAwLjUgLT4gMC41NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ0NSAgcG93ZXIgMzFFLTMgIDAuNSAtPiAwLjE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDQ2ICBwb3dlciAzMUUrMSAgMC41IC0+IDE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDQ3ICBwb3dlciAzMUUrMiAgMC41IC0+IDU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDQ4ICBwb3dlciAzMUUrMyAgMC41IC0+IDEuOEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ0OSAgcG93ZXIgMC4zMiAgMC41IC0+IDAuNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NTAgIHBvd2VyIDAuMDMyICAwLjUgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ1MSAgcG93ZXIgMzIuMEUtMSAgMC41IC0+IDEuOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ1MiAgcG93ZXIgMzIuMDBFLTIgIDAuNSAtPiAwLjU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDUzICBwb3dlciAzMkUtMyAgMC41IC0+IDAuMTggIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NTQgIHBvd2VyIDMyRSsxICAwLjUgLT4gMTggIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NTUgIHBvd2VyIDMyRSsyICAwLjUgLT4gNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NTYgIHBvd2VyIDMyRSszICAwLjUgLT4gMS44RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDU3ICBwb3dlciAwLjMzICAwLjUgLT4gMC41NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ1OCAgcG93ZXIgMC4wMzMgIDAuNSAtPiAwLjE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDU5ICBwb3dlciAzMy4wRS0xICAwLjUgLT4gMS44ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDYwICBwb3dlciAzMy4wMEUtMiAgMC41IC0+IDAuNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NjEgIHBvd2VyIDMzRS0zICAwLjUgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ2MiAgcG93ZXIgMzNFKzEgIDAuNSAtPiAxOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ2MyAgcG93ZXIgMzNFKzIgIDAuNSAtPiA1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ2NCAgcG93ZXIgMzNFKzMgIDAuNSAtPiAxLjhFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NjUgIHBvd2VyIDAuMzQgIDAuNSAtPiAwLjU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDY2ICBwb3dlciAwLjAzNCAgMC41IC0+IDAuMTggIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NjcgIHBvd2VyIDM0LjBFLTEgIDAuNSAtPiAxLjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NjggIHBvd2VyIDM0LjAwRS0yICAwLjUgLT4gMC41OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ2OSAgcG93ZXIgMzRFLTMgIDAuNSAtPiAwLjE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDcwICBwb3dlciAzNEUrMSAgMC41IC0+IDE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDcxICBwb3dlciAzNEUrMiAgMC41IC0+IDU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDcyICBwb3dlciAzNEUrMyAgMC41IC0+IDEuOEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ3MyAgcG93ZXIgMC4zNSAgMC41IC0+IDAuNTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NzQgIHBvd2VyIDAuMDM1ICAwLjUgLT4gMC4xOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ3NSAgcG93ZXIgMzUuMEUtMSAgMC41IC0+IDEuOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ3NiAgcG93ZXIgMzUuMDBFLTIgIDAuNSAtPiAwLjU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDc3ICBwb3dlciAzNUUtMyAgMC41IC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NzggIHBvd2VyIDM1RSsxICAwLjUgLT4gMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NzkgIHBvd2VyIDM1RSsyICAwLjUgLT4gNTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0ODAgIHBvd2VyIDM1RSszICAwLjUgLT4gMS45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDgxICBwb3dlciAwLjM2ICAwLjUgLT4gMC42MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDgyICBwb3dlciAwLjAzNiAgMC41IC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0ODMgIHBvd2VyIDM2LjBFLTEgIDAuNSAtPiAxLjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0ODQgIHBvd2VyIDM2LjAwRS0yICAwLjUgLT4gMC42MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDg1ICBwb3dlciAzNkUtMyAgMC41IC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0ODYgIHBvd2VyIDM2RSsxICAwLjUgLT4gMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0ODcgIHBvd2VyIDM2RSsyICAwLjUgLT4gNjAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ4OCAgcG93ZXIgMzZFKzMgIDAuNSAtPiAxLjlFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0ODkgIHBvd2VyIDAuMzcgIDAuNSAtPiAwLjYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDkwICBwb3dlciAwLjAzNyAgMC41IC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0OTEgIHBvd2VyIDM3LjBFLTEgIDAuNSAtPiAxLjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0OTIgIHBvd2VyIDM3LjAwRS0yICAwLjUgLT4gMC42MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ5MyAgcG93ZXIgMzdFLTMgIDAuNSAtPiAwLjE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDk0ICBwb3dlciAzN0UrMSAgMC41IC0+IDE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDk1ICBwb3dlciAzN0UrMiAgMC41IC0+IDYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDk2ICBwb3dlciAzN0UrMyAgMC41IC0+IDEuOUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ5NyAgcG93ZXIgMC4zOCAgMC41IC0+IDAuNjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0OTggIHBvd2VyIDAuMDM4ICAwLjUgLT4gMC4xOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ5OSAgcG93ZXIgMzguMEUtMSAgMC41IC0+IDEuOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUwMCAgcG93ZXIgMzguMDBFLTIgIDAuNSAtPiAwLjYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTAxICBwb3dlciAzOEUtMyAgMC41IC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MDIgIHBvd2VyIDM4RSsxICAwLjUgLT4gMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MDMgIHBvd2VyIDM4RSsyICAwLjUgLT4gNjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MDQgIHBvd2VyIDM4RSszICAwLjUgLT4gMS45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTA1ICBwb3dlciAwLjM5ICAwLjUgLT4gMC42MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUwNiAgcG93ZXIgMC4wMzkgIDAuNSAtPiAwLjIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTA3ICBwb3dlciAzOS4wRS0xICAwLjUgLT4gMi4wICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTA4ICBwb3dlciAzOS4wMEUtMiAgMC41IC0+IDAuNjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MDkgIHBvd2VyIDM5RS0zICAwLjUgLT4gMC4yMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUxMCAgcG93ZXIgMzlFKzEgIDAuNSAtPiAyMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUxMSAgcG93ZXIgMzlFKzIgIDAuNSAtPiA2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUxMiAgcG93ZXIgMzlFKzMgIDAuNSAtPiAyLjBFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MTMgIHBvd2VyIDAuNDAgIDAuNSAtPiAwLjYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTE0ICBwb3dlciAwLjA0MCAgMC41IC0+IDAuMjAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUxNSAgcG93ZXIgNDAuMEUtMSAgMC41IC0+IDIuMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTE2ICBwb3dlciA0MC4wMEUtMiAgMC41IC0+IDAuNjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MTcgIHBvd2VyIDQwRS0zICAwLjUgLT4gMC4yMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTE4ICBwb3dlciA0MEUrMSAgMC41IC0+IDIwIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MTkgIHBvd2VyIDQwRSsyICAwLjUgLT4gNjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MjAgIHBvd2VyIDQwRSszICAwLjUgLT4gMi4wRSsyIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MjEgIHBvd2VyIDAuNDEgIDAuNSAtPiAwLjY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTIyICBwb3dlciAwLjA0MSAgMC41IC0+IDAuMjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MjMgIHBvd2VyIDQxLjBFLTEgIDAuNSAtPiAyLjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MjQgIHBvd2VyIDQxLjAwRS0yICAwLjUgLT4gMC42NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUyNSAgcG93ZXIgNDFFLTMgIDAuNSAtPiAwLjIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTI2ICBwb3dlciA0MUUrMSAgMC41IC0+IDIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTI3ICBwb3dlciA0MUUrMiAgMC41IC0+IDY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTI4ICBwb3dlciA0MUUrMyAgMC41IC0+IDIuMEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUyOSAgcG93ZXIgMC40MiAgMC41IC0+IDAuNjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MzAgIHBvd2VyIDAuMDQyICAwLjUgLT4gMC4yMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUzMSAgcG93ZXIgNDIuMEUtMSAgMC41IC0+IDIuMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUzMiAgcG93ZXIgNDIuMDBFLTIgIDAuNSAtPiAwLjY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTMzICBwb3dlciA0MkUtMyAgMC41IC0+IDAuMjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MzQgIHBvd2VyIDQyRSsxICAwLjUgLT4gMjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MzUgIHBvd2VyIDQyRSsyICAwLjUgLT4gNjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MzYgIHBvd2VyIDQyRSszICAwLjUgLT4gMi4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTM3ICBwb3dlciAwLjQzICAwLjUgLT4gMC42NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUzOCAgcG93ZXIgMC4wNDMgIDAuNSAtPiAwLjIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTM5ICBwb3dlciA0My4wRS0xICAwLjUgLT4gMi4xICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTQwICBwb3dlciA0My4wMEUtMiAgMC41IC0+IDAuNjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NDEgIHBvd2VyIDQzRS0zICAwLjUgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU0MiAgcG93ZXIgNDNFKzEgIDAuNSAtPiAyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU0MyAgcG93ZXIgNDNFKzIgIDAuNSAtPiA2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU0NCAgcG93ZXIgNDNFKzMgIDAuNSAtPiAyLjFFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NDUgIHBvd2VyIDAuNDQgIDAuNSAtPiAwLjY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTQ2ICBwb3dlciAwLjA0NCAgMC41IC0+IDAuMjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NDcgIHBvd2VyIDQ0LjBFLTEgIDAuNSAtPiAyLjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NDggIHBvd2VyIDQ0LjAwRS0yICAwLjUgLT4gMC42NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU0OSAgcG93ZXIgNDRFLTMgIDAuNSAtPiAwLjIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTUwICBwb3dlciA0NEUrMSAgMC41IC0+IDIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTUxICBwb3dlciA0NEUrMiAgMC41IC0+IDY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTUyICBwb3dlciA0NEUrMyAgMC41IC0+IDIuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU1MyAgcG93ZXIgMC40NSAgMC41IC0+IDAuNjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NTQgIHBvd2VyIDAuMDQ1ICAwLjUgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU1NSAgcG93ZXIgNDUuMEUtMSAgMC41IC0+IDIuMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU1NiAgcG93ZXIgNDUuMDBFLTIgIDAuNSAtPiAwLjY3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTU3ICBwb3dlciA0NUUtMyAgMC41IC0+IDAuMjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NTggIHBvd2VyIDQ1RSsxICAwLjUgLT4gMjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NTkgIHBvd2VyIDQ1RSsyICAwLjUgLT4gNjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NjAgIHBvd2VyIDQ1RSszICAwLjUgLT4gMi4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTYxICBwb3dlciAwLjQ2ICAwLjUgLT4gMC42OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU2MiAgcG93ZXIgMC4wNDYgIDAuNSAtPiAwLjIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTYzICBwb3dlciA0Ni4wRS0xICAwLjUgLT4gMi4xICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTY0ICBwb3dlciA0Ni4wMEUtMiAgMC41IC0+IDAuNjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NjUgIHBvd2VyIDQ2RS0zICAwLjUgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU2NiAgcG93ZXIgNDZFKzEgIDAuNSAtPiAyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU2NyAgcG93ZXIgNDZFKzIgIDAuNSAtPiA2OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU2OCAgcG93ZXIgNDZFKzMgIDAuNSAtPiAyLjFFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NjkgIHBvd2VyIDAuNDcgIDAuNSAtPiAwLjY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTcwICBwb3dlciAwLjA0NyAgMC41IC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NzEgIHBvd2VyIDQ3LjBFLTEgIDAuNSAtPiAyLjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NzIgIHBvd2VyIDQ3LjAwRS0yICAwLjUgLT4gMC42OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU3MyAgcG93ZXIgNDdFLTMgIDAuNSAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTc0ICBwb3dlciA0N0UrMSAgMC41IC0+IDIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTc1ICBwb3dlciA0N0UrMiAgMC41IC0+IDY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTc2ICBwb3dlciA0N0UrMyAgMC41IC0+IDIuMkUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU3NyAgcG93ZXIgMC40OCAgMC41IC0+IDAuNjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NzggIHBvd2VyIDAuMDQ4ICAwLjUgLT4gMC4yMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU3OSAgcG93ZXIgNDguMEUtMSAgMC41IC0+IDIuMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU4MCAgcG93ZXIgNDguMDBFLTIgIDAuNSAtPiAwLjY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTgxICBwb3dlciA0OEUtMyAgMC41IC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1ODIgIHBvd2VyIDQ4RSsxICAwLjUgLT4gMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1ODMgIHBvd2VyIDQ4RSsyICAwLjUgLT4gNjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1ODQgIHBvd2VyIDQ4RSszICAwLjUgLT4gMi4yRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTg1ICBwb3dlciAwLjQ5ICAwLjUgLT4gMC43MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTg2ICBwb3dlciAwLjA0OSAgMC41IC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1ODcgIHBvd2VyIDQ5LjBFLTEgIDAuNSAtPiAyLjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1ODggIHBvd2VyIDQ5LjAwRS0yICAwLjUgLT4gMC43MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTg5ICBwb3dlciA0OUUtMyAgMC41IC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1OTAgIHBvd2VyIDQ5RSsxICAwLjUgLT4gMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1OTEgIHBvd2VyIDQ5RSsyICAwLjUgLT4gNzAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU5MiAgcG93ZXIgNDlFKzMgIDAuNSAtPiAyLjJFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1OTMgIHBvd2VyIDAuNTAgIDAuNSAtPiAwLjcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTk0ICBwb3dlciAwLjA1MCAgMC41IC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1OTUgIHBvd2VyIDUwLjBFLTEgIDAuNSAtPiAyLjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1OTYgIHBvd2VyIDUwLjAwRS0yICAwLjUgLT4gMC43MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU5NyAgcG93ZXIgNTBFLTMgIDAuNSAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTk4ICBwb3dlciA1MEUrMSAgMC41IC0+IDIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTk5ICBwb3dlciA1MEUrMiAgMC41IC0+IDcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjAwICBwb3dlciA1MEUrMyAgMC41IC0+IDIuMkUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYwMSAgcG93ZXIgMC41MSAgMC41IC0+IDAuNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MDIgIHBvd2VyIDAuMDUxICAwLjUgLT4gMC4yMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYwMyAgcG93ZXIgNTEuMEUtMSAgMC41IC0+IDIuMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYwNCAgcG93ZXIgNTEuMDBFLTIgIDAuNSAtPiAwLjcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjA1ICBwb3dlciA1MUUtMyAgMC41IC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MDYgIHBvd2VyIDUxRSsxICAwLjUgLT4gMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MDcgIHBvd2VyIDUxRSsyICAwLjUgLT4gNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MDggIHBvd2VyIDUxRSszICAwLjUgLT4gMi4zRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjA5ICBwb3dlciAwLjUyICAwLjUgLT4gMC43MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYxMCAgcG93ZXIgMC4wNTIgIDAuNSAtPiAwLjIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjExICBwb3dlciA1Mi4wRS0xICAwLjUgLT4gMi4zICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjEyICBwb3dlciA1Mi4wMEUtMiAgMC41IC0+IDAuNzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MTMgIHBvd2VyIDUyRS0zICAwLjUgLT4gMC4yMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYxNCAgcG93ZXIgNTJFKzEgIDAuNSAtPiAyMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYxNSAgcG93ZXIgNTJFKzIgIDAuNSAtPiA3MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYxNiAgcG93ZXIgNTJFKzMgIDAuNSAtPiAyLjNFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MTcgIHBvd2VyIDAuNTMgIDAuNSAtPiAwLjczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjE4ICBwb3dlciAwLjA1MyAgMC41IC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MTkgIHBvd2VyIDUzLjBFLTEgIDAuNSAtPiAyLjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MjAgIHBvd2VyIDUzLjAwRS0yICAwLjUgLT4gMC43MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYyMSAgcG93ZXIgNTNFLTMgIDAuNSAtPiAwLjIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjIyICBwb3dlciA1M0UrMSAgMC41IC0+IDIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjIzICBwb3dlciA1M0UrMiAgMC41IC0+IDczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjI0ICBwb3dlciA1M0UrMyAgMC41IC0+IDIuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYyNSAgcG93ZXIgMC41NCAgMC41IC0+IDAuNzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MjYgIHBvd2VyIDAuMDU0ICAwLjUgLT4gMC4yMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYyNyAgcG93ZXIgNTQuMEUtMSAgMC41IC0+IDIuMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYyOCAgcG93ZXIgNTQuMDBFLTIgIDAuNSAtPiAwLjczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjI5ICBwb3dlciA1NEUtMyAgMC41IC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MzAgIHBvd2VyIDU0RSsxICAwLjUgLT4gMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MzEgIHBvd2VyIDU0RSsyICAwLjUgLT4gNzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MzIgIHBvd2VyIDU0RSszICAwLjUgLT4gMi4zRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjMzICBwb3dlciAwLjU1ICAwLjUgLT4gMC43NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYzNCAgcG93ZXIgMC4wNTUgIDAuNSAtPiAwLjIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjM1ICBwb3dlciA1NS4wRS0xICAwLjUgLT4gMi4zICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjM2ICBwb3dlciA1NS4wMEUtMiAgMC41IC0+IDAuNzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MzcgIHBvd2VyIDU1RS0zICAwLjUgLT4gMC4yMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYzOCAgcG93ZXIgNTVFKzEgIDAuNSAtPiAyMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYzOSAgcG93ZXIgNTVFKzIgIDAuNSAtPiA3NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY0MCAgcG93ZXIgNTVFKzMgIDAuNSAtPiAyLjNFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NDEgIHBvd2VyIDAuNTYgIDAuNSAtPiAwLjc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjQyICBwb3dlciAwLjA1NiAgMC41IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NDMgIHBvd2VyIDU2LjBFLTEgIDAuNSAtPiAyLjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NDQgIHBvd2VyIDU2LjAwRS0yICAwLjUgLT4gMC43NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY0NSAgcG93ZXIgNTZFLTMgIDAuNSAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjQ2ICBwb3dlciA1NkUrMSAgMC41IC0+IDI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjQ3ICBwb3dlciA1NkUrMiAgMC41IC0+IDc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjQ4ICBwb3dlciA1NkUrMyAgMC41IC0+IDIuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY0OSAgcG93ZXIgMC41NyAgMC41IC0+IDAuNzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NTAgIHBvd2VyIDAuMDU3ICAwLjUgLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY1MSAgcG93ZXIgNTcuMEUtMSAgMC41IC0+IDIuNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY1MiAgcG93ZXIgNTcuMDBFLTIgIDAuNSAtPiAwLjc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjUzICBwb3dlciA1N0UtMyAgMC41IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NTQgIHBvd2VyIDU3RSsxICAwLjUgLT4gMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NTUgIHBvd2VyIDU3RSsyICAwLjUgLT4gNzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NTYgIHBvd2VyIDU3RSszICAwLjUgLT4gMi40RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjU3ICBwb3dlciAwLjU4ICAwLjUgLT4gMC43NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY1OCAgcG93ZXIgMC4wNTggIDAuNSAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjU5ICBwb3dlciA1OC4wRS0xICAwLjUgLT4gMi40ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjYwICBwb3dlciA1OC4wMEUtMiAgMC41IC0+IDAuNzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NjEgIHBvd2VyIDU4RS0zICAwLjUgLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY2MiAgcG93ZXIgNThFKzEgIDAuNSAtPiAyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY2MyAgcG93ZXIgNThFKzIgIDAuNSAtPiA3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY2NCAgcG93ZXIgNThFKzMgIDAuNSAtPiAyLjRFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NjUgIHBvd2VyIDAuNTkgIDAuNSAtPiAwLjc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjY2ICBwb3dlciAwLjA1OSAgMC41IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NjcgIHBvd2VyIDU5LjBFLTEgIDAuNSAtPiAyLjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NjggIHBvd2VyIDU5LjAwRS0yICAwLjUgLT4gMC43NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY2OSAgcG93ZXIgNTlFLTMgIDAuNSAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjcwICBwb3dlciA1OUUrMSAgMC41IC0+IDI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjcxICBwb3dlciA1OUUrMiAgMC41IC0+IDc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjcyICBwb3dlciA1OUUrMyAgMC41IC0+IDIuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY3MyAgcG93ZXIgMC42MCAgMC41IC0+IDAuNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NzQgIHBvd2VyIDAuMDYwICAwLjUgLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY3NSAgcG93ZXIgNjAuMEUtMSAgMC41IC0+IDIuNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY3NiAgcG93ZXIgNjAuMDBFLTIgIDAuNSAtPiAwLjc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjc3ICBwb3dlciA2MEUtMyAgMC41IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NzggIHBvd2VyIDYwRSsxICAwLjUgLT4gMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NzkgIHBvd2VyIDYwRSsyICAwLjUgLT4gNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2ODAgIHBvd2VyIDYwRSszICAwLjUgLT4gMi40RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjgxICBwb3dlciAwLjYxICAwLjUgLT4gMC43OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY4MiAgcG93ZXIgMC4wNjEgIDAuNSAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjgzICBwb3dlciA2MS4wRS0xICAwLjUgLT4gMi41ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjg0ICBwb3dlciA2MS4wMEUtMiAgMC41IC0+IDAuNzggIEluZXhhY3QgUm91bmRlZAorcHdzeDI2ODUgIHBvd2VyIDYxRS0zICAwLjUgLT4gMC4yNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY4NiAgcG93ZXIgNjFFKzEgIDAuNSAtPiAyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY4NyAgcG93ZXIgNjFFKzIgIDAuNSAtPiA3OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY4OCAgcG93ZXIgNjFFKzMgIDAuNSAtPiAyLjVFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2ODkgIHBvd2VyIDAuNjIgIDAuNSAtPiAwLjc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjkwICBwb3dlciAwLjA2MiAgMC41IC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2OTEgIHBvd2VyIDYyLjBFLTEgIDAuNSAtPiAyLjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2OTIgIHBvd2VyIDYyLjAwRS0yICAwLjUgLT4gMC43OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY5MyAgcG93ZXIgNjJFLTMgIDAuNSAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjk0ICBwb3dlciA2MkUrMSAgMC41IC0+IDI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjk1ICBwb3dlciA2MkUrMiAgMC41IC0+IDc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjk2ICBwb3dlciA2MkUrMyAgMC41IC0+IDIuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY5NyAgcG93ZXIgMC42MyAgMC41IC0+IDAuNzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2OTggIHBvd2VyIDAuMDYzICAwLjUgLT4gMC4yNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY5OSAgcG93ZXIgNjMuMEUtMSAgMC41IC0+IDIuNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcwMCAgcG93ZXIgNjMuMDBFLTIgIDAuNSAtPiAwLjc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzAxICBwb3dlciA2M0UtMyAgMC41IC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MDIgIHBvd2VyIDYzRSsxICAwLjUgLT4gMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MDMgIHBvd2VyIDYzRSsyICAwLjUgLT4gNzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MDQgIHBvd2VyIDYzRSszICAwLjUgLT4gMi41RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzA1ICBwb3dlciAwLjY0ICAwLjUgLT4gMC44MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzA2ICBwb3dlciAwLjA2NCAgMC41IC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MDcgIHBvd2VyIDY0LjBFLTEgIDAuNSAtPiAyLjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MDggIHBvd2VyIDY0LjAwRS0yICAwLjUgLT4gMC44MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzA5ICBwb3dlciA2NEUtMyAgMC41IC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MTAgIHBvd2VyIDY0RSsxICAwLjUgLT4gMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MTEgIHBvd2VyIDY0RSsyICAwLjUgLT4gODAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcxMiAgcG93ZXIgNjRFKzMgIDAuNSAtPiAyLjVFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MTMgIHBvd2VyIDAuNjUgIDAuNSAtPiAwLjgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzE0ICBwb3dlciAwLjA2NSAgMC41IC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MTUgIHBvd2VyIDY1LjBFLTEgIDAuNSAtPiAyLjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MTYgIHBvd2VyIDY1LjAwRS0yICAwLjUgLT4gMC44MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcxNyAgcG93ZXIgNjVFLTMgIDAuNSAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzE4ICBwb3dlciA2NUUrMSAgMC41IC0+IDI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzE5ICBwb3dlciA2NUUrMiAgMC41IC0+IDgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzIwICBwb3dlciA2NUUrMyAgMC41IC0+IDIuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcyMSAgcG93ZXIgMC42NiAgMC41IC0+IDAuODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MjIgIHBvd2VyIDAuMDY2ICAwLjUgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcyMyAgcG93ZXIgNjYuMEUtMSAgMC41IC0+IDIuNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcyNCAgcG93ZXIgNjYuMDBFLTIgIDAuNSAtPiAwLjgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzI1ICBwb3dlciA2NkUtMyAgMC41IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MjYgIHBvd2VyIDY2RSsxICAwLjUgLT4gMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MjcgIHBvd2VyIDY2RSsyICAwLjUgLT4gODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MjggIHBvd2VyIDY2RSszICAwLjUgLT4gMi42RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzI5ICBwb3dlciAwLjY3ICAwLjUgLT4gMC44MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjczMCAgcG93ZXIgMC4wNjcgIDAuNSAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzMxICBwb3dlciA2Ny4wRS0xICAwLjUgLT4gMi42ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzMyICBwb3dlciA2Ny4wMEUtMiAgMC41IC0+IDAuODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MzMgIHBvd2VyIDY3RS0zICAwLjUgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjczNCAgcG93ZXIgNjdFKzEgIDAuNSAtPiAyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjczNSAgcG93ZXIgNjdFKzIgIDAuNSAtPiA4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjczNiAgcG93ZXIgNjdFKzMgIDAuNSAtPiAyLjZFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MzcgIHBvd2VyIDAuNjggIDAuNSAtPiAwLjgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzM4ICBwb3dlciAwLjA2OCAgMC41IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MzkgIHBvd2VyIDY4LjBFLTEgIDAuNSAtPiAyLjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NDAgIHBvd2VyIDY4LjAwRS0yICAwLjUgLT4gMC44MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc0MSAgcG93ZXIgNjhFLTMgIDAuNSAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzQyICBwb3dlciA2OEUrMSAgMC41IC0+IDI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzQzICBwb3dlciA2OEUrMiAgMC41IC0+IDgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzQ0ICBwb3dlciA2OEUrMyAgMC41IC0+IDIuNkUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc0NSAgcG93ZXIgMC42OSAgMC41IC0+IDAuODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NDYgIHBvd2VyIDAuMDY5ICAwLjUgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc0NyAgcG93ZXIgNjkuMEUtMSAgMC41IC0+IDIuNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc0OCAgcG93ZXIgNjkuMDBFLTIgIDAuNSAtPiAwLjgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzQ5ICBwb3dlciA2OUUtMyAgMC41IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NTAgIHBvd2VyIDY5RSsxICAwLjUgLT4gMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NTEgIHBvd2VyIDY5RSsyICAwLjUgLT4gODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NTIgIHBvd2VyIDY5RSszICAwLjUgLT4gMi42RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzUzICBwb3dlciAwLjcwICAwLjUgLT4gMC44NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc1NCAgcG93ZXIgMC4wNzAgIDAuNSAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzU1ICBwb3dlciA3MC4wRS0xICAwLjUgLT4gMi42ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzU2ICBwb3dlciA3MC4wMEUtMiAgMC41IC0+IDAuODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NTcgIHBvd2VyIDcwRS0zICAwLjUgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc1OCAgcG93ZXIgNzBFKzEgIDAuNSAtPiAyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc1OSAgcG93ZXIgNzBFKzIgIDAuNSAtPiA4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc2MCAgcG93ZXIgNzBFKzMgIDAuNSAtPiAyLjZFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NjEgIHBvd2VyIDAuNzEgIDAuNSAtPiAwLjg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzYyICBwb3dlciAwLjA3MSAgMC41IC0+IDAuMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NjMgIHBvd2VyIDcxLjBFLTEgIDAuNSAtPiAyLjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NjQgIHBvd2VyIDcxLjAwRS0yICAwLjUgLT4gMC44NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc2NSAgcG93ZXIgNzFFLTMgIDAuNSAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzY2ICBwb3dlciA3MUUrMSAgMC41IC0+IDI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzY3ICBwb3dlciA3MUUrMiAgMC41IC0+IDg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzY4ICBwb3dlciA3MUUrMyAgMC41IC0+IDIuN0UrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc2OSAgcG93ZXIgMC43MiAgMC41IC0+IDAuODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NzAgIHBvd2VyIDAuMDcyICAwLjUgLT4gMC4yNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc3MSAgcG93ZXIgNzIuMEUtMSAgMC41IC0+IDIuNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc3MiAgcG93ZXIgNzIuMDBFLTIgIDAuNSAtPiAwLjg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzczICBwb3dlciA3MkUtMyAgMC41IC0+IDAuMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NzQgIHBvd2VyIDcyRSsxICAwLjUgLT4gMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NzUgIHBvd2VyIDcyRSsyICAwLjUgLT4gODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NzYgIHBvd2VyIDcyRSszICAwLjUgLT4gMi43RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzc3ICBwb3dlciAwLjczICAwLjUgLT4gMC44NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc3OCAgcG93ZXIgMC4wNzMgIDAuNSAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzc5ICBwb3dlciA3My4wRS0xICAwLjUgLT4gMi43ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzgwICBwb3dlciA3My4wMEUtMiAgMC41IC0+IDAuODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3ODEgIHBvd2VyIDczRS0zICAwLjUgLT4gMC4yNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc4MiAgcG93ZXIgNzNFKzEgIDAuNSAtPiAyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc4MyAgcG93ZXIgNzNFKzIgIDAuNSAtPiA4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc4NCAgcG93ZXIgNzNFKzMgIDAuNSAtPiAyLjdFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3ODUgIHBvd2VyIDAuNzQgIDAuNSAtPiAwLjg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzg2ICBwb3dlciAwLjA3NCAgMC41IC0+IDAuMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3ODcgIHBvd2VyIDc0LjBFLTEgIDAuNSAtPiAyLjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3ODggIHBvd2VyIDc0LjAwRS0yICAwLjUgLT4gMC44NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc4OSAgcG93ZXIgNzRFLTMgIDAuNSAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzkwICBwb3dlciA3NEUrMSAgMC41IC0+IDI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzkxICBwb3dlciA3NEUrMiAgMC41IC0+IDg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzkyICBwb3dlciA3NEUrMyAgMC41IC0+IDIuN0UrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc5MyAgcG93ZXIgMC43NSAgMC41IC0+IDAuODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3OTQgIHBvd2VyIDAuMDc1ICAwLjUgLT4gMC4yNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc5NSAgcG93ZXIgNzUuMEUtMSAgMC41IC0+IDIuNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc5NiAgcG93ZXIgNzUuMDBFLTIgIDAuNSAtPiAwLjg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzk3ICBwb3dlciA3NUUtMyAgMC41IC0+IDAuMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3OTggIHBvd2VyIDc1RSsxICAwLjUgLT4gMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3OTkgIHBvd2VyIDc1RSsyICAwLjUgLT4gODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MDAgIHBvd2VyIDc1RSszICAwLjUgLT4gMi43RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODAxICBwb3dlciAwLjc2ICAwLjUgLT4gMC44NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgwMiAgcG93ZXIgMC4wNzYgIDAuNSAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODAzICBwb3dlciA3Ni4wRS0xICAwLjUgLT4gMi44ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODA0ICBwb3dlciA3Ni4wMEUtMiAgMC41IC0+IDAuODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MDUgIHBvd2VyIDc2RS0zICAwLjUgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgwNiAgcG93ZXIgNzZFKzEgIDAuNSAtPiAyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgwNyAgcG93ZXIgNzZFKzIgIDAuNSAtPiA4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgwOCAgcG93ZXIgNzZFKzMgIDAuNSAtPiAyLjhFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MDkgIHBvd2VyIDAuNzcgIDAuNSAtPiAwLjg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODEwICBwb3dlciAwLjA3NyAgMC41IC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MTEgIHBvd2VyIDc3LjBFLTEgIDAuNSAtPiAyLjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MTIgIHBvd2VyIDc3LjAwRS0yICAwLjUgLT4gMC44OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgxMyAgcG93ZXIgNzdFLTMgIDAuNSAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODE0ICBwb3dlciA3N0UrMSAgMC41IC0+IDI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODE1ICBwb3dlciA3N0UrMiAgMC41IC0+IDg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODE2ICBwb3dlciA3N0UrMyAgMC41IC0+IDIuOEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgxNyAgcG93ZXIgMC43OCAgMC41IC0+IDAuODggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MTggIHBvd2VyIDAuMDc4ICAwLjUgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgxOSAgcG93ZXIgNzguMEUtMSAgMC41IC0+IDIuOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgyMCAgcG93ZXIgNzguMDBFLTIgIDAuNSAtPiAwLjg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODIxICBwb3dlciA3OEUtMyAgMC41IC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MjIgIHBvd2VyIDc4RSsxICAwLjUgLT4gMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MjMgIHBvd2VyIDc4RSsyICAwLjUgLT4gODggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MjQgIHBvd2VyIDc4RSszICAwLjUgLT4gMi44RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODI1ICBwb3dlciAwLjc5ICAwLjUgLT4gMC44OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgyNiAgcG93ZXIgMC4wNzkgIDAuNSAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODI3ICBwb3dlciA3OS4wRS0xICAwLjUgLT4gMi44ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODI4ICBwb3dlciA3OS4wMEUtMiAgMC41IC0+IDAuODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MjkgIHBvd2VyIDc5RS0zICAwLjUgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgzMCAgcG93ZXIgNzlFKzEgIDAuNSAtPiAyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgzMSAgcG93ZXIgNzlFKzIgIDAuNSAtPiA4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgzMiAgcG93ZXIgNzlFKzMgIDAuNSAtPiAyLjhFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MzMgIHBvd2VyIDAuODAgIDAuNSAtPiAwLjg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODM0ICBwb3dlciAwLjA4MCAgMC41IC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MzUgIHBvd2VyIDgwLjBFLTEgIDAuNSAtPiAyLjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MzYgIHBvd2VyIDgwLjAwRS0yICAwLjUgLT4gMC44OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgzNyAgcG93ZXIgODBFLTMgIDAuNSAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODM4ICBwb3dlciA4MEUrMSAgMC41IC0+IDI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODM5ICBwb3dlciA4MEUrMiAgMC41IC0+IDg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODQwICBwb3dlciA4MEUrMyAgMC41IC0+IDIuOEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg0MSAgcG93ZXIgMC44MSAgMC41IC0+IDAuOTAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg0MiAgcG93ZXIgMC4wODEgIDAuNSAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODQzICBwb3dlciA4MS4wRS0xICAwLjUgLT4gMi44ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODQ0ICBwb3dlciA4MS4wMEUtMiAgMC41IC0+IDAuOTAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg0NSAgcG93ZXIgODFFLTMgIDAuNSAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODQ2ICBwb3dlciA4MUUrMSAgMC41IC0+IDI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODQ3ICBwb3dlciA4MUUrMiAgMC41IC0+IDkwIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NDggIHBvd2VyIDgxRSszICAwLjUgLT4gMi44RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODQ5ICBwb3dlciAwLjgyICAwLjUgLT4gMC45MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg1MCAgcG93ZXIgMC4wODIgIDAuNSAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODUxICBwb3dlciA4Mi4wRS0xICAwLjUgLT4gMi45ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODUyICBwb3dlciA4Mi4wMEUtMiAgMC41IC0+IDAuOTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NTMgIHBvd2VyIDgyRS0zICAwLjUgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg1NCAgcG93ZXIgODJFKzEgIDAuNSAtPiAyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg1NSAgcG93ZXIgODJFKzIgIDAuNSAtPiA5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg1NiAgcG93ZXIgODJFKzMgIDAuNSAtPiAyLjlFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NTcgIHBvd2VyIDAuODMgIDAuNSAtPiAwLjkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODU4ICBwb3dlciAwLjA4MyAgMC41IC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NTkgIHBvd2VyIDgzLjBFLTEgIDAuNSAtPiAyLjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NjAgIHBvd2VyIDgzLjAwRS0yICAwLjUgLT4gMC45MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg2MSAgcG93ZXIgODNFLTMgIDAuNSAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODYyICBwb3dlciA4M0UrMSAgMC41IC0+IDI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODYzICBwb3dlciA4M0UrMiAgMC41IC0+IDkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODY0ICBwb3dlciA4M0UrMyAgMC41IC0+IDIuOUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg2NSAgcG93ZXIgMC44NCAgMC41IC0+IDAuOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NjYgIHBvd2VyIDAuMDg0ICAwLjUgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg2NyAgcG93ZXIgODQuMEUtMSAgMC41IC0+IDIuOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg2OCAgcG93ZXIgODQuMDBFLTIgIDAuNSAtPiAwLjkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODY5ICBwb3dlciA4NEUtMyAgMC41IC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NzAgIHBvd2VyIDg0RSsxICAwLjUgLT4gMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NzEgIHBvd2VyIDg0RSsyICAwLjUgLT4gOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NzIgIHBvd2VyIDg0RSszICAwLjUgLT4gMi45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODczICBwb3dlciAwLjg1ICAwLjUgLT4gMC45MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg3NCAgcG93ZXIgMC4wODUgIDAuNSAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODc1ICBwb3dlciA4NS4wRS0xICAwLjUgLT4gMi45ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODc2ICBwb3dlciA4NS4wMEUtMiAgMC41IC0+IDAuOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NzcgIHBvd2VyIDg1RS0zICAwLjUgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg3OCAgcG93ZXIgODVFKzEgIDAuNSAtPiAyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg3OSAgcG93ZXIgODVFKzIgIDAuNSAtPiA5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg4MCAgcG93ZXIgODVFKzMgIDAuNSAtPiAyLjlFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4ODEgIHBvd2VyIDAuODYgIDAuNSAtPiAwLjkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODgyICBwb3dlciAwLjA4NiAgMC41IC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4ODMgIHBvd2VyIDg2LjBFLTEgIDAuNSAtPiAyLjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4ODQgIHBvd2VyIDg2LjAwRS0yICAwLjUgLT4gMC45MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg4NSAgcG93ZXIgODZFLTMgIDAuNSAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODg2ICBwb3dlciA4NkUrMSAgMC41IC0+IDI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODg3ICBwb3dlciA4NkUrMiAgMC41IC0+IDkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODg4ICBwb3dlciA4NkUrMyAgMC41IC0+IDIuOUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg4OSAgcG93ZXIgMC44NyAgMC41IC0+IDAuOTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4OTAgIHBvd2VyIDAuMDg3ICAwLjUgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg5MSAgcG93ZXIgODcuMEUtMSAgMC41IC0+IDIuOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg5MiAgcG93ZXIgODcuMDBFLTIgIDAuNSAtPiAwLjkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODkzICBwb3dlciA4N0UtMyAgMC41IC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4OTQgIHBvd2VyIDg3RSsxICAwLjUgLT4gMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4OTUgIHBvd2VyIDg3RSsyICAwLjUgLT4gOTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4OTYgIHBvd2VyIDg3RSszICAwLjUgLT4gMi45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODk3ICBwb3dlciAwLjg4ICAwLjUgLT4gMC45NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg5OCAgcG93ZXIgMC4wODggIDAuNSAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODk5ICBwb3dlciA4OC4wRS0xICAwLjUgLT4gMy4wICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTAwICBwb3dlciA4OC4wMEUtMiAgMC41IC0+IDAuOTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MDEgIHBvd2VyIDg4RS0zICAwLjUgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkwMiAgcG93ZXIgODhFKzEgIDAuNSAtPiAzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkwMyAgcG93ZXIgODhFKzIgIDAuNSAtPiA5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkwNCAgcG93ZXIgODhFKzMgIDAuNSAtPiAzLjBFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MDUgIHBvd2VyIDAuODkgIDAuNSAtPiAwLjk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTA2ICBwb3dlciAwLjA4OSAgMC41IC0+IDAuMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MDcgIHBvd2VyIDg5LjBFLTEgIDAuNSAtPiAzLjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MDggIHBvd2VyIDg5LjAwRS0yICAwLjUgLT4gMC45NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkwOSAgcG93ZXIgODlFLTMgIDAuNSAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTEwICBwb3dlciA4OUUrMSAgMC41IC0+IDMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTExICBwb3dlciA4OUUrMiAgMC41IC0+IDk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTEyICBwb3dlciA4OUUrMyAgMC41IC0+IDMuMEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkxMyAgcG93ZXIgMC45MCAgMC41IC0+IDAuOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MTQgIHBvd2VyIDAuMDkwICAwLjUgLT4gMC4zMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTE1ICBwb3dlciA5MC4wRS0xICAwLjUgLT4gMy4wIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MTYgIHBvd2VyIDkwLjAwRS0yICAwLjUgLT4gMC45NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkxNyAgcG93ZXIgOTBFLTMgIDAuNSAtPiAwLjMwIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MTggIHBvd2VyIDkwRSsxICAwLjUgLT4gMzAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkxOSAgcG93ZXIgOTBFKzIgIDAuNSAtPiA5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkyMCAgcG93ZXIgOTBFKzMgIDAuNSAtPiAzLjBFKzIgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkyMSAgcG93ZXIgMC45MSAgMC41IC0+IDAuOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MjIgIHBvd2VyIDAuMDkxICAwLjUgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkyMyAgcG93ZXIgOTEuMEUtMSAgMC41IC0+IDMuMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkyNCAgcG93ZXIgOTEuMDBFLTIgIDAuNSAtPiAwLjk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTI1ICBwb3dlciA5MUUtMyAgMC41IC0+IDAuMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MjYgIHBvd2VyIDkxRSsxICAwLjUgLT4gMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MjcgIHBvd2VyIDkxRSsyICAwLjUgLT4gOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MjggIHBvd2VyIDkxRSszICAwLjUgLT4gMy4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTI5ICBwb3dlciAwLjkyICAwLjUgLT4gMC45NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkzMCAgcG93ZXIgMC4wOTIgIDAuNSAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTMxICBwb3dlciA5Mi4wRS0xICAwLjUgLT4gMy4wICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTMyICBwb3dlciA5Mi4wMEUtMiAgMC41IC0+IDAuOTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MzMgIHBvd2VyIDkyRS0zICAwLjUgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkzNCAgcG93ZXIgOTJFKzEgIDAuNSAtPiAzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkzNSAgcG93ZXIgOTJFKzIgIDAuNSAtPiA5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkzNiAgcG93ZXIgOTJFKzMgIDAuNSAtPiAzLjBFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MzcgIHBvd2VyIDAuOTMgIDAuNSAtPiAwLjk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTM4ICBwb3dlciAwLjA5MyAgMC41IC0+IDAuMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MzkgIHBvd2VyIDkzLjBFLTEgIDAuNSAtPiAzLjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NDAgIHBvd2VyIDkzLjAwRS0yICAwLjUgLT4gMC45NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk0MSAgcG93ZXIgOTNFLTMgIDAuNSAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTQyICBwb3dlciA5M0UrMSAgMC41IC0+IDMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTQzICBwb3dlciA5M0UrMiAgMC41IC0+IDk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTQ0ICBwb3dlciA5M0UrMyAgMC41IC0+IDMuMEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk0NSAgcG93ZXIgMC45NCAgMC41IC0+IDAuOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NDYgIHBvd2VyIDAuMDk0ICAwLjUgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk0NyAgcG93ZXIgOTQuMEUtMSAgMC41IC0+IDMuMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk0OCAgcG93ZXIgOTQuMDBFLTIgIDAuNSAtPiAwLjk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTQ5ICBwb3dlciA5NEUtMyAgMC41IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NTAgIHBvd2VyIDk0RSsxICAwLjUgLT4gMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NTEgIHBvd2VyIDk0RSsyICAwLjUgLT4gOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NTIgIHBvd2VyIDk0RSszICAwLjUgLT4gMy4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTUzICBwb3dlciAwLjk1ICAwLjUgLT4gMC45NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk1NCAgcG93ZXIgMC4wOTUgIDAuNSAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTU1ICBwb3dlciA5NS4wRS0xICAwLjUgLT4gMy4xICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTU2ICBwb3dlciA5NS4wMEUtMiAgMC41IC0+IDAuOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NTcgIHBvd2VyIDk1RS0zICAwLjUgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk1OCAgcG93ZXIgOTVFKzEgIDAuNSAtPiAzMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk1OSAgcG93ZXIgOTVFKzIgIDAuNSAtPiA5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk2MCAgcG93ZXIgOTVFKzMgIDAuNSAtPiAzLjFFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NjEgIHBvd2VyIDAuOTYgIDAuNSAtPiAwLjk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTYyICBwb3dlciAwLjA5NiAgMC41IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NjMgIHBvd2VyIDk2LjBFLTEgIDAuNSAtPiAzLjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NjQgIHBvd2VyIDk2LjAwRS0yICAwLjUgLT4gMC45OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk2NSAgcG93ZXIgOTZFLTMgIDAuNSAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTY2ICBwb3dlciA5NkUrMSAgMC41IC0+IDMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTY3ICBwb3dlciA5NkUrMiAgMC41IC0+IDk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTY4ICBwb3dlciA5NkUrMyAgMC41IC0+IDMuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk2OSAgcG93ZXIgMC45NyAgMC41IC0+IDAuOTggIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NzAgIHBvd2VyIDAuMDk3ICAwLjUgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk3MSAgcG93ZXIgOTcuMEUtMSAgMC41IC0+IDMuMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk3MiAgcG93ZXIgOTcuMDBFLTIgIDAuNSAtPiAwLjk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTczICBwb3dlciA5N0UtMyAgMC41IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NzQgIHBvd2VyIDk3RSsxICAwLjUgLT4gMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NzUgIHBvd2VyIDk3RSsyICAwLjUgLT4gOTggIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NzYgIHBvd2VyIDk3RSszICAwLjUgLT4gMy4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTc3ICBwb3dlciAwLjk4ICAwLjUgLT4gMC45OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk3OCAgcG93ZXIgMC4wOTggIDAuNSAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTc5ICBwb3dlciA5OC4wRS0xICAwLjUgLT4gMy4xICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTgwICBwb3dlciA5OC4wMEUtMiAgMC41IC0+IDAuOTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5ODEgIHBvd2VyIDk4RS0zICAwLjUgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk4MiAgcG93ZXIgOThFKzEgIDAuNSAtPiAzMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk4MyAgcG93ZXIgOThFKzIgIDAuNSAtPiA5OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk4NCAgcG93ZXIgOThFKzMgIDAuNSAtPiAzLjFFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5ODUgIHBvd2VyIDAuOTkgIDAuNSAtPiAwLjk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTg2ICBwb3dlciAwLjA5OSAgMC41IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5ODcgIHBvd2VyIDk5LjBFLTEgIDAuNSAtPiAzLjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5ODggIHBvd2VyIDk5LjAwRS0yICAwLjUgLT4gMC45OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk4OSAgcG93ZXIgOTlFLTMgIDAuNSAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTkwICBwb3dlciA5OUUrMSAgMC41IC0+IDMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTkxICBwb3dlciA5OUUrMiAgMC41IC0+IDk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTkyICBwb3dlciA5OUUrMyAgMC41IC0+IDMuMUUrMiAgSW5leGFjdCBSb3VuZGVkCisKKy0tIFByZWNpc2lvbiAzIHNxdWFyZXJvb3QgdGVzdHMgW2V4aGF1c3RpdmUsIGYgYW5kIGYvMTBdCityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiAgIDMKK3B3c3gzMDAxICBwb3dlciAwLjEgIDAuNSAtPiAwLjMxNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAwMiAgcG93ZXIgMC4wMSAgMC41IC0+IDAuMTAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDAzICBwb3dlciAwLjIgIDAuNSAtPiAwLjQ0NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAwNCAgcG93ZXIgMC4wMiAgMC41IC0+IDAuMTQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDA1ICBwb3dlciAwLjMgIDAuNSAtPiAwLjU0OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAwNiAgcG93ZXIgMC4wMyAgMC41IC0+IDAuMTczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDA3ICBwb3dlciAwLjQgIDAuNSAtPiAwLjYzMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAwOCAgcG93ZXIgMC4wNCAgMC41IC0+IDAuMjAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDA5ICBwb3dlciAwLjUgIDAuNSAtPiAwLjcwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAxMCAgcG93ZXIgMC4wNSAgMC41IC0+IDAuMjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDExICBwb3dlciAwLjYgIDAuNSAtPiAwLjc3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAxMiAgcG93ZXIgMC4wNiAgMC41IC0+IDAuMjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDEzICBwb3dlciAwLjcgIDAuNSAtPiAwLjgzNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAxNCAgcG93ZXIgMC4wNyAgMC41IC0+IDAuMjY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDE1ICBwb3dlciAwLjggIDAuNSAtPiAwLjg5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAxNiAgcG93ZXIgMC4wOCAgMC41IC0+IDAuMjgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDE3ICBwb3dlciAwLjkgIDAuNSAtPiAwLjk0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAxOCAgcG93ZXIgMC4wOSAgMC41IC0+IDAuMzAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDE5ICBwb3dlciAwLjExICAwLjUgLT4gMC4zMzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMjAgIHBvd2VyIDAuMDExICAwLjUgLT4gMC4xMDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMjEgIHBvd2VyIDAuMTIgIDAuNSAtPiAwLjM0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAyMiAgcG93ZXIgMC4wMTIgIDAuNSAtPiAwLjExMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAyMyAgcG93ZXIgMC4xMyAgMC41IC0+IDAuMzYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDI0ICBwb3dlciAwLjAxMyAgMC41IC0+IDAuMTE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDI1ICBwb3dlciAwLjE0ICAwLjUgLT4gMC4zNzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMjYgIHBvd2VyIDAuMDE0ICAwLjUgLT4gMC4xMTggIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMjcgIHBvd2VyIDAuMTUgIDAuNSAtPiAwLjM4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAyOCAgcG93ZXIgMC4wMTUgIDAuNSAtPiAwLjEyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAyOSAgcG93ZXIgMC4xNiAgMC41IC0+IDAuNDAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDMwICBwb3dlciAwLjAxNiAgMC41IC0+IDAuMTI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDMxICBwb3dlciAwLjE3ICAwLjUgLT4gMC40MTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMzIgIHBvd2VyIDAuMDE3ICAwLjUgLT4gMC4xMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMzMgIHBvd2VyIDAuMTggIDAuNSAtPiAwLjQyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAzNCAgcG93ZXIgMC4wMTggIDAuNSAtPiAwLjEzNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAzNSAgcG93ZXIgMC4xOSAgMC41IC0+IDAuNDM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDM2ICBwb3dlciAwLjAxOSAgMC41IC0+IDAuMTM4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDM3ICBwb3dlciAwLjIxICAwLjUgLT4gMC40NTggIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMzggIHBvd2VyIDAuMDIxICAwLjUgLT4gMC4xNDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMzkgIHBvd2VyIDAuMjIgIDAuNSAtPiAwLjQ2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA0MCAgcG93ZXIgMC4wMjIgIDAuNSAtPiAwLjE0OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA0MSAgcG93ZXIgMC4yMyAgMC41IC0+IDAuNDgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDQyICBwb3dlciAwLjAyMyAgMC41IC0+IDAuMTUyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDQzICBwb3dlciAwLjI0ICAwLjUgLT4gMC40OTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNDQgIHBvd2VyIDAuMDI0ICAwLjUgLT4gMC4xNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNDUgIHBvd2VyIDAuMjUgIDAuNSAtPiAwLjUwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA0NiAgcG93ZXIgMC4wMjUgIDAuNSAtPiAwLjE1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA0NyAgcG93ZXIgMC4yNiAgMC41IC0+IDAuNTEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDQ4ICBwb3dlciAwLjAyNiAgMC41IC0+IDAuMTYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDQ5ICBwb3dlciAwLjI3ICAwLjUgLT4gMC41MjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNTAgIHBvd2VyIDAuMDI3ICAwLjUgLT4gMC4xNjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNTEgIHBvd2VyIDAuMjggIDAuNSAtPiAwLjUyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA1MiAgcG93ZXIgMC4wMjggIDAuNSAtPiAwLjE2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA1MyAgcG93ZXIgMC4yOSAgMC41IC0+IDAuNTM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDU0ICBwb3dlciAwLjAyOSAgMC41IC0+IDAuMTcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDU1ICBwb3dlciAwLjMxICAwLjUgLT4gMC41NTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNTYgIHBvd2VyIDAuMDMxICAwLjUgLT4gMC4xNzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNTcgIHBvd2VyIDAuMzIgIDAuNSAtPiAwLjU2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA1OCAgcG93ZXIgMC4wMzIgIDAuNSAtPiAwLjE3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA1OSAgcG93ZXIgMC4zMyAgMC41IC0+IDAuNTc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDYwICBwb3dlciAwLjAzMyAgMC41IC0+IDAuMTgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDYxICBwb3dlciAwLjM0ICAwLjUgLT4gMC41ODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNjIgIHBvd2VyIDAuMDM0ICAwLjUgLT4gMC4xODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNjMgIHBvd2VyIDAuMzUgIDAuNSAtPiAwLjU5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA2NCAgcG93ZXIgMC4wMzUgIDAuNSAtPiAwLjE4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA2NSAgcG93ZXIgMC4zNiAgMC41IC0+IDAuNjAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDY2ICBwb3dlciAwLjAzNiAgMC41IC0+IDAuMTkwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDY3ICBwb3dlciAwLjM3ICAwLjUgLT4gMC42MDggIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNjggIHBvd2VyIDAuMDM3ICAwLjUgLT4gMC4xOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNjkgIHBvd2VyIDAuMzggIDAuNSAtPiAwLjYxNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA3MCAgcG93ZXIgMC4wMzggIDAuNSAtPiAwLjE5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA3MSAgcG93ZXIgMC4zOSAgMC41IC0+IDAuNjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDcyICBwb3dlciAwLjAzOSAgMC41IC0+IDAuMTk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDczICBwb3dlciAwLjQxICAwLjUgLT4gMC42NDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNzQgIHBvd2VyIDAuMDQxICAwLjUgLT4gMC4yMDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNzUgIHBvd2VyIDAuNDIgIDAuNSAtPiAwLjY0OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA3NiAgcG93ZXIgMC4wNDIgIDAuNSAtPiAwLjIwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA3NyAgcG93ZXIgMC40MyAgMC41IC0+IDAuNjU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDc4ICBwb3dlciAwLjA0MyAgMC41IC0+IDAuMjA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDc5ICBwb3dlciAwLjQ0ICAwLjUgLT4gMC42NjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwODAgIHBvd2VyIDAuMDQ0ICAwLjUgLT4gMC4yMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwODEgIHBvd2VyIDAuNDUgIDAuNSAtPiAwLjY3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA4MiAgcG93ZXIgMC4wNDUgIDAuNSAtPiAwLjIxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA4MyAgcG93ZXIgMC40NiAgMC41IC0+IDAuNjc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDg0ICBwb3dlciAwLjA0NiAgMC41IC0+IDAuMjE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDg1ICBwb3dlciAwLjQ3ICAwLjUgLT4gMC42ODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwODYgIHBvd2VyIDAuMDQ3ICAwLjUgLT4gMC4yMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwODcgIHBvd2VyIDAuNDggIDAuNSAtPiAwLjY5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA4OCAgcG93ZXIgMC4wNDggIDAuNSAtPiAwLjIxOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA4OSAgcG93ZXIgMC40OSAgMC41IC0+IDAuNzAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDkwICBwb3dlciAwLjA0OSAgMC41IC0+IDAuMjIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDkxICBwb3dlciAwLjUxICAwLjUgLT4gMC43MTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwOTIgIHBvd2VyIDAuMDUxICAwLjUgLT4gMC4yMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwOTMgIHBvd2VyIDAuNTIgIDAuNSAtPiAwLjcyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA5NCAgcG93ZXIgMC4wNTIgIDAuNSAtPiAwLjIyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA5NSAgcG93ZXIgMC41MyAgMC41IC0+IDAuNzI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDk2ICBwb3dlciAwLjA1MyAgMC41IC0+IDAuMjMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDk3ICBwb3dlciAwLjU0ICAwLjUgLT4gMC43MzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwOTggIHBvd2VyIDAuMDU0ICAwLjUgLT4gMC4yMzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwOTkgIHBvd2VyIDAuNTUgIDAuNSAtPiAwLjc0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEwMCAgcG93ZXIgMC4wNTUgIDAuNSAtPiAwLjIzNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEwMSAgcG93ZXIgMC41NiAgMC41IC0+IDAuNzQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTAyICBwb3dlciAwLjA1NiAgMC41IC0+IDAuMjM3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTAzICBwb3dlciAwLjU3ICAwLjUgLT4gMC43NTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMDQgIHBvd2VyIDAuMDU3ICAwLjUgLT4gMC4yMzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMDUgIHBvd2VyIDAuNTggIDAuNSAtPiAwLjc2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEwNiAgcG93ZXIgMC4wNTggIDAuNSAtPiAwLjI0MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEwNyAgcG93ZXIgMC41OSAgMC41IC0+IDAuNzY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTA4ICBwb3dlciAwLjA1OSAgMC41IC0+IDAuMjQzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTA5ICBwb3dlciAwLjYxICAwLjUgLT4gMC43ODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMTAgIHBvd2VyIDAuMDYxICAwLjUgLT4gMC4yNDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMTEgIHBvd2VyIDAuNjIgIDAuNSAtPiAwLjc4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzExMiAgcG93ZXIgMC4wNjIgIDAuNSAtPiAwLjI0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzExMyAgcG93ZXIgMC42MyAgMC41IC0+IDAuNzk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTE0ICBwb3dlciAwLjA2MyAgMC41IC0+IDAuMjUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTE1ICBwb3dlciAwLjY0ICAwLjUgLT4gMC44MDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMTYgIHBvd2VyIDAuMDY0ICAwLjUgLT4gMC4yNTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMTcgIHBvd2VyIDAuNjUgIDAuNSAtPiAwLjgwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzExOCAgcG93ZXIgMC4wNjUgIDAuNSAtPiAwLjI1NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzExOSAgcG93ZXIgMC42NiAgMC41IC0+IDAuODEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTIwICBwb3dlciAwLjA2NiAgMC41IC0+IDAuMjU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTIxICBwb3dlciAwLjY3ICAwLjUgLT4gMC44MTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMjIgIHBvd2VyIDAuMDY3ICAwLjUgLT4gMC4yNTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMjMgIHBvd2VyIDAuNjggIDAuNSAtPiAwLjgyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEyNCAgcG93ZXIgMC4wNjggIDAuNSAtPiAwLjI2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEyNSAgcG93ZXIgMC42OSAgMC41IC0+IDAuODMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTI2ICBwb3dlciAwLjA2OSAgMC41IC0+IDAuMjYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTI3ICBwb3dlciAwLjcxICAwLjUgLT4gMC44NDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMjggIHBvd2VyIDAuMDcxICAwLjUgLT4gMC4yNjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMjkgIHBvd2VyIDAuNzIgIDAuNSAtPiAwLjg0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEzMCAgcG93ZXIgMC4wNzIgIDAuNSAtPiAwLjI2OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEzMSAgcG93ZXIgMC43MyAgMC41IC0+IDAuODU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTMyICBwb3dlciAwLjA3MyAgMC41IC0+IDAuMjcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTMzICBwb3dlciAwLjc0ICAwLjUgLT4gMC44NjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMzQgIHBvd2VyIDAuMDc0ICAwLjUgLT4gMC4yNzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMzUgIHBvd2VyIDAuNzUgIDAuNSAtPiAwLjg2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEzNiAgcG93ZXIgMC4wNzUgIDAuNSAtPiAwLjI3NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEzNyAgcG93ZXIgMC43NiAgMC41IC0+IDAuODcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTM4ICBwb3dlciAwLjA3NiAgMC41IC0+IDAuMjc2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTM5ICBwb3dlciAwLjc3ICAwLjUgLT4gMC44NzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNDAgIHBvd2VyIDAuMDc3ICAwLjUgLT4gMC4yNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNDEgIHBvd2VyIDAuNzggIDAuNSAtPiAwLjg4MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE0MiAgcG93ZXIgMC4wNzggIDAuNSAtPiAwLjI3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE0MyAgcG93ZXIgMC43OSAgMC41IC0+IDAuODg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTQ0ICBwb3dlciAwLjA3OSAgMC41IC0+IDAuMjgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTQ1ICBwb3dlciAwLjgxICAwLjUgLT4gMC45MDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNDYgIHBvd2VyIDAuMDgxICAwLjUgLT4gMC4yODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNDcgIHBvd2VyIDAuODIgIDAuNSAtPiAwLjkwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE0OCAgcG93ZXIgMC4wODIgIDAuNSAtPiAwLjI4NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE0OSAgcG93ZXIgMC44MyAgMC41IC0+IDAuOTExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTUwICBwb3dlciAwLjA4MyAgMC41IC0+IDAuMjg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTUxICBwb3dlciAwLjg0ICAwLjUgLT4gMC45MTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNTIgIHBvd2VyIDAuMDg0ICAwLjUgLT4gMC4yOTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNTMgIHBvd2VyIDAuODUgIDAuNSAtPiAwLjkyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE1NCAgcG93ZXIgMC4wODUgIDAuNSAtPiAwLjI5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE1NSAgcG93ZXIgMC44NiAgMC41IC0+IDAuOTI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTU2ICBwb3dlciAwLjA4NiAgMC41IC0+IDAuMjkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTU3ICBwb3dlciAwLjg3ICAwLjUgLT4gMC45MzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNTggIHBvd2VyIDAuMDg3ICAwLjUgLT4gMC4yOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNTkgIHBvd2VyIDAuODggIDAuNSAtPiAwLjkzOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE2MCAgcG93ZXIgMC4wODggIDAuNSAtPiAwLjI5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE2MSAgcG93ZXIgMC44OSAgMC41IC0+IDAuOTQzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTYyICBwb3dlciAwLjA4OSAgMC41IC0+IDAuMjk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTYzICBwb3dlciAwLjkxICAwLjUgLT4gMC45NTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNjQgIHBvd2VyIDAuMDkxICAwLjUgLT4gMC4zMDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNjUgIHBvd2VyIDAuOTIgIDAuNSAtPiAwLjk1OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE2NiAgcG93ZXIgMC4wOTIgIDAuNSAtPiAwLjMwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE2NyAgcG93ZXIgMC45MyAgMC41IC0+IDAuOTY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTY4ICBwb3dlciAwLjA5MyAgMC41IC0+IDAuMzA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTY5ICBwb3dlciAwLjk0ICAwLjUgLT4gMC45NzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNzAgIHBvd2VyIDAuMDk0ICAwLjUgLT4gMC4zMDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNzEgIHBvd2VyIDAuOTUgIDAuNSAtPiAwLjk3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE3MiAgcG93ZXIgMC4wOTUgIDAuNSAtPiAwLjMwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE3MyAgcG93ZXIgMC45NiAgMC41IC0+IDAuOTgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTc0ICBwb3dlciAwLjA5NiAgMC41IC0+IDAuMzEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTc1ICBwb3dlciAwLjk3ICAwLjUgLT4gMC45ODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNzYgIHBvd2VyIDAuMDk3ICAwLjUgLT4gMC4zMTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNzcgIHBvd2VyIDAuOTggIDAuNSAtPiAwLjk5MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE3OCAgcG93ZXIgMC4wOTggIDAuNSAtPiAwLjMxMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE3OSAgcG93ZXIgMC45OSAgMC41IC0+IDAuOTk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTgwICBwb3dlciAwLjA5OSAgMC41IC0+IDAuMzE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTgxICBwb3dlciAwLjEwMSAgMC41IC0+IDAuMzE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTgyICBwb3dlciAwLjAxMDEgIDAuNSAtPiAwLjEwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE4MyAgcG93ZXIgMC4xMDIgIDAuNSAtPiAwLjMxOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE4NCAgcG93ZXIgMC4wMTAyICAwLjUgLT4gMC4xMDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxODUgIHBvd2VyIDAuMTAzICAwLjUgLT4gMC4zMjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxODYgIHBvd2VyIDAuMDEwMyAgMC41IC0+IDAuMTAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTg3ICBwb3dlciAwLjEwNCAgMC41IC0+IDAuMzIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTg4ICBwb3dlciAwLjAxMDQgIDAuNSAtPiAwLjEwMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE4OSAgcG93ZXIgMC4xMDUgIDAuNSAtPiAwLjMyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE5MCAgcG93ZXIgMC4wMTA1ICAwLjUgLT4gMC4xMDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxOTEgIHBvd2VyIDAuMTA2ICAwLjUgLT4gMC4zMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxOTIgIHBvd2VyIDAuMDEwNiAgMC41IC0+IDAuMTAzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTkzICBwb3dlciAwLjEwNyAgMC41IC0+IDAuMzI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTk0ICBwb3dlciAwLjAxMDcgIDAuNSAtPiAwLjEwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE5NSAgcG93ZXIgMC4xMDggIDAuNSAtPiAwLjMyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE5NiAgcG93ZXIgMC4wMTA4ICAwLjUgLT4gMC4xMDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxOTcgIHBvd2VyIDAuMTA5ICAwLjUgLT4gMC4zMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxOTggIHBvd2VyIDAuMDEwOSAgMC41IC0+IDAuMTA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTk5ICBwb3dlciAwLjExMSAgMC41IC0+IDAuMzMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjAwICBwb3dlciAwLjAxMTEgIDAuNSAtPiAwLjEwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIwMSAgcG93ZXIgMC4xMTIgIDAuNSAtPiAwLjMzNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIwMiAgcG93ZXIgMC4wMTEyICAwLjUgLT4gMC4xMDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMDMgIHBvd2VyIDAuMTEzICAwLjUgLT4gMC4zMzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMDQgIHBvd2VyIDAuMDExMyAgMC41IC0+IDAuMTA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjA1ICBwb3dlciAwLjExNCAgMC41IC0+IDAuMzM4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjA2ICBwb3dlciAwLjAxMTQgIDAuNSAtPiAwLjEwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIwNyAgcG93ZXIgMC4xMTUgIDAuNSAtPiAwLjMzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIwOCAgcG93ZXIgMC4wMTE1ICAwLjUgLT4gMC4xMDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMDkgIHBvd2VyIDAuMTE2ICAwLjUgLT4gMC4zNDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMTAgIHBvd2VyIDAuMDExNiAgMC41IC0+IDAuMTA4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjExICBwb3dlciAwLjExNyAgMC41IC0+IDAuMzQyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjEyICBwb3dlciAwLjAxMTcgIDAuNSAtPiAwLjEwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIxMyAgcG93ZXIgMC4xMTggIDAuNSAtPiAwLjM0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIxNCAgcG93ZXIgMC4wMTE4ICAwLjUgLT4gMC4xMDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMTUgIHBvd2VyIDAuMTE5ICAwLjUgLT4gMC4zNDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMTYgIHBvd2VyIDAuMDExOSAgMC41IC0+IDAuMTA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjE3ICBwb3dlciAwLjEyMSAgMC41IC0+IDAuMzQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjE4ICBwb3dlciAwLjAxMjEgIDAuNSAtPiAwLjExMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIxOSAgcG93ZXIgMC4xMjIgIDAuNSAtPiAwLjM0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIyMCAgcG93ZXIgMC4wMTIyICAwLjUgLT4gMC4xMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMjEgIHBvd2VyIDAuMTIzICAwLjUgLT4gMC4zNTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMjIgIHBvd2VyIDAuMDEyMyAgMC41IC0+IDAuMTExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjIzICBwb3dlciAwLjEyNCAgMC41IC0+IDAuMzUyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjI0ICBwb3dlciAwLjAxMjQgIDAuNSAtPiAwLjExMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIyNSAgcG93ZXIgMC4xMjUgIDAuNSAtPiAwLjM1NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIyNiAgcG93ZXIgMC4wMTI1ICAwLjUgLT4gMC4xMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMjcgIHBvd2VyIDAuMTI2ICAwLjUgLT4gMC4zNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMjggIHBvd2VyIDAuMDEyNiAgMC41IC0+IDAuMTEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjI5ICBwb3dlciAwLjEyNyAgMC41IC0+IDAuMzU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjMwICBwb3dlciAwLjAxMjcgIDAuNSAtPiAwLjExMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIzMSAgcG93ZXIgMC4xMjggIDAuNSAtPiAwLjM1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIzMiAgcG93ZXIgMC4wMTI4ICAwLjUgLT4gMC4xMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMzMgIHBvd2VyIDAuMTI5ICAwLjUgLT4gMC4zNTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMzQgIHBvd2VyIDAuMDEyOSAgMC41IC0+IDAuMTE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjM1ICBwb3dlciAwLjEzMSAgMC41IC0+IDAuMzYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjM2ICBwb3dlciAwLjAxMzEgIDAuNSAtPiAwLjExNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIzNyAgcG93ZXIgMC4xMzIgIDAuNSAtPiAwLjM2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIzOCAgcG93ZXIgMC4wMTMyICAwLjUgLT4gMC4xMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMzkgIHBvd2VyIDAuMTMzICAwLjUgLT4gMC4zNjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNDAgIHBvd2VyIDAuMDEzMyAgMC41IC0+IDAuMTE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjQxICBwb3dlciAwLjEzNCAgMC41IC0+IDAuMzY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjQyICBwb3dlciAwLjAxMzQgIDAuNSAtPiAwLjExNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI0MyAgcG93ZXIgMC4xMzUgIDAuNSAtPiAwLjM2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI0NCAgcG93ZXIgMC4wMTM1ICAwLjUgLT4gMC4xMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNDUgIHBvd2VyIDAuMTM2ICAwLjUgLT4gMC4zNjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNDYgIHBvd2VyIDAuMDEzNiAgMC41IC0+IDAuMTE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjQ3ICBwb3dlciAwLjEzNyAgMC41IC0+IDAuMzcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjQ4ICBwb3dlciAwLjAxMzcgIDAuNSAtPiAwLjExNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI0OSAgcG93ZXIgMC4xMzggIDAuNSAtPiAwLjM3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI1MCAgcG93ZXIgMC4wMTM4ICAwLjUgLT4gMC4xMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNTEgIHBvd2VyIDAuMTM5ICAwLjUgLT4gMC4zNzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNTIgIHBvd2VyIDAuMDEzOSAgMC41IC0+IDAuMTE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjUzICBwb3dlciAwLjE0MSAgMC41IC0+IDAuMzc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjU0ICBwb3dlciAwLjAxNDEgIDAuNSAtPiAwLjExOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI1NSAgcG93ZXIgMC4xNDIgIDAuNSAtPiAwLjM3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI1NiAgcG93ZXIgMC4wMTQyICAwLjUgLT4gMC4xMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNTcgIHBvd2VyIDAuMTQzICAwLjUgLT4gMC4zNzggIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNTggIHBvd2VyIDAuMDE0MyAgMC41IC0+IDAuMTIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjU5ICBwb3dlciAwLjE0NCAgMC41IC0+IDAuMzc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjYwICBwb3dlciAwLjAxNDQgIDAuNSAtPiAwLjEyMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI2MSAgcG93ZXIgMC4xNDUgIDAuNSAtPiAwLjM4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI2MiAgcG93ZXIgMC4wMTQ1ICAwLjUgLT4gMC4xMjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNjMgIHBvd2VyIDAuMTQ2ICAwLjUgLT4gMC4zODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNjQgIHBvd2VyIDAuMDE0NiAgMC41IC0+IDAuMTIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjY1ICBwb3dlciAwLjE0NyAgMC41IC0+IDAuMzgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjY2ICBwb3dlciAwLjAxNDcgIDAuNSAtPiAwLjEyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI2NyAgcG93ZXIgMC4xNDggIDAuNSAtPiAwLjM4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI2OCAgcG93ZXIgMC4wMTQ4ICAwLjUgLT4gMC4xMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNjkgIHBvd2VyIDAuMTQ5ICAwLjUgLT4gMC4zODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNzAgIHBvd2VyIDAuMDE0OSAgMC41IC0+IDAuMTIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjcxICBwb3dlciAwLjE1MSAgMC41IC0+IDAuMzg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjcyICBwb3dlciAwLjAxNTEgIDAuNSAtPiAwLjEyMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI3MyAgcG93ZXIgMC4xNTIgIDAuNSAtPiAwLjM5MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI3NCAgcG93ZXIgMC4wMTUyICAwLjUgLT4gMC4xMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNzUgIHBvd2VyIDAuMTUzICAwLjUgLT4gMC4zOTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNzYgIHBvd2VyIDAuMDE1MyAgMC41IC0+IDAuMTI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjc3ICBwb3dlciAwLjE1NCAgMC41IC0+IDAuMzkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjc4ICBwb3dlciAwLjAxNTQgIDAuNSAtPiAwLjEyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI3OSAgcG93ZXIgMC4xNTUgIDAuNSAtPiAwLjM5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI4MCAgcG93ZXIgMC4wMTU1ICAwLjUgLT4gMC4xMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyODEgIHBvd2VyIDAuMTU2ICAwLjUgLT4gMC4zOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyODIgIHBvd2VyIDAuMDE1NiAgMC41IC0+IDAuMTI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjgzICBwb3dlciAwLjE1NyAgMC41IC0+IDAuMzk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjg0ICBwb3dlciAwLjAxNTcgIDAuNSAtPiAwLjEyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI4NSAgcG93ZXIgMC4xNTggIDAuNSAtPiAwLjM5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI4NiAgcG93ZXIgMC4wMTU4ICAwLjUgLT4gMC4xMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyODcgIHBvd2VyIDAuMTU5ICAwLjUgLT4gMC4zOTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyODggIHBvd2VyIDAuMDE1OSAgMC41IC0+IDAuMTI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjg5ICBwb3dlciAwLjE2MSAgMC41IC0+IDAuNDAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjkwICBwb3dlciAwLjAxNjEgIDAuNSAtPiAwLjEyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI5MSAgcG93ZXIgMC4xNjIgIDAuNSAtPiAwLjQwMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI5MiAgcG93ZXIgMC4wMTYyICAwLjUgLT4gMC4xMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyOTMgIHBvd2VyIDAuMTYzICAwLjUgLT4gMC40MDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyOTQgIHBvd2VyIDAuMDE2MyAgMC41IC0+IDAuMTI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjk1ICBwb3dlciAwLjE2NCAgMC41IC0+IDAuNDA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjk2ICBwb3dlciAwLjAxNjQgIDAuNSAtPiAwLjEyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI5NyAgcG93ZXIgMC4xNjUgIDAuNSAtPiAwLjQwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI5OCAgcG93ZXIgMC4wMTY1ICAwLjUgLT4gMC4xMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDMyOTkgIHBvd2VyIDAuMTY2ICAwLjUgLT4gMC40MDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMDAgIHBvd2VyIDAuMDE2NiAgMC41IC0+IDAuMTI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzAxICBwb3dlciAwLjE2NyAgMC41IC0+IDAuNDA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzAyICBwb3dlciAwLjAxNjcgIDAuNSAtPiAwLjEyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMwMyAgcG93ZXIgMC4xNjggIDAuNSAtPiAwLjQxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMwNCAgcG93ZXIgMC4wMTY4ICAwLjUgLT4gMC4xMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMDUgIHBvd2VyIDAuMTY5ICAwLjUgLT4gMC40MTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMDYgIHBvd2VyIDAuMDE2OSAgMC41IC0+IDAuMTMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzA3ICBwb3dlciAwLjE3MSAgMC41IC0+IDAuNDE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzA4ICBwb3dlciAwLjAxNzEgIDAuNSAtPiAwLjEzMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMwOSAgcG93ZXIgMC4xNzIgIDAuNSAtPiAwLjQxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMxMCAgcG93ZXIgMC4wMTcyICAwLjUgLT4gMC4xMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMTEgIHBvd2VyIDAuMTczICAwLjUgLT4gMC40MTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMTIgIHBvd2VyIDAuMDE3MyAgMC41IC0+IDAuMTMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzEzICBwb3dlciAwLjE3NCAgMC41IC0+IDAuNDE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzE0ICBwb3dlciAwLjAxNzQgIDAuNSAtPiAwLjEzMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMxNSAgcG93ZXIgMC4xNzUgIDAuNSAtPiAwLjQxOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMxNiAgcG93ZXIgMC4wMTc1ICAwLjUgLT4gMC4xMzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMTcgIHBvd2VyIDAuMTc2ICAwLjUgLT4gMC40MjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMTggIHBvd2VyIDAuMDE3NiAgMC41IC0+IDAuMTMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzE5ICBwb3dlciAwLjE3NyAgMC41IC0+IDAuNDIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzIwICBwb3dlciAwLjAxNzcgIDAuNSAtPiAwLjEzMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMyMSAgcG93ZXIgMC4xNzggIDAuNSAtPiAwLjQyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMyMiAgcG93ZXIgMC4wMTc4ICAwLjUgLT4gMC4xMzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMjMgIHBvd2VyIDAuMTc5ICAwLjUgLT4gMC40MjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMjQgIHBvd2VyIDAuMDE3OSAgMC41IC0+IDAuMTM0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzI1ICBwb3dlciAwLjE4MSAgMC41IC0+IDAuNDI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzI2ICBwb3dlciAwLjAxODEgIDAuNSAtPiAwLjEzNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMyNyAgcG93ZXIgMC4xODIgIDAuNSAtPiAwLjQyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMyOCAgcG93ZXIgMC4wMTgyICAwLjUgLT4gMC4xMzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMjkgIHBvd2VyIDAuMTgzICAwLjUgLT4gMC40MjggIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMzAgIHBvd2VyIDAuMDE4MyAgMC41IC0+IDAuMTM1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzMxICBwb3dlciAwLjE4NCAgMC41IC0+IDAuNDI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzMyICBwb3dlciAwLjAxODQgIDAuNSAtPiAwLjEzNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMzMyAgcG93ZXIgMC4xODUgIDAuNSAtPiAwLjQzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMzNCAgcG93ZXIgMC4wMTg1ICAwLjUgLT4gMC4xMzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMzUgIHBvd2VyIDAuMTg2ICAwLjUgLT4gMC40MzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMzYgIHBvd2VyIDAuMDE4NiAgMC41IC0+IDAuMTM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzM3ICBwb3dlciAwLjE4NyAgMC41IC0+IDAuNDMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzM4ICBwb3dlciAwLjAxODcgIDAuNSAtPiAwLjEzNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMzOSAgcG93ZXIgMC4xODggIDAuNSAtPiAwLjQzNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM0MCAgcG93ZXIgMC4wMTg4ICAwLjUgLT4gMC4xMzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNDEgIHBvd2VyIDAuMTg5ICAwLjUgLT4gMC40MzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNDIgIHBvd2VyIDAuMDE4OSAgMC41IC0+IDAuMTM3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzQzICBwb3dlciAwLjE5MSAgMC41IC0+IDAuNDM3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzQ0ICBwb3dlciAwLjAxOTEgIDAuNSAtPiAwLjEzOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM0NSAgcG93ZXIgMC4xOTIgIDAuNSAtPiAwLjQzOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM0NiAgcG93ZXIgMC4wMTkyICAwLjUgLT4gMC4xMzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNDcgIHBvd2VyIDAuMTkzICAwLjUgLT4gMC40MzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNDggIHBvd2VyIDAuMDE5MyAgMC41IC0+IDAuMTM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzQ5ICBwb3dlciAwLjE5NCAgMC41IC0+IDAuNDQwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzUwICBwb3dlciAwLjAxOTQgIDAuNSAtPiAwLjEzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM1MSAgcG93ZXIgMC4xOTUgIDAuNSAtPiAwLjQ0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM1MiAgcG93ZXIgMC4wMTk1ICAwLjUgLT4gMC4xNDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNTMgIHBvd2VyIDAuMTk2ICAwLjUgLT4gMC40NDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNTQgIHBvd2VyIDAuMDE5NiAgMC41IC0+IDAuMTQwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzU1ICBwb3dlciAwLjE5NyAgMC41IC0+IDAuNDQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzU2ICBwb3dlciAwLjAxOTcgIDAuNSAtPiAwLjE0MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM1NyAgcG93ZXIgMC4xOTggIDAuNSAtPiAwLjQ0NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM1OCAgcG93ZXIgMC4wMTk4ICAwLjUgLT4gMC4xNDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNTkgIHBvd2VyIDAuMTk5ICAwLjUgLT4gMC40NDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNjAgIHBvd2VyIDAuMDE5OSAgMC41IC0+IDAuMTQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzYxICBwb3dlciAwLjIwMSAgMC41IC0+IDAuNDQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzYyICBwb3dlciAwLjAyMDEgIDAuNSAtPiAwLjE0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM2MyAgcG93ZXIgMC4yMDIgIDAuNSAtPiAwLjQ0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM2NCAgcG93ZXIgMC4wMjAyICAwLjUgLT4gMC4xNDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNjUgIHBvd2VyIDAuMjAzICAwLjUgLT4gMC40NTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNjYgIHBvd2VyIDAuMDIwMyAgMC41IC0+IDAuMTQyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzY3ICBwb3dlciAwLjIwNCAgMC41IC0+IDAuNDUyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzY4ICBwb3dlciAwLjAyMDQgIDAuNSAtPiAwLjE0MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM2OSAgcG93ZXIgMC4yMDUgIDAuNSAtPiAwLjQ1MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM3MCAgcG93ZXIgMC4wMjA1ICAwLjUgLT4gMC4xNDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNzEgIHBvd2VyIDAuMjA2ICAwLjUgLT4gMC40NTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNzIgIHBvd2VyIDAuMDIwNiAgMC41IC0+IDAuMTQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzczICBwb3dlciAwLjIwNyAgMC41IC0+IDAuNDU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzc0ICBwb3dlciAwLjAyMDcgIDAuNSAtPiAwLjE0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM3NSAgcG93ZXIgMC4yMDggIDAuNSAtPiAwLjQ1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM3NiAgcG93ZXIgMC4wMjA4ICAwLjUgLT4gMC4xNDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNzcgIHBvd2VyIDAuMjA5ICAwLjUgLT4gMC40NTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNzggIHBvd2VyIDAuMDIwOSAgMC41IC0+IDAuMTQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzc5ICBwb3dlciAwLjIxMSAgMC41IC0+IDAuNDU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzgwICBwb3dlciAwLjAyMTEgIDAuNSAtPiAwLjE0NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM4MSAgcG93ZXIgMC4yMTIgIDAuNSAtPiAwLjQ2MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM4MiAgcG93ZXIgMC4wMjEyICAwLjUgLT4gMC4xNDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzODMgIHBvd2VyIDAuMjEzICAwLjUgLT4gMC40NjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzODQgIHBvd2VyIDAuMDIxMyAgMC41IC0+IDAuMTQ2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzg1ICBwb3dlciAwLjIxNCAgMC41IC0+IDAuNDYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzg2ICBwb3dlciAwLjAyMTQgIDAuNSAtPiAwLjE0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM4NyAgcG93ZXIgMC4yMTUgIDAuNSAtPiAwLjQ2NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM4OCAgcG93ZXIgMC4wMjE1ICAwLjUgLT4gMC4xNDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzODkgIHBvd2VyIDAuMjE2ICAwLjUgLT4gMC40NjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzOTAgIHBvd2VyIDAuMDIxNiAgMC41IC0+IDAuMTQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzkxICBwb3dlciAwLjIxNyAgMC41IC0+IDAuNDY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzkyICBwb3dlciAwLjAyMTcgIDAuNSAtPiAwLjE0NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM5MyAgcG93ZXIgMC4yMTggIDAuNSAtPiAwLjQ2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM5NCAgcG93ZXIgMC4wMjE4ICAwLjUgLT4gMC4xNDggIEluZXhhY3QgUm91bmRlZAorcHdzeDMzOTUgIHBvd2VyIDAuMjE5ICAwLjUgLT4gMC40NjggIEluZXhhY3QgUm91bmRlZAorcHdzeDMzOTYgIHBvd2VyIDAuMDIxOSAgMC41IC0+IDAuMTQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzk3ICBwb3dlciAwLjIyMSAgMC41IC0+IDAuNDcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzk4ICBwb3dlciAwLjAyMjEgIDAuNSAtPiAwLjE0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM5OSAgcG93ZXIgMC4yMjIgIDAuNSAtPiAwLjQ3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQwMCAgcG93ZXIgMC4wMjIyICAwLjUgLT4gMC4xNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MDEgIHBvd2VyIDAuMjIzICAwLjUgLT4gMC40NzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MDIgIHBvd2VyIDAuMDIyMyAgMC41IC0+IDAuMTQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDAzICBwb3dlciAwLjIyNCAgMC41IC0+IDAuNDczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDA0ICBwb3dlciAwLjAyMjQgIDAuNSAtPiAwLjE1MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQwNSAgcG93ZXIgMC4yMjUgIDAuNSAtPiAwLjQ3NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQwNiAgcG93ZXIgMC4wMjI1ICAwLjUgLT4gMC4xNTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MDcgIHBvd2VyIDAuMjI2ICAwLjUgLT4gMC40NzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MDggIHBvd2VyIDAuMDIyNiAgMC41IC0+IDAuMTUwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDA5ICBwb3dlciAwLjIyNyAgMC41IC0+IDAuNDc2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDEwICBwb3dlciAwLjAyMjcgIDAuNSAtPiAwLjE1MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQxMSAgcG93ZXIgMC4yMjggIDAuNSAtPiAwLjQ3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQxMiAgcG93ZXIgMC4wMjI4ICAwLjUgLT4gMC4xNTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MTMgIHBvd2VyIDAuMjI5ICAwLjUgLT4gMC40NzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MTQgIHBvd2VyIDAuMDIyOSAgMC41IC0+IDAuMTUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDE1ICBwb3dlciAwLjIzMSAgMC41IC0+IDAuNDgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDE2ICBwb3dlciAwLjAyMzEgIDAuNSAtPiAwLjE1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQxNyAgcG93ZXIgMC4yMzIgIDAuNSAtPiAwLjQ4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQxOCAgcG93ZXIgMC4wMjMyICAwLjUgLT4gMC4xNTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MTkgIHBvd2VyIDAuMjMzICAwLjUgLT4gMC40ODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MjAgIHBvd2VyIDAuMDIzMyAgMC41IC0+IDAuMTUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDIxICBwb3dlciAwLjIzNCAgMC41IC0+IDAuNDg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDIyICBwb3dlciAwLjAyMzQgIDAuNSAtPiAwLjE1MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQyMyAgcG93ZXIgMC4yMzUgIDAuNSAtPiAwLjQ4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQyNCAgcG93ZXIgMC4wMjM1ICAwLjUgLT4gMC4xNTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MjUgIHBvd2VyIDAuMjM2ICAwLjUgLT4gMC40ODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MjYgIHBvd2VyIDAuMDIzNiAgMC41IC0+IDAuMTU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDI3ICBwb3dlciAwLjIzNyAgMC41IC0+IDAuNDg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDI4ICBwb3dlciAwLjAyMzcgIDAuNSAtPiAwLjE1NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQyOSAgcG93ZXIgMC4yMzggIDAuNSAtPiAwLjQ4OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQzMCAgcG93ZXIgMC4wMjM4ICAwLjUgLT4gMC4xNTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MzEgIHBvd2VyIDAuMjM5ICAwLjUgLT4gMC40ODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MzIgIHBvd2VyIDAuMDIzOSAgMC41IC0+IDAuMTU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDMzICBwb3dlciAwLjI0MSAgMC41IC0+IDAuNDkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDM0ICBwb3dlciAwLjAyNDEgIDAuNSAtPiAwLjE1NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQzNSAgcG93ZXIgMC4yNDIgIDAuNSAtPiAwLjQ5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQzNiAgcG93ZXIgMC4wMjQyICAwLjUgLT4gMC4xNTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MzcgIHBvd2VyIDAuMjQzICAwLjUgLT4gMC40OTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MzggIHBvd2VyIDAuMDI0MyAgMC41IC0+IDAuMTU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDM5ICBwb3dlciAwLjI0NCAgMC41IC0+IDAuNDk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDQwICBwb3dlciAwLjAyNDQgIDAuNSAtPiAwLjE1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ0MSAgcG93ZXIgMC4yNDUgIDAuNSAtPiAwLjQ5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ0MiAgcG93ZXIgMC4wMjQ1ICAwLjUgLT4gMC4xNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NDMgIHBvd2VyIDAuMjQ2ICAwLjUgLT4gMC40OTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NDQgIHBvd2VyIDAuMDI0NiAgMC41IC0+IDAuMTU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDQ1ICBwb3dlciAwLjI0NyAgMC41IC0+IDAuNDk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDQ2ICBwb3dlciAwLjAyNDcgIDAuNSAtPiAwLjE1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ0NyAgcG93ZXIgMC4yNDggIDAuNSAtPiAwLjQ5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ0OCAgcG93ZXIgMC4wMjQ4ICAwLjUgLT4gMC4xNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NDkgIHBvd2VyIDAuMjQ5ICAwLjUgLT4gMC40OTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NTAgIHBvd2VyIDAuMDI0OSAgMC41IC0+IDAuMTU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDUxICBwb3dlciAwLjI1MSAgMC41IC0+IDAuNTAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDUyICBwb3dlciAwLjAyNTEgIDAuNSAtPiAwLjE1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ1MyAgcG93ZXIgMC4yNTIgIDAuNSAtPiAwLjUwMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ1NCAgcG93ZXIgMC4wMjUyICAwLjUgLT4gMC4xNTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NTUgIHBvd2VyIDAuMjUzICAwLjUgLT4gMC41MDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NTYgIHBvd2VyIDAuMDI1MyAgMC41IC0+IDAuMTU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDU3ICBwb3dlciAwLjI1NCAgMC41IC0+IDAuNTA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDU4ICBwb3dlciAwLjAyNTQgIDAuNSAtPiAwLjE1OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ1OSAgcG93ZXIgMC4yNTUgIDAuNSAtPiAwLjUwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ2MCAgcG93ZXIgMC4wMjU1ICAwLjUgLT4gMC4xNjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NjEgIHBvd2VyIDAuMjU2ICAwLjUgLT4gMC41MDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NjIgIHBvd2VyIDAuMDI1NiAgMC41IC0+IDAuMTYwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDYzICBwb3dlciAwLjI1NyAgMC41IC0+IDAuNTA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDY0ICBwb3dlciAwLjAyNTcgIDAuNSAtPiAwLjE2MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ2NSAgcG93ZXIgMC4yNTggIDAuNSAtPiAwLjUwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ2NiAgcG93ZXIgMC4wMjU4ICAwLjUgLT4gMC4xNjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NjcgIHBvd2VyIDAuMjU5ICAwLjUgLT4gMC41MDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NjggIHBvd2VyIDAuMDI1OSAgMC41IC0+IDAuMTYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDY5ICBwb3dlciAwLjI2MSAgMC41IC0+IDAuNTExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDcwICBwb3dlciAwLjAyNjEgIDAuNSAtPiAwLjE2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ3MSAgcG93ZXIgMC4yNjIgIDAuNSAtPiAwLjUxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ3MiAgcG93ZXIgMC4wMjYyICAwLjUgLT4gMC4xNjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NzMgIHBvd2VyIDAuMjYzICAwLjUgLT4gMC41MTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NzQgIHBvd2VyIDAuMDI2MyAgMC41IC0+IDAuMTYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDc1ICBwb3dlciAwLjI2NCAgMC41IC0+IDAuNTE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDc2ICBwb3dlciAwLjAyNjQgIDAuNSAtPiAwLjE2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ3NyAgcG93ZXIgMC4yNjUgIDAuNSAtPiAwLjUxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ3OCAgcG93ZXIgMC4wMjY1ICAwLjUgLT4gMC4xNjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NzkgIHBvd2VyIDAuMjY2ICAwLjUgLT4gMC41MTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0ODAgIHBvd2VyIDAuMDI2NiAgMC41IC0+IDAuMTYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDgxICBwb3dlciAwLjI2NyAgMC41IC0+IDAuNTE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDgyICBwb3dlciAwLjAyNjcgIDAuNSAtPiAwLjE2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ4MyAgcG93ZXIgMC4yNjggIDAuNSAtPiAwLjUxOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ4NCAgcG93ZXIgMC4wMjY4ICAwLjUgLT4gMC4xNjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0ODUgIHBvd2VyIDAuMjY5ICAwLjUgLT4gMC41MTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0ODYgIHBvd2VyIDAuMDI2OSAgMC41IC0+IDAuMTY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDg3ICBwb3dlciAwLjI3MSAgMC41IC0+IDAuNTIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDg4ICBwb3dlciAwLjAyNzEgIDAuNSAtPiAwLjE2NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ4OSAgcG93ZXIgMC4yNzIgIDAuNSAtPiAwLjUyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ5MCAgcG93ZXIgMC4wMjcyICAwLjUgLT4gMC4xNjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0OTEgIHBvd2VyIDAuMjczICAwLjUgLT4gMC41MjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0OTIgIHBvd2VyIDAuMDI3MyAgMC41IC0+IDAuMTY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDkzICBwb3dlciAwLjI3NCAgMC41IC0+IDAuNTIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDk0ICBwb3dlciAwLjAyNzQgIDAuNSAtPiAwLjE2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ5NSAgcG93ZXIgMC4yNzUgIDAuNSAtPiAwLjUyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ5NiAgcG93ZXIgMC4wMjc1ICAwLjUgLT4gMC4xNjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0OTcgIHBvd2VyIDAuMjc2ICAwLjUgLT4gMC41MjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0OTggIHBvd2VyIDAuMDI3NiAgMC41IC0+IDAuMTY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDk5ICBwb3dlciAwLjI3NyAgMC41IC0+IDAuNTI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTAwICBwb3dlciAwLjAyNzcgIDAuNSAtPiAwLjE2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUwMSAgcG93ZXIgMC4yNzggIDAuNSAtPiAwLjUyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUwMiAgcG93ZXIgMC4wMjc4ICAwLjUgLT4gMC4xNjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MDMgIHBvd2VyIDAuMjc5ICAwLjUgLT4gMC41MjggIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MDQgIHBvd2VyIDAuMDI3OSAgMC41IC0+IDAuMTY3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTA1ICBwb3dlciAwLjI4MSAgMC41IC0+IDAuNTMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTA2ICBwb3dlciAwLjAyODEgIDAuNSAtPiAwLjE2OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUwNyAgcG93ZXIgMC4yODIgIDAuNSAtPiAwLjUzMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUwOCAgcG93ZXIgMC4wMjgyICAwLjUgLT4gMC4xNjggIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MDkgIHBvd2VyIDAuMjgzICAwLjUgLT4gMC41MzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MTAgIHBvd2VyIDAuMDI4MyAgMC41IC0+IDAuMTY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTExICBwb3dlciAwLjI4NCAgMC41IC0+IDAuNTMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTEyICBwb3dlciAwLjAyODQgIDAuNSAtPiAwLjE2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUxMyAgcG93ZXIgMC4yODUgIDAuNSAtPiAwLjUzNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUxNCAgcG93ZXIgMC4wMjg1ICAwLjUgLT4gMC4xNjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MTUgIHBvd2VyIDAuMjg2ICAwLjUgLT4gMC41MzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MTYgIHBvd2VyIDAuMDI4NiAgMC41IC0+IDAuMTY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTE3ICBwb3dlciAwLjI4NyAgMC41IC0+IDAuNTM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTE4ICBwb3dlciAwLjAyODcgIDAuNSAtPiAwLjE2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUxOSAgcG93ZXIgMC4yODggIDAuNSAtPiAwLjUzNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUyMCAgcG93ZXIgMC4wMjg4ICAwLjUgLT4gMC4xNzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MjEgIHBvd2VyIDAuMjg5ICAwLjUgLT4gMC41MzggIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MjIgIHBvd2VyIDAuMDI4OSAgMC41IC0+IDAuMTcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTIzICBwb3dlciAwLjI5MSAgMC41IC0+IDAuNTM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTI0ICBwb3dlciAwLjAyOTEgIDAuNSAtPiAwLjE3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUyNSAgcG93ZXIgMC4yOTIgIDAuNSAtPiAwLjU0MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUyNiAgcG93ZXIgMC4wMjkyICAwLjUgLT4gMC4xNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MjcgIHBvd2VyIDAuMjkzICAwLjUgLT4gMC41NDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MjggIHBvd2VyIDAuMDI5MyAgMC41IC0+IDAuMTcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTI5ICBwb3dlciAwLjI5NCAgMC41IC0+IDAuNTQyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTMwICBwb3dlciAwLjAyOTQgIDAuNSAtPiAwLjE3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUzMSAgcG93ZXIgMC4yOTUgIDAuNSAtPiAwLjU0MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUzMiAgcG93ZXIgMC4wMjk1ICAwLjUgLT4gMC4xNzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MzMgIHBvd2VyIDAuMjk2ICAwLjUgLT4gMC41NDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MzQgIHBvd2VyIDAuMDI5NiAgMC41IC0+IDAuMTcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTM1ICBwb3dlciAwLjI5NyAgMC41IC0+IDAuNTQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTM2ICBwb3dlciAwLjAyOTcgIDAuNSAtPiAwLjE3MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUzNyAgcG93ZXIgMC4yOTggIDAuNSAtPiAwLjU0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUzOCAgcG93ZXIgMC4wMjk4ICAwLjUgLT4gMC4xNzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MzkgIHBvd2VyIDAuMjk5ICAwLjUgLT4gMC41NDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NDAgIHBvd2VyIDAuMDI5OSAgMC41IC0+IDAuMTczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTQxICBwb3dlciAwLjMwMSAgMC41IC0+IDAuNTQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTQyICBwb3dlciAwLjAzMDEgIDAuNSAtPiAwLjE3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU0MyAgcG93ZXIgMC4zMDIgIDAuNSAtPiAwLjU1MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU0NCAgcG93ZXIgMC4wMzAyICAwLjUgLT4gMC4xNzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NDUgIHBvd2VyIDAuMzAzICAwLjUgLT4gMC41NTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NDYgIHBvd2VyIDAuMDMwMyAgMC41IC0+IDAuMTc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTQ3ICBwb3dlciAwLjMwNCAgMC41IC0+IDAuNTUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTQ4ICBwb3dlciAwLjAzMDQgIDAuNSAtPiAwLjE3NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU0OSAgcG93ZXIgMC4zMDUgIDAuNSAtPiAwLjU1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU1MCAgcG93ZXIgMC4wMzA1ICAwLjUgLT4gMC4xNzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NTEgIHBvd2VyIDAuMzA2ICAwLjUgLT4gMC41NTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NTIgIHBvd2VyIDAuMDMwNiAgMC41IC0+IDAuMTc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTUzICBwb3dlciAwLjMwNyAgMC41IC0+IDAuNTU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTU0ICBwb3dlciAwLjAzMDcgIDAuNSAtPiAwLjE3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU1NSAgcG93ZXIgMC4zMDggIDAuNSAtPiAwLjU1NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU1NiAgcG93ZXIgMC4wMzA4ICAwLjUgLT4gMC4xNzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NTcgIHBvd2VyIDAuMzA5ICAwLjUgLT4gMC41NTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NTggIHBvd2VyIDAuMDMwOSAgMC41IC0+IDAuMTc2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTU5ICBwb3dlciAwLjMxMSAgMC41IC0+IDAuNTU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTYwICBwb3dlciAwLjAzMTEgIDAuNSAtPiAwLjE3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU2MSAgcG93ZXIgMC4zMTIgIDAuNSAtPiAwLjU1OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU2MiAgcG93ZXIgMC4wMzEyICAwLjUgLT4gMC4xNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NjMgIHBvd2VyIDAuMzEzICAwLjUgLT4gMC41NTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NjQgIHBvd2VyIDAuMDMxMyAgMC41IC0+IDAuMTc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTY1ICBwb3dlciAwLjMxNCAgMC41IC0+IDAuNTYwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTY2ICBwb3dlciAwLjAzMTQgIDAuNSAtPiAwLjE3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU2NyAgcG93ZXIgMC4zMTUgIDAuNSAtPiAwLjU2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU2OCAgcG93ZXIgMC4wMzE1ICAwLjUgLT4gMC4xNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NjkgIHBvd2VyIDAuMzE2ICAwLjUgLT4gMC41NjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NzAgIHBvd2VyIDAuMDMxNiAgMC41IC0+IDAuMTc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTcxICBwb3dlciAwLjMxNyAgMC41IC0+IDAuNTYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTcyICBwb3dlciAwLjAzMTcgIDAuNSAtPiAwLjE3OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU3MyAgcG93ZXIgMC4zMTggIDAuNSAtPiAwLjU2NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU3NCAgcG93ZXIgMC4wMzE4ICAwLjUgLT4gMC4xNzggIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NzUgIHBvd2VyIDAuMzE5ICAwLjUgLT4gMC41NjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NzYgIHBvd2VyIDAuMDMxOSAgMC41IC0+IDAuMTc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTc3ICBwb3dlciAwLjMyMSAgMC41IC0+IDAuNTY3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTc4ICBwb3dlciAwLjAzMjEgIDAuNSAtPiAwLjE3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU3OSAgcG93ZXIgMC4zMjIgIDAuNSAtPiAwLjU2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU4MCAgcG93ZXIgMC4wMzIyICAwLjUgLT4gMC4xNzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1ODEgIHBvd2VyIDAuMzIzICAwLjUgLT4gMC41NjggIEluZXhhY3QgUm91bmRlZAorcHdzeDM1ODIgIHBvd2VyIDAuMDMyMyAgMC41IC0+IDAuMTgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTgzICBwb3dlciAwLjMyNCAgMC41IC0+IDAuNTY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTg0ICBwb3dlciAwLjAzMjQgIDAuNSAtPiAwLjE4MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU4NSAgcG93ZXIgMC4zMjUgIDAuNSAtPiAwLjU3MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU4NiAgcG93ZXIgMC4wMzI1ICAwLjUgLT4gMC4xODAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1ODcgIHBvd2VyIDAuMzI2ICAwLjUgLT4gMC41NzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1ODggIHBvd2VyIDAuMDMyNiAgMC41IC0+IDAuMTgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTg5ICBwb3dlciAwLjMyNyAgMC41IC0+IDAuNTcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTkwICBwb3dlciAwLjAzMjcgIDAuNSAtPiAwLjE4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU5MSAgcG93ZXIgMC4zMjggIDAuNSAtPiAwLjU3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU5MiAgcG93ZXIgMC4wMzI4ICAwLjUgLT4gMC4xODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1OTMgIHBvd2VyIDAuMzI5ICAwLjUgLT4gMC41NzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1OTQgIHBvd2VyIDAuMDMyOSAgMC41IC0+IDAuMTgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTk1ICBwb3dlciAwLjMzMSAgMC41IC0+IDAuNTc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTk2ICBwb3dlciAwLjAzMzEgIDAuNSAtPiAwLjE4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU5NyAgcG93ZXIgMC4zMzIgIDAuNSAtPiAwLjU3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU5OCAgcG93ZXIgMC4wMzMyICAwLjUgLT4gMC4xODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1OTkgIHBvd2VyIDAuMzMzICAwLjUgLT4gMC41NzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MDAgIHBvd2VyIDAuMDMzMyAgMC41IC0+IDAuMTgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjAxICBwb3dlciAwLjMzNCAgMC41IC0+IDAuNTc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjAyICBwb3dlciAwLjAzMzQgIDAuNSAtPiAwLjE4MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYwMyAgcG93ZXIgMC4zMzUgIDAuNSAtPiAwLjU3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYwNCAgcG93ZXIgMC4wMzM1ICAwLjUgLT4gMC4xODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MDUgIHBvd2VyIDAuMzM2ICAwLjUgLT4gMC41ODAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MDYgIHBvd2VyIDAuMDMzNiAgMC41IC0+IDAuMTgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjA3ICBwb3dlciAwLjMzNyAgMC41IC0+IDAuNTgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjA4ICBwb3dlciAwLjAzMzcgIDAuNSAtPiAwLjE4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYwOSAgcG93ZXIgMC4zMzggIDAuNSAtPiAwLjU4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYxMCAgcG93ZXIgMC4wMzM4ICAwLjUgLT4gMC4xODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MTEgIHBvd2VyIDAuMzM5ICAwLjUgLT4gMC41ODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MTIgIHBvd2VyIDAuMDMzOSAgMC41IC0+IDAuMTg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjEzICBwb3dlciAwLjM0MSAgMC41IC0+IDAuNTg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjE0ICBwb3dlciAwLjAzNDEgIDAuNSAtPiAwLjE4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYxNSAgcG93ZXIgMC4zNDIgIDAuNSAtPiAwLjU4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYxNiAgcG93ZXIgMC4wMzQyICAwLjUgLT4gMC4xODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MTcgIHBvd2VyIDAuMzQzICAwLjUgLT4gMC41ODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MTggIHBvd2VyIDAuMDM0MyAgMC41IC0+IDAuMTg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjE5ICBwb3dlciAwLjM0NCAgMC41IC0+IDAuNTg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjIwICBwb3dlciAwLjAzNDQgIDAuNSAtPiAwLjE4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYyMSAgcG93ZXIgMC4zNDUgIDAuNSAtPiAwLjU4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYyMiAgcG93ZXIgMC4wMzQ1ICAwLjUgLT4gMC4xODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MjMgIHBvd2VyIDAuMzQ2ICAwLjUgLT4gMC41ODggIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MjQgIHBvd2VyIDAuMDM0NiAgMC41IC0+IDAuMTg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjI1ICBwb3dlciAwLjM0NyAgMC41IC0+IDAuNTg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjI2ICBwb3dlciAwLjAzNDcgIDAuNSAtPiAwLjE4NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYyNyAgcG93ZXIgMC4zNDggIDAuNSAtPiAwLjU5MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYyOCAgcG93ZXIgMC4wMzQ4ICAwLjUgLT4gMC4xODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MjkgIHBvd2VyIDAuMzQ5ICAwLjUgLT4gMC41OTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MzAgIHBvd2VyIDAuMDM0OSAgMC41IC0+IDAuMTg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjMxICBwb3dlciAwLjM1MSAgMC41IC0+IDAuNTkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjMyICBwb3dlciAwLjAzNTEgIDAuNSAtPiAwLjE4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYzMyAgcG93ZXIgMC4zNTIgIDAuNSAtPiAwLjU5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYzNCAgcG93ZXIgMC4wMzUyICAwLjUgLT4gMC4xODggIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MzUgIHBvd2VyIDAuMzUzICAwLjUgLT4gMC41OTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MzYgIHBvd2VyIDAuMDM1MyAgMC41IC0+IDAuMTg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjM3ICBwb3dlciAwLjM1NCAgMC41IC0+IDAuNTk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjM4ICBwb3dlciAwLjAzNTQgIDAuNSAtPiAwLjE4OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYzOSAgcG93ZXIgMC4zNTUgIDAuNSAtPiAwLjU5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY0MCAgcG93ZXIgMC4wMzU1ICAwLjUgLT4gMC4xODggIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NDEgIHBvd2VyIDAuMzU2ICAwLjUgLT4gMC41OTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NDIgIHBvd2VyIDAuMDM1NiAgMC41IC0+IDAuMTg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjQzICBwb3dlciAwLjM1NyAgMC41IC0+IDAuNTk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjQ0ICBwb3dlciAwLjAzNTcgIDAuNSAtPiAwLjE4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY0NSAgcG93ZXIgMC4zNTggIDAuNSAtPiAwLjU5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY0NiAgcG93ZXIgMC4wMzU4ICAwLjUgLT4gMC4xODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NDcgIHBvd2VyIDAuMzU5ICAwLjUgLT4gMC41OTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NDggIHBvd2VyIDAuMDM1OSAgMC41IC0+IDAuMTg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjQ5ICBwb3dlciAwLjM2MSAgMC41IC0+IDAuNjAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjUwICBwb3dlciAwLjAzNjEgIDAuNSAtPiAwLjE5MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY1MSAgcG93ZXIgMC4zNjIgIDAuNSAtPiAwLjYwMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY1MiAgcG93ZXIgMC4wMzYyICAwLjUgLT4gMC4xOTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NTMgIHBvd2VyIDAuMzYzICAwLjUgLT4gMC42MDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NTQgIHBvd2VyIDAuMDM2MyAgMC41IC0+IDAuMTkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjU1ICBwb3dlciAwLjM2NCAgMC41IC0+IDAuNjAzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjU2ICBwb3dlciAwLjAzNjQgIDAuNSAtPiAwLjE5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY1NyAgcG93ZXIgMC4zNjUgIDAuNSAtPiAwLjYwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY1OCAgcG93ZXIgMC4wMzY1ICAwLjUgLT4gMC4xOTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NTkgIHBvd2VyIDAuMzY2ICAwLjUgLT4gMC42MDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NjAgIHBvd2VyIDAuMDM2NiAgMC41IC0+IDAuMTkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjYxICBwb3dlciAwLjM2NyAgMC41IC0+IDAuNjA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjYyICBwb3dlciAwLjAzNjcgIDAuNSAtPiAwLjE5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY2MyAgcG93ZXIgMC4zNjggIDAuNSAtPiAwLjYwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY2NCAgcG93ZXIgMC4wMzY4ICAwLjUgLT4gMC4xOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NjUgIHBvd2VyIDAuMzY5ICAwLjUgLT4gMC42MDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NjYgIHBvd2VyIDAuMDM2OSAgMC41IC0+IDAuMTkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjY3ICBwb3dlciAwLjM3MSAgMC41IC0+IDAuNjA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjY4ICBwb3dlciAwLjAzNzEgIDAuNSAtPiAwLjE5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY2OSAgcG93ZXIgMC4zNzIgIDAuNSAtPiAwLjYxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY3MCAgcG93ZXIgMC4wMzcyICAwLjUgLT4gMC4xOTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NzEgIHBvd2VyIDAuMzczICAwLjUgLT4gMC42MTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NzIgIHBvd2VyIDAuMDM3MyAgMC41IC0+IDAuMTkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjczICBwb3dlciAwLjM3NCAgMC41IC0+IDAuNjEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjc0ICBwb3dlciAwLjAzNzQgIDAuNSAtPiAwLjE5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY3NSAgcG93ZXIgMC4zNzUgIDAuNSAtPiAwLjYxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY3NiAgcG93ZXIgMC4wMzc1ICAwLjUgLT4gMC4xOTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NzcgIHBvd2VyIDAuMzc2ICAwLjUgLT4gMC42MTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NzggIHBvd2VyIDAuMDM3NiAgMC41IC0+IDAuMTk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjc5ICBwb3dlciAwLjM3NyAgMC41IC0+IDAuNjE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjgwICBwb3dlciAwLjAzNzcgIDAuNSAtPiAwLjE5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY4MSAgcG93ZXIgMC4zNzggIDAuNSAtPiAwLjYxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY4MiAgcG93ZXIgMC4wMzc4ICAwLjUgLT4gMC4xOTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2ODMgIHBvd2VyIDAuMzc5ICAwLjUgLT4gMC42MTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2ODQgIHBvd2VyIDAuMDM3OSAgMC41IC0+IDAuMTk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjg1ICBwb3dlciAwLjM4MSAgMC41IC0+IDAuNjE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjg2ICBwb3dlciAwLjAzODEgIDAuNSAtPiAwLjE5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY4NyAgcG93ZXIgMC4zODIgIDAuNSAtPiAwLjYxOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY4OCAgcG93ZXIgMC4wMzgyICAwLjUgLT4gMC4xOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2ODkgIHBvd2VyIDAuMzgzICAwLjUgLT4gMC42MTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2OTAgIHBvd2VyIDAuMDM4MyAgMC41IC0+IDAuMTk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjkxICBwb3dlciAwLjM4NCAgMC41IC0+IDAuNjIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjkyICBwb3dlciAwLjAzODQgIDAuNSAtPiAwLjE5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY5MyAgcG93ZXIgMC4zODUgIDAuNSAtPiAwLjYyMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY5NCAgcG93ZXIgMC4wMzg1ICAwLjUgLT4gMC4xOTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2OTUgIHBvd2VyIDAuMzg2ICAwLjUgLT4gMC42MjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2OTYgIHBvd2VyIDAuMDM4NiAgMC41IC0+IDAuMTk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjk3ICBwb3dlciAwLjM4NyAgMC41IC0+IDAuNjIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjk4ICBwb3dlciAwLjAzODcgIDAuNSAtPiAwLjE5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY5OSAgcG93ZXIgMC4zODggIDAuNSAtPiAwLjYyMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcwMCAgcG93ZXIgMC4wMzg4ICAwLjUgLT4gMC4xOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MDEgIHBvd2VyIDAuMzg5ICAwLjUgLT4gMC42MjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MDIgIHBvd2VyIDAuMDM4OSAgMC41IC0+IDAuMTk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzAzICBwb3dlciAwLjM5MSAgMC41IC0+IDAuNjI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzA0ICBwb3dlciAwLjAzOTEgIDAuNSAtPiAwLjE5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcwNSAgcG93ZXIgMC4zOTIgIDAuNSAtPiAwLjYyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcwNiAgcG93ZXIgMC4wMzkyICAwLjUgLT4gMC4xOTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MDcgIHBvd2VyIDAuMzkzICAwLjUgLT4gMC42MjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MDggIHBvd2VyIDAuMDM5MyAgMC41IC0+IDAuMTk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzA5ICBwb3dlciAwLjM5NCAgMC41IC0+IDAuNjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzEwICBwb3dlciAwLjAzOTQgIDAuNSAtPiAwLjE5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcxMSAgcG93ZXIgMC4zOTUgIDAuNSAtPiAwLjYyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcxMiAgcG93ZXIgMC4wMzk1ICAwLjUgLT4gMC4xOTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MTMgIHBvd2VyIDAuMzk2ICAwLjUgLT4gMC42MjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MTQgIHBvd2VyIDAuMDM5NiAgMC41IC0+IDAuMTk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzE1ICBwb3dlciAwLjM5NyAgMC41IC0+IDAuNjMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzE2ICBwb3dlciAwLjAzOTcgIDAuNSAtPiAwLjE5OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcxNyAgcG93ZXIgMC4zOTggIDAuNSAtPiAwLjYzMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcxOCAgcG93ZXIgMC4wMzk4ICAwLjUgLT4gMC4xOTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MTkgIHBvd2VyIDAuMzk5ICAwLjUgLT4gMC42MzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MjAgIHBvd2VyIDAuMDM5OSAgMC41IC0+IDAuMjAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzIxICBwb3dlciAwLjQwMSAgMC41IC0+IDAuNjMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzIyICBwb3dlciAwLjA0MDEgIDAuNSAtPiAwLjIwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcyMyAgcG93ZXIgMC40MDIgIDAuNSAtPiAwLjYzNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcyNCAgcG93ZXIgMC4wNDAyICAwLjUgLT4gMC4yMDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MjUgIHBvd2VyIDAuNDAzICAwLjUgLT4gMC42MzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MjYgIHBvd2VyIDAuMDQwMyAgMC41IC0+IDAuMjAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzI3ICBwb3dlciAwLjQwNCAgMC41IC0+IDAuNjM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzI4ICBwb3dlciAwLjA0MDQgIDAuNSAtPiAwLjIwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcyOSAgcG93ZXIgMC40MDUgIDAuNSAtPiAwLjYzNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzczMCAgcG93ZXIgMC4wNDA1ICAwLjUgLT4gMC4yMDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MzEgIHBvd2VyIDAuNDA2ICAwLjUgLT4gMC42MzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MzIgIHBvd2VyIDAuMDQwNiAgMC41IC0+IDAuMjAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzMzICBwb3dlciAwLjQwNyAgMC41IC0+IDAuNjM4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzM0ICBwb3dlciAwLjA0MDcgIDAuNSAtPiAwLjIwMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzczNSAgcG93ZXIgMC40MDggIDAuNSAtPiAwLjYzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzczNiAgcG93ZXIgMC4wNDA4ICAwLjUgLT4gMC4yMDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MzcgIHBvd2VyIDAuNDA5ICAwLjUgLT4gMC42NDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MzggIHBvd2VyIDAuMDQwOSAgMC41IC0+IDAuMjAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzM5ICBwb3dlciAwLjQxMSAgMC41IC0+IDAuNjQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzQwICBwb3dlciAwLjA0MTEgIDAuNSAtPiAwLjIwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc0MSAgcG93ZXIgMC40MTIgIDAuNSAtPiAwLjY0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc0MiAgcG93ZXIgMC4wNDEyICAwLjUgLT4gMC4yMDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NDMgIHBvd2VyIDAuNDEzICAwLjUgLT4gMC42NDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NDQgIHBvd2VyIDAuMDQxMyAgMC41IC0+IDAuMjAzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzQ1ICBwb3dlciAwLjQxNCAgMC41IC0+IDAuNjQzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzQ2ICBwb3dlciAwLjA0MTQgIDAuNSAtPiAwLjIwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc0NyAgcG93ZXIgMC40MTUgIDAuNSAtPiAwLjY0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc0OCAgcG93ZXIgMC4wNDE1ICAwLjUgLT4gMC4yMDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NDkgIHBvd2VyIDAuNDE2ICAwLjUgLT4gMC42NDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NTAgIHBvd2VyIDAuMDQxNiAgMC41IC0+IDAuMjA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzUxICBwb3dlciAwLjQxNyAgMC41IC0+IDAuNjQ2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzUyICBwb3dlciAwLjA0MTcgIDAuNSAtPiAwLjIwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc1MyAgcG93ZXIgMC40MTggIDAuNSAtPiAwLjY0NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc1NCAgcG93ZXIgMC4wNDE4ICAwLjUgLT4gMC4yMDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NTUgIHBvd2VyIDAuNDE5ICAwLjUgLT4gMC42NDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NTYgIHBvd2VyIDAuMDQxOSAgMC41IC0+IDAuMjA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzU3ICBwb3dlciAwLjQyMSAgMC41IC0+IDAuNjQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzU4ICBwb3dlciAwLjA0MjEgIDAuNSAtPiAwLjIwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc1OSAgcG93ZXIgMC40MjIgIDAuNSAtPiAwLjY1MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc2MCAgcG93ZXIgMC4wNDIyICAwLjUgLT4gMC4yMDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NjEgIHBvd2VyIDAuNDIzICAwLjUgLT4gMC42NTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NjIgIHBvd2VyIDAuMDQyMyAgMC41IC0+IDAuMjA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzYzICBwb3dlciAwLjQyNCAgMC41IC0+IDAuNjUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzY0ICBwb3dlciAwLjA0MjQgIDAuNSAtPiAwLjIwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc2NSAgcG93ZXIgMC40MjUgIDAuNSAtPiAwLjY1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc2NiAgcG93ZXIgMC4wNDI1ICAwLjUgLT4gMC4yMDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NjcgIHBvd2VyIDAuNDI2ICAwLjUgLT4gMC42NTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NjggIHBvd2VyIDAuMDQyNiAgMC41IC0+IDAuMjA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzY5ICBwb3dlciAwLjQyNyAgMC41IC0+IDAuNjUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzcwICBwb3dlciAwLjA0MjcgIDAuNSAtPiAwLjIwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc3MSAgcG93ZXIgMC40MjggIDAuNSAtPiAwLjY1NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc3MiAgcG93ZXIgMC4wNDI4ICAwLjUgLT4gMC4yMDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NzMgIHBvd2VyIDAuNDI5ICAwLjUgLT4gMC42NTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NzQgIHBvd2VyIDAuMDQyOSAgMC41IC0+IDAuMjA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzc1ICBwb3dlciAwLjQzMSAgMC41IC0+IDAuNjU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzc2ICBwb3dlciAwLjA0MzEgIDAuNSAtPiAwLjIwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc3NyAgcG93ZXIgMC40MzIgIDAuNSAtPiAwLjY1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc3OCAgcG93ZXIgMC4wNDMyICAwLjUgLT4gMC4yMDggIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NzkgIHBvd2VyIDAuNDMzICAwLjUgLT4gMC42NTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM3ODAgIHBvd2VyIDAuMDQzMyAgMC41IC0+IDAuMjA4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzgxICBwb3dlciAwLjQzNCAgMC41IC0+IDAuNjU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzgyICBwb3dlciAwLjA0MzQgIDAuNSAtPiAwLjIwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc4MyAgcG93ZXIgMC40MzUgIDAuNSAtPiAwLjY2MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc4NCAgcG93ZXIgMC4wNDM1ICAwLjUgLT4gMC4yMDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3ODUgIHBvd2VyIDAuNDM2ICAwLjUgLT4gMC42NjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3ODYgIHBvd2VyIDAuMDQzNiAgMC41IC0+IDAuMjA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzg3ICBwb3dlciAwLjQzNyAgMC41IC0+IDAuNjYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzg4ICBwb3dlciAwLjA0MzcgIDAuNSAtPiAwLjIwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc4OSAgcG93ZXIgMC40MzggIDAuNSAtPiAwLjY2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc5MCAgcG93ZXIgMC4wNDM4ICAwLjUgLT4gMC4yMDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3OTEgIHBvd2VyIDAuNDM5ICAwLjUgLT4gMC42NjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3OTIgIHBvd2VyIDAuMDQzOSAgMC41IC0+IDAuMjEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzkzICBwb3dlciAwLjQ0MSAgMC41IC0+IDAuNjY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzk0ICBwb3dlciAwLjA0NDEgIDAuNSAtPiAwLjIxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc5NSAgcG93ZXIgMC40NDIgIDAuNSAtPiAwLjY2NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc5NiAgcG93ZXIgMC4wNDQyICAwLjUgLT4gMC4yMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3OTcgIHBvd2VyIDAuNDQzICAwLjUgLT4gMC42NjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3OTggIHBvd2VyIDAuMDQ0MyAgMC41IC0+IDAuMjEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzk5ICBwb3dlciAwLjQ0NCAgMC41IC0+IDAuNjY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODAwICBwb3dlciAwLjA0NDQgIDAuNSAtPiAwLjIxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgwMSAgcG93ZXIgMC40NDUgIDAuNSAtPiAwLjY2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgwMiAgcG93ZXIgMC4wNDQ1ICAwLjUgLT4gMC4yMTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MDMgIHBvd2VyIDAuNDQ2ICAwLjUgLT4gMC42NjggIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MDQgIHBvd2VyIDAuMDQ0NiAgMC41IC0+IDAuMjExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODA1ICBwb3dlciAwLjQ0NyAgMC41IC0+IDAuNjY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODA2ICBwb3dlciAwLjA0NDcgIDAuNSAtPiAwLjIxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgwNyAgcG93ZXIgMC40NDggIDAuNSAtPiAwLjY2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgwOCAgcG93ZXIgMC4wNDQ4ICAwLjUgLT4gMC4yMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MDkgIHBvd2VyIDAuNDQ5ICAwLjUgLT4gMC42NzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MTAgIHBvd2VyIDAuMDQ0OSAgMC41IC0+IDAuMjEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODExICBwb3dlciAwLjQ1MSAgMC41IC0+IDAuNjcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODEyICBwb3dlciAwLjA0NTEgIDAuNSAtPiAwLjIxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgxMyAgcG93ZXIgMC40NTIgIDAuNSAtPiAwLjY3MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgxNCAgcG93ZXIgMC4wNDUyICAwLjUgLT4gMC4yMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MTUgIHBvd2VyIDAuNDUzICAwLjUgLT4gMC42NzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MTYgIHBvd2VyIDAuMDQ1MyAgMC41IC0+IDAuMjEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODE3ICBwb3dlciAwLjQ1NCAgMC41IC0+IDAuNjc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODE4ICBwb3dlciAwLjA0NTQgIDAuNSAtPiAwLjIxMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgxOSAgcG93ZXIgMC40NTUgIDAuNSAtPiAwLjY3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgyMCAgcG93ZXIgMC4wNDU1ICAwLjUgLT4gMC4yMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MjEgIHBvd2VyIDAuNDU2ICAwLjUgLT4gMC42NzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MjIgIHBvd2VyIDAuMDQ1NiAgMC41IC0+IDAuMjE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODIzICBwb3dlciAwLjQ1NyAgMC41IC0+IDAuNjc2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODI0ICBwb3dlciAwLjA0NTcgIDAuNSAtPiAwLjIxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgyNSAgcG93ZXIgMC40NTggIDAuNSAtPiAwLjY3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgyNiAgcG93ZXIgMC4wNDU4ICAwLjUgLT4gMC4yMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MjcgIHBvd2VyIDAuNDU5ICAwLjUgLT4gMC42NzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MjggIHBvd2VyIDAuMDQ1OSAgMC41IC0+IDAuMjE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODI5ICBwb3dlciAwLjQ2MSAgMC41IC0+IDAuNjc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODMwICBwb3dlciAwLjA0NjEgIDAuNSAtPiAwLjIxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgzMSAgcG93ZXIgMC40NjIgIDAuNSAtPiAwLjY4MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgzMiAgcG93ZXIgMC4wNDYyICAwLjUgLT4gMC4yMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MzMgIHBvd2VyIDAuNDYzICAwLjUgLT4gMC42ODAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MzQgIHBvd2VyIDAuMDQ2MyAgMC41IC0+IDAuMjE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODM1ICBwb3dlciAwLjQ2NCAgMC41IC0+IDAuNjgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODM2ICBwb3dlciAwLjA0NjQgIDAuNSAtPiAwLjIxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgzNyAgcG93ZXIgMC40NjUgIDAuNSAtPiAwLjY4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgzOCAgcG93ZXIgMC4wNDY1ICAwLjUgLT4gMC4yMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MzkgIHBvd2VyIDAuNDY2ICAwLjUgLT4gMC42ODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NDAgIHBvd2VyIDAuMDQ2NiAgMC41IC0+IDAuMjE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODQxICBwb3dlciAwLjQ2NyAgMC41IC0+IDAuNjgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODQyICBwb3dlciAwLjA0NjcgIDAuNSAtPiAwLjIxNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg0MyAgcG93ZXIgMC40NjggIDAuNSAtPiAwLjY4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg0NCAgcG93ZXIgMC4wNDY4ICAwLjUgLT4gMC4yMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NDUgIHBvd2VyIDAuNDY5ICAwLjUgLT4gMC42ODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NDYgIHBvd2VyIDAuMDQ2OSAgMC41IC0+IDAuMjE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODQ3ICBwb3dlciAwLjQ3MSAgMC41IC0+IDAuNjg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODQ4ICBwb3dlciAwLjA0NzEgIDAuNSAtPiAwLjIxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg0OSAgcG93ZXIgMC40NzIgIDAuNSAtPiAwLjY4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg1MCAgcG93ZXIgMC4wNDcyICAwLjUgLT4gMC4yMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NTEgIHBvd2VyIDAuNDczICAwLjUgLT4gMC42ODggIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NTIgIHBvd2VyIDAuMDQ3MyAgMC41IC0+IDAuMjE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODUzICBwb3dlciAwLjQ3NCAgMC41IC0+IDAuNjg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODU0ICBwb3dlciAwLjA0NzQgIDAuNSAtPiAwLjIxOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg1NSAgcG93ZXIgMC40NzUgIDAuNSAtPiAwLjY4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg1NiAgcG93ZXIgMC4wNDc1ICAwLjUgLT4gMC4yMTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NTcgIHBvd2VyIDAuNDc2ICAwLjUgLT4gMC42OTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NTggIHBvd2VyIDAuMDQ3NiAgMC41IC0+IDAuMjE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODU5ICBwb3dlciAwLjQ3NyAgMC41IC0+IDAuNjkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODYwICBwb3dlciAwLjA0NzcgIDAuNSAtPiAwLjIxOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg2MSAgcG93ZXIgMC40NzggIDAuNSAtPiAwLjY5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg2MiAgcG93ZXIgMC4wNDc4ICAwLjUgLT4gMC4yMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NjMgIHBvd2VyIDAuNDc5ICAwLjUgLT4gMC42OTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NjQgIHBvd2VyIDAuMDQ3OSAgMC41IC0+IDAuMjE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODY1ICBwb3dlciAwLjQ4MSAgMC41IC0+IDAuNjk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODY2ICBwb3dlciAwLjA0ODEgIDAuNSAtPiAwLjIxOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg2NyAgcG93ZXIgMC40ODIgIDAuNSAtPiAwLjY5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg2OCAgcG93ZXIgMC4wNDgyICAwLjUgLT4gMC4yMjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NjkgIHBvd2VyIDAuNDgzICAwLjUgLT4gMC42OTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NzAgIHBvd2VyIDAuMDQ4MyAgMC41IC0+IDAuMjIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODcxICBwb3dlciAwLjQ4NCAgMC41IC0+IDAuNjk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODcyICBwb3dlciAwLjA0ODQgIDAuNSAtPiAwLjIyMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg3MyAgcG93ZXIgMC40ODUgIDAuNSAtPiAwLjY5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg3NCAgcG93ZXIgMC4wNDg1ICAwLjUgLT4gMC4yMjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NzUgIHBvd2VyIDAuNDg2ICAwLjUgLT4gMC42OTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NzYgIHBvd2VyIDAuMDQ4NiAgMC41IC0+IDAuMjIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODc3ICBwb3dlciAwLjQ4NyAgMC41IC0+IDAuNjk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODc4ICBwb3dlciAwLjA0ODcgIDAuNSAtPiAwLjIyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg3OSAgcG93ZXIgMC40ODggIDAuNSAtPiAwLjY5OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg4MCAgcG93ZXIgMC4wNDg4ICAwLjUgLT4gMC4yMjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4ODEgIHBvd2VyIDAuNDg5ICAwLjUgLT4gMC42OTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4ODIgIHBvd2VyIDAuMDQ4OSAgMC41IC0+IDAuMjIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODgzICBwb3dlciAwLjQ5MSAgMC41IC0+IDAuNzAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODg0ICBwb3dlciAwLjA0OTEgIDAuNSAtPiAwLjIyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg4NSAgcG93ZXIgMC40OTIgIDAuNSAtPiAwLjcwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg4NiAgcG93ZXIgMC4wNDkyICAwLjUgLT4gMC4yMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4ODcgIHBvd2VyIDAuNDkzICAwLjUgLT4gMC43MDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4ODggIHBvd2VyIDAuMDQ5MyAgMC41IC0+IDAuMjIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODg5ICBwb3dlciAwLjQ5NCAgMC41IC0+IDAuNzAzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODkwICBwb3dlciAwLjA0OTQgIDAuNSAtPiAwLjIyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg5MSAgcG93ZXIgMC40OTUgIDAuNSAtPiAwLjcwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg5MiAgcG93ZXIgMC4wNDk1ICAwLjUgLT4gMC4yMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4OTMgIHBvd2VyIDAuNDk2ICAwLjUgLT4gMC43MDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4OTQgIHBvd2VyIDAuMDQ5NiAgMC41IC0+IDAuMjIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODk1ICBwb3dlciAwLjQ5NyAgMC41IC0+IDAuNzA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODk2ICBwb3dlciAwLjA0OTcgIDAuNSAtPiAwLjIyMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg5NyAgcG93ZXIgMC40OTggIDAuNSAtPiAwLjcwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg5OCAgcG93ZXIgMC4wNDk4ICAwLjUgLT4gMC4yMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4OTkgIHBvd2VyIDAuNDk5ICAwLjUgLT4gMC43MDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MDAgIHBvd2VyIDAuMDQ5OSAgMC41IC0+IDAuMjIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTAxICBwb3dlciAwLjUwMSAgMC41IC0+IDAuNzA4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTAyICBwb3dlciAwLjA1MDEgIDAuNSAtPiAwLjIyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkwMyAgcG93ZXIgMC41MDIgIDAuNSAtPiAwLjcwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkwNCAgcG93ZXIgMC4wNTAyICAwLjUgLT4gMC4yMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MDUgIHBvd2VyIDAuNTAzICAwLjUgLT4gMC43MDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MDYgIHBvd2VyIDAuMDUwMyAgMC41IC0+IDAuMjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTA3ICBwb3dlciAwLjUwNCAgMC41IC0+IDAuNzEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTA4ICBwb3dlciAwLjA1MDQgIDAuNSAtPiAwLjIyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkwOSAgcG93ZXIgMC41MDUgIDAuNSAtPiAwLjcxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkxMCAgcG93ZXIgMC4wNTA1ICAwLjUgLT4gMC4yMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MTEgIHBvd2VyIDAuNTA2ICAwLjUgLT4gMC43MTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MTIgIHBvd2VyIDAuMDUwNiAgMC41IC0+IDAuMjI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTEzICBwb3dlciAwLjUwNyAgMC41IC0+IDAuNzEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTE0ICBwb3dlciAwLjA1MDcgIDAuNSAtPiAwLjIyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkxNSAgcG93ZXIgMC41MDggIDAuNSAtPiAwLjcxMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkxNiAgcG93ZXIgMC4wNTA4ICAwLjUgLT4gMC4yMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MTcgIHBvd2VyIDAuNTA5ICAwLjUgLT4gMC43MTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MTggIHBvd2VyIDAuMDUwOSAgMC41IC0+IDAuMjI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTE5ICBwb3dlciAwLjUxMSAgMC41IC0+IDAuNzE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTIwICBwb3dlciAwLjA1MTEgIDAuNSAtPiAwLjIyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkyMSAgcG93ZXIgMC41MTIgIDAuNSAtPiAwLjcxNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkyMiAgcG93ZXIgMC4wNTEyICAwLjUgLT4gMC4yMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MjMgIHBvd2VyIDAuNTEzICAwLjUgLT4gMC43MTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MjQgIHBvd2VyIDAuMDUxMyAgMC41IC0+IDAuMjI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTI1ICBwb3dlciAwLjUxNCAgMC41IC0+IDAuNzE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTI2ICBwb3dlciAwLjA1MTQgIDAuNSAtPiAwLjIyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkyNyAgcG93ZXIgMC41MTUgIDAuNSAtPiAwLjcxOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkyOCAgcG93ZXIgMC4wNTE1ICAwLjUgLT4gMC4yMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MjkgIHBvd2VyIDAuNTE2ICAwLjUgLT4gMC43MTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MzAgIHBvd2VyIDAuMDUxNiAgMC41IC0+IDAuMjI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTMxICBwb3dlciAwLjUxNyAgMC41IC0+IDAuNzE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTMyICBwb3dlciAwLjA1MTcgIDAuNSAtPiAwLjIyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkzMyAgcG93ZXIgMC41MTggIDAuNSAtPiAwLjcyMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkzNCAgcG93ZXIgMC4wNTE4ICAwLjUgLT4gMC4yMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MzUgIHBvd2VyIDAuNTE5ICAwLjUgLT4gMC43MjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MzYgIHBvd2VyIDAuMDUxOSAgMC41IC0+IDAuMjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTM3ICBwb3dlciAwLjUyMSAgMC41IC0+IDAuNzIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTM4ICBwb3dlciAwLjA1MjEgIDAuNSAtPiAwLjIyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkzOSAgcG93ZXIgMC41MjIgIDAuNSAtPiAwLjcyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk0MCAgcG93ZXIgMC4wNTIyICAwLjUgLT4gMC4yMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NDEgIHBvd2VyIDAuNTIzICAwLjUgLT4gMC43MjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NDIgIHBvd2VyIDAuMDUyMyAgMC41IC0+IDAuMjI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTQzICBwb3dlciAwLjUyNCAgMC41IC0+IDAuNzI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTQ0ICBwb3dlciAwLjA1MjQgIDAuNSAtPiAwLjIyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk0NSAgcG93ZXIgMC41MjUgIDAuNSAtPiAwLjcyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk0NiAgcG93ZXIgMC4wNTI1ICAwLjUgLT4gMC4yMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NDcgIHBvd2VyIDAuNTI2ICAwLjUgLT4gMC43MjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NDggIHBvd2VyIDAuMDUyNiAgMC41IC0+IDAuMjI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTQ5ICBwb3dlciAwLjUyNyAgMC41IC0+IDAuNzI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTUwICBwb3dlciAwLjA1MjcgIDAuNSAtPiAwLjIzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk1MSAgcG93ZXIgMC41MjggIDAuNSAtPiAwLjcyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk1MiAgcG93ZXIgMC4wNTI4ICAwLjUgLT4gMC4yMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NTMgIHBvd2VyIDAuNTI5ICAwLjUgLT4gMC43MjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NTQgIHBvd2VyIDAuMDUyOSAgMC41IC0+IDAuMjMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTU1ICBwb3dlciAwLjUzMSAgMC41IC0+IDAuNzI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTU2ICBwb3dlciAwLjA1MzEgIDAuNSAtPiAwLjIzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk1NyAgcG93ZXIgMC41MzIgIDAuNSAtPiAwLjcyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk1OCAgcG93ZXIgMC4wNTMyICAwLjUgLT4gMC4yMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NTkgIHBvd2VyIDAuNTMzICAwLjUgLT4gMC43MzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NjAgIHBvd2VyIDAuMDUzMyAgMC41IC0+IDAuMjMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTYxICBwb3dlciAwLjUzNCAgMC41IC0+IDAuNzMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTYyICBwb3dlciAwLjA1MzQgIDAuNSAtPiAwLjIzMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk2MyAgcG93ZXIgMC41MzUgIDAuNSAtPiAwLjczMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk2NCAgcG93ZXIgMC4wNTM1ICAwLjUgLT4gMC4yMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NjUgIHBvd2VyIDAuNTM2ICAwLjUgLT4gMC43MzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NjYgIHBvd2VyIDAuMDUzNiAgMC41IC0+IDAuMjMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTY3ICBwb3dlciAwLjUzNyAgMC41IC0+IDAuNzMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTY4ICBwb3dlciAwLjA1MzcgIDAuNSAtPiAwLjIzMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk2OSAgcG93ZXIgMC41MzggIDAuNSAtPiAwLjczMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk3MCAgcG93ZXIgMC4wNTM4ICAwLjUgLT4gMC4yMzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NzEgIHBvd2VyIDAuNTM5ICAwLjUgLT4gMC43MzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NzIgIHBvd2VyIDAuMDUzOSAgMC41IC0+IDAuMjMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTczICBwb3dlciAwLjU0MSAgMC41IC0+IDAuNzM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTc0ICBwb3dlciAwLjA1NDEgIDAuNSAtPiAwLjIzMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk3NSAgcG93ZXIgMC41NDIgIDAuNSAtPiAwLjczNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk3NiAgcG93ZXIgMC4wNTQyICAwLjUgLT4gMC4yMzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NzcgIHBvd2VyIDAuNTQzICAwLjUgLT4gMC43MzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NzggIHBvd2VyIDAuMDU0MyAgMC41IC0+IDAuMjMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTc5ICBwb3dlciAwLjU0NCAgMC41IC0+IDAuNzM4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTgwICBwb3dlciAwLjA1NDQgIDAuNSAtPiAwLjIzMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk4MSAgcG93ZXIgMC41NDUgIDAuNSAtPiAwLjczOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk4MiAgcG93ZXIgMC4wNTQ1ICAwLjUgLT4gMC4yMzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5ODMgIHBvd2VyIDAuNTQ2ICAwLjUgLT4gMC43MzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5ODQgIHBvd2VyIDAuMDU0NiAgMC41IC0+IDAuMjM0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTg1ICBwb3dlciAwLjU0NyAgMC41IC0+IDAuNzQwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTg2ICBwb3dlciAwLjA1NDcgIDAuNSAtPiAwLjIzNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk4NyAgcG93ZXIgMC41NDggIDAuNSAtPiAwLjc0MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk4OCAgcG93ZXIgMC4wNTQ4ICAwLjUgLT4gMC4yMzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5ODkgIHBvd2VyIDAuNTQ5ICAwLjUgLT4gMC43NDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5OTAgIHBvd2VyIDAuMDU0OSAgMC41IC0+IDAuMjM0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTkxICBwb3dlciAwLjU1MSAgMC41IC0+IDAuNzQyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTkyICBwb3dlciAwLjA1NTEgIDAuNSAtPiAwLjIzNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk5MyAgcG93ZXIgMC41NTIgIDAuNSAtPiAwLjc0MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk5NCAgcG93ZXIgMC4wNTUyICAwLjUgLT4gMC4yMzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5OTUgIHBvd2VyIDAuNTUzICAwLjUgLT4gMC43NDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5OTYgIHBvd2VyIDAuMDU1MyAgMC41IC0+IDAuMjM1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTk3ICBwb3dlciAwLjU1NCAgMC41IC0+IDAuNzQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTk4ICBwb3dlciAwLjA1NTQgIDAuNSAtPiAwLjIzNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk5OSAgcG93ZXIgMC41NTUgIDAuNSAtPiAwLjc0NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAwMCAgcG93ZXIgMC4wNTU1ICAwLjUgLT4gMC4yMzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMDEgIHBvd2VyIDAuNTU2ICAwLjUgLT4gMC43NDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMDIgIHBvd2VyIDAuMDU1NiAgMC41IC0+IDAuMjM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDAzICBwb3dlciAwLjU1NyAgMC41IC0+IDAuNzQ2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDA0ICBwb3dlciAwLjA1NTcgIDAuNSAtPiAwLjIzNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAwNSAgcG93ZXIgMC41NTggIDAuNSAtPiAwLjc0NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAwNiAgcG93ZXIgMC4wNTU4ICAwLjUgLT4gMC4yMzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMDcgIHBvd2VyIDAuNTU5ICAwLjUgLT4gMC43NDggIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMDggIHBvd2VyIDAuMDU1OSAgMC41IC0+IDAuMjM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDA5ICBwb3dlciAwLjU2MSAgMC41IC0+IDAuNzQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDEwICBwb3dlciAwLjA1NjEgIDAuNSAtPiAwLjIzNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAxMSAgcG93ZXIgMC41NjIgIDAuNSAtPiAwLjc1MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAxMiAgcG93ZXIgMC4wNTYyICAwLjUgLT4gMC4yMzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMTMgIHBvd2VyIDAuNTYzICAwLjUgLT4gMC43NTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMTQgIHBvd2VyIDAuMDU2MyAgMC41IC0+IDAuMjM3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDE1ICBwb3dlciAwLjU2NCAgMC41IC0+IDAuNzUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDE2ICBwb3dlciAwLjA1NjQgIDAuNSAtPiAwLjIzNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAxNyAgcG93ZXIgMC41NjUgIDAuNSAtPiAwLjc1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAxOCAgcG93ZXIgMC4wNTY1ICAwLjUgLT4gMC4yMzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMTkgIHBvd2VyIDAuNTY2ICAwLjUgLT4gMC43NTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMjAgIHBvd2VyIDAuMDU2NiAgMC41IC0+IDAuMjM4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDIxICBwb3dlciAwLjU2NyAgMC41IC0+IDAuNzUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDIyICBwb3dlciAwLjA1NjcgIDAuNSAtPiAwLjIzOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAyMyAgcG93ZXIgMC41NjggIDAuNSAtPiAwLjc1NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAyNCAgcG93ZXIgMC4wNTY4ICAwLjUgLT4gMC4yMzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMjUgIHBvd2VyIDAuNTY5ICAwLjUgLT4gMC43NTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMjYgIHBvd2VyIDAuMDU2OSAgMC41IC0+IDAuMjM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDI3ICBwb3dlciAwLjU3MSAgMC41IC0+IDAuNzU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDI4ICBwb3dlciAwLjA1NzEgIDAuNSAtPiAwLjIzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAyOSAgcG93ZXIgMC41NzIgIDAuNSAtPiAwLjc1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAzMCAgcG93ZXIgMC4wNTcyICAwLjUgLT4gMC4yMzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMzEgIHBvd2VyIDAuNTczICAwLjUgLT4gMC43NTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMzIgIHBvd2VyIDAuMDU3MyAgMC41IC0+IDAuMjM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDMzICBwb3dlciAwLjU3NCAgMC41IC0+IDAuNzU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDM0ICBwb3dlciAwLjA1NzQgIDAuNSAtPiAwLjI0MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAzNSAgcG93ZXIgMC41NzUgIDAuNSAtPiAwLjc1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAzNiAgcG93ZXIgMC4wNTc1ICAwLjUgLT4gMC4yNDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMzcgIHBvd2VyIDAuNTc2ICAwLjUgLT4gMC43NTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMzggIHBvd2VyIDAuMDU3NiAgMC41IC0+IDAuMjQwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDM5ICBwb3dlciAwLjU3NyAgMC41IC0+IDAuNzYwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDQwICBwb3dlciAwLjA1NzcgIDAuNSAtPiAwLjI0MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA0MSAgcG93ZXIgMC41NzggIDAuNSAtPiAwLjc2MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA0MiAgcG93ZXIgMC4wNTc4ICAwLjUgLT4gMC4yNDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNDMgIHBvd2VyIDAuNTc5ICAwLjUgLT4gMC43NjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNDQgIHBvd2VyIDAuMDU3OSAgMC41IC0+IDAuMjQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDQ1ICBwb3dlciAwLjU4MSAgMC41IC0+IDAuNzYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDQ2ICBwb3dlciAwLjA1ODEgIDAuNSAtPiAwLjI0MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA0NyAgcG93ZXIgMC41ODIgIDAuNSAtPiAwLjc2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA0OCAgcG93ZXIgMC4wNTgyICAwLjUgLT4gMC4yNDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNDkgIHBvd2VyIDAuNTgzICAwLjUgLT4gMC43NjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNTAgIHBvd2VyIDAuMDU4MyAgMC41IC0+IDAuMjQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDUxICBwb3dlciAwLjU4NCAgMC41IC0+IDAuNzY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDUyICBwb3dlciAwLjA1ODQgIDAuNSAtPiAwLjI0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA1MyAgcG93ZXIgMC41ODUgIDAuNSAtPiAwLjc2NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA1NCAgcG93ZXIgMC4wNTg1ICAwLjUgLT4gMC4yNDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNTUgIHBvd2VyIDAuNTg2ICAwLjUgLT4gMC43NjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNTYgIHBvd2VyIDAuMDU4NiAgMC41IC0+IDAuMjQyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDU3ICBwb3dlciAwLjU4NyAgMC41IC0+IDAuNzY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDU4ICBwb3dlciAwLjA1ODcgIDAuNSAtPiAwLjI0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA1OSAgcG93ZXIgMC41ODggIDAuNSAtPiAwLjc2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA2MCAgcG93ZXIgMC4wNTg4ICAwLjUgLT4gMC4yNDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNjEgIHBvd2VyIDAuNTg5ICAwLjUgLT4gMC43NjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNjIgIHBvd2VyIDAuMDU4OSAgMC41IC0+IDAuMjQzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDYzICBwb3dlciAwLjU5MSAgMC41IC0+IDAuNzY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDY0ICBwb3dlciAwLjA1OTEgIDAuNSAtPiAwLjI0MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA2NSAgcG93ZXIgMC41OTIgIDAuNSAtPiAwLjc2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA2NiAgcG93ZXIgMC4wNTkyICAwLjUgLT4gMC4yNDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNjcgIHBvd2VyIDAuNTkzICAwLjUgLT4gMC43NzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNjggIHBvd2VyIDAuMDU5MyAgMC41IC0+IDAuMjQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDY5ICBwb3dlciAwLjU5NCAgMC41IC0+IDAuNzcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDcwICBwb3dlciAwLjA1OTQgIDAuNSAtPiAwLjI0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA3MSAgcG93ZXIgMC41OTUgIDAuNSAtPiAwLjc3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA3MiAgcG93ZXIgMC4wNTk1ICAwLjUgLT4gMC4yNDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNzMgIHBvd2VyIDAuNTk2ICAwLjUgLT4gMC43NzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNzQgIHBvd2VyIDAuMDU5NiAgMC41IC0+IDAuMjQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDc1ICBwb3dlciAwLjU5NyAgMC41IC0+IDAuNzczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDc2ICBwb3dlciAwLjA1OTcgIDAuNSAtPiAwLjI0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA3NyAgcG93ZXIgMC41OTggIDAuNSAtPiAwLjc3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA3OCAgcG93ZXIgMC4wNTk4ICAwLjUgLT4gMC4yNDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNzkgIHBvd2VyIDAuNTk5ICAwLjUgLT4gMC43NzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwODAgIHBvd2VyIDAuMDU5OSAgMC41IC0+IDAuMjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDgxICBwb3dlciAwLjYwMSAgMC41IC0+IDAuNzc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDgyICBwb3dlciAwLjA2MDEgIDAuNSAtPiAwLjI0NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA4MyAgcG93ZXIgMC42MDIgIDAuNSAtPiAwLjc3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA4NCAgcG93ZXIgMC4wNjAyICAwLjUgLT4gMC4yNDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwODUgIHBvd2VyIDAuNjAzICAwLjUgLT4gMC43NzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwODYgIHBvd2VyIDAuMDYwMyAgMC41IC0+IDAuMjQ2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDg3ICBwb3dlciAwLjYwNCAgMC41IC0+IDAuNzc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDg4ICBwb3dlciAwLjA2MDQgIDAuNSAtPiAwLjI0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA4OSAgcG93ZXIgMC42MDUgIDAuNSAtPiAwLjc3OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA5MCAgcG93ZXIgMC4wNjA1ICAwLjUgLT4gMC4yNDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwOTEgIHBvd2VyIDAuNjA2ICAwLjUgLT4gMC43NzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQwOTIgIHBvd2VyIDAuMDYwNiAgMC41IC0+IDAuMjQ2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDkzICBwb3dlciAwLjYwNyAgMC41IC0+IDAuNzc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDk0ICBwb3dlciAwLjA2MDcgIDAuNSAtPiAwLjI0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA5NSAgcG93ZXIgMC42MDggIDAuNSAtPiAwLjc4MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA5NiAgcG93ZXIgMC4wNjA4ICAwLjUgLT4gMC4yNDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwOTcgIHBvd2VyIDAuNjA5ICAwLjUgLT4gMC43ODAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwOTggIHBvd2VyIDAuMDYwOSAgMC41IC0+IDAuMjQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDk5ICBwb3dlciAwLjYxMSAgMC41IC0+IDAuNzgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTAwICBwb3dlciAwLjA2MTEgIDAuNSAtPiAwLjI0NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEwMSAgcG93ZXIgMC42MTIgIDAuNSAtPiAwLjc4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEwMiAgcG93ZXIgMC4wNjEyICAwLjUgLT4gMC4yNDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMDMgIHBvd2VyIDAuNjEzICAwLjUgLT4gMC43ODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMDQgIHBvd2VyIDAuMDYxMyAgMC41IC0+IDAuMjQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTA1ICBwb3dlciAwLjYxNCAgMC41IC0+IDAuNzg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTA2ICBwb3dlciAwLjA2MTQgIDAuNSAtPiAwLjI0OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEwNyAgcG93ZXIgMC42MTUgIDAuNSAtPiAwLjc4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEwOCAgcG93ZXIgMC4wNjE1ICAwLjUgLT4gMC4yNDggIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMDkgIHBvd2VyIDAuNjE2ICAwLjUgLT4gMC43ODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMTAgIHBvd2VyIDAuMDYxNiAgMC41IC0+IDAuMjQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTExICBwb3dlciAwLjYxNyAgMC41IC0+IDAuNzg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTEyICBwb3dlciAwLjA2MTcgIDAuNSAtPiAwLjI0OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDExMyAgcG93ZXIgMC42MTggIDAuNSAtPiAwLjc4NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDExNCAgcG93ZXIgMC4wNjE4ICAwLjUgLT4gMC4yNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMTUgIHBvd2VyIDAuNjE5ICAwLjUgLT4gMC43ODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMTYgIHBvd2VyIDAuMDYxOSAgMC41IC0+IDAuMjQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTE3ICBwb3dlciAwLjYyMSAgMC41IC0+IDAuNzg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTE4ICBwb3dlciAwLjA2MjEgIDAuNSAtPiAwLjI0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDExOSAgcG93ZXIgMC42MjIgIDAuNSAtPiAwLjc4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEyMCAgcG93ZXIgMC4wNjIyICAwLjUgLT4gMC4yNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMjEgIHBvd2VyIDAuNjIzICAwLjUgLT4gMC43ODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMjIgIHBvd2VyIDAuMDYyMyAgMC41IC0+IDAuMjUwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTIzICBwb3dlciAwLjYyNCAgMC41IC0+IDAuNzkwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTI0ICBwb3dlciAwLjA2MjQgIDAuNSAtPiAwLjI1MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEyNSAgcG93ZXIgMC42MjUgIDAuNSAtPiAwLjc5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEyNiAgcG93ZXIgMC4wNjI1ICAwLjUgLT4gMC4yNTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMjcgIHBvd2VyIDAuNjI2ICAwLjUgLT4gMC43OTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMjggIHBvd2VyIDAuMDYyNiAgMC41IC0+IDAuMjUwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTI5ICBwb3dlciAwLjYyNyAgMC41IC0+IDAuNzkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTMwICBwb3dlciAwLjA2MjcgIDAuNSAtPiAwLjI1MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEzMSAgcG93ZXIgMC42MjggIDAuNSAtPiAwLjc5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEzMiAgcG93ZXIgMC4wNjI4ICAwLjUgLT4gMC4yNTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMzMgIHBvd2VyIDAuNjI5ICAwLjUgLT4gMC43OTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMzQgIHBvd2VyIDAuMDYyOSAgMC41IC0+IDAuMjUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTM1ICBwb3dlciAwLjYzMSAgMC41IC0+IDAuNzk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTM2ICBwb3dlciAwLjA2MzEgIDAuNSAtPiAwLjI1MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEzNyAgcG93ZXIgMC42MzIgIDAuNSAtPiAwLjc5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEzOCAgcG93ZXIgMC4wNjMyICAwLjUgLT4gMC4yNTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMzkgIHBvd2VyIDAuNjMzICAwLjUgLT4gMC43OTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNDAgIHBvd2VyIDAuMDYzMyAgMC41IC0+IDAuMjUyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTQxICBwb3dlciAwLjYzNCAgMC41IC0+IDAuNzk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTQyICBwb3dlciAwLjA2MzQgIDAuNSAtPiAwLjI1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE0MyAgcG93ZXIgMC42MzUgIDAuNSAtPiAwLjc5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE0NCAgcG93ZXIgMC4wNjM1ICAwLjUgLT4gMC4yNTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNDUgIHBvd2VyIDAuNjM2ICAwLjUgLT4gMC43OTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNDYgIHBvd2VyIDAuMDYzNiAgMC41IC0+IDAuMjUyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTQ3ICBwb3dlciAwLjYzNyAgMC41IC0+IDAuNzk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTQ4ICBwb3dlciAwLjA2MzcgIDAuNSAtPiAwLjI1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE0OSAgcG93ZXIgMC42MzggIDAuNSAtPiAwLjc5OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE1MCAgcG93ZXIgMC4wNjM4ICAwLjUgLT4gMC4yNTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNTEgIHBvd2VyIDAuNjM5ICAwLjUgLT4gMC43OTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNTIgIHBvd2VyIDAuMDYzOSAgMC41IC0+IDAuMjUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTUzICBwb3dlciAwLjY0MSAgMC41IC0+IDAuODAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTU0ICBwb3dlciAwLjA2NDEgIDAuNSAtPiAwLjI1MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE1NSAgcG93ZXIgMC42NDIgIDAuNSAtPiAwLjgwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE1NiAgcG93ZXIgMC4wNjQyICAwLjUgLT4gMC4yNTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNTcgIHBvd2VyIDAuNjQzICAwLjUgLT4gMC44MDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNTggIHBvd2VyIDAuMDY0MyAgMC41IC0+IDAuMjU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTU5ICBwb3dlciAwLjY0NCAgMC41IC0+IDAuODAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTYwICBwb3dlciAwLjA2NDQgIDAuNSAtPiAwLjI1NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE2MSAgcG93ZXIgMC42NDUgIDAuNSAtPiAwLjgwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE2MiAgcG93ZXIgMC4wNjQ1ICAwLjUgLT4gMC4yNTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNjMgIHBvd2VyIDAuNjQ2ICAwLjUgLT4gMC44MDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNjQgIHBvd2VyIDAuMDY0NiAgMC41IC0+IDAuMjU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTY1ICBwb3dlciAwLjY0NyAgMC41IC0+IDAuODA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTY2ICBwb3dlciAwLjA2NDcgIDAuNSAtPiAwLjI1NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE2NyAgcG93ZXIgMC42NDggIDAuNSAtPiAwLjgwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE2OCAgcG93ZXIgMC4wNjQ4ICAwLjUgLT4gMC4yNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNjkgIHBvd2VyIDAuNjQ5ICAwLjUgLT4gMC44MDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNzAgIHBvd2VyIDAuMDY0OSAgMC41IC0+IDAuMjU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTcxICBwb3dlciAwLjY1MSAgMC41IC0+IDAuODA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTcyICBwb3dlciAwLjA2NTEgIDAuNSAtPiAwLjI1NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE3MyAgcG93ZXIgMC42NTIgIDAuNSAtPiAwLjgwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE3NCAgcG93ZXIgMC4wNjUyICAwLjUgLT4gMC4yNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNzUgIHBvd2VyIDAuNjUzICAwLjUgLT4gMC44MDggIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNzYgIHBvd2VyIDAuMDY1MyAgMC41IC0+IDAuMjU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTc3ICBwb3dlciAwLjY1NCAgMC41IC0+IDAuODA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTc4ICBwb3dlciAwLjA2NTQgIDAuNSAtPiAwLjI1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE3OSAgcG93ZXIgMC42NTUgIDAuNSAtPiAwLjgwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE4MCAgcG93ZXIgMC4wNjU1ICAwLjUgLT4gMC4yNTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxODEgIHBvd2VyIDAuNjU2ICAwLjUgLT4gMC44MTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxODIgIHBvd2VyIDAuMDY1NiAgMC41IC0+IDAuMjU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTgzICBwb3dlciAwLjY1NyAgMC41IC0+IDAuODExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTg0ICBwb3dlciAwLjA2NTcgIDAuNSAtPiAwLjI1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE4NSAgcG93ZXIgMC42NTggIDAuNSAtPiAwLjgxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE4NiAgcG93ZXIgMC4wNjU4ICAwLjUgLT4gMC4yNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxODcgIHBvd2VyIDAuNjU5ICAwLjUgLT4gMC44MTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxODggIHBvd2VyIDAuMDY1OSAgMC41IC0+IDAuMjU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTg5ICBwb3dlciAwLjY2MSAgMC41IC0+IDAuODEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTkwICBwb3dlciAwLjA2NjEgIDAuNSAtPiAwLjI1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE5MSAgcG93ZXIgMC42NjIgIDAuNSAtPiAwLjgxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE5MiAgcG93ZXIgMC4wNjYyICAwLjUgLT4gMC4yNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxOTMgIHBvd2VyIDAuNjYzICAwLjUgLT4gMC44MTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxOTQgIHBvd2VyIDAuMDY2MyAgMC41IC0+IDAuMjU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTk1ICBwb3dlciAwLjY2NCAgMC41IC0+IDAuODE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTk2ICBwb3dlciAwLjA2NjQgIDAuNSAtPiAwLjI1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE5NyAgcG93ZXIgMC42NjUgIDAuNSAtPiAwLjgxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE5OCAgcG93ZXIgMC4wNjY1ICAwLjUgLT4gMC4yNTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQxOTkgIHBvd2VyIDAuNjY2ICAwLjUgLT4gMC44MTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMDAgIHBvd2VyIDAuMDY2NiAgMC41IC0+IDAuMjU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjAxICBwb3dlciAwLjY2NyAgMC41IC0+IDAuODE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjAyICBwb3dlciAwLjA2NjcgIDAuNSAtPiAwLjI1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIwMyAgcG93ZXIgMC42NjggIDAuNSAtPiAwLjgxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIwNCAgcG93ZXIgMC4wNjY4ICAwLjUgLT4gMC4yNTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMDUgIHBvd2VyIDAuNjY5ICAwLjUgLT4gMC44MTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMDYgIHBvd2VyIDAuMDY2OSAgMC41IC0+IDAuMjU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjA3ICBwb3dlciAwLjY3MSAgMC41IC0+IDAuODE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjA4ICBwb3dlciAwLjA2NzEgIDAuNSAtPiAwLjI1OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIwOSAgcG93ZXIgMC42NzIgIDAuNSAtPiAwLjgyMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIxMCAgcG93ZXIgMC4wNjcyICAwLjUgLT4gMC4yNTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMTEgIHBvd2VyIDAuNjczICAwLjUgLT4gMC44MjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMTIgIHBvd2VyIDAuMDY3MyAgMC41IC0+IDAuMjU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjEzICBwb3dlciAwLjY3NCAgMC41IC0+IDAuODIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjE0ICBwb3dlciAwLjA2NzQgIDAuNSAtPiAwLjI2MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIxNSAgcG93ZXIgMC42NzUgIDAuNSAtPiAwLjgyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIxNiAgcG93ZXIgMC4wNjc1ICAwLjUgLT4gMC4yNjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMTcgIHBvd2VyIDAuNjc2ICAwLjUgLT4gMC44MjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMTggIHBvd2VyIDAuMDY3NiAgMC41IC0+IDAuMjYwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjE5ICBwb3dlciAwLjY3NyAgMC41IC0+IDAuODIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjIwICBwb3dlciAwLjA2NzcgIDAuNSAtPiAwLjI2MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIyMSAgcG93ZXIgMC42NzggIDAuNSAtPiAwLjgyMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIyMiAgcG93ZXIgMC4wNjc4ICAwLjUgLT4gMC4yNjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMjMgIHBvd2VyIDAuNjc5ICAwLjUgLT4gMC44MjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMjQgIHBvd2VyIDAuMDY3OSAgMC41IC0+IDAuMjYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjI1ICBwb3dlciAwLjY4MSAgMC41IC0+IDAuODI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjI2ICBwb3dlciAwLjA2ODEgIDAuNSAtPiAwLjI2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIyNyAgcG93ZXIgMC42ODIgIDAuNSAtPiAwLjgyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIyOCAgcG93ZXIgMC4wNjgyICAwLjUgLT4gMC4yNjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMjkgIHBvd2VyIDAuNjgzICAwLjUgLT4gMC44MjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMzAgIHBvd2VyIDAuMDY4MyAgMC41IC0+IDAuMjYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjMxICBwb3dlciAwLjY4NCAgMC41IC0+IDAuODI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjMyICBwb3dlciAwLjA2ODQgIDAuNSAtPiAwLjI2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIzMyAgcG93ZXIgMC42ODUgIDAuNSAtPiAwLjgyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIzNCAgcG93ZXIgMC4wNjg1ICAwLjUgLT4gMC4yNjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMzUgIHBvd2VyIDAuNjg2ICAwLjUgLT4gMC44MjggIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMzYgIHBvd2VyIDAuMDY4NiAgMC41IC0+IDAuMjYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjM3ICBwb3dlciAwLjY4NyAgMC41IC0+IDAuODI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjM4ICBwb3dlciAwLjA2ODcgIDAuNSAtPiAwLjI2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIzOSAgcG93ZXIgMC42ODggIDAuNSAtPiAwLjgyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI0MCAgcG93ZXIgMC4wNjg4ICAwLjUgLT4gMC4yNjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNDEgIHBvd2VyIDAuNjg5ICAwLjUgLT4gMC44MzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNDIgIHBvd2VyIDAuMDY4OSAgMC41IC0+IDAuMjYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjQzICBwb3dlciAwLjY5MSAgMC41IC0+IDAuODMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjQ0ICBwb3dlciAwLjA2OTEgIDAuNSAtPiAwLjI2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI0NSAgcG93ZXIgMC42OTIgIDAuNSAtPiAwLjgzMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI0NiAgcG93ZXIgMC4wNjkyICAwLjUgLT4gMC4yNjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNDcgIHBvd2VyIDAuNjkzICAwLjUgLT4gMC44MzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNDggIHBvd2VyIDAuMDY5MyAgMC41IC0+IDAuMjYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjQ5ICBwb3dlciAwLjY5NCAgMC41IC0+IDAuODMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjUwICBwb3dlciAwLjA2OTQgIDAuNSAtPiAwLjI2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI1MSAgcG93ZXIgMC42OTUgIDAuNSAtPiAwLjgzNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI1MiAgcG93ZXIgMC4wNjk1ICAwLjUgLT4gMC4yNjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNTMgIHBvd2VyIDAuNjk2ICAwLjUgLT4gMC44MzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNTQgIHBvd2VyIDAuMDY5NiAgMC41IC0+IDAuMjY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjU1ICBwb3dlciAwLjY5NyAgMC41IC0+IDAuODM1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjU2ICBwb3dlciAwLjA2OTcgIDAuNSAtPiAwLjI2NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI1NyAgcG93ZXIgMC42OTggIDAuNSAtPiAwLjgzNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI1OCAgcG93ZXIgMC4wNjk4ICAwLjUgLT4gMC4yNjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNTkgIHBvd2VyIDAuNjk5ICAwLjUgLT4gMC44MzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNjAgIHBvd2VyIDAuMDY5OSAgMC41IC0+IDAuMjY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjYxICBwb3dlciAwLjcwMSAgMC41IC0+IDAuODM3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjYyICBwb3dlciAwLjA3MDEgIDAuNSAtPiAwLjI2NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI2MyAgcG93ZXIgMC43MDIgIDAuNSAtPiAwLjgzOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI2NCAgcG93ZXIgMC4wNzAyICAwLjUgLT4gMC4yNjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNjUgIHBvd2VyIDAuNzAzICAwLjUgLT4gMC44MzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNjYgIHBvd2VyIDAuMDcwMyAgMC41IC0+IDAuMjY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjY3ICBwb3dlciAwLjcwNCAgMC41IC0+IDAuODM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjY4ICBwb3dlciAwLjA3MDQgIDAuNSAtPiAwLjI2NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI2OSAgcG93ZXIgMC43MDUgIDAuNSAtPiAwLjg0MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI3MCAgcG93ZXIgMC4wNzA1ICAwLjUgLT4gMC4yNjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNzEgIHBvd2VyIDAuNzA2ICAwLjUgLT4gMC44NDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNzIgIHBvd2VyIDAuMDcwNiAgMC41IC0+IDAuMjY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjczICBwb3dlciAwLjcwNyAgMC41IC0+IDAuODQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mjc0ICBwb3dlciAwLjA3MDcgIDAuNSAtPiAwLjI2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI3NSAgcG93ZXIgMC43MDggIDAuNSAtPiAwLjg0MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI3NiAgcG93ZXIgMC4wNzA4ICAwLjUgLT4gMC4yNjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNzcgIHBvd2VyIDAuNzA5ICAwLjUgLT4gMC44NDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNzggIHBvd2VyIDAuMDcwOSAgMC41IC0+IDAuMjY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mjc5ICBwb3dlciAwLjcxMSAgMC41IC0+IDAuODQzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjgwICBwb3dlciAwLjA3MTEgIDAuNSAtPiAwLjI2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI4MSAgcG93ZXIgMC43MTIgIDAuNSAtPiAwLjg0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI4MiAgcG93ZXIgMC4wNzEyICAwLjUgLT4gMC4yNjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyODMgIHBvd2VyIDAuNzEzICAwLjUgLT4gMC44NDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyODQgIHBvd2VyIDAuMDcxMyAgMC41IC0+IDAuMjY3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mjg1ICBwb3dlciAwLjcxNCAgMC41IC0+IDAuODQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mjg2ICBwb3dlciAwLjA3MTQgIDAuNSAtPiAwLjI2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI4NyAgcG93ZXIgMC43MTUgIDAuNSAtPiAwLjg0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI4OCAgcG93ZXIgMC4wNzE1ICAwLjUgLT4gMC4yNjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyODkgIHBvd2VyIDAuNzE2ICAwLjUgLT4gMC44NDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyOTAgIHBvd2VyIDAuMDcxNiAgMC41IC0+IDAuMjY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjkxICBwb3dlciAwLjcxNyAgMC41IC0+IDAuODQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjkyICBwb3dlciAwLjA3MTcgIDAuNSAtPiAwLjI2OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI5MyAgcG93ZXIgMC43MTggIDAuNSAtPiAwLjg0NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI5NCAgcG93ZXIgMC4wNzE4ICAwLjUgLT4gMC4yNjggIEluZXhhY3QgUm91bmRlZAorcHdzeDQyOTUgIHBvd2VyIDAuNzE5ICAwLjUgLT4gMC44NDggIEluZXhhY3QgUm91bmRlZAorcHdzeDQyOTYgIHBvd2VyIDAuMDcxOSAgMC41IC0+IDAuMjY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mjk3ICBwb3dlciAwLjcyMSAgMC41IC0+IDAuODQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mjk4ICBwb3dlciAwLjA3MjEgIDAuNSAtPiAwLjI2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI5OSAgcG93ZXIgMC43MjIgIDAuNSAtPiAwLjg1MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMwMCAgcG93ZXIgMC4wNzIyICAwLjUgLT4gMC4yNjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMDEgIHBvd2VyIDAuNzIzICAwLjUgLT4gMC44NTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMDIgIHBvd2VyIDAuMDcyMyAgMC41IC0+IDAuMjY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzAzICBwb3dlciAwLjcyNCAgMC41IC0+IDAuODUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzA0ICBwb3dlciAwLjA3MjQgIDAuNSAtPiAwLjI2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMwNSAgcG93ZXIgMC43MjUgIDAuNSAtPiAwLjg1MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMwNiAgcG93ZXIgMC4wNzI1ICAwLjUgLT4gMC4yNjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMDcgIHBvd2VyIDAuNzI2ICAwLjUgLT4gMC44NTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMDggIHBvd2VyIDAuMDcyNiAgMC41IC0+IDAuMjY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzA5ICBwb3dlciAwLjcyNyAgMC41IC0+IDAuODUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzEwICBwb3dlciAwLjA3MjcgIDAuNSAtPiAwLjI3MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMxMSAgcG93ZXIgMC43MjggIDAuNSAtPiAwLjg1MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMxMiAgcG93ZXIgMC4wNzI4ICAwLjUgLT4gMC4yNzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMTMgIHBvd2VyIDAuNzI5ICAwLjUgLT4gMC44NTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMTQgIHBvd2VyIDAuMDcyOSAgMC41IC0+IDAuMjcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzE1ICBwb3dlciAwLjczMSAgMC41IC0+IDAuODU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzE2ICBwb3dlciAwLjA3MzEgIDAuNSAtPiAwLjI3MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMxNyAgcG93ZXIgMC43MzIgIDAuNSAtPiAwLjg1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMxOCAgcG93ZXIgMC4wNzMyICAwLjUgLT4gMC4yNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMTkgIHBvd2VyIDAuNzMzICAwLjUgLT4gMC44NTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMjAgIHBvd2VyIDAuMDczMyAgMC41IC0+IDAuMjcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzIxICBwb3dlciAwLjczNCAgMC41IC0+IDAuODU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzIyICBwb3dlciAwLjA3MzQgIDAuNSAtPiAwLjI3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMyMyAgcG93ZXIgMC43MzUgIDAuNSAtPiAwLjg1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMyNCAgcG93ZXIgMC4wNzM1ICAwLjUgLT4gMC4yNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMjUgIHBvd2VyIDAuNzM2ICAwLjUgLT4gMC44NTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMjYgIHBvd2VyIDAuMDczNiAgMC41IC0+IDAuMjcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzI3ICBwb3dlciAwLjczNyAgMC41IC0+IDAuODU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzI4ICBwb3dlciAwLjA3MzcgIDAuNSAtPiAwLjI3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMyOSAgcG93ZXIgMC43MzggIDAuNSAtPiAwLjg1OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMzMCAgcG93ZXIgMC4wNzM4ICAwLjUgLT4gMC4yNzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMzEgIHBvd2VyIDAuNzM5ICAwLjUgLT4gMC44NjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMzIgIHBvd2VyIDAuMDczOSAgMC41IC0+IDAuMjcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzMzICBwb3dlciAwLjc0MSAgMC41IC0+IDAuODYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzM0ICBwb3dlciAwLjA3NDEgIDAuNSAtPiAwLjI3MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMzNSAgcG93ZXIgMC43NDIgIDAuNSAtPiAwLjg2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMzNiAgcG93ZXIgMC4wNzQyICAwLjUgLT4gMC4yNzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMzcgIHBvd2VyIDAuNzQzICAwLjUgLT4gMC44NjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMzggIHBvd2VyIDAuMDc0MyAgMC41IC0+IDAuMjczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzM5ICBwb3dlciAwLjc0NCAgMC41IC0+IDAuODYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzQwICBwb3dlciAwLjA3NDQgIDAuNSAtPiAwLjI3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM0MSAgcG93ZXIgMC43NDUgIDAuNSAtPiAwLjg2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM0MiAgcG93ZXIgMC4wNzQ1ICAwLjUgLT4gMC4yNzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNDMgIHBvd2VyIDAuNzQ2ICAwLjUgLT4gMC44NjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNDQgIHBvd2VyIDAuMDc0NiAgMC41IC0+IDAuMjczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzQ1ICBwb3dlciAwLjc0NyAgMC41IC0+IDAuODY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzQ2ICBwb3dlciAwLjA3NDcgIDAuNSAtPiAwLjI3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM0NyAgcG93ZXIgMC43NDggIDAuNSAtPiAwLjg2NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM0OCAgcG93ZXIgMC4wNzQ4ICAwLjUgLT4gMC4yNzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNDkgIHBvd2VyIDAuNzQ5ICAwLjUgLT4gMC44NjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNTAgIHBvd2VyIDAuMDc0OSAgMC41IC0+IDAuMjc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzUxICBwb3dlciAwLjc1MSAgMC41IC0+IDAuODY3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzUyICBwb3dlciAwLjA3NTEgIDAuNSAtPiAwLjI3NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM1MyAgcG93ZXIgMC43NTIgIDAuNSAtPiAwLjg2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM1NCAgcG93ZXIgMC4wNzUyICAwLjUgLT4gMC4yNzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNTUgIHBvd2VyIDAuNzUzICAwLjUgLT4gMC44NjggIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNTYgIHBvd2VyIDAuMDc1MyAgMC41IC0+IDAuMjc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzU3ICBwb3dlciAwLjc1NCAgMC41IC0+IDAuODY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzU4ICBwb3dlciAwLjA3NTQgIDAuNSAtPiAwLjI3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM1OSAgcG93ZXIgMC43NTUgIDAuNSAtPiAwLjg2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM2MCAgcG93ZXIgMC4wNzU1ICAwLjUgLT4gMC4yNzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNjEgIHBvd2VyIDAuNzU2ICAwLjUgLT4gMC44NjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNjIgIHBvd2VyIDAuMDc1NiAgMC41IC0+IDAuMjc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzYzICBwb3dlciAwLjc1NyAgMC41IC0+IDAuODcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzY0ICBwb3dlciAwLjA3NTcgIDAuNSAtPiAwLjI3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM2NSAgcG93ZXIgMC43NTggIDAuNSAtPiAwLjg3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM2NiAgcG93ZXIgMC4wNzU4ICAwLjUgLT4gMC4yNzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNjcgIHBvd2VyIDAuNzU5ICAwLjUgLT4gMC44NzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNjggIHBvd2VyIDAuMDc1OSAgMC41IC0+IDAuMjc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzY5ICBwb3dlciAwLjc2MSAgMC41IC0+IDAuODcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzcwICBwb3dlciAwLjA3NjEgIDAuNSAtPiAwLjI3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM3MSAgcG93ZXIgMC43NjIgIDAuNSAtPiAwLjg3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM3MiAgcG93ZXIgMC4wNzYyICAwLjUgLT4gMC4yNzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNzMgIHBvd2VyIDAuNzYzICAwLjUgLT4gMC44NzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNzQgIHBvd2VyIDAuMDc2MyAgMC41IC0+IDAuMjc2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mzc1ICBwb3dlciAwLjc2NCAgMC41IC0+IDAuODc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mzc2ICBwb3dlciAwLjA3NjQgIDAuNSAtPiAwLjI3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM3NyAgcG93ZXIgMC43NjUgIDAuNSAtPiAwLjg3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM3OCAgcG93ZXIgMC4wNzY1ICAwLjUgLT4gMC4yNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNzkgIHBvd2VyIDAuNzY2ICAwLjUgLT4gMC44NzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzODAgIHBvd2VyIDAuMDc2NiAgMC41IC0+IDAuMjc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzgxICBwb3dlciAwLjc2NyAgMC41IC0+IDAuODc2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzgyICBwb3dlciAwLjA3NjcgIDAuNSAtPiAwLjI3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM4MyAgcG93ZXIgMC43NjggIDAuNSAtPiAwLjg3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM4NCAgcG93ZXIgMC4wNzY4ICAwLjUgLT4gMC4yNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzODUgIHBvd2VyIDAuNzY5ICAwLjUgLT4gMC44NzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzODYgIHBvd2VyIDAuMDc2OSAgMC41IC0+IDAuMjc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mzg3ICBwb3dlciAwLjc3MSAgMC41IC0+IDAuODc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mzg4ICBwb3dlciAwLjA3NzEgIDAuNSAtPiAwLjI3OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM4OSAgcG93ZXIgMC43NzIgIDAuNSAtPiAwLjg3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM5MCAgcG93ZXIgMC4wNzcyICAwLjUgLT4gMC4yNzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQzOTEgIHBvd2VyIDAuNzczICAwLjUgLT4gMC44NzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzOTIgIHBvd2VyIDAuMDc3MyAgMC41IC0+IDAuMjc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzkzICBwb3dlciAwLjc3NCAgMC41IC0+IDAuODgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mzk0ICBwb3dlciAwLjA3NzQgIDAuNSAtPiAwLjI3OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM5NSAgcG93ZXIgMC43NzUgIDAuNSAtPiAwLjg4MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM5NiAgcG93ZXIgMC4wNzc1ICAwLjUgLT4gMC4yNzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQzOTcgIHBvd2VyIDAuNzc2ICAwLjUgLT4gMC44ODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzOTggIHBvd2VyIDAuMDc3NiAgMC41IC0+IDAuMjc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mzk5ICBwb3dlciAwLjc3NyAgMC41IC0+IDAuODgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDAwICBwb3dlciAwLjA3NzcgIDAuNSAtPiAwLjI3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQwMSAgcG93ZXIgMC43NzggIDAuNSAtPiAwLjg4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQwMiAgcG93ZXIgMC4wNzc4ICAwLjUgLT4gMC4yNzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MDMgIHBvd2VyIDAuNzc5ICAwLjUgLT4gMC44ODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MDQgIHBvd2VyIDAuMDc3OSAgMC41IC0+IDAuMjc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDA1ICBwb3dlciAwLjc4MSAgMC41IC0+IDAuODg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDA2ICBwb3dlciAwLjA3ODEgIDAuNSAtPiAwLjI3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQwNyAgcG93ZXIgMC43ODIgIDAuNSAtPiAwLjg4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQwOCAgcG93ZXIgMC4wNzgyICAwLjUgLT4gMC4yODAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MDkgIHBvd2VyIDAuNzgzICAwLjUgLT4gMC44ODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MTAgIHBvd2VyIDAuMDc4MyAgMC41IC0+IDAuMjgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDExICBwb3dlciAwLjc4NCAgMC41IC0+IDAuODg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDEyICBwb3dlciAwLjA3ODQgIDAuNSAtPiAwLjI4MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQxMyAgcG93ZXIgMC43ODUgIDAuNSAtPiAwLjg4NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQxNCAgcG93ZXIgMC4wNzg1ICAwLjUgLT4gMC4yODAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MTUgIHBvd2VyIDAuNzg2ICAwLjUgLT4gMC44ODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MTYgIHBvd2VyIDAuMDc4NiAgMC41IC0+IDAuMjgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDE3ICBwb3dlciAwLjc4NyAgMC41IC0+IDAuODg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDE4ICBwb3dlciAwLjA3ODcgIDAuNSAtPiAwLjI4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQxOSAgcG93ZXIgMC43ODggIDAuNSAtPiAwLjg4OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQyMCAgcG93ZXIgMC4wNzg4ICAwLjUgLT4gMC4yODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MjEgIHBvd2VyIDAuNzg5ICAwLjUgLT4gMC44ODggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MjIgIHBvd2VyIDAuMDc4OSAgMC41IC0+IDAuMjgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDIzICBwb3dlciAwLjc5MSAgMC41IC0+IDAuODg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDI0ICBwb3dlciAwLjA3OTEgIDAuNSAtPiAwLjI4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQyNSAgcG93ZXIgMC43OTIgIDAuNSAtPiAwLjg5MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQyNiAgcG93ZXIgMC4wNzkyICAwLjUgLT4gMC4yODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MjcgIHBvd2VyIDAuNzkzICAwLjUgLT4gMC44OTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MjggIHBvd2VyIDAuMDc5MyAgMC41IC0+IDAuMjgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDI5ICBwb3dlciAwLjc5NCAgMC41IC0+IDAuODkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDMwICBwb3dlciAwLjA3OTQgIDAuNSAtPiAwLjI4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQzMSAgcG93ZXIgMC43OTUgIDAuNSAtPiAwLjg5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQzMiAgcG93ZXIgMC4wNzk1ICAwLjUgLT4gMC4yODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MzMgIHBvd2VyIDAuNzk2ICAwLjUgLT4gMC44OTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MzQgIHBvd2VyIDAuMDc5NiAgMC41IC0+IDAuMjgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDM1ICBwb3dlciAwLjc5NyAgMC41IC0+IDAuODkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDM2ICBwb3dlciAwLjA3OTcgIDAuNSAtPiAwLjI4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQzNyAgcG93ZXIgMC43OTggIDAuNSAtPiAwLjg5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQzOCAgcG93ZXIgMC4wNzk4ICAwLjUgLT4gMC4yODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MzkgIHBvd2VyIDAuNzk5ICAwLjUgLT4gMC44OTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NDAgIHBvd2VyIDAuMDc5OSAgMC41IC0+IDAuMjgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDQxICBwb3dlciAwLjgwMSAgMC41IC0+IDAuODk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDQyICBwb3dlciAwLjA4MDEgIDAuNSAtPiAwLjI4MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ0MyAgcG93ZXIgMC44MDIgIDAuNSAtPiAwLjg5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ0NCAgcG93ZXIgMC4wODAyICAwLjUgLT4gMC4yODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NDUgIHBvd2VyIDAuODAzICAwLjUgLT4gMC44OTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NDYgIHBvd2VyIDAuMDgwMyAgMC41IC0+IDAuMjgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDQ3ICBwb3dlciAwLjgwNCAgMC41IC0+IDAuODk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDQ4ICBwb3dlciAwLjA4MDQgIDAuNSAtPiAwLjI4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ0OSAgcG93ZXIgMC44MDUgIDAuNSAtPiAwLjg5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ1MCAgcG93ZXIgMC4wODA1ICAwLjUgLT4gMC4yODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NTEgIHBvd2VyIDAuODA2ICAwLjUgLT4gMC44OTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NTIgIHBvd2VyIDAuMDgwNiAgMC41IC0+IDAuMjg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDUzICBwb3dlciAwLjgwNyAgMC41IC0+IDAuODk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDU0ICBwb3dlciAwLjA4MDcgIDAuNSAtPiAwLjI4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ1NSAgcG93ZXIgMC44MDggIDAuNSAtPiAwLjg5OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ1NiAgcG93ZXIgMC4wODA4ICAwLjUgLT4gMC4yODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NTcgIHBvd2VyIDAuODA5ICAwLjUgLT4gMC44OTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NTggIHBvd2VyIDAuMDgwOSAgMC41IC0+IDAuMjg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDU5ICBwb3dlciAwLjgxMSAgMC41IC0+IDAuOTAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDYwICBwb3dlciAwLjA4MTEgIDAuNSAtPiAwLjI4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ2MSAgcG93ZXIgMC44MTIgIDAuNSAtPiAwLjkwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ2MiAgcG93ZXIgMC4wODEyICAwLjUgLT4gMC4yODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NjMgIHBvd2VyIDAuODEzICAwLjUgLT4gMC45MDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NjQgIHBvd2VyIDAuMDgxMyAgMC41IC0+IDAuMjg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDY1ICBwb3dlciAwLjgxNCAgMC41IC0+IDAuOTAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDY2ICBwb3dlciAwLjA4MTQgIDAuNSAtPiAwLjI4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ2NyAgcG93ZXIgMC44MTUgIDAuNSAtPiAwLjkwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ2OCAgcG93ZXIgMC4wODE1ICAwLjUgLT4gMC4yODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NjkgIHBvd2VyIDAuODE2ICAwLjUgLT4gMC45MDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NzAgIHBvd2VyIDAuMDgxNiAgMC41IC0+IDAuMjg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDcxICBwb3dlciAwLjgxNyAgMC41IC0+IDAuOTA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDcyICBwb3dlciAwLjA4MTcgIDAuNSAtPiAwLjI4NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ3MyAgcG93ZXIgMC44MTggIDAuNSAtPiAwLjkwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ3NCAgcG93ZXIgMC4wODE4ICAwLjUgLT4gMC4yODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NzUgIHBvd2VyIDAuODE5ICAwLjUgLT4gMC45MDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NzYgIHBvd2VyIDAuMDgxOSAgMC41IC0+IDAuMjg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDc3ICBwb3dlciAwLjgyMSAgMC41IC0+IDAuOTA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDc4ICBwb3dlciAwLjA4MjEgIDAuNSAtPiAwLjI4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ3OSAgcG93ZXIgMC44MjIgIDAuNSAtPiAwLjkwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ4MCAgcG93ZXIgMC4wODIyICAwLjUgLT4gMC4yODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0ODEgIHBvd2VyIDAuODIzICAwLjUgLT4gMC45MDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0ODIgIHBvd2VyIDAuMDgyMyAgMC41IC0+IDAuMjg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDgzICBwb3dlciAwLjgyNCAgMC41IC0+IDAuOTA4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDg0ICBwb3dlciAwLjA4MjQgIDAuNSAtPiAwLjI4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ4NSAgcG93ZXIgMC44MjUgIDAuNSAtPiAwLjkwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ4NiAgcG93ZXIgMC4wODI1ICAwLjUgLT4gMC4yODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0ODcgIHBvd2VyIDAuODI2ICAwLjUgLT4gMC45MDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0ODggIHBvd2VyIDAuMDgyNiAgMC41IC0+IDAuMjg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDg5ICBwb3dlciAwLjgyNyAgMC41IC0+IDAuOTA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDkwICBwb3dlciAwLjA4MjcgIDAuNSAtPiAwLjI4OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ5MSAgcG93ZXIgMC44MjggIDAuNSAtPiAwLjkxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ5MiAgcG93ZXIgMC4wODI4ICAwLjUgLT4gMC4yODggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0OTMgIHBvd2VyIDAuODI5ICAwLjUgLT4gMC45MTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0OTQgIHBvd2VyIDAuMDgyOSAgMC41IC0+IDAuMjg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDk1ICBwb3dlciAwLjgzMSAgMC41IC0+IDAuOTEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDk2ICBwb3dlciAwLjA4MzEgIDAuNSAtPiAwLjI4OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ5NyAgcG93ZXIgMC44MzIgIDAuNSAtPiAwLjkxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ5OCAgcG93ZXIgMC4wODMyICAwLjUgLT4gMC4yODggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0OTkgIHBvd2VyIDAuODMzICAwLjUgLT4gMC45MTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MDAgIHBvd2VyIDAuMDgzMyAgMC41IC0+IDAuMjg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTAxICBwb3dlciAwLjgzNCAgMC41IC0+IDAuOTEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTAyICBwb3dlciAwLjA4MzQgIDAuNSAtPiAwLjI4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUwMyAgcG93ZXIgMC44MzUgIDAuNSAtPiAwLjkxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUwNCAgcG93ZXIgMC4wODM1ICAwLjUgLT4gMC4yODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MDUgIHBvd2VyIDAuODM2ICAwLjUgLT4gMC45MTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MDYgIHBvd2VyIDAuMDgzNiAgMC41IC0+IDAuMjg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTA3ICBwb3dlciAwLjgzNyAgMC41IC0+IDAuOTE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTA4ICBwb3dlciAwLjA4MzcgIDAuNSAtPiAwLjI4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUwOSAgcG93ZXIgMC44MzggIDAuNSAtPiAwLjkxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUxMCAgcG93ZXIgMC4wODM4ICAwLjUgLT4gMC4yODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MTEgIHBvd2VyIDAuODM5ICAwLjUgLT4gMC45MTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MTIgIHBvd2VyIDAuMDgzOSAgMC41IC0+IDAuMjkwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTEzICBwb3dlciAwLjg0MSAgMC41IC0+IDAuOTE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTE0ICBwb3dlciAwLjA4NDEgIDAuNSAtPiAwLjI5MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUxNSAgcG93ZXIgMC44NDIgIDAuNSAtPiAwLjkxOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUxNiAgcG93ZXIgMC4wODQyICAwLjUgLT4gMC4yOTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MTcgIHBvd2VyIDAuODQzICAwLjUgLT4gMC45MTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MTggIHBvd2VyIDAuMDg0MyAgMC41IC0+IDAuMjkwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTE5ICBwb3dlciAwLjg0NCAgMC41IC0+IDAuOTE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTIwICBwb3dlciAwLjA4NDQgIDAuNSAtPiAwLjI5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUyMSAgcG93ZXIgMC44NDUgIDAuNSAtPiAwLjkxOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUyMiAgcG93ZXIgMC4wODQ1ICAwLjUgLT4gMC4yOTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MjMgIHBvd2VyIDAuODQ2ICAwLjUgLT4gMC45MjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MjQgIHBvd2VyIDAuMDg0NiAgMC41IC0+IDAuMjkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTI1ICBwb3dlciAwLjg0NyAgMC41IC0+IDAuOTIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTI2ICBwb3dlciAwLjA4NDcgIDAuNSAtPiAwLjI5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUyNyAgcG93ZXIgMC44NDggIDAuNSAtPiAwLjkyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUyOCAgcG93ZXIgMC4wODQ4ICAwLjUgLT4gMC4yOTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MjkgIHBvd2VyIDAuODQ5ICAwLjUgLT4gMC45MjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MzAgIHBvd2VyIDAuMDg0OSAgMC41IC0+IDAuMjkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTMxICBwb3dlciAwLjg1MSAgMC41IC0+IDAuOTIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTMyICBwb3dlciAwLjA4NTEgIDAuNSAtPiAwLjI5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUzMyAgcG93ZXIgMC44NTIgIDAuNSAtPiAwLjkyMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUzNCAgcG93ZXIgMC4wODUyICAwLjUgLT4gMC4yOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MzUgIHBvd2VyIDAuODUzICAwLjUgLT4gMC45MjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MzYgIHBvd2VyIDAuMDg1MyAgMC41IC0+IDAuMjkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTM3ICBwb3dlciAwLjg1NCAgMC41IC0+IDAuOTI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTM4ICBwb3dlciAwLjA4NTQgIDAuNSAtPiAwLjI5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUzOSAgcG93ZXIgMC44NTUgIDAuNSAtPiAwLjkyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU0MCAgcG93ZXIgMC4wODU1ICAwLjUgLT4gMC4yOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NDEgIHBvd2VyIDAuODU2ICAwLjUgLT4gMC45MjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NDIgIHBvd2VyIDAuMDg1NiAgMC41IC0+IDAuMjkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTQzICBwb3dlciAwLjg1NyAgMC41IC0+IDAuOTI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTQ0ICBwb3dlciAwLjA4NTcgIDAuNSAtPiAwLjI5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU0NSAgcG93ZXIgMC44NTggIDAuNSAtPiAwLjkyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU0NiAgcG93ZXIgMC4wODU4ICAwLjUgLT4gMC4yOTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NDcgIHBvd2VyIDAuODU5ICAwLjUgLT4gMC45MjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NDggIHBvd2VyIDAuMDg1OSAgMC41IC0+IDAuMjkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTQ5ICBwb3dlciAwLjg2MSAgMC41IC0+IDAuOTI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTUwICBwb3dlciAwLjA4NjEgIDAuNSAtPiAwLjI5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU1MSAgcG93ZXIgMC44NjIgIDAuNSAtPiAwLjkyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU1MiAgcG93ZXIgMC4wODYyICAwLjUgLT4gMC4yOTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NTMgIHBvd2VyIDAuODYzICAwLjUgLT4gMC45MjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NTQgIHBvd2VyIDAuMDg2MyAgMC41IC0+IDAuMjk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTU1ICBwb3dlciAwLjg2NCAgMC41IC0+IDAuOTMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTU2ICBwb3dlciAwLjA4NjQgIDAuNSAtPiAwLjI5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU1NyAgcG93ZXIgMC44NjUgIDAuNSAtPiAwLjkzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU1OCAgcG93ZXIgMC4wODY1ICAwLjUgLT4gMC4yOTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NTkgIHBvd2VyIDAuODY2ICAwLjUgLT4gMC45MzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NjAgIHBvd2VyIDAuMDg2NiAgMC41IC0+IDAuMjk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTYxICBwb3dlciAwLjg2NyAgMC41IC0+IDAuOTMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTYyICBwb3dlciAwLjA4NjcgIDAuNSAtPiAwLjI5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU2MyAgcG93ZXIgMC44NjggIDAuNSAtPiAwLjkzMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU2NCAgcG93ZXIgMC4wODY4ICAwLjUgLT4gMC4yOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NjUgIHBvd2VyIDAuODY5ICAwLjUgLT4gMC45MzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NjYgIHBvd2VyIDAuMDg2OSAgMC41IC0+IDAuMjk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTY3ICBwb3dlciAwLjg3MSAgMC41IC0+IDAuOTMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTY4ICBwb3dlciAwLjA4NzEgIDAuNSAtPiAwLjI5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU2OSAgcG93ZXIgMC44NzIgIDAuNSAtPiAwLjkzNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU3MCAgcG93ZXIgMC4wODcyICAwLjUgLT4gMC4yOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NzEgIHBvd2VyIDAuODczICAwLjUgLT4gMC45MzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NzIgIHBvd2VyIDAuMDg3MyAgMC41IC0+IDAuMjk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTczICBwb3dlciAwLjg3NCAgMC41IC0+IDAuOTM1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTc0ICBwb3dlciAwLjA4NzQgIDAuNSAtPiAwLjI5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU3NSAgcG93ZXIgMC44NzUgIDAuNSAtPiAwLjkzNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU3NiAgcG93ZXIgMC4wODc1ICAwLjUgLT4gMC4yOTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NzcgIHBvd2VyIDAuODc2ICAwLjUgLT4gMC45MzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NzggIHBvd2VyIDAuMDg3NiAgMC41IC0+IDAuMjk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTc5ICBwb3dlciAwLjg3NyAgMC41IC0+IDAuOTM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTgwICBwb3dlciAwLjA4NzcgIDAuNSAtPiAwLjI5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU4MSAgcG93ZXIgMC44NzggIDAuNSAtPiAwLjkzNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU4MiAgcG93ZXIgMC4wODc4ICAwLjUgLT4gMC4yOTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1ODMgIHBvd2VyIDAuODc5ICAwLjUgLT4gMC45MzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1ODQgIHBvd2VyIDAuMDg3OSAgMC41IC0+IDAuMjk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTg1ICBwb3dlciAwLjg4MSAgMC41IC0+IDAuOTM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTg2ICBwb3dlciAwLjA4ODEgIDAuNSAtPiAwLjI5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU4NyAgcG93ZXIgMC44ODIgIDAuNSAtPiAwLjkzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU4OCAgcG93ZXIgMC4wODgyICAwLjUgLT4gMC4yOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1ODkgIHBvd2VyIDAuODgzICAwLjUgLT4gMC45NDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1OTAgIHBvd2VyIDAuMDg4MyAgMC41IC0+IDAuMjk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTkxICBwb3dlciAwLjg4NCAgMC41IC0+IDAuOTQwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTkyICBwb3dlciAwLjA4ODQgIDAuNSAtPiAwLjI5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU5MyAgcG93ZXIgMC44ODUgIDAuNSAtPiAwLjk0MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU5NCAgcG93ZXIgMC4wODg1ICAwLjUgLT4gMC4yOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1OTUgIHBvd2VyIDAuODg2ICAwLjUgLT4gMC45NDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1OTYgIHBvd2VyIDAuMDg4NiAgMC41IC0+IDAuMjk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTk3ICBwb3dlciAwLjg4NyAgMC41IC0+IDAuOTQyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTk4ICBwb3dlciAwLjA4ODcgIDAuNSAtPiAwLjI5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU5OSAgcG93ZXIgMC44ODggIDAuNSAtPiAwLjk0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYwMCAgcG93ZXIgMC4wODg4ICAwLjUgLT4gMC4yOTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MDEgIHBvd2VyIDAuODg5ICAwLjUgLT4gMC45NDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MDIgIHBvd2VyIDAuMDg4OSAgMC41IC0+IDAuMjk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjAzICBwb3dlciAwLjg5MSAgMC41IC0+IDAuOTQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjA0ICBwb3dlciAwLjA4OTEgIDAuNSAtPiAwLjI5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYwNSAgcG93ZXIgMC44OTIgIDAuNSAtPiAwLjk0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYwNiAgcG93ZXIgMC4wODkyICAwLjUgLT4gMC4yOTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MDcgIHBvd2VyIDAuODkzICAwLjUgLT4gMC45NDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MDggIHBvd2VyIDAuMDg5MyAgMC41IC0+IDAuMjk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjA5ICBwb3dlciAwLjg5NCAgMC41IC0+IDAuOTQ2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjEwICBwb3dlciAwLjA4OTQgIDAuNSAtPiAwLjI5OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYxMSAgcG93ZXIgMC44OTUgIDAuNSAtPiAwLjk0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYxMiAgcG93ZXIgMC4wODk1ICAwLjUgLT4gMC4yOTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MTMgIHBvd2VyIDAuODk2ICAwLjUgLT4gMC45NDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MTQgIHBvd2VyIDAuMDg5NiAgMC41IC0+IDAuMjk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjE1ICBwb3dlciAwLjg5NyAgMC41IC0+IDAuOTQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjE2ICBwb3dlciAwLjA4OTcgIDAuNSAtPiAwLjI5OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYxNyAgcG93ZXIgMC44OTggIDAuNSAtPiAwLjk0OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYxOCAgcG93ZXIgMC4wODk4ICAwLjUgLT4gMC4zMDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MTkgIHBvd2VyIDAuODk5ICAwLjUgLT4gMC45NDggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MjAgIHBvd2VyIDAuMDg5OSAgMC41IC0+IDAuMzAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjIxICBwb3dlciAwLjkwMSAgMC41IC0+IDAuOTQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjIyICBwb3dlciAwLjA5MDEgIDAuNSAtPiAwLjMwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYyMyAgcG93ZXIgMC45MDIgIDAuNSAtPiAwLjk1MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYyNCAgcG93ZXIgMC4wOTAyICAwLjUgLT4gMC4zMDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MjUgIHBvd2VyIDAuOTAzICAwLjUgLT4gMC45NTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MjYgIHBvd2VyIDAuMDkwMyAgMC41IC0+IDAuMzAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjI3ICBwb3dlciAwLjkwNCAgMC41IC0+IDAuOTUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjI4ICBwb3dlciAwLjA5MDQgIDAuNSAtPiAwLjMwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYyOSAgcG93ZXIgMC45MDUgIDAuNSAtPiAwLjk1MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYzMCAgcG93ZXIgMC4wOTA1ICAwLjUgLT4gMC4zMDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MzEgIHBvd2VyIDAuOTA2ICAwLjUgLT4gMC45NTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MzIgIHBvd2VyIDAuMDkwNiAgMC41IC0+IDAuMzAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjMzICBwb3dlciAwLjkwNyAgMC41IC0+IDAuOTUyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjM0ICBwb3dlciAwLjA5MDcgIDAuNSAtPiAwLjMwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYzNSAgcG93ZXIgMC45MDggIDAuNSAtPiAwLjk1MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYzNiAgcG93ZXIgMC4wOTA4ICAwLjUgLT4gMC4zMDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MzcgIHBvd2VyIDAuOTA5ICAwLjUgLT4gMC45NTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MzggIHBvd2VyIDAuMDkwOSAgMC41IC0+IDAuMzAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjM5ICBwb3dlciAwLjkxMSAgMC41IC0+IDAuOTU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjQwICBwb3dlciAwLjA5MTEgIDAuNSAtPiAwLjMwMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY0MSAgcG93ZXIgMC45MTIgIDAuNSAtPiAwLjk1NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY0MiAgcG93ZXIgMC4wOTEyICAwLjUgLT4gMC4zMDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NDMgIHBvd2VyIDAuOTEzICAwLjUgLT4gMC45NTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NDQgIHBvd2VyIDAuMDkxMyAgMC41IC0+IDAuMzAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjQ1ICBwb3dlciAwLjkxNCAgMC41IC0+IDAuOTU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjQ2ICBwb3dlciAwLjA5MTQgIDAuNSAtPiAwLjMwMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY0NyAgcG93ZXIgMC45MTUgIDAuNSAtPiAwLjk1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY0OCAgcG93ZXIgMC4wOTE1ICAwLjUgLT4gMC4zMDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NDkgIHBvd2VyIDAuOTE2ICAwLjUgLT4gMC45NTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NTAgIHBvd2VyIDAuMDkxNiAgMC41IC0+IDAuMzAzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjUxICBwb3dlciAwLjkxNyAgMC41IC0+IDAuOTU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjUyICBwb3dlciAwLjA5MTcgIDAuNSAtPiAwLjMwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY1MyAgcG93ZXIgMC45MTggIDAuNSAtPiAwLjk1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY1NCAgcG93ZXIgMC4wOTE4ICAwLjUgLT4gMC4zMDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NTUgIHBvd2VyIDAuOTE5ICAwLjUgLT4gMC45NTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NTYgIHBvd2VyIDAuMDkxOSAgMC41IC0+IDAuMzAzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjU3ICBwb3dlciAwLjkyMSAgMC41IC0+IDAuOTYwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjU4ICBwb3dlciAwLjA5MjEgIDAuNSAtPiAwLjMwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY1OSAgcG93ZXIgMC45MjIgIDAuNSAtPiAwLjk2MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY2MCAgcG93ZXIgMC4wOTIyICAwLjUgLT4gMC4zMDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NjEgIHBvd2VyIDAuOTIzICAwLjUgLT4gMC45NjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NjIgIHBvd2VyIDAuMDkyMyAgMC41IC0+IDAuMzA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjYzICBwb3dlciAwLjkyNCAgMC41IC0+IDAuOTYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjY0ICBwb3dlciAwLjA5MjQgIDAuNSAtPiAwLjMwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY2NSAgcG93ZXIgMC45MjUgIDAuNSAtPiAwLjk2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY2NiAgcG93ZXIgMC4wOTI1ICAwLjUgLT4gMC4zMDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NjcgIHBvd2VyIDAuOTI2ICAwLjUgLT4gMC45NjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NjggIHBvd2VyIDAuMDkyNiAgMC41IC0+IDAuMzA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjY5ICBwb3dlciAwLjkyNyAgMC41IC0+IDAuOTYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjcwICBwb3dlciAwLjA5MjcgIDAuNSAtPiAwLjMwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY3MSAgcG93ZXIgMC45MjggIDAuNSAtPiAwLjk2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY3MiAgcG93ZXIgMC4wOTI4ICAwLjUgLT4gMC4zMDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NzMgIHBvd2VyIDAuOTI5ICAwLjUgLT4gMC45NjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NzQgIHBvd2VyIDAuMDkyOSAgMC41IC0+IDAuMzA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Njc1ICBwb3dlciAwLjkzMSAgMC41IC0+IDAuOTY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Njc2ICBwb3dlciAwLjA5MzEgIDAuNSAtPiAwLjMwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY3NyAgcG93ZXIgMC45MzIgIDAuNSAtPiAwLjk2NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY3OCAgcG93ZXIgMC4wOTMyICAwLjUgLT4gMC4zMDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NzkgIHBvd2VyIDAuOTMzICAwLjUgLT4gMC45NjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2ODAgIHBvd2VyIDAuMDkzMyAgMC41IC0+IDAuMzA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjgxICBwb3dlciAwLjkzNCAgMC41IC0+IDAuOTY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjgyICBwb3dlciAwLjA5MzQgIDAuNSAtPiAwLjMwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY4MyAgcG93ZXIgMC45MzUgIDAuNSAtPiAwLjk2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY4NCAgcG93ZXIgMC4wOTM1ICAwLjUgLT4gMC4zMDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2ODUgIHBvd2VyIDAuOTM2ICAwLjUgLT4gMC45NjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2ODYgIHBvd2VyIDAuMDkzNiAgMC41IC0+IDAuMzA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Njg3ICBwb3dlciAwLjkzNyAgMC41IC0+IDAuOTY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Njg4ICBwb3dlciAwLjA5MzcgIDAuNSAtPiAwLjMwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY4OSAgcG93ZXIgMC45MzggIDAuNSAtPiAwLjk2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY5MCAgcG93ZXIgMC4wOTM4ICAwLjUgLT4gMC4zMDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2OTEgIHBvd2VyIDAuOTM5ICAwLjUgLT4gMC45NjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2OTIgIHBvd2VyIDAuMDkzOSAgMC41IC0+IDAuMzA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjkzICBwb3dlciAwLjk0MSAgMC41IC0+IDAuOTcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Njk0ICBwb3dlciAwLjA5NDEgIDAuNSAtPiAwLjMwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY5NSAgcG93ZXIgMC45NDIgIDAuNSAtPiAwLjk3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY5NiAgcG93ZXIgMC4wOTQyICAwLjUgLT4gMC4zMDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2OTcgIHBvd2VyIDAuOTQzICAwLjUgLT4gMC45NzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2OTggIHBvd2VyIDAuMDk0MyAgMC41IC0+IDAuMzA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Njk5ICBwb3dlciAwLjk0NCAgMC41IC0+IDAuOTcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzAwICBwb3dlciAwLjA5NDQgIDAuNSAtPiAwLjMwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcwMSAgcG93ZXIgMC45NDUgIDAuNSAtPiAwLjk3MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcwMiAgcG93ZXIgMC4wOTQ1ICAwLjUgLT4gMC4zMDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MDMgIHBvd2VyIDAuOTQ2ICAwLjUgLT4gMC45NzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MDQgIHBvd2VyIDAuMDk0NiAgMC41IC0+IDAuMzA4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzA1ICBwb3dlciAwLjk0NyAgMC41IC0+IDAuOTczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzA2ICBwb3dlciAwLjA5NDcgIDAuNSAtPiAwLjMwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcwNyAgcG93ZXIgMC45NDggIDAuNSAtPiAwLjk3NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcwOCAgcG93ZXIgMC4wOTQ4ICAwLjUgLT4gMC4zMDggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MDkgIHBvd2VyIDAuOTQ5ICAwLjUgLT4gMC45NzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MTAgIHBvd2VyIDAuMDk0OSAgMC41IC0+IDAuMzA4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzExICBwb3dlciAwLjk1MSAgMC41IC0+IDAuOTc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzEyICBwb3dlciAwLjA5NTEgIDAuNSAtPiAwLjMwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcxMyAgcG93ZXIgMC45NTIgIDAuNSAtPiAwLjk3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcxNCAgcG93ZXIgMC4wOTUyICAwLjUgLT4gMC4zMDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MTUgIHBvd2VyIDAuOTUzICAwLjUgLT4gMC45NzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MTYgIHBvd2VyIDAuMDk1MyAgMC41IC0+IDAuMzA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzE3ICBwb3dlciAwLjk1NCAgMC41IC0+IDAuOTc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzE4ICBwb3dlciAwLjA5NTQgIDAuNSAtPiAwLjMwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcxOSAgcG93ZXIgMC45NTUgIDAuNSAtPiAwLjk3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcyMCAgcG93ZXIgMC4wOTU1ICAwLjUgLT4gMC4zMDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MjEgIHBvd2VyIDAuOTU2ICAwLjUgLT4gMC45NzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MjIgIHBvd2VyIDAuMDk1NiAgMC41IC0+IDAuMzA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzIzICBwb3dlciAwLjk1NyAgMC41IC0+IDAuOTc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzI0ICBwb3dlciAwLjA5NTcgIDAuNSAtPiAwLjMwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcyNSAgcG93ZXIgMC45NTggIDAuNSAtPiAwLjk3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcyNiAgcG93ZXIgMC4wOTU4ICAwLjUgLT4gMC4zMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MjcgIHBvd2VyIDAuOTU5ICAwLjUgLT4gMC45NzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MjggIHBvd2VyIDAuMDk1OSAgMC41IC0+IDAuMzEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzI5ICBwb3dlciAwLjk2MSAgMC41IC0+IDAuOTgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzMwICBwb3dlciAwLjA5NjEgIDAuNSAtPiAwLjMxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDczMSAgcG93ZXIgMC45NjIgIDAuNSAtPiAwLjk4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDczMiAgcG93ZXIgMC4wOTYyICAwLjUgLT4gMC4zMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MzMgIHBvd2VyIDAuOTYzICAwLjUgLT4gMC45ODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MzQgIHBvd2VyIDAuMDk2MyAgMC41IC0+IDAuMzEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzM1ICBwb3dlciAwLjk2NCAgMC41IC0+IDAuOTgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzM2ICBwb3dlciAwLjA5NjQgIDAuNSAtPiAwLjMxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDczNyAgcG93ZXIgMC45NjUgIDAuNSAtPiAwLjk4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDczOCAgcG93ZXIgMC4wOTY1ICAwLjUgLT4gMC4zMTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MzkgIHBvd2VyIDAuOTY2ICAwLjUgLT4gMC45ODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NDAgIHBvd2VyIDAuMDk2NiAgMC41IC0+IDAuMzExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzQxICBwb3dlciAwLjk2NyAgMC41IC0+IDAuOTgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzQyICBwb3dlciAwLjA5NjcgIDAuNSAtPiAwLjMxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc0MyAgcG93ZXIgMC45NjggIDAuNSAtPiAwLjk4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc0NCAgcG93ZXIgMC4wOTY4ICAwLjUgLT4gMC4zMTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NDUgIHBvd2VyIDAuOTY5ICAwLjUgLT4gMC45ODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NDYgIHBvd2VyIDAuMDk2OSAgMC41IC0+IDAuMzExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzQ3ICBwb3dlciAwLjk3MSAgMC41IC0+IDAuOTg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzQ4ICBwb3dlciAwLjA5NzEgIDAuNSAtPiAwLjMxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc0OSAgcG93ZXIgMC45NzIgIDAuNSAtPiAwLjk4NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc1MCAgcG93ZXIgMC4wOTcyICAwLjUgLT4gMC4zMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NTEgIHBvd2VyIDAuOTczICAwLjUgLT4gMC45ODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NTIgIHBvd2VyIDAuMDk3MyAgMC41IC0+IDAuMzEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzUzICBwb3dlciAwLjk3NCAgMC41IC0+IDAuOTg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzU0ICBwb3dlciAwLjA5NzQgIDAuNSAtPiAwLjMxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc1NSAgcG93ZXIgMC45NzUgIDAuNSAtPiAwLjk4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc1NiAgcG93ZXIgMC4wOTc1ICAwLjUgLT4gMC4zMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NTcgIHBvd2VyIDAuOTc2ICAwLjUgLT4gMC45ODggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NTggIHBvd2VyIDAuMDk3NiAgMC41IC0+IDAuMzEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzU5ICBwb3dlciAwLjk3NyAgMC41IC0+IDAuOTg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzYwICBwb3dlciAwLjA5NzcgIDAuNSAtPiAwLjMxMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc2MSAgcG93ZXIgMC45NzggIDAuNSAtPiAwLjk4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc2MiAgcG93ZXIgMC4wOTc4ICAwLjUgLT4gMC4zMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NjMgIHBvd2VyIDAuOTc5ICAwLjUgLT4gMC45ODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NjQgIHBvd2VyIDAuMDk3OSAgMC41IC0+IDAuMzEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzY1ICBwb3dlciAwLjk4MSAgMC41IC0+IDAuOTkwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzY2ICBwb3dlciAwLjA5ODEgIDAuNSAtPiAwLjMxMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc2NyAgcG93ZXIgMC45ODIgIDAuNSAtPiAwLjk5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc2OCAgcG93ZXIgMC4wOTgyICAwLjUgLT4gMC4zMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NjkgIHBvd2VyIDAuOTgzICAwLjUgLT4gMC45OTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NzAgIHBvd2VyIDAuMDk4MyAgMC41IC0+IDAuMzE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzcxICBwb3dlciAwLjk4NCAgMC41IC0+IDAuOTkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzcyICBwb3dlciAwLjA5ODQgIDAuNSAtPiAwLjMxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc3MyAgcG93ZXIgMC45ODUgIDAuNSAtPiAwLjk5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc3NCAgcG93ZXIgMC4wOTg1ICAwLjUgLT4gMC4zMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NzUgIHBvd2VyIDAuOTg2ICAwLjUgLT4gMC45OTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NzYgIHBvd2VyIDAuMDk4NiAgMC41IC0+IDAuMzE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Nzc3ICBwb3dlciAwLjk4NyAgMC41IC0+IDAuOTkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Nzc4ICBwb3dlciAwLjA5ODcgIDAuNSAtPiAwLjMxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc3OSAgcG93ZXIgMC45ODggIDAuNSAtPiAwLjk5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc4MCAgcG93ZXIgMC4wOTg4ICAwLjUgLT4gMC4zMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3ODEgIHBvd2VyIDAuOTg5ICAwLjUgLT4gMC45OTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3ODIgIHBvd2VyIDAuMDk4OSAgMC41IC0+IDAuMzE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzgzICBwb3dlciAwLjk5MSAgMC41IC0+IDAuOTk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Nzg0ICBwb3dlciAwLjA5OTEgIDAuNSAtPiAwLjMxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc4NSAgcG93ZXIgMC45OTIgIDAuNSAtPiAwLjk5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc4NiAgcG93ZXIgMC4wOTkyICAwLjUgLT4gMC4zMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3ODcgIHBvd2VyIDAuOTkzICAwLjUgLT4gMC45OTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3ODggIHBvd2VyIDAuMDk5MyAgMC41IC0+IDAuMzE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Nzg5ICBwb3dlciAwLjk5NCAgMC41IC0+IDAuOTk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzkwICBwb3dlciAwLjA5OTQgIDAuNSAtPiAwLjMxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc5MSAgcG93ZXIgMC45OTUgIDAuNSAtPiAwLjk5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc5MiAgcG93ZXIgMC4wOTk1ICAwLjUgLT4gMC4zMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3OTMgIHBvd2VyIDAuOTk2ICAwLjUgLT4gMC45OTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3OTQgIHBvd2VyIDAuMDk5NiAgMC41IC0+IDAuMzE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Nzk1ICBwb3dlciAwLjk5NyAgMC41IC0+IDAuOTk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Nzk2ICBwb3dlciAwLjA5OTcgIDAuNSAtPiAwLjMxNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc5NyAgcG93ZXIgMC45OTggIDAuNSAtPiAwLjk5OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc5OCAgcG93ZXIgMC4wOTk4ICAwLjUgLT4gMC4zMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3OTkgIHBvd2VyIDAuOTk5ICAwLjUgLT4gMC45OTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ4MDAgIHBvd2VyIDAuMDk5OSAgMC41IC0+IDAuMzE2ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gQSBncm91cCBvZiBwcmVjaXNpb24gNCB0ZXN0cyB3aGVyZSBIdWxsICYgQWJyaGFtIGFkanVzdG1lbnRzIGFyZQorLS0gbmVlZGVkIGluIHNvbWUgY2FzZXMgKGJvdGggdXAgYW5kIGRvd24pIFtzZWUgSHVsbDE5ODViXQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogICA0Citwd3N4NTAwMSAgcG93ZXIgMC4wMTE4ICAgMC41IC0+IDAuMTA4NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAwMiAgcG93ZXIgMC4xMTkgICAgMC41IC0+IDAuMzQ1MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAwMyAgcG93ZXIgMC4wMTE5ICAgMC41IC0+IDAuMTA5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAwNCAgcG93ZXIgMC4xMjEgICAgMC41IC0+IDAuMzQ3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAwNSAgcG93ZXIgMC4wMTIxICAgMC41IC0+IDAuMTEwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAwNiAgcG93ZXIgMC4xMjIgICAgMC41IC0+IDAuMzQ5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAwNyAgcG93ZXIgMC4wMTIyICAgMC41IC0+IDAuMTEwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAwOCAgcG93ZXIgMC4xMjMgICAgMC41IC0+IDAuMzUwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAwOSAgcG93ZXIgMC40OTQgICAgMC41IC0+IDAuNzAyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAxMCAgcG93ZXIgMC4wNjY5ICAgMC41IC0+IDAuMjU4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAxMSAgcG93ZXIgMC45NTU4ICAgMC41IC0+IDAuOTc3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAxMiAgcG93ZXIgMC45MzQ4ICAgMC41IC0+IDAuOTY2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAxMyAgcG93ZXIgMC45MzQ1ICAgMC41IC0+IDAuOTY2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAxNCAgcG93ZXIgMC4wOTM0NSAgMC41IC0+IDAuMzA1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAxNSAgcG93ZXIgMC45MzQ2ICAgMC41IC0+IDAuOTY2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAxNiAgcG93ZXIgMC4wOTM0NiAgMC41IC0+IDAuMzA1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NTAxNyAgcG93ZXIgMC45MzQ3ICAgMC41IC0+IDAuOTY2OCAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjQXJpdGgKK3ByZWNpc2lvbjogOQorcHdzeDcwMCAgcG93ZXIgIDAgICAgICAgIDAuNSAtPiAnMCcKK3B3c3g3MDEgIHBvd2VyICAtMCAgICAgICAwLjUgLT4gJzAnCitwd3N4NzAyICBwb3dlciAgMC4zOSAgICAgMC41IC0+IDAuNjI0NDk5ODAwICAgIEluZXhhY3QgUm91bmRlZAorcHdzeDcwMyAgcG93ZXIgIDEwMCAgICAgIDAuNSAtPiAnMTAuMDAwMDAwMCcgICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3MDQgIHBvd2VyICAxLjAwICAgICAwLjUgLT4gJzEuMDAwMDAwMDAnICAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzA1ICBwb3dlciAgNyAgICAgICAgMC41IC0+ICcyLjY0NTc1MTMxJyAgIEluZXhhY3QgUm91bmRlZAorcHdzeDcwNiAgcG93ZXIgIDEwICAgICAgIDAuNSAtPiAzLjE2MjI3NzY2ICAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBvbmUtb2ZmcworcHJlY2lzaW9uOiA5Citwd3N4NzExICBwb3dlciAgMC4xICAgICAgMC41IC0+IDAuMzE2MjI3NzY2ICAgIEluZXhhY3QgUm91bmRlZAorcHdzeDcxMiAgcG93ZXIgIDAuMiAgICAgIDAuNSAtPiAwLjQ0NzIxMzU5NSAgICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3MTMgIHBvd2VyICAwLjMgICAgICAwLjUgLT4gMC41NDc3MjI1NTggICAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzE0ICBwb3dlciAgMC40ICAgICAgMC41IC0+IDAuNjMyNDU1NTMyICAgIEluZXhhY3QgUm91bmRlZAorcHdzeDcxNSAgcG93ZXIgIDAuNSAgICAgIDAuNSAtPiAwLjcwNzEwNjc4MSAgICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3MTYgIHBvd2VyICAwLjYgICAgICAwLjUgLT4gMC43NzQ1OTY2NjkgICAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzE3ICBwb3dlciAgMC43ICAgICAgMC41IC0+IDAuODM2NjYwMDI3ICAgIEluZXhhY3QgUm91bmRlZAorcHdzeDcxOCAgcG93ZXIgIDAuOCAgICAgIDAuNSAtPiAwLjg5NDQyNzE5MSAgICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3MTkgIHBvd2VyICAwLjkgICAgICAwLjUgLT4gMC45NDg2ODMyOTggICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEwICAgICAgICAgICAgICAgLS0gbm90ZSBubyBub3JtYWxpemF0b2luIGhlcmUKK3B3c3g3MjAgIHBvd2VyICswLjEgICAgICAwLjUgLT4gMC4zMTYyMjc3NjYwICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDExCitwd3N4NzIxICBwb3dlciArMC4xICAgICAgMC41IC0+IDAuMzE2MjI3NzY2MDIgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMgorcHdzeDcyMiAgcG93ZXIgKzAuMSAgICAgIDAuNSAtPiAwLjMxNjIyNzc2NjAxNyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogOQorcHdzeDcyMyAgcG93ZXIgIDAuMzkgICAgIDAuNSAtPiAwLjYyNDQ5OTgwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTUKK3B3c3g3MjQgIHBvd2VyICAwLjM5ICAgICAwLjUgLT4gMC42MjQ0OTk3OTk4Mzk4NDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGRpc2N1c3Npb24gY2FzZXMKK3ByZWNpc2lvbjogNworcHdzeDczMSAgcG93ZXIgICAgIDkgICAgMC41IC0+IDMuMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3MzIgIHBvd2VyICAgMTAwICAgIDAuNSAtPiAxMC4wMDAwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzMzICBwb3dlciAgIDEyMyAgICAwLjUgLT4gMTEuMDkwNTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDczNCAgcG93ZXIgICAxNDQgICAgMC41IC0+IDEyLjAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3MzUgIHBvd2VyICAgMTU2ICAgIDAuNSAtPiAxMi40OTAwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzM2ICBwb3dlciAxMDAwMCAgICAwLjUgLT4gMTAwLjAwMDAgIEluZXhhY3QgUm91bmRlZAorCistLSB2YWx1ZXMgY2xvc2UgdG8gb3ZlcmZsb3cgKGlmIHRoZXJlIHdlcmUgaW5wdXQgcm91bmRpbmcpCittYXhleHBvbmVudDogOTkKK21pbmV4cG9uZW50OiAtOTkKK3ByZWNpc2lvbjogNQorcHdzeDc2MCAgcG93ZXIgIDkuOTk5N0UrOTkgICAgMC41IC0+IDkuOTk5OEUrNDkgSW5leGFjdCBSb3VuZGVkCitwd3N4NzYxICBwb3dlciAgOS45OTk4RSs5OSAgICAwLjUgLT4gOS45OTk5RSs0OSBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3NjIgIHBvd2VyICA5Ljk5OTlFKzk5ICAgIDAuNSAtPiA5Ljk5OTlFKzQ5IEluZXhhY3QgUm91bmRlZAorcHdzeDc2MyAgcG93ZXIgIDkuOTk5OTFFKzk5ICAgMC41IC0+IDEuMDAwMEUrNTAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzY0ICBwb3dlciAgOS45OTk5NEUrOTkgICAwLjUgLT4gMS4wMDAwRSs1MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3NjUgIHBvd2VyICA5Ljk5OTk1RSs5OSAgIDAuNSAtPiAxLjAwMDBFKzUwIEluZXhhY3QgUm91bmRlZAorcHdzeDc2NiAgcG93ZXIgIDkuOTk5OTlFKzk5ICAgMC41IC0+IDEuMDAwMEUrNTAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDkKK3B3c3g3NzAgIHBvd2VyICA5Ljk5OTdFKzk5ICAgIDAuNSAtPiA5Ljk5OTg1MDAwRSs0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzcxICBwb3dlciAgOS45OTk4RSs5OSAgICAwLjUgLT4gOS45OTk5MDAwMEUrNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDc3MiAgcG93ZXIgIDkuOTk5OUUrOTkgICAgMC41IC0+IDkuOTk5OTUwMDBFKzQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3NzMgIHBvd2VyICA5Ljk5OTkxRSs5OSAgIDAuNSAtPiA5Ljk5OTk1NTAwRSs0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Nzc0ICBwb3dlciAgOS45OTk5NEUrOTkgICAwLjUgLT4gOS45OTk5NzAwMEUrNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDc3NSAgcG93ZXIgIDkuOTk5OTVFKzk5ICAgMC41IC0+IDkuOTk5OTc1MDBFKzQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3NzYgIHBvd2VyICA5Ljk5OTk5RSs5OSAgIDAuNSAtPiA5Ljk5OTk5NTAwRSs0OSAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIwCitwd3N4NzgwICBwb3dlciAgOS45OTk3RSs5OSAgICAwLjUgLT4gJzkuOTk5ODQ5OTk4ODc0OTgzMTI0N0UrNDknIEluZXhhY3QgUm91bmRlZAorcHdzeDc4MSAgcG93ZXIgIDkuOTk5OEUrOTkgICAgMC41IC0+ICc5Ljk5OTg5OTk5OTQ5OTk5NDk5OTlFKzQ5JyBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3ODIgIHBvd2VyICA5Ljk5OTlFKzk5ICAgIDAuNSAtPiAnOS45OTk5NDk5OTk4NzQ5OTkzNzUwRSs0OScgSW5leGFjdCBSb3VuZGVkCitwd3N4NzgzICBwb3dlciAgOS45OTk5MUUrOTkgICAwLjUgLT4gJzkuOTk5OTU0OTk5ODk4NzQ5NTQ0NEUrNDknIEluZXhhY3QgUm91bmRlZAorcHdzeDc4NCAgcG93ZXIgIDkuOTk5OTRFKzk5ICAgMC41IC0+ICc5Ljk5OTk2OTk5OTk1NDk5OTg2NTBFKzQ5JyBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3ODUgIHBvd2VyICA5Ljk5OTk1RSs5OSAgIDAuNSAtPiAnOS45OTk5NzQ5OTk5Njg3NDk5MjE5RSs0OScgSW5leGFjdCBSb3VuZGVkCitwd3N4Nzg2ICBwb3dlciAgOS45OTk5OUUrOTkgICAwLjUgLT4gJzkuOTk5OTk0OTk5OTk4NzQ5OTk5NEUrNDknIEluZXhhY3QgUm91bmRlZAorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3dzIFt0aGVzZSBjYW4gb25seSByZXN1bHQgd2hlbiBlTWF4IGlzIDwgZGlnaXRzKzFdCistLSBFdGlueSA9IC0oRW1heCArIChwcmVjaXNpb24tMSkpCistLSBzdGFydCB3aXRoIHN1Ym5vcm1hbCBvcGVyYW5kcyBhbmQgbm9ybWFsIHJlc3VsdHMKK21heGV4cG9uZW50OiA5CittaW5leHBvbmVudDogLTkKK3ByZWNpc2lvbjogOSAgICAgICAgICAgICAgICAtLSBFdGlueT0tMTcKK3B3c3g4MDAgIHBvd2VyICAxRS0xNyAgICAwLjUgLT4gMy4xNjIyNzc2NkUtOSBJbmV4YWN0IFJvdW5kZWQKK3B3c3g4MDEgIHBvd2VyIDEwRS0xNyAgICAwLjUgLT4gMS4wMDAwMDAwMEUtOCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTAgICAgICAgICAgICAgICAtLSBFdGlueT0tMTgKK3B3c3g4MDIgIHBvd2VyIDEwRS0xOCAgICAwLjUgLT4gMy4xNjIyNzc2NjBFLTkgSW5leGFjdCBSb3VuZGVkCitwd3N4ODAzICBwb3dlciAgMUUtMTggICAgMC41IC0+IDEuMDAwMDAwMDAwRS05IEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDExICAgICAgICAgICAgICAgLS0gRXRpbnk9LTE5Citwd3N4ODA0ICBwb3dlciAgMUUtMTkgICAgMC41IC0+IDMuMTYyMjc3NjYwRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorLS0gVGhlIG5leHQgdGVzdCBzaG91bGQgYmUgc2tpcHBlZCBmb3IgZGVjTnVtYmVyCitwd3N4ODA1ICBwb3dlciAxMEUtMTkgICAgMC41IC0+IDEuMDAwMDAwMDAwMEUtOSBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTIgICAgICAgICAgICAgICAtLSBFdGlueT0tMjAKK3B3c3g4MDYgIHBvd2VyIDEwRS0yMCAgICAwLjUgLT4gMy4xNjIyNzc2NjAyRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcHdzeDgwNyAgcG93ZXIgIDFFLTIwICAgIDAuNSAtPiAxLjAwMDAwMDAwMDBFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMTMgICAgICAgICAgICAgICAtLSBFdGlueT0tMjEKK3B3c3g4MDggIHBvd2VyICAxRS0yMSAgICAwLjUgLT4gMy4xNjIyNzc2NjAyRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcHdzeDgwOSAgcG93ZXIgMTBFLTIxICAgIDAuNSAtPiAxLjAwMDAwMDAwMDAwRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNCAgICAgICAgICAgICAgIC0tIEV0aW55PS0yMgorcHdzeDgxMCAgcG93ZXIgIDFFLTIxICAgIDAuNSAtPiAzLjE2MjI3NzY2MDE3RS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcHdzeDgxMSAgcG93ZXIgMTBFLTIyICAgIDAuNSAtPiAzLjE2MjI3NzY2MDE3RS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcHdzeDgxMiAgcG93ZXIgIDFFLTIyICAgIDAuNSAtPiAxLjAwMDAwMDAwMDAwRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCisKKy0tIHNwZWNpYWwgdmFsdWVzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHdzeDgyMCAgcG93ZXIgICBJbmYgICAgIDAuNSAtPiBJbmZpbml0eQorcHdzeDgyMSAgcG93ZXIgIC1JbmYgICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3g4MjIgIHBvd2VyICAgTmFOICAgICAwLjUgLT4gTmFOCitwd3N4ODIzICBwb3dlciAgc05hTiAgICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gcHJvcGFnYXRpbmcgTmFOcworcHdzeDgyNCAgcG93ZXIgIHNOYU4xMjMgIDAuNSAtPiBOYU4xMjMgSW52YWxpZF9vcGVyYXRpb24KK3B3c3g4MjUgIHBvd2VyIC1zTmFOMzIxICAwLjUgLT4gLU5hTjMyMSBJbnZhbGlkX29wZXJhdGlvbgorcHdzeDgyNiAgcG93ZXIgICBOYU40NTYgIDAuNSAtPiBOYU40NTYKK3B3c3g4MjcgIHBvd2VyICAtTmFONjU0ICAwLjUgLT4gLU5hTjY1NAorcHdzeDgyOCAgcG93ZXIgICBOYU4xICAgIDAuNSAtPiBOYU4xCisKKy0tIE51bGwgdGVzdAorcHdzeDkwMCAgcG93ZXIgICMgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcXVhbnRpemUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcXVhbnRpemUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Y4NGJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9xdWFudGl6ZS5kZWNUZXN0CkBAIC0wLDAgKzEsOTQ4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHF1YW50aXplLmRlY1Rlc3QgLS0gZGVjaW1hbCBxdWFudGl6ZSBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gTW9zdCBvZiB0aGUgdGVzdHMgaGVyZSBhc3N1bWUgYSAicmVndWxhciBwYXR0ZXJuIiwgd2hlcmUgdGhlCistLSBzaWduIGFuZCBjb2VmZmljaWVudCBhcmUgKzEuCistLSAyMDA0LjAzLjE1IFVuZGVyZmxvdyBmb3IgcXVhbnRpemUgaXMgc3VwcHJlc3NlZAorLS0gMjAwNS4wNi4wOCBNb3JlIGV4dGVuc2l2ZSB0ZXN0cyBmb3IgJ2RvZXMgbm90IGZpdCcKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKKworLS0gc2FuaXR5IGNoZWNrcworcXVheDAwMSBxdWFudGl6ZSAwICAgICAgIDFlMCAgIC0+IDAKK3F1YXgwMDIgcXVhbnRpemUgMSAgICAgICAxZTAgICAtPiAxCitxdWF4MDAzIHF1YW50aXplIDAuMSAgICAxZSsyICAgLT4gMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwMDUgcXVhbnRpemUgMC4xICAgIDFlKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDAwNiBxdWFudGl6ZSAwLjEgICAgIDFlMCAgIC0+IDAgSW5leGFjdCBSb3VuZGVkCitxdWF4MDA3IHF1YW50aXplIDAuMSAgICAxZS0xICAgLT4gMC4xCitxdWF4MDA4IHF1YW50aXplIDAuMSAgICAxZS0yICAgLT4gMC4xMAorcXVheDAwOSBxdWFudGl6ZSAwLjEgICAgMWUtMyAgIC0+IDAuMTAwCitxdWF4MDEwIHF1YW50aXplIDAuOSAgICAxZSsyICAgLT4gMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwMTEgcXVhbnRpemUgMC45ICAgIDFlKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDAxMiBxdWFudGl6ZSAwLjkgICAgMWUrMCAgIC0+IDEgSW5leGFjdCBSb3VuZGVkCitxdWF4MDEzIHF1YW50aXplIDAuOSAgICAxZS0xICAgLT4gMC45CitxdWF4MDE0IHF1YW50aXplIDAuOSAgICAxZS0yICAgLT4gMC45MAorcXVheDAxNSBxdWFudGl6ZSAwLjkgICAgMWUtMyAgIC0+IDAuOTAwCistLSBuZWdhdGl2ZXMKK3F1YXgwMjEgcXVhbnRpemUgLTAgICAgICAxZTAgICAtPiAtMAorcXVheDAyMiBxdWFudGl6ZSAtMSAgICAgIDFlMCAgIC0+IC0xCitxdWF4MDIzIHF1YW50aXplIC0wLjEgICAxZSsyICAgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MDI1IHF1YW50aXplIC0wLjEgICAxZSsxICAgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MDI2IHF1YW50aXplIC0wLjEgICAgMWUwICAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitxdWF4MDI3IHF1YW50aXplIC0wLjEgICAxZS0xICAgLT4gLTAuMQorcXVheDAyOCBxdWFudGl6ZSAtMC4xICAgMWUtMiAgIC0+IC0wLjEwCitxdWF4MDI5IHF1YW50aXplIC0wLjEgICAxZS0zICAgLT4gLTAuMTAwCitxdWF4MDMwIHF1YW50aXplIC0wLjkgICAxZSsyICAgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MDMxIHF1YW50aXplIC0wLjkgICAxZSsxICAgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MDMyIHF1YW50aXplIC0wLjkgICAxZSswICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitxdWF4MDMzIHF1YW50aXplIC0wLjkgICAxZS0xICAgLT4gLTAuOQorcXVheDAzNCBxdWFudGl6ZSAtMC45ICAgMWUtMiAgIC0+IC0wLjkwCitxdWF4MDM1IHF1YW50aXplIC0wLjkgICAxZS0zICAgLT4gLTAuOTAwCitxdWF4MDM2IHF1YW50aXplIC0wLjUgICAxZSsyICAgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MDM3IHF1YW50aXplIC0wLjUgICAxZSsxICAgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MDM4IHF1YW50aXplIC0wLjUgICAxZSswICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitxdWF4MDM5IHF1YW50aXplIC0wLjUgICAxZS0xICAgLT4gLTAuNQorcXVheDA0MCBxdWFudGl6ZSAtMC41ICAgMWUtMiAgIC0+IC0wLjUwCitxdWF4MDQxIHF1YW50aXplIC0wLjUgICAxZS0zICAgLT4gLTAuNTAwCitxdWF4MDQyIHF1YW50aXplIC0wLjkgICAxZSsyICAgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MDQzIHF1YW50aXplIC0wLjkgICAxZSsxICAgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MDQ0IHF1YW50aXplIC0wLjkgICAxZSswICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitxdWF4MDQ1IHF1YW50aXplIC0wLjkgICAxZS0xICAgLT4gLTAuOQorcXVheDA0NiBxdWFudGl6ZSAtMC45ICAgMWUtMiAgIC0+IC0wLjkwCitxdWF4MDQ3IHF1YW50aXplIC0wLjkgICAxZS0zICAgLT4gLTAuOTAwCisKKy0tIGV4YW1wbGVzIGZyb20gU3BlY2lmaWNhdGlvbgorcXVheDA2MCBxdWFudGl6ZSAyLjE3ICAgMC4wMDEgIC0+IDIuMTcwCitxdWF4MDYxIHF1YW50aXplIDIuMTcgICAwLjAxICAgLT4gMi4xNworcXVheDA2MiBxdWFudGl6ZSAyLjE3ICAgMC4xICAgIC0+IDIuMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwNjMgcXVhbnRpemUgMi4xNyAgIDFlKzAgICAtPiAyIEluZXhhY3QgUm91bmRlZAorcXVheDA2NCBxdWFudGl6ZSAyLjE3ICAgMWUrMSAgIC0+IDBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MDY1IHF1YW50aXplIC1JbmYgICAgSW5mICAgLT4gLUluZmluaXR5CitxdWF4MDY2IHF1YW50aXplIDIgICAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4MDY3IHF1YW50aXplIC0wLjEgICAgMSAgICAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitxdWF4MDY4IHF1YW50aXplIC0wICAgICAgMWUrNSAgICAgLT4gLTBFKzUKK3F1YXgwNjkgcXVhbnRpemUgKzM1MjM2NDUwLjYgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXgwNzAgcXVhbnRpemUgLTM1MjM2NDUwLjYgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXgwNzEgcXVhbnRpemUgMjE3ICAgIDFlLTEgICAtPiAyMTcuMAorcXVheDA3MiBxdWFudGl6ZSAyMTcgICAgMWUrMCAgIC0+IDIxNworcXVheDA3MyBxdWFudGl6ZSAyMTcgICAgMWUrMSAgIC0+IDIuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwNzQgcXVhbnRpemUgMjE3ICAgIDFlKzIgICAtPiAyRSsyIEluZXhhY3QgUm91bmRlZAorCistLSBnZW5lcmFsIHRlc3RzIC4uCitxdWF4MDg5IHF1YW50aXplIDEyICAgICAxZSs0ICAgLT4gMEUrNCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwOTAgcXVhbnRpemUgMTIgICAgIDFlKzMgICAtPiAwRSszIEluZXhhY3QgUm91bmRlZAorcXVheDA5MSBxdWFudGl6ZSAxMiAgICAgMWUrMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MDkyIHF1YW50aXplIDEyICAgICAxZSsxICAgLT4gMUUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwOTMgcXVhbnRpemUgMS4yMzQ1IDFlLTIgICAtPiAxLjIzIEluZXhhY3QgUm91bmRlZAorcXVheDA5NCBxdWFudGl6ZSAxLjIzNTUgMWUtMiAgIC0+IDEuMjQgSW5leGFjdCBSb3VuZGVkCitxdWF4MDk1IHF1YW50aXplIDEuMjM0NSAxZS02ICAgLT4gMS4yMzQ1MDAKK3F1YXgwOTYgcXVhbnRpemUgOS45OTk5IDFlLTIgICAtPiAxMC4wMCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwOTcgcXVhbnRpemUgMC4wMDAxIDFlLTIgICAtPiAwLjAwIEluZXhhY3QgUm91bmRlZAorcXVheDA5OCBxdWFudGl6ZSAwLjAwMSAgMWUtMiAgIC0+IDAuMDAgSW5leGFjdCBSb3VuZGVkCitxdWF4MDk5IHF1YW50aXplIDAuMDA5ICAxZS0yICAgLT4gMC4wMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxMDAgcXVhbnRpemUgOTIgICAgIDFlKzIgICAtPiAxRSsyIEluZXhhY3QgUm91bmRlZAorCitxdWF4MTAxIHF1YW50aXplIC0xICAgICAgMWUwICAgLT4gIC0xCitxdWF4MTAyIHF1YW50aXplIC0xICAgICAxZS0xICAgLT4gIC0xLjAKK3F1YXgxMDMgcXVhbnRpemUgLTEgICAgIDFlLTIgICAtPiAgLTEuMDAKK3F1YXgxMDQgcXVhbnRpemUgIDAgICAgICAxZTAgICAtPiAgMAorcXVheDEwNSBxdWFudGl6ZSAgMCAgICAgMWUtMSAgIC0+ICAwLjAKK3F1YXgxMDYgcXVhbnRpemUgIDAgICAgIDFlLTIgICAtPiAgMC4wMAorcXVheDEwNyBxdWFudGl6ZSAgMC4wMCAgIDFlMCAgIC0+ICAwCitxdWF4MTA4IHF1YW50aXplICAwICAgICAxZSsxICAgLT4gIDBFKzEKK3F1YXgxMDkgcXVhbnRpemUgIDAgICAgIDFlKzIgICAtPiAgMEUrMgorcXVheDExMCBxdWFudGl6ZSArMSAgICAgIDFlMCAgIC0+ICAxCitxdWF4MTExIHF1YW50aXplICsxICAgICAxZS0xICAgLT4gIDEuMAorcXVheDExMiBxdWFudGl6ZSArMSAgICAgMWUtMiAgIC0+ICAxLjAwCisKK3F1YXgxMjAgcXVhbnRpemUgICAxLjA0ICAxZS0zIC0+ICAxLjA0MAorcXVheDEyMSBxdWFudGl6ZSAgIDEuMDQgIDFlLTIgLT4gIDEuMDQKK3F1YXgxMjIgcXVhbnRpemUgICAxLjA0ICAxZS0xIC0+ICAxLjAgSW5leGFjdCBSb3VuZGVkCitxdWF4MTIzIHF1YW50aXplICAgMS4wNCAgIDFlMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxMjQgcXVhbnRpemUgICAxLjA1ICAxZS0zIC0+ICAxLjA1MAorcXVheDEyNSBxdWFudGl6ZSAgIDEuMDUgIDFlLTIgLT4gIDEuMDUKK3F1YXgxMjYgcXVhbnRpemUgICAxLjA1ICAxZS0xIC0+ICAxLjEgSW5leGFjdCBSb3VuZGVkCitxdWF4MTMxIHF1YW50aXplICAgMS4wNSAgIDFlMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxMzIgcXVhbnRpemUgICAxLjA2ICAxZS0zIC0+ICAxLjA2MAorcXVheDEzMyBxdWFudGl6ZSAgIDEuMDYgIDFlLTIgLT4gIDEuMDYKK3F1YXgxMzQgcXVhbnRpemUgICAxLjA2ICAxZS0xIC0+ICAxLjEgSW5leGFjdCBSb3VuZGVkCitxdWF4MTM1IHF1YW50aXplICAgMS4wNiAgIDFlMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKKworcXVheDE0MCBxdWFudGl6ZSAgIC0xMCAgICAxZS0yICAtPiAgLTEwLjAwCitxdWF4MTQxIHF1YW50aXplICAgKzEgICAgIDFlLTIgIC0+ICAxLjAwCitxdWF4MTQyIHF1YW50aXplICAgKzEwICAgIDFlLTIgIC0+ICAxMC4wMAorcXVheDE0MyBxdWFudGl6ZSAgIDFFKzEwICAxZS0yICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4MTQ0IHF1YW50aXplICAgMUUtMTAgIDFlLTIgIC0+ICAwLjAwIEluZXhhY3QgUm91bmRlZAorcXVheDE0NSBxdWFudGl6ZSAgIDFFLTMgICAxZS0yICAtPiAgMC4wMCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxNDYgcXVhbnRpemUgICAxRS0yICAgMWUtMiAgLT4gIDAuMDEKK3F1YXgxNDcgcXVhbnRpemUgICAxRS0xICAgMWUtMiAgLT4gIDAuMTAKK3F1YXgxNDggcXVhbnRpemUgICAwRS0xMCAgMWUtMiAgLT4gIDAuMDAKKworcXVheDE1MCBxdWFudGl6ZSAgIDEuMDYwMCAxZS01IC0+ICAxLjA2MDAwCitxdWF4MTUxIHF1YW50aXplICAgMS4wNjAwIDFlLTQgLT4gIDEuMDYwMAorcXVheDE1MiBxdWFudGl6ZSAgIDEuMDYwMCAxZS0zIC0+ICAxLjA2MCBSb3VuZGVkCitxdWF4MTUzIHF1YW50aXplICAgMS4wNjAwIDFlLTIgLT4gIDEuMDYgUm91bmRlZAorcXVheDE1NCBxdWFudGl6ZSAgIDEuMDYwMCAxZS0xIC0+ICAxLjEgSW5leGFjdCBSb3VuZGVkCitxdWF4MTU1IHF1YW50aXplICAgMS4wNjAwICAxZTAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCisKKy0tIGJhc2UgdGVzdHMgd2l0aCBub24tMSBjb2VmZmljaWVudHMKK3F1YXgxNjEgcXVhbnRpemUgMCAgICAgIC05ZTAgICAtPiAwCitxdWF4MTYyIHF1YW50aXplIDEgICAgICAtN2UwICAgLT4gMQorcXVheDE2MyBxdWFudGl6ZSAwLjEgICAtMWUrMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MTY1IHF1YW50aXplIDAuMSAgICAwZSsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxNjYgcXVhbnRpemUgMC4xICAgICAyZTAgICAtPiAwIEluZXhhY3QgUm91bmRlZAorcXVheDE2NyBxdWFudGl6ZSAwLjEgICAgM2UtMSAgIC0+IDAuMQorcXVheDE2OCBxdWFudGl6ZSAwLjEgICA0NGUtMiAgIC0+IDAuMTAKK3F1YXgxNjkgcXVhbnRpemUgMC4xICA1NTVlLTMgICAtPiAwLjEwMAorcXVheDE3MCBxdWFudGl6ZSAwLjkgNjY2NmUrMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MTcxIHF1YW50aXplIDAuOSAtNzc3ZSsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxNzIgcXVhbnRpemUgMC45ICAtODhlKzAgICAtPiAxIEluZXhhY3QgUm91bmRlZAorcXVheDE3MyBxdWFudGl6ZSAwLjkgICAtOWUtMSAgIC0+IDAuOQorcXVheDE3NCBxdWFudGl6ZSAwLjkgICAgMGUtMiAgIC0+IDAuOTAKK3F1YXgxNzUgcXVhbnRpemUgMC45ICAxLjFlLTMgICAtPiAwLjkwMDAKKy0tIG5lZ2F0aXZlcworcXVheDE4MSBxdWFudGl6ZSAtMCAgICAxLjFlMCAgIC0+IC0wLjAKK3F1YXgxODIgcXVhbnRpemUgLTEgICAgIC0xZTAgICAtPiAtMQorcXVheDE4MyBxdWFudGl6ZSAtMC4xICAxMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDE4NSBxdWFudGl6ZSAtMC4xIDExMWUrMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDE4NiBxdWFudGl6ZSAtMC4xICAgNzFlMCAgIC0+IC0wIEluZXhhY3QgUm91bmRlZAorcXVheDE4NyBxdWFudGl6ZSAtMC4xIC05MWUtMSAgIC0+IC0wLjEKK3F1YXgxODggcXVhbnRpemUgLTAuMSAtLjFlLTIgICAtPiAtMC4xMDAKK3F1YXgxODkgcXVhbnRpemUgLTAuMSAgLTFlLTMgICAtPiAtMC4xMDAKK3F1YXgxOTAgcXVhbnRpemUgLTAuOSAgIDBlKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxOTEgcXVhbnRpemUgLTAuOSAgLTBlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxOTIgcXVhbnRpemUgLTAuOSAtMTBlKzAgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxOTMgcXVhbnRpemUgLTAuOSAxMDBlLTEgICAtPiAtMC45CitxdWF4MTk0IHF1YW50aXplIC0wLjkgOTk5ZS0yICAgLT4gLTAuOTAKKworLS0gK3ZlIGV4cG9uZW50cyAuLgorcXVheDIwMSBxdWFudGl6ZSAgIC0xICAgMWUrMCAtPiAgLTEKK3F1YXgyMDIgcXVhbnRpemUgICAtMSAgIDFlKzEgLT4gIC0wRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDIwMyBxdWFudGl6ZSAgIC0xICAgMWUrMiAtPiAgLTBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MjA0IHF1YW50aXplICAgIDAgICAxZSswIC0+ICAwCitxdWF4MjA1IHF1YW50aXplICAgIDAgICAxZSsxIC0+ICAwRSsxCitxdWF4MjA2IHF1YW50aXplICAgIDAgICAxZSsyIC0+ICAwRSsyCitxdWF4MjA3IHF1YW50aXplICAgKzEgICAxZSswIC0+ICAxCitxdWF4MjA4IHF1YW50aXplICAgKzEgICAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDIwOSBxdWFudGl6ZSAgICsxICAgMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworcXVheDIyMCBxdWFudGl6ZSAgIDEuMDQgMWUrMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyMjEgcXVhbnRpemUgICAxLjA0IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MjIyIHF1YW50aXplICAgMS4wNCAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDIyMyBxdWFudGl6ZSAgIDEuMDQgMWUrMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyMjQgcXVhbnRpemUgICAxLjA1IDFlKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitxdWF4MjI1IHF1YW50aXplICAgMS4wNSAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDIyNiBxdWFudGl6ZSAgIDEuMDUgMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyMjcgcXVhbnRpemUgICAxLjA1IDFlKzAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitxdWF4MjI4IHF1YW50aXplICAgMS4wNSAxZSszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcXVheDIyOSBxdWFudGl6ZSAgIDEuMDUgMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyMzAgcXVhbnRpemUgICAxLjA1IDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MjMxIHF1YW50aXplICAgMS4wNSAxZSswIC0+ICAxIEluZXhhY3QgUm91bmRlZAorcXVheDIzMiBxdWFudGl6ZSAgIDEuMDYgMWUrMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyMzMgcXVhbnRpemUgICAxLjA2IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MjM0IHF1YW50aXplICAgMS4wNiAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDIzNSBxdWFudGl6ZSAgIDEuMDYgMWUrMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKKworcXVheDI0MCBxdWFudGl6ZSAgIC0xMCAgIDFlKzEgIC0+ICAtMUUrMSBSb3VuZGVkCitxdWF4MjQxIHF1YW50aXplICAgKzEgICAgMWUrMSAgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MjQyIHF1YW50aXplICAgKzEwICAgMWUrMSAgLT4gIDFFKzEgUm91bmRlZAorcXVheDI0MyBxdWFudGl6ZSAgIDFFKzEgIDFlKzEgIC0+ICAxRSsxICAgICAgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK3F1YXgyNDQgcXVhbnRpemUgICAxRSsyICAxZSsxICAtPiAgMS4wRSsyICAgICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitxdWF4MjQ1IHF1YW50aXplICAgMUUrMyAgMWUrMSAgLT4gIDEuMDBFKzMgICAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorcXVheDI0NiBxdWFudGl6ZSAgIDFFKzQgIDFlKzEgIC0+ICAxLjAwMEUrNCAgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK3F1YXgyNDcgcXVhbnRpemUgICAxRSs1ICAxZSsxICAtPiAgMS4wMDAwRSs1ICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitxdWF4MjQ4IHF1YW50aXplICAgMUUrNiAgMWUrMSAgLT4gIDEuMDAwMDBFKzYgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorcXVheDI0OSBxdWFudGl6ZSAgIDFFKzcgIDFlKzEgIC0+ICAxLjAwMDAwMEUrNyAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK3F1YXgyNTAgcXVhbnRpemUgICAxRSs4ICAxZSsxICAtPiAgMS4wMDAwMDAwRSs4ICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitxdWF4MjUxIHF1YW50aXplICAgMUUrOSAgMWUrMSAgLT4gIDEuMDAwMDAwMDBFKzkgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorLS0gbmV4dCBvbmUgdHJpZXMgdG8gYWRkIDkgemVyb3MKK3F1YXgyNTIgcXVhbnRpemUgICAxRSsxMCAxZSsxICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4MjUzIHF1YW50aXplICAgMUUtMTAgMWUrMSAgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MjU0IHF1YW50aXplICAgMUUtMiAgMWUrMSAgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MjU1IHF1YW50aXplICAgMEUtMTAgMWUrMSAgLT4gIDBFKzEKK3F1YXgyNTYgcXVhbnRpemUgIC0wRS0xMCAxZSsxICAtPiAtMEUrMQorcXVheDI1NyBxdWFudGl6ZSAgLTBFLTEgIDFlKzEgIC0+IC0wRSsxCitxdWF4MjU4IHF1YW50aXplICAtMCAgICAgMWUrMSAgLT4gLTBFKzEKK3F1YXgyNTkgcXVhbnRpemUgIC0wRSsxICAxZSsxICAtPiAtMEUrMQorCitxdWF4MjYwIHF1YW50aXplICAgLTEwICAgMWUrMiAgLT4gIC0wRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDI2MSBxdWFudGl6ZSAgICsxICAgIDFlKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDI2MiBxdWFudGl6ZSAgICsxMCAgIDFlKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDI2MyBxdWFudGl6ZSAgIDFFKzEgIDFlKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDI2NCBxdWFudGl6ZSAgIDFFKzIgIDFlKzIgIC0+ICAxRSsyCitxdWF4MjY1IHF1YW50aXplICAgMUUrMyAgMWUrMiAgLT4gIDEuMEUrMworcXVheDI2NiBxdWFudGl6ZSAgIDFFKzQgIDFlKzIgIC0+ICAxLjAwRSs0CitxdWF4MjY3IHF1YW50aXplICAgMUUrNSAgMWUrMiAgLT4gIDEuMDAwRSs1CitxdWF4MjY4IHF1YW50aXplICAgMUUrNiAgMWUrMiAgLT4gIDEuMDAwMEUrNgorcXVheDI2OSBxdWFudGl6ZSAgIDFFKzcgIDFlKzIgIC0+ICAxLjAwMDAwRSs3CitxdWF4MjcwIHF1YW50aXplICAgMUUrOCAgMWUrMiAgLT4gIDEuMDAwMDAwRSs4CitxdWF4MjcxIHF1YW50aXplICAgMUUrOSAgMWUrMiAgLT4gIDEuMDAwMDAwMEUrOQorcXVheDI3MiBxdWFudGl6ZSAgIDFFKzEwIDFlKzIgIC0+ICAxLjAwMDAwMDAwRSsxMAorcXVheDI3MyBxdWFudGl6ZSAgIDFFLTEwIDFlKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDI3NCBxdWFudGl6ZSAgIDFFLTIgIDFlKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDI3NSBxdWFudGl6ZSAgIDBFLTEwIDFlKzIgIC0+ICAwRSsyCisKK3F1YXgyODAgcXVhbnRpemUgICAtMTAgICAxZSszICAtPiAgLTBFKzMgSW5leGFjdCBSb3VuZGVkCitxdWF4MjgxIHF1YW50aXplICAgKzEgICAgMWUrMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitxdWF4MjgyIHF1YW50aXplICAgKzEwICAgMWUrMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitxdWF4MjgzIHF1YW50aXplICAgMUUrMSAgMWUrMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitxdWF4Mjg0IHF1YW50aXplICAgMUUrMiAgMWUrMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitxdWF4Mjg1IHF1YW50aXplICAgMUUrMyAgMWUrMyAgLT4gIDFFKzMKK3F1YXgyODYgcXVhbnRpemUgICAxRSs0ICAxZSszICAtPiAgMS4wRSs0CitxdWF4Mjg3IHF1YW50aXplICAgMUUrNSAgMWUrMyAgLT4gIDEuMDBFKzUKK3F1YXgyODggcXVhbnRpemUgICAxRSs2ICAxZSszICAtPiAgMS4wMDBFKzYKK3F1YXgyODkgcXVhbnRpemUgICAxRSs3ICAxZSszICAtPiAgMS4wMDAwRSs3CitxdWF4MjkwIHF1YW50aXplICAgMUUrOCAgMWUrMyAgLT4gIDEuMDAwMDBFKzgKK3F1YXgyOTEgcXVhbnRpemUgICAxRSs5ICAxZSszICAtPiAgMS4wMDAwMDBFKzkKK3F1YXgyOTIgcXVhbnRpemUgICAxRSsxMCAxZSszICAtPiAgMS4wMDAwMDAwRSsxMAorcXVheDI5MyBxdWFudGl6ZSAgIDFFLTEwIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcXVheDI5NCBxdWFudGl6ZSAgIDFFLTIgIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcXVheDI5NSBxdWFudGl6ZSAgIDBFLTEwIDFlKzMgIC0+ICAwRSszCisKKy0tIHJvdW5kIHVwIGZyb20gYmVsb3cgW3NpZ24gd3JvbmcgaW4gSklUIGNvbXBpbGVyIG9uY2VdCitxdWF4MzAwIHF1YW50aXplICAgMC4wMDc4IDFlLTUgLT4gIDAuMDA3ODAKK3F1YXgzMDEgcXVhbnRpemUgICAwLjAwNzggMWUtNCAtPiAgMC4wMDc4CitxdWF4MzAyIHF1YW50aXplICAgMC4wMDc4IDFlLTMgLT4gIDAuMDA4IEluZXhhY3QgUm91bmRlZAorcXVheDMwMyBxdWFudGl6ZSAgIDAuMDA3OCAxZS0yIC0+ICAwLjAxIEluZXhhY3QgUm91bmRlZAorcXVheDMwNCBxdWFudGl6ZSAgIDAuMDA3OCAxZS0xIC0+ICAwLjAgSW5leGFjdCBSb3VuZGVkCitxdWF4MzA1IHF1YW50aXplICAgMC4wMDc4ICAxZTAgLT4gIDAgSW5leGFjdCBSb3VuZGVkCitxdWF4MzA2IHF1YW50aXplICAgMC4wMDc4IDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MzA3IHF1YW50aXplICAgMC4wMDc4IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCisKK3F1YXgzMTAgcXVhbnRpemUgIC0wLjAwNzggMWUtNSAtPiAtMC4wMDc4MAorcXVheDMxMSBxdWFudGl6ZSAgLTAuMDA3OCAxZS00IC0+IC0wLjAwNzgKK3F1YXgzMTIgcXVhbnRpemUgIC0wLjAwNzggMWUtMyAtPiAtMC4wMDggSW5leGFjdCBSb3VuZGVkCitxdWF4MzEzIHF1YW50aXplICAtMC4wMDc4IDFlLTIgLT4gLTAuMDEgSW5leGFjdCBSb3VuZGVkCitxdWF4MzE0IHF1YW50aXplICAtMC4wMDc4IDFlLTEgLT4gLTAuMCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzMTUgcXVhbnRpemUgIC0wLjAwNzggIDFlMCAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzMTYgcXVhbnRpemUgIC0wLjAwNzggMWUrMSAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzMTcgcXVhbnRpemUgIC0wLjAwNzggMWUrMiAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworcXVheDMyMCBxdWFudGl6ZSAgIDAuMDc4IDFlLTUgLT4gIDAuMDc4MDAKK3F1YXgzMjEgcXVhbnRpemUgICAwLjA3OCAxZS00IC0+ICAwLjA3ODAKK3F1YXgzMjIgcXVhbnRpemUgICAwLjA3OCAxZS0zIC0+ICAwLjA3OAorcXVheDMyMyBxdWFudGl6ZSAgIDAuMDc4IDFlLTIgLT4gIDAuMDggSW5leGFjdCBSb3VuZGVkCitxdWF4MzI0IHF1YW50aXplICAgMC4wNzggMWUtMSAtPiAgMC4xIEluZXhhY3QgUm91bmRlZAorcXVheDMyNSBxdWFudGl6ZSAgIDAuMDc4ICAxZTAgLT4gIDAgSW5leGFjdCBSb3VuZGVkCitxdWF4MzI2IHF1YW50aXplICAgMC4wNzggMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzMjcgcXVhbnRpemUgICAwLjA3OCAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorCitxdWF4MzMwIHF1YW50aXplICAtMC4wNzggMWUtNSAtPiAtMC4wNzgwMAorcXVheDMzMSBxdWFudGl6ZSAgLTAuMDc4IDFlLTQgLT4gLTAuMDc4MAorcXVheDMzMiBxdWFudGl6ZSAgLTAuMDc4IDFlLTMgLT4gLTAuMDc4CitxdWF4MzMzIHF1YW50aXplICAtMC4wNzggMWUtMiAtPiAtMC4wOCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzMzQgcXVhbnRpemUgIC0wLjA3OCAxZS0xIC0+IC0wLjEgSW5leGFjdCBSb3VuZGVkCitxdWF4MzM1IHF1YW50aXplICAtMC4wNzggIDFlMCAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzMzYgcXVhbnRpemUgIC0wLjA3OCAxZSsxIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDMzNyBxdWFudGl6ZSAgLTAuMDc4IDFlKzIgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCisKK3F1YXgzNDAgcXVhbnRpemUgICAwLjc4IDFlLTUgLT4gIDAuNzgwMDAKK3F1YXgzNDEgcXVhbnRpemUgICAwLjc4IDFlLTQgLT4gIDAuNzgwMAorcXVheDM0MiBxdWFudGl6ZSAgIDAuNzggMWUtMyAtPiAgMC43ODAKK3F1YXgzNDMgcXVhbnRpemUgICAwLjc4IDFlLTIgLT4gIDAuNzgKK3F1YXgzNDQgcXVhbnRpemUgICAwLjc4IDFlLTEgLT4gIDAuOCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzNDUgcXVhbnRpemUgICAwLjc4ICAxZTAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitxdWF4MzQ2IHF1YW50aXplICAgMC43OCAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDM0NyBxdWFudGl6ZSAgIDAuNzggMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworcXVheDM1MCBxdWFudGl6ZSAgLTAuNzggMWUtNSAtPiAtMC43ODAwMAorcXVheDM1MSBxdWFudGl6ZSAgLTAuNzggMWUtNCAtPiAtMC43ODAwCitxdWF4MzUyIHF1YW50aXplICAtMC43OCAxZS0zIC0+IC0wLjc4MAorcXVheDM1MyBxdWFudGl6ZSAgLTAuNzggMWUtMiAtPiAtMC43OAorcXVheDM1NCBxdWFudGl6ZSAgLTAuNzggMWUtMSAtPiAtMC44IEluZXhhY3QgUm91bmRlZAorcXVheDM1NSBxdWFudGl6ZSAgLTAuNzggIDFlMCAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzNTYgcXVhbnRpemUgIC0wLjc4IDFlKzEgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MzU3IHF1YW50aXplICAtMC43OCAxZSsyIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorCitxdWF4MzYwIHF1YW50aXplICAgNy44IDFlLTUgLT4gIDcuODAwMDAKK3F1YXgzNjEgcXVhbnRpemUgICA3LjggMWUtNCAtPiAgNy44MDAwCitxdWF4MzYyIHF1YW50aXplICAgNy44IDFlLTMgLT4gIDcuODAwCitxdWF4MzYzIHF1YW50aXplICAgNy44IDFlLTIgLT4gIDcuODAKK3F1YXgzNjQgcXVhbnRpemUgICA3LjggMWUtMSAtPiAgNy44CitxdWF4MzY1IHF1YW50aXplICAgNy44ICAxZTAgLT4gIDggSW5leGFjdCBSb3VuZGVkCitxdWF4MzY2IHF1YW50aXplICAgNy44IDFlKzEgLT4gIDFFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MzY3IHF1YW50aXplICAgNy44IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MzY4IHF1YW50aXplICAgNy44IDFlKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCisKK3F1YXgzNzAgcXVhbnRpemUgIC03LjggMWUtNSAtPiAtNy44MDAwMAorcXVheDM3MSBxdWFudGl6ZSAgLTcuOCAxZS00IC0+IC03LjgwMDAKK3F1YXgzNzIgcXVhbnRpemUgIC03LjggMWUtMyAtPiAtNy44MDAKK3F1YXgzNzMgcXVhbnRpemUgIC03LjggMWUtMiAtPiAtNy44MAorcXVheDM3NCBxdWFudGl6ZSAgLTcuOCAxZS0xIC0+IC03LjgKK3F1YXgzNzUgcXVhbnRpemUgIC03LjggIDFlMCAtPiAtOCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzNzYgcXVhbnRpemUgIC03LjggMWUrMSAtPiAtMUUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzNzcgcXVhbnRpemUgIC03LjggMWUrMiAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzNzggcXVhbnRpemUgIC03LjggMWUrMyAtPiAtMEUrMyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBpbmRpdmlkdWFscworcHJlY2lzaW9uOiA5CitxdWF4MzgwIHF1YW50aXplICAgMzUyMzY0LjUwNiAxZS0yIC0+IDM1MjM2NC41MSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzODEgcXVhbnRpemUgICAzNTIzNjQ1LjA2IDFlLTIgLT4gMzUyMzY0NS4wNgorcXVheDM4MiBxdWFudGl6ZSAgIDM1MjM2NDUwLjYgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXgzODMgcXVhbnRpemUgICAzNTIzNjQ1MDYgIDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4Mzg0IHF1YW50aXplICAtMzUyMzY0LjUwNiAxZS0yIC0+IC0zNTIzNjQuNTEgSW5leGFjdCBSb3VuZGVkCitxdWF4Mzg1IHF1YW50aXplICAtMzUyMzY0NS4wNiAxZS0yIC0+IC0zNTIzNjQ1LjA2CitxdWF4Mzg2IHF1YW50aXplICAtMzUyMzY0NTAuNiAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDM4NyBxdWFudGl6ZSAgLTM1MjM2NDUwNiAgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcm91bmRpbmc6IGRvd24KK3F1YXgzODkgcXVhbnRpemUgICAzNTIzNjQ1MC42IDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSA/IHNob3VsZCB0aGF0IG9uZSBpbnN0ZWFkIGhhdmUgYmVlbjoKKy0tIHF1YXgzODkgcXVhbnRpemUgICAzNTIzNjQ1MC42IDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityb3VuZGluZzogaGFsZl91cAorCistLSBhbmQgYSBmZXcgbW9yZSBmcm9tIGUtbWFpbCBkaXNjdXNzaW9ucworcHJlY2lzaW9uOiA3CitxdWF4MzkxIHF1YW50aXplICAxMi4zNDU2NyAgMWUtMyAtPiAxMi4zNDYgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzOTIgcXVhbnRpemUgIDEyMy40NTY3ICAxZS0zIC0+IDEyMy40NTcgIEluZXhhY3QgUm91bmRlZAorcXVheDM5MyBxdWFudGl6ZSAgMTIzNC41NjcgIDFlLTMgLT4gMTIzNC41NjcKK3F1YXgzOTQgcXVhbnRpemUgIDEyMzQ1LjY3ICAxZS0zIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDM5NSBxdWFudGl6ZSAgMTIzNDU2LjcgIDFlLTMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4Mzk2IHF1YW50aXplICAxMjM0NTY3LiAgMWUtMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gc29tZSA5OTk5IHJvdW5kLXVwIGNhc2VzCitwcmVjaXNpb246IDkKK3F1YXg0MDAgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgMWUtNSAgLT4gIDkuOTk5MDAKK3F1YXg0MDEgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgMWUtNCAgLT4gIDkuOTk5MAorcXVheDQwMiBxdWFudGl6ZSAgIDkuOTk5ICAgICAgICAxZS0zICAtPiAgOS45OTkKK3F1YXg0MDMgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgMWUtMiAgLT4gMTAuMDAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQwNCBxdWFudGl6ZSAgIDkuOTk5ICAgICAgICAxZS0xICAtPiAxMC4wICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDA1IHF1YW50aXplICAgOS45OTkgICAgICAgICAxZTAgIC0+IDEwICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0MDYgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgIDFlMSAgLT4gMUUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQwNyBxdWFudGl6ZSAgIDkuOTk5ICAgICAgICAgMWUyICAtPiAwRSsyICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3F1YXg0MTAgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtNSAgLT4gIDAuOTk5MDAKK3F1YXg0MTEgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtNCAgLT4gIDAuOTk5MAorcXVheDQxMiBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAxZS0zICAtPiAgMC45OTkKK3F1YXg0MTMgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtMiAgLT4gIDEuMDAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQxNCBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAxZS0xICAtPiAgMS4wICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDE1IHF1YW50aXplICAgMC45OTkgICAgICAgICAxZTAgIC0+ICAxICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0MTYgcXVhbnRpemUgICAwLjk5OSAgICAgICAgIDFlMSAgLT4gMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCitxdWF4NDIwIHF1YW50aXplICAgMC4wOTk5ICAgICAgIDFlLTUgIC0+ICAwLjA5OTkwCitxdWF4NDIxIHF1YW50aXplICAgMC4wOTk5ICAgICAgIDFlLTQgIC0+ICAwLjA5OTkKK3F1YXg0MjIgcXVhbnRpemUgICAwLjA5OTkgICAgICAgMWUtMyAgLT4gIDAuMTAwICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQyMyBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS0yICAtPiAgMC4xMCAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDI0IHF1YW50aXplICAgMC4wOTk5ICAgICAgIDFlLTEgIC0+ICAwLjEgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0MjUgcXVhbnRpemUgICAwLjA5OTkgICAgICAgIDFlMCAgLT4gIDAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQyNiBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAgMWUxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3F1YXg0MzAgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgMWUtNSAgLT4gIDAuMDA5OTkKK3F1YXg0MzEgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgMWUtNCAgLT4gIDAuMDEwMCAgIEluZXhhY3QgUm91bmRlZAorcXVheDQzMiBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAxZS0zICAtPiAgMC4wMTAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDMzIHF1YW50aXplICAgMC4wMDk5OSAgICAgIDFlLTIgIC0+ICAwLjAxICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0MzQgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgMWUtMSAgLT4gIDAuMCAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQzNSBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAgMWUwICAtPiAgMCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDM2IHF1YW50aXplICAgMC4wMDk5OSAgICAgICAxZTEgIC0+IDBFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcXVheDQ0MCBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS01ICAtPiAgMC4wMDEwMCAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDQxIHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTQgIC0+ICAwLjAwMTAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NDIgcXVhbnRpemUgICAwLjAwMDk5OSAgICAgMWUtMyAgLT4gIDAuMDAxICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQ0MyBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS0yICAtPiAgMC4wMCAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDQ0IHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTEgIC0+ICAwLjAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NDUgcXVhbnRpemUgICAwLjAwMDk5OSAgICAgIDFlMCAgLT4gIDAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQ0NiBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAgMWUxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogOAorcXVheDQ0OSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0yMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NDUwIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTIyIC0+ICA5Ljk5OTAwMDBFLTE1CitxdWF4NDUxIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTIxIC0+ICA5Ljk5OTAwMEUtMTUKK3F1YXg0NTIgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMjAgLT4gIDkuOTk5MDBFLTE1CitxdWF4NDUzIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE5IC0+ICA5Ljk5OTBFLTE1CitxdWF4NDU0IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE4IC0+ICA5Ljk5OUUtMTUKK3F1YXg0NTUgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTcgLT4gIDEuMDAwRS0xNCBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NTYgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTYgLT4gIDEuMDBFLTE0ICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NTcgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTUgLT4gIDEuMEUtMTQgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NTggcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTQgLT4gIDFFLTE0ICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NTkgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTMgLT4gIDBFLTEzICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NjAgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTIgLT4gIDBFLTEyICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NjEgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTEgLT4gIDBFLTExICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NjIgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTAgLT4gIDBFLTEwICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NjMgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTkgLT4gIDBFLTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NjQgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTggLT4gIDBFLTggICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NjUgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTcgLT4gIDBFLTcgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NjYgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTYgLT4gIDAuMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NjcgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTUgLT4gIDAuMDAwMDAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NjggcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTQgLT4gIDAuMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NjkgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTMgLT4gIDAuMDAwICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NzAgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTIgLT4gIDAuMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NzEgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTEgLT4gIDAuMCAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NzIgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgICAxZTAgLT4gIDAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NzMgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgICAxZTEgLT4gIDBFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiA3CitxdWF4OTAwIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTIyIC0+ICBOYU4gICAgICAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg5MDEgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMjEgLT4gIDkuOTk5MDAwRS0xNQorcXVheDkwMiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0yMCAtPiAgOS45OTkwMEUtMTUKK3F1YXg5MDMgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTkgLT4gIDkuOTk5MEUtMTUKK3F1YXg5MDQgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTggLT4gIDkuOTk5RS0xNQorcXVheDkwNSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xNyAtPiAgMS4wMDBFLTE0IEluZXhhY3QgUm91bmRlZAorcXVheDkwNiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xNiAtPiAgMS4wMEUtMTQgIEluZXhhY3QgUm91bmRlZAorcXVheDkwNyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xNSAtPiAgMS4wRS0xNCAgIEluZXhhY3QgUm91bmRlZAorcXVheDkwOCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xNCAtPiAgMUUtMTQgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkwOSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xMyAtPiAgMEUtMTMgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkxMCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xMiAtPiAgMEUtMTIgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkxMSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xMSAtPiAgMEUtMTEgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkxMiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xMCAtPiAgMEUtMTAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkxMyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtOSAtPiAgMEUtOSAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkxNCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtOCAtPiAgMEUtOCAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkxNSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtNyAtPiAgMEUtNyAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkxNiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtNiAtPiAgMC4wMDAwMDAgIEluZXhhY3QgUm91bmRlZAorcXVheDkxNyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtNSAtPiAgMC4wMDAwMCAgIEluZXhhY3QgUm91bmRlZAorcXVheDkxOCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtNCAtPiAgMC4wMDAwICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkxOSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtMyAtPiAgMC4wMDAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkyMCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtMiAtPiAgMC4wMCAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkyMSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtMSAtPiAgMC4wICAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkyMiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgIDFlMCAtPiAgMCAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkyMyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgIDFlMSAtPiAgMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDYKK3F1YXg5MzAgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMjIgLT4gIE5hTiAgICAgICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDkzMSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0yMSAtPiAgTmFOICAgICAgIEludmFsaWRfb3BlcmF0aW9uCitxdWF4OTMyIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTIwIC0+ICA5Ljk5OTAwRS0xNQorcXVheDkzMyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xOSAtPiAgOS45OTkwRS0xNQorcXVheDkzNCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xOCAtPiAgOS45OTlFLTE1CitxdWF4OTM1IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE3IC0+ICAxLjAwMEUtMTQgSW5leGFjdCBSb3VuZGVkCitxdWF4OTM2IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE2IC0+ICAxLjAwRS0xNCAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTM3IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE1IC0+ICAxLjBFLTE0ICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTM4IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE0IC0+ICAxRS0xNCAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTM5IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTEzIC0+ICAwRS0xMyAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTQwIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTEyIC0+ICAwRS0xMiAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTQxIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTExIC0+ICAwRS0xMSAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTQyIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTEwIC0+ICAwRS0xMCAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTQzIHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS05IC0+ICAwRS05ICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTQ0IHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS04IC0+ICAwRS04ICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTQ1IHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS03IC0+ICAwRS03ICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTQ2IHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS02IC0+ICAwLjAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTQ3IHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS01IC0+ICAwLjAwMDAwICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTQ4IHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS00IC0+ICAwLjAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTQ5IHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS0zIC0+ICAwLjAwMCAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTUwIHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS0yIC0+ICAwLjAwICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTUxIHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS0xIC0+ICAwLjAgICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTUyIHF1YW50aXplICAgOS45OTlFLTE1ICAgICAgMWUwIC0+ICAwICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4OTUzIHF1YW50aXplICAgOS45OTlFLTE1ICAgICAgMWUxIC0+ICAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMworcXVheDk2MCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0yMiAtPiAgTmFOICAgICAgIEludmFsaWRfb3BlcmF0aW9uCitxdWF4OTYxIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTIxIC0+ICBOYU4gICAgICAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg5NjIgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMjAgLT4gIE5hTiAgICAgICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDk2MyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xOSAtPiAgTmFOICAgICAgIEludmFsaWRfb3BlcmF0aW9uCitxdWF4OTY0IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE4IC0+ICBOYU4gICAgICAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg5NjUgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTcgLT4gIE5hTiAgICAgICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDk2NiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xNiAtPiAgMS4wMEUtMTQgIEluZXhhY3QgUm91bmRlZAorcXVheDk2NyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xNSAtPiAgMS4wRS0xNCAgIEluZXhhY3QgUm91bmRlZAorcXVheDk2OCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xNCAtPiAgMUUtMTQgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk2OSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xMyAtPiAgMEUtMTMgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk3MCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xMiAtPiAgMEUtMTIgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk3MSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xMSAtPiAgMEUtMTEgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk3MiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xMCAtPiAgMEUtMTAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk3MyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtOSAtPiAgMEUtOSAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk3NCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtOCAtPiAgMEUtOCAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk3NSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtNyAtPiAgMEUtNyAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk3NiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtNiAtPiAgMC4wMDAwMDAgIEluZXhhY3QgUm91bmRlZAorcXVheDk3NyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtNSAtPiAgMC4wMDAwMCAgIEluZXhhY3QgUm91bmRlZAorcXVheDk3OCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtNCAtPiAgMC4wMDAwICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk3OSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtMyAtPiAgMC4wMDAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk4MCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtMiAtPiAgMC4wMCAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk4MSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtMSAtPiAgMC4wICAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk4MiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgIDFlMCAtPiAgMCAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk4MyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgIDFlMSAtPiAgMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCistLSBGdW5nIExlZSdzIGNhc2UgJiBzaW1pbGFyCitwcmVjaXNpb246IDMKK3F1YXgxMDAxIHF1YW50aXplICAwLjAwMCAgICAgICAgMC4wMDEgLT4gIDAuMDAwCitxdWF4MTAwMiBxdWFudGl6ZSAgMC4wMDEgICAgICAgIDAuMDAxIC0+ICAwLjAwMQorcXVheDEwMDMgcXVhbnRpemUgIDAuMDAxMiAgICAgICAwLjAwMSAtPiAgMC4wMDEgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDEwMDQgcXVhbnRpemUgIDAuMDAxOCAgICAgICAwLjAwMSAtPiAgMC4wMDIgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDEwMDUgcXVhbnRpemUgIDAuNTAxICAgICAgICAwLjAwMSAtPiAgMC41MDEKK3F1YXgxMDA2IHF1YW50aXplICAwLjUwMTIgICAgICAgMC4wMDEgLT4gIDAuNTAxICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxMDA3IHF1YW50aXplICAwLjUwMTggICAgICAgMC4wMDEgLT4gIDAuNTAyICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxMDA4IHF1YW50aXplICAwLjk5OSAgICAgICAgMC4wMDEgLT4gIDAuOTk5CitxdWF4MTAwOSBxdWFudGl6ZSAgMC45OTkyICAgICAgIDAuMDAxIC0+ICAwLjk5OSAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4MTAxMCBxdWFudGl6ZSAgMC45OTk4ICAgICAgIDAuMDAxIC0+ICBOYU4gICAgICAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXgxMDExIHF1YW50aXplICAxLjAwMDEgICAgICAgMC4wMDEgLT4gIE5hTiAgICAgICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDEwMTIgcXVhbnRpemUgIDEuMDA1MSAgICAgICAwLjAwMSAtPiAgTmFOICAgICAgIEludmFsaWRfb3BlcmF0aW9uCitxdWF4MTAxMyBxdWFudGl6ZSAgMS4wNTUxICAgICAgIDAuMDAxIC0+ICBOYU4gICAgICAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXgxMDE0IHF1YW50aXplICAxLjU1NTEgICAgICAgMC4wMDEgLT4gIE5hTiAgICAgICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDEwMTUgcXVhbnRpemUgIDEuOTk5OSAgICAgICAwLjAwMSAtPiAgTmFOICAgICAgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGxvbmcgb3BlcmFuZCBjaGVja3MgW3JocyBjaGVja3MgcmVtb3ZlZF0KK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK3F1YXg0ODEgcXVhbnRpemUgMTIzNDU2NzgwMDAgMWUrMyAtPiAxLjIzNDU2NzhFKzEwIFJvdW5kZWQKK3F1YXg0ODIgcXVhbnRpemUgMTIzNDU2NzgwMCAgMWUrMSAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK3F1YXg0ODMgcXVhbnRpemUgMTIzNDU2Nzg5MCAgMWUrMSAtPiAxLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK3F1YXg0ODQgcXVhbnRpemUgMTIzNDU2Nzg5MSAgMWUrMSAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorcXVheDQ4NSBxdWFudGl6ZSAxMjM0NTY3ODkwMSAxZSsyIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorcXVheDQ4NiBxdWFudGl6ZSAxMjM0NTY3ODk2ICAxZSsxIC0+IDEuMjM0NTY3OTBFKzkgSW5leGFjdCBSb3VuZGVkCistLSBhIHBvdGVudGlhbCBkb3VibGUtcm91bmQKK3F1YXg0ODcgcXVhbnRpemUgMTIzNC45ODc2NDMgMWUtNCAtPiAxMjM0Ljk4NzYgSW5leGFjdCBSb3VuZGVkCitxdWF4NDg4IHF1YW50aXplIDEyMzQuOTg3NjQ3IDFlLTQgLT4gMTIzNC45ODc2IEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDE1CitxdWF4NDkxIHF1YW50aXplIDEyMzQ1Njc4MDAwIDFlKzMgLT4gMS4yMzQ1Njc4RSsxMCBSb3VuZGVkCitxdWF4NDkyIHF1YW50aXplIDEyMzQ1Njc4MDAgIDFlKzEgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCitxdWF4NDkzIHF1YW50aXplIDEyMzQ1Njc4OTAgIDFlKzEgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCitxdWF4NDk0IHF1YW50aXplIDEyMzQ1Njc4OTEgIDFlKzEgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0OTUgcXVhbnRpemUgMTIzNDU2Nzg5MDEgMWUrMiAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0OTYgcXVhbnRpemUgMTIzNDU2Nzg5NiAgMWUrMSAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorcXVheDQ5NyBxdWFudGl6ZSAxMjM0Ljk4NzY0MyAxZS00IC0+IDEyMzQuOTg3NiBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0OTggcXVhbnRpemUgMTIzNC45ODc2NDcgMWUtNCAtPiAxMjM0Ljk4NzYgSW5leGFjdCBSb3VuZGVkCisKKy0tIFplcm9zCitxdWF4NTAwIHF1YW50aXplICAgMCAgICAgMWUxIC0+ICAwRSsxCitxdWF4NTAxIHF1YW50aXplICAgMCAgICAgMWUwIC0+ICAwCitxdWF4NTAyIHF1YW50aXplICAgMCAgICAxZS0xIC0+ICAwLjAKK3F1YXg1MDMgcXVhbnRpemUgICAwLjAgIDFlLTEgLT4gIDAuMAorcXVheDUwNCBxdWFudGl6ZSAgIDAuMCAgIDFlMCAtPiAgMAorcXVheDUwNSBxdWFudGl6ZSAgIDAuMCAgMWUrMSAtPiAgMEUrMQorcXVheDUwNiBxdWFudGl6ZSAgIDBFKzEgMWUtMSAtPiAgMC4wCitxdWF4NTA3IHF1YW50aXplICAgMEUrMSAgMWUwIC0+ICAwCitxdWF4NTA4IHF1YW50aXplICAgMEUrMSAxZSsxIC0+ICAwRSsxCitxdWF4NTA5IHF1YW50aXplICAtMCAgICAgMWUxIC0+IC0wRSsxCitxdWF4NTEwIHF1YW50aXplICAtMCAgICAgMWUwIC0+IC0wCitxdWF4NTExIHF1YW50aXplICAtMCAgICAxZS0xIC0+IC0wLjAKK3F1YXg1MTIgcXVhbnRpemUgIC0wLjAgIDFlLTEgLT4gLTAuMAorcXVheDUxMyBxdWFudGl6ZSAgLTAuMCAgIDFlMCAtPiAtMAorcXVheDUxNCBxdWFudGl6ZSAgLTAuMCAgMWUrMSAtPiAtMEUrMQorcXVheDUxNSBxdWFudGl6ZSAgLTBFKzEgMWUtMSAtPiAtMC4wCitxdWF4NTE2IHF1YW50aXplICAtMEUrMSAgMWUwIC0+IC0wCitxdWF4NTE3IHF1YW50aXplICAtMEUrMSAxZSsxIC0+IC0wRSsxCisKKy0tIFN1c3BpY2lvdXMgUkhTIHZhbHVlcworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogMTUKK3F1YXg1MjAgcXVhbnRpemUgICAxLjIzNCAgICAxZTk5OTk5OTAwMCAtPiAwRSs5OTk5OTkwMDAgSW5leGFjdCBSb3VuZGVkCitxdWF4NTIxIHF1YW50aXplIDEyMy40NTYgICAgMWU5OTk5OTkwMDAgLT4gMEUrOTk5OTk5MDAwIEluZXhhY3QgUm91bmRlZAorcXVheDUyMiBxdWFudGl6ZSAgIDEuMjM0ICAgIDFlOTk5OTk5OTk5IC0+IDBFKzk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1MjMgcXVhbnRpemUgMTIzLjQ1NiAgICAxZTk5OTk5OTk5OSAtPiAwRSs5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitxdWF4NTI0IHF1YW50aXplIDEyMy40NTYgICAxZTEwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTI1IHF1YW50aXplIDEyMy40NTYgIDFlMTIzNDU2Nzg5MDMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBuZXh0IGZvdXIgYXJlICJ3b24ndCBmaXQiIG92ZXJmbG93cworcXVheDUyNiBxdWFudGl6ZSAgIDEuMjM0ICAgMWUtOTk5OTk5MDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDUyNyBxdWFudGl6ZSAxMjMuNDU2ICAgMWUtOTk5OTk5MDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDUyOCBxdWFudGl6ZSAgIDEuMjM0ICAgMWUtOTk5OTk5OTk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDUyOSBxdWFudGl6ZSAxMjMuNDU2ICAgMWUtOTk5OTk5OTk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDUzMCBxdWFudGl6ZSAxMjMuNDU2ICAxZS0xMDAwMDAwMDE0IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDUzMSBxdWFudGl6ZSAxMjMuNDU2IDFlLTEyMzQ1Njc4OTAzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiAxNQorcXVheDUzMiBxdWFudGl6ZSAgIDEuMjM0RSs5OTkgICAgMWU5OTkgLT4gMUUrOTk5ICAgIEluZXhhY3QgUm91bmRlZAorcXVheDUzMyBxdWFudGl6ZSAgIDEuMjM0RSs5OTggICAgMWU5OTkgLT4gMEUrOTk5ICAgIEluZXhhY3QgUm91bmRlZAorcXVheDUzNCBxdWFudGl6ZSAgIDEuMjM0ICAgICAgICAgMWU5OTkgLT4gMEUrOTk5ICAgIEluZXhhY3QgUm91bmRlZAorcXVheDUzNSBxdWFudGl6ZSAgIDEuMjM0ICAgICAgICAxZTEwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTM2IHF1YW50aXplICAgMS4yMzQgICAgICAgIDFlNTAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1MzcgcXVhbnRpemUgICAwICAgICAgICAgICAgMWUtOTk5IC0+IDBFLTk5OQorLS0gbmV4dCB0d28gYXJlICJ3b24ndCBmaXQiIG92ZXJmbG93cworcXVheDUzOCBxdWFudGl6ZSAgIDEuMjM0ICAgICAgICAxZS05OTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTM5IHF1YW50aXplICAgMS4yMzQgICAgICAgMWUtMTAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1NDAgcXVhbnRpemUgICAxLjIzNCAgICAgICAxZS01MDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gW21vcmUgYmVsb3ddCisKKy0tIGNoZWNrIGJvdW5kcyAobGhzIG1heWJlIG91dCBvZiByYW5nZSBmb3IgZGVzdGluYXRpb24sIGV0Yy4pCitwcmVjaXNpb246ICAgICA3CitxdWF4NTQxIHF1YW50aXplICAgMUUrOTk5ICAgMWUrOTk5IC0+IDFFKzk5OQorcXVheDU0MiBxdWFudGl6ZSAgIDFFKzEwMDAgIDFlKzk5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1NDMgcXVhbnRpemUgICAxRSs5OTkgIDFlKzEwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTQ0IHF1YW50aXplICAgMUUtOTk5ICAgMWUtOTk5IC0+IDFFLTk5OQorcXVheDU0NSBxdWFudGl6ZSAgIDFFLTEwMDAgIDFlLTk5OSAtPiAwRS05OTkgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NTQ2IHF1YW50aXplICAgMUUtOTk5ICAxZS0xMDAwIC0+IDEuMEUtOTk5CitxdWF4NTQ3IHF1YW50aXplICAgMUUtMTAwNSAgMWUtOTk5IC0+IDBFLTk5OSAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1NDggcXVhbnRpemUgICAxRS0xMDA2ICAxZS05OTkgLT4gMEUtOTk5ICAgIEluZXhhY3QgUm91bmRlZAorcXVheDU0OSBxdWFudGl6ZSAgIDFFLTEwMDcgIDFlLTk5OSAtPiAwRS05OTkgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NTUwIHF1YW50aXplICAgMUUtOTk4ICAxZS0xMDA1IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbiAgLS0gd29uJ3QgZml0CitxdWF4NTUxIHF1YW50aXplICAgMUUtOTk5ICAxZS0xMDA1IC0+IDEuMDAwMDAwRS05OTkKK3F1YXg1NTIgcXVhbnRpemUgICAxRS0xMDAwIDFlLTEwMDUgLT4gMS4wMDAwMEUtMTAwMCBTdWJub3JtYWwKK3F1YXg1NTMgcXVhbnRpemUgICAxRS05OTkgIDFlLTEwMDYgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTU0IHF1YW50aXplICAgMUUtOTk5ICAxZS0xMDA3IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gcmVsYXRlZCBzdWJub3JtYWwgcm91bmRpbmcKK3F1YXg1NTUgcXVhbnRpemUgICAxLjY2NjY2NkUtOTk5ICAxZS0xMDA1IC0+IDEuNjY2NjY2RS05OTkKK3F1YXg1NTYgcXVhbnRpemUgICAxLjY2NjY2NkUtMTAwMCAxZS0xMDA1IC0+IDEuNjY2NjdFLTEwMDAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1NTcgcXVhbnRpemUgICAxLjY2NjY2NkUtMTAwMSAxZS0xMDA1IC0+IDEuNjY2N0UtMTAwMSAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcXVheDU1OCBxdWFudGl6ZSAgIDEuNjY2NjY2RS0xMDAyIDFlLTEwMDUgLT4gMS42NjdFLTEwMDIgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1NTkgcXVhbnRpemUgICAxLjY2NjY2NkUtMTAwMyAxZS0xMDA1IC0+IDEuNjdFLTEwMDMgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1NjAgcXVhbnRpemUgICAxLjY2NjY2NkUtMTAwNCAxZS0xMDA1IC0+IDEuN0UtMTAwNCAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcXVheDU2MSBxdWFudGl6ZSAgIDEuNjY2NjY2RS0xMDA1IDFlLTEwMDUgLT4gMkUtMTAwNSAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcXVheDU2MiBxdWFudGl6ZSAgIDEuNjY2NjY2RS0xMDA2IDFlLTEwMDUgLT4gMEUtMTAwNSAgIEluZXhhY3QgUm91bmRlZAorcXVheDU2MyBxdWFudGl6ZSAgIDEuNjY2NjY2RS0xMDA3IDFlLTEwMDUgLT4gMEUtMTAwNSAgIEluZXhhY3QgUm91bmRlZAorCistLSBTcGVjaWFscworcXVheDU4MCBxdWFudGl6ZSAgSW5mICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK3F1YXg1ODEgcXVhbnRpemUgIEluZiAgMWUtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1ODIgcXVhbnRpemUgIEluZiAgMWUtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1ODMgcXVhbnRpemUgIEluZiAgIDFlMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1ODQgcXVhbnRpemUgIEluZiAgIDFlMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1ODUgcXVhbnRpemUgIEluZiAgIDFlMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1ODYgcXVhbnRpemUgIEluZiAgICAgSW5mICAgLT4gIEluZmluaXR5CitxdWF4NTg3IHF1YW50aXplIC0xMDAwICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTg4IHF1YW50aXplIC1JbmYgICAgIEluZiAgIC0+ICAtSW5maW5pdHkKK3F1YXg1ODkgcXVhbnRpemUgLTEgICAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1OTAgcXVhbnRpemUgIDAgICAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1OTEgcXVhbnRpemUgIDEgICAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1OTIgcXVhbnRpemUgIDEwMDAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1OTMgcXVhbnRpemUgIEluZiAgICAgSW5mICAgLT4gIEluZmluaXR5CitxdWF4NTk0IHF1YW50aXplICBJbmYgIDFlLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTk1IHF1YW50aXplIC0wICAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK3F1YXg2MDAgcXVhbnRpemUgLUluZiAgICAtSW5mICAgLT4gIC1JbmZpbml0eQorcXVheDYwMSBxdWFudGl6ZSAtSW5mICAxZS0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDYwMiBxdWFudGl6ZSAtSW5mICAxZS0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDYwMyBxdWFudGl6ZSAtSW5mICAgMWUwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDYwNCBxdWFudGl6ZSAtSW5mICAgMWUxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDYwNSBxdWFudGl6ZSAtSW5mICAgMWUxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDYwNiBxdWFudGl6ZSAtSW5mICAgICBJbmYgICAtPiAgLUluZmluaXR5CitxdWF4NjA3IHF1YW50aXplIC0xMDAwICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjA4IHF1YW50aXplIC1JbmYgICAgLUluZiAgIC0+ICAtSW5maW5pdHkKK3F1YXg2MDkgcXVhbnRpemUgLTEgICAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2MTAgcXVhbnRpemUgIDAgICAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2MTEgcXVhbnRpemUgIDEgICAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2MTIgcXVhbnRpemUgIDEwMDAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2MTMgcXVhbnRpemUgIEluZiAgICAtSW5mICAgLT4gIEluZmluaXR5CitxdWF4NjE0IHF1YW50aXplIC1JbmYgIDFlLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjE1IHF1YW50aXplIC0wICAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK3F1YXg2MjEgcXVhbnRpemUgIE5hTiAgIC1JbmYgICAgLT4gIE5hTgorcXVheDYyMiBxdWFudGl6ZSAgTmFOIDFlLTEwMDAgICAtPiAgTmFOCitxdWF4NjIzIHF1YW50aXplICBOYU4gMWUtMSAgICAgIC0+ICBOYU4KK3F1YXg2MjQgcXVhbnRpemUgIE5hTiAgMWUwICAgICAgLT4gIE5hTgorcXVheDYyNSBxdWFudGl6ZSAgTmFOICAxZTEgICAgICAtPiAgTmFOCitxdWF4NjI2IHF1YW50aXplICBOYU4gIDFlMTAwMCAgIC0+ICBOYU4KK3F1YXg2MjcgcXVhbnRpemUgIE5hTiAgICBJbmYgICAgLT4gIE5hTgorcXVheDYyOCBxdWFudGl6ZSAgTmFOICAgIE5hTiAgICAtPiAgTmFOCitxdWF4NjI5IHF1YW50aXplIC1JbmYgICAgTmFOICAgIC0+ICBOYU4KK3F1YXg2MzAgcXVhbnRpemUgLTEwMDAgICBOYU4gICAgLT4gIE5hTgorcXVheDYzMSBxdWFudGl6ZSAtMSAgICAgIE5hTiAgICAtPiAgTmFOCitxdWF4NjMyIHF1YW50aXplICAwICAgICAgTmFOICAgIC0+ICBOYU4KK3F1YXg2MzMgcXVhbnRpemUgIDEgICAgICBOYU4gICAgLT4gIE5hTgorcXVheDYzNCBxdWFudGl6ZSAgMTAwMCAgIE5hTiAgICAtPiAgTmFOCitxdWF4NjM1IHF1YW50aXplICBJbmYgICAgTmFOICAgIC0+ICBOYU4KK3F1YXg2MzYgcXVhbnRpemUgIE5hTiAxZS0wICAgICAgLT4gIE5hTgorcXVheDYzNyBxdWFudGl6ZSAtMCAgICAgIE5hTiAgICAtPiAgTmFOCisKK3F1YXg2NDEgcXVhbnRpemUgIHNOYU4gICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NDIgcXVhbnRpemUgIHNOYU4gMWUtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NDMgcXVhbnRpemUgIHNOYU4gMWUtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NDQgcXVhbnRpemUgIHNOYU4gIDFlMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NDUgcXVhbnRpemUgIHNOYU4gIDFlMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NDYgcXVhbnRpemUgIHNOYU4gIDFlMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NDcgcXVhbnRpemUgIHNOYU4gICAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NDggcXVhbnRpemUgIHNOYU4gICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NDkgcXVhbnRpemUgIE5hTiAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NTAgcXVhbnRpemUgLUluZiAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NTEgcXVhbnRpemUgLTEwMDAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NTIgcXVhbnRpemUgLTEgICAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NTMgcXVhbnRpemUgIDAgICAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NTQgcXVhbnRpemUgIDEgICAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NTUgcXVhbnRpemUgIDEwMDAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NTYgcXVhbnRpemUgIEluZiAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NTcgcXVhbnRpemUgIE5hTiAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NTggcXVhbnRpemUgIHNOYU4gMWUtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NTkgcXVhbnRpemUgLTAgICAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworcXVheDY2MSBxdWFudGl6ZSAgTmFOOSAtSW5mICAgLT4gIE5hTjkKK3F1YXg2NjIgcXVhbnRpemUgIE5hTjggIDkxOSAgIC0+ICBOYU44CitxdWF4NjYzIHF1YW50aXplICBOYU43MSBJbmYgICAtPiAgTmFONzEKK3F1YXg2NjQgcXVhbnRpemUgIE5hTjYgIE5hTjUgIC0+ICBOYU42CitxdWF4NjY1IHF1YW50aXplIC1JbmYgICBOYU40ICAtPiAgTmFONAorcXVheDY2NiBxdWFudGl6ZSAtOTE5ICAgTmFOMzEgLT4gIE5hTjMxCitxdWF4NjY3IHF1YW50aXplICBJbmYgICBOYU4yICAtPiAgTmFOMgorCitxdWF4NjcxIHF1YW50aXplICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NzIgcXVhbnRpemUgIHNOYU45OCAtMTEgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorcXVheDY3MyBxdWFudGl6ZSAgc05hTjk3ICBOYU4gICAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitxdWF4Njc0IHF1YW50aXplICBzTmFOMTYgc05hTjk0ICAtPiAgTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NzUgcXVhbnRpemUgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorcXVheDY3NiBxdWFudGl6ZSAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitxdWF4Njc3IHF1YW50aXplICAwODggICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NzggcXVhbnRpemUgIEluZiAgICBzTmFOOTAgIC0+ICBOYU45MCBJbnZhbGlkX29wZXJhdGlvbgorcXVheDY3OSBxdWFudGl6ZSAgTmFOICAgIHNOYU44OCAgLT4gIE5hTjg4IEludmFsaWRfb3BlcmF0aW9uCisKK3F1YXg2ODEgcXVhbnRpemUgLU5hTjkgLUluZiAgIC0+IC1OYU45CitxdWF4NjgyIHF1YW50aXplIC1OYU44ICA5MTkgICAtPiAtTmFOOAorcXVheDY4MyBxdWFudGl6ZSAtTmFONzEgSW5mICAgLT4gLU5hTjcxCitxdWF4Njg0IHF1YW50aXplIC1OYU42IC1OYU41ICAtPiAtTmFONgorcXVheDY4NSBxdWFudGl6ZSAtSW5mICAtTmFONCAgLT4gLU5hTjQKK3F1YXg2ODYgcXVhbnRpemUgLTkxOSAgLU5hTjMxIC0+IC1OYU4zMQorcXVheDY4NyBxdWFudGl6ZSAgSW5mICAtTmFOMiAgLT4gLU5hTjIKKworcXVheDY5MSBxdWFudGl6ZSAtc05hTjk5IC1JbmYgICAgLT4gLU5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjkyIHF1YW50aXplIC1zTmFOOTggLTExICAgICAtPiAtTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2OTMgcXVhbnRpemUgLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorcXVheDY5NCBxdWFudGl6ZSAtc05hTjE2IHNOYU45NCAgLT4gLU5hTjE2IEludmFsaWRfb3BlcmF0aW9uCitxdWF4Njk1IHF1YW50aXplIC1OYU45NSAtc05hTjkzICAtPiAtTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2OTYgcXVhbnRpemUgLUluZiAgIC1zTmFOOTIgIC0+IC1OYU45MiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDY5NyBxdWFudGl6ZSAgMDg4ICAgLXNOYU45MSAgLT4gLU5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitxdWF4Njk4IHF1YW50aXplICBJbmYgICAtc05hTjkwICAtPiAtTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2OTkgcXVhbnRpemUgIE5hTiAgIC1zTmFOODggIC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3cKK3ByZWNpc2lvbjogNAorbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3F1YXg3MTAgcXVhbnRpemUgIDEuMDBFLTk5OSAgICAxZS05OTkgIC0+ICAgMUUtOTk5ICAgIFJvdW5kZWQKK3F1YXg3MTEgcXVhbnRpemUgIDAuMUUtOTk5ICAgIDJlLTEwMDAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbAorcXVheDcxMiBxdWFudGl6ZSAgMC4xMEUtOTk5ICAgM2UtMTAwMCAgLT4gICAxRS0xMDAwICAgU3Vibm9ybWFsIFJvdW5kZWQKK3F1YXg3MTMgcXVhbnRpemUgIDAuMTAwRS05OTkgIDRlLTEwMDAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbCBSb3VuZGVkCitxdWF4NzE0IHF1YW50aXplICAwLjAxRS05OTkgICA1ZS0xMDAxICAtPiAgIDFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCitxdWF4NzE1IHF1YW50aXplICAwLjk5OUUtOTk5ICAgMWUtOTk5ICAtPiAgIDFFLTk5OSAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg3MTYgcXVhbnRpemUgIDAuMDk5RS05OTkgMTBlLTEwMDAgIC0+ICAgMUUtMTAwMCAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwKKworcXVheDcxNyBxdWFudGl6ZSAgMC4wMDlFLTk5OSAgMWUtMTAwMSAgLT4gICAxRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorcXVheDcxOCBxdWFudGl6ZSAgMC4wMDFFLTk5OSAgMWUtMTAwMSAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NzE5IHF1YW50aXplICAwLjAwMDlFLTk5OSAxZS0xMDAxICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg3MjAgcXVhbnRpemUgIDAuMDAwMUUtOTk5IDFlLTEwMDEgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZAorCitxdWF4NzMwIHF1YW50aXplIC0xLjAwRS05OTkgICAxZS05OTkgIC0+ICAtMUUtOTk5ICAgICBSb3VuZGVkCitxdWF4NzMxIHF1YW50aXplIC0wLjFFLTk5OSAgICAxZS05OTkgIC0+ICAtMEUtOTk5ICAgICBSb3VuZGVkIEluZXhhY3QKK3F1YXg3MzIgcXVhbnRpemUgLTAuMTBFLTk5OSAgIDFlLTk5OSAgLT4gIC0wRS05OTkgICAgIFJvdW5kZWQgSW5leGFjdAorcXVheDczMyBxdWFudGl6ZSAtMC4xMDBFLTk5OSAgMWUtOTk5ICAtPiAgLTBFLTk5OSAgICAgUm91bmRlZCBJbmV4YWN0CitxdWF4NzM0IHF1YW50aXplIC0wLjAxRS05OTkgICAxZS05OTkgIC0+ICAtMEUtOTk5ICAgICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCitxdWF4NzM1IHF1YW50aXplIC0wLjk5OUUtOTk5IDkwZS05OTkgIC0+ICAtMUUtOTk5ICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg3MzYgcXVhbnRpemUgLTAuMDk5RS05OTkgLTFlLTk5OSAgLT4gIC0wRS05OTkgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDczNyBxdWFudGl6ZSAtMC4wMDlFLTk5OSAtMWUtOTk5ICAtPiAgLTBFLTk5OSAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NzM4IHF1YW50aXplIC0wLjAwMUUtOTk5IC0wZS05OTkgIC0+ICAtMEUtOTk5ICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg3MzkgcXVhbnRpemUgLTAuMDAwMUUtOTk5IDBlLTk5OSAgLT4gIC0wRS05OTkgICAgIEluZXhhY3QgUm91bmRlZAorCitxdWF4NzQwIHF1YW50aXplIC0xLjAwRS05OTkgICAxZS0xMDAwIC0+ICAtMS4wRS05OTkgICBSb3VuZGVkCitxdWF4NzQxIHF1YW50aXplIC0wLjFFLTk5OSAgICAxZS0xMDAwIC0+ICAtMUUtMTAwMCAgICBTdWJub3JtYWwKK3F1YXg3NDIgcXVhbnRpemUgLTAuMTBFLTk5OSAgIDFlLTEwMDAgLT4gIC0xRS0xMDAwICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitxdWF4NzQzIHF1YW50aXplIC0wLjEwMEUtOTk5ICAxZS0xMDAwIC0+ICAtMUUtMTAwMCAgICBTdWJub3JtYWwgUm91bmRlZAorcXVheDc0NCBxdWFudGl6ZSAtMC4wMUUtOTk5ICAgMWUtMTAwMCAtPiAgLTBFLTEwMDAgICAgSW5leGFjdCBSb3VuZGVkCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorcXVheDc0NSBxdWFudGl6ZSAtMC45OTlFLTk5OSAgMWUtMTAwMCAtPiAgLTEuMEUtOTk5ICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NzQ2IHF1YW50aXplIC0wLjA5OUUtOTk5ICAxZS0xMDAwIC0+ICAtMUUtMTAwMCAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCitxdWF4NzQ3IHF1YW50aXplIC0wLjAwOUUtOTk5ICAxZS0xMDAwIC0+ICAtMEUtMTAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg3NDggcXVhbnRpemUgLTAuMDAxRS05OTkgIDFlLTEwMDAgLT4gIC0wRS0xMDAwICAgIEluZXhhY3QgUm91bmRlZAorcXVheDc0OSBxdWFudGl6ZSAtMC4wMDAxRS05OTkgMWUtMTAwMCAtPiAgLTBFLTEwMDAgICAgSW5leGFjdCBSb3VuZGVkCisKK3F1YXg3NTAgcXVhbnRpemUgLTEuMDBFLTk5OSAgIDFlLTEwMDEgLT4gIC0xLjAwRS05OTkKK3F1YXg3NTEgcXVhbnRpemUgLTAuMUUtOTk5ICAgIDFlLTEwMDEgLT4gIC0xLjBFLTEwMDAgIFN1Ym5vcm1hbAorcXVheDc1MiBxdWFudGl6ZSAtMC4xMEUtOTk5ICAgMWUtMTAwMSAtPiAgLTEuMEUtMTAwMCAgU3Vibm9ybWFsCitxdWF4NzUzIHF1YW50aXplIC0wLjEwMEUtOTk5ICAxZS0xMDAxIC0+ICAtMS4wRS0xMDAwICBTdWJub3JtYWwgUm91bmRlZAorcXVheDc1NCBxdWFudGl6ZSAtMC4wMUUtOTk5ICAgMWUtMTAwMSAtPiAgLTFFLTEwMDEgICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorcXVheDc1NSBxdWFudGl6ZSAtMC45OTlFLTk5OSAgMWUtMTAwMSAtPiAgLTEuMDBFLTk5OSAgSW5leGFjdCBSb3VuZGVkCitxdWF4NzU2IHF1YW50aXplIC0wLjA5OUUtOTk5ICAxZS0xMDAxIC0+ICAtMS4wRS0xMDAwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCitxdWF4NzU3IHF1YW50aXplIC0wLjAwOUUtOTk5ICAxZS0xMDAxIC0+ICAtMUUtMTAwMSAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCitxdWF4NzU4IHF1YW50aXplIC0wLjAwMUUtOTk5ICAxZS0xMDAxIC0+ICAtMEUtMTAwMSAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg3NTkgcXVhbnRpemUgLTAuMDAwMUUtOTk5IDFlLTEwMDEgLT4gIC0wRS0xMDAxICAgIEluZXhhY3QgUm91bmRlZAorCitxdWF4NzYwIHF1YW50aXplIC0xLjAwRS05OTkgICAxZS0xMDAyIC0+ICAtMS4wMDBFLTk5OQorcXVheDc2MSBxdWFudGl6ZSAtMC4xRS05OTkgICAgMWUtMTAwMiAtPiAgLTEuMDBFLTEwMDAgIFN1Ym5vcm1hbAorcXVheDc2MiBxdWFudGl6ZSAtMC4xMEUtOTk5ICAgMWUtMTAwMiAtPiAgLTEuMDBFLTEwMDAgIFN1Ym5vcm1hbAorcXVheDc2MyBxdWFudGl6ZSAtMC4xMDBFLTk5OSAgMWUtMTAwMiAtPiAgLTEuMDBFLTEwMDAgIFN1Ym5vcm1hbAorcXVheDc2NCBxdWFudGl6ZSAtMC4wMUUtOTk5ICAgMWUtMTAwMiAtPiAgLTEuMEUtMTAwMSAgIFN1Ym5vcm1hbAorcXVheDc2NSBxdWFudGl6ZSAtMC45OTlFLTk5OSAgMWUtMTAwMiAtPiAgLTkuOTlFLTEwMDAgIFN1Ym5vcm1hbAorcXVheDc2NiBxdWFudGl6ZSAtMC4wOTlFLTk5OSAgMWUtMTAwMiAtPiAgLTkuOUUtMTAwMSAgIFN1Ym5vcm1hbAorcXVheDc2NyBxdWFudGl6ZSAtMC4wMDlFLTk5OSAgMWUtMTAwMiAtPiAgLTlFLTEwMDIgICAgIFN1Ym5vcm1hbAorcXVheDc2OCBxdWFudGl6ZSAtMC4wMDFFLTk5OSAgMWUtMTAwMiAtPiAgLTFFLTEwMDIgICAgIFN1Ym5vcm1hbAorcXVheDc2OSBxdWFudGl6ZSAtMC4wMDAxRS05OTkgMWUtMTAwMiAtPiAgLTBFLTEwMDIgICAgIEluZXhhY3QgUm91bmRlZAorCistLSByaHMgbXVzdCBiZSBubyBsZXNzIHRoYW4gRXRpbnkKK3F1YXg3NzAgcXVhbnRpemUgLTEuMDBFLTk5OSAgIDFlLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDc3MSBxdWFudGl6ZSAtMC4xRS05OTkgICAgMWUtMTAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NzcyIHF1YW50aXplIC0wLjEwRS05OTkgICAxZS0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg3NzMgcXVhbnRpemUgLTAuMTAwRS05OTkgIDFlLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDc3NCBxdWFudGl6ZSAtMC4wMUUtOTk5ICAgMWUtMTAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4Nzc1IHF1YW50aXplIC0wLjk5OUUtOTk5ICAxZS0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg3NzYgcXVhbnRpemUgLTAuMDk5RS05OTkgIDFlLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDc3NyBxdWFudGl6ZSAtMC4wMDlFLTk5OSAgMWUtMTAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4Nzc4IHF1YW50aXplIC0wLjAwMUUtOTk5ICAxZS0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg3NzkgcXVhbnRpemUgLTAuMDAwMUUtOTk5IDFlLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDc4MCBxdWFudGl6ZSAtMC4wMDAxRS05OTkgMWUtMTAwNCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3ByZWNpc2lvbjogICA5CittYXhFeHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorCistLSBzb21lIGV4dHJlbWVzIGRlcml2ZWQgZnJvbSBSZXNjYWxlIHRlc3RjYXNlcworcXVheDgwMSBxdWFudGl6ZSAgIDAgICAxZTEwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODAyIHF1YW50aXplICAgMCAgMWUtMTAwMDAwMDAwMCAtPiAwRS0xMDAwMDAwMDAwCitxdWF4ODAzIHF1YW50aXplICAgMCAgIDFlMjAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4MDQgcXVhbnRpemUgICAwICAxZS0yMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgwNSBxdWFudGl6ZSAgIDAgICAxZTMwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODA2IHF1YW50aXplICAgMCAgMWUtMzAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4MDcgcXVhbnRpemUgICAwICAgMWU0MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgwOCBxdWFudGl6ZSAgIDAgIDFlLTQwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODA5IHF1YW50aXplICAgMCAgIDFlNTAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4MTAgcXVhbnRpemUgICAwICAxZS01MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgxMSBxdWFudGl6ZSAgIDAgICAxZTYwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODEyIHF1YW50aXplICAgMCAgMWUtNjAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4MTMgcXVhbnRpemUgICAwICAgMWU3MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgxNCBxdWFudGl6ZSAgIDAgIDFlLTcwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODE1IHF1YW50aXplICAgMCAgIDFlODAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4MTYgcXVhbnRpemUgICAwICAxZS04MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgxNyBxdWFudGl6ZSAgIDAgICAxZTkwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODE4IHF1YW50aXplICAgMCAgMWUtOTAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4MTkgcXVhbnRpemUgICAwICAgMWU5OTk5OTk5OTk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgyMCBxdWFudGl6ZSAgIDAgIDFlLTk5OTk5OTk5OTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODIxIHF1YW50aXplICAgMCAgIDFlMTAwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODIyIHF1YW50aXplICAgMCAgMWUtMTAwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3F1YXg4NDMgcXVhbnRpemUgICAwICAgIDFlOTk5OTk5OTk5IC0+IDBFKzk5OTk5OTk5OQorcXVheDg0NCBxdWFudGl6ZSAgIDAgICAxZTEwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODQ1IHF1YW50aXplICAgMCAgIDFlLTk5OTk5OTk5OSAtPiAwRS05OTk5OTk5OTkKK3F1YXg4NDYgcXVhbnRpemUgICAwICAxZS0xMDAwMDAwMDAwIC0+IDBFLTEwMDAwMDAwMDAKK3F1YXg4NDcgcXVhbnRpemUgICAwICAxZS0xMDAwMDAwMDAxIC0+IDBFLTEwMDAwMDAwMDEKK3F1YXg4NDggcXVhbnRpemUgICAwICAxZS0xMDAwMDAwMDAyIC0+IDBFLTEwMDAwMDAwMDIKK3F1YXg4NDkgcXVhbnRpemUgICAwICAxZS0xMDAwMDAwMDAzIC0+IDBFLTEwMDAwMDAwMDMKK3F1YXg4NTAgcXVhbnRpemUgICAwICAxZS0xMDAwMDAwMDA0IC0+IDBFLTEwMDAwMDAwMDQKK3F1YXg4NTEgcXVhbnRpemUgICAwICAxZS0xMDAwMDAwMDA1IC0+IDBFLTEwMDAwMDAwMDUKK3F1YXg4NTIgcXVhbnRpemUgICAwICAxZS0xMDAwMDAwMDA2IC0+IDBFLTEwMDAwMDAwMDYKK3F1YXg4NTMgcXVhbnRpemUgICAwICAxZS0xMDAwMDAwMDA3IC0+IDBFLTEwMDAwMDAwMDcKK3F1YXg4NTQgcXVhbnRpemUgICAwICAxZS0xMDAwMDAwMDA4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitxdWF4ODYxIHF1YW50aXplICAgMSAgMWUrMjE0NzQ4MzY0OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4NjIgcXVhbnRpemUgICAxICAxZSsyMTQ3NDgzNjQ4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDg2MyBxdWFudGl6ZSAgIDEgIDFlKzIxNDc0ODM2NDcgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODY0IHF1YW50aXplICAgMSAgMWUtMjE0NzQ4MzY0NyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4NjUgcXVhbnRpemUgICAxICAxZS0yMTQ3NDgzNjQ4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDg2NiBxdWFudGl6ZSAgIDEgIDFlLTIxNDc0ODM2NDkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE1vcmUgZnJvbSBGdW5nIExlZQorcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK3F1YXgxMDIxIHF1YW50aXplICAgIDguNjY2NjY2NjY2NjY2MDAwRSszODQgICAgIDEuMDAwMDAwMDAwMDAwMDAwRSszODQgIC0+IDguNjY2NjY2NjY2NjY2MDAwRSszODQKK3F1YXgxMDIyIHF1YW50aXplIDY0IzguNjY2NjY2NjY2NjY2MDAwRSszODQgIDY0IzEuMDAwMDAwMDAwMDAwMDAwRSszODQgIC0+IDguNjY2NjY2NjY2NjY2MDAwRSszODQKK3F1YXgxMDIzIHF1YW50aXplIDY0IzguNjY2NjY2NjY2NjY2MDAwRSszODQgIDEyOCMxLjAwMDAwMDAwMDAwMDAwMEUrMzg0IC0+IDguNjY2NjY2NjY2NjY2MDAwRSszODQKK3F1YXgxMDI0IHF1YW50aXplIDY0IzguNjY2NjY2NjY2NjY2MDAwRSszODQgIDY0IzFFKzM4NCAgICAgICAgICAgICAgICAgIC0+IDguNjY2NjY2NjY2NjY2MDAwRSszODQKK3F1YXgxMDI1IHF1YW50aXplIDY0IzguNjY2NjY2NjY2NjY2MDAwRSszODQgIDY0IzFFKzM4NCAgIC0+IDY0IzguNjY2NjY2NjY2NjY2MDAwRSszODQKK3F1YXgxMDI2IHF1YW50aXplIDY0IzguNjY2NjY2NjY2NjY2MDAwRSszODQgMTI4IzFFKzM4NCAgIC0+IDY0IzlFKzM4NCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcXVheDEwMjcgcXVhbnRpemUgNjQjOC42NjY2NjY2NjY2NjYwMDBFKzMyMyAgNjQjMUUrMzEgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4MTAyOCBxdWFudGl6ZSA2NCM4LjY2NjY2NjY2NjY2NjAwMEUrMzIzIDEyOCMxRSszMSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXgxMDI5IHF1YW50aXplIDY0IzguNjY2NjY2NjZFKzMgICAgICAgICAgMTI4IzFFKzEwICAgIC0+IDY0IzBFMTAgSW5leGFjdCBSb3VuZGVkCitxdWF4MTAzMCBxdWFudGl6ZSAgICA4LjY2NjY2NjY2RSszICAgICAgICAgICAgICAxRSszICAgICAtPiA5RSszIEluZXhhY3QgUm91bmRlZAorCistLSBJbnQgYW5kIHVJbnQzMiBlZGdlIHZhbHVlcyBmb3IgdGVzdGluZyBjb252ZXJzaW9ucworcXVheDEwNDAgcXVhbnRpemUgLTIxNDc0ODM2NDYgICAgIDAgLT4gLTIxNDc0ODM2NDYKK3F1YXgxMDQxIHF1YW50aXplIC0yMTQ3NDgzNjQ3ICAgICAwIC0+IC0yMTQ3NDgzNjQ3CitxdWF4MTA0MiBxdWFudGl6ZSAtMjE0NzQ4MzY0OCAgICAgMCAtPiAtMjE0NzQ4MzY0OAorcXVheDEwNDMgcXVhbnRpemUgLTIxNDc0ODM2NDkgICAgIDAgLT4gLTIxNDc0ODM2NDkKK3F1YXgxMDQ0IHF1YW50aXplICAyMTQ3NDgzNjQ2ICAgICAwIC0+ICAyMTQ3NDgzNjQ2CitxdWF4MTA0NSBxdWFudGl6ZSAgMjE0NzQ4MzY0NyAgICAgMCAtPiAgMjE0NzQ4MzY0NworcXVheDEwNDYgcXVhbnRpemUgIDIxNDc0ODM2NDggICAgIDAgLT4gIDIxNDc0ODM2NDgKK3F1YXgxMDQ3IHF1YW50aXplICAyMTQ3NDgzNjQ5ICAgICAwIC0+ICAyMTQ3NDgzNjQ5CitxdWF4MTA0OCBxdWFudGl6ZSAgNDI5NDk2NzI5NCAgICAgMCAtPiAgNDI5NDk2NzI5NAorcXVheDEwNDkgcXVhbnRpemUgIDQyOTQ5NjcyOTUgICAgIDAgLT4gIDQyOTQ5NjcyOTUKK3F1YXgxMDUwIHF1YW50aXplICA0Mjk0OTY3Mjk2ICAgICAwIC0+ICA0Mjk0OTY3Mjk2CitxdWF4MTA1MSBxdWFudGl6ZSAgNDI5NDk2NzI5NyAgICAgMCAtPiAgNDI5NDk2NzI5NworLS0gYW5kIHBvd2VycyBvZiB0ZW4gZm9yIHNhbWUKK3F1YXgxMTAxIHF1YW50aXplICA1MDAwMDAwMDAwICAgICAwIC0+ICA1MDAwMDAwMDAwCitxdWF4MTEwMiBxdWFudGl6ZSAgNDAwMDAwMDAwMCAgICAgMCAtPiAgNDAwMDAwMDAwMAorcXVheDExMDMgcXVhbnRpemUgIDIwMDAwMDAwMDAgICAgIDAgLT4gIDIwMDAwMDAwMDAKK3F1YXgxMTA0IHF1YW50aXplICAxMDAwMDAwMDAwICAgICAwIC0+ICAxMDAwMDAwMDAwCitxdWF4MTEwNSBxdWFudGl6ZSAgMDEwMDAwMDAwMCAgICAgMCAtPiAgMTAwMDAwMDAwCitxdWF4MTEwNiBxdWFudGl6ZSAgMDAxMDAwMDAwMCAgICAgMCAtPiAgMTAwMDAwMDAKK3F1YXgxMTA3IHF1YW50aXplICAwMDAxMDAwMDAwICAgICAwIC0+ICAxMDAwMDAwCitxdWF4MTEwOCBxdWFudGl6ZSAgMDAwMDEwMDAwMCAgICAgMCAtPiAgMTAwMDAwCitxdWF4MTEwOSBxdWFudGl6ZSAgMDAwMDAxMDAwMCAgICAgMCAtPiAgMTAwMDAKK3F1YXgxMTEwIHF1YW50aXplICAwMDAwMDAxMDAwICAgICAwIC0+ICAxMDAwCitxdWF4MTExMSBxdWFudGl6ZSAgMDAwMDAwMDEwMCAgICAgMCAtPiAgMTAwCitxdWF4MTExMiBxdWFudGl6ZSAgMDAwMDAwMDAxMCAgICAgMCAtPiAgMTAKK3F1YXgxMTEzIHF1YW50aXplICAwMDAwMDAwMDAxICAgICAwIC0+ICAxCitxdWF4MTExNCBxdWFudGl6ZSAgMDAwMDAwMDAwMCAgICAgMCAtPiAgMAorLS0gYW5kIHBvd2VycyBvZiB0ZW4gZm9yIHNhbWUKK3F1YXgxMTIxIHF1YW50aXplIC01MDAwMDAwMDAwICAgICAwIC0+IC01MDAwMDAwMDAwCitxdWF4MTEyMiBxdWFudGl6ZSAtNDAwMDAwMDAwMCAgICAgMCAtPiAtNDAwMDAwMDAwMAorcXVheDExMjMgcXVhbnRpemUgLTIwMDAwMDAwMDAgICAgIDAgLT4gLTIwMDAwMDAwMDAKK3F1YXgxMTI0IHF1YW50aXplIC0xMDAwMDAwMDAwICAgICAwIC0+IC0xMDAwMDAwMDAwCitxdWF4MTEyNSBxdWFudGl6ZSAtMDEwMDAwMDAwMCAgICAgMCAtPiAtMTAwMDAwMDAwCitxdWF4MTEyNiBxdWFudGl6ZSAtMDAxMDAwMDAwMCAgICAgMCAtPiAtMTAwMDAwMDAKK3F1YXgxMTI3IHF1YW50aXplIC0wMDAxMDAwMDAwICAgICAwIC0+IC0xMDAwMDAwCitxdWF4MTEyOCBxdWFudGl6ZSAtMDAwMDEwMDAwMCAgICAgMCAtPiAtMTAwMDAwCitxdWF4MTEyOSBxdWFudGl6ZSAtMDAwMDAxMDAwMCAgICAgMCAtPiAtMTAwMDAKK3F1YXgxMTMwIHF1YW50aXplIC0wMDAwMDAxMDAwICAgICAwIC0+IC0xMDAwCitxdWF4MTEzMSBxdWFudGl6ZSAtMDAwMDAwMDEwMCAgICAgMCAtPiAtMTAwCitxdWF4MTEzMiBxdWFudGl6ZSAtMDAwMDAwMDAxMCAgICAgMCAtPiAtMTAKK3F1YXgxMTMzIHF1YW50aXplIC0wMDAwMDAwMDAxICAgICAwIC0+IC0xCitxdWF4MTEzNCBxdWFudGl6ZSAtMDAwMDAwMDAwMCAgICAgMCAtPiAtMAorCistLSBTb21lIG1pc2NlbGxhbnkKK3ByZWNpc2lvbjogICAzNAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgMiAgICAgICAgIDMKKy0tICAgICAgICAgICAgICAgICAgIDEgMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CitxdWF4MGExIHF1YW50aXplICAgICA4LjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NUUrNjE0MyAgMUUrNjE0MyAgICAgIC0+IDlFKzYxNDMgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwYTIgcXVhbnRpemUgMTI4IzguNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1RSs2MTQzICAxMjgjMUUrNjE0MyAgLT4gOC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NkUrNjE0MyAgIFJvdW5kZWQgSW5leGFjdAorcXVheDBhMyBxdWFudGl6ZSAxMjgjOC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTVFKzYxNDQgIDEyOCMxRSs2MTQ0ICAtPiA4LjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NUUrNjE0NAorCistLSBwYXlsb2FkIGRlY2FwaXRhdGUKK3ByZWNpc2lvbjogNQorcXVheDYyMTAwIHF1YW50aXplIDExIC1zTmFOMTIzNDU2Nzg5MCAtPiAtTmFONjc4OTAgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdHMKK3F1YXg5OTggcXVhbnRpemUgMTAgICAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg5OTkgcXVhbnRpemUgICMgMWUxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmFuZG9tQm91bmQzMi5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yYW5kb21Cb3VuZDMyLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1OWI5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmFuZG9tQm91bmQzMi5kZWNUZXN0CkBAIC0wLDAgKzEsMjQ0MyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSByYW5kb21Cb3VuZDMyLmRlY1Rlc3QgLS0gZGVjaW1hbCB0ZXN0Y2FzZXMgLS0gYm91bmRhcmllcyBuZWFyIDMyICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoZXNlIHRlc3RjYXNlcyB0ZXN0IGNhbGN1bGF0aW9ucyBhdCBwcmVjaXNpb25zIDMxLCAzMiwgYW5kIDMzLCB0bworLS0gZXhlcmNpc2UgdGhlIGJvdW5kYXJpZXMgYXJvdW5kIDIqKjUKKworLS0gcmFuZG9tbHkgZ2VuZXJhdGVkIHRlc3RjYXNlcyBbMjYgU2VwIDIwMDFdCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDMxCityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OTkKK21pbmV4cG9uZW50OiAtOTk5OQorCithZGR4MzAwMSBhZGQgNDk1MzczNDY3NTkxMy4wNjUzMTQ3Mzg3NDMzMjI1NzkgMDIxOC45MzIwMTAzOTY1MzQzNzE3MDQ5MzA3MTQ4NjBFKzc5NyAtPiAyLjE4OTMyMDEwMzk2NTM0MzcxNzA0OTMwNzE0ODYwMEUrNzk5IEluZXhhY3QgUm91bmRlZAorY29teDMwMDEgY29tcGFyZSA0OTUzNzM0Njc1OTEzLjA2NTMxNDczODc0MzMyMjU3OSAwMjE4LjkzMjAxMDM5NjUzNDM3MTcwNDkzMDcxNDg2MEUrNzk3IC0+IC0xCitkaXZ4MzAwMSBkaXZpZGUgNDk1MzczNDY3NTkxMy4wNjUzMTQ3Mzg3NDMzMjI1NzkgMDIxOC45MzIwMTAzOTY1MzQzNzE3MDQ5MzA3MTQ4NjBFKzc5NyAtPiAyLjI2MjY4MTc2NDUwNzk2NTAwNTI4NDA4MDgwMDQzOEUtNzg3IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMDEgZGl2aWRlaW50IDQ5NTM3MzQ2NzU5MTMuMDY1MzE0NzM4NzQzMzIyNTc5IDAyMTguOTMyMDEwMzk2NTM0MzcxNzA0OTMwNzE0ODYwRSs3OTcgLT4gMAorbXVseDMwMDEgbXVsdGlwbHkgNDk1MzczNDY3NTkxMy4wNjUzMTQ3Mzg3NDMzMjI1NzkgMDIxOC45MzIwMTAzOTY1MzQzNzE3MDQ5MzA3MTQ4NjBFKzc5NyAtPiAxLjA4NDUzMTA5MTU2ODY3MjA0MTkyMzE1MTYzMjA2NkUrODEyIEluZXhhY3QgUm91bmRlZAorcG93eDMwMDEgcG93ZXIgNDk1MzczNDY3NTkxMy4wNjUzMTQ3Mzg3NDMzMjI1NzkgMiAtPiAyNDUzOTQ4NzIzOTM0MzUyMjI0NjE1NTg5MC45OTQ5NSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDAxIHJlbWFpbmRlciA0OTUzNzM0Njc1OTEzLjA2NTMxNDczODc0MzMyMjU3OSAwMjE4LjkzMjAxMDM5NjUzNDM3MTcwNDkzMDcxNDg2MEUrNzk3IC0+IDQ5NTM3MzQ2NzU5MTMuMDY1MzE0NzM4NzQzMzIyNTc5CitzdWJ4MzAwMSBzdWJ0cmFjdCA0OTUzNzM0Njc1OTEzLjA2NTMxNDczODc0MzMyMjU3OSAwMjE4LjkzMjAxMDM5NjUzNDM3MTcwNDkzMDcxNDg2MEUrNzk3IC0+IC0yLjE4OTMyMDEwMzk2NTM0MzcxNzA0OTMwNzE0ODYwMEUrNzk5IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMDIgYWRkIDk2NDEuNjg0MzIzMzg2OTU1ODgxNTk1NDkwMzQ3OTEwRS04NDQgLTc4ODY0NTMyMDQ3LjEyMjg3NDg0NDMwOTgwNjM2Nzk4RSs5MzQgLT4gLTcuODg2NDUzMjA0NzEyMjg3NDg0NDMwOTgwNjM2Nzk4RSs5NDQgSW5leGFjdCBSb3VuZGVkCitjb214MzAwMiBjb21wYXJlIDk2NDEuNjg0MzIzMzg2OTU1ODgxNTk1NDkwMzQ3OTEwRS04NDQgLTc4ODY0NTMyMDQ3LjEyMjg3NDg0NDMwOTgwNjM2Nzk4RSs5MzQgLT4gMQorZGl2eDMwMDIgZGl2aWRlIDk2NDEuNjg0MzIzMzg2OTU1ODgxNTk1NDkwMzQ3OTEwRS04NDQgLTc4ODY0NTMyMDQ3LjEyMjg3NDg0NDMwOTgwNjM2Nzk4RSs5MzQgLT4gLTEuMjIyNTYyODAxNDQxMDY5NjY3ODQ5NDAyNzgyNzE2RS0xNzg1IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMDIgZGl2aWRlaW50IDk2NDEuNjg0MzIzMzg2OTU1ODgxNTk1NDkwMzQ3OTEwRS04NDQgLTc4ODY0NTMyMDQ3LjEyMjg3NDg0NDMwOTgwNjM2Nzk4RSs5MzQgLT4gLTAKK211bHgzMDAyIG11bHRpcGx5IDk2NDEuNjg0MzIzMzg2OTU1ODgxNTk1NDkwMzQ3OTEwRS04NDQgLTc4ODY0NTMyMDQ3LjEyMjg3NDg0NDMwOTgwNjM2Nzk4RSs5MzQgLT4gLTcuNjAzODY5MjIzMDk5OTI4MTQxNjU5ODMxNTg5OTA1RSsxMDQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAwMiBwb3dlciA5NjQxLjY4NDMyMzM4Njk1NTg4MTU5NTQ5MDM0NzkxMEUtODQ0IC04IC0+IDEuMzM4OTg4MTUyMDY3MTgwMzM3NzM4OTU1NzU3NTg3RSs2NzIwIEluZXhhY3QgUm91bmRlZAorcmVteDMwMDIgcmVtYWluZGVyIDk2NDEuNjg0MzIzMzg2OTU1ODgxNTk1NDkwMzQ3OTEwRS04NDQgLTc4ODY0NTMyMDQ3LjEyMjg3NDg0NDMwOTgwNjM2Nzk4RSs5MzQgLT4gOS42NDE2ODQzMjMzODY5NTU4ODE1OTU0OTAzNDc5MTBFLTg0MQorc3VieDMwMDIgc3VidHJhY3QgOTY0MS42ODQzMjMzODY5NTU4ODE1OTU0OTAzNDc5MTBFLTg0NCAtNzg4NjQ1MzIwNDcuMTIyODc0ODQ0MzA5ODA2MzY3OThFKzkzNCAtPiA3Ljg4NjQ1MzIwNDcxMjI4NzQ4NDQzMDk4MDYzNjc5OEUrOTQ0IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMDMgYWRkIC0xLjAyODA0ODU3MTYyODMyNjg3MTA1NDk2NDMwNzc3NEUrNTI5IDQ5MjAwMDA4NjQ1Njk5LjM1NTc3OTM3NTgyNzE0NzM5IC0+IC0xLjAyODA0ODU3MTYyODMyNjg3MTA1NDk2NDMwNzc3NEUrNTI5IEluZXhhY3QgUm91bmRlZAorY29teDMwMDMgY29tcGFyZSAtMS4wMjgwNDg1NzE2MjgzMjY4NzEwNTQ5NjQzMDc3NzRFKzUyOSA0OTIwMDAwODY0NTY5OS4zNTU3NzkzNzU4MjcxNDczOSAtPiAtMQorZGl2eDMwMDMgZGl2aWRlIC0xLjAyODA0ODU3MTYyODMyNjg3MTA1NDk2NDMwNzc3NEUrNTI5IDQ5MjAwMDA4NjQ1Njk5LjM1NTc3OTM3NTgyNzE0NzM5IC0+IC0yLjA4OTUyOTI0OTk0Njk3MTQ4Mjg2MTg0MzY5MjQ2NUUrNTE1IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMDMgZGl2aWRlaW50IC0xLjAyODA0ODU3MTYyODMyNjg3MTA1NDk2NDMwNzc3NEUrNTI5IDQ5MjAwMDA4NjQ1Njk5LjM1NTc3OTM3NTgyNzE0NzM5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzAwMyBtdWx0aXBseSAtMS4wMjgwNDg1NzE2MjgzMjY4NzEwNTQ5NjQzMDc3NzRFKzUyOSA0OTIwMDAwODY0NTY5OS4zNTU3NzkzNzU4MjcxNDczOSAtPiAtNS4wNTc5OTk4NjEyMzEyNTU1NDkyODM3Mzc4NjEyMDdFKzU0MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDAzIHBvd2VyIC0xLjAyODA0ODU3MTYyODMyNjg3MTA1NDk2NDMwNzc3NEUrNTI5IDUgLT4gLTEuMTQ4MzMzODU4MjUzNzA0Mjg0MjMyNzgwODE5NzM5RSsyNjQ1IEluZXhhY3QgUm91bmRlZAorcmVteDMwMDMgcmVtYWluZGVyIC0xLjAyODA0ODU3MTYyODMyNjg3MTA1NDk2NDMwNzc3NEUrNTI5IDQ5MjAwMDA4NjQ1Njk5LjM1NTc3OTM3NTgyNzE0NzM5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzAwMyBzdWJ0cmFjdCAtMS4wMjgwNDg1NzE2MjgzMjY4NzEwNTQ5NjQzMDc3NzRFKzUyOSA0OTIwMDAwODY0NTY5OS4zNTU3NzkzNzU4MjcxNDczOSAtPiAtMS4wMjgwNDg1NzE2MjgzMjY4NzEwNTQ5NjQzMDc3NzRFKzUyOSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDA0IGFkZCA0NzkwODQuODU2MTgwODkzMDUyNTQxNzczNTIwNTUxOSAwODQxNTc1NzEwNTQuMjY5MTc4NDY2MDk4Mzk4OTkzMSAtPiA4NDE1ODA1MDEzOS4xMjUzNTkzNTkxNTA5NDA3NjY2MiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDA0IGNvbXBhcmUgNDc5MDg0Ljg1NjE4MDg5MzA1MjU0MTc3MzUyMDU1MTkgMDg0MTU3NTcxMDU0LjI2OTE3ODQ2NjA5ODM5ODk5MzEgLT4gLTEKK2RpdngzMDA0IGRpdmlkZSA0NzkwODQuODU2MTgwODkzMDUyNTQxNzczNTIwNTUxOSAwODQxNTc1NzEwNTQuMjY5MTc4NDY2MDk4Mzk4OTkzMSAtPiAwLjAwMDAwNTY5MjcxMjQ5MzcwOTYxNzkwNTQ5MzcxMDIwNzk2OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDA0IGRpdmlkZWludCA0NzkwODQuODU2MTgwODkzMDUyNTQxNzczNTIwNTUxOSAwODQxNTc1NzEwNTQuMjY5MTc4NDY2MDk4Mzk4OTkzMSAtPiAwCittdWx4MzAwNCBtdWx0aXBseSA0NzkwODQuODU2MTgwODkzMDUyNTQxNzczNTIwNTUxOSAwODQxNTc1NzEwNTQuMjY5MTc4NDY2MDk4Mzk4OTkzMSAtPiA0MDMxODYxNzgyNTA2NzgzNy40NzMxNzcwMDUyMzY4NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDA0IHBvd2VyIDQ3OTA4NC44NTYxODA4OTMwNTI1NDE3NzM1MjA1NTE5IDggLT4gMi43NzUyMzM1OTgwMjEyMzU5NzM1NDU5MzMwNDU4MzdFKzQ1IEluZXhhY3QgUm91bmRlZAorcmVteDMwMDQgcmVtYWluZGVyIDQ3OTA4NC44NTYxODA4OTMwNTI1NDE3NzM1MjA1NTE5IDA4NDE1NzU3MTA1NC4yNjkxNzg0NjYwOTgzOTg5OTMxIC0+IDQ3OTA4NC44NTYxODA4OTMwNTI1NDE3NzM1MjA1NTE5CitzdWJ4MzAwNCBzdWJ0cmFjdCA0NzkwODQuODU2MTgwODkzMDUyNTQxNzczNTIwNTUxOSAwODQxNTc1NzEwNTQuMjY5MTc4NDY2MDk4Mzk4OTkzMSAtPiAtODQxNTcwOTE5NjkuNDEyOTk3NTczMDQ1ODU3MjE5NTggSW5leGFjdCBSb3VuZGVkCithZGR4MzAwNSBhZGQgLTAzNjM3NTA3ODguNTczNzgyMjA1NjY0MzQ5NTYyOTMxIC0zMTcyLjA4MDkzNDQ2NDEzMzY5MTkwOTkwNTk4MDA5NiAtPiAtMzYzNzUzOTYwLjY1NDcxNjY2OTc5ODA0MTQ3MjgzNzAgSW5leGFjdCBSb3VuZGVkCitjb214MzAwNSBjb21wYXJlIC0wMzYzNzUwNzg4LjU3Mzc4MjIwNTY2NDM0OTU2MjkzMSAtMzE3Mi4wODA5MzQ0NjQxMzM2OTE5MDk5MDU5ODAwOTYgLT4gLTEKK2RpdngzMDA1IGRpdmlkZSAtMDM2Mzc1MDc4OC41NzM3ODIyMDU2NjQzNDk1NjI5MzEgLTMxNzIuMDgwOTM0NDY0MTMzNjkxOTA5OTA1OTgwMDk2IC0+IDExNDY3Mi42MDY0MzM3NDIwMTY3MDk2Mjk1MjkwODkwIEluZXhhY3QgUm91bmRlZAorZHZpeDMwMDUgZGl2aWRlaW50IC0wMzYzNzUwNzg4LjU3Mzc4MjIwNTY2NDM0OTU2MjkzMSAtMzE3Mi4wODA5MzQ0NjQxMzM2OTE5MDk5MDU5ODAwOTYgLT4gMTE0NjcyCittdWx4MzAwNSBtdWx0aXBseSAtMDM2Mzc1MDc4OC41NzM3ODIyMDU2NjQzNDk1NjI5MzEgLTMxNzIuMDgwOTM0NDY0MTMzNjkxOTA5OTA1OTgwMDk2IC0+IDExNTM4NDY5NDEzMzEuMTg4NTgzMjkyMjM5MjMwODE4IEluZXhhY3QgUm91bmRlZAorcG93eDMwMDUgcG93ZXIgLTAzNjM3NTA3ODguNTczNzgyMjA1NjY0MzQ5NTYyOTMxIC0zMTcyIC0+IDBFLTEwMDI5IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMDA1IHJlbWFpbmRlciAtMDM2Mzc1MDc4OC41NzM3ODIyMDU2NjQzNDk1NjI5MzEgLTMxNzIuMDgwOTM0NDY0MTMzNjkxOTA5OTA1OTgwMDk2IC0+IC0xOTIzLjY1NjkxMTA2Njk0NTY1NjgyNDM4MTQzMTQ4OAorc3VieDMwMDUgc3VidHJhY3QgLTAzNjM3NTA3ODguNTczNzgyMjA1NjY0MzQ5NTYyOTMxIC0zMTcyLjA4MDkzNDQ2NDEzMzY5MTkwOTkwNTk4MDA5NiAtPiAtMzYzNzQ3NjE2LjQ5Mjg0Nzc0MTUzMDY1NzY1MzAyNTAgSW5leGFjdCBSb3VuZGVkCithZGR4MzAwNiBhZGQgMTM4MTAyNjU1MTQyMzY2OTkxOTAxMDE5MTg3ODQ0OSAtODIuNjY2MTQ3NzU0NDUzNzEyNTQ5OTkzNTc4MDA3MzkgLT4gMTM4MTAyNjU1MTQyMzY2OTkxOTAxMDE5MTg3ODM2NiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDA2IGNvbXBhcmUgMTM4MTAyNjU1MTQyMzY2OTkxOTAxMDE5MTg3ODQ0OSAtODIuNjY2MTQ3NzU0NDUzNzEyNTQ5OTkzNTc4MDA3MzkgLT4gMQorZGl2eDMwMDYgZGl2aWRlIDEzODEwMjY1NTE0MjM2Njk5MTkwMTAxOTE4Nzg0NDkgLTgyLjY2NjE0Nzc1NDQ1MzcxMjU0OTk5MzU3ODAwNzM5IC0+IC0xNjcwNjA3MTIxNDYxMzU1MjM3NzM3NjYzOTU1Ny45MCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDA2IGRpdmlkZWludCAxMzgxMDI2NTUxNDIzNjY5OTE5MDEwMTkxODc4NDQ5IC04Mi42NjYxNDc3NTQ0NTM3MTI1NDk5OTM1NzgwMDczOSAtPiAtMTY3MDYwNzEyMTQ2MTM1NTIzNzczNzY2Mzk1NTcKK211bHgzMDA2IG11bHRpcGx5IDEzODEwMjY1NTE0MjM2Njk5MTkwMTAxOTE4Nzg0NDkgLTgyLjY2NjE0Nzc1NDQ1MzcxMjU0OTk5MzU3ODAwNzM5IC0+IC0xLjE0MTY0MTQ0OTUyODEyNzY1NjU2MDc3MDA1NzIyOEUrMzIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAwNiBwb3dlciAxMzgxMDI2NTUxNDIzNjY5OTE5MDEwMTkxODc4NDQ5IC04MyAtPiAyLjMwNzk3NzkwODEwNjU2NDI5OTkyNTE5MzAxMTA1MkUtMjUwMiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDA2IHJlbWFpbmRlciAxMzgxMDI2NTUxNDIzNjY5OTE5MDEwMTkxODc4NDQ5IC04Mi42NjYxNDc3NTQ0NTM3MTI1NDk5OTM1NzgwMDczOSAtPiA3NC4yMjExNTk1MzU1MzYwMjAzNjA0MjE2ODc2NzM3Nworc3VieDMwMDYgc3VidHJhY3QgMTM4MTAyNjU1MTQyMzY2OTkxOTAxMDE5MTg3ODQ0OSAtODIuNjY2MTQ3NzU0NDUzNzEyNTQ5OTkzNTc4MDA3MzkgLT4gMTM4MTAyNjU1MTQyMzY2OTkxOTAxMDE5MTg3ODUzMiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDA3IGFkZCA0NjI3LjAyNjk2MDQyMzA3MjEyNzk1MzU1NjYzNTU4NSAtNDQxMDU4MzEzMjkwMS44MzAwMTc0Nzk3NDEyMzExMzEgLT4gLTQ0MTA1ODMxMjgyNzQuODAzMDU3MDU2NjY5MTAzMTc3IEluZXhhY3QgUm91bmRlZAorY29teDMwMDcgY29tcGFyZSA0NjI3LjAyNjk2MDQyMzA3MjEyNzk1MzU1NjYzNTU4NSAtNDQxMDU4MzEzMjkwMS44MzAwMTc0Nzk3NDEyMzExMzEgLT4gMQorZGl2eDMwMDcgZGl2aWRlIDQ2MjcuMDI2OTYwNDIzMDcyMTI3OTUzNTU2NjM1NTg1IC00NDEwNTgzMTMyOTAxLjgzMDAxNzQ3OTc0MTIzMTEzMSAtPiAtMS4wNDkwNzM3NDM5OTI0MDQ1NzA1NjkwMDMxMjkzNDZFLTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzAwNyBkaXZpZGVpbnQgNDYyNy4wMjY5NjA0MjMwNzIxMjc5NTM1NTY2MzU1ODUgLTQ0MTA1ODMxMzI5MDEuODMwMDE3NDc5NzQxMjMxMTMxIC0+IC0wCittdWx4MzAwNyBtdWx0aXBseSA0NjI3LjAyNjk2MDQyMzA3MjEyNzk1MzU1NjYzNTU4NSAtNDQxMDU4MzEzMjkwMS44MzAwMTc0Nzk3NDEyMzExMzEgLT4gLTIwNDA3ODg3MDY3MTI0MDI1LjMxNTc2ODg3NTY1MTEzIEluZXhhY3QgUm91bmRlZAorcG93eDMwMDcgcG93ZXIgNDYyNy4wMjY5NjA0MjMwNzIxMjc5NTM1NTY2MzU1ODUgLTQgLT4gMi4xODE2ODQxNjcyMjIzMzQ5MzQyMjE0MDc3ODE3MDFFLTE1IEluZXhhY3QgUm91bmRlZAorcmVteDMwMDcgcmVtYWluZGVyIDQ2MjcuMDI2OTYwNDIzMDcyMTI3OTUzNTU2NjM1NTg1IC00NDEwNTgzMTMyOTAxLjgzMDAxNzQ3OTc0MTIzMTEzMSAtPiA0NjI3LjAyNjk2MDQyMzA3MjEyNzk1MzU1NjYzNTU4NQorc3VieDMwMDcgc3VidHJhY3QgNDYyNy4wMjY5NjA0MjMwNzIxMjc5NTM1NTY2MzU1ODUgLTQ0MTA1ODMxMzI5MDEuODMwMDE3NDc5NzQxMjMxMTMxIC0+IDQ0MTA1ODMxMzc1MjguODU2OTc3OTAyODEzMzU5MDg1IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMDggYWRkIDc1MzUzNTc0NDkzLjg0NDg0MTUzNDg0OTE4MjEyMDQyIC04Njg0MTExNjk1MDk1ODQ5OTIyMjYzMDQ0MTkxMjIxIC0+IC04Njg0MTExNjk1MDk1ODQ5OTIyMTg3NjkwNjE2NzI3IEluZXhhY3QgUm91bmRlZAorY29teDMwMDggY29tcGFyZSA3NTM1MzU3NDQ5My44NDQ4NDE1MzQ4NDkxODIxMjA0MiAtODY4NDExMTY5NTA5NTg0OTkyMjI2MzA0NDE5MTIyMSAtPiAxCitkaXZ4MzAwOCBkaXZpZGUgNzUzNTM1NzQ0OTMuODQ0ODQxNTM0ODQ5MTgyMTIwNDIgLTg2ODQxMTE2OTUwOTU4NDk5MjIyNjMwNDQxOTEyMjEgLT4gLTguNjc3MTc3MDI2MjIzNTM2NDc1NTMxNTkyNDMyMTE4RS0yMSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDA4IGRpdmlkZWludCA3NTM1MzU3NDQ5My44NDQ4NDE1MzQ4NDkxODIxMjA0MiAtODY4NDExMTY5NTA5NTg0OTkyMjI2MzA0NDE5MTIyMSAtPiAtMAorbXVseDMwMDggbXVsdGlwbHkgNzUzNTM1NzQ0OTMuODQ0ODQxNTM0ODQ5MTgyMTIwNDIgLTg2ODQxMTE2OTUwOTU4NDk5MjIyNjMwNDQxOTEyMjEgLT4gLTYuNTQzNzg4NTc1MjkyNzQzMjgxNDU2ODMwNzAxMTI3RSs0MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDA4IHBvd2VyIDc1MzUzNTc0NDkzLjg0NDg0MTUzNDg0OTE4MjEyMDQyIC05IC0+IDEuMjc2NjMwNjcwMjg3OTA2OTI1NTcwNjQ1NDkwNzA3RS05OCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDA4IHJlbWFpbmRlciA3NTM1MzU3NDQ5My44NDQ4NDE1MzQ4NDkxODIxMjA0MiAtODY4NDExMTY5NTA5NTg0OTkyMjI2MzA0NDE5MTIyMSAtPiA3NTM1MzU3NDQ5My44NDQ4NDE1MzQ4NDkxODIxMjA0Mgorc3VieDMwMDggc3VidHJhY3QgNzUzNTM1NzQ0OTMuODQ0ODQxNTM0ODQ5MTgyMTIwNDIgLTg2ODQxMTE2OTUwOTU4NDk5MjIyNjMwNDQxOTEyMjEgLT4gODY4NDExMTY5NTA5NTg0OTkyMjMzODM5Nzc2NTcxNSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDA5IGFkZCA2OTA3MDU4LjIxNjQzNTM1NTg3NDcyOTU5MjM3MzAxMSAyLjg1NzAwNTQ0NjkxNzY3MDUxNTY2MjM5ODc0MTU0NSAtPiA2OTA3MDYxLjA3MzQ0MDgwMjc5MjQwMDEwODAzNTQxMCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDA5IGNvbXBhcmUgNjkwNzA1OC4yMTY0MzUzNTU4NzQ3Mjk1OTIzNzMwMTEgMi44NTcwMDU0NDY5MTc2NzA1MTU2NjIzOTg3NDE1NDUgLT4gMQorZGl2eDMwMDkgZGl2aWRlIDY5MDcwNTguMjE2NDM1MzU1ODc0NzI5NTkyMzczMDExIDIuODU3MDA1NDQ2OTE3NjcwNTE1NjYyMzk4NzQxNTQ1IC0+IDI0MTc1ODYuNjQ2MTQ2MjgzODU2NDM2ODY0MTIxMTA0IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMDkgZGl2aWRlaW50IDY5MDcwNTguMjE2NDM1MzU1ODc0NzI5NTkyMzczMDExIDIuODU3MDA1NDQ2OTE3NjcwNTE1NjYyMzk4NzQxNTQ1IC0+IDI0MTc1ODYKK211bHgzMDA5IG11bHRpcGx5IDY5MDcwNTguMjE2NDM1MzU1ODc0NzI5NTkyMzczMDExIDIuODU3MDA1NDQ2OTE3NjcwNTE1NjYyMzk4NzQxNTQ1IC0+IDE5NzMzNTAyLjk0NjUzMzI2MjExNjIzNjk4MDM0NzE3IEluZXhhY3QgUm91bmRlZAorcG93eDMwMDkgcG93ZXIgNjkwNzA1OC4yMTY0MzUzNTU4NzQ3Mjk1OTIzNzMwMTEgMyAtPiAzMjk1MTgxNTY2NDYzNjk1MDU0OTQuODk3MTM1MzI0MCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDA5IHJlbWFpbmRlciA2OTA3MDU4LjIxNjQzNTM1NTg3NDcyOTU5MjM3MzAxMSAyLjg1NzAwNTQ0NjkxNzY3MDUxNTY2MjM5ODc0MTU0NSAtPiAxLjg0NjA0MzQ1MjQ4MzQ1MTM5NjQ0OTAzNDE4OTYzMAorc3VieDMwMDkgc3VidHJhY3QgNjkwNzA1OC4yMTY0MzUzNTU4NzQ3Mjk1OTIzNzMwMTEgMi44NTcwMDU0NDY5MTc2NzA1MTU2NjIzOTg3NDE1NDUgLT4gNjkwNzA1NS4zNTk0Mjk5MDg5NTcwNTkwNzY3MTA2MTIgSW5leGFjdCBSb3VuZGVkCithZGR4MzAxMCBhZGQgLTM4OTQ5NTMwNDI3MjUzLjI0MDMwNjgwNDY4Njc3MTkwIDcxMjE2ODAyMS4xMjY1Mzg0NDY2NDQyNTc2NjE5MDY0RS05OTIgLT4gLTM4OTQ5NTMwNDI3MjUzLjI0MDMwNjgwNDY4Njc3MTkwIEluZXhhY3QgUm91bmRlZAorY29teDMwMTAgY29tcGFyZSAtMzg5NDk1MzA0MjcyNTMuMjQwMzA2ODA0Njg2NzcxOTAgNzEyMTY4MDIxLjEyNjUzODQ0NjY0NDI1NzY2MTkwNjRFLTk5MiAtPiAtMQorZGl2eDMwMTAgZGl2aWRlIC0zODk0OTUzMDQyNzI1My4yNDAzMDY4MDQ2ODY3NzE5MCA3MTIxNjgwMjEuMTI2NTM4NDQ2NjQ0MjU3NjYxOTA2NEUtOTkyIC0+IC01LjQ2OTE0OTAzMTEwMDk5OTcwMDQ4OTIyMTEyMjUwOUUrOTk2IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMTAgZGl2aWRlaW50IC0zODk0OTUzMDQyNzI1My4yNDAzMDY4MDQ2ODY3NzE5MCA3MTIxNjgwMjEuMTI2NTM4NDQ2NjQ0MjU3NjYxOTA2NEUtOTkyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzAxMCBtdWx0aXBseSAtMzg5NDk1MzA0MjcyNTMuMjQwMzA2ODA0Njg2NzcxOTAgNzEyMTY4MDIxLjEyNjUzODQ0NjY0NDI1NzY2MTkwNjRFLTk5MiAtPiAtMi43NzM4NjEwMDA4MTg0ODM3NjkyOTIyNDAxMDk0MTdFLTk3MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDEwIHBvd2VyIC0zODk0OTUzMDQyNzI1My4yNDAzMDY4MDQ2ODY3NzE5MCA3IC0+IC0xLjM1OTkyNjk1OTgyMzA3MTMzMjU5OTgxNzM2Mzg3N0UrOTUgSW5leGFjdCBSb3VuZGVkCityZW14MzAxMCByZW1haW5kZXIgLTM4OTQ5NTMwNDI3MjUzLjI0MDMwNjgwNDY4Njc3MTkwIDcxMjE2ODAyMS4xMjY1Mzg0NDY2NDQyNTc2NjE5MDY0RS05OTIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDEwIHN1YnRyYWN0IC0zODk0OTUzMDQyNzI1My4yNDAzMDY4MDQ2ODY3NzE5MCA3MTIxNjgwMjEuMTI2NTM4NDQ2NjQ0MjU3NjYxOTA2NEUtOTkyIC0+IC0zODk0OTUzMDQyNzI1My4yNDAzMDY4MDQ2ODY3NzE5MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDExIGFkZCAtMDcwODA2OS4wMjU2Njc0NzE5OTYzNzgwODE0ODI1NDkgLTU2Mjg0Mi40NzAxNTIwNzg3ODMxMDE4NzMyMjAyODA0IC0+IC0xMjcwOTExLjQ5NTgxOTU1MDc3OTQ3OTk1NDcwMjgyOSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDExIGNvbXBhcmUgLTA3MDgwNjkuMDI1NjY3NDcxOTk2Mzc4MDgxNDgyNTQ5IC01NjI4NDIuNDcwMTUyMDc4NzgzMTAxODczMjIwMjgwNCAtPiAtMQorZGl2eDMwMTEgZGl2aWRlIC0wNzA4MDY5LjAyNTY2NzQ3MTk5NjM3ODA4MTQ4MjU0OSAtNTYyODQyLjQ3MDE1MjA3ODc4MzEwMTg3MzIyMDI4MDQgLT4gMS4yNTgwMjM0NDkyMTg2NjU2MDgzNDkxNDUzOTQwNjkgSW5leGFjdCBSb3VuZGVkCitkdml4MzAxMSBkaXZpZGVpbnQgLTA3MDgwNjkuMDI1NjY3NDcxOTk2Mzc4MDgxNDgyNTQ5IC01NjI4NDIuNDcwMTUyMDc4NzgzMTAxODczMjIwMjgwNCAtPiAxCittdWx4MzAxMSBtdWx0aXBseSAtMDcwODA2OS4wMjU2Njc0NzE5OTYzNzgwODE0ODI1NDkgLTU2Mjg0Mi40NzAxNTIwNzg3ODMxMDE4NzMyMjAyODA0IC0+IDM5ODUzMTMxOTQ0NC44NTU2MTI4NzI5MDg2MTEyMjA1IEluZXhhY3QgUm91bmRlZAorcG93eDMwMTEgcG93ZXIgLTA3MDgwNjkuMDI1NjY3NDcxOTk2Mzc4MDgxNDgyNTQ5IC01NjI4NDIgLT4gMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwMTEgcmVtYWluZGVyIC0wNzA4MDY5LjAyNTY2NzQ3MTk5NjM3ODA4MTQ4MjU0OSAtNTYyODQyLjQ3MDE1MjA3ODc4MzEwMTg3MzIyMDI4MDQgLT4gLTE0NTIyNi41NTU1MTUzOTMyMTMyNzYyMDgyNjIyNjg2CitzdWJ4MzAxMSBzdWJ0cmFjdCAtMDcwODA2OS4wMjU2Njc0NzE5OTYzNzgwODE0ODI1NDkgLTU2Mjg0Mi40NzAxNTIwNzg3ODMxMDE4NzMyMjAyODA0IC0+IC0xNDUyMjYuNTU1NTE1MzkzMjEzMjc2MjA4MjYyMjY4NgorYWRkeDMwMTIgYWRkIDQwNTUwODcuMjQ2OTk0NjQ0NzA5NzI5OTQyNjczOTc2IC00MzE4MzE0NjkyMTg5Ny42NzM4MzQ3NjEwNDA4NDU3NUUrMjExIC0+IC00LjMxODMxNDY5MjE4OTc2NzM4MzQ3NjEwNDA4NDU3NUUrMjI0IEluZXhhY3QgUm91bmRlZAorY29teDMwMTIgY29tcGFyZSA0MDU1MDg3LjI0Njk5NDY0NDcwOTcyOTk0MjY3Mzk3NiAtNDMxODMxNDY5MjE4OTcuNjczODM0NzYxMDQwODQ1NzVFKzIxMSAtPiAxCitkaXZ4MzAxMiBkaXZpZGUgNDA1NTA4Ny4yNDY5OTQ2NDQ3MDk3Mjk5NDI2NzM5NzYgLTQzMTgzMTQ2OTIxODk3LjY3MzgzNDc2MTA0MDg0NTc1RSsyMTEgLT4gLTkuMzkwNDM5NDA5OTEzMzA3OTA2OTIzOTA5NjMwMjQ3RS0yMTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzAxMiBkaXZpZGVpbnQgNDA1NTA4Ny4yNDY5OTQ2NDQ3MDk3Mjk5NDI2NzM5NzYgLTQzMTgzMTQ2OTIxODk3LjY3MzgzNDc2MTA0MDg0NTc1RSsyMTEgLT4gLTAKK211bHgzMDEyIG11bHRpcGx5IDQwNTUwODcuMjQ2OTk0NjQ0NzA5NzI5OTQyNjczOTc2IC00MzE4MzE0NjkyMTg5Ny42NzM4MzQ3NjEwNDA4NDU3NUUrMjExIC0+IC0xLjc1MTExNDI4MzY4MDgzMzAzOTE5NzYzNzg3NDQ1M0UrMjMxIEluZXhhY3QgUm91bmRlZAorcG93eDMwMTIgcG93ZXIgNDA1NTA4Ny4yNDY5OTQ2NDQ3MDk3Mjk5NDI2NzM5NzYgLTQgLT4gMy42OTgyNzQ4OTM4NDkyNDExMTYxOTU3OTU1MTUzMDJFLTI3IEluZXhhY3QgUm91bmRlZAorcmVteDMwMTIgcmVtYWluZGVyIDQwNTUwODcuMjQ2OTk0NjQ0NzA5NzI5OTQyNjczOTc2IC00MzE4MzE0NjkyMTg5Ny42NzM4MzQ3NjEwNDA4NDU3NUUrMjExIC0+IDQwNTUwODcuMjQ2OTk0NjQ0NzA5NzI5OTQyNjczOTc2CitzdWJ4MzAxMiBzdWJ0cmFjdCA0MDU1MDg3LjI0Njk5NDY0NDcwOTcyOTk0MjY3Mzk3NiAtNDMxODMxNDY5MjE4OTcuNjczODM0NzYxMDQwODQ1NzVFKzIxMSAtPiA0LjMxODMxNDY5MjE4OTc2NzM4MzQ3NjEwNDA4NDU3NUUrMjI0IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMTMgYWRkIDQ1MDI4OTU4OTI1MjAuMzk2NTgxMzQ4MTEwOTA2OTA5RS01MTIgLTgxNS45MDQ3MzA1OTIxODYyMzQ4MjYzNTIxODc2MDM0IC0+IC04MTUuOTA0NzMwNTkyMTg2MjM0ODI2MzUyMTg3NjAzNCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDEzIGNvbXBhcmUgNDUwMjg5NTg5MjUyMC4zOTY1ODEzNDgxMTA5MDY5MDlFLTUxMiAtODE1LjkwNDczMDU5MjE4NjIzNDgyNjM1MjE4NzYwMzQgLT4gMQorZGl2eDMwMTMgZGl2aWRlIDQ1MDI4OTU4OTI1MjAuMzk2NTgxMzQ4MTEwOTA2OTA5RS01MTIgLTgxNS45MDQ3MzA1OTIxODYyMzQ4MjYzNTIxODc2MDM0IC0+IC01LjUxODg5OTExMTIzODM2Nzg2MjIzNDc5ODQzMzU1MUUtNTAzIEluZXhhY3QgUm91bmRlZAorZHZpeDMwMTMgZGl2aWRlaW50IDQ1MDI4OTU4OTI1MjAuMzk2NTgxMzQ4MTEwOTA2OTA5RS01MTIgLTgxNS45MDQ3MzA1OTIxODYyMzQ4MjYzNTIxODc2MDM0IC0+IC0wCittdWx4MzAxMyBtdWx0aXBseSA0NTAyODk1ODkyNTIwLjM5NjU4MTM0ODExMDkwNjkwOUUtNTEyIC04MTUuOTA0NzMwNTkyMTg2MjM0ODI2MzUyMTg3NjAzNCAtPiAtMy42NzM5MzQwNjAwNzE1MTYxNTY2MDQ0NTM3NTY1NDFFLTQ5NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDEzIHBvd2VyIDQ1MDI4OTU4OTI1MjAuMzk2NTgxMzQ4MTEwOTA2OTA5RS01MTIgLTgxNiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDEzIHJlbWFpbmRlciA0NTAyODk1ODkyNTIwLjM5NjU4MTM0ODExMDkwNjkwOUUtNTEyIC04MTUuOTA0NzMwNTkyMTg2MjM0ODI2MzUyMTg3NjAzNCAtPiA0LjUwMjg5NTg5MjUyMDM5NjU4MTM0ODExMDkwNjkwOUUtNTAwCitzdWJ4MzAxMyBzdWJ0cmFjdCA0NTAyODk1ODkyNTIwLjM5NjU4MTM0ODExMDkwNjkwOUUtNTEyIC04MTUuOTA0NzMwNTkyMTg2MjM0ODI2MzUyMTg3NjAzNCAtPiA4MTUuOTA0NzMwNTkyMTg2MjM0ODI2MzUyMTg3NjAzNCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDE0IGFkZCA0NjcuNjcyMTI5NTA3MjYyODEwMDI2MDIzOTE3OTg2NSAtMDIuMDcxNTUwNzMzOTU1NzM1Njk4NTIzMTYwNzMwMjUgLT4gNDY1LjYwMDU3ODc3MzMwNzA3NDMyNzUwMDc1NzI1NjMgSW5leGFjdCBSb3VuZGVkCitjb214MzAxNCBjb21wYXJlIDQ2Ny42NzIxMjk1MDcyNjI4MTAwMjYwMjM5MTc5ODY1IC0wMi4wNzE1NTA3MzM5NTU3MzU2OTg1MjMxNjA3MzAyNSAtPiAxCitkaXZ4MzAxNCBkaXZpZGUgNDY3LjY3MjEyOTUwNzI2MjgxMDAyNjAyMzkxNzk4NjUgLTAyLjA3MTU1MDczMzk1NTczNTY5ODUyMzE2MDczMDI1IC0+IC0yMjUuNzU5NDM4MDEwMTAyNzcwNTk5NzQ5NjA0NTk5OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDE0IGRpdmlkZWludCA0NjcuNjcyMTI5NTA3MjYyODEwMDI2MDIzOTE3OTg2NSAtMDIuMDcxNTUwNzMzOTU1NzM1Njk4NTIzMTYwNzMwMjUgLT4gLTIyNQorbXVseDMwMTQgbXVsdGlwbHkgNDY3LjY3MjEyOTUwNzI2MjgxMDAyNjAyMzkxNzk4NjUgLTAyLjA3MTU1MDczMzk1NTczNTY5ODUyMzE2MDczMDI1IC0+IC05NjguODA2NTQzMTMxNDEyMTUyMzA3NDg3NTA2OTgwNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDE0IHBvd2VyIDQ2Ny42NzIxMjk1MDcyNjI4MTAwMjYwMjM5MTc5ODY1IC0yIC0+IDAuMDAwMDA0NTcyMTEzNjk0MTkzMjIxODEwNjA5ODM2MDgwOTMxIEluZXhhY3QgUm91bmRlZAorcmVteDMwMTQgcmVtYWluZGVyIDQ2Ny42NzIxMjk1MDcyNjI4MTAwMjYwMjM5MTc5ODY1IC0wMi4wNzE1NTA3MzM5NTU3MzU2OTg1MjMxNjA3MzAyNSAtPiAxLjU3MzIxNDM2NzIyMjI3Nzg1ODMxMjc1MzY4MDI1CitzdWJ4MzAxNCBzdWJ0cmFjdCA0NjcuNjcyMTI5NTA3MjYyODEwMDI2MDIzOTE3OTg2NSAtMDIuMDcxNTUwNzMzOTU1NzM1Njk4NTIzMTYwNzMwMjUgLT4gNDY5Ljc0MzY4MDI0MTIxODU0NTcyNDU0NzA3ODcxNjggSW5leGFjdCBSb3VuZGVkCithZGR4MzAxNSBhZGQgMi4xNTY3OTUzMTMzMTExNTAxNDM5NDk5OTc1NTI1MDFFLTU3MSAtODY3NzE0Ny41ODYzODk0MDE2ODI3MTIxODAxNDY4NTUgLT4gLTg2NzcxNDcuNTg2Mzg5NDAxNjgyNzEyMTgwMTQ2ODU1IEluZXhhY3QgUm91bmRlZAorY29teDMwMTUgY29tcGFyZSAyLjE1Njc5NTMxMzMxMTE1MDE0Mzk0OTk5NzU1MjUwMUUtNTcxIC04Njc3MTQ3LjU4NjM4OTQwMTY4MjcxMjE4MDE0Njg1NSAtPiAxCitkaXZ4MzAxNSBkaXZpZGUgMi4xNTY3OTUzMTMzMTExNTAxNDM5NDk5OTc1NTI1MDFFLTU3MSAtODY3NzE0Ny41ODYzODk0MDE2ODI3MTIxODAxNDY4NTUgLT4gLTIuNDg1NjA0MDQ0MjMwMTYzNzk5NjA0MjQzNTI5MDA1RS01NzggSW5leGFjdCBSb3VuZGVkCitkdml4MzAxNSBkaXZpZGVpbnQgMi4xNTY3OTUzMTMzMTExNTAxNDM5NDk5OTc1NTI1MDFFLTU3MSAtODY3NzE0Ny41ODYzODk0MDE2ODI3MTIxODAxNDY4NTUgLT4gLTAKK211bHgzMDE1IG11bHRpcGx5IDIuMTU2Nzk1MzEzMzExMTUwMTQzOTQ5OTk3NTUyNTAxRS01NzEgLTg2NzcxNDcuNTg2Mzg5NDAxNjgyNzEyMTgwMTQ2ODU1IC0+IC0xLjg3MTQ4MzEyNDcyMzM4MTk4NjI3MjgzNzk0MjU3N0UtNTY0IEluZXhhY3QgUm91bmRlZAorcG93eDMwMTUgcG93ZXIgMi4xNTY3OTUzMTMzMTExNTAxNDM5NDk5OTc1NTI1MDFFLTU3MSAtODY3NzE0OCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDE1IHJlbWFpbmRlciAyLjE1Njc5NTMxMzMxMTE1MDE0Mzk0OTk5NzU1MjUwMUUtNTcxIC04Njc3MTQ3LjU4NjM4OTQwMTY4MjcxMjE4MDE0Njg1NSAtPiAyLjE1Njc5NTMxMzMxMTE1MDE0Mzk0OTk5NzU1MjUwMUUtNTcxCitzdWJ4MzAxNSBzdWJ0cmFjdCAyLjE1Njc5NTMxMzMxMTE1MDE0Mzk0OTk5NzU1MjUwMUUtNTcxIC04Njc3MTQ3LjU4NjM4OTQwMTY4MjcxMjE4MDE0Njg1NSAtPiA4Njc3MTQ3LjU4NjM4OTQwMTY4MjcxMjE4MDE0Njg1NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDE2IGFkZCAtOTc0OTUzLjI4MDE2MzcyMDgzNjgwMDI1ODU4MjI0NTcgLTY5MzA5NTc5My4zNjY3NTc4MDY3ODAyNjk4MTkxMjQ2IC0+IC02OTQwNzA3NDYuNjQ2OTIxNTI3NjE3MDcwMDc3NzA2OCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDE2IGNvbXBhcmUgLTk3NDk1My4yODAxNjM3MjA4MzY4MDAyNTg1ODIyNDU3IC02OTMwOTU3OTMuMzY2NzU3ODA2NzgwMjY5ODE5MTI0NiAtPiAxCitkaXZ4MzAxNiBkaXZpZGUgLTk3NDk1My4yODAxNjM3MjA4MzY4MDAyNTg1ODIyNDU3IC02OTMwOTU3OTMuMzY2NzU3ODA2NzgwMjY5ODE5MTI0NiAtPiAwLjAwMTQwNjY2NDU0Njk0MjA5Mjk0MTk2MTA3NTYwODc2OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDE2IGRpdmlkZWludCAtOTc0OTUzLjI4MDE2MzcyMDgzNjgwMDI1ODU4MjI0NTcgLTY5MzA5NTc5My4zNjY3NTc4MDY3ODAyNjk4MTkxMjQ2IC0+IDAKK211bHgzMDE2IG11bHRpcGx5IC05NzQ5NTMuMjgwMTYzNzIwODM2ODAwMjU4NTgyMjQ1NyAtNjkzMDk1NzkzLjM2Njc1NzgwNjc4MDI2OTgxOTEyNDYgLT4gNjc1NzM2MDE3MjEwNTk2Ljk4OTk1ODc3NDk5OTEzNjMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAxNiBwb3dlciAtOTc0OTUzLjI4MDE2MzcyMDgzNjgwMDI1ODU4MjI0NTcgLTY5MzA5NTc5MyAtPiAtMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwMTYgcmVtYWluZGVyIC05NzQ5NTMuMjgwMTYzNzIwODM2ODAwMjU4NTgyMjQ1NyAtNjkzMDk1NzkzLjM2Njc1NzgwNjc4MDI2OTgxOTEyNDYgLT4gLTk3NDk1My4yODAxNjM3MjA4MzY4MDAyNTg1ODIyNDU3CitzdWJ4MzAxNiBzdWJ0cmFjdCAtOTc0OTUzLjI4MDE2MzcyMDgzNjgwMDI1ODU4MjI0NTcgLTY5MzA5NTc5My4zNjY3NTc4MDY3ODAyNjk4MTkxMjQ2IC0+IDY5MjEyMDg0MC4wODY1OTQwODU5NDM0Njk1NjA1NDI0IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMTcgYWRkIC03NjM0NjgwMTQwMDA5NTcxODQ2MTU1NjU0MzM5NzgxIDMwMDk2MzA5NDk1MDIuMDM1ODUyNDMzNDM0MjE0NDEzRS00OTAgLT4gLTc2MzQ2ODAxNDAwMDk1NzE4NDYxNTU2NTQzMzk3ODEgSW5leGFjdCBSb3VuZGVkCitjb214MzAxNyBjb21wYXJlIC03NjM0NjgwMTQwMDA5NTcxODQ2MTU1NjU0MzM5NzgxIDMwMDk2MzA5NDk1MDIuMDM1ODUyNDMzNDM0MjE0NDEzRS00OTAgLT4gLTEKK2RpdngzMDE3IGRpdmlkZSAtNzYzNDY4MDE0MDAwOTU3MTg0NjE1NTY1NDMzOTc4MSAzMDA5NjMwOTQ5NTAyLjAzNTg1MjQzMzQzNDIxNDQxM0UtNDkwIC0+IC0yLjUzNjc0OTYxMDg2OTMyNjc1Mzc0MTAyNDY1OTk0OEUrNTA4IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMTcgZGl2aWRlaW50IC03NjM0NjgwMTQwMDA5NTcxODQ2MTU1NjU0MzM5NzgxIDMwMDk2MzA5NDk1MDIuMDM1ODUyNDMzNDM0MjE0NDEzRS00OTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDE3IG11bHRpcGx5IC03NjM0NjgwMTQwMDA5NTcxODQ2MTU1NjU0MzM5NzgxIDMwMDk2MzA5NDk1MDIuMDM1ODUyNDMzNDM0MjE0NDEzRS00OTAgLT4gLTIuMjk3NzU2OTYzODkyMTM0MzczNjU3NTQ0MDI1MTA3RS00NDcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAxNyBwb3dlciAtNzYzNDY4MDE0MDAwOTU3MTg0NjE1NTY1NDMzOTc4MSAzIC0+IC00LjQ1MDEyODM4MjA3MjE1NzE3MDIwNzU4NDg0NzgzMUUrOTIgSW5leGFjdCBSb3VuZGVkCityZW14MzAxNyByZW1haW5kZXIgLTc2MzQ2ODAxNDAwMDk1NzE4NDYxNTU2NTQzMzk3ODEgMzAwOTYzMDk0OTUwMi4wMzU4NTI0MzM0MzQyMTQ0MTNFLTQ5MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwMTcgc3VidHJhY3QgLTc2MzQ2ODAxNDAwMDk1NzE4NDYxNTU2NTQzMzk3ODEgMzAwOTYzMDk0OTUwMi4wMzU4NTI0MzM0MzQyMTQ0MTNFLTQ5MCAtPiAtNzYzNDY4MDE0MDAwOTU3MTg0NjE1NTY1NDMzOTc4MSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDE4IGFkZCAyNjIyNzMuMDIyMjg1MTE4NjUyMzY1MDg4OTg5NjQyOEUtNjI0IDc0MTc3LjIxMDczMzM4MDkwODQzMTQ1ODM4ODM1NDgwIC0+IDc0MTc3LjIxMDczMzM4MDkwODQzMTQ1ODM4ODM1NDgwIEluZXhhY3QgUm91bmRlZAorY29teDMwMTggY29tcGFyZSAyNjIyNzMuMDIyMjg1MTE4NjUyMzY1MDg4OTg5NjQyOEUtNjI0IDc0MTc3LjIxMDczMzM4MDkwODQzMTQ1ODM4ODM1NDgwIC0+IC0xCitkaXZ4MzAxOCBkaXZpZGUgMjYyMjczLjAyMjI4NTExODY1MjM2NTA4ODk4OTY0MjhFLTYyNCA3NDE3Ny4yMTA3MzMzODA5MDg0MzE0NTgzODgzNTQ4MCAtPiAzLjUzNTc2Mjc5OTU0NTI3NDMyOTM1ODI5MjA2NTM0M0UtNjI0IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMTggZGl2aWRlaW50IDI2MjI3My4wMjIyODUxMTg2NTIzNjUwODg5ODk2NDI4RS02MjQgNzQxNzcuMjEwNzMzMzgwOTA4NDMxNDU4Mzg4MzU0ODAgLT4gMAorbXVseDMwMTggbXVsdGlwbHkgMjYyMjczLjAyMjI4NTExODY1MjM2NTA4ODk4OTY0MjhFLTYyNCA3NDE3Ny4yMTA3MzMzODA5MDg0MzE0NTgzODgzNTQ4MCAtPiAxLjk0NTQ2ODEyNDM3MjM5NTM0OTE5MjY2NTAzMTY3NUUtNjE0IEluZXhhY3QgUm91bmRlZAorcG93eDMwMTggcG93ZXIgMjYyMjczLjAyMjI4NTExODY1MjM2NTA4ODk4OTY0MjhFLTYyNCA3NDE3NyAtPiAwRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzAxOCByZW1haW5kZXIgMjYyMjczLjAyMjI4NTExODY1MjM2NTA4ODk4OTY0MjhFLTYyNCA3NDE3Ny4yMTA3MzMzODA5MDg0MzE0NTgzODgzNTQ4MCAtPiAyLjYyMjczMDIyMjg1MTE4NjUyMzY1MDg4OTg5NjQyOEUtNjE5CitzdWJ4MzAxOCBzdWJ0cmFjdCAyNjIyNzMuMDIyMjg1MTE4NjUyMzY1MDg4OTg5NjQyOEUtNjI0IDc0MTc3LjIxMDczMzM4MDkwODQzMTQ1ODM4ODM1NDgwIC0+IC03NDE3Ny4yMTA3MzMzODA5MDg0MzE0NTgzODgzNTQ4MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDE5IGFkZCAtODAzNjA1Mjc0ODgxNTkwMzE3NzYyNDcxNjU4MTczMiAtMDY2Njc3MzU3LjQ0Mzg4MDk1NDg4NTA5NjYxNjc1NzMgLT4gLTgwMzYwNTI3NDg4MTU5MDMxNzc2MjQ3ODMyNTkwODkgSW5leGFjdCBSb3VuZGVkCitjb214MzAxOSBjb21wYXJlIC04MDM2MDUyNzQ4ODE1OTAzMTc3NjI0NzE2NTgxNzMyIC0wNjY2NzczNTcuNDQzODgwOTU0ODg1MDk2NjE2NzU3MyAtPiAtMQorZGl2eDMwMTkgZGl2aWRlIC04MDM2MDUyNzQ4ODE1OTAzMTc3NjI0NzE2NTgxNzMyIC0wNjY2NzczNTcuNDQzODgwOTU0ODg1MDk2NjE2NzU3MyAtPiAxMjA1MjE0NjQyMTAzODczNTE3MzI3MzIuNjI3MTQ2OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDE5IGRpdmlkZWludCAtODAzNjA1Mjc0ODgxNTkwMzE3NzYyNDcxNjU4MTczMiAtMDY2Njc3MzU3LjQ0Mzg4MDk1NDg4NTA5NjYxNjc1NzMgLT4gMTIwNTIxNDY0MjEwMzg3MzUxNzMyNzMyCittdWx4MzAxOSBtdWx0aXBseSAtODAzNjA1Mjc0ODgxNTkwMzE3NzYyNDcxNjU4MTczMiAtMDY2Njc3MzU3LjQ0Mzg4MDk1NDg4NTA5NjYxNjc1NzMgLT4gNS4zNTgyMjc2MTU3MDY4MDA3MTEwMzMyNjIxMjQ1OThFKzM4IEluZXhhY3QgUm91bmRlZAorcG93eDMwMTkgcG93ZXIgLTgwMzYwNTI3NDg4MTU5MDMxNzc2MjQ3MTY1ODE3MzIgLTY2Njc3MzU3IC0+IC0wRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzAxOSByZW1haW5kZXIgLTgwMzYwNTI3NDg4MTU5MDMxNzc2MjQ3MTY1ODE3MzIgLTA2NjY3NzM1Ny40NDM4ODA5NTQ4ODUwOTY2MTY3NTczIC0+IC00MTgxNjQ5OS41MDQ4OTkzMDI4Mjg4OTc4OTAwNTY0CitzdWJ4MzAxOSBzdWJ0cmFjdCAtODAzNjA1Mjc0ODgxNTkwMzE3NzYyNDcxNjU4MTczMiAtMDY2Njc3MzU3LjQ0Mzg4MDk1NDg4NTA5NjYxNjc1NzMgLT4gLTgwMzYwNTI3NDg4MTU5MDMxNzc2MjQ2NDk5MDQzNzUgSW5leGFjdCBSb3VuZGVkCithZGR4MzAyMCBhZGQgODgzNDI5LjU5MjgwMzE0OTgxMDM2Mzc3MTM1NzAxNjZFKzc2NSAtNDM5NzguOTcyODM3MTI5MzkxOTgxMTEwNDMwMzI3MjYgLT4gOC44MzQyOTU5MjgwMzE0OTgxMDM2Mzc3MTM1NzAxNjZFKzc3MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDIwIGNvbXBhcmUgODgzNDI5LjU5MjgwMzE0OTgxMDM2Mzc3MTM1NzAxNjZFKzc2NSAtNDM5NzguOTcyODM3MTI5MzkxOTgxMTEwNDMwMzI3MjYgLT4gMQorZGl2eDMwMjAgZGl2aWRlIDg4MzQyOS41OTI4MDMxNDk4MTAzNjM3NzEzNTcwMTY2RSs3NjUgLTQzOTc4Ljk3MjgzNzEyOTM5MTk4MTExMDQzMDMyNzI2IC0+IC0yLjAwODc1NDQ5MjkxMzczOTYzMzIwODY3MjQ1NTAyNUUrNzY2IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMjAgZGl2aWRlaW50IDg4MzQyOS41OTI4MDMxNDk4MTAzNjM3NzEzNTcwMTY2RSs3NjUgLTQzOTc4Ljk3MjgzNzEyOTM5MTk4MTExMDQzMDMyNzI2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzAyMCBtdWx0aXBseSA4ODM0MjkuNTkyODAzMTQ5ODEwMzYzNzcxMzU3MDE2NkUrNzY1IC00Mzk3OC45NzI4MzcxMjkzOTE5ODExMTA0MzAzMjcyNiAtPiAtMy44ODUyMzI2MDY1NDA2MDA0OTAzMjE0MzgxOTE1MTZFKzc3NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDIwIHBvd2VyIDg4MzQyOS41OTI4MDMxNDk4MTAzNjM3NzEzNTcwMTY2RSs3NjUgLTQzOTc5IC0+IDBFLTEwMDI5IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMDIwIHJlbWFpbmRlciA4ODM0MjkuNTkyODAzMTQ5ODEwMzYzNzcxMzU3MDE2NkUrNzY1IC00Mzk3OC45NzI4MzcxMjkzOTE5ODExMTA0MzAzMjcyNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwMjAgc3VidHJhY3QgODgzNDI5LjU5MjgwMzE0OTgxMDM2Mzc3MTM1NzAxNjZFKzc2NSAtNDM5NzguOTcyODM3MTI5MzkxOTgxMTEwNDMwMzI3MjYgLT4gOC44MzQyOTU5MjgwMzE0OTgxMDM2Mzc3MTM1NzAxNjZFKzc3MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDIxIGFkZCAyNDc5MTMwMTA2MC4zNzkzODM2MDU2Nzc3NTUwNjk3MyAtNTYxMzMyNzg2NjQ4MC4zMjI2NDkwODAyMDU4Nzc1NjQgLT4gLTU1ODg1MzY1NjU0MTkuOTQzMjY1NDc0NTI4MTIyNDk0IEluZXhhY3QgUm91bmRlZAorY29teDMwMjEgY29tcGFyZSAyNDc5MTMwMTA2MC4zNzkzODM2MDU2Nzc3NTUwNjk3MyAtNTYxMzMyNzg2NjQ4MC4zMjI2NDkwODAyMDU4Nzc1NjQgLT4gMQorZGl2eDMwMjEgZGl2aWRlIDI0NzkxMzAxMDYwLjM3OTM4MzYwNTY3Nzc1NTA2OTczIC01NjEzMzI3ODY2NDgwLjMyMjY0OTA4MDIwNTg3NzU2NCAtPiAtMC4wMDQ0MTY1MDY4NjU0NTg0MTUyNzUxODIxMjAwMzgzOTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzAyMSBkaXZpZGVpbnQgMjQ3OTEzMDEwNjAuMzc5MzgzNjA1Njc3NzU1MDY5NzMgLTU2MTMzMjc4NjY0ODAuMzIyNjQ5MDgwMjA1ODc3NTY0IC0+IC0wCittdWx4MzAyMSBtdWx0aXBseSAyNDc5MTMwMTA2MC4zNzkzODM2MDU2Nzc3NTUwNjk3MyAtNTYxMzMyNzg2NjQ4MC4zMjI2NDkwODAyMDU4Nzc1NjQgLT4gLTEzOTE2MTcwMTA4ODUzMDc2NTkyNTEyMC44NDA4ODUyIEluZXhhY3QgUm91bmRlZAorcG93eDMwMjEgcG93ZXIgMjQ3OTEzMDEwNjAuMzc5MzgzNjA1Njc3NzU1MDY5NzMgLTYgLT4gNC4zMDcyODk3MTIzNzU2NzMwMjg5OTYxMjYyNDk2NTZFLTYzIEluZXhhY3QgUm91bmRlZAorcmVteDMwMjEgcmVtYWluZGVyIDI0NzkxMzAxMDYwLjM3OTM4MzYwNTY3Nzc1NTA2OTczIC01NjEzMzI3ODY2NDgwLjMyMjY0OTA4MDIwNTg3NzU2NCAtPiAyNDc5MTMwMTA2MC4zNzkzODM2MDU2Nzc3NTUwNjk3Mworc3VieDMwMjEgc3VidHJhY3QgMjQ3OTEzMDEwNjAuMzc5MzgzNjA1Njc3NzU1MDY5NzMgLTU2MTMzMjc4NjY0ODAuMzIyNjQ5MDgwMjA1ODc3NTY0IC0+IDU2MzgxMTkxNjc1NDAuNzAyMDMyNjg1ODgzNjMyNjM0IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMjIgYWRkIC05MzA3MTE0NDMuOTQ3NDc4MTU4NjE2MjkxMDc3NjEzOSAtNzQwLjM4NjA5NzkyOTI3NzU0NzI2MjI3OTgzNDgwMzAgLT4gLTkzMDcxMjE4NC4zMzM1NzYwODc4OTM4MzgzMzk4OTM3IEluZXhhY3QgUm91bmRlZAorY29teDMwMjIgY29tcGFyZSAtOTMwNzExNDQzLjk0NzQ3ODE1ODYxNjI5MTA3NzYxMzkgLTc0MC4zODYwOTc5MjkyNzc1NDcyNjIyNzk4MzQ4MDMwIC0+IC0xCitkaXZ4MzAyMiBkaXZpZGUgLTkzMDcxMTQ0My45NDc0NzgxNTg2MTYyOTEwNzc2MTM5IC03NDAuMzg2MDk3OTI5Mjc3NTQ3MjYyMjc5ODM0ODAzMCAtPiAxMjU3MDYyLjI5MDI3MDU4MzUwNzEzMTYwMjk1ODc5OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDIyIGRpdmlkZWludCAtOTMwNzExNDQzLjk0NzQ3ODE1ODYxNjI5MTA3NzYxMzkgLTc0MC4zODYwOTc5MjkyNzc1NDcyNjIyNzk4MzQ4MDMwIC0+IDEyNTcwNjIKK211bHgzMDIyIG11bHRpcGx5IC05MzA3MTE0NDMuOTQ3NDc4MTU4NjE2MjkxMDc3NjEzOSAtNzQwLjM4NjA5NzkyOTI3NzU0NzI2MjI3OTgzNDgwMzAgLT4gNjg5MDg1ODE0MjgyLjM5Njg3NDY5MTExMDAxNTQxMzMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAyMiBwb3dlciAtOTMwNzExNDQzLjk0NzQ3ODE1ODYxNjI5MTA3NzYxMzkgLTc0MCAtPiAxLjE5MzYwMzM5NDE2NTA1MTg5OTk5NzIyNjk5NTE3OEUtNjYzNyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDIyIHJlbWFpbmRlciAtOTMwNzExNDQzLjk0NzQ3ODE1ODYxNjI5MTA3NzYxMzkgLTc0MC4zODYwOTc5MjkyNzc1NDcyNjIyNzk4MzQ4MDMwIC0+IC0yMTQuOTEyMzA0NjY2NDk5Njc1MDYzOTE2NzcxMjE0MAorc3VieDMwMjIgc3VidHJhY3QgLTkzMDcxMTQ0My45NDc0NzgxNTg2MTYyOTEwNzc2MTM5IC03NDAuMzg2MDk3OTI5Mjc3NTQ3MjYyMjc5ODM0ODAzMCAtPiAtOTMwNzEwNzAzLjU2MTM4MDIyOTMzODc0MzgxNTMzNDEgSW5leGFjdCBSb3VuZGVkCithZGR4MzAyMyBhZGQgMjM1ODI3NjQyODc2NS4wNjQxOTEwODI3NzMzODU1MzkgMjE0LjM1ODk3OTYwODIzMjg2NjU4Nzg2MDIzMDQ0NjkgLT4gMjM1ODI3NjQyODk3OS40MjMxNzA2OTEwMDYyNTIxMjcgSW5leGFjdCBSb3VuZGVkCitjb214MzAyMyBjb21wYXJlIDIzNTgyNzY0Mjg3NjUuMDY0MTkxMDgyNzczMzg1NTM5IDIxNC4zNTg5Nzk2MDgyMzI4NjY1ODc4NjAyMzA0NDY5IC0+IDEKK2RpdngzMDIzIGRpdmlkZSAyMzU4Mjc2NDI4NzY1LjA2NDE5MTA4Mjc3MzM4NTUzOSAyMTQuMzU4OTc5NjA4MjMyODY2NTg3ODYwMjMwNDQ2OSAtPiAxMTAwMTUyODUyNS4wNzA4OTUwMjE1MjczNjQ4OTQ3MyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDIzIGRpdmlkZWludCAyMzU4Mjc2NDI4NzY1LjA2NDE5MTA4Mjc3MzM4NTUzOSAyMTQuMzU4OTc5NjA4MjMyODY2NTg3ODYwMjMwNDQ2OSAtPiAxMTAwMTUyODUyNQorbXVseDMwMjMgbXVsdGlwbHkgMjM1ODI3NjQyODc2NS4wNjQxOTEwODI3NzMzODU1MzkgMjE0LjM1ODk3OTYwODIzMjg2NjU4Nzg2MDIzMDQ0NjkgLT4gNTA1NTE3NzI4OTA0MjI2LjYyMzM0NDMyMDk2NTkwMDEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAyMyBwb3dlciAyMzU4Mjc2NDI4NzY1LjA2NDE5MTA4Mjc3MzM4NTUzOSAyMTQgLT4gNS40MzU4NTY0ODA3ODI4NTAwODA3NDEyNzY5MzkyNTZFKzI2NDcgSW5leGFjdCBSb3VuZGVkCityZW14MzAyMyByZW1haW5kZXIgMjM1ODI3NjQyODc2NS4wNjQxOTEwODI3NzMzODU1MzkgMjE0LjM1ODk3OTYwODIzMjg2NjU4Nzg2MDIzMDQ0NjkgLT4gMTUuMTk2OTg0NDczOTA5NjQxNTY0MzU2MTUyMTc3NQorc3VieDMwMjMgc3VidHJhY3QgMjM1ODI3NjQyODc2NS4wNjQxOTEwODI3NzMzODU1MzkgMjE0LjM1ODk3OTYwODIzMjg2NjU4Nzg2MDIzMDQ0NjkgLT4gMjM1ODI3NjQyODU1MC43MDUyMTE0NzQ1NDA1MTg5NTEgSW5leGFjdCBSb3VuZGVkCithZGR4MzAyNCBhZGQgLTMuODY4NzQ0NDQ5Nzk1NjUzNjUxNjM4MzA4OTI2OTg3RSs3NTAgODI3MC40NzI0OTI5NjU1NTk4NzIzODQwMTgzMjk0MTggLT4gLTMuODY4NzQ0NDQ5Nzk1NjUzNjUxNjM4MzA4OTI2OTg3RSs3NTAgSW5leGFjdCBSb3VuZGVkCitjb214MzAyNCBjb21wYXJlIC0zLjg2ODc0NDQ0OTc5NTY1MzY1MTYzODMwODkyNjk4N0UrNzUwIDgyNzAuNDcyNDkyOTY1NTU5ODcyMzg0MDE4MzI5NDE4IC0+IC0xCitkaXZ4MzAyNCBkaXZpZGUgLTMuODY4NzQ0NDQ5Nzk1NjUzNjUxNjM4MzA4OTI2OTg3RSs3NTAgODI3MC40NzI0OTI5NjU1NTk4NzIzODQwMTgzMjk0MTggLT4gLTQuNjc3Nzc5MjM1ODEyOTU5MjMzMDkyNzM5NDMzNDUzRSs3NDYgSW5leGFjdCBSb3VuZGVkCitkdml4MzAyNCBkaXZpZGVpbnQgLTMuODY4NzQ0NDQ5Nzk1NjUzNjUxNjM4MzA4OTI2OTg3RSs3NTAgODI3MC40NzI0OTI5NjU1NTk4NzIzODQwMTgzMjk0MTggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDI0IG11bHRpcGx5IC0zLjg2ODc0NDQ0OTc5NTY1MzY1MTYzODMwODkyNjk4N0UrNzUwIDgyNzAuNDcyNDkyOTY1NTU5ODcyMzg0MDE4MzI5NDE4IC0+IC0zLjE5OTYzNDQ1NTQzNDgxMzI5NDQyNjUwNTUyNjA2M0UrNzU0IEluZXhhY3QgUm91bmRlZAorcG93eDMwMjQgcG93ZXIgLTMuODY4NzQ0NDQ5Nzk1NjUzNjUxNjM4MzA4OTI2OTg3RSs3NTAgODI3MCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDI0IHJlbWFpbmRlciAtMy44Njg3NDQ0NDk3OTU2NTM2NTE2MzgzMDg5MjY5ODdFKzc1MCA4MjcwLjQ3MjQ5Mjk2NTU1OTg3MjM4NDAxODMyOTQxOCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwMjQgc3VidHJhY3QgLTMuODY4NzQ0NDQ5Nzk1NjUzNjUxNjM4MzA4OTI2OTg3RSs3NTAgODI3MC40NzI0OTI5NjU1NTk4NzIzODQwMTgzMjk0MTggLT4gLTMuODY4NzQ0NDQ5Nzk1NjUzNjUxNjM4MzA4OTI2OTg3RSs3NTAgSW5leGFjdCBSb3VuZGVkCithZGR4MzAyNSBhZGQgMTQwNDIyMDY5LjU4NjMyNDY0OTAxODAyMDY4MTQzNzRFLTQ0NyAtNTY3MTk1NjUyNTg2LjI0NTQyMTcwNjkwMDMxODY0ODcgLT4gLTU2NzE5NTY1MjU4Ni4yNDU0MjE3MDY5MDAzMTg2NDg3IEluZXhhY3QgUm91bmRlZAorY29teDMwMjUgY29tcGFyZSAxNDA0MjIwNjkuNTg2MzI0NjQ5MDE4MDIwNjgxNDM3NEUtNDQ3IC01NjcxOTU2NTI1ODYuMjQ1NDIxNzA2OTAwMzE4NjQ4NyAtPiAxCitkaXZ4MzAyNSBkaXZpZGUgMTQwNDIyMDY5LjU4NjMyNDY0OTAxODAyMDY4MTQzNzRFLTQ0NyAtNTY3MTk1NjUyNTg2LjI0NTQyMTcwNjkwMDMxODY0ODcgLT4gLTIuNDc1NzI1NDIxMTMxODY2ODUxMTkwNjQwMjAzNjMzRS00NTEgSW5leGFjdCBSb3VuZGVkCitkdml4MzAyNSBkaXZpZGVpbnQgMTQwNDIyMDY5LjU4NjMyNDY0OTAxODAyMDY4MTQzNzRFLTQ0NyAtNTY3MTk1NjUyNTg2LjI0NTQyMTcwNjkwMDMxODY0ODcgLT4gLTAKK211bHgzMDI1IG11bHRpcGx5IDE0MDQyMjA2OS41ODYzMjQ2NDkwMTgwMjA2ODE0Mzc0RS00NDcgLTU2NzE5NTY1MjU4Ni4yNDU0MjE3MDY5MDAzMTg2NDg3IC0+IC03Ljk2NDY3ODczOTY1MjY1NzQ5ODUwMzc5OTU1OTk1MEUtNDI4IEluZXhhY3QgUm91bmRlZAorcG93eDMwMjUgcG93ZXIgMTQwNDIyMDY5LjU4NjMyNDY0OTAxODAyMDY4MTQzNzRFLTQ0NyAtNiAtPiAxLjMwNDMzMDg5OTczMTk4ODM5NTQ3MzU3ODQyNTg1NEUrMjYzMyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDI1IHJlbWFpbmRlciAxNDA0MjIwNjkuNTg2MzI0NjQ5MDE4MDIwNjgxNDM3NEUtNDQ3IC01NjcxOTU2NTI1ODYuMjQ1NDIxNzA2OTAwMzE4NjQ4NyAtPiAxLjQwNDIyMDY5NTg2MzI0NjQ5MDE4MDIwNjgxNDM3NEUtNDM5CitzdWJ4MzAyNSBzdWJ0cmFjdCAxNDA0MjIwNjkuNTg2MzI0NjQ5MDE4MDIwNjgxNDM3NEUtNDQ3IC01NjcxOTU2NTI1ODYuMjQ1NDIxNzA2OTAwMzE4NjQ4NyAtPiA1NjcxOTU2NTI1ODYuMjQ1NDIxNzA2OTAwMzE4NjQ4NyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDI2IGFkZCA3NTkyOTA5NjQ3NS42MzQ1MDQyNTMzOTQ3MjU1OTY0NkUrMTUzIC0wOTQ1MjYwMTkzLjUwMzgwMzUxOTU3MjYwNDE1MTI5MEUrNDU5IC0+IC05LjQ1MjYwMTkzNTAzODAzNTE5NTcyNjA0MTUxMjkwMEUrNDY3IEluZXhhY3QgUm91bmRlZAorY29teDMwMjYgY29tcGFyZSA3NTkyOTA5NjQ3NS42MzQ1MDQyNTMzOTQ3MjU1OTY0NkUrMTUzIC0wOTQ1MjYwMTkzLjUwMzgwMzUxOTU3MjYwNDE1MTI5MEUrNDU5IC0+IDEKK2RpdngzMDI2IGRpdmlkZSA3NTkyOTA5NjQ3NS42MzQ1MDQyNTMzOTQ3MjU1OTY0NkUrMTUzIC0wOTQ1MjYwMTkzLjUwMzgwMzUxOTU3MjYwNDE1MTI5MEUrNDU5IC0+IC04LjAzMjYxMzM0Nzg4NTQ2NTgwNTYxMzI2NTYwNDk3M0UtMzA1IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMjYgZGl2aWRlaW50IDc1OTI5MDk2NDc1LjYzNDUwNDI1MzM5NDcyNTU5NjQ2RSsxNTMgLTA5NDUyNjAxOTMuNTAzODAzNTE5NTcyNjA0MTUxMjkwRSs0NTkgLT4gLTAKK211bHgzMDI2IG11bHRpcGx5IDc1OTI5MDk2NDc1LjYzNDUwNDI1MzM5NDcyNTU5NjQ2RSsxNTMgLTA5NDUyNjAxOTMuNTAzODAzNTE5NTcyNjA0MTUxMjkwRSs0NTkgLT4gLTcuMTc3Mjc1MjQyNzEyNzIzNzMzMDQxNTY5NjA2ODgyRSs2MzEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAyNiBwb3dlciA3NTkyOTA5NjQ3NS42MzQ1MDQyNTMzOTQ3MjU1OTY0NkUrMTUzIC05IC0+IDEuMTkyMTM2Mjk5NjU3MTc3MzI0MDUxNDc3Mzc1NTYxRS0xNDc1IEluZXhhY3QgUm91bmRlZAorcmVteDMwMjYgcmVtYWluZGVyIDc1OTI5MDk2NDc1LjYzNDUwNDI1MzM5NDcyNTU5NjQ2RSsxNTMgLTA5NDUyNjAxOTMuNTAzODAzNTE5NTcyNjA0MTUxMjkwRSs0NTkgLT4gNy41OTI5MDk2NDc1NjM0NTA0MjUzMzk0NzI1NTk2NDZFKzE2Mworc3VieDMwMjYgc3VidHJhY3QgNzU5MjkwOTY0NzUuNjM0NTA0MjUzMzk0NzI1NTk2NDZFKzE1MyAtMDk0NTI2MDE5My41MDM4MDM1MTk1NzI2MDQxNTEyOTBFKzQ1OSAtPiA5LjQ1MjYwMTkzNTAzODAzNTE5NTcyNjA0MTUxMjkwMEUrNDY3IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMjcgYWRkIDYzMTIzMTgzMDkuMTQyMDQ0OTUzMzU3NDYwNDYzNzMyIC01NjQxMzE3ODIzLjIwMjI3NDA4Mzk4MjQ4NzU1ODUxNEUrNjI4IC0+IC01LjY0MTMxNzgyMzIwMjI3NDA4Mzk4MjQ4NzU1ODUxNEUrNjM3IEluZXhhY3QgUm91bmRlZAorY29teDMwMjcgY29tcGFyZSA2MzEyMzE4MzA5LjE0MjA0NDk1MzM1NzQ2MDQ2MzczMiAtNTY0MTMxNzgyMy4yMDIyNzQwODM5ODI0ODc1NTg1MTRFKzYyOCAtPiAxCitkaXZ4MzAyNyBkaXZpZGUgNjMxMjMxODMwOS4xNDIwNDQ5NTMzNTc0NjA0NjM3MzIgLTU2NDEzMTc4MjMuMjAyMjc0MDgzOTgyNDg3NTU4NTE0RSs2MjggLT4gLTEuMTE4OTQzOTI1MzMyNDgxOTQ0NzY1ODA5NjgyNTAyRS02MjggSW5leGFjdCBSb3VuZGVkCitkdml4MzAyNyBkaXZpZGVpbnQgNjMxMjMxODMwOS4xNDIwNDQ5NTMzNTc0NjA0NjM3MzIgLTU2NDEzMTc4MjMuMjAyMjc0MDgzOTgyNDg3NTU4NTE0RSs2MjggLT4gLTAKK211bHgzMDI3IG11bHRpcGx5IDYzMTIzMTgzMDkuMTQyMDQ0OTUzMzU3NDYwNDYzNzMyIC01NjQxMzE3ODIzLjIwMjI3NDA4Mzk4MjQ4NzU1ODUxNEUrNjI4IC0+IC0zLjU2MDk3OTM3ODMwODkwNjA0Mzc4MzAyMzcyNjc4N0UrNjQ3IEluZXhhY3QgUm91bmRlZAorcG93eDMwMjcgcG93ZXIgNjMxMjMxODMwOS4xNDIwNDQ5NTMzNTc0NjA0NjM3MzIgLTYgLT4gMS41ODA3NjI2MTE1MTI3ODc3MjAwNzY1MzM3NDcyNjVFLTU5IEluZXhhY3QgUm91bmRlZAorcmVteDMwMjcgcmVtYWluZGVyIDYzMTIzMTgzMDkuMTQyMDQ0OTUzMzU3NDYwNDYzNzMyIC01NjQxMzE3ODIzLjIwMjI3NDA4Mzk4MjQ4NzU1ODUxNEUrNjI4IC0+IDYzMTIzMTgzMDkuMTQyMDQ0OTUzMzU3NDYwNDYzNzMyCitzdWJ4MzAyNyBzdWJ0cmFjdCA2MzEyMzE4MzA5LjE0MjA0NDk1MzM1NzQ2MDQ2MzczMiAtNTY0MTMxNzgyMy4yMDIyNzQwODM5ODI0ODc1NTg1MTRFKzYyOCAtPiA1LjY0MTMxNzgyMzIwMjI3NDA4Mzk4MjQ4NzU1ODUxNEUrNjM3IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMjggYWRkIDkzNzkzNjUyNDI4MTAwLjUyMTA1OTI4MjM5NDY5OTM3IDkxNy4yNTcxMzEzMTA5NzMwNDMzMzY5NTk0OTM2NDE2RS03MTIgLT4gOTM3OTM2NTI0MjgxMDAuNTIxMDU5MjgyMzk0Njk5MzcgSW5leGFjdCBSb3VuZGVkCitjb214MzAyOCBjb21wYXJlIDkzNzkzNjUyNDI4MTAwLjUyMTA1OTI4MjM5NDY5OTM3IDkxNy4yNTcxMzEzMTA5NzMwNDMzMzY5NTk0OTM2NDE2RS03MTIgLT4gMQorZGl2eDMwMjggZGl2aWRlIDkzNzkzNjUyNDI4MTAwLjUyMTA1OTI4MjM5NDY5OTM3IDkxNy4yNTcxMzEzMTA5NzMwNDMzMzY5NTk0OTM2NDE2RS03MTIgLT4gMS4wMjI1NDQ4MTU2OTQ2NzQ5NzI1NTk5MjQ5OTcyNTZFKzcyMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDI4IGRpdmlkZWludCA5Mzc5MzY1MjQyODEwMC41MjEwNTkyODIzOTQ2OTkzNyA5MTcuMjU3MTMxMzEwOTczMDQzMzM2OTU5NDkzNjQxNkUtNzEyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzAyOCBtdWx0aXBseSA5Mzc5MzY1MjQyODEwMC41MjEwNTkyODIzOTQ2OTkzNyA5MTcuMjU3MTMxMzEwOTczMDQzMzM2OTU5NDkzNjQxNkUtNzEyIC0+IDguNjAzMjg5NjU2MTM3Nzk2NTI2NzY5Nzg2OTY1MzQxRS02OTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAyOCBwb3dlciA5Mzc5MzY1MjQyODEwMC41MjEwNTkyODIzOTQ2OTkzNyA5IC0+IDUuNjE3NzMyMjA2NjYzMTM2NjU0MTg3MjYzOTY0MzY1RSsxMjUgSW5leGFjdCBSb3VuZGVkCityZW14MzAyOCByZW1haW5kZXIgOTM3OTM2NTI0MjgxMDAuNTIxMDU5MjgyMzk0Njk5MzcgOTE3LjI1NzEzMTMxMDk3MzA0MzMzNjk1OTQ5MzY0MTZFLTcxMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwMjggc3VidHJhY3QgOTM3OTM2NTI0MjgxMDAuNTIxMDU5MjgyMzk0Njk5MzcgOTE3LjI1NzEzMTMxMDk3MzA0MzMzNjk1OTQ5MzY0MTZFLTcxMiAtPiA5Mzc5MzY1MjQyODEwMC41MjEwNTkyODIzOTQ2OTkzNyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDI5IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMTUgSW5leGFjdCBSb3VuZGVkCitjb214MzAyOSBjb21wYXJlIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiAxCitkaXZ4MzAyOSBkaXZpZGUgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IC00MTAzOTY4LjEwNjMzNjcxMDEyNjI0MTI2NjY4NTQzNCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDI5IGRpdmlkZWludCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gLTQxMDM5NjgKK211bHgzMDI5IG11bHRpcGx5IDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiAtMjM2MjczMjAyMzIzNTExMi4zNzU5NjA1MjgzMDQ5NzQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAyOSBwb3dlciA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQgLT4gMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwMjkgcmVtYWluZGVyIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiAyNTUxLjQ1ODI0MzE2MTI1NTg4NDkzMjQ5MjQ2Nzg0CitzdWJ4MzAyOSBzdWJ0cmFjdCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzEyMjIxNTQuNzA4Mzc4MTE1MTg0MDk0MzUwMDUgSW5leGFjdCBSb3VuZGVkCithZGR4MzAzMCBhZGQgMzI5MzI2NTUyLjAyMDgzOTgwMDIyNTA4MzY1OTIwNDMgLTAyNDUxLjEwMDY1Mzk3MDEwNTkxNTQ2MDQxMDM0MDQxIC0+IDMyOTMyNDEwMC45MjAxODU4MzAxMTkxNjgxOTg3OTQwIEluZXhhY3QgUm91bmRlZAorY29teDMwMzAgY29tcGFyZSAzMjkzMjY1NTIuMDIwODM5ODAwMjI1MDgzNjU5MjA0MyAtMDI0NTEuMTAwNjUzOTcwMTA1OTE1NDYwNDEwMzQwNDEgLT4gMQorZGl2eDMwMzAgZGl2aWRlIDMyOTMyNjU1Mi4wMjA4Mzk4MDAyMjUwODM2NTkyMDQzIC0wMjQ1MS4xMDA2NTM5NzAxMDU5MTU0NjA0MTAzNDA0MSAtPiAtMTM0MzU4LjY0MDY3MzI5MTcxNzM3MzkxODc0MjE5NzggSW5leGFjdCBSb3VuZGVkCitkdml4MzAzMCBkaXZpZGVpbnQgMzI5MzI2NTUyLjAyMDgzOTgwMDIyNTA4MzY1OTIwNDMgLTAyNDUxLjEwMDY1Mzk3MDEwNTkxNTQ2MDQxMDM0MDQxIC0+IC0xMzQzNTgKK211bHgzMDMwIG11bHRpcGx5IDMyOTMyNjU1Mi4wMjA4Mzk4MDAyMjUwODM2NTkyMDQzIC0wMjQ1MS4xMDA2NTM5NzAxMDU5MTU0NjA0MTAzNDA0MSAtPiAtODA3MjEyNTI3MDI4LjAwMDU0MDE3MzY4OTM0NzQ0MzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAzMCBwb3dlciAzMjkzMjY1NTIuMDIwODM5ODAwMjI1MDgzNjU5MjA0MyAtMjQ1MSAtPiAwRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzAzMCByZW1haW5kZXIgMzI5MzI2NTUyLjAyMDgzOTgwMDIyNTA4MzY1OTIwNDMgLTAyNDUxLjEwMDY1Mzk3MDEwNTkxNTQ2MDQxMDM0MDQxIC0+IDE1NzAuMzU0NzI0MzA5NjM1NjUzODQ2Njg3NDkzMjIKK3N1YngzMDMwIHN1YnRyYWN0IDMyOTMyNjU1Mi4wMjA4Mzk4MDAyMjUwODM2NTkyMDQzIC0wMjQ1MS4xMDA2NTM5NzAxMDU5MTU0NjA0MTAzNDA0MSAtPiAzMjkzMjkwMDMuMTIxNDkzNzcwMzMwOTk5MTE5NjE0NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDMxIGFkZCAtOTI5ODAuNjg0MzEzNzEwOTAzNTQ0MzU3NjMyMTg0MzkgLTIyODIxNzg1MDcwNDYwMTk3MjE5MjU4MDA5OTcwNjUgLT4gLTIyODIxNzg1MDcwNDYwMTk3MjE5MjU4MDEwOTAwNDYgSW5leGFjdCBSb3VuZGVkCitjb214MzAzMSBjb21wYXJlIC05Mjk4MC42ODQzMTM3MTA5MDM1NDQzNTc2MzIxODQzOSAtMjI4MjE3ODUwNzA0NjAxOTcyMTkyNTgwMDk5NzA2NSAtPiAxCitkaXZ4MzAzMSBkaXZpZGUgLTkyOTgwLjY4NDMxMzcxMDkwMzU0NDM1NzYzMjE4NDM5IC0yMjgyMTc4NTA3MDQ2MDE5NzIxOTI1ODAwOTk3MDY1IC0+IDQuMDc0MjA3MzQyOTY4MTk2ODYzMDcwNDk2OTk0NDU3RS0yNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDMxIGRpdmlkZWludCAtOTI5ODAuNjg0MzEzNzEwOTAzNTQ0MzU3NjMyMTg0MzkgLTIyODIxNzg1MDcwNDYwMTk3MjE5MjU4MDA5OTcwNjUgLT4gMAorbXVseDMwMzEgbXVsdGlwbHkgLTkyOTgwLjY4NDMxMzcxMDkwMzU0NDM1NzYzMjE4NDM5IC0yMjgyMTc4NTA3MDQ2MDE5NzIxOTI1ODAwOTk3MDY1IC0+IDIuMTIxOTg1MTkzMTExODIwMTQ3MTcwNzA3NzE3OTM4RSszNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDMxIHBvd2VyIC05Mjk4MC42ODQzMTM3MTA5MDM1NDQzNTc2MzIxODQzOSAtMiAtPiAxLjE1NjY4MzQ1NTM3MTkwOTc5Mzg3MDIwNzE4NDMzN0UtMTAgSW5leGFjdCBSb3VuZGVkCityZW14MzAzMSByZW1haW5kZXIgLTkyOTgwLjY4NDMxMzcxMDkwMzU0NDM1NzYzMjE4NDM5IC0yMjgyMTc4NTA3MDQ2MDE5NzIxOTI1ODAwOTk3MDY1IC0+IC05Mjk4MC42ODQzMTM3MTA5MDM1NDQzNTc2MzIxODQzOQorc3VieDMwMzEgc3VidHJhY3QgLTkyOTgwLjY4NDMxMzcxMDkwMzU0NDM1NzYzMjE4NDM5IC0yMjgyMTc4NTA3MDQ2MDE5NzIxOTI1ODAwOTk3MDY1IC0+IDIyODIxNzg1MDcwNDYwMTk3MjE5MjU4MDA5MDQwODQgSW5leGFjdCBSb3VuZGVkCithZGR4MzAzMiBhZGQgMTIxMzU4MTc3NjIuMjc4NTg2MDYyNTk4MjIyNTY5ODdFKzczOCA5OC4zNTY0OTE2Nzg3MjM1NjEzMjI0OTU2MTAyMTkxMEUtOTAyIC0+IDEuMjEzNTgxNzc2MjI3ODU4NjA2MjU5ODIyMjU2OTg3RSs3NDggSW5leGFjdCBSb3VuZGVkCitjb214MzAzMiBjb21wYXJlIDEyMTM1ODE3NzYyLjI3ODU4NjA2MjU5ODIyMjU2OTg3RSs3MzggOTguMzU2NDkxNjc4NzIzNTYxMzIyNDk1NjEwMjE5MTBFLTkwMiAtPiAxCitkaXZ4MzAzMiBkaXZpZGUgMTIxMzU4MTc3NjIuMjc4NTg2MDYyNTk4MjIyNTY5ODdFKzczOCA5OC4zNTY0OTE2Nzg3MjM1NjEzMjI0OTU2MTAyMTkxMEUtOTAyIC0+IDEuMjMzODYwMzc0MTQ5OTQ1NTYxODg2OTU1Mzk4NzI0RSsxNjQ4IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMzIgZGl2aWRlaW50IDEyMTM1ODE3NzYyLjI3ODU4NjA2MjU5ODIyMjU2OTg3RSs3MzggOTguMzU2NDkxNjc4NzIzNTYxMzIyNDk1NjEwMjE5MTBFLTkwMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMwMzIgbXVsdGlwbHkgMTIxMzU4MTc3NjIuMjc4NTg2MDYyNTk4MjIyNTY5ODdFKzczOCA5OC4zNTY0OTE2Nzg3MjM1NjEzMjI0OTU2MTAyMTkxMEUtOTAyIC0+IDEuMTkzNjM2NDU4NzUwMDU5MzQwNzMzMTg4ODc2MDE1RS0xNTIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAzMiBwb3dlciAxMjEzNTgxNzc2Mi4yNzg1ODYwNjI1OTgyMjI1Njk4N0UrNzM4IDEwIC0+IDYuOTI5MzE3NTIwNTc3NDM3NzIwNDU3NTE3NDk5OTM2RSs3NDgwIEluZXhhY3QgUm91bmRlZAorcmVteDMwMzIgcmVtYWluZGVyIDEyMTM1ODE3NzYyLjI3ODU4NjA2MjU5ODIyMjU2OTg3RSs3MzggOTguMzU2NDkxNjc4NzIzNTYxMzIyNDk1NjEwMjE5MTBFLTkwMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwMzIgc3VidHJhY3QgMTIxMzU4MTc3NjIuMjc4NTg2MDYyNTk4MjIyNTY5ODdFKzczOCA5OC4zNTY0OTE2Nzg3MjM1NjEzMjI0OTU2MTAyMTkxMEUtOTAyIC0+IDEuMjEzNTgxNzc2MjI3ODU4NjA2MjU5ODIyMjU2OTg3RSs3NDggSW5leGFjdCBSb3VuZGVkCithZGR4MzAzMyBhZGQgMzcuMjc0NTc1Nzg3OTM1MjExNjY4MDk3MzkxNDAwODEgLTM5MjU1MC40NzkwMDk1MDM1OTc5OTk4MzU1NTY5OTE2IC0+IC0zOTI1MTMuMjA0NDMzNzE1NjYyNzg4MTY3NDU5NjAwMiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDMzIGNvbXBhcmUgMzcuMjc0NTc1Nzg3OTM1MjExNjY4MDk3MzkxNDAwODEgLTM5MjU1MC40NzkwMDk1MDM1OTc5OTk4MzU1NTY5OTE2IC0+IDEKK2RpdngzMDMzIGRpdmlkZSAzNy4yNzQ1NzU3ODc5MzUyMTE2NjgwOTczOTE0MDA4MSAtMzkyNTUwLjQ3OTAwOTUwMzU5Nzk5OTgzNTU1Njk5MTYgLT4gLTAuMDAwMDk0OTU0ODYwMDI3MTQyNjQ2NDExNzcyMTEwNjIxOTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzAzMyBkaXZpZGVpbnQgMzcuMjc0NTc1Nzg3OTM1MjExNjY4MDk3MzkxNDAwODEgLTM5MjU1MC40NzkwMDk1MDM1OTc5OTk4MzU1NTY5OTE2IC0+IC0wCittdWx4MzAzMyBtdWx0aXBseSAzNy4yNzQ1NzU3ODc5MzUyMTE2NjgwOTczOTE0MDA4MSAtMzkyNTUwLjQ3OTAwOTUwMzU5Nzk5OTgzNTU1Njk5MTYgLT4gLTE0NjMyMTUyLjU4MDQzMDAxMjM0NTE4MDk1OTk3MTQwIEluZXhhY3QgUm91bmRlZAorcG93eDMwMzMgcG93ZXIgMzcuMjc0NTc1Nzg3OTM1MjExNjY4MDk3MzkxNDAwODEgLTM5MjU1MCAtPiAwRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzAzMyByZW1haW5kZXIgMzcuMjc0NTc1Nzg3OTM1MjExNjY4MDk3MzkxNDAwODEgLTM5MjU1MC40NzkwMDk1MDM1OTc5OTk4MzU1NTY5OTE2IC0+IDM3LjI3NDU3NTc4NzkzNTIxMTY2ODA5NzM5MTQwMDgxCitzdWJ4MzAzMyBzdWJ0cmFjdCAzNy4yNzQ1NzU3ODc5MzUyMTE2NjgwOTczOTE0MDA4MSAtMzkyNTUwLjQ3OTAwOTUwMzU5Nzk5OTgzNTU1Njk5MTYgLT4gMzkyNTg3Ljc1MzU4NTI5MTUzMzIxMTUwMzY1NDM4MzAgSW5leGFjdCBSb3VuZGVkCithZGR4MzAzNCBhZGQgLTI3ODcuOTgwNTkwMzA0MTk5ODc4NzU1MjY1MjczNzAzIDcxMTc2MzExNzkzMDUzMTkyMDgyMTAzODc1NjUzMjQgLT4gNzExNzYzMTE3OTMwNTMxOTIwODIxMDM4NzU2MjUzNiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDM0IGNvbXBhcmUgLTI3ODcuOTgwNTkwMzA0MTk5ODc4NzU1MjY1MjczNzAzIDcxMTc2MzExNzkzMDUzMTkyMDgyMTAzODc1NjUzMjQgLT4gLTEKK2RpdngzMDM0IGRpdmlkZSAtMjc4Ny45ODA1OTAzMDQxOTk4Nzg3NTUyNjUyNzM3MDMgNzExNzYzMTE3OTMwNTMxOTIwODIxMDM4NzU2NTMyNCAtPiAtMy45MTcwMDYyNjI0MzUwNjMwOTM0NzUxNDAyNTA4NzBFLTI4IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMzQgZGl2aWRlaW50IC0yNzg3Ljk4MDU5MDMwNDE5OTg3ODc1NTI2NTI3MzcwMyA3MTE3NjMxMTc5MzA1MzE5MjA4MjEwMzg3NTY1MzI0IC0+IC0wCittdWx4MzAzNCBtdWx0aXBseSAtMjc4Ny45ODA1OTAzMDQxOTk4Nzg3NTUyNjUyNzM3MDMgNzExNzYzMTE3OTMwNTMxOTIwODIxMDM4NzU2NTMyNCAtPiAtMS45ODQzODE3NTc2ODQ3MjIyMTc4MDE0MTAzMDU3MTRFKzM0IEluZXhhY3QgUm91bmRlZAorcG93eDMwMzQgcG93ZXIgLTI3ODcuOTgwNTkwMzA0MTk5ODc4NzU1MjY1MjczNzAzIDcgLT4gLTEzMDkyNjY5OTkyMzMwOTkyMjAxMjcxMzkuNDQwMDgyIEluZXhhY3QgUm91bmRlZAorcmVteDMwMzQgcmVtYWluZGVyIC0yNzg3Ljk4MDU5MDMwNDE5OTg3ODc1NTI2NTI3MzcwMyA3MTE3NjMxMTc5MzA1MzE5MjA4MjEwMzg3NTY1MzI0IC0+IC0yNzg3Ljk4MDU5MDMwNDE5OTg3ODc1NTI2NTI3MzcwMworc3VieDMwMzQgc3VidHJhY3QgLTI3ODcuOTgwNTkwMzA0MTk5ODc4NzU1MjY1MjczNzAzIDcxMTc2MzExNzkzMDUzMTkyMDgyMTAzODc1NjUzMjQgLT4gLTcxMTc2MzExNzkzMDUzMTkyMDgyMTAzODc1NjgxMTIgSW5leGFjdCBSb3VuZGVkCithZGR4MzAzNSBhZGQgLTk4OTA2MzMuODU0NjA5NDM0OTQzNTU5ODMxOTExMjc2RSs5NzEgLTE5Mzk5ODU3MjkuNDM2ODI3Nzc3MDU1Njk5MzYxMjM3IC0+IC05Ljg5MDYzMzg1NDYwOTQzNDk0MzU1OTgzMTkxMTI3NkUrOTc3IEluZXhhY3QgUm91bmRlZAorY29teDMwMzUgY29tcGFyZSAtOTg5MDYzMy44NTQ2MDk0MzQ5NDM1NTk4MzE5MTEyNzZFKzk3MSAtMTkzOTk4NTcyOS40MzY4Mjc3NzcwNTU2OTkzNjEyMzcgLT4gLTEKK2RpdngzMDM1IGRpdmlkZSAtOTg5MDYzMy44NTQ2MDk0MzQ5NDM1NTk4MzE5MTEyNzZFKzk3MSAtMTkzOTk4NTcyOS40MzY4Mjc3NzcwNTU2OTkzNjEyMzcgLT4gNS4wOTgzMDIzNzY0MjAzOTYyNjA0MDQ4MjExNTgxNThFKzk2OCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDM1IGRpdmlkZWludCAtOTg5MDYzMy44NTQ2MDk0MzQ5NDM1NTk4MzE5MTEyNzZFKzk3MSAtMTkzOTk4NTcyOS40MzY4Mjc3NzcwNTU2OTkzNjEyMzcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDM1IG11bHRpcGx5IC05ODkwNjMzLjg1NDYwOTQzNDk0MzU1OTgzMTkxMTI3NkUrOTcxIC0xOTM5OTg1NzI5LjQzNjgyNzc3NzA1NTY5OTM2MTIzNyAtPiAxLjkxODc2ODg1MzMwMjcwNjgyNTk2NDA4NzcwMjMwN0UrOTg3IEluZXhhY3QgUm91bmRlZAorcG93eDMwMzUgcG93ZXIgLTk4OTA2MzMuODU0NjA5NDM0OTQzNTU5ODMxOTExMjc2RSs5NzEgLTIgLT4gMS4wMjIyMzczNjI2Njc1OTI4Njc3Njg1MTE0ODc4MTRFLTE5NTYgSW5leGFjdCBSb3VuZGVkCityZW14MzAzNSByZW1haW5kZXIgLTk4OTA2MzMuODU0NjA5NDM0OTQzNTU5ODMxOTExMjc2RSs5NzEgLTE5Mzk5ODU3MjkuNDM2ODI3Nzc3MDU1Njk5MzYxMjM3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzAzNSBzdWJ0cmFjdCAtOTg5MDYzMy44NTQ2MDk0MzQ5NDM1NTk4MzE5MTEyNzZFKzk3MSAtMTkzOTk4NTcyOS40MzY4Mjc3NzcwNTU2OTkzNjEyMzcgLT4gLTkuODkwNjMzODU0NjA5NDM0OTQzNTU5ODMxOTExMjc2RSs5NzcgSW5leGFjdCBSb3VuZGVkCithZGR4MzAzNiBhZGQgMzk0NDU3MDMyMy4zMzExMjE3NTA2NjE5MjA0NzUxOTEgLTE3MzYwNzIyLjI4ODc4MTQ1NjQxMzk0OTYyNDg0MzY2IC0+IDM5MjcyMDk2MDEuMDQyMzQwMjk0MjQ3OTcwODUwMzQ3IEluZXhhY3QgUm91bmRlZAorY29teDMwMzYgY29tcGFyZSAzOTQ0NTcwMzIzLjMzMTEyMTc1MDY2MTkyMDQ3NTE5MSAtMTczNjA3MjIuMjg4NzgxNDU2NDEzOTQ5NjI0ODQzNjYgLT4gMQorZGl2eDMwMzYgZGl2aWRlIDM5NDQ1NzAzMjMuMzMxMTIxNzUwNjYxOTIwNDc1MTkxIC0xNzM2MDcyMi4yODg3ODE0NTY0MTM5NDk2MjQ4NDM2NiAtPiAtMjI3LjIxMjMzOTMwOTE4Mzc3MDY4Mjc3MDgxOTYxMDEgSW5leGFjdCBSb3VuZGVkCitkdml4MzAzNiBkaXZpZGVpbnQgMzk0NDU3MDMyMy4zMzExMjE3NTA2NjE5MjA0NzUxOTEgLTE3MzYwNzIyLjI4ODc4MTQ1NjQxMzk0OTYyNDg0MzY2IC0+IC0yMjcKK211bHgzMDM2IG11bHRpcGx5IDM5NDQ1NzAzMjMuMzMxMTIxNzUwNjYxOTIwNDc1MTkxIC0xNzM2MDcyMi4yODg3ODE0NTY0MTM5NDk2MjQ4NDM2NiAtPiAtNjg0ODA1ODk5MzE5MjA0ODEuNTYwMjAwNDMyMTM3NjcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAzNiBwb3dlciAzOTQ0NTcwMzIzLjMzMTEyMTc1MDY2MTkyMDQ3NTE5MSAtMTczNjA3MjIgLT4gMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwMzYgcmVtYWluZGVyIDM5NDQ1NzAzMjMuMzMxMTIxNzUwNjYxOTIwNDc1MTkxIC0xNzM2MDcyMi4yODg3ODE0NTY0MTM5NDk2MjQ4NDM2NiAtPiAzNjg2MzYzLjc3NzczMTE0NDY5NTM1NTYzNTY4MDE4CitzdWJ4MzAzNiBzdWJ0cmFjdCAzOTQ0NTcwMzIzLjMzMTEyMTc1MDY2MTkyMDQ3NTE5MSAtMTczNjA3MjIuMjg4NzgxNDU2NDEzOTQ5NjI0ODQzNjYgLT4gMzk2MTkzMTA0NS42MTk5MDMyMDcwNzU4NzAxMDAwMzUgSW5leGFjdCBSb3VuZGVkCithZGR4MzAzNyBhZGQgMTk1NDQuMTQwMTg1MDM0MjcwMjkwMDI1NTI4NzI3MDcgMTc4NjY5Nzc2Mi44ODUxNzg5OTQxODIxMzM4Mzk1NDYgLT4gMTc4NjcxNzMwNy4wMjUzNjQwMjg0NTI0MjM4NjUwNzUgSW5leGFjdCBSb3VuZGVkCitjb214MzAzNyBjb21wYXJlIDE5NTQ0LjE0MDE4NTAzNDI3MDI5MDAyNTUyODcyNzA3IDE3ODY2OTc3NjIuODg1MTc4OTk0MTgyMTMzODM5NTQ2IC0+IC0xCitkaXZ4MzAzNyBkaXZpZGUgMTk1NDQuMTQwMTg1MDM0MjcwMjkwMDI1NTI4NzI3MDcgMTc4NjY5Nzc2Mi44ODUxNzg5OTQxODIxMzM4Mzk1NDYgLT4gMC4wMDAwMTA5Mzg2OTQwNDgzMjg2Nzc1OTIzNDM1OTg3MTk5MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDM3IGRpdmlkZWludCAxOTU0NC4xNDAxODUwMzQyNzAyOTAwMjU1Mjg3MjcwNyAxNzg2Njk3NzYyLjg4NTE3ODk5NDE4MjEzMzgzOTU0NiAtPiAwCittdWx4MzAzNyBtdWx0aXBseSAxOTU0NC4xNDAxODUwMzQyNzAyOTAwMjU1Mjg3MjcwNyAxNzg2Njk3NzYyLjg4NTE3ODk5NDE4MjEzMzgzOTU0NiAtPiAzNDkxOTQ3MTU0NjExNS4wNTg5NzE2MzQ5NjE2MjI5MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDM3IHBvd2VyIDE5NTQ0LjE0MDE4NTAzNDI3MDI5MDAyNTUyODcyNzA3IDIgLT4gMzgxOTczNDE1LjU3MjI3MTQwMDkyOTg4MDI1NTc5NDAgSW5leGFjdCBSb3VuZGVkCityZW14MzAzNyByZW1haW5kZXIgMTk1NDQuMTQwMTg1MDM0MjcwMjkwMDI1NTI4NzI3MDcgMTc4NjY5Nzc2Mi44ODUxNzg5OTQxODIxMzM4Mzk1NDYgLT4gMTk1NDQuMTQwMTg1MDM0MjcwMjkwMDI1NTI4NzI3MDcKK3N1YngzMDM3IHN1YnRyYWN0IDE5NTQ0LjE0MDE4NTAzNDI3MDI5MDAyNTUyODcyNzA3IDE3ODY2OTc3NjIuODg1MTc4OTk0MTgyMTMzODM5NTQ2IC0+IC0xNzg2Njc4MjE4Ljc0NDk5Mzk1OTkxMTg0MzgxNDAxNyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDM4IGFkZCAtMDUuNzU0ODU5NTc5Mzc2MTc3NTc5ODM1MTM2NjI5ODEgNTU2NDQ3Njg3NS45ODk2NDA0MzExNzM2OTQzNzIwODMgLT4gNTU2NDQ3Njg3MC4yMzQ3ODA4NTE3OTc1MTY3OTIyNDggSW5leGFjdCBSb3VuZGVkCitjb214MzAzOCBjb21wYXJlIC0wNS43NTQ4NTk1NzkzNzYxNzc1Nzk4MzUxMzY2Mjk4MSA1NTY0NDc2ODc1Ljk4OTY0MDQzMTE3MzY5NDM3MjA4MyAtPiAtMQorZGl2eDMwMzggZGl2aWRlIC0wNS43NTQ4NTk1NzkzNzYxNzc1Nzk4MzUxMzY2Mjk4MSA1NTY0NDc2ODc1Ljk4OTY0MDQzMTE3MzY5NDM3MjA4MyAtPiAtMS4wMzQyMTM5NDQ1NjgyNzEzMjQ4NDE2MDg4MjUxMzZFLTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzAzOCBkaXZpZGVpbnQgLTA1Ljc1NDg1OTU3OTM3NjE3NzU3OTgzNTEzNjYyOTgxIDU1NjQ0NzY4NzUuOTg5NjQwNDMxMTczNjk0MzcyMDgzIC0+IC0wCittdWx4MzAzOCBtdWx0aXBseSAtMDUuNzU0ODU5NTc5Mzc2MTc3NTc5ODM1MTM2NjI5ODEgNTU2NDQ3Njg3NS45ODk2NDA0MzExNzM2OTQzNzIwODMgLT4gLTMyMDIyNzgzMDU0LjAwNjIwODc4NDM2Mzk4OTkwMTM1IEluZXhhY3QgUm91bmRlZAorcG93eDMwMzggcG93ZXIgLTA1Ljc1NDg1OTU3OTM3NjE3NzU3OTgzNTEzNjYyOTgxIDYgLT4gMzYzMjUuMjMxMTgyMjM2MTE0MjEzMDMyMzg5MDg0NzIgSW5leGFjdCBSb3VuZGVkCityZW14MzAzOCByZW1haW5kZXIgLTA1Ljc1NDg1OTU3OTM3NjE3NzU3OTgzNTEzNjYyOTgxIDU1NjQ0NzY4NzUuOTg5NjQwNDMxMTczNjk0MzcyMDgzIC0+IC01Ljc1NDg1OTU3OTM3NjE3NzU3OTgzNTEzNjYyOTgxCitzdWJ4MzAzOCBzdWJ0cmFjdCAtMDUuNzU0ODU5NTc5Mzc2MTc3NTc5ODM1MTM2NjI5ODEgNTU2NDQ3Njg3NS45ODk2NDA0MzExNzM2OTQzNzIwODMgLT4gLTU1NjQ0NzY4ODEuNzQ0NTAwMDEwNTQ5ODcxOTUxOTE4IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMzkgYWRkIC00MjA4ODIwLjg5ODcxODA2OTE5NDAwODUyNjMwMjc0NiA2MjY4ODcuNzU1Mzc3NDcwNTY3ODIwMTExMjg0NTQ2MkUrMjA2IC0+IDYuMjY4ODc3NTUzNzc0NzA1Njc4MjAxMTEyODQ1NDYyRSsyMTEgSW5leGFjdCBSb3VuZGVkCitjb214MzAzOSBjb21wYXJlIC00MjA4ODIwLjg5ODcxODA2OTE5NDAwODUyNjMwMjc0NiA2MjY4ODcuNzU1Mzc3NDcwNTY3ODIwMTExMjg0NTQ2MkUrMjA2IC0+IC0xCitkaXZ4MzAzOSBkaXZpZGUgLTQyMDg4MjAuODk4NzE4MDY5MTk0MDA4NTI2MzAyNzQ2IDYyNjg4Ny43NTUzNzc0NzA1Njc4MjAxMTEyODQ1NDYyRSsyMDYgLT4gLTYuNzEzODM0OTEzMjExNTI3MTg0OTA3NDIxODU2NDM0RS0yMDYgSW5leGFjdCBSb3VuZGVkCitkdml4MzAzOSBkaXZpZGVpbnQgLTQyMDg4MjAuODk4NzE4MDY5MTk0MDA4NTI2MzAyNzQ2IDYyNjg4Ny43NTUzNzc0NzA1Njc4MjAxMTEyODQ1NDYyRSsyMDYgLT4gLTAKK211bHgzMDM5IG11bHRpcGx5IC00MjA4ODIwLjg5ODcxODA2OTE5NDAwODUyNjMwMjc0NiA2MjY4ODcuNzU1Mzc3NDcwNTY3ODIwMTExMjg0NTQ2MkUrMjA2IC0+IC0yLjYzODQ1ODI4NTk4MzE1ODc4OTQ1ODkyNTE3MDI2N0UrMjE4IEluZXhhY3QgUm91bmRlZAorcG93eDMwMzkgcG93ZXIgLTQyMDg4MjAuODk4NzE4MDY5MTk0MDA4NTI2MzAyNzQ2IDYgLT4gNS41NTg1NjQ3ODMyOTEyNjAzNTkxNDIyMjMzMzc5OTRFKzM5IEluZXhhY3QgUm91bmRlZAorcmVteDMwMzkgcmVtYWluZGVyIC00MjA4ODIwLjg5ODcxODA2OTE5NDAwODUyNjMwMjc0NiA2MjY4ODcuNzU1Mzc3NDcwNTY3ODIwMTExMjg0NTQ2MkUrMjA2IC0+IC00MjA4ODIwLjg5ODcxODA2OTE5NDAwODUyNjMwMjc0Ngorc3VieDMwMzkgc3VidHJhY3QgLTQyMDg4MjAuODk4NzE4MDY5MTk0MDA4NTI2MzAyNzQ2IDYyNjg4Ny43NTUzNzc0NzA1Njc4MjAxMTEyODQ1NDYyRSsyMDYgLT4gLTYuMjY4ODc3NTUzNzc0NzA1Njc4MjAxMTEyODQ1NDYyRSsyMTEgSW5leGFjdCBSb3VuZGVkCithZGR4MzA0MCBhZGQgLTcwMDc3MTk1NDc4MDY2LjMwODk2OTc5MDg1ODIxMjY5RSs1NDkgNDYwNy4xNjMyNDg1NTQxNTU0ODM2ODE0MzAwMTMwNzMgLT4gLTcuMDA3NzE5NTQ3ODA2NjMwODk2OTc5MDg1ODIxMjY5RSs1NjIgSW5leGFjdCBSb3VuZGVkCitjb214MzA0MCBjb21wYXJlIC03MDA3NzE5NTQ3ODA2Ni4zMDg5Njk3OTA4NTgyMTI2OUUrNTQ5IDQ2MDcuMTYzMjQ4NTU0MTU1NDgzNjgxNDMwMDEzMDczIC0+IC0xCitkaXZ4MzA0MCBkaXZpZGUgLTcwMDc3MTk1NDc4MDY2LjMwODk2OTc5MDg1ODIxMjY5RSs1NDkgNDYwNy4xNjMyNDg1NTQxNTU0ODM2ODE0MzAwMTMwNzMgLT4gLTEuNTIxMDQ4NjczNDk4OTk3NjI3MzYwMjMwMDc4MzA2RSs1NTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzA0MCBkaXZpZGVpbnQgLTcwMDc3MTk1NDc4MDY2LjMwODk2OTc5MDg1ODIxMjY5RSs1NDkgNDYwNy4xNjMyNDg1NTQxNTU0ODM2ODE0MzAwMTMwNzMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDQwIG11bHRpcGx5IC03MDA3NzE5NTQ3ODA2Ni4zMDg5Njk3OTA4NTgyMTI2OUUrNTQ5IDQ2MDcuMTYzMjQ4NTU0MTU1NDgzNjgxNDMwMDEzMDczIC0+IC0zLjIyODU3MDc5NTY4MjkyNTUwOTQ3ODE5MTM5Nzg3OEUrNTY2IEluZXhhY3QgUm91bmRlZAorcG93eDMwNDAgcG93ZXIgLTcwMDc3MTk1NDc4MDY2LjMwODk2OTc5MDg1ODIxMjY5RSs1NDkgNDYwNyAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzA0MCByZW1haW5kZXIgLTcwMDc3MTk1NDc4MDY2LjMwODk2OTc5MDg1ODIxMjY5RSs1NDkgNDYwNy4xNjMyNDg1NTQxNTU0ODM2ODE0MzAwMTMwNzMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDQwIHN1YnRyYWN0IC03MDA3NzE5NTQ3ODA2Ni4zMDg5Njk3OTA4NTgyMTI2OUUrNTQ5IDQ2MDcuMTYzMjQ4NTU0MTU1NDgzNjgxNDMwMDEzMDczIC0+IC03LjAwNzcxOTU0NzgwNjYzMDg5Njk3OTA4NTgyMTI2OUUrNTYyIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNDEgYWRkIC00NDI5NDEuNzU0MTgxMTUyNzk0MDkxODI0NDM4MzQ1NCAtMDY4MTI2NzY4LjA1NjM1NTk4MTkxNTYzNzkxNTEwMTYgLT4gLTY4NTY5NzA5LjgxMDUzNzEzNDcwOTcyOTczOTUzOTk1IEluZXhhY3QgUm91bmRlZAorY29teDMwNDEgY29tcGFyZSAtNDQyOTQxLjc1NDE4MTE1Mjc5NDA5MTgyNDQzODM0NTQgLTA2ODEyNjc2OC4wNTYzNTU5ODE5MTU2Mzc5MTUxMDE2IC0+IDEKK2RpdngzMDQxIGRpdmlkZSAtNDQyOTQxLjc1NDE4MTE1Mjc5NDA5MTgyNDQzODM0NTQgLTA2ODEyNjc2OC4wNTYzNTU5ODE5MTU2Mzc5MTUxMDE2IC0+IDAuMDA2NTAxNzI4NTY4OTM0MDQyMTQzOTEzMTExNzY4NTU3IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNDEgZGl2aWRlaW50IC00NDI5NDEuNzU0MTgxMTUyNzk0MDkxODI0NDM4MzQ1NCAtMDY4MTI2NzY4LjA1NjM1NTk4MTkxNTYzNzkxNTEwMTYgLT4gMAorbXVseDMwNDEgbXVsdGlwbHkgLTQ0Mjk0MS43NTQxODExNTI3OTQwOTE4MjQ0MzgzNDU0IC0wNjgxMjY3NjguMDU2MzU1OTgxOTE1NjM3OTE1MTAxNiAtPiAzMDE3NjE5MDE0OTU3NC44NDM4NjM5NTk0NzU5Mzk3MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDQxIHBvd2VyIC00NDI5NDEuNzU0MTgxMTUyNzk0MDkxODI0NDM4MzQ1NCAtNjgxMjY3NjggLT4gMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwNDEgcmVtYWluZGVyIC00NDI5NDEuNzU0MTgxMTUyNzk0MDkxODI0NDM4MzQ1NCAtMDY4MTI2NzY4LjA1NjM1NTk4MTkxNTYzNzkxNTEwMTYgLT4gLTQ0Mjk0MS43NTQxODExNTI3OTQwOTE4MjQ0MzgzNDU0CitzdWJ4MzA0MSBzdWJ0cmFjdCAtNDQyOTQxLjc1NDE4MTE1Mjc5NDA5MTgyNDQzODM0NTQgLTA2ODEyNjc2OC4wNTYzNTU5ODE5MTU2Mzc5MTUxMDE2IC0+IDY3NjgzODI2LjMwMjE3NDgyOTEyMTU0NjA5MDY2MzI1IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNDIgYWRkIC0wNDA3MjY3Nzg3MTEuODY3NzYxNTYxNjcxMTY3NjE1OSAyOTk2OTEuOTQzMDM0NTI1OTE3NDYxNDk5NzA2NDkxNiAtPiAtNDA3MjY0NzkwMTkuOTI0NzI3MDM1NzUzNzA2MTE2MTkgSW5leGFjdCBSb3VuZGVkCitjb214MzA0MiBjb21wYXJlIC0wNDA3MjY3Nzg3MTEuODY3NzYxNTYxNjcxMTY3NjE1OSAyOTk2OTEuOTQzMDM0NTI1OTE3NDYxNDk5NzA2NDkxNiAtPiAtMQorZGl2eDMwNDIgZGl2aWRlIC0wNDA3MjY3Nzg3MTEuODY3NzYxNTYxNjcxMTY3NjE1OSAyOTk2OTEuOTQzMDM0NTI1OTE3NDYxNDk5NzA2NDkxNiAtPiAtMTM1ODk1LjQ3NDE5NzU2OTA4NzI1NDgyMzMxMTE4ODggSW5leGFjdCBSb3VuZGVkCitkdml4MzA0MiBkaXZpZGVpbnQgLTA0MDcyNjc3ODcxMS44Njc3NjE1NjE2NzExNjc2MTU5IDI5OTY5MS45NDMwMzQ1MjU5MTc0NjE0OTk3MDY0OTE2IC0+IC0xMzU4OTUKK211bHgzMDQyIG11bHRpcGx5IC0wNDA3MjY3Nzg3MTEuODY3NzYxNTYxNjcxMTY3NjE1OSAyOTk2OTEuOTQzMDM0NTI1OTE3NDYxNDk5NzA2NDkxNiAtPiAtMTIyMDU0ODc0NDU2OTY4MTYuMDIxNzU2NjU2MjIyNDIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA0MiBwb3dlciAtMDQwNzI2Nzc4NzExLjg2Nzc2MTU2MTY3MTE2NzYxNTkgMjk5NjkyIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMwNDIgcmVtYWluZGVyIC0wNDA3MjY3Nzg3MTEuODY3NzYxNTYxNjcxMTY3NjE1OSAyOTk2OTEuOTQzMDM0NTI1OTE3NDYxNDk5NzA2NDkxNiAtPiAtMTQyMTEzLjE5MDg2MjAwODI0MDY2NTAwMjIyNDAxODAKK3N1YngzMDQyIHN1YnRyYWN0IC0wNDA3MjY3Nzg3MTEuODY3NzYxNTYxNjcxMTY3NjE1OSAyOTk2OTEuOTQzMDM0NTI1OTE3NDYxNDk5NzA2NDkxNiAtPiAtNDA3MjcwNzg0MDMuODEwNzk2MDg3NTg4NjI5MTE1NjEgSW5leGFjdCBSb3VuZGVkCithZGR4MzA0MyBhZGQgLTE5MzQxOTc1MjAuNzM4MzY2OTEyMTc5MTQzMDg1OTU1IDMuODEwNzUxNDIyNTE1MTc4NDAwMjkzNjkzMzcxNTE5IC0+IC0xOTM0MTk3NTE2LjkyNzYxNTQ4OTY2Mzk2NDY4NTY2MSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDQzIGNvbXBhcmUgLTE5MzQxOTc1MjAuNzM4MzY2OTEyMTc5MTQzMDg1OTU1IDMuODEwNzUxNDIyNTE1MTc4NDAwMjkzNjkzMzcxNTE5IC0+IC0xCitkaXZ4MzA0MyBkaXZpZGUgLTE5MzQxOTc1MjAuNzM4MzY2OTEyMTc5MTQzMDg1OTU1IDMuODEwNzUxNDIyNTE1MTc4NDAwMjkzNjkzMzcxNTE5IC0+IC01MDc1NjMyODcuNzMxMjU2NjA3MTUzNzIzMzY5NzQ3MyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDQzIGRpdmlkZWludCAtMTkzNDE5NzUyMC43MzgzNjY5MTIxNzkxNDMwODU5NTUgMy44MTA3NTE0MjI1MTUxNzg0MDAyOTM2OTMzNzE1MTkgLT4gLTUwNzU2MzI4NworbXVseDMwNDMgbXVsdGlwbHkgLTE5MzQxOTc1MjAuNzM4MzY2OTEyMTc5MTQzMDg1OTU1IDMuODEwNzUxNDIyNTE1MTc4NDAwMjkzNjkzMzcxNTE5IC0+IC03MzcwNzQ1OTUzLjU3OTA2Mjk4NTEzMDQzODMwOTAyMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDQzIHBvd2VyIC0xOTM0MTk3NTIwLjczODM2NjkxMjE3OTE0MzA4NTk1NSA0IC0+IDEuMzk5NTk3OTIyMjc1NDAwOTQ3NDk3ODU1NTM5NDc1RSszNyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDQzIHJlbWFpbmRlciAtMTkzNDE5NzUyMC43MzgzNjY5MTIxNzkxNDMwODU5NTUgMy44MTA3NTE0MjI1MTUxNzg0MDAyOTM2OTMzNzE1MTkgLT4gLTIuNzg2NjM3MTU1OTM0Njc0MzEyOTM2NzA0MTc3MDQ3CitzdWJ4MzA0MyBzdWJ0cmFjdCAtMTkzNDE5NzUyMC43MzgzNjY5MTIxNzkxNDMwODU5NTUgMy44MTA3NTE0MjI1MTUxNzg0MDAyOTM2OTMzNzE1MTkgLT4gLTE5MzQxOTc1MjQuNTQ5MTE4MzM0Njk0MzIxNDg2MjQ5IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNDQgYWRkIDgxMzI2Mi43NzIzNTMzODMzMDM4ODI5NTU5NjQ2ODMwIC0zMDMyODQ4MjI3MTYuODI4MjE3ODEzMTExODE4NTkwNyAtPiAtMzAzMjg0MDA5NDU0LjA1NTg2NDQyOTgwNzkzNTYzNDcgSW5leGFjdCBSb3VuZGVkCitjb214MzA0NCBjb21wYXJlIDgxMzI2Mi43NzIzNTMzODMzMDM4ODI5NTU5NjQ2ODMwIC0zMDMyODQ4MjI3MTYuODI4MjE3ODEzMTExODE4NTkwNyAtPiAxCitkaXZ4MzA0NCBkaXZpZGUgODEzMjYyLjc3MjM1MzM4MzMwMzg4Mjk1NTk2NDY4MzAgLTMwMzI4NDgyMjcxNi44MjgyMTc4MTMxMTE4MTg1OTA3IC0+IC0wLjAwMDAwMjY4MTUxNDkwNDI2Nzc3MDI5NDIxMzM4MTQ4NTEwOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDQ0IGRpdmlkZWludCA4MTMyNjIuNzcyMzUzMzgzMzAzODgyOTU1OTY0NjgzMCAtMzAzMjg0ODIyNzE2LjgyODIxNzgxMzExMTgxODU5MDcgLT4gLTAKK211bHgzMDQ0IG11bHRpcGx5IDgxMzI2Mi43NzIzNTMzODMzMDM4ODI5NTU5NjQ2ODMwIC0zMDMyODQ4MjI3MTYuODI4MjE3ODEzMTExODE4NTkwNyAtPiAtMjQ2NjUwMjU1NzM1MzkyMDgwLjEzNTc0MDQyODA0MzEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA0NCBwb3dlciA4MTMyNjIuNzcyMzUzMzgzMzAzODgyOTU1OTY0NjgzMCAtMyAtPiAxLjg1OTExOTU2ODMxMDk5NzYwNTU0NTkxNDg5NTEzM0UtMTggSW5leGFjdCBSb3VuZGVkCityZW14MzA0NCByZW1haW5kZXIgODEzMjYyLjc3MjM1MzM4MzMwMzg4Mjk1NTk2NDY4MzAgLTMwMzI4NDgyMjcxNi44MjgyMTc4MTMxMTE4MTg1OTA3IC0+IDgxMzI2Mi43NzIzNTMzODMzMDM4ODI5NTU5NjQ2ODMwCitzdWJ4MzA0NCBzdWJ0cmFjdCA4MTMyNjIuNzcyMzUzMzgzMzAzODgyOTU1OTY0NjgzMCAtMzAzMjg0ODIyNzE2LjgyODIxNzgxMzExMTgxODU5MDcgLT4gMzAzMjg1NjM1OTc5LjYwMDU3MTE5NjQxNTcwMTU0NjcgSW5leGFjdCBSb3VuZGVkCithZGR4MzA0NSBhZGQgMzYxMDU5NTQ4ODQuOTQ2MjE0MzQ5NzkzNjU1ODkzMTEgNzQ1NTU4MjA1Ljc2OTIzOTc0ODEzMTMwMDU2NTk1MjNFLTk1MiAtPiAzNjEwNTk1NDg4NC45NDYyMTQzNDk3OTM2NTU4OTMxMSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDQ1IGNvbXBhcmUgMzYxMDU5NTQ4ODQuOTQ2MjE0MzQ5NzkzNjU1ODkzMTEgNzQ1NTU4MjA1Ljc2OTIzOTc0ODEzMTMwMDU2NTk1MjNFLTk1MiAtPiAxCitkaXZ4MzA0NSBkaXZpZGUgMzYxMDU5NTQ4ODQuOTQ2MjE0MzQ5NzkzNjU1ODkzMTEgNzQ1NTU4MjA1Ljc2OTIzOTc0ODEzMTMwMDU2NTk1MjNFLTk1MiAtPiA0Ljg0MjgwODMyODc4NjgwNTgyMTQxMTY3NDMwMjY4NkUrOTUzIEluZXhhY3QgUm91bmRlZAorZHZpeDMwNDUgZGl2aWRlaW50IDM2MTA1OTU0ODg0Ljk0NjIxNDM0OTc5MzY1NTg5MzExIDc0NTU1ODIwNS43NjkyMzk3NDgxMzEzMDA1NjU5NTIzRS05NTIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDQ1IG11bHRpcGx5IDM2MTA1OTU0ODg0Ljk0NjIxNDM0OTc5MzY1NTg5MzExIDc0NTU1ODIwNS43NjkyMzk3NDgxMzEzMDA1NjU5NTIzRS05NTIgLT4gMi42OTE5MDkwOTQxNjA1NjE2NzMzOTEzNTI3NDM4NjlFLTkzMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDQ1IHBvd2VyIDM2MTA1OTU0ODg0Ljk0NjIxNDM0OTc5MzY1NTg5MzExIDcgLT4gNy45OTkyOTc0NDk3MTMzMDE3MTk1ODI3MzI0NDczODZFKzczIEluZXhhY3QgUm91bmRlZAorcmVteDMwNDUgcmVtYWluZGVyIDM2MTA1OTU0ODg0Ljk0NjIxNDM0OTc5MzY1NTg5MzExIDc0NTU1ODIwNS43NjkyMzk3NDgxMzEzMDA1NjU5NTIzRS05NTIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDQ1IHN1YnRyYWN0IDM2MTA1OTU0ODg0Ljk0NjIxNDM0OTc5MzY1NTg5MzExIDc0NTU1ODIwNS43NjkyMzk3NDgxMzEzMDA1NjU5NTIzRS05NTIgLT4gMzYxMDU5NTQ4ODQuOTQ2MjE0MzQ5NzkzNjU1ODkzMTEgSW5leGFjdCBSb3VuZGVkCithZGR4MzA0NiBhZGQgLTA3NTUzNzE3NzUzOC4xODE0NTE2NjIxOTYyMTg1NDkwIDI2OTgwNzc1MjU1LjUxNTQyODU2NDgzMTIyNDg0ODk4IC0+IC00ODU1NjQwMjI4Mi42NjYwMjMwOTczNjQ5OTM3MDAwMgorY29teDMwNDYgY29tcGFyZSAtMDc1NTM3MTc3NTM4LjE4MTQ1MTY2MjE5NjIxODU0OTAgMjY5ODA3NzUyNTUuNTE1NDI4NTY0ODMxMjI0ODQ4OTggLT4gLTEKK2RpdngzMDQ2IGRpdmlkZSAtMDc1NTM3MTc3NTM4LjE4MTQ1MTY2MjE5NjIxODU0OTAgMjY5ODA3NzUyNTUuNTE1NDI4NTY0ODMxMjI0ODQ4OTggLT4gLTIuNzk5NjY2NjgyMDI5MDg5OTU2MjY5MDE4NTQxNjQ5IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNDYgZGl2aWRlaW50IC0wNzU1MzcxNzc1MzguMTgxNDUxNjYyMTk2MjE4NTQ5MCAyNjk4MDc3NTI1NS41MTU0Mjg1NjQ4MzEyMjQ4NDg5OCAtPiAtMgorbXVseDMwNDYgbXVsdGlwbHkgLTA3NTUzNzE3NzUzOC4xODE0NTE2NjIxOTYyMTg1NDkwIDI2OTgwNzc1MjU1LjUxNTQyODU2NDgzMTIyNDg0ODk4IC0+IC0yMDM4MDUxNjEwNTkzNjQxOTQ3NzE3LjI2ODY1MjE3NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDQ2IHBvd2VyIC0wNzU1MzcxNzc1MzguMTgxNDUxNjYyMTk2MjE4NTQ5MCAzIC0+IC00LjMxMDA0OTUxODk4Nzk4ODA4NDU5NTI2NDYxNzcyN0UrMzIgSW5leGFjdCBSb3VuZGVkCityZW14MzA0NiByZW1haW5kZXIgLTA3NTUzNzE3NzUzOC4xODE0NTE2NjIxOTYyMTg1NDkwIDI2OTgwNzc1MjU1LjUxNTQyODU2NDgzMTIyNDg0ODk4IC0+IC0yMTU3NTYyNzAyNy4xNTA1OTQ1MzI1MzM3Njg4NTEwNAorc3VieDMwNDYgc3VidHJhY3QgLTA3NTUzNzE3NzUzOC4xODE0NTE2NjIxOTYyMTg1NDkwIDI2OTgwNzc1MjU1LjUxNTQyODU2NDgzMTIyNDg0ODk4IC0+IC0xMDI1MTc5NTI3OTMuNjk2ODgwMjI3MDI3NDQzMzk4MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDQ3IGFkZCAtNDIyMzc2NS40MTUzMTk1NjQ4OTg4NDAwNDA2OTc2NDcgLTI1OTA1OTAzMDU0OTc0NTQxODU0NTU0NTkxNDk5MThFLTIxNSAtPiAtNDIyMzc2NS40MTUzMTk1NjQ4OTg4NDAwNDA2OTc2NDcgSW5leGFjdCBSb3VuZGVkCitjb214MzA0NyBjb21wYXJlIC00MjIzNzY1LjQxNTMxOTU2NDg5ODg0MDA0MDY5NzY0NyAtMjU5MDU5MDMwNTQ5NzQ1NDE4NTQ1NTQ1OTE0OTkxOEUtMjE1IC0+IC0xCitkaXZ4MzA0NyBkaXZpZGUgLTQyMjM3NjUuNDE1MzE5NTY0ODk4ODQwMDQwNjk3NjQ3IC0yNTkwNTkwMzA1NDk3NDU0MTg1NDU1NDU5MTQ5OTE4RS0yMTUgLT4gMS42MzA0MjU4NTU1ODgzNDczNTY1NzAwNzY5MDkwNTNFKzE5MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDQ3IGRpdmlkZWludCAtNDIyMzc2NS40MTUzMTk1NjQ4OTg4NDAwNDA2OTc2NDcgLTI1OTA1OTAzMDU0OTc0NTQxODU0NTU0NTkxNDk5MThFLTIxNSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMwNDcgbXVsdGlwbHkgLTQyMjM3NjUuNDE1MzE5NTY0ODk4ODQwMDQwNjk3NjQ3IC0yNTkwNTkwMzA1NDk3NDU0MTg1NDU1NDU5MTQ5OTE4RS0yMTUgLT4gMS4wOTQyMDQ1NzM3NjIyMjkzMDg3OTg2MDQ4NDUzOTVFLTE3OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDQ3IHBvd2VyIC00MjIzNzY1LjQxNTMxOTU2NDg5ODg0MDA0MDY5NzY0NyAtMyAtPiAtMS4zMjcwOTA3NzU4NjM2MTY5MzkzMDk1Njk3OTExMzhFLTIwIEluZXhhY3QgUm91bmRlZAorcmVteDMwNDcgcmVtYWluZGVyIC00MjIzNzY1LjQxNTMxOTU2NDg5ODg0MDA0MDY5NzY0NyAtMjU5MDU5MDMwNTQ5NzQ1NDE4NTQ1NTQ1OTE0OTkxOEUtMjE1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzA0NyBzdWJ0cmFjdCAtNDIyMzc2NS40MTUzMTk1NjQ4OTg4NDAwNDA2OTc2NDcgLTI1OTA1OTAzMDU0OTc0NTQxODU0NTU0NTkxNDk5MThFLTIxNSAtPiAtNDIyMzc2NS40MTUzMTk1NjQ4OTg4NDAwNDA2OTc2NDcgSW5leGFjdCBSb3VuZGVkCithZGR4MzA0OCBhZGQgLTY0NjguOTAzNzM4NTIyOTUxMjU5MDYzMDk5OTQ2MTk1IC03ODc3LjMyNDMxNDI3MzY5NDMxMjE2NDQwNzc5NDkzOUUrMjY3IC0+IC03Ljg3NzMyNDMxNDI3MzY5NDMxMjE2NDQwNzc5NDkzOUUrMjcwIEluZXhhY3QgUm91bmRlZAorY29teDMwNDggY29tcGFyZSAtNjQ2OC45MDM3Mzg1MjI5NTEyNTkwNjMwOTk5NDYxOTUgLTc4NzcuMzI0MzE0MjczNjk0MzEyMTY0NDA3Nzk0OTM5RSsyNjcgLT4gMQorZGl2eDMwNDggZGl2aWRlIC02NDY4LjkwMzczODUyMjk1MTI1OTA2MzA5OTk0NjE5NSAtNzg3Ny4zMjQzMTQyNzM2OTQzMTIxNjQ0MDc3OTQ5MzlFKzI2NyAtPiA4LjIxMjA1NzE0MDc3NDcwNjg3NDY2NjMwNzI0NjYyOEUtMjY4IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNDggZGl2aWRlaW50IC02NDY4LjkwMzczODUyMjk1MTI1OTA2MzA5OTk0NjE5NSAtNzg3Ny4zMjQzMTQyNzM2OTQzMTIxNjQ0MDc3OTQ5MzlFKzI2NyAtPiAwCittdWx4MzA0OCBtdWx0aXBseSAtNjQ2OC45MDM3Mzg1MjI5NTEyNTkwNjMwOTk5NDYxOTUgLTc4NzcuMzI0MzE0MjczNjk0MzEyMTY0NDA3Nzk0OTM5RSsyNjcgLT4gNS4wOTU3NjUyNzA2MTYyODQ0NTU5MjI3NDc1MzA2NzZFKzI3NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDQ4IHBvd2VyIC02NDY4LjkwMzczODUyMjk1MTI1OTA2MzA5OTk0NjE5NSAtOCAtPiAzLjI2MTAyNzcyNDk4MjA4OTI5ODAzMDM2MjM2NzYxNkUtMzEgSW5leGFjdCBSb3VuZGVkCityZW14MzA0OCByZW1haW5kZXIgLTY0NjguOTAzNzM4NTIyOTUxMjU5MDYzMDk5OTQ2MTk1IC03ODc3LjMyNDMxNDI3MzY5NDMxMjE2NDQwNzc5NDkzOUUrMjY3IC0+IC02NDY4LjkwMzczODUyMjk1MTI1OTA2MzA5OTk0NjE5NQorc3VieDMwNDggc3VidHJhY3QgLTY0NjguOTAzNzM4NTIyOTUxMjU5MDYzMDk5OTQ2MTk1IC03ODc3LjMyNDMxNDI3MzY5NDMxMjE2NDQwNzc5NDkzOUUrMjY3IC0+IDcuODc3MzI0MzE0MjczNjk0MzEyMTY0NDA3Nzk0OTM5RSsyNzAgSW5leGFjdCBSb3VuZGVkCithZGR4MzA0OSBhZGQgLTk1NjcyMjEuMTgzNjYzMjM2ODE3MjM5MjU0NzgzMzcyRS0yMDMgMTY1MC4xOTg5NjEyNTYwNjExNjUzNjIzMTk0NzEyNjQgLT4gMTY1MC4xOTg5NjEyNTYwNjExNjUzNjIzMTk0NzEyNjQgSW5leGFjdCBSb3VuZGVkCitjb214MzA0OSBjb21wYXJlIC05NTY3MjIxLjE4MzY2MzIzNjgxNzIzOTI1NDc4MzM3MkUtMjAzIDE2NTAuMTk4OTYxMjU2MDYxMTY1MzYyMzE5NDcxMjY0IC0+IC0xCitkaXZ4MzA0OSBkaXZpZGUgLTk1NjcyMjEuMTgzNjYzMjM2ODE3MjM5MjU0NzgzMzcyRS0yMDMgMTY1MC4xOTg5NjEyNTYwNjExNjUzNjIzMTk0NzEyNjQgLT4gLTUuNzk3NjE2Nzc3MzAxMjUwNzExOTg1NzI5Nzc2OTU3RS0yMDAgSW5leGFjdCBSb3VuZGVkCitkdml4MzA0OSBkaXZpZGVpbnQgLTk1NjcyMjEuMTgzNjYzMjM2ODE3MjM5MjU0NzgzMzcyRS0yMDMgMTY1MC4xOTg5NjEyNTYwNjExNjUzNjIzMTk0NzEyNjQgLT4gLTAKK211bHgzMDQ5IG11bHRpcGx5IC05NTY3MjIxLjE4MzY2MzIzNjgxNzIzOTI1NDc4MzM3MkUtMjAzIDE2NTAuMTk4OTYxMjU2MDYxMTY1MzYyMzE5NDcxMjY0IC0+IC0xLjU3ODc4MTg0NTkzODgwNTczNzUyNzMwNDMwMzk3NkUtMTkzIEluZXhhY3QgUm91bmRlZAorcG93eDMwNDkgcG93ZXIgLTk1NjcyMjEuMTgzNjYzMjM2ODE3MjM5MjU0NzgzMzcyRS0yMDMgMTY1MCAtPiAwRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzA0OSByZW1haW5kZXIgLTk1NjcyMjEuMTgzNjYzMjM2ODE3MjM5MjU0NzgzMzcyRS0yMDMgMTY1MC4xOTg5NjEyNTYwNjExNjUzNjIzMTk0NzEyNjQgLT4gLTkuNTY3MjIxMTgzNjYzMjM2ODE3MjM5MjU0NzgzMzcyRS0xOTcKK3N1YngzMDQ5IHN1YnRyYWN0IC05NTY3MjIxLjE4MzY2MzIzNjgxNzIzOTI1NDc4MzM3MkUtMjAzIDE2NTAuMTk4OTYxMjU2MDYxMTY1MzYyMzE5NDcxMjY0IC0+IC0xNjUwLjE5ODk2MTI1NjA2MTE2NTM2MjMxOTQ3MTI2NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDUwIGFkZCA4ODEyMzA2MDk4NzcwLjIwMDc1MjEzOTE0MjAzMzU2OUUtNDI4IDI2NzkwLjE3MzgwMTYzOTc1MTg2OTcyNzIwNDI3MDMwRSs1NjggLT4gMi42NzkwMTczODAxNjM5NzUxODY5NzI3MjA0MjcwMzBFKzU3MiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDUwIGNvbXBhcmUgODgxMjMwNjA5ODc3MC4yMDA3NTIxMzkxNDIwMzM1NjlFLTQyOCAyNjc5MC4xNzM4MDE2Mzk3NTE4Njk3MjcyMDQyNzAzMEUrNTY4IC0+IC0xCitkaXZ4MzA1MCBkaXZpZGUgODgxMjMwNjA5ODc3MC4yMDA3NTIxMzkxNDIwMzM1NjlFLTQyOCAyNjc5MC4xNzM4MDE2Mzk3NTE4Njk3MjcyMDQyNzAzMEUrNTY4IC0+IDMuMjg5Mzc5OTY1OTYwMDY1NTczNDQ0MTQwNzQ5NjM1RS05ODggSW5leGFjdCBSb3VuZGVkCitkdml4MzA1MCBkaXZpZGVpbnQgODgxMjMwNjA5ODc3MC4yMDA3NTIxMzkxNDIwMzM1NjlFLTQyOCAyNjc5MC4xNzM4MDE2Mzk3NTE4Njk3MjcyMDQyNzAzMEUrNTY4IC0+IDAKK211bHgzMDUwIG11bHRpcGx5IDg4MTIzMDYwOTg3NzAuMjAwNzUyMTM5MTQyMDMzNTY5RS00MjggMjY3OTAuMTczODAxNjM5NzUxODY5NzI3MjA0MjcwMzBFKzU2OCAtPiAyLjM2MDgzMjExOTc5MzAzNjM5ODEyNzY1MjE4NzczMkUrMTU3IEluZXhhY3QgUm91bmRlZAorcG93eDMwNTAgcG93ZXIgODgxMjMwNjA5ODc3MC4yMDA3NTIxMzkxNDIwMzM1NjlFLTQyOCAzIC0+IDYuODQzMzQ5NTI3NDc2OTY3Mjc0MTI5MDQzOTQ5OTY5RS0xMjQ2IEluZXhhY3QgUm91bmRlZAorcmVteDMwNTAgcmVtYWluZGVyIDg4MTIzMDYwOTg3NzAuMjAwNzUyMTM5MTQyMDMzNTY5RS00MjggMjY3OTAuMTczODAxNjM5NzUxODY5NzI3MjA0MjcwMzBFKzU2OCAtPiA4LjgxMjMwNjA5ODc3MDIwMDc1MjEzOTE0MjAzMzU2OUUtNDE2CitzdWJ4MzA1MCBzdWJ0cmFjdCA4ODEyMzA2MDk4NzcwLjIwMDc1MjEzOTE0MjAzMzU2OUUtNDI4IDI2NzkwLjE3MzgwMTYzOTc1MTg2OTcyNzIwNDI3MDMwRSs1NjggLT4gLTIuNjc5MDE3MzgwMTYzOTc1MTg2OTcyNzIwNDI3MDMwRSs1NzIgSW5leGFjdCBSb3VuZGVkCithZGR4MzA1MSBhZGQgODAxMDgwMzMuMTI3MjQ4Mzg3MTg3MzY5MjI1MDA5MDQgLTcwNjIwNzI1NTA5Mi43NjQ1MTkyMzEwMDc4ODkyODY5IC0+IC03MDYxMjcxNDcwNTkuNjM3MjcwODQzODIwNTIwMDYxOSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDUxIGNvbXBhcmUgODAxMDgwMzMuMTI3MjQ4Mzg3MTg3MzY5MjI1MDA5MDQgLTcwNjIwNzI1NTA5Mi43NjQ1MTkyMzEwMDc4ODkyODY5IC0+IDEKK2RpdngzMDUxIGRpdmlkZSA4MDEwODAzMy4xMjcyNDgzODcxODczNjkyMjUwMDkwNCAtNzA2MjA3MjU1MDkyLjc2NDUxOTIzMTAwNzg4OTI4NjkgLT4gLTAuMDAwMTEzNDM0MTY5MDA1NzA2MDEwNTMyNTM5Nzg2Mzk5NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDUxIGRpdmlkZWludCA4MDEwODAzMy4xMjcyNDgzODcxODczNjkyMjUwMDkwNCAtNzA2MjA3MjU1MDkyLjc2NDUxOTIzMTAwNzg4OTI4NjkgLT4gLTAKK211bHgzMDUxIG11bHRpcGx5IDgwMTA4MDMzLjEyNzI0ODM4NzE4NzM2OTIyNTAwOTA0IC03MDYyMDcyNTUwOTIuNzY0NTE5MjMxMDA3ODg5Mjg2OSAtPiAtNTY1NzI4NzQxODU2NzQzMzIzOTguMzYwMDQxMTQzNzIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA1MSBwb3dlciA4MDEwODAzMy4xMjcyNDgzODcxODczNjkyMjUwMDkwNCAtNyAtPiA0LjcyMzUzOTE0NTA0MjMzNjQ4MzAwODY3NDA2MDMyNEUtNTYgSW5leGFjdCBSb3VuZGVkCityZW14MzA1MSByZW1haW5kZXIgODAxMDgwMzMuMTI3MjQ4Mzg3MTg3MzY5MjI1MDA5MDQgLTcwNjIwNzI1NTA5Mi43NjQ1MTkyMzEwMDc4ODkyODY5IC0+IDgwMTA4MDMzLjEyNzI0ODM4NzE4NzM2OTIyNTAwOTA0CitzdWJ4MzA1MSBzdWJ0cmFjdCA4MDEwODAzMy4xMjcyNDgzODcxODczNjkyMjUwMDkwNCAtNzA2MjA3MjU1MDkyLjc2NDUxOTIzMTAwNzg4OTI4NjkgLT4gNzA2Mjg3MzYzMTI1Ljg5MTc2NzYxODE5NTI1ODUxMTkgSW5leGFjdCBSb3VuZGVkCithZGR4MzA1MiBhZGQgLTM3OTQyODQ2MjgyLjc2MTAxNjYzNzg5MDU5MDAzNTA1IC01LjY0OTQ1NjA1Mzk0Mjg1MDM1MTMxMzg2OTk4MzE5NyAtPiAtMzc5NDI4NDYyODguNDEwNDcyNjkxODMzNDQwMzg2MzYgSW5leGFjdCBSb3VuZGVkCitjb214MzA1MiBjb21wYXJlIC0zNzk0Mjg0NjI4Mi43NjEwMTY2Mzc4OTA1OTAwMzUwNSAtNS42NDk0NTYwNTM5NDI4NTAzNTEzMTM4Njk5ODMxOTcgLT4gLTEKK2RpdngzMDUyIGRpdmlkZSAtMzc5NDI4NDYyODIuNzYxMDE2NjM3ODkwNTkwMDM1MDUgLTUuNjQ5NDU2MDUzOTQyODUwMzUxMzEzODY5OTgzMTk3IC0+IDY3MTYxOTQ2MDcuMTM5MjI0NzM1MDMyNTY2MzI4OTYwIEluZXhhY3QgUm91bmRlZAorZHZpeDMwNTIgZGl2aWRlaW50IC0zNzk0Mjg0NjI4Mi43NjEwMTY2Mzc4OTA1OTAwMzUwNSAtNS42NDk0NTYwNTM5NDI4NTAzNTEzMTM4Njk5ODMxOTcgLT4gNjcxNjE5NDYwNworbXVseDMwNTIgbXVsdGlwbHkgLTM3OTQyODQ2MjgyLjc2MTAxNjYzNzg5MDU5MDAzNTA1IC01LjY0OTQ1NjA1Mzk0Mjg1MDM1MTMxMzg2OTk4MzE5NyAtPiAyMTQzNTY0NDI2MzUuOTY3MjAwOTQ0OTE0MDkzMzM2NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDUyIHBvd2VyIC0zNzk0Mjg0NjI4Mi43NjEwMTY2Mzc4OTA1OTAwMzUwNSAtNiAtPiAzLjM1MTM1NTk4NjM4MjY0NjA0Njc3MzAwODc1Mzg4NUUtNjQgSW5leGFjdCBSb3VuZGVkCityZW14MzA1MiByZW1haW5kZXIgLTM3OTQyODQ2MjgyLjc2MTAxNjYzNzg5MDU5MDAzNTA1IC01LjY0OTQ1NjA1Mzk0Mjg1MDM1MTMxMzg2OTk4MzE5NyAtPiAtMC43ODY1NDQwMjIxODgzMjEwODk2MDMxMjc5ODE0MjEKK3N1YngzMDUyIHN1YnRyYWN0IC0zNzk0Mjg0NjI4Mi43NjEwMTY2Mzc4OTA1OTAwMzUwNSAtNS42NDk0NTYwNTM5NDI4NTAzNTEzMTM4Njk5ODMxOTcgLT4gLTM3OTQyODQ2Mjc3LjExMTU2MDU4Mzk0NzczOTY4Mzc0IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNTMgYWRkIDkyNjU5NjMyMTE1MzA1LjEzNzM1NDM3NzI4NDQ1NTQxIDY0ODM0MzguMzE3ODYyODUxNjc2NDY4MDk0MjYxNDEwRS0xMzkgLT4gOTI2NTk2MzIxMTUzMDUuMTM3MzU0Mzc3Mjg0NDU1NDEgSW5leGFjdCBSb3VuZGVkCitjb214MzA1MyBjb21wYXJlIDkyNjU5NjMyMTE1MzA1LjEzNzM1NDM3NzI4NDQ1NTQxIDY0ODM0MzguMzE3ODYyODUxNjc2NDY4MDk0MjYxNDEwRS0xMzkgLT4gMQorZGl2eDMwNTMgZGl2aWRlIDkyNjU5NjMyMTE1MzA1LjEzNzM1NDM3NzI4NDQ1NTQxIDY0ODM0MzguMzE3ODYyODUxNjc2NDY4MDk0MjYxNDEwRS0xMzkgLT4gMS40MjkxNzQyNjc5MTkxMzU3MTA0MTA1MjkyMTE3OTFFKzE0NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDUzIGRpdmlkZWludCA5MjY1OTYzMjExNTMwNS4xMzczNTQzNzcyODQ0NTU0MSA2NDgzNDM4LjMxNzg2Mjg1MTY3NjQ2ODA5NDI2MTQxMEUtMTM5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzA1MyBtdWx0aXBseSA5MjY1OTYzMjExNTMwNS4xMzczNTQzNzcyODQ0NTU0MSA2NDgzNDM4LjMxNzg2Mjg1MTY3NjQ2ODA5NDI2MTQxMEUtMTM5IC0+IDYuMDA3NTMwMDkzNzU0NDQ2MDg1ODE5MjU1OTg3ODc4RS0xMTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA1MyBwb3dlciA5MjY1OTYzMjExNTMwNS4xMzczNTQzNzcyODQ0NTU0MSA2IC0+IDYuMzI5MTIxNDUxOTUzNDYxNTQ2Njk2MDUxNTYzMzIzRSs4MyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDUzIHJlbWFpbmRlciA5MjY1OTYzMjExNTMwNS4xMzczNTQzNzcyODQ0NTU0MSA2NDgzNDM4LjMxNzg2Mjg1MTY3NjQ2ODA5NDI2MTQxMEUtMTM5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzA1MyBzdWJ0cmFjdCA5MjY1OTYzMjExNTMwNS4xMzczNTQzNzcyODQ0NTU0MSA2NDgzNDM4LjMxNzg2Mjg1MTY3NjQ2ODA5NDI2MTQxMEUtMTM5IC0+IDkyNjU5NjMyMTE1MzA1LjEzNzM1NDM3NzI4NDQ1NTQxIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNTQgYWRkIDI4Mzg5NDguNTg5ODM3NTk1NDk0MTUyMTUwNjQ3MTk0IDU2OTU0NzAyNjI0Ny41NDY5NTYzNzAxNDE1NzE1OTYwIC0+IDU2OTU0OTg2NTE5Ni4xMzY3OTM5NjU2MzU3MjM3NDY2IEluZXhhY3QgUm91bmRlZAorY29teDMwNTQgY29tcGFyZSAyODM4OTQ4LjU4OTgzNzU5NTQ5NDE1MjE1MDY0NzE5NCA1Njk1NDcwMjYyNDcuNTQ2OTU2MzcwMTQxNTcxNTk2MCAtPiAtMQorZGl2eDMwNTQgZGl2aWRlIDI4Mzg5NDguNTg5ODM3NTk1NDk0MTUyMTUwNjQ3MTk0IDU2OTU0NzAyNjI0Ny41NDY5NTYzNzAxNDE1NzE1OTYwIC0+IDAuMDAwMDA0OTg0NTcyNzU1MTk4MDU3NDgxOTA3MjgxMDgwNDA2IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNTQgZGl2aWRlaW50IDI4Mzg5NDguNTg5ODM3NTk1NDk0MTUyMTUwNjQ3MTk0IDU2OTU0NzAyNjI0Ny41NDY5NTYzNzAxNDE1NzE1OTYwIC0+IDAKK211bHgzMDU0IG11bHRpcGx5IDI4Mzg5NDguNTg5ODM3NTk1NDk0MTUyMTUwNjQ3MTk0IDU2OTU0NzAyNjI0Ny41NDY5NTYzNzAxNDE1NzE1OTYwIC0+IDE2MTY5MTQ3MjcwMTE2Njk0MTkuMzkwOTU5OTg0MjczIEluZXhhY3QgUm91bmRlZAorcG93eDMwNTQgcG93ZXIgMjgzODk0OC41ODk4Mzc1OTU0OTQxNTIxNTA2NDcxOTQgNiAtPiA1LjIzNTM0MzMzNDk4NjA1OTc1MzA5Njg4NDA4MDY3M0UrMzggSW5leGFjdCBSb3VuZGVkCityZW14MzA1NCByZW1haW5kZXIgMjgzODk0OC41ODk4Mzc1OTU0OTQxNTIxNTA2NDcxOTQgNTY5NTQ3MDI2MjQ3LjU0Njk1NjM3MDE0MTU3MTU5NjAgLT4gMjgzODk0OC41ODk4Mzc1OTU0OTQxNTIxNTA2NDcxOTQKK3N1YngzMDU0IHN1YnRyYWN0IDI4Mzg5NDguNTg5ODM3NTk1NDk0MTUyMTUwNjQ3MTk0IDU2OTU0NzAyNjI0Ny41NDY5NTYzNzAxNDE1NzE1OTYwIC0+IC01Njk1NDQxODcyOTguOTU3MTE4Nzc0NjQ3NDE5NDQ1NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDU1IGFkZCA1MjQ5OTUyMDQ1MjMuNjA1MzMwNzk0MTc3NTc5NDI4N0UrNjk0IDE1ODk2MDA4Nzk2ODk1MTcxMDA1MjcyOTMwMjg1NTMgLT4gNS4yNDk5NTIwNDUyMzYwNTMzMDc5NDE3NzU3OTQyODdFKzcwNSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDU1IGNvbXBhcmUgNTI0OTk1MjA0NTIzLjYwNTMzMDc5NDE3NzU3OTQyODdFKzY5NCAxNTg5NjAwODc5Njg5NTE3MTAwNTI3MjkzMDI4NTUzIC0+IDEKK2RpdngzMDU1IGRpdmlkZSA1MjQ5OTUyMDQ1MjMuNjA1MzMwNzk0MTc3NTc5NDI4N0UrNjk0IDE1ODk2MDA4Nzk2ODk1MTcxMDA1MjcyOTMwMjg1NTMgLT4gMy4zMDI2ODU2NjkyODY2NzA3MDg1NTQ3NTMxMzkyMzNFKzY3NSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDU1IGRpdmlkZWludCA1MjQ5OTUyMDQ1MjMuNjA1MzMwNzk0MTc3NTc5NDI4N0UrNjk0IDE1ODk2MDA4Nzk2ODk1MTcxMDA1MjcyOTMwMjg1NTMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDU1IG11bHRpcGx5IDUyNDk5NTIwNDUyMy42MDUzMzA3OTQxNzc1Nzk0Mjg3RSs2OTQgMTU4OTYwMDg3OTY4OTUxNzEwMDUyNzI5MzAyODU1MyAtPiA4LjM0NTMyODM4OTQzNTAwOTgxMjkzMzU5OTg4OTQ0N0UrNzM1IEluZXhhY3QgUm91bmRlZAorcG93eDMwNTUgcG93ZXIgNTI0OTk1MjA0NTIzLjYwNTMzMDc5NDE3NzU3OTQyODdFKzY5NCAyIC0+IDIuNzU2MTk5NjQ3NzI3ODIxOTExODU3MTYwMjMwODQ5RSsxNDExIEluZXhhY3QgUm91bmRlZAorcmVteDMwNTUgcmVtYWluZGVyIDUyNDk5NTIwNDUyMy42MDUzMzA3OTQxNzc1Nzk0Mjg3RSs2OTQgMTU4OTYwMDg3OTY4OTUxNzEwMDUyNzI5MzAyODU1MyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwNTUgc3VidHJhY3QgNTI0OTk1MjA0NTIzLjYwNTMzMDc5NDE3NzU3OTQyODdFKzY5NCAxNTg5NjAwODc5Njg5NTE3MTAwNTI3MjkzMDI4NTUzIC0+IDUuMjQ5OTUyMDQ1MjM2MDUzMzA3OTQxNzc1Nzk0Mjg3RSs3MDUgSW5leGFjdCBSb3VuZGVkCithZGR4MzA1NiBhZGQgLTU3MTMxNTczNjc3NDUyLjE1NDQ5OTIxNzI1MDk3MjkwIDQ2Njk2ODE0MzA3MzYuMzI2ODU4NTA4NzE1NjQzNzY5IC0+IC01MjQ2MTg5MjI0NjcxNS44Mjc2NDA3MDg1MzUzMjkxMyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDU2IGNvbXBhcmUgLTU3MTMxNTczNjc3NDUyLjE1NDQ5OTIxNzI1MDk3MjkwIDQ2Njk2ODE0MzA3MzYuMzI2ODU4NTA4NzE1NjQzNzY5IC0+IC0xCitkaXZ4MzA1NiBkaXZpZGUgLTU3MTMxNTczNjc3NDUyLjE1NDQ5OTIxNzI1MDk3MjkwIDQ2Njk2ODE0MzA3MzYuMzI2ODU4NTA4NzE1NjQzNzY5IC0+IC0xMi4yMzQ1NzYyODIxMDA1NzczMzY0MzU3NTE0MzY5NCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDU2IGRpdmlkZWludCAtNTcxMzE1NzM2Nzc0NTIuMTU0NDk5MjE3MjUwOTcyOTAgNDY2OTY4MTQzMDczNi4zMjY4NTg1MDg3MTU2NDM3NjkgLT4gLTEyCittdWx4MzA1NiBtdWx0aXBseSAtNTcxMzE1NzM2Nzc0NTIuMTU0NDk5MjE3MjUwOTcyOTAgNDY2OTY4MTQzMDczNi4zMjY4NTg1MDg3MTU2NDM3NjkgLT4gLTI2Njc4NjI0ODcxMDM0MjY0Nzc0NjA2MzMyMi4wNTQ0IEluZXhhY3QgUm91bmRlZAorcG93eDMwNTYgcG93ZXIgLTU3MTMxNTczNjc3NDUyLjE1NDQ5OTIxNzI1MDk3MjkwIDUgLT4gLTYuMDg2Njg2NTAzNzUyNjc5Mzc1NDMwMDE5NTAzNjc5RSs2OCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDU2IHJlbWFpbmRlciAtNTcxMzE1NzM2Nzc0NTIuMTU0NDk5MjE3MjUwOTcyOTAgNDY2OTY4MTQzMDczNi4zMjY4NTg1MDg3MTU2NDM3NjkgLT4gLTEwOTUzOTY1MDg2MTYuMjMyMTk3MTEyNjYzMjQ3NjcyCitzdWJ4MzA1NiBzdWJ0cmFjdCAtNTcxMzE1NzM2Nzc0NTIuMTU0NDk5MjE3MjUwOTcyOTAgNDY2OTY4MTQzMDczNi4zMjY4NTg1MDg3MTU2NDM3NjkgLT4gLTYxODAxMjU1MTA4MTg4LjQ4MTM1NzcyNTk2NjYxNjY3IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNTcgYWRkIDkwNzk0ODI2LjU1NTI4MDE4NzgxODMwNDYzMzgzNDExIC01LjQ3MTUwMjI3MDM1MTIzMTExMDAyNzY0NzIxNjEyOCAtPiA5MDc5NDgyMS4wODM3Nzc5MTc0NjcwNzM1MjM4MDY0NiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDU3IGNvbXBhcmUgOTA3OTQ4MjYuNTU1MjgwMTg3ODE4MzA0NjMzODM0MTEgLTUuNDcxNTAyMjcwMzUxMjMxMTEwMDI3NjQ3MjE2MTI4IC0+IDEKK2RpdngzMDU3IGRpdmlkZSA5MDc5NDgyNi41NTUyODAxODc4MTgzMDQ2MzM4MzQxMSAtNS40NzE1MDIyNzAzNTEyMzExMTAwMjc2NDcyMTYxMjggLT4gLTE2NTk0MTMxLjIwMzY1MDU0OTI4NDI4MzEzMjMyMjQ2IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNTcgZGl2aWRlaW50IDkwNzk0ODI2LjU1NTI4MDE4NzgxODMwNDYzMzgzNDExIC01LjQ3MTUwMjI3MDM1MTIzMTExMDAyNzY0NzIxNjEyOCAtPiAtMTY1OTQxMzEKK211bHgzMDU3IG11bHRpcGx5IDkwNzk0ODI2LjU1NTI4MDE4NzgxODMwNDYzMzgzNDExIC01LjQ3MTUwMjI3MDM1MTIzMTExMDAyNzY0NzIxNjEyOCAtPiAtNDk2Nzg0MDk5LjYzMzM2MTc5NTg0OTY1ODkxMjQ5NjQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA1NyBwb3dlciA5MDc5NDgyNi41NTUyODAxODc4MTgzMDQ2MzM4MzQxMSAtNSAtPiAxLjYyMDY2OTU5MDUzMjg1NjUyMzU2NTc0Mjk1Mzk5N0UtNDAgSW5leGFjdCBSb3VuZGVkCityZW14MzA1NyByZW1haW5kZXIgOTA3OTQ4MjYuNTU1MjgwMTg3ODE4MzA0NjMzODM0MTEgLTUuNDcxNTAyMjcwMzUxMjMxMTEwMDI3NjQ3MjE2MTI4IC0+IDEuMTE0Mjc0NDQyNzY3MjMwNDQyMzA3ODk2NjU1MjMyCitzdWJ4MzA1NyBzdWJ0cmFjdCA5MDc5NDgyNi41NTUyODAxODc4MTgzMDQ2MzM4MzQxMSAtNS40NzE1MDIyNzAzNTEyMzExMTAwMjc2NDcyMTYxMjggLT4gOTA3OTQ4MzIuMDI2NzgyNDU4MTY5NTM1NzQzODYxNzYgSW5leGFjdCBSb3VuZGVkCithZGR4MzA1OCBhZGQgNTg1MDg3OTQ3MjkuMzUxOTExNjA4NDA5ODA0ODkxMzggLTQ3MDYwODY3LjI0OTg4Mjc5NjgwODI0Mzk3NDQ3NTUxIC0+IDU4NDYxNzMzODYyLjEwMjAyODgxMTYwMTU2MDkxNjkwIEluZXhhY3QgUm91bmRlZAorY29teDMwNTggY29tcGFyZSA1ODUwODc5NDcyOS4zNTE5MTE2MDg0MDk4MDQ4OTEzOCAtNDcwNjA4NjcuMjQ5ODgyNzk2ODA4MjQzOTc0NDc1NTEgLT4gMQorZGl2eDMwNTggZGl2aWRlIDU4NTA4Nzk0NzI5LjM1MTkxMTYwODQwOTgwNDg5MTM4IC00NzA2MDg2Ny4yNDk4ODI3OTY4MDgyNDM5NzQ0NzU1MSAtPiAtMTI0My4yNTc4OTQ0NzcwMjE2Nzg4MDkzMzc4NzUzMDQgSW5leGFjdCBSb3VuZGVkCitkdml4MzA1OCBkaXZpZGVpbnQgNTg1MDg3OTQ3MjkuMzUxOTExNjA4NDA5ODA0ODkxMzggLTQ3MDYwODY3LjI0OTg4Mjc5NjgwODI0Mzk3NDQ3NTUxIC0+IC0xMjQzCittdWx4MzA1OCBtdWx0aXBseSA1ODUwODc5NDcyOS4zNTE5MTE2MDg0MDk4MDQ4OTEzOCAtNDcwNjA4NjcuMjQ5ODgyNzk2ODA4MjQzOTc0NDc1NTEgLT4gLTI3NTM0NzQ2MjE3MDg2NzI1NzMuMjQ5MDI5NjQzOTY3IEluZXhhY3QgUm91bmRlZAorcG93eDMwNTggcG93ZXIgNTg1MDg3OTQ3MjkuMzUxOTExNjA4NDA5ODA0ODkxMzggLTQ3MDYwODY3IC0+IDBFLTEwMDI5IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMDU4IHJlbWFpbmRlciA1ODUwODc5NDcyOS4zNTE5MTE2MDg0MDk4MDQ4OTEzOCAtNDcwNjA4NjcuMjQ5ODgyNzk2ODA4MjQzOTc0NDc1NTEgLT4gMTIxMzY3MzcuNzQ3NTk1MTc1NzYyNTQ0NjE4MzIxMDcKK3N1YngzMDU4IHN1YnRyYWN0IDU4NTA4Nzk0NzI5LjM1MTkxMTYwODQwOTgwNDg5MTM4IC00NzA2MDg2Ny4yNDk4ODI3OTY4MDgyNDM5NzQ0NzU1MSAtPiA1ODU1NTg1NTU5Ni42MDE3OTQ0MDUyMTgwNDg4NjU4NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDU5IGFkZCAtNzQ2MTA0LjA3NjgwNzg0NzQ0MjY0NjQyMTk0MTYzMzJFKzAwNiA5NTk1NDE4LjMwMDYxMzc1NDU1NjY3MTg1MjgwMTY2N0UrMzg1IC0+IDkuNTk1NDE4MzAwNjEzNzU0NTU2NjcxODUyODAxNjY3RSszOTEgSW5leGFjdCBSb3VuZGVkCitjb214MzA1OSBjb21wYXJlIC03NDYxMDQuMDc2ODA3ODQ3NDQyNjQ2NDIxOTQxNjMzMkUrMDA2IDk1OTU0MTguMzAwNjEzNzU0NTU2NjcxODUyODAxNjY3RSszODUgLT4gLTEKK2RpdngzMDU5IGRpdmlkZSAtNzQ2MTA0LjA3NjgwNzg0NzQ0MjY0NjQyMTk0MTYzMzJFKzAwNiA5NTk1NDE4LjMwMDYxMzc1NDU1NjY3MTg1MjgwMTY2N0UrMzg1IC0+IC03Ljc3NTYyODQ2NTkzMjc4OTcwMDU0Nzg3MjUxMTc0NUUtMzgxIEluZXhhY3QgUm91bmRlZAorZHZpeDMwNTkgZGl2aWRlaW50IC03NDYxMDQuMDc2ODA3ODQ3NDQyNjQ2NDIxOTQxNjMzMkUrMDA2IDk1OTU0MTguMzAwNjEzNzU0NTU2NjcxODUyODAxNjY3RSszODUgLT4gLTAKK211bHgzMDU5IG11bHRpcGx5IC03NDYxMDQuMDc2ODA3ODQ3NDQyNjQ2NDIxOTQxNjMzMkUrMDA2IDk1OTU0MTguMzAwNjEzNzU0NTU2NjcxODUyODAxNjY3RSszODUgLT4gLTcuMTU5MTgwNzEyNzY0NTQ5NzExNjY5OTM5OTQ3MDg0RSs0MDMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA1OSBwb3dlciAtNzQ2MTA0LjA3NjgwNzg0NzQ0MjY0NjQyMTk0MTYzMzJFKzAwNiAxMCAtPiA1LjM0NTU3MTM0NjMwMjU4Mjg4MjgwNTAzNTk5NjY5NkUrMTE4IEluZXhhY3QgUm91bmRlZAorcmVteDMwNTkgcmVtYWluZGVyIC03NDYxMDQuMDc2ODA3ODQ3NDQyNjQ2NDIxOTQxNjMzMkUrMDA2IDk1OTU0MTguMzAwNjEzNzU0NTU2NjcxODUyODAxNjY3RSszODUgLT4gLTc0NjEwNDA3NjgwNy44NDc0NDI2NDY0MjE5NDE2MzMyCitzdWJ4MzA1OSBzdWJ0cmFjdCAtNzQ2MTA0LjA3NjgwNzg0NzQ0MjY0NjQyMTk0MTYzMzJFKzAwNiA5NTk1NDE4LjMwMDYxMzc1NDU1NjY3MTg1MjgwMTY2N0UrMzg1IC0+IC05LjU5NTQxODMwMDYxMzc1NDU1NjY3MTg1MjgwMTY2N0UrMzkxIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNjAgYWRkIDU1Ljk5NDI3NjMyNjg4Mzg3NDAwNDAzNzg5NjU5NDU5RSsxMTkgLTkuMTcwNTMwNDUwODgxNjEyODUzOTk4NDg5MzQwMTI3IC0+IDUuNTk5NDI3NjMyNjg4Mzg3NDAwNDAzNzg5NjU5NDU5RSsxMjAgSW5leGFjdCBSb3VuZGVkCitjb214MzA2MCBjb21wYXJlIDU1Ljk5NDI3NjMyNjg4Mzg3NDAwNDAzNzg5NjU5NDU5RSsxMTkgLTkuMTcwNTMwNDUwODgxNjEyODUzOTk4NDg5MzQwMTI3IC0+IDEKK2RpdngzMDYwIGRpdmlkZSA1NS45OTQyNzYzMjY4ODM4NzQwMDQwMzc4OTY1OTQ1OUUrMTE5IC05LjE3MDUzMDQ1MDg4MTYxMjg1Mzk5ODQ4OTM0MDEyNyAtPiAtNi4xMDU4OTI4NTE3NTk4MjgxNzY2NTU2ODUxMTE0OTFFKzExOSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDYwIGRpdmlkZWludCA1NS45OTQyNzYzMjY4ODM4NzQwMDQwMzc4OTY1OTQ1OUUrMTE5IC05LjE3MDUzMDQ1MDg4MTYxMjg1Mzk5ODQ4OTM0MDEyNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMwNjAgbXVsdGlwbHkgNTUuOTk0Mjc2MzI2ODgzODc0MDA0MDM3ODk2NTk0NTlFKzExOSAtOS4xNzA1MzA0NTA4ODE2MTI4NTM5OTg0ODkzNDAxMjcgLT4gLTUuMTM0OTcyMTYxMzA3Njc5OTM5MjgxMTcwOTQ0NTU2RSsxMjEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA2MCBwb3dlciA1NS45OTQyNzYzMjY4ODM4NzQwMDQwMzc4OTY1OTQ1OUUrMTE5IC05IC0+IDEuODQ4MDIyNTg0NzY0Mzg0MDc3NjcyMDQxMDU2Mzk2RS0xMDg3IEluZXhhY3QgUm91bmRlZAorcmVteDMwNjAgcmVtYWluZGVyIDU1Ljk5NDI3NjMyNjg4Mzg3NDAwNDAzNzg5NjU5NDU5RSsxMTkgLTkuMTcwNTMwNDUwODgxNjEyODUzOTk4NDg5MzQwMTI3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzA2MCBzdWJ0cmFjdCA1NS45OTQyNzYzMjY4ODM4NzQwMDQwMzc4OTY1OTQ1OUUrMTE5IC05LjE3MDUzMDQ1MDg4MTYxMjg1Mzk5ODQ4OTM0MDEyNyAtPiA1LjU5OTQyNzYzMjY4ODM4NzQwMDQwMzc4OTY1OTQ1OUUrMTIwIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNjEgYWRkIC00MTIxNDI2NTYyOC44MzgwMTI0MTQ2NzMxNzI3MDU5NSAxMDE1MzM2MzIzNzk4Mzg5OTAzMzYxOTc4MjcxMzU0IC0+IDEwMTUzMzYzMjM3OTgzODk5MDMzMjA3NjQwMDU3MjUgSW5leGFjdCBSb3VuZGVkCitjb214MzA2MSBjb21wYXJlIC00MTIxNDI2NTYyOC44MzgwMTI0MTQ2NzMxNzI3MDU5NSAxMDE1MzM2MzIzNzk4Mzg5OTAzMzYxOTc4MjcxMzU0IC0+IC0xCitkaXZ4MzA2MSBkaXZpZGUgLTQxMjE0MjY1NjI4LjgzODAxMjQxNDY3MzE3MjcwNTk1IDEwMTUzMzYzMjM3OTgzODk5MDMzNjE5NzgyNzEzNTQgLT4gLTQuMDU5MTczNzU5NzUwMzQyMjQ3NjIwNzA2Mzg0MDI3RS0yMCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDYxIGRpdmlkZWludCAtNDEyMTQyNjU2MjguODM4MDEyNDE0NjczMTcyNzA1OTUgMTAxNTMzNjMyMzc5ODM4OTkwMzM2MTk3ODI3MTM1NCAtPiAtMAorbXVseDMwNjEgbXVsdGlwbHkgLTQxMjE0MjY1NjI4LjgzODAxMjQxNDY3MzE3MjcwNTk1IDEwMTUzMzYzMjM3OTgzODk5MDMzNjE5NzgyNzEzNTQgLT4gLTQuMTg0NjM0MDk1MTYzNDcyMzg0MDI4NTQ5Mzc4MzkyRSs0MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDYxIHBvd2VyIC00MTIxNDI2NTYyOC44MzgwMTI0MTQ2NzMxNzI3MDU5NSAxIC0+IC00MTIxNDI2NTYyOC44MzgwMTI0MTQ2NzMxNzI3MDU5NQorcmVteDMwNjEgcmVtYWluZGVyIC00MTIxNDI2NTYyOC44MzgwMTI0MTQ2NzMxNzI3MDU5NSAxMDE1MzM2MzIzNzk4Mzg5OTAzMzYxOTc4MjcxMzU0IC0+IC00MTIxNDI2NTYyOC44MzgwMTI0MTQ2NzMxNzI3MDU5NQorc3VieDMwNjEgc3VidHJhY3QgLTQxMjE0MjY1NjI4LjgzODAxMjQxNDY3MzE3MjcwNTk1IDEwMTUzMzYzMjM3OTgzODk5MDMzNjE5NzgyNzEzNTQgLT4gLTEwMTUzMzYzMjM3OTgzODk5MDM0MDMxOTI1MzY5ODMgSW5leGFjdCBSb3VuZGVkCithZGR4MzA2MiBhZGQgODk5MzcuMzk3NDkyMDEwOTU1NzAzNTc1NTc0MzA4MjIgODIzNTE1NTQyMTAwOTMuNjA4Nzk0NzYwMjc4MDAzMzEgLT4gODIzNTE1NTQzMDAwMzEuMDA2Mjg2NzcxMjMzNzA2ODkgSW5leGFjdCBSb3VuZGVkCitjb214MzA2MiBjb21wYXJlIDg5OTM3LjM5NzQ5MjAxMDk1NTcwMzU3NTU3NDMwODIyIDgyMzUxNTU0MjEwMDkzLjYwODc5NDc2MDI3ODAwMzMxIC0+IC0xCitkaXZ4MzA2MiBkaXZpZGUgODk5MzcuMzk3NDkyMDEwOTU1NzAzNTc1NTc0MzA4MjIgODIzNTE1NTQyMTAwOTMuNjA4Nzk0NzYwMjc4MDAzMzEgLT4gMS4wOTIxMTUzNjI2NjI5MTM0MTU1OTI5MzA5ODIxMjlFLTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzA2MiBkaXZpZGVpbnQgODk5MzcuMzk3NDkyMDEwOTU1NzAzNTc1NTc0MzA4MjIgODIzNTE1NTQyMTAwOTMuNjA4Nzk0NzYwMjc4MDAzMzEgLT4gMAorbXVseDMwNjIgbXVsdGlwbHkgODk5MzcuMzk3NDkyMDEwOTU1NzAzNTc1NTc0MzA4MjIgODIzNTE1NTQyMTAwOTMuNjA4Nzk0NzYwMjc4MDAzMzEgLT4gNzQwNjQ4NDQ2NTA3ODA3NzE5MS45MjAwMTU3OTM2NjIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA2MiBwb3dlciA4OTkzNy4zOTc0OTIwMTA5NTU3MDM1NzU1NzQzMDgyMiA4IC0+IDQuMjgwNzc2MjY3NzIzOTEzMDQzMDUwMTAwOTM0MjkxRSszOSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDYyIHJlbWFpbmRlciA4OTkzNy4zOTc0OTIwMTA5NTU3MDM1NzU1NzQzMDgyMiA4MjM1MTU1NDIxMDA5My42MDg3OTQ3NjAyNzgwMDMzMSAtPiA4OTkzNy4zOTc0OTIwMTA5NTU3MDM1NzU1NzQzMDgyMgorc3VieDMwNjIgc3VidHJhY3QgODk5MzcuMzk3NDkyMDEwOTU1NzAzNTc1NTc0MzA4MjIgODIzNTE1NTQyMTAwOTMuNjA4Nzk0NzYwMjc4MDAzMzEgLT4gLTgyMzUxNTU0MTIwMTU2LjIxMTMwMjc0OTMyMjI5OTczIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNjMgYWRkIDAxNzEyNjYxLjY0Njc3MDgyMTU2Mjg0MTI1NDg2OTQzRSszNTkgNTc5MzIuNzg0MzU1Mjk0ODMyNDE1NTIwNDIxMTU4MzdFLTAzNyAtPiAxLjcxMjY2MTY0Njc3MDgyMTU2Mjg0MTI1NDg2OTQzMEUrMzY1IEluZXhhY3QgUm91bmRlZAorY29teDMwNjMgY29tcGFyZSAwMTcxMjY2MS42NDY3NzA4MjE1NjI4NDEyNTQ4Njk0M0UrMzU5IDU3OTMyLjc4NDM1NTI5NDgzMjQxNTUyMDQyMTE1ODM3RS0wMzcgLT4gMQorZGl2eDMwNjMgZGl2aWRlIDAxNzEyNjYxLjY0Njc3MDgyMTU2Mjg0MTI1NDg2OTQzRSszNTkgNTc5MzIuNzg0MzU1Mjk0ODMyNDE1NTIwNDIxMTU4MzdFLTAzNyAtPiAyLjk1NjI5MDkyNTQ3NTQxNDE4NTk2MDk5OTc4ODg0OEUrMzk3IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNjMgZGl2aWRlaW50IDAxNzEyNjYxLjY0Njc3MDgyMTU2Mjg0MTI1NDg2OTQzRSszNTkgNTc5MzIuNzg0MzU1Mjk0ODMyNDE1NTIwNDIxMTU4MzdFLTAzNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMwNjMgbXVsdGlwbHkgMDE3MTI2NjEuNjQ2NzcwODIxNTYyODQxMjU0ODY5NDNFKzM1OSA1NzkzMi43ODQzNTUyOTQ4MzI0MTU1MjA0MjExNTgzN0UtMDM3IC0+IDkuOTIxOTI1Nzg1NTk1ODEzNTg3NjU1MzEyMzA3OTMwRSszMzIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA2MyBwb3dlciAwMTcxMjY2MS42NDY3NzA4MjE1NjI4NDEyNTQ4Njk0M0UrMzU5IDYgLT4gMi41MjM2NTE4MDMzMjMwNDc3MTE3MzU1MDE5NDQ5NTlFKzIxOTEgSW5leGFjdCBSb3VuZGVkCityZW14MzA2MyByZW1haW5kZXIgMDE3MTI2NjEuNjQ2NzcwODIxNTYyODQxMjU0ODY5NDNFKzM1OSA1NzkzMi43ODQzNTUyOTQ4MzI0MTU1MjA0MjExNTgzN0UtMDM3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzA2MyBzdWJ0cmFjdCAwMTcxMjY2MS42NDY3NzA4MjE1NjI4NDEyNTQ4Njk0M0UrMzU5IDU3OTMyLjc4NDM1NTI5NDgzMjQxNTUyMDQyMTE1ODM3RS0wMzcgLT4gMS43MTI2NjE2NDY3NzA4MjE1NjI4NDEyNTQ4Njk0MzBFKzM2NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDY0IGFkZCAtMjY0NzU5MzMwNi41Mjg2MTc2OTEzNzM0NzAwNTkyMTMgLTY1NTUzMTU1ODcwOS40NTgyMTY4OTMwMTkxMDE0NDYxIC0+IC02NTgxNzkxNTIwMTUuOTg2ODM0NTg0MzkyNTcxNTA1MyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDY0IGNvbXBhcmUgLTI2NDc1OTMzMDYuNTI4NjE3NjkxMzczNDcwMDU5MjEzIC02NTU1MzE1NTg3MDkuNDU4MjE2ODkzMDE5MTAxNDQ2MSAtPiAxCitkaXZ4MzA2NCBkaXZpZGUgLTI2NDc1OTMzMDYuNTI4NjE3NjkxMzczNDcwMDU5MjEzIC02NTU1MzE1NTg3MDkuNDU4MjE2ODkzMDE5MTAxNDQ2MSAtPiAwLjAwNDAzODg0OTQ5NzU2MDMwMzE1ODYzOTE5Mjg5NTU0NCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDY0IGRpdmlkZWludCAtMjY0NzU5MzMwNi41Mjg2MTc2OTEzNzM0NzAwNTkyMTMgLTY1NTUzMTU1ODcwOS40NTgyMTY4OTMwMTkxMDE0NDYxIC0+IDAKK211bHgzMDY0IG11bHRpcGx5IC0yNjQ3NTkzMzA2LjUyODYxNzY5MTM3MzQ3MDA1OTIxMyAtNjU1NTMxNTU4NzA5LjQ1ODIxNjg5MzAxOTEwMTQ0NjEgLT4gMTczNTU4MDk2NzA1NzQzMzE1MzEyMC4wOTk2NDM2NDEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA2NCBwb3dlciAtMjY0NzU5MzMwNi41Mjg2MTc2OTEzNzM0NzAwNTkyMTMgLTcgLT4gLTEuMDk2NTgxOTE0MDA1OTAyNTgzNDEzODEwMjAxNTcxRS02NiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDY0IHJlbWFpbmRlciAtMjY0NzU5MzMwNi41Mjg2MTc2OTEzNzM0NzAwNTkyMTMgLTY1NTUzMTU1ODcwOS40NTgyMTY4OTMwMTkxMDE0NDYxIC0+IC0yNjQ3NTkzMzA2LjUyODYxNzY5MTM3MzQ3MDA1OTIxMworc3VieDMwNjQgc3VidHJhY3QgLTI2NDc1OTMzMDYuNTI4NjE3NjkxMzczNDcwMDU5MjEzIC02NTU1MzE1NTg3MDkuNDU4MjE2ODkzMDE5MTAxNDQ2MSAtPiA2NTI4ODM5NjU0MDIuOTI5NTk5MjAxNjQ1NjMxMzg2OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDY1IGFkZCAyOTA0MDc4NjkwNjY1NzY1MTE2NjAzMjUzMDk5NjY4RS0zMjkgLTcxLjQ1NTg2NjE5MTc2MDkxNTk5MjY0NzE3MDQ3ODg1RSs3ODcgLT4gLTcuMTQ1NTg2NjE5MTc2MDkxNTk5MjY0NzE3MDQ3ODg1RSs3ODggSW5leGFjdCBSb3VuZGVkCitjb214MzA2NSBjb21wYXJlIDI5MDQwNzg2OTA2NjU3NjUxMTY2MDMyNTMwOTk2NjhFLTMyOSAtNzEuNDU1ODY2MTkxNzYwOTE1OTkyNjQ3MTcwNDc4ODVFKzc4NyAtPiAxCitkaXZ4MzA2NSBkaXZpZGUgMjkwNDA3ODY5MDY2NTc2NTExNjYwMzI1MzA5OTY2OEUtMzI5IC03MS40NTU4NjYxOTE3NjA5MTU5OTI2NDcxNzA0Nzg4NUUrNzg3IC0+IC00LjA2NDE1NzE0NDAzNjcxMjMyNTA4NDQ3MjAyMjMxNkUtMTA4OCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDY1IGRpdmlkZWludCAyOTA0MDc4NjkwNjY1NzY1MTE2NjAzMjUzMDk5NjY4RS0zMjkgLTcxLjQ1NTg2NjE5MTc2MDkxNTk5MjY0NzE3MDQ3ODg1RSs3ODcgLT4gLTAKK211bHgzMDY1IG11bHRpcGx5IDI5MDQwNzg2OTA2NjU3NjUxMTY2MDMyNTMwOTk2NjhFLTMyOSAtNzEuNDU1ODY2MTkxNzYwOTE1OTkyNjQ3MTcwNDc4ODVFKzc4NyAtPiAtMi4wNzUxMzQ1ODMzMDU1NzE1Mjc5NjI3MTAwMTcyNjJFKzQ5MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDY1IHBvd2VyIDI5MDQwNzg2OTA2NjU3NjUxMTY2MDMyNTMwOTk2NjhFLTMyOSAtNyAtPiA1Ljc0MDM4OTIwODg0Mjg5NTU2MTI1MDEyODQwNzgwM0UrMjA4OSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDY1IHJlbWFpbmRlciAyOTA0MDc4NjkwNjY1NzY1MTE2NjAzMjUzMDk5NjY4RS0zMjkgLTcxLjQ1NTg2NjE5MTc2MDkxNTk5MjY0NzE3MDQ3ODg1RSs3ODcgLT4gMi45MDQwNzg2OTA2NjU3NjUxMTY2MDMyNTMwOTk2NjhFLTI5OQorc3VieDMwNjUgc3VidHJhY3QgMjkwNDA3ODY5MDY2NTc2NTExNjYwMzI1MzA5OTY2OEUtMzI5IC03MS40NTU4NjYxOTE3NjA5MTU5OTI2NDcxNzA0Nzg4NUUrNzg3IC0+IDcuMTQ1NTg2NjE5MTc2MDkxNTk5MjY0NzE3MDQ3ODg1RSs3ODggSW5leGFjdCBSb3VuZGVkCithZGR4MzA2NiBhZGQgMjIwOTQzMzg5NzIuMzkxMDk3MjY1MjI0Nzc5OTk1MTUgLTQwOTg0NjU0OTM3MS4zOTAwODA1MDM5NjY4NDE3MjAzRS00OTkgLT4gMjIwOTQzMzg5NzIuMzkxMDk3MjY1MjI0Nzc5OTk1MTUgSW5leGFjdCBSb3VuZGVkCitjb214MzA2NiBjb21wYXJlIDIyMDk0MzM4OTcyLjM5MTA5NzI2NTIyNDc3OTk5NTE1IC00MDk4NDY1NDkzNzEuMzkwMDgwNTAzOTY2ODQxNzIwM0UtNDk5IC0+IDEKK2RpdngzMDY2IGRpdmlkZSAyMjA5NDMzODk3Mi4zOTEwOTcyNjUyMjQ3Nzk5OTUxNSAtNDA5ODQ2NTQ5MzcxLjM5MDA4MDUwMzk2Njg0MTcyMDNFLTQ5OSAtPiAtNS4zOTA4ODA4MDgwMTkxNzQxOTQwMTAyMjQ3MzY5NjVFKzQ5NyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDY2IGRpdmlkZWludCAyMjA5NDMzODk3Mi4zOTEwOTcyNjUyMjQ3Nzk5OTUxNSAtNDA5ODQ2NTQ5MzcxLjM5MDA4MDUwMzk2Njg0MTcyMDNFLTQ5OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMwNjYgbXVsdGlwbHkgMjIwOTQzMzg5NzIuMzkxMDk3MjY1MjI0Nzc5OTk1MTUgLTQwOTg0NjU0OTM3MS4zOTAwODA1MDM5NjY4NDE3MjAzRS00OTkgLT4gLTkuMDU1Mjg4NTg4NDc2MzE1ODIyMTEzOTc1NDI2NzMwRS00NzggSW5leGFjdCBSb3VuZGVkCitwb3d4MzA2NiBwb3dlciAyMjA5NDMzODk3Mi4zOTEwOTcyNjUyMjQ3Nzk5OTUxNSAtNCAtPiA0LjE5NjM5MTAyMjM1NDEyMjY4NjcyNTMxNTIwOTk2N0UtNDIgSW5leGFjdCBSb3VuZGVkCityZW14MzA2NiByZW1haW5kZXIgMjIwOTQzMzg5NzIuMzkxMDk3MjY1MjI0Nzc5OTk1MTUgLTQwOTg0NjU0OTM3MS4zOTAwODA1MDM5NjY4NDE3MjAzRS00OTkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDY2IHN1YnRyYWN0IDIyMDk0MzM4OTcyLjM5MTA5NzI2NTIyNDc3OTk5NTE1IC00MDk4NDY1NDkzNzEuMzkwMDgwNTAzOTY2ODQxNzIwM0UtNDk5IC0+IDIyMDk0MzM4OTcyLjM5MTA5NzI2NTIyNDc3OTk5NTE1IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNjcgYWRkIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC0zMzc0OTg4NTgxNjA3NTg2MDYxMTczMjQ4MzA1OTIzIEluZXhhY3QgUm91bmRlZAorY29teDMwNjcgY29tcGFyZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtMQorZGl2eDMwNjcgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00MTAxMTQwODg4Mzc5NjgxNzc5Ny44MTMxMDk3NzAzOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDY3IGRpdmlkZWludCAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNDEwMTE0MDg4ODM3OTY4MTc3OTcKK211bHgzMDY3IG11bHRpcGx5IC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC0yLjc3NzQwOTU2MzgyNTUxMjIwMjc5MzMzNjEzMjMxMEUrNDEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA2NyBwb3dlciAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4IC0+IDEuNjgzMzY1NjU3MjM4ODc4MDU3NjIwNjM0MjA3MjY3RSsyNDQgSW5leGFjdCBSb3VuZGVkCityZW14MzA2NyByZW1haW5kZXIgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTY2OTEzOTcwMTY4LjYyMDQ2MjU3MTc1NTY2Mzg0MjQzCitzdWJ4MzA2NyBzdWJ0cmFjdCAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtMzM3NDk4ODU4MTYwNzU4NjA2MTMzNzgzNjA5NjE3MyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDY4IGFkZCAtODQxNzI1NTgxNjA2NjEuMzU4NjM4MzEwMjkzNTIzMjMgLTExMjcxLjU4OTE2NjAwOTMxMTU1OTM3MjkxOTA0ODkwIC0+IC04NDE3MjU1ODE3MTkzMi45NDc4MDQzMTk2MDUwODI2MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDY4IGNvbXBhcmUgLTg0MTcyNTU4MTYwNjYxLjM1ODYzODMxMDI5MzUyMzIzIC0xMTI3MS41ODkxNjYwMDkzMTE1NTkzNzI5MTkwNDg5MCAtPiAtMQorZGl2eDMwNjggZGl2aWRlIC04NDE3MjU1ODE2MDY2MS4zNTg2MzgzMTAyOTM1MjMyMyAtMTEyNzEuNTg5MTY2MDA5MzExNTU5MzcyOTE5MDQ4OTAgLT4gNzQ2NzY3NDQyNi40Njc5ODY3MzY0NTk2NzgzNDc1ODcgSW5leGFjdCBSb3VuZGVkCitkdml4MzA2OCBkaXZpZGVpbnQgLTg0MTcyNTU4MTYwNjYxLjM1ODYzODMxMDI5MzUyMzIzIC0xMTI3MS41ODkxNjYwMDkzMTE1NTkzNzI5MTkwNDg5MCAtPiA3NDY3Njc0NDI2CittdWx4MzA2OCBtdWx0aXBseSAtODQxNzI1NTgxNjA2NjEuMzU4NjM4MzEwMjkzNTIzMjMgLTExMjcxLjU4OTE2NjAwOTMxMTU1OTM3MjkxOTA0ODkwIC0+IDk0ODc1ODQ5NDYzODk5OTIzNS4xOTUzMDIyOTcwNzU1IEluZXhhY3QgUm91bmRlZAorcG93eDMwNjggcG93ZXIgLTg0MTcyNTU4MTYwNjYxLjM1ODYzODMxMDI5MzUyMzIzIC0xMTI3MiAtPiAwRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzA2OCByZW1haW5kZXIgLTg0MTcyNTU4MTYwNjYxLjM1ODYzODMxMDI5MzUyMzIzIC0xMTI3MS41ODkxNjYwMDkzMTE1NTkzNzI5MTkwNDg5MCAtPiAtNTI3NC45NTQyMjg1MTQ5NjUzNDQ3OTEyMjY1Njg2MAorc3VieDMwNjggc3VidHJhY3QgLTg0MTcyNTU4MTYwNjYxLjM1ODYzODMxMDI5MzUyMzIzIC0xMTI3MS41ODkxNjYwMDkzMTE1NTkzNzI5MTkwNDg5MCAtPiAtODQxNzI1NTgxNDkzODkuNzY5NDcyMzAwOTgxOTYzODYgSW5leGFjdCBSb3VuZGVkCithZGR4MzA2OSBhZGQgLTcwMDQ2OTMyMzI0NjE0LjkwNTk2Mzk2MjM3NTA4NTQxRS01NjggMzMuNjMxNjM5NjQwMDQ2MDg4NjU4MzY1NzcyOTc2OThFLTkxOCAtPiAtNy4wMDQ2OTMyMzI0NjE0OTA1OTYzOTYyMzc1MDg1NDFFLTU1NSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDY5IGNvbXBhcmUgLTcwMDQ2OTMyMzI0NjE0LjkwNTk2Mzk2MjM3NTA4NTQxRS01NjggMzMuNjMxNjM5NjQwMDQ2MDg4NjU4MzY1NzcyOTc2OThFLTkxOCAtPiAtMQorZGl2eDMwNjkgZGl2aWRlIC03MDA0NjkzMjMyNDYxNC45MDU5NjM5NjIzNzUwODU0MUUtNTY4IDMzLjYzMTYzOTY0MDA0NjA4ODY1ODM2NTc3Mjk3Njk4RS05MTggLT4gLTIuMDgyNzY4ODc2OTk1NDYzNDg3OTI2OTIwMDcyMzU5RSszNjIgSW5leGFjdCBSb3VuZGVkCitkdml4MzA2OSBkaXZpZGVpbnQgLTcwMDQ2OTMyMzI0NjE0LjkwNTk2Mzk2MjM3NTA4NTQxRS01NjggMzMuNjMxNjM5NjQwMDQ2MDg4NjU4MzY1NzcyOTc2OThFLTkxOCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMwNjkgbXVsdGlwbHkgLTcwMDQ2OTMyMzI0NjE0LjkwNTk2Mzk2MjM3NTA4NTQxRS01NjggMzMuNjMxNjM5NjQwMDQ2MDg4NjU4MzY1NzcyOTc2OThFLTkxOCAtPiAtMi4zNTU3OTMxODU4MzIxNDQzODgyODU5NDkwMjE3MzhFLTE0NzEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA2OSBwb3dlciAtNzAwNDY5MzIzMjQ2MTQuOTA1OTYzOTYyMzc1MDg1NDFFLTU2OCAzIC0+IC0zLjQzNjkwMzY3ODMwMjYzOTY3NzI4MDUwODQwOTgyOUUtMTY2MyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDY5IHJlbWFpbmRlciAtNzAwNDY5MzIzMjQ2MTQuOTA1OTYzOTYyMzc1MDg1NDFFLTU2OCAzMy42MzE2Mzk2NDAwNDYwODg2NTgzNjU3NzI5NzY5OEUtOTE4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzA2OSBzdWJ0cmFjdCAtNzAwNDY5MzIzMjQ2MTQuOTA1OTYzOTYyMzc1MDg1NDFFLTU2OCAzMy42MzE2Mzk2NDAwNDYwODg2NTgzNjU3NzI5NzY5OEUtOTE4IC0+IC03LjAwNDY5MzIzMjQ2MTQ5MDU5NjM5NjIzNzUwODU0MUUtNTU1IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNzAgYWRkIDAwMDQxMjUzODQ0MDcuMDUzNzgyNjYwMTE1NjgwODg2IC0zOTE0MjkwODQuNTg0NzMyMTQwMjUxNDM4NTYwMzIyM0UtNjQ4IC0+IDQxMjUzODQ0MDcuMDUzNzgyNjYwMTE1NjgwODg2MDAwIEluZXhhY3QgUm91bmRlZAorY29teDMwNzAgY29tcGFyZSAwMDA0MTI1Mzg0NDA3LjA1Mzc4MjY2MDExNTY4MDg4NiAtMzkxNDI5MDg0LjU4NDczMjE0MDI1MTQzODU2MDMyMjNFLTY0OCAtPiAxCitkaXZ4MzA3MCBkaXZpZGUgMDAwNDEyNTM4NDQwNy4wNTM3ODI2NjAxMTU2ODA4ODYgLTM5MTQyOTA4NC41ODQ3MzIxNDAyNTE0Mzg1NjAzMjIzRS02NDggLT4gLTEuMDUzOTI4OTQxMjg3MTMyNzE3MjUwNTQwOTU1NDU3RSs2NDkgSW5leGFjdCBSb3VuZGVkCitkdml4MzA3MCBkaXZpZGVpbnQgMDAwNDEyNTM4NDQwNy4wNTM3ODI2NjAxMTU2ODA4ODYgLTM5MTQyOTA4NC41ODQ3MzIxNDAyNTE0Mzg1NjAzMjIzRS02NDggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDcwIG11bHRpcGx5IDAwMDQxMjUzODQ0MDcuMDUzNzgyNjYwMTE1NjgwODg2IC0zOTE0MjkwODQuNTg0NzMyMTQwMjUxNDM4NTYwMzIyM0UtNjQ4IC0+IC0xLjYxNDc5NTQ0MjAxMzE5MDEzOTA4MDYzNDQ0OTI3M0UtNjMwIEluZXhhY3QgUm91bmRlZAorcG93eDMwNzAgcG93ZXIgMDAwNDEyNTM4NDQwNy4wNTM3ODI2NjAxMTU2ODA4ODYgLTQgLT4gMy40NTI1Njg1NDE1OTc0NTAxMDYyNjY1NTU3ODMzNjJFLTM5IEluZXhhY3QgUm91bmRlZAorcmVteDMwNzAgcmVtYWluZGVyIDAwMDQxMjUzODQ0MDcuMDUzNzgyNjYwMTE1NjgwODg2IC0zOTE0MjkwODQuNTg0NzMyMTQwMjUxNDM4NTYwMzIyM0UtNjQ4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzA3MCBzdWJ0cmFjdCAwMDA0MTI1Mzg0NDA3LjA1Mzc4MjY2MDExNTY4MDg4NiAtMzkxNDI5MDg0LjU4NDczMjE0MDI1MTQzODU2MDMyMjNFLTY0OCAtPiA0MTI1Mzg0NDA3LjA1Mzc4MjY2MDExNTY4MDg4NjAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDcxIGFkZCAtMzE4MjMxMzEuMTU2OTE1ODMzOTM4MjA2Mjg0ODA5OTdFLTQ0MCA5MjkxMy45MTU4Mjk0NzIzNzIwMDI4NjQyNzAzMDAyOEUrNzcxIC0+IDkuMjkxMzkxNTgyOTQ3MjM3MjAwMjg2NDI3MDMwMDI4RSs3NzUgSW5leGFjdCBSb3VuZGVkCitjb214MzA3MSBjb21wYXJlIC0zMTgyMzEzMS4xNTY5MTU4MzM5MzgyMDYyODQ4MDk5N0UtNDQwIDkyOTEzLjkxNTgyOTQ3MjM3MjAwMjg2NDI3MDMwMDI4RSs3NzEgLT4gLTEKK2RpdngzMDcxIGRpdmlkZSAtMzE4MjMxMzEuMTU2OTE1ODMzOTM4MjA2Mjg0ODA5OTdFLTQ0MCA5MjkxMy45MTU4Mjk0NzIzNzIwMDI4NjQyNzAzMDAyOEUrNzcxIC0+IC0zLjQyNTAxMjM3NTQ2ODI1MTQ0NzE5NDQwMDg0MTY1OEUtMTIwOSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDcxIGRpdmlkZWludCAtMzE4MjMxMzEuMTU2OTE1ODMzOTM4MjA2Mjg0ODA5OTdFLTQ0MCA5MjkxMy45MTU4Mjk0NzIzNzIwMDI4NjQyNzAzMDAyOEUrNzcxIC0+IC0wCittdWx4MzA3MSBtdWx0aXBseSAtMzE4MjMxMzEuMTU2OTE1ODMzOTM4MjA2Mjg0ODA5OTdFLTQ0MCA5MjkxMy45MTU4Mjk0NzIzNzIwMDI4NjQyNzAzMDAyOEUrNzcxIC0+IC0yLjk1NjgxMTcyOTc0MzkzNzU0MTk3Mzg0NTAyOTgxNkUrMzQzIEluZXhhY3QgUm91bmRlZAorcG93eDMwNzEgcG93ZXIgLTMxODIzMTMxLjE1NjkxNTgzMzkzODIwNjI4NDgwOTk3RS00NDAgOSAtPiAtMy4zNDcyMzQ4MDM0ODc1NzU4NzAzMjEzMzgzMDg2NTVFLTM4OTMgSW5leGFjdCBSb3VuZGVkCityZW14MzA3MSByZW1haW5kZXIgLTMxODIzMTMxLjE1NjkxNTgzMzkzODIwNjI4NDgwOTk3RS00NDAgOTI5MTMuOTE1ODI5NDcyMzcyMDAyODY0MjcwMzAwMjhFKzc3MSAtPiAtMy4xODIzMTMxMTU2OTE1ODMzOTM4MjA2Mjg0ODA5OTdFLTQzMworc3VieDMwNzEgc3VidHJhY3QgLTMxODIzMTMxLjE1NjkxNTgzMzkzODIwNjI4NDgwOTk3RS00NDAgOTI5MTMuOTE1ODI5NDcyMzcyMDAyODY0MjcwMzAwMjhFKzc3MSAtPiAtOS4yOTEzOTE1ODI5NDcyMzcyMDAyODY0MjcwMzAwMjhFKzc3NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDcyIGFkZCA1NTU3Mzg2Nzg4OC45MTU3NTMzMDU2MzY5ODEyODE1MCA1OTkuNTIzMTYxNDczNjIzMjE4ODM1NDM5MzIxMjIzNCAtPiA1NTU3Mzg2ODQ4OC40Mzg5MTQ3NzkyNjAyMDAxMTY5NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDcyIGNvbXBhcmUgNTU1NzM4Njc4ODguOTE1NzUzMzA1NjM2OTgxMjgxNTAgNTk5LjUyMzE2MTQ3MzYyMzIxODgzNTQzOTMyMTIyMzQgLT4gMQorZGl2eDMwNzIgZGl2aWRlIDU1NTczODY3ODg4LjkxNTc1MzMwNTYzNjk4MTI4MTUwIDU5OS41MjMxNjE0NzM2MjMyMTg4MzU0MzkzMjEyMjM0IC0+IDkyNjk2NzgyLjE0MzE4Nzk2NzYzMDk4MzM1NDk4NjU3IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNzIgZGl2aWRlaW50IDU1NTczODY3ODg4LjkxNTc1MzMwNTYzNjk4MTI4MTUwIDU5OS41MjMxNjE0NzM2MjMyMTg4MzU0MzkzMjEyMjM0IC0+IDkyNjk2NzgyCittdWx4MzA3MiBtdWx0aXBseSA1NTU3Mzg2Nzg4OC45MTU3NTMzMDU2MzY5ODEyODE1MCA1OTkuNTIzMTYxNDczNjIzMjE4ODM1NDM5MzIxMjIzNCAtPiAzMzMxNzgyMDk3MjA4MC4yNDM0NzcxNzU0MjIyMTQ3NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDcyIHBvd2VyIDU1NTczODY3ODg4LjkxNTc1MzMwNTYzNjk4MTI4MTUwIDYwMCAtPiA4LjM2MzI0MDY3MTA3MDEzNjI3ODIyMTk2NTYxNjk3M0UrNjQ0NiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDcyIHJlbWFpbmRlciA1NTU3Mzg2Nzg4OC45MTU3NTMzMDU2MzY5ODEyODE1MCA1OTkuNTIzMTYxNDczNjIzMjE4ODM1NDM5MzIxMjIzNCAtPiA4NS44NDQ1MDMwMzkxMDk5Njg2NDc4MjY1MTY5MDEyCitzdWJ4MzA3MiBzdWJ0cmFjdCA1NTU3Mzg2Nzg4OC45MTU3NTMzMDU2MzY5ODEyODE1MCA1OTkuNTIzMTYxNDczNjIzMjE4ODM1NDM5MzIxMjIzNCAtPiA1NTU3Mzg2NzI4OS4zOTI1OTE4MzIwMTM3NjI0NDYwNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDczIGFkZCAtNTQ0NzcyNzQ0ODQzMTY4MDg3ODY5OTU1NTcxNDc5NkUtODAwIDU0ODcyMDcuMTQyNjg3MDAxNjA3MDI2NjY1NTE1MzQ5RS0zNjIgLT4gNS40ODcyMDcxNDI2ODcwMDE2MDcwMjY2NjU1MTUzNDlFLTM1NiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDczIGNvbXBhcmUgLTU0NDc3Mjc0NDg0MzE2ODA4Nzg2OTk1NTU3MTQ3OTZFLTgwMCA1NDg3MjA3LjE0MjY4NzAwMTYwNzAyNjY2NTUxNTM0OUUtMzYyIC0+IC0xCitkaXZ4MzA3MyBkaXZpZGUgLTU0NDc3Mjc0NDg0MzE2ODA4Nzg2OTk1NTU3MTQ3OTZFLTgwMCA1NDg3MjA3LjE0MjY4NzAwMTYwNzAyNjY2NTUxNTM0OUUtMzYyIC0+IC05LjkyODA1MTM4NzExMDU4NzMyNzg4OTAwOTM2MzA2OUUtNDE1IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNzMgZGl2aWRlaW50IC01NDQ3NzI3NDQ4NDMxNjgwODc4Njk5NTU1NzE0Nzk2RS04MDAgNTQ4NzIwNy4xNDI2ODcwMDE2MDcwMjY2NjU1MTUzNDlFLTM2MiAtPiAtMAorbXVseDMwNzMgbXVsdGlwbHkgLTU0NDc3Mjc0NDg0MzE2ODA4Nzg2OTk1NTU3MTQ3OTZFLTgwMCA1NDg3MjA3LjE0MjY4NzAwMTYwNzAyNjY2NTUxNTM0OUUtMzYyIC0+IC0yLjk4OTI4MDg5NjY0NDYzNTM1MjgzODA4Nzg2NDM3M0UtMTEyNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDczIHBvd2VyIC01NDQ3NzI3NDQ4NDMxNjgwODc4Njk5NTU1NzE0Nzk2RS04MDAgNSAtPiAtNC43OTgxODM1NTMyNzg1NDMwNjUyMDQ4MzMzMDA3MjVFLTM4NDcgSW5leGFjdCBSb3VuZGVkCityZW14MzA3MyByZW1haW5kZXIgLTU0NDc3Mjc0NDg0MzE2ODA4Nzg2OTk1NTU3MTQ3OTZFLTgwMCA1NDg3MjA3LjE0MjY4NzAwMTYwNzAyNjY2NTUxNTM0OUUtMzYyIC0+IC01LjQ0NzcyNzQ0ODQzMTY4MDg3ODY5OTU1NTcxNDc5NkUtNzcwCitzdWJ4MzA3MyBzdWJ0cmFjdCAtNTQ0NzcyNzQ0ODQzMTY4MDg3ODY5OTU1NTcxNDc5NkUtODAwIDU0ODcyMDcuMTQyNjg3MDAxNjA3MDI2NjY1NTE1MzQ5RS0zNjIgLT4gLTUuNDg3MjA3MTQyNjg3MDAxNjA3MDI2NjY1NTE1MzQ5RS0zNTYgSW5leGFjdCBSb3VuZGVkCithZGR4MzA3NCBhZGQgMDQxODM0OTQwNDgzNC41NDcxMTAyMzk1NDIyOTAxMzQgMDk4MTk5MTUuOTI0MDUyODgwNjY2MDYxMjQ1NTQ4NDEgLT4gNDE4MzU5MjI0NzUwLjQ3MTE2MzEyMDIwODM1MTM3OTUgSW5leGFjdCBSb3VuZGVkCitjb214MzA3NCBjb21wYXJlIDA0MTgzNDk0MDQ4MzQuNTQ3MTEwMjM5NTQyMjkwMTM0IDA5ODE5OTE1LjkyNDA1Mjg4MDY2NjA2MTI0NTU0ODQxIC0+IDEKK2RpdngzMDc0IGRpdmlkZSAwNDE4MzQ5NDA0ODM0LjU0NzExMDIzOTU0MjI5MDEzNCAwOTgxOTkxNS45MjQwNTI4ODA2NjYwNjEyNDU1NDg0MSAtPiA0MjYwMi4xMzcxMzMzNTgwMzUxMzg3NDMzOTMwOTEzMiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDc0IGRpdmlkZWludCAwNDE4MzQ5NDA0ODM0LjU0NzExMDIzOTU0MjI5MDEzNCAwOTgxOTkxNS45MjQwNTI4ODA2NjYwNjEyNDU1NDg0MSAtPiA0MjYwMgorbXVseDMwNzQgbXVsdGlwbHkgMDQxODM0OTQwNDgzNC41NDcxMTAyMzk1NDIyOTAxMzQgMDk4MTk5MTUuOTI0MDUyODgwNjY2MDYxMjQ1NTQ4NDEgLT4gNDEwODE1NTk4MjM1MjgxNDM0OC4zNDM0NDEyOTkwODIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA3NCBwb3dlciAwNDE4MzQ5NDA0ODM0LjU0NzExMDIzOTU0MjI5MDEzNCA5ODE5OTE2IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMwNzQgcmVtYWluZGVyIDA0MTgzNDk0MDQ4MzQuNTQ3MTEwMjM5NTQyMjkwMTM0IDA5ODE5OTE1LjkyNDA1Mjg4MDY2NjA2MTI0NTU0ODQxIC0+IDEzNDY2MzguMDQ2Mjg4MTA0MDAxMTA3MjgwNjM3MTgKK3N1YngzMDc0IHN1YnRyYWN0IDA0MTgzNDk0MDQ4MzQuNTQ3MTEwMjM5NTQyMjkwMTM0IDA5ODE5OTE1LjkyNDA1Mjg4MDY2NjA2MTI0NTU0ODQxIC0+IDQxODMzOTU4NDkxOC42MjMwNTczNTg4NzYyMjg4ODg1IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNzUgYWRkIC0yNjIwMjEuNzU2NTE5NDczNzM5NjQ0ODAxNDI4NjQzNiAtNzk4Mzk5MjYwMDA5NDgzNjMwNDM4NzMyNDE2MjA0MkUrMzkwIC0+IC03Ljk4Mzk5MjYwMDA5NDgzNjMwNDM4NzMyNDE2MjA0MkUrNDIwIEluZXhhY3QgUm91bmRlZAorY29teDMwNzUgY29tcGFyZSAtMjYyMDIxLjc1NjUxOTQ3MzczOTY0NDgwMTQyODY0MzYgLTc5ODM5OTI2MDAwOTQ4MzYzMDQzODczMjQxNjIwNDJFKzM5MCAtPiAxCitkaXZ4MzA3NSBkaXZpZGUgLTI2MjAyMS43NTY1MTk0NzM3Mzk2NDQ4MDE0Mjg2NDM2IC03OTgzOTkyNjAwMDk0ODM2MzA0Mzg3MzI0MTYyMDQyRSszOTAgLT4gMy4yODE4Mzg2Njk0OTQyNzQ4OTYxODAzNzYzMjg0MzNFLTQxNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDc1IGRpdmlkZWludCAtMjYyMDIxLjc1NjUxOTQ3MzczOTY0NDgwMTQyODY0MzYgLTc5ODM5OTI2MDAwOTQ4MzYzMDQzODczMjQxNjIwNDJFKzM5MCAtPiAwCittdWx4MzA3NSBtdWx0aXBseSAtMjYyMDIxLjc1NjUxOTQ3MzczOTY0NDgwMTQyODY0MzYgLTc5ODM5OTI2MDAwOTQ4MzYzMDQzODczMjQxNjIwNDJFKzM5MCAtPiAyLjA5MTk3OTc2NTExNTMyOTI2ODI3NTgwMzM4NTUzNEUrNDI2IEluZXhhY3QgUm91bmRlZAorcG93eDMwNzUgcG93ZXIgLTI2MjAyMS43NTY1MTk0NzM3Mzk2NDQ4MDE0Mjg2NDM2IC04IC0+IDQuNTAwOTE4NzIxMDMzMDMzMDMyNzA2NzgyMzA0MTk1RS00NCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDc1IHJlbWFpbmRlciAtMjYyMDIxLjc1NjUxOTQ3MzczOTY0NDgwMTQyODY0MzYgLTc5ODM5OTI2MDAwOTQ4MzYzMDQzODczMjQxNjIwNDJFKzM5MCAtPiAtMjYyMDIxLjc1NjUxOTQ3MzczOTY0NDgwMTQyODY0MzYKK3N1YngzMDc1IHN1YnRyYWN0IC0yNjIwMjEuNzU2NTE5NDczNzM5NjQ0ODAxNDI4NjQzNiAtNzk4Mzk5MjYwMDA5NDgzNjMwNDM4NzMyNDE2MjA0MkUrMzkwIC0+IDcuOTgzOTkyNjAwMDk0ODM2MzA0Mzg3MzI0MTYyMDQyRSs0MjAgSW5leGFjdCBSb3VuZGVkCithZGR4MzA3NiBhZGQgNDg2OTYwNTA2MzEuNDI1NjUzODAzMDEyMDQ1OTIzOTJFLTUwNSAtMzM4Njg3NTIzMzkuODUwNTcyNjc2MDk5Njc4MDYxODdFKzgyMSAtPiAtMy4zODY4NzUyMzM5ODUwNTcyNjc2MDk5Njc4MDYxODdFKzgzMSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDc2IGNvbXBhcmUgNDg2OTYwNTA2MzEuNDI1NjUzODAzMDEyMDQ1OTIzOTJFLTUwNSAtMzM4Njg3NTIzMzkuODUwNTcyNjc2MDk5Njc4MDYxODdFKzgyMSAtPiAxCitkaXZ4MzA3NiBkaXZpZGUgNDg2OTYwNTA2MzEuNDI1NjUzODAzMDEyMDQ1OTIzOTJFLTUwNSAtMzM4Njg3NTIzMzkuODUwNTcyNjc2MDk5Njc4MDYxODdFKzgyMSAtPiAtMS40Mzc3ODY5NjQ4OTI5NzY1ODIwMDk5NTIxNzI0MjBFLTEzMjYgSW5leGFjdCBSb3VuZGVkCitkdml4MzA3NiBkaXZpZGVpbnQgNDg2OTYwNTA2MzEuNDI1NjUzODAzMDEyMDQ1OTIzOTJFLTUwNSAtMzM4Njg3NTIzMzkuODUwNTcyNjc2MDk5Njc4MDYxODdFKzgyMSAtPiAtMAorbXVseDMwNzYgbXVsdGlwbHkgNDg2OTYwNTA2MzEuNDI1NjUzODAzMDEyMDQ1OTIzOTJFLTUwNSAtMzM4Njg3NTIzMzkuODUwNTcyNjc2MDk5Njc4MDYxODdFKzgyMSAtPiAtMS42NDkyNzQ0Nzg3NjQ1Nzk1NjkyNDY0MjU2MTE2MjlFKzMzNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDc2IHBvd2VyIDQ4Njk2MDUwNjMxLjQyNTY1MzgwMzAxMjA0NTkyMzkyRS01MDUgLTMgLT4gOC42NjAwMTc2ODg3NzM3NTk0NjMwMjAzNDA3Nzg4NTNFKzE0ODIgSW5leGFjdCBSb3VuZGVkCityZW14MzA3NiByZW1haW5kZXIgNDg2OTYwNTA2MzEuNDI1NjUzODAzMDEyMDQ1OTIzOTJFLTUwNSAtMzM4Njg3NTIzMzkuODUwNTcyNjc2MDk5Njc4MDYxODdFKzgyMSAtPiA0Ljg2OTYwNTA2MzE0MjU2NTM4MDMwMTIwNDU5MjM5MkUtNDk1CitzdWJ4MzA3NiBzdWJ0cmFjdCA0ODY5NjA1MDYzMS40MjU2NTM4MDMwMTIwNDU5MjM5MkUtNTA1IC0zMzg2ODc1MjMzOS44NTA1NzI2NzYwOTk2NzgwNjE4N0UrODIxIC0+IDMuMzg2ODc1MjMzOTg1MDU3MjY3NjA5OTY3ODA2MTg3RSs4MzEgSW5leGFjdCBSb3VuZGVkCithZGR4MzA3NyBhZGQgOTUzMTY5OTkuMTk0NDAxNDQzNTY0NzExMjY2ODA3MDggLTYwNzkxLjMzODA1MDU3NDAyODQ1ODg1OTc4MzkwNDM1IC0+IDk1MjU2MjA3Ljg1NjM1MDg2OTUzNjI1MjQwNzAyMzE4IEluZXhhY3QgUm91bmRlZAorY29teDMwNzcgY29tcGFyZSA5NTMxNjk5OS4xOTQ0MDE0NDM1NjQ3MTEyNjY4MDcwOCAtNjA3OTEuMzM4MDUwNTc0MDI4NDU4ODU5NzgzOTA0MzUgLT4gMQorZGl2eDMwNzcgZGl2aWRlIDk1MzE2OTk5LjE5NDQwMTQ0MzU2NDcxMTI2NjgwNzA4IC02MDc5MS4zMzgwNTA1NzQwMjg0NTg4NTk3ODM5MDQzNSAtPiAtMTU2Ny45MzcxODA3MDY2NDE4NTY4NzAyODYxMjI2MjMgSW5leGFjdCBSb3VuZGVkCitkdml4MzA3NyBkaXZpZGVpbnQgOTUzMTY5OTkuMTk0NDAxNDQzNTY0NzExMjY2ODA3MDggLTYwNzkxLjMzODA1MDU3NDAyODQ1ODg1OTc4MzkwNDM1IC0+IC0xNTY3CittdWx4MzA3NyBtdWx0aXBseSA5NTMxNjk5OS4xOTQ0MDE0NDM1NjQ3MTEyNjY4MDcwOCAtNjA3OTEuMzM4MDUwNTc0MDI4NDU4ODU5NzgzOTA0MzUgLT4gLTU3OTQ0NDc5MTk5OTMuMTUwNDkzMzAxMDYxMTk1NzE0IEluZXhhY3QgUm91bmRlZAorcG93eDMwNzcgcG93ZXIgOTUzMTY5OTkuMTk0NDAxNDQzNTY0NzExMjY2ODA3MDggLTYwNzkxIC0+IDBFLTEwMDI5IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMDc3IHJlbWFpbmRlciA5NTMxNjk5OS4xOTQ0MDE0NDM1NjQ3MTEyNjY4MDcwOCAtNjA3OTEuMzM4MDUwNTc0MDI4NDU4ODU5NzgzOTA0MzUgLT4gNTY5NzIuNDY5MTUxOTQwOTY5Njc3OTg1NDI4OTYzNTUKK3N1YngzMDc3IHN1YnRyYWN0IDk1MzE2OTk5LjE5NDQwMTQ0MzU2NDcxMTI2NjgwNzA4IC02MDc5MS4zMzgwNTA1NzQwMjg0NTg4NTk3ODM5MDQzNSAtPiA5NTM3Nzc5MC41MzI0NTIwMTc1OTMxNzAxMjY1OTA5OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDc4IGFkZCAtNTMyNjcwMjI5NjQwMjcwODIzNDcyMjIxNTIyNDk3OUUtMTM2IDgwMzI0NTkuNDUwOTk4ODIwMjA1OTE2NTM4NTQzMjU4IC0+IDgwMzI0NTkuNDUwOTk4ODIwMjA1OTE2NTM4NTQzMjU4IEluZXhhY3QgUm91bmRlZAorY29teDMwNzggY29tcGFyZSAtNTMyNjcwMjI5NjQwMjcwODIzNDcyMjIxNTIyNDk3OUUtMTM2IDgwMzI0NTkuNDUwOTk4ODIwMjA1OTE2NTM4NTQzMjU4IC0+IC0xCitkaXZ4MzA3OCBkaXZpZGUgLTUzMjY3MDIyOTY0MDI3MDgyMzQ3MjIyMTUyMjQ5NzlFLTEzNiA4MDMyNDU5LjQ1MDk5ODgyMDIwNTkxNjUzODU0MzI1OCAtPiAtNi42MzE0NzExMzE0NzMxMTc0ODc4MzkyNDM1ODI4NzNFLTExMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDc4IGRpdmlkZWludCAtNTMyNjcwMjI5NjQwMjcwODIzNDcyMjIxNTIyNDk3OUUtMTM2IDgwMzI0NTkuNDUwOTk4ODIwMjA1OTE2NTM4NTQzMjU4IC0+IC0wCittdWx4MzA3OCBtdWx0aXBseSAtNTMyNjcwMjI5NjQwMjcwODIzNDcyMjIxNTIyNDk3OUUtMTM2IDgwMzI0NTkuNDUwOTk4ODIwMjA1OTE2NTM4NTQzMjU4IC0+IC00LjI3ODY1MjAyMDMzOTcwNTI2NTAxMzYzMjc1NzM0OUUtOTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA3OCBwb3dlciAtNTMyNjcwMjI5NjQwMjcwODIzNDcyMjIxNTIyNDk3OUUtMTM2IDgwMzI0NTkgLT4gLTBFLTEwMDI5IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMDc4IHJlbWFpbmRlciAtNTMyNjcwMjI5NjQwMjcwODIzNDcyMjIxNTIyNDk3OUUtMTM2IDgwMzI0NTkuNDUwOTk4ODIwMjA1OTE2NTM4NTQzMjU4IC0+IC01LjMyNjcwMjI5NjQwMjcwODIzNDcyMjIxNTIyNDk3OUUtMTA2CitzdWJ4MzA3OCBzdWJ0cmFjdCAtNTMyNjcwMjI5NjQwMjcwODIzNDcyMjIxNTIyNDk3OUUtMTM2IDgwMzI0NTkuNDUwOTk4ODIwMjA1OTE2NTM4NTQzMjU4IC0+IC04MDMyNDU5LjQ1MDk5ODgyMDIwNTkxNjUzODU0MzI1OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDc5IGFkZCA2Ny4xODc1MDY4NDA3OTUwMTU3NTMzNTQ4MjYxNTc4MEUtMjgxIDczNC4xMTY4ODQxNjgzNDM4NDEwMzE0ODQzMDExNTQxRS04NTQgLT4gNi43MTg3NTA2ODQwNzk1MDE1NzUzMzU0ODI2MTU3ODBFLTI4MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDc5IGNvbXBhcmUgNjcuMTg3NTA2ODQwNzk1MDE1NzUzMzU0ODI2MTU3ODBFLTI4MSA3MzQuMTE2ODg0MTY4MzQzODQxMDMxNDg0MzAxMTU0MUUtODU0IC0+IDEKK2RpdngzMDc5IGRpdmlkZSA2Ny4xODc1MDY4NDA3OTUwMTU3NTMzNTQ4MjYxNTc4MEUtMjgxIDczNC4xMTY4ODQxNjgzNDM4NDEwMzE0ODQzMDExNTQxRS04NTQgLT4gOS4xNTIxNTM4NzIxODc0NjA1OTg5NTg2MTY1OTI0NDJFKzU3MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDc5IGRpdmlkZWludCA2Ny4xODc1MDY4NDA3OTUwMTU3NTMzNTQ4MjYxNTc4MEUtMjgxIDczNC4xMTY4ODQxNjgzNDM4NDEwMzE0ODQzMDExNTQxRS04NTQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDc5IG11bHRpcGx5IDY3LjE4NzUwNjg0MDc5NTAxNTc1MzM1NDgyNjE1NzgwRS0yODEgNzM0LjExNjg4NDE2ODM0Mzg0MTAzMTQ4NDMwMTE1NDFFLTg1NCAtPiA0LjkzMjM0ODMxNzcwMDM3MjQwMTg0OTIzMTc2NzAwN0UtMTEzMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDc5IHBvd2VyIDY3LjE4NzUwNjg0MDc5NTAxNTc1MzM1NDgyNjE1NzgwRS0yODEgNyAtPiA2LjE4MDQ0NDA3MTAyMzExMTMwMDgxNzUxODQwOTU1MEUtMTk1NSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDc5IHJlbWFpbmRlciA2Ny4xODc1MDY4NDA3OTUwMTU3NTMzNTQ4MjYxNTc4MEUtMjgxIDczNC4xMTY4ODQxNjgzNDM4NDEwMzE0ODQzMDExNTQxRS04NTQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDc5IHN1YnRyYWN0IDY3LjE4NzUwNjg0MDc5NTAxNTc1MzM1NDgyNjE1NzgwRS0yODEgNzM0LjExNjg4NDE2ODM0Mzg0MTAzMTQ4NDMwMTE1NDFFLTg1NCAtPiA2LjcxODc1MDY4NDA3OTUwMTU3NTMzNTQ4MjYxNTc4MEUtMjgwIEluZXhhY3QgUm91bmRlZAorYWRkeDMwODAgYWRkIC04NzM5Mjk5MzcyMTE0LjA5MjQ4MjkxNDEzOTI4MTY2OSA1MDc2MTAwNzQuNzM0MzU3NzAyOTM0NTA3NzM4NTgzOCAtPiAtODczODc5MTc2MjAzOS4zNTgxMjUyMTEyMDQ3NzM5MzAgSW5leGFjdCBSb3VuZGVkCitjb214MzA4MCBjb21wYXJlIC04NzM5Mjk5MzcyMTE0LjA5MjQ4MjkxNDEzOTI4MTY2OSA1MDc2MTAwNzQuNzM0MzU3NzAyOTM0NTA3NzM4NTgzOCAtPiAtMQorZGl2eDMwODAgZGl2aWRlIC04NzM5Mjk5MzcyMTE0LjA5MjQ4MjkxNDEzOTI4MTY2OSA1MDc2MTAwNzQuNzM0MzU3NzAyOTM0NTA3NzM4NTgzOCAtPiAtMTcyMTYuNTYwMTI1Nzc2NzM3MzE2MTIxMzAwNjgxMzAgSW5leGFjdCBSb3VuZGVkCitkdml4MzA4MCBkaXZpZGVpbnQgLTg3MzkyOTkzNzIxMTQuMDkyNDgyOTE0MTM5MjgxNjY5IDUwNzYxMDA3NC43MzQzNTc3MDI5MzQ1MDc3Mzg1ODM4IC0+IC0xNzIxNgorbXVseDMwODAgbXVsdGlwbHkgLTg3MzkyOTkzNzIxMTQuMDkyNDgyOTE0MTM5MjgxNjY5IDUwNzYxMDA3NC43MzQzNTc3MDI5MzQ1MDc3Mzg1ODM4IC0+IC00NDM2MTU2NDA3NDA0NzU5ODMzODU3LjU4MDcwNzAyNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDgwIHBvd2VyIC04NzM5Mjk5MzcyMTE0LjA5MjQ4MjkxNDEzOTI4MTY2OSA1MDc2MTAwNzUgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMwODAgcmVtYWluZGVyIC04NzM5Mjk5MzcyMTE0LjA5MjQ4MjkxNDEzOTI4MTY2OSA1MDc2MTAwNzQuNzM0MzU3NzAyOTM0NTA3NzM4NTgzOCAtPiAtMjg0MzI1NDg3LjM5MDI2OTE5MzY1NDA1NDIxMDI5OTIKK3N1YngzMDgwIHN1YnRyYWN0IC04NzM5Mjk5MzcyMTE0LjA5MjQ4MjkxNDEzOTI4MTY2OSA1MDc2MTAwNzQuNzM0MzU3NzAyOTM0NTA3NzM4NTgzOCAtPiAtODczOTgwNjk4MjE4OC44MjY4NDA2MTcwNzM3ODk0MDggSW5leGFjdCBSb3VuZGVkCithZGR4MzA4MSBhZGQgMjQ1NC4wMDIwNzg0Njg5Mjg2NjUwMDgyMTc3Mjc3MzEgNTgzNTQ2MDM5LjYyMzM4NDI4NjkxMTk5NTA5ODIwMDlFLTE0NyAtPiAyNDU0LjAwMjA3ODQ2ODkyODY2NTAwODIxNzcyNzczMSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDgxIGNvbXBhcmUgMjQ1NC4wMDIwNzg0Njg5Mjg2NjUwMDgyMTc3Mjc3MzEgNTgzNTQ2MDM5LjYyMzM4NDI4NjkxMTk5NTA5ODIwMDlFLTE0NyAtPiAxCitkaXZ4MzA4MSBkaXZpZGUgMjQ1NC4wMDIwNzg0Njg5Mjg2NjUwMDgyMTc3Mjc3MzEgNTgzNTQ2MDM5LjYyMzM4NDI4NjkxMTk5NTA5ODIwMDlFLTE0NyAtPiA0LjIwNTMyNzI3ODEyMzExMjYxMTAwNjY1MjUzMzYxOEUrMTQxIEluZXhhY3QgUm91bmRlZAorZHZpeDMwODEgZGl2aWRlaW50IDI0NTQuMDAyMDc4NDY4OTI4NjY1MDA4MjE3NzI3NzMxIDU4MzU0NjAzOS42MjMzODQyODY5MTE5OTUwOTgyMDA5RS0xNDcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDgxIG11bHRpcGx5IDI0NTQuMDAyMDc4NDY4OTI4NjY1MDA4MjE3NzI3NzMxIDU4MzU0NjAzOS42MjMzODQyODY5MTE5OTUwOTgyMDA5RS0xNDcgLT4gMS40MzIwMjMxOTQxMTgwOTY4NDI4MDYwMTAyOTMwMjdFLTEzNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDgxIHBvd2VyIDI0NTQuMDAyMDc4NDY4OTI4NjY1MDA4MjE3NzI3NzMxIDYgLT4gMjE4Mzk4NDUyNzkyMjkzODUzNzg2LjkyNjMwNTQ0MjAgSW5leGFjdCBSb3VuZGVkCityZW14MzA4MSByZW1haW5kZXIgMjQ1NC4wMDIwNzg0Njg5Mjg2NjUwMDgyMTc3Mjc3MzEgNTgzNTQ2MDM5LjYyMzM4NDI4NjkxMTk5NTA5ODIwMDlFLTE0NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwODEgc3VidHJhY3QgMjQ1NC4wMDIwNzg0Njg5Mjg2NjUwMDgyMTc3Mjc3MzEgNTgzNTQ2MDM5LjYyMzM4NDI4NjkxMTk5NTA5ODIwMDlFLTE0NyAtPiAyNDU0LjAwMjA3ODQ2ODkyODY2NTAwODIxNzcyNzczMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDgyIGFkZCA3NjQ1NzguNTIwNDg0OTkzNjkxMjA2NjAzMzE3NzQyOSA2NDYwMy4xMzU3MTI1OTE2NDgxMjYwOTQzNjgzMjUwNiAtPiA4MjkxODEuNjU2MTk3NTg1MzM5MzMyNjk3Njg2MDY4MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDgyIGNvbXBhcmUgNzY0NTc4LjUyMDQ4NDk5MzY5MTIwNjYwMzMxNzc0MjkgNjQ2MDMuMTM1NzEyNTkxNjQ4MTI2MDk0MzY4MzI1MDYgLT4gMQorZGl2eDMwODIgZGl2aWRlIDc2NDU3OC41MjA0ODQ5OTM2OTEyMDY2MDMzMTc3NDI5IDY0NjAzLjEzNTcxMjU5MTY0ODEyNjA5NDM2ODMyNTA2IC0+IDExLjgzNTAwNjMzNjAxNTUzNTc4ODUxMTI0MjgxNDE3IEluZXhhY3QgUm91bmRlZAorZHZpeDMwODIgZGl2aWRlaW50IDc2NDU3OC41MjA0ODQ5OTM2OTEyMDY2MDMzMTc3NDI5IDY0NjAzLjEzNTcxMjU5MTY0ODEyNjA5NDM2ODMyNTA2IC0+IDExCittdWx4MzA4MiBtdWx0aXBseSA3NjQ1NzguNTIwNDg0OTkzNjkxMjA2NjAzMzE3NzQyOSA2NDYwMy4xMzU3MTI1OTE2NDgxMjYwOTQzNjgzMjUwNiAtPiA0OTM5NDE2OTkyMS44MjQ1ODA5NDEzODA5NjYyODk1NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDgyIHBvd2VyIDc2NDU3OC41MjA0ODQ5OTM2OTEyMDY2MDMzMTc3NDI5IDY0NjAzIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMwODIgcmVtYWluZGVyIDc2NDU3OC41MjA0ODQ5OTM2OTEyMDY2MDMzMTc3NDI5IDY0NjAzLjEzNTcxMjU5MTY0ODEyNjA5NDM2ODMyNTA2IC0+IDUzOTQ0LjAyNzY0NjQ4NTU2MTgxOTU2NTI2NjE2NzI0CitzdWJ4MzA4MiBzdWJ0cmFjdCA3NjQ1NzguNTIwNDg0OTkzNjkxMjA2NjAzMzE3NzQyOSA2NDYwMy4xMzU3MTI1OTE2NDgxMjYwOTQzNjgzMjUwNiAtPiA2OTk5NzUuMzg0NzcyNDAyMDQzMDgwNTA4OTQ5NDE3OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDgzIGFkZCAwNzkyMDMuNzMzMDEwMzc3NzcxNjkwMzUxODM2NzU2MCA4NDYzODg5MzQzNDcuNjMyNDAzNjEzMjk1OTY2NDcwNSAtPiA4NDYzODkwMTM1NTEuMzY1NDEzOTkxMDY3NjU2ODIyMyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDgzIGNvbXBhcmUgMDc5MjAzLjczMzAxMDM3Nzc3MTY5MDM1MTgzNjc1NjAgODQ2Mzg4OTM0MzQ3LjYzMjQwMzYxMzI5NTk2NjQ3MDUgLT4gLTEKK2RpdngzMDgzIGRpdmlkZSAwNzkyMDMuNzMzMDEwMzc3NzcxNjkwMzUxODM2NzU2MCA4NDYzODg5MzQzNDcuNjMyNDAzNjEzMjk1OTY2NDcwNSAtPiA5LjM1Nzg0MTI3MDg2MDMzOTg1ODE0NjQ3MTg3NjA0NEUtOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDgzIGRpdmlkZWludCAwNzkyMDMuNzMzMDEwMzc3NzcxNjkwMzUxODM2NzU2MCA4NDYzODg5MzQzNDcuNjMyNDAzNjEzMjk1OTY2NDcwNSAtPiAwCittdWx4MzA4MyBtdWx0aXBseSAwNzkyMDMuNzMzMDEwMzc3NzcxNjkwMzUxODM2NzU2MCA4NDYzODg5MzQzNDcuNjMyNDAzNjEzMjk1OTY2NDcwNSAtPiA2NzAzNzE2MzE3OTAwODAzNy4xOTk4MzU2NDc4OTIwMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDgzIHBvd2VyIDA3OTIwMy43MzMwMTAzNzc3NzE2OTAzNTE4MzY3NTYwIDggLT4gMS41NDg2OTI1NDk1MDMzNTY3ODgxMTU2ODI5OTY3NTZFKzM5IEluZXhhY3QgUm91bmRlZAorcmVteDMwODMgcmVtYWluZGVyIDA3OTIwMy43MzMwMTAzNzc3NzE2OTAzNTE4MzY3NTYwIDg0NjM4ODkzNDM0Ny42MzI0MDM2MTMyOTU5NjY0NzA1IC0+IDc5MjAzLjczMzAxMDM3Nzc3MTY5MDM1MTgzNjc1NjAKK3N1YngzMDgzIHN1YnRyYWN0IDA3OTIwMy43MzMwMTAzNzc3NzE2OTAzNTE4MzY3NTYwIDg0NjM4ODkzNDM0Ny42MzI0MDM2MTMyOTU5NjY0NzA1IC0+IC04NDYzODg4NTUxNDMuODk5MzkzMjM1NTI0Mjc2MTE4NyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDg0IGFkZCAtNDI3OC41ODE1MTQ2ODg2NjkyNDkyNDcwMDcxMjc4OTlFLTMyOSA1LjQ3NDk3Mzk5Mjk1MzkwMjYzMTg5MDIwODM2MDgyOSAtPiA1LjQ3NDk3Mzk5Mjk1MzkwMjYzMTg5MDIwODM2MDgyOSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDg0IGNvbXBhcmUgLTQyNzguNTgxNTE0Njg4NjY5MjQ5MjQ3MDA3MTI3ODk5RS0zMjkgNS40NzQ5NzM5OTI5NTM5MDI2MzE4OTAyMDgzNjA4MjkgLT4gLTEKK2RpdngzMDg0IGRpdmlkZSAtNDI3OC41ODE1MTQ2ODg2NjkyNDkyNDcwMDcxMjc4OTlFLTMyOSA1LjQ3NDk3Mzk5Mjk1MzkwMjYzMTg5MDIwODM2MDgyOSAtPiAtNy44MTQ3OTc4Nzg4NDg0NjkyODIwMzM4OTY5Njk1MzJFLTMyNyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDg0IGRpdmlkZWludCAtNDI3OC41ODE1MTQ2ODg2NjkyNDkyNDcwMDcxMjc4OTlFLTMyOSA1LjQ3NDk3Mzk5Mjk1MzkwMjYzMTg5MDIwODM2MDgyOSAtPiAtMAorbXVseDMwODQgbXVsdGlwbHkgLTQyNzguNTgxNTE0Njg4NjY5MjQ5MjQ3MDA3MTI3ODk5RS0zMjkgNS40NzQ5NzM5OTI5NTM5MDI2MzE4OTAyMDgzNjA4MjkgLT4gLTIuMzQyNTEyMjUxOTY1Mzc4MDI4NDMzNTg0NTM4ODcwRS0zMjUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA4NCBwb3dlciAtNDI3OC41ODE1MTQ2ODg2NjkyNDkyNDcwMDcxMjc4OTlFLTMyOSA1IC0+IC0xLjQzMzgzNDU4NzgwMTc3MTI0NDEwNDY3NjY4Mjk4NkUtMTYyNyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDg0IHJlbWFpbmRlciAtNDI3OC41ODE1MTQ2ODg2NjkyNDkyNDcwMDcxMjc4OTlFLTMyOSA1LjQ3NDk3Mzk5Mjk1MzkwMjYzMTg5MDIwODM2MDgyOSAtPiAtNC4yNzg1ODE1MTQ2ODg2NjkyNDkyNDcwMDcxMjc4OTlFLTMyNgorc3VieDMwODQgc3VidHJhY3QgLTQyNzguNTgxNTE0Njg4NjY5MjQ5MjQ3MDA3MTI3ODk5RS0zMjkgNS40NzQ5NzM5OTI5NTM5MDI2MzE4OTAyMDgzNjA4MjkgLT4gLTUuNDc0OTczOTkyOTUzOTAyNjMxODkwMjA4MzYwODI5IEluZXhhY3QgUm91bmRlZAorYWRkeDMwODUgYWRkIDYwODY3MDE5LjgxNzY0Nzk4ODQ1NDY4NDQ1MTk2ODY5RSs2NTEgNi4xNDk2MTI1NjU0MDQwODA1MDExNTcwOTM4NTE4OTVFKzgxNyAtPiA2LjE0OTYxMjU2NTQwNDA4MDUwMTE1NzA5Mzg1MTg5NUUrODE3IEluZXhhY3QgUm91bmRlZAorY29teDMwODUgY29tcGFyZSA2MDg2NzAxOS44MTc2NDc5ODg0NTQ2ODQ0NTE5Njg2OUUrNjUxIDYuMTQ5NjEyNTY1NDA0MDgwNTAxMTU3MDkzODUxODk1RSs4MTcgLT4gLTEKK2RpdngzMDg1IGRpdmlkZSA2MDg2NzAxOS44MTc2NDc5ODg0NTQ2ODQ0NTE5Njg2OUUrNjUxIDYuMTQ5NjEyNTY1NDA0MDgwNTAxMTU3MDkzODUxODk1RSs4MTcgLT4gOS44OTc2OTk5MjM0MTc2MTc5MjA5OTYxODc0MjA5NjhFLTE2MCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDg1IGRpdmlkZWludCA2MDg2NzAxOS44MTc2NDc5ODg0NTQ2ODQ0NTE5Njg2OUUrNjUxIDYuMTQ5NjEyNTY1NDA0MDgwNTAxMTU3MDkzODUxODk1RSs4MTcgLT4gMAorbXVseDMwODUgbXVsdGlwbHkgNjA4NjcwMTkuODE3NjQ3OTg4NDU0Njg0NDUxOTY4NjlFKzY1MSA2LjE0OTYxMjU2NTQwNDA4MDUwMTE1NzA5Mzg1MTg5NUUrODE3IC0+IDMuNzQzMDg1ODk4ODkzMDcyNTQ0MTk3NTY0MDEzNDk3RSsxNDc2IEluZXhhY3QgUm91bmRlZAorcG93eDMwODUgcG93ZXIgNjA4NjcwMTkuODE3NjQ3OTg4NDU0Njg0NDUxOTY4NjlFKzY1MSA2IC0+IDUuMDg1MDE0ODk3Mzg4ODcxNzM2NzY3NjAyMDg2NjQ2RSszOTUyIEluZXhhY3QgUm91bmRlZAorcmVteDMwODUgcmVtYWluZGVyIDYwODY3MDE5LjgxNzY0Nzk4ODQ1NDY4NDQ1MTk2ODY5RSs2NTEgNi4xNDk2MTI1NjU0MDQwODA1MDExNTcwOTM4NTE4OTVFKzgxNyAtPiA2LjA4NjcwMTk4MTc2NDc5ODg0NTQ2ODQ0NTE5Njg2OUUrNjU4CitzdWJ4MzA4NSBzdWJ0cmFjdCA2MDg2NzAxOS44MTc2NDc5ODg0NTQ2ODQ0NTE5Njg2OUUrNjUxIDYuMTQ5NjEyNTY1NDA0MDgwNTAxMTU3MDkzODUxODk1RSs4MTcgLT4gLTYuMTQ5NjEyNTY1NDA0MDgwNTAxMTU3MDkzODUxODk1RSs4MTcgSW5leGFjdCBSb3VuZGVkCithZGR4MzA4NiBhZGQgMTg1NTQ0MTc3MzgyMTcuNjIyMTg1OTA5NjU4MDM2MDVFLTM4MiAtMDg5NDUwNTkwOTUyOS4wNTIzNzg0NzQ2MTg0MzU3ODJFKzUyNyAtPiAtOC45NDUwNTkwOTUyOTA1MjM3ODQ3NDYxODQzNTc4MjBFKzUzOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDg2IGNvbXBhcmUgMTg1NTQ0MTc3MzgyMTcuNjIyMTg1OTA5NjU4MDM2MDVFLTM4MiAtMDg5NDUwNTkwOTUyOS4wNTIzNzg0NzQ2MTg0MzU3ODJFKzUyNyAtPiAxCitkaXZ4MzA4NiBkaXZpZGUgMTg1NTQ0MTc3MzgyMTcuNjIyMTg1OTA5NjU4MDM2MDVFLTM4MiAtMDg5NDUwNTkwOTUyOS4wNTIzNzg0NzQ2MTg0MzU3ODJFKzUyNyAtPiAtMi4wNzQyNjQ0MTEyODY3MDkyMjg2NzQ4NDE2NzI5NTRFLTkwOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDg2IGRpdmlkZWludCAxODU1NDQxNzczODIxNy42MjIxODU5MDk2NTgwMzYwNUUtMzgyIC0wODk0NTA1OTA5NTI5LjA1MjM3ODQ3NDYxODQzNTc4MkUrNTI3IC0+IC0wCittdWx4MzA4NiBtdWx0aXBseSAxODU1NDQxNzczODIxNy42MjIxODU5MDk2NTgwMzYwNUUtMzgyIC0wODk0NTA1OTA5NTI5LjA1MjM3ODQ3NDYxODQzNTc4MkUrNTI3IC0+IC0xLjY1OTcwMzYzMTQ3MDYzMzcwMDg4NDEzNjg4NzYxNEUrMTcwIEluZXhhY3QgUm91bmRlZAorcG93eDMwODYgcG93ZXIgMTg1NTQ0MTc3MzgyMTcuNjIyMTg1OTA5NjU4MDM2MDVFLTM4MiAtOSAtPiAzLjgzNjg0Mjk5ODI5NTUzMTg5OTA4MjY4ODcyMTUzMUUrMzMxOCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDg2IHJlbWFpbmRlciAxODU1NDQxNzczODIxNy42MjIxODU5MDk2NTgwMzYwNUUtMzgyIC0wODk0NTA1OTA5NTI5LjA1MjM3ODQ3NDYxODQzNTc4MkUrNTI3IC0+IDEuODU1NDQxNzczODIxNzYyMjE4NTkwOTY1ODAzNjA1RS0zNjkKK3N1YngzMDg2IHN1YnRyYWN0IDE4NTU0NDE3NzM4MjE3LjYyMjE4NTkwOTY1ODAzNjA1RS0zODIgLTA4OTQ1MDU5MDk1MjkuMDUyMzc4NDc0NjE4NDM1NzgyRSs1MjcgLT4gOC45NDUwNTkwOTUyOTA1MjM3ODQ3NDYxODQzNTc4MjBFKzUzOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDg3IGFkZCA2OTA3MzM1NTUxNzE0NC4zNjM1NjY4ODY0MjIxMzgzOSA5OTc3ODQ3ODI1MzUuNjEwNDYzNDgyMzYyNzMyNzAzM0UrMTE2IC0+IDkuOTc3ODQ3ODI1MzU2MTA0NjM0ODIzNjI3MzI3MDMzRSsxMjcgSW5leGFjdCBSb3VuZGVkCitjb214MzA4NyBjb21wYXJlIDY5MDczMzU1NTE3MTQ0LjM2MzU2Njg4NjQyMjEzODM5IDk5Nzc4NDc4MjUzNS42MTA0NjM0ODIzNjI3MzI3MDMzRSsxMTYgLT4gLTEKK2RpdngzMDg3IGRpdmlkZSA2OTA3MzM1NTUxNzE0NC4zNjM1NjY4ODY0MjIxMzgzOSA5OTc3ODQ3ODI1MzUuNjEwNDYzNDgyMzYyNzMyNzAzM0UrMTE2IC0+IDYuOTIyNjcwNzcyOTEwODA3Mzg4Mzk1Mzg0ODY2ODg0RS0xMTUgSW5leGFjdCBSb3VuZGVkCitkdml4MzA4NyBkaXZpZGVpbnQgNjkwNzMzNTU1MTcxNDQuMzYzNTY2ODg2NDIyMTM4MzkgOTk3Nzg0NzgyNTM1LjYxMDQ2MzQ4MjM2MjczMjcwMzNFKzExNiAtPiAwCittdWx4MzA4NyBtdWx0aXBseSA2OTA3MzM1NTUxNzE0NC4zNjM1NjY4ODY0MjIxMzgzOSA5OTc3ODQ3ODI1MzUuNjEwNDYzNDgyMzYyNzMyNzAzM0UrMTE2IC0+IDYuODkyMDM0MzAxMzY3ODc5ODAyNjkzNDIyMDY2NDI1RSsxNDEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA4NyBwb3dlciA2OTA3MzM1NTUxNzE0NC4zNjM1NjY4ODY0MjIxMzgzOSAxMCAtPiAyLjQ3MjMyNDg5MDg0MTMzNDMwMjYyODQzNTQ2MTUxNkUrMTM4IEluZXhhY3QgUm91bmRlZAorcmVteDMwODcgcmVtYWluZGVyIDY5MDczMzU1NTE3MTQ0LjM2MzU2Njg4NjQyMjEzODM5IDk5Nzc4NDc4MjUzNS42MTA0NjM0ODIzNjI3MzI3MDMzRSsxMTYgLT4gNjkwNzMzNTU1MTcxNDQuMzYzNTY2ODg2NDIyMTM4MzkKK3N1YngzMDg3IHN1YnRyYWN0IDY5MDczMzU1NTE3MTQ0LjM2MzU2Njg4NjQyMjEzODM5IDk5Nzc4NDc4MjUzNS42MTA0NjM0ODIzNjI3MzI3MDMzRSsxMTYgLT4gLTkuOTc3ODQ3ODI1MzU2MTA0NjM0ODIzNjI3MzI3MDMzRSsxMjcgSW5leGFjdCBSb3VuZGVkCithZGR4MzA4OCBhZGQgNDUwMjgyMjU5MDcyLjg2NTcwOTkzNTkxMDQyNzc0NzcgLTE3OTEzMDc5NjUzMTQzMDkxNzU0Nzc5MTEzNjk4MjQgLT4gLTE3OTEzMDc5NjUzMTQzMDkxNzUwMjc2MjkxMTA3NTEgSW5leGFjdCBSb3VuZGVkCitjb214MzA4OCBjb21wYXJlIDQ1MDI4MjI1OTA3Mi44NjU3MDk5MzU5MTA0Mjc3NDc3IC0xNzkxMzA3OTY1MzE0MzA5MTc1NDc3OTExMzY5ODI0IC0+IDEKK2RpdngzMDg4IGRpdmlkZSA0NTAyODIyNTkwNzIuODY1NzA5OTM1OTEwNDI3NzQ3NyAtMTc5MTMwNzk2NTMxNDMwOTE3NTQ3NzkxMTM2OTgyNCAtPiAtMi41MTM3MDY1NjQwOTYzNTA3MTQyMTM3NzEwMDY0ODNFLTE5IEluZXhhY3QgUm91bmRlZAorZHZpeDMwODggZGl2aWRlaW50IDQ1MDI4MjI1OTA3Mi44NjU3MDk5MzU5MTA0Mjc3NDc3IC0xNzkxMzA3OTY1MzE0MzA5MTc1NDc3OTExMzY5ODI0IC0+IC0wCittdWx4MzA4OCBtdWx0aXBseSA0NTAyODIyNTkwNzIuODY1NzA5OTM1OTEwNDI3NzQ3NyAtMTc5MTMwNzk2NTMxNDMwOTE3NTQ3NzkxMTM2OTgyNCAtPiAtOC4wNjU5NDE5NzMxNjk0NTcwNzE2NTA5OTY4NjE2NzdFKzQxIEluZXhhY3QgUm91bmRlZAorcG93eDMwODggcG93ZXIgNDUwMjgyMjU5MDcyLjg2NTcwOTkzNTkxMDQyNzc0NzcgLTIgLT4gNC45MzIwODI0NDIxOTQ1NDQ2NzE2MzM1NzAzNDg4MzhFLTI0IEluZXhhY3QgUm91bmRlZAorcmVteDMwODggcmVtYWluZGVyIDQ1MDI4MjI1OTA3Mi44NjU3MDk5MzU5MTA0Mjc3NDc3IC0xNzkxMzA3OTY1MzE0MzA5MTc1NDc3OTExMzY5ODI0IC0+IDQ1MDI4MjI1OTA3Mi44NjU3MDk5MzU5MTA0Mjc3NDc3CitzdWJ4MzA4OCBzdWJ0cmFjdCA0NTAyODIyNTkwNzIuODY1NzA5OTM1OTEwNDI3NzQ3NyAtMTc5MTMwNzk2NTMxNDMwOTE3NTQ3NzkxMTM2OTgyNCAtPiAxNzkxMzA3OTY1MzE0MzA5MTc1OTI4MTkzNjI4ODk3IEluZXhhY3QgUm91bmRlZAorYWRkeDMwODkgYWRkIDk1NDY3ODQxMS43ODM4MTQ5MjY2NDU1MTc3ODUwMDM3IDE0Mjk4OC43MDk2MjA0MjU0NTI5Mjg0MzM0Mjc4Nzk0IC0+IDk1NDgyMTQwMC40OTM0MzUzNTIwOTg0NDYyMTg0MzE2IEluZXhhY3QgUm91bmRlZAorY29teDMwODkgY29tcGFyZSA5NTQ2Nzg0MTEuNzgzODE0OTI2NjQ1NTE3Nzg1MDAzNyAxNDI5ODguNzA5NjIwNDI1NDUyOTI4NDMzNDI3ODc5NCAtPiAxCitkaXZ4MzA4OSBkaXZpZGUgOTU0Njc4NDExLjc4MzgxNDkyNjY0NTUxNzc4NTAwMzcgMTQyOTg4LjcwOTYyMDQyNTQ1MjkyODQzMzQyNzg3OTQgLT4gNjY3Ni41OTk5NTE5Njg4MTE1ODkzMzU0Mjc3NzAwNDYgSW5leGFjdCBSb3VuZGVkCitkdml4MzA4OSBkaXZpZGVpbnQgOTU0Njc4NDExLjc4MzgxNDkyNjY0NTUxNzc4NTAwMzcgMTQyOTg4LjcwOTYyMDQyNTQ1MjkyODQzMzQyNzg3OTQgLT4gNjY3NgorbXVseDMwODkgbXVsdGlwbHkgOTU0Njc4NDExLjc4MzgxNDkyNjY0NTUxNzc4NTAwMzcgMTQyOTg4LjcwOTYyMDQyNTQ1MjkyODQzMzQyNzg3OTQgLT4gMTM2NTA4MjM0MjAzNDQ0Ljg2OTQ4Nzk0MzE0MTIzNzUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA4OSBwb3dlciA5NTQ2Nzg0MTEuNzgzODE0OTI2NjQ1NTE3Nzg1MDAzNyAxNDI5ODkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzA4OSByZW1haW5kZXIgOTU0Njc4NDExLjc4MzgxNDkyNjY0NTUxNzc4NTAwMzcgMTQyOTg4LjcwOTYyMDQyNTQ1MjkyODQzMzQyNzg3OTQgLT4gODU3ODYuMzU3ODU0NjAyODk1Mjk2MjIwNDgwODI1Ngorc3VieDMwODkgc3VidHJhY3QgOTU0Njc4NDExLjc4MzgxNDkyNjY0NTUxNzc4NTAwMzcgMTQyOTg4LjcwOTYyMDQyNTQ1MjkyODQzMzQyNzg3OTQgLT4gOTU0NTM1NDIzLjA3NDE5NDUwMTE5MjU4OTM1MTU3NTggSW5leGFjdCBSb3VuZGVkCithZGR4MzA5MCBhZGQgLTkyNDQ1MzA5NzYuMjIwODEyMTI3MTU1ODUyMzg5ODA3RSs1NTcgNTQxMDg5LjQ3MTU0NDY4NTg4OTY2MTkwNzg2Mjc5NDEgLT4gLTkuMjQ0NTMwOTc2MjIwODEyMTI3MTU1ODUyMzg5ODA3RSs1NjYgSW5leGFjdCBSb3VuZGVkCitjb214MzA5MCBjb21wYXJlIC05MjQ0NTMwOTc2LjIyMDgxMjEyNzE1NTg1MjM4OTgwN0UrNTU3IDU0MTA4OS40NzE1NDQ2ODU4ODk2NjE5MDc4NjI3OTQxIC0+IC0xCitkaXZ4MzA5MCBkaXZpZGUgLTkyNDQ1MzA5NzYuMjIwODEyMTI3MTU1ODUyMzg5ODA3RSs1NTcgNTQxMDg5LjQ3MTU0NDY4NTg4OTY2MTkwNzg2Mjc5NDEgLT4gLTEuNzA4NTAzMjA3Mzk1NTkxMDAyMzcwNjQ5ODQ4NzU3RSs1NjEgSW5leGFjdCBSb3VuZGVkCitkdml4MzA5MCBkaXZpZGVpbnQgLTkyNDQ1MzA5NzYuMjIwODEyMTI3MTU1ODUyMzg5ODA3RSs1NTcgNTQxMDg5LjQ3MTU0NDY4NTg4OTY2MTkwNzg2Mjc5NDEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDkwIG11bHRpcGx5IC05MjQ0NTMwOTc2LjIyMDgxMjEyNzE1NTg1MjM4OTgwN0UrNTU3IDU0MTA4OS40NzE1NDQ2ODU4ODk2NjE5MDc4NjI3OTQxIC0+IC01LjAwMjExODM4MDYwMTc5ODM5MjM2MzA0MzU1ODk0MUUrNTcyIEluZXhhY3QgUm91bmRlZAorcG93eDMwOTAgcG93ZXIgLTkyNDQ1MzA5NzYuMjIwODEyMTI3MTU1ODUyMzg5ODA3RSs1NTcgNTQxMDg5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDkwIHJlbWFpbmRlciAtOTI0NDUzMDk3Ni4yMjA4MTIxMjcxNTU4NTIzODk4MDdFKzU1NyA1NDEwODkuNDcxNTQ0Njg1ODg5NjYxOTA3ODYyNzk0MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwOTAgc3VidHJhY3QgLTkyNDQ1MzA5NzYuMjIwODEyMTI3MTU1ODUyMzg5ODA3RSs1NTcgNTQxMDg5LjQ3MTU0NDY4NTg4OTY2MTkwNzg2Mjc5NDEgLT4gLTkuMjQ0NTMwOTc2MjIwODEyMTI3MTU1ODUyMzg5ODA3RSs1NjYgSW5leGFjdCBSb3VuZGVkCithZGR4MzA5MSBhZGQgLTc1NDkyMDI0LjIwOTkwMTk3MDA1OTc0MjQxOTc1NDQ5IC0xNDc2MDQyMTMxMTM0OC4zNTI2OTA0NDYzMzAwMDkyNyAtPiAtMTQ3NjA0OTY4MDMzNzIuNTYyNTkyNDE2Mzg5NzUxNjkgSW5leGFjdCBSb3VuZGVkCitjb214MzA5MSBjb21wYXJlIC03NTQ5MjAyNC4yMDk5MDE5NzAwNTk3NDI0MTk3NTQ0OSAtMTQ3NjA0MjEzMTEzNDguMzUyNjkwNDQ2MzMwMDA5MjcgLT4gMQorZGl2eDMwOTEgZGl2aWRlIC03NTQ5MjAyNC4yMDk5MDE5NzAwNTk3NDI0MTk3NTQ0OSAtMTQ3NjA0MjEzMTEzNDguMzUyNjkwNDQ2MzMwMDA5MjcgLT4gMC4wMDAwMDUxMTQ0ODk3OTc5MjA2Njg4MzYyNzgzNDQ2MzUxMDggSW5leGFjdCBSb3VuZGVkCitkdml4MzA5MSBkaXZpZGVpbnQgLTc1NDkyMDI0LjIwOTkwMTk3MDA1OTc0MjQxOTc1NDQ5IC0xNDc2MDQyMTMxMTM0OC4zNTI2OTA0NDYzMzAwMDkyNyAtPiAwCittdWx4MzA5MSBtdWx0aXBseSAtNzU0OTIwMjQuMjA5OTAxOTcwMDU5NzQyNDE5NzU0NDkgLTE0NzYwNDIxMzExMzQ4LjM1MjY5MDQ0NjMzMDAwOTI3IC0+IDExMTQyOTQwODI5ODQ2NjI4MjU4MzEuNDY0Nzg3NDg3IEluZXhhY3QgUm91bmRlZAorcG93eDMwOTEgcG93ZXIgLTc1NDkyMDI0LjIwOTkwMTk3MDA1OTc0MjQxOTc1NDQ5IC0xIC0+IC0xLjMyNDY0MzI0NjA0NjE2MjA4MjM0ODk3MDczNTU3NkUtOCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDkxIHJlbWFpbmRlciAtNzU0OTIwMjQuMjA5OTAxOTcwMDU5NzQyNDE5NzU0NDkgLTE0NzYwNDIxMzExMzQ4LjM1MjY5MDQ0NjMzMDAwOTI3IC0+IC03NTQ5MjAyNC4yMDk5MDE5NzAwNTk3NDI0MTk3NTQ0OQorc3VieDMwOTEgc3VidHJhY3QgLTc1NDkyMDI0LjIwOTkwMTk3MDA1OTc0MjQxOTc1NDQ5IC0xNDc2MDQyMTMxMTM0OC4zNTI2OTA0NDYzMzAwMDkyNyAtPiAxNDc2MDM0NTgxOTMyNC4xNDI3ODg0NzYyNzAyNjY4NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDkyIGFkZCAzMTc3NDcuNjk3MjIxNTcxNTQzNDE4NjU5NjE3ODAzNkUtNDUyIDI0NzU5NzYzLjMzMTQ0ODI0NjEzNTkxMjI4MDk3MzMwRSswOTIgLT4gMi40NzU5NzYzMzMxNDQ4MjQ2MTM1OTEyMjgwOTczMzBFKzk5IEluZXhhY3QgUm91bmRlZAorY29teDMwOTIgY29tcGFyZSAzMTc3NDcuNjk3MjIxNTcxNTQzNDE4NjU5NjE3ODAzNkUtNDUyIDI0NzU5NzYzLjMzMTQ0ODI0NjEzNTkxMjI4MDk3MzMwRSswOTIgLT4gLTEKK2RpdngzMDkyIGRpdmlkZSAzMTc3NDcuNjk3MjIxNTcxNTQzNDE4NjU5NjE3ODAzNkUtNDUyIDI0NzU5NzYzLjMzMTQ0ODI0NjEzNTkxMjI4MDk3MzMwRSswOTIgLT4gMS4yODMzMjI4MzcwMDc4NTIyNDc1OTQyMTYxNTE2MzRFLTU0NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDkyIGRpdmlkZWludCAzMTc3NDcuNjk3MjIxNTcxNTQzNDE4NjU5NjE3ODAzNkUtNDUyIDI0NzU5NzYzLjMzMTQ0ODI0NjEzNTkxMjI4MDk3MzMwRSswOTIgLT4gMAorbXVseDMwOTIgbXVsdGlwbHkgMzE3NzQ3LjY5NzIyMTU3MTU0MzQxODY1OTYxNzgwMzZFLTQ1MiAyNDc1OTc2My4zMzE0NDgyNDYxMzU5MTIyODA5NzMzMEUrMDkyIC0+IDcuODY3MzU3NzgyMzE4Nzg2ODYwNDA0OTk3NjQ3NTEzRS0zNDggSW5leGFjdCBSb3VuZGVkCitwb3d4MzA5MiBwb3dlciAzMTc3NDcuNjk3MjIxNTcxNTQzNDE4NjU5NjE3ODAzNkUtNDUyIDIgLT4gMS4wMDk2MzU5OTA4OTYxMTUwNDMzMzEyMzE0OTYyMDlFLTg5MyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDkyIHJlbWFpbmRlciAzMTc3NDcuNjk3MjIxNTcxNTQzNDE4NjU5NjE3ODAzNkUtNDUyIDI0NzU5NzYzLjMzMTQ0ODI0NjEzNTkxMjI4MDk3MzMwRSswOTIgLT4gMy4xNzc0NzY5NzIyMTU3MTU0MzQxODY1OTYxNzgwMzZFLTQ0Nworc3VieDMwOTIgc3VidHJhY3QgMzE3NzQ3LjY5NzIyMTU3MTU0MzQxODY1OTYxNzgwMzZFLTQ1MiAyNDc1OTc2My4zMzE0NDgyNDYxMzU5MTIyODA5NzMzMEUrMDkyIC0+IC0yLjQ3NTk3NjMzMzE0NDgyNDYxMzU5MTIyODA5NzMzMEUrOTkgSW5leGFjdCBSb3VuZGVkCithZGR4MzA5MyBhZGQgLTguMTUzMzM0NDMwMzU4NjQ3MTM0MzM0NTQ1MzUzNDI3IC05LjcxNzg3MjAyNTgxNDU5NjU0ODQ2Mjg1NDg1MzUyMiAtPiAtMTcuODcxMjA2NDU2MTczMjQzNjgyNzk3NDAwMjA2OTUgSW5leGFjdCBSb3VuZGVkCitjb214MzA5MyBjb21wYXJlIC04LjE1MzMzNDQzMDM1ODY0NzEzNDMzNDU0NTM1MzQyNyAtOS43MTc4NzIwMjU4MTQ1OTY1NDg0NjI4NTQ4NTM1MjIgLT4gMQorZGl2eDMwOTMgZGl2aWRlIC04LjE1MzMzNDQzMDM1ODY0NzEzNDMzNDU0NTM1MzQyNyAtOS43MTc4NzIwMjU4MTQ1OTY1NDg0NjI4NTQ4NTM1MjIgLT4gMC44MzkwMDQwOTU2MTg4ODU5OTcyMDQ0MzQ0NTMyMDE5IEluZXhhY3QgUm91bmRlZAorZHZpeDMwOTMgZGl2aWRlaW50IC04LjE1MzMzNDQzMDM1ODY0NzEzNDMzNDU0NTM1MzQyNyAtOS43MTc4NzIwMjU4MTQ1OTY1NDg0NjI4NTQ4NTM1MjIgLT4gMAorbXVseDMwOTMgbXVsdGlwbHkgLTguMTUzMzM0NDMwMzU4NjQ3MTM0MzM0NTQ1MzUzNDI3IC05LjcxNzg3MjAyNTgxNDU5NjU0ODQ2Mjg1NDg1MzUyMiAtPiA3OS4yMzMwNjA1Nzc4OTMyODU3ODkwMjk2MDYwNTIyMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDkzIHBvd2VyIC04LjE1MzMzNDQzMDM1ODY0NzEzNDMzNDU0NTM1MzQyNyAtMTAgLT4gNy43MDI3Nzg5NjY4NzY3MjcwNTY2MzU5NTI4MDExNjJFLTEwIEluZXhhY3QgUm91bmRlZAorcmVteDMwOTMgcmVtYWluZGVyIC04LjE1MzMzNDQzMDM1ODY0NzEzNDMzNDU0NTM1MzQyNyAtOS43MTc4NzIwMjU4MTQ1OTY1NDg0NjI4NTQ4NTM1MjIgLT4gLTguMTUzMzM0NDMwMzU4NjQ3MTM0MzM0NTQ1MzUzNDI3CitzdWJ4MzA5MyBzdWJ0cmFjdCAtOC4xNTMzMzQ0MzAzNTg2NDcxMzQzMzQ1NDUzNTM0MjcgLTkuNzE3ODcyMDI1ODE0NTk2NTQ4NDYyODU0ODUzNTIyIC0+IDEuNTY0NTM3NTk1NDU1OTQ5NDE0MTI4MzA5NTAwMDk1CithZGR4MzA5NCBhZGQgNy4yNjczNDUxOTc0OTI5NjczMzIzMjA0NTYwNjI5NjFFLTQ3OCA1MDU0MDE1NDgxODMzLjI2MzU0MTE4OTkxNjIwODA2NSAtPiA1MDU0MDE1NDgxODMzLjI2MzU0MTE4OTkxNjIwODA2NSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDk0IGNvbXBhcmUgNy4yNjczNDUxOTc0OTI5NjczMzIzMjA0NTYwNjI5NjFFLTQ3OCA1MDU0MDE1NDgxODMzLjI2MzU0MTE4OTkxNjIwODA2NSAtPiAtMQorZGl2eDMwOTQgZGl2aWRlIDcuMjY3MzQ1MTk3NDkyOTY3MzMyMzIwNDU2MDYyOTYxRS00NzggNTA1NDAxNTQ4MTgzMy4yNjM1NDExODk5MTYyMDgwNjUgLT4gMS40Mzc5MzQ4OTAzMDk2MDY1OTQ4OTUyOTk1NTg2NTRFLTQ5MCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDk0IGRpdmlkZWludCA3LjI2NzM0NTE5NzQ5Mjk2NzMzMjMyMDQ1NjA2Mjk2MUUtNDc4IDUwNTQwMTU0ODE4MzMuMjYzNTQxMTg5OTE2MjA4MDY1IC0+IDAKK211bHgzMDk0IG11bHRpcGx5IDcuMjY3MzQ1MTk3NDkyOTY3MzMyMzIwNDU2MDYyOTYxRS00NzggNTA1NDAxNTQ4MTgzMy4yNjM1NDExODk5MTYyMDgwNjUgLT4gMy42NzI5Mjc1MTM5OTU2MDczMDgwNDg3Mzc3NTE5NzJFLTQ2NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDk0IHBvd2VyIDcuMjY3MzQ1MTk3NDkyOTY3MzMyMzIwNDU2MDYyOTYxRS00NzggNSAtPiAyLjAyNzExNzYxNjg0NjY2ODU2ODEwODA5NjU4Mzg5N0UtMjM4NiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDk0IHJlbWFpbmRlciA3LjI2NzM0NTE5NzQ5Mjk2NzMzMjMyMDQ1NjA2Mjk2MUUtNDc4IDUwNTQwMTU0ODE4MzMuMjYzNTQxMTg5OTE2MjA4MDY1IC0+IDcuMjY3MzQ1MTk3NDkyOTY3MzMyMzIwNDU2MDYyOTYxRS00NzgKK3N1YngzMDk0IHN1YnRyYWN0IDcuMjY3MzQ1MTk3NDkyOTY3MzMyMzIwNDU2MDYyOTYxRS00NzggNTA1NDAxNTQ4MTgzMy4yNjM1NDExODk5MTYyMDgwNjUgLT4gLTUwNTQwMTU0ODE4MzMuMjYzNTQxMTg5OTE2MjA4MDY1IEluZXhhY3QgUm91bmRlZAorYWRkeDMwOTUgYWRkIC0xMjIzMzU0MDI5Ljg2MjU2NzA1NDIzMDkxMjI3MTE3MSA4MTM1Nzc0MjIzNDAxMzIyNzg1NDc1MDE0ODU1NjI1IC0+IDgxMzU3NzQyMjM0MDEzMjI3ODU0NzM3OTE1MDE1OTUgSW5leGFjdCBSb3VuZGVkCitjb214MzA5NSBjb21wYXJlIC0xMjIzMzU0MDI5Ljg2MjU2NzA1NDIzMDkxMjI3MTE3MSA4MTM1Nzc0MjIzNDAxMzIyNzg1NDc1MDE0ODU1NjI1IC0+IC0xCitkaXZ4MzA5NSBkaXZpZGUgLTEyMjMzNTQwMjkuODYyNTY3MDU0MjMwOTEyMjcxMTcxIDgxMzU3NzQyMjM0MDEzMjI3ODU0NzUwMTQ4NTU2MjUgLT4gLTEuNTAzNjcyNTQwODkyMDIwMzM3Njg4Mjc3NTUzNjkyRS0yMiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDk1IGRpdmlkZWludCAtMTIyMzM1NDAyOS44NjI1NjcwNTQyMzA5MTIyNzExNzEgODEzNTc3NDIyMzQwMTMyMjc4NTQ3NTAxNDg1NTYyNSAtPiAtMAorbXVseDMwOTUgbXVsdGlwbHkgLTEyMjMzNTQwMjkuODYyNTY3MDU0MjMwOTEyMjcxMTcxIDgxMzU3NzQyMjM0MDEzMjI3ODU0NzUwMTQ4NTU2MjUgLT4gLTkuOTUyOTMyMTgyMjUwMDA1MTE5MzA3NDI5MDYwODk0RSszOSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDk1IHBvd2VyIC0xMjIzMzU0MDI5Ljg2MjU2NzA1NDIzMDkxMjI3MTE3MSA4IC0+IDUuMDE2Njg5ODg3MTkyODMwNjY2ODQ4MDY4ODQxMjI3RSs3MiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDk1IHJlbWFpbmRlciAtMTIyMzM1NDAyOS44NjI1NjcwNTQyMzA5MTIyNzExNzEgODEzNTc3NDIyMzQwMTMyMjc4NTQ3NTAxNDg1NTYyNSAtPiAtMTIyMzM1NDAyOS44NjI1NjcwNTQyMzA5MTIyNzExNzEKK3N1YngzMDk1IHN1YnRyYWN0IC0xMjIzMzU0MDI5Ljg2MjU2NzA1NDIzMDkxMjI3MTE3MSA4MTM1Nzc0MjIzNDAxMzIyNzg1NDc1MDE0ODU1NjI1IC0+IC04MTM1Nzc0MjIzNDAxMzIyNzg1NDc2MjM4MjA5NjU1IEluZXhhY3QgUm91bmRlZAorYWRkeDMwOTYgYWRkIDI4NTM5NzY0NDExMS41NjU1Njc5OTYxMjExMzQ5OTgyRSs2NDUgLTI0Nzk0OTk0Mjc2MTMxNTc1MTkzNTk2MjcyODA3MDQgLT4gMi44NTM5NzY0NDExMTU2NTU2Nzk5NjEyMTEzNDk5ODJFKzY1NiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDk2IGNvbXBhcmUgMjg1Mzk3NjQ0MTExLjU2NTU2Nzk5NjEyMTEzNDk5ODJFKzY0NSAtMjQ3OTQ5OTQyNzYxMzE1NzUxOTM1OTYyNzI4MDcwNCAtPiAxCitkaXZ4MzA5NiBkaXZpZGUgMjg1Mzk3NjQ0MTExLjU2NTU2Nzk5NjEyMTEzNDk5ODJFKzY0NSAtMjQ3OTQ5OTQyNzYxMzE1NzUxOTM1OTYyNzI4MDcwNCAtPiAtMS4xNTEwMjkyODAwNzY0OTU2MjY0MjExMzQ3MzMxMjJFKzYyNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDk2IGRpdmlkZWludCAyODUzOTc2NDQxMTEuNTY1NTY3OTk2MTIxMTM0OTk4MkUrNjQ1IC0yNDc5NDk5NDI3NjEzMTU3NTE5MzU5NjI3MjgwNzA0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzA5NiBtdWx0aXBseSAyODUzOTc2NDQxMTEuNTY1NTY3OTk2MTIxMTM0OTk4MkUrNjQ1IC0yNDc5NDk5NDI3NjEzMTU3NTE5MzU5NjI3MjgwNzA0IC0+IC03LjA3NjQzMjk1MjE2NzcwNDYxNDEzODQxMTc0MDAwMUUrNjg2IEluZXhhY3QgUm91bmRlZAorcG93eDMwOTYgcG93ZXIgMjg1Mzk3NjQ0MTExLjU2NTU2Nzk5NjEyMTEzNDk5ODJFKzY0NSAtMiAtPiAxLjIyNzcxOTcyMjA4Nzg2MDQwMTIzMzAzMDQ3OTQ1MUUtMTMxMyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDk2IHJlbWFpbmRlciAyODUzOTc2NDQxMTEuNTY1NTY3OTk2MTIxMTM0OTk4MkUrNjQ1IC0yNDc5NDk5NDI3NjEzMTU3NTE5MzU5NjI3MjgwNzA0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzA5NiBzdWJ0cmFjdCAyODUzOTc2NDQxMTEuNTY1NTY3OTk2MTIxMTM0OTk4MkUrNjQ1IC0yNDc5NDk5NDI3NjEzMTU3NTE5MzU5NjI3MjgwNzA0IC0+IDIuODUzOTc2NDQxMTE1NjU1Njc5OTYxMjExMzQ5OTgyRSs2NTYgSW5leGFjdCBSb3VuZGVkCithZGR4MzA5NyBhZGQgLTQ2NzMxMTIuNjYzNDQyMzY2MjkzODEyMzQ2NjUzNDI5IC0zNDI5Ljk5ODQwMzE0MjU0NjAwMTQzODIzODQ2MDk1OCAtPiAtNDY3NjU0Mi42NjE4NDU1MDg4Mzk4MTM3ODQ4OTE4OTAgSW5leGFjdCBSb3VuZGVkCitjb214MzA5NyBjb21wYXJlIC00NjczMTEyLjY2MzQ0MjM2NjI5MzgxMjM0NjY1MzQyOSAtMzQyOS45OTg0MDMxNDI1NDYwMDE0MzgyMzg0NjA5NTggLT4gLTEKK2RpdngzMDk3IGRpdmlkZSAtNDY3MzExMi42NjM0NDIzNjYyOTM4MTIzNDY2NTM0MjkgLTM0MjkuOTk4NDAzMTQyNTQ2MDAxNDM4MjM4NDYwOTU4IC0+IDEzNjIuNDI0MTUxMzIzNDc3NTA1MDY0Njg2NTg5NzE2IEluZXhhY3QgUm91bmRlZAorZHZpeDMwOTcgZGl2aWRlaW50IC00NjczMTEyLjY2MzQ0MjM2NjI5MzgxMjM0NjY1MzQyOSAtMzQyOS45OTg0MDMxNDI1NDYwMDE0MzgyMzg0NjA5NTggLT4gMTM2MgorbXVseDMwOTcgbXVsdGlwbHkgLTQ2NzMxMTIuNjYzNDQyMzY2MjkzODEyMzQ2NjUzNDI5IC0zNDI5Ljk5ODQwMzE0MjU0NjAwMTQzODIzODQ2MDk1OCAtPiAxNjAyODc2ODk3My4zMTI1MjYzOTQ3NjE0ODM3MTM2MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDk3IHBvd2VyIC00NjczMTEyLjY2MzQ0MjM2NjI5MzgxMjM0NjY1MzQyOSAtMzQzMCAtPiAwRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzA5NyByZW1haW5kZXIgLTQ2NzMxMTIuNjYzNDQyMzY2MjkzODEyMzQ2NjUzNDI5IC0zNDI5Ljk5ODQwMzE0MjU0NjAwMTQzODIzODQ2MDk1OCAtPiAtMTQ1NC44MzgzNjIyMTg2Mzk4NTM0NjU4Njk2MDQyMDQKK3N1YngzMDk3IHN1YnRyYWN0IC00NjczMTEyLjY2MzQ0MjM2NjI5MzgxMjM0NjY1MzQyOSAtMzQyOS45OTg0MDMxNDI1NDYwMDE0MzgyMzg0NjA5NTggLT4gLTQ2Njk2ODIuNjY1MDM5MjIzNzQ3ODEwOTA4NDE0OTY4IEluZXhhY3QgUm91bmRlZAorYWRkeDMwOTggYWRkIDg4Ljk2NDkyNDc5NjgxMjc4MDc5ODYxNDU2MDUxMTAzIDM4NjkzOS40NjIxMDA2NTE0NzUxODg5MDk2NTEwOTIzRSsxMzkgLT4gMy44NjkzOTQ2MjEwMDY1MTQ3NTE4ODkwOTY1MTA5MjNFKzE0NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDk4IGNvbXBhcmUgODguOTY0OTI0Nzk2ODEyNzgwNzk4NjE0NTYwNTExMDMgMzg2OTM5LjQ2MjEwMDY1MTQ3NTE4ODkwOTY1MTA5MjNFKzEzOSAtPiAtMQorZGl2eDMwOTggZGl2aWRlIDg4Ljk2NDkyNDc5NjgxMjc4MDc5ODYxNDU2MDUxMTAzIDM4NjkzOS40NjIxMDA2NTE0NzUxODg5MDk2NTEwOTIzRSsxMzkgLT4gMi4yOTkxOTQ5MjYwOTU5ODU2NDc4MjEzODU5Mzc2MThFLTE0MyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDk4IGRpdmlkZWludCA4OC45NjQ5MjQ3OTY4MTI3ODA3OTg2MTQ1NjA1MTEwMyAzODY5MzkuNDYyMTAwNjUxNDc1MTg4OTA5NjUxMDkyM0UrMTM5IC0+IDAKK211bHgzMDk4IG11bHRpcGx5IDg4Ljk2NDkyNDc5NjgxMjc4MDc5ODYxNDU2MDUxMTAzIDM4NjkzOS40NjIxMDA2NTE0NzUxODg5MDk2NTEwOTIzRSsxMzkgLT4gMy40NDI0MDQwMTQ2NzAzNjQ3NjM3ODA5NDYyOTc4NTZFKzE0NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDk4IHBvd2VyIDg4Ljk2NDkyNDc5NjgxMjc4MDc5ODYxNDU2MDUxMTAzIDQgLT4gNjI2NDMzOTEuNzMwNzgyOTAyMjY0NzQ3NTg4NTg5NzAgSW5leGFjdCBSb3VuZGVkCityZW14MzA5OCByZW1haW5kZXIgODguOTY0OTI0Nzk2ODEyNzgwNzk4NjE0NTYwNTExMDMgMzg2OTM5LjQ2MjEwMDY1MTQ3NTE4ODkwOTY1MTA5MjNFKzEzOSAtPiA4OC45NjQ5MjQ3OTY4MTI3ODA3OTg2MTQ1NjA1MTEwMworc3VieDMwOTggc3VidHJhY3QgODguOTY0OTI0Nzk2ODEyNzgwNzk4NjE0NTYwNTExMDMgMzg2OTM5LjQ2MjEwMDY1MTQ3NTE4ODkwOTY1MTA5MjNFKzEzOSAtPiAtMy44NjkzOTQ2MjEwMDY1MTQ3NTE4ODkwOTY1MTA5MjNFKzE0NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDk5IGFkZCAwNjQzMjY4NDYuNDI4NjQzNzMwNDc4ODA2OTQ0NDMyNkUtOTQyIDkyLjIzNjQ5OTQyMDEwODYyMDg3MTQ5MDE1MDkxMzUwIC0+IDkyLjIzNjQ5OTQyMDEwODYyMDg3MTQ5MDE1MDkxMzUwIEluZXhhY3QgUm91bmRlZAorY29teDMwOTkgY29tcGFyZSAwNjQzMjY4NDYuNDI4NjQzNzMwNDc4ODA2OTQ0NDMyNkUtOTQyIDkyLjIzNjQ5OTQyMDEwODYyMDg3MTQ5MDE1MDkxMzUwIC0+IC0xCitkaXZ4MzA5OSBkaXZpZGUgMDY0MzI2ODQ2LjQyODY0MzczMDQ3ODgwNjk0NDQzMjZFLTk0MiA5Mi4yMzY0OTk0MjAxMDg2MjA4NzE0OTAxNTA5MTM1MCAtPiA2Ljk3NDEyMDUzMDcwODIzMDIyOTM0NDM0OTUzMTcxOUUtOTM3IEluZXhhY3QgUm91bmRlZAorZHZpeDMwOTkgZGl2aWRlaW50IDA2NDMyNjg0Ni40Mjg2NDM3MzA0Nzg4MDY5NDQ0MzI2RS05NDIgOTIuMjM2NDk5NDIwMTA4NjIwODcxNDkwMTUwOTEzNTAgLT4gMAorbXVseDMwOTkgbXVsdGlwbHkgMDY0MzI2ODQ2LjQyODY0MzczMDQ3ODgwNjk0NDQzMjZFLTk0MiA5Mi4yMzY0OTk0MjAxMDg2MjA4NzE0OTAxNTA5MTM1MCAtPiA1LjkzMzI4MzEzMzMxMzAxMzc1NTgxNDQwNTQzNjM0MkUtOTMzIEluZXhhY3QgUm91bmRlZAorcG93eDMwOTkgcG93ZXIgMDY0MzI2ODQ2LjQyODY0MzczMDQ3ODgwNjk0NDQzMjZFLTk0MiA5MiAtPiAwRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzA5OSByZW1haW5kZXIgMDY0MzI2ODQ2LjQyODY0MzczMDQ3ODgwNjk0NDQzMjZFLTk0MiA5Mi4yMzY0OTk0MjAxMDg2MjA4NzE0OTAxNTA5MTM1MCAtPiA2LjQzMjY4NDY0Mjg2NDM3MzA0Nzg4MDY5NDQ0MzI2RS05MzUKK3N1YngzMDk5IHN1YnRyYWN0IDA2NDMyNjg0Ni40Mjg2NDM3MzA0Nzg4MDY5NDQ0MzI2RS05NDIgOTIuMjM2NDk5NDIwMTA4NjIwODcxNDkwMTUwOTEzNTAgLT4gLTkyLjIzNjQ5OTQyMDEwODYyMDg3MTQ5MDE1MDkxMzUwIEluZXhhY3QgUm91bmRlZAorYWRkeDMxMDAgYWRkIDUwNDUwNy4wMDQzOTQ5MzI0NDMzMTcwNDA1Njk5MzYwIDYwNTM4Ny43MTc1NTIyOTU1MzQ0NjU5MzExMDcyMDk5IC0+IDExMDk4OTQuNzIxOTQ3MjI3OTc3NzgyOTcxNjc3MTQ2IEluZXhhY3QgUm91bmRlZAorY29teDMxMDAgY29tcGFyZSA1MDQ1MDcuMDA0Mzk0OTMyNDQzMzE3MDQwNTY5OTM2MCA2MDUzODcuNzE3NTUyMjk1NTM0NDY1OTMxMTA3MjA5OSAtPiAtMQorZGl2eDMxMDAgZGl2aWRlIDUwNDUwNy4wMDQzOTQ5MzI0NDMzMTcwNDA1Njk5MzYwIDYwNTM4Ny43MTc1NTIyOTU1MzQ0NjU5MzExMDcyMDk5IC0+IDAuODMzMzYxODEwNTY3ODcxODg5NTIxNjA2NzQ2MzgzMiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMTAwIGRpdmlkZWludCA1MDQ1MDcuMDA0Mzk0OTMyNDQzMzE3MDQwNTY5OTM2MCA2MDUzODcuNzE3NTUyMjk1NTM0NDY1OTMxMTA3MjA5OSAtPiAwCittdWx4MzEwMCBtdWx0aXBseSA1MDQ1MDcuMDA0Mzk0OTMyNDQzMzE3MDQwNTY5OTM2MCA2MDUzODcuNzE3NTUyMjk1NTM0NDY1OTMxMTA3MjA5OSAtPiAzMDU0MjIzNDM4NzkuNzk0MDgzODYzMDQwMTY1NjU4NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTAwIHBvd2VyIDUwNDUwNy4wMDQzOTQ5MzI0NDMzMTcwNDA1Njk5MzYwIDYwNTM4OCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMTAwIHJlbWFpbmRlciA1MDQ1MDcuMDA0Mzk0OTMyNDQzMzE3MDQwNTY5OTM2MCA2MDUzODcuNzE3NTUyMjk1NTM0NDY1OTMxMTA3MjA5OSAtPiA1MDQ1MDcuMDA0Mzk0OTMyNDQzMzE3MDQwNTY5OTM2MAorc3VieDMxMDAgc3VidHJhY3QgNTA0NTA3LjAwNDM5NDkzMjQ0MzMxNzA0MDU2OTkzNjAgNjA1Mzg3LjcxNzU1MjI5NTUzNDQ2NTkzMTEwNzIwOTkgLT4gLTEwMDg4MC43MTMxNTczNjMwOTExNDg4OTA1MzcyNzM5CisKKy0tIHJhbmRvbWx5IGdlbmVyYXRlZCB0ZXN0Y2FzZXMgWzI2IFNlcCAyMDAxXQorcHJlY2lzaW9uOiAzMgorcm91bmRpbmc6IGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTk5CisKK2FkZHgzMjAxIGFkZCAxLjUyODM1NTAxNjM4Mzk3ODkzMTkxNDI0MzAyNTM2NDQgLTEuNjU3ODE1ODQ4NDgyMjk2OTUyMDQwNTI5MTM3OTQ5MiAtPiAtMC4xMjk0NjA4MzIwOTgzMTgwMjAxMjYyODYxMTI1ODQ4Citjb214MzIwMSBjb21wYXJlIDEuNTI4MzU1MDE2MzgzOTc4OTMxOTE0MjQzMDI1MzY0NCAtMS42NTc4MTU4NDg0ODIyOTY5NTIwNDA1MjkxMzc5NDkyIC0+IDEKK2RpdngzMjAxIGRpdmlkZSAxLjUyODM1NTAxNjM4Mzk3ODkzMTkxNDI0MzAyNTM2NDQgLTEuNjU3ODE1ODQ4NDgyMjk2OTUyMDQwNTI5MTM3OTQ5MiAtPiAtMC45MjE5MDg3OTgxMjMyNDMxMzYzMDI4Mjk4MDExMDI4MCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjAxIGRpdmlkZWludCAxLjUyODM1NTAxNjM4Mzk3ODkzMTkxNDI0MzAyNTM2NDQgLTEuNjU3ODE1ODQ4NDgyMjk2OTUyMDQwNTI5MTM3OTQ5MiAtPiAtMAorbXVseDMyMDEgbXVsdGlwbHkgMS41MjgzNTUwMTYzODM5Nzg5MzE5MTQyNDMwMjUzNjQ0IC0xLjY1NzgxNTg0ODQ4MjI5Njk1MjA0MDUyOTEzNzk0OTIgLT4gLTIuNTMzNzMxMTY4MjY4NzgwODkyNjYzMzkxMDc2MTYxNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjAxIHBvd2VyIDEuNTI4MzU1MDE2MzgzOTc4OTMxOTE0MjQzMDI1MzY0NCAtMiAtPiAwLjQyODEwNjE4OTE2NTg0OTI0NDUxNDY2NjkxNjAzMTI4IEluZXhhY3QgUm91bmRlZAorcmVteDMyMDEgcmVtYWluZGVyIDEuNTI4MzU1MDE2MzgzOTc4OTMxOTE0MjQzMDI1MzY0NCAtMS42NTc4MTU4NDg0ODIyOTY5NTIwNDA1MjkxMzc5NDkyIC0+IDEuNTI4MzU1MDE2MzgzOTc4OTMxOTE0MjQzMDI1MzY0NAorc3VieDMyMDEgc3VidHJhY3QgMS41MjgzNTUwMTYzODM5Nzg5MzE5MTQyNDMwMjUzNjQ0IC0xLjY1NzgxNTg0ODQ4MjI5Njk1MjA0MDUyOTEzNzk0OTIgLT4gMy4xODYxNzA4NjQ4NjYyNzU4ODM5NTQ3NzIxNjMzMTM2CithZGR4MzIwMiBhZGQgLTYyMjkwMzAzMDYwNS4yODY3NTAzOTM3ODM2NTA3MzI2IDY1MTkzODg2MDcuMTMzMTg1NTcwNDQ3MTMyODc5NTgyMSAtPiAtNjE2MzgzNjQxOTk4LjE1MzU2NDgyMzMzNjUxNzg1MzAyIEluZXhhY3QgUm91bmRlZAorY29teDMyMDIgY29tcGFyZSAtNjIyOTAzMDMwNjA1LjI4Njc1MDM5Mzc4MzY1MDczMjYgNjUxOTM4ODYwNy4xMzMxODU1NzA0NDcxMzI4Nzk1ODIxIC0+IC0xCitkaXZ4MzIwMiBkaXZpZGUgLTYyMjkwMzAzMDYwNS4yODY3NTAzOTM3ODM2NTA3MzI2IDY1MTkzODg2MDcuMTMzMTg1NTcwNDQ3MTMyODc5NTgyMSAtPiAtOTUuNTQ2MjM0MTg1Nzg1MTEwNDkxNjc2ODk0MTUzNTEwIEluZXhhY3QgUm91bmRlZAorZHZpeDMyMDIgZGl2aWRlaW50IC02MjI5MDMwMzA2MDUuMjg2NzUwMzkzNzgzNjUwNzMyNiA2NTE5Mzg4NjA3LjEzMzE4NTU3MDQ0NzEzMjg3OTU4MjEgLT4gLTk1CittdWx4MzIwMiBtdWx0aXBseSAtNjIyOTAzMDMwNjA1LjI4Njc1MDM5Mzc4MzY1MDczMjYgNjUxOTM4ODYwNy4xMzMxODU1NzA0NDcxMzI4Nzk1ODIxIC0+IC00MDYwOTQ2OTIxMDc2ODQwNDQ5OTQ5LjY5ODg4Mjg0ODYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIwMiBwb3dlciAtNjIyOTAzMDMwNjA1LjI4Njc1MDM5Mzc4MzY1MDczMjYgNyAtPiAtMy42Mzg2NzM2NTk3NzAyNDA0MzUyODEzMzA4MDY0MzAwRSs4MiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjAyIHJlbWFpbmRlciAtNjIyOTAzMDMwNjA1LjI4Njc1MDM5Mzc4MzY1MDczMjYgNjUxOTM4ODYwNy4xMzMxODU1NzA0NDcxMzI4Nzk1ODIxIC0+IC0zNTYxMTEyOTI3LjYzNDEyMTIwMTMwNjAyNzE3MjMwMDUKK3N1YngzMjAyIHN1YnRyYWN0IC02MjI5MDMwMzA2MDUuMjg2NzUwMzkzNzgzNjUwNzMyNiA2NTE5Mzg4NjA3LjEzMzE4NTU3MDQ0NzEzMjg3OTU4MjEgLT4gLTYyOTQyMjQxOTIxMi40MTk5MzU5NjQyMzA3ODM2MTIxOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjAzIGFkZCAtNTY3NTkxNS4yNDY1NDU3NDg3NjMyMjUwMjQ1MjA5MDU0IDczOTEzOTA5ODgwLjM4MTM2Nzg5NTIwNTA4NjAyNzQxNiAtPiA3MzkwODIzMzk2NS4xMzQ4MjIxNDY0NDE4NjEwMDI4OTUgSW5leGFjdCBSb3VuZGVkCitjb214MzIwMyBjb21wYXJlIC01Njc1OTE1LjI0NjU0NTc0ODc2MzIyNTAyNDUyMDkwNTQgNzM5MTM5MDk4ODAuMzgxMzY3ODk1MjA1MDg2MDI3NDE2IC0+IC0xCitkaXZ4MzIwMyBkaXZpZGUgLTU2NzU5MTUuMjQ2NTQ1NzQ4NzYzMjI1MDI0NTIwOTA1NCA3MzkxMzkwOTg4MC4zODEzNjc4OTUyMDUwODYwMjc0MTYgLT4gLTAuMDAwMDc2NzkwODk0Mzc2MDU2ODI3NTUyMzg4MDU0NjU3MDgyIEluZXhhY3QgUm91bmRlZAorZHZpeDMyMDMgZGl2aWRlaW50IC01Njc1OTE1LjI0NjU0NTc0ODc2MzIyNTAyNDUyMDkwNTQgNzM5MTM5MDk4ODAuMzgxMzY3ODk1MjA1MDg2MDI3NDE2IC0+IC0wCittdWx4MzIwMyBtdWx0aXBseSAtNTY3NTkxNS4yNDY1NDU3NDg3NjMyMjUwMjQ1MjA5MDU0IDczOTEzOTA5ODgwLjM4MTM2Nzg5NTIwNTA4NjAyNzQxNiAtPiAtNDE5NTI5MDg4MDIxODY1MDY3LjIzMzA3MzUyOTczNTg5IEluZXhhY3QgUm91bmRlZAorcG93eDMyMDMgcG93ZXIgLTU2NzU5MTUuMjQ2NTQ1NzQ4NzYzMjI1MDI0NTIwOTA1NCA3IC0+IC0xLjg5NzgwMzgwNjAyMDc3NzcyMzEzODkyMzQ3MjE5MDhFKzQ3IEluZXhhY3QgUm91bmRlZAorcmVteDMyMDMgcmVtYWluZGVyIC01Njc1OTE1LjI0NjU0NTc0ODc2MzIyNTAyNDUyMDkwNTQgNzM5MTM5MDk4ODAuMzgxMzY3ODk1MjA1MDg2MDI3NDE2IC0+IC01Njc1OTE1LjI0NjU0NTc0ODc2MzIyNTAyNDUyMDkwNTQKK3N1YngzMjAzIHN1YnRyYWN0IC01Njc1OTE1LjI0NjU0NTc0ODc2MzIyNTAyNDUyMDkwNTQgNzM5MTM5MDk4ODAuMzgxMzY3ODk1MjA1MDg2MDI3NDE2IC0+IC03MzkxOTU4NTc5NS42Mjc5MTM2NDM5NjgzMTEwNTE5MzcgSW5leGFjdCBSb3VuZGVkCithZGR4MzIwNCBhZGQgOTcuNjQ3MzIxMTcyNTU1MTQ0OTAwNjg1NjA1MzE4NjM1IDQuODYyMDkxMTU4NzU0NzU0ODc1MTIwOTg0MTU3MDg4NSAtPiAxMDIuNTA5NDEyMzMxMzA5ODk5Nzc1ODA2NTg5NDc1NzIgSW5leGFjdCBSb3VuZGVkCitjb214MzIwNCBjb21wYXJlIDk3LjY0NzMyMTE3MjU1NTE0NDkwMDY4NTYwNTMxODYzNSA0Ljg2MjA5MTE1ODc1NDc1NDg3NTEyMDk4NDE1NzA4ODUgLT4gMQorZGl2eDMyMDQgZGl2aWRlIDk3LjY0NzMyMTE3MjU1NTE0NDkwMDY4NTYwNTMxODYzNSA0Ljg2MjA5MTE1ODc1NDc1NDg3NTEyMDk4NDE1NzA4ODUgLT4gMjAuMDgzMzk5OTE2NjY1NDY2Mzc0NzQxNzA4OTQ5NjIxIEluZXhhY3QgUm91bmRlZAorZHZpeDMyMDQgZGl2aWRlaW50IDk3LjY0NzMyMTE3MjU1NTE0NDkwMDY4NTYwNTMxODYzNSA0Ljg2MjA5MTE1ODc1NDc1NDg3NTEyMDk4NDE1NzA4ODUgLT4gMjAKK211bHgzMjA0IG11bHRpcGx5IDk3LjY0NzMyMTE3MjU1NTE0NDkwMDY4NTYwNTMxODYzNSA0Ljg2MjA5MTE1ODc1NDc1NDg3NTEyMDk4NDE1NzA4ODUgLT4gNDc0Ljc3MDE3Njk0OTE2NjM1Mzk4NjUyMjc2MDQyMTc1IEluZXhhY3QgUm91bmRlZAorcG93eDMyMDQgcG93ZXIgOTcuNjQ3MzIxMTcyNTU1MTQ0OTAwNjg1NjA1MzE4NjM1IDUgLT4gODg3NzcyNDU3OC43OTM1MzEyOTM5MjMxODI4NzE5ODQyIEluZXhhY3QgUm91bmRlZAorcmVteDMyMDQgcmVtYWluZGVyIDk3LjY0NzMyMTE3MjU1NTE0NDkwMDY4NTYwNTMxODYzNSA0Ljg2MjA5MTE1ODc1NDc1NDg3NTEyMDk4NDE1NzA4ODUgLT4gMC40MDU0OTc5OTc0NjAwNDczOTgyNjU5MjIxNzY4NjUwCitzdWJ4MzIwNCBzdWJ0cmFjdCA5Ny42NDczMjExNzI1NTUxNDQ5MDA2ODU2MDUzMTg2MzUgNC44NjIwOTExNTg3NTQ3NTQ4NzUxMjA5ODQxNTcwODg1IC0+IDkyLjc4NTIzMDAxMzgwMDM5MDAyNTU2NDYyMTE2MTU0NyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjA1IGFkZCAtOTcxNzI1MzI2NzAyNC41MzgwNjUxNDM1NDM1NjAzNTUyIC0yNjY5LjI1Mzk2OTUxOTM4MjA0MjQwMDIwMTM0ODg0ODBFKzM2MyAtPiAtMi42NjkyNTM5Njk1MTkzODIwNDI0MDAyMDEzNDg4NDgwRSszNjYgSW5leGFjdCBSb3VuZGVkCitjb214MzIwNSBjb21wYXJlIC05NzE3MjUzMjY3MDI0LjUzODA2NTE0MzU0MzU2MDM1NTIgLTI2NjkuMjUzOTY5NTE5MzgyMDQyNDAwMjAxMzQ4ODQ4MEUrMzYzIC0+IDEKK2RpdngzMjA1IGRpdmlkZSAtOTcxNzI1MzI2NzAyNC41MzgwNjUxNDM1NDM1NjAzNTUyIC0yNjY5LjI1Mzk2OTUxOTM4MjA0MjQwMDIwMTM0ODg0ODBFKzM2MyAtPiAzLjY0MDQzNzg4MTg5MDM0NjI2OTU2MzMzMzc2MzEwOThFLTM1NCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjA1IGRpdmlkZWludCAtOTcxNzI1MzI2NzAyNC41MzgwNjUxNDM1NDM1NjAzNTUyIC0yNjY5LjI1Mzk2OTUxOTM4MjA0MjQwMDIwMTM0ODg0ODBFKzM2MyAtPiAwCittdWx4MzIwNSBtdWx0aXBseSAtOTcxNzI1MzI2NzAyNC41MzgwNjUxNDM1NDM1NjAzNTUyIC0yNjY5LjI1Mzk2OTUxOTM4MjA0MjQwMDIwMTM0ODg0ODBFKzM2MyAtPiAyLjU5Mzc4MTY4NTU4MzA0MzE4OTkxMjMyMTc5MTIxNDRFKzM3OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjA1IHBvd2VyIC05NzE3MjUzMjY3MDI0LjUzODA2NTE0MzU0MzU2MDM1NTIgLTMgLT4gLTEuMDg5ODU2Nzg4MDA4NTMzNzc4MDA0MTMyODY2MTMzMEUtMzkgSW5leGFjdCBSb3VuZGVkCityZW14MzIwNSByZW1haW5kZXIgLTk3MTcyNTMyNjcwMjQuNTM4MDY1MTQzNTQzNTYwMzU1MiAtMjY2OS4yNTM5Njk1MTkzODIwNDI0MDAyMDEzNDg4NDgwRSszNjMgLT4gLTk3MTcyNTMyNjcwMjQuNTM4MDY1MTQzNTQzNTYwMzU1Mgorc3VieDMyMDUgc3VidHJhY3QgLTk3MTcyNTMyNjcwMjQuNTM4MDY1MTQzNTQzNTYwMzU1MiAtMjY2OS4yNTM5Njk1MTkzODIwNDI0MDAyMDEzNDg4NDgwRSszNjMgLT4gMi42NjkyNTM5Njk1MTkzODIwNDI0MDAyMDEzNDg4NDgwRSszNjYgSW5leGFjdCBSb3VuZGVkCithZGR4MzIwNiBhZGQgLTQuMDgxNzM5MTcxNzE5MDEyODUwNjA4MzAwMTcwMjMzNUUtNzY3IDEyNzcyLjgwNzEwNTkyMDcxMjY2MDk5MTAzMzY4OTIwNiAtPiAxMjc3Mi44MDcxMDU5MjA3MTI2NjA5OTEwMzM2ODkyMDYgSW5leGFjdCBSb3VuZGVkCitjb214MzIwNiBjb21wYXJlIC00LjA4MTczOTE3MTcxOTAxMjg1MDYwODMwMDE3MDIzMzVFLTc2NyAxMjc3Mi44MDcxMDU5MjA3MTI2NjA5OTEwMzM2ODkyMDYgLT4gLTEKK2RpdngzMjA2IGRpdmlkZSAtNC4wODE3MzkxNzE3MTkwMTI4NTA2MDgzMDAxNzAyMzM1RS03NjcgMTI3NzIuODA3MTA1OTIwNzEyNjYwOTkxMDMzNjg5MjA2IC0+IC0zLjE5NTY0NzcwNTIxNTA1OTMxNzUyMDY3Njk4OTE0MzRFLTc3MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjA2IGRpdmlkZWludCAtNC4wODE3MzkxNzE3MTkwMTI4NTA2MDgzMDAxNzAyMzM1RS03NjcgMTI3NzIuODA3MTA1OTIwNzEyNjYwOTkxMDMzNjg5MjA2IC0+IC0wCittdWx4MzIwNiBtdWx0aXBseSAtNC4wODE3MzkxNzE3MTkwMTI4NTA2MDgzMDAxNzAyMzM1RS03NjcgMTI3NzIuODA3MTA1OTIwNzEyNjYwOTkxMDMzNjg5MjA2IC0+IC01LjIxMzUyNjcwOTcwNDc1MzEzMzYxMDA3NTAxMTAzMTRFLTc2MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjA2IHBvd2VyIC00LjA4MTczOTE3MTcxOTAxMjg1MDYwODMwMDE3MDIzMzVFLTc2NyAxMjc3MyAtPiAtMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyMDYgcmVtYWluZGVyIC00LjA4MTczOTE3MTcxOTAxMjg1MDYwODMwMDE3MDIzMzVFLTc2NyAxMjc3Mi44MDcxMDU5MjA3MTI2NjA5OTEwMzM2ODkyMDYgLT4gLTQuMDgxNzM5MTcxNzE5MDEyODUwNjA4MzAwMTcwMjMzNUUtNzY3CitzdWJ4MzIwNiBzdWJ0cmFjdCAtNC4wODE3MzkxNzE3MTkwMTI4NTA2MDgzMDAxNzAyMzM1RS03NjcgMTI3NzIuODA3MTA1OTIwNzEyNjYwOTkxMDMzNjg5MjA2IC0+IC0xMjc3Mi44MDcxMDU5MjA3MTI2NjA5OTEwMzM2ODkyMDYgSW5leGFjdCBSb3VuZGVkCithZGR4MzIwNyBhZGQgNjg2MjUzMjI2NTU5MzQxNDY4NDUwMDMwMjg5Mjg2NDcgLTU5LjYzNDE2OTk0NDg0MDI4MDE1OTc4MjQ4ODA5ODcwMCAtPiA2ODYyNTMyMjY1NTkzNDE0Njg0NTAwMzAyODkyODU4NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjA3IGNvbXBhcmUgNjg2MjUzMjI2NTU5MzQxNDY4NDUwMDMwMjg5Mjg2NDcgLTU5LjYzNDE2OTk0NDg0MDI4MDE1OTc4MjQ4ODA5ODcwMCAtPiAxCitkaXZ4MzIwNyBkaXZpZGUgNjg2MjUzMjI2NTU5MzQxNDY4NDUwMDMwMjg5Mjg2NDcgLTU5LjYzNDE2OTk0NDg0MDI4MDE1OTc4MjQ4ODA5ODcwMCAtPiAtMTE1MDc3MTgyNjI3Njk1NDk0Njg0NDMyMjk4ODE5Mi41IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMDcgZGl2aWRlaW50IDY4NjI1MzIyNjU1OTM0MTQ2ODQ1MDAzMDI4OTI4NjQ3IC01OS42MzQxNjk5NDQ4NDAyODAxNTk3ODI0ODgwOTg3MDAgLT4gLTExNTA3NzE4MjYyNzY5NTQ5NDY4NDQzMjI5ODgxOTIKK211bHgzMjA3IG11bHRpcGx5IDY4NjI1MzIyNjU1OTM0MTQ2ODQ1MDAzMDI4OTI4NjQ3IC01OS42MzQxNjk5NDQ4NDAyODAxNTk3ODI0ODgwOTg3MDAgLT4gLTQuMDkyNDE0MTUzNzgzNDc0ODUwMTE0MDE1MTk5Nzc3OEUrMzMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIwNyBwb3dlciA2ODYyNTMyMjY1NTkzNDE0Njg0NTAwMzAyODkyODY0NyAtNjAgLT4gNi40NzA0NzMxMTExOTQzMzcwMTcxNzExMTMxOTQyNjAzRS0xOTExIEluZXhhY3QgUm91bmRlZAorcmVteDMyMDcgcmVtYWluZGVyIDY4NjI1MzIyNjU1OTM0MTQ2ODQ1MDAzMDI4OTI4NjQ3IC01OS42MzQxNjk5NDQ4NDAyODAxNTk3ODI0ODgwOTg3MDAgLT4gMjguMjAxMjU0MDA0ODk3MjU3NTUyOTM5MzY5NDQ5NjAwCitzdWJ4MzIwNyBzdWJ0cmFjdCA2ODYyNTMyMjY1NTkzNDE0Njg0NTAwMzAyODkyODY0NyAtNTkuNjM0MTY5OTQ0ODQwMjgwMTU5NzgyNDg4MDk4NzAwIC0+IDY4NjI1MzIyNjU1OTM0MTQ2ODQ1MDAzMDI4OTI4NzA3IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMDggYWRkIDczMjUxNS43NjUzMjA0OTI5MDgxNTY2NTg1NjcyNzY0MSAtOTIxMzQ0Nzk4MzU4MjEuMzE5NjE5ODI3MDIzNzI5ODI5IC0+IC05MjEzNDQ3OTEwMzMwNS41NTQyOTkzMzQxMTU1NzMxNzAgSW5leGFjdCBSb3VuZGVkCitjb214MzIwOCBjb21wYXJlIDczMjUxNS43NjUzMjA0OTI5MDgxNTY2NTg1NjcyNzY0MSAtOTIxMzQ0Nzk4MzU4MjEuMzE5NjE5ODI3MDIzNzI5ODI5IC0+IDEKK2RpdngzMjA4IGRpdmlkZSA3MzI1MTUuNzY1MzIwNDkyOTA4MTU2NjU4NTY3Mjc2NDEgLTkyMTM0NDc5ODM1ODIxLjMxOTYxOTgyNzAyMzcyOTgyOSAtPiAtNy45NTA1MDYzMzE4OTQzODQ2NjU1NTkzODg3OTkxOTE0RS05IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMDggZGl2aWRlaW50IDczMjUxNS43NjUzMjA0OTI5MDgxNTY2NTg1NjcyNzY0MSAtOTIxMzQ0Nzk4MzU4MjEuMzE5NjE5ODI3MDIzNzI5ODI5IC0+IC0wCittdWx4MzIwOCBtdWx0aXBseSA3MzI1MTUuNzY1MzIwNDkyOTA4MTU2NjU4NTY3Mjc2NDEgLTkyMTM0NDc5ODM1ODIxLjMxOTYxOTgyNzAyMzcyOTgyOSAtPiAtNjc0ODk5NTkwMDkzNDIxNzU3MjguNzEwNDk0MzU2MzIyIEluZXhhY3QgUm91bmRlZAorcG93eDMyMDggcG93ZXIgNzMyNTE1Ljc2NTMyMDQ5MjkwODE1NjY1ODU2NzI3NjQxIC05IC0+IDEuNjQ2ODI0MTA1MDQ0MzQ3MTM1OTM1ODAxNjU4NTg3N0UtNTMgSW5leGFjdCBSb3VuZGVkCityZW14MzIwOCByZW1haW5kZXIgNzMyNTE1Ljc2NTMyMDQ5MjkwODE1NjY1ODU2NzI3NjQxIC05MjEzNDQ3OTgzNTgyMS4zMTk2MTk4MjcwMjM3Mjk4MjkgLT4gNzMyNTE1Ljc2NTMyMDQ5MjkwODE1NjY1ODU2NzI3NjQxCitzdWJ4MzIwOCBzdWJ0cmFjdCA3MzI1MTUuNzY1MzIwNDkyOTA4MTU2NjU4NTY3Mjc2NDEgLTkyMTM0NDc5ODM1ODIxLjMxOTYxOTgyNzAyMzcyOTgyOSAtPiA5MjEzNDQ4MDU2ODMzNy4wODQ5NDAzMTk5MzE4ODY0ODggSW5leGFjdCBSb3VuZGVkCithZGR4MzIwOSBhZGQgLTMwLjQ1ODAxMTk0Mjk3ODMzODQyMTY3NjQ1NDc3ODczMyAtNTAyMzM3MjAyNDU5NzY2NTEwMjMzNjQzMDQxMDQwM0UrODMxIC0+IC01LjAyMzM3MjAyNDU5NzY2NTEwMjMzNjQzMDQxMDQwMzBFKzg2MSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjA5IGNvbXBhcmUgLTMwLjQ1ODAxMTk0Mjk3ODMzODQyMTY3NjQ1NDc3ODczMyAtNTAyMzM3MjAyNDU5NzY2NTEwMjMzNjQzMDQxMDQwM0UrODMxIC0+IDEKK2RpdngzMjA5IGRpdmlkZSAtMzAuNDU4MDExOTQyOTc4MzM4NDIxNjc2NDU0Nzc4NzMzIC01MDIzMzcyMDI0NTk3NjY1MTAyMzM2NDMwNDEwNDAzRSs4MzEgLT4gNi4wNjMyNjAyNTUwMzExNDEwODIxNDgzMDAxMzA1MDEwRS04NjEgSW5leGFjdCBSb3VuZGVkCitkdml4MzIwOSBkaXZpZGVpbnQgLTMwLjQ1ODAxMTk0Mjk3ODMzODQyMTY3NjQ1NDc3ODczMyAtNTAyMzM3MjAyNDU5NzY2NTEwMjMzNjQzMDQxMDQwM0UrODMxIC0+IDAKK211bHgzMjA5IG11bHRpcGx5IC0zMC40NTgwMTE5NDI5NzgzMzg0MjE2NzY0NTQ3Nzg3MzMgLTUwMjMzNzIwMjQ1OTc2NjUxMDIzMzY0MzA0MTA0MDNFKzgzMSAtPiAxLjUzMDAxOTI1MTE5MjE4OTU5MjkwMzE4MTg2Mzg5NjFFKzg2MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjA5IHBvd2VyIC0zMC40NTgwMTE5NDI5NzgzMzg0MjE2NzY0NTQ3Nzg3MzMgLTUgLT4gLTMuODE0OTc5NzQ4MTQwNTEzNjA0MjQ4NzY0MzI1MzEwOUUtOCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjA5IHJlbWFpbmRlciAtMzAuNDU4MDExOTQyOTc4MzM4NDIxNjc2NDU0Nzc4NzMzIC01MDIzMzcyMDI0NTk3NjY1MTAyMzM2NDMwNDEwNDAzRSs4MzEgLT4gLTMwLjQ1ODAxMTk0Mjk3ODMzODQyMTY3NjQ1NDc3ODczMworc3VieDMyMDkgc3VidHJhY3QgLTMwLjQ1ODAxMTk0Mjk3ODMzODQyMTY3NjQ1NDc3ODczMyAtNTAyMzM3MjAyNDU5NzY2NTEwMjMzNjQzMDQxMDQwM0UrODMxIC0+IDUuMDIzMzcyMDI0NTk3NjY1MTAyMzM2NDMwNDEwNDAzMEUrODYxIEluZXhhY3QgUm91bmRlZAorYWRkeDMyMTAgYWRkIC04OTY0MC4wOTQxNDk0MTQ2NDQ2NjA0ODAyODY0MzA0NjIgLTU4NzAzNDE5NzU4LjgwMDg4OTkwMzIyNzUwOTIxNTQ3NCAtPiAtNTg3MDM1MDkzOTguODk1MDM5MzE3ODcyMTY5Njk1NzYwIEluZXhhY3QgUm91bmRlZAorY29teDMyMTAgY29tcGFyZSAtODk2NDAuMDk0MTQ5NDE0NjQ0NjYwNDgwMjg2NDMwNDYyIC01ODcwMzQxOTc1OC44MDA4ODk5MDMyMjc1MDkyMTU0NzQgLT4gMQorZGl2eDMyMTAgZGl2aWRlIC04OTY0MC4wOTQxNDk0MTQ2NDQ2NjA0ODAyODY0MzA0NjIgLTU4NzAzNDE5NzU4LjgwMDg4OTkwMzIyNzUwOTIxNTQ3NCAtPiAwLjAwMDAwMTUyNjk5OTUyNjA1MzYwMjUyMzcxNjcxOTk5NzAyMzggSW5leGFjdCBSb3VuZGVkCitkdml4MzIxMCBkaXZpZGVpbnQgLTg5NjQwLjA5NDE0OTQxNDY0NDY2MDQ4MDI4NjQzMDQ2MiAtNTg3MDM0MTk3NTguODAwODg5OTAzMjI3NTA5MjE1NDc0IC0+IDAKK211bHgzMjEwIG11bHRpcGx5IC04OTY0MC4wOTQxNDk0MTQ2NDQ2NjA0ODAyODY0MzA0NjIgLTU4NzAzNDE5NzU4LjgwMDg4OTkwMzIyNzUwOTIxNTQ3NCAtPiA1MjYyMTgwMDc0MDcxNTE5LjcwMTgyNTIxNzE1Nzk3NTMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxMCBwb3dlciAtODk2NDAuMDk0MTQ5NDE0NjQ0NjYwNDgwMjg2NDMwNDYyIC02IC0+IDEuOTI3NDYzNTU5MTE2NTQwNTg4ODcyNDU5NTE2NTc0MUUtMzAgSW5leGFjdCBSb3VuZGVkCityZW14MzIxMCByZW1haW5kZXIgLTg5NjQwLjA5NDE0OTQxNDY0NDY2MDQ4MDI4NjQzMDQ2MiAtNTg3MDM0MTk3NTguODAwODg5OTAzMjI3NTA5MjE1NDc0IC0+IC04OTY0MC4wOTQxNDk0MTQ2NDQ2NjA0ODAyODY0MzA0NjIKK3N1YngzMjEwIHN1YnRyYWN0IC04OTY0MC4wOTQxNDk0MTQ2NDQ2NjA0ODAyODY0MzA0NjIgLTU4NzAzNDE5NzU4LjgwMDg4OTkwMzIyNzUwOTIxNTQ3NCAtPiA1ODcwMzMzMDExOC43MDY3NDA0ODg1ODI4NDg3MzUxODggSW5leGFjdCBSb3VuZGVkCithZGR4MzIxMSBhZGQgNDU4NjUzLjE1Njc4NzAwODE4MTAwNTI5MTc3MTQyNTkgMTgzNTMxMDYyMzguNTE2MjM1MTE2MDgwNDQ5ODE0MDUzRS0wMzggLT4gNDU4NjUzLjE1Njc4NzAwODE4MTAwNTI5MTc3MTQyNTkwIEluZXhhY3QgUm91bmRlZAorY29teDMyMTEgY29tcGFyZSA0NTg2NTMuMTU2Nzg3MDA4MTgxMDA1MjkxNzcxNDI1OSAxODM1MzEwNjIzOC41MTYyMzUxMTYwODA0NDk4MTQwNTNFLTAzOCAtPiAxCitkaXZ4MzIxMSBkaXZpZGUgNDU4NjUzLjE1Njc4NzAwODE4MTAwNTI5MTc3MTQyNTkgMTgzNTMxMDYyMzguNTE2MjM1MTE2MDgwNDQ5ODE0MDUzRS0wMzggLT4gMi40OTkwNDkyMTE3NTk0MTYwMjE1NjQxMzExNzYwNDk4RSszMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjExIGRpdmlkZWludCA0NTg2NTMuMTU2Nzg3MDA4MTgxMDA1MjkxNzcxNDI1OSAxODM1MzEwNjIzOC41MTYyMzUxMTYwODA0NDk4MTQwNTNFLTAzOCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyMTEgbXVsdGlwbHkgNDU4NjUzLjE1Njc4NzAwODE4MTAwNTI5MTc3MTQyNTkgMTgzNTMxMDYyMzguNTE2MjM1MTE2MDgwNDQ5ODE0MDUzRS0wMzggLT4gOC40MTc3MTAxMTMxNDI4MDQ3NDk3OTk4NTk0Mzc5NTkzRS0yMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjExIHBvd2VyIDQ1ODY1My4xNTY3ODcwMDgxODEwMDUyOTE3NzE0MjU5IDIgLT4gMjEwMzYyNzE4MjMwLjY4NzkwODY1MTE3NDUyNDI5OTkwIEluZXhhY3QgUm91bmRlZAorcmVteDMyMTEgcmVtYWluZGVyIDQ1ODY1My4xNTY3ODcwMDgxODEwMDUyOTE3NzE0MjU5IDE4MzUzMTA2MjM4LjUxNjIzNTExNjA4MDQ0OTgxNDA1M0UtMDM4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzIxMSBzdWJ0cmFjdCA0NTg2NTMuMTU2Nzg3MDA4MTgxMDA1MjkxNzcxNDI1OSAxODM1MzEwNjIzOC41MTYyMzUxMTYwODA0NDk4MTQwNTNFLTAzOCAtPiA0NTg2NTMuMTU2Nzg3MDA4MTgxMDA1MjkxNzcxNDI1OTAgSW5leGFjdCBSb3VuZGVkCithZGR4MzIxMiBhZGQgOTEzMzkxLjQyNzQ0MjI0NDU4MjE2MTc0OTY3ODUzNzIyIC0yMTA1MTYzOC44MTY0MzI4MTczOTMyMDIyNjI3MTA2MzBFKzQzMiAtPiAtMi4xMDUxNjM4ODE2NDMyODE3MzkzMjAyMjYyNzEwNjMwRSs0MzkgSW5leGFjdCBSb3VuZGVkCitjb214MzIxMiBjb21wYXJlIDkxMzM5MS40Mjc0NDIyNDQ1ODIxNjE3NDk2Nzg1MzcyMiAtMjEwNTE2MzguODE2NDMyODE3MzkzMjAyMjYyNzEwNjMwRSs0MzIgLT4gMQorZGl2eDMyMTIgZGl2aWRlIDkxMzM5MS40Mjc0NDIyNDQ1ODIxNjE3NDk2Nzg1MzcyMiAtMjEwNTE2MzguODE2NDMyODE3MzkzMjAyMjYyNzEwNjMwRSs0MzIgLT4gLTQuMzM4ODEzODgyNDEwMjE1MTEyNzI3MzI1OTA5MjYxM0UtNDM0IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMTIgZGl2aWRlaW50IDkxMzM5MS40Mjc0NDIyNDQ1ODIxNjE3NDk2Nzg1MzcyMiAtMjEwNTE2MzguODE2NDMyODE3MzkzMjAyMjYyNzEwNjMwRSs0MzIgLT4gLTAKK211bHgzMjEyIG11bHRpcGx5IDkxMzM5MS40Mjc0NDIyNDQ1ODIxNjE3NDk2Nzg1MzcyMiAtMjEwNTE2MzguODE2NDMyODE3MzkzMjAyMjYyNzEwNjMwRSs0MzIgLT4gLTEuOTIyODM4NjQyODU0MDEzNTM0MDYwMDgzNjcwNzI3MEUrNDQ1IEluZXhhY3QgUm91bmRlZAorcG93eDMyMTIgcG93ZXIgOTEzMzkxLjQyNzQ0MjI0NDU4MjE2MTc0OTY3ODUzNzIyIC0yIC0+IDEuMTk4NjMyNzQzOTk3MTUzMjQ3MDI5NzMwMDEyODA3NEUtMTIgSW5leGFjdCBSb3VuZGVkCityZW14MzIxMiByZW1haW5kZXIgOTEzMzkxLjQyNzQ0MjI0NDU4MjE2MTc0OTY3ODUzNzIyIC0yMTA1MTYzOC44MTY0MzI4MTczOTMyMDIyNjI3MTA2MzBFKzQzMiAtPiA5MTMzOTEuNDI3NDQyMjQ0NTgyMTYxNzQ5Njc4NTM3MjIKK3N1YngzMjEyIHN1YnRyYWN0IDkxMzM5MS40Mjc0NDIyNDQ1ODIxNjE3NDk2Nzg1MzcyMiAtMjEwNTE2MzguODE2NDMyODE3MzkzMjAyMjYyNzEwNjMwRSs0MzIgLT4gMi4xMDUxNjM4ODE2NDMyODE3MzkzMjAyMjYyNzEwNjMwRSs0MzkgSW5leGFjdCBSb3VuZGVkCithZGR4MzIxMyBhZGQgLTkxNzU5MTQ1NjgyOS4xMjEwOTAyNzQ4NDM5OTUzNjU2NyAtMjg4OTIxNzc3MjY4NTgwMjY5NTU1MTM0Mzg4NDMzNzFFKzcwOCAtPiAtMi44ODkyMTc3NzI2ODU4MDI2OTU1NTEzNDM4ODQzMzcxRSs3MzkgSW5leGFjdCBSb3VuZGVkCitjb214MzIxMyBjb21wYXJlIC05MTc1OTE0NTY4MjkuMTIxMDkwMjc0ODQzOTk1MzY1NjcgLTI4ODkyMTc3NzI2ODU4MDI2OTU1NTEzNDM4ODQzMzcxRSs3MDggLT4gMQorZGl2eDMyMTMgZGl2aWRlIC05MTc1OTE0NTY4MjkuMTIxMDkwMjc0ODQzOTk1MzY1NjcgLTI4ODkyMTc3NzI2ODU4MDI2OTU1NTEzNDM4ODQzMzcxRSs3MDggLT4gMy4xNzU5MTY1NTk1MDU3Njc0MTk2NjQ0OTI3MTA2NDQ3RS03MjggSW5leGFjdCBSb3VuZGVkCitkdml4MzIxMyBkaXZpZGVpbnQgLTkxNzU5MTQ1NjgyOS4xMjEwOTAyNzQ4NDM5OTUzNjU2NyAtMjg4OTIxNzc3MjY4NTgwMjY5NTU1MTM0Mzg4NDMzNzFFKzcwOCAtPiAwCittdWx4MzIxMyBtdWx0aXBseSAtOTE3NTkxNDU2ODI5LjEyMTA5MDI3NDg0Mzk5NTM2NTY3IC0yODg5MjE3NzcyNjg1ODAyNjk1NTUxMzQzODg0MzM3MUUrNzA4IC0+IDIuNjUxMTIxNTQ1MTM1MzU0MTE1NjcwMzkxNDcyMTcyNUUrNzUxIEluZXhhY3QgUm91bmRlZAorcG93eDMyMTMgcG93ZXIgLTkxNzU5MTQ1NjgyOS4xMjEwOTAyNzQ4NDM5OTUzNjU2NyAtMyAtPiAtMS4yOTQzNTA1NTkxODUzNzM5MjQwMDAzNDUzMzQxOTExRS0zNiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjEzIHJlbWFpbmRlciAtOTE3NTkxNDU2ODI5LjEyMTA5MDI3NDg0Mzk5NTM2NTY3IC0yODg5MjE3NzcyNjg1ODAyNjk1NTUxMzQzODg0MzM3MUUrNzA4IC0+IC05MTc1OTE0NTY4MjkuMTIxMDkwMjc0ODQzOTk1MzY1NjcKK3N1YngzMjEzIHN1YnRyYWN0IC05MTc1OTE0NTY4MjkuMTIxMDkwMjc0ODQzOTk1MzY1NjcgLTI4ODkyMTc3NzI2ODU4MDI2OTU1NTEzNDM4ODQzMzcxRSs3MDggLT4gMi44ODkyMTc3NzI2ODU4MDI2OTU1NTEzNDM4ODQzMzcxRSs3MzkgSW5leGFjdCBSb3VuZGVkCithZGR4MzIxNCBhZGQgMzQ5Mzg0MTA4NDA2NDUuOTEzMzk5Njk5MjE5MjI4MjE4IDMwLjgxODIyMDM5MzI0MjQwMjg0NjA3Nzc1NTQ4MDU0OCAtPiAzNDkzODQxMDg0MDY3Ni43MzE2MjAwOTI0NjE2MzEwNjQgSW5leGFjdCBSb3VuZGVkCitjb214MzIxNCBjb21wYXJlIDM0OTM4NDEwODQwNjQ1LjkxMzM5OTY5OTIxOTIyODIxOCAzMC44MTgyMjAzOTMyNDI0MDI4NDYwNzc3NTU0ODA1NDggLT4gMQorZGl2eDMyMTQgZGl2aWRlIDM0OTM4NDEwODQwNjQ1LjkxMzM5OTY5OTIxOTIyODIxOCAzMC44MTgyMjAzOTMyNDI0MDI4NDYwNzc3NTU0ODA1NDggLT4gMTEzMzY5MzMyNzk5OS43ODc5NTAzMjYwMDk4NjY2OTY2IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMTQgZGl2aWRlaW50IDM0OTM4NDEwODQwNjQ1LjkxMzM5OTY5OTIxOTIyODIxOCAzMC44MTgyMjAzOTMyNDI0MDI4NDYwNzc3NTU0ODA1NDggLT4gMTEzMzY5MzMyNzk5OQorbXVseDMyMTQgbXVsdGlwbHkgMzQ5Mzg0MTA4NDA2NDUuOTEzMzk5Njk5MjE5MjI4MjE4IDMwLjgxODIyMDM5MzI0MjQwMjg0NjA3Nzc1NTQ4MDU0OCAtPiAxMDc2NzM5NjQ1NDc2Njc1LjMzMTg1MTkyODkxMjg5NjEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxNCBwb3dlciAzNDkzODQxMDg0MDY0NS45MTMzOTk2OTkyMTkyMjgyMTggMzEgLT4gNi45NTY2MDg1OTU4Nzk4NzMyNzg2NTA5OTA5NjgzMjY3RSs0MTkgSW5leGFjdCBSb3VuZGVkCityZW14MzIxNCByZW1haW5kZXIgMzQ5Mzg0MTA4NDA2NDUuOTEzMzk5Njk5MjE5MjI4MjE4IDMwLjgxODIyMDM5MzI0MjQwMjg0NjA3Nzc1NTQ4MDU0OCAtPiAyNC4yODMyMjY4MDU4OTkyNzM1NTEzNzYzNzE3MzY1NDgKK3N1YngzMjE0IHN1YnRyYWN0IDM0OTM4NDEwODQwNjQ1LjkxMzM5OTY5OTIxOTIyODIxOCAzMC44MTgyMjAzOTMyNDI0MDI4NDYwNzc3NTU0ODA1NDggLT4gMzQ5Mzg0MTA4NDA2MTUuMDk1MTc5MzA1OTc2ODI1MzcyIEluZXhhY3QgUm91bmRlZAorYWRkeDMyMTUgYWRkIDYwMzQuNzM3NDQxMTAyMjU5ODA4MTc0NTAwNjc2OTAyM0UtNTE3IDI5NzcxODMzNDI4MDU0NzA5MDc3ODUwNTg4OTA0NjUzIC0+IDI5NzcxODMzNDI4MDU0NzA5MDc3ODUwNTg4OTA0NjUzIEluZXhhY3QgUm91bmRlZAorY29teDMyMTUgY29tcGFyZSA2MDM0LjczNzQ0MTEwMjI1OTgwODE3NDUwMDY3NjkwMjNFLTUxNyAyOTc3MTgzMzQyODA1NDcwOTA3Nzg1MDU4ODkwNDY1MyAtPiAtMQorZGl2eDMyMTUgZGl2aWRlIDYwMzQuNzM3NDQxMTAyMjU5ODA4MTc0NTAwNjc2OTAyM0UtNTE3IDI5NzcxODMzNDI4MDU0NzA5MDc3ODUwNTg4OTA0NjUzIC0+IDIuMDI2OTk1NTY4MDM3NjY4MzUyNjA5OTQ0NDUyMzY5MUUtNTQ1IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMTUgZGl2aWRlaW50IDYwMzQuNzM3NDQxMTAyMjU5ODA4MTc0NTAwNjc2OTAyM0UtNTE3IDI5NzcxODMzNDI4MDU0NzA5MDc3ODUwNTg4OTA0NjUzIC0+IDAKK211bHgzMjE1IG11bHRpcGx5IDYwMzQuNzM3NDQxMTAyMjU5ODA4MTc0NTAwNjc2OTAyM0UtNTE3IDI5NzcxODMzNDI4MDU0NzA5MDc3ODUwNTg4OTA0NjUzIC0+IDEuNzk2NjUxOTc4Nzg1NDE1OTQ2NDM4MjM1OTQxMTY0MkUtNDgyIEluZXhhY3QgUm91bmRlZAorcG93eDMyMTUgcG93ZXIgNjAzNC43Mzc0NDExMDIyNTk4MDgxNzQ1MDA2NzY5MDIzRS01MTcgMyAtPiAyLjE5NzczNDA1OTczMDE4NDA2ODE1Mjg1MDc2NDAwMzJFLTE1NDAgSW5leGFjdCBSb3VuZGVkCityZW14MzIxNSByZW1haW5kZXIgNjAzNC43Mzc0NDExMDIyNTk4MDgxNzQ1MDA2NzY5MDIzRS01MTcgMjk3NzE4MzM0MjgwNTQ3MDkwNzc4NTA1ODg5MDQ2NTMgLT4gNi4wMzQ3Mzc0NDExMDIyNTk4MDgxNzQ1MDA2NzY5MDIzRS01MTQKK3N1YngzMjE1IHN1YnRyYWN0IDYwMzQuNzM3NDQxMTAyMjU5ODA4MTc0NTAwNjc2OTAyM0UtNTE3IDI5NzcxODMzNDI4MDU0NzA5MDc3ODUwNTg4OTA0NjUzIC0+IC0yOTc3MTgzMzQyODA1NDcwOTA3Nzg1MDU4ODkwNDY1MyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjE2IGFkZCAtNTU2NTc0NzY3MTczNC4xNjg2MDA5NzA1NTc0NTAzMTUyIC00OTAuMzA4OTk0OTQ4ODEwNzEyODI3ODc0ODcwMzAzMDMgLT4gLTU1NjU3NDc2NzIyMjQuNDc3NTk1OTE5MzY4MTYzMTQzMSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjE2IGNvbXBhcmUgLTU1NjU3NDc2NzE3MzQuMTY4NjAwOTcwNTU3NDUwMzE1MiAtNDkwLjMwODk5NDk0ODgxMDcxMjgyNzg3NDg3MDMwMzAzIC0+IC0xCitkaXZ4MzIxNiBkaXZpZGUgLTU1NjU3NDc2NzE3MzQuMTY4NjAwOTcwNTU3NDUwMzE1MiAtNDkwLjMwODk5NDk0ODgxMDcxMjgyNzg3NDg3MDMwMzAzIC0+IDExMzUxNTEwNDMzLjM2NTA3NDg3MTU3NDUxOTc1NjI0NSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjE2IGRpdmlkZWludCAtNTU2NTc0NzY3MTczNC4xNjg2MDA5NzA1NTc0NTAzMTUyIC00OTAuMzA4OTk0OTQ4ODEwNzEyODI3ODc0ODcwMzAzMDMgLT4gMTEzNTE1MTA0MzMKK211bHgzMjE2IG11bHRpcGx5IC01NTY1NzQ3NjcxNzM0LjE2ODYwMDk3MDU1NzQ1MDMxNTIgLTQ5MC4zMDg5OTQ5NDg4MTA3MTI4Mjc4NzQ4NzAzMDMwMyAtPiAyNzI4OTM2MTQ3MDY2NjYzLjQ1ODAwNjQ0Mjg2Mzk3NDUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxNiBwb3dlciAtNTU2NTc0NzY3MTczNC4xNjg2MDA5NzA1NTc0NTAzMTUyIC00OTAgLT4gNC45MzcxNzQ1Mjk3NjE5NTI2MTEzOTkxNzI4OTUzMTk3RS02MjQ2IEluZXhhY3QgUm91bmRlZAorcmVteDMyMTYgcmVtYWluZGVyIC01NTY1NzQ3NjcxNzM0LjE2ODYwMDk3MDU1NzQ1MDMxNTIgLTQ5MC4zMDg5OTQ5NDg4MTA3MTI4Mjc4NzQ4NzAzMDMwMyAtPiAtMTc4Ljk5OTQ5MzM2Mjc2ODkyNjg1MTgzMzA4MzQ4ODAxCitzdWJ4MzIxNiBzdWJ0cmFjdCAtNTU2NTc0NzY3MTczNC4xNjg2MDA5NzA1NTc0NTAzMTUyIC00OTAuMzA4OTk0OTQ4ODEwNzEyODI3ODc0ODcwMzAzMDMgLT4gLTU1NjU3NDc2NzEyNDMuODU5NjA2MDIxNzQ2NzM3NDg3MyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjE3IGFkZCAzMTk1NDU1MTEuODkyMDM0OTU1NDY2ODkyNzM1NjQ3MjhFKzAzNiAtMjk1NTk0MzUzMzk0MzMyMTg5OTE1MDMxMDE5MjA2MSAtPiAzLjE5NTQ1NTExODkyMDMxOTk5NTIzMzU4NzkyMzI1MzhFKzQ0IEluZXhhY3QgUm91bmRlZAorY29teDMyMTcgY29tcGFyZSAzMTk1NDU1MTEuODkyMDM0OTU1NDY2ODkyNzM1NjQ3MjhFKzAzNiAtMjk1NTk0MzUzMzk0MzMyMTg5OTE1MDMxMDE5MjA2MSAtPiAxCitkaXZ4MzIxNyBkaXZpZGUgMzE5NTQ1NTExLjg5MjAzNDk1NTQ2Njg5MjczNTY0NzI4RSswMzYgLTI5NTU5NDM1MzM5NDMzMjE4OTkxNTAzMTAxOTIwNjEgLT4gLTEwODEwMjcxMTc4MTQyMi42ODY2MzA4NDg1OTkwMjkzMSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjE3IGRpdmlkZWludCAzMTk1NDU1MTEuODkyMDM0OTU1NDY2ODkyNzM1NjQ3MjhFKzAzNiAtMjk1NTk0MzUzMzk0MzMyMTg5OTE1MDMxMDE5MjA2MSAtPiAtMTA4MTAyNzExNzgxNDIyCittdWx4MzIxNyBtdWx0aXBseSAzMTk1NDU1MTEuODkyMDM0OTU1NDY2ODkyNzM1NjQ3MjhFKzAzNiAtMjk1NTk0MzUzMzk0MzMyMTg5OTE1MDMxMDE5MjA2MSAtPiAtOS40NDU1ODQ4OTY3Nzg2OTU5OTk2NTI1NzAyMTk3MTM5RSs3NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjE3IHBvd2VyIDMxOTU0NTUxMS44OTIwMzQ5NTU0NjY4OTI3MzU2NDcyOEUrMDM2IC0zIC0+IDMuMDY0Nzk3ODQ0ODk0NjI5NDQ1Nzk4NTIyMzk1MzQ3MkUtMTM0IEluZXhhY3QgUm91bmRlZAorcmVteDMyMTcgcmVtYWluZGVyIDMxOTU0NTUxMS44OTIwMzQ5NTU0NjY4OTI3MzU2NDcyOEUrMDM2IC0yOTU1OTQzNTMzOTQzMzIxODk5MTUwMzEwMTkyMDYxIC0+IDIwMjk2NDIwMTcxMjIzMTY3MjE1MzE3MjgzMDkyNTgKK3N1YngzMjE3IHN1YnRyYWN0IDMxOTU0NTUxMS44OTIwMzQ5NTU0NjY4OTI3MzU2NDcyOEUrMDM2IC0yOTU1OTQzNTMzOTQzMzIxODk5MTUwMzEwMTkyMDYxIC0+IDMuMTk1NDU1MTE4OTIwMzc5MTE0MTA0MjY2Nzg5NjkxOEUrNDQgSW5leGFjdCBSb3VuZGVkCithZGR4MzIxOCBhZGQgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC01ODMwNjI5LjgzNDcwODUwMjU4MDg3MTYzNjAzNTc5NDAgLT4gLTQyNjgyNzY0LjY3NjY1MTQ2NTA4OTMwNzQzMDMyNTEwNCBSb3VuZGVkCitjb214MzIxOCBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtNTgzMDYyOS44MzQ3MDg1MDI1ODA4NzE2MzYwMzU3OTQwIC0+IC0xCitkaXZ4MzIxOCBkaXZpZGUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC01ODMwNjI5LjgzNDcwODUwMjU4MDg3MTYzNjAzNTc5NDAgLT4gNi4zMjA0MzgwODA3MzE4NjU1NDc1NDU5MDQ3NDEwMTYwIEluZXhhY3QgUm91bmRlZAorZHZpeDMyMTggZGl2aWRlaW50IC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtNTgzMDYyOS44MzQ3MDg1MDI1ODA4NzE2MzYwMzU3OTQwIC0+IDYKK211bHgzMjE4IG11bHRpcGx5IC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtNTgzMDYyOS44MzQ3MDg1MDI1ODA4NzE2MzYwMzU3OTQwIC0+IDIxNDg3MTE1Njg4MjEzMy4zNDQzNzQxNzUzNDg3MzA5OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjE4IHBvd2VyIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtNTgzMDYzMCAtPiAwRS0xMDAzMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzIxOCByZW1haW5kZXIgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC01ODMwNjI5LjgzNDcwODUwMjU4MDg3MTYzNjAzNTc5NDAgLT4gLTE4NjgzNTUuODMzNjkxOTQ3MDIzMjA1OTc4MDc0NTQ2MAorc3VieDMyMTggc3VidHJhY3QgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC01ODMwNjI5LjgzNDcwODUwMjU4MDg3MTYzNjAzNTc5NDAgLT4gLTMxMDIxNTA1LjAwNzIzNDQ1OTkyNzU2NDE1ODI1MzUxNiBSb3VuZGVkCithZGR4MzIxOSBhZGQgOC42MDIxOTA1MDAxNzk4NTc4NjU5Mjc1ODgwMDE4MjIxRS0zNzQgLTM5NTA1Mjg1MzQ0OTQzLjcyOTY4MTgzNTM3NzUzMDkwOCAtPiAtMzk1MDUyODUzNDQ5NDMuNzI5NjgxODM1Mzc3NTMwOTA4IEluZXhhY3QgUm91bmRlZAorY29teDMyMTkgY29tcGFyZSA4LjYwMjE5MDUwMDE3OTg1Nzg2NTkyNzU4ODAwMTgyMjFFLTM3NCAtMzk1MDUyODUzNDQ5NDMuNzI5NjgxODM1Mzc3NTMwOTA4IC0+IDEKK2RpdngzMjE5IGRpdmlkZSA4LjYwMjE5MDUwMDE3OTg1Nzg2NTkyNzU4ODAwMTgyMjFFLTM3NCAtMzk1MDUyODUzNDQ5NDMuNzI5NjgxODM1Mzc3NTMwOTA4IC0+IC0yLjE3NzQ3ODM4Njc3MDA1MDIwMDI1MTE0ODY4ODUyNzJFLTM4NyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjE5IGRpdmlkZWludCA4LjYwMjE5MDUwMDE3OTg1Nzg2NTkyNzU4ODAwMTgyMjFFLTM3NCAtMzk1MDUyODUzNDQ5NDMuNzI5NjgxODM1Mzc3NTMwOTA4IC0+IC0wCittdWx4MzIxOSBtdWx0aXBseSA4LjYwMjE5MDUwMDE3OTg1Nzg2NTkyNzU4ODAwMTgyMjFFLTM3NCAtMzk1MDUyODUzNDQ5NDMuNzI5NjgxODM1Mzc3NTMwOTA4IC0+IC0zLjM5ODMxOTkwMzAxMTY5NTEwODE4NjU0MzAzNjIwNTNFLTM2MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjE5IHBvd2VyIDguNjAyMTkwNTAwMTc5ODU3ODY1OTI3NTg4MDAxODIyMUUtMzc0IC00IC0+IDEuODI2MjY0OTE1NTgyMDQzMzEyNjI0MDc1NDEyMzI1N0UrMTQ5MiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjE5IHJlbWFpbmRlciA4LjYwMjE5MDUwMDE3OTg1Nzg2NTkyNzU4ODAwMTgyMjFFLTM3NCAtMzk1MDUyODUzNDQ5NDMuNzI5NjgxODM1Mzc3NTMwOTA4IC0+IDguNjAyMTkwNTAwMTc5ODU3ODY1OTI3NTg4MDAxODIyMUUtMzc0CitzdWJ4MzIxOSBzdWJ0cmFjdCA4LjYwMjE5MDUwMDE3OTg1Nzg2NTkyNzU4ODAwMTgyMjFFLTM3NCAtMzk1MDUyODUzNDQ5NDMuNzI5NjgxODM1Mzc3NTMwOTA4IC0+IDM5NTA1Mjg1MzQ0OTQzLjcyOTY4MTgzNTM3NzUzMDkwOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjIwIGFkZCAtNTQ4NjMxNjUuMTUyMTc0MTA5NzIwMzEyODg3ODA1MDE3IDczNi4xMzk4NDc2NTYwMTY5MTQxMTA1MzI4MjU2NjI4IC0+IC01NDg2MjQyOS4wMTIzMjY0NTM3MDMzOTg3NzcyNzIxOTEgSW5leGFjdCBSb3VuZGVkCitjb214MzIyMCBjb21wYXJlIC01NDg2MzE2NS4xNTIxNzQxMDk3MjAzMTI4ODc4MDUwMTcgNzM2LjEzOTg0NzY1NjAxNjkxNDExMDUzMjgyNTY2MjggLT4gLTEKK2RpdngzMjIwIGRpdmlkZSAtNTQ4NjMxNjUuMTUyMTc0MTA5NzIwMzEyODg3ODA1MDE3IDczNi4xMzk4NDc2NTYwMTY5MTQxMTA1MzI4MjU2NjI4IC0+IC03NDUyOC4xODI4MjY3NjQzODQwODg2MDI4MTMxNDI4NDcgSW5leGFjdCBSb3VuZGVkCitkdml4MzIyMCBkaXZpZGVpbnQgLTU0ODYzMTY1LjE1MjE3NDEwOTcyMDMxMjg4NzgwNTAxNyA3MzYuMTM5ODQ3NjU2MDE2OTE0MTEwNTMyODI1NjYyOCAtPiAtNzQ1MjgKK211bHgzMjIwIG11bHRpcGx5IC01NDg2MzE2NS4xNTIxNzQxMDk3MjAzMTI4ODc4MDUwMTcgNzM2LjEzOTg0NzY1NjAxNjkxNDExMDUzMjgyNTY2MjggLT4gLTQwMzg2OTYyMDM3LjA0ODM0NTE0ODMzODEyMjUzOTQwNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjIwIHBvd2VyIC01NDg2MzE2NS4xNTIxNzQxMDk3MjAzMTI4ODc4MDUwMTcgNzM2IC0+IDEuMjkwMzY0Mzk4MTY3OTExMTYyNTM3MDE3NDU3MzYzOUUrNTY5NiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjIwIHJlbWFpbmRlciAtNTQ4NjMxNjUuMTUyMTc0MTA5NzIwMzEyODg3ODA1MDE3IDczNi4xMzk4NDc2NTYwMTY5MTQxMTA1MzI4MjU2NjI4IC0+IC0xMzQuNTg2MDY2NDgxMTQ1NDgzMDk3Mzc0MDE5ODQxNgorc3VieDMyMjAgc3VidHJhY3QgLTU0ODYzMTY1LjE1MjE3NDEwOTcyMDMxMjg4NzgwNTAxNyA3MzYuMTM5ODQ3NjU2MDE2OTE0MTEwNTMyODI1NjYyOCAtPiAtNTQ4NjM5MDEuMjkyMDIxNzY1NzM3MjI2OTk4MzM3ODQzIEluZXhhY3QgUm91bmRlZAorYWRkeDMyMjEgYWRkIC0zMjYzNzQzNDY0NTE3ODUxMDEyNTMxNzA4ODEwMzA3IDI0NTcyMDYuMjQ3MTI0ODM4MjEzNjI3MzY0MzIwODEwOSAtPiAtMzI2Mzc0MzQ2NDUxNzg1MTAxMjUzMTcwNjM1MzEwMC44IEluZXhhY3QgUm91bmRlZAorY29teDMyMjEgY29tcGFyZSAtMzI2Mzc0MzQ2NDUxNzg1MTAxMjUzMTcwODgxMDMwNyAyNDU3MjA2LjI0NzEyNDgzODIxMzYyNzM2NDMyMDgxMDkgLT4gLTEKK2RpdngzMjIxIGRpdmlkZSAtMzI2Mzc0MzQ2NDUxNzg1MTAxMjUzMTcwODgxMDMwNyAyNDU3MjA2LjI0NzEyNDgzODIxMzYyNzM2NDMyMDgxMDkgLT4gLTEzMjgyMzM0MjI5NTIwNzY5NzUwNTUwODIuNTc2ODA4MiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjIxIGRpdmlkZWludCAtMzI2Mzc0MzQ2NDUxNzg1MTAxMjUzMTcwODgxMDMwNyAyNDU3MjA2LjI0NzEyNDgzODIxMzYyNzM2NDMyMDgxMDkgLT4gLTEzMjgyMzM0MjI5NTIwNzY5NzUwNTUwODIKK211bHgzMjIxIG11bHRpcGx5IC0zMjYzNzQzNDY0NTE3ODUxMDEyNTMxNzA4ODEwMzA3IDI0NTcyMDYuMjQ3MTI0ODM4MjEzNjI3MzY0MzIwODEwOSAtPiAtOC4wMTk2OTA4MzAwMjYxMjYyNTQ4NTY1ODM4MDMxOTQzRSszNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjIxIHBvd2VyIC0zMjYzNzQzNDY0NTE3ODUxMDEyNTMxNzA4ODEwMzA3IDI0NTcyMDYgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzIyMSByZW1haW5kZXIgLTMyNjM3NDM0NjQ1MTc4NTEwMTI1MzE3MDg4MTAzMDcgMjQ1NzIwNi4yNDcxMjQ4MzgyMTM2MjczNjQzMjA4MTA5IC0+IC0xNDE3MzM2Ljc1NzMzOTgzNjYwNjI5OTQ1MzU5NDAwNjIKK3N1YngzMjIxIHN1YnRyYWN0IC0zMjYzNzQzNDY0NTE3ODUxMDEyNTMxNzA4ODEwMzA3IDI0NTcyMDYuMjQ3MTI0ODM4MjEzNjI3MzY0MzIwODEwOSAtPiAtMzI2Mzc0MzQ2NDUxNzg1MTAxMjUzMTcxMTI2NzUxMy4yIEluZXhhY3QgUm91bmRlZAorYWRkeDMyMjIgYWRkIDI4NTY1ODY3NDQuMDU0ODYzNzc5NzI5MTE1MTE1NDkwMkUtODk1IDk1MzU0NTYzNzY0Ni41NzY5NDgzNTg2MDMzOTU4MjgyMUUrMDgwIC0+IDkuNTM1NDU2Mzc2NDY1NzY5NDgzNTg2MDMzOTU4MjgyMUUrOTEgSW5leGFjdCBSb3VuZGVkCitjb214MzIyMiBjb21wYXJlIDI4NTY1ODY3NDQuMDU0ODYzNzc5NzI5MTE1MTE1NDkwMkUtODk1IDk1MzU0NTYzNzY0Ni41NzY5NDgzNTg2MDMzOTU4MjgyMUUrMDgwIC0+IC0xCitkaXZ4MzIyMiBkaXZpZGUgMjg1NjU4Njc0NC4wNTQ4NjM3Nzk3MjkxMTUxMTU0OTAyRS04OTUgOTUzNTQ1NjM3NjQ2LjU3Njk0ODM1ODYwMzM5NTgyODIxRSswODAgLT4gMi45OTU3NTI1MTcwMDA3OTgwMDA4NzEyODI4OTY4MzAwRS05NzggSW5leGFjdCBSb3VuZGVkCitkdml4MzIyMiBkaXZpZGVpbnQgMjg1NjU4Njc0NC4wNTQ4NjM3Nzk3MjkxMTUxMTU0OTAyRS04OTUgOTUzNTQ1NjM3NjQ2LjU3Njk0ODM1ODYwMzM5NTgyODIxRSswODAgLT4gMAorbXVseDMyMjIgbXVsdGlwbHkgMjg1NjU4Njc0NC4wNTQ4NjM3Nzk3MjkxMTUxMTU0OTAyRS04OTUgOTUzNTQ1NjM3NjQ2LjU3Njk0ODM1ODYwMzM5NTgyODIxRSswODAgLT4gMi43MjM4ODU4MjgzNTI1NTQxODU0ODI2NTk0MzQzOTU0RS03OTQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyMiBwb3dlciAyODU2NTg2NzQ0LjA1NDg2Mzc3OTcyOTExNTExNTQ5MDJFLTg5NSAxMCAtPiAzLjYxODA0NjY3NTMzMDcwNzIyNTY4MDc1OTM5ODgzMzZFLTg4NTYgSW5leGFjdCBSb3VuZGVkCityZW14MzIyMiByZW1haW5kZXIgMjg1NjU4Njc0NC4wNTQ4NjM3Nzk3MjkxMTUxMTU0OTAyRS04OTUgOTUzNTQ1NjM3NjQ2LjU3Njk0ODM1ODYwMzM5NTgyODIxRSswODAgLT4gMi44NTY1ODY3NDQwNTQ4NjM3Nzk3MjkxMTUxMTU0OTAyRS04ODYKK3N1YngzMjIyIHN1YnRyYWN0IDI4NTY1ODY3NDQuMDU0ODYzNzc5NzI5MTE1MTE1NDkwMkUtODk1IDk1MzU0NTYzNzY0Ni41NzY5NDgzNTg2MDMzOTU4MjgyMUUrMDgwIC0+IC05LjUzNTQ1NjM3NjQ2NTc2OTQ4MzU4NjAzMzk1ODI4MjFFKzkxIEluZXhhY3QgUm91bmRlZAorYWRkeDMyMjMgYWRkIDU2MjQxNTcyMzMuMzQzMzY2MTAwOTIwMzUyOTkzNzYyNSA2MjYwOTg0MDkyNjUuOTM3Mzg1ODY3NTAwOTAxNjA2MzggLT4gNjMxNzIyNTY2NDk5LjI4MDc1MTk2ODQyMTI1NDYwMDE0IEluZXhhY3QgUm91bmRlZAorY29teDMyMjMgY29tcGFyZSA1NjI0MTU3MjMzLjM0MzM2NjEwMDkyMDM1Mjk5Mzc2MjUgNjI2MDk4NDA5MjY1LjkzNzM4NTg2NzUwMDkwMTYwNjM4IC0+IC0xCitkaXZ4MzIyMyBkaXZpZGUgNTYyNDE1NzIzMy4zNDMzNjYxMDA5MjAzNTI5OTM3NjI1IDYyNjA5ODQwOTI2NS45MzczODU4Njc1MDA5MDE2MDYzOCAtPiAwLjAwODk4Mjg2NDU5NDYyMDc1ODA0OTI3NTI1NDQyMTgzMTYgSW5leGFjdCBSb3VuZGVkCitkdml4MzIyMyBkaXZpZGVpbnQgNTYyNDE1NzIzMy4zNDMzNjYxMDA5MjAzNTI5OTM3NjI1IDYyNjA5ODQwOTI2NS45MzczODU4Njc1MDA5MDE2MDYzOCAtPiAwCittdWx4MzIyMyBtdWx0aXBseSA1NjI0MTU3MjMzLjM0MzM2NjEwMDkyMDM1Mjk5Mzc2MjUgNjI2MDk4NDA5MjY1LjkzNzM4NTg2NzUwMDkwMTYwNjM4IC0+IDM1MjEyNzU4OTcyNTc3OTY5Mzg4MzMuODk3NTAzNzkwOSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjIzIHBvd2VyIDU2MjQxNTcyMzMuMzQzMzY2MTAwOTIwMzUyOTkzNzYyNSA2IC0+IDMuMTY0Nzg4NzE5NjMwMzI2MjU0MDE1ODMyODQ1OTAzMEUrNTggSW5leGFjdCBSb3VuZGVkCityZW14MzIyMyByZW1haW5kZXIgNTYyNDE1NzIzMy4zNDMzNjYxMDA5MjAzNTI5OTM3NjI1IDYyNjA5ODQwOTI2NS45MzczODU4Njc1MDA5MDE2MDYzOCAtPiA1NjI0MTU3MjMzLjM0MzM2NjEwMDkyMDM1Mjk5Mzc2MjUKK3N1YngzMjIzIHN1YnRyYWN0IDU2MjQxNTcyMzMuMzQzMzY2MTAwOTIwMzUyOTkzNzYyNSA2MjYwOTg0MDkyNjUuOTM3Mzg1ODY3NTAwOTAxNjA2MzggLT4gLTYyMDQ3NDI1MjAzMi41OTQwMTk3NjY1ODA1NDg2MTI2MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjI0IGFkZCAtMjEzNDk5MzYyLjkxNDc2OTk4NzAxODM0MDY3MDkyNjExIDQxOTI3MjQzOC4wMjU1NTc1NzY5OTg2MzAyMjY0MzQ0NCAtPiAyMDU3NzMwNzUuMTEwNzg3NTg5OTgwMjg5NTU1NTA4MzMKK2NvbXgzMjI0IGNvbXBhcmUgLTIxMzQ5OTM2Mi45MTQ3Njk5ODcwMTgzNDA2NzA5MjYxMSA0MTkyNzI0MzguMDI1NTU3NTc2OTk4NjMwMjI2NDM0NDQgLT4gLTEKK2RpdngzMjI0IGRpdmlkZSAtMjEzNDk5MzYyLjkxNDc2OTk4NzAxODM0MDY3MDkyNjExIDQxOTI3MjQzOC4wMjU1NTc1NzY5OTg2MzAyMjY0MzQ0NCAtPiAtMC41MDkyMTM5MjI4NjE2Njg1NTc3OTgyODA2MTE0Nzc4NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjI0IGRpdmlkZWludCAtMjEzNDk5MzYyLjkxNDc2OTk4NzAxODM0MDY3MDkyNjExIDQxOTI3MjQzOC4wMjU1NTc1NzY5OTg2MzAyMjY0MzQ0NCAtPiAtMAorbXVseDMyMjQgbXVsdGlwbHkgLTIxMzQ5OTM2Mi45MTQ3Njk5ODcwMTgzNDA2NzA5MjYxMSA0MTkyNzI0MzguMDI1NTU3NTc2OTk4NjMwMjI2NDM0NDQgLT4gLTg5NTE0Mzk4NDA2MTc4OTI1LjA3MzI2MDc3NjQxMDY3MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjI0IHBvd2VyIC0yMTM0OTkzNjIuOTE0NzY5OTg3MDE4MzQwNjcwOTI2MTEgNDE5MjcyNDM4IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMyMjQgcmVtYWluZGVyIC0yMTM0OTkzNjIuOTE0NzY5OTg3MDE4MzQwNjcwOTI2MTEgNDE5MjcyNDM4LjAyNTU1NzU3Njk5ODYzMDIyNjQzNDQ0IC0+IC0yMTM0OTkzNjIuOTE0NzY5OTg3MDE4MzQwNjcwOTI2MTEKK3N1YngzMjI0IHN1YnRyYWN0IC0yMTM0OTkzNjIuOTE0NzY5OTg3MDE4MzQwNjcwOTI2MTEgNDE5MjcyNDM4LjAyNTU1NzU3Njk5ODYzMDIyNjQzNDQ0IC0+IC02MzI3NzE4MDAuOTQwMzI3NTY0MDE2OTcwODk3MzYwNTUKK2FkZHgzMjI1IGFkZCAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDMwMjc0LjM5MjM1NjYxNDEwMTIzODMxNjg0NTQwMTUxOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjI1IGNvbXBhcmUgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxCitkaXZ4MzIyNSBkaXZpZGUgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiA2MzAwLjEyNTIxNzg4Mzc2NTUzNTk4MzE1MjcxNzM4MzIgSW5leGFjdCBSb3VuZGVkCitkdml4MzIyNSBkaXZpZGVpbnQgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiA2MzAwCittdWx4MzIyNSBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MTE5OTI4MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjI1IHBvd2VyIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA1IC0+IDI1NDExNjMwNDgxNTQ3NDY0MTI4MzgzLjIyMDM2ODIwOCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjI1IHJlbWFpbmRlciAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDAuNjAxNjIxOTY2MjUxOTExNTM3Mzc2Njk3MDExOTEwMAorc3VieDMyMjUgc3VidHJhY3QgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAzMDI2NC43ODMxNTQ2NjY5MDMwNjM2Mzc2NTgxMzk1OTAgSW5leGFjdCBSb3VuZGVkCithZGR4MzIyNiBhZGQgNDcuNTI1Njc2NDU5MzUxNTA1NjgyMDA1MzU5Njk5NjgwRSs3MDQgLTU4NjMxOTQzNTA4NDM2NjU3MzgzMzY5NzYwOTcwMjEwIC0+IDQuNzUyNTY3NjQ1OTM1MTUwNTY4MjAwNTM1OTY5OTY4MEUrNzA1IEluZXhhY3QgUm91bmRlZAorY29teDMyMjYgY29tcGFyZSA0Ny41MjU2NzY0NTkzNTE1MDU2ODIwMDUzNTk2OTk2ODBFKzcwNCAtNTg2MzE5NDM1MDg0MzY2NTczODMzNjk3NjA5NzAyMTAgLT4gMQorZGl2eDMyMjYgZGl2aWRlIDQ3LjUyNTY3NjQ1OTM1MTUwNTY4MjAwNTM1OTY5OTY4MEUrNzA0IC01ODYzMTk0MzUwODQzNjY1NzM4MzM2OTc2MDk3MDIxMCAtPiAtOC4xMDU3NjUxNTM4NTU1ODU0NTIwOTk0NDM4MDM4NTM3RSs2NzMgSW5leGFjdCBSb3VuZGVkCitkdml4MzIyNiBkaXZpZGVpbnQgNDcuNTI1Njc2NDU5MzUxNTA1NjgyMDA1MzU5Njk5NjgwRSs3MDQgLTU4NjMxOTQzNTA4NDM2NjU3MzgzMzY5NzYwOTcwMjEwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzIyNiBtdWx0aXBseSA0Ny41MjU2NzY0NTkzNTE1MDU2ODIwMDUzNTk2OTk2ODBFKzcwNCAtNTg2MzE5NDM1MDg0MzY2NTczODMzNjk3NjA5NzAyMTAgLT4gLTIuNzg2NTIyNzc3MzY0OTM1Mzc2OTg3Njk3NTM2NjUwNkUrNzM3IEluZXhhY3QgUm91bmRlZAorcG93eDMyMjYgcG93ZXIgNDcuNTI1Njc2NDU5MzUxNTA1NjgyMDA1MzU5Njk5NjgwRSs3MDQgLTYgLT4gOC42NzgyMTAwMzkzOTQxMjI2NTM1MTUwMzg1NDc1NDY0RS00MjM1IEluZXhhY3QgUm91bmRlZAorcmVteDMyMjYgcmVtYWluZGVyIDQ3LjUyNTY3NjQ1OTM1MTUwNTY4MjAwNTM1OTY5OTY4MEUrNzA0IC01ODYzMTk0MzUwODQzNjY1NzM4MzM2OTc2MDk3MDIxMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMyMjYgc3VidHJhY3QgNDcuNTI1Njc2NDU5MzUxNTA1NjgyMDA1MzU5Njk5NjgwRSs3MDQgLTU4NjMxOTQzNTA4NDM2NjU3MzgzMzY5NzYwOTcwMjEwIC0+IDQuNzUyNTY3NjQ1OTM1MTUwNTY4MjAwNTM1OTY5OTY4MEUrNzA1IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMjcgYWRkIC03NDM5Njg2MjI3MzgwMC42MjU2NzkxMzA3NzI5MzU1NTAgLTExNTYxNjYwNS41MjgyNjk4MTI4NDE4Mzk5MjAxMzE1NyAtPiAtNzQzOTY5Nzc4OTA0MDYuMTUzOTQ4OTQzNjE0Nzc1NDcwIEluZXhhY3QgUm91bmRlZAorY29teDMyMjcgY29tcGFyZSAtNzQzOTY4NjIyNzM4MDAuNjI1Njc5MTMwNzcyOTM1NTUwIC0xMTU2MTY2MDUuNTI4MjY5ODEyODQxODM5OTIwMTMxNTcgLT4gLTEKK2RpdngzMjI3IGRpdmlkZSAtNzQzOTY4NjIyNzM4MDAuNjI1Njc5MTMwNzcyOTM1NTUwIC0xMTU2MTY2MDUuNTI4MjY5ODEyODQxODM5OTIwMTMxNTcgLT4gNjQzNDc5LjAzOTQ4NDU5NzE2NDI0Nzc4MDA1NjEzMTEyIEluZXhhY3QgUm91bmRlZAorZHZpeDMyMjcgZGl2aWRlaW50IC03NDM5Njg2MjI3MzgwMC42MjU2NzkxMzA3NzI5MzU1NTAgLTExNTYxNjYwNS41MjgyNjk4MTI4NDE4Mzk5MjAxMzE1NyAtPiA2NDM0NzkKK211bHgzMjI3IG11bHRpcGx5IC03NDM5Njg2MjI3MzgwMC42MjU2NzkxMzA3NzI5MzU1NTAgLTExNTYxNjYwNS41MjgyNjk4MTI4NDE4Mzk5MjAxMzE1NyAtPiA4NjAxNTEyNjc4MDUxMDI1Mjk3Mjk3LjcxNjk2NTQ0NjcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyNyBwb3dlciAtNzQzOTY4NjIyNzM4MDAuNjI1Njc5MTMwNzcyOTM1NTUwIC0xMTU2MTY2MDYgLT4gMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyMjcgcmVtYWluZGVyIC03NDM5Njg2MjI3MzgwMC42MjU2NzkxMzA3NzI5MzU1NTAgLTExNTYxNjYwNS41MjgyNjk4MTI4NDE4Mzk5MjAxMzE1NyAtPiAtNDU2NTA3NS4wOTQ3ODE0NzY0NjI5NjkyMDc0Njc5Nworc3VieDMyMjcgc3VidHJhY3QgLTc0Mzk2ODYyMjczODAwLjYyNTY3OTEzMDc3MjkzNTU1MCAtMTE1NjE2NjA1LjUyODI2OTgxMjg0MTgzOTkyMDEzMTU3IC0+IC03NDM5Njc0NjY1NzE5NS4wOTc0MDkzMTc5MzEwOTU2MzAgSW5leGFjdCBSb3VuZGVkCithZGR4MzIyOCBhZGQgNjc1ODU1NjAuNTYyNTYxMjI5NDk3NzIwOTU1NzA1OTc5IDgyNi45NjI5MDI4ODYwODU2NjczNzE3NzUwMzQ1MTYxMyAtPiA2NzU4NjM4Ny41MjU0NjQxMTU1ODMzODgzMjc0ODEwMTQgSW5leGFjdCBSb3VuZGVkCitjb214MzIyOCBjb21wYXJlIDY3NTg1NTYwLjU2MjU2MTIyOTQ5NzcyMDk1NTcwNTk3OSA4MjYuOTYyOTAyODg2MDg1NjY3MzcxNzc1MDM0NTE2MTMgLT4gMQorZGl2eDMyMjggZGl2aWRlIDY3NTg1NTYwLjU2MjU2MTIyOTQ5NzcyMDk1NTcwNTk3OSA4MjYuOTYyOTAyODg2MDg1NjY3MzcxNzc1MDM0NTE2MTMgLT4gODE3MjcuNDM5NDM3MzU0MjQ4Nzg5ODUyNzE1NTg2NTEwIEluZXhhY3QgUm91bmRlZAorZHZpeDMyMjggZGl2aWRlaW50IDY3NTg1NTYwLjU2MjU2MTIyOTQ5NzcyMDk1NTcwNTk3OSA4MjYuOTYyOTAyODg2MDg1NjY3MzcxNzc1MDM0NTE2MTMgLT4gODE3MjcKK211bHgzMjI4IG11bHRpcGx5IDY3NTg1NTYwLjU2MjU2MTIyOTQ5NzcyMDk1NTcwNTk3OSA4MjYuOTYyOTAyODg2MDg1NjY3MzcxNzc1MDM0NTE2MTMgLT4gNTU4OTA3NTEzNTUuOTk4OTgzNDMzODk1OTEwMjk1NTk2IEluZXhhY3QgUm91bmRlZAorcG93eDMyMjggcG93ZXIgNjc1ODU1NjAuNTYyNTYxMjI5NDk3NzIwOTU1NzA1OTc5IDgyNyAtPiAxLjk0NjIyMDQ1ODMzNTIxOTExMDg3ODExOTc3ODgyNTVFKzY0NzUgSW5leGFjdCBSb3VuZGVkCityZW14MzIyOCByZW1haW5kZXIgNjc1ODU1NjAuNTYyNTYxMjI5NDk3NzIwOTU1NzA1OTc5IDgyNi45NjI5MDI4ODYwODU2NjczNzE3NzUwMzQ1MTYxMyAtPiAzNjMuMzk4MzkwMTA2MTYwNDI3ODk3NDYwMDc5MjQzNDkKK3N1YngzMjI4IHN1YnRyYWN0IDY3NTg1NTYwLjU2MjU2MTIyOTQ5NzcyMDk1NTcwNTk3OSA4MjYuOTYyOTAyODg2MDg1NjY3MzcxNzc1MDM0NTE2MTMgLT4gNjc1ODQ3MzMuNTk5NjU4MzQzNDEyMDUzNTgzOTMwOTQ0IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMjkgYWRkIDY4NzczODY4NjguOTQ5ODA1MTg2MDc0MjI5ODczNTE1NkUtMjMyIDM5MC4zMTU0Mjg5ODYwNjQzNTA5MzkzNzY5NzU0NTUxIC0+IDM5MC4zMTU0Mjg5ODYwNjQzNTA5MzkzNzY5NzU0NTUxMCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjI5IGNvbXBhcmUgNjg3NzM4Njg2OC45NDk4MDUxODYwNzQyMjk4NzM1MTU2RS0yMzIgMzkwLjMxNTQyODk4NjA2NDM1MDkzOTM3Njk3NTQ1NTEgLT4gLTEKK2RpdngzMjI5IGRpdmlkZSA2ODc3Mzg2ODY4Ljk0OTgwNTE4NjA3NDIyOTg3MzUxNTZFLTIzMiAzOTAuMzE1NDI4OTg2MDY0MzUwOTM5Mzc2OTc1NDU1MSAtPiAxLjc2MjAwNzQzMjUwNTQwMzgxNzQ1NzE1NjQ0MDk4NzFFLTIyNSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjI5IGRpdmlkZWludCA2ODc3Mzg2ODY4Ljk0OTgwNTE4NjA3NDIyOTg3MzUxNTZFLTIzMiAzOTAuMzE1NDI4OTg2MDY0MzUwOTM5Mzc2OTc1NDU1MSAtPiAwCittdWx4MzIyOSBtdWx0aXBseSA2ODc3Mzg2ODY4Ljk0OTgwNTE4NjA3NDIyOTg3MzUxNTZFLTIzMiAzOTAuMzE1NDI4OTg2MDY0MzUwOTM5Mzc2OTc1NDU1MSAtPiAyLjY4NDM1MDIwNjA1NzI2OTE0MDgwOTE2NjM4MjI3MzJFLTIyMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjI5IHBvd2VyIDY4NzczODY4NjguOTQ5ODA1MTg2MDc0MjI5ODczNTE1NkUtMjMyIDM5MCAtPiAwRS0xMDAzMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzIyOSByZW1haW5kZXIgNjg3NzM4Njg2OC45NDk4MDUxODYwNzQyMjk4NzM1MTU2RS0yMzIgMzkwLjMxNTQyODk4NjA2NDM1MDkzOTM3Njk3NTQ1NTEgLT4gNi44NzczODY4Njg5NDk4MDUxODYwNzQyMjk4NzM1MTU2RS0yMjMKK3N1YngzMjI5IHN1YnRyYWN0IDY4NzczODY4NjguOTQ5ODA1MTg2MDc0MjI5ODczNTE1NkUtMjMyIDM5MC4zMTU0Mjg5ODYwNjQzNTA5MzkzNzY5NzU0NTUxIC0+IC0zOTAuMzE1NDI4OTg2MDY0MzUwOTM5Mzc2OTc1NDU1MTAgSW5leGFjdCBSb3VuZGVkCithZGR4MzIzMCBhZGQgLTE2NDczMzUuMjAxMTQ0NjA5MjU2MTM0OTI1ODM4OTM3IC0xODY2NTQ4MjM3ODIuNTA0NTk4MDIyMzUwMjQyMzA4NTYgLT4gLTE4NjY1NjQ3MTExNy43MDU3NDI2MzE2MDYzNzcyMzQ0MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjMwIGNvbXBhcmUgLTE2NDczMzUuMjAxMTQ0NjA5MjU2MTM0OTI1ODM4OTM3IC0xODY2NTQ4MjM3ODIuNTA0NTk4MDIyMzUwMjQyMzA4NTYgLT4gMQorZGl2eDMyMzAgZGl2aWRlIC0xNjQ3MzM1LjIwMTE0NDYwOTI1NjEzNDkyNTgzODkzNyAtMTg2NjU0ODIzNzgyLjUwNDU5ODAyMjM1MDI0MjMwODU2IC0+IDAuMDAwMDA4ODI1NTY5OTM1Nzg3NjIzMzQ1ODY2MDMzMTE0NjU4MyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjMwIGRpdmlkZWludCAtMTY0NzMzNS4yMDExNDQ2MDkyNTYxMzQ5MjU4Mzg5MzcgLTE4NjY1NDgyMzc4Mi41MDQ1OTgwMjIzNTAyNDIzMDg1NiAtPiAwCittdWx4MzIzMCBtdWx0aXBseSAtMTY0NzMzNS4yMDExNDQ2MDkyNTYxMzQ5MjU4Mzg5MzcgLTE4NjY1NDgyMzc4Mi41MDQ1OTgwMjIzNTAyNDIzMDg1NiAtPiAzMDc0ODMwNjE2ODAzNjM4MDcuNDg3NzU2MTkzMzMyODUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzMCBwb3dlciAtMTY0NzMzNS4yMDExNDQ2MDkyNTYxMzQ5MjU4Mzg5MzcgLTIgLT4gMy42ODQ5ODc2OTkwNDM5NTAyMTUyNzg0Mzg5MjM3ODkxRS0xMyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjMwIHJlbWFpbmRlciAtMTY0NzMzNS4yMDExNDQ2MDkyNTYxMzQ5MjU4Mzg5MzcgLTE4NjY1NDgyMzc4Mi41MDQ1OTgwMjIzNTAyNDIzMDg1NiAtPiAtMTY0NzMzNS4yMDExNDQ2MDkyNTYxMzQ5MjU4Mzg5MzcKK3N1YngzMjMwIHN1YnRyYWN0IC0xNjQ3MzM1LjIwMTE0NDYwOTI1NjEzNDkyNTgzODkzNyAtMTg2NjU0ODIzNzgyLjUwNDU5ODAyMjM1MDI0MjMwODU2IC0+IDE4NjY1MzE3NjQ0Ny4zMDM0NTM0MTMwOTQxMDczODI3MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjMxIGFkZCA0MTQwNzgxODE0MDk0OC44NjY2MzA5MjM5MzQxMzgxNTUgLTUxNTYuNzYyNDUzNDAwMDMxMTM0MjMxMDEwNjY3MTYyN0UtOTYzIC0+IDQxNDA3ODE4MTQwOTQ4Ljg2NjYzMDkyMzkzNDEzODE1NSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjMxIGNvbXBhcmUgNDE0MDc4MTgxNDA5NDguODY2NjMwOTIzOTM0MTM4MTU1IC01MTU2Ljc2MjQ1MzQwMDAzMTEzNDIzMTAxMDY2NzE2MjdFLTk2MyAtPiAxCitkaXZ4MzIzMSBkaXZpZGUgNDE0MDc4MTgxNDA5NDguODY2NjMwOTIzOTM0MTM4MTU1IC01MTU2Ljc2MjQ1MzQwMDAzMTEzNDIzMTAxMDY2NzE2MjdFLTk2MyAtPiAtOC4wMjk4MDkxMTI4MTc5MjA0MDc2Nzk2NTA3Njk3NTE3RSs5NzIgSW5leGFjdCBSb3VuZGVkCitkdml4MzIzMSBkaXZpZGVpbnQgNDE0MDc4MTgxNDA5NDguODY2NjMwOTIzOTM0MTM4MTU1IC01MTU2Ljc2MjQ1MzQwMDAzMTEzNDIzMTAxMDY2NzE2MjdFLTk2MyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyMzEgbXVsdGlwbHkgNDE0MDc4MTgxNDA5NDguODY2NjMwOTIzOTM0MTM4MTU1IC01MTU2Ljc2MjQ1MzQwMDAzMTEzNDIzMTAxMDY2NzE2MjdFLTk2MyAtPiAtMi4xMzUzMDI4MTg2NjQ2MTc5MzY5MjIwODM0NjkxMTU2RS05NDYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzMSBwb3dlciA0MTQwNzgxODE0MDk0OC44NjY2MzA5MjM5MzQxMzgxNTUgLTUgLT4gOC4yMTQ2MzQ4NTU2NjQ4NTQ3NTI1NjkzNTI4MDA0MDgxRS02OSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjMxIHJlbWFpbmRlciA0MTQwNzgxODE0MDk0OC44NjY2MzA5MjM5MzQxMzgxNTUgLTUxNTYuNzYyNDUzNDAwMDMxMTM0MjMxMDEwNjY3MTYyN0UtOTYzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzIzMSBzdWJ0cmFjdCA0MTQwNzgxODE0MDk0OC44NjY2MzA5MjM5MzQxMzgxNTUgLTUxNTYuNzYyNDUzNDAwMDMxMTM0MjMxMDEwNjY3MTYyN0UtOTYzIC0+IDQxNDA3ODE4MTQwOTQ4Ljg2NjYzMDkyMzkzNDEzODE1NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjMyIGFkZCAtNi42NTQ3NDI0MDEyNTE2ODM0NjYyMDExNzA2MTY1Mjk3IC01NzQ0NTQ1ODU1ODAuMDYyMTU5NzQxMzk4ODQ3NDY0NDEgLT4gLTU3NDQ1NDU4NTU4Ni43MTY5MDIxNDI2NTA1MzA5MzA2MSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjMyIGNvbXBhcmUgLTYuNjU0NzQyNDAxMjUxNjgzNDY2MjAxMTcwNjE2NTI5NyAtNTc0NDU0NTg1NTgwLjA2MjE1OTc0MTM5ODg0NzQ2NDQxIC0+IDEKK2RpdngzMjMyIGRpdmlkZSAtNi42NTQ3NDI0MDEyNTE2ODM0NjYyMDExNzA2MTY1Mjk3IC01NzQ0NTQ1ODU1ODAuMDYyMTU5NzQxMzk4ODQ3NDY0NDEgLT4gMS4xNTg0NDUzNDQyMDk3NTY4NzQ1NDExNTY4MDM3MDc4RS0xMSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjMyIGRpdmlkZWludCAtNi42NTQ3NDI0MDEyNTE2ODM0NjYyMDExNzA2MTY1Mjk3IC01NzQ0NTQ1ODU1ODAuMDYyMTU5NzQxMzk4ODQ3NDY0NDEgLT4gMAorbXVseDMyMzIgbXVsdGlwbHkgLTYuNjU0NzQyNDAxMjUxNjgzNDY2MjAxMTcwNjE2NTI5NyAtNTc0NDU0NTg1NTgwLjA2MjE1OTc0MTM5ODg0NzQ2NDQxIC0+IDM4MjI4NDcyODgyNTMuMTAzNTU1OTIwNjY5MTUzMjgyNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjMyIHBvd2VyIC02LjY1NDc0MjQwMTI1MTY4MzQ2NjIwMTE3MDYxNjUyOTcgLTYgLT4gMC4wMDAwMTE1MTM2MzYyODMzODg3OTE0ODgxMjgyMzkyMzI5MDYgSW5leGFjdCBSb3VuZGVkCityZW14MzIzMiByZW1haW5kZXIgLTYuNjU0NzQyNDAxMjUxNjgzNDY2MjAxMTcwNjE2NTI5NyAtNTc0NDU0NTg1NTgwLjA2MjE1OTc0MTM5ODg0NzQ2NDQxIC0+IC02LjY1NDc0MjQwMTI1MTY4MzQ2NjIwMTE3MDYxNjUyOTcKK3N1YngzMjMyIHN1YnRyYWN0IC02LjY1NDc0MjQwMTI1MTY4MzQ2NjIwMTE3MDYxNjUyOTcgLTU3NDQ1NDU4NTU4MC4wNjIxNTk3NDEzOTg4NDc0NjQ0MSAtPiA1NzQ0NTQ1ODU1NzMuNDA3NDE3MzQwMTQ3MTYzOTk4MjEgSW5leGFjdCBSb3VuZGVkCithZGR4MzIzMyBhZGQgLTI3NjI3Ljc1ODc0NTM4MTI2Nzc4MDg4NTA2NzQ0NzY3MSAtMjMzODU5NzIxODk0NDEuNzA5NTg2NDMzNzU4MTExMDYyIC0+IC0yMzM4NTk3MjIxNzA2OS40NjgzMzE4MTUwMjU4OTE5NDcgSW5leGFjdCBSb3VuZGVkCitjb214MzIzMyBjb21wYXJlIC0yNzYyNy43NTg3NDUzODEyNjc3ODA4ODUwNjc0NDc2NzEgLTIzMzg1OTcyMTg5NDQxLjcwOTU4NjQzMzc1ODExMTA2MiAtPiAxCitkaXZ4MzIzMyBkaXZpZGUgLTI3NjI3Ljc1ODc0NTM4MTI2Nzc4MDg4NTA2NzQ0NzY3MSAtMjMzODU5NzIxODk0NDEuNzA5NTg2NDMzNzU4MTExMDYyIC0+IDEuMTgxMzgxNjY0MjU0ODkyMDE5NDcwOTg5ODExMTYyNEUtOSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjMzIGRpdmlkZWludCAtMjc2MjcuNzU4NzQ1MzgxMjY3NzgwODg1MDY3NDQ3NjcxIC0yMzM4NTk3MjE4OTQ0MS43MDk1ODY0MzM3NTgxMTEwNjIgLT4gMAorbXVseDMyMzMgbXVsdGlwbHkgLTI3NjI3Ljc1ODc0NTM4MTI2Nzc4MDg4NTA2NzQ0NzY3MSAtMjMzODU5NzIxODk0NDEuNzA5NTg2NDMzNzU4MTExMDYyIC0+IDY0NjEwMTk5NzY3NjA5MTMwNi40MTQ4NTM5MzY3ODY1NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjMzIHBvd2VyIC0yNzYyNy43NTg3NDUzODEyNjc3ODA4ODUwNjc0NDc2NzEgLTIgLT4gMS4zMTAxMTI4MDA5NTYwODEyNTI5MTk4NTIxOTIyMjY5RS05IEluZXhhY3QgUm91bmRlZAorcmVteDMyMzMgcmVtYWluZGVyIC0yNzYyNy43NTg3NDUzODEyNjc3ODA4ODUwNjc0NDc2NzEgLTIzMzg1OTcyMTg5NDQxLjcwOTU4NjQzMzc1ODExMTA2MiAtPiAtMjc2MjcuNzU4NzQ1MzgxMjY3NzgwODg1MDY3NDQ3NjcxCitzdWJ4MzIzMyBzdWJ0cmFjdCAtMjc2MjcuNzU4NzQ1MzgxMjY3NzgwODg1MDY3NDQ3NjcxIC0yMzM4NTk3MjE4OTQ0MS43MDk1ODY0MzM3NTgxMTEwNjIgLT4gMjMzODU5NzIxNjE4MTMuOTUwODQxMDUyNDkwMzMwMTc3IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMzQgYWRkIDIwOTgxOS43NDM3OTA5OTkxNDc1Mjk2MzcxMTk0NDMwN0UtMjI4IC00NDAyMzAuNjcwMDk4OTUzMjQ2NzgzMTM3MDMyMDI2NkUtOTYwIC0+IDIuMDk4MTk3NDM3OTA5OTkxNDc1Mjk2MzcxMTk0NDMwN0UtMjIzIEluZXhhY3QgUm91bmRlZAorY29teDMyMzQgY29tcGFyZSAyMDk4MTkuNzQzNzkwOTk5MTQ3NTI5NjM3MTE5NDQzMDdFLTIyOCAtNDQwMjMwLjY3MDA5ODk1MzI0Njc4MzEzNzAzMjAyNjZFLTk2MCAtPiAxCitkaXZ4MzIzNCBkaXZpZGUgMjA5ODE5Ljc0Mzc5MDk5OTE0NzUyOTYzNzExOTQ0MzA3RS0yMjggLTQ0MDIzMC42NzAwOTg5NTMyNDY3ODMxMzcwMzIwMjY2RS05NjAgLT4gLTQuNzY2MTMxODk0OTg2NzA2MDU5NTU0NTc2NTA1MzE4N0UrNzMxIEluZXhhY3QgUm91bmRlZAorZHZpeDMyMzQgZGl2aWRlaW50IDIwOTgxOS43NDM3OTA5OTkxNDc1Mjk2MzcxMTk0NDMwN0UtMjI4IC00NDAyMzAuNjcwMDk4OTUzMjQ2NzgzMTM3MDMyMDI2NkUtOTYwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzIzNCBtdWx0aXBseSAyMDk4MTkuNzQzNzkwOTk5MTQ3NTI5NjM3MTE5NDQzMDdFLTIyOCAtNDQwMjMwLjY3MDA5ODk1MzI0Njc4MzEzNzAzMjAyNjZFLTk2MCAtPiAtOS4yMzY5MDg2NDA5MTAyMjM5NTczNzI2MzE2NTkzNjQ4RS0xMTc4IEluZXhhY3QgUm91bmRlZAorcG93eDMyMzQgcG93ZXIgMjA5ODE5Ljc0Mzc5MDk5OTE0NzUyOTYzNzExOTQ0MzA3RS0yMjggLTQgLT4gNS4xNTk1ODI4NDk0MTExNjkwOTEwNjUwOTE5Nzc2NzA1RSs4OTAgSW5leGFjdCBSb3VuZGVkCityZW14MzIzNCByZW1haW5kZXIgMjA5ODE5Ljc0Mzc5MDk5OTE0NzUyOTYzNzExOTQ0MzA3RS0yMjggLTQ0MDIzMC42NzAwOTg5NTMyNDY3ODMxMzcwMzIwMjY2RS05NjAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjM0IHN1YnRyYWN0IDIwOTgxOS43NDM3OTA5OTkxNDc1Mjk2MzcxMTk0NDMwN0UtMjI4IC00NDAyMzAuNjcwMDk4OTUzMjQ2NzgzMTM3MDMyMDI2NkUtOTYwIC0+IDIuMDk4MTk3NDM3OTA5OTkxNDc1Mjk2MzcxMTk0NDMwN0UtMjIzIEluZXhhY3QgUm91bmRlZAorYWRkeDMyMzUgYWRkIDIuMzQ4ODQ1NzYwMDQxNTQ3NDI3MDI1OTMzMDg2NTE4NCA5MTgyNDM0LjY2NjAyMTI0ODI1MDAzNzYyMjA1MDg2MDVFLTYxMiAtPiAyLjM0ODg0NTc2MDA0MTU0NzQyNzAyNTkzMzA4NjUxODQgSW5leGFjdCBSb3VuZGVkCitjb214MzIzNSBjb21wYXJlIDIuMzQ4ODQ1NzYwMDQxNTQ3NDI3MDI1OTMzMDg2NTE4NCA5MTgyNDM0LjY2NjAyMTI0ODI1MDAzNzYyMjA1MDg2MDVFLTYxMiAtPiAxCitkaXZ4MzIzNSBkaXZpZGUgMi4zNDg4NDU3NjAwNDE1NDc0MjcwMjU5MzMwODY1MTg0IDkxODI0MzQuNjY2MDIxMjQ4MjUwMDM3NjIyMDUwODYwNUUtNjEyIC0+IDIuNTU3OTc3MTAwMjcwODQwMjc1MzQxMjI2NjU3NDk0MUUrNjA1IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMzUgZGl2aWRlaW50IDIuMzQ4ODQ1NzYwMDQxNTQ3NDI3MDI1OTMzMDg2NTE4NCA5MTgyNDM0LjY2NjAyMTI0ODI1MDAzNzYyMjA1MDg2MDVFLTYxMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyMzUgbXVsdGlwbHkgMi4zNDg4NDU3NjAwNDE1NDc0MjcwMjU5MzMwODY1MTg0IDkxODI0MzQuNjY2MDIxMjQ4MjUwMDM3NjIyMDUwODYwNUUtNjEyIC0+IDIuMTU2ODEyMjczMjE0MjUzMTU1NjIxNTIwNDQ1OTQwN0UtNjA1IEluZXhhY3QgUm91bmRlZAorcG93eDMyMzUgcG93ZXIgMi4zNDg4NDU3NjAwNDE1NDc0MjcwMjU5MzMwODY1MTg0IDkgLT4gMjE3Ni4xNTgzNDQ2MTQ3NTExNTc5MTEzMDIyNjIyMjU1IEluZXhhY3QgUm91bmRlZAorcmVteDMyMzUgcmVtYWluZGVyIDIuMzQ4ODQ1NzYwMDQxNTQ3NDI3MDI1OTMzMDg2NTE4NCA5MTgyNDM0LjY2NjAyMTI0ODI1MDAzNzYyMjA1MDg2MDVFLTYxMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMyMzUgc3VidHJhY3QgMi4zNDg4NDU3NjAwNDE1NDc0MjcwMjU5MzMwODY1MTg0IDkxODI0MzQuNjY2MDIxMjQ4MjUwMDM3NjIyMDUwODYwNUUtNjEyIC0+IDIuMzQ4ODQ1NzYwMDQxNTQ3NDI3MDI1OTMzMDg2NTE4NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjM2IGFkZCAtNTEwNzU4NjMwMDE5Ny45NzAzOTQxMDM0NDA0NTU3NDA5IDU2NjA5LjA1NDg2MDU1MDU3ODM4Njc4MDM5NDk2Njg2RS03NjggLT4gLTUxMDc1ODYzMDAxOTcuOTcwMzk0MTAzNDQwNDU1NzQwOSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjM2IGNvbXBhcmUgLTUxMDc1ODYzMDAxOTcuOTcwMzk0MTAzNDQwNDU1NzQwOSA1NjYwOS4wNTQ4NjA1NTA1NzgzODY3ODAzOTQ5NjY4NkUtNzY4IC0+IC0xCitkaXZ4MzIzNiBkaXZpZGUgLTUxMDc1ODYzMDAxOTcuOTcwMzk0MTAzNDQwNDU1NzQwOSA1NjYwOS4wNTQ4NjA1NTA1NzgzODY3ODAzOTQ5NjY4NkUtNzY4IC0+IC05LjAyMjU2MDYzNTg5MDk4Nzc4NTUzMjYzNTc0MDIyNDJFKzc3NSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjM2IGRpdmlkZWludCAtNTEwNzU4NjMwMDE5Ny45NzAzOTQxMDM0NDA0NTU3NDA5IDU2NjA5LjA1NDg2MDU1MDU3ODM4Njc4MDM5NDk2Njg2RS03NjggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjM2IG11bHRpcGx5IC01MTA3NTg2MzAwMTk3Ljk3MDM5NDEwMzQ0MDQ1NTc0MDkgNTY2MDkuMDU0ODYwNTUwNTc4Mzg2NzgwMzk0OTY2ODZFLTc2OCAtPiAtMi44OTEzNTYzMzA3MjkwMzQ2MTUyNTk2MjEyNTkzNTMyRS03NTEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzNiBwb3dlciAtNTEwNzU4NjMwMDE5Ny45NzAzOTQxMDM0NDA0NTU3NDA5IDYgLT4gMS43NzUzOTIwODk0MTg4MDIyMTI1OTE5NTU5NTY1MDI5RSs3NiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjM2IHJlbWFpbmRlciAtNTEwNzU4NjMwMDE5Ny45NzAzOTQxMDM0NDA0NTU3NDA5IDU2NjA5LjA1NDg2MDU1MDU3ODM4Njc4MDM5NDk2Njg2RS03NjggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjM2IHN1YnRyYWN0IC01MTA3NTg2MzAwMTk3Ljk3MDM5NDEwMzQ0MDQ1NTc0MDkgNTY2MDkuMDU0ODYwNTUwNTc4Mzg2NzgwMzk0OTY2ODZFLTc2OCAtPiAtNTEwNzU4NjMwMDE5Ny45NzAzOTQxMDM0NDA0NTU3NDA5IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMzcgYWRkIC03MDQ1NDA3MDA5NTg2OS43MDcxNzg3MTIxMjYwMTM5MCAtNjIwMDE3OC4zNzAyNDkyNjAwMDkxNjg4ODgzOTI0MDYgLT4gLTcwNDU0MDc2Mjk2MDQ4LjA3NzQyNzk3MjEzNTE4Mjc4OCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjM3IGNvbXBhcmUgLTcwNDU0MDcwMDk1ODY5LjcwNzE3ODcxMjEyNjAxMzkwIC02MjAwMTc4LjM3MDI0OTI2MDAwOTE2ODg4ODM5MjQwNiAtPiAtMQorZGl2eDMyMzcgZGl2aWRlIC03MDQ1NDA3MDA5NTg2OS43MDcxNzg3MTIxMjYwMTM5MCAtNjIwMDE3OC4zNzAyNDkyNjAwMDkxNjg4ODgzOTI0MDYgLT4gMTEzNjMyMzIuNzc5NTQ5NDIyNDkwNTQ4OTk3NTE3MTk0IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMzcgZGl2aWRlaW50IC03MDQ1NDA3MDA5NTg2OS43MDcxNzg3MTIxMjYwMTM5MCAtNjIwMDE3OC4zNzAyNDkyNjAwMDkxNjg4ODgzOTI0MDYgLT4gMTEzNjMyMzIKK211bHgzMjM3IG11bHRpcGx5IC03MDQ1NDA3MDA5NTg2OS43MDcxNzg3MTIxMjYwMTM5MCAtNjIwMDE3OC4zNzAyNDkyNjAwMDkxNjg4ODgzOTI0MDYgLT4gNDM2ODI3ODAxNTA0NDM2NTY2OTQ1Ljc2NjYzNjg3OTI0IEluZXhhY3QgUm91bmRlZAorcG93eDMyMzcgcG93ZXIgLTcwNDU0MDcwMDk1ODY5LjcwNzE3ODcxMjEyNjAxMzkwIC02MjAwMTc4IC0+IDBFLTEwMDMwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMjM3IHJlbWFpbmRlciAtNzA0NTQwNzAwOTU4NjkuNzA3MTc4NzEyMTI2MDEzOTAgLTYyMDAxNzguMzcwMjQ5MjYwMDA5MTY4ODg4MzkyNDA2IC0+IC00ODMzMzQ1LjQ2Nzg2NjIwMzkyMDAyODg4MzU4MzgwOAorc3VieDMyMzcgc3VidHJhY3QgLTcwNDU0MDcwMDk1ODY5LjcwNzE3ODcxMjEyNjAxMzkwIC02MjAwMTc4LjM3MDI0OTI2MDAwOTE2ODg4ODM5MjQwNiAtPiAtNzA0NTQwNjM4OTU2OTEuMzM2OTI5NDUyMTE2ODQ1MDEyIEluZXhhY3QgUm91bmRlZAorYWRkeDMyMzggYWRkIDI5MTE5LjIyMDYyMTUxMTA0NjU1ODc1NzkwMDY0NTIyOCAzNTE3NjEyLjg4MTA3NjE0NzAwMTg2NzYzMTE4NjMwMTBFLTIyMiAtPiAyOTExOS4yMjA2MjE1MTEwNDY1NTg3NTc5MDA2NDUyMjggSW5leGFjdCBSb3VuZGVkCitjb214MzIzOCBjb21wYXJlIDI5MTE5LjIyMDYyMTUxMTA0NjU1ODc1NzkwMDY0NTIyOCAzNTE3NjEyLjg4MTA3NjE0NzAwMTg2NzYzMTE4NjMwMTBFLTIyMiAtPiAxCitkaXZ4MzIzOCBkaXZpZGUgMjkxMTkuMjIwNjIxNTExMDQ2NTU4NzU3OTAwNjQ1MjI4IDM1MTc2MTIuODgxMDc2MTQ3MDAxODY3NjMxMTg2MzAxMEUtMjIyIC0+IDguMjc4MTE5NzM4MDA4OTY4NDA2MzIzOTc1MjMzNzQ2N0UrMjE5IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMzggZGl2aWRlaW50IDI5MTE5LjIyMDYyMTUxMTA0NjU1ODc1NzkwMDY0NTIyOCAzNTE3NjEyLjg4MTA3NjE0NzAwMTg2NzYzMTE4NjMwMTBFLTIyMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyMzggbXVsdGlwbHkgMjkxMTkuMjIwNjIxNTExMDQ2NTU4NzU3OTAwNjQ1MjI4IDM1MTc2MTIuODgxMDc2MTQ3MDAxODY3NjMxMTg2MzAxMEUtMjIyIC0+IDEuMDI0MzAxNDU1NDUxMjU0MjQ0MDU5Mjc2ODA4ODYwMEUtMjExIEluZXhhY3QgUm91bmRlZAorcG93eDMyMzggcG93ZXIgMjkxMTkuMjIwNjIxNTExMDQ2NTU4NzU3OTAwNjQ1MjI4IDQgLT4gNzE4OTgzNjA1MzI4NDE3NDYxLjMyODM1OTg0MjE3MjU1IEluZXhhY3QgUm91bmRlZAorcmVteDMyMzggcmVtYWluZGVyIDI5MTE5LjIyMDYyMTUxMTA0NjU1ODc1NzkwMDY0NTIyOCAzNTE3NjEyLjg4MTA3NjE0NzAwMTg2NzYzMTE4NjMwMTBFLTIyMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMyMzggc3VidHJhY3QgMjkxMTkuMjIwNjIxNTExMDQ2NTU4NzU3OTAwNjQ1MjI4IDM1MTc2MTIuODgxMDc2MTQ3MDAxODY3NjMxMTg2MzAxMEUtMjIyIC0+IDI5MTE5LjIyMDYyMTUxMTA0NjU1ODc1NzkwMDY0NTIyOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjM5IGFkZCAtNTE2OC4yMjE0MTExMDkxMTMyOTEzNzc2MDQyMjE0NTI1IC01NjkwMjc0LjA5NzExNzM0NzY1MjcxMjM1Njg2Mjc3MjAgLT4gLTU2OTU0NDIuMzE4NTI4NDU2NzY2MDAzNzM0NDY2OTkzNSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjM5IGNvbXBhcmUgLTUxNjguMjIxNDExMTA5MTEzMjkxMzc3NjA0MjIxNDUyNSAtNTY5MDI3NC4wOTcxMTczNDc2NTI3MTIzNTY4NjI3NzIwIC0+IDEKK2RpdngzMjM5IGRpdmlkZSAtNTE2OC4yMjE0MTExMDkxMTMyOTEzNzc2MDQyMjE0NTI1IC01NjkwMjc0LjA5NzExNzM0NzY1MjcxMjM1Njg2Mjc3MjAgLT4gMC4wMDA5MDgyNTUyNjU1NDYzOTkxNTU4MDUzOTMxNjcxNDQ1MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjM5IGRpdmlkZWludCAtNTE2OC4yMjE0MTExMDkxMTMyOTEzNzc2MDQyMjE0NTI1IC01NjkwMjc0LjA5NzExNzM0NzY1MjcxMjM1Njg2Mjc3MjAgLT4gMAorbXVseDMyMzkgbXVsdGlwbHkgLTUxNjguMjIxNDExMTA5MTEzMjkxMzc3NjA0MjIxNDUyNSAtNTY5MDI3NC4wOTcxMTczNDc2NTI3MTIzNTY4NjI3NzIwIC0+IDI5NDA4NTk2NDIzLjgwMTQ1NDA1Mzg1NTc5Mzg5ODMyMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjM5IHBvd2VyIC01MTY4LjIyMTQxMTEwOTExMzI5MTM3NzYwNDIyMTQ1MjUgLTU2OTAyNzQgLT4gMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyMzkgcmVtYWluZGVyIC01MTY4LjIyMTQxMTEwOTExMzI5MTM3NzYwNDIyMTQ1MjUgLTU2OTAyNzQuMDk3MTE3MzQ3NjUyNzEyMzU2ODYyNzcyMCAtPiAtNTE2OC4yMjE0MTExMDkxMTMyOTEzNzc2MDQyMjE0NTI1CitzdWJ4MzIzOSBzdWJ0cmFjdCAtNTE2OC4yMjE0MTExMDkxMTMyOTEzNzc2MDQyMjE0NTI1IC01NjkwMjc0LjA5NzExNzM0NzY1MjcxMjM1Njg2Mjc3MjAgLT4gNTY4NTEwNS44NzU3MDYyMzg1Mzk0MjA5NzkyNTg1NTA1IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNDAgYWRkIDMzNzgzLjA2MDg1NzE5NzA2NzM5MTQ2MjE0NDUxNzk2NCAtMjA3MC4wODA2OTU5NDY1MDg4MTk4NTA4MzIyODE1NDA2IC0+IDMxNzEyLjk4MDE2MTI1MDU1ODU3MTYxMTMxMjIzNjQyMyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjQwIGNvbXBhcmUgMzM3ODMuMDYwODU3MTk3MDY3MzkxNDYyMTQ0NTE3OTY0IC0yMDcwLjA4MDY5NTk0NjUwODgxOTg1MDgzMjI4MTU0MDYgLT4gMQorZGl2eDMyNDAgZGl2aWRlIDMzNzgzLjA2MDg1NzE5NzA2NzM5MTQ2MjE0NDUxNzk2NCAtMjA3MC4wODA2OTU5NDY1MDg4MTk4NTA4MzIyODE1NDA2IC0+IC0xNi4zMTk2ODMwNTU1MTk4OTI4ODEzOTQzNTg0NDkyMjAgSW5leGFjdCBSb3VuZGVkCitkdml4MzI0MCBkaXZpZGVpbnQgMzM3ODMuMDYwODU3MTk3MDY3MzkxNDYyMTQ0NTE3OTY0IC0yMDcwLjA4MDY5NTk0NjUwODgxOTg1MDgzMjI4MTU0MDYgLT4gLTE2CittdWx4MzI0MCBtdWx0aXBseSAzMzc4My4wNjA4NTcxOTcwNjczOTE0NjIxNDQ1MTc5NjQgLTIwNzAuMDgwNjk1OTQ2NTA4ODE5ODUwODMyMjgxNTQwNiAtPiAtNjk5MzM2NjIuMTMwNDY5NzY2MDgwNTc0MjM1ODQzNDQ4IEluZXhhY3QgUm91bmRlZAorcG93eDMyNDAgcG93ZXIgMzM3ODMuMDYwODU3MTk3MDY3MzkxNDYyMTQ0NTE3OTY0IC0yMDcwIC0+IDMuOTE4MTMzNjAwMTgwMzAwODU5NzI5MzgxODk4NDQwNkUtOTM3NSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjQwIHJlbWFpbmRlciAzMzc4My4wNjA4NTcxOTcwNjczOTE0NjIxNDQ1MTc5NjQgLTIwNzAuMDgwNjk1OTQ2NTA4ODE5ODUwODMyMjgxNTQwNiAtPiA2NjEuNzY5NzIyMDUyOTI2MjczODQ4ODI4MDEzMzE0NAorc3VieDMyNDAgc3VidHJhY3QgMzM3ODMuMDYwODU3MTk3MDY3MzkxNDYyMTQ0NTE3OTY0IC0yMDcwLjA4MDY5NTk0NjUwODgxOTg1MDgzMjI4MTU0MDYgLT4gMzU4NTMuMTQxNTUzMTQzNTc2MjExMzEyOTc2Nzk5NTA1IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNDEgYWRkIDQyMjA3NDM1MDkxMDUwLjg0MDI5NjM1Mzg3NDczMzE2OUUtOTA1IDczMzMwNjMzMDc4LjgyODIxNjAxODUzNjMyNjc0MzMyNUUrOTc2IC0+IDcuMzMzMDYzMzA3ODgyODIxNjAxODUzNjMyNjc0MzMyNUUrOTg2IEluZXhhY3QgUm91bmRlZAorY29teDMyNDEgY29tcGFyZSA0MjIwNzQzNTA5MTA1MC44NDAyOTYzNTM4NzQ3MzMxNjlFLTkwNSA3MzMzMDYzMzA3OC44MjgyMTYwMTg1MzYzMjY3NDMzMjVFKzk3NiAtPiAtMQorZGl2eDMyNDEgZGl2aWRlIDQyMjA3NDM1MDkxMDUwLjg0MDI5NjM1Mzg3NDczMzE2OUUtOTA1IDczMzMwNjMzMDc4LjgyODIxNjAxODUzNjMyNjc0MzMyNUUrOTc2IC0+IDUuNzU1NzcxMjY3NjA2NDIwNjYzNjE3ODI0NzU1NDA1NkUtMTg3OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjQxIGRpdmlkZWludCA0MjIwNzQzNTA5MTA1MC44NDAyOTYzNTM4NzQ3MzMxNjlFLTkwNSA3MzMzMDYzMzA3OC44MjgyMTYwMTg1MzYzMjY3NDMzMjVFKzk3NiAtPiAwCittdWx4MzI0MSBtdWx0aXBseSA0MjIwNzQzNTA5MTA1MC44NDAyOTYzNTM4NzQ3MzMxNjlFLTkwNSA3MzMzMDYzMzA3OC44MjgyMTYwMTg1MzYzMjY3NDMzMjVFKzk3NiAtPiAzLjA5NTA5NzkzNTg2MDMwNzU2NTA1OTI0MzMzOTg5MzlFKzk1IEluZXhhY3QgUm91bmRlZAorcG93eDMyNDEgcG93ZXIgNDIyMDc0MzUwOTEwNTAuODQwMjk2MzUzODc0NzMzMTY5RS05MDUgNyAtPiAyLjM4NjI4NzI5NDA2MTUyODM1OTk1NzMwODI5NjY2NDJFLTYyNDAgSW5leGFjdCBSb3VuZGVkCityZW14MzI0MSByZW1haW5kZXIgNDIyMDc0MzUwOTEwNTAuODQwMjk2MzUzODc0NzMzMTY5RS05MDUgNzMzMzA2MzMwNzguODI4MjE2MDE4NTM2MzI2NzQzMzI1RSs5NzYgLT4gNC4yMjA3NDM1MDkxMDUwODQwMjk2MzUzODc0NzMzMTY5RS04OTIKK3N1YngzMjQxIHN1YnRyYWN0IDQyMjA3NDM1MDkxMDUwLjg0MDI5NjM1Mzg3NDczMzE2OUUtOTA1IDczMzMwNjMzMDc4LjgyODIxNjAxODUzNjMyNjc0MzMyNUUrOTc2IC0+IC03LjMzMzA2MzMwNzg4MjgyMTYwMTg1MzYzMjY3NDMzMjVFKzk4NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjQyIGFkZCAtNzE4MDAuODA2NzAwODY4Nzg0ODQxMDQ1NDA2Njc5NjQxIC0zOTYxNzQ1Njk2NDI1MDY5NzkwMjUxOTE1MDUyNjcwMSAtPiAtMzk2MTc0NTY5NjQyNTA2OTc5MDI1MTkxNTA1OTg1MDIgSW5leGFjdCBSb3VuZGVkCitjb214MzI0MiBjb21wYXJlIC03MTgwMC44MDY3MDA4Njg3ODQ4NDEwNDU0MDY2Nzk2NDEgLTM5NjE3NDU2OTY0MjUwNjk3OTAyNTE5MTUwNTI2NzAxIC0+IDEKK2RpdngzMjQyIGRpdmlkZSAtNzE4MDAuODA2NzAwODY4Nzg0ODQxMDQ1NDA2Njc5NjQxIC0zOTYxNzQ1Njk2NDI1MDY5NzkwMjUxOTE1MDUyNjcwMSAtPiAxLjgxMjM1Mjc0MDUwMTcyMjAxNzg1NzkwNDk5NjQxMjZFLTI3IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNDIgZGl2aWRlaW50IC03MTgwMC44MDY3MDA4Njg3ODQ4NDEwNDU0MDY2Nzk2NDEgLTM5NjE3NDU2OTY0MjUwNjk3OTAyNTE5MTUwNTI2NzAxIC0+IDAKK211bHgzMjQyIG11bHRpcGx5IC03MTgwMC44MDY3MDA4Njg3ODQ4NDEwNDU0MDY2Nzk2NDEgLTM5NjE3NDU2OTY0MjUwNjk3OTAyNTE5MTUwNTI2NzAxIC0+IDIuODQ0NTY1MzY5NDcwMTUyMjE2NDkwMTgyNzUyNDUzOEUrMzYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI0MiBwb3dlciAtNzE4MDAuODA2NzAwODY4Nzg0ODQxMDQ1NDA2Njc5NjQxIC00IC0+IDMuNzYyNTUzNjg1MDg5NTQ4MDg4MjE3ODU5OTQyODc3NEUtMjAgSW5leGFjdCBSb3VuZGVkCityZW14MzI0MiByZW1haW5kZXIgLTcxODAwLjgwNjcwMDg2ODc4NDg0MTA0NTQwNjY3OTY0MSAtMzk2MTc0NTY5NjQyNTA2OTc5MDI1MTkxNTA1MjY3MDEgLT4gLTcxODAwLjgwNjcwMDg2ODc4NDg0MTA0NTQwNjY3OTY0MQorc3VieDMyNDIgc3VidHJhY3QgLTcxODAwLjgwNjcwMDg2ODc4NDg0MTA0NTQwNjY3OTY0MSAtMzk2MTc0NTY5NjQyNTA2OTc5MDI1MTkxNTA1MjY3MDEgLT4gMzk2MTc0NTY5NjQyNTA2OTc5MDI1MTkxNTA0NTQ5MDAgSW5leGFjdCBSb3VuZGVkCithZGR4MzI0MyBhZGQgNTM2Mjc0ODA4MDEuNjMxNTA0ODkyMzEwMDE2MDYyMTYwIDMyODI1OS41Njk0NzY2MTA0OTMxMzMxMTk4MzEwOTUwMyAtPiA1MzYyNzgwOTA2MS4yMDA5ODE1MDI4MDMxNDkxODE5OTEgSW5leGFjdCBSb3VuZGVkCitjb214MzI0MyBjb21wYXJlIDUzNjI3NDgwODAxLjYzMTUwNDg5MjMxMDAxNjA2MjE2MCAzMjgyNTkuNTY5NDc2NjEwNDkzMTMzMTE5ODMxMDk1MDMgLT4gMQorZGl2eDMyNDMgZGl2aWRlIDUzNjI3NDgwODAxLjYzMTUwNDg5MjMxMDAxNjA2MjE2MCAzMjgyNTkuNTY5NDc2NjEwNDkzMTMzMTE5ODMxMDk1MDMgLT4gMTYzMzY5LjEzMTU5MDM5NzE3OTAxNTAwNDY1MTA5ODM5IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNDMgZGl2aWRlaW50IDUzNjI3NDgwODAxLjYzMTUwNDg5MjMxMDAxNjA2MjE2MCAzMjgyNTkuNTY5NDc2NjEwNDkzMTMzMTE5ODMxMDk1MDMgLT4gMTYzMzY5CittdWx4MzI0MyBtdWx0aXBseSA1MzYyNzQ4MDgwMS42MzE1MDQ4OTIzMTAwMTYwNjIxNjAgMzI4MjU5LjU2OTQ3NjYxMDQ5MzEzMzExOTgzMTA5NTAzIC0+IDE3NjAzNzMzNzYwMDU4NzUyLjM2MzEyMzU4NTIyNDM2OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjQzIHBvd2VyIDUzNjI3NDgwODAxLjYzMTUwNDg5MjMxMDAxNjA2MjE2MCAzMjgyNjAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzI0MyByZW1haW5kZXIgNTM2Mjc0ODA4MDEuNjMxNTA0ODkyMzEwMDE2MDYyMTYwIDMyODI1OS41Njk0NzY2MTA0OTMxMzMxMTk4MzEwOTUwMyAtPiA0MzE5NS44MDcxMjUyMzk2NDUzNjIzNzU5OTYwNDM5Mworc3VieDMyNDMgc3VidHJhY3QgNTM2Mjc0ODA4MDEuNjMxNTA0ODkyMzEwMDE2MDYyMTYwIDMyODI1OS41Njk0NzY2MTA0OTMxMzMxMTk4MzEwOTUwMyAtPiA1MzYyNzE1MjU0Mi4wNjIwMjgyODE4MTY4ODI5NDIzMjkgSW5leGFjdCBSb3VuZGVkCithZGR4MzI0NCBhZGQgLTUwNTI2MDE1OTguNTU1OTM3MTMzODQyODM2ODQzODcyOCAtOTc4NTUzNzIuMjI0MzIxNjY0Nzg1MzE0NzgyNTU2MDY0IC0+IC01MTUwNDU2OTcwLjc4MDI1ODc5ODYyODE1MTYyNjQyODkgSW5leGFjdCBSb3VuZGVkCitjb214MzI0NCBjb21wYXJlIC01MDUyNjAxNTk4LjU1NTkzNzEzMzg0MjgzNjg0Mzg3MjggLTk3ODU1MzcyLjIyNDMyMTY2NDc4NTMxNDc4MjU1NjA2NCAtPiAtMQorZGl2eDMyNDQgZGl2aWRlIC01MDUyNjAxNTk4LjU1NTkzNzEzMzg0MjgzNjg0Mzg3MjggLTk3ODU1MzcyLjIyNDMyMTY2NDc4NTMxNDc4MjU1NjA2NCAtPiA1MS42MzMzNTkzNTE3MzI0MzIyODM4NzkyNzQxOTI5NDcgSW5leGFjdCBSb3VuZGVkCitkdml4MzI0NCBkaXZpZGVpbnQgLTUwNTI2MDE1OTguNTU1OTM3MTMzODQyODM2ODQzODcyOCAtOTc4NTUzNzIuMjI0MzIxNjY0Nzg1MzE0NzgyNTU2MDY0IC0+IDUxCittdWx4MzI0NCBtdWx0aXBseSAtNTA1MjYwMTU5OC41NTU5MzcxMzM4NDI4MzY4NDM4NzI4IC05Nzg1NTM3Mi4yMjQzMjE2NjQ3ODUzMTQ3ODI1NTYwNjQgLT4gNDk0NDI0MjEwMTI3ODkzODkzLjEyNTgxNTEyOTU0Nzg3IEluZXhhY3QgUm91bmRlZAorcG93eDMyNDQgcG93ZXIgLTUwNTI2MDE1OTguNTU1OTM3MTMzODQyODM2ODQzODcyOCAtOTc4NTUzNzIgLT4gMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyNDQgcmVtYWluZGVyIC01MDUyNjAxNTk4LjU1NTkzNzEzMzg0MjgzNjg0Mzg3MjggLTk3ODU1MzcyLjIyNDMyMTY2NDc4NTMxNDc4MjU1NjA2NCAtPiAtNjE5Nzc2MTUuMTE1NTMyMjI5NzkxNzgyOTMzNTEzNTM2CitzdWJ4MzI0NCBzdWJ0cmFjdCAtNTA1MjYwMTU5OC41NTU5MzcxMzM4NDI4MzY4NDM4NzI4IC05Nzg1NTM3Mi4yMjQzMjE2NjQ3ODUzMTQ3ODI1NTYwNjQgLT4gLTQ5NTQ3NDYyMjYuMzMxNjE1NDY5MDU3NTIyMDYxMzE2NyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjQ1IGFkZCA0MjA4MTM0MzIwNzMzLjcwNjk3NDI5ODgyMjgwNjgxOTFFKzE0NiA0MjcwODY5LjE3NjAxNDk0Nzc1OTg5MjA5NjA2MjgzOTJFKzQ3MSAtPiA0LjI3MDg2OTE3NjAxNDk0Nzc1OTg5MjA5NjA2MjgzOTJFKzQ3NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjQ1IGNvbXBhcmUgNDIwODEzNDMyMDczMy43MDY5NzQyOTg4MjI4MDY4MTkxRSsxNDYgNDI3MDg2OS4xNzYwMTQ5NDc3NTk4OTIwOTYwNjI4MzkyRSs0NzEgLT4gLTEKK2RpdngzMjQ1IGRpdmlkZSA0MjA4MTM0MzIwNzMzLjcwNjk3NDI5ODgyMjgwNjgxOTFFKzE0NiA0MjcwODY5LjE3NjAxNDk0Nzc1OTg5MjA5NjA2MjgzOTJFKzQ3MSAtPiA5Ljg1MzEwOTg2NDMwMjE5NTEwNDg3NDQwNzgwMjcyODNFLTMyMCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjQ1IGRpdmlkZWludCA0MjA4MTM0MzIwNzMzLjcwNjk3NDI5ODgyMjgwNjgxOTFFKzE0NiA0MjcwODY5LjE3NjAxNDk0Nzc1OTg5MjA5NjA2MjgzOTJFKzQ3MSAtPiAwCittdWx4MzI0NSBtdWx0aXBseSA0MjA4MTM0MzIwNzMzLjcwNjk3NDI5ODgyMjgwNjgxOTFFKzE0NiA0MjcwODY5LjE3NjAxNDk0Nzc1OTg5MjA5NjA2MjgzOTJFKzQ3MSAtPiAxLjc5NzIzOTExNTg5NTIxODkwMDIxNjkwODI3NTMxODNFKzYzNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjQ1IHBvd2VyIDQyMDgxMzQzMjA3MzMuNzA2OTc0Mjk4ODIyODA2ODE5MUUrMTQ2IDQgLT4gMy4xMzU4NzIzNDM5ODMwODcyMTI3MTI5ODIxOTYzODU3RSs2MzQgSW5leGFjdCBSb3VuZGVkCityZW14MzI0NSByZW1haW5kZXIgNDIwODEzNDMyMDczMy43MDY5NzQyOTg4MjI4MDY4MTkxRSsxNDYgNDI3MDg2OS4xNzYwMTQ5NDc3NTk4OTIwOTYwNjI4MzkyRSs0NzEgLT4gNC4yMDgxMzQzMjA3MzM3MDY5NzQyOTg4MjI4MDY4MTkxRSsxNTgKK3N1YngzMjQ1IHN1YnRyYWN0IDQyMDgxMzQzMjA3MzMuNzA2OTc0Mjk4ODIyODA2ODE5MUUrMTQ2IDQyNzA4NjkuMTc2MDE0OTQ3NzU5ODkyMDk2MDYyODM5MkUrNDcxIC0+IC00LjI3MDg2OTE3NjAxNDk0Nzc1OTg5MjA5NjA2MjgzOTJFKzQ3NyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjQ2IGFkZCAtOC41MDc3MDA5NjU3OTQyNTgxNTE1NTkwNDcxMTg5MDg0RSszMDggOTY1MjE0NTE1NS4zNzQyMTcwNDc4NDIxMTQwNDIzNzZFLTI1MCAtPiAtOC41MDc3MDA5NjU3OTQyNTgxNTE1NTkwNDcxMTg5MDg0RSszMDggSW5leGFjdCBSb3VuZGVkCitjb214MzI0NiBjb21wYXJlIC04LjUwNzcwMDk2NTc5NDI1ODE1MTU1OTA0NzExODkwODRFKzMwOCA5NjUyMTQ1MTU1LjM3NDIxNzA0Nzg0MjExNDA0MjM3NkUtMjUwIC0+IC0xCitkaXZ4MzI0NiBkaXZpZGUgLTguNTA3NzAwOTY1Nzk0MjU4MTUxNTU5MDQ3MTE4OTA4NEUrMzA4IDk2NTIxNDUxNTUuMzc0MjE3MDQ3ODQyMTE0MDQyMzc2RS0yNTAgLT4gLTguODE0MzExMDQ1NzIzNjA4OTk3ODA3MDQxOTA0Nzk3MEUrNTQ4IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNDYgZGl2aWRlaW50IC04LjUwNzcwMDk2NTc5NDI1ODE1MTU1OTA0NzExODkwODRFKzMwOCA5NjUyMTQ1MTU1LjM3NDIxNzA0Nzg0MjExNDA0MjM3NkUtMjUwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzI0NiBtdWx0aXBseSAtOC41MDc3MDA5NjU3OTQyNTgxNTE1NTkwNDcxMTg5MDg0RSszMDggOTY1MjE0NTE1NS4zNzQyMTcwNDc4NDIxMTQwNDIzNzZFLTI1MCAtPiAtOC4yMTE3NTY0NjYwMzYzNTk2MjgzNzMyOTQyMDkxODUyRSs2OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjQ2IHBvd2VyIC04LjUwNzcwMDk2NTc5NDI1ODE1MTU1OTA0NzExODkwODRFKzMwOCAxMCAtPiAxLjk4NjY1MzY4MTI1NzMyMDc4NjgzNTA2NDA3NjA2NzhFKzMwODkgSW5leGFjdCBSb3VuZGVkCityZW14MzI0NiByZW1haW5kZXIgLTguNTA3NzAwOTY1Nzk0MjU4MTUxNTU5MDQ3MTE4OTA4NEUrMzA4IDk2NTIxNDUxNTUuMzc0MjE3MDQ3ODQyMTE0MDQyMzc2RS0yNTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjQ2IHN1YnRyYWN0IC04LjUwNzcwMDk2NTc5NDI1ODE1MTU1OTA0NzExODkwODRFKzMwOCA5NjUyMTQ1MTU1LjM3NDIxNzA0Nzg0MjExNDA0MjM3NkUtMjUwIC0+IC04LjUwNzcwMDk2NTc5NDI1ODE1MTU1OTA0NzExODkwODRFKzMwOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjQ3IGFkZCAtOTUwNC45NzAzMDMyMjg2OTYwNzkwOTA0MTgxMDc4MDYzRSs2MTkgLTg2LjI0NTk1Njk0OTA0OTE4NjUzMzQ2OTIwNjQ4NTAwMyAtPiAtOS41MDQ5NzAzMDMyMjg2OTYwNzkwOTA0MTgxMDc4MDYzRSs2MjIgSW5leGFjdCBSb3VuZGVkCitjb214MzI0NyBjb21wYXJlIC05NTA0Ljk3MDMwMzIyODY5NjA3OTA5MDQxODEwNzgwNjNFKzYxOSAtODYuMjQ1OTU2OTQ5MDQ5MTg2NTMzNDY5MjA2NDg1MDAzIC0+IC0xCitkaXZ4MzI0NyBkaXZpZGUgLTk1MDQuOTcwMzAzMjI4Njk2MDc5MDkwNDE4MTA3ODA2M0UrNjE5IC04Ni4yNDU5NTY5NDkwNDkxODY1MzM0NjkyMDY0ODUwMDMgLT4gMS4xMDIwNzcyMDMzMjI1NzA3MTI1MzkxMjEyNTE5NDIxRSs2MjEgSW5leGFjdCBSb3VuZGVkCitkdml4MzI0NyBkaXZpZGVpbnQgLTk1MDQuOTcwMzAzMjI4Njk2MDc5MDkwNDE4MTA3ODA2M0UrNjE5IC04Ni4yNDU5NTY5NDkwNDkxODY1MzM0NjkyMDY0ODUwMDMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjQ3IG11bHRpcGx5IC05NTA0Ljk3MDMwMzIyODY5NjA3OTA5MDQxODEwNzgwNjNFKzYxOSAtODYuMjQ1OTU2OTQ5MDQ5MTg2NTMzNDY5MjA2NDg1MDAzIC0+IDguMTk3NjUyNTk1NzQyNTMxMTQyNzg1ODA4NzExNzY1NUUrNjI0IEluZXhhY3QgUm91bmRlZAorcG93eDMyNDcgcG93ZXIgLTk1MDQuOTcwMzAzMjI4Njk2MDc5MDkwNDE4MTA3ODA2M0UrNjE5IC04NiAtPiAwRS0xMDAzMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzI0NyByZW1haW5kZXIgLTk1MDQuOTcwMzAzMjI4Njk2MDc5MDkwNDE4MTA3ODA2M0UrNjE5IC04Ni4yNDU5NTY5NDkwNDkxODY1MzM0NjkyMDY0ODUwMDMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjQ3IHN1YnRyYWN0IC05NTA0Ljk3MDMwMzIyODY5NjA3OTA5MDQxODEwNzgwNjNFKzYxOSAtODYuMjQ1OTU2OTQ5MDQ5MTg2NTMzNDY5MjA2NDg1MDAzIC0+IC05LjUwNDk3MDMwMzIyODY5NjA3OTA5MDQxODEwNzgwNjNFKzYyMiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjQ4IGFkZCAtNDQwMjIwOTE2LjY2NzE2NzQzMDI2ODk2OTMxMTk0NzQ5IC0xMDI3MjUuMDE1OTQzNzc4NzE1NjA1NjQ4MjQzNTg3NzUgLT4gLTQ0MDMyMzY0MS42ODMxMTEyMDg5ODQ1NzQ5NjAxOTEwOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjQ4IGNvbXBhcmUgLTQ0MDIyMDkxNi42NjcxNjc0MzAyNjg5NjkzMTE5NDc0OSAtMTAyNzI1LjAxNTk0Mzc3ODcxNTYwNTY0ODI0MzU4Nzc1IC0+IC0xCitkaXZ4MzI0OCBkaXZpZGUgLTQ0MDIyMDkxNi42NjcxNjc0MzAyNjg5NjkzMTE5NDc0OSAtMTAyNzI1LjAxNTk0Mzc3ODcxNTYwNTY0ODI0MzU4Nzc1IC0+IDQyODUuNDMwNTAyMjI2NDQ3MzI2OTc3MDI0NjEyNjIzNCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjQ4IGRpdmlkZWludCAtNDQwMjIwOTE2LjY2NzE2NzQzMDI2ODk2OTMxMTk0NzQ5IC0xMDI3MjUuMDE1OTQzNzc4NzE1NjA1NjQ4MjQzNTg3NzUgLT4gNDI4NQorbXVseDMyNDggbXVsdGlwbHkgLTQ0MDIyMDkxNi42NjcxNjc0MzAyNjg5NjkzMTE5NDc0OSAtMTAyNzI1LjAxNTk0Mzc3ODcxNTYwNTY0ODI0MzU4Nzc1IC0+IDQ1MjIxNzAwNjgzNDE5LjY1NTU5Njc3MTcxMTYwMzUwNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjQ4IHBvd2VyIC00NDAyMjA5MTYuNjY3MTY3NDMwMjY4OTY5MzExOTQ3NDkgLTEwMjcyNSAtPiAtMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyNDggcmVtYWluZGVyIC00NDAyMjA5MTYuNjY3MTY3NDMwMjY4OTY5MzExOTQ3NDkgLTEwMjcyNS4wMTU5NDM3Nzg3MTU2MDU2NDgyNDM1ODc3NSAtPiAtNDQyMjMuMzQ4MDc1NjMzODk4NzY2NTg4MTczOTgxMjUKK3N1YngzMjQ4IHN1YnRyYWN0IC00NDAyMjA5MTYuNjY3MTY3NDMwMjY4OTY5MzExOTQ3NDkgLTEwMjcyNS4wMTU5NDM3Nzg3MTU2MDU2NDgyNDM1ODc3NSAtPiAtNDQwMTE4MTkxLjY1MTIyMzY1MTU1MzM2MzY2MzcwMzkwIEluZXhhY3QgUm91bmRlZAorYWRkeDMyNDkgYWRkIC00Ni4yNTA3MzUwODYwMDYzNTA1MTc5NDM0NjQ3NTgwMTkgMTQ2NTYzNTc1NTUxNzQuMjYzMjk1MjY2MDc0OTA4MDI0IC0+IDE0NjU2MzU3NTU1MTI4LjAxMjU2MDE4MDA2ODU1NzUwNiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjQ5IGNvbXBhcmUgLTQ2LjI1MDczNTA4NjAwNjM1MDUxNzk0MzQ2NDc1ODAxOSAxNDY1NjM1NzU1NTE3NC4yNjMyOTUyNjYwNzQ5MDgwMjQgLT4gLTEKK2RpdngzMjQ5IGRpdmlkZSAtNDYuMjUwNzM1MDg2MDA2MzUwNTE3OTQzNDY0NzU4MDE5IDE0NjU2MzU3NTU1MTc0LjI2MzI5NTI2NjA3NDkwODAyNCAtPiAtMy4xNTU2NzczMTY5NTIzMzEzOTMyMjA3NzI1NTIyODY2RS0xMiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjQ5IGRpdmlkZWludCAtNDYuMjUwNzM1MDg2MDA2MzUwNTE3OTQzNDY0NzU4MDE5IDE0NjU2MzU3NTU1MTc0LjI2MzI5NTI2NjA3NDkwODAyNCAtPiAtMAorbXVseDMyNDkgbXVsdGlwbHkgLTQ2LjI1MDczNTA4NjAwNjM1MDUxNzk0MzQ2NDc1ODAxOSAxNDY1NjM1NzU1NTE3NC4yNjMyOTUyNjYwNzQ5MDgwMjQgLT4gLTY3Nzg2NzMxMDYxMDE1Mi41NTU2OTYyMDQ1OTc4ODUzMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjQ5IHBvd2VyIC00Ni4yNTA3MzUwODYwMDYzNTA1MTc5NDM0NjQ3NTgwMTkgMSAtPiAtNDYuMjUwNzM1MDg2MDA2MzUwNTE3OTQzNDY0NzU4MDE5CityZW14MzI0OSByZW1haW5kZXIgLTQ2LjI1MDczNTA4NjAwNjM1MDUxNzk0MzQ2NDc1ODAxOSAxNDY1NjM1NzU1NTE3NC4yNjMyOTUyNjYwNzQ5MDgwMjQgLT4gLTQ2LjI1MDczNTA4NjAwNjM1MDUxNzk0MzQ2NDc1ODAxOQorc3VieDMyNDkgc3VidHJhY3QgLTQ2LjI1MDczNTA4NjAwNjM1MDUxNzk0MzQ2NDc1ODAxOSAxNDY1NjM1NzU1NTE3NC4yNjMyOTUyNjYwNzQ5MDgwMjQgLT4gLTE0NjU2MzU3NTU1MjIwLjUxNDAzMDM1MjA4MTI1ODU0MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjUwIGFkZCAtNjE2NDExMjEyOTkzOTEuMzE2NDIwNjQ3MTAyNjk5NjI3RSs3NjMgLTkxODk2NDY5ODYzLjQ2MTAwNjkwMzU5MDAwNDE4ODE4N0UrNDc0IC0+IC02LjE2NDExMjEyOTkzOTEzMTY0MjA2NDcxMDI2OTk2MjdFKzc3NiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjUwIGNvbXBhcmUgLTYxNjQxMTIxMjk5MzkxLjMxNjQyMDY0NzEwMjY5OTYyN0UrNzYzIC05MTg5NjQ2OTg2My40NjEwMDY5MDM1OTAwMDQxODgxODdFKzQ3NCAtPiAtMQorZGl2eDMyNTAgZGl2aWRlIC02MTY0MTEyMTI5OTM5MS4zMTY0MjA2NDcxMDI2OTk2MjdFKzc2MyAtOTE4OTY0Njk4NjMuNDYxMDA2OTAzNTkwMDA0MTg4MTg3RSs0NzQgLT4gNi43MDc2NzAyMDY1ODk3ODE5NjA0NzE2OTQ2ODUyNTgxRSsyOTEgSW5leGFjdCBSb3VuZGVkCitkdml4MzI1MCBkaXZpZGVpbnQgLTYxNjQxMTIxMjk5MzkxLjMxNjQyMDY0NzEwMjY5OTYyN0UrNzYzIC05MTg5NjQ2OTg2My40NjEwMDY5MDM1OTAwMDQxODgxODdFKzQ3NCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyNTAgbXVsdGlwbHkgLTYxNjQxMTIxMjk5MzkxLjMxNjQyMDY0NzEwMjY5OTYyN0UrNzYzIC05MTg5NjQ2OTg2My40NjEwMDY5MDM1OTAwMDQxODgxODdFKzQ3NCAtPiA1LjY2NDYwMTQ0NTgzOTQ1ODQ5MjE1Nzk0MTc1MDQ5MzlFKzEyNjEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI1MCBwb3dlciAtNjE2NDExMjEyOTkzOTEuMzE2NDIwNjQ3MTAyNjk5NjI3RSs3NjMgLTkgLT4gLTcuNzgzMzI2MTE3OTk3NTUzMjUwODc0ODE1MDcwODYwNUUtNjk5MiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjUwIHJlbWFpbmRlciAtNjE2NDExMjEyOTkzOTEuMzE2NDIwNjQ3MTAyNjk5NjI3RSs3NjMgLTkxODk2NDY5ODYzLjQ2MTAwNjkwMzU5MDAwNDE4ODE4N0UrNDc0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI1MCBzdWJ0cmFjdCAtNjE2NDExMjEyOTkzOTEuMzE2NDIwNjQ3MTAyNjk5NjI3RSs3NjMgLTkxODk2NDY5ODYzLjQ2MTAwNjkwMzU5MDAwNDE4ODE4N0UrNDc0IC0+IC02LjE2NDExMjEyOTkzOTEzMTY0MjA2NDcxMDI2OTk2MjdFKzc3NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjUxIGFkZCA5NjY2ODQxOTgwMjc0OS41NTU3MzgwMTAyMzkwODc0NDlFLTgzOCAtMTk0OTg3MzIxMzEzNjU4MjQ5MjE2Mzk0NjcwNDQ5MjdFLTU0MiAtPiAtMS45NDk4NzMyMTMxMzY1ODI0OTIxNjM5NDY3MDQ0OTI3RS01MTEgSW5leGFjdCBSb3VuZGVkCitjb214MzI1MSBjb21wYXJlIDk2NjY4NDE5ODAyNzQ5LjU1NTczODAxMDIzOTA4NzQ0OUUtODM4IC0xOTQ5ODczMjEzMTM2NTgyNDkyMTYzOTQ2NzA0NDkyN0UtNTQyIC0+IDEKK2RpdngzMjUxIGRpdmlkZSA5NjY2ODQxOTgwMjc0OS41NTU3MzgwMTAyMzkwODc0NDlFLTgzOCAtMTk0OTg3MzIxMzEzNjU4MjQ5MjE2Mzk0NjcwNDQ5MjdFLTU0MiAtPiAtNC45NTc2NzcyMDQ0MTkyNTE0NzE1NDUzMjE1OTMzNzA0RS0zMTQgSW5leGFjdCBSb3VuZGVkCitkdml4MzI1MSBkaXZpZGVpbnQgOTY2Njg0MTk4MDI3NDkuNTU1NzM4MDEwMjM5MDg3NDQ5RS04MzggLTE5NDk4NzMyMTMxMzY1ODI0OTIxNjM5NDY3MDQ0OTI3RS01NDIgLT4gLTAKK211bHgzMjUxIG11bHRpcGx5IDk2NjY4NDE5ODAyNzQ5LjU1NTczODAxMDIzOTA4NzQ0OUUtODM4IC0xOTQ5ODczMjEzMTM2NTgyNDkyMTYzOTQ2NzA0NDkyN0UtNTQyIC0+IC0xLjg4NDkxMTYyMzI5NjIzMzE2MTcxNDA2NzYyNzQ2MTFFLTEzMzUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI1MSBwb3dlciA5NjY2ODQxOTgwMjc0OS41NTU3MzgwMTAyMzkwODc0NDlFLTgzOCAtMiAtPiAxLjA3MDExNTc2MjUyNjg4OTYzMjM2MTE2MzMzNTAwMDNFKzE2NDggSW5leGFjdCBSb3VuZGVkCityZW14MzI1MSByZW1haW5kZXIgOTY2Njg0MTk4MDI3NDkuNTU1NzM4MDEwMjM5MDg3NDQ5RS04MzggLTE5NDk4NzMyMTMxMzY1ODI0OTIxNjM5NDY3MDQ0OTI3RS01NDIgLT4gOS42NjY4NDE5ODAyNzQ5NTU1NzM4MDEwMjM5MDg3NDQ5RS04MjUKK3N1YngzMjUxIHN1YnRyYWN0IDk2NjY4NDE5ODAyNzQ5LjU1NTczODAxMDIzOTA4NzQ0OUUtODM4IC0xOTQ5ODczMjEzMTM2NTgyNDkyMTYzOTQ2NzA0NDkyN0UtNTQyIC0+IDEuOTQ5ODczMjEzMTM2NTgyNDkyMTYzOTQ2NzA0NDkyN0UtNTExIEluZXhhY3QgUm91bmRlZAorYWRkeDMyNTIgYWRkIC04NTM0NTQzOTExMTk3OTk1OTA2MDMxMjQ1NzE5NTE5RSsxMjQgMTY0ODcxMTcwNTAwMzEuNTk0ODg2NTQxNjUwODk3OTc0IC0+IC04LjUzNDU0MzkxMTE5Nzk5NTkwNjAzMTI0NTcxOTUxOTBFKzE1NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjUyIGNvbXBhcmUgLTg1MzQ1NDM5MTExOTc5OTU5MDYwMzEyNDU3MTk1MTlFKzEyNCAxNjQ4NzExNzA1MDAzMS41OTQ4ODY1NDE2NTA4OTc5NzQgLT4gLTEKK2RpdngzMjUyIGRpdmlkZSAtODUzNDU0MzkxMTE5Nzk5NTkwNjAzMTI0NTcxOTUxOUUrMTI0IDE2NDg3MTE3MDUwMDMxLjU5NDg4NjU0MTY1MDg5Nzk3NCAtPiAtNS4xNzY0OTI1ODIyMzgxMDYyMjg3OTU5NTIzMzcxMzE2RSsxNDEgSW5leGFjdCBSb3VuZGVkCitkdml4MzI1MiBkaXZpZGVpbnQgLTg1MzQ1NDM5MTExOTc5OTU5MDYwMzEyNDU3MTk1MTlFKzEyNCAxNjQ4NzExNzA1MDAzMS41OTQ4ODY1NDE2NTA4OTc5NzQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjUyIG11bHRpcGx5IC04NTM0NTQzOTExMTk3OTk1OTA2MDMxMjQ1NzE5NTE5RSsxMjQgMTY0ODcxMTcwNTAwMzEuNTk0ODg2NTQxNjUwODk3OTc0IC0+IC0xLjQwNzEwMDI0NDMyNTU1ODEyMTc0NzE2OTg3MzEyNDBFKzE2OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjUyIHBvd2VyIC04NTM0NTQzOTExMTk3OTk1OTA2MDMxMjQ1NzE5NTE5RSsxMjQgMiAtPiA3LjI4Mzg0Mzk3NzIxNjY3ODU0Mjk0ODI5OTUwNDEzMzdFKzMwOSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjUyIHJlbWFpbmRlciAtODUzNDU0MzkxMTE5Nzk5NTkwNjAzMTI0NTcxOTUxOUUrMTI0IDE2NDg3MTE3MDUwMDMxLjU5NDg4NjU0MTY1MDg5Nzk3NCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMyNTIgc3VidHJhY3QgLTg1MzQ1NDM5MTExOTc5OTU5MDYwMzEyNDU3MTk1MTlFKzEyNCAxNjQ4NzExNzA1MDAzMS41OTQ4ODY1NDE2NTA4OTc5NzQgLT4gLTguNTM0NTQzOTExMTk3OTk1OTA2MDMxMjQ1NzE5NTE5MEUrMTU0IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNTMgYWRkIC02MjY2MzQwNDc3Ny4zNTI1MDg5Nzk1ODI4NDY5MzEwNTAgOS4yNTcwOTM4ODM3MjM5MTM0MDUyNTg5MTg0OTE3MTg2RSs5MTYgLT4gOS4yNTcwOTM4ODM3MjM5MTM0MDUyNTg5MTg0OTE3MTg2RSs5MTYgSW5leGFjdCBSb3VuZGVkCitjb214MzI1MyBjb21wYXJlIC02MjY2MzQwNDc3Ny4zNTI1MDg5Nzk1ODI4NDY5MzEwNTAgOS4yNTcwOTM4ODM3MjM5MTM0MDUyNTg5MTg0OTE3MTg2RSs5MTYgLT4gLTEKK2RpdngzMjUzIGRpdmlkZSAtNjI2NjM0MDQ3NzcuMzUyNTA4OTc5NTgyODQ2OTMxMDUwIDkuMjU3MDkzODgzNzIzOTEzNDA1MjU4OTE4NDkxNzE4NkUrOTE2IC0+IC02Ljc2OTIzMDc3MjAzODQxNDI1OTI1OTcxMjQ5NTY5NTFFLTkwNyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjUzIGRpdmlkZWludCAtNjI2NjM0MDQ3NzcuMzUyNTA4OTc5NTgyODQ2OTMxMDUwIDkuMjU3MDkzODgzNzIzOTEzNDA1MjU4OTE4NDkxNzE4NkUrOTE2IC0+IC0wCittdWx4MzI1MyBtdWx0aXBseSAtNjI2NjM0MDQ3NzcuMzUyNTA4OTc5NTgyODQ2OTMxMDUwIDkuMjU3MDkzODgzNzIzOTEzNDA1MjU4OTE4NDkxNzE4NkUrOTE2IC0+IC01LjgwMDgxMDIxMDk3NzQ1NzY2NTQ3MDkwMTgwMTI4NzZFKzkyNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjUzIHBvd2VyIC02MjY2MzQwNDc3Ny4zNTI1MDg5Nzk1ODI4NDY5MzEwNTAgOSAtPiAtMS40ODk3OTI4ODE0MTMzMDU5NjE1NjcwNDYyNzUzODI1RSs5NyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjUzIHJlbWFpbmRlciAtNjI2NjM0MDQ3NzcuMzUyNTA4OTc5NTgyODQ2OTMxMDUwIDkuMjU3MDkzODgzNzIzOTEzNDA1MjU4OTE4NDkxNzE4NkUrOTE2IC0+IC02MjY2MzQwNDc3Ny4zNTI1MDg5Nzk1ODI4NDY5MzEwNTAKK3N1YngzMjUzIHN1YnRyYWN0IC02MjY2MzQwNDc3Ny4zNTI1MDg5Nzk1ODI4NDY5MzEwNTAgOS4yNTcwOTM4ODM3MjM5MTM0MDUyNTg5MTg0OTE3MTg2RSs5MTYgLT4gLTkuMjU3MDkzODgzNzIzOTEzNDA1MjU4OTE4NDkxNzE4NkUrOTE2IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNTQgYWRkIDEuNzQ0NjAxMjE0NDc0NTYwOTkyNzU0NTI5MzIwMTcyRS04MjcgLTE3LjM1MzY2OTUwNDI1MzQxOTQ4OTQ5NDAzMDY1MTUwN0UtNjMxIC0+IC0xLjczNTM2Njk1MDQyNTM0MTk0ODk0OTQwMzA2NTE1MDdFLTYzMCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjU0IGNvbXBhcmUgMS43NDQ2MDEyMTQ0NzQ1NjA5OTI3NTQ1MjkzMjAxNzJFLTgyNyAtMTcuMzUzNjY5NTA0MjUzNDE5NDg5NDk0MDMwNjUxNTA3RS02MzEgLT4gMQorZGl2eDMyNTQgZGl2aWRlIDEuNzQ0NjAxMjE0NDc0NTYwOTkyNzU0NTI5MzIwMTcyRS04MjcgLTE3LjM1MzY2OTUwNDI1MzQxOTQ4OTQ5NDAzMDY1MTUwN0UtNjMxIC0+IC0xLjAwNTMyMTIxNjk2MDQ1NjUyMzA0OTcxMTc5NjYwMDRFLTE5NyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjU0IGRpdmlkZWludCAxLjc0NDYwMTIxNDQ3NDU2MDk5Mjc1NDUyOTMyMDE3MkUtODI3IC0xNy4zNTM2Njk1MDQyNTM0MTk0ODk0OTQwMzA2NTE1MDdFLTYzMSAtPiAtMAorbXVseDMyNTQgbXVsdGlwbHkgMS43NDQ2MDEyMTQ0NzQ1NjA5OTI3NTQ1MjkzMjAxNzJFLTgyNyAtMTcuMzUzNjY5NTA0MjUzNDE5NDg5NDk0MDMwNjUxNTA3RS02MzEgLT4gLTMuMDI3NTIzMjg5MjcxMDY2ODQzMjg5NTA0OTU0NjIzM0UtMTQ1NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjU0IHBvd2VyIDEuNzQ0NjAxMjE0NDc0NTYwOTkyNzU0NTI5MzIwMTcyRS04MjcgLTIgLT4gMy4yODU1NDY4MDk5NjE1MjgyMzk0OTkyNTQyNTE1OTgwRSsxNjUzIEluZXhhY3QgUm91bmRlZAorcmVteDMyNTQgcmVtYWluZGVyIDEuNzQ0NjAxMjE0NDc0NTYwOTkyNzU0NTI5MzIwMTcyRS04MjcgLTE3LjM1MzY2OTUwNDI1MzQxOTQ4OTQ5NDAzMDY1MTUwN0UtNjMxIC0+IDEuNzQ0NjAxMjE0NDc0NTYwOTkyNzU0NTI5MzIwMTcyRS04MjcKK3N1YngzMjU0IHN1YnRyYWN0IDEuNzQ0NjAxMjE0NDc0NTYwOTkyNzU0NTI5MzIwMTcyRS04MjcgLTE3LjM1MzY2OTUwNDI1MzQxOTQ4OTQ5NDAzMDY1MTUwN0UtNjMxIC0+IDEuNzM1MzY2OTUwNDI1MzQxOTQ4OTQ5NDAzMDY1MTUwN0UtNjMwIEluZXhhY3QgUm91bmRlZAorYWRkeDMyNTUgYWRkIDAzNjcxOTE1NDkwMzY3MDIyMjQ4Mjc3MzQ4NTM0NzEgNDQxMDMyMDY2MjQxNTI2NjUzMzc2MzE0MzgzNzc0MkUrNzIxIC0+IDQuNDEwMzIwNjYyNDE1MjY2NTMzNzYzMTQzODM3NzQyMEUrNzUxIEluZXhhY3QgUm91bmRlZAorY29teDMyNTUgY29tcGFyZSAwMzY3MTkxNTQ5MDM2NzAyMjI0ODI3NzM0ODUzNDcxIDQ0MTAzMjA2NjI0MTUyNjY1MzM3NjMxNDM4Mzc3NDJFKzcyMSAtPiAtMQorZGl2eDMyNTUgZGl2aWRlIDAzNjcxOTE1NDkwMzY3MDIyMjQ4Mjc3MzQ4NTM0NzEgNDQxMDMyMDY2MjQxNTI2NjUzMzc2MzE0MzgzNzc0MkUrNzIxIC0+IDguMzI1NzMzNTk0OTcyMDYxOTA5Mzk2MzkxNzk0MjUyNUUtNzIzIEluZXhhY3QgUm91bmRlZAorZHZpeDMyNTUgZGl2aWRlaW50IDAzNjcxOTE1NDkwMzY3MDIyMjQ4Mjc3MzQ4NTM0NzEgNDQxMDMyMDY2MjQxNTI2NjUzMzc2MzE0MzgzNzc0MkUrNzIxIC0+IDAKK211bHgzMjU1IG11bHRpcGx5IDAzNjcxOTE1NDkwMzY3MDIyMjQ4Mjc3MzQ4NTM0NzEgNDQxMDMyMDY2MjQxNTI2NjUzMzc2MzE0MzgzNzc0MkUrNzIxIC0+IDEuNjE5NDMyNDc1NzgwODM2MzgwMjk0NzE5MjA1NDk2NkUrNzgxIEluZXhhY3QgUm91bmRlZAorcG93eDMyNTUgcG93ZXIgMDM2NzE5MTU0OTAzNjcwMjIyNDgyNzczNDg1MzQ3MSA0IC0+IDEuODE3OTAzMDExOTM1NDMxODE4MjQ5MzcwMzI2OTI1OEUrMTE4IEluZXhhY3QgUm91bmRlZAorcmVteDMyNTUgcmVtYWluZGVyIDAzNjcxOTE1NDkwMzY3MDIyMjQ4Mjc3MzQ4NTM0NzEgNDQxMDMyMDY2MjQxNTI2NjUzMzc2MzE0MzgzNzc0MkUrNzIxIC0+IDM2NzE5MTU0OTAzNjcwMjIyNDgyNzczNDg1MzQ3MQorc3VieDMyNTUgc3VidHJhY3QgMDM2NzE5MTU0OTAzNjcwMjIyNDgyNzczNDg1MzQ3MSA0NDEwMzIwNjYyNDE1MjY2NTMzNzYzMTQzODM3NzQyRSs3MjEgLT4gLTQuNDEwMzIwNjYyNDE1MjY2NTMzNzYzMTQzODM3NzQyMEUrNzUxIEluZXhhY3QgUm91bmRlZAorYWRkeDMyNTYgYWRkIDA5NzcwNDExNi40NDkyNTY2NzIxOTY1NzEwMzY1MDczIC05NjczNi40MDA5Mzk4MDk0MzM1NTYwNjc1MDQyODkxNDUgLT4gOTc2MDczODAuMDQ4MzE2ODYyNzYzMDE0OTY5MDAzMDExIEluZXhhY3QgUm91bmRlZAorY29teDMyNTYgY29tcGFyZSAwOTc3MDQxMTYuNDQ5MjU2NjcyMTk2NTcxMDM2NTA3MyAtOTY3MzYuNDAwOTM5ODA5NDMzNTU2MDY3NTA0Mjg5MTQ1IC0+IDEKK2RpdngzMjU2IGRpdmlkZSAwOTc3MDQxMTYuNDQ5MjU2NjcyMTk2NTcxMDM2NTA3MyAtOTY3MzYuNDAwOTM5ODA5NDMzNTU2MDY3NTA0Mjg5MTQ1IC0+IC0xMDEwLjAwMzYzMzU4NjE3NTcyNTIzMjQ1OTI1NzE4NzQgSW5leGFjdCBSb3VuZGVkCitkdml4MzI1NiBkaXZpZGVpbnQgMDk3NzA0MTE2LjQ0OTI1NjY3MjE5NjU3MTAzNjUwNzMgLTk2NzM2LjQwMDkzOTgwOTQzMzU1NjA2NzUwNDI4OTE0NSAtPiAtMTAxMAorbXVseDMyNTYgbXVsdGlwbHkgMDk3NzA0MTE2LjQ0OTI1NjY3MjE5NjU3MTAzNjUwNzMgLTk2NzM2LjQwMDkzOTgwOTQzMzU1NjA2NzUwNDI4OTE0NSAtPiAtOTQ1MTU0NDU4MjMwNS4xMjM0ODA1NDgzNDQ5NzcyMjUyIEluZXhhY3QgUm91bmRlZAorcG93eDMyNTYgcG93ZXIgMDk3NzA0MTE2LjQ0OTI1NjY3MjE5NjU3MTAzNjUwNzMgLTk2NzM2IC0+IDBFLTEwMDMwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMjU2IHJlbWFpbmRlciAwOTc3MDQxMTYuNDQ5MjU2NjcyMTk2NTcxMDM2NTA3MyAtOTY3MzYuNDAwOTM5ODA5NDMzNTU2MDY3NTA0Mjg5MTQ1IC0+IDM1MS41MDAwNDkxNDQzMDQ5NDI4NTcxNzUyNjM1NTAKK3N1YngzMjU2IHN1YnRyYWN0IDA5NzcwNDExNi40NDkyNTY2NzIxOTY1NzEwMzY1MDczIC05NjczNi40MDA5Mzk4MDk0MzM1NTYwNjc1MDQyODkxNDUgLT4gOTc4MDA4NTIuODUwMTk2NDgxNjMwMTI3MTA0MDExNTg5IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNTcgYWRkIDE5NTMzMjk4LjE0NzE1MDE1ODkzMTk1ODczMzgwNzg3OCA4MC4xNDE2NjgzMzgzNTA3MDg0NzY2MzczNzc2NDcwMjVFLTY0MSAtPiAxOTUzMzI5OC4xNDcxNTAxNTg5MzE5NTg3MzM4MDc4NzggSW5leGFjdCBSb3VuZGVkCitjb214MzI1NyBjb21wYXJlIDE5NTMzMjk4LjE0NzE1MDE1ODkzMTk1ODczMzgwNzg3OCA4MC4xNDE2NjgzMzgzNTA3MDg0NzY2MzczNzc2NDcwMjVFLTY0MSAtPiAxCitkaXZ4MzI1NyBkaXZpZGUgMTk1MzMyOTguMTQ3MTUwMTU4OTMxOTU4NzMzODA3ODc4IDgwLjE0MTY2ODMzODM1MDcwODQ3NjYzNzM3NzY0NzAyNUUtNjQxIC0+IDIuNDM3MzQ2MDgzNzcyODQ4NTM5NTY3Mjg4MjM5NTE3MUUrNjQ2IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNTcgZGl2aWRlaW50IDE5NTMzMjk4LjE0NzE1MDE1ODkzMTk1ODczMzgwNzg3OCA4MC4xNDE2NjgzMzgzNTA3MDg0NzY2MzczNzc2NDcwMjVFLTY0MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyNTcgbXVsdGlwbHkgMTk1MzMyOTguMTQ3MTUwMTU4OTMxOTU4NzMzODA3ODc4IDgwLjE0MTY2ODMzODM1MDcwODQ3NjYzNzM3NzY0NzAyNUUtNjQxIC0+IDEuNTY1NDMxMTAxNjYzMDI4NDUwMjQ1OTE1ODk3MTI3MkUtNjMyIEluZXhhY3QgUm91bmRlZAorcG93eDMyNTcgcG93ZXIgMTk1MzMyOTguMTQ3MTUwMTU4OTMxOTU4NzMzODA3ODc4IDggLT4gMi4xMTkzNTk1MDQ3NjM4MjMwNDI3NTMwMDYzNjU0NjEzRSs1OCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjU3IHJlbWFpbmRlciAxOTUzMzI5OC4xNDcxNTAxNTg5MzE5NTg3MzM4MDc4NzggODAuMTQxNjY4MzM4MzUwNzA4NDc2NjM3Mzc3NjQ3MDI1RS02NDEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjU3IHN1YnRyYWN0IDE5NTMzMjk4LjE0NzE1MDE1ODkzMTk1ODczMzgwNzg3OCA4MC4xNDE2NjgzMzgzNTA3MDg0NzY2MzczNzc2NDcwMjVFLTY0MSAtPiAxOTUzMzI5OC4xNDcxNTAxNTg5MzE5NTg3MzM4MDc4NzggSW5leGFjdCBSb3VuZGVkCithZGR4MzI1OCBhZGQgLTIzNzY1MDAzMjIxMjIwMTc3NDMwNzk3MDI4OTk3Mzc4IC0xNTIwMzM2OTU2OS4zNzM0MTE1MDYzNzkwOTY4NzEyMjRFLTk0NSAtPiAtMjM3NjUwMDMyMjEyMjAxNzc0MzA3OTcwMjg5OTczNzggSW5leGFjdCBSb3VuZGVkCitjb214MzI1OCBjb21wYXJlIC0yMzc2NTAwMzIyMTIyMDE3NzQzMDc5NzAyODk5NzM3OCAtMTUyMDMzNjk1NjkuMzczNDExNTA2Mzc5MDk2ODcxMjI0RS05NDUgLT4gLTEKK2RpdngzMjU4IGRpdmlkZSAtMjM3NjUwMDMyMjEyMjAxNzc0MzA3OTcwMjg5OTczNzggLTE1MjAzMzY5NTY5LjM3MzQxMTUwNjM3OTA5Njg3MTIyNEUtOTQ1IC0+IDEuNTYzMTQwNTMzNjAyMDkzMDA2NDgyNDEzNTY2OTU0MUUrOTY2IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNTggZGl2aWRlaW50IC0yMzc2NTAwMzIyMTIyMDE3NzQzMDc5NzAyODk5NzM3OCAtMTUyMDMzNjk1NjkuMzczNDExNTA2Mzc5MDk2ODcxMjI0RS05NDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjU4IG11bHRpcGx5IC0yMzc2NTAwMzIyMTIyMDE3NzQzMDc5NzAyODk5NzM3OCAtMTUyMDMzNjk1NjkuMzczNDExNTA2Mzc5MDk2ODcxMjI0RS05NDUgLT4gMy42MTMwODEyNjc4OTU1OTk0NjI1MjEwMDA3MDA1MjE2RS05MDQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI1OCBwb3dlciAtMjM3NjUwMDMyMjEyMjAxNzc0MzA3OTcwMjg5OTczNzggLTIgLT4gMS43NzA2MTU0MzE4NDgzNDgxMTkwMzY0OTc5MjA5NDM2RS02MyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjU4IHJlbWFpbmRlciAtMjM3NjUwMDMyMjEyMjAxNzc0MzA3OTcwMjg5OTczNzggLTE1MjAzMzY5NTY5LjM3MzQxMTUwNjM3OTA5Njg3MTIyNEUtOTQ1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI1OCBzdWJ0cmFjdCAtMjM3NjUwMDMyMjEyMjAxNzc0MzA3OTcwMjg5OTczNzggLTE1MjAzMzY5NTY5LjM3MzQxMTUwNjM3OTA5Njg3MTIyNEUtOTQ1IC0+IC0yMzc2NTAwMzIyMTIyMDE3NzQzMDc5NzAyODk5NzM3OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjU5IGFkZCAxMjkyNTUuNDE5Mzc5MzI0MzMzNTkxOTMzMzg5MTA1NTJFKzkzMiAtMjgxMjUzOTUzLjM4OTkwMzgyNzk5NTA4ODczNTYwMzIwIC0+IDEuMjkyNTU0MTkzNzkzMjQzMzM1OTE5MzMzODkxMDU1MkUrOTM3IEluZXhhY3QgUm91bmRlZAorY29teDMyNTkgY29tcGFyZSAxMjkyNTUuNDE5Mzc5MzI0MzMzNTkxOTMzMzg5MTA1NTJFKzkzMiAtMjgxMjUzOTUzLjM4OTkwMzgyNzk5NTA4ODczNTYwMzIwIC0+IDEKK2RpdngzMjU5IGRpdmlkZSAxMjkyNTUuNDE5Mzc5MzI0MzMzNTkxOTMzMzg5MTA1NTJFKzkzMiAtMjgxMjUzOTUzLjM4OTkwMzgyNzk5NTA4ODczNTYwMzIwIC0+IC00LjU5NTY4MzY0NTM4MjgyMTMwNTAyMjMyNjA1NTEwNjRFKzkyOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjU5IGRpdmlkZWludCAxMjkyNTUuNDE5Mzc5MzI0MzMzNTkxOTMzMzg5MTA1NTJFKzkzMiAtMjgxMjUzOTUzLjM4OTkwMzgyNzk5NTA4ODczNTYwMzIwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzI1OSBtdWx0aXBseSAxMjkyNTUuNDE5Mzc5MzI0MzMzNTkxOTMzMzg5MTA1NTJFKzkzMiAtMjgxMjUzOTUzLjM4OTkwMzgyNzk5NTA4ODczNTYwMzIwIC0+IC0zLjYzNTM1OTc2OTc1MDQ5NTgwOTY5MzEwODg3ODAzNjdFKzk0NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjU5IHBvd2VyIDEyOTI1NS40MTkzNzkzMjQzMzM1OTE5MzMzODkxMDU1MkUrOTMyIC0yODEyNTM5NTMgLT4gMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyNTkgcmVtYWluZGVyIDEyOTI1NS40MTkzNzkzMjQzMzM1OTE5MzMzODkxMDU1MkUrOTMyIC0yODEyNTM5NTMuMzg5OTAzODI3OTk1MDg4NzM1NjAzMjAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjU5IHN1YnRyYWN0IDEyOTI1NS40MTkzNzkzMjQzMzM1OTE5MzMzODkxMDU1MkUrOTMyIC0yODEyNTM5NTMuMzg5OTAzODI3OTk1MDg4NzM1NjAzMjAgLT4gMS4yOTI1NTQxOTM3OTMyNDMzMzU5MTkzMzM4OTEwNTUyRSs5MzcgSW5leGFjdCBSb3VuZGVkCithZGR4MzI2MCBhZGQgLTg2ODYzLjI3NjI0OTQ2NjAwODI4OTIxNDc2Mjk4MDgzOCA1MzEuNTA2MDI2NTI3MzIwODgyMDgzOTc2NTU0ODQ0NzYgLT4gLTg2MzMxLjc3MDIyMjkzODY4NzQwNzEzMDc4NjQyNTk5MyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjYwIGNvbXBhcmUgLTg2ODYzLjI3NjI0OTQ2NjAwODI4OTIxNDc2Mjk4MDgzOCA1MzEuNTA2MDI2NTI3MzIwODgyMDgzOTc2NTU0ODQ0NzYgLT4gLTEKK2RpdngzMjYwIGRpdmlkZSAtODY4NjMuMjc2MjQ5NDY2MDA4Mjg5MjE0NzYyOTgwODM4IDUzMS41MDYwMjY1MjczMjA4ODIwODM5NzY1NTQ4NDQ3NiAtPiAtMTYzLjQyODU4MjAxODE1ODkxNDA4NDc1OTAyMjI5NjQ5IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNjAgZGl2aWRlaW50IC04Njg2My4yNzYyNDk0NjYwMDgyODkyMTQ3NjI5ODA4MzggNTMxLjUwNjAyNjUyNzMyMDg4MjA4Mzk3NjU1NDg0NDc2IC0+IC0xNjMKK211bHgzMjYwIG11bHRpcGx5IC04Njg2My4yNzYyNDk0NjYwMDgyODkyMTQ3NjI5ODA4MzggNTMxLjUwNjAyNjUyNzMyMDg4MjA4Mzk3NjU1NDg0NDc2IC0+IC00NjE2ODM1NC44MTA0OTg2ODIxNDA0NTYxNDM1MzQ1MjQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI2MCBwb3dlciAtODY4NjMuMjc2MjQ5NDY2MDA4Mjg5MjE0NzYyOTgwODM4IDUzMiAtPiAyLjg4OTc1NzkxODQxNzM4Mzk1MTk4NTk3MTAyMTc1MTBFKzI2MjcgSW5leGFjdCBSb3VuZGVkCityZW14MzI2MCByZW1haW5kZXIgLTg2ODYzLjI3NjI0OTQ2NjAwODI4OTIxNDc2Mjk4MDgzOCA1MzEuNTA2MDI2NTI3MzIwODgyMDgzOTc2NTU0ODQ0NzYgLT4gLTIyNy43OTM5MjU1MTI3MDQ1MDk1MjY1ODQ1NDExNDIxMgorc3VieDMyNjAgc3VidHJhY3QgLTg2ODYzLjI3NjI0OTQ2NjAwODI4OTIxNDc2Mjk4MDgzOCA1MzEuNTA2MDI2NTI3MzIwODgyMDgzOTc2NTU0ODQ0NzYgLT4gLTg3Mzk0Ljc4MjI3NTk5MzMyOTE3MTI5ODczOTUzNTY4MyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjYxIGFkZCAtNDA3MDcuMTY5MDA2NzcxMTExODU1NTczNTI0MTU3MDgzIC02ODc5NTUyMTQyMTMyMTg1MzMzMzI3NDQxMTgyNzc0OSAtPiAtNjg3OTU1MjE0MjEzMjE4NTMzMzMyNzQ0MTE4Njg0NTYgSW5leGFjdCBSb3VuZGVkCitjb214MzI2MSBjb21wYXJlIC00MDcwNy4xNjkwMDY3NzExMTE4NTU1NzM1MjQxNTcwODMgLTY4Nzk1NTIxNDIxMzIxODUzMzMzMjc0NDExODI3NzQ5IC0+IDEKK2RpdngzMjYxIGRpdmlkZSAtNDA3MDcuMTY5MDA2NzcxMTExODU1NTczNTI0MTU3MDgzIC02ODc5NTUyMTQyMTMyMTg1MzMzMzI3NDQxMTgyNzc0OSAtPiA1LjkxNzEyNDg2MDEzMDAyMzY2OTQzODYxODU1MTMxMzlFLTI4IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNjEgZGl2aWRlaW50IC00MDcwNy4xNjkwMDY3NzExMTE4NTU1NzM1MjQxNTcwODMgLTY4Nzk1NTIxNDIxMzIxODUzMzMzMjc0NDExODI3NzQ5IC0+IDAKK211bHgzMjYxIG11bHRpcGx5IC00MDcwNy4xNjkwMDY3NzExMTE4NTU1NzM1MjQxNTcwODMgLTY4Nzk1NTIxNDIxMzIxODUzMzMzMjc0NDExODI3NzQ5IC0+IDIuODAwNDcwOTE3NDA2NjkxMDU3NzM3MDg5NTQ5OTU3NUUrMzYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI2MSBwb3dlciAtNDA3MDcuMTY5MDA2NzcxMTExODU1NTczNTI0MTU3MDgzIC03IC0+IC01LjM5ODg4MDI5MTU4OTc1OTU3MjI0NDAzOTI4ODQwNTFFLTMzIEluZXhhY3QgUm91bmRlZAorcmVteDMyNjEgcmVtYWluZGVyIC00MDcwNy4xNjkwMDY3NzExMTE4NTU1NzM1MjQxNTcwODMgLTY4Nzk1NTIxNDIxMzIxODUzMzMzMjc0NDExODI3NzQ5IC0+IC00MDcwNy4xNjkwMDY3NzExMTE4NTU1NzM1MjQxNTcwODMKK3N1YngzMjYxIHN1YnRyYWN0IC00MDcwNy4xNjkwMDY3NzExMTE4NTU1NzM1MjQxNTcwODMgLTY4Nzk1NTIxNDIxMzIxODUzMzMzMjc0NDExODI3NzQ5IC0+IDY4Nzk1NTIxNDIxMzIxODUzMzMzMjc0NDExNzg3MDQyIEluZXhhY3QgUm91bmRlZAorYWRkeDMyNjIgYWRkIC05MDgzODc1MjU2ODY3My43Mjg2MzA0OTQ2NTg3NzgwMDNFKzA5NSAtNzM4LjAxMzcwMzAxMjE3NjA2NTc3NTMzMTA3OTgxNDMxIC0+IC05LjA4Mzg3NTI1Njg2NzM3Mjg2MzA0OTQ2NTg3NzgwMDNFKzEwOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjYyIGNvbXBhcmUgLTkwODM4NzUyNTY4NjczLjcyODYzMDQ5NDY1ODc3ODAwM0UrMDk1IC03MzguMDEzNzAzMDEyMTc2MDY1Nzc1MzMxMDc5ODE0MzEgLT4gLTEKK2RpdngzMjYyIGRpdmlkZSAtOTA4Mzg3NTI1Njg2NzMuNzI4NjMwNDk0NjU4Nzc4MDAzRSswOTUgLTczOC4wMTM3MDMwMTIxNzYwNjU3NzUzMzEwNzk4MTQzMSAtPiAxLjIzMDg1NDU1MTg1ODg0MzA4NzUyNjg1NTM4NTE0MjRFKzEwNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjYyIGRpdmlkZWludCAtOTA4Mzg3NTI1Njg2NzMuNzI4NjMwNDk0NjU4Nzc4MDAzRSswOTUgLTczOC4wMTM3MDMwMTIxNzYwNjU3NzUzMzEwNzk4MTQzMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyNjIgbXVsdGlwbHkgLTkwODM4NzUyNTY4NjczLjcyODYzMDQ5NDY1ODc3ODAwM0UrMDk1IC03MzguMDEzNzAzMDEyMTc2MDY1Nzc1MzMxMDc5ODE0MzEgLT4gNi43MDQwMjQ0MTYwMjEzNzE4ODkxNjMzNjc4MjQ4MTI3RSsxMTEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI2MiBwb3dlciAtOTA4Mzg3NTI1Njg2NzMuNzI4NjMwNDk0NjU4Nzc4MDAzRSswOTUgLTczOCAtPiAwRS0xMDAzMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzI2MiByZW1haW5kZXIgLTkwODM4NzUyNTY4NjczLjcyODYzMDQ5NDY1ODc3ODAwM0UrMDk1IC03MzguMDEzNzAzMDEyMTc2MDY1Nzc1MzMxMDc5ODE0MzEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjYyIHN1YnRyYWN0IC05MDgzODc1MjU2ODY3My43Mjg2MzA0OTQ2NTg3NzgwMDNFKzA5NSAtNzM4LjAxMzcwMzAxMjE3NjA2NTc3NTMzMTA3OTgxNDMxIC0+IC05LjA4Mzg3NTI1Njg2NzM3Mjg2MzA0OTQ2NTg3NzgwMDNFKzEwOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjYzIGFkZCAtNDI0NTM2MDk2NzU5My45MjA2NzcxNTU1ODM5NzE4MTU4RS02ODIgLTMuMTE5NjA2MjM5MDQyNTMwMjA3MTAzMjAzNTA4MDU3IC0+IC0zLjExOTYwNjIzOTA0MjUzMDIwNzEwMzIwMzUwODA1NzAgSW5leGFjdCBSb3VuZGVkCitjb214MzI2MyBjb21wYXJlIC00MjQ1MzYwOTY3NTkzLjkyMDY3NzE1NTU4Mzk3MTgxNThFLTY4MiAtMy4xMTk2MDYyMzkwNDI1MzAyMDcxMDMyMDM1MDgwNTcgLT4gMQorZGl2eDMyNjMgZGl2aWRlIC00MjQ1MzYwOTY3NTkzLjkyMDY3NzE1NTU4Mzk3MTgxNThFLTY4MiAtMy4xMTk2MDYyMzkwNDI1MzAyMDcxMDMyMDM1MDgwNTcgLT4gMS4zNjA4NjQzNjYyOTgwMDY2MzU2NDM3MjM2MDgxOTY5RS02NzAgSW5leGFjdCBSb3VuZGVkCitkdml4MzI2MyBkaXZpZGVpbnQgLTQyNDUzNjA5Njc1OTMuOTIwNjc3MTU1NTgzOTcxODE1OEUtNjgyIC0zLjExOTYwNjIzOTA0MjUzMDIwNzEwMzIwMzUwODA1NyAtPiAwCittdWx4MzI2MyBtdWx0aXBseSAtNDI0NTM2MDk2NzU5My45MjA2NzcxNTU1ODM5NzE4MTU4RS02ODIgLTMuMTE5NjA2MjM5MDQyNTMwMjA3MTAzMjAzNTA4MDU3IC0+IDEuMzI0Mzg1NDU2MTQ5MzYyNzg0NDEwNTI5MDQxNTMzMEUtNjY5IEluZXhhY3QgUm91bmRlZAorcG93eDMyNjMgcG93ZXIgLTQyNDUzNjA5Njc1OTMuOTIwNjc3MTU1NTgzOTcxODE1OEUtNjgyIC0zIC0+IC0xLjMwNjk0MTQ1MDQ5MzMyNTMyODgwNDI4MjA0Mjk4OTRFKzIwMDggSW5leGFjdCBSb3VuZGVkCityZW14MzI2MyByZW1haW5kZXIgLTQyNDUzNjA5Njc1OTMuOTIwNjc3MTU1NTgzOTcxODE1OEUtNjgyIC0zLjExOTYwNjIzOTA0MjUzMDIwNzEwMzIwMzUwODA1NyAtPiAtNC4yNDUzNjA5Njc1OTM5MjA2NzcxNTU1ODM5NzE4MTU4RS02NzAKK3N1YngzMjYzIHN1YnRyYWN0IC00MjQ1MzYwOTY3NTkzLjkyMDY3NzE1NTU4Mzk3MTgxNThFLTY4MiAtMy4xMTk2MDYyMzkwNDI1MzAyMDcxMDMyMDM1MDgwNTcgLT4gMy4xMTk2MDYyMzkwNDI1MzAyMDcxMDMyMDM1MDgwNTcwIEluZXhhY3QgUm91bmRlZAorYWRkeDMyNjQgYWRkIC0zNDIyMTQ1NDA1Nzc0LjA4MDAyMTMwMDA1NDc2MTIyNDBFLTAyMyAtNjA4MTAuOTY0NjU2NDA5NjUwODM5MDExMzIxNzA2MzEwIC0+IC02MDgxMC45NjQ2NTY0MDk2ODUwNjA0NjUzNzk0NDcxMTAgSW5leGFjdCBSb3VuZGVkCitjb214MzI2NCBjb21wYXJlIC0zNDIyMTQ1NDA1Nzc0LjA4MDAyMTMwMDA1NDc2MTIyNDBFLTAyMyAtNjA4MTAuOTY0NjU2NDA5NjUwODM5MDExMzIxNzA2MzEwIC0+IDEKK2RpdngzMjY0IGRpdmlkZSAtMzQyMjE0NTQwNTc3NC4wODAwMjEzMDAwNTQ3NjEyMjQwRS0wMjMgLTYwODEwLjk2NDY1NjQwOTY1MDgzOTAxMTMyMTcwNjMxMCAtPiA1LjYyNzUxMzc2MzUyODc4ODI4NzU5MTQxMjQ3NDI2NTBFLTE2IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNjQgZGl2aWRlaW50IC0zNDIyMTQ1NDA1Nzc0LjA4MDAyMTMwMDA1NDc2MTIyNDBFLTAyMyAtNjA4MTAuOTY0NjU2NDA5NjUwODM5MDExMzIxNzA2MzEwIC0+IDAKK211bHgzMjY0IG11bHRpcGx5IC0zNDIyMTQ1NDA1Nzc0LjA4MDAyMTMwMDA1NDc2MTIyNDBFLTAyMyAtNjA4MTAuOTY0NjU2NDA5NjUwODM5MDExMzIxNzA2MzEwIC0+IDAuMDAwMDAyMDgxMDM5NjMzMTk2MjIyNDMyMzI4ODc0NDkxMDYwNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjY0IHBvd2VyIC0zNDIyMTQ1NDA1Nzc0LjA4MDAyMTMwMDA1NDc2MTIyNDBFLTAyMyAtNjA4MTEgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMyNjQgcmVtYWluZGVyIC0zNDIyMTQ1NDA1Nzc0LjA4MDAyMTMwMDA1NDc2MTIyNDBFLTAyMyAtNjA4MTAuOTY0NjU2NDA5NjUwODM5MDExMzIxNzA2MzEwIC0+IC0zLjQyMjE0NTQwNTc3NDA4MDAyMTMwMDA1NDc2MTIyNDBFLTExCitzdWJ4MzI2NCBzdWJ0cmFjdCAtMzQyMjE0NTQwNTc3NC4wODAwMjEzMDAwNTQ3NjEyMjQwRS0wMjMgLTYwODEwLjk2NDY1NjQwOTY1MDgzOTAxMTMyMTcwNjMxMCAtPiA2MDgxMC45NjQ2NTY0MDk2MTY2MTc1NTcyNjM5NjU1MTAgSW5leGFjdCBSb3VuZGVkCithZGR4MzI2NSBhZGQgLTI0NTIxODExLjA3NjQ5NDg1Nzk2NTk4Mzg3NjI3NDc4RS02NjEgLTk0ODYwODQ2MTMzNDA0ODE1NDEwODE2MjM0MDAwNjk0IC0+IC05NDg2MDg0NjEzMzQwNDgxNTQxMDgxNjIzNDAwMDY5NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjY1IGNvbXBhcmUgLTI0NTIxODExLjA3NjQ5NDg1Nzk2NTk4Mzg3NjI3NDc4RS02NjEgLTk0ODYwODQ2MTMzNDA0ODE1NDEwODE2MjM0MDAwNjk0IC0+IDEKK2RpdngzMjY1IGRpdmlkZSAtMjQ1MjE4MTEuMDc2NDk0ODU3OTY1OTgzODc2Mjc0NzhFLTY2MSAtOTQ4NjA4NDYxMzM0MDQ4MTU0MTA4MTYyMzQwMDA2OTQgLT4gMi41ODUwMjk3NjQ3NTc2NjU3ODE5NDgzOTg4ODQ1OTA0RS02ODYgSW5leGFjdCBSb3VuZGVkCitkdml4MzI2NSBkaXZpZGVpbnQgLTI0NTIxODExLjA3NjQ5NDg1Nzk2NTk4Mzg3NjI3NDc4RS02NjEgLTk0ODYwODQ2MTMzNDA0ODE1NDEwODE2MjM0MDAwNjk0IC0+IDAKK211bHgzMjY1IG11bHRpcGx5IC0yNDUyMTgxMS4wNzY0OTQ4NTc5NjU5ODM4NzYyNzQ3OEUtNjYxIC05NDg2MDg0NjEzMzQwNDgxNTQxMDgxNjIzNDAwMDY5NCAtPiAyLjMyNjE1OTc0NzQzOTgwMDYyMTUwMTc3NTE3ODUxMDRFLTYyMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjY1IHBvd2VyIC0yNDUyMTgxMS4wNzY0OTQ4NTc5NjU5ODM4NzYyNzQ3OEUtNjYxIC05IC0+IC0zLjExOTA4NDM1NTk5NDkxODQ2MTg1OTAyNjQyNDY1ODZFKzU4ODIgSW5leGFjdCBSb3VuZGVkCityZW14MzI2NSByZW1haW5kZXIgLTI0NTIxODExLjA3NjQ5NDg1Nzk2NTk4Mzg3NjI3NDc4RS02NjEgLTk0ODYwODQ2MTMzNDA0ODE1NDEwODE2MjM0MDAwNjk0IC0+IC0yLjQ1MjE4MTEwNzY0OTQ4NTc5NjU5ODM4NzYyNzQ3OEUtNjU0CitzdWJ4MzI2NSBzdWJ0cmFjdCAtMjQ1MjE4MTEuMDc2NDk0ODU3OTY1OTgzODc2Mjc0NzhFLTY2MSAtOTQ4NjA4NDYxMzM0MDQ4MTU0MTA4MTYyMzQwMDA2OTQgLT4gOTQ4NjA4NDYxMzM0MDQ4MTU0MTA4MTYyMzQwMDA2OTQgSW5leGFjdCBSb3VuZGVkCithZGR4MzI2NiBhZGQgLTUwNDI1Mjk5Mzc0OTguODk0NDQ5MjI0ODUzODk1MTQzOCAzODkxOTA0Njc0LjQ1NDkxNzA5Njg4MDcxNDU2MTI1NDkgLT4gLTUwMzg2MzgwMzI4MjQuNDM5NTMyMTI3OTczMTgwNTgyNSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjY2IGNvbXBhcmUgLTUwNDI1Mjk5Mzc0OTguODk0NDQ5MjI0ODUzODk1MTQzOCAzODkxOTA0Njc0LjQ1NDkxNzA5Njg4MDcxNDU2MTI1NDkgLT4gLTEKK2RpdngzMjY2IGRpdmlkZSAtNTA0MjUyOTkzNzQ5OC44OTQ0NDkyMjQ4NTM4OTUxNDM4IDM4OTE5MDQ2NzQuNDU0OTE3MDk2ODgwNzE0NTYxMjU0OSAtPiAtMTI5NS42NDU3OTc5NTQ5ODk0MzUxMzc4MTI3NDEzMjgzIEluZXhhY3QgUm91bmRlZAorZHZpeDMyNjYgZGl2aWRlaW50IC01MDQyNTI5OTM3NDk4Ljg5NDQ0OTIyNDg1Mzg5NTE0MzggMzg5MTkwNDY3NC40NTQ5MTcwOTY4ODA3MTQ1NjEyNTQ5IC0+IC0xMjk1CittdWx4MzI2NiBtdWx0aXBseSAtNTA0MjUyOTkzNzQ5OC44OTQ0NDkyMjQ4NTM4OTUxNDM4IDM4OTE5MDQ2NzQuNDU0OTE3MDk2ODgwNzE0NTYxMjU0OSAtPiAtMTk2MjUwNDU4MzQ4MzA4MDgyNTY4NzEuOTUyNjU5MDQ4IEluZXhhY3QgUm91bmRlZAorcG93eDMyNjYgcG93ZXIgLTUwNDI1Mjk5Mzc0OTguODk0NDQ5MjI0ODUzODk1MTQzOCA0IC0+IDYuNDY1Mzc4Mjk5MTgwMDAwOTQ5MjU4MDE4MDk2MDgzOUUrNTAgSW5leGFjdCBSb3VuZGVkCityZW14MzI2NiByZW1haW5kZXIgLTUwNDI1Mjk5Mzc0OTguODk0NDQ5MjI0ODUzODk1MTQzOCAzODkxOTA0Njc0LjQ1NDkxNzA5Njg4MDcxNDU2MTI1NDkgLT4gLTI1MTMzODQwNzkuNzc2ODA4NzY0MzI4NTM4MzE4NzA0NQorc3VieDMyNjYgc3VidHJhY3QgLTUwNDI1Mjk5Mzc0OTguODk0NDQ5MjI0ODUzODk1MTQzOCAzODkxOTA0Njc0LjQ1NDkxNzA5Njg4MDcxNDU2MTI1NDkgLT4gLTUwNDY0MjE4NDIxNzMuMzQ5MzY2MzIxNzM0NjA5NzA1MSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjY3IGFkZCAtNTM1ODI0MTYzLjU0NTMxNzQ3NjQ2MjkzNjkzODY4NjUxRS02NjUgMjczMjk4OC41ODkxMzYzNjM5MzI1MDA4MjA2MDk5NzEyIC0+IDI3MzI5ODguNTg5MTM2MzYzOTMyNTAwODIwNjA5OTcxMiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjY3IGNvbXBhcmUgLTUzNTgyNDE2My41NDUzMTc0NzY0NjI5MzY5Mzg2ODY1MUUtNjY1IDI3MzI5ODguNTg5MTM2MzYzOTMyNTAwODIwNjA5OTcxMiAtPiAtMQorZGl2eDMyNjcgZGl2aWRlIC01MzU4MjQxNjMuNTQ1MzE3NDc2NDYyOTM2OTM4Njg2NTFFLTY2NSAyNzMyOTg4LjU4OTEzNjM2MzkzMjUwMDgyMDYwOTk3MTIgLT4gLTEuOTYwNTc5NTg1NTY4Nzc5MTI0NjYxMTY4MzMyODM0NkUtNjYzIEluZXhhY3QgUm91bmRlZAorZHZpeDMyNjcgZGl2aWRlaW50IC01MzU4MjQxNjMuNTQ1MzE3NDc2NDYyOTM2OTM4Njg2NTFFLTY2NSAyNzMyOTg4LjU4OTEzNjM2MzkzMjUwMDgyMDYwOTk3MTIgLT4gLTAKK211bHgzMjY3IG11bHRpcGx5IC01MzU4MjQxNjMuNTQ1MzE3NDc2NDYyOTM2OTM4Njg2NTFFLTY2NSAyNzMyOTg4LjU4OTEzNjM2MzkzMjUwMDgyMDYwOTk3MTIgLT4gLTEuNDY0NDAxMzI0NzUyODg5NTM3NjI1NDg1MDcwNTU5N0UtNjUwIEluZXhhY3QgUm91bmRlZAorcG93eDMyNjcgcG93ZXIgLTUzNTgyNDE2My41NDUzMTc0NzY0NjI5MzY5Mzg2ODY1MUUtNjY1IDI3MzI5ODkgLT4gLTBFLTEwMDMwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMjY3IHJlbWFpbmRlciAtNTM1ODI0MTYzLjU0NTMxNzQ3NjQ2MjkzNjkzODY4NjUxRS02NjUgMjczMjk4OC41ODkxMzYzNjM5MzI1MDA4MjA2MDk5NzEyIC0+IC01LjM1ODI0MTYzNTQ1MzE3NDc2NDYyOTM2OTM4Njg2NTFFLTY1Nworc3VieDMyNjcgc3VidHJhY3QgLTUzNTgyNDE2My41NDUzMTc0NzY0NjI5MzY5Mzg2ODY1MUUtNjY1IDI3MzI5ODguNTg5MTM2MzYzOTMyNTAwODIwNjA5OTcxMiAtPiAtMjczMjk4OC41ODkxMzYzNjM5MzI1MDA4MjA2MDk5NzEyIEluZXhhY3QgUm91bmRlZAorYWRkeDMyNjggYWRkIDI0MDMyLjcwMjAwODU1MzA4NDI1MjkyNTE0MDg1ODEzNEUtNTA5IDUyODY0ODU0Ljg5OTQyMDYzMjM3NTU4OTIwNjcwNDA2OCAtPiA1Mjg2NDg1NC44OTk0MjA2MzIzNzU1ODkyMDY3MDQwNjggSW5leGFjdCBSb3VuZGVkCitjb214MzI2OCBjb21wYXJlIDI0MDMyLjcwMjAwODU1MzA4NDI1MjkyNTE0MDg1ODEzNEUtNTA5IDUyODY0ODU0Ljg5OTQyMDYzMjM3NTU4OTIwNjcwNDA2OCAtPiAtMQorZGl2eDMyNjggZGl2aWRlIDI0MDMyLjcwMjAwODU1MzA4NDI1MjkyNTE0MDg1ODEzNEUtNTA5IDUyODY0ODU0Ljg5OTQyMDYzMjM3NTU4OTIwNjcwNDA2OCAtPiA0LjU0NjA2NDEyMDM0NTU2OTc5MTc1NzM0MzE5NjE1MTFFLTUxMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjY4IGRpdmlkZWludCAyNDAzMi43MDIwMDg1NTMwODQyNTI5MjUxNDA4NTgxMzRFLTUwOSA1Mjg2NDg1NC44OTk0MjA2MzIzNzU1ODkyMDY3MDQwNjggLT4gMAorbXVseDMyNjggbXVsdGlwbHkgMjQwMzIuNzAyMDA4NTUzMDg0MjUyOTI1MTQwODU4MTM0RS01MDkgNTI4NjQ4NTQuODk5NDIwNjMyMzc1NTg5MjA2NzA0MDY4IC0+IDEuMjcwNDg1MzA0NTIzMTczNTg4NTA3NDk0NTcxMDU3NkUtNDk3IEluZXhhY3QgUm91bmRlZAorcG93eDMyNjggcG93ZXIgMjQwMzIuNzAyMDA4NTUzMDg0MjUyOTI1MTQwODU4MTM0RS01MDkgNTI4NjQ4NTUgLT4gMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyNjggcmVtYWluZGVyIDI0MDMyLjcwMjAwODU1MzA4NDI1MjkyNTE0MDg1ODEzNEUtNTA5IDUyODY0ODU0Ljg5OTQyMDYzMjM3NTU4OTIwNjcwNDA2OCAtPiAyLjQwMzI3MDIwMDg1NTMwODQyNTI5MjUxNDA4NTgxMzRFLTUwNQorc3VieDMyNjggc3VidHJhY3QgMjQwMzIuNzAyMDA4NTUzMDg0MjUyOTI1MTQwODU4MTM0RS01MDkgNTI4NjQ4NTQuODk5NDIwNjMyMzc1NTg5MjA2NzA0MDY4IC0+IC01Mjg2NDg1NC44OTk0MjA2MzIzNzU1ODkyMDY3MDQwNjggSW5leGFjdCBSb3VuZGVkCithZGR4MzI2OSBhZGQgNzE1NTMyMjAyNTkuOTM4OTUwNjk4MDMwNTE5OTA2NzI3RS00OTYgNzU0LjQ0MjIwNDE3NDE1MzI1NDQ0OTQzNTY2MDE2MDYyIC0+IDc1NC40NDIyMDQxNzQxNTMyNTQ0NDk0MzU2NjAxNjA2MiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjY5IGNvbXBhcmUgNzE1NTMyMjAyNTkuOTM4OTUwNjk4MDMwNTE5OTA2NzI3RS00OTYgNzU0LjQ0MjIwNDE3NDE1MzI1NDQ0OTQzNTY2MDE2MDYyIC0+IC0xCitkaXZ4MzI2OSBkaXZpZGUgNzE1NTMyMjAyNTkuOTM4OTUwNjk4MDMwNTE5OTA2NzI3RS00OTYgNzU0LjQ0MjIwNDE3NDE1MzI1NDQ0OTQzNTY2MDE2MDYyIC0+IDkuNDg0MjU0NzA2ODYxNzg3OTc5NDIxODA1MDAwODM1M0UtNDg5IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNjkgZGl2aWRlaW50IDcxNTUzMjIwMjU5LjkzODk1MDY5ODAzMDUxOTkwNjcyN0UtNDk2IDc1NC40NDIyMDQxNzQxNTMyNTQ0NDk0MzU2NjAxNjA2MiAtPiAwCittdWx4MzI2OSBtdWx0aXBseSA3MTU1MzIyMDI1OS45Mzg5NTA2OTgwMzA1MTk5MDY3MjdFLTQ5NiA3NTQuNDQyMjA0MTc0MTUzMjU0NDQ5NDM1NjYwMTYwNjIgLT4gNS4zOTgyNzY5MjA4NjY3MDIxMDQ0Njc1MTQ2Nzg3MjQ4RS00ODMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI2OSBwb3dlciA3MTU1MzIyMDI1OS45Mzg5NTA2OTgwMzA1MTk5MDY3MjdFLTQ5NiA3NTQgLT4gMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyNjkgcmVtYWluZGVyIDcxNTUzMjIwMjU5LjkzODk1MDY5ODAzMDUxOTkwNjcyN0UtNDk2IDc1NC40NDIyMDQxNzQxNTMyNTQ0NDk0MzU2NjAxNjA2MiAtPiA3LjE1NTMyMjAyNTk5Mzg5NTA2OTgwMzA1MTk5MDY3MjdFLTQ4Ngorc3VieDMyNjkgc3VidHJhY3QgNzE1NTMyMjAyNTkuOTM4OTUwNjk4MDMwNTE5OTA2NzI3RS00OTYgNzU0LjQ0MjIwNDE3NDE1MzI1NDQ0OTQzNTY2MDE2MDYyIC0+IC03NTQuNDQyMjA0MTc0MTUzMjU0NDQ5NDM1NjYwMTYwNjIgSW5leGFjdCBSb3VuZGVkCithZGR4MzI3MCBhZGQgMzU1NzIuOTYwMjg0Nzk1OTYyNjk3NzQwOTUzOTMyNTA4IDUyMC4zOTUwNjM2NDY4NzU5NDA4MjcyNTc1NDg3ODkxMEUtNzMxIC0+IDM1NTcyLjk2MDI4NDc5NTk2MjY5Nzc0MDk1MzkzMjUwOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjcwIGNvbXBhcmUgMzU1NzIuOTYwMjg0Nzk1OTYyNjk3NzQwOTUzOTMyNTA4IDUyMC4zOTUwNjM2NDY4NzU5NDA4MjcyNTc1NDg3ODkxMEUtNzMxIC0+IDEKK2RpdngzMjcwIGRpdmlkZSAzNTU3Mi45NjAyODQ3OTU5NjI2OTc3NDA5NTM5MzI1MDggNTIwLjM5NTA2MzY0Njg3NTk0MDgyNzI1NzU0ODc4OTEwRS03MzEgLT4gNi44MzU3NjA1MTUzODY5NTU2NTA0ODY5MDYxNDY5ODUyRSs3MzIgSW5leGFjdCBSb3VuZGVkCitkdml4MzI3MCBkaXZpZGVpbnQgMzU1NzIuOTYwMjg0Nzk1OTYyNjk3NzQwOTUzOTMyNTA4IDUyMC4zOTUwNjM2NDY4NzU5NDA4MjcyNTc1NDg3ODkxMEUtNzMxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzI3MCBtdWx0aXBseSAzNTU3Mi45NjAyODQ3OTU5NjI2OTc3NDA5NTM5MzI1MDggNTIwLjM5NTA2MzY0Njg3NTk0MDgyNzI1NzU0ODc4OTEwRS03MzEgLT4gMS44NTExOTkyOTMxNTE0MTg1MTAyNDc0NjA5Njg2MDY2RS03MjQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI3MCBwb3dlciAzNTU3Mi45NjAyODQ3OTU5NjI2OTc3NDA5NTM5MzI1MDggNSAtPiA1Njk2Mzk0MjI0Nzk4NTQwNDMzNzQwMS4xNDkzNTMxNjkgSW5leGFjdCBSb3VuZGVkCityZW14MzI3MCByZW1haW5kZXIgMzU1NzIuOTYwMjg0Nzk1OTYyNjk3NzQwOTUzOTMyNTA4IDUyMC4zOTUwNjM2NDY4NzU5NDA4MjcyNTc1NDg3ODkxMEUtNzMxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI3MCBzdWJ0cmFjdCAzNTU3Mi45NjAyODQ3OTU5NjI2OTc3NDA5NTM5MzI1MDggNTIwLjM5NTA2MzY0Njg3NTk0MDgyNzI1NzU0ODc4OTEwRS03MzEgLT4gMzU1NzIuOTYwMjg0Nzk1OTYyNjk3NzQwOTUzOTMyNTA4IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNzEgYWRkIDUzMDM1NDA1MDE4MTIzNzYwNTk4MzM0ODk1NDEzMDU3RSs4MTggLTk1NTg0NjQyNDcyNDAuNDQ3Njc5MDA0MjkxMTM3OTE1MSAtPiA1LjMwMzU0MDUwMTgxMjM3NjA1OTgzMzQ4OTU0MTMwNTdFKzg0OSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjcxIGNvbXBhcmUgNTMwMzU0MDUwMTgxMjM3NjA1OTgzMzQ4OTU0MTMwNTdFKzgxOCAtOTU1ODQ2NDI0NzI0MC40NDc2NzkwMDQyOTExMzc5MTUxIC0+IDEKK2RpdngzMjcxIGRpdmlkZSA1MzAzNTQwNTAxODEyMzc2MDU5ODMzNDg5NTQxMzA1N0UrODE4IC05NTU4NDY0MjQ3MjQwLjQ0NzY3OTAwNDI5MTEzNzkxNTEgLT4gLTUuNTQ4NTI3ODQzNjI2NjgwMjQ3MDIwMjQ4NzIzMzI4NUUrODM2IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNzEgZGl2aWRlaW50IDUzMDM1NDA1MDE4MTIzNzYwNTk4MzM0ODk1NDEzMDU3RSs4MTggLTk1NTg0NjQyNDcyNDAuNDQ3Njc5MDA0MjkxMTM3OTE1MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyNzEgbXVsdGlwbHkgNTMwMzU0MDUwMTgxMjM3NjA1OTgzMzQ4OTU0MTMwNTdFKzgxOCAtOTU1ODQ2NDI0NzI0MC40NDc2NzkwMDQyOTExMzc5MTUxIC0+IC01LjA2OTM3MDIyNzAzNjUyNTkyNzQyMDMxODE4OTQ2MTNFKzg2MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjcxIHBvd2VyIDUzMDM1NDA1MDE4MTIzNzYwNTk4MzM0ODk1NDEzMDU3RSs4MTggLTEwIC0+IDUuNjc5OTA1MzkzNTQyNzI2Nzk0NDQ1NTg0ODEzNTYxOEUtODQ5OCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjcxIHJlbWFpbmRlciA1MzAzNTQwNTAxODEyMzc2MDU5ODMzNDg5NTQxMzA1N0UrODE4IC05NTU4NDY0MjQ3MjQwLjQ0NzY3OTAwNDI5MTEzNzkxNTEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjcxIHN1YnRyYWN0IDUzMDM1NDA1MDE4MTIzNzYwNTk4MzM0ODk1NDEzMDU3RSs4MTggLTk1NTg0NjQyNDcyNDAuNDQ3Njc5MDA0MjkxMTM3OTE1MSAtPiA1LjMwMzU0MDUwMTgxMjM3NjA1OTgzMzQ4OTU0MTMwNTdFKzg0OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjcyIGFkZCA5NS40OTA3NTExMjcyNDk5NDU4ODY4MjgyNTczMTIxMTggOTg3LjAxNDk4MzE2MzA3MzY1NzE0MTY3NDEwNjkwMTkyRSsxMzMgLT4gOS44NzAxNDk4MzE2MzA3MzY1NzE0MTY3NDEwNjkwMTkyRSsxMzUgSW5leGFjdCBSb3VuZGVkCitjb214MzI3MiBjb21wYXJlIDk1LjQ5MDc1MTEyNzI0OTk0NTg4NjgyODI1NzMxMjExOCA5ODcuMDE0OTgzMTYzMDczNjU3MTQxNjc0MTA2OTAxOTJFKzEzMyAtPiAtMQorZGl2eDMyNzIgZGl2aWRlIDk1LjQ5MDc1MTEyNzI0OTk0NTg4NjgyODI1NzMxMjExOCA5ODcuMDE0OTgzMTYzMDczNjU3MTQxNjc0MTA2OTAxOTJFKzEzMyAtPiA5LjY3NDcwMTI3MTYyOTMzNDE5Mjc1NjY1MTU5MTUwMTZFLTEzNSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjcyIGRpdmlkZWludCA5NS40OTA3NTExMjcyNDk5NDU4ODY4MjgyNTczMTIxMTggOTg3LjAxNDk4MzE2MzA3MzY1NzE0MTY3NDEwNjkwMTkyRSsxMzMgLT4gMAorbXVseDMyNzIgbXVsdGlwbHkgOTUuNDkwNzUxMTI3MjQ5OTQ1ODg2ODI4MjU3MzEyMTE4IDk4Ny4wMTQ5ODMxNjMwNzM2NTcxNDE2NzQxMDY5MDE5MkUrMTMzIC0+IDkuNDI1MDgwMjExNjA5MTg2MjE4NTc2NDgwMDIyNzAwNEUrMTM3IEluZXhhY3QgUm91bmRlZAorcG93eDMyNzIgcG93ZXIgOTUuNDkwNzUxMTI3MjQ5OTQ1ODg2ODI4MjU3MzEyMTE4IDEwIC0+IDYzMDM5NTQ4NjQ2MTg2ODY0MTYyLjg0NzQ5MTUzNDMzNyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjcyIHJlbWFpbmRlciA5NS40OTA3NTExMjcyNDk5NDU4ODY4MjgyNTczMTIxMTggOTg3LjAxNDk4MzE2MzA3MzY1NzE0MTY3NDEwNjkwMTkyRSsxMzMgLT4gOTUuNDkwNzUxMTI3MjQ5OTQ1ODg2ODI4MjU3MzEyMTE4CitzdWJ4MzI3MiBzdWJ0cmFjdCA5NS40OTA3NTExMjcyNDk5NDU4ODY4MjgyNTczMTIxMTggOTg3LjAxNDk4MzE2MzA3MzY1NzE0MTY3NDEwNjkwMTkyRSsxMzMgLT4gLTkuODcwMTQ5ODMxNjMwNzM2NTcxNDE2NzQxMDY5MDE5MkUrMTM1IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNzMgYWRkIDY5NDM0ODUwMjg3LjQ2MDc4ODU1MDkzNjczMDI5NjE1MyAtMzUxMTkxMzY1NDkwMTUwNDQyNDE1Njk4Mjc1NDIyNjQgLT4gLTM1MTE5MTM2NTQ5MDE1MDQ0MjQxNTAwMzkyNjkxOTc3IEluZXhhY3QgUm91bmRlZAorY29teDMyNzMgY29tcGFyZSA2OTQzNDg1MDI4Ny40NjA3ODg1NTA5MzY3MzAyOTYxNTMgLTM1MTE5MTM2NTQ5MDE1MDQ0MjQxNTY5ODI3NTQyMjY0IC0+IDEKK2RpdngzMjczIGRpdmlkZSA2OTQzNDg1MDI4Ny40NjA3ODg1NTA5MzY3MzAyOTYxNTMgLTM1MTE5MTM2NTQ5MDE1MDQ0MjQxNTY5ODI3NTQyMjY0IC0+IC0xLjk3NzEyMjkzMzgzMjcyNzM2NDQxMjkzOTQ3MzQyOTlFLTIxIEluZXhhY3QgUm91bmRlZAorZHZpeDMyNzMgZGl2aWRlaW50IDY5NDM0ODUwMjg3LjQ2MDc4ODU1MDkzNjczMDI5NjE1MyAtMzUxMTkxMzY1NDkwMTUwNDQyNDE1Njk4Mjc1NDIyNjQgLT4gLTAKK211bHgzMjczIG11bHRpcGx5IDY5NDM0ODUwMjg3LjQ2MDc4ODU1MDkzNjczMDI5NjE1MyAtMzUxMTkxMzY1NDkwMTUwNDQyNDE1Njk4Mjc1NDIyNjQgLT4gLTIuNDM4NDkxOTg4NTA1NzUxOTMwMjY0NjUyMjQyNTk4MEUrNDIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI3MyBwb3dlciA2OTQzNDg1MDI4Ny40NjA3ODg1NTA5MzY3MzAyOTYxNTMgLTQgLT4gNC4zMDIxOTM5NjA1ODQyMDM4OTk1MzcwNDQzNzQzODQ0RS00NCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjczIHJlbWFpbmRlciA2OTQzNDg1MDI4Ny40NjA3ODg1NTA5MzY3MzAyOTYxNTMgLTM1MTE5MTM2NTQ5MDE1MDQ0MjQxNTY5ODI3NTQyMjY0IC0+IDY5NDM0ODUwMjg3LjQ2MDc4ODU1MDkzNjczMDI5NjE1Mworc3VieDMyNzMgc3VidHJhY3QgNjk0MzQ4NTAyODcuNDYwNzg4NTUwOTM2NzMwMjk2MTUzIC0zNTExOTEzNjU0OTAxNTA0NDI0MTU2OTgyNzU0MjI2NCAtPiAzNTExOTEzNjU0OTAxNTA0NDI0MTYzOTI2MjM5MjU1MSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjc0IGFkZCAtMzkyLjIyNzM5OTI0NjIxOTY1NjIxNzM5MDk4NzI1NDA3IC02NTU1MTI3NC45ODcxNjA5OTgxOTUyODIxMDk2MTIxMzYgLT4gLTY1NTUxNjY3LjIxNDU2MDI0NDQxNDkzODMyNzAwMzEyMyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjc0IGNvbXBhcmUgLTM5Mi4yMjczOTkyNDYyMTk2NTYyMTczOTA5ODcyNTQwNyAtNjU1NTEyNzQuOTg3MTYwOTk4MTk1MjgyMTA5NjEyMTM2IC0+IDEKK2RpdngzMjc0IGRpdmlkZSAtMzkyLjIyNzM5OTI0NjIxOTY1NjIxNzM5MDk4NzI1NDA3IC02NTU1MTI3NC45ODcxNjA5OTgxOTUyODIxMDk2MTIxMzYgLT4gMC4wMDAwMDU5ODM1MjA1MjM3ODkwODA5NDQ5Njg0MzE3MjQ1MDMzIEluZXhhY3QgUm91bmRlZAorZHZpeDMyNzQgZGl2aWRlaW50IC0zOTIuMjI3Mzk5MjQ2MjE5NjU2MjE3MzkwOTg3MjU0MDcgLTY1NTUxMjc0Ljk4NzE2MDk5ODE5NTI4MjEwOTYxMjEzNiAtPiAwCittdWx4MzI3NCBtdWx0aXBseSAtMzkyLjIyNzM5OTI0NjIxOTY1NjIxNzM5MDk4NzI1NDA3IC02NTU1MTI3NC45ODcxNjA5OTgxOTUyODIxMDk2MTIxMzYgLT4gMjU3MTEwMDYxMDUuNDg3OTI5MTA4MzI5NjM3NzAxODgyIEluZXhhY3QgUm91bmRlZAorcG93eDMyNzQgcG93ZXIgLTM5Mi4yMjczOTkyNDYyMTk2NTYyMTczOTA5ODcyNTQwNyAtNjU1NTEyNzUgLT4gLTBFLTEwMDMwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMjc0IHJlbWFpbmRlciAtMzkyLjIyNzM5OTI0NjIxOTY1NjIxNzM5MDk4NzI1NDA3IC02NTU1MTI3NC45ODcxNjA5OTgxOTUyODIxMDk2MTIxMzYgLT4gLTM5Mi4yMjczOTkyNDYyMTk2NTYyMTczOTA5ODcyNTQwNworc3VieDMyNzQgc3VidHJhY3QgLTM5Mi4yMjczOTkyNDYyMTk2NTYyMTczOTA5ODcyNTQwNyAtNjU1NTEyNzQuOTg3MTYwOTk4MTk1MjgyMTA5NjEyMTM2IC0+IDY1NTUwODgyLjc1OTc2MTc1MTk3NTYyNTg5MjIyMTE0OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjc1IGFkZCA2NDEzMjY1LjQ0MjM1NjExOTE3OTI5NzIwODU1Mzk0NTcgMjQ1MTQuMjIyNzA0NzE0MTM5MzUwMDI2MTY1NzIxMTQ2IC0+IDY0Mzc3NzkuNjY1MDYwODMzMzE4NjQ3MjM0NzE5NjY2OCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjc1IGNvbXBhcmUgNjQxMzI2NS40NDIzNTYxMTkxNzkyOTcyMDg1NTM5NDU3IDI0NTE0LjIyMjcwNDcxNDEzOTM1MDAyNjE2NTcyMTE0NiAtPiAxCitkaXZ4MzI3NSBkaXZpZGUgNjQxMzI2NS40NDIzNTYxMTkxNzkyOTcyMDg1NTM5NDU3IDI0NTE0LjIyMjcwNDcxNDEzOTM1MDAyNjE2NTcyMTE0NiAtPiAyNjEuNjE0MDY0NjAyNzAyNDE0OTg3NTc4Njg2ODE4ODMgSW5leGFjdCBSb3VuZGVkCitkdml4MzI3NSBkaXZpZGVpbnQgNjQxMzI2NS40NDIzNTYxMTkxNzkyOTcyMDg1NTM5NDU3IDI0NTE0LjIyMjcwNDcxNDEzOTM1MDAyNjE2NTcyMTE0NiAtPiAyNjEKK211bHgzMjc1IG11bHRpcGx5IDY0MTMyNjUuNDQyMzU2MTE5MTc5Mjk3MjA4NTUzOTQ1NyAyNDUxNC4yMjI3MDQ3MTQxMzkzNTAwMjYxNjU3MjExNDYgLT4gMTU3MjE2MjE3MzE4LjM2NDk0NTI1MzAwNjk0NTgzMTM4IEluZXhhY3QgUm91bmRlZAorcG93eDMyNzUgcG93ZXIgNjQxMzI2NS40NDIzNTYxMTkxNzkyOTcyMDg1NTM5NDU3IDI0NTE0IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMyNzUgcmVtYWluZGVyIDY0MTMyNjUuNDQyMzU2MTE5MTc5Mjk3MjA4NTUzOTQ1NyAyNDUxNC4yMjI3MDQ3MTQxMzkzNTAwMjYxNjU3MjExNDYgLT4gMTUwNTMuMzE2NDI1NzI4ODA4OTQwMzc5MzAwNzI2NTk0CitzdWJ4MzI3NSBzdWJ0cmFjdCA2NDEzMjY1LjQ0MjM1NjExOTE3OTI5NzIwODU1Mzk0NTcgMjQ1MTQuMjIyNzA0NzE0MTM5MzUwMDI2MTY1NzIxMTQ2IC0+IDYzODg3NTEuMjE5NjUxNDA1MDM5OTQ3MTgyMzg4MjI0NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjc2IGFkZCAtNi45NjY3NzA2Mzg5MTIyMTA3NzYwMDQ2MTg0MDY0MDU3RSs0ODcgMzIuNDA1ODEwNzAzOTcxNTM4Mjc4NDE5NjI1NTI3MjM0IC0+IC02Ljk2Njc3MDYzODkxMjIxMDc3NjAwNDYxODQwNjQwNTdFKzQ4NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjc2IGNvbXBhcmUgLTYuOTY2NzcwNjM4OTEyMjEwNzc2MDA0NjE4NDA2NDA1N0UrNDg3IDMyLjQwNTgxMDcwMzk3MTUzODI3ODQxOTYyNTUyNzIzNCAtPiAtMQorZGl2eDMyNzYgZGl2aWRlIC02Ljk2Njc3MDYzODkxMjIxMDc3NjAwNDYxODQwNjQwNTdFKzQ4NyAzMi40MDU4MTA3MDM5NzE1MzgyNzg0MTk2MjU1MjcyMzQgLT4gLTIuMTQ5ODUyMjkxMTY4OTk5NzM0MTM0NzI5MzQxOTc2MUUrNDg2IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNzYgZGl2aWRlaW50IC02Ljk2Njc3MDYzODkxMjIxMDc3NjAwNDYxODQwNjQwNTdFKzQ4NyAzMi40MDU4MTA3MDM5NzE1MzgyNzg0MTk2MjU1MjcyMzQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjc2IG11bHRpcGx5IC02Ljk2Njc3MDYzODkxMjIxMDc3NjAwNDYxODQwNjQwNTdFKzQ4NyAzMi40MDU4MTA3MDM5NzE1MzgyNzg0MTk2MjU1MjcyMzQgLT4gLTIuMjU3NjM4NTA1NDI1NzU5NTI1OTUxMTU1NjI1ODQ3MEUrNDg5IEluZXhhY3QgUm91bmRlZAorcG93eDMyNzYgcG93ZXIgLTYuOTY2NzcwNjM4OTEyMjEwNzc2MDA0NjE4NDA2NDA1N0UrNDg3IDMyIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMyNzYgcmVtYWluZGVyIC02Ljk2Njc3MDYzODkxMjIxMDc3NjAwNDYxODQwNjQwNTdFKzQ4NyAzMi40MDU4MTA3MDM5NzE1MzgyNzg0MTk2MjU1MjcyMzQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjc2IHN1YnRyYWN0IC02Ljk2Njc3MDYzODkxMjIxMDc3NjAwNDYxODQwNjQwNTdFKzQ4NyAzMi40MDU4MTA3MDM5NzE1MzgyNzg0MTk2MjU1MjcyMzQgLT4gLTYuOTY2NzcwNjM4OTEyMjEwNzc2MDA0NjE4NDA2NDA1N0UrNDg3IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNzcgYWRkIDM3ODIwNDcxNjYzMy40MDAyNDEwMDYwMjg5NjA1NzYxNSAtMDMwMDIxODcxNDM3OC4zMjIyMzEyNjk2MDYyMTY1MTYgLT4gNzc5ODYwMDIyNTUuMDc4MDA5NzM2NDIyNzQ0MDYwMTUKK2NvbXgzMjc3IGNvbXBhcmUgMzc4MjA0NzE2NjMzLjQwMDI0MTAwNjAyODk2MDU3NjE1IC0wMzAwMjE4NzE0Mzc4LjMyMjIzMTI2OTYwNjIxNjUxNiAtPiAxCitkaXZ4MzI3NyBkaXZpZGUgMzc4MjA0NzE2NjMzLjQwMDI0MTAwNjAyODk2MDU3NjE1IC0wMzAwMjE4NzE0Mzc4LjMyMjIzMTI2OTYwNjIxNjUxNiAtPiAtMS4yNTk3NjM5NjA0NzMxNzUzMjg0NTk5NzQ4ODIwODc2IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNzcgZGl2aWRlaW50IDM3ODIwNDcxNjYzMy40MDAyNDEwMDYwMjg5NjA1NzYxNSAtMDMwMDIxODcxNDM3OC4zMjIyMzEyNjk2MDYyMTY1MTYgLT4gLTEKK211bHgzMjc3IG11bHRpcGx5IDM3ODIwNDcxNjYzMy40MDAyNDEwMDYwMjg5NjA1NzYxNSAtMDMwMDIxODcxNDM3OC4zMjIyMzEyNjk2MDYyMTY1MTYgLT4gLTExMzU0NDEzMzc5OTQ5NzA4MjA3NTU1Ny4yMTE4MDQzMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjc3IHBvd2VyIDM3ODIwNDcxNjYzMy40MDAyNDEwMDYwMjg5NjA1NzYxNSAtMyAtPiAxLjg0ODQ5ODgyMTI0MDE4ODY4ODc1NjI3Nzk5OTY3MzdFLTM1IEluZXhhY3QgUm91bmRlZAorcmVteDMyNzcgcmVtYWluZGVyIDM3ODIwNDcxNjYzMy40MDAyNDEwMDYwMjg5NjA1NzYxNSAtMDMwMDIxODcxNDM3OC4zMjIyMzEyNjk2MDYyMTY1MTYgLT4gNzc5ODYwMDIyNTUuMDc4MDA5NzM2NDIyNzQ0MDYwMTUKK3N1YngzMjc3IHN1YnRyYWN0IDM3ODIwNDcxNjYzMy40MDAyNDEwMDYwMjg5NjA1NzYxNSAtMDMwMDIxODcxNDM3OC4zMjIyMzEyNjk2MDYyMTY1MTYgLT4gNjc4NDIzNDMxMDExLjcyMjQ3MjI3NTYzNTE3NzA5MjE1CithZGR4MzI3OCBhZGQgLTQ0MjM0LjUxMjAxMjQ1NzE0ODAyNzY4NTI4Mjk2OTIzNUUrNTAxIDIxMzI1NzIuNDU3MTk4NzkwODM3NTAwMjEwMDg5NDkyNyAtPiAtNC40MjM0NTEyMDEyNDU3MTQ4MDI3Njg1MjgyOTY5MjM1RSs1MDUgSW5leGFjdCBSb3VuZGVkCitjb214MzI3OCBjb21wYXJlIC00NDIzNC41MTIwMTI0NTcxNDgwMjc2ODUyODI5NjkyMzVFKzUwMSAyMTMyNTcyLjQ1NzE5ODc5MDgzNzUwMDIxMDA4OTQ5MjcgLT4gLTEKK2RpdngzMjc4IGRpdmlkZSAtNDQyMzQuNTEyMDEyNDU3MTQ4MDI3Njg1MjgyOTY5MjM1RSs1MDEgMjEzMjU3Mi40NTcxOTg3OTA4Mzc1MDAyMTAwODk0OTI3IC0+IC0yLjA3NDIzMjU0Nzc5MTYzNDcxOTMxODE2MDM5NjMyNTdFKzQ5OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjc4IGRpdmlkZWludCAtNDQyMzQuNTEyMDEyNDU3MTQ4MDI3Njg1MjgyOTY5MjM1RSs1MDEgMjEzMjU3Mi40NTcxOTg3OTA4Mzc1MDAyMTAwODk0OTI3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzI3OCBtdWx0aXBseSAtNDQyMzQuNTEyMDEyNDU3MTQ4MDI3Njg1MjgyOTY5MjM1RSs1MDEgMjEzMjU3Mi40NTcxOTg3OTA4Mzc1MDAyMTAwODk0OTI3IC0+IC05LjQzMzMzMDE5NzUzOTUxNzA0NjU5ODI5NjgwMTk5MTVFKzUxMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjc4IHBvd2VyIC00NDIzNC41MTIwMTI0NTcxNDgwMjc2ODUyODI5NjkyMzVFKzUwMSAyMTMyNTcyIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMyNzggcmVtYWluZGVyIC00NDIzNC41MTIwMTI0NTcxNDgwMjc2ODUyODI5NjkyMzVFKzUwMSAyMTMyNTcyLjQ1NzE5ODc5MDgzNzUwMDIxMDA4OTQ5MjcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjc4IHN1YnRyYWN0IC00NDIzNC41MTIwMTI0NTcxNDgwMjc2ODUyODI5NjkyMzVFKzUwMSAyMTMyNTcyLjQ1NzE5ODc5MDgzNzUwMDIxMDA4OTQ5MjcgLT4gLTQuNDIzNDUxMjAxMjQ1NzE0ODAyNzY4NTI4Mjk2OTIzNUUrNTA1IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNzkgYWRkIC0zNTU0LjU4OTU5NzQ5Njg3NDE0NjU2NTQwMjI3NzIxMDBFLTA3MyA5NzUyLjA0Mjg3NDY3MjI0OTc2MjE5MzY5OTg1MzM4NDhFKzUxNiAtPiA5Ljc1MjA0Mjg3NDY3MjI0OTc2MjE5MzY5OTg1MzM4NDhFKzUxOSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjc5IGNvbXBhcmUgLTM1NTQuNTg5NTk3NDk2ODc0MTQ2NTY1NDAyMjc3MjEwMEUtMDczIDk3NTIuMDQyODc0NjcyMjQ5NzYyMTkzNjk5ODUzMzg0OEUrNTE2IC0+IC0xCitkaXZ4MzI3OSBkaXZpZGUgLTM1NTQuNTg5NTk3NDk2ODc0MTQ2NTY1NDAyMjc3MjEwMEUtMDczIDk3NTIuMDQyODc0NjcyMjQ5NzYyMTkzNjk5ODUzMzg0OEUrNTE2IC0+IC0zLjY0NDk2OTIwNjEyMjcxMDA1NzI3NjgzMzA5MTIxNjJFLTU5MCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjc5IGRpdmlkZWludCAtMzU1NC41ODk1OTc0OTY4NzQxNDY1NjU0MDIyNzcyMTAwRS0wNzMgOTc1Mi4wNDI4NzQ2NzIyNDk3NjIxOTM2OTk4NTMzODQ4RSs1MTYgLT4gLTAKK211bHgzMjc5IG11bHRpcGx5IC0zNTU0LjU4OTU5NzQ5Njg3NDE0NjU2NTQwMjI3NzIxMDBFLTA3MyA5NzUyLjA0Mjg3NDY3MjI0OTc2MjE5MzY5OTg1MzM4NDhFKzUxNiAtPiAtMy40NjY0NTEwMTU2NjUzNDkxNzY5OTAxNDM1Nzc3MDYwRSs0NTAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI3OSBwb3dlciAtMzU1NC41ODk1OTc0OTY4NzQxNDY1NjU0MDIyNzcyMTAwRS0wNzMgMTAgLT4gMy4yMjAyODc1NzE2MDE5MjY2OTMzMjE1Mzg3NDU2MTk3RS02OTUgSW5leGFjdCBSb3VuZGVkCityZW14MzI3OSByZW1haW5kZXIgLTM1NTQuNTg5NTk3NDk2ODc0MTQ2NTY1NDAyMjc3MjEwMEUtMDczIDk3NTIuMDQyODc0NjcyMjQ5NzYyMTkzNjk5ODUzMzg0OEUrNTE2IC0+IC0zLjU1NDU4OTU5NzQ5Njg3NDE0NjU2NTQwMjI3NzIxMDBFLTcwCitzdWJ4MzI3OSBzdWJ0cmFjdCAtMzU1NC41ODk1OTc0OTY4NzQxNDY1NjU0MDIyNzcyMTAwRS0wNzMgOTc1Mi4wNDI4NzQ2NzIyNDk3NjIxOTM2OTk4NTMzODQ4RSs1MTYgLT4gLTkuNzUyMDQyODc0NjcyMjQ5NzYyMTkzNjk5ODUzMzg0OEUrNTE5IEluZXhhY3QgUm91bmRlZAorYWRkeDMyODAgYWRkIDc1MDE4NzY4NS42MzYzMjYwODkyMzM5NzIzNDM5MTY2OCA0NjMzMTk0MjUyODYzLjY3MzA2MjU5NzI2NjkyNDYwMjUgLT4gNDYzMzk0NDQ0MDU0OS4zMDkzODg2ODY1MDA4OTY5NDY0IEluZXhhY3QgUm91bmRlZAorY29teDMyODAgY29tcGFyZSA3NTAxODc2ODUuNjM2MzI2MDg5MjMzOTcyMzQzOTE2NjggNDYzMzE5NDI1Mjg2My42NzMwNjI1OTcyNjY5MjQ2MDI1IC0+IC0xCitkaXZ4MzI4MCBkaXZpZGUgNzUwMTg3Njg1LjYzNjMyNjA4OTIzMzk3MjM0MzkxNjY4IDQ2MzMxOTQyNTI4NjMuNjczMDYyNTk3MjY2OTI0NjAyNSAtPiAwLjAwMDE2MTkxNTg3MTU3NjY0NTQxNDYzODcxODA3MzgyNzU5IEluZXhhY3QgUm91bmRlZAorZHZpeDMyODAgZGl2aWRlaW50IDc1MDE4NzY4NS42MzYzMjYwODkyMzM5NzIzNDM5MTY2OCA0NjMzMTk0MjUyODYzLjY3MzA2MjU5NzI2NjkyNDYwMjUgLT4gMAorbXVseDMyODAgbXVsdGlwbHkgNzUwMTg3Njg1LjYzNjMyNjA4OTIzMzk3MjM0MzkxNjY4IDQ2MzMxOTQyNTI4NjMuNjczMDYyNTk3MjY2OTI0NjAyNSAtPiAzNDc1NzY1MjczNjU5MzI1ODk1MDEyLjc2MTIxMDc1NTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI4MCBwb3dlciA3NTAxODc2ODUuNjM2MzI2MDg5MjMzOTcyMzQzOTE2NjggNSAtPiAyLjM3NjAxNzYwNjg4Mjk1Mjk3NDUxNTIxODg3OTg1NTdFKzQ0IEluZXhhY3QgUm91bmRlZAorcmVteDMyODAgcmVtYWluZGVyIDc1MDE4NzY4NS42MzYzMjYwODkyMzM5NzIzNDM5MTY2OCA0NjMzMTk0MjUyODYzLjY3MzA2MjU5NzI2NjkyNDYwMjUgLT4gNzUwMTg3Njg1LjYzNjMyNjA4OTIzMzk3MjM0MzkxNjY4CitzdWJ4MzI4MCBzdWJ0cmFjdCA3NTAxODc2ODUuNjM2MzI2MDg5MjMzOTcyMzQzOTE2NjggNDYzMzE5NDI1Mjg2My42NzMwNjI1OTcyNjY5MjQ2MDI1IC0+IC00NjMyNDQ0MDY1MTc4LjAzNjczNjUwODAzMjk1MjI1ODYgSW5leGFjdCBSb3VuZGVkCithZGR4MzI4MSBhZGQgMzAxOTAwMzQyNDI4NTMuMjUxMTY1OTUxNDU3NTg5Mzg2RS0wMjggODAzODg4NTY3Ni4zMjA0MjM4MzIyOTc2MDg3Nzk5NzUxRSswMTggLT4gODAzODg4NTY3NjMyMDQyMzgzMjI5NzYwODc3OS45NzUxIEluZXhhY3QgUm91bmRlZAorY29teDMyODEgY29tcGFyZSAzMDE5MDAzNDI0Mjg1My4yNTExNjU5NTE0NTc1ODkzODZFLTAyOCA4MDM4ODg1Njc2LjMyMDQyMzgzMjI5NzYwODc3OTk3NTFFKzAxOCAtPiAtMQorZGl2eDMyODEgZGl2aWRlIDMwMTkwMDM0MjQyODUzLjI1MTE2NTk1MTQ1NzU4OTM4NkUtMDI4IDgwMzg4ODU2NzYuMzIwNDIzODMyMjk3NjA4Nzc5OTc1MUUrMDE4IC0+IDMuNzU1NDk5ODg2MjMxOTgwNzI5NTkwMzM0ODk2MDI4MEUtNDMgSW5leGFjdCBSb3VuZGVkCitkdml4MzI4MSBkaXZpZGVpbnQgMzAxOTAwMzQyNDI4NTMuMjUxMTY1OTUxNDU3NTg5Mzg2RS0wMjggODAzODg4NTY3Ni4zMjA0MjM4MzIyOTc2MDg3Nzk5NzUxRSswMTggLT4gMAorbXVseDMyODEgbXVsdGlwbHkgMzAxOTAwMzQyNDI4NTMuMjUxMTY1OTUxNDU3NTg5Mzg2RS0wMjggODAzODg4NTY3Ni4zMjA0MjM4MzIyOTc2MDg3Nzk5NzUxRSswMTggLT4gMjQyNjk0MjMzODQyNDkuNjExMjYzNzI4ODU0NzkzNzMxIEluZXhhY3QgUm91bmRlZAorcG93eDMyODEgcG93ZXIgMzAxOTAwMzQyNDI4NTMuMjUxMTY1OTUxNDU3NTg5Mzg2RS0wMjggOCAtPiA2LjkwMDk0OTQzMDU2MTI1ODk1NzgzMzI2OTA2OTIxMTNFLTExNyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjgxIHJlbWFpbmRlciAzMDE5MDAzNDI0Mjg1My4yNTExNjU5NTE0NTc1ODkzODZFLTAyOCA4MDM4ODg1Njc2LjMyMDQyMzgzMjI5NzYwODc3OTk3NTFFKzAxOCAtPiAzLjAxOTAwMzQyNDI4NTMyNTExNjU5NTE0NTc1ODkzODZFLTE1CitzdWJ4MzI4MSBzdWJ0cmFjdCAzMDE5MDAzNDI0Mjg1My4yNTExNjU5NTE0NTc1ODkzODZFLTAyOCA4MDM4ODg1Njc2LjMyMDQyMzgzMjI5NzYwODc3OTk3NTFFKzAxOCAtPiAtODAzODg4NTY3NjMyMDQyMzgzMjI5NzYwODc3OS45NzUxIEluZXhhY3QgUm91bmRlZAorYWRkeDMyODIgYWRkIDY1LjUzNzk0MjY3Njc3NDcxNTk1MzQwMDc2ODgwMzUzOSAxMjU5NDY5MTcyNjAuODc1MzY1MDYxOTcxOTE3ODIxOTggLT4gMTI1OTQ2OTE3MzI2LjQxMzMwNzczODc0NjYzMzc3NTM4IEluZXhhY3QgUm91bmRlZAorY29teDMyODIgY29tcGFyZSA2NS41Mzc5NDI2NzY3NzQ3MTU5NTM0MDA3Njg4MDM1MzkgMTI1OTQ2OTE3MjYwLjg3NTM2NTA2MTk3MTkxNzgyMTk4IC0+IC0xCitkaXZ4MzI4MiBkaXZpZGUgNjUuNTM3OTQyNjc2Nzc0NzE1OTUzNDAwNzY4ODAzNTM5IDEyNTk0NjkxNzI2MC44NzUzNjUwNjE5NzE5MTc4MjE5OCAtPiA1LjIwMzYxNjI2MTY4NDY4OTQ5MjAzODk0MTQ3MzU4NzhFLTEwIEluZXhhY3QgUm91bmRlZAorZHZpeDMyODIgZGl2aWRlaW50IDY1LjUzNzk0MjY3Njc3NDcxNTk1MzQwMDc2ODgwMzUzOSAxMjU5NDY5MTcyNjAuODc1MzY1MDYxOTcxOTE3ODIxOTggLT4gMAorbXVseDMyODIgbXVsdGlwbHkgNjUuNTM3OTQyNjc2Nzc0NzE1OTUzNDAwNzY4ODAzNTM5IDEyNTk0NjkxNzI2MC44NzUzNjUwNjE5NzE5MTc4MjE5OCAtPiA4MjU0MzAxODQzNzU5LjczNzY5OTA5NTczNTU0MTEzNzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI4MiBwb3dlciA2NS41Mzc5NDI2NzY3NzQ3MTU5NTM0MDA3Njg4MDM1MzkgMSAtPiA2NS41Mzc5NDI2NzY3NzQ3MTU5NTM0MDA3Njg4MDM1MzkKK3JlbXgzMjgyIHJlbWFpbmRlciA2NS41Mzc5NDI2NzY3NzQ3MTU5NTM0MDA3Njg4MDM1MzkgMTI1OTQ2OTE3MjYwLjg3NTM2NTA2MTk3MTkxNzgyMTk4IC0+IDY1LjUzNzk0MjY3Njc3NDcxNTk1MzQwMDc2ODgwMzUzOQorc3VieDMyODIgc3VidHJhY3QgNjUuNTM3OTQyNjc2Nzc0NzE1OTUzNDAwNzY4ODAzNTM5IDEyNTk0NjkxNzI2MC44NzUzNjUwNjE5NzE5MTc4MjE5OCAtPiAtMTI1OTQ2OTE3MTk1LjMzNzQyMjM4NTE5NzIwMTg2ODU4IEluZXhhY3QgUm91bmRlZAorYWRkeDMyODMgYWRkIDgwMTUyNzIzNDg2NzcuNTQ4OTM5NDE4Mzg4MTgxMzcwMCA5NDkuMjMwMjcxMTE0OTk3NzkyNTgyODQ4Nzc5MjAwMjIgLT4gODAxNTI3MjM0OTYyNi43NzkyMTA1MzMzODU5NzM5NTI4IEluZXhhY3QgUm91bmRlZAorY29teDMyODMgY29tcGFyZSA4MDE1MjcyMzQ4Njc3LjU0ODkzOTQxODM4ODE4MTM3MDAgOTQ5LjIzMDI3MTExNDk5Nzc5MjU4Mjg0ODc3OTIwMDIyIC0+IDEKK2RpdngzMjgzIGRpdmlkZSA4MDE1MjcyMzQ4Njc3LjU0ODkzOTQxODM4ODE4MTM3MDAgOTQ5LjIzMDI3MTExNDk5Nzc5MjU4Mjg0ODc3OTIwMDIyIC0+IDg0NDM5NzA0MzguNTU2MDEwNzk3ODc5MDA4NDQzMDExMCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjgzIGRpdmlkZWludCA4MDE1MjcyMzQ4Njc3LjU0ODkzOTQxODM4ODE4MTM3MDAgOTQ5LjIzMDI3MTExNDk5Nzc5MjU4Mjg0ODc3OTIwMDIyIC0+IDg0NDM5NzA0MzgKK211bHgzMjgzIG11bHRpcGx5IDgwMTUyNzIzNDg2NzcuNTQ4OTM5NDE4Mzg4MTgxMzcwMCA5NDkuMjMwMjcxMTE0OTk3NzkyNTgyODQ4Nzc5MjAwMjIgLT4gNzYwODMzOTE0NDU5NTczNC44OTg0MjgxNDMxNDcxNzQxIEluZXhhY3QgUm91bmRlZAorcG93eDMyODMgcG93ZXIgODAxNTI3MjM0ODY3Ny41NDg5Mzk0MTgzODgxODEzNzAwIDk0OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjgzIHJlbWFpbmRlciA4MDE1MjcyMzQ4Njc3LjU0ODkzOTQxODM4ODE4MTM3MDAgOTQ5LjIzMDI3MTExNDk5Nzc5MjU4Mjg0ODc3OTIwMDIyIC0+IDUyNy43ODIyODA0MTM1NTc0MjM5Nzg5NTMwMzY5MDM2NAorc3VieDMyODMgc3VidHJhY3QgODAxNTI3MjM0ODY3Ny41NDg5Mzk0MTgzODgxODEzNzAwIDk0OS4yMzAyNzExMTQ5OTc3OTI1ODI4NDg3NzkyMDAyMiAtPiA4MDE1MjcyMzQ3NzI4LjMxODY2ODMwMzM5MDM4ODc4NzIgSW5leGFjdCBSb3VuZGVkCithZGR4MzI4NCBhZGQgLTMyNTk1MzMzOTgyLjY3MDY4NjIyMTIwNDUxODA0MjI1IDY5MTMwLjA1MjIzMzY0OTgwODc1MDExMzE0MTUwMjQ2NUUtODYyIC0+IC0zMjU5NTMzMzk4Mi42NzA2ODYyMjEyMDQ1MTgwNDIyNTAgSW5leGFjdCBSb3VuZGVkCitjb214MzI4NCBjb21wYXJlIC0zMjU5NTMzMzk4Mi42NzA2ODYyMjEyMDQ1MTgwNDIyNSA2OTEzMC4wNTIyMzM2NDk4MDg3NTAxMTMxNDE1MDI0NjVFLTg2MiAtPiAtMQorZGl2eDMyODQgZGl2aWRlIC0zMjU5NTMzMzk4Mi42NzA2ODYyMjEyMDQ1MTgwNDIyNSA2OTEzMC4wNTIyMzM2NDk4MDg3NTAxMTMxNDE1MDI0NjVFLTg2MiAtPiAtNC43MTUwNzQ0MDM4OTM1NTc0NTc0NjgxNjA5NDU3NzI3RSs4NjcgSW5leGFjdCBSb3VuZGVkCitkdml4MzI4NCBkaXZpZGVpbnQgLTMyNTk1MzMzOTgyLjY3MDY4NjIyMTIwNDUxODA0MjI1IDY5MTMwLjA1MjIzMzY0OTgwODc1MDExMzE0MTUwMjQ2NUUtODYyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzI4NCBtdWx0aXBseSAtMzI1OTUzMzM5ODIuNjcwNjg2MjIxMjA0NTE4MDQyMjUgNjkxMzAuMDUyMjMzNjQ5ODA4NzUwMTEzMTQxNTAyNDY1RS04NjIgLT4gLTIuMjUzMzE3MTQwNzk1Mjg1MTg4NTQ0NjIxMzY5NzcxNUUtODQ3IEluZXhhY3QgUm91bmRlZAorcG93eDMyODQgcG93ZXIgLTMyNTk1MzMzOTgyLjY3MDY4NjIyMTIwNDUxODA0MjI1IDcgLT4gLTMuOTA5MjAxNDE0ODAzMTczOTY2NjUyNTYwNjA5MzMwNkUrNzMgSW5leGFjdCBSb3VuZGVkCityZW14MzI4NCByZW1haW5kZXIgLTMyNTk1MzMzOTgyLjY3MDY4NjIyMTIwNDUxODA0MjI1IDY5MTMwLjA1MjIzMzY0OTgwODc1MDExMzE0MTUwMjQ2NUUtODYyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI4NCBzdWJ0cmFjdCAtMzI1OTUzMzM5ODIuNjcwNjg2MjIxMjA0NTE4MDQyMjUgNjkxMzAuMDUyMjMzNjQ5ODA4NzUwMTEzMTQxNTAyNDY1RS04NjIgLT4gLTMyNTk1MzMzOTgyLjY3MDY4NjIyMTIwNDUxODA0MjI1MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjg1IGFkZCAtMTc1NDQxODkwMTcxNDUuNzEwMTE3NjMzMDIxODAwNDI2RS01MzcgMjkyMTc4MDAwLjA2NDUwODA0NjE4Mjk5NTIwMDk0ODQzIC0+IDI5MjE3ODAwMC4wNjQ1MDgwNDYxODI5OTUyMDA5NDg0MyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjg1IGNvbXBhcmUgLTE3NTQ0MTg5MDE3MTQ1LjcxMDExNzYzMzAyMTgwMDQyNkUtNTM3IDI5MjE3ODAwMC4wNjQ1MDgwNDYxODI5OTUyMDA5NDg0MyAtPiAtMQorZGl2eDMyODUgZGl2aWRlIC0xNzU0NDE4OTAxNzE0NS43MTAxMTc2MzMwMjE4MDA0MjZFLTUzNyAyOTIxNzgwMDAuMDY0NTA4MDQ2MTgyOTk1MjAwOTQ4NDMgLT4gLTYuMDA0NjIzNTU1OTM5MjcxNTMzNDY2ODI3NzAyNjg5NkUtNTMzIEluZXhhY3QgUm91bmRlZAorZHZpeDMyODUgZGl2aWRlaW50IC0xNzU0NDE4OTAxNzE0NS43MTAxMTc2MzMwMjE4MDA0MjZFLTUzNyAyOTIxNzgwMDAuMDY0NTA4MDQ2MTgyOTk1MjAwOTQ4NDMgLT4gLTAKK211bHgzMjg1IG11bHRpcGx5IC0xNzU0NDE4OTAxNzE0NS43MTAxMTc2MzMwMjE4MDA0MjZFLTUzNyAyOTIxNzgwMDAuMDY0NTA4MDQ2MTgyOTk1MjAwOTQ4NDMgLT4gLTUuMTI2MDI2MDU5NzgzMzQwNjQ2MTExMDEzNjk1MjQ1NkUtNTE2IEluZXhhY3QgUm91bmRlZAorcG93eDMyODUgcG93ZXIgLTE3NTQ0MTg5MDE3MTQ1LjcxMDExNzYzMzAyMTgwMDQyNkUtNTM3IDI5MjE3ODAwMCAtPiAwRS0xMDAzMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzI4NSByZW1haW5kZXIgLTE3NTQ0MTg5MDE3MTQ1LjcxMDExNzYzMzAyMTgwMDQyNkUtNTM3IDI5MjE3ODAwMC4wNjQ1MDgwNDYxODI5OTUyMDA5NDg0MyAtPiAtMS43NTQ0MTg5MDE3MTQ1NzEwMTE3NjMzMDIxODAwNDI2RS01MjQKK3N1YngzMjg1IHN1YnRyYWN0IC0xNzU0NDE4OTAxNzE0NS43MTAxMTc2MzMwMjE4MDA0MjZFLTUzNyAyOTIxNzgwMDAuMDY0NTA4MDQ2MTgyOTk1MjAwOTQ4NDMgLT4gLTI5MjE3ODAwMC4wNjQ1MDgwNDYxODI5OTUyMDA5NDg0MyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjg2IGFkZCAtNTA2NjUwLjk5Mzk1NjQ5OTA3MTM5MjA0MDUyNDQxNjMwIDExLjAxODQyNzUwMjAzMTY1MDE0ODk2MjA2NzM2NzE1OCAtPiAtNTA2NjM5Ljk3NTUyODk5NzAzOTc0MTg5MTU2MjM0ODkzIEluZXhhY3QgUm91bmRlZAorY29teDMyODYgY29tcGFyZSAtNTA2NjUwLjk5Mzk1NjQ5OTA3MTM5MjA0MDUyNDQxNjMwIDExLjAxODQyNzUwMjAzMTY1MDE0ODk2MjA2NzM2NzE1OCAtPiAtMQorZGl2eDMyODYgZGl2aWRlIC01MDY2NTAuOTkzOTU2NDk5MDcxMzkyMDQwNTI0NDE2MzAgMTEuMDE4NDI3NTAyMDMxNjUwMTQ4OTYyMDY3MzY3MTU4IC0+IC00NTk4Mi4xNTA3MDczNTYzMjkwMjc2OTg3MTcxODkxMDQgSW5leGFjdCBSb3VuZGVkCitkdml4MzI4NiBkaXZpZGVpbnQgLTUwNjY1MC45OTM5NTY0OTkwNzEzOTIwNDA1MjQ0MTYzMCAxMS4wMTg0Mjc1MDIwMzE2NTAxNDg5NjIwNjczNjcxNTggLT4gLTQ1OTgyCittdWx4MzI4NiBtdWx0aXBseSAtNTA2NjUwLjk5Mzk1NjQ5OTA3MTM5MjA0MDUyNDQxNjMwIDExLjAxODQyNzUwMjAzMTY1MDE0ODk2MjA2NzM2NzE1OCAtPiAtNTU4MjQ5Ny4yNDU3NDE5NjA3MzkyOTQwMjM0MjcxMjIyIEluZXhhY3QgUm91bmRlZAorcG93eDMyODYgcG93ZXIgLTUwNjY1MC45OTM5NTY0OTkwNzEzOTIwNDA1MjQ0MTYzMCAxMSAtPiAtNS42NDY3NDEyNjc4ODA5ODg1MzMzMzEzODE4MDc4ODI5RSs2MiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjg2IHJlbWFpbmRlciAtNTA2NjUwLjk5Mzk1NjQ5OTA3MTM5MjA0MDUyNDQxNjMwIDExLjAxODQyNzUwMjAzMTY1MDE0ODk2MjA2NzM2NzE1OCAtPiAtMS42NjA1NTgwNzk3MzQyNDI0NjY3NDI3Mzk2NDA4NDQKK3N1YngzMjg2IHN1YnRyYWN0IC01MDY2NTAuOTkzOTU2NDk5MDcxMzkyMDQwNTI0NDE2MzAgMTEuMDE4NDI3NTAyMDMxNjUwMTQ4OTYyMDY3MzY3MTU4IC0+IC01MDY2NjIuMDEyMzg0MDAxMTAzMDQyMTg5NDg2NDgzNjcgSW5leGFjdCBSb3VuZGVkCithZGR4MzI4NyBhZGQgNDg0NjgzNTE1OS41OTIyMzcyMzA3NjU2MDAwNzY5Mzk1RS0yNDEgLTg0LjAwMTg5MzA0MDg2NTg2NDU5MDEyMjMzMDgwMDc2OCAtPiAtODQuMDAxODkzMDQwODY1ODY0NTkwMTIyMzMwODAwNzY4IEluZXhhY3QgUm91bmRlZAorY29teDMyODcgY29tcGFyZSA0ODQ2ODM1MTU5LjU5MjIzNzIzMDc2NTYwMDA3NjkzOTVFLTI0MSAtODQuMDAxODkzMDQwODY1ODY0NTkwMTIyMzMwODAwNzY4IC0+IDEKK2RpdngzMjg3IGRpdmlkZSA0ODQ2ODM1MTU5LjU5MjIzNzIzMDc2NTYwMDA3NjkzOTVFLTI0MSAtODQuMDAxODkzMDQwODY1ODY0NTkwMTIyMzMwODAwNzY4IC0+IC01Ljc2OTkxMTgyNDc2NjAzNTc4MTQ2NDE4MTMyNjA1MjRFLTIzNCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjg3IGRpdmlkZWludCA0ODQ2ODM1MTU5LjU5MjIzNzIzMDc2NTYwMDA3NjkzOTVFLTI0MSAtODQuMDAxODkzMDQwODY1ODY0NTkwMTIyMzMwODAwNzY4IC0+IC0wCittdWx4MzI4NyBtdWx0aXBseSA0ODQ2ODM1MTU5LjU5MjIzNzIzMDc2NTYwMDA3NjkzOTVFLTI0MSAtODQuMDAxODkzMDQwODY1ODY0NTkwMTIyMzMwODAwNzY4IC0+IC00LjA3MTQzMzI4NjYyNzc1MTQ0ODExOTI4NTY5MjU3NzVFLTIzMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjg3IHBvd2VyIDQ4NDY4MzUxNTkuNTkyMjM3MjMwNzY1NjAwMDc2OTM5NUUtMjQxIC04NCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjg3IHJlbWFpbmRlciA0ODQ2ODM1MTU5LjU5MjIzNzIzMDc2NTYwMDA3NjkzOTVFLTI0MSAtODQuMDAxODkzMDQwODY1ODY0NTkwMTIyMzMwODAwNzY4IC0+IDQuODQ2ODM1MTU5NTkyMjM3MjMwNzY1NjAwMDc2OTM5NUUtMjMyCitzdWJ4MzI4NyBzdWJ0cmFjdCA0ODQ2ODM1MTU5LjU5MjIzNzIzMDc2NTYwMDA3NjkzOTVFLTI0MSAtODQuMDAxODkzMDQwODY1ODY0NTkwMTIyMzMwODAwNzY4IC0+IDg0LjAwMTg5MzA0MDg2NTg2NDU5MDEyMjMzMDgwMDc2OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjg4IGFkZCAtMzUuMDI5MzExMDEzODIyMjU5MzU4MTE2NTU2MTY0OTA4IC0zOTk0MzA4ODc4LjE5OTQ2NDUzMTM0MTQ1MzQyMDkxMjcgLT4gLTM5OTQzMDg5MTMuMjI4Nzc1NTQ1MTYzNzEyNzc5MDI5MyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjg4IGNvbXBhcmUgLTM1LjAyOTMxMTAxMzgyMjI1OTM1ODExNjU1NjE2NDkwOCAtMzk5NDMwODg3OC4xOTk0NjQ1MzEzNDE0NTM0MjA5MTI3IC0+IDEKK2RpdngzMjg4IGRpdmlkZSAtMzUuMDI5MzExMDEzODIyMjU5MzU4MTE2NTU2MTY0OTA4IC0zOTk0MzA4ODc4LjE5OTQ2NDUzMTM0MTQ1MzQyMDkxMjcgLT4gOC43Njk4MDUyNjA5MzIzMDA0NTQzNTM4MTYzMDYxNzc0RS05IEluZXhhY3QgUm91bmRlZAorZHZpeDMyODggZGl2aWRlaW50IC0zNS4wMjkzMTEwMTM4MjIyNTkzNTgxMTY1NTYxNjQ5MDggLTM5OTQzMDg4NzguMTk5NDY0NTMxMzQxNDUzNDIwOTEyNyAtPiAwCittdWx4MzI4OCBtdWx0aXBseSAtMzUuMDI5MzExMDEzODIyMjU5MzU4MTE2NTU2MTY0OTA4IC0zOTk0MzA4ODc4LjE5OTQ2NDUzMTM0MTQ1MzQyMDkxMjcgLT4gMTM5OTE3ODg3OTc5LjcyMDUzNjM3MjcyOTYxMTIwNjM5IEluZXhhY3QgUm91bmRlZAorcG93eDMyODggcG93ZXIgLTM1LjAyOTMxMTAxMzgyMjI1OTM1ODExNjU1NjE2NDkwOCAtNCAtPiA2LjY0MTYxMzgwNDA1MjIxMjQ2OTM0OTUxNzgyMTgwOTZFLTcgSW5leGFjdCBSb3VuZGVkCityZW14MzI4OCByZW1haW5kZXIgLTM1LjAyOTMxMTAxMzgyMjI1OTM1ODExNjU1NjE2NDkwOCAtMzk5NDMwODg3OC4xOTk0NjQ1MzEzNDE0NTM0MjA5MTI3IC0+IC0zNS4wMjkzMTEwMTM4MjIyNTkzNTgxMTY1NTYxNjQ5MDgKK3N1YngzMjg4IHN1YnRyYWN0IC0zNS4wMjkzMTEwMTM4MjIyNTkzNTgxMTY1NTYxNjQ5MDggLTM5OTQzMDg4NzguMTk5NDY0NTMxMzQxNDUzNDIwOTEyNyAtPiAzOTk0MzA4ODQzLjE3MDE1MzUxNzUxOTE5NDA2Mjc5NjEgSW5leGFjdCBSb3VuZGVkCithZGR4MzI4OSBhZGQgNzYwNjY2Mzc1MC42NzM1MjY1MjMzMDQ0NDIwODg3MDE4RSsxNjYgLTU0OTE4MTQ2MzkuNDQ4NDU2NTQxODI4NDY4NjEyNzU1MkUrMzY1IC0+IC01LjQ5MTgxNDYzOTQ0ODQ1NjU0MTgyODQ2ODYxMjc1NTJFKzM3NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjg5IGNvbXBhcmUgNzYwNjY2Mzc1MC42NzM1MjY1MjMzMDQ0NDIwODg3MDE4RSsxNjYgLTU0OTE4MTQ2MzkuNDQ4NDU2NTQxODI4NDY4NjEyNzU1MkUrMzY1IC0+IDEKK2RpdngzMjg5IGRpdmlkZSA3NjA2NjYzNzUwLjY3MzUyNjUyMzMwNDQ0MjA4ODcwMThFKzE2NiAtNTQ5MTgxNDYzOS40NDg0NTY1NDE4Mjg0Njg2MTI3NTUyRSszNjUgLT4gLTEuMzg1MDkxMTMxMDg2OTQ4Nzg5NTk0NzczMzA5MDIwNEUtMTk5IEluZXhhY3QgUm91bmRlZAorZHZpeDMyODkgZGl2aWRlaW50IDc2MDY2NjM3NTAuNjczNTI2NTIzMzA0NDQyMDg4NzAxOEUrMTY2IC01NDkxODE0NjM5LjQ0ODQ1NjU0MTgyODQ2ODYxMjc1NTJFKzM2NSAtPiAtMAorbXVseDMyODkgbXVsdGlwbHkgNzYwNjY2Mzc1MC42NzM1MjY1MjMzMDQ0NDIwODg3MDE4RSsxNjYgLTU0OTE4MTQ2MzkuNDQ4NDU2NTQxODI4NDY4NjEyNzU1MkUrMzY1IC0+IC00LjE3NzQzODczNDMzMTA3NzcxOTA5MTcxMjgwMDY1ODlFKzU1MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjg5IHBvd2VyIDc2MDY2NjM3NTAuNjczNTI2NTIzMzA0NDQyMDg4NzAxOEUrMTY2IC01IC0+IDMuOTI2NzEwNjk3ODg4NzM0NjM3Mzk1NzMxNDgxODE3OEUtODgwIEluZXhhY3QgUm91bmRlZAorcmVteDMyODkgcmVtYWluZGVyIDc2MDY2NjM3NTAuNjczNTI2NTIzMzA0NDQyMDg4NzAxOEUrMTY2IC01NDkxODE0NjM5LjQ0ODQ1NjU0MTgyODQ2ODYxMjc1NTJFKzM2NSAtPiA3LjYwNjY2Mzc1MDY3MzUyNjUyMzMwNDQ0MjA4ODcwMThFKzE3NQorc3VieDMyODkgc3VidHJhY3QgNzYwNjY2Mzc1MC42NzM1MjY1MjMzMDQ0NDIwODg3MDE4RSsxNjYgLTU0OTE4MTQ2MzkuNDQ4NDU2NTQxODI4NDY4NjEyNzU1MkUrMzY1IC0+IDUuNDkxODE0NjM5NDQ4NDU2NTQxODI4NDY4NjEyNzU1MkUrMzc0IEluZXhhY3QgUm91bmRlZAorYWRkeDMyOTAgYWRkIC0yNTY3Ny44Mjk2NjA4MzE3NDEyNzQyMDczMjY2OTcwNTJFLTE2MyAtOTQxMzUzOTUxMjQxOTMwNDg1NjAxNzI3MDUwODIwMjlFLTg2MiAtPiAtMi41Njc3ODI5NjYwODMxNzQxMjc0MjA3MzI2Njk3MDUyRS0xNTkgSW5leGFjdCBSb3VuZGVkCitjb214MzI5MCBjb21wYXJlIC0yNTY3Ny44Mjk2NjA4MzE3NDEyNzQyMDczMjY2OTcwNTJFLTE2MyAtOTQxMzUzOTUxMjQxOTMwNDg1NjAxNzI3MDUwODIwMjlFLTg2MiAtPiAtMQorZGl2eDMyOTAgZGl2aWRlIC0yNTY3Ny44Mjk2NjA4MzE3NDEyNzQyMDczMjY2OTcwNTJFLTE2MyAtOTQxMzUzOTUxMjQxOTMwNDg1NjAxNzI3MDUwODIwMjlFLTg2MiAtPiAyLjcyNzc1NTAxOTk4NTMwMDk3MDg0OTMxNjcyOTk4MzhFKzY3MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjkwIGRpdmlkZWludCAtMjU2NzcuODI5NjYwODMxNzQxMjc0MjA3MzI2Njk3MDUyRS0xNjMgLTk0MTM1Mzk1MTI0MTkzMDQ4NTYwMTcyNzA1MDgyMDI5RS04NjIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjkwIG11bHRpcGx5IC0yNTY3Ny44Mjk2NjA4MzE3NDEyNzQyMDczMjY2OTcwNTJFLTE2MyAtOTQxMzUzOTUxMjQxOTMwNDg1NjAxNzI3MDUwODIwMjlFLTg2MiAtPiAyLjQxNzE5MjY0MTA1NDExOTkzOTM3MjgyOTQ3NjI1NTlFLTk4OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjkwIHBvd2VyIC0yNTY3Ny44Mjk2NjA4MzE3NDEyNzQyMDczMjY2OTcwNTJFLTE2MyAtOSAtPiAtMi4wNjA1MTIxNDIwNjgyNzY0ODk3ODY3MjIxOTkyMTc0RSsxNDI3IEluZXhhY3QgUm91bmRlZAorcmVteDMyOTAgcmVtYWluZGVyIC0yNTY3Ny44Mjk2NjA4MzE3NDEyNzQyMDczMjY2OTcwNTJFLTE2MyAtOTQxMzUzOTUxMjQxOTMwNDg1NjAxNzI3MDUwODIwMjlFLTg2MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMyOTAgc3VidHJhY3QgLTI1Njc3LjgyOTY2MDgzMTc0MTI3NDIwNzMyNjY5NzA1MkUtMTYzIC05NDEzNTM5NTEyNDE5MzA0ODU2MDE3MjcwNTA4MjAyOUUtODYyIC0+IC0yLjU2Nzc4Mjk2NjA4MzE3NDEyNzQyMDczMjY2OTcwNTJFLTE1OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjkxIGFkZCA5NzI3MTU3NjA5NC40NTY0MDY3Mjk2NzE3MjkyMjQ4MjcgLTEuNTQxMjU2MzgzNzU0MDgxMDc5MzY5Nzk1NTA2MzI5NUUrNTU0IC0+IC0xLjU0MTI1NjM4Mzc1NDA4MTA3OTM2OTc5NTUwNjMyOTVFKzU1NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjkxIGNvbXBhcmUgOTcyNzE1NzYwOTQuNDU2NDA2NzI5NjcxNzI5MjI0ODI3IC0xLjU0MTI1NjM4Mzc1NDA4MTA3OTM2OTc5NTUwNjMyOTVFKzU1NCAtPiAxCitkaXZ4MzI5MSBkaXZpZGUgOTcyNzE1NzYwOTQuNDU2NDA2NzI5NjcxNzI5MjI0ODI3IC0xLjU0MTI1NjM4Mzc1NDA4MTA3OTM2OTc5NTUwNjMyOTVFKzU1NCAtPiAtNi4zMTExODcyMzEzODkwNjQ2MTQ0NDczNjUyNjQ1MDMwRS01NDQgSW5leGFjdCBSb3VuZGVkCitkdml4MzI5MSBkaXZpZGVpbnQgOTcyNzE1NzYwOTQuNDU2NDA2NzI5NjcxNzI5MjI0ODI3IC0xLjU0MTI1NjM4Mzc1NDA4MTA3OTM2OTc5NTUwNjMyOTVFKzU1NCAtPiAtMAorbXVseDMyOTEgbXVsdGlwbHkgOTcyNzE1NzYwOTQuNDU2NDA2NzI5NjcxNzI5MjI0ODI3IC0xLjU0MTI1NjM4Mzc1NDA4MTA3OTM2OTc5NTUwNjMyOTVFKzU1NCAtPiAtMS40OTkyMDQzNzYxMzQwMTgwMjg4MDY1OTU5MzAwMDkwRSs1NjUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI5MSBwb3dlciA5NzI3MTU3NjA5NC40NTY0MDY3Mjk2NzE3MjkyMjQ4MjcgLTIgLT4gMS4wNTY4ODU4NzY1ODUyMDczMTgxMzUyMzA5NDAxMzQzRS0yMiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjkxIHJlbWFpbmRlciA5NzI3MTU3NjA5NC40NTY0MDY3Mjk2NzE3MjkyMjQ4MjcgLTEuNTQxMjU2MzgzNzU0MDgxMDc5MzY5Nzk1NTA2MzI5NUUrNTU0IC0+IDk3MjcxNTc2MDk0LjQ1NjQwNjcyOTY3MTcyOTIyNDgyNworc3VieDMyOTEgc3VidHJhY3QgOTcyNzE1NzYwOTQuNDU2NDA2NzI5NjcxNzI5MjI0ODI3IC0xLjU0MTI1NjM4Mzc1NDA4MTA3OTM2OTc5NTUwNjMyOTVFKzU1NCAtPiAxLjU0MTI1NjM4Mzc1NDA4MTA3OTM2OTc5NTUwNjMyOTVFKzU1NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjkyIGFkZCA0MTEzOTc4OTg5NC40MDE4MjY5MTU3NTczOTE3Nzc1NjMgLTEuODcyOTkyMDMwNTY3MTA1Nzk1NzE1NjE1OTY5MDgyM0UtMDIwIC0+IDQxMTM5Nzg5ODk0LjQwMTgyNjkxNTc1NzM5MTc3NzU0NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjkyIGNvbXBhcmUgNDExMzk3ODk4OTQuNDAxODI2OTE1NzU3MzkxNzc3NTYzIC0xLjg3Mjk5MjAzMDU2NzEwNTc5NTcxNTYxNTk2OTA4MjNFLTAyMCAtPiAxCitkaXZ4MzI5MiBkaXZpZGUgNDExMzk3ODk4OTQuNDAxODI2OTE1NzU3MzkxNzc3NTYzIC0xLjg3Mjk5MjAzMDU2NzEwNTc5NTcxNTYxNTk2OTA4MjNFLTAyMCAtPiAtMjE5NjQ3NDM2OTUxMTYyNTM4OTI4OTUwNjQ2MTU1MS4wIEluZXhhY3QgUm91bmRlZAorZHZpeDMyOTIgZGl2aWRlaW50IDQxMTM5Nzg5ODk0LjQwMTgyNjkxNTc1NzM5MTc3NzU2MyAtMS44NzI5OTIwMzA1NjcxMDU3OTU3MTU2MTU5NjkwODIzRS0wMjAgLT4gLTIxOTY0NzQzNjk1MTE2MjUzODkyODk1MDY0NjE1NTEKK211bHgzMjkyIG11bHRpcGx5IDQxMTM5Nzg5ODk0LjQwMTgyNjkxNTc1NzM5MTc3NzU2MyAtMS44NzI5OTIwMzA1NjcxMDU3OTU3MTU2MTU5NjkwODIzRS0wMjAgLT4gLTcuNzA1NDQ5ODYxMTQxOTc3NjcxNDI5MTA4MDkyODYwMUUtMTAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI5MiBwb3dlciA0MTEzOTc4OTg5NC40MDE4MjY5MTU3NTczOTE3Nzc1NjMgLTIgLT4gNS45MDg0ODEyNDQyNzQxMDkxNTUwODkxNDUxMDY5OTE5RS0yMiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjkyIHJlbWFpbmRlciA0MTEzOTc4OTg5NC40MDE4MjY5MTU3NTczOTE3Nzc1NjMgLTEuODcyOTkyMDMwNTY3MTA1Nzk1NzE1NjE1OTY5MDgyM0UtMDIwIC0+IDYuOTgxNDEwMjI2NDA1NDQwMTg5MzUxMDI5NTM1MjdFLTIyCitzdWJ4MzI5MiBzdWJ0cmFjdCA0MTEzOTc4OTg5NC40MDE4MjY5MTU3NTczOTE3Nzc1NjMgLTEuODcyOTkyMDMwNTY3MTA1Nzk1NzE1NjE1OTY5MDgyM0UtMDIwIC0+IDQxMTM5Nzg5ODk0LjQwMTgyNjkxNTc1NzM5MTc3NzU4MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjkzIGFkZCAtODMzMTA4MzEyODcyNDEuNzc3NTk4Njk2ODUzNDk4MTQ5IC01NDc5OTgyNTAzMy43OTcxMDA0MTgxNjI5ODUxMDM1MTlFLTMzMCAtPiAtODMzMTA4MzEyODcyNDEuNzc3NTk4Njk2ODUzNDk4MTQ5IEluZXhhY3QgUm91bmRlZAorY29teDMyOTMgY29tcGFyZSAtODMzMTA4MzEyODcyNDEuNzc3NTk4Njk2ODUzNDk4MTQ5IC01NDc5OTgyNTAzMy43OTcxMDA0MTgxNjI5ODUxMDM1MTlFLTMzMCAtPiAtMQorZGl2eDMyOTMgZGl2aWRlIC04MzMxMDgzMTI4NzI0MS43Nzc1OTg2OTY4NTM0OTgxNDkgLTU0Nzk5ODI1MDMzLjc5NzEwMDQxODE2Mjk4NTEwMzUxOUUtMzMwIC0+IDEuNTIwMjc1NDk3ODg0NTQzODYzNjYwNTE3MDg1NzQ3OEUrMzMzIEluZXhhY3QgUm91bmRlZAorZHZpeDMyOTMgZGl2aWRlaW50IC04MzMxMDgzMTI4NzI0MS43Nzc1OTg2OTY4NTM0OTgxNDkgLTU0Nzk5ODI1MDMzLjc5NzEwMDQxODE2Mjk4NTEwMzUxOUUtMzMwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzI5MyBtdWx0aXBseSAtODMzMTA4MzEyODcyNDEuNzc3NTk4Njk2ODUzNDk4MTQ5IC01NDc5OTgyNTAzMy43OTcxMDA0MTgxNjI5ODUxMDM1MTlFLTMzMCAtPiA0LjU2NTQxODk3Nzk2MTAzODY3NjAzMzA1Mjc4Mzk1ODhFLTMwNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjkzIHBvd2VyIC04MzMxMDgzMTI4NzI0MS43Nzc1OTg2OTY4NTM0OTgxNDkgLTUgLT4gLTIuNDkxNjgyMjYwNjY4MjYyNDgyNzkwMDU4MTcyODM4N0UtNzAgSW5leGFjdCBSb3VuZGVkCityZW14MzI5MyByZW1haW5kZXIgLTgzMzEwODMxMjg3MjQxLjc3NzU5ODY5Njg1MzQ5ODE0OSAtNTQ3OTk4MjUwMzMuNzk3MTAwNDE4MTYyOTg1MTAzNTE5RS0zMzAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjkzIHN1YnRyYWN0IC04MzMxMDgzMTI4NzI0MS43Nzc1OTg2OTY4NTM0OTgxNDkgLTU0Nzk5ODI1MDMzLjc5NzEwMDQxODE2Mjk4NTEwMzUxOUUtMzMwIC0+IC04MzMxMDgzMTI4NzI0MS43Nzc1OTg2OTY4NTM0OTgxNDkgSW5leGFjdCBSb3VuZGVkCithZGR4MzI5NCBhZGQgNDUwNjY1MzQ2MS40NDE0OTc0MjMzNjc4MzMxNzcxMTY5IC03NDk1NTQ3MC45Nzc2NTMwMzgwMTAwMzE0NTcxODE5NTdFLTg4NyAtPiA0NTA2NjUzNDYxLjQ0MTQ5NzQyMzM2NzgzMzE3NzExNjkgSW5leGFjdCBSb3VuZGVkCitjb214MzI5NCBjb21wYXJlIDQ1MDY2NTM0NjEuNDQxNDk3NDIzMzY3ODMzMTc3MTE2OSAtNzQ5NTU0NzAuOTc3NjUzMDM4MDEwMDMxNDU3MTgxOTU3RS04ODcgLT4gMQorZGl2eDMyOTQgZGl2aWRlIDQ1MDY2NTM0NjEuNDQxNDk3NDIzMzY3ODMzMTc3MTE2OSAtNzQ5NTU0NzAuOTc3NjUzMDM4MDEwMDMxNDU3MTgxOTU3RS04ODcgLT4gLTYuMDEyNDQwOTkwMTc4MTQ5MDA1NDQzODIyMDA0ODYyOUUrODg4IEluZXhhY3QgUm91bmRlZAorZHZpeDMyOTQgZGl2aWRlaW50IDQ1MDY2NTM0NjEuNDQxNDk3NDIzMzY3ODMzMTc3MTE2OSAtNzQ5NTU0NzAuOTc3NjUzMDM4MDEwMDMxNDU3MTgxOTU3RS04ODcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjk0IG11bHRpcGx5IDQ1MDY2NTM0NjEuNDQxNDk3NDIzMzY3ODMzMTc3MTE2OSAtNzQ5NTU0NzAuOTc3NjUzMDM4MDEwMDMxNDU3MTgxOTU3RS04ODcgLT4gLTMuMzc3OTgzMzI3MzU0MTc3NjQ3MDkwMjkwMzUxMjk0OUUtODcwIEluZXhhY3QgUm91bmRlZAorcG93eDMyOTQgcG93ZXIgNDUwNjY1MzQ2MS40NDE0OTc0MjMzNjc4MzMxNzcxMTY5IC03IC0+IDIuNjQ4NjI3MjkxMTQ4NjQ2MTEwMjczNTQxMjQ2MzE4OUUtNjggSW5leGFjdCBSb3VuZGVkCityZW14MzI5NCByZW1haW5kZXIgNDUwNjY1MzQ2MS40NDE0OTc0MjMzNjc4MzMxNzcxMTY5IC03NDk1NTQ3MC45Nzc2NTMwMzgwMTAwMzE0NTcxODE5NTdFLTg4NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMyOTQgc3VidHJhY3QgNDUwNjY1MzQ2MS40NDE0OTc0MjMzNjc4MzMxNzcxMTY5IC03NDk1NTQ3MC45Nzc2NTMwMzgwMTAwMzE0NTcxODE5NTdFLTg4NyAtPiA0NTA2NjUzNDYxLjQ0MTQ5NzQyMzM2NzgzMzE3NzExNjkgSW5leGFjdCBSb3VuZGVkCithZGR4MzI5NSBhZGQgMjM3NzcuODU3OTUxMTE0OTY3Njg0NzY3NjA5NDAxNjI2IDcyMDc2MC4wMzg5NzE0NDE1NzAxMjMwMTM4NTIyNzUyOCAtPiA3NDQ1MzcuODk2OTIyNTU2NTM3ODA3NzgxNDYxNjc2OTEgSW5leGFjdCBSb3VuZGVkCitjb214MzI5NSBjb21wYXJlIDIzNzc3Ljg1Nzk1MTExNDk2NzY4NDc2NzYwOTQwMTYyNiA3MjA3NjAuMDM4OTcxNDQxNTcwMTIzMDEzODUyMjc1MjggLT4gLTEKK2RpdngzMjk1IGRpdmlkZSAyMzc3Ny44NTc5NTExMTQ5Njc2ODQ3Njc2MDk0MDE2MjYgNzIwNzYwLjAzODk3MTQ0MTU3MDEyMzAxMzg1MjI3NTI4IC0+IDAuMDMyOTg5OTc4MTY5NDk4ODA4Mjc1MzA4MDM5MDM0Nzk1IEluZXhhY3QgUm91bmRlZAorZHZpeDMyOTUgZGl2aWRlaW50IDIzNzc3Ljg1Nzk1MTExNDk2NzY4NDc2NzYwOTQwMTYyNiA3MjA3NjAuMDM4OTcxNDQxNTcwMTIzMDEzODUyMjc1MjggLT4gMAorbXVseDMyOTUgbXVsdGlwbHkgMjM3NzcuODU3OTUxMTE0OTY3Njg0NzY3NjA5NDAxNjI2IDcyMDc2MC4wMzg5NzE0NDE1NzAxMjMwMTM4NTIyNzUyOCAtPiAxNzEzODEyOTgyMy41MDMwMjU5MTMwMzQ5ODc1MzcwOTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI5NSBwb3dlciAyMzc3Ny44NTc5NTExMTQ5Njc2ODQ3Njc2MDk0MDE2MjYgNzIwNzYwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMyOTUgcmVtYWluZGVyIDIzNzc3Ljg1Nzk1MTExNDk2NzY4NDc2NzYwOTQwMTYyNiA3MjA3NjAuMDM4OTcxNDQxNTcwMTIzMDEzODUyMjc1MjggLT4gMjM3NzcuODU3OTUxMTE0OTY3Njg0NzY3NjA5NDAxNjI2CitzdWJ4MzI5NSBzdWJ0cmFjdCAyMzc3Ny44NTc5NTExMTQ5Njc2ODQ3Njc2MDk0MDE2MjYgNzIwNzYwLjAzODk3MTQ0MTU3MDEyMzAxMzg1MjI3NTI4IC0+IC02OTY5ODIuMTgxMDIwMzI2NjAyNDM4MjQ2MjQyODczNjUgSW5leGFjdCBSb3VuZGVkCithZGR4MzI5NiBhZGQgLTIxMzM3ODUzMzIzOTgwODU4MDU1MjkyNDY5NjExOTQ4IDYwODAyNzI4NDAuMzA3MTQ5MDQ0NTI1Njc4Njk4MjEwMEUrNTMyIC0+IDYuMDgwMjcyODQwMzA3MTQ5MDQ0NTI1Njc4Njk4MjEwMEUrNTQxIEluZXhhY3QgUm91bmRlZAorY29teDMyOTYgY29tcGFyZSAtMjEzMzc4NTMzMjM5ODA4NTgwNTUyOTI0Njk2MTE5NDggNjA4MDI3Mjg0MC4zMDcxNDkwNDQ1MjU2Nzg2OTgyMTAwRSs1MzIgLT4gLTEKK2RpdngzMjk2IGRpdmlkZSAtMjEzMzc4NTMzMjM5ODA4NTgwNTUyOTI0Njk2MTE5NDggNjA4MDI3Mjg0MC4zMDcxNDkwNDQ1MjU2Nzg2OTgyMTAwRSs1MzIgLT4gLTMuNTA5MzU3ODY2NzI3NDAyMDEyMzc4ODUxNDA2OTg4NUUtNTExIEluZXhhY3QgUm91bmRlZAorZHZpeDMyOTYgZGl2aWRlaW50IC0yMTMzNzg1MzMyMzk4MDg1ODA1NTI5MjQ2OTYxMTk0OCA2MDgwMjcyODQwLjMwNzE0OTA0NDUyNTY3ODY5ODIxMDBFKzUzMiAtPiAtMAorbXVseDMyOTYgbXVsdGlwbHkgLTIxMzM3ODUzMzIzOTgwODU4MDU1MjkyNDY5NjExOTQ4IDYwODAyNzI4NDAuMzA3MTQ5MDQ0NTI1Njc4Njk4MjEwMEUrNTMyIC0+IC0xLjI5NzM5OTcwMDM2MjU4NDMzMTc0MTc5ODE5MDIxOThFKzU3MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjk2IHBvd2VyIC0yMTMzNzg1MzMyMzk4MDg1ODA1NTI5MjQ2OTYxMTk0OCA2IC0+IDkuNDM4NTI5ODMyMTMwNDk3MDMwNjE4MDY1MjA5Nzg3NEUrMTg3IEluZXhhY3QgUm91bmRlZAorcmVteDMyOTYgcmVtYWluZGVyIC0yMTMzNzg1MzMyMzk4MDg1ODA1NTI5MjQ2OTYxMTk0OCA2MDgwMjcyODQwLjMwNzE0OTA0NDUyNTY3ODY5ODIxMDBFKzUzMiAtPiAtMjEzMzc4NTMzMjM5ODA4NTgwNTUyOTI0Njk2MTE5NDgKK3N1YngzMjk2IHN1YnRyYWN0IC0yMTMzNzg1MzMyMzk4MDg1ODA1NTI5MjQ2OTYxMTk0OCA2MDgwMjcyODQwLjMwNzE0OTA0NDUyNTY3ODY5ODIxMDBFKzUzMiAtPiAtNi4wODAyNzI4NDAzMDcxNDkwNDQ1MjU2Nzg2OTgyMTAwRSs1NDEgSW5leGFjdCBSb3VuZGVkCithZGR4MzI5NyBhZGQgLTgxODQwOTIzOC4wNDIzODkzNDM5ODQ5NzQzODU2OTQ3IDc1Ni4zOTE1NjI2NTk3Mjc1MzI1OTI2NzA2OTE1ODc2MCAtPiAtODE4NDA4NDgxLjY1MDgyNjY4NDI1NzQ0MTc5MzAyNDAxIEluZXhhY3QgUm91bmRlZAorY29teDMyOTcgY29tcGFyZSAtODE4NDA5MjM4LjA0MjM4OTM0Mzk4NDk3NDM4NTY5NDcgNzU2LjM5MTU2MjY1OTcyNzUzMjU5MjY3MDY5MTU4NzYwIC0+IC0xCitkaXZ4MzI5NyBkaXZpZGUgLTgxODQwOTIzOC4wNDIzODkzNDM5ODQ5NzQzODU2OTQ3IDc1Ni4zOTE1NjI2NTk3Mjc1MzI1OTI2NzA2OTE1ODc2MCAtPiAtMTA4MTk5MS40OTU0NjkwNzUyNjc2NDk0MTI5NDkzNDAzIEluZXhhY3QgUm91bmRlZAorZHZpeDMyOTcgZGl2aWRlaW50IC04MTg0MDkyMzguMDQyMzg5MzQzOTg0OTc0Mzg1Njk0NyA3NTYuMzkxNTYyNjU5NzI3NTMyNTkyNjcwNjkxNTg3NjAgLT4gLTEwODE5OTEKK211bHgzMjk3IG11bHRpcGx5IC04MTg0MDkyMzguMDQyMzg5MzQzOTg0OTc0Mzg1Njk0NyA3NTYuMzkxNTYyNjU5NzI3NTMyNTkyNjcwNjkxNTg3NjAgLT4gLTYxOTAzNzg0MjQ1OC4wMzk4MDUzNzM3MDMyODI1MjgxNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjk3IHBvd2VyIC04MTg0MDkyMzguMDQyMzg5MzQzOTg0OTc0Mzg1Njk0NyA3NTYgLT4gMS42MDU4ODgzOTQ2MzczMjMyNzUwOTk1NTQzNTczNDYxRSs2NzM4IEluZXhhY3QgUm91bmRlZAorcmVteDMyOTcgcmVtYWluZGVyIC04MTg0MDkyMzguMDQyMzg5MzQzOTg0OTc0Mzg1Njk0NyA3NTYuMzkxNTYyNjU5NzI3NTMyNTkyNjcwNjkxNTg3NjAgLT4gLTM3NC43Njg2MjgwOTEyNjc0OTgwMzE0MzMxNDEwODg0MAorc3VieDMyOTcgc3VidHJhY3QgLTgxODQwOTIzOC4wNDIzODkzNDM5ODQ5NzQzODU2OTQ3IDc1Ni4zOTE1NjI2NTk3Mjc1MzI1OTI2NzA2OTE1ODc2MCAtPiAtODE4NDA5OTk0LjQzMzk1MjAwMzcxMjUwNjk3ODM2NTM5IEluZXhhY3QgUm91bmRlZAorYWRkeDMyOTggYWRkIDQ3NTY3MzgwMzg0OTQzLjg3MDEzNjAwMjg2MTU1MDQ2IDY1LjA4NDcwOTM3NDkwODI3NTgyNjk0MjA3NjQ4MDMyNiAtPiA0NzU2NzM4MDM4NTAwOC45NTQ4NDUzNzc3Njk4MjYyODcgSW5leGFjdCBSb3VuZGVkCitjb214MzI5OCBjb21wYXJlIDQ3NTY3MzgwMzg0OTQzLjg3MDEzNjAwMjg2MTU1MDQ2IDY1LjA4NDcwOTM3NDkwODI3NTgyNjk0MjA3NjQ4MDMyNiAtPiAxCitkaXZ4MzI5OCBkaXZpZGUgNDc1NjczODAzODQ5NDMuODcwMTM2MDAyODYxNTUwNDYgNjUuMDg0NzA5Mzc0OTA4Mjc1ODI2OTQyMDc2NDgwMzI2IC0+IDczMDg1MzM4ODQ4MC44NjI0NzY5MDQ3NDMwMzQ5Mzk3MiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjk4IGRpdmlkZWludCA0NzU2NzM4MDM4NDk0My44NzAxMzYwMDI4NjE1NTA0NiA2NS4wODQ3MDkzNzQ5MDgyNzU4MjY5NDIwNzY0ODAzMjYgLT4gNzMwODUzMzg4NDgwCittdWx4MzI5OCBtdWx0aXBseSA0NzU2NzM4MDM4NDk0My44NzAxMzYwMDI4NjE1NTA0NiA2NS4wODQ3MDkzNzQ5MDgyNzU4MjY5NDIwNzY0ODAzMjYgLT4gMzA5NTkwOTEyODA3OTc4NC4zMzQ4NTkxNDcyOTk5NDY4IEluZXhhY3QgUm91bmRlZAorcG93eDMyOTggcG93ZXIgNDc1NjczODAzODQ5NDMuODcwMTM2MDAyODYxNTUwNDYgNjUgLT4gMS4wNTk0OTgyODc2NzYzMjE0MzAxMDQyNDM3NDgyNjM0RSs4ODkgSW5leGFjdCBSb3VuZGVkCityZW14MzI5OCByZW1haW5kZXIgNDc1NjczODAzODQ5NDMuODcwMTM2MDAyODYxNTUwNDYgNjUuMDg0NzA5Mzc0OTA4Mjc1ODI2OTQyMDc2NDgwMzI2IC0+IDU2LjEzNDA1ODY4Nzc3MDg3ODEyNjQzMDg0NDk1NTUyMAorc3VieDMyOTggc3VidHJhY3QgNDc1NjczODAzODQ5NDMuODcwMTM2MDAyODYxNTUwNDYgNjUuMDg0NzA5Mzc0OTA4Mjc1ODI2OTQyMDc2NDgwMzI2IC0+IDQ3NTY3MzgwMzg0ODc4Ljc4NTQyNjYyNzk1MzI3NDYzMyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjk5IGFkZCAtMjk2NjE1NTQ0LjA1ODk3OTg0NTQ1MTI3MTE1MjkwMjUxIC01NDE2MTE1LjQzMTUwNTM1MzYwMTQwMTY0NTA5NzMyNjQgLT4gLTMwMjAzMTY1OS40OTA0ODUxOTkwNTI2NzI3OTc5OTk4NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjk5IGNvbXBhcmUgLTI5NjYxNTU0NC4wNTg5Nzk4NDU0NTEyNzExNTI5MDI1MSAtNTQxNjExNS40MzE1MDUzNTM2MDE0MDE2NDUwOTczMjY0IC0+IC0xCitkaXZ4MzI5OSBkaXZpZGUgLTI5NjYxNTU0NC4wNTg5Nzk4NDU0NTEyNzExNTI5MDI1MSAtNTQxNjExNS40MzE1MDUzNTM2MDE0MDE2NDUwOTczMjY0IC0+IDU0Ljc2NTM2NjAyODQ5NjY2NDUzMDY4ODI1OTI3MjU5MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjk5IGRpdmlkZWludCAtMjk2NjE1NTQ0LjA1ODk3OTg0NTQ1MTI3MTE1MjkwMjUxIC01NDE2MTE1LjQzMTUwNTM1MzYwMTQwMTY0NTA5NzMyNjQgLT4gNTQKK211bHgzMjk5IG11bHRpcGx5IC0yOTY2MTU1NDQuMDU4OTc5ODQ1NDUxMjcxMTUyOTAyNTEgLTU0MTYxMTUuNDMxNTA1MzUzNjAxNDAxNjQ1MDk3MzI2NCAtPiAxNjA2NTA0MDI1NDAyMTk2Ljg0ODQ4ODUzODY1MDE0NzggSW5leGFjdCBSb3VuZGVkCitwb3d4MzI5OSBwb3dlciAtMjk2NjE1NTQ0LjA1ODk3OTg0NTQ1MTI3MTE1MjkwMjUxIC01NDE2MTE1IC0+IC0wRS0xMDAzMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzI5OSByZW1haW5kZXIgLTI5NjYxNTU0NC4wNTg5Nzk4NDU0NTEyNzExNTI5MDI1MSAtNTQxNjExNS40MzE1MDUzNTM2MDE0MDE2NDUwOTczMjY0IC0+IC00MTQ1MzEwLjc1NzY5MDc1MDk3NTU4MjMxNzY0Njg4NDQKK3N1YngzMjk5IHN1YnRyYWN0IC0yOTY2MTU1NDQuMDU4OTc5ODQ1NDUxMjcxMTUyOTAyNTEgLTU0MTYxMTUuNDMxNTA1MzUzNjAxNDAxNjQ1MDk3MzI2NCAtPiAtMjkxMTk5NDI4LjYyNzQ3NDQ5MTg0OTg2OTUwNzgwNTE4IEluZXhhY3QgUm91bmRlZAorYWRkeDMzMDAgYWRkIDYxMzkxNzA1OTE0LjA0NjcwNzE4MDY1MjE4NTI0NzU4NEUrNzM5IC02NzU5ODIwODc3MjEuOTE4NTY0NTYxMjUyNDIyOTczNDYgLT4gNi4xMzkxNzA1OTE0MDQ2NzA3MTgwNjUyMTg1MjQ3NTg0RSs3NDkgSW5leGFjdCBSb3VuZGVkCitjb214MzMwMCBjb21wYXJlIDYxMzkxNzA1OTE0LjA0NjcwNzE4MDY1MjE4NTI0NzU4NEUrNzM5IC02NzU5ODIwODc3MjEuOTE4NTY0NTYxMjUyNDIyOTczNDYgLT4gMQorZGl2eDMzMDAgZGl2aWRlIDYxMzkxNzA1OTE0LjA0NjcwNzE4MDY1MjE4NTI0NzU4NEUrNzM5IC02NzU5ODIwODc3MjEuOTE4NTY0NTYxMjUyNDIyOTczNDYgLT4gLTkuMDgxODUzOTQ2ODkwNjI0ODU5MzY5OTcwMDA0MDA2OEUrNzM3IEluZXhhY3QgUm91bmRlZAorZHZpeDMzMDAgZGl2aWRlaW50IDYxMzkxNzA1OTE0LjA0NjcwNzE4MDY1MjE4NTI0NzU4NEUrNzM5IC02NzU5ODIwODc3MjEuOTE4NTY0NTYxMjUyNDIyOTczNDYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMzAwIG11bHRpcGx5IDYxMzkxNzA1OTE0LjA0NjcwNzE4MDY1MjE4NTI0NzU4NEUrNzM5IC02NzU5ODIwODc3MjEuOTE4NTY0NTYxMjUyNDIyOTczNDYgLT4gLTQuMTQ5OTY5MzUzMjU4NzM0Nzk0NDg5MDMwMDE3NjI5MEUrNzYxIEluZXhhY3QgUm91bmRlZAorcG93eDMzMDAgcG93ZXIgNjEzOTE3MDU5MTQuMDQ2NzA3MTgwNjUyMTg1MjQ3NTg0RSs3MzkgLTcgLT4gMy4wNDI1MTA1MjkxMjEwOTQ3NDczNDIwOTk5ODkwMTI0RS01MjQ5IEluZXhhY3QgUm91bmRlZAorcmVteDMzMDAgcmVtYWluZGVyIDYxMzkxNzA1OTE0LjA0NjcwNzE4MDY1MjE4NTI0NzU4NEUrNzM5IC02NzU5ODIwODc3MjEuOTE4NTY0NTYxMjUyNDIyOTczNDYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMzAwIHN1YnRyYWN0IDYxMzkxNzA1OTE0LjA0NjcwNzE4MDY1MjE4NTI0NzU4NEUrNzM5IC02NzU5ODIwODc3MjEuOTE4NTY0NTYxMjUyNDIyOTczNDYgLT4gNi4xMzkxNzA1OTE0MDQ2NzA3MTgwNjUyMTg1MjQ3NTg0RSs3NDkgSW5leGFjdCBSb3VuZGVkCisKKy0tIHJhbmRvbWx5IGdlbmVyYXRlZCB0ZXN0Y2FzZXMgWzI2IFNlcCAyMDAxXQorcHJlY2lzaW9uOiAzMworcm91bmRpbmc6IGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTk5CisKK2FkZHgzNDAxIGFkZCAwNDIuNjY4MDU2ODMwNDg1NTcxNDI4ODc3MjEyOTQ0NDE4IC0wMTM2NDExMjM3NDYzOS40OTQxMTI0MDE2NDU1MzIxMDcxIC0+IC0xMzY0MTEyMzc0NTk2LjgyNjA1NTU3MTE1OTk2MDY3ODIyIEluZXhhY3QgUm91bmRlZAorY29teDM0MDEgY29tcGFyZSAwNDIuNjY4MDU2ODMwNDg1NTcxNDI4ODc3MjEyOTQ0NDE4IC0wMTM2NDExMjM3NDYzOS40OTQxMTI0MDE2NDU1MzIxMDcxIC0+IDEKK2RpdngzNDAxIGRpdmlkZSAwNDIuNjY4MDU2ODMwNDg1NTcxNDI4ODc3MjEyOTQ0NDE4IC0wMTM2NDExMjM3NDYzOS40OTQxMTI0MDE2NDU1MzIxMDcxIC0+IC0zLjEyNzg5ODk2MzczMTc2OTYzMTYwODExMTUwNTkzODY3RS0xMSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDAxIGRpdmlkZWludCAwNDIuNjY4MDU2ODMwNDg1NTcxNDI4ODc3MjEyOTQ0NDE4IC0wMTM2NDExMjM3NDYzOS40OTQxMTI0MDE2NDU1MzIxMDcxIC0+IC0wCittdWx4MzQwMSBtdWx0aXBseSAwNDIuNjY4MDU2ODMwNDg1NTcxNDI4ODc3MjEyOTQ0NDE4IC0wMTM2NDExMjM3NDYzOS40OTQxMTI0MDE2NDU1MzIxMDcxIC0+IC01ODIwNDAyNDMyNDI4Ni41NTk1NDUzMDY2MDY1MjM0OTIzIEluZXhhY3QgUm91bmRlZAorcG93eDM0MDEgcG93ZXIgMDQyLjY2ODA1NjgzMDQ4NTU3MTQyODg3NzIxMjk0NDQxOCAtMSAtPiAwLjAyMzQzNjczNjM4NTA4Njk3NDQ1MjM0MTcyMjcxNDg5MDkgSW5leGFjdCBSb3VuZGVkCityZW14MzQwMSByZW1haW5kZXIgMDQyLjY2ODA1NjgzMDQ4NTU3MTQyODg3NzIxMjk0NDQxOCAtMDEzNjQxMTIzNzQ2MzkuNDk0MTEyNDAxNjQ1NTMyMTA3MSAtPiA0Mi42NjgwNTY4MzA0ODU1NzE0Mjg4NzcyMTI5NDQ0MTgKK3N1YngzNDAxIHN1YnRyYWN0IDA0Mi42NjgwNTY4MzA0ODU1NzE0Mjg4NzcyMTI5NDQ0MTggLTAxMzY0MTEyMzc0NjM5LjQ5NDExMjQwMTY0NTUzMjEwNzEgLT4gMTM2NDExMjM3NDY4Mi4xNjIxNjkyMzIxMzExMDM1MzU5OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDAyIGFkZCAtMzI3LjE3OTQyNjM0MTY1MzI1NjM2MzUzMTgwOTIyNzM0NEUrNDUzIDc1OTA2NzQ1Ny4xMDc1MTg2NjM0NDQ4OTkzNTY3NjA3OTMgLT4gLTMuMjcxNzk0MjYzNDE2NTMyNTYzNjM1MzE4MDkyMjczNDRFKzQ1NSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDAyIGNvbXBhcmUgLTMyNy4xNzk0MjYzNDE2NTMyNTYzNjM1MzE4MDkyMjczNDRFKzQ1MyA3NTkwNjc0NTcuMTA3NTE4NjYzNDQ0ODk5MzU2NzYwNzkzIC0+IC0xCitkaXZ4MzQwMiBkaXZpZGUgLTMyNy4xNzk0MjYzNDE2NTMyNTYzNjM1MzE4MDkyMjczNDRFKzQ1MyA3NTkwNjc0NTcuMTA3NTE4NjYzNDQ0ODk5MzU2NzYwNzkzIC0+IC00LjMxMDI4MTI5Njg0ODAzMDgzMjU1NzA0NjgwNjExNTg5RSs0NDYgSW5leGFjdCBSb3VuZGVkCitkdml4MzQwMiBkaXZpZGVpbnQgLTMyNy4xNzk0MjYzNDE2NTMyNTYzNjM1MzE4MDkyMjczNDRFKzQ1MyA3NTkwNjc0NTcuMTA3NTE4NjYzNDQ0ODk5MzU2NzYwNzkzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQwMiBtdWx0aXBseSAtMzI3LjE3OTQyNjM0MTY1MzI1NjM2MzUzMTgwOTIyNzM0NEUrNDUzIDc1OTA2NzQ1Ny4xMDc1MTg2NjM0NDQ4OTkzNTY3NjA3OTMgLT4gLTIuNDgzNTEyNTUxNzEwNTU0NDUxMTA1NTg2MTM2MjczNzlFKzQ2NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDAyIHBvd2VyIC0zMjcuMTc5NDI2MzQxNjUzMjU2MzYzNTMxODA5MjI3MzQ0RSs0NTMgNzU5MDY3NDU3IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDAyIHJlbWFpbmRlciAtMzI3LjE3OTQyNjM0MTY1MzI1NjM2MzUzMTgwOTIyNzM0NEUrNDUzIDc1OTA2NzQ1Ny4xMDc1MTg2NjM0NDQ4OTkzNTY3NjA3OTMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDAyIHN1YnRyYWN0IC0zMjcuMTc5NDI2MzQxNjUzMjU2MzYzNTMxODA5MjI3MzQ0RSs0NTMgNzU5MDY3NDU3LjEwNzUxODY2MzQ0NDg5OTM1Njc2MDc5MyAtPiAtMy4yNzE3OTQyNjM0MTY1MzI1NjM2MzUzMTgwOTIyNzM0NEUrNDU1IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MDMgYWRkIDgxNzIxLjU4MDMwOTYxODU0MjI3ODc3MDI1Mzg0OTM0NzEgOTAwMDk5NDczLjI0NTgwOTYyODA3Njc5MDc1NzIxNzMyOCAtPiA5MDAxODExOTQuODI2MTE5MjQ2NjE5MDY5NTI3NDcxMTc3IEluZXhhY3QgUm91bmRlZAorY29teDM0MDMgY29tcGFyZSA4MTcyMS41ODAzMDk2MTg1NDIyNzg3NzAyNTM4NDkzNDcxIDkwMDA5OTQ3My4yNDU4MDk2MjgwNzY3OTA3NTcyMTczMjggLT4gLTEKK2RpdngzNDAzIGRpdmlkZSA4MTcyMS41ODAzMDk2MTg1NDIyNzg3NzAyNTM4NDkzNDcxIDkwMDA5OTQ3My4yNDU4MDk2MjgwNzY3OTA3NTcyMTczMjggLT4gMC4wMDAwOTA3OTE3MjEwNjkzNjc5MjIwNjEwNTExMzE5ODEyODI2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MDMgZGl2aWRlaW50IDgxNzIxLjU4MDMwOTYxODU0MjI3ODc3MDI1Mzg0OTM0NzEgOTAwMDk5NDczLjI0NTgwOTYyODA3Njc5MDc1NzIxNzMyOCAtPiAwCittdWx4MzQwMyBtdWx0aXBseSA4MTcyMS41ODAzMDk2MTg1NDIyNzg3NzAyNTM4NDkzNDcxIDkwMDA5OTQ3My4yNDU4MDk2MjgwNzY3OTA3NTcyMTczMjggLT4gNzM1NTc1NTEzODk1MDIuNzc3OTk3OTA0MjQ1MzEwMjkyNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDAzIHBvd2VyIDgxNzIxLjU4MDMwOTYxODU0MjI3ODc3MDI1Mzg0OTM0NzEgOTAwMDk5NDczIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDM0MDMgcmVtYWluZGVyIDgxNzIxLjU4MDMwOTYxODU0MjI3ODc3MDI1Mzg0OTM0NzEgOTAwMDk5NDczLjI0NTgwOTYyODA3Njc5MDc1NzIxNzMyOCAtPiA4MTcyMS41ODAzMDk2MTg1NDIyNzg3NzAyNTM4NDkzNDcxCitzdWJ4MzQwMyBzdWJ0cmFjdCA4MTcyMS41ODAzMDk2MTg1NDIyNzg3NzAyNTM4NDkzNDcxIDkwMDA5OTQ3My4yNDU4MDk2MjgwNzY3OTA3NTcyMTczMjggLT4gLTkwMDAxNzc1MS42NjU1MDAwMDk1MzQ1MTE5ODY5NjM0NzkgSW5leGFjdCBSb3VuZGVkCithZGR4MzQwNCBhZGQgMzk5MS41NjczNDYzNTE4MzQwMzgxNDYzNjM1NDM5MjE2M0UtODA3IDcyLjMyMzk4MjIyNTU4NzEzMDU3MzEzMTQ1NjUwNjkxMzIgLT4gNzIuMzIzOTgyMjI1NTg3MTMwNTczMTMxNDU2NTA2OTEzMiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDA0IGNvbXBhcmUgMzk5MS41NjczNDYzNTE4MzQwMzgxNDYzNjM1NDM5MjE2M0UtODA3IDcyLjMyMzk4MjIyNTU4NzEzMDU3MzEzMTQ1NjUwNjkxMzIgLT4gLTEKK2RpdngzNDA0IGRpdmlkZSAzOTkxLjU2NzM0NjM1MTgzNDAzODE0NjM2MzU0MzkyMTYzRS04MDcgNzIuMzIzOTgyMjI1NTg3MTMwNTczMTMxNDU2NTA2OTEzMiAtPiA1LjUxOTAwOTM1Njk1MzkwNjY0OTg0NTk4MjQ4MTE1MjkwRS04MDYgSW5leGFjdCBSb3VuZGVkCitkdml4MzQwNCBkaXZpZGVpbnQgMzk5MS41NjczNDYzNTE4MzQwMzgxNDYzNjM1NDM5MjE2M0UtODA3IDcyLjMyMzk4MjIyNTU4NzEzMDU3MzEzMTQ1NjUwNjkxMzIgLT4gMAorbXVseDM0MDQgbXVsdGlwbHkgMzk5MS41NjczNDYzNTE4MzQwMzgxNDYzNjM1NDM5MjE2M0UtODA3IDcyLjMyMzk4MjIyNTU4NzEzMDU3MzEzMTQ1NjUwNjkxMzIgLT4gMi44ODY4NjA0NTgwOTc4NDAzNDc5NDgwMzkyODE3Nzg1NEUtODAyIEluZXhhY3QgUm91bmRlZAorcG93eDM0MDQgcG93ZXIgMzk5MS41NjczNDYzNTE4MzQwMzgxNDYzNjM1NDM5MjE2M0UtODA3IDcyIC0+IDBFLTEwMDMxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzNDA0IHJlbWFpbmRlciAzOTkxLjU2NzM0NjM1MTgzNDAzODE0NjM2MzU0MzkyMTYzRS04MDcgNzIuMzIzOTgyMjI1NTg3MTMwNTczMTMxNDU2NTA2OTEzMiAtPiAzLjk5MTU2NzM0NjM1MTgzNDAzODE0NjM2MzU0MzkyMTYzRS04MDQKK3N1YngzNDA0IHN1YnRyYWN0IDM5OTEuNTY3MzQ2MzUxODM0MDM4MTQ2MzYzNTQzOTIxNjNFLTgwNyA3Mi4zMjM5ODIyMjU1ODcxMzA1NzMxMzE0NTY1MDY5MTMyIC0+IC03Mi4zMjM5ODIyMjU1ODcxMzA1NzMxMzE0NTY1MDY5MTMyIEluZXhhY3QgUm91bmRlZAorYWRkeDM0MDUgYWRkIC02Ni4zMzkzMzA4NTk1OTU3NzI2NDU2NDE2OTc5MTYzMzA2IDUuMDg0ODY1NzMwNTA0NTkyMTM4NjQ2ODQ1ODk2NjI1NTkgLT4gLTYxLjI1NDQ2NTEyOTA5MTE4MDUwNjk5NDg1MjAxOTcwNTAgSW5leGFjdCBSb3VuZGVkCitjb214MzQwNSBjb21wYXJlIC02Ni4zMzkzMzA4NTk1OTU3NzI2NDU2NDE2OTc5MTYzMzA2IDUuMDg0ODY1NzMwNTA0NTkyMTM4NjQ2ODQ1ODk2NjI1NTkgLT4gLTEKK2RpdngzNDA1IGRpdmlkZSAtNjYuMzM5MzMwODU5NTk1NzcyNjQ1NjQxNjk3OTE2MzMwNiA1LjA4NDg2NTczMDUwNDU5MjEzODY0Njg0NTg5NjYyNTU5IC0+IC0xMy4wNDY0MjcyNTYwMDc5Mjc2Njk0NzQ5OTI0OTE1ODUwIEluZXhhY3QgUm91bmRlZAorZHZpeDM0MDUgZGl2aWRlaW50IC02Ni4zMzkzMzA4NTk1OTU3NzI2NDU2NDE2OTc5MTYzMzA2IDUuMDg0ODY1NzMwNTA0NTkyMTM4NjQ2ODQ1ODk2NjI1NTkgLT4gLTEzCittdWx4MzQwNSBtdWx0aXBseSAtNjYuMzM5MzMwODU5NTk1NzcyNjQ1NjQxNjk3OTE2MzMwNiA1LjA4NDg2NTczMDUwNDU5MjEzODY0Njg0NTg5NjYyNTU5IC0+IC0zMzcuMzI2NTkwMDcyNTY0MjkwODEzNTM5MDM2MjgwMjA1IEluZXhhY3QgUm91bmRlZAorcG93eDM0MDUgcG93ZXIgLTY2LjMzOTMzMDg1OTU5NTc3MjY0NTY0MTY5NzkxNjMzMDYgNSAtPiAtMTI4NDg1ODg4OC4yNzI4NTgyMjI1OTE4NDg5NjY2Nzk5MCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDA1IHJlbWFpbmRlciAtNjYuMzM5MzMwODU5NTk1NzcyNjQ1NjQxNjk3OTE2MzMwNiA1LjA4NDg2NTczMDUwNDU5MjEzODY0Njg0NTg5NjYyNTU5IC0+IC0wLjIzNjA3NjM2MzAzNjA3NDg0MzIzMjcwMTI2MDE5NzkzCitzdWJ4MzQwNSBzdWJ0cmFjdCAtNjYuMzM5MzMwODU5NTk1NzcyNjQ1NjQxNjk3OTE2MzMwNiA1LjA4NDg2NTczMDUwNDU5MjEzODY0Njg0NTg5NjYyNTU5IC0+IC03MS40MjQxOTY1OTAxMDAzNjQ3ODQyODg1NDM4MTI5NTYyIEluZXhhY3QgUm91bmRlZAorYWRkeDM0MDYgYWRkIC0zOTM2MDYuODczNzAzNTY3NzUzMjU1MDk3MDk1MjA4MTEyRSsxMTEgLTIxMjQzMzk1NTAuODY4OTEwOTMyMDA3NTgwOTU2NjA1NTcgLT4gLTMuOTM2MDY4NzM3MDM1Njc3NTMyNTUwOTcwOTUyMDgxMTJFKzExNiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDA2IGNvbXBhcmUgLTM5MzYwNi44NzM3MDM1Njc3NTMyNTUwOTcwOTUyMDgxMTJFKzExMSAtMjEyNDMzOTU1MC44Njg5MTA5MzIwMDc1ODA5NTY2MDU1NyAtPiAtMQorZGl2eDM0MDYgZGl2aWRlIC0zOTM2MDYuODczNzAzNTY3NzUzMjU1MDk3MDk1MjA4MTEyRSsxMTEgLTIxMjQzMzk1NTAuODY4OTEwOTMyMDA3NTgwOTU2NjA1NTcgLT4gMS44NTI4NDM1MDM5NjEzNzA3NTAxMDQyODczNjU2NDczN0UrMTA3IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MDYgZGl2aWRlaW50IC0zOTM2MDYuODczNzAzNTY3NzUzMjU1MDk3MDk1MjA4MTEyRSsxMTEgLTIxMjQzMzk1NTAuODY4OTEwOTMyMDA3NTgwOTU2NjA1NTcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDA2IG11bHRpcGx5IC0zOTM2MDYuODczNzAzNTY3NzUzMjU1MDk3MDk1MjA4MTEyRSsxMTEgLTIxMjQzMzk1NTAuODY4OTEwOTMyMDA3NTgwOTU2NjA1NTcgLT4gOC4zNjE1NDY0OTMwMjM1MzI2OTgxODgwMTI2MzI3NTk0MUUrMTI1IEluZXhhY3QgUm91bmRlZAorcG93eDM0MDYgcG93ZXIgLTM5MzYwNi44NzM3MDM1Njc3NTMyNTUwOTcwOTUyMDgxMTJFKzExMSAtMiAtPiA2LjQ1NDY3OTA0MTIzMTAzNTYwNTI4OTE5NzQ3Njg4NDQzRS0yMzQgSW5leGFjdCBSb3VuZGVkCityZW14MzQwNiByZW1haW5kZXIgLTM5MzYwNi44NzM3MDM1Njc3NTMyNTUwOTcwOTUyMDgxMTJFKzExMSAtMjEyNDMzOTU1MC44Njg5MTA5MzIwMDc1ODA5NTY2MDU1NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0MDYgc3VidHJhY3QgLTM5MzYwNi44NzM3MDM1Njc3NTMyNTUwOTcwOTUyMDgxMTJFKzExMSAtMjEyNDMzOTU1MC44Njg5MTA5MzIwMDc1ODA5NTY2MDU1NyAtPiAtMy45MzYwNjg3MzcwMzU2Nzc1MzI1NTA5NzA5NTIwODExMkUrMTE2IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MDcgYWRkIC0wMTkxMzM1OTguNjA5ODEyNTI0NjIyMTUwNDIxNTg0MzQ2IC04NTg0Mzk4NDYuNjI4MzY3NzM0NjQyNjIyOTIyMDMwMDUxIC0+IC04Nzc1NzM0NDUuMjM4MTgwMjU5MjY0NzczMzQzNjE0Mzk3Citjb214MzQwNyBjb21wYXJlIC0wMTkxMzM1OTguNjA5ODEyNTI0NjIyMTUwNDIxNTg0MzQ2IC04NTg0Mzk4NDYuNjI4MzY3NzM0NjQyNjIyOTIyMDMwMDUxIC0+IDEKK2RpdngzNDA3IGRpdmlkZSAtMDE5MTMzNTk4LjYwOTgxMjUyNDYyMjE1MDQyMTU4NDM0NiAtODU4NDM5ODQ2LjYyODM2NzczNDY0MjYyMjkyMjAzMDA1MSAtPiAwLjAyMjI4ODgwNTMwNzYzMTI1NjU3OTc0NjA2NTAzMTEwNzAgSW5leGFjdCBSb3VuZGVkCitkdml4MzQwNyBkaXZpZGVpbnQgLTAxOTEzMzU5OC42MDk4MTI1MjQ2MjIxNTA0MjE1ODQzNDYgLTg1ODQzOTg0Ni42MjgzNjc3MzQ2NDI2MjI5MjIwMzAwNTEgLT4gMAorbXVseDM0MDcgbXVsdGlwbHkgLTAxOTEzMzU5OC42MDk4MTI1MjQ2MjIxNTA0MjE1ODQzNDYgLTg1ODQzOTg0Ni42MjgzNjc3MzQ2NDI2MjI5MjIwMzAwNTEgLT4gMTY0MjUwNDM0NTYwNTYyMTMuNzM5NTE5MTUxNDAyOTI4OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDA3IHBvd2VyIC0wMTkxMzM1OTguNjA5ODEyNTI0NjIyMTUwNDIxNTg0MzQ2IC04NTg0Mzk4NDcgLT4gLTBFLTEwMDMxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzNDA3IHJlbWFpbmRlciAtMDE5MTMzNTk4LjYwOTgxMjUyNDYyMjE1MDQyMTU4NDM0NiAtODU4NDM5ODQ2LjYyODM2NzczNDY0MjYyMjkyMjAzMDA1MSAtPiAtMTkxMzM1OTguNjA5ODEyNTI0NjIyMTUwNDIxNTg0MzQ2CitzdWJ4MzQwNyBzdWJ0cmFjdCAtMDE5MTMzNTk4LjYwOTgxMjUyNDYyMjE1MDQyMTU4NDM0NiAtODU4NDM5ODQ2LjYyODM2NzczNDY0MjYyMjkyMjAzMDA1MSAtPiA4MzkzMDYyNDguMDE4NTU1MjEwMDIwNDcyNTAwNDQ1NzA1CithZGR4MzQwOCBhZGQgNDY1LjM1MTk4MjE1OTA0NjUyNTc2MjcxNTU0OTc2MTgxNCAyNDA0NDQuOTc1OTQ0NjY2OTI0NjU3NjI5MTcyODQ0NzgwIC0+IDI0MDkxMC4zMjc5MjY4MjU5NzExODMzOTE4ODgzOTQ1NDIgSW5leGFjdCBSb3VuZGVkCitjb214MzQwOCBjb21wYXJlIDQ2NS4zNTE5ODIxNTkwNDY1MjU3NjI3MTU1NDk3NjE4MTQgMjQwNDQ0Ljk3NTk0NDY2NjkyNDY1NzYyOTE3Mjg0NDc4MCAtPiAtMQorZGl2eDM0MDggZGl2aWRlIDQ2NS4zNTE5ODIxNTkwNDY1MjU3NjI3MTU1NDk3NjE4MTQgMjQwNDQ0Ljk3NTk0NDY2NjkyNDY1NzYyOTE3Mjg0NDc4MCAtPiAwLjAwMTkzNTM3ODI3MjQzMzI2MTIyNzgyOTc0MTMyODI5MDk1IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MDggZGl2aWRlaW50IDQ2NS4zNTE5ODIxNTkwNDY1MjU3NjI3MTU1NDk3NjE4MTQgMjQwNDQ0Ljk3NTk0NDY2NjkyNDY1NzYyOTE3Mjg0NDc4MCAtPiAwCittdWx4MzQwOCBtdWx0aXBseSA0NjUuMzUxOTgyMTU5MDQ2NTI1NzYyNzE1NTQ5NzYxODE0IDI0MDQ0NC45NzU5NDQ2NjY5MjQ2NTc2MjkxNzI4NDQ3ODAgLT4gMTExODkxNTQ2LjE1NjAzNTAxMzc4MDM3MTM5NTY2ODY3NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDA4IHBvd2VyIDQ2NS4zNTE5ODIxNTkwNDY1MjU3NjI3MTU1NDk3NjE4MTQgMjQwNDQ1IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDM0MDggcmVtYWluZGVyIDQ2NS4zNTE5ODIxNTkwNDY1MjU3NjI3MTU1NDk3NjE4MTQgMjQwNDQ0Ljk3NTk0NDY2NjkyNDY1NzYyOTE3Mjg0NDc4MCAtPiA0NjUuMzUxOTgyMTU5MDQ2NTI1NzYyNzE1NTQ5NzYxODE0CitzdWJ4MzQwOCBzdWJ0cmFjdCA0NjUuMzUxOTgyMTU5MDQ2NTI1NzYyNzE1NTQ5NzYxODE0IDI0MDQ0NC45NzU5NDQ2NjY5MjQ2NTc2MjkxNzI4NDQ3ODAgLT4gLTIzOTk3OS42MjM5NjI1MDc4NzgxMzE4NjY0NTcyOTUwMTggSW5leGFjdCBSb3VuZGVkCithZGR4MzQwOSBhZGQgMjgwNjY5NTUwMDQ3ODMuMTA3NjgyNDIyMjg3MzM4NDgyOCA1NzE2OTk5NjkuMjIwNzUzNTM1NzU4NTA0OTA3NTYxMDE2RS03MTggLT4gMjgwNjY5NTUwMDQ3ODMuMTA3NjgyNDIyMjg3MzM4NDgyOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDA5IGNvbXBhcmUgMjgwNjY5NTUwMDQ3ODMuMTA3NjgyNDIyMjg3MzM4NDgyOCA1NzE2OTk5NjkuMjIwNzUzNTM1NzU4NTA0OTA3NTYxMDE2RS03MTggLT4gMQorZGl2eDM0MDkgZGl2aWRlIDI4MDY2OTU1MDA0NzgzLjEwNzY4MjQyMjI4NzMzODQ4MjggNTcxNjk5OTY5LjIyMDc1MzUzNTc1ODUwNDkwNzU2MTAxNkUtNzE4IC0+IDQuOTA5Mzg1NDMyMTk0MzIzOTAwMTM2NTY5NjgxMjM4MTVFKzcyMiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDA5IGRpdmlkZWludCAyODA2Njk1NTAwNDc4My4xMDc2ODI0MjIyODczMzg0ODI4IDU3MTY5OTk2OS4yMjA3NTM1MzU3NTg1MDQ5MDc1NjEwMTZFLTcxOCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0MDkgbXVsdGlwbHkgMjgwNjY5NTUwMDQ3ODMuMTA3NjgyNDIyMjg3MzM4NDgyOCA1NzE2OTk5NjkuMjIwNzUzNTM1NzU4NTA0OTA3NTYxMDE2RS03MTggLT4gMS42MDQ1ODc3MzEyMzU0Nzc3MDY5MDQ1MjE5NTU2OTIyM0UtNjk2IEluZXhhY3QgUm91bmRlZAorcG93eDM0MDkgcG93ZXIgMjgwNjY5NTUwMDQ3ODMuMTA3NjgyNDIyMjg3MzM4NDgyOCA2IC0+IDQuODg4NDU2ODk5Mzg5NTE1ODMwMjAxNzEzMjU1NjgyMThFKzgwIEluZXhhY3QgUm91bmRlZAorcmVteDM0MDkgcmVtYWluZGVyIDI4MDY2OTU1MDA0NzgzLjEwNzY4MjQyMjI4NzMzODQ4MjggNTcxNjk5OTY5LjIyMDc1MzUzNTc1ODUwNDkwNzU2MTAxNkUtNzE4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQwOSBzdWJ0cmFjdCAyODA2Njk1NTAwNDc4My4xMDc2ODI0MjIyODczMzg0ODI4IDU3MTY5OTk2OS4yMjA3NTM1MzU3NTg1MDQ5MDc1NjEwMTZFLTcxOCAtPiAyODA2Njk1NTAwNDc4My4xMDc2ODI0MjIyODczMzg0ODI4IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MTAgYWRkIDI4Mjc1MjM2OTI3MzkyLjQ5NjA5MDI4MjQxMDUyNDYwNDcgMjgyMTIwMzguNDgyNTI0MzEyNzA5NjYxMzE1ODQxOTI3MEUrNDIyIC0+IDIuODIxMjAzODQ4MjUyNDMxMjcwOTY2MTMxNTg0MTkyNzBFKzQyOSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDEwIGNvbXBhcmUgMjgyNzUyMzY5MjczOTIuNDk2MDkwMjgyNDEwNTI0NjA0NyAyODIxMjAzOC40ODI1MjQzMTI3MDk2NjEzMTU4NDE5MjcwRSs0MjIgLT4gLTEKK2RpdngzNDEwIGRpdmlkZSAyODI3NTIzNjkyNzM5Mi40OTYwOTAyODI0MTA1MjQ2MDQ3IDI4MjEyMDM4LjQ4MjUyNDMxMjcwOTY2MTMxNTg0MTkyNzBFKzQyMiAtPiAxLjAwMjI0MDEyMzMwNDM1OTI3NDY3NTU5MjAzNjg4ODYxRS00MTYgSW5leGFjdCBSb3VuZGVkCitkdml4MzQxMCBkaXZpZGVpbnQgMjgyNzUyMzY5MjczOTIuNDk2MDkwMjgyNDEwNTI0NjA0NyAyODIxMjAzOC40ODI1MjQzMTI3MDk2NjEzMTU4NDE5MjcwRSs0MjIgLT4gMAorbXVseDM0MTAgbXVsdGlwbHkgMjgyNzUyMzY5MjczOTIuNDk2MDkwMjgyNDEwNTI0NjA0NyAyODIxMjAzOC40ODI1MjQzMTI3MDk2NjEzMTU4NDE5MjcwRSs0MjIgLT4gNy45NzcwMjA3MjI5ODA4OTYwNTcwNjc5ODc3MDAxMzU2MUUrNDQyIEluZXhhY3QgUm91bmRlZAorcG93eDM0MTAgcG93ZXIgMjgyNzUyMzY5MjczOTIuNDk2MDkwMjgyNDEwNTI0NjA0NyAzIC0+IDIuMjYwNTc0MTU1NDY2MjIxNjEzNDczMjIwNjEyODE1MTZFKzQwIEluZXhhY3QgUm91bmRlZAorcmVteDM0MTAgcmVtYWluZGVyIDI4Mjc1MjM2OTI3MzkyLjQ5NjA5MDI4MjQxMDUyNDYwNDcgMjgyMTIwMzguNDgyNTI0MzEyNzA5NjYxMzE1ODQxOTI3MEUrNDIyIC0+IDI4Mjc1MjM2OTI3MzkyLjQ5NjA5MDI4MjQxMDUyNDYwNDcKK3N1YngzNDEwIHN1YnRyYWN0IDI4Mjc1MjM2OTI3MzkyLjQ5NjA5MDI4MjQxMDUyNDYwNDcgMjgyMTIwMzguNDgyNTI0MzEyNzA5NjYxMzE1ODQxOTI3MEUrNDIyIC0+IC0yLjgyMTIwMzg0ODI1MjQzMTI3MDk2NjEzMTU4NDE5MjcwRSs0MjkgSW5leGFjdCBSb3VuZGVkCithZGR4MzQxMSBhZGQgMTE3OTEuODY0NDIxMTg3NDYzMDIzNDI3MTgwMTc4OTk5NiAtOC40NTQ1NzI3NTkzMDM2Mzg2MDk4MjI2MTM0MzE1OTc0MSAtPiAxMTc4My40MDk4NDg0MjgxNTkzODQ4MTczNTc1NjU1NjgwIEluZXhhY3QgUm91bmRlZAorY29teDM0MTEgY29tcGFyZSAxMTc5MS44NjQ0MjExODc0NjMwMjM0MjcxODAxNzg5OTk2IC04LjQ1NDU3Mjc1OTMwMzYzODYwOTgyMjYxMzQzMTU5NzQxIC0+IDEKK2RpdngzNDExIGRpdmlkZSAxMTc5MS44NjQ0MjExODc0NjMwMjM0MjcxODAxNzg5OTk2IC04LjQ1NDU3Mjc1OTMwMzYzODYwOTgyMjYxMzQzMTU5NzQxIC0+IC0xMzk0LjczMjE0NzU0ODM2NDE4NzMxMzM1NzYxODU4MTUxIEluZXhhY3QgUm91bmRlZAorZHZpeDM0MTEgZGl2aWRlaW50IDExNzkxLjg2NDQyMTE4NzQ2MzAyMzQyNzE4MDE3ODk5OTYgLTguNDU0NTcyNzU5MzAzNjM4NjA5ODIyNjEzNDMxNTk3NDEgLT4gLTEzOTQKK211bHgzNDExIG11bHRpcGx5IDExNzkxLjg2NDQyMTE4NzQ2MzAyMzQyNzE4MDE3ODk5OTYgLTguNDU0NTcyNzU5MzAzNjM4NjA5ODIyNjEzNDMxNTk3NDEgLT4gLTk5Njk1LjE3NTcxNjc3MzI5MjYzMDI1MzMxMzgxODY3MTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQxMSBwb3dlciAxMTc5MS44NjQ0MjExODc0NjMwMjM0MjcxODAxNzg5OTk2IC04IC0+IDIuNjc1MTAwOTkzMTg3MjM1MTY1NjUzMzI5MjgyNTM3MTFFLTMzIEluZXhhY3QgUm91bmRlZAorcmVteDM0MTEgcmVtYWluZGVyIDExNzkxLjg2NDQyMTE4NzQ2MzAyMzQyNzE4MDE3ODk5OTYgLTguNDU0NTcyNzU5MzAzNjM4NjA5ODIyNjEzNDMxNTk3NDEgLT4gNi4xODk5OTQ3MTgxOTA4MDEzMzQ0NTcwNTUzNTI4MTA0Ngorc3VieDM0MTEgc3VidHJhY3QgMTE3OTEuODY0NDIxMTg3NDYzMDIzNDI3MTgwMTc4OTk5NiAtOC40NTQ1NzI3NTkzMDM2Mzg2MDk4MjI2MTM0MzE1OTc0MSAtPiAxMTgwMC4zMTg5OTM5NDY3NjY2NjIwMzcwMDI3OTI0MzEyIEluZXhhY3QgUm91bmRlZAorYWRkeDM0MTIgYWRkIDQ0LjcwODUzNDA3Mzk1ODE2Njg5NzU1MDIzNDI3ODc1NzggLTkzMzcuMDU0MDgxMzMwMjM5MjA2NDA0ODU1NTY2NDc5MzcgLT4gLTkyOTIuMzQ1NTQ3MjU2MjgxMDM5NTA3MzA1MzMyMjAwNjEgSW5leGFjdCBSb3VuZGVkCitjb214MzQxMiBjb21wYXJlIDQ0LjcwODUzNDA3Mzk1ODE2Njg5NzU1MDIzNDI3ODc1NzggLTkzMzcuMDU0MDgxMzMwMjM5MjA2NDA0ODU1NTY2NDc5MzcgLT4gMQorZGl2eDM0MTIgZGl2aWRlIDQ0LjcwODUzNDA3Mzk1ODE2Njg5NzU1MDIzNDI3ODc1NzggLTkzMzcuMDU0MDgxMzMwMjM5MjA2NDA0ODU1NTY2NDc5MzcgLT4gLTAuMDA0Nzg4MjkxMjE5NTM1MTIyODE1MjcyNDI2MzE3NzU2MTMgSW5leGFjdCBSb3VuZGVkCitkdml4MzQxMiBkaXZpZGVpbnQgNDQuNzA4NTM0MDczOTU4MTY2ODk3NTUwMjM0Mjc4NzU3OCAtOTMzNy4wNTQwODEzMzAyMzkyMDY0MDQ4NTU1NjY0NzkzNyAtPiAtMAorbXVseDM0MTIgbXVsdGlwbHkgNDQuNzA4NTM0MDczOTU4MTY2ODk3NTUwMjM0Mjc4NzU3OCAtOTMzNy4wNTQwODEzMzAyMzkyMDY0MDQ4NTU1NjY0NzkzNyAtPiAtNDE3NDQ2LjAwMDU0NTU0MzE2ODg2NjE1ODkxMzA3NzQxOSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDEyIHBvd2VyIDQ0LjcwODUzNDA3Mzk1ODE2Njg5NzU1MDIzNDI3ODc1NzggLTkzMzcgLT4gMEUtMTAwMzEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDM0MTIgcmVtYWluZGVyIDQ0LjcwODUzNDA3Mzk1ODE2Njg5NzU1MDIzNDI3ODc1NzggLTkzMzcuMDU0MDgxMzMwMjM5MjA2NDA0ODU1NTY2NDc5MzcgLT4gNDQuNzA4NTM0MDczOTU4MTY2ODk3NTUwMjM0Mjc4NzU3OAorc3VieDM0MTIgc3VidHJhY3QgNDQuNzA4NTM0MDczOTU4MTY2ODk3NTUwMjM0Mjc4NzU3OCAtOTMzNy4wNTQwODEzMzAyMzkyMDY0MDQ4NTU1NjY0NzkzNyAtPiA5MzgxLjc2MjYxNTQwNDE5NzM3MzMwMjQwNTgwMDc1ODEzIEluZXhhY3QgUm91bmRlZAorYWRkeDM0MTMgYWRkIDkzMzU0NTI3NDI4ODA0LjU0NTgwNTMyOTU1ODE5NjU4NjdFKzU3NiAtODU2NTI1OTA5ODUyLjMxODc5MDMyMTMwMDk0MTYxNTMxNCAtPiA5LjMzNTQ1Mjc0Mjg4MDQ1NDU4MDUzMjk1NTgxOTY1ODY3RSs1ODkgSW5leGFjdCBSb3VuZGVkCitjb214MzQxMyBjb21wYXJlIDkzMzU0NTI3NDI4ODA0LjU0NTgwNTMyOTU1ODE5NjU4NjdFKzU3NiAtODU2NTI1OTA5ODUyLjMxODc5MDMyMTMwMDk0MTYxNTMxNCAtPiAxCitkaXZ4MzQxMyBkaXZpZGUgOTMzNTQ1Mjc0Mjg4MDQuNTQ1ODA1MzI5NTU4MTk2NTg2N0UrNTc2IC04NTY1MjU5MDk4NTIuMzE4NzkwMzIxMzAwOTQxNjE1MzE0IC0+IC0xLjA4OTkyMDY0NzUyNDg0NDAwMzUzMjMxMDU2MjcxNjE0RSs1NzggSW5leGFjdCBSb3VuZGVkCitkdml4MzQxMyBkaXZpZGVpbnQgOTMzNTQ1Mjc0Mjg4MDQuNTQ1ODA1MzI5NTU4MTk2NTg2N0UrNTc2IC04NTY1MjU5MDk4NTIuMzE4NzkwMzIxMzAwOTQxNjE1MzE0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQxMyBtdWx0aXBseSA5MzM1NDUyNzQyODgwNC41NDU4MDUzMjk1NTgxOTY1ODY3RSs1NzYgLTg1NjUyNTkwOTg1Mi4zMTg3OTAzMjEzMDA5NDE2MTUzMTQgLT4gLTcuOTk2MDU3MTU0NDc5MDA2NDI2ODM3NzQzNjA3MzEyNTRFKzYwMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDEzIHBvd2VyIDkzMzU0NTI3NDI4ODA0LjU0NTgwNTMyOTU1ODE5NjU4NjdFKzU3NiAtOSAtPiAxLjg1Njg3MDE1NjkxNzYzNDA2NDQ4MDA1NTIxMjIxNTE4RS01MzEwIEluZXhhY3QgUm91bmRlZAorcmVteDM0MTMgcmVtYWluZGVyIDkzMzU0NTI3NDI4ODA0LjU0NTgwNTMyOTU1ODE5NjU4NjdFKzU3NiAtODU2NTI1OTA5ODUyLjMxODc5MDMyMTMwMDk0MTYxNTMxNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0MTMgc3VidHJhY3QgOTMzNTQ1Mjc0Mjg4MDQuNTQ1ODA1MzI5NTU4MTk2NTg2N0UrNTc2IC04NTY1MjU5MDk4NTIuMzE4NzkwMzIxMzAwOTQxNjE1MzE0IC0+IDkuMzM1NDUyNzQyODgwNDU0NTgwNTMyOTU1ODE5NjU4NjdFKzU4OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDE0IGFkZCAtMzY3Mzk5NDE1Nzk4ODA0NTAzMTc3OTUwMDQwNDQzNDgyIC01NDg0NTY4My45NjkxNzc2Mzk3Mjg1NTA2NzEyODEyNzU0IC0+IC0zNjczOTk0MTU3OTg4MDQ1MDMxNzc5NTAwOTUyODkxNjYgSW5leGFjdCBSb3VuZGVkCitjb214MzQxNCBjb21wYXJlIC0zNjczOTk0MTU3OTg4MDQ1MDMxNzc5NTAwNDA0NDM0ODIgLTU0ODQ1NjgzLjk2OTE3NzYzOTcyODU1MDY3MTI4MTI3NTQgLT4gLTEKK2RpdngzNDE0IGRpdmlkZSAtMzY3Mzk5NDE1Nzk4ODA0NTAzMTc3OTUwMDQwNDQzNDgyIC01NDg0NTY4My45NjkxNzc2Mzk3Mjg1NTA2NzEyODEyNzU0IC0+IDY2OTg3ODQ0NjU5ODA1MjkxNDAwNzIxNzQuMzA0NzQ3NjkgSW5leGFjdCBSb3VuZGVkCitkdml4MzQxNCBkaXZpZGVpbnQgLTM2NzM5OTQxNTc5ODgwNDUwMzE3Nzk1MDA0MDQ0MzQ4MiAtNTQ4NDU2ODMuOTY5MTc3NjM5NzI4NTUwNjcxMjgxMjc1NCAtPiA2Njk4Nzg0NDY1OTgwNTI5MTQwMDcyMTc0CittdWx4MzQxNCBtdWx0aXBseSAtMzY3Mzk5NDE1Nzk4ODA0NTAzMTc3OTUwMDQwNDQzNDgyIC01NDg0NTY4My45NjkxNzc2Mzk3Mjg1NTA2NzEyODEyNzU0IC0+IDIuMDE1MDI3MjI0OTM2MTcyMjIwMTgwNDA3ODkyOTE0MTRFKzQwIEluZXhhY3QgUm91bmRlZAorcG93eDM0MTQgcG93ZXIgLTM2NzM5OTQxNTc5ODgwNDUwMzE3Nzk1MDA0MDQ0MzQ4MiAtNTQ4NDU2ODQgLT4gMEUtMTAwMzEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDM0MTQgcmVtYWluZGVyIC0zNjczOTk0MTU3OTg4MDQ1MDMxNzc5NTAwNDA0NDM0ODIgLTU0ODQ1NjgzLjk2OTE3NzYzOTcyODU1MDY3MTI4MTI3NTQgLT4gLTE2NzE0MDk1LjY1NDk2NTcxODkxNzc4NTc4OTIyOTI4MDQKK3N1YngzNDE0IHN1YnRyYWN0IC0zNjczOTk0MTU3OTg4MDQ1MDMxNzc5NTAwNDA0NDM0ODIgLTU0ODQ1NjgzLjk2OTE3NzYzOTcyODU1MDY3MTI4MTI3NTQgLT4gLTM2NzM5OTQxNTc5ODgwNDUwMzE3Nzk0OTk4NTU5Nzc5OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDE1IGFkZCAtMi44NzE1NTkxOTc4MTAyNDEwODUwMzY3MDE3NTQ0Mzc0MCA4OTUyOTczMDEzMC42NDI3ODgxMzMyNzc2Nzk3MTkzODA3IC0+IDg5NTI5NzMwMTI3Ljc3MTIyODkzNTQ2NzQzODYzNDM0NDAgSW5leGFjdCBSb3VuZGVkCitjb214MzQxNSBjb21wYXJlIC0yLjg3MTU1OTE5NzgxMDI0MTA4NTAzNjcwMTc1NDQzNzQwIDg5NTI5NzMwMTMwLjY0Mjc4ODEzMzI3NzY3OTcxOTM4MDcgLT4gLTEKK2RpdngzNDE1IGRpdmlkZSAtMi44NzE1NTkxOTc4MTAyNDEwODUwMzY3MDE3NTQ0Mzc0MCA4OTUyOTczMDEzMC42NDI3ODgxMzMyNzc2Nzk3MTkzODA3IC0+IC0zLjIwNzM4MDYwMjY0NDU0MDEzMTc0ODM1OTI4NzU0NDMwRS0xMSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDE1IGRpdmlkZWludCAtMi44NzE1NTkxOTc4MTAyNDEwODUwMzY3MDE3NTQ0Mzc0MCA4OTUyOTczMDEzMC42NDI3ODgxMzMyNzc2Nzk3MTkzODA3IC0+IC0wCittdWx4MzQxNSBtdWx0aXBseSAtMi44NzE1NTkxOTc4MTAyNDEwODUwMzY3MDE3NTQ0Mzc0MCA4OTUyOTczMDEzMC42NDI3ODgxMzMyNzc2Nzk3MTkzODA3IC0+IC0yNTcwODk5MjAwMzQuMTE1OTc1NDY5OTMxMDg1NTI3NjQyIEluZXhhY3QgUm91bmRlZAorcG93eDM0MTUgcG93ZXIgLTIuODcxNTU5MTk3ODEwMjQxMDg1MDM2NzAxNzU0NDM3NDAgOSAtPiAtMTMyNzUuNzc3NDY4MzI1MTM1NDUyNzMxMDgyMDg4NTczNyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDE1IHJlbWFpbmRlciAtMi44NzE1NTkxOTc4MTAyNDEwODUwMzY3MDE3NTQ0Mzc0MCA4OTUyOTczMDEzMC42NDI3ODgxMzMyNzc2Nzk3MTkzODA3IC0+IC0yLjg3MTU1OTE5NzgxMDI0MTA4NTAzNjcwMTc1NDQzNzQwCitzdWJ4MzQxNSBzdWJ0cmFjdCAtMi44NzE1NTkxOTc4MTAyNDEwODUwMzY3MDE3NTQ0Mzc0MCA4OTUyOTczMDEzMC42NDI3ODgxMzMyNzc2Nzk3MTkzODA3IC0+IC04OTUyOTczMDEzMy41MTQzNDczMzEwODc5MjA4MDQ0MTc0IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MTYgYWRkIC0wMTAuNjkzOTM0MzM4MTc5NDc5NjUyMTc4MDU3Mjc5MjA0RSsxODggMjY0ODQuODg4NzczMTk3MzE1Mzc0NTY2NjUxNDI2MDY4NCAtPiAtMS4wNjkzOTM0MzM4MTc5NDc5NjUyMTc4MDU3Mjc5MjA0MEUrMTg5IEluZXhhY3QgUm91bmRlZAorY29teDM0MTYgY29tcGFyZSAtMDEwLjY5MzkzNDMzODE3OTQ3OTY1MjE3ODA1NzI3OTIwNEUrMTg4IDI2NDg0Ljg4ODc3MzE5NzMxNTM3NDU2NjY1MTQyNjA2ODQgLT4gLTEKK2RpdngzNDE2IGRpdmlkZSAtMDEwLjY5MzkzNDMzODE3OTQ3OTY1MjE3ODA1NzI3OTIwNEUrMTg4IDI2NDg0Ljg4ODc3MzE5NzMxNTM3NDU2NjY1MTQyNjA2ODQgLT4gLTQuMDM3NzQ5Mzg1OTgyNTk1NDc1NzU3MDc1MDMwODc2MzhFKzE4NCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDE2IGRpdmlkZWludCAtMDEwLjY5MzkzNDMzODE3OTQ3OTY1MjE3ODA1NzI3OTIwNEUrMTg4IDI2NDg0Ljg4ODc3MzE5NzMxNTM3NDU2NjY1MTQyNjA2ODQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDE2IG11bHRpcGx5IC0wMTAuNjkzOTM0MzM4MTc5NDc5NjUyMTc4MDU3Mjc5MjA0RSsxODggMjY0ODQuODg4NzczMTk3MzE1Mzc0NTY2NjUxNDI2MDY4NCAtPiAtMi44MzIyNzY2MTQ5NDU1ODk2MzU1ODQ4MTYzMzg4MDY0N0UrMTkzIEluZXhhY3QgUm91bmRlZAorcG93eDM0MTYgcG93ZXIgLTAxMC42OTM5MzQzMzgxNzk0Nzk2NTIxNzgwNTcyNzkyMDRFKzE4OCAyNjQ4NSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzQxNiByZW1haW5kZXIgLTAxMC42OTM5MzQzMzgxNzk0Nzk2NTIxNzgwNTcyNzkyMDRFKzE4OCAyNjQ4NC44ODg3NzMxOTczMTUzNzQ1NjY2NTE0MjYwNjg0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQxNiBzdWJ0cmFjdCAtMDEwLjY5MzkzNDMzODE3OTQ3OTY1MjE3ODA1NzI3OTIwNEUrMTg4IDI2NDg0Ljg4ODc3MzE5NzMxNTM3NDU2NjY1MTQyNjA2ODQgLT4gLTEuMDY5MzkzNDMzODE3OTQ3OTY1MjE3ODA1NzI3OTIwNDBFKzE4OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDE3IGFkZCA2MTE2NTU1Njk1NjguODMyNjk4OTEyNzYyMDc1ODg5MTg2IDAxMDE4Mjc0MzIxOS40NzU4MzkwMzA1MDU5NjYwMTY5ODIgLT4gNjIxODM4MzEyNzg4LjMwODUzNzk0MzI2ODA0MTkwNjE2OAorY29teDM0MTcgY29tcGFyZSA2MTE2NTU1Njk1NjguODMyNjk4OTEyNzYyMDc1ODg5MTg2IDAxMDE4Mjc0MzIxOS40NzU4MzkwMzA1MDU5NjYwMTY5ODIgLT4gMQorZGl2eDM0MTcgZGl2aWRlIDYxMTY1NTU2OTU2OC44MzI2OTg5MTI3NjIwNzU4ODkxODYgMDEwMTgyNzQzMjE5LjQ3NTgzOTAzMDUwNTk2NjAxNjk4MiAtPiA2MC4wNjc4NTc1ODg2MDc0MzY3MDgxODM2NDM2ODEyOTU5IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MTcgZGl2aWRlaW50IDYxMTY1NTU2OTU2OC44MzI2OTg5MTI3NjIwNzU4ODkxODYgMDEwMTgyNzQzMjE5LjQ3NTgzOTAzMDUwNTk2NjAxNjk4MiAtPiA2MAorbXVseDM0MTcgbXVsdGlwbHkgNjExNjU1NTY5NTY4LjgzMjY5ODkxMjc2MjA3NTg4OTE4NiAwMTAxODI3NDMyMTkuNDc1ODM5MDMwNTA1OTY2MDE2OTgyIC0+IDYyMjgzMzE2MDM2ODE2NjM1MTE4MjYuNjA0NTAyODAzNTAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQxNyBwb3dlciA2MTE2NTU1Njk1NjguODMyNjk4OTEyNzYyMDc1ODg5MTg2IDEgLT4gNjExNjU1NTY5NTY4LjgzMjY5ODkxMjc2MjA3NTg4OTE4NgorcmVteDM0MTcgcmVtYWluZGVyIDYxMTY1NTU2OTU2OC44MzI2OTg5MTI3NjIwNzU4ODkxODYgMDEwMTgyNzQzMjE5LjQ3NTgzOTAzMDUwNTk2NjAxNjk4MiAtPiA2OTA5NzY0MDAuMjgyMzU3MDgyNDA0MTE0ODcwMjY2CitzdWJ4MzQxNyBzdWJ0cmFjdCA2MTE2NTU1Njk1NjguODMyNjk4OTEyNzYyMDc1ODg5MTg2IDAxMDE4Mjc0MzIxOS40NzU4MzkwMzA1MDU5NjYwMTY5ODIgLT4gNjAxNDcyODI2MzQ5LjM1Njg1OTg4MjI1NjEwOTg3MjIwNAorYWRkeDM0MTggYWRkIDM0NTc5NDcuMzkwNjI4NjM2NzQ4ODI2NzI1MTgzMDQ0NDIgLTAxLjk5OTUyMTg4Njg5MDg4NDkwNTY4NjY1NDk4MTE0MjUgLT4gMzQ1Nzk0NS4zOTExMDY3NDk4NTc5NDE4MTk0OTYzODk0NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDE4IGNvbXBhcmUgMzQ1Nzk0Ny4zOTA2Mjg2MzY3NDg4MjY3MjUxODMwNDQ0MiAtMDEuOTk5NTIxODg2ODkwODg0OTA1Njg2NjU0OTgxMTQyNSAtPiAxCitkaXZ4MzQxOCBkaXZpZGUgMzQ1Nzk0Ny4zOTA2Mjg2MzY3NDg4MjY3MjUxODMwNDQ0MiAtMDEuOTk5NTIxODg2ODkwODg0OTA1Njg2NjU0OTgxMTQyNSAtPiAtMTcyOTM4Ny4xMTY2Mzk5MTg1MjQyNjQyODI2MzIzMDQ3NSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDE4IGRpdmlkZWludCAzNDU3OTQ3LjM5MDYyODYzNjc0ODgyNjcyNTE4MzA0NDQyIC0wMS45OTk1MjE4ODY4OTA4ODQ5MDU2ODY2NTQ5ODExNDI1IC0+IC0xNzI5Mzg3CittdWx4MzQxOCBtdWx0aXBseSAzNDU3OTQ3LjM5MDYyODYzNjc0ODgyNjcyNTE4MzA0NDQyIC0wMS45OTk1MjE4ODY4OTA4ODQ5MDU2ODY2NTQ5ODExNDI1IC0+IC02OTE0MjQxLjQ5MTI3OTE4MzYxMjU5MjUyOTU2NTc2NjU0IEluZXhhY3QgUm91bmRlZAorcG93eDM0MTggcG93ZXIgMzQ1Nzk0Ny4zOTA2Mjg2MzY3NDg4MjY3MjUxODMwNDQ0MiAtMiAtPiA4LjM2MzAyMTk1MjI5NzAxOTEzMzc2ODAyMzczNjU5NTI2RS0xNCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDE4IHJlbWFpbmRlciAzNDU3OTQ3LjM5MDYyODYzNjc0ODgyNjcyNTE4MzA0NDQyIC0wMS45OTk1MjE4ODY4OTA4ODQ5MDU2ODY2NTQ5ODExNDI1IC0+IDAuMjMzMjI0MDY5OTc0NDM1OTk3OTg1MTcxMzM1MzUyNQorc3VieDM0MTggc3VidHJhY3QgMzQ1Nzk0Ny4zOTA2Mjg2MzY3NDg4MjY3MjUxODMwNDQ0MiAtMDEuOTk5NTIxODg2ODkwODg0OTA1Njg2NjU0OTgxMTQyNSAtPiAzNDU3OTQ5LjM5MDE1MDUyMzYzOTcxMTYzMDg2OTY5OTQwIEluZXhhY3QgUm91bmRlZAorYWRkeDM0MTkgYWRkIC01MzMwODY2Njk2MDUzNS43MzkzMzkxMjg5MzY0NTkxNTEzIC02NTI3LjAwNTQ3NjI5NDc1NTc4Njk0NTIxNDM2NzY0NTk2RS00NDIgLT4gLTUzMzA4NjY2OTYwNTM1LjczOTMzOTEyODkzNjQ1OTE1MTMgSW5leGFjdCBSb3VuZGVkCitjb214MzQxOSBjb21wYXJlIC01MzMwODY2Njk2MDUzNS43MzkzMzkxMjg5MzY0NTkxNTEzIC02NTI3LjAwNTQ3NjI5NDc1NTc4Njk0NTIxNDM2NzY0NTk2RS00NDIgLT4gLTEKK2RpdngzNDE5IGRpdmlkZSAtNTMzMDg2NjY5NjA1MzUuNzM5MzM5MTI4OTM2NDU5MTUxMyAtNjUyNy4wMDU0NzYyOTQ3NTU3ODY5NDUyMTQzNjc2NDU5NkUtNDQyIC0+IDguMTY3NDAwMzcyODI3MzE4NzA4ODMxMzY3MTQ0NDEyMDRFKzQ1MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDE5IGRpdmlkZWludCAtNTMzMDg2NjY5NjA1MzUuNzM5MzM5MTI4OTM2NDU5MTUxMyAtNjUyNy4wMDU0NzYyOTQ3NTU3ODY5NDUyMTQzNjc2NDU5NkUtNDQyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQxOSBtdWx0aXBseSAtNTMzMDg2NjY5NjA1MzUuNzM5MzM5MTI4OTM2NDU5MTUxMyAtNjUyNy4wMDU0NzYyOTQ3NTU3ODY5NDUyMTQzNjc2NDU5NkUtNDQyIC0+IDMuNDc5NDU5NjExODUzOTAwODQ2NDExNTYyNTAxMDAwODVFLTQyNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDE5IHBvd2VyIC01MzMwODY2Njk2MDUzNS43MzkzMzkxMjg5MzY0NTkxNTEzIC03IC0+IC04LjE3MzYzNTAyMzgwNDk3MDMzMzQyMzgwNDk4OTg4OTU4RS05NyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDE5IHJlbWFpbmRlciAtNTMzMDg2NjY5NjA1MzUuNzM5MzM5MTI4OTM2NDU5MTUxMyAtNjUyNy4wMDU0NzYyOTQ3NTU3ODY5NDUyMTQzNjc2NDU5NkUtNDQyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQxOSBzdWJ0cmFjdCAtNTMzMDg2NjY5NjA1MzUuNzM5MzM5MTI4OTM2NDU5MTUxMyAtNjUyNy4wMDU0NzYyOTQ3NTU3ODY5NDUyMTQzNjc2NDU5NkUtNDQyIC0+IC01MzMwODY2Njk2MDUzNS43MzkzMzkxMjg5MzY0NTkxNTEzIEluZXhhY3QgUm91bmRlZAorYWRkeDM0MjAgYWRkIC01NTY4MDU3LjE3ODcwMTM5NTQ5NDc4Mjc3OTgwNTQwMDM0IC00MDc5MDY0NDMuMTQxMzQyMTc1NzQwNDcxODQ5NzIzNjM4IC0+IC00MTM0NzQ1MDAuMzIwMDQzNTcxMjM1MjU0NjI5NTI5MDM4IEluZXhhY3QgUm91bmRlZAorY29teDM0MjAgY29tcGFyZSAtNTU2ODA1Ny4xNzg3MDEzOTU0OTQ3ODI3Nzk4MDU0MDAzNCAtNDA3OTA2NDQzLjE0MTM0MjE3NTc0MDQ3MTg0OTcyMzYzOCAtPiAxCitkaXZ4MzQyMCBkaXZpZGUgLTU1NjgwNTcuMTc4NzAxMzk1NDk0NzgyNzc5ODA1NDAwMzQgLTQwNzkwNjQ0My4xNDEzNDIxNzU3NDA0NzE4NDk3MjM2MzggLT4gMC4wMTM2NTAzMjkwNzAxMTk3MDk0OTUzNDI5MDE4MDEzMTQ2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MjAgZGl2aWRlaW50IC01NTY4MDU3LjE3ODcwMTM5NTQ5NDc4Mjc3OTgwNTQwMDM0IC00MDc5MDY0NDMuMTQxMzQyMTc1NzQwNDcxODQ5NzIzNjM4IC0+IDAKK211bHgzNDIwIG11bHRpcGx5IC01NTY4MDU3LjE3ODcwMTM5NTQ5NDc4Mjc3OTgwNTQwMDM0IC00MDc5MDY0NDMuMTQxMzQyMTc1NzQwNDcxODQ5NzIzNjM4IC0+IDIyNzEyNDYzOTg5NzE3MDIuOTExNjk4MDc3MjgxMzIwODkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQyMCBwb3dlciAtNTU2ODA1Ny4xNzg3MDEzOTU0OTQ3ODI3Nzk4MDU0MDAzNCAtNDA3OTA2NDQzIC0+IC0wRS0xMDAzMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzQyMCByZW1haW5kZXIgLTU1NjgwNTcuMTc4NzAxMzk1NDk0NzgyNzc5ODA1NDAwMzQgLTQwNzkwNjQ0My4xNDEzNDIxNzU3NDA0NzE4NDk3MjM2MzggLT4gLTU1NjgwNTcuMTc4NzAxMzk1NDk0NzgyNzc5ODA1NDAwMzQKK3N1YngzNDIwIHN1YnRyYWN0IC01NTY4MDU3LjE3ODcwMTM5NTQ5NDc4Mjc3OTgwNTQwMDM0IC00MDc5MDY0NDMuMTQxMzQyMTc1NzQwNDcxODQ5NzIzNjM4IC0+IDQwMjMzODM4NS45NjI2NDA3ODAyNDU2ODkwNjk5MTgyMzggSW5leGFjdCBSb3VuZGVkCithZGR4MzQyMSBhZGQgOTgwNDM4NTI3My40OTUzMzUyNDQxNjQxNTE4OTk5MDg1NyA4NC4xNDMzOTI5NzQzNTQ0NjU5NTUzOTY0ODA0NjQ2NTY5IC0+IDk4MDQzODUzNTcuNjM4NzI4MjE4NTE4NjE3ODU1MzA1MDUgSW5leGFjdCBSb3VuZGVkCitjb214MzQyMSBjb21wYXJlIDk4MDQzODUyNzMuNDk1MzM1MjQ0MTY0MTUxODk5OTA4NTcgODQuMTQzMzkyOTc0MzU0NDY1OTU1Mzk2NDgwNDY0NjU2OSAtPiAxCitkaXZ4MzQyMSBkaXZpZGUgOTgwNDM4NTI3My40OTUzMzUyNDQxNjQxNTE4OTk5MDg1NyA4NC4xNDMzOTI5NzQzNTQ0NjU5NTUzOTY0ODA0NjQ2NTY5IC0+IDExNjUxOTk2NS44MjE3MTk5Nzc0MDIzOTgxOTA1NTg0MzkgSW5leGFjdCBSb3VuZGVkCitkdml4MzQyMSBkaXZpZGVpbnQgOTgwNDM4NTI3My40OTUzMzUyNDQxNjQxNTE4OTk5MDg1NyA4NC4xNDMzOTI5NzQzNTQ0NjU5NTUzOTY0ODA0NjQ2NTY5IC0+IDExNjUxOTk2NQorbXVseDM0MjEgbXVsdGlwbHkgOTgwNDM4NTI3My40OTUzMzUyNDQxNjQxNTE4OTk5MDg1NyA4NC4xNDMzOTI5NzQzNTQ0NjU5NTUzOTY0ODA0NjQ2NTY5IC0+IDgyNDk3NDI0MjkzOS42OTE3ODA3OTg2MjExODA5MDE3MTQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQyMSBwb3dlciA5ODA0Mzg1MjczLjQ5NTMzNTI0NDE2NDE1MTg5OTkwODU3IDg0IC0+IDEuOTAyNDQwMTA3Nzk2OTI3MzkwMzcwODA0MTg1MDc5MDlFKzgzOSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDIxIHJlbWFpbmRlciA5ODA0Mzg1MjczLjQ5NTMzNTI0NDE2NDE1MTg5OTkwODU3IDg0LjE0MzM5Mjk3NDM1NDQ2NTk1NTM5NjQ4MDQ2NDY1NjkgLT4gNjkuMTQyMzA2OTczNDQ3NjYyNDM1MDQzNTY0Mjc0OTkxNQorc3VieDM0MjEgc3VidHJhY3QgOTgwNDM4NTI3My40OTUzMzUyNDQxNjQxNTE4OTk5MDg1NyA4NC4xNDMzOTI5NzQzNTQ0NjU5NTUzOTY0ODA0NjQ2NTY5IC0+IDk4MDQzODUxODkuMzUxOTQyMjY5ODA5Njg1OTQ0NTEyMDkgSW5leGFjdCBSb3VuZGVkCithZGR4MzQyMiBhZGQgLTUyMzQ5MTA5ODY1OTIuMTg4MDE3MjcwNDY1ODAwMTQyNzNFLTU0NyAtNTg3NDIyMDcxNTg5Mi45MTQ0MDA2OTIxMDUxMjUxNTE1NCAtPiAtNTg3NDIyMDcxNTg5Mi45MTQ0MDA2OTIxMDUxMjUxNTE1NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDIyIGNvbXBhcmUgLTUyMzQ5MTA5ODY1OTIuMTg4MDE3MjcwNDY1ODAwMTQyNzNFLTU0NyAtNTg3NDIyMDcxNTg5Mi45MTQ0MDA2OTIxMDUxMjUxNTE1NCAtPiAxCitkaXZ4MzQyMiBkaXZpZGUgLTUyMzQ5MTA5ODY1OTIuMTg4MDE3MjcwNDY1ODAwMTQyNzNFLTU0NyAtNTg3NDIyMDcxNTg5Mi45MTQ0MDA2OTIxMDUxMjUxNTE1NCAtPiA4LjkxMTY2ODg2NjAxNDc3MDIxNzU3NDM5ODI2OTAzNzc2RS01NDggSW5leGFjdCBSb3VuZGVkCitkdml4MzQyMiBkaXZpZGVpbnQgLTUyMzQ5MTA5ODY1OTIuMTg4MDE3MjcwNDY1ODAwMTQyNzNFLTU0NyAtNTg3NDIyMDcxNTg5Mi45MTQ0MDA2OTIxMDUxMjUxNTE1NCAtPiAwCittdWx4MzQyMiBtdWx0aXBseSAtNTIzNDkxMDk4NjU5Mi4xODgwMTcyNzA0NjU4MDAxNDI3M0UtNTQ3IC01ODc0MjIwNzE1ODkyLjkxNDQwMDY5MjEwNTEyNTE1MTU0IC0+IDMuMDc1MTAyMjU2MzI5NTI0NTUxNDQ5NDQyODI5MjU1ODNFLTUyMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDIyIHBvd2VyIC01MjM0OTEwOTg2NTkyLjE4ODAxNzI3MDQ2NTgwMDE0MjczRS01NDcgLTYgLT4gNC44NTg5Njk3MDcwMzExNzE0OTIzNTkzNTAzNzI3MTA4NEUrMzIwNSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDIyIHJlbWFpbmRlciAtNTIzNDkxMDk4NjU5Mi4xODgwMTcyNzA0NjU4MDAxNDI3M0UtNTQ3IC01ODc0MjIwNzE1ODkyLjkxNDQwMDY5MjEwNTEyNTE1MTU0IC0+IC01LjIzNDkxMDk4NjU5MjE4ODAxNzI3MDQ2NTgwMDE0MjczRS01MzUKK3N1YngzNDIyIHN1YnRyYWN0IC01MjM0OTEwOTg2NTkyLjE4ODAxNzI3MDQ2NTgwMDE0MjczRS01NDcgLTU4NzQyMjA3MTU4OTIuOTE0NDAwNjkyMTA1MTI1MTUxNTQgLT4gNTg3NDIyMDcxNTg5Mi45MTQ0MDA2OTIxMDUxMjUxNTE1NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDIzIGFkZCA2OTg0MTY1NjAxNTE5NTUyODU5Mjk3NDc2MzM3ODY4NjdFLTQ5NSA1MTc1NDY4MS42Nzg0ODcyNjI4OTMzMjE4OTg1MjE2OTE2RS0yNjYgLT4gNS4xNzU0NjgxNjc4NDg3MjYyODkzMzIxODk4NTIxNjkxNkUtMjU5IEluZXhhY3QgUm91bmRlZAorY29teDM0MjMgY29tcGFyZSA2OTg0MTY1NjAxNTE5NTUyODU5Mjk3NDc2MzM3ODY4NjdFLTQ5NSA1MTc1NDY4MS42Nzg0ODcyNjI4OTMzMjE4OTg1MjE2OTE2RS0yNjYgLT4gLTEKK2RpdngzNDIzIGRpdmlkZSA2OTg0MTY1NjAxNTE5NTUyODU5Mjk3NDc2MzM3ODY4NjdFLTQ5NSA1MTc1NDY4MS42Nzg0ODcyNjI4OTMzMjE4OTg1MjE2OTE2RS0yNjYgLT4gMS4zNDk0NzUxMzQ0MjQ5MTk3MTQ4ODM2MzI1MDM5ODkwOEUtMjA0IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MjMgZGl2aWRlaW50IDY5ODQxNjU2MDE1MTk1NTI4NTkyOTc0NzYzMzc4Njg2N0UtNDk1IDUxNzU0NjgxLjY3ODQ4NzI2Mjg5MzMyMTg5ODUyMTY5MTZFLTI2NiAtPiAwCittdWx4MzQyMyBtdWx0aXBseSA2OTg0MTY1NjAxNTE5NTUyODU5Mjk3NDc2MzM3ODY4NjdFLTQ5NSA1MTc1NDY4MS42Nzg0ODcyNjI4OTMzMjE4OTg1MjE2OTE2RS0yNjYgLT4gMy42MTQ2MzI2NzQ5NjQ4NDk3NjA2NDI3MTMwNTY3OTc5NkUtNzIxIEluZXhhY3QgUm91bmRlZAorcG93eDM0MjMgcG93ZXIgNjk4NDE2NTYwMTUxOTU1Mjg1OTI5NzQ3NjMzNzg2ODY3RS00OTUgNSAtPiAxLjY2MTc3NjYxMDA3MTg5NDMwNzYxMzk2OTc5Nzg3NDEzRS0yMzExIEluZXhhY3QgUm91bmRlZAorcmVteDM0MjMgcmVtYWluZGVyIDY5ODQxNjU2MDE1MTk1NTI4NTkyOTc0NzYzMzc4Njg2N0UtNDk1IDUxNzU0NjgxLjY3ODQ4NzI2Mjg5MzMyMTg5ODUyMTY5MTZFLTI2NiAtPiA2Ljk4NDE2NTYwMTUxOTU1Mjg1OTI5NzQ3NjMzNzg2ODY3RS00NjMKK3N1YngzNDIzIHN1YnRyYWN0IDY5ODQxNjU2MDE1MTk1NTI4NTkyOTc0NzYzMzc4Njg2N0UtNDk1IDUxNzU0NjgxLjY3ODQ4NzI2Mjg5MzMyMTg5ODUyMTY5MTZFLTI2NiAtPiAtNS4xNzU0NjgxNjc4NDg3MjYyODkzMzIxODk4NTIxNjkxNkUtMjU5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MjQgYWRkIDEwNzYzNS40OTc3MzUzMTY1MTUwODA3MjAzMzA1MzYwMjcgLTM5NzIwNzUuODM5ODk1MTI2NjgzNjI2MDk2MDkwMDY0MjVFLTYwNSAtPiAxMDc2MzUuNDk3NzM1MzE2NTE1MDgwNzIwMzMwNTM2MDI3IEluZXhhY3QgUm91bmRlZAorY29teDM0MjQgY29tcGFyZSAxMDc2MzUuNDk3NzM1MzE2NTE1MDgwNzIwMzMwNTM2MDI3IC0zOTcyMDc1LjgzOTg5NTEyNjY4MzYyNjA5NjA5MDA2NDI1RS02MDUgLT4gMQorZGl2eDM0MjQgZGl2aWRlIDEwNzYzNS40OTc3MzUzMTY1MTUwODA3MjAzMzA1MzYwMjcgLTM5NzIwNzUuODM5ODk1MTI2NjgzNjI2MDk2MDkwMDY0MjVFLTYwNSAtPiAtMi43MDk4MDQ2OTg0NDU5OTg4ODQ0MzMwOTU3MTIzNTU5N0UrNjAzIEluZXhhY3QgUm91bmRlZAorZHZpeDM0MjQgZGl2aWRlaW50IDEwNzYzNS40OTc3MzUzMTY1MTUwODA3MjAzMzA1MzYwMjcgLTM5NzIwNzUuODM5ODk1MTI2NjgzNjI2MDk2MDkwMDY0MjVFLTYwNSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0MjQgbXVsdGlwbHkgMTA3NjM1LjQ5NzczNTMxNjUxNTA4MDcyMDMzMDUzNjAyNyAtMzk3MjA3NS44Mzk4OTUxMjY2ODM2MjYwOTYwOTAwNjQyNUUtNjA1IC0+IC00LjI3NTM2MzYwMDY5NTM3MzUyNjk4MDY2NDA4MDIxNzczRS01OTQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQyNCBwb3dlciAxMDc2MzUuNDk3NzM1MzE2NTE1MDgwNzIwMzMwNTM2MDI3IC00IC0+IDcuNDUwMzcxMTE1MDI5MTA0ODc4MDM0MzI4MDYzMzQ3MTRFLTIxIEluZXhhY3QgUm91bmRlZAorcmVteDM0MjQgcmVtYWluZGVyIDEwNzYzNS40OTc3MzUzMTY1MTUwODA3MjAzMzA1MzYwMjcgLTM5NzIwNzUuODM5ODk1MTI2NjgzNjI2MDk2MDkwMDY0MjVFLTYwNSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0MjQgc3VidHJhY3QgMTA3NjM1LjQ5NzczNTMxNjUxNTA4MDcyMDMzMDUzNjAyNyAtMzk3MjA3NS44Mzk4OTUxMjY2ODM2MjYwOTYwOTAwNjQyNUUtNjA1IC0+IDEwNzYzNS40OTc3MzUzMTY1MTUwODA3MjAzMzA1MzYwMjcgSW5leGFjdCBSb3VuZGVkCithZGR4MzQyNSBhZGQgLTMyMTc0MjkxMzQ1Njg2LjUzNzE0NDY2MTY2NzA5NjE4MDcgNzk1MTg4NjM3NTkzODUuNTkyNTA1Mjc0Nzg2NzA5OTA5MUUrNDA4IC0+IDcuOTUxODg2Mzc1OTM4NTU5MjUwNTI3NDc4NjcwOTkwOTFFKzQyMSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDI1IGNvbXBhcmUgLTMyMTc0MjkxMzQ1Njg2LjUzNzE0NDY2MTY2NzA5NjE4MDcgNzk1MTg4NjM3NTkzODUuNTkyNTA1Mjc0Nzg2NzA5OTA5MUUrNDA4IC0+IC0xCitkaXZ4MzQyNSBkaXZpZGUgLTMyMTc0MjkxMzQ1Njg2LjUzNzE0NDY2MTY2NzA5NjE4MDcgNzk1MTg4NjM3NTkzODUuNTkyNTA1Mjc0Nzg2NzA5OTA5MUUrNDA4IC0+IC00LjA0NjEyMDYwODk0NjU4MDA3NzE1NjIxODA3ODgxMDc2RS00MDkgSW5leGFjdCBSb3VuZGVkCitkdml4MzQyNSBkaXZpZGVpbnQgLTMyMTc0MjkxMzQ1Njg2LjUzNzE0NDY2MTY2NzA5NjE4MDcgNzk1MTg4NjM3NTkzODUuNTkyNTA1Mjc0Nzg2NzA5OTA5MUUrNDA4IC0+IC0wCittdWx4MzQyNSBtdWx0aXBseSAtMzIxNzQyOTEzNDU2ODYuNTM3MTQ0NjYxNjY3MDk2MTgwNyA3OTUxODg2Mzc1OTM4NS41OTI1MDUyNzQ3ODY3MDk5MDkxRSs0MDggLT4gLTIuNTU4NDYzMDkwMDcyNDI2Njg1MTMyMjY4MTQwNDM1OTNFKzQzNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDI1IHBvd2VyIC0zMjE3NDI5MTM0NTY4Ni41MzcxNDQ2NjE2NjcwOTYxODA3IDggLT4gMS4xNDgzNDM3NzY1NjEwOTE0MzIxMDA1ODY5MDU5MDY2NkUrMTA4IEluZXhhY3QgUm91bmRlZAorcmVteDM0MjUgcmVtYWluZGVyIC0zMjE3NDI5MTM0NTY4Ni41MzcxNDQ2NjE2NjcwOTYxODA3IDc5NTE4ODYzNzU5Mzg1LjU5MjUwNTI3NDc4NjcwOTkwOTFFKzQwOCAtPiAtMzIxNzQyOTEzNDU2ODYuNTM3MTQ0NjYxNjY3MDk2MTgwNworc3VieDM0MjUgc3VidHJhY3QgLTMyMTc0MjkxMzQ1Njg2LjUzNzE0NDY2MTY2NzA5NjE4MDcgNzk1MTg4NjM3NTkzODUuNTkyNTA1Mjc0Nzg2NzA5OTA5MUUrNDA4IC0+IC03Ljk1MTg4NjM3NTkzODU1OTI1MDUyNzQ3ODY3MDk5MDkxRSs0MjEgSW5leGFjdCBSb3VuZGVkCithZGR4MzQyNiBhZGQgLTgxNTE3MzA0OTQuNTMxOTA1MjM2MjA4OTk0MTA1NDQwOTlFKzY4OCAtOTMxNzMuMDYzMTQ3NDUyNzE0MjMwNzY0NDIzOTkxOTQ4MEUrOTAwIC0+IC05LjMxNzMwNjMxNDc0NTI3MTQyMzA3NjQ0MjM5OTE5NDgwRSs5MDQgSW5leGFjdCBSb3VuZGVkCitjb214MzQyNiBjb21wYXJlIC04MTUxNzMwNDk0LjUzMTkwNTIzNjIwODk5NDEwNTQ0MDk5RSs2ODggLTkzMTczLjA2MzE0NzQ1MjcxNDIzMDc2NDQyMzk5MTk0ODBFKzkwMCAtPiAxCitkaXZ4MzQyNiBkaXZpZGUgLTgxNTE3MzA0OTQuNTMxOTA1MjM2MjA4OTk0MTA1NDQwOTlFKzY4OCAtOTMxNzMuMDYzMTQ3NDUyNzE0MjMwNzY0NDIzOTkxOTQ4MEUrOTAwIC0+IDguNzQ5MDIwNjA2NTU3OTY3MTcwNDM2Nzg0NDE4ODQyODNFLTIwOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDI2IGRpdmlkZWludCAtODE1MTczMDQ5NC41MzE5MDUyMzYyMDg5OTQxMDU0NDA5OUUrNjg4IC05MzE3My4wNjMxNDc0NTI3MTQyMzA3NjQ0MjM5OTE5NDgwRSs5MDAgLT4gMAorbXVseDM0MjYgbXVsdGlwbHkgLTgxNTE3MzA0OTQuNTMxOTA1MjM2MjA4OTk0MTA1NDQwOTlFKzY4OCAtOTMxNzMuMDYzMTQ3NDUyNzE0MjMwNzY0NDIzOTkxOTQ4MEUrOTAwIC0+IDcuNTk1MjE3MDAxMjgwMzcxNDkxNzk3NTE0Njc3MzA5NjJFKzE2MDIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQyNiBwb3dlciAtODE1MTczMDQ5NC41MzE5MDUyMzYyMDg5OTQxMDU0NDA5OUUrNjg4IC05IC0+IC02LjI5MTQ2MzUyNzc0ODQyNDQ4Mzc1Mjc1MjgyMTgzNzAwRS02MjgyIEluZXhhY3QgUm91bmRlZAorcmVteDM0MjYgcmVtYWluZGVyIC04MTUxNzMwNDk0LjUzMTkwNTIzNjIwODk5NDEwNTQ0MDk5RSs2ODggLTkzMTczLjA2MzE0NzQ1MjcxNDIzMDc2NDQyMzk5MTk0ODBFKzkwMCAtPiAtOC4xNTE3MzA0OTQ1MzE5MDUyMzYyMDg5OTQxMDU0NDA5OUUrNjk3CitzdWJ4MzQyNiBzdWJ0cmFjdCAtODE1MTczMDQ5NC41MzE5MDUyMzYyMDg5OTQxMDU0NDA5OUUrNjg4IC05MzE3My4wNjMxNDc0NTI3MTQyMzA3NjQ0MjM5OTE5NDgwRSs5MDAgLT4gOS4zMTczMDYzMTQ3NDUyNzE0MjMwNzY0NDIzOTkxOTQ4MEUrOTA0IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MjcgYWRkIDEuMzM2NDk4MDEzNDU5NzYxOTk3MDgzNDE3OTk1MDUyMjAgLTU2NjIzLjA1MzAwMzk1Mjg5Njk4MjU0ODA3NTUxNTk1NjJFKzQ1OSAtPiAtNS42NjIzMDUzMDAzOTUyODk2OTgyNTQ4MDc1NTE1OTU2MkUrNDYzIEluZXhhY3QgUm91bmRlZAorY29teDM0MjcgY29tcGFyZSAxLjMzNjQ5ODAxMzQ1OTc2MTk5NzA4MzQxNzk5NTA1MjIwIC01NjYyMy4wNTMwMDM5NTI4OTY5ODI1NDgwNzU1MTU5NTYyRSs0NTkgLT4gMQorZGl2eDM0MjcgZGl2aWRlIDEuMzM2NDk4MDEzNDU5NzYxOTk3MDgzNDE3OTk1MDUyMjAgLTU2NjIzLjA1MzAwMzk1Mjg5Njk4MjU0ODA3NTUxNTk1NjJFKzQ1OSAtPiAtMi4zNjAzNDI1NTA1MjcwMDkwMDM5NTc4NzEzMTMzNDYwOEUtNDY0IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MjcgZGl2aWRlaW50IDEuMzM2NDk4MDEzNDU5NzYxOTk3MDgzNDE3OTk1MDUyMjAgLTU2NjIzLjA1MzAwMzk1Mjg5Njk4MjU0ODA3NTUxNTk1NjJFKzQ1OSAtPiAtMAorbXVseDM0MjcgbXVsdGlwbHkgMS4zMzY0OTgwMTM0NTk3NjE5OTcwODM0MTc5OTUwNTIyMCAtNTY2MjMuMDUzMDAzOTUyODk2OTgyNTQ4MDc1NTE1OTU2MkUrNDU5IC0+IC03LjU2NzY1OTc4NTU4MDk4NTU4OTI4MjY4MTI5NzAwMDUyRSs0NjMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQyNyBwb3dlciAxLjMzNjQ5ODAxMzQ1OTc2MTk5NzA4MzQxNzk5NTA1MjIwIC02IC0+IDAuMTc1NDY0ODM1OTEyMjg0OTAwMTgwMzA1MDI4OTY1MTg4IEluZXhhY3QgUm91bmRlZAorcmVteDM0MjcgcmVtYWluZGVyIDEuMzM2NDk4MDEzNDU5NzYxOTk3MDgzNDE3OTk1MDUyMjAgLTU2NjIzLjA1MzAwMzk1Mjg5Njk4MjU0ODA3NTUxNTk1NjJFKzQ1OSAtPiAxLjMzNjQ5ODAxMzQ1OTc2MTk5NzA4MzQxNzk5NTA1MjIwCitzdWJ4MzQyNyBzdWJ0cmFjdCAxLjMzNjQ5ODAxMzQ1OTc2MTk5NzA4MzQxNzk5NTA1MjIwIC01NjYyMy4wNTMwMDM5NTI4OTY5ODI1NDgwNzU1MTU5NTYyRSs0NTkgLT4gNS42NjIzMDUzMDAzOTUyODk2OTgyNTQ4MDc1NTE1OTU2MkUrNDYzIEluZXhhY3QgUm91bmRlZAorYWRkeDM0MjggYWRkIDY3NzYyMjM4MTYyNzg4LjY1NTEwNjE0NzYwMTgxODUxOTYgLTYxNDAuNzU4Mzc5NTkyNDgxMDAzNTI3ODg4NTM4MDkzNzZFLTgyMiAtPiA2Nzc2MjIzODE2Mjc4OC42NTUxMDYxNDc2MDE4MTg1MTk2IEluZXhhY3QgUm91bmRlZAorY29teDM0MjggY29tcGFyZSA2Nzc2MjIzODE2Mjc4OC42NTUxMDYxNDc2MDE4MTg1MTk2IC02MTQwLjc1ODM3OTU5MjQ4MTAwMzUyNzg4ODUzODA5Mzc2RS04MjIgLT4gMQorZGl2eDM0MjggZGl2aWRlIDY3NzYyMjM4MTYyNzg4LjY1NTEwNjE0NzYwMTgxODUxOTYgLTYxNDAuNzU4Mzc5NTkyNDgxMDAzNTI3ODg4NTM4MDkzNzZFLTgyMiAtPiAtMS4xMDM0ODMyMTc3NzI5NDE1NzAxNDk0MTk1MTg3MDQwOUUrODMyIEluZXhhY3QgUm91bmRlZAorZHZpeDM0MjggZGl2aWRlaW50IDY3NzYyMjM4MTYyNzg4LjY1NTEwNjE0NzYwMTgxODUxOTYgLTYxNDAuNzU4Mzc5NTkyNDgxMDAzNTI3ODg4NTM4MDkzNzZFLTgyMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0MjggbXVsdGlwbHkgNjc3NjIyMzgxNjI3ODguNjU1MTA2MTQ3NjAxODE4NTE5NiAtNjE0MC43NTgzNzk1OTI0ODEwMDM1Mjc4ODg1MzgwOTM3NkUtODIyIC0+IC00LjE2MTExNTMxODE4MDg1ODM4NzE3MjAxODI4NzczODU3RS04MDUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQyOCBwb3dlciA2Nzc2MjIzODE2Mjc4OC42NTUxMDYxNDc2MDE4MTg1MTk2IC02IC0+IDEuMDMyOTM2MzE3MDgwMDY1MDkwNzQ5NzI3NjQ2NzAyODFFLTgzIEluZXhhY3QgUm91bmRlZAorcmVteDM0MjggcmVtYWluZGVyIDY3NzYyMjM4MTYyNzg4LjY1NTEwNjE0NzYwMTgxODUxOTYgLTYxNDAuNzU4Mzc5NTkyNDgxMDAzNTI3ODg4NTM4MDkzNzZFLTgyMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0Mjggc3VidHJhY3QgNjc3NjIyMzgxNjI3ODguNjU1MTA2MTQ3NjAxODE4NTE5NiAtNjE0MC43NTgzNzk1OTI0ODEwMDM1Mjc4ODg1MzgwOTM3NkUtODIyIC0+IDY3NzYyMjM4MTYyNzg4LjY1NTEwNjE0NzYwMTgxODUxOTYgSW5leGFjdCBSb3VuZGVkCithZGR4MzQyOSBhZGQgNDI4NjU2Mi43NjU2ODg2Njc1MTU3NzMwNjA1NjQ5ODI3MSA2Mjg2Ljc3MjkxNTc4NDk3NTgwMDE1NTU3OTc5MzQ5ODkzRSs4MjAgLT4gNi4yODY3NzI5MTU3ODQ5NzU4MDAxNTU1Nzk3OTM0OTg5M0UrODIzIEluZXhhY3QgUm91bmRlZAorY29teDM0MjkgY29tcGFyZSA0Mjg2NTYyLjc2NTY4ODY2NzUxNTc3MzA2MDU2NDk4MjcxIDYyODYuNzcyOTE1Nzg0OTc1ODAwMTU1NTc5NzkzNDk4OTNFKzgyMCAtPiAtMQorZGl2eDM0MjkgZGl2aWRlIDQyODY1NjIuNzY1Njg4NjY3NTE1NzczMDYwNTY0OTgyNzEgNjI4Ni43NzI5MTU3ODQ5NzU4MDAxNTU1Nzk3OTM0OTg5M0UrODIwIC0+IDYuODE4MzgzMzMxMzM2NjAwMjU3NDA2ODE0NTkzNDkzNzJFLTgxOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDI5IGRpdmlkZWludCA0Mjg2NTYyLjc2NTY4ODY2NzUxNTc3MzA2MDU2NDk4MjcxIDYyODYuNzcyOTE1Nzg0OTc1ODAwMTU1NTc5NzkzNDk4OTNFKzgyMCAtPiAwCittdWx4MzQyOSBtdWx0aXBseSA0Mjg2NTYyLjc2NTY4ODY2NzUxNTc3MzA2MDU2NDk4MjcxIDYyODYuNzcyOTE1Nzg0OTc1ODAwMTU1NTc5NzkzNDk4OTNFKzgyMCAtPiAyLjY5NDg2NDY2OTcxNDM4NTQyOTc1MTU5ODkzMzA2MjE5RSs4MzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQyOSBwb3dlciA0Mjg2NTYyLjc2NTY4ODY2NzUxNTc3MzA2MDU2NDk4MjcxIDYgLT4gNi4yMDM3NjE5MzA2NDQxMjA4MTA1ODE4MTg4MTgwNTEwOEUrMzkgSW5leGFjdCBSb3VuZGVkCityZW14MzQyOSByZW1haW5kZXIgNDI4NjU2Mi43NjU2ODg2Njc1MTU3NzMwNjA1NjQ5ODI3MSA2Mjg2Ljc3MjkxNTc4NDk3NTgwMDE1NTU3OTc5MzQ5ODkzRSs4MjAgLT4gNDI4NjU2Mi43NjU2ODg2Njc1MTU3NzMwNjA1NjQ5ODI3MQorc3VieDM0Mjkgc3VidHJhY3QgNDI4NjU2Mi43NjU2ODg2Njc1MTU3NzMwNjA1NjQ5ODI3MSA2Mjg2Ljc3MjkxNTc4NDk3NTgwMDE1NTU3OTc5MzQ5ODkzRSs4MjAgLT4gLTYuMjg2NzcyOTE1Nzg0OTc1ODAwMTU1NTc5NzkzNDk4OTNFKzgyMyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDMwIGFkZCAtNzY1NzgyLjgyNzQzMjY0MjY5NzMwNTY0NDA5NjM2NTU2NiA2Ny4xNjM0MzY4NDU5NTc2ODM0NjkyNzU4MTE0NjE4NjUyIC0+IC03NjU3MTUuNjYzOTk1Nzk2NzM5NjIyMTc0ODIwNTU0MTA0IEluZXhhY3QgUm91bmRlZAorY29teDM0MzAgY29tcGFyZSAtNzY1NzgyLjgyNzQzMjY0MjY5NzMwNTY0NDA5NjM2NTU2NiA2Ny4xNjM0MzY4NDU5NTc2ODM0NjkyNzU4MTE0NjE4NjUyIC0+IC0xCitkaXZ4MzQzMCBkaXZpZGUgLTc2NTc4Mi44Mjc0MzI2NDI2OTczMDU2NDQwOTYzNjU1NjYgNjcuMTYzNDM2ODQ1OTU3NjgzNDY5Mjc1ODExNDYxODY1MiAtPiAtMTE0MDEuNzgxNDM2MzYzOTQ3ODc3NDc2MTY5NzY1MDg2NyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDMwIGRpdmlkZWludCAtNzY1NzgyLjgyNzQzMjY0MjY5NzMwNTY0NDA5NjM2NTU2NiA2Ny4xNjM0MzY4NDU5NTc2ODM0NjkyNzU4MTE0NjE4NjUyIC0+IC0xMTQwMQorbXVseDM0MzAgbXVsdGlwbHkgLTc2NTc4Mi44Mjc0MzI2NDI2OTczMDU2NDQwOTYzNjU1NjYgNjcuMTYzNDM2ODQ1OTU3NjgzNDY5Mjc1ODExNDYxODY1MiAtPiAtNTE0MzI2MDYuNTY3OTkxMjA4ODQ2ODI1NjEyMjMxNTk0NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDMwIHBvd2VyIC03NjU3ODIuODI3NDMyNjQyNjk3MzA1NjQ0MDk2MzY1NTY2IDY3IC0+IC0xLjcxODIxMjAwNzcwNzQ5NzczNTk1NDczNTk0MTM2NTgyRSszOTQgSW5leGFjdCBSb3VuZGVkCityZW14MzQzMCByZW1haW5kZXIgLTc2NTc4Mi44Mjc0MzI2NDI2OTczMDU2NDQwOTYzNjU1NjYgNjcuMTYzNDM2ODQ1OTU3NjgzNDY5Mjc1ODExNDYxODY1MiAtPiAtNTIuNDgzOTUxODc5MTQ4MDcyNDMwNTY5ODg4ODQwODU0OAorc3VieDM0MzAgc3VidHJhY3QgLTc2NTc4Mi44Mjc0MzI2NDI2OTczMDU2NDQwOTYzNjU1NjYgNjcuMTYzNDM2ODQ1OTU3NjgzNDY5Mjc1ODExNDYxODY1MiAtPiAtNzY1ODQ5Ljk5MDg2OTQ4ODY1NDk4OTExMzM3MjE3NzAyOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDMxIGFkZCA0Ni4yODM1OTMxOTE2MTA2MjUyNzU2NDY1NzI0MjExMjc2IDU5LjI5ODkyMzc4MzQwOTMxMTgzMzI4MjY2MTc5NTc3OTEgLT4gMTA1LjU4MjUxNjk3NTAxOTkzNzEwODkyOTIzNDIxNjkwNyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDMxIGNvbXBhcmUgNDYuMjgzNTkzMTkxNjEwNjI1Mjc1NjQ2NTcyNDIxMTI3NiA1OS4yOTg5MjM3ODM0MDkzMTE4MzMyODI2NjE3OTU3NzkxIC0+IC0xCitkaXZ4MzQzMSBkaXZpZGUgNDYuMjgzNTkzMTkxNjEwNjI1Mjc1NjQ2NTcyNDIxMTI3NiA1OS4yOTg5MjM3ODM0MDkzMTE4MzMyODI2NjE3OTU3NzkxIC0+IDAuNzgwNTEzMjA3Mjk5NzIyOTc1ODgyNDE2OTk1MTQwNzAxIEluZXhhY3QgUm91bmRlZAorZHZpeDM0MzEgZGl2aWRlaW50IDQ2LjI4MzU5MzE5MTYxMDYyNTI3NTY0NjU3MjQyMTEyNzYgNTkuMjk4OTIzNzgzNDA5MzExODMzMjgyNjYxNzk1Nzc5MSAtPiAwCittdWx4MzQzMSBtdWx0aXBseSA0Ni4yODM1OTMxOTE2MTA2MjUyNzU2NDY1NzI0MjExMjc2IDU5LjI5ODkyMzc4MzQwOTMxMTgzMzI4MjY2MTc5NTc3OTEgLT4gMjc0NC41NjcyNjUwOTE2NDA2MDU2MTM3MDY1MzI4NjYxNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDMxIHBvd2VyIDQ2LjI4MzU5MzE5MTYxMDYyNTI3NTY0NjU3MjQyMTEyNzYgNTkgLT4gMS44MjA1MjY0NTc4MDYwMTAwMjY3MTAwNzk0MzkyMzk5M0UrOTggSW5leGFjdCBSb3VuZGVkCityZW14MzQzMSByZW1haW5kZXIgNDYuMjgzNTkzMTkxNjEwNjI1Mjc1NjQ2NTcyNDIxMTI3NiA1OS4yOTg5MjM3ODM0MDkzMTE4MzMyODI2NjE3OTU3NzkxIC0+IDQ2LjI4MzU5MzE5MTYxMDYyNTI3NTY0NjU3MjQyMTEyNzYKK3N1YngzNDMxIHN1YnRyYWN0IDQ2LjI4MzU5MzE5MTYxMDYyNTI3NTY0NjU3MjQyMTEyNzYgNTkuMjk4OTIzNzgzNDA5MzExODMzMjgyNjYxNzk1Nzc5MSAtPiAtMTMuMDE1MzMwNTkxNzk4Njg2NTU3NjM2MDg5Mzc0NjUxNQorYWRkeDM0MzIgYWRkIC0zMDI5NTU1LjgyMjk4ODQwMjM0MDI5NDc0NDU5Njk0NjQ0IDg1NzUzNTg0NDY1NTAwNDczNzM3MzA4OTYwMTEyODUzMiAtPiA4NTc1MzU4NDQ2NTUwMDQ3MzczNzMwODk1OTgwOTg5NzYgSW5leGFjdCBSb3VuZGVkCitjb214MzQzMiBjb21wYXJlIC0zMDI5NTU1LjgyMjk4ODQwMjM0MDI5NDc0NDU5Njk0NjQ0IDg1NzUzNTg0NDY1NTAwNDczNzM3MzA4OTYwMTEyODUzMiAtPiAtMQorZGl2eDM0MzIgZGl2aWRlIC0zMDI5NTU1LjgyMjk4ODQwMjM0MDI5NDc0NDU5Njk0NjQ0IDg1NzUzNTg0NDY1NTAwNDczNzM3MzA4OTYwMTEyODUzMiAtPiAtMy41MzI4NjIwMjc3MTc1OTcwNDUwMjEyNjgxMTMyMzkzN0UtMjcgSW5leGFjdCBSb3VuZGVkCitkdml4MzQzMiBkaXZpZGVpbnQgLTMwMjk1NTUuODIyOTg4NDAyMzQwMjk0NzQ0NTk2OTQ2NDQgODU3NTM1ODQ0NjU1MDA0NzM3MzczMDg5NjAxMTI4NTMyIC0+IC0wCittdWx4MzQzMiBtdWx0aXBseSAtMzAyOTU1NS44MjI5ODg0MDIzNDAyOTQ3NDQ1OTY5NDY0NCA4NTc1MzU4NDQ2NTUwMDQ3MzczNzMwODk2MDExMjg1MzIgLT4gLTIuNTk3OTUyNzExNTk1ODQ3NjE5Mjg5ODYxODE5MjU3MjFFKzM5IEluZXhhY3QgUm91bmRlZAorcG93eDM0MzIgcG93ZXIgLTMwMjk1NTUuODIyOTg4NDAyMzQwMjk0NzQ0NTk2OTQ2NDQgOSAtPiAtMi4xNDk4NjIyNDc5MDQzMTMwMjU2MTM0MDEwMDc0NjM2MEUrNTggSW5leGFjdCBSb3VuZGVkCityZW14MzQzMiByZW1haW5kZXIgLTMwMjk1NTUuODIyOTg4NDAyMzQwMjk0NzQ0NTk2OTQ2NDQgODU3NTM1ODQ0NjU1MDA0NzM3MzczMDg5NjAxMTI4NTMyIC0+IC0zMDI5NTU1LjgyMjk4ODQwMjM0MDI5NDc0NDU5Njk0NjQ0CitzdWJ4MzQzMiBzdWJ0cmFjdCAtMzAyOTU1NS44MjI5ODg0MDIzNDAyOTQ3NDQ1OTY5NDY0NCA4NTc1MzU4NDQ2NTUwMDQ3MzczNzMwODk2MDExMjg1MzIgLT4gLTg1NzUzNTg0NDY1NTAwNDczNzM3MzA4OTYwNDE1ODA4OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDMzIGFkZCAtMDEzODQ2Njc4OTUyMy4xMDY5NDE3NjU0MzcwMDUwMTk0NUUtOTQ4IDQ4MTAyNjk3OTkxODg4MjQ4NzM4MzY1NDM2NzkyNDYxOSAtPiA0ODEwMjY5Nzk5MTg4ODI0ODczODM2NTQzNjc5MjQ2MTkgSW5leGFjdCBSb3VuZGVkCitjb214MzQzMyBjb21wYXJlIC0wMTM4NDY2Nzg5NTIzLjEwNjk0MTc2NTQzNzAwNTAxOTQ1RS05NDggNDgxMDI2OTc5OTE4ODgyNDg3MzgzNjU0MzY3OTI0NjE5IC0+IC0xCitkaXZ4MzQzMyBkaXZpZGUgLTAxMzg0NjY3ODk1MjMuMTA2OTQxNzY1NDM3MDA1MDE5NDVFLTk0OCA0ODEwMjY5Nzk5MTg4ODI0ODczODM2NTQzNjc5MjQ2MTkgLT4gLTIuODc4NTY1OTcwMzgzOTcyMDc3OTc3Nzc4MTExOTk4MDRFLTk3MCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDMzIGRpdmlkZWludCAtMDEzODQ2Njc4OTUyMy4xMDY5NDE3NjU0MzcwMDUwMTk0NUUtOTQ4IDQ4MTAyNjk3OTkxODg4MjQ4NzM4MzY1NDM2NzkyNDYxOSAtPiAtMAorbXVseDM0MzMgbXVsdGlwbHkgLTAxMzg0NjY3ODk1MjMuMTA2OTQxNzY1NDM3MDA1MDE5NDVFLTk0OCA0ODEwMjY5Nzk5MTg4ODI0ODczODM2NTQzNjc5MjQ2MTkgLT4gLTYuNjYwNjI2MTU4MzM2MzY5MDg2ODM3ODUyODM2ODc0MTZFLTkwNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDMzIHBvd2VyIC0wMTM4NDY2Nzg5NTIzLjEwNjk0MTc2NTQzNzAwNTAxOTQ1RS05NDggNSAtPiAtNS4wOTAxMjEwOTA5MjYzNzUyNTg0MzYzNjA1Njc0NjY2N0UtNDY4NSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDMzIHJlbWFpbmRlciAtMDEzODQ2Njc4OTUyMy4xMDY5NDE3NjU0MzcwMDUwMTk0NUUtOTQ4IDQ4MTAyNjk3OTkxODg4MjQ4NzM4MzY1NDM2NzkyNDYxOSAtPiAtMS4zODQ2Njc4OTUyMzEwNjk0MTc2NTQzNzAwNTAxOTQ1RS05MzcKK3N1YngzNDMzIHN1YnRyYWN0IC0wMTM4NDY2Nzg5NTIzLjEwNjk0MTc2NTQzNzAwNTAxOTQ1RS05NDggNDgxMDI2OTc5OTE4ODgyNDg3MzgzNjU0MzY3OTI0NjE5IC0+IC00ODEwMjY5Nzk5MTg4ODI0ODczODM2NTQzNjc5MjQ2MTkgSW5leGFjdCBSb3VuZGVkCithZGR4MzQzNCBhZGQgLTk1OTM1NjY0NjYuOTY2OTA1NzU3MTQyNDQ0NDIxMDk4NzAgLTg3NjMyMDM0MzQ3LjQ4NDU0Nzc5NjE5NzY3NzY4MzM3NzBFKzc2OSAtPiAtOC43NjMyMDM0MzQ3NDg0NTQ3Nzk2MTk3Njc3NjgzMzc3MEUrNzc5IEluZXhhY3QgUm91bmRlZAorY29teDM0MzQgY29tcGFyZSAtOTU5MzU2NjQ2Ni45NjY5MDU3NTcxNDI0NDQ0MjEwOTg3MCAtODc2MzIwMzQzNDcuNDg0NTQ3Nzk2MTk3Njc3NjgzMzc3MEUrNzY5IC0+IDEKK2RpdngzNDM0IGRpdmlkZSAtOTU5MzU2NjQ2Ni45NjY5MDU3NTcxNDI0NDQ0MjEwOTg3MCAtODc2MzIwMzQzNDcuNDg0NTQ3Nzk2MTk3Njc3NjgzMzc3MEUrNzY5IC0+IDEuMDk0NzU1NjQ5MzkyNTMxMzQwNzA3MzAyOTk4NjM3NjVFLTc3MCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDM0IGRpdmlkZWludCAtOTU5MzU2NjQ2Ni45NjY5MDU3NTcxNDI0NDQ0MjEwOTg3MCAtODc2MzIwMzQzNDcuNDg0NTQ3Nzk2MTk3Njc3NjgzMzc3MEUrNzY5IC0+IDAKK211bHgzNDM0IG11bHRpcGx5IC05NTkzNTY2NDY2Ljk2NjkwNTc1NzE0MjQ0NDQyMTA5ODcwIC04NzYzMjAzNDM0Ny40ODQ1NDc3OTYxOTc2Nzc2ODMzNzcwRSs3NjkgLT4gOC40MDcwMzc0NjE0ODExOTg2NzcxMTQ2MzQ4NTA2NTMzNkUrNzg5IEluZXhhY3QgUm91bmRlZAorcG93eDM0MzQgcG93ZXIgLTk1OTM1NjY0NjYuOTY2OTA1NzU3MTQyNDQ0NDIxMDk4NzAgLTkgLT4gLTEuNDUyNzEwOTE4NDE4ODI5NjAwMTA5NjQ0MjEwNjY3NDVFLTkwIEluZXhhY3QgUm91bmRlZAorcmVteDM0MzQgcmVtYWluZGVyIC05NTkzNTY2NDY2Ljk2NjkwNTc1NzE0MjQ0NDQyMTA5ODcwIC04NzYzMjAzNDM0Ny40ODQ1NDc3OTYxOTc2Nzc2ODMzNzcwRSs3NjkgLT4gLTk1OTM1NjY0NjYuOTY2OTA1NzU3MTQyNDQ0NDIxMDk4NzAKK3N1YngzNDM0IHN1YnRyYWN0IC05NTkzNTY2NDY2Ljk2NjkwNTc1NzE0MjQ0NDQyMTA5ODcwIC04NzYzMjAzNDM0Ny40ODQ1NDc3OTYxOTc2Nzc2ODMzNzcwRSs3NjkgLT4gOC43NjMyMDM0MzQ3NDg0NTQ3Nzk2MTk3Njc3NjgzMzc3MEUrNzc5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MzUgYWRkIC0zMTg5LjMwNzY1NDc3NjcwNTI2ODIzMTA2MTAwMjQxODYzRS04OTggNTY1Njg4ODg5LjM1NTI0MTk0NjE1NDg5NDMxMTI1MzIwMkUtNDY2IC0+IDUuNjU2ODg4ODkzNTUyNDE5NDYxNTQ4OTQzMTEyNTMyMDJFLTQ1OCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDM1IGNvbXBhcmUgLTMxODkuMzA3NjU0Nzc2NzA1MjY4MjMxMDYxMDAyNDE4NjNFLTg5OCA1NjU2ODg4ODkuMzU1MjQxOTQ2MTU0ODk0MzExMjUzMjAyRS00NjYgLT4gLTEKK2RpdngzNDM1IGRpdmlkZSAtMzE4OS4zMDc2NTQ3NzY3MDUyNjgyMzEwNjEwMDI0MTg2M0UtODk4IDU2NTY4ODg4OS4zNTUyNDE5NDYxNTQ4OTQzMTEyNTMyMDJFLTQ2NiAtPiAtNS42Mzc5MTgxNDY4NjY1NTQ4NjYxMjU2OTk3MDYyOTEyOEUtNDM4IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MzUgZGl2aWRlaW50IC0zMTg5LjMwNzY1NDc3NjcwNTI2ODIzMTA2MTAwMjQxODYzRS04OTggNTY1Njg4ODg5LjM1NTI0MTk0NjE1NDg5NDMxMTI1MzIwMkUtNDY2IC0+IC0wCittdWx4MzQzNSBtdWx0aXBseSAtMzE4OS4zMDc2NTQ3NzY3MDUyNjgyMzEwNjEwMDI0MTg2M0UtODk4IDU2NTY4ODg4OS4zNTUyNDE5NDYxNTQ4OTQzMTEyNTMyMDJFLTQ2NiAtPiAtMS44MDQxNTU5MDUwNDI4MDU4MDQ0MzU2NTQ0ODEyNjU0OEUtMTM1MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDM1IHBvd2VyIC0zMTg5LjMwNzY1NDc3NjcwNTI2ODIzMTA2MTAwMjQxODYzRS04OTggNiAtPiAxLjA1MjM5NDMxMDI3NjgzOTA0NTE0MzExNTI3MjI4NzM2RS01MzY3IEluZXhhY3QgUm91bmRlZAorcmVteDM0MzUgcmVtYWluZGVyIC0zMTg5LjMwNzY1NDc3NjcwNTI2ODIzMTA2MTAwMjQxODYzRS04OTggNTY1Njg4ODg5LjM1NTI0MTk0NjE1NDg5NDMxMTI1MzIwMkUtNDY2IC0+IC0zLjE4OTMwNzY1NDc3NjcwNTI2ODIzMTA2MTAwMjQxODYzRS04OTUKK3N1YngzNDM1IHN1YnRyYWN0IC0zMTg5LjMwNzY1NDc3NjcwNTI2ODIzMTA2MTAwMjQxODYzRS04OTggNTY1Njg4ODg5LjM1NTI0MTk0NjE1NDg5NDMxMTI1MzIwMkUtNDY2IC0+IC01LjY1Njg4ODg5MzU1MjQxOTQ2MTU0ODk0MzExMjUzMjAyRS00NTggSW5leGFjdCBSb3VuZGVkCithZGR4MzQzNiBhZGQgLTE3MDg0NTUyMzk1LjY3MTQ4MzQ2ODAwODgxNTA1NDM5NjUgLTYzMTkyNTgwMjY3Mi42ODUwMzQzNzkxOTczMjgzNzA4MTJFKzUyNyAtPiAtNi4zMTkyNTgwMjY3MjY4NTAzNDM3OTE5NzMyODM3MDgxMkUrNTM4IEluZXhhY3QgUm91bmRlZAorY29teDM0MzYgY29tcGFyZSAtMTcwODQ1NTIzOTUuNjcxNDgzNDY4MDA4ODE1MDU0Mzk2NSAtNjMxOTI1ODAyNjcyLjY4NTAzNDM3OTE5NzMyODM3MDgxMkUrNTI3IC0+IDEKK2RpdngzNDM2IGRpdmlkZSAtMTcwODQ1NTIzOTUuNjcxNDgzNDY4MDA4ODE1MDU0Mzk2NSAtNjMxOTI1ODAyNjcyLjY4NTAzNDM3OTE5NzMyODM3MDgxMkUrNTI3IC0+IDIuNzAzNTY5MzYyNjM5MzQ2MjIwNTAzNDEzMjg1MTk1MzRFLTUyOSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDM2IGRpdmlkZWludCAtMTcwODQ1NTIzOTUuNjcxNDgzNDY4MDA4ODE1MDU0Mzk2NSAtNjMxOTI1ODAyNjcyLjY4NTAzNDM3OTE5NzMyODM3MDgxMkUrNTI3IC0+IDAKK211bHgzNDM2IG11bHRpcGx5IC0xNzA4NDU1MjM5NS42NzE0ODM0NjgwMDg4MTUwNTQzOTY1IC02MzE5MjU4MDI2NzIuNjg1MDM0Mzc5MTk3MzI4MzcwODEyRSs1MjcgLT4gMS4wNzk2MTY5NDg1OTM4MjQ2MjM0Njg2NjgxNzMwNjc2OUUrNTQ5IEluZXhhY3QgUm91bmRlZAorcG93eDM0MzYgcG93ZXIgLTE3MDg0NTUyMzk1LjY3MTQ4MzQ2ODAwODgxNTA1NDM5NjUgLTYgLT4gNC4wMjE0MTAxNDk3NzE3Nzk4NDEyMzAxMTg2ODM4NzYyMkUtNjIgSW5leGFjdCBSb3VuZGVkCityZW14MzQzNiByZW1haW5kZXIgLTE3MDg0NTUyMzk1LjY3MTQ4MzQ2ODAwODgxNTA1NDM5NjUgLTYzMTkyNTgwMjY3Mi42ODUwMzQzNzkxOTczMjgzNzA4MTJFKzUyNyAtPiAtMTcwODQ1NTIzOTUuNjcxNDgzNDY4MDA4ODE1MDU0Mzk2NQorc3VieDM0MzYgc3VidHJhY3QgLTE3MDg0NTUyMzk1LjY3MTQ4MzQ2ODAwODgxNTA1NDM5NjUgLTYzMTkyNTgwMjY3Mi42ODUwMzQzNzkxOTczMjgzNzA4MTJFKzUyNyAtPiA2LjMxOTI1ODAyNjcyNjg1MDM0Mzc5MTk3MzI4MzcwODEyRSs1MzggSW5leGFjdCBSb3VuZGVkCithZGR4MzQzNyBhZGQgMDM0OTU2ODMwLjM0OTgyMzMwNjgxNTkxMTg4NzQ2OTc2MCAtNjE2MDA4MTYuMDY3MjI3NDEyNjk2NjA0Mjk1Njc4MTY2NUUtNjY3IC0+IDM0OTU2ODMwLjM0OTgyMzMwNjgxNTkxMTg4NzQ2OTc2MDAgSW5leGFjdCBSb3VuZGVkCitjb214MzQzNyBjb21wYXJlIDAzNDk1NjgzMC4zNDk4MjMzMDY4MTU5MTE4ODc0Njk3NjAgLTYxNjAwODE2LjA2NzIyNzQxMjY5NjYwNDI5NTY3ODE2NjVFLTY2NyAtPiAxCitkaXZ4MzQzNyBkaXZpZGUgMDM0OTU2ODMwLjM0OTgyMzMwNjgxNTkxMTg4NzQ2OTc2MCAtNjE2MDA4MTYuMDY3MjI3NDEyNjk2NjA0Mjk1Njc4MTY2NUUtNjY3IC0+IC01LjY3NDczNDk0MzcxNzg3NzM3NjA3MTY5OTc5NjAyMzQzRSs2NjYgSW5leGFjdCBSb3VuZGVkCitkdml4MzQzNyBkaXZpZGVpbnQgMDM0OTU2ODMwLjM0OTgyMzMwNjgxNTkxMTg4NzQ2OTc2MCAtNjE2MDA4MTYuMDY3MjI3NDEyNjk2NjA0Mjk1Njc4MTY2NUUtNjY3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQzNyBtdWx0aXBseSAwMzQ5NTY4MzAuMzQ5ODIzMzA2ODE1OTExODg3NDY5NzYwIC02MTYwMDgxNi4wNjcyMjc0MTI2OTY2MDQyOTU2NzgxNjY1RS02NjcgLT4gLTIuMTUzMzY5Mjc2NjcyNzM4NDE2MTcxMjg3ODExNzMyOTNFLTY1MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDM3IHBvd2VyIDAzNDk1NjgzMC4zNDk4MjMzMDY4MTU5MTE4ODc0Njk3NjAgLTYgLT4gNS40ODAzNDI3MjU2NjA5ODQ5MzQ2MjE2OTQzMTc2MjU5N0UtNDYgSW5leGFjdCBSb3VuZGVkCityZW14MzQzNyByZW1haW5kZXIgMDM0OTU2ODMwLjM0OTgyMzMwNjgxNTkxMTg4NzQ2OTc2MCAtNjE2MDA4MTYuMDY3MjI3NDEyNjk2NjA0Mjk1Njc4MTY2NUUtNjY3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQzNyBzdWJ0cmFjdCAwMzQ5NTY4MzAuMzQ5ODIzMzA2ODE1OTExODg3NDY5NzYwIC02MTYwMDgxNi4wNjcyMjc0MTI2OTY2MDQyOTU2NzgxNjY1RS02NjcgLT4gMzQ5NTY4MzAuMzQ5ODIzMzA2ODE1OTExODg3NDY5NzYwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDM4IGFkZCAtNzYzLjQ0MDA2Nzc4MTI1NjYzMjY5NTc5MTk4MTg5MzYwOCAxOS45MjYzODExMzUwNjExMDA3ODMzMjIwNjIwNzQ1NDEzIC0+IC03NDMuNTEzNjg2NjQ2MTk1NTMxOTEyNDY5OTE5ODE5MDY3IEluZXhhY3QgUm91bmRlZAorY29teDM0MzggY29tcGFyZSAtNzYzLjQ0MDA2Nzc4MTI1NjYzMjY5NTc5MTk4MTg5MzYwOCAxOS45MjYzODExMzUwNjExMDA3ODMzMjIwNjIwNzQ1NDEzIC0+IC0xCitkaXZ4MzQzOCBkaXZpZGUgLTc2My40NDAwNjc3ODEyNTY2MzI2OTU3OTE5ODE4OTM2MDggMTkuOTI2MzgxMTM1MDYxMTAwNzgzMzIyMDYyMDc0NTQxMyAtPiAtMzguMzEzMDMxNDgzNTcyMjc2NjgwNzcwMzU4NTQzNTY4OCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDM4IGRpdmlkZWludCAtNzYzLjQ0MDA2Nzc4MTI1NjYzMjY5NTc5MTk4MTg5MzYwOCAxOS45MjYzODExMzUwNjExMDA3ODMzMjIwNjIwNzQ1NDEzIC0+IC0zOAorbXVseDM0MzggbXVsdGlwbHkgLTc2My40NDAwNjc3ODEyNTY2MzI2OTU3OTE5ODE4OTM2MDggMTkuOTI2MzgxMTM1MDYxMTAwNzgzMzIyMDYyMDc0NTQxMyAtPiAtMTUyMTIuNTk3NzY0Mzg2MjAwMjU4NTAzOTM2NDg2ODg4MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDM4IHBvd2VyIC03NjMuNDQwMDY3NzgxMjU2NjMyNjk1NzkxOTgxODkzNjA4IDIwIC0+IDQuNTIzNzU0MDc3MjczMzY3Njk1NTI0ODE2NjEyNTA5MjRFKzU3IEluZXhhY3QgUm91bmRlZAorcmVteDM0MzggcmVtYWluZGVyIC03NjMuNDQwMDY3NzgxMjU2NjMyNjk1NzkxOTgxODkzNjA4IDE5LjkyNjM4MTEzNTA2MTEwMDc4MzMyMjA2MjA3NDU0MTMgLT4gLTYuMjM3NTg0NjQ4OTM0ODAyOTI5NTUzNjIzMDYxMDM4Ngorc3VieDM0Mzggc3VidHJhY3QgLTc2My40NDAwNjc3ODEyNTY2MzI2OTU3OTE5ODE4OTM2MDggMTkuOTI2MzgxMTM1MDYxMTAwNzgzMzIyMDYyMDc0NTQxMyAtPiAtNzgzLjM2NjQ0ODkxNjMxNzczMzQ3OTExNDA0Mzk2ODE0OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDM5IGFkZCAtNTEwNDcyMDI3ODY4NDQwNjY3Njg0NTc1MTQ3NTU2NjU0RSs3ODkgODM0ODcyMzc4NTUwODAxODg5OTgzOTI3MTQ4NTg3OTA5IC0+IC01LjEwNDcyMDI3ODY4NDQwNjY3Njg0NTc1MTQ3NTU2NjU0RSs4MjEgSW5leGFjdCBSb3VuZGVkCitjb214MzQzOSBjb21wYXJlIC01MTA0NzIwMjc4Njg0NDA2Njc2ODQ1NzUxNDc1NTY2NTRFKzc4OSA4MzQ4NzIzNzg1NTA4MDE4ODk5ODM5MjcxNDg1ODc5MDkgLT4gLTEKK2RpdngzNDM5IGRpdmlkZSAtNTEwNDcyMDI3ODY4NDQwNjY3Njg0NTc1MTQ3NTU2NjU0RSs3ODkgODM0ODcyMzc4NTUwODAxODg5OTgzOTI3MTQ4NTg3OTA5IC0+IC02LjExNDM3MTk4MDQ3NjAzNzU0MTA3NTI2ODc0MDcxNzM3RSs3ODggSW5leGFjdCBSb3VuZGVkCitkdml4MzQzOSBkaXZpZGVpbnQgLTUxMDQ3MjAyNzg2ODQ0MDY2NzY4NDU3NTE0NzU1NjY1NEUrNzg5IDgzNDg3MjM3ODU1MDgwMTg4OTk4MzkyNzE0ODU4NzkwOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0MzkgbXVsdGlwbHkgLTUxMDQ3MjAyNzg2ODQ0MDY2NzY4NDU3NTE0NzU1NjY1NEUrNzg5IDgzNDg3MjM3ODU1MDgwMTg4OTk4MzkyNzE0ODU4NzkwOSAtPiAtNC4yNjE3ODk5NjA5MDE3NjI4OTExNTU5NDA1NzQxOTg5MkUrODU0IEluZXhhY3QgUm91bmRlZAorcG93eDM0MzkgcG93ZXIgLTUxMDQ3MjAyNzg2ODQ0MDY2NzY4NDU3NTE0NzU1NjY1NEUrNzg5IDggLT4gNC42MTA3OTI2NjYxOTUyMjE0NzI2MjYwMDc1NTI3NDE4MkUrNjU3MyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDM5IHJlbWFpbmRlciAtNTEwNDcyMDI3ODY4NDQwNjY3Njg0NTc1MTQ3NTU2NjU0RSs3ODkgODM0ODcyMzc4NTUwODAxODg5OTgzOTI3MTQ4NTg3OTA5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQzOSBzdWJ0cmFjdCAtNTEwNDcyMDI3ODY4NDQwNjY3Njg0NTc1MTQ3NTU2NjU0RSs3ODkgODM0ODcyMzc4NTUwODAxODg5OTgzOTI3MTQ4NTg3OTA5IC0+IC01LjEwNDcyMDI3ODY4NDQwNjY3Njg0NTc1MTQ3NTU2NjU0RSs4MjEgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ0MCBhZGQgMDcwMzA0NzYxLjU2MDUxNzA4NjY3Njk5MzUwMzAzNDgyOEUtMDk0IC0xNzc3My43NDQ2OTU5NzcxMDc3MTA0MDU3ODQ1MjczOTkyRS03NjEgLT4gNy4wMzA0NzYxNTYwNTE3MDg2Njc2OTkzNTAzMDM0ODI4MEUtODcgSW5leGFjdCBSb3VuZGVkCitjb214MzQ0MCBjb21wYXJlIDA3MDMwNDc2MS41NjA1MTcwODY2NzY5OTM1MDMwMzQ4MjhFLTA5NCAtMTc3NzMuNzQ0Njk1OTc3MTA3NzEwNDA1Nzg0NTI3Mzk5MkUtNzYxIC0+IDEKK2RpdngzNDQwIGRpdmlkZSAwNzAzMDQ3NjEuNTYwNTE3MDg2Njc2OTkzNTAzMDM0ODI4RS0wOTQgLTE3NzczLjc0NDY5NTk3NzEwNzcxMDQwNTc4NDUyNzM5OTJFLTc2MSAtPiAtMy45NTU1NDAxOTQ5OTUwMjUzNzc0Mzg4MzQ4MzQwMjYwOEUrNjcwIEluZXhhY3QgUm91bmRlZAorZHZpeDM0NDAgZGl2aWRlaW50IDA3MDMwNDc2MS41NjA1MTcwODY2NzY5OTM1MDMwMzQ4MjhFLTA5NCAtMTc3NzMuNzQ0Njk1OTc3MTA3NzEwNDA1Nzg0NTI3Mzk5MkUtNzYxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ0MCBtdWx0aXBseSAwNzAzMDQ3NjEuNTYwNTE3MDg2Njc2OTkzNTAzMDM0ODI4RS0wOTQgLTE3NzczLjc0NDY5NTk3NzEwNzcxMDQwNTc4NDUyNzM5OTJFLTc2MSAtPiAtMS4yNDk1Nzg4ODI4ODgxNzU4MTUzODEwODk5MTQ1MzczMkUtODQzIEluZXhhY3QgUm91bmRlZAorcG93eDM0NDAgcG93ZXIgMDcwMzA0NzYxLjU2MDUxNzA4NjY3Njk5MzUwMzAzNDgyOEUtMDk0IC0yIC0+IDIuMDIzMTYxMzU0Mjc2MzE0ODg0Nzk5MDI5MTk5NTk2MjdFKzE3MiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDQwIHJlbWFpbmRlciAwNzAzMDQ3NjEuNTYwNTE3MDg2Njc2OTkzNTAzMDM0ODI4RS0wOTQgLTE3NzczLjc0NDY5NTk3NzEwNzcxMDQwNTc4NDUyNzM5OTJFLTc2MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0NDAgc3VidHJhY3QgMDcwMzA0NzYxLjU2MDUxNzA4NjY3Njk5MzUwMzAzNDgyOEUtMDk0IC0xNzc3My43NDQ2OTU5NzcxMDc3MTA0MDU3ODQ1MjczOTkyRS03NjEgLT4gNy4wMzA0NzYxNTYwNTE3MDg2Njc2OTkzNTAzMDM0ODI4MEUtODcgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ0MSBhZGQgLTA5NzA3MjU2OTc2NjIuMjc2MDU0NTQzMzYyMzExOTU0NjMgLTQ1NDEuNDE4OTc1NDY2OTcxODcxNTc5MTM4ODY0MzM0NzQgLT4gLTk3MDcyNTcwMjIwMy42OTUwMzAwMTAzMzQxODM1MzM3NjkgSW5leGFjdCBSb3VuZGVkCitjb214MzQ0MSBjb21wYXJlIC0wOTcwNzI1Njk3NjYyLjI3NjA1NDU0MzM2MjMxMTk1NDYzIC00NTQxLjQxODk3NTQ2Njk3MTg3MTU3OTEzODg2NDMzNDc0IC0+IC0xCitkaXZ4MzQ0MSBkaXZpZGUgLTA5NzA3MjU2OTc2NjIuMjc2MDU0NTQzMzYyMzExOTU0NjMgLTQ1NDEuNDE4OTc1NDY2OTcxODcxNTc5MTM4ODY0MzM0NzQgLT4gMjEzNzQ5NDI1LjY1NDQ0NzgxMTY5ODg4NDAwNzU1MzYxNCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDQxIGRpdmlkZWludCAtMDk3MDcyNTY5NzY2Mi4yNzYwNTQ1NDMzNjIzMTE5NTQ2MyAtNDU0MS40MTg5NzU0NjY5NzE4NzE1NzkxMzg4NjQzMzQ3NCAtPiAyMTM3NDk0MjUKK211bHgzNDQxIG11bHRpcGx5IC0wOTcwNzI1Njk3NjYyLjI3NjA1NDU0MzM2MjMxMTk1NDYzIC00NTQxLjQxODk3NTQ2Njk3MTg3MTU3OTEzODg2NDMzNDc0IC0+IDQ0MDg0NzIxMDMzMzY4NzUuMjExNjE4Njc4OTE3MjQzOTIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ0MSBwb3dlciAtMDk3MDcyNTY5NzY2Mi4yNzYwNTQ1NDMzNjIzMTE5NTQ2MyAtNDU0MSAtPiAtMEUtMTAwMzEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDM0NDEgcmVtYWluZGVyIC0wOTcwNzI1Njk3NjYyLjI3NjA1NDU0MzM2MjMxMTk1NDYzIC00NTQxLjQxODk3NTQ2Njk3MTg3MTU3OTEzODg2NDMzNDc0IC0+IC0yOTcyLjEyMTcxMDUwMjE0NzUzNzcwNzkyNjMxNzQ3NTUwCitzdWJ4MzQ0MSBzdWJ0cmFjdCAtMDk3MDcyNTY5NzY2Mi4yNzYwNTQ1NDMzNjIzMTE5NTQ2MyAtNDU0MS40MTg5NzU0NjY5NzE4NzE1NzkxMzg4NjQzMzQ3NCAtPiAtOTcwNzI1NjkzMTIwLjg1NzA3OTA3NjM5MDQ0MDM3NTQ5MSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDQyIGFkZCAtODA4MTc4MjM4NjMxODQ0MjY4MzE2MTExMjU5NTU4Njc1IC01OTg0MDAuMjY1MTA4NjQ0NTE0MjExMjQ0OTgwNDI2NTIwIC0+IC04MDgxNzgyMzg2MzE4NDQyNjgzMTYxMTEyNjAxNTcwNzUgSW5leGFjdCBSb3VuZGVkCitjb214MzQ0MiBjb21wYXJlIC04MDgxNzgyMzg2MzE4NDQyNjgzMTYxMTEyNTk1NTg2NzUgLTU5ODQwMC4yNjUxMDg2NDQ1MTQyMTEyNDQ5ODA0MjY1MjAgLT4gLTEKK2RpdngzNDQyIGRpdmlkZSAtODA4MTc4MjM4NjMxODQ0MjY4MzE2MTExMjU5NTU4Njc1IC01OTg0MDAuMjY1MTA4NjQ0NTE0MjExMjQ0OTgwNDI2NTIwIC0+IDEzNTA1NjQ2NDAwMTU4NDc2MzUxNzg5NDU4ODQuOTc4MzYgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ0MiBkaXZpZGVpbnQgLTgwODE3ODIzODYzMTg0NDI2ODMxNjExMTI1OTU1ODY3NSAtNTk4NDAwLjI2NTEwODY0NDUxNDIxMTI0NDk4MDQyNjUyMCAtPiAxMzUwNTY0NjQwMDE1ODQ3NjM1MTc4OTQ1ODg0CittdWx4MzQ0MiBtdWx0aXBseSAtODA4MTc4MjM4NjMxODQ0MjY4MzE2MTExMjU5NTU4Njc1IC01OTg0MDAuMjY1MTA4NjQ0NTE0MjExMjQ0OTgwNDI2NTIwIC0+IDQuODM2MTQwNzIyNTIzMzI5Nzk3MzEzNDg0MjMxNDUyMDhFKzM4IEluZXhhY3QgUm91bmRlZAorcG93eDM0NDIgcG93ZXIgLTgwODE3ODIzODYzMTg0NDI2ODMxNjExMTI1OTU1ODY3NSAtNTk4NDAwIC0+IDBFLTEwMDMxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzNDQyIHJlbWFpbmRlciAtODA4MTc4MjM4NjMxODQ0MjY4MzE2MTExMjU5NTU4Njc1IC01OTg0MDAuMjY1MTA4NjQ0NTE0MjExMjQ0OTgwNDI2NTIwIC0+IC01ODU0NTIuMDk3NzY0NTM2NTcwOTU2ODEzNjgxNTU2MzIwCitzdWJ4MzQ0MiBzdWJ0cmFjdCAtODA4MTc4MjM4NjMxODQ0MjY4MzE2MTExMjU5NTU4Njc1IC01OTg0MDAuMjY1MTA4NjQ0NTE0MjExMjQ0OTgwNDI2NTIwIC0+IC04MDgxNzgyMzg2MzE4NDQyNjgzMTYxMTEyNTg5NjAyNzUgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ0MyBhZGQgLTkuOTA4MjY1OTUwNjkwNTM1NjQzMTEzNzE3NjYzMTUyMDAgLTAzMS42MjU5MTY3ODEzMDc4NDc4NjQ4NzIzMjk4MDY2NDYgLT4gLTQxLjUzNDE4MjczMTk5ODM4MzUwNzk4NjA0NzQ2OTc5ODAgUm91bmRlZAorY29teDM0NDMgY29tcGFyZSAtOS45MDgyNjU5NTA2OTA1MzU2NDMxMTM3MTc2NjMxNTIwMCAtMDMxLjYyNTkxNjc4MTMwNzg0Nzg2NDg3MjMyOTgwNjY0NiAtPiAxCitkaXZ4MzQ0MyBkaXZpZGUgLTkuOTA4MjY1OTUwNjkwNTM1NjQzMTEzNzE3NjYzMTUyMDAgLTAzMS42MjU5MTY3ODEzMDc4NDc4NjQ4NzIzMjk4MDY2NDYgLT4gMC4zMTMyOTU3NzAwMjMyMzMyMTg2MzkyMTMxNDA1OTk4NTYgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ0MyBkaXZpZGVpbnQgLTkuOTA4MjY1OTUwNjkwNTM1NjQzMTEzNzE3NjYzMTUyMDAgLTAzMS42MjU5MTY3ODEzMDc4NDc4NjQ4NzIzMjk4MDY2NDYgLT4gMAorbXVseDM0NDMgbXVsdGlwbHkgLTkuOTA4MjY1OTUwNjkwNTM1NjQzMTEzNzE3NjYzMTUyMDAgLTAzMS42MjU5MTY3ODEzMDc4NDc4NjQ4NzIzMjk4MDY2NDYgLT4gMzEzLjM1Nzk5NDQwMzYwNDk2ODI1MDkzNjAzNjk3ODA4NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDQzIHBvd2VyIC05LjkwODI2NTk1MDY5MDUzNTY0MzExMzcxNzY2MzE1MjAwIC0zMiAtPiAxLjM0Mjk5Njk4MjU5MDM4MDAzMDExNDM5NTY4MDA0NjI1RS0zMiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDQzIHJlbWFpbmRlciAtOS45MDgyNjU5NTA2OTA1MzU2NDMxMTM3MTc2NjMxNTIwMCAtMDMxLjYyNTkxNjc4MTMwNzg0Nzg2NDg3MjMyOTgwNjY0NiAtPiAtOS45MDgyNjU5NTA2OTA1MzU2NDMxMTM3MTc2NjMxNTIwMAorc3VieDM0NDMgc3VidHJhY3QgLTkuOTA4MjY1OTUwNjkwNTM1NjQzMTEzNzE3NjYzMTUyMDAgLTAzMS42MjU5MTY3ODEzMDc4NDc4NjQ4NzIzMjk4MDY2NDYgLT4gMjEuNzE3NjUwODMwNjE3MzEyMjIxNzU4NjEyMTQzNDk0MCBSb3VuZGVkCithZGR4MzQ0NCBhZGQgLTE5NjkyNS40Njk4OTE4OTc3MTkxNjA2OTg0ODM3NTI5MDcgLTQxMjY4Ljk5NzU0NDQ1MzM3OTQwNjc3MjM5NTg3Mzk3NzggLT4gLTIzODE5NC40Njc0MzYzNTEwOTg1Njc0NzA4Nzk2MjY4ODUgSW5leGFjdCBSb3VuZGVkCitjb214MzQ0NCBjb21wYXJlIC0xOTY5MjUuNDY5ODkxODk3NzE5MTYwNjk4NDgzNzUyOTA3IC00MTI2OC45OTc1NDQ0NTMzNzk0MDY3NzIzOTU4NzM5Nzc4IC0+IC0xCitkaXZ4MzQ0NCBkaXZpZGUgLTE5NjkyNS40Njk4OTE4OTc3MTkxNjA2OTg0ODM3NTI5MDcgLTQxMjY4Ljk5NzU0NDQ1MzM3OTQwNjc3MjM5NTg3Mzk3NzggLT4gNC43NzE3NTMxNzA4ODI3NDcxNTIyNjU1MzUxNjgyMDU4OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDQ0IGRpdmlkZWludCAtMTk2OTI1LjQ2OTg5MTg5NzcxOTE2MDY5ODQ4Mzc1MjkwNyAtNDEyNjguOTk3NTQ0NDUzMzc5NDA2NzcyMzk1ODczOTc3OCAtPiA0CittdWx4MzQ0NCBtdWx0aXBseSAtMTk2OTI1LjQ2OTg5MTg5NzcxOTE2MDY5ODQ4Mzc1MjkwNyAtNDEyNjguOTk3NTQ0NDUzMzc5NDA2NzcyMzk1ODczOTc3OCAtPiA4MTI2OTE2NzMzLjQwOTA1NDg3MDI2MDAzMTM1OTg3NDcyIEluZXhhY3QgUm91bmRlZAorcG93eDM0NDQgcG93ZXIgLTE5NjkyNS40Njk4OTE4OTc3MTkxNjA2OTg0ODM3NTI5MDcgLTQxMjY5IC0+IC0wRS0xMDAzMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzQ0NCByZW1haW5kZXIgLTE5NjkyNS40Njk4OTE4OTc3MTkxNjA2OTg0ODM3NTI5MDcgLTQxMjY4Ljk5NzU0NDQ1MzM3OTQwNjc3MjM5NTg3Mzk3NzggLT4gLTMxODQ5LjQ3OTcxNDA4NDIwMTUzMzYwODkwMDI1Njk5NTgKK3N1YngzNDQ0IHN1YnRyYWN0IC0xOTY5MjUuNDY5ODkxODk3NzE5MTYwNjk4NDgzNzUyOTA3IC00MTI2OC45OTc1NDQ0NTMzNzk0MDY3NzIzOTU4NzM5Nzc4IC0+IC0xNTU2NTYuNDcyMzQ3NDQ0MzM5NzUzOTI2MDg3ODc4OTI5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NDUgYWRkIDQyMTA3MTEzNTIxMjE1MjIyNTE2MjA4NjAwNTgyNDMxMCAxMzM1MzIwMzMwLjA4OTY0MzU0ODQ1Nzk2NTEwMTQ1MjQ2RS02MDQgLT4gNDIxMDcxMTM1MjEyMTUyMjI1MTYyMDg2MDA1ODI0MzEwIEluZXhhY3QgUm91bmRlZAorY29teDM0NDUgY29tcGFyZSA0MjEwNzExMzUyMTIxNTIyMjUxNjIwODYwMDU4MjQzMTAgMTMzNTMyMDMzMC4wODk2NDM1NDg0NTc5NjUxMDE0NTI0NkUtNjA0IC0+IDEKK2RpdngzNDQ1IGRpdmlkZSA0MjEwNzExMzUyMTIxNTIyMjUxNjIwODYwMDU4MjQzMTAgMTMzNTMyMDMzMC4wODk2NDM1NDg0NTc5NjUxMDE0NTI0NkUtNjA0IC0+IDMuMTUzMzM0MjY1MzczNDk3NDQyODE4NjAwMDU0OTczMDRFKzYyNyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDQ1IGRpdmlkZWludCA0MjEwNzExMzUyMTIxNTIyMjUxNjIwODYwMDU4MjQzMTAgMTMzNTMyMDMzMC4wODk2NDM1NDg0NTc5NjUxMDE0NTI0NkUtNjA0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ0NSBtdWx0aXBseSA0MjEwNzExMzUyMTIxNTIyMjUxNjIwODYwMDU4MjQzMTAgMTMzNTMyMDMzMC4wODk2NDM1NDg0NTc5NjUxMDE0NTI0NkUtNjA0IC0+IDUuNjIyNjQ4NDcyNjI3MTIwNDAwMjczMTE5MzIxMjE0NjBFLTU2MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDQ1IHBvd2VyIDQyMTA3MTEzNTIxMjE1MjIyNTE2MjA4NjAwNTgyNDMxMCAxIC0+IDQyMTA3MTEzNTIxMjE1MjIyNTE2MjA4NjAwNTgyNDMxMAorcmVteDM0NDUgcmVtYWluZGVyIDQyMTA3MTEzNTIxMjE1MjIyNTE2MjA4NjAwNTgyNDMxMCAxMzM1MzIwMzMwLjA4OTY0MzU0ODQ1Nzk2NTEwMTQ1MjQ2RS02MDQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDQ1IHN1YnRyYWN0IDQyMTA3MTEzNTIxMjE1MjIyNTE2MjA4NjAwNTgyNDMxMCAxMzM1MzIwMzMwLjA4OTY0MzU0ODQ1Nzk2NTEwMTQ1MjQ2RS02MDQgLT4gNDIxMDcxMTM1MjEyMTUyMjI1MTYyMDg2MDA1ODI0MzEwIEluZXhhY3QgUm91bmRlZAorYWRkeDM0NDYgYWRkIDEyNDk0NDEuNDY0MjE1MTQyODIzMDExODI3NzIyNDcyMjcgLTAyODk4NDguNzEyMDg5MTIyODE5NzYzNzQ3MDUxODA4MzZFLTY3NiAtPiAxMjQ5NDQxLjQ2NDIxNTE0MjgyMzAxMTgyNzcyMjQ3MjI3IEluZXhhY3QgUm91bmRlZAorY29teDM0NDYgY29tcGFyZSAxMjQ5NDQxLjQ2NDIxNTE0MjgyMzAxMTgyNzcyMjQ3MjI3IC0wMjg5ODQ4LjcxMjA4OTEyMjgxOTc2Mzc0NzA1MTgwODM2RS02NzYgLT4gMQorZGl2eDM0NDYgZGl2aWRlIDEyNDk0NDEuNDY0MjE1MTQyODIzMDExODI3NzIyNDcyMjcgLTAyODk4NDguNzEyMDg5MTIyODE5NzYzNzQ3MDUxODA4MzZFLTY3NiAtPiAtNC4zMTA2Njc2NDE3ODMyODk5MjQ0MDYzNTM4NzI1NTgxNkUrNjc2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NDYgZGl2aWRlaW50IDEyNDk0NDEuNDY0MjE1MTQyODIzMDExODI3NzIyNDcyMjcgLTAyODk4NDguNzEyMDg5MTIyODE5NzYzNzQ3MDUxODA4MzZFLTY3NiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0NDYgbXVsdGlwbHkgMTI0OTQ0MS40NjQyMTUxNDI4MjMwMTE4Mjc3MjI0NzIyNyAtMDI4OTg0OC43MTIwODkxMjI4MTk3NjM3NDcwNTE4MDgzNkUtNjc2IC0+IC0zLjYyMTQ4OTk5MjMzNTA2OTg0NTY2NjIwNjExNzAwMzQ5RS02NjUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ0NiBwb3dlciAxMjQ5NDQxLjQ2NDIxNTE0MjgyMzAxMTgyNzcyMjQ3MjI3IC0zIC0+IDUuMTI2ODY5NDI1NzIxOTEyODIzNDg0MTUwMjQ5MzIzMjJFLTE5IEluZXhhY3QgUm91bmRlZAorcmVteDM0NDYgcmVtYWluZGVyIDEyNDk0NDEuNDY0MjE1MTQyODIzMDExODI3NzIyNDcyMjcgLTAyODk4NDguNzEyMDg5MTIyODE5NzYzNzQ3MDUxODA4MzZFLTY3NiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0NDYgc3VidHJhY3QgMTI0OTQ0MS40NjQyMTUxNDI4MjMwMTE4Mjc3MjI0NzIyNyAtMDI4OTg0OC43MTIwODkxMjI4MTk3NjM3NDcwNTE4MDgzNkUtNjc2IC0+IDEyNDk0NDEuNDY0MjE1MTQyODIzMDExODI3NzIyNDcyMjcgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ0NyBhZGQgNzQ4MTUwMDAuNDcxNjg3NTU1ODM1ODkzNzI3OTA1MjkwMyAtNjkwNDI1NDAxNzA4MTY3NjIyMTk0MjQxOTE1MTk1MDAxRSs4OTEgLT4gLTYuOTA0MjU0MDE3MDgxNjc2MjIxOTQyNDE5MTUxOTUwMDFFKzkyMyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDQ3IGNvbXBhcmUgNzQ4MTUwMDAuNDcxNjg3NTU1ODM1ODkzNzI3OTA1MjkwMyAtNjkwNDI1NDAxNzA4MTY3NjIyMTk0MjQxOTE1MTk1MDAxRSs4OTEgLT4gMQorZGl2eDM0NDcgZGl2aWRlIDc0ODE1MDAwLjQ3MTY4NzU1NTgzNTg5MzcyNzkwNTI5MDMgLTY5MDQyNTQwMTcwODE2NzYyMjE5NDI0MTkxNTE5NTAwMUUrODkxIC0+IC0xLjA4MzYwNzI5OTAxNTc4NDU1MTA5OTY4Mzg4MzA5MDc5RS05MTYgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ0NyBkaXZpZGVpbnQgNzQ4MTUwMDAuNDcxNjg3NTU1ODM1ODkzNzI3OTA1MjkwMyAtNjkwNDI1NDAxNzA4MTY3NjIyMTk0MjQxOTE1MTk1MDAxRSs4OTEgLT4gLTAKK211bHgzNDQ3IG11bHRpcGx5IDc0ODE1MDAwLjQ3MTY4NzU1NTgzNTg5MzcyNzkwNTI5MDMgLTY5MDQyNTQwMTcwODE2NzYyMjE5NDI0MTkxNTE5NTAwMUUrODkxIC0+IC01LjE2NTQxNzY3NTQ0NjE2MzA4NzMyMDI4ODEwMDI2Mjc1RSs5MzEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ0NyBwb3dlciA3NDgxNTAwMC40NzE2ODc1NTU4MzU4OTM3Mjc5MDUyOTAzIC03IC0+IDcuNjIyMTgwMzIyNTI2ODM4MTU1Mzc5MDY5NzI0Mzk5ODVFLTU2IEluZXhhY3QgUm91bmRlZAorcmVteDM0NDcgcmVtYWluZGVyIDc0ODE1MDAwLjQ3MTY4NzU1NTgzNTg5MzcyNzkwNTI5MDMgLTY5MDQyNTQwMTcwODE2NzYyMjE5NDI0MTkxNTE5NTAwMUUrODkxIC0+IDc0ODE1MDAwLjQ3MTY4NzU1NTgzNTg5MzcyNzkwNTI5MDMKK3N1YngzNDQ3IHN1YnRyYWN0IDc0ODE1MDAwLjQ3MTY4NzU1NTgzNTg5MzcyNzkwNTI5MDMgLTY5MDQyNTQwMTcwODE2NzYyMjE5NDI0MTkxNTE5NTAwMUUrODkxIC0+IDYuOTA0MjU0MDE3MDgxNjc2MjIxOTQyNDE5MTUxOTUwMDFFKzkyMyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDQ4IGFkZCAtMTY4Mzk5My41MTIxMDI0MTU1NTY2ODc5MDU1Njc1OTAyMSAtNzIzOTQzODQ5MjczNDQuODQwMjU4NTIyODI2NzQ5MzM3NCAtPiAtNzIzOTQzODY2MTEzMzguMzUyMzYwOTM4MzgzNDM3MjQzMCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDQ4IGNvbXBhcmUgLTE2ODM5OTMuNTEyMTAyNDE1NTU2Njg3OTA1NTY3NTkwMjEgLTcyMzk0Mzg0OTI3MzQ0Ljg0MDI1ODUyMjgyNjc0OTMzNzQgLT4gMQorZGl2eDM0NDggZGl2aWRlIC0xNjgzOTkzLjUxMjEwMjQxNTU1NjY4NzkwNTU2NzU5MDIxIC03MjM5NDM4NDkyNzM0NC44NDAyNTg1MjI4MjY3NDkzMzc0IC0+IDIuMzI2MTM4Mjk2MjEyNDQxMTMyODQzMDEwMDQxNTg3OTRFLTggSW5leGFjdCBSb3VuZGVkCitkdml4MzQ0OCBkaXZpZGVpbnQgLTE2ODM5OTMuNTEyMTAyNDE1NTU2Njg3OTA1NTY3NTkwMjEgLTcyMzk0Mzg0OTI3MzQ0Ljg0MDI1ODUyMjgyNjc0OTMzNzQgLT4gMAorbXVseDM0NDggbXVsdGlwbHkgLTE2ODM5OTMuNTEyMTAyNDE1NTU2Njg3OTA1NTY3NTkwMjEgLTcyMzk0Mzg0OTI3MzQ0Ljg0MDI1ODUyMjgyNjc0OTMzNzQgLT4gMTIxOTExNjc0NTMwMjkzNjEzNjE1LjQ0MTM4NDgyMjM4MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDQ4IHBvd2VyIC0xNjgzOTkzLjUxMjEwMjQxNTU1NjY4NzkwNTU2NzU5MDIxIC03IC0+IC0yLjYwMzg1NjgzNTA5OTU2ODg5MDAwNjc2MTEzODYwMjkyRS00NCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDQ4IHJlbWFpbmRlciAtMTY4Mzk5My41MTIxMDI0MTU1NTY2ODc5MDU1Njc1OTAyMSAtNzIzOTQzODQ5MjczNDQuODQwMjU4NTIyODI2NzQ5MzM3NCAtPiAtMTY4Mzk5My41MTIxMDI0MTU1NTY2ODc5MDU1Njc1OTAyMQorc3VieDM0NDggc3VidHJhY3QgLTE2ODM5OTMuNTEyMTAyNDE1NTU2Njg3OTA1NTY3NTkwMjEgLTcyMzk0Mzg0OTI3MzQ0Ljg0MDI1ODUyMjgyNjc0OTMzNzQgLT4gNzIzOTQzODMyNDMzNTEuMzI4MTU2MTA3MjcwMDYxNDMxOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDQ5IGFkZCAtNzYzLjE0ODUzMDk3NDc0MTc2NjE3MTc1Njk3MDQ0ODE1OCA1MTczNzAuODA4OTU2OTU3NjAxNDczNjQyMjcyNjY0NjQ3IC0+IDUxNjYwNy42NjA0MjU5ODI4NTk3MDc0NzA1MTU2OTQxOTkgSW5leGFjdCBSb3VuZGVkCitjb214MzQ0OSBjb21wYXJlIC03NjMuMTQ4NTMwOTc0NzQxNzY2MTcxNzU2OTcwNDQ4MTU4IDUxNzM3MC44MDg5NTY5NTc2MDE0NzM2NDIyNzI2NjQ2NDcgLT4gLTEKK2RpdngzNDQ5IGRpdmlkZSAtNzYzLjE0ODUzMDk3NDc0MTc2NjE3MTc1Njk3MDQ0ODE1OCA1MTczNzAuODA4OTU2OTU3NjAxNDczNjQyMjcyNjY0NjQ3IC0+IC0wLjAwMTQ3NTA1MTM5MDE0OTUxOTQ2MzgxMTU1NTI1MTczODY3IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NDkgZGl2aWRlaW50IC03NjMuMTQ4NTMwOTc0NzQxNzY2MTcxNzU2OTcwNDQ4MTU4IDUxNzM3MC44MDg5NTY5NTc2MDE0NzM2NDIyNzI2NjQ2NDcgLT4gLTAKK211bHgzNDQ5IG11bHRpcGx5IC03NjMuMTQ4NTMwOTc0NzQxNzY2MTcxNzU2OTcwNDQ4MTU4IDUxNzM3MC44MDg5NTY5NTc2MDE0NzM2NDIyNzI2NjQ2NDcgLT4gLTM5NDgzMDc3Mi44MjQ3MTU5NjI5MjUzNTE0NDczMjIxODcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ0OSBwb3dlciAtNzYzLjE0ODUzMDk3NDc0MTc2NjE3MTc1Njk3MDQ0ODE1OCA1MTczNzEgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDM0NDkgcmVtYWluZGVyIC03NjMuMTQ4NTMwOTc0NzQxNzY2MTcxNzU2OTcwNDQ4MTU4IDUxNzM3MC44MDg5NTY5NTc2MDE0NzM2NDIyNzI2NjQ2NDcgLT4gLTc2My4xNDg1MzA5NzQ3NDE3NjYxNzE3NTY5NzA0NDgxNTgKK3N1YngzNDQ5IHN1YnRyYWN0IC03NjMuMTQ4NTMwOTc0NzQxNzY2MTcxNzU2OTcwNDQ4MTU4IDUxNzM3MC44MDg5NTY5NTc2MDE0NzM2NDIyNzI2NjQ2NDcgLT4gLTUxODEzMy45NTc0ODc5MzIzNDMyMzk4MTQwMjk2MzUwOTUgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ1MCBhZGQgLTc3LjU4NDEzMzg4MTIzMTI1MjM0NjA1OTEyMjYxNzg3NTQgLTkyNzU0MDQyMi42NDEwMjUwNTA5Njg4MzAxNTQ1NzgxNTFFKzUyNCAtPiAtOS4yNzU0MDQyMjY0MTAyNTA1MDk2ODgzMDE1NDU3ODE1MUUrNTMyIEluZXhhY3QgUm91bmRlZAorY29teDM0NTAgY29tcGFyZSAtNzcuNTg0MTMzODgxMjMxMjUyMzQ2MDU5MTIyNjE3ODc1NCAtOTI3NTQwNDIyLjY0MTAyNTA1MDk2ODgzMDE1NDU3ODE1MUUrNTI0IC0+IDEKK2RpdngzNDUwIGRpdmlkZSAtNzcuNTg0MTMzODgxMjMxMjUyMzQ2MDU5MTIyNjE3ODc1NCAtOTI3NTQwNDIyLjY0MTAyNTA1MDk2ODgzMDE1NDU3ODE1MUUrNTI0IC0+IDguMzY0NTAxNjQxOTE0NzE3Njk5Nzg0MTU3NTgzNDIyMzdFLTUzMiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDUwIGRpdmlkZWludCAtNzcuNTg0MTMzODgxMjMxMjUyMzQ2MDU5MTIyNjE3ODc1NCAtOTI3NTQwNDIyLjY0MTAyNTA1MDk2ODgzMDE1NDU3ODE1MUUrNTI0IC0+IDAKK211bHgzNDUwIG11bHRpcGx5IC03Ny41ODQxMzM4ODEyMzEyNTIzNDYwNTkxMjI2MTc4NzU0IC05Mjc1NDA0MjIuNjQxMDI1MDUwOTY4ODMwMTU0NTc4MTUxRSs1MjQgLT4gNy4xOTYyNDIwMzMwNDM1MTA3MDU2MjQwOTc0NjQ3NTk0M0UrNTM0IEluZXhhY3QgUm91bmRlZAorcG93eDM0NTAgcG93ZXIgLTc3LjU4NDEzMzg4MTIzMTI1MjM0NjA1OTEyMjYxNzg3NTQgLTkgLT4gLTkuODE4NDY4NTY4NzM5Mzg1NDk0NjYzNDE2OTM5OTc4MjlFLTE4IEluZXhhY3QgUm91bmRlZAorcmVteDM0NTAgcmVtYWluZGVyIC03Ny41ODQxMzM4ODEyMzEyNTIzNDYwNTkxMjI2MTc4NzU0IC05Mjc1NDA0MjIuNjQxMDI1MDUwOTY4ODMwMTU0NTc4MTUxRSs1MjQgLT4gLTc3LjU4NDEzMzg4MTIzMTI1MjM0NjA1OTEyMjYxNzg3NTQKK3N1YngzNDUwIHN1YnRyYWN0IC03Ny41ODQxMzM4ODEyMzEyNTIzNDYwNTkxMjI2MTc4NzU0IC05Mjc1NDA0MjIuNjQxMDI1MDUwOTY4ODMwMTU0NTc4MTUxRSs1MjQgLT4gOS4yNzU0MDQyMjY0MTAyNTA1MDk2ODgzMDE1NDU3ODE1MUUrNTMyIEluZXhhY3QgUm91bmRlZAorYWRkeDM0NTEgYWRkIDUxNzYyOTUzMDkuODk5NDM3NDYyMzYxMDIyMDk4Mzc4MTMgLTEyOTczMy4xMDM2Mjg3OTc0NzcxNjc5MDg2OTg1NjU0NjUgLT4gNTE3NjE2NTU3Ni43OTU4MDg2NjQ4ODM4NTQxODk2Nzk1NiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDUxIGNvbXBhcmUgNTE3NjI5NTMwOS44OTk0Mzc0NjIzNjEwMjIwOTgzNzgxMyAtMTI5NzMzLjEwMzYyODc5NzQ3NzE2NzkwODY5ODU2NTQ2NSAtPiAxCitkaXZ4MzQ1MSBkaXZpZGUgNTE3NjI5NTMwOS44OTk0Mzc0NjIzNjEwMjIwOTgzNzgxMyAtMTI5NzMzLjEwMzYyODc5NzQ3NzE2NzkwODY5ODU2NTQ2NSAtPiAtMzk4OTkuNTcyMDA2NzczNjg1NTQ0NDA4OTQzMjUyNDA5NCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDUxIGRpdmlkZWludCA1MTc2Mjk1MzA5Ljg5OTQzNzQ2MjM2MTAyMjA5ODM3ODEzIC0xMjk3MzMuMTAzNjI4Nzk3NDc3MTY3OTA4Njk4NTY1NDY1IC0+IC0zOTg5OQorbXVseDM0NTEgbXVsdGlwbHkgNTE3NjI5NTMwOS44OTk0Mzc0NjIzNjEwMjIwOTgzNzgxMyAtMTI5NzMzLjEwMzYyODc5NzQ3NzE2NzkwODY5ODU2NTQ2NSAtPiAtNjcxNTM2ODU1ODUyNDQyLjA3MTg4NzM4NTUxMjAwMTc5NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDUxIHBvd2VyIDUxNzYyOTUzMDkuODk5NDM3NDYyMzYxMDIyMDk4Mzc4MTMgLTEyOTczMyAtPiAwRS0xMDAzMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzQ1MSByZW1haW5kZXIgNTE3NjI5NTMwOS44OTk0Mzc0NjIzNjEwMjIwOTgzNzgxMyAtMTI5NzMzLjEwMzYyODc5NzQ3NzE2NzkwODY5ODU2NTQ2NSAtPiA3NDIwOC4yMTQwNDY5MjA4Mzg2MzI5MzQzMTQ2NDE5NjUKK3N1YngzNDUxIHN1YnRyYWN0IDUxNzYyOTUzMDkuODk5NDM3NDYyMzYxMDIyMDk4Mzc4MTMgLTEyOTczMy4xMDM2Mjg3OTc0NzcxNjc5MDg2OTg1NjU0NjUgLT4gNTE3NjQyNTA0My4wMDMwNjYyNTk4MzgxOTAwMDcwNzY3MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDUyIGFkZCA0NDcxNjM0ODQxMTY2LjkwMTk3MjI5Mjg2NTMwMzA3MzI2RSsxNzIgMzE1MTExMDQzOTcuODY3MTcyNzAwMzIwMTg5MDgyNTg3OUUtOTU1IC0+IDQuNDcxNjM0ODQxMTY2OTAxOTcyMjkyODY1MzAzMDczMjZFKzE4NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDUyIGNvbXBhcmUgNDQ3MTYzNDg0MTE2Ni45MDE5NzIyOTI4NjUzMDMwNzMyNkUrMTcyIDMxNTExMTA0Mzk3Ljg2NzE3MjcwMDMyMDE4OTA4MjU4NzlFLTk1NSAtPiAxCitkaXZ4MzQ1MiBkaXZpZGUgNDQ3MTYzNDg0MTE2Ni45MDE5NzIyOTI4NjUzMDMwNzMyNkUrMTcyIDMxNTExMTA0Mzk3Ljg2NzE3MjcwMDMyMDE4OTA4MjU4NzlFLTk1NSAtPiAxLjQxOTA2NjM2NjE2MzE0OTg3NzA1NTM2NzM3MDI1OTMyRSsxMTI5IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NTIgZGl2aWRlaW50IDQ0NzE2MzQ4NDExNjYuOTAxOTcyMjkyODY1MzAzMDczMjZFKzE3MiAzMTUxMTEwNDM5Ny44NjcxNzI3MDAzMjAxODkwODI1ODc5RS05NTUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDUyIG11bHRpcGx5IDQ0NzE2MzQ4NDExNjYuOTAxOTcyMjkyODY1MzAzMDczMjZFKzE3MiAzMTUxMTEwNDM5Ny44NjcxNzI3MDAzMjAxODkwODI1ODc5RS05NTUgLT4gMS40MDkwNjE1MjMwOTE1MDQ0MTAxMDA0NjIyMjIxNDgxMEUtNzYwIEluZXhhY3QgUm91bmRlZAorcG93eDM0NTIgcG93ZXIgNDQ3MTYzNDg0MTE2Ni45MDE5NzIyOTI4NjUzMDMwNzMyNkUrMTcyIDMgLT4gOC45NDEyNjU1NjM4OTY3MzQ5ODM4NjM5NzU2OTI0OTUxNkUrNTUzIEluZXhhY3QgUm91bmRlZAorcmVteDM0NTIgcmVtYWluZGVyIDQ0NzE2MzQ4NDExNjYuOTAxOTcyMjkyODY1MzAzMDczMjZFKzE3MiAzMTUxMTEwNDM5Ny44NjcxNzI3MDAzMjAxODkwODI1ODc5RS05NTUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDUyIHN1YnRyYWN0IDQ0NzE2MzQ4NDExNjYuOTAxOTcyMjkyODY1MzAzMDczMjZFKzE3MiAzMTUxMTEwNDM5Ny44NjcxNzI3MDAzMjAxODkwODI1ODc5RS05NTUgLT4gNC40NzE2MzQ4NDExNjY5MDE5NzIyOTI4NjUzMDMwNzMyNkUrMTg0IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NTMgYWRkIC04MTg5MTMwLjE1OTQ1MjMxMDQ5NjcwMjg1NzI2Nzc0MzE3IDIuNTc5MTI0MDI4NzE0MDQzMjU4MzE2NzA5MjM4NjQ5MzZFLTM2NiAtPiAtODE4OTEzMC4xNTk0NTIzMTA0OTY3MDI4NTcyNjc3NDMxNyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDUzIGNvbXBhcmUgLTgxODkxMzAuMTU5NDUyMzEwNDk2NzAyODU3MjY3NzQzMTcgMi41NzkxMjQwMjg3MTQwNDMyNTgzMTY3MDkyMzg2NDkzNkUtMzY2IC0+IC0xCitkaXZ4MzQ1MyBkaXZpZGUgLTgxODkxMzAuMTU5NDUyMzEwNDk2NzAyODU3MjY3NzQzMTcgMi41NzkxMjQwMjg3MTQwNDMyNTgzMTY3MDkyMzg2NDkzNkUtMzY2IC0+IC0zLjE3NTE1OTQ5OTIyNTU2Nzc4MzQzNTI2MDk5ODMwMDkzRSszNzIgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ1MyBkaXZpZGVpbnQgLTgxODkxMzAuMTU5NDUyMzEwNDk2NzAyODU3MjY3NzQzMTcgMi41NzkxMjQwMjg3MTQwNDMyNTgzMTY3MDkyMzg2NDkzNkUtMzY2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ1MyBtdWx0aXBseSAtODE4OTEzMC4xNTk0NTIzMTA0OTY3MDI4NTcyNjc3NDMxNyAyLjU3OTEyNDAyODcxNDA0MzI1ODMxNjcwOTIzODY0OTM2RS0zNjYgLT4gLTIuMTEyMDc4MjM2ODUxMDMxODUwMzk5NzkxNDQxNjE4NDhFLTM1OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDUzIHBvd2VyIC04MTg5MTMwLjE1OTQ1MjMxMDQ5NjcwMjg1NzI2Nzc0MzE3IDMgLT4gLTU0OTE3ODI0MTA1NDg3NTk4MjczMS4wMDA5Mzc4NzU4ODUgSW5leGFjdCBSb3VuZGVkCityZW14MzQ1MyByZW1haW5kZXIgLTgxODkxMzAuMTU5NDUyMzEwNDk2NzAyODU3MjY3NzQzMTcgMi41NzkxMjQwMjg3MTQwNDMyNTgzMTY3MDkyMzg2NDkzNkUtMzY2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ1MyBzdWJ0cmFjdCAtODE4OTEzMC4xNTk0NTIzMTA0OTY3MDI4NTcyNjc3NDMxNyAyLjU3OTEyNDAyODcxNDA0MzI1ODMxNjcwOTIzODY0OTM2RS0zNjYgLT4gLTgxODkxMzAuMTU5NDUyMzEwNDk2NzAyODU3MjY3NzQzMTcgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ1NCBhZGQgLTI1NDM0NjIzMjk4MTM1MzI5MzM5Mjg4ODc4NTY0MzI0NSAtNzY0LjQxNjkwMjQ4NjE1MjA5Mzc1ODI4NzkyOTY3ODQ0NSAtPiAtMjU0MzQ2MjMyOTgxMzUzMjkzMzkyODg4Nzg1NjQ0MDA5IEluZXhhY3QgUm91bmRlZAorY29teDM0NTQgY29tcGFyZSAtMjU0MzQ2MjMyOTgxMzUzMjkzMzkyODg4Nzg1NjQzMjQ1IC03NjQuNDE2OTAyNDg2MTUyMDkzNzU4Mjg3OTI5Njc4NDQ1IC0+IC0xCitkaXZ4MzQ1NCBkaXZpZGUgLTI1NDM0NjIzMjk4MTM1MzI5MzM5Mjg4ODc4NTY0MzI0NSAtNzY0LjQxNjkwMjQ4NjE1MjA5Mzc1ODI4NzkyOTY3ODQ0NSAtPiAzMzI3MzIzNTA4MzM4NTc4ODkyMDQ0MDYzNTY5MDAuNjY1IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NTQgZGl2aWRlaW50IC0yNTQzNDYyMzI5ODEzNTMyOTMzOTI4ODg3ODU2NDMyNDUgLTc2NC40MTY5MDI0ODYxNTIwOTM3NTgyODc5Mjk2Nzg0NDUgLT4gMzMyNzMyMzUwODMzODU3ODg5MjA0NDA2MzU2OTAwCittdWx4MzQ1NCBtdWx0aXBseSAtMjU0MzQ2MjMyOTgxMzUzMjkzMzkyODg4Nzg1NjQzMjQ1IC03NjQuNDE2OTAyNDg2MTUyMDkzNzU4Mjg3OTI5Njc4NDQ1IC0+IDEuOTQ0MjY1NTk1NzQ2MjcyNjIwMDYzMDczMjYzMzYyODlFKzM1IEluZXhhY3QgUm91bmRlZAorcG93eDM0NTQgcG93ZXIgLTI1NDM0NjIzMjk4MTM1MzI5MzM5Mjg4ODc4NTY0MzI0NSAtNzY0IC0+IDBFLTEwMDMxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzNDU0IHJlbWFpbmRlciAtMjU0MzQ2MjMyOTgxMzUzMjkzMzkyODg4Nzg1NjQzMjQ1IC03NjQuNDE2OTAyNDg2MTUyMDkzNzU4Mjg3OTI5Njc4NDQ1IC0+IC01MDguMjk5MzIzOTYyNTM4NjEwNTgwNjY5MDkyOTc5NTAwCitzdWJ4MzQ1NCBzdWJ0cmFjdCAtMjU0MzQ2MjMyOTgxMzUzMjkzMzkyODg4Nzg1NjQzMjQ1IC03NjQuNDE2OTAyNDg2MTUyMDkzNzU4Mjg3OTI5Njc4NDQ1IC0+IC0yNTQzNDYyMzI5ODEzNTMyOTMzOTI4ODg3ODU2NDI0ODEgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ1NSBhZGQgLTI4NzUuMzY3NDU0OTk1NDQxNzc5NjQ4MDQyNzczMjk3MjYgLTEzMTg3Ljg0OTIwNDUwNTQ4MDIyMDU2OTEyNDgyNjc2MzggLT4gLTE2MDYzLjIxNjY1OTUwMDkyMjAwMDIxNzE2NzYwMDA2MTEgSW5leGFjdCBSb3VuZGVkCitjb214MzQ1NSBjb21wYXJlIC0yODc1LjM2NzQ1NDk5NTQ0MTc3OTY0ODA0Mjc3MzI5NzI2IC0xMzE4Ny44NDkyMDQ1MDU0ODAyMjA1NjkxMjQ4MjY3NjM4IC0+IDEKK2RpdngzNDU1IGRpdmlkZSAtMjg3NS4zNjc0NTQ5OTU0NDE3Nzk2NDgwNDI3NzMyOTcyNiAtMTMxODcuODQ5MjA0NTA1NDgwMjIwNTY5MTI0ODI2NzYzOCAtPiAwLjIxODAzMTU2OTA5MTEyMjUyMDM5MTU5OTU0MTU3NTYxNSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDU1IGRpdmlkZWludCAtMjg3NS4zNjc0NTQ5OTU0NDE3Nzk2NDgwNDI3NzMyOTcyNiAtMTMxODcuODQ5MjA0NTA1NDgwMjIwNTY5MTI0ODI2NzYzOCAtPiAwCittdWx4MzQ1NSBtdWx0aXBseSAtMjg3NS4zNjc0NTQ5OTU0NDE3Nzk2NDgwNDI3NzMyOTcyNiAtMTMxODcuODQ5MjA0NTA1NDgwMjIwNTY5MTI0ODI2NzYzOCAtPiAzNzkxOTkxMi40MDQwMjI1ODQwNzI3MjgxNjMzMDI0NjY1IEluZXhhY3QgUm91bmRlZAorcG93eDM0NTUgcG93ZXIgLTI4NzUuMzY3NDU0OTk1NDQxNzc5NjQ4MDQyNzczMjk3MjYgLTEzMTg4IC0+IDBFLTEwMDMxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzNDU1IHJlbWFpbmRlciAtMjg3NS4zNjc0NTQ5OTU0NDE3Nzk2NDgwNDI3NzMyOTcyNiAtMTMxODcuODQ5MjA0NTA1NDgwMjIwNTY5MTI0ODI2NzYzOCAtPiAtMjg3NS4zNjc0NTQ5OTU0NDE3Nzk2NDgwNDI3NzMyOTcyNgorc3VieDM0NTUgc3VidHJhY3QgLTI4NzUuMzY3NDU0OTk1NDQxNzc5NjQ4MDQyNzczMjk3MjYgLTEzMTg3Ljg0OTIwNDUwNTQ4MDIyMDU2OTEyNDgyNjc2MzggLT4gMTAzMTIuNDgxNzQ5NTEwMDM4NDQwOTIxMDgyMDUzNDY2NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDU2IGFkZCAtNy4yNjkyNzU3MDk4NDIxOTk0NDY5MzYwMjE0MDIyMzEwMyAwMTYwODgzMDIxNTQxLjMyMjc1Mjg2NzY5MTEwMDAzOTcxRS00MzggLT4gLTcuMjY5Mjc1NzA5ODQyMTk5NDQ2OTM2MDIxNDAyMjMxMDMgSW5leGFjdCBSb3VuZGVkCitjb214MzQ1NiBjb21wYXJlIC03LjI2OTI3NTcwOTg0MjE5OTQ0NjkzNjAyMTQwMjIzMTAzIDAxNjA4ODMwMjE1NDEuMzIyNzUyODY3NjkxMTAwMDM5NzFFLTQzOCAtPiAtMQorZGl2eDM0NTYgZGl2aWRlIC03LjI2OTI3NTcwOTg0MjE5OTQ0NjkzNjAyMTQwMjIzMTAzIDAxNjA4ODMwMjE1NDEuMzIyNzUyODY3NjkxMTAwMDM5NzFFLTQzOCAtPiAtNC41MTgzNjEwMDU1MzAzOTkxNzU3NDU1NzIzNTI3NTE3M0UrNDI3IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NTYgZGl2aWRlaW50IC03LjI2OTI3NTcwOTg0MjE5OTQ0NjkzNjAyMTQwMjIzMTAzIDAxNjA4ODMwMjE1NDEuMzIyNzUyODY3NjkxMTAwMDM5NzFFLTQzOCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0NTYgbXVsdGlwbHkgLTcuMjY5Mjc1NzA5ODQyMTk5NDQ2OTM2MDIxNDAyMjMxMDMgMDE2MDg4MzAyMTU0MS4zMjI3NTI4Njc2OTExMDAwMzk3MUUtNDM4IC0+IC0xLjE2OTUwMzA0MDYxNjM1NjgxODkxMzYxNTA0NDQyNDc5RS00MjYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ1NiBwb3dlciAtNy4yNjkyNzU3MDk4NDIxOTk0NDY5MzYwMjE0MDIyMzEwMyAyIC0+IDUyLjg0MjM2OTM0NTcwMTgxMjY0NTE5OTgwOTYyMTEwMzYgSW5leGFjdCBSb3VuZGVkCityZW14MzQ1NiByZW1haW5kZXIgLTcuMjY5Mjc1NzA5ODQyMTk5NDQ2OTM2MDIxNDAyMjMxMDMgMDE2MDg4MzAyMTU0MS4zMjI3NTI4Njc2OTExMDAwMzk3MUUtNDM4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ1NiBzdWJ0cmFjdCAtNy4yNjkyNzU3MDk4NDIxOTk0NDY5MzYwMjE0MDIyMzEwMyAwMTYwODgzMDIxNTQxLjMyMjc1Mjg2NzY5MTEwMDAzOTcxRS00MzggLT4gLTcuMjY5Mjc1NzA5ODQyMTk5NDQ2OTM2MDIxNDAyMjMxMDMgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ1NyBhZGQgLTI4NTY3MTUxLjY4Njg3NjI3NTIyNDEwNTY1NDAwMjg1MTVFKzQ5OCAtNDQ3MC4xNTQ1NTEzNzU0NjQyNzY0NTI5MDIxMDk4OTY3NSAtPiAtMi44NTY3MTUxNjg2ODc2Mjc1MjI0MTA1NjU0MDAyODUxNUUrNTA1IEluZXhhY3QgUm91bmRlZAorY29teDM0NTcgY29tcGFyZSAtMjg1NjcxNTEuNjg2ODc2Mjc1MjI0MTA1NjU0MDAyODUxNUUrNDk4IC00NDcwLjE1NDU1MTM3NTQ2NDI3NjQ1MjkwMjEwOTg5Njc1IC0+IC0xCitkaXZ4MzQ1NyBkaXZpZGUgLTI4NTY3MTUxLjY4Njg3NjI3NTIyNDEwNTY1NDAwMjg1MTVFKzQ5OCAtNDQ3MC4xNTQ1NTEzNzU0NjQyNzY0NTI5MDIxMDk4OTY3NSAtPiA2LjM5MDY0MDcxNjkwNDU1OTE5NzkyNzA3NTg5MDU0MTA2RSs1MDEgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ1NyBkaXZpZGVpbnQgLTI4NTY3MTUxLjY4Njg3NjI3NTIyNDEwNTY1NDAwMjg1MTVFKzQ5OCAtNDQ3MC4xNTQ1NTEzNzU0NjQyNzY0NTI5MDIxMDk4OTY3NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0NTcgbXVsdGlwbHkgLTI4NTY3MTUxLjY4Njg3NjI3NTIyNDEwNTY1NDAwMjg1MTVFKzQ5OCAtNDQ3MC4xNTQ1NTEzNzU0NjQyNzY0NTI5MDIxMDk4OTY3NSAtPiAxLjI3Njk5NTgzMTMyOTIzMjUzNjA1Mzk3NzM2Nzk3MDAwRSs1MDkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ1NyBwb3dlciAtMjg1NjcxNTEuNjg2ODc2Mjc1MjI0MTA1NjU0MDAyODUxNUUrNDk4IC00NDcwIC0+IDBFLTEwMDMxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzNDU3IHJlbWFpbmRlciAtMjg1NjcxNTEuNjg2ODc2Mjc1MjI0MTA1NjU0MDAyODUxNUUrNDk4IC00NDcwLjE1NDU1MTM3NTQ2NDI3NjQ1MjkwMjEwOTg5Njc1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ1NyBzdWJ0cmFjdCAtMjg1NjcxNTEuNjg2ODc2Mjc1MjI0MTA1NjU0MDAyODUxNUUrNDk4IC00NDcwLjE1NDU1MTM3NTQ2NDI3NjQ1MjkwMjEwOTg5Njc1IC0+IC0yLjg1NjcxNTE2ODY4NzYyNzUyMjQxMDU2NTQwMDI4NTE1RSs1MDUgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ1OCBhZGQgNzE5MTc1My43OTk3NDEzNjQ0NzI1NzQ2ODI4MjA3MzcxOCA4MS4zODc4NDI2MTc2MDM4NDg3OTQ4Mzc1Nzc3Mzg0NDI5IC0+IDcxOTE4MzUuMTg3NTgzOTgyMDc2NDIzNDc3NjU4MzE0OTIgSW5leGFjdCBSb3VuZGVkCitjb214MzQ1OCBjb21wYXJlIDcxOTE3NTMuNzk5NzQxMzY0NDcyNTc0NjgyODIwNzM3MTggODEuMzg3ODQyNjE3NjAzODQ4Nzk0ODM3NTc3NzM4NDQyOSAtPiAxCitkaXZ4MzQ1OCBkaXZpZGUgNzE5MTc1My43OTk3NDEzNjQ0NzI1NzQ2ODI4MjA3MzcxOCA4MS4zODc4NDI2MTc2MDM4NDg3OTQ4Mzc1Nzc3Mzg0NDI5IC0+IDg4MzYzLjk4MTI1ODYxODgxODY3MzM5MzU1Njk4NzQxMDAgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ1OCBkaXZpZGVpbnQgNzE5MTc1My43OTk3NDEzNjQ0NzI1NzQ2ODI4MjA3MzcxOCA4MS4zODc4NDI2MTc2MDM4NDg3OTQ4Mzc1Nzc3Mzg0NDI5IC0+IDg4MzYzCittdWx4MzQ1OCBtdWx0aXBseSA3MTkxNzUzLjc5OTc0MTM2NDQ3MjU3NDY4MjgyMDczNzE4IDgxLjM4Nzg0MjYxNzYwMzg0ODc5NDgzNzU3NzczODQ0MjkgLT4gNTg1MzIxMzI2LjM5NzkwNDYzODg2MzQ4NTg5MTUyNDU1NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDU4IHBvd2VyIDcxOTE3NTMuNzk5NzQxMzY0NDcyNTc0NjgyODIwNzM3MTggODEgLT4gMi41MzI5MDk4MzEzODU2MTQ4MjYxMjU1NzQwNDE0ODc2MEUrNTU1IEluZXhhY3QgUm91bmRlZAorcmVteDM0NTggcmVtYWluZGVyIDcxOTE3NTMuNzk5NzQxMzY0NDcyNTc0NjgyODIwNzM3MTggODEuMzg3ODQyNjE3NjAzODQ4Nzk0ODM3NTc3NzM4NDQyOSAtPiA3OS44NjI1MjIwMzU1ODE1MTY0NDk5MzkwMzUxNTAwMjczCitzdWJ4MzQ1OCBzdWJ0cmFjdCA3MTkxNzUzLjc5OTc0MTM2NDQ3MjU3NDY4MjgyMDczNzE4IDgxLjM4Nzg0MjYxNzYwMzg0ODc5NDgzNzU3NzczODQ0MjkgLT4gNzE5MTY3Mi40MTE4OTg3NDY4Njg3MjU4ODc5ODMxNTk0NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDU5IGFkZCA1MDI5NzU4MDQuMDY5ODY0NTM2MTA0NjIxNzAwNDA0NzcwIDY4NC43OTAwMjg0MzIwNzQ1Mjc5NjAyNjk1MTUyMjcyNDMgLT4gNTAyOTc2NDg4Ljg1OTg5Mjk2ODE3OTE0OTY2MDY3NDI4NSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDU5IGNvbXBhcmUgNTAyOTc1ODA0LjA2OTg2NDUzNjEwNDYyMTcwMDQwNDc3MCA2ODQuNzkwMDI4NDMyMDc0NTI3OTYwMjY5NTE1MjI3MjQzIC0+IDEKK2RpdngzNDU5IGRpdmlkZSA1MDI5NzU4MDQuMDY5ODY0NTM2MTA0NjIxNzAwNDA0NzcwIDY4NC43OTAwMjg0MzIwNzQ1Mjc5NjAyNjk1MTUyMjcyNDMgLT4gNzM0NDk2LjM5MDQwNjcwNjMyMzg5OTgwMTY0MTI3ODkzMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDU5IGRpdmlkZWludCA1MDI5NzU4MDQuMDY5ODY0NTM2MTA0NjIxNzAwNDA0NzcwIDY4NC43OTAwMjg0MzIwNzQ1Mjc5NjAyNjk1MTUyMjcyNDMgLT4gNzM0NDk2CittdWx4MzQ1OSBtdWx0aXBseSA1MDI5NzU4MDQuMDY5ODY0NTM2MTA0NjIxNzAwNDA0NzcwIDY4NC43OTAwMjg0MzIwNzQ1Mjc5NjAyNjk1MTUyMjcyNDMgLT4gMzQ0NDMyODE1MTY5LjY0ODA4Mjc1NDIxNDYzMTA4NjI3MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDU5IHBvd2VyIDUwMjk3NTgwNC4wNjk4NjQ1MzYxMDQ2MjE3MDA0MDQ3NzAgNjg1IC0+IDMuNjI4NzY3MTY1NzM2MjM1NTI3NjE3MzkxNzc1OTI2NzdFKzU5NjAgSW5leGFjdCBSb3VuZGVkCityZW14MzQ1OSByZW1haW5kZXIgNTAyOTc1ODA0LjA2OTg2NDUzNjEwNDYyMTcwMDQwNDc3MCA2ODQuNzkwMDI4NDMyMDc0NTI3OTYwMjY5NTE1MjI3MjQzIC0+IDI2Ny4zNDY2MTk1MjM2MTU5MTU1ODI1NDg0MjA5MjU0NzIKK3N1YngzNDU5IHN1YnRyYWN0IDUwMjk3NTgwNC4wNjk4NjQ1MzYxMDQ2MjE3MDA0MDQ3NzAgNjg0Ljc5MDAyODQzMjA3NDUyNzk2MDI2OTUxNTIyNzI0MyAtPiA1MDI5NzUxMTkuMjc5ODM2MTA0MDMwMDkzNzQwMTM1MjU1IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NjAgYWRkIDE1MDUzNjguNDIwNjM3MzE4NjE1OTA0NjA0NTM2NTk1NzAgLTQ2NTI0Mi42Nzg0Mzk5NTE0NjI3Njc2MzAwMjI4MTkxMDUgLT4gMTA0MDEyNS43NDIxOTczNjcxNTMxMzY5NzQ1MTM3NzY2MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDYwIGNvbXBhcmUgMTUwNTM2OC40MjA2MzczMTg2MTU5MDQ2MDQ1MzY1OTU3MCAtNDY1MjQyLjY3ODQzOTk1MTQ2Mjc2NzYzMDAyMjgxOTEwNSAtPiAxCitkaXZ4MzQ2MCBkaXZpZGUgMTUwNTM2OC40MjA2MzczMTg2MTU5MDQ2MDQ1MzY1OTU3MCAtNDY1MjQyLjY3ODQzOTk1MTQ2Mjc2NzYzMDAyMjgxOTEwNSAtPiAtMy4yMzU2NjI3ODUwMzMxOTk0NzA1OTIxMzAwMTQwNTA2NSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDYwIGRpdmlkZWludCAxNTA1MzY4LjQyMDYzNzMxODYxNTkwNDYwNDUzNjU5NTcwIC00NjUyNDIuNjc4NDM5OTUxNDYyNzY3NjMwMDIyODE5MTA1IC0+IC0zCittdWx4MzQ2MCBtdWx0aXBseSAxNTA1MzY4LjQyMDYzNzMxODYxNTkwNDYwNDUzNjU5NTcwIC00NjUyNDIuNjc4NDM5OTUxNDYyNzY3NjMwMDIyODE5MTA1IC0+IC03MDAzNjE2MzYwNTYuMjI1NjE4MjY2Mjk2ODk5MDQ4NzY1IEluZXhhY3QgUm91bmRlZAorcG93eDM0NjAgcG93ZXIgMTUwNTM2OC40MjA2MzczMTg2MTU5MDQ2MDQ1MzY1OTU3MCAtNDY1MjQzIC0+IDBFLTEwMDMxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzNDYwIHJlbWFpbmRlciAxNTA1MzY4LjQyMDYzNzMxODYxNTkwNDYwNDUzNjU5NTcwIC00NjUyNDIuNjc4NDM5OTUxNDYyNzY3NjMwMDIyODE5MTA1IC0+IDEwOTY0MC4zODUzMTc0NjQyMjc2MDE3MTQ0NjgxMzgzODUKK3N1YngzNDYwIHN1YnRyYWN0IDE1MDUzNjguNDIwNjM3MzE4NjE1OTA0NjA0NTM2NTk1NzAgLTQ2NTI0Mi42Nzg0Mzk5NTE0NjI3Njc2MzAwMjI4MTkxMDUgLT4gMTk3MDYxMS4wOTkwNzcyNzAwNzg2NzIyMzQ1NTk0MTQ4MSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDYxIGFkZCA2OTIyNTAyMy4yODUwMTQyNzg0MDYzNDE2MTM3MTQ0ODI5IDg1ODQwNTAuMDY2NDgxOTE3OTg4MzQ4MTk5OTUzMjU2OTMgLT4gNzc4MDkwNzMuMzUxNDk2MTk2Mzk0Njg5ODEzNjY3NzM5OCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDYxIGNvbXBhcmUgNjkyMjUwMjMuMjg1MDE0Mjc4NDA2MzQxNjEzNzE0NDgyOSA4NTg0MDUwLjA2NjQ4MTkxNzk4ODM0ODE5OTk1MzI1NjkzIC0+IDEKK2RpdngzNDYxIGRpdmlkZSA2OTIyNTAyMy4yODUwMTQyNzg0MDYzNDE2MTM3MTQ0ODI5IDg1ODQwNTAuMDY2NDgxOTE3OTg4MzQ4MTk5OTUzMjU2OTMgLT4gOC4wNjQzNzc4NTc2NDA1MDQzMTI5NTY1MjQxMTE2MzM4MiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDYxIGRpdmlkZWludCA2OTIyNTAyMy4yODUwMTQyNzg0MDYzNDE2MTM3MTQ0ODI5IDg1ODQwNTAuMDY2NDgxOTE3OTg4MzQ4MTk5OTUzMjU2OTMgLT4gOAorbXVseDM0NjEgbXVsdGlwbHkgNjkyMjUwMjMuMjg1MDE0Mjc4NDA2MzQxNjEzNzE0NDgyOSA4NTg0MDUwLjA2NjQ4MTkxNzk4ODM0ODE5OTk1MzI1NjkzIC0+IDU5NDIzMTA2NTczMTkzOS4xMzczMjk3NzA0ODU0OTcyNjEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ2MSBwb3dlciA2OTIyNTAyMy4yODUwMTQyNzg0MDYzNDE2MTM3MTQ0ODI5IDg1ODQwNTAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzQ2MSByZW1haW5kZXIgNjkyMjUwMjMuMjg1MDE0Mjc4NDA2MzQxNjEzNzE0NDgyOSA4NTg0MDUwLjA2NjQ4MTkxNzk4ODM0ODE5OTk1MzI1NjkzIC0+IDU1MjYyMi43NTMxNTg5MzQ0OTk1NTYwMTQwODg0Mjc0Ngorc3VieDM0NjEgc3VidHJhY3QgNjkyMjUwMjMuMjg1MDE0Mjc4NDA2MzQxNjEzNzE0NDgyOSA4NTg0MDUwLjA2NjQ4MTkxNzk4ODM0ODE5OTk1MzI1NjkzIC0+IDYwNjQwOTczLjIxODUzMjM2MDQxNzk5MzQxMzc2MTIyNjAgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ2MiBhZGQgLTU1NjY5NTAxODUzLjc3NTEwMDY4NDE5NDA0NzEzMzkzMTBFKzYxNCAwNjE0MDA1MzguMTg2MDQ0NjkzMjMzODE2NTY2OTc3MTg5IC0+IC01LjU2Njk1MDE4NTM3NzUxMDA2ODQxOTQwNDcxMzM5MzEwRSs2MjQgSW5leGFjdCBSb3VuZGVkCitjb214MzQ2MiBjb21wYXJlIC01NTY2OTUwMTg1My43NzUxMDA2ODQxOTQwNDcxMzM5MzEwRSs2MTQgMDYxNDAwNTM4LjE4NjA0NDY5MzIzMzgxNjU2Njk3NzE4OSAtPiAtMQorZGl2eDM0NjIgZGl2aWRlIC01NTY2OTUwMTg1My43NzUxMDA2ODQxOTQwNDcxMzM5MzEwRSs2MTQgMDYxNDAwNTM4LjE4NjA0NDY5MzIzMzgxNjU2Njk3NzE4OSAtPiAtOS4wNjY2MTQ2NDE4OTM3ODA1OTA2Nzc5MjU1NDMwMDY3NkUrNjE2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NjIgZGl2aWRlaW50IC01NTY2OTUwMTg1My43NzUxMDA2ODQxOTQwNDcxMzM5MzEwRSs2MTQgMDYxNDAwNTM4LjE4NjA0NDY5MzIzMzgxNjU2Njk3NzE4OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0NjIgbXVsdGlwbHkgLTU1NjY5NTAxODUzLjc3NTEwMDY4NDE5NDA0NzEzMzkzMTBFKzYxNCAwNjE0MDA1MzguMTg2MDQ0NjkzMjMzODE2NTY2OTc3MTg5IC0+IC0zLjQxODEzNzM3NDM3MDgwMzkwNzg3ODY1Mzg5NzAzNTY1RSs2MzIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ2MiBwb3dlciAtNTU2Njk1MDE4NTMuNzc1MTAwNjg0MTk0MDQ3MTMzOTMxMEUrNjE0IDYxNDAwNTM4IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDM0NjIgcmVtYWluZGVyIC01NTY2OTUwMTg1My43NzUxMDA2ODQxOTQwNDcxMzM5MzEwRSs2MTQgMDYxNDAwNTM4LjE4NjA0NDY5MzIzMzgxNjU2Njk3NzE4OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0NjIgc3VidHJhY3QgLTU1NjY5NTAxODUzLjc3NTEwMDY4NDE5NDA0NzEzMzkzMTBFKzYxNCAwNjE0MDA1MzguMTg2MDQ0NjkzMjMzODE2NTY2OTc3MTg5IC0+IC01LjU2Njk1MDE4NTM3NzUxMDA2ODQxOTQwNDcxMzM5MzEwRSs2MjQgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ2MyBhZGQgLTUyNzU2Ni41MjEyNzM5OTI0MjQ2NDkzNDY4MzczMzc2MDJFLTQwOCAtODM0NjYyLjU5OTk4Mzk1MzM0NTcxODUyMzgwNzEyMzk3MiAtPiAtODM0NjYyLjU5OTk4Mzk1MzM0NTcxODUyMzgwNzEyMzk3MiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDYzIGNvbXBhcmUgLTUyNzU2Ni41MjEyNzM5OTI0MjQ2NDkzNDY4MzczMzc2MDJFLTQwOCAtODM0NjYyLjU5OTk4Mzk1MzM0NTcxODUyMzgwNzEyMzk3MiAtPiAxCitkaXZ4MzQ2MyBkaXZpZGUgLTUyNzU2Ni41MjEyNzM5OTI0MjQ2NDkzNDY4MzczMzc2MDJFLTQwOCAtODM0NjYyLjU5OTk4Mzk1MzM0NTcxODUyMzgwNzEyMzk3MiAtPiA2LjMyMDcxNTk1NDk3NTUyMDE1NjU2OTA5ODkyMzM5MjI2RS00MDkgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ2MyBkaXZpZGVpbnQgLTUyNzU2Ni41MjEyNzM5OTI0MjQ2NDkzNDY4MzczMzc2MDJFLTQwOCAtODM0NjYyLjU5OTk4Mzk1MzM0NTcxODUyMzgwNzEyMzk3MiAtPiAwCittdWx4MzQ2MyBtdWx0aXBseSAtNTI3NTY2LjUyMTI3Mzk5MjQyNDY0OTM0NjgzNzMzNzYwMkUtNDA4IC04MzQ2NjIuNTk5OTgzOTUzMzQ1NzE4NTIzODA3MTIzOTcyIC0+IDQuNDAzNDAwNDQzMTEwNDAxNTE5NjA3NjMxMDgwMTk5NTdFLTM5NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDYzIHBvd2VyIC01Mjc1NjYuNTIxMjczOTkyNDI0NjQ5MzQ2ODM3MzM3NjAyRS00MDggLTgzNDY2MyAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzQ2MyByZW1haW5kZXIgLTUyNzU2Ni41MjEyNzM5OTI0MjQ2NDkzNDY4MzczMzc2MDJFLTQwOCAtODM0NjYyLjU5OTk4Mzk1MzM0NTcxODUyMzgwNzEyMzk3MiAtPiAtNS4yNzU2NjUyMTI3Mzk5MjQyNDY0OTM0NjgzNzMzNzYwMkUtNDAzCitzdWJ4MzQ2MyBzdWJ0cmFjdCAtNTI3NTY2LjUyMTI3Mzk5MjQyNDY0OTM0NjgzNzMzNzYwMkUtNDA4IC04MzQ2NjIuNTk5OTgzOTUzMzQ1NzE4NTIzODA3MTIzOTcyIC0+IDgzNDY2Mi41OTk5ODM5NTMzNDU3MTg1MjM4MDcxMjM5NzIgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ2NCBhZGQgNjkwNjU1MTAuMDQ1OTY1MzY5OTQxODA4MzQ1NTMzNTM2NiA2OTQ4NDg2NDM4NDgyMTI1MjAwODY5NjA4ODY4MTgxNTdFLTg1MyAtPiA2OTA2NTUxMC4wNDU5NjUzNjk5NDE4MDgzNDU1MzM1MzY2IEluZXhhY3QgUm91bmRlZAorY29teDM0NjQgY29tcGFyZSA2OTA2NTUxMC4wNDU5NjUzNjk5NDE4MDgzNDU1MzM1MzY2IDY5NDg0ODY0Mzg0ODIxMjUyMDA4Njk2MDg4NjgxODE1N0UtODUzIC0+IDEKK2RpdngzNDY0IGRpdmlkZSA2OTA2NTUxMC4wNDU5NjUzNjk5NDE4MDgzNDU1MzM1MzY2IDY5NDg0ODY0Mzg0ODIxMjUyMDA4Njk2MDg4NjgxODE1N0UtODUzIC0+IDkuOTM5NjQ4MTAyODUzOTY2NDY4ODk4MzA5MTk0OTI2ODNFKzgyNyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDY0IGRpdmlkZWludCA2OTA2NTUxMC4wNDU5NjUzNjk5NDE4MDgzNDU1MzM1MzY2IDY5NDg0ODY0Mzg0ODIxMjUyMDA4Njk2MDg4NjgxODE1N0UtODUzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ2NCBtdWx0aXBseSA2OTA2NTUxMC4wNDU5NjUzNjk5NDE4MDgzNDU1MzM1MzY2IDY5NDg0ODY0Mzg0ODIxMjUyMDA4Njk2MDg4NjgxODE1N0UtODUzIC0+IDQuNzk5MDA3NTk5MjEyNDEzNTI1NjIzODExODEzMzI3MjBFLTgxMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDY0IHBvd2VyIDY5MDY1NTEwLjA0NTk2NTM2OTk0MTgwODM0NTUzMzUzNjYgNyAtPiA3LjQ5NTk4MjQ5NzYzNDE2NDgzODI0OTE5MTE4OTczNTY3RSs1NCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDY0IHJlbWFpbmRlciA2OTA2NTUxMC4wNDU5NjUzNjk5NDE4MDgzNDU1MzM1MzY2IDY5NDg0ODY0Mzg0ODIxMjUyMDA4Njk2MDg4NjgxODE1N0UtODUzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ2NCBzdWJ0cmFjdCA2OTA2NTUxMC4wNDU5NjUzNjk5NDE4MDgzNDU1MzM1MzY2IDY5NDg0ODY0Mzg0ODIxMjUyMDA4Njk2MDg4NjgxODE1N0UtODUzIC0+IDY5MDY1NTEwLjA0NTk2NTM2OTk0MTgwODM0NTUzMzUzNjYgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ2NSBhZGQgLTI5MjE5ODIuODI0MTEyODU1MDUyMjkxMjI4OTAwNDE4NDEgLTcyOTk0LjY1MjM4NDAyOTgwMTc0NzE5NjI1Njk3Nzg4MDNFLTc2MyAtPiAtMjkyMTk4Mi44MjQxMTI4NTUwNTIyOTEyMjg5MDA0MTg0MSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDY1IGNvbXBhcmUgLTI5MjE5ODIuODI0MTEyODU1MDUyMjkxMjI4OTAwNDE4NDEgLTcyOTk0LjY1MjM4NDAyOTgwMTc0NzE5NjI1Njk3Nzg4MDNFLTc2MyAtPiAtMQorZGl2eDM0NjUgZGl2aWRlIC0yOTIxOTgyLjgyNDExMjg1NTA1MjI5MTIyODkwMDQxODQxIC03Mjk5NC42NTIzODQwMjk4MDE3NDcxOTYyNTY5Nzc4ODAzRS03NjMgLT4gNC4wMDMwMDk0Mzc5MjQ0NDY2MzQ2NzczMjAyOTUwMTcxNkUrNzY0IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NjUgZGl2aWRlaW50IC0yOTIxOTgyLjgyNDExMjg1NTA1MjI5MTIyODkwMDQxODQxIC03Mjk5NC42NTIzODQwMjk4MDE3NDcxOTYyNTY5Nzc4ODAzRS03NjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDY1IG11bHRpcGx5IC0yOTIxOTgyLjgyNDExMjg1NTA1MjI5MTIyODkwMDQxODQxIC03Mjk5NC42NTIzODQwMjk4MDE3NDcxOTYyNTY5Nzc4ODAzRS03NjMgLT4gMi4xMzI4OTEyMDUxODIyMzU0NzkyMTIxMjQxMjY0MjQxMUUtNzUyIEluZXhhY3QgUm91bmRlZAorcG93eDM0NjUgcG93ZXIgLTI5MjE5ODIuODI0MTEyODU1MDUyMjkxMjI4OTAwNDE4NDEgLTcgLT4gLTUuNDk4NjUzOTQ4NzA2MzEyNDg0Nzk2Njg3ODIxNTQxMzFFLTQ2IEluZXhhY3QgUm91bmRlZAorcmVteDM0NjUgcmVtYWluZGVyIC0yOTIxOTgyLjgyNDExMjg1NTA1MjI5MTIyODkwMDQxODQxIC03Mjk5NC42NTIzODQwMjk4MDE3NDcxOTYyNTY5Nzc4ODAzRS03NjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDY1IHN1YnRyYWN0IC0yOTIxOTgyLjgyNDExMjg1NTA1MjI5MTIyODkwMDQxODQxIC03Mjk5NC42NTIzODQwMjk4MDE3NDcxOTYyNTY5Nzc4ODAzRS03NjMgLT4gLTI5MjE5ODIuODI0MTEyODU1MDUyMjkxMjI4OTAwNDE4NDEgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ2NiBhZGQgNC41MTExNzQ1OTQ2NjQ5MTQ1MTQwMTgzNTc1NjU5Mzc5MyAzODczMzg1LjE5OTgxODExNjQwMDYzMTQ0MzM4MDg3MjMwIC0+IDM4NzMzODkuNzEwOTkyNzExMDY1NTQ1OTU3Mzk5MjI5ODcgSW5leGFjdCBSb3VuZGVkCitjb214MzQ2NiBjb21wYXJlIDQuNTExMTc0NTk0NjY0OTE0NTE0MDE4MzU3NTY1OTM3OTMgMzg3MzM4NS4xOTk4MTgxMTY0MDA2MzE0NDMzODA4NzIzMCAtPiAtMQorZGl2eDM0NjYgZGl2aWRlIDQuNTExMTc0NTk0NjY0OTE0NTE0MDE4MzU3NTY1OTM3OTMgMzg3MzM4NS4xOTk4MTgxMTY0MDA2MzE0NDMzODA4NzIzMCAtPiAwLjAwMDAwMTE2NDY1OTQyODg4MzIyNzc2NzUzMDYyNTgwMTA2MzUxIEluZXhhY3QgUm91bmRlZAorZHZpeDM0NjYgZGl2aWRlaW50IDQuNTExMTc0NTk0NjY0OTE0NTE0MDE4MzU3NTY1OTM3OTMgMzg3MzM4NS4xOTk4MTgxMTY0MDA2MzE0NDMzODA4NzIzMCAtPiAwCittdWx4MzQ2NiBtdWx0aXBseSA0LjUxMTE3NDU5NDY2NDkxNDUxNDAxODM1NzU2NTkzNzkzIDM4NzMzODUuMTk5ODE4MTE2NDAwNjMxNDQzMzgwODcyMzAgLT4gMTc0NzM1MTYuOTA4NzcwNTcwMTY1MjA2MjU0NjE2NDcwNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDY2IHBvd2VyIDQuNTExMTc0NTk0NjY0OTE0NTE0MDE4MzU3NTY1OTM3OTMgMzg3MzM4NSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDY2IHJlbWFpbmRlciA0LjUxMTE3NDU5NDY2NDkxNDUxNDAxODM1NzU2NTkzNzkzIDM4NzMzODUuMTk5ODE4MTE2NDAwNjMxNDQzMzgwODcyMzAgLT4gNC41MTExNzQ1OTQ2NjQ5MTQ1MTQwMTgzNTc1NjU5Mzc5Mworc3VieDM0NjYgc3VidHJhY3QgNC41MTExNzQ1OTQ2NjQ5MTQ1MTQwMTgzNTc1NjU5Mzc5MyAzODczMzg1LjE5OTgxODExNjQwMDYzMTQ0MzM4MDg3MjMwIC0+IC0zODczMzgwLjY4ODY0MzUyMTczNTcxNjkyOTM2MjUxNDczIEluZXhhY3QgUm91bmRlZAorYWRkeDM0NjcgYWRkIDQ5NTUzNzYzNDc0Njk4LjgxMTg2NjE3NTg4MTEwOTExMjAgMzYuMTcxMzg2MTI5Mzg5NjIxNjU5Mzg0MDgxNzk1MDc4MUUrNDEwIC0+IDMuNjE3MTM4NjEyOTM4OTYyMTY1OTM4NDA4MTc5NTA3ODFFKzQxMSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDY3IGNvbXBhcmUgNDk1NTM3NjM0NzQ2OTguODExODY2MTc1ODgxMTA5MTEyMCAzNi4xNzEzODYxMjkzODk2MjE2NTkzODQwODE3OTUwNzgxRSs0MTAgLT4gLTEKK2RpdngzNDY3IGRpdmlkZSA0OTU1Mzc2MzQ3NDY5OC44MTE4NjYxNzU4ODExMDkxMTIwIDM2LjE3MTM4NjEyOTM4OTYyMTY1OTM4NDA4MTc5NTA3ODFFKzQxMCAtPiAxLjM2OTk3MTM3MTc3NTQzNDE2MTkwODExODI3Njg1MjMxRS0zOTggSW5leGFjdCBSb3VuZGVkCitkdml4MzQ2NyBkaXZpZGVpbnQgNDk1NTM3NjM0NzQ2OTguODExODY2MTc1ODgxMTA5MTEyMCAzNi4xNzEzODYxMjkzODk2MjE2NTkzODQwODE3OTUwNzgxRSs0MTAgLT4gMAorbXVseDM0NjcgbXVsdGlwbHkgNDk1NTM3NjM0NzQ2OTguODExODY2MTc1ODgxMTA5MTEyMCAzNi4xNzEzODYxMjkzODk2MjE2NTkzODQwODE3OTUwNzgxRSs0MTAgLT4gMS43OTI0MjgzMTI4MDc3NzQ2NjU1NDI3MTMzMjQyNTczNUUrNDI1IEluZXhhY3QgUm91bmRlZAorcG93eDM0NjcgcG93ZXIgNDk1NTM3NjM0NzQ2OTguODExODY2MTc1ODgxMTA5MTEyMCA0IC0+IDYuMDI5ODUwOTEwOTk3MzAyMzY2MzU5NTQ4MDE0NzQ4MDJFKzU0IEluZXhhY3QgUm91bmRlZAorcmVteDM0NjcgcmVtYWluZGVyIDQ5NTUzNzYzNDc0Njk4LjgxMTg2NjE3NTg4MTEwOTExMjAgMzYuMTcxMzg2MTI5Mzg5NjIxNjU5Mzg0MDgxNzk1MDc4MUUrNDEwIC0+IDQ5NTUzNzYzNDc0Njk4LjgxMTg2NjE3NTg4MTEwOTExMjAKK3N1YngzNDY3IHN1YnRyYWN0IDQ5NTUzNzYzNDc0Njk4LjgxMTg2NjE3NTg4MTEwOTExMjAgMzYuMTcxMzg2MTI5Mzg5NjIxNjU5Mzg0MDgxNzk1MDc4MUUrNDEwIC0+IC0zLjYxNzEzODYxMjkzODk2MjE2NTkzODQwODE3OTUwNzgxRSs0MTEgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ2OCBhZGQgNzU1OTg1NTgzMzQ0LjM3OTk1MTUwNjA3MTQ5OTE3MDc0OUUrOTU2IDc0NjkyMTA5NTU2OTk3MTQ3NzM3MzY0MzQ4NzI4NTc4MCAtPiA3LjU1OTg1NTgzMzQ0Mzc5OTUxNTA2MDcxNDk5MTcwNzQ5RSs5NjcgSW5leGFjdCBSb3VuZGVkCitjb214MzQ2OCBjb21wYXJlIDc1NTk4NTU4MzM0NC4zNzk5NTE1MDYwNzE0OTkxNzA3NDlFKzk1NiA3NDY5MjEwOTU1Njk5NzE0NzczNzM2NDM0ODcyODU3ODAgLT4gMQorZGl2eDM0NjggZGl2aWRlIDc1NTk4NTU4MzM0NC4zNzk5NTE1MDYwNzE0OTkxNzA3NDlFKzk1NiA3NDY5MjEwOTU1Njk5NzE0NzczNzM2NDM0ODcyODU3ODAgLT4gMS4wMTIxMzU4MDM2NzIxMjg3MzAyNTY3MTkxNjc1ODY2OUUrOTM1IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NjggZGl2aWRlaW50IDc1NTk4NTU4MzM0NC4zNzk5NTE1MDYwNzE0OTkxNzA3NDlFKzk1NiA3NDY5MjEwOTU1Njk5NzE0NzczNzM2NDM0ODcyODU3ODAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDY4IG11bHRpcGx5IDc1NTk4NTU4MzM0NC4zNzk5NTE1MDYwNzE0OTkxNzA3NDlFKzk1NiA3NDY5MjEwOTU1Njk5NzE0NzczNzM2NDM0ODcyODU3ODAgLT4gNS42NDY2MTU4MDE0NjY4ODI1NTI4NjkzMzc1MzYxNjU4MEUrMTAwMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDY4IHBvd2VyIDc1NTk4NTU4MzM0NC4zNzk5NTE1MDYwNzE0OTkxNzA3NDlFKzk1NiA3IC0+IDEuNDExMjE5NTg1MTY1NDc3MjU2NzcxNDI5ODEzNzU0NjlFKzY3NzUgSW5leGFjdCBSb3VuZGVkCityZW14MzQ2OCByZW1haW5kZXIgNzU1OTg1NTgzMzQ0LjM3OTk1MTUwNjA3MTQ5OTE3MDc0OUUrOTU2IDc0NjkyMTA5NTU2OTk3MTQ3NzM3MzY0MzQ4NzI4NTc4MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0Njggc3VidHJhY3QgNzU1OTg1NTgzMzQ0LjM3OTk1MTUwNjA3MTQ5OTE3MDc0OUUrOTU2IDc0NjkyMTA5NTU2OTk3MTQ3NzM3MzY0MzQ4NzI4NTc4MCAtPiA3LjU1OTg1NTgzMzQ0Mzc5OTUxNTA2MDcxNDk5MTcwNzQ5RSs5NjcgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ2OSBhZGQgLTIwMTAxNjY4NTQxLjc0NzIyNjA0OTc1OTQyMzAxMDU0NTYgLTM5NTU2MjE0OC4zNDUwMDM5MzExNjE1MzIxMDExMDk5NjQgLT4gLTIwNDk3MjMwNjkwLjA5MjIyOTk4MDkyMDk1NTExMTY1NTYgSW5leGFjdCBSb3VuZGVkCitjb214MzQ2OSBjb21wYXJlIC0yMDEwMTY2ODU0MS43NDcyMjYwNDk3NTk0MjMwMTA1NDU2IC0zOTU1NjIxNDguMzQ1MDAzOTMxMTYxNTMyMTAxMTA5OTY0IC0+IC0xCitkaXZ4MzQ2OSBkaXZpZGUgLTIwMTAxNjY4NTQxLjc0NzIyNjA0OTc1OTQyMzAxMDU0NTYgLTM5NTU2MjE0OC4zNDUwMDM5MzExNjE1MzIxMDExMDk5NjQgLT4gNTAuODE3OTc3OTczNTAxMjA1MzY2MTQ0Nzg3MzY2NjgxNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDY5IGRpdmlkZWludCAtMjAxMDE2Njg1NDEuNzQ3MjI2MDQ5NzU5NDIzMDEwNTQ1NiAtMzk1NTYyMTQ4LjM0NTAwMzkzMTE2MTUzMjEwMTEwOTk2NCAtPiA1MAorbXVseDM0NjkgbXVsdGlwbHkgLTIwMTAxNjY4NTQxLjc0NzIyNjA0OTc1OTQyMzAxMDU0NTYgLTM5NTU2MjE0OC4zNDUwMDM5MzExNjE1MzIxMDExMDk5NjQgLT4gNzk1MTQ1OTE5MzY5MjcxNTA3OS4wOTMyODc2MDAxNjkxNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDY5IHBvd2VyIC0yMDEwMTY2ODU0MS43NDcyMjYwNDk3NTk0MjMwMTA1NDU2IC0zOTU1NjIxNDggLT4gMEUtMTAwMzEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDM0NjkgcmVtYWluZGVyIC0yMDEwMTY2ODU0MS43NDcyMjYwNDk3NTk0MjMwMTA1NDU2IC0zOTU1NjIxNDguMzQ1MDAzOTMxMTYxNTMyMTAxMTA5OTY0IC0+IC0zMjM1NjExMjQuNDk3MDI5NDkxNjgyODE3OTU1MDQ3NDAwCitzdWJ4MzQ2OSBzdWJ0cmFjdCAtMjAxMDE2Njg1NDEuNzQ3MjI2MDQ5NzU5NDIzMDEwNTQ1NiAtMzk1NTYyMTQ4LjM0NTAwMzkzMTE2MTUzMjEwMTEwOTk2NCAtPiAtMTk3MDYxMDYzOTMuNDAyMjIyMTE4NTk3ODkwOTA5NDM1NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDcwIGFkZCA1NTgzOTAzLjE4MDcyMTAwNzE2MDcyMDExMjY0NjY4NjMxIDQ2MDg2ODkxNDY5NC4wODgzODcwNjc0NTEzMTI1MDA3MjMgLT4gNDYwODc0NDk4NTk3LjI2OTEwODA3NDYxMjAzMjYxMzM3MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDcwIGNvbXBhcmUgNTU4MzkwMy4xODA3MjEwMDcxNjA3MjAxMTI2NDY2ODYzMSA0NjA4Njg5MTQ2OTQuMDg4Mzg3MDY3NDUxMzEyNTAwNzIzIC0+IC0xCitkaXZ4MzQ3MCBkaXZpZGUgNTU4MzkwMy4xODA3MjEwMDcxNjA3MjAxMTI2NDY2ODYzMSA0NjA4Njg5MTQ2OTQuMDg4Mzg3MDY3NDUxMzEyNTAwNzIzIC0+IDAuMDAwMDEyMTE2MDMzNDM3NDYzMzI0MDE2ODA2ODQwNTQ2NzMwNyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDcwIGRpdmlkZWludCA1NTgzOTAzLjE4MDcyMTAwNzE2MDcyMDExMjY0NjY4NjMxIDQ2MDg2ODkxNDY5NC4wODgzODcwNjc0NTEzMTI1MDA3MjMgLT4gMAorbXVseDM0NzAgbXVsdGlwbHkgNTU4MzkwMy4xODA3MjEwMDcxNjA3MjAxMTI2NDY2ODYzMSA0NjA4Njg5MTQ2OTQuMDg4Mzg3MDY3NDUxMzEyNTAwNzIzIC0+IDI1NzM0NDczOTg2NTU3NTg2NTkuMzk0NzU2NzI5MDUyMjUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ3MCBwb3dlciA1NTgzOTAzLjE4MDcyMTAwNzE2MDcyMDExMjY0NjY4NjMxIDUgLT4gNS40Mjg2MTk0MzU4OTQxODYwMzI5ODY3MDQ1NDcwMjkwMUUrMzMgSW5leGFjdCBSb3VuZGVkCityZW14MzQ3MCByZW1haW5kZXIgNTU4MzkwMy4xODA3MjEwMDcxNjA3MjAxMTI2NDY2ODYzMSA0NjA4Njg5MTQ2OTQuMDg4Mzg3MDY3NDUxMzEyNTAwNzIzIC0+IDU1ODM5MDMuMTgwNzIxMDA3MTYwNzIwMTEyNjQ2Njg2MzEKK3N1YngzNDcwIHN1YnRyYWN0IDU1ODM5MDMuMTgwNzIxMDA3MTYwNzIwMTEyNjQ2Njg2MzEgNDYwODY4OTE0Njk0LjA4ODM4NzA2NzQ1MTMxMjUwMDcyMyAtPiAtNDYwODYzMzMwNzkwLjkwNzY2NjA2MDI5MDU5MjM4ODA3NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDcxIGFkZCAtOTU1NjM4Mzk3OTc1MjQwNjg1MDE3OTkyNDM2MTE2MjU3RSswMjAgLTUwODU4MC4xNDg5NTg3NjkxMDQ1MTE3NTE5NzU3MjA0NzBFKzY2MiAtPiAtNS4wODU4MDE0ODk1ODc2OTEwNDUxMTc1MTk3NTcyMDQ3MEUrNjY3IEluZXhhY3QgUm91bmRlZAorY29teDM0NzEgY29tcGFyZSAtOTU1NjM4Mzk3OTc1MjQwNjg1MDE3OTkyNDM2MTE2MjU3RSswMjAgLTUwODU4MC4xNDg5NTg3NjkxMDQ1MTE3NTE5NzU3MjA0NzBFKzY2MiAtPiAxCitkaXZ4MzQ3MSBkaXZpZGUgLTk1NTYzODM5Nzk3NTI0MDY4NTAxNzk5MjQzNjExNjI1N0UrMDIwIC01MDg1ODAuMTQ4OTU4NzY5MTA0NTExNzUxOTc1NzIwNDcwRSs2NjIgLT4gMS44NzkwMzIwNDYyNDAzOTQ3NjQwODE5MTI2NDU2NDU2OEUtNjE1IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NzEgZGl2aWRlaW50IC05NTU2MzgzOTc5NzUyNDA2ODUwMTc5OTI0MzYxMTYyNTdFKzAyMCAtNTA4NTgwLjE0ODk1ODc2OTEwNDUxMTc1MTk3NTcyMDQ3MEUrNjYyIC0+IDAKK211bHgzNDcxIG11bHRpcGx5IC05NTU2MzgzOTc5NzUyNDA2ODUwMTc5OTI0MzYxMTYyNTdFKzAyMCAtNTA4NTgwLjE0ODk1ODc2OTEwNDUxMTc1MTk3NTcyMDQ3MEUrNjYyIC0+IDQuODYwMTg3MTg3OTI5NjczNzg5ODU4Mzg3Mzk4MjAxMDhFKzcyMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDcxIHBvd2VyIC05NTU2MzgzOTc5NzUyNDA2ODUwMTc5OTI0MzYxMTYyNTdFKzAyMCAtNSAtPiAtMS4yNTQ2NzczMDQyMDMwNDE4OTE2MTc2ODQwODQ2MjQxNEUtMjY1IEluZXhhY3QgUm91bmRlZAorcmVteDM0NzEgcmVtYWluZGVyIC05NTU2MzgzOTc5NzUyNDA2ODUwMTc5OTI0MzYxMTYyNTdFKzAyMCAtNTA4NTgwLjE0ODk1ODc2OTEwNDUxMTc1MTk3NTcyMDQ3MEUrNjYyIC0+IC05LjU1NjM4Mzk3OTc1MjQwNjg1MDE3OTkyNDM2MTE2MjU3RSs1Mgorc3VieDM0NzEgc3VidHJhY3QgLTk1NTYzODM5Nzk3NTI0MDY4NTAxNzk5MjQzNjExNjI1N0UrMDIwIC01MDg1ODAuMTQ4OTU4NzY5MTA0NTExNzUxOTc1NzIwNDcwRSs2NjIgLT4gNS4wODU4MDE0ODk1ODc2OTEwNDUxMTc1MTk3NTcyMDQ3MEUrNjY3IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NzIgYWRkIC0xMzYyNDM3OTYwOTgwMjA5ODM4MTQxMTU1ODQ0MDI0MDdFKzc5NiA2NTg5MTA4MDgzLjk5NzUwMzExNjUxNTgxMDMyNDQ3MzkwIC0+IC0xLjM2MjQzNzk2MDk4MDIwOTgzODE0MTE1NTg0NDAyNDA3RSs4MjggSW5leGFjdCBSb3VuZGVkCitjb214MzQ3MiBjb21wYXJlIC0xMzYyNDM3OTYwOTgwMjA5ODM4MTQxMTU1ODQ0MDI0MDdFKzc5NiA2NTg5MTA4MDgzLjk5NzUwMzExNjUxNTgxMDMyNDQ3MzkwIC0+IC0xCitkaXZ4MzQ3MiBkaXZpZGUgLTEzNjI0Mzc5NjA5ODAyMDk4MzgxNDExNTU4NDQwMjQwN0UrNzk2IDY1ODkxMDgwODMuOTk3NTAzMTE2NTE1ODEwMzI0NDczOTAgLT4gLTIuMDY3NzEyMjY2MzgyNTU2MDA2MzQ5MzkzNzEzNjU5MjBFKzgxOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDcyIGRpdmlkZWludCAtMTM2MjQzNzk2MDk4MDIwOTgzODE0MTE1NTg0NDAyNDA3RSs3OTYgNjU4OTEwODA4My45OTc1MDMxMTY1MTU4MTAzMjQ0NzM5MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0NzIgbXVsdGlwbHkgLTEzNjI0Mzc5NjA5ODAyMDk4MzgxNDExNTU4NDQwMjQwN0UrNzk2IDY1ODkxMDgwODMuOTk3NTAzMTE2NTE1ODEwMzI0NDczOTAgLT4gLTguOTc3MjUwOTgyNjM5Nzc1MzU5NjY5MjE2OTYxNDMwMTFFKzgzNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDcyIHBvd2VyIC0xMzYyNDM3OTYwOTgwMjA5ODM4MTQxMTU1ODQ0MDI0MDdFKzc5NiA3IC0+IC04LjcxMzk5MTg1NTUxNzQyMTk5NzUyODMyMjg2OTg0MDA1RSs1Nzk2IEluZXhhY3QgUm91bmRlZAorcmVteDM0NzIgcmVtYWluZGVyIC0xMzYyNDM3OTYwOTgwMjA5ODM4MTQxMTU1ODQ0MDI0MDdFKzc5NiA2NTg5MTA4MDgzLjk5NzUwMzExNjUxNTgxMDMyNDQ3MzkwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ3MiBzdWJ0cmFjdCAtMTM2MjQzNzk2MDk4MDIwOTgzODE0MTE1NTg0NDAyNDA3RSs3OTYgNjU4OTEwODA4My45OTc1MDMxMTY1MTU4MTAzMjQ0NzM5MCAtPiAtMS4zNjI0Mzc5NjA5ODAyMDk4MzgxNDExNTU4NDQwMjQwN0UrODI4IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NzMgYWRkIC04MDg0OTguNDgyNzE4MzA0NTk4MjEzMDkyOTM3NTQzOTM0RSs1MjEgNDgwMDUuMTQ2NTA5NzkxNDM1NTA5NjMwMTQ4Mzc4ODkwNSAtPiAtOC4wODQ5ODQ4MjcxODMwNDU5ODIxMzA5MjkzNzU0MzkzNEUrNTI2IEluZXhhY3QgUm91bmRlZAorY29teDM0NzMgY29tcGFyZSAtODA4NDk4LjQ4MjcxODMwNDU5ODIxMzA5MjkzNzU0MzkzNEUrNTIxIDQ4MDA1LjE0NjUwOTc5MTQzNTUwOTYzMDE0ODM3ODg5MDUgLT4gLTEKK2RpdngzNDczIGRpdmlkZSAtODA4NDk4LjQ4MjcxODMwNDU5ODIxMzA5MjkzNzU0MzkzNEUrNTIxIDQ4MDA1LjE0NjUwOTc5MTQzNTUwOTYzMDE0ODM3ODg5MDUgLT4gLTEuNjg0MTkxMjYxNzcxMDY0Njg1NjUzOTcwMTcxMDc3MzZFKzUyMiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDczIGRpdmlkZWludCAtODA4NDk4LjQ4MjcxODMwNDU5ODIxMzA5MjkzNzU0MzkzNEUrNTIxIDQ4MDA1LjE0NjUwOTc5MTQzNTUwOTYzMDE0ODM3ODg5MDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDczIG11bHRpcGx5IC04MDg0OTguNDgyNzE4MzA0NTk4MjEzMDkyOTM3NTQzOTM0RSs1MjEgNDgwMDUuMTQ2NTA5NzkxNDM1NTA5NjMwMTQ4Mzc4ODkwNSAtPiAtMy44ODEyMDg4MTE1ODM2MjkxMjIyMDEzMjY5MTgwMzUzOUUrNTMxIEluZXhhY3QgUm91bmRlZAorcG93eDM0NzMgcG93ZXIgLTgwODQ5OC40ODI3MTgzMDQ1OTgyMTMwOTI5Mzc1NDM5MzRFKzUyMSA0ODAwNSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzQ3MyByZW1haW5kZXIgLTgwODQ5OC40ODI3MTgzMDQ1OTgyMTMwOTI5Mzc1NDM5MzRFKzUyMSA0ODAwNS4xNDY1MDk3OTE0MzU1MDk2MzAxNDgzNzg4OTA1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ3MyBzdWJ0cmFjdCAtODA4NDk4LjQ4MjcxODMwNDU5ODIxMzA5MjkzNzU0MzkzNEUrNTIxIDQ4MDA1LjE0NjUwOTc5MTQzNTUwOTYzMDE0ODM3ODg5MDUgLT4gLTguMDg0OTg0ODI3MTgzMDQ1OTgyMTMwOTI5Mzc1NDM5MzRFKzUyNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDc0IGFkZCAtODEyLjI2NjM0MDU1NDI4MTMwNTk4NTUyNDgxMzA3NDIxMUUrMzk2IC0zMTk1LjYzMTExNTU5MTE0MDAxNTk0MjU3NDQ4OTcwODEyRSs5ODYgLT4gLTMuMTk1NjMxMTE1NTkxMTQwMDE1OTQyNTc0NDg5NzA4MTJFKzk4OSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDc0IGNvbXBhcmUgLTgxMi4yNjYzNDA1NTQyODEzMDU5ODU1MjQ4MTMwNzQyMTFFKzM5NiAtMzE5NS42MzExMTU1OTExNDAwMTU5NDI1NzQ0ODk3MDgxMkUrOTg2IC0+IDEKK2RpdngzNDc0IGRpdmlkZSAtODEyLjI2NjM0MDU1NDI4MTMwNTk4NTUyNDgxMzA3NDIxMUUrMzk2IC0zMTk1LjYzMTExNTU5MTE0MDAxNTk0MjU3NDQ4OTcwODEyRSs5ODYgLT4gMi41NDE4MDI1NzcyNDc3OTcyMTQ0ODQ4NDc4MTA1NjA0MEUtNTkxIEluZXhhY3QgUm91bmRlZAorZHZpeDM0NzQgZGl2aWRlaW50IC04MTIuMjY2MzQwNTU0MjgxMzA1OTg1NTI0ODEzMDc0MjExRSszOTYgLTMxOTUuNjMxMTE1NTkxMTQwMDE1OTQyNTc0NDg5NzA4MTJFKzk4NiAtPiAwCittdWx4MzQ3NCBtdWx0aXBseSAtODEyLjI2NjM0MDU1NDI4MTMwNTk4NTUyNDgxMzA3NDIxMUUrMzk2IC0zMTk1LjYzMTExNTU5MTE0MDAxNTk0MjU3NDQ4OTcwODEyRSs5ODYgLT4gMi41OTU3MDM1OTIwMjI2MTA4MjUzNzUwNTMzMjMyNTQwNEUrMTM4OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDc0IHBvd2VyIC04MTIuMjY2MzQwNTU0MjgxMzA1OTg1NTI0ODEzMDc0MjExRSszOTYgLTMgLT4gLTEuODY1OTY5ODgwMzA5MTQ2MTYyMTY3NDE4MDgyMTY0NjlFLTExOTcgSW5leGFjdCBSb3VuZGVkCityZW14MzQ3NCByZW1haW5kZXIgLTgxMi4yNjYzNDA1NTQyODEzMDU5ODU1MjQ4MTMwNzQyMTFFKzM5NiAtMzE5NS42MzExMTU1OTExNDAwMTU5NDI1NzQ0ODk3MDgxMkUrOTg2IC0+IC04LjEyMjY2MzQwNTU0MjgxMzA1OTg1NTI0ODEzMDc0MjExRSszOTgKK3N1YngzNDc0IHN1YnRyYWN0IC04MTIuMjY2MzQwNTU0MjgxMzA1OTg1NTI0ODEzMDc0MjExRSszOTYgLTMxOTUuNjMxMTE1NTkxMTQwMDE1OTQyNTc0NDg5NzA4MTJFKzk4NiAtPiAzLjE5NTYzMTExNTU5MTE0MDAxNTk0MjU3NDQ4OTcwODEyRSs5ODkgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ3NSBhZGQgLTkyOTg4OS43MjA5MDUxODMzOTc2Nzg4NjY2NDgyMTc3OTNFKzEzNCAtMjgwMzAwMTkwNzc0LjA1NzU5NTY3MTA3OTI2NDg0MTM0OSAtPiAtOS4yOTg4OTcyMDkwNTE4MzM5NzY3ODg2NjY0ODIxNzc5M0UrMTM5IEluZXhhY3QgUm91bmRlZAorY29teDM0NzUgY29tcGFyZSAtOTI5ODg5LjcyMDkwNTE4MzM5NzY3ODg2NjY0ODIxNzc5M0UrMTM0IC0yODAzMDAxOTA3NzQuMDU3NTk1NjcxMDc5MjY0ODQxMzQ5IC0+IC0xCitkaXZ4MzQ3NSBkaXZpZGUgLTkyOTg4OS43MjA5MDUxODMzOTc2Nzg4NjY2NDgyMTc3OTNFKzEzNCAtMjgwMzAwMTkwNzc0LjA1NzU5NTY3MTA3OTI2NDg0MTM0OSAtPiAzLjMxNzQ3ODAxNjQ2OTY0Mzk5MzMxNTU2OTcxMDU1MTk3RSsxMjggSW5leGFjdCBSb3VuZGVkCitkdml4MzQ3NSBkaXZpZGVpbnQgLTkyOTg4OS43MjA5MDUxODMzOTc2Nzg4NjY2NDgyMTc3OTNFKzEzNCAtMjgwMzAwMTkwNzc0LjA1NzU5NTY3MTA3OTI2NDg0MTM0OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0NzUgbXVsdGlwbHkgLTkyOTg4OS43MjA5MDUxODMzOTc2Nzg4NjY2NDgyMTc3OTNFKzEzNCAtMjgwMzAwMTkwNzc0LjA1NzU5NTY3MTA3OTI2NDg0MTM0OSAtPiAyLjYwNjQ4MjY2MTY4NTU4MDc5OTU3MzQ5MDc0NjA5OTIwRSsxNTEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ3NSBwb3dlciAtOTI5ODg5LjcyMDkwNTE4MzM5NzY3ODg2NjY0ODIxNzc5M0UrMTM0IC0zIC0+IC0xLjI0MzY3MTQzMzcwMzAwMTg5NTE4Nzc4NTA1ODMwMTgxRS00MjAgSW5leGFjdCBSb3VuZGVkCityZW14MzQ3NSByZW1haW5kZXIgLTkyOTg4OS43MjA5MDUxODMzOTc2Nzg4NjY2NDgyMTc3OTNFKzEzNCAtMjgwMzAwMTkwNzc0LjA1NzU5NTY3MTA3OTI2NDg0MTM0OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0NzUgc3VidHJhY3QgLTkyOTg4OS43MjA5MDUxODMzOTc2Nzg4NjY2NDgyMTc3OTNFKzEzNCAtMjgwMzAwMTkwNzc0LjA1NzU5NTY3MTA3OTI2NDg0MTM0OSAtPiAtOS4yOTg4OTcyMDkwNTE4MzM5NzY3ODg2NjY0ODIxNzc5M0UrMTM5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NzYgYWRkIDgzOTQ2LjAxNTc4MDE5NTM2MzYyNTUwNzg5OTYxODU1NDAgNDkyNjcwMzczLjIzNTM5MTY2NTc1ODcwMTUwMDMxNDQ3MyAtPiA0OTI3NTQzMTkuMjUxMTcxODYxMTIyMzI3MDA4MjE0MDkyIEluZXhhY3QgUm91bmRlZAorY29teDM0NzYgY29tcGFyZSA4Mzk0Ni4wMTU3ODAxOTUzNjM2MjU1MDc4OTk2MTg1NTQwIDQ5MjY3MDM3My4yMzUzOTE2NjU3NTg3MDE1MDAzMTQ0NzMgLT4gLTEKK2RpdngzNDc2IGRpdmlkZSA4Mzk0Ni4wMTU3ODAxOTUzNjM2MjU1MDc4OTk2MTg1NTQwIDQ5MjY3MDM3My4yMzUzOTE2NjU3NTg3MDE1MDAzMTQ0NzMgLT4gMC4wMDAxNzAzODk4MTkxMTc2MzM0ODU2OTU4OTAwNDExODU3ODIgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ3NiBkaXZpZGVpbnQgODM5NDYuMDE1NzgwMTk1MzYzNjI1NTA3ODk5NjE4NTU0MCA0OTI2NzAzNzMuMjM1MzkxNjY1NzU4NzAxNTAwMzE0NDczIC0+IDAKK211bHgzNDc2IG11bHRpcGx5IDgzOTQ2LjAxNTc4MDE5NTM2MzYyNTUwNzg5OTYxODU1NDAgNDkyNjcwMzczLjIzNTM5MTY2NTc1ODcwMTUwMDMxNDQ3MyAtPiA0MTM1NzcxNDkyNjA1Mi45MjgyOTg1NTYwMzgwMDY0NjQ5IEluZXhhY3QgUm91bmRlZAorcG93eDM0NzYgcG93ZXIgODM5NDYuMDE1NzgwMTk1MzYzNjI1NTA3ODk5NjE4NTU0MCA0OTI2NzAzNzMgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzQ3NiByZW1haW5kZXIgODM5NDYuMDE1NzgwMTk1MzYzNjI1NTA3ODk5NjE4NTU0MCA0OTI2NzAzNzMuMjM1MzkxNjY1NzU4NzAxNTAwMzE0NDczIC0+IDgzOTQ2LjAxNTc4MDE5NTM2MzYyNTUwNzg5OTYxODU1NDAKK3N1YngzNDc2IHN1YnRyYWN0IDgzOTQ2LjAxNTc4MDE5NTM2MzYyNTUwNzg5OTYxODU1NDAgNDkyNjcwMzczLjIzNTM5MTY2NTc1ODcwMTUwMDMxNDQ3MyAtPiAtNDkyNTg2NDI3LjIxOTYxMTQ3MDM5NTA3NTk5MjQxNDg1NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDc3IGFkZCA3ODEyNzU4MTEzODE3Ljk5MTM1ODUxODI1MjIzMTIyNTA4IDMwMzc0OTIuMzY3MTYzMDE0NDMzMDk1NzE5MTgwMDIxMjNFLTE1NyAtPiA3ODEyNzU4MTEzODE3Ljk5MTM1ODUxODI1MjIzMTIyNTA4IEluZXhhY3QgUm91bmRlZAorY29teDM0NzcgY29tcGFyZSA3ODEyNzU4MTEzODE3Ljk5MTM1ODUxODI1MjIzMTIyNTA4IDMwMzc0OTIuMzY3MTYzMDE0NDMzMDk1NzE5MTgwMDIxMjNFLTE1NyAtPiAxCitkaXZ4MzQ3NyBkaXZpZGUgNzgxMjc1ODExMzgxNy45OTEzNTg1MTgyNTIyMzEyMjUwOCAzMDM3NDkyLjM2NzE2MzAxNDQzMzA5NTcxOTE4MDAyMTIzRS0xNTcgLT4gMi41NzIxMDc5MDAwMTU5MDE3MTgwOTUxMjg3MTg1NzM4MUUrMTYzIEluZXhhY3QgUm91bmRlZAorZHZpeDM0NzcgZGl2aWRlaW50IDc4MTI3NTgxMTM4MTcuOTkxMzU4NTE4MjUyMjMxMjI1MDggMzAzNzQ5Mi4zNjcxNjMwMTQ0MzMwOTU3MTkxODAwMjEyM0UtMTU3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ3NyBtdWx0aXBseSA3ODEyNzU4MTEzODE3Ljk5MTM1ODUxODI1MjIzMTIyNTA4IDMwMzc0OTIuMzY3MTYzMDE0NDMzMDk1NzE5MTgwMDIxMjNFLTE1NyAtPiAyLjM3MzExOTMxMzcyMTMwNTgzMTM2MDkxNzE3MDkzOTM1RS0xMzggSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ3NyBwb3dlciA3ODEyNzU4MTEzODE3Ljk5MTM1ODUxODI1MjIzMTIyNTA4IDMgLT4gNC43Njg4NDQyMTgxNjI0Njg5NjA5MDQxNDMxNDkzNDI1M0UrMzggSW5leGFjdCBSb3VuZGVkCityZW14MzQ3NyByZW1haW5kZXIgNzgxMjc1ODExMzgxNy45OTEzNTg1MTgyNTIyMzEyMjUwOCAzMDM3NDkyLjM2NzE2MzAxNDQzMzA5NTcxOTE4MDAyMTIzRS0xNTcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDc3IHN1YnRyYWN0IDc4MTI3NTgxMTM4MTcuOTkxMzU4NTE4MjUyMjMxMjI1MDggMzAzNzQ5Mi4zNjcxNjMwMTQ0MzMwOTU3MTkxODAwMjEyM0UtMTU3IC0+IDc4MTI3NTgxMTM4MTcuOTkxMzU4NTE4MjUyMjMxMjI1MDggSW5leGFjdCBSb3VuZGVkCithZGR4MzQ3OCBhZGQgNDg5MTkxNzQ3LjE0ODY3NDMyNjc1Nzc2NzM1NjYyNjAxNiAwMTEzNjk0Mi4xMTgyMjc3NTgwMDkzMDI3NzY4NDkwNTQ1IC0+IDQ5MDMyODY4OS4yNjY5MDIwODQ3NjcwNzAxMzM0NzUwNzEgSW5leGFjdCBSb3VuZGVkCitjb214MzQ3OCBjb21wYXJlIDQ4OTE5MTc0Ny4xNDg2NzQzMjY3NTc3NjczNTY2MjYwMTYgMDExMzY5NDIuMTE4MjI3NzU4MDA5MzAyNzc2ODQ5MDU0NSAtPiAxCitkaXZ4MzQ3OCBkaXZpZGUgNDg5MTkxNzQ3LjE0ODY3NDMyNjc1Nzc2NzM1NjYyNjAxNiAwMTEzNjk0Mi4xMTgyMjc3NTgwMDkzMDI3NzY4NDkwNTQ1IC0+IDQzMC4yNjk3MDI2NTc1MjUyMjMxMjQxNDgyNTg2NDEzNTggSW5leGFjdCBSb3VuZGVkCitkdml4MzQ3OCBkaXZpZGVpbnQgNDg5MTkxNzQ3LjE0ODY3NDMyNjc1Nzc2NzM1NjYyNjAxNiAwMTEzNjk0Mi4xMTgyMjc3NTgwMDkzMDI3NzY4NDkwNTQ1IC0+IDQzMAorbXVseDM0NzggbXVsdGlwbHkgNDg5MTkxNzQ3LjE0ODY3NDMyNjc1Nzc2NzM1NjYyNjAxNiAwMTEzNjk0Mi4xMTgyMjc3NTgwMDkzMDI3NzY4NDkwNTQ1IC0+IDU1NjE4MjcwMTIyMjc1MS41ODg0NTQxMjk1MTg4MzA1NTAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ3OCBwb3dlciA0ODkxOTE3NDcuMTQ4Njc0MzI2NzU3NzY3MzU2NjI2MDE2IDExMzY5NDIgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzQ3OCByZW1haW5kZXIgNDg5MTkxNzQ3LjE0ODY3NDMyNjc1Nzc2NzM1NjYyNjAxNiAwMTEzNjk0Mi4xMTgyMjc3NTgwMDkzMDI3NzY4NDkwNTQ1IC0+IDMwNjYzNi4zMTA3MzgzODI3NTc1NzMzMTE1MzI1ODEwCitzdWJ4MzQ3OCBzdWJ0cmFjdCA0ODkxOTE3NDcuMTQ4Njc0MzI2NzU3NzY3MzU2NjI2MDE2IDAxMTM2OTQyLjExODIyNzc1ODAwOTMwMjc3Njg0OTA1NDUgLT4gNDg4MDU0ODA1LjAzMDQ0NjU2ODc0ODQ2NDU3OTc3Njk2MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDc5IGFkZCAtNTk5MzY5NTQwLjM3MzE3NDQ4MjMzNTg2NTU2NzkzNzg1M0UrMjg5IC0zODI4ODM4MzIwNS42NzQ5NDM5NTg4NzA3OTU1NTg1MjA5IC0+IC01Ljk5MzY5NTQwMzczMTc0NDgyMzM1ODY1NTY3OTM3ODUzRSsyOTcgSW5leGFjdCBSb3VuZGVkCitjb214MzQ3OSBjb21wYXJlIC01OTkzNjk1NDAuMzczMTc0NDgyMzM1ODY1NTY3OTM3ODUzRSsyODkgLTM4Mjg4MzgzMjA1LjY3NDk0Mzk1ODg3MDc5NTU1ODUyMDkgLT4gLTEKK2RpdngzNDc5IGRpdmlkZSAtNTk5MzY5NTQwLjM3MzE3NDQ4MjMzNTg2NTU2NzkzNzg1M0UrMjg5IC0zODI4ODM4MzIwNS42NzQ5NDM5NTg4NzA3OTU1NTg1MjA5IC0+IDEuNTY1NDA4MzMwNjUwODk2ODQxMzI2ODgxNDM3Mzc1ODZFKzI4NyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDc5IGRpdmlkZWludCAtNTk5MzY5NTQwLjM3MzE3NDQ4MjMzNTg2NTU2NzkzNzg1M0UrMjg5IC0zODI4ODM4MzIwNS42NzQ5NDM5NTg4NzA3OTU1NTg1MjA5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ3OSBtdWx0aXBseSAtNTk5MzY5NTQwLjM3MzE3NDQ4MjMzNTg2NTU2NzkzNzg1M0UrMjg5IC0zODI4ODM4MzIwNS42NzQ5NDM5NTg4NzA3OTU1NTg1MjA5IC0+IDIuMjk0ODg5MDY0MzYxNzM2NDEzMjQwOTE2Mzg5NjM3MTVFKzMwOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDc5IHBvd2VyIC01OTkzNjk1NDAuMzczMTc0NDgyMzM1ODY1NTY3OTM3ODUzRSsyODkgLTQgLT4gNy43NDg1NjU4MDY0NjI5MTM2NjI3MDMyOTE2NTU0MDk1OEUtMTE5MiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDc5IHJlbWFpbmRlciAtNTk5MzY5NTQwLjM3MzE3NDQ4MjMzNTg2NTU2NzkzNzg1M0UrMjg5IC0zODI4ODM4MzIwNS42NzQ5NDM5NTg4NzA3OTU1NTg1MjA5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ3OSBzdWJ0cmFjdCAtNTk5MzY5NTQwLjM3MzE3NDQ4MjMzNTg2NTU2NzkzNzg1M0UrMjg5IC0zODI4ODM4MzIwNS42NzQ5NDM5NTg4NzA3OTU1NTg1MjA5IC0+IC01Ljk5MzY5NTQwMzczMTc0NDgyMzM1ODY1NTY3OTM3ODUzRSsyOTcgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ4MCBhZGQgLTMzNzY4ODM4NzAuODU5NjE2OTIxNDgwMjI1MjE5NjAxMzkgLTY1MjQ3NDg5NDQ5LjczMzQ1ODk3MzExNzE5ODA0MDgyODQgLT4gLTY4NjI0MzczMzIwLjU5MzA3NTg5NDU5NzQyMzI2MDQyOTggSW5leGFjdCBSb3VuZGVkCitjb214MzQ4MCBjb21wYXJlIC0zMzc2ODgzODcwLjg1OTYxNjkyMTQ4MDIyNTIxOTYwMTM5IC02NTI0NzQ4OTQ0OS43MzM0NTg5NzMxMTcxOTgwNDA4Mjg0IC0+IDEKK2RpdngzNDgwIGRpdmlkZSAtMzM3Njg4Mzg3MC44NTk2MTY5MjE0ODAyMjUyMTk2MDEzOSAtNjUyNDc0ODk0NDkuNzMzNDU4OTczMTE3MTk4MDQwODI4NCAtPiAwLjA1MTc1NTAwMDgzMzU3NDc4MTM1OTYzMzI0MDQ2NjQ3MzEgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ4MCBkaXZpZGVpbnQgLTMzNzY4ODM4NzAuODU5NjE2OTIxNDgwMjI1MjE5NjAxMzkgLTY1MjQ3NDg5NDQ5LjczMzQ1ODk3MzExNzE5ODA0MDgyODQgLT4gMAorbXVseDM0ODAgbXVsdGlwbHkgLTMzNzY4ODM4NzAuODU5NjE2OTIxNDgwMjI1MjE5NjAxMzkgLTY1MjQ3NDg5NDQ5LjczMzQ1ODk3MzExNzE5ODA0MDgyODQgLT4gMjIwMzMzMTk0NzM2ODg3OTM5NDIwLjcxOTU3OTkwNjI1NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDgwIHBvd2VyIC0zMzc2ODgzODcwLjg1OTYxNjkyMTQ4MDIyNTIxOTYwMTM5IC03IC0+IC0xLjk5NzA0MTYzNzE4MzYxMTUzMTI1NzM1NzU2MTc5MjgwRS02NyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDgwIHJlbWFpbmRlciAtMzM3Njg4Mzg3MC44NTk2MTY5MjE0ODAyMjUyMTk2MDEzOSAtNjUyNDc0ODk0NDkuNzMzNDU4OTczMTE3MTk4MDQwODI4NCAtPiAtMzM3Njg4Mzg3MC44NTk2MTY5MjE0ODAyMjUyMTk2MDEzOQorc3VieDM0ODAgc3VidHJhY3QgLTMzNzY4ODM4NzAuODU5NjE2OTIxNDgwMjI1MjE5NjAxMzkgLTY1MjQ3NDg5NDQ5LjczMzQ1ODk3MzExNzE5ODA0MDgyODQgLT4gNjE4NzA2MDU1NzguODczODQyMDUxNjM2OTcyODIxMjI3MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDgxIGFkZCA1OC42Nzc2NzgwMzcwMDA4MzY0NTkwNjIxNzcyNDIxMDI1IDAxLjU5MjU1MTg4NjY1MjkwNDQ0OTQzMDkyMjk5NzUxNjAgLT4gNjAuMjcwMjI5OTIzNjUzNzQwOTA4NDkzMTAwMjM5NjE4NQorY29teDM0ODEgY29tcGFyZSA1OC42Nzc2NzgwMzcwMDA4MzY0NTkwNjIxNzcyNDIxMDI1IDAxLjU5MjU1MTg4NjY1MjkwNDQ0OTQzMDkyMjk5NzUxNjAgLT4gMQorZGl2eDM0ODEgZGl2aWRlIDU4LjY3NzY3ODAzNzAwMDgzNjQ1OTA2MjE3NzI0MjEwMjUgMDEuNTkyNTUxODg2NjUyOTA0NDQ5NDMwOTIyOTk3NTE2MCAtPiAzNi44NDUwNjUxNjE2Mjg2MDQ4NDM3NDk4NTc2NjEzNjIyIEluZXhhY3QgUm91bmRlZAorZHZpeDM0ODEgZGl2aWRlaW50IDU4LjY3NzY3ODAzNzAwMDgzNjQ1OTA2MjE3NzI0MjEwMjUgMDEuNTkyNTUxODg2NjUyOTA0NDQ5NDMwOTIyOTk3NTE2MCAtPiAzNgorbXVseDM0ODEgbXVsdGlwbHkgNTguNjc3Njc4MDM3MDAwODM2NDU5MDYyMTc3MjQyMTAyNSAwMS41OTI1NTE4ODY2NTI5MDQ0NDk0MzA5MjI5OTc1MTYwIC0+IDkzLjQ0NzI0Njg2MjIzNzM3Njk1OTA5MDAyNTgwNjAwMjkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ4MSBwb3dlciA1OC42Nzc2NzgwMzcwMDA4MzY0NTkwNjIxNzcyNDIxMDI1IDIgLT4gMzQ0My4wNjk4OTk4MTM5MzAzMzYzMjAwODMxMzUwNTIzMCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDgxIHJlbWFpbmRlciA1OC42Nzc2NzgwMzcwMDA4MzY0NTkwNjIxNzcyNDIxMDI1IDAxLjU5MjU1MTg4NjY1MjkwNDQ0OTQzMDkyMjk5NzUxNjAgLT4gMS4zNDU4MTAxMTc0OTYyNzYyNzk1NDg5NDkzMzE1MjY1CitzdWJ4MzQ4MSBzdWJ0cmFjdCA1OC42Nzc2NzgwMzcwMDA4MzY0NTkwNjIxNzcyNDIxMDI1IDAxLjU5MjU1MTg4NjY1MjkwNDQ0OTQzMDkyMjk5NzUxNjAgLT4gNTcuMDg1MTI2MTUwMzQ3OTMyMDA5NjMxMjU0MjQ0NTg2NQorYWRkeDM0ODIgYWRkIDQwOTk2MTYzMzkuOTYyNDk0OTk1NTI4MDg1NzU3MTc1NzkgMjkwLjc5NTE4NzM2MTA3MjQ4OTgxNjc5MTUyNTEzOTg5NSAtPiA0MDk5NjE2NjMwLjc1NzY4MjM1NjYwMDU3NTU3Mzk2NzMyIEluZXhhY3QgUm91bmRlZAorY29teDM0ODIgY29tcGFyZSA0MDk5NjE2MzM5Ljk2MjQ5NDk5NTUyODA4NTc1NzE3NTc5IDI5MC43OTUxODczNjEwNzI0ODk4MTY3OTE1MjUxMzk4OTUgLT4gMQorZGl2eDM0ODIgZGl2aWRlIDQwOTk2MTYzMzkuOTYyNDk0OTk1NTI4MDg1NzU3MTc1NzkgMjkwLjc5NTE4NzM2MTA3MjQ4OTgxNjc5MTUyNTEzOTg5NSAtPiAxNDA5Nzk1MS4xMjg5OTIwNzg4MTM0MjA5MDAyMzkwODM0IEluZXhhY3QgUm91bmRlZAorZHZpeDM0ODIgZGl2aWRlaW50IDQwOTk2MTYzMzkuOTYyNDk0OTk1NTI4MDg1NzU3MTc1NzkgMjkwLjc5NTE4NzM2MTA3MjQ4OTgxNjc5MTUyNTEzOTg5NSAtPiAxNDA5Nzk1MQorbXVseDM0ODIgbXVsdGlwbHkgNDA5OTYxNjMzOS45NjI0OTQ5OTU1MjgwODU3NTcxNzU3OSAyOTAuNzk1MTg3MzYxMDcyNDg5ODE2NzkxNTI1MTM5ODk1IC0+IDExOTIxNDg3MDE2ODcuOTA3OTg0Mzc1MDEzOTc5MDAxNzQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ4MiBwb3dlciA0MDk5NjE2MzM5Ljk2MjQ5NDk5NTUyODA4NTc1NzE3NTc5IDI5MSAtPiAyLjAzMzY0NzU3ODc3ODAwNDk3NDA5NzY1OTc5ODc3MjU4RSsyNzk3IEluZXhhY3QgUm91bmRlZAorcmVteDM0ODIgcmVtYWluZGVyIDQwOTk2MTYzMzkuOTYyNDk0OTk1NTI4MDg1NzU3MTc1NzkgMjkwLjc5NTE4NzM2MTA3MjQ4OTgxNjc5MTUyNTEzOTg5NSAtPiAzNy41MTAyNzU3MjY2NDI5NTk4NTg1MzgyODIxNDQ4NTUKK3N1YngzNDgyIHN1YnRyYWN0IDQwOTk2MTYzMzkuOTYyNDk0OTk1NTI4MDg1NzU3MTc1NzkgMjkwLjc5NTE4NzM2MTA3MjQ4OTgxNjc5MTUyNTEzOTg5NSAtPiA0MDk5NjE2MDQ5LjE2NzMwNzYzNDQ1NTU5NTk0MDM4NDI2IEluZXhhY3QgUm91bmRlZAorYWRkeDM0ODMgYWRkIDg1ODcwNzc3LjIyODI4MzMxNDE3MDk5NzA3MTM3MzkxMDggLTIxNDAzOTI4NjExNTMuNjk0MDEzNDYzOTg0NzgxMTM3MTUgLT4gLTIxNDAzMDY5OTAzNzYuNDY1NzMwMTQ5ODEzNzg0MDY1NzggSW5leGFjdCBSb3VuZGVkCitjb214MzQ4MyBjb21wYXJlIDg1ODcwNzc3LjIyODI4MzMxNDE3MDk5NzA3MTM3MzkxMDggLTIxNDAzOTI4NjExNTMuNjk0MDEzNDYzOTg0NzgxMTM3MTUgLT4gMQorZGl2eDM0ODMgZGl2aWRlIDg1ODcwNzc3LjIyODI4MzMxNDE3MDk5NzA3MTM3MzkxMDggLTIxNDAzOTI4NjExNTMuNjk0MDEzNDYzOTg0NzgxMTM3MTUgLT4gLTAuMDAwMDQwMTE5MTY2MzM5Mzk3MTg1MzA5Mjc0ODI2MzIzMzEyOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDgzIGRpdmlkZWludCA4NTg3MDc3Ny4yMjgyODMzMTQxNzA5OTcwNzEzNzM5MTA4IC0yMTQwMzkyODYxMTUzLjY5NDAxMzQ2Mzk4NDc4MTEzNzE1IC0+IC0wCittdWx4MzQ4MyBtdWx0aXBseSA4NTg3MDc3Ny4yMjgyODMzMTQxNzA5OTcwNzEzNzM5MTA4IC0yMTQwMzkyODYxMTUzLjY5NDAxMzQ2Mzk4NDc4MTEzNzE1IC0+IC0xODM3OTcxOTg1NjExMzY3OTczMjguNTA4ODc4MjU0ODQ4IEluZXhhY3QgUm91bmRlZAorcG93eDM0ODMgcG93ZXIgODU4NzA3NzcuMjI4MjgzMzE0MTcwOTk3MDcxMzczOTEwOCAtMiAtPiAxLjM1NjE1NDYzNDQ4NzA3NTczNDI0NTc4Nzg1OTczMjY5RS0xNiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDgzIHJlbWFpbmRlciA4NTg3MDc3Ny4yMjgyODMzMTQxNzA5OTcwNzEzNzM5MTA4IC0yMTQwMzkyODYxMTUzLjY5NDAxMzQ2Mzk4NDc4MTEzNzE1IC0+IDg1ODcwNzc3LjIyODI4MzMxNDE3MDk5NzA3MTM3MzkxMDgKK3N1YngzNDgzIHN1YnRyYWN0IDg1ODcwNzc3LjIyODI4MzMxNDE3MDk5NzA3MTM3MzkxMDggLTIxNDAzOTI4NjExNTMuNjk0MDEzNDYzOTg0NzgxMTM3MTUgLT4gMjE0MDQ3ODczMTkzMC45MjIyOTY3NzgxNTU3NzgyMDg1MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDg0IGFkZCAyMDkwMC45NjkzNzYxNTU1MTY1NzQyMDEwMzM5OTI5Nzc5IC0zOC43NTQ2MTQ3NjQ5NTIzNzkzNDYzMjYwOTQwMjg5NTg1IC0+IDIwODYyLjIxNDc2MTM5MDU2NDE5NDg1NDcwNzg5ODk0ODkgSW5leGFjdCBSb3VuZGVkCitjb214MzQ4NCBjb21wYXJlIDIwOTAwLjk2OTM3NjE1NTUxNjU3NDIwMTAzMzk5Mjk3NzkgLTM4Ljc1NDYxNDc2NDk1MjM3OTM0NjMyNjA5NDAyODk1ODUgLT4gMQorZGl2eDM0ODQgZGl2aWRlIDIwOTAwLjk2OTM3NjE1NTUxNjU3NDIwMTAzMzk5Mjk3NzkgLTM4Ljc1NDYxNDc2NDk1MjM3OTM0NjMyNjA5NDAyODk1ODUgLT4gLTUzOS4zMTU2MjczODgzODY0MzAxODg2Mjc0MTI2Mzk3NjcgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ4NCBkaXZpZGVpbnQgMjA5MDAuOTY5Mzc2MTU1NTE2NTc0MjAxMDMzOTkyOTc3OSAtMzguNzU0NjE0NzY0OTUyMzc5MzQ2MzI2MDk0MDI4OTU4NSAtPiAtNTM5CittdWx4MzQ4NCBtdWx0aXBseSAyMDkwMC45NjkzNzYxNTU1MTY1NzQyMDEwMzM5OTI5Nzc5IC0zOC43NTQ2MTQ3NjQ5NTIzNzkzNDYzMjYwOTQwMjg5NTg1IC0+IC04MTAwMDkuMDE2Mzg2OTc0MTAzNzM4NjIyNzkzNjcwNTY2IEluZXhhY3QgUm91bmRlZAorcG93eDM0ODQgcG93ZXIgMjA5MDAuOTY5Mzc2MTU1NTE2NTc0MjAxMDMzOTkyOTc3OSAtMzkgLT4gMy4yNjIxOTAxNDcwMTUyNjMzNTI5NjA0NDQzOTk4OTY2NUUtMTY5IEluZXhhY3QgUm91bmRlZAorcmVteDM0ODQgcmVtYWluZGVyIDIwOTAwLjk2OTM3NjE1NTUxNjU3NDIwMTAzMzk5Mjk3NzkgLTM4Ljc1NDYxNDc2NDk1MjM3OTM0NjMyNjA5NDAyODk1ODUgLT4gMTIuMjMyMDE3ODQ2MTg0MTA2NTMxMjY5MzExMzY5MjY4NQorc3VieDM0ODQgc3VidHJhY3QgMjA5MDAuOTY5Mzc2MTU1NTE2NTc0MjAxMDMzOTkyOTc3OSAtMzguNzU0NjE0NzY0OTUyMzc5MzQ2MzI2MDk0MDI4OTU4NSAtPiAyMDkzOS43MjM5OTA5MjA0Njg5NTM1NDczNjAwODcwMDY5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0ODUgYWRkIDQ0OC44Mjc1OTYxNTU1ODc5MTA5NDc1MTExNzAzMTk0NTYgMzc5MTMwMTUzLjM4Mjc5NDA0MjY1Mjk3NDU5NjI4NjA2MiAtPiAzNzkxMzA2MDIuMjEwMzkwMTk4MjQwODg1NTQzNzk3MjMyIEluZXhhY3QgUm91bmRlZAorY29teDM0ODUgY29tcGFyZSA0NDguODI3NTk2MTU1NTg3OTEwOTQ3NTExMTcwMzE5NDU2IDM3OTEzMDE1My4zODI3OTQwNDI2NTI5NzQ1OTYyODYwNjIgLT4gLTEKK2RpdngzNDg1IGRpdmlkZSA0NDguODI3NTk2MTU1NTg3OTEwOTQ3NTExMTcwMzE5NDU2IDM3OTEzMDE1My4zODI3OTQwNDI2NTI5NzQ1OTYyODYwNjIgLT4gMC4wMDAwMDExODM4MzUxMzQ1ODYxNTA2MTM5NDE0MDg5NTU5Njk3OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDg1IGRpdmlkZWludCA0NDguODI3NTk2MTU1NTg3OTEwOTQ3NTExMTcwMzE5NDU2IDM3OTEzMDE1My4zODI3OTQwNDI2NTI5NzQ1OTYyODYwNjIgLT4gMAorbXVseDM0ODUgbXVsdGlwbHkgNDQ4LjgyNzU5NjE1NTU4NzkxMDk0NzUxMTE3MDMxOTQ1NiAzNzkxMzAxNTMuMzgyNzk0MDQyNjUyOTc0NTk2Mjg2MDYyIC0+IDE3MDE2NDA3NTM3Mi44OTg3ODY0NjkwOTQ0NjA2OTIwOTcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ4NSBwb3dlciA0NDguODI3NTk2MTU1NTg3OTEwOTQ3NTExMTcwMzE5NDU2IDM3OTEzMDE1MyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDg1IHJlbWFpbmRlciA0NDguODI3NTk2MTU1NTg3OTEwOTQ3NTExMTcwMzE5NDU2IDM3OTEzMDE1My4zODI3OTQwNDI2NTI5NzQ1OTYyODYwNjIgLT4gNDQ4LjgyNzU5NjE1NTU4NzkxMDk0NzUxMTE3MDMxOTQ1Ngorc3VieDM0ODUgc3VidHJhY3QgNDQ4LjgyNzU5NjE1NTU4NzkxMDk0NzUxMTE3MDMxOTQ1NiAzNzkxMzAxNTMuMzgyNzk0MDQyNjUyOTc0NTk2Mjg2MDYyIC0+IC0zNzkxMjk3MDQuNTU1MTk3ODg3MDY1MDYzNjQ4Nzc0ODkyIEluZXhhY3QgUm91bmRlZAorYWRkeDM0ODYgYWRkIDk4LjQxMzQ4MDc5MjEwMDI4MTczNTcwMDAxNDA0ODIwMzkgMzQwNDcyNTU0My43NzAzMjk0NTQ0NDY1NDM1MTU0Njc3OSAtPiAzNDA0NzI1NjQyLjE4MzgxMDI0NjU0NjgyNTI1MTE2NzgwIEluZXhhY3QgUm91bmRlZAorY29teDM0ODYgY29tcGFyZSA5OC40MTM0ODA3OTIxMDAyODE3MzU3MDAwMTQwNDgyMDM5IDM0MDQ3MjU1NDMuNzcwMzI5NDU0NDQ2NTQzNTE1NDY3NzkgLT4gLTEKK2RpdngzNDg2IGRpdmlkZSA5OC40MTM0ODA3OTIxMDAyODE3MzU3MDAwMTQwNDgyMDM5IDM0MDQ3MjU1NDMuNzcwMzI5NDU0NDQ2NTQzNTE1NDY3NzkgLT4gMi44OTA0OTY3MzgzMzk3MDg2MzQyMDIwMTk3OTI5MTUyM0UtOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDg2IGRpdmlkZWludCA5OC40MTM0ODA3OTIxMDAyODE3MzU3MDAwMTQwNDgyMDM5IDM0MDQ3MjU1NDMuNzcwMzI5NDU0NDQ2NTQzNTE1NDY3NzkgLT4gMAorbXVseDM0ODYgbXVsdGlwbHkgOTguNDEzNDgwNzkyMTAwMjgxNzM1NzAwMDE0MDQ4MjAzOSAzNDA0NzI1NTQzLjc3MDMyOTQ1NDQ0NjU0MzUxNTQ2Nzc5IC0+IDMzNTA3MDg5MTkwNC4yMTQ1MDQ4MTE3OTgyMTIwNDA0MTMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ4NiBwb3dlciA5OC40MTM0ODA3OTIxMDAyODE3MzU3MDAwMTQwNDgyMDM5IDMgLT4gOTUzMTU1LjU0MzM4NDczOTY2Nzk2NTA1NTgzOTg5NDY4MiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDg2IHJlbWFpbmRlciA5OC40MTM0ODA3OTIxMDAyODE3MzU3MDAwMTQwNDgyMDM5IDM0MDQ3MjU1NDMuNzcwMzI5NDU0NDQ2NTQzNTE1NDY3NzkgLT4gOTguNDEzNDgwNzkyMTAwMjgxNzM1NzAwMDE0MDQ4MjAzOQorc3VieDM0ODYgc3VidHJhY3QgOTguNDEzNDgwNzkyMTAwMjgxNzM1NzAwMDE0MDQ4MjAzOSAzNDA0NzI1NTQzLjc3MDMyOTQ1NDQ0NjU0MzUxNTQ2Nzc5IC0+IC0zNDA0NzI1NDQ1LjM1Njg0ODY2MjM0NjI2MTc3OTc2Nzc4IEluZXhhY3QgUm91bmRlZAorYWRkeDM0ODcgYWRkIDU0NTc0NjQzMy42NDkzNTk3MzQxMzY0NzY3MTgxNzYzMzBFLTc4NyAtNTE0OTk1NzA5OTcwOS4xMjgzMDA3MjgwMjA0MzU2MDY1MEUtNDM3IC0+IC01LjE0OTk1NzA5OTcwOTEyODMwMDcyODAyMDQzNTYwNjUwRS00MjUgSW5leGFjdCBSb3VuZGVkCitjb214MzQ4NyBjb21wYXJlIDU0NTc0NjQzMy42NDkzNTk3MzQxMzY0NzY3MTgxNzYzMzBFLTc4NyAtNTE0OTk1NzA5OTcwOS4xMjgzMDA3MjgwMjA0MzU2MDY1MEUtNDM3IC0+IDEKK2RpdngzNDg3IGRpdmlkZSA1NDU3NDY0MzMuNjQ5MzU5NzM0MTM2NDc2NzE4MTc2MzMwRS03ODcgLTUxNDk5NTcwOTk3MDkuMTI4MzAwNzI4MDIwNDM1NjA2NTBFLTQzNyAtPiAtMS4wNTk3MTA2NDA0NjM3NTAxMTA4Njg1MDcyMjc1MjYxNEUtMzU0IEluZXhhY3QgUm91bmRlZAorZHZpeDM0ODcgZGl2aWRlaW50IDU0NTc0NjQzMy42NDkzNTk3MzQxMzY0NzY3MTgxNzYzMzBFLTc4NyAtNTE0OTk1NzA5OTcwOS4xMjgzMDA3MjgwMjA0MzU2MDY1MEUtNDM3IC0+IC0wCittdWx4MzQ4NyBtdWx0aXBseSA1NDU3NDY0MzMuNjQ5MzU5NzM0MTM2NDc2NzE4MTc2MzMwRS03ODcgLTUxNDk5NTcwOTk3MDkuMTI4MzAwNzI4MDIwNDM1NjA2NTBFLTQzNyAtPiAtMi44MTA1NzA3MjA2MTM0NTY4ODA3NDMwNDg3MzAzMzMxN0UtMTIwMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDg3IHBvd2VyIDU0NTc0NjQzMy42NDkzNTk3MzQxMzY0NzY3MTgxNzYzMzBFLTc4NyAtNSAtPiAyLjA2NTU5NjQwMDkyNjY3MTY2OTc2MTg2ODAxMzQ4NjYyRSszODkxIEluZXhhY3QgUm91bmRlZAorcmVteDM0ODcgcmVtYWluZGVyIDU0NTc0NjQzMy42NDkzNTk3MzQxMzY0NzY3MTgxNzYzMzBFLTc4NyAtNTE0OTk1NzA5OTcwOS4xMjgzMDA3MjgwMjA0MzU2MDY1MEUtNDM3IC0+IDUuNDU3NDY0MzM2NDkzNTk3MzQxMzY0NzY3MTgxNzYzMzBFLTc3OQorc3VieDM0ODcgc3VidHJhY3QgNTQ1NzQ2NDMzLjY0OTM1OTczNDEzNjQ3NjcxODE3NjMzMEUtNzg3IC01MTQ5OTU3MDk5NzA5LjEyODMwMDcyODAyMDQzNTYwNjUwRS00MzcgLT4gNS4xNDk5NTcwOTk3MDkxMjgzMDA3MjgwMjA0MzU2MDY1MEUtNDI1IEluZXhhY3QgUm91bmRlZAorYWRkeDM0ODggYWRkIDc0MTMwNDUxMzU0Ny4yNzM4MjA1MjU4MDE2MDgyMzE3MzcgMDM5Ni4yMjgyMzEyODI3MjU4NDkyODAxOTMyMzE4NjM1NUUtODMwIC0+IDc0MTMwNDUxMzU0Ny4yNzM4MjA1MjU4MDE2MDgyMzE3MzcgSW5leGFjdCBSb3VuZGVkCitjb214MzQ4OCBjb21wYXJlIDc0MTMwNDUxMzU0Ny4yNzM4MjA1MjU4MDE2MDgyMzE3MzcgMDM5Ni4yMjgyMzEyODI3MjU4NDkyODAxOTMyMzE4NjM1NUUtODMwIC0+IDEKK2RpdngzNDg4IGRpdmlkZSA3NDEzMDQ1MTM1NDcuMjczODIwNTI1ODAxNjA4MjMxNzM3IDAzOTYuMjI4MjMxMjgyNzI1ODQ5MjgwMTkzMjMxODYzNTVFLTgzMCAtPiAxLjg3MDkwMjgxNTY1MTAxNjEyNjIzMzk4MTc0NzI3NjUzRSs4MzkgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ4OCBkaXZpZGVpbnQgNzQxMzA0NTEzNTQ3LjI3MzgyMDUyNTgwMTYwODIzMTczNyAwMzk2LjIyODIzMTI4MjcyNTg0OTI4MDE5MzIzMTg2MzU1RS04MzAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDg4IG11bHRpcGx5IDc0MTMwNDUxMzU0Ny4yNzM4MjA1MjU4MDE2MDgyMzE3MzcgMDM5Ni4yMjgyMzEyODI3MjU4NDkyODAxOTMyMzE4NjM1NUUtODMwIC0+IDIuOTM3MjU3NzYyNDQ3Mzc3ODg5NDc0NDMzNjEwNzYwOTVFLTgxNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDg4IHBvd2VyIDc0MTMwNDUxMzU0Ny4yNzM4MjA1MjU4MDE2MDgyMzE3MzcgNCAtPiAzLjAxOTg1ODM4NjUyODkyMDczOTAzMTk0ODQ2NjY4NzEyRSs0NyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDg4IHJlbWFpbmRlciA3NDEzMDQ1MTM1NDcuMjczODIwNTI1ODAxNjA4MjMxNzM3IDAzOTYuMjI4MjMxMjgyNzI1ODQ5MjgwMTkzMjMxODYzNTVFLTgzMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0ODggc3VidHJhY3QgNzQxMzA0NTEzNTQ3LjI3MzgyMDUyNTgwMTYwODIzMTczNyAwMzk2LjIyODIzMTI4MjcyNTg0OTI4MDE5MzIzMTg2MzU1RS04MzAgLT4gNzQxMzA0NTEzNTQ3LjI3MzgyMDUyNTgwMTYwODIzMTczNyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDg5IGFkZCAtNzA2LjE0NTAwNTA5NDI5MjMxNTYxMzkwNzI1NDI0MDU1MyA0NzM5LjgyNDg2MTk1NzM5NzU4MzA4NzM1OTQ2MzMyMjM0IC0+IDQwMzMuNjc5ODU2ODYzMTA1MjY3NDczNDUyMjA5MDgxNzkgSW5leGFjdCBSb3VuZGVkCitjb214MzQ4OSBjb21wYXJlIC03MDYuMTQ1MDA1MDk0MjkyMzE1NjEzOTA3MjU0MjQwNTUzIDQ3MzkuODI0ODYxOTU3Mzk3NTgzMDg3MzU5NDYzMzIyMzQgLT4gLTEKK2RpdngzNDg5IGRpdmlkZSAtNzA2LjE0NTAwNTA5NDI5MjMxNTYxMzkwNzI1NDI0MDU1MyA0NzM5LjgyNDg2MTk1NzM5NzU4MzA4NzM1OTQ2MzMyMjM0IC0+IC0wLjE0ODk4MTI0NDE3MjUyNzY3MTkwNzUzNDExNzc3MTYyNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDg5IGRpdmlkZWludCAtNzA2LjE0NTAwNTA5NDI5MjMxNTYxMzkwNzI1NDI0MDU1MyA0NzM5LjgyNDg2MTk1NzM5NzU4MzA4NzM1OTQ2MzMyMjM0IC0+IC0wCittdWx4MzQ4OSBtdWx0aXBseSAtNzA2LjE0NTAwNTA5NDI5MjMxNTYxMzkwNzI1NDI0MDU1MyA0NzM5LjgyNDg2MTk1NzM5NzU4MzA4NzM1OTQ2MzMyMjM0IC0+IC0zMzQ3MDAzLjY1MTI5Mjk1OTg4NzkzNDU0MjY3OTczNDY0IEluZXhhY3QgUm91bmRlZAorcG93eDM0ODkgcG93ZXIgLTcwNi4xNDUwMDUwOTQyOTIzMTU2MTM5MDcyNTQyNDA1NTMgNDc0MCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDg5IHJlbWFpbmRlciAtNzA2LjE0NTAwNTA5NDI5MjMxNTYxMzkwNzI1NDI0MDU1MyA0NzM5LjgyNDg2MTk1NzM5NzU4MzA4NzM1OTQ2MzMyMjM0IC0+IC03MDYuMTQ1MDA1MDk0MjkyMzE1NjEzOTA3MjU0MjQwNTUzCitzdWJ4MzQ4OSBzdWJ0cmFjdCAtNzA2LjE0NTAwNTA5NDI5MjMxNTYxMzkwNzI1NDI0MDU1MyA0NzM5LjgyNDg2MTk1NzM5NzU4MzA4NzM1OTQ2MzMyMjM0IC0+IC01NDQ1Ljk2OTg2NzA1MTY4OTg5ODcwMTI2NjcxNzU2Mjg5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0OTAgYWRkIC03Njk5MjU3ODYuODIzMDk5MDgzMjI4Nzk1MTg3OTc1ODkzIC0zMTIwMS45OTgwNDY5NzYwMjM5ODcwMDY3ODIwNTk0NzkwIC0+IC03Njk5NTY5ODguODIxMTQ2MDU5MjUyNzgyMTk0NzU3OTUyIEluZXhhY3QgUm91bmRlZAorY29teDM0OTAgY29tcGFyZSAtNzY5OTI1Nzg2LjgyMzA5OTA4MzIyODc5NTE4Nzk3NTg5MyAtMzEyMDEuOTk4MDQ2OTc2MDIzOTg3MDA2NzgyMDU5NDc5MCAtPiAtMQorZGl2eDM0OTAgZGl2aWRlIC03Njk5MjU3ODYuODIzMDk5MDgzMjI4Nzk1MTg3OTc1ODkzIC0zMTIwMS45OTgwNDY5NzYwMjM5ODcwMDY3ODIwNTk0NzkwIC0+IDI0Njc1LjUyODMzMTk5Nzg2OTg5MzIyOTIwMjg2NTA4MDMgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ5MCBkaXZpZGVpbnQgLTc2OTkyNTc4Ni44MjMwOTkwODMyMjg3OTUxODc5NzU4OTMgLTMxMjAxLjk5ODA0Njk3NjAyMzk4NzAwNjc4MjA1OTQ3OTAgLT4gMjQ2NzUKK211bHgzNDkwIG11bHRpcGx5IC03Njk5MjU3ODYuODIzMDk5MDgzMjI4Nzk1MTg3OTc1ODkzIC0zMTIwMS45OTgwNDY5NzYwMjM5ODcwMDY3ODIwNTk0NzkwIC0+IDI0MDIzMjIyODk2NzcwLjgxNjE3ODcyMzY3MzczOTU0NzcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ5MCBwb3dlciAtNzY5OTI1Nzg2LjgyMzA5OTA4MzIyODc5NTE4Nzk3NTg5MyAtMzEyMDIgLT4gMEUtMTAwMzEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDM0OTAgcmVtYWluZGVyIC03Njk5MjU3ODYuODIzMDk5MDgzMjI4Nzk1MTg3OTc1ODkzIC0zMTIwMS45OTgwNDY5NzYwMjM5ODcwMDY3ODIwNTk0NzkwIC0+IC0xNjQ4NS4wMTM5NjU2OTEzNDk0MDI4NDA2NTgyNDg2NzUwCitzdWJ4MzQ5MCBzdWJ0cmFjdCAtNzY5OTI1Nzg2LjgyMzA5OTA4MzIyODc5NTE4Nzk3NTg5MyAtMzEyMDEuOTk4MDQ2OTc2MDIzOTg3MDA2NzgyMDU5NDc5MCAtPiAtNzY5ODk0NTg0LjgyNTA1MjEwNzIwNDgwODE4MTE5MzgzNCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDkxIGFkZCA4NDQzODYxMDU0NjA0OS43MjU2NTA3NDE5Mjg5NjkyODU3RSs5MDYgMDUyNjA0MjQwNzY2NzM2NDYxODk4ODQ0MTExNzkwMzExIC0+IDguNDQzODYxMDU0NjA0OTcyNTY1MDc0MTkyODk2OTI4NTdFKzkxOSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDkxIGNvbXBhcmUgODQ0Mzg2MTA1NDYwNDkuNzI1NjUwNzQxOTI4OTY5Mjg1N0UrOTA2IDA1MjYwNDI0MDc2NjczNjQ2MTg5ODg0NDExMTc5MDMxMSAtPiAxCitkaXZ4MzQ5MSBkaXZpZGUgODQ0Mzg2MTA1NDYwNDkuNzI1NjUwNzQxOTI4OTY5Mjg1N0UrOTA2IDA1MjYwNDI0MDc2NjczNjQ2MTg5ODg0NDExMTc5MDMxMSAtPiAxLjYwNTE2NzM2NTEyNzAxOTc4Njk1NTU5MDAzMzQxOTIyRSs4ODggSW5leGFjdCBSb3VuZGVkCitkdml4MzQ5MSBkaXZpZGVpbnQgODQ0Mzg2MTA1NDYwNDkuNzI1NjUwNzQxOTI4OTY5Mjg1N0UrOTA2IDA1MjYwNDI0MDc2NjczNjQ2MTg5ODg0NDExMTc5MDMxMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0OTEgbXVsdGlwbHkgODQ0Mzg2MTA1NDYwNDkuNzI1NjUwNzQxOTI4OTY5Mjg1N0UrOTA2IDA1MjYwNDI0MDc2NjczNjQ2MTg5ODg0NDExMTc5MDMxMSAtPiA0LjQ0MTgyODk5OTE3MzA5MjMxNzc5ODM3NjY4MjEwNjEwRSs5NTEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ5MSBwb3dlciA4NDQzODYxMDU0NjA0OS43MjU2NTA3NDE5Mjg5NjkyODU3RSs5MDYgNSAtPiA0LjI5MjQ1MTQ0NzE5Njg5MjgzMjQ3MzQyODY2OTg4MjEzRSs0NTk5IEluZXhhY3QgUm91bmRlZAorcmVteDM0OTEgcmVtYWluZGVyIDg0NDM4NjEwNTQ2MDQ5LjcyNTY1MDc0MTkyODk2OTI4NTdFKzkwNiAwNTI2MDQyNDA3NjY3MzY0NjE4OTg4NDQxMTE3OTAzMTEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDkxIHN1YnRyYWN0IDg0NDM4NjEwNTQ2MDQ5LjcyNTY1MDc0MTkyODk2OTI4NTdFKzkwNiAwNTI2MDQyNDA3NjY3MzY0NjE4OTg4NDQxMTE3OTAzMTEgLT4gOC40NDM4NjEwNTQ2MDQ5NzI1NjUwNzQxOTI4OTY5Mjg1N0UrOTE5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0OTIgYWRkIDU0OTc2MC45MTEzMDQ3MjU3OTUxNjQ1ODk2MTkyODY1MTQgMTY1LjE2MDA4OTYxNTYwNDkyNDIwNzc1NDg4Mzk1MzQ4NCAtPiA1NDk5MjYuMDcxMzk0MzQxNDAwMDg4Nzk3Mzc0MTcwNDY3IEluZXhhY3QgUm91bmRlZAorY29teDM0OTIgY29tcGFyZSA1NDk3NjAuOTExMzA0NzI1Nzk1MTY0NTg5NjE5Mjg2NTE0IDE2NS4xNjAwODk2MTU2MDQ5MjQyMDc3NTQ4ODM5NTM0ODQgLT4gMQorZGl2eDM0OTIgZGl2aWRlIDU0OTc2MC45MTEzMDQ3MjU3OTUxNjQ1ODk2MTkyODY1MTQgMTY1LjE2MDA4OTYxNTYwNDkyNDIwNzc1NDg4Mzk1MzQ4NCAtPiAzMzI4LjY1NDcxNjY3MDYyMTA3NTk4Mzk1NzE0MzQ4MDg5IEluZXhhY3QgUm91bmRlZAorZHZpeDM0OTIgZGl2aWRlaW50IDU0OTc2MC45MTEzMDQ3MjU3OTUxNjQ1ODk2MTkyODY1MTQgMTY1LjE2MDA4OTYxNTYwNDkyNDIwNzc1NDg4Mzk1MzQ4NCAtPiAzMzI4CittdWx4MzQ5MiBtdWx0aXBseSA1NDk3NjAuOTExMzA0NzI1Nzk1MTY0NTg5NjE5Mjg2NTE0IDE2NS4xNjAwODk2MTU2MDQ5MjQyMDc3NTQ4ODM5NTM0ODQgLT4gOTA3OTg1NjEuMzc4MjQ1MTQyNTg2MTExMzY5NDczMjQ4NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDkyIHBvd2VyIDU0OTc2MC45MTEzMDQ3MjU3OTUxNjQ1ODk2MTkyODY1MTQgMTY1IC0+IDEuMzQ0ODg5MjU0NDIzODY1NDQwMjg4NzU2MDMzNDc2NTRFKzk0NyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDkyIHJlbWFpbmRlciA1NDk3NjAuOTExMzA0NzI1Nzk1MTY0NTg5NjE5Mjg2NTE0IDE2NS4xNjAwODk2MTU2MDQ5MjQyMDc3NTQ4ODM5NTM0ODQgLT4gMTA4LjEzMzA2Mzk5MjYwNzQwMTE4MTM2NTQ4OTMxOTI0OAorc3VieDM0OTIgc3VidHJhY3QgNTQ5NzYwLjkxMTMwNDcyNTc5NTE2NDU4OTYxOTI4NjUxNCAxNjUuMTYwMDg5NjE1NjA0OTI0MjA3NzU0ODgzOTUzNDg0IC0+IDU0OTU5NS43NTEyMTUxMTAxOTAyNDAzODE4NjQ0MDI1NjEgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ5MyBhZGQgMzY1MDUxNC4xODY0OTczNzk1Njg1NTgyODkzOTY2Mjc5NCAwODA4NjcyMS40MDM2ODg2OTQ4MjQ4Mjc0ODM0NzM1NjI5IC0+IDExNzM3MjM1LjU5MDE4NjA3NDM5MzM4NTc3Mjg3MDE5MDggSW5leGFjdCBSb3VuZGVkCitjb214MzQ5MyBjb21wYXJlIDM2NTA1MTQuMTg2NDk3Mzc5NTY4NTU4Mjg5Mzk2NjI3OTQgMDgwODY3MjEuNDAzNjg4Njk0ODI0ODI3NDgzNDczNTYyOSAtPiAtMQorZGl2eDM0OTMgZGl2aWRlIDM2NTA1MTQuMTg2NDk3Mzc5NTY4NTU4Mjg5Mzk2NjI3OTQgMDgwODY3MjEuNDAzNjg4Njk0ODI0ODI3NDgzNDczNTYyOSAtPiAwLjQ1MTQyMDc5MjcxMjM4NzI1MDg2NTQyMzIwODIzNDI5MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDkzIGRpdmlkZWludCAzNjUwNTE0LjE4NjQ5NzM3OTU2ODU1ODI4OTM5NjYyNzk0IDA4MDg2NzIxLjQwMzY4ODY5NDgyNDgyNzQ4MzQ3MzU2MjkgLT4gMAorbXVseDM0OTMgbXVsdGlwbHkgMzY1MDUxNC4xODY0OTczNzk1Njg1NTgyODkzOTY2Mjc5NCAwODA4NjcyMS40MDM2ODg2OTQ4MjQ4Mjc0ODM0NzM1NjI5IC0+IDI5NTIwNjkxMjA2NDE3LjU4MzE4ODY3NTI4MDg3NDU0MjEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ5MyBwb3dlciAzNjUwNTE0LjE4NjQ5NzM3OTU2ODU1ODI4OTM5NjYyNzk0IDgwODY3MjEgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzQ5MyByZW1haW5kZXIgMzY1MDUxNC4xODY0OTczNzk1Njg1NTgyODkzOTY2Mjc5NCAwODA4NjcyMS40MDM2ODg2OTQ4MjQ4Mjc0ODM0NzM1NjI5IC0+IDM2NTA1MTQuMTg2NDk3Mzc5NTY4NTU4Mjg5Mzk2NjI3OTQKK3N1YngzNDkzIHN1YnRyYWN0IDM2NTA1MTQuMTg2NDk3Mzc5NTY4NTU4Mjg5Mzk2NjI3OTQgMDgwODY3MjEuNDAzNjg4Njk0ODI0ODI3NDgzNDczNTYyOSAtPiAtNDQzNjIwNy4yMTcxOTEzMTUyNTYyNjkxOTQwNzY5MzQ5NgorYWRkeDM0OTQgYWRkIDU1MDY3NzIzODgxOTUwLjEzNDY5NTgxNzk2MDQwOTk1OTQgLTguOTA0ODE0ODE2ODcxODI5MzE0MzEwNTQ3ODUxOTIwODMgLT4gNTUwNjc3MjM4ODE5NDEuMjI5ODgxMDAxMDg4NTgwNjQ1MSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDk0IGNvbXBhcmUgNTUwNjc3MjM4ODE5NTAuMTM0Njk1ODE3OTYwNDA5OTU5NCAtOC45MDQ4MTQ4MTY4NzE4MjkzMTQzMTA1NDc4NTE5MjA4MyAtPiAxCitkaXZ4MzQ5NCBkaXZpZGUgNTUwNjc3MjM4ODE5NTAuMTM0Njk1ODE3OTYwNDA5OTU5NCAtOC45MDQ4MTQ4MTY4NzE4MjkzMTQzMTA1NDc4NTE5MjA4MyAtPiAtNjE4NDAzOTE5ODM5MS4xOTg1MzA4ODQxOTQ4NDExNzA1NCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDk0IGRpdmlkZWludCA1NTA2NzcyMzg4MTk1MC4xMzQ2OTU4MTc5NjA0MDk5NTk0IC04LjkwNDgxNDgxNjg3MTgyOTMxNDMxMDU0Nzg1MTkyMDgzIC0+IC02MTg0MDM5MTk4MzkxCittdWx4MzQ5NCBtdWx0aXBseSA1NTA2NzcyMzg4MTk1MC4xMzQ2OTU4MTc5NjA0MDk5NTk0IC04LjkwNDgxNDgxNjg3MTgyOTMxNDMxMDU0Nzg1MTkyMDgzIC0+IC00OTAzNjc4ODM1NTUzOTYuMjUwMzY1MTU4NTkzMzczMjc5IEluZXhhY3QgUm91bmRlZAorcG93eDM0OTQgcG93ZXIgNTUwNjc3MjM4ODE5NTAuMTM0Njk1ODE3OTYwNDA5OTU5NCAtOSAtPiAyLjE0NzQ2Mzg2NTM4NTI5MjcwMTczNzg4NDU3ODg3MTIxRS0xMjQgSW5leGFjdCBSb3VuZGVkCityZW14MzQ5NCByZW1haW5kZXIgNTUwNjc3MjM4ODE5NTAuMTM0Njk1ODE3OTYwNDA5OTU5NCAtOC45MDQ4MTQ4MTY4NzE4MjkzMTQzMTA1NDc4NTE5MjA4MyAtPiAxLjc2Nzg4MDc1OTE4NDg4NjkzMDg2MzQ3NzIwNDYxNTQ3CitzdWJ4MzQ5NCBzdWJ0cmFjdCA1NTA2NzcyMzg4MTk1MC4xMzQ2OTU4MTc5NjA0MDk5NTk0IC04LjkwNDgxNDgxNjg3MTgyOTMxNDMxMDU0Nzg1MTkyMDgzIC0+IDU1MDY3NzIzODgxOTU5LjAzOTUxMDYzNDgzMjIzOTI3MzcgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ5NSBhZGQgODY4MjUxMTIzLjQxMzk5MjY1MzM2Mjg2MDYzNzU0MTA2MEUrMDE5IDU1Nzk2NjUwNDUuMzc4NTgzMDg1NDExNTQ4NTg1Njc2NTZFKzEzMSAtPiA1LjU3OTY2NTA0NTM3ODU4MzA4NTQxMTU0ODU4NTY3NjU2RSsxNDAgSW5leGFjdCBSb3VuZGVkCitjb214MzQ5NSBjb21wYXJlIDg2ODI1MTEyMy40MTM5OTI2NTMzNjI4NjA2Mzc1NDEwNjBFKzAxOSA1NTc5NjY1MDQ1LjM3ODU4MzA4NTQxMTU0ODU4NTY3NjU2RSsxMzEgLT4gLTEKK2RpdngzNDk1IGRpdmlkZSA4NjgyNTExMjMuNDEzOTkyNjUzMzYyODYwNjM3NTQxMDYwRSswMTkgNTU3OTY2NTA0NS4zNzg1ODMwODU0MTE1NDg1ODU2NzY1NkUrMTMxIC0+IDEuNTU2MDk5MDA2NTc1OTA3MDYxNTUyNTE5MDI3MjUwMjdFLTExMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDk1IGRpdmlkZWludCA4NjgyNTExMjMuNDEzOTkyNjUzMzYyODYwNjM3NTQxMDYwRSswMTkgNTU3OTY2NTA0NS4zNzg1ODMwODU0MTE1NDg1ODU2NzY1NkUrMTMxIC0+IDAKK211bHgzNDk1IG11bHRpcGx5IDg2ODI1MTEyMy40MTM5OTI2NTMzNjI4NjA2Mzc1NDEwNjBFKzAxOSA1NTc5NjY1MDQ1LjM3ODU4MzA4NTQxMTU0ODU4NTY3NjU2RSsxMzEgLT4gNC44NDQ1NTA0NDM5MjM3NDEwNjEwNjk2Njc3OTMyMjQ4M0UrMTY4IEluZXhhY3QgUm91bmRlZAorcG93eDM0OTUgcG93ZXIgODY4MjUxMTIzLjQxMzk5MjY1MzM2Mjg2MDYzNzU0MTA2MEUrMDE5IDYgLT4gNC4yODQyMjM1NDMwNDI5MTg4NDgwMjY5MDczMzg1MzIyN0UrMTY3IEluZXhhY3QgUm91bmRlZAorcmVteDM0OTUgcmVtYWluZGVyIDg2ODI1MTEyMy40MTM5OTI2NTMzNjI4NjA2Mzc1NDEwNjBFKzAxOSA1NTc5NjY1MDQ1LjM3ODU4MzA4NTQxMTU0ODU4NTY3NjU2RSsxMzEgLT4gODY4MjUxMTIzNDEzOTkyNjUzMzYyODYwNjM3NS40MTA2MAorc3VieDM0OTUgc3VidHJhY3QgODY4MjUxMTIzLjQxMzk5MjY1MzM2Mjg2MDYzNzU0MTA2MEUrMDE5IDU1Nzk2NjUwNDUuMzc4NTgzMDg1NDExNTQ4NTg1Njc2NTZFKzEzMSAtPiAtNS41Nzk2NjUwNDUzNzg1ODMwODU0MTE1NDg1ODU2NzY1NkUrMTQwIEluZXhhY3QgUm91bmRlZAorYWRkeDM0OTYgYWRkIC02NDYuNDY0NDMxNTc0MDE0NDA3NTM2MDA0OTkwMDU5MDY5IC03OTguNjc5NTYwMDIwNDE0NTIzODQxMzIxNzI0NjQ5NTk0RS0wMzcgLT4gLTY0Ni40NjQ0MzE1NzQwMTQ0MDc1MzYwMDQ5OTAwNTkwNjkgSW5leGFjdCBSb3VuZGVkCitjb214MzQ5NiBjb21wYXJlIC02NDYuNDY0NDMxNTc0MDE0NDA3NTM2MDA0OTkwMDU5MDY5IC03OTguNjc5NTYwMDIwNDE0NTIzODQxMzIxNzI0NjQ5NTk0RS0wMzcgLT4gLTEKK2RpdngzNDk2IGRpdmlkZSAtNjQ2LjQ2NDQzMTU3NDAxNDQwNzUzNjAwNDk5MDA1OTA2OSAtNzk4LjY3OTU2MDAyMDQxNDUyMzg0MTMyMTcyNDY0OTU5NEUtMDM3IC0+IDguMDk0MTY1MjE4ODcwNjM4ODY2MTM1MjcyMjgzNTM1NDNFKzM2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0OTYgZGl2aWRlaW50IC02NDYuNDY0NDMxNTc0MDE0NDA3NTM2MDA0OTkwMDU5MDY5IC03OTguNjc5NTYwMDIwNDE0NTIzODQxMzIxNzI0NjQ5NTk0RS0wMzcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDk2IG11bHRpcGx5IC02NDYuNDY0NDMxNTc0MDE0NDA3NTM2MDA0OTkwMDU5MDY5IC03OTguNjc5NTYwMDIwNDE0NTIzODQxMzIxNzI0NjQ5NTk0RS0wMzcgLT4gNS4xNjMxNzkyNzc3ODM4MTE5Nzk5NTQ1MTM2MzQzOTYyNkUtMzIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ5NiBwb3dlciAtNjQ2LjQ2NDQzMTU3NDAxNDQwNzUzNjAwNDk5MDA1OTA2OSAtOCAtPiAzLjI3ODI1NjQxNTY5ODYwODYxNzc0NzAwNTQ4MDM1NjkxRS0yMyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDk2IHJlbWFpbmRlciAtNjQ2LjQ2NDQzMTU3NDAxNDQwNzUzNjAwNDk5MDA1OTA2OSAtNzk4LjY3OTU2MDAyMDQxNDUyMzg0MTMyMTcyNDY0OTU5NEUtMDM3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ5NiBzdWJ0cmFjdCAtNjQ2LjQ2NDQzMTU3NDAxNDQwNzUzNjAwNDk5MDA1OTA2OSAtNzk4LjY3OTU2MDAyMDQxNDUyMzg0MTMyMTcyNDY0OTU5NEUtMDM3IC0+IC02NDYuNDY0NDMxNTc0MDE0NDA3NTM2MDA0OTkwMDU5MDY5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0OTcgYWRkIDM1NC41NDY2Nzk5NzUyMTk3NTM1OTg1NTgyNzM0MjE1NTYgLTcwMzkuNDYzODY4MTIyMzkwMTUxNDQ1ODE3NjE3NTI5MjdFLTQ0OCAtPiAzNTQuNTQ2Njc5OTc1MjE5NzUzNTk4NTU4MjczNDIxNTU2IEluZXhhY3QgUm91bmRlZAorY29teDM0OTcgY29tcGFyZSAzNTQuNTQ2Njc5OTc1MjE5NzUzNTk4NTU4MjczNDIxNTU2IC03MDM5LjQ2Mzg2ODEyMjM5MDE1MTQ0NTgxNzYxNzUyOTI3RS00NDggLT4gMQorZGl2eDM0OTcgZGl2aWRlIDM1NC41NDY2Nzk5NzUyMTk3NTM1OTg1NTgyNzM0MjE1NTYgLTcwMzkuNDYzODY4MTIyMzkwMTUxNDQ1ODE3NjE3NTI5MjdFLTQ0OCAtPiAtNS4wMzY1NTc5OTEwMjQ3NzE5MjU3OTQxNDUyMzM1MjAyOEUrNDQ2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0OTcgZGl2aWRlaW50IDM1NC41NDY2Nzk5NzUyMTk3NTM1OTg1NTgyNzM0MjE1NTYgLTcwMzkuNDYzODY4MTIyMzkwMTUxNDQ1ODE3NjE3NTI5MjdFLTQ0OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0OTcgbXVsdGlwbHkgMzU0LjU0NjY3OTk3NTIxOTc1MzU5ODU1ODI3MzQyMTU1NiAtNzAzOS40NjM4NjgxMjIzOTAxNTE0NDU4MTc2MTc1MjkyN0UtNDQ4IC0+IC0yLjQ5NTgxODU0MzI0ODMxMTYxMjY3MzY5MjkyMDcxNDA4RS00NDIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ5NyBwb3dlciAzNTQuNTQ2Njc5OTc1MjE5NzUzNTk4NTU4MjczNDIxNTU2IC03IC0+IDEuNDE5OTkyNDYzNjU4NzU2MTcyOTgyNzA0MTQzMDQyMzNFLTE4IEluZXhhY3QgUm91bmRlZAorcmVteDM0OTcgcmVtYWluZGVyIDM1NC41NDY2Nzk5NzUyMTk3NTM1OTg1NTgyNzM0MjE1NTYgLTcwMzkuNDYzODY4MTIyMzkwMTUxNDQ1ODE3NjE3NTI5MjdFLTQ0OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0OTcgc3VidHJhY3QgMzU0LjU0NjY3OTk3NTIxOTc1MzU5ODU1ODI3MzQyMTU1NiAtNzAzOS40NjM4NjgxMjIzOTAxNTE0NDU4MTc2MTc1MjkyN0UtNDQ4IC0+IDM1NC41NDY2Nzk5NzUyMTk3NTM1OTg1NTgyNzM0MjE1NTYgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ5OCBhZGQgOTE5MzYwODc5MTc0MzUuNTk3NDg4OTQ5NTI3ODIxNTg3NCAtNjcwODA4MjMzNDQuODkwMzM5MjU4NDMyNzEzNjA4MjQ4NkUtNzU3IC0+IDkxOTM2MDg3OTE3NDM1LjU5NzQ4ODk0OTUyNzgyMTU4NzQgSW5leGFjdCBSb3VuZGVkCitjb214MzQ5OCBjb21wYXJlIDkxOTM2MDg3OTE3NDM1LjU5NzQ4ODk0OTUyNzgyMTU4NzQgLTY3MDgwODIzMzQ0Ljg5MDMzOTI1ODQzMjcxMzYwODI0ODZFLTc1NyAtPiAxCitkaXZ4MzQ5OCBkaXZpZGUgOTE5MzYwODc5MTc0MzUuNTk3NDg4OTQ5NTI3ODIxNTg3NCAtNjcwODA4MjMzNDQuODkwMzM5MjU4NDMyNzEzNjA4MjQ4NkUtNzU3IC0+IC0xLjM3MDUyNzEyNDM0MzAzMzY2NTY5MzA0Njg4OTkzNzgzRSs3NjAgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ5OCBkaXZpZGVpbnQgOTE5MzYwODc5MTc0MzUuNTk3NDg4OTQ5NTI3ODIxNTg3NCAtNjcwODA4MjMzNDQuODkwMzM5MjU4NDMyNzEzNjA4MjQ4NkUtNzU3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ5OCBtdWx0aXBseSA5MTkzNjA4NzkxNzQzNS41OTc0ODg5NDk1Mjc4MjE1ODc0IC02NzA4MDgyMzM0NC44OTAzMzkyNTg0MzI3MTM2MDgyNDg2RS03NTcgLT4gLTYuMTY3MTQ4NDcyNjA5ODA0NDgwOTkyOTI3NjM5Mzk0MjNFLTczMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDk4IHBvd2VyIDkxOTM2MDg3OTE3NDM1LjU5NzQ4ODk0OTUyNzgyMTU4NzQgLTcgLT4gMS44MDEzNDg5OTkzOTAzNTcwODcxOTY1OTA2NTA4MjYzMEUtOTggSW5leGFjdCBSb3VuZGVkCityZW14MzQ5OCByZW1haW5kZXIgOTE5MzYwODc5MTc0MzUuNTk3NDg4OTQ5NTI3ODIxNTg3NCAtNjcwODA4MjMzNDQuODkwMzM5MjU4NDMyNzEzNjA4MjQ4NkUtNzU3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ5OCBzdWJ0cmFjdCA5MTkzNjA4NzkxNzQzNS41OTc0ODg5NDk1Mjc4MjE1ODc0IC02NzA4MDgyMzM0NC44OTAzMzkyNTg0MzI3MTM2MDgyNDg2RS03NTcgLT4gOTE5MzYwODc5MTc0MzUuNTk3NDg4OTQ5NTI3ODIxNTg3NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDk5IGFkZCAtMDczNDUuNjQyMjUxODUyODU1NjEzNjUyMTQxNzI1OTgxMUUtNjAwIDQxMTg4MzI1LjcwNDEzNjI2MDg5MzQ5NTc1ODQ1ODMzODFFLTc2MyAtPiAtNy4zNDU2NDIyNTE4NTI4NTU2MTM2NTIxNDE3MjU5ODExMEUtNTk3IEluZXhhY3QgUm91bmRlZAorY29teDM0OTkgY29tcGFyZSAtMDczNDUuNjQyMjUxODUyODU1NjEzNjUyMTQxNzI1OTgxMUUtNjAwIDQxMTg4MzI1LjcwNDEzNjI2MDg5MzQ5NTc1ODQ1ODMzODFFLTc2MyAtPiAtMQorZGl2eDM0OTkgZGl2aWRlIC0wNzM0NS42NDIyNTE4NTI4NTU2MTM2NTIxNDE3MjU5ODExRS02MDAgNDExODgzMjUuNzA0MTM2MjYwODkzNDk1NzU4NDU4MzM4MUUtNzYzIC0+IC0xLjc4MzQyODIyMjk5MTYzODQyMjQ3MTg0MzAzODc4MDIyRSsxNTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ5OSBkaXZpZGVpbnQgLTA3MzQ1LjY0MjI1MTg1Mjg1NTYxMzY1MjE0MTcyNTk4MTFFLTYwMCA0MTE4ODMyNS43MDQxMzYyNjA4OTM0OTU3NTg0NTgzMzgxRS03NjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDk5IG11bHRpcGx5IC0wNzM0NS42NDIyNTE4NTI4NTU2MTM2NTIxNDE3MjU5ODExRS02MDAgNDExODgzMjUuNzA0MTM2MjYwODkzNDk1NzU4NDU4MzM4MUUtNzYzIC0+IC0zLjAyNTU0NzA1NTc1MzgwMzM4Mjc0MTI2ODY3NjU1Njc2RS0xMzUyIEluZXhhY3QgUm91bmRlZAorcG93eDM0OTkgcG93ZXIgLTA3MzQ1LjY0MjI1MTg1Mjg1NTYxMzY1MjE0MTcyNTk4MTFFLTYwMCA0IC0+IDIuOTExNTE1NDE1NTIyMTc1ODIwODI5MzcyMzYyNTU5OTZFLTIzODUgSW5leGFjdCBSb3VuZGVkCityZW14MzQ5OSByZW1haW5kZXIgLTA3MzQ1LjY0MjI1MTg1Mjg1NTYxMzY1MjE0MTcyNTk4MTFFLTYwMCA0MTE4ODMyNS43MDQxMzYyNjA4OTM0OTU3NTg0NTgzMzgxRS03NjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDk5IHN1YnRyYWN0IC0wNzM0NS42NDIyNTE4NTI4NTU2MTM2NTIxNDE3MjU5ODExRS02MDAgNDExODgzMjUuNzA0MTM2MjYwODkzNDk1NzU4NDU4MzM4MUUtNzYzIC0+IC03LjM0NTY0MjI1MTg1Mjg1NTYxMzY1MjE0MTcyNTk4MTEwRS01OTcgSW5leGFjdCBSb3VuZGVkCithZGR4MzUwMCBhZGQgLTI1MzI4MDcyNC45Mzk0NTgwMjE1ODgxNjc5NjUwMzgxODQgNjE2OTg4LjQyNjQyNTkwODg3MjM5ODE3MDg5NjM3NTYzNEUrMzk2IC0+IDYuMTY5ODg0MjY0MjU5MDg4NzIzOTgxNzA4OTYzNzU2MzRFKzQwMSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNTAwIGNvbXBhcmUgLTI1MzI4MDcyNC45Mzk0NTgwMjE1ODgxNjc5NjUwMzgxODQgNjE2OTg4LjQyNjQyNTkwODg3MjM5ODE3MDg5NjM3NTYzNEUrMzk2IC0+IC0xCitkaXZ4MzUwMCBkaXZpZGUgLTI1MzI4MDcyNC45Mzk0NTgwMjE1ODgxNjc5NjUwMzgxODQgNjE2OTg4LjQyNjQyNTkwODg3MjM5ODE3MDg5NjM3NTYzNEUrMzk2IC0+IC00LjEwNTExMzA2MzU3MzM3NzUzMzUxNjU1NTExODY2MTcwRS0zOTQgSW5leGFjdCBSb3VuZGVkCitkdml4MzUwMCBkaXZpZGVpbnQgLTI1MzI4MDcyNC45Mzk0NTgwMjE1ODgxNjc5NjUwMzgxODQgNjE2OTg4LjQyNjQyNTkwODg3MjM5ODE3MDg5NjM3NTYzNEUrMzk2IC0+IC0wCittdWx4MzUwMCBtdWx0aXBseSAtMjUzMjgwNzI0LjkzOTQ1ODAyMTU4ODE2Nzk2NTAzODE4NCA2MTY5ODguNDI2NDI1OTA4ODcyMzk4MTcwODk2Mzc1NjM0RSszOTYgLT4gLTEuNTYyNzEyNzU5MjQ0MDk2NTc5OTE5MTM2MjA1MjIzMTVFKzQxMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTAwIHBvd2VyIC0yNTMyODA3MjQuOTM5NDU4MDIxNTg4MTY3OTY1MDM4MTg0IDYgLT4gMi42NDAwNTQyMDIyMTQwNjgwODc4MjI4NDQ1OTc5NDQyNEUrNTAgSW5leGFjdCBSb3VuZGVkCityZW14MzUwMCByZW1haW5kZXIgLTI1MzI4MDcyNC45Mzk0NTgwMjE1ODgxNjc5NjUwMzgxODQgNjE2OTg4LjQyNjQyNTkwODg3MjM5ODE3MDg5NjM3NTYzNEUrMzk2IC0+IC0yNTMyODA3MjQuOTM5NDU4MDIxNTg4MTY3OTY1MDM4MTg0CitzdWJ4MzUwMCBzdWJ0cmFjdCAtMjUzMjgwNzI0LjkzOTQ1ODAyMTU4ODE2Nzk2NTAzODE4NCA2MTY5ODguNDI2NDI1OTA4ODcyMzk4MTcwODk2Mzc1NjM0RSszOTYgLT4gLTYuMTY5ODg0MjY0MjU5MDg4NzIzOTgxNzA4OTYzNzU2MzRFKzQwMSBJbmV4YWN0IFJvdW5kZWQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmFuZG9tcy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yYW5kb21zLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0NDI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmFuZG9tcy5kZWNUZXN0CkBAIC0wLDAgKzEsNDAzMCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSByYW5kb21zLmRlY1Rlc3QgLS0gZGVjaW1hbCByYW5kb20gdGVzdGNhc2VzICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCisKKy0tIFJhbmRvbWx5IGdlbmVyYXRlZCB0ZXN0Y2FzZXMgWzMxIERlYyAyMDAwLCB3aXRoIHJlc3VsdHMgZGVmaW5lZCBmb3IKKy0tIGFsbCBjYXNlcyBbMjcgT2N0IDIwMDFdLCBhbmQgbm8gdHJpbS9maW5pc2ggWzkgSnVuIDIwMDJdCit4YWRkMDAxIGFkZCA5MDUuNjc0MDIgLTIwMjg5NjYxMS5FLTc4MDQ3MjYyMCAtPiA5MDUuNjc0MDIwIEluZXhhY3QgUm91bmRlZAoreGNvbTAwMSBjb21wYXJlIDkwNS42NzQwMiAtMjAyODk2NjExLkUtNzgwNDcyNjIwIC0+IDEKK3hkaXYwMDEgZGl2aWRlIDkwNS42NzQwMiAtMjAyODk2NjExLkUtNzgwNDcyNjIwIC0+IC00LjQ2MzcyMTc3RSs3ODA0NzI2MTQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDAxIGRpdmlkZWludCA5MDUuNjc0MDIgLTIwMjg5NjYxMS5FLTc4MDQ3MjYyMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDAwMSBtdWx0aXBseSA5MDUuNjc0MDIgLTIwMjg5NjYxMS5FLTc4MDQ3MjYyMCAtPiAtMS44Mzc1ODE4OUUtNzgwNDcyNjA5IEluZXhhY3QgUm91bmRlZAoreHBvdzAwMSBwb3dlciA5MDUuNjc0MDIgLTIgLT4gMC4wMDAwMDEyMTkxNDczMCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMDEgcmVtYWluZGVyIDkwNS42NzQwMiAtMjAyODk2NjExLkUtNzgwNDcyNjIwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDAxIHN1YnRyYWN0IDkwNS42NzQwMiAtMjAyODk2NjExLkUtNzgwNDcyNjIwIC0+IDkwNS42NzQwMjAgSW5leGFjdCBSb3VuZGVkCit4YWRkMDAyIGFkZCAzOTE1MTM0LjcgLTU5NzE2NDkwNy4gLT4gLTU5MzI0OTc3MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMDIgY29tcGFyZSAzOTE1MTM0LjcgLTU5NzE2NDkwNy4gLT4gMQoreGRpdjAwMiBkaXZpZGUgMzkxNTEzNC43IC01OTcxNjQ5MDcuIC0+IC0wLjAwNjU1NjIwMzU4IEluZXhhY3QgUm91bmRlZAoreGR2aTAwMiBkaXZpZGVpbnQgMzkxNTEzNC43IC01OTcxNjQ5MDcuIC0+IC0wCit4bXVsMDAyIG11bHRpcGx5IDM5MTUxMzQuNyAtNTk3MTY0OTA3LiAtPiAtMi4zMzc5ODEwNUUrMTUgSW5leGFjdCBSb3VuZGVkCit4cG93MDAyIHBvd2VyIDM5MTUxMzQuNyAtNTk3MTY0OTA3IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTAwMiByZW1haW5kZXIgMzkxNTEzNC43IC01OTcxNjQ5MDcuIC0+IDM5MTUxMzQuNworeHN1YjAwMiBzdWJ0cmFjdCAzOTE1MTM0LjcgLTU5NzE2NDkwNy4gLT4gNjAxMDgwMDQyIEluZXhhY3QgUm91bmRlZAoreGFkZDAwMyBhZGQgMzA5NzU5MjYxIDYyNjYzLjQ4NyAtPiAzMDk4MjE5MjQgSW5leGFjdCBSb3VuZGVkCit4Y29tMDAzIGNvbXBhcmUgMzA5NzU5MjYxIDYyNjYzLjQ4NyAtPiAxCit4ZGl2MDAzIGRpdmlkZSAzMDk3NTkyNjEgNjI2NjMuNDg3IC0+IDQ5NDMuMjE3NzUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDAzIGRpdmlkZWludCAzMDk3NTkyNjEgNjI2NjMuNDg3IC0+IDQ5NDMKK3htdWwwMDMgbXVsdGlwbHkgMzA5NzU5MjYxIDYyNjYzLjQ4NyAtPiAxLjk0MTA1OTU0RSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMDMgcG93ZXIgMzA5NzU5MjYxIDYyNjYzIC0+IDEuMTM2NzkxOTlFKzUzMjA3MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMDMgcmVtYWluZGVyIDMwOTc1OTI2MSA2MjY2My40ODcgLT4gMTM2NDQuNzU5Cit4c3ViMDAzIHN1YnRyYWN0IDMwOTc1OTI2MSA2MjY2My40ODcgLT4gMzA5Njk2NTk4IEluZXhhY3QgUm91bmRlZAoreGFkZDAwNCBhZGQgMy45MzU5MTg4OEUtMjM2NTk1NjI2IDcyNDIzNzUuMDAgLT4gNzI0MjM3NS4wMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMDQgY29tcGFyZSAzLjkzNTkxODg4RS0yMzY1OTU2MjYgNzI0MjM3NS4wMCAtPiAtMQoreGRpdjAwNCBkaXZpZGUgMy45MzU5MTg4OEUtMjM2NTk1NjI2IDcyNDIzNzUuMDAgLT4gNS40MzQ1NjkzMEUtMjM2NTk1NjMzIEluZXhhY3QgUm91bmRlZAoreGR2aTAwNCBkaXZpZGVpbnQgMy45MzU5MTg4OEUtMjM2NTk1NjI2IDcyNDIzNzUuMDAgLT4gMAoreG11bDAwNCBtdWx0aXBseSAzLjkzNTkxODg4RS0yMzY1OTU2MjYgNzI0MjM3NS4wMCAtPiAyLjg1MDU0MDA1RS0yMzY1OTU2MTkgSW5leGFjdCBSb3VuZGVkCit4cG93MDA0IHBvd2VyIDMuOTM1OTE4ODhFLTIzNjU5NTYyNiA3MjQyMzc1IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTAwNCByZW1haW5kZXIgMy45MzU5MTg4OEUtMjM2NTk1NjI2IDcyNDIzNzUuMDAgLT4gMy45MzU5MTg4OEUtMjM2NTk1NjI2Cit4c3ViMDA0IHN1YnRyYWN0IDMuOTM1OTE4ODhFLTIzNjU5NTYyNiA3MjQyMzc1LjAwIC0+IC03MjQyMzc1LjAwIEluZXhhY3QgUm91bmRlZAoreGFkZDAwNSBhZGQgMzIzOTAyLjcxNCAtNjA4NjY5LjYwN0UtNjU3MDYwNTY4IC0+IDMyMzkwMi43MTQgSW5leGFjdCBSb3VuZGVkCit4Y29tMDA1IGNvbXBhcmUgMzIzOTAyLjcxNCAtNjA4NjY5LjYwN0UtNjU3MDYwNTY4IC0+IDEKK3hkaXYwMDUgZGl2aWRlIDMyMzkwMi43MTQgLTYwODY2OS42MDdFLTY1NzA2MDU2OCAtPiAtNS4zMjE0ODY1N0UrNjU3MDYwNTY3IEluZXhhY3QgUm91bmRlZAoreGR2aTAwNSBkaXZpZGVpbnQgMzIzOTAyLjcxNCAtNjA4NjY5LjYwN0UtNjU3MDYwNTY4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDA1IG11bHRpcGx5IDMyMzkwMi43MTQgLTYwODY2OS42MDdFLTY1NzA2MDU2OCAtPiAtMS45NzE0OTczOEUtNjU3MDYwNTU3IEluZXhhY3QgUm91bmRlZAoreHBvdzAwNSBwb3dlciAzMjM5MDIuNzE0IC02IC0+IDguNjU5ODkyMDRFLTM0IEluZXhhY3QgUm91bmRlZAoreHJlbTAwNSByZW1haW5kZXIgMzIzOTAyLjcxNCAtNjA4NjY5LjYwN0UtNjU3MDYwNTY4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDA1IHN1YnRyYWN0IDMyMzkwMi43MTQgLTYwODY2OS42MDdFLTY1NzA2MDU2OCAtPiAzMjM5MDIuNzE0IEluZXhhY3QgUm91bmRlZAoreGFkZDAwNiBhZGQgNS4xMTk3MDA5MiAtODgwNy4yMjAzNiAtPiAtODgwMi4xMDA2NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMDYgY29tcGFyZSA1LjExOTcwMDkyIC04ODA3LjIyMDM2IC0+IDEKK3hkaXYwMDYgZGl2aWRlIDUuMTE5NzAwOTIgLTg4MDcuMjIwMzYgLT4gLTAuMDAwNTgxMzA3MjM2IEluZXhhY3QgUm91bmRlZAoreGR2aTAwNiBkaXZpZGVpbnQgNS4xMTk3MDA5MiAtODgwNy4yMjAzNiAtPiAtMAoreG11bDAwNiBtdWx0aXBseSA1LjExOTcwMDkyIC04ODA3LjIyMDM2IC0+IC00NTA5MC4zMzQyIEluZXhhY3QgUm91bmRlZAoreHBvdzAwNiBwb3dlciA1LjExOTcwMDkyIC04ODA3IC0+IDQuODE4MTkyNjJFLTYyNDcgSW5leGFjdCBSb3VuZGVkCit4cmVtMDA2IHJlbWFpbmRlciA1LjExOTcwMDkyIC04ODA3LjIyMDM2IC0+IDUuMTE5NzAwOTIKK3hzdWIwMDYgc3VidHJhY3QgNS4xMTk3MDA5MiAtODgwNy4yMjAzNiAtPiA4ODEyLjM0MDA2IEluZXhhY3QgUm91bmRlZAoreGFkZDAwNyBhZGQgLTcuOTk4NzQ1MTYgNDU2MS44Mzc1OCAtPiA0NTUzLjgzODgzIEluZXhhY3QgUm91bmRlZAoreGNvbTAwNyBjb21wYXJlIC03Ljk5ODc0NTE2IDQ1NjEuODM3NTggLT4gLTEKK3hkaXYwMDcgZGl2aWRlIC03Ljk5ODc0NTE2IDQ1NjEuODM3NTggLT4gLTAuMDAxNzUzNDA0MjAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDA3IGRpdmlkZWludCAtNy45OTg3NDUxNiA0NTYxLjgzNzU4IC0+IC0wCit4bXVsMDA3IG11bHRpcGx5IC03Ljk5ODc0NTE2IDQ1NjEuODM3NTggLT4gLTM2NDg4Ljk3NjMgSW5leGFjdCBSb3VuZGVkCit4cG93MDA3IHBvd2VyIC03Ljk5ODc0NTE2IDQ1NjIgLT4gMy44NTIzNjE5OUUrNDExOSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMDcgcmVtYWluZGVyIC03Ljk5ODc0NTE2IDQ1NjEuODM3NTggLT4gLTcuOTk4NzQ1MTYKK3hzdWIwMDcgc3VidHJhY3QgLTcuOTk4NzQ1MTYgNDU2MS44Mzc1OCAtPiAtNDU2OS44MzYzMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMDggYWRkIDI5NzgwMjg3OCAtOTI3MjA2LjMyNCAtPiAyOTY4NzU2NzIgSW5leGFjdCBSb3VuZGVkCit4Y29tMDA4IGNvbXBhcmUgMjk3ODAyODc4IC05MjcyMDYuMzI0IC0+IDEKK3hkaXYwMDggZGl2aWRlIDI5NzgwMjg3OCAtOTI3MjA2LjMyNCAtPiAtMzIxLjE4Mjk2NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMDggZGl2aWRlaW50IDI5NzgwMjg3OCAtOTI3MjA2LjMyNCAtPiAtMzIxCit4bXVsMDA4IG11bHRpcGx5IDI5NzgwMjg3OCAtOTI3MjA2LjMyNCAtPiAtMi43NjEyNDcxMkUrMTQgSW5leGFjdCBSb3VuZGVkCit4cG93MDA4IHBvd2VyIDI5NzgwMjg3OCAtOTI3MjA2IC0+IDEuOTQ2MDI4MTBFLTc4NTcwNzggSW5leGFjdCBSb3VuZGVkCit4cmVtMDA4IHJlbWFpbmRlciAyOTc4MDI4NzggLTkyNzIwNi4zMjQgLT4gMTY5NjQ3Ljk5NgoreHN1YjAwOCBzdWJ0cmFjdCAyOTc4MDI4NzggLTkyNzIwNi4zMjQgLT4gMjk4NzMwMDg0IEluZXhhY3QgUm91bmRlZAoreGFkZDAwOSBhZGQgLTc2Ni42NTE4MjQgMzEzMDAuMzYxOSAtPiAzMDUzMy43MTAxIEluZXhhY3QgUm91bmRlZAoreGNvbTAwOSBjb21wYXJlIC03NjYuNjUxODI0IDMxMzAwLjM2MTkgLT4gLTEKK3hkaXYwMDkgZGl2aWRlIC03NjYuNjUxODI0IDMxMzAwLjM2MTkgLT4gLTAuMDI0NDkzMzg1MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMDkgZGl2aWRlaW50IC03NjYuNjUxODI0IDMxMzAwLjM2MTkgLT4gLTAKK3htdWwwMDkgbXVsdGlwbHkgLTc2Ni42NTE4MjQgMzEzMDAuMzYxOSAtPiAtMjM5OTY0NzkuNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMDkgcG93ZXIgLTc2Ni42NTE4MjQgMzEzMDAgLT4gOC4zNzE4OTAxMUUrOTAyODcgSW5leGFjdCBSb3VuZGVkCit4cmVtMDA5IHJlbWFpbmRlciAtNzY2LjY1MTgyNCAzMTMwMC4zNjE5IC0+IC03NjYuNjUxODI0Cit4c3ViMDA5IHN1YnRyYWN0IC03NjYuNjUxODI0IDMxMzAwLjM2MTkgLT4gLTMyMDY3LjAxMzcgSW5leGFjdCBSb3VuZGVkCit4YWRkMDEwIGFkZCAtNTY3NDYuODY4OUUrOTM0OTgxOTQyIDQ3MTAwMjUyMS4gLT4gLTUuNjc0Njg2ODlFKzkzNDk4MTk0NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMTAgY29tcGFyZSAtNTY3NDYuODY4OUUrOTM0OTgxOTQyIDQ3MTAwMjUyMS4gLT4gLTEKK3hkaXYwMTAgZGl2aWRlIC01Njc0Ni44Njg5RSs5MzQ5ODE5NDIgNDcxMDAyNTIxLiAtPiAtMS4yMDQ4MTAzMEUrOTM0OTgxOTM4IEluZXhhY3QgUm91bmRlZAoreGR2aTAxMCBkaXZpZGVpbnQgLTU2NzQ2Ljg2ODlFKzkzNDk4MTk0MiA0NzEwMDI1MjEuIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDEwIG11bHRpcGx5IC01Njc0Ni44Njg5RSs5MzQ5ODE5NDIgNDcxMDAyNTIxLiAtPiAtMi42NzI3OTE4M0UrOTM0OTgxOTU1IEluZXhhY3QgUm91bmRlZAoreHBvdzAxMCBwb3dlciAtNTY3NDYuODY4OUUrOTM0OTgxOTQyIDQ3MTAwMjUyMSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDEwIHJlbWFpbmRlciAtNTY3NDYuODY4OUUrOTM0OTgxOTQyIDQ3MTAwMjUyMS4gLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwMTAgc3VidHJhY3QgLTU2NzQ2Ljg2ODlFKzkzNDk4MTk0MiA0NzEwMDI1MjEuIC0+IC01LjY3NDY4Njg5RSs5MzQ5ODE5NDYgSW5leGFjdCBSb3VuZGVkCit4YWRkMDExIGFkZCA0NTY0MTcxNjAgLTQxMzQ2LjEwMjQgLT4gNDU2Mzc1ODE0IEluZXhhY3QgUm91bmRlZAoreGNvbTAxMSBjb21wYXJlIDQ1NjQxNzE2MCAtNDEzNDYuMTAyNCAtPiAxCit4ZGl2MDExIGRpdmlkZSA0NTY0MTcxNjAgLTQxMzQ2LjEwMjQgLT4gLTExMDM4Ljk0MDQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDExIGRpdmlkZWludCA0NTY0MTcxNjAgLTQxMzQ2LjEwMjQgLT4gLTExMDM4Cit4bXVsMDExIG11bHRpcGx5IDQ1NjQxNzE2MCAtNDEzNDYuMTAyNCAtPiAtMS44ODcxMDcwNkUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MDExIHBvd2VyIDQ1NjQxNzE2MCAtNDEzNDYgLT4gMS4wNDc2Njg2M0UtMzU4MDMwIEluZXhhY3QgUm91bmRlZAoreHJlbTAxMSByZW1haW5kZXIgNDU2NDE3MTYwIC00MTM0Ni4xMDI0IC0+IDM4ODgxLjcwODgKK3hzdWIwMTEgc3VidHJhY3QgNDU2NDE3MTYwIC00MTM0Ni4xMDI0IC0+IDQ1NjQ1ODUwNiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMTIgYWRkIDEwMjg5NS43MjIgLTIuNjIyMTQ4MjYgLT4gMTAyODkzLjEwMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMTIgY29tcGFyZSAxMDI4OTUuNzIyIC0yLjYyMjE0ODI2IC0+IDEKK3hkaXYwMTIgZGl2aWRlIDEwMjg5NS43MjIgLTIuNjIyMTQ4MjYgLT4gLTM5MjQxLjAwMDggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDEyIGRpdmlkZWludCAxMDI4OTUuNzIyIC0yLjYyMjE0ODI2IC0+IC0zOTI0MQoreG11bDAxMiBtdWx0aXBseSAxMDI4OTUuNzIyIC0yLjYyMjE0ODI2IC0+IC0yNjk4MDcuODM4IEluZXhhY3QgUm91bmRlZAoreHBvdzAxMiBwb3dlciAxMDI4OTUuNzIyIC0zIC0+IDkuMTc5MjY3ODZFLTE2IEluZXhhY3QgUm91bmRlZAoreHJlbTAxMiByZW1haW5kZXIgMTAyODk1LjcyMiAtMi42MjIxNDgyNiAtPiAwLjAwMjEyOTM0Cit4c3ViMDEyIHN1YnRyYWN0IDEwMjg5NS43MjIgLTIuNjIyMTQ4MjYgLT4gMTAyODk4LjM0NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMTMgYWRkIDYxLjMwMzMzMzFFKzE1NzY0NDE0MSAtNTY3NzQwLjkxOEUtODkzNDM5NDU2IC0+IDYuMTMwMzMzMzFFKzE1NzY0NDE0MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMTMgY29tcGFyZSA2MS4zMDMzMzMxRSsxNTc2NDQxNDEgLTU2Nzc0MC45MThFLTg5MzQzOTQ1NiAtPiAxCit4ZGl2MDEzIGRpdmlkZSA2MS4zMDMzMzMxRSsxNTc2NDQxNDEgLTU2Nzc0MC45MThFLTg5MzQzOTQ1NiAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCit4ZHZpMDEzIGRpdmlkZWludCA2MS4zMDMzMzMxRSsxNTc2NDQxNDEgLTU2Nzc0MC45MThFLTg5MzQzOTQ1NiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDAxMyBtdWx0aXBseSA2MS4zMDMzMzMxRSsxNTc2NDQxNDEgLTU2Nzc0MC45MThFLTg5MzQzOTQ1NiAtPiAtMy40ODA0NDEwNkUtNzM1Nzk1MzA4IEluZXhhY3QgUm91bmRlZAoreHBvdzAxMyBwb3dlciA2MS4zMDMzMzMxRSsxNTc2NDQxNDEgLTYgLT4gMS44ODQwNjMyMkUtOTQ1ODY0ODU3IEluZXhhY3QgUm91bmRlZAoreHJlbTAxMyByZW1haW5kZXIgNjEuMzAzMzMzMUUrMTU3NjQ0MTQxIC01Njc3NDAuOTE4RS04OTM0Mzk0NTYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwMTMgc3VidHJhY3QgNjEuMzAzMzMzMUUrMTU3NjQ0MTQxIC01Njc3NDAuOTE4RS04OTM0Mzk0NTYgLT4gNi4xMzAzMzMzMUUrMTU3NjQ0MTQyIEluZXhhY3QgUm91bmRlZAoreGFkZDAxNCBhZGQgODAyMjMuMzg5NyA3MzkyMS4wMzgzRS00Njc3NzI2NzUgLT4gODAyMjMuMzg5NyBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMTQgY29tcGFyZSA4MDIyMy4zODk3IDczOTIxLjAzODNFLTQ2Nzc3MjY3NSAtPiAxCit4ZGl2MDE0IGRpdmlkZSA4MDIyMy4zODk3IDczOTIxLjAzODNFLTQ2Nzc3MjY3NSAtPiAxLjA4NTI1Nzg5RSs0Njc3NzI2NzUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDE0IGRpdmlkZWludCA4MDIyMy4zODk3IDczOTIxLjAzODNFLTQ2Nzc3MjY3NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDAxNCBtdWx0aXBseSA4MDIyMy4zODk3IDczOTIxLjAzODNFLTQ2Nzc3MjY3NSAtPiA1LjkzMDE5NjI2RS00Njc3NzI2NjYgSW5leGFjdCBSb3VuZGVkCit4cG93MDE0IHBvd2VyIDgwMjIzLjM4OTcgNyAtPiAyLjEzODQ4OTE5RSszNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMTQgcmVtYWluZGVyIDgwMjIzLjM4OTcgNzM5MjEuMDM4M0UtNDY3NzcyNjc1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDE0IHN1YnRyYWN0IDgwMjIzLjM4OTcgNzM5MjEuMDM4M0UtNDY3NzcyNjc1IC0+IDgwMjIzLjM4OTcgSW5leGFjdCBSb3VuZGVkCit4YWRkMDE1IGFkZCAtNjU0NjQ1Ljk1NCAtOS4xMjUzNTc1MiAtPiAtNjU0NjU1LjA3OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMTUgY29tcGFyZSAtNjU0NjQ1Ljk1NCAtOS4xMjUzNTc1MiAtPiAtMQoreGRpdjAxNSBkaXZpZGUgLTY1NDY0NS45NTQgLTkuMTI1MzU3NTIgLT4gNzE3MzkuMjExNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMTUgZGl2aWRlaW50IC02NTQ2NDUuOTU0IC05LjEyNTM1NzUyIC0+IDcxNzM5Cit4bXVsMDE1IG11bHRpcGx5IC02NTQ2NDUuOTU0IC05LjEyNTM1NzUyIC0+IDU5NzM4NzguMzggSW5leGFjdCBSb3VuZGVkCit4cG93MDE1IHBvd2VyIC02NTQ2NDUuOTU0IC05IC0+IC00LjUyODM2NjkwRS01MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMTUgcmVtYWluZGVyIC02NTQ2NDUuOTU0IC05LjEyNTM1NzUyIC0+IC0xLjkzMDg3MjcyCit4c3ViMDE1IHN1YnRyYWN0IC02NTQ2NDUuOTU0IC05LjEyNTM1NzUyIC0+IC02NTQ2MzYuODI5IEluZXhhY3QgUm91bmRlZAoreGFkZDAxNiBhZGQgNjMuMTkxNzc3MkUtNzA2MDE0NjM0IC03LjU2MjUzMjU3RS0xMzg1NzkyMzQgLT4gLTcuNTYyNTMyNTdFLTEzODU3OTIzNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMTYgY29tcGFyZSA2My4xOTE3NzcyRS03MDYwMTQ2MzQgLTcuNTYyNTMyNTdFLTEzODU3OTIzNCAtPiAxCit4ZGl2MDE2IGRpdmlkZSA2My4xOTE3NzcyRS03MDYwMTQ2MzQgLTcuNTYyNTMyNTdFLTEzODU3OTIzNCAtPiAtOC4zNTU5MDE0OUUtNTY3NDM1NDAwIEluZXhhY3QgUm91bmRlZAoreGR2aTAxNiBkaXZpZGVpbnQgNjMuMTkxNzc3MkUtNzA2MDE0NjM0IC03LjU2MjUzMjU3RS0xMzg1NzkyMzQgLT4gLTAKK3htdWwwMTYgbXVsdGlwbHkgNjMuMTkxNzc3MkUtNzA2MDE0NjM0IC03LjU2MjUzMjU3RS0xMzg1NzkyMzQgLT4gLTQuNzc4ODk4NzNFLTg0NDU5Mzg2NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMTYgcG93ZXIgNjMuMTkxNzc3MkUtNzA2MDE0NjM0IC04IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTAxNiByZW1haW5kZXIgNjMuMTkxNzc3MkUtNzA2MDE0NjM0IC03LjU2MjUzMjU3RS0xMzg1NzkyMzQgLT4gNi4zMTkxNzc3MkUtNzA2MDE0NjMzCit4c3ViMDE2IHN1YnRyYWN0IDYzLjE5MTc3NzJFLTcwNjAxNDYzNCAtNy41NjI1MzI1N0UtMTM4NTc5MjM0IC0+IDcuNTYyNTMyNTdFLTEzODU3OTIzNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMTcgYWRkIC0zOTY3NC43MTkwIDI0OTA2MDcuNzggLT4gMjQ1MDkzMy4wNiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMTcgY29tcGFyZSAtMzk2NzQuNzE5MCAyNDkwNjA3Ljc4IC0+IC0xCit4ZGl2MDE3IGRpdmlkZSAtMzk2NzQuNzE5MCAyNDkwNjA3Ljc4IC0+IC0wLjAxNTkyOTczMzggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDE3IGRpdmlkZWludCAtMzk2NzQuNzE5MCAyNDkwNjA3Ljc4IC0+IC0wCit4bXVsMDE3IG11bHRpcGx5IC0zOTY3NC43MTkwIDI0OTA2MDcuNzggLT4gLTkuODgxNDE2MzhFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzAxNyBwb3dlciAtMzk2NzQuNzE5MCAyNDkwNjA4IC0+IDIuNTUwMzIzMjlFKzExNDUzMDk1IEluZXhhY3QgUm91bmRlZAoreHJlbTAxNyByZW1haW5kZXIgLTM5Njc0LjcxOTAgMjQ5MDYwNy43OCAtPiAtMzk2NzQuNzE5MAoreHN1YjAxNyBzdWJ0cmFjdCAtMzk2NzQuNzE5MCAyNDkwNjA3Ljc4IC0+IC0yNTMwMjgyLjUwIEluZXhhY3QgUm91bmRlZAoreGFkZDAxOCBhZGQgLTMzNjQuNTk3MzdFLTYwMDM2MzY4MSA4OTY0ODcuNDUxIC0+IDg5NjQ4Ny40NTEgSW5leGFjdCBSb3VuZGVkCit4Y29tMDE4IGNvbXBhcmUgLTMzNjQuNTk3MzdFLTYwMDM2MzY4MSA4OTY0ODcuNDUxIC0+IC0xCit4ZGl2MDE4IGRpdmlkZSAtMzM2NC41OTczN0UtNjAwMzYzNjgxIDg5NjQ4Ny40NTEgLT4gLTMuNzUzMDg5MjBFLTYwMDM2MzY4NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMTggZGl2aWRlaW50IC0zMzY0LjU5NzM3RS02MDAzNjM2ODEgODk2NDg3LjQ1MSAtPiAtMAoreG11bDAxOCBtdWx0aXBseSAtMzM2NC41OTczN0UtNjAwMzYzNjgxIDg5NjQ4Ny40NTEgLT4gLTMuMDE2MzE5MzJFLTYwMDM2MzY3MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMTggcG93ZXIgLTMzNjQuNTk3MzdFLTYwMDM2MzY4MSA4OTY0ODcgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTAxOCByZW1haW5kZXIgLTMzNjQuNTk3MzdFLTYwMDM2MzY4MSA4OTY0ODcuNDUxIC0+IC0zLjM2NDU5NzM3RS02MDAzNjM2NzgKK3hzdWIwMTggc3VidHJhY3QgLTMzNjQuNTk3MzdFLTYwMDM2MzY4MSA4OTY0ODcuNDUxIC0+IC04OTY0ODcuNDUxIEluZXhhY3QgUm91bmRlZAoreGFkZDAxOSBhZGQgLTY0MTM4LjA1NzggMzE3NTkwMTEuM0UrNjk3NDg4MzQyIC0+IDMuMTc1OTAxMTNFKzY5NzQ4ODM0OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMTkgY29tcGFyZSAtNjQxMzguMDU3OCAzMTc1OTAxMS4zRSs2OTc0ODgzNDIgLT4gLTEKK3hkaXYwMTkgZGl2aWRlIC02NDEzOC4wNTc4IDMxNzU5MDExLjNFKzY5NzQ4ODM0MiAtPiAtMi4wMTk1MjMxM0UtNjk3NDg4MzQ1IEluZXhhY3QgUm91bmRlZAoreGR2aTAxOSBkaXZpZGVpbnQgLTY0MTM4LjA1NzggMzE3NTkwMTEuM0UrNjk3NDg4MzQyIC0+IC0wCit4bXVsMDE5IG11bHRpcGx5IC02NDEzOC4wNTc4IDMxNzU5MDExLjNFKzY5NzQ4ODM0MiAtPiAtMi4wMzY5NjEzMEUrNjk3NDg4MzU0IEluZXhhY3QgUm91bmRlZAoreHBvdzAxOSBwb3dlciAtNjQxMzguMDU3OCAzIC0+IC0yLjYzODQ0MTE2RSsxNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMTkgcmVtYWluZGVyIC02NDEzOC4wNTc4IDMxNzU5MDExLjNFKzY5NzQ4ODM0MiAtPiAtNjQxMzguMDU3OAoreHN1YjAxOSBzdWJ0cmFjdCAtNjQxMzguMDU3OCAzMTc1OTAxMS4zRSs2OTc0ODgzNDIgLT4gLTMuMTc1OTAxMTNFKzY5NzQ4ODM0OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMjAgYWRkIDYxMzk5Ljg1MjcgLTY0MzQ0NDg0LjUgLT4gLTY0MjgzMDg0LjYgSW5leGFjdCBSb3VuZGVkCit4Y29tMDIwIGNvbXBhcmUgNjEzOTkuODUyNyAtNjQzNDQ0ODQuNSAtPiAxCit4ZGl2MDIwIGRpdmlkZSA2MTM5OS44NTI3IC02NDM0NDQ4NC41IC0+IC0wLjAwMDk1NDIzNjQ1NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMjAgZGl2aWRlaW50IDYxMzk5Ljg1MjcgLTY0MzQ0NDg0LjUgLT4gLTAKK3htdWwwMjAgbXVsdGlwbHkgNjEzOTkuODUyNyAtNjQzNDQ0ODQuNSAtPiAtMy45NTA3NDE4N0UrMTIgSW5leGFjdCBSb3VuZGVkCit4cG93MDIwIHBvd2VyIDYxMzk5Ljg1MjcgLTY0MzQ0NDg1IC0+IDEuMjczNzg4NDJFLTMwODA5MjE2MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMjAgcmVtYWluZGVyIDYxMzk5Ljg1MjcgLTY0MzQ0NDg0LjUgLT4gNjEzOTkuODUyNworeHN1YjAyMCBzdWJ0cmFjdCA2MTM5OS44NTI3IC02NDM0NDQ4NC41IC0+IDY0NDA1ODg0LjQgSW5leGFjdCBSb3VuZGVkCit4YWRkMDIxIGFkZCAtNzIyOTYwLjIwNCAtMjYxNTQ1OTkuOCAtPiAtMjY4Nzc1NjAuMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMjEgY29tcGFyZSAtNzIyOTYwLjIwNCAtMjYxNTQ1OTkuOCAtPiAxCit4ZGl2MDIxIGRpdmlkZSAtNzIyOTYwLjIwNCAtMjYxNTQ1OTkuOCAtPiAwLjAyNzY0MTc5OTUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDIxIGRpdmlkZWludCAtNzIyOTYwLjIwNCAtMjYxNTQ1OTkuOCAtPiAwCit4bXVsMDIxIG11bHRpcGx5IC03MjI5NjAuMjA0IC0yNjE1NDU5OS44IC0+IDEuODkwODczNDhFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzAyMSBwb3dlciAtNzIyOTYwLjIwNCAtMjYxNTQ2MDAgLT4gNS4zNDIzNjEzOUUtMTUzMjQyNzk0IEluZXhhY3QgUm91bmRlZAoreHJlbTAyMSByZW1haW5kZXIgLTcyMjk2MC4yMDQgLTI2MTU0NTk5LjggLT4gLTcyMjk2MC4yMDQKK3hzdWIwMjEgc3VidHJhY3QgLTcyMjk2MC4yMDQgLTI2MTU0NTk5LjggLT4gMjU0MzE2MzkuNiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMjIgYWRkIDkuNDcxMDk5NTlFKzIzMDU2NTA5MyA3MzM1NDcyMy4yIC0+IDkuNDcxMDk5NTlFKzIzMDU2NTA5MyBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMjIgY29tcGFyZSA5LjQ3MTA5OTU5RSsyMzA1NjUwOTMgNzMzNTQ3MjMuMiAtPiAxCit4ZGl2MDIyIGRpdmlkZSA5LjQ3MTA5OTU5RSsyMzA1NjUwOTMgNzMzNTQ3MjMuMiAtPiAxLjI5MTEzNjk4RSsyMzA1NjUwODYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDIyIGRpdmlkZWludCA5LjQ3MTA5OTU5RSsyMzA1NjUwOTMgNzMzNTQ3MjMuMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDAyMiBtdWx0aXBseSA5LjQ3MTA5OTU5RSsyMzA1NjUwOTMgNzMzNTQ3MjMuMiAtPiA2Ljk0NzQ5ODg5RSsyMzA1NjUxMDEgSW5leGFjdCBSb3VuZGVkCit4cG93MDIyIHBvd2VyIDkuNDcxMDk5NTlFKzIzMDU2NTA5MyA3MzM1NDcyMyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMjIgcmVtYWluZGVyIDkuNDcxMDk5NTlFKzIzMDU2NTA5MyA3MzM1NDcyMy4yIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDIyIHN1YnRyYWN0IDkuNDcxMDk5NTlFKzIzMDU2NTA5MyA3MzM1NDcyMy4yIC0+IDkuNDcxMDk5NTlFKzIzMDU2NTA5MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMjMgYWRkIDQzLjc0NTYyNDUgNTQ3NDQxOTU2LiAtPiA1NDc0NDIwMDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDIzIGNvbXBhcmUgNDMuNzQ1NjI0NSA1NDc0NDE5NTYuIC0+IC0xCit4ZGl2MDIzIGRpdmlkZSA0My43NDU2MjQ1IDU0NzQ0MTk1Ni4gLT4gNy45OTA5MTU1N0UtOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMjMgZGl2aWRlaW50IDQzLjc0NTYyNDUgNTQ3NDQxOTU2LiAtPiAwCit4bXVsMDIzIG11bHRpcGx5IDQzLjc0NTYyNDUgNTQ3NDQxOTU2LiAtPiAyLjM5NDgxOTAyRSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMjMgcG93ZXIgNDMuNzQ1NjI0NSA1NDc0NDE5NTYgLT4gMi45MTc0MjM5MUUrODk4MzE2NDU4IEluZXhhY3QgUm91bmRlZAoreHJlbTAyMyByZW1haW5kZXIgNDMuNzQ1NjI0NSA1NDc0NDE5NTYuIC0+IDQzLjc0NTYyNDUKK3hzdWIwMjMgc3VidHJhY3QgNDMuNzQ1NjI0NSA1NDc0NDE5NTYuIC0+IC01NDc0NDE5MTIgSW5leGFjdCBSb3VuZGVkCit4YWRkMDI0IGFkZCAtNzMxNTA1NDJFLTI0MjAxNzM5MCAtOC4xNTg2OTk1NCAtPiAtOC4xNTg2OTk1NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMjQgY29tcGFyZSAtNzMxNTA1NDJFLTI0MjAxNzM5MCAtOC4xNTg2OTk1NCAtPiAxCit4ZGl2MDI0IGRpdmlkZSAtNzMxNTA1NDJFLTI0MjAxNzM5MCAtOC4xNTg2OTk1NCAtPiA4Ljk2NTk1NjExRS0yNDIwMTczODQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDI0IGRpdmlkZWludCAtNzMxNTA1NDJFLTI0MjAxNzM5MCAtOC4xNTg2OTk1NCAtPiAwCit4bXVsMDI0IG11bHRpcGx5IC03MzE1MDU0MkUtMjQyMDE3MzkwIC04LjE1ODY5OTU0IC0+IDUuOTY4MTMyOTNFLTI0MjAxNzM4MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMjQgcG93ZXIgLTczMTUwNTQyRS0yNDIwMTczOTAgLTggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDI0IHJlbWFpbmRlciAtNzMxNTA1NDJFLTI0MjAxNzM5MCAtOC4xNTg2OTk1NCAtPiAtNy4zMTUwNTQyRS0yNDIwMTczODMKK3hzdWIwMjQgc3VidHJhY3QgLTczMTUwNTQyRS0yNDIwMTczOTAgLTguMTU4Njk5NTQgLT4gOC4xNTg2OTk1NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMjUgYWRkIDIwMTUuNjIxMDlFKzI5OTg5NzU5NiAtMTE3ODg5MTYuMSAtPiAyLjAxNTYyMTA5RSsyOTk4OTc1OTkgSW5leGFjdCBSb3VuZGVkCit4Y29tMDI1IGNvbXBhcmUgMjAxNS42MjEwOUUrMjk5ODk3NTk2IC0xMTc4ODkxNi4xIC0+IDEKK3hkaXYwMjUgZGl2aWRlIDIwMTUuNjIxMDlFKzI5OTg5NzU5NiAtMTE3ODg5MTYuMSAtPiAtMS43MDk3NTk0N0UrMjk5ODk3NTkyIEluZXhhY3QgUm91bmRlZAoreGR2aTAyNSBkaXZpZGVpbnQgMjAxNS42MjEwOUUrMjk5ODk3NTk2IC0xMTc4ODkxNi4xIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDI1IG11bHRpcGx5IDIwMTUuNjIxMDlFKzI5OTg5NzU5NiAtMTE3ODg5MTYuMSAtPiAtMi4zNzYxOTg3OUUrMjk5ODk3NjA2IEluZXhhY3QgUm91bmRlZAoreHBvdzAyNSBwb3dlciAyMDE1LjYyMTA5RSsyOTk4OTc1OTYgLTExNzg4OTE2IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTAyNSByZW1haW5kZXIgMjAxNS42MjEwOUUrMjk5ODk3NTk2IC0xMTc4ODkxNi4xIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDI1IHN1YnRyYWN0IDIwMTUuNjIxMDlFKzI5OTg5NzU5NiAtMTE3ODg5MTYuMSAtPiAyLjAxNTYyMTA5RSsyOTk4OTc1OTkgSW5leGFjdCBSb3VuZGVkCit4YWRkMDI2IGFkZCAyOS40OTgxMTQgLTI2NDg2NDUxIC0+IC0yNjQ4NjQyMS41IEluZXhhY3QgUm91bmRlZAoreGNvbTAyNiBjb21wYXJlIDI5LjQ5ODExNCAtMjY0ODY0NTEgLT4gMQoreGRpdjAyNiBkaXZpZGUgMjkuNDk4MTE0IC0yNjQ4NjQ1MSAtPiAtMC4wMDAwMDExMTM3MDU4MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMjYgZGl2aWRlaW50IDI5LjQ5ODExNCAtMjY0ODY0NTEgLT4gLTAKK3htdWwwMjYgbXVsdGlwbHkgMjkuNDk4MTE0IC0yNjQ4NjQ1MSAtPiAtNzgxMzAwMzUxIEluZXhhY3QgUm91bmRlZAoreHBvdzAyNiBwb3dlciAyOS40OTgxMTQgLTI2NDg2NDUxIC0+IDQuMjIyNTI1MTNFLTM4OTI5NjM0IEluZXhhY3QgUm91bmRlZAoreHJlbTAyNiByZW1haW5kZXIgMjkuNDk4MTE0IC0yNjQ4NjQ1MSAtPiAyOS40OTgxMTQKK3hzdWIwMjYgc3VidHJhY3QgMjkuNDk4MTE0IC0yNjQ4NjQ1MSAtPiAyNjQ4NjQ4MC41IEluZXhhY3QgUm91bmRlZAoreGFkZDAyNyBhZGQgMjQ0Mzc1MDQzLkUrMTMwODQwODc4IC05LjQ0NTIyMDI5IC0+IDIuNDQzNzUwNDNFKzEzMDg0MDg4NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMjcgY29tcGFyZSAyNDQzNzUwNDMuRSsxMzA4NDA4NzggLTkuNDQ1MjIwMjkgLT4gMQoreGRpdjAyNyBkaXZpZGUgMjQ0Mzc1MDQzLkUrMTMwODQwODc4IC05LjQ0NTIyMDI5IC0+IC0yLjU4NzI4NzkxRSsxMzA4NDA4ODUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDI3IGRpdmlkZWludCAyNDQzNzUwNDMuRSsxMzA4NDA4NzggLTkuNDQ1MjIwMjkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwMjcgbXVsdGlwbHkgMjQ0Mzc1MDQzLkUrMTMwODQwODc4IC05LjQ0NTIyMDI5IC0+IC0yLjMwODE3NjExRSsxMzA4NDA4ODcgSW5leGFjdCBSb3VuZGVkCit4cG93MDI3IHBvd2VyIDI0NDM3NTA0My5FKzEzMDg0MDg3OCAtOSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wMjcgcmVtYWluZGVyIDI0NDM3NTA0My5FKzEzMDg0MDg3OCAtOS40NDUyMjAyOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjAyNyBzdWJ0cmFjdCAyNDQzNzUwNDMuRSsxMzA4NDA4NzggLTkuNDQ1MjIwMjkgLT4gMi40NDM3NTA0M0UrMTMwODQwODg2IEluZXhhY3QgUm91bmRlZAoreGFkZDAyOCBhZGQgLTM0OTM4OC43NTkgLTE5NjIxNS43NzYgLT4gLTU0NTYwNC41MzUKK3hjb20wMjggY29tcGFyZSAtMzQ5Mzg4Ljc1OSAtMTk2MjE1Ljc3NiAtPiAtMQoreGRpdjAyOCBkaXZpZGUgLTM0OTM4OC43NTkgLTE5NjIxNS43NzYgLT4gMS43ODA2MzU0MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMjggZGl2aWRlaW50IC0zNDkzODguNzU5IC0xOTYyMTUuNzc2IC0+IDEKK3htdWwwMjggbXVsdGlwbHkgLTM0OTM4OC43NTkgLTE5NjIxNS43NzYgLT4gNi44NTU1NTg2NUUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MDI4IHBvd2VyIC0zNDkzODguNzU5IC0xOTYyMTYgLT4gMS4yNDU1MTc1MkUtMTA4NzY4NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMjggcmVtYWluZGVyIC0zNDkzODguNzU5IC0xOTYyMTUuNzc2IC0+IC0xNTMxNzIuOTgzCit4c3ViMDI4IHN1YnRyYWN0IC0zNDkzODguNzU5IC0xOTYyMTUuNzc2IC0+IC0xNTMxNzIuOTgzCit4YWRkMDI5IGFkZCAtNzA5MDUxMTIuNCAtOTEzNTM5NjguOCAtPiAtMTYyMjU5MDgxIEluZXhhY3QgUm91bmRlZAoreGNvbTAyOSBjb21wYXJlIC03MDkwNTExMi40IC05MTM1Mzk2OC44IC0+IDEKK3hkaXYwMjkgZGl2aWRlIC03MDkwNTExMi40IC05MTM1Mzk2OC44IC0+IDAuNzc2MTU3OTg2IEluZXhhY3QgUm91bmRlZAoreGR2aTAyOSBkaXZpZGVpbnQgLTcwOTA1MTEyLjQgLTkxMzUzOTY4LjggLT4gMAoreG11bDAyOSBtdWx0aXBseSAtNzA5MDUxMTIuNCAtOTEzNTM5NjguOCAtPiA2LjQ3NzQ2MzQzRSsxNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMjkgcG93ZXIgLTcwOTA1MTEyLjQgLTkxMzUzOTY5IC0+IC0zLjA1OTQ0NzQxRS03MTcxOTA1NTQgSW5leGFjdCBSb3VuZGVkCit4cmVtMDI5IHJlbWFpbmRlciAtNzA5MDUxMTIuNCAtOTEzNTM5NjguOCAtPiAtNzA5MDUxMTIuNAoreHN1YjAyOSBzdWJ0cmFjdCAtNzA5MDUxMTIuNCAtOTEzNTM5NjguOCAtPiAyMDQ0ODg1Ni40Cit4YWRkMDMwIGFkZCAtMjI1MDk0LjI4IC04OC43NzIzNTQyIC0+IC0yMjUxODMuMDUyIEluZXhhY3QgUm91bmRlZAoreGNvbTAzMCBjb21wYXJlIC0yMjUwOTQuMjggLTg4Ljc3MjM1NDIgLT4gLTEKK3hkaXYwMzAgZGl2aWRlIC0yMjUwOTQuMjggLTg4Ljc3MjM1NDIgLT4gMjUzNS42MzQ5MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMzAgZGl2aWRlaW50IC0yMjUwOTQuMjggLTg4Ljc3MjM1NDIgLT4gMjUzNQoreG11bDAzMCBtdWx0aXBseSAtMjI1MDk0LjI4IC04OC43NzIzNTQyIC0+IDE5OTgyMTQ5LjIgSW5leGFjdCBSb3VuZGVkCit4cG93MDMwIHBvd2VyIC0yMjUwOTQuMjggLTg5IC0+IC00LjM2MDc2OTY1RS00NzcgSW5leGFjdCBSb3VuZGVkCit4cmVtMDMwIHJlbWFpbmRlciAtMjI1MDk0LjI4IC04OC43NzIzNTQyIC0+IC01Ni4zNjIxMDMwCit4c3ViMDMwIHN1YnRyYWN0IC0yMjUwOTQuMjggLTg4Ljc3MjM1NDIgLT4gLTIyNTAwNS41MDggSW5leGFjdCBSb3VuZGVkCit4YWRkMDMxIGFkZCA1MC40NDQyMzQwIDgyLjc5NTIxNjlFKzg4MDEyMDc1OSAtPiA4LjI3OTUyMTY5RSs4ODAxMjA3NjAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDMxIGNvbXBhcmUgNTAuNDQ0MjM0MCA4Mi43OTUyMTY5RSs4ODAxMjA3NTkgLT4gLTEKK3hkaXYwMzEgZGl2aWRlIDUwLjQ0NDIzNDAgODIuNzk1MjE2OUUrODgwMTIwNzU5IC0+IDYuMDkyNjUwNzVFLTg4MDEyMDc2MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMzEgZGl2aWRlaW50IDUwLjQ0NDIzNDAgODIuNzk1MjE2OUUrODgwMTIwNzU5IC0+IDAKK3htdWwwMzEgbXVsdGlwbHkgNTAuNDQ0MjM0MCA4Mi43OTUyMTY5RSs4ODAxMjA3NTkgLT4gNC4xNzY1NDEzMEUrODgwMTIwNzYyIEluZXhhY3QgUm91bmRlZAoreHBvdzAzMSBwb3dlciA1MC40NDQyMzQwIDggLT4gNC4xOTI2ODUxOEUrMTMgSW5leGFjdCBSb3VuZGVkCit4cmVtMDMxIHJlbWFpbmRlciA1MC40NDQyMzQwIDgyLjc5NTIxNjlFKzg4MDEyMDc1OSAtPiA1MC40NDQyMzQwCit4c3ViMDMxIHN1YnRyYWN0IDUwLjQ0NDIzNDAgODIuNzk1MjE2OUUrODgwMTIwNzU5IC0+IC04LjI3OTUyMTY5RSs4ODAxMjA3NjAgSW5leGFjdCBSb3VuZGVkCit4YWRkMDMyIGFkZCAtMzIzMTEuOTAzNyA4LjM2Mzc5NDQ5IC0+IC0zMjMwMy41Mzk5IEluZXhhY3QgUm91bmRlZAoreGNvbTAzMiBjb21wYXJlIC0zMjMxMS45MDM3IDguMzYzNzk0NDkgLT4gLTEKK3hkaXYwMzIgZGl2aWRlIC0zMjMxMS45MDM3IDguMzYzNzk0NDkgLT4gLTM4NjMuMzA2NzUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDMyIGRpdmlkZWludCAtMzIzMTEuOTAzNyA4LjM2Mzc5NDQ5IC0+IC0zODYzCit4bXVsMDMyIG11bHRpcGx5IC0zMjMxMS45MDM3IDguMzYzNzk0NDkgLT4gLTI3MDI1MC4xMjIgSW5leGFjdCBSb3VuZGVkCit4cG93MDMyIHBvd2VyIC0zMjMxMS45MDM3IDggLT4gMS4xODgyMjk2MEUrMzYgSW5leGFjdCBSb3VuZGVkCit4cmVtMDMyIHJlbWFpbmRlciAtMzIzMTEuOTAzNyA4LjM2Mzc5NDQ5IC0+IC0yLjU2NTU4NTEzCit4c3ViMDMyIHN1YnRyYWN0IC0zMjMxMS45MDM3IDguMzYzNzk0NDkgLT4gLTMyMzIwLjI2NzUgSW5leGFjdCBSb3VuZGVkCit4YWRkMDMzIGFkZCA2MTUzOTYxNTYuRSs1NDk4OTUyOTEgLTI5NTMwMjQ3LjQgLT4gNi4xNTM5NjE1NkUrNTQ5ODk1Mjk5IEluZXhhY3QgUm91bmRlZAoreGNvbTAzMyBjb21wYXJlIDYxNTM5NjE1Ni5FKzU0OTg5NTI5MSAtMjk1MzAyNDcuNCAtPiAxCit4ZGl2MDMzIGRpdmlkZSA2MTUzOTYxNTYuRSs1NDk4OTUyOTEgLTI5NTMwMjQ3LjQgLT4gLTIuMDgzOTUxOTFFKzU0OTg5NTI5MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMzMgZGl2aWRlaW50IDYxNTM5NjE1Ni5FKzU0OTg5NTI5MSAtMjk1MzAyNDcuNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDAzMyBtdWx0aXBseSA2MTUzOTYxNTYuRSs1NDk4OTUyOTEgLTI5NTMwMjQ3LjQgLT4gLTEuODE3MjgwMDdFKzU0OTg5NTMwNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMzMgcG93ZXIgNjE1Mzk2MTU2LkUrNTQ5ODk1MjkxIC0yOTUzMDI0NyAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wMzMgcmVtYWluZGVyIDYxNTM5NjE1Ni5FKzU0OTg5NTI5MSAtMjk1MzAyNDcuNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjAzMyBzdWJ0cmFjdCA2MTUzOTYxNTYuRSs1NDk4OTUyOTEgLTI5NTMwMjQ3LjQgLT4gNi4xNTM5NjE1NkUrNTQ5ODk1Mjk5IEluZXhhY3QgUm91bmRlZAoreGFkZDAzNCBhZGQgNTkyLjE0MjE3M0UtNDE5OTQxNDE2IC0zLjQ2MDc5MTA5RS04NDQwMTE4NDUgLT4gNS45MjE0MjE3M0UtNDE5OTQxNDE0IEluZXhhY3QgUm91bmRlZAoreGNvbTAzNCBjb21wYXJlIDU5Mi4xNDIxNzNFLTQxOTk0MTQxNiAtMy40NjA3OTEwOUUtODQ0MDExODQ1IC0+IDEKK3hkaXYwMzQgZGl2aWRlIDU5Mi4xNDIxNzNFLTQxOTk0MTQxNiAtMy40NjA3OTEwOUUtODQ0MDExODQ1IC0+IC0xLjcxMTAwMjM2RSs0MjQwNzA0MzEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDM0IGRpdmlkZWludCA1OTIuMTQyMTczRS00MTk5NDE0MTYgLTMuNDYwNzkxMDlFLTg0NDAxMTg0NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDAzNCBtdWx0aXBseSA1OTIuMTQyMTczRS00MTk5NDE0MTYgLTMuNDYwNzkxMDlFLTg0NDAxMTg0NSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cG93MDM0IHBvd2VyIDU5Mi4xNDIxNzNFLTQxOTk0MTQxNiAtMyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMzQgcmVtYWluZGVyIDU5Mi4xNDIxNzNFLTQxOTk0MTQxNiAtMy40NjA3OTEwOUUtODQ0MDExODQ1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDM0IHN1YnRyYWN0IDU5Mi4xNDIxNzNFLTQxOTk0MTQxNiAtMy40NjA3OTEwOUUtODQ0MDExODQ1IC0+IDUuOTIxNDIxNzNFLTQxOTk0MTQxNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMzUgYWRkIDg0OS41MTU5OTNFLTg3ODQ0NjQ3MyAtMTAzOS4wODc3OCAtPiAtMTAzOS4wODc3OCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMzUgY29tcGFyZSA4NDkuNTE1OTkzRS04Nzg0NDY0NzMgLTEwMzkuMDg3NzggLT4gMQoreGRpdjAzNSBkaXZpZGUgODQ5LjUxNTk5M0UtODc4NDQ2NDczIC0xMDM5LjA4Nzc4IC0+IC04LjE3NTU5NDExRS04Nzg0NDY0NzQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDM1IGRpdmlkZWludCA4NDkuNTE1OTkzRS04Nzg0NDY0NzMgLTEwMzkuMDg3NzggLT4gLTAKK3htdWwwMzUgbXVsdGlwbHkgODQ5LjUxNTk5M0UtODc4NDQ2NDczIC0xMDM5LjA4Nzc4IC0+IC04LjgyNzIxNjg3RS04Nzg0NDY0NjggSW5leGFjdCBSb3VuZGVkCit4cG93MDM1IHBvd2VyIDg0OS41MTU5OTNFLTg3ODQ0NjQ3MyAtMTAzOSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMzUgcmVtYWluZGVyIDg0OS41MTU5OTNFLTg3ODQ0NjQ3MyAtMTAzOS4wODc3OCAtPiA4LjQ5NTE1OTkzRS04Nzg0NDY0NzEKK3hzdWIwMzUgc3VidHJhY3QgODQ5LjUxNTk5M0UtODc4NDQ2NDczIC0xMDM5LjA4Nzc4IC0+IDEwMzkuMDg3NzggSW5leGFjdCBSb3VuZGVkCit4YWRkMDM2IGFkZCAyMTMzNjE3ODkgLTU5OS42NDQ4NTEgLT4gMjEzMzYxMTg5IEluZXhhY3QgUm91bmRlZAoreGNvbTAzNiBjb21wYXJlIDIxMzM2MTc4OSAtNTk5LjY0NDg1MSAtPiAxCit4ZGl2MDM2IGRpdmlkZSAyMTMzNjE3ODkgLTU5OS42NDQ4NTEgLT4gLTM1NTgxMy41OTMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDM2IGRpdmlkZWludCAyMTMzNjE3ODkgLTU5OS42NDQ4NTEgLT4gLTM1NTgxMworeG11bDAzNiBtdWx0aXBseSAyMTMzNjE3ODkgLTU5OS42NDQ4NTEgLT4gLTEuMjc5NDEyOThFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzAzNiBwb3dlciAyMTMzNjE3ODkgLTYwMCAtPiAzLjM4ODU0Njg0RS00OTk4IEluZXhhY3QgUm91bmRlZAoreHJlbTAzNiByZW1haW5kZXIgMjEzMzYxNzg5IC01OTkuNjQ0ODUxIC0+IDM1NS42MzExMzcKK3hzdWIwMzYgc3VidHJhY3QgMjEzMzYxNzg5IC01OTkuNjQ0ODUxIC0+IDIxMzM2MjM4OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMzcgYWRkIC03OTU1MjI1NTUuIC0yOTguMDM3NzAyIC0+IC03OTU1MjI4NTMgSW5leGFjdCBSb3VuZGVkCit4Y29tMDM3IGNvbXBhcmUgLTc5NTUyMjU1NS4gLTI5OC4wMzc3MDIgLT4gLTEKK3hkaXYwMzcgZGl2aWRlIC03OTU1MjI1NTUuIC0yOTguMDM3NzAyIC0+IDI2NjkyMDEuMDggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDM3IGRpdmlkZWludCAtNzk1NTIyNTU1LiAtMjk4LjAzNzcwMiAtPiAyNjY5MjAxCit4bXVsMDM3IG11bHRpcGx5IC03OTU1MjI1NTUuIC0yOTguMDM3NzAyIC0+IDIuMzcwOTU3MTRFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzAzNyBwb3dlciAtNzk1NTIyNTU1LiAtMjk4IC0+IDQuMDMyMzI3MTJFLTI2NTMgSW5leGFjdCBSb3VuZGVkCit4cmVtMDM3IHJlbWFpbmRlciAtNzk1NTIyNTU1LiAtMjk4LjAzNzcwMiAtPiAtMjIuNzgzODk4Cit4c3ViMDM3IHN1YnRyYWN0IC03OTU1MjI1NTUuIC0yOTguMDM3NzAyIC0+IC03OTU1MjIyNTcgSW5leGFjdCBSb3VuZGVkCit4YWRkMDM4IGFkZCAtNTAxMjYwNjUxLiAtODc2MTg5My4wRS02ODkyODE0NzkgLT4gLTUwMTI2MDY1MSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMzggY29tcGFyZSAtNTAxMjYwNjUxLiAtODc2MTg5My4wRS02ODkyODE0NzkgLT4gLTEKK3hkaXYwMzggZGl2aWRlIC01MDEyNjA2NTEuIC04NzYxODkzLjBFLTY4OTI4MTQ3OSAtPiA1LjcyMDkxNzI4RSs2ODkyODE0ODAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDM4IGRpdmlkZWludCAtNTAxMjYwNjUxLiAtODc2MTg5My4wRS02ODkyODE0NzkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwMzggbXVsdGlwbHkgLTUwMTI2MDY1MS4gLTg3NjE4OTMuMEUtNjg5MjgxNDc5IC0+IDQuMzkxOTkyMTlFLTY4OTI4MTQ2NCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMzggcG93ZXIgLTUwMTI2MDY1MS4gLTkgLT4gLTUuMDA1MjY5NjFFLTc5IEluZXhhY3QgUm91bmRlZAoreHJlbTAzOCByZW1haW5kZXIgLTUwMTI2MDY1MS4gLTg3NjE4OTMuMEUtNjg5MjgxNDc5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDM4IHN1YnRyYWN0IC01MDEyNjA2NTEuIC04NzYxODkzLjBFLTY4OTI4MTQ3OSAtPiAtNTAxMjYwNjUxIEluZXhhY3QgUm91bmRlZAoreGFkZDAzOSBhZGQgLTEuNzA3ODExMDVFLTg0ODg4OTAyMyAzNjUwNDc2OS40IC0+IDM2NTA0NzY5LjQgSW5leGFjdCBSb3VuZGVkCit4Y29tMDM5IGNvbXBhcmUgLTEuNzA3ODExMDVFLTg0ODg4OTAyMyAzNjUwNDc2OS40IC0+IC0xCit4ZGl2MDM5IGRpdmlkZSAtMS43MDc4MTEwNUUtODQ4ODg5MDIzIDM2NTA0NzY5LjQgLT4gLTQuNjc4MzIzMDdFLTg0ODg4OTAzMSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMzkgZGl2aWRlaW50IC0xLjcwNzgxMTA1RS04NDg4ODkwMjMgMzY1MDQ3NjkuNCAtPiAtMAoreG11bDAzOSBtdWx0aXBseSAtMS43MDc4MTEwNUUtODQ4ODg5MDIzIDM2NTA0NzY5LjQgLT4gLTYuMjM0MzI0ODZFLTg0ODg4OTAxNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMzkgcG93ZXIgLTEuNzA3ODExMDVFLTg0ODg4OTAyMyAzNjUwNDc2OSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMDM5IHJlbWFpbmRlciAtMS43MDc4MTEwNUUtODQ4ODg5MDIzIDM2NTA0NzY5LjQgLT4gLTEuNzA3ODExMDVFLTg0ODg4OTAyMworeHN1YjAzOSBzdWJ0cmFjdCAtMS43MDc4MTEwNUUtODQ4ODg5MDIzIDM2NTA0NzY5LjQgLT4gLTM2NTA0NzY5LjQgSW5leGFjdCBSb3VuZGVkCit4YWRkMDQwIGFkZCAtNTI5MC41NDk4NEUtNDkwNjI2Njc2IDg0MjUzNTI1NCAtPiA4NDI1MzUyNTQgSW5leGFjdCBSb3VuZGVkCit4Y29tMDQwIGNvbXBhcmUgLTUyOTAuNTQ5ODRFLTQ5MDYyNjY3NiA4NDI1MzUyNTQgLT4gLTEKK3hkaXYwNDAgZGl2aWRlIC01MjkwLjU0OTg0RS00OTA2MjY2NzYgODQyNTM1MjU0IC0+IC02LjI3OTMyMTYyRS00OTA2MjY2ODIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDQwIGRpdmlkZWludCAtNTI5MC41NDk4NEUtNDkwNjI2Njc2IDg0MjUzNTI1NCAtPiAtMAoreG11bDA0MCBtdWx0aXBseSAtNTI5MC41NDk4NEUtNDkwNjI2Njc2IDg0MjUzNTI1NCAtPiAtNC40NTc0NzQ3NUUtNDkwNjI2NjY0IEluZXhhY3QgUm91bmRlZAoreHBvdzA0MCBwb3dlciAtNTI5MC41NDk4NEUtNDkwNjI2Njc2IDg0MjUzNTI1NCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wNDAgcmVtYWluZGVyIC01MjkwLjU0OTg0RS00OTA2MjY2NzYgODQyNTM1MjU0IC0+IC01LjI5MDU0OTg0RS00OTA2MjY2NzMKK3hzdWIwNDAgc3VidHJhY3QgLTUyOTAuNTQ5ODRFLTQ5MDYyNjY3NiA4NDI1MzUyNTQgLT4gLTg0MjUzNTI1NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNDEgYWRkIDYwOC4zMTgyNUUrNTM1MjY4MTIwIC01OTYwOS4wOTkzIC0+IDYuMDgzMTgyNTBFKzUzNTI2ODEyMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNDEgY29tcGFyZSA2MDguMzE4MjVFKzUzNTI2ODEyMCAtNTk2MDkuMDk5MyAtPiAxCit4ZGl2MDQxIGRpdmlkZSA2MDguMzE4MjVFKzUzNTI2ODEyMCAtNTk2MDkuMDk5MyAtPiAtMS4wMjA1MTI0MEUrNTM1MjY4MTE4IEluZXhhY3QgUm91bmRlZAoreGR2aTA0MSBkaXZpZGVpbnQgNjA4LjMxODI1RSs1MzUyNjgxMjAgLTU5NjA5LjA5OTMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwNDEgbXVsdGlwbHkgNjA4LjMxODI1RSs1MzUyNjgxMjAgLTU5NjA5LjA5OTMgLT4gLTMuNjI2MTMwMzBFKzUzNTI2ODEyNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNDEgcG93ZXIgNjA4LjMxODI1RSs1MzUyNjgxMjAgLTU5NjA5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTA0MSByZW1haW5kZXIgNjA4LjMxODI1RSs1MzUyNjgxMjAgLTU5NjA5LjA5OTMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwNDEgc3VidHJhY3QgNjA4LjMxODI1RSs1MzUyNjgxMjAgLTU5NjA5LjA5OTMgLT4gNi4wODMxODI1MEUrNTM1MjY4MTIyIEluZXhhY3QgUm91bmRlZAoreGFkZDA0MiBhZGQgLTQ2MjkwMzUuMzEgLTE2Ny44ODQzOTggLT4gLTQ2MjkyMDMuMTkgSW5leGFjdCBSb3VuZGVkCit4Y29tMDQyIGNvbXBhcmUgLTQ2MjkwMzUuMzEgLTE2Ny44ODQzOTggLT4gLTEKK3hkaXYwNDIgZGl2aWRlIC00NjI5MDM1LjMxIC0xNjcuODg0Mzk4IC0+IDI3NTcyLjc1NDYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDQyIGRpdmlkZWludCAtNDYyOTAzNS4zMSAtMTY3Ljg4NDM5OCAtPiAyNzU3MgoreG11bDA0MiBtdWx0aXBseSAtNDYyOTAzNS4zMSAtMTY3Ljg4NDM5OCAtPiA3NzcxNDI4MDYgSW5leGFjdCBSb3VuZGVkCit4cG93MDQyIHBvd2VyIC00NjI5MDM1LjMxIC0xNjggLT4gMS41NzYxNDgzMUUtMTEyMCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNDIgcmVtYWluZGVyIC00NjI5MDM1LjMxIC0xNjcuODg0Mzk4IC0+IC0xMjYuNjg4MzQ0Cit4c3ViMDQyIHN1YnRyYWN0IC00NjI5MDM1LjMxIC0xNjcuODg0Mzk4IC0+IC00NjI4ODY3LjQzIEluZXhhY3QgUm91bmRlZAoreGFkZDA0MyBhZGQgLTY2NTI3Mzc4LiAtNzA2NDAwMjY4LiAtPiAtNzcyOTI3NjQ2Cit4Y29tMDQzIGNvbXBhcmUgLTY2NTI3Mzc4LiAtNzA2NDAwMjY4LiAtPiAxCit4ZGl2MDQzIGRpdmlkZSAtNjY1MjczNzguIC03MDY0MDAyNjguIC0+IDAuMDk0MTc4MDE5MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNDMgZGl2aWRlaW50IC02NjUyNzM3OC4gLTcwNjQwMDI2OC4gLT4gMAoreG11bDA0MyBtdWx0aXBseSAtNjY1MjczNzguIC03MDY0MDAyNjguIC0+IDQuNjk5NDk1NzZFKzE2IEluZXhhY3QgUm91bmRlZAoreHBvdzA0MyBwb3dlciAtNjY1MjczNzguIC03MDY0MDAyNjggLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMDQzIHJlbWFpbmRlciAtNjY1MjczNzguIC03MDY0MDAyNjguIC0+IC02NjUyNzM3OAoreHN1YjA0MyBzdWJ0cmFjdCAtNjY1MjczNzguIC03MDY0MDAyNjguIC0+IDYzOTg3Mjg5MAoreGFkZDA0NCBhZGQgLTI1MTA0OTcuNTMgMzcyODgyNDYyLiAtPiAzNzAzNzE5NjQgSW5leGFjdCBSb3VuZGVkCit4Y29tMDQ0IGNvbXBhcmUgLTI1MTA0OTcuNTMgMzcyODgyNDYyLiAtPiAtMQoreGRpdjA0NCBkaXZpZGUgLTI1MTA0OTcuNTMgMzcyODgyNDYyLiAtPiAtMC4wMDY3MzI2Nzc5NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNDQgZGl2aWRlaW50IC0yNTEwNDk3LjUzIDM3Mjg4MjQ2Mi4gLT4gLTAKK3htdWwwNDQgbXVsdGlwbHkgLTI1MTA0OTcuNTMgMzcyODgyNDYyLiAtPiAtOS4zNjEyMDUwMEUrMTQgSW5leGFjdCBSb3VuZGVkCit4cG93MDQ0IHBvd2VyIC0yNTEwNDk3LjUzIDM3Mjg4MjQ2MiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNDQgcmVtYWluZGVyIC0yNTEwNDk3LjUzIDM3Mjg4MjQ2Mi4gLT4gLTI1MTA0OTcuNTMKK3hzdWIwNDQgc3VidHJhY3QgLTI1MTA0OTcuNTMgMzcyODgyNDYyLiAtPiAtMzc1MzkyOTYwIEluZXhhY3QgUm91bmRlZAoreGFkZDA0NSBhZGQgMTM2LjI1NTM5M0UrNTMzMjk5NjEgLTUzNDk0LjcyMDFFKzcyMDA1ODA2MCAtPiAtNS4zNDk0NzIwMUUrNzIwMDU4MDY0IEluZXhhY3QgUm91bmRlZAoreGNvbTA0NSBjb21wYXJlIDEzNi4yNTUzOTNFKzUzMzI5OTYxIC01MzQ5NC43MjAxRSs3MjAwNTgwNjAgLT4gMQoreGRpdjA0NSBkaXZpZGUgMTM2LjI1NTM5M0UrNTMzMjk5NjEgLTUzNDk0LjcyMDFFKzcyMDA1ODA2MCAtPiAtMi41NDcwODExNUUtNjY2NzI4MTAyIEluZXhhY3QgUm91bmRlZAoreGR2aTA0NSBkaXZpZGVpbnQgMTM2LjI1NTM5M0UrNTMzMjk5NjEgLTUzNDk0LjcyMDFFKzcyMDA1ODA2MCAtPiAtMAoreG11bDA0NSBtdWx0aXBseSAxMzYuMjU1MzkzRSs1MzMyOTk2MSAtNTM0OTQuNzIwMUUrNzIwMDU4MDYwIC0+IC03LjI4ODk0NDExRSs3NzMzODgwMjcgSW5leGFjdCBSb3VuZGVkCit4cG93MDQ1IHBvd2VyIDEzNi4yNTUzOTNFKzUzMzI5OTYxIC01IC0+IDIuMTI5MjczNzNFLTI2NjY0OTgxNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNDUgcmVtYWluZGVyIDEzNi4yNTUzOTNFKzUzMzI5OTYxIC01MzQ5NC43MjAxRSs3MjAwNTgwNjAgLT4gMS4zNjI1NTM5M0UrNTMzMjk5NjMKK3hzdWIwNDUgc3VidHJhY3QgMTM2LjI1NTM5M0UrNTMzMjk5NjEgLTUzNDk0LjcyMDFFKzcyMDA1ODA2MCAtPiA1LjM0OTQ3MjAxRSs3MjAwNTgwNjQgSW5leGFjdCBSb3VuZGVkCit4YWRkMDQ2IGFkZCAtODc2NjczLjEwMCAtNjE1MC45MjI2NiAtPiAtODgyODI0LjAyMyBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNDYgY29tcGFyZSAtODc2NjczLjEwMCAtNjE1MC45MjI2NiAtPiAtMQoreGRpdjA0NiBkaXZpZGUgLTg3NjY3My4xMDAgLTYxNTAuOTIyNjYgLT4gMTQyLjUyNzA4OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNDYgZGl2aWRlaW50IC04NzY2NzMuMTAwIC02MTUwLjkyMjY2IC0+IDE0MgoreG11bDA0NiBtdWx0aXBseSAtODc2NjczLjEwMCAtNjE1MC45MjI2NiAtPiA1LjM5MjM0ODQ0RSs5IEluZXhhY3QgUm91bmRlZAoreHBvdzA0NiBwb3dlciAtODc2NjczLjEwMCAtNjE1MSAtPiAtNC4wMzExMTc3NEUtMzY1NTUgSW5leGFjdCBSb3VuZGVkCit4cmVtMDQ2IHJlbWFpbmRlciAtODc2NjczLjEwMCAtNjE1MC45MjI2NiAtPiAtMzI0Mi4wODIyOAoreHN1YjA0NiBzdWJ0cmFjdCAtODc2NjczLjEwMCAtNjE1MC45MjI2NiAtPiAtODcwNTIyLjE3NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNDcgYWRkIC0yLjQ1MTUxNzk3RSs5MTEzMDYxMTcgMjcyMzU3NzEgLT4gLTIuNDUxNTE3OTdFKzkxMTMwNjExNyBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNDcgY29tcGFyZSAtMi40NTE1MTc5N0UrOTExMzA2MTE3IDI3MjM1NzcxIC0+IC0xCit4ZGl2MDQ3IGRpdmlkZSAtMi40NTE1MTc5N0UrOTExMzA2MTE3IDI3MjM1NzcxIC0+IC05LjAwMTA5NjI4RSs5MTEzMDYxMDkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDQ3IGRpdmlkZWludCAtMi40NTE1MTc5N0UrOTExMzA2MTE3IDI3MjM1NzcxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDQ3IG11bHRpcGx5IC0yLjQ1MTUxNzk3RSs5MTEzMDYxMTcgMjcyMzU3NzEgLT4gLTYuNjc2ODk4MjBFKzkxMTMwNjEyNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNDcgcG93ZXIgLTIuNDUxNTE3OTdFKzkxMTMwNjExNyAyNzIzNTc3MSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDQ3IHJlbWFpbmRlciAtMi40NTE1MTc5N0UrOTExMzA2MTE3IDI3MjM1NzcxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDQ3IHN1YnRyYWN0IC0yLjQ1MTUxNzk3RSs5MTEzMDYxMTcgMjcyMzU3NzEgLT4gLTIuNDUxNTE3OTdFKzkxMTMwNjExNyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNDggYWRkIC05LjE1MTE3NTUxIC00Ljk1MTAwNzMzRS0zMTQ1MTEzMjYgLT4gLTkuMTUxMTc1NTEgSW5leGFjdCBSb3VuZGVkCit4Y29tMDQ4IGNvbXBhcmUgLTkuMTUxMTc1NTEgLTQuOTUxMDA3MzNFLTMxNDUxMTMyNiAtPiAtMQoreGRpdjA0OCBkaXZpZGUgLTkuMTUxMTc1NTEgLTQuOTUxMDA3MzNFLTMxNDUxMTMyNiAtPiAxLjg0ODM0NjE4RSszMTQ1MTEzMjYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDQ4IGRpdmlkZWludCAtOS4xNTExNzU1MSAtNC45NTEwMDczM0UtMzE0NTExMzI2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDQ4IG11bHRpcGx5IC05LjE1MTE3NTUxIC00Ljk1MTAwNzMzRS0zMTQ1MTEzMjYgLT4gNC41MzA3NTM3MEUtMzE0NTExMzI1IEluZXhhY3QgUm91bmRlZAoreHBvdzA0OCBwb3dlciAtOS4xNTExNzU1MSAtNSAtPiAtMC4wMDAwMTU1ODE3MjY1IEluZXhhY3QgUm91bmRlZAoreHJlbTA0OCByZW1haW5kZXIgLTkuMTUxMTc1NTEgLTQuOTUxMDA3MzNFLTMxNDUxMTMyNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjA0OCBzdWJ0cmFjdCAtOS4xNTExNzU1MSAtNC45NTEwMDczM0UtMzE0NTExMzI2IC0+IC05LjE1MTE3NTUxIEluZXhhY3QgUm91bmRlZAoreGFkZDA0OSBhZGQgMy42MTg5MDQ1M0UtOTg1NjA2MTI4IDMwNjY0NDE2LiAtPiAzMDY2NDQxNi4wIEluZXhhY3QgUm91bmRlZAoreGNvbTA0OSBjb21wYXJlIDMuNjE4OTA0NTNFLTk4NTYwNjEyOCAzMDY2NDQxNi4gLT4gLTEKK3hkaXYwNDkgZGl2aWRlIDMuNjE4OTA0NTNFLTk4NTYwNjEyOCAzMDY2NDQxNi4gLT4gMS4xODAxNjQxOEUtOTg1NjA2MTM1IEluZXhhY3QgUm91bmRlZAoreGR2aTA0OSBkaXZpZGVpbnQgMy42MTg5MDQ1M0UtOTg1NjA2MTI4IDMwNjY0NDE2LiAtPiAwCit4bXVsMDQ5IG11bHRpcGx5IDMuNjE4OTA0NTNFLTk4NTYwNjEyOCAzMDY2NDQxNi4gLT4gMS4xMDk3MTU5NEUtOTg1NjA2MTIwIEluZXhhY3QgUm91bmRlZAoreHBvdzA0OSBwb3dlciAzLjYxODkwNDUzRS05ODU2MDYxMjggMzA2NjQ0MTYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMDQ5IHJlbWFpbmRlciAzLjYxODkwNDUzRS05ODU2MDYxMjggMzA2NjQ0MTYuIC0+IDMuNjE4OTA0NTNFLTk4NTYwNjEyOAoreHN1YjA0OSBzdWJ0cmFjdCAzLjYxODkwNDUzRS05ODU2MDYxMjggMzA2NjQ0MTYuIC0+IC0zMDY2NDQxNi4wIEluZXhhY3QgUm91bmRlZAoreGFkZDA1MCBhZGQgLTI1NzY3NDYwMkUrMjE2NzIzMzgyIC03MDgyMDk1OS40IC0+IC0yLjU3Njc0NjAyRSsyMTY3MjMzOTAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDUwIGNvbXBhcmUgLTI1NzY3NDYwMkUrMjE2NzIzMzgyIC03MDgyMDk1OS40IC0+IC0xCit4ZGl2MDUwIGRpdmlkZSAtMjU3Njc0NjAyRSsyMTY3MjMzODIgLTcwODIwOTU5LjQgLT4gMy42MzgzOTQ2OEUrMjE2NzIzMzgyIEluZXhhY3QgUm91bmRlZAoreGR2aTA1MCBkaXZpZGVpbnQgLTI1NzY3NDYwMkUrMjE2NzIzMzgyIC03MDgyMDk1OS40IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDUwIG11bHRpcGx5IC0yNTc2NzQ2MDJFKzIxNjcyMzM4MiAtNzA4MjA5NTkuNCAtPiAxLjgyNDg3NjI1RSsyMTY3MjMzOTggSW5leGFjdCBSb3VuZGVkCit4cG93MDUwIHBvd2VyIC0yNTc2NzQ2MDJFKzIxNjcyMzM4MiAtNzA4MjA5NTkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTA1MCByZW1haW5kZXIgLTI1NzY3NDYwMkUrMjE2NzIzMzgyIC03MDgyMDk1OS40IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDUwIHN1YnRyYWN0IC0yNTc2NzQ2MDJFKzIxNjcyMzM4MiAtNzA4MjA5NTkuNCAtPiAtMi41NzY3NDYwMkUrMjE2NzIzMzkwIEluZXhhY3QgUm91bmRlZAoreGFkZDA1MSBhZGQgMjE4Njk5LjIwNiA1NTY5NDQyNDEuIC0+IDU1NzE2Mjk0MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNTEgY29tcGFyZSAyMTg2OTkuMjA2IDU1Njk0NDI0MS4gLT4gLTEKK3hkaXYwNTEgZGl2aWRlIDIxODY5OS4yMDYgNTU2OTQ0MjQxLiAtPiAwLjAwMDM5MjY3NzAyMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNTEgZGl2aWRlaW50IDIxODY5OS4yMDYgNTU2OTQ0MjQxLiAtPiAwCit4bXVsMDUxIG11bHRpcGx5IDIxODY5OS4yMDYgNTU2OTQ0MjQxLiAtPiAxLjIxODAzMjYzRSsxNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNTEgcG93ZXIgMjE4Njk5LjIwNiA1NTY5NDQyNDEgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDUxIHJlbWFpbmRlciAyMTg2OTkuMjA2IDU1Njk0NDI0MS4gLT4gMjE4Njk5LjIwNgoreHN1YjA1MSBzdWJ0cmFjdCAyMTg2OTkuMjA2IDU1Njk0NDI0MS4gLT4gLTU1NjcyNTU0MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNTIgYWRkIDEwNjIxMTcxNi4gLTM0NTY3OTMuNzQgLT4gMTAyNzU0OTIyIEluZXhhY3QgUm91bmRlZAoreGNvbTA1MiBjb21wYXJlIDEwNjIxMTcxNi4gLTM0NTY3OTMuNzQgLT4gMQoreGRpdjA1MiBkaXZpZGUgMTA2MjExNzE2LiAtMzQ1Njc5My43NCAtPiAtMzAuNzI1NTAwMCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNTIgZGl2aWRlaW50IDEwNjIxMTcxNi4gLTM0NTY3OTMuNzQgLT4gLTMwCit4bXVsMDUyIG11bHRpcGx5IDEwNjIxMTcxNi4gLTM0NTY3OTMuNzQgLT4gLTMuNjcxNTE5OTVFKzE0IEluZXhhY3QgUm91bmRlZAoreHBvdzA1MiBwb3dlciAxMDYyMTE3MTYuIC0zNDU2Nzk0IC0+IDIuMDcyMjU1ODFFLTI3NzQ0ODI1IEluZXhhY3QgUm91bmRlZAoreHJlbTA1MiByZW1haW5kZXIgMTA2MjExNzE2LiAtMzQ1Njc5My43NCAtPiAyNTA3OTAzLjgwCit4c3ViMDUyIHN1YnRyYWN0IDEwNjIxMTcxNi4gLTM0NTY3OTMuNzQgLT4gMTA5NjY4NTEwIEluZXhhY3QgUm91bmRlZAoreGFkZDA1MyBhZGQgMS4yNTAxODA3OCAzOTk4NTYuNzYzRS03MjY4MTY3NDAgLT4gMS4yNTAxODA3OCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNTMgY29tcGFyZSAxLjI1MDE4MDc4IDM5OTg1Ni43NjNFLTcyNjgxNjc0MCAtPiAxCit4ZGl2MDUzIGRpdmlkZSAxLjI1MDE4MDc4IDM5OTg1Ni43NjNFLTcyNjgxNjc0MCAtPiAzLjEyNjU3MTU1RSs3MjY4MTY3MzQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDUzIGRpdmlkZWludCAxLjI1MDE4MDc4IDM5OTg1Ni43NjNFLTcyNjgxNjc0MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA1MyBtdWx0aXBseSAxLjI1MDE4MDc4IDM5OTg1Ni43NjNFLTcyNjgxNjc0MCAtPiA0Ljk5ODkzMjQwRS03MjY4MTY3MzUgSW5leGFjdCBSb3VuZGVkCit4cG93MDUzIHBvd2VyIDEuMjUwMTgwNzggNCAtPiAyLjQ0MjgxODkwIEluZXhhY3QgUm91bmRlZAoreHJlbTA1MyByZW1haW5kZXIgMS4yNTAxODA3OCAzOTk4NTYuNzYzRS03MjY4MTY3NDAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwNTMgc3VidHJhY3QgMS4yNTAxODA3OCAzOTk4NTYuNzYzRS03MjY4MTY3NDAgLT4gMS4yNTAxODA3OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNTQgYWRkIDM2NC45OTgxMSAtNDYyMjIuMDUwNSAtPiAtNDU4NTcuMDUyNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNTQgY29tcGFyZSAzNjQuOTk4MTEgLTQ2MjIyLjA1MDUgLT4gMQoreGRpdjA1NCBkaXZpZGUgMzY0Ljk5ODExIC00NjIyMi4wNTA1IC0+IC0wLjAwNzg5NjYyMzA2IEluZXhhY3QgUm91bmRlZAoreGR2aTA1NCBkaXZpZGVpbnQgMzY0Ljk5ODExIC00NjIyMi4wNTA1IC0+IC0wCit4bXVsMDU0IG11bHRpcGx5IDM2NC45OTgxMSAtNDYyMjIuMDUwNSAtPiAtMTY4NzA5NjEuMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNTQgcG93ZXIgMzY0Ljk5ODExIC00NjIyMiAtPiA2LjM1NTcwODU2RS0xMTg0MzUgSW5leGFjdCBSb3VuZGVkCit4cmVtMDU0IHJlbWFpbmRlciAzNjQuOTk4MTEgLTQ2MjIyLjA1MDUgLT4gMzY0Ljk5ODExCit4c3ViMDU0IHN1YnRyYWN0IDM2NC45OTgxMSAtNDYyMjIuMDUwNSAtPiA0NjU4Ny4wNDg2IEluZXhhY3QgUm91bmRlZAoreGFkZDA1NSBhZGQgLTM5MjIxNzU3Ni4gLTk1ODM2NDA5NiAtPiAtMS4zNTA1ODE2N0UrOSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNTUgY29tcGFyZSAtMzkyMjE3NTc2LiAtOTU4MzY0MDk2IC0+IDEKK3hkaXYwNTUgZGl2aWRlIC0zOTIyMTc1NzYuIC05NTgzNjQwOTYgLT4gMC40MDkyNTczNzcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDU1IGRpdmlkZWludCAtMzkyMjE3NTc2LiAtOTU4MzY0MDk2IC0+IDAKK3htdWwwNTUgbXVsdGlwbHkgLTM5MjIxNzU3Ni4gLTk1ODM2NDA5NiAtPiAzLjc1ODg3MjQzRSsxNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNTUgcG93ZXIgLTM5MjIxNzU3Ni4gLTk1ODM2NDA5NiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wNTUgcmVtYWluZGVyIC0zOTIyMTc1NzYuIC05NTgzNjQwOTYgLT4gLTM5MjIxNzU3NgoreHN1YjA1NSBzdWJ0cmFjdCAtMzkyMjE3NTc2LiAtOTU4MzY0MDk2IC0+IDU2NjE0NjUyMAoreGFkZDA1NiBhZGQgMTY5NjAxMjg1IDcxNDUyNi42MzkgLT4gMTcwMzE1ODEyIEluZXhhY3QgUm91bmRlZAoreGNvbTA1NiBjb21wYXJlIDE2OTYwMTI4NSA3MTQ1MjYuNjM5IC0+IDEKK3hkaXYwNTYgZGl2aWRlIDE2OTYwMTI4NSA3MTQ1MjYuNjM5IC0+IDIzNy4zNjE3MzggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDU2IGRpdmlkZWludCAxNjk2MDEyODUgNzE0NTI2LjYzOSAtPiAyMzcKK3htdWwwNTYgbXVsdGlwbHkgMTY5NjAxMjg1IDcxNDUyNi42MzkgLT4gMS4yMTE4NDYzNkUrMTQgSW5leGFjdCBSb3VuZGVkCit4cG93MDU2IHBvd2VyIDE2OTYwMTI4NSA3MTQ1MjcgLT4gMi4wNjA1MjQ0NEUrNTg4MDE0OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNTYgcmVtYWluZGVyIDE2OTYwMTI4NSA3MTQ1MjYuNjM5IC0+IDI1ODQ3MS41NTcKK3hzdWIwNTYgc3VidHJhY3QgMTY5NjAxMjg1IDcxNDUyNi42MzkgLT4gMTY4ODg2NzU4IEluZXhhY3QgUm91bmRlZAoreGFkZDA1NyBhZGQgLTY3NC4wOTQ1NTJFKzU4Njk0NDMxOSA2MzU0LjI2NjhFKzU4OTY1NzI2NiAtPiA2LjM1NDI2NjgwRSs1ODk2NTcyNjkgSW5leGFjdCBSb3VuZGVkCit4Y29tMDU3IGNvbXBhcmUgLTY3NC4wOTQ1NTJFKzU4Njk0NDMxOSA2MzU0LjI2NjhFKzU4OTY1NzI2NiAtPiAtMQoreGRpdjA1NyBkaXZpZGUgLTY3NC4wOTQ1NTJFKzU4Njk0NDMxOSA2MzU0LjI2NjhFKzU4OTY1NzI2NiAtPiAtMS4wNjA4NTM0MEUtMjcxMjk0OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNTcgZGl2aWRlaW50IC02NzQuMDk0NTUyRSs1ODY5NDQzMTkgNjM1NC4yNjY4RSs1ODk2NTcyNjYgLT4gLTAKK3htdWwwNTcgbXVsdGlwbHkgLTY3NC4wOTQ1NTJFKzU4Njk0NDMxOSA2MzU0LjI2NjhFKzU4OTY1NzI2NiAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCit4cG93MDU3IHBvd2VyIC02NzQuMDk0NTUyRSs1ODY5NDQzMTkgNiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNTcgcmVtYWluZGVyIC02NzQuMDk0NTUyRSs1ODY5NDQzMTkgNjM1NC4yNjY4RSs1ODk2NTcyNjYgLT4gLTYuNzQwOTQ1NTJFKzU4Njk0NDMyMQoreHN1YjA1NyBzdWJ0cmFjdCAtNjc0LjA5NDU1MkUrNTg2OTQ0MzE5IDYzNTQuMjY2OEUrNTg5NjU3MjY2IC0+IC02LjM1NDI2NjgwRSs1ODk2NTcyNjkgSW5leGFjdCBSb3VuZGVkCit4YWRkMDU4IGFkZCAxNTE3OTUxNjNFLTM3MTcyNzE4MiAtNDg4LjA5Nzg4RS03Mzg4NTIyNDUgLT4gMS41MTc5NTE2M0UtMzcxNzI3MTc0IEluZXhhY3QgUm91bmRlZAoreGNvbTA1OCBjb21wYXJlIDE1MTc5NTE2M0UtMzcxNzI3MTgyIC00ODguMDk3ODhFLTczODg1MjI0NSAtPiAxCit4ZGl2MDU4IGRpdmlkZSAxNTE3OTUxNjNFLTM3MTcyNzE4MiAtNDg4LjA5Nzg4RS03Mzg4NTIyNDUgLT4gLTMuMTA5OTMyODVFKzM2NzEyNTA2OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNTggZGl2aWRlaW50IDE1MTc5NTE2M0UtMzcxNzI3MTgyIC00ODguMDk3ODhFLTczODg1MjI0NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA1OCBtdWx0aXBseSAxNTE3OTUxNjNFLTM3MTcyNzE4MiAtNDg4LjA5Nzg4RS03Mzg4NTIyNDUgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHBvdzA1OCBwb3dlciAxNTE3OTUxNjNFLTM3MTcyNzE4MiAtNSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNTggcmVtYWluZGVyIDE1MTc5NTE2M0UtMzcxNzI3MTgyIC00ODguMDk3ODhFLTczODg1MjI0NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjA1OCBzdWJ0cmFjdCAxNTE3OTUxNjNFLTM3MTcyNzE4MiAtNDg4LjA5Nzg4RS03Mzg4NTIyNDUgLT4gMS41MTc5NTE2M0UtMzcxNzI3MTc0IEluZXhhY3QgUm91bmRlZAoreGFkZDA1OSBhZGQgLTc0Ni4yOTMzODYgOTI3NzQ5LjY0NyAtPiA5MjcwMDMuMzU0IEluZXhhY3QgUm91bmRlZAoreGNvbTA1OSBjb21wYXJlIC03NDYuMjkzMzg2IDkyNzc0OS42NDcgLT4gLTEKK3hkaXYwNTkgZGl2aWRlIC03NDYuMjkzMzg2IDkyNzc0OS42NDcgLT4gLTAuMDAwODA0NDEyNDcxIEluZXhhY3QgUm91bmRlZAoreGR2aTA1OSBkaXZpZGVpbnQgLTc0Ni4yOTMzODYgOTI3NzQ5LjY0NyAtPiAtMAoreG11bDA1OSBtdWx0aXBseSAtNzQ2LjI5MzM4NiA5Mjc3NDkuNjQ3IC0+IC02OTIzNzM0MjUgSW5leGFjdCBSb3VuZGVkCit4cG93MDU5IHBvd2VyIC03NDYuMjkzMzg2IDkyNzc1MCAtPiA3LjQ5Mjc4NzQxRSsyNjY1MzQxIEluZXhhY3QgUm91bmRlZAoreHJlbTA1OSByZW1haW5kZXIgLTc0Ni4yOTMzODYgOTI3NzQ5LjY0NyAtPiAtNzQ2LjI5MzM4NgoreHN1YjA1OSBzdWJ0cmFjdCAtNzQ2LjI5MzM4NiA5Mjc3NDkuNjQ3IC0+IC05Mjg0OTUuOTQwIEluZXhhY3QgUm91bmRlZAoreGFkZDA2MCBhZGQgODg4OTQ2NDcxRSsyNDEzMzE1OTIgLTIzNTczOS41OTUgLT4gOC44ODk0NjQ3MUUrMjQxMzMxNjAwIEluZXhhY3QgUm91bmRlZAoreGNvbTA2MCBjb21wYXJlIDg4ODk0NjQ3MUUrMjQxMzMxNTkyIC0yMzU3MzkuNTk1IC0+IDEKK3hkaXYwNjAgZGl2aWRlIDg4ODk0NjQ3MUUrMjQxMzMxNTkyIC0yMzU3MzkuNTk1IC0+IC0zLjc3MDg4MzE3RSsyNDEzMzE1OTUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDYwIGRpdmlkZWludCA4ODg5NDY0NzFFKzI0MTMzMTU5MiAtMjM1NzM5LjU5NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA2MCBtdWx0aXBseSA4ODg5NDY0NzFFKzI0MTMzMTU5MiAtMjM1NzM5LjU5NSAtPiAtMi4wOTU1OTg4MUUrMjQxMzMxNjA2IEluZXhhY3QgUm91bmRlZAoreHBvdzA2MCBwb3dlciA4ODg5NDY0NzFFKzI0MTMzMTU5MiAtMjM1NzQwIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTA2MCByZW1haW5kZXIgODg4OTQ2NDcxRSsyNDEzMzE1OTIgLTIzNTczOS41OTUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwNjAgc3VidHJhY3QgODg4OTQ2NDcxRSsyNDEzMzE1OTIgLTIzNTczOS41OTUgLT4gOC44ODk0NjQ3MUUrMjQxMzMxNjAwIEluZXhhY3QgUm91bmRlZAoreGFkZDA2MSBhZGQgNi42NDM3NzI0OSA3OTE2MS4xMDcwRSs2MTk0NTM3NzYgLT4gNy45MTYxMTA3MEUrNjE5NDUzNzgwIEluZXhhY3QgUm91bmRlZAoreGNvbTA2MSBjb21wYXJlIDYuNjQzNzcyNDkgNzkxNjEuMTA3MEUrNjE5NDUzNzc2IC0+IC0xCit4ZGl2MDYxIGRpdmlkZSA2LjY0Mzc3MjQ5IDc5MTYxLjEwNzBFKzYxOTQ1Mzc3NiAtPiA4LjM5MjcyMzA3RS02MTk0NTM3ODEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDYxIGRpdmlkZWludCA2LjY0Mzc3MjQ5IDc5MTYxLjEwNzBFKzYxOTQ1Mzc3NiAtPiAwCit4bXVsMDYxIG11bHRpcGx5IDYuNjQzNzcyNDkgNzkxNjEuMTA3MEUrNjE5NDUzNzc2IC0+IDUuMjU5MjgzODVFKzYxOTQ1Mzc4MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNjEgcG93ZXIgNi42NDM3NzI0OSA4IC0+IDM3OTU5MjguNDQgSW5leGFjdCBSb3VuZGVkCit4cmVtMDYxIHJlbWFpbmRlciA2LjY0Mzc3MjQ5IDc5MTYxLjEwNzBFKzYxOTQ1Mzc3NiAtPiA2LjY0Mzc3MjQ5Cit4c3ViMDYxIHN1YnRyYWN0IDYuNjQzNzcyNDkgNzkxNjEuMTA3MEUrNjE5NDUzNzc2IC0+IC03LjkxNjExMDcwRSs2MTk0NTM3ODAgSW5leGFjdCBSb3VuZGVkCit4YWRkMDYyIGFkZCAzMTQ2LjY2NTcxRS0zMTMzNzMzNjYgODguNTI4MjAxMCAtPiA4OC41MjgyMDEwIEluZXhhY3QgUm91bmRlZAoreGNvbTA2MiBjb21wYXJlIDMxNDYuNjY1NzFFLTMxMzM3MzM2NiA4OC41MjgyMDEwIC0+IC0xCit4ZGl2MDYyIGRpdmlkZSAzMTQ2LjY2NTcxRS0zMTMzNzMzNjYgODguNTI4MjAxMCAtPiAzLjU1NDQyMTg0RS0zMTMzNzMzNjUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDYyIGRpdmlkZWludCAzMTQ2LjY2NTcxRS0zMTMzNzMzNjYgODguNTI4MjAxMCAtPiAwCit4bXVsMDYyIG11bHRpcGx5IDMxNDYuNjY1NzFFLTMxMzM3MzM2NiA4OC41MjgyMDEwIC0+IDIuNzg1Njg2NTRFLTMxMzM3MzM2MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNjIgcG93ZXIgMzE0Ni42NjU3MUUtMzEzMzczMzY2IDg5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTA2MiByZW1haW5kZXIgMzE0Ni42NjU3MUUtMzEzMzczMzY2IDg4LjUyODIwMTAgLT4gMy4xNDY2NjU3MUUtMzEzMzczMzYzCit4c3ViMDYyIHN1YnRyYWN0IDMxNDYuNjY1NzFFLTMxMzM3MzM2NiA4OC41MjgyMDEwIC0+IC04OC41MjgyMDEwIEluZXhhY3QgUm91bmRlZAoreGFkZDA2MyBhZGQgNi40NDY5MzA5NyAtODcxOTUuODcxMSAtPiAtODcxODkuNDI0MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNjMgY29tcGFyZSA2LjQ0NjkzMDk3IC04NzE5NS44NzExIC0+IDEKK3hkaXYwNjMgZGl2aWRlIDYuNDQ2OTMwOTcgLTg3MTk1Ljg3MTEgLT4gLTAuMDAwMDczOTM2MTk1NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNjMgZGl2aWRlaW50IDYuNDQ2OTMwOTcgLTg3MTk1Ljg3MTEgLT4gLTAKK3htdWwwNjMgbXVsdGlwbHkgNi40NDY5MzA5NyAtODcxOTUuODcxMSAtPiAtNTYyMTQ1Ljc2MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNjMgcG93ZXIgNi40NDY5MzA5NyAtODcxOTYgLT4gNC41MDg4MTczMEUtNzA1NzMgSW5leGFjdCBSb3VuZGVkCit4cmVtMDYzIHJlbWFpbmRlciA2LjQ0NjkzMDk3IC04NzE5NS44NzExIC0+IDYuNDQ2OTMwOTcKK3hzdWIwNjMgc3VidHJhY3QgNi40NDY5MzA5NyAtODcxOTUuODcxMSAtPiA4NzIwMi4zMTgwIEluZXhhY3QgUm91bmRlZAoreGFkZDA2NCBhZGQgLTIxMTMxMzIuNTZFKzU3Nzk1Nzg0MCA5ODExMjU4MjEgLT4gLTIuMTEzMTMyNTZFKzU3Nzk1Nzg0NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNjQgY29tcGFyZSAtMjExMzEzMi41NkUrNTc3OTU3ODQwIDk4MTEyNTgyMSAtPiAtMQoreGRpdjA2NCBkaXZpZGUgLTIxMTMxMzIuNTZFKzU3Nzk1Nzg0MCA5ODExMjU4MjEgLT4gLTIuMTUzNzgzNDVFKzU3Nzk1NzgzNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNjQgZGl2aWRlaW50IC0yMTEzMTMyLjU2RSs1Nzc5NTc4NDAgOTgxMTI1ODIxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDY0IG11bHRpcGx5IC0yMTEzMTMyLjU2RSs1Nzc5NTc4NDAgOTgxMTI1ODIxIC0+IC0yLjA3MzI0ODkyRSs1Nzc5NTc4NTUgSW5leGFjdCBSb3VuZGVkCit4cG93MDY0IHBvd2VyIC0yMTEzMTMyLjU2RSs1Nzc5NTc4NDAgOTgxMTI1ODIxIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNjQgcmVtYWluZGVyIC0yMTEzMTMyLjU2RSs1Nzc5NTc4NDAgOTgxMTI1ODIxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDY0IHN1YnRyYWN0IC0yMTEzMTMyLjU2RSs1Nzc5NTc4NDAgOTgxMTI1ODIxIC0+IC0yLjExMzEzMjU2RSs1Nzc5NTc4NDYgSW5leGFjdCBSb3VuZGVkCit4YWRkMDY1IGFkZCAtNzcwMS40MjgxNCA3MjY2Ny41MTgxIC0+IDY0OTY2LjA5MDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDY1IGNvbXBhcmUgLTc3MDEuNDI4MTQgNzI2NjcuNTE4MSAtPiAtMQoreGRpdjA2NSBkaXZpZGUgLTc3MDEuNDI4MTQgNzI2NjcuNTE4MSAtPiAtMC4xMDU5ODE3MTQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDY1IGRpdmlkZWludCAtNzcwMS40MjgxNCA3MjY2Ny41MTgxIC0+IC0wCit4bXVsMDY1IG11bHRpcGx5IC03NzAxLjQyODE0IDcyNjY3LjUxODEgLT4gLTU1OTY0MzY2OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNjUgcG93ZXIgLTc3MDEuNDI4MTQgNzI2NjggLT4gMi4yOTU0MzgzN0UrMjgyNDI5IEluZXhhY3QgUm91bmRlZAoreHJlbTA2NSByZW1haW5kZXIgLTc3MDEuNDI4MTQgNzI2NjcuNTE4MSAtPiAtNzcwMS40MjgxNAoreHN1YjA2NSBzdWJ0cmFjdCAtNzcwMS40MjgxNCA3MjY2Ny41MTgxIC0+IC04MDM2OC45NDYyIEluZXhhY3QgUm91bmRlZAoreGFkZDA2NiBhZGQgLTg1MS43NTQ3ODkgLTU4MjY1OS4xNDkgLT4gLTU4MzUxMC45MDQgSW5leGFjdCBSb3VuZGVkCit4Y29tMDY2IGNvbXBhcmUgLTg1MS43NTQ3ODkgLTU4MjY1OS4xNDkgLT4gMQoreGRpdjA2NiBkaXZpZGUgLTg1MS43NTQ3ODkgLTU4MjY1OS4xNDkgLT4gMC4wMDE0NjE4NDA1OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNjYgZGl2aWRlaW50IC04NTEuNzU0Nzg5IC01ODI2NTkuMTQ5IC0+IDAKK3htdWwwNjYgbXVsdGlwbHkgLTg1MS43NTQ3ODkgLTU4MjY1OS4xNDkgLT4gNDk2MjgyNzIxIEluZXhhY3QgUm91bmRlZAoreHBvdzA2NiBwb3dlciAtODUxLjc1NDc4OSAtNTgyNjU5IC0+IC02LjgzNTMyNTkzRS0xNzA3Mzc1IEluZXhhY3QgUm91bmRlZAoreHJlbTA2NiByZW1haW5kZXIgLTg1MS43NTQ3ODkgLTU4MjY1OS4xNDkgLT4gLTg1MS43NTQ3ODkKK3hzdWIwNjYgc3VidHJhY3QgLTg1MS43NTQ3ODkgLTU4MjY1OS4xNDkgLT4gNTgxODA3LjM5NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNjcgYWRkIC01LjAxOTkyOTQzIDc4NTIuMTY1MzEgLT4gNzg0Ny4xNDUzOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNjcgY29tcGFyZSAtNS4wMTk5Mjk0MyA3ODUyLjE2NTMxIC0+IC0xCit4ZGl2MDY3IGRpdmlkZSAtNS4wMTk5Mjk0MyA3ODUyLjE2NTMxIC0+IC0wLjAwMDYzOTMwNTExMyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNjcgZGl2aWRlaW50IC01LjAxOTkyOTQzIDc4NTIuMTY1MzEgLT4gLTAKK3htdWwwNjcgbXVsdGlwbHkgLTUuMDE5OTI5NDMgNzg1Mi4xNjUzMSAtPiAtMzk0MTcuMzE1NyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNjcgcG93ZXIgLTUuMDE5OTI5NDMgNzg1MiAtPiA3LjU0NDgxNDQ4RSs1NTAxIEluZXhhY3QgUm91bmRlZAoreHJlbTA2NyByZW1haW5kZXIgLTUuMDE5OTI5NDMgNzg1Mi4xNjUzMSAtPiAtNS4wMTk5Mjk0MworeHN1YjA2NyBzdWJ0cmFjdCAtNS4wMTk5Mjk0MyA3ODUyLjE2NTMxIC0+IC03ODU3LjE4NTI0IEluZXhhY3QgUm91bmRlZAoreGFkZDA2OCBhZGQgLTEyMzkzMjU3LjIgNzY4MDM2ODlFKzk0OTEyNTc3MCAtPiA3LjY4MDM2ODkwRSs5NDkxMjU3NzcgSW5leGFjdCBSb3VuZGVkCit4Y29tMDY4IGNvbXBhcmUgLTEyMzkzMjU3LjIgNzY4MDM2ODlFKzk0OTEyNTc3MCAtPiAtMQoreGRpdjA2OCBkaXZpZGUgLTEyMzkzMjU3LjIgNzY4MDM2ODlFKzk0OTEyNTc3MCAtPiAtMS42MTM2Mjc4NkUtOTQ5MTI1NzcxIEluZXhhY3QgUm91bmRlZAoreGR2aTA2OCBkaXZpZGVpbnQgLTEyMzkzMjU3LjIgNzY4MDM2ODlFKzk0OTEyNTc3MCAtPiAtMAoreG11bDA2OCBtdWx0aXBseSAtMTIzOTMyNTcuMiA3NjgwMzY4OUUrOTQ5MTI1NzcwIC0+IC05LjUxODQ3ODcyRSs5NDkxMjU3ODQgSW5leGFjdCBSb3VuZGVkCit4cG93MDY4IHBvd2VyIC0xMjM5MzI1Ny4yIDggLT4gNS41NjUyMzc0OUUrNTYgSW5leGFjdCBSb3VuZGVkCit4cmVtMDY4IHJlbWFpbmRlciAtMTIzOTMyNTcuMiA3NjgwMzY4OUUrOTQ5MTI1NzcwIC0+IC0xMjM5MzI1Ny4yCit4c3ViMDY4IHN1YnRyYWN0IC0xMjM5MzI1Ny4yIDc2ODAzNjg5RSs5NDkxMjU3NzAgLT4gLTcuNjgwMzY4OTBFKzk0OTEyNTc3NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNjkgYWRkIC03NTQ3NzE2MzQuRSs3MTY1NTUwMjYgLTI5MjMzNi4zMTEgLT4gLTcuNTQ3NzE2MzRFKzcxNjU1NTAzNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNjkgY29tcGFyZSAtNzU0NzcxNjM0LkUrNzE2NTU1MDI2IC0yOTIzMzYuMzExIC0+IC0xCit4ZGl2MDY5IGRpdmlkZSAtNzU0NzcxNjM0LkUrNzE2NTU1MDI2IC0yOTIzMzYuMzExIC0+IDIuNTgxODYwNzBFKzcxNjU1NTAyOSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNjkgZGl2aWRlaW50IC03NTQ3NzE2MzQuRSs3MTY1NTUwMjYgLTI5MjMzNi4zMTEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwNjkgbXVsdGlwbHkgLTc1NDc3MTYzNC5FKzcxNjU1NTAyNiAtMjkyMzM2LjMxMSAtPiAyLjIwNjQ3MTU1RSs3MTY1NTUwNDAgSW5leGFjdCBSb3VuZGVkCit4cG93MDY5IHBvd2VyIC03NTQ3NzE2MzQuRSs3MTY1NTUwMjYgLTI5MjMzNiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wNjkgcmVtYWluZGVyIC03NTQ3NzE2MzQuRSs3MTY1NTUwMjYgLTI5MjMzNi4zMTEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwNjkgc3VidHJhY3QgLTc1NDc3MTYzNC5FKzcxNjU1NTAyNiAtMjkyMzM2LjMxMSAtPiAtNy41NDc3MTYzNEUrNzE2NTU1MDM0IEluZXhhY3QgUm91bmRlZAoreGFkZDA3MCBhZGQgLTkxNTAwNi4xNzFFKzYxNDU0ODY1MiAtMzE0MDg2OTY1LiAtPiAtOS4xNTAwNjE3MUUrNjE0NTQ4NjU3IEluZXhhY3QgUm91bmRlZAoreGNvbTA3MCBjb21wYXJlIC05MTUwMDYuMTcxRSs2MTQ1NDg2NTIgLTMxNDA4Njk2NS4gLT4gLTEKK3hkaXYwNzAgZGl2aWRlIC05MTUwMDYuMTcxRSs2MTQ1NDg2NTIgLTMxNDA4Njk2NS4gLT4gMi45MTMyMjU1NUUrNjE0NTQ4NjQ5IEluZXhhY3QgUm91bmRlZAoreGR2aTA3MCBkaXZpZGVpbnQgLTkxNTAwNi4xNzFFKzYxNDU0ODY1MiAtMzE0MDg2OTY1LiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA3MCBtdWx0aXBseSAtOTE1MDA2LjE3MUUrNjE0NTQ4NjUyIC0zMTQwODY5NjUuIC0+IDIuODczOTE1MTFFKzYxNDU0ODY2NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNzAgcG93ZXIgLTkxNTAwNi4xNzFFKzYxNDU0ODY1MiAtMzE0MDg2OTY1IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wNzAgcmVtYWluZGVyIC05MTUwMDYuMTcxRSs2MTQ1NDg2NTIgLTMxNDA4Njk2NS4gLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwNzAgc3VidHJhY3QgLTkxNTAwNi4xNzFFKzYxNDU0ODY1MiAtMzE0MDg2OTY1LiAtPiAtOS4xNTAwNjE3MUUrNjE0NTQ4NjU3IEluZXhhY3QgUm91bmRlZAoreGFkZDA3MSBhZGQgLTI5NjU5MDAzNSAtNDgxNzM0NTI5IC0+IC03NzgzMjQ1NjQKK3hjb20wNzEgY29tcGFyZSAtMjk2NTkwMDM1IC00ODE3MzQ1MjkgLT4gMQoreGRpdjA3MSBkaXZpZGUgLTI5NjU5MDAzNSAtNDgxNzM0NTI5IC0+IDAuNjE1NjcxMTE2IEluZXhhY3QgUm91bmRlZAoreGR2aTA3MSBkaXZpZGVpbnQgLTI5NjU5MDAzNSAtNDgxNzM0NTI5IC0+IDAKK3htdWwwNzEgbXVsdGlwbHkgLTI5NjU5MDAzNSAtNDgxNzM0NTI5IC0+IDEuNDI4Nzc2NjFFKzE3IEluZXhhY3QgUm91bmRlZAoreHBvdzA3MSBwb3dlciAtMjk2NTkwMDM1IC00ODE3MzQ1MjkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTA3MSByZW1haW5kZXIgLTI5NjU5MDAzNSAtNDgxNzM0NTI5IC0+IC0yOTY1OTAwMzUKK3hzdWIwNzEgc3VidHJhY3QgLTI5NjU5MDAzNSAtNDgxNzM0NTI5IC0+IDE4NTE0NDQ5NAoreGFkZDA3MiBhZGQgOC4yNzgyMjYwNSA5MjQxNTU3LjE5IC0+IDkyNDE1NjUuNDcgSW5leGFjdCBSb3VuZGVkCit4Y29tMDcyIGNvbXBhcmUgOC4yNzgyMjYwNSA5MjQxNTU3LjE5IC0+IC0xCit4ZGl2MDcyIGRpdmlkZSA4LjI3ODIyNjA1IDkyNDE1NTcuMTkgLT4gOC45NTc2MDk1MEUtNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNzIgZGl2aWRlaW50IDguMjc4MjI2MDUgOTI0MTU1Ny4xOSAtPiAwCit4bXVsMDcyIG11bHRpcGx5IDguMjc4MjI2MDUgOTI0MTU1Ny4xOSAtPiA3NjUwMzY5OS41IEluZXhhY3QgUm91bmRlZAoreHBvdzA3MiBwb3dlciA4LjI3ODIyNjA1IDkyNDE1NTcgLT4gNS4xMDIxOTk2OUUrODQ4MzE2OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNzIgcmVtYWluZGVyIDguMjc4MjI2MDUgOTI0MTU1Ny4xOSAtPiA4LjI3ODIyNjA1Cit4c3ViMDcyIHN1YnRyYWN0IDguMjc4MjI2MDUgOTI0MTU1Ny4xOSAtPiAtOTI0MTU0OC45MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNzMgYWRkIC0xLjQzNTgxMDk4IDcyODYzMTMuNTQgLT4gNzI4NjMxMi4xMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNzMgY29tcGFyZSAtMS40MzU4MTA5OCA3Mjg2MzEzLjU0IC0+IC0xCit4ZGl2MDczIGRpdmlkZSAtMS40MzU4MTA5OCA3Mjg2MzEzLjU0IC0+IC0xLjk3MDU1ODg3RS03IEluZXhhY3QgUm91bmRlZAoreGR2aTA3MyBkaXZpZGVpbnQgLTEuNDM1ODEwOTggNzI4NjMxMy41NCAtPiAtMAoreG11bDA3MyBtdWx0aXBseSAtMS40MzU4MTA5OCA3Mjg2MzEzLjU0IC0+IC0xMDQ2MTc2OS4wIEluZXhhY3QgUm91bmRlZAoreHBvdzA3MyBwb3dlciAtMS40MzU4MTA5OCA3Mjg2MzE0IC0+IDEuMDkzODk3NDFFKzExNDQ2NjAgSW5leGFjdCBSb3VuZGVkCit4cmVtMDczIHJlbWFpbmRlciAtMS40MzU4MTA5OCA3Mjg2MzEzLjU0IC0+IC0xLjQzNTgxMDk4Cit4c3ViMDczIHN1YnRyYWN0IC0xLjQzNTgxMDk4IDcyODYzMTMuNTQgLT4gLTcyODYzMTQuOTggSW5leGFjdCBSb3VuZGVkCit4YWRkMDc0IGFkZCAtNjk5MDM2MTkzLiA3NTkyNjMuNTA5RSs1MzM1NDM2MjUgLT4gNy41OTI2MzUwOUUrNTMzNTQzNjMwIEluZXhhY3QgUm91bmRlZAoreGNvbTA3NCBjb21wYXJlIC02OTkwMzYxOTMuIDc1OTI2My41MDlFKzUzMzU0MzYyNSAtPiAtMQoreGRpdjA3NCBkaXZpZGUgLTY5OTAzNjE5My4gNzU5MjYzLjUwOUUrNTMzNTQzNjI1IC0+IC05LjIwNjc2NjYyRS01MzM1NDM2MjMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDc0IGRpdmlkZWludCAtNjk5MDM2MTkzLiA3NTkyNjMuNTA5RSs1MzM1NDM2MjUgLT4gLTAKK3htdWwwNzQgbXVsdGlwbHkgLTY5OTAzNjE5My4gNzU5MjYzLjUwOUUrNTMzNTQzNjI1IC0+IC01LjMwNzUyNjczRSs1MzM1NDM2MzkgSW5leGFjdCBSb3VuZGVkCit4cG93MDc0IHBvd2VyIC02OTkwMzYxOTMuIDggLT4gNS43MDE2MDcyNEUrNzAgSW5leGFjdCBSb3VuZGVkCit4cmVtMDc0IHJlbWFpbmRlciAtNjk5MDM2MTkzLiA3NTkyNjMuNTA5RSs1MzM1NDM2MjUgLT4gLTY5OTAzNjE5MworeHN1YjA3NCBzdWJ0cmFjdCAtNjk5MDM2MTkzLiA3NTkyNjMuNTA5RSs1MzM1NDM2MjUgLT4gLTcuNTkyNjM1MDlFKzUzMzU0MzYzMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNzUgYWRkIC04My43MjczNjE1RS0zMDUyODE5NTcgLTI4Nzc3OTU5My5FKzQ1ODc3Nzc3NCAtPiAtMi44Nzc3OTU5M0UrNDU4Nzc3NzgyIEluZXhhY3QgUm91bmRlZAoreGNvbTA3NSBjb21wYXJlIC04My43MjczNjE1RS0zMDUyODE5NTcgLTI4Nzc3OTU5My5FKzQ1ODc3Nzc3NCAtPiAxCit4ZGl2MDc1IGRpdmlkZSAtODMuNzI3MzYxNUUtMzA1MjgxOTU3IC0yODc3Nzk1OTMuRSs0NTg3Nzc3NzQgLT4gMi45MDk0MjY2NEUtNzY0MDU5NzM4IEluZXhhY3QgUm91bmRlZAoreGR2aTA3NSBkaXZpZGVpbnQgLTgzLjcyNzM2MTVFLTMwNTI4MTk1NyAtMjg3Nzc5NTkzLkUrNDU4Nzc3Nzc0IC0+IDAKK3htdWwwNzUgbXVsdGlwbHkgLTgzLjcyNzM2MTVFLTMwNTI4MTk1NyAtMjg3Nzc5NTkzLkUrNDU4Nzc3Nzc0IC0+IDIuNDA5NTAyNjBFKzE1MzQ5NTgyNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNzUgcG93ZXIgLTgzLjcyNzM2MTVFLTMwNTI4MTk1NyAtMyAtPiAtMS43MDM3MTgyOEUrOTE1ODQ1ODY1IEluZXhhY3QgUm91bmRlZAoreHJlbTA3NSByZW1haW5kZXIgLTgzLjcyNzM2MTVFLTMwNTI4MTk1NyAtMjg3Nzc5NTkzLkUrNDU4Nzc3Nzc0IC0+IC04LjM3MjczNjE1RS0zMDUyODE5NTYKK3hzdWIwNzUgc3VidHJhY3QgLTgzLjcyNzM2MTVFLTMwNTI4MTk1NyAtMjg3Nzc5NTkzLkUrNDU4Nzc3Nzc0IC0+IDIuODc3Nzk1OTNFKzQ1ODc3Nzc4MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNzYgYWRkIDguNDg1MDMyMjQgNjUyMi4wMzMxNiAtPiA2NTMwLjUxODE5IEluZXhhY3QgUm91bmRlZAoreGNvbTA3NiBjb21wYXJlIDguNDg1MDMyMjQgNjUyMi4wMzMxNiAtPiAtMQoreGRpdjA3NiBkaXZpZGUgOC40ODUwMzIyNCA2NTIyLjAzMzE2IC0+IDAuMDAxMzAwOTc5NjIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDc2IGRpdmlkZWludCA4LjQ4NTAzMjI0IDY1MjIuMDMzMTYgLT4gMAoreG11bDA3NiBtdWx0aXBseSA4LjQ4NTAzMjI0IDY1MjIuMDMzMTYgLT4gNTUzMzkuNjYxNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNzYgcG93ZXIgOC40ODUwMzIyNCA2NTIyIC0+IDQuNzY1NDc1NDJFKzYwNTYgSW5leGFjdCBSb3VuZGVkCit4cmVtMDc2IHJlbWFpbmRlciA4LjQ4NTAzMjI0IDY1MjIuMDMzMTYgLT4gOC40ODUwMzIyNAoreHN1YjA3NiBzdWJ0cmFjdCA4LjQ4NTAzMjI0IDY1MjIuMDMzMTYgLT4gLTY1MTMuNTQ4MTMgSW5leGFjdCBSb3VuZGVkCit4YWRkMDc3IGFkZCA1Mjc5MTYwOTEgLTgwOS4wNTQwNzAgLT4gNTI3OTE1MjgyIEluZXhhY3QgUm91bmRlZAoreGNvbTA3NyBjb21wYXJlIDUyNzkxNjA5MSAtODA5LjA1NDA3MCAtPiAxCit4ZGl2MDc3IGRpdmlkZSA1Mjc5MTYwOTEgLTgwOS4wNTQwNzAgLT4gLTY1MjUxMC4yNzIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDc3IGRpdmlkZWludCA1Mjc5MTYwOTEgLTgwOS4wNTQwNzAgLT4gLTY1MjUxMAoreG11bDA3NyBtdWx0aXBseSA1Mjc5MTYwOTEgLTgwOS4wNTQwNzAgLT4gLTQuMjcxMTI2NjJFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzA3NyBwb3dlciA1Mjc5MTYwOTEgLTgwOSAtPiAyLjc4NjA5Njk3RS03MDU3IEluZXhhY3QgUm91bmRlZAoreHJlbTA3NyByZW1haW5kZXIgNTI3OTE2MDkxIC04MDkuMDU0MDcwIC0+IDIxOS43ODQzMDAKK3hzdWIwNzcgc3VidHJhY3QgNTI3OTE2MDkxIC04MDkuMDU0MDcwIC0+IDUyNzkxNjkwMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNzggYWRkIDM4NTcwNTguNjAgNTc5Mjk5Ny41OEUrODgxMDc3NDA5IC0+IDUuNzkyOTk3NThFKzg4MTA3NzQxNSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNzggY29tcGFyZSAzODU3MDU4LjYwIDU3OTI5OTcuNThFKzg4MTA3NzQwOSAtPiAtMQoreGRpdjA3OCBkaXZpZGUgMzg1NzA1OC42MCA1NzkyOTk3LjU4RSs4ODEwNzc0MDkgLT4gNi42NTgxMzk1MEUtODgxMDc3NDEwIEluZXhhY3QgUm91bmRlZAoreGR2aTA3OCBkaXZpZGVpbnQgMzg1NzA1OC42MCA1NzkyOTk3LjU4RSs4ODEwNzc0MDkgLT4gMAoreG11bDA3OCBtdWx0aXBseSAzODU3MDU4LjYwIDU3OTI5OTcuNThFKzg4MTA3NzQwOSAtPiAyLjIzNDM5MzExRSs4ODEwNzc0MjIgSW5leGFjdCBSb3VuZGVkCit4cG93MDc4IHBvd2VyIDM4NTcwNTguNjAgNiAtPiAzLjI5MjU4ODI0RSszOSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNzggcmVtYWluZGVyIDM4NTcwNTguNjAgNTc5Mjk5Ny41OEUrODgxMDc3NDA5IC0+IDM4NTcwNTguNjAKK3hzdWIwNzggc3VidHJhY3QgMzg1NzA1OC42MCA1NzkyOTk3LjU4RSs4ODEwNzc0MDkgLT4gLTUuNzkyOTk3NThFKzg4MTA3NzQxNSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNzkgYWRkIC02NjU4NzM2My5FKzU1NjUzODE3MyAtNTUxOTAyNDAyRSszNTczMDkxNDYgLT4gLTYuNjU4NzM2MzBFKzU1NjUzODE4MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNzkgY29tcGFyZSAtNjY1ODczNjMuRSs1NTY1MzgxNzMgLTU1MTkwMjQwMkUrMzU3MzA5MTQ2IC0+IC0xCit4ZGl2MDc5IGRpdmlkZSAtNjY1ODczNjMuRSs1NTY1MzgxNzMgLTU1MTkwMjQwMkUrMzU3MzA5MTQ2IC0+IDEuMjA2NTA2MTNFKzE5OTIyOTAyNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNzkgZGl2aWRlaW50IC02NjU4NzM2My5FKzU1NjUzODE3MyAtNTUxOTAyNDAyRSszNTczMDkxNDYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwNzkgbXVsdGlwbHkgLTY2NTg3MzYzLkUrNTU2NTM4MTczIC01NTE5MDI0MDJFKzM1NzMwOTE0NiAtPiAzLjY3NDk3MjU2RSs5MTM4NDczMzUgSW5leGFjdCBSb3VuZGVkCit4cG93MDc5IHBvd2VyIC02NjU4NzM2My5FKzU1NjUzODE3MyAtNiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wNzkgcmVtYWluZGVyIC02NjU4NzM2My5FKzU1NjUzODE3MyAtNTUxOTAyNDAyRSszNTczMDkxNDYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwNzkgc3VidHJhY3QgLTY2NTg3MzYzLkUrNTU2NTM4MTczIC01NTE5MDI0MDJFKzM1NzMwOTE0NiAtPiAtNi42NTg3MzYzMEUrNTU2NTM4MTgwIEluZXhhY3QgUm91bmRlZAoreGFkZDA4MCBhZGQgLTU4MC41MDI5NTUgMzgxMjU1MjEuNyAtPiAzODEyNDk0MS4yIEluZXhhY3QgUm91bmRlZAoreGNvbTA4MCBjb21wYXJlIC01ODAuNTAyOTU1IDM4MTI1NTIxLjcgLT4gLTEKK3hkaXYwODAgZGl2aWRlIC01ODAuNTAyOTU1IDM4MTI1NTIxLjcgLT4gLTAuMDAwMDE1MjI2MDk4NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwODAgZGl2aWRlaW50IC01ODAuNTAyOTU1IDM4MTI1NTIxLjcgLT4gLTAKK3htdWwwODAgbXVsdGlwbHkgLTU4MC41MDI5NTUgMzgxMjU1MjEuNyAtPiAtMi4yMTMxOTc4MEUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MDgwIHBvd2VyIC01ODAuNTAyOTU1IDM4MTI1NTIyIC0+IDYuMDcyNjIwNzhFKzEwNTM3MTQ4NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wODAgcmVtYWluZGVyIC01ODAuNTAyOTU1IDM4MTI1NTIxLjcgLT4gLTU4MC41MDI5NTUKK3hzdWIwODAgc3VidHJhY3QgLTU4MC41MDI5NTUgMzgxMjU1MjEuNyAtPiAtMzgxMjYxMDIuMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwODEgYWRkIC05NjI3MzYzLjAwIC04MDYxNjg4NUUtNzQ5ODkxMzk0IC0+IC05NjI3MzYzLjAwIEluZXhhY3QgUm91bmRlZAoreGNvbTA4MSBjb21wYXJlIC05NjI3MzYzLjAwIC04MDYxNjg4NUUtNzQ5ODkxMzk0IC0+IC0xCit4ZGl2MDgxIGRpdmlkZSAtOTYyNzM2My4wMCAtODA2MTY4ODVFLTc0OTg5MTM5NCAtPiAxLjE5NDIxMTczRSs3NDk4OTEzOTMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDgxIGRpdmlkZWludCAtOTYyNzM2My4wMCAtODA2MTY4ODVFLTc0OTg5MTM5NCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA4MSBtdWx0aXBseSAtOTYyNzM2My4wMCAtODA2MTY4ODVFLTc0OTg5MTM5NCAtPiA3Ljc2MTI4MDE2RS03NDk4OTEzODAgSW5leGFjdCBSb3VuZGVkCit4cG93MDgxIHBvd2VyIC05NjI3MzYzLjAwIC04IC0+IDEuMzU1MDA2MDFFLTU2IEluZXhhY3QgUm91bmRlZAoreHJlbTA4MSByZW1haW5kZXIgLTk2MjczNjMuMDAgLTgwNjE2ODg1RS03NDk4OTEzOTQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwODEgc3VidHJhY3QgLTk2MjczNjMuMDAgLTgwNjE2ODg1RS03NDk4OTEzOTQgLT4gLTk2MjczNjMuMDAgSW5leGFjdCBSb3VuZGVkCit4YWRkMDgyIGFkZCAtNTI2LjU5NDg1NUUrODAzMTEwMTA3IC02NC41NDUxNjM5IC0+IC01LjI2NTk0ODU1RSs4MDMxMTAxMDkgSW5leGFjdCBSb3VuZGVkCit4Y29tMDgyIGNvbXBhcmUgLTUyNi41OTQ4NTVFKzgwMzExMDEwNyAtNjQuNTQ1MTYzOSAtPiAtMQoreGRpdjA4MiBkaXZpZGUgLTUyNi41OTQ4NTVFKzgwMzExMDEwNyAtNjQuNTQ1MTYzOSAtPiA4LjE1ODU0ODU4RSs4MDMxMTAxMDcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDgyIGRpdmlkZWludCAtNTI2LjU5NDg1NUUrODAzMTEwMTA3IC02NC41NDUxNjM5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDgyIG11bHRpcGx5IC01MjYuNTk0ODU1RSs4MDMxMTAxMDcgLTY0LjU0NTE2MzkgLT4gMy4zOTg5MTUxMkUrODAzMTEwMTExIEluZXhhY3QgUm91bmRlZAoreHBvdzA4MiBwb3dlciAtNTI2LjU5NDg1NUUrODAzMTEwMTA3IC02NSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMDgyIHJlbWFpbmRlciAtNTI2LjU5NDg1NUUrODAzMTEwMTA3IC02NC41NDUxNjM5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDgyIHN1YnRyYWN0IC01MjYuNTk0ODU1RSs4MDMxMTAxMDcgLTY0LjU0NTE2MzkgLT4gLTUuMjY1OTQ4NTVFKzgwMzExMDEwOSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwODMgYWRkIC04Mzc4LjU1NDk5IDc2MC4xMzEyNTcgLT4gLTc2MTguNDIzNzMgSW5leGFjdCBSb3VuZGVkCit4Y29tMDgzIGNvbXBhcmUgLTgzNzguNTU0OTkgNzYwLjEzMTI1NyAtPiAtMQoreGRpdjA4MyBkaXZpZGUgLTgzNzguNTU0OTkgNzYwLjEzMTI1NyAtPiAtMTEuMDIyNTEwOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwODMgZGl2aWRlaW50IC04Mzc4LjU1NDk5IDc2MC4xMzEyNTcgLT4gLTExCit4bXVsMDgzIG11bHRpcGx5IC04Mzc4LjU1NDk5IDc2MC4xMzEyNTcgLT4gLTYzNjg4MDEuNTQgSW5leGFjdCBSb3VuZGVkCit4cG93MDgzIHBvd2VyIC04Mzc4LjU1NDk5IDc2MCAtPiA0LjA2MDA3OTI4RSsyOTgxIEluZXhhY3QgUm91bmRlZAoreHJlbTA4MyByZW1haW5kZXIgLTgzNzguNTU0OTkgNzYwLjEzMTI1NyAtPiAtMTcuMTExMTYzCit4c3ViMDgzIHN1YnRyYWN0IC04Mzc4LjU1NDk5IDc2MC4xMzEyNTcgLT4gLTkxMzguNjg2MjUgSW5leGFjdCBSb3VuZGVkCit4YWRkMDg0IGFkZCAtNzE3LjY5NzcxOCA5ODQzMDQ0MTMgLT4gOTg0MzAzNjk1IEluZXhhY3QgUm91bmRlZAoreGNvbTA4NCBjb21wYXJlIC03MTcuNjk3NzE4IDk4NDMwNDQxMyAtPiAtMQoreGRpdjA4NCBkaXZpZGUgLTcxNy42OTc3MTggOTg0MzA0NDEzIC0+IC03LjI5MTQyMDMwRS03IEluZXhhY3QgUm91bmRlZAoreGR2aTA4NCBkaXZpZGVpbnQgLTcxNy42OTc3MTggOTg0MzA0NDEzIC0+IC0wCit4bXVsMDg0IG11bHRpcGx5IC03MTcuNjk3NzE4IDk4NDMwNDQxMyAtPiAtNy4wNjQzMzAzMUUrMTEgSW5leGFjdCBSb3VuZGVkCit4cG93MDg0IHBvd2VyIC03MTcuNjk3NzE4IDk4NDMwNDQxMyAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDg0IHJlbWFpbmRlciAtNzE3LjY5NzcxOCA5ODQzMDQ0MTMgLT4gLTcxNy42OTc3MTgKK3hzdWIwODQgc3VidHJhY3QgLTcxNy42OTc3MTggOTg0MzA0NDEzIC0+IC05ODQzMDUxMzEgSW5leGFjdCBSb3VuZGVkCit4YWRkMDg1IGFkZCAtNzY3NjIyNDMuNEUtNzQxMTAwMDk0IC0yNzMuNzA2Njc0IC0+IC0yNzMuNzA2Njc0IEluZXhhY3QgUm91bmRlZAoreGNvbTA4NSBjb21wYXJlIC03Njc2MjI0My40RS03NDExMDAwOTQgLTI3My43MDY2NzQgLT4gMQoreGRpdjA4NSBkaXZpZGUgLTc2NzYyMjQzLjRFLTc0MTEwMDA5NCAtMjczLjcwNjY3NCAtPiAyLjgwNDU0NDA5RS03NDExMDAwODkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDg1IGRpdmlkZWludCAtNzY3NjIyNDMuNEUtNzQxMTAwMDk0IC0yNzMuNzA2Njc0IC0+IDAKK3htdWwwODUgbXVsdGlwbHkgLTc2NzYyMjQzLjRFLTc0MTEwMDA5NCAtMjczLjcwNjY3NCAtPiAyLjEwMTAzMzgzRS03NDExMDAwODQgSW5leGFjdCBSb3VuZGVkCit4cG93MDg1IHBvd2VyIC03Njc2MjI0My40RS03NDExMDAwOTQgLTI3NCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wODUgcmVtYWluZGVyIC03Njc2MjI0My40RS03NDExMDAwOTQgLTI3My43MDY2NzQgLT4gLTcuNjc2MjI0MzRFLTc0MTEwMDA4NworeHN1YjA4NSBzdWJ0cmFjdCAtNzY3NjIyNDMuNEUtNzQxMTAwMDk0IC0yNzMuNzA2Njc0IC0+IDI3My43MDY2NzQgSW5leGFjdCBSb3VuZGVkCit4YWRkMDg2IGFkZCAtNzAxLjUxODM1NEUrNzg2Mjc0OTE4IDg4MjI3NTAuNjhFKzI0MzA1MjEwNyAtPiAtNy4wMTUxODM1NEUrNzg2Mjc0OTIwIEluZXhhY3QgUm91bmRlZAoreGNvbTA4NiBjb21wYXJlIC03MDEuNTE4MzU0RSs3ODYyNzQ5MTggODgyMjc1MC42OEUrMjQzMDUyMTA3IC0+IC0xCit4ZGl2MDg2IGRpdmlkZSAtNzAxLjUxODM1NEUrNzg2Mjc0OTE4IDg4MjI3NTAuNjhFKzI0MzA1MjEwNyAtPiAtNy45NTEyNDMwOUUrNTQzMjIyODA2IEluZXhhY3QgUm91bmRlZAoreGR2aTA4NiBkaXZpZGVpbnQgLTcwMS41MTgzNTRFKzc4NjI3NDkxOCA4ODIyNzUwLjY4RSsyNDMwNTIxMDcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwODYgbXVsdGlwbHkgLTcwMS41MTgzNTRFKzc4NjI3NDkxOCA4ODIyNzUwLjY4RSsyNDMwNTIxMDcgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAoreHBvdzA4NiBwb3dlciAtNzAxLjUxODM1NEUrNzg2Mjc0OTE4IDkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTA4NiByZW1haW5kZXIgLTcwMS41MTgzNTRFKzc4NjI3NDkxOCA4ODIyNzUwLjY4RSsyNDMwNTIxMDcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwODYgc3VidHJhY3QgLTcwMS41MTgzNTRFKzc4NjI3NDkxOCA4ODIyNzUwLjY4RSsyNDMwNTIxMDcgLT4gLTcuMDE1MTgzNTRFKzc4NjI3NDkyMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwODcgYWRkIC0zNTk4NjY4NDUuIC00LjU3NDM0MTE3IC0+IC0zNTk4NjY4NTAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDg3IGNvbXBhcmUgLTM1OTg2Njg0NS4gLTQuNTc0MzQxMTcgLT4gLTEKK3hkaXYwODcgZGl2aWRlIC0zNTk4NjY4NDUuIC00LjU3NDM0MTE3IC0+IDc4NjcwNzQ4LjggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDg3IGRpdmlkZWludCAtMzU5ODY2ODQ1LiAtNC41NzQzNDExNyAtPiA3ODY3MDc0OAoreG11bDA4NyBtdWx0aXBseSAtMzU5ODY2ODQ1LiAtNC41NzQzNDExNyAtPiAxLjY0NjE1MzcyRSs5IEluZXhhY3QgUm91bmRlZAoreHBvdzA4NyBwb3dlciAtMzU5ODY2ODQ1LiAtNSAtPiAtMS42NTY4NzkwOUUtNDMgSW5leGFjdCBSb3VuZGVkCit4cmVtMDg3IHJlbWFpbmRlciAtMzU5ODY2ODQ1LiAtNC41NzQzNDExNyAtPiAtMy41NDg5MDQ4NAoreHN1YjA4NyBzdWJ0cmFjdCAtMzU5ODY2ODQ1LiAtNC41NzQzNDExNyAtPiAtMzU5ODY2ODQwIEluZXhhY3QgUm91bmRlZAoreGFkZDA4OCBhZGQgNzc5OTM0NTM2LiAtNzY1NjI2NDUuNyAtPiA3MDMzNzE4OTAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDg4IGNvbXBhcmUgNzc5OTM0NTM2LiAtNzY1NjI2NDUuNyAtPiAxCit4ZGl2MDg4IGRpdmlkZSA3Nzk5MzQ1MzYuIC03NjU2MjY0NS43IC0+IC0xMC4xODY4ODA3IEluZXhhY3QgUm91bmRlZAoreGR2aTA4OCBkaXZpZGVpbnQgNzc5OTM0NTM2LiAtNzY1NjI2NDUuNyAtPiAtMTAKK3htdWwwODggbXVsdGlwbHkgNzc5OTM0NTM2LiAtNzY1NjI2NDUuNyAtPiAtNS45NzEzODUxNUUrMTYgSW5leGFjdCBSb3VuZGVkCit4cG93MDg4IHBvd2VyIDc3OTkzNDUzNi4gLTc2NTYyNjQ2IC0+IDMuMzY3MzkwNjNFLTY4MDc5OTUwMSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wODggcmVtYWluZGVyIDc3OTkzNDUzNi4gLTc2NTYyNjQ1LjcgLT4gMTQzMDgwNzkuMAoreHN1YjA4OCBzdWJ0cmFjdCA3Nzk5MzQ1MzYuIC03NjU2MjY0NS43IC0+IDg1NjQ5NzE4MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwODkgYWRkIC00ODIwLjk1NDUxIDM1MTYyMzQuOTlFKzMwMzMwMzE3NiAtPiAzLjUxNjIzNDk5RSszMDMzMDMxODIgSW5leGFjdCBSb3VuZGVkCit4Y29tMDg5IGNvbXBhcmUgLTQ4MjAuOTU0NTEgMzUxNjIzNC45OUUrMzAzMzAzMTc2IC0+IC0xCit4ZGl2MDg5IGRpdmlkZSAtNDgyMC45NTQ1MSAzNTE2MjM0Ljk5RSszMDMzMDMxNzYgLT4gLTEuMzcxMDU1ODRFLTMwMzMwMzE3OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwODkgZGl2aWRlaW50IC00ODIwLjk1NDUxIDM1MTYyMzQuOTlFKzMwMzMwMzE3NiAtPiAtMAoreG11bDA4OSBtdWx0aXBseSAtNDgyMC45NTQ1MSAzNTE2MjM0Ljk5RSszMDMzMDMxNzYgLT4gLTEuNjk1MTYwODlFKzMwMzMwMzE4NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwODkgcG93ZXIgLTQ4MjAuOTU0NTEgNCAtPiA1LjQwMTcyMDgyRSsxNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wODkgcmVtYWluZGVyIC00ODIwLjk1NDUxIDM1MTYyMzQuOTlFKzMwMzMwMzE3NiAtPiAtNDgyMC45NTQ1MQoreHN1YjA4OSBzdWJ0cmFjdCAtNDgyMC45NTQ1MSAzNTE2MjM0Ljk5RSszMDMzMDMxNzYgLT4gLTMuNTE2MjM0OTlFKzMwMzMwMzE4MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwOTAgYWRkIDY5MzU1OTc2LjkgLTkuNTc4Mzg1NjJFKzc1ODgwNDk4NCAtPiAtOS41NzgzODU2MkUrNzU4ODA0OTg0IEluZXhhY3QgUm91bmRlZAoreGNvbTA5MCBjb21wYXJlIDY5MzU1OTc2LjkgLTkuNTc4Mzg1NjJFKzc1ODgwNDk4NCAtPiAxCit4ZGl2MDkwIGRpdmlkZSA2OTM1NTk3Ni45IC05LjU3ODM4NTYyRSs3NTg4MDQ5ODQgLT4gLTcuMjQwODgzNzZFLTc1ODgwNDk3OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwOTAgZGl2aWRlaW50IDY5MzU1OTc2LjkgLTkuNTc4Mzg1NjJFKzc1ODgwNDk4NCAtPiAtMAoreG11bDA5MCBtdWx0aXBseSA2OTM1NTk3Ni45IC05LjU3ODM4NTYyRSs3NTg4MDQ5ODQgLT4gLTYuNjQzMTgyOTJFKzc1ODgwNDk5MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwOTAgcG93ZXIgNjkzNTU5NzYuOSAtMTAgLT4gMy44ODI5NDM0NkUtNzkgSW5leGFjdCBSb3VuZGVkCit4cmVtMDkwIHJlbWFpbmRlciA2OTM1NTk3Ni45IC05LjU3ODM4NTYyRSs3NTg4MDQ5ODQgLT4gNjkzNTU5NzYuOQoreHN1YjA5MCBzdWJ0cmFjdCA2OTM1NTk3Ni45IC05LjU3ODM4NTYyRSs3NTg4MDQ5ODQgLT4gOS41NzgzODU2MkUrNzU4ODA0OTg0IEluZXhhY3QgUm91bmRlZAoreGFkZDA5MSBhZGQgLTEyNjcyMDkzLjEgODU2OS43ODI1NUUtMzgyODY2MDI1IC0+IC0xMjY3MjA5My4xIEluZXhhY3QgUm91bmRlZAoreGNvbTA5MSBjb21wYXJlIC0xMjY3MjA5My4xIDg1NjkuNzgyNTVFLTM4Mjg2NjAyNSAtPiAtMQoreGRpdjA5MSBkaXZpZGUgLTEyNjcyMDkzLjEgODU2OS43ODI1NUUtMzgyODY2MDI1IC0+IC0xLjQ3ODY5NDgyRSszODI4NjYwMjggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDkxIGRpdmlkZWludCAtMTI2NzIwOTMuMSA4NTY5Ljc4MjU1RS0zODI4NjYwMjUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwOTEgbXVsdGlwbHkgLTEyNjcyMDkzLjEgODU2OS43ODI1NUUtMzgyODY2MDI1IC0+IC0xLjA4NTk3MDgyRS0zODI4NjYwMTQgSW5leGFjdCBSb3VuZGVkCit4cG93MDkxIHBvd2VyIC0xMjY3MjA5My4xIDkgLT4gLTguNDI2MjY2NThFKzYzIEluZXhhY3QgUm91bmRlZAoreHJlbTA5MSByZW1haW5kZXIgLTEyNjcyMDkzLjEgODU2OS43ODI1NUUtMzgyODY2MDI1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDkxIHN1YnRyYWN0IC0xMjY3MjA5My4xIDg1NjkuNzgyNTVFLTM4Mjg2NjAyNSAtPiAtMTI2NzIwOTMuMSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwOTIgYWRkIC01OTEwNzUwLjIgNjYxNTAzODNFLTY2MjQ1OTI0MSAtPiAtNTkxMDc1MC4yMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wOTIgY29tcGFyZSAtNTkxMDc1MC4yIDY2MTUwMzgzRS02NjI0NTkyNDEgLT4gLTEKK3hkaXYwOTIgZGl2aWRlIC01OTEwNzUwLjIgNjYxNTAzODNFLTY2MjQ1OTI0MSAtPiAtOC45MzUzMjI3MkUrNjYyNDU5MjM5IEluZXhhY3QgUm91bmRlZAoreGR2aTA5MiBkaXZpZGVpbnQgLTU5MTA3NTAuMiA2NjE1MDM4M0UtNjYyNDU5MjQxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDkyIG11bHRpcGx5IC01OTEwNzUwLjIgNjYxNTAzODNFLTY2MjQ1OTI0MSAtPiAtMy45MDk5ODM5MEUtNjYyNDU5MjI3IEluZXhhY3QgUm91bmRlZAoreHBvdzA5MiBwb3dlciAtNTkxMDc1MC4yIDcgLT4gLTIuNTIwNTY2OTZFKzQ3IEluZXhhY3QgUm91bmRlZAoreHJlbTA5MiByZW1haW5kZXIgLTU5MTA3NTAuMiA2NjE1MDM4M0UtNjYyNDU5MjQxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDkyIHN1YnRyYWN0IC01OTEwNzUwLjIgNjYxNTAzODNFLTY2MjQ1OTI0MSAtPiAtNTkxMDc1MC4yMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwOTMgYWRkIC01MzI1NzcyNjguRS0xNjM4MDY2MjkgLTI0MDY1MDM5OEUtNjUwMTEwNTU4IC0+IC01LjMyNTc3MjY4RS0xNjM4MDY2MjEgSW5leGFjdCBSb3VuZGVkCit4Y29tMDkzIGNvbXBhcmUgLTUzMjU3NzI2OC5FLTE2MzgwNjYyOSAtMjQwNjUwMzk4RS02NTAxMTA1NTggLT4gLTEKK3hkaXYwOTMgZGl2aWRlIC01MzI1NzcyNjguRS0xNjM4MDY2MjkgLTI0MDY1MDM5OEUtNjUwMTEwNTU4IC0+IDIuMjEzMDc0NTRFKzQ4NjMwMzkyOSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwOTMgZGl2aWRlaW50IC01MzI1NzcyNjguRS0xNjM4MDY2MjkgLTI0MDY1MDM5OEUtNjUwMTEwNTU4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDkzIG11bHRpcGx5IC01MzI1NzcyNjguRS0xNjM4MDY2MjkgLTI0MDY1MDM5OEUtNjUwMTEwNTU4IC0+IDEuMjgxNjQ5MzJFLTgxMzkxNzE3MCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwOTMgcG93ZXIgLTUzMjU3NzI2OC5FLTE2MzgwNjYyOSAtMiAtPiAzLjUyNTYxMzg5RSszMjc2MTMyNDAgSW5leGFjdCBSb3VuZGVkCit4cmVtMDkzIHJlbWFpbmRlciAtNTMyNTc3MjY4LkUtMTYzODA2NjI5IC0yNDA2NTAzOThFLTY1MDExMDU1OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjA5MyBzdWJ0cmFjdCAtNTMyNTc3MjY4LkUtMTYzODA2NjI5IC0yNDA2NTAzOThFLTY1MDExMDU1OCAtPiAtNS4zMjU3NzI2OEUtMTYzODA2NjIxIEluZXhhY3QgUm91bmRlZAoreGFkZDA5NCBhZGQgLTY3MS41MDcxOThFLTkwODU4Nzg5MCAzMDU3NDI5LjMyRS01NTUyMzA2MjMgLT4gMy4wNTc0MjkzMkUtNTU1MjMwNjE3IEluZXhhY3QgUm91bmRlZAoreGNvbTA5NCBjb21wYXJlIC02NzEuNTA3MTk4RS05MDg1ODc4OTAgMzA1NzQyOS4zMkUtNTU1MjMwNjIzIC0+IC0xCit4ZGl2MDk0IGRpdmlkZSAtNjcxLjUwNzE5OEUtOTA4NTg3ODkwIDMwNTc0MjkuMzJFLTU1NTIzMDYyMyAtPiAtMi4xOTYzMTMwN0UtMzUzMzU3MjcxIEluZXhhY3QgUm91bmRlZAoreGR2aTA5NCBkaXZpZGVpbnQgLTY3MS41MDcxOThFLTkwODU4Nzg5MCAzMDU3NDI5LjMyRS01NTUyMzA2MjMgLT4gLTAKK3htdWwwOTQgbXVsdGlwbHkgLTY3MS41MDcxOThFLTkwODU4Nzg5MCAzMDU3NDI5LjMyRS01NTUyMzA2MjMgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHBvdzA5NCBwb3dlciAtNjcxLjUwNzE5OEUtOTA4NTg3ODkwIDMgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTA5NCByZW1haW5kZXIgLTY3MS41MDcxOThFLTkwODU4Nzg5MCAzMDU3NDI5LjMyRS01NTUyMzA2MjMgLT4gLTYuNzE1MDcxOThFLTkwODU4Nzg4OAoreHN1YjA5NCBzdWJ0cmFjdCAtNjcxLjUwNzE5OEUtOTA4NTg3ODkwIDMwNTc0MjkuMzJFLTU1NTIzMDYyMyAtPiAtMy4wNTc0MjkzMkUtNTU1MjMwNjE3IEluZXhhY3QgUm91bmRlZAoreGFkZDA5NSBhZGQgLTI5NC45OTQzNTJFKzM0NjQ1MjAyNyAtNjA2MTg1My4wIC0+IC0yLjk0OTk0MzUyRSszNDY0NTIwMjkgSW5leGFjdCBSb3VuZGVkCit4Y29tMDk1IGNvbXBhcmUgLTI5NC45OTQzNTJFKzM0NjQ1MjAyNyAtNjA2MTg1My4wIC0+IC0xCit4ZGl2MDk1IGRpdmlkZSAtMjk0Ljk5NDM1MkUrMzQ2NDUyMDI3IC02MDYxODUzLjAgLT4gNC44NjY0MDU1N0UrMzQ2NDUyMDIyIEluZXhhY3QgUm91bmRlZAoreGR2aTA5NSBkaXZpZGVpbnQgLTI5NC45OTQzNTJFKzM0NjQ1MjAyNyAtNjA2MTg1My4wIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDk1IG11bHRpcGx5IC0yOTQuOTk0MzUyRSszNDY0NTIwMjcgLTYwNjE4NTMuMCAtPiAxLjc4ODIxMjQwRSszNDY0NTIwMzYgSW5leGFjdCBSb3VuZGVkCit4cG93MDk1IHBvd2VyIC0yOTQuOTk0MzUyRSszNDY0NTIwMjcgLTYwNjE4NTMgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTA5NSByZW1haW5kZXIgLTI5NC45OTQzNTJFKzM0NjQ1MjAyNyAtNjA2MTg1My4wIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDk1IHN1YnRyYWN0IC0yOTQuOTk0MzUyRSszNDY0NTIwMjcgLTYwNjE4NTMuMCAtPiAtMi45NDk5NDM1MkUrMzQ2NDUyMDI5IEluZXhhY3QgUm91bmRlZAoreGFkZDA5NiBhZGQgMzI5NTc5MTE0IDE0Njc4MDU0OC4gLT4gNDc2MzU5NjYyCit4Y29tMDk2IGNvbXBhcmUgMzI5NTc5MTE0IDE0Njc4MDU0OC4gLT4gMQoreGRpdjA5NiBkaXZpZGUgMzI5NTc5MTE0IDE0Njc4MDU0OC4gLT4gMi4yNDUzODY4NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwOTYgZGl2aWRlaW50IDMyOTU3OTExNCAxNDY3ODA1NDguIC0+IDIKK3htdWwwOTYgbXVsdGlwbHkgMzI5NTc5MTE0IDE0Njc4MDU0OC4gLT4gNC44Mzc1ODAzMEUrMTYgSW5leGFjdCBSb3VuZGVkCit4cG93MDk2IHBvd2VyIDMyOTU3OTExNCAxNDY3ODA1NDggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDk2IHJlbWFpbmRlciAzMjk1NzkxMTQgMTQ2NzgwNTQ4LiAtPiAzNjAxODAxOAoreHN1YjA5NiBzdWJ0cmFjdCAzMjk1NzkxMTQgMTQ2NzgwNTQ4LiAtPiAxODI3OTg1NjYKK3hhZGQwOTcgYWRkIC03ODk5MDQuNjg2RS0yMTcyMjUwMDAgLTE5OTEuMDcxODFFLTg0MDgwMDU5IC0+IC0xLjk5MTA3MTgxRS04NDA4MDA1NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wOTcgY29tcGFyZSAtNzg5OTA0LjY4NkUtMjE3MjI1MDAwIC0xOTkxLjA3MTgxRS04NDA4MDA1OSAtPiAxCit4ZGl2MDk3IGRpdmlkZSAtNzg5OTA0LjY4NkUtMjE3MjI1MDAwIC0xOTkxLjA3MTgxRS04NDA4MDA1OSAtPiAzLjk2NzIzMzU0RS0xMzMxNDQ5MzkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDk3IGRpdmlkZWludCAtNzg5OTA0LjY4NkUtMjE3MjI1MDAwIC0xOTkxLjA3MTgxRS04NDA4MDA1OSAtPiAwCit4bXVsMDk3IG11bHRpcGx5IC03ODk5MDQuNjg2RS0yMTcyMjUwMDAgLTE5OTEuMDcxODFFLTg0MDgwMDU5IC0+IDEuNTcyNzU2OTVFLTMwMTMwNTA1MCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwOTcgcG93ZXIgLTc4OTkwNC42ODZFLTIxNzIyNTAwMCAtMiAtPiAxLjYwMjY5NDAzRSs0MzQ0NDk5ODggSW5leGFjdCBSb3VuZGVkCit4cmVtMDk3IHJlbWFpbmRlciAtNzg5OTA0LjY4NkUtMjE3MjI1MDAwIC0xOTkxLjA3MTgxRS04NDA4MDA1OSAtPiAtNy44OTkwNDY4NkUtMjE3MjI0OTk1Cit4c3ViMDk3IHN1YnRyYWN0IC03ODk5MDQuNjg2RS0yMTcyMjUwMDAgLTE5OTEuMDcxODFFLTg0MDgwMDU5IC0+IDEuOTkxMDcxODFFLTg0MDgwMDU2IEluZXhhY3QgUm91bmRlZAoreGFkZDA5OCBhZGQgNTk4OTMuMzU0NCAtNDA4NTk1ODY4IC0+IC00MDg1MzU5NzUgSW5leGFjdCBSb3VuZGVkCit4Y29tMDk4IGNvbXBhcmUgNTk4OTMuMzU0NCAtNDA4NTk1ODY4IC0+IDEKK3hkaXYwOTggZGl2aWRlIDU5ODkzLjM1NDQgLTQwODU5NTg2OCAtPiAtMC4wMDAxNDY1ODMzNTggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDk4IGRpdmlkZWludCA1OTg5My4zNTQ0IC00MDg1OTU4NjggLT4gLTAKK3htdWwwOTggbXVsdGlwbHkgNTk4OTMuMzU0NCAtNDA4NTk1ODY4IC0+IC0yLjQ0NzIxNzcxRSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwOTggcG93ZXIgNTk4OTMuMzU0NCAtNDA4NTk1ODY4IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTA5OCByZW1haW5kZXIgNTk4OTMuMzU0NCAtNDA4NTk1ODY4IC0+IDU5ODkzLjM1NDQKK3hzdWIwOTggc3VidHJhY3QgNTk4OTMuMzU0NCAtNDA4NTk1ODY4IC0+IDQwODY1NTc2MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwOTkgYWRkIDEyOS44Nzg2MTMgLTU0NjUyLjcyODhFLTk2MzU2NDk0MCAtPiAxMjkuODc4NjEzIEluZXhhY3QgUm91bmRlZAoreGNvbTA5OSBjb21wYXJlIDEyOS44Nzg2MTMgLTU0NjUyLjcyODhFLTk2MzU2NDk0MCAtPiAxCit4ZGl2MDk5IGRpdmlkZSAxMjkuODc4NjEzIC01NDY1Mi43Mjg4RS05NjM1NjQ5NDAgLT4gLTIuMzc2NDM0MThFKzk2MzU2NDkzNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwOTkgZGl2aWRlaW50IDEyOS44Nzg2MTMgLTU0NjUyLjcyODhFLTk2MzU2NDk0MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA5OSBtdWx0aXBseSAxMjkuODc4NjEzIC01NDY1Mi43Mjg4RS05NjM1NjQ5NDAgLT4gLTcuMDk4MjIwNjFFLTk2MzU2NDkzNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwOTkgcG93ZXIgMTI5Ljg3ODYxMyAtNSAtPiAyLjcwNTkwMDI5RS0xMSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wOTkgcmVtYWluZGVyIDEyOS44Nzg2MTMgLTU0NjUyLjcyODhFLTk2MzU2NDk0MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjA5OSBzdWJ0cmFjdCAxMjkuODc4NjEzIC01NDY1Mi43Mjg4RS05NjM1NjQ5NDAgLT4gMTI5Ljg3ODYxMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMDAgYWRkIDk4NjYuOTkyMDggNzA4NzU2NTAxLiAtPiA3MDg3NjYzNjggSW5leGFjdCBSb3VuZGVkCit4Y29tMTAwIGNvbXBhcmUgOTg2Ni45OTIwOCA3MDg3NTY1MDEuIC0+IC0xCit4ZGl2MTAwIGRpdmlkZSA5ODY2Ljk5MjA4IDcwODc1NjUwMS4gLT4gMC4wMDAwMTM5MjE1NTQzIEluZXhhY3QgUm91bmRlZAoreGR2aTEwMCBkaXZpZGVpbnQgOTg2Ni45OTIwOCA3MDg3NTY1MDEuIC0+IDAKK3htdWwxMDAgbXVsdGlwbHkgOTg2Ni45OTIwOCA3MDg3NTY1MDEuIC0+IDYuOTkzMjk0NzhFKzEyIEluZXhhY3QgUm91bmRlZAoreHBvdzEwMCBwb3dlciA5ODY2Ljk5MjA4IDcwODc1NjUwMSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMDAgcmVtYWluZGVyIDk4NjYuOTkyMDggNzA4NzU2NTAxLiAtPiA5ODY2Ljk5MjA4Cit4c3ViMTAwIHN1YnRyYWN0IDk4NjYuOTkyMDggNzA4NzU2NTAxLiAtPiAtNzA4NzQ2NjM0IEluZXhhY3QgUm91bmRlZAoreGFkZDEwMSBhZGQgLTc4ODEwLjYyOTcgLTM5OTg4NC42OCAtPiAtNDc4Njk1LjMxMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMDEgY29tcGFyZSAtNzg4MTAuNjI5NyAtMzk5ODg0LjY4IC0+IDEKK3hkaXYxMDEgZGl2aWRlIC03ODgxMC42Mjk3IC0zOTk4ODQuNjggLT4gMC4xOTcwODMzOTMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTAxIGRpdmlkZWludCAtNzg4MTAuNjI5NyAtMzk5ODg0LjY4IC0+IDAKK3htdWwxMDEgbXVsdGlwbHkgLTc4ODEwLjYyOTcgLTM5OTg4NC42OCAtPiAzLjE1MTUxNjM0RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMDEgcG93ZXIgLTc4ODEwLjYyOTcgLTM5OTg4NSAtPiAtMS41NDI1MjQwOEUtMTk1ODA3MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMDEgcmVtYWluZGVyIC03ODgxMC42Mjk3IC0zOTk4ODQuNjggLT4gLTc4ODEwLjYyOTcKK3hzdWIxMDEgc3VidHJhY3QgLTc4ODEwLjYyOTcgLTM5OTg4NC42OCAtPiAzMjEwNzQuMDUwIEluZXhhY3QgUm91bmRlZAoreGFkZDEwMiBhZGQgNDA5MTg5NzYxIC03NzEuNDcxNDYwIC0+IDQwOTE4ODk5MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMDIgY29tcGFyZSA0MDkxODk3NjEgLTc3MS40NzE0NjAgLT4gMQoreGRpdjEwMiBkaXZpZGUgNDA5MTg5NzYxIC03NzEuNDcxNDYwIC0+IC01MzA0MDEuNjgzIEluZXhhY3QgUm91bmRlZAoreGR2aTEwMiBkaXZpZGVpbnQgNDA5MTg5NzYxIC03NzEuNDcxNDYwIC0+IC01MzA0MDEKK3htdWwxMDIgbXVsdGlwbHkgNDA5MTg5NzYxIC03NzEuNDcxNDYwIC0+IC0zLjE1Njc4MjIyRSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMDIgcG93ZXIgNDA5MTg5NzYxIC03NzEgLT4gMS42MDY5ODQxNEUtNjY0MCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMDIgcmVtYWluZGVyIDQwOTE4OTc2MSAtNzcxLjQ3MTQ2MCAtPiA1MjcuMTQ0NTQwCit4c3ViMTAyIHN1YnRyYWN0IDQwOTE4OTc2MSAtNzcxLjQ3MTQ2MCAtPiA0MDkxOTA1MzIgSW5leGFjdCBSb3VuZGVkCit4YWRkMTAzIGFkZCAtMS42ODc0ODgzOCA0NjAuNDY5MjQgLT4gNDU4Ljc4MTc1MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMDMgY29tcGFyZSAtMS42ODc0ODgzOCA0NjAuNDY5MjQgLT4gLTEKK3hkaXYxMDMgZGl2aWRlIC0xLjY4NzQ4ODM4IDQ2MC40NjkyNCAtPiAtMC4wMDM2NjQ3MTQ2NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMDMgZGl2aWRlaW50IC0xLjY4NzQ4ODM4IDQ2MC40NjkyNCAtPiAtMAoreG11bDEwMyBtdWx0aXBseSAtMS42ODc0ODgzOCA0NjAuNDY5MjQgLT4gLTc3Ny4wMzY0OTIgSW5leGFjdCBSb3VuZGVkCit4cG93MTAzIHBvd2VyIC0xLjY4NzQ4ODM4IDQ2MCAtPiAzLjM5NDQwNjQ4RSsxMDQgSW5leGFjdCBSb3VuZGVkCit4cmVtMTAzIHJlbWFpbmRlciAtMS42ODc0ODgzOCA0NjAuNDY5MjQgLT4gLTEuNjg3NDg4MzgKK3hzdWIxMDMgc3VidHJhY3QgLTEuNjg3NDg4MzggNDYwLjQ2OTI0IC0+IC00NjIuMTU2NzI4IEluZXhhY3QgUm91bmRlZAoreGFkZDEwNCBhZGQgNTUzNTI3Mjk2LiAtNzkyNC40MDE4NSAtPiA1NTM1MTkzNzIgSW5leGFjdCBSb3VuZGVkCit4Y29tMTA0IGNvbXBhcmUgNTUzNTI3Mjk2LiAtNzkyNC40MDE4NSAtPiAxCit4ZGl2MTA0IGRpdmlkZSA1NTM1MjcyOTYuIC03OTI0LjQwMTg1IC0+IC02OTg1MC45ODc3IEluZXhhY3QgUm91bmRlZAoreGR2aTEwNCBkaXZpZGVpbnQgNTUzNTI3Mjk2LiAtNzkyNC40MDE4NSAtPiAtNjk4NTAKK3htdWwxMDQgbXVsdGlwbHkgNTUzNTI3Mjk2LiAtNzkyNC40MDE4NSAtPiAtNC4zODYzNzI3M0UrMTIgSW5leGFjdCBSb3VuZGVkCit4cG93MTA0IHBvd2VyIDU1MzUyNzI5Ni4gLTc5MjQgLT4gMi4zMjM5NzIxNEUtNjkyODEgSW5leGFjdCBSb3VuZGVkCit4cmVtMTA0IHJlbWFpbmRlciA1NTM1MjcyOTYuIC03OTI0LjQwMTg1IC0+IDc4MjYuNzc3NTAKK3hzdWIxMDQgc3VidHJhY3QgNTUzNTI3Mjk2LiAtNzkyNC40MDE4NSAtPiA1NTM1MzUyMjAgSW5leGFjdCBSb3VuZGVkCit4YWRkMTA1IGFkZCAtMzguNzQ2NTIwNyA2NDkzNi4yOTQyIC0+IDY0ODk3LjU0NzcgSW5leGFjdCBSb3VuZGVkCit4Y29tMTA1IGNvbXBhcmUgLTM4Ljc0NjUyMDcgNjQ5MzYuMjk0MiAtPiAtMQoreGRpdjEwNSBkaXZpZGUgLTM4Ljc0NjUyMDcgNjQ5MzYuMjk0MiAtPiAtMC4wMDA1OTY2ODUxMjMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTA1IGRpdmlkZWludCAtMzguNzQ2NTIwNyA2NDkzNi4yOTQyIC0+IC0wCit4bXVsMTA1IG11bHRpcGx5IC0zOC43NDY1MjA3IDY0OTM2LjI5NDIgLT4gLTI1MTYwNTUuNDcgSW5leGFjdCBSb3VuZGVkCit4cG93MTA1IHBvd2VyIC0zOC43NDY1MjA3IDY0OTM2IC0+IDMuMDE1MDA3NjJFKzEwMzEzMyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMDUgcmVtYWluZGVyIC0zOC43NDY1MjA3IDY0OTM2LjI5NDIgLT4gLTM4Ljc0NjUyMDcKK3hzdWIxMDUgc3VidHJhY3QgLTM4Ljc0NjUyMDcgNjQ5MzYuMjk0MiAtPiAtNjQ5NzUuMDQwNyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMDYgYWRkIC0yMDEwNzUuMjQ4IDg0NS42NjM5MjggLT4gLTIwMDIyOS41ODQgSW5leGFjdCBSb3VuZGVkCit4Y29tMTA2IGNvbXBhcmUgLTIwMTA3NS4yNDggODQ1LjY2MzkyOCAtPiAtMQoreGRpdjEwNiBkaXZpZGUgLTIwMTA3NS4yNDggODQ1LjY2MzkyOCAtPiAtMjM3Ljc3MjA1MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMDYgZGl2aWRlaW50IC0yMDEwNzUuMjQ4IDg0NS42NjM5MjggLT4gLTIzNworeG11bDEwNiBtdWx0aXBseSAtMjAxMDc1LjI0OCA4NDUuNjYzOTI4IC0+IC0xNzAwNDIwODQgSW5leGFjdCBSb3VuZGVkCit4cG93MTA2IHBvd2VyIC0yMDEwNzUuMjQ4IDg0NiAtPiA0LjM3OTExNzY3RSs0NDg2IEluZXhhY3QgUm91bmRlZAoreHJlbTEwNiByZW1haW5kZXIgLTIwMTA3NS4yNDggODQ1LjY2MzkyOCAtPiAtNjUyLjg5NzA2NAoreHN1YjEwNiBzdWJ0cmFjdCAtMjAxMDc1LjI0OCA4NDUuNjYzOTI4IC0+IC0yMDE5MjAuOTEyIEluZXhhY3QgUm91bmRlZAoreGFkZDEwNyBhZGQgOTEwNDguNDU1OSA3NTk1MzYwOS4zIC0+IDc2MDQ0NjU3LjggSW5leGFjdCBSb3VuZGVkCit4Y29tMTA3IGNvbXBhcmUgOTEwNDguNDU1OSA3NTk1MzYwOS4zIC0+IC0xCit4ZGl2MTA3IGRpdmlkZSA5MTA0OC40NTU5IDc1OTUzNjA5LjMgLT4gMC4wMDExOTg3Mzc3MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMDcgZGl2aWRlaW50IDkxMDQ4LjQ1NTkgNzU5NTM2MDkuMyAtPiAwCit4bXVsMTA3IG11bHRpcGx5IDkxMDQ4LjQ1NTkgNzU5NTM2MDkuMyAtPiA2LjkxNTQ1ODg1RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMDcgcG93ZXIgOTEwNDguNDU1OSA3NTk1MzYwOSAtPiA2Ljk0NDY3NzQ2RSszNzY2NzQ2NTAgSW5leGFjdCBSb3VuZGVkCit4cmVtMTA3IHJlbWFpbmRlciA5MTA0OC40NTU5IDc1OTUzNjA5LjMgLT4gOTEwNDguNDU1OQoreHN1YjEwNyBzdWJ0cmFjdCA5MTA0OC40NTU5IDc1OTUzNjA5LjMgLT4gLTc1ODYyNTYwLjggSW5leGFjdCBSb3VuZGVkCit4YWRkMTA4IGFkZCA2ODk4MjczLjg2RS0yNTIwOTc0NjAgMTUuMzQ1NjE5NiAtPiAxNS4zNDU2MTk2IEluZXhhY3QgUm91bmRlZAoreGNvbTEwOCBjb21wYXJlIDY4OTgyNzMuODZFLTI1MjA5NzQ2MCAxNS4zNDU2MTk2IC0+IC0xCit4ZGl2MTA4IGRpdmlkZSA2ODk4MjczLjg2RS0yNTIwOTc0NjAgMTUuMzQ1NjE5NiAtPiA0LjQ5NTI3MjI5RS0yNTIwOTc0NTUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTA4IGRpdmlkZWludCA2ODk4MjczLjg2RS0yNTIwOTc0NjAgMTUuMzQ1NjE5NiAtPiAwCit4bXVsMTA4IG11bHRpcGx5IDY4OTgyNzMuODZFLTI1MjA5NzQ2MCAxNS4zNDU2MTk2IC0+IDEuMDU4NTgyODdFLTI1MjA5NzQ1MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMDggcG93ZXIgNjg5ODI3My44NkUtMjUyMDk3NDYwIDE1IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTEwOCByZW1haW5kZXIgNjg5ODI3My44NkUtMjUyMDk3NDYwIDE1LjM0NTYxOTYgLT4gNi44OTgyNzM4NkUtMjUyMDk3NDU0Cit4c3ViMTA4IHN1YnRyYWN0IDY4OTgyNzMuODZFLTI1MjA5NzQ2MCAxNS4zNDU2MTk2IC0+IC0xNS4zNDU2MTk2IEluZXhhY3QgUm91bmRlZAoreGFkZDEwOSBhZGQgODguNDM3MDM0MyAtOTgwNzA5MTA1RS04Njk4OTkyODkgLT4gODguNDM3MDM0MyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMDkgY29tcGFyZSA4OC40MzcwMzQzIC05ODA3MDkxMDVFLTg2OTg5OTI4OSAtPiAxCit4ZGl2MTA5IGRpdmlkZSA4OC40MzcwMzQzIC05ODA3MDkxMDVFLTg2OTg5OTI4OSAtPiAtOS4wMTc2NjIyMEUrODY5ODk5MjgxIEluZXhhY3QgUm91bmRlZAoreGR2aTEwOSBkaXZpZGVpbnQgODguNDM3MDM0MyAtOTgwNzA5MTA1RS04Njk4OTkyODkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxMDkgbXVsdGlwbHkgODguNDM3MDM0MyAtOTgwNzA5MTA1RS04Njk4OTkyODkgLT4gLTguNjczMTAwNDhFLTg2OTg5OTI3OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMDkgcG93ZXIgODguNDM3MDM0MyAtMTAgLT4gMy40MTcxMDQ3OUUtMjAgSW5leGFjdCBSb3VuZGVkCit4cmVtMTA5IHJlbWFpbmRlciA4OC40MzcwMzQzIC05ODA3MDkxMDVFLTg2OTg5OTI4OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjEwOSBzdWJ0cmFjdCA4OC40MzcwMzQzIC05ODA3MDkxMDVFLTg2OTg5OTI4OSAtPiA4OC40MzcwMzQzIEluZXhhY3QgUm91bmRlZAoreGFkZDExMCBhZGQgLTE3NjQzLjM5IDIuMDM1MjU2OEUrMzA0ODcxMzMxIC0+IDIuMDM1MjU2ODBFKzMwNDg3MTMzMSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMTAgY29tcGFyZSAtMTc2NDMuMzkgMi4wMzUyNTY4RSszMDQ4NzEzMzEgLT4gLTEKK3hkaXYxMTAgZGl2aWRlIC0xNzY0My4zOSAyLjAzNTI1NjhFKzMwNDg3MTMzMSAtPiAtOC42Njg4NzY1OEUtMzA0ODcxMzI4IEluZXhhY3QgUm91bmRlZAoreGR2aTExMCBkaXZpZGVpbnQgLTE3NjQzLjM5IDIuMDM1MjU2OEUrMzA0ODcxMzMxIC0+IC0wCit4bXVsMTEwIG11bHRpcGx5IC0xNzY0My4zOSAyLjAzNTI1NjhFKzMwNDg3MTMzMSAtPiAtMy41OTA4ODI5NUUrMzA0ODcxMzM1IEluZXhhY3QgUm91bmRlZAoreHBvdzExMCBwb3dlciAtMTc2NDMuMzkgMiAtPiAzMTEyODkyMTEgSW5leGFjdCBSb3VuZGVkCit4cmVtMTEwIHJlbWFpbmRlciAtMTc2NDMuMzkgMi4wMzUyNTY4RSszMDQ4NzEzMzEgLT4gLTE3NjQzLjM5Cit4c3ViMTEwIHN1YnRyYWN0IC0xNzY0My4zOSAyLjAzNTI1NjhFKzMwNDg3MTMzMSAtPiAtMi4wMzUyNTY4MEUrMzA0ODcxMzMxIEluZXhhY3QgUm91bmRlZAoreGFkZDExMSBhZGQgNDU4OTc4NS4xNiA3NDU5LjA0MjM3IC0+IDQ1OTcyNDQuMjAgSW5leGFjdCBSb3VuZGVkCit4Y29tMTExIGNvbXBhcmUgNDU4OTc4NS4xNiA3NDU5LjA0MjM3IC0+IDEKK3hkaXYxMTEgZGl2aWRlIDQ1ODk3ODUuMTYgNzQ1OS4wNDIzNyAtPiA2MTUuMzMxNjkyIEluZXhhY3QgUm91bmRlZAoreGR2aTExMSBkaXZpZGVpbnQgNDU4OTc4NS4xNiA3NDU5LjA0MjM3IC0+IDYxNQoreG11bDExMSBtdWx0aXBseSA0NTg5Nzg1LjE2IDc0NTkuMDQyMzcgLT4gMy40MjM1NDAyMEUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MTExIHBvd2VyIDQ1ODk3ODUuMTYgNzQ1OSAtPiAyLjAzNzk1MjU4RSs0OTY5MCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMTEgcmVtYWluZGVyIDQ1ODk3ODUuMTYgNzQ1OS4wNDIzNyAtPiAyNDc0LjEwMjQ1Cit4c3ViMTExIHN1YnRyYWN0IDQ1ODk3ODUuMTYgNzQ1OS4wNDIzNyAtPiA0NTgyMzI2LjEyIEluZXhhY3QgUm91bmRlZAoreGFkZDExMiBhZGQgLTUxLjE2MzIwOTBFLTc1Mzk2ODA4MiA4Ljk2MjA3NDcxRS01ODU3OTc4ODcgLT4gOC45NjIwNzQ3MUUtNTg1Nzk3ODg3IEluZXhhY3QgUm91bmRlZAoreGNvbTExMiBjb21wYXJlIC01MS4xNjMyMDkwRS03NTM5NjgwODIgOC45NjIwNzQ3MUUtNTg1Nzk3ODg3IC0+IC0xCit4ZGl2MTEyIGRpdmlkZSAtNTEuMTYzMjA5MEUtNzUzOTY4MDgyIDguOTYyMDc0NzFFLTU4NTc5Nzg4NyAtPiAtNS43MDg4NTc2OEUtMTY4MTcwMTk1IEluZXhhY3QgUm91bmRlZAoreGR2aTExMiBkaXZpZGVpbnQgLTUxLjE2MzIwOTBFLTc1Mzk2ODA4MiA4Ljk2MjA3NDcxRS01ODU3OTc4ODcgLT4gLTAKK3htdWwxMTIgbXVsdGlwbHkgLTUxLjE2MzIwOTBFLTc1Mzk2ODA4MiA4Ljk2MjA3NDcxRS01ODU3OTc4ODcgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHBvdzExMiBwb3dlciAtNTEuMTYzMjA5MEUtNzUzOTY4MDgyIDkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTExMiByZW1haW5kZXIgLTUxLjE2MzIwOTBFLTc1Mzk2ODA4MiA4Ljk2MjA3NDcxRS01ODU3OTc4ODcgLT4gLTUuMTE2MzIwOTBFLTc1Mzk2ODA4MQoreHN1YjExMiBzdWJ0cmFjdCAtNTEuMTYzMjA5MEUtNzUzOTY4MDgyIDguOTYyMDc0NzFFLTU4NTc5Nzg4NyAtPiAtOC45NjIwNzQ3MUUtNTg1Nzk3ODg3IEluZXhhY3QgUm91bmRlZAoreGFkZDExMyBhZGQgOTgyLjIxNzgxNyA3MjI0OTA5LjRFLTQ1MjQzODE2IC0+IDk4Mi4yMTc4MTcgSW5leGFjdCBSb3VuZGVkCit4Y29tMTEzIGNvbXBhcmUgOTgyLjIxNzgxNyA3MjI0OTA5LjRFLTQ1MjQzODE2IC0+IDEKK3hkaXYxMTMgZGl2aWRlIDk4Mi4yMTc4MTcgNzIyNDkwOS40RS00NTI0MzgxNiAtPiAxLjM1OTQ4ODA3RSs0NTI0MzgxMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMTMgZGl2aWRlaW50IDk4Mi4yMTc4MTcgNzIyNDkwOS40RS00NTI0MzgxNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDExMyBtdWx0aXBseSA5ODIuMjE3ODE3IDcyMjQ5MDkuNEUtNDUyNDM4MTYgLT4gNy4wOTY0MzQ3NEUtNDUyNDM4MDcgSW5leGFjdCBSb3VuZGVkCit4cG93MTEzIHBvd2VyIDk4Mi4yMTc4MTcgNyAtPiA4LjgxOTcxNzA5RSsyMCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMTMgcmVtYWluZGVyIDk4Mi4yMTc4MTcgNzIyNDkwOS40RS00NTI0MzgxNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjExMyBzdWJ0cmFjdCA5ODIuMjE3ODE3IDcyMjQ5MDkuNEUtNDUyNDM4MTYgLT4gOTgyLjIxNzgxNyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMTQgYWRkIDUwMzcxMjA1Ni4gLTU3NDkwNzAzLjVFKzkyNDg5MDE4MyAtPiAtNS43NDkwNzAzNUUrOTI0ODkwMTkwIEluZXhhY3QgUm91bmRlZAoreGNvbTExNCBjb21wYXJlIDUwMzcxMjA1Ni4gLTU3NDkwNzAzLjVFKzkyNDg5MDE4MyAtPiAxCit4ZGl2MTE0IGRpdmlkZSA1MDM3MTIwNTYuIC01NzQ5MDcwMy41RSs5MjQ4OTAxODMgLT4gLTguNzYxNjI2MjNFLTkyNDg5MDE4MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMTQgZGl2aWRlaW50IDUwMzcxMjA1Ni4gLTU3NDkwNzAzLjVFKzkyNDg5MDE4MyAtPiAtMAoreG11bDExNCBtdWx0aXBseSA1MDM3MTIwNTYuIC01NzQ5MDcwMy41RSs5MjQ4OTAxODMgLT4gLTIuODk1ODc2MDVFKzkyNDg5MDE5OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMTQgcG93ZXIgNTAzNzEyMDU2LiAtNiAtPiA2LjEyMjE3NzY0RS01MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMTQgcmVtYWluZGVyIDUwMzcxMjA1Ni4gLTU3NDkwNzAzLjVFKzkyNDg5MDE4MyAtPiA1MDM3MTIwNTYKK3hzdWIxMTQgc3VidHJhY3QgNTAzNzEyMDU2LiAtNTc0OTA3MDMuNUUrOTI0ODkwMTgzIC0+IDUuNzQ5MDcwMzVFKzkyNDg5MDE5MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMTUgYWRkIDg4My44NDkyMjMgMjQ5MjU5MTcxIC0+IDI0OTI2MDA1NSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMTUgY29tcGFyZSA4ODMuODQ5MjIzIDI0OTI1OTE3MSAtPiAtMQoreGRpdjExNSBkaXZpZGUgODgzLjg0OTIyMyAyNDkyNTkxNzEgLT4gMC4wMDAwMDM1NDU5MDQ1MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMTUgZGl2aWRlaW50IDg4My44NDkyMjMgMjQ5MjU5MTcxIC0+IDAKK3htdWwxMTUgbXVsdGlwbHkgODgzLjg0OTIyMyAyNDkyNTkxNzEgLT4gMi4yMDMwNzUyNUUrMTEgSW5leGFjdCBSb3VuZGVkCit4cG93MTE1IHBvd2VyIDg4My44NDkyMjMgMjQ5MjU5MTcxIC0+IDUuMTU2NDI4NDRFKzczNDQxMTc4MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMTUgcmVtYWluZGVyIDg4My44NDkyMjMgMjQ5MjU5MTcxIC0+IDg4My44NDkyMjMKK3hzdWIxMTUgc3VidHJhY3QgODgzLjg0OTIyMyAyNDkyNTkxNzEgLT4gLTI0OTI1ODI4NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMTYgYWRkIDI0NS4wOTI4NTNFKzg3MjY0Mjg3NCA4MjgxOTUuMTUyRSs0MTk3NzE1MzIgLT4gMi40NTA5Mjg1M0UrODcyNjQyODc2IEluZXhhY3QgUm91bmRlZAoreGNvbTExNiBjb21wYXJlIDI0NS4wOTI4NTNFKzg3MjY0Mjg3NCA4MjgxOTUuMTUyRSs0MTk3NzE1MzIgLT4gMQoreGRpdjExNiBkaXZpZGUgMjQ1LjA5Mjg1M0UrODcyNjQyODc0IDgyODE5NS4xNTJFKzQxOTc3MTUzMiAtPiAyLjk1OTM2MTEyRSs0NTI4NzEzMzggSW5leGFjdCBSb3VuZGVkCit4ZHZpMTE2IGRpdmlkZWludCAyNDUuMDkyODUzRSs4NzI2NDI4NzQgODI4MTk1LjE1MkUrNDE5NzcxNTMyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTE2IG11bHRpcGx5IDI0NS4wOTI4NTNFKzg3MjY0Mjg3NCA4MjgxOTUuMTUyRSs0MTk3NzE1MzIgLT4gSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCit4cG93MTE2IHBvd2VyIDI0NS4wOTI4NTNFKzg3MjY0Mjg3NCA4IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTExNiByZW1haW5kZXIgMjQ1LjA5Mjg1M0UrODcyNjQyODc0IDgyODE5NS4xNTJFKzQxOTc3MTUzMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjExNiBzdWJ0cmFjdCAyNDUuMDkyODUzRSs4NzI2NDI4NzQgODI4MTk1LjE1MkUrNDE5NzcxNTMyIC0+IDIuNDUwOTI4NTNFKzg3MjY0Mjg3NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMTcgYWRkIC04MzY1ODYzOC42RSs3Mjg1NTE5MjggMjk1MjQ3OC40MiAtPiAtOC4zNjU4NjM4NkUrNzI4NTUxOTM1IEluZXhhY3QgUm91bmRlZAoreGNvbTExNyBjb21wYXJlIC04MzY1ODYzOC42RSs3Mjg1NTE5MjggMjk1MjQ3OC40MiAtPiAtMQoreGRpdjExNyBkaXZpZGUgLTgzNjU4NjM4LjZFKzcyODU1MTkyOCAyOTUyNDc4LjQyIC0+IC0yLjgzMzUwNTUxRSs3Mjg1NTE5MjkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTE3IGRpdmlkZWludCAtODM2NTg2MzguNkUrNzI4NTUxOTI4IDI5NTI0NzguNDIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxMTcgbXVsdGlwbHkgLTgzNjU4NjM4LjZFKzcyODU1MTkyOCAyOTUyNDc4LjQyIC0+IC0yLjQ3MDAwMzI1RSs3Mjg1NTE5NDIgSW5leGFjdCBSb3VuZGVkCit4cG93MTE3IHBvd2VyIC04MzY1ODYzOC42RSs3Mjg1NTE5MjggMjk1MjQ3OCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMTcgcmVtYWluZGVyIC04MzY1ODYzOC42RSs3Mjg1NTE5MjggMjk1MjQ3OC40MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjExNyBzdWJ0cmFjdCAtODM2NTg2MzguNkUrNzI4NTUxOTI4IDI5NTI0NzguNDIgLT4gLTguMzY1ODYzODZFKzcyODU1MTkzNSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMTggYWRkIC02MjkxNzgwLjk3IDI2OTk2Ny4zOTRFLTIyMDAwODE3IC0+IC02MjkxNzgwLjk3IEluZXhhY3QgUm91bmRlZAoreGNvbTExOCBjb21wYXJlIC02MjkxNzgwLjk3IDI2OTk2Ny4zOTRFLTIyMDAwODE3IC0+IC0xCit4ZGl2MTE4IGRpdmlkZSAtNjI5MTc4MC45NyAyNjk5NjcuMzk0RS0yMjAwMDgxNyAtPiAtMi4zMzA1NzA2OUUrMjIwMDA4MTggSW5leGFjdCBSb3VuZGVkCit4ZHZpMTE4IGRpdmlkZWludCAtNjI5MTc4MC45NyAyNjk5NjcuMzk0RS0yMjAwMDgxNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDExOCBtdWx0aXBseSAtNjI5MTc4MC45NyAyNjk5NjcuMzk0RS0yMjAwMDgxNyAtPiAtMS42OTg1NzU3MUUtMjIwMDA4MDUgSW5leGFjdCBSb3VuZGVkCit4cG93MTE4IHBvd2VyIC02MjkxNzgwLjk3IDMgLT4gLTIuNDkwNjk2MzZFKzIwIEluZXhhY3QgUm91bmRlZAoreHJlbTExOCByZW1haW5kZXIgLTYyOTE3ODAuOTcgMjY5OTY3LjM5NEUtMjIwMDA4MTcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxMTggc3VidHJhY3QgLTYyOTE3ODAuOTcgMjY5OTY3LjM5NEUtMjIwMDA4MTcgLT4gLTYyOTE3ODAuOTcgSW5leGFjdCBSb3VuZGVkCit4YWRkMTE5IGFkZCA5Nzg1NzEzNDguRSsyMjIzODI1NDcgNjAwNi4xOTM3MCAtPiA5Ljc4NTcxMzQ4RSsyMjIzODI1NTUgSW5leGFjdCBSb3VuZGVkCit4Y29tMTE5IGNvbXBhcmUgOTc4NTcxMzQ4LkUrMjIyMzgyNTQ3IDYwMDYuMTkzNzAgLT4gMQoreGRpdjExOSBkaXZpZGUgOTc4NTcxMzQ4LkUrMjIyMzgyNTQ3IDYwMDYuMTkzNzAgLT4gMS42MjkyNzAzOEUrMjIyMzgyNTUyIEluZXhhY3QgUm91bmRlZAoreGR2aTExOSBkaXZpZGVpbnQgOTc4NTcxMzQ4LkUrMjIyMzgyNTQ3IDYwMDYuMTkzNzAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxMTkgbXVsdGlwbHkgOTc4NTcxMzQ4LkUrMjIyMzgyNTQ3IDYwMDYuMTkzNzAgLT4gNS44Nzc0ODkwN0UrMjIyMzgyNTU5IEluZXhhY3QgUm91bmRlZAoreHBvdzExOSBwb3dlciA5Nzg1NzEzNDguRSsyMjIzODI1NDcgNjAwNiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMTkgcmVtYWluZGVyIDk3ODU3MTM0OC5FKzIyMjM4MjU0NyA2MDA2LjE5MzcwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTE5IHN1YnRyYWN0IDk3ODU3MTM0OC5FKzIyMjM4MjU0NyA2MDA2LjE5MzcwIC0+IDkuNzg1NzEzNDhFKzIyMjM4MjU1NSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMjAgYWRkIDE0MjM5MDI5LiAtMzY1MjcuMjIyMSAtPiAxNDIwMjUwMS44IEluZXhhY3QgUm91bmRlZAoreGNvbTEyMCBjb21wYXJlIDE0MjM5MDI5LiAtMzY1MjcuMjIyMSAtPiAxCit4ZGl2MTIwIGRpdmlkZSAxNDIzOTAyOS4gLTM2NTI3LjIyMjEgLT4gLTM4OS44MTk2NTIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTIwIGRpdmlkZWludCAxNDIzOTAyOS4gLTM2NTI3LjIyMjEgLT4gLTM4OQoreG11bDEyMCBtdWx0aXBseSAxNDIzOTAyOS4gLTM2NTI3LjIyMjEgLT4gLTUuMjAxMTIxNzVFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzEyMCBwb3dlciAxNDIzOTAyOS4gLTM2NTI3IC0+IDYuNjQyOTI3MzFFLTI2MTI5NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMjAgcmVtYWluZGVyIDE0MjM5MDI5LiAtMzY1MjcuMjIyMSAtPiAyOTkzOS42MDMxCit4c3ViMTIwIHN1YnRyYWN0IDE0MjM5MDI5LiAtMzY1MjcuMjIyMSAtPiAxNDI3NTU1Ni4yIEluZXhhY3QgUm91bmRlZAoreGFkZDEyMSBhZGQgNzIzMzMuMjY1NEUtNTQ0NDI1NTQ4IC02OTAuNjY0ODM2RSs2NjIxNTUxMjAgLT4gLTYuOTA2NjQ4MzZFKzY2MjE1NTEyMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMjEgY29tcGFyZSA3MjMzMy4yNjU0RS01NDQ0MjU1NDggLTY5MC42NjQ4MzZFKzY2MjE1NTEyMCAtPiAxCit4ZGl2MTIxIGRpdmlkZSA3MjMzMy4yNjU0RS01NDQ0MjU1NDggLTY5MC42NjQ4MzZFKzY2MjE1NTEyMCAtPiAtMEUtMTAwMDAwMDAwNyBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbCBDbGFtcGVkCit4ZHZpMTIxIGRpdmlkZWludCA3MjMzMy4yNjU0RS01NDQ0MjU1NDggLTY5MC42NjQ4MzZFKzY2MjE1NTEyMCAtPiAtMAoreG11bDEyMSBtdWx0aXBseSA3MjMzMy4yNjU0RS01NDQ0MjU1NDggLTY5MC42NjQ4MzZFKzY2MjE1NTEyMCAtPiAtNC45OTU4MDQyOUUrMTE3NzI5NTc5IEluZXhhY3QgUm91bmRlZAoreHBvdzEyMSBwb3dlciA3MjMzMy4yNjU0RS01NDQ0MjU1NDggLTcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMTIxIHJlbWFpbmRlciA3MjMzMy4yNjU0RS01NDQ0MjU1NDggLTY5MC42NjQ4MzZFKzY2MjE1NTEyMCAtPiA3LjIzMzMyNjU0RS01NDQ0MjU1NDQKK3hzdWIxMjEgc3VidHJhY3QgNzIzMzMuMjY1NEUtNTQ0NDI1NTQ4IC02OTAuNjY0ODM2RSs2NjIxNTUxMjAgLT4gNi45MDY2NDgzNkUrNjYyMTU1MTIyIEluZXhhY3QgUm91bmRlZAoreGFkZDEyMiBhZGQgLTM3NzIxLjE1NjdFLTExNTc4NzM0MSAtODI4OTQ5ODY0RS03NjI1MTc0NyAtPiAtOC4yODk0OTg2NEUtNzYyNTE3MzkgSW5leGFjdCBSb3VuZGVkCit4Y29tMTIyIGNvbXBhcmUgLTM3NzIxLjE1NjdFLTExNTc4NzM0MSAtODI4OTQ5ODY0RS03NjI1MTc0NyAtPiAxCit4ZGl2MTIyIGRpdmlkZSAtMzc3MjEuMTU2N0UtMTE1Nzg3MzQxIC04Mjg5NDk4NjRFLTc2MjUxNzQ3IC0+IDQuNTUwNDc1MDVFLTM5NTM1NTk5IEluZXhhY3QgUm91bmRlZAoreGR2aTEyMiBkaXZpZGVpbnQgLTM3NzIxLjE1NjdFLTExNTc4NzM0MSAtODI4OTQ5ODY0RS03NjI1MTc0NyAtPiAwCit4bXVsMTIyIG11bHRpcGx5IC0zNzcyMS4xNTY3RS0xMTU3ODczNDEgLTgyODk0OTg2NEUtNzYyNTE3NDcgLT4gMy4xMjY4OTQ3N0UtMTkyMDM5MDc1IEluZXhhY3QgUm91bmRlZAoreHBvdzEyMiBwb3dlciAtMzc3MjEuMTU2N0UtMTE1Nzg3MzQxIC04IC0+IDIuNDM5NjA3NjVFKzkyNjI5ODY5MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMjIgcmVtYWluZGVyIC0zNzcyMS4xNTY3RS0xMTU3ODczNDEgLTgyODk0OTg2NEUtNzYyNTE3NDcgLT4gLTMuNzcyMTE1NjdFLTExNTc4NzMzNworeHN1YjEyMiBzdWJ0cmFjdCAtMzc3MjEuMTU2N0UtMTE1Nzg3MzQxIC04Mjg5NDk4NjRFLTc2MjUxNzQ3IC0+IDguMjg5NDk4NjRFLTc2MjUxNzM5IEluZXhhY3QgUm91bmRlZAoreGFkZDEyMyBhZGQgLTIwNzg4NTIuODNFLTY0NzA4MDA4OSAtMTE5Nzc5ODU4LkUrNzM0NjY1NDYxIC0+IC0xLjE5Nzc5ODU4RSs3MzQ2NjU0NjkgSW5leGFjdCBSb3VuZGVkCit4Y29tMTIzIGNvbXBhcmUgLTIwNzg4NTIuODNFLTY0NzA4MDA4OSAtMTE5Nzc5ODU4LkUrNzM0NjY1NDYxIC0+IDEKK3hkaXYxMjMgZGl2aWRlIC0yMDc4ODUyLjgzRS02NDcwODAwODkgLTExOTc3OTg1OC5FKzczNDY2NTQ2MSAtPiAwRS0xMDAwMDAwMDA3IEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsIENsYW1wZWQKK3hkdmkxMjMgZGl2aWRlaW50IC0yMDc4ODUyLjgzRS02NDcwODAwODkgLTExOTc3OTg1OC5FKzczNDY2NTQ2MSAtPiAwCit4bXVsMTIzIG11bHRpcGx5IC0yMDc4ODUyLjgzRS02NDcwODAwODkgLTExOTc3OTg1OC5FKzczNDY2NTQ2MSAtPiAyLjQ5MDA0Njk3RSs4NzU4NTM4NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMjMgcG93ZXIgLTIwNzg4NTIuODNFLTY0NzA4MDA4OSAtMSAtPiAtNC44MTAzNDUzM0UrNjQ3MDgwMDgyIEluZXhhY3QgUm91bmRlZAoreHJlbTEyMyByZW1haW5kZXIgLTIwNzg4NTIuODNFLTY0NzA4MDA4OSAtMTE5Nzc5ODU4LkUrNzM0NjY1NDYxIC0+IC0yLjA3ODg1MjgzRS02NDcwODAwODMKK3hzdWIxMjMgc3VidHJhY3QgLTIwNzg4NTIuODNFLTY0NzA4MDA4OSAtMTE5Nzc5ODU4LkUrNzM0NjY1NDYxIC0+IDEuMTk3Nzk4NThFKzczNDY2NTQ2OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMjQgYWRkIC03OTE0NS4zNjI1IC03NzE4LjU3MzA3IC0+IC04Njg2My45MzU2IEluZXhhY3QgUm91bmRlZAoreGNvbTEyNCBjb21wYXJlIC03OTE0NS4zNjI1IC03NzE4LjU3MzA3IC0+IC0xCit4ZGl2MTI0IGRpdmlkZSAtNzkxNDUuMzYyNSAtNzcxOC41NzMwNyAtPiAxMC4yNTM4ODUyIEluZXhhY3QgUm91bmRlZAoreGR2aTEyNCBkaXZpZGVpbnQgLTc5MTQ1LjM2MjUgLTc3MTguNTczMDcgLT4gMTAKK3htdWwxMjQgbXVsdGlwbHkgLTc5MTQ1LjM2MjUgLTc3MTguNTczMDcgLT4gNjEwODg5MjY0IEluZXhhY3QgUm91bmRlZAoreHBvdzEyNCBwb3dlciAtNzkxNDUuMzYyNSAtNzcxOSAtPiAtMS4xMzE4MTk0MUUtMzc4MTEgSW5leGFjdCBSb3VuZGVkCit4cmVtMTI0IHJlbWFpbmRlciAtNzkxNDUuMzYyNSAtNzcxOC41NzMwNyAtPiAtMTk1OS42MzE4MAoreHN1YjEyNCBzdWJ0cmFjdCAtNzkxNDUuMzYyNSAtNzcxOC41NzMwNyAtPiAtNzE0MjYuNzg5NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMjUgYWRkIDIxMDM4OTAuNDlFKzk1OTI0NzIzNyAyMDAyNC4zMDE3IC0+IDIuMTAzODkwNDlFKzk1OTI0NzI0MyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMjUgY29tcGFyZSAyMTAzODkwLjQ5RSs5NTkyNDcyMzcgMjAwMjQuMzAxNyAtPiAxCit4ZGl2MTI1IGRpdmlkZSAyMTAzODkwLjQ5RSs5NTkyNDcyMzcgMjAwMjQuMzAxNyAtPiAxLjA1MDY2ODU5RSs5NTkyNDcyMzkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTI1IGRpdmlkZWludCAyMTAzODkwLjQ5RSs5NTkyNDcyMzcgMjAwMjQuMzAxNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDEyNSBtdWx0aXBseSAyMTAzODkwLjQ5RSs5NTkyNDcyMzcgMjAwMjQuMzAxNyAtPiA0LjIxMjg5Mzc5RSs5NTkyNDcyNDcgSW5leGFjdCBSb3VuZGVkCit4cG93MTI1IHBvd2VyIDIxMDM4OTAuNDlFKzk1OTI0NzIzNyAyMDAyNCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMjUgcmVtYWluZGVyIDIxMDM4OTAuNDlFKzk1OTI0NzIzNyAyMDAyNC4zMDE3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTI1IHN1YnRyYWN0IDIxMDM4OTAuNDlFKzk1OTI0NzIzNyAyMDAyNC4zMDE3IC0+IDIuMTAzODkwNDlFKzk1OTI0NzI0MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMjYgYWRkIDkxMTI0OTU1NyA3OTgxMDgwNC45IC0+IDk5MTA2MDM2MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMjYgY29tcGFyZSA5MTEyNDk1NTcgNzk4MTA4MDQuOSAtPiAxCit4ZGl2MTI2IGRpdmlkZSA5MTEyNDk1NTcgNzk4MTA4MDQuOSAtPiAxMS40MTc2MjE0IEluZXhhY3QgUm91bmRlZAoreGR2aTEyNiBkaXZpZGVpbnQgOTExMjQ5NTU3IDc5ODEwODA0LjkgLT4gMTEKK3htdWwxMjYgbXVsdGlwbHkgOTExMjQ5NTU3IDc5ODEwODA0LjkgLT4gNy4yNzI3NTYwNkUrMTYgSW5leGFjdCBSb3VuZGVkCit4cG93MTI2IHBvd2VyIDkxMTI0OTU1NyA3OTgxMDgwNSAtPiA2Ljc3NTk1NzQxRSs3MTUwNzU4NjcgSW5leGFjdCBSb3VuZGVkCit4cmVtMTI2IHJlbWFpbmRlciA5MTEyNDk1NTcgNzk4MTA4MDQuOSAtPiAzMzMzMDcwMy4xCit4c3ViMTI2IHN1YnRyYWN0IDkxMTI0OTU1NyA3OTgxMDgwNC45IC0+IDgzMTQzODc1MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMjcgYWRkIDM0MTEzNC45OTQgMy4zNzQ4NjI5MiAtPiAzNDExMzguMzY5IEluZXhhY3QgUm91bmRlZAoreGNvbTEyNyBjb21wYXJlIDM0MTEzNC45OTQgMy4zNzQ4NjI5MiAtPiAxCit4ZGl2MTI3IGRpdmlkZSAzNDExMzQuOTk0IDMuMzc0ODYyOTIgLT4gMTAxMDgxLjE0MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMjcgZGl2aWRlaW50IDM0MTEzNC45OTQgMy4zNzQ4NjI5MiAtPiAxMDEwODEKK3htdWwxMjcgbXVsdGlwbHkgMzQxMTM0Ljk5NCAzLjM3NDg2MjkyIC0+IDExNTEyODMuODQgSW5leGFjdCBSb3VuZGVkCit4cG93MTI3IHBvd2VyIDM0MTEzNC45OTQgMyAtPiAzLjk2OTg5MzE0RSsxNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMjcgcmVtYWluZGVyIDM0MTEzNC45OTQgMy4zNzQ4NjI5MiAtPiAwLjQ3NTE4MzQ4Cit4c3ViMTI3IHN1YnRyYWN0IDM0MTEzNC45OTQgMy4zNzQ4NjI5MiAtPiAzNDExMzEuNjE5IEluZXhhY3QgUm91bmRlZAoreGFkZDEyOCBhZGQgMjQ0LjIzNjM0IDUxMjcwNjE5MEUtMzQxNDU5ODM2IC0+IDI0NC4yMzYzNDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMTI4IGNvbXBhcmUgMjQ0LjIzNjM0IDUxMjcwNjE5MEUtMzQxNDU5ODM2IC0+IDEKK3hkaXYxMjggZGl2aWRlIDI0NC4yMzYzNCA1MTI3MDYxOTBFLTM0MTQ1OTgzNiAtPiA0Ljc2MzY3MDU5RSszNDE0NTk4MjkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTI4IGRpdmlkZWludCAyNDQuMjM2MzQgNTEyNzA2MTkwRS0zNDE0NTk4MzYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxMjggbXVsdGlwbHkgMjQ0LjIzNjM0IDUxMjcwNjE5MEUtMzQxNDU5ODM2IC0+IDEuMjUyMjE0ODNFLTM0MTQ1OTgyNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMjggcG93ZXIgMjQ0LjIzNjM0IDUgLT4gOC42OTA2MzMxMkUrMTEgSW5leGFjdCBSb3VuZGVkCit4cmVtMTI4IHJlbWFpbmRlciAyNDQuMjM2MzQgNTEyNzA2MTkwRS0zNDE0NTk4MzYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxMjggc3VidHJhY3QgMjQ0LjIzNjM0IDUxMjcwNjE5MEUtMzQxNDU5ODM2IC0+IDI0NC4yMzYzNDAgSW5leGFjdCBSb3VuZGVkCit4YWRkMTI5IGFkZCAtOS4yMjc4Mzg0OUUrMTcxNTg1OTU0IC05OS4wOTQ2ODAwIC0+IC05LjIyNzgzODQ5RSsxNzE1ODU5NTQgSW5leGFjdCBSb3VuZGVkCit4Y29tMTI5IGNvbXBhcmUgLTkuMjI3ODM4NDlFKzE3MTU4NTk1NCAtOTkuMDk0NjgwMCAtPiAtMQoreGRpdjEyOSBkaXZpZGUgLTkuMjI3ODM4NDlFKzE3MTU4NTk1NCAtOTkuMDk0NjgwMCAtPiA5LjMxMjE0MzE4RSsxNzE1ODU5NTIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTI5IGRpdmlkZWludCAtOS4yMjc4Mzg0OUUrMTcxNTg1OTU0IC05OS4wOTQ2ODAwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTI5IG11bHRpcGx5IC05LjIyNzgzODQ5RSsxNzE1ODU5NTQgLTk5LjA5NDY4MDAgLT4gOS4xNDQyOTcwMkUrMTcxNTg1OTU2IEluZXhhY3QgUm91bmRlZAoreHBvdzEyOSBwb3dlciAtOS4yMjc4Mzg0OUUrMTcxNTg1OTU0IC05OSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTI5IHJlbWFpbmRlciAtOS4yMjc4Mzg0OUUrMTcxNTg1OTU0IC05OS4wOTQ2ODAwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTI5IHN1YnRyYWN0IC05LjIyNzgzODQ5RSsxNzE1ODU5NTQgLTk5LjA5NDY4MDAgLT4gLTkuMjI3ODM4NDlFKzE3MTU4NTk1NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMzAgYWRkIDY5OTYzMS44OTMgLTIyNi40MjM5NTggLT4gNjk5NDA1LjQ2OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMzAgY29tcGFyZSA2OTk2MzEuODkzIC0yMjYuNDIzOTU4IC0+IDEKK3hkaXYxMzAgZGl2aWRlIDY5OTYzMS44OTMgLTIyNi40MjM5NTggLT4gLTMwODkuOTE5OTAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTMwIGRpdmlkZWludCA2OTk2MzEuODkzIC0yMjYuNDIzOTU4IC0+IC0zMDg5Cit4bXVsMTMwIG11bHRpcGx5IDY5OTYzMS44OTMgLTIyNi40MjM5NTggLT4gLTE1ODQxMzQyMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMzAgcG93ZXIgNjk5NjMxLjg5MyAtMjI2IC0+IDEuMTQ2NzU1MTFFLTEzMjEgSW5leGFjdCBSb3VuZGVkCit4cmVtMTMwIHJlbWFpbmRlciA2OTk2MzEuODkzIC0yMjYuNDIzOTU4IC0+IDIwOC4yODY3MzgKK3hzdWIxMzAgc3VidHJhY3QgNjk5NjMxLjg5MyAtMjI2LjQyMzk1OCAtPiA2OTk4NTguMzE3IEluZXhhY3QgUm91bmRlZAoreGFkZDEzMSBhZGQgLTI0OTM1MDEzOS5FLTU3MTc5MzY3MyA3NzU3MzI0MjguIC0+IDc3NTczMjQyOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMzEgY29tcGFyZSAtMjQ5MzUwMTM5LkUtNTcxNzkzNjczIDc3NTczMjQyOC4gLT4gLTEKK3hkaXYxMzEgZGl2aWRlIC0yNDkzNTAxMzkuRS01NzE3OTM2NzMgNzc1NzMyNDI4LiAtPiAtMy4yMTQzODMzNEUtNTcxNzkzNjc0IEluZXhhY3QgUm91bmRlZAoreGR2aTEzMSBkaXZpZGVpbnQgLTI0OTM1MDEzOS5FLTU3MTc5MzY3MyA3NzU3MzI0MjguIC0+IC0wCit4bXVsMTMxIG11bHRpcGx5IC0yNDkzNTAxMzkuRS01NzE3OTM2NzMgNzc1NzMyNDI4LiAtPiAtMS45MzQyODk4OUUtNTcxNzkzNjU2IEluZXhhY3QgUm91bmRlZAoreHBvdzEzMSBwb3dlciAtMjQ5MzUwMTM5LkUtNTcxNzkzNjczIDc3NTczMjQyOCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xMzEgcmVtYWluZGVyIC0yNDkzNTAxMzkuRS01NzE3OTM2NzMgNzc1NzMyNDI4LiAtPiAtMi40OTM1MDEzOUUtNTcxNzkzNjY1Cit4c3ViMTMxIHN1YnRyYWN0IC0yNDkzNTAxMzkuRS01NzE3OTM2NzMgNzc1NzMyNDI4LiAtPiAtNzc1NzMyNDI4IEluZXhhY3QgUm91bmRlZAoreGFkZDEzMiBhZGQgNS4xMTYyOTAyMCAtNDgwLjUzMTk0IC0+IC00NzUuNDE1NjUwIEluZXhhY3QgUm91bmRlZAoreGNvbTEzMiBjb21wYXJlIDUuMTE2MjkwMjAgLTQ4MC41MzE5NCAtPiAxCit4ZGl2MTMyIGRpdmlkZSA1LjExNjI5MDIwIC00ODAuNTMxOTQgLT4gLTAuMDEwNjQ3MTM4NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMzIgZGl2aWRlaW50IDUuMTE2MjkwMjAgLTQ4MC41MzE5NCAtPiAtMAoreG11bDEzMiBtdWx0aXBseSA1LjExNjI5MDIwIC00ODAuNTMxOTQgLT4gLTI0NTguNTQwODYgSW5leGFjdCBSb3VuZGVkCit4cG93MTMyIHBvd2VyIDUuMTE2MjkwMjAgLTQ4MSAtPiA5LjgzMDIxOTUxRS0zNDIgSW5leGFjdCBSb3VuZGVkCit4cmVtMTMyIHJlbWFpbmRlciA1LjExNjI5MDIwIC00ODAuNTMxOTQgLT4gNS4xMTYyOTAyMAoreHN1YjEzMiBzdWJ0cmFjdCA1LjExNjI5MDIwIC00ODAuNTMxOTQgLT4gNDg1LjY0ODIzMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMzMgYWRkIC04LjIzMzUyNjczRS00NDY3MjMxNDcgLTUzMDcxMC44NjYgLT4gLTUzMDcxMC44NjYgSW5leGFjdCBSb3VuZGVkCit4Y29tMTMzIGNvbXBhcmUgLTguMjMzNTI2NzNFLTQ0NjcyMzE0NyAtNTMwNzEwLjg2NiAtPiAxCit4ZGl2MTMzIGRpdmlkZSAtOC4yMzM1MjY3M0UtNDQ2NzIzMTQ3IC01MzA3MTAuODY2IC0+IDEuNTUxNDE0NzZFLTQ0NjcyMzE1MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMzMgZGl2aWRlaW50IC04LjIzMzUyNjczRS00NDY3MjMxNDcgLTUzMDcxMC44NjYgLT4gMAoreG11bDEzMyBtdWx0aXBseSAtOC4yMzM1MjY3M0UtNDQ2NzIzMTQ3IC01MzA3MTAuODY2IC0+IDQuMzY5NjIyMTBFLTQ0NjcyMzE0MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMzMgcG93ZXIgLTguMjMzNTI2NzNFLTQ0NjcyMzE0NyAtNTMwNzExIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMzMgcmVtYWluZGVyIC04LjIzMzUyNjczRS00NDY3MjMxNDcgLTUzMDcxMC44NjYgLT4gLTguMjMzNTI2NzNFLTQ0NjcyMzE0NworeHN1YjEzMyBzdWJ0cmFjdCAtOC4yMzM1MjY3M0UtNDQ2NzIzMTQ3IC01MzA3MTAuODY2IC0+IDUzMDcxMC44NjYgSW5leGFjdCBSb3VuZGVkCit4YWRkMTM0IGFkZCA3LjA1OTg2MDggLTk1OTA4LjM1IC0+IC05NTkwMS4yOTAxIEluZXhhY3QgUm91bmRlZAoreGNvbTEzNCBjb21wYXJlIDcuMDU5ODYwOCAtOTU5MDguMzUgLT4gMQoreGRpdjEzNCBkaXZpZGUgNy4wNTk4NjA4IC05NTkwOC4zNSAtPiAtMC4wMDAwNzM2MTA0OTE3IEluZXhhY3QgUm91bmRlZAoreGR2aTEzNCBkaXZpZGVpbnQgNy4wNTk4NjA4IC05NTkwOC4zNSAtPiAtMAoreG11bDEzNCBtdWx0aXBseSA3LjA1OTg2MDggLTk1OTA4LjM1IC0+IC02NzcwOTkuNjAxIEluZXhhY3QgUm91bmRlZAoreHBvdzEzNCBwb3dlciA3LjA1OTg2MDggLTk1OTA4IC0+IDQuNTcwNzM4NzdFLTgxNDA3IEluZXhhY3QgUm91bmRlZAoreHJlbTEzNCByZW1haW5kZXIgNy4wNTk4NjA4IC05NTkwOC4zNSAtPiA3LjA1OTg2MDgKK3hzdWIxMzQgc3VidHJhY3QgNy4wNTk4NjA4IC05NTkwOC4zNSAtPiA5NTkxNS40MDk5IEluZXhhY3QgUm91bmRlZAoreGFkZDEzNSBhZGQgLTcuOTExODk4NDVFKzIwNzIwMjcwNiAxNTMyLjcxODQ3RSs1MDk5NDQzMzUgLT4gMS41MzI3MTg0N0UrNTA5OTQ0MzM4IEluZXhhY3QgUm91bmRlZAoreGNvbTEzNSBjb21wYXJlIC03LjkxMTg5ODQ1RSsyMDcyMDI3MDYgMTUzMi43MTg0N0UrNTA5OTQ0MzM1IC0+IC0xCit4ZGl2MTM1IGRpdmlkZSAtNy45MTE4OTg0NUUrMjA3MjAyNzA2IDE1MzIuNzE4NDdFKzUwOTk0NDMzNSAtPiAtNS4xNjIwMDM3MkUtMzAyNzQxNjMyIEluZXhhY3QgUm91bmRlZAoreGR2aTEzNSBkaXZpZGVpbnQgLTcuOTExODk4NDVFKzIwNzIwMjcwNiAxNTMyLjcxODQ3RSs1MDk5NDQzMzUgLT4gLTAKK3htdWwxMzUgbXVsdGlwbHkgLTcuOTExODk4NDVFKzIwNzIwMjcwNiAxNTMyLjcxODQ3RSs1MDk5NDQzMzUgLT4gLTEuMjEyNjcxMjlFKzcxNzE0NzA0NSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMzUgcG93ZXIgLTcuOTExODk4NDVFKzIwNzIwMjcwNiAyIC0+IDYuMjU5ODEzNzFFKzQxNDQwNTQxMyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMzUgcmVtYWluZGVyIC03LjkxMTg5ODQ1RSsyMDcyMDI3MDYgMTUzMi43MTg0N0UrNTA5OTQ0MzM1IC0+IC03LjkxMTg5ODQ1RSsyMDcyMDI3MDYKK3hzdWIxMzUgc3VidHJhY3QgLTcuOTExODk4NDVFKzIwNzIwMjcwNiAxNTMyLjcxODQ3RSs1MDk5NDQzMzUgLT4gLTEuNTMyNzE4NDdFKzUwOTk0NDMzOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMzYgYWRkIDIwODgzOTM3MC5FLTIxNTE0NzQzMiAtNzUuOTQyMDU1OSAtPiAtNzUuOTQyMDU1OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMzYgY29tcGFyZSAyMDg4MzkzNzAuRS0yMTUxNDc0MzIgLTc1Ljk0MjA1NTkgLT4gMQoreGRpdjEzNiBkaXZpZGUgMjA4ODM5MzcwLkUtMjE1MTQ3NDMyIC03NS45NDIwNTU5IC0+IC0yLjc0OTk4MzEwRS0yMTUxNDc0MjYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTM2IGRpdmlkZWludCAyMDg4MzkzNzAuRS0yMTUxNDc0MzIgLTc1Ljk0MjA1NTkgLT4gLTAKK3htdWwxMzYgbXVsdGlwbHkgMjA4ODM5MzcwLkUtMjE1MTQ3NDMyIC03NS45NDIwNTU5IC0+IC0xLjU4NTk2OTExRS0yMTUxNDc0MjIgSW5leGFjdCBSb3VuZGVkCit4cG93MTM2IHBvd2VyIDIwODgzOTM3MC5FLTIxNTE0NzQzMiAtNzYgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMTM2IHJlbWFpbmRlciAyMDg4MzkzNzAuRS0yMTUxNDc0MzIgLTc1Ljk0MjA1NTkgLT4gMi4wODgzOTM3MEUtMjE1MTQ3NDI0Cit4c3ViMTM2IHN1YnRyYWN0IDIwODgzOTM3MC5FLTIxNTE0NzQzMiAtNzUuOTQyMDU1OSAtPiA3NS45NDIwNTU5IEluZXhhY3QgUm91bmRlZAoreGFkZDEzNyBhZGQgNDI3Ljc1NDI0NEUtMzUzMzI4MzY5IDQ3MDUuMDc5NiAtPiA0NzA1LjA3OTYwIEluZXhhY3QgUm91bmRlZAoreGNvbTEzNyBjb21wYXJlIDQyNy43NTQyNDRFLTM1MzMyODM2OSA0NzA1LjA3OTYgLT4gLTEKK3hkaXYxMzcgZGl2aWRlIDQyNy43NTQyNDRFLTM1MzMyODM2OSA0NzA1LjA3OTYgLT4gOS4wOTEzMjg1M0UtMzUzMzI4MzcxIEluZXhhY3QgUm91bmRlZAoreGR2aTEzNyBkaXZpZGVpbnQgNDI3Ljc1NDI0NEUtMzUzMzI4MzY5IDQ3MDUuMDc5NiAtPiAwCit4bXVsMTM3IG11bHRpcGx5IDQyNy43NTQyNDRFLTM1MzMyODM2OSA0NzA1LjA3OTYgLT4gMi4wMTI2MTc3N0UtMzUzMzI4MzYzIEluZXhhY3QgUm91bmRlZAoreHBvdzEzNyBwb3dlciA0MjcuNzU0MjQ0RS0zNTMzMjgzNjkgNDcwNSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xMzcgcmVtYWluZGVyIDQyNy43NTQyNDRFLTM1MzMyODM2OSA0NzA1LjA3OTYgLT4gNC4yNzc1NDI0NEUtMzUzMzI4MzY3Cit4c3ViMTM3IHN1YnRyYWN0IDQyNy43NTQyNDRFLTM1MzMyODM2OSA0NzA1LjA3OTYgLT4gLTQ3MDUuMDc5NjAgSW5leGFjdCBSb3VuZGVkCit4YWRkMTM4IGFkZCA0NDkxMS4wODkgLTk1LjE3MzM2MDVFLTMxMzA4MTg0OCAtPiA0NDkxMS4wODkwIEluZXhhY3QgUm91bmRlZAoreGNvbTEzOCBjb21wYXJlIDQ0OTExLjA4OSAtOTUuMTczMzYwNUUtMzEzMDgxODQ4IC0+IDEKK3hkaXYxMzggZGl2aWRlIDQ0OTExLjA4OSAtOTUuMTczMzYwNUUtMzEzMDgxODQ4IC0+IC00LjcxODg3MTgzRSszMTMwODE4NTAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTM4IGRpdmlkZWludCA0NDkxMS4wODkgLTk1LjE3MzM2MDVFLTMxMzA4MTg0OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDEzOCBtdWx0aXBseSA0NDkxMS4wODkgLTk1LjE3MzM2MDVFLTMxMzA4MTg0OCAtPiAtNC4yNzQzMzkyNkUtMzEzMDgxODQyIEluZXhhY3QgUm91bmRlZAoreHBvdzEzOCBwb3dlciA0NDkxMS4wODkgLTEwIC0+IDIuOTk1NDY0MjVFLTQ3IEluZXhhY3QgUm91bmRlZAoreHJlbTEzOCByZW1haW5kZXIgNDQ5MTEuMDg5IC05NS4xNzMzNjA1RS0zMTMwODE4NDggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxMzggc3VidHJhY3QgNDQ5MTEuMDg5IC05NS4xNzMzNjA1RS0zMTMwODE4NDggLT4gNDQ5MTEuMDg5MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMzkgYWRkIDQ1MjM3MTgyMS4gLTQxMDk3MDkuMTkgLT4gNDQ4MjYyMTEyIEluZXhhY3QgUm91bmRlZAoreGNvbTEzOSBjb21wYXJlIDQ1MjM3MTgyMS4gLTQxMDk3MDkuMTkgLT4gMQoreGRpdjEzOSBkaXZpZGUgNDUyMzcxODIxLiAtNDEwOTcwOS4xOSAtPiAtMTEwLjA3MzkyNSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMzkgZGl2aWRlaW50IDQ1MjM3MTgyMS4gLTQxMDk3MDkuMTkgLT4gLTExMAoreG11bDEzOSBtdWx0aXBseSA0NTIzNzE4MjEuIC00MTA5NzA5LjE5IC0+IC0xLjg1OTExNjYzRSsxNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMzkgcG93ZXIgNDUyMzcxODIxLiAtNDEwOTcwOSAtPiAxLjE1NTI4ODA3RS0zNTU3MTU2OCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMzkgcmVtYWluZGVyIDQ1MjM3MTgyMS4gLTQxMDk3MDkuMTkgLT4gMzAzODEwLjEwCit4c3ViMTM5IHN1YnRyYWN0IDQ1MjM3MTgyMS4gLTQxMDk3MDkuMTkgLT4gNDU2NDgxNTMwIEluZXhhY3QgUm91bmRlZAoreGFkZDE0MCBhZGQgOTQwMDcuNDM5MiAtOTQ2NzcyNS41RSs2ODE4OTgyMzQgLT4gLTkuNDY3NzI1NTBFKzY4MTg5ODI0MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNDAgY29tcGFyZSA5NDAwNy40MzkyIC05NDY3NzI1LjVFKzY4MTg5ODIzNCAtPiAxCit4ZGl2MTQwIGRpdmlkZSA5NDAwNy40MzkyIC05NDY3NzI1LjVFKzY4MTg5ODIzNCAtPiAtOS45MjkyNTI3MkUtNjgxODk4MjM3IEluZXhhY3QgUm91bmRlZAoreGR2aTE0MCBkaXZpZGVpbnQgOTQwMDcuNDM5MiAtOTQ2NzcyNS41RSs2ODE4OTgyMzQgLT4gLTAKK3htdWwxNDAgbXVsdGlwbHkgOTQwMDcuNDM5MiAtOTQ2NzcyNS41RSs2ODE4OTgyMzQgLT4gLTguOTAwMzY2MjlFKzY4MTg5ODI0NSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNDAgcG93ZXIgOTQwMDcuNDM5MiAtOSAtPiAxLjc0Mzk3Mzk3RS00NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNDAgcmVtYWluZGVyIDk0MDA3LjQzOTIgLTk0Njc3MjUuNUUrNjgxODk4MjM0IC0+IDk0MDA3LjQzOTIKK3hzdWIxNDAgc3VidHJhY3QgOTQwMDcuNDM5MiAtOTQ2NzcyNS41RSs2ODE4OTgyMzQgLT4gOS40Njc3MjU1MEUrNjgxODk4MjQwIEluZXhhY3QgUm91bmRlZAoreGFkZDE0MSBhZGQgOTkxNDc1NTQuMEUtNzUxNDEwNTg2IDM4MzEzLjY0MjMgLT4gMzgzMTMuNjQyMyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNDEgY29tcGFyZSA5OTE0NzU1NC4wRS03NTE0MTA1ODYgMzgzMTMuNjQyMyAtPiAtMQoreGRpdjE0MSBkaXZpZGUgOTkxNDc1NTQuMEUtNzUxNDEwNTg2IDM4MzEzLjY0MjMgLT4gMi41ODc3ODcyMkUtNzUxNDEwNTgzIEluZXhhY3QgUm91bmRlZAoreGR2aTE0MSBkaXZpZGVpbnQgOTkxNDc1NTQuMEUtNzUxNDEwNTg2IDM4MzEzLjY0MjMgLT4gMAoreG11bDE0MSBtdWx0aXBseSA5OTE0NzU1NC4wRS03NTE0MTA1ODYgMzgzMTMuNjQyMyAtPiAzLjc5ODcwMzkyRS03NTE0MTA1NzQgSW5leGFjdCBSb3VuZGVkCit4cG93MTQxIHBvd2VyIDk5MTQ3NTU0LjBFLTc1MTQxMDU4NiAzODMxNCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xNDEgcmVtYWluZGVyIDk5MTQ3NTU0LjBFLTc1MTQxMDU4NiAzODMxMy42NDIzIC0+IDkuOTE0NzU1NDBFLTc1MTQxMDU3OQoreHN1YjE0MSBzdWJ0cmFjdCA5OTE0NzU1NC4wRS03NTE0MTA1ODYgMzgzMTMuNjQyMyAtPiAtMzgzMTMuNjQyMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNDIgYWRkIC03OTE5LjMwMjU0IC02NjkuNjA3ODU0IC0+IC04NTg4LjkxMDM5IEluZXhhY3QgUm91bmRlZAoreGNvbTE0MiBjb21wYXJlIC03OTE5LjMwMjU0IC02NjkuNjA3ODU0IC0+IC0xCit4ZGl2MTQyIGRpdmlkZSAtNzkxOS4zMDI1NCAtNjY5LjYwNzg1NCAtPiAxMS44MjY3NzY3IEluZXhhY3QgUm91bmRlZAoreGR2aTE0MiBkaXZpZGVpbnQgLTc5MTkuMzAyNTQgLTY2OS42MDc4NTQgLT4gMTEKK3htdWwxNDIgbXVsdGlwbHkgLTc5MTkuMzAyNTQgLTY2OS42MDc4NTQgLT4gNTMwMjgyNy4xOCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNDIgcG93ZXIgLTc5MTkuMzAyNTQgLTY3MCAtPiA3LjU4MTQ3NzI0RS0yNjEzIEluZXhhY3QgUm91bmRlZAoreHJlbTE0MiByZW1haW5kZXIgLTc5MTkuMzAyNTQgLTY2OS42MDc4NTQgLT4gLTU1My42MTYxNDYKK3hzdWIxNDIgc3VidHJhY3QgLTc5MTkuMzAyNTQgLTY2OS42MDc4NTQgLT4gLTcyNDkuNjk0NjkgSW5leGFjdCBSb3VuZGVkCit4YWRkMTQzIGFkZCA0NjEuNTgyODBFKzEzNjExMDgyMSA3MTA2NjYwNTIuRS0zODM3NTQyMzEgLT4gNC42MTU4MjgwMEUrMTM2MTEwODIzIEluZXhhY3QgUm91bmRlZAoreGNvbTE0MyBjb21wYXJlIDQ2MS41ODI4MEUrMTM2MTEwODIxIDcxMDY2NjA1Mi5FLTM4Mzc1NDIzMSAtPiAxCit4ZGl2MTQzIGRpdmlkZSA0NjEuNTgyODBFKzEzNjExMDgyMSA3MTA2NjYwNTIuRS0zODM3NTQyMzEgLT4gNi40OTUwNzMxNkUrNTE5ODY1MDQ1IEluZXhhY3QgUm91bmRlZAoreGR2aTE0MyBkaXZpZGVpbnQgNDYxLjU4MjgwRSsxMzYxMTA4MjEgNzEwNjY2MDUyLkUtMzgzNzU0MjMxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTQzIG11bHRpcGx5IDQ2MS41ODI4MEUrMTM2MTEwODIxIDcxMDY2NjA1Mi5FLTM4Mzc1NDIzMSAtPiAzLjI4MDMxMjI2RS0yNDc2NDMzOTkgSW5leGFjdCBSb3VuZGVkCit4cG93MTQzIHBvd2VyIDQ2MS41ODI4MEUrMTM2MTEwODIxIDcgLT4gNC40NjQyMzc4MUUrOTUyNzc1NzY1IEluZXhhY3QgUm91bmRlZAoreHJlbTE0MyByZW1haW5kZXIgNDYxLjU4MjgwRSsxMzYxMTA4MjEgNzEwNjY2MDUyLkUtMzgzNzU0MjMxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTQzIHN1YnRyYWN0IDQ2MS41ODI4MEUrMTM2MTEwODIxIDcxMDY2NjA1Mi5FLTM4Mzc1NDIzMSAtPiA0LjYxNTgyODAwRSsxMzYxMTA4MjMgSW5leGFjdCBSb3VuZGVkCit4YWRkMTQ0IGFkZCAzNDU1NzU1LjQ3RS0xMTI0NjU1MDYgNzcxLjY3NDMwNiAtPiA3NzEuNjc0MzA2IEluZXhhY3QgUm91bmRlZAoreGNvbTE0NCBjb21wYXJlIDM0NTU3NTUuNDdFLTExMjQ2NTUwNiA3NzEuNjc0MzA2IC0+IC0xCit4ZGl2MTQ0IGRpdmlkZSAzNDU1NzU1LjQ3RS0xMTI0NjU1MDYgNzcxLjY3NDMwNiAtPiA0LjQ3ODI1NjQ5RS0xMTI0NjU1MDMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTQ0IGRpdmlkZWludCAzNDU1NzU1LjQ3RS0xMTI0NjU1MDYgNzcxLjY3NDMwNiAtPiAwCit4bXVsMTQ0IG11bHRpcGx5IDM0NTU3NTUuNDdFLTExMjQ2NTUwNiA3NzEuNjc0MzA2IC0+IDIuNjY2NzE3NzBFLTExMjQ2NTQ5NyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNDQgcG93ZXIgMzQ1NTc1NS40N0UtMTEyNDY1NTA2IDc3MiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xNDQgcmVtYWluZGVyIDM0NTU3NTUuNDdFLTExMjQ2NTUwNiA3NzEuNjc0MzA2IC0+IDMuNDU1NzU1NDdFLTExMjQ2NTUwMAoreHN1YjE0NCBzdWJ0cmFjdCAzNDU1NzU1LjQ3RS0xMTI0NjU1MDYgNzcxLjY3NDMwNiAtPiAtNzcxLjY3NDMwNiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNDUgYWRkIC00NzcwNjc3NTcuRS05NjE2ODQ5NDAgNy43MDEyMjYwOEUtNzQxMDcyMjQ1IC0+IDcuNzAxMjI2MDhFLTc0MTA3MjI0NSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNDUgY29tcGFyZSAtNDc3MDY3NzU3LkUtOTYxNjg0OTQwIDcuNzAxMjI2MDhFLTc0MTA3MjI0NSAtPiAtMQoreGRpdjE0NSBkaXZpZGUgLTQ3NzA2Nzc1Ny5FLTk2MTY4NDk0MCA3LjcwMTIyNjA4RS03NDEwNzIyNDUgLT4gLTYuMTk0Njk4NzdFLTIyMDYxMjY4OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNDUgZGl2aWRlaW50IC00NzcwNjc3NTcuRS05NjE2ODQ5NDAgNy43MDEyMjYwOEUtNzQxMDcyMjQ1IC0+IC0wCit4bXVsMTQ1IG11bHRpcGx5IC00NzcwNjc3NTcuRS05NjE2ODQ5NDAgNy43MDEyMjYwOEUtNzQxMDcyMjQ1IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hwb3cxNDUgcG93ZXIgLTQ3NzA2Nzc1Ny5FLTk2MTY4NDk0MCA4IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTE0NSByZW1haW5kZXIgLTQ3NzA2Nzc1Ny5FLTk2MTY4NDk0MCA3LjcwMTIyNjA4RS03NDEwNzIyNDUgLT4gLTQuNzcwNjc3NTdFLTk2MTY4NDkzMgoreHN1YjE0NSBzdWJ0cmFjdCAtNDc3MDY3NzU3LkUtOTYxNjg0OTQwIDcuNzAxMjI2MDhFLTc0MTA3MjI0NSAtPiAtNy43MDEyMjYwOEUtNzQxMDcyMjQ1IEluZXhhY3QgUm91bmRlZAoreGFkZDE0NiBhZGQgNzY0ODIuMzUyIDgyMzc4MDYuOCAtPiA4MzE0Mjg5LjE1IEluZXhhY3QgUm91bmRlZAoreGNvbTE0NiBjb21wYXJlIDc2NDgyLjM1MiA4MjM3ODA2LjggLT4gLTEKK3hkaXYxNDYgZGl2aWRlIDc2NDgyLjM1MiA4MjM3ODA2LjggLT4gMC4wMDkyODQzMDk5OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNDYgZGl2aWRlaW50IDc2NDgyLjM1MiA4MjM3ODA2LjggLT4gMAoreG11bDE0NiBtdWx0aXBseSA3NjQ4Mi4zNTIgODIzNzgwNi44IC0+IDYuMzAwNDY4MzlFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzE0NiBwb3dlciA3NjQ4Mi4zNTIgODIzNzgwNyAtPiA4LjQ0MjE2NTU5RSs0MDIyOTgzNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNDYgcmVtYWluZGVyIDc2NDgyLjM1MiA4MjM3ODA2LjggLT4gNzY0ODIuMzUyCit4c3ViMTQ2IHN1YnRyYWN0IDc2NDgyLjM1MiA4MjM3ODA2LjggLT4gLTgxNjEzMjQuNDUgSW5leGFjdCBSb3VuZGVkCit4YWRkMTQ3IGFkZCAxLjIxNTA1MTY0RS01NjU1NTY1MDQgOS4yNjE0NjU3MyAtPiA5LjI2MTQ2NTczIEluZXhhY3QgUm91bmRlZAoreGNvbTE0NyBjb21wYXJlIDEuMjE1MDUxNjRFLTU2NTU1NjUwNCA5LjI2MTQ2NTczIC0+IC0xCit4ZGl2MTQ3IGRpdmlkZSAxLjIxNTA1MTY0RS01NjU1NTY1MDQgOS4yNjE0NjU3MyAtPiAxLjMxMTk0MzE0RS01NjU1NTY1MDUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTQ3IGRpdmlkZWludCAxLjIxNTA1MTY0RS01NjU1NTY1MDQgOS4yNjE0NjU3MyAtPiAwCit4bXVsMTQ3IG11bHRpcGx5IDEuMjE1MDUxNjRFLTU2NTU1NjUwNCA5LjI2MTQ2NTczIC0+IDEuMTI1MzE1OTFFLTU2NTU1NjUwMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNDcgcG93ZXIgMS4yMTUwNTE2NEUtNTY1NTU2NTA0IDkgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTQ3IHJlbWFpbmRlciAxLjIxNTA1MTY0RS01NjU1NTY1MDQgOS4yNjE0NjU3MyAtPiAxLjIxNTA1MTY0RS01NjU1NTY1MDQKK3hzdWIxNDcgc3VidHJhY3QgMS4yMTUwNTE2NEUtNTY1NTU2NTA0IDkuMjYxNDY1NzMgLT4gLTkuMjYxNDY1NzMgSW5leGFjdCBSb3VuZGVkCit4YWRkMTQ4IGFkZCAtODMwMzA2MC4yNUUtMTY5ODk0ODgzIDkwMTU2MS45ODUgLT4gOTAxNTYxLjk4NSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNDggY29tcGFyZSAtODMwMzA2MC4yNUUtMTY5ODk0ODgzIDkwMTU2MS45ODUgLT4gLTEKK3hkaXYxNDggZGl2aWRlIC04MzAzMDYwLjI1RS0xNjk4OTQ4ODMgOTAxNTYxLjk4NSAtPiAtOS4yMDk2Mzg4MUUtMTY5ODk0ODgzIEluZXhhY3QgUm91bmRlZAoreGR2aTE0OCBkaXZpZGVpbnQgLTgzMDMwNjAuMjVFLTE2OTg5NDg4MyA5MDE1NjEuOTg1IC0+IC0wCit4bXVsMTQ4IG11bHRpcGx5IC04MzAzMDYwLjI1RS0xNjk4OTQ4ODMgOTAxNTYxLjk4NSAtPiAtNy40ODU3MjM0OEUtMTY5ODk0ODcxIEluZXhhY3QgUm91bmRlZAoreHBvdzE0OCBwb3dlciAtODMwMzA2MC4yNUUtMTY5ODk0ODgzIDkwMTU2MiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xNDggcmVtYWluZGVyIC04MzAzMDYwLjI1RS0xNjk4OTQ4ODMgOTAxNTYxLjk4NSAtPiAtOC4zMDMwNjAyNUUtMTY5ODk0ODc3Cit4c3ViMTQ4IHN1YnRyYWN0IC04MzAzMDYwLjI1RS0xNjk4OTQ4ODMgOTAxNTYxLjk4NSAtPiAtOTAxNTYxLjk4NSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNDkgYWRkIC01OTI0NjQuOTIgNzE0NDU1MTAuNyAtPiA3MDg1MzA0NS44IEluZXhhY3QgUm91bmRlZAoreGNvbTE0OSBjb21wYXJlIC01OTI0NjQuOTIgNzE0NDU1MTAuNyAtPiAtMQoreGRpdjE0OSBkaXZpZGUgLTU5MjQ2NC45MiA3MTQ0NTUxMC43IC0+IC0wLjAwODI5MjU0MjMxIEluZXhhY3QgUm91bmRlZAoreGR2aTE0OSBkaXZpZGVpbnQgLTU5MjQ2NC45MiA3MTQ0NTUxMC43IC0+IC0wCit4bXVsMTQ5IG11bHRpcGx5IC01OTI0NjQuOTIgNzE0NDU1MTAuNyAtPiAtNC4yMzI4OTU4OEUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MTQ5IHBvd2VyIC01OTI0NjQuOTIgNzE0NDU1MTEgLT4gLTEuNTgyNjkxMDhFKzQxMjQzMDgzMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNDkgcmVtYWluZGVyIC01OTI0NjQuOTIgNzE0NDU1MTAuNyAtPiAtNTkyNDY0LjkyCit4c3ViMTQ5IHN1YnRyYWN0IC01OTI0NjQuOTIgNzE0NDU1MTAuNyAtPiAtNzIwMzc5NzUuNiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNTAgYWRkIC03Mzc3NC40MTY1IC0zOS44MjQzMDI3IC0+IC03MzgxNC4yNDA4IEluZXhhY3QgUm91bmRlZAoreGNvbTE1MCBjb21wYXJlIC03Mzc3NC40MTY1IC0zOS44MjQzMDI3IC0+IC0xCit4ZGl2MTUwIGRpdmlkZSAtNzM3NzQuNDE2NSAtMzkuODI0MzAyNyAtPiAxODUyLjQ5NzM4IEluZXhhY3QgUm91bmRlZAoreGR2aTE1MCBkaXZpZGVpbnQgLTczNzc0LjQxNjUgLTM5LjgyNDMwMjcgLT4gMTg1MgoreG11bDE1MCBtdWx0aXBseSAtNzM3NzQuNDE2NSAtMzkuODI0MzAyNyAtPiAyOTM4MDE0LjY5IEluZXhhY3QgUm91bmRlZAoreHBvdzE1MCBwb3dlciAtNzM3NzQuNDE2NSAtNDAgLT4gMS45MjIwNjc2NUUtMTk1IEluZXhhY3QgUm91bmRlZAoreHJlbTE1MCByZW1haW5kZXIgLTczNzc0LjQxNjUgLTM5LjgyNDMwMjcgLT4gLTE5LjgwNzg5OTYKK3hzdWIxNTAgc3VidHJhY3QgLTczNzc0LjQxNjUgLTM5LjgyNDMwMjcgLT4gLTczNzM0LjU5MjIgSW5leGFjdCBSb3VuZGVkCit4YWRkMTUxIGFkZCAtNTI0NzI0NzE1LiAtNTU3NjMuNzkzNyAtPiAtNTI0NzgwNDc5IEluZXhhY3QgUm91bmRlZAoreGNvbTE1MSBjb21wYXJlIC01MjQ3MjQ3MTUuIC01NTc2My43OTM3IC0+IC0xCit4ZGl2MTUxIGRpdmlkZSAtNTI0NzI0NzE1LiAtNTU3NjMuNzkzNyAtPiA5NDA5Ljc3NDM0IEluZXhhY3QgUm91bmRlZAoreGR2aTE1MSBkaXZpZGVpbnQgLTUyNDcyNDcxNS4gLTU1NzYzLjc5MzcgLT4gOTQwOQoreG11bDE1MSBtdWx0aXBseSAtNTI0NzI0NzE1LiAtNTU3NjMuNzkzNyAtPiAyLjkyNjA2NDA4RSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNTEgcG93ZXIgLTUyNDcyNDcxNS4gLTU1NzY0IC0+IDUuNDc4OTgzNTFFLTQ4NjI1OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNTEgcmVtYWluZGVyIC01MjQ3MjQ3MTUuIC01NTc2My43OTM3IC0+IC00MzE4MC4wNzY3Cit4c3ViMTUxIHN1YnRyYWN0IC01MjQ3MjQ3MTUuIC01NTc2My43OTM3IC0+IC01MjQ2Njg5NTEgSW5leGFjdCBSb3VuZGVkCit4YWRkMTUyIGFkZCA3LjUzODAwNDI3IDc4NDg3Mzc2OEUtOTk4MTE0NiAtPiA3LjUzODAwNDI3IEluZXhhY3QgUm91bmRlZAoreGNvbTE1MiBjb21wYXJlIDcuNTM4MDA0MjcgNzg0ODczNzY4RS05OTgxMTQ2IC0+IDEKK3hkaXYxNTIgZGl2aWRlIDcuNTM4MDA0MjcgNzg0ODczNzY4RS05OTgxMTQ2IC0+IDkuNjA0MDk3NjBFKzk5ODExMzcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTUyIGRpdmlkZWludCA3LjUzODAwNDI3IDc4NDg3Mzc2OEUtOTk4MTE0NiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDE1MiBtdWx0aXBseSA3LjUzODAwNDI3IDc4NDg3Mzc2OEUtOTk4MTE0NiAtPiA1LjkxNjM4MTgxRS05OTgxMTM3IEluZXhhY3QgUm91bmRlZAoreHBvdzE1MiBwb3dlciA3LjUzODAwNDI3IDggLT4gMTA0MjQzOTkuMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNTIgcmVtYWluZGVyIDcuNTM4MDA0MjcgNzg0ODczNzY4RS05OTgxMTQ2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTUyIHN1YnRyYWN0IDcuNTM4MDA0MjcgNzg0ODczNzY4RS05OTgxMTQ2IC0+IDcuNTM4MDA0MjcgSW5leGFjdCBSb3VuZGVkCit4YWRkMTUzIGFkZCAzNy42MDI3NDUyIDcuMjI0NTQyMzMgLT4gNDQuODI3Mjg3NSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNTMgY29tcGFyZSAzNy42MDI3NDUyIDcuMjI0NTQyMzMgLT4gMQoreGRpdjE1MyBkaXZpZGUgMzcuNjAyNzQ1MiA3LjIyNDU0MjMzIC0+IDUuMjA0ODYxOTEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTUzIGRpdmlkZWludCAzNy42MDI3NDUyIDcuMjI0NTQyMzMgLT4gNQoreG11bDE1MyBtdWx0aXBseSAzNy42MDI3NDUyIDcuMjI0NTQyMzMgLT4gMjcxLjY2MjYyNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNTMgcG93ZXIgMzcuNjAyNzQ1MiA3IC0+IDEuMDYzMDA4ODFFKzExIEluZXhhY3QgUm91bmRlZAoreHJlbTE1MyByZW1haW5kZXIgMzcuNjAyNzQ1MiA3LjIyNDU0MjMzIC0+IDEuNDgwMDMzNTUKK3hzdWIxNTMgc3VidHJhY3QgMzcuNjAyNzQ1MiA3LjIyNDU0MjMzIC0+IDMwLjM3ODIwMjkgSW5leGFjdCBSb3VuZGVkCit4YWRkMTU0IGFkZCAyNDQ3NjYwLjM5IC0zNjk4MS40MjUzIC0+IDI0MTA2NzguOTYgSW5leGFjdCBSb3VuZGVkCit4Y29tMTU0IGNvbXBhcmUgMjQ0NzY2MC4zOSAtMzY5ODEuNDI1MyAtPiAxCit4ZGl2MTU0IGRpdmlkZSAyNDQ3NjYwLjM5IC0zNjk4MS40MjUzIC0+IC02Ni4xODYyMTAyIEluZXhhY3QgUm91bmRlZAoreGR2aTE1NCBkaXZpZGVpbnQgMjQ0NzY2MC4zOSAtMzY5ODEuNDI1MyAtPiAtNjYKK3htdWwxNTQgbXVsdGlwbHkgMjQ0NzY2MC4zOSAtMzY5ODEuNDI1MyAtPiAtOS4wNTE3OTY5OUUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MTU0IHBvd2VyIDI0NDc2NjAuMzkgLTM2OTgxIC0+IDMuOTIwNjYwNjRFLTIzNjI2MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNTQgcmVtYWluZGVyIDI0NDc2NjAuMzkgLTM2OTgxLjQyNTMgLT4gNjg4Ni4zMjAyCit4c3ViMTU0IHN1YnRyYWN0IDI0NDc2NjAuMzkgLTM2OTgxLjQyNTMgLT4gMjQ4NDY0MS44MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNTUgYWRkIDIxNjAuMzY0MTkgMTQxOC4zMzU3NEUrNjU2MjY1MzgyIC0+IDEuNDE4MzM1NzRFKzY1NjI2NTM4NSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNTUgY29tcGFyZSAyMTYwLjM2NDE5IDE0MTguMzM1NzRFKzY1NjI2NTM4MiAtPiAtMQoreGRpdjE1NSBkaXZpZGUgMjE2MC4zNjQxOSAxNDE4LjMzNTc0RSs2NTYyNjUzODIgLT4gMS41MjMxNjg0MUUtNjU2MjY1MzgyIEluZXhhY3QgUm91bmRlZAoreGR2aTE1NSBkaXZpZGVpbnQgMjE2MC4zNjQxOSAxNDE4LjMzNTc0RSs2NTYyNjUzODIgLT4gMAoreG11bDE1NSBtdWx0aXBseSAyMTYwLjM2NDE5IDE0MTguMzM1NzRFKzY1NjI2NTM4MiAtPiAzLjA2NDEyMTc0RSs2NTYyNjUzODggSW5leGFjdCBSb3VuZGVkCit4cG93MTU1IHBvd2VyIDIxNjAuMzY0MTkgMSAtPiAyMTYwLjM2NDE5Cit4cmVtMTU1IHJlbWFpbmRlciAyMTYwLjM2NDE5IDE0MTguMzM1NzRFKzY1NjI2NTM4MiAtPiAyMTYwLjM2NDE5Cit4c3ViMTU1IHN1YnRyYWN0IDIxNjAuMzY0MTkgMTQxOC4zMzU3NEUrNjU2MjY1MzgyIC0+IC0xLjQxODMzNTc0RSs2NTYyNjUzODUgSW5leGFjdCBSb3VuZGVkCit4YWRkMTU2IGFkZCA4OTI2LjQ0OTM5IDU0Ljk0MzAwMjcgLT4gODk4MS4zOTIzOSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNTYgY29tcGFyZSA4OTI2LjQ0OTM5IDU0Ljk0MzAwMjcgLT4gMQoreGRpdjE1NiBkaXZpZGUgODkyNi40NDkzOSA1NC45NDMwMDI3IC0+IDE2Mi40Njc0NDcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTU2IGRpdmlkZWludCA4OTI2LjQ0OTM5IDU0Ljk0MzAwMjcgLT4gMTYyCit4bXVsMTU2IG11bHRpcGx5IDg5MjYuNDQ5MzkgNTQuOTQzMDAyNyAtPiA0OTA0NDUuOTMzIEluZXhhY3QgUm91bmRlZAoreHBvdzE1NiBwb3dlciA4OTI2LjQ0OTM5IDU1IC0+IDEuOTM3ODk4NzdFKzIxNyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNTYgcmVtYWluZGVyIDg5MjYuNDQ5MzkgNTQuOTQzMDAyNyAtPiAyNS42ODI5NTI2Cit4c3ViMTU2IHN1YnRyYWN0IDg5MjYuNDQ5MzkgNTQuOTQzMDAyNyAtPiA4ODcxLjUwNjM5IEluZXhhY3QgUm91bmRlZAoreGFkZDE1NyBhZGQgODYxNTg4MDI5IC00MTY1NzM5OEUrNzc5NTU5MjUgLT4gLTQuMTY1NzM5ODBFKzc3OTU1OTMyIEluZXhhY3QgUm91bmRlZAoreGNvbTE1NyBjb21wYXJlIDg2MTU4ODAyOSAtNDE2NTczOThFKzc3OTU1OTI1IC0+IDEKK3hkaXYxNTcgZGl2aWRlIDg2MTU4ODAyOSAtNDE2NTczOThFKzc3OTU1OTI1IC0+IC0yLjA2ODI3MTM1RS03Nzk1NTkyNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNTcgZGl2aWRlaW50IDg2MTU4ODAyOSAtNDE2NTczOThFKzc3OTU1OTI1IC0+IC0wCit4bXVsMTU3IG11bHRpcGx5IDg2MTU4ODAyOSAtNDE2NTczOThFKzc3OTU1OTI1IC0+IC0zLjU4OTE1MTU0RSs3Nzk1NTk0MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNTcgcG93ZXIgODYxNTg4MDI5IC00IC0+IDEuODE0Njg1NTNFLTM2IEluZXhhY3QgUm91bmRlZAoreHJlbTE1NyByZW1haW5kZXIgODYxNTg4MDI5IC00MTY1NzM5OEUrNzc5NTU5MjUgLT4gODYxNTg4MDI5Cit4c3ViMTU3IHN1YnRyYWN0IDg2MTU4ODAyOSAtNDE2NTczOThFKzc3OTU1OTI1IC0+IDQuMTY1NzM5ODBFKzc3OTU1OTMyIEluZXhhY3QgUm91bmRlZAoreGFkZDE1OCBhZGQgLTM0LjUyNTMwNjIgNTIuNjcyMjAxOSAtPiAxOC4xNDY4OTU3Cit4Y29tMTU4IGNvbXBhcmUgLTM0LjUyNTMwNjIgNTIuNjcyMjAxOSAtPiAtMQoreGRpdjE1OCBkaXZpZGUgLTM0LjUyNTMwNjIgNTIuNjcyMjAxOSAtPiAtMC42NTU0NzQ4OTkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTU4IGRpdmlkZWludCAtMzQuNTI1MzA2MiA1Mi42NzIyMDE5IC0+IC0wCit4bXVsMTU4IG11bHRpcGx5IC0zNC41MjUzMDYyIDUyLjY3MjIwMTkgLT4gLTE4MTguNTIzOTAgSW5leGFjdCBSb3VuZGVkCit4cG93MTU4IHBvd2VyIC0zNC41MjUzMDYyIDUzIC0+IC0zLjMyMTE1ODIxRSs4MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNTggcmVtYWluZGVyIC0zNC41MjUzMDYyIDUyLjY3MjIwMTkgLT4gLTM0LjUyNTMwNjIKK3hzdWIxNTggc3VidHJhY3QgLTM0LjUyNTMwNjIgNTIuNjcyMjAxOSAtPiAtODcuMTk3NTA4MQoreGFkZDE1OSBhZGQgLTE4ODYxNjQ3LiA5OTc5NDU4Ni43IC0+IDgwOTMyOTM5LjcKK3hjb20xNTkgY29tcGFyZSAtMTg4NjE2NDcuIDk5Nzk0NTg2LjcgLT4gLTEKK3hkaXYxNTkgZGl2aWRlIC0xODg2MTY0Ny4gOTk3OTQ1ODYuNyAtPiAtMC4xODkwMDQ3MTEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTU5IGRpdmlkZWludCAtMTg4NjE2NDcuIDk5Nzk0NTg2LjcgLT4gLTAKK3htdWwxNTkgbXVsdGlwbHkgLTE4ODYxNjQ3LiA5OTc5NDU4Ni43IC0+IC0xLjg4MjI5MDI3RSsxNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNTkgcG93ZXIgLTE4ODYxNjQ3LiA5OTc5NDU4NyAtPiAtNC4yODk1NzQ1OUUrNzI2MDYzNDYyIEluZXhhY3QgUm91bmRlZAoreHJlbTE1OSByZW1haW5kZXIgLTE4ODYxNjQ3LiA5OTc5NDU4Ni43IC0+IC0xODg2MTY0Ny4wCit4c3ViMTU5IHN1YnRyYWN0IC0xODg2MTY0Ny4gOTk3OTQ1ODYuNyAtPiAtMTE4NjU2MjM0IEluZXhhY3QgUm91bmRlZAoreGFkZDE2MCBhZGQgMzIyMTkyLjQwNyA0NjEuNjcwNDQgLT4gMzIyNjU0LjA3NyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNjAgY29tcGFyZSAzMjIxOTIuNDA3IDQ2MS42NzA0NCAtPiAxCit4ZGl2MTYwIGRpdmlkZSAzMjIxOTIuNDA3IDQ2MS42NzA0NCAtPiA2OTcuODgzOTg2IEluZXhhY3QgUm91bmRlZAoreGR2aTE2MCBkaXZpZGVpbnQgMzIyMTkyLjQwNyA0NjEuNjcwNDQgLT4gNjk3Cit4bXVsMTYwIG11bHRpcGx5IDMyMjE5Mi40MDcgNDYxLjY3MDQ0IC0+IDE0ODc0NjcxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNjAgcG93ZXIgMzIyMTkyLjQwNyA0NjIgLT4gNS42MTM5NTg3M0UrMjU0NCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNjAgcmVtYWluZGVyIDMyMjE5Mi40MDcgNDYxLjY3MDQ0IC0+IDQwOC4xMTAzMgoreHN1YjE2MCBzdWJ0cmFjdCAzMjIxOTIuNDA3IDQ2MS42NzA0NCAtPiAzMjE3MzAuNzM3IEluZXhhY3QgUm91bmRlZAoreGFkZDE2MSBhZGQgLTg5NjI5ODUxOEUrNjE0MTIzMTQgNzg4NzMuODA0OSAtPiAtOC45NjI5ODUxOEUrNjE0MTIzMjIgSW5leGFjdCBSb3VuZGVkCit4Y29tMTYxIGNvbXBhcmUgLTg5NjI5ODUxOEUrNjE0MTIzMTQgNzg4NzMuODA0OSAtPiAtMQoreGRpdjE2MSBkaXZpZGUgLTg5NjI5ODUxOEUrNjE0MTIzMTQgNzg4NzMuODA0OSAtPiAtMS4xMzYzNzAzM0UrNjE0MTIzMTggSW5leGFjdCBSb3VuZGVkCit4ZHZpMTYxIGRpdmlkZWludCAtODk2Mjk4NTE4RSs2MTQxMjMxNCA3ODg3My44MDQ5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTYxIG11bHRpcGx5IC04OTYyOTg1MThFKzYxNDEyMzE0IDc4ODczLjgwNDkgLT4gLTcuMDY5NDQ3NDRFKzYxNDEyMzI3IEluZXhhY3QgUm91bmRlZAoreHBvdzE2MSBwb3dlciAtODk2Mjk4NTE4RSs2MTQxMjMxNCA3ODg3NCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNjEgcmVtYWluZGVyIC04OTYyOTg1MThFKzYxNDEyMzE0IDc4ODczLjgwNDkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxNjEgc3VidHJhY3QgLTg5NjI5ODUxOEUrNjE0MTIzMTQgNzg4NzMuODA0OSAtPiAtOC45NjI5ODUxOEUrNjE0MTIzMjIgSW5leGFjdCBSb3VuZGVkCit4YWRkMTYyIGFkZCAyOTMuNzczNzMyIDQ3OTg5OTA1MkUrNzg5OTUwMTc3IC0+IDQuNzk4OTkwNTJFKzc4OTk1MDE4NSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNjIgY29tcGFyZSAyOTMuNzczNzMyIDQ3OTg5OTA1MkUrNzg5OTUwMTc3IC0+IC0xCit4ZGl2MTYyIGRpdmlkZSAyOTMuNzczNzMyIDQ3OTg5OTA1MkUrNzg5OTUwMTc3IC0+IDYuMTIxNTczNTBFLTc4OTk1MDE4NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNjIgZGl2aWRlaW50IDI5My43NzM3MzIgNDc5ODk5MDUyRSs3ODk5NTAxNzcgLT4gMAoreG11bDE2MiBtdWx0aXBseSAyOTMuNzczNzMyIDQ3OTg5OTA1MkUrNzg5OTUwMTc3IC0+IDEuNDA5ODE3MzVFKzc4OTk1MDE4OCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNjIgcG93ZXIgMjkzLjc3MzczMiA1IC0+IDIuMTg4MDg4MDlFKzEyIEluZXhhY3QgUm91bmRlZAoreHJlbTE2MiByZW1haW5kZXIgMjkzLjc3MzczMiA0Nzk4OTkwNTJFKzc4OTk1MDE3NyAtPiAyOTMuNzczNzMyCit4c3ViMTYyIHN1YnRyYWN0IDI5My43NzM3MzIgNDc5ODk5MDUyRSs3ODk5NTAxNzcgLT4gLTQuNzk4OTkwNTJFKzc4OTk1MDE4NSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNjMgYWRkIC0xMDM1MTkzNjIgNTE4OTc5NTUuMyAtPiAtNTE2MjE0MDYuNworeGNvbTE2MyBjb21wYXJlIC0xMDM1MTkzNjIgNTE4OTc5NTUuMyAtPiAtMQoreGRpdjE2MyBkaXZpZGUgLTEwMzUxOTM2MiA1MTg5Nzk1NS4zIC0+IC0xLjk5NDY3MTMwIEluZXhhY3QgUm91bmRlZAoreGR2aTE2MyBkaXZpZGVpbnQgLTEwMzUxOTM2MiA1MTg5Nzk1NS4zIC0+IC0xCit4bXVsMTYzIG11bHRpcGx5IC0xMDM1MTkzNjIgNTE4OTc5NTUuMyAtPiAtNS4zNzI0NDMyMkUrMTUgSW5leGFjdCBSb3VuZGVkCit4cG93MTYzIHBvd2VyIC0xMDM1MTkzNjIgNTE4OTc5NTUgLT4gLTQuMjg4NTgyMjlFKzQxNTk2MzIyOSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNjMgcmVtYWluZGVyIC0xMDM1MTkzNjIgNTE4OTc5NTUuMyAtPiAtNTE2MjE0MDYuNworeHN1YjE2MyBzdWJ0cmFjdCAtMTAzNTE5MzYyIDUxODk3OTU1LjMgLT4gLTE1NTQxNzMxNyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNjQgYWRkIDM3MzgwLjc4MDIgLTI3NzcxOTc4OC4gLT4gLTI3NzY4MjQwNyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNjQgY29tcGFyZSAzNzM4MC43ODAyIC0yNzc3MTk3ODguIC0+IDEKK3hkaXYxNjQgZGl2aWRlIDM3MzgwLjc4MDIgLTI3NzcxOTc4OC4gLT4gLTAuMDAwMTM0NTk4OTA4IEluZXhhY3QgUm91bmRlZAoreGR2aTE2NCBkaXZpZGVpbnQgMzczODAuNzgwMiAtMjc3NzE5Nzg4LiAtPiAtMAoreG11bDE2NCBtdWx0aXBseSAzNzM4MC43ODAyIC0yNzc3MTk3ODguIC0+IC0xLjAzODEzODI0RSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNjQgcG93ZXIgMzczODAuNzgwMiAtMjc3NzE5Nzg4IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTE2NCByZW1haW5kZXIgMzczODAuNzgwMiAtMjc3NzE5Nzg4LiAtPiAzNzM4MC43ODAyCit4c3ViMTY0IHN1YnRyYWN0IDM3MzgwLjc4MDIgLTI3NzcxOTc4OC4gLT4gMjc3NzU3MTY5IEluZXhhY3QgUm91bmRlZAoreGFkZDE2NSBhZGQgMzIwMTMzODQ0LiAtOTc3NTE3NDc3IC0+IC02NTczODM2MzMKK3hjb20xNjUgY29tcGFyZSAzMjAxMzM4NDQuIC05Nzc1MTc0NzcgLT4gMQoreGRpdjE2NSBkaXZpZGUgMzIwMTMzODQ0LiAtOTc3NTE3NDc3IC0+IC0wLjMyNzQ5Njc5OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNjUgZGl2aWRlaW50IDMyMDEzMzg0NC4gLTk3NzUxNzQ3NyAtPiAtMAoreG11bDE2NSBtdWx0aXBseSAzMjAxMzM4NDQuIC05Nzc1MTc0NzcgLT4gLTMuMTI5MzY0MjdFKzE3IEluZXhhY3QgUm91bmRlZAoreHBvdzE2NSBwb3dlciAzMjAxMzM4NDQuIC05Nzc1MTc0NzcgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTY1IHJlbWFpbmRlciAzMjAxMzM4NDQuIC05Nzc1MTc0NzcgLT4gMzIwMTMzODQ0Cit4c3ViMTY1IHN1YnRyYWN0IDMyMDEzMzg0NC4gLTk3NzUxNzQ3NyAtPiAxLjI5NzY1MTMyRSs5IEluZXhhY3QgUm91bmRlZAoreGFkZDE2NiBhZGQgNzIxNzc2NzAxRSs5MzM2NDYxNjEgLTU2ODkyNzkuNjRFKzY2OTkwMzY0NSAtPiA3LjIxNzc2NzAxRSs5MzM2NDYxNjkgSW5leGFjdCBSb3VuZGVkCit4Y29tMTY2IGNvbXBhcmUgNzIxNzc2NzAxRSs5MzM2NDYxNjEgLTU2ODkyNzkuNjRFKzY2OTkwMzY0NSAtPiAxCit4ZGl2MTY2IGRpdmlkZSA3MjE3NzY3MDFFKzkzMzY0NjE2MSAtNTY4OTI3OS42NEUrNjY5OTAzNjQ1IC0+IC0xLjI2ODY2MDk3RSsyNjM3NDI1MTggSW5leGFjdCBSb3VuZGVkCit4ZHZpMTY2IGRpdmlkZWludCA3MjE3NzY3MDFFKzkzMzY0NjE2MSAtNTY4OTI3OS42NEUrNjY5OTAzNjQ1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTY2IG11bHRpcGx5IDcyMTc3NjcwMUUrOTMzNjQ2MTYxIC01Njg5Mjc5LjY0RSs2Njk5MDM2NDUgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAoreHBvdzE2NiBwb3dlciA3MjE3NzY3MDFFKzkzMzY0NjE2MSAtNiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xNjYgcmVtYWluZGVyIDcyMTc3NjcwMUUrOTMzNjQ2MTYxIC01Njg5Mjc5LjY0RSs2Njk5MDM2NDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxNjYgc3VidHJhY3QgNzIxNzc2NzAxRSs5MzM2NDYxNjEgLTU2ODkyNzkuNjRFKzY2OTkwMzY0NSAtPiA3LjIxNzc2NzAxRSs5MzM2NDYxNjkgSW5leGFjdCBSb3VuZGVkCit4YWRkMTY3IGFkZCAtNTQwOS4wMDQ4MiAtMi4xNjE0OTM4NiAtPiAtNTQxMS4xNjYzMSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNjcgY29tcGFyZSAtNTQwOS4wMDQ4MiAtMi4xNjE0OTM4NiAtPiAtMQoreGRpdjE2NyBkaXZpZGUgLTU0MDkuMDA0ODIgLTIuMTYxNDkzODYgLT4gMjUwMi40MzgyMSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNjcgZGl2aWRlaW50IC01NDA5LjAwNDgyIC0yLjE2MTQ5Mzg2IC0+IDI1MDIKK3htdWwxNjcgbXVsdGlwbHkgLTU0MDkuMDA0ODIgLTIuMTYxNDkzODYgLT4gMTE2OTEuNTMwNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNjcgcG93ZXIgLTU0MDkuMDA0ODIgLTIgLT4gMy40MTc5NDY1MkUtOCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNjcgcmVtYWluZGVyIC01NDA5LjAwNDgyIC0yLjE2MTQ5Mzg2IC0+IC0wLjk0NzE4MjI4Cit4c3ViMTY3IHN1YnRyYWN0IC01NDA5LjAwNDgyIC0yLjE2MTQ5Mzg2IC0+IC01NDA2Ljg0MzMzIEluZXhhY3QgUm91bmRlZAoreGFkZDE2OCBhZGQgLTk1Nzk2MC4zNjcgMzIyLjg1ODE3MCAtPiAtOTU3NjM3LjUwOSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNjggY29tcGFyZSAtOTU3OTYwLjM2NyAzMjIuODU4MTcwIC0+IC0xCit4ZGl2MTY4IGRpdmlkZSAtOTU3OTYwLjM2NyAzMjIuODU4MTcwIC0+IC0yOTY3LjEyNDQ0IEluZXhhY3QgUm91bmRlZAoreGR2aTE2OCBkaXZpZGVpbnQgLTk1Nzk2MC4zNjcgMzIyLjg1ODE3MCAtPiAtMjk2NworeG11bDE2OCBtdWx0aXBseSAtOTU3OTYwLjM2NyAzMjIuODU4MTcwIC0+IC0zMDkyODUzMzEgSW5leGFjdCBSb3VuZGVkCit4cG93MTY4IHBvd2VyIC05NTc5NjAuMzY3IDMyMyAtPiAtOS40NDYxNzQ2MEUrMTkzMSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNjggcmVtYWluZGVyIC05NTc5NjAuMzY3IDMyMi44NTgxNzAgLT4gLTQwLjE3NjYxMAoreHN1YjE2OCBzdWJ0cmFjdCAtOTU3OTYwLjM2NyAzMjIuODU4MTcwIC0+IC05NTgyODMuMjI1IEluZXhhY3QgUm91bmRlZAoreGFkZDE2OSBhZGQgLTExODE3Ljg3NTRFKzYxMzg5MzQ0MiAtMy44NDczNTA4MkUrODg4MzMzMjQ5IC0+IC0zLjg0NzM1MDgyRSs4ODgzMzMyNDkgSW5leGFjdCBSb3VuZGVkCit4Y29tMTY5IGNvbXBhcmUgLTExODE3Ljg3NTRFKzYxMzg5MzQ0MiAtMy44NDczNTA4MkUrODg4MzMzMjQ5IC0+IDEKK3hkaXYxNjkgZGl2aWRlIC0xMTgxNy44NzU0RSs2MTM4OTM0NDIgLTMuODQ3MzUwODJFKzg4ODMzMzI0OSAtPiAzLjA3MTY5MTY1RS0yNzQ0Mzk4MDQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTY5IGRpdmlkZWludCAtMTE4MTcuODc1NEUrNjEzODkzNDQyIC0zLjg0NzM1MDgyRSs4ODgzMzMyNDkgLT4gMAoreG11bDE2OSBtdWx0aXBseSAtMTE4MTcuODc1NEUrNjEzODkzNDQyIC0zLjg0NzM1MDgyRSs4ODgzMzMyNDkgLT4gSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCit4cG93MTY5IHBvd2VyIC0xMTgxNy44NzU0RSs2MTM4OTM0NDIgLTQgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTY5IHJlbWFpbmRlciAtMTE4MTcuODc1NEUrNjEzODkzNDQyIC0zLjg0NzM1MDgyRSs4ODgzMzMyNDkgLT4gLTEuMTgxNzg3NTRFKzYxMzg5MzQ0NgoreHN1YjE2OSBzdWJ0cmFjdCAtMTE4MTcuODc1NEUrNjEzODkzNDQyIC0zLjg0NzM1MDgyRSs4ODgzMzMyNDkgLT4gMy44NDczNTA4MkUrODg4MzMzMjQ5IEluZXhhY3QgUm91bmRlZAoreGFkZDE3MCBhZGQgODQwMjU4MjAzIDU4MzYzLjk4MEUtOTA2NTg0NzIzIC0+IDg0MDI1ODIwMyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNzAgY29tcGFyZSA4NDAyNTgyMDMgNTgzNjMuOTgwRS05MDY1ODQ3MjMgLT4gMQoreGRpdjE3MCBkaXZpZGUgODQwMjU4MjAzIDU4MzYzLjk4MEUtOTA2NTg0NzIzIC0+IDEuNDM5Njg2MjZFKzkwNjU4NDcyNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNzAgZGl2aWRlaW50IDg0MDI1ODIwMyA1ODM2My45ODBFLTkwNjU4NDcyMyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDE3MCBtdWx0aXBseSA4NDAyNTgyMDMgNTgzNjMuOTgwRS05MDY1ODQ3MjMgLT4gNC45MDQwODEzMEUtOTA2NTg0NzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzE3MCBwb3dlciA4NDAyNTgyMDMgNiAtPiAzLjUxOTQ2NDMxRSs1MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNzAgcmVtYWluZGVyIDg0MDI1ODIwMyA1ODM2My45ODBFLTkwNjU4NDcyMyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjE3MCBzdWJ0cmFjdCA4NDAyNTgyMDMgNTgzNjMuOTgwRS05MDY1ODQ3MjMgLT4gODQwMjU4MjAzIEluZXhhY3QgUm91bmRlZAoreGFkZDE3MSBhZGQgLTIwNTg0MjA5Ni4gLTE5MTM0Mi43MjEgLT4gLTIwNjAzMzQzOSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNzEgY29tcGFyZSAtMjA1ODQyMDk2LiAtMTkxMzQyLjcyMSAtPiAtMQoreGRpdjE3MSBkaXZpZGUgLTIwNTg0MjA5Ni4gLTE5MTM0Mi43MjEgLT4gMTA3NS43NzY5OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNzEgZGl2aWRlaW50IC0yMDU4NDIwOTYuIC0xOTEzNDIuNzIxIC0+IDEwNzUKK3htdWwxNzEgbXVsdGlwbHkgLTIwNTg0MjA5Ni4gLTE5MTM0Mi43MjEgLT4gMy45Mzg2Mzg2N0UrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MTcxIHBvd2VyIC0yMDU4NDIwOTYuIC0xOTEzNDMgLT4gLTIuNjY5NTU1NTNFLTE1OTA3MzcgSW5leGFjdCBSb3VuZGVkCit4cmVtMTcxIHJlbWFpbmRlciAtMjA1ODQyMDk2LiAtMTkxMzQyLjcyMSAtPiAtMTQ4NjcwLjkyNQoreHN1YjE3MSBzdWJ0cmFjdCAtMjA1ODQyMDk2LiAtMTkxMzQyLjcyMSAtPiAtMjA1NjUwNzUzIEluZXhhY3QgUm91bmRlZAoreGFkZDE3MiBhZGQgNDI1MDExMjQuIDg4NC45Mzg0OThFKzEyMzM0MTQ4MCAtPiA4Ljg0OTM4NDk4RSsxMjMzNDE0ODIgSW5leGFjdCBSb3VuZGVkCit4Y29tMTcyIGNvbXBhcmUgNDI1MDExMjQuIDg4NC45Mzg0OThFKzEyMzM0MTQ4MCAtPiAtMQoreGRpdjE3MiBkaXZpZGUgNDI1MDExMjQuIDg4NC45Mzg0OThFKzEyMzM0MTQ4MCAtPiA0LjgwMjcyMDY1RS0xMjMzNDE0NzYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTcyIGRpdmlkZWludCA0MjUwMTEyNC4gODg0LjkzODQ5OEUrMTIzMzQxNDgwIC0+IDAKK3htdWwxNzIgbXVsdGlwbHkgNDI1MDExMjQuIDg4NC45Mzg0OThFKzEyMzM0MTQ4MCAtPiAzLjc2MTA4ODA4RSsxMjMzNDE0OTAgSW5leGFjdCBSb3VuZGVkCit4cG93MTcyIHBvd2VyIDQyNTAxMTI0LiA5IC0+IDQuNTI0ODQ1MzZFKzY4IEluZXhhY3QgUm91bmRlZAoreHJlbTE3MiByZW1haW5kZXIgNDI1MDExMjQuIDg4NC45Mzg0OThFKzEyMzM0MTQ4MCAtPiA0MjUwMTEyNAoreHN1YjE3MiBzdWJ0cmFjdCA0MjUwMTEyNC4gODg0LjkzODQ5OEUrMTIzMzQxNDgwIC0+IC04Ljg0OTM4NDk4RSsxMjMzNDE0ODIgSW5leGFjdCBSb3VuZGVkCit4YWRkMTczIGFkZCAtNTc4MDk0NTIuIC02MjAzODA3NDYgLT4gLTY3ODE5MDE5OAoreGNvbTE3MyBjb21wYXJlIC01NzgwOTQ1Mi4gLTYyMDM4MDc0NiAtPiAxCit4ZGl2MTczIGRpdmlkZSAtNTc4MDk0NTIuIC02MjAzODA3NDYgLT4gMC4wOTMxODM4MjY4IEluZXhhY3QgUm91bmRlZAoreGR2aTE3MyBkaXZpZGVpbnQgLTU3ODA5NDUyLiAtNjIwMzgwNzQ2IC0+IDAKK3htdWwxNzMgbXVsdGlwbHkgLTU3ODA5NDUyLiAtNjIwMzgwNzQ2IC0+IDMuNTg2Mzg3MTBFKzE2IEluZXhhY3QgUm91bmRlZAoreHBvdzE3MyBwb3dlciAtNTc4MDk0NTIuIC02MjAzODA3NDYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTczIHJlbWFpbmRlciAtNTc4MDk0NTIuIC02MjAzODA3NDYgLT4gLTU3ODA5NDUyCit4c3ViMTczIHN1YnRyYWN0IC01NzgwOTQ1Mi4gLTYyMDM4MDc0NiAtPiA1NjI1NzEyOTQKK3hhZGQxNzQgYWRkIC04MDIyMzcwLjMxIDk4NTg1ODEuNiAtPiAxODM2MjExLjI5Cit4Y29tMTc0IGNvbXBhcmUgLTgwMjIzNzAuMzEgOTg1ODU4MS42IC0+IC0xCit4ZGl2MTc0IGRpdmlkZSAtODAyMjM3MC4zMSA5ODU4NTgxLjYgLT4gLTAuODEzNzQ0ODgxIEluZXhhY3QgUm91bmRlZAoreGR2aTE3NCBkaXZpZGVpbnQgLTgwMjIzNzAuMzEgOTg1ODU4MS42IC0+IC0wCit4bXVsMTc0IG11bHRpcGx5IC04MDIyMzcwLjMxIDk4NTg1ODEuNiAtPiAtNy45MDg5MTkyM0UrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MTc0IHBvd2VyIC04MDIyMzcwLjMxIDk4NTg1ODIgLT4gMi4zNDQ1ODI0OUUrNjgwNjY2MzQgSW5leGFjdCBSb3VuZGVkCit4cmVtMTc0IHJlbWFpbmRlciAtODAyMjM3MC4zMSA5ODU4NTgxLjYgLT4gLTgwMjIzNzAuMzEKK3hzdWIxNzQgc3VidHJhY3QgLTgwMjIzNzAuMzEgOTg1ODU4MS42IC0+IC0xNzg4MDk1MS45IEluZXhhY3QgUm91bmRlZAoreGFkZDE3NSBhZGQgMi40OTA2NTA2MEUrNTkyMTM5MTQxIC01NDMyLjcyMDE0RS00MTk5NjUzNTcgLT4gMi40OTA2NTA2MEUrNTkyMTM5MTQxIEluZXhhY3QgUm91bmRlZAoreGNvbTE3NSBjb21wYXJlIDIuNDkwNjUwNjBFKzU5MjEzOTE0MSAtNTQzMi43MjAxNEUtNDE5OTY1MzU3IC0+IDEKK3hkaXYxNzUgZGl2aWRlIDIuNDkwNjUwNjBFKzU5MjEzOTE0MSAtNTQzMi43MjAxNEUtNDE5OTY1MzU3IC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3hkdmkxNzUgZGl2aWRlaW50IDIuNDkwNjUwNjBFKzU5MjEzOTE0MSAtNTQzMi43MjAxNEUtNDE5OTY1MzU3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTc1IG11bHRpcGx5IDIuNDkwNjUwNjBFKzU5MjEzOTE0MSAtNTQzMi43MjAxNEUtNDE5OTY1MzU3IC0+IC0xLjM1MzEwMDc3RSsxNzIxNzM3ODggSW5leGFjdCBSb3VuZGVkCit4cG93MTc1IHBvd2VyIDIuNDkwNjUwNjBFKzU5MjEzOTE0MSAtNSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xNzUgcmVtYWluZGVyIDIuNDkwNjUwNjBFKzU5MjEzOTE0MSAtNTQzMi43MjAxNEUtNDE5OTY1MzU3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTc1IHN1YnRyYWN0IDIuNDkwNjUwNjBFKzU5MjEzOTE0MSAtNTQzMi43MjAxNEUtNDE5OTY1MzU3IC0+IDIuNDkwNjUwNjBFKzU5MjEzOTE0MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNzYgYWRkIC02OTcyNzM3MTVFLTI0MjgyNDg3MCAtMy44MTc1NzUwNiAtPiAtMy44MTc1NzUwNiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNzYgY29tcGFyZSAtNjk3MjczNzE1RS0yNDI4MjQ4NzAgLTMuODE3NTc1MDYgLT4gMQoreGRpdjE3NiBkaXZpZGUgLTY5NzI3MzcxNUUtMjQyODI0ODcwIC0zLjgxNzU3NTA2IC0+IDEuODI2NDgzMzFFLTI0MjgyNDg2MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNzYgZGl2aWRlaW50IC02OTcyNzM3MTVFLTI0MjgyNDg3MCAtMy44MTc1NzUwNiAtPiAwCit4bXVsMTc2IG11bHRpcGx5IC02OTcyNzM3MTVFLTI0MjgyNDg3MCAtMy44MTc1NzUwNiAtPiAyLjY2MTg5NDc0RS0yNDI4MjQ4NjEgSW5leGFjdCBSb3VuZGVkCit4cG93MTc2IHBvd2VyIC02OTcyNzM3MTVFLTI0MjgyNDg3MCAtNCAtPiA0LjIzMDQ1MjUxRSs5NzEyOTk0NDQgSW5leGFjdCBSb3VuZGVkCit4cmVtMTc2IHJlbWFpbmRlciAtNjk3MjczNzE1RS0yNDI4MjQ4NzAgLTMuODE3NTc1MDYgLT4gLTYuOTcyNzM3MTVFLTI0MjgyNDg2MgoreHN1YjE3NiBzdWJ0cmFjdCAtNjk3MjczNzE1RS0yNDI4MjQ4NzAgLTMuODE3NTc1MDYgLT4gMy44MTc1NzUwNiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNzcgYWRkIC03LjQyMjA0NDAzRS0zMTU3MTYyODAgLTgxNTYxMTEuNjdFKzI4MzI2MTYzNiAtPiAtOC4xNTYxMTE2N0UrMjgzMjYxNjQyIEluZXhhY3QgUm91bmRlZAoreGNvbTE3NyBjb21wYXJlIC03LjQyMjA0NDAzRS0zMTU3MTYyODAgLTgxNTYxMTEuNjdFKzI4MzI2MTYzNiAtPiAxCit4ZGl2MTc3IGRpdmlkZSAtNy40MjIwNDQwM0UtMzE1NzE2MjgwIC04MTU2MTExLjY3RSsyODMyNjE2MzYgLT4gOS4wOTk5Nzg0M0UtNTk4OTc3OTIzIEluZXhhY3QgUm91bmRlZAoreGR2aTE3NyBkaXZpZGVpbnQgLTcuNDIyMDQ0MDNFLTMxNTcxNjI4MCAtODE1NjExMS42N0UrMjgzMjYxNjM2IC0+IDAKK3htdWwxNzcgbXVsdGlwbHkgLTcuNDIyMDQ0MDNFLTMxNTcxNjI4MCAtODE1NjExMS42N0UrMjgzMjYxNjM2IC0+IDYuMDUzNTAxOTlFLTMyNDU0NjM3IEluZXhhY3QgUm91bmRlZAoreHBvdzE3NyBwb3dlciAtNy40MjIwNDQwM0UtMzE1NzE2MjgwIC04IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTE3NyByZW1haW5kZXIgLTcuNDIyMDQ0MDNFLTMxNTcxNjI4MCAtODE1NjExMS42N0UrMjgzMjYxNjM2IC0+IC03LjQyMjA0NDAzRS0zMTU3MTYyODAKK3hzdWIxNzcgc3VidHJhY3QgLTcuNDIyMDQ0MDNFLTMxNTcxNjI4MCAtODE1NjExMS42N0UrMjgzMjYxNjM2IC0+IDguMTU2MTExNjdFKzI4MzI2MTY0MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNzggYWRkIDczODA2Mzg5MiA4OTkwMDQ2Ny44IC0+IDgyNzk2NDM2MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNzggY29tcGFyZSA3MzgwNjM4OTIgODk5MDA0NjcuOCAtPiAxCit4ZGl2MTc4IGRpdmlkZSA3MzgwNjM4OTIgODk5MDA0NjcuOCAtPiA4LjIwOTc4OTIzIEluZXhhY3QgUm91bmRlZAoreGR2aTE3OCBkaXZpZGVpbnQgNzM4MDYzODkyIDg5OTAwNDY3LjggLT4gOAoreG11bDE3OCBtdWx0aXBseSA3MzgwNjM4OTIgODk5MDA0NjcuOCAtPiA2LjYzNTIyODkyRSsxNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNzggcG93ZXIgNzM4MDYzODkyIDg5OTAwNDY4IC0+IDEuNTMxNjY3MjNFKzc5NzI0NTc5NyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNzggcmVtYWluZGVyIDczODA2Mzg5MiA4OTkwMDQ2Ny44IC0+IDE4ODYwMTQ5LjYKK3hzdWIxNzggc3VidHJhY3QgNzM4MDYzODkyIDg5OTAwNDY3LjggLT4gNjQ4MTYzNDI0IEluZXhhY3QgUm91bmRlZAoreGFkZDE3OSBhZGQgLTYzMDMwOTM2NiAtODg0NzgzLjMzOEUtMjE1OTU0MTAgLT4gLTYzMDMwOTM2NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNzkgY29tcGFyZSAtNjMwMzA5MzY2IC04ODQ3ODMuMzM4RS0yMTU5NTQxMCAtPiAtMQoreGRpdjE3OSBkaXZpZGUgLTYzMDMwOTM2NiAtODg0NzgzLjMzOEUtMjE1OTU0MTAgLT4gNy4xMjM4ODM3N0UrMjE1OTU0MTIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTc5IGRpdmlkZWludCAtNjMwMzA5MzY2IC04ODQ3ODMuMzM4RS0yMTU5NTQxMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDE3OSBtdWx0aXBseSAtNjMwMzA5MzY2IC04ODQ3ODMuMzM4RS0yMTU5NTQxMCAtPiA1LjU3Njg3MjI1RS0yMTU5NTM5NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNzkgcG93ZXIgLTYzMDMwOTM2NiAtOSAtPiAtNi4zNjgxOTIxMEUtODAgSW5leGFjdCBSb3VuZGVkCit4cmVtMTc5IHJlbWFpbmRlciAtNjMwMzA5MzY2IC04ODQ3ODMuMzM4RS0yMTU5NTQxMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjE3OSBzdWJ0cmFjdCAtNjMwMzA5MzY2IC04ODQ3ODMuMzM4RS0yMTU5NTQxMCAtPiAtNjMwMzA5MzY2IEluZXhhY3QgUm91bmRlZAoreGFkZDE4MCBhZGQgNjEzLjIwNzc3NCAtMzAwNy43ODYwOCAtPiAtMjM5NC41NzgzMSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xODAgY29tcGFyZSA2MTMuMjA3Nzc0IC0zMDA3Ljc4NjA4IC0+IDEKK3hkaXYxODAgZGl2aWRlIDYxMy4yMDc3NzQgLTMwMDcuNzg2MDggLT4gLTAuMjAzODczNDY2IEluZXhhY3QgUm91bmRlZAoreGR2aTE4MCBkaXZpZGVpbnQgNjEzLjIwNzc3NCAtMzAwNy43ODYwOCAtPiAtMAoreG11bDE4MCBtdWx0aXBseSA2MTMuMjA3Nzc0IC0zMDA3Ljc4NjA4IC0+IC0xODQ0Mzk3LjgxIEluZXhhY3QgUm91bmRlZAoreHBvdzE4MCBwb3dlciA2MTMuMjA3Nzc0IC0zMDA4IC0+IDcuNTE5MzkxNjBFLTgzODYgSW5leGFjdCBSb3VuZGVkCit4cmVtMTgwIHJlbWFpbmRlciA2MTMuMjA3Nzc0IC0zMDA3Ljc4NjA4IC0+IDYxMy4yMDc3NzQKK3hzdWIxODAgc3VidHJhY3QgNjEzLjIwNzc3NCAtMzAwNy43ODYwOCAtPiAzNjIwLjk5Mzg1IEluZXhhY3QgUm91bmRlZAoreGFkZDE4MSBhZGQgLTkzMDA2MjIyLjMgLTMuMDg5NjQ2MTkgLT4gLTkzMDA2MjI1LjQgSW5leGFjdCBSb3VuZGVkCit4Y29tMTgxIGNvbXBhcmUgLTkzMDA2MjIyLjMgLTMuMDg5NjQ2MTkgLT4gLTEKK3hkaXYxODEgZGl2aWRlIC05MzAwNjIyMi4zIC0zLjA4OTY0NjE5IC0+IDMwMTAyNTQ3LjkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTgxIGRpdmlkZWludCAtOTMwMDYyMjIuMyAtMy4wODk2NDYxOSAtPiAzMDEwMjU0NworeG11bDE4MSBtdWx0aXBseSAtOTMwMDYyMjIuMyAtMy4wODk2NDYxOSAtPiAyODczNTYzMjAgSW5leGFjdCBSb3VuZGVkCit4cG93MTgxIHBvd2VyIC05MzAwNjIyMi4zIC0zIC0+IC0xLjI0Mjk3OTU2RS0yNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xODEgcmVtYWluZGVyIC05MzAwNjIyMi4zIC0zLjA4OTY0NjE5IC0+IC0yLjY1MjE1NDA3Cit4c3ViMTgxIHN1YnRyYWN0IC05MzAwNjIyMi4zIC0zLjA4OTY0NjE5IC0+IC05MzAwNjIxOS4yIEluZXhhY3QgUm91bmRlZAoreGFkZDE4MiBhZGQgLTE4MTE2LjA2MjEgMzQwOTYuMzA2RS0yNzAzNDcwOTIgLT4gLTE4MTE2LjA2MjEgSW5leGFjdCBSb3VuZGVkCit4Y29tMTgyIGNvbXBhcmUgLTE4MTE2LjA2MjEgMzQwOTYuMzA2RS0yNzAzNDcwOTIgLT4gLTEKK3hkaXYxODIgZGl2aWRlIC0xODExNi4wNjIxIDM0MDk2LjMwNkUtMjcwMzQ3MDkyIC0+IC01LjMxMzIwMzc1RSsyNzAzNDcwOTEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTgyIGRpdmlkZWludCAtMTgxMTYuMDYyMSAzNDA5Ni4zMDZFLTI3MDM0NzA5MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDE4MiBtdWx0aXBseSAtMTgxMTYuMDYyMSAzNDA5Ni4zMDZFLTI3MDM0NzA5MiAtPiAtNi4xNzY5MDc5N0UtMjcwMzQ3MDg0IEluZXhhY3QgUm91bmRlZAoreHBvdzE4MiBwb3dlciAtMTgxMTYuMDYyMSAzIC0+IC01Ljk0NTU0MTMzRSsxMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xODIgcmVtYWluZGVyIC0xODExNi4wNjIxIDM0MDk2LjMwNkUtMjcwMzQ3MDkyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTgyIHN1YnRyYWN0IC0xODExNi4wNjIxIDM0MDk2LjMwNkUtMjcwMzQ3MDkyIC0+IC0xODExNi4wNjIxIEluZXhhY3QgUm91bmRlZAoreGFkZDE4MyBhZGQgMTkyNzIzODYuOSAtNDEwNDQyMzc5LiAtPiAtMzkxMTY5OTkyIEluZXhhY3QgUm91bmRlZAoreGNvbTE4MyBjb21wYXJlIDE5MjcyMzg2LjkgLTQxMDQ0MjM3OS4gLT4gMQoreGRpdjE4MyBkaXZpZGUgMTkyNzIzODYuOSAtNDEwNDQyMzc5LiAtPiAtMC4wNDY5NTUxNTg0IEluZXhhY3QgUm91bmRlZAoreGR2aTE4MyBkaXZpZGVpbnQgMTkyNzIzODYuOSAtNDEwNDQyMzc5LiAtPiAtMAoreG11bDE4MyBtdWx0aXBseSAxOTI3MjM4Ni45IC00MTA0NDIzNzkuIC0+IC03LjkxMDIwNDMzRSsxNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxODMgcG93ZXIgMTkyNzIzODYuOSAtNDEwNDQyMzc5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTE4MyByZW1haW5kZXIgMTkyNzIzODYuOSAtNDEwNDQyMzc5LiAtPiAxOTI3MjM4Ni45Cit4c3ViMTgzIHN1YnRyYWN0IDE5MjcyMzg2LjkgLTQxMDQ0MjM3OS4gLT4gNDI5NzE0NzY2IEluZXhhY3QgUm91bmRlZAoreGFkZDE4NCBhZGQgNDE4MC4zMDgyMSAtMS42NDM5NTQzRS02MjQ3NTkxMDQgLT4gNDE4MC4zMDgyMSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xODQgY29tcGFyZSA0MTgwLjMwODIxIC0xLjY0Mzk1NDNFLTYyNDc1OTEwNCAtPiAxCit4ZGl2MTg0IGRpdmlkZSA0MTgwLjMwODIxIC0xLjY0Mzk1NDNFLTYyNDc1OTEwNCAtPiAtMi41NDI4MzcyNEUrNjI0NzU5MTA3IEluZXhhY3QgUm91bmRlZAoreGR2aTE4NCBkaXZpZGVpbnQgNDE4MC4zMDgyMSAtMS42NDM5NTQzRS02MjQ3NTkxMDQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxODQgbXVsdGlwbHkgNDE4MC4zMDgyMSAtMS42NDM5NTQzRS02MjQ3NTkxMDQgLT4gLTYuODcyMjM1NjZFLTYyNDc1OTEwMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxODQgcG93ZXIgNDE4MC4zMDgyMSAtMiAtPiA1LjcyMjQ2ODI4RS04IEluZXhhY3QgUm91bmRlZAoreHJlbTE4NCByZW1haW5kZXIgNDE4MC4zMDgyMSAtMS42NDM5NTQzRS02MjQ3NTkxMDQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxODQgc3VidHJhY3QgNDE4MC4zMDgyMSAtMS42NDM5NTQzRS02MjQ3NTkxMDQgLT4gNDE4MC4zMDgyMSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxODUgYWRkIDU3MS41MzY3MjUgMzg5Ljg5OTIyMCAtPiA5NjEuNDM1OTQ1Cit4Y29tMTg1IGNvbXBhcmUgNTcxLjUzNjcyNSAzODkuODk5MjIwIC0+IDEKK3hkaXYxODUgZGl2aWRlIDU3MS41MzY3MjUgMzg5Ljg5OTIyMCAtPiAxLjQ2NTg1NzU3IEluZXhhY3QgUm91bmRlZAoreGR2aTE4NSBkaXZpZGVpbnQgNTcxLjUzNjcyNSAzODkuODk5MjIwIC0+IDEKK3htdWwxODUgbXVsdGlwbHkgNTcxLjUzNjcyNSAzODkuODk5MjIwIC0+IDIyMjg0MS43MjMgSW5leGFjdCBSb3VuZGVkCit4cG93MTg1IHBvd2VyIDU3MS41MzY3MjUgMzkwIC0+IDEuNzY2OTEzNzNFKzEwNzUgSW5leGFjdCBSb3VuZGVkCit4cmVtMTg1IHJlbWFpbmRlciA1NzEuNTM2NzI1IDM4OS44OTkyMjAgLT4gMTgxLjYzNzUwNQoreHN1YjE4NSBzdWJ0cmFjdCA1NzEuNTM2NzI1IDM4OS44OTkyMjAgLT4gMTgxLjYzNzUwNQoreGFkZDE4NiBhZGQgLTYyMjAwNzMwNi5FKzE1OTkyNDg4NiAtMTI2Ljk3MTc0NSAtPiAtNi4yMjAwNzMwNkUrMTU5OTI0ODk0IEluZXhhY3QgUm91bmRlZAoreGNvbTE4NiBjb21wYXJlIC02MjIwMDczMDYuRSsxNTk5MjQ4ODYgLTEyNi45NzE3NDUgLT4gLTEKK3hkaXYxODYgZGl2aWRlIC02MjIwMDczMDYuRSsxNTk5MjQ4ODYgLTEyNi45NzE3NDUgLT4gNC44OTg3ODUyMUUrMTU5OTI0ODkyIEluZXhhY3QgUm91bmRlZAoreGR2aTE4NiBkaXZpZGVpbnQgLTYyMjAwNzMwNi5FKzE1OTkyNDg4NiAtMTI2Ljk3MTc0NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDE4NiBtdWx0aXBseSAtNjIyMDA3MzA2LkUrMTU5OTI0ODg2IC0xMjYuOTcxNzQ1IC0+IDcuODk3NzM1MzBFKzE1OTkyNDg5NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxODYgcG93ZXIgLTYyMjAwNzMwNi5FKzE1OTkyNDg4NiAtMTI3IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xODYgcmVtYWluZGVyIC02MjIwMDczMDYuRSsxNTk5MjQ4ODYgLTEyNi45NzE3NDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxODYgc3VidHJhY3QgLTYyMjAwNzMwNi5FKzE1OTkyNDg4NiAtMTI2Ljk3MTc0NSAtPiAtNi4yMjAwNzMwNkUrMTU5OTI0ODk0IEluZXhhY3QgUm91bmRlZAoreGFkZDE4NyBhZGQgLTI5LjM1NjU1MUUtMjgyODE2MTM5IDM3MTQxNzQ4RS05MDMzOTc4MjEgLT4gLTIuOTM1NjU1MTBFLTI4MjgxNjEzOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xODcgY29tcGFyZSAtMjkuMzU2NTUxRS0yODI4MTYxMzkgMzcxNDE3NDhFLTkwMzM5NzgyMSAtPiAtMQoreGRpdjE4NyBkaXZpZGUgLTI5LjM1NjU1MUUtMjgyODE2MTM5IDM3MTQxNzQ4RS05MDMzOTc4MjEgLT4gLTcuOTAzOTIyODNFKzYyMDU4MTY3NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxODcgZGl2aWRlaW50IC0yOS4zNTY1NTFFLTI4MjgxNjEzOSAzNzE0MTc0OEUtOTAzMzk3ODIxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTg3IG11bHRpcGx5IC0yOS4zNTY1NTFFLTI4MjgxNjEzOSAzNzE0MTc0OEUtOTAzMzk3ODIxIC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hwb3cxODcgcG93ZXIgLTI5LjM1NjU1MUUtMjgyODE2MTM5IDQgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTg3IHJlbWFpbmRlciAtMjkuMzU2NTUxRS0yODI4MTYxMzkgMzcxNDE3NDhFLTkwMzM5NzgyMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjE4NyBzdWJ0cmFjdCAtMjkuMzU2NTUxRS0yODI4MTYxMzkgMzcxNDE3NDhFLTkwMzM5NzgyMSAtPiAtMi45MzU2NTUxMEUtMjgyODE2MTM4IEluZXhhY3QgUm91bmRlZAoreGFkZDE4OCBhZGQgOTI0Mjc0NDIuNCA2NzQzMzQ4OTguIC0+IDc2Njc2MjM0MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xODggY29tcGFyZSA5MjQyNzQ0Mi40IDY3NDMzNDg5OC4gLT4gLTEKK3hkaXYxODggZGl2aWRlIDkyNDI3NDQyLjQgNjc0MzM0ODk4LiAtPiAwLjEzNzA2NDU5OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxODggZGl2aWRlaW50IDkyNDI3NDQyLjQgNjc0MzM0ODk4LiAtPiAwCit4bXVsMTg4IG11bHRpcGx5IDkyNDI3NDQyLjQgNjc0MzM0ODk4LiAtPiA2LjIzMjcwNDk5RSsxNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxODggcG93ZXIgOTI0Mjc0NDIuNCA2NzQzMzQ4OTggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMTg4IHJlbWFpbmRlciA5MjQyNzQ0Mi40IDY3NDMzNDg5OC4gLT4gOTI0Mjc0NDIuNAoreHN1YjE4OCBzdWJ0cmFjdCA5MjQyNzQ0Mi40IDY3NDMzNDg5OC4gLT4gLTU4MTkwNzQ1NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxODkgYWRkIDQ0NjUxODk1LjcgLTkxMDUwOC40MzggLT4gNDM3NDEzODcuMyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xODkgY29tcGFyZSA0NDY1MTg5NS43IC05MTA1MDguNDM4IC0+IDEKK3hkaXYxODkgZGl2aWRlIDQ0NjUxODk1LjcgLTkxMDUwOC40MzggLT4gLTQ5LjA0MDYxNzEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTg5IGRpdmlkZWludCA0NDY1MTg5NS43IC05MTA1MDguNDM4IC0+IC00OQoreG11bDE4OSBtdWx0aXBseSA0NDY1MTg5NS43IC05MTA1MDguNDM4IC0+IC00LjA2NTU5Mjc4RSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxODkgcG93ZXIgNDQ2NTE4OTUuNyAtOTEwNTA4IC0+IDMuNzIyNjQyNzdFLTY5NjUyNDEgSW5leGFjdCBSb3VuZGVkCit4cmVtMTg5IHJlbWFpbmRlciA0NDY1MTg5NS43IC05MTA1MDguNDM4IC0+IDM2OTgyLjIzOAoreHN1YjE4OSBzdWJ0cmFjdCA0NDY1MTg5NS43IC05MTA1MDguNDM4IC0+IDQ1NTYyNDA0LjEgSW5leGFjdCBSb3VuZGVkCit4YWRkMTkwIGFkZCA2NDc4OTc4NzIuRSszNzQwMjE3OTAgLTQ2Ny40MjMwMjkgLT4gNi40Nzg5Nzg3MkUrMzc0MDIxNzk4IEluZXhhY3QgUm91bmRlZAoreGNvbTE5MCBjb21wYXJlIDY0Nzg5Nzg3Mi5FKzM3NDAyMTc5MCAtNDY3LjQyMzAyOSAtPiAxCit4ZGl2MTkwIGRpdmlkZSA2NDc4OTc4NzIuRSszNzQwMjE3OTAgLTQ2Ny40MjMwMjkgLT4gLTEuMzg2MTA2MDFFKzM3NDAyMTc5NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxOTAgZGl2aWRlaW50IDY0Nzg5Nzg3Mi5FKzM3NDAyMTc5MCAtNDY3LjQyMzAyOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDE5MCBtdWx0aXBseSA2NDc4OTc4NzIuRSszNzQwMjE3OTAgLTQ2Ny40MjMwMjkgLT4gLTMuMDI4NDIzODZFKzM3NDAyMTgwMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxOTAgcG93ZXIgNjQ3ODk3ODcyLkUrMzc0MDIxNzkwIC00NjcgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTkwIHJlbWFpbmRlciA2NDc4OTc4NzIuRSszNzQwMjE3OTAgLTQ2Ny40MjMwMjkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxOTAgc3VidHJhY3QgNjQ3ODk3ODcyLkUrMzc0MDIxNzkwIC00NjcuNDIzMDI5IC0+IDYuNDc4OTc4NzJFKzM3NDAyMTc5OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxOTEgYWRkIDI1LjI1OTIxNDkgNTkuMDQzNjk4MSAtPiA4NC4zMDI5MTMwCit4Y29tMTkxIGNvbXBhcmUgMjUuMjU5MjE0OSA1OS4wNDM2OTgxIC0+IC0xCit4ZGl2MTkxIGRpdmlkZSAyNS4yNTkyMTQ5IDU5LjA0MzY5ODEgLT4gMC40Mjc4MDU0MzQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTkxIGRpdmlkZWludCAyNS4yNTkyMTQ5IDU5LjA0MzY5ODEgLT4gMAoreG11bDE5MSBtdWx0aXBseSAyNS4yNTkyMTQ5IDU5LjA0MzY5ODEgLT4gMTQ5MS4zOTc0NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxOTEgcG93ZXIgMjUuMjU5MjE0OSA1OSAtPiA1LjUzMDU4NDM1RSs4MiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xOTEgcmVtYWluZGVyIDI1LjI1OTIxNDkgNTkuMDQzNjk4MSAtPiAyNS4yNTkyMTQ5Cit4c3ViMTkxIHN1YnRyYWN0IDI1LjI1OTIxNDkgNTkuMDQzNjk4MSAtPiAtMzMuNzg0NDgzMgoreGFkZDE5MiBhZGQgLTYuODUwODM1IC0xMjczLjQ4MjQwIC0+IC0xMjgwLjMzMzI0IEluZXhhY3QgUm91bmRlZAoreGNvbTE5MiBjb21wYXJlIC02Ljg1MDgzNSAtMTI3My40ODI0MCAtPiAxCit4ZGl2MTkyIGRpdmlkZSAtNi44NTA4MzUgLTEyNzMuNDgyNDAgLT4gMC4wMDUzNzk2MDcxMyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxOTIgZGl2aWRlaW50IC02Ljg1MDgzNSAtMTI3My40ODI0MCAtPiAwCit4bXVsMTkyIG11bHRpcGx5IC02Ljg1MDgzNSAtMTI3My40ODI0MCAtPiA4NzI0LjQxNzgwIEluZXhhY3QgUm91bmRlZAoreHBvdzE5MiBwb3dlciAtNi44NTA4MzUgLTEyNzMgLT4gLTEuMjU0NjI2NzhFLTEwNjQgSW5leGFjdCBSb3VuZGVkCit4cmVtMTkyIHJlbWFpbmRlciAtNi44NTA4MzUgLTEyNzMuNDgyNDAgLT4gLTYuODUwODM1Cit4c3ViMTkyIHN1YnRyYWN0IC02Ljg1MDgzNSAtMTI3My40ODI0MCAtPiAxMjY2LjYzMTU3IEluZXhhY3QgUm91bmRlZAoreGFkZDE5MyBhZGQgMTc0LjI3MjMyNSA1NjM4LjE2MjI5IC0+IDU4MTIuNDM0NjIgSW5leGFjdCBSb3VuZGVkCit4Y29tMTkzIGNvbXBhcmUgMTc0LjI3MjMyNSA1NjM4LjE2MjI5IC0+IC0xCit4ZGl2MTkzIGRpdmlkZSAxNzQuMjcyMzI1IDU2MzguMTYyMjkgLT4gMC4wMzA5MDk0MTk4IEluZXhhY3QgUm91bmRlZAoreGR2aTE5MyBkaXZpZGVpbnQgMTc0LjI3MjMyNSA1NjM4LjE2MjI5IC0+IDAKK3htdWwxOTMgbXVsdGlwbHkgMTc0LjI3MjMyNSA1NjM4LjE2MjI5IC0+IDk4MjU3NS42NTEgSW5leGFjdCBSb3VuZGVkCit4cG93MTkzIHBvd2VyIDE3NC4yNzIzMjUgNTYzOCAtPiAxLjExMTM3NzI0RSsxMjYzNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xOTMgcmVtYWluZGVyIDE3NC4yNzIzMjUgNTYzOC4xNjIyOSAtPiAxNzQuMjcyMzI1Cit4c3ViMTkzIHN1YnRyYWN0IDE3NC4yNzIzMjUgNTYzOC4xNjIyOSAtPiAtNTQ2My44ODk5NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxOTQgYWRkIDM0NTU2MjkuNzYgLTguMjczMzIzMjIgLT4gMzQ1NTYyMS40OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xOTQgY29tcGFyZSAzNDU1NjI5Ljc2IC04LjI3MzMyMzIyIC0+IDEKK3hkaXYxOTQgZGl2aWRlIDM0NTU2MjkuNzYgLTguMjczMzIzMjIgLT4gLTQxNzY4My4zOTkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTk0IGRpdmlkZWludCAzNDU1NjI5Ljc2IC04LjI3MzMyMzIyIC0+IC00MTc2ODMKK3htdWwxOTQgbXVsdGlwbHkgMzQ1NTYyOS43NiAtOC4yNzMzMjMyMiAtPiAtMjg1ODk1NDEuOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxOTQgcG93ZXIgMzQ1NTYyOS43NiAtOCAtPiA0LjkxNzkzMDE1RS01MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xOTQgcmVtYWluZGVyIDM0NTU2MjkuNzYgLTguMjczMzIzMjIgLT4gMy4yOTc1MDA3NAoreHN1YjE5NCBzdWJ0cmFjdCAzNDU1NjI5Ljc2IC04LjI3MzMyMzIyIC0+IDM0NTU2MzguMDMgSW5leGFjdCBSb3VuZGVkCit4YWRkMTk1IGFkZCAtOTI0MzM3NzIzRS02NDA3NzEyMzUgODY2MzkzNzcuMSAtPiA4NjYzOTM3Ny4xIEluZXhhY3QgUm91bmRlZAoreGNvbTE5NSBjb21wYXJlIC05MjQzMzc3MjNFLTY0MDc3MTIzNSA4NjYzOTM3Ny4xIC0+IC0xCit4ZGl2MTk1IGRpdmlkZSAtOTI0MzM3NzIzRS02NDA3NzEyMzUgODY2MzkzNzcuMSAtPiAtMS4wNjY4Nzk0N0UtNjQwNzcxMjM0IEluZXhhY3QgUm91bmRlZAoreGR2aTE5NSBkaXZpZGVpbnQgLTkyNDMzNzcyM0UtNjQwNzcxMjM1IDg2NjM5Mzc3LjEgLT4gLTAKK3htdWwxOTUgbXVsdGlwbHkgLTkyNDMzNzcyM0UtNjQwNzcxMjM1IDg2NjM5Mzc3LjEgLT4gLTguMDA4NDA0NDZFLTY0MDc3MTIxOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxOTUgcG93ZXIgLTkyNDMzNzcyM0UtNjQwNzcxMjM1IDg2NjM5Mzc3IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xOTUgcmVtYWluZGVyIC05MjQzMzc3MjNFLTY0MDc3MTIzNSA4NjYzOTM3Ny4xIC0+IC05LjI0MzM3NzIzRS02NDA3NzEyMjcKK3hzdWIxOTUgc3VidHJhY3QgLTkyNDMzNzcyM0UtNjQwNzcxMjM1IDg2NjM5Mzc3LjEgLT4gLTg2NjM5Mzc3LjEgSW5leGFjdCBSb3VuZGVkCit4YWRkMTk2IGFkZCAtNjIwMjM2OTMyLkUrNjU2ODIzOTY5IDMzNjQ3MjIuNzMgLT4gLTYuMjAyMzY5MzJFKzY1NjgyMzk3NyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xOTYgY29tcGFyZSAtNjIwMjM2OTMyLkUrNjU2ODIzOTY5IDMzNjQ3MjIuNzMgLT4gLTEKK3hkaXYxOTYgZGl2aWRlIC02MjAyMzY5MzIuRSs2NTY4MjM5NjkgMzM2NDcyMi43MyAtPiAtMS44NDMzNTIyOEUrNjU2ODIzOTcxIEluZXhhY3QgUm91bmRlZAoreGR2aTE5NiBkaXZpZGVpbnQgLTYyMDIzNjkzMi5FKzY1NjgyMzk2OSAzMzY0NzIyLjczIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTk2IG11bHRpcGx5IC02MjAyMzY5MzIuRSs2NTY4MjM5NjkgMzM2NDcyMi43MyAtPiAtMi4wODY5MjUzMEUrNjU2ODIzOTg0IEluZXhhY3QgUm91bmRlZAoreHBvdzE5NiBwb3dlciAtNjIwMjM2OTMyLkUrNjU2ODIzOTY5IDMzNjQ3MjMgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTE5NiByZW1haW5kZXIgLTYyMDIzNjkzMi5FKzY1NjgyMzk2OSAzMzY0NzIyLjczIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTk2IHN1YnRyYWN0IC02MjAyMzY5MzIuRSs2NTY4MjM5NjkgMzM2NDcyMi43MyAtPiAtNi4yMDIzNjkzMkUrNjU2ODIzOTc3IEluZXhhY3QgUm91bmRlZAoreGFkZDE5NyBhZGQgOS4xMDAyNTA3OSA3MDI3Nzc4ODJFLTgxOTIyMzQgLT4gOS4xMDAyNTA3OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xOTcgY29tcGFyZSA5LjEwMDI1MDc5IDcwMjc3Nzg4MkUtODE5MjIzNCAtPiAxCit4ZGl2MTk3IGRpdmlkZSA5LjEwMDI1MDc5IDcwMjc3Nzg4MkUtODE5MjIzNCAtPiAxLjI5NDg5NzE1RSs4MTkyMjI2IEluZXhhY3QgUm91bmRlZAoreGR2aTE5NyBkaXZpZGVpbnQgOS4xMDAyNTA3OSA3MDI3Nzc4ODJFLTgxOTIyMzQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxOTcgbXVsdGlwbHkgOS4xMDAyNTA3OSA3MDI3Nzc4ODJFLTgxOTIyMzQgLT4gNi4zOTU0NTQ5OEUtODE5MjIyNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxOTcgcG93ZXIgOS4xMDAyNTA3OSA3IC0+IDUxNjg2MDcuMTkgSW5leGFjdCBSb3VuZGVkCit4cmVtMTk3IHJlbWFpbmRlciA5LjEwMDI1MDc5IDcwMjc3Nzg4MkUtODE5MjIzNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjE5NyBzdWJ0cmFjdCA5LjEwMDI1MDc5IDcwMjc3Nzg4MkUtODE5MjIzNCAtPiA5LjEwMDI1MDc5IEluZXhhY3QgUm91bmRlZAoreGFkZDE5OCBhZGQgLTE4ODU3NTM5LjkgODEzMDEzMTI5LiAtPiA3OTQxNTU1ODkgSW5leGFjdCBSb3VuZGVkCit4Y29tMTk4IGNvbXBhcmUgLTE4ODU3NTM5LjkgODEzMDEzMTI5LiAtPiAtMQoreGRpdjE5OCBkaXZpZGUgLTE4ODU3NTM5LjkgODEzMDEzMTI5LiAtPiAtMC4wMjMxOTQ2MzE1IEluZXhhY3QgUm91bmRlZAoreGR2aTE5OCBkaXZpZGVpbnQgLTE4ODU3NTM5LjkgODEzMDEzMTI5LiAtPiAtMAoreG11bDE5OCBtdWx0aXBseSAtMTg4NTc1MzkuOSA4MTMwMTMxMjkuIC0+IC0xLjUzMzE0Mjc1RSsxNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxOTggcG93ZXIgLTE4ODU3NTM5LjkgODEzMDEzMTI5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xOTggcmVtYWluZGVyIC0xODg1NzUzOS45IDgxMzAxMzEyOS4gLT4gLTE4ODU3NTM5LjkKK3hzdWIxOTggc3VidHJhY3QgLTE4ODU3NTM5LjkgODEzMDEzMTI5LiAtPiAtODMxODcwNjY5IEluZXhhY3QgUm91bmRlZAoreGFkZDE5OSBhZGQgLTguMjk1MzAzMjcgMzI0MzQxOS41N0UrMzU2ODgzMzIgLT4gMy4yNDM0MTk1N0UrMzU2ODgzMzggSW5leGFjdCBSb3VuZGVkCit4Y29tMTk5IGNvbXBhcmUgLTguMjk1MzAzMjcgMzI0MzQxOS41N0UrMzU2ODgzMzIgLT4gLTEKK3hkaXYxOTkgZGl2aWRlIC04LjI5NTMwMzI3IDMyNDM0MTkuNTdFKzM1Njg4MzMyIC0+IC0yLjU1NzU3OTQ2RS0zNTY4ODMzOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxOTkgZGl2aWRlaW50IC04LjI5NTMwMzI3IDMyNDM0MTkuNTdFKzM1Njg4MzMyIC0+IC0wCit4bXVsMTk5IG11bHRpcGx5IC04LjI5NTMwMzI3IDMyNDM0MTkuNTdFKzM1Njg4MzMyIC0+IC0yLjY5MDUxNDkwRSszNTY4ODMzOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxOTkgcG93ZXIgLTguMjk1MzAzMjcgMyAtPiAtNTcwLjgxNjg3NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xOTkgcmVtYWluZGVyIC04LjI5NTMwMzI3IDMyNDM0MTkuNTdFKzM1Njg4MzMyIC0+IC04LjI5NTMwMzI3Cit4c3ViMTk5IHN1YnRyYWN0IC04LjI5NTMwMzI3IDMyNDM0MTkuNTdFKzM1Njg4MzMyIC0+IC0zLjI0MzQxOTU3RSszNTY4ODMzOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMDAgYWRkIC01NzEwMTY4My41IDc2MzU1MTM0MUUrOTkxNDkxNzEyIC0+IDcuNjM1NTEzNDFFKzk5MTQ5MTcyMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMDAgY29tcGFyZSAtNTcxMDE2ODMuNSA3NjM1NTEzNDFFKzk5MTQ5MTcxMiAtPiAtMQoreGRpdjIwMCBkaXZpZGUgLTU3MTAxNjgzLjUgNzYzNTUxMzQxRSs5OTE0OTE3MTIgLT4gLTcuNDc4NDM0MDVFLTk5MTQ5MTcxNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMDAgZGl2aWRlaW50IC01NzEwMTY4My41IDc2MzU1MTM0MUUrOTkxNDkxNzEyIC0+IC0wCit4bXVsMjAwIG11bHRpcGx5IC01NzEwMTY4My41IDc2MzU1MTM0MUUrOTkxNDkxNzEyIC0+IC00LjM2MDAwNjcwRSs5OTE0OTE3MjggSW5leGFjdCBSb3VuZGVkCit4cG93MjAwIHBvd2VyIC01NzEwMTY4My41IDggLT4gMS4xMzAyOTM2OEUrNjIgSW5leGFjdCBSb3VuZGVkCit4cmVtMjAwIHJlbWFpbmRlciAtNTcxMDE2ODMuNSA3NjM1NTEzNDFFKzk5MTQ5MTcxMiAtPiAtNTcxMDE2ODMuNQoreHN1YjIwMCBzdWJ0cmFjdCAtNTcxMDE2ODMuNSA3NjM1NTEzNDFFKzk5MTQ5MTcxMiAtPiAtNy42MzU1MTM0MUUrOTkxNDkxNzIwIEluZXhhY3QgUm91bmRlZAoreGFkZDIwMSBhZGQgLTYwMzMyNi43NDAgMTcxMC45NTE4MyAtPiAtNjAxNjE1Ljc4OCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMDEgY29tcGFyZSAtNjAzMzI2Ljc0MCAxNzEwLjk1MTgzIC0+IC0xCit4ZGl2MjAxIGRpdmlkZSAtNjAzMzI2Ljc0MCAxNzEwLjk1MTgzIC0+IC0zNTIuNjI2Mzc0IEluZXhhY3QgUm91bmRlZAoreGR2aTIwMSBkaXZpZGVpbnQgLTYwMzMyNi43NDAgMTcxMC45NTE4MyAtPiAtMzUyCit4bXVsMjAxIG11bHRpcGx5IC02MDMzMjYuNzQwIDE3MTAuOTUxODMgLT4gLTEuMDMyMjYyOTlFKzkgSW5leGFjdCBSb3VuZGVkCit4cG93MjAxIHBvd2VyIC02MDMzMjYuNzQwIDE3MTEgLT4gLTMuMzUzMTU5NzZFKzk4OTAgSW5leGFjdCBSb3VuZGVkCit4cmVtMjAxIHJlbWFpbmRlciAtNjAzMzI2Ljc0MCAxNzEwLjk1MTgzIC0+IC0xMDcxLjY5NTg0Cit4c3ViMjAxIHN1YnRyYWN0IC02MDMzMjYuNzQwIDE3MTAuOTUxODMgLT4gLTYwNTAzNy42OTIgSW5leGFjdCBSb3VuZGVkCit4YWRkMjAyIGFkZCAtNDgxNDI3NjMuMyAtOTQzNDM0MTE0IC0+IC05OTE1NzY4NzcgSW5leGFjdCBSb3VuZGVkCit4Y29tMjAyIGNvbXBhcmUgLTQ4MTQyNzYzLjMgLTk0MzQzNDExNCAtPiAxCit4ZGl2MjAyIGRpdmlkZSAtNDgxNDI3NjMuMyAtOTQzNDM0MTE0IC0+IDAuMDUxMDI5Mjc5NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMDIgZGl2aWRlaW50IC00ODE0Mjc2My4zIC05NDM0MzQxMTQgLT4gMAoreG11bDIwMiBtdWx0aXBseSAtNDgxNDI3NjMuMyAtOTQzNDM0MTE0IC0+IDQuNTQxOTUyNTJFKzE2IEluZXhhY3QgUm91bmRlZAoreHBvdzIwMiBwb3dlciAtNDgxNDI3NjMuMyAtOTQzNDM0MTE0IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTIwMiByZW1haW5kZXIgLTQ4MTQyNzYzLjMgLTk0MzQzNDExNCAtPiAtNDgxNDI3NjMuMworeHN1YjIwMiBzdWJ0cmFjdCAtNDgxNDI3NjMuMyAtOTQzNDM0MTE0IC0+IDg5NTI5MTM1MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMDMgYWRkIC0yMDQuNTg2NzY3IC0yMzUuNTMxODQ3IC0+IC00NDAuMTE4NjE0Cit4Y29tMjAzIGNvbXBhcmUgLTIwNC41ODY3NjcgLTIzNS41MzE4NDcgLT4gMQoreGRpdjIwMyBkaXZpZGUgLTIwNC41ODY3NjcgLTIzNS41MzE4NDcgLT4gMC44Njg2MTYxNTQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjAzIGRpdmlkZWludCAtMjA0LjU4Njc2NyAtMjM1LjUzMTg0NyAtPiAwCit4bXVsMjAzIG11bHRpcGx5IC0yMDQuNTg2NzY3IC0yMzUuNTMxODQ3IC0+IDQ4MTg2LjY5OTEgSW5leGFjdCBSb3VuZGVkCit4cG93MjAzIHBvd2VyIC0yMDQuNTg2NzY3IC0yMzYgLT4gNC4yOTQzODIyMkUtNTQ2IEluZXhhY3QgUm91bmRlZAoreHJlbTIwMyByZW1haW5kZXIgLTIwNC41ODY3NjcgLTIzNS41MzE4NDcgLT4gLTIwNC41ODY3NjcKK3hzdWIyMDMgc3VidHJhY3QgLTIwNC41ODY3NjcgLTIzNS41MzE4NDcgLT4gMzAuOTQ1MDgwCit4YWRkMjA0IGFkZCAtNzAuMzgwNTU4MSA4MzAxMzcuOTEzIC0+IDgzMDA2Ny41MzIgSW5leGFjdCBSb3VuZGVkCit4Y29tMjA0IGNvbXBhcmUgLTcwLjM4MDU1ODEgODMwMTM3LjkxMyAtPiAtMQoreGRpdjIwNCBkaXZpZGUgLTcwLjM4MDU1ODEgODMwMTM3LjkxMyAtPiAtMC4wMDAwODQ3ODE3NjU4IEluZXhhY3QgUm91bmRlZAoreGR2aTIwNCBkaXZpZGVpbnQgLTcwLjM4MDU1ODEgODMwMTM3LjkxMyAtPiAtMAoreG11bDIwNCBtdWx0aXBseSAtNzAuMzgwNTU4MSA4MzAxMzcuOTEzIC0+IC01ODQyNTU2OS42IEluZXhhY3QgUm91bmRlZAoreHBvdzIwNCBwb3dlciAtNzAuMzgwNTU4MSA4MzAxMzggLT4gNC45NTE2NTg0MUUrMTUzMzY0MCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMDQgcmVtYWluZGVyIC03MC4zODA1NTgxIDgzMDEzNy45MTMgLT4gLTcwLjM4MDU1ODEKK3hzdWIyMDQgc3VidHJhY3QgLTcwLjM4MDU1ODEgODMwMTM3LjkxMyAtPiAtODMwMjA4LjI5NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMDUgYWRkIC04ODE4LjQ3NjA2IC02MDc2Ni40NTcxIC0+IC02OTU4NC45MzMyIEluZXhhY3QgUm91bmRlZAoreGNvbTIwNSBjb21wYXJlIC04ODE4LjQ3NjA2IC02MDc2Ni40NTcxIC0+IDEKK3hkaXYyMDUgZGl2aWRlIC04ODE4LjQ3NjA2IC02MDc2Ni40NTcxIC0+IDAuMTQ1MTIwNzg3IEluZXhhY3QgUm91bmRlZAoreGR2aTIwNSBkaXZpZGVpbnQgLTg4MTguNDc2MDYgLTYwNzY2LjQ1NzEgLT4gMAoreG11bDIwNSBtdWx0aXBseSAtODgxOC40NzYwNiAtNjA3NjYuNDU3MSAtPiA1MzU4Njc1NDcgSW5leGFjdCBSb3VuZGVkCit4cG93MjA1IHBvd2VyIC04ODE4LjQ3NjA2IC02MDc2NiAtPiAxLjY0NDg3NzU1RS0yMzk3NDYgSW5leGFjdCBSb3VuZGVkCit4cmVtMjA1IHJlbWFpbmRlciAtODgxOC40NzYwNiAtNjA3NjYuNDU3MSAtPiAtODgxOC40NzYwNgoreHN1YjIwNSBzdWJ0cmFjdCAtODgxOC40NzYwNiAtNjA3NjYuNDU3MSAtPiA1MTk0Ny45ODEwIEluZXhhY3QgUm91bmRlZAoreGFkZDIwNiBhZGQgMzcwNjA5MjkuM0UtMTY4NDM5NTA5IC03OTU3NjcxNy4xIC0+IC03OTU3NjcxNy4xIEluZXhhY3QgUm91bmRlZAoreGNvbTIwNiBjb21wYXJlIDM3MDYwOTI5LjNFLTE2ODQzOTUwOSAtNzk1NzY3MTcuMSAtPiAxCit4ZGl2MjA2IGRpdmlkZSAzNzA2MDkyOS4zRS0xNjg0Mzk1MDkgLTc5NTc2NzE3LjEgLT4gLTQuNjU3MjU3ODhFLTE2ODQzOTUxMCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMDYgZGl2aWRlaW50IDM3MDYwOTI5LjNFLTE2ODQzOTUwOSAtNzk1NzY3MTcuMSAtPiAtMAoreG11bDIwNiBtdWx0aXBseSAzNzA2MDkyOS4zRS0xNjg0Mzk1MDkgLTc5NTc2NzE3LjEgLT4gLTIuOTQ5MTg3MDlFLTE2ODQzOTQ5NCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMDYgcG93ZXIgMzcwNjA5MjkuM0UtMTY4NDM5NTA5IC03OTU3NjcxNyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMDYgcmVtYWluZGVyIDM3MDYwOTI5LjNFLTE2ODQzOTUwOSAtNzk1NzY3MTcuMSAtPiAzLjcwNjA5MjkzRS0xNjg0Mzk1MDIKK3hzdWIyMDYgc3VidHJhY3QgMzcwNjA5MjkuM0UtMTY4NDM5NTA5IC03OTU3NjcxNy4xIC0+IDc5NTc2NzE3LjEgSW5leGFjdCBSb3VuZGVkCit4YWRkMjA3IGFkZCAtNjU2Mjg1MzEwLiAtMTA3MjIxNDYyLiAtPiAtNzYzNTA2NzcyCit4Y29tMjA3IGNvbXBhcmUgLTY1NjI4NTMxMC4gLTEwNzIyMTQ2Mi4gLT4gLTEKK3hkaXYyMDcgZGl2aWRlIC02NTYyODUzMTAuIC0xMDcyMjE0NjIuIC0+IDYuMTIwODM5MDQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjA3IGRpdmlkZWludCAtNjU2Mjg1MzEwLiAtMTA3MjIxNDYyLiAtPiA2Cit4bXVsMjA3IG11bHRpcGx5IC02NTYyODUzMTAuIC0xMDcyMjE0NjIuIC0+IDcuMDM2Nzg3MDRFKzE2IEluZXhhY3QgUm91bmRlZAoreHBvdzIwNyBwb3dlciAtNjU2Mjg1MzEwLiAtMTA3MjIxNDYyIC0+IDguMDUzMzgwODBFLTk0NTM4MTU2OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMDcgcmVtYWluZGVyIC02NTYyODUzMTAuIC0xMDcyMjE0NjIuIC0+IC0xMjk1NjUzOAoreHN1YjIwNyBzdWJ0cmFjdCAtNjU2Mjg1MzEwLiAtMTA3MjIxNDYyLiAtPiAtNTQ5MDYzODQ4Cit4YWRkMjA4IGFkZCA2NTMzOTcuMTI1IDcxOTUuMzA5OTAgLT4gNjYwNTkyLjQzNSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMDggY29tcGFyZSA2NTMzOTcuMTI1IDcxOTUuMzA5OTAgLT4gMQoreGRpdjIwOCBkaXZpZGUgNjUzMzk3LjEyNSA3MTk1LjMwOTkwIC0+IDkwLjgwODc1MzggSW5leGFjdCBSb3VuZGVkCit4ZHZpMjA4IGRpdmlkZWludCA2NTMzOTcuMTI1IDcxOTUuMzA5OTAgLT4gOTAKK3htdWwyMDggbXVsdGlwbHkgNjUzMzk3LjEyNSA3MTk1LjMwOTkwIC0+IDQuNzAxMzk0ODBFKzkgSW5leGFjdCBSb3VuZGVkCit4cG93MjA4IHBvd2VyIDY1MzM5Ny4xMjUgNzE5NSAtPiAxLjU4NTIyOTgzRSs0MTg0MCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMDggcmVtYWluZGVyIDY1MzM5Ny4xMjUgNzE5NS4zMDk5MCAtPiA1ODE5LjIzNDAwCit4c3ViMjA4IHN1YnRyYWN0IDY1MzM5Ny4xMjUgNzE5NS4zMDk5MCAtPiA2NDYyMDEuODE1IEluZXhhY3QgUm91bmRlZAoreGFkZDIwOSBhZGQgNTYyMjE5MTAuMEUrODU3OTA5Mzc0IC01OC43MjQ3OTI5IC0+IDUuNjIyMTkxMDBFKzg1NzkwOTM4MSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMDkgY29tcGFyZSA1NjIyMTkxMC4wRSs4NTc5MDkzNzQgLTU4LjcyNDc5MjkgLT4gMQoreGRpdjIwOSBkaXZpZGUgNTYyMjE5MTAuMEUrODU3OTA5Mzc0IC01OC43MjQ3OTI5IC0+IC05LjU3Mzc5NDUxRSs4NTc5MDkzNzkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjA5IGRpdmlkZWludCA1NjIyMTkxMC4wRSs4NTc5MDkzNzQgLTU4LjcyNDc5MjkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyMDkgbXVsdGlwbHkgNTYyMjE5MTAuMEUrODU3OTA5Mzc0IC01OC43MjQ3OTI5IC0+IC0zLjMwMTYyMDAyRSs4NTc5MDkzODMgSW5leGFjdCBSb3VuZGVkCit4cG93MjA5IHBvd2VyIDU2MjIxOTEwLjBFKzg1NzkwOTM3NCAtNTkgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjA5IHJlbWFpbmRlciA1NjIyMTkxMC4wRSs4NTc5MDkzNzQgLTU4LjcyNDc5MjkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyMDkgc3VidHJhY3QgNTYyMjE5MTAuMEUrODU3OTA5Mzc0IC01OC43MjQ3OTI5IC0+IDUuNjIyMTkxMDBFKzg1NzkwOTM4MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMTAgYWRkIDgwOTg2Mjg1OUUrNjQzNzY5OTc0IC01LjA2Nzg0MDE2IC0+IDguMDk4NjI4NTlFKzY0Mzc2OTk4MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMTAgY29tcGFyZSA4MDk4NjI4NTlFKzY0Mzc2OTk3NCAtNS4wNjc4NDAxNiAtPiAxCit4ZGl2MjEwIGRpdmlkZSA4MDk4NjI4NTlFKzY0Mzc2OTk3NCAtNS4wNjc4NDAxNiAtPiAtMS41OTgwNDM0MUUrNjQzNzY5OTgyIEluZXhhY3QgUm91bmRlZAoreGR2aTIxMCBkaXZpZGVpbnQgODA5ODYyODU5RSs2NDM3Njk5NzQgLTUuMDY3ODQwMTYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyMTAgbXVsdGlwbHkgODA5ODYyODU5RSs2NDM3Njk5NzQgLTUuMDY3ODQwMTYgLT4gLTQuMTA0MjU1NTJFKzY0Mzc2OTk4MyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMTAgcG93ZXIgODA5ODYyODU5RSs2NDM3Njk5NzQgLTUgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjEwIHJlbWFpbmRlciA4MDk4NjI4NTlFKzY0Mzc2OTk3NCAtNS4wNjc4NDAxNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjIxMCBzdWJ0cmFjdCA4MDk4NjI4NTlFKzY0Mzc2OTk3NCAtNS4wNjc4NDAxNiAtPiA4LjA5ODYyODU5RSs2NDM3Njk5ODIgSW5leGFjdCBSb3VuZGVkCit4YWRkMjExIGFkZCAtNjIwMTEuNDU2M0UtMTE3NTYzMjQwIC01Ny4xNzMxNTg2RSsxMTU2NTcyMDQgLT4gLTUuNzE3MzE1ODZFKzExNTY1NzIwNSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMTEgY29tcGFyZSAtNjIwMTEuNDU2M0UtMTE3NTYzMjQwIC01Ny4xNzMxNTg2RSsxMTU2NTcyMDQgLT4gMQoreGRpdjIxMSBkaXZpZGUgLTYyMDExLjQ1NjNFLTExNzU2MzI0MCAtNTcuMTczMTU4NkUrMTE1NjU3MjA0IC0+IDEuMDg0NjI1MzRFLTIzMzIyMDQ0MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMTEgZGl2aWRlaW50IC02MjAxMS40NTYzRS0xMTc1NjMyNDAgLTU3LjE3MzE1ODZFKzExNTY1NzIwNCAtPiAwCit4bXVsMjExIG11bHRpcGx5IC02MjAxMS40NTYzRS0xMTc1NjMyNDAgLTU3LjE3MzE1ODZFKzExNTY1NzIwNCAtPiAzLjU0NTM5MDgzRS0xOTA2MDMwIEluZXhhY3QgUm91bmRlZAoreHBvdzIxMSBwb3dlciAtNjIwMTEuNDU2M0UtMTE3NTYzMjQwIC02IC0+IDEuNzU4NjA1NDZFKzcwNTM3OTQxMSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMTEgcmVtYWluZGVyIC02MjAxMS40NTYzRS0xMTc1NjMyNDAgLTU3LjE3MzE1ODZFKzExNTY1NzIwNCAtPiAtNi4yMDExNDU2M0UtMTE3NTYzMjM2Cit4c3ViMjExIHN1YnRyYWN0IC02MjAxMS40NTYzRS0xMTc1NjMyNDAgLTU3LjE3MzE1ODZFKzExNTY1NzIwNCAtPiA1LjcxNzMxNTg2RSsxMTU2NTcyMDUgSW5leGFjdCBSb3VuZGVkCit4YWRkMjEyIGFkZCAzMTUuMzMzNTEgOTE1ODguODM3RS01MzYwMjAxNDkgLT4gMzE1LjMzMzUxMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMTIgY29tcGFyZSAzMTUuMzMzNTEgOTE1ODguODM3RS01MzYwMjAxNDkgLT4gMQoreGRpdjIxMiBkaXZpZGUgMzE1LjMzMzUxIDkxNTg4LjgzN0UtNTM2MDIwMTQ5IC0+IDMuNDQyOTI1MTVFKzUzNjAyMDE0NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMTIgZGl2aWRlaW50IDMxNS4zMzM1MSA5MTU4OC44MzdFLTUzNjAyMDE0OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDIxMiBtdWx0aXBseSAzMTUuMzMzNTEgOTE1ODguODM3RS01MzYwMjAxNDkgLT4gMi44ODgxMDI5NEUtNTM2MDIwMTQyIEluZXhhY3QgUm91bmRlZAoreHBvdzIxMiBwb3dlciAzMTUuMzMzNTEgOSAtPiAzLjA4MjY5OTAyRSsyMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMTIgcmVtYWluZGVyIDMxNS4zMzM1MSA5MTU4OC44MzdFLTUzNjAyMDE0OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjIxMiBzdWJ0cmFjdCAzMTUuMzMzNTEgOTE1ODguODM3RS01MzYwMjAxNDkgLT4gMzE1LjMzMzUxMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMTMgYWRkIDczOS45NDQ3MTAgMjAyOTQ5LjE3NSAtPiAyMDM2ODkuMTIwIEluZXhhY3QgUm91bmRlZAoreGNvbTIxMyBjb21wYXJlIDczOS45NDQ3MTAgMjAyOTQ5LjE3NSAtPiAtMQoreGRpdjIxMyBkaXZpZGUgNzM5Ljk0NDcxMCAyMDI5NDkuMTc1IC0+IDAuMDAzNjQ1OTYwNjcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjEzIGRpdmlkZWludCA3MzkuOTQ0NzEwIDIwMjk0OS4xNzUgLT4gMAoreG11bDIxMyBtdWx0aXBseSA3MzkuOTQ0NzEwIDIwMjk0OS4xNzUgLT4gMTUwMTcxMTY4IEluZXhhY3QgUm91bmRlZAoreHBvdzIxMyBwb3dlciA3MzkuOTQ0NzEwIDIwMjk0OSAtPiAxLjMyNjExNzI5RSs1ODIzMDEgSW5leGFjdCBSb3VuZGVkCit4cmVtMjEzIHJlbWFpbmRlciA3MzkuOTQ0NzEwIDIwMjk0OS4xNzUgLT4gNzM5Ljk0NDcxMAoreHN1YjIxMyBzdWJ0cmFjdCA3MzkuOTQ0NzEwIDIwMjk0OS4xNzUgLT4gLTIwMjIwOS4yMzAgSW5leGFjdCBSb3VuZGVkCit4YWRkMjE0IGFkZCA4NzY4Ni44MDE2IDQyMDQ4OTAuNDAgLT4gNDI5MjU3Ny4yMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMTQgY29tcGFyZSA4NzY4Ni44MDE2IDQyMDQ4OTAuNDAgLT4gLTEKK3hkaXYyMTQgZGl2aWRlIDg3Njg2LjgwMTYgNDIwNDg5MC40MCAtPiAwLjAyMDg1MzUyODUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjE0IGRpdmlkZWludCA4NzY4Ni44MDE2IDQyMDQ4OTAuNDAgLT4gMAoreG11bDIxNCBtdWx0aXBseSA4NzY4Ni44MDE2IDQyMDQ4OTAuNDAgLT4gMy42ODcxMzM5MEUrMTEgSW5leGFjdCBSb3VuZGVkCit4cG93MjE0IHBvd2VyIDg3Njg2LjgwMTYgNDIwNDg5MCAtPiA1LjE0ODQ2OTgxRSsyMDc4NDQ5NCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMTQgcmVtYWluZGVyIDg3Njg2LjgwMTYgNDIwNDg5MC40MCAtPiA4NzY4Ni44MDE2Cit4c3ViMjE0IHN1YnRyYWN0IDg3Njg2LjgwMTYgNDIwNDg5MC40MCAtPiAtNDExNzIwMy42MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMTUgYWRkIDk4NzEyNjcyMS5FLTcyNTc5NDgzNCA0ODc0MTY2LjIzIC0+IDQ4NzQxNjYuMjMgSW5leGFjdCBSb3VuZGVkCit4Y29tMjE1IGNvbXBhcmUgOTg3MTI2NzIxLkUtNzI1Nzk0ODM0IDQ4NzQxNjYuMjMgLT4gLTEKK3hkaXYyMTUgZGl2aWRlIDk4NzEyNjcyMS5FLTcyNTc5NDgzNCA0ODc0MTY2LjIzIC0+IDIuMDI1MjIxNzBFLTcyNTc5NDgzMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMTUgZGl2aWRlaW50IDk4NzEyNjcyMS5FLTcyNTc5NDgzNCA0ODc0MTY2LjIzIC0+IDAKK3htdWwyMTUgbXVsdGlwbHkgOTg3MTI2NzIxLkUtNzI1Nzk0ODM0IDQ4NzQxNjYuMjMgLT4gNC44MTE0MTk3M0UtNzI1Nzk0ODE5IEluZXhhY3QgUm91bmRlZAoreHBvdzIxNSBwb3dlciA5ODcxMjY3MjEuRS03MjU3OTQ4MzQgNDg3NDE2NiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0yMTUgcmVtYWluZGVyIDk4NzEyNjcyMS5FLTcyNTc5NDgzNCA0ODc0MTY2LjIzIC0+IDkuODcxMjY3MjFFLTcyNTc5NDgyNgoreHN1YjIxNSBzdWJ0cmFjdCA5ODcxMjY3MjEuRS03MjU3OTQ4MzQgNDg3NDE2Ni4yMyAtPiAtNDg3NDE2Ni4yMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMTYgYWRkIDcyODE0ODcyNi5FLTY2MTY5NTkzOCAzMjc5OC41MjAyIC0+IDMyNzk4LjUyMDIgSW5leGFjdCBSb3VuZGVkCit4Y29tMjE2IGNvbXBhcmUgNzI4MTQ4NzI2LkUtNjYxNjk1OTM4IDMyNzk4LjUyMDIgLT4gLTEKK3hkaXYyMTYgZGl2aWRlIDcyODE0ODcyNi5FLTY2MTY5NTkzOCAzMjc5OC41MjAyIC0+IDIuMjIwMDY1NzlFLTY2MTY5NTkzNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMTYgZGl2aWRlaW50IDcyODE0ODcyNi5FLTY2MTY5NTkzOCAzMjc5OC41MjAyIC0+IDAKK3htdWwyMTYgbXVsdGlwbHkgNzI4MTQ4NzI2LkUtNjYxNjk1OTM4IDMyNzk4LjUyMDIgLT4gMi4zODgyMjAwN0UtNjYxNjk1OTI1IEluZXhhY3QgUm91bmRlZAoreHBvdzIxNiBwb3dlciA3MjgxNDg3MjYuRS02NjE2OTU5MzggMzI3OTkgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjE2IHJlbWFpbmRlciA3MjgxNDg3MjYuRS02NjE2OTU5MzggMzI3OTguNTIwMiAtPiA3LjI4MTQ4NzI2RS02NjE2OTU5MzAKK3hzdWIyMTYgc3VidHJhY3QgNzI4MTQ4NzI2LkUtNjYxNjk1OTM4IDMyNzk4LjUyMDIgLT4gLTMyNzk4LjUyMDIgSW5leGFjdCBSb3VuZGVkCit4YWRkMjE3IGFkZCA3NDI4MjE5Ljk3IDY2Ny4zMjY3NjAgLT4gNzQyODg4Ny4zMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMTcgY29tcGFyZSA3NDI4MjE5Ljk3IDY2Ny4zMjY3NjAgLT4gMQoreGRpdjIxNyBkaXZpZGUgNzQyODIxOS45NyA2NjcuMzI2NzYwIC0+IDExMTMxLjMwODQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjE3IGRpdmlkZWludCA3NDI4MjE5Ljk3IDY2Ny4zMjY3NjAgLT4gMTExMzEKK3htdWwyMTcgbXVsdGlwbHkgNzQyODIxOS45NyA2NjcuMzI2NzYwIC0+IDQuOTU3MDQ5OTdFKzkgSW5leGFjdCBSb3VuZGVkCit4cG93MjE3IHBvd2VyIDc0MjgyMTkuOTcgNjY3IC0+IDcuNTg4MDg1MDlFKzQ1ODIgSW5leGFjdCBSb3VuZGVkCit4cmVtMjE3IHJlbWFpbmRlciA3NDI4MjE5Ljk3IDY2Ny4zMjY3NjAgLT4gMjA1LjgwNDQ0MAoreHN1YjIxNyBzdWJ0cmFjdCA3NDI4MjE5Ljk3IDY2Ny4zMjY3NjAgLT4gNzQyNzU1Mi42NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMTggYWRkIC03MjkxLjE5MjEyIDIwOS42NDk2NkUtNTg4NTI2NDc2IC0+IC03MjkxLjE5MjEyIEluZXhhY3QgUm91bmRlZAoreGNvbTIxOCBjb21wYXJlIC03MjkxLjE5MjEyIDIwOS42NDk2NkUtNTg4NTI2NDc2IC0+IC0xCit4ZGl2MjE4IGRpdmlkZSAtNzI5MS4xOTIxMiAyMDkuNjQ5NjZFLTU4ODUyNjQ3NiAtPiAtMy40Nzc3OTgyMUUrNTg4NTI2NDc3IEluZXhhY3QgUm91bmRlZAoreGR2aTIxOCBkaXZpZGVpbnQgLTcyOTEuMTkyMTIgMjA5LjY0OTY2RS01ODg1MjY0NzYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyMTggbXVsdGlwbHkgLTcyOTEuMTkyMTIgMjA5LjY0OTY2RS01ODg1MjY0NzYgLT4gLTEuNTI4NTk1OTVFLTU4ODUyNjQ3MCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMTggcG93ZXIgLTcyOTEuMTkyMTIgMiAtPiA1MzE2MTQ4Mi41IEluZXhhY3QgUm91bmRlZAoreHJlbTIxOCByZW1haW5kZXIgLTcyOTEuMTkyMTIgMjA5LjY0OTY2RS01ODg1MjY0NzYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyMTggc3VidHJhY3QgLTcyOTEuMTkyMTIgMjA5LjY0OTY2RS01ODg1MjY0NzYgLT4gLTcyOTEuMTkyMTIgSW5leGFjdCBSb3VuZGVkCit4YWRkMjE5IGFkZCAtMzU4LjI0NTUwIC00NDQ3Ljc4Njc1RSs2MDE0MDI1MDkgLT4gLTQuNDQ3Nzg2NzVFKzYwMTQwMjUxMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMTkgY29tcGFyZSAtMzU4LjI0NTUwIC00NDQ3Ljc4Njc1RSs2MDE0MDI1MDkgLT4gMQoreGRpdjIxOSBkaXZpZGUgLTM1OC4yNDU1MCAtNDQ0Ny43ODY3NUUrNjAxNDAyNTA5IC0+IDguMDU0NDY2NjRFLTYwMTQwMjUxMSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMTkgZGl2aWRlaW50IC0zNTguMjQ1NTAgLTQ0NDcuNzg2NzVFKzYwMTQwMjUwOSAtPiAwCit4bXVsMjE5IG11bHRpcGx5IC0zNTguMjQ1NTAgLTQ0NDcuNzg2NzVFKzYwMTQwMjUwOSAtPiAxLjU5MzM5OTU5RSs2MDE0MDI1MTUgSW5leGFjdCBSb3VuZGVkCit4cG93MjE5IHBvd2VyIC0zNTguMjQ1NTAgLTQgLT4gNi4wNzEyMzQ3NEUtMTEgSW5leGFjdCBSb3VuZGVkCit4cmVtMjE5IHJlbWFpbmRlciAtMzU4LjI0NTUwIC00NDQ3Ljc4Njc1RSs2MDE0MDI1MDkgLT4gLTM1OC4yNDU1MAoreHN1YjIxOSBzdWJ0cmFjdCAtMzU4LjI0NTUwIC00NDQ3Ljc4Njc1RSs2MDE0MDI1MDkgLT4gNC40NDc3ODY3NUUrNjAxNDAyNTEyIEluZXhhY3QgUm91bmRlZAoreGFkZDIyMCBhZGQgMTE4LjYyMTgyNiAtMi43MjAxMDAzOCAtPiAxMTUuOTAxNzI2IEluZXhhY3QgUm91bmRlZAoreGNvbTIyMCBjb21wYXJlIDExOC42MjE4MjYgLTIuNzIwMTAwMzggLT4gMQoreGRpdjIyMCBkaXZpZGUgMTE4LjYyMTgyNiAtMi43MjAxMDAzOCAtPiAtNDMuNjA5MzU2MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMjAgZGl2aWRlaW50IDExOC42MjE4MjYgLTIuNzIwMTAwMzggLT4gLTQzCit4bXVsMjIwIG11bHRpcGx5IDExOC42MjE4MjYgLTIuNzIwMTAwMzggLT4gLTMyMi42NjMyNzQgSW5leGFjdCBSb3VuZGVkCit4cG93MjIwIHBvd2VyIDExOC42MjE4MjYgLTMgLT4gNS45OTEwOTQ3MUUtNyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMjAgcmVtYWluZGVyIDExOC42MjE4MjYgLTIuNzIwMTAwMzggLT4gMS42NTc1MDk2NgoreHN1YjIyMCBzdWJ0cmFjdCAxMTguNjIxODI2IC0yLjcyMDEwMDM4IC0+IDEyMS4zNDE5MjYgSW5leGFjdCBSb3VuZGVkCit4YWRkMjIxIGFkZCA4MDcxOTYxLjk0IC0xMzU1MzM3NDAuRS0xMDI0NTE1NDMgLT4gODA3MTk2MS45NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMjEgY29tcGFyZSA4MDcxOTYxLjk0IC0xMzU1MzM3NDAuRS0xMDI0NTE1NDMgLT4gMQoreGRpdjIyMSBkaXZpZGUgODA3MTk2MS45NCAtMTM1NTMzNzQwLkUtMTAyNDUxNTQzIC0+IC01Ljk1NTY4NDUwRSsxMDI0NTE1NDEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjIxIGRpdmlkZWludCA4MDcxOTYxLjk0IC0xMzU1MzM3NDAuRS0xMDI0NTE1NDMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyMjEgbXVsdGlwbHkgODA3MTk2MS45NCAtMTM1NTMzNzQwLkUtMTAyNDUxNTQzIC0+IC0xLjA5NDAyMzE5RS0xMDI0NTE1MjggSW5leGFjdCBSb3VuZGVkCit4cG93MjIxIHBvd2VyIDgwNzE5NjEuOTQgLTEgLT4gMS4yMzg4NTYxOUUtNyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMjEgcmVtYWluZGVyIDgwNzE5NjEuOTQgLTEzNTUzMzc0MC5FLTEwMjQ1MTU0MyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjIyMSBzdWJ0cmFjdCA4MDcxOTYxLjk0IC0xMzU1MzM3NDAuRS0xMDI0NTE1NDMgLT4gODA3MTk2MS45NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMjIgYWRkIDY0MjYyNTI4LjVFKzgxMjExODY4MiAtODY5Mi45NDQ0N0UtNzMyMTg2OTQ3IC0+IDYuNDI2MjUyODVFKzgxMjExODY4OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMjIgY29tcGFyZSA2NDI2MjUyOC41RSs4MTIxMTg2ODIgLTg2OTIuOTQ0NDdFLTczMjE4Njk0NyAtPiAxCit4ZGl2MjIyIGRpdmlkZSA2NDI2MjUyOC41RSs4MTIxMTg2ODIgLTg2OTIuOTQ0NDdFLTczMjE4Njk0NyAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCit4ZHZpMjIyIGRpdmlkZWludCA2NDI2MjUyOC41RSs4MTIxMTg2ODIgLTg2OTIuOTQ0NDdFLTczMjE4Njk0NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDIyMiBtdWx0aXBseSA2NDI2MjUyOC41RSs4MTIxMTg2ODIgLTg2OTIuOTQ0NDdFLTczMjE4Njk0NyAtPiAtNS41ODYzMDU5MkUrNzk5MzE3NDYgSW5leGFjdCBSb3VuZGVkCit4cG93MjIyIHBvd2VyIDY0MjYyNTI4LjVFKzgxMjExODY4MiAtOSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0yMjIgcmVtYWluZGVyIDY0MjYyNTI4LjVFKzgxMjExODY4MiAtODY5Mi45NDQ0N0UtNzMyMTg2OTQ3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjIyIHN1YnRyYWN0IDY0MjYyNTI4LjVFKzgxMjExODY4MiAtODY5Mi45NDQ0N0UtNzMyMTg2OTQ3IC0+IDYuNDI2MjUyODVFKzgxMjExODY4OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMjMgYWRkIC0zNTU0NC40MDI5IC01Njc4MzAuMTMwIC0+IC02MDMzNzQuNTMzIEluZXhhY3QgUm91bmRlZAoreGNvbTIyMyBjb21wYXJlIC0zNTU0NC40MDI5IC01Njc4MzAuMTMwIC0+IDEKK3hkaXYyMjMgZGl2aWRlIC0zNTU0NC40MDI5IC01Njc4MzAuMTMwIC0+IDAuMDYyNTk2ODk0OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMjMgZGl2aWRlaW50IC0zNTU0NC40MDI5IC01Njc4MzAuMTMwIC0+IDAKK3htdWwyMjMgbXVsdGlwbHkgLTM1NTQ0LjQwMjkgLTU2NzgzMC4xMzAgLT4gMi4wMTgzMTgyOUUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MjIzIHBvd2VyIC0zNTU0NC40MDI5IC01Njc4MzAgLT4gMy43NzA2OTM2OEUtMjU4NDA2NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMjMgcmVtYWluZGVyIC0zNTU0NC40MDI5IC01Njc4MzAuMTMwIC0+IC0zNTU0NC40MDI5Cit4c3ViMjIzIHN1YnRyYWN0IC0zNTU0NC40MDI5IC01Njc4MzAuMTMwIC0+IDUzMjI4NS43MjcgSW5leGFjdCBSb3VuZGVkCit4YWRkMjI0IGFkZCAtNy4xNjUxMzA0N0UrNTkyOTcxMDMgODc3NjcuODIxMSAtPiAtNy4xNjUxMzA0N0UrNTkyOTcxMDMgSW5leGFjdCBSb3VuZGVkCit4Y29tMjI0IGNvbXBhcmUgLTcuMTY1MTMwNDdFKzU5Mjk3MTAzIDg3NzY3LjgyMTEgLT4gLTEKK3hkaXYyMjQgZGl2aWRlIC03LjE2NTEzMDQ3RSs1OTI5NzEwMyA4Nzc2Ny44MjExIC0+IC04LjE2MzczMjg4RSs1OTI5NzA5OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMjQgZGl2aWRlaW50IC03LjE2NTEzMDQ3RSs1OTI5NzEwMyA4Nzc2Ny44MjExIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjI0IG11bHRpcGx5IC03LjE2NTEzMDQ3RSs1OTI5NzEwMyA4Nzc2Ny44MjExIC0+IC02LjI4ODY3ODg5RSs1OTI5NzEwOCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMjQgcG93ZXIgLTcuMTY1MTMwNDdFKzU5Mjk3MTAzIDg3NzY4IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTIyNCByZW1haW5kZXIgLTcuMTY1MTMwNDdFKzU5Mjk3MTAzIDg3NzY3LjgyMTEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyMjQgc3VidHJhY3QgLTcuMTY1MTMwNDdFKzU5Mjk3MTAzIDg3NzY3LjgyMTEgLT4gLTcuMTY1MTMwNDdFKzU5Mjk3MTAzIEluZXhhY3QgUm91bmRlZAoreGFkZDIyNSBhZGQgLTUwOS40ODMzOTUgLTE0NzI0MjkxNS4gLT4gLTE0NzI0MzQyNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMjUgY29tcGFyZSAtNTA5LjQ4MzM5NSAtMTQ3MjQyOTE1LiAtPiAxCit4ZGl2MjI1IGRpdmlkZSAtNTA5LjQ4MzM5NSAtMTQ3MjQyOTE1LiAtPiAwLjAwMDAwMzQ2MDE1NTU5IEluZXhhY3QgUm91bmRlZAoreGR2aTIyNSBkaXZpZGVpbnQgLTUwOS40ODMzOTUgLTE0NzI0MjkxNS4gLT4gMAoreG11bDIyNSBtdWx0aXBseSAtNTA5LjQ4MzM5NSAtMTQ3MjQyOTE1LiAtPiA3LjUwMTc4MjAyRSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMjUgcG93ZXIgLTUwOS40ODMzOTUgLTE0NzI0MjkxNSAtPiAtMy4xMDc2MDUxOUUtMzk4NjA1NzE4IEluZXhhY3QgUm91bmRlZAoreHJlbTIyNSByZW1haW5kZXIgLTUwOS40ODMzOTUgLTE0NzI0MjkxNS4gLT4gLTUwOS40ODMzOTUKK3hzdWIyMjUgc3VidHJhY3QgLTUwOS40ODMzOTUgLTE0NzI0MjkxNS4gLT4gMTQ3MjQyNDA2IEluZXhhY3QgUm91bmRlZAoreGFkZDIyNiBhZGQgLTc5MTkwNDcuMjhFKzk1NjA0MTYyOSAtMzY3NjY3MzI5IC0+IC03LjkxOTA0NzI4RSs5NTYwNDE2MzUgSW5leGFjdCBSb3VuZGVkCit4Y29tMjI2IGNvbXBhcmUgLTc5MTkwNDcuMjhFKzk1NjA0MTYyOSAtMzY3NjY3MzI5IC0+IC0xCit4ZGl2MjI2IGRpdmlkZSAtNzkxOTA0Ny4yOEUrOTU2MDQxNjI5IC0zNjc2NjczMjkgLT4gMi4xNTM4NjIxMUUrOTU2MDQxNjI3IEluZXhhY3QgUm91bmRlZAoreGR2aTIyNiBkaXZpZGVpbnQgLTc5MTkwNDcuMjhFKzk1NjA0MTYyOSAtMzY3NjY3MzI5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjI2IG11bHRpcGx5IC03OTE5MDQ3LjI4RSs5NTYwNDE2MjkgLTM2NzY2NzMyOSAtPiAyLjkxMTU3NDk2RSs5NTYwNDE2NDQgSW5leGFjdCBSb3VuZGVkCit4cG93MjI2IHBvd2VyIC03OTE5MDQ3LjI4RSs5NTYwNDE2MjkgLTM2NzY2NzMyOSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjI2IHJlbWFpbmRlciAtNzkxOTA0Ny4yOEUrOTU2MDQxNjI5IC0zNjc2NjczMjkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyMjYgc3VidHJhY3QgLTc5MTkwNDcuMjhFKzk1NjA0MTYyOSAtMzY3NjY3MzI5IC0+IC03LjkxOTA0NzI4RSs5NTYwNDE2MzUgSW5leGFjdCBSb3VuZGVkCit4YWRkMjI3IGFkZCA4OTU2MTI2MzAuIC0zNi40MTA0MDQwIC0+IDg5NTYxMjU5NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMjcgY29tcGFyZSA4OTU2MTI2MzAuIC0zNi40MTA0MDQwIC0+IDEKK3hkaXYyMjcgZGl2aWRlIDg5NTYxMjYzMC4gLTM2LjQxMDQwNDAgLT4gLTI0NTk3NzEyLjAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjI3IGRpdmlkZWludCA4OTU2MTI2MzAuIC0zNi40MTA0MDQwIC0+IC0yNDU5NzcxMQoreG11bDIyNyBtdWx0aXBseSA4OTU2MTI2MzAuIC0zNi40MTA0MDQwIC0+IC0zLjI2MDk2MTc3RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMjcgcG93ZXIgODk1NjEyNjMwLiAtMzYgLT4gNS4yOTI2NDEzMEUtMzIzIEluZXhhY3QgUm91bmRlZAoreHJlbTIyNyByZW1haW5kZXIgODk1NjEyNjMwLiAtMzYuNDEwNDA0MCAtPiAzNS4wMTQ3NTYwCit4c3ViMjI3IHN1YnRyYWN0IDg5NTYxMjYzMC4gLTM2LjQxMDQwNDAgLT4gODk1NjEyNjY2IEluZXhhY3QgUm91bmRlZAoreGFkZDIyOCBhZGQgMjU0NTUuNDk3MyAyOTU1LjAwMDA2RSs1MjgxOTYyMTggLT4gMi45NTUwMDAwNkUrNTI4MTk2MjIxIEluZXhhY3QgUm91bmRlZAoreGNvbTIyOCBjb21wYXJlIDI1NDU1LjQ5NzMgMjk1NS4wMDAwNkUrNTI4MTk2MjE4IC0+IC0xCit4ZGl2MjI4IGRpdmlkZSAyNTQ1NS40OTczIDI5NTUuMDAwMDZFKzUyODE5NjIxOCAtPiA4LjYxNDM4MTMxRS01MjgxOTYyMTggSW5leGFjdCBSb3VuZGVkCit4ZHZpMjI4IGRpdmlkZWludCAyNTQ1NS40OTczIDI5NTUuMDAwMDZFKzUyODE5NjIxOCAtPiAwCit4bXVsMjI4IG11bHRpcGx5IDI1NDU1LjQ5NzMgMjk1NS4wMDAwNkUrNTI4MTk2MjE4IC0+IDcuNTIyMDk5NjBFKzUyODE5NjIyNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMjggcG93ZXIgMjU0NTUuNDk3MyAzIC0+IDEuNjQ5NDcxMjhFKzEzIEluZXhhY3QgUm91bmRlZAoreHJlbTIyOCByZW1haW5kZXIgMjU0NTUuNDk3MyAyOTU1LjAwMDA2RSs1MjgxOTYyMTggLT4gMjU0NTUuNDk3MworeHN1YjIyOCBzdWJ0cmFjdCAyNTQ1NS40OTczIDI5NTUuMDAwMDZFKzUyODE5NjIxOCAtPiAtMi45NTUwMDAwNkUrNTI4MTk2MjIxIEluZXhhY3QgUm91bmRlZAoreGFkZDIyOSBhZGQgLTExMi4yOTQxNDRFKzI3MzQxNDE3MiAtNzE0NDgwMDcuNyAtPiAtMS4xMjI5NDE0NEUrMjczNDE0MTc0IEluZXhhY3QgUm91bmRlZAoreGNvbTIyOSBjb21wYXJlIC0xMTIuMjk0MTQ0RSsyNzM0MTQxNzIgLTcxNDQ4MDA3LjcgLT4gLTEKK3hkaXYyMjkgZGl2aWRlIC0xMTIuMjk0MTQ0RSsyNzM0MTQxNzIgLTcxNDQ4MDA3LjcgLT4gMS41NzE2OTAzNUUrMjczNDE0MTY2IEluZXhhY3QgUm91bmRlZAoreGR2aTIyOSBkaXZpZGVpbnQgLTExMi4yOTQxNDRFKzI3MzQxNDE3MiAtNzE0NDgwMDcuNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDIyOSBtdWx0aXBseSAtMTEyLjI5NDE0NEUrMjczNDE0MTcyIC03MTQ0ODAwNy43IC0+IDguMDIzMTkyODdFKzI3MzQxNDE4MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMjkgcG93ZXIgLTExMi4yOTQxNDRFKzI3MzQxNDE3MiAtNzE0NDgwMDggLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjI5IHJlbWFpbmRlciAtMTEyLjI5NDE0NEUrMjczNDE0MTcyIC03MTQ0ODAwNy43IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjI5IHN1YnRyYWN0IC0xMTIuMjk0MTQ0RSsyNzM0MTQxNzIgLTcxNDQ4MDA3LjcgLT4gLTEuMTIyOTQxNDRFKzI3MzQxNDE3NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMzAgYWRkIDYyODcxLjIyMDIgMjQ4NC4wMzgyRSsyMTE2NjI1NTcgLT4gMi40ODQwMzgyMEUrMjExNjYyNTYwIEluZXhhY3QgUm91bmRlZAoreGNvbTIzMCBjb21wYXJlIDYyODcxLjIyMDIgMjQ4NC4wMzgyRSsyMTE2NjI1NTcgLT4gLTEKK3hkaXYyMzAgZGl2aWRlIDYyODcxLjIyMDIgMjQ4NC4wMzgyRSsyMTE2NjI1NTcgLT4gMi41MzEwMDg1OUUtMjExNjYyNTU2IEluZXhhY3QgUm91bmRlZAoreGR2aTIzMCBkaXZpZGVpbnQgNjI4NzEuMjIwMiAyNDg0LjAzODJFKzIxMTY2MjU1NyAtPiAwCit4bXVsMjMwIG11bHRpcGx5IDYyODcxLjIyMDIgMjQ4NC4wMzgyRSsyMTE2NjI1NTcgLT4gMS41NjE3NDUxM0UrMjExNjYyNTY1IEluZXhhY3QgUm91bmRlZAoreHBvdzIzMCBwb3dlciA2Mjg3MS4yMjAyIDIgLT4gMy45NTI3OTAzM0UrOSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMzAgcmVtYWluZGVyIDYyODcxLjIyMDIgMjQ4NC4wMzgyRSsyMTE2NjI1NTcgLT4gNjI4NzEuMjIwMgoreHN1YjIzMCBzdWJ0cmFjdCA2Mjg3MS4yMjAyIDI0ODQuMDM4MkUrMjExNjYyNTU3IC0+IC0yLjQ4NDAzODIwRSsyMTE2NjI1NjAgSW5leGFjdCBSb3VuZGVkCit4YWRkMjMxIGFkZCA3MS45MjgxNTc1IC05ODEwMDEyLjUgLT4gLTk4MDk5NDAuNTcgSW5leGFjdCBSb3VuZGVkCit4Y29tMjMxIGNvbXBhcmUgNzEuOTI4MTU3NSAtOTgxMDAxMi41IC0+IDEKK3hkaXYyMzEgZGl2aWRlIDcxLjkyODE1NzUgLTk4MTAwMTIuNSAtPiAtMC4wMDAwMDczMzIxMTY4MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMzEgZGl2aWRlaW50IDcxLjkyODE1NzUgLTk4MTAwMTIuNSAtPiAtMAoreG11bDIzMSBtdWx0aXBseSA3MS45MjgxNTc1IC05ODEwMDEyLjUgLT4gLTcwNTYxNjEyNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMzEgcG93ZXIgNzEuOTI4MTU3NSAtOTgxMDAxMyAtPiAyLjAwMzYzNzk4RS0xODIxNjIwMyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMzEgcmVtYWluZGVyIDcxLjkyODE1NzUgLTk4MTAwMTIuNSAtPiA3MS45MjgxNTc1Cit4c3ViMjMxIHN1YnRyYWN0IDcxLjkyODE1NzUgLTk4MTAwMTIuNSAtPiA5ODEwMDg0LjQzIEluZXhhY3QgUm91bmRlZAoreGFkZDIzMiBhZGQgLTYzODgwMjIuIC04OC4wNDI5NjcgLT4gLTYzODgxMTAuMDQgSW5leGFjdCBSb3VuZGVkCit4Y29tMjMyIGNvbXBhcmUgLTYzODgwMjIuIC04OC4wNDI5NjcgLT4gLTEKK3hkaXYyMzIgZGl2aWRlIC02Mzg4MDIyLiAtODguMDQyOTY3IC0+IDcyNTU1LjczMjkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjMyIGRpdmlkZWludCAtNjM4ODAyMi4gLTg4LjA0Mjk2NyAtPiA3MjU1NQoreG11bDIzMiBtdWx0aXBseSAtNjM4ODAyMi4gLTg4LjA0Mjk2NyAtPiA1NjI0MjA0MTAgSW5leGFjdCBSb3VuZGVkCit4cG93MjMyIHBvd2VyIC02Mzg4MDIyLiAtODggLT4gMS4zNDIwMTIzOEUtNTk5IEluZXhhY3QgUm91bmRlZAoreHJlbTIzMiByZW1haW5kZXIgLTYzODgwMjIuIC04OC4wNDI5NjcgLT4gLTY0LjUyOTMxNQoreHN1YjIzMiBzdWJ0cmFjdCAtNjM4ODAyMi4gLTg4LjA0Mjk2NyAtPiAtNjM4NzkzMy45NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMzMgYWRkIDM3MjU2NzQ0NS4gOTYuMDk5MjE0MSAtPiAzNzI1Njc1NDEgSW5leGFjdCBSb3VuZGVkCit4Y29tMjMzIGNvbXBhcmUgMzcyNTY3NDQ1LiA5Ni4wOTkyMTQxIC0+IDEKK3hkaXYyMzMgZGl2aWRlIDM3MjU2NzQ0NS4gOTYuMDk5MjE0MSAtPiAzODc2OTA0LjE4IEluZXhhY3QgUm91bmRlZAoreGR2aTIzMyBkaXZpZGVpbnQgMzcyNTY3NDQ1LiA5Ni4wOTkyMTQxIC0+IDM4NzY5MDQKK3htdWwyMzMgbXVsdGlwbHkgMzcyNTY3NDQ1LiA5Ni4wOTkyMTQxIC0+IDMuNTgwMzQzODdFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzIzMyBwb3dlciAzNzI1Njc0NDUuIDk2IC0+IDYuODQ5Njg3MTVFKzgyMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMzMgcmVtYWluZGVyIDM3MjU2NzQ0NS4gOTYuMDk5MjE0MSAtPiAxNy40NTg4NTM2Cit4c3ViMjMzIHN1YnRyYWN0IDM3MjU2NzQ0NS4gOTYuMDk5MjE0MSAtPiAzNzI1NjczNDkgSW5leGFjdCBSb3VuZGVkCit4YWRkMjM0IGFkZCA4MDIuMTU2NTE3IC0xNzQ0MDkzMTAuRS0yNTUzMzgwMjAgLT4gODAyLjE1NjUxNyBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMzQgY29tcGFyZSA4MDIuMTU2NTE3IC0xNzQ0MDkzMTAuRS0yNTUzMzgwMjAgLT4gMQoreGRpdjIzNCBkaXZpZGUgODAyLjE1NjUxNyAtMTc0NDA5MzEwLkUtMjU1MzM4MDIwIC0+IC00LjU5OTI3NTc5RSsyNTUzMzgwMTQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjM0IGRpdmlkZWludCA4MDIuMTU2NTE3IC0xNzQ0MDkzMTAuRS0yNTUzMzgwMjAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyMzQgbXVsdGlwbHkgODAyLjE1NjUxNyAtMTc0NDA5MzEwLkUtMjU1MzM4MDIwIC0+IC0xLjM5OTAzNTY1RS0yNTUzMzgwMDkgSW5leGFjdCBSb3VuZGVkCit4cG93MjM0IHBvd2VyIDgwMi4xNTY1MTcgLTIgLT4gMC4wMDAwMDE1NTQxMTAwNSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMzQgcmVtYWluZGVyIDgwMi4xNTY1MTcgLTE3NDQwOTMxMC5FLTI1NTMzODAyMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjIzNCBzdWJ0cmFjdCA4MDIuMTU2NTE3IC0xNzQ0MDkzMTAuRS0yNTUzMzgwMjAgLT4gODAyLjE1NjUxNyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMzUgYWRkIC0zLjY1MjA3NTQxIDc0NTAxOTgyLjAgLT4gNzQ1MDE5NzguMyBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMzUgY29tcGFyZSAtMy42NTIwNzU0MSA3NDUwMTk4Mi4wIC0+IC0xCit4ZGl2MjM1IGRpdmlkZSAtMy42NTIwNzU0MSA3NDUwMTk4Mi4wIC0+IC00LjkwMTk4NDIzRS04IEluZXhhY3QgUm91bmRlZAoreGR2aTIzNSBkaXZpZGVpbnQgLTMuNjUyMDc1NDEgNzQ1MDE5ODIuMCAtPiAtMAoreG11bDIzNSBtdWx0aXBseSAtMy42NTIwNzU0MSA3NDUwMTk4Mi4wIC0+IC0yNzIwODY4NTYgSW5leGFjdCBSb3VuZGVkCit4cG93MjM1IHBvd2VyIC0zLjY1MjA3NTQxIDc0NTAxOTgyIC0+IDIuMTAzMzk0NTJFKzQxOTEwMzI1IEluZXhhY3QgUm91bmRlZAoreHJlbTIzNSByZW1haW5kZXIgLTMuNjUyMDc1NDEgNzQ1MDE5ODIuMCAtPiAtMy42NTIwNzU0MQoreHN1YjIzNSBzdWJ0cmFjdCAtMy42NTIwNzU0MSA3NDUwMTk4Mi4wIC0+IC03NDUwMTk4NS43IEluZXhhY3QgUm91bmRlZAoreGFkZDIzNiBhZGQgLTUyOTcuNzY5ODEgLTg1OS43MTk0MDQgLT4gLTYxNTcuNDg5MjEgSW5leGFjdCBSb3VuZGVkCit4Y29tMjM2IGNvbXBhcmUgLTUyOTcuNzY5ODEgLTg1OS43MTk0MDQgLT4gLTEKK3hkaXYyMzYgZGl2aWRlIC01Mjk3Ljc2OTgxIC04NTkuNzE5NDA0IC0+IDYuMTYyMjA4MDIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjM2IGRpdmlkZWludCAtNTI5Ny43Njk4MSAtODU5LjcxOTQwNCAtPiA2Cit4bXVsMjM2IG11bHRpcGx5IC01Mjk3Ljc2OTgxIC04NTkuNzE5NDA0IC0+IDQ1NTQ1OTUuNTAgSW5leGFjdCBSb3VuZGVkCit4cG93MjM2IHBvd2VyIC01Mjk3Ljc2OTgxIC04NjAgLT4gMS45MDUyMzEwOEUtMzIwMyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMzYgcmVtYWluZGVyIC01Mjk3Ljc2OTgxIC04NTkuNzE5NDA0IC0+IC0xMzkuNDUzMzg2Cit4c3ViMjM2IHN1YnRyYWN0IC01Mjk3Ljc2OTgxIC04NTkuNzE5NDA0IC0+IC00NDM4LjA1MDQxIEluZXhhY3QgUm91bmRlZAoreGFkZDIzNyBhZGQgLTY4NDE3Mi41OTIgNzY2LjQ0ODU5N0UrMjg4MzYxOTU5IC0+IDcuNjY0NDg1OTdFKzI4ODM2MTk2MSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMzcgY29tcGFyZSAtNjg0MTcyLjU5MiA3NjYuNDQ4NTk3RSsyODgzNjE5NTkgLT4gLTEKK3hkaXYyMzcgZGl2aWRlIC02ODQxNzIuNTkyIDc2Ni40NDg1OTdFKzI4ODM2MTk1OSAtPiAtOC45MjY1MjkzOEUtMjg4MzYxOTU3IEluZXhhY3QgUm91bmRlZAoreGR2aTIzNyBkaXZpZGVpbnQgLTY4NDE3Mi41OTIgNzY2LjQ0ODU5N0UrMjg4MzYxOTU5IC0+IC0wCit4bXVsMjM3IG11bHRpcGx5IC02ODQxNzIuNTkyIDc2Ni40NDg1OTdFKzI4ODM2MTk1OSAtPiAtNS4yNDM4MzEyM0UrMjg4MzYxOTY3IEluZXhhY3QgUm91bmRlZAoreHBvdzIzNyBwb3dlciAtNjg0MTcyLjU5MiA4IC0+IDQuODAwOTMwMDVFKzQ2IEluZXhhY3QgUm91bmRlZAoreHJlbTIzNyByZW1haW5kZXIgLTY4NDE3Mi41OTIgNzY2LjQ0ODU5N0UrMjg4MzYxOTU5IC0+IC02ODQxNzIuNTkyCit4c3ViMjM3IHN1YnRyYWN0IC02ODQxNzIuNTkyIDc2Ni40NDg1OTdFKzI4ODM2MTk1OSAtPiAtNy42NjQ0ODU5N0UrMjg4MzYxOTYxIEluZXhhY3QgUm91bmRlZAoreGFkZDIzOCBhZGQgNjI2OTE5LjIxOSA1NzQ2OS44NzI3RSsxMzE4ODYxMCAtPiA1Ljc0Njk4NzI3RSsxMzE4ODYxNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMzggY29tcGFyZSA2MjY5MTkuMjE5IDU3NDY5Ljg3MjdFKzEzMTg4NjEwIC0+IC0xCit4ZGl2MjM4IGRpdmlkZSA2MjY5MTkuMjE5IDU3NDY5Ljg3MjdFKzEzMTg4NjEwIC0+IDEuMDkwODY1ODZFLTEzMTg4NjA5IEluZXhhY3QgUm91bmRlZAoreGR2aTIzOCBkaXZpZGVpbnQgNjI2OTE5LjIxOSA1NzQ2OS44NzI3RSsxMzE4ODYxMCAtPiAwCit4bXVsMjM4IG11bHRpcGx5IDYyNjkxOS4yMTkgNTc0NjkuODcyN0UrMTMxODg2MTAgLT4gMy42MDI4OTY3N0UrMTMxODg2MjAgSW5leGFjdCBSb3VuZGVkCit4cG93MjM4IHBvd2VyIDYyNjkxOS4yMTkgNiAtPiA2LjA3MTEyOTU5RSszNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMzggcmVtYWluZGVyIDYyNjkxOS4yMTkgNTc0NjkuODcyN0UrMTMxODg2MTAgLT4gNjI2OTE5LjIxOQoreHN1YjIzOCBzdWJ0cmFjdCA2MjY5MTkuMjE5IDU3NDY5Ljg3MjdFKzEzMTg4NjEwIC0+IC01Ljc0Njk4NzI3RSsxMzE4ODYxNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMzkgYWRkIC03NzQ4MC41ODQwIDg5MzI2NS41OTRFKzI4Nzk4MjU1MiAtPiA4LjkzMjY1NTk0RSsyODc5ODI1NTcgSW5leGFjdCBSb3VuZGVkCit4Y29tMjM5IGNvbXBhcmUgLTc3NDgwLjU4NDAgODkzMjY1LjU5NEUrMjg3OTgyNTUyIC0+IC0xCit4ZGl2MjM5IGRpdmlkZSAtNzc0ODAuNTg0MCA4OTMyNjUuNTk0RSsyODc5ODI1NTIgLT4gLTguNjczODU3NDJFLTI4Nzk4MjU1NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMzkgZGl2aWRlaW50IC03NzQ4MC41ODQwIDg5MzI2NS41OTRFKzI4Nzk4MjU1MiAtPiAtMAoreG11bDIzOSBtdWx0aXBseSAtNzc0ODAuNTg0MCA4OTMyNjUuNTk0RSsyODc5ODI1NTIgLT4gLTYuOTIxMDczOTlFKzI4Nzk4MjU2MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMzkgcG93ZXIgLTc3NDgwLjU4NDAgOSAtPiAtMS4wMDYzMTk2OUUrNDQgSW5leGFjdCBSb3VuZGVkCit4cmVtMjM5IHJlbWFpbmRlciAtNzc0ODAuNTg0MCA4OTMyNjUuNTk0RSsyODc5ODI1NTIgLT4gLTc3NDgwLjU4NDAKK3hzdWIyMzkgc3VidHJhY3QgLTc3NDgwLjU4NDAgODkzMjY1LjU5NEUrMjg3OTgyNTUyIC0+IC04LjkzMjY1NTk0RSsyODc5ODI1NTcgSW5leGFjdCBSb3VuZGVkCit4YWRkMjQwIGFkZCAtNzE3NzYyMC4yOSA3Nzg2MzQzLjgzIC0+IDYwODcyMy41NAoreGNvbTI0MCBjb21wYXJlIC03MTc3NjIwLjI5IDc3ODYzNDMuODMgLT4gLTEKK3hkaXYyNDAgZGl2aWRlIC03MTc3NjIwLjI5IDc3ODYzNDMuODMgLT4gLTAuOTIxODIxNjQ3IEluZXhhY3QgUm91bmRlZAoreGR2aTI0MCBkaXZpZGVpbnQgLTcxNzc2MjAuMjkgNzc4NjM0My44MyAtPiAtMAoreG11bDI0MCBtdWx0aXBseSAtNzE3NzYyMC4yOSA3Nzg2MzQzLjgzIC0+IC01LjU4ODc0MTk1RSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNDAgcG93ZXIgLTcxNzc2MjAuMjkgNzc4NjM0NCAtPiAyLjk2MDM3MDc0RSs1MzM4MzAyMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNDAgcmVtYWluZGVyIC03MTc3NjIwLjI5IDc3ODYzNDMuODMgLT4gLTcxNzc2MjAuMjkKK3hzdWIyNDAgc3VidHJhY3QgLTcxNzc2MjAuMjkgNzc4NjM0My44MyAtPiAtMTQ5NjM5NjQuMSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNDEgYWRkIDkuNjIyNDEzMCA0LjUwMzU1MTEyIC0+IDE0LjEyNTk2NDEgSW5leGFjdCBSb3VuZGVkCit4Y29tMjQxIGNvbXBhcmUgOS42MjI0MTMwIDQuNTAzNTUxMTIgLT4gMQoreGRpdjI0MSBkaXZpZGUgOS42MjI0MTMwIDQuNTAzNTUxMTIgLT4gMi4xMzY2Mjc5MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNDEgZGl2aWRlaW50IDkuNjIyNDEzMCA0LjUwMzU1MTEyIC0+IDIKK3htdWwyNDEgbXVsdGlwbHkgOS42MjI0MTMwIDQuNTAzNTUxMTIgLT4gNDMuMzM1MDI4OCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNDEgcG93ZXIgOS42MjI0MTMwIDUgLT4gODI0OTMuNTQ0OCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNDEgcmVtYWluZGVyIDkuNjIyNDEzMCA0LjUwMzU1MTEyIC0+IDAuNjE1MzEwNzYKK3hzdWIyNDEgc3VidHJhY3QgOS42MjI0MTMwIDQuNTAzNTUxMTIgLT4gNS4xMTg4NjE4OAoreGFkZDI0MiBhZGQgLTY2LjYzMzczNDdFLTU5NzQxMDA4NiAtODE4ODEyODg1IC0+IC04MTg4MTI4ODUgSW5leGFjdCBSb3VuZGVkCit4Y29tMjQyIGNvbXBhcmUgLTY2LjYzMzczNDdFLTU5NzQxMDA4NiAtODE4ODEyODg1IC0+IDEKK3hkaXYyNDIgZGl2aWRlIC02Ni42MzM3MzQ3RS01OTc0MTAwODYgLTgxODgxMjg4NSAtPiA4LjEzNzg0NjM4RS01OTc0MTAwOTQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjQyIGRpdmlkZWludCAtNjYuNjMzNzM0N0UtNTk3NDEwMDg2IC04MTg4MTI4ODUgLT4gMAoreG11bDI0MiBtdWx0aXBseSAtNjYuNjMzNzM0N0UtNTk3NDEwMDg2IC04MTg4MTI4ODUgLT4gNS40NTYwNTYwNUUtNTk3NDEwMDc2IEluZXhhY3QgUm91bmRlZAoreHBvdzI0MiBwb3dlciAtNjYuNjMzNzM0N0UtNTk3NDEwMDg2IC04MTg4MTI4ODUgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTI0MiByZW1haW5kZXIgLTY2LjYzMzczNDdFLTU5NzQxMDA4NiAtODE4ODEyODg1IC0+IC02LjY2MzM3MzQ3RS01OTc0MTAwODUKK3hzdWIyNDIgc3VidHJhY3QgLTY2LjYzMzczNDdFLTU5NzQxMDA4NiAtODE4ODEyODg1IC0+IDgxODgxMjg4NSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNDMgYWRkIDY1NTg3NTUzLjcgNjAwNTc0LjczNiAtPiA2NjE4ODEyOC40IEluZXhhY3QgUm91bmRlZAoreGNvbTI0MyBjb21wYXJlIDY1NTg3NTUzLjcgNjAwNTc0LjczNiAtPiAxCit4ZGl2MjQzIGRpdmlkZSA2NTU4NzU1My43IDYwMDU3NC43MzYgLT4gMTA5LjIwNzk4MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNDMgZGl2aWRlaW50IDY1NTg3NTUzLjcgNjAwNTc0LjczNiAtPiAxMDkKK3htdWwyNDMgbXVsdGlwbHkgNjU1ODc1NTMuNyA2MDA1NzQuNzM2IC0+IDMuOTM5MDIyNzdFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzI0MyBwb3dlciA2NTU4NzU1My43IDYwMDU3NSAtPiAzLjQwNDA0ODE3RSs0Njk0NTg3IEluZXhhY3QgUm91bmRlZAoreHJlbTI0MyByZW1haW5kZXIgNjU1ODc1NTMuNyA2MDA1NzQuNzM2IC0+IDEyNDkwNy40NzYKK3hzdWIyNDMgc3VidHJhY3QgNjU1ODc1NTMuNyA2MDA1NzQuNzM2IC0+IDY0OTg2OTc5LjAgSW5leGFjdCBSb3VuZGVkCit4YWRkMjQ0IGFkZCAtMzI0MDEuOTM5IC01ODUyMDAyMTcuIC0+IC01ODUyMzI2MTkgSW5leGFjdCBSb3VuZGVkCit4Y29tMjQ0IGNvbXBhcmUgLTMyNDAxLjkzOSAtNTg1MjAwMjE3LiAtPiAxCit4ZGl2MjQ0IGRpdmlkZSAtMzI0MDEuOTM5IC01ODUyMDAyMTcuIC0+IDAuMDAwMDU1MzY4OTc5OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNDQgZGl2aWRlaW50IC0zMjQwMS45MzkgLTU4NTIwMDIxNy4gLT4gMAoreG11bDI0NCBtdWx0aXBseSAtMzI0MDEuOTM5IC01ODUyMDAyMTcuIC0+IDEuODk2MTYyMTdFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzI0NCBwb3dlciAtMzI0MDEuOTM5IC01ODUyMDAyMTcgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTI0NCByZW1haW5kZXIgLTMyNDAxLjkzOSAtNTg1MjAwMjE3LiAtPiAtMzI0MDEuOTM5Cit4c3ViMjQ0IHN1YnRyYWN0IC0zMjQwMS45MzkgLTU4NTIwMDIxNy4gLT4gNTg1MTY3ODE1IEluZXhhY3QgUm91bmRlZAoreGFkZDI0NSBhZGQgNjk1NzMuOTg4IC05Ljc3MDAzNDY1RSs3NDA5MzM2NjggLT4gLTkuNzcwMDM0NjVFKzc0MDkzMzY2OCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNDUgY29tcGFyZSA2OTU3My45ODggLTkuNzcwMDM0NjVFKzc0MDkzMzY2OCAtPiAxCit4ZGl2MjQ1IGRpdmlkZSA2OTU3My45ODggLTkuNzcwMDM0NjVFKzc0MDkzMzY2OCAtPiAtNy4xMjExNjA4MkUtNzQwOTMzNjY1IEluZXhhY3QgUm91bmRlZAoreGR2aTI0NSBkaXZpZGVpbnQgNjk1NzMuOTg4IC05Ljc3MDAzNDY1RSs3NDA5MzM2NjggLT4gLTAKK3htdWwyNDUgbXVsdGlwbHkgNjk1NzMuOTg4IC05Ljc3MDAzNDY1RSs3NDA5MzM2NjggLT4gLTYuNzk3NDAyNzNFKzc0MDkzMzY3MyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNDUgcG93ZXIgNjk1NzMuOTg4IC0xMCAtPiAzLjc2Mjk3MjI5RS00OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNDUgcmVtYWluZGVyIDY5NTczLjk4OCAtOS43NzAwMzQ2NUUrNzQwOTMzNjY4IC0+IDY5NTczLjk4OAoreHN1YjI0NSBzdWJ0cmFjdCA2OTU3My45ODggLTkuNzcwMDM0NjVFKzc0MDkzMzY2OCAtPiA5Ljc3MDAzNDY1RSs3NDA5MzM2NjggSW5leGFjdCBSb3VuZGVkCit4YWRkMjQ2IGFkZCAyMzYyLjA2MjUxIC00MzMxNDk1NDYuRS0xNTI2NDM2MjkgLT4gMjM2Mi4wNjI1MSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNDYgY29tcGFyZSAyMzYyLjA2MjUxIC00MzMxNDk1NDYuRS0xNTI2NDM2MjkgLT4gMQoreGRpdjI0NiBkaXZpZGUgMjM2Mi4wNjI1MSAtNDMzMTQ5NTQ2LkUtMTUyNjQzNjI5IC0+IC01LjQ1MzIyNjMzRSsxNTI2NDM2MjMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjQ2IGRpdmlkZWludCAyMzYyLjA2MjUxIC00MzMxNDk1NDYuRS0xNTI2NDM2MjkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyNDYgbXVsdGlwbHkgMjM2Mi4wNjI1MSAtNDMzMTQ5NTQ2LkUtMTUyNjQzNjI5IC0+IC0xLjAyMzEyNjMwRS0xNTI2NDM2MTcgSW5leGFjdCBSb3VuZGVkCit4cG93MjQ2IHBvd2VyIDIzNjIuMDYyNTEgLTQgLT4gMy4yMTI0MzU3N0UtMTQgSW5leGFjdCBSb3VuZGVkCit4cmVtMjQ2IHJlbWFpbmRlciAyMzYyLjA2MjUxIC00MzMxNDk1NDYuRS0xNTI2NDM2MjkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyNDYgc3VidHJhY3QgMjM2Mi4wNjI1MSAtNDMzMTQ5NTQ2LkUtMTUyNjQzNjI5IC0+IDIzNjIuMDYyNTEgSW5leGFjdCBSb3VuZGVkCit4YWRkMjQ3IGFkZCAtNjE1LjIzNDg4RSsyNDk5NTM0NTIgLTIxNDM3NDgzLjcgLT4gLTYuMTUyMzQ4ODBFKzI0OTk1MzQ1NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNDcgY29tcGFyZSAtNjE1LjIzNDg4RSsyNDk5NTM0NTIgLTIxNDM3NDgzLjcgLT4gLTEKK3hkaXYyNDcgZGl2aWRlIC02MTUuMjM0ODhFKzI0OTk1MzQ1MiAtMjE0Mzc0ODMuNyAtPiAyLjg2OTkwMjUwRSsyNDk5NTM0NDcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjQ3IGRpdmlkZWludCAtNjE1LjIzNDg4RSsyNDk5NTM0NTIgLTIxNDM3NDgzLjcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyNDcgbXVsdGlwbHkgLTYxNS4yMzQ4OEUrMjQ5OTUzNDUyIC0yMTQzNzQ4My43IC0+IDEuMzE4OTA4NzdFKzI0OTk1MzQ2MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNDcgcG93ZXIgLTYxNS4yMzQ4OEUrMjQ5OTUzNDUyIC0yMTQzNzQ4NCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0yNDcgcmVtYWluZGVyIC02MTUuMjM0ODhFKzI0OTk1MzQ1MiAtMjE0Mzc0ODMuNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjI0NyBzdWJ0cmFjdCAtNjE1LjIzNDg4RSsyNDk5NTM0NTIgLTIxNDM3NDgzLjcgLT4gLTYuMTUyMzQ4ODBFKzI0OTk1MzQ1NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNDggYWRkIDIxNjc0MTA4Mi4gMjUwMjkwMjQ0IC0+IDQ2NzAzMTMyNgoreGNvbTI0OCBjb21wYXJlIDIxNjc0MTA4Mi4gMjUwMjkwMjQ0IC0+IC0xCit4ZGl2MjQ4IGRpdmlkZSAyMTY3NDEwODIuIDI1MDI5MDI0NCAtPiAwLjg2NTk1ODk3MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNDggZGl2aWRlaW50IDIxNjc0MTA4Mi4gMjUwMjkwMjQ0IC0+IDAKK3htdWwyNDggbXVsdGlwbHkgMjE2NzQxMDgyLiAyNTAyOTAyNDQgLT4gNS40MjQ4MTc4M0UrMTYgSW5leGFjdCBSb3VuZGVkCit4cG93MjQ4IHBvd2VyIDIxNjc0MTA4Mi4gMjUwMjkwMjQ0IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTI0OCByZW1haW5kZXIgMjE2NzQxMDgyLiAyNTAyOTAyNDQgLT4gMjE2NzQxMDgyCit4c3ViMjQ4IHN1YnRyYWN0IDIxNjc0MTA4Mi4gMjUwMjkwMjQ0IC0+IC0zMzU0OTE2MgoreGFkZDI0OSBhZGQgLTYzNjQ3MjAuNDkgNTUzOTI0NS42NCAtPiAtODI1NDc0Ljg1Cit4Y29tMjQ5IGNvbXBhcmUgLTYzNjQ3MjAuNDkgNTUzOTI0NS42NCAtPiAtMQoreGRpdjI0OSBkaXZpZGUgLTYzNjQ3MjAuNDkgNTUzOTI0NS42NCAtPiAtMS4xNDkwMjI5NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNDkgZGl2aWRlaW50IC02MzY0NzIwLjQ5IDU1MzkyNDUuNjQgLT4gLTEKK3htdWwyNDkgbXVsdGlwbHkgLTYzNjQ3MjAuNDkgNTUzOTI0NS42NCAtPiAtMy41MjU1NzUwMkUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MjQ5IHBvd2VyIC02MzY0NzIwLjQ5IDU1MzkyNDYgLT4gMi45Njg5NDY0MUUrMzc2ODc4MDcgSW5leGFjdCBSb3VuZGVkCit4cmVtMjQ5IHJlbWFpbmRlciAtNjM2NDcyMC40OSA1NTM5MjQ1LjY0IC0+IC04MjU0NzQuODUKK3hzdWIyNDkgc3VidHJhY3QgLTYzNjQ3MjAuNDkgNTUzOTI0NS42NCAtPiAtMTE5MDM5NjYuMSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNTAgYWRkIC04MTQ1OTkuNDc1IC0xNC41NDMxMTkxIC0+IC04MTQ2MTQuMDE4IEluZXhhY3QgUm91bmRlZAoreGNvbTI1MCBjb21wYXJlIC04MTQ1OTkuNDc1IC0xNC41NDMxMTkxIC0+IC0xCit4ZGl2MjUwIGRpdmlkZSAtODE0NTk5LjQ3NSAtMTQuNTQzMTE5MSAtPiA1NjAxMi43MDc0IEluZXhhY3QgUm91bmRlZAoreGR2aTI1MCBkaXZpZGVpbnQgLTgxNDU5OS40NzUgLTE0LjU0MzExOTEgLT4gNTYwMTIKK3htdWwyNTAgbXVsdGlwbHkgLTgxNDU5OS40NzUgLTE0LjU0MzExOTEgLT4gMTE4NDY4MTcuMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNTAgcG93ZXIgLTgxNDU5OS40NzUgLTE1IC0+IC0yLjE2Njg5NjIyRS04OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNTAgcmVtYWluZGVyIC04MTQ1OTkuNDc1IC0xNC41NDMxMTkxIC0+IC0xMC4yODc5NzA4Cit4c3ViMjUwIHN1YnRyYWN0IC04MTQ1OTkuNDc1IC0xNC41NDMxMTkxIC0+IC04MTQ1ODQuOTMyIEluZXhhY3QgUm91bmRlZAoreGFkZDI1MSBhZGQgLTg3NzQ5OC43NTUgNTA3NDA4NzI0RS0xNjg2MjgxMDYgLT4gLTg3NzQ5OC43NTUgSW5leGFjdCBSb3VuZGVkCit4Y29tMjUxIGNvbXBhcmUgLTg3NzQ5OC43NTUgNTA3NDA4NzI0RS0xNjg2MjgxMDYgLT4gLTEKK3hkaXYyNTEgZGl2aWRlIC04Nzc0OTguNzU1IDUwNzQwODcyNEUtMTY4NjI4MTA2IC0+IC0xLjcyOTM3MjYyRSsxNjg2MjgxMDMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjUxIGRpdmlkZWludCAtODc3NDk4Ljc1NSA1MDc0MDg3MjRFLTE2ODYyODEwNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDI1MSBtdWx0aXBseSAtODc3NDk4Ljc1NSA1MDc0MDg3MjRFLTE2ODYyODEwNiAtPiAtNC40NTI1MDUyNEUtMTY4NjI4MDkyIEluZXhhY3QgUm91bmRlZAoreHBvdzI1MSBwb3dlciAtODc3NDk4Ljc1NSA1IC0+IC01LjIwMjc0NTA1RSsyOSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNTEgcmVtYWluZGVyIC04Nzc0OTguNzU1IDUwNzQwODcyNEUtMTY4NjI4MTA2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjUxIHN1YnRyYWN0IC04Nzc0OTguNzU1IDUwNzQwODcyNEUtMTY4NjI4MTA2IC0+IC04Nzc0OTguNzU1IEluZXhhY3QgUm91bmRlZAoreGFkZDI1MiBhZGQgMTA2MzQ0NDYuNUUrNDc1NzgzODYxIDUwLjcyMTMwNTZFKzE3ODA3ODA5IC0+IDEuMDYzNDQ0NjVFKzQ3NTc4Mzg2OCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNTIgY29tcGFyZSAxMDYzNDQ0Ni41RSs0NzU3ODM4NjEgNTAuNzIxMzA1NkUrMTc4MDc4MDkgLT4gMQoreGRpdjI1MiBkaXZpZGUgMTA2MzQ0NDYuNUUrNDc1NzgzODYxIDUwLjcyMTMwNTZFKzE3ODA3ODA5IC0+IDIuMDk2NjQyODlFKzQ1Nzk3NjA1NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNTIgZGl2aWRlaW50IDEwNjM0NDQ2LjVFKzQ3NTc4Mzg2MSA1MC43MjEzMDU2RSsxNzgwNzgwOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDI1MiBtdWx0aXBseSAxMDYzNDQ0Ni41RSs0NzU3ODM4NjEgNTAuNzIxMzA1NkUrMTc4MDc4MDkgLT4gNS4zOTM5MzAxMUUrNDkzNTkxNjc4IEluZXhhY3QgUm91bmRlZAoreHBvdzI1MiBwb3dlciAxMDYzNDQ0Ni41RSs0NzU3ODM4NjEgNSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNTIgcmVtYWluZGVyIDEwNjM0NDQ2LjVFKzQ3NTc4Mzg2MSA1MC43MjEzMDU2RSsxNzgwNzgwOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjI1MiBzdWJ0cmFjdCAxMDYzNDQ0Ni41RSs0NzU3ODM4NjEgNTAuNzIxMzA1NkUrMTc4MDc4MDkgLT4gMS4wNjM0NDQ2NUUrNDc1NzgzODY4IEluZXhhY3QgUm91bmRlZAoreGFkZDI1MyBhZGQgLTE2MjcyNi4yNTdFLTU5NzI4NTkxOCAtNDM5MS41NDc5OSAtPiAtNDM5MS41NDc5OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNTMgY29tcGFyZSAtMTYyNzI2LjI1N0UtNTk3Mjg1OTE4IC00MzkxLjU0Nzk5IC0+IDEKK3hkaXYyNTMgZGl2aWRlIC0xNjI3MjYuMjU3RS01OTcyODU5MTggLTQzOTEuNTQ3OTkgLT4gMy43MDU0NDE4NUUtNTk3Mjg1OTE3IEluZXhhY3QgUm91bmRlZAoreGR2aTI1MyBkaXZpZGVpbnQgLTE2MjcyNi4yNTdFLTU5NzI4NTkxOCAtNDM5MS41NDc5OSAtPiAwCit4bXVsMjUzIG11bHRpcGx5IC0xNjI3MjYuMjU3RS01OTcyODU5MTggLTQzOTEuNTQ3OTkgLT4gNy4xNDYyMDE2N0UtNTk3Mjg1OTEwIEluZXhhY3QgUm91bmRlZAoreHBvdzI1MyBwb3dlciAtMTYyNzI2LjI1N0UtNTk3Mjg1OTE4IC00MzkyIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTI1MyByZW1haW5kZXIgLTE2MjcyNi4yNTdFLTU5NzI4NTkxOCAtNDM5MS41NDc5OSAtPiAtMS42MjcyNjI1N0UtNTk3Mjg1OTEzCit4c3ViMjUzIHN1YnRyYWN0IC0xNjI3MjYuMjU3RS01OTcyODU5MTggLTQzOTEuNTQ3OTkgLT4gNDM5MS41NDc5OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNTQgYWRkIDcwMDM1NDU4Ni5FLTk5ODU2NzA3IDcxOTguMDQ5M0UrNDM2MjUwMjk5IC0+IDcuMTk4MDQ5MzBFKzQzNjI1MDMwMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNTQgY29tcGFyZSA3MDAzNTQ1ODYuRS05OTg1NjcwNyA3MTk4LjA0OTNFKzQzNjI1MDI5OSAtPiAtMQoreGRpdjI1NCBkaXZpZGUgNzAwMzU0NTg2LkUtOTk4NTY3MDcgNzE5OC4wNDkzRSs0MzYyNTAyOTkgLT4gOS43Mjk3ODMxMkUtNTM2MTA3MDAyIEluZXhhY3QgUm91bmRlZAoreGR2aTI1NCBkaXZpZGVpbnQgNzAwMzU0NTg2LkUtOTk4NTY3MDcgNzE5OC4wNDkzRSs0MzYyNTAyOTkgLT4gMAoreG11bDI1NCBtdWx0aXBseSA3MDAzNTQ1ODYuRS05OTg1NjcwNyA3MTk4LjA0OTNFKzQzNjI1MDI5OSAtPiA1LjA0MTE4Njg0RSszMzYzOTM2MDQgSW5leGFjdCBSb3VuZGVkCit4cG93MjU0IHBvd2VyIDcwMDM1NDU4Ni5FLTk5ODU2NzA3IDcgLT4gOC4yNjQ2NzYxMEUtNjk4OTk2ODg4IEluZXhhY3QgUm91bmRlZAoreHJlbTI1NCByZW1haW5kZXIgNzAwMzU0NTg2LkUtOTk4NTY3MDcgNzE5OC4wNDkzRSs0MzYyNTAyOTkgLT4gNy4wMDM1NDU4NkUtOTk4NTY2OTkKK3hzdWIyNTQgc3VidHJhY3QgNzAwMzU0NTg2LkUtOTk4NTY3MDcgNzE5OC4wNDkzRSs0MzYyNTAyOTkgLT4gLTcuMTk4MDQ5MzBFKzQzNjI1MDMwMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNTUgYWRkIDM5NjE3NjYzRS00NjM3MDQ2NjQgLTg5NS4yOTAzNDYgLT4gLTg5NS4yOTAzNDYgSW5leGFjdCBSb3VuZGVkCit4Y29tMjU1IGNvbXBhcmUgMzk2MTc2NjNFLTQ2MzcwNDY2NCAtODk1LjI5MDM0NiAtPiAxCit4ZGl2MjU1IGRpdmlkZSAzOTYxNzY2M0UtNDYzNzA0NjY0IC04OTUuMjkwMzQ2IC0+IC00LjQyNTExODk4RS00NjM3MDQ2NjAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjU1IGRpdmlkZWludCAzOTYxNzY2M0UtNDYzNzA0NjY0IC04OTUuMjkwMzQ2IC0+IC0wCit4bXVsMjU1IG11bHRpcGx5IDM5NjE3NjYzRS00NjM3MDQ2NjQgLTg5NS4yOTAzNDYgLT4gLTMuNTQ2OTMxMTJFLTQ2MzcwNDY1NCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNTUgcG93ZXIgMzk2MTc2NjNFLTQ2MzcwNDY2NCAtODk1IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTI1NSByZW1haW5kZXIgMzk2MTc2NjNFLTQ2MzcwNDY2NCAtODk1LjI5MDM0NiAtPiAzLjk2MTc2NjNFLTQ2MzcwNDY1NworeHN1YjI1NSBzdWJ0cmFjdCAzOTYxNzY2M0UtNDYzNzA0NjY0IC04OTUuMjkwMzQ2IC0+IDg5NS4yOTAzNDYgSW5leGFjdCBSb3VuZGVkCit4YWRkMjU2IGFkZCA1MzUwODgyLjU5IC0zNjMyOTgyOSAtPiAtMzA5Nzg5NDYuNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNTYgY29tcGFyZSA1MzUwODgyLjU5IC0zNjMyOTgyOSAtPiAxCit4ZGl2MjU2IGRpdmlkZSA1MzUwODgyLjU5IC0zNjMyOTgyOSAtPiAtMC4xNDcyODYyMDQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjU2IGRpdmlkZWludCA1MzUwODgyLjU5IC0zNjMyOTgyOSAtPiAtMAoreG11bDI1NiBtdWx0aXBseSA1MzUwODgyLjU5IC0zNjMyOTgyOSAtPiAtMS45NDM5NjY0OUUrMTQgSW5leGFjdCBSb3VuZGVkCit4cG93MjU2IHBvd2VyIDUzNTA4ODIuNTkgLTM2MzI5ODI5IC0+IDkuNzcwMDYxMDdFLTI0NDQ0MjU0NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNTYgcmVtYWluZGVyIDUzNTA4ODIuNTkgLTM2MzI5ODI5IC0+IDUzNTA4ODIuNTkKK3hzdWIyNTYgc3VidHJhY3QgNTM1MDg4Mi41OSAtMzYzMjk4MjkgLT4gNDE2ODA3MTEuNiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNTcgYWRkIDkxOTY2LjQwODRFKzIxMDM4Mjk1MiAxNjY3NDAuNDZFLTQyMDAxMzkwIC0+IDkuMTk2NjQwODRFKzIxMDM4Mjk1NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNTcgY29tcGFyZSA5MTk2Ni40MDg0RSsyMTAzODI5NTIgMTY2NzQwLjQ2RS00MjAwMTM5MCAtPiAxCit4ZGl2MjU3IGRpdmlkZSA5MTk2Ni40MDg0RSsyMTAzODI5NTIgMTY2NzQwLjQ2RS00MjAwMTM5MCAtPiA1LjUxNTU0MjQ0RSsyNTIzODQzNDEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjU3IGRpdmlkZWludCA5MTk2Ni40MDg0RSsyMTAzODI5NTIgMTY2NzQwLjQ2RS00MjAwMTM5MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDI1NyBtdWx0aXBseSA5MTk2Ni40MDg0RSsyMTAzODI5NTIgMTY2NzQwLjQ2RS00MjAwMTM5MCAtPiAxLjUzMzQ1MjEyRSsxNjgzODE1NzIgSW5leGFjdCBSb3VuZGVkCit4cG93MjU3IHBvd2VyIDkxOTY2LjQwODRFKzIxMDM4Mjk1MiAyIC0+IDguNDU3ODIwMjdFKzQyMDc2NTkxMyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNTcgcmVtYWluZGVyIDkxOTY2LjQwODRFKzIxMDM4Mjk1MiAxNjY3NDAuNDZFLTQyMDAxMzkwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjU3IHN1YnRyYWN0IDkxOTY2LjQwODRFKzIxMDM4Mjk1MiAxNjY3NDAuNDZFLTQyMDAxMzkwIC0+IDkuMTk2NjQwODRFKzIxMDM4Mjk1NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNTggYWRkIDIzMTg5OTAzMS5FLTQ4MTc1OTA3NiA3MjYuMzM3MTAwIC0+IDcyNi4zMzcxMDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMjU4IGNvbXBhcmUgMjMxODk5MDMxLkUtNDgxNzU5MDc2IDcyNi4zMzcxMDAgLT4gLTEKK3hkaXYyNTggZGl2aWRlIDIzMTg5OTAzMS5FLTQ4MTc1OTA3NiA3MjYuMzM3MTAwIC0+IDMuMTkyNzE5MDdFLTQ4MTc1OTA3MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNTggZGl2aWRlaW50IDIzMTg5OTAzMS5FLTQ4MTc1OTA3NiA3MjYuMzM3MTAwIC0+IDAKK3htdWwyNTggbXVsdGlwbHkgMjMxODk5MDMxLkUtNDgxNzU5MDc2IDcyNi4zMzcxMDAgLT4gMS42ODQzNjg3MEUtNDgxNzU5MDY1IEluZXhhY3QgUm91bmRlZAoreHBvdzI1OCBwb3dlciAyMzE4OTkwMzEuRS00ODE3NTkwNzYgNzI2IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTI1OCByZW1haW5kZXIgMjMxODk5MDMxLkUtNDgxNzU5MDc2IDcyNi4zMzcxMDAgLT4gMi4zMTg5OTAzMUUtNDgxNzU5MDY4Cit4c3ViMjU4IHN1YnRyYWN0IDIzMTg5OTAzMS5FLTQ4MTc1OTA3NiA3MjYuMzM3MTAwIC0+IC03MjYuMzM3MTAwIEluZXhhY3QgUm91bmRlZAoreGFkZDI1OSBhZGQgLTk2MTEzMTIuMzMgMjIxMDk3MzUuOSAtPiAxMjQ5ODQyMy42IEluZXhhY3QgUm91bmRlZAoreGNvbTI1OSBjb21wYXJlIC05NjExMzEyLjMzIDIyMTA5NzM1LjkgLT4gLTEKK3hkaXYyNTkgZGl2aWRlIC05NjExMzEyLjMzIDIyMTA5NzM1LjkgLT4gLTAuNDM0NzA5NTA0IEluZXhhY3QgUm91bmRlZAoreGR2aTI1OSBkaXZpZGVpbnQgLTk2MTEzMTIuMzMgMjIxMDk3MzUuOSAtPiAtMAoreG11bDI1OSBtdWx0aXBseSAtOTYxMTMxMi4zMyAyMjEwOTczNS45IC0+IC0yLjEyNTAzNTc3RSsxNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNTkgcG93ZXIgLTk2MTEzMTIuMzMgMjIxMDk3MzYgLT4gNi43NDUzMDgyOEUrMTU0Mzg3NDgxIEluZXhhY3QgUm91bmRlZAoreHJlbTI1OSByZW1haW5kZXIgLTk2MTEzMTIuMzMgMjIxMDk3MzUuOSAtPiAtOTYxMTMxMi4zMworeHN1YjI1OSBzdWJ0cmFjdCAtOTYxMTMxMi4zMyAyMjEwOTczNS45IC0+IC0zMTcyMTA0OC4yIEluZXhhY3QgUm91bmRlZAoreGFkZDI2MCBhZGQgLTU2MDQ5MzguMTVFLTM2ODEyNTQyIDczNTkzNzU3Ny4gLT4gNzM1OTM3NTc3IEluZXhhY3QgUm91bmRlZAoreGNvbTI2MCBjb21wYXJlIC01NjA0OTM4LjE1RS0zNjgxMjU0MiA3MzU5Mzc1NzcuIC0+IC0xCit4ZGl2MjYwIGRpdmlkZSAtNTYwNDkzOC4xNUUtMzY4MTI1NDIgNzM1OTM3NTc3LiAtPiAtNy42MTYwNTEwNEUtMzY4MTI1NDUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjYwIGRpdmlkZWludCAtNTYwNDkzOC4xNUUtMzY4MTI1NDIgNzM1OTM3NTc3LiAtPiAtMAoreG11bDI2MCBtdWx0aXBseSAtNTYwNDkzOC4xNUUtMzY4MTI1NDIgNzM1OTM3NTc3LiAtPiAtNC4xMjQ4ODQ2MEUtMzY4MTI1MjcgSW5leGFjdCBSb3VuZGVkCit4cG93MjYwIHBvd2VyIC01NjA0OTM4LjE1RS0zNjgxMjU0MiA3MzU5Mzc1NzcgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTI2MCByZW1haW5kZXIgLTU2MDQ5MzguMTVFLTM2ODEyNTQyIDczNTkzNzU3Ny4gLT4gLTUuNjA0OTM4MTVFLTM2ODEyNTM2Cit4c3ViMjYwIHN1YnRyYWN0IC01NjA0OTM4LjE1RS0zNjgxMjU0MiA3MzU5Mzc1NzcuIC0+IC03MzU5Mzc1NzcgSW5leGFjdCBSb3VuZGVkCit4YWRkMjYxIGFkZCA2OTM4ODE0MTMuIDI2MDU0NzIyNEUtNDgwMjgxNDE4IC0+IDY5Mzg4MTQxMyBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNjEgY29tcGFyZSA2OTM4ODE0MTMuIDI2MDU0NzIyNEUtNDgwMjgxNDE4IC0+IDEKK3hkaXYyNjEgZGl2aWRlIDY5Mzg4MTQxMy4gMjYwNTQ3MjI0RS00ODAyODE0MTggLT4gMi42NjMxNjk0N0UrNDgwMjgxNDE4IEluZXhhY3QgUm91bmRlZAoreGR2aTI2MSBkaXZpZGVpbnQgNjkzODgxNDEzLiAyNjA1NDcyMjRFLTQ4MDI4MTQxOCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDI2MSBtdWx0aXBseSA2OTM4ODE0MTMuIDI2MDU0NzIyNEUtNDgwMjgxNDE4IC0+IDEuODA3ODg4NzZFLTQ4MDI4MTQwMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNjEgcG93ZXIgNjkzODgxNDEzLiAzIC0+IDMuMzQwODQwNjZFKzI2IEluZXhhY3QgUm91bmRlZAoreHJlbTI2MSByZW1haW5kZXIgNjkzODgxNDEzLiAyNjA1NDcyMjRFLTQ4MDI4MTQxOCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjI2MSBzdWJ0cmFjdCA2OTM4ODE0MTMuIDI2MDU0NzIyNEUtNDgwMjgxNDE4IC0+IDY5Mzg4MTQxMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNjIgYWRkIC0zNDg2NS43Mzc4RS0zNjg3NjgwMjQgMjI5NzExNy44OCAtPiAyMjk3MTE3Ljg4IEluZXhhY3QgUm91bmRlZAoreGNvbTI2MiBjb21wYXJlIC0zNDg2NS43Mzc4RS0zNjg3NjgwMjQgMjI5NzExNy44OCAtPiAtMQoreGRpdjI2MiBkaXZpZGUgLTM0ODY1LjczNzhFLTM2ODc2ODAyNCAyMjk3MTE3Ljg4IC0+IC0xLjUxNzgwMzYwRS0zNjg3NjgwMjYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjYyIGRpdmlkZWludCAtMzQ4NjUuNzM3OEUtMzY4NzY4MDI0IDIyOTcxMTcuODggLT4gLTAKK3htdWwyNjIgbXVsdGlwbHkgLTM0ODY1LjczNzhFLTM2ODc2ODAyNCAyMjk3MTE3Ljg4IC0+IC04LjAwOTA3MDk3RS0zNjg3NjgwMTQgSW5leGFjdCBSb3VuZGVkCit4cG93MjYyIHBvd2VyIC0zNDg2NS43Mzc4RS0zNjg3NjgwMjQgMjI5NzExOCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0yNjIgcmVtYWluZGVyIC0zNDg2NS43Mzc4RS0zNjg3NjgwMjQgMjI5NzExNy44OCAtPiAtMy40ODY1NzM3OEUtMzY4NzY4MDIwCit4c3ViMjYyIHN1YnRyYWN0IC0zNDg2NS43Mzc4RS0zNjg3NjgwMjQgMjI5NzExNy44OCAtPiAtMjI5NzExNy44OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNjMgYWRkIDExMjMuMzI0NTYgNy44Njc0NzkxOEUrOTMwODg4Nzk2IC0+IDcuODY3NDc5MThFKzkzMDg4ODc5NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNjMgY29tcGFyZSAxMTIzLjMyNDU2IDcuODY3NDc5MThFKzkzMDg4ODc5NiAtPiAtMQoreGRpdjI2MyBkaXZpZGUgMTEyMy4zMjQ1NiA3Ljg2NzQ3OTE4RSs5MzA4ODg3OTYgLT4gMS40Mjc4MDc0OEUtOTMwODg4Nzk0IEluZXhhY3QgUm91bmRlZAoreGR2aTI2MyBkaXZpZGVpbnQgMTEyMy4zMjQ1NiA3Ljg2NzQ3OTE4RSs5MzA4ODg3OTYgLT4gMAoreG11bDI2MyBtdWx0aXBseSAxMTIzLjMyNDU2IDcuODY3NDc5MThFKzkzMDg4ODc5NiAtPiA4LjgzNzczMjU5RSs5MzA4ODg3OTkgSW5leGFjdCBSb3VuZGVkCit4cG93MjYzIHBvd2VyIDExMjMuMzI0NTYgOCAtPiAyLjUzNTM3NDAxRSsyNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNjMgcmVtYWluZGVyIDExMjMuMzI0NTYgNy44Njc0NzkxOEUrOTMwODg4Nzk2IC0+IDExMjMuMzI0NTYKK3hzdWIyNjMgc3VidHJhY3QgMTEyMy4zMjQ1NiA3Ljg2NzQ3OTE4RSs5MzA4ODg3OTYgLT4gLTcuODY3NDc5MThFKzkzMDg4ODc5NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNjQgYWRkIDU2LjY2MDc0NjVFKzQ2NzgxMjU2NSA5MDk1NTI1MTJFKzc2NDUxNjIwMCAtPiA5LjA5NTUyNTEyRSs3NjQ1MTYyMDggSW5leGFjdCBSb3VuZGVkCit4Y29tMjY0IGNvbXBhcmUgNTYuNjYwNzQ2NUUrNDY3ODEyNTY1IDkwOTU1MjUxMkUrNzY0NTE2MjAwIC0+IC0xCit4ZGl2MjY0IGRpdmlkZSA1Ni42NjA3NDY1RSs0Njc4MTI1NjUgOTA5NTUyNTEyRSs3NjQ1MTYyMDAgLT4gNi4yMjk1MTg5OUUtMjk2NzAzNjQzIEluZXhhY3QgUm91bmRlZAoreGR2aTI2NCBkaXZpZGVpbnQgNTYuNjYwNzQ2NUUrNDY3ODEyNTY1IDkwOTU1MjUxMkUrNzY0NTE2MjAwIC0+IDAKK3htdWwyNjQgbXVsdGlwbHkgNTYuNjYwNzQ2NUUrNDY3ODEyNTY1IDkwOTU1MjUxMkUrNzY0NTE2MjAwIC0+IEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAoreHBvdzI2NCBwb3dlciA1Ni42NjA3NDY1RSs0Njc4MTI1NjUgOSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNjQgcmVtYWluZGVyIDU2LjY2MDc0NjVFKzQ2NzgxMjU2NSA5MDk1NTI1MTJFKzc2NDUxNjIwMCAtPiA1LjY2NjA3NDY1RSs0Njc4MTI1NjYKK3hzdWIyNjQgc3VidHJhY3QgNTYuNjYwNzQ2NUUrNDY3ODEyNTY1IDkwOTU1MjUxMkUrNzY0NTE2MjAwIC0+IC05LjA5NTUyNTEyRSs3NjQ1MTYyMDggSW5leGFjdCBSb3VuZGVkCit4YWRkMjY1IGFkZCAtMS44NTc3MTg0MEUrMzY1NTUyNTQwIC03MzAyODMzOS43IC0+IC0xLjg1NzcxODQwRSszNjU1NTI1NDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMjY1IGNvbXBhcmUgLTEuODU3NzE4NDBFKzM2NTU1MjU0MCAtNzMwMjgzMzkuNyAtPiAtMQoreGRpdjI2NSBkaXZpZGUgLTEuODU3NzE4NDBFKzM2NTU1MjU0MCAtNzMwMjgzMzkuNyAtPiAyLjU0MzgzMjE3RSszNjU1NTI1MzIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjY1IGRpdmlkZWludCAtMS44NTc3MTg0MEUrMzY1NTUyNTQwIC03MzAyODMzOS43IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjY1IG11bHRpcGx5IC0xLjg1NzcxODQwRSszNjU1NTI1NDAgLTczMDI4MzM5LjcgLT4gMS4zNTY2NjA5MEUrMzY1NTUyNTQ4IEluZXhhY3QgUm91bmRlZAoreHBvdzI2NSBwb3dlciAtMS44NTc3MTg0MEUrMzY1NTUyNTQwIC03MzAyODM0MCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0yNjUgcmVtYWluZGVyIC0xLjg1NzcxODQwRSszNjU1NTI1NDAgLTczMDI4MzM5LjcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyNjUgc3VidHJhY3QgLTEuODU3NzE4NDBFKzM2NTU1MjU0MCAtNzMwMjgzMzkuNyAtPiAtMS44NTc3MTg0MEUrMzY1NTUyNTQwIEluZXhhY3QgUm91bmRlZAoreGFkZDI2NiBhZGQgMzQuMTkzNTUyNSAtNDA3NjcuNjQ1MCAtPiAtNDA3MzMuNDUxNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNjYgY29tcGFyZSAzNC4xOTM1NTI1IC00MDc2Ny42NDUwIC0+IDEKK3hkaXYyNjYgZGl2aWRlIDM0LjE5MzU1MjUgLTQwNzY3LjY0NTAgLT4gLTAuMDAwODM4NzQyNDAyIEluZXhhY3QgUm91bmRlZAoreGR2aTI2NiBkaXZpZGVpbnQgMzQuMTkzNTUyNSAtNDA3NjcuNjQ1MCAtPiAtMAoreG11bDI2NiBtdWx0aXBseSAzNC4xOTM1NTI1IC00MDc2Ny42NDUwIC0+IC0xMzkzOTkwLjYxIEluZXhhY3QgUm91bmRlZAoreHBvdzI2NiBwb3dlciAzNC4xOTM1NTI1IC00MDc2OCAtPiAxLjQ1MTc0MjEwRS02MjUzNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNjYgcmVtYWluZGVyIDM0LjE5MzU1MjUgLTQwNzY3LjY0NTAgLT4gMzQuMTkzNTUyNQoreHN1YjI2NiBzdWJ0cmFjdCAzNC4xOTM1NTI1IC00MDc2Ny42NDUwIC0+IDQwODAxLjgzODYgSW5leGFjdCBSb3VuZGVkCit4YWRkMjY3IGFkZCAyNi4wMDA5MTY4RSs3NTE2MTgyOTQgLTMwNDAxOS45MjkgLT4gMi42MDAwOTE2OEUrNzUxNjE4Mjk1IEluZXhhY3QgUm91bmRlZAoreGNvbTI2NyBjb21wYXJlIDI2LjAwMDkxNjhFKzc1MTYxODI5NCAtMzA0MDE5LjkyOSAtPiAxCit4ZGl2MjY3IGRpdmlkZSAyNi4wMDA5MTY4RSs3NTE2MTgyOTQgLTMwNDAxOS45MjkgLT4gLTguNTUyMzcyNTBFKzc1MTYxODI4OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNjcgZGl2aWRlaW50IDI2LjAwMDkxNjhFKzc1MTYxODI5NCAtMzA0MDE5LjkyOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDI2NyBtdWx0aXBseSAyNi4wMDA5MTY4RSs3NTE2MTgyOTQgLTMwNDAxOS45MjkgLT4gLTcuOTA0Nzk2ODhFKzc1MTYxODMwMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNjcgcG93ZXIgMjYuMDAwOTE2OEUrNzUxNjE4Mjk0IC0zMDQwMjAgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjY3IHJlbWFpbmRlciAyNi4wMDA5MTY4RSs3NTE2MTgyOTQgLTMwNDAxOS45MjkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyNjcgc3VidHJhY3QgMjYuMDAwOTE2OEUrNzUxNjE4Mjk0IC0zMDQwMTkuOTI5IC0+IDIuNjAwMDkxNjhFKzc1MTYxODI5NSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNjggYWRkIC01OC40ODUzMDcyRSs1ODg1NDAwNTUgLTQ2NDcuMzIwNSAtPiAtNS44NDg1MzA3MkUrNTg4NTQwMDU2IEluZXhhY3QgUm91bmRlZAoreGNvbTI2OCBjb21wYXJlIC01OC40ODUzMDcyRSs1ODg1NDAwNTUgLTQ2NDcuMzIwNSAtPiAtMQoreGRpdjI2OCBkaXZpZGUgLTU4LjQ4NTMwNzJFKzU4ODU0MDA1NSAtNDY0Ny4zMjA1IC0+IDEuMjU4NDczNzJFKzU4ODU0MDA1MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNjggZGl2aWRlaW50IC01OC40ODUzMDcyRSs1ODg1NDAwNTUgLTQ2NDcuMzIwNSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDI2OCBtdWx0aXBseSAtNTguNDg1MzA3MkUrNTg4NTQwMDU1IC00NjQ3LjMyMDUgLT4gMi43MTc5OTk2N0UrNTg4NTQwMDYwIEluZXhhY3QgUm91bmRlZAoreHBvdzI2OCBwb3dlciAtNTguNDg1MzA3MkUrNTg4NTQwMDU1IC00NjQ3IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0yNjggcmVtYWluZGVyIC01OC40ODUzMDcyRSs1ODg1NDAwNTUgLTQ2NDcuMzIwNSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjI2OCBzdWJ0cmFjdCAtNTguNDg1MzA3MkUrNTg4NTQwMDU1IC00NjQ3LjMyMDUgLT4gLTUuODQ4NTMwNzJFKzU4ODU0MDA1NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNjkgYWRkIDUxLjAyNTEwMSAtNDQ2NzY5MS41NyAtPiAtNDQ2NzY0MC41NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNjkgY29tcGFyZSA1MS4wMjUxMDEgLTQ0Njc2OTEuNTcgLT4gMQoreGRpdjI2OSBkaXZpZGUgNTEuMDI1MTAxIC00NDY3NjkxLjU3IC0+IC0wLjAwMDAxMTQyMDkwOTUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjY5IGRpdmlkZWludCA1MS4wMjUxMDEgLTQ0Njc2OTEuNTcgLT4gLTAKK3htdWwyNjkgbXVsdGlwbHkgNTEuMDI1MTAxIC00NDY3NjkxLjU3IC0+IC0yMjc5NjQ0MTQgSW5leGFjdCBSb3VuZGVkCit4cG93MjY5IHBvd2VyIDUxLjAyNTEwMSAtNDQ2NzY5MiAtPiA0LjQ5NDYyNTg5RS03NjI5ODUzIEluZXhhY3QgUm91bmRlZAoreHJlbTI2OSByZW1haW5kZXIgNTEuMDI1MTAxIC00NDY3NjkxLjU3IC0+IDUxLjAyNTEwMQoreHN1YjI2OSBzdWJ0cmFjdCA1MS4wMjUxMDEgLTQ0Njc2OTEuNTcgLT4gNDQ2Nzc0Mi42MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNzAgYWRkIC0yMjE0Ljc2NTgyIDM3OTc4NTM3MkUrMjIzMTE3NTcyIC0+IDMuNzk3ODUzNzJFKzIyMzExNzU4MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNzAgY29tcGFyZSAtMjIxNC43NjU4MiAzNzk3ODUzNzJFKzIyMzExNzU3MiAtPiAtMQoreGRpdjI3MCBkaXZpZGUgLTIyMTQuNzY1ODIgMzc5Nzg1MzcyRSsyMjMxMTc1NzIgLT4gLTUuODMxNjI0ODdFLTIyMzExNzU3OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNzAgZGl2aWRlaW50IC0yMjE0Ljc2NTgyIDM3OTc4NTM3MkUrMjIzMTE3NTcyIC0+IC0wCit4bXVsMjcwIG11bHRpcGx5IC0yMjE0Ljc2NTgyIDM3OTc4NTM3MkUrMjIzMTE3NTcyIC0+IC04LjQxMTM1NjYxRSsyMjMxMTc1ODMgSW5leGFjdCBSb3VuZGVkCit4cG93MjcwIHBvd2VyIC0yMjE0Ljc2NTgyIDQgLT4gMi40MDYwODY1OEUrMTMgSW5leGFjdCBSb3VuZGVkCit4cmVtMjcwIHJlbWFpbmRlciAtMjIxNC43NjU4MiAzNzk3ODUzNzJFKzIyMzExNzU3MiAtPiAtMjIxNC43NjU4MgoreHN1YjI3MCBzdWJ0cmFjdCAtMjIxNC43NjU4MiAzNzk3ODUzNzJFKzIyMzExNzU3MiAtPiAtMy43OTc4NTM3MkUrMjIzMTE3NTgwIEluZXhhY3QgUm91bmRlZAoreGFkZDI3MSBhZGQgLTI1NjQuNzUyMDdFLTg0MTQ0MzkyOSAtNjUzNDk4MTg3IC0+IC02NTM0OTgxODcgSW5leGFjdCBSb3VuZGVkCit4Y29tMjcxIGNvbXBhcmUgLTI1NjQuNzUyMDdFLTg0MTQ0MzkyOSAtNjUzNDk4MTg3IC0+IDEKK3hkaXYyNzEgZGl2aWRlIC0yNTY0Ljc1MjA3RS04NDE0NDM5MjkgLTY1MzQ5ODE4NyAtPiAzLjkyNDY1MDYzRS04NDE0NDM5MzUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjcxIGRpdmlkZWludCAtMjU2NC43NTIwN0UtODQxNDQzOTI5IC02NTM0OTgxODcgLT4gMAoreG11bDI3MSBtdWx0aXBseSAtMjU2NC43NTIwN0UtODQxNDQzOTI5IC02NTM0OTgxODcgLT4gMS42NzYwNjA4M0UtODQxNDQzOTE3IEluZXhhY3QgUm91bmRlZAoreHBvdzI3MSBwb3dlciAtMjU2NC43NTIwN0UtODQxNDQzOTI5IC02NTM0OTgxODcgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTI3MSByZW1haW5kZXIgLTI1NjQuNzUyMDdFLTg0MTQ0MzkyOSAtNjUzNDk4MTg3IC0+IC0yLjU2NDc1MjA3RS04NDE0NDM5MjYKK3hzdWIyNzEgc3VidHJhY3QgLTI1NjQuNzUyMDdFLTg0MTQ0MzkyOSAtNjUzNDk4MTg3IC0+IDY1MzQ5ODE4NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNzIgYWRkIDUxMzExNTUyOS4gMjc3NzUwNzUuNkUrMjE3MTMzMzUyIC0+IDIuNzc3NTA3NTZFKzIxNzEzMzM1OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNzIgY29tcGFyZSA1MTMxMTU1MjkuIDI3Nzc1MDc1LjZFKzIxNzEzMzM1MiAtPiAtMQoreGRpdjI3MiBkaXZpZGUgNTEzMTE1NTI5LiAyNzc3NTA3NS42RSsyMTcxMzMzNTIgLT4gMS44NDczOTU2MkUtMjE3MTMzMzUxIEluZXhhY3QgUm91bmRlZAoreGR2aTI3MiBkaXZpZGVpbnQgNTEzMTE1NTI5LiAyNzc3NTA3NS42RSsyMTcxMzMzNTIgLT4gMAoreG11bDI3MiBtdWx0aXBseSA1MTMxMTU1MjkuIDI3Nzc1MDc1LjZFKzIxNzEzMzM1MiAtPiAxLjQyNTE4MjI2RSsyMTcxMzMzNjggSW5leGFjdCBSb3VuZGVkCit4cG93MjcyIHBvd2VyIDUxMzExNTUyOS4gMyAtPiAxLjM1MDk2OTI4RSsyNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNzIgcmVtYWluZGVyIDUxMzExNTUyOS4gMjc3NzUwNzUuNkUrMjE3MTMzMzUyIC0+IDUxMzExNTUyOQoreHN1YjI3MiBzdWJ0cmFjdCA1MTMxMTU1MjkuIDI3Nzc1MDc1LjZFKzIxNzEzMzM1MiAtPiAtMi43Nzc1MDc1NkUrMjE3MTMzMzU5IEluZXhhY3QgUm91bmRlZAoreGFkZDI3MyBhZGQgLTI0NzE1Ny4yMDggLTUzMjk5MC40NTMgLT4gLTc4MDE0Ny42NjEKK3hjb20yNzMgY29tcGFyZSAtMjQ3MTU3LjIwOCAtNTMyOTkwLjQ1MyAtPiAxCit4ZGl2MjczIGRpdmlkZSAtMjQ3MTU3LjIwOCAtNTMyOTkwLjQ1MyAtPiAwLjQ2MzcxNzg5MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNzMgZGl2aWRlaW50IC0yNDcxNTcuMjA4IC01MzI5OTAuNDUzIC0+IDAKK3htdWwyNzMgbXVsdGlwbHkgLTI0NzE1Ny4yMDggLTUzMjk5MC40NTMgLT4gMS4zMTczMjQzMkUrMTEgSW5leGFjdCBSb3VuZGVkCit4cG93MjczIHBvd2VyIC0yNDcxNTcuMjA4IC01MzI5OTAgLT4gMS40ODMxNDAzM0UtMjg3NDQwMSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNzMgcmVtYWluZGVyIC0yNDcxNTcuMjA4IC01MzI5OTAuNDUzIC0+IC0yNDcxNTcuMjA4Cit4c3ViMjczIHN1YnRyYWN0IC0yNDcxNTcuMjA4IC01MzI5OTAuNDUzIC0+IDI4NTgzMy4yNDUKK3hhZGQyNzQgYWRkIDQwLjI0OTA3NjRFLTMzOTQ4MjI1MyA3NjI2Ljg1NDQyRSs1OTQyNjQ1NDAgLT4gNy42MjY4NTQ0MkUrNTk0MjY0NTQzIEluZXhhY3QgUm91bmRlZAoreGNvbTI3NCBjb21wYXJlIDQwLjI0OTA3NjRFLTMzOTQ4MjI1MyA3NjI2Ljg1NDQyRSs1OTQyNjQ1NDAgLT4gLTEKK3hkaXYyNzQgZGl2aWRlIDQwLjI0OTA3NjRFLTMzOTQ4MjI1MyA3NjI2Ljg1NDQyRSs1OTQyNjQ1NDAgLT4gNS4yNzcyODM5NUUtOTMzNzQ2Nzk2IEluZXhhY3QgUm91bmRlZAoreGR2aTI3NCBkaXZpZGVpbnQgNDAuMjQ5MDc2NEUtMzM5NDgyMjUzIDc2MjYuODU0NDJFKzU5NDI2NDU0MCAtPiAwCit4bXVsMjc0IG11bHRpcGx5IDQwLjI0OTA3NjRFLTMzOTQ4MjI1MyA3NjI2Ljg1NDQyRSs1OTQyNjQ1NDAgLT4gMy4wNjk3Mzg0NkUrMjU0NzgyMjkyIEluZXhhY3QgUm91bmRlZAoreHBvdzI3NCBwb3dlciA0MC4yNDkwNzY0RS0zMzk0ODIyNTMgOCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0yNzQgcmVtYWluZGVyIDQwLjI0OTA3NjRFLTMzOTQ4MjI1MyA3NjI2Ljg1NDQyRSs1OTQyNjQ1NDAgLT4gNC4wMjQ5MDc2NEUtMzM5NDgyMjUyCit4c3ViMjc0IHN1YnRyYWN0IDQwLjI0OTA3NjRFLTMzOTQ4MjI1MyA3NjI2Ljg1NDQyRSs1OTQyNjQ1NDAgLT4gLTcuNjI2ODU0NDJFKzU5NDI2NDU0MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNzUgYWRkIC0xMTU2MDA4LjggLTg4NzAzODIuMzYgLT4gLTEwMDI2MzkxLjIgSW5leGFjdCBSb3VuZGVkCit4Y29tMjc1IGNvbXBhcmUgLTExNTYwMDguOCAtODg3MDM4Mi4zNiAtPiAxCit4ZGl2Mjc1IGRpdmlkZSAtMTE1NjAwOC44IC04ODcwMzgyLjM2IC0+IDAuMTMwMzIyMzE5IEluZXhhY3QgUm91bmRlZAoreGR2aTI3NSBkaXZpZGVpbnQgLTExNTYwMDguOCAtODg3MDM4Mi4zNiAtPiAwCit4bXVsMjc1IG11bHRpcGx5IC0xMTU2MDA4LjggLTg4NzAzODIuMzYgLT4gMS4wMjU0MjQwMUUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93Mjc1IHBvd2VyIC0xMTU2MDA4LjggLTg4NzAzODIgLT4gNC4zMjQ5NDk5NkUtNTM3ODA3ODIgSW5leGFjdCBSb3VuZGVkCit4cmVtMjc1IHJlbWFpbmRlciAtMTE1NjAwOC44IC04ODcwMzgyLjM2IC0+IC0xMTU2MDA4LjgwCit4c3ViMjc1IHN1YnRyYWN0IC0xMTU2MDA4LjggLTg4NzAzODIuMzYgLT4gNzcxNDM3My41NgoreGFkZDI3NiBhZGQgODgwMDk3OTI4LiAtNTI0NTUwMTEuMUUrMjA0NTM4MjE4IC0+IC01LjI0NTUwMTExRSsyMDQ1MzgyMjUgSW5leGFjdCBSb3VuZGVkCit4Y29tMjc2IGNvbXBhcmUgODgwMDk3OTI4LiAtNTI0NTUwMTEuMUUrMjA0NTM4MjE4IC0+IDEKK3hkaXYyNzYgZGl2aWRlIDg4MDA5NzkyOC4gLTUyNDU1MDExLjFFKzIwNDUzODIxOCAtPiAtMS42Nzc4MTQ3OEUtMjA0NTM4MjE3IEluZXhhY3QgUm91bmRlZAoreGR2aTI3NiBkaXZpZGVpbnQgODgwMDk3OTI4LiAtNTI0NTUwMTEuMUUrMjA0NTM4MjE4IC0+IC0wCit4bXVsMjc2IG11bHRpcGx5IDg4MDA5NzkyOC4gLTUyNDU1MDExLjFFKzIwNDUzODIxOCAtPiAtNC42MTY1NTQ2NkUrMjA0NTM4MjM0IEluZXhhY3QgUm91bmRlZAoreHBvdzI3NiBwb3dlciA4ODAwOTc5MjguIC01IC0+IDEuODkzODQ3NTFFLTQ1IEluZXhhY3QgUm91bmRlZAoreHJlbTI3NiByZW1haW5kZXIgODgwMDk3OTI4LiAtNTI0NTUwMTEuMUUrMjA0NTM4MjE4IC0+IDg4MDA5NzkyOAoreHN1YjI3NiBzdWJ0cmFjdCA4ODAwOTc5MjguIC01MjQ1NTAxMS4xRSsyMDQ1MzgyMTggLT4gNS4yNDU1MDExMUUrMjA0NTM4MjI1IEluZXhhY3QgUm91bmRlZAoreGFkZDI3NyBhZGQgNTc5Ni4yNTI0IDM0NDU4MzI5LjdFKzgzMjEyOTQyNiAtPiAzLjQ0NTgzMjk3RSs4MzIxMjk0MzMgSW5leGFjdCBSb3VuZGVkCit4Y29tMjc3IGNvbXBhcmUgNTc5Ni4yNTI0IDM0NDU4MzI5LjdFKzgzMjEyOTQyNiAtPiAtMQoreGRpdjI3NyBkaXZpZGUgNTc5Ni4yNTI0IDM0NDU4MzI5LjdFKzgzMjEyOTQyNiAtPiAxLjY4MjEwNDg2RS04MzIxMjk0MzAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjc3IGRpdmlkZWludCA1Nzk2LjI1MjQgMzQ0NTgzMjkuN0UrODMyMTI5NDI2IC0+IDAKK3htdWwyNzcgbXVsdGlwbHkgNTc5Ni4yNTI0IDM0NDU4MzI5LjdFKzgzMjEyOTQyNiAtPiAxLjk5NzI5MTc2RSs4MzIxMjk0MzcgSW5leGFjdCBSb3VuZGVkCit4cG93Mjc3IHBvd2VyIDU3OTYuMjUyNCAzIC0+IDEuOTQ3MzQwMzdFKzExIEluZXhhY3QgUm91bmRlZAoreHJlbTI3NyByZW1haW5kZXIgNTc5Ni4yNTI0IDM0NDU4MzI5LjdFKzgzMjEyOTQyNiAtPiA1Nzk2LjI1MjQKK3hzdWIyNzcgc3VidHJhY3QgNTc5Ni4yNTI0IDM0NDU4MzI5LjdFKzgzMjEyOTQyNiAtPiAtMy40NDU4MzI5N0UrODMyMTI5NDMzIEluZXhhY3QgUm91bmRlZAoreGFkZDI3OCBhZGQgMjcuMTAwMDkyM0UtMjE4MDMyMjIzIC00NS4wMTk4MzQxIC0+IC00NS4wMTk4MzQxIEluZXhhY3QgUm91bmRlZAoreGNvbTI3OCBjb21wYXJlIDI3LjEwMDA5MjNFLTIxODAzMjIyMyAtNDUuMDE5ODM0MSAtPiAxCit4ZGl2Mjc4IGRpdmlkZSAyNy4xMDAwOTIzRS0yMTgwMzIyMjMgLTQ1LjAxOTgzNDEgLT4gLTYuMDE5NTg5NTVFLTIxODAzMjIyNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNzggZGl2aWRlaW50IDI3LjEwMDA5MjNFLTIxODAzMjIyMyAtNDUuMDE5ODM0MSAtPiAtMAoreG11bDI3OCBtdWx0aXBseSAyNy4xMDAwOTIzRS0yMTgwMzIyMjMgLTQ1LjAxOTgzNDEgLT4gLTEuMjIwMDQxNjZFLTIxODAzMjIyMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNzggcG93ZXIgMjcuMTAwMDkyM0UtMjE4MDMyMjIzIC00NSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNzggcmVtYWluZGVyIDI3LjEwMDA5MjNFLTIxODAzMjIyMyAtNDUuMDE5ODM0MSAtPiAyLjcxMDAwOTIzRS0yMTgwMzIyMjIKK3hzdWIyNzggc3VidHJhY3QgMjcuMTAwMDkyM0UtMjE4MDMyMjIzIC00NS4wMTk4MzQxIC0+IDQ1LjAxOTgzNDEgSW5leGFjdCBSb3VuZGVkCit4YWRkMjc5IGFkZCA0MjY0MzQ3Ny44IDI2MTE4NDY1RS03MzAzOTA1NDkgLT4gNDI2NDM0NzcuOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNzkgY29tcGFyZSA0MjY0MzQ3Ny44IDI2MTE4NDY1RS03MzAzOTA1NDkgLT4gMQoreGRpdjI3OSBkaXZpZGUgNDI2NDM0NzcuOCAyNjExODQ2NUUtNzMwMzkwNTQ5IC0+IDEuNjMyNjk0NjRFKzczMDM5MDU0OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNzkgZGl2aWRlaW50IDQyNjQzNDc3LjggMjYxMTg0NjVFLTczMDM5MDU0OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDI3OSBtdWx0aXBseSA0MjY0MzQ3Ny44IDI2MTE4NDY1RS03MzAzOTA1NDkgLT4gMS4xMTM3ODIxOEUtNzMwMzkwNTM0IEluZXhhY3QgUm91bmRlZAoreHBvdzI3OSBwb3dlciA0MjY0MzQ3Ny44IDMgLT4gNy43NTQ1NzIzMEUrMjIgSW5leGFjdCBSb3VuZGVkCit4cmVtMjc5IHJlbWFpbmRlciA0MjY0MzQ3Ny44IDI2MTE4NDY1RS03MzAzOTA1NDkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyNzkgc3VidHJhY3QgNDI2NDM0NzcuOCAyNjExODQ2NUUtNzMwMzkwNTQ5IC0+IDQyNjQzNDc3LjggSW5leGFjdCBSb3VuZGVkCit4YWRkMjgwIGFkZCAtMzE5MTguOTE3NkUtMTYzMDMxNjU3IC0yMS41NDIyODI0RS04MDczMTcyNTggLT4gLTMuMTkxODkxNzZFLTE2MzAzMTY1MyBJbmV4YWN0IFJvdW5kZWQKK3hjb20yODAgY29tcGFyZSAtMzE5MTguOTE3NkUtMTYzMDMxNjU3IC0yMS41NDIyODI0RS04MDczMTcyNTggLT4gLTEKK3hkaXYyODAgZGl2aWRlIC0zMTkxOC45MTc2RS0xNjMwMzE2NTcgLTIxLjU0MjI4MjRFLTgwNzMxNzI1OCAtPiAxLjQ4MTY4NjkwRSs2NDQyODU2MDQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjgwIGRpdmlkZWludCAtMzE5MTguOTE3NkUtMTYzMDMxNjU3IC0yMS41NDIyODI0RS04MDczMTcyNTggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyODAgbXVsdGlwbHkgLTMxOTE4LjkxNzZFLTE2MzAzMTY1NyAtMjEuNTQyMjgyNEUtODA3MzE3MjU4IC0+IDYuODc2MDYzMzdFLTk3MDM0ODkxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyODAgcG93ZXIgLTMxOTE4LjkxNzZFLTE2MzAzMTY1NyAtMiAtPiA5LjgxNTMwMjUwRSszMjYwNjMzMDQgSW5leGFjdCBSb3VuZGVkCit4cmVtMjgwIHJlbWFpbmRlciAtMzE5MTguOTE3NkUtMTYzMDMxNjU3IC0yMS41NDIyODI0RS04MDczMTcyNTggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyODAgc3VidHJhY3QgLTMxOTE4LjkxNzZFLTE2MzAzMTY1NyAtMjEuNTQyMjgyNEUtODA3MzE3MjU4IC0+IC0zLjE5MTg5MTc2RS0xNjMwMzE2NTMgSW5leGFjdCBSb3VuZGVkCit4YWRkMjgxIGFkZCA4NDIyNDg0MS4wIDIuNjI1NDgyNTVFKzY0NzA4NzYwOCAtPiAyLjYyNTQ4MjU1RSs2NDcwODc2MDggSW5leGFjdCBSb3VuZGVkCit4Y29tMjgxIGNvbXBhcmUgODQyMjQ4NDEuMCAyLjYyNTQ4MjU1RSs2NDcwODc2MDggLT4gLTEKK3hkaXYyODEgZGl2aWRlIDg0MjI0ODQxLjAgMi42MjU0ODI1NUUrNjQ3MDg3NjA4IC0+IDMuMjA3OTc1NjVFLTY0NzA4NzYwMSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyODEgZGl2aWRlaW50IDg0MjI0ODQxLjAgMi42MjU0ODI1NUUrNjQ3MDg3NjA4IC0+IDAKK3htdWwyODEgbXVsdGlwbHkgODQyMjQ4NDEuMCAyLjYyNTQ4MjU1RSs2NDcwODc2MDggLT4gMi4yMTEzMDg1MEUrNjQ3MDg3NjE2IEluZXhhY3QgUm91bmRlZAoreHBvdzI4MSBwb3dlciA4NDIyNDg0MS4wIDMgLT4gNS45NzQ3NjE4NUUrMjMgSW5leGFjdCBSb3VuZGVkCit4cmVtMjgxIHJlbWFpbmRlciA4NDIyNDg0MS4wIDIuNjI1NDgyNTVFKzY0NzA4NzYwOCAtPiA4NDIyNDg0MS4wCit4c3ViMjgxIHN1YnRyYWN0IDg0MjI0ODQxLjAgMi42MjU0ODI1NUUrNjQ3MDg3NjA4IC0+IC0yLjYyNTQ4MjU1RSs2NDcwODc2MDggSW5leGFjdCBSb3VuZGVkCit4YWRkMjgyIGFkZCAtNjQ0MTM2OTguOSAtNjY3NC4xMDU1RS03MDEwNDc4NTIgLT4gLTY0NDEzNjk4LjkgSW5leGFjdCBSb3VuZGVkCit4Y29tMjgyIGNvbXBhcmUgLTY0NDEzNjk4LjkgLTY2NzQuMTA1NUUtNzAxMDQ3ODUyIC0+IC0xCit4ZGl2MjgyIGRpdmlkZSAtNjQ0MTM2OTguOSAtNjY3NC4xMDU1RS03MDEwNDc4NTIgLT4gOS42NTEyODU2OUUrNzAxMDQ3ODU1IEluZXhhY3QgUm91bmRlZAoreGR2aTI4MiBkaXZpZGVpbnQgLTY0NDEzNjk4LjkgLTY2NzQuMTA1NUUtNzAxMDQ3ODUyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjgyIG11bHRpcGx5IC02NDQxMzY5OC45IC02Njc0LjEwNTVFLTcwMTA0Nzg1MiAtPiA0LjI5OTAzODIyRS03MDEwNDc4NDEgSW5leGFjdCBSb3VuZGVkCit4cG93MjgyIHBvd2VyIC02NDQxMzY5OC45IC03IC0+IC0yLjE3MzQ2MzM4RS01NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yODIgcmVtYWluZGVyIC02NDQxMzY5OC45IC02Njc0LjEwNTVFLTcwMTA0Nzg1MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjI4MiBzdWJ0cmFjdCAtNjQ0MTM2OTguOSAtNjY3NC4xMDU1RS03MDEwNDc4NTIgLT4gLTY0NDEzNjk4LjkgSW5leGFjdCBSb3VuZGVkCit4YWRkMjgzIGFkZCAtNjIuNTA1OTIwOCA5LjU3OTU3NzlFLTg5ODM1MDAxMiAtPiAtNjIuNTA1OTIwOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yODMgY29tcGFyZSAtNjIuNTA1OTIwOCA5LjU3OTU3NzlFLTg5ODM1MDAxMiAtPiAtMQoreGRpdjI4MyBkaXZpZGUgLTYyLjUwNTkyMDggOS41Nzk1Nzc5RS04OTgzNTAwMTIgLT4gLTYuNTI0OTEzODhFKzg5ODM1MDAxMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyODMgZGl2aWRlaW50IC02Mi41MDU5MjA4IDkuNTc5NTc3OUUtODk4MzUwMDEyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjgzIG11bHRpcGx5IC02Mi41MDU5MjA4IDkuNTc5NTc3OUUtODk4MzUwMDEyIC0+IC01Ljk4NzgwMzM4RS04OTgzNTAwMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MjgzIHBvd2VyIC02Mi41MDU5MjA4IDEwIC0+IDkuMTAzNTY2NTlFKzE3IEluZXhhY3QgUm91bmRlZAoreHJlbTI4MyByZW1haW5kZXIgLTYyLjUwNTkyMDggOS41Nzk1Nzc5RS04OTgzNTAwMTIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyODMgc3VidHJhY3QgLTYyLjUwNTkyMDggOS41Nzk1Nzc5RS04OTgzNTAwMTIgLT4gLTYyLjUwNTkyMDggSW5leGFjdCBSb3VuZGVkCit4YWRkMjg0IGFkZCA5MDkwOTUwLjgwIDQzNi40MDA5MzIgLT4gOTA5MTM4Ny4yMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yODQgY29tcGFyZSA5MDkwOTUwLjgwIDQzNi40MDA5MzIgLT4gMQoreGRpdjI4NCBkaXZpZGUgOTA5MDk1MC44MCA0MzYuNDAwOTMyIC0+IDIwODMxLjY0ODUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjg0IGRpdmlkZWludCA5MDkwOTUwLjgwIDQzNi40MDA5MzIgLT4gMjA4MzEKK3htdWwyODQgbXVsdGlwbHkgOTA5MDk1MC44MCA0MzYuNDAwOTMyIC0+IDMuOTY3Mjk5NDBFKzkgSW5leGFjdCBSb3VuZGVkCit4cG93Mjg0IHBvd2VyIDkwOTA5NTAuODAgNDM2IC0+IDguOTg3ODk1NTdFKzMwMzMgSW5leGFjdCBSb3VuZGVkCit4cmVtMjg0IHJlbWFpbmRlciA5MDkwOTUwLjgwIDQzNi40MDA5MzIgLT4gMjgyLjk4NTUwOAoreHN1YjI4NCBzdWJ0cmFjdCA5MDkwOTUwLjgwIDQzNi40MDA5MzIgLT4gOTA5MDUxNC40MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyODUgYWRkIC04OTgzMzgyNS43RSszMjkyMDUzOTMgLTc3OTQzMC4xOTQgLT4gLTguOTgzMzgyNTdFKzMyOTIwNTQwMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yODUgY29tcGFyZSAtODk4MzM4MjUuN0UrMzI5MjA1MzkzIC03Nzk0MzAuMTk0IC0+IC0xCit4ZGl2Mjg1IGRpdmlkZSAtODk4MzM4MjUuN0UrMzI5MjA1MzkzIC03Nzk0MzAuMTk0IC0+IDEuMTUyNTU3NjhFKzMyOTIwNTM5NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyODUgZGl2aWRlaW50IC04OTgzMzgyNS43RSszMjkyMDUzOTMgLTc3OTQzMC4xOTQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyODUgbXVsdGlwbHkgLTg5ODMzODI1LjdFKzMyOTIwNTM5MyAtNzc5NDMwLjE5NCAtPiA3LjAwMTkxOTYyRSszMjkyMDU0MDYgSW5leGFjdCBSb3VuZGVkCit4cG93Mjg1IHBvd2VyIC04OTgzMzgyNS43RSszMjkyMDUzOTMgLTc3OTQzMCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0yODUgcmVtYWluZGVyIC04OTgzMzgyNS43RSszMjkyMDUzOTMgLTc3OTQzMC4xOTQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyODUgc3VidHJhY3QgLTg5ODMzODI1LjdFKzMyOTIwNTM5MyAtNzc5NDMwLjE5NCAtPiAtOC45ODMzODI1N0UrMzI5MjA1NDAwIEluZXhhY3QgUm91bmRlZAoreGFkZDI4NiBhZGQgLTcxNDU2Mi4wMTlFKzc1MDIwNTY4OCA3MDQwNzk3NjQgLT4gLTcuMTQ1NjIwMTlFKzc1MDIwNTY5MyBJbmV4YWN0IFJvdW5kZWQKK3hjb20yODYgY29tcGFyZSAtNzE0NTYyLjAxOUUrNzUwMjA1Njg4IDcwNDA3OTc2NCAtPiAtMQoreGRpdjI4NiBkaXZpZGUgLTcxNDU2Mi4wMTlFKzc1MDIwNTY4OCA3MDQwNzk3NjQgLT4gLTEuMDE0ODg3ODhFKzc1MDIwNTY4NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyODYgZGl2aWRlaW50IC03MTQ1NjIuMDE5RSs3NTAyMDU2ODggNzA0MDc5NzY0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjg2IG11bHRpcGx5IC03MTQ1NjIuMDE5RSs3NTAyMDU2ODggNzA0MDc5NzY0IC0+IC01LjAzMTA4NjU4RSs3NTAyMDU3MDIgSW5leGFjdCBSb3VuZGVkCit4cG93Mjg2IHBvd2VyIC03MTQ1NjIuMDE5RSs3NTAyMDU2ODggNzA0MDc5NzY0IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTI4NiByZW1haW5kZXIgLTcxNDU2Mi4wMTlFKzc1MDIwNTY4OCA3MDQwNzk3NjQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyODYgc3VidHJhY3QgLTcxNDU2Mi4wMTlFKzc1MDIwNTY4OCA3MDQwNzk3NjQgLT4gLTcuMTQ1NjIwMTlFKzc1MDIwNTY5MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyODcgYWRkIC01ODQ1Mzc2NzAuIDMxMTM5Ljc3MzdFLTE0NjY4NzU2MCAtPiAtNTg0NTM3NjcwIEluZXhhY3QgUm91bmRlZAoreGNvbTI4NyBjb21wYXJlIC01ODQ1Mzc2NzAuIDMxMTM5Ljc3MzdFLTE0NjY4NzU2MCAtPiAtMQoreGRpdjI4NyBkaXZpZGUgLTU4NDUzNzY3MC4gMzExMzkuNzczN0UtMTQ2Njg3NTYwIC0+IC0xLjg3NzE0MTY4RSsxNDY2ODc1NjQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjg3IGRpdmlkZWludCAtNTg0NTM3NjcwLiAzMTEzOS43NzM3RS0xNDY2ODc1NjAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyODcgbXVsdGlwbHkgLTU4NDUzNzY3MC4gMzExMzkuNzczN0UtMTQ2Njg3NTYwIC0+IC0xLjgyMDIzNzA4RS0xNDY2ODc1NDcgSW5leGFjdCBSb3VuZGVkCit4cG93Mjg3IHBvd2VyIC01ODQ1Mzc2NzAuIDMgLT4gLTEuOTk3MjczMzdFKzI2IEluZXhhY3QgUm91bmRlZAoreHJlbTI4NyByZW1haW5kZXIgLTU4NDUzNzY3MC4gMzExMzkuNzczN0UtMTQ2Njg3NTYwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjg3IHN1YnRyYWN0IC01ODQ1Mzc2NzAuIDMxMTM5Ljc3MzdFLTE0NjY4NzU2MCAtPiAtNTg0NTM3NjcwIEluZXhhY3QgUm91bmRlZAoreGFkZDI4OCBhZGQgLTQuMTgwNzQ2NTBFLTg1ODc0Njg3OSA1NzEwMzUuMjc3RS0yNzk0MDkxNjUgLT4gNS43MTAzNTI3N0UtMjc5NDA5MTYwIEluZXhhY3QgUm91bmRlZAoreGNvbTI4OCBjb21wYXJlIC00LjE4MDc0NjUwRS04NTg3NDY4NzkgNTcxMDM1LjI3N0UtMjc5NDA5MTY1IC0+IC0xCit4ZGl2Mjg4IGRpdmlkZSAtNC4xODA3NDY1MEUtODU4NzQ2ODc5IDU3MTAzNS4yNzdFLTI3OTQwOTE2NSAtPiAtNy4zMjEzNDU0MEUtNTc5MzM3NzIwIEluZXhhY3QgUm91bmRlZAoreGR2aTI4OCBkaXZpZGVpbnQgLTQuMTgwNzQ2NTBFLTg1ODc0Njg3OSA1NzEwMzUuMjc3RS0yNzk0MDkxNjUgLT4gLTAKK3htdWwyODggbXVsdGlwbHkgLTQuMTgwNzQ2NTBFLTg1ODc0Njg3OSA1NzEwMzUuMjc3RS0yNzk0MDkxNjUgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHBvdzI4OCBwb3dlciAtNC4xODA3NDY1MEUtODU4NzQ2ODc5IDYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjg4IHJlbWFpbmRlciAtNC4xODA3NDY1MEUtODU4NzQ2ODc5IDU3MTAzNS4yNzdFLTI3OTQwOTE2NSAtPiAtNC4xODA3NDY1MEUtODU4NzQ2ODc5Cit4c3ViMjg4IHN1YnRyYWN0IC00LjE4MDc0NjUwRS04NTg3NDY4NzkgNTcxMDM1LjI3N0UtMjc5NDA5MTY1IC0+IC01LjcxMDM1Mjc3RS0yNzk0MDkxNjAgSW5leGFjdCBSb3VuZGVkCit4YWRkMjg5IGFkZCA1LjE1MzA5NjM1IC02OTU2NDkuMjE5RSs0NTE5NDgxODMgLT4gLTYuOTU2NDkyMTlFKzQ1MTk0ODE4OCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yODkgY29tcGFyZSA1LjE1MzA5NjM1IC02OTU2NDkuMjE5RSs0NTE5NDgxODMgLT4gMQoreGRpdjI4OSBkaXZpZGUgNS4xNTMwOTYzNSAtNjk1NjQ5LjIxOUUrNDUxOTQ4MTgzIC0+IC03LjQwNzYwNzQ3RS00NTE5NDgxODkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjg5IGRpdmlkZWludCA1LjE1MzA5NjM1IC02OTU2NDkuMjE5RSs0NTE5NDgxODMgLT4gLTAKK3htdWwyODkgbXVsdGlwbHkgNS4xNTMwOTYzNSAtNjk1NjQ5LjIxOUUrNDUxOTQ4MTgzIC0+IC0zLjU4NDc0NzQ1RSs0NTE5NDgxODkgSW5leGFjdCBSb3VuZGVkCit4cG93Mjg5IHBvd2VyIDUuMTUzMDk2MzUgLTcgLT4gMC4wMDAwMTAzNjM4NzQ5IEluZXhhY3QgUm91bmRlZAoreHJlbTI4OSByZW1haW5kZXIgNS4xNTMwOTYzNSAtNjk1NjQ5LjIxOUUrNDUxOTQ4MTgzIC0+IDUuMTUzMDk2MzUKK3hzdWIyODkgc3VidHJhY3QgNS4xNTMwOTYzNSAtNjk1NjQ5LjIxOUUrNDUxOTQ4MTgzIC0+IDYuOTU2NDkyMTlFKzQ1MTk0ODE4OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyOTAgYWRkIC05NDAwMzAxNTMuRSs4Mzc5NzY1NyAtNC4xMTUxMDE5MyAtPiAtOS40MDAzMDE1M0UrODM3OTc2NjUgSW5leGFjdCBSb3VuZGVkCit4Y29tMjkwIGNvbXBhcmUgLTk0MDAzMDE1My5FKzgzNzk3NjU3IC00LjExNTEwMTkzIC0+IC0xCit4ZGl2MjkwIGRpdmlkZSAtOTQwMDMwMTUzLkUrODM3OTc2NTcgLTQuMTE1MTAxOTMgLT4gMi4yODQzNDIzM0UrODM3OTc2NjUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjkwIGRpdmlkZWludCAtOTQwMDMwMTUzLkUrODM3OTc2NTcgLTQuMTE1MTAxOTMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyOTAgbXVsdGlwbHkgLTk0MDAzMDE1My5FKzgzNzk3NjU3IC00LjExNTEwMTkzIC0+IDMuODY4MzE5OTBFKzgzNzk3NjY2IEluZXhhY3QgUm91bmRlZAoreHBvdzI5MCBwb3dlciAtOTQwMDMwMTUzLkUrODM3OTc2NTcgLTQgLT4gMS4yODA2NTcxMEUtMzM1MTkwNjY0IEluZXhhY3QgUm91bmRlZAoreHJlbTI5MCByZW1haW5kZXIgLTk0MDAzMDE1My5FKzgzNzk3NjU3IC00LjExNTEwMTkzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjkwIHN1YnRyYWN0IC05NDAwMzAxNTMuRSs4Mzc5NzY1NyAtNC4xMTUxMDE5MyAtPiAtOS40MDAzMDE1M0UrODM3OTc2NjUgSW5leGFjdCBSb3VuZGVkCit4YWRkMjkxIGFkZCA4OTA4OC45NjgzRSs1ODc3MzkyOTAgMS4zMTkzMjExMCAtPiA4LjkwODg5NjgzRSs1ODc3MzkyOTQgSW5leGFjdCBSb3VuZGVkCit4Y29tMjkxIGNvbXBhcmUgODkwODguOTY4M0UrNTg3NzM5MjkwIDEuMzE5MzIxMTAgLT4gMQoreGRpdjI5MSBkaXZpZGUgODkwODguOTY4M0UrNTg3NzM5MjkwIDEuMzE5MzIxMTAgLT4gNi43NTI2MzcyN0UrNTg3NzM5Mjk0IEluZXhhY3QgUm91bmRlZAoreGR2aTI5MSBkaXZpZGVpbnQgODkwODguOTY4M0UrNTg3NzM5MjkwIDEuMzE5MzIxMTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyOTEgbXVsdGlwbHkgODkwODguOTY4M0UrNTg3NzM5MjkwIDEuMzE5MzIxMTAgLT4gMS4xNzUzNjk1NkUrNTg3NzM5Mjk1IEluZXhhY3QgUm91bmRlZAoreHBvdzI5MSBwb3dlciA4OTA4OC45NjgzRSs1ODc3MzkyOTAgMSAtPiA4LjkwODg5NjgzRSs1ODc3MzkyOTQKK3hyZW0yOTEgcmVtYWluZGVyIDg5MDg4Ljk2ODNFKzU4NzczOTI5MCAxLjMxOTMyMTEwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjkxIHN1YnRyYWN0IDg5MDg4Ljk2ODNFKzU4NzczOTI5MCAxLjMxOTMyMTEwIC0+IDguOTA4ODk2ODNFKzU4NzczOTI5NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyOTIgYWRkIDMzMzY3NTAgNi40Nzk2MTEyNiAtPiAzMzM2NzU2LjQ4IEluZXhhY3QgUm91bmRlZAoreGNvbTI5MiBjb21wYXJlIDMzMzY3NTAgNi40Nzk2MTEyNiAtPiAxCit4ZGl2MjkyIGRpdmlkZSAzMzM2NzUwIDYuNDc5NjExMjYgLT4gNTE0OTYxLjQ0OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyOTIgZGl2aWRlaW50IDMzMzY3NTAgNi40Nzk2MTEyNiAtPiA1MTQ5NjEKK3htdWwyOTIgbXVsdGlwbHkgMzMzNjc1MCA2LjQ3OTYxMTI2IC0+IDIxNjIwODQyLjkgSW5leGFjdCBSb3VuZGVkCit4cG93MjkyIHBvd2VyIDMzMzY3NTAgNiAtPiAxLjM4MDE5OTk3RSszOSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yOTIgcmVtYWluZGVyIDMzMzY3NTAgNi40Nzk2MTEyNiAtPiAyLjkwNTkzOTE0Cit4c3ViMjkyIHN1YnRyYWN0IDMzMzY3NTAgNi40Nzk2MTEyNiAtPiAzMzM2NzQzLjUyIEluZXhhY3QgUm91bmRlZAoreGFkZDI5MyBhZGQgOTA0NjU0NjIyLiA2OTIwNjUyNzAuRSszMjkwODE5MTUgLT4gNi45MjA2NTI3MEUrMzI5MDgxOTIzIEluZXhhY3QgUm91bmRlZAoreGNvbTI5MyBjb21wYXJlIDkwNDY1NDYyMi4gNjkyMDY1MjcwLkUrMzI5MDgxOTE1IC0+IC0xCit4ZGl2MjkzIGRpdmlkZSA5MDQ2NTQ2MjIuIDY5MjA2NTI3MC5FKzMyOTA4MTkxNSAtPiAxLjMwNzE4MTA3RS0zMjkwODE5MTUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjkzIGRpdmlkZWludCA5MDQ2NTQ2MjIuIDY5MjA2NTI3MC5FKzMyOTA4MTkxNSAtPiAwCit4bXVsMjkzIG11bHRpcGx5IDkwNDY1NDYyMi4gNjkyMDY1MjcwLkUrMzI5MDgxOTE1IC0+IDYuMjYwODAwNDVFKzMyOTA4MTkzMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyOTMgcG93ZXIgOTA0NjU0NjIyLiA3IC0+IDQuOTU4ODM0ODVFKzYyIEluZXhhY3QgUm91bmRlZAoreHJlbTI5MyByZW1haW5kZXIgOTA0NjU0NjIyLiA2OTIwNjUyNzAuRSszMjkwODE5MTUgLT4gOTA0NjU0NjIyCit4c3ViMjkzIHN1YnRyYWN0IDkwNDY1NDYyMi4gNjkyMDY1MjcwLkUrMzI5MDgxOTE1IC0+IC02LjkyMDY1MjcwRSszMjkwODE5MjMgSW5leGFjdCBSb3VuZGVkCit4YWRkMjk0IGFkZCAzMDQ4MDQzODAgLTQ2ODEuMjM2OTggLT4gMzA0Nzk5Njk5IEluZXhhY3QgUm91bmRlZAoreGNvbTI5NCBjb21wYXJlIDMwNDgwNDM4MCAtNDY4MS4yMzY5OCAtPiAxCit4ZGl2Mjk0IGRpdmlkZSAzMDQ4MDQzODAgLTQ2ODEuMjM2OTggLT4gLTY1MTExLjkzMTIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjk0IGRpdmlkZWludCAzMDQ4MDQzODAgLTQ2ODEuMjM2OTggLT4gLTY1MTExCit4bXVsMjk0IG11bHRpcGx5IDMwNDgwNDM4MCAtNDY4MS4yMzY5OCAtPiAtMS40MjY4NjE1NEUrMTIgSW5leGFjdCBSb3VuZGVkCit4cG93Mjk0IHBvd2VyIDMwNDgwNDM4MCAtNDY4MSAtPiAxLjk4MDM3MTAyRS0zOTcxNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yOTQgcmVtYWluZGVyIDMwNDgwNDM4MCAtNDY4MS4yMzY5OCAtPiA0MzU4Ljk5NTIyCit4c3ViMjk0IHN1YnRyYWN0IDMwNDgwNDM4MCAtNDY4MS4yMzY5OCAtPiAzMDQ4MDkwNjEgSW5leGFjdCBSb3VuZGVkCit4YWRkMjk1IGFkZCA2NzQuNTU1NjkgLTgyOTgxLjI2ODRFKzg1Mjg5MDc1MiAtPiAtOC4yOTgxMjY4NEUrODUyODkwNzU2IEluZXhhY3QgUm91bmRlZAoreGNvbTI5NSBjb21wYXJlIDY3NC41NTU2OSAtODI5ODEuMjY4NEUrODUyODkwNzUyIC0+IDEKK3hkaXYyOTUgZGl2aWRlIDY3NC41NTU2OSAtODI5ODEuMjY4NEUrODUyODkwNzUyIC0+IC04LjEyOTAxMTU2RS04NTI4OTA3NTUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjk1IGRpdmlkZWludCA2NzQuNTU1NjkgLTgyOTgxLjI2ODRFKzg1Mjg5MDc1MiAtPiAtMAoreG11bDI5NSBtdWx0aXBseSA2NzQuNTU1NjkgLTgyOTgxLjI2ODRFKzg1Mjg5MDc1MiAtPiAtNS41OTc1NDg2OEUrODUyODkwNzU5IEluZXhhY3QgUm91bmRlZAoreHBvdzI5NSBwb3dlciA2NzQuNTU1NjkgLTggLT4gMi4zMzI2OTI2NUUtMjMgSW5leGFjdCBSb3VuZGVkCit4cmVtMjk1IHJlbWFpbmRlciA2NzQuNTU1NjkgLTgyOTgxLjI2ODRFKzg1Mjg5MDc1MiAtPiA2NzQuNTU1NjkKK3hzdWIyOTUgc3VidHJhY3QgNjc0LjU1NTY5IC04Mjk4MS4yNjg0RSs4NTI4OTA3NTIgLT4gOC4yOTgxMjY4NEUrODUyODkwNzU2IEluZXhhY3QgUm91bmRlZAoreGFkZDI5NiBhZGQgLTUxMTEuNTEwMjVFLTEwODAwNjA5NiA1NDQ4ODcwLjRFKzI3OTIxMjI1NSAtPiA1LjQ0ODg3MDQwRSsyNzkyMTIyNjEgSW5leGFjdCBSb3VuZGVkCit4Y29tMjk2IGNvbXBhcmUgLTUxMTEuNTEwMjVFLTEwODAwNjA5NiA1NDQ4ODcwLjRFKzI3OTIxMjI1NSAtPiAtMQoreGRpdjI5NiBkaXZpZGUgLTUxMTEuNTEwMjVFLTEwODAwNjA5NiA1NDQ4ODcwLjRFKzI3OTIxMjI1NSAtPiAtOS4zODA4NjIyMkUtMzg3MjE4MzU1IEluZXhhY3QgUm91bmRlZAoreGR2aTI5NiBkaXZpZGVpbnQgLTUxMTEuNTEwMjVFLTEwODAwNjA5NiA1NDQ4ODcwLjRFKzI3OTIxMjI1NSAtPiAtMAoreG11bDI5NiBtdWx0aXBseSAtNTExMS41MTAyNUUtMTA4MDA2MDk2IDU0NDg4NzAuNEUrMjc5MjEyMjU1IC0+IC0yLjc4NTE5NTY5RSsxNzEyMDYxNjkgSW5leGFjdCBSb3VuZGVkCit4cG93Mjk2IHBvd2VyIC01MTExLjUxMDI1RS0xMDgwMDYwOTYgNSAtPiAtMy40ODkzNjMyM0UtNTQwMDMwNDYyIEluZXhhY3QgUm91bmRlZAoreHJlbTI5NiByZW1haW5kZXIgLTUxMTEuNTEwMjVFLTEwODAwNjA5NiA1NDQ4ODcwLjRFKzI3OTIxMjI1NSAtPiAtNS4xMTE1MTAyNUUtMTA4MDA2MDkzCit4c3ViMjk2IHN1YnRyYWN0IC01MTExLjUxMDI1RS0xMDgwMDYwOTYgNTQ0ODg3MC40RSsyNzkyMTIyNTUgLT4gLTUuNDQ4ODcwNDBFKzI3OTIxMjI2MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyOTcgYWRkIC0yNjIzLjQ1MDY4IC00NjY0NjM5MzguIC0+IC00NjY0NjY1NjEgSW5leGFjdCBSb3VuZGVkCit4Y29tMjk3IGNvbXBhcmUgLTI2MjMuNDUwNjggLTQ2NjQ2MzkzOC4gLT4gMQoreGRpdjI5NyBkaXZpZGUgLTI2MjMuNDUwNjggLTQ2NjQ2MzkzOC4gLT4gMC4wMDAwMDU2MjQxMjMyNSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyOTcgZGl2aWRlaW50IC0yNjIzLjQ1MDY4IC00NjY0NjM5MzguIC0+IDAKK3htdWwyOTcgbXVsdGlwbHkgLTI2MjMuNDUwNjggLTQ2NjQ2MzkzOC4gLT4gMS4yMjM3NDUxNEUrMTIgSW5leGFjdCBSb3VuZGVkCit4cG93Mjk3IHBvd2VyIC0yNjIzLjQ1MDY4IC00NjY0NjM5MzggLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjk3IHJlbWFpbmRlciAtMjYyMy40NTA2OCAtNDY2NDYzOTM4LiAtPiAtMjYyMy40NTA2OAoreHN1YjI5NyBzdWJ0cmFjdCAtMjYyMy40NTA2OCAtNDY2NDYzOTM4LiAtPiA0NjY0NjEzMTUgSW5leGFjdCBSb3VuZGVkCit4YWRkMjk4IGFkZCAyOTkzNTAuNDM1IDMzNzMuMzM1NTEgLT4gMzAyNzIzLjc3MSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yOTggY29tcGFyZSAyOTkzNTAuNDM1IDMzNzMuMzM1NTEgLT4gMQoreGRpdjI5OCBkaXZpZGUgMjk5MzUwLjQzNSAzMzczLjMzNTUxIC0+IDg4Ljc0MDE5MDMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjk4IGRpdmlkZWludCAyOTkzNTAuNDM1IDMzNzMuMzM1NTEgLT4gODgKK3htdWwyOTggbXVsdGlwbHkgMjk5MzUwLjQzNSAzMzczLjMzNTUxIC0+IDEuMDA5ODA5NDVFKzkgSW5leGFjdCBSb3VuZGVkCit4cG93Mjk4IHBvd2VyIDI5OTM1MC40MzUgMzM3MyAtPiAxLjQyODE3MzcwRSsxODQ3MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yOTggcmVtYWluZGVyIDI5OTM1MC40MzUgMzM3My4zMzU1MSAtPiAyNDk2LjkxMDEyCit4c3ViMjk4IHN1YnRyYWN0IDI5OTM1MC40MzUgMzM3My4zMzU1MSAtPiAyOTU5NzcuMDk5IEluZXhhY3QgUm91bmRlZAoreGFkZDI5OSBhZGQgLTY1ODk5NDcuODAgLTI0NDguNzU5MzNFLTU5MTU0OTczNCAtPiAtNjU4OTk0Ny44MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yOTkgY29tcGFyZSAtNjU4OTk0Ny44MCAtMjQ0OC43NTkzM0UtNTkxNTQ5NzM0IC0+IC0xCit4ZGl2Mjk5IGRpdmlkZSAtNjU4OTk0Ny44MCAtMjQ0OC43NTkzM0UtNTkxNTQ5NzM0IC0+IDIuNjkxMTM3MzlFKzU5MTU0OTczNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyOTkgZGl2aWRlaW50IC02NTg5OTQ3LjgwIC0yNDQ4Ljc1OTMzRS01OTE1NDk3MzQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyOTkgbXVsdGlwbHkgLTY1ODk5NDcuODAgLTI0NDguNzU5MzNFLTU5MTU0OTczNCAtPiAxLjYxMzcxOTYyRS01OTE1NDk3MjQgSW5leGFjdCBSb3VuZGVkCit4cG93Mjk5IHBvd2VyIC02NTg5OTQ3LjgwIC0yIC0+IDIuMzAyNjkzMDVFLTE0IEluZXhhY3QgUm91bmRlZAoreHJlbTI5OSByZW1haW5kZXIgLTY1ODk5NDcuODAgLTI0NDguNzU5MzNFLTU5MTU0OTczNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjI5OSBzdWJ0cmFjdCAtNjU4OTk0Ny44MCAtMjQ0OC43NTkzM0UtNTkxNTQ5NzM0IC0+IC02NTg5OTQ3LjgwIEluZXhhY3QgUm91bmRlZAoreGFkZDMwMCBhZGQgMzc3NC41MzU4RS00OTEwOTA1MjAgMTczLjA2MDA5MCAtPiAxNzMuMDYwMDkwIEluZXhhY3QgUm91bmRlZAoreGNvbTMwMCBjb21wYXJlIDM3NzQuNTM1OEUtNDkxMDkwNTIwIDE3My4wNjAwOTAgLT4gLTEKK3hkaXYzMDAgZGl2aWRlIDM3NzQuNTM1OEUtNDkxMDkwNTIwIDE3My4wNjAwOTAgLT4gMi4xODEwNTUwM0UtNDkxMDkwNTE5IEluZXhhY3QgUm91bmRlZAoreGR2aTMwMCBkaXZpZGVpbnQgMzc3NC41MzU4RS00OTEwOTA1MjAgMTczLjA2MDA5MCAtPiAwCit4bXVsMzAwIG11bHRpcGx5IDM3NzQuNTM1OEUtNDkxMDkwNTIwIDE3My4wNjAwOTAgLT4gNi41MzIyMTUwNUUtNDkxMDkwNTE1IEluZXhhY3QgUm91bmRlZAoreHBvdzMwMCBwb3dlciAzNzc0LjUzNThFLTQ5MTA5MDUyMCAxNzMgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzAwIHJlbWFpbmRlciAzNzc0LjUzNThFLTQ5MTA5MDUyMCAxNzMuMDYwMDkwIC0+IDMuNzc0NTM1OEUtNDkxMDkwNTE3Cit4c3ViMzAwIHN1YnRyYWN0IDM3NzQuNTM1OEUtNDkxMDkwNTIwIDE3My4wNjAwOTAgLT4gLTE3My4wNjAwOTAgSW5leGFjdCBSb3VuZGVkCit4YWRkMzAxIGFkZCAtMTMuNjc4MzY5MCAtNDUzLjYxMDExNyAtPiAtNDY3LjI4ODQ4NiBSb3VuZGVkCit4Y29tMzAxIGNvbXBhcmUgLTEzLjY3ODM2OTAgLTQ1My42MTAxMTcgLT4gMQoreGRpdjMwMSBkaXZpZGUgLTEzLjY3ODM2OTAgLTQ1My42MTAxMTcgLT4gMC4wMzAxNTQ0NjE5IEluZXhhY3QgUm91bmRlZAoreGR2aTMwMSBkaXZpZGVpbnQgLTEzLjY3ODM2OTAgLTQ1My42MTAxMTcgLT4gMAoreG11bDMwMSBtdWx0aXBseSAtMTMuNjc4MzY5MCAtNDUzLjYxMDExNyAtPiA2MjA0LjY0NjU2IEluZXhhY3QgUm91bmRlZAoreHBvdzMwMSBwb3dlciAtMTMuNjc4MzY5MCAtNDU0IC0+IDEuNzM5NDg1MzVFLTUxNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMDEgcmVtYWluZGVyIC0xMy42NzgzNjkwIC00NTMuNjEwMTE3IC0+IC0xMy42NzgzNjkwCit4c3ViMzAxIHN1YnRyYWN0IC0xMy42NzgzNjkwIC00NTMuNjEwMTE3IC0+IDQzOS45MzE3NDggUm91bmRlZAoreGFkZDMwMiBhZGQgLTk5MDEwMDkyNy5FLTYxNTI0NDYzNCAyMjM4MDEuNDIxRSsyNDc2MzI2MTggLT4gMi4yMzgwMTQyMUUrMjQ3NjMyNjIzIEluZXhhY3QgUm91bmRlZAoreGNvbTMwMiBjb21wYXJlIC05OTAxMDA5MjcuRS02MTUyNDQ2MzQgMjIzODAxLjQyMUUrMjQ3NjMyNjE4IC0+IC0xCit4ZGl2MzAyIGRpdmlkZSAtOTkwMTAwOTI3LkUtNjE1MjQ0NjM0IDIyMzgwMS40MjFFKzI0NzYzMjYxOCAtPiAtNC40MjQwMTUzN0UtODYyODc3MjQ5IEluZXhhY3QgUm91bmRlZAoreGR2aTMwMiBkaXZpZGVpbnQgLTk5MDEwMDkyNy5FLTYxNTI0NDYzNCAyMjM4MDEuNDIxRSsyNDc2MzI2MTggLT4gLTAKK3htdWwzMDIgbXVsdGlwbHkgLTk5MDEwMDkyNy5FLTYxNTI0NDYzNCAyMjM4MDEuNDIxRSsyNDc2MzI2MTggLT4gLTIuMjE1ODU5OTRFLTM2NzYxMjAwMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMDIgcG93ZXIgLTk5MDEwMDkyNy5FLTYxNTI0NDYzNCAyIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTMwMiByZW1haW5kZXIgLTk5MDEwMDkyNy5FLTYxNTI0NDYzNCAyMjM4MDEuNDIxRSsyNDc2MzI2MTggLT4gLTkuOTAxMDA5MjdFLTYxNTI0NDYyNgoreHN1YjMwMiBzdWJ0cmFjdCAtOTkwMTAwOTI3LkUtNjE1MjQ0NjM0IDIyMzgwMS40MjFFKzI0NzYzMjYxOCAtPiAtMi4yMzgwMTQyMUUrMjQ3NjMyNjIzIEluZXhhY3QgUm91bmRlZAoreGFkZDMwMyBhZGQgMTI3NS4xMDI5MiAtNjY3OTY1MzUzIC0+IC02Njc5NjQwNzggSW5leGFjdCBSb3VuZGVkCit4Y29tMzAzIGNvbXBhcmUgMTI3NS4xMDI5MiAtNjY3OTY1MzUzIC0+IDEKK3hkaXYzMDMgZGl2aWRlIDEyNzUuMTAyOTIgLTY2Nzk2NTM1MyAtPiAtMC4wMDAwMDE5MDg5MzU3MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMDMgZGl2aWRlaW50IDEyNzUuMTAyOTIgLTY2Nzk2NTM1MyAtPiAtMAoreG11bDMwMyBtdWx0aXBseSAxMjc1LjEwMjkyIC02Njc5NjUzNTMgLT4gLTguNTE3MjQ1NzJFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzMwMyBwb3dlciAxMjc1LjEwMjkyIC02Njc5NjUzNTMgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzAzIHJlbWFpbmRlciAxMjc1LjEwMjkyIC02Njc5NjUzNTMgLT4gMTI3NS4xMDI5MgoreHN1YjMwMyBzdWJ0cmFjdCAxMjc1LjEwMjkyIC02Njc5NjUzNTMgLT4gNjY3OTY2NjI4IEluZXhhY3QgUm91bmRlZAoreGFkZDMwNCBhZGQgLTguNzYzNzU0ODBFLTU5Njc5MjE5NyA5OTIuMDc3MzYxIC0+IDk5Mi4wNzczNjEgSW5leGFjdCBSb3VuZGVkCit4Y29tMzA0IGNvbXBhcmUgLTguNzYzNzU0ODBFLTU5Njc5MjE5NyA5OTIuMDc3MzYxIC0+IC0xCit4ZGl2MzA0IGRpdmlkZSAtOC43NjM3NTQ4MEUtNTk2NzkyMTk3IDk5Mi4wNzczNjEgLT4gLTguODMzNzQxMzRFLTU5Njc5MjIwMCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMDQgZGl2aWRlaW50IC04Ljc2Mzc1NDgwRS01OTY3OTIxOTcgOTkyLjA3NzM2MSAtPiAtMAoreG11bDMwNCBtdWx0aXBseSAtOC43NjM3NTQ4MEUtNTk2NzkyMTk3IDk5Mi4wNzczNjEgLT4gLTguNjk0MzIyNzNFLTU5Njc5MjE5NCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMDQgcG93ZXIgLTguNzYzNzU0ODBFLTU5Njc5MjE5NyA5OTIgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzA0IHJlbWFpbmRlciAtOC43NjM3NTQ4MEUtNTk2NzkyMTk3IDk5Mi4wNzczNjEgLT4gLTguNzYzNzU0ODBFLTU5Njc5MjE5NworeHN1YjMwNCBzdWJ0cmFjdCAtOC43NjM3NTQ4MEUtNTk2NzkyMTk3IDk5Mi4wNzczNjEgLT4gLTk5Mi4wNzczNjEgSW5leGFjdCBSb3VuZGVkCit4YWRkMzA1IGFkZCA5NTMuOTc2OTM1RSszODU0NDQ3MjAgOTY1MDMuMzM3OCAtPiA5LjUzOTc2OTM1RSszODU0NDQ3MjIgSW5leGFjdCBSb3VuZGVkCit4Y29tMzA1IGNvbXBhcmUgOTUzLjk3NjkzNUUrMzg1NDQ0NzIwIDk2NTAzLjMzNzggLT4gMQoreGRpdjMwNSBkaXZpZGUgOTUzLjk3NjkzNUUrMzg1NDQ0NzIwIDk2NTAzLjMzNzggLT4gOS44ODU0Mjk0MkUrMzg1NDQ0NzE3IEluZXhhY3QgUm91bmRlZAoreGR2aTMwNSBkaXZpZGVpbnQgOTUzLjk3NjkzNUUrMzg1NDQ0NzIwIDk2NTAzLjMzNzggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMDUgbXVsdGlwbHkgOTUzLjk3NjkzNUUrMzg1NDQ0NzIwIDk2NTAzLjMzNzggLT4gOS4yMDYxOTU4NEUrMzg1NDQ0NzI3IEluZXhhY3QgUm91bmRlZAoreHBvdzMwNSBwb3dlciA5NTMuOTc2OTM1RSszODU0NDQ3MjAgOTY1MDMgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMzA1IHJlbWFpbmRlciA5NTMuOTc2OTM1RSszODU0NDQ3MjAgOTY1MDMuMzM3OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjMwNSBzdWJ0cmFjdCA5NTMuOTc2OTM1RSszODU0NDQ3MjAgOTY1MDMuMzM3OCAtPiA5LjUzOTc2OTM1RSszODU0NDQ3MjIgSW5leGFjdCBSb3VuZGVkCit4YWRkMzA2IGFkZCAyMTM1NzcxNTIgLTk4NjcxMDA3M0UrMzE5MDAwNDYgLT4gLTkuODY3MTAwNzNFKzMxOTAwMDU0IEluZXhhY3QgUm91bmRlZAoreGNvbTMwNiBjb21wYXJlIDIxMzU3NzE1MiAtOTg2NzEwMDczRSszMTkwMDA0NiAtPiAxCit4ZGl2MzA2IGRpdmlkZSAyMTM1NzcxNTIgLTk4NjcxMDA3M0UrMzE5MDAwNDYgLT4gLTIuMTY0NTM4MDdFLTMxOTAwMDQ3IEluZXhhY3QgUm91bmRlZAoreGR2aTMwNiBkaXZpZGVpbnQgMjEzNTc3MTUyIC05ODY3MTAwNzNFKzMxOTAwMDQ2IC0+IC0wCit4bXVsMzA2IG11bHRpcGx5IDIxMzU3NzE1MiAtOTg2NzEwMDczRSszMTkwMDA0NiAtPiAtMi4xMDczODcyN0UrMzE5MDAwNjMgSW5leGFjdCBSb3VuZGVkCit4cG93MzA2IHBvd2VyIDIxMzU3NzE1MiAtMTAgLT4gNS4wNjM1MTQ4N0UtODQgSW5leGFjdCBSb3VuZGVkCit4cmVtMzA2IHJlbWFpbmRlciAyMTM1NzcxNTIgLTk4NjcxMDA3M0UrMzE5MDAwNDYgLT4gMjEzNTc3MTUyCit4c3ViMzA2IHN1YnRyYWN0IDIxMzU3NzE1MiAtOTg2NzEwMDczRSszMTkwMDA0NiAtPiA5Ljg2NzEwMDczRSszMTkwMDA1NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMDcgYWRkIDkxMzkzLjkzOThFLTMyMzQzOTIyOCAtMTM1LjcwMTAwMCAtPiAtMTM1LjcwMTAwMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMDcgY29tcGFyZSA5MTM5My45Mzk4RS0zMjM0MzkyMjggLTEzNS43MDEwMDAgLT4gMQoreGRpdjMwNyBkaXZpZGUgOTEzOTMuOTM5OEUtMzIzNDM5MjI4IC0xMzUuNzAxMDAwIC0+IC02LjczNDk0OTYyRS0zMjM0MzkyMjYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzA3IGRpdmlkZWludCA5MTM5My45Mzk4RS0zMjM0MzkyMjggLTEzNS43MDEwMDAgLT4gLTAKK3htdWwzMDcgbXVsdGlwbHkgOTEzOTMuOTM5OEUtMzIzNDM5MjI4IC0xMzUuNzAxMDAwIC0+IC0xLjI0MDIyNDkwRS0zMjM0MzkyMjEgSW5leGFjdCBSb3VuZGVkCit4cG93MzA3IHBvd2VyIDkxMzkzLjkzOThFLTMyMzQzOTIyOCAtMTM2IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTMwNyByZW1haW5kZXIgOTEzOTMuOTM5OEUtMzIzNDM5MjI4IC0xMzUuNzAxMDAwIC0+IDkuMTM5MzkzOThFLTMyMzQzOTIyNAoreHN1YjMwNyBzdWJ0cmFjdCA5MTM5My45Mzk4RS0zMjM0MzkyMjggLTEzNS43MDEwMDAgLT4gMTM1LjcwMTAwMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMDggYWRkIC0zOTYuNTAzNTU3IDQ1NzU3MjY0LkUtMjU0MzYzNzg4IC0+IC0zOTYuNTAzNTU3IEluZXhhY3QgUm91bmRlZAoreGNvbTMwOCBjb21wYXJlIC0zOTYuNTAzNTU3IDQ1NzU3MjY0LkUtMjU0MzYzNzg4IC0+IC0xCit4ZGl2MzA4IGRpdmlkZSAtMzk2LjUwMzU1NyA0NTc1NzI2NC5FLTI1NDM2Mzc4OCAtPiAtOC42NjUzNjg1NkUrMjU0MzYzNzgyIEluZXhhY3QgUm91bmRlZAoreGR2aTMwOCBkaXZpZGVpbnQgLTM5Ni41MDM1NTcgNDU3NTcyNjQuRS0yNTQzNjM3ODggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMDggbXVsdGlwbHkgLTM5Ni41MDM1NTcgNDU3NTcyNjQuRS0yNTQzNjM3ODggLT4gLTEuODE0MjkxNzlFLTI1NDM2Mzc3OCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMDggcG93ZXIgLTM5Ni41MDM1NTcgNSAtPiAtOS44MDAyMTEyOEUrMTIgSW5leGFjdCBSb3VuZGVkCit4cmVtMzA4IHJlbWFpbmRlciAtMzk2LjUwMzU1NyA0NTc1NzI2NC5FLTI1NDM2Mzc4OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjMwOCBzdWJ0cmFjdCAtMzk2LjUwMzU1NyA0NTc1NzI2NC5FLTI1NDM2Mzc4OCAtPiAtMzk2LjUwMzU1NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMDkgYWRkIDU5ODA3ODQ2LjEgMS41MzM0NTI1NCAtPiA1OTgwNzg0Ny42IEluZXhhY3QgUm91bmRlZAoreGNvbTMwOSBjb21wYXJlIDU5ODA3ODQ2LjEgMS41MzM0NTI1NCAtPiAxCit4ZGl2MzA5IGRpdmlkZSA1OTgwNzg0Ni4xIDEuNTMzNDUyNTQgLT4gMzkwMDIwODQuOSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMDkgZGl2aWRlaW50IDU5ODA3ODQ2LjEgMS41MzM0NTI1NCAtPiAzOTAwMjA4NAoreG11bDMwOSBtdWx0aXBseSA1OTgwNzg0Ni4xIDEuNTMzNDUyNTQgLT4gOTE3MTI0OTMuNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMDkgcG93ZXIgNTk4MDc4NDYuMSAyIC0+IDMuNTc2OTc4NDZFKzE1IEluZXhhY3QgUm91bmRlZAoreHJlbTMwOSByZW1haW5kZXIgNTk4MDc4NDYuMSAxLjUzMzQ1MjU0IC0+IDEuMzI0OTA2NjQKK3hzdWIzMDkgc3VidHJhY3QgNTk4MDc4NDYuMSAxLjUzMzQ1MjU0IC0+IDU5ODA3ODQ0LjYgSW5leGFjdCBSb3VuZGVkCit4YWRkMzEwIGFkZCAtODA0NjE1OC40NSA4LjM2MzUzOTcgLT4gLTgwNDYxNTAuMDkgSW5leGFjdCBSb3VuZGVkCit4Y29tMzEwIGNvbXBhcmUgLTgwNDYxNTguNDUgOC4zNjM1Mzk3IC0+IC0xCit4ZGl2MzEwIGRpdmlkZSAtODA0NjE1OC40NSA4LjM2MzUzOTcgLT4gLTk2MjA1MS44MDMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzEwIGRpdmlkZWludCAtODA0NjE1OC40NSA4LjM2MzUzOTcgLT4gLTk2MjA1MQoreG11bDMxMCBtdWx0aXBseSAtODA0NjE1OC40NSA4LjM2MzUzOTcgLT4gLTY3Mjk0MzY1LjYgSW5leGFjdCBSb3VuZGVkCit4cG93MzEwIHBvd2VyIC04MDQ2MTU4LjQ1IDggLT4gMS43NTY3NDQ2N0UrNTUgSW5leGFjdCBSb3VuZGVkCit4cmVtMzEwIHJlbWFpbmRlciAtODA0NjE1OC40NSA4LjM2MzUzOTcgLT4gLTYuNzE4MDc1MworeHN1YjMxMCBzdWJ0cmFjdCAtODA0NjE1OC40NSA4LjM2MzUzOTcgLT4gLTgwNDYxNjYuODEgSW5leGFjdCBSb3VuZGVkCit4YWRkMzExIGFkZCA1NS4xMTIzMzgxRSs1MDYyNzI1MCAtOTQuMDM1NTA0N0UtMTYyNTQwMzE2IC0+IDUuNTExMjMzODFFKzUwNjI3MjUxIEluZXhhY3QgUm91bmRlZAoreGNvbTMxMSBjb21wYXJlIDU1LjExMjMzODFFKzUwNjI3MjUwIC05NC4wMzU1MDQ3RS0xNjI1NDAzMTYgLT4gMQoreGRpdjMxMSBkaXZpZGUgNTUuMTEyMzM4MUUrNTA2MjcyNTAgLTk0LjAzNTUwNDdFLTE2MjU0MDMxNiAtPiAtNS44NjA4MDEwMUUrMjEzMTY3NTY1IEluZXhhY3QgUm91bmRlZAoreGR2aTMxMSBkaXZpZGVpbnQgNTUuMTEyMzM4MUUrNTA2MjcyNTAgLTk0LjAzNTUwNDdFLTE2MjU0MDMxNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDMxMSBtdWx0aXBseSA1NS4xMTIzMzgxRSs1MDYyNzI1MCAtOTQuMDM1NTA0N0UtMTYyNTQwMzE2IC0+IC01LjE4MjUxNjUzRS0xMTE5MTMwNjMgSW5leGFjdCBSb3VuZGVkCit4cG93MzExIHBvd2VyIDU1LjExMjMzODFFKzUwNjI3MjUwIC05IC0+IDIuMTMxODY4ODFFLTQ1NTY0NTI2NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMTEgcmVtYWluZGVyIDU1LjExMjMzODFFKzUwNjI3MjUwIC05NC4wMzU1MDQ3RS0xNjI1NDAzMTYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzMTEgc3VidHJhY3QgNTUuMTEyMzM4MUUrNTA2MjcyNTAgLTk0LjAzNTUwNDdFLTE2MjU0MDMxNiAtPiA1LjUxMTIzMzgxRSs1MDYyNzI1MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMTIgYWRkIC05NDguMDM4MDU0IDM1ODAuODQ1MTAgLT4gMjYzMi44MDcwNSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMTIgY29tcGFyZSAtOTQ4LjAzODA1NCAzNTgwLjg0NTEwIC0+IC0xCit4ZGl2MzEyIGRpdmlkZSAtOTQ4LjAzODA1NCAzNTgwLjg0NTEwIC0+IC0wLjI2NDc1MjYwMSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMTIgZGl2aWRlaW50IC05NDguMDM4MDU0IDM1ODAuODQ1MTAgLT4gLTAKK3htdWwzMTIgbXVsdGlwbHkgLTk0OC4wMzgwNTQgMzU4MC44NDUxMCAtPiAtMzM5NDc3Ny40MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMTIgcG93ZXIgLTk0OC4wMzgwNTQgMzU4MSAtPiAtMS4wMzA1ODI4OEUrMTA2NjAgSW5leGFjdCBSb3VuZGVkCit4cmVtMzEyIHJlbWFpbmRlciAtOTQ4LjAzODA1NCAzNTgwLjg0NTEwIC0+IC05NDguMDM4MDU0Cit4c3ViMzEyIHN1YnRyYWN0IC05NDguMDM4MDU0IDM1ODAuODQ1MTAgLT4gLTQ1MjguODgzMTUgSW5leGFjdCBSb3VuZGVkCit4YWRkMzEzIGFkZCAtNjAyNi40Mjc1MiAtMTQuMjI4NjQwNkUtMzM0OTIxMzY0IC0+IC02MDI2LjQyNzUyIEluZXhhY3QgUm91bmRlZAoreGNvbTMxMyBjb21wYXJlIC02MDI2LjQyNzUyIC0xNC4yMjg2NDA2RS0zMzQ5MjEzNjQgLT4gLTEKK3hkaXYzMTMgZGl2aWRlIC02MDI2LjQyNzUyIC0xNC4yMjg2NDA2RS0zMzQ5MjEzNjQgLT4gNC4yMzU0MjA0NEUrMzM0OTIxMzY2IEluZXhhY3QgUm91bmRlZAoreGR2aTMxMyBkaXZpZGVpbnQgLTYwMjYuNDI3NTIgLTE0LjIyODY0MDZFLTMzNDkyMTM2NCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDMxMyBtdWx0aXBseSAtNjAyNi40Mjc1MiAtMTQuMjI4NjQwNkUtMzM0OTIxMzY0IC0+IDguNTc0Nzg3MTNFLTMzNDkyMTM2MCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMTMgcG93ZXIgLTYwMjYuNDI3NTIgLTEgLT4gLTAuMDAwMTY1OTM1Nzg4IEluZXhhY3QgUm91bmRlZAoreHJlbTMxMyByZW1haW5kZXIgLTYwMjYuNDI3NTIgLTE0LjIyODY0MDZFLTMzNDkyMTM2NCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjMxMyBzdWJ0cmFjdCAtNjAyNi40Mjc1MiAtMTQuMjI4NjQwNkUtMzM0OTIxMzY0IC0+IC02MDI2LjQyNzUyIEluZXhhY3QgUm91bmRlZAoreGFkZDMxNCBhZGQgNzk1NTEuNTAxNCAtNTM4LjE4NjIyOSAtPiA3OTAxMy4zMTUyIEluZXhhY3QgUm91bmRlZAoreGNvbTMxNCBjb21wYXJlIDc5NTUxLjUwMTQgLTUzOC4xODYyMjkgLT4gMQoreGRpdjMxNCBkaXZpZGUgNzk1NTEuNTAxNCAtNTM4LjE4NjIyOSAtPiAtMTQ3LjgxNDA3OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMTQgZGl2aWRlaW50IDc5NTUxLjUwMTQgLTUzOC4xODYyMjkgLT4gLTE0NworeG11bDMxNCBtdWx0aXBseSA3OTU1MS41MDE0IC01MzguMTg2MjI5IC0+IC00MjgxMzUyMi41IEluZXhhY3QgUm91bmRlZAoreHBvdzMxNCBwb3dlciA3OTU1MS41MDE0IC01MzggLT4gMi44MjU5OTM4OUUtMjYzNyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMTQgcmVtYWluZGVyIDc5NTUxLjUwMTQgLTUzOC4xODYyMjkgLT4gNDM4LjEyNTczNworeHN1YjMxNCBzdWJ0cmFjdCA3OTU1MS41MDE0IC01MzguMTg2MjI5IC0+IDgwMDg5LjY4NzYgSW5leGFjdCBSb3VuZGVkCit4YWRkMzE1IGFkZCA0MjcwNjA1Ni5FKzYyMzU3ODI5MiAtNjkwLjMyNzc0NSAtPiA0LjI3MDYwNTYwRSs2MjM1NzgyOTkgSW5leGFjdCBSb3VuZGVkCit4Y29tMzE1IGNvbXBhcmUgNDI3MDYwNTYuRSs2MjM1NzgyOTIgLTY5MC4zMjc3NDUgLT4gMQoreGRpdjMxNSBkaXZpZGUgNDI3MDYwNTYuRSs2MjM1NzgyOTIgLTY5MC4zMjc3NDUgLT4gLTYuMTg2MzQ1MDFFKzYyMzU3ODI5NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMTUgZGl2aWRlaW50IDQyNzA2MDU2LkUrNjIzNTc4MjkyIC02OTAuMzI3NzQ1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzE1IG11bHRpcGx5IDQyNzA2MDU2LkUrNjIzNTc4MjkyIC02OTAuMzI3NzQ1IC0+IC0yLjk0ODExNzUzRSs2MjM1NzgzMDIgSW5leGFjdCBSb3VuZGVkCit4cG93MzE1IHBvd2VyIDQyNzA2MDU2LkUrNjIzNTc4MjkyIC02OTAgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzE1IHJlbWFpbmRlciA0MjcwNjA1Ni5FKzYyMzU3ODI5MiAtNjkwLjMyNzc0NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjMxNSBzdWJ0cmFjdCA0MjcwNjA1Ni5FKzYyMzU3ODI5MiAtNjkwLjMyNzc0NSAtPiA0LjI3MDYwNTYwRSs2MjM1NzgyOTkgSW5leGFjdCBSb3VuZGVkCit4YWRkMzE2IGFkZCAyNDU0MTM2LjA4RSs1MDIzNzQwNzcgODU2MjY4Ljc5NUUtMzU2NjY0OTM0IC0+IDIuNDU0MTM2MDhFKzUwMjM3NDA4MyBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMTYgY29tcGFyZSAyNDU0MTM2LjA4RSs1MDIzNzQwNzcgODU2MjY4Ljc5NUUtMzU2NjY0OTM0IC0+IDEKK3hkaXYzMTYgZGl2aWRlIDI0NTQxMzYuMDhFKzUwMjM3NDA3NyA4NTYyNjguNzk1RS0zNTY2NjQ5MzQgLT4gMi44NjYwODE0MkUrODU5MDM5MDExIEluZXhhY3QgUm91bmRlZAoreGR2aTMxNiBkaXZpZGVpbnQgMjQ1NDEzNi4wOEUrNTAyMzc0MDc3IDg1NjI2OC43OTVFLTM1NjY2NDkzNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDMxNiBtdWx0aXBseSAyNDU0MTM2LjA4RSs1MDIzNzQwNzcgODU2MjY4Ljc5NUUtMzU2NjY0OTM0IC0+IDIuMTAxNDAwMTRFKzE0NTcwOTE1NSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMTYgcG93ZXIgMjQ1NDEzNi4wOEUrNTAyMzc0MDc3IDkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMzE2IHJlbWFpbmRlciAyNDU0MTM2LjA4RSs1MDIzNzQwNzcgODU2MjY4Ljc5NUUtMzU2NjY0OTM0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzE2IHN1YnRyYWN0IDI0NTQxMzYuMDhFKzUwMjM3NDA3NyA4NTYyNjguNzk1RS0zNTY2NjQ5MzQgLT4gMi40NTQxMzYwOEUrNTAyMzc0MDgzIEluZXhhY3QgUm91bmRlZAoreGFkZDMxNyBhZGQgLTMyNjQyMDQuNTQgLTQyNzA0LjUwMSAtPiAtMzMwNjkwOS4wNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMTcgY29tcGFyZSAtMzI2NDIwNC41NCAtNDI3MDQuNTAxIC0+IC0xCit4ZGl2MzE3IGRpdmlkZSAtMzI2NDIwNC41NCAtNDI3MDQuNTAxIC0+IDc2LjQzNzAxNDAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzE3IGRpdmlkZWludCAtMzI2NDIwNC41NCAtNDI3MDQuNTAxIC0+IDc2Cit4bXVsMzE3IG11bHRpcGx5IC0zMjY0MjA0LjU0IC00MjcwNC41MDEgLT4gMS4zOTM5NjIyNkUrMTEgSW5leGFjdCBSb3VuZGVkCit4cG93MzE3IHBvd2VyIC0zMjY0MjA0LjU0IC00MjcwNSAtPiAtMS4zNzI5MzQxMEUtMjc4MTcxIEluZXhhY3QgUm91bmRlZAoreHJlbTMxNyByZW1haW5kZXIgLTMyNjQyMDQuNTQgLTQyNzA0LjUwMSAtPiAtMTg2NjIuNDY0Cit4c3ViMzE3IHN1YnRyYWN0IC0zMjY0MjA0LjU0IC00MjcwNC41MDEgLT4gLTMyMjE1MDAuMDQgSW5leGFjdCBSb3VuZGVkCit4YWRkMzE4IGFkZCAxLjIxMjY1NDkyIDQ0MTAyLjYwNzMgLT4gNDQxMDMuODIwMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMTggY29tcGFyZSAxLjIxMjY1NDkyIDQ0MTAyLjYwNzMgLT4gLTEKK3hkaXYzMTggZGl2aWRlIDEuMjEyNjU0OTIgNDQxMDIuNjA3MyAtPiAwLjAwMDAyNzQ5NjIxODMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzE4IGRpdmlkZWludCAxLjIxMjY1NDkyIDQ0MTAyLjYwNzMgLT4gMAoreG11bDMxOCBtdWx0aXBseSAxLjIxMjY1NDkyIDQ0MTAyLjYwNzMgLT4gNTM0ODEuMjQzNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMTggcG93ZXIgMS4yMTI2NTQ5MiA0NDEwMyAtPiAxLjE1NjYyNTczRSszNjkzIEluZXhhY3QgUm91bmRlZAoreHJlbTMxOCByZW1haW5kZXIgMS4yMTI2NTQ5MiA0NDEwMi42MDczIC0+IDEuMjEyNjU0OTIKK3hzdWIzMTggc3VidHJhY3QgMS4yMTI2NTQ5MiA0NDEwMi42MDczIC0+IC00NDEwMS4zOTQ2IEluZXhhY3QgUm91bmRlZAoreGFkZDMxOSBhZGQgLTE5LjA1NDcxMUUrOTc1NTE0NjUyIC0yMjE0NC4wODIyIC0+IC0xLjkwNTQ3MTEwRSs5NzU1MTQ2NTMgSW5leGFjdCBSb3VuZGVkCit4Y29tMzE5IGNvbXBhcmUgLTE5LjA1NDcxMUUrOTc1NTE0NjUyIC0yMjE0NC4wODIyIC0+IC0xCit4ZGl2MzE5IGRpdmlkZSAtMTkuMDU0NzExRSs5NzU1MTQ2NTIgLTIyMTQ0LjA4MjIgLT4gOC42MDQ4NzcyOUUrOTc1NTE0NjQ4IEluZXhhY3QgUm91bmRlZAoreGR2aTMxOSBkaXZpZGVpbnQgLTE5LjA1NDcxMUUrOTc1NTE0NjUyIC0yMjE0NC4wODIyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzE5IG11bHRpcGx5IC0xOS4wNTQ3MTFFKzk3NTUxNDY1MiAtMjIxNDQuMDgyMiAtPiA0LjIxOTQ5MDg3RSs5NzU1MTQ2NTcgSW5leGFjdCBSb3VuZGVkCit4cG93MzE5IHBvd2VyIC0xOS4wNTQ3MTFFKzk3NTUxNDY1MiAtMjIxNDQgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzE5IHJlbWFpbmRlciAtMTkuMDU0NzExRSs5NzU1MTQ2NTIgLTIyMTQ0LjA4MjIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzMTkgc3VidHJhY3QgLTE5LjA1NDcxMUUrOTc1NTE0NjUyIC0yMjE0NC4wODIyIC0+IC0xLjkwNTQ3MTEwRSs5NzU1MTQ2NTMgSW5leGFjdCBSb3VuZGVkCit4YWRkMzIwIGFkZCA3NDUuNzg0NTIgLTE5MjIuMDA2NzBFKzM3NTkyMzMwMiAtPiAtMS45MjIwMDY3MEUrMzc1OTIzMzA1IEluZXhhY3QgUm91bmRlZAoreGNvbTMyMCBjb21wYXJlIDc0NS43ODQ1MiAtMTkyMi4wMDY3MEUrMzc1OTIzMzAyIC0+IDEKK3hkaXYzMjAgZGl2aWRlIDc0NS43ODQ1MiAtMTkyMi4wMDY3MEUrMzc1OTIzMzAyIC0+IC0zLjg4MDIzODkyRS0zNzU5MjMzMDMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzIwIGRpdmlkZWludCA3NDUuNzg0NTIgLTE5MjIuMDA2NzBFKzM3NTkyMzMwMiAtPiAtMAoreG11bDMyMCBtdWx0aXBseSA3NDUuNzg0NTIgLTE5MjIuMDA2NzBFKzM3NTkyMzMwMiAtPiAtMS40MzM0MDI4NEUrMzc1OTIzMzA4IEluZXhhY3QgUm91bmRlZAoreHBvdzMyMCBwb3dlciA3NDUuNzg0NTIgLTIgLT4gMC4wMDAwMDE3OTc5MzIwNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMjAgcmVtYWluZGVyIDc0NS43ODQ1MiAtMTkyMi4wMDY3MEUrMzc1OTIzMzAyIC0+IDc0NS43ODQ1MgoreHN1YjMyMCBzdWJ0cmFjdCA3NDUuNzg0NTIgLTE5MjIuMDA2NzBFKzM3NTkyMzMwMiAtPiAxLjkyMjAwNjcwRSszNzU5MjMzMDUgSW5leGFjdCBSb3VuZGVkCit4YWRkMzIxIGFkZCAtOTYzNzE3ODM2IC04MjM5ODkzMDggLT4gLTEuNzg3NzA3MTRFKzkgSW5leGFjdCBSb3VuZGVkCit4Y29tMzIxIGNvbXBhcmUgLTk2MzcxNzgzNiAtODIzOTg5MzA4IC0+IC0xCit4ZGl2MzIxIGRpdmlkZSAtOTYzNzE3ODM2IC04MjM5ODkzMDggLT4gMS4xNjk1NzU2NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMjEgZGl2aWRlaW50IC05NjM3MTc4MzYgLTgyMzk4OTMwOCAtPiAxCit4bXVsMzIxIG11bHRpcGx5IC05NjM3MTc4MzYgLTgyMzk4OTMwOCAtPiA3Ljk0MDkzMTkzRSsxNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMjEgcG93ZXIgLTk2MzcxNzgzNiAtODIzOTg5MzA4IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTMyMSByZW1haW5kZXIgLTk2MzcxNzgzNiAtODIzOTg5MzA4IC0+IC0xMzk3Mjg1MjgKK3hzdWIzMjEgc3VidHJhY3QgLTk2MzcxNzgzNiAtODIzOTg5MzA4IC0+IC0xMzk3Mjg1MjgKK3hhZGQzMjIgYWRkIDgyLjQxODUyOTFFLTMyMTkxOTMwMyAtMjE1NzQ3NzM3LkUtOTk1MTQ3NDAwIC0+IDguMjQxODUyOTFFLTMyMTkxOTMwMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMjIgY29tcGFyZSA4Mi40MTg1MjkxRS0zMjE5MTkzMDMgLTIxNTc0NzczNy5FLTk5NTE0NzQwMCAtPiAxCit4ZGl2MzIyIGRpdmlkZSA4Mi40MTg1MjkxRS0zMjE5MTkzMDMgLTIxNTc0NzczNy5FLTk5NTE0NzQwMCAtPiAtMy44MjAxMzQxMkUrNjczMjI4MDkwIEluZXhhY3QgUm91bmRlZAoreGR2aTMyMiBkaXZpZGVpbnQgODIuNDE4NTI5MUUtMzIxOTE5MzAzIC0yMTU3NDc3MzcuRS05OTUxNDc0MDAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMjIgbXVsdGlwbHkgODIuNDE4NTI5MUUtMzIxOTE5MzAzIC0yMTU3NDc3MzcuRS05OTUxNDc0MDAgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHBvdzMyMiBwb3dlciA4Mi40MTg1MjkxRS0zMjE5MTkzMDMgLTIgLT4gMS40NzIxNDM5NkUrNjQzODM4NjAyIEluZXhhY3QgUm91bmRlZAoreHJlbTMyMiByZW1haW5kZXIgODIuNDE4NTI5MUUtMzIxOTE5MzAzIC0yMTU3NDc3MzcuRS05OTUxNDc0MDAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzMjIgc3VidHJhY3QgODIuNDE4NTI5MUUtMzIxOTE5MzAzIC0yMTU3NDc3MzcuRS05OTUxNDc0MDAgLT4gOC4yNDE4NTI5MUUtMzIxOTE5MzAyIEluZXhhY3QgUm91bmRlZAoreGFkZDMyMyBhZGQgLTgwODMyOC42MDdFLTc5MDgxMDM0MiA1MzA3NS43MDgyIC0+IDUzMDc1LjcwODIgSW5leGFjdCBSb3VuZGVkCit4Y29tMzIzIGNvbXBhcmUgLTgwODMyOC42MDdFLTc5MDgxMDM0MiA1MzA3NS43MDgyIC0+IC0xCit4ZGl2MzIzIGRpdmlkZSAtODA4MzI4LjYwN0UtNzkwODEwMzQyIDUzMDc1LjcwODIgLT4gLTEuNTIyOTcyODFFLTc5MDgxMDM0MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMjMgZGl2aWRlaW50IC04MDgzMjguNjA3RS03OTA4MTAzNDIgNTMwNzUuNzA4MiAtPiAtMAoreG11bDMyMyBtdWx0aXBseSAtODA4MzI4LjYwN0UtNzkwODEwMzQyIDUzMDc1LjcwODIgLT4gLTQuMjkwMjYxMzNFLTc5MDgxMDMzMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMjMgcG93ZXIgLTgwODMyOC42MDdFLTc5MDgxMDM0MiA1MzA3NiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0zMjMgcmVtYWluZGVyIC04MDgzMjguNjA3RS03OTA4MTAzNDIgNTMwNzUuNzA4MiAtPiAtOC4wODMyODYwN0UtNzkwODEwMzM3Cit4c3ViMzIzIHN1YnRyYWN0IC04MDgzMjguNjA3RS03OTA4MTAzNDIgNTMwNzUuNzA4MiAtPiAtNTMwNzUuNzA4MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMjQgYWRkIDcwMDU5Mi43MjAgLTY5ODQ4NS4wODUgLT4gMjEwNy42MzUKK3hjb20zMjQgY29tcGFyZSA3MDA1OTIuNzIwIC02OTg0ODUuMDg1IC0+IDEKK3hkaXYzMjQgZGl2aWRlIDcwMDU5Mi43MjAgLTY5ODQ4NS4wODUgLT4gLTEuMDAzMDE3NDQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzI0IGRpdmlkZWludCA3MDA1OTIuNzIwIC02OTg0ODUuMDg1IC0+IC0xCit4bXVsMzI0IG11bHRpcGx5IDcwMDU5Mi43MjAgLTY5ODQ4NS4wODUgLT4gLTQuODkzNTM1NjZFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzMyNCBwb3dlciA3MDA1OTIuNzIwIC02OTg0ODUgLT4gOC44MzY5MDAwMEUtNDA4Mjk3MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMjQgcmVtYWluZGVyIDcwMDU5Mi43MjAgLTY5ODQ4NS4wODUgLT4gMjEwNy42MzUKK3hzdWIzMjQgc3VidHJhY3QgNzAwNTkyLjcyMCAtNjk4NDg1LjA4NSAtPiAxMzk5MDc3LjgxIEluZXhhY3QgUm91bmRlZAoreGFkZDMyNSBhZGQgLTgwMjczOTI4LjAgNjYxMzQ2LjIzOSAtPiAtNzk2MTI1ODEuOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMjUgY29tcGFyZSAtODAyNzM5MjguMCA2NjEzNDYuMjM5IC0+IC0xCit4ZGl2MzI1IGRpdmlkZSAtODAyNzM5MjguMCA2NjEzNDYuMjM5IC0+IC0xMjEuMzc5NTc5IEluZXhhY3QgUm91bmRlZAoreGR2aTMyNSBkaXZpZGVpbnQgLTgwMjczOTI4LjAgNjYxMzQ2LjIzOSAtPiAtMTIxCit4bXVsMzI1IG11bHRpcGx5IC04MDI3MzkyOC4wIDY2MTM0Ni4yMzkgLT4gLTUuMzA4ODg2MDRFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzMyNSBwb3dlciAtODAyNzM5MjguMCA2NjEzNDYgLT4gNS40NTY2NDg1NkUrNTIyNzY1OCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMjUgcmVtYWluZGVyIC04MDI3MzkyOC4wIDY2MTM0Ni4yMzkgLT4gLTI1MTAzMy4wODEKK3hzdWIzMjUgc3VidHJhY3QgLTgwMjczOTI4LjAgNjYxMzQ2LjIzOSAtPiAtODA5MzUyNzQuMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMjYgYWRkIC0yNDAxODI1MS4wRSs4MTk3ODY3NjQgNTkxNDEuOTYwMEUtMTY3MTY1MDY1IC0+IC0yLjQwMTgyNTEwRSs4MTk3ODY3NzEgSW5leGFjdCBSb3VuZGVkCit4Y29tMzI2IGNvbXBhcmUgLTI0MDE4MjUxLjBFKzgxOTc4Njc2NCA1OTE0MS45NjAwRS0xNjcxNjUwNjUgLT4gLTEKK3hkaXYzMjYgZGl2aWRlIC0yNDAxODI1MS4wRSs4MTk3ODY3NjQgNTkxNDEuOTYwMEUtMTY3MTY1MDY1IC0+IC00LjA2MTExODU0RSs5ODY5NTE4MzEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzI2IGRpdmlkZWludCAtMjQwMTgyNTEuMEUrODE5Nzg2NzY0IDU5MTQxLjk2MDBFLTE2NzE2NTA2NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDMyNiBtdWx0aXBseSAtMjQwMTgyNTEuMEUrODE5Nzg2NzY0IDU5MTQxLjk2MDBFLTE2NzE2NTA2NSAtPiAtMS40MjA0ODY0NEUrNjUyNjIxNzExIEluZXhhY3QgUm91bmRlZAoreHBvdzMyNiBwb3dlciAtMjQwMTgyNTEuMEUrODE5Nzg2NzY0IDYgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMzI2IHJlbWFpbmRlciAtMjQwMTgyNTEuMEUrODE5Nzg2NzY0IDU5MTQxLjk2MDBFLTE2NzE2NTA2NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjMyNiBzdWJ0cmFjdCAtMjQwMTgyNTEuMEUrODE5Nzg2NzY0IDU5MTQxLjk2MDBFLTE2NzE2NTA2NSAtPiAtMi40MDE4MjUxMEUrODE5Nzg2NzcxIEluZXhhY3QgUm91bmRlZAoreGFkZDMyNyBhZGQgMjUxMjk1My4zIC0zNzY5MTcwLjM1RS05OTM2MjE2NDUgLT4gMjUxMjk1My4zMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMjcgY29tcGFyZSAyNTEyOTUzLjMgLTM3NjkxNzAuMzVFLTk5MzYyMTY0NSAtPiAxCit4ZGl2MzI3IGRpdmlkZSAyNTEyOTUzLjMgLTM3NjkxNzAuMzVFLTk5MzYyMTY0NSAtPiAtNi42NjcxMjU4M0UrOTkzNjIxNjQ0IEluZXhhY3QgUm91bmRlZAoreGR2aTMyNyBkaXZpZGVpbnQgMjUxMjk1My4zIC0zNzY5MTcwLjM1RS05OTM2MjE2NDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMjcgbXVsdGlwbHkgMjUxMjk1My4zIC0zNzY5MTcwLjM1RS05OTM2MjE2NDUgLT4gLTkuNDcxNzQ5MDdFLTk5MzYyMTYzMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMjcgcG93ZXIgMjUxMjk1My4zIC00IC0+IDIuNTA3NjIzNDhFLTI2IEluZXhhY3QgUm91bmRlZAoreHJlbTMyNyByZW1haW5kZXIgMjUxMjk1My4zIC0zNzY5MTcwLjM1RS05OTM2MjE2NDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzMjcgc3VidHJhY3QgMjUxMjk1My4zIC0zNzY5MTcwLjM1RS05OTM2MjE2NDUgLT4gMjUxMjk1My4zMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMjggYWRkIC02ODIuNzk2MzcwIDcxMTMxLjAyMjQgLT4gNzA0NDguMjI2MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMjggY29tcGFyZSAtNjgyLjc5NjM3MCA3MTEzMS4wMjI0IC0+IC0xCit4ZGl2MzI4IGRpdmlkZSAtNjgyLjc5NjM3MCA3MTEzMS4wMjI0IC0+IC0wLjAwOTU5OTEzNjE3IEluZXhhY3QgUm91bmRlZAoreGR2aTMyOCBkaXZpZGVpbnQgLTY4Mi43OTYzNzAgNzExMzEuMDIyNCAtPiAtMAoreG11bDMyOCBtdWx0aXBseSAtNjgyLjc5NjM3MCA3MTEzMS4wMjI0IC0+IC00ODU2ODAwMy45IEluZXhhY3QgUm91bmRlZAoreHBvdzMyOCBwb3dlciAtNjgyLjc5NjM3MCA3MTEzMSAtPiAtOS4yODExNDc0MUUrMjAxNjA1IEluZXhhY3QgUm91bmRlZAoreHJlbTMyOCByZW1haW5kZXIgLTY4Mi43OTYzNzAgNzExMzEuMDIyNCAtPiAtNjgyLjc5NjM3MAoreHN1YjMyOCBzdWJ0cmFjdCAtNjgyLjc5NjM3MCA3MTEzMS4wMjI0IC0+IC03MTgxMy44MTg4IEluZXhhY3QgUm91bmRlZAoreGFkZDMyOSBhZGQgODkuOTk5NzQ5MCAtNDk5My42OTgzMSAtPiAtNDkwMy42OTg1NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMjkgY29tcGFyZSA4OS45OTk3NDkwIC00OTkzLjY5ODMxIC0+IDEKK3hkaXYzMjkgZGl2aWRlIDg5Ljk5OTc0OTAgLTQ5OTMuNjk4MzEgLT4gLTAuMDE4MDIyNjY0NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMjkgZGl2aWRlaW50IDg5Ljk5OTc0OTAgLTQ5OTMuNjk4MzEgLT4gLTAKK3htdWwzMjkgbXVsdGlwbHkgODkuOTk5NzQ5MCAtNDk5My42OTgzMSAtPiAtNDQ5NDMxLjU5NCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMjkgcG93ZXIgODkuOTk5NzQ5MCAtNDk5NCAtPiAzLjMwMzM2NTI1RS05NzYwIEluZXhhY3QgUm91bmRlZAoreHJlbTMyOSByZW1haW5kZXIgODkuOTk5NzQ5MCAtNDk5My42OTgzMSAtPiA4OS45OTk3NDkwCit4c3ViMzI5IHN1YnRyYWN0IDg5Ljk5OTc0OTAgLTQ5OTMuNjk4MzEgLT4gNTA4My42OTgwNiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMzAgYWRkIDc2NTYzMzU0LjZFLTExMjMzODgzNiAyNzgyNzEuNTg1RS01MTE0ODEwOTUgLT4gNy42NTYzMzU0NkUtMTEyMzM4ODI5IEluZXhhY3QgUm91bmRlZAoreGNvbTMzMCBjb21wYXJlIDc2NTYzMzU0LjZFLTExMjMzODgzNiAyNzgyNzEuNTg1RS01MTE0ODEwOTUgLT4gMQoreGRpdjMzMCBkaXZpZGUgNzY1NjMzNTQuNkUtMTEyMzM4ODM2IDI3ODI3MS41ODVFLTUxMTQ4MTA5NSAtPiAyLjc1MTM4OTYwRSszOTkxNDIyNjEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzMwIGRpdmlkZWludCA3NjU2MzM1NC42RS0xMTIzMzg4MzYgMjc4MjcxLjU4NUUtNTExNDgxMDk1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzMwIG11bHRpcGx5IDc2NTYzMzU0LjZFLTExMjMzODgzNiAyNzgyNzEuNTg1RS01MTE0ODEwOTUgLT4gMi4xMzA1NDA2MEUtNjIzODE5OTE4IEluZXhhY3QgUm91bmRlZAoreHBvdzMzMCBwb3dlciA3NjU2MzM1NC42RS0xMTIzMzg4MzYgMyAtPiA0LjQ4ODEwMzQ3RS0zMzcwMTY0ODUgSW5leGFjdCBSb3VuZGVkCit4cmVtMzMwIHJlbWFpbmRlciA3NjU2MzM1NC42RS0xMTIzMzg4MzYgMjc4MjcxLjU4NUUtNTExNDgxMDk1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzMwIHN1YnRyYWN0IDc2NTYzMzU0LjZFLTExMjMzODgzNiAyNzgyNzEuNTg1RS01MTE0ODEwOTUgLT4gNy42NTYzMzU0NkUtMTEyMzM4ODI5IEluZXhhY3QgUm91bmRlZAoreGFkZDMzMSBhZGQgLTkzMjQ5OS4wMTAgODczLjM3NzcwMUUtNTAyMTkwNDUyIC0+IC05MzI0OTkuMDEwIEluZXhhY3QgUm91bmRlZAoreGNvbTMzMSBjb21wYXJlIC05MzI0OTkuMDEwIDg3My4zNzc3MDFFLTUwMjE5MDQ1MiAtPiAtMQoreGRpdjMzMSBkaXZpZGUgLTkzMjQ5OS4wMTAgODczLjM3NzcwMUUtNTAyMTkwNDUyIC0+IC0xLjA2NzY5MjcyRSs1MDIxOTA0NTUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzMxIGRpdmlkZWludCAtOTMyNDk5LjAxMCA4NzMuMzc3NzAxRS01MDIxOTA0NTIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMzEgbXVsdGlwbHkgLTkzMjQ5OS4wMTAgODczLjM3NzcwMUUtNTAyMTkwNDUyIC0+IC04LjE0NDIzODQyRS01MDIxOTA0NDQgSW5leGFjdCBSb3VuZGVkCit4cG93MzMxIHBvd2VyIC05MzI0OTkuMDEwIDkgLT4gLTUuMzMxMzI4MTVFKzUzIEluZXhhY3QgUm91bmRlZAoreHJlbTMzMSByZW1haW5kZXIgLTkzMjQ5OS4wMTAgODczLjM3NzcwMUUtNTAyMTkwNDUyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzMxIHN1YnRyYWN0IC05MzI0OTkuMDEwIDg3My4zNzc3MDFFLTUwMjE5MDQ1MiAtPiAtOTMyNDk5LjAxMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMzIgYWRkIC03NzM1OTE4LjIxRSs3OTk1MTQ3OTcgLTc3NDguNzgwMjMgLT4gLTcuNzM1OTE4MjFFKzc5OTUxNDgwMyBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMzIgY29tcGFyZSAtNzczNTkxOC4yMUUrNzk5NTE0Nzk3IC03NzQ4Ljc4MDIzIC0+IC0xCit4ZGl2MzMyIGRpdmlkZSAtNzczNTkxOC4yMUUrNzk5NTE0Nzk3IC03NzQ4Ljc4MDIzIC0+IDkuOTgzNDAxMjNFKzc5OTUxNDc5OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMzIgZGl2aWRlaW50IC03NzM1OTE4LjIxRSs3OTk1MTQ3OTcgLTc3NDguNzgwMjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMzIgbXVsdGlwbHkgLTc3MzU5MTguMjFFKzc5OTUxNDc5NyAtNzc0OC43ODAyMyAtPiA1Ljk5NDM5MzAxRSs3OTk1MTQ4MDcgSW5leGFjdCBSb3VuZGVkCit4cG93MzMyIHBvd2VyIC03NzM1OTE4LjIxRSs3OTk1MTQ3OTcgLTc3NDkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTMzMiByZW1haW5kZXIgLTc3MzU5MTguMjFFKzc5OTUxNDc5NyAtNzc0OC43ODAyMyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjMzMiBzdWJ0cmFjdCAtNzczNTkxOC4yMUUrNzk5NTE0Nzk3IC03NzQ4Ljc4MDIzIC0+IC03LjczNTkxODIxRSs3OTk1MTQ4MDMgSW5leGFjdCBSb3VuZGVkCit4YWRkMzMzIGFkZCAtMzcwODc4MC43NUUrNDQ1MjMyNzg3IDk4MC4wMDY1NjdFLTc4MDcyODYyMyAtPiAtMy43MDg3ODA3NUUrNDQ1MjMyNzkzIEluZXhhY3QgUm91bmRlZAoreGNvbTMzMyBjb21wYXJlIC0zNzA4NzgwLjc1RSs0NDUyMzI3ODcgOTgwLjAwNjU2N0UtNzgwNzI4NjIzIC0+IC0xCit4ZGl2MzMzIGRpdmlkZSAtMzcwODc4MC43NUUrNDQ1MjMyNzg3IDk4MC4wMDY1NjdFLTc4MDcyODYyMyAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCit4ZHZpMzMzIGRpdmlkZWludCAtMzcwODc4MC43NUUrNDQ1MjMyNzg3IDk4MC4wMDY1NjdFLTc4MDcyODYyMyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDMzMyBtdWx0aXBseSAtMzcwODc4MC43NUUrNDQ1MjMyNzg3IDk4MC4wMDY1NjdFLTc4MDcyODYyMyAtPiAtMy42MzQ2Mjk0OUUtMzM1NDk1ODI3IEluZXhhY3QgUm91bmRlZAoreHBvdzMzMyBwb3dlciAtMzcwODc4MC43NUUrNDQ1MjMyNzg3IDEwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTMzMyByZW1haW5kZXIgLTM3MDg3ODAuNzVFKzQ0NTIzMjc4NyA5ODAuMDA2NTY3RS03ODA3Mjg2MjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzMzMgc3VidHJhY3QgLTM3MDg3ODAuNzVFKzQ0NTIzMjc4NyA5ODAuMDA2NTY3RS03ODA3Mjg2MjMgLT4gLTMuNzA4NzgwNzVFKzQ0NTIzMjc5MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMzQgYWRkIC01MjA1MTI0LjQ0RS0xNDA1ODg2NjEgLTQ5NTM5NDAyOS5FLTYyMDg1NjMxMyAtPiAtNS4yMDUxMjQ0NEUtMTQwNTg4NjU1IEluZXhhY3QgUm91bmRlZAoreGNvbTMzNCBjb21wYXJlIC01MjA1MTI0LjQ0RS0xNDA1ODg2NjEgLTQ5NTM5NDAyOS5FLTYyMDg1NjMxMyAtPiAtMQoreGRpdjMzNCBkaXZpZGUgLTUyMDUxMjQuNDRFLTE0MDU4ODY2MSAtNDk1Mzk0MDI5LkUtNjIwODU2MzEzIC0+IDEuMDUwNzAzOTFFKzQ4MDI2NzY1MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMzQgZGl2aWRlaW50IC01MjA1MTI0LjQ0RS0xNDA1ODg2NjEgLTQ5NTM5NDAyOS5FLTYyMDg1NjMxMyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDMzNCBtdWx0aXBseSAtNTIwNTEyNC40NEUtMTQwNTg4NjYxIC00OTUzOTQwMjkuRS02MjA4NTYzMTMgLT4gMi41Nzg1ODc1N0UtNzYxNDQ0OTU5IEluZXhhY3QgUm91bmRlZAoreHBvdzMzNCBwb3dlciAtNTIwNTEyNC40NEUtMTQwNTg4NjYxIC01IC0+IC0yLjYxNzI0NTIzRSs3MDI5NDMyNzEgSW5leGFjdCBSb3VuZGVkCit4cmVtMzM0IHJlbWFpbmRlciAtNTIwNTEyNC40NEUtMTQwNTg4NjYxIC00OTUzOTQwMjkuRS02MjA4NTYzMTMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzMzQgc3VidHJhY3QgLTUyMDUxMjQuNDRFLTE0MDU4ODY2MSAtNDk1Mzk0MDI5LkUtNjIwODU2MzEzIC0+IC01LjIwNTEyNDQ0RS0xNDA1ODg2NTUgSW5leGFjdCBSb3VuZGVkCit4YWRkMzM1IGFkZCAtODg2OC43MjA3NCA1NTkyMzk5LjkzIC0+IDU1ODM1MzEuMjEgSW5leGFjdCBSb3VuZGVkCit4Y29tMzM1IGNvbXBhcmUgLTg4NjguNzIwNzQgNTU5MjM5OS45MyAtPiAtMQoreGRpdjMzNSBkaXZpZGUgLTg4NjguNzIwNzQgNTU5MjM5OS45MyAtPiAtMC4wMDE1ODU4NTIzOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMzUgZGl2aWRlaW50IC04ODY4LjcyMDc0IDU1OTIzOTkuOTMgLT4gLTAKK3htdWwzMzUgbXVsdGlwbHkgLTg4NjguNzIwNzQgNTU5MjM5OS45MyAtPiAtNC45NTk3NDMzMkUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MzM1IHBvd2VyIC04ODY4LjcyMDc0IDU1OTI0MDAgLT4gNS41NTA3NDE0MkUrMjIwNzgwMTcgSW5leGFjdCBSb3VuZGVkCit4cmVtMzM1IHJlbWFpbmRlciAtODg2OC43MjA3NCA1NTkyMzk5LjkzIC0+IC04ODY4LjcyMDc0Cit4c3ViMzM1IHN1YnRyYWN0IC04ODY4LjcyMDc0IDU1OTIzOTkuOTMgLT4gLTU2MDEyNjguNjUgSW5leGFjdCBSb3VuZGVkCit4YWRkMzM2IGFkZCAtNzQuNzg1MjAzN0UtMTc1MjA1ODA5IDQuMTQzMTY1NDIgLT4gNC4xNDMxNjU0MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMzYgY29tcGFyZSAtNzQuNzg1MjAzN0UtMTc1MjA1ODA5IDQuMTQzMTY1NDIgLT4gLTEKK3hkaXYzMzYgZGl2aWRlIC03NC43ODUyMDM3RS0xNzUyMDU4MDkgNC4xNDMxNjU0MiAtPiAtMS44MDUwMjU3N0UtMTc1MjA1ODA4IEluZXhhY3QgUm91bmRlZAoreGR2aTMzNiBkaXZpZGVpbnQgLTc0Ljc4NTIwMzdFLTE3NTIwNTgwOSA0LjE0MzE2NTQyIC0+IC0wCit4bXVsMzM2IG11bHRpcGx5IC03NC43ODUyMDM3RS0xNzUyMDU4MDkgNC4xNDMxNjU0MiAtPiAtMy4wOTg0NzQ3MEUtMTc1MjA1ODA3IEluZXhhY3QgUm91bmRlZAoreHBvdzMzNiBwb3dlciAtNzQuNzg1MjAzN0UtMTc1MjA1ODA5IDQgLT4gMy4xMjc5NzEwNEUtNzAwODIzMjI5IEluZXhhY3QgUm91bmRlZAoreHJlbTMzNiByZW1haW5kZXIgLTc0Ljc4NTIwMzdFLTE3NTIwNTgwOSA0LjE0MzE2NTQyIC0+IC03LjQ3ODUyMDM3RS0xNzUyMDU4MDgKK3hzdWIzMzYgc3VidHJhY3QgLTc0Ljc4NTIwMzdFLTE3NTIwNTgwOSA0LjE0MzE2NTQyIC0+IC00LjE0MzE2NTQyIEluZXhhY3QgUm91bmRlZAoreGFkZDMzNyBhZGQgODQxOTYuMTA5MUUrMjQyNjI4NzQ4IDguMDc1MjMwMzZFLTI4ODIzMTQ2NyAtPiA4LjQxOTYxMDkxRSsyNDI2Mjg3NTIgSW5leGFjdCBSb3VuZGVkCit4Y29tMzM3IGNvbXBhcmUgODQxOTYuMTA5MUUrMjQyNjI4NzQ4IDguMDc1MjMwMzZFLTI4ODIzMTQ2NyAtPiAxCit4ZGl2MzM3IGRpdmlkZSA4NDE5Ni4xMDkxRSsyNDI2Mjg3NDggOC4wNzUyMzAzNkUtMjg4MjMxNDY3IC0+IDEuMDQyNjQ2NTNFKzUzMDg2MDIxOSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMzcgZGl2aWRlaW50IDg0MTk2LjEwOTFFKzI0MjYyODc0OCA4LjA3NTIzMDM2RS0yODgyMzE0NjcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMzcgbXVsdGlwbHkgODQxOTYuMTA5MUUrMjQyNjI4NzQ4IDguMDc1MjMwMzZFLTI4ODIzMTQ2NyAtPiA2Ljc5OTAyOTc2RS00NTYwMjcxNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMzcgcG93ZXIgODQxOTYuMTA5MUUrMjQyNjI4NzQ4IDggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMzM3IHJlbWFpbmRlciA4NDE5Ni4xMDkxRSsyNDI2Mjg3NDggOC4wNzUyMzAzNkUtMjg4MjMxNDY3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzM3IHN1YnRyYWN0IDg0MTk2LjEwOTFFKzI0MjYyODc0OCA4LjA3NTIzMDM2RS0yODgyMzE0NjcgLT4gOC40MTk2MTA5MUUrMjQyNjI4NzUyIEluZXhhY3QgUm91bmRlZAoreGFkZDMzOCBhZGQgMzg2NjAxMDMuMSAtNjY3MS43MzA4NUUrOTAwOTk4NDc3IC0+IC02LjY3MTczMDg1RSs5MDA5OTg0ODAgSW5leGFjdCBSb3VuZGVkCit4Y29tMzM4IGNvbXBhcmUgMzg2NjAxMDMuMSAtNjY3MS43MzA4NUUrOTAwOTk4NDc3IC0+IDEKK3hkaXYzMzggZGl2aWRlIDM4NjYwMTAzLjEgLTY2NzEuNzMwODVFKzkwMDk5ODQ3NyAtPiAtNS43OTQ2MTM3MkUtOTAwOTk4NDc0IEluZXhhY3QgUm91bmRlZAoreGR2aTMzOCBkaXZpZGVpbnQgMzg2NjAxMDMuMSAtNjY3MS43MzA4NUUrOTAwOTk4NDc3IC0+IC0wCit4bXVsMzM4IG11bHRpcGx5IDM4NjYwMTAzLjEgLTY2NzEuNzMwODVFKzkwMDk5ODQ3NyAtPiAtMi41NzkyOTgwM0UrOTAwOTk4NDg4IEluZXhhY3QgUm91bmRlZAoreHBvdzMzOCBwb3dlciAzODY2MDEwMy4xIC03IC0+IDcuNzQ3NDUyOTBFLTU0IEluZXhhY3QgUm91bmRlZAoreHJlbTMzOCByZW1haW5kZXIgMzg2NjAxMDMuMSAtNjY3MS43MzA4NUUrOTAwOTk4NDc3IC0+IDM4NjYwMTAzLjEKK3hzdWIzMzggc3VidHJhY3QgMzg2NjAxMDMuMSAtNjY3MS43MzA4NUUrOTAwOTk4NDc3IC0+IDYuNjcxNzMwODVFKzkwMDk5ODQ4MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMzkgYWRkIC01Mi4yNjU5NDYwIC0yOTY0MDQxOTlFKzM3MjA1MDQ3NiAtPiAtMi45NjQwNDE5OUUrMzcyMDUwNDg0IEluZXhhY3QgUm91bmRlZAoreGNvbTMzOSBjb21wYXJlIC01Mi4yNjU5NDYwIC0yOTY0MDQxOTlFKzM3MjA1MDQ3NiAtPiAxCit4ZGl2MzM5IGRpdmlkZSAtNTIuMjY1OTQ2MCAtMjk2NDA0MTk5RSszNzIwNTA0NzYgLT4gMS43NjMzMzM1MkUtMzcyMDUwNDgzIEluZXhhY3QgUm91bmRlZAoreGR2aTMzOSBkaXZpZGVpbnQgLTUyLjI2NTk0NjAgLTI5NjQwNDE5OUUrMzcyMDUwNDc2IC0+IDAKK3htdWwzMzkgbXVsdGlwbHkgLTUyLjI2NTk0NjAgLTI5NjQwNDE5OUUrMzcyMDUwNDc2IC0+IDEuNTQ5MTg0NTlFKzM3MjA1MDQ4NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMzkgcG93ZXIgLTUyLjI2NTk0NjAgLTMgLT4gLTAuMDAwMDA3MDAzOTU4MzMgSW5leGFjdCBSb3VuZGVkCit4cmVtMzM5IHJlbWFpbmRlciAtNTIuMjY1OTQ2MCAtMjk2NDA0MTk5RSszNzIwNTA0NzYgLT4gLTUyLjI2NTk0NjAKK3hzdWIzMzkgc3VidHJhY3QgLTUyLjI2NTk0NjAgLTI5NjQwNDE5OUUrMzcyMDUwNDc2IC0+IDIuOTY0MDQxOTlFKzM3MjA1MDQ4NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNDAgYWRkIDYuMDY2MjUwMTMgLTI3Ni4zNTkxODYgLT4gLTI3MC4yOTI5MzYgSW5leGFjdCBSb3VuZGVkCit4Y29tMzQwIGNvbXBhcmUgNi4wNjYyNTAxMyAtMjc2LjM1OTE4NiAtPiAxCit4ZGl2MzQwIGRpdmlkZSA2LjA2NjI1MDEzIC0yNzYuMzU5MTg2IC0+IC0wLjAyMTk1MDYwMDcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzQwIGRpdmlkZWludCA2LjA2NjI1MDEzIC0yNzYuMzU5MTg2IC0+IC0wCit4bXVsMzQwIG11bHRpcGx5IDYuMDY2MjUwMTMgLTI3Ni4zNTkxODYgLT4gLTE2NzYuNDYzOTUgSW5leGFjdCBSb3VuZGVkCit4cG93MzQwIHBvd2VyIDYuMDY2MjUwMTMgLTI3NiAtPiA4LjIwMzM5MTQ5RS0yMTcgSW5leGFjdCBSb3VuZGVkCit4cmVtMzQwIHJlbWFpbmRlciA2LjA2NjI1MDEzIC0yNzYuMzU5MTg2IC0+IDYuMDY2MjUwMTMKK3hzdWIzNDAgc3VidHJhY3QgNi4wNjYyNTAxMyAtMjc2LjM1OTE4NiAtPiAyODIuNDI1NDM2IEluZXhhY3QgUm91bmRlZAoreGFkZDM0MSBhZGQgLTYyOTcxNjE3LjVFLTI0MTQ0NDc0NCA0NjI2Njc5OS4zIC0+IDQ2MjY2Nzk5LjMgSW5leGFjdCBSb3VuZGVkCit4Y29tMzQxIGNvbXBhcmUgLTYyOTcxNjE3LjVFLTI0MTQ0NDc0NCA0NjI2Njc5OS4zIC0+IC0xCit4ZGl2MzQxIGRpdmlkZSAtNjI5NzE2MTcuNUUtMjQxNDQ0NzQ0IDQ2MjY2Nzk5LjMgLT4gLTEuMzYxMDU0MTFFLTI0MTQ0NDc0NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNDEgZGl2aWRlaW50IC02Mjk3MTYxNy41RS0yNDE0NDQ3NDQgNDYyNjY3OTkuMyAtPiAtMAoreG11bDM0MSBtdWx0aXBseSAtNjI5NzE2MTcuNUUtMjQxNDQ0NzQ0IDQ2MjY2Nzk5LjMgLT4gLTIuOTEzNDk1MTlFLTI0MTQ0NDcyOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNDEgcG93ZXIgLTYyOTcxNjE3LjVFLTI0MTQ0NDc0NCA0NjI2Njc5OSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzQxIHJlbWFpbmRlciAtNjI5NzE2MTcuNUUtMjQxNDQ0NzQ0IDQ2MjY2Nzk5LjMgLT4gLTYuMjk3MTYxNzVFLTI0MTQ0NDczNworeHN1YjM0MSBzdWJ0cmFjdCAtNjI5NzE2MTcuNUUtMjQxNDQ0NzQ0IDQ2MjY2Nzk5LjMgLT4gLTQ2MjY2Nzk5LjMgSW5leGFjdCBSb3VuZGVkCit4YWRkMzQyIGFkZCAtNS4zNjkxNzgwMCAtMzExMTI0NTkzLkUtOTc2MDY2NDkxIC0+IC01LjM2OTE3ODAwIEluZXhhY3QgUm91bmRlZAoreGNvbTM0MiBjb21wYXJlIC01LjM2OTE3ODAwIC0zMTExMjQ1OTMuRS05NzYwNjY0OTEgLT4gLTEKK3hkaXYzNDIgZGl2aWRlIC01LjM2OTE3ODAwIC0zMTExMjQ1OTMuRS05NzYwNjY0OTEgLT4gMS43MjU3MzI0M0UrOTc2MDY2NDgzIEluZXhhY3QgUm91bmRlZAoreGR2aTM0MiBkaXZpZGVpbnQgLTUuMzY5MTc4MDAgLTMxMTEyNDU5My5FLTk3NjA2NjQ5MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDM0MiBtdWx0aXBseSAtNS4zNjkxNzgwMCAtMzExMTI0NTkzLkUtOTc2MDY2NDkxIC0+IDEuNjcwNDgzMzJFLTk3NjA2NjQ4MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNDIgcG93ZXIgLTUuMzY5MTc4MDAgLTMgLT4gLTAuMDA2NDYwNjU1NjUgSW5leGFjdCBSb3VuZGVkCit4cmVtMzQyIHJlbWFpbmRlciAtNS4zNjkxNzgwMCAtMzExMTI0NTkzLkUtOTc2MDY2NDkxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzQyIHN1YnRyYWN0IC01LjM2OTE3ODAwIC0zMTExMjQ1OTMuRS05NzYwNjY0OTEgLT4gLTUuMzY5MTc4MDAgSW5leGFjdCBSb3VuZGVkCit4YWRkMzQzIGFkZCAyNDY3OTE1LjAxIC05Mi41NTU4MzIyIC0+IDI0Njc4MjIuNDUgSW5leGFjdCBSb3VuZGVkCit4Y29tMzQzIGNvbXBhcmUgMjQ2NzkxNS4wMSAtOTIuNTU1ODMyMiAtPiAxCit4ZGl2MzQzIGRpdmlkZSAyNDY3OTE1LjAxIC05Mi41NTU4MzIyIC0+IC0yNjY2NC4wNjgxIEluZXhhY3QgUm91bmRlZAoreGR2aTM0MyBkaXZpZGVpbnQgMjQ2NzkxNS4wMSAtOTIuNTU1ODMyMiAtPiAtMjY2NjQKK3htdWwzNDMgbXVsdGlwbHkgMjQ2NzkxNS4wMSAtOTIuNTU1ODMyMiAtPiAtMjI4NDE5OTI4IEluZXhhY3QgUm91bmRlZAoreHBvdzM0MyBwb3dlciAyNDY3OTE1LjAxIC05MyAtPiAzLjI2MDU1NDQ0RS01OTUgSW5leGFjdCBSb3VuZGVkCit4cmVtMzQzIHJlbWFpbmRlciAyNDY3OTE1LjAxIC05Mi41NTU4MzIyIC0+IDYuMzAwMjE5MgoreHN1YjM0MyBzdWJ0cmFjdCAyNDY3OTE1LjAxIC05Mi41NTU4MzIyIC0+IDI0NjgwMDcuNTcgSW5leGFjdCBSb3VuZGVkCit4YWRkMzQ0IGFkZCAxODcuMjMyNjcxIC04NDAuNDY5MzQ3IC0+IC02NTMuMjM2Njc2Cit4Y29tMzQ0IGNvbXBhcmUgMTg3LjIzMjY3MSAtODQwLjQ2OTM0NyAtPiAxCit4ZGl2MzQ0IGRpdmlkZSAxODcuMjMyNjcxIC04NDAuNDY5MzQ3IC0+IC0wLjIyMjc3MTU2NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNDQgZGl2aWRlaW50IDE4Ny4yMzI2NzEgLTg0MC40NjkzNDcgLT4gLTAKK3htdWwzNDQgbXVsdGlwbHkgMTg3LjIzMjY3MSAtODQwLjQ2OTM0NyAtPiAtMTU3MzYzLjMyMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNDQgcG93ZXIgMTg3LjIzMjY3MSAtODQwIC0+IDEuNTgyODA4NjJFLTE5MDkgSW5leGFjdCBSb3VuZGVkCit4cmVtMzQ0IHJlbWFpbmRlciAxODcuMjMyNjcxIC04NDAuNDY5MzQ3IC0+IDE4Ny4yMzI2NzEKK3hzdWIzNDQgc3VidHJhY3QgMTg3LjIzMjY3MSAtODQwLjQ2OTM0NyAtPiAxMDI3LjcwMjAyIEluZXhhY3QgUm91bmRlZAoreGFkZDM0NSBhZGQgODEyMzMuNjgyMyAtNTE5Mi4yMTY2NkUrMzA5MzE1MDkzIC0+IC01LjE5MjIxNjY2RSszMDkzMTUwOTYgSW5leGFjdCBSb3VuZGVkCit4Y29tMzQ1IGNvbXBhcmUgODEyMzMuNjgyMyAtNTE5Mi4yMTY2NkUrMzA5MzE1MDkzIC0+IDEKK3hkaXYzNDUgZGl2aWRlIDgxMjMzLjY4MjMgLTUxOTIuMjE2NjZFKzMwOTMxNTA5MyAtPiAtMS41NjQ1Mjc5OEUtMzA5MzE1MDkyIEluZXhhY3QgUm91bmRlZAoreGR2aTM0NSBkaXZpZGVpbnQgODEyMzMuNjgyMyAtNTE5Mi4yMTY2NkUrMzA5MzE1MDkzIC0+IC0wCit4bXVsMzQ1IG11bHRpcGx5IDgxMjMzLjY4MjMgLTUxOTIuMjE2NjZFKzMwOTMxNTA5MyAtPiAtNC4yMTc4Mjg3OUUrMzA5MzE1MTAxIEluZXhhY3QgUm91bmRlZAoreHBvdzM0NSBwb3dlciA4MTIzMy42ODIzIC01IC0+IDIuODI2OTU3NjNFLTI1IEluZXhhY3QgUm91bmRlZAoreHJlbTM0NSByZW1haW5kZXIgODEyMzMuNjgyMyAtNTE5Mi4yMTY2NkUrMzA5MzE1MDkzIC0+IDgxMjMzLjY4MjMKK3hzdWIzNDUgc3VidHJhY3QgODEyMzMuNjgyMyAtNTE5Mi4yMTY2NkUrMzA5MzE1MDkzIC0+IDUuMTkyMjE2NjZFKzMwOTMxNTA5NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNDYgYWRkIC04NTQuNTg2MTEzIC03OS44NzE1NzYyRS04NTMwNjUxMDMgLT4gLTg1NC41ODYxMTMgSW5leGFjdCBSb3VuZGVkCit4Y29tMzQ2IGNvbXBhcmUgLTg1NC41ODYxMTMgLTc5Ljg3MTU3NjJFLTg1MzA2NTEwMyAtPiAtMQoreGRpdjM0NiBkaXZpZGUgLTg1NC41ODYxMTMgLTc5Ljg3MTU3NjJFLTg1MzA2NTEwMyAtPiAxLjA2OTk1MDIzRSs4NTMwNjUxMDQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzQ2IGRpdmlkZWludCAtODU0LjU4NjExMyAtNzkuODcxNTc2MkUtODUzMDY1MTAzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzQ2IG11bHRpcGx5IC04NTQuNTg2MTEzIC03OS44NzE1NzYyRS04NTMwNjUxMDMgLT4gNi44MjU3MTM5OEUtODUzMDY1MDk5IEluZXhhY3QgUm91bmRlZAoreHBvdzM0NiBwb3dlciAtODU0LjU4NjExMyAtOCAtPiAzLjUxNTIyNjc5RS0yNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNDYgcmVtYWluZGVyIC04NTQuNTg2MTEzIC03OS44NzE1NzYyRS04NTMwNjUxMDMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzNDYgc3VidHJhY3QgLTg1NC41ODYxMTMgLTc5Ljg3MTU3NjJFLTg1MzA2NTEwMyAtPiAtODU0LjU4NjExMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNDcgYWRkIDc4ODcyNjY1LjMgMTcyLjEwMjExOSAtPiA3ODg3MjgzNy40IEluZXhhY3QgUm91bmRlZAoreGNvbTM0NyBjb21wYXJlIDc4ODcyNjY1LjMgMTcyLjEwMjExOSAtPiAxCit4ZGl2MzQ3IGRpdmlkZSA3ODg3MjY2NS4zIDE3Mi4xMDIxMTkgLT4gNDU4Mjg5LjkxNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNDcgZGl2aWRlaW50IDc4ODcyNjY1LjMgMTcyLjEwMjExOSAtPiA0NTgyODkKK3htdWwzNDcgbXVsdGlwbHkgNzg4NzI2NjUuMyAxNzIuMTAyMTE5IC0+IDEuMzU3NDE1MjhFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzM0NyBwb3dlciA3ODg3MjY2NS4zIDE3MiAtPiAxLjg2NzkzMTM3RSsxMzU4IEluZXhhY3QgUm91bmRlZAoreHJlbTM0NyByZW1haW5kZXIgNzg4NzI2NjUuMyAxNzIuMTAyMTE5IC0+IDE1Ny4yODU2MDkKK3hzdWIzNDcgc3VidHJhY3QgNzg4NzI2NjUuMyAxNzIuMTAyMTE5IC0+IDc4ODcyNDkzLjIgSW5leGFjdCBSb3VuZGVkCit4YWRkMzQ4IGFkZCAzMjgyNjguMUUtNDM2MzE1NjE3IC0yMDQuNTIyMjQ1IC0+IC0yMDQuNTIyMjQ1IEluZXhhY3QgUm91bmRlZAoreGNvbTM0OCBjb21wYXJlIDMyODI2OC4xRS00MzYzMTU2MTcgLTIwNC41MjIyNDUgLT4gMQoreGRpdjM0OCBkaXZpZGUgMzI4MjY4LjFFLTQzNjMxNTYxNyAtMjA0LjUyMjI0NSAtPiAtMS42MDUwNDgzOUUtNDM2MzE1NjE0IEluZXhhY3QgUm91bmRlZAoreGR2aTM0OCBkaXZpZGVpbnQgMzI4MjY4LjFFLTQzNjMxNTYxNyAtMjA0LjUyMjI0NSAtPiAtMAoreG11bDM0OCBtdWx0aXBseSAzMjgyNjguMUUtNDM2MzE1NjE3IC0yMDQuNTIyMjQ1IC0+IC02LjcxMzgxMjg4RS00MzYzMTU2MTAgSW5leGFjdCBSb3VuZGVkCit4cG93MzQ4IHBvd2VyIDMyODI2OC4xRS00MzYzMTU2MTcgLTIwNSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNDggcmVtYWluZGVyIDMyODI2OC4xRS00MzYzMTU2MTcgLTIwNC41MjIyNDUgLT4gMy4yODI2ODFFLTQzNjMxNTYxMgoreHN1YjM0OCBzdWJ0cmFjdCAzMjgyNjguMUUtNDM2MzE1NjE3IC0yMDQuNTIyMjQ1IC0+IDIwNC41MjIyNDUgSW5leGFjdCBSb3VuZGVkCit4YWRkMzQ5IGFkZCAtNDAzNzkxMS4wMkUrNjQxMzY3NjQ1IDI5LjU3MTMwMTAgLT4gLTQuMDM3OTExMDJFKzY0MTM2NzY1MSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNDkgY29tcGFyZSAtNDAzNzkxMS4wMkUrNjQxMzY3NjQ1IDI5LjU3MTMwMTAgLT4gLTEKK3hkaXYzNDkgZGl2aWRlIC00MDM3OTExLjAyRSs2NDEzNjc2NDUgMjkuNTcxMzAxMCAtPiAtMS4zNjU0ODMwNUUrNjQxMzY3NjUwIEluZXhhY3QgUm91bmRlZAoreGR2aTM0OSBkaXZpZGVpbnQgLTQwMzc5MTEuMDJFKzY0MTM2NzY0NSAyOS41NzEzMDEwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzQ5IG11bHRpcGx5IC00MDM3OTExLjAyRSs2NDEzNjc2NDUgMjkuNTcxMzAxMCAtPiAtMS4xOTQwNjI4MkUrNjQxMzY3NjUzIEluZXhhY3QgUm91bmRlZAoreHBvdzM0OSBwb3dlciAtNDAzNzkxMS4wMkUrNjQxMzY3NjQ1IDMwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTM0OSByZW1haW5kZXIgLTQwMzc5MTEuMDJFKzY0MTM2NzY0NSAyOS41NzEzMDEwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzQ5IHN1YnRyYWN0IC00MDM3OTExLjAyRSs2NDEzNjc2NDUgMjkuNTcxMzAxMCAtPiAtNC4wMzc5MTEwMkUrNjQxMzY3NjUxIEluZXhhY3QgUm91bmRlZAoreGFkZDM1MCBhZGQgLTY4ODc1NTU2MS5FLTk1MzAxNjk5IDk3OC4yNzUzMTJFKzkxMzgxMjYwOSAtPiA5Ljc4Mjc1MzEyRSs5MTM4MTI2MTEgSW5leGFjdCBSb3VuZGVkCit4Y29tMzUwIGNvbXBhcmUgLTY4ODc1NTU2MS5FLTk1MzAxNjk5IDk3OC4yNzUzMTJFKzkxMzgxMjYwOSAtPiAtMQoreGRpdjM1MCBkaXZpZGUgLTY4ODc1NTU2MS5FLTk1MzAxNjk5IDk3OC4yNzUzMTJFKzkxMzgxMjYwOSAtPiAtMEUtMTAwMDAwMDAwNyBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbCBDbGFtcGVkCit4ZHZpMzUwIGRpdmlkZWludCAtNjg4NzU1NTYxLkUtOTUzMDE2OTkgOTc4LjI3NTMxMkUrOTEzODEyNjA5IC0+IC0wCit4bXVsMzUwIG11bHRpcGx5IC02ODg3NTU1NjEuRS05NTMwMTY5OSA5NzguMjc1MzEyRSs5MTM4MTI2MDkgLT4gLTYuNzM3OTI1NjFFKzgxODUxMDkyMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNTAgcG93ZXIgLTY4ODc1NTU2MS5FLTk1MzAxNjk5IDEwIC0+IDIuNDAyNDMyNDRFLTk1MzAxNjkwMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNTAgcmVtYWluZGVyIC02ODg3NTU1NjEuRS05NTMwMTY5OSA5NzguMjc1MzEyRSs5MTM4MTI2MDkgLT4gLTYuODg3NTU1NjFFLTk1MzAxNjkxCit4c3ViMzUwIHN1YnRyYWN0IC02ODg3NTU1NjEuRS05NTMwMTY5OSA5NzguMjc1MzEyRSs5MTM4MTI2MDkgLT4gLTkuNzgyNzUzMTJFKzkxMzgxMjYxMSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNTEgYWRkIC01LjQ3MzQ1NTAyIDU5ODE4Ljc1ODAgLT4gNTk4MTMuMjg0NSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNTEgY29tcGFyZSAtNS40NzM0NTUwMiA1OTgxOC43NTgwIC0+IC0xCit4ZGl2MzUxIGRpdmlkZSAtNS40NzM0NTUwMiA1OTgxOC43NTgwIC0+IC0wLjAwMDA5MTUwMDY0NjMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzUxIGRpdmlkZWludCAtNS40NzM0NTUwMiA1OTgxOC43NTgwIC0+IC0wCit4bXVsMzUxIG11bHRpcGx5IC01LjQ3MzQ1NTAyIDU5ODE4Ljc1ODAgLT4gLTMyNzQxNS4yODEgSW5leGFjdCBSb3VuZGVkCit4cG93MzUxIHBvd2VyIC01LjQ3MzQ1NTAyIDU5ODE5IC0+IC0xLjE2OTE0MTQ2RSs0NDE2MiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNTEgcmVtYWluZGVyIC01LjQ3MzQ1NTAyIDU5ODE4Ljc1ODAgLT4gLTUuNDczNDU1MDIKK3hzdWIzNTEgc3VidHJhY3QgLTUuNDczNDU1MDIgNTk4MTguNzU4MCAtPiAtNTk4MjQuMjMxNSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNTIgYWRkIDU2Mzg5MTYyMEUtMzYxMzU0NTY3IC04NDU5MDAzNjIuIC0+IC04NDU5MDAzNjIgSW5leGFjdCBSb3VuZGVkCit4Y29tMzUyIGNvbXBhcmUgNTYzODkxNjIwRS0zNjEzNTQ1NjcgLTg0NTkwMDM2Mi4gLT4gMQoreGRpdjM1MiBkaXZpZGUgNTYzODkxNjIwRS0zNjEzNTQ1NjcgLTg0NTkwMDM2Mi4gLT4gLTYuNjY2MTcwNjlFLTM2MTM1NDU2OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNTIgZGl2aWRlaW50IDU2Mzg5MTYyMEUtMzYxMzU0NTY3IC04NDU5MDAzNjIuIC0+IC0wCit4bXVsMzUyIG11bHRpcGx5IDU2Mzg5MTYyMEUtMzYxMzU0NTY3IC04NDU5MDAzNjIuIC0+IC00Ljc2OTk2MTI1RS0zNjEzNTQ1NTAgSW5leGFjdCBSb3VuZGVkCit4cG93MzUyIHBvd2VyIDU2Mzg5MTYyMEUtMzYxMzU0NTY3IC04NDU5MDAzNjIgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMzUyIHJlbWFpbmRlciA1NjM4OTE2MjBFLTM2MTM1NDU2NyAtODQ1OTAwMzYyLiAtPiA1LjYzODkxNjIwRS0zNjEzNTQ1NTkKK3hzdWIzNTIgc3VidHJhY3QgNTYzODkxNjIwRS0zNjEzNTQ1NjcgLTg0NTkwMDM2Mi4gLT4gODQ1OTAwMzYyIEluZXhhY3QgUm91bmRlZAoreGFkZDM1MyBhZGQgLTY5LjcyMzEyODYgODU3NzMuNzUwNCAtPiA4NTcwNC4wMjczIEluZXhhY3QgUm91bmRlZAoreGNvbTM1MyBjb21wYXJlIC02OS43MjMxMjg2IDg1NzczLjc1MDQgLT4gLTEKK3hkaXYzNTMgZGl2aWRlIC02OS43MjMxMjg2IDg1NzczLjc1MDQgLT4gLTAuMDAwODEyODcyNTY2IEluZXhhY3QgUm91bmRlZAoreGR2aTM1MyBkaXZpZGVpbnQgLTY5LjcyMzEyODYgODU3NzMuNzUwNCAtPiAtMAoreG11bDM1MyBtdWx0aXBseSAtNjkuNzIzMTI4NiA4NTc3My43NTA0IC0+IC01OTgwNDE0LjIzIEluZXhhY3QgUm91bmRlZAoreHBvdzM1MyBwb3dlciAtNjkuNzIzMTI4NiA4NTc3NCAtPiA2LjQxNzE0MjYxRSsxNTgxMTMgSW5leGFjdCBSb3VuZGVkCit4cmVtMzUzIHJlbWFpbmRlciAtNjkuNzIzMTI4NiA4NTc3My43NTA0IC0+IC02OS43MjMxMjg2Cit4c3ViMzUzIHN1YnRyYWN0IC02OS43MjMxMjg2IDg1NzczLjc1MDQgLT4gLTg1ODQzLjQ3MzUgSW5leGFjdCBSb3VuZGVkCit4YWRkMzU0IGFkZCA1MTI1LjUxMTg4IDczODE0NjM4LjRFLTUwMDkzNDc0MSAtPiA1MTI1LjUxMTg4IEluZXhhY3QgUm91bmRlZAoreGNvbTM1NCBjb21wYXJlIDUxMjUuNTExODggNzM4MTQ2MzguNEUtNTAwOTM0NzQxIC0+IDEKK3hkaXYzNTQgZGl2aWRlIDUxMjUuNTExODggNzM4MTQ2MzguNEUtNTAwOTM0NzQxIC0+IDYuOTQzNzYwNzRFKzUwMDkzNDczNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNTQgZGl2aWRlaW50IDUxMjUuNTExODggNzM4MTQ2MzguNEUtNTAwOTM0NzQxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzU0IG11bHRpcGx5IDUxMjUuNTExODggNzM4MTQ2MzguNEUtNTAwOTM0NzQxIC0+IDMuNzgzMzc4MDZFLTUwMDkzNDczMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNTQgcG93ZXIgNTEyNS41MTE4OCA3IC0+IDkuMjkzMTAyMTZFKzI1IEluZXhhY3QgUm91bmRlZAoreHJlbTM1NCByZW1haW5kZXIgNTEyNS41MTE4OCA3MzgxNDYzOC40RS01MDA5MzQ3NDEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzNTQgc3VidHJhY3QgNTEyNS41MTE4OCA3MzgxNDYzOC40RS01MDA5MzQ3NDEgLT4gNTEyNS41MTE4OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNTUgYWRkIC01NC42MjU0MDk2IC0zMzI5MjE4OTkuIC0+IC0zMzI5MjE5NTQgSW5leGFjdCBSb3VuZGVkCit4Y29tMzU1IGNvbXBhcmUgLTU0LjYyNTQwOTYgLTMzMjkyMTg5OS4gLT4gMQoreGRpdjM1NSBkaXZpZGUgLTU0LjYyNTQwOTYgLTMzMjkyMTg5OS4gLT4gMS42NDA3ODc1MkUtNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNTUgZGl2aWRlaW50IC01NC42MjU0MDk2IC0zMzI5MjE4OTkuIC0+IDAKK3htdWwzNTUgbXVsdGlwbHkgLTU0LjYyNTQwOTYgLTMzMjkyMTg5OS4gLT4gMS44MTg1OTk1MUUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MzU1IHBvd2VyIC01NC42MjU0MDk2IC0zMzI5MjE4OTkgLT4gLTEuMDE0ODI1NjlFLTU3ODQxNjc0NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNTUgcmVtYWluZGVyIC01NC42MjU0MDk2IC0zMzI5MjE4OTkuIC0+IC01NC42MjU0MDk2Cit4c3ViMzU1IHN1YnRyYWN0IC01NC42MjU0MDk2IC0zMzI5MjE4OTkuIC0+IDMzMjkyMTg0NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNTYgYWRkIC05LjA0Nzc4MDk1RS01OTE4NzQwNzkgODcxOS40MDI4NiAtPiA4NzE5LjQwMjg2IEluZXhhY3QgUm91bmRlZAoreGNvbTM1NiBjb21wYXJlIC05LjA0Nzc4MDk1RS01OTE4NzQwNzkgODcxOS40MDI4NiAtPiAtMQoreGRpdjM1NiBkaXZpZGUgLTkuMDQ3NzgwOTVFLTU5MTg3NDA3OSA4NzE5LjQwMjg2IC0+IC0xLjAzNzY2MDYyRS01OTE4NzQwODIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzU2IGRpdmlkZWludCAtOS4wNDc3ODA5NUUtNTkxODc0MDc5IDg3MTkuNDAyODYgLT4gLTAKK3htdWwzNTYgbXVsdGlwbHkgLTkuMDQ3NzgwOTVFLTU5MTg3NDA3OSA4NzE5LjQwMjg2IC0+IC03Ljg4OTEyNDcxRS01OTE4NzQwNzUgSW5leGFjdCBSb3VuZGVkCit4cG93MzU2IHBvd2VyIC05LjA0Nzc4MDk1RS01OTE4NzQwNzkgODcxOSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzU2IHJlbWFpbmRlciAtOS4wNDc3ODA5NUUtNTkxODc0MDc5IDg3MTkuNDAyODYgLT4gLTkuMDQ3NzgwOTVFLTU5MTg3NDA3OQoreHN1YjM1NiBzdWJ0cmFjdCAtOS4wNDc3ODA5NUUtNTkxODc0MDc5IDg3MTkuNDAyODYgLT4gLTg3MTkuNDAyODYgSW5leGFjdCBSb3VuZGVkCit4YWRkMzU3IGFkZCAtMjEwMDYuMTczM0UrODg0Njg0NDMxIC00ODg3Mi45MTc1IC0+IC0yLjEwMDYxNzMzRSs4ODQ2ODQ0MzUgSW5leGFjdCBSb3VuZGVkCit4Y29tMzU3IGNvbXBhcmUgLTIxMDA2LjE3MzNFKzg4NDY4NDQzMSAtNDg4NzIuOTE3NSAtPiAtMQoreGRpdjM1NyBkaXZpZGUgLTIxMDA2LjE3MzNFKzg4NDY4NDQzMSAtNDg4NzIuOTE3NSAtPiA0LjI5ODEyMTQxRSs4ODQ2ODQ0MzAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzU3IGRpdmlkZWludCAtMjEwMDYuMTczM0UrODg0Njg0NDMxIC00ODg3Mi45MTc1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzU3IG11bHRpcGx5IC0yMTAwNi4xNzMzRSs4ODQ2ODQ0MzEgLTQ4ODcyLjkxNzUgLT4gMS4wMjY2MzI5N0UrODg0Njg0NDQwIEluZXhhY3QgUm91bmRlZAoreHBvdzM1NyBwb3dlciAtMjEwMDYuMTczM0UrODg0Njg0NDMxIC00ODg3MyAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzU3IHJlbWFpbmRlciAtMjEwMDYuMTczM0UrODg0Njg0NDMxIC00ODg3Mi45MTc1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzU3IHN1YnRyYWN0IC0yMTAwNi4xNzMzRSs4ODQ2ODQ0MzEgLTQ4ODcyLjkxNzUgLT4gLTIuMTAwNjE3MzNFKzg4NDY4NDQzNSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNTggYWRkIC0xNTQ2NzgzIC01MTkzNTM3MC40IC0+IC01MzQ4MjE1My40Cit4Y29tMzU4IGNvbXBhcmUgLTE1NDY3ODMgLTUxOTM1MzcwLjQgLT4gMQoreGRpdjM1OCBkaXZpZGUgLTE1NDY3ODMgLTUxOTM1MzcwLjQgLT4gMC4wMjk3ODI4NDMzIEluZXhhY3QgUm91bmRlZAoreGR2aTM1OCBkaXZpZGVpbnQgLTE1NDY3ODMgLTUxOTM1MzcwLjQgLT4gMAoreG11bDM1OCBtdWx0aXBseSAtMTU0Njc4MyAtNTE5MzUzNzAuNCAtPiA4LjAzMzI3NDgwRSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNTggcG93ZXIgLTE1NDY3ODMgLTUxOTM1MzcwIC0+IDMuMzYwMjI0NjFFLTMyMTQ1MDMwNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNTggcmVtYWluZGVyIC0xNTQ2NzgzIC01MTkzNTM3MC40IC0+IC0xNTQ2NzgzLjAKK3hzdWIzNTggc3VidHJhY3QgLTE1NDY3ODMgLTUxOTM1MzcwLjQgLT4gNTAzODg1ODcuNAoreGFkZDM1OSBhZGQgNjEzMDI0ODYuOCAyMDUuNDkwNDE3IC0+IDYxMzAyNjkyLjMgSW5leGFjdCBSb3VuZGVkCit4Y29tMzU5IGNvbXBhcmUgNjEzMDI0ODYuOCAyMDUuNDkwNDE3IC0+IDEKK3hkaXYzNTkgZGl2aWRlIDYxMzAyNDg2LjggMjA1LjQ5MDQxNyAtPiAyOTgzMjIuODUwIEluZXhhY3QgUm91bmRlZAoreGR2aTM1OSBkaXZpZGVpbnQgNjEzMDI0ODYuOCAyMDUuNDkwNDE3IC0+IDI5ODMyMgoreG11bDM1OSBtdWx0aXBseSA2MTMwMjQ4Ni44IDIwNS40OTA0MTcgLT4gMS4yNTk3MDczNkUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MzU5IHBvd2VyIDYxMzAyNDg2LjggMjA1IC0+IDIuNzEwMjQ3NTVFKzE1OTYgSW5leGFjdCBSb3VuZGVkCit4cmVtMzU5IHJlbWFpbmRlciA2MTMwMjQ4Ni44IDIwNS40OTA0MTcgLT4gMTc0LjYxOTcyNgoreHN1YjM1OSBzdWJ0cmFjdCA2MTMwMjQ4Ni44IDIwNS40OTA0MTcgLT4gNjEzMDIyODEuMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNjAgYWRkIC0zMTgxODAxMDkuIC01NDAwODc0NC42RS0xNzA5MzEwMDIgLT4gLTMxODE4MDEwOSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNjAgY29tcGFyZSAtMzE4MTgwMTA5LiAtNTQwMDg3NDQuNkUtMTcwOTMxMDAyIC0+IC0xCit4ZGl2MzYwIGRpdmlkZSAtMzE4MTgwMTA5LiAtNTQwMDg3NDQuNkUtMTcwOTMxMDAyIC0+IDUuODkxMjcwMjNFKzE3MDkzMTAwMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNjAgZGl2aWRlaW50IC0zMTgxODAxMDkuIC01NDAwODc0NC42RS0xNzA5MzEwMDIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzNjAgbXVsdGlwbHkgLTMxODE4MDEwOS4gLTU0MDA4NzQ0LjZFLTE3MDkzMTAwMiAtPiAxLjcxODQ1MDgyRS0xNzA5MzA5ODYgSW5leGFjdCBSb3VuZGVkCit4cG93MzYwIHBvd2VyIC0zMTgxODAxMDkuIC01IC0+IC0zLjA2NjQ0MjgwRS00MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNjAgcmVtYWluZGVyIC0zMTgxODAxMDkuIC01NDAwODc0NC42RS0xNzA5MzEwMDIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzNjAgc3VidHJhY3QgLTMxODE4MDEwOS4gLTU0MDA4NzQ0LjZFLTE3MDkzMTAwMiAtPiAtMzE4MTgwMTA5IEluZXhhY3QgUm91bmRlZAoreGFkZDM2MSBhZGQgLTI4NDg2MTM3LjFFKzkwMTQ0MTcxNCAtNDI0NTQuOTQwIC0+IC0yLjg0ODYxMzcxRSs5MDE0NDE3MjEgSW5leGFjdCBSb3VuZGVkCit4Y29tMzYxIGNvbXBhcmUgLTI4NDg2MTM3LjFFKzkwMTQ0MTcxNCAtNDI0NTQuOTQwIC0+IC0xCit4ZGl2MzYxIGRpdmlkZSAtMjg0ODYxMzcuMUUrOTAxNDQxNzE0IC00MjQ1NC45NDAgLT4gNi43MDk3MzQzOUUrOTAxNDQxNzE2IEluZXhhY3QgUm91bmRlZAoreGR2aTM2MSBkaXZpZGVpbnQgLTI4NDg2MTM3LjFFKzkwMTQ0MTcxNCAtNDI0NTQuOTQwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzYxIG11bHRpcGx5IC0yODQ4NjEzNy4xRSs5MDE0NDE3MTQgLTQyNDU0Ljk0MCAtPiAxLjIwOTM3NzI0RSs5MDE0NDE3MjYgSW5leGFjdCBSb3VuZGVkCit4cG93MzYxIHBvd2VyIC0yODQ4NjEzNy4xRSs5MDE0NDE3MTQgLTQyNDU1IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0zNjEgcmVtYWluZGVyIC0yODQ4NjEzNy4xRSs5MDE0NDE3MTQgLTQyNDU0Ljk0MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjM2MSBzdWJ0cmFjdCAtMjg0ODYxMzcuMUUrOTAxNDQxNzE0IC00MjQ1NC45NDAgLT4gLTIuODQ4NjEzNzFFKzkwMTQ0MTcyMSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNjIgYWRkIC01NDYzOTgzMjguIC0yNy45MTQ5NzEyIC0+IC01NDYzOTgzNTYgSW5leGFjdCBSb3VuZGVkCit4Y29tMzYyIGNvbXBhcmUgLTU0NjM5ODMyOC4gLTI3LjkxNDk3MTIgLT4gLTEKK3hkaXYzNjIgZGl2aWRlIC01NDYzOTgzMjguIC0yNy45MTQ5NzEyIC0+IDE5NTczNjY2LjIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzYyIGRpdmlkZWludCAtNTQ2Mzk4MzI4LiAtMjcuOTE0OTcxMiAtPiAxOTU3MzY2NgoreG11bDM2MiBtdWx0aXBseSAtNTQ2Mzk4MzI4LiAtMjcuOTE0OTcxMiAtPiAxLjUyNTI2OTM2RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNjIgcG93ZXIgLTU0NjM5ODMyOC4gLTI4IC0+IDIuMjM3MzcwMzJFLTI0NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNjIgcmVtYWluZGVyIC01NDYzOTgzMjguIC0yNy45MTQ5NzEyIC0+IC01LjMzMTU4MDgKK3hzdWIzNjIgc3VidHJhY3QgLTU0NjM5ODMyOC4gLTI3LjkxNDk3MTIgLT4gLTU0NjM5ODMwMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNjMgYWRkIDU0MDIwNjYuMUUtMjg0OTc4MjE2IDYyMi43NTExMjggLT4gNjIyLjc1MTEyOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNjMgY29tcGFyZSA1NDAyMDY2LjFFLTI4NDk3ODIxNiA2MjIuNzUxMTI4IC0+IC0xCit4ZGl2MzYzIGRpdmlkZSA1NDAyMDY2LjFFLTI4NDk3ODIxNiA2MjIuNzUxMTI4IC0+IDguNjc0NTE4MzdFLTI4NDk3ODIxMyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNjMgZGl2aWRlaW50IDU0MDIwNjYuMUUtMjg0OTc4MjE2IDYyMi43NTExMjggLT4gMAoreG11bDM2MyBtdWx0aXBseSA1NDAyMDY2LjFFLTI4NDk3ODIxNiA2MjIuNzUxMTI4IC0+IDMuMzY0MTQyNzZFLTI4NDk3ODIwNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNjMgcG93ZXIgNTQwMjA2Ni4xRS0yODQ5NzgyMTYgNjIzIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTM2MyByZW1haW5kZXIgNTQwMjA2Ni4xRS0yODQ5NzgyMTYgNjIyLjc1MTEyOCAtPiA1LjQwMjA2NjFFLTI4NDk3ODIxMAoreHN1YjM2MyBzdWJ0cmFjdCA1NDAyMDY2LjFFLTI4NDk3ODIxNiA2MjIuNzUxMTI4IC0+IC02MjIuNzUxMTI4IEluZXhhY3QgUm91bmRlZAoreGFkZDM2NCBhZGQgMTg4NDU2MjAgMzEyOS40Mzc1MyAtPiAxODg0ODc0OS40IEluZXhhY3QgUm91bmRlZAoreGNvbTM2NCBjb21wYXJlIDE4ODQ1NjIwIDMxMjkuNDM3NTMgLT4gMQoreGRpdjM2NCBkaXZpZGUgMTg4NDU2MjAgMzEyOS40Mzc1MyAtPiA2MDIyLjA0NzA0IEluZXhhY3QgUm91bmRlZAoreGR2aTM2NCBkaXZpZGVpbnQgMTg4NDU2MjAgMzEyOS40Mzc1MyAtPiA2MDIyCit4bXVsMzY0IG11bHRpcGx5IDE4ODQ1NjIwIDMxMjkuNDM3NTMgLT4gNS44OTc2MTkwNUUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MzY0IHBvd2VyIDE4ODQ1NjIwIDMxMjkgLT4gMS4zNTk2NzQ0M0UrMjI3NjQgSW5leGFjdCBSb3VuZGVkCit4cmVtMzY0IHJlbWFpbmRlciAxODg0NTYyMCAzMTI5LjQzNzUzIC0+IDE0Ny4xOTQzNAoreHN1YjM2NCBzdWJ0cmFjdCAxODg0NTYyMCAzMTI5LjQzNzUzIC0+IDE4ODQyNDkwLjYgSW5leGFjdCBSb3VuZGVkCit4YWRkMzY1IGFkZCA1MDcwNy4xNDEyRSs5MTI0NzU2NzAgLTE5ODA5OC4xODZFKzcwMTQwNzUyNCAtPiA1LjA3MDcxNDEyRSs5MTI0NzU2NzQgSW5leGFjdCBSb3VuZGVkCit4Y29tMzY1IGNvbXBhcmUgNTA3MDcuMTQxMkUrOTEyNDc1NjcwIC0xOTgwOTguMTg2RSs3MDE0MDc1MjQgLT4gMQoreGRpdjM2NSBkaXZpZGUgNTA3MDcuMTQxMkUrOTEyNDc1NjcwIC0xOTgwOTguMTg2RSs3MDE0MDc1MjQgLT4gLTIuNTU5Njk3NDBFKzIxMTA2ODE0NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNjUgZGl2aWRlaW50IDUwNzA3LjE0MTJFKzkxMjQ3NTY3MCAtMTk4MDk4LjE4NkUrNzAxNDA3NTI0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzY1IG11bHRpcGx5IDUwNzA3LjE0MTJFKzkxMjQ3NTY3MCAtMTk4MDk4LjE4NkUrNzAxNDA3NTI0IC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3hwb3czNjUgcG93ZXIgNTA3MDcuMTQxMkUrOTEyNDc1NjcwIC0yIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTM2NSByZW1haW5kZXIgNTA3MDcuMTQxMkUrOTEyNDc1NjcwIC0xOTgwOTguMTg2RSs3MDE0MDc1MjQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzNjUgc3VidHJhY3QgNTA3MDcuMTQxMkUrOTEyNDc1NjcwIC0xOTgwOTguMTg2RSs3MDE0MDc1MjQgLT4gNS4wNzA3MTQxMkUrOTEyNDc1Njc0IEluZXhhY3QgUm91bmRlZAoreGFkZDM2NiBhZGQgNTUuODI0NTAwNkUrOTI4ODg1OTkxIDk5MTcwODQzLjlFLTQ3NDAyMTY3IC0+IDUuNTgyNDUwMDZFKzkyODg4NTk5MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNjYgY29tcGFyZSA1NS44MjQ1MDA2RSs5Mjg4ODU5OTEgOTkxNzA4NDMuOUUtNDc0MDIxNjcgLT4gMQoreGRpdjM2NiBkaXZpZGUgNTUuODI0NTAwNkUrOTI4ODg1OTkxIDk5MTcwODQzLjlFLTQ3NDAyMTY3IC0+IDUuNjI5MTI0MjlFKzk3NjI4ODE1MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNjYgZGl2aWRlaW50IDU1LjgyNDUwMDZFKzkyODg4NTk5MSA5OTE3MDg0My45RS00NzQwMjE2NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDM2NiBtdWx0aXBseSA1NS44MjQ1MDA2RSs5Mjg4ODU5OTEgOTkxNzA4NDMuOUUtNDc0MDIxNjcgLT4gNS41MzYxNjI4M0UrODgxNDgzODMzIEluZXhhY3QgUm91bmRlZAoreHBvdzM2NiBwb3dlciA1NS44MjQ1MDA2RSs5Mjg4ODU5OTEgMTAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMzY2IHJlbWFpbmRlciA1NS44MjQ1MDA2RSs5Mjg4ODU5OTEgOTkxNzA4NDMuOUUtNDc0MDIxNjcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzNjYgc3VidHJhY3QgNTUuODI0NTAwNkUrOTI4ODg1OTkxIDk5MTcwODQzLjlFLTQ3NDAyMTY3IC0+IDUuNTgyNDUwMDZFKzkyODg4NTk5MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNjcgYWRkIDEzLjgwMDM4ODNFLTM4NjIyNDkyMSAtODQxMjY0ODEuOUUtMjk2Mzc4MzQxIC0+IC04LjQxMjY0ODE5RS0yOTYzNzgzMzQgSW5leGFjdCBSb3VuZGVkCit4Y29tMzY3IGNvbXBhcmUgMTMuODAwMzg4M0UtMzg2MjI0OTIxIC04NDEyNjQ4MS45RS0yOTYzNzgzNDEgLT4gMQoreGRpdjM2NyBkaXZpZGUgMTMuODAwMzg4M0UtMzg2MjI0OTIxIC04NDEyNjQ4MS45RS0yOTYzNzgzNDEgLT4gLTEuNjQwNDMzMzFFLTg5ODQ2NTg3IEluZXhhY3QgUm91bmRlZAoreGR2aTM2NyBkaXZpZGVpbnQgMTMuODAwMzg4M0UtMzg2MjI0OTIxIC04NDEyNjQ4MS45RS0yOTYzNzgzNDEgLT4gLTAKK3htdWwzNjcgbXVsdGlwbHkgMTMuODAwMzg4M0UtMzg2MjI0OTIxIC04NDEyNjQ4MS45RS0yOTYzNzgzNDEgLT4gLTEuMTYwOTc4MTJFLTY4MjYwMzI1MyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNjcgcG93ZXIgMTMuODAwMzg4M0UtMzg2MjI0OTIxIC04IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTM2NyByZW1haW5kZXIgMTMuODAwMzg4M0UtMzg2MjI0OTIxIC04NDEyNjQ4MS45RS0yOTYzNzgzNDEgLT4gMS4zODAwMzg4M0UtMzg2MjI0OTIwCit4c3ViMzY3IHN1YnRyYWN0IDEzLjgwMDM4ODNFLTM4NjIyNDkyMSAtODQxMjY0ODEuOUUtMjk2Mzc4MzQxIC0+IDguNDEyNjQ4MTlFLTI5NjM3ODMzNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNjggYWRkIDk4MjAuOTA0NTcgNDY2NzEuNTkxNSAtPiA1NjQ5Mi40OTYxIEluZXhhY3QgUm91bmRlZAoreGNvbTM2OCBjb21wYXJlIDk4MjAuOTA0NTcgNDY2NzEuNTkxNSAtPiAtMQoreGRpdjM2OCBkaXZpZGUgOTgyMC45MDQ1NyA0NjY3MS41OTE1IC0+IDAuMjEwNDI1NzQ4IEluZXhhY3QgUm91bmRlZAoreGR2aTM2OCBkaXZpZGVpbnQgOTgyMC45MDQ1NyA0NjY3MS41OTE1IC0+IDAKK3htdWwzNjggbXVsdGlwbHkgOTgyMC45MDQ1NyA0NjY3MS41OTE1IC0+IDQ1ODM1NzI0NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNjggcG93ZXIgOTgyMC45MDQ1NyA0NjY3MiAtPiA0Ljk0NzUzMDcwRSsxODYzMjEgSW5leGFjdCBSb3VuZGVkCit4cmVtMzY4IHJlbWFpbmRlciA5ODIwLjkwNDU3IDQ2NjcxLjU5MTUgLT4gOTgyMC45MDQ1NworeHN1YjM2OCBzdWJ0cmFjdCA5ODIwLjkwNDU3IDQ2NjcxLjU5MTUgLT4gLTM2ODUwLjY4NjkgSW5leGFjdCBSb3VuZGVkCit4YWRkMzY5IGFkZCA3LjIyNDM2MDA2RSs4MzE5NDkxNTMgLTExMTY4ODMwRSszMjIzMzEwNDUgLT4gNy4yMjQzNjAwNkUrODMxOTQ5MTUzIEluZXhhY3QgUm91bmRlZAoreGNvbTM2OSBjb21wYXJlIDcuMjI0MzYwMDZFKzgzMTk0OTE1MyAtMTExNjg4MzBFKzMyMjMzMTA0NSAtPiAxCit4ZGl2MzY5IGRpdmlkZSA3LjIyNDM2MDA2RSs4MzE5NDkxNTMgLTExMTY4ODMwRSszMjIzMzEwNDUgLT4gLTYuNDY4MzIzMDZFKzUwOTYxODEwMSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNjkgZGl2aWRlaW50IDcuMjI0MzYwMDZFKzgzMTk0OTE1MyAtMTExNjg4MzBFKzMyMjMzMTA0NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDM2OSBtdWx0aXBseSA3LjIyNDM2MDA2RSs4MzE5NDkxNTMgLTExMTY4ODMwRSszMjIzMzEwNDUgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAoreHBvdzM2OSBwb3dlciA3LjIyNDM2MDA2RSs4MzE5NDkxNTMgLTEgLT4gMS4zODQyMDU2NUUtODMxOTQ5MTU0IEluZXhhY3QgUm91bmRlZAoreHJlbTM2OSByZW1haW5kZXIgNy4yMjQzNjAwNkUrODMxOTQ5MTUzIC0xMTE2ODgzMEUrMzIyMzMxMDQ1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzY5IHN1YnRyYWN0IDcuMjI0MzYwMDZFKzgzMTk0OTE1MyAtMTExNjg4MzBFKzMyMjMzMTA0NSAtPiA3LjIyNDM2MDA2RSs4MzE5NDkxNTMgSW5leGFjdCBSb3VuZGVkCit4YWRkMzcwIGFkZCA0NzI2NDg5MDAgLTIwNy43ODQxNTMgLT4gNDcyNjQ4NjkyIEluZXhhY3QgUm91bmRlZAoreGNvbTM3MCBjb21wYXJlIDQ3MjY0ODkwMCAtMjA3Ljc4NDE1MyAtPiAxCit4ZGl2MzcwIGRpdmlkZSA0NzI2NDg5MDAgLTIwNy43ODQxNTMgLT4gLTIyNzQ3MTEuMDEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzcwIGRpdmlkZWludCA0NzI2NDg5MDAgLTIwNy43ODQxNTMgLT4gLTIyNzQ3MTEKK3htdWwzNzAgbXVsdGlwbHkgNDcyNjQ4OTAwIC0yMDcuNzg0MTUzIC0+IC05LjgyMDg5NTE0RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNzAgcG93ZXIgNDcyNjQ4OTAwIC0yMDggLT4gNC45NjU0NzE0NUUtMTgwNSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNzAgcmVtYWluZGVyIDQ3MjY0ODkwMCAtMjA3Ljc4NDE1MyAtPiAxLjU0NTIxNworeHN1YjM3MCBzdWJ0cmFjdCA0NzI2NDg5MDAgLTIwNy43ODQxNTMgLT4gNDcyNjQ5MTA4IEluZXhhY3QgUm91bmRlZAoreGFkZDM3MSBhZGQgLTg3NTQuNDkzMDYgLTgxOC4xNjUxNTNFKzYzMTQ3NTQ1NyAtPiAtOC4xODE2NTE1M0UrNjMxNDc1NDU5IEluZXhhY3QgUm91bmRlZAoreGNvbTM3MSBjb21wYXJlIC04NzU0LjQ5MzA2IC04MTguMTY1MTUzRSs2MzE0NzU0NTcgLT4gMQoreGRpdjM3MSBkaXZpZGUgLTg3NTQuNDkzMDYgLTgxOC4xNjUxNTNFKzYzMTQ3NTQ1NyAtPiAxLjA3MDAxNTM5RS02MzE0NzU0NTYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzcxIGRpdmlkZWludCAtODc1NC40OTMwNiAtODE4LjE2NTE1M0UrNjMxNDc1NDU3IC0+IDAKK3htdWwzNzEgbXVsdGlwbHkgLTg3NTQuNDkzMDYgLTgxOC4xNjUxNTNFKzYzMTQ3NTQ1NyAtPiA3LjE2MjYyMTE1RSs2MzE0NzU0NjMgSW5leGFjdCBSb3VuZGVkCit4cG93MzcxIHBvd2VyIC04NzU0LjQ5MzA2IC04IC0+IDIuODk4MzU3NjdFLTMyIEluZXhhY3QgUm91bmRlZAoreHJlbTM3MSByZW1haW5kZXIgLTg3NTQuNDkzMDYgLTgxOC4xNjUxNTNFKzYzMTQ3NTQ1NyAtPiAtODc1NC40OTMwNgoreHN1YjM3MSBzdWJ0cmFjdCAtODc1NC40OTMwNiAtODE4LjE2NTE1M0UrNjMxNDc1NDU3IC0+IDguMTgxNjUxNTNFKzYzMTQ3NTQ1OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNzIgYWRkIDk4NzUwODY0IDE5MTM4MC41NTEgLT4gOTg5NDIyNDQuNiBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNzIgY29tcGFyZSA5ODc1MDg2NCAxOTEzODAuNTUxIC0+IDEKK3hkaXYzNzIgZGl2aWRlIDk4NzUwODY0IDE5MTM4MC41NTEgLT4gNTE1Ljk5MjE2MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNzIgZGl2aWRlaW50IDk4NzUwODY0IDE5MTM4MC41NTEgLT4gNTE1Cit4bXVsMzcyIG11bHRpcGx5IDk4NzUwODY0IDE5MTM4MC41NTEgLT4gMS44ODk4OTk0OEUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MzcyIHBvd2VyIDk4NzUwODY0IDE5MTM4MSAtPiAxLjcwOTA4ODA5RSsxNTMwMDAzIEluZXhhY3QgUm91bmRlZAoreHJlbTM3MiByZW1haW5kZXIgOTg3NTA4NjQgMTkxMzgwLjU1MSAtPiAxODk4ODAuMjM1Cit4c3ViMzcyIHN1YnRyYWN0IDk4NzUwODY0IDE5MTM4MC41NTEgLT4gOTg1NTk0ODMuNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNzMgYWRkIDcyNTI5MjU2MS4gLTc2ODk2MzYwNi5FKzM0MDc2Mjk4NiAtPiAtNy42ODk2MzYwNkUrMzQwNzYyOTk0IEluZXhhY3QgUm91bmRlZAoreGNvbTM3MyBjb21wYXJlIDcyNTI5MjU2MS4gLTc2ODk2MzYwNi5FKzM0MDc2Mjk4NiAtPiAxCit4ZGl2MzczIGRpdmlkZSA3MjUyOTI1NjEuIC03Njg5NjM2MDYuRSszNDA3NjI5ODYgLT4gLTkuNDMyMDc5MTdFLTM0MDc2Mjk4NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNzMgZGl2aWRlaW50IDcyNTI5MjU2MS4gLTc2ODk2MzYwNi5FKzM0MDc2Mjk4NiAtPiAtMAoreG11bDM3MyBtdWx0aXBseSA3MjUyOTI1NjEuIC03Njg5NjM2MDYuRSszNDA3NjI5ODYgLT4gLTUuNTc3MjM1ODNFKzM0MDc2MzAwMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNzMgcG93ZXIgNzI1MjkyNTYxLiAtOCAtPiAxLjMwNTg1Mjc3RS03MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNzMgcmVtYWluZGVyIDcyNTI5MjU2MS4gLTc2ODk2MzYwNi5FKzM0MDc2Mjk4NiAtPiA3MjUyOTI1NjEKK3hzdWIzNzMgc3VidHJhY3QgNzI1MjkyNTYxLiAtNzY4OTYzNjA2LkUrMzQwNzYyOTg2IC0+IDcuNjg5NjM2MDZFKzM0MDc2Mjk5NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNzQgYWRkIDE4NjIuODA0NDUgNjQ4MjU0NDgzLiAtPiA2NDgyNTYzNDYgSW5leGFjdCBSb3VuZGVkCit4Y29tMzc0IGNvbXBhcmUgMTg2Mi44MDQ0NSA2NDgyNTQ0ODMuIC0+IC0xCit4ZGl2Mzc0IGRpdmlkZSAxODYyLjgwNDQ1IDY0ODI1NDQ4My4gLT4gMC4wMDAwMDI4NzM1Njk3MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNzQgZGl2aWRlaW50IDE4NjIuODA0NDUgNjQ4MjU0NDgzLiAtPiAwCit4bXVsMzc0IG11bHRpcGx5IDE4NjIuODA0NDUgNjQ4MjU0NDgzLiAtPiAxLjIwNzU3MTM0RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNzQgcG93ZXIgMTg2Mi44MDQ0NSA2NDgyNTQ0ODMgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMzc0IHJlbWFpbmRlciAxODYyLjgwNDQ1IDY0ODI1NDQ4My4gLT4gMTg2Mi44MDQ0NQoreHN1YjM3NCBzdWJ0cmFjdCAxODYyLjgwNDQ1IDY0ODI1NDQ4My4gLT4gLTY0ODI1MjYyMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNzUgYWRkIC01NTQ5MzIwLjEgLTkzNTgwNjg0LjEgLT4gLTk5MTMwMDA0LjIKK3hjb20zNzUgY29tcGFyZSAtNTU0OTMyMC4xIC05MzU4MDY4NC4xIC0+IDEKK3hkaXYzNzUgZGl2aWRlIC01NTQ5MzIwLjEgLTkzNTgwNjg0LjEgLT4gMC4wNTkyOTk4NDU0IEluZXhhY3QgUm91bmRlZAoreGR2aTM3NSBkaXZpZGVpbnQgLTU1NDkzMjAuMSAtOTM1ODA2ODQuMSAtPiAwCit4bXVsMzc1IG11bHRpcGx5IC01NTQ5MzIwLjEgLTkzNTgwNjg0LjEgLT4gNS4xOTMwOTE3MUUrMTQgSW5leGFjdCBSb3VuZGVkCit4cG93Mzc1IHBvd2VyIC01NTQ5MzIwLjEgLTkzNTgwNjg0IC0+IDQuMjA2NjIwNzlFLTYzMTEzMDU3MiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNzUgcmVtYWluZGVyIC01NTQ5MzIwLjEgLTkzNTgwNjg0LjEgLT4gLTU1NDkzMjAuMQoreHN1YjM3NSBzdWJ0cmFjdCAtNTU0OTMyMC4xIC05MzU4MDY4NC4xIC0+IDg4MDMxMzY0LjAKK3hhZGQzNzYgYWRkIC0xNDY3NzA1My4xIC0yNTc4NC43MzU4IC0+IC0xNDcwMjgzNy44IEluZXhhY3QgUm91bmRlZAoreGNvbTM3NiBjb21wYXJlIC0xNDY3NzA1My4xIC0yNTc4NC43MzU4IC0+IC0xCit4ZGl2Mzc2IGRpdmlkZSAtMTQ2NzcwNTMuMSAtMjU3ODQuNzM1OCAtPiA1NjkuMjE0Nzk1IEluZXhhY3QgUm91bmRlZAoreGR2aTM3NiBkaXZpZGVpbnQgLTE0Njc3MDUzLjEgLTI1Nzg0LjczNTggLT4gNTY5Cit4bXVsMzc2IG11bHRpcGx5IC0xNDY3NzA1My4xIC0yNTc4NC43MzU4IC0+IDMuNzg0NDM5MzdFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzM3NiBwb3dlciAtMTQ2NzcwNTMuMSAtMjU3ODUgLT4gLTEuNjQ3NjA4MzFFLTE4NDc5MiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNzYgcmVtYWluZGVyIC0xNDY3NzA1My4xIC0yNTc4NC43MzU4IC0+IC01NTM4LjQyOTgKK3hzdWIzNzYgc3VidHJhY3QgLTE0Njc3MDUzLjEgLTI1Nzg0LjczNTggLT4gLTE0NjUxMjY4LjQgSW5leGFjdCBSb3VuZGVkCit4YWRkMzc3IGFkZCA1NDc0MDIuMzA4RSs1NzE2ODc2MTcgLTc4MzU3OTcuMDFFKzUwMDA2NzM2NCAtPiA1LjQ3NDAyMzA4RSs1NzE2ODc2MjIgSW5leGFjdCBSb3VuZGVkCit4Y29tMzc3IGNvbXBhcmUgNTQ3NDAyLjMwOEUrNTcxNjg3NjE3IC03ODM1Nzk3LjAxRSs1MDAwNjczNjQgLT4gMQoreGRpdjM3NyBkaXZpZGUgNTQ3NDAyLjMwOEUrNTcxNjg3NjE3IC03ODM1Nzk3LjAxRSs1MDAwNjczNjQgLT4gLTYuOTg1OTE3NDJFKzcxNjIwMjUxIEluZXhhY3QgUm91bmRlZAoreGR2aTM3NyBkaXZpZGVpbnQgNTQ3NDAyLjMwOEUrNTcxNjg3NjE3IC03ODM1Nzk3LjAxRSs1MDAwNjczNjQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzNzcgbXVsdGlwbHkgNTQ3NDAyLjMwOEUrNTcxNjg3NjE3IC03ODM1Nzk3LjAxRSs1MDAwNjczNjQgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAoreHBvdzM3NyBwb3dlciA1NDc0MDIuMzA4RSs1NzE2ODc2MTcgLTggLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzc3IHJlbWFpbmRlciA1NDc0MDIuMzA4RSs1NzE2ODc2MTcgLTc4MzU3OTcuMDFFKzUwMDA2NzM2NCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjM3NyBzdWJ0cmFjdCA1NDc0MDIuMzA4RSs1NzE2ODc2MTcgLTc4MzU3OTcuMDFFKzUwMDA2NzM2NCAtPiA1LjQ3NDAyMzA4RSs1NzE2ODc2MjIgSW5leGFjdCBSb3VuZGVkCit4YWRkMzc4IGFkZCAtNDEzMTczOC4wOSA3NTc5LjA3NTY2IC0+IC00MTI0MTU5LjAxIEluZXhhY3QgUm91bmRlZAoreGNvbTM3OCBjb21wYXJlIC00MTMxNzM4LjA5IDc1NzkuMDc1NjYgLT4gLTEKK3hkaXYzNzggZGl2aWRlIC00MTMxNzM4LjA5IDc1NzkuMDc1NjYgLT4gLTU0NS4xNTA2NTkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzc4IGRpdmlkZWludCAtNDEzMTczOC4wOSA3NTc5LjA3NTY2IC0+IC01NDUKK3htdWwzNzggbXVsdGlwbHkgLTQxMzE3MzguMDkgNzU3OS4wNzU2NiAtPiAtMy4xMzE0NzU1NkUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93Mzc4IHBvd2VyIC00MTMxNzM4LjA5IDc1NzkgLT4gLTQuNjgxMzI3OTRFKzUwMTQzIEluZXhhY3QgUm91bmRlZAoreHJlbTM3OCByZW1haW5kZXIgLTQxMzE3MzguMDkgNzU3OS4wNzU2NiAtPiAtMTE0MS44NTUzMAoreHN1YjM3OCBzdWJ0cmFjdCAtNDEzMTczOC4wOSA3NTc5LjA3NTY2IC0+IC00MTM5MzE3LjE3IEluZXhhY3QgUm91bmRlZAoreGFkZDM3OSBhZGQgNTA0NTQ0LjY0OCAtNzY3OC45NjEzM0UtNjYyMTQzMjY4IC0+IDUwNDU0NC42NDggSW5leGFjdCBSb3VuZGVkCit4Y29tMzc5IGNvbXBhcmUgNTA0NTQ0LjY0OCAtNzY3OC45NjEzM0UtNjYyMTQzMjY4IC0+IDEKK3hkaXYzNzkgZGl2aWRlIDUwNDU0NC42NDggLTc2NzguOTYxMzNFLTY2MjE0MzI2OCAtPiAtNi41NzA0ODAzOUUrNjYyMTQzMjY5IEluZXhhY3QgUm91bmRlZAoreGR2aTM3OSBkaXZpZGVpbnQgNTA0NTQ0LjY0OCAtNzY3OC45NjEzM0UtNjYyMTQzMjY4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzc5IG11bHRpcGx5IDUwNDU0NC42NDggLTc2NzguOTYxMzNFLTY2MjE0MzI2OCAtPiAtMy44NzQzNzg4NEUtNjYyMTQzMjU5IEluZXhhY3QgUm91bmRlZAoreHBvdzM3OSBwb3dlciA1MDQ1NDQuNjQ4IC04IC0+IDIuMzgxMjQwMDFFLTQ2IEluZXhhY3QgUm91bmRlZAoreHJlbTM3OSByZW1haW5kZXIgNTA0NTQ0LjY0OCAtNzY3OC45NjEzM0UtNjYyMTQzMjY4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzc5IHN1YnRyYWN0IDUwNDU0NC42NDggLTc2NzguOTYxMzNFLTY2MjE0MzI2OCAtPiA1MDQ1NDQuNjQ4IEluZXhhY3QgUm91bmRlZAoreGFkZDM4MCBhZGQgODI5ODk4MjQxIDg5MTIuOTkxMTRFKzkyOTIyODE0OSAtPiA4LjkxMjk5MTE0RSs5MjkyMjgxNTIgSW5leGFjdCBSb3VuZGVkCit4Y29tMzgwIGNvbXBhcmUgODI5ODk4MjQxIDg5MTIuOTkxMTRFKzkyOTIyODE0OSAtPiAtMQoreGRpdjM4MCBkaXZpZGUgODI5ODk4MjQxIDg5MTIuOTkxMTRFKzkyOTIyODE0OSAtPiA5LjMxMTEwODExRS05MjkyMjgxNDUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzgwIGRpdmlkZWludCA4Mjk4OTgyNDEgODkxMi45OTExNEUrOTI5MjI4MTQ5IC0+IDAKK3htdWwzODAgbXVsdGlwbHkgODI5ODk4MjQxIDg5MTIuOTkxMTRFKzkyOTIyODE0OSAtPiA3LjM5Njg3NTY3RSs5MjkyMjgxNjEgSW5leGFjdCBSb3VuZGVkCit4cG93MzgwIHBvd2VyIDgyOTg5ODI0MSA5IC0+IDEuODY3MzQwODRFKzgwIEluZXhhY3QgUm91bmRlZAoreHJlbTM4MCByZW1haW5kZXIgODI5ODk4MjQxIDg5MTIuOTkxMTRFKzkyOTIyODE0OSAtPiA4Mjk4OTgyNDEKK3hzdWIzODAgc3VidHJhY3QgODI5ODk4MjQxIDg5MTIuOTkxMTRFKzkyOTIyODE0OSAtPiAtOC45MTI5OTExNEUrOTI5MjI4MTUyIEluZXhhY3QgUm91bmRlZAoreGFkZDM4MSBhZGQgNTMuNjg5MTY5MSAtMTEuMjM3MTE0MCAtPiA0Mi40NTIwNTUxCit4Y29tMzgxIGNvbXBhcmUgNTMuNjg5MTY5MSAtMTEuMjM3MTE0MCAtPiAxCit4ZGl2MzgxIGRpdmlkZSA1My42ODkxNjkxIC0xMS4yMzcxMTQwIC0+IC00Ljc3Nzg0MzIzIEluZXhhY3QgUm91bmRlZAoreGR2aTM4MSBkaXZpZGVpbnQgNTMuNjg5MTY5MSAtMTEuMjM3MTE0MCAtPiAtNAoreG11bDM4MSBtdWx0aXBseSA1My42ODkxNjkxIC0xMS4yMzcxMTQwIC0+IC02MDMuMzExMzE0IEluZXhhY3QgUm91bmRlZAoreHBvdzM4MSBwb3dlciA1My42ODkxNjkxIC0xMSAtPiA5LjM1OTM2NzI1RS0yMCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zODEgcmVtYWluZGVyIDUzLjY4OTE2OTEgLTExLjIzNzExNDAgLT4gOC43NDA3MTMxCit4c3ViMzgxIHN1YnRyYWN0IDUzLjY4OTE2OTEgLTExLjIzNzExNDAgLT4gNjQuOTI2MjgzMQoreGFkZDM4MiBhZGQgLTkzOTUxODIzLjQgLTI1MzE3Ljg2NDUgLT4gLTkzOTc3MTQxLjMgSW5leGFjdCBSb3VuZGVkCit4Y29tMzgyIGNvbXBhcmUgLTkzOTUxODIzLjQgLTI1MzE3Ljg2NDUgLT4gLTEKK3hkaXYzODIgZGl2aWRlIC05Mzk1MTgyMy40IC0yNTMxNy44NjQ1IC0+IDM3MTAuODkwNTIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzgyIGRpdmlkZWludCAtOTM5NTE4MjMuNCAtMjUzMTcuODY0NSAtPiAzNzEwCit4bXVsMzgyIG11bHRpcGx5IC05Mzk1MTgyMy40IC0yNTMxNy44NjQ1IC0+IDIuMzc4NjU5NTNFKzEyIEluZXhhY3QgUm91bmRlZAoreHBvdzM4MiBwb3dlciAtOTM5NTE4MjMuNCAtMjUzMTggLT4gOS42Nzg1NzcxNEUtMjAxODU5IEluZXhhY3QgUm91bmRlZAoreHJlbTM4MiByZW1haW5kZXIgLTkzOTUxODIzLjQgLTI1MzE3Ljg2NDUgLT4gLTIyNTQ2LjEwNTAKK3hzdWIzODIgc3VidHJhY3QgLTkzOTUxODIzLjQgLTI1MzE3Ljg2NDUgLT4gLTkzOTI2NTA1LjUgSW5leGFjdCBSb3VuZGVkCit4YWRkMzgzIGFkZCA0NDY5MTkuMTIzIDk1MTMzODQ5MC4gLT4gOTUxNzg1NDA5IEluZXhhY3QgUm91bmRlZAoreGNvbTM4MyBjb21wYXJlIDQ0NjkxOS4xMjMgOTUxMzM4NDkwLiAtPiAtMQoreGRpdjM4MyBkaXZpZGUgNDQ2OTE5LjEyMyA5NTEzMzg0OTAuIC0+IDAuMDAwNDY5Nzc5MjkzIEluZXhhY3QgUm91bmRlZAoreGR2aTM4MyBkaXZpZGVpbnQgNDQ2OTE5LjEyMyA5NTEzMzg0OTAuIC0+IDAKK3htdWwzODMgbXVsdGlwbHkgNDQ2OTE5LjEyMyA5NTEzMzg0OTAuIC0+IDQuMjUxNzEzNjRFKzE0IEluZXhhY3QgUm91bmRlZAoreHBvdzM4MyBwb3dlciA0NDY5MTkuMTIzIDk1MTMzODQ5MCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zODMgcmVtYWluZGVyIDQ0NjkxOS4xMjMgOTUxMzM4NDkwLiAtPiA0NDY5MTkuMTIzCit4c3ViMzgzIHN1YnRyYWN0IDQ0NjkxOS4xMjMgOTUxMzM4NDkwLiAtPiAtOTUwODkxNTcxIEluZXhhY3QgUm91bmRlZAoreGFkZDM4NCBhZGQgLTguMDE3ODc3NDggLTg4LjMwNzY4NTIgLT4gLTk2LjMyNTU2MjcgSW5leGFjdCBSb3VuZGVkCit4Y29tMzg0IGNvbXBhcmUgLTguMDE3ODc3NDggLTg4LjMwNzY4NTIgLT4gMQoreGRpdjM4NCBkaXZpZGUgLTguMDE3ODc3NDggLTg4LjMwNzY4NTIgLT4gMC4wOTA3OTQ3ODcxIEluZXhhY3QgUm91bmRlZAoreGR2aTM4NCBkaXZpZGVpbnQgLTguMDE3ODc3NDggLTg4LjMwNzY4NTIgLT4gMAoreG11bDM4NCBtdWx0aXBseSAtOC4wMTc4Nzc0OCAtODguMzA3Njg1MiAtPiA3MDguMDQwMjAwIEluZXhhY3QgUm91bmRlZAoreHBvdzM4NCBwb3dlciAtOC4wMTc4Nzc0OCAtODggLT4gMi43NzE4NjA4OEUtODAgSW5leGFjdCBSb3VuZGVkCit4cmVtMzg0IHJlbWFpbmRlciAtOC4wMTc4Nzc0OCAtODguMzA3Njg1MiAtPiAtOC4wMTc4Nzc0OAoreHN1YjM4NCBzdWJ0cmFjdCAtOC4wMTc4Nzc0OCAtODguMzA3Njg1MiAtPiA4MC4yODk4MDc3IEluZXhhY3QgUm91bmRlZAoreGFkZDM4NSBhZGQgNTE3NDU4MTM5IC05OTk3MzEuNTQ4IC0+IDUxNjQ1ODQwNyBJbmV4YWN0IFJvdW5kZWQKK3hjb20zODUgY29tcGFyZSA1MTc0NTgxMzkgLTk5OTczMS41NDggLT4gMQoreGRpdjM4NSBkaXZpZGUgNTE3NDU4MTM5IC05OTk3MzEuNTQ4IC0+IC01MTcuNTk3MDg5IEluZXhhY3QgUm91bmRlZAoreGR2aTM4NSBkaXZpZGVpbnQgNTE3NDU4MTM5IC05OTk3MzEuNTQ4IC0+IC01MTcKK3htdWwzODUgbXVsdGlwbHkgNTE3NDU4MTM5IC05OTk3MzEuNTQ4IC0+IC01LjE3MzE5MjI2RSsxNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czODUgcG93ZXIgNTE3NDU4MTM5IC05OTk3MzIgLT4gMS4yNDgyMTM0NkUtODcxMTU0MCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zODUgcmVtYWluZGVyIDUxNzQ1ODEzOSAtOTk5NzMxLjU0OCAtPiA1OTY5MjguNjg0Cit4c3ViMzg1IHN1YnRyYWN0IDUxNzQ1ODEzOSAtOTk5NzMxLjU0OCAtPiA1MTg0NTc4NzEgSW5leGFjdCBSb3VuZGVkCit4YWRkMzg2IGFkZCAtNDA1NTQzNDQwIC00MDEzLjE4Mjk1IC0+IC00MDU1NDc0NTMgSW5leGFjdCBSb3VuZGVkCit4Y29tMzg2IGNvbXBhcmUgLTQwNTU0MzQ0MCAtNDAxMy4xODI5NSAtPiAtMQoreGRpdjM4NiBkaXZpZGUgLTQwNTU0MzQ0MCAtNDAxMy4xODI5NSAtPiAxMDEwNTIuODE2IEluZXhhY3QgUm91bmRlZAoreGR2aTM4NiBkaXZpZGVpbnQgLTQwNTU0MzQ0MCAtNDAxMy4xODI5NSAtPiAxMDEwNTIKK3htdWwzODYgbXVsdGlwbHkgLTQwNTU0MzQ0MCAtNDAxMy4xODI5NSAtPiAxLjYyNzUyMDAyRSsxMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3czODYgcG93ZXIgLTQwNTU0MzQ0MCAtNDAxMyAtPiAtOC44MzA2MTkzMkUtMzQ1NDUgSW5leGFjdCBSb3VuZGVkCit4cmVtMzg2IHJlbWFpbmRlciAtNDA1NTQzNDQwIC00MDEzLjE4Mjk1IC0+IC0zMjc2LjUzNjYwCit4c3ViMzg2IHN1YnRyYWN0IC00MDU1NDM0NDAgLTQwMTMuMTgyOTUgLT4gLTQwNTUzOTQyNyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzODcgYWRkIC00OTI0NTI1MC4xRSs2ODI3NjA4MjUgLTg0ODc3Ni42MzcgLT4gLTQuOTI0NTI1MDFFKzY4Mjc2MDgzMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20zODcgY29tcGFyZSAtNDkyNDUyNTAuMUUrNjgyNzYwODI1IC04NDg3NzYuNjM3IC0+IC0xCit4ZGl2Mzg3IGRpdmlkZSAtNDkyNDUyNTAuMUUrNjgyNzYwODI1IC04NDg3NzYuNjM3IC0+IDUuODAxOTA5MjRFKzY4Mjc2MDgyNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzODcgZGl2aWRlaW50IC00OTI0NTI1MC4xRSs2ODI3NjA4MjUgLTg0ODc3Ni42MzcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzODcgbXVsdGlwbHkgLTQ5MjQ1MjUwLjFFKzY4Mjc2MDgyNSAtODQ4Nzc2LjYzNyAtPiA0LjE3OTgyMTc4RSs2ODI3NjA4MzggSW5leGFjdCBSb3VuZGVkCit4cG93Mzg3IHBvd2VyIC00OTI0NTI1MC4xRSs2ODI3NjA4MjUgLTg0ODc3NyAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzg3IHJlbWFpbmRlciAtNDkyNDUyNTAuMUUrNjgyNzYwODI1IC04NDg3NzYuNjM3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzg3IHN1YnRyYWN0IC00OTI0NTI1MC4xRSs2ODI3NjA4MjUgLTg0ODc3Ni42MzcgLT4gLTQuOTI0NTI1MDFFKzY4Mjc2MDgzMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzODggYWRkIC0xNTExNDQ0NTUgLTE3MDM3MS4yOSAtPiAtMTUxMzE0ODI2IEluZXhhY3QgUm91bmRlZAoreGNvbTM4OCBjb21wYXJlIC0xNTExNDQ0NTUgLTE3MDM3MS4yOSAtPiAtMQoreGRpdjM4OCBkaXZpZGUgLTE1MTE0NDQ1NSAtMTcwMzcxLjI5IC0+IDg4Ny4xNDc0NDcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzg4IGRpdmlkZWludCAtMTUxMTQ0NDU1IC0xNzAzNzEuMjkgLT4gODg3Cit4bXVsMzg4IG11bHRpcGx5IC0xNTExNDQ0NTUgLTE3MDM3MS4yOSAtPiAyLjU3NTA2NzU4RSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czODggcG93ZXIgLTE1MTE0NDQ1NSAtMTcwMzcxIC0+IC01Ljg2NDk2MzY5RS0xMzkzNTMyIEluZXhhY3QgUm91bmRlZAoreHJlbTM4OCByZW1haW5kZXIgLTE1MTE0NDQ1NSAtMTcwMzcxLjI5IC0+IC0yNTEyMC43NworeHN1YjM4OCBzdWJ0cmFjdCAtMTUxMTQ0NDU1IC0xNzAzNzEuMjkgLT4gLTE1MDk3NDA4NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzODkgYWRkIC03MjkyMzY3NDYuRSs2NjI3MzcwNjcgOS4xMDgyMzYwMiAtPiAtNy4yOTIzNjc0NkUrNjYyNzM3MDc1IEluZXhhY3QgUm91bmRlZAoreGNvbTM4OSBjb21wYXJlIC03MjkyMzY3NDYuRSs2NjI3MzcwNjcgOS4xMDgyMzYwMiAtPiAtMQoreGRpdjM4OSBkaXZpZGUgLTcyOTIzNjc0Ni5FKzY2MjczNzA2NyA5LjEwODIzNjAyIC0+IC04LjAwNjM0NDQyRSs2NjI3MzcwNzQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzg5IGRpdmlkZWludCAtNzI5MjM2NzQ2LkUrNjYyNzM3MDY3IDkuMTA4MjM2MDIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzODkgbXVsdGlwbHkgLTcyOTIzNjc0Ni5FKzY2MjczNzA2NyA5LjEwODIzNjAyIC0+IC02LjY0MjA2MDQwRSs2NjI3MzcwNzYgSW5leGFjdCBSb3VuZGVkCit4cG93Mzg5IHBvd2VyIC03MjkyMzY3NDYuRSs2NjI3MzcwNjcgOSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMzg5IHJlbWFpbmRlciAtNzI5MjM2NzQ2LkUrNjYyNzM3MDY3IDkuMTA4MjM2MDIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzODkgc3VidHJhY3QgLTcyOTIzNjc0Ni5FKzY2MjczNzA2NyA5LjEwODIzNjAyIC0+IC03LjI5MjM2NzQ2RSs2NjI3MzcwNzUgSW5leGFjdCBSb3VuZGVkCit4YWRkMzkwIGFkZCA1MzQuMzk0NzI5IC0yMzY5ODM5LjM3IC0+IC0yMzY5MzA0Ljk4IEluZXhhY3QgUm91bmRlZAoreGNvbTM5MCBjb21wYXJlIDUzNC4zOTQ3MjkgLTIzNjk4MzkuMzcgLT4gMQoreGRpdjM5MCBkaXZpZGUgNTM0LjM5NDcyOSAtMjM2OTgzOS4zNyAtPiAtMC4wMDAyMjU0OTgyOTEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzkwIGRpdmlkZWludCA1MzQuMzk0NzI5IC0yMzY5ODM5LjM3IC0+IC0wCit4bXVsMzkwIG11bHRpcGx5IDUzNC4zOTQ3MjkgLTIzNjk4MzkuMzcgLT4gLTEuMjY2NDI5NjdFKzkgSW5leGFjdCBSb3VuZGVkCit4cG93MzkwIHBvd2VyIDUzNC4zOTQ3MjkgLTIzNjk4MzkgLT4gNy4xMjUyMjg5NkUtNjQ2NDU5NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zOTAgcmVtYWluZGVyIDUzNC4zOTQ3MjkgLTIzNjk4MzkuMzcgLT4gNTM0LjM5NDcyOQoreHN1YjM5MCBzdWJ0cmFjdCA1MzQuMzk0NzI5IC0yMzY5ODM5LjM3IC0+IDIzNzAzNzMuNzYgSW5leGFjdCBSb3VuZGVkCit4YWRkMzkxIGFkZCA4OTEwMC4xNzk3IDIyNC4zNzAzMDkgLT4gODkzMjQuNTUwMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zOTEgY29tcGFyZSA4OTEwMC4xNzk3IDIyNC4zNzAzMDkgLT4gMQoreGRpdjM5MSBkaXZpZGUgODkxMDAuMTc5NyAyMjQuMzcwMzA5IC0+IDM5Ny4xMTIxNjcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzkxIGRpdmlkZWludCA4OTEwMC4xNzk3IDIyNC4zNzAzMDkgLT4gMzk3Cit4bXVsMzkxIG11bHRpcGx5IDg5MTAwLjE3OTcgMjI0LjM3MDMwOSAtPiAxOTk5MTQzNC45IEluZXhhY3QgUm91bmRlZAoreHBvdzM5MSBwb3dlciA4OTEwMC4xNzk3IDIyNCAtPiA1LjkyNjU0OTM2RSsxMTA4IEluZXhhY3QgUm91bmRlZAoreHJlbTM5MSByZW1haW5kZXIgODkxMDAuMTc5NyAyMjQuMzcwMzA5IC0+IDI1LjE2NzAyNworeHN1YjM5MSBzdWJ0cmFjdCA4OTEwMC4xNzk3IDIyNC4zNzAzMDkgLT4gODg4NzUuODA5NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzOTIgYWRkIC04MjEzNzcuNzc3IDM4LjU1MjgyMSAtPiAtODIxMzM5LjIyNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zOTIgY29tcGFyZSAtODIxMzc3Ljc3NyAzOC41NTI4MjEgLT4gLTEKK3hkaXYzOTIgZGl2aWRlIC04MjEzNzcuNzc3IDM4LjU1MjgyMSAtPiAtMjEzMDUuMjU3NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzOTIgZGl2aWRlaW50IC04MjEzNzcuNzc3IDM4LjU1MjgyMSAtPiAtMjEzMDUKK3htdWwzOTIgbXVsdGlwbHkgLTgyMTM3Ny43NzcgMzguNTUyODIxIC0+IC0zMTY2NjQzMC40IEluZXhhY3QgUm91bmRlZAoreHBvdzM5MiBwb3dlciAtODIxMzc3Ljc3NyAzOSAtPiAtNC42NDcwMjQ4MkUrMjMwIEluZXhhY3QgUm91bmRlZAoreHJlbTM5MiByZW1haW5kZXIgLTgyMTM3Ny43NzcgMzguNTUyODIxIC0+IC05LjkyNTU5NQoreHN1YjM5MiBzdWJ0cmFjdCAtODIxMzc3Ljc3NyAzOC41NTI4MjEgLT4gLTgyMTQxNi4zMzAgSW5leGFjdCBSb3VuZGVkCit4YWRkMzkzIGFkZCAtMzkyNjQwLjc4MiAtMjU3MTYxOS41RSsxMTMyMzc4NjUgLT4gLTIuNTcxNjE5NTBFKzExMzIzNzg3MSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zOTMgY29tcGFyZSAtMzkyNjQwLjc4MiAtMjU3MTYxOS41RSsxMTMyMzc4NjUgLT4gMQoreGRpdjM5MyBkaXZpZGUgLTM5MjY0MC43ODIgLTI1NzE2MTkuNUUrMTEzMjM3ODY1IC0+IDEuNTI2ODIzMDFFLTExMzIzNzg2NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzOTMgZGl2aWRlaW50IC0zOTI2NDAuNzgyIC0yNTcxNjE5LjVFKzExMzIzNzg2NSAtPiAwCit4bXVsMzkzIG11bHRpcGx5IC0zOTI2NDAuNzgyIC0yNTcxNjE5LjVFKzExMzIzNzg2NSAtPiAxLjAwOTcyMjY5RSsxMTMyMzc4NzcgSW5leGFjdCBSb3VuZGVkCit4cG93MzkzIHBvd2VyIC0zOTI2NDAuNzgyIC0zIC0+IC0xLjY1MjAxNDIyRS0xNyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zOTMgcmVtYWluZGVyIC0zOTI2NDAuNzgyIC0yNTcxNjE5LjVFKzExMzIzNzg2NSAtPiAtMzkyNjQwLjc4MgoreHN1YjM5MyBzdWJ0cmFjdCAtMzkyNjQwLjc4MiAtMjU3MTYxOS41RSsxMTMyMzc4NjUgLT4gMi41NzE2MTk1MEUrMTEzMjM3ODcxIEluZXhhY3QgUm91bmRlZAoreGFkZDM5NCBhZGQgLTY1MTM5Ny43MTIgLTcyMy41OTY3MyAtPiAtNjUyMTIxLjMwOSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zOTQgY29tcGFyZSAtNjUxMzk3LjcxMiAtNzIzLjU5NjczIC0+IC0xCit4ZGl2Mzk0IGRpdmlkZSAtNjUxMzk3LjcxMiAtNzIzLjU5NjczIC0+IDkwMC4yMjIwMjMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzk0IGRpdmlkZWludCAtNjUxMzk3LjcxMiAtNzIzLjU5NjczIC0+IDkwMAoreG11bDM5NCBtdWx0aXBseSAtNjUxMzk3LjcxMiAtNzIzLjU5NjczIC0+IDQ3MTM0OTI1NCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czOTQgcG93ZXIgLTY1MTM5Ny43MTIgLTcyNCAtPiA1Ljk2MTE1NDE1RS00MjEwIEluZXhhY3QgUm91bmRlZAoreHJlbTM5NCByZW1haW5kZXIgLTY1MTM5Ny43MTIgLTcyMy41OTY3MyAtPiAtMTYwLjY1NTAwCit4c3ViMzk0IHN1YnRyYWN0IC02NTEzOTcuNzEyIC03MjMuNTk2NzMgLT4gLTY1MDY3NC4xMTUgSW5leGFjdCBSb3VuZGVkCit4YWRkMzk1IGFkZCA4Ni42ODkwODkyIDk0MDM4MDg2NCAtPiA5NDAzODA5NTEgSW5leGFjdCBSb3VuZGVkCit4Y29tMzk1IGNvbXBhcmUgODYuNjg5MDg5MiA5NDAzODA4NjQgLT4gLTEKK3hkaXYzOTUgZGl2aWRlIDg2LjY4OTA4OTIgOTQwMzgwODY0IC0+IDkuMjE4NTA4NDNFLTggSW5leGFjdCBSb3VuZGVkCit4ZHZpMzk1IGRpdmlkZWludCA4Ni42ODkwODkyIDk0MDM4MDg2NCAtPiAwCit4bXVsMzk1IG11bHRpcGx5IDg2LjY4OTA4OTIgOTQwMzgwODY0IC0+IDguMTUyMDc2MDZFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzM5NSBwb3dlciA4Ni42ODkwODkyIDk0MDM4MDg2NCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zOTUgcmVtYWluZGVyIDg2LjY4OTA4OTIgOTQwMzgwODY0IC0+IDg2LjY4OTA4OTIKK3hzdWIzOTUgc3VidHJhY3QgODYuNjg5MDg5MiA5NDAzODA4NjQgLT4gLTk0MDM4MDc3NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzOTYgYWRkIDQ4ODAuMDY0NDJFLTM4MjIyMjYyMSAtMTE1NjI3MjM5RS05MTI4MzQwMzEgLT4gNC44ODAwNjQ0MkUtMzgyMjIyNjE4IEluZXhhY3QgUm91bmRlZAoreGNvbTM5NiBjb21wYXJlIDQ4ODAuMDY0NDJFLTM4MjIyMjYyMSAtMTE1NjI3MjM5RS05MTI4MzQwMzEgLT4gMQoreGRpdjM5NiBkaXZpZGUgNDg4MC4wNjQ0MkUtMzgyMjIyNjIxIC0xMTU2MjcyMzlFLTkxMjgzNDAzMSAtPiAtNC4yMjA1MTQ1M0UrNTMwNjExNDA1IEluZXhhY3QgUm91bmRlZAoreGR2aTM5NiBkaXZpZGVpbnQgNDg4MC4wNjQ0MkUtMzgyMjIyNjIxIC0xMTU2MjcyMzlFLTkxMjgzNDAzMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDM5NiBtdWx0aXBseSA0ODgwLjA2NDQyRS0zODIyMjI2MjEgLTExNTYyNzIzOUUtOTEyODM0MDMxIC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hwb3czOTYgcG93ZXIgNDg4MC4wNjQ0MkUtMzgyMjIyNjIxIC0xIC0+IDIuMDQ5MTUzMjhFKzM4MjIyMjYxNyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zOTYgcmVtYWluZGVyIDQ4ODAuMDY0NDJFLTM4MjIyMjYyMSAtMTE1NjI3MjM5RS05MTI4MzQwMzEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzOTYgc3VidHJhY3QgNDg4MC4wNjQ0MkUtMzgyMjIyNjIxIC0xMTU2MjcyMzlFLTkxMjgzNDAzMSAtPiA0Ljg4MDA2NDQyRS0zODIyMjI2MTggSW5leGFjdCBSb3VuZGVkCit4YWRkMzk3IGFkZCAxNzMzOTgyNjVFLTUzMjM4MzE1OCAzNDYyLjUxNDUwRSs4MDk4NjkxNSAtPiAzLjQ2MjUxNDUwRSs4MDk4NjkxOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zOTcgY29tcGFyZSAxNzMzOTgyNjVFLTUzMjM4MzE1OCAzNDYyLjUxNDUwRSs4MDk4NjkxNSAtPiAtMQoreGRpdjM5NyBkaXZpZGUgMTczMzk4MjY1RS01MzIzODMxNTggMzQ2Mi41MTQ1MEUrODA5ODY5MTUgLT4gNS4wMDc4NzExNkUtNjEzMzcwMDY5IEluZXhhY3QgUm91bmRlZAoreGR2aTM5NyBkaXZpZGVpbnQgMTczMzk4MjY1RS01MzIzODMxNTggMzQ2Mi41MTQ1MEUrODA5ODY5MTUgLT4gMAoreG11bDM5NyBtdWx0aXBseSAxNzMzOTgyNjVFLTUzMjM4MzE1OCAzNDYyLjUxNDUwRSs4MDk4NjkxNSAtPiA2LjAwMzk0MDA3RS00NTEzOTYyMzIgSW5leGFjdCBSb3VuZGVkCit4cG93Mzk3IHBvd2VyIDE3MzM5ODI2NUUtNTMyMzgzMTU4IDMgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzk3IHJlbWFpbmRlciAxNzMzOTgyNjVFLTUzMjM4MzE1OCAzNDYyLjUxNDUwRSs4MDk4NjkxNSAtPiAxLjczMzk4MjY1RS01MzIzODMxNTAKK3hzdWIzOTcgc3VidHJhY3QgMTczMzk4MjY1RS01MzIzODMxNTggMzQ2Mi41MTQ1MEUrODA5ODY5MTUgLT4gLTMuNDYyNTE0NTBFKzgwOTg2OTE4IEluZXhhY3QgUm91bmRlZAoreGFkZDM5OCBhZGQgLTE1MjIxNzYuNzggLTY2MzEwNjEuNzcgLT4gLTgxNTMyMzguNTUKK3hjb20zOTggY29tcGFyZSAtMTUyMjE3Ni43OCAtNjYzMTA2MS43NyAtPiAxCit4ZGl2Mzk4IGRpdmlkZSAtMTUyMjE3Ni43OCAtNjYzMTA2MS43NyAtPiAwLjIyOTU1MjQ5NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzOTggZGl2aWRlaW50IC0xNTIyMTc2Ljc4IC02NjMxMDYxLjc3IC0+IDAKK3htdWwzOTggbXVsdGlwbHkgLTE1MjIxNzYuNzggLTY2MzEwNjEuNzcgLT4gMS4wMDkzNjQ4M0UrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93Mzk4IHBvd2VyIC0xNTIyMTc2Ljc4IC02NjMxMDYyIC0+IDQuNTQyNjg4NTRFLTQwOTk2MzEwIEluZXhhY3QgUm91bmRlZAoreHJlbTM5OCByZW1haW5kZXIgLTE1MjIxNzYuNzggLTY2MzEwNjEuNzcgLT4gLTE1MjIxNzYuNzgKK3hzdWIzOTggc3VidHJhY3QgLTE1MjIxNzYuNzggLTY2MzEwNjEuNzcgLT4gNTEwODg4NC45OQoreGFkZDM5OSBhZGQgNTM4LjEwNDUzIDUyMjkzNDMxMCAtPiA1MjI5MzQ4NDggSW5leGFjdCBSb3VuZGVkCit4Y29tMzk5IGNvbXBhcmUgNTM4LjEwNDUzIDUyMjkzNDMxMCAtPiAtMQoreGRpdjM5OSBkaXZpZGUgNTM4LjEwNDUzIDUyMjkzNDMxMCAtPiAwLjAwMDAwMTAyOTAwOTgwIEluZXhhY3QgUm91bmRlZAoreGR2aTM5OSBkaXZpZGVpbnQgNTM4LjEwNDUzIDUyMjkzNDMxMCAtPiAwCit4bXVsMzk5IG11bHRpcGx5IDUzOC4xMDQ1MyA1MjI5MzQzMTAgLT4gMi44MTM5MzMyMUUrMTEgSW5leGFjdCBSb3VuZGVkCit4cG93Mzk5IHBvd2VyIDUzOC4xMDQ1MyA1MjI5MzQzMTAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMzk5IHJlbWFpbmRlciA1MzguMTA0NTMgNTIyOTM0MzEwIC0+IDUzOC4xMDQ1MworeHN1YjM5OSBzdWJ0cmFjdCA1MzguMTA0NTMgNTIyOTM0MzEwIC0+IC01MjI5MzM3NzIgSW5leGFjdCBSb3VuZGVkCit4YWRkNDAwIGFkZCA4ODAyNDMuNDQ0RS03NTA5NDA5NzcgLTM1NC42MDE1NzhFLTIwNDk0Mzc0MCAtPiAtMy41NDYwMTU3OEUtMjA0OTQzNzM4IEluZXhhY3QgUm91bmRlZAoreGNvbTQwMCBjb21wYXJlIDg4MDI0My40NDRFLTc1MDk0MDk3NyAtMzU0LjYwMTU3OEUtMjA0OTQzNzQwIC0+IDEKK3hkaXY0MDAgZGl2aWRlIDg4MDI0My40NDRFLTc1MDk0MDk3NyAtMzU0LjYwMTU3OEUtMjA0OTQzNzQwIC0+IC0yLjQ4MjM0NDk3RS01NDU5OTcyMzQgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDAwIGRpdmlkZWludCA4ODAyNDMuNDQ0RS03NTA5NDA5NzcgLTM1NC42MDE1NzhFLTIwNDk0Mzc0MCAtPiAtMAoreG11bDQwMCBtdWx0aXBseSA4ODAyNDMuNDQ0RS03NTA5NDA5NzcgLTM1NC42MDE1NzhFLTIwNDk0Mzc0MCAtPiAtMy4xMjEzNTcxNEUtOTU1ODg0NzA5IEluZXhhY3QgUm91bmRlZAoreHBvdzQwMCBwb3dlciA4ODAyNDMuNDQ0RS03NTA5NDA5NzcgLTQgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtNDAwIHJlbWFpbmRlciA4ODAyNDMuNDQ0RS03NTA5NDA5NzcgLTM1NC42MDE1NzhFLTIwNDk0Mzc0MCAtPiA4LjgwMjQzNDQ0RS03NTA5NDA5NzIKK3hzdWI0MDAgc3VidHJhY3QgODgwMjQzLjQ0NEUtNzUwOTQwOTc3IC0zNTQuNjAxNTc4RS0yMDQ5NDM3NDAgLT4gMy41NDYwMTU3OEUtMjA0OTQzNzM4IEluZXhhY3QgUm91bmRlZAoreGFkZDQwMSBhZGQgOTY4MzcwLjc4MCA2Njc3MjY4LjczIC0+IDc2NDU2MzkuNTEgUm91bmRlZAoreGNvbTQwMSBjb21wYXJlIDk2ODM3MC43ODAgNjY3NzI2OC43MyAtPiAtMQoreGRpdjQwMSBkaXZpZGUgOTY4MzcwLjc4MCA2Njc3MjY4LjczIC0+IDAuMTQ1MDI0OTgyIEluZXhhY3QgUm91bmRlZAoreGR2aTQwMSBkaXZpZGVpbnQgOTY4MzcwLjc4MCA2Njc3MjY4LjczIC0+IDAKK3htdWw0MDEgbXVsdGlwbHkgOTY4MzcwLjc4MCA2Njc3MjY4LjczIC0+IDYuNDY2MDcxOTNFKzEyIEluZXhhY3QgUm91bmRlZAoreHBvdzQwMSBwb3dlciA5NjgzNzAuNzgwIDY2NzcyNjkgLT4gMy4yOTk5MDkzMUUrMzk5NzA0MTAgSW5leGFjdCBSb3VuZGVkCit4cmVtNDAxIHJlbWFpbmRlciA5NjgzNzAuNzgwIDY2NzcyNjguNzMgLT4gOTY4MzcwLjc4MAoreHN1YjQwMSBzdWJ0cmFjdCA5NjgzNzAuNzgwIDY2NzcyNjguNzMgLT4gLTU3MDg4OTcuOTUgUm91bmRlZAoreGFkZDQwMiBhZGQgLTk3Ljc0NzQ5NDUgMzEyNDgyNDEuNSAtPiAzMTI0ODE0My44IEluZXhhY3QgUm91bmRlZAoreGNvbTQwMiBjb21wYXJlIC05Ny43NDc0OTQ1IDMxMjQ4MjQxLjUgLT4gLTEKK3hkaXY0MDIgZGl2aWRlIC05Ny43NDc0OTQ1IDMxMjQ4MjQxLjUgLT4gLTAuMDAwMDAzMTI4MDk1ODUgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDAyIGRpdmlkZWludCAtOTcuNzQ3NDk0NSAzMTI0ODI0MS41IC0+IC0wCit4bXVsNDAyIG11bHRpcGx5IC05Ny43NDc0OTQ1IDMxMjQ4MjQxLjUgLT4gLTMuMDU0NDM3MzFFKzkgSW5leGFjdCBSb3VuZGVkCit4cG93NDAyIHBvd2VyIC05Ny43NDc0OTQ1IDMxMjQ4MjQyIC0+IDIuOTA3MTQyNTdFKzYyMTg3MzAyIEluZXhhY3QgUm91bmRlZAoreHJlbTQwMiByZW1haW5kZXIgLTk3Ljc0NzQ5NDUgMzEyNDgyNDEuNSAtPiAtOTcuNzQ3NDk0NQoreHN1YjQwMiBzdWJ0cmFjdCAtOTcuNzQ3NDk0NSAzMTI0ODI0MS41IC0+IC0zMTI0ODMzOS4yIEluZXhhY3QgUm91bmRlZAoreGFkZDQwMyBhZGQgLTE4NzU4Mjc4Ni5FKzM2OTkxNjk1MiA5NTc4NDA0MzVFKzc0NDM2NTU2NyAtPiA5LjU3ODQwNDM1RSs3NDQzNjU1NzUgSW5leGFjdCBSb3VuZGVkCit4Y29tNDAzIGNvbXBhcmUgLTE4NzU4Mjc4Ni5FKzM2OTkxNjk1MiA5NTc4NDA0MzVFKzc0NDM2NTU2NyAtPiAtMQoreGRpdjQwMyBkaXZpZGUgLTE4NzU4Mjc4Ni5FKzM2OTkxNjk1MiA5NTc4NDA0MzVFKzc0NDM2NTU2NyAtPiAtMS45NTgzOTI4NUUtMzc0NDQ4NjE2IEluZXhhY3QgUm91bmRlZAoreGR2aTQwMyBkaXZpZGVpbnQgLTE4NzU4Mjc4Ni5FKzM2OTkxNjk1MiA5NTc4NDA0MzVFKzc0NDM2NTU2NyAtPiAtMAoreG11bDQwMyBtdWx0aXBseSAtMTg3NTgyNzg2LkUrMzY5OTE2OTUyIDk1Nzg0MDQzNUUrNzQ0MzY1NTY3IC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3hwb3c0MDMgcG93ZXIgLTE4NzU4Mjc4Ni5FKzM2OTkxNjk1MiAxMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MDMgcmVtYWluZGVyIC0xODc1ODI3ODYuRSszNjk5MTY5NTIgOTU3ODQwNDM1RSs3NDQzNjU1NjcgLT4gLTEuODc1ODI3ODZFKzM2OTkxNjk2MAoreHN1YjQwMyBzdWJ0cmFjdCAtMTg3NTgyNzg2LkUrMzY5OTE2OTUyIDk1Nzg0MDQzNUUrNzQ0MzY1NTY3IC0+IC05LjU3ODQwNDM1RSs3NDQzNjU1NzUgSW5leGFjdCBSb3VuZGVkCit4YWRkNDA0IGFkZCAtMzI4MDI2MTQ0LiAtMTI1NDk5NzM1LiAtPiAtNDUzNTI1ODc5Cit4Y29tNDA0IGNvbXBhcmUgLTMyODAyNjE0NC4gLTEyNTQ5OTczNS4gLT4gLTEKK3hkaXY0MDQgZGl2aWRlIC0zMjgwMjYxNDQuIC0xMjU0OTk3MzUuIC0+IDIuNjEzNzU5NjUgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDA0IGRpdmlkZWludCAtMzI4MDI2MTQ0LiAtMTI1NDk5NzM1LiAtPiAyCit4bXVsNDA0IG11bHRpcGx5IC0zMjgwMjYxNDQuIC0xMjU0OTk3MzUuIC0+IDQuMTE2NzE5NDFFKzE2IEluZXhhY3QgUm91bmRlZAoreHBvdzQwNCBwb3dlciAtMzI4MDI2MTQ0LiAtMTI1NDk5NzM1IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00MDQgcmVtYWluZGVyIC0zMjgwMjYxNDQuIC0xMjU0OTk3MzUuIC0+IC03NzAyNjY3NAoreHN1YjQwNCBzdWJ0cmFjdCAtMzI4MDI2MTQ0LiAtMTI1NDk5NzM1LiAtPiAtMjAyNTI2NDA5Cit4YWRkNDA1IGFkZCAtOTk0MjQxNTAuMkUtNTIzNjYyMTAyIDM3MTIuMzUwMzAgLT4gMzcxMi4zNTAzMCBJbmV4YWN0IFJvdW5kZWQKK3hjb200MDUgY29tcGFyZSAtOTk0MjQxNTAuMkUtNTIzNjYyMTAyIDM3MTIuMzUwMzAgLT4gLTEKK3hkaXY0MDUgZGl2aWRlIC05OTQyNDE1MC4yRS01MjM2NjIxMDIgMzcxMi4zNTAzMCAtPiAtMi42NzgxOTk1OEUtNTIzNjYyMDk4IEluZXhhY3QgUm91bmRlZAoreGR2aTQwNSBkaXZpZGVpbnQgLTk5NDI0MTUwLjJFLTUyMzY2MjEwMiAzNzEyLjM1MDMwIC0+IC0wCit4bXVsNDA1IG11bHRpcGx5IC05OTQyNDE1MC4yRS01MjM2NjIxMDIgMzcxMi4zNTAzMCAtPiAtMy42OTA5NzI3NEUtNTIzNjYyMDkxIEluZXhhY3QgUm91bmRlZAoreHBvdzQwNSBwb3dlciAtOTk0MjQxNTAuMkUtNTIzNjYyMTAyIDM3MTIgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDA1IHJlbWFpbmRlciAtOTk0MjQxNTAuMkUtNTIzNjYyMTAyIDM3MTIuMzUwMzAgLT4gLTkuOTQyNDE1MDJFLTUyMzY2MjA5NQoreHN1YjQwNSBzdWJ0cmFjdCAtOTk0MjQxNTAuMkUtNTIzNjYyMTAyIDM3MTIuMzUwMzAgLT4gLTM3MTIuMzUwMzAgSW5leGFjdCBSb3VuZGVkCit4YWRkNDA2IGFkZCAxNDgzOC4wNzE4IDk0ODk4OTMuMjhFKzgzMDYzMTI2NiAtPiA5LjQ4OTg5MzI4RSs4MzA2MzEyNzIgSW5leGFjdCBSb3VuZGVkCit4Y29tNDA2IGNvbXBhcmUgMTQ4MzguMDcxOCA5NDg5ODkzLjI4RSs4MzA2MzEyNjYgLT4gLTEKK3hkaXY0MDYgZGl2aWRlIDE0ODM4LjA3MTggOTQ4OTg5My4yOEUrODMwNjMxMjY2IC0+IDEuNTYzNTY1NzJFLTgzMDYzMTI2OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MDYgZGl2aWRlaW50IDE0ODM4LjA3MTggOTQ4OTg5My4yOEUrODMwNjMxMjY2IC0+IDAKK3htdWw0MDYgbXVsdGlwbHkgMTQ4MzguMDcxOCA5NDg5ODkzLjI4RSs4MzA2MzEyNjYgLT4gMS40MDgxMTcxOEUrODMwNjMxMjc3IEluZXhhY3QgUm91bmRlZAoreHBvdzQwNiBwb3dlciAxNDgzOC4wNzE4IDkgLT4gMy40ODY1NjA1N0UrMzcgSW5leGFjdCBSb3VuZGVkCit4cmVtNDA2IHJlbWFpbmRlciAxNDgzOC4wNzE4IDk0ODk4OTMuMjhFKzgzMDYzMTI2NiAtPiAxNDgzOC4wNzE4Cit4c3ViNDA2IHN1YnRyYWN0IDE0ODM4LjA3MTggOTQ4OTg5My4yOEUrODMwNjMxMjY2IC0+IC05LjQ4OTg5MzI4RSs4MzA2MzEyNzIgSW5leGFjdCBSb3VuZGVkCit4YWRkNDA3IGFkZCA3MTIwNzQ3Mi44IC0zMTgzNS4wODA5IC0+IDcxMTc1NjM3LjcgSW5leGFjdCBSb3VuZGVkCit4Y29tNDA3IGNvbXBhcmUgNzEyMDc0NzIuOCAtMzE4MzUuMDgwOSAtPiAxCit4ZGl2NDA3IGRpdmlkZSA3MTIwNzQ3Mi44IC0zMTgzNS4wODA5IC0+IC0yMjM2Ljc2MTE3IEluZXhhY3QgUm91bmRlZAoreGR2aTQwNyBkaXZpZGVpbnQgNzEyMDc0NzIuOCAtMzE4MzUuMDgwOSAtPiAtMjIzNgoreG11bDQwNyBtdWx0aXBseSA3MTIwNzQ3Mi44IC0zMTgzNS4wODA5IC0+IC0yLjI2Njg5NTY2RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MDcgcG93ZXIgNzEyMDc0NzIuOCAtMzE4MzUgLT4gNy4wNTMzMzk1M0UtMjQ5OTg2IEluZXhhY3QgUm91bmRlZAoreHJlbTQwNyByZW1haW5kZXIgNzEyMDc0NzIuOCAtMzE4MzUuMDgwOSAtPiAyNDIzMS45MDc2Cit4c3ViNDA3IHN1YnRyYWN0IDcxMjA3NDcyLjggLTMxODM1LjA4MDkgLT4gNzEyMzkzMDcuOSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MDggYWRkIC0yMDQ0MC40Mzk0IC00NC40MDY0MzI4RSs1MTEwODU4MDYgLT4gLTQuNDQwNjQzMjhFKzUxMTA4NTgwNyBJbmV4YWN0IFJvdW5kZWQKK3hjb200MDggY29tcGFyZSAtMjA0NDAuNDM5NCAtNDQuNDA2NDMyOEUrNTExMDg1ODA2IC0+IDEKK3hkaXY0MDggZGl2aWRlIC0yMDQ0MC40Mzk0IC00NC40MDY0MzI4RSs1MTEwODU4MDYgLT4gNC42MDMwMzU2N0UtNTExMDg1ODA0IEluZXhhY3QgUm91bmRlZAoreGR2aTQwOCBkaXZpZGVpbnQgLTIwNDQwLjQzOTQgLTQ0LjQwNjQzMjhFKzUxMTA4NTgwNiAtPiAwCit4bXVsNDA4IG11bHRpcGx5IC0yMDQ0MC40Mzk0IC00NC40MDY0MzI4RSs1MTEwODU4MDYgLT4gOS4wNzY4Njk5OUUrNTExMDg1ODExIEluZXhhY3QgUm91bmRlZAoreHBvdzQwOCBwb3dlciAtMjA0NDAuNDM5NCAtNCAtPiA1LjcyODQ3NTkwRS0xOCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MDggcmVtYWluZGVyIC0yMDQ0MC40Mzk0IC00NC40MDY0MzI4RSs1MTEwODU4MDYgLT4gLTIwNDQwLjQzOTQKK3hzdWI0MDggc3VidHJhY3QgLTIwNDQwLjQzOTQgLTQ0LjQwNjQzMjhFKzUxMTA4NTgwNiAtPiA0LjQ0MDY0MzI4RSs1MTEwODU4MDcgSW5leGFjdCBSb3VuZGVkCit4YWRkNDA5IGFkZCAtNTQuMzY4NDE3MUUtODA3MjEwMTkyIDEuMDQ1OTI5NzNFLTk4NDA0MTgwNyAtPiAtNS40MzY4NDE3MUUtODA3MjEwMTkxIEluZXhhY3QgUm91bmRlZAoreGNvbTQwOSBjb21wYXJlIC01NC4zNjg0MTcxRS04MDcyMTAxOTIgMS4wNDU5Mjk3M0UtOTg0MDQxODA3IC0+IC0xCit4ZGl2NDA5IGRpdmlkZSAtNTQuMzY4NDE3MUUtODA3MjEwMTkyIDEuMDQ1OTI5NzNFLTk4NDA0MTgwNyAtPiAtNS4xOTgwOTQ2M0UrMTc2ODMxNjE2IEluZXhhY3QgUm91bmRlZAoreGR2aTQwOSBkaXZpZGVpbnQgLTU0LjM2ODQxNzFFLTgwNzIxMDE5MiAxLjA0NTkyOTczRS05ODQwNDE4MDcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0MDkgbXVsdGlwbHkgLTU0LjM2ODQxNzFFLTgwNzIxMDE5MiAxLjA0NTkyOTczRS05ODQwNDE4MDcgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHBvdzQwOSBwb3dlciAtNTQuMzY4NDE3MUUtODA3MjEwMTkyIDEgLT4gLTUuNDM2ODQxNzFFLTgwNzIxMDE5MQoreHJlbTQwOSByZW1haW5kZXIgLTU0LjM2ODQxNzFFLTgwNzIxMDE5MiAxLjA0NTkyOTczRS05ODQwNDE4MDcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0MDkgc3VidHJhY3QgLTU0LjM2ODQxNzFFLTgwNzIxMDE5MiAxLjA0NTkyOTczRS05ODQwNDE4MDcgLT4gLTUuNDM2ODQxNzFFLTgwNzIxMDE5MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MTAgYWRkIDU0MzEwMDYwLjVFKzk0ODE1OTczOSAyNzQzMjA3MDEuRSsyMDU4ODA0ODQgLT4gNS40MzEwMDYwNUUrOTQ4MTU5NzQ2IEluZXhhY3QgUm91bmRlZAoreGNvbTQxMCBjb21wYXJlIDU0MzEwMDYwLjVFKzk0ODE1OTczOSAyNzQzMjA3MDEuRSsyMDU4ODA0ODQgLT4gMQoreGRpdjQxMCBkaXZpZGUgNTQzMTAwNjAuNUUrOTQ4MTU5NzM5IDI3NDMyMDcwMS5FKzIwNTg4MDQ4NCAtPiAxLjk3OTgwMTc1RSs3NDIyNzkyNTQgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDEwIGRpdmlkZWludCA1NDMxMDA2MC41RSs5NDgxNTk3MzkgMjc0MzIwNzAxLkUrMjA1ODgwNDg0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDEwIG11bHRpcGx5IDU0MzEwMDYwLjVFKzk0ODE1OTczOSAyNzQzMjA3MDEuRSsyMDU4ODA0ODQgLT4gSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCit4cG93NDEwIHBvd2VyIDU0MzEwMDYwLjVFKzk0ODE1OTczOSAzIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTQxMCByZW1haW5kZXIgNTQzMTAwNjAuNUUrOTQ4MTU5NzM5IDI3NDMyMDcwMS5FKzIwNTg4MDQ4NCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQxMCBzdWJ0cmFjdCA1NDMxMDA2MC41RSs5NDgxNTk3MzkgMjc0MzIwNzAxLkUrMjA1ODgwNDg0IC0+IDUuNDMxMDA2MDVFKzk0ODE1OTc0NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MTEgYWRkIC02NTcuMTg2NzAyIDQyNjg0NC4zOSAtPiA0MjYxODcuMjAzIEluZXhhY3QgUm91bmRlZAoreGNvbTQxMSBjb21wYXJlIC02NTcuMTg2NzAyIDQyNjg0NC4zOSAtPiAtMQoreGRpdjQxMSBkaXZpZGUgLTY1Ny4xODY3MDIgNDI2ODQ0LjM5IC0+IC0wLjAwMTUzOTY0MDAxIEluZXhhY3QgUm91bmRlZAoreGR2aTQxMSBkaXZpZGVpbnQgLTY1Ny4xODY3MDIgNDI2ODQ0LjM5IC0+IC0wCit4bXVsNDExIG11bHRpcGx5IC02NTcuMTg2NzAyIDQyNjg0NC4zOSAtPiAtMjgwNTE2NDU3IEluZXhhY3QgUm91bmRlZAoreHBvdzQxMSBwb3dlciAtNjU3LjE4NjcwMiA0MjY4NDQgLT4gMy41MDAwMDU3NUUrMTIwMjcxMyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MTEgcmVtYWluZGVyIC02NTcuMTg2NzAyIDQyNjg0NC4zOSAtPiAtNjU3LjE4NjcwMgoreHN1YjQxMSBzdWJ0cmFjdCAtNjU3LjE4NjcwMiA0MjY4NDQuMzkgLT4gLTQyNzUwMS41NzcgSW5leGFjdCBSb3VuZGVkCit4YWRkNDEyIGFkZCAtNDE1OTMwNzcuMCAtNjg4NjA3LjU2NCAtPiAtNDIyODE2ODQuNiBJbmV4YWN0IFJvdW5kZWQKK3hjb200MTIgY29tcGFyZSAtNDE1OTMwNzcuMCAtNjg4NjA3LjU2NCAtPiAtMQoreGRpdjQxMiBkaXZpZGUgLTQxNTkzMDc3LjAgLTY4ODYwNy41NjQgLT4gNjAuNDAxNzEzOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MTIgZGl2aWRlaW50IC00MTU5MzA3Ny4wIC02ODg2MDcuNTY0IC0+IDYwCit4bXVsNDEyIG11bHRpcGx5IC00MTU5MzA3Ny4wIC02ODg2MDcuNTY0IC0+IDIuODY0MTMwNzRFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzQxMiBwb3dlciAtNDE1OTMwNzcuMCAtNjg4NjA4IC0+IDEuNDIxNTA3NTBFLTUyNDY1MTkgSW5leGFjdCBSb3VuZGVkCit4cmVtNDEyIHJlbWFpbmRlciAtNDE1OTMwNzcuMCAtNjg4NjA3LjU2NCAtPiAtMjc2NjIzLjE2MAoreHN1YjQxMiBzdWJ0cmFjdCAtNDE1OTMwNzcuMCAtNjg4NjA3LjU2NCAtPiAtNDA5MDQ0NjkuNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MTMgYWRkIC01Nzg2LjM4MTMyIDE5MDU1NjY1Mi5FKzE3NzA0NTg3NyAtPiAxLjkwNTU2NjUyRSsxNzcwNDU4ODUgSW5leGFjdCBSb3VuZGVkCit4Y29tNDEzIGNvbXBhcmUgLTU3ODYuMzgxMzIgMTkwNTU2NjUyLkUrMTc3MDQ1ODc3IC0+IC0xCit4ZGl2NDEzIGRpdmlkZSAtNTc4Ni4zODEzMiAxOTA1NTY2NTIuRSsxNzcwNDU4NzcgLT4gLTMuMDM2NTY3NDhFLTE3NzA0NTg4MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MTMgZGl2aWRlaW50IC01Nzg2LjM4MTMyIDE5MDU1NjY1Mi5FKzE3NzA0NTg3NyAtPiAtMAoreG11bDQxMyBtdWx0aXBseSAtNTc4Ni4zODEzMiAxOTA1NTY2NTIuRSsxNzcwNDU4NzcgLT4gLTEuMTAyNjMzNDVFKzE3NzA0NTg4OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MTMgcG93ZXIgLTU3ODYuMzgxMzIgMiAtPiAzMzQ4MjIwOC44IEluZXhhY3QgUm91bmRlZAoreHJlbTQxMyByZW1haW5kZXIgLTU3ODYuMzgxMzIgMTkwNTU2NjUyLkUrMTc3MDQ1ODc3IC0+IC01Nzg2LjM4MTMyCit4c3ViNDEzIHN1YnRyYWN0IC01Nzg2LjM4MTMyIDE5MDU1NjY1Mi5FKzE3NzA0NTg3NyAtPiAtMS45MDU1NjY1MkUrMTc3MDQ1ODg1IEluZXhhY3QgUm91bmRlZAoreGFkZDQxNCBhZGQgNzM3NjIyLjk3NCAtMjQxNTYwNjkzRSsyNDk1MDY1NjUgLT4gLTIuNDE1NjA2OTNFKzI0OTUwNjU3MyBJbmV4YWN0IFJvdW5kZWQKK3hjb200MTQgY29tcGFyZSA3Mzc2MjIuOTc0IC0yNDE1NjA2OTNFKzI0OTUwNjU2NSAtPiAxCit4ZGl2NDE0IGRpdmlkZSA3Mzc2MjIuOTc0IC0yNDE1NjA2OTNFKzI0OTUwNjU2NSAtPiAtMy4wNTM1NzIwMkUtMjQ5NTA2NTY4IEluZXhhY3QgUm91bmRlZAoreGR2aTQxNCBkaXZpZGVpbnQgNzM3NjIyLjk3NCAtMjQxNTYwNjkzRSsyNDk1MDY1NjUgLT4gLTAKK3htdWw0MTQgbXVsdGlwbHkgNzM3NjIyLjk3NCAtMjQxNTYwNjkzRSsyNDk1MDY1NjUgLT4gLTEuNzgxODA3MTdFKzI0OTUwNjU3OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MTQgcG93ZXIgNzM3NjIyLjk3NCAtMiAtPiAxLjgzNzkzOTE2RS0xMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MTQgcmVtYWluZGVyIDczNzYyMi45NzQgLTI0MTU2MDY5M0UrMjQ5NTA2NTY1IC0+IDczNzYyMi45NzQKK3hzdWI0MTQgc3VidHJhY3QgNzM3NjIyLjk3NCAtMjQxNTYwNjkzRSsyNDk1MDY1NjUgLT4gMi40MTU2MDY5M0UrMjQ5NTA2NTczIEluZXhhY3QgUm91bmRlZAoreGFkZDQxNSBhZGQgNTYxNTM3My41MiAtNy4yNzU4MzgwOEUtOTQ5NzgxMDQ4IC0+IDU2MTUzNzMuNTIgSW5leGFjdCBSb3VuZGVkCit4Y29tNDE1IGNvbXBhcmUgNTYxNTM3My41MiAtNy4yNzU4MzgwOEUtOTQ5NzgxMDQ4IC0+IDEKK3hkaXY0MTUgZGl2aWRlIDU2MTUzNzMuNTIgLTcuMjc1ODM4MDhFLTk0OTc4MTA0OCAtPiAtNy43MTc4MzczOUUrOTQ5NzgxMDUzIEluZXhhY3QgUm91bmRlZAoreGR2aTQxNSBkaXZpZGVpbnQgNTYxNTM3My41MiAtNy4yNzU4MzgwOEUtOTQ5NzgxMDQ4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDE1IG11bHRpcGx5IDU2MTUzNzMuNTIgLTcuMjc1ODM4MDhFLTk0OTc4MTA0OCAtPiAtNC4wODU2NTQ4NUUtOTQ5NzgxMDQxIEluZXhhY3QgUm91bmRlZAoreHBvdzQxNSBwb3dlciA1NjE1MzczLjUyIC03IC0+IDUuNjgwMDE0NjBFLTQ4IEluZXhhY3QgUm91bmRlZAoreHJlbTQxNSByZW1haW5kZXIgNTYxNTM3My41MiAtNy4yNzU4MzgwOEUtOTQ5NzgxMDQ4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDE1IHN1YnRyYWN0IDU2MTUzNzMuNTIgLTcuMjc1ODM4MDhFLTk0OTc4MTA0OCAtPiA1NjE1MzczLjUyIEluZXhhY3QgUm91bmRlZAoreGFkZDQxNiBhZGQgNjQ0MTM2LjE3OSAtODM1NzA4LjEwMyAtPiAtMTkxNTcxLjkyNAoreGNvbTQxNiBjb21wYXJlIDY0NDEzNi4xNzkgLTgzNTcwOC4xMDMgLT4gMQoreGRpdjQxNiBkaXZpZGUgNjQ0MTM2LjE3OSAtODM1NzA4LjEwMyAtPiAtMC43NzA3NjY5NDIgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDE2IGRpdmlkZWludCA2NDQxMzYuMTc5IC04MzU3MDguMTAzIC0+IC0wCit4bXVsNDE2IG11bHRpcGx5IDY0NDEzNi4xNzkgLTgzNTcwOC4xMDMgLT4gLTUuMzgzMDk4MjRFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzQxNiBwb3dlciA2NDQxMzYuMTc5IC04MzU3MDggLT4gNy40MTkzNjg1OEUtNDg1NDYxMCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MTYgcmVtYWluZGVyIDY0NDEzNi4xNzkgLTgzNTcwOC4xMDMgLT4gNjQ0MTM2LjE3OQoreHN1YjQxNiBzdWJ0cmFjdCA2NDQxMzYuMTc5IC04MzU3MDguMTAzIC0+IDE0Nzk4NDQuMjggSW5leGFjdCBSb3VuZGVkCit4YWRkNDE3IGFkZCAtMzA3LjQxOTUyMUUrNDY2ODYxODQzIC03Mzg2ODk5NzYuRS0xOTkwMzI3MTEgLT4gLTMuMDc0MTk1MjFFKzQ2Njg2MTg0NSBJbmV4YWN0IFJvdW5kZWQKK3hjb200MTcgY29tcGFyZSAtMzA3LjQxOTUyMUUrNDY2ODYxODQzIC03Mzg2ODk5NzYuRS0xOTkwMzI3MTEgLT4gLTEKK3hkaXY0MTcgZGl2aWRlIC0zMDcuNDE5NTIxRSs0NjY4NjE4NDMgLTczODY4OTk3Ni5FLTE5OTAzMjcxMSAtPiA0LjE2MTY4NTI5RSs2NjU4OTQ1NDcgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDE3IGRpdmlkZWludCAtMzA3LjQxOTUyMUUrNDY2ODYxODQzIC03Mzg2ODk5NzYuRS0xOTkwMzI3MTEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0MTcgbXVsdGlwbHkgLTMwNy40MTk1MjFFKzQ2Njg2MTg0MyAtNzM4Njg5OTc2LkUtMTk5MDMyNzExIC0+IDIuMjcwODc3MTlFKzI2NzgyOTE0MyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MTcgcG93ZXIgLTMwNy40MTk1MjFFKzQ2Njg2MTg0MyAtNyAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDE3IHJlbWFpbmRlciAtMzA3LjQxOTUyMUUrNDY2ODYxODQzIC03Mzg2ODk5NzYuRS0xOTkwMzI3MTEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0MTcgc3VidHJhY3QgLTMwNy40MTk1MjFFKzQ2Njg2MTg0MyAtNzM4Njg5OTc2LkUtMTk5MDMyNzExIC0+IC0zLjA3NDE5NTIxRSs0NjY4NjE4NDUgSW5leGFjdCBSb3VuZGVkCit4YWRkNDE4IGFkZCAtNjE5NjQyLjEzMCAtMjI2NzQwNTM3LkUtOTAyNTkwMTUzIC0+IC02MTk2NDIuMTMwIEluZXhhY3QgUm91bmRlZAoreGNvbTQxOCBjb21wYXJlIC02MTk2NDIuMTMwIC0yMjY3NDA1MzcuRS05MDI1OTAxNTMgLT4gLTEKK3hkaXY0MTggZGl2aWRlIC02MTk2NDIuMTMwIC0yMjY3NDA1MzcuRS05MDI1OTAxNTMgLT4gMi43MzI4MjQ2NkUrOTAyNTkwMTUwIEluZXhhY3QgUm91bmRlZAoreGR2aTQxOCBkaXZpZGVpbnQgLTYxOTY0Mi4xMzAgLTIyNjc0MDUzNy5FLTkwMjU5MDE1MyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQxOCBtdWx0aXBseSAtNjE5NjQyLjEzMCAtMjI2NzQwNTM3LkUtOTAyNTkwMTUzIC0+IDEuNDA0OTc5ODlFLTkwMjU5MDEzOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MTggcG93ZXIgLTYxOTY0Mi4xMzAgLTIgLT4gMi42MDQ0NjI1OUUtMTIgSW5leGFjdCBSb3VuZGVkCit4cmVtNDE4IHJlbWFpbmRlciAtNjE5NjQyLjEzMCAtMjI2NzQwNTM3LkUtOTAyNTkwMTUzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDE4IHN1YnRyYWN0IC02MTk2NDIuMTMwIC0yMjY3NDA1MzcuRS05MDI1OTAxNTMgLT4gLTYxOTY0Mi4xMzAgSW5leGFjdCBSb3VuZGVkCit4YWRkNDE5IGFkZCAtMzEwNjguNzU0OSAtMy40MTQ5NTA0MkUrODYwMDEzNzkgLT4gLTMuNDE0OTUwNDJFKzg2MDAxMzc5IEluZXhhY3QgUm91bmRlZAoreGNvbTQxOSBjb21wYXJlIC0zMTA2OC43NTQ5IC0zLjQxNDk1MDQyRSs4NjAwMTM3OSAtPiAxCit4ZGl2NDE5IGRpdmlkZSAtMzEwNjguNzU0OSAtMy40MTQ5NTA0MkUrODYwMDEzNzkgLT4gOS4wOTc4NjQxMkUtODYwMDEzNzYgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDE5IGRpdmlkZWludCAtMzEwNjguNzU0OSAtMy40MTQ5NTA0MkUrODYwMDEzNzkgLT4gMAoreG11bDQxOSBtdWx0aXBseSAtMzEwNjguNzU0OSAtMy40MTQ5NTA0MkUrODYwMDEzNzkgLT4gMS4wNjA5ODI1OEUrODYwMDEzODQgSW5leGFjdCBSb3VuZGVkCit4cG93NDE5IHBvd2VyIC0zMTA2OC43NTQ5IC0zIC0+IC0zLjMzNDQ4MjU4RS0xNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MTkgcmVtYWluZGVyIC0zMTA2OC43NTQ5IC0zLjQxNDk1MDQyRSs4NjAwMTM3OSAtPiAtMzEwNjguNzU0OQoreHN1YjQxOSBzdWJ0cmFjdCAtMzEwNjguNzU0OSAtMy40MTQ5NTA0MkUrODYwMDEzNzkgLT4gMy40MTQ5NTA0MkUrODYwMDEzNzkgSW5leGFjdCBSb3VuZGVkCit4YWRkNDIwIGFkZCAtNjg5NTExNzMuIC0yMTE4MDQ5NzcuRS05NzMxODEyNiAtPiAtNjg5NTExNzMuMCBJbmV4YWN0IFJvdW5kZWQKK3hjb200MjAgY29tcGFyZSAtNjg5NTExNzMuIC0yMTE4MDQ5NzcuRS05NzMxODEyNiAtPiAtMQoreGRpdjQyMCBkaXZpZGUgLTY4OTUxMTczLiAtMjExODA0OTc3LkUtOTczMTgxMjYgLT4gMy4yNTU0MDg1NEUrOTczMTgxMjUgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDIwIGRpdmlkZWludCAtNjg5NTExNzMuIC0yMTE4MDQ5NzcuRS05NzMxODEyNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQyMCBtdWx0aXBseSAtNjg5NTExNzMuIC0yMTE4MDQ5NzcuRS05NzMxODEyNiAtPiAxLjQ2MDQyMDE2RS05NzMxODExMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MjAgcG93ZXIgLTY4OTUxMTczLiAtMiAtPiAyLjEwMzM3NDg4RS0xNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MjAgcmVtYWluZGVyIC02ODk1MTE3My4gLTIxMTgwNDk3Ny5FLTk3MzE4MTI2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDIwIHN1YnRyYWN0IC02ODk1MTE3My4gLTIxMTgwNDk3Ny5FLTk3MzE4MTI2IC0+IC02ODk1MTE3My4wIEluZXhhY3QgUm91bmRlZAoreGFkZDQyMSBhZGQgLTQuMDk0OTI1NzFFLTMwMTc0OTQ5MCA0MzQuMjAxOTlFLTc0OTM5MDk1MiAtPiAtNC4wOTQ5MjU3MUUtMzAxNzQ5NDkwIEluZXhhY3QgUm91bmRlZAoreGNvbTQyMSBjb21wYXJlIC00LjA5NDkyNTcxRS0zMDE3NDk0OTAgNDM0LjIwMTk5RS03NDkzOTA5NTIgLT4gLTEKK3hkaXY0MjEgZGl2aWRlIC00LjA5NDkyNTcxRS0zMDE3NDk0OTAgNDM0LjIwMTk5RS03NDkzOTA5NTIgLT4gLTkuNDMwOTIzNDFFKzQ0NzY0MTQ1OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MjEgZGl2aWRlaW50IC00LjA5NDkyNTcxRS0zMDE3NDk0OTAgNDM0LjIwMTk5RS03NDkzOTA5NTIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0MjEgbXVsdGlwbHkgLTQuMDk0OTI1NzFFLTMwMTc0OTQ5MCA0MzQuMjAxOTlFLTc0OTM5MDk1MiAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cG93NDIxIHBvd2VyIC00LjA5NDkyNTcxRS0zMDE3NDk0OTAgNCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00MjEgcmVtYWluZGVyIC00LjA5NDkyNTcxRS0zMDE3NDk0OTAgNDM0LjIwMTk5RS03NDkzOTA5NTIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0MjEgc3VidHJhY3QgLTQuMDk0OTI1NzFFLTMwMTc0OTQ5MCA0MzQuMjAxOTlFLTc0OTM5MDk1MiAtPiAtNC4wOTQ5MjU3MUUtMzAxNzQ5NDkwIEluZXhhY3QgUm91bmRlZAoreGFkZDQyMiBhZGQgMzg5OC4wMzE4OCAtODI1NzIuNjE1IC0+IC03ODY3NC41ODMxIEluZXhhY3QgUm91bmRlZAoreGNvbTQyMiBjb21wYXJlIDM4OTguMDMxODggLTgyNTcyLjYxNSAtPiAxCit4ZGl2NDIyIGRpdmlkZSAzODk4LjAzMTg4IC04MjU3Mi42MTUgLT4gLTAuMDQ3MjA3MzIwMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MjIgZGl2aWRlaW50IDM4OTguMDMxODggLTgyNTcyLjYxNSAtPiAtMAoreG11bDQyMiBtdWx0aXBseSAzODk4LjAzMTg4IC04MjU3Mi42MTUgLT4gLTMyMTg3MDY4NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MjIgcG93ZXIgMzg5OC4wMzE4OCAtODI1NzMgLT4gMS4zMzAxMDczN0UtMjk2NTA3IEluZXhhY3QgUm91bmRlZAoreHJlbTQyMiByZW1haW5kZXIgMzg5OC4wMzE4OCAtODI1NzIuNjE1IC0+IDM4OTguMDMxODgKK3hzdWI0MjIgc3VidHJhY3QgMzg5OC4wMzE4OCAtODI1NzIuNjE1IC0+IDg2NDcwLjY0NjkgSW5leGFjdCBSb3VuZGVkCit4YWRkNDIzIGFkZCAtMS43NjE5MzU2IC0yNTQ2LjY0MDQzIC0+IC0yNTQ4LjQwMjM3IEluZXhhY3QgUm91bmRlZAoreGNvbTQyMyBjb21wYXJlIC0xLjc2MTkzNTYgLTI1NDYuNjQwNDMgLT4gMQoreGRpdjQyMyBkaXZpZGUgLTEuNzYxOTM1NiAtMjU0Ni42NDA0MyAtPiAwLjAwMDY5MTg2NjY1NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MjMgZGl2aWRlaW50IC0xLjc2MTkzNTYgLTI1NDYuNjQwNDMgLT4gMAoreG11bDQyMyBtdWx0aXBseSAtMS43NjE5MzU2IC0yNTQ2LjY0MDQzIC0+IDQ0ODcuMDE2NDMgSW5leGFjdCBSb3VuZGVkCit4cG93NDIzIHBvd2VyIC0xLjc2MTkzNTYgLTI1NDcgLT4gLTIuOTA2NjQ1NTdFLTYyNyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MjMgcmVtYWluZGVyIC0xLjc2MTkzNTYgLTI1NDYuNjQwNDMgLT4gLTEuNzYxOTM1NgoreHN1YjQyMyBzdWJ0cmFjdCAtMS43NjE5MzU2IC0yNTQ2LjY0MDQzIC0+IDI1NDQuODc4NDkgSW5leGFjdCBSb3VuZGVkCit4YWRkNDI0IGFkZCA1OTcxNC4xOTY4IDI5NzM0Mzg4LjZFLTU2NDUyNTUyNSAtPiA1OTcxNC4xOTY4IEluZXhhY3QgUm91bmRlZAoreGNvbTQyNCBjb21wYXJlIDU5NzE0LjE5NjggMjk3MzQzODguNkUtNTY0NTI1NTI1IC0+IDEKK3hkaXY0MjQgZGl2aWRlIDU5NzE0LjE5NjggMjk3MzQzODguNkUtNTY0NTI1NTI1IC0+IDIuMDA4MjUzNzNFKzU2NDUyNTUyMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MjQgZGl2aWRlaW50IDU5NzE0LjE5NjggMjk3MzQzODguNkUtNTY0NTI1NTI1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDI0IG11bHRpcGx5IDU5NzE0LjE5NjggMjk3MzQzODguNkUtNTY0NTI1NTI1IC0+IDEuNzc1NTY1MTNFLTU2NDUyNTUxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MjQgcG93ZXIgNTk3MTQuMTk2OCAzIC0+IDIuMTI5MjgwMDVFKzE0IEluZXhhY3QgUm91bmRlZAoreHJlbTQyNCByZW1haW5kZXIgNTk3MTQuMTk2OCAyOTczNDM4OC42RS01NjQ1MjU1MjUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0MjQgc3VidHJhY3QgNTk3MTQuMTk2OCAyOTczNDM4OC42RS01NjQ1MjU1MjUgLT4gNTk3MTQuMTk2OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MjUgYWRkIDYuODg4OTExMzZFLTkzNTQ2NzM5NSAtNzg1MDQ5LjU2MkUtNzQxNjcxNDQyIC0+IC03Ljg1MDQ5NTYyRS03NDE2NzE0MzcgSW5leGFjdCBSb3VuZGVkCit4Y29tNDI1IGNvbXBhcmUgNi44ODg5MTEzNkUtOTM1NDY3Mzk1IC03ODUwNDkuNTYyRS03NDE2NzE0NDIgLT4gMQoreGRpdjQyNSBkaXZpZGUgNi44ODg5MTEzNkUtOTM1NDY3Mzk1IC03ODUwNDkuNTYyRS03NDE2NzE0NDIgLT4gLTguNzc1MTI5MjNFLTE5Mzc5NTk1OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MjUgZGl2aWRlaW50IDYuODg4OTExMzZFLTkzNTQ2NzM5NSAtNzg1MDQ5LjU2MkUtNzQxNjcxNDQyIC0+IC0wCit4bXVsNDI1IG11bHRpcGx5IDYuODg4OTExMzZFLTkzNTQ2NzM5NSAtNzg1MDQ5LjU2MkUtNzQxNjcxNDQyIC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hwb3c0MjUgcG93ZXIgNi44ODg5MTEzNkUtOTM1NDY3Mzk1IC04IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTQyNSByZW1haW5kZXIgNi44ODg5MTEzNkUtOTM1NDY3Mzk1IC03ODUwNDkuNTYyRS03NDE2NzE0NDIgLT4gNi44ODg5MTEzNkUtOTM1NDY3Mzk1Cit4c3ViNDI1IHN1YnRyYWN0IDYuODg4OTExMzZFLTkzNTQ2NzM5NSAtNzg1MDQ5LjU2MkUtNzQxNjcxNDQyIC0+IDcuODUwNDk1NjJFLTc0MTY3MTQzNyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MjYgYWRkIDk3NTU2NjI1MSAtNTE5Ljg1ODUzMCAtPiA5NzU1NjU3MzEgSW5leGFjdCBSb3VuZGVkCit4Y29tNDI2IGNvbXBhcmUgOTc1NTY2MjUxIC01MTkuODU4NTMwIC0+IDEKK3hkaXY0MjYgZGl2aWRlIDk3NTU2NjI1MSAtNTE5Ljg1ODUzMCAtPiAtMTg3NjU5OS40OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MjYgZGl2aWRlaW50IDk3NTU2NjI1MSAtNTE5Ljg1ODUzMCAtPiAtMTg3NjU5OQoreG11bDQyNiBtdWx0aXBseSA5NzU1NjYyNTEgLTUxOS44NTg1MzAgLT4gLTUuMDcxNTY0MzdFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzQyNiBwb3dlciA5NzU1NjYyNTEgLTUyMCAtPiAzLjg1OTA1MzAwRS00Njc1IEluZXhhY3QgUm91bmRlZAoreHJlbTQyNiByZW1haW5kZXIgOTc1NTY2MjUxIC01MTkuODU4NTMwIC0+IDI1My40NjA1MzAKK3hzdWI0MjYgc3VidHJhY3QgOTc1NTY2MjUxIC01MTkuODU4NTMwIC0+IDk3NTU2Njc3MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MjcgYWRkIDMwNzQwMTk1NCAtMjMxNDgxNTgyLiAtPiA3NTkyMDM3MgoreGNvbTQyNyBjb21wYXJlIDMwNzQwMTk1NCAtMjMxNDgxNTgyLiAtPiAxCit4ZGl2NDI3IGRpdmlkZSAzMDc0MDE5NTQgLTIzMTQ4MTU4Mi4gLT4gLTEuMzI3OTc1ODYgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDI3IGRpdmlkZWludCAzMDc0MDE5NTQgLTIzMTQ4MTU4Mi4gLT4gLTEKK3htdWw0MjcgbXVsdGlwbHkgMzA3NDAxOTU0IC0yMzE0ODE1ODIuIC0+IC03LjExNTc4OTA2RSsxNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MjcgcG93ZXIgMzA3NDAxOTU0IC0yMzE0ODE1ODIgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDI3IHJlbWFpbmRlciAzMDc0MDE5NTQgLTIzMTQ4MTU4Mi4gLT4gNzU5MjAzNzIKK3hzdWI0Mjcgc3VidHJhY3QgMzA3NDAxOTU0IC0yMzE0ODE1ODIuIC0+IDUzODg4MzUzNgoreGFkZDQyOCBhZGQgMjIzNzY0NS40OEUrOTkyOTQ3Mzg4IC02MDYxODA1NS4zRS04NTczMTY3MDYgLT4gMi4yMzc2NDU0OEUrOTkyOTQ3Mzk0IEluZXhhY3QgUm91bmRlZAoreGNvbTQyOCBjb21wYXJlIDIyMzc2NDUuNDhFKzk5Mjk0NzM4OCAtNjA2MTgwNTUuM0UtODU3MzE2NzA2IC0+IDEKK3hkaXY0MjggZGl2aWRlIDIyMzc2NDUuNDhFKzk5Mjk0NzM4OCAtNjA2MTgwNTUuM0UtODU3MzE2NzA2IC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3hkdmk0MjggZGl2aWRlaW50IDIyMzc2NDUuNDhFKzk5Mjk0NzM4OCAtNjA2MTgwNTUuM0UtODU3MzE2NzA2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDI4IG11bHRpcGx5IDIyMzc2NDUuNDhFKzk5Mjk0NzM4OCAtNjA2MTgwNTUuM0UtODU3MzE2NzA2IC0+IC0xLjM1NjQxNzE3RSsxMzU2MzA2OTYgSW5leGFjdCBSb3VuZGVkCit4cG93NDI4IHBvd2VyIDIyMzc2NDUuNDhFKzk5Mjk0NzM4OCAtNiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00MjggcmVtYWluZGVyIDIyMzc2NDUuNDhFKzk5Mjk0NzM4OCAtNjA2MTgwNTUuM0UtODU3MzE2NzA2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDI4IHN1YnRyYWN0IDIyMzc2NDUuNDhFKzk5Mjk0NzM4OCAtNjA2MTgwNTUuM0UtODU3MzE2NzA2IC0+IDIuMjM3NjQ1NDhFKzk5Mjk0NzM5NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MjkgYWRkIC00MDM5MDMuODUxIDM1LjUwNDk2ODdFLTcyMDk1MTU1IC0+IC00MDM5MDMuODUxIEluZXhhY3QgUm91bmRlZAoreGNvbTQyOSBjb21wYXJlIC00MDM5MDMuODUxIDM1LjUwNDk2ODdFLTcyMDk1MTU1IC0+IC0xCit4ZGl2NDI5IGRpdmlkZSAtNDAzOTAzLjg1MSAzNS41MDQ5Njg3RS03MjA5NTE1NSAtPiAtMS4xMzc1OTgxMEUrNzIwOTUxNTkgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDI5IGRpdmlkZWludCAtNDAzOTAzLjg1MSAzNS41MDQ5Njg3RS03MjA5NTE1NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQyOSBtdWx0aXBseSAtNDAzOTAzLjg1MSAzNS41MDQ5Njg3RS03MjA5NTE1NSAtPiAtMS40MzQwNTkzNkUtNzIwOTUxNDggSW5leGFjdCBSb3VuZGVkCit4cG93NDI5IHBvd2VyIC00MDM5MDMuODUxIDQgLT4gMi42NjE0MTExN0UrMjIgSW5leGFjdCBSb3VuZGVkCit4cmVtNDI5IHJlbWFpbmRlciAtNDAzOTAzLjg1MSAzNS41MDQ5Njg3RS03MjA5NTE1NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQyOSBzdWJ0cmFjdCAtNDAzOTAzLjg1MSAzNS41MDQ5Njg3RS03MjA5NTE1NSAtPiAtNDAzOTAzLjg1MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MzAgYWRkIDYuNDg2NzQ5NzkgLTYyMTczMi41MzJFKzQyMjU3NTgwMCAtPiAtNi4yMTczMjUzMkUrNDIyNTc1ODA1IEluZXhhY3QgUm91bmRlZAoreGNvbTQzMCBjb21wYXJlIDYuNDg2NzQ5NzkgLTYyMTczMi41MzJFKzQyMjU3NTgwMCAtPiAxCit4ZGl2NDMwIGRpdmlkZSA2LjQ4Njc0OTc5IC02MjE3MzIuNTMyRSs0MjI1NzU4MDAgLT4gLTEuMDQzMzM0NDdFLTQyMjU3NTgwNSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MzAgZGl2aWRlaW50IDYuNDg2NzQ5NzkgLTYyMTczMi41MzJFKzQyMjU3NTgwMCAtPiAtMAoreG11bDQzMCBtdWx0aXBseSA2LjQ4Njc0OTc5IC02MjE3MzIuNTMyRSs0MjI1NzU4MDAgLT4gLTQuMDMzMDIzMzdFKzQyMjU3NTgwNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MzAgcG93ZXIgNi40ODY3NDk3OSAtNiAtPiAwLjAwMDAxMzQyMjYxNDYgSW5leGFjdCBSb3VuZGVkCit4cmVtNDMwIHJlbWFpbmRlciA2LjQ4Njc0OTc5IC02MjE3MzIuNTMyRSs0MjI1NzU4MDAgLT4gNi40ODY3NDk3OQoreHN1YjQzMCBzdWJ0cmFjdCA2LjQ4Njc0OTc5IC02MjE3MzIuNTMyRSs0MjI1NzU4MDAgLT4gNi4yMTczMjUzMkUrNDIyNTc1ODA1IEluZXhhY3QgUm91bmRlZAoreGFkZDQzMSBhZGQgLTMxNDAxLjk0MTggMzYuMzk2MDY3OSAtPiAtMzEzNjUuNTQ1NyBJbmV4YWN0IFJvdW5kZWQKK3hjb200MzEgY29tcGFyZSAtMzE0MDEuOTQxOCAzNi4zOTYwNjc5IC0+IC0xCit4ZGl2NDMxIGRpdmlkZSAtMzE0MDEuOTQxOCAzNi4zOTYwNjc5IC0+IC04NjIuNzgzOTExIEluZXhhY3QgUm91bmRlZAoreGR2aTQzMSBkaXZpZGVpbnQgLTMxNDAxLjk0MTggMzYuMzk2MDY3OSAtPiAtODYyCit4bXVsNDMxIG11bHRpcGx5IC0zMTQwMS45NDE4IDM2LjM5NjA2NzkgLT4gLTExNDI5MDcuMjEgSW5leGFjdCBSb3VuZGVkCit4cG93NDMxIHBvd2VyIC0zMTQwMS45NDE4IDM2IC0+IDcuNzcwMjM1MDVFKzE2MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MzEgcmVtYWluZGVyIC0zMTQwMS45NDE4IDM2LjM5NjA2NzkgLT4gLTI4LjUzMTI3MDIKK3hzdWI0MzEgc3VidHJhY3QgLTMxNDAxLjk0MTggMzYuMzk2MDY3OSAtPiAtMzE0MzguMzM3OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MzIgYWRkIDMxMzQ1MzIxLjEgNTEuNTQ4MjE5MSAtPiAzMTM0NTM3Mi42IEluZXhhY3QgUm91bmRlZAoreGNvbTQzMiBjb21wYXJlIDMxMzQ1MzIxLjEgNTEuNTQ4MjE5MSAtPiAxCit4ZGl2NDMyIGRpdmlkZSAzMTM0NTMyMS4xIDUxLjU0ODIxOTEgLT4gNjA4MDc3LjY3MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MzIgZGl2aWRlaW50IDMxMzQ1MzIxLjEgNTEuNTQ4MjE5MSAtPiA2MDgwNzcKK3htdWw0MzIgbXVsdGlwbHkgMzEzNDUzMjEuMSA1MS41NDgyMTkxIC0+IDEuNjE1Nzk1NDhFKzkgSW5leGFjdCBSb3VuZGVkCit4cG93NDMyIHBvd2VyIDMxMzQ1MzIxLjEgNTIgLT4gNi4zMjM4NTA1OUUrMzg5IEluZXhhY3QgUm91bmRlZAoreHJlbTQzMiByZW1haW5kZXIgMzEzNDUzMjEuMSA1MS41NDgyMTkxIC0+IDM0LjY3NDMyOTMKK3hzdWI0MzIgc3VidHJhY3QgMzEzNDUzMjEuMSA1MS41NDgyMTkxIC0+IDMxMzQ1MjY5LjYgSW5leGFjdCBSb3VuZGVkCit4YWRkNDMzIGFkZCAtNjQuMTcyODQ0IC0yODUwNjIyNy4yRS03Njc5NjU4MDAgLT4gLTY0LjE3Mjg0NDAgSW5leGFjdCBSb3VuZGVkCit4Y29tNDMzIGNvbXBhcmUgLTY0LjE3Mjg0NCAtMjg1MDYyMjcuMkUtNzY3OTY1ODAwIC0+IC0xCit4ZGl2NDMzIGRpdmlkZSAtNjQuMTcyODQ0IC0yODUwNjIyNy4yRS03Njc5NjU4MDAgLT4gMi4yNTExODY4NkUrNzY3OTY1Nzk0IEluZXhhY3QgUm91bmRlZAoreGR2aTQzMyBkaXZpZGVpbnQgLTY0LjE3Mjg0NCAtMjg1MDYyMjcuMkUtNzY3OTY1ODAwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDMzIG11bHRpcGx5IC02NC4xNzI4NDQgLTI4NTA2MjI3LjJFLTc2Nzk2NTgwMCAtPiAxLjgyOTMyNTY3RS03Njc5NjU3OTEgSW5leGFjdCBSb3VuZGVkCit4cG93NDMzIHBvd2VyIC02NC4xNzI4NDQgLTMgLT4gLTAuMDAwMDAzNzgzOTU2NTQgSW5leGFjdCBSb3VuZGVkCit4cmVtNDMzIHJlbWFpbmRlciAtNjQuMTcyODQ0IC0yODUwNjIyNy4yRS03Njc5NjU4MDAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0MzMgc3VidHJhY3QgLTY0LjE3Mjg0NCAtMjg1MDYyMjcuMkUtNzY3OTY1ODAwIC0+IC02NC4xNzI4NDQwIEluZXhhY3QgUm91bmRlZAoreGFkZDQzNCBhZGQgNzA0MzcuMTU1MSAtNjI5MTYuMTIzMyAtPiA3NTIxLjAzMTgKK3hjb200MzQgY29tcGFyZSA3MDQzNy4xNTUxIC02MjkxNi4xMjMzIC0+IDEKK3hkaXY0MzQgZGl2aWRlIDcwNDM3LjE1NTEgLTYyOTE2LjEyMzMgLT4gLTEuMTE5NTQwNjEgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDM0IGRpdmlkZWludCA3MDQzNy4xNTUxIC02MjkxNi4xMjMzIC0+IC0xCit4bXVsNDM0IG11bHRpcGx5IDcwNDM3LjE1NTEgLTYyOTE2LjEyMzMgLT4gLTQuNDMxNjMyNzRFKzkgSW5leGFjdCBSb3VuZGVkCit4cG93NDM0IHBvd2VyIDcwNDM3LjE1NTEgLTYyOTE2IC0+IDUuMDI5NDUwNjBFLTMwNTAwNSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MzQgcmVtYWluZGVyIDcwNDM3LjE1NTEgLTYyOTE2LjEyMzMgLT4gNzUyMS4wMzE4Cit4c3ViNDM0IHN1YnRyYWN0IDcwNDM3LjE1NTEgLTYyOTE2LjEyMzMgLT4gMTMzMzUzLjI3OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MzUgYWRkIDkxNjI2MDE2NCAtNTguNDAxNzMyNSAtPiA5MTYyNjAxMDYgSW5leGFjdCBSb3VuZGVkCit4Y29tNDM1IGNvbXBhcmUgOTE2MjYwMTY0IC01OC40MDE3MzI1IC0+IDEKK3hkaXY0MzUgZGl2aWRlIDkxNjI2MDE2NCAtNTguNDAxNzMyNSAtPiAtMTU2ODg5MjAuOSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MzUgZGl2aWRlaW50IDkxNjI2MDE2NCAtNTguNDAxNzMyNSAtPiAtMTU2ODg5MjAKK3htdWw0MzUgbXVsdGlwbHkgOTE2MjYwMTY0IC01OC40MDE3MzI1IC0+IC01LjM1MTExODEwRSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MzUgcG93ZXIgOTE2MjYwMTY0IC01OCAtPiAxLjU5NTU0NTg3RS01MjAgSW5leGFjdCBSb3VuZGVkCit4cmVtNDM1IHJlbWFpbmRlciA5MTYyNjAxNjQgLTU4LjQwMTczMjUgLT4gNTQuOTQ2MTAwMAoreHN1YjQzNSBzdWJ0cmFjdCA5MTYyNjAxNjQgLTU4LjQwMTczMjUgLT4gOTE2MjYwMjIyIEluZXhhY3QgUm91bmRlZAoreGFkZDQzNiBhZGQgMTk4ODkwODUuM0UtNDY4MTY0ODAgMTU4MTY4My45NCAtPiAxNTgxNjgzLjk0IEluZXhhY3QgUm91bmRlZAoreGNvbTQzNiBjb21wYXJlIDE5ODg5MDg1LjNFLTQ2ODE2NDgwIDE1ODE2ODMuOTQgLT4gLTEKK3hkaXY0MzYgZGl2aWRlIDE5ODg5MDg1LjNFLTQ2ODE2NDgwIDE1ODE2ODMuOTQgLT4gMS4yNTc0NjI2OEUtNDY4MTY0NzkgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDM2IGRpdmlkZWludCAxOTg4OTA4NS4zRS00NjgxNjQ4MCAxNTgxNjgzLjk0IC0+IDAKK3htdWw0MzYgbXVsdGlwbHkgMTk4ODkwODUuM0UtNDY4MTY0ODAgMTU4MTY4My45NCAtPiAzLjE0NTgyNDY4RS00NjgxNjQ2NyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MzYgcG93ZXIgMTk4ODkwODUuM0UtNDY4MTY0ODAgMTU4MTY4NCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00MzYgcmVtYWluZGVyIDE5ODg5MDg1LjNFLTQ2ODE2NDgwIDE1ODE2ODMuOTQgLT4gMS45ODg5MDg1M0UtNDY4MTY0NzMKK3hzdWI0MzYgc3VidHJhY3QgMTk4ODkwODUuM0UtNDY4MTY0ODAgMTU4MTY4My45NCAtPiAtMTU4MTY4My45NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MzcgYWRkIC01NjMxMi4zMzgzIDc4OS40NjYwNjQgLT4gLTU1NTIyLjg3MjIgSW5leGFjdCBSb3VuZGVkCit4Y29tNDM3IGNvbXBhcmUgLTU2MzEyLjMzODMgNzg5LjQ2NjA2NCAtPiAtMQoreGRpdjQzNyBkaXZpZGUgLTU2MzEyLjMzODMgNzg5LjQ2NjA2NCAtPiAtNzEuMzI5NjUwMyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MzcgZGl2aWRlaW50IC01NjMxMi4zMzgzIDc4OS40NjYwNjQgLT4gLTcxCit4bXVsNDM3IG11bHRpcGx5IC01NjMxMi4zMzgzIDc4OS40NjYwNjQgLT4gLTQ0NDU2NjgwLjEgSW5leGFjdCBSb3VuZGVkCit4cG93NDM3IHBvd2VyIC01NjMxMi4zMzgzIDc4OSAtPiAtMS42ODM0ODcyNEUrMzc0OCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MzcgcmVtYWluZGVyIC01NjMxMi4zMzgzIDc4OS40NjYwNjQgLT4gLTI2MC4yNDc3NTYKK3hzdWI0Mzcgc3VidHJhY3QgLTU2MzEyLjMzODMgNzg5LjQ2NjA2NCAtPiAtNTcxMDEuODA0NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MzggYWRkIDE4MzQ0Mi44NDkgLTkyNTg3NjEwNiAtPiAtOTI1NjkyNjYzIEluZXhhY3QgUm91bmRlZAoreGNvbTQzOCBjb21wYXJlIDE4MzQ0Mi44NDkgLTkyNTg3NjEwNiAtPiAxCit4ZGl2NDM4IGRpdmlkZSAxODM0NDIuODQ5IC05MjU4NzYxMDYgLT4gLTAuMDAwMTk4MTI4OTM3IEluZXhhY3QgUm91bmRlZAoreGR2aTQzOCBkaXZpZGVpbnQgMTgzNDQyLjg0OSAtOTI1ODc2MTA2IC0+IC0wCit4bXVsNDM4IG11bHRpcGx5IDE4MzQ0Mi44NDkgLTkyNTg3NjEwNiAtPiAtMS42OTg0NTM1MUUrMTQgSW5leGFjdCBSb3VuZGVkCit4cG93NDM4IHBvd2VyIDE4MzQ0Mi44NDkgLTkyNTg3NjEwNiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00MzggcmVtYWluZGVyIDE4MzQ0Mi44NDkgLTkyNTg3NjEwNiAtPiAxODM0NDIuODQ5Cit4c3ViNDM4IHN1YnRyYWN0IDE4MzQ0Mi44NDkgLTkyNTg3NjEwNiAtPiA5MjYwNTk1NDkgSW5leGFjdCBSb3VuZGVkCit4YWRkNDM5IGFkZCA5NzExMTMuNjU1RS02OTU1NDAyNDkgLTQxOTM1MTEyMEUtOTc3NzQzODIzIC0+IDkuNzExMTM2NTVFLTY5NTU0MDI0NCBJbmV4YWN0IFJvdW5kZWQKK3hjb200MzkgY29tcGFyZSA5NzExMTMuNjU1RS02OTU1NDAyNDkgLTQxOTM1MTEyMEUtOTc3NzQzODIzIC0+IDEKK3hkaXY0MzkgZGl2aWRlIDk3MTExMy42NTVFLTY5NTU0MDI0OSAtNDE5MzUxMTIwRS05Nzc3NDM4MjMgLT4gLTIuMzE1NzUzMTBFKzI4MjIwMzU3MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MzkgZGl2aWRlaW50IDk3MTExMy42NTVFLTY5NTU0MDI0OSAtNDE5MzUxMTIwRS05Nzc3NDM4MjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0MzkgbXVsdGlwbHkgOTcxMTEzLjY1NUUtNjk1NTQwMjQ5IC00MTkzNTExMjBFLTk3Nzc0MzgyMyAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cG93NDM5IHBvd2VyIDk3MTExMy42NTVFLTY5NTU0MDI0OSAtNCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MzkgcmVtYWluZGVyIDk3MTExMy42NTVFLTY5NTU0MDI0OSAtNDE5MzUxMTIwRS05Nzc3NDM4MjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0Mzkgc3VidHJhY3QgOTcxMTEzLjY1NUUtNjk1NTQwMjQ5IC00MTkzNTExMjBFLTk3Nzc0MzgyMyAtPiA5LjcxMTEzNjU1RS02OTU1NDAyNDQgSW5leGFjdCBSb3VuZGVkCit4YWRkNDQwIGFkZCA4NTk2NTg1NTEuIDcyMzM4LjIwNTQgLT4gODU5NzMwODg5IEluZXhhY3QgUm91bmRlZAoreGNvbTQ0MCBjb21wYXJlIDg1OTY1ODU1MS4gNzIzMzguMjA1NCAtPiAxCit4ZGl2NDQwIGRpdmlkZSA4NTk2NTg1NTEuIDcyMzM4LjIwNTQgLT4gMTE4ODMuODgwMCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NDAgZGl2aWRlaW50IDg1OTY1ODU1MS4gNzIzMzguMjA1NCAtPiAxMTg4MworeG11bDQ0MCBtdWx0aXBseSA4NTk2NTg1NTEuIDcyMzM4LjIwNTQgLT4gNi4yMTg2MTU2OEUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93NDQwIHBvd2VyIDg1OTY1ODU1MS4gNzIzMzggLT4gMS44NzYyMDQ1MEUrNjQ2MjkxIEluZXhhY3QgUm91bmRlZAoreHJlbTQ0MCByZW1haW5kZXIgODU5NjU4NTUxLiA3MjMzOC4yMDU0IC0+IDYzNjU2LjIzMTgKK3hzdWI0NDAgc3VidHJhY3QgODU5NjU4NTUxLiA3MjMzOC4yMDU0IC0+IDg1OTU4NjIxMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NDEgYWRkIC0zLjg2NDQ2NjMwRSs0MjY4MTYwNjggLTY2NC41MzQ3MzcgLT4gLTMuODY0NDY2MzBFKzQyNjgxNjA2OCBJbmV4YWN0IFJvdW5kZWQKK3hjb200NDEgY29tcGFyZSAtMy44NjQ0NjYzMEUrNDI2ODE2MDY4IC02NjQuNTM0NzM3IC0+IC0xCit4ZGl2NDQxIGRpdmlkZSAtMy44NjQ0NjYzMEUrNDI2ODE2MDY4IC02NjQuNTM0NzM3IC0+IDUuODE1Mjk2MTVFKzQyNjgxNjA2NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NDEgZGl2aWRlaW50IC0zLjg2NDQ2NjMwRSs0MjY4MTYwNjggLTY2NC41MzQ3MzcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0NDEgbXVsdGlwbHkgLTMuODY0NDY2MzBFKzQyNjgxNjA2OCAtNjY0LjUzNDczNyAtPiAyLjU2ODA3MjEwRSs0MjY4MTYwNzEgSW5leGFjdCBSb3VuZGVkCit4cG93NDQxIHBvd2VyIC0zLjg2NDQ2NjMwRSs0MjY4MTYwNjggLTY2NSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDQxIHJlbWFpbmRlciAtMy44NjQ0NjYzMEUrNDI2ODE2MDY4IC02NjQuNTM0NzM3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDQxIHN1YnRyYWN0IC0zLjg2NDQ2NjMwRSs0MjY4MTYwNjggLTY2NC41MzQ3MzcgLT4gLTMuODY0NDY2MzBFKzQyNjgxNjA2OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NDIgYWRkIC05NjkuODgxODE4IDMxMTcwLjg1NTUgLT4gMzAyMDAuOTczNyBJbmV4YWN0IFJvdW5kZWQKK3hjb200NDIgY29tcGFyZSAtOTY5Ljg4MTgxOCAzMTE3MC44NTU1IC0+IC0xCit4ZGl2NDQyIGRpdmlkZSAtOTY5Ljg4MTgxOCAzMTE3MC44NTU1IC0+IC0wLjAzMTExNTAyMDggSW5leGFjdCBSb3VuZGVkCit4ZHZpNDQyIGRpdmlkZWludCAtOTY5Ljg4MTgxOCAzMTE3MC44NTU1IC0+IC0wCit4bXVsNDQyIG11bHRpcGx5IC05NjkuODgxODE4IDMxMTcwLjg1NTUgLT4gLTMwMjMyMDQ2LjAgSW5leGFjdCBSb3VuZGVkCit4cG93NDQyIHBvd2VyIC05NjkuODgxODE4IDMxMTcxIC0+IC0xLjAyODY1ODk0RSs5MzA5OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NDIgcmVtYWluZGVyIC05NjkuODgxODE4IDMxMTcwLjg1NTUgLT4gLTk2OS44ODE4MTgKK3hzdWI0NDIgc3VidHJhY3QgLTk2OS44ODE4MTggMzExNzAuODU1NSAtPiAtMzIxNDAuNzM3MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NDMgYWRkIDc5ODA1MzcuMjcgODUuNDA0MDUxMiAtPiA3OTgwNjIyLjY3IEluZXhhY3QgUm91bmRlZAoreGNvbTQ0MyBjb21wYXJlIDc5ODA1MzcuMjcgODUuNDA0MDUxMiAtPiAxCit4ZGl2NDQzIGRpdmlkZSA3OTgwNTM3LjI3IDg1LjQwNDA1MTIgLT4gOTM0NDQuNDgxNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NDMgZGl2aWRlaW50IDc5ODA1MzcuMjcgODUuNDA0MDUxMiAtPiA5MzQ0NAoreG11bDQ0MyBtdWx0aXBseSA3OTgwNTM3LjI3IDg1LjQwNDA1MTIgLT4gNjgxNTcwMjE0IEluZXhhY3QgUm91bmRlZAoreHBvdzQ0MyBwb3dlciA3OTgwNTM3LjI3IDg1IC0+IDQuNzA2ODU3NjNFKzU4NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NDMgcmVtYWluZGVyIDc5ODA1MzcuMjcgODUuNDA0MDUxMiAtPiA0MS4xMDk2NjcyCit4c3ViNDQzIHN1YnRyYWN0IDc5ODA1MzcuMjcgODUuNDA0MDUxMiAtPiA3OTgwNDUxLjg3IEluZXhhY3QgUm91bmRlZAoreGFkZDQ0NCBhZGQgLTExNDYwOTkxNi4gNzUyNS4xNDk4MSAtPiAtMTE0NjAyMzkxIEluZXhhY3QgUm91bmRlZAoreGNvbTQ0NCBjb21wYXJlIC0xMTQ2MDk5MTYuIDc1MjUuMTQ5ODEgLT4gLTEKK3hkaXY0NDQgZGl2aWRlIC0xMTQ2MDk5MTYuIDc1MjUuMTQ5ODEgLT4gLTE1MjMwLjI1MDQgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDQ0IGRpdmlkZWludCAtMTE0NjA5OTE2LiA3NTI1LjE0OTgxIC0+IC0xNTIzMAoreG11bDQ0NCBtdWx0aXBseSAtMTE0NjA5OTE2LiA3NTI1LjE0OTgxIC0+IC04LjYyNDU2Nzg4RSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NDQgcG93ZXIgLTExNDYwOTkxNi4gNzUyNSAtPiAtNC40MzYyMDQ0NUUrNjA2NDUgSW5leGFjdCBSb3VuZGVkCit4cmVtNDQ0IHJlbWFpbmRlciAtMTE0NjA5OTE2LiA3NTI1LjE0OTgxIC0+IC0xODg0LjM5MzcwCit4c3ViNDQ0IHN1YnRyYWN0IC0xMTQ2MDk5MTYuIDc1MjUuMTQ5ODEgLT4gLTExNDYxNzQ0MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NDUgYWRkIDguNDM0MDQ2ODJFLTUwMDU3MjU2OCA0NzQ1MjY3MTkgLT4gNDc0NTI2NzE5IEluZXhhY3QgUm91bmRlZAoreGNvbTQ0NSBjb21wYXJlIDguNDM0MDQ2ODJFLTUwMDU3MjU2OCA0NzQ1MjY3MTkgLT4gLTEKK3hkaXY0NDUgZGl2aWRlIDguNDM0MDQ2ODJFLTUwMDU3MjU2OCA0NzQ1MjY3MTkgLT4gMS43NzczNTk3M0UtNTAwNTcyNTc2IEluZXhhY3QgUm91bmRlZAoreGR2aTQ0NSBkaXZpZGVpbnQgOC40MzQwNDY4MkUtNTAwNTcyNTY4IDQ3NDUyNjcxOSAtPiAwCit4bXVsNDQ1IG11bHRpcGx5IDguNDM0MDQ2ODJFLTUwMDU3MjU2OCA0NzQ1MjY3MTkgLT4gNC4wMDIxODA1N0UtNTAwNTcyNTU5IEluZXhhY3QgUm91bmRlZAoreHBvdzQ0NSBwb3dlciA4LjQzNDA0NjgyRS01MDA1NzI1NjggNDc0NTI2NzE5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ0NSByZW1haW5kZXIgOC40MzQwNDY4MkUtNTAwNTcyNTY4IDQ3NDUyNjcxOSAtPiA4LjQzNDA0NjgyRS01MDA1NzI1NjgKK3hzdWI0NDUgc3VidHJhY3QgOC40MzQwNDY4MkUtNTAwNTcyNTY4IDQ3NDUyNjcxOSAtPiAtNDc0NTI2NzE5IEluZXhhY3QgUm91bmRlZAoreGFkZDQ0NiBhZGQgMTg4MDA2NDMzIDIyNjAuMTcwMzdFLTk3ODE5MjUyNSAtPiAxODgwMDY0MzMgSW5leGFjdCBSb3VuZGVkCit4Y29tNDQ2IGNvbXBhcmUgMTg4MDA2NDMzIDIyNjAuMTcwMzdFLTk3ODE5MjUyNSAtPiAxCit4ZGl2NDQ2IGRpdmlkZSAxODgwMDY0MzMgMjI2MC4xNzAzN0UtOTc4MTkyNTI1IC0+IDguMzE4MjQxNjVFKzk3ODE5MjUyOSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NDYgZGl2aWRlaW50IDE4ODAwNjQzMyAyMjYwLjE3MDM3RS05NzgxOTI1MjUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0NDYgbXVsdGlwbHkgMTg4MDA2NDMzIDIyNjAuMTcwMzdFLTk3ODE5MjUyNSAtPiA0LjI0OTI2NTY5RS05NzgxOTI1MTQgSW5leGFjdCBSb3VuZGVkCit4cG93NDQ2IHBvd2VyIDE4ODAwNjQzMyAyIC0+IDMuNTM0NjQxODhFKzE2IEluZXhhY3QgUm91bmRlZAoreHJlbTQ0NiByZW1haW5kZXIgMTg4MDA2NDMzIDIyNjAuMTcwMzdFLTk3ODE5MjUyNSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ0NiBzdWJ0cmFjdCAxODgwMDY0MzMgMjI2MC4xNzAzN0UtOTc4MTkyNTI1IC0+IDE4ODAwNjQzMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NDcgYWRkIC05Ljk1ODM2MzEyIC04NjY0NjY3MDMgLT4gLTg2NjQ2NjcxMyBJbmV4YWN0IFJvdW5kZWQKK3hjb200NDcgY29tcGFyZSAtOS45NTgzNjMxMiAtODY2NDY2NzAzIC0+IDEKK3hkaXY0NDcgZGl2aWRlIC05Ljk1ODM2MzEyIC04NjY0NjY3MDMgLT4gMS4xNDkzMDcwN0UtOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NDcgZGl2aWRlaW50IC05Ljk1ODM2MzEyIC04NjY0NjY3MDMgLT4gMAoreG11bDQ0NyBtdWx0aXBseSAtOS45NTgzNjMxMiAtODY2NDY2NzAzIC0+IDguNjI4NTkwMDZFKzkgSW5leGFjdCBSb3VuZGVkCit4cG93NDQ3IHBvd2VyIC05Ljk1ODM2MzEyIC04NjY0NjY3MDMgLT4gLTYuNzE3NDQzNjlFLTg2NDg5NjYzMCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NDcgcmVtYWluZGVyIC05Ljk1ODM2MzEyIC04NjY0NjY3MDMgLT4gLTkuOTU4MzYzMTIKK3hzdWI0NDcgc3VidHJhY3QgLTkuOTU4MzYzMTIgLTg2NjQ2NjcwMyAtPiA4NjY0NjY2OTMgSW5leGFjdCBSb3VuZGVkCit4YWRkNDQ4IGFkZCA4MDkxOTMzOS4yRS05NjcyMzE1ODYgMjE5LjgyNDI2NiAtPiAyMTkuODI0MjY2IEluZXhhY3QgUm91bmRlZAoreGNvbTQ0OCBjb21wYXJlIDgwOTE5MzM5LjJFLTk2NzIzMTU4NiAyMTkuODI0MjY2IC0+IC0xCit4ZGl2NDQ4IGRpdmlkZSA4MDkxOTMzOS4yRS05NjcyMzE1ODYgMjE5LjgyNDI2NiAtPiAzLjY4MTA5MjIwRS05NjcyMzE1ODEgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDQ4IGRpdmlkZWludCA4MDkxOTMzOS4yRS05NjcyMzE1ODYgMjE5LjgyNDI2NiAtPiAwCit4bXVsNDQ4IG11bHRpcGx5IDgwOTE5MzM5LjJFLTk2NzIzMTU4NiAyMTkuODI0MjY2IC0+IDEuNzc4ODAzNDNFLTk2NzIzMTU3NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NDggcG93ZXIgODA5MTkzMzkuMkUtOTY3MjMxNTg2IDIyMCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00NDggcmVtYWluZGVyIDgwOTE5MzM5LjJFLTk2NzIzMTU4NiAyMTkuODI0MjY2IC0+IDguMDkxOTMzOTJFLTk2NzIzMTU3OQoreHN1YjQ0OCBzdWJ0cmFjdCA4MDkxOTMzOS4yRS05NjcyMzE1ODYgMjE5LjgyNDI2NiAtPiAtMjE5LjgyNDI2NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NDkgYWRkIDE1OTU3OS40NDQgLTg5ODI3LjUyMjkgLT4gNjk3NTEuOTIxMQoreGNvbTQ0OSBjb21wYXJlIDE1OTU3OS40NDQgLTg5ODI3LjUyMjkgLT4gMQoreGRpdjQ0OSBkaXZpZGUgMTU5NTc5LjQ0NCAtODk4MjcuNTIyOSAtPiAtMS43NzY1MDk0NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NDkgZGl2aWRlaW50IDE1OTU3OS40NDQgLTg5ODI3LjUyMjkgLT4gLTEKK3htdWw0NDkgbXVsdGlwbHkgMTU5NTc5LjQ0NCAtODk4MjcuNTIyOSAtPiAtMS40MzM0NjI2MkUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93NDQ5IHBvd2VyIDE1OTU3OS40NDQgLTg5ODI4IC0+IDkuNjk5NTU4NTBFLTQ2NzM3NCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NDkgcmVtYWluZGVyIDE1OTU3OS40NDQgLTg5ODI3LjUyMjkgLT4gNjk3NTEuOTIxMQoreHN1YjQ0OSBzdWJ0cmFjdCAxNTk1NzkuNDQ0IC04OTgyNy41MjI5IC0+IDI0OTQwNi45NjcgSW5leGFjdCBSb3VuZGVkCit4YWRkNDUwIGFkZCAtNC41NDAwMDE1MyA2OTY2MzMzLjc0IC0+IDY5NjYzMjkuMjAgSW5leGFjdCBSb3VuZGVkCit4Y29tNDUwIGNvbXBhcmUgLTQuNTQwMDAxNTMgNjk2NjMzMy43NCAtPiAtMQoreGRpdjQ1MCBkaXZpZGUgLTQuNTQwMDAxNTMgNjk2NjMzMy43NCAtPiAtNi41MTcwNjAwNUUtNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NTAgZGl2aWRlaW50IC00LjU0MDAwMTUzIDY5NjYzMzMuNzQgLT4gLTAKK3htdWw0NTAgbXVsdGlwbHkgLTQuNTQwMDAxNTMgNjk2NjMzMy43NCAtPiAtMzE2MjcxNjUuOCBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NTAgcG93ZXIgLTQuNTQwMDAxNTMgNjk2NjMzNCAtPiAzLjUyNTY4OTEzRSs0NTc3MjcxIEluZXhhY3QgUm91bmRlZAoreHJlbTQ1MCByZW1haW5kZXIgLTQuNTQwMDAxNTMgNjk2NjMzMy43NCAtPiAtNC41NDAwMDE1MworeHN1YjQ1MCBzdWJ0cmFjdCAtNC41NDAwMDE1MyA2OTY2MzMzLjc0IC0+IC02OTY2MzM4LjI4IEluZXhhY3QgUm91bmRlZAoreGFkZDQ1MSBhZGQgMjg3MDE1MzguN0UtMzkxMDE1NjQ5IC05MjA5OTkxOTIuIC0+IC05MjA5OTkxOTIgSW5leGFjdCBSb3VuZGVkCit4Y29tNDUxIGNvbXBhcmUgMjg3MDE1MzguN0UtMzkxMDE1NjQ5IC05MjA5OTkxOTIuIC0+IDEKK3hkaXY0NTEgZGl2aWRlIDI4NzAxNTM4LjdFLTM5MTAxNTY0OSAtOTIwOTk5MTkyLiAtPiAtMy4xMTYzNDc4N0UtMzkxMDE1NjUxIEluZXhhY3QgUm91bmRlZAoreGR2aTQ1MSBkaXZpZGVpbnQgMjg3MDE1MzguN0UtMzkxMDE1NjQ5IC05MjA5OTkxOTIuIC0+IC0wCit4bXVsNDUxIG11bHRpcGx5IDI4NzAxNTM4LjdFLTM5MTAxNTY0OSAtOTIwOTk5MTkyLiAtPiAtMi42NDM0MDk0MEUtMzkxMDE1NjMzIEluZXhhY3QgUm91bmRlZAoreHBvdzQ1MSBwb3dlciAyODcwMTUzOC43RS0zOTEwMTU2NDkgLTkyMDk5OTE5MiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NTEgcmVtYWluZGVyIDI4NzAxNTM4LjdFLTM5MTAxNTY0OSAtOTIwOTk5MTkyLiAtPiAyLjg3MDE1Mzg3RS0zOTEwMTU2NDIKK3hzdWI0NTEgc3VidHJhY3QgMjg3MDE1MzguN0UtMzkxMDE1NjQ5IC05MjA5OTkxOTIuIC0+IDkyMDk5OTE5MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NTIgYWRkIC0zNjEzODI1NzUuIC03OTc2LjE1Mjg2RSs4OTg0OTExNjkgLT4gLTcuOTc2MTUyODZFKzg5ODQ5MTE3MiBJbmV4YWN0IFJvdW5kZWQKK3hjb200NTIgY29tcGFyZSAtMzYxMzgyNTc1LiAtNzk3Ni4xNTI4NkUrODk4NDkxMTY5IC0+IDEKK3hkaXY0NTIgZGl2aWRlIC0zNjEzODI1NzUuIC03OTc2LjE1Mjg2RSs4OTg0OTExNjkgLT4gNC41MzA3ODc5OEUtODk4NDkxMTY1IEluZXhhY3QgUm91bmRlZAoreGR2aTQ1MiBkaXZpZGVpbnQgLTM2MTM4MjU3NS4gLTc5NzYuMTUyODZFKzg5ODQ5MTE2OSAtPiAwCit4bXVsNDUyIG11bHRpcGx5IC0zNjEzODI1NzUuIC03OTc2LjE1Mjg2RSs4OTg0OTExNjkgLT4gMi44ODI0NDI2NkUrODk4NDkxMTgxIEluZXhhY3QgUm91bmRlZAoreHBvdzQ1MiBwb3dlciAtMzYxMzgyNTc1LiAtOCAtPiAzLjQzNzY1NTM3RS02OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NTIgcmVtYWluZGVyIC0zNjEzODI1NzUuIC03OTc2LjE1Mjg2RSs4OTg0OTExNjkgLT4gLTM2MTM4MjU3NQoreHN1YjQ1MiBzdWJ0cmFjdCAtMzYxMzgyNTc1LiAtNzk3Ni4xNTI4NkUrODk4NDkxMTY5IC0+IDcuOTc2MTUyODZFKzg5ODQ5MTE3MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NTMgYWRkIDcwMjE4MDUuNjEgMTIyMjk1Mi44MyAtPiA4MjQ0NzU4LjQ0Cit4Y29tNDUzIGNvbXBhcmUgNzAyMTgwNS42MSAxMjIyOTUyLjgzIC0+IDEKK3hkaXY0NTMgZGl2aWRlIDcwMjE4MDUuNjEgMTIyMjk1Mi44MyAtPiA1Ljc0MTY4MTQ4IEluZXhhY3QgUm91bmRlZAoreGR2aTQ1MyBkaXZpZGVpbnQgNzAyMTgwNS42MSAxMjIyOTUyLjgzIC0+IDUKK3htdWw0NTMgbXVsdGlwbHkgNzAyMTgwNS42MSAxMjIyOTUyLjgzIC0+IDguNTg3MzM3MDRFKzEyIEluZXhhY3QgUm91bmRlZAoreHBvdzQ1MyBwb3dlciA3MDIxODA1LjYxIDEyMjI5NTMgLT4gMS4yNjU0MDU1M0UrODM3Mjg4NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NTMgcmVtYWluZGVyIDcwMjE4MDUuNjEgMTIyMjk1Mi44MyAtPiA5MDcwNDEuNDYKK3hzdWI0NTMgc3VidHJhY3QgNzAyMTgwNS42MSAxMjIyOTUyLjgzIC0+IDU3OTg4NTIuNzgKK3hhZGQ0NTQgYWRkIC00MC40ODExNjY3IC03OTY1NS41NjM1IC0+IC03OTY5Ni4wNDQ3IEluZXhhY3QgUm91bmRlZAoreGNvbTQ1NCBjb21wYXJlIC00MC40ODExNjY3IC03OTY1NS41NjM1IC0+IDEKK3hkaXY0NTQgZGl2aWRlIC00MC40ODExNjY3IC03OTY1NS41NjM1IC0+IDAuMDAwNTA4MjAyNjI4IEluZXhhY3QgUm91bmRlZAoreGR2aTQ1NCBkaXZpZGVpbnQgLTQwLjQ4MTE2NjcgLTc5NjU1LjU2MzUgLT4gMAoreG11bDQ1NCBtdWx0aXBseSAtNDAuNDgxMTY2NyAtNzk2NTUuNTYzNSAtPiAzMjI0NTUwLjE0IEluZXhhY3QgUm91bmRlZAoreHBvdzQ1NCBwb3dlciAtNDAuNDgxMTY2NyAtNzk2NTYgLT4gNC41MDE3NDI3NUUtMTI4MDI4IEluZXhhY3QgUm91bmRlZAoreHJlbTQ1NCByZW1haW5kZXIgLTQwLjQ4MTE2NjcgLTc5NjU1LjU2MzUgLT4gLTQwLjQ4MTE2NjcKK3hzdWI0NTQgc3VidHJhY3QgLTQwLjQ4MTE2NjcgLTc5NjU1LjU2MzUgLT4gNzk2MTUuMDgyMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NTUgYWRkIC04NzU1Njc0LjM4RSsxMTcxNjgxNzcgMTQ4LjkwMzQwNCAtPiAtOC43NTU2NzQzOEUrMTE3MTY4MTgzIEluZXhhY3QgUm91bmRlZAoreGNvbTQ1NSBjb21wYXJlIC04NzU1Njc0LjM4RSsxMTcxNjgxNzcgMTQ4LjkwMzQwNCAtPiAtMQoreGRpdjQ1NSBkaXZpZGUgLTg3NTU2NzQuMzhFKzExNzE2ODE3NyAxNDguOTAzNDA0IC0+IC01Ljg4MDEwMzU3RSsxMTcxNjgxODEgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDU1IGRpdmlkZWludCAtODc1NTY3NC4zOEUrMTE3MTY4MTc3IDE0OC45MDM0MDQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0NTUgbXVsdGlwbHkgLTg3NTU2NzQuMzhFKzExNzE2ODE3NyAxNDguOTAzNDA0IC0+IC0xLjMwMzc0OTcyRSsxMTcxNjgxODYgSW5leGFjdCBSb3VuZGVkCit4cG93NDU1IHBvd2VyIC04NzU1Njc0LjM4RSsxMTcxNjgxNzcgMTQ5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NTUgcmVtYWluZGVyIC04NzU1Njc0LjM4RSsxMTcxNjgxNzcgMTQ4LjkwMzQwNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ1NSBzdWJ0cmFjdCAtODc1NTY3NC4zOEUrMTE3MTY4MTc3IDE0OC45MDM0MDQgLT4gLTguNzU1Njc0MzhFKzExNzE2ODE4MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NTYgYWRkIDM0LjUzMjk3ODFFKzM4MjgyOTM5MiAtNDUuMjE3NzMwOSAtPiAzLjQ1MzI5NzgxRSszODI4MjkzOTMgSW5leGFjdCBSb3VuZGVkCit4Y29tNDU2IGNvbXBhcmUgMzQuNTMyOTc4MUUrMzgyODI5MzkyIC00NS4yMTc3MzA5IC0+IDEKK3hkaXY0NTYgZGl2aWRlIDM0LjUzMjk3ODFFKzM4MjgyOTM5MiAtNDUuMjE3NzMwOSAtPiAtNy42MzcwNDM1N0UrMzgyODI5MzkxIEluZXhhY3QgUm91bmRlZAoreGR2aTQ1NiBkaXZpZGVpbnQgMzQuNTMyOTc4MUUrMzgyODI5MzkyIC00NS4yMTc3MzA5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDU2IG11bHRpcGx5IDM0LjUzMjk3ODFFKzM4MjgyOTM5MiAtNDUuMjE3NzMwOSAtPiAtMS41NjE1MDI5MUUrMzgyODI5Mzk1IEluZXhhY3QgUm91bmRlZAoreHBvdzQ1NiBwb3dlciAzNC41MzI5NzgxRSszODI4MjkzOTIgLTQ1IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ1NiByZW1haW5kZXIgMzQuNTMyOTc4MUUrMzgyODI5MzkyIC00NS4yMTc3MzA5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDU2IHN1YnRyYWN0IDM0LjUzMjk3ODFFKzM4MjgyOTM5MiAtNDUuMjE3NzMwOSAtPiAzLjQ1MzI5NzgxRSszODI4MjkzOTMgSW5leGFjdCBSb3VuZGVkCit4YWRkNDU3IGFkZCAtMzc5NTg0NzYuMCA1ODQzNjcuOTM1IC0+IC0zNzM3NDEwOC4xIEluZXhhY3QgUm91bmRlZAoreGNvbTQ1NyBjb21wYXJlIC0zNzk1ODQ3Ni4wIDU4NDM2Ny45MzUgLT4gLTEKK3hkaXY0NTcgZGl2aWRlIC0zNzk1ODQ3Ni4wIDU4NDM2Ny45MzUgLT4gLTY0Ljk1NjQ2NjIgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDU3IGRpdmlkZWludCAtMzc5NTg0NzYuMCA1ODQzNjcuOTM1IC0+IC02NAoreG11bDQ1NyBtdWx0aXBseSAtMzc5NTg0NzYuMCA1ODQzNjcuOTM1IC0+IC0yLjIxODE3MTYyRSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NTcgcG93ZXIgLTM3OTU4NDc2LjAgNTg0MzY4IC0+IDMuMjA1MzgyNjhFKzQ0MjkxMDUgSW5leGFjdCBSb3VuZGVkCit4cmVtNDU3IHJlbWFpbmRlciAtMzc5NTg0NzYuMCA1ODQzNjcuOTM1IC0+IC01NTg5MjguMTYwCit4c3ViNDU3IHN1YnRyYWN0IC0zNzk1ODQ3Ni4wIDU4NDM2Ny45MzUgLT4gLTM4NTQyODQzLjkgSW5leGFjdCBSb3VuZGVkCit4YWRkNDU4IGFkZCA0OTUyMzMuNTUzRS00MTQxNTIyMTUgNjIzNTI3NTkuMiAtPiA2MjM1Mjc1OS4yIEluZXhhY3QgUm91bmRlZAoreGNvbTQ1OCBjb21wYXJlIDQ5NTIzMy41NTNFLTQxNDE1MjIxNSA2MjM1Mjc1OS4yIC0+IC0xCit4ZGl2NDU4IGRpdmlkZSA0OTUyMzMuNTUzRS00MTQxNTIyMTUgNjIzNTI3NTkuMiAtPiA3Ljk0MjQ0ODA5RS00MTQxNTIyMTggSW5leGFjdCBSb3VuZGVkCit4ZHZpNDU4IGRpdmlkZWludCA0OTUyMzMuNTUzRS00MTQxNTIyMTUgNjIzNTI3NTkuMiAtPiAwCit4bXVsNDU4IG11bHRpcGx5IDQ5NTIzMy41NTNFLTQxNDE1MjIxNSA2MjM1Mjc1OS4yIC0+IDMuMDg3OTE3ODVFLTQxNDE1MjIwMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NTggcG93ZXIgNDk1MjMzLjU1M0UtNDE0MTUyMjE1IDYyMzUyNzU5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ1OCByZW1haW5kZXIgNDk1MjMzLjU1M0UtNDE0MTUyMjE1IDYyMzUyNzU5LjIgLT4gNC45NTIzMzU1M0UtNDE0MTUyMjEwCit4c3ViNDU4IHN1YnRyYWN0IDQ5NTIzMy41NTNFLTQxNDE1MjIxNSA2MjM1Mjc1OS4yIC0+IC02MjM1Mjc1OS4yIEluZXhhY3QgUm91bmRlZAoreGFkZDQ1OSBhZGQgLTUwMjM0MzA2MCAtOTY4MjguOTk0IC0+IC01MDI0Mzk4ODkgSW5leGFjdCBSb3VuZGVkCit4Y29tNDU5IGNvbXBhcmUgLTUwMjM0MzA2MCAtOTY4MjguOTk0IC0+IC0xCit4ZGl2NDU5IGRpdmlkZSAtNTAyMzQzMDYwIC05NjgyOC45OTQgLT4gNTE4Ny45NDA1MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NTkgZGl2aWRlaW50IC01MDIzNDMwNjAgLTk2ODI4Ljk5NCAtPiA1MTg3Cit4bXVsNDU5IG11bHRpcGx5IC01MDIzNDMwNjAgLTk2ODI4Ljk5NCAtPiA0Ljg2NDEzNzMxRSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NTkgcG93ZXIgLTUwMjM0MzA2MCAtOTY4MjkgLT4gLTYuNzg2MDIxMTlFLTg0MjUxMCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NTkgcmVtYWluZGVyIC01MDIzNDMwNjAgLTk2ODI4Ljk5NCAtPiAtOTEwNjguMTIyCit4c3ViNDU5IHN1YnRyYWN0IC01MDIzNDMwNjAgLTk2ODI4Ljk5NCAtPiAtNTAyMjQ2MjMxIEluZXhhY3QgUm91bmRlZAoreGFkZDQ2MCBhZGQgLTIyLjQzOTYzOUUrOTE2MzYyODc4IC0zOS40MDM3NjgxIC0+IC0yLjI0Mzk2MzkwRSs5MTYzNjI4NzkgSW5leGFjdCBSb3VuZGVkCit4Y29tNDYwIGNvbXBhcmUgLTIyLjQzOTYzOUUrOTE2MzYyODc4IC0zOS40MDM3NjgxIC0+IC0xCit4ZGl2NDYwIGRpdmlkZSAtMjIuNDM5NjM5RSs5MTYzNjI4NzggLTM5LjQwMzc2ODEgLT4gNS42OTQ3OTUyMUUrOTE2MzYyODc3IEluZXhhY3QgUm91bmRlZAoreGR2aTQ2MCBkaXZpZGVpbnQgLTIyLjQzOTYzOUUrOTE2MzYyODc4IC0zOS40MDM3NjgxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDYwIG11bHRpcGx5IC0yMi40Mzk2MzlFKzkxNjM2Mjg3OCAtMzkuNDAzNzY4MSAtPiA4Ljg0MjA2MzMxRSs5MTYzNjI4ODAgSW5leGFjdCBSb3VuZGVkCit4cG93NDYwIHBvd2VyIC0yMi40Mzk2MzlFKzkxNjM2Mjg3OCAtMzkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ2MCByZW1haW5kZXIgLTIyLjQzOTYzOUUrOTE2MzYyODc4IC0zOS40MDM3NjgxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDYwIHN1YnRyYWN0IC0yMi40Mzk2MzlFKzkxNjM2Mjg3OCAtMzkuNDAzNzY4MSAtPiAtMi4yNDM5NjM5MEUrOTE2MzYyODc5IEluZXhhY3QgUm91bmRlZAoreGFkZDQ2MSBhZGQgNzE4MTgwLjU4N0UtOTU3NDczNzIyIDEuNjYyMjM0NDMgLT4gMS42NjIyMzQ0MyBJbmV4YWN0IFJvdW5kZWQKK3hjb200NjEgY29tcGFyZSA3MTgxODAuNTg3RS05NTc0NzM3MjIgMS42NjIyMzQ0MyAtPiAtMQoreGRpdjQ2MSBkaXZpZGUgNzE4MTgwLjU4N0UtOTU3NDczNzIyIDEuNjYyMjM0NDMgLT4gNC4zMjA1NzM0MEUtOTU3NDczNzE3IEluZXhhY3QgUm91bmRlZAoreGR2aTQ2MSBkaXZpZGVpbnQgNzE4MTgwLjU4N0UtOTU3NDczNzIyIDEuNjYyMjM0NDMgLT4gMAoreG11bDQ2MSBtdWx0aXBseSA3MTgxODAuNTg3RS05NTc0NzM3MjIgMS42NjIyMzQ0MyAtPiAxLjE5Mzc4NDUwRS05NTc0NzM3MTYgSW5leGFjdCBSb3VuZGVkCit4cG93NDYxIHBvd2VyIDcxODE4MC41ODdFLTk1NzQ3MzcyMiAyIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ2MSByZW1haW5kZXIgNzE4MTgwLjU4N0UtOTU3NDczNzIyIDEuNjYyMjM0NDMgLT4gNy4xODE4MDU4N0UtOTU3NDczNzE3Cit4c3ViNDYxIHN1YnRyYWN0IDcxODE4MC41ODdFLTk1NzQ3MzcyMiAxLjY2MjIzNDQzIC0+IC0xLjY2MjIzNDQzIEluZXhhY3QgUm91bmRlZAoreGFkZDQ2MiBhZGQgLTUxNTkyLjI2OTggLTcxMzg4NS43NDEgLT4gLTc2NTQ3OC4wMTEgSW5leGFjdCBSb3VuZGVkCit4Y29tNDYyIGNvbXBhcmUgLTUxNTkyLjI2OTggLTcxMzg4NS43NDEgLT4gMQoreGRpdjQ2MiBkaXZpZGUgLTUxNTkyLjI2OTggLTcxMzg4NS43NDEgLT4gMC4wNzIyNjk2NDYwIEluZXhhY3QgUm91bmRlZAoreGR2aTQ2MiBkaXZpZGVpbnQgLTUxNTkyLjI2OTggLTcxMzg4NS43NDEgLT4gMAoreG11bDQ2MiBtdWx0aXBseSAtNTE1OTIuMjY5OCAtNzEzODg1Ljc0MSAtPiAzLjY4MzA5ODU4RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NjIgcG93ZXIgLTUxNTkyLjI2OTggLTcxMzg4NiAtPiA2LjM4NTc2OTIwRS0zMzY0MjQ5IEluZXhhY3QgUm91bmRlZAoreHJlbTQ2MiByZW1haW5kZXIgLTUxNTkyLjI2OTggLTcxMzg4NS43NDEgLT4gLTUxNTkyLjI2OTgKK3hzdWI0NjIgc3VidHJhY3QgLTUxNTkyLjI2OTggLTcxMzg4NS43NDEgLT4gNjYyMjkzLjQ3MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NjMgYWRkIDUxLjIyNzk4NDhFKzgwNDM5NzQ1IDIwNy41NTkyNUUrODY1MTY1MDcwIC0+IDIuMDc1NTkyNTBFKzg2NTE2NTA3MiBJbmV4YWN0IFJvdW5kZWQKK3hjb200NjMgY29tcGFyZSA1MS4yMjc5ODQ4RSs4MDQzOTc0NSAyMDcuNTU5MjVFKzg2NTE2NTA3MCAtPiAtMQoreGRpdjQ2MyBkaXZpZGUgNTEuMjI3OTg0OEUrODA0Mzk3NDUgMjA3LjU1OTI1RSs4NjUxNjUwNzAgLT4gMi40NjgxMTM3OUUtNzg0NzI1MzI2IEluZXhhY3QgUm91bmRlZAoreGR2aTQ2MyBkaXZpZGVpbnQgNTEuMjI3OTg0OEUrODA0Mzk3NDUgMjA3LjU1OTI1RSs4NjUxNjUwNzAgLT4gMAoreG11bDQ2MyBtdWx0aXBseSA1MS4yMjc5ODQ4RSs4MDQzOTc0NSAyMDcuNTU5MjVFKzg2NTE2NTA3MCAtPiAxLjA2MzI4NDIxRSs5NDU2MDQ4MTkgSW5leGFjdCBSb3VuZGVkCit4cG93NDYzIHBvd2VyIDUxLjIyNzk4NDhFKzgwNDM5NzQ1IDIgLT4gMi42MjQzMDY0M0UrMTYwODc5NDkzIEluZXhhY3QgUm91bmRlZAoreHJlbTQ2MyByZW1haW5kZXIgNTEuMjI3OTg0OEUrODA0Mzk3NDUgMjA3LjU1OTI1RSs4NjUxNjUwNzAgLT4gNS4xMjI3OTg0OEUrODA0Mzk3NDYKK3hzdWI0NjMgc3VidHJhY3QgNTEuMjI3OTg0OEUrODA0Mzk3NDUgMjA3LjU1OTI1RSs4NjUxNjUwNzAgLT4gLTIuMDc1NTkyNTBFKzg2NTE2NTA3MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NjQgYWRkIC01OTgzLjIzNDY4IC0zOS45NTQ0NTEzIC0+IC02MDIzLjE4OTEzIEluZXhhY3QgUm91bmRlZAoreGNvbTQ2NCBjb21wYXJlIC01OTgzLjIzNDY4IC0zOS45NTQ0NTEzIC0+IC0xCit4ZGl2NDY0IGRpdmlkZSAtNTk4My4yMzQ2OCAtMzkuOTU0NDUxMyAtPiAxNDkuNzUxMzkyIEluZXhhY3QgUm91bmRlZAoreGR2aTQ2NCBkaXZpZGVpbnQgLTU5ODMuMjM0NjggLTM5Ljk1NDQ1MTMgLT4gMTQ5Cit4bXVsNDY0IG11bHRpcGx5IC01OTgzLjIzNDY4IC0zOS45NTQ0NTEzIC0+IDIzOTA1Ni44NTkgSW5leGFjdCBSb3VuZGVkCit4cG93NDY0IHBvd2VyIC01OTgzLjIzNDY4IC00MCAtPiA4LjM2Njc4MjkxRS0xNTIgSW5leGFjdCBSb3VuZGVkCit4cmVtNDY0IHJlbWFpbmRlciAtNTk4My4yMzQ2OCAtMzkuOTU0NDUxMyAtPiAtMzAuMDIxNDM2MworeHN1YjQ2NCBzdWJ0cmFjdCAtNTk4My4yMzQ2OCAtMzkuOTU0NDUxMyAtPiAtNTk0My4yODAyMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NjUgYWRkIDkyMTYzOTMzMi5FLTkxNzU0Mjk2MyAyODczMjUuODkxIC0+IDI4NzMyNS44OTEgSW5leGFjdCBSb3VuZGVkCit4Y29tNDY1IGNvbXBhcmUgOTIxNjM5MzMyLkUtOTE3NTQyOTYzIDI4NzMyNS44OTEgLT4gLTEKK3hkaXY0NjUgZGl2aWRlIDkyMTYzOTMzMi5FLTkxNzU0Mjk2MyAyODczMjUuODkxIC0+IDMuMjA3NjQ0NTZFLTkxNzU0Mjk2MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NjUgZGl2aWRlaW50IDkyMTYzOTMzMi5FLTkxNzU0Mjk2MyAyODczMjUuODkxIC0+IDAKK3htdWw0NjUgbXVsdGlwbHkgOTIxNjM5MzMyLkUtOTE3NTQyOTYzIDI4NzMyNS44OTEgLT4gMi42NDgxMDg0MkUtOTE3NTQyOTQ5IEluZXhhY3QgUm91bmRlZAoreHBvdzQ2NSBwb3dlciA5MjE2MzkzMzIuRS05MTc1NDI5NjMgMjg3MzI2IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ2NSByZW1haW5kZXIgOTIxNjM5MzMyLkUtOTE3NTQyOTYzIDI4NzMyNS44OTEgLT4gOS4yMTYzOTMzMkUtOTE3NTQyOTU1Cit4c3ViNDY1IHN1YnRyYWN0IDkyMTYzOTMzMi5FLTkxNzU0Mjk2MyAyODczMjUuODkxIC0+IC0yODczMjUuODkxIEluZXhhY3QgUm91bmRlZAoreGFkZDQ2NiBhZGQgOTEwOTU5MTYuOEUtNzg3MzEyOTY5IC01ODY0My40MThFKzU4MTg5ODgwIC0+IC01Ljg2NDM0MTgwRSs1ODE4OTg4NCBJbmV4YWN0IFJvdW5kZWQKK3hjb200NjYgY29tcGFyZSA5MTA5NTkxNi44RS03ODczMTI5NjkgLTU4NjQzLjQxOEUrNTgxODk4ODAgLT4gMQoreGRpdjQ2NiBkaXZpZGUgOTEwOTU5MTYuOEUtNzg3MzEyOTY5IC01ODY0My40MThFKzU4MTg5ODgwIC0+IC0xLjU1MzM4Njg5RS04NDU1MDI4NDYgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDY2IGRpdmlkZWludCA5MTA5NTkxNi44RS03ODczMTI5NjkgLTU4NjQzLjQxOEUrNTgxODk4ODAgLT4gLTAKK3htdWw0NjYgbXVsdGlwbHkgOTEwOTU5MTYuOEUtNzg3MzEyOTY5IC01ODY0My40MThFKzU4MTg5ODgwIC0+IC01LjM0MjE3NTkzRS03MjkxMjMwNzcgSW5leGFjdCBSb3VuZGVkCit4cG93NDY2IHBvd2VyIDkxMDk1OTE2LjhFLTc4NzMxMjk2OSAtNiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NjYgcmVtYWluZGVyIDkxMDk1OTE2LjhFLTc4NzMxMjk2OSAtNTg2NDMuNDE4RSs1ODE4OTg4MCAtPiA5LjEwOTU5MTY4RS03ODczMTI5NjIKK3hzdWI0NjYgc3VidHJhY3QgOTEwOTU5MTYuOEUtNzg3MzEyOTY5IC01ODY0My40MThFKzU4MTg5ODgwIC0+IDUuODY0MzQxODBFKzU4MTg5ODg0IEluZXhhY3QgUm91bmRlZAoreGFkZDQ2NyBhZGQgLTY0MTAuNTU1NSAtMjM0OTY0MjU5IC0+IC0yMzQ5NzA2NzAgSW5leGFjdCBSb3VuZGVkCit4Y29tNDY3IGNvbXBhcmUgLTY0MTAuNTU1NSAtMjM0OTY0MjU5IC0+IDEKK3hkaXY0NjcgZGl2aWRlIC02NDEwLjU1NTUgLTIzNDk2NDI1OSAtPiAwLjAwMDAyNzI4MzEwOTAgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDY3IGRpdmlkZWludCAtNjQxMC41NTU1IC0yMzQ5NjQyNTkgLT4gMAoreG11bDQ2NyBtdWx0aXBseSAtNjQxMC41NTU1IC0yMzQ5NjQyNTkgLT4gMS41MDYyNTE0MkUrMTIgSW5leGFjdCBSb3VuZGVkCit4cG93NDY3IHBvd2VyIC02NDEwLjU1NTUgLTIzNDk2NDI1OSAtPiAtMS4yNzA2NDQ2N0UtODk0NDg0NDE5IEluZXhhY3QgUm91bmRlZAoreHJlbTQ2NyByZW1haW5kZXIgLTY0MTAuNTU1NSAtMjM0OTY0MjU5IC0+IC02NDEwLjU1NTUKK3hzdWI0Njcgc3VidHJhY3QgLTY0MTAuNTU1NSAtMjM0OTY0MjU5IC0+IDIzNDk1Nzg0OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NjggYWRkIC01LjMyNzExNjA2IC04NDQ3Mjg2LjIxIC0+IC04NDQ3MjkxLjU0IEluZXhhY3QgUm91bmRlZAoreGNvbTQ2OCBjb21wYXJlIC01LjMyNzExNjA2IC04NDQ3Mjg2LjIxIC0+IDEKK3hkaXY0NjggZGl2aWRlIC01LjMyNzExNjA2IC04NDQ3Mjg2LjIxIC0+IDYuMzA2MzA0NjhFLTcgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDY4IGRpdmlkZWludCAtNS4zMjcxMTYwNiAtODQ0NzI4Ni4yMSAtPiAwCit4bXVsNDY4IG11bHRpcGx5IC01LjMyNzExNjA2IC04NDQ3Mjg2LjIxIC0+IDQ0OTk5Njc0LjAgSW5leGFjdCBSb3VuZGVkCit4cG93NDY4IHBvd2VyIC01LjMyNzExNjA2IC04NDQ3Mjg2IC0+IDkuMDkxMzg3MjhFLTYxMzY4ODggSW5leGFjdCBSb3VuZGVkCit4cmVtNDY4IHJlbWFpbmRlciAtNS4zMjcxMTYwNiAtODQ0NzI4Ni4yMSAtPiAtNS4zMjcxMTYwNgoreHN1YjQ2OCBzdWJ0cmFjdCAtNS4zMjcxMTYwNiAtODQ0NzI4Ni4yMSAtPiA4NDQ3MjgwLjg4IEluZXhhY3QgUm91bmRlZAoreGFkZDQ2OSBhZGQgLTgyMjcyMTcxLjggLTc3Ni4yMzg1ODdFLTM3MjY5MDQxNiAtPiAtODIyNzIxNzEuOCBJbmV4YWN0IFJvdW5kZWQKK3hjb200NjkgY29tcGFyZSAtODIyNzIxNzEuOCAtNzc2LjIzODU4N0UtMzcyNjkwNDE2IC0+IC0xCit4ZGl2NDY5IGRpdmlkZSAtODIyNzIxNzEuOCAtNzc2LjIzODU4N0UtMzcyNjkwNDE2IC0+IDEuMDU5ODgyNTNFKzM3MjY5MDQyMSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NjkgZGl2aWRlaW50IC04MjI3MjE3MS44IC03NzYuMjM4NTg3RS0zNzI2OTA0MTYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0NjkgbXVsdGlwbHkgLTgyMjcyMTcxLjggLTc3Ni4yMzg1ODdFLTM3MjY5MDQxNiAtPiA2LjM4NjI4MzQ0RS0zNzI2OTA0MDYgSW5leGFjdCBSb3VuZGVkCit4cG93NDY5IHBvd2VyIC04MjI3MjE3MS44IC04IC0+IDQuNzY0MDQ5OTRFLTY0IEluZXhhY3QgUm91bmRlZAoreHJlbTQ2OSByZW1haW5kZXIgLTgyMjcyMTcxLjggLTc3Ni4yMzg1ODdFLTM3MjY5MDQxNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ2OSBzdWJ0cmFjdCAtODIyNzIxNzEuOCAtNzc2LjIzODU4N0UtMzcyNjkwNDE2IC0+IC04MjI3MjE3MS44IEluZXhhY3QgUm91bmRlZAoreGFkZDQ3MCBhZGQgNDEyNDExMjQ0LkUtNzc0MzM5MjY0IDg2NjQ1Mi40NjUgLT4gODY2NDUyLjQ2NSBJbmV4YWN0IFJvdW5kZWQKK3hjb200NzAgY29tcGFyZSA0MTI0MTEyNDQuRS03NzQzMzkyNjQgODY2NDUyLjQ2NSAtPiAtMQoreGRpdjQ3MCBkaXZpZGUgNDEyNDExMjQ0LkUtNzc0MzM5MjY0IDg2NjQ1Mi40NjUgLT4gNC43NTk3Njc2OEUtNzc0MzM5MjYyIEluZXhhY3QgUm91bmRlZAoreGR2aTQ3MCBkaXZpZGVpbnQgNDEyNDExMjQ0LkUtNzc0MzM5MjY0IDg2NjQ1Mi40NjUgLT4gMAoreG11bDQ3MCBtdWx0aXBseSA0MTI0MTEyNDQuRS03NzQzMzkyNjQgODY2NDUyLjQ2NSAtPiAzLjU3MzM0NzM5RS03NzQzMzkyNTAgSW5leGFjdCBSb3VuZGVkCit4cG93NDcwIHBvd2VyIDQxMjQxMTI0NC5FLTc3NDMzOTI2NCA4NjY0NTIgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDcwIHJlbWFpbmRlciA0MTI0MTEyNDQuRS03NzQzMzkyNjQgODY2NDUyLjQ2NSAtPiA0LjEyNDExMjQ0RS03NzQzMzkyNTYKK3hzdWI0NzAgc3VidHJhY3QgNDEyNDExMjQ0LkUtNzc0MzM5MjY0IDg2NjQ1Mi40NjUgLT4gLTg2NjQ1Mi40NjUgSW5leGFjdCBSb3VuZGVkCit4YWRkNDcxIGFkZCAtMTAzLjQ3NDU5OCAtMy4wMTY2MDY2MUUtNDQ2NjYxMjU3IC0+IC0xMDMuNDc0NTk4IEluZXhhY3QgUm91bmRlZAoreGNvbTQ3MSBjb21wYXJlIC0xMDMuNDc0NTk4IC0zLjAxNjYwNjYxRS00NDY2NjEyNTcgLT4gLTEKK3hkaXY0NzEgZGl2aWRlIC0xMDMuNDc0NTk4IC0zLjAxNjYwNjYxRS00NDY2NjEyNTcgLT4gMy40MzAxNjU0NkUrNDQ2NjYxMjU4IEluZXhhY3QgUm91bmRlZAoreGR2aTQ3MSBkaXZpZGVpbnQgLTEwMy40NzQ1OTggLTMuMDE2NjA2NjFFLTQ0NjY2MTI1NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQ3MSBtdWx0aXBseSAtMTAzLjQ3NDU5OCAtMy4wMTY2MDY2MUUtNDQ2NjYxMjU3IC0+IDMuMTIxNDIxNTZFLTQ0NjY2MTI1NSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NzEgcG93ZXIgLTEwMy40NzQ1OTggLTMgLT4gLTkuMDI2MDcxMjNFLTcgSW5leGFjdCBSb3VuZGVkCit4cmVtNDcxIHJlbWFpbmRlciAtMTAzLjQ3NDU5OCAtMy4wMTY2MDY2MUUtNDQ2NjYxMjU3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDcxIHN1YnRyYWN0IC0xMDMuNDc0NTk4IC0zLjAxNjYwNjYxRS00NDY2NjEyNTcgLT4gLTEwMy40NzQ1OTggSW5leGFjdCBSb3VuZGVkCit4YWRkNDcyIGFkZCAtMzEwMjcuODMyMyAtNDc1Mzc4MTg2LiAtPiAtNDc1NDA5MjE0IEluZXhhY3QgUm91bmRlZAoreGNvbTQ3MiBjb21wYXJlIC0zMTAyNy44MzIzIC00NzUzNzgxODYuIC0+IDEKK3hkaXY0NzIgZGl2aWRlIC0zMTAyNy44MzIzIC00NzUzNzgxODYuIC0+IDAuMDAwMDY1MjY5Nzg1NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NzIgZGl2aWRlaW50IC0zMTAyNy44MzIzIC00NzUzNzgxODYuIC0+IDAKK3htdWw0NzIgbXVsdGlwbHkgLTMxMDI3LjgzMjMgLTQ3NTM3ODE4Ni4gLT4gMS40NzQ5OTU0NkUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93NDcyIHBvd2VyIC0zMTAyNy44MzIzIC00NzUzNzgxODYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDcyIHJlbWFpbmRlciAtMzEwMjcuODMyMyAtNDc1Mzc4MTg2LiAtPiAtMzEwMjcuODMyMworeHN1YjQ3MiBzdWJ0cmFjdCAtMzEwMjcuODMyMyAtNDc1Mzc4MTg2LiAtPiA0NzUzNDcxNTggSW5leGFjdCBSb3VuZGVkCit4YWRkNDczIGFkZCAtMTE5OTMzOS43MiAtNS43MzA2ODM5MkUrNTM3NzQ2MzIgLT4gLTUuNzMwNjgzOTJFKzUzNzc0NjMyIEluZXhhY3QgUm91bmRlZAoreGNvbTQ3MyBjb21wYXJlIC0xMTk5MzM5LjcyIC01LjczMDY4MzkyRSs1Mzc3NDYzMiAtPiAxCit4ZGl2NDczIGRpdmlkZSAtMTE5OTMzOS43MiAtNS43MzA2ODM5MkUrNTM3NzQ2MzIgLT4gMi4wOTI4Mzg3MkUtNTM3NzQ2MjcgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDczIGRpdmlkZWludCAtMTE5OTMzOS43MiAtNS43MzA2ODM5MkUrNTM3NzQ2MzIgLT4gMAoreG11bDQ3MyBtdWx0aXBseSAtMTE5OTMzOS43MiAtNS43MzA2ODM5MkUrNTM3NzQ2MzIgLT4gNi44NzMwMzY4NUUrNTM3NzQ2MzggSW5leGFjdCBSb3VuZGVkCit4cG93NDczIHBvd2VyIC0xMTk5MzM5LjcyIC02IC0+IDMuMzYwMDU3NDFFLTM3IEluZXhhY3QgUm91bmRlZAoreHJlbTQ3MyByZW1haW5kZXIgLTExOTkzMzkuNzIgLTUuNzMwNjgzOTJFKzUzNzc0NjMyIC0+IC0xMTk5MzM5LjcyCit4c3ViNDczIHN1YnRyYWN0IC0xMTk5MzM5LjcyIC01LjczMDY4MzkyRSs1Mzc3NDYzMiAtPiA1LjczMDY4MzkyRSs1Mzc3NDYzMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NzQgYWRkIC03MzI5MDguOTMwRSszNjQzNDU0MzMgLTM0ODYxNDYuMjYgLT4gLTcuMzI5MDg5MzBFKzM2NDM0NTQzOCBJbmV4YWN0IFJvdW5kZWQKK3hjb200NzQgY29tcGFyZSAtNzMyOTA4LjkzMEUrMzY0MzQ1NDMzIC0zNDg2MTQ2LjI2IC0+IC0xCit4ZGl2NDc0IGRpdmlkZSAtNzMyOTA4LjkzMEUrMzY0MzQ1NDMzIC0zNDg2MTQ2LjI2IC0+IDIuMTAyMzQ3MDVFKzM2NDM0NTQzMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NzQgZGl2aWRlaW50IC03MzI5MDguOTMwRSszNjQzNDU0MzMgLTM0ODYxNDYuMjYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0NzQgbXVsdGlwbHkgLTczMjkwOC45MzBFKzM2NDM0NTQzMyAtMzQ4NjE0Ni4yNiAtPiAyLjU1NTAyNzczRSszNjQzNDU0NDUgSW5leGFjdCBSb3VuZGVkCit4cG93NDc0IHBvd2VyIC03MzI5MDguOTMwRSszNjQzNDU0MzMgLTM0ODYxNDYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDc0IHJlbWFpbmRlciAtNzMyOTA4LjkzMEUrMzY0MzQ1NDMzIC0zNDg2MTQ2LjI2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDc0IHN1YnRyYWN0IC03MzI5MDguOTMwRSszNjQzNDU0MzMgLTM0ODYxNDYuMjYgLT4gLTcuMzI5MDg5MzBFKzM2NDM0NTQzOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NzUgYWRkIC0yMzc2MTUwLjgzIC00Njc3NzU4My4zIC0+IC00OTE1MzczNC4xIEluZXhhY3QgUm91bmRlZAoreGNvbTQ3NSBjb21wYXJlIC0yMzc2MTUwLjgzIC00Njc3NzU4My4zIC0+IDEKK3hkaXY0NzUgZGl2aWRlIC0yMzc2MTUwLjgzIC00Njc3NzU4My4zIC0+IDAuMDUwNzk2Nzg0NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NzUgZGl2aWRlaW50IC0yMzc2MTUwLjgzIC00Njc3NzU4My4zIC0+IDAKK3htdWw0NzUgbXVsdGlwbHkgLTIzNzYxNTAuODMgLTQ2Nzc3NTgzLjMgLT4gMS4xMTE1MDU5M0UrMTQgSW5leGFjdCBSb3VuZGVkCit4cG93NDc1IHBvd2VyIC0yMzc2MTUwLjgzIC00Njc3NzU4MyAtPiAtMy41MTg4NjE5M0UtMjk4MjQ3OTc2IEluZXhhY3QgUm91bmRlZAoreHJlbTQ3NSByZW1haW5kZXIgLTIzNzYxNTAuODMgLTQ2Nzc3NTgzLjMgLT4gLTIzNzYxNTAuODMKK3hzdWI0NzUgc3VidHJhY3QgLTIzNzYxNTAuODMgLTQ2Nzc3NTgzLjMgLT4gNDQ0MDE0MzIuNSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NzYgYWRkIDYuMzY2NDIxMSAtMTQwODU0OTA4LiAtPiAtMTQwODU0OTAyIEluZXhhY3QgUm91bmRlZAoreGNvbTQ3NiBjb21wYXJlIDYuMzY2NDIxMSAtMTQwODU0OTA4LiAtPiAxCit4ZGl2NDc2IGRpdmlkZSA2LjM2NjQyMTEgLTE0MDg1NDkwOC4gLT4gLTQuNTE5ODQzMjhFLTggSW5leGFjdCBSb3VuZGVkCit4ZHZpNDc2IGRpdmlkZWludCA2LjM2NjQyMTEgLTE0MDg1NDkwOC4gLT4gLTAKK3htdWw0NzYgbXVsdGlwbHkgNi4zNjY0MjExIC0xNDA4NTQ5MDguIC0+IC04OTY3NDE2NTggSW5leGFjdCBSb3VuZGVkCit4cG93NDc2IHBvd2VyIDYuMzY2NDIxMSAtMTQwODU0OTA4IC0+IDcuMjU0MzI4MDNFLTExMzIzMjYwOCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NzYgcmVtYWluZGVyIDYuMzY2NDIxMSAtMTQwODU0OTA4LiAtPiA2LjM2NjQyMTEKK3hzdWI0NzYgc3VidHJhY3QgNi4zNjY0MjExIC0xNDA4NTQ5MDguIC0+IDE0MDg1NDkxNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NzcgYWRkIC0xNS43OTE1MjIgMTkwMi4zMDIxMEUrOTA3NDE4NDQgLT4gMS45MDIzMDIxMEUrOTA3NDE4NDcgSW5leGFjdCBSb3VuZGVkCit4Y29tNDc3IGNvbXBhcmUgLTE1Ljc5MTUyMiAxOTAyLjMwMjEwRSs5MDc0MTg0NCAtPiAtMQoreGRpdjQ3NyBkaXZpZGUgLTE1Ljc5MTUyMiAxOTAyLjMwMjEwRSs5MDc0MTg0NCAtPiAtOC4zMDEyNjkyOUUtOTA3NDE4NDcgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDc3IGRpdmlkZWludCAtMTUuNzkxNTIyIDE5MDIuMzAyMTBFKzkwNzQxODQ0IC0+IC0wCit4bXVsNDc3IG11bHRpcGx5IC0xNS43OTE1MjIgMTkwMi4zMDIxMEUrOTA3NDE4NDQgLT4gLTMuMDA0MDI0NTVFKzkwNzQxODQ4IEluZXhhY3QgUm91bmRlZAoreHBvdzQ3NyBwb3dlciAtMTUuNzkxNTIyIDIgLT4gMjQ5LjM3MjE2NyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NzcgcmVtYWluZGVyIC0xNS43OTE1MjIgMTkwMi4zMDIxMEUrOTA3NDE4NDQgLT4gLTE1Ljc5MTUyMgoreHN1YjQ3NyBzdWJ0cmFjdCAtMTUuNzkxNTIyIDE5MDIuMzAyMTBFKzkwNzQxODQ0IC0+IC0xLjkwMjMwMjEwRSs5MDc0MTg0NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NzggYWRkIDE1MzU2LjE1MDVFKzM3Mzk1MDQyOSAyLjg4MDIwNDAwIC0+IDEuNTM1NjE1MDVFKzM3Mzk1MDQzMyBJbmV4YWN0IFJvdW5kZWQKK3hjb200NzggY29tcGFyZSAxNTM1Ni4xNTA1RSszNzM5NTA0MjkgMi44ODAyMDQwMCAtPiAxCit4ZGl2NDc4IGRpdmlkZSAxNTM1Ni4xNTA1RSszNzM5NTA0MjkgMi44ODAyMDQwMCAtPiA1LjMzMTYxOTA1RSszNzM5NTA0MzIgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDc4IGRpdmlkZWludCAxNTM1Ni4xNTA1RSszNzM5NTA0MjkgMi44ODAyMDQwMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQ3OCBtdWx0aXBseSAxNTM1Ni4xNTA1RSszNzM5NTA0MjkgMi44ODAyMDQwMCAtPiA0LjQyMjg4NDYxRSszNzM5NTA0MzMgSW5leGFjdCBSb3VuZGVkCit4cG93NDc4IHBvd2VyIDE1MzU2LjE1MDVFKzM3Mzk1MDQyOSAzIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTQ3OCByZW1haW5kZXIgMTUzNTYuMTUwNUUrMzczOTUwNDI5IDIuODgwMjA0MDAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0Nzggc3VidHJhY3QgMTUzNTYuMTUwNUUrMzczOTUwNDI5IDIuODgwMjA0MDAgLT4gMS41MzU2MTUwNUUrMzczOTUwNDMzIEluZXhhY3QgUm91bmRlZAoreGFkZDQ3OSBhZGQgLTMuMTIwMDEzMjZFKzMxODg4NDc2MiA5NTY3LjIxNTk1IC0+IC0zLjEyMDAxMzI2RSszMTg4ODQ3NjIgSW5leGFjdCBSb3VuZGVkCit4Y29tNDc5IGNvbXBhcmUgLTMuMTIwMDEzMjZFKzMxODg4NDc2MiA5NTY3LjIxNTk1IC0+IC0xCit4ZGl2NDc5IGRpdmlkZSAtMy4xMjAwMTMyNkUrMzE4ODg0NzYyIDk1NjcuMjE1OTUgLT4gLTMuMjYxMTUwNjZFKzMxODg4NDc1OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NzkgZGl2aWRlaW50IC0zLjEyMDAxMzI2RSszMTg4ODQ3NjIgOTU2Ny4yMTU5NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQ3OSBtdWx0aXBseSAtMy4xMjAwMTMyNkUrMzE4ODg0NzYyIDk1NjcuMjE1OTUgLT4gLTIuOTg0OTg0MDZFKzMxODg4NDc2NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NzkgcG93ZXIgLTMuMTIwMDEzMjZFKzMxODg4NDc2MiA5NTY3IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NzkgcmVtYWluZGVyIC0zLjEyMDAxMzI2RSszMTg4ODQ3NjIgOTU2Ny4yMTU5NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ3OSBzdWJ0cmFjdCAtMy4xMjAwMTMyNkUrMzE4ODg0NzYyIDk1NjcuMjE1OTUgLT4gLTMuMTIwMDEzMjZFKzMxODg4NDc2MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0ODAgYWRkIDQ5NDM2LjY1MjggNzUxLjkxOTUxNyAtPiA1MDE4OC41NzIzIEluZXhhY3QgUm91bmRlZAoreGNvbTQ4MCBjb21wYXJlIDQ5NDM2LjY1MjggNzUxLjkxOTUxNyAtPiAxCit4ZGl2NDgwIGRpdmlkZSA0OTQzNi42NTI4IDc1MS45MTk1MTcgLT4gNjUuNzQ3MjY2NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0ODAgZGl2aWRlaW50IDQ5NDM2LjY1MjggNzUxLjkxOTUxNyAtPiA2NQoreG11bDQ4MCBtdWx0aXBseSA0OTQzNi42NTI4IDc1MS45MTk1MTcgLT4gMzcxNzIzODQuMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0ODAgcG93ZXIgNDk0MzYuNjUyOCA3NTIgLT4gOC40MTE4NTcxOEUrMzUyOSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00ODAgcmVtYWluZGVyIDQ5NDM2LjY1MjggNzUxLjkxOTUxNyAtPiA1NjEuODg0MTk1Cit4c3ViNDgwIHN1YnRyYWN0IDQ5NDM2LjY1MjggNzUxLjkxOTUxNyAtPiA0ODY4NC43MzMzIEluZXhhY3QgUm91bmRlZAoreGFkZDQ4MSBhZGQgNTUyLjY2OTQ1MyA4LjM3MjU3NjBFKzE2MjIzNTI2IC0+IDguMzcyNTc2MDBFKzE2MjIzNTI2IEluZXhhY3QgUm91bmRlZAoreGNvbTQ4MSBjb21wYXJlIDU1Mi42Njk0NTMgOC4zNzI1NzYwRSsxNjIyMzUyNiAtPiAtMQoreGRpdjQ4MSBkaXZpZGUgNTUyLjY2OTQ1MyA4LjM3MjU3NjBFKzE2MjIzNTI2IC0+IDYuNjAwOTQ4NzhFLTE2MjIzNTI1IEluZXhhY3QgUm91bmRlZAoreGR2aTQ4MSBkaXZpZGVpbnQgNTUyLjY2OTQ1MyA4LjM3MjU3NjBFKzE2MjIzNTI2IC0+IDAKK3htdWw0ODEgbXVsdGlwbHkgNTUyLjY2OTQ1MyA4LjM3MjU3NjBFKzE2MjIzNTI2IC0+IDQuNjI3MjY3MDBFKzE2MjIzNTI5IEluZXhhY3QgUm91bmRlZAoreHBvdzQ4MSBwb3dlciA1NTIuNjY5NDUzIDggLT4gOC43MDQwOTYzMkUrMjEgSW5leGFjdCBSb3VuZGVkCit4cmVtNDgxIHJlbWFpbmRlciA1NTIuNjY5NDUzIDguMzcyNTc2MEUrMTYyMjM1MjYgLT4gNTUyLjY2OTQ1MworeHN1YjQ4MSBzdWJ0cmFjdCA1NTIuNjY5NDUzIDguMzcyNTc2MEUrMTYyMjM1MjYgLT4gLTguMzcyNTc2MDBFKzE2MjIzNTI2IEluZXhhY3QgUm91bmRlZAoreGFkZDQ4MiBhZGQgLTMyNjYzMDMgNDUzNzQxLjUyMCAtPiAtMjgxMjU2MS40OCBSb3VuZGVkCit4Y29tNDgyIGNvbXBhcmUgLTMyNjYzMDMgNDUzNzQxLjUyMCAtPiAtMQoreGRpdjQ4MiBkaXZpZGUgLTMyNjYzMDMgNDUzNzQxLjUyMCAtPiAtNy4xOTg1OTg0NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0ODIgZGl2aWRlaW50IC0zMjY2MzAzIDQ1Mzc0MS41MjAgLT4gLTcKK3htdWw0ODIgbXVsdGlwbHkgLTMyNjYzMDMgNDUzNzQxLjUyMCAtPiAtMS40ODIwNTcyOUUrMTIgSW5leGFjdCBSb3VuZGVkCit4cG93NDgyIHBvd2VyIC0zMjY2MzAzIDQ1Mzc0MiAtPiAxLjAyNDk3MzE1RSsyOTU1NzAxIEluZXhhY3QgUm91bmRlZAoreHJlbTQ4MiByZW1haW5kZXIgLTMyNjYzMDMgNDUzNzQxLjUyMCAtPiAtOTAxMTIuMzYwCit4c3ViNDgyIHN1YnRyYWN0IC0zMjY2MzAzIDQ1Mzc0MS41MjAgLT4gLTM3MjAwNDQuNTIgUm91bmRlZAoreGFkZDQ4MyBhZGQgMTIzMDI3NTcuNCA1NDI5MjIuNDg3RSs0MTQ0NDMzNTMgLT4gNS40MjkyMjQ4N0UrNDE0NDQzMzU4IEluZXhhY3QgUm91bmRlZAoreGNvbTQ4MyBjb21wYXJlIDEyMzAyNzU3LjQgNTQyOTIyLjQ4N0UrNDE0NDQzMzUzIC0+IC0xCit4ZGl2NDgzIGRpdmlkZSAxMjMwMjc1Ny40IDU0MjkyMi40ODdFKzQxNDQ0MzM1MyAtPiAyLjI2NjAyNDY1RS00MTQ0NDMzNTIgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDgzIGRpdmlkZWludCAxMjMwMjc1Ny40IDU0MjkyMi40ODdFKzQxNDQ0MzM1MyAtPiAwCit4bXVsNDgzIG11bHRpcGx5IDEyMzAyNzU3LjQgNTQyOTIyLjQ4N0UrNDE0NDQzMzUzIC0+IDYuNjc5NDQzNjRFKzQxNDQ0MzM2NSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0ODMgcG93ZXIgMTIzMDI3NTcuNCA1IC0+IDIuODE4NDYyNzZFKzM1IEluZXhhY3QgUm91bmRlZAoreHJlbTQ4MyByZW1haW5kZXIgMTIzMDI3NTcuNCA1NDI5MjIuNDg3RSs0MTQ0NDMzNTMgLT4gMTIzMDI3NTcuNAoreHN1YjQ4MyBzdWJ0cmFjdCAxMjMwMjc1Ny40IDU0MjkyMi40ODdFKzQxNDQ0MzM1MyAtPiAtNS40MjkyMjQ4N0UrNDE0NDQzMzU4IEluZXhhY3QgUm91bmRlZAoreGFkZDQ4NCBhZGQgLTU2NzA3NTcuNzlFLTc4NDc1NDk4NCAxMjgxNDQuNTAzIC0+IDEyODE0NC41MDMgSW5leGFjdCBSb3VuZGVkCit4Y29tNDg0IGNvbXBhcmUgLTU2NzA3NTcuNzlFLTc4NDc1NDk4NCAxMjgxNDQuNTAzIC0+IC0xCit4ZGl2NDg0IGRpdmlkZSAtNTY3MDc1Ny43OUUtNzg0NzU0OTg0IDEyODE0NC41MDMgLT4gLTQuNDI1MjgzNjlFLTc4NDc1NDk4MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0ODQgZGl2aWRlaW50IC01NjcwNzU3Ljc5RS03ODQ3NTQ5ODQgMTI4MTQ0LjUwMyAtPiAtMAoreG11bDQ4NCBtdWx0aXBseSAtNTY3MDc1Ny43OUUtNzg0NzU0OTg0IDEyODE0NC41MDMgLT4gLTcuMjY2NzY0MzlFLTc4NDc1NDk3MyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0ODQgcG93ZXIgLTU2NzA3NTcuNzlFLTc4NDc1NDk4NCAxMjgxNDUgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ4NCByZW1haW5kZXIgLTU2NzA3NTcuNzlFLTc4NDc1NDk4NCAxMjgxNDQuNTAzIC0+IC01LjY3MDc1Nzc5RS03ODQ3NTQ5NzgKK3hzdWI0ODQgc3VidHJhY3QgLTU2NzA3NTcuNzlFLTc4NDc1NDk4NCAxMjgxNDQuNTAzIC0+IC0xMjgxNDQuNTAzIEluZXhhY3QgUm91bmRlZAoreGFkZDQ4NSBhZGQgMjIuNzcyMTk2OEUrODQyNTMwNjk4IDUyMjMuNzA0NjIgLT4gMi4yNzcyMTk2OEUrODQyNTMwNjk5IEluZXhhY3QgUm91bmRlZAoreGNvbTQ4NSBjb21wYXJlIDIyLjc3MjE5NjhFKzg0MjUzMDY5OCA1MjIzLjcwNDYyIC0+IDEKK3hkaXY0ODUgZGl2aWRlIDIyLjc3MjE5NjhFKzg0MjUzMDY5OCA1MjIzLjcwNDYyIC0+IDQuMzU5Mzk1OTZFKzg0MjUzMDY5NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0ODUgZGl2aWRlaW50IDIyLjc3MjE5NjhFKzg0MjUzMDY5OCA1MjIzLjcwNDYyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDg1IG11bHRpcGx5IDIyLjc3MjE5NjhFKzg0MjUzMDY5OCA1MjIzLjcwNDYyIC0+IDEuMTg5NTUyMzBFKzg0MjUzMDcwMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0ODUgcG93ZXIgMjIuNzcyMTk2OEUrODQyNTMwNjk4IDUyMjQgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtNDg1IHJlbWFpbmRlciAyMi43NzIxOTY4RSs4NDI1MzA2OTggNTIyMy43MDQ2MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ4NSBzdWJ0cmFjdCAyMi43NzIxOTY4RSs4NDI1MzA2OTggNTIyMy43MDQ2MiAtPiAyLjI3NzIxOTY4RSs4NDI1MzA2OTkgSW5leGFjdCBSb3VuZGVkCit4YWRkNDg2IGFkZCA4OC41MTU4MTk5RS05ODAxNjQzNTcgMzI1ODQ2MTE2IC0+IDMyNTg0NjExNiBJbmV4YWN0IFJvdW5kZWQKK3hjb200ODYgY29tcGFyZSA4OC41MTU4MTk5RS05ODAxNjQzNTcgMzI1ODQ2MTE2IC0+IC0xCit4ZGl2NDg2IGRpdmlkZSA4OC41MTU4MTk5RS05ODAxNjQzNTcgMzI1ODQ2MTE2IC0+IDIuNzE2NDkxNDhFLTk4MDE2NDM2NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0ODYgZGl2aWRlaW50IDg4LjUxNTgxOTlFLTk4MDE2NDM1NyAzMjU4NDYxMTYgLT4gMAoreG11bDQ4NiBtdWx0aXBseSA4OC41MTU4MTk5RS05ODAxNjQzNTcgMzI1ODQ2MTE2IC0+IDIuODg0MjUzNjFFLTk4MDE2NDM0NyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0ODYgcG93ZXIgODguNTE1ODE5OUUtOTgwMTY0MzU3IDMyNTg0NjExNiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00ODYgcmVtYWluZGVyIDg4LjUxNTgxOTlFLTk4MDE2NDM1NyAzMjU4NDYxMTYgLT4gOC44NTE1ODE5OUUtOTgwMTY0MzU2Cit4c3ViNDg2IHN1YnRyYWN0IDg4LjUxNTgxOTlFLTk4MDE2NDM1NyAzMjU4NDYxMTYgLT4gLTMyNTg0NjExNiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0ODcgYWRkIC0yMjg4MS4wNDA4IDUuNjM2NjE1NjIgLT4gLTIyODc1LjQwNDIgSW5leGFjdCBSb3VuZGVkCit4Y29tNDg3IGNvbXBhcmUgLTIyODgxLjA0MDggNS42MzY2MTU2MiAtPiAtMQoreGRpdjQ4NyBkaXZpZGUgLTIyODgxLjA0MDggNS42MzY2MTU2MiAtPiAtNDA1OS4zNTgwMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0ODcgZGl2aWRlaW50IC0yMjg4MS4wNDA4IDUuNjM2NjE1NjIgLT4gLTQwNTkKK3htdWw0ODcgbXVsdGlwbHkgLTIyODgxLjA0MDggNS42MzY2MTU2MiAtPiAtMTI4OTcxLjYzMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0ODcgcG93ZXIgLTIyODgxLjA0MDggNiAtPiAxLjQzNTAwOTA5RSsyNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW00ODcgcmVtYWluZGVyIC0yMjg4MS4wNDA4IDUuNjM2NjE1NjIgLT4gLTIuMDE3OTk4NDIKK3hzdWI0ODcgc3VidHJhY3QgLTIyODgxLjA0MDggNS42MzY2MTU2MiAtPiAtMjI4ODYuNjc3NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0ODggYWRkIC03MTU3LjU3NDQ5IC03Ni40NDU1NTE5RS04NTY0NzA0NyAtPiAtNzE1Ny41NzQ0OSBJbmV4YWN0IFJvdW5kZWQKK3hjb200ODggY29tcGFyZSAtNzE1Ny41NzQ0OSAtNzYuNDQ1NTUxOUUtODU2NDcwNDcgLT4gLTEKK3hkaXY0ODggZGl2aWRlIC03MTU3LjU3NDQ5IC03Ni40NDU1NTE5RS04NTY0NzA0NyAtPiA5LjM2Mjk3MDUyRSs4NTY0NzA0OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0ODggZGl2aWRlaW50IC03MTU3LjU3NDQ5IC03Ni40NDU1NTE5RS04NTY0NzA0NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQ4OCBtdWx0aXBseSAtNzE1Ny41NzQ0OSAtNzYuNDQ1NTUxOUUtODU2NDcwNDcgLT4gNS40NzE2NDczMkUtODU2NDcwNDIgSW5leGFjdCBSb3VuZGVkCit4cG93NDg4IHBvd2VyIC03MTU3LjU3NDQ5IC04IC0+IDEuNDUxNjg3MDBFLTMxIEluZXhhY3QgUm91bmRlZAoreHJlbTQ4OCByZW1haW5kZXIgLTcxNTcuNTc0NDkgLTc2LjQ0NTU1MTlFLTg1NjQ3MDQ3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDg4IHN1YnRyYWN0IC03MTU3LjU3NDQ5IC03Ni40NDU1NTE5RS04NTY0NzA0NyAtPiAtNzE1Ny41NzQ0OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0ODkgYWRkIC01MDMxMTMuODAxIC05NzE1MTQ5LjgyRS02MTIxODQ0MjIgLT4gLTUwMzExMy44MDEgSW5leGFjdCBSb3VuZGVkCit4Y29tNDg5IGNvbXBhcmUgLTUwMzExMy44MDEgLTk3MTUxNDkuODJFLTYxMjE4NDQyMiAtPiAtMQoreGRpdjQ4OSBkaXZpZGUgLTUwMzExMy44MDEgLTk3MTUxNDkuODJFLTYxMjE4NDQyMiAtPiA1LjE3ODY1MjAxRSs2MTIxODQ0MjAgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDg5IGRpdmlkZWludCAtNTAzMTEzLjgwMSAtOTcxNTE0OS44MkUtNjEyMTg0NDIyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDg5IG11bHRpcGx5IC01MDMxMTMuODAxIC05NzE1MTQ5LjgyRS02MTIxODQ0MjIgLT4gNC44ODc4MjU5NUUtNjEyMTg0NDEwIEluZXhhY3QgUm91bmRlZAoreHBvdzQ4OSBwb3dlciAtNTAzMTEzLjgwMSAtMTAgLT4gOS42MjM2MDI4N0UtNTggSW5leGFjdCBSb3VuZGVkCit4cmVtNDg5IHJlbWFpbmRlciAtNTAzMTEzLjgwMSAtOTcxNTE0OS44MkUtNjEyMTg0NDIyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDg5IHN1YnRyYWN0IC01MDMxMTMuODAxIC05NzE1MTQ5LjgyRS02MTIxODQ0MjIgLT4gLTUwMzExMy44MDEgSW5leGFjdCBSb3VuZGVkCit4YWRkNDkwIGFkZCAtMzA2Njk2Mi40MSAtNTUuMzA5Njg3OSAtPiAtMzA2NzAxNy43MiBJbmV4YWN0IFJvdW5kZWQKK3hjb200OTAgY29tcGFyZSAtMzA2Njk2Mi40MSAtNTUuMzA5Njg3OSAtPiAtMQoreGRpdjQ5MCBkaXZpZGUgLTMwNjY5NjIuNDEgLTU1LjMwOTY4NzkgLT4gNTU0NTAuNzI3MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0OTAgZGl2aWRlaW50IC0zMDY2OTYyLjQxIC01NS4zMDk2ODc5IC0+IDU1NDUwCit4bXVsNDkwIG11bHRpcGx5IC0zMDY2OTYyLjQxIC01NS4zMDk2ODc5IC0+IDE2OTYzMjczNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0OTAgcG93ZXIgLTMwNjY5NjIuNDEgLTU1IC0+IC0xLjcwMjI5NjAwRS0zNTcgSW5leGFjdCBSb3VuZGVkCit4cmVtNDkwIHJlbWFpbmRlciAtMzA2Njk2Mi40MSAtNTUuMzA5Njg3OSAtPiAtNDAuMjE1OTQ1MAoreHN1YjQ5MCBzdWJ0cmFjdCAtMzA2Njk2Mi40MSAtNTUuMzA5Njg3OSAtPiAtMzA2NjkwNy4xMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0OTEgYWRkIC01MzMxMS41NzM4RSsxNTY2MDg5MzYgLTcuNDU4OTA2NjYgLT4gLTUuMzMxMTU3MzhFKzE1NjYwODk0MCBJbmV4YWN0IFJvdW5kZWQKK3hjb200OTEgY29tcGFyZSAtNTMzMTEuNTczOEUrMTU2NjA4OTM2IC03LjQ1ODkwNjY2IC0+IC0xCit4ZGl2NDkxIGRpdmlkZSAtNTMzMTEuNTczOEUrMTU2NjA4OTM2IC03LjQ1ODkwNjY2IC0+IDcuMTQ3MzcxMDlFKzE1NjYwODkzOSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0OTEgZGl2aWRlaW50IC01MzMxMS41NzM4RSsxNTY2MDg5MzYgLTcuNDU4OTA2NjYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0OTEgbXVsdGlwbHkgLTUzMzExLjU3MzhFKzE1NjYwODkzNiAtNy40NTg5MDY2NiAtPiAzLjk3NjQ2MDUzRSsxNTY2MDg5NDEgSW5leGFjdCBSb3VuZGVkCit4cG93NDkxIHBvd2VyIC01MzMxMS41NzM4RSsxNTY2MDg5MzYgLTcgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ5MSByZW1haW5kZXIgLTUzMzExLjU3MzhFKzE1NjYwODkzNiAtNy40NTg5MDY2NiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ5MSBzdWJ0cmFjdCAtNTMzMTEuNTczOEUrMTU2NjA4OTM2IC03LjQ1ODkwNjY2IC0+IC01LjMzMTE1NzM4RSsxNTY2MDg5NDAgSW5leGFjdCBSb3VuZGVkCit4YWRkNDkyIGFkZCA5OTg4OTAwNjguIC05Mi4wNTc4NzkgLT4gOTk4ODg5OTc2IEluZXhhY3QgUm91bmRlZAoreGNvbTQ5MiBjb21wYXJlIDk5ODg5MDA2OC4gLTkyLjA1Nzg3OSAtPiAxCit4ZGl2NDkyIGRpdmlkZSA5OTg4OTAwNjguIC05Mi4wNTc4NzkgLT4gLTEwODUwNjc0LjQgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDkyIGRpdmlkZWludCA5OTg4OTAwNjguIC05Mi4wNTc4NzkgLT4gLTEwODUwNjc0Cit4bXVsNDkyIG11bHRpcGx5IDk5ODg5MDA2OC4gLTkyLjA1Nzg3OSAtPiAtOS4xOTU1NzAxMEUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93NDkyIHBvd2VyIDk5ODg5MDA2OC4gLTkyIC0+IDEuMTA3NTcyMjVFLTgyOCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00OTIgcmVtYWluZGVyIDk5ODg5MDA2OC4gLTkyLjA1Nzg3OSAtPiAzMy44Mzk1NTQKK3hzdWI0OTIgc3VidHJhY3QgOTk4ODkwMDY4LiAtOTIuMDU3ODc5IC0+IDk5ODg5MDE2MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0OTMgYWRkIDEyMi40OTU1OTEgLTQwNzgzNjAyOC4gLT4gLTQwNzgzNTkwNiBJbmV4YWN0IFJvdW5kZWQKK3hjb200OTMgY29tcGFyZSAxMjIuNDk1NTkxIC00MDc4MzYwMjguIC0+IDEKK3hkaXY0OTMgZGl2aWRlIDEyMi40OTU1OTEgLTQwNzgzNjAyOC4gLT4gLTMuMDAzNTUwMDJFLTcgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDkzIGRpdmlkZWludCAxMjIuNDk1NTkxIC00MDc4MzYwMjguIC0+IC0wCit4bXVsNDkzIG11bHRpcGx5IDEyMi40OTU1OTEgLTQwNzgzNjAyOC4gLT4gLTQuOTk1ODExNTNFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzQ5MyBwb3dlciAxMjIuNDk1NTkxIC00MDc4MzYwMjggLT4gNC44MjQ2Mzc3M0UtODUxNjEwNzU0IEluZXhhY3QgUm91bmRlZAoreHJlbTQ5MyByZW1haW5kZXIgMTIyLjQ5NTU5MSAtNDA3ODM2MDI4LiAtPiAxMjIuNDk1NTkxCit4c3ViNDkzIHN1YnRyYWN0IDEyMi40OTU1OTEgLTQwNzgzNjAyOC4gLT4gNDA3ODM2MTUwIEluZXhhY3QgUm91bmRlZAoreGFkZDQ5NCBhZGQgMTg3MDk4LjQ4OCA2MjIwLjA1NTg0RS0yMzY1NDEyNDkgLT4gMTg3MDk4LjQ4OCBJbmV4YWN0IFJvdW5kZWQKK3hjb200OTQgY29tcGFyZSAxODcwOTguNDg4IDYyMjAuMDU1ODRFLTIzNjU0MTI0OSAtPiAxCit4ZGl2NDk0IGRpdmlkZSAxODcwOTguNDg4IDYyMjAuMDU1ODRFLTIzNjU0MTI0OSAtPiAzLjAwNzk4NzI3RSsyMzY1NDEyNTAgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDk0IGRpdmlkZWludCAxODcwOTguNDg4IDYyMjAuMDU1ODRFLTIzNjU0MTI0OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQ5NCBtdWx0aXBseSAxODcwOTguNDg4IDYyMjAuMDU1ODRFLTIzNjU0MTI0OSAtPiAxLjE2Mzc2MzA0RS0yMzY1NDEyNDAgSW5leGFjdCBSb3VuZGVkCit4cG93NDk0IHBvd2VyIDE4NzA5OC40ODggNiAtPiA0LjI4OTY0ODExRSszMSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00OTQgcmVtYWluZGVyIDE4NzA5OC40ODggNjIyMC4wNTU4NEUtMjM2NTQxMjQ5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDk0IHN1YnRyYWN0IDE4NzA5OC40ODggNjIyMC4wNTU4NEUtMjM2NTQxMjQ5IC0+IDE4NzA5OC40ODggSW5leGFjdCBSb3VuZGVkCit4YWRkNDk1IGFkZCA0ODE5ODk5LjIxRSs0MzI5ODI1NTAgLTcyNzQ0MTkxNyAtPiA0LjgxOTg5OTIxRSs0MzI5ODI1NTYgSW5leGFjdCBSb3VuZGVkCit4Y29tNDk1IGNvbXBhcmUgNDgxOTg5OS4yMUUrNDMyOTgyNTUwIC03Mjc0NDE5MTcgLT4gMQoreGRpdjQ5NSBkaXZpZGUgNDgxOTg5OS4yMUUrNDMyOTgyNTUwIC03Mjc0NDE5MTcgLT4gLTYuNjI1ODIwMDFFKzQzMjk4MjU0NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0OTUgZGl2aWRlaW50IDQ4MTk4OTkuMjFFKzQzMjk4MjU1MCAtNzI3NDQxOTE3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDk1IG11bHRpcGx5IDQ4MTk4OTkuMjFFKzQzMjk4MjU1MCAtNzI3NDQxOTE3IC0+IC0zLjUwNjE5NjcyRSs0MzI5ODI1NjUgSW5leGFjdCBSb3VuZGVkCit4cG93NDk1IHBvd2VyIDQ4MTk4OTkuMjFFKzQzMjk4MjU1MCAtNzI3NDQxOTE3IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ5NSByZW1haW5kZXIgNDgxOTg5OS4yMUUrNDMyOTgyNTUwIC03Mjc0NDE5MTcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0OTUgc3VidHJhY3QgNDgxOTg5OS4yMUUrNDMyOTgyNTUwIC03Mjc0NDE5MTcgLT4gNC44MTk4OTkyMUUrNDMyOTgyNTU2IEluZXhhY3QgUm91bmRlZAoreGFkZDQ5NiBhZGQgNTc3MC4wMTAyMEUrNTA3NDU5NzUyIC00MjA4MzM5LjMzRS0xMjk3NjY2ODAgLT4gNS43NzAwMTAyMEUrNTA3NDU5NzU1IEluZXhhY3QgUm91bmRlZAoreGNvbTQ5NiBjb21wYXJlIDU3NzAuMDEwMjBFKzUwNzQ1OTc1MiAtNDIwODMzOS4zM0UtMTI5NzY2NjgwIC0+IDEKK3hkaXY0OTYgZGl2aWRlIDU3NzAuMDEwMjBFKzUwNzQ1OTc1MiAtNDIwODMzOS4zM0UtMTI5NzY2NjgwIC0+IC0xLjM3MTA4OTU4RSs2MzcyMjY0MjkgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDk2IGRpdmlkZWludCA1NzcwLjAxMDIwRSs1MDc0NTk3NTIgLTQyMDgzMzkuMzNFLTEyOTc2NjY4MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQ5NiBtdWx0aXBseSA1NzcwLjAxMDIwRSs1MDc0NTk3NTIgLTQyMDgzMzkuMzNFLTEyOTc2NjY4MCAtPiAtMi40MjgyMTYwOUUrMzc3NjkzMDgyIEluZXhhY3QgUm91bmRlZAoreHBvdzQ5NiBwb3dlciA1NzcwLjAxMDIwRSs1MDc0NTk3NTIgLTQgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDk2IHJlbWFpbmRlciA1NzcwLjAxMDIwRSs1MDc0NTk3NTIgLTQyMDgzMzkuMzNFLTEyOTc2NjY4MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ5NiBzdWJ0cmFjdCA1NzcwLjAxMDIwRSs1MDc0NTk3NTIgLTQyMDgzMzkuMzNFLTEyOTc2NjY4MCAtPiA1Ljc3MDAxMDIwRSs1MDc0NTk3NTUgSW5leGFjdCBSb3VuZGVkCit4YWRkNDk3IGFkZCAtMjg2LjM3MTMyMCA3MTAzMTkxNTIgLT4gNzEwMzE4ODY2IEluZXhhY3QgUm91bmRlZAoreGNvbTQ5NyBjb21wYXJlIC0yODYuMzcxMzIwIDcxMDMxOTE1MiAtPiAtMQoreGRpdjQ5NyBkaXZpZGUgLTI4Ni4zNzEzMjAgNzEwMzE5MTUyIC0+IC00LjAzMTU4NjY0RS03IEluZXhhY3QgUm91bmRlZAoreGR2aTQ5NyBkaXZpZGVpbnQgLTI4Ni4zNzEzMjAgNzEwMzE5MTUyIC0+IC0wCit4bXVsNDk3IG11bHRpcGx5IC0yODYuMzcxMzIwIDcxMDMxOTE1MiAtPiAtMi4wMzQxNTAzM0UrMTEgSW5leGFjdCBSb3VuZGVkCit4cG93NDk3IHBvd2VyIC0yODYuMzcxMzIwIDcxMDMxOTE1MiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00OTcgcmVtYWluZGVyIC0yODYuMzcxMzIwIDcxMDMxOTE1MiAtPiAtMjg2LjM3MTMyMAoreHN1YjQ5NyBzdWJ0cmFjdCAtMjg2LjM3MTMyMCA3MTAzMTkxNTIgLT4gLTcxMDMxOTQzOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0OTggYWRkIC03LjI3NDAzNTM2IC00ODE0Njk2NTZFLTgzNTE4MzcwMCAtPiAtNy4yNzQwMzUzNiBJbmV4YWN0IFJvdW5kZWQKK3hjb200OTggY29tcGFyZSAtNy4yNzQwMzUzNiAtNDgxNDY5NjU2RS04MzUxODM3MDAgLT4gLTEKK3hkaXY0OTggZGl2aWRlIC03LjI3NDAzNTM2IC00ODE0Njk2NTZFLTgzNTE4MzcwMCAtPiAxLjUxMDc5ODMwRSs4MzUxODM2OTIgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDk4IGRpdmlkZWludCAtNy4yNzQwMzUzNiAtNDgxNDY5NjU2RS04MzUxODM3MDAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0OTggbXVsdGlwbHkgLTcuMjc0MDM1MzYgLTQ4MTQ2OTY1NkUtODM1MTgzNzAwIC0+IDMuNTAyMjI3MzBFLTgzNTE4MzY5MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0OTggcG93ZXIgLTcuMjc0MDM1MzYgLTUgLT4gLTAuMDAwMDQ5MTA0Njg4NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00OTggcmVtYWluZGVyIC03LjI3NDAzNTM2IC00ODE0Njk2NTZFLTgzNTE4MzcwMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ5OCBzdWJ0cmFjdCAtNy4yNzQwMzUzNiAtNDgxNDY5NjU2RS04MzUxODM3MDAgLT4gLTcuMjc0MDM1MzYgSW5leGFjdCBSb3VuZGVkCit4YWRkNDk5IGFkZCAtNjE1Ny43NDI5MiAtOTQwNzUyODYuMkUrOTI1NTU4NzcgLT4gLTkuNDA3NTI4NjJFKzkyNTU1ODg0IEluZXhhY3QgUm91bmRlZAoreGNvbTQ5OSBjb21wYXJlIC02MTU3Ljc0MjkyIC05NDA3NTI4Ni4yRSs5MjU1NTg3NyAtPiAxCit4ZGl2NDk5IGRpdmlkZSAtNjE1Ny43NDI5MiAtOTQwNzUyODYuMkUrOTI1NTU4NzcgLT4gNi41NDU1NDc5MEUtOTI1NTU4ODIgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDk5IGRpdmlkZWludCAtNjE1Ny43NDI5MiAtOTQwNzUyODYuMkUrOTI1NTU4NzcgLT4gMAoreG11bDQ5OSBtdWx0aXBseSAtNjE1Ny43NDI5MiAtOTQwNzUyODYuMkUrOTI1NTU4NzcgLT4gNS43OTI5MTQyOEUrOTI1NTU4ODggSW5leGFjdCBSb3VuZGVkCit4cG93NDk5IHBvd2VyIC02MTU3Ljc0MjkyIC05IC0+IC03Ljg1NjA4MjE4RS0zNSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00OTkgcmVtYWluZGVyIC02MTU3Ljc0MjkyIC05NDA3NTI4Ni4yRSs5MjU1NTg3NyAtPiAtNjE1Ny43NDI5MgoreHN1YjQ5OSBzdWJ0cmFjdCAtNjE1Ny43NDI5MiAtOTQwNzUyODYuMkUrOTI1NTU4NzcgLT4gOS40MDc1Mjg2MkUrOTI1NTU4ODQgSW5leGFjdCBSb3VuZGVkCit4YWRkNTAwIGFkZCAtNTI1NDQ1MDg3LkUrMjMxNTI5MTY3IDE4ODIyNzQ2MCAtPiAtNS4yNTQ0NTA4N0UrMjMxNTI5MTc1IEluZXhhY3QgUm91bmRlZAoreGNvbTUwMCBjb21wYXJlIC01MjU0NDUwODcuRSsyMzE1MjkxNjcgMTg4MjI3NDYwIC0+IC0xCit4ZGl2NTAwIGRpdmlkZSAtNTI1NDQ1MDg3LkUrMjMxNTI5MTY3IDE4ODIyNzQ2MCAtPiAtMi43OTE1NDMyMUUrMjMxNTI5MTY3IEluZXhhY3QgUm91bmRlZAoreGR2aTUwMCBkaXZpZGVpbnQgLTUyNTQ0NTA4Ny5FKzIzMTUyOTE2NyAxODgyMjc0NjAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw1MDAgbXVsdGlwbHkgLTUyNTQ0NTA4Ny5FKzIzMTUyOTE2NyAxODgyMjc0NjAgLT4gLTkuODkwMzE5NDFFKzIzMTUyOTE4MyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c1MDAgcG93ZXIgLTUyNTQ0NTA4Ny5FKzIzMTUyOTE2NyAxODgyMjc0NjAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtNTAwIHJlbWFpbmRlciAtNTI1NDQ1MDg3LkUrMjMxNTI5MTY3IDE4ODIyNzQ2MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjUwMCBzdWJ0cmFjdCAtNTI1NDQ1MDg3LkUrMjMxNTI5MTY3IDE4ODIyNzQ2MCAtPiAtNS4yNTQ0NTA4N0UrMjMxNTI5MTc1IEluZXhhY3QgUm91bmRlZAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JlZHVjZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yZWR1Y2UuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWM4NWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yZWR1Y2UuZGVjVGVzdApAQCAtMCwwICsxLDIzNCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSByZWR1Y2UuZGVjVGVzdCAtLSByZW1vdmUgdHJhaWxpbmcgemVyb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDAzLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBbVGhpcyB1c2VkIHRvIGJlIGNhbGxlZCBub3JtYWxpemUuXQorCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CisKK3JlZHgwMDEgcmVkdWNlICcxJyAgICAgIC0+ICcxJworcmVkeDAwMiByZWR1Y2UgJy0xJyAgICAgLT4gJy0xJworcmVkeDAwMyByZWR1Y2UgJzEuMDAnICAgLT4gJzEnCityZWR4MDA0IHJlZHVjZSAnLTEuMDAnICAtPiAnLTEnCityZWR4MDA1IHJlZHVjZSAnMCcgICAgICAtPiAnMCcKK3JlZHgwMDYgcmVkdWNlICcwLjAwJyAgIC0+ICcwJworcmVkeDAwNyByZWR1Y2UgJzAwLjAnICAgLT4gJzAnCityZWR4MDA4IHJlZHVjZSAnMDAuMDAnICAtPiAnMCcKK3JlZHgwMDkgcmVkdWNlICcwMCcgICAgIC0+ICcwJworcmVkeDAxMCByZWR1Y2UgJzBFKzEnICAgLT4gJzAnCityZWR4MDExIHJlZHVjZSAnMEUrNScgICAtPiAnMCcKKworcmVkeDAxMiByZWR1Y2UgJy0yJyAgICAgLT4gJy0yJworcmVkeDAxMyByZWR1Y2UgJzInICAgICAgLT4gJzInCityZWR4MDE0IHJlZHVjZSAnLTIuMDAnICAtPiAnLTInCityZWR4MDE1IHJlZHVjZSAnMi4wMCcgICAtPiAnMicKK3JlZHgwMTYgcmVkdWNlICctMCcgICAgIC0+ICctMCcKK3JlZHgwMTcgcmVkdWNlICctMC4wMCcgIC0+ICctMCcKK3JlZHgwMTggcmVkdWNlICctMDAuMCcgIC0+ICctMCcKK3JlZHgwMTkgcmVkdWNlICctMDAuMDAnIC0+ICctMCcKK3JlZHgwMjAgcmVkdWNlICctMDAnICAgIC0+ICctMCcKK3JlZHgwMjEgcmVkdWNlICctMEUrNScgICAtPiAnLTAnCityZWR4MDIyIHJlZHVjZSAnLTBFKzEnICAtPiAnLTAnCisKK3JlZHgwMzAgcmVkdWNlICcrMC4xJyAgICAgICAgICAgIC0+ICcwLjEnCityZWR4MDMxIHJlZHVjZSAnLTAuMScgICAgICAgICAgICAtPiAnLTAuMScKK3JlZHgwMzIgcmVkdWNlICcrMC4wMScgICAgICAgICAgIC0+ICcwLjAxJworcmVkeDAzMyByZWR1Y2UgJy0wLjAxJyAgICAgICAgICAgLT4gJy0wLjAxJworcmVkeDAzNCByZWR1Y2UgJyswLjAwMScgICAgICAgICAgLT4gJzAuMDAxJworcmVkeDAzNSByZWR1Y2UgJy0wLjAwMScgICAgICAgICAgLT4gJy0wLjAwMScKK3JlZHgwMzYgcmVkdWNlICcrMC4wMDAwMDEnICAgICAgIC0+ICcwLjAwMDAwMScKK3JlZHgwMzcgcmVkdWNlICctMC4wMDAwMDEnICAgICAgIC0+ICctMC4wMDAwMDEnCityZWR4MDM4IHJlZHVjZSAnKzAuMDAwMDAwMDAwMDAxJyAtPiAnMUUtMTInCityZWR4MDM5IHJlZHVjZSAnLTAuMDAwMDAwMDAwMDAxJyAtPiAnLTFFLTEyJworCityZWR4MDQxIHJlZHVjZSAxLjEgICAgICAgIC0+IDEuMQorcmVkeDA0MiByZWR1Y2UgMS4xMCAgICAgICAtPiAxLjEKK3JlZHgwNDMgcmVkdWNlIDEuMTAwICAgICAgLT4gMS4xCityZWR4MDQ0IHJlZHVjZSAxLjExMCAgICAgIC0+IDEuMTEKK3JlZHgwNDUgcmVkdWNlIC0xLjEgICAgICAgLT4gLTEuMQorcmVkeDA0NiByZWR1Y2UgLTEuMTAgICAgICAtPiAtMS4xCityZWR4MDQ3IHJlZHVjZSAtMS4xMDAgICAgIC0+IC0xLjEKK3JlZHgwNDggcmVkdWNlIC0xLjExMCAgICAgLT4gLTEuMTEKK3JlZHgwNDkgcmVkdWNlIDkuOSAgICAgICAgLT4gOS45CityZWR4MDUwIHJlZHVjZSA5LjkwICAgICAgIC0+IDkuOQorcmVkeDA1MSByZWR1Y2UgOS45MDAgICAgICAtPiA5LjkKK3JlZHgwNTIgcmVkdWNlIDkuOTkwICAgICAgLT4gOS45OQorcmVkeDA1MyByZWR1Y2UgLTkuOSAgICAgICAtPiAtOS45CityZWR4MDU0IHJlZHVjZSAtOS45MCAgICAgIC0+IC05LjkKK3JlZHgwNTUgcmVkdWNlIC05LjkwMCAgICAgLT4gLTkuOQorcmVkeDA1NiByZWR1Y2UgLTkuOTkwICAgICAtPiAtOS45OQorCistLSBzb21lIHRyYWlsaW5nIGZyYWN0aW9uYWwgemVyb3Mgd2l0aCB6ZXJvcyBpbiB1bml0cworcmVkeDA2MCByZWR1Y2UgIDEwLjAgICAgICAgIC0+IDFFKzEKK3JlZHgwNjEgcmVkdWNlICAxMC4wMCAgICAgICAtPiAxRSsxCityZWR4MDYyIHJlZHVjZSAgMTAwLjAgICAgICAgLT4gMUUrMgorcmVkeDA2MyByZWR1Y2UgIDEwMC4wMCAgICAgIC0+IDFFKzIKK3JlZHgwNjQgcmVkdWNlICAxLjEwMDBFKzMgICAtPiAxLjFFKzMKK3JlZHgwNjUgcmVkdWNlICAxLjEwMDAwRSszICAtPiAxLjFFKzMKK3JlZHgwNjYgcmVkdWNlIC0xMC4wICAgICAgICAtPiAtMUUrMQorcmVkeDA2NyByZWR1Y2UgLTEwLjAwICAgICAgIC0+IC0xRSsxCityZWR4MDY4IHJlZHVjZSAtMTAwLjAgICAgICAgLT4gLTFFKzIKK3JlZHgwNjkgcmVkdWNlIC0xMDAuMDAgICAgICAtPiAtMUUrMgorcmVkeDA3MCByZWR1Y2UgLTEuMTAwMEUrMyAgIC0+IC0xLjFFKzMKK3JlZHgwNzEgcmVkdWNlIC0xLjEwMDAwRSszICAtPiAtMS4xRSszCisKKy0tIHNvbWUgaW5zaWduaWZpY2FudCB0cmFpbGluZyB6ZXJvcyB3aXRoIHBvc2l0aXZlIGV4cG9uZW50CityZWR4MDgwIHJlZHVjZSAgMTBFKzEgICAgICAgLT4gMUUrMgorcmVkeDA4MSByZWR1Y2UgIDEwMEUrMSAgICAgIC0+IDFFKzMKK3JlZHgwODIgcmVkdWNlICAxLjBFKzIgICAgICAtPiAxRSsyCityZWR4MDgzIHJlZHVjZSAgMS4wRSszICAgICAgLT4gMUUrMworcmVkeDA4NCByZWR1Y2UgIDEuMUUrMyAgICAgIC0+IDEuMUUrMworcmVkeDA4NSByZWR1Y2UgIDEuMDBFKzMgICAgIC0+IDFFKzMKK3JlZHgwODYgcmVkdWNlICAxLjEwRSszICAgICAtPiAxLjFFKzMKK3JlZHgwODcgcmVkdWNlIC0xMEUrMSAgICAgICAtPiAtMUUrMgorcmVkeDA4OCByZWR1Y2UgLTEwMEUrMSAgICAgIC0+IC0xRSszCityZWR4MDg5IHJlZHVjZSAtMS4wRSsyICAgICAgLT4gLTFFKzIKK3JlZHgwOTAgcmVkdWNlIC0xLjBFKzMgICAgICAtPiAtMUUrMworcmVkeDA5MSByZWR1Y2UgLTEuMUUrMyAgICAgIC0+IC0xLjFFKzMKK3JlZHgwOTIgcmVkdWNlIC0xLjAwRSszICAgICAtPiAtMUUrMworcmVkeDA5MyByZWR1Y2UgLTEuMTBFKzMgICAgIC0+IC0xLjFFKzMKKworLS0gc29tZSBzaWduaWZpY2FudCB0cmFpbGluZyB6ZXJvcywgd2VyZSB3ZSB0byBiZSB0cmltbWluZworcmVkeDEwMCByZWR1Y2UgIDExICAgICAgICAgIC0+IDExCityZWR4MTAxIHJlZHVjZSAgMTAgICAgICAgICAgLT4gMUUrMQorcmVkeDEwMiByZWR1Y2UgIDEwLiAgICAgICAgIC0+IDFFKzEKK3JlZHgxMDMgcmVkdWNlICAxLjFFKzEgICAgICAtPiAxMQorcmVkeDEwNCByZWR1Y2UgIDEuMEUrMSAgICAgIC0+IDFFKzEKK3JlZHgxMDUgcmVkdWNlICAxLjEwRSsyICAgICAtPiAxLjFFKzIKK3JlZHgxMDYgcmVkdWNlICAxLjAwRSsyICAgICAtPiAxRSsyCityZWR4MTA3IHJlZHVjZSAgMS4xMDBFKzMgICAgLT4gMS4xRSszCityZWR4MTA4IHJlZHVjZSAgMS4wMDBFKzMgICAgLT4gMUUrMworcmVkeDEwOSByZWR1Y2UgIDEuMDAwMDAwRSs2IC0+IDFFKzYKK3JlZHgxMTAgcmVkdWNlIC0xMSAgICAgICAgICAtPiAtMTEKK3JlZHgxMTEgcmVkdWNlIC0xMCAgICAgICAgICAtPiAtMUUrMQorcmVkeDExMiByZWR1Y2UgLTEwLiAgICAgICAgIC0+IC0xRSsxCityZWR4MTEzIHJlZHVjZSAtMS4xRSsxICAgICAgLT4gLTExCityZWR4MTE0IHJlZHVjZSAtMS4wRSsxICAgICAgLT4gLTFFKzEKK3JlZHgxMTUgcmVkdWNlIC0xLjEwRSsyICAgICAtPiAtMS4xRSsyCityZWR4MTE2IHJlZHVjZSAtMS4wMEUrMiAgICAgLT4gLTFFKzIKK3JlZHgxMTcgcmVkdWNlIC0xLjEwMEUrMyAgICAtPiAtMS4xRSszCityZWR4MTE4IHJlZHVjZSAtMS4wMDBFKzMgICAgLT4gLTFFKzMKK3JlZHgxMTkgcmVkdWNlIC0xLjAwMDAwRSs1ICAtPiAtMUUrNQorcmVkeDEyMCByZWR1Y2UgLTEuMDAwMDAwRSs2IC0+IC0xRSs2CityZWR4MTIxIHJlZHVjZSAtMTAuMDAwMDBFKzYgLT4gLTFFKzcKK3JlZHgxMjIgcmVkdWNlIC0xMDAuMDAwMEUrNiAtPiAtMUUrOAorcmVkeDEyMyByZWR1Y2UgLTEwMDAuMDAwRSs2IC0+IC0xRSs5CityZWR4MTI0IHJlZHVjZSAtMTAwMDAuMDBFKzYgLT4gLTFFKzEwCityZWR4MTI1IHJlZHVjZSAtMTAwMDAwLjBFKzYgLT4gLTFFKzExCityZWR4MTI2IHJlZHVjZSAtMTAwMDAwMC5FKzYgLT4gLTFFKzEyCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjQXJpdGgKK3JlZHgxNDAgcmVkdWNlICcyLjEnICAgICAtPiAgJzIuMScKK3JlZHgxNDEgcmVkdWNlICctMi4wJyAgICAtPiAgJy0yJworcmVkeDE0MiByZWR1Y2UgJzEuMjAwJyAgIC0+ICAnMS4yJworcmVkeDE0MyByZWR1Y2UgJy0xMjAnICAgIC0+ICAnLTEuMkUrMicKK3JlZHgxNDQgcmVkdWNlICcxMjAuMDAnICAtPiAgJzEuMkUrMicKK3JlZHgxNDUgcmVkdWNlICcwLjAwJyAgICAtPiAgJzAnCisKKy0tIG92ZXJmbG93IHRlc3RzCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcHJlY2lzaW9uOiAzCityZWR4MTYwIHJlZHVjZSA5Ljk5OUUrOTk5OTk5OTk5ICAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCityZWR4MTYxIHJlZHVjZSAtOS45OTlFKzk5OTk5OTk5OSAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCisKKy0tIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvdworcHJlY2lzaW9uOiAzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcmVkeDIxMCByZWR1Y2UgIDEuMDBFLTk5OSAgICAgICAgLT4gICAxRS05OTkKK3JlZHgyMTEgcmVkdWNlICAwLjFFLTk5OSAgICAgICAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbAorcmVkeDIxMiByZWR1Y2UgIDAuMTBFLTk5OSAgICAgICAgLT4gICAxRS0xMDAwICAgU3Vibm9ybWFsCityZWR4MjEzIHJlZHVjZSAgMC4xMDBFLTk5OSAgICAgICAtPiAgIDFFLTEwMDAgICBTdWJub3JtYWwgUm91bmRlZAorcmVkeDIxNCByZWR1Y2UgIDAuMDFFLTk5OSAgICAgICAgLT4gICAxRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorcmVkeDIxNSByZWR1Y2UgIDAuOTk5RS05OTkgICAgICAgLT4gICAxRS05OTkgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK3JlZHgyMTYgcmVkdWNlICAwLjA5OUUtOTk5ICAgICAgIC0+ICAgMUUtMTAwMCAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CityZWR4MjE3IHJlZHVjZSAgMC4wMDlFLTk5OSAgICAgICAtPiAgIDFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworcmVkeDIxOCByZWR1Y2UgIDAuMDAxRS05OTkgICAgICAgLT4gICAwICAgICAgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorcmVkeDIxOSByZWR1Y2UgIDAuMDAwOUUtOTk5ICAgICAgLT4gICAwICAgICAgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorcmVkeDIyMCByZWR1Y2UgIDAuMDAwMUUtOTk5ICAgICAgLT4gICAwICAgICAgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCityZWR4MjMwIHJlZHVjZSAtMS4wMEUtOTk5ICAgICAgICAtPiAgLTFFLTk5OQorcmVkeDIzMSByZWR1Y2UgLTAuMUUtOTk5ICAgICAgICAgLT4gIC0xRS0xMDAwICAgU3Vibm9ybWFsCityZWR4MjMyIHJlZHVjZSAtMC4xMEUtOTk5ICAgICAgICAtPiAgLTFFLTEwMDAgICBTdWJub3JtYWwKK3JlZHgyMzMgcmVkdWNlIC0wLjEwMEUtOTk5ICAgICAgIC0+ICAtMUUtMTAwMCAgIFN1Ym5vcm1hbCBSb3VuZGVkCityZWR4MjM0IHJlZHVjZSAtMC4wMUUtOTk5ICAgICAgICAtPiAgLTFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCityZWR4MjM1IHJlZHVjZSAtMC45OTlFLTk5OSAgICAgICAtPiAgLTFFLTk5OSAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworcmVkeDIzNiByZWR1Y2UgLTAuMDk5RS05OTkgICAgICAgLT4gIC0xRS0xMDAwICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK3JlZHgyMzcgcmVkdWNlIC0wLjAwOUUtOTk5ICAgICAgIC0+ICAtMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CityZWR4MjM4IHJlZHVjZSAtMC4wMDFFLTk5OSAgICAgICAtPiAgLTAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCityZWR4MjM5IHJlZHVjZSAtMC4wMDA5RS05OTkgICAgICAtPiAgLTAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCityZWR4MjQwIHJlZHVjZSAtMC4wMDAxRS05OTkgICAgICAtPiAgLTAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCisKKy0tIG1vcmUgcmVzaGFwaW5nCitwcmVjaXNpb246IDkKK3JlZHgyNjAgcmVkdWNlICc1NjI2MEUtMTAnICAgLT4gJzAuMDAwMDA1NjI2JworcmVkeDI2MSByZWR1Y2UgJzU2MjYwRS01JyAgICAtPiAnMC41NjI2JworcmVkeDI2MiByZWR1Y2UgJzU2MjYwRS0yJyAgICAtPiAnNTYyLjYnCityZWR4MjYzIHJlZHVjZSAnNTYyNjBFLTEnICAgIC0+ICc1NjI2JworcmVkeDI2NSByZWR1Y2UgJzU2MjYwRS0wJyAgICAtPiAnNS42MjZFKzQnCityZWR4MjY2IHJlZHVjZSAnNTYyNjBFKzAnICAgIC0+ICc1LjYyNkUrNCcKK3JlZHgyNjcgcmVkdWNlICc1NjI2MEUrMScgICAgLT4gJzUuNjI2RSs1JworcmVkeDI2OCByZWR1Y2UgJzU2MjYwRSsyJyAgICAtPiAnNS42MjZFKzYnCityZWR4MjY5IHJlZHVjZSAnNTYyNjBFKzMnICAgIC0+ICc1LjYyNkUrNycKK3JlZHgyNzAgcmVkdWNlICc1NjI2MEUrNCcgICAgLT4gJzUuNjI2RSs4JworcmVkeDI3MSByZWR1Y2UgJzU2MjYwRSs1JyAgICAtPiAnNS42MjZFKzknCityZWR4MjcyIHJlZHVjZSAnNTYyNjBFKzYnICAgIC0+ICc1LjYyNkUrMTAnCityZWR4MjgwIHJlZHVjZSAnLTU2MjYwRS0xMCcgIC0+ICctMC4wMDAwMDU2MjYnCityZWR4MjgxIHJlZHVjZSAnLTU2MjYwRS01JyAgIC0+ICctMC41NjI2JworcmVkeDI4MiByZWR1Y2UgJy01NjI2MEUtMicgICAtPiAnLTU2Mi42JworcmVkeDI4MyByZWR1Y2UgJy01NjI2MEUtMScgICAtPiAnLTU2MjYnCityZWR4Mjg1IHJlZHVjZSAnLTU2MjYwRS0wJyAgIC0+ICctNS42MjZFKzQnCityZWR4Mjg2IHJlZHVjZSAnLTU2MjYwRSswJyAgIC0+ICctNS42MjZFKzQnCityZWR4Mjg3IHJlZHVjZSAnLTU2MjYwRSsxJyAgIC0+ICctNS42MjZFKzUnCityZWR4Mjg4IHJlZHVjZSAnLTU2MjYwRSsyJyAgIC0+ICctNS42MjZFKzYnCityZWR4Mjg5IHJlZHVjZSAnLTU2MjYwRSszJyAgIC0+ICctNS42MjZFKzcnCityZWR4MjkwIHJlZHVjZSAnLTU2MjYwRSs0JyAgIC0+ICctNS42MjZFKzgnCityZWR4MjkxIHJlZHVjZSAnLTU2MjYwRSs1JyAgIC0+ICctNS42MjZFKzknCityZWR4MjkyIHJlZHVjZSAnLTU2MjYwRSs2JyAgIC0+ICctNS42MjZFKzEwJworCistLSBGTCB0ZXN0CitwcmVjaXNpb246IDQwCityZWR4Mjk1IHJlZHVjZSA5ODkyMzQ1NjczLjAxMjM0NTY3ODAwMDAwMDAwMDAgLT4gOTg5MjM0NTY3My4wMTIzNDU2NzgKKworLS0gc3BlY2lhbHMKK3JlZHg4MjAgcmVkdWNlICdJbmYnICAgIC0+ICdJbmZpbml0eScKK3JlZHg4MjEgcmVkdWNlICctSW5mJyAgIC0+ICctSW5maW5pdHknCityZWR4ODIyIHJlZHVjZSAgIE5hTiAgICAtPiAgTmFOCityZWR4ODIzIHJlZHVjZSAgc05hTiAgICAtPiAgTmFOICAgIEludmFsaWRfb3BlcmF0aW9uCityZWR4ODI0IHJlZHVjZSAgIE5hTjEwMSAtPiAgTmFOMTAxCityZWR4ODI1IHJlZHVjZSAgc05hTjAxMCAtPiAgTmFOMTAgIEludmFsaWRfb3BlcmF0aW9uCityZWR4ODI3IHJlZHVjZSAgLU5hTiAgICAtPiAtTmFOCityZWR4ODI4IHJlZHVjZSAtc05hTiAgICAtPiAtTmFOICAgIEludmFsaWRfb3BlcmF0aW9uCityZWR4ODI5IHJlZHVjZSAgLU5hTjEwMSAtPiAtTmFOMTAxCityZWR4ODMwIHJlZHVjZSAtc05hTjAxMCAtPiAtTmFOMTAgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHBheWxvYWQgZGVjYXBpdGF0ZQorcHJlY2lzaW9uOiA1CityZWR4NjIxMDAgcmVkdWNlICBzTmFOMTIzNDU2Nzg5MCAtPiBOYU42Nzg5MCAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0CityZWR4OTAwIHJlZHVjZSAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmVtYWluZGVyLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JlbWFpbmRlci5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMTA2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JlbWFpbmRlci5kZWNUZXN0CkBAIC0wLDAgKzEsNjQwIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHJlbWFpbmRlci5kZWNUZXN0IC0tIGRlY2ltYWwgcmVtYWluZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworLS0gc2FuaXR5IGNoZWNrcyAoYXMgYmFzZSwgYWJvdmUpCityZW14MDAxIHJlbWFpbmRlciAgMSAgICAgMSAgICAtPiAgMAorcmVteDAwMiByZW1haW5kZXIgIDIgICAgIDEgICAgLT4gIDAKK3JlbXgwMDMgcmVtYWluZGVyICAxICAgICAyICAgIC0+ICAxCityZW14MDA0IHJlbWFpbmRlciAgMiAgICAgMiAgICAtPiAgMAorcmVteDAwNSByZW1haW5kZXIgIDAgICAgIDEgICAgLT4gIDAKK3JlbXgwMDYgcmVtYWluZGVyICAwICAgICAyICAgIC0+ICAwCityZW14MDA3IHJlbWFpbmRlciAgMSAgICAgMyAgICAtPiAgMQorcmVteDAwOCByZW1haW5kZXIgIDIgICAgIDMgICAgLT4gIDIKK3JlbXgwMDkgcmVtYWluZGVyICAzICAgICAzICAgIC0+ICAwCisKK3JlbXgwMTAgcmVtYWluZGVyICAyLjQgICAxICAgIC0+ICAwLjQKK3JlbXgwMTEgcmVtYWluZGVyICAyLjQgICAtMSAgIC0+ICAwLjQKK3JlbXgwMTIgcmVtYWluZGVyICAtMi40ICAxICAgIC0+ICAtMC40CityZW14MDEzIHJlbWFpbmRlciAgLTIuNCAgLTEgICAtPiAgLTAuNAorcmVteDAxNCByZW1haW5kZXIgIDIuNDAgIDEgICAgLT4gIDAuNDAKK3JlbXgwMTUgcmVtYWluZGVyICAyLjQwMCAxICAgIC0+ICAwLjQwMAorcmVteDAxNiByZW1haW5kZXIgIDIuNCAgIDIgICAgLT4gIDAuNAorcmVteDAxNyByZW1haW5kZXIgIDIuNDAwIDIgICAgLT4gIDAuNDAwCityZW14MDE4IHJlbWFpbmRlciAgMi4gICAgMiAgICAtPiAgMAorcmVteDAxOSByZW1haW5kZXIgIDIwICAgIDIwICAgLT4gIDAKKworcmVteDAyMCByZW1haW5kZXIgIDE4NyAgIDE4NyAgICAtPiAgMAorcmVteDAyMSByZW1haW5kZXIgIDUgICAgIDIgICAgICAtPiAgMQorcmVteDAyMiByZW1haW5kZXIgIDUgICAgIDIuMCAgICAtPiAgMS4wCityZW14MDIzIHJlbWFpbmRlciAgNSAgICAgMi4wMDAgIC0+ICAxLjAwMAorcmVteDAyNCByZW1haW5kZXIgIDUgICAgIDAuMjAwICAtPiAgMC4wMDAKK3JlbXgwMjUgcmVtYWluZGVyICA1ICAgICAwLjIwMCAgLT4gIDAuMDAwCisKK3JlbXgwMzAgcmVtYWluZGVyICAxICAgICAyICAgICAgLT4gIDEKK3JlbXgwMzEgcmVtYWluZGVyICAxICAgICA0ICAgICAgLT4gIDEKK3JlbXgwMzIgcmVtYWluZGVyICAxICAgICA4ICAgICAgLT4gIDEKKworcmVteDAzMyByZW1haW5kZXIgIDEgICAgIDE2ICAgICAtPiAgMQorcmVteDAzNCByZW1haW5kZXIgIDEgICAgIDMyICAgICAtPiAgMQorcmVteDAzNSByZW1haW5kZXIgIDEgICAgIDY0ICAgICAtPiAgMQorcmVteDA0MCByZW1haW5kZXIgIDEgICAgLTIgICAgICAtPiAgMQorcmVteDA0MSByZW1haW5kZXIgIDEgICAgLTQgICAgICAtPiAgMQorcmVteDA0MiByZW1haW5kZXIgIDEgICAgLTggICAgICAtPiAgMQorcmVteDA0MyByZW1haW5kZXIgIDEgICAgLTE2ICAgICAtPiAgMQorcmVteDA0NCByZW1haW5kZXIgIDEgICAgLTMyICAgICAtPiAgMQorcmVteDA0NSByZW1haW5kZXIgIDEgICAgLTY0ICAgICAtPiAgMQorcmVteDA1MCByZW1haW5kZXIgLTEgICAgIDIgICAgICAtPiAgLTEKK3JlbXgwNTEgcmVtYWluZGVyIC0xICAgICA0ICAgICAgLT4gIC0xCityZW14MDUyIHJlbWFpbmRlciAtMSAgICAgOCAgICAgIC0+ICAtMQorcmVteDA1MyByZW1haW5kZXIgLTEgICAgIDE2ICAgICAtPiAgLTEKK3JlbXgwNTQgcmVtYWluZGVyIC0xICAgICAzMiAgICAgLT4gIC0xCityZW14MDU1IHJlbWFpbmRlciAtMSAgICAgNjQgICAgIC0+ICAtMQorcmVteDA2MCByZW1haW5kZXIgLTEgICAgLTIgICAgICAtPiAgLTEKK3JlbXgwNjEgcmVtYWluZGVyIC0xICAgIC00ICAgICAgLT4gIC0xCityZW14MDYyIHJlbWFpbmRlciAtMSAgICAtOCAgICAgIC0+ICAtMQorcmVteDA2MyByZW1haW5kZXIgLTEgICAgLTE2ICAgICAtPiAgLTEKK3JlbXgwNjQgcmVtYWluZGVyIC0xICAgIC0zMiAgICAgLT4gIC0xCityZW14MDY1IHJlbWFpbmRlciAtMSAgICAtNjQgICAgIC0+ICAtMQorCityZW14MDY2IHJlbWFpbmRlciAgOTk5OTk5OTk5ICAgICAxICAtPiAwCityZW14MDY3IHJlbWFpbmRlciAgOTk5OTk5OTk5LjQgICAxICAtPiAwLjQKK3JlbXgwNjggcmVtYWluZGVyICA5OTk5OTk5OTkuNSAgIDEgIC0+IDAuNQorcmVteDA2OSByZW1haW5kZXIgIDk5OTk5OTk5OS45ICAgMSAgLT4gMC45CityZW14MDcwIHJlbWFpbmRlciAgOTk5OTk5OTk5Ljk5OSAxICAtPiAwLjk5OQorcHJlY2lzaW9uOiA2CityZW14MDcxIHJlbWFpbmRlciAgOTk5OTk5OTk5ICAgICAxICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDA3MiByZW1haW5kZXIgIDk5OTk5OTk5ICAgICAgMSAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXgwNzMgcmVtYWluZGVyICA5OTk5OTk5ICAgICAgIDEgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14MDc0IHJlbWFpbmRlciAgOTk5OTk5ICAgICAgICAxICAtPiAwCityZW14MDc1IHJlbWFpbmRlciAgOTk5OTkgICAgICAgICAxICAtPiAwCityZW14MDc2IHJlbWFpbmRlciAgOTk5OSAgICAgICAgICAxICAtPiAwCityZW14MDc3IHJlbWFpbmRlciAgOTk5ICAgICAgICAgICAxICAtPiAwCityZW14MDc4IHJlbWFpbmRlciAgOTkgICAgICAgICAgICAxICAtPiAwCityZW14MDc5IHJlbWFpbmRlciAgOSAgICAgICAgICAgICAxICAtPiAwCisKK3ByZWNpc2lvbjogOQorcmVteDA4MCByZW1haW5kZXIgIDAuICAgICAgICAgICAgMSAgLT4gMAorcmVteDA4MSByZW1haW5kZXIgIC4wICAgICAgICAgICAgMSAgLT4gMC4wCityZW14MDgyIHJlbWFpbmRlciAgMC4wMCAgICAgICAgICAxICAtPiAwLjAwCityZW14MDgzIHJlbWFpbmRlciAgMC4wMEUrOSAgICAgICAxICAtPiAwCityZW14MDg0IHJlbWFpbmRlciAgMC4wMEUrMyAgICAgICAxICAtPiAwCityZW14MDg1IHJlbWFpbmRlciAgMC4wMEUrMiAgICAgICAxICAtPiAwCityZW14MDg2IHJlbWFpbmRlciAgMC4wMEUrMSAgICAgICAxICAtPiAwLjAKK3JlbXgwODcgcmVtYWluZGVyICAwLjAwRSswICAgICAgIDEgIC0+IDAuMDAKK3JlbXgwODggcmVtYWluZGVyICAwLjAwRS0wICAgICAgIDEgIC0+IDAuMDAKK3JlbXgwODkgcmVtYWluZGVyICAwLjAwRS0xICAgICAgIDEgIC0+IDAuMDAwCityZW14MDkwIHJlbWFpbmRlciAgMC4wMEUtMiAgICAgICAxICAtPiAwLjAwMDAKK3JlbXgwOTEgcmVtYWluZGVyICAwLjAwRS0zICAgICAgIDEgIC0+IDAuMDAwMDAKK3JlbXgwOTIgcmVtYWluZGVyICAwLjAwRS00ICAgICAgIDEgIC0+IDAuMDAwMDAwCityZW14MDkzIHJlbWFpbmRlciAgMC4wMEUtNSAgICAgICAxICAtPiAwRS03CityZW14MDk0IHJlbWFpbmRlciAgMC4wMEUtNiAgICAgICAxICAtPiAwRS04CityZW14MDk1IHJlbWFpbmRlciAgMC4wMDAwRS01MCAgICAxICAtPiAwRS01NAorCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIHJlbWFpbmRlciBieSAwCitwcmVjaXNpb246IDkKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CityZW14MTAxIHJlbWFpbmRlciAgMCAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorcmVteDEwMiByZW1haW5kZXIgIDAgICAgICAtMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK3JlbXgxMDMgcmVtYWluZGVyIC0wICAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCityZW14MTA0IHJlbWFpbmRlciAtMCAgICAgIC0wICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorcmVteDEwNSByZW1haW5kZXIgIDAuMEU1ICAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK3JlbXgxMDYgcmVtYWluZGVyICAwLjAwMCAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCistLSBbU29tZSB0aGluayB0aGlzIG5leHQgZ3JvdXAgc2hvdWxkIGJlIERpdmlzaW9uX2J5X3plcm8gZXhjZXB0aW9uLCBidXQKKy0tIElFRUUgODU0IGlzIGV4cGxpY2l0IHRoYXQgaXQgaXMgSW52YWxpZCBvcGVyYXRpb24gLi4gZm9yCistLSByZW1haW5kZXItbmVhciwgYW55d2F5XQorcmVteDEwNyByZW1haW5kZXIgIDAuMDAwMSAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDEwOCByZW1haW5kZXIgIDAuMDEgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDEwOSByZW1haW5kZXIgIDAuMSAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDExMCByZW1haW5kZXIgIDEgICAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDExMSByZW1haW5kZXIgIDEgICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDExMiByZW1haW5kZXIgMTAgICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDExMyByZW1haW5kZXIgMUUrMTAwICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDExNCByZW1haW5kZXIgMUUrMTAwMCAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDExNSByZW1haW5kZXIgIDAuMDAwMSAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDExNiByZW1haW5kZXIgIDAuMDEgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDExOSByZW1haW5kZXIgIDAuMSAgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDEyMCByZW1haW5kZXIgIDEgICAgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDEyMSByZW1haW5kZXIgIDEgICAgICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDEyMiByZW1haW5kZXIgMTAgICAgICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDEyMyByZW1haW5kZXIgMUUrMTAwICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDEyNCByZW1haW5kZXIgMUUrMTAwMCAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYW5kIHplcm9zIG9uIGxlZnQKK3JlbXgxMzAgcmVtYWluZGVyICAwICAgICAgMSAgIC0+ICAwCityZW14MTMxIHJlbWFpbmRlciAgMCAgICAgLTEgICAtPiAgMAorcmVteDEzMiByZW1haW5kZXIgIDAuMCAgICAxICAgLT4gIDAuMAorcmVteDEzMyByZW1haW5kZXIgIDAuMCAgIC0xICAgLT4gIDAuMAorcmVteDEzNCByZW1haW5kZXIgLTAgICAgICAxICAgLT4gLTAKK3JlbXgxMzUgcmVtYWluZGVyIC0wICAgICAtMSAgIC0+IC0wCityZW14MTM2IHJlbWFpbmRlciAtMC4wICAgIDEgICAtPiAtMC4wCityZW14MTM3IHJlbWFpbmRlciAtMC4wICAgLTEgICAtPiAtMC4wCisKKy0tIDAuNWVycworcmVteDE0MyByZW1haW5kZXIgICAwLjUgIDIgICAgIC0+ICAwLjUKK3JlbXgxNDQgcmVtYWluZGVyICAgMC41ICAyLjEgICAtPiAgMC41CityZW14MTQ1IHJlbWFpbmRlciAgIDAuNSAgMi4wMSAgLT4gIDAuNTAKK3JlbXgxNDYgcmVtYWluZGVyICAgMC41ICAyLjAwMSAtPiAgMC41MDAKK3JlbXgxNDcgcmVtYWluZGVyICAgMC41MCAyICAgICAtPiAgMC41MAorcmVteDE0OCByZW1haW5kZXIgICAwLjUwIDIuMDEgIC0+ICAwLjUwCityZW14MTQ5IHJlbWFpbmRlciAgIDAuNTAgMi4wMDEgLT4gIDAuNTAwCisKKy0tIHN0ZWFkaWVzCityZW14MTUwIHJlbWFpbmRlciAgMSAgMSAgIC0+IDAKK3JlbXgxNTEgcmVtYWluZGVyICAxICAyICAgLT4gMQorcmVteDE1MiByZW1haW5kZXIgIDEgIDMgICAtPiAxCityZW14MTUzIHJlbWFpbmRlciAgMSAgNCAgIC0+IDEKK3JlbXgxNTQgcmVtYWluZGVyICAxICA1ICAgLT4gMQorcmVteDE1NSByZW1haW5kZXIgIDEgIDYgICAtPiAxCityZW14MTU2IHJlbWFpbmRlciAgMSAgNyAgIC0+IDEKK3JlbXgxNTcgcmVtYWluZGVyICAxICA4ICAgLT4gMQorcmVteDE1OCByZW1haW5kZXIgIDEgIDkgICAtPiAxCityZW14MTU5IHJlbWFpbmRlciAgMSAgMTAgIC0+IDEKK3JlbXgxNjAgcmVtYWluZGVyICAxICAxICAgLT4gMAorcmVteDE2MSByZW1haW5kZXIgIDIgIDEgICAtPiAwCityZW14MTYyIHJlbWFpbmRlciAgMyAgMSAgIC0+IDAKK3JlbXgxNjMgcmVtYWluZGVyICA0ICAxICAgLT4gMAorcmVteDE2NCByZW1haW5kZXIgIDUgIDEgICAtPiAwCityZW14MTY1IHJlbWFpbmRlciAgNiAgMSAgIC0+IDAKK3JlbXgxNjYgcmVtYWluZGVyICA3ICAxICAgLT4gMAorcmVteDE2NyByZW1haW5kZXIgIDggIDEgICAtPiAwCityZW14MTY4IHJlbWFpbmRlciAgOSAgMSAgIC0+IDAKK3JlbXgxNjkgcmVtYWluZGVyICAxMCAxICAgLT4gMAorCistLSBzb21lIGRpZmZlcmVuY2VzIGZyb20gcmVtYWluZGVyTmVhcgorcmVteDE3MSByZW1haW5kZXIgICAwLjQgIDEuMDIwIC0+ICAwLjQwMAorcmVteDE3MiByZW1haW5kZXIgICAwLjUwIDEuMDIwIC0+ICAwLjUwMAorcmVteDE3MyByZW1haW5kZXIgICAwLjUxIDEuMDIwIC0+ICAwLjUxMAorcmVteDE3NCByZW1haW5kZXIgICAwLjUyIDEuMDIwIC0+ICAwLjUyMAorcmVteDE3NSByZW1haW5kZXIgICAwLjYgIDEuMDIwIC0+ICAwLjYwMAorCisKKy0tIE1vcmUgZmxhdm91cnMgb2YgcmVtYWluZGVyIGJ5IDAKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CityZW14MjAxIHJlbWFpbmRlciAgMCAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCityZW14MjAyIHJlbWFpbmRlciAgMC4wRTUgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCityZW14MjAzIHJlbWFpbmRlciAgMC4wMDAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCityZW14MjA0IHJlbWFpbmRlciAgMC4wMDAxIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgyMDUgcmVtYWluZGVyICAwLjAxICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDIwNiByZW1haW5kZXIgIDAuMSAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14MjA3IHJlbWFpbmRlciAgMSAgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgyMDggcmVtYWluZGVyICAxICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDIwOSByZW1haW5kZXIgMTAgICAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14MjEwIHJlbWFpbmRlciAxRSsxMDAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgyMTEgcmVtYWluZGVyIDFFKzEwMDAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBzb21lIGRpZmZlcmVuY2VzIGZyb20gcmVtYWluZGVyTmVhcgorcmVteDIzMSByZW1haW5kZXIgIC0wLjQgIDEuMDIwIC0+IC0wLjQwMAorcmVteDIzMiByZW1haW5kZXIgIC0wLjUwIDEuMDIwIC0+IC0wLjUwMAorcmVteDIzMyByZW1haW5kZXIgIC0wLjUxIDEuMDIwIC0+IC0wLjUxMAorcmVteDIzNCByZW1haW5kZXIgIC0wLjUyIDEuMDIwIC0+IC0wLjUyMAorcmVteDIzNSByZW1haW5kZXIgIC0wLjYgIDEuMDIwIC0+IC0wLjYwMAorCistLSBoaWdoIFhzCityZW14MjQwIHJlbWFpbmRlciAgMUUrMiAgMS4wMCAgLT4gIDAuMDAKKworCistLSB0ZXN0IHNvbWUgY2FzZXMgdGhhdCBhcmUgY2xvc2UgdG8gZXhwb25lbnQgb3ZlcmZsb3cKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CityZW14MjcwIHJlbWFpbmRlciAxIDFlOTk5OTk5OTk5ICAgIC0+IDEKK3JlbXgyNzEgcmVtYWluZGVyIDEgMC45ZTk5OTk5OTk5OSAgLT4gMQorcmVteDI3MiByZW1haW5kZXIgMSAwLjk5ZTk5OTk5OTk5OSAtPiAxCityZW14MjczIHJlbWFpbmRlciAxIDAuOTk5OTk5OTk5ZTk5OTk5OTk5OSAtPiAxCityZW14Mjc0IHJlbWFpbmRlciA5ZTk5OTk5OTk5OSAgICAgICAgICAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14Mjc1IHJlbWFpbmRlciA5LjllOTk5OTk5OTk5ICAgICAgICAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14Mjc2IHJlbWFpbmRlciA5Ljk5ZTk5OTk5OTk5OSAgICAgICAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14Mjc3IHJlbWFpbmRlciA5Ljk5OTk5OTk5ZTk5OTk5OTk5OSAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKK3JlbXgyODAgcmVtYWluZGVyIDAuMSA5ZS05OTk5OTk5OTkgICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXgyODEgcmVtYWluZGVyIDAuMSA5OWUtOTk5OTk5OTk5ICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXgyODIgcmVtYWluZGVyIDAuMSA5OTllLTk5OTk5OTk5OSAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworcmVteDI4MyByZW1haW5kZXIgMC4xIDllLTk5OTk5OTk5OCAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDI4NCByZW1haW5kZXIgMC4xIDk5ZS05OTk5OTk5OTggICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDI4NSByZW1haW5kZXIgMC4xIDk5OWUtOTk5OTk5OTk4ICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDI4NiByZW1haW5kZXIgMC4xIDk5OWUtOTk5OTk5OTk3ICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDI4NyByZW1haW5kZXIgMC4xIDk5OTllLTk5OTk5OTk5NyAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDI4OCByZW1haW5kZXIgMC4xIDk5OTk5ZS05OTk5OTk5OTcgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCistLSByZW14M3h4IGFyZSBmcm9tIERpYWdCaWdEZWNpbWFsCityZW14MzAxIHJlbWFpbmRlciAgIDEgICAgMyAgICAgLT4gIDEKK3JlbXgzMDIgcmVtYWluZGVyICAgNSAgICA1ICAgICAtPiAgMAorcmVteDMwMyByZW1haW5kZXIgICAxMyAgIDEwICAgIC0+ICAzCityZW14MzA0IHJlbWFpbmRlciAgIDEzICAgNTAgICAgLT4gIDEzCityZW14MzA1IHJlbWFpbmRlciAgIDEzICAgMTAwICAgLT4gIDEzCityZW14MzA2IHJlbWFpbmRlciAgIDEzICAgMTAwMCAgLT4gIDEzCityZW14MzA3IHJlbWFpbmRlciAgIC4xMyAgICAxICAgLT4gIDAuMTMKK3JlbXgzMDggcmVtYWluZGVyICAgMC4xMzMgIDEgICAtPiAgMC4xMzMKK3JlbXgzMDkgcmVtYWluZGVyICAgMC4xMDMzIDEgICAtPiAgMC4xMDMzCityZW14MzEwIHJlbWFpbmRlciAgIDEuMDMzICAxICAgLT4gIDAuMDMzCityZW14MzExIHJlbWFpbmRlciAgIDEwLjMzICAxICAgLT4gIDAuMzMKK3JlbXgzMTIgcmVtYWluZGVyICAgMTAuMzMgMTAgICAtPiAgMC4zMworcmVteDMxMyByZW1haW5kZXIgICAxMDMuMyAgMSAgIC0+ICAwLjMKK3JlbXgzMTQgcmVtYWluZGVyICAgMTMzICAgMTAgICAtPiAgMworcmVteDMxNSByZW1haW5kZXIgICAxMDMzICAxMCAgIC0+ICAzCityZW14MzE2IHJlbWFpbmRlciAgIDEwMzMgIDUwICAgLT4gIDMzCityZW14MzE3IHJlbWFpbmRlciAgIDEwMS4wICAzICAgLT4gIDIuMAorcmVteDMxOCByZW1haW5kZXIgICAxMDIuMCAgMyAgIC0+ICAwLjAKK3JlbXgzMTkgcmVtYWluZGVyICAgMTAzLjAgIDMgICAtPiAgMS4wCityZW14MzIwIHJlbWFpbmRlciAgIDIuNDAgICAxICAgLT4gIDAuNDAKK3JlbXgzMjEgcmVtYWluZGVyICAgMi40MDAgIDEgICAtPiAgMC40MDAKK3JlbXgzMjIgcmVtYWluZGVyICAgMi40ICAgIDEgICAtPiAgMC40CityZW14MzIzIHJlbWFpbmRlciAgIDIuNCAgICAyICAgLT4gIDAuNAorcmVteDMyNCByZW1haW5kZXIgICAyLjQwMCAgMiAgIC0+ICAwLjQwMAorcmVteDMyNSByZW1haW5kZXIgICAxICAgMC4zICAgIC0+ICAwLjEKK3JlbXgzMjYgcmVtYWluZGVyICAgMSAgIDAuMzAgICAtPiAgMC4xMAorcmVteDMyNyByZW1haW5kZXIgICAxICAgMC4zMDAgIC0+ICAwLjEwMAorcmVteDMyOCByZW1haW5kZXIgICAxICAgMC4zMDAwIC0+ICAwLjEwMDAKK3JlbXgzMjkgcmVtYWluZGVyICAgMS4wICAgIDAuMyAtPiAgMC4xCityZW14MzMwIHJlbWFpbmRlciAgIDEuMDAgICAwLjMgLT4gIDAuMTAKK3JlbXgzMzEgcmVtYWluZGVyICAgMS4wMDAgIDAuMyAtPiAgMC4xMDAKK3JlbXgzMzIgcmVtYWluZGVyICAgMS4wMDAwIDAuMyAtPiAgMC4xMDAwCityZW14MzMzIHJlbWFpbmRlciAgIDAuNSAgMiAgICAgLT4gIDAuNQorcmVteDMzNCByZW1haW5kZXIgICAwLjUgIDIuMSAgIC0+ICAwLjUKK3JlbXgzMzUgcmVtYWluZGVyICAgMC41ICAyLjAxICAtPiAgMC41MAorcmVteDMzNiByZW1haW5kZXIgICAwLjUgIDIuMDAxIC0+ICAwLjUwMAorcmVteDMzNyByZW1haW5kZXIgICAwLjUwIDIgICAgIC0+ICAwLjUwCityZW14MzM4IHJlbWFpbmRlciAgIDAuNTAgMi4wMSAgLT4gIDAuNTAKK3JlbXgzMzkgcmVtYWluZGVyICAgMC41MCAyLjAwMSAtPiAgMC41MDAKKworcmVteDM0MCByZW1haW5kZXIgICAwLjUgICAwLjUwMDAwMDEgICAgLT4gIDAuNTAwMDAwMAorcmVteDM0MSByZW1haW5kZXIgICAwLjUgICAwLjUwMDAwMDAxICAgIC0+ICAwLjUwMDAwMDAwCityZW14MzQyIHJlbWFpbmRlciAgIDAuNSAgIDAuNTAwMDAwMDAxICAgIC0+ICAwLjUwMDAwMDAwMAorcmVteDM0MyByZW1haW5kZXIgICAwLjUgICAwLjUwMDAwMDAwMDEgICAgLT4gIDAuNTAwMDAwMDAwICBSb3VuZGVkCityZW14MzQ0IHJlbWFpbmRlciAgIDAuNSAgIDAuNTAwMDAwMDAwMDEgICAgLT4gIDAuNTAwMDAwMDAwICBSb3VuZGVkCityZW14MzQ1IHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OSAgICAtPiAgMUUtNworcmVteDM0NiByZW1haW5kZXIgICAwLjUgICAwLjQ5OTk5OTk5ICAgIC0+ICAxRS04CityZW14MzQ3IHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OTk5ICAgIC0+ICAxRS05CityZW14MzQ4IHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OTk5OSAgICAtPiAgMUUtMTAKK3JlbXgzNDkgcmVtYWluZGVyICAgMC41ICAgMC40OTk5OTk5OTk5OSAgICAtPiAgMUUtMTEKK3JlbXgzNTAgcmVtYWluZGVyICAgMC41ICAgMC40OTk5OTk5OTk5OTkgICAgLT4gIDFFLTEyCisKK3JlbXgzNTEgcmVtYWluZGVyICAgMC4wMyAgNyAgLT4gIDAuMDMKK3JlbXgzNTIgcmVtYWluZGVyICAgNSAgIDIgICAgLT4gIDEKK3JlbXgzNTMgcmVtYWluZGVyICAgNC4xICAgMiAgICAtPiAgMC4xCityZW14MzU0IHJlbWFpbmRlciAgIDQuMDEgICAyICAgIC0+ICAwLjAxCityZW14MzU1IHJlbWFpbmRlciAgIDQuMDAxICAgMiAgICAtPiAgMC4wMDEKK3JlbXgzNTYgcmVtYWluZGVyICAgNC4wMDAxICAgMiAgICAtPiAgMC4wMDAxCityZW14MzU3IHJlbWFpbmRlciAgIDQuMDAwMDEgICAyICAgIC0+ICAwLjAwMDAxCityZW14MzU4IHJlbWFpbmRlciAgIDQuMDAwMDAxICAgMiAgICAtPiAgMC4wMDAwMDEKK3JlbXgzNTkgcmVtYWluZGVyICAgNC4wMDAwMDAxICAgMiAgICAtPiAgMUUtNworCityZW14MzYwIHJlbWFpbmRlciAgIDEuMiAgIDAuNzM0NSAtPiAgMC40NjU1CityZW14MzYxIHJlbWFpbmRlciAgIDAuOCAgIDEyICAgICAtPiAgMC44CityZW14MzYyIHJlbWFpbmRlciAgIDAuOCAgIDAuMiAgICAtPiAgMC4wCityZW14MzYzIHJlbWFpbmRlciAgIDAuOCAgIDAuMyAgICAtPiAgMC4yCityZW14MzY0IHJlbWFpbmRlciAgIDAuODAwICAgMTIgICAtPiAgMC44MDAKK3JlbXgzNjUgcmVtYWluZGVyICAgMC44MDAgICAxLjcgIC0+ICAwLjgwMAorcmVteDM2NiByZW1haW5kZXIgICAyLjQwMCAgIDIgICAgLT4gIDAuNDAwCisKK3ByZWNpc2lvbjogNgorcmVteDM3MSByZW1haW5kZXIgICAyLjQwMCAgMiAgICAgICAgLT4gIDAuNDAwCitwcmVjaXNpb246IDMKKy0tIGxvbmcgb3BlcmFuZCwgcm91bmRlZCwgY2FzZQorcmVteDM3MiByZW1haW5kZXIgICAxMjM0NTY3ODkwMDAwMCAxMmUrMTIgLT4gMy40NkUrMTEgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgIDEyMDAwMDAwMDAwMDAwCisKK3ByZWNpc2lvbjogNQorcmVteDM4MSByZW1haW5kZXIgMTIzNDUgIDEgICAgICAgICAtPiAgMAorcmVteDM4MiByZW1haW5kZXIgMTIzNDUgIDEuMDAwMSAgICAtPiAgMC43NjU3CityZW14MzgzIHJlbWFpbmRlciAxMjM0NSAgMS4wMDEgICAgIC0+ICAwLjY2OAorcmVteDM4NCByZW1haW5kZXIgMTIzNDUgIDEuMDEgICAgICAtPiAgMC43OAorcmVteDM4NSByZW1haW5kZXIgMTIzNDUgIDEuMSAgICAgICAtPiAgMC44CityZW14Mzg2IHJlbWFpbmRlciAxMjM1NSAgNCAgICAgICAgIC0+ICAzCityZW14Mzg3IHJlbWFpbmRlciAxMjM0NSAgNCAgICAgICAgIC0+ICAxCityZW14Mzg4IHJlbWFpbmRlciAxMjM1NSAgNC4wMDAxICAgIC0+ICAyLjY5MTIKK3JlbXgzODkgcmVtYWluZGVyIDEyMzQ1ICA0LjAwMDEgICAgLT4gIDAuNjkxNAorcmVteDM5MCByZW1haW5kZXIgMTIzNDUgIDQuOSAgICAgICAtPiAgMS45CityZW14MzkxIHJlbWFpbmRlciAxMjM0NSAgNC45OSAgICAgIC0+ICA0LjczCityZW14MzkyIHJlbWFpbmRlciAxMjM0NSAgNC45OTkgICAgIC0+ICAyLjQ2OQorcmVteDM5MyByZW1haW5kZXIgMTIzNDUgIDQuOTk5OSAgICAtPiAgMC4yNDY5CityZW14Mzk0IHJlbWFpbmRlciAxMjM0NSAgNSAgICAgICAgIC0+ICAwCityZW14Mzk1IHJlbWFpbmRlciAxMjM0NSAgNS4wMDAxICAgIC0+ICA0Ljc1MzIKK3JlbXgzOTYgcmVtYWluZGVyIDEyMzQ1ICA1LjAwMSAgICAgLT4gIDIuNTMyCityZW14Mzk3IHJlbWFpbmRlciAxMjM0NSAgNS4wMSAgICAgIC0+ICAwLjM2CityZW14Mzk4IHJlbWFpbmRlciAxMjM0NSAgNS4xICAgICAgIC0+ICAzLjAKKworcHJlY2lzaW9uOiA5CistLSB0aGUgbmFzdHkgZGl2aXNpb24tYnktMSBjYXNlcworcmVteDQwMSByZW1haW5kZXIgICAwLjUgICAgICAgICAxICAgLT4gIDAuNQorcmVteDQwMiByZW1haW5kZXIgICAwLjU1ICAgICAgICAxICAgLT4gIDAuNTUKK3JlbXg0MDMgcmVtYWluZGVyICAgMC41NTUgICAgICAgMSAgIC0+ICAwLjU1NQorcmVteDQwNCByZW1haW5kZXIgICAwLjU1NTUgICAgICAxICAgLT4gIDAuNTU1NQorcmVteDQwNSByZW1haW5kZXIgICAwLjU1NTU1ICAgICAxICAgLT4gIDAuNTU1NTUKK3JlbXg0MDYgcmVtYWluZGVyICAgMC41NTU1NTUgICAgMSAgIC0+ICAwLjU1NTU1NQorcmVteDQwNyByZW1haW5kZXIgICAwLjU1NTU1NTUgICAxICAgLT4gIDAuNTU1NTU1NQorcmVteDQwOCByZW1haW5kZXIgICAwLjU1NTU1NTU1ICAxICAgLT4gIDAuNTU1NTU1NTUKK3JlbXg0MDkgcmVtYWluZGVyICAgMC41NTU1NTU1NTUgMSAgIC0+ICAwLjU1NTU1NTU1NQorCistLSB6ZXJvIHNpZ25zCityZW14NjUwIHJlbWFpbmRlciAgMSAgMSAtPiAgMAorcmVteDY1MSByZW1haW5kZXIgLTEgIDEgLT4gLTAKK3JlbXg2NTIgcmVtYWluZGVyICAxIC0xIC0+ICAwCityZW14NjUzIHJlbWFpbmRlciAtMSAtMSAtPiAtMAorcmVteDY1NCByZW1haW5kZXIgIDAgIDEgLT4gIDAKK3JlbXg2NTUgcmVtYWluZGVyIC0wICAxIC0+IC0wCityZW14NjU2IHJlbWFpbmRlciAgMCAtMSAtPiAgMAorcmVteDY1NyByZW1haW5kZXIgLTAgLTEgLT4gLTAKK3JlbXg2NTggcmVtYWluZGVyICAwLjAwICAxICAtPiAgMC4wMAorcmVteDY1OSByZW1haW5kZXIgLTAuMDAgIDEgIC0+IC0wLjAwCisKKy0tIFNwZWNpYWxzCityZW14NjgwIHJlbWFpbmRlciAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDY4MSByZW1haW5kZXIgIEluZiAgLTEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg2ODIgcmVtYWluZGVyICBJbmYgIC0xICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14NjgzIHJlbWFpbmRlciAgSW5mICAgMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDY4NCByZW1haW5kZXIgIEluZiAgLTAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg2ODUgcmVtYWluZGVyICBJbmYgICAxICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14Njg2IHJlbWFpbmRlciAgSW5mICAgMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDY4NyByZW1haW5kZXIgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg2ODggcmVtYWluZGVyIC0xMDAwICBJbmYgICAtPiAtMTAwMAorcmVteDY4OSByZW1haW5kZXIgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg2OTEgcmVtYWluZGVyIC0xICAgICBJbmYgICAtPiAtMQorcmVteDY5MiByZW1haW5kZXIgIDAgICAgIEluZiAgIC0+ICAwCityZW14NjkzIHJlbWFpbmRlciAtMCAgICAgSW5mICAgLT4gLTAKK3JlbXg2OTQgcmVtYWluZGVyICAxICAgICBJbmYgICAtPiAgMQorcmVteDY5NSByZW1haW5kZXIgIDEwMDAgIEluZiAgIC0+ICAxMDAwCityZW14Njk2IHJlbWFpbmRlciAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCityZW14NzAwIHJlbWFpbmRlciAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDcwMSByZW1haW5kZXIgLUluZiAgLTEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3MDIgcmVtYWluZGVyIC1JbmYgIC0xICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14NzAzIHJlbWFpbmRlciAtSW5mICAtMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDcwNCByZW1haW5kZXIgLUluZiAgIDAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3MDUgcmVtYWluZGVyIC1JbmYgICAxICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14NzA2IHJlbWFpbmRlciAtSW5mICAgMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDcwNyByZW1haW5kZXIgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3MDggcmVtYWluZGVyIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14NzA5IHJlbWFpbmRlciAtMTAwMCAgSW5mICAgLT4gLTEwMDAKK3JlbXg3MTAgcmVtYWluZGVyIC0xICAgIC1JbmYgICAtPiAtMQorcmVteDcxMSByZW1haW5kZXIgLTAgICAgLUluZiAgIC0+IC0wCityZW14NzEyIHJlbWFpbmRlciAgMCAgICAtSW5mICAgLT4gIDAKK3JlbXg3MTMgcmVtYWluZGVyICAxICAgIC1JbmYgICAtPiAgMQorcmVteDcxNCByZW1haW5kZXIgIDEwMDAgLUluZiAgIC0+ICAxMDAwCityZW14NzE1IHJlbWFpbmRlciAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCityZW14NzIxIHJlbWFpbmRlciAgTmFOIC1JbmYgICAgLT4gIE5hTgorcmVteDcyMiByZW1haW5kZXIgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK3JlbXg3MjMgcmVtYWluZGVyICBOYU4gLTEgICAgICAtPiAgTmFOCityZW14NzI0IHJlbWFpbmRlciAgTmFOIC0wICAgICAgLT4gIE5hTgorcmVteDcyNSByZW1haW5kZXIgLU5hTiAgMCAgICAgIC0+IC1OYU4KK3JlbXg3MjYgcmVtYWluZGVyICBOYU4gIDEgICAgICAtPiAgTmFOCityZW14NzI3IHJlbWFpbmRlciAgTmFOICAxMDAwICAgLT4gIE5hTgorcmVteDcyOCByZW1haW5kZXIgIE5hTiAgSW5mICAgIC0+ICBOYU4KK3JlbXg3MjkgcmVtYWluZGVyICBOYU4gLU5hTiAgICAtPiAgTmFOCityZW14NzMwIHJlbWFpbmRlciAtSW5mICBOYU4gICAgLT4gIE5hTgorcmVteDczMSByZW1haW5kZXIgLTEwMDAgTmFOICAgIC0+ICBOYU4KK3JlbXg3MzIgcmVtYWluZGVyIC0xICAgIE5hTiAgICAtPiAgTmFOCityZW14NzMzIHJlbWFpbmRlciAtMCAgIC1OYU4gICAgLT4gLU5hTgorcmVteDczNCByZW1haW5kZXIgIDAgICAgTmFOICAgIC0+ICBOYU4KK3JlbXg3MzUgcmVtYWluZGVyICAxICAgLU5hTiAgICAtPiAtTmFOCityZW14NzM2IHJlbWFpbmRlciAgMTAwMCBOYU4gICAgLT4gIE5hTgorcmVteDczNyByZW1haW5kZXIgIEluZiAgTmFOICAgIC0+ICBOYU4KKworcmVteDc0MSByZW1haW5kZXIgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZW14NzQyIHJlbWFpbmRlciAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NDMgcmVtYWluZGVyIC1zTmFOIC0xICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc0NCByZW1haW5kZXIgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZW14NzQ1IHJlbWFpbmRlciAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NDYgcmVtYWluZGVyICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc0NyByZW1haW5kZXIgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZW14NzQ5IHJlbWFpbmRlciAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NTAgcmVtYWluZGVyICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc1MSByZW1haW5kZXIgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZW14NzUyIHJlbWFpbmRlciAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NTMgcmVtYWluZGVyIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc1NCByZW1haW5kZXIgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZW14NzU1IHJlbWFpbmRlciAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NTYgcmVtYWluZGVyICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc1NyByZW1haW5kZXIgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZW14NzU4IHJlbWFpbmRlciAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NTkgcmVtYWluZGVyICBJbmYgLXNOYU4gICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdpbmcgTmFOcworcmVteDc2MCByZW1haW5kZXIgIE5hTjEgICBOYU43ICAgLT4gIE5hTjEKK3JlbXg3NjEgcmVtYWluZGVyIHNOYU4yICAgTmFOOCAgIC0+ICBOYU4yIEludmFsaWRfb3BlcmF0aW9uCityZW14NzYyIHJlbWFpbmRlciAgTmFOMyAgc05hTjkgICAtPiAgTmFOOSBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc2MyByZW1haW5kZXIgc05hTjQgIHNOYU4xMCAgLT4gIE5hTjQgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NjQgcmVtYWluZGVyICAgIDE1ICAgTmFOMTEgIC0+ICBOYU4xMQorcmVteDc2NSByZW1haW5kZXIgIE5hTjYgICBOYU4xMiAgLT4gIE5hTjYKK3JlbXg3NjYgcmVtYWluZGVyICBJbmYgICAgTmFOMTMgIC0+ICBOYU4xMworcmVteDc2NyByZW1haW5kZXIgIE5hTjE0ICAtSW5mICAgLT4gIE5hTjE0CityZW14NzY4IHJlbWFpbmRlciAgICAwICAgIE5hTjE1ICAtPiAgTmFOMTUKK3JlbXg3NjkgcmVtYWluZGVyICBOYU4xNiAgIC0wICAgIC0+ICBOYU4xNgorCistLSB0ZXN0IHNvbWUgY2FzZXMgdGhhdCBhcmUgY2xvc2UgdG8gZXhwb25lbnQgb3ZlcmZsb3cKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CityZW14NzcwIHJlbWFpbmRlciAxIDFlOTk5OTk5OTk5ICAgIC0+IDEKK3JlbXg3NzEgcmVtYWluZGVyIDEgMC45ZTk5OTk5OTk5OSAgLT4gMQorcmVteDc3MiByZW1haW5kZXIgMSAwLjk5ZTk5OTk5OTk5OSAtPiAxCityZW14NzczIHJlbWFpbmRlciAxIDAuOTk5OTk5OTk5ZTk5OTk5OTk5OSAtPiAxCityZW14Nzc0IHJlbWFpbmRlciA5ZTk5OTk5OTk5OSAgICAgICAgICAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14Nzc1IHJlbWFpbmRlciA5LjllOTk5OTk5OTk5ICAgICAgICAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14Nzc2IHJlbWFpbmRlciA5Ljk5ZTk5OTk5OTk5OSAgICAgICAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14Nzc3IHJlbWFpbmRlciA5Ljk5OTk5OTk5ZTk5OTk5OTk5OSAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKKy0tIGxvbmcgb3BlcmFuZCBjaGVja3MKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK3JlbXg4MDEgcmVtYWluZGVyIDEyMzQ1Njc4MDAwIDEwMCAtPiAwCityZW14ODAyIHJlbWFpbmRlciAxIDEyMzQ1Njc4MDAwICAgLT4gMQorcmVteDgwMyByZW1haW5kZXIgMTIzNDU2NzgwMCAgMTAgIC0+IDAKK3JlbXg4MDQgcmVtYWluZGVyIDEgMTIzNDU2NzgwMCAgICAtPiAxCityZW14ODA1IHJlbWFpbmRlciAxMjM0NTY3ODkwICAxMCAgLT4gMAorcmVteDgwNiByZW1haW5kZXIgMSAxMjM0NTY3ODkwICAgIC0+IDEKK3JlbXg4MDcgcmVtYWluZGVyIDEyMzQ1Njc4OTEgIDEwICAtPiAxCityZW14ODA4IHJlbWFpbmRlciAxIDEyMzQ1Njc4OTEgICAgLT4gMQorcmVteDgwOSByZW1haW5kZXIgMTIzNDU2Nzg5MDEgMTAwIC0+IDEKK3JlbXg4MTAgcmVtYWluZGVyIDEgMTIzNDU2Nzg5MDEgICAtPiAxCityZW14ODExIHJlbWFpbmRlciAxMjM0NTY3ODk2ICAxMCAgLT4gNgorcmVteDgxMiByZW1haW5kZXIgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworcHJlY2lzaW9uOiAxNQorcmVteDgyMSByZW1haW5kZXIgMTIzNDU2NzgwMDAgMTAwIC0+IDAKK3JlbXg4MjIgcmVtYWluZGVyIDEgMTIzNDU2NzgwMDAgICAtPiAxCityZW14ODIzIHJlbWFpbmRlciAxMjM0NTY3ODAwICAxMCAgLT4gMAorcmVteDgyNCByZW1haW5kZXIgMSAxMjM0NTY3ODAwICAgIC0+IDEKK3JlbXg4MjUgcmVtYWluZGVyIDEyMzQ1Njc4OTAgIDEwICAtPiAwCityZW14ODI2IHJlbWFpbmRlciAxIDEyMzQ1Njc4OTAgICAgLT4gMQorcmVteDgyNyByZW1haW5kZXIgMTIzNDU2Nzg5MSAgMTAgIC0+IDEKK3JlbXg4MjggcmVtYWluZGVyIDEgMTIzNDU2Nzg5MSAgICAtPiAxCityZW14ODI5IHJlbWFpbmRlciAxMjM0NTY3ODkwMSAxMDAgLT4gMQorcmVteDgzMCByZW1haW5kZXIgMSAxMjM0NTY3ODkwMSAgIC0+IDEKK3JlbXg4MzEgcmVtYWluZGVyIDEyMzQ1Njc4OTYgIDEwICAtPiA2CityZW14ODMyIHJlbWFpbmRlciAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCistLSB3b3JyaWVzIGZyb20gZGl2aWRlaW50CitwcmVjaXNpb246IDgKK3JlbXg4NDAgcmVtYWluZGVyICAxMDAwMDAwMDAuMCAgIDEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDg0MSByZW1haW5kZXIgIDEwMDAwMDAwMC40ICAgMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14ODQyIHJlbWFpbmRlciAgMTAwMDAwMDAwLjUgICAxICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXg4NDMgcmVtYWluZGVyICAxMDAwMDAwMDAuOSAgIDEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDg0NCByZW1haW5kZXIgIDEwMDAwMDAwMC45OTkgMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitwcmVjaXNpb246IDYKK3JlbXg4NTAgcmVtYWluZGVyICAxMDAwMDAwMDMgICAgIDUgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDg1MSByZW1haW5kZXIgIDEwMDAwMDAzICAgICAgNSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14ODUyIHJlbWFpbmRlciAgMTAwMDAwMyAgICAgICA1ICAtPiAgMworcmVteDg1MyByZW1haW5kZXIgIDEwMDAwMyAgICAgICAgNSAgLT4gIDMKK3JlbXg4NTQgcmVtYWluZGVyICAxMDAwMyAgICAgICAgIDUgIC0+ICAzCityZW14ODU1IHJlbWFpbmRlciAgMTAwMyAgICAgICAgICA1ICAtPiAgMworcmVteDg1NiByZW1haW5kZXIgIDEwMyAgICAgICAgICAgNSAgLT4gIDMKK3JlbXg4NTcgcmVtYWluZGVyICAxMyAgICAgICAgICAgIDUgIC0+ICAzCityZW14ODU4IHJlbWFpbmRlciAgMSAgICAgICAgICAgICA1ICAtPiAgMQorCistLSBWbGFkaW1pcidzIGNhc2VzCityZW14ODYwIHJlbWFpbmRlciAxMjMuMGUxIDEwMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4NjEgcmVtYWluZGVyIDEyMzAgICAgMTAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg2MiByZW1haW5kZXIgMTIuM2UyICAxMDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14ODYzIHJlbWFpbmRlciAxLjIzZTMgIDEwMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4NjQgcmVtYWluZGVyIDEyM2UxICAgMTAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg3MCByZW1haW5kZXIgMTIzZTEgICAgMTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14ODcxIHJlbWFpbmRlciAxMjNlMSAgICAgMTAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4NzIgcmVtYWluZGVyIDEyM2UxICAgICAgMTAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg3MyByZW1haW5kZXIgMTIzZTEgICAgICAgMTAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14ODc0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgMTAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4NzUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgMTAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg3NiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgMTAwMDAwMDAwMCAtPiAxMjMwCityZW14ODc3IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgMTAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4NzggcmVtYWluZGVyIDEyMzAgICAgICAgICAgICAxMDAwMDAwMDAgLT4gMTIzMAorcmVteDg3OSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAxMDAwMDAwMCAtPiAxMjMwCityZW14ODgwIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAxMDAwMDAwIC0+IDEyMzAKK3JlbXg4ODEgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAxMDAwMDAgLT4gMTIzMAorcmVteDg4MiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAxMDAwMCAtPiAxMjMwCityZW14ODgzIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAxMDAwIC0+ICAyMzAKK3JlbXg4ODQgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAxMDAgLT4gICAzMAorcmVteDg4NSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAxMCAtPiAgICAwCityZW14ODg2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgICAxIC0+ICAgIDAKKworcmVteDg4OSByZW1haW5kZXIgMTIzZTEgICAyMDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14ODkwIHJlbWFpbmRlciAxMjNlMSAgICAyMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4OTEgcmVtYWluZGVyIDEyM2UxICAgICAyMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg5MiByZW1haW5kZXIgMTIzZTEgICAgICAyMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14ODkzIHJlbWFpbmRlciAxMjNlMSAgICAgICAyMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4OTQgcmVtYWluZGVyIDEyM2UxICAgICAgICAyMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg5NSByZW1haW5kZXIgMTIzZTEgICAgICAgICAyMDAwMDAwMDAwMCAtPiAxMjMwCityZW14ODk2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAyMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4OTcgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAyMDAwMDAwMDAgLT4gMTIzMAorcmVteDg5OSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAyMDAwMDAwMCAtPiAxMjMwCityZW14OTAwIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAyMDAwMDAwIC0+IDEyMzAKK3JlbXg5MDEgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAyMDAwMDAgLT4gMTIzMAorcmVteDkwMiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAyMDAwMCAtPiAxMjMwCityZW14OTAzIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAyMDAwIC0+IDEyMzAKK3JlbXg5MDQgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAyMDAgLT4gICAzMAorcmVteDkwNSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAyMCAtPiAgIDEwCityZW14OTA2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgICAyIC0+ICAgIDAKKworcmVteDkwOSByZW1haW5kZXIgMTIzZTEgICA1MDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTEwIHJlbWFpbmRlciAxMjNlMSAgICA1MDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5MTEgcmVtYWluZGVyIDEyM2UxICAgICA1MDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDkxMiByZW1haW5kZXIgMTIzZTEgICAgICA1MDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTEzIHJlbWFpbmRlciAxMjNlMSAgICAgICA1MDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5MTQgcmVtYWluZGVyIDEyM2UxICAgICAgICA1MDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDkxNSByZW1haW5kZXIgMTIzZTEgICAgICAgICA1MDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTE2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICA1MDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5MTcgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICA1MDAwMDAwMDAgLT4gMTIzMAorcmVteDkxOSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICA1MDAwMDAwMCAtPiAxMjMwCityZW14OTIwIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICA1MDAwMDAwIC0+IDEyMzAKK3JlbXg5MjEgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICA1MDAwMDAgLT4gMTIzMAorcmVteDkyMiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICA1MDAwMCAtPiAxMjMwCityZW14OTIzIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICA1MDAwIC0+IDEyMzAKK3JlbXg5MjQgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICA1MDAgLT4gIDIzMAorcmVteDkyNSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICA1MCAtPiAgIDMwCityZW14OTI2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgICA1IC0+ICAgIDAKKworcmVteDkyOSByZW1haW5kZXIgMTIzZTEgICA5MDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTMwIHJlbWFpbmRlciAxMjNlMSAgICA5MDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5MzEgcmVtYWluZGVyIDEyM2UxICAgICA5MDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDkzMiByZW1haW5kZXIgMTIzZTEgICAgICA5MDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTMzIHJlbWFpbmRlciAxMjNlMSAgICAgICA5MDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5MzQgcmVtYWluZGVyIDEyM2UxICAgICAgICA5MDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDkzNSByZW1haW5kZXIgMTIzZTEgICAgICAgICA5MDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTM2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICA5MDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5MzcgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICA5MDAwMDAwMDAgLT4gMTIzMAorcmVteDkzOSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICA5MDAwMDAwMCAtPiAxMjMwCityZW14OTQwIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICA5MDAwMDAwIC0+IDEyMzAKK3JlbXg5NDEgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICA5MDAwMDAgLT4gMTIzMAorcmVteDk0MiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICA5MDAwMCAtPiAxMjMwCityZW14OTQzIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICA5MDAwIC0+IDEyMzAKK3JlbXg5NDQgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICA5MDAgLT4gIDMzMAorcmVteDk0NSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICA5MCAtPiAgIDYwCityZW14OTQ2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgICA5IC0+ICAgIDYKKworcmVteDk1MCByZW1haW5kZXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTUxIHJlbWFpbmRlciAxMjNlMSAgIDEwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTUyIHJlbWFpbmRlciAxMjNlMSAgIDEwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDk1MyByZW1haW5kZXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTU0IHJlbWFpbmRlciAxMjNlMSAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTU1IHJlbWFpbmRlciAxMjNlMSAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDk1NiByZW1haW5kZXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTU3IHJlbWFpbmRlciAxMjNlMSAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTU4IHJlbWFpbmRlciAxMjNlMSAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDk1OSByZW1haW5kZXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCisKK3JlbXg5NjAgcmVtYWluZGVyIDEyM2UxICAgMTk5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorcmVteDk2MSByZW1haW5kZXIgMTIzZTEgICAxOTk5OTk5OTk5OTk5OTk5OTAgLT4gMTIzMAorcmVteDk2MiByZW1haW5kZXIgMTIzZTEgICAxOTk5OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK3JlbXg5NjMgcmVtYWluZGVyIDEyM2UxICAgMTk5OTk5OTk5OTk5OTk5OTk5OTAgLT4gMTIzMAorcmVteDk2NCByZW1haW5kZXIgMTIzZTEgICAxOTk5OTk5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorcmVteDk2NSByZW1haW5kZXIgMTIzZTEgICAxOTk5OTk5OTk5OTk5OTk5OTk5OTkwIC0+IDEyMzAKK3JlbXg5NjYgcmVtYWluZGVyIDEyM2UxICAgMTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorcmVteDk2NyByZW1haW5kZXIgMTIzZTEgICAxOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTAgLT4gMTIzMAorcmVteDk2OCByZW1haW5kZXIgMTIzZTEgICAxOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK3JlbXg5NjkgcmVtYWluZGVyIDEyM2UxICAgMTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTAgLT4gMTIzMAorCityZW14OTcwIHJlbWFpbmRlciAxZTEgICAxMDAwMDAwMDAwMDAwMDAwMCAtPiAxMAorcmVteDk3MSByZW1haW5kZXIgMWUxICAgMTAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwCityZW14OTcyIHJlbWFpbmRlciAxZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwCityZW14OTczIHJlbWFpbmRlciAxZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMAorcmVteDk3NCByZW1haW5kZXIgMWUxICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwCityZW14OTc1IHJlbWFpbmRlciAxZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwCityZW14OTc2IHJlbWFpbmRlciAxZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMAorcmVteDk3NyByZW1haW5kZXIgMWUxICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwCityZW14OTc4IHJlbWFpbmRlciAxZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwCityZW14OTc5IHJlbWFpbmRlciAxZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMAorCityZW14OTgwIHJlbWFpbmRlciAxMjNlMSAxMDAwRTk5OTk5OSAtPiAxLjIzRSszICAtLSAxMjNFKzEgaW50ZXJuYWxseQorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIFtmcm9tIGRpdmlkZV0KK3ByZWNpc2lvbjogOQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3JlbXg5OTAgcmVtYWluZGVyICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiAxLjIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcmVteDk5MSByZW1haW5kZXIgOUUrOTk5OTk5OTk5ICswLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14OTkyIHJlbWFpbmRlciArMC4xMDAgOUUrOTk5OTk5OTk5ICAgICAgICAgICAgICAgLT4gMC4xMDAKK3JlbXg5OTMgcmVtYWluZGVyIDlFLTk5OTk5OTk5OSArOS4xMDAgICAgICAgICAgICAgICAtPiA5RS05OTk5OTk5OTkKK3JlbXg5OTUgcmVtYWluZGVyIC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiAtMS4yMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JlbXg5OTYgcmVtYWluZGVyIDlFKzk5OTk5OTk5OSAtMC44MzQ1Njc4OTAxMjM0NUUtMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDk5NyByZW1haW5kZXIgLTAuMTAwIDlFKzk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+IC0wLjEwMAorcmVteDk5OCByZW1haW5kZXIgOUUtOTk5OTk5OTk5IC05LjEwMCAgICAgICAgICAgICAgIC0+IDlFLTk5OTk5OTk5OQorCistLSBOdWxsIHRlc3RzCityZW14MTAwMCByZW1haW5kZXIgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14MTAwMSByZW1haW5kZXIgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmVtYWluZGVyTmVhci5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yZW1haW5kZXJOZWFyLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2OGI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmVtYWluZGVyTmVhci5kZWNUZXN0CkBAIC0wLDAgKzEsNTcyIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHJlbWFpbmRlck5lYXIuZGVjVGVzdCAtLSBkZWNpbWFsIHJlbWFpbmRlci1uZWFyIChJRUVFIHJlbWFpbmRlcikgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworcm1ueDAwMSByZW1haW5kZXJuZWFyICAxICAgICAxICAgIC0+ICAwCitybW54MDAyIHJlbWFpbmRlcm5lYXIgIDIgICAgIDEgICAgLT4gIDAKK3JtbngwMDMgcmVtYWluZGVybmVhciAgMSAgICAgMiAgICAtPiAgMQorcm1ueDAwNCByZW1haW5kZXJuZWFyICAyICAgICAyICAgIC0+ICAwCitybW54MDA1IHJlbWFpbmRlcm5lYXIgIDAgICAgIDEgICAgLT4gIDAKK3JtbngwMDYgcmVtYWluZGVybmVhciAgMCAgICAgMiAgICAtPiAgMAorcm1ueDAwNyByZW1haW5kZXJuZWFyICAxICAgICAzICAgIC0+ICAxCitybW54MDA4IHJlbWFpbmRlcm5lYXIgIDIgICAgIDMgICAgLT4gLTEKK3JtbngwMDkgcmVtYWluZGVybmVhciAgMyAgICAgMyAgICAtPiAgMAorCitybW54MDEwIHJlbWFpbmRlcm5lYXIgIDIuNCAgIDEgICAgLT4gIDAuNAorcm1ueDAxMSByZW1haW5kZXJuZWFyICAyLjQgICAtMSAgIC0+ICAwLjQKK3JtbngwMTIgcmVtYWluZGVybmVhciAgLTIuNCAgMSAgICAtPiAgLTAuNAorcm1ueDAxMyByZW1haW5kZXJuZWFyICAtMi40ICAtMSAgIC0+ICAtMC40CitybW54MDE0IHJlbWFpbmRlcm5lYXIgIDIuNDAgIDEgICAgLT4gIDAuNDAKK3JtbngwMTUgcmVtYWluZGVybmVhciAgMi40MDAgMSAgICAtPiAgMC40MDAKK3JtbngwMTYgcmVtYWluZGVybmVhciAgMi40ICAgMiAgICAtPiAgMC40CitybW54MDE3IHJlbWFpbmRlcm5lYXIgIDIuNDAwIDIgICAgLT4gIDAuNDAwCitybW54MDE4IHJlbWFpbmRlcm5lYXIgIDIuICAgIDIgICAgLT4gIDAKK3JtbngwMTkgcmVtYWluZGVybmVhciAgMjAgICAgMjAgICAtPiAgMAorCitybW54MDIwIHJlbWFpbmRlcm5lYXIgIDE4NyAgIDE4NyAgICAtPiAgMAorcm1ueDAyMSByZW1haW5kZXJuZWFyICA1ICAgICAyICAgICAgLT4gIDEKK3JtbngwMjIgcmVtYWluZGVybmVhciAgNSAgICAgMi4wICAgIC0+ICAxLjAKK3JtbngwMjMgcmVtYWluZGVybmVhciAgNSAgICAgMi4wMDAgIC0+ICAxLjAwMAorcm1ueDAyNCByZW1haW5kZXJuZWFyICA1ICAgICAwLjIwMCAgLT4gIDAuMDAwCitybW54MDI1IHJlbWFpbmRlcm5lYXIgIDUgICAgIDAuMjAwICAtPiAgMC4wMDAKKworcm1ueDAzMCByZW1haW5kZXJuZWFyICAxICAgICAyICAgICAgLT4gIDEKK3JtbngwMzEgcmVtYWluZGVybmVhciAgMSAgICAgNCAgICAgIC0+ICAxCitybW54MDMyIHJlbWFpbmRlcm5lYXIgIDEgICAgIDggICAgICAtPiAgMQorcm1ueDAzMyByZW1haW5kZXJuZWFyICAxICAgICAxNiAgICAgLT4gIDEKK3JtbngwMzQgcmVtYWluZGVybmVhciAgMSAgICAgMzIgICAgIC0+ICAxCitybW54MDM1IHJlbWFpbmRlcm5lYXIgIDEgICAgIDY0ICAgICAtPiAgMQorcm1ueDA0MCByZW1haW5kZXJuZWFyICAxICAgIC0yICAgICAgLT4gIDEKK3JtbngwNDEgcmVtYWluZGVybmVhciAgMSAgICAtNCAgICAgIC0+ICAxCitybW54MDQyIHJlbWFpbmRlcm5lYXIgIDEgICAgLTggICAgICAtPiAgMQorcm1ueDA0MyByZW1haW5kZXJuZWFyICAxICAgIC0xNiAgICAgLT4gIDEKK3JtbngwNDQgcmVtYWluZGVybmVhciAgMSAgICAtMzIgICAgIC0+ICAxCitybW54MDQ1IHJlbWFpbmRlcm5lYXIgIDEgICAgLTY0ICAgICAtPiAgMQorcm1ueDA1MCByZW1haW5kZXJuZWFyIC0xICAgICAyICAgICAgLT4gIC0xCitybW54MDUxIHJlbWFpbmRlcm5lYXIgLTEgICAgIDQgICAgICAtPiAgLTEKK3JtbngwNTIgcmVtYWluZGVybmVhciAtMSAgICAgOCAgICAgIC0+ICAtMQorcm1ueDA1MyByZW1haW5kZXJuZWFyIC0xICAgICAxNiAgICAgLT4gIC0xCitybW54MDU0IHJlbWFpbmRlcm5lYXIgLTEgICAgIDMyICAgICAtPiAgLTEKK3JtbngwNTUgcmVtYWluZGVybmVhciAtMSAgICAgNjQgICAgIC0+ICAtMQorcm1ueDA2MCByZW1haW5kZXJuZWFyIC0xICAgIC0yICAgICAgLT4gIC0xCitybW54MDYxIHJlbWFpbmRlcm5lYXIgLTEgICAgLTQgICAgICAtPiAgLTEKK3JtbngwNjIgcmVtYWluZGVybmVhciAtMSAgICAtOCAgICAgIC0+ICAtMQorcm1ueDA2MyByZW1haW5kZXJuZWFyIC0xICAgIC0xNiAgICAgLT4gIC0xCitybW54MDY0IHJlbWFpbmRlcm5lYXIgLTEgICAgLTMyICAgICAtPiAgLTEKK3JtbngwNjUgcmVtYWluZGVybmVhciAtMSAgICAtNjQgICAgIC0+ICAtMQorCitybW54MDY2IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5NyAgICAgMSAgLT4gMAorcm1ueDA2NyByZW1haW5kZXJuZWFyICA5OTk5OTk5OTcuNCAgIDEgIC0+IDAuNAorcm1ueDA2OCByZW1haW5kZXJuZWFyICA5OTk5OTk5OTcuNSAgIDEgIC0+IC0wLjUKK3JtbngwNjkgcmVtYWluZGVybmVhciAgOTk5OTk5OTk3LjkgICAxICAtPiAtMC4xCitybW54MDcwIHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5Ny45OTkgMSAgLT4gLTAuMDAxCisKK3JtbngwNzEgcmVtYWluZGVybmVhciAgOTk5OTk5OTk4ICAgICAxICAtPiAwCitybW54MDcyIHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OC40ICAgMSAgLT4gMC40CitybW54MDczIHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OC41ICAgMSAgLT4gMC41CitybW54MDc0IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OC45ICAgMSAgLT4gLTAuMQorcm1ueDA3NSByZW1haW5kZXJuZWFyICA5OTk5OTk5OTguOTk5IDEgIC0+IC0wLjAwMQorCitybW54MDc2IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OSAgICAgMSAgLT4gMAorcm1ueDA3NyByZW1haW5kZXJuZWFyICA5OTk5OTk5OTkuNCAgIDEgIC0+IDAuNAorcm1ueDA3OCByZW1haW5kZXJuZWFyICA5OTk5OTk5OTkuNSAgIDEgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54MDc5IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OS45ICAgMSAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JtbngwODAgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5Ljk5OSAxICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCitwcmVjaXNpb246IDYKK3JtbngwODEgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5ICAgICAxICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDA4MiByZW1haW5kZXJuZWFyICA5OTk5OTk5OSAgICAgIDEgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54MDgzIHJlbWFpbmRlcm5lYXIgIDk5OTk5OTkgICAgICAgMSAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JtbngwODQgcmVtYWluZGVybmVhciAgOTk5OTk5ICAgICAgICAxICAtPiAwCitybW54MDg1IHJlbWFpbmRlcm5lYXIgIDk5OTk5ICAgICAgICAgMSAgLT4gMAorcm1ueDA4NiByZW1haW5kZXJuZWFyICA5OTk5ICAgICAgICAgIDEgIC0+IDAKK3JtbngwODcgcmVtYWluZGVybmVhciAgOTk5ICAgICAgICAgICAxICAtPiAwCitybW54MDg4IHJlbWFpbmRlcm5lYXIgIDk5ICAgICAgICAgICAgMSAgLT4gMAorcm1ueDA4OSByZW1haW5kZXJuZWFyICA5ICAgICAgICAgICAgIDEgIC0+IDAKKworcHJlY2lzaW9uOiA5CitybW54MDkwIHJlbWFpbmRlcm5lYXIgIDAuICAgICAgICAgICAgMSAgLT4gMAorcm1ueDA5MSByZW1haW5kZXJuZWFyICAuMCAgICAgICAgICAgIDEgIC0+IDAuMAorcm1ueDA5MiByZW1haW5kZXJuZWFyICAwLjAwICAgICAgICAgIDEgIC0+IDAuMDAKK3JtbngwOTMgcmVtYWluZGVybmVhciAgMC4wMEUrOSAgICAgICAxICAtPiAwCitybW54MDk0IHJlbWFpbmRlcm5lYXIgIDAuMDAwMEUtNTAgICAgMSAgLT4gMEUtNTQKKworCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIHJlbWFpbmRlcm5lYXIgYnkgMAorcHJlY2lzaW9uOiA5CittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcm1ueDEwMSByZW1haW5kZXJuZWFyICAwICAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitybW54MTAyIHJlbWFpbmRlcm5lYXIgIDAgICAgICAtMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK3JtbngxMDMgcmVtYWluZGVybmVhciAtMCAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorcm1ueDEwNCByZW1haW5kZXJuZWFyIC0wICAgICAgLTAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitybW54MTA1IHJlbWFpbmRlcm5lYXIgIDAuMEU1ICAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK3JtbngxMDYgcmVtYWluZGVybmVhciAgMC4wMDAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorLS0gW1NvbWUgdGhpbmsgdGhpcyBuZXh0IGdyb3VwIHNob3VsZCBiZSBEaXZpc2lvbl9ieV96ZXJvIGV4Y2VwdGlvbiwKKy0tIGJ1dCBJRUVFIDg1NCBpcyBleHBsaWNpdCB0aGF0IGl0IGlzIEludmFsaWQgb3BlcmF0aW9uIC4uIGZvcgorLS0gcmVtYWluZGVybmVhci1uZWFyLCBhbnl3YXldCitybW54MTA3IHJlbWFpbmRlcm5lYXIgIDAuMDAwMSAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDEwOCByZW1haW5kZXJuZWFyICAwLjAxICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngxMDkgcmVtYWluZGVybmVhciAgMC4xICAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54MTEwIHJlbWFpbmRlcm5lYXIgIDEgICAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDExMSByZW1haW5kZXJuZWFyICAxICAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngxMTIgcmVtYWluZGVybmVhciAxMCAgICAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54MTEzIHJlbWFpbmRlcm5lYXIgMUUrMTAwICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDExNCByZW1haW5kZXJuZWFyIDFFKzEwMDAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngxMTUgcmVtYWluZGVybmVhciAgMC4wMDAxIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54MTE2IHJlbWFpbmRlcm5lYXIgIDAuMDEgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDExOSByZW1haW5kZXJuZWFyICAwLjEgICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngxMjAgcmVtYWluZGVybmVhciAgMSAgICAgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54MTIxIHJlbWFpbmRlcm5lYXIgIDEgICAgICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDEyMiByZW1haW5kZXJuZWFyIDEwICAgICAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngxMjMgcmVtYWluZGVybmVhciAxRSsxMDAgIC0wLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54MTI0IHJlbWFpbmRlcm5lYXIgMUUrMTAwMCAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYW5kIHplcm9zIG9uIGxlZnQKK3JtbngxMzAgcmVtYWluZGVybmVhciAgMCAgICAgIDEgICAtPiAgMAorcm1ueDEzMSByZW1haW5kZXJuZWFyICAwICAgICAtMSAgIC0+ICAwCitybW54MTMyIHJlbWFpbmRlcm5lYXIgIDAuMCAgICAxICAgLT4gIDAuMAorcm1ueDEzMyByZW1haW5kZXJuZWFyICAwLjAgICAtMSAgIC0+ICAwLjAKK3JtbngxMzQgcmVtYWluZGVybmVhciAtMCAgICAgIDEgICAtPiAtMAorcm1ueDEzNSByZW1haW5kZXJuZWFyIC0wICAgICAtMSAgIC0+IC0wCitybW54MTM2IHJlbWFpbmRlcm5lYXIgLTAuMCAgICAxICAgLT4gLTAuMAorcm1ueDEzNyByZW1haW5kZXJuZWFyIC0wLjAgICAtMSAgIC0+IC0wLjAKKworLS0gMC41ZXJzCitybW14MTQzIHJlbWFpbmRlcm5lYXIgICAwLjUgIDIgICAgIC0+ICAwLjUKK3JtbXgxNDQgcmVtYWluZGVybmVhciAgIDAuNSAgMi4xICAgLT4gIDAuNQorcm1teDE0NSByZW1haW5kZXJuZWFyICAgMC41ICAyLjAxICAtPiAgMC41MAorcm1teDE0NiByZW1haW5kZXJuZWFyICAgMC41ICAyLjAwMSAtPiAgMC41MDAKK3JtbXgxNDcgcmVtYWluZGVybmVhciAgIDAuNTAgMiAgICAgLT4gIDAuNTAKK3JtbXgxNDggcmVtYWluZGVybmVhciAgIDAuNTAgMi4wMSAgLT4gIDAuNTAKK3JtbXgxNDkgcmVtYWluZGVybmVhciAgIDAuNTAgMi4wMDEgLT4gIDAuNTAwCisKKy0tIHNvbWUgZGlmZmVyZW5jZXMgZnJvbSByZW1haW5kZXIKK3JtbngxNTAgcmVtYWluZGVybmVhciAgIDAuNCAgMS4wMjAgLT4gIDAuNDAwCitybW54MTUxIHJlbWFpbmRlcm5lYXIgICAwLjUwIDEuMDIwIC0+ICAwLjUwMAorcm1ueDE1MiByZW1haW5kZXJuZWFyICAgMC41MSAxLjAyMCAtPiAgMC41MTAKK3JtbngxNTMgcmVtYWluZGVybmVhciAgIDAuNTIgMS4wMjAgLT4gLTAuNTAwCitybW54MTU0IHJlbWFpbmRlcm5lYXIgICAwLjYgIDEuMDIwIC0+IC0wLjQyMAorcm1ueDE1NSByZW1haW5kZXJuZWFyICAgMC40OSAxICAgICAtPiAgMC40OQorcm1ueDE1NiByZW1haW5kZXJuZWFyICAgMC41MCAxICAgICAtPiAgMC41MAorcm1ueDE1NyByZW1haW5kZXJuZWFyICAgMS41MCAxICAgICAtPiAtMC41MAorcm1ueDE1OCByZW1haW5kZXJuZWFyICAgMi41MCAxICAgICAtPiAgMC41MAorcm1ueDE1OSByZW1haW5kZXJuZWFyICAgOS41MCAxICAgICAtPiAtMC41MAorcm1ueDE2MCByZW1haW5kZXJuZWFyICAgMC41MSAxICAgICAtPiAtMC40OQorCistLSB0aGUgbmFzdHkgZGl2aXNpb24tYnktMSBjYXNlcworcm1ueDE2MSByZW1haW5kZXJuZWFyICAgMC40ICAgICAgICAgMSAgIC0+ICAwLjQKK3JtbngxNjIgcmVtYWluZGVybmVhciAgIDAuNDUgICAgICAgIDEgICAtPiAgMC40NQorcm1ueDE2MyByZW1haW5kZXJuZWFyICAgMC40NTUgICAgICAgMSAgIC0+ICAwLjQ1NQorcm1ueDE2NCByZW1haW5kZXJuZWFyICAgMC40NTU1ICAgICAgMSAgIC0+ICAwLjQ1NTUKK3JtbngxNjUgcmVtYWluZGVybmVhciAgIDAuNDU1NTUgICAgIDEgICAtPiAgMC40NTU1NQorcm1ueDE2NiByZW1haW5kZXJuZWFyICAgMC40NTU1NTUgICAgMSAgIC0+ICAwLjQ1NTU1NQorcm1ueDE2NyByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1ICAgMSAgIC0+ICAwLjQ1NTU1NTUKK3JtbngxNjggcmVtYWluZGVybmVhciAgIDAuNDU1NTU1NTUgIDEgICAtPiAgMC40NTU1NTU1NQorcm1ueDE2OSByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NTUgMSAgIC0+ICAwLjQ1NTU1NTU1NQorLS0gd2l0aCBzcGlsbC4uLgorcm1ueDE3MSByZW1haW5kZXJuZWFyICAgMC41ICAgICAgICAgMSAgIC0+ICAwLjUKK3JtbngxNzIgcmVtYWluZGVybmVhciAgIDAuNTUgICAgICAgIDEgICAtPiAtMC40NQorcm1ueDE3MyByZW1haW5kZXJuZWFyICAgMC41NTUgICAgICAgMSAgIC0+IC0wLjQ0NQorcm1ueDE3NCByZW1haW5kZXJuZWFyICAgMC41NTU1ICAgICAgMSAgIC0+IC0wLjQ0NDUKK3JtbngxNzUgcmVtYWluZGVybmVhciAgIDAuNTU1NTUgICAgIDEgICAtPiAtMC40NDQ0NQorcm1ueDE3NiByZW1haW5kZXJuZWFyICAgMC41NTU1NTUgICAgMSAgIC0+IC0wLjQ0NDQ0NQorcm1ueDE3NyByZW1haW5kZXJuZWFyICAgMC41NTU1NTU1ICAgMSAgIC0+IC0wLjQ0NDQ0NDUKK3JtbngxNzggcmVtYWluZGVybmVhciAgIDAuNTU1NTU1NTUgIDEgICAtPiAtMC40NDQ0NDQ0NQorcm1ueDE3OSByZW1haW5kZXJuZWFyICAgMC41NTU1NTU1NTUgMSAgIC0+IC0wLjQ0NDQ0NDQ0NQorCistLSBwcm9ncmVzc2lvbgorcm1ueDE4MCByZW1haW5kZXJuZWFyICAxICAxICAgLT4gMAorcm1ueDE4MSByZW1haW5kZXJuZWFyICAxICAyICAgLT4gMQorcm1ueDE4MiByZW1haW5kZXJuZWFyICAxICAzICAgLT4gMQorcm1ueDE4MyByZW1haW5kZXJuZWFyICAxICA0ICAgLT4gMQorcm1ueDE4NCByZW1haW5kZXJuZWFyICAxICA1ICAgLT4gMQorcm1ueDE4NSByZW1haW5kZXJuZWFyICAxICA2ICAgLT4gMQorcm1ueDE4NiByZW1haW5kZXJuZWFyICAxICA3ICAgLT4gMQorcm1ueDE4NyByZW1haW5kZXJuZWFyICAxICA4ICAgLT4gMQorcm1ueDE4OCByZW1haW5kZXJuZWFyICAxICA5ICAgLT4gMQorcm1ueDE4OSByZW1haW5kZXJuZWFyICAxICAxMCAgLT4gMQorcm1ueDE5MCByZW1haW5kZXJuZWFyICAxICAxICAgLT4gMAorcm1ueDE5MSByZW1haW5kZXJuZWFyICAyICAxICAgLT4gMAorcm1ueDE5MiByZW1haW5kZXJuZWFyICAzICAxICAgLT4gMAorcm1ueDE5MyByZW1haW5kZXJuZWFyICA0ICAxICAgLT4gMAorcm1ueDE5NCByZW1haW5kZXJuZWFyICA1ICAxICAgLT4gMAorcm1ueDE5NSByZW1haW5kZXJuZWFyICA2ICAxICAgLT4gMAorcm1ueDE5NiByZW1haW5kZXJuZWFyICA3ICAxICAgLT4gMAorcm1ueDE5NyByZW1haW5kZXJuZWFyICA4ICAxICAgLT4gMAorcm1ueDE5OCByZW1haW5kZXJuZWFyICA5ICAxICAgLT4gMAorcm1ueDE5OSByZW1haW5kZXJuZWFyICAxMCAxICAgLT4gMAorCisKKy0tIFZhcmlvdXMgZmxhdm91cnMgb2YgcmVtYWluZGVybmVhciBieSAwCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcm1ueDIwMSByZW1haW5kZXJuZWFyICAwICAgICAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK3JtbngyMDIgcmVtYWluZGVybmVhciAgMC4wRTUgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitybW54MjAzIHJlbWFpbmRlcm5lYXIgIDAuMDAwICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorcm1ueDIwNCByZW1haW5kZXJuZWFyICAwLjAwMDEgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDIwNSByZW1haW5kZXJuZWFyICAwLjAxICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDIwNiByZW1haW5kZXJuZWFyICAwLjEgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDIwNyByZW1haW5kZXJuZWFyICAxICAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDIwOCByZW1haW5kZXJuZWFyICAxICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDIwOSByZW1haW5kZXJuZWFyIDEwICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDIxMCByZW1haW5kZXJuZWFyIDFFKzEwMCAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDIxMSByZW1haW5kZXJuZWFyIDFFKzEwMDAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSB0ZXN0cyBmcm9tIHRoZSBleHRlbmRlZCBzcGVjaWZpY2F0aW9uCitybW54MjIxIHJlbWFpbmRlcm5lYXIgMi4xICAgICAzICAgLT4gLTAuOQorcm1ueDIyMiByZW1haW5kZXJuZWFyICAxMCAgICAgNiAgIC0+IC0yCitybW54MjIzIHJlbWFpbmRlcm5lYXIgIDEwICAgICAzICAgLT4gIDEKK3JtbngyMjQgcmVtYWluZGVybmVhciAtMTAgICAgIDMgICAtPiAtMQorcm1ueDIyNSByZW1haW5kZXJuZWFyICAxMC4yICAgMSAgIC0+IDAuMgorcm1ueDIyNiByZW1haW5kZXJuZWFyICAxMCAgICAgMC4zIC0+IDAuMQorcm1ueDIyNyByZW1haW5kZXJuZWFyICAgMy42ICAgMS4zIC0+IC0wLjMKKworLS0gc29tZSBkaWZmZXJlbmNlcyBmcm9tIHJlbWFpbmRlcgorcm1ueDIzMSByZW1haW5kZXJuZWFyICAgMC40ICAxLjAyMCAtPiAgMC40MDAKK3JtbngyMzIgcmVtYWluZGVybmVhciAgIDAuNTAgMS4wMjAgLT4gIDAuNTAwCitybW54MjMzIHJlbWFpbmRlcm5lYXIgICAwLjUxIDEuMDIwIC0+ICAwLjUxMAorcm1ueDIzNCByZW1haW5kZXJuZWFyICAgMC41MiAxLjAyMCAtPiAtMC41MDAKK3JtbngyMzUgcmVtYWluZGVybmVhciAgIDAuNiAgMS4wMjAgLT4gLTAuNDIwCisKKy0tIHRlc3Qgc29tZSBjYXNlcyB0aGF0IGFyZSBjbG9zZSB0byBleHBvbmVudCBvdmVyZmxvdworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3JtbngyNzAgcmVtYWluZGVybmVhciAxIDFlOTk5OTk5OTk5ICAgIC0+IDEKK3JtbngyNzEgcmVtYWluZGVybmVhciAxIDAuOWU5OTk5OTk5OTkgIC0+IDEKK3JtbngyNzIgcmVtYWluZGVybmVhciAxIDAuOTllOTk5OTk5OTk5IC0+IDEKK3JtbngyNzMgcmVtYWluZGVybmVhciAxIDAuOTk5OTk5OTk5ZTk5OTk5OTk5OSAtPiAxCitybW54Mjc0IHJlbWFpbmRlcm5lYXIgOWU5OTk5OTk5OTkgICAgICAgICAgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDI3NSByZW1haW5kZXJuZWFyIDkuOWU5OTk5OTk5OTkgICAgICAgIDEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JtbngyNzYgcmVtYWluZGVybmVhciA5Ljk5ZTk5OTk5OTk5OSAgICAgICAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54Mjc3IHJlbWFpbmRlcm5lYXIgOS45OTk5OTk5OWU5OTk5OTk5OTkgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCitybW54MjgwIHJlbWFpbmRlcm5lYXIgMC4xIDllLTk5OTk5OTk5OSAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDI4MSByZW1haW5kZXJuZWFyIDAuMSA5OWUtOTk5OTk5OTk5ICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JtbngyODIgcmVtYWluZGVybmVhciAwLjEgOTk5ZS05OTk5OTk5OTkgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKK3JtbngyODMgcmVtYWluZGVybmVhciAwLjEgOWUtOTk5OTk5OTk4ICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54Mjg0IHJlbWFpbmRlcm5lYXIgMC4xIDk5ZS05OTk5OTk5OTggICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDI4NSByZW1haW5kZXJuZWFyIDAuMSA5OTllLTk5OTk5OTk5OCAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JtbngyODYgcmVtYWluZGVybmVhciAwLjEgOTk5ZS05OTk5OTk5OTcgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54Mjg3IHJlbWFpbmRlcm5lYXIgMC4xIDk5OTllLTk5OTk5OTk5NyAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDI4OCByZW1haW5kZXJuZWFyIDAuMSA5OTk5OWUtOTk5OTk5OTk3ICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworLS0gcm1ueDN4eCBhcmUgZnJvbSBEaWFnQmlnRGVjaW1hbAorcm1ueDMwMSByZW1haW5kZXJuZWFyICAgMSAgICAzICAgICAtPiAgMQorcm1ueDMwMiByZW1haW5kZXJuZWFyICAgNSAgICA1ICAgICAtPiAgMAorcm1ueDMwMyByZW1haW5kZXJuZWFyICAgMTMgICAxMCAgICAtPiAgMworcm1ueDMwNCByZW1haW5kZXJuZWFyICAgMTMgICA1MCAgICAtPiAgMTMKK3JtbngzMDUgcmVtYWluZGVybmVhciAgIDEzICAgMTAwICAgLT4gIDEzCitybW54MzA2IHJlbWFpbmRlcm5lYXIgICAxMyAgIDEwMDAgIC0+ICAxMworcm1ueDMwNyByZW1haW5kZXJuZWFyICAgLjEzICAgIDEgICAtPiAgMC4xMworcm1ueDMwOCByZW1haW5kZXJuZWFyICAgMC4xMzMgIDEgICAtPiAgMC4xMzMKK3JtbngzMDkgcmVtYWluZGVybmVhciAgIDAuMTAzMyAxICAgLT4gIDAuMTAzMworcm1ueDMxMCByZW1haW5kZXJuZWFyICAgMS4wMzMgIDEgICAtPiAgMC4wMzMKK3JtbngzMTEgcmVtYWluZGVybmVhciAgIDEwLjMzICAxICAgLT4gIDAuMzMKK3JtbngzMTIgcmVtYWluZGVybmVhciAgIDEwLjMzIDEwICAgLT4gIDAuMzMKK3JtbngzMTMgcmVtYWluZGVybmVhciAgIDEwMy4zICAxICAgLT4gIDAuMworcm1ueDMxNCByZW1haW5kZXJuZWFyICAgMTMzICAgMTAgICAtPiAgMworcm1ueDMxNSByZW1haW5kZXJuZWFyICAgMTAzMyAgMTAgICAtPiAgMworcm1ueDMxNiByZW1haW5kZXJuZWFyICAgMTAzMyAgNTAgICAtPiAtMTcKK3JtbngzMTcgcmVtYWluZGVybmVhciAgIDEwMS4wICAzICAgLT4gLTEuMAorcm1ueDMxOCByZW1haW5kZXJuZWFyICAgMTAyLjAgIDMgICAtPiAgMC4wCitybW54MzE5IHJlbWFpbmRlcm5lYXIgICAxMDMuMCAgMyAgIC0+ICAxLjAKK3JtbngzMjAgcmVtYWluZGVybmVhciAgIDIuNDAgICAxICAgLT4gIDAuNDAKK3JtbngzMjEgcmVtYWluZGVybmVhciAgIDIuNDAwICAxICAgLT4gIDAuNDAwCitybW54MzIyIHJlbWFpbmRlcm5lYXIgICAyLjQgICAgMSAgIC0+ICAwLjQKK3JtbngzMjMgcmVtYWluZGVybmVhciAgIDIuNCAgICAyICAgLT4gIDAuNAorcm1ueDMyNCByZW1haW5kZXJuZWFyICAgMi40MDAgIDIgICAtPiAgMC40MDAKK3JtbngzMjUgcmVtYWluZGVybmVhciAgIDEgICAwLjMgICAgLT4gIDAuMQorcm1ueDMyNiByZW1haW5kZXJuZWFyICAgMSAgIDAuMzAgICAtPiAgMC4xMAorcm1ueDMyNyByZW1haW5kZXJuZWFyICAgMSAgIDAuMzAwICAtPiAgMC4xMDAKK3JtbngzMjggcmVtYWluZGVybmVhciAgIDEgICAwLjMwMDAgLT4gIDAuMTAwMAorcm1ueDMyOSByZW1haW5kZXJuZWFyICAgMS4wICAgIDAuMyAtPiAgMC4xCitybW54MzMwIHJlbWFpbmRlcm5lYXIgICAxLjAwICAgMC4zIC0+ICAwLjEwCitybW54MzMxIHJlbWFpbmRlcm5lYXIgICAxLjAwMCAgMC4zIC0+ICAwLjEwMAorcm1ueDMzMiByZW1haW5kZXJuZWFyICAgMS4wMDAwIDAuMyAtPiAgMC4xMDAwCitybW54MzMzIHJlbWFpbmRlcm5lYXIgICAwLjUgIDIgICAgIC0+ICAwLjUKK3JtbngzMzQgcmVtYWluZGVybmVhciAgIDAuNSAgMi4xICAgLT4gIDAuNQorcm1ueDMzNSByZW1haW5kZXJuZWFyICAgMC41ICAyLjAxICAtPiAgMC41MAorcm1ueDMzNiByZW1haW5kZXJuZWFyICAgMC41ICAyLjAwMSAtPiAgMC41MDAKK3JtbngzMzcgcmVtYWluZGVybmVhciAgIDAuNTAgMiAgICAgLT4gIDAuNTAKK3JtbngzMzggcmVtYWluZGVybmVhciAgIDAuNTAgMi4wMSAgLT4gIDAuNTAKK3JtbngzMzkgcmVtYWluZGVybmVhciAgIDAuNTAgMi4wMDEgLT4gIDAuNTAwCisKK3JtbngzNDAgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNTAwMDAwMSAgICAtPiAgLTFFLTcKK3JtbngzNDEgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNTAwMDAwMDEgICAgLT4gIC0xRS04CitybW54MzQyIHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjUwMDAwMDAwMSAgICAtPiAgLTFFLTkKK3JtbngzNDMgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNTAwMDAwMDAwMSAgICAtPiAgLTFFLTEwCitybW54MzQ0IHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjUwMDAwMDAwMDAxICAgIC0+ICAtMUUtMTEKK3JtbngzNDUgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNDk5OTk5OSAgICAtPiAgMUUtNworcm1ueDM0NiByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5OSAgICAtPiAgMUUtOAorcm1ueDM0NyByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5OTkgICAgLT4gIDFFLTkKK3JtbngzNDggcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNDk5OTk5OTk5OSAgICAtPiAgMUUtMTAKK3JtbngzNDkgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNDk5OTk5OTk5OTkgICAgLT4gIDFFLTExCisKK3JtbngzNTAgcmVtYWluZGVybmVhciAgIDAuMDMgIDcgIC0+ICAwLjAzCitybW54MzUxIHJlbWFpbmRlcm5lYXIgICA1ICAgMiAgICAtPiAgMQorcm1ueDM1MiByZW1haW5kZXJuZWFyICAgNC4xICAgMiAgICAtPiAgMC4xCitybW54MzUzIHJlbWFpbmRlcm5lYXIgICA0LjAxICAgMiAgICAtPiAgMC4wMQorcm1ueDM1NCByZW1haW5kZXJuZWFyICAgNC4wMDEgICAyICAgIC0+ICAwLjAwMQorcm1ueDM1NSByZW1haW5kZXJuZWFyICAgNC4wMDAxICAgMiAgICAtPiAgMC4wMDAxCitybW54MzU2IHJlbWFpbmRlcm5lYXIgICA0LjAwMDAxICAgMiAgICAtPiAgMC4wMDAwMQorcm1ueDM1NyByZW1haW5kZXJuZWFyICAgNC4wMDAwMDEgICAyICAgIC0+ICAwLjAwMDAwMQorcm1ueDM1OCByZW1haW5kZXJuZWFyICAgNC4wMDAwMDAxICAgMiAgICAtPiAgMUUtNworCitybW54MzYwIHJlbWFpbmRlcm5lYXIgICAxLjIgICAwLjczNDUgLT4gLTAuMjY5MAorcm1ueDM2MSByZW1haW5kZXJuZWFyICAgMC44ICAgMTIgICAgIC0+ICAwLjgKK3JtbngzNjIgcmVtYWluZGVybmVhciAgIDAuOCAgIDAuMiAgICAtPiAgMC4wCitybW54MzYzIHJlbWFpbmRlcm5lYXIgICAwLjggICAwLjMgICAgLT4gLTAuMQorcm1ueDM2NCByZW1haW5kZXJuZWFyICAgMC44MDAgICAxMiAgIC0+ICAwLjgwMAorcm1ueDM2NSByZW1haW5kZXJuZWFyICAgMC44MDAgICAxLjcgIC0+ICAwLjgwMAorcm1ueDM2NiByZW1haW5kZXJuZWFyICAgMi40MDAgICAyICAgIC0+ICAwLjQwMAorCitwcmVjaXNpb246IDYKK3JtbngzNzEgcmVtYWluZGVybmVhciAgIDIuNDAwICAyICAgICAgICAtPiAgMC40MDAKK3ByZWNpc2lvbjogMworcm1ueDM3MiByZW1haW5kZXJuZWFyICAgMTIzNDU2Nzg5MDAwMDAgMTJlKzEyIC0+IDMuNDZFKzExIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDUKK3JtbngzODEgcmVtYWluZGVybmVhciAxMjM0NSAgMSAgICAgICAgIC0+ICAwCitybW54MzgyIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEuMDAwMSAgICAtPiAtMC4yMzQ0CitybW54MzgzIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEuMDAxICAgICAtPiAtMC4zMzMKK3JtbngzODQgcmVtYWluZGVybmVhciAxMjM0NSAgMS4wMSAgICAgIC0+IC0wLjIzCitybW54Mzg1IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEuMSAgICAgICAtPiAtMC4zCitybW54Mzg2IHJlbWFpbmRlcm5lYXIgMTIzNTUgIDQgICAgICAgICAtPiAtMQorcm1ueDM4NyByZW1haW5kZXJuZWFyIDEyMzQ1ICA0ICAgICAgICAgLT4gIDEKK3JtbngzODggcmVtYWluZGVybmVhciAxMjM1NSAgNC4wMDAxICAgIC0+IC0xLjMwODkKK3JtbngzODkgcmVtYWluZGVybmVhciAxMjM0NSAgNC4wMDAxICAgIC0+ICAwLjY5MTQKK3JtbngzOTAgcmVtYWluZGVybmVhciAxMjM0NSAgNC45ICAgICAgIC0+ICAxLjkKK3JtbngzOTEgcmVtYWluZGVybmVhciAxMjM0NSAgNC45OSAgICAgIC0+IC0wLjI2CitybW54MzkyIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuOTk5ICAgICAtPiAgMi40NjkKK3JtbngzOTMgcmVtYWluZGVybmVhciAxMjM0NSAgNC45OTk5ICAgIC0+ICAwLjI0NjkKK3JtbngzOTQgcmVtYWluZGVybmVhciAxMjM0NSAgNSAgICAgICAgIC0+ICAwCitybW54Mzk1IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDUuMDAwMSAgICAtPiAtMC4yNDY5CitybW54Mzk2IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDUuMDAxICAgICAtPiAtMi40NjkKK3JtbngzOTcgcmVtYWluZGVybmVhciAxMjM0NSAgNS4wMSAgICAgIC0+ICAwLjM2CitybW54Mzk4IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDUuMSAgICAgICAtPiAtMi4xCisKK3ByZWNpc2lvbjogOQorLS0gc29tZSBuYXN0eSBkaXZpc2lvbi1ieS0xIGNhc2VzIFtzb21lIHNpbWlsYXIgYWJvdmVdCitybW54NDAxIHJlbWFpbmRlcm5lYXIgICAwLjQgICAgICAgICAxICAgLT4gIDAuNAorcm1ueDQwMiByZW1haW5kZXJuZWFyICAgMC40NSAgICAgICAgMSAgIC0+ICAwLjQ1CitybW54NDAzIHJlbWFpbmRlcm5lYXIgICAwLjQ1NSAgICAgICAxICAgLT4gIDAuNDU1CitybW54NDA0IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTUgICAgICAxICAgLT4gIDAuNDU1NQorcm1ueDQwNSByZW1haW5kZXJuZWFyICAgMC40NTU1NSAgICAgMSAgIC0+ICAwLjQ1NTU1CitybW54NDA2IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NSAgICAxICAgLT4gIDAuNDU1NTU1CitybW54NDA3IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTUgICAxICAgLT4gIDAuNDU1NTU1NQorcm1ueDQwOCByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NSAgMSAgIC0+ICAwLjQ1NTU1NTU1CitybW54NDA5IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTU1NSAxICAgLT4gIDAuNDU1NTU1NTU1CisKKy0tIHNvbWUgdHJpY2t5IExIU3MKK3Jtbng0MjAgcmVtYWluZGVybmVhciAgIDk5OTk5OTk5Ljk5OTk5OTk5OSAgIDFFKzggICAtPiAtMUUtOQorcm1ueDQyMSByZW1haW5kZXJuZWFyICA5OTk5OTk5OTkuOTk5OTk5OTk5ICAgMUUrOSAgIC0+IC0xRS05CitwcmVjaXNpb246IDkKK3Jtbng0MzAgcmVtYWluZGVybmVhciAgIDAuNDU1NTU1NTU1IDEgICAtPiAgMC40NTU1NTU1NTUKK3ByZWNpc2lvbjogOAorcm1ueDQzMSByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NTUgMSAgIC0+ICAwLjQ1NTU1NTU2IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA3CitybW54NDMyIHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTU1NSAxICAgLT4gIDAuNDU1NTU1NiAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDYKK3Jtbng0MzMgcmVtYWluZGVybmVhciAgIDAuNDU1NTU1NTU1IDEgICAtPiAgMC40NTU1NTYgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNQorcm1ueDQzNCByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NTUgMSAgIC0+ICAwLjQ1NTU2ICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0CitybW54NDM1IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTU1NSAxICAgLT4gIDAuNDU1NiAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMKK3Jtbng0MzYgcmVtYWluZGVybmVhciAgIDAuNDU1NTU1NTU1IDEgICAtPiAgMC40NTYgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMgorcm1ueDQzNyByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NTUgMSAgIC0+ICAwLjQ2ICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxCitybW54NDM4IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTU1NSAxICAgLT4gIDAuNSAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGVhcmx5IHRlc3RzOyBmcm9tIHRleHQgZGVzY3JpcHRpb25zCitwcmVjaXNpb246IDkKK3Jtbng2MDEgcmVtYWluZGVybmVhciAgMTAgICA2ICAtPiAtMgorcm1ueDYwMiByZW1haW5kZXJuZWFyIC0xMCAgIDYgIC0+IDIKK3Jtbng2MDMgcmVtYWluZGVybmVhciAgMTEgICAzICAtPiAtMQorcm1ueDYwNCByZW1haW5kZXJuZWFyICAxMSAgIDUgIC0+IDEKK3Jtbng2MDUgcmVtYWluZGVybmVhciAgIDcuNyA4ICAtPiAtMC4zCitybW54NjA2IHJlbWFpbmRlcm5lYXIgIDMxLjUgMyAgLT4gMS41ICAgIC0tIGk9MTAKK3Jtbng2MDcgcmVtYWluZGVybmVhciAgMzQuNSAzICAtPiAtMS41ICAgLS0gaT0xMQorCistLSB6ZXJvIHNpZ25zCitybW54NjUwIHJlbWFpbmRlcm5lYXIgIDEgIDEgLT4gIDAKK3Jtbng2NTEgcmVtYWluZGVybmVhciAtMSAgMSAtPiAtMAorcm1ueDY1MiByZW1haW5kZXJuZWFyICAxIC0xIC0+ICAwCitybW54NjUzIHJlbWFpbmRlcm5lYXIgLTEgLTEgLT4gLTAKK3Jtbng2NTQgcmVtYWluZGVybmVhciAgMCAgMSAtPiAgMAorcm1ueDY1NSByZW1haW5kZXJuZWFyIC0wICAxIC0+IC0wCitybW54NjU2IHJlbWFpbmRlcm5lYXIgIDAgLTEgLT4gIDAKK3Jtbng2NTcgcmVtYWluZGVybmVhciAtMCAtMSAtPiAtMAorcm1ueDY1OCByZW1haW5kZXJuZWFyICAwLjAwICAxICAtPiAgMC4wMAorcm1ueDY1OSByZW1haW5kZXJuZWFyIC0wLjAwICAxICAtPiAtMC4wMAorCistLSBTcGVjaWFscworcm1ueDY4MCByZW1haW5kZXJuZWFyICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54NjgxIHJlbWFpbmRlcm5lYXIgIEluZiAgLTEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jtbng2ODIgcmVtYWluZGVybmVhciAgSW5mICAtMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDY4MyByZW1haW5kZXJuZWFyICBJbmYgICAwICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54Njg0IHJlbWFpbmRlcm5lYXIgIEluZiAgLTAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jtbng2ODUgcmVtYWluZGVybmVhciAgSW5mICAgMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDY4NiByZW1haW5kZXJuZWFyICBJbmYgICAxMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54Njg3IHJlbWFpbmRlcm5lYXIgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jtbng2ODggcmVtYWluZGVybmVhciAtMTAwMCAgSW5mICAgLT4gLTEwMDAKK3Jtbng2ODkgcmVtYWluZGVybmVhciAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDY5MSByZW1haW5kZXJuZWFyIC0xICAgICBJbmYgICAtPiAtMQorcm1ueDY5MiByZW1haW5kZXJuZWFyICAwICAgICBJbmYgICAtPiAgMAorcm1ueDY5MyByZW1haW5kZXJuZWFyIC0wICAgICBJbmYgICAtPiAtMAorcm1ueDY5NCByZW1haW5kZXJuZWFyICAxICAgICBJbmYgICAtPiAgMQorcm1ueDY5NSByZW1haW5kZXJuZWFyICAxMDAwICBJbmYgICAtPiAgMTAwMAorcm1ueDY5NiByZW1haW5kZXJuZWFyICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3Jtbng3MDAgcmVtYWluZGVybmVhciAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDcwMSByZW1haW5kZXJuZWFyIC1JbmYgIC0xMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54NzAyIHJlbWFpbmRlcm5lYXIgLUluZiAgLTEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jtbng3MDMgcmVtYWluZGVybmVhciAtSW5mICAtMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDcwNCByZW1haW5kZXJuZWFyIC1JbmYgICAwICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54NzA1IHJlbWFpbmRlcm5lYXIgLUluZiAgIDEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jtbng3MDYgcmVtYWluZGVybmVhciAtSW5mICAgMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDcwNyByZW1haW5kZXJuZWFyIC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54NzA4IHJlbWFpbmRlcm5lYXIgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jtbng3MDkgcmVtYWluZGVybmVhciAtMTAwMCAgSW5mICAgLT4gLTEwMDAKK3Jtbng3MTAgcmVtYWluZGVybmVhciAtMSAgICAtSW5mICAgLT4gLTEKK3Jtbng3MTEgcmVtYWluZGVybmVhciAtMCAgICAtSW5mICAgLT4gLTAKK3Jtbng3MTIgcmVtYWluZGVybmVhciAgMCAgICAtSW5mICAgLT4gIDAKK3Jtbng3MTMgcmVtYWluZGVybmVhciAgMSAgICAtSW5mICAgLT4gIDEKK3Jtbng3MTQgcmVtYWluZGVybmVhciAgMTAwMCAtSW5mICAgLT4gIDEwMDAKK3Jtbng3MTUgcmVtYWluZGVybmVhciAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitybW54NzIxIHJlbWFpbmRlcm5lYXIgIE5hTiAtSW5mICAgIC0+ICBOYU4KK3Jtbng3MjIgcmVtYWluZGVybmVhciAgTmFOIC0xMDAwICAgLT4gIE5hTgorcm1ueDcyMyByZW1haW5kZXJuZWFyICBOYU4gLTEgICAgICAtPiAgTmFOCitybW54NzI0IHJlbWFpbmRlcm5lYXIgIE5hTiAtMCAgICAgIC0+ICBOYU4KK3Jtbng3MjUgcmVtYWluZGVybmVhciAgTmFOICAwICAgICAgLT4gIE5hTgorcm1ueDcyNiByZW1haW5kZXJuZWFyICBOYU4gIDEgICAgICAtPiAgTmFOCitybW54NzI3IHJlbWFpbmRlcm5lYXIgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK3Jtbng3MjggcmVtYWluZGVybmVhciAgTmFOICBJbmYgICAgLT4gIE5hTgorcm1ueDcyOSByZW1haW5kZXJuZWFyICBOYU4gIE5hTiAgICAtPiAgTmFOCitybW54NzMwIHJlbWFpbmRlcm5lYXIgLUluZiAgTmFOICAgIC0+ICBOYU4KK3Jtbng3MzEgcmVtYWluZGVybmVhciAtMTAwMCBOYU4gICAgLT4gIE5hTgorcm1ueDczMiByZW1haW5kZXJuZWFyIC0xICAgLU5hTiAgICAtPiAtTmFOCitybW54NzMzIHJlbWFpbmRlcm5lYXIgLTAgICAgTmFOICAgIC0+ICBOYU4KK3Jtbng3MzQgcmVtYWluZGVybmVhciAgMCAgICBOYU4gICAgLT4gIE5hTgorcm1ueDczNSByZW1haW5kZXJuZWFyICAxICAgIE5hTiAgICAtPiAgTmFOCitybW54NzM2IHJlbWFpbmRlcm5lYXIgIDEwMDAgTmFOICAgIC0+ICBOYU4KK3Jtbng3MzcgcmVtYWluZGVybmVhciAgSW5mICBOYU4gICAgLT4gIE5hTgorCitybW54NzQxIHJlbWFpbmRlcm5lYXIgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzQyIHJlbWFpbmRlcm5lYXIgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzQzIHJlbWFpbmRlcm5lYXIgLXNOYU4gLTEgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzQ0IHJlbWFpbmRlcm5lYXIgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzQ1IHJlbWFpbmRlcm5lYXIgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzQ2IHJlbWFpbmRlcm5lYXIgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzQ3IHJlbWFpbmRlcm5lYXIgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzQ5IHJlbWFpbmRlcm5lYXIgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzUwIHJlbWFpbmRlcm5lYXIgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzUxIHJlbWFpbmRlcm5lYXIgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzUyIHJlbWFpbmRlcm5lYXIgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzUzIHJlbWFpbmRlcm5lYXIgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzU0IHJlbWFpbmRlcm5lYXIgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzU1IHJlbWFpbmRlcm5lYXIgLTAgICAtc05hTiAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzU2IHJlbWFpbmRlcm5lYXIgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzU3IHJlbWFpbmRlcm5lYXIgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzU4IHJlbWFpbmRlcm5lYXIgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzU5IHJlbWFpbmRlcm5lYXIgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitybW54NzYwIHJlbWFpbmRlcm5lYXIgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2luZyBOYU5zCitybW54NzYxIHJlbWFpbmRlcm5lYXIgIE5hTjEgICBOYU43ICAgLT4gIE5hTjEKK3Jtbng3NjIgcmVtYWluZGVybmVhciBzTmFOMiAgIE5hTjggICAtPiAgTmFOMiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc2MyByZW1haW5kZXJuZWFyICBOYU4zIC1zTmFOOSAgIC0+IC1OYU45IEludmFsaWRfb3BlcmF0aW9uCitybW54NzY0IHJlbWFpbmRlcm5lYXIgc05hTjQgIHNOYU4xMCAgLT4gIE5hTjQgSW52YWxpZF9vcGVyYXRpb24KK3Jtbng3NjUgcmVtYWluZGVybmVhciAgICAxNSAgIE5hTjExICAtPiAgTmFOMTEKK3Jtbng3NjYgcmVtYWluZGVybmVhciAgTmFONiAgIE5hTjEyICAtPiAgTmFONgorcm1ueDc2NyByZW1haW5kZXJuZWFyICBJbmYgICAtTmFOMTMgIC0+IC1OYU4xMworcm1ueDc2OCByZW1haW5kZXJuZWFyICBOYU4xNCAgLUluZiAgIC0+ICBOYU4xNAorcm1ueDc2OSByZW1haW5kZXJuZWFyICAgIDAgICAgTmFOMTUgIC0+ICBOYU4xNQorcm1ueDc3MCByZW1haW5kZXJuZWFyIC1OYU4xNiAgIC0wICAgIC0+IC1OYU4xNgorCistLSB0ZXN0IHNvbWUgY2FzZXMgdGhhdCBhcmUgY2xvc2UgdG8gZXhwb25lbnQgb3ZlcmZsb3cKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitybW54NzgwIHJlbWFpbmRlcm5lYXIgMSAxZTk5OTk5OTk5OSAgICAtPiAxCitybW54NzgxIHJlbWFpbmRlcm5lYXIgMSAwLjllOTk5OTk5OTk5ICAtPiAxCitybW54NzgyIHJlbWFpbmRlcm5lYXIgMSAwLjk5ZTk5OTk5OTk5OSAtPiAxCitybW54NzgzIHJlbWFpbmRlcm5lYXIgMSAwLjk5OTk5OTk5OWU5OTk5OTk5OTkgLT4gMQorcm1ueDc4NCByZW1haW5kZXJuZWFyIDllOTk5OTk5OTk5ICAgICAgICAgIDEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3Jtbng3ODUgcmVtYWluZGVybmVhciA5LjllOTk5OTk5OTk5ICAgICAgICAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54Nzg2IHJlbWFpbmRlcm5lYXIgOS45OWU5OTk5OTk5OTkgICAgICAgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDc4NyByZW1haW5kZXJuZWFyIDkuOTk5OTk5OTllOTk5OTk5OTk5IDEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIFtmcm9tIGRpdmlkZV0KK3ByZWNpc2lvbjogOQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3Jtbng3OTAgcmVtYWluZGVybmVhciArMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSs5OTk5OTk5OTkgLT4gMS4yMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3Jtbng3OTEgcmVtYWluZGVybmVhciA5RSs5OTk5OTk5OTkgKzAuMjM0NTY3ODkwMTIzNDVFLTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3Jtbng3OTIgcmVtYWluZGVybmVhciArMC4xMDAgOUUrOTk5OTk5OTk5ICAgICAgICAgICAgICAgLT4gMC4xMDAKK3Jtbng3OTMgcmVtYWluZGVybmVhciA5RS05OTk5OTk5OTkgKzkuMTAwICAgICAgICAgICAgICAgLT4gOUUtOTk5OTk5OTk5CitybW54Nzk1IHJlbWFpbmRlcm5lYXIgLTEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5IC0+IC0xLjIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm1ueDc5NiByZW1haW5kZXJuZWFyIDlFKzk5OTk5OTk5OSAtMC44MzQ1Njc4OTAxMjM0NUUtMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDc5NyByZW1haW5kZXJuZWFyIC0wLjEwMCA5RSs5OTk5OTk5OTkgICAgICAgICAgICAgICAtPiAtMC4xMDAKK3Jtbng3OTggcmVtYWluZGVybmVhciA5RS05OTk5OTk5OTkgLTkuMTAwICAgICAgICAgICAgICAgLT4gOUUtOTk5OTk5OTk5CisKKy0tIGxvbmcgb3BlcmFuZHMgY2hlY2tzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CitybW54ODAxIHJlbWFpbmRlcm5lYXIgMTIzNDU2NzgwMDAgMTAwIC0+IDAKK3Jtbng4MDIgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4MDAwICAgLT4gMQorcm1ueDgwMyByZW1haW5kZXJuZWFyIDEyMzQ1Njc4MDAgIDEwICAtPiAwCitybW54ODA0IHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODAwICAgIC0+IDEKK3Jtbng4MDUgcmVtYWluZGVybmVhciAxMjM0NTY3ODkwICAxMCAgLT4gMAorcm1ueDgwNiByZW1haW5kZXJuZWFyIDEgMTIzNDU2Nzg5MCAgICAtPiAxCitybW54ODA3IHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5MSAgMTAgIC0+IDEKK3Jtbng4MDggcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTEgICAgLT4gMQorcm1ueDgwOSByZW1haW5kZXJuZWFyIDEyMzQ1Njc4OTAxIDEwMCAtPiAxCitybW54ODEwIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODkwMSAgIC0+IDEKK3Jtbng4MTEgcmVtYWluZGVybmVhciAxMjM0NTY3ODk2ICAxMCAgLT4gLTQKK3Jtbng4MTIgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCitwcmVjaXNpb246IDE1CitybW54ODQxIHJlbWFpbmRlcm5lYXIgMTIzNDU2NzgwMDAgMTAwIC0+IDAKK3Jtbng4NDIgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4MDAwICAgLT4gMQorcm1ueDg0MyByZW1haW5kZXJuZWFyIDEyMzQ1Njc4MDAgIDEwICAtPiAwCitybW54ODQ0IHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODAwICAgIC0+IDEKK3Jtbng4NDUgcmVtYWluZGVybmVhciAxMjM0NTY3ODkwICAxMCAgLT4gMAorcm1ueDg0NiByZW1haW5kZXJuZWFyIDEgMTIzNDU2Nzg5MCAgICAtPiAxCitybW54ODQ3IHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5MSAgMTAgIC0+IDEKK3Jtbng4NDggcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTEgICAgLT4gMQorcm1ueDg0OSByZW1haW5kZXJuZWFyIDEyMzQ1Njc4OTAxIDEwMCAtPiAxCitybW54ODUwIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODkwMSAgIC0+IDEKK3Jtbng4NTEgcmVtYWluZGVybmVhciAxMjM0NTY3ODk2ICAxMCAgLT4gLTQKK3Jtbng4NTIgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCistLSBOdWxsIHRlc3RzCitybW54OTAwIHJlbWFpbmRlcm5lYXIgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54OTAxIHJlbWFpbmRlcm5lYXIgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3Jlc2NhbGUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmVzY2FsZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDkzOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3Jlc2NhbGUuZGVjVGVzdApAQCAtMCwwICsxLDc2NCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSByZXNjYWxlLmRlY1Rlc3QgLS0gZGVjaW1hbCByZXNjYWxlIG9wZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFtvYnNvbGV0ZV0gICBRdWFudGl6ZS5kZWNUZXN0IGhhcyB0aGUgaW1wcm92ZWQgdmVyc2lvbgorCistLSAyMDA0LjAzLjE1IFVuZGVyZmxvdyBmb3IgcXVhbnRpemUgaXMgc3VwcHJlc3NlZAorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorCistLSBzYW5pdHkgY2hlY2tzCisKK3Jlc3gwMDEgcmVzY2FsZSAwICAgICAgIDAgICAtPiAwCityZXN4MDAyIHJlc2NhbGUgMSAgICAgICAwICAgLT4gMQorcmVzeDAwMyByZXNjYWxlIDAuMSAgICArMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4MDA1IHJlc2NhbGUgMC4xICAgICsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMDYgcmVzY2FsZSAwLjEgICAgIDAgICAtPiAwIEluZXhhY3QgUm91bmRlZAorcmVzeDAwNyByZXNjYWxlIDAuMSAgICAtMSAgIC0+IDAuMQorcmVzeDAwOCByZXNjYWxlIDAuMSAgICAtMiAgIC0+IDAuMTAKK3Jlc3gwMDkgcmVzY2FsZSAwLjEgICAgLTMgICAtPiAwLjEwMAorcmVzeDAxMCByZXNjYWxlIDAuOSAgICArMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4MDExIHJlc2NhbGUgMC45ICAgICsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMTIgcmVzY2FsZSAwLjkgICAgKzAgICAtPiAxIEluZXhhY3QgUm91bmRlZAorcmVzeDAxMyByZXNjYWxlIDAuOSAgICAtMSAgIC0+IDAuOQorcmVzeDAxNCByZXNjYWxlIDAuOSAgICAtMiAgIC0+IDAuOTAKK3Jlc3gwMTUgcmVzY2FsZSAwLjkgICAgLTMgICAtPiAwLjkwMAorLS0gbmVnYXRpdmVzCityZXN4MDIxIHJlc2NhbGUgLTAgICAgICAwICAgLT4gLTAKK3Jlc3gwMjIgcmVzY2FsZSAtMSAgICAgIDAgICAtPiAtMQorcmVzeDAyMyByZXNjYWxlIC0wLjEgICArMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDAyNSByZXNjYWxlIC0wLjEgICArMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDAyNiByZXNjYWxlIC0wLjEgICAgMCAgIC0+IC0wIEluZXhhY3QgUm91bmRlZAorcmVzeDAyNyByZXNjYWxlIC0wLjEgICAtMSAgIC0+IC0wLjEKK3Jlc3gwMjggcmVzY2FsZSAtMC4xICAgLTIgICAtPiAtMC4xMAorcmVzeDAyOSByZXNjYWxlIC0wLjEgICAtMyAgIC0+IC0wLjEwMAorcmVzeDAzMCByZXNjYWxlIC0wLjkgICArMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDAzMSByZXNjYWxlIC0wLjkgICArMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDAzMiByZXNjYWxlIC0wLjkgICArMCAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAorcmVzeDAzMyByZXNjYWxlIC0wLjkgICAtMSAgIC0+IC0wLjkKK3Jlc3gwMzQgcmVzY2FsZSAtMC45ICAgLTIgICAtPiAtMC45MAorcmVzeDAzNSByZXNjYWxlIC0wLjkgICAtMyAgIC0+IC0wLjkwMAorcmVzeDAzNiByZXNjYWxlIC0wLjUgICArMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDAzNyByZXNjYWxlIC0wLjUgICArMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDAzOCByZXNjYWxlIC0wLjUgICArMCAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAorcmVzeDAzOSByZXNjYWxlIC0wLjUgICAtMSAgIC0+IC0wLjUKK3Jlc3gwNDAgcmVzY2FsZSAtMC41ICAgLTIgICAtPiAtMC41MAorcmVzeDA0MSByZXNjYWxlIC0wLjUgICAtMyAgIC0+IC0wLjUwMAorcmVzeDA0MiByZXNjYWxlIC0wLjkgICArMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDA0MyByZXNjYWxlIC0wLjkgICArMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDA0NCByZXNjYWxlIC0wLjkgICArMCAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAorcmVzeDA0NSByZXNjYWxlIC0wLjkgICAtMSAgIC0+IC0wLjkKK3Jlc3gwNDYgcmVzY2FsZSAtMC45ICAgLTIgICAtPiAtMC45MAorcmVzeDA0NyByZXNjYWxlIC0wLjkgICAtMyAgIC0+IC0wLjkwMAorCistLSBleGFtcGxlcyBmcm9tIFNwZWNpZmljYXRpb24KK3Jlc3gwNjAgcmVzY2FsZSAyLjE3ICAgLTMgICAtPiAyLjE3MAorcmVzeDA2MSByZXNjYWxlIDIuMTcgICAtMiAgIC0+IDIuMTcKK3Jlc3gwNjIgcmVzY2FsZSAyLjE3ICAgLTEgICAtPiAyLjIgSW5leGFjdCBSb3VuZGVkCityZXN4MDYzIHJlc2NhbGUgMi4xNyAgICAwICAgLT4gMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwNjQgcmVzY2FsZSAyLjE3ICAgKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDA2NSByZXNjYWxlIDIgICAgICBJbmYgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDA2NiByZXNjYWxlIC0wLjEgICAgMCAgIC0+IC0wIEluZXhhY3QgUm91bmRlZAorcmVzeDA2NyByZXNjYWxlIC0wICAgICAgNSAgIC0+IC0wRSs1CityZXN4MDY4IHJlc2NhbGUgKzM1MjM2NDUwLjYgLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4MDY5IHJlc2NhbGUgLTM1MjM2NDUwLjYgLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4MDcwIHJlc2NhbGUgMjE3ICAgIC0xICAgLT4gMjE3LjAKK3Jlc3gwNzEgcmVzY2FsZSAyMTcgICAgIDAgICAtPiAyMTcKK3Jlc3gwNzIgcmVzY2FsZSAyMTcgICAgKzEgICAtPiAyLjJFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4MDczIHJlc2NhbGUgMjE3ICAgICsyICAgLT4gMkUrMiBJbmV4YWN0IFJvdW5kZWQKKworLS0gZ2VuZXJhbCB0ZXN0cyAuLgorcmVzeDA4OSByZXNjYWxlIDEyICAgICArNCAgIC0+IDBFKzQgSW5leGFjdCBSb3VuZGVkCityZXN4MDkwIHJlc2NhbGUgMTIgICAgICszICAgLT4gMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwOTEgcmVzY2FsZSAxMiAgICAgKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDA5MiByZXNjYWxlIDEyICAgICArMSAgIC0+IDFFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MDkzIHJlc2NhbGUgMS4yMzQ1IC0yICAgLT4gMS4yMyBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwOTQgcmVzY2FsZSAxLjIzNTUgLTIgICAtPiAxLjI0IEluZXhhY3QgUm91bmRlZAorcmVzeDA5NSByZXNjYWxlIDEuMjM0NSAtNiAgIC0+IDEuMjM0NTAwCityZXN4MDk2IHJlc2NhbGUgOS45OTk5IC0yICAgLT4gMTAuMDAgSW5leGFjdCBSb3VuZGVkCityZXN4MDk3IHJlc2NhbGUgMC4wMDAxIC0yICAgLT4gMC4wMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwOTggcmVzY2FsZSAwLjAwMSAgLTIgICAtPiAwLjAwIEluZXhhY3QgUm91bmRlZAorcmVzeDA5OSByZXNjYWxlIDAuMDA5ICAtMiAgIC0+IDAuMDEgSW5leGFjdCBSb3VuZGVkCityZXN4MTAwIHJlc2NhbGUgOTIgICAgICsyICAgLT4gMUUrMiBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDEwMSByZXNjYWxlIC0xICAgICAgMCAgIC0+ICAtMQorcmVzeDEwMiByZXNjYWxlIC0xICAgICAtMSAgIC0+ICAtMS4wCityZXN4MTAzIHJlc2NhbGUgLTEgICAgIC0yICAgLT4gIC0xLjAwCityZXN4MTA0IHJlc2NhbGUgIDAgICAgICAwICAgLT4gIDAKK3Jlc3gxMDUgcmVzY2FsZSAgMCAgICAgLTEgICAtPiAgMC4wCityZXN4MTA2IHJlc2NhbGUgIDAgICAgIC0yICAgLT4gIDAuMDAKK3Jlc3gxMDcgcmVzY2FsZSAgMC4wMCAgIDAgICAtPiAgMAorcmVzeDEwOCByZXNjYWxlICAwICAgICArMSAgIC0+ICAwRSsxCityZXN4MTA5IHJlc2NhbGUgIDAgICAgICsyICAgLT4gIDBFKzIKK3Jlc3gxMTAgcmVzY2FsZSArMSAgICAgIDAgICAtPiAgMQorcmVzeDExMSByZXNjYWxlICsxICAgICAtMSAgIC0+ICAxLjAKK3Jlc3gxMTIgcmVzY2FsZSArMSAgICAgLTIgICAtPiAgMS4wMAorCityZXN4MTIwIHJlc2NhbGUgICAxLjA0ICAtMyAtPiAgMS4wNDAKK3Jlc3gxMjEgcmVzY2FsZSAgIDEuMDQgIC0yIC0+ICAxLjA0CityZXN4MTIyIHJlc2NhbGUgICAxLjA0ICAtMSAtPiAgMS4wIEluZXhhY3QgUm91bmRlZAorcmVzeDEyMyByZXNjYWxlICAgMS4wNCAgIDAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCityZXN4MTI0IHJlc2NhbGUgICAxLjA1ICAtMyAtPiAgMS4wNTAKK3Jlc3gxMjUgcmVzY2FsZSAgIDEuMDUgIC0yIC0+ICAxLjA1CityZXN4MTI2IHJlc2NhbGUgICAxLjA1ICAtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorcmVzeDEyNyByZXNjYWxlICAgMS4wNSAgIDAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCityZXN4MTI4IHJlc2NhbGUgICAxLjA1ICAtMyAtPiAgMS4wNTAKK3Jlc3gxMjkgcmVzY2FsZSAgIDEuMDUgIC0yIC0+ICAxLjA1CityZXN4MTMwIHJlc2NhbGUgICAxLjA1ICAtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorcmVzeDEzMSByZXNjYWxlICAgMS4wNSAgIDAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCityZXN4MTMyIHJlc2NhbGUgICAxLjA2ICAtMyAtPiAgMS4wNjAKK3Jlc3gxMzMgcmVzY2FsZSAgIDEuMDYgIC0yIC0+ICAxLjA2CityZXN4MTM0IHJlc2NhbGUgICAxLjA2ICAtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorcmVzeDEzNSByZXNjYWxlICAgMS4wNiAgIDAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCisKK3Jlc3gxNDAgcmVzY2FsZSAgIC0xMCAgICAtMiAgLT4gIC0xMC4wMAorcmVzeDE0MSByZXNjYWxlICAgKzEgICAgIC0yICAtPiAgMS4wMAorcmVzeDE0MiByZXNjYWxlICAgKzEwICAgIC0yICAtPiAgMTAuMDAKK3Jlc3gxNDMgcmVzY2FsZSAgIDFFKzEwICAtMiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDE0NCByZXNjYWxlICAgMUUtMTAgIC0yICAtPiAgMC4wMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gxNDUgcmVzY2FsZSAgIDFFLTMgICAtMiAgLT4gIDAuMDAgSW5leGFjdCBSb3VuZGVkCityZXN4MTQ2IHJlc2NhbGUgICAxRS0yICAgLTIgIC0+ICAwLjAxCityZXN4MTQ3IHJlc2NhbGUgICAxRS0xICAgLTIgIC0+ICAwLjEwCityZXN4MTQ4IHJlc2NhbGUgICAwRS0xMCAgLTIgIC0+ICAwLjAwCisKK3Jlc3gxNTAgcmVzY2FsZSAgIDEuMDYwMCAtNSAtPiAgMS4wNjAwMAorcmVzeDE1MSByZXNjYWxlICAgMS4wNjAwIC00IC0+ICAxLjA2MDAKK3Jlc3gxNTIgcmVzY2FsZSAgIDEuMDYwMCAtMyAtPiAgMS4wNjAgUm91bmRlZAorcmVzeDE1MyByZXNjYWxlICAgMS4wNjAwIC0yIC0+ICAxLjA2IFJvdW5kZWQKK3Jlc3gxNTQgcmVzY2FsZSAgIDEuMDYwMCAtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorcmVzeDE1NSByZXNjYWxlICAgMS4wNjAwICAwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorCistLSArdmUgZXhwb25lbnRzIC4uCityZXN4MjAxIHJlc2NhbGUgICAtMSAgICswIC0+ICAtMQorcmVzeDIwMiByZXNjYWxlICAgLTEgICArMSAtPiAgLTBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MjAzIHJlc2NhbGUgICAtMSAgICsyIC0+ICAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyMDQgcmVzY2FsZSAgICAwICAgKzAgLT4gIDAKK3Jlc3gyMDUgcmVzY2FsZSAgICAwICAgKzEgLT4gIDBFKzEKK3Jlc3gyMDYgcmVzY2FsZSAgICAwICAgKzIgLT4gIDBFKzIKK3Jlc3gyMDcgcmVzY2FsZSAgICsxICAgKzAgLT4gIDEKK3Jlc3gyMDggcmVzY2FsZSAgICsxICAgKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MjA5IHJlc2NhbGUgICArMSAgICsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorCityZXN4MjIwIHJlc2NhbGUgICAxLjA0ICszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcmVzeDIyMSByZXNjYWxlICAgMS4wNCArMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyMjIgcmVzY2FsZSAgIDEuMDQgKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MjIzIHJlc2NhbGUgICAxLjA0ICswIC0+ICAxIEluZXhhY3QgUm91bmRlZAorcmVzeDIyNCByZXNjYWxlICAgMS4wNSArMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyMjUgcmVzY2FsZSAgIDEuMDUgKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4MjI2IHJlc2NhbGUgICAxLjA1ICsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDIyNyByZXNjYWxlICAgMS4wNSArMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyMjggcmVzY2FsZSAgIDEuMDUgKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCityZXN4MjI5IHJlc2NhbGUgICAxLjA1ICsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDIzMCByZXNjYWxlICAgMS4wNSArMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyMzEgcmVzY2FsZSAgIDEuMDUgKzAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCityZXN4MjMyIHJlc2NhbGUgICAxLjA2ICszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcmVzeDIzMyByZXNjYWxlICAgMS4wNiArMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyMzQgcmVzY2FsZSAgIDEuMDYgKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MjM1IHJlc2NhbGUgICAxLjA2ICswIC0+ICAxIEluZXhhY3QgUm91bmRlZAorCityZXN4MjQwIHJlc2NhbGUgICAtMTAgICArMSAgLT4gIC0xRSsxIFJvdW5kZWQKK3Jlc3gyNDEgcmVzY2FsZSAgICsxICAgICsxICAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyNDIgcmVzY2FsZSAgICsxMCAgICsxICAtPiAgMUUrMSBSb3VuZGVkCityZXN4MjQzIHJlc2NhbGUgICAxRSsxICArMSAgLT4gIDFFKzEgICAgICAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorcmVzeDI0NCByZXNjYWxlICAgMUUrMiAgKzEgIC0+ICAxLjBFKzIgICAgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK3Jlc3gyNDUgcmVzY2FsZSAgIDFFKzMgICsxICAtPiAgMS4wMEUrMyAgICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCityZXN4MjQ2IHJlc2NhbGUgICAxRSs0ICArMSAgLT4gIDEuMDAwRSs0ICAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorcmVzeDI0NyByZXNjYWxlICAgMUUrNSAgKzEgIC0+ICAxLjAwMDBFKzUgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK3Jlc3gyNDggcmVzY2FsZSAgIDFFKzYgICsxICAtPiAgMS4wMDAwMEUrNiAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCityZXN4MjQ5IHJlc2NhbGUgICAxRSs3ICArMSAgLT4gIDEuMDAwMDAwRSs3ICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorcmVzeDI1MCByZXNjYWxlICAgMUUrOCAgKzEgIC0+ICAxLjAwMDAwMDBFKzggIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK3Jlc3gyNTEgcmVzY2FsZSAgIDFFKzkgICsxICAtPiAgMS4wMDAwMDAwMEUrOSAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCistLSBuZXh0IG9uZSB0cmllcyB0byBhZGQgOSB6ZXJvcworcmVzeDI1MiByZXNjYWxlICAgMUUrMTAgKzEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3gyNTMgcmVzY2FsZSAgIDFFLTEwICsxICAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyNTQgcmVzY2FsZSAgIDFFLTIgICsxICAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyNTUgcmVzY2FsZSAgIDBFLTEwICsxICAtPiAgMEUrMQorcmVzeDI1NiByZXNjYWxlICAtMEUtMTAgKzEgIC0+IC0wRSsxCityZXN4MjU3IHJlc2NhbGUgIC0wRS0xICArMSAgLT4gLTBFKzEKK3Jlc3gyNTggcmVzY2FsZSAgLTAgICAgICsxICAtPiAtMEUrMQorcmVzeDI1OSByZXNjYWxlICAtMEUrMSAgKzEgIC0+IC0wRSsxCisKK3Jlc3gyNjAgcmVzY2FsZSAgIC0xMCAgICsyICAtPiAgLTBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4MjYxIHJlc2NhbGUgICArMSAgICArMiAgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4MjYyIHJlc2NhbGUgICArMTAgICArMiAgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4MjYzIHJlc2NhbGUgICAxRSsxICArMiAgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4MjY0IHJlc2NhbGUgICAxRSsyICArMiAgLT4gIDFFKzIKK3Jlc3gyNjUgcmVzY2FsZSAgIDFFKzMgICsyICAtPiAgMS4wRSszCityZXN4MjY2IHJlc2NhbGUgICAxRSs0ICArMiAgLT4gIDEuMDBFKzQKK3Jlc3gyNjcgcmVzY2FsZSAgIDFFKzUgICsyICAtPiAgMS4wMDBFKzUKK3Jlc3gyNjggcmVzY2FsZSAgIDFFKzYgICsyICAtPiAgMS4wMDAwRSs2CityZXN4MjY5IHJlc2NhbGUgICAxRSs3ICArMiAgLT4gIDEuMDAwMDBFKzcKK3Jlc3gyNzAgcmVzY2FsZSAgIDFFKzggICsyICAtPiAgMS4wMDAwMDBFKzgKK3Jlc3gyNzEgcmVzY2FsZSAgIDFFKzkgICsyICAtPiAgMS4wMDAwMDAwRSs5CityZXN4MjcyIHJlc2NhbGUgICAxRSsxMCArMiAgLT4gIDEuMDAwMDAwMDBFKzEwCityZXN4MjczIHJlc2NhbGUgICAxRS0xMCArMiAgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4Mjc0IHJlc2NhbGUgICAxRS0yICArMiAgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4Mjc1IHJlc2NhbGUgICAwRS0xMCArMiAgLT4gIDBFKzIKKworcmVzeDI4MCByZXNjYWxlICAgLTEwICAgKzMgIC0+ICAtMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyODEgcmVzY2FsZSAgICsxICAgICszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyODIgcmVzY2FsZSAgICsxMCAgICszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyODMgcmVzY2FsZSAgIDFFKzEgICszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyODQgcmVzY2FsZSAgIDFFKzIgICszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyODUgcmVzY2FsZSAgIDFFKzMgICszICAtPiAgMUUrMworcmVzeDI4NiByZXNjYWxlICAgMUUrNCAgKzMgIC0+ICAxLjBFKzQKK3Jlc3gyODcgcmVzY2FsZSAgIDFFKzUgICszICAtPiAgMS4wMEUrNQorcmVzeDI4OCByZXNjYWxlICAgMUUrNiAgKzMgIC0+ICAxLjAwMEUrNgorcmVzeDI4OSByZXNjYWxlICAgMUUrNyAgKzMgIC0+ICAxLjAwMDBFKzcKK3Jlc3gyOTAgcmVzY2FsZSAgIDFFKzggICszICAtPiAgMS4wMDAwMEUrOAorcmVzeDI5MSByZXNjYWxlICAgMUUrOSAgKzMgIC0+ICAxLjAwMDAwMEUrOQorcmVzeDI5MiByZXNjYWxlICAgMUUrMTAgKzMgIC0+ICAxLjAwMDAwMDBFKzEwCityZXN4MjkzIHJlc2NhbGUgICAxRS0xMCArMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCityZXN4Mjk0IHJlc2NhbGUgICAxRS0yICArMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCityZXN4Mjk1IHJlc2NhbGUgICAwRS0xMCArMyAgLT4gIDBFKzMKKworLS0gcm91bmQgdXAgZnJvbSBiZWxvdyBbc2lnbiB3cm9uZyBpbiBKSVQgY29tcGlsZXIgb25jZV0KK3Jlc3gzMDAgcmVzY2FsZSAgIDAuMDA3OCAtNSAtPiAgMC4wMDc4MAorcmVzeDMwMSByZXNjYWxlICAgMC4wMDc4IC00IC0+ICAwLjAwNzgKK3Jlc3gzMDIgcmVzY2FsZSAgIDAuMDA3OCAtMyAtPiAgMC4wMDggSW5leGFjdCBSb3VuZGVkCityZXN4MzAzIHJlc2NhbGUgICAwLjAwNzggLTIgLT4gIDAuMDEgSW5leGFjdCBSb3VuZGVkCityZXN4MzA0IHJlc2NhbGUgICAwLjAwNzggLTEgLT4gIDAuMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMDUgcmVzY2FsZSAgIDAuMDA3OCAgMCAtPiAgMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMDYgcmVzY2FsZSAgIDAuMDA3OCArMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMDcgcmVzY2FsZSAgIDAuMDA3OCArMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDMxMCByZXNjYWxlICAtMC4wMDc4IC01IC0+IC0wLjAwNzgwCityZXN4MzExIHJlc2NhbGUgIC0wLjAwNzggLTQgLT4gLTAuMDA3OAorcmVzeDMxMiByZXNjYWxlICAtMC4wMDc4IC0zIC0+IC0wLjAwOCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMTMgcmVzY2FsZSAgLTAuMDA3OCAtMiAtPiAtMC4wMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMTQgcmVzY2FsZSAgLTAuMDA3OCAtMSAtPiAtMC4wIEluZXhhY3QgUm91bmRlZAorcmVzeDMxNSByZXNjYWxlICAtMC4wMDc4ICAwIC0+IC0wIEluZXhhY3QgUm91bmRlZAorcmVzeDMxNiByZXNjYWxlICAtMC4wMDc4ICsxIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDMxNyByZXNjYWxlICAtMC4wMDc4ICsyIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorCityZXN4MzIwIHJlc2NhbGUgICAwLjA3OCAtNSAtPiAgMC4wNzgwMAorcmVzeDMyMSByZXNjYWxlICAgMC4wNzggLTQgLT4gIDAuMDc4MAorcmVzeDMyMiByZXNjYWxlICAgMC4wNzggLTMgLT4gIDAuMDc4CityZXN4MzIzIHJlc2NhbGUgICAwLjA3OCAtMiAtPiAgMC4wOCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMjQgcmVzY2FsZSAgIDAuMDc4IC0xIC0+ICAwLjEgSW5leGFjdCBSb3VuZGVkCityZXN4MzI1IHJlc2NhbGUgICAwLjA3OCAgMCAtPiAgMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMjYgcmVzY2FsZSAgIDAuMDc4ICsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDMyNyByZXNjYWxlICAgMC4wNzggKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCisKK3Jlc3gzMzAgcmVzY2FsZSAgLTAuMDc4IC01IC0+IC0wLjA3ODAwCityZXN4MzMxIHJlc2NhbGUgIC0wLjA3OCAtNCAtPiAtMC4wNzgwCityZXN4MzMyIHJlc2NhbGUgIC0wLjA3OCAtMyAtPiAtMC4wNzgKK3Jlc3gzMzMgcmVzY2FsZSAgLTAuMDc4IC0yIC0+IC0wLjA4IEluZXhhY3QgUm91bmRlZAorcmVzeDMzNCByZXNjYWxlICAtMC4wNzggLTEgLT4gLTAuMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMzUgcmVzY2FsZSAgLTAuMDc4ICAwIC0+IC0wIEluZXhhY3QgUm91bmRlZAorcmVzeDMzNiByZXNjYWxlICAtMC4wNzggKzEgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MzM3IHJlc2NhbGUgIC0wLjA3OCArMiAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDM0MCByZXNjYWxlICAgMC43OCAtNSAtPiAgMC43ODAwMAorcmVzeDM0MSByZXNjYWxlICAgMC43OCAtNCAtPiAgMC43ODAwCityZXN4MzQyIHJlc2NhbGUgICAwLjc4IC0zIC0+ICAwLjc4MAorcmVzeDM0MyByZXNjYWxlICAgMC43OCAtMiAtPiAgMC43OAorcmVzeDM0NCByZXNjYWxlICAgMC43OCAtMSAtPiAgMC44IEluZXhhY3QgUm91bmRlZAorcmVzeDM0NSByZXNjYWxlICAgMC43OCAgMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzNDYgcmVzY2FsZSAgIDAuNzggKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MzQ3IHJlc2NhbGUgICAwLjc4ICsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorCityZXN4MzUwIHJlc2NhbGUgIC0wLjc4IC01IC0+IC0wLjc4MDAwCityZXN4MzUxIHJlc2NhbGUgIC0wLjc4IC00IC0+IC0wLjc4MDAKK3Jlc3gzNTIgcmVzY2FsZSAgLTAuNzggLTMgLT4gLTAuNzgwCityZXN4MzUzIHJlc2NhbGUgIC0wLjc4IC0yIC0+IC0wLjc4CityZXN4MzU0IHJlc2NhbGUgIC0wLjc4IC0xIC0+IC0wLjggSW5leGFjdCBSb3VuZGVkCityZXN4MzU1IHJlc2NhbGUgIC0wLjc4ICAwIC0+IC0xIEluZXhhY3QgUm91bmRlZAorcmVzeDM1NiByZXNjYWxlICAtMC43OCArMSAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzNTcgcmVzY2FsZSAgLTAuNzggKzIgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCisKK3Jlc3gzNjAgcmVzY2FsZSAgIDcuOCAtNSAtPiAgNy44MDAwMAorcmVzeDM2MSByZXNjYWxlICAgNy44IC00IC0+ICA3LjgwMDAKK3Jlc3gzNjIgcmVzY2FsZSAgIDcuOCAtMyAtPiAgNy44MDAKK3Jlc3gzNjMgcmVzY2FsZSAgIDcuOCAtMiAtPiAgNy44MAorcmVzeDM2NCByZXNjYWxlICAgNy44IC0xIC0+ICA3LjgKK3Jlc3gzNjUgcmVzY2FsZSAgIDcuOCAgMCAtPiAgOCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzNjYgcmVzY2FsZSAgIDcuOCArMSAtPiAgMUUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzNjcgcmVzY2FsZSAgIDcuOCArMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzNjggcmVzY2FsZSAgIDcuOCArMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDM3MCByZXNjYWxlICAtNy44IC01IC0+IC03LjgwMDAwCityZXN4MzcxIHJlc2NhbGUgIC03LjggLTQgLT4gLTcuODAwMAorcmVzeDM3MiByZXNjYWxlICAtNy44IC0zIC0+IC03LjgwMAorcmVzeDM3MyByZXNjYWxlICAtNy44IC0yIC0+IC03LjgwCityZXN4Mzc0IHJlc2NhbGUgIC03LjggLTEgLT4gLTcuOAorcmVzeDM3NSByZXNjYWxlICAtNy44ICAwIC0+IC04IEluZXhhY3QgUm91bmRlZAorcmVzeDM3NiByZXNjYWxlICAtNy44ICsxIC0+IC0xRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDM3NyByZXNjYWxlICAtNy44ICsyIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDM3OCByZXNjYWxlICAtNy44ICszIC0+IC0wRSszIEluZXhhY3QgUm91bmRlZAorCistLSBzb21lIGluZGl2aWR1YWxzCitwcmVjaXNpb246IDkKK3Jlc3gzODAgcmVzY2FsZSAgIDM1MjM2NC41MDYgLTIgLT4gMzUyMzY0LjUxIEluZXhhY3QgUm91bmRlZAorcmVzeDM4MSByZXNjYWxlICAgMzUyMzY0NS4wNiAtMiAtPiAzNTIzNjQ1LjA2CityZXN4MzgyIHJlc2NhbGUgICAzNTIzNjQ1MC42IC0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDM4MyByZXNjYWxlICAgMzUyMzY0NTA2ICAtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3gzODQgcmVzY2FsZSAgLTM1MjM2NC41MDYgLTIgLT4gLTM1MjM2NC41MSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzODUgcmVzY2FsZSAgLTM1MjM2NDUuMDYgLTIgLT4gLTM1MjM2NDUuMDYKK3Jlc3gzODYgcmVzY2FsZSAgLTM1MjM2NDUwLjYgLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4Mzg3IHJlc2NhbGUgIC0zNTIzNjQ1MDYgIC0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCityb3VuZGluZzogZG93bgorcmVzeDM4OSByZXNjYWxlICAgMzUyMzY0NTAuNiAtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tID8gc2hvdWxkIHRoYXQgb25lIGluc3RlYWQgaGF2ZSBiZWVuOgorLS0gcmVzeDM4OSByZXNjYWxlICAgMzUyMzY0NTAuNiAtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdW5kaW5nOiBoYWxmX3VwCisKKy0tIGFuZCBhIGZldyBtb3JlIGZyb20gZS1tYWlsIGRpc2N1c3Npb25zCitwcmVjaXNpb246IDcKK3Jlc3gzOTEgcmVzY2FsZSAgMTIuMzQ1NjcgIC0zIC0+IDEyLjM0NiAgIEluZXhhY3QgUm91bmRlZAorcmVzeDM5MiByZXNjYWxlICAxMjMuNDU2NyAgLTMgLT4gMTIzLjQ1NyAgSW5leGFjdCBSb3VuZGVkCityZXN4MzkzIHJlc2NhbGUgIDEyMzQuNTY3ICAtMyAtPiAxMjM0LjU2NworcmVzeDM5NCByZXNjYWxlICAxMjM0NS42NyAgLTMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4Mzk1IHJlc2NhbGUgIDEyMzQ1Ni43ICAtMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3gzOTYgcmVzY2FsZSAgMTIzNDU2Ny4gIC0zIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBzb21lIDk5OTkgcm91bmQtdXAgY2FzZXMKK3ByZWNpc2lvbjogOQorcmVzeDQwMCByZXNjYWxlICAgOS45OTkgICAgICAgIC01ICAtPiAgOS45OTkwMAorcmVzeDQwMSByZXNjYWxlICAgOS45OTkgICAgICAgIC00ICAtPiAgOS45OTkwCityZXN4NDAyIHJlc2NhbGUgICA5Ljk5OSAgICAgICAgLTMgIC0+ICA5Ljk5OQorcmVzeDQwMyByZXNjYWxlICAgOS45OTkgICAgICAgIC0yICAtPiAxMC4wMCAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDA0IHJlc2NhbGUgICA5Ljk5OSAgICAgICAgLTEgIC0+IDEwLjAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0MDUgcmVzY2FsZSAgIDkuOTk5ICAgICAgICAgMCAgLT4gMTAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQwNiByZXNjYWxlICAgOS45OTkgICAgICAgICAxICAtPiAxRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDA3IHJlc2NhbGUgICA5Ljk5OSAgICAgICAgIDIgIC0+IDBFKzIgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDQxMCByZXNjYWxlICAgMC45OTkgICAgICAgIC01ICAtPiAgMC45OTkwMAorcmVzeDQxMSByZXNjYWxlICAgMC45OTkgICAgICAgIC00ICAtPiAgMC45OTkwCityZXN4NDEyIHJlc2NhbGUgICAwLjk5OSAgICAgICAgLTMgIC0+ICAwLjk5OQorcmVzeDQxMyByZXNjYWxlICAgMC45OTkgICAgICAgIC0yICAtPiAgMS4wMCAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDE0IHJlc2NhbGUgICAwLjk5OSAgICAgICAgLTEgIC0+ICAxLjAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0MTUgcmVzY2FsZSAgIDAuOTk5ICAgICAgICAgMCAgLT4gIDEgICAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQxNiByZXNjYWxlICAgMC45OTkgICAgICAgICAxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3Jlc3g0MjAgcmVzY2FsZSAgIDAuMDk5OSAgICAgICAtNSAgLT4gIDAuMDk5OTAKK3Jlc3g0MjEgcmVzY2FsZSAgIDAuMDk5OSAgICAgICAtNCAgLT4gIDAuMDk5OQorcmVzeDQyMiByZXNjYWxlICAgMC4wOTk5ICAgICAgIC0zICAtPiAgMC4xMDAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDIzIHJlc2NhbGUgICAwLjA5OTkgICAgICAgLTIgIC0+ICAwLjEwICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0MjQgcmVzY2FsZSAgIDAuMDk5OSAgICAgICAtMSAgLT4gIDAuMSAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQyNSByZXNjYWxlICAgMC4wOTk5ICAgICAgICAwICAtPiAgMCAgICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDI2IHJlc2NhbGUgICAwLjA5OTkgICAgICAgIDEgIC0+IDBFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDQzMCByZXNjYWxlICAgMC4wMDk5OSAgICAgIC01ICAtPiAgMC4wMDk5OQorcmVzeDQzMSByZXNjYWxlICAgMC4wMDk5OSAgICAgIC00ICAtPiAgMC4wMTAwICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDMyIHJlc2NhbGUgICAwLjAwOTk5ICAgICAgLTMgIC0+ICAwLjAxMCAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0MzMgcmVzY2FsZSAgIDAuMDA5OTkgICAgICAtMiAgLT4gIDAuMDEgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQzNCByZXNjYWxlICAgMC4wMDk5OSAgICAgIC0xICAtPiAgMC4wICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDM1IHJlc2NhbGUgICAwLjAwOTk5ICAgICAgIDAgIC0+ICAwICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0MzYgcmVzY2FsZSAgIDAuMDA5OTkgICAgICAgMSAgLT4gMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCityZXN4NDQwIHJlc2NhbGUgICAwLjAwMDk5OSAgICAgLTUgIC0+ICAwLjAwMTAwICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0NDEgcmVzY2FsZSAgIDAuMDAwOTk5ICAgICAtNCAgLT4gIDAuMDAxMCAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ0MiByZXNjYWxlICAgMC4wMDA5OTkgICAgIC0zICAtPiAgMC4wMDEgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDQzIHJlc2NhbGUgICAwLjAwMDk5OSAgICAgLTIgIC0+ICAwLjAwICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0NDQgcmVzY2FsZSAgIDAuMDAwOTk5ICAgICAtMSAgLT4gIDAuMCAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ0NSByZXNjYWxlICAgMC4wMDA5OTkgICAgICAwICAtPiAgMCAgICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDQ2IHJlc2NhbGUgICAwLjAwMDk5OSAgICAgIDEgIC0+IDBFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiA4CityZXN4NDQ5IHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgLTIzIC0+ICBOYU4gICAgICBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDQ1MCByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0yMiAtPiAgOS45OTkwMDAwRS0xNQorcmVzeDQ1MSByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0yMSAtPiAgOS45OTkwMDBFLTE1CityZXN4NDUyIHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgLTIwIC0+ICA5Ljk5OTAwRS0xNQorcmVzeDQ1MyByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0xOSAtPiAgOS45OTkwRS0xNQorcmVzeDQ1NCByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0xOCAtPiAgOS45OTlFLTE1CityZXN4NDU1IHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgLTE3IC0+ICAxLjAwMEUtMTQgSW5leGFjdCBSb3VuZGVkCityZXN4NDU2IHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgLTE2IC0+ICAxLjAwRS0xNCAgSW5leGFjdCBSb3VuZGVkCityZXN4NDU3IHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgLTE1IC0+ICAxLjBFLTE0ICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDU4IHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgLTE0IC0+ICAxRS0xNCAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDU5IHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgLTEzIC0+ICAwRS0xMyAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDYwIHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgLTEyIC0+ICAwRS0xMiAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDYxIHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgLTExIC0+ICAwRS0xMSAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDYyIHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgLTEwIC0+ICAwRS0xMCAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDYzIHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgIC05IC0+ICAwRS05ICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDY0IHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgIC04IC0+ICAwRS04ICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDY1IHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgIC03IC0+ICAwRS03ICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDY2IHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgIC02IC0+ICAwLjAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCityZXN4NDY3IHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgIC01IC0+ICAwLjAwMDAwICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDY4IHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgIC00IC0+ICAwLjAwMDAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDY5IHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgIC0zIC0+ICAwLjAwMCAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDcwIHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgIC0yIC0+ICAwLjAwICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDcxIHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgIC0xIC0+ICAwLjAgICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDcyIHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgICAwIC0+ICAwICAgICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDczIHJlc2NhbGUgICA5Ljk5OUUtMTUgICAgICAxIC0+ICAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIFthZGRpdGlvbmFsIHRlc3RzIGZvciAiZG9uJ3QgZml0IiBlZGdlIGNhc2VzIGFyZSBpbgorLS0gcXVhbnRpemUuZGVjVGVzdC4gIEhlcmUncyBhIGNyaXRpY2FsIG9uZS5dCitwcmVjaXNpb246IDMKK3Jlc3g0ODAgcmVzY2FsZSAgIDAuOTk5OSAgICAgICAgLTMgLT4gIE5hTiAgICAgICBJbnZhbGlkX29wZXJhdGlvbgorCisKKy0tIGxvbmcgb3BlcmFuZCBjaGVja3MgW3JocyBjaGVja3MgcmVtb3ZlZF0KK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK3Jlc3g0ODEgcmVzY2FsZSAxMjM0NTY3ODAwMCArMyAtPiAxLjIzNDU2NzhFKzEwIFJvdW5kZWQKK3Jlc3g0ODIgcmVzY2FsZSAxMjM0NTY3ODAwICArMSAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK3Jlc3g0ODMgcmVzY2FsZSAxMjM0NTY3ODkwICArMSAtPiAxLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK3Jlc3g0ODQgcmVzY2FsZSAxMjM0NTY3ODkxICArMSAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorcmVzeDQ4NSByZXNjYWxlIDEyMzQ1Njc4OTAxICsyIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorcmVzeDQ4NiByZXNjYWxlIDEyMzQ1Njc4OTYgICsxIC0+IDEuMjM0NTY3OTBFKzkgSW5leGFjdCBSb3VuZGVkCistLSBhIHBvdGVudGlhbCBkb3VibGUtcm91bmQKK3Jlc3g0ODcgcmVzY2FsZSAxMjM0Ljk4NzY0MyAtNCAtPiAxMjM0Ljk4NzYgSW5leGFjdCBSb3VuZGVkCityZXN4NDg4IHJlc2NhbGUgMTIzNC45ODc2NDcgLTQgLT4gMTIzNC45ODc2IEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDE1CityZXN4NDkxIHJlc2NhbGUgMTIzNDU2NzgwMDAgKzMgLT4gMS4yMzQ1Njc4RSsxMCBSb3VuZGVkCityZXN4NDkyIHJlc2NhbGUgMTIzNDU2NzgwMCAgKzEgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCityZXN4NDkzIHJlc2NhbGUgMTIzNDU2Nzg5MCAgKzEgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCityZXN4NDk0IHJlc2NhbGUgMTIzNDU2Nzg5MSAgKzEgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0OTUgcmVzY2FsZSAxMjM0NTY3ODkwMSArMiAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0OTYgcmVzY2FsZSAxMjM0NTY3ODk2ICArMSAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorcmVzeDQ5NyByZXNjYWxlIDEyMzQuOTg3NjQzIC00IC0+IDEyMzQuOTg3NiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0OTggcmVzY2FsZSAxMjM0Ljk4NzY0NyAtNCAtPiAxMjM0Ljk4NzYgSW5leGFjdCBSb3VuZGVkCisKKy0tIFplcm9zCityZXN4NTAwIHJlc2NhbGUgICAwICAgICAxIC0+ICAwRSsxCityZXN4NTAxIHJlc2NhbGUgICAwICAgICAwIC0+ICAwCityZXN4NTAyIHJlc2NhbGUgICAwICAgIC0xIC0+ICAwLjAKK3Jlc3g1MDMgcmVzY2FsZSAgIDAuMCAgLTEgLT4gIDAuMAorcmVzeDUwNCByZXNjYWxlICAgMC4wICAgMCAtPiAgMAorcmVzeDUwNSByZXNjYWxlICAgMC4wICArMSAtPiAgMEUrMQorcmVzeDUwNiByZXNjYWxlICAgMEUrMSAtMSAtPiAgMC4wCityZXN4NTA3IHJlc2NhbGUgICAwRSsxICAwIC0+ICAwCityZXN4NTA4IHJlc2NhbGUgICAwRSsxICsxIC0+ICAwRSsxCityZXN4NTA5IHJlc2NhbGUgIC0wICAgICAxIC0+IC0wRSsxCityZXN4NTEwIHJlc2NhbGUgIC0wICAgICAwIC0+IC0wCityZXN4NTExIHJlc2NhbGUgIC0wICAgIC0xIC0+IC0wLjAKK3Jlc3g1MTIgcmVzY2FsZSAgLTAuMCAgLTEgLT4gLTAuMAorcmVzeDUxMyByZXNjYWxlICAtMC4wICAgMCAtPiAtMAorcmVzeDUxNCByZXNjYWxlICAtMC4wICArMSAtPiAtMEUrMQorcmVzeDUxNSByZXNjYWxlICAtMEUrMSAtMSAtPiAtMC4wCityZXN4NTE2IHJlc2NhbGUgIC0wRSsxICAwIC0+IC0wCityZXN4NTE3IHJlc2NhbGUgIC0wRSsxICsxIC0+IC0wRSsxCisKKy0tIFN1c3BpY2lvdXMgUkhTIHZhbHVlcworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogMTUKK3Jlc3g1MjAgcmVzY2FsZSAgIDEuMjM0ICAgIDk5OTk5OUUrMyAtPiAwRSs5OTk5OTkwMDAgSW5leGFjdCBSb3VuZGVkCityZXN4NTIxIHJlc2NhbGUgMTIzLjQ1NiAgICA5OTk5OTlFKzMgLT4gMEUrOTk5OTk5MDAwIEluZXhhY3QgUm91bmRlZAorcmVzeDUyMiByZXNjYWxlICAgMS4yMzQgICAgOTk5OTk5OTk5IC0+IDBFKzk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1MjMgcmVzY2FsZSAxMjMuNDU2ICAgIDk5OTk5OTk5OSAtPiAwRSs5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCityZXN4NTI0IHJlc2NhbGUgMTIzLjQ1NiAgIDEwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTI1IHJlc2NhbGUgMTIzLjQ1NiAgMTIzNDU2Nzg5MDMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBuZXh0IGZvdXIgYXJlICJ3b24ndCBmaXQiIG92ZXJmbG93cworcmVzeDUyNiByZXNjYWxlICAgMS4yMzQgICAtOTk5OTk5RSszIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDUyNyByZXNjYWxlIDEyMy40NTYgICAtOTk5OTk5RSszIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDUyOCByZXNjYWxlICAgMS4yMzQgICAtOTk5OTk5OTk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDUyOSByZXNjYWxlIDEyMy40NTYgICAtOTk5OTk5OTk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDUzMCByZXNjYWxlIDEyMy40NTYgIC0xMDAwMDAwMDE0IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDUzMSByZXNjYWxlIDEyMy40NTYgLTEyMzQ1Njc4OTAzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiAxNQorcmVzeDUzMiByZXNjYWxlICAgMS4yMzRFKzk5OSAgICA5OTkgLT4gMUUrOTk5ICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDUzMyByZXNjYWxlICAgMS4yMzRFKzk5OCAgICA5OTkgLT4gMEUrOTk5ICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDUzNCByZXNjYWxlICAgMS4yMzQgICAgICAgICA5OTkgLT4gMEUrOTk5ICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDUzNSByZXNjYWxlICAgMS4yMzQgICAgICAgIDEwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTM2IHJlc2NhbGUgICAxLjIzNCAgICAgICAgNTAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1MzcgcmVzY2FsZSAgIDAgICAgICAgICAgICAtOTk5IC0+IDBFLTk5OQorLS0gbmV4dCB0d28gYXJlICJ3b24ndCBmaXQiIG92ZXJmbG93cworcmVzeDUzOCByZXNjYWxlICAgMS4yMzQgICAgICAgIC05OTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTM5IHJlc2NhbGUgICAxLjIzNCAgICAgICAtMTAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1NDAgcmVzY2FsZSAgIDEuMjM0ICAgICAgIC01MDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gW21vcmUgYmVsb3ddCisKKy0tIGNoZWNrIGJvdW5kcyAobGhzIG1heWJlIG91dCBvZiByYW5nZSBmb3IgZGVzdGluYXRpb24sIGV0Yy4pCitwcmVjaXNpb246ICAgICA3CityZXN4NTQxIHJlc2NhbGUgICAxRSs5OTkgICArOTk5IC0+IDFFKzk5OQorcmVzeDU0MiByZXNjYWxlICAgMUUrMTAwMCAgKzk5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1NDMgcmVzY2FsZSAgIDFFKzk5OSAgKzEwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTQ0IHJlc2NhbGUgICAxRS05OTkgICAtOTk5IC0+IDFFLTk5OQorcmVzeDU0NSByZXNjYWxlICAgMUUtMTAwMCAgLTk5OSAtPiAwRS05OTkgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NTQ2IHJlc2NhbGUgICAxRS05OTkgIC0xMDAwIC0+IDEuMEUtOTk5CityZXN4NTQ3IHJlc2NhbGUgICAxRS0xMDA1ICAtOTk5IC0+IDBFLTk5OSAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1NDggcmVzY2FsZSAgIDFFLTEwMDYgIC05OTkgLT4gMEUtOTk5ICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDU0OSByZXNjYWxlICAgMUUtMTAwNyAgLTk5OSAtPiAwRS05OTkgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NTUwIHJlc2NhbGUgICAxRS05OTggIC0xMDA1IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbiAgLS0gd29uJ3QgZml0CityZXN4NTUxIHJlc2NhbGUgICAxRS05OTkgIC0xMDA1IC0+IDEuMDAwMDAwRS05OTkKK3Jlc3g1NTIgcmVzY2FsZSAgIDFFLTEwMDAgLTEwMDUgLT4gMS4wMDAwMEUtMTAwMCBTdWJub3JtYWwKK3Jlc3g1NTMgcmVzY2FsZSAgIDFFLTk5OSAgLTEwMDYgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTU0IHJlc2NhbGUgICAxRS05OTkgIC0xMDA3IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gcmVsYXRlZCBzdWJub3JtYWwgcm91bmRpbmcKK3Jlc3g1NTUgcmVzY2FsZSAgIDEuNjY2NjY2RS05OTkgIC0xMDA1IC0+IDEuNjY2NjY2RS05OTkKK3Jlc3g1NTYgcmVzY2FsZSAgIDEuNjY2NjY2RS0xMDAwIC0xMDA1IC0+IDEuNjY2NjdFLTEwMDAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1NTcgcmVzY2FsZSAgIDEuNjY2NjY2RS0xMDAxIC0xMDA1IC0+IDEuNjY2N0UtMTAwMSAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcmVzeDU1OCByZXNjYWxlICAgMS42NjY2NjZFLTEwMDIgLTEwMDUgLT4gMS42NjdFLTEwMDIgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1NTkgcmVzY2FsZSAgIDEuNjY2NjY2RS0xMDAzIC0xMDA1IC0+IDEuNjdFLTEwMDMgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1NjAgcmVzY2FsZSAgIDEuNjY2NjY2RS0xMDA0IC0xMDA1IC0+IDEuN0UtMTAwNCAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcmVzeDU2MSByZXNjYWxlICAgMS42NjY2NjZFLTEwMDUgLTEwMDUgLT4gMkUtMTAwNSAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcmVzeDU2MiByZXNjYWxlICAgMS42NjY2NjZFLTEwMDYgLTEwMDUgLT4gMEUtMTAwNSAgIEluZXhhY3QgUm91bmRlZAorcmVzeDU2MyByZXNjYWxlICAgMS42NjY2NjZFLTEwMDcgLTEwMDUgLT4gMEUtMTAwNSAgIEluZXhhY3QgUm91bmRlZAorCistLSBmcmFjdGlvbmFsIFJIUywgc29tZSBnb29kIGFuZCBzb21lIGJhZAorcHJlY2lzaW9uOiA5CityZXN4NTY0IHJlc2NhbGUgICAyMjIgKzIuMCAgICAgICAgICAgLT4gMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1NjUgcmVzY2FsZSAgIDIyMiArMi4wMDAwMDAwMCAgICAtPiAyRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDU2NiByZXNjYWxlICAgMjIyICsyLjAwMTAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU2NyByZXNjYWxlICAgMjIyICsyLjAwMDAwMSAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU2OCByZXNjYWxlICAgMjIyICsyLjAwMDAwMDAwMSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU2OSByZXNjYWxlICAgMjIyICsyLjAwMDAwMDAwMDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU3MCByZXNjYWxlICAgMjIyICsyLjAwMDAwMDAwMDAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU3MSByZXNjYWxlICAgMjIyICsyLjk5OTk5OTk5OTk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU3MiByZXNjYWxlICAgMjIyIC0yLjAwMDAwMDAwICAgIC0+IDIyMi4wMAorcmVzeDU3MyByZXNjYWxlICAgMjIyIC0yLjAwMTAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU3NCByZXNjYWxlICAgMjIyIC0yLjAwMDAwMDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU3NSByZXNjYWxlICAgMjIyIC0yLjAwMDAwMDAwMDAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU3NiByZXNjYWxlICAgMjIyIC0yLjk5OTk5OTk5OTk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBTcGVjaWFscworcmVzeDU4MCByZXNjYWxlICBJbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKK3Jlc3g1ODEgcmVzY2FsZSAgSW5mICAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1ODIgcmVzY2FsZSAgSW5mICAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1ODMgcmVzY2FsZSAgSW5mICAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1ODQgcmVzY2FsZSAgSW5mICAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1ODUgcmVzY2FsZSAgSW5mICAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1ODYgcmVzY2FsZSAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CityZXN4NTg3IHJlc2NhbGUgLTEwMDAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTg4IHJlc2NhbGUgLUluZiAgIEluZiAgIC0+ICAtSW5maW5pdHkKK3Jlc3g1ODkgcmVzY2FsZSAtMSAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1OTAgcmVzY2FsZSAgMCAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1OTEgcmVzY2FsZSAgMSAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1OTIgcmVzY2FsZSAgMTAwMCAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1OTMgcmVzY2FsZSAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CityZXN4NTk0IHJlc2NhbGUgIEluZiAgLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTk1IHJlc2NhbGUgLTAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK3Jlc3g2MDAgcmVzY2FsZSAtSW5mICAtSW5mICAgLT4gIC1JbmZpbml0eQorcmVzeDYwMSByZXNjYWxlIC1JbmYgIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDYwMiByZXNjYWxlIC1JbmYgIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDYwMyByZXNjYWxlIC1JbmYgICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDYwNCByZXNjYWxlIC1JbmYgICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDYwNSByZXNjYWxlIC1JbmYgICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDYwNiByZXNjYWxlIC1JbmYgICBJbmYgICAtPiAgLUluZmluaXR5CityZXN4NjA3IHJlc2NhbGUgLTEwMDAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjA4IHJlc2NhbGUgLUluZiAgLUluZiAgIC0+ICAtSW5maW5pdHkKK3Jlc3g2MDkgcmVzY2FsZSAtMSAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2MTAgcmVzY2FsZSAgMCAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2MTEgcmVzY2FsZSAgMSAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2MTIgcmVzY2FsZSAgMTAwMCAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2MTMgcmVzY2FsZSAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CityZXN4NjE0IHJlc2NhbGUgLUluZiAgLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjE1IHJlc2NhbGUgLTAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK3Jlc3g2MjEgcmVzY2FsZSAgTmFOIC1JbmYgICAgLT4gIE5hTgorcmVzeDYyMiByZXNjYWxlICBOYU4gLTEwMDAgICAtPiAgTmFOCityZXN4NjIzIHJlc2NhbGUgIE5hTiAtMSAgICAgIC0+ICBOYU4KK3Jlc3g2MjQgcmVzY2FsZSAgTmFOICAwICAgICAgLT4gIE5hTgorcmVzeDYyNSByZXNjYWxlICBOYU4gIDEgICAgICAtPiAgTmFOCityZXN4NjI2IHJlc2NhbGUgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK3Jlc3g2MjcgcmVzY2FsZSAgTmFOICBJbmYgICAgLT4gIE5hTgorcmVzeDYyOCByZXNjYWxlICBOYU4gIE5hTiAgICAtPiAgTmFOCityZXN4NjI5IHJlc2NhbGUgLUluZiAgTmFOICAgIC0+ICBOYU4KK3Jlc3g2MzAgcmVzY2FsZSAtMTAwMCBOYU4gICAgLT4gIE5hTgorcmVzeDYzMSByZXNjYWxlIC0xICAgIE5hTiAgICAtPiAgTmFOCityZXN4NjMyIHJlc2NhbGUgIDAgICAgTmFOICAgIC0+ICBOYU4KK3Jlc3g2MzMgcmVzY2FsZSAgMSAgIC1OYU4gICAgLT4gLU5hTgorcmVzeDYzNCByZXNjYWxlICAxMDAwIE5hTiAgICAtPiAgTmFOCityZXN4NjM1IHJlc2NhbGUgIEluZiAgTmFOICAgIC0+ICBOYU4KK3Jlc3g2MzYgcmVzY2FsZSAgTmFOIC0wICAgICAgLT4gIE5hTgorcmVzeDYzNyByZXNjYWxlIC0wICAgIE5hTiAgICAtPiAgTmFOCisKK3Jlc3g2NDEgcmVzY2FsZSAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NDIgcmVzY2FsZSAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NDMgcmVzY2FsZSAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NDQgcmVzY2FsZSAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NDUgcmVzY2FsZSAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NDYgcmVzY2FsZSAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NDcgcmVzY2FsZSAtc05hTiAgTmFOICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NDggcmVzY2FsZSAgc05hTiAtc05hTiAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NDkgcmVzY2FsZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NTAgcmVzY2FsZSAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NTEgcmVzY2FsZSAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NTIgcmVzY2FsZSAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NTMgcmVzY2FsZSAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NTQgcmVzY2FsZSAgMSAgIC1zTmFOICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NTUgcmVzY2FsZSAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NTYgcmVzY2FsZSAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NTcgcmVzY2FsZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NTggcmVzY2FsZSAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NTkgcmVzY2FsZSAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworcmVzeDY2MSByZXNjYWxlICBOYU45IC1JbmYgICAtPiAgTmFOOQorcmVzeDY2MiByZXNjYWxlICBOYU44MSA5MTkgICAtPiAgTmFOODEKK3Jlc3g2NjMgcmVzY2FsZSAgTmFONzIgSW5mICAgLT4gIE5hTjcyCityZXN4NjY0IHJlc2NhbGUgLU5hTjY2IE5hTjUgIC0+IC1OYU42NgorcmVzeDY2NSByZXNjYWxlIC1JbmYgICBOYU40ICAtPiAgTmFONAorcmVzeDY2NiByZXNjYWxlIC05MTkgICBOYU4zMiAtPiAgTmFOMzIKK3Jlc3g2NjcgcmVzY2FsZSAgSW5mICAgTmFOMiAgLT4gIE5hTjIKKworcmVzeDY3MSByZXNjYWxlICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NzIgcmVzY2FsZSAtc05hTjk4IC0xMSAgICAgLT4gLU5hTjk4IEludmFsaWRfb3BlcmF0aW9uCityZXN4NjczIHJlc2NhbGUgIHNOYU45NyAgTmFOICAgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDY3NCByZXNjYWxlICBzTmFOMTYgc05hTjk0ICAtPiAgTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NzUgcmVzY2FsZSAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCityZXN4Njc2IHJlc2NhbGUgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDY3NyByZXNjYWxlICAwODggICAtc05hTjkxICAtPiAtTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NzggcmVzY2FsZSAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCityZXN4Njc5IHJlc2NhbGUgIE5hTiAgICBzTmFOODcgIC0+ICBOYU44NyBJbnZhbGlkX29wZXJhdGlvbgorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3cKK3ByZWNpc2lvbjogNAorbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3Jlc3g3MTAgcmVzY2FsZSAgMS4wMEUtOTk5ICAgIC05OTkgIC0+ICAgMUUtOTk5ICAgIFJvdW5kZWQKK3Jlc3g3MTEgcmVzY2FsZSAgMC4xRS05OTkgICAgLTEwMDAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbAorcmVzeDcxMiByZXNjYWxlICAwLjEwRS05OTkgICAtMTAwMCAgLT4gICAxRS0xMDAwICAgU3Vibm9ybWFsIFJvdW5kZWQKK3Jlc3g3MTMgcmVzY2FsZSAgMC4xMDBFLTk5OSAgLTEwMDAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbCBSb3VuZGVkCityZXN4NzE0IHJlc2NhbGUgIDAuMDFFLTk5OSAgIC0xMDAxICAtPiAgIDFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCityZXN4NzE1IHJlc2NhbGUgIDAuOTk5RS05OTkgICAtOTk5ICAtPiAgIDFFLTk5OSAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g3MTYgcmVzY2FsZSAgMC4wOTlFLTk5OSAgLTEwMDAgIC0+ICAgMUUtMTAwMCAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwKKworcmVzeDcxNyByZXNjYWxlICAwLjAwOUUtOTk5ICAtMTAwMSAgLT4gICAxRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorcmVzeDcxOCByZXNjYWxlICAwLjAwMUUtOTk5ICAtMTAwMSAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkCityZXN4NzE5IHJlc2NhbGUgIDAuMDAwOUUtOTk5IC0xMDAxICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g3MjAgcmVzY2FsZSAgMC4wMDAxRS05OTkgLTEwMDEgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZAorCityZXN4NzMwIHJlc2NhbGUgLTEuMDBFLTk5OSAgIC05OTkgIC0+ICAtMUUtOTk5ICAgICBSb3VuZGVkCityZXN4NzMxIHJlc2NhbGUgLTAuMUUtOTk5ICAgIC05OTkgIC0+ICAtMEUtOTk5ICAgICBSb3VuZGVkIEluZXhhY3QKK3Jlc3g3MzIgcmVzY2FsZSAtMC4xMEUtOTk5ICAgLTk5OSAgLT4gIC0wRS05OTkgICAgIFJvdW5kZWQgSW5leGFjdAorcmVzeDczMyByZXNjYWxlIC0wLjEwMEUtOTk5ICAtOTk5ICAtPiAgLTBFLTk5OSAgICAgUm91bmRlZCBJbmV4YWN0CityZXN4NzM0IHJlc2NhbGUgLTAuMDFFLTk5OSAgIC05OTkgIC0+ICAtMEUtOTk5ICAgICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCityZXN4NzM1IHJlc2NhbGUgLTAuOTk5RS05OTkgIC05OTkgIC0+ICAtMUUtOTk5ICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g3MzYgcmVzY2FsZSAtMC4wOTlFLTk5OSAgLTk5OSAgLT4gIC0wRS05OTkgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDczNyByZXNjYWxlIC0wLjAwOUUtOTk5ICAtOTk5ICAtPiAgLTBFLTk5OSAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NzM4IHJlc2NhbGUgLTAuMDAxRS05OTkgIC05OTkgIC0+ICAtMEUtOTk5ICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g3MzkgcmVzY2FsZSAtMC4wMDAxRS05OTkgLTk5OSAgLT4gIC0wRS05OTkgICAgIEluZXhhY3QgUm91bmRlZAorCityZXN4NzQwIHJlc2NhbGUgLTEuMDBFLTk5OSAgIC0xMDAwIC0+ICAtMS4wRS05OTkgICBSb3VuZGVkCityZXN4NzQxIHJlc2NhbGUgLTAuMUUtOTk5ICAgIC0xMDAwIC0+ICAtMUUtMTAwMCAgICBTdWJub3JtYWwKK3Jlc3g3NDIgcmVzY2FsZSAtMC4xMEUtOTk5ICAgLTEwMDAgLT4gIC0xRS0xMDAwICAgIFN1Ym5vcm1hbCBSb3VuZGVkCityZXN4NzQzIHJlc2NhbGUgLTAuMTAwRS05OTkgIC0xMDAwIC0+ICAtMUUtMTAwMCAgICBTdWJub3JtYWwgUm91bmRlZAorcmVzeDc0NCByZXNjYWxlIC0wLjAxRS05OTkgICAtMTAwMCAtPiAgLTBFLTEwMDAgICAgSW5leGFjdCBSb3VuZGVkCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorcmVzeDc0NSByZXNjYWxlIC0wLjk5OUUtOTk5ICAtMTAwMCAtPiAgLTEuMEUtOTk5ICAgSW5leGFjdCBSb3VuZGVkCityZXN4NzQ2IHJlc2NhbGUgLTAuMDk5RS05OTkgIC0xMDAwIC0+ICAtMUUtMTAwMCAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCityZXN4NzQ3IHJlc2NhbGUgLTAuMDA5RS05OTkgIC0xMDAwIC0+ICAtMEUtMTAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g3NDggcmVzY2FsZSAtMC4wMDFFLTk5OSAgLTEwMDAgLT4gIC0wRS0xMDAwICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDc0OSByZXNjYWxlIC0wLjAwMDFFLTk5OSAtMTAwMCAtPiAgLTBFLTEwMDAgICAgSW5leGFjdCBSb3VuZGVkCisKK3Jlc3g3NTAgcmVzY2FsZSAtMS4wMEUtOTk5ICAgLTEwMDEgLT4gIC0xLjAwRS05OTkKK3Jlc3g3NTEgcmVzY2FsZSAtMC4xRS05OTkgICAgLTEwMDEgLT4gIC0xLjBFLTEwMDAgIFN1Ym5vcm1hbAorcmVzeDc1MiByZXNjYWxlIC0wLjEwRS05OTkgICAtMTAwMSAtPiAgLTEuMEUtMTAwMCAgU3Vibm9ybWFsCityZXN4NzUzIHJlc2NhbGUgLTAuMTAwRS05OTkgIC0xMDAxIC0+ICAtMS4wRS0xMDAwICBTdWJub3JtYWwgUm91bmRlZAorcmVzeDc1NCByZXNjYWxlIC0wLjAxRS05OTkgICAtMTAwMSAtPiAgLTFFLTEwMDEgICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorcmVzeDc1NSByZXNjYWxlIC0wLjk5OUUtOTk5ICAtMTAwMSAtPiAgLTEuMDBFLTk5OSAgSW5leGFjdCBSb3VuZGVkCityZXN4NzU2IHJlc2NhbGUgLTAuMDk5RS05OTkgIC0xMDAxIC0+ICAtMS4wRS0xMDAwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCityZXN4NzU3IHJlc2NhbGUgLTAuMDA5RS05OTkgIC0xMDAxIC0+ICAtMUUtMTAwMSAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCityZXN4NzU4IHJlc2NhbGUgLTAuMDAxRS05OTkgIC0xMDAxIC0+ICAtMEUtMTAwMSAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g3NTkgcmVzY2FsZSAtMC4wMDAxRS05OTkgLTEwMDEgLT4gIC0wRS0xMDAxICAgIEluZXhhY3QgUm91bmRlZAorCityZXN4NzYwIHJlc2NhbGUgLTEuMDBFLTk5OSAgIC0xMDAyIC0+ICAtMS4wMDBFLTk5OQorcmVzeDc2MSByZXNjYWxlIC0wLjFFLTk5OSAgICAtMTAwMiAtPiAgLTEuMDBFLTEwMDAgIFN1Ym5vcm1hbAorcmVzeDc2MiByZXNjYWxlIC0wLjEwRS05OTkgICAtMTAwMiAtPiAgLTEuMDBFLTEwMDAgIFN1Ym5vcm1hbAorcmVzeDc2MyByZXNjYWxlIC0wLjEwMEUtOTk5ICAtMTAwMiAtPiAgLTEuMDBFLTEwMDAgIFN1Ym5vcm1hbAorcmVzeDc2NCByZXNjYWxlIC0wLjAxRS05OTkgICAtMTAwMiAtPiAgLTEuMEUtMTAwMSAgIFN1Ym5vcm1hbAorcmVzeDc2NSByZXNjYWxlIC0wLjk5OUUtOTk5ICAtMTAwMiAtPiAgLTkuOTlFLTEwMDAgIFN1Ym5vcm1hbAorcmVzeDc2NiByZXNjYWxlIC0wLjA5OUUtOTk5ICAtMTAwMiAtPiAgLTkuOUUtMTAwMSAgIFN1Ym5vcm1hbAorcmVzeDc2NyByZXNjYWxlIC0wLjAwOUUtOTk5ICAtMTAwMiAtPiAgLTlFLTEwMDIgICAgIFN1Ym5vcm1hbAorcmVzeDc2OCByZXNjYWxlIC0wLjAwMUUtOTk5ICAtMTAwMiAtPiAgLTFFLTEwMDIgICAgIFN1Ym5vcm1hbAorcmVzeDc2OSByZXNjYWxlIC0wLjAwMDFFLTk5OSAtMTAwMiAtPiAgLTBFLTEwMDIgICAgIEluZXhhY3QgUm91bmRlZAorCistLSByaHMgbXVzdCBiZSBubyBsZXNzIHRoYW4gRXRpbnkKK3Jlc3g3NzAgcmVzY2FsZSAtMS4wMEUtOTk5ICAgLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDc3MSByZXNjYWxlIC0wLjFFLTk5OSAgICAtMTAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4NzcyIHJlc2NhbGUgLTAuMTBFLTk5OSAgIC0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g3NzMgcmVzY2FsZSAtMC4xMDBFLTk5OSAgLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDc3NCByZXNjYWxlIC0wLjAxRS05OTkgICAtMTAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4Nzc1IHJlc2NhbGUgLTAuOTk5RS05OTkgIC0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g3NzYgcmVzY2FsZSAtMC4wOTlFLTk5OSAgLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDc3NyByZXNjYWxlIC0wLjAwOUUtOTk5ICAtMTAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4Nzc4IHJlc2NhbGUgLTAuMDAxRS05OTkgIC0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g3NzkgcmVzY2FsZSAtMC4wMDAxRS05OTkgLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitwcmVjaXNpb246ICAgOQorbWF4RXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKKworLS0gZ2V0SW50IHdvcnJpZXMKK3Jlc3g4MDEgcmVzY2FsZSAgIDAgICAxMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgwMiByZXNjYWxlICAgMCAgLTEwMDAwMDAwMDAgLT4gMEUtMTAwMDAwMDAwMAorcmVzeDgwMyByZXNjYWxlICAgMCAgIDIwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODA0IHJlc2NhbGUgICAwICAtMjAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MDUgcmVzY2FsZSAgIDAgICAzMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgwNiByZXNjYWxlICAgMCAgLTMwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODA3IHJlc2NhbGUgICAwICAgNDAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MDggcmVzY2FsZSAgIDAgIC00MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgwOSByZXNjYWxlICAgMCAgIDUwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODEwIHJlc2NhbGUgICAwICAtNTAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MTEgcmVzY2FsZSAgIDAgICA2MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgxMiByZXNjYWxlICAgMCAgLTYwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODEzIHJlc2NhbGUgICAwICAgNzAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MTQgcmVzY2FsZSAgIDAgIC03MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgxNSByZXNjYWxlICAgMCAgIDgwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODE2IHJlc2NhbGUgICAwICAtODAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MTcgcmVzY2FsZSAgIDAgICA5MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgxOCByZXNjYWxlICAgMCAgLTkwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODE5IHJlc2NhbGUgICAwICAgOTk5OTk5OTk5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MjAgcmVzY2FsZSAgIDAgIC05OTk5OTk5OTk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgyMSByZXNjYWxlICAgMCAgIDEwMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgyMiByZXNjYWxlICAgMCAgLTEwMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCityZXN4ODMxIHJlc2NhbGUgICAxICAgMEUtMSAgICAgICAtPiAxCityZXN4ODMyIHJlc2NhbGUgICAxICAgMEUtMiAgICAgICAtPiAxCityZXN4ODMzIHJlc2NhbGUgICAxICAgMEUtMyAgICAgICAtPiAxCityZXN4ODM0IHJlc2NhbGUgICAxICAgMEUtNCAgICAgICAtPiAxCityZXN4ODM1IHJlc2NhbGUgICAxICAgMEUtMTAwICAgICAtPiAxCityZXN4ODM2IHJlc2NhbGUgICAxICAgMEUtMTAwMDAwICAtPiAxCityZXN4ODM3IHJlc2NhbGUgICAxICAgMEUrMTAwICAgICAtPiAxCityZXN4ODM4IHJlc2NhbGUgICAxICAgMEUrMTAwMDAwICAtPiAxCisKK3Jlc3g4NDEgcmVzY2FsZSAgIDAgICA1RS0xMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDg0MiByZXNjYWxlICAgMCAgIDVFLTEwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODQzIHJlc2NhbGUgICAwICAgIDk5OTk5OTk5OSAtPiAwRSs5OTk5OTk5OTkKK3Jlc3g4NDQgcmVzY2FsZSAgIDAgICAxMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDg0NSByZXNjYWxlICAgMCAgIC05OTk5OTk5OTkgLT4gMEUtOTk5OTk5OTk5CityZXN4ODQ2IHJlc2NhbGUgICAwICAtMTAwMDAwMDAwMCAtPiAwRS0xMDAwMDAwMDAwCityZXN4ODQ3IHJlc2NhbGUgICAwICAtMTAwMDAwMDAwMSAtPiAwRS0xMDAwMDAwMDAxCityZXN4ODQ4IHJlc2NhbGUgICAwICAtMTAwMDAwMDAwMiAtPiAwRS0xMDAwMDAwMDAyCityZXN4ODQ5IHJlc2NhbGUgICAwICAtMTAwMDAwMDAwMyAtPiAwRS0xMDAwMDAwMDAzCityZXN4ODUwIHJlc2NhbGUgICAwICAtMTAwMDAwMDAwNCAtPiAwRS0xMDAwMDAwMDA0CityZXN4ODUxIHJlc2NhbGUgICAwICAtMTAwMDAwMDAwNSAtPiAwRS0xMDAwMDAwMDA1CityZXN4ODUyIHJlc2NhbGUgICAwICAtMTAwMDAwMDAwNiAtPiAwRS0xMDAwMDAwMDA2CityZXN4ODUzIHJlc2NhbGUgICAwICAtMTAwMDAwMDAwNyAtPiAwRS0xMDAwMDAwMDA3CityZXN4ODU0IHJlc2NhbGUgICAwICAtMTAwMDAwMDAwOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcmVzeDg2MSByZXNjYWxlICAgMSAgKzIxNDc0ODM2NDkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODYyIHJlc2NhbGUgICAxICArMjE0NzQ4MzY0OCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4NjMgcmVzY2FsZSAgIDEgICsyMTQ3NDgzNjQ3IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDg2NCByZXNjYWxlICAgMSAgLTIxNDc0ODM2NDcgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODY1IHJlc2NhbGUgICAxICAtMjE0NzQ4MzY0OCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4NjYgcmVzY2FsZSAgIDEgIC0yMTQ3NDgzNjQ5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOdWxsIHRlc3RzCityZXM5MDAgcmVzY2FsZSAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlczkwMSByZXNjYWxlICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yb3RhdGUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcm90YXRlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhZGU3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcm90YXRlLmRlY1Rlc3QKQEAgLTAsMCArMSwyNDcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gcm90YXRlLmRlY1Rlc3QgLS0gcm90YXRlIGNvZWZmaWNpZW50IGxlZnQgb3IgcmlnaHQgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5CittaW5FeHBvbmVudDogLTk5OQorCistLSBTYW5pdHkgY2hlY2sKK3JvdHgwMDEgcm90YXRlICAgICAgICAgIDAgICAgMCAgLT4gIDAKK3JvdHgwMDIgcm90YXRlICAgICAgICAgIDAgICAgMiAgLT4gIDAKK3JvdHgwMDMgcm90YXRlICAgICAgICAgIDEgICAgMiAgLT4gIDEwMAorcm90eDAwNCByb3RhdGUgICAgICAgICAzNCAgICA4ICAtPiAgNDAwMDAwMDAzCityb3R4MDA1IHJvdGF0ZSAgICAgICAgICAxICAgIDkgIC0+ICAxCityb3R4MDA2IHJvdGF0ZSAgICAgICAgICAxICAgLTEgIC0+ICAxMDAwMDAwMDAKK3JvdHgwMDcgcm90YXRlICAxMjM0NTY3ODkgICAtMSAgLT4gIDkxMjM0NTY3OAorcm90eDAwOCByb3RhdGUgIDEyMzQ1Njc4OSAgIC04ICAtPiAgMjM0NTY3ODkxCityb3R4MDA5IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgLTkgIC0+ICAxMjM0NTY3ODkKK3JvdHgwMTAgcm90YXRlICAgICAgICAgIDAgICAtMiAgLT4gIDAKKworLS0gcmhzIG11c3QgYmUgYW4gaW50ZWdlcgorcm90eDAxMSByb3RhdGUgICAgICAgIDEgICAgMS41ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDAxMiByb3RhdGUgICAgICAgIDEgICAgMS4wICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDAxMyByb3RhdGUgICAgICAgIDEgICAgMC4xICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDAxNCByb3RhdGUgICAgICAgIDEgICAgMC4wICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDAxNSByb3RhdGUgICAgICAgIDEgICAgMUUrMSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDAxNiByb3RhdGUgICAgICAgIDEgICAgMUUrOTkgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDAxNyByb3RhdGUgICAgICAgIDEgICAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDAxOCByb3RhdGUgICAgICAgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYW5kIHxyaHN8IDw9IHByZWNpc2lvbgorcm90eDAyMCByb3RhdGUgICAgICAgIDEgICAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDAyMSByb3RhdGUgICAgICAgIDEgICAgLTEwICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDAyMiByb3RhdGUgICAgICAgIDEgICAgIDEwICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDAyMyByb3RhdGUgICAgICAgIDEgICAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBmdWxsIHBhdHRlcm4KK3JvdHgwMzAgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgLTkgICAtPiAxMjM0NTY3ODkKK3JvdHgwMzEgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgLTggICAtPiAyMzQ1Njc4OTEKK3JvdHgwMzIgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgLTcgICAtPiAzNDU2Nzg5MTIKK3JvdHgwMzMgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgLTYgICAtPiA0NTY3ODkxMjMKK3JvdHgwMzQgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgLTUgICAtPiA1Njc4OTEyMzQKK3JvdHgwMzUgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgLTQgICAtPiA2Nzg5MTIzNDUKK3JvdHgwMzYgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgLTMgICAtPiA3ODkxMjM0NTYKK3JvdHgwMzcgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgLTIgICAtPiA4OTEyMzQ1NjcKK3JvdHgwMzggcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgLTEgICAtPiA5MTIzNDU2NzgKK3JvdHgwMzkgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgLTAgICAtPiAxMjM0NTY3ODkKK3JvdHgwNDAgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgKzAgICAtPiAxMjM0NTY3ODkKK3JvdHgwNDEgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgKzEgICAtPiAyMzQ1Njc4OTEKK3JvdHgwNDIgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgKzIgICAtPiAzNDU2Nzg5MTIKK3JvdHgwNDMgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgKzMgICAtPiA0NTY3ODkxMjMKK3JvdHgwNDQgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgKzQgICAtPiA1Njc4OTEyMzQKK3JvdHgwNDUgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgKzUgICAtPiA2Nzg5MTIzNDUKK3JvdHgwNDYgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgKzYgICAtPiA3ODkxMjM0NTYKK3JvdHgwNDcgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgKzcgICAtPiA4OTEyMzQ1NjcKK3JvdHgwNDggcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgKzggICAtPiA5MTIzNDU2NzgKK3JvdHgwNDkgcm90YXRlICAxMjM0NTY3ODkgICAgICAgICAgKzkgICAtPiAxMjM0NTY3ODkKKworLS0gemVyb3MKK3JvdHgwNjAgcm90YXRlICAwRS0xMCAgICAgICAgICAgICAgKzkgICAtPiAgIDBFLTEwCityb3R4MDYxIHJvdGF0ZSAgMEUtMTAgICAgICAgICAgICAgIC05ICAgLT4gICAwRS0xMAorcm90eDA2MiByb3RhdGUgIDAuMDAwICAgICAgICAgICAgICArOSAgIC0+ICAgMC4wMDAKK3JvdHgwNjMgcm90YXRlICAwLjAwMCAgICAgICAgICAgICAgLTkgICAtPiAgIDAuMDAwCityb3R4MDY0IHJvdGF0ZSAgMEUrMTAgICAgICAgICAgICAgICs5ICAgLT4gICAwRSsxMAorcm90eDA2NSByb3RhdGUgIDBFKzEwICAgICAgICAgICAgICAtOSAgIC0+ICAgMEUrMTAKK3JvdHgwNjYgcm90YXRlIC0wRS0xMCAgICAgICAgICAgICAgKzkgICAtPiAgLTBFLTEwCityb3R4MDY3IHJvdGF0ZSAtMEUtMTAgICAgICAgICAgICAgIC05ICAgLT4gIC0wRS0xMAorcm90eDA2OCByb3RhdGUgLTAuMDAwICAgICAgICAgICAgICArOSAgIC0+ICAtMC4wMDAKK3JvdHgwNjkgcm90YXRlIC0wLjAwMCAgICAgICAgICAgICAgLTkgICAtPiAgLTAuMDAwCityb3R4MDcwIHJvdGF0ZSAtMEUrMTAgICAgICAgICAgICAgICs5ICAgLT4gIC0wRSsxMAorcm90eDA3MSByb3RhdGUgLTBFKzEwICAgICAgICAgICAgICAtOSAgIC0+ICAtMEUrMTAKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK3JvdHgxNDEgcm90YXRlICA5Ljk5OTk5OTk5RSs5OTkgICAgIC0xICAtPiA5Ljk5OTk5OTk5RSs5OTkKK3JvdHgxNDIgcm90YXRlICA5Ljk5OTk5OTk5RSs5OTkgICAgIC04ICAtPiA5Ljk5OTk5OTk5RSs5OTkKK3JvdHgxNDMgcm90YXRlICA5Ljk5OTk5OTk5RSs5OTkgICAgICAxICAtPiA5Ljk5OTk5OTk5RSs5OTkKK3JvdHgxNDQgcm90YXRlICA5Ljk5OTk5OTk5RSs5OTkgICAgICA4ICAtPiA5Ljk5OTk5OTk5RSs5OTkKK3JvdHgxNDUgcm90YXRlICAxRS05OTkgICAgICAgICAgICAgIC0xICAtPiAxLjAwMDAwMDAwRS05OTEKK3JvdHgxNDYgcm90YXRlICAxRS05OTkgICAgICAgICAgICAgIC04ICAtPiAxLjBFLTk5OAorcm90eDE0NyByb3RhdGUgIDFFLTk5OSAgICAgICAgICAgICAgIDEgIC0+IDEuMEUtOTk4Cityb3R4MTQ4IHJvdGF0ZSAgMUUtOTk5ICAgICAgICAgICAgICAgOCAgLT4gMS4wMDAwMDAwMEUtOTkxCityb3R4MTUxIHJvdGF0ZSAgMS4wMDAwMDAwMEUtOTk5ICAgICAtMSAgLT4gMS4wMDAwMDAwRS0xMDAwCityb3R4MTUyIHJvdGF0ZSAgMS4wMDAwMDAwMEUtOTk5ICAgICAtOCAgLT4gMUUtMTAwNworcm90eDE1MyByb3RhdGUgIDEuMDAwMDAwMDBFLTk5OSAgICAgIDEgIC0+IDFFLTEwMDcKK3JvdHgxNTQgcm90YXRlICAxLjAwMDAwMDAwRS05OTkgICAgICA4ICAtPiAxLjAwMDAwMDBFLTEwMDAKK3JvdHgxNTUgcm90YXRlICA5LjAwMDAwMDAwRS05OTkgICAgIC0xICAtPiA5LjAwMDAwMDBFLTEwMDAKK3JvdHgxNTYgcm90YXRlICA5LjAwMDAwMDAwRS05OTkgICAgIC04ICAtPiA5RS0xMDA3Cityb3R4MTU3IHJvdGF0ZSAgOS4wMDAwMDAwMEUtOTk5ICAgICAgMSAgLT4gOUUtMTAwNworcm90eDE1OCByb3RhdGUgIDkuMDAwMDAwMDBFLTk5OSAgICAgIDggIC0+IDkuMDAwMDAwMEUtMTAwMAorcm90eDE2MCByb3RhdGUgIDFFLTEwMDcgICAgICAgICAgICAgLTEgIC0+IDEuMDAwMDAwMDBFLTk5OQorcm90eDE2MSByb3RhdGUgIDFFLTEwMDcgICAgICAgICAgICAgLTggIC0+IDEuMEUtMTAwNgorcm90eDE2MiByb3RhdGUgIDFFLTEwMDcgICAgICAgICAgICAgIDEgIC0+IDEuMEUtMTAwNgorcm90eDE2MyByb3RhdGUgIDFFLTEwMDcgICAgICAgICAgICAgIDggIC0+IDEuMDAwMDAwMDBFLTk5OQorLS0gIG5lZ2F0aXZlcworcm90eDE3MSByb3RhdGUgLTkuOTk5OTk5OTlFKzk5OSAgICAgLTEgIC0+IC05Ljk5OTk5OTk5RSs5OTkKK3JvdHgxNzIgcm90YXRlIC05Ljk5OTk5OTk5RSs5OTkgICAgIC04ICAtPiAtOS45OTk5OTk5OUUrOTk5Cityb3R4MTczIHJvdGF0ZSAtOS45OTk5OTk5OUUrOTk5ICAgICAgMSAgLT4gLTkuOTk5OTk5OTlFKzk5OQorcm90eDE3NCByb3RhdGUgLTkuOTk5OTk5OTlFKzk5OSAgICAgIDggIC0+IC05Ljk5OTk5OTk5RSs5OTkKK3JvdHgxNzUgcm90YXRlIC0xRS05OTkgICAgICAgICAgICAgIC0xICAtPiAtMS4wMDAwMDAwMEUtOTkxCityb3R4MTc2IHJvdGF0ZSAtMUUtOTk5ICAgICAgICAgICAgICAtOCAgLT4gLTEuMEUtOTk4Cityb3R4MTc3IHJvdGF0ZSAtMUUtOTk5ICAgICAgICAgICAgICAgMSAgLT4gLTEuMEUtOTk4Cityb3R4MTc4IHJvdGF0ZSAtMUUtOTk5ICAgICAgICAgICAgICAgOCAgLT4gLTEuMDAwMDAwMDBFLTk5MQorcm90eDE4MSByb3RhdGUgLTEuMDAwMDAwMDBFLTk5OSAgICAgLTEgIC0+IC0xLjAwMDAwMDBFLTEwMDAKK3JvdHgxODIgcm90YXRlIC0xLjAwMDAwMDAwRS05OTkgICAgIC04ICAtPiAtMUUtMTAwNworcm90eDE4MyByb3RhdGUgLTEuMDAwMDAwMDBFLTk5OSAgICAgIDEgIC0+IC0xRS0xMDA3Cityb3R4MTg0IHJvdGF0ZSAtMS4wMDAwMDAwMEUtOTk5ICAgICAgOCAgLT4gLTEuMDAwMDAwMEUtMTAwMAorcm90eDE4NSByb3RhdGUgLTkuMDAwMDAwMDBFLTk5OSAgICAgLTEgIC0+IC05LjAwMDAwMDBFLTEwMDAKK3JvdHgxODYgcm90YXRlIC05LjAwMDAwMDAwRS05OTkgICAgIC04ICAtPiAtOUUtMTAwNworcm90eDE4NyByb3RhdGUgLTkuMDAwMDAwMDBFLTk5OSAgICAgIDEgIC0+IC05RS0xMDA3Cityb3R4MTg4IHJvdGF0ZSAtOS4wMDAwMDAwMEUtOTk5ICAgICAgOCAgLT4gLTkuMDAwMDAwMEUtMTAwMAorcm90eDE5MCByb3RhdGUgLTFFLTEwMDcgICAgICAgICAgICAgLTEgIC0+IC0xLjAwMDAwMDAwRS05OTkKK3JvdHgxOTEgcm90YXRlIC0xRS0xMDA3ICAgICAgICAgICAgIC04ICAtPiAtMS4wRS0xMDA2Cityb3R4MTkyIHJvdGF0ZSAtMUUtMTAwNyAgICAgICAgICAgICAgMSAgLT4gLTEuMEUtMTAwNgorcm90eDE5MyByb3RhdGUgLTFFLTEwMDcgICAgICAgICAgICAgIDggIC0+IC0xLjAwMDAwMDAwRS05OTkKKworLS0gbW9yZSBuZWdhdGl2ZXMgKG9mIHNhbml0aWVzKQorcm90eDIwMSByb3RhdGUgICAgICAgICAtMCAgICAwICAtPiAgLTAKK3JvdHgyMDIgcm90YXRlICAgICAgICAgLTAgICAgMiAgLT4gIC0wCityb3R4MjAzIHJvdGF0ZSAgICAgICAgIC0xICAgIDIgIC0+ICAtMTAwCityb3R4MjA0IHJvdGF0ZSAgICAgICAgIC0xICAgIDggIC0+ICAtMTAwMDAwMDAwCityb3R4MjA1IHJvdGF0ZSAgICAgICAgIC0xICAgIDkgIC0+ICAtMQorcm90eDIwNiByb3RhdGUgICAgICAgICAtMSAgIC0xICAtPiAgLTEwMDAwMDAwMAorcm90eDIwNyByb3RhdGUgLTEyMzQ1Njc4OSAgIC0xICAtPiAgLTkxMjM0NTY3OAorcm90eDIwOCByb3RhdGUgLTEyMzQ1Njc4OSAgIC04ICAtPiAgLTIzNDU2Nzg5MQorcm90eDIwOSByb3RhdGUgLTEyMzQ1Njc4OSAgIC05ICAtPiAgLTEyMzQ1Njc4OQorcm90eDIxMCByb3RhdGUgICAgICAgICAtMCAgIC0yICAtPiAgLTAKKworLS0gU3BlY2lhbHM7IE5hTnMgYXJlIGhhbmRsZWQgYXMgdXN1YWwKK3JvdHg3ODEgcm90YXRlIC1JbmYgIC04ICAgICAtPiAtSW5maW5pdHkKK3JvdHg3ODIgcm90YXRlIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK3JvdHg3ODMgcm90YXRlIC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK3JvdHg3ODQgcm90YXRlIC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK3JvdHg3ODUgcm90YXRlIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK3JvdHg3ODYgcm90YXRlIC1JbmYgICA4ICAgICAtPiAtSW5maW5pdHkKK3JvdHg3ODcgcm90YXRlIC0xMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg3ODggcm90YXRlIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg3ODkgcm90YXRlIC0xICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg3OTAgcm90YXRlIC0wICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg3OTEgcm90YXRlICAwICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg3OTIgcm90YXRlICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg3OTMgcm90YXRlICAxMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg3OTQgcm90YXRlICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcm90eDgwMCByb3RhdGUgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDgwMSByb3RhdGUgIEluZiAgLTggICAgIC0+IEluZmluaXR5Cityb3R4ODAyIHJvdGF0ZSAgSW5mICAtMSAgICAgLT4gSW5maW5pdHkKK3JvdHg4MDMgcm90YXRlICBJbmYgIC0wICAgICAtPiBJbmZpbml0eQorcm90eDgwNCByb3RhdGUgIEluZiAgIDAgICAgIC0+IEluZmluaXR5Cityb3R4ODA1IHJvdGF0ZSAgSW5mICAgMSAgICAgLT4gSW5maW5pdHkKK3JvdHg4MDYgcm90YXRlICBJbmYgICA4ICAgICAtPiBJbmZpbml0eQorcm90eDgwNyByb3RhdGUgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDgwOCByb3RhdGUgLTEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDgwOSByb3RhdGUgLUluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDgxMCByb3RhdGUgLTEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDgxMSByb3RhdGUgLTAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDgxMiByb3RhdGUgIDAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDgxMyByb3RhdGUgIDEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDgxNCByb3RhdGUgIDEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm90eDgxNSByb3RhdGUgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCityb3R4ODIxIHJvdGF0ZSAgTmFOIC1JbmYgICAgLT4gIE5hTgorcm90eDgyMiByb3RhdGUgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK3JvdHg4MjMgcm90YXRlICBOYU4gLTEgICAgICAtPiAgTmFOCityb3R4ODI0IHJvdGF0ZSAgTmFOIC0wICAgICAgLT4gIE5hTgorcm90eDgyNSByb3RhdGUgIE5hTiAgMCAgICAgIC0+ICBOYU4KK3JvdHg4MjYgcm90YXRlICBOYU4gIDEgICAgICAtPiAgTmFOCityb3R4ODI3IHJvdGF0ZSAgTmFOICAxMDAwICAgLT4gIE5hTgorcm90eDgyOCByb3RhdGUgIE5hTiAgSW5mICAgIC0+ICBOYU4KK3JvdHg4Mjkgcm90YXRlICBOYU4gIE5hTiAgICAtPiAgTmFOCityb3R4ODMwIHJvdGF0ZSAtSW5mICBOYU4gICAgLT4gIE5hTgorcm90eDgzMSByb3RhdGUgLTEwMDAgTmFOICAgIC0+ICBOYU4KK3JvdHg4MzIgcm90YXRlIC0xICAgIE5hTiAgICAtPiAgTmFOCityb3R4ODMzIHJvdGF0ZSAtMCAgICBOYU4gICAgLT4gIE5hTgorcm90eDgzNCByb3RhdGUgIDAgICAgTmFOICAgIC0+ICBOYU4KK3JvdHg4MzUgcm90YXRlICAxICAgIE5hTiAgICAtPiAgTmFOCityb3R4ODM2IHJvdGF0ZSAgMTAwMCBOYU4gICAgLT4gIE5hTgorcm90eDgzNyByb3RhdGUgIEluZiAgTmFOICAgIC0+ICBOYU4KKworCisKK3JvdHg4NDEgcm90YXRlICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg0MiByb3RhdGUgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODQzIHJvdGF0ZSAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NDQgcm90YXRlICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg0NSByb3RhdGUgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODQ2IHJvdGF0ZSAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NDcgcm90YXRlICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg0OCByb3RhdGUgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODQ5IHJvdGF0ZSAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NTAgcm90YXRlICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg1MSByb3RhdGUgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODUyIHJvdGF0ZSAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NTMgcm90YXRlIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg1NCByb3RhdGUgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODU1IHJvdGF0ZSAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NTYgcm90YXRlICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg1NyByb3RhdGUgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODU4IHJvdGF0ZSAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NTkgcm90YXRlICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCityb3R4ODYxIHJvdGF0ZSAgTmFOMSAgIC1JbmYgICAgLT4gIE5hTjEKK3JvdHg4NjIgcm90YXRlICtOYU4yICAgLTEwMDAgICAtPiAgTmFOMgorcm90eDg2MyByb3RhdGUgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCityb3R4ODY0IHJvdGF0ZSAgTmFONCAgICBJbmYgICAgLT4gIE5hTjQKK3JvdHg4NjUgcm90YXRlICBOYU41ICAgK05hTjYgICAtPiAgTmFONQorcm90eDg2NiByb3RhdGUgLUluZiAgICAgTmFONyAgIC0+ICBOYU43Cityb3R4ODY3IHJvdGF0ZSAtMTAwMCAgICBOYU44ICAgLT4gIE5hTjgKK3JvdHg4Njggcm90YXRlICAxMDAwICAgIE5hTjkgICAtPiAgTmFOOQorcm90eDg2OSByb3RhdGUgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorcm90eDg3MSByb3RhdGUgIHNOYU4xMSAgLUluZiAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NzIgcm90YXRlICBzTmFOMTIgIC0xMDAwICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODczIHJvdGF0ZSAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg3NCByb3RhdGUgIHNOYU4xNCAgIE5hTjE3IC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NzUgcm90YXRlICBzTmFOMTUgIHNOYU4xOCAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODc2IHJvdGF0ZSAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg3NyByb3RhdGUgLUluZiAgICArc05hTjIwIC0+ICBOYU4yMCAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4Nzggcm90YXRlIC0xMDAwICAgIHNOYU4yMSAtPiAgTmFOMjEgIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODc5IHJvdGF0ZSAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg4MCByb3RhdGUgIEluZiAgICAgc05hTjIzIC0+ICBOYU4yMyAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4ODEgcm90YXRlICtOYU4yNSAgK3NOYU4yNCAtPiAgTmFOMjQgIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODgyIHJvdGF0ZSAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2Cityb3R4ODgzIHJvdGF0ZSAtc05hTjI3ICBzTmFOMjkgLT4gLU5hTjI3ICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg4NCByb3RhdGUgIDEwMDAgICAgLU5hTjMwIC0+IC1OYU4zMAorcm90eDg4NSByb3RhdGUgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcGF5bG9hZCBkZWNhcGl0YXRlCitwcmVjaXNpb246IDUKK3JvdHg4ODYgcm90YXRlICAxMSAtc05hTjEyMzQ1Njc4OTAgLT4gLU5hTjY3ODkwICBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yb3VuZGluZy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yb3VuZGluZy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZjEzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JvdW5kaW5nLmRlY1Rlc3QKQEAgLTAsMCArMSwxMzAzIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHJvdW5kaW5nLmRlY1Rlc3QgLS0gZGVjaW1hbCByb3VuZGluZyBtb2RlcyB0ZXN0Y2FzZXMgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhlc2UgdGVzdHMgcmVxdWlyZSB0aGF0IGltcGxlbWVudGF0aW9ucyB0YWtlIGFjY291bnQgb2YgcmVzaWR1ZXMgaW4KKy0tIG9yZGVyIHRvIGdldCBjb3JyZWN0IHJlc3VsdHMgZm9yIHNvbWUgcm91bmRpbmcgbW9kZXMuICBSYXRoZXIgdGhhbgorLS0gc2luZ2xlIHJvdW5kaW5nIHRlc3RzIHdlIHRoZXJlZm9yZSBuZWVkIHRlc3RzIGZvciBtb3N0IG9wZXJhdG9ycy4KKy0tIFtXZSBkbyBhc3N1bWUgYWRkL21pbnVzL3BsdXMvc3VidHJhY3QgYXJlIGNvbW1vbiBwYXRocywgaG93ZXZlciwgYXMKKy0tIGlzIHJvdW5kaW5nIG9mIG5lZ2F0aXZlcyAoaWYgdGhlIGxhdHRlciB3b3JrcyBmb3IgYWRkaXRpb24sIGFzc3VtZSBpdAorLS0gd29ya3MgZm9yIHRoZSBvdGhlcnMsIHRvbykuXQorLS0KKy0tIFJvdW5kLWZvci1yZXJvdW5kICgwNVVQKSBpcyB0ZXN0ZWQgYXMgYSBzZXBhcmF0ZSBibG9jaywgbW9zdGx5IGZvcgorLS0gJ2hpc3RvcmljYWwnIHJlYXNvbnMuCistLQorLS0gVW5kZXJmbG93IFN1Ym5vcm1hbCBhbmQgb3ZlcmZsb3cgYmVoYXZpb3VycyBhcmUgdGVzdGVkIHVuZGVyIHRoZQorLS0gaW5kaXZpZHVhbCBvcGVyYXRvcnMuCisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgNSAgICAgICAgICAgLS0gZm9yIGVhc2llciB2aXN1YWwgaW5zcGVjdGlvbgorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKKworLS0gQWRkaXRpb24gb3BlcmF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JvdW5kaW5nOiBkb3duCisKK3JhZHgxMDAgIGFkZCAxMjM0NSAtMC4xICAgICAgIC0+IDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcmFkeDEwMSAgYWRkIDEyMzQ1IC0wLjAxICAgICAgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityYWR4MTAyICBhZGQgMTIzNDUgLTAuMDAxICAgICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMDMgIGFkZCAxMjM0NSAtMC4wMDAwMSAgIC0+IDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcmFkeDEwNCAgYWRkIDEyMzQ1IC0wLjAwMDAwMSAgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityYWR4MTA1ICBhZGQgMTIzNDUgLTAuMDAwMDAwMSAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMDYgIGFkZCAxMjM0NSAgMCAgICAgICAgIC0+IDEyMzQ1CityYWR4MTA3ICBhZGQgMTIzNDUgIDAuMDAwMDAwMSAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMDggIGFkZCAxMjM0NSAgMC4wMDAwMDEgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDEwOSAgYWRkIDEyMzQ1ICAwLjAwMDAxICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTEwICBhZGQgMTIzNDUgIDAuMDAwMSAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMTEgIGFkZCAxMjM0NSAgMC4wMDEgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDExMiAgYWRkIDEyMzQ1ICAwLjAxICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTEzICBhZGQgMTIzNDUgIDAuMSAgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKKworcmFkeDExNSAgYWRkIDEyMzQ2ICAwLjQ5OTk5ICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MTE2ICBhZGQgMTIzNDYgIDAuNSAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMTcgIGFkZCAxMjM0NiAgMC41MDAwMSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorCityYWR4MTIwICBhZGQgMTIzNDUgIDAuNCAgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMjEgIGFkZCAxMjM0NSAgMC40OSAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDEyMiAgYWRkIDEyMzQ1ICAwLjQ5OSAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTIzICBhZGQgMTIzNDUgIDAuNDk5OTkgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMjQgIGFkZCAxMjM0NSAgMC41ICAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDEyNSAgYWRkIDEyMzQ1ICAwLjUwMDAxICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTI2ICBhZGQgMTIzNDUgIDAuNTAwMSAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMjcgIGFkZCAxMjM0NSAgMC41MDEgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDEyOCAgYWRkIDEyMzQ1ICAwLjUxICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTI5ICBhZGQgMTIzNDUgIDAuNiAgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZG93bgorCityYWR4MTQwICBhZGQgMTIzNDUgLTAuMSAgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNDEgIGFkZCAxMjM0NSAtMC4wMSAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE0MiAgYWRkIDEyMzQ1IC0wLjAwMSAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTQzICBhZGQgMTIzNDUgLTAuMDAwMDEgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNDQgIGFkZCAxMjM0NSAtMC4wMDAwMDEgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE0NSAgYWRkIDEyMzQ1IC0wLjAwMDAwMDEgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTQ2ICBhZGQgMTIzNDUgIDAgICAgICAgICAtPiAxMjM0NQorcmFkeDE0NyAgYWRkIDEyMzQ1ICAwLjAwMDAwMDEgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTQ4ICBhZGQgMTIzNDUgIDAuMDAwMDAxICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNDkgIGFkZCAxMjM0NSAgMC4wMDAwMSAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE1MCAgYWRkIDEyMzQ1ICAwLjAwMDEgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTUxICBhZGQgMTIzNDUgIDAuMDAxICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNTIgIGFkZCAxMjM0NSAgMC4wMSAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE1MyAgYWRkIDEyMzQ1ICAwLjEgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JhZHgxNTUgIGFkZCAxMjM0NiAgMC40OTk5OSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDE1NiAgYWRkIDEyMzQ2ICAwLjUgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MTU3ICBhZGQgMTIzNDYgIDAuNTAwMDEgICAtPiAxMjM0NyBJbmV4YWN0IFJvdW5kZWQKKworcmFkeDE2MCAgYWRkIDEyMzQ1ICAwLjQgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTYxICBhZGQgMTIzNDUgIDAuNDkgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNjIgIGFkZCAxMjM0NSAgMC40OTkgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE2MyAgYWRkIDEyMzQ1ICAwLjQ5OTk5ICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTY0ICBhZGQgMTIzNDUgIDAuNSAgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNjUgIGFkZCAxMjM0NSAgMC41MDAwMSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDE2NiAgYWRkIDEyMzQ1ICAwLjUwMDEgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MTY3ICBhZGQgMTIzNDUgIDAuNTAxICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNjggIGFkZCAxMjM0NSAgMC41MSAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDE2OSAgYWRkIDEyMzQ1ICAwLjYgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KKworcmFkeDE3MCAgYWRkIDEyMzQ1IC0wLjEgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTcxICBhZGQgMTIzNDUgLTAuMDEgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNzIgIGFkZCAxMjM0NSAtMC4wMDEgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE3MyAgYWRkIDEyMzQ1IC0wLjAwMDAxICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTc0ICBhZGQgMTIzNDUgLTAuMDAwMDAxICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNzUgIGFkZCAxMjM0NSAtMC4wMDAwMDAxIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE3NiAgYWRkIDEyMzQ1ICAwICAgICAgICAgLT4gMTIzNDUKK3JhZHgxNzcgIGFkZCAxMjM0NSAgMC4wMDAwMDAxIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE3OCAgYWRkIDEyMzQ1ICAwLjAwMDAwMSAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTc5ICBhZGQgMTIzNDUgIDAuMDAwMDEgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxODAgIGFkZCAxMjM0NSAgMC4wMDAxICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE4MSAgYWRkIDEyMzQ1ICAwLjAwMSAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTgyICBhZGQgMTIzNDUgIDAuMDEgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxODMgIGFkZCAxMjM0NSAgMC4xICAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityYWR4MTg1ICBhZGQgMTIzNDYgIDAuNDk5OTkgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxODYgIGFkZCAxMjM0NiAgMC41ICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDE4NyAgYWRkIDEyMzQ2ICAwLjUwMDAxICAgLT4gMTIzNDcgSW5leGFjdCBSb3VuZGVkCisKK3JhZHgxOTAgIGFkZCAxMjM0NSAgMC40ICAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE5MSAgYWRkIDEyMzQ1ICAwLjQ5ICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTkyICBhZGQgMTIzNDUgIDAuNDk5ICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxOTMgIGFkZCAxMjM0NSAgMC40OTk5OSAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE5NCAgYWRkIDEyMzQ1ICAwLjUgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MTk1ICBhZGQgMTIzNDUgIDAuNTAwMDEgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxOTYgIGFkZCAxMjM0NSAgMC41MDAxICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDE5NyAgYWRkIDEyMzQ1ICAwLjUwMSAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MTk4ICBhZGQgMTIzNDUgIDAuNTEgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxOTkgIGFkZCAxMjM0NSAgMC42ICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorCityYWR4MjAwICBhZGQgMTIzNDUgLTAuMSAgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMDEgIGFkZCAxMjM0NSAtMC4wMSAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIwMiAgYWRkIDEyMzQ1IC0wLjAwMSAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjAzICBhZGQgMTIzNDUgLTAuMDAwMDEgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMDQgIGFkZCAxMjM0NSAtMC4wMDAwMDEgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIwNSAgYWRkIDEyMzQ1IC0wLjAwMDAwMDEgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjA2ICBhZGQgMTIzNDUgIDAgICAgICAgICAtPiAxMjM0NQorcmFkeDIwNyAgYWRkIDEyMzQ1ICAwLjAwMDAwMDEgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjA4ICBhZGQgMTIzNDUgIDAuMDAwMDAxICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMDkgIGFkZCAxMjM0NSAgMC4wMDAwMSAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIxMCAgYWRkIDEyMzQ1ICAwLjAwMDEgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjExICBhZGQgMTIzNDUgIDAuMDAxICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMTIgIGFkZCAxMjM0NSAgMC4wMSAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIxMyAgYWRkIDEyMzQ1ICAwLjEgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JhZHgyMTUgIGFkZCAxMjM0NiAgMC40OTk5OSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDIxNiAgYWRkIDEyMzQ2ICAwLjUgICAgICAgLT4gMTIzNDcgSW5leGFjdCBSb3VuZGVkCityYWR4MjE3ICBhZGQgMTIzNDYgIDAuNTAwMDEgICAtPiAxMjM0NyBJbmV4YWN0IFJvdW5kZWQKKworcmFkeDIyMCAgYWRkIDEyMzQ1ICAwLjQgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjIxICBhZGQgMTIzNDUgIDAuNDkgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMjIgIGFkZCAxMjM0NSAgMC40OTkgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIyMyAgYWRkIDEyMzQ1ICAwLjQ5OTk5ICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjI0ICBhZGQgMTIzNDUgIDAuNSAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMjUgIGFkZCAxMjM0NSAgMC41MDAwMSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDIyNiAgYWRkIDEyMzQ1ICAwLjUwMDEgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjI3ICBhZGQgMTIzNDUgIDAuNTAxICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMjggIGFkZCAxMjM0NSAgMC41MSAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDIyOSAgYWRkIDEyMzQ1ICAwLjYgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiB1cAorCityYWR4MjMwICBhZGQgMTIzNDUgLTAuMSAgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMzEgIGFkZCAxMjM0NSAtMC4wMSAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIzMiAgYWRkIDEyMzQ1IC0wLjAwMSAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjMzICBhZGQgMTIzNDUgLTAuMDAwMDEgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMzQgIGFkZCAxMjM0NSAtMC4wMDAwMDEgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIzNSAgYWRkIDEyMzQ1IC0wLjAwMDAwMDEgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjM2ICBhZGQgMTIzNDUgIDAgICAgICAgICAtPiAxMjM0NQorcmFkeDIzNyAgYWRkIDEyMzQ1ICAwLjAwMDAwMDEgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjM4ICBhZGQgMTIzNDUgIDAuMDAwMDAxICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMzkgIGFkZCAxMjM0NSAgMC4wMDAwMSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDI0MCAgYWRkIDEyMzQ1ICAwLjAwMDEgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjQxICBhZGQgMTIzNDUgIDAuMDAxICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyNDIgIGFkZCAxMjM0NSAgMC4wMSAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDI0MyAgYWRkIDEyMzQ1ICAwLjEgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCisKK3JhZHgyNDUgIGFkZCAxMjM0NiAgMC40OTk5OSAgIC0+IDEyMzQ3IEluZXhhY3QgUm91bmRlZAorcmFkeDI0NiAgYWRkIDEyMzQ2ICAwLjUgICAgICAgLT4gMTIzNDcgSW5leGFjdCBSb3VuZGVkCityYWR4MjQ3ICBhZGQgMTIzNDYgIDAuNTAwMDEgICAtPiAxMjM0NyBJbmV4YWN0IFJvdW5kZWQKKworcmFkeDI1MCAgYWRkIDEyMzQ1ICAwLjQgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjUxICBhZGQgMTIzNDUgIDAuNDkgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyNTIgIGFkZCAxMjM0NSAgMC40OTkgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDI1MyAgYWRkIDEyMzQ1ICAwLjQ5OTk5ICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjU0ICBhZGQgMTIzNDUgIDAuNSAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyNTUgIGFkZCAxMjM0NSAgMC41MDAwMSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDI1NiAgYWRkIDEyMzQ1ICAwLjUwMDEgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjU3ICBhZGQgMTIzNDUgIDAuNTAxICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyNTggIGFkZCAxMjM0NSAgMC41MSAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDI1OSAgYWRkIDEyMzQ1ICAwLjYgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBmbG9vcgorCityYWR4MzAwICBhZGQgMTIzNDUgLTAuMSAgICAgICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMDEgIGFkZCAxMjM0NSAtMC4wMSAgICAgIC0+IDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcmFkeDMwMiAgYWRkIDEyMzQ1IC0wLjAwMSAgICAgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityYWR4MzAzICBhZGQgMTIzNDUgLTAuMDAwMDEgICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMDQgIGFkZCAxMjM0NSAtMC4wMDAwMDEgIC0+IDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcmFkeDMwNSAgYWRkIDEyMzQ1IC0wLjAwMDAwMDEgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityYWR4MzA2ICBhZGQgMTIzNDUgIDAgICAgICAgICAtPiAxMjM0NQorcmFkeDMwNyAgYWRkIDEyMzQ1ICAwLjAwMDAwMDEgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzA4ICBhZGQgMTIzNDUgIDAuMDAwMDAxICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMDkgIGFkZCAxMjM0NSAgMC4wMDAwMSAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMxMCAgYWRkIDEyMzQ1ICAwLjAwMDEgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzExICBhZGQgMTIzNDUgIDAuMDAxICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMTIgIGFkZCAxMjM0NSAgMC4wMSAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMxMyAgYWRkIDEyMzQ1ICAwLjEgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JhZHgzMTUgIGFkZCAxMjM0NiAgMC40OTk5OSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDMxNiAgYWRkIDEyMzQ2ICAwLjUgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MzE3ICBhZGQgMTIzNDYgIDAuNTAwMDEgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKKworcmFkeDMyMCAgYWRkIDEyMzQ1ICAwLjQgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzIxICBhZGQgMTIzNDUgIDAuNDkgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMjIgIGFkZCAxMjM0NSAgMC40OTkgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMyMyAgYWRkIDEyMzQ1ICAwLjQ5OTk5ICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzI0ICBhZGQgMTIzNDUgIDAuNSAgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMjUgIGFkZCAxMjM0NSAgMC41MDAwMSAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMyNiAgYWRkIDEyMzQ1ICAwLjUwMDEgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzI3ICBhZGQgMTIzNDUgIDAuNTAxICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMjggIGFkZCAxMjM0NSAgMC41MSAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMyOSAgYWRkIDEyMzQ1ICAwLjYgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBjZWlsaW5nCisKK3JhZHgzMzAgIGFkZCAxMjM0NSAtMC4xICAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMzMSAgYWRkIDEyMzQ1IC0wLjAxICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzMyICBhZGQgMTIzNDUgLTAuMDAxICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMzMgIGFkZCAxMjM0NSAtMC4wMDAwMSAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMzNCAgYWRkIDEyMzQ1IC0wLjAwMDAwMSAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzM1ICBhZGQgMTIzNDUgLTAuMDAwMDAwMSAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMzYgIGFkZCAxMjM0NSAgMCAgICAgICAgIC0+IDEyMzQ1CityYWR4MzM3ICBhZGQgMTIzNDUgIDAuMDAwMDAwMSAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMzggIGFkZCAxMjM0NSAgMC4wMDAwMDEgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDMzOSAgYWRkIDEyMzQ1ICAwLjAwMDAxICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MzQwICBhZGQgMTIzNDUgIDAuMDAwMSAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzNDEgIGFkZCAxMjM0NSAgMC4wMDEgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDM0MiAgYWRkIDEyMzQ1ICAwLjAxICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MzQzICBhZGQgMTIzNDUgIDAuMSAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKKworcmFkeDM0NSAgYWRkIDEyMzQ2ICAwLjQ5OTk5ICAgLT4gMTIzNDcgSW5leGFjdCBSb3VuZGVkCityYWR4MzQ2ICBhZGQgMTIzNDYgIDAuNSAgICAgICAtPiAxMjM0NyBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzNDcgIGFkZCAxMjM0NiAgMC41MDAwMSAgIC0+IDEyMzQ3IEluZXhhY3QgUm91bmRlZAorCityYWR4MzUwICBhZGQgMTIzNDUgIDAuNCAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzNTEgIGFkZCAxMjM0NSAgMC40OSAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDM1MiAgYWRkIDEyMzQ1ICAwLjQ5OSAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MzUzICBhZGQgMTIzNDUgIDAuNDk5OTkgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzNTQgIGFkZCAxMjM0NSAgMC41ICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDM1NSAgYWRkIDEyMzQ1ICAwLjUwMDAxICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MzU2ICBhZGQgMTIzNDUgIDAuNTAwMSAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzNTcgIGFkZCAxMjM0NSAgMC41MDEgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDM1OCAgYWRkIDEyMzQ1ICAwLjUxICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MzU5ICBhZGQgMTIzNDUgIDAuNiAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmVzLi4uCisKK3JvdW5kaW5nOiBkb3duCisKK3JzdXgxMDAgIGFkZCAtMTIzNDUgLTAuMSAgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTAxICBhZGQgLTEyMzQ1IC0wLjAxICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDEwMiAgYWRkIC0xMjM0NSAtMC4wMDEgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMDMgIGFkZCAtMTIzNDUgLTAuMDAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTA0ICBhZGQgLTEyMzQ1IC0wLjAwMDAwMSAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDEwNSAgYWRkIC0xMjM0NSAtMC4wMDAwMDAxIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMDYgIGFkZCAtMTIzNDUgIDAgICAgICAgICAtPiAtMTIzNDUKK3JzdXgxMDcgIGFkZCAtMTIzNDUgIDAuMDAwMDAwMSAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTA4ICBhZGQgLTEyMzQ1ICAwLjAwMDAwMSAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDEwOSAgYWRkIC0xMjM0NSAgMC4wMDAwMSAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMTAgIGFkZCAtMTIzNDUgIDAuMDAwMSAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTExICBhZGQgLTEyMzQ1ICAwLjAwMSAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDExMiAgYWRkIC0xMjM0NSAgMC4wMSAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMTMgIGFkZCAtMTIzNDUgIDAuMSAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCisKK3JzdXgxMTUgIGFkZCAtMTIzNDYgIDAuNDk5OTkgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTE2ICBhZGQgLTEyMzQ2ICAwLjUgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDExNyAgYWRkIC0xMjM0NiAgMC41MDAwMSAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKKworcnN1eDEyMCAgYWRkIC0xMjM0NSAgMC40ICAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMjEgIGFkZCAtMTIzNDUgIDAuNDkgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTIyICBhZGQgLTEyMzQ1ICAwLjQ5OSAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDEyMyAgYWRkIC0xMjM0NSAgMC40OTk5OSAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMjQgIGFkZCAtMTIzNDUgIDAuNSAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTI1ICBhZGQgLTEyMzQ1ICAwLjUwMDAxICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDEyNiAgYWRkIC0xMjM0NSAgMC41MDAxICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMjcgIGFkZCAtMTIzNDUgIDAuNTAxICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTI4ICBhZGQgLTEyMzQ1ICAwLjUxICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDEyOSAgYWRkIC0xMjM0NSAgMC42ICAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZG93bgorCityc3V4MTQwICBhZGQgLTEyMzQ1IC0wLjEgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE0MSAgYWRkIC0xMjM0NSAtMC4wMSAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNDIgIGFkZCAtMTIzNDUgLTAuMDAxICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTQzICBhZGQgLTEyMzQ1IC0wLjAwMDAxICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE0NCAgYWRkIC0xMjM0NSAtMC4wMDAwMDEgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNDUgIGFkZCAtMTIzNDUgLTAuMDAwMDAwMSAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTQ2ICBhZGQgLTEyMzQ1ICAwICAgICAgICAgLT4gLTEyMzQ1Cityc3V4MTQ3ICBhZGQgLTEyMzQ1ICAwLjAwMDAwMDEgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE0OCAgYWRkIC0xMjM0NSAgMC4wMDAwMDEgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNDkgIGFkZCAtMTIzNDUgIDAuMDAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTUwICBhZGQgLTEyMzQ1ICAwLjAwMDEgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE1MSAgYWRkIC0xMjM0NSAgMC4wMDEgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNTIgIGFkZCAtMTIzNDUgIDAuMDEgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTUzICBhZGQgLTEyMzQ1ICAwLjEgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityc3V4MTU1ICBhZGQgLTEyMzQ2ICAwLjQ5OTk5ICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDE1NiAgYWRkIC0xMjM0NiAgMC41ICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNTcgIGFkZCAtMTIzNDYgIDAuNTAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JzdXgxNjAgIGFkZCAtMTIzNDUgIDAuNCAgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTYxICBhZGQgLTEyMzQ1ICAwLjQ5ICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE2MiAgYWRkIC0xMjM0NSAgMC40OTkgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNjMgIGFkZCAtMTIzNDUgIDAuNDk5OTkgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTY0ICBhZGQgLTEyMzQ1ICAwLjUgICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDE2NSAgYWRkIC0xMjM0NSAgMC41MDAwMSAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNjYgIGFkZCAtMTIzNDUgIDAuNTAwMSAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTY3ICBhZGQgLTEyMzQ1ICAwLjUwMSAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDE2OCAgYWRkIC0xMjM0NSAgMC41MSAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNjkgIGFkZCAtMTIzNDUgIDAuNiAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KKworcnN1eDE3MCAgYWRkIC0xMjM0NSAtMC4xICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNzEgIGFkZCAtMTIzNDUgLTAuMDEgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTcyICBhZGQgLTEyMzQ1IC0wLjAwMSAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE3MyAgYWRkIC0xMjM0NSAtMC4wMDAwMSAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNzQgIGFkZCAtMTIzNDUgLTAuMDAwMDAxICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTc1ICBhZGQgLTEyMzQ1IC0wLjAwMDAwMDEgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE3NiAgYWRkIC0xMjM0NSAgMCAgICAgICAgIC0+IC0xMjM0NQorcnN1eDE3NyAgYWRkIC0xMjM0NSAgMC4wMDAwMDAxIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNzggIGFkZCAtMTIzNDUgIDAuMDAwMDAxICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTc5ICBhZGQgLTEyMzQ1ICAwLjAwMDAxICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE4MCAgYWRkIC0xMjM0NSAgMC4wMDAxICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxODEgIGFkZCAtMTIzNDUgIDAuMDAxICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTgyICBhZGQgLTEyMzQ1ICAwLjAxICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE4MyAgYWRkIC0xMjM0NSAgMC4xICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKKworcnN1eDE4NSAgYWRkIC0xMjM0NiAgMC40OTk5OSAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxODYgIGFkZCAtMTIzNDYgIDAuNSAgICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MTg3ICBhZGQgLTEyMzQ2ICAwLjUwMDAxICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityc3V4MTkwICBhZGQgLTEyMzQ1ICAwLjQgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE5MSAgYWRkIC0xMjM0NSAgMC40OSAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxOTIgIGFkZCAtMTIzNDUgIDAuNDk5ICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTkzICBhZGQgLTEyMzQ1ICAwLjQ5OTk5ICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE5NCAgYWRkIC0xMjM0NSAgMC41ICAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxOTUgIGFkZCAtMTIzNDUgIDAuNTAwMDEgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTk2ICBhZGQgLTEyMzQ1ICAwLjUwMDEgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDE5NyAgYWRkIC0xMjM0NSAgMC41MDEgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxOTggIGFkZCAtMTIzNDUgIDAuNTEgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTk5ICBhZGQgLTEyMzQ1ICAwLjYgICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorCityc3V4MjAwICBhZGQgLTEyMzQ1IC0wLjEgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIwMSAgYWRkIC0xMjM0NSAtMC4wMSAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMDIgIGFkZCAtMTIzNDUgLTAuMDAxICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjAzICBhZGQgLTEyMzQ1IC0wLjAwMDAxICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIwNCAgYWRkIC0xMjM0NSAtMC4wMDAwMDEgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMDUgIGFkZCAtMTIzNDUgLTAuMDAwMDAwMSAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjA2ICBhZGQgLTEyMzQ1ICAwICAgICAgICAgLT4gLTEyMzQ1Cityc3V4MjA3ICBhZGQgLTEyMzQ1ICAwLjAwMDAwMDEgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIwOCAgYWRkIC0xMjM0NSAgMC4wMDAwMDEgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMDkgIGFkZCAtMTIzNDUgIDAuMDAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjEwICBhZGQgLTEyMzQ1ICAwLjAwMDEgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIxMSAgYWRkIC0xMjM0NSAgMC4wMDEgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMTIgIGFkZCAtMTIzNDUgIDAuMDEgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjEzICBhZGQgLTEyMzQ1ICAwLjEgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityc3V4MjE1ICBhZGQgLTEyMzQ2ICAwLjQ5OTk5ICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDIxNiAgYWRkIC0xMjM0NiAgMC41ICAgICAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMTcgIGFkZCAtMTIzNDYgIDAuNTAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JzdXgyMjAgIGFkZCAtMTIzNDUgIDAuNCAgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjIxICBhZGQgLTEyMzQ1ICAwLjQ5ICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIyMiAgYWRkIC0xMjM0NSAgMC40OTkgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMjMgIGFkZCAtMTIzNDUgIDAuNDk5OTkgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjI0ICBhZGQgLTEyMzQ1ICAwLjUgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIyNSAgYWRkIC0xMjM0NSAgMC41MDAwMSAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMjYgIGFkZCAtMTIzNDUgIDAuNTAwMSAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MjI3ICBhZGQgLTEyMzQ1ICAwLjUwMSAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDIyOCAgYWRkIC0xMjM0NSAgMC41MSAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMjkgIGFkZCAtMTIzNDUgIDAuNiAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiB1cAorCityc3V4MjMwICBhZGQgLTEyMzQ1IC0wLjEgICAgICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDIzMSAgYWRkIC0xMjM0NSAtMC4wMSAgICAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMzIgIGFkZCAtMTIzNDUgLTAuMDAxICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MjMzICBhZGQgLTEyMzQ1IC0wLjAwMDAxICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDIzNCAgYWRkIC0xMjM0NSAtMC4wMDAwMDEgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMzUgIGFkZCAtMTIzNDUgLTAuMDAwMDAwMSAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MjM2ICBhZGQgLTEyMzQ1ICAwICAgICAgICAgLT4gLTEyMzQ1Cityc3V4MjM3ICBhZGQgLTEyMzQ1ICAwLjAwMDAwMDEgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIzOCAgYWRkIC0xMjM0NSAgMC4wMDAwMDEgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMzkgIGFkZCAtMTIzNDUgIDAuMDAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjQwICBhZGQgLTEyMzQ1ICAwLjAwMDEgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDI0MSAgYWRkIC0xMjM0NSAgMC4wMDEgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyNDIgIGFkZCAtMTIzNDUgIDAuMDEgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjQzICBhZGQgLTEyMzQ1ICAwLjEgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityc3V4MjQ1ICBhZGQgLTEyMzQ2ICAwLjQ5OTk5ICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDI0NiAgYWRkIC0xMjM0NiAgMC41ICAgICAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyNDcgIGFkZCAtMTIzNDYgIDAuNTAwMDEgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCisKK3JzdXgyNTAgIGFkZCAtMTIzNDUgIDAuNCAgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjUxICBhZGQgLTEyMzQ1ICAwLjQ5ICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDI1MiAgYWRkIC0xMjM0NSAgMC40OTkgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyNTMgIGFkZCAtMTIzNDUgIDAuNDk5OTkgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjU0ICBhZGQgLTEyMzQ1ICAwLjUgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDI1NSAgYWRkIC0xMjM0NSAgMC41MDAwMSAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyNTYgIGFkZCAtMTIzNDUgIDAuNTAwMSAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjU3ICBhZGQgLTEyMzQ1ICAwLjUwMSAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDI1OCAgYWRkIC0xMjM0NSAgMC41MSAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyNTkgIGFkZCAtMTIzNDUgIDAuNiAgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBmbG9vcgorCityc3V4MzAwICBhZGQgLTEyMzQ1IC0wLjEgICAgICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDMwMSAgYWRkIC0xMjM0NSAtMC4wMSAgICAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMDIgIGFkZCAtMTIzNDUgLTAuMDAxICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MzAzICBhZGQgLTEyMzQ1IC0wLjAwMDAxICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDMwNCAgYWRkIC0xMjM0NSAtMC4wMDAwMDEgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMDUgIGFkZCAtMTIzNDUgLTAuMDAwMDAwMSAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MzA2ICBhZGQgLTEyMzQ1ICAwICAgICAgICAgLT4gLTEyMzQ1Cityc3V4MzA3ICBhZGQgLTEyMzQ1ICAwLjAwMDAwMDEgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMwOCAgYWRkIC0xMjM0NSAgMC4wMDAwMDEgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMDkgIGFkZCAtMTIzNDUgIDAuMDAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzEwICBhZGQgLTEyMzQ1ICAwLjAwMDEgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMxMSAgYWRkIC0xMjM0NSAgMC4wMDEgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMTIgIGFkZCAtMTIzNDUgIDAuMDEgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzEzICBhZGQgLTEyMzQ1ICAwLjEgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityc3V4MzE1ICBhZGQgLTEyMzQ2ICAwLjQ5OTk5ICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDMxNiAgYWRkIC0xMjM0NiAgMC41ICAgICAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMTcgIGFkZCAtMTIzNDYgIDAuNTAwMDEgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCisKK3JzdXgzMjAgIGFkZCAtMTIzNDUgIDAuNCAgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzIxICBhZGQgLTEyMzQ1ICAwLjQ5ICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMyMiAgYWRkIC0xMjM0NSAgMC40OTkgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMjMgIGFkZCAtMTIzNDUgIDAuNDk5OTkgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzI0ICBhZGQgLTEyMzQ1ICAwLjUgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMyNSAgYWRkIC0xMjM0NSAgMC41MDAwMSAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMjYgIGFkZCAtMTIzNDUgIDAuNTAwMSAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzI3ICBhZGQgLTEyMzQ1ICAwLjUwMSAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMyOCAgYWRkIC0xMjM0NSAgMC41MSAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMjkgIGFkZCAtMTIzNDUgIDAuNiAgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBjZWlsaW5nCisKK3JzdXgzMzAgIGFkZCAtMTIzNDUgLTAuMSAgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzMxICBhZGQgLTEyMzQ1IC0wLjAxICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMzMiAgYWRkIC0xMjM0NSAtMC4wMDEgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMzMgIGFkZCAtMTIzNDUgLTAuMDAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzM0ICBhZGQgLTEyMzQ1IC0wLjAwMDAwMSAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMzNSAgYWRkIC0xMjM0NSAtMC4wMDAwMDAxIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMzYgIGFkZCAtMTIzNDUgIDAgICAgICAgICAtPiAtMTIzNDUKK3JzdXgzMzcgIGFkZCAtMTIzNDUgIDAuMDAwMDAwMSAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MzM4ICBhZGQgLTEyMzQ1ICAwLjAwMDAwMSAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDMzOSAgYWRkIC0xMjM0NSAgMC4wMDAwMSAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzNDAgIGFkZCAtMTIzNDUgIDAuMDAwMSAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MzQxICBhZGQgLTEyMzQ1ICAwLjAwMSAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDM0MiAgYWRkIC0xMjM0NSAgMC4wMSAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzNDMgIGFkZCAtMTIzNDUgIDAuMSAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCisKK3JzdXgzNDUgIGFkZCAtMTIzNDYgIDAuNDk5OTkgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzQ2ICBhZGQgLTEyMzQ2ICAwLjUgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDM0NyAgYWRkIC0xMjM0NiAgMC41MDAwMSAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKKworcnN1eDM1MCAgYWRkIC0xMjM0NSAgMC40ICAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzNTEgIGFkZCAtMTIzNDUgIDAuNDkgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MzUyICBhZGQgLTEyMzQ1ICAwLjQ5OSAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDM1MyAgYWRkIC0xMjM0NSAgMC40OTk5OSAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzNTQgIGFkZCAtMTIzNDUgIDAuNSAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MzU1ICBhZGQgLTEyMzQ1ICAwLjUwMDAxICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDM1NiAgYWRkIC0xMjM0NSAgMC41MDAxICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzNTcgIGFkZCAtMTIzNDUgIDAuNTAxICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MzU4ICBhZGQgLTEyMzQ1ICAwLjUxICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDM1OSAgYWRkIC0xMjM0NSAgMC42ICAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKKworLS0gQ2hlY2sgY2FuY2VsbGF0aW9uIHN1YnRyYWN0aW9ucworLS0gKFRoZSBJRUVFIDg1NCAnY3VyaW91cyBydWxlJyBpbiAkNi4zKQorCityb3VuZGluZzogZG93bgorcnpleDAwMSAgYWRkICAwICAgIDAgICAgLT4gIDAKK3J6ZXgwMDIgIGFkZCAgMCAgIC0wICAgIC0+ICAwCityemV4MDAzICBhZGQgLTAgICAgMCAgICAtPiAgMAorcnpleDAwNCAgYWRkIC0wICAgLTAgICAgLT4gLTAKK3J6ZXgwMDUgIGFkZCAgMSAgIC0xICAgIC0+ICAwCityemV4MDA2ICBhZGQgLTEgICAgMSAgICAtPiAgMAorcnpleDAwNyAgYWRkICAxLjUgLTEuNSAgLT4gIDAuMAorcnpleDAwOCAgYWRkIC0xLjUgIDEuNSAgLT4gIDAuMAorcnpleDAwOSAgYWRkICAyICAgLTIgICAgLT4gIDAKK3J6ZXgwMTAgIGFkZCAtMiAgICAyICAgIC0+ICAwCisKK3JvdW5kaW5nOiB1cAorcnpleDAxMSAgYWRkICAwICAgIDAgICAgLT4gIDAKK3J6ZXgwMTIgIGFkZCAgMCAgIC0wICAgIC0+ICAwCityemV4MDEzICBhZGQgLTAgICAgMCAgICAtPiAgMAorcnpleDAxNCAgYWRkIC0wICAgLTAgICAgLT4gLTAKK3J6ZXgwMTUgIGFkZCAgMSAgIC0xICAgIC0+ICAwCityemV4MDE2ICBhZGQgLTEgICAgMSAgICAtPiAgMAorcnpleDAxNyAgYWRkICAxLjUgLTEuNSAgLT4gIDAuMAorcnpleDAxOCAgYWRkIC0xLjUgIDEuNSAgLT4gIDAuMAorcnpleDAxOSAgYWRkICAyICAgLTIgICAgLT4gIDAKK3J6ZXgwMjAgIGFkZCAtMiAgICAyICAgIC0+ICAwCisKK3JvdW5kaW5nOiBoYWxmX3VwCityemV4MDIxICBhZGQgIDAgICAgMCAgICAtPiAgMAorcnpleDAyMiAgYWRkICAwICAgLTAgICAgLT4gIDAKK3J6ZXgwMjMgIGFkZCAtMCAgICAwICAgIC0+ICAwCityemV4MDI0ICBhZGQgLTAgICAtMCAgICAtPiAtMAorcnpleDAyNSAgYWRkICAxICAgLTEgICAgLT4gIDAKK3J6ZXgwMjYgIGFkZCAtMSAgICAxICAgIC0+ICAwCityemV4MDI3ICBhZGQgIDEuNSAtMS41ICAtPiAgMC4wCityemV4MDI4ICBhZGQgLTEuNSAgMS41ICAtPiAgMC4wCityemV4MDI5ICBhZGQgIDIgICAtMiAgICAtPiAgMAorcnpleDAzMCAgYWRkIC0yICAgIDIgICAgLT4gIDAKKworcm91bmRpbmc6IGhhbGZfZG93bgorcnpleDAzMSAgYWRkICAwICAgIDAgICAgLT4gIDAKK3J6ZXgwMzIgIGFkZCAgMCAgIC0wICAgIC0+ICAwCityemV4MDMzICBhZGQgLTAgICAgMCAgICAtPiAgMAorcnpleDAzNCAgYWRkIC0wICAgLTAgICAgLT4gLTAKK3J6ZXgwMzUgIGFkZCAgMSAgIC0xICAgIC0+ICAwCityemV4MDM2ICBhZGQgLTEgICAgMSAgICAtPiAgMAorcnpleDAzNyAgYWRkICAxLjUgLTEuNSAgLT4gIDAuMAorcnpleDAzOCAgYWRkIC0xLjUgIDEuNSAgLT4gIDAuMAorcnpleDAzOSAgYWRkICAyICAgLTIgICAgLT4gIDAKK3J6ZXgwNDAgIGFkZCAtMiAgICAyICAgIC0+ICAwCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK3J6ZXgwNDEgIGFkZCAgMCAgICAwICAgIC0+ICAwCityemV4MDQyICBhZGQgIDAgICAtMCAgICAtPiAgMAorcnpleDA0MyAgYWRkIC0wICAgIDAgICAgLT4gIDAKK3J6ZXgwNDQgIGFkZCAtMCAgIC0wICAgIC0+IC0wCityemV4MDQ1ICBhZGQgIDEgICAtMSAgICAtPiAgMAorcnpleDA0NiAgYWRkIC0xICAgIDEgICAgLT4gIDAKK3J6ZXgwNDcgIGFkZCAgMS41IC0xLjUgIC0+ICAwLjAKK3J6ZXgwNDggIGFkZCAtMS41ICAxLjUgIC0+ICAwLjAKK3J6ZXgwNDkgIGFkZCAgMiAgIC0yICAgIC0+ICAwCityemV4MDUwICBhZGQgLTIgICAgMiAgICAtPiAgMAorCityb3VuZGluZzogZmxvb3IKK3J6ZXgwNTEgIGFkZCAgMCAgICAwICAgIC0+ICAwCityemV4MDUyICBhZGQgIDAgICAtMCAgICAtPiAtMCAgICAtLSBoZXJlIGFyZSB0d28gJ2N1cmlvdXMnCityemV4MDUzICBhZGQgLTAgICAgMCAgICAtPiAtMCAgICAtLQorcnpleDA1NCAgYWRkIC0wICAgLTAgICAgLT4gLTAKK3J6ZXgwNTUgIGFkZCAgMSAgIC0xICAgIC0+IC0wICAgIC0tIGhlcmUgYXJlIHRoZSByZXN0CityemV4MDU2ICBhZGQgLTEgICAgMSAgICAtPiAtMCAgICAtLSAuLgorcnpleDA1NyAgYWRkICAxLjUgLTEuNSAgLT4gLTAuMCAgLS0gLi4KK3J6ZXgwNTggIGFkZCAtMS41ICAxLjUgIC0+IC0wLjAgIC0tIC4uCityemV4MDU5ICBhZGQgIDIgICAtMiAgICAtPiAtMCAgICAtLSAuLgorcnpleDA2MCAgYWRkIC0yICAgIDIgICAgLT4gLTAgICAgLS0gLi4KKworcm91bmRpbmc6IGNlaWxpbmcKK3J6ZXgwNjEgIGFkZCAgMCAgICAwICAgIC0+ICAwCityemV4MDYyICBhZGQgIDAgICAtMCAgICAtPiAgMAorcnpleDA2MyAgYWRkIC0wICAgIDAgICAgLT4gIDAKK3J6ZXgwNjQgIGFkZCAtMCAgIC0wICAgIC0+IC0wCityemV4MDY1ICBhZGQgIDEgICAtMSAgICAtPiAgMAorcnpleDA2NiAgYWRkIC0xICAgIDEgICAgLT4gIDAKK3J6ZXgwNjcgIGFkZCAgMS41IC0xLjUgIC0+ICAwLjAKK3J6ZXgwNjggIGFkZCAtMS41ICAxLjUgIC0+ICAwLjAKK3J6ZXgwNjkgIGFkZCAgMiAgIC0yICAgIC0+ICAwCityemV4MDcwICBhZGQgLTIgICAgMiAgICAtPiAgMAorCisKKy0tIERpdmlzaW9uIG9wZXJhdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JvdW5kaW5nOiBkb3duCityZHZ4MTAxICBkaXZpZGUgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3JkdngxMDIgIGRpdmlkZSAxMjM0NSAgMS4wMDAxICAgIC0+ICAxMjM0MyBJbmV4YWN0IFJvdW5kZWQKK3JkdngxMDMgIGRpdmlkZSAxMjM0NSAgMS4wMDEgICAgIC0+ICAxMjMzMiBJbmV4YWN0IFJvdW5kZWQKK3JkdngxMDQgIGRpdmlkZSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjIyMiBJbmV4YWN0IFJvdW5kZWQKK3JkdngxMDUgIGRpdmlkZSAxMjM0NSAgMS4xICAgICAgIC0+ICAxMTIyMiBJbmV4YWN0IFJvdW5kZWQKK3JkdngxMDYgIGRpdmlkZSAxMjM1NSAgNCAgICAgICAgIC0+ICAgMzA4OC43IEluZXhhY3QgUm91bmRlZAorcmR2eDEwNyAgZGl2aWRlIDEyMzQ1ICA0ICAgICAgICAgLT4gICAzMDg2LjIgSW5leGFjdCBSb3VuZGVkCityZHZ4MTA4ICBkaXZpZGUgMTIzNTUgIDQuMDAwMSAgICAtPiAgIDMwODguNiBJbmV4YWN0IFJvdW5kZWQKK3JkdngxMDkgIGRpdmlkZSAxMjM0NSAgNC4wMDAxICAgIC0+ICAgMzA4Ni4xIEluZXhhY3QgUm91bmRlZAorcmR2eDExMCAgZGl2aWRlIDEyMzQ1ICA0LjkgICAgICAgLT4gICAyNTE5LjMgSW5leGFjdCBSb3VuZGVkCityZHZ4MTExICBkaXZpZGUgMTIzNDUgIDQuOTkgICAgICAtPiAgIDI0NzMuOSBJbmV4YWN0IFJvdW5kZWQKK3JkdngxMTIgIGRpdmlkZSAxMjM0NSAgNC45OTkgICAgIC0+ICAgMjQ2OS40IEluZXhhY3QgUm91bmRlZAorcmR2eDExMyAgZGl2aWRlIDEyMzQ1ICA0Ljk5OTkgICAgLT4gICAyNDY5LjAgSW5leGFjdCBSb3VuZGVkCityZHZ4MTE0ICBkaXZpZGUgMTIzNDUgIDUgICAgICAgICAtPiAgIDI0NjkKK3JkdngxMTUgIGRpdmlkZSAxMjM0NSAgNS4wMDAxICAgIC0+ICAyNDY4LjkgSW5leGFjdCBSb3VuZGVkCityZHZ4MTE2ICBkaXZpZGUgMTIzNDUgIDUuMDAxICAgICAtPiAgMjQ2OC41IEluZXhhY3QgUm91bmRlZAorcmR2eDExNyAgZGl2aWRlIDEyMzQ1ICA1LjAxICAgICAgLT4gIDI0NjQuMCBJbmV4YWN0IFJvdW5kZWQKK3JkdngxMTggIGRpdmlkZSAxMjM0NSAgNS4xICAgICAgIC0+ICAyNDIwLjUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK3JkdngyMDEgIGRpdmlkZSAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcmR2eDIwMiAgZGl2aWRlIDEyMzQ1ICAxLjAwMDEgICAgLT4gIDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcmR2eDIwMyAgZGl2aWRlIDEyMzQ1ICAxLjAwMSAgICAgLT4gIDEyMzMzIEluZXhhY3QgUm91bmRlZAorcmR2eDIwNCAgZGl2aWRlIDEyMzQ1ICAxLjAxICAgICAgLT4gIDEyMjIzIEluZXhhY3QgUm91bmRlZAorcmR2eDIwNSAgZGl2aWRlIDEyMzQ1ICAxLjEgICAgICAgLT4gIDExMjIzIEluZXhhY3QgUm91bmRlZAorcmR2eDIwNiAgZGl2aWRlIDEyMzU1ICA0ICAgICAgICAgLT4gICAzMDg4LjcgSW5leGFjdCBSb3VuZGVkCityZHZ4MjA3ICBkaXZpZGUgMTIzNDUgIDQgICAgICAgICAtPiAgIDMwODYuMiBJbmV4YWN0IFJvdW5kZWQKK3JkdngyMDggIGRpdmlkZSAxMjM1NSAgNC4wMDAxICAgIC0+ICAgMzA4OC43IEluZXhhY3QgUm91bmRlZAorcmR2eDIwOSAgZGl2aWRlIDEyMzQ1ICA0LjAwMDEgICAgLT4gICAzMDg2LjIgSW5leGFjdCBSb3VuZGVkCityZHZ4MjEwICBkaXZpZGUgMTIzNDUgIDQuOSAgICAgICAtPiAgIDI1MTkuNCBJbmV4YWN0IFJvdW5kZWQKK3JkdngyMTEgIGRpdmlkZSAxMjM0NSAgNC45OSAgICAgIC0+ICAgMjQ3My45IEluZXhhY3QgUm91bmRlZAorcmR2eDIxMiAgZGl2aWRlIDEyMzQ1ICA0Ljk5OSAgICAgLT4gICAyNDY5LjUgSW5leGFjdCBSb3VuZGVkCityZHZ4MjEzICBkaXZpZGUgMTIzNDUgIDQuOTk5OSAgICAtPiAgIDI0NjkuMCBJbmV4YWN0IFJvdW5kZWQKK3JkdngyMTQgIGRpdmlkZSAxMjM0NSAgNSAgICAgICAgIC0+ICAgMjQ2OQorcmR2eDIxNSAgZGl2aWRlIDEyMzQ1ICA1LjAwMDEgICAgLT4gIDI0NjkuMCBJbmV4YWN0IFJvdW5kZWQKK3JkdngyMTYgIGRpdmlkZSAxMjM0NSAgNS4wMDEgICAgIC0+ICAyNDY4LjUgSW5leGFjdCBSb3VuZGVkCityZHZ4MjE3ICBkaXZpZGUgMTIzNDUgIDUuMDEgICAgICAtPiAgMjQ2NC4xIEluZXhhY3QgUm91bmRlZAorcmR2eDIxOCAgZGl2aWRlIDEyMzQ1ICA1LjEgICAgICAgLT4gIDI0MjAuNiBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorcmR2eDMwMSAgZGl2aWRlIDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CityZHZ4MzAyICBkaXZpZGUgMTIzNDUgIDEuMDAwMSAgICAtPiAgMTIzNDQgSW5leGFjdCBSb3VuZGVkCityZHZ4MzAzICBkaXZpZGUgMTIzNDUgIDEuMDAxICAgICAtPiAgMTIzMzMgSW5leGFjdCBSb3VuZGVkCityZHZ4MzA0ICBkaXZpZGUgMTIzNDUgIDEuMDEgICAgICAtPiAgMTIyMjMgSW5leGFjdCBSb3VuZGVkCityZHZ4MzA1ICBkaXZpZGUgMTIzNDUgIDEuMSAgICAgICAtPiAgMTEyMjMgSW5leGFjdCBSb3VuZGVkCityZHZ4MzA2ICBkaXZpZGUgMTIzNTUgIDQgICAgICAgICAtPiAgIDMwODguOCBJbmV4YWN0IFJvdW5kZWQKK3JkdngzMDcgIGRpdmlkZSAxMjM0NSAgNCAgICAgICAgIC0+ICAgMzA4Ni4yIEluZXhhY3QgUm91bmRlZAorcmR2eDMwOCAgZGl2aWRlIDEyMzU1ICA0LjAwMDEgICAgLT4gICAzMDg4LjcgSW5leGFjdCBSb3VuZGVkCityZHZ4MzA5ICBkaXZpZGUgMTIzNDUgIDQuMDAwMSAgICAtPiAgIDMwODYuMiBJbmV4YWN0IFJvdW5kZWQKK3JkdngzMTAgIGRpdmlkZSAxMjM0NSAgNC45ICAgICAgIC0+ICAgMjUxOS40IEluZXhhY3QgUm91bmRlZAorcmR2eDMxMSAgZGl2aWRlIDEyMzQ1ICA0Ljk5ICAgICAgLT4gICAyNDczLjkgSW5leGFjdCBSb3VuZGVkCityZHZ4MzEyICBkaXZpZGUgMTIzNDUgIDQuOTk5ICAgICAtPiAgIDI0NjkuNSBJbmV4YWN0IFJvdW5kZWQKK3JkdngzMTMgIGRpdmlkZSAxMjM0NSAgNC45OTk5ICAgIC0+ICAgMjQ2OS4wIEluZXhhY3QgUm91bmRlZAorcmR2eDMxNCAgZGl2aWRlIDEyMzQ1ICA1ICAgICAgICAgLT4gICAyNDY5CityZHZ4MzE1ICBkaXZpZGUgMTIzNDUgIDUuMDAwMSAgICAtPiAgMjQ2OS4wIEluZXhhY3QgUm91bmRlZAorcmR2eDMxNiAgZGl2aWRlIDEyMzQ1ICA1LjAwMSAgICAgLT4gIDI0NjguNSBJbmV4YWN0IFJvdW5kZWQKK3JkdngzMTcgIGRpdmlkZSAxMjM0NSAgNS4wMSAgICAgIC0+ICAyNDY0LjEgSW5leGFjdCBSb3VuZGVkCityZHZ4MzE4ICBkaXZpZGUgMTIzNDUgIDUuMSAgICAgICAtPiAgMjQyMC42IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorcmR2eDQwMSAgZGl2aWRlIDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CityZHZ4NDAyICBkaXZpZGUgMTIzNDUgIDEuMDAwMSAgICAtPiAgMTIzNDQgSW5leGFjdCBSb3VuZGVkCityZHZ4NDAzICBkaXZpZGUgMTIzNDUgIDEuMDAxICAgICAtPiAgMTIzMzMgSW5leGFjdCBSb3VuZGVkCityZHZ4NDA0ICBkaXZpZGUgMTIzNDUgIDEuMDEgICAgICAtPiAgMTIyMjMgSW5leGFjdCBSb3VuZGVkCityZHZ4NDA1ICBkaXZpZGUgMTIzNDUgIDEuMSAgICAgICAtPiAgMTEyMjMgSW5leGFjdCBSb3VuZGVkCityZHZ4NDA2ICBkaXZpZGUgMTIzNTUgIDQgICAgICAgICAtPiAgIDMwODguOCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng0MDcgIGRpdmlkZSAxMjM0NSAgNCAgICAgICAgIC0+ICAgMzA4Ni4zIEluZXhhY3QgUm91bmRlZAorcmR2eDQwOCAgZGl2aWRlIDEyMzU1ICA0LjAwMDEgICAgLT4gICAzMDg4LjcgSW5leGFjdCBSb3VuZGVkCityZHZ4NDA5ICBkaXZpZGUgMTIzNDUgIDQuMDAwMSAgICAtPiAgIDMwODYuMiBJbmV4YWN0IFJvdW5kZWQKK3Jkdng0MTAgIGRpdmlkZSAxMjM0NSAgNC45ICAgICAgIC0+ICAgMjUxOS40IEluZXhhY3QgUm91bmRlZAorcmR2eDQxMSAgZGl2aWRlIDEyMzQ1ICA0Ljk5ICAgICAgLT4gICAyNDczLjkgSW5leGFjdCBSb3VuZGVkCityZHZ4NDEyICBkaXZpZGUgMTIzNDUgIDQuOTk5ICAgICAtPiAgIDI0NjkuNSBJbmV4YWN0IFJvdW5kZWQKK3Jkdng0MTMgIGRpdmlkZSAxMjM0NSAgNC45OTk5ICAgIC0+ICAgMjQ2OS4wIEluZXhhY3QgUm91bmRlZAorcmR2eDQxNCAgZGl2aWRlIDEyMzQ1ICA1ICAgICAgICAgLT4gICAyNDY5CityZHZ4NDE1ICBkaXZpZGUgMTIzNDUgIDUuMDAwMSAgICAtPiAgMjQ2OS4wIEluZXhhY3QgUm91bmRlZAorcmR2eDQxNiAgZGl2aWRlIDEyMzQ1ICA1LjAwMSAgICAgLT4gIDI0NjguNSBJbmV4YWN0IFJvdW5kZWQKK3Jkdng0MTcgIGRpdmlkZSAxMjM0NSAgNS4wMSAgICAgIC0+ICAyNDY0LjEgSW5leGFjdCBSb3VuZGVkCityZHZ4NDE4ICBkaXZpZGUgMTIzNDUgIDUuMSAgICAgICAtPiAgMjQyMC42IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogdXAKK3Jkdng1MDEgIGRpdmlkZSAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcmR2eDUwMiAgZGl2aWRlIDEyMzQ1ICAxLjAwMDEgICAgLT4gIDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcmR2eDUwMyAgZGl2aWRlIDEyMzQ1ICAxLjAwMSAgICAgLT4gIDEyMzMzIEluZXhhY3QgUm91bmRlZAorcmR2eDUwNCAgZGl2aWRlIDEyMzQ1ICAxLjAxICAgICAgLT4gIDEyMjIzIEluZXhhY3QgUm91bmRlZAorcmR2eDUwNSAgZGl2aWRlIDEyMzQ1ICAxLjEgICAgICAgLT4gIDExMjIzIEluZXhhY3QgUm91bmRlZAorcmR2eDUwNiAgZGl2aWRlIDEyMzU1ICA0ICAgICAgICAgLT4gICAzMDg4LjggSW5leGFjdCBSb3VuZGVkCityZHZ4NTA3ICBkaXZpZGUgMTIzNDUgIDQgICAgICAgICAtPiAgIDMwODYuMyBJbmV4YWN0IFJvdW5kZWQKK3Jkdng1MDggIGRpdmlkZSAxMjM1NSAgNC4wMDAxICAgIC0+ICAgMzA4OC43IEluZXhhY3QgUm91bmRlZAorcmR2eDUwOSAgZGl2aWRlIDEyMzQ1ICA0LjAwMDEgICAgLT4gICAzMDg2LjIgSW5leGFjdCBSb3VuZGVkCityZHZ4NTEwICBkaXZpZGUgMTIzNDUgIDQuOSAgICAgICAtPiAgIDI1MTkuNCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng1MTEgIGRpdmlkZSAxMjM0NSAgNC45OSAgICAgIC0+ICAgMjQ3NC4wIEluZXhhY3QgUm91bmRlZAorcmR2eDUxMiAgZGl2aWRlIDEyMzQ1ICA0Ljk5OSAgICAgLT4gICAyNDY5LjUgSW5leGFjdCBSb3VuZGVkCityZHZ4NTEzICBkaXZpZGUgMTIzNDUgIDQuOTk5OSAgICAtPiAgIDI0NjkuMSBJbmV4YWN0IFJvdW5kZWQKK3Jkdng1MTQgIGRpdmlkZSAxMjM0NSAgNSAgICAgICAgIC0+ICAgMjQ2OQorcmR2eDUxNSAgZGl2aWRlIDEyMzQ1ICA1LjAwMDEgICAgLT4gIDI0NjkuMCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng1MTYgIGRpdmlkZSAxMjM0NSAgNS4wMDEgICAgIC0+ICAyNDY4LjYgSW5leGFjdCBSb3VuZGVkCityZHZ4NTE3ICBkaXZpZGUgMTIzNDUgIDUuMDEgICAgICAtPiAgMjQ2NC4xIEluZXhhY3QgUm91bmRlZAorcmR2eDUxOCAgZGl2aWRlIDEyMzQ1ICA1LjEgICAgICAgLT4gIDI0MjAuNiBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGZsb29yCityZHZ4NjAxICBkaXZpZGUgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3Jkdng2MDIgIGRpdmlkZSAxMjM0NSAgMS4wMDAxICAgIC0+ICAxMjM0MyBJbmV4YWN0IFJvdW5kZWQKK3Jkdng2MDMgIGRpdmlkZSAxMjM0NSAgMS4wMDEgICAgIC0+ICAxMjMzMiBJbmV4YWN0IFJvdW5kZWQKK3Jkdng2MDQgIGRpdmlkZSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjIyMiBJbmV4YWN0IFJvdW5kZWQKK3Jkdng2MDUgIGRpdmlkZSAxMjM0NSAgMS4xICAgICAgIC0+ICAxMTIyMiBJbmV4YWN0IFJvdW5kZWQKK3Jkdng2MDYgIGRpdmlkZSAxMjM1NSAgNCAgICAgICAgIC0+ICAgMzA4OC43IEluZXhhY3QgUm91bmRlZAorcmR2eDYwNyAgZGl2aWRlIDEyMzQ1ICA0ICAgICAgICAgLT4gICAzMDg2LjIgSW5leGFjdCBSb3VuZGVkCityZHZ4NjA4ICBkaXZpZGUgMTIzNTUgIDQuMDAwMSAgICAtPiAgIDMwODguNiBJbmV4YWN0IFJvdW5kZWQKK3Jkdng2MDkgIGRpdmlkZSAxMjM0NSAgNC4wMDAxICAgIC0+ICAgMzA4Ni4xIEluZXhhY3QgUm91bmRlZAorcmR2eDYxMCAgZGl2aWRlIDEyMzQ1ICA0LjkgICAgICAgLT4gICAyNTE5LjMgSW5leGFjdCBSb3VuZGVkCityZHZ4NjExICBkaXZpZGUgMTIzNDUgIDQuOTkgICAgICAtPiAgIDI0NzMuOSBJbmV4YWN0IFJvdW5kZWQKK3Jkdng2MTIgIGRpdmlkZSAxMjM0NSAgNC45OTkgICAgIC0+ICAgMjQ2OS40IEluZXhhY3QgUm91bmRlZAorcmR2eDYxMyAgZGl2aWRlIDEyMzQ1ICA0Ljk5OTkgICAgLT4gICAyNDY5LjAgSW5leGFjdCBSb3VuZGVkCityZHZ4NjE0ICBkaXZpZGUgMTIzNDUgIDUgICAgICAgICAtPiAgIDI0NjkKK3Jkdng2MTUgIGRpdmlkZSAxMjM0NSAgNS4wMDAxICAgIC0+ICAyNDY4LjkgSW5leGFjdCBSb3VuZGVkCityZHZ4NjE2ICBkaXZpZGUgMTIzNDUgIDUuMDAxICAgICAtPiAgMjQ2OC41IEluZXhhY3QgUm91bmRlZAorcmR2eDYxNyAgZGl2aWRlIDEyMzQ1ICA1LjAxICAgICAgLT4gIDI0NjQuMCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng2MTggIGRpdmlkZSAxMjM0NSAgNS4xICAgICAgIC0+ICAyNDIwLjUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBjZWlsaW5nCityZHZ4NzAxICBkaXZpZGUgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3Jkdng3MDIgIGRpdmlkZSAxMjM0NSAgMS4wMDAxICAgIC0+ICAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng3MDMgIGRpdmlkZSAxMjM0NSAgMS4wMDEgICAgIC0+ICAxMjMzMyBJbmV4YWN0IFJvdW5kZWQKK3Jkdng3MDQgIGRpdmlkZSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjIyMyBJbmV4YWN0IFJvdW5kZWQKK3Jkdng3MDUgIGRpdmlkZSAxMjM0NSAgMS4xICAgICAgIC0+ICAxMTIyMyBJbmV4YWN0IFJvdW5kZWQKK3Jkdng3MDYgIGRpdmlkZSAxMjM1NSAgNCAgICAgICAgIC0+ICAgMzA4OC44IEluZXhhY3QgUm91bmRlZAorcmR2eDcwNyAgZGl2aWRlIDEyMzQ1ICA0ICAgICAgICAgLT4gICAzMDg2LjMgSW5leGFjdCBSb3VuZGVkCityZHZ4NzA4ICBkaXZpZGUgMTIzNTUgIDQuMDAwMSAgICAtPiAgIDMwODguNyBJbmV4YWN0IFJvdW5kZWQKK3Jkdng3MDkgIGRpdmlkZSAxMjM0NSAgNC4wMDAxICAgIC0+ICAgMzA4Ni4yIEluZXhhY3QgUm91bmRlZAorcmR2eDcxMCAgZGl2aWRlIDEyMzQ1ICA0LjkgICAgICAgLT4gICAyNTE5LjQgSW5leGFjdCBSb3VuZGVkCityZHZ4NzExICBkaXZpZGUgMTIzNDUgIDQuOTkgICAgICAtPiAgIDI0NzQuMCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng3MTIgIGRpdmlkZSAxMjM0NSAgNC45OTkgICAgIC0+ICAgMjQ2OS41IEluZXhhY3QgUm91bmRlZAorcmR2eDcxMyAgZGl2aWRlIDEyMzQ1ICA0Ljk5OTkgICAgLT4gICAyNDY5LjEgSW5leGFjdCBSb3VuZGVkCityZHZ4NzE0ICBkaXZpZGUgMTIzNDUgIDUgICAgICAgICAtPiAgIDI0NjkKK3Jkdng3MTUgIGRpdmlkZSAxMjM0NSAgNS4wMDAxICAgIC0+ICAyNDY5LjAgSW5leGFjdCBSb3VuZGVkCityZHZ4NzE2ICBkaXZpZGUgMTIzNDUgIDUuMDAxICAgICAtPiAgMjQ2OC42IEluZXhhY3QgUm91bmRlZAorcmR2eDcxNyAgZGl2aWRlIDEyMzQ1ICA1LjAxICAgICAgLT4gIDI0NjQuMSBJbmV4YWN0IFJvdW5kZWQKK3Jkdng3MTggIGRpdmlkZSAxMjM0NSAgNS4xICAgICAgIC0+ICAyNDIwLjYgSW5leGFjdCBSb3VuZGVkCisKKy0tIFtkaXZpZGVJbnRlZ2VyIGFuZCByZW1haW5kZXIgdW5hZmZlY3RlZF0KKworLS0gTXVsdGlwbGljYXRpb24gb3BlcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcm91bmRpbmc6IGRvd24KK3JtdXgxMDEgIG11bHRpcGx5IDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CitybXV4MTAyICBtdWx0aXBseSAxMjM0NSAgMS4wMDAxICAgIC0+ICAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JtdXgxMDMgIG11bHRpcGx5IDEyMzQ1ICAxLjAwMSAgICAgLT4gIDEyMzU3IEluZXhhY3QgUm91bmRlZAorcm11eDEwNCAgbXVsdGlwbHkgMTIzNDUgIDEuMDEgICAgICAtPiAgMTI0NjggSW5leGFjdCBSb3VuZGVkCitybXV4MTA1ICBtdWx0aXBseSAxMjM0NSAgMS4xICAgICAgIC0+ICAxMzU3OSBJbmV4YWN0IFJvdW5kZWQKK3JtdXgxMDYgIG11bHRpcGx5IDEyMzQ1ICA0ICAgICAgICAgLT4gIDQ5MzgwCitybXV4MTA3ICBtdWx0aXBseSAxMjM0NSAgNC4wMDAxICAgIC0+ICA0OTM4MSBJbmV4YWN0IFJvdW5kZWQKK3JtdXgxMDggIG11bHRpcGx5IDEyMzQ1ICA0LjkgICAgICAgLT4gIDYwNDkwIEluZXhhY3QgUm91bmRlZAorcm11eDEwOSAgbXVsdGlwbHkgMTIzNDUgIDQuOTkgICAgICAtPiAgNjE2MDEgSW5leGFjdCBSb3VuZGVkCitybXV4MTEwICBtdWx0aXBseSAxMjM0NSAgNC45OTkgICAgIC0+ICA2MTcxMiBJbmV4YWN0IFJvdW5kZWQKK3JtdXgxMTEgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5OTkgICAgLT4gIDYxNzIzIEluZXhhY3QgUm91bmRlZAorcm11eDExMiAgbXVsdGlwbHkgMTIzNDUgIDUgICAgICAgICAtPiAgNjE3MjUKK3JtdXgxMTMgIG11bHRpcGx5IDEyMzQ1ICA1LjAwMDEgICAgLT4gIDYxNzI2IEluZXhhY3QgUm91bmRlZAorcm11eDExNCAgbXVsdGlwbHkgMTIzNDUgIDUuMDAxICAgICAtPiAgNjE3MzcgSW5leGFjdCBSb3VuZGVkCitybXV4MTE1ICBtdWx0aXBseSAxMjM0NSAgNS4wMSAgICAgIC0+ICA2MTg0OCBJbmV4YWN0IFJvdW5kZWQKK3JtdXgxMTYgIG11bHRpcGx5IDEyMzQ1ICAxMiAgICAgICAgLT4gIDEuNDgxNEUrNSBSb3VuZGVkCitybXV4MTE3ICBtdWx0aXBseSAxMjM0NSAgMTMgICAgICAgIC0+ICAxLjYwNDhFKzUgSW5leGFjdCBSb3VuZGVkCitybXV4MTE4ICBtdWx0aXBseSAxMjM1NSAgMTIgICAgICAgIC0+ICAxLjQ4MjZFKzUgUm91bmRlZAorcm11eDExOSAgbXVsdGlwbHkgMTIzNTUgIDEzICAgICAgICAtPiAgMS42MDYxRSs1IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9kb3duCitybXV4MjAxICBtdWx0aXBseSAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcm11eDIwMiAgbXVsdGlwbHkgMTIzNDUgIDEuMDAwMSAgICAtPiAgMTIzNDYgSW5leGFjdCBSb3VuZGVkCitybXV4MjAzICBtdWx0aXBseSAxMjM0NSAgMS4wMDEgICAgIC0+ICAxMjM1NyBJbmV4YWN0IFJvdW5kZWQKK3JtdXgyMDQgIG11bHRpcGx5IDEyMzQ1ICAxLjAxICAgICAgLT4gIDEyNDY4IEluZXhhY3QgUm91bmRlZAorcm11eDIwNSAgbXVsdGlwbHkgMTIzNDUgIDEuMSAgICAgICAtPiAgMTM1NzkgSW5leGFjdCBSb3VuZGVkCitybXV4MjA2ICBtdWx0aXBseSAxMjM0NSAgNCAgICAgICAgIC0+ICA0OTM4MAorcm11eDIwNyAgbXVsdGlwbHkgMTIzNDUgIDQuMDAwMSAgICAtPiAgNDkzODEgSW5leGFjdCBSb3VuZGVkCitybXV4MjA4ICBtdWx0aXBseSAxMjM0NSAgNC45ICAgICAgIC0+ICA2MDQ5MCBJbmV4YWN0IFJvdW5kZWQKK3JtdXgyMDkgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5ICAgICAgLT4gIDYxNjAyIEluZXhhY3QgUm91bmRlZAorcm11eDIxMCAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5ICAgICAtPiAgNjE3MTMgSW5leGFjdCBSb3VuZGVkCitybXV4MjExICBtdWx0aXBseSAxMjM0NSAgNC45OTk5ICAgIC0+ICA2MTcyNCBJbmV4YWN0IFJvdW5kZWQKK3JtdXgyMTIgIG11bHRpcGx5IDEyMzQ1ICA1ICAgICAgICAgLT4gIDYxNzI1CitybXV4MjEzICBtdWx0aXBseSAxMjM0NSAgNS4wMDAxICAgIC0+ICA2MTcyNiBJbmV4YWN0IFJvdW5kZWQKK3JtdXgyMTQgIG11bHRpcGx5IDEyMzQ1ICA1LjAwMSAgICAgLT4gIDYxNzM3IEluZXhhY3QgUm91bmRlZAorcm11eDIxNSAgbXVsdGlwbHkgMTIzNDUgIDUuMDEgICAgICAtPiAgNjE4NDggSW5leGFjdCBSb3VuZGVkCitybXV4MjE2ICBtdWx0aXBseSAxMjM0NSAgMTIgICAgICAgIC0+ICAxLjQ4MTRFKzUgUm91bmRlZAorcm11eDIxNyAgbXVsdGlwbHkgMTIzNDUgIDEzICAgICAgICAtPiAgMS42MDQ4RSs1IEluZXhhY3QgUm91bmRlZAorcm11eDIxOCAgbXVsdGlwbHkgMTIzNTUgIDEyICAgICAgICAtPiAgMS40ODI2RSs1IFJvdW5kZWQKK3JtdXgyMTkgIG11bHRpcGx5IDEyMzU1ICAxMyAgICAgICAgLT4gIDEuNjA2MUUrNSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorcm11eDMwMSAgbXVsdGlwbHkgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3JtdXgzMDIgIG11bHRpcGx5IDEyMzQ1ICAxLjAwMDEgICAgLT4gIDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcm11eDMwMyAgbXVsdGlwbHkgMTIzNDUgIDEuMDAxICAgICAtPiAgMTIzNTcgSW5leGFjdCBSb3VuZGVkCitybXV4MzA0ICBtdWx0aXBseSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjQ2OCBJbmV4YWN0IFJvdW5kZWQKK3JtdXgzMDUgIG11bHRpcGx5IDEyMzQ1ICAxLjEgICAgICAgLT4gIDEzNTgwIEluZXhhY3QgUm91bmRlZAorcm11eDMwNiAgbXVsdGlwbHkgMTIzNDUgIDQgICAgICAgICAtPiAgNDkzODAKK3JtdXgzMDcgIG11bHRpcGx5IDEyMzQ1ICA0LjAwMDEgICAgLT4gIDQ5MzgxIEluZXhhY3QgUm91bmRlZAorcm11eDMwOCAgbXVsdGlwbHkgMTIzNDUgIDQuOSAgICAgICAtPiAgNjA0OTAgSW5leGFjdCBSb3VuZGVkCitybXV4MzA5ICBtdWx0aXBseSAxMjM0NSAgNC45OSAgICAgIC0+ICA2MTYwMiBJbmV4YWN0IFJvdW5kZWQKK3JtdXgzMTAgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5OSAgICAgLT4gIDYxNzEzIEluZXhhY3QgUm91bmRlZAorcm11eDMxMSAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5OSAgICAtPiAgNjE3MjQgSW5leGFjdCBSb3VuZGVkCitybXV4MzEyICBtdWx0aXBseSAxMjM0NSAgNSAgICAgICAgIC0+ICA2MTcyNQorcm11eDMxMyAgbXVsdGlwbHkgMTIzNDUgIDUuMDAwMSAgICAtPiAgNjE3MjYgSW5leGFjdCBSb3VuZGVkCitybXV4MzE0ICBtdWx0aXBseSAxMjM0NSAgNS4wMDEgICAgIC0+ICA2MTczNyBJbmV4YWN0IFJvdW5kZWQKK3JtdXgzMTUgIG11bHRpcGx5IDEyMzQ1ICA1LjAxICAgICAgLT4gIDYxODQ4IEluZXhhY3QgUm91bmRlZAorcm11eDMxNiAgbXVsdGlwbHkgMTIzNDUgIDEyICAgICAgICAtPiAgMS40ODE0RSs1IFJvdW5kZWQKK3JtdXgzMTcgIG11bHRpcGx5IDEyMzQ1ICAxMyAgICAgICAgLT4gIDEuNjA0OEUrNSBJbmV4YWN0IFJvdW5kZWQKK3JtdXgzMTggIG11bHRpcGx5IDEyMzU1ICAxMiAgICAgICAgLT4gIDEuNDgyNkUrNSBSb3VuZGVkCitybXV4MzE5ICBtdWx0aXBseSAxMjM1NSAgMTMgICAgICAgIC0+ICAxLjYwNjJFKzUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX3VwCitybXV4NDAxICBtdWx0aXBseSAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcm11eDQwMiAgbXVsdGlwbHkgMTIzNDUgIDEuMDAwMSAgICAtPiAgMTIzNDYgSW5leGFjdCBSb3VuZGVkCitybXV4NDAzICBtdWx0aXBseSAxMjM0NSAgMS4wMDEgICAgIC0+ICAxMjM1NyBJbmV4YWN0IFJvdW5kZWQKK3JtdXg0MDQgIG11bHRpcGx5IDEyMzQ1ICAxLjAxICAgICAgLT4gIDEyNDY4IEluZXhhY3QgUm91bmRlZAorcm11eDQwNSAgbXVsdGlwbHkgMTIzNDUgIDEuMSAgICAgICAtPiAgMTM1ODAgSW5leGFjdCBSb3VuZGVkCitybXV4NDA2ICBtdWx0aXBseSAxMjM0NSAgNCAgICAgICAgIC0+ICA0OTM4MAorcm11eDQwNyAgbXVsdGlwbHkgMTIzNDUgIDQuMDAwMSAgICAtPiAgNDkzODEgSW5leGFjdCBSb3VuZGVkCitybXV4NDA4ICBtdWx0aXBseSAxMjM0NSAgNC45ICAgICAgIC0+ICA2MDQ5MSBJbmV4YWN0IFJvdW5kZWQKK3JtdXg0MDkgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5ICAgICAgLT4gIDYxNjAyIEluZXhhY3QgUm91bmRlZAorcm11eDQxMCAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5ICAgICAtPiAgNjE3MTMgSW5leGFjdCBSb3VuZGVkCitybXV4NDExICBtdWx0aXBseSAxMjM0NSAgNC45OTk5ICAgIC0+ICA2MTcyNCBJbmV4YWN0IFJvdW5kZWQKK3JtdXg0MTIgIG11bHRpcGx5IDEyMzQ1ICA1ICAgICAgICAgLT4gIDYxNzI1CitybXV4NDEzICBtdWx0aXBseSAxMjM0NSAgNS4wMDAxICAgIC0+ICA2MTcyNiBJbmV4YWN0IFJvdW5kZWQKK3JtdXg0MTQgIG11bHRpcGx5IDEyMzQ1ICA1LjAwMSAgICAgLT4gIDYxNzM3IEluZXhhY3QgUm91bmRlZAorcm11eDQxNSAgbXVsdGlwbHkgMTIzNDUgIDUuMDEgICAgICAtPiAgNjE4NDggSW5leGFjdCBSb3VuZGVkCitybXV4NDE2ICBtdWx0aXBseSAxMjM0NSAgMTIgICAgICAgIC0+ICAxLjQ4MTRFKzUgUm91bmRlZAorcm11eDQxNyAgbXVsdGlwbHkgMTIzNDUgIDEzICAgICAgICAtPiAgMS42MDQ5RSs1IEluZXhhY3QgUm91bmRlZAorcm11eDQxOCAgbXVsdGlwbHkgMTIzNTUgIDEyICAgICAgICAtPiAgMS40ODI2RSs1IFJvdW5kZWQKK3JtdXg0MTkgIG11bHRpcGx5IDEyMzU1ICAxMyAgICAgICAgLT4gIDEuNjA2MkUrNSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IHVwCitybXV4NTAxICBtdWx0aXBseSAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcm11eDUwMiAgbXVsdGlwbHkgMTIzNDUgIDEuMDAwMSAgICAtPiAgMTIzNDcgSW5leGFjdCBSb3VuZGVkCitybXV4NTAzICBtdWx0aXBseSAxMjM0NSAgMS4wMDEgICAgIC0+ICAxMjM1OCBJbmV4YWN0IFJvdW5kZWQKK3JtdXg1MDQgIG11bHRpcGx5IDEyMzQ1ICAxLjAxICAgICAgLT4gIDEyNDY5IEluZXhhY3QgUm91bmRlZAorcm11eDUwNSAgbXVsdGlwbHkgMTIzNDUgIDEuMSAgICAgICAtPiAgMTM1ODAgSW5leGFjdCBSb3VuZGVkCitybXV4NTA2ICBtdWx0aXBseSAxMjM0NSAgNCAgICAgICAgIC0+ICA0OTM4MAorcm11eDUwNyAgbXVsdGlwbHkgMTIzNDUgIDQuMDAwMSAgICAtPiAgNDkzODIgSW5leGFjdCBSb3VuZGVkCitybXV4NTA4ICBtdWx0aXBseSAxMjM0NSAgNC45ICAgICAgIC0+ICA2MDQ5MSBJbmV4YWN0IFJvdW5kZWQKK3JtdXg1MDkgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5ICAgICAgLT4gIDYxNjAyIEluZXhhY3QgUm91bmRlZAorcm11eDUxMCAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5ICAgICAtPiAgNjE3MTMgSW5leGFjdCBSb3VuZGVkCitybXV4NTExICBtdWx0aXBseSAxMjM0NSAgNC45OTk5ICAgIC0+ICA2MTcyNCBJbmV4YWN0IFJvdW5kZWQKK3JtdXg1MTIgIG11bHRpcGx5IDEyMzQ1ICA1ICAgICAgICAgLT4gIDYxNzI1CitybXV4NTEzICBtdWx0aXBseSAxMjM0NSAgNS4wMDAxICAgIC0+ICA2MTcyNyBJbmV4YWN0IFJvdW5kZWQKK3JtdXg1MTQgIG11bHRpcGx5IDEyMzQ1ICA1LjAwMSAgICAgLT4gIDYxNzM4IEluZXhhY3QgUm91bmRlZAorcm11eDUxNSAgbXVsdGlwbHkgMTIzNDUgIDUuMDEgICAgICAtPiAgNjE4NDkgSW5leGFjdCBSb3VuZGVkCitybXV4NTE2ICBtdWx0aXBseSAxMjM0NSAgMTIgICAgICAgIC0+ICAxLjQ4MTRFKzUgUm91bmRlZAorcm11eDUxNyAgbXVsdGlwbHkgMTIzNDUgIDEzICAgICAgICAtPiAgMS42MDQ5RSs1IEluZXhhY3QgUm91bmRlZAorcm11eDUxOCAgbXVsdGlwbHkgMTIzNTUgIDEyICAgICAgICAtPiAgMS40ODI2RSs1IFJvdW5kZWQKK3JtdXg1MTkgIG11bHRpcGx5IDEyMzU1ICAxMyAgICAgICAgLT4gIDEuNjA2MkUrNSBJbmV4YWN0IFJvdW5kZWQKKy0tIFtybXV4NTE2ICYgcm11eDUxOF0gY2FuIHN1cnByaXNlCisKK3JvdW5kaW5nOiBmbG9vcgorcm11eDYwMSAgbXVsdGlwbHkgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3JtdXg2MDIgIG11bHRpcGx5IDEyMzQ1ICAxLjAwMDEgICAgLT4gIDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcm11eDYwMyAgbXVsdGlwbHkgMTIzNDUgIDEuMDAxICAgICAtPiAgMTIzNTcgSW5leGFjdCBSb3VuZGVkCitybXV4NjA0ICBtdWx0aXBseSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjQ2OCBJbmV4YWN0IFJvdW5kZWQKK3JtdXg2MDUgIG11bHRpcGx5IDEyMzQ1ICAxLjEgICAgICAgLT4gIDEzNTc5IEluZXhhY3QgUm91bmRlZAorcm11eDYwNiAgbXVsdGlwbHkgMTIzNDUgIDQgICAgICAgICAtPiAgNDkzODAKK3JtdXg2MDcgIG11bHRpcGx5IDEyMzQ1ICA0LjAwMDEgICAgLT4gIDQ5MzgxIEluZXhhY3QgUm91bmRlZAorcm11eDYwOCAgbXVsdGlwbHkgMTIzNDUgIDQuOSAgICAgICAtPiAgNjA0OTAgSW5leGFjdCBSb3VuZGVkCitybXV4NjA5ICBtdWx0aXBseSAxMjM0NSAgNC45OSAgICAgIC0+ICA2MTYwMSBJbmV4YWN0IFJvdW5kZWQKK3JtdXg2MTAgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5OSAgICAgLT4gIDYxNzEyIEluZXhhY3QgUm91bmRlZAorcm11eDYxMSAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5OSAgICAtPiAgNjE3MjMgSW5leGFjdCBSb3VuZGVkCitybXV4NjEyICBtdWx0aXBseSAxMjM0NSAgNSAgICAgICAgIC0+ICA2MTcyNQorcm11eDYxMyAgbXVsdGlwbHkgMTIzNDUgIDUuMDAwMSAgICAtPiAgNjE3MjYgSW5leGFjdCBSb3VuZGVkCitybXV4NjE0ICBtdWx0aXBseSAxMjM0NSAgNS4wMDEgICAgIC0+ICA2MTczNyBJbmV4YWN0IFJvdW5kZWQKK3JtdXg2MTUgIG11bHRpcGx5IDEyMzQ1ICA1LjAxICAgICAgLT4gIDYxODQ4IEluZXhhY3QgUm91bmRlZAorcm11eDYxNiAgbXVsdGlwbHkgMTIzNDUgIDEyICAgICAgICAtPiAgMS40ODE0RSs1IFJvdW5kZWQKK3JtdXg2MTcgIG11bHRpcGx5IDEyMzQ1ICAxMyAgICAgICAgLT4gIDEuNjA0OEUrNSBJbmV4YWN0IFJvdW5kZWQKK3JtdXg2MTggIG11bHRpcGx5IDEyMzU1ICAxMiAgICAgICAgLT4gIDEuNDgyNkUrNSBSb3VuZGVkCitybXV4NjE5ICBtdWx0aXBseSAxMjM1NSAgMTMgICAgICAgIC0+ICAxLjYwNjFFKzUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBjZWlsaW5nCitybXV4NzAxICBtdWx0aXBseSAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcm11eDcwMiAgbXVsdGlwbHkgMTIzNDUgIDEuMDAwMSAgICAtPiAgMTIzNDcgSW5leGFjdCBSb3VuZGVkCitybXV4NzAzICBtdWx0aXBseSAxMjM0NSAgMS4wMDEgICAgIC0+ICAxMjM1OCBJbmV4YWN0IFJvdW5kZWQKK3JtdXg3MDQgIG11bHRpcGx5IDEyMzQ1ICAxLjAxICAgICAgLT4gIDEyNDY5IEluZXhhY3QgUm91bmRlZAorcm11eDcwNSAgbXVsdGlwbHkgMTIzNDUgIDEuMSAgICAgICAtPiAgMTM1ODAgSW5leGFjdCBSb3VuZGVkCitybXV4NzA2ICBtdWx0aXBseSAxMjM0NSAgNCAgICAgICAgIC0+ICA0OTM4MAorcm11eDcwNyAgbXVsdGlwbHkgMTIzNDUgIDQuMDAwMSAgICAtPiAgNDkzODIgSW5leGFjdCBSb3VuZGVkCitybXV4NzA4ICBtdWx0aXBseSAxMjM0NSAgNC45ICAgICAgIC0+ICA2MDQ5MSBJbmV4YWN0IFJvdW5kZWQKK3JtdXg3MDkgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5ICAgICAgLT4gIDYxNjAyIEluZXhhY3QgUm91bmRlZAorcm11eDcxMCAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5ICAgICAtPiAgNjE3MTMgSW5leGFjdCBSb3VuZGVkCitybXV4NzExICBtdWx0aXBseSAxMjM0NSAgNC45OTk5ICAgIC0+ICA2MTcyNCBJbmV4YWN0IFJvdW5kZWQKK3JtdXg3MTIgIG11bHRpcGx5IDEyMzQ1ICA1ICAgICAgICAgLT4gIDYxNzI1CitybXV4NzEzICBtdWx0aXBseSAxMjM0NSAgNS4wMDAxICAgIC0+ICA2MTcyNyBJbmV4YWN0IFJvdW5kZWQKK3JtdXg3MTQgIG11bHRpcGx5IDEyMzQ1ICA1LjAwMSAgICAgLT4gIDYxNzM4IEluZXhhY3QgUm91bmRlZAorcm11eDcxNSAgbXVsdGlwbHkgMTIzNDUgIDUuMDEgICAgICAtPiAgNjE4NDkgSW5leGFjdCBSb3VuZGVkCitybXV4NzE2ICBtdWx0aXBseSAxMjM0NSAgMTIgICAgICAgIC0+ICAxLjQ4MTRFKzUgUm91bmRlZAorcm11eDcxNyAgbXVsdGlwbHkgMTIzNDUgIDEzICAgICAgICAtPiAgMS42MDQ5RSs1IEluZXhhY3QgUm91bmRlZAorcm11eDcxOCAgbXVsdGlwbHkgMTIzNTUgIDEyICAgICAgICAtPiAgMS40ODI2RSs1IFJvdW5kZWQKK3JtdXg3MTkgIG11bHRpcGx5IDEyMzU1ICAxMyAgICAgICAgLT4gIDEuNjA2MkUrNSBJbmV4YWN0IFJvdW5kZWQKKworLS0gUG93ZXIgb3BlcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcm91bmRpbmc6IGRvd24KK3Jwb3gxMDEgIHBvd2VyIDEyMzQ1ICAtNSAgICAgICAgLT4gIDMuNDg3N0UtMjEgSW5leGFjdCBSb3VuZGVkCitycG94MTAyICBwb3dlciAxMjM0NSAgLTQgICAgICAgIC0+ICA0LjMwNTZFLTE3IEluZXhhY3QgUm91bmRlZAorcnBveDEwMyAgcG93ZXIgMTIzNDUgIC0zICAgICAgICAtPiAgNS4zMTUyRS0xMyBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gxMDQgIHBvd2VyIDEyMzQ1ICAtMiAgICAgICAgLT4gIDYuNTYxN0UtOSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gxMDUgIHBvd2VyIDEyMzQ1ICAtMSAgICAgICAgLT4gIDAuMDAwMDgxMDA0IEluZXhhY3QgUm91bmRlZAorcnBveDEwNiAgcG93ZXIgMTIzNDUgIDAgICAgICAgICAtPiAgMQorcnBveDEwNyAgcG93ZXIgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3Jwb3gxMDggIHBvd2VyIDEyMzQ1ICAyICAgICAgICAgLT4gIDEuNTIzOUUrOCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gxMDkgIHBvd2VyIDEyMzQ1ICAzICAgICAgICAgLT4gIDEuODgxM0UrMTIgSW5leGFjdCBSb3VuZGVkCitycG94MTEwICBwb3dlciAxMjM0NSAgNCAgICAgICAgIC0+ICAyLjMyMjVFKzE2IEluZXhhY3QgUm91bmRlZAorcnBveDExMSAgcG93ZXIgMTIzNDUgIDUgICAgICAgICAtPiAgMi44NjcxRSsyMCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gxMTIgIHBvd2VyICAgNDE1ICAyICAgICAgICAgLT4gIDEuNzIyMkUrNSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gxMTMgIHBvd2VyICAgIDc1ICAzICAgICAgICAgLT4gIDQuMjE4N0UrNSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZG93bgorcnBveDIwMSAgcG93ZXIgMTIzNDUgIC01ICAgICAgICAtPiAgMy40ODc3RS0yMSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gyMDIgIHBvd2VyIDEyMzQ1ICAtNCAgICAgICAgLT4gIDQuMzA1NkUtMTcgSW5leGFjdCBSb3VuZGVkCitycG94MjAzICBwb3dlciAxMjM0NSAgLTMgICAgICAgIC0+ICA1LjMxNTNFLTEzIEluZXhhY3QgUm91bmRlZAorcnBveDIwNCAgcG93ZXIgMTIzNDUgIC0yICAgICAgICAtPiAgNi41NjE3RS05IEluZXhhY3QgUm91bmRlZAorcnBveDIwNSAgcG93ZXIgMTIzNDUgIC0xICAgICAgICAtPiAgMC4wMDAwODEwMDQgSW5leGFjdCBSb3VuZGVkCitycG94MjA2ICBwb3dlciAxMjM0NSAgMCAgICAgICAgIC0+ICAxCitycG94MjA3ICBwb3dlciAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcnBveDIwOCAgcG93ZXIgMTIzNDUgIDIgICAgICAgICAtPiAgMS41MjQwRSs4IEluZXhhY3QgUm91bmRlZAorcnBveDIwOSAgcG93ZXIgMTIzNDUgIDMgICAgICAgICAtPiAgMS44ODE0RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gyMTAgIHBvd2VyIDEyMzQ1ICA0ICAgICAgICAgLT4gIDIuMzIyNUUrMTYgSW5leGFjdCBSb3VuZGVkCitycG94MjExICBwb3dlciAxMjM0NSAgNSAgICAgICAgIC0+ICAyLjg2NzJFKzIwIEluZXhhY3QgUm91bmRlZAorcnBveDIxMiAgcG93ZXIgICA0MTUgIDIgICAgICAgICAtPiAgMS43MjIyRSs1IEluZXhhY3QgUm91bmRlZAorcnBveDIxMyAgcG93ZXIgICAgNzUgIDMgICAgICAgICAtPiAgNC4yMTg3RSs1IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCitycG94MzAxICBwb3dlciAxMjM0NSAgLTUgICAgICAgIC0+ICAzLjQ4NzdFLTIxIEluZXhhY3QgUm91bmRlZAorcnBveDMwMiAgcG93ZXIgMTIzNDUgIC00ICAgICAgICAtPiAgNC4zMDU2RS0xNyBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gzMDMgIHBvd2VyIDEyMzQ1ICAtMyAgICAgICAgLT4gIDUuMzE1M0UtMTMgSW5leGFjdCBSb3VuZGVkCitycG94MzA0ICBwb3dlciAxMjM0NSAgLTIgICAgICAgIC0+ICA2LjU2MTdFLTkgSW5leGFjdCBSb3VuZGVkCitycG94MzA1ICBwb3dlciAxMjM0NSAgLTEgICAgICAgIC0+ICAwLjAwMDA4MTAwNCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gzMDYgIHBvd2VyIDEyMzQ1ICAwICAgICAgICAgLT4gIDEKK3Jwb3gzMDcgIHBvd2VyIDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CitycG94MzA4ICBwb3dlciAxMjM0NSAgMiAgICAgICAgIC0+ICAxLjUyNDBFKzggSW5leGFjdCBSb3VuZGVkCitycG94MzA5ICBwb3dlciAxMjM0NSAgMyAgICAgICAgIC0+ICAxLjg4MTRFKzEyIEluZXhhY3QgUm91bmRlZAorcnBveDMxMCAgcG93ZXIgMTIzNDUgIDQgICAgICAgICAtPiAgMi4zMjI1RSsxNiBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gzMTEgIHBvd2VyIDEyMzQ1ICA1ICAgICAgICAgLT4gIDIuODY3MkUrMjAgSW5leGFjdCBSb3VuZGVkCitycG94MzEyICBwb3dlciAgIDQxNSAgMiAgICAgICAgIC0+ICAxLjcyMjJFKzUgSW5leGFjdCBSb3VuZGVkCitycG94MzEzICBwb3dlciAgICA3NSAgMyAgICAgICAgIC0+ICA0LjIxODhFKzUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX3VwCitycG94NDAxICBwb3dlciAxMjM0NSAgLTUgICAgICAgIC0+ICAzLjQ4NzdFLTIxIEluZXhhY3QgUm91bmRlZAorcnBveDQwMiAgcG93ZXIgMTIzNDUgIC00ICAgICAgICAtPiAgNC4zMDU2RS0xNyBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g0MDMgIHBvd2VyIDEyMzQ1ICAtMyAgICAgICAgLT4gIDUuMzE1M0UtMTMgSW5leGFjdCBSb3VuZGVkCitycG94NDA0ICBwb3dlciAxMjM0NSAgLTIgICAgICAgIC0+ICA2LjU2MTdFLTkgSW5leGFjdCBSb3VuZGVkCitycG94NDA1ICBwb3dlciAxMjM0NSAgLTEgICAgICAgIC0+ICAwLjAwMDA4MTAwNCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g0MDYgIHBvd2VyIDEyMzQ1ICAwICAgICAgICAgLT4gIDEKK3Jwb3g0MDcgIHBvd2VyIDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CitycG94NDA4ICBwb3dlciAxMjM0NSAgMiAgICAgICAgIC0+ICAxLjUyNDBFKzggSW5leGFjdCBSb3VuZGVkCitycG94NDA5ICBwb3dlciAxMjM0NSAgMyAgICAgICAgIC0+ICAxLjg4MTRFKzEyIEluZXhhY3QgUm91bmRlZAorcnBveDQxMCAgcG93ZXIgMTIzNDUgIDQgICAgICAgICAtPiAgMi4zMjI1RSsxNiBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g0MTEgIHBvd2VyIDEyMzQ1ICA1ICAgICAgICAgLT4gIDIuODY3MkUrMjAgSW5leGFjdCBSb3VuZGVkCitycG94NDEyICBwb3dlciAgIDQxNSAgMiAgICAgICAgIC0+ICAxLjcyMjNFKzUgSW5leGFjdCBSb3VuZGVkCitycG94NDEzICBwb3dlciAgICA3NSAgMyAgICAgICAgIC0+ICA0LjIxODhFKzUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiB1cAorcnBveDUwMSAgcG93ZXIgMTIzNDUgIC01ICAgICAgICAtPiAgMy40ODc4RS0yMSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g1MDIgIHBvd2VyIDEyMzQ1ICAtNCAgICAgICAgLT4gIDQuMzA1N0UtMTcgSW5leGFjdCBSb3VuZGVkCitycG94NTAzICBwb3dlciAxMjM0NSAgLTMgICAgICAgIC0+ICA1LjMxNTNFLTEzIEluZXhhY3QgUm91bmRlZAorcnBveDUwNCAgcG93ZXIgMTIzNDUgIC0yICAgICAgICAtPiAgNi41NjE4RS05IEluZXhhY3QgUm91bmRlZAorcnBveDUwNSAgcG93ZXIgMTIzNDUgIC0xICAgICAgICAtPiAgMC4wMDAwODEwMDUgSW5leGFjdCBSb3VuZGVkCitycG94NTA2ICBwb3dlciAxMjM0NSAgMCAgICAgICAgIC0+ICAxCitycG94NTA3ICBwb3dlciAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcnBveDUwOCAgcG93ZXIgMTIzNDUgIDIgICAgICAgICAtPiAgMS41MjQwRSs4IEluZXhhY3QgUm91bmRlZAorcnBveDUwOSAgcG93ZXIgMTIzNDUgIDMgICAgICAgICAtPiAgMS44ODE0RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g1MTAgIHBvd2VyIDEyMzQ1ICA0ICAgICAgICAgLT4gIDIuMzIyNkUrMTYgSW5leGFjdCBSb3VuZGVkCitycG94NTExICBwb3dlciAxMjM0NSAgNSAgICAgICAgIC0+ICAyLjg2NzJFKzIwIEluZXhhY3QgUm91bmRlZAorcnBveDUxMiAgcG93ZXIgICA0MTUgIDIgICAgICAgICAtPiAgMS43MjIzRSs1IEluZXhhY3QgUm91bmRlZAorcnBveDUxMyAgcG93ZXIgICAgNzUgIDMgICAgICAgICAtPiAgNC4yMTg4RSs1IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZmxvb3IKK3Jwb3g2MDEgIHBvd2VyIDEyMzQ1ICAtNSAgICAgICAgLT4gIDMuNDg3N0UtMjEgSW5leGFjdCBSb3VuZGVkCitycG94NjAyICBwb3dlciAxMjM0NSAgLTQgICAgICAgIC0+ICA0LjMwNTZFLTE3IEluZXhhY3QgUm91bmRlZAorcnBveDYwMyAgcG93ZXIgMTIzNDUgIC0zICAgICAgICAtPiAgNS4zMTUyRS0xMyBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g2MDQgIHBvd2VyIDEyMzQ1ICAtMiAgICAgICAgLT4gIDYuNTYxN0UtOSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g2MDUgIHBvd2VyIDEyMzQ1ICAtMSAgICAgICAgLT4gIDAuMDAwMDgxMDA0IEluZXhhY3QgUm91bmRlZAorcnBveDYwNiAgcG93ZXIgMTIzNDUgIDAgICAgICAgICAtPiAgMQorcnBveDYwNyAgcG93ZXIgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3Jwb3g2MDggIHBvd2VyIDEyMzQ1ICAyICAgICAgICAgLT4gIDEuNTIzOUUrOCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g2MDkgIHBvd2VyIDEyMzQ1ICAzICAgICAgICAgLT4gIDEuODgxM0UrMTIgSW5leGFjdCBSb3VuZGVkCitycG94NjEwICBwb3dlciAxMjM0NSAgNCAgICAgICAgIC0+ICAyLjMyMjVFKzE2IEluZXhhY3QgUm91bmRlZAorcnBveDYxMSAgcG93ZXIgMTIzNDUgIDUgICAgICAgICAtPiAgMi44NjcxRSsyMCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g2MTIgIHBvd2VyICAgNDE1ICAyICAgICAgICAgLT4gIDEuNzIyMkUrNSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g2MTMgIHBvd2VyICAgIDc1ICAzICAgICAgICAgLT4gIDQuMjE4N0UrNSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGNlaWxpbmcKK3Jwb3g3MDEgIHBvd2VyIDEyMzQ1ICAtNSAgICAgICAgLT4gIDMuNDg3OEUtMjEgSW5leGFjdCBSb3VuZGVkCitycG94NzAyICBwb3dlciAxMjM0NSAgLTQgICAgICAgIC0+ICA0LjMwNTdFLTE3IEluZXhhY3QgUm91bmRlZAorcnBveDcwMyAgcG93ZXIgMTIzNDUgIC0zICAgICAgICAtPiAgNS4zMTUzRS0xMyBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g3MDQgIHBvd2VyIDEyMzQ1ICAtMiAgICAgICAgLT4gIDYuNTYxOEUtOSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g3MDUgIHBvd2VyIDEyMzQ1ICAtMSAgICAgICAgLT4gIDAuMDAwMDgxMDA1IEluZXhhY3QgUm91bmRlZAorcnBveDcwNiAgcG93ZXIgMTIzNDUgIDAgICAgICAgICAtPiAgMQorcnBveDcwNyAgcG93ZXIgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3Jwb3g3MDggIHBvd2VyIDEyMzQ1ICAyICAgICAgICAgLT4gIDEuNTI0MEUrOCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g3MDkgIHBvd2VyIDEyMzQ1ICAzICAgICAgICAgLT4gIDEuODgxNEUrMTIgSW5leGFjdCBSb3VuZGVkCitycG94NzEwICBwb3dlciAxMjM0NSAgNCAgICAgICAgIC0+ICAyLjMyMjZFKzE2IEluZXhhY3QgUm91bmRlZAorcnBveDcxMSAgcG93ZXIgMTIzNDUgIDUgICAgICAgICAtPiAgMi44NjcyRSsyMCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g3MTIgIHBvd2VyICAgNDE1ICAyICAgICAgICAgLT4gIDEuNzIyM0UrNSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g3MTMgIHBvd2VyICAgIDc1ICAzICAgICAgICAgLT4gIDQuMjE4OEUrNSBJbmV4YWN0IFJvdW5kZWQKKworLS0gVW5kZXJmbG93IFN1Ym5vcm1hbCBhbmQgb3ZlcmZsb3cgdmFsdWVzIHZhcnkgd2l0aCByb3VuZGluZyBtb2RlIGFuZCBzaWduCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcm91bmRpbmc6IGRvd24KK3JvdngxMDAgIG11bHRpcGx5ICAgMTAgICAgOUUrOTk5OTk5OTk5IC0+ICA5Ljk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngxMDEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC05Ljk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngxMDIgIGRpdmlkZSAgICAgMUUtOSAgOUUrOTk5OTk5OTk5IC0+ICAwRS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JvdngxMDQgIGRpdmlkZSAgICAtMUUtOSAgOUUrOTk5OTk5OTk5IC0+IC0wRS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworcm91bmRpbmc6IHVwCityb3Z4MTEwICBtdWx0aXBseSAgIDEwICAgIDlFKzk5OTk5OTk5OSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3Z4MTExICBtdWx0aXBseSAgLTEwICAgIDlFKzk5OTk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3Z4MTEyICBkaXZpZGUgICAgIDFFLTkgIDlFKzk5OTk5OTk5OSAtPiAgMUUtMTAwMDAwMDAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcm92eDExNCAgZGl2aWRlICAgIC0xRS05ICA5RSs5OTk5OTk5OTkgLT4gLTFFLTEwMDAwMDAwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGNlaWxpbmcKK3JvdngxMjAgIG11bHRpcGx5ICAgMTAgICAgOUUrOTk5OTk5OTk5IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngxMjEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC05Ljk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngxMjIgIGRpdmlkZSAgICAgMUUtOSAgOUUrOTk5OTk5OTk5IC0+ICAxRS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCityb3Z4MTI0ICBkaXZpZGUgICAgLTFFLTkgIDlFKzk5OTk5OTk5OSAtPiAtMEUtMTAwMDAwMDAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK3JvdW5kaW5nOiBmbG9vcgorcm92eDEzMCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIDkuOTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDEzMSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDEzMiAgZGl2aWRlICAgICAxRS05ICA5RSs5OTk5OTk5OTkgLT4gIDBFLTEwMDAwMDAwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcm92eDEzNCAgZGl2aWRlICAgIC0xRS05ICA5RSs5OTk5OTk5OTkgLT4gLTFFLTEwMDAwMDAwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK3JvdngxNDAgIG11bHRpcGx5ICAgMTAgICAgOUUrOTk5OTk5OTk5IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngxNDEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngxNDIgIGRpdmlkZSAgICAgMUUtOSAgOUUrOTk5OTk5OTk5IC0+ICAwRS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JvdngxNDQgIGRpdmlkZSAgICAtMUUtOSAgOUUrOTk5OTk5OTk5IC0+IC0wRS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorcm92eDE1MCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDE1MSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDE1MiAgZGl2aWRlICAgICAxRS05ICA5RSs5OTk5OTk5OTkgLT4gIDBFLTEwMDAwMDAwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcm92eDE1NCAgZGl2aWRlICAgIC0xRS05ICA5RSs5OTk5OTk5OTkgLT4gLTBFLTEwMDAwMDAwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCityb3VuZGluZzogaGFsZl9kb3duCityb3Z4MTYwICBtdWx0aXBseSAgIDEwICAgIDlFKzk5OTk5OTk5OSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3Z4MTYxICBtdWx0aXBseSAgLTEwICAgIDlFKzk5OTk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3Z4MTYyICBkaXZpZGUgICAgIDFFLTkgIDlFKzk5OTk5OTk5OSAtPiAgMEUtMTAwMDAwMDAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityb3Z4MTY0ICBkaXZpZGUgICAgLTFFLTkgIDlFKzk5OTk5OTk5OSAtPiAtMEUtMTAwMDAwMDAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIGNoZWNrIG1heGltdW0gZmluaXRlIHZhbHVlIG92ZXIgYSByYW5nZSBvZiBwcmVjaXNpb25zCityb3VuZGluZzogZG93bgorcHJlY2lzaW9uOiAxCityb3Z4MjAwICBtdWx0aXBseSAgIDEwICAgIDlFKzk5OTk5OTk5OSAtPiAgOUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDIwMSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMgorcm92eDIxMCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIDkuOUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDIxMSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLTkuOUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzCityb3Z4MjIwICBtdWx0aXBseSAgIDEwICAgIDlFKzk5OTk5OTk5OSAtPiAgOS45OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDIyMSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLTkuOTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNAorcm92eDIzMCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIDkuOTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3Z4MjMxICBtdWx0aXBseSAgLTEwICAgIDlFKzk5OTk5OTk5OSAtPiAtOS45OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNQorcm92eDI0MCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIDkuOTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDI0MSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLTkuOTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA2Cityb3Z4MjUwICBtdWx0aXBseSAgIDEwICAgIDlFKzk5OTk5OTk5OSAtPiAgOS45OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDI1MSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLTkuOTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNworcm92eDI2MCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIDkuOTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3Z4MjYxICBtdWx0aXBseSAgLTEwICAgIDlFKzk5OTk5OTk5OSAtPiAtOS45OTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogOAorcm92eDI3MCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIDkuOTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDI3MSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLTkuOTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA5Cityb3Z4MjgwICBtdWx0aXBseSAgIDEwICAgIDlFKzk5OTk5OTk5OSAtPiAgOS45OTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDI4MSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLTkuOTk5OTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTAKK3JvdngyOTAgIG11bHRpcGx5ICAgMTAgICAgOUUrOTk5OTk5OTk5IC0+ICA5Ljk5OTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDI5MSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLTkuOTk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tIHJlcHJpc2Ugcm91bmRpbmcgbW9kZSBlZmZlY3QgKHVzaW5nIG11bHRpcGxpZXMgc28gcHJlY2lzaW9uIGRpcmVjdGl2ZSB1c2VkKQorcHJlY2lzaW9uOiA5CittYXhleHBvbmVudDogOTk5OTk5OTk5Cityb3VuZGluZzogaGFsZl91cAorcm1leDQwMCBtdWx0aXBseSAtOS45OTlFKzk5OTk5OTk5OSAxMCAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitybWV4NDAxIG11bHRpcGx5ICA5Ljk5OUUrOTk5OTk5OTk5IDEwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK3JtZXg0MDIgbXVsdGlwbHkgLTkuOTk5RSs5OTk5OTk5OTkgMTAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm1leDQwMyBtdWx0aXBseSAgOS45OTlFKzk5OTk5OTk5OSAxMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9ldmVuCitybWV4NDA0IG11bHRpcGx5IC05Ljk5OUUrOTk5OTk5OTk5IDEwIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JtZXg0MDUgbXVsdGlwbHkgIDkuOTk5RSs5OTk5OTk5OTkgMTAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGZsb29yCitybWV4NDA2IG11bHRpcGx5IC05Ljk5OUUrOTk5OTk5OTk5IDEwIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JtZXg0MDcgbXVsdGlwbHkgIDkuOTk5RSs5OTk5OTk5OTkgMTAgLT4gIDkuOTk5OTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBjZWlsaW5nCitybWV4NDA4IG11bHRpcGx5IC05Ljk5OUUrOTk5OTk5OTk5IDEwIC0+IC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitybWV4NDA5IG11bHRpcGx5ICA5Ljk5OUUrOTk5OTk5OTk5IDEwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiB1cAorcm1leDQxMCBtdWx0aXBseSAtOS45OTlFKzk5OTk5OTk5OSAxMCAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitybWV4NDExIG11bHRpcGx5ICA5Ljk5OUUrOTk5OTk5OTk5IDEwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBkb3duCitybWV4NDEyIG11bHRpcGx5IC05Ljk5OUUrOTk5OTk5OTk5IDEwIC0+IC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitybWV4NDEzIG11bHRpcGx5ICA5Ljk5OUUrOTk5OTk5OTk5IDEwIC0+ICA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tLS0tIFJvdW5kLWZvci1yZXJvdW5kIC0tLS0tCityb3VuZGluZzogICAgMDV1cAorcHJlY2lzaW9uOiAgIDUgICAgICAgICAgIC0tIGZvciBlYXNpZXIgdmlzdWFsIGluc3BlY3Rpb24KK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CisKKy0tIGJhc2ljIHJvdW5kaW5nOyByZWFsbHkgaXMganVzdCAwIGFuZCA1IHVwCityMDV1cDAwMSBhZGQgMTIzNDAgIDAuMDAxICAgICAtPiAxMjM0MSBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDAyIGFkZCAxMjM0MSAgMC4wMDEgICAgIC0+IDEyMzQxIEluZXhhY3QgUm91bmRlZAorcjA1dXAwMDMgYWRkIDEyMzQyICAwLjAwMSAgICAgLT4gMTIzNDIgSW5leGFjdCBSb3VuZGVkCityMDV1cDAwNCBhZGQgMTIzNDMgIDAuMDAxICAgICAtPiAxMjM0MyBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDA1IGFkZCAxMjM0NCAgMC4wMDEgICAgIC0+IDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcjA1dXAwMDYgYWRkIDEyMzQ1ICAwLjAwMSAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMDV1cDAwNyBhZGQgMTIzNDYgIDAuMDAxICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDA4IGFkZCAxMjM0NyAgMC4wMDEgICAgIC0+IDEyMzQ3IEluZXhhY3QgUm91bmRlZAorcjA1dXAwMDkgYWRkIDEyMzQ4ICAwLjAwMSAgICAgLT4gMTIzNDggSW5leGFjdCBSb3VuZGVkCityMDV1cDAxMCBhZGQgMTIzNDkgIDAuMDAxICAgICAtPiAxMjM0OSBJbmV4YWN0IFJvdW5kZWQKKworcjA1dXAwMTEgYWRkIDEyMzQwICAwLjAwMCAgICAgLT4gMTIzNDAgUm91bmRlZAorcjA1dXAwMTIgYWRkIDEyMzQxICAwLjAwMCAgICAgLT4gMTIzNDEgUm91bmRlZAorcjA1dXAwMTMgYWRkIDEyMzQyICAwLjAwMCAgICAgLT4gMTIzNDIgUm91bmRlZAorcjA1dXAwMTQgYWRkIDEyMzQzICAwLjAwMCAgICAgLT4gMTIzNDMgUm91bmRlZAorcjA1dXAwMTUgYWRkIDEyMzQ0ICAwLjAwMCAgICAgLT4gMTIzNDQgUm91bmRlZAorcjA1dXAwMTYgYWRkIDEyMzQ1ICAwLjAwMCAgICAgLT4gMTIzNDUgUm91bmRlZAorcjA1dXAwMTcgYWRkIDEyMzQ2ICAwLjAwMCAgICAgLT4gMTIzNDYgUm91bmRlZAorcjA1dXAwMTggYWRkIDEyMzQ3ICAwLjAwMCAgICAgLT4gMTIzNDcgUm91bmRlZAorcjA1dXAwMTkgYWRkIDEyMzQ4ICAwLjAwMCAgICAgLT4gMTIzNDggUm91bmRlZAorcjA1dXAwMjAgYWRkIDEyMzQ5ICAwLjAwMCAgICAgLT4gMTIzNDkgUm91bmRlZAorCityMDV1cDAyMSBhZGQgMTIzNDAgIDAuOTAxICAgICAtPiAxMjM0MSBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDIyIGFkZCAxMjM0MSAgMC45MDEgICAgIC0+IDEyMzQxIEluZXhhY3QgUm91bmRlZAorcjA1dXAwMjMgYWRkIDEyMzQyICAwLjkwMSAgICAgLT4gMTIzNDIgSW5leGFjdCBSb3VuZGVkCityMDV1cDAyNCBhZGQgMTIzNDMgIDAuOTAxICAgICAtPiAxMjM0MyBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDI1IGFkZCAxMjM0NCAgMC45MDEgICAgIC0+IDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcjA1dXAwMjYgYWRkIDEyMzQ1ICAwLjkwMSAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMDV1cDAyNyBhZGQgMTIzNDYgIDAuOTAxICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDI4IGFkZCAxMjM0NyAgMC45MDEgICAgIC0+IDEyMzQ3IEluZXhhY3QgUm91bmRlZAorcjA1dXAwMjkgYWRkIDEyMzQ4ICAwLjkwMSAgICAgLT4gMTIzNDggSW5leGFjdCBSb3VuZGVkCityMDV1cDAzMCBhZGQgMTIzNDkgIDAuOTAxICAgICAtPiAxMjM0OSBJbmV4YWN0IFJvdW5kZWQKKworcjA1dXAwMzEgYWRkIC0xMjM0MCAgLTAuMDAxICAgICAtPiAtMTIzNDEgSW5leGFjdCBSb3VuZGVkCityMDV1cDAzMiBhZGQgLTEyMzQxICAtMC4wMDEgICAgIC0+IC0xMjM0MSBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDMzIGFkZCAtMTIzNDIgIC0wLjAwMSAgICAgLT4gLTEyMzQyIEluZXhhY3QgUm91bmRlZAorcjA1dXAwMzQgYWRkIC0xMjM0MyAgLTAuMDAxICAgICAtPiAtMTIzNDMgSW5leGFjdCBSb3VuZGVkCityMDV1cDAzNSBhZGQgLTEyMzQ0ICAtMC4wMDEgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDM2IGFkZCAtMTIzNDUgIC0wLjAwMSAgICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjA1dXAwMzcgYWRkIC0xMjM0NiAgLTAuMDAxICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMDV1cDAzOCBhZGQgLTEyMzQ3ICAtMC4wMDEgICAgIC0+IC0xMjM0NyBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDM5IGFkZCAtMTIzNDggIC0wLjAwMSAgICAgLT4gLTEyMzQ4IEluZXhhY3QgUm91bmRlZAorcjA1dXAwNDAgYWRkIC0xMjM0OSAgLTAuMDAxICAgICAtPiAtMTIzNDkgSW5leGFjdCBSb3VuZGVkCisKK3IwNXVwMDQxIGFkZCAtMTIzNDAgICAwLjAwMSAgICAgLT4gLTEyMzM5IEluZXhhY3QgUm91bmRlZAorcjA1dXAwNDIgYWRkIC0xMjM0MSAgIDAuMDAxICAgICAtPiAtMTIzNDEgSW5leGFjdCBSb3VuZGVkCityMDV1cDA0MyBhZGQgLTEyMzQyICAgMC4wMDEgICAgIC0+IC0xMjM0MSBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDQ0IGFkZCAtMTIzNDMgICAwLjAwMSAgICAgLT4gLTEyMzQyIEluZXhhY3QgUm91bmRlZAorcjA1dXAwNDUgYWRkIC0xMjM0NCAgIDAuMDAxICAgICAtPiAtMTIzNDMgSW5leGFjdCBSb3VuZGVkCityMDV1cDA0NiBhZGQgLTEyMzQ1ICAgMC4wMDEgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDQ3IGFkZCAtMTIzNDYgICAwLjAwMSAgICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjA1dXAwNDggYWRkIC0xMjM0NyAgIDAuMDAxICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMDV1cDA0OSBhZGQgLTEyMzQ4ICAgMC4wMDEgICAgIC0+IC0xMjM0NyBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDUwIGFkZCAtMTIzNDkgICAwLjAwMSAgICAgLT4gLTEyMzQ4IEluZXhhY3QgUm91bmRlZAorCistLSBBZGRpdGlvbiBvcGVyYXRvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gW1RoZSBmaXJzdCBmZXcgb2YgdGhlc2UgY2hlY2sgbmVnYXRpdmUgcmVzaWR1ZSBwb3NzaWJpbGl0aWVzOyB0aGVzZQorLS0gY2FzZXMgbWF5IGJlIGltcGxlbWVudGVkIGFzIGEgbmVnYXRpdmUgcmVzaWR1ZSBpbiBmYXN0cGF0aHNdCisKK3IwYWR4MTAwICBhZGQgMTIzNDUgLTAuMSAgICAgICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTAxICBhZGQgMTIzNDUgLTAuMDEgICAgICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTAyICBhZGQgMTIzNDUgLTAuMDAxICAgICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTAzICBhZGQgMTIzNDUgLTAuMDAwMDEgICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTA0ICBhZGQgMTIzNDUgLTAuMDAwMDAxICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTA1ICBhZGQgMTIzNDUgLTAuMDAwMDAwMSAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTA2ICBhZGQgMTIzNDUgIDAgICAgICAgICAtPiAxMjM0NQorcjBhZHgxMDcgIGFkZCAxMjM0NSAgMC4wMDAwMDAxIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBhZHgxMDggIGFkZCAxMjM0NSAgMC4wMDAwMDEgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBhZHgxMDkgIGFkZCAxMjM0NSAgMC4wMDAwMSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBhZHgxMTAgIGFkZCAxMjM0NSAgMC4wMDAxICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBhZHgxMTEgIGFkZCAxMjM0NSAgMC4wMDEgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBhZHgxMTIgIGFkZCAxMjM0NSAgMC4wMSAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBhZHgxMTMgIGFkZCAxMjM0NSAgMC4xICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorCityMGFkeDExNSAgYWRkIDEyMzQ2ICAwLjQ5OTk5ICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMGFkeDExNiAgYWRkIDEyMzQ2ICAwLjUgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMGFkeDExNyAgYWRkIDEyMzQ2ICAwLjUwMDAxICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCisKK3IwYWR4MTIwICBhZGQgMTIzNDUgIDAuNCAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTIxICBhZGQgMTIzNDUgIDAuNDkgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTIyICBhZGQgMTIzNDUgIDAuNDk5ICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTIzICBhZGQgMTIzNDUgIDAuNDk5OTkgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTI0ICBhZGQgMTIzNDUgIDAuNSAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTI1ICBhZGQgMTIzNDUgIDAuNTAwMDEgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTI2ICBhZGQgMTIzNDUgIDAuNTAwMSAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTI3ICBhZGQgMTIzNDUgIDAuNTAxICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTI4ICBhZGQgMTIzNDUgIDAuNTEgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTI5ICBhZGQgMTIzNDUgIDAuNiAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmVzLi4uCisKK3Iwc3V4MTAwICBhZGQgLTEyMzQ1IC0wLjEgICAgICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMDEgIGFkZCAtMTIzNDUgLTAuMDEgICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMHN1eDEwMiAgYWRkIC0xMjM0NSAtMC4wMDEgICAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTAzICBhZGQgLTEyMzQ1IC0wLjAwMDAxICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMDQgIGFkZCAtMTIzNDUgLTAuMDAwMDAxICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMHN1eDEwNSAgYWRkIC0xMjM0NSAtMC4wMDAwMDAxIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTA2ICBhZGQgLTEyMzQ1ICAwICAgICAgICAgLT4gLTEyMzQ1CityMHN1eDEwNyAgYWRkIC0xMjM0NSAgMC4wMDAwMDAxIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTA4ICBhZGQgLTEyMzQ1ICAwLjAwMDAwMSAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMDkgIGFkZCAtMTIzNDUgIDAuMDAwMDEgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMHN1eDExMCAgYWRkIC0xMjM0NSAgMC4wMDAxICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTExICBhZGQgLTEyMzQ1ICAwLjAwMSAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMTIgIGFkZCAtMTIzNDUgIDAuMDEgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMHN1eDExMyAgYWRkIC0xMjM0NSAgMC4xICAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKKworcjBzdXgxMTUgIGFkZCAtMTIzNDYgIDAuNDk5OTkgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMHN1eDExNiAgYWRkIC0xMjM0NiAgMC41ICAgICAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTE3ICBhZGQgLTEyMzQ2ICAwLjUwMDAxICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorCityMHN1eDEyMCAgYWRkIC0xMjM0NSAgMC40ICAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTIxICBhZGQgLTEyMzQ1ICAwLjQ5ICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMjIgIGFkZCAtMTIzNDUgIDAuNDk5ICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMHN1eDEyMyAgYWRkIC0xMjM0NSAgMC40OTk5OSAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTI0ICBhZGQgLTEyMzQ1ICAwLjUgICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMjUgIGFkZCAtMTIzNDUgIDAuNTAwMDEgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMHN1eDEyNiAgYWRkIC0xMjM0NSAgMC41MDAxICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTI3ICBhZGQgLTEyMzQ1ICAwLjUwMSAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMjggIGFkZCAtMTIzNDUgIDAuNTEgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMHN1eDEyOSAgYWRkIC0xMjM0NSAgMC42ICAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKKworLS0gQ2hlY2sgY2FuY2VsbGF0aW9uIHN1YnRyYWN0aW9ucworLS0gKFRoZSBJRUVFIDg1NCAnY3VyaW91cyBydWxlJyBpbiAkNi4zKQorCityMHpleDAwMSAgYWRkICAwICAgIDAgICAgLT4gIDAKK3IwemV4MDAyICBhZGQgIDAgICAtMCAgICAtPiAgMAorcjB6ZXgwMDMgIGFkZCAtMCAgICAwICAgIC0+ICAwCityMHpleDAwNCAgYWRkIC0wICAgLTAgICAgLT4gLTAKK3IwemV4MDA1ICBhZGQgIDEgICAtMSAgICAtPiAgMAorcjB6ZXgwMDYgIGFkZCAtMSAgICAxICAgIC0+ICAwCityMHpleDAwNyAgYWRkICAxLjUgLTEuNSAgLT4gIDAuMAorcjB6ZXgwMDggIGFkZCAtMS41ICAxLjUgIC0+ICAwLjAKK3IwemV4MDA5ICBhZGQgIDIgICAtMiAgICAtPiAgMAorcjB6ZXgwMTAgIGFkZCAtMiAgICAyICAgIC0+ICAwCisKKworLS0gRGl2aXNpb24gb3BlcmF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcjBkdngxMDEgIGRpdmlkZSAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcjBkdngxMDIgIGRpdmlkZSAxMjM0NSAgMS4wMDAxICAgIC0+ICAxMjM0MyBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTAzICBkaXZpZGUgMTIzNDUgIDEuMDAxICAgICAtPiAgMTIzMzIgSW5leGFjdCBSb3VuZGVkCityMGR2eDEwNCAgZGl2aWRlIDEyMzQ1ICAxLjAxICAgICAgLT4gIDEyMjIyIEluZXhhY3QgUm91bmRlZAorcjBkdngxMDUgIGRpdmlkZSAxMjM0NSAgMS4xICAgICAgIC0+ICAxMTIyMiBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTA2ICBkaXZpZGUgMTIzNTUgIDQgICAgICAgICAtPiAgIDMwODguNyBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTA3ICBkaXZpZGUgMTIzNDUgIDQgICAgICAgICAtPiAgIDMwODYuMiBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTA4ICBkaXZpZGUgMTIzNTUgIDQuMDAwMSAgICAtPiAgIDMwODguNiBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTA5ICBkaXZpZGUgMTIzNDUgIDQuMDAwMSAgICAtPiAgIDMwODYuMSBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTEwICBkaXZpZGUgMTIzNDUgIDQuOSAgICAgICAtPiAgIDI1MTkuMyBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTExICBkaXZpZGUgMTIzNDUgIDQuOTkgICAgICAtPiAgIDI0NzMuOSBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTEyICBkaXZpZGUgMTIzNDUgIDQuOTk5ICAgICAtPiAgIDI0NjkuNCBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTEzICBkaXZpZGUgMTIzNDUgIDQuOTk5OSAgICAtPiAgIDI0NjkuMSBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTE0ICBkaXZpZGUgMTIzNDUgIDUgICAgICAgICAtPiAgIDI0NjkKK3IwZHZ4MTE1ICBkaXZpZGUgMTIzNDUgIDUuMDAwMSAgICAtPiAgMjQ2OC45IEluZXhhY3QgUm91bmRlZAorcjBkdngxMTYgIGRpdmlkZSAxMjM0NSAgNS4wMDEgICAgIC0+ICAyNDY4LjYgSW5leGFjdCBSb3VuZGVkCityMGR2eDExNyAgZGl2aWRlIDEyMzQ1ICA1LjAxICAgICAgLT4gIDI0NjQuMSBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTE4ICBkaXZpZGUgMTIzNDUgIDUuMSAgICAgICAtPiAgMjQyMC42IEluZXhhY3QgUm91bmRlZAorCistLSBbZGl2aWRlSW50ZWdlciBhbmQgcmVtYWluZGVyIHVuYWZmZWN0ZWRdCisKKy0tIE11bHRpcGxpY2F0aW9uIG9wZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3IwbXV4MTAxICBtdWx0aXBseSAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcjBtdXgxMDIgIG11bHRpcGx5IDEyMzQ1ICAxLjAwMDEgICAgLT4gIDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBtdXgxMDMgIG11bHRpcGx5IDEyMzQ1ICAxLjAwMSAgICAgLT4gIDEyMzU3IEluZXhhY3QgUm91bmRlZAorcjBtdXgxMDQgIG11bHRpcGx5IDEyMzQ1ICAxLjAxICAgICAgLT4gIDEyNDY4IEluZXhhY3QgUm91bmRlZAorcjBtdXgxMDUgIG11bHRpcGx5IDEyMzQ1ICAxLjEgICAgICAgLT4gIDEzNTc5IEluZXhhY3QgUm91bmRlZAorcjBtdXgxMDYgIG11bHRpcGx5IDEyMzQ1ICA0ICAgICAgICAgLT4gIDQ5MzgwCityMG11eDEwNyAgbXVsdGlwbHkgMTIzNDUgIDQuMDAwMSAgICAtPiAgNDkzODEgSW5leGFjdCBSb3VuZGVkCityMG11eDEwOCAgbXVsdGlwbHkgMTIzNDUgIDQuOSAgICAgICAtPiAgNjA0OTEgSW5leGFjdCBSb3VuZGVkCityMG11eDEwOSAgbXVsdGlwbHkgMTIzNDUgIDQuOTkgICAgICAtPiAgNjE2MDEgSW5leGFjdCBSb3VuZGVkCityMG11eDExMCAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5ICAgICAtPiAgNjE3MTIgSW5leGFjdCBSb3VuZGVkCityMG11eDExMSAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5OSAgICAtPiAgNjE3MjMgSW5leGFjdCBSb3VuZGVkCityMG11eDExMiAgbXVsdGlwbHkgMTIzNDUgIDUgICAgICAgICAtPiAgNjE3MjUKK3IwbXV4MTEzICBtdWx0aXBseSAxMjM0NSAgNS4wMDAxICAgIC0+ICA2MTcyNiBJbmV4YWN0IFJvdW5kZWQKK3IwbXV4MTE0ICBtdWx0aXBseSAxMjM0NSAgNS4wMDEgICAgIC0+ICA2MTczNyBJbmV4YWN0IFJvdW5kZWQKK3IwbXV4MTE1ICBtdWx0aXBseSAxMjM0NSAgNS4wMSAgICAgIC0+ICA2MTg0OCBJbmV4YWN0IFJvdW5kZWQKK3IwbXV4MTE2ICBtdWx0aXBseSAxMjM0NSAgMTIgICAgICAgIC0+ICAxLjQ4MTRFKzUgUm91bmRlZAorcjBtdXgxMTcgIG11bHRpcGx5IDEyMzQ1ICAxMyAgICAgICAgLT4gIDEuNjA0OEUrNSBJbmV4YWN0IFJvdW5kZWQKK3IwbXV4MTE4ICBtdWx0aXBseSAxMjM1NSAgMTIgICAgICAgIC0+ICAxLjQ4MjZFKzUgUm91bmRlZAorcjBtdXgxMTkgIG11bHRpcGx5IDEyMzU1ICAxMyAgICAgICAgLT4gIDEuNjA2MUUrNSBJbmV4YWN0IFJvdW5kZWQKKworCistLSBQb3dlciBvcGVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityMHBveDEwMSAgcG93ZXIgMTIzNDUgIC01ICAgICAgICAtPiAgMy40ODc3RS0yMSBJbmV4YWN0IFJvdW5kZWQKK3IwcG94MTAyICBwb3dlciAxMjM0NSAgLTQgICAgICAgIC0+ICA0LjMwNTZFLTE3IEluZXhhY3QgUm91bmRlZAorcjBwb3gxMDMgIHBvd2VyIDEyMzQ1ICAtMyAgICAgICAgLT4gIDUuMzE1MkUtMTMgSW5leGFjdCBSb3VuZGVkCityMHBveDEwNCAgcG93ZXIgMTIzNDUgIC0yICAgICAgICAtPiAgNi41NjE3RS05IEluZXhhY3QgUm91bmRlZAorcjBwb3gxMDUgIHBvd2VyIDEyMzQ1ICAtMSAgICAgICAgLT4gIDAuMDAwMDgxMDA0IEluZXhhY3QgUm91bmRlZAorcjBwb3gxMDYgIHBvd2VyIDEyMzQ1ICAwICAgICAgICAgLT4gIDEKK3IwcG94MTA3ICBwb3dlciAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcjBwb3gxMDggIHBvd2VyIDEyMzQ1ICAyICAgICAgICAgLT4gIDEuNTIzOUUrOCBJbmV4YWN0IFJvdW5kZWQKK3IwcG94MTA5ICBwb3dlciAxMjM0NSAgMyAgICAgICAgIC0+ICAxLjg4MTNFKzEyIEluZXhhY3QgUm91bmRlZAorcjBwb3gxMTAgIHBvd2VyIDEyMzQ1ICA0ICAgICAgICAgLT4gIDIuMzIyNkUrMTYgSW5leGFjdCBSb3VuZGVkCityMHBveDExMSAgcG93ZXIgMTIzNDUgIDUgICAgICAgICAtPiAgMi44NjcxRSsyMCBJbmV4YWN0IFJvdW5kZWQKK3IwcG94MTEyICBwb3dlciAgIDQxNSAgMiAgICAgICAgIC0+ICAxLjcyMjJFKzUgSW5leGFjdCBSb3VuZGVkCityMHBveDExMyAgcG93ZXIgICAgNzUgIDMgICAgICAgICAtPiAgNC4yMTg3RSs1IEluZXhhY3QgUm91bmRlZAorCisKKy0tIFVuZGVyZmxvdyBTdWJub3JtYWwgYW5kIG92ZXJmbG93IHZhbHVlcyB2YXJ5IHdpdGggcm91bmRpbmcgbW9kZSBhbmQgc2lnbgorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKKy0tIFtyb3VuZCBkb3duIGdpdmVzIE5tYXggb24gZmlyc3QgdHdvIGFuZCAuMEUuLi4gb24gdGhlIG5leHQgdHdvXQorcjBvdngxMDAgIG11bHRpcGx5ICAgMTAgICAgOUUrOTk5OTk5OTk5IC0+ICA5Ljk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Iwb3Z4MTAxICBtdWx0aXBseSAgLTEwICAgIDlFKzk5OTk5OTk5OSAtPiAtOS45OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityMG92eDEwMiAgZGl2aWRlICAgICAxRS05ICA5RSs5OTk5OTk5OTkgLT4gIDFFLTEwMDAwMDAwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Iwb3Z4MTA0ICBkaXZpZGUgICAgLTFFLTkgIDlFKzk5OTk5OTk5OSAtPiAtMUUtMTAwMDAwMDAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLSByZXByaXNlIHJvdW5kaW5nIG1vZGUgZWZmZWN0ICh1c2luZyBtdWx0aXBsaWVzIHNvIHByZWNpc2lvbiBkaXJlY3RpdmUgdXNlZCkKK3ByZWNpc2lvbjogOQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorcjBtZXg0MTIgbXVsdGlwbHkgLTkuOTk5RSs5OTk5OTk5OTkgMTAgLT4gLTkuOTk5OTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3IwbWV4NDEzIG11bHRpcGx5ICA5Ljk5OUUrOTk5OTk5OTk5IDEwIC0+ICA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc2FtZXF1YW50dW0uZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc2FtZXF1YW50dW0uZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWIxM2ViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9zYW1lcXVhbnR1bS5kZWNUZXN0CkBAIC0wLDAgKzEsMzg5IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHNhbWVxdWFudHVtLmRlY1Rlc3QgLS0gY2hlY2sgcXVhbnR1bXMgbWF0Y2ggICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDIwMDEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworc2FtcTAwMSBzYW1lcXVhbnR1bSAgMCAgICAgIDAgICAgICAtPiAgMQorc2FtcTAwMiBzYW1lcXVhbnR1bSAgMCAgICAgIDEgICAgICAtPiAgMQorc2FtcTAwMyBzYW1lcXVhbnR1bSAgMSAgICAgIDAgICAgICAtPiAgMQorc2FtcTAwNCBzYW1lcXVhbnR1bSAgMSAgICAgIDEgICAgICAtPiAgMQorCitzYW1xMDExIHNhbWVxdWFudHVtICAxMCAgICAgMUUrMSAgIC0+IDAKK3NhbXEwMTIgc2FtZXF1YW50dW0gIDEwRSsxICAxMEUrMSAgLT4gMQorc2FtcTAxMyBzYW1lcXVhbnR1bSAgMTAwICAgIDEwRSsxICAtPiAwCitzYW1xMDE0IHNhbWVxdWFudHVtICAxMDAgICAgMUUrMiAgIC0+IDAKK3NhbXEwMTUgc2FtZXF1YW50dW0gIDAuMSAgICAxRS0yICAgLT4gMAorc2FtcTAxNiBzYW1lcXVhbnR1bSAgMC4xICAgIDFFLTEgICAtPiAxCitzYW1xMDE3IHNhbWVxdWFudHVtICAwLjEgICAgMUUtMCAgIC0+IDAKK3NhbXEwMTggc2FtZXF1YW50dW0gIDk5OSAgICA5OTkgICAgLT4gMQorc2FtcTAxOSBzYW1lcXVhbnR1bSAgOTk5RS0xIDk5LjkgICAtPiAxCitzYW1xMDIwIHNhbWVxdWFudHVtICAxMTFFLTEgMjIuMiAgIC0+IDEKK3NhbXEwMjEgc2FtZXF1YW50dW0gIDExMUUtMSAxMjM0LjIgLT4gMQorCistLSB6ZXJvcworc2FtcTAzMCBzYW1lcXVhbnR1bSAgMC4wICAgIDEuMSAgICAtPiAxCitzYW1xMDMxIHNhbWVxdWFudHVtICAwLjAgICAgMS4xMSAgIC0+IDAKK3NhbXEwMzIgc2FtZXF1YW50dW0gIDAuMCAgICAwICAgICAgLT4gMAorc2FtcTAzMyBzYW1lcXVhbnR1bSAgMC4wICAgIDAuMCAgICAtPiAxCitzYW1xMDM0IHNhbWVxdWFudHVtICAwLjAgICAgMC4wMCAgIC0+IDAKK3NhbXEwMzUgc2FtZXF1YW50dW0gIDBFKzEgICAwRSswICAgLT4gMAorc2FtcTAzNiBzYW1lcXVhbnR1bSAgMEUrMSAgIDBFKzEgICAtPiAxCitzYW1xMDM3IHNhbWVxdWFudHVtICAwRSsxICAgMEUrMiAgIC0+IDAKK3NhbXEwMzggc2FtZXF1YW50dW0gIDBFLTE3ICAwRS0xNiAgLT4gMAorc2FtcTAzOSBzYW1lcXVhbnR1bSAgMEUtMTcgIDBFLTE3ICAtPiAxCitzYW1xMDQwIHNhbWVxdWFudHVtICAwRS0xNyAgMEUtMTggIC0+IDAKK3NhbXEwNDEgc2FtZXF1YW50dW0gIDBFLTE3ICAwLjBFLTE1IC0+IDAKK3NhbXEwNDIgc2FtZXF1YW50dW0gIDBFLTE3ICAwLjBFLTE2IC0+IDEKK3NhbXEwNDMgc2FtZXF1YW50dW0gIDBFLTE3ICAwLjBFLTE3IC0+IDAKK3NhbXEwNDQgc2FtZXF1YW50dW0gLTBFLTE3ICAwLjBFLTE2IC0+IDEKK3NhbXEwNDUgc2FtZXF1YW50dW0gIDBFLTE3IC0wLjBFLTE3IC0+IDAKK3NhbXEwNDYgc2FtZXF1YW50dW0gIDBFLTE3IC0wLjBFLTE2IC0+IDEKK3NhbXEwNDcgc2FtZXF1YW50dW0gLTBFLTE3ICAwLjBFLTE3IC0+IDAKK3NhbXEwNDggc2FtZXF1YW50dW0gLTBFLTE3IC0wLjBFLTE2IC0+IDEKK3NhbXEwNDkgc2FtZXF1YW50dW0gLTBFLTE3IC0wLjBFLTE3IC0+IDAKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK3NhbXEwNTEgc2FtZXF1YW50dW0gIDkuOTk5OTk5OTlFKzk5OSAgICA5Ljk5OTk5OTk5RSs5OTkgIC0+IDEKK3NhbXEwNTIgc2FtZXF1YW50dW0gIDFFLTk5OSAgICAgICAgICAgICAxRS05OTkgICAgICAgICAgIC0+IDEKK3NhbXEwNTMgc2FtZXF1YW50dW0gIDEuMDAwMDAwMDBFLTk5OSAgICAxLjAwMDAwMDAwRS05OTkgIC0+IDEKK3NhbXEwNTQgc2FtZXF1YW50dW0gIDFFLTEwMDcgICAgICAgICAgICAxRS0xMDA3ICAgICAgICAgIC0+IDEKK3NhbXEwNTUgc2FtZXF1YW50dW0gIDkuOTk5OTk5OTlFKzk5OSAgICA5Ljk5OTk5OTk5RSs5OTkgIC0+IDEKK3NhbXEwNTYgc2FtZXF1YW50dW0gIDFFLTk5OSAgICAgICAgICAgICAxRS05OTkgICAgICAgICAgIC0+IDEKK3NhbXEwNTcgc2FtZXF1YW50dW0gIDEuMDAwMDAwMDBFLTk5OSAgICAxLjAwMDAwMDAwRS05OTkgIC0+IDEKK3NhbXEwNTggc2FtZXF1YW50dW0gIDFFLTEwMDcgICAgICAgICAgICAxRS0xMDA3ICAgICAgICAgIC0+IDEKKworc2FtcTA2MSBzYW1lcXVhbnR1bSAgLTFFLTEwMDcgICAgICAgICAgIC0xRS0xMDA3ICAgICAgICAgLT4gMQorc2FtcTA2MiBzYW1lcXVhbnR1bSAgLTEuMDAwMDAwMDBFLTk5OSAgIC0xLjAwMDAwMDAwRS05OTkgLT4gMQorc2FtcTA2MyBzYW1lcXVhbnR1bSAgLTFFLTk5OSAgICAgICAgICAgIC0xRS05OTkgICAgICAgICAgLT4gMQorc2FtcTA2NCBzYW1lcXVhbnR1bSAgLTkuOTk5OTk5OTlFKzk5OSAgIC05Ljk5OTk5OTk5RSs5OTkgLT4gMQorc2FtcTA2NSBzYW1lcXVhbnR1bSAgLTFFLTEwMDcgICAgICAgICAgIC0xRS0xMDA3ICAgICAgICAgLT4gMQorc2FtcTA2NiBzYW1lcXVhbnR1bSAgLTEuMDAwMDAwMDBFLTk5OSAgIC0xLjAwMDAwMDAwRS05OTkgLT4gMQorc2FtcTA2NyBzYW1lcXVhbnR1bSAgLTFFLTk5OSAgICAgICAgICAgIC0xRS05OTkgICAgICAgICAgLT4gMQorc2FtcTA2OCBzYW1lcXVhbnR1bSAgLTkuOTk5OTk5OTlFKzk5OSAgIC05Ljk5OTk5OTk5RSs5OTkgLT4gMQorCitzYW1xMDcxIHNhbWVxdWFudHVtICAtNEUtMTAwNyAgICAgICAgICAgLTFFLTEwMDcgICAgICAgICAtPiAxCitzYW1xMDcyIHNhbWVxdWFudHVtICAtNC4wMDAwMDAwMEUtOTk5ICAgLTEuMDAwMDQwMDBFLTk5OSAtPiAxCitzYW1xMDczIHNhbWVxdWFudHVtICAtNEUtOTk5ICAgICAgICAgICAgLTFFLTk5OSAgICAgICAgICAtPiAxCitzYW1xMDc0IHNhbWVxdWFudHVtICAtNC45OTk5OTk5OUUrOTk5ICAgLTkuOTk5NDk5OTlFKzk5OSAtPiAxCitzYW1xMDc1IHNhbWVxdWFudHVtICAtNEUtMTAwNyAgICAgICAgICAgLTFFLTEwMDcgICAgICAgICAtPiAxCitzYW1xMDc2IHNhbWVxdWFudHVtICAtNC4wMDAwMDAwMEUtOTk5ICAgLTEuMDA0MDAwMDBFLTk5OSAtPiAxCitzYW1xMDc3IHNhbWVxdWFudHVtICAtNEUtOTk5ICAgICAgICAgICAgLTFFLTk5OSAgICAgICAgICAtPiAxCitzYW1xMDc4IHNhbWVxdWFudHVtICAtNC45OTk5OTk5OUUrOTk5ICAgLTkuOTQ5OTk5OTlFKzk5OSAtPiAxCisKK3NhbXEwODEgc2FtZXF1YW50dW0gIC00RS0xMDA2ICAgICAgICAgICAtMUUtMTAwNyAgICAgICAgIC0+IDAKK3NhbXEwODIgc2FtZXF1YW50dW0gIC00LjAwMDAwMDAwRS05OTkgICAtMS4wMDAwNDAwMEUtOTk2IC0+IDAKK3NhbXEwODMgc2FtZXF1YW50dW0gIC00RS05OTYgICAgICAgICAgICAtMUUtOTk5ICAgICAgICAgIC0+IDAKK3NhbXEwODQgc2FtZXF1YW50dW0gIC00Ljk5OTk5OTk5RSs5OTkgICAtOS45OTk0OTk5OUUrOTk2IC0+IDAKK3NhbXEwODUgc2FtZXF1YW50dW0gIC00RS0xMDA2ICAgICAgICAgICAtMUUtMTAwNyAgICAgICAgIC0+IDAKK3NhbXEwODYgc2FtZXF1YW50dW0gIC00LjAwMDAwMDAwRS05OTkgICAtMS4wMDQwMDAwMEUtOTk2IC0+IDAKK3NhbXEwODcgc2FtZXF1YW50dW0gIC00RS05OTYgICAgICAgICAgICAtMUUtOTk5ICAgICAgICAgIC0+IDAKK3NhbXEwODggc2FtZXF1YW50dW0gIC00Ljk5OTk5OTk5RSs5OTkgICAtOS45NDk5OTk5OUUrOTk2IC0+IDAKKworLS0gc3BlY2lhbHMgJiBjb21iaW5hdGlvbnMKK3NhbXEwMTEwIHNhbWVxdWFudHVtICAtSW5mICAgIC1JbmYgICAtPiAxCitzYW1xMDExMSBzYW1lcXVhbnR1bSAgLUluZiAgICAgSW5mICAgLT4gMQorc2FtcTAxMTIgc2FtZXF1YW50dW0gIC1JbmYgICAgIE5hTiAgIC0+IDAKK3NhbXEwMTEzIHNhbWVxdWFudHVtICAtSW5mICAgIC03RSszICAtPiAwCitzYW1xMDExNCBzYW1lcXVhbnR1bSAgLUluZiAgICAtNyAgICAgLT4gMAorc2FtcTAxMTUgc2FtZXF1YW50dW0gIC1JbmYgICAgLTdFLTMgIC0+IDAKK3NhbXEwMTE2IHNhbWVxdWFudHVtICAtSW5mICAgIC0wRS0zICAtPiAwCitzYW1xMDExNyBzYW1lcXVhbnR1bSAgLUluZiAgICAtMCAgICAgLT4gMAorc2FtcTAxMTggc2FtZXF1YW50dW0gIC1JbmYgICAgLTBFKzMgIC0+IDAKK3NhbXEwMTE5IHNhbWVxdWFudHVtICAtSW5mICAgICAwRS0zICAtPiAwCitzYW1xMDEyMCBzYW1lcXVhbnR1bSAgLUluZiAgICAgMCAgICAgLT4gMAorc2FtcTAxMjEgc2FtZXF1YW50dW0gIC1JbmYgICAgIDBFKzMgIC0+IDAKK3NhbXEwMTIyIHNhbWVxdWFudHVtICAtSW5mICAgICA3RS0zICAtPiAwCitzYW1xMDEyMyBzYW1lcXVhbnR1bSAgLUluZiAgICAgNyAgICAgLT4gMAorc2FtcTAxMjQgc2FtZXF1YW50dW0gIC1JbmYgICAgIDdFKzMgIC0+IDAKK3NhbXEwMTI1IHNhbWVxdWFudHVtICAtSW5mICAgICBzTmFOICAtPiAwCisKK3NhbXEwMjEwIHNhbWVxdWFudHVtICAgSW5mICAgIC1JbmYgICAtPiAxCitzYW1xMDIxMSBzYW1lcXVhbnR1bSAgIEluZiAgICAgSW5mICAgLT4gMQorc2FtcTAyMTIgc2FtZXF1YW50dW0gICBJbmYgICAgIE5hTiAgIC0+IDAKK3NhbXEwMjEzIHNhbWVxdWFudHVtICAgSW5mICAgIC03RSszICAtPiAwCitzYW1xMDIxNCBzYW1lcXVhbnR1bSAgIEluZiAgICAtNyAgICAgLT4gMAorc2FtcTAyMTUgc2FtZXF1YW50dW0gICBJbmYgICAgLTdFLTMgIC0+IDAKK3NhbXEwMjE2IHNhbWVxdWFudHVtICAgSW5mICAgIC0wRS0zICAtPiAwCitzYW1xMDIxNyBzYW1lcXVhbnR1bSAgIEluZiAgICAtMCAgICAgLT4gMAorc2FtcTAyMTggc2FtZXF1YW50dW0gICBJbmYgICAgLTBFKzMgIC0+IDAKK3NhbXEwMjE5IHNhbWVxdWFudHVtICAgSW5mICAgICAwRS0zICAtPiAwCitzYW1xMDIyMCBzYW1lcXVhbnR1bSAgIEluZiAgICAgMCAgICAgLT4gMAorc2FtcTAyMjEgc2FtZXF1YW50dW0gICBJbmYgICAgIDBFKzMgIC0+IDAKK3NhbXEwMjIyIHNhbWVxdWFudHVtICAgSW5mICAgICA3RS0zICAtPiAwCitzYW1xMDIyMyBzYW1lcXVhbnR1bSAgIEluZiAgICAgNyAgICAgLT4gMAorc2FtcTAyMjQgc2FtZXF1YW50dW0gICBJbmYgICAgIDdFKzMgIC0+IDAKK3NhbXEwMjI1IHNhbWVxdWFudHVtICAgSW5mICAgICBzTmFOICAtPiAwCisKK3NhbXEwMzEwIHNhbWVxdWFudHVtICAgTmFOICAgIC1JbmYgICAtPiAwCitzYW1xMDMxMSBzYW1lcXVhbnR1bSAgIE5hTiAgICAgSW5mICAgLT4gMAorc2FtcTAzMTIgc2FtZXF1YW50dW0gICBOYU4gICAgIE5hTiAgIC0+IDEKK3NhbXEwMzEzIHNhbWVxdWFudHVtICAgTmFOICAgIC03RSszICAtPiAwCitzYW1xMDMxNCBzYW1lcXVhbnR1bSAgIE5hTiAgICAtNyAgICAgLT4gMAorc2FtcTAzMTUgc2FtZXF1YW50dW0gICBOYU4gICAgLTdFLTMgIC0+IDAKK3NhbXEwMzE2IHNhbWVxdWFudHVtICAgTmFOICAgIC0wRS0zICAtPiAwCitzYW1xMDMxNyBzYW1lcXVhbnR1bSAgIE5hTiAgICAtMCAgICAgLT4gMAorc2FtcTAzMTggc2FtZXF1YW50dW0gICBOYU4gICAgLTBFKzMgIC0+IDAKK3NhbXEwMzE5IHNhbWVxdWFudHVtICAgTmFOICAgICAwRS0zICAtPiAwCitzYW1xMDMyMCBzYW1lcXVhbnR1bSAgIE5hTiAgICAgMCAgICAgLT4gMAorc2FtcTAzMjEgc2FtZXF1YW50dW0gICBOYU4gICAgIDBFKzMgIC0+IDAKK3NhbXEwMzIyIHNhbWVxdWFudHVtICAgTmFOICAgICA3RS0zICAtPiAwCitzYW1xMDMyMyBzYW1lcXVhbnR1bSAgIE5hTiAgICAgNyAgICAgLT4gMAorc2FtcTAzMjQgc2FtZXF1YW50dW0gICBOYU4gICAgIDdFKzMgIC0+IDAKK3NhbXEwMzI1IHNhbWVxdWFudHVtICAgTmFOICAgICBzTmFOICAtPiAxCisKK3NhbXEwNDEwIHNhbWVxdWFudHVtICAtN0UrMyAgICAtSW5mICAgLT4gMAorc2FtcTA0MTEgc2FtZXF1YW50dW0gIC03RSszICAgICBJbmYgICAtPiAwCitzYW1xMDQxMiBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIE5hTiAgIC0+IDAKK3NhbXEwNDEzIHNhbWVxdWFudHVtICAtN0UrMyAgICAtN0UrMyAgLT4gMQorc2FtcTA0MTQgc2FtZXF1YW50dW0gIC03RSszICAgIC03ICAgICAtPiAwCitzYW1xMDQxNSBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLTdFLTMgIC0+IDAKK3NhbXEwNDE2IHNhbWVxdWFudHVtICAtN0UrMyAgICAtMEUtMyAgLT4gMAorc2FtcTA0MTcgc2FtZXF1YW50dW0gIC03RSszICAgIC0wICAgICAtPiAwCitzYW1xMDQxOCBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLTBFKzMgIC0+IDEKK3NhbXEwNDE5IHNhbWVxdWFudHVtICAtN0UrMyAgICAgMEUtMyAgLT4gMAorc2FtcTA0MjAgc2FtZXF1YW50dW0gIC03RSszICAgICAwICAgICAtPiAwCitzYW1xMDQyMSBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIDBFKzMgIC0+IDEKK3NhbXEwNDIyIHNhbWVxdWFudHVtICAtN0UrMyAgICAgN0UtMyAgLT4gMAorc2FtcTA0MjMgc2FtZXF1YW50dW0gIC03RSszICAgICA3ICAgICAtPiAwCitzYW1xMDQyNCBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIDdFKzMgIC0+IDEKK3NhbXEwNDI1IHNhbWVxdWFudHVtICAtN0UrMyAgICAgc05hTiAgLT4gMAorCitzYW1xMDUxMCBzYW1lcXVhbnR1bSAgLTcgICAgICAtSW5mICAgLT4gMAorc2FtcTA1MTEgc2FtZXF1YW50dW0gIC03ICAgICAgIEluZiAgIC0+IDAKK3NhbXEwNTEyIHNhbWVxdWFudHVtICAtNyAgICAgICBOYU4gICAtPiAwCitzYW1xMDUxMyBzYW1lcXVhbnR1bSAgLTcgICAgICAtN0UrMyAgLT4gMAorc2FtcTA1MTQgc2FtZXF1YW50dW0gIC03ICAgICAgLTcgICAgIC0+IDEKK3NhbXEwNTE1IHNhbWVxdWFudHVtICAtNyAgICAgIC03RS0zICAtPiAwCitzYW1xMDUxNiBzYW1lcXVhbnR1bSAgLTcgICAgICAtMEUtMyAgLT4gMAorc2FtcTA1MTcgc2FtZXF1YW50dW0gIC03ICAgICAgLTAgICAgIC0+IDEKK3NhbXEwNTE4IHNhbWVxdWFudHVtICAtNyAgICAgIC0wRSszICAtPiAwCitzYW1xMDUxOSBzYW1lcXVhbnR1bSAgLTcgICAgICAgMEUtMyAgLT4gMAorc2FtcTA1MjAgc2FtZXF1YW50dW0gIC03ICAgICAgIDAgICAgIC0+IDEKK3NhbXEwNTIxIHNhbWVxdWFudHVtICAtNyAgICAgICAwRSszICAtPiAwCitzYW1xMDUyMiBzYW1lcXVhbnR1bSAgLTcgICAgICAgN0UtMyAgLT4gMAorc2FtcTA1MjMgc2FtZXF1YW50dW0gIC03ICAgICAgIDcgICAgIC0+IDEKK3NhbXEwNTI0IHNhbWVxdWFudHVtICAtNyAgICAgICA3RSszICAtPiAwCitzYW1xMDUyNSBzYW1lcXVhbnR1bSAgLTcgICAgICAgc05hTiAgLT4gMAorCitzYW1xMDYxMCBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLUluZiAgIC0+IDAKK3NhbXEwNjExIHNhbWVxdWFudHVtICAtN0UtMyAgICAgSW5mICAgLT4gMAorc2FtcTA2MTIgc2FtZXF1YW50dW0gIC03RS0zICAgICBOYU4gICAtPiAwCitzYW1xMDYxMyBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLTdFKzMgIC0+IDAKK3NhbXEwNjE0IHNhbWVxdWFudHVtICAtN0UtMyAgICAtNyAgICAgLT4gMAorc2FtcTA2MTUgc2FtZXF1YW50dW0gIC03RS0zICAgIC03RS0zICAtPiAxCitzYW1xMDYxNiBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLTBFLTMgIC0+IDEKK3NhbXEwNjE3IHNhbWVxdWFudHVtICAtN0UtMyAgICAtMCAgICAgLT4gMAorc2FtcTA2MTggc2FtZXF1YW50dW0gIC03RS0zICAgIC0wRSszICAtPiAwCitzYW1xMDYxOSBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIDBFLTMgIC0+IDEKK3NhbXEwNjIwIHNhbWVxdWFudHVtICAtN0UtMyAgICAgMCAgICAgLT4gMAorc2FtcTA2MjEgc2FtZXF1YW50dW0gIC03RS0zICAgICAwRSszICAtPiAwCitzYW1xMDYyMiBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIDdFLTMgIC0+IDEKK3NhbXEwNjIzIHNhbWVxdWFudHVtICAtN0UtMyAgICAgNyAgICAgLT4gMAorc2FtcTA2MjQgc2FtZXF1YW50dW0gIC03RS0zICAgICA3RSszICAtPiAwCitzYW1xMDYyNSBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIHNOYU4gIC0+IDAKKworc2FtcTA3MTAgc2FtZXF1YW50dW0gIC0wRS0zICAgIC1JbmYgICAtPiAwCitzYW1xMDcxMSBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIEluZiAgIC0+IDAKK3NhbXEwNzEyIHNhbWVxdWFudHVtICAtMEUtMyAgICAgTmFOICAgLT4gMAorc2FtcTA3MTMgc2FtZXF1YW50dW0gIC0wRS0zICAgIC03RSszICAtPiAwCitzYW1xMDcxNCBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLTcgICAgIC0+IDAKK3NhbXEwNzE1IHNhbWVxdWFudHVtICAtMEUtMyAgICAtN0UtMyAgLT4gMQorc2FtcTA3MTYgc2FtZXF1YW50dW0gIC0wRS0zICAgIC0wRS0zICAtPiAxCitzYW1xMDcxNyBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLTAgICAgIC0+IDAKK3NhbXEwNzE4IHNhbWVxdWFudHVtICAtMEUtMyAgICAtMEUrMyAgLT4gMAorc2FtcTA3MTkgc2FtZXF1YW50dW0gIC0wRS0zICAgICAwRS0zICAtPiAxCitzYW1xMDcyMCBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIDAgICAgIC0+IDAKK3NhbXEwNzIxIHNhbWVxdWFudHVtICAtMEUtMyAgICAgMEUrMyAgLT4gMAorc2FtcTA3MjIgc2FtZXF1YW50dW0gIC0wRS0zICAgICA3RS0zICAtPiAxCitzYW1xMDcyMyBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIDcgICAgIC0+IDAKK3NhbXEwNzI0IHNhbWVxdWFudHVtICAtMEUtMyAgICAgN0UrMyAgLT4gMAorc2FtcTA3MjUgc2FtZXF1YW50dW0gIC0wRS0zICAgICBzTmFOICAtPiAwCisKK3NhbXEwODEwIHNhbWVxdWFudHVtICAtMCAgICAgIC1JbmYgICAtPiAwCitzYW1xMDgxMSBzYW1lcXVhbnR1bSAgLTAgICAgICAgSW5mICAgLT4gMAorc2FtcTA4MTIgc2FtZXF1YW50dW0gIC0wICAgICAgIE5hTiAgIC0+IDAKK3NhbXEwODEzIHNhbWVxdWFudHVtICAtMCAgICAgIC03RSszICAtPiAwCitzYW1xMDgxNCBzYW1lcXVhbnR1bSAgLTAgICAgICAtNyAgICAgLT4gMQorc2FtcTA4MTUgc2FtZXF1YW50dW0gIC0wICAgICAgLTdFLTMgIC0+IDAKK3NhbXEwODE2IHNhbWVxdWFudHVtICAtMCAgICAgIC0wRS0zICAtPiAwCitzYW1xMDgxNyBzYW1lcXVhbnR1bSAgLTAgICAgICAtMCAgICAgLT4gMQorc2FtcTA4MTggc2FtZXF1YW50dW0gIC0wICAgICAgLTBFKzMgIC0+IDAKK3NhbXEwODE5IHNhbWVxdWFudHVtICAtMCAgICAgICAwRS0zICAtPiAwCitzYW1xMDgyMCBzYW1lcXVhbnR1bSAgLTAgICAgICAgMCAgICAgLT4gMQorc2FtcTA4MjEgc2FtZXF1YW50dW0gIC0wICAgICAgIDBFKzMgIC0+IDAKK3NhbXEwODIyIHNhbWVxdWFudHVtICAtMCAgICAgICA3RS0zICAtPiAwCitzYW1xMDgyMyBzYW1lcXVhbnR1bSAgLTAgICAgICAgNyAgICAgLT4gMQorc2FtcTA4MjQgc2FtZXF1YW50dW0gIC0wICAgICAgIDdFKzMgIC0+IDAKK3NhbXEwODI1IHNhbWVxdWFudHVtICAtMCAgICAgICBzTmFOICAtPiAwCisKK3NhbXEwOTEwIHNhbWVxdWFudHVtICAtMEUrMyAgICAtSW5mICAgLT4gMAorc2FtcTA5MTEgc2FtZXF1YW50dW0gIC0wRSszICAgICBJbmYgICAtPiAwCitzYW1xMDkxMiBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIE5hTiAgIC0+IDAKK3NhbXEwOTEzIHNhbWVxdWFudHVtICAtMEUrMyAgICAtN0UrMyAgLT4gMQorc2FtcTA5MTQgc2FtZXF1YW50dW0gIC0wRSszICAgIC03ICAgICAtPiAwCitzYW1xMDkxNSBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLTdFLTMgIC0+IDAKK3NhbXEwOTE2IHNhbWVxdWFudHVtICAtMEUrMyAgICAtMEUtMyAgLT4gMAorc2FtcTA5MTcgc2FtZXF1YW50dW0gIC0wRSszICAgIC0wICAgICAtPiAwCitzYW1xMDkxOCBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLTBFKzMgIC0+IDEKK3NhbXEwOTE5IHNhbWVxdWFudHVtICAtMEUrMyAgICAgMEUtMyAgLT4gMAorc2FtcTA5MjAgc2FtZXF1YW50dW0gIC0wRSszICAgICAwICAgICAtPiAwCitzYW1xMDkyMSBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIDBFKzMgIC0+IDEKK3NhbXEwOTIyIHNhbWVxdWFudHVtICAtMEUrMyAgICAgN0UtMyAgLT4gMAorc2FtcTA5MjMgc2FtZXF1YW50dW0gIC0wRSszICAgICA3ICAgICAtPiAwCitzYW1xMDkyNCBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIDdFKzMgIC0+IDEKK3NhbXEwOTI1IHNhbWVxdWFudHVtICAtMEUrMyAgICAgc05hTiAgLT4gMAorCitzYW1xMTExMCBzYW1lcXVhbnR1bSAgMEUtMyAgICAtSW5mICAgLT4gMAorc2FtcTExMTEgc2FtZXF1YW50dW0gIDBFLTMgICAgIEluZiAgIC0+IDAKK3NhbXExMTEyIHNhbWVxdWFudHVtICAwRS0zICAgICBOYU4gICAtPiAwCitzYW1xMTExMyBzYW1lcXVhbnR1bSAgMEUtMyAgICAtN0UrMyAgLT4gMAorc2FtcTExMTQgc2FtZXF1YW50dW0gIDBFLTMgICAgLTcgICAgIC0+IDAKK3NhbXExMTE1IHNhbWVxdWFudHVtICAwRS0zICAgIC03RS0zICAtPiAxCitzYW1xMTExNiBzYW1lcXVhbnR1bSAgMEUtMyAgICAtMEUtMyAgLT4gMQorc2FtcTExMTcgc2FtZXF1YW50dW0gIDBFLTMgICAgLTAgICAgIC0+IDAKK3NhbXExMTE4IHNhbWVxdWFudHVtICAwRS0zICAgIC0wRSszICAtPiAwCitzYW1xMTExOSBzYW1lcXVhbnR1bSAgMEUtMyAgICAgMEUtMyAgLT4gMQorc2FtcTExMjAgc2FtZXF1YW50dW0gIDBFLTMgICAgIDAgICAgIC0+IDAKK3NhbXExMTIxIHNhbWVxdWFudHVtICAwRS0zICAgICAwRSszICAtPiAwCitzYW1xMTEyMiBzYW1lcXVhbnR1bSAgMEUtMyAgICAgN0UtMyAgLT4gMQorc2FtcTExMjMgc2FtZXF1YW50dW0gIDBFLTMgICAgIDcgICAgIC0+IDAKK3NhbXExMTI0IHNhbWVxdWFudHVtICAwRS0zICAgICA3RSszICAtPiAwCitzYW1xMTEyNSBzYW1lcXVhbnR1bSAgMEUtMyAgICAgc05hTiAgLT4gMAorCitzYW1xMTIxMCBzYW1lcXVhbnR1bSAgMCAgICAgICAtSW5mICAgLT4gMAorc2FtcTEyMTEgc2FtZXF1YW50dW0gIDAgICAgICAgIEluZiAgIC0+IDAKK3NhbXExMjEyIHNhbWVxdWFudHVtICAwICAgICAgICBOYU4gICAtPiAwCitzYW1xMTIxMyBzYW1lcXVhbnR1bSAgMCAgICAgICAtN0UrMyAgLT4gMAorc2FtcTEyMTQgc2FtZXF1YW50dW0gIDAgICAgICAgLTcgICAgIC0+IDEKK3NhbXExMjE1IHNhbWVxdWFudHVtICAwICAgICAgIC03RS0zICAtPiAwCitzYW1xMTIxNiBzYW1lcXVhbnR1bSAgMCAgICAgICAtMEUtMyAgLT4gMAorc2FtcTEyMTcgc2FtZXF1YW50dW0gIDAgICAgICAgLTAgICAgIC0+IDEKK3NhbXExMjE4IHNhbWVxdWFudHVtICAwICAgICAgIC0wRSszICAtPiAwCitzYW1xMTIxOSBzYW1lcXVhbnR1bSAgMCAgICAgICAgMEUtMyAgLT4gMAorc2FtcTEyMjAgc2FtZXF1YW50dW0gIDAgICAgICAgIDAgICAgIC0+IDEKK3NhbXExMjIxIHNhbWVxdWFudHVtICAwICAgICAgICAwRSszICAtPiAwCitzYW1xMTIyMiBzYW1lcXVhbnR1bSAgMCAgICAgICAgN0UtMyAgLT4gMAorc2FtcTEyMjMgc2FtZXF1YW50dW0gIDAgICAgICAgIDcgICAgIC0+IDEKK3NhbXExMjI0IHNhbWVxdWFudHVtICAwICAgICAgICA3RSszICAtPiAwCitzYW1xMTIyNSBzYW1lcXVhbnR1bSAgMCAgICAgICAgc05hTiAgLT4gMAorCitzYW1xMTMxMCBzYW1lcXVhbnR1bSAgMEUrMyAgICAtSW5mICAgLT4gMAorc2FtcTEzMTEgc2FtZXF1YW50dW0gIDBFKzMgICAgIEluZiAgIC0+IDAKK3NhbXExMzEyIHNhbWVxdWFudHVtICAwRSszICAgICBOYU4gICAtPiAwCitzYW1xMTMxMyBzYW1lcXVhbnR1bSAgMEUrMyAgICAtN0UrMyAgLT4gMQorc2FtcTEzMTQgc2FtZXF1YW50dW0gIDBFKzMgICAgLTcgICAgIC0+IDAKK3NhbXExMzE1IHNhbWVxdWFudHVtICAwRSszICAgIC03RS0zICAtPiAwCitzYW1xMTMxNiBzYW1lcXVhbnR1bSAgMEUrMyAgICAtMEUtMyAgLT4gMAorc2FtcTEzMTcgc2FtZXF1YW50dW0gIDBFKzMgICAgLTAgICAgIC0+IDAKK3NhbXExMzE4IHNhbWVxdWFudHVtICAwRSszICAgIC0wRSszICAtPiAxCitzYW1xMTMxOSBzYW1lcXVhbnR1bSAgMEUrMyAgICAgMEUtMyAgLT4gMAorc2FtcTEzMjAgc2FtZXF1YW50dW0gIDBFKzMgICAgIDAgICAgIC0+IDAKK3NhbXExMzIxIHNhbWVxdWFudHVtICAwRSszICAgICAwRSszICAtPiAxCitzYW1xMTMyMiBzYW1lcXVhbnR1bSAgMEUrMyAgICAgN0UtMyAgLT4gMAorc2FtcTEzMjMgc2FtZXF1YW50dW0gIDBFKzMgICAgIDcgICAgIC0+IDAKK3NhbXExMzI0IHNhbWVxdWFudHVtICAwRSszICAgICA3RSszICAtPiAxCitzYW1xMTMyNSBzYW1lcXVhbnR1bSAgMEUrMyAgICAgc05hTiAgLT4gMAorCitzYW1xMTQxMCBzYW1lcXVhbnR1bSAgN0UtMyAgICAtSW5mICAgLT4gMAorc2FtcTE0MTEgc2FtZXF1YW50dW0gIDdFLTMgICAgIEluZiAgIC0+IDAKK3NhbXExNDEyIHNhbWVxdWFudHVtICA3RS0zICAgICBOYU4gICAtPiAwCitzYW1xMTQxMyBzYW1lcXVhbnR1bSAgN0UtMyAgICAtN0UrMyAgLT4gMAorc2FtcTE0MTQgc2FtZXF1YW50dW0gIDdFLTMgICAgLTcgICAgIC0+IDAKK3NhbXExNDE1IHNhbWVxdWFudHVtICA3RS0zICAgIC03RS0zICAtPiAxCitzYW1xMTQxNiBzYW1lcXVhbnR1bSAgN0UtMyAgICAtMEUtMyAgLT4gMQorc2FtcTE0MTcgc2FtZXF1YW50dW0gIDdFLTMgICAgLTAgICAgIC0+IDAKK3NhbXExNDE4IHNhbWVxdWFudHVtICA3RS0zICAgIC0wRSszICAtPiAwCitzYW1xMTQxOSBzYW1lcXVhbnR1bSAgN0UtMyAgICAgMEUtMyAgLT4gMQorc2FtcTE0MjAgc2FtZXF1YW50dW0gIDdFLTMgICAgIDAgICAgIC0+IDAKK3NhbXExNDIxIHNhbWVxdWFudHVtICA3RS0zICAgICAwRSszICAtPiAwCitzYW1xMTQyMiBzYW1lcXVhbnR1bSAgN0UtMyAgICAgN0UtMyAgLT4gMQorc2FtcTE0MjMgc2FtZXF1YW50dW0gIDdFLTMgICAgIDcgICAgIC0+IDAKK3NhbXExNDI0IHNhbWVxdWFudHVtICA3RS0zICAgICA3RSszICAtPiAwCitzYW1xMTQyNSBzYW1lcXVhbnR1bSAgN0UtMyAgICAgc05hTiAgLT4gMAorCitzYW1xMTUxMCBzYW1lcXVhbnR1bSAgNyAgICAgIC1JbmYgICAtPiAwCitzYW1xMTUxMSBzYW1lcXVhbnR1bSAgNyAgICAgICBJbmYgICAtPiAwCitzYW1xMTUxMiBzYW1lcXVhbnR1bSAgNyAgICAgICBOYU4gICAtPiAwCitzYW1xMTUxMyBzYW1lcXVhbnR1bSAgNyAgICAgIC03RSszICAtPiAwCitzYW1xMTUxNCBzYW1lcXVhbnR1bSAgNyAgICAgIC03ICAgICAtPiAxCitzYW1xMTUxNSBzYW1lcXVhbnR1bSAgNyAgICAgIC03RS0zICAtPiAwCitzYW1xMTUxNiBzYW1lcXVhbnR1bSAgNyAgICAgIC0wRS0zICAtPiAwCitzYW1xMTUxNyBzYW1lcXVhbnR1bSAgNyAgICAgIC0wICAgICAtPiAxCitzYW1xMTUxOCBzYW1lcXVhbnR1bSAgNyAgICAgIC0wRSszICAtPiAwCitzYW1xMTUxOSBzYW1lcXVhbnR1bSAgNyAgICAgICAwRS0zICAtPiAwCitzYW1xMTUyMCBzYW1lcXVhbnR1bSAgNyAgICAgICAwICAgICAtPiAxCitzYW1xMTUyMSBzYW1lcXVhbnR1bSAgNyAgICAgICAwRSszICAtPiAwCitzYW1xMTUyMiBzYW1lcXVhbnR1bSAgNyAgICAgICA3RS0zICAtPiAwCitzYW1xMTUyMyBzYW1lcXVhbnR1bSAgNyAgICAgICA3ICAgICAtPiAxCitzYW1xMTUyNCBzYW1lcXVhbnR1bSAgNyAgICAgICA3RSszICAtPiAwCitzYW1xMTUyNSBzYW1lcXVhbnR1bSAgNyAgICAgICBzTmFOICAtPiAwCisKK3NhbXExNjEwIHNhbWVxdWFudHVtICA3RSszICAgIC1JbmYgICAtPiAwCitzYW1xMTYxMSBzYW1lcXVhbnR1bSAgN0UrMyAgICAgSW5mICAgLT4gMAorc2FtcTE2MTIgc2FtZXF1YW50dW0gIDdFKzMgICAgIE5hTiAgIC0+IDAKK3NhbXExNjEzIHNhbWVxdWFudHVtICA3RSszICAgIC03RSszICAtPiAxCitzYW1xMTYxNCBzYW1lcXVhbnR1bSAgN0UrMyAgICAtNyAgICAgLT4gMAorc2FtcTE2MTUgc2FtZXF1YW50dW0gIDdFKzMgICAgLTdFLTMgIC0+IDAKK3NhbXExNjE2IHNhbWVxdWFudHVtICA3RSszICAgIC0wRS0zICAtPiAwCitzYW1xMTYxNyBzYW1lcXVhbnR1bSAgN0UrMyAgICAtMCAgICAgLT4gMAorc2FtcTE2MTggc2FtZXF1YW50dW0gIDdFKzMgICAgLTBFKzMgIC0+IDEKK3NhbXExNjE5IHNhbWVxdWFudHVtICA3RSszICAgICAwRS0zICAtPiAwCitzYW1xMTYyMCBzYW1lcXVhbnR1bSAgN0UrMyAgICAgMCAgICAgLT4gMAorc2FtcTE2MjEgc2FtZXF1YW50dW0gIDdFKzMgICAgIDBFKzMgIC0+IDEKK3NhbXExNjIyIHNhbWVxdWFudHVtICA3RSszICAgICA3RS0zICAtPiAwCitzYW1xMTYyMyBzYW1lcXVhbnR1bSAgN0UrMyAgICAgNyAgICAgLT4gMAorc2FtcTE2MjQgc2FtZXF1YW50dW0gIDdFKzMgICAgIDdFKzMgIC0+IDEKK3NhbXExNjI1IHNhbWVxdWFudHVtICA3RSszICAgICBzTmFOICAtPiAwCisKK3NhbXExNzEwIHNhbWVxdWFudHVtICBzTmFOICAgIC1JbmYgICAtPiAwCitzYW1xMTcxMSBzYW1lcXVhbnR1bSAgc05hTiAgICAgSW5mICAgLT4gMAorc2FtcTE3MTIgc2FtZXF1YW50dW0gIHNOYU4gICAgIE5hTiAgIC0+IDEKK3NhbXExNzEzIHNhbWVxdWFudHVtICBzTmFOICAgIC03RSszICAtPiAwCitzYW1xMTcxNCBzYW1lcXVhbnR1bSAgc05hTiAgICAtNyAgICAgLT4gMAorc2FtcTE3MTUgc2FtZXF1YW50dW0gIHNOYU4gICAgLTdFLTMgIC0+IDAKK3NhbXExNzE2IHNhbWVxdWFudHVtICBzTmFOICAgIC0wRS0zICAtPiAwCitzYW1xMTcxNyBzYW1lcXVhbnR1bSAgc05hTiAgICAtMCAgICAgLT4gMAorc2FtcTE3MTggc2FtZXF1YW50dW0gIHNOYU4gICAgLTBFKzMgIC0+IDAKK3NhbXExNzE5IHNhbWVxdWFudHVtICBzTmFOICAgICAwRS0zICAtPiAwCitzYW1xMTcyMCBzYW1lcXVhbnR1bSAgc05hTiAgICAgMCAgICAgLT4gMAorc2FtcTE3MjEgc2FtZXF1YW50dW0gIHNOYU4gICAgIDBFKzMgIC0+IDAKK3NhbXExNzIyIHNhbWVxdWFudHVtICBzTmFOICAgICA3RS0zICAtPiAwCitzYW1xMTcyMyBzYW1lcXVhbnR1bSAgc05hTiAgICAgNyAgICAgLT4gMAorc2FtcTE3MjQgc2FtZXF1YW50dW0gIHNOYU4gICAgIDdFKzMgIC0+IDAKK3NhbXExNzI1IHNhbWVxdWFudHVtICBzTmFOICAgICBzTmFOICAtPiAxCistLSBub2lzeSBOYU5zCitzYW1xMTczMCBzYW1lcXVhbnR1bSAgc05hTjMgICAgc05hTjMgLT4gMQorc2FtcTE3MzEgc2FtZXF1YW50dW0gIHNOYU4zICAgIHNOYU40IC0+IDEKK3NhbXExNzMyIHNhbWVxdWFudHVtICAgTmFOMyAgICAgTmFOMyAtPiAxCitzYW1xMTczMyBzYW1lcXVhbnR1bSAgIE5hTjMgICAgIE5hTjQgLT4gMQorc2FtcTE3MzQgc2FtZXF1YW50dW0gIHNOYU4zICAgICAzICAgIC0+IDAKK3NhbXExNzM1IHNhbWVxdWFudHVtICAgTmFOMyAgICAgMyAgICAtPiAwCitzYW1xMTczNiBzYW1lcXVhbnR1bSAgICAgIDQgICAgc05hTjQgLT4gMAorc2FtcTE3Mzcgc2FtZXF1YW50dW0gICAgICAzICAgICBOYU4zIC0+IDAKK3NhbXExNzM4IHNhbWVxdWFudHVtICAgIEluZiAgICBzTmFONCAtPiAwCitzYW1xMTczOSBzYW1lcXVhbnR1bSAgIC1JbmYgICAgIE5hTjMgLT4gMAorCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9zY2FsZWIuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc2NhbGViLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhNjVkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc2NhbGViLmRlY1Rlc3QKQEAgLTAsMCArMSwyMDkgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gc2NhbGViLmRlY1Rlc3QgLS0gc2NhbGUgYSBudW1iZXIgYnkgcG93ZXJzIG9mIDEwICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5CittaW5FeHBvbmVudDogLTk5OQorCistLSBNYXggfHJoc3wgaXMgMiooOTk5KzkpID0gMjAxNgorCistLSBTYW5pdHkgY2hlY2tzCitzY2J4MDAxIHNjYWxlYiAgICAgICA3LjUwICAgMTAgLT4gNy41MEUrMTAKK3NjYngwMDIgc2NhbGViICAgICAgIDcuNTAgICAgMyAtPiA3LjUwRSszCitzY2J4MDAzIHNjYWxlYiAgICAgICA3LjUwICAgIDIgLT4gNzUwCitzY2J4MDA0IHNjYWxlYiAgICAgICA3LjUwICAgIDEgLT4gNzUuMAorc2NieDAwNSBzY2FsZWIgICAgICAgNy41MCAgICAwIC0+IDcuNTAKK3NjYngwMDYgc2NhbGViICAgICAgIDcuNTAgICAtMSAtPiAwLjc1MAorc2NieDAwNyBzY2FsZWIgICAgICAgNy41MCAgIC0yIC0+IDAuMDc1MAorc2NieDAwOCBzY2FsZWIgICAgICAgNy41MCAgLTEwIC0+IDcuNTBFLTEwCitzY2J4MDA5IHNjYWxlYiAgICAgIC03LjUwICAgIDMgLT4gLTcuNTBFKzMKK3NjYngwMTAgc2NhbGViICAgICAgLTcuNTAgICAgMiAtPiAtNzUwCitzY2J4MDExIHNjYWxlYiAgICAgIC03LjUwICAgIDEgLT4gLTc1LjAKK3NjYngwMTIgc2NhbGViICAgICAgLTcuNTAgICAgMCAtPiAtNy41MAorc2NieDAxMyBzY2FsZWIgICAgICAtNy41MCAgIC0xIC0+IC0wLjc1MAorCistLSBJbmZpbml0aWVzCitzY2J4MDE0IHNjYWxlYiAgSW5maW5pdHkgICAxIC0+IEluZmluaXR5CitzY2J4MDE1IHNjYWxlYiAgLUluZmluaXR5ICAyIC0+IC1JbmZpbml0eQorc2NieDAxNiBzY2FsZWIgIEluZmluaXR5ICAtMSAtPiBJbmZpbml0eQorc2NieDAxNyBzY2FsZWIgIC1JbmZpbml0eSAtMiAtPiAtSW5maW5pdHkKKworLS0gTmV4dCB0d28gYXJlIHNvbWV3aGF0IHVuZGVmaW5lZCBpbiA3NTRyOyB0cmVhdCBhcyBub24taW50ZWdlcgorc2NieDAxOCBzY2FsZWIgIDEwICBJbmZpbml0eSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngwMTkgc2NhbGViICAxMCAtSW5maW5pdHkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5hTnMgYXJlIHVuZGVmaW5lZCBpbiA3NTRyOyBhc3N1bWUgdXN1YWwgcHJvY2Vzc2luZworLS0gTmFOcywgMCBwYXlsb2FkCitzY2J4MDIxIHNjYWxlYiAgICAgICAgIE5hTiAgMSAtPiBOYU4KK3NjYngwMjIgc2NhbGViICAgICAgICAtTmFOIC0xIC0+IC1OYU4KK3NjYngwMjMgc2NhbGViICAgICAgICBzTmFOICAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDAyNCBzY2FsZWIgICAgICAgLXNOYU4gIDEgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDAyNSBzY2FsZWIgICAgNCAgICBOYU4gICAgLT4gTmFOCitzY2J4MDI2IHNjYWxlYiAtSW5mICAgLU5hTiAgICAtPiAtTmFOCitzY2J4MDI3IHNjYWxlYiAgICA0ICAgc05hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngwMjggc2NhbGViICBJbmYgIC1zTmFOICAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gbm9uLWludGVnZXIgUkhTCitzY2J4MDMwIHNjYWxlYiAgMS4yMyAgICAxICAgIC0+ICAxMi4zCitzY2J4MDMxIHNjYWxlYiAgMS4yMyAgICAxLjAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngwMzIgc2NhbGViICAxLjIzICAgIDEuMSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDAzMyBzY2FsZWIgIDEuMjMgICAgMS4wMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitzY2J4MDM0IHNjYWxlYiAgMS4yMyAgICAwLjAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngwMzUgc2NhbGViICAxLjIzICAgIDAuMTEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDAzNiBzY2FsZWIgIDEuMjMgICAgMC45OTk5OTk5OTkgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDAzNyBzY2FsZWIgIDEuMjMgICAtMSAgICAtPiAgMC4xMjMKK3NjYngwMzggc2NhbGViICAxLjIzICAgLTEuMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDAzOSBzY2FsZWIgIDEuMjMgICAtMS4xICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitzY2J4MDQwIHNjYWxlYiAgMS4yMyAgIC0xLjAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngwNDEgc2NhbGViICAxLjIzICAgLTAuMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDA0MiBzY2FsZWIgIDEuMjMgICAtMC4xMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitzY2J4MDQzIHNjYWxlYiAgMS4yMyAgIC0wLjk5OTk5OTk5OSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitzY2J4MDQ0IHNjYWxlYiAgMS4yMyAgICAwLjEgICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitzY2J4MDQ1IHNjYWxlYiAgMS4yMyAgICAxRSsxICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitzY2J4MDQ2IHNjYWxlYiAgMS4yMyAgICAxLjEyMzRFKzYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitzY2J4MDQ3IHNjYWxlYiAgMS4yMyAgICAxLjEyM0UrNCAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKworc2NieDEyMCBzY2FsZWIgIDEuMjMgICAgMjAxNSAgICAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorc2NieDEyMSBzY2FsZWIgIDEuMjMgICAgMjAxNiAgICAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorc2NieDEyMiBzY2FsZWIgIDEuMjMgICAgMjAxNyAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDEyMyBzY2FsZWIgIDEuMjMgICAgMjAxOCAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDEyNCBzY2FsZWIgIDEuMjMgICAtMjAxNSAgICAgICAgLT4gIDBFLTEwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorc2NieDEyNSBzY2FsZWIgIDEuMjMgICAtMjAxNiAgICAgICAgLT4gIDBFLTEwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorc2NieDEyNiBzY2FsZWIgIDEuMjMgICAtMjAxNyAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDEyNyBzY2FsZWIgIDEuMjMgICAtMjAxOCAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOYU5zLCBub24tMCBwYXlsb2FkCistLSBwcm9wYWdhdGluZyBOYU5zCitzY2J4ODYxIHNjYWxlYiAgTmFOMDEgICAtSW5mICAgICAtPiAgTmFOMQorc2NieDg2MiBzY2FsZWIgLU5hTjAyICAgLTEwMDAgICAgLT4gLU5hTjIKK3NjYng4NjMgc2NhbGViICBOYU4wMyAgICAxMDAwICAgIC0+ICBOYU4zCitzY2J4ODY0IHNjYWxlYiAgTmFOMDQgICAgSW5mICAgICAtPiAgTmFONAorc2NieDg2NSBzY2FsZWIgIE5hTjA1ICAgIE5hTjYxICAgLT4gIE5hTjUKK3NjYng4NjYgc2NhbGViIC1JbmYgICAgIC1OYU43MSAgIC0+IC1OYU43MQorc2NieDg2NyBzY2FsZWIgLTEwMDAgICAgIE5hTjgxICAgLT4gIE5hTjgxCitzY2J4ODY4IHNjYWxlYiAgMTAwMCAgICAgTmFOOTEgICAtPiAgTmFOOTEKK3NjYng4Njkgc2NhbGViICBJbmYgICAgICBOYU4xMDEgIC0+ICBOYU4xMDEKK3NjYng4NzEgc2NhbGViICBzTmFOMDExICAtSW5mICAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK3NjYng4NzIgc2NhbGViICBzTmFOMDEyICAtMTAwMCAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK3NjYng4NzMgc2NhbGViIC1zTmFOMDEzICAgMTAwMCAgIC0+IC1OYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK3NjYng4NzQgc2NhbGViICBzTmFOMDE0ICAgTmFOMTcxIC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK3NjYng4NzUgc2NhbGViICBzTmFOMDE1ICBzTmFOMTgxIC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK3NjYng4NzYgc2NhbGViICBOYU4wMTYgICBzTmFOMTkxIC0+ICBOYU4xOTEgSW52YWxpZF9vcGVyYXRpb24KK3NjYng4Nzcgc2NhbGViIC1JbmYgICAgICBzTmFOMjAxIC0+ICBOYU4yMDEgSW52YWxpZF9vcGVyYXRpb24KK3NjYng4Nzggc2NhbGViIC0xMDAwICAgICBzTmFOMjExIC0+ICBOYU4yMTEgSW52YWxpZF9vcGVyYXRpb24KK3NjYng4Nzkgc2NhbGViICAxMDAwICAgIC1zTmFOMjIxIC0+IC1OYU4yMjEgSW52YWxpZF9vcGVyYXRpb24KK3NjYng4ODAgc2NhbGViICBJbmYgICAgICBzTmFOMjMxIC0+ICBOYU4yMzEgSW52YWxpZF9vcGVyYXRpb24KK3NjYng4ODEgc2NhbGViICBOYU4wMjUgICBzTmFOMjQxIC0+ICBOYU4yNDEgSW52YWxpZF9vcGVyYXRpb24KKworLS0gZmluaXRlcworc2NieDA1MSBzY2FsZWIgICAgICAgICAgNyAgIC0yICAtPiAwLjA3CitzY2J4MDUyIHNjYWxlYiAgICAgICAgIC03ICAgLTIgIC0+IC0wLjA3CitzY2J4MDUzIHNjYWxlYiAgICAgICAgIDc1ICAgLTIgIC0+IDAuNzUKK3NjYngwNTQgc2NhbGViICAgICAgICAtNzUgICAtMiAgLT4gLTAuNzUKK3NjYngwNTUgc2NhbGViICAgICAgIDcuNTAgICAtMiAgLT4gMC4wNzUwCitzY2J4MDU2IHNjYWxlYiAgICAgIC03LjUwICAgLTIgIC0+IC0wLjA3NTAKK3NjYngwNTcgc2NhbGViICAgICAgIDcuNTAwICAtMiAgLT4gMC4wNzUwMAorc2NieDA1OCBzY2FsZWIgICAgICAtNy41MDAgIC0yICAtPiAtMC4wNzUwMAorc2NieDA2MSBzY2FsZWIgICAgICAgICAgNyAgIC0xICAtPiAwLjcKK3NjYngwNjIgc2NhbGViICAgICAgICAgLTcgICAtMSAgLT4gLTAuNworc2NieDA2MyBzY2FsZWIgICAgICAgICA3NSAgIC0xICAtPiA3LjUKK3NjYngwNjQgc2NhbGViICAgICAgICAtNzUgICAtMSAgLT4gLTcuNQorc2NieDA2NSBzY2FsZWIgICAgICAgNy41MCAgIC0xICAtPiAwLjc1MAorc2NieDA2NiBzY2FsZWIgICAgICAtNy41MCAgIC0xICAtPiAtMC43NTAKK3NjYngwNjcgc2NhbGViICAgICAgIDcuNTAwICAtMSAgLT4gMC43NTAwCitzY2J4MDY4IHNjYWxlYiAgICAgIC03LjUwMCAgLTEgIC0+IC0wLjc1MDAKK3NjYngwNzEgc2NhbGViICAgICAgICAgIDcgICAgMCAgLT4gNworc2NieDA3MiBzY2FsZWIgICAgICAgICAtNyAgICAwICAtPiAtNworc2NieDA3MyBzY2FsZWIgICAgICAgICA3NSAgICAwICAtPiA3NQorc2NieDA3NCBzY2FsZWIgICAgICAgIC03NSAgICAwICAtPiAtNzUKK3NjYngwNzUgc2NhbGViICAgICAgIDcuNTAgICAgMCAgLT4gNy41MAorc2NieDA3NiBzY2FsZWIgICAgICAtNy41MCAgICAwICAtPiAtNy41MAorc2NieDA3NyBzY2FsZWIgICAgICAgNy41MDAgICAwICAtPiA3LjUwMAorc2NieDA3OCBzY2FsZWIgICAgICAtNy41MDAgICAwICAtPiAtNy41MDAKK3NjYngwODEgc2NhbGViICAgICAgICAgIDcgICAgMSAgLT4gN0UrMQorc2NieDA4MiBzY2FsZWIgICAgICAgICAtNyAgICAxICAtPiAtN0UrMQorc2NieDA4MyBzY2FsZWIgICAgICAgICA3NSAgICAxICAtPiA3LjVFKzIKK3NjYngwODQgc2NhbGViICAgICAgICAtNzUgICAgMSAgLT4gLTcuNUUrMgorc2NieDA4NSBzY2FsZWIgICAgICAgNy41MCAgICAxICAtPiA3NS4wCitzY2J4MDg2IHNjYWxlYiAgICAgIC03LjUwICAgIDEgIC0+IC03NS4wCitzY2J4MDg3IHNjYWxlYiAgICAgICA3LjUwMCAgIDEgIC0+IDc1LjAwCitzY2J4MDg4IHNjYWxlYiAgICAgIC03LjUwMCAgIDEgIC0+IC03NS4wMAorc2NieDA5MSBzY2FsZWIgICAgICAgICAgNyAgICAyICAtPiA3RSsyCitzY2J4MDkyIHNjYWxlYiAgICAgICAgIC03ICAgIDIgIC0+IC03RSsyCitzY2J4MDkzIHNjYWxlYiAgICAgICAgIDc1ICAgIDIgIC0+IDcuNUUrMworc2NieDA5NCBzY2FsZWIgICAgICAgIC03NSAgICAyICAtPiAtNy41RSszCitzY2J4MDk1IHNjYWxlYiAgICAgICA3LjUwICAgIDIgIC0+IDc1MAorc2NieDA5NiBzY2FsZWIgICAgICAtNy41MCAgICAyICAtPiAtNzUwCitzY2J4MDk3IHNjYWxlYiAgICAgICA3LjUwMCAgIDIgIC0+IDc1MC4wCitzY2J4MDk4IHNjYWxlYiAgICAgIC03LjUwMCAgIDIgIC0+IC03NTAuMAorCistLSB6ZXJvcworc2NieDExMSBzY2FsZWIgICAgICAgICAgMCAgMSAtPiAwRSsxCitzY2J4MTEyIHNjYWxlYiAgICAgICAgIC0wICAyIC0+IC0wRSsyCitzY2J4MTEzIHNjYWxlYiAgICAgICAwRSs0ICAzIC0+IDBFKzcKK3NjYngxMTQgc2NhbGViICAgICAgLTBFKzQgIDQgLT4gLTBFKzgKK3NjYngxMTUgc2NhbGViICAgICAwLjAwMDAgIDUgLT4gMEUrMQorc2NieDExNiBzY2FsZWIgICAgLTAuMDAwMCAgNiAtPiAtMEUrMgorc2NieDExNyBzY2FsZWIgICAgICAwRS0xNDEgNyAtPiAwRS0xMzQKK3NjYngxMTggc2NhbGViICAgICAtMEUtMTQxIDggLT4gLTBFLTEzMworCistLSBObWF4LCBObWluLCBOdGlueQorc2NieDEzMiBzY2FsZWIgIDkuOTk5OTk5OTlFKzk5OSArOTk5IC0+IEluZmluaXR5ICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorc2NieDEzMyBzY2FsZWIgIDkuOTk5OTk5OTlFKzk5OSAgKzEwIC0+IEluZmluaXR5ICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3NjYngxMzQgc2NhbGViICA5Ljk5OTk5OTk5RSs5OTkgICsxICAtPiBJbmZpbml0eSAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitzY2J4MTM1IHNjYWxlYiAgOS45OTk5OTk5OUUrOTk5ICAgMCAgLT4gOS45OTk5OTk5OUUrOTk5CitzY2J4MTM2IHNjYWxlYiAgOS45OTk5OTk5OUUrOTk5ICAtMSAgLT4gOS45OTk5OTk5OUUrOTk4CitzY2J4MTM3IHNjYWxlYiAgMUUtOTk5ICAgICAgICAgICArMSAgLT4gMUUtOTk4CitzY2J4MTM4IHNjYWxlYiAgMUUtOTk5ICAgICAgICAgICAtMCAgLT4gMUUtOTk5CitzY2J4MTM5IHNjYWxlYiAgMUUtOTk5ICAgICAgICAgICAtMSAgLT4gMUUtMTAwMCAgICAgICAgIFN1Ym5vcm1hbAorc2NieDE0MCBzY2FsZWIgIDEuMDAwMDAwMDBFLTk5OSAgKzEgIC0+IDEuMDAwMDAwMDBFLTk5OAorc2NieDE0MSBzY2FsZWIgIDEuMDAwMDAwMDBFLTk5OSAgIDAgIC0+IDEuMDAwMDAwMDBFLTk5OQorc2NieDE0MiBzY2FsZWIgIDEuMDAwMDAwMDBFLTk5OSAgLTEgIC0+IDEuMDAwMDAwMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorc2NieDE0MyBzY2FsZWIgIDFFLTEwMDcgICAgICAgICAgKzEgIC0+IDFFLTEwMDYgICAgICAgICBTdWJub3JtYWwKK3NjYngxNDQgc2NhbGViICAxRS0xMDA3ICAgICAgICAgIC0wICAtPiAxRS0xMDA3ICAgICAgICAgU3Vibm9ybWFsCitzY2J4MTQ1IHNjYWxlYiAgMUUtMTAwNyAgICAgICAgICAtMSAgLT4gMEUtMTAwNyAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworc2NieDE1MCBzY2FsZWIgIC0xRS0xMDA3ICAgICAgICAgKzEgIC0+IC0xRS0xMDA2ICAgICAgICBTdWJub3JtYWwKK3NjYngxNTEgc2NhbGViICAtMUUtMTAwNyAgICAgICAgIC0wICAtPiAtMUUtMTAwNyAgICAgICAgU3Vibm9ybWFsCitzY2J4MTUyIHNjYWxlYiAgLTFFLTEwMDcgICAgICAgICAtMSAgLT4gLTBFLTEwMDcgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3NjYngxNTMgc2NhbGViICAtMS4wMDAwMDAwMEUtOTk5ICsxICAtPiAtMS4wMDAwMDAwMEUtOTk4CitzY2J4MTU0IHNjYWxlYiAgLTEuMDAwMDAwMDBFLTk5OSArMCAgLT4gLTEuMDAwMDAwMDBFLTk5OQorc2NieDE1NSBzY2FsZWIgIC0xLjAwMDAwMDAwRS05OTkgLTEgIC0+IC0xLjAwMDAwMDBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK3NjYngxNTYgc2NhbGViICAtMUUtOTk5ICAgICAgICAgICsxICAtPiAtMUUtOTk4CitzY2J4MTU3IHNjYWxlYiAgLTFFLTk5OSAgICAgICAgICAtMCAgLT4gLTFFLTk5OQorc2NieDE1OCBzY2FsZWIgIC0xRS05OTkgICAgICAgICAgLTEgIC0+IC0xRS0xMDAwICAgICAgICAgU3Vibm9ybWFsCitzY2J4MTU5IHNjYWxlYiAgLTkuOTk5OTk5OTlFKzk5OSArMSAgLT4gLUluZmluaXR5ICAgICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3NjYngxNjAgc2NhbGViICAtOS45OTk5OTk5OUUrOTk5ICswICAtPiAtOS45OTk5OTk5OUUrOTk5CitzY2J4MTYxIHNjYWxlYiAgLTkuOTk5OTk5OTlFKzk5OSAtMSAgLT4gLTkuOTk5OTk5OTlFKzk5OAorc2NieDE2MiBzY2FsZWIgIC05RSs5OTkgICAgICAgICAgKzEgIC0+IC1JbmZpbml0eSAgICAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitzY2J4MTYzIHNjYWxlYiAgLTFFKzk5OSAgICAgICAgICArMSAgLT4gLUluZmluaXR5ICAgICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0gS3JhaCBleGFtcGxlcworcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogOTk5OTk5OTk5CittaW5FeHBvbmVudDogLTk5OTk5OTk5OQorLS0gaW50ZWdlciBvdmVyZmxvdyBpbiAzLjYxIG9yIGVhcmxpZXIKK3NjYngxNjQgc2NhbGViICAxRS05OTk5OTk5OTkgIC0xMjAwMDAwMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIG91dCBvZiByYW5nZQorc2NieDE2NSBzY2FsZWIgIC0xRS05OTk5OTk5OTkgICsxMjAwMDAwMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc2hpZnQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc2hpZnQuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODgzOGNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9zaGlmdC5kZWNUZXN0CkBAIC0wLDAgKzEsMjUwIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHNoaWZ0LmRlY1Rlc3QgLS0gc2hpZnQgY29lZmZpY2llbnQgbGVmdCBvciByaWdodCAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworLS0gU2FuaXR5IGNoZWNrCitzaGl4MDAxIHNoaWZ0ICAgICAgICAgIDAgICAgMCAgLT4gIDAKK3NoaXgwMDIgc2hpZnQgICAgICAgICAgMCAgICAyICAtPiAgMAorc2hpeDAwMyBzaGlmdCAgICAgICAgICAxICAgIDIgIC0+ICAxMDAKK3NoaXgwMDQgc2hpZnQgICAgICAgICAgMSAgICA4ICAtPiAgMTAwMDAwMDAwCitzaGl4MDA1IHNoaWZ0ICAgICAgICAgIDEgICAgOSAgLT4gIDAKK3NoaXgwMDYgc2hpZnQgICAgICAgICAgMSAgIC0xICAtPiAgMAorc2hpeDAwNyBzaGlmdCAgMTIzNDU2Nzg5ICAgLTEgIC0+ICAxMjM0NTY3OAorc2hpeDAwOCBzaGlmdCAgMTIzNDU2Nzg5ICAgLTggIC0+ICAxCitzaGl4MDA5IHNoaWZ0ICAxMjM0NTY3ODkgICAtOSAgLT4gIDAKK3NoaXgwMTAgc2hpZnQgICAgICAgICAgMCAgIC0yICAtPiAgMAorCistLSByaHMgbXVzdCBiZSBhbiBpbnRlZ2VyCitzaGl4MDExIHNoaWZ0ICAgICAgICAxICAgIDEuNSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXgwMTIgc2hpZnQgICAgICAgIDEgICAgMS4wICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDAxMyBzaGlmdCAgICAgICAgMSAgICAwLjEgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4MDE0IHNoaWZ0ICAgICAgICAxICAgIDAuMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXgwMTUgc2hpZnQgICAgICAgIDEgICAgMUUrMSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDAxNiBzaGlmdCAgICAgICAgMSAgICAxRSs5OSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4MDE3IHNoaWZ0ICAgICAgICAxICAgIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXgwMTggc2hpZnQgICAgICAgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYW5kIHxyaHN8IDw9IHByZWNpc2lvbgorc2hpeDAyMCBzaGlmdCAgICAgICAgMSAgICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4MDIxIHNoaWZ0ICAgICAgICAxICAgIC0xMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXgwMjIgc2hpZnQgICAgICAgIDEgICAgIDEwICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDAyMyBzaGlmdCAgICAgICAgMSAgICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGZ1bGwgc2hpZnRpbmcgcGF0dGVybgorc2hpeDAzMCBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgIC05ICAgLT4gMAorc2hpeDAzMSBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgIC04ICAgLT4gMQorc2hpeDAzMiBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgIC03ICAgLT4gMTIKK3NoaXgwMzMgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICAtNiAgIC0+IDEyMworc2hpeDAzNCBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgIC01ICAgLT4gMTIzNAorc2hpeDAzNSBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgIC00ICAgLT4gMTIzNDUKK3NoaXgwMzYgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICAtMyAgIC0+IDEyMzQ1Ngorc2hpeDAzNyBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgIC0yICAgLT4gMTIzNDU2Nworc2hpeDAzOCBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgIC0xICAgLT4gMTIzNDU2NzgKK3NoaXgwMzkgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICAtMCAgIC0+IDEyMzQ1Njc4OQorc2hpeDA0MCBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgICswICAgLT4gMTIzNDU2Nzg5CitzaGl4MDQxIHNoaWZ0ICAxMjM0NTY3ODkgICAgICAgICAgKzEgICAtPiAyMzQ1Njc4OTAKK3NoaXgwNDIgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICArMiAgIC0+IDM0NTY3ODkwMAorc2hpeDA0MyBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgICszICAgLT4gNDU2Nzg5MDAwCitzaGl4MDQ0IHNoaWZ0ICAxMjM0NTY3ODkgICAgICAgICAgKzQgICAtPiA1Njc4OTAwMDAKK3NoaXgwNDUgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICArNSAgIC0+IDY3ODkwMDAwMAorc2hpeDA0NiBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgICs2ICAgLT4gNzg5MDAwMDAwCitzaGl4MDQ3IHNoaWZ0ICAxMjM0NTY3ODkgICAgICAgICAgKzcgICAtPiA4OTAwMDAwMDAKK3NoaXgwNDggc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICArOCAgIC0+IDkwMDAwMDAwMAorc2hpeDA0OSBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgICs5ICAgLT4gMAorCistLSBmcm9tIGV4YW1wbGVzCitzaGl4MDUxIHNoaWZ0IDM0ICAgICAgICA4ICAgLT4gICc0MDAwMDAwMDAnCitzaGl4MDUyIHNoaWZ0IDEyICAgICAgICA5ICAgLT4gICcwJworc2hpeDA1MyBzaGlmdCAxMjM0NTY3ODkgLTIgIC0+ICAnMTIzNDU2NycKK3NoaXgwNTQgc2hpZnQgMTIzNDU2Nzg5IDAgICAtPiAgJzEyMzQ1Njc4OScKK3NoaXgwNTUgc2hpZnQgMTIzNDU2Nzg5ICsyICAtPiAgJzM0NTY3ODkwMCcKKworLS0gemVyb3MKK3NoaXgwNjAgc2hpZnQgIDBFLTEwICAgICAgICAgICAgICArOSAgIC0+ICAgMEUtMTAKK3NoaXgwNjEgc2hpZnQgIDBFLTEwICAgICAgICAgICAgICAtOSAgIC0+ICAgMEUtMTAKK3NoaXgwNjIgc2hpZnQgIDAuMDAwICAgICAgICAgICAgICArOSAgIC0+ICAgMC4wMDAKK3NoaXgwNjMgc2hpZnQgIDAuMDAwICAgICAgICAgICAgICAtOSAgIC0+ICAgMC4wMDAKK3NoaXgwNjQgc2hpZnQgIDBFKzEwICAgICAgICAgICAgICArOSAgIC0+ICAgMEUrMTAKK3NoaXgwNjUgc2hpZnQgIDBFKzEwICAgICAgICAgICAgICAtOSAgIC0+ICAgMEUrMTAKK3NoaXgwNjYgc2hpZnQgLTBFLTEwICAgICAgICAgICAgICArOSAgIC0+ICAtMEUtMTAKK3NoaXgwNjcgc2hpZnQgLTBFLTEwICAgICAgICAgICAgICAtOSAgIC0+ICAtMEUtMTAKK3NoaXgwNjggc2hpZnQgLTAuMDAwICAgICAgICAgICAgICArOSAgIC0+ICAtMC4wMDAKK3NoaXgwNjkgc2hpZnQgLTAuMDAwICAgICAgICAgICAgICAtOSAgIC0+ICAtMC4wMDAKK3NoaXgwNzAgc2hpZnQgLTBFKzEwICAgICAgICAgICAgICArOSAgIC0+ICAtMEUrMTAKK3NoaXgwNzEgc2hpZnQgLTBFKzEwICAgICAgICAgICAgICAtOSAgIC0+ICAtMEUrMTAKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK3NoaXgxNDEgc2hpZnQgIDkuOTk5OTk5OTlFKzk5OSAgICAgLTEgIC0+IDkuOTk5OTk5OUUrOTk4CitzaGl4MTQyIHNoaWZ0ICA5Ljk5OTk5OTk5RSs5OTkgICAgIC04ICAtPiA5RSs5OTEKK3NoaXgxNDMgc2hpZnQgIDkuOTk5OTk5OTlFKzk5OSAgICAgIDEgIC0+IDkuOTk5OTk5OTBFKzk5OQorc2hpeDE0NCBzaGlmdCAgOS45OTk5OTk5OUUrOTk5ICAgICAgOCAgLT4gOS4wMDAwMDAwMEUrOTk5CitzaGl4MTQ1IHNoaWZ0ICAxRS05OTkgICAgICAgICAgICAgIC0xICAtPiAwRS05OTkKK3NoaXgxNDYgc2hpZnQgIDFFLTk5OSAgICAgICAgICAgICAgLTggIC0+IDBFLTk5OQorc2hpeDE0NyBzaGlmdCAgMUUtOTk5ICAgICAgICAgICAgICAgMSAgLT4gMS4wRS05OTgKK3NoaXgxNDggc2hpZnQgIDFFLTk5OSAgICAgICAgICAgICAgIDggIC0+IDEuMDAwMDAwMDBFLTk5MQorc2hpeDE1MSBzaGlmdCAgMS4wMDAwMDAwMEUtOTk5ICAgICAtMSAgLT4gMS4wMDAwMDAwRS0xMDAwCitzaGl4MTUyIHNoaWZ0ICAxLjAwMDAwMDAwRS05OTkgICAgIC04ICAtPiAxRS0xMDA3CitzaGl4MTUzIHNoaWZ0ICAxLjAwMDAwMDAwRS05OTkgICAgICAxICAtPiAwRS0xMDA3CitzaGl4MTU0IHNoaWZ0ICAxLjAwMDAwMDAwRS05OTkgICAgICA4ICAtPiAwRS0xMDA3CitzaGl4MTU1IHNoaWZ0ICA5LjAwMDAwMDAwRS05OTkgICAgIC0xICAtPiA5LjAwMDAwMDBFLTEwMDAKK3NoaXgxNTYgc2hpZnQgIDkuMDAwMDAwMDBFLTk5OSAgICAgLTggIC0+IDlFLTEwMDcKK3NoaXgxNTcgc2hpZnQgIDkuMDAwMDAwMDBFLTk5OSAgICAgIDEgIC0+IDBFLTEwMDcKK3NoaXgxNTggc2hpZnQgIDkuMDAwMDAwMDBFLTk5OSAgICAgIDggIC0+IDBFLTEwMDcKK3NoaXgxNjAgc2hpZnQgIDFFLTEwMDcgICAgICAgICAgICAgLTEgIC0+IDBFLTEwMDcKK3NoaXgxNjEgc2hpZnQgIDFFLTEwMDcgICAgICAgICAgICAgLTggIC0+IDBFLTEwMDcKK3NoaXgxNjIgc2hpZnQgIDFFLTEwMDcgICAgICAgICAgICAgIDEgIC0+IDEuMEUtMTAwNgorc2hpeDE2MyBzaGlmdCAgMUUtMTAwNyAgICAgICAgICAgICAgOCAgLT4gMS4wMDAwMDAwMEUtOTk5CistLSAgbmVnYXRpdmVzCitzaGl4MTcxIHNoaWZ0IC05Ljk5OTk5OTk5RSs5OTkgICAgIC0xICAtPiAtOS45OTk5OTk5RSs5OTgKK3NoaXgxNzIgc2hpZnQgLTkuOTk5OTk5OTlFKzk5OSAgICAgLTggIC0+IC05RSs5OTEKK3NoaXgxNzMgc2hpZnQgLTkuOTk5OTk5OTlFKzk5OSAgICAgIDEgIC0+IC05Ljk5OTk5OTkwRSs5OTkKK3NoaXgxNzQgc2hpZnQgLTkuOTk5OTk5OTlFKzk5OSAgICAgIDggIC0+IC05LjAwMDAwMDAwRSs5OTkKK3NoaXgxNzUgc2hpZnQgLTFFLTk5OSAgICAgICAgICAgICAgLTEgIC0+IC0wRS05OTkKK3NoaXgxNzYgc2hpZnQgLTFFLTk5OSAgICAgICAgICAgICAgLTggIC0+IC0wRS05OTkKK3NoaXgxNzcgc2hpZnQgLTFFLTk5OSAgICAgICAgICAgICAgIDEgIC0+IC0xLjBFLTk5OAorc2hpeDE3OCBzaGlmdCAtMUUtOTk5ICAgICAgICAgICAgICAgOCAgLT4gLTEuMDAwMDAwMDBFLTk5MQorc2hpeDE4MSBzaGlmdCAtMS4wMDAwMDAwMEUtOTk5ICAgICAtMSAgLT4gLTEuMDAwMDAwMEUtMTAwMAorc2hpeDE4MiBzaGlmdCAtMS4wMDAwMDAwMEUtOTk5ICAgICAtOCAgLT4gLTFFLTEwMDcKK3NoaXgxODMgc2hpZnQgLTEuMDAwMDAwMDBFLTk5OSAgICAgIDEgIC0+IC0wRS0xMDA3CitzaGl4MTg0IHNoaWZ0IC0xLjAwMDAwMDAwRS05OTkgICAgICA4ICAtPiAtMEUtMTAwNworc2hpeDE4NSBzaGlmdCAtOS4wMDAwMDAwMEUtOTk5ICAgICAtMSAgLT4gLTkuMDAwMDAwMEUtMTAwMAorc2hpeDE4NiBzaGlmdCAtOS4wMDAwMDAwMEUtOTk5ICAgICAtOCAgLT4gLTlFLTEwMDcKK3NoaXgxODcgc2hpZnQgLTkuMDAwMDAwMDBFLTk5OSAgICAgIDEgIC0+IC0wRS0xMDA3CitzaGl4MTg4IHNoaWZ0IC05LjAwMDAwMDAwRS05OTkgICAgICA4ICAtPiAtMEUtMTAwNworc2hpeDE5MCBzaGlmdCAtMUUtMTAwNyAgICAgICAgICAgICAtMSAgLT4gLTBFLTEwMDcKK3NoaXgxOTEgc2hpZnQgLTFFLTEwMDcgICAgICAgICAgICAgLTggIC0+IC0wRS0xMDA3CitzaGl4MTkyIHNoaWZ0IC0xRS0xMDA3ICAgICAgICAgICAgICAxICAtPiAtMS4wRS0xMDA2CitzaGl4MTkzIHNoaWZ0IC0xRS0xMDA3ICAgICAgICAgICAgICA4ICAtPiAtMS4wMDAwMDAwMEUtOTk5CisKKy0tIG1vcmUgbmVnYXRpdmVzIChvZiBzYW5pdGllcykKK3NoaXgyMDEgc2hpZnQgICAgICAgICAtMCAgICAwICAtPiAgLTAKK3NoaXgyMDIgc2hpZnQgICAgICAgICAtMCAgICAyICAtPiAgLTAKK3NoaXgyMDMgc2hpZnQgICAgICAgICAtMSAgICAyICAtPiAgLTEwMAorc2hpeDIwNCBzaGlmdCAgICAgICAgIC0xICAgIDggIC0+ICAtMTAwMDAwMDAwCitzaGl4MjA1IHNoaWZ0ICAgICAgICAgLTEgICAgOSAgLT4gIC0wCitzaGl4MjA2IHNoaWZ0ICAgICAgICAgLTEgICAtMSAgLT4gIC0wCitzaGl4MjA3IHNoaWZ0IC0xMjM0NTY3ODkgICAtMSAgLT4gIC0xMjM0NTY3OAorc2hpeDIwOCBzaGlmdCAtMTIzNDU2Nzg5ICAgLTggIC0+ICAtMQorc2hpeDIwOSBzaGlmdCAtMTIzNDU2Nzg5ICAgLTkgIC0+ICAtMAorc2hpeDIxMCBzaGlmdCAgICAgICAgIC0wICAgLTIgIC0+ICAtMAorc2hpeDIxMSBzaGlmdCAgICAgICAgIC0wICAgLTAgIC0+ICAtMAorCisKKy0tIFNwZWNpYWxzOyBOYU5zIGFyZSBoYW5kbGVkIGFzIHVzdWFsCitzaGl4NzgxIHNoaWZ0IC1JbmYgIC04ICAgICAtPiAtSW5maW5pdHkKK3NoaXg3ODIgc2hpZnQgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorc2hpeDc4MyBzaGlmdCAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitzaGl4Nzg0IHNoaWZ0IC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK3NoaXg3ODUgc2hpZnQgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorc2hpeDc4NiBzaGlmdCAtSW5mICAgOCAgICAgLT4gLUluZmluaXR5CitzaGl4Nzg3IHNoaWZ0IC0xMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXg3ODggc2hpZnQgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDc4OSBzaGlmdCAtMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4NzkwIHNoaWZ0IC0wICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXg3OTEgc2hpZnQgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDc5MiBzaGlmdCAgMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4NzkzIHNoaWZ0ICAxMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXg3OTQgc2hpZnQgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitzaGl4ODAwIHNoaWZ0ICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4MDEgc2hpZnQgIEluZiAgLTggICAgIC0+IEluZmluaXR5CitzaGl4ODAyIHNoaWZ0ICBJbmYgIC0xICAgICAtPiBJbmZpbml0eQorc2hpeDgwMyBzaGlmdCAgSW5mICAtMCAgICAgLT4gSW5maW5pdHkKK3NoaXg4MDQgc2hpZnQgIEluZiAgIDAgICAgIC0+IEluZmluaXR5CitzaGl4ODA1IHNoaWZ0ICBJbmYgICAxICAgICAtPiBJbmZpbml0eQorc2hpeDgwNiBzaGlmdCAgSW5mICAgOCAgICAgLT4gSW5maW5pdHkKK3NoaXg4MDcgc2hpZnQgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDgwOCBzaGlmdCAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODA5IHNoaWZ0IC1JbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4MTAgc2hpZnQgLTEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDgxMSBzaGlmdCAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODEyIHNoaWZ0ICAwICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4MTMgc2hpZnQgIDEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDgxNCBzaGlmdCAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODE1IHNoaWZ0ICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworc2hpeDgyMSBzaGlmdCAgTmFOIC1JbmYgICAgLT4gIE5hTgorc2hpeDgyMiBzaGlmdCAgTmFOIC0xMDAwICAgLT4gIE5hTgorc2hpeDgyMyBzaGlmdCAgTmFOIC0xICAgICAgLT4gIE5hTgorc2hpeDgyNCBzaGlmdCAgTmFOIC0wICAgICAgLT4gIE5hTgorc2hpeDgyNSBzaGlmdCAgTmFOICAwICAgICAgLT4gIE5hTgorc2hpeDgyNiBzaGlmdCAgTmFOICAxICAgICAgLT4gIE5hTgorc2hpeDgyNyBzaGlmdCAgTmFOICAxMDAwICAgLT4gIE5hTgorc2hpeDgyOCBzaGlmdCAgTmFOICBJbmYgICAgLT4gIE5hTgorc2hpeDgyOSBzaGlmdCAgTmFOICBOYU4gICAgLT4gIE5hTgorc2hpeDgzMCBzaGlmdCAtSW5mICBOYU4gICAgLT4gIE5hTgorc2hpeDgzMSBzaGlmdCAtMTAwMCBOYU4gICAgLT4gIE5hTgorc2hpeDgzMiBzaGlmdCAtMSAgICBOYU4gICAgLT4gIE5hTgorc2hpeDgzMyBzaGlmdCAtMCAgICBOYU4gICAgLT4gIE5hTgorc2hpeDgzNCBzaGlmdCAgMCAgICBOYU4gICAgLT4gIE5hTgorc2hpeDgzNSBzaGlmdCAgMSAgICBOYU4gICAgLT4gIE5hTgorc2hpeDgzNiBzaGlmdCAgMTAwMCBOYU4gICAgLT4gIE5hTgorc2hpeDgzNyBzaGlmdCAgSW5mICBOYU4gICAgLT4gIE5hTgorCitzaGl4ODQxIHNoaWZ0ICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg0MiBzaGlmdCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NDMgc2hpZnQgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODQ0IHNoaWZ0ICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg0NSBzaGlmdCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NDYgc2hpZnQgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODQ3IHNoaWZ0ICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg0OCBzaGlmdCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NDkgc2hpZnQgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODUwIHNoaWZ0ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg1MSBzaGlmdCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NTIgc2hpZnQgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODUzIHNoaWZ0IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg1NCBzaGlmdCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NTUgc2hpZnQgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODU2IHNoaWZ0ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg1NyBzaGlmdCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NTggc2hpZnQgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODU5IHNoaWZ0ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitzaGl4ODYxIHNoaWZ0ICBOYU4xICAgLUluZiAgICAtPiAgTmFOMQorc2hpeDg2MiBzaGlmdCArTmFOMiAgIC0xMDAwICAgLT4gIE5hTjIKK3NoaXg4NjMgc2hpZnQgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCitzaGl4ODY0IHNoaWZ0ICBOYU40ICAgIEluZiAgICAtPiAgTmFONAorc2hpeDg2NSBzaGlmdCAgTmFONSAgICtOYU42ICAgLT4gIE5hTjUKK3NoaXg4NjYgc2hpZnQgLUluZiAgICAgTmFONyAgIC0+ICBOYU43CitzaGl4ODY3IHNoaWZ0IC0xMDAwICAgIE5hTjggICAtPiAgTmFOOAorc2hpeDg2OCBzaGlmdCAgMTAwMCAgICBOYU45ICAgLT4gIE5hTjkKK3NoaXg4Njkgc2hpZnQgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorc2hpeDg3MSBzaGlmdCAgc05hTjExICAtSW5mICAgLT4gIE5hTjExICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg3MiBzaGlmdCAgc05hTjEyICAtMTAwMCAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg3MyBzaGlmdCAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg3NCBzaGlmdCAgc05hTjE0ICAgTmFOMTcgLT4gIE5hTjE0ICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg3NSBzaGlmdCAgc05hTjE1ICBzTmFOMTggLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg3NiBzaGlmdCAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg3NyBzaGlmdCAtSW5mICAgICtzTmFOMjAgLT4gIE5hTjIwICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg3OCBzaGlmdCAtMTAwMCAgICBzTmFOMjEgLT4gIE5hTjIxICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg3OSBzaGlmdCAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg4MCBzaGlmdCAgSW5mICAgICBzTmFOMjMgLT4gIE5hTjIzICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg4MSBzaGlmdCArTmFOMjUgICtzTmFOMjQgLT4gIE5hTjI0ICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg4MiBzaGlmdCAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2CitzaGl4ODgzIHNoaWZ0IC1zTmFOMjcgIHNOYU4yOSAtPiAtTmFOMjcgIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODg0IHNoaWZ0ICAxMDAwICAgIC1OYU4zMCAtPiAtTmFOMzAKK3NoaXg4ODUgc2hpZnQgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc3F1YXJlcm9vdC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9zcXVhcmVyb290LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwZTUxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc3F1YXJlcm9vdC5kZWNUZXN0CkBAIC0wLDAgKzEsMzgzNCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBzcXVhcmVyb290LmRlY1Rlc3QgLS0gZGVjaW1hbCBzcXVhcmUgcm9vdCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDAzLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIGJhc2ljcworc3F0eDAwMSBzcXVhcmVyb290IDEgICAgICAgLT4gMQorc3F0eDAwMiBzcXVhcmVyb290IC0xICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDAzIHNxdWFyZXJvb3QgMS4wMCAgICAtPiAxLjAKK3NxdHgwMDQgc3F1YXJlcm9vdCAtMS4wMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDAwNSBzcXVhcmVyb290IDAgICAgICAgLT4gMAorc3F0eDAwNiBzcXVhcmVyb290IDAwLjAgICAgLT4gMC4wCitzcXR4MDA3IHNxdWFyZXJvb3QgMC4wMCAgICAtPiAwLjAKK3NxdHgwMDggc3F1YXJlcm9vdCAwMC4wMCAgIC0+IDAuMAorc3F0eDAwOSBzcXVhcmVyb290IDAwLjAwMCAgLT4gMC4wMAorc3F0eDAxMCBzcXVhcmVyb290IDAwLjAwMDAgLT4gMC4wMAorc3F0eDAxMSBzcXVhcmVyb290IDAwICAgICAgLT4gMAorCitzcXR4MDEyIHNxdWFyZXJvb3QgLTIgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwMTMgc3F1YXJlcm9vdCAyICAgICAgIC0+IDEuNDE0MjEzNTYgSW5leGFjdCBSb3VuZGVkCitzcXR4MDE0IHNxdWFyZXJvb3QgLTIuMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwMTUgc3F1YXJlcm9vdCAyLjAwICAgIC0+IDEuNDE0MjEzNTYgSW5leGFjdCBSb3VuZGVkCitzcXR4MDE2IHNxdWFyZXJvb3QgLTAgICAgICAtPiAtMAorc3F0eDAxNyBzcXVhcmVyb290IC0wLjAgICAgLT4gLTAuMAorc3F0eDAxOCBzcXVhcmVyb290IC0wMC4wMCAgLT4gLTAuMAorc3F0eDAxOSBzcXVhcmVyb290IC0wMC4wMDAgLT4gLTAuMDAKK3NxdHgwMjAgc3F1YXJlcm9vdCAtMC4wMDAwIC0+IC0wLjAwCitzcXR4MDIxIHNxdWFyZXJvb3QgLTBFKzkgICAtPiAtMEUrNAorc3F0eDAyMiBzcXVhcmVyb290IC0wRSsxMCAgLT4gLTBFKzUKK3NxdHgwMjMgc3F1YXJlcm9vdCAtMEUrMTEgIC0+IC0wRSs1CitzcXR4MDI0IHNxdWFyZXJvb3QgLTBFKzEyICAtPiAtMEUrNgorc3F0eDAyNSBzcXVhcmVyb290IC0wMCAgICAgLT4gLTAKK3NxdHgwMjYgc3F1YXJlcm9vdCAwRSs1ICAgIC0+IDBFKzIKK3NxdHgwMjcgc3F1YXJlcm9vdCA0LjAgICAgIC0+IDIuMAorc3F0eDAyOCBzcXVhcmVyb290IDQuMDAgICAgLT4gMi4wCisKK3NxdHgwMzAgc3F1YXJlcm9vdCArMC4xICAgICAgICAgICAgLT4gMC4zMTYyMjc3NjYgSW5leGFjdCBSb3VuZGVkCitzcXR4MDMxIHNxdWFyZXJvb3QgLTAuMSAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDAzMiBzcXVhcmVyb290ICswLjAxICAgICAgICAgICAtPiAwLjEKK3NxdHgwMzMgc3F1YXJlcm9vdCAtMC4wMSAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDM0IHNxdWFyZXJvb3QgKzAuMDAxICAgICAgICAgIC0+IDAuMDMxNjIyNzc2NiBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwMzUgc3F1YXJlcm9vdCAtMC4wMDEgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDM2IHNxdWFyZXJvb3QgKzAuMDAwMDAxICAgICAgIC0+IDAuMDAxCitzcXR4MDM3IHNxdWFyZXJvb3QgLTAuMDAwMDAxICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDAzOCBzcXVhcmVyb290ICswLjAwMDAwMDAwMDAwMSAtPiAwLjAwMDAwMQorc3F0eDAzOSBzcXVhcmVyb290IC0wLjAwMDAwMDAwMDAwMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworc3F0eDA0MSBzcXVhcmVyb290IDEuMSAgICAgICAgLT4gMS4wNDg4MDg4NSBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwNDIgc3F1YXJlcm9vdCAxLjEwICAgICAgIC0+IDEuMDQ4ODA4ODUgSW5leGFjdCBSb3VuZGVkCitzcXR4MDQzIHNxdWFyZXJvb3QgMS4xMDAgICAgICAtPiAxLjA0ODgwODg1IEluZXhhY3QgUm91bmRlZAorc3F0eDA0NCBzcXVhcmVyb290IDEuMTEwICAgICAgLT4gMS4wNTM1NjUzOCBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwNDUgc3F1YXJlcm9vdCAtMS4xICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDA0NiBzcXVhcmVyb290IC0xLjEwICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDQ3IHNxdWFyZXJvb3QgLTEuMTAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwNDggc3F1YXJlcm9vdCAtMS4xMTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDA0OSBzcXVhcmVyb290IDkuOSAgICAgICAgLT4gMy4xNDY0MjY1NCBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwNTAgc3F1YXJlcm9vdCA5LjkwICAgICAgIC0+IDMuMTQ2NDI2NTQgSW5leGFjdCBSb3VuZGVkCitzcXR4MDUxIHNxdWFyZXJvb3QgOS45MDAgICAgICAtPiAzLjE0NjQyNjU0IEluZXhhY3QgUm91bmRlZAorc3F0eDA1MiBzcXVhcmVyb290IDkuOTkwICAgICAgLT4gMy4xNjA2OTYxMyBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwNTMgc3F1YXJlcm9vdCAtOS45ICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDA1NCBzcXVhcmVyb290IC05LjkwICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDU1IHNxdWFyZXJvb3QgLTkuOTAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwNTYgc3F1YXJlcm9vdCAtOS45OTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitzcXR4MDYwIHNxdWFyZXJvb3QgIDEgICAgICAgICAgIC0+IDEKK3NxdHgwNjEgc3F1YXJlcm9vdCAgMS4wICAgICAgICAgLT4gMS4wCitzcXR4MDYyIHNxdWFyZXJvb3QgIDEuMDAgICAgICAgIC0+IDEuMAorc3F0eDA2MyBzcXVhcmVyb290ICAxMC4wICAgICAgICAtPiAzLjE2MjI3NzY2IEluZXhhY3QgUm91bmRlZAorc3F0eDA2NCBzcXVhcmVyb290ICAxMC4wICAgICAgICAtPiAzLjE2MjI3NzY2IEluZXhhY3QgUm91bmRlZAorc3F0eDA2NSBzcXVhcmVyb290ICAxMC4wICAgICAgICAtPiAzLjE2MjI3NzY2IEluZXhhY3QgUm91bmRlZAorc3F0eDA2NiBzcXVhcmVyb290ICAxMC4wMCAgICAgICAtPiAzLjE2MjI3NzY2IEluZXhhY3QgUm91bmRlZAorc3F0eDA2NyBzcXVhcmVyb290ICAxMDAgICAgICAgICAtPiAxMAorc3F0eDA2OCBzcXVhcmVyb290ICAxMDAuMCAgICAgICAtPiAxMC4wCitzcXR4MDY5IHNxdWFyZXJvb3QgIDEwMC4wMCAgICAgIC0+IDEwLjAKK3NxdHgwNzAgc3F1YXJlcm9vdCAgMS4xMDAwRSszICAgLT4gMzMuMTY2MjQ3OSBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwNzEgc3F1YXJlcm9vdCAgMS4xMDAwMEUrMyAgLT4gMzMuMTY2MjQ3OSBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwNzIgc3F1YXJlcm9vdCAtMTAuMCAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDczIHNxdWFyZXJvb3QgLTEwLjAwICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDA3NCBzcXVhcmVyb290IC0xMDAuMCAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwNzUgc3F1YXJlcm9vdCAtMTAwLjAwICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDc2IHNxdWFyZXJvb3QgLTEuMTAwMEUrMyAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDA3NyBzcXVhcmVyb290IC0xLjEwMDAwRSszICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwNzggc3F1YXJlcm9vdCAgMS4wMDAgICAgICAgLT4gMS4wMAorc3F0eDA3OSBzcXVhcmVyb290ICAxLjAwMDAgICAgICAtPiAxLjAwCisKKy0tIGZhbW91cyBzcXVhcmVzCitzcXR4MDgwIHNxdWFyZXJvb3QgICAgIDEgIC0+IDEKK3NxdHgwODEgc3F1YXJlcm9vdCAgICAgNCAgLT4gMgorc3F0eDA4MiBzcXVhcmVyb290ICAgICA5ICAtPiAzCitzcXR4MDgzIHNxdWFyZXJvb3QgICAgMTYgIC0+IDQKK3NxdHgwODQgc3F1YXJlcm9vdCAgICAyNSAgLT4gNQorc3F0eDA4NSBzcXVhcmVyb290ICAgIDM2ICAtPiA2CitzcXR4MDg2IHNxdWFyZXJvb3QgICAgNDkgIC0+IDcKK3NxdHgwODcgc3F1YXJlcm9vdCAgICA2NCAgLT4gOAorc3F0eDA4OCBzcXVhcmVyb290ICAgIDgxICAtPiA5CitzcXR4MDg5IHNxdWFyZXJvb3QgICAxMDAgIC0+IDEwCitzcXR4MDkwIHNxdWFyZXJvb3QgICAxMjEgIC0+IDExCitzcXR4MDkxIHNxdWFyZXJvb3QgICAxNDQgIC0+IDEyCitzcXR4MDkyIHNxdWFyZXJvb3QgICAxNjkgIC0+IDEzCitzcXR4MDkzIHNxdWFyZXJvb3QgICAyNTYgIC0+IDE2CitzcXR4MDk0IHNxdWFyZXJvb3QgIDEwMjQgIC0+IDMyCitzcXR4MDk1IHNxdWFyZXJvb3QgIDQwOTYgIC0+IDY0CitzcXR4MTAwIHNxdWFyZXJvb3QgICAwLjAxIC0+IDAuMQorc3F0eDEwMSBzcXVhcmVyb290ICAgMC4wNCAtPiAwLjIKK3NxdHgxMDIgc3F1YXJlcm9vdCAgIDAuMDkgLT4gMC4zCitzcXR4MTAzIHNxdWFyZXJvb3QgICAwLjE2IC0+IDAuNAorc3F0eDEwNCBzcXVhcmVyb290ICAgMC4yNSAtPiAwLjUKK3NxdHgxMDUgc3F1YXJlcm9vdCAgIDAuMzYgLT4gMC42CitzcXR4MTA2IHNxdWFyZXJvb3QgICAwLjQ5IC0+IDAuNworc3F0eDEwNyBzcXVhcmVyb290ICAgMC42NCAtPiAwLjgKK3NxdHgxMDggc3F1YXJlcm9vdCAgIDAuODEgLT4gMC45CitzcXR4MTA5IHNxdWFyZXJvb3QgICAxLjAwIC0+IDEuMAorc3F0eDExMCBzcXVhcmVyb290ICAgMS4yMSAtPiAxLjEKK3NxdHgxMTEgc3F1YXJlcm9vdCAgIDEuNDQgLT4gMS4yCitzcXR4MTEyIHNxdWFyZXJvb3QgICAxLjY5IC0+IDEuMworc3F0eDExMyBzcXVhcmVyb290ICAgMi41NiAtPiAxLjYKK3NxdHgxMTQgc3F1YXJlcm9vdCAgMTAuMjQgLT4gMy4yCitzcXR4MTE1IHNxdWFyZXJvb3QgIDQwLjk2IC0+IDYuNAorCistLSBQcmVjaXNpb24gMSBzcXVhcmVyb290IHRlc3RzIFtleGhhdXN0aXZlLCBwbHVzIGV4cG9uZW50IGFkanVzdHNdCityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiAgIDEKK3NxdHgxMjAxIHNxdWFyZXJvb3QgMC4xIC0+IDAuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIwMiBzcXVhcmVyb290IDAuMDEgLT4gMC4xCitzcXR4MTIwMyBzcXVhcmVyb290IDEuMEUtMSAtPiAwLjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMDQgc3F1YXJlcm9vdCAxLjAwRS0yIC0+IDAuMSAgUm91bmRlZAorc3F0eDEyMDUgc3F1YXJlcm9vdCAxRS0zIC0+IDAuMDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMDYgc3F1YXJlcm9vdCAxRSsxIC0+IDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMDcgc3F1YXJlcm9vdCAxRSsyIC0+IDFFKzEKK3NxdHgxMjA4IHNxdWFyZXJvb3QgMUUrMyAtPiAzRSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjA5IHNxdWFyZXJvb3QgMC4yIC0+IDAuNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIxMCBzcXVhcmVyb290IDAuMDIgLT4gMC4xICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjExIHNxdWFyZXJvb3QgMi4wRS0xIC0+IDAuNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIxMiBzcXVhcmVyb290IDIuMDBFLTIgLT4gMC4xICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjEzIHNxdWFyZXJvb3QgMkUtMyAtPiAwLjA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjE0IHNxdWFyZXJvb3QgMkUrMSAtPiA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjE1IHNxdWFyZXJvb3QgMkUrMiAtPiAxRSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjE2IHNxdWFyZXJvb3QgMkUrMyAtPiA0RSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjE3IHNxdWFyZXJvb3QgMC4zIC0+IDAuNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIxOCBzcXVhcmVyb290IDAuMDMgLT4gMC4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjE5IHNxdWFyZXJvb3QgMy4wRS0xIC0+IDAuNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIyMCBzcXVhcmVyb290IDMuMDBFLTIgLT4gMC4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjIxIHNxdWFyZXJvb3QgM0UtMyAtPiAwLjA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjIyIHNxdWFyZXJvb3QgM0UrMSAtPiA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjIzIHNxdWFyZXJvb3QgM0UrMiAtPiAyRSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjI0IHNxdWFyZXJvb3QgM0UrMyAtPiA1RSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjI1IHNxdWFyZXJvb3QgMC40IC0+IDAuNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIyNiBzcXVhcmVyb290IDAuMDQgLT4gMC4yCitzcXR4MTIyNyBzcXVhcmVyb290IDQuMEUtMSAtPiAwLjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMjggc3F1YXJlcm9vdCA0LjAwRS0yIC0+IDAuMiAgUm91bmRlZAorc3F0eDEyMjkgc3F1YXJlcm9vdCA0RS0zIC0+IDAuMDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMzAgc3F1YXJlcm9vdCA0RSsxIC0+IDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMzEgc3F1YXJlcm9vdCA0RSsyIC0+IDJFKzEKK3NxdHgxMjMyIHNxdWFyZXJvb3QgNEUrMyAtPiA2RSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjMzIHNxdWFyZXJvb3QgMC41IC0+IDAuNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIzNCBzcXVhcmVyb290IDAuMDUgLT4gMC4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjM1IHNxdWFyZXJvb3QgNS4wRS0xIC0+IDAuNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIzNiBzcXVhcmVyb290IDUuMDBFLTIgLT4gMC4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjM3IHNxdWFyZXJvb3QgNUUtMyAtPiAwLjA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjM4IHNxdWFyZXJvb3QgNUUrMSAtPiA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjM5IHNxdWFyZXJvb3QgNUUrMiAtPiAyRSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjQwIHNxdWFyZXJvb3QgNUUrMyAtPiA3RSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjQxIHNxdWFyZXJvb3QgMC42IC0+IDAuOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI0MiBzcXVhcmVyb290IDAuMDYgLT4gMC4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjQzIHNxdWFyZXJvb3QgNi4wRS0xIC0+IDAuOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI0NCBzcXVhcmVyb290IDYuMDBFLTIgLT4gMC4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjQ1IHNxdWFyZXJvb3QgNkUtMyAtPiAwLjA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjQ2IHNxdWFyZXJvb3QgNkUrMSAtPiA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjQ3IHNxdWFyZXJvb3QgNkUrMiAtPiAyRSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjQ4IHNxdWFyZXJvb3QgNkUrMyAtPiA4RSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjQ5IHNxdWFyZXJvb3QgMC43IC0+IDAuOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI1MCBzcXVhcmVyb290IDAuMDcgLT4gMC4zICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjUxIHNxdWFyZXJvb3QgNy4wRS0xIC0+IDAuOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI1MiBzcXVhcmVyb290IDcuMDBFLTIgLT4gMC4zICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjUzIHNxdWFyZXJvb3QgN0UtMyAtPiAwLjA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjU0IHNxdWFyZXJvb3QgN0UrMSAtPiA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjU1IHNxdWFyZXJvb3QgN0UrMiAtPiAzRSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjU2IHNxdWFyZXJvb3QgN0UrMyAtPiA4RSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjU3IHNxdWFyZXJvb3QgMC44IC0+IDAuOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI1OCBzcXVhcmVyb290IDAuMDggLT4gMC4zICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjU5IHNxdWFyZXJvb3QgOC4wRS0xIC0+IDAuOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI2MCBzcXVhcmVyb290IDguMDBFLTIgLT4gMC4zICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjYxIHNxdWFyZXJvb3QgOEUtMyAtPiAwLjA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjYyIHNxdWFyZXJvb3QgOEUrMSAtPiA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjYzIHNxdWFyZXJvb3QgOEUrMiAtPiAzRSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjY0IHNxdWFyZXJvb3QgOEUrMyAtPiA5RSsxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjY1IHNxdWFyZXJvb3QgMC45IC0+IDAuOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI2NiBzcXVhcmVyb290IDAuMDkgLT4gMC4zCitzcXR4MTI2NyBzcXVhcmVyb290IDkuMEUtMSAtPiAwLjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyNjggc3F1YXJlcm9vdCA5LjAwRS0yIC0+IDAuMyAgUm91bmRlZAorc3F0eDEyNjkgc3F1YXJlcm9vdCA5RS0zIC0+IDAuMDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyNzAgc3F1YXJlcm9vdCA5RSsxIC0+IDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyNzEgc3F1YXJlcm9vdCA5RSsyIC0+IDNFKzEKK3NxdHgxMjcyIHNxdWFyZXJvb3QgOUUrMyAtPiA5RSsxICBJbmV4YWN0IFJvdW5kZWQKKworLS0gUHJlY2lzaW9uIDIgc3F1YXJlcm9vdCB0ZXN0cyBbZXhoYXVzdGl2ZSwgcGx1cyBleHBvbmVudCBhZGp1c3RzXQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogICAyCitzcXR4MjIwMSBzcXVhcmVyb290IDAuMSAtPiAwLjMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjAyIHNxdWFyZXJvb3QgMC4wMSAtPiAwLjEKK3NxdHgyMjAzIHNxdWFyZXJvb3QgMS4wRS0xIC0+IDAuMzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMDQgc3F1YXJlcm9vdCAxLjAwRS0yIC0+IDAuMTAKK3NxdHgyMjA1IHNxdWFyZXJvb3QgMUUtMyAtPiAwLjAzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIwNiBzcXVhcmVyb290IDFFKzEgLT4gMy4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjA3IHNxdWFyZXJvb3QgMUUrMiAtPiAxRSsxCitzcXR4MjIwOCBzcXVhcmVyb290IDFFKzMgLT4gMzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMDkgc3F1YXJlcm9vdCAwLjIgLT4gMC40NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIxMCBzcXVhcmVyb290IDAuMDIgLT4gMC4xNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIxMSBzcXVhcmVyb290IDIuMEUtMSAtPiAwLjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjEyIHNxdWFyZXJvb3QgMi4wMEUtMiAtPiAwLjE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjEzIHNxdWFyZXJvb3QgMkUtMyAtPiAwLjA0NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIxNCBzcXVhcmVyb290IDJFKzEgLT4gNC41ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjE1IHNxdWFyZXJvb3QgMkUrMiAtPiAxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIxNiBzcXVhcmVyb290IDJFKzMgLT4gNDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMTcgc3F1YXJlcm9vdCAwLjMgLT4gMC41NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIxOCBzcXVhcmVyb290IDAuMDMgLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIxOSBzcXVhcmVyb290IDMuMEUtMSAtPiAwLjU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjIwIHNxdWFyZXJvb3QgMy4wMEUtMiAtPiAwLjE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjIxIHNxdWFyZXJvb3QgM0UtMyAtPiAwLjA1NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIyMiBzcXVhcmVyb290IDNFKzEgLT4gNS41ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjIzIHNxdWFyZXJvb3QgM0UrMiAtPiAxNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIyNCBzcXVhcmVyb290IDNFKzMgLT4gNTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMjUgc3F1YXJlcm9vdCAwLjQgLT4gMC42MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIyNiBzcXVhcmVyb290IDAuMDQgLT4gMC4yCitzcXR4MjIyNyBzcXVhcmVyb290IDQuMEUtMSAtPiAwLjYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjI4IHNxdWFyZXJvb3QgNC4wMEUtMiAtPiAwLjIwCitzcXR4MjIyOSBzcXVhcmVyb290IDRFLTMgLT4gMC4wNjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMzAgc3F1YXJlcm9vdCA0RSsxIC0+IDYuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIzMSBzcXVhcmVyb290IDRFKzIgLT4gMkUrMQorc3F0eDIyMzIgc3F1YXJlcm9vdCA0RSszIC0+IDYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjMzIHNxdWFyZXJvb3QgMC41IC0+IDAuNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMzQgc3F1YXJlcm9vdCAwLjA1IC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMzUgc3F1YXJlcm9vdCA1LjBFLTEgLT4gMC43MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIzNiBzcXVhcmVyb290IDUuMDBFLTIgLT4gMC4yMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIzNyBzcXVhcmVyb290IDVFLTMgLT4gMC4wNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMzggc3F1YXJlcm9vdCA1RSsxIC0+IDcuMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIzOSBzcXVhcmVyb290IDVFKzIgLT4gMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNDAgc3F1YXJlcm9vdCA1RSszIC0+IDcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjQxIHNxdWFyZXJvb3QgMC42IC0+IDAuNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNDIgc3F1YXJlcm9vdCAwLjA2IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNDMgc3F1YXJlcm9vdCA2LjBFLTEgLT4gMC43NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI0NCBzcXVhcmVyb290IDYuMDBFLTIgLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI0NSBzcXVhcmVyb290IDZFLTMgLT4gMC4wNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNDYgc3F1YXJlcm9vdCA2RSsxIC0+IDcuNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI0NyBzcXVhcmVyb290IDZFKzIgLT4gMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNDggc3F1YXJlcm9vdCA2RSszIC0+IDc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjQ5IHNxdWFyZXJvb3QgMC43IC0+IDAuODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNTAgc3F1YXJlcm9vdCAwLjA3IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNTEgc3F1YXJlcm9vdCA3LjBFLTEgLT4gMC44NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI1MiBzcXVhcmVyb290IDcuMDBFLTIgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI1MyBzcXVhcmVyb290IDdFLTMgLT4gMC4wODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNTQgc3F1YXJlcm9vdCA3RSsxIC0+IDguNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI1NSBzcXVhcmVyb290IDdFKzIgLT4gMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNTYgc3F1YXJlcm9vdCA3RSszIC0+IDg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjU3IHNxdWFyZXJvb3QgMC44IC0+IDAuODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNTggc3F1YXJlcm9vdCAwLjA4IC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNTkgc3F1YXJlcm9vdCA4LjBFLTEgLT4gMC44OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI2MCBzcXVhcmVyb290IDguMDBFLTIgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI2MSBzcXVhcmVyb290IDhFLTMgLT4gMC4wODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNjIgc3F1YXJlcm9vdCA4RSsxIC0+IDguOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI2MyBzcXVhcmVyb290IDhFKzIgLT4gMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNjQgc3F1YXJlcm9vdCA4RSszIC0+IDg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjY1IHNxdWFyZXJvb3QgMC45IC0+IDAuOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNjYgc3F1YXJlcm9vdCAwLjA5IC0+IDAuMworc3F0eDIyNjcgc3F1YXJlcm9vdCA5LjBFLTEgLT4gMC45NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI2OCBzcXVhcmVyb290IDkuMDBFLTIgLT4gMC4zMAorc3F0eDIyNjkgc3F1YXJlcm9vdCA5RS0zIC0+IDAuMDk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjcwIHNxdWFyZXJvb3QgOUUrMSAtPiA5LjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNzEgc3F1YXJlcm9vdCA5RSsyIC0+IDNFKzEKK3NxdHgyMjcyIHNxdWFyZXJvb3QgOUUrMyAtPiA5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI3MyBzcXVhcmVyb290IDAuMTAgLT4gMC4zMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI3NCBzcXVhcmVyb290IDAuMDEwIC0+IDAuMTAKK3NxdHgyMjc1IHNxdWFyZXJvb3QgMTAuMEUtMSAtPiAxLjAKK3NxdHgyMjc2IHNxdWFyZXJvb3QgMTAuMDBFLTIgLT4gMC4zMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI3NyBzcXVhcmVyb290IDEwRS0zIC0+IDAuMTAKK3NxdHgyMjc4IHNxdWFyZXJvb3QgMTBFKzEgLT4gMTAKK3NxdHgyMjc5IHNxdWFyZXJvb3QgMTBFKzIgLT4gMzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyODAgc3F1YXJlcm9vdCAxMEUrMyAtPiAxLjBFKzIKK3NxdHgyMjgxIHNxdWFyZXJvb3QgMC4xMSAtPiAwLjMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjgyIHNxdWFyZXJvb3QgMC4wMTEgLT4gMC4xMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI4MyBzcXVhcmVyb290IDExLjBFLTEgLT4gMS4wICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjg0IHNxdWFyZXJvb3QgMTEuMDBFLTIgLT4gMC4zMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI4NSBzcXVhcmVyb290IDExRS0zIC0+IDAuMTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyODYgc3F1YXJlcm9vdCAxMUUrMSAtPiAxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI4NyBzcXVhcmVyb290IDExRSsyIC0+IDMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjg4IHNxdWFyZXJvb3QgMTFFKzMgLT4gMS4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjg5IHNxdWFyZXJvb3QgMC4xMiAtPiAwLjM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjkwIHNxdWFyZXJvb3QgMC4wMTIgLT4gMC4xMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI5MSBzcXVhcmVyb290IDEyLjBFLTEgLT4gMS4xICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjkyIHNxdWFyZXJvb3QgMTIuMDBFLTIgLT4gMC4zNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI5MyBzcXVhcmVyb290IDEyRS0zIC0+IDAuMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyOTQgc3F1YXJlcm9vdCAxMkUrMSAtPiAxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI5NSBzcXVhcmVyb290IDEyRSsyIC0+IDM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjk2IHNxdWFyZXJvb3QgMTJFKzMgLT4gMS4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjk3IHNxdWFyZXJvb3QgMC4xMyAtPiAwLjM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjk4IHNxdWFyZXJvb3QgMC4wMTMgLT4gMC4xMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI5OSBzcXVhcmVyb290IDEzLjBFLTEgLT4gMS4xICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzAwIHNxdWFyZXJvb3QgMTMuMDBFLTIgLT4gMC4zNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMwMSBzcXVhcmVyb290IDEzRS0zIC0+IDAuMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMDIgc3F1YXJlcm9vdCAxM0UrMSAtPiAxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMwMyBzcXVhcmVyb290IDEzRSsyIC0+IDM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzA0IHNxdWFyZXJvb3QgMTNFKzMgLT4gMS4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzA1IHNxdWFyZXJvb3QgMC4xNCAtPiAwLjM3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzA2IHNxdWFyZXJvb3QgMC4wMTQgLT4gMC4xMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMwNyBzcXVhcmVyb290IDE0LjBFLTEgLT4gMS4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzA4IHNxdWFyZXJvb3QgMTQuMDBFLTIgLT4gMC4zNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMwOSBzcXVhcmVyb290IDE0RS0zIC0+IDAuMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMTAgc3F1YXJlcm9vdCAxNEUrMSAtPiAxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMxMSBzcXVhcmVyb290IDE0RSsyIC0+IDM3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzEyIHNxdWFyZXJvb3QgMTRFKzMgLT4gMS4yRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzEzIHNxdWFyZXJvb3QgMC4xNSAtPiAwLjM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzE0IHNxdWFyZXJvb3QgMC4wMTUgLT4gMC4xMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMxNSBzcXVhcmVyb290IDE1LjBFLTEgLT4gMS4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzE2IHNxdWFyZXJvb3QgMTUuMDBFLTIgLT4gMC4zOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMxNyBzcXVhcmVyb290IDE1RS0zIC0+IDAuMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMTggc3F1YXJlcm9vdCAxNUUrMSAtPiAxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMxOSBzcXVhcmVyb290IDE1RSsyIC0+IDM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzIwIHNxdWFyZXJvb3QgMTVFKzMgLT4gMS4yRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzIxIHNxdWFyZXJvb3QgMC4xNiAtPiAwLjQKK3NxdHgyMzIyIHNxdWFyZXJvb3QgMC4wMTYgLT4gMC4xMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMyMyBzcXVhcmVyb290IDE2LjBFLTEgLT4gMS4zICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzI0IHNxdWFyZXJvb3QgMTYuMDBFLTIgLT4gMC40MAorc3F0eDIzMjUgc3F1YXJlcm9vdCAxNkUtMyAtPiAwLjEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzI2IHNxdWFyZXJvb3QgMTZFKzEgLT4gMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMjcgc3F1YXJlcm9vdCAxNkUrMiAtPiA0RSsxCitzcXR4MjMyOCBzcXVhcmVyb290IDE2RSszIC0+IDEuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMyOSBzcXVhcmVyb290IDAuMTcgLT4gMC40MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMzMCBzcXVhcmVyb290IDAuMDE3IC0+IDAuMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMzEgc3F1YXJlcm9vdCAxNy4wRS0xIC0+IDEuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMzMiBzcXVhcmVyb290IDE3LjAwRS0yIC0+IDAuNDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMzMgc3F1YXJlcm9vdCAxN0UtMyAtPiAwLjEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzM0IHNxdWFyZXJvb3QgMTdFKzEgLT4gMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMzUgc3F1YXJlcm9vdCAxN0UrMiAtPiA0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMzNiBzcXVhcmVyb290IDE3RSszIC0+IDEuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMzNyBzcXVhcmVyb290IDAuMTggLT4gMC40MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMzOCBzcXVhcmVyb290IDAuMDE4IC0+IDAuMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMzkgc3F1YXJlcm9vdCAxOC4wRS0xIC0+IDEuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM0MCBzcXVhcmVyb290IDE4LjAwRS0yIC0+IDAuNDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNDEgc3F1YXJlcm9vdCAxOEUtMyAtPiAwLjEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzQyIHNxdWFyZXJvb3QgMThFKzEgLT4gMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNDMgc3F1YXJlcm9vdCAxOEUrMiAtPiA0MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM0NCBzcXVhcmVyb290IDE4RSszIC0+IDEuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM0NSBzcXVhcmVyb290IDAuMTkgLT4gMC40NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM0NiBzcXVhcmVyb290IDAuMDE5IC0+IDAuMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNDcgc3F1YXJlcm9vdCAxOS4wRS0xIC0+IDEuNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM0OCBzcXVhcmVyb290IDE5LjAwRS0yIC0+IDAuNDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNDkgc3F1YXJlcm9vdCAxOUUtMyAtPiAwLjE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzUwIHNxdWFyZXJvb3QgMTlFKzEgLT4gMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNTEgc3F1YXJlcm9vdCAxOUUrMiAtPiA0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM1MiBzcXVhcmVyb290IDE5RSszIC0+IDEuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM1MyBzcXVhcmVyb290IDAuMjAgLT4gMC40NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM1NCBzcXVhcmVyb290IDAuMDIwIC0+IDAuMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNTUgc3F1YXJlcm9vdCAyMC4wRS0xIC0+IDEuNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM1NiBzcXVhcmVyb290IDIwLjAwRS0yIC0+IDAuNDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNTcgc3F1YXJlcm9vdCAyMEUtMyAtPiAwLjE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzU4IHNxdWFyZXJvb3QgMjBFKzEgLT4gMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNTkgc3F1YXJlcm9vdCAyMEUrMiAtPiA0NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM2MCBzcXVhcmVyb290IDIwRSszIC0+IDEuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM2MSBzcXVhcmVyb290IDAuMjEgLT4gMC40NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM2MiBzcXVhcmVyb290IDAuMDIxIC0+IDAuMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNjMgc3F1YXJlcm9vdCAyMS4wRS0xIC0+IDEuNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM2NCBzcXVhcmVyb290IDIxLjAwRS0yIC0+IDAuNDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNjUgc3F1YXJlcm9vdCAyMUUtMyAtPiAwLjE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzY2IHNxdWFyZXJvb3QgMjFFKzEgLT4gMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNjcgc3F1YXJlcm9vdCAyMUUrMiAtPiA0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM2OCBzcXVhcmVyb290IDIxRSszIC0+IDEuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM2OSBzcXVhcmVyb290IDAuMjIgLT4gMC40NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM3MCBzcXVhcmVyb290IDAuMDIyIC0+IDAuMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNzEgc3F1YXJlcm9vdCAyMi4wRS0xIC0+IDEuNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM3MiBzcXVhcmVyb290IDIyLjAwRS0yIC0+IDAuNDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNzMgc3F1YXJlcm9vdCAyMkUtMyAtPiAwLjE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzc0IHNxdWFyZXJvb3QgMjJFKzEgLT4gMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNzUgc3F1YXJlcm9vdCAyMkUrMiAtPiA0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM3NiBzcXVhcmVyb290IDIyRSszIC0+IDEuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM3NyBzcXVhcmVyb290IDAuMjMgLT4gMC40OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM3OCBzcXVhcmVyb290IDAuMDIzIC0+IDAuMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNzkgc3F1YXJlcm9vdCAyMy4wRS0xIC0+IDEuNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM4MCBzcXVhcmVyb290IDIzLjAwRS0yIC0+IDAuNDggIEluZXhhY3QgUm91bmRlZAorc3F0eDIzODEgc3F1YXJlcm9vdCAyM0UtMyAtPiAwLjE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzgyIHNxdWFyZXJvb3QgMjNFKzEgLT4gMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzODMgc3F1YXJlcm9vdCAyM0UrMiAtPiA0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM4NCBzcXVhcmVyb290IDIzRSszIC0+IDEuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM4NSBzcXVhcmVyb290IDAuMjQgLT4gMC40OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM4NiBzcXVhcmVyb290IDAuMDI0IC0+IDAuMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzODcgc3F1YXJlcm9vdCAyNC4wRS0xIC0+IDEuNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM4OCBzcXVhcmVyb290IDI0LjAwRS0yIC0+IDAuNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzODkgc3F1YXJlcm9vdCAyNEUtMyAtPiAwLjE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzkwIHNxdWFyZXJvb3QgMjRFKzEgLT4gMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzOTEgc3F1YXJlcm9vdCAyNEUrMiAtPiA0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM5MiBzcXVhcmVyb290IDI0RSszIC0+IDEuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM5MyBzcXVhcmVyb290IDAuMjUgLT4gMC41CitzcXR4MjM5NCBzcXVhcmVyb290IDAuMDI1IC0+IDAuMTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzOTUgc3F1YXJlcm9vdCAyNS4wRS0xIC0+IDEuNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM5NiBzcXVhcmVyb290IDI1LjAwRS0yIC0+IDAuNTAKK3NxdHgyMzk3IHNxdWFyZXJvb3QgMjVFLTMgLT4gMC4xNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM5OCBzcXVhcmVyb290IDI1RSsxIC0+IDE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzk5IHNxdWFyZXJvb3QgMjVFKzIgLT4gNUUrMQorc3F0eDI0MDAgc3F1YXJlcm9vdCAyNUUrMyAtPiAxLjZFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MDEgc3F1YXJlcm9vdCAwLjI2IC0+IDAuNTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MDIgc3F1YXJlcm9vdCAwLjAyNiAtPiAwLjE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDAzIHNxdWFyZXJvb3QgMjYuMEUtMSAtPiAxLjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MDQgc3F1YXJlcm9vdCAyNi4wMEUtMiAtPiAwLjUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDA1IHNxdWFyZXJvb3QgMjZFLTMgLT4gMC4xNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQwNiBzcXVhcmVyb290IDI2RSsxIC0+IDE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDA3IHNxdWFyZXJvb3QgMjZFKzIgLT4gNTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MDggc3F1YXJlcm9vdCAyNkUrMyAtPiAxLjZFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MDkgc3F1YXJlcm9vdCAwLjI3IC0+IDAuNTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MTAgc3F1YXJlcm9vdCAwLjAyNyAtPiAwLjE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDExIHNxdWFyZXJvb3QgMjcuMEUtMSAtPiAxLjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MTIgc3F1YXJlcm9vdCAyNy4wMEUtMiAtPiAwLjUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDEzIHNxdWFyZXJvb3QgMjdFLTMgLT4gMC4xNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQxNCBzcXVhcmVyb290IDI3RSsxIC0+IDE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDE1IHNxdWFyZXJvb3QgMjdFKzIgLT4gNTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MTYgc3F1YXJlcm9vdCAyN0UrMyAtPiAxLjZFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MTcgc3F1YXJlcm9vdCAwLjI4IC0+IDAuNTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MTggc3F1YXJlcm9vdCAwLjAyOCAtPiAwLjE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDE5IHNxdWFyZXJvb3QgMjguMEUtMSAtPiAxLjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MjAgc3F1YXJlcm9vdCAyOC4wMEUtMiAtPiAwLjUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDIxIHNxdWFyZXJvb3QgMjhFLTMgLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQyMiBzcXVhcmVyb290IDI4RSsxIC0+IDE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDIzIHNxdWFyZXJvb3QgMjhFKzIgLT4gNTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MjQgc3F1YXJlcm9vdCAyOEUrMyAtPiAxLjdFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MjUgc3F1YXJlcm9vdCAwLjI5IC0+IDAuNTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MjYgc3F1YXJlcm9vdCAwLjAyOSAtPiAwLjE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDI3IHNxdWFyZXJvb3QgMjkuMEUtMSAtPiAxLjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0Mjggc3F1YXJlcm9vdCAyOS4wMEUtMiAtPiAwLjU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDI5IHNxdWFyZXJvb3QgMjlFLTMgLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQzMCBzcXVhcmVyb290IDI5RSsxIC0+IDE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDMxIHNxdWFyZXJvb3QgMjlFKzIgLT4gNTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MzIgc3F1YXJlcm9vdCAyOUUrMyAtPiAxLjdFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MzMgc3F1YXJlcm9vdCAwLjMwIC0+IDAuNTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MzQgc3F1YXJlcm9vdCAwLjAzMCAtPiAwLjE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDM1IHNxdWFyZXJvb3QgMzAuMEUtMSAtPiAxLjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MzYgc3F1YXJlcm9vdCAzMC4wMEUtMiAtPiAwLjU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDM3IHNxdWFyZXJvb3QgMzBFLTMgLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQzOCBzcXVhcmVyb290IDMwRSsxIC0+IDE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDM5IHNxdWFyZXJvb3QgMzBFKzIgLT4gNTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NDAgc3F1YXJlcm9vdCAzMEUrMyAtPiAxLjdFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NDEgc3F1YXJlcm9vdCAwLjMxIC0+IDAuNTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NDIgc3F1YXJlcm9vdCAwLjAzMSAtPiAwLjE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDQzIHNxdWFyZXJvb3QgMzEuMEUtMSAtPiAxLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NDQgc3F1YXJlcm9vdCAzMS4wMEUtMiAtPiAwLjU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDQ1IHNxdWFyZXJvb3QgMzFFLTMgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ0NiBzcXVhcmVyb290IDMxRSsxIC0+IDE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDQ3IHNxdWFyZXJvb3QgMzFFKzIgLT4gNTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NDggc3F1YXJlcm9vdCAzMUUrMyAtPiAxLjhFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NDkgc3F1YXJlcm9vdCAwLjMyIC0+IDAuNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NTAgc3F1YXJlcm9vdCAwLjAzMiAtPiAwLjE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDUxIHNxdWFyZXJvb3QgMzIuMEUtMSAtPiAxLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NTIgc3F1YXJlcm9vdCAzMi4wMEUtMiAtPiAwLjU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDUzIHNxdWFyZXJvb3QgMzJFLTMgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ1NCBzcXVhcmVyb290IDMyRSsxIC0+IDE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDU1IHNxdWFyZXJvb3QgMzJFKzIgLT4gNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NTYgc3F1YXJlcm9vdCAzMkUrMyAtPiAxLjhFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NTcgc3F1YXJlcm9vdCAwLjMzIC0+IDAuNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NTggc3F1YXJlcm9vdCAwLjAzMyAtPiAwLjE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDU5IHNxdWFyZXJvb3QgMzMuMEUtMSAtPiAxLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NjAgc3F1YXJlcm9vdCAzMy4wMEUtMiAtPiAwLjU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDYxIHNxdWFyZXJvb3QgMzNFLTMgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ2MiBzcXVhcmVyb290IDMzRSsxIC0+IDE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDYzIHNxdWFyZXJvb3QgMzNFKzIgLT4gNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NjQgc3F1YXJlcm9vdCAzM0UrMyAtPiAxLjhFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NjUgc3F1YXJlcm9vdCAwLjM0IC0+IDAuNTggIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NjYgc3F1YXJlcm9vdCAwLjAzNCAtPiAwLjE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDY3IHNxdWFyZXJvb3QgMzQuMEUtMSAtPiAxLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI0Njggc3F1YXJlcm9vdCAzNC4wMEUtMiAtPiAwLjU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDY5IHNxdWFyZXJvb3QgMzRFLTMgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ3MCBzcXVhcmVyb290IDM0RSsxIC0+IDE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDcxIHNxdWFyZXJvb3QgMzRFKzIgLT4gNTggIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NzIgc3F1YXJlcm9vdCAzNEUrMyAtPiAxLjhFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NzMgc3F1YXJlcm9vdCAwLjM1IC0+IDAuNTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NzQgc3F1YXJlcm9vdCAwLjAzNSAtPiAwLjE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDc1IHNxdWFyZXJvb3QgMzUuMEUtMSAtPiAxLjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NzYgc3F1YXJlcm9vdCAzNS4wMEUtMiAtPiAwLjU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDc3IHNxdWFyZXJvb3QgMzVFLTMgLT4gMC4xOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ3OCBzcXVhcmVyb290IDM1RSsxIC0+IDE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDc5IHNxdWFyZXJvb3QgMzVFKzIgLT4gNTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0ODAgc3F1YXJlcm9vdCAzNUUrMyAtPiAxLjlFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0ODEgc3F1YXJlcm9vdCAwLjM2IC0+IDAuNgorc3F0eDI0ODIgc3F1YXJlcm9vdCAwLjAzNiAtPiAwLjE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDgzIHNxdWFyZXJvb3QgMzYuMEUtMSAtPiAxLjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0ODQgc3F1YXJlcm9vdCAzNi4wMEUtMiAtPiAwLjYwCitzcXR4MjQ4NSBzcXVhcmVyb290IDM2RS0zIC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0ODYgc3F1YXJlcm9vdCAzNkUrMSAtPiAxOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ4NyBzcXVhcmVyb290IDM2RSsyIC0+IDZFKzEKK3NxdHgyNDg4IHNxdWFyZXJvb3QgMzZFKzMgLT4gMS45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDg5IHNxdWFyZXJvb3QgMC4zNyAtPiAwLjYxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDkwIHNxdWFyZXJvb3QgMC4wMzcgLT4gMC4xOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ5MSBzcXVhcmVyb290IDM3LjBFLTEgLT4gMS45ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDkyIHNxdWFyZXJvb3QgMzcuMDBFLTIgLT4gMC42MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ5MyBzcXVhcmVyb290IDM3RS0zIC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0OTQgc3F1YXJlcm9vdCAzN0UrMSAtPiAxOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ5NSBzcXVhcmVyb290IDM3RSsyIC0+IDYxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDk2IHNxdWFyZXJvb3QgMzdFKzMgLT4gMS45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDk3IHNxdWFyZXJvb3QgMC4zOCAtPiAwLjYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDk4IHNxdWFyZXJvb3QgMC4wMzggLT4gMC4xOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ5OSBzcXVhcmVyb290IDM4LjBFLTEgLT4gMS45ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTAwIHNxdWFyZXJvb3QgMzguMDBFLTIgLT4gMC42MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUwMSBzcXVhcmVyb290IDM4RS0zIC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MDIgc3F1YXJlcm9vdCAzOEUrMSAtPiAxOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUwMyBzcXVhcmVyb290IDM4RSsyIC0+IDYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTA0IHNxdWFyZXJvb3QgMzhFKzMgLT4gMS45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTA1IHNxdWFyZXJvb3QgMC4zOSAtPiAwLjYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTA2IHNxdWFyZXJvb3QgMC4wMzkgLT4gMC4yMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUwNyBzcXVhcmVyb290IDM5LjBFLTEgLT4gMi4wICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTA4IHNxdWFyZXJvb3QgMzkuMDBFLTIgLT4gMC42MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUwOSBzcXVhcmVyb290IDM5RS0zIC0+IDAuMjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MTAgc3F1YXJlcm9vdCAzOUUrMSAtPiAyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUxMSBzcXVhcmVyb290IDM5RSsyIC0+IDYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTEyIHNxdWFyZXJvb3QgMzlFKzMgLT4gMi4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTEzIHNxdWFyZXJvb3QgMC40MCAtPiAwLjYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTE0IHNxdWFyZXJvb3QgMC4wNDAgLT4gMC4yMAorc3F0eDI1MTUgc3F1YXJlcm9vdCA0MC4wRS0xIC0+IDIuMAorc3F0eDI1MTYgc3F1YXJlcm9vdCA0MC4wMEUtMiAtPiAwLjYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTE3IHNxdWFyZXJvb3QgNDBFLTMgLT4gMC4yMAorc3F0eDI1MTggc3F1YXJlcm9vdCA0MEUrMSAtPiAyMAorc3F0eDI1MTkgc3F1YXJlcm9vdCA0MEUrMiAtPiA2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUyMCBzcXVhcmVyb290IDQwRSszIC0+IDIuMEUrMgorc3F0eDI1MjEgc3F1YXJlcm9vdCAwLjQxIC0+IDAuNjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MjIgc3F1YXJlcm9vdCAwLjA0MSAtPiAwLjIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTIzIHNxdWFyZXJvb3QgNDEuMEUtMSAtPiAyLjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MjQgc3F1YXJlcm9vdCA0MS4wMEUtMiAtPiAwLjY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTI1IHNxdWFyZXJvb3QgNDFFLTMgLT4gMC4yMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUyNiBzcXVhcmVyb290IDQxRSsxIC0+IDIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTI3IHNxdWFyZXJvb3QgNDFFKzIgLT4gNjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1Mjggc3F1YXJlcm9vdCA0MUUrMyAtPiAyLjBFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1Mjkgc3F1YXJlcm9vdCAwLjQyIC0+IDAuNjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MzAgc3F1YXJlcm9vdCAwLjA0MiAtPiAwLjIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTMxIHNxdWFyZXJvb3QgNDIuMEUtMSAtPiAyLjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MzIgc3F1YXJlcm9vdCA0Mi4wMEUtMiAtPiAwLjY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTMzIHNxdWFyZXJvb3QgNDJFLTMgLT4gMC4yMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUzNCBzcXVhcmVyb290IDQyRSsxIC0+IDIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTM1IHNxdWFyZXJvb3QgNDJFKzIgLT4gNjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MzYgc3F1YXJlcm9vdCA0MkUrMyAtPiAyLjBFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1Mzcgc3F1YXJlcm9vdCAwLjQzIC0+IDAuNjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1Mzggc3F1YXJlcm9vdCAwLjA0MyAtPiAwLjIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTM5IHNxdWFyZXJvb3QgNDMuMEUtMSAtPiAyLjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NDAgc3F1YXJlcm9vdCA0My4wMEUtMiAtPiAwLjY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTQxIHNxdWFyZXJvb3QgNDNFLTMgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU0MiBzcXVhcmVyb290IDQzRSsxIC0+IDIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTQzIHNxdWFyZXJvb3QgNDNFKzIgLT4gNjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NDQgc3F1YXJlcm9vdCA0M0UrMyAtPiAyLjFFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NDUgc3F1YXJlcm9vdCAwLjQ0IC0+IDAuNjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NDYgc3F1YXJlcm9vdCAwLjA0NCAtPiAwLjIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTQ3IHNxdWFyZXJvb3QgNDQuMEUtMSAtPiAyLjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NDggc3F1YXJlcm9vdCA0NC4wMEUtMiAtPiAwLjY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTQ5IHNxdWFyZXJvb3QgNDRFLTMgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU1MCBzcXVhcmVyb290IDQ0RSsxIC0+IDIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTUxIHNxdWFyZXJvb3QgNDRFKzIgLT4gNjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NTIgc3F1YXJlcm9vdCA0NEUrMyAtPiAyLjFFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NTMgc3F1YXJlcm9vdCAwLjQ1IC0+IDAuNjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NTQgc3F1YXJlcm9vdCAwLjA0NSAtPiAwLjIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTU1IHNxdWFyZXJvb3QgNDUuMEUtMSAtPiAyLjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NTYgc3F1YXJlcm9vdCA0NS4wMEUtMiAtPiAwLjY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTU3IHNxdWFyZXJvb3QgNDVFLTMgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU1OCBzcXVhcmVyb290IDQ1RSsxIC0+IDIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTU5IHNxdWFyZXJvb3QgNDVFKzIgLT4gNjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NjAgc3F1YXJlcm9vdCA0NUUrMyAtPiAyLjFFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NjEgc3F1YXJlcm9vdCAwLjQ2IC0+IDAuNjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NjIgc3F1YXJlcm9vdCAwLjA0NiAtPiAwLjIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTYzIHNxdWFyZXJvb3QgNDYuMEUtMSAtPiAyLjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NjQgc3F1YXJlcm9vdCA0Ni4wMEUtMiAtPiAwLjY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTY1IHNxdWFyZXJvb3QgNDZFLTMgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU2NiBzcXVhcmVyb290IDQ2RSsxIC0+IDIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTY3IHNxdWFyZXJvb3QgNDZFKzIgLT4gNjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI1Njggc3F1YXJlcm9vdCA0NkUrMyAtPiAyLjFFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1Njkgc3F1YXJlcm9vdCAwLjQ3IC0+IDAuNjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NzAgc3F1YXJlcm9vdCAwLjA0NyAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTcxIHNxdWFyZXJvb3QgNDcuMEUtMSAtPiAyLjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NzIgc3F1YXJlcm9vdCA0Ny4wMEUtMiAtPiAwLjY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTczIHNxdWFyZXJvb3QgNDdFLTMgLT4gMC4yMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU3NCBzcXVhcmVyb290IDQ3RSsxIC0+IDIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTc1IHNxdWFyZXJvb3QgNDdFKzIgLT4gNjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NzYgc3F1YXJlcm9vdCA0N0UrMyAtPiAyLjJFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1Nzcgc3F1YXJlcm9vdCAwLjQ4IC0+IDAuNjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1Nzggc3F1YXJlcm9vdCAwLjA0OCAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTc5IHNxdWFyZXJvb3QgNDguMEUtMSAtPiAyLjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1ODAgc3F1YXJlcm9vdCA0OC4wMEUtMiAtPiAwLjY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTgxIHNxdWFyZXJvb3QgNDhFLTMgLT4gMC4yMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU4MiBzcXVhcmVyb290IDQ4RSsxIC0+IDIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTgzIHNxdWFyZXJvb3QgNDhFKzIgLT4gNjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1ODQgc3F1YXJlcm9vdCA0OEUrMyAtPiAyLjJFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1ODUgc3F1YXJlcm9vdCAwLjQ5IC0+IDAuNworc3F0eDI1ODYgc3F1YXJlcm9vdCAwLjA0OSAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTg3IHNxdWFyZXJvb3QgNDkuMEUtMSAtPiAyLjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1ODggc3F1YXJlcm9vdCA0OS4wMEUtMiAtPiAwLjcwCitzcXR4MjU4OSBzcXVhcmVyb290IDQ5RS0zIC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1OTAgc3F1YXJlcm9vdCA0OUUrMSAtPiAyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU5MSBzcXVhcmVyb290IDQ5RSsyIC0+IDdFKzEKK3NxdHgyNTkyIHNxdWFyZXJvb3QgNDlFKzMgLT4gMi4yRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTkzIHNxdWFyZXJvb3QgMC41MCAtPiAwLjcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTk0IHNxdWFyZXJvb3QgMC4wNTAgLT4gMC4yMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU5NSBzcXVhcmVyb290IDUwLjBFLTEgLT4gMi4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTk2IHNxdWFyZXJvb3QgNTAuMDBFLTIgLT4gMC43MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU5NyBzcXVhcmVyb290IDUwRS0zIC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1OTggc3F1YXJlcm9vdCA1MEUrMSAtPiAyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU5OSBzcXVhcmVyb290IDUwRSsyIC0+IDcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjAwIHNxdWFyZXJvb3QgNTBFKzMgLT4gMi4yRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjAxIHNxdWFyZXJvb3QgMC41MSAtPiAwLjcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjAyIHNxdWFyZXJvb3QgMC4wNTEgLT4gMC4yMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYwMyBzcXVhcmVyb290IDUxLjBFLTEgLT4gMi4zICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjA0IHNxdWFyZXJvb3QgNTEuMDBFLTIgLT4gMC43MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYwNSBzcXVhcmVyb290IDUxRS0zIC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MDYgc3F1YXJlcm9vdCA1MUUrMSAtPiAyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYwNyBzcXVhcmVyb290IDUxRSsyIC0+IDcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjA4IHNxdWFyZXJvb3QgNTFFKzMgLT4gMi4zRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjA5IHNxdWFyZXJvb3QgMC41MiAtPiAwLjcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjEwIHNxdWFyZXJvb3QgMC4wNTIgLT4gMC4yMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYxMSBzcXVhcmVyb290IDUyLjBFLTEgLT4gMi4zICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjEyIHNxdWFyZXJvb3QgNTIuMDBFLTIgLT4gMC43MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYxMyBzcXVhcmVyb290IDUyRS0zIC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MTQgc3F1YXJlcm9vdCA1MkUrMSAtPiAyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYxNSBzcXVhcmVyb290IDUyRSsyIC0+IDcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjE2IHNxdWFyZXJvb3QgNTJFKzMgLT4gMi4zRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjE3IHNxdWFyZXJvb3QgMC41MyAtPiAwLjczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjE4IHNxdWFyZXJvb3QgMC4wNTMgLT4gMC4yMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYxOSBzcXVhcmVyb290IDUzLjBFLTEgLT4gMi4zICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjIwIHNxdWFyZXJvb3QgNTMuMDBFLTIgLT4gMC43MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYyMSBzcXVhcmVyb290IDUzRS0zIC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MjIgc3F1YXJlcm9vdCA1M0UrMSAtPiAyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYyMyBzcXVhcmVyb290IDUzRSsyIC0+IDczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjI0IHNxdWFyZXJvb3QgNTNFKzMgLT4gMi4zRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjI1IHNxdWFyZXJvb3QgMC41NCAtPiAwLjczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjI2IHNxdWFyZXJvb3QgMC4wNTQgLT4gMC4yMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYyNyBzcXVhcmVyb290IDU0LjBFLTEgLT4gMi4zICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjI4IHNxdWFyZXJvb3QgNTQuMDBFLTIgLT4gMC43MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYyOSBzcXVhcmVyb290IDU0RS0zIC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MzAgc3F1YXJlcm9vdCA1NEUrMSAtPiAyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYzMSBzcXVhcmVyb290IDU0RSsyIC0+IDczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjMyIHNxdWFyZXJvb3QgNTRFKzMgLT4gMi4zRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjMzIHNxdWFyZXJvb3QgMC41NSAtPiAwLjc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjM0IHNxdWFyZXJvb3QgMC4wNTUgLT4gMC4yMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYzNSBzcXVhcmVyb290IDU1LjBFLTEgLT4gMi4zICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjM2IHNxdWFyZXJvb3QgNTUuMDBFLTIgLT4gMC43NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYzNyBzcXVhcmVyb290IDU1RS0zIC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2Mzggc3F1YXJlcm9vdCA1NUUrMSAtPiAyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYzOSBzcXVhcmVyb290IDU1RSsyIC0+IDc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjQwIHNxdWFyZXJvb3QgNTVFKzMgLT4gMi4zRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjQxIHNxdWFyZXJvb3QgMC41NiAtPiAwLjc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjQyIHNxdWFyZXJvb3QgMC4wNTYgLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY0MyBzcXVhcmVyb290IDU2LjBFLTEgLT4gMi40ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjQ0IHNxdWFyZXJvb3QgNTYuMDBFLTIgLT4gMC43NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY0NSBzcXVhcmVyb290IDU2RS0zIC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NDYgc3F1YXJlcm9vdCA1NkUrMSAtPiAyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY0NyBzcXVhcmVyb290IDU2RSsyIC0+IDc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjQ4IHNxdWFyZXJvb3QgNTZFKzMgLT4gMi40RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjQ5IHNxdWFyZXJvb3QgMC41NyAtPiAwLjc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjUwIHNxdWFyZXJvb3QgMC4wNTcgLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY1MSBzcXVhcmVyb290IDU3LjBFLTEgLT4gMi40ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjUyIHNxdWFyZXJvb3QgNTcuMDBFLTIgLT4gMC43NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY1MyBzcXVhcmVyb290IDU3RS0zIC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NTQgc3F1YXJlcm9vdCA1N0UrMSAtPiAyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY1NSBzcXVhcmVyb290IDU3RSsyIC0+IDc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjU2IHNxdWFyZXJvb3QgNTdFKzMgLT4gMi40RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjU3IHNxdWFyZXJvb3QgMC41OCAtPiAwLjc2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjU4IHNxdWFyZXJvb3QgMC4wNTggLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY1OSBzcXVhcmVyb290IDU4LjBFLTEgLT4gMi40ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjYwIHNxdWFyZXJvb3QgNTguMDBFLTIgLT4gMC43NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY2MSBzcXVhcmVyb290IDU4RS0zIC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NjIgc3F1YXJlcm9vdCA1OEUrMSAtPiAyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY2MyBzcXVhcmVyb290IDU4RSsyIC0+IDc2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjY0IHNxdWFyZXJvb3QgNThFKzMgLT4gMi40RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjY1IHNxdWFyZXJvb3QgMC41OSAtPiAwLjc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjY2IHNxdWFyZXJvb3QgMC4wNTkgLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY2NyBzcXVhcmVyb290IDU5LjBFLTEgLT4gMi40ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjY4IHNxdWFyZXJvb3QgNTkuMDBFLTIgLT4gMC43NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY2OSBzcXVhcmVyb290IDU5RS0zIC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NzAgc3F1YXJlcm9vdCA1OUUrMSAtPiAyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY3MSBzcXVhcmVyb290IDU5RSsyIC0+IDc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjcyIHNxdWFyZXJvb3QgNTlFKzMgLT4gMi40RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjczIHNxdWFyZXJvb3QgMC42MCAtPiAwLjc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjc0IHNxdWFyZXJvb3QgMC4wNjAgLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY3NSBzcXVhcmVyb290IDYwLjBFLTEgLT4gMi40ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjc2IHNxdWFyZXJvb3QgNjAuMDBFLTIgLT4gMC43NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY3NyBzcXVhcmVyb290IDYwRS0zIC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2Nzggc3F1YXJlcm9vdCA2MEUrMSAtPiAyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY3OSBzcXVhcmVyb290IDYwRSsyIC0+IDc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjgwIHNxdWFyZXJvb3QgNjBFKzMgLT4gMi40RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjgxIHNxdWFyZXJvb3QgMC42MSAtPiAwLjc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjgyIHNxdWFyZXJvb3QgMC4wNjEgLT4gMC4yNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY4MyBzcXVhcmVyb290IDYxLjBFLTEgLT4gMi41ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjg0IHNxdWFyZXJvb3QgNjEuMDBFLTIgLT4gMC43OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY4NSBzcXVhcmVyb290IDYxRS0zIC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2ODYgc3F1YXJlcm9vdCA2MUUrMSAtPiAyNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY4NyBzcXVhcmVyb290IDYxRSsyIC0+IDc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjg4IHNxdWFyZXJvb3QgNjFFKzMgLT4gMi41RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjg5IHNxdWFyZXJvb3QgMC42MiAtPiAwLjc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjkwIHNxdWFyZXJvb3QgMC4wNjIgLT4gMC4yNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY5MSBzcXVhcmVyb290IDYyLjBFLTEgLT4gMi41ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjkyIHNxdWFyZXJvb3QgNjIuMDBFLTIgLT4gMC43OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY5MyBzcXVhcmVyb290IDYyRS0zIC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2OTQgc3F1YXJlcm9vdCA2MkUrMSAtPiAyNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY5NSBzcXVhcmVyb290IDYyRSsyIC0+IDc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjk2IHNxdWFyZXJvb3QgNjJFKzMgLT4gMi41RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjk3IHNxdWFyZXJvb3QgMC42MyAtPiAwLjc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjk4IHNxdWFyZXJvb3QgMC4wNjMgLT4gMC4yNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY5OSBzcXVhcmVyb290IDYzLjBFLTEgLT4gMi41ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzAwIHNxdWFyZXJvb3QgNjMuMDBFLTIgLT4gMC43OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcwMSBzcXVhcmVyb290IDYzRS0zIC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MDIgc3F1YXJlcm9vdCA2M0UrMSAtPiAyNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcwMyBzcXVhcmVyb290IDYzRSsyIC0+IDc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzA0IHNxdWFyZXJvb3QgNjNFKzMgLT4gMi41RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzA1IHNxdWFyZXJvb3QgMC42NCAtPiAwLjgKK3NxdHgyNzA2IHNxdWFyZXJvb3QgMC4wNjQgLT4gMC4yNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcwNyBzcXVhcmVyb290IDY0LjBFLTEgLT4gMi41ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzA4IHNxdWFyZXJvb3QgNjQuMDBFLTIgLT4gMC44MAorc3F0eDI3MDkgc3F1YXJlcm9vdCA2NEUtMyAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzEwIHNxdWFyZXJvb3QgNjRFKzEgLT4gMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MTEgc3F1YXJlcm9vdCA2NEUrMiAtPiA4RSsxCitzcXR4MjcxMiBzcXVhcmVyb290IDY0RSszIC0+IDIuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcxMyBzcXVhcmVyb290IDAuNjUgLT4gMC44MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcxNCBzcXVhcmVyb290IDAuMDY1IC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MTUgc3F1YXJlcm9vdCA2NS4wRS0xIC0+IDIuNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcxNiBzcXVhcmVyb290IDY1LjAwRS0yIC0+IDAuODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MTcgc3F1YXJlcm9vdCA2NUUtMyAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzE4IHNxdWFyZXJvb3QgNjVFKzEgLT4gMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MTkgc3F1YXJlcm9vdCA2NUUrMiAtPiA4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcyMCBzcXVhcmVyb290IDY1RSszIC0+IDIuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcyMSBzcXVhcmVyb290IDAuNjYgLT4gMC44MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcyMiBzcXVhcmVyb290IDAuMDY2IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MjMgc3F1YXJlcm9vdCA2Ni4wRS0xIC0+IDIuNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcyNCBzcXVhcmVyb290IDY2LjAwRS0yIC0+IDAuODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MjUgc3F1YXJlcm9vdCA2NkUtMyAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzI2IHNxdWFyZXJvb3QgNjZFKzEgLT4gMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3Mjcgc3F1YXJlcm9vdCA2NkUrMiAtPiA4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcyOCBzcXVhcmVyb290IDY2RSszIC0+IDIuNkUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcyOSBzcXVhcmVyb290IDAuNjcgLT4gMC44MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjczMCBzcXVhcmVyb290IDAuMDY3IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MzEgc3F1YXJlcm9vdCA2Ny4wRS0xIC0+IDIuNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjczMiBzcXVhcmVyb290IDY3LjAwRS0yIC0+IDAuODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MzMgc3F1YXJlcm9vdCA2N0UtMyAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzM0IHNxdWFyZXJvb3QgNjdFKzEgLT4gMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MzUgc3F1YXJlcm9vdCA2N0UrMiAtPiA4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjczNiBzcXVhcmVyb290IDY3RSszIC0+IDIuNkUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjczNyBzcXVhcmVyb290IDAuNjggLT4gMC44MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjczOCBzcXVhcmVyb290IDAuMDY4IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3Mzkgc3F1YXJlcm9vdCA2OC4wRS0xIC0+IDIuNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc0MCBzcXVhcmVyb290IDY4LjAwRS0yIC0+IDAuODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NDEgc3F1YXJlcm9vdCA2OEUtMyAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzQyIHNxdWFyZXJvb3QgNjhFKzEgLT4gMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NDMgc3F1YXJlcm9vdCA2OEUrMiAtPiA4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc0NCBzcXVhcmVyb290IDY4RSszIC0+IDIuNkUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc0NSBzcXVhcmVyb290IDAuNjkgLT4gMC44MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc0NiBzcXVhcmVyb290IDAuMDY5IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NDcgc3F1YXJlcm9vdCA2OS4wRS0xIC0+IDIuNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc0OCBzcXVhcmVyb290IDY5LjAwRS0yIC0+IDAuODMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NDkgc3F1YXJlcm9vdCA2OUUtMyAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzUwIHNxdWFyZXJvb3QgNjlFKzEgLT4gMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NTEgc3F1YXJlcm9vdCA2OUUrMiAtPiA4MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc1MiBzcXVhcmVyb290IDY5RSszIC0+IDIuNkUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc1MyBzcXVhcmVyb290IDAuNzAgLT4gMC44NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc1NCBzcXVhcmVyb290IDAuMDcwIC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NTUgc3F1YXJlcm9vdCA3MC4wRS0xIC0+IDIuNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc1NiBzcXVhcmVyb290IDcwLjAwRS0yIC0+IDAuODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NTcgc3F1YXJlcm9vdCA3MEUtMyAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzU4IHNxdWFyZXJvb3QgNzBFKzEgLT4gMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NTkgc3F1YXJlcm9vdCA3MEUrMiAtPiA4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc2MCBzcXVhcmVyb290IDcwRSszIC0+IDIuNkUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc2MSBzcXVhcmVyb290IDAuNzEgLT4gMC44NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc2MiBzcXVhcmVyb290IDAuMDcxIC0+IDAuMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NjMgc3F1YXJlcm9vdCA3MS4wRS0xIC0+IDIuNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc2NCBzcXVhcmVyb290IDcxLjAwRS0yIC0+IDAuODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NjUgc3F1YXJlcm9vdCA3MUUtMyAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzY2IHNxdWFyZXJvb3QgNzFFKzEgLT4gMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3Njcgc3F1YXJlcm9vdCA3MUUrMiAtPiA4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc2OCBzcXVhcmVyb290IDcxRSszIC0+IDIuN0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc2OSBzcXVhcmVyb290IDAuNzIgLT4gMC44NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc3MCBzcXVhcmVyb290IDAuMDcyIC0+IDAuMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NzEgc3F1YXJlcm9vdCA3Mi4wRS0xIC0+IDIuNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc3MiBzcXVhcmVyb290IDcyLjAwRS0yIC0+IDAuODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NzMgc3F1YXJlcm9vdCA3MkUtMyAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzc0IHNxdWFyZXJvb3QgNzJFKzEgLT4gMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NzUgc3F1YXJlcm9vdCA3MkUrMiAtPiA4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc3NiBzcXVhcmVyb290IDcyRSszIC0+IDIuN0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc3NyBzcXVhcmVyb290IDAuNzMgLT4gMC44NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc3OCBzcXVhcmVyb290IDAuMDczIC0+IDAuMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3Nzkgc3F1YXJlcm9vdCA3My4wRS0xIC0+IDIuNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc4MCBzcXVhcmVyb290IDczLjAwRS0yIC0+IDAuODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3ODEgc3F1YXJlcm9vdCA3M0UtMyAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzgyIHNxdWFyZXJvb3QgNzNFKzEgLT4gMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3ODMgc3F1YXJlcm9vdCA3M0UrMiAtPiA4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc4NCBzcXVhcmVyb290IDczRSszIC0+IDIuN0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc4NSBzcXVhcmVyb290IDAuNzQgLT4gMC44NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc4NiBzcXVhcmVyb290IDAuMDc0IC0+IDAuMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3ODcgc3F1YXJlcm9vdCA3NC4wRS0xIC0+IDIuNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc4OCBzcXVhcmVyb290IDc0LjAwRS0yIC0+IDAuODYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3ODkgc3F1YXJlcm9vdCA3NEUtMyAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzkwIHNxdWFyZXJvb3QgNzRFKzEgLT4gMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3OTEgc3F1YXJlcm9vdCA3NEUrMiAtPiA4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc5MiBzcXVhcmVyb290IDc0RSszIC0+IDIuN0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc5MyBzcXVhcmVyb290IDAuNzUgLT4gMC44NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc5NCBzcXVhcmVyb290IDAuMDc1IC0+IDAuMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3OTUgc3F1YXJlcm9vdCA3NS4wRS0xIC0+IDIuNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc5NiBzcXVhcmVyb290IDc1LjAwRS0yIC0+IDAuODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3OTcgc3F1YXJlcm9vdCA3NUUtMyAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzk4IHNxdWFyZXJvb3QgNzVFKzEgLT4gMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3OTkgc3F1YXJlcm9vdCA3NUUrMiAtPiA4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgwMCBzcXVhcmVyb290IDc1RSszIC0+IDIuN0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgwMSBzcXVhcmVyb290IDAuNzYgLT4gMC44NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgwMiBzcXVhcmVyb290IDAuMDc2IC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MDMgc3F1YXJlcm9vdCA3Ni4wRS0xIC0+IDIuOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgwNCBzcXVhcmVyb290IDc2LjAwRS0yIC0+IDAuODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MDUgc3F1YXJlcm9vdCA3NkUtMyAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODA2IHNxdWFyZXJvb3QgNzZFKzEgLT4gMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MDcgc3F1YXJlcm9vdCA3NkUrMiAtPiA4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgwOCBzcXVhcmVyb290IDc2RSszIC0+IDIuOEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgwOSBzcXVhcmVyb290IDAuNzcgLT4gMC44OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgxMCBzcXVhcmVyb290IDAuMDc3IC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MTEgc3F1YXJlcm9vdCA3Ny4wRS0xIC0+IDIuOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgxMiBzcXVhcmVyb290IDc3LjAwRS0yIC0+IDAuODggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MTMgc3F1YXJlcm9vdCA3N0UtMyAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODE0IHNxdWFyZXJvb3QgNzdFKzEgLT4gMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MTUgc3F1YXJlcm9vdCA3N0UrMiAtPiA4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgxNiBzcXVhcmVyb290IDc3RSszIC0+IDIuOEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgxNyBzcXVhcmVyb290IDAuNzggLT4gMC44OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgxOCBzcXVhcmVyb290IDAuMDc4IC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MTkgc3F1YXJlcm9vdCA3OC4wRS0xIC0+IDIuOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgyMCBzcXVhcmVyb290IDc4LjAwRS0yIC0+IDAuODggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MjEgc3F1YXJlcm9vdCA3OEUtMyAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODIyIHNxdWFyZXJvb3QgNzhFKzEgLT4gMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MjMgc3F1YXJlcm9vdCA3OEUrMiAtPiA4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgyNCBzcXVhcmVyb290IDc4RSszIC0+IDIuOEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgyNSBzcXVhcmVyb290IDAuNzkgLT4gMC44OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgyNiBzcXVhcmVyb290IDAuMDc5IC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4Mjcgc3F1YXJlcm9vdCA3OS4wRS0xIC0+IDIuOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgyOCBzcXVhcmVyb290IDc5LjAwRS0yIC0+IDAuODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4Mjkgc3F1YXJlcm9vdCA3OUUtMyAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODMwIHNxdWFyZXJvb3QgNzlFKzEgLT4gMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MzEgc3F1YXJlcm9vdCA3OUUrMiAtPiA4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgzMiBzcXVhcmVyb290IDc5RSszIC0+IDIuOEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgzMyBzcXVhcmVyb290IDAuODAgLT4gMC44OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgzNCBzcXVhcmVyb290IDAuMDgwIC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MzUgc3F1YXJlcm9vdCA4MC4wRS0xIC0+IDIuOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgzNiBzcXVhcmVyb290IDgwLjAwRS0yIC0+IDAuODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4Mzcgc3F1YXJlcm9vdCA4MEUtMyAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODM4IHNxdWFyZXJvb3QgODBFKzEgLT4gMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4Mzkgc3F1YXJlcm9vdCA4MEUrMiAtPiA4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg0MCBzcXVhcmVyb290IDgwRSszIC0+IDIuOEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg0MSBzcXVhcmVyb290IDAuODEgLT4gMC45CitzcXR4Mjg0MiBzcXVhcmVyb290IDAuMDgxIC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NDMgc3F1YXJlcm9vdCA4MS4wRS0xIC0+IDIuOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg0NCBzcXVhcmVyb290IDgxLjAwRS0yIC0+IDAuOTAKK3NxdHgyODQ1IHNxdWFyZXJvb3QgODFFLTMgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg0NiBzcXVhcmVyb290IDgxRSsxIC0+IDI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODQ3IHNxdWFyZXJvb3QgODFFKzIgLT4gOUUrMQorc3F0eDI4NDggc3F1YXJlcm9vdCA4MUUrMyAtPiAyLjhFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NDkgc3F1YXJlcm9vdCAwLjgyIC0+IDAuOTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NTAgc3F1YXJlcm9vdCAwLjA4MiAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODUxIHNxdWFyZXJvb3QgODIuMEUtMSAtPiAyLjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NTIgc3F1YXJlcm9vdCA4Mi4wMEUtMiAtPiAwLjkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODUzIHNxdWFyZXJvb3QgODJFLTMgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg1NCBzcXVhcmVyb290IDgyRSsxIC0+IDI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODU1IHNxdWFyZXJvb3QgODJFKzIgLT4gOTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NTYgc3F1YXJlcm9vdCA4MkUrMyAtPiAyLjlFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NTcgc3F1YXJlcm9vdCAwLjgzIC0+IDAuOTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NTggc3F1YXJlcm9vdCAwLjA4MyAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODU5IHNxdWFyZXJvb3QgODMuMEUtMSAtPiAyLjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NjAgc3F1YXJlcm9vdCA4My4wMEUtMiAtPiAwLjkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODYxIHNxdWFyZXJvb3QgODNFLTMgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg2MiBzcXVhcmVyb290IDgzRSsxIC0+IDI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODYzIHNxdWFyZXJvb3QgODNFKzIgLT4gOTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NjQgc3F1YXJlcm9vdCA4M0UrMyAtPiAyLjlFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NjUgc3F1YXJlcm9vdCAwLjg0IC0+IDAuOTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NjYgc3F1YXJlcm9vdCAwLjA4NCAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODY3IHNxdWFyZXJvb3QgODQuMEUtMSAtPiAyLjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4Njggc3F1YXJlcm9vdCA4NC4wMEUtMiAtPiAwLjkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODY5IHNxdWFyZXJvb3QgODRFLTMgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg3MCBzcXVhcmVyb290IDg0RSsxIC0+IDI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODcxIHNxdWFyZXJvb3QgODRFKzIgLT4gOTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NzIgc3F1YXJlcm9vdCA4NEUrMyAtPiAyLjlFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NzMgc3F1YXJlcm9vdCAwLjg1IC0+IDAuOTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NzQgc3F1YXJlcm9vdCAwLjA4NSAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODc1IHNxdWFyZXJvb3QgODUuMEUtMSAtPiAyLjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NzYgc3F1YXJlcm9vdCA4NS4wMEUtMiAtPiAwLjkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODc3IHNxdWFyZXJvb3QgODVFLTMgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg3OCBzcXVhcmVyb290IDg1RSsxIC0+IDI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODc5IHNxdWFyZXJvb3QgODVFKzIgLT4gOTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4ODAgc3F1YXJlcm9vdCA4NUUrMyAtPiAyLjlFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4ODEgc3F1YXJlcm9vdCAwLjg2IC0+IDAuOTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4ODIgc3F1YXJlcm9vdCAwLjA4NiAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODgzIHNxdWFyZXJvb3QgODYuMEUtMSAtPiAyLjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4ODQgc3F1YXJlcm9vdCA4Ni4wMEUtMiAtPiAwLjkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODg1IHNxdWFyZXJvb3QgODZFLTMgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg4NiBzcXVhcmVyb290IDg2RSsxIC0+IDI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODg3IHNxdWFyZXJvb3QgODZFKzIgLT4gOTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4ODggc3F1YXJlcm9vdCA4NkUrMyAtPiAyLjlFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4ODkgc3F1YXJlcm9vdCAwLjg3IC0+IDAuOTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4OTAgc3F1YXJlcm9vdCAwLjA4NyAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODkxIHNxdWFyZXJvb3QgODcuMEUtMSAtPiAyLjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4OTIgc3F1YXJlcm9vdCA4Ny4wMEUtMiAtPiAwLjkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODkzIHNxdWFyZXJvb3QgODdFLTMgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg5NCBzcXVhcmVyb290IDg3RSsxIC0+IDI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODk1IHNxdWFyZXJvb3QgODdFKzIgLT4gOTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4OTYgc3F1YXJlcm9vdCA4N0UrMyAtPiAyLjlFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4OTcgc3F1YXJlcm9vdCAwLjg4IC0+IDAuOTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4OTggc3F1YXJlcm9vdCAwLjA4OCAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODk5IHNxdWFyZXJvb3QgODguMEUtMSAtPiAzLjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MDAgc3F1YXJlcm9vdCA4OC4wMEUtMiAtPiAwLjk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTAxIHNxdWFyZXJvb3QgODhFLTMgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkwMiBzcXVhcmVyb290IDg4RSsxIC0+IDMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTAzIHNxdWFyZXJvb3QgODhFKzIgLT4gOTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MDQgc3F1YXJlcm9vdCA4OEUrMyAtPiAzLjBFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MDUgc3F1YXJlcm9vdCAwLjg5IC0+IDAuOTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MDYgc3F1YXJlcm9vdCAwLjA4OSAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTA3IHNxdWFyZXJvb3QgODkuMEUtMSAtPiAzLjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MDggc3F1YXJlcm9vdCA4OS4wMEUtMiAtPiAwLjk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTA5IHNxdWFyZXJvb3QgODlFLTMgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkxMCBzcXVhcmVyb290IDg5RSsxIC0+IDMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTExIHNxdWFyZXJvb3QgODlFKzIgLT4gOTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MTIgc3F1YXJlcm9vdCA4OUUrMyAtPiAzLjBFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MTMgc3F1YXJlcm9vdCAwLjkwIC0+IDAuOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MTQgc3F1YXJlcm9vdCAwLjA5MCAtPiAwLjMwCitzcXR4MjkxNSBzcXVhcmVyb290IDkwLjBFLTEgLT4gMy4wCitzcXR4MjkxNiBzcXVhcmVyb290IDkwLjAwRS0yIC0+IDAuOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MTcgc3F1YXJlcm9vdCA5MEUtMyAtPiAwLjMwCitzcXR4MjkxOCBzcXVhcmVyb290IDkwRSsxIC0+IDMwCitzcXR4MjkxOSBzcXVhcmVyb290IDkwRSsyIC0+IDk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTIwIHNxdWFyZXJvb3QgOTBFKzMgLT4gMy4wRSsyCitzcXR4MjkyMSBzcXVhcmVyb290IDAuOTEgLT4gMC45NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkyMiBzcXVhcmVyb290IDAuMDkxIC0+IDAuMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MjMgc3F1YXJlcm9vdCA5MS4wRS0xIC0+IDMuMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkyNCBzcXVhcmVyb290IDkxLjAwRS0yIC0+IDAuOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MjUgc3F1YXJlcm9vdCA5MUUtMyAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTI2IHNxdWFyZXJvb3QgOTFFKzEgLT4gMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5Mjcgc3F1YXJlcm9vdCA5MUUrMiAtPiA5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkyOCBzcXVhcmVyb290IDkxRSszIC0+IDMuMEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkyOSBzcXVhcmVyb290IDAuOTIgLT4gMC45NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkzMCBzcXVhcmVyb290IDAuMDkyIC0+IDAuMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MzEgc3F1YXJlcm9vdCA5Mi4wRS0xIC0+IDMuMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkzMiBzcXVhcmVyb290IDkyLjAwRS0yIC0+IDAuOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MzMgc3F1YXJlcm9vdCA5MkUtMyAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTM0IHNxdWFyZXJvb3QgOTJFKzEgLT4gMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MzUgc3F1YXJlcm9vdCA5MkUrMiAtPiA5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkzNiBzcXVhcmVyb290IDkyRSszIC0+IDMuMEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkzNyBzcXVhcmVyb290IDAuOTMgLT4gMC45NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkzOCBzcXVhcmVyb290IDAuMDkzIC0+IDAuMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5Mzkgc3F1YXJlcm9vdCA5My4wRS0xIC0+IDMuMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk0MCBzcXVhcmVyb290IDkzLjAwRS0yIC0+IDAuOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NDEgc3F1YXJlcm9vdCA5M0UtMyAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTQyIHNxdWFyZXJvb3QgOTNFKzEgLT4gMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NDMgc3F1YXJlcm9vdCA5M0UrMiAtPiA5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk0NCBzcXVhcmVyb290IDkzRSszIC0+IDMuMEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk0NSBzcXVhcmVyb290IDAuOTQgLT4gMC45NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk0NiBzcXVhcmVyb290IDAuMDk0IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NDcgc3F1YXJlcm9vdCA5NC4wRS0xIC0+IDMuMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk0OCBzcXVhcmVyb290IDk0LjAwRS0yIC0+IDAuOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NDkgc3F1YXJlcm9vdCA5NEUtMyAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTUwIHNxdWFyZXJvb3QgOTRFKzEgLT4gMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NTEgc3F1YXJlcm9vdCA5NEUrMiAtPiA5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk1MiBzcXVhcmVyb290IDk0RSszIC0+IDMuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk1MyBzcXVhcmVyb290IDAuOTUgLT4gMC45NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk1NCBzcXVhcmVyb290IDAuMDk1IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NTUgc3F1YXJlcm9vdCA5NS4wRS0xIC0+IDMuMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk1NiBzcXVhcmVyb290IDk1LjAwRS0yIC0+IDAuOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NTcgc3F1YXJlcm9vdCA5NUUtMyAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTU4IHNxdWFyZXJvb3QgOTVFKzEgLT4gMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NTkgc3F1YXJlcm9vdCA5NUUrMiAtPiA5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk2MCBzcXVhcmVyb290IDk1RSszIC0+IDMuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk2MSBzcXVhcmVyb290IDAuOTYgLT4gMC45OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk2MiBzcXVhcmVyb290IDAuMDk2IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NjMgc3F1YXJlcm9vdCA5Ni4wRS0xIC0+IDMuMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk2NCBzcXVhcmVyb290IDk2LjAwRS0yIC0+IDAuOTggIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NjUgc3F1YXJlcm9vdCA5NkUtMyAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTY2IHNxdWFyZXJvb3QgOTZFKzEgLT4gMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5Njcgc3F1YXJlcm9vdCA5NkUrMiAtPiA5OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk2OCBzcXVhcmVyb290IDk2RSszIC0+IDMuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk2OSBzcXVhcmVyb290IDAuOTcgLT4gMC45OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk3MCBzcXVhcmVyb290IDAuMDk3IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NzEgc3F1YXJlcm9vdCA5Ny4wRS0xIC0+IDMuMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk3MiBzcXVhcmVyb290IDk3LjAwRS0yIC0+IDAuOTggIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NzMgc3F1YXJlcm9vdCA5N0UtMyAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTc0IHNxdWFyZXJvb3QgOTdFKzEgLT4gMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NzUgc3F1YXJlcm9vdCA5N0UrMiAtPiA5OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk3NiBzcXVhcmVyb290IDk3RSszIC0+IDMuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk3NyBzcXVhcmVyb290IDAuOTggLT4gMC45OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk3OCBzcXVhcmVyb290IDAuMDk4IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5Nzkgc3F1YXJlcm9vdCA5OC4wRS0xIC0+IDMuMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk4MCBzcXVhcmVyb290IDk4LjAwRS0yIC0+IDAuOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5ODEgc3F1YXJlcm9vdCA5OEUtMyAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTgyIHNxdWFyZXJvb3QgOThFKzEgLT4gMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5ODMgc3F1YXJlcm9vdCA5OEUrMiAtPiA5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk4NCBzcXVhcmVyb290IDk4RSszIC0+IDMuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk4NSBzcXVhcmVyb290IDAuOTkgLT4gMC45OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk4NiBzcXVhcmVyb290IDAuMDk5IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5ODcgc3F1YXJlcm9vdCA5OS4wRS0xIC0+IDMuMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk4OCBzcXVhcmVyb290IDk5LjAwRS0yIC0+IDAuOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5ODkgc3F1YXJlcm9vdCA5OUUtMyAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTkwIHNxdWFyZXJvb3QgOTlFKzEgLT4gMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5OTEgc3F1YXJlcm9vdCA5OUUrMiAtPiA5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk5MiBzcXVhcmVyb290IDk5RSszIC0+IDMuMUUrMiAgSW5leGFjdCBSb3VuZGVkCisKKy0tIFByZWNpc2lvbiAzIHNxdWFyZXJvb3QgdGVzdHMgW2V4aGF1c3RpdmUsIGYgYW5kIGYvMTBdCityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiAgIDMKK3NxdHgzMDAxIHNxdWFyZXJvb3QgMC4xIC0+IDAuMzE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDAyIHNxdWFyZXJvb3QgMC4wMSAtPiAwLjEKK3NxdHgzMDAzIHNxdWFyZXJvb3QgMC4yIC0+IDAuNDQ3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDA0IHNxdWFyZXJvb3QgMC4wMiAtPiAwLjE0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAwNSBzcXVhcmVyb290IDAuMyAtPiAwLjU0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAwNiBzcXVhcmVyb290IDAuMDMgLT4gMC4xNzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMDcgc3F1YXJlcm9vdCAwLjQgLT4gMC42MzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMDggc3F1YXJlcm9vdCAwLjA0IC0+IDAuMgorc3F0eDMwMDkgc3F1YXJlcm9vdCAwLjUgLT4gMC43MDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMTAgc3F1YXJlcm9vdCAwLjA1IC0+IDAuMjI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDExIHNxdWFyZXJvb3QgMC42IC0+IDAuNzc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDEyIHNxdWFyZXJvb3QgMC4wNiAtPiAwLjI0NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAxMyBzcXVhcmVyb290IDAuNyAtPiAwLjgzNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAxNCBzcXVhcmVyb290IDAuMDcgLT4gMC4yNjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMTUgc3F1YXJlcm9vdCAwLjggLT4gMC44OTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMTYgc3F1YXJlcm9vdCAwLjA4IC0+IDAuMjgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDE3IHNxdWFyZXJvb3QgMC45IC0+IDAuOTQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDE4IHNxdWFyZXJvb3QgMC4wOSAtPiAwLjMKK3NxdHgzMDE5IHNxdWFyZXJvb3QgMC4xMSAtPiAwLjMzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAyMCBzcXVhcmVyb290IDAuMDExIC0+IDAuMTA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDIxIHNxdWFyZXJvb3QgMC4xMiAtPiAwLjM0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAyMiBzcXVhcmVyb290IDAuMDEyIC0+IDAuMTEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDIzIHNxdWFyZXJvb3QgMC4xMyAtPiAwLjM2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAyNCBzcXVhcmVyb290IDAuMDEzIC0+IDAuMTE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDI1IHNxdWFyZXJvb3QgMC4xNCAtPiAwLjM3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAyNiBzcXVhcmVyb290IDAuMDE0IC0+IDAuMTE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDI3IHNxdWFyZXJvb3QgMC4xNSAtPiAwLjM4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAyOCBzcXVhcmVyb290IDAuMDE1IC0+IDAuMTIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDI5IHNxdWFyZXJvb3QgMC4xNiAtPiAwLjQKK3NxdHgzMDMwIHNxdWFyZXJvb3QgMC4wMTYgLT4gMC4xMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMzEgc3F1YXJlcm9vdCAwLjE3IC0+IDAuNDEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDMyIHNxdWFyZXJvb3QgMC4wMTcgLT4gMC4xMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMzMgc3F1YXJlcm9vdCAwLjE4IC0+IDAuNDI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDM0IHNxdWFyZXJvb3QgMC4wMTggLT4gMC4xMzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMzUgc3F1YXJlcm9vdCAwLjE5IC0+IDAuNDM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDM2IHNxdWFyZXJvb3QgMC4wMTkgLT4gMC4xMzggIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMzcgc3F1YXJlcm9vdCAwLjIxIC0+IDAuNDU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDM4IHNxdWFyZXJvb3QgMC4wMjEgLT4gMC4xNDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMzkgc3F1YXJlcm9vdCAwLjIyIC0+IDAuNDY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDQwIHNxdWFyZXJvb3QgMC4wMjIgLT4gMC4xNDggIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNDEgc3F1YXJlcm9vdCAwLjIzIC0+IDAuNDgwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDQyIHNxdWFyZXJvb3QgMC4wMjMgLT4gMC4xNTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNDMgc3F1YXJlcm9vdCAwLjI0IC0+IDAuNDkwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDQ0IHNxdWFyZXJvb3QgMC4wMjQgLT4gMC4xNTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNDUgc3F1YXJlcm9vdCAwLjI1IC0+IDAuNQorc3F0eDMwNDYgc3F1YXJlcm9vdCAwLjAyNSAtPiAwLjE1OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA0NyBzcXVhcmVyb290IDAuMjYgLT4gMC41MTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNDggc3F1YXJlcm9vdCAwLjAyNiAtPiAwLjE2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA0OSBzcXVhcmVyb290IDAuMjcgLT4gMC41MjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNTAgc3F1YXJlcm9vdCAwLjAyNyAtPiAwLjE2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA1MSBzcXVhcmVyb290IDAuMjggLT4gMC41MjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNTIgc3F1YXJlcm9vdCAwLjAyOCAtPiAwLjE2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA1MyBzcXVhcmVyb290IDAuMjkgLT4gMC41MzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNTQgc3F1YXJlcm9vdCAwLjAyOSAtPiAwLjE3MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA1NSBzcXVhcmVyb290IDAuMzEgLT4gMC41NTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNTYgc3F1YXJlcm9vdCAwLjAzMSAtPiAwLjE3NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA1NyBzcXVhcmVyb290IDAuMzIgLT4gMC41NjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNTggc3F1YXJlcm9vdCAwLjAzMiAtPiAwLjE3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA1OSBzcXVhcmVyb290IDAuMzMgLT4gMC41NzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNjAgc3F1YXJlcm9vdCAwLjAzMyAtPiAwLjE4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA2MSBzcXVhcmVyb290IDAuMzQgLT4gMC41ODMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNjIgc3F1YXJlcm9vdCAwLjAzNCAtPiAwLjE4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA2MyBzcXVhcmVyb290IDAuMzUgLT4gMC41OTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNjQgc3F1YXJlcm9vdCAwLjAzNSAtPiAwLjE4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA2NSBzcXVhcmVyb290IDAuMzYgLT4gMC42CitzcXR4MzA2NiBzcXVhcmVyb290IDAuMDM2IC0+IDAuMTkwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDY3IHNxdWFyZXJvb3QgMC4zNyAtPiAwLjYwOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA2OCBzcXVhcmVyb290IDAuMDM3IC0+IDAuMTkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDY5IHNxdWFyZXJvb3QgMC4zOCAtPiAwLjYxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA3MCBzcXVhcmVyb290IDAuMDM4IC0+IDAuMTk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDcxIHNxdWFyZXJvb3QgMC4zOSAtPiAwLjYyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA3MiBzcXVhcmVyb290IDAuMDM5IC0+IDAuMTk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDczIHNxdWFyZXJvb3QgMC40MSAtPiAwLjY0MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA3NCBzcXVhcmVyb290IDAuMDQxIC0+IDAuMjAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDc1IHNxdWFyZXJvb3QgMC40MiAtPiAwLjY0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA3NiBzcXVhcmVyb290IDAuMDQyIC0+IDAuMjA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDc3IHNxdWFyZXJvb3QgMC40MyAtPiAwLjY1NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA3OCBzcXVhcmVyb290IDAuMDQzIC0+IDAuMjA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDc5IHNxdWFyZXJvb3QgMC40NCAtPiAwLjY2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA4MCBzcXVhcmVyb290IDAuMDQ0IC0+IDAuMjEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDgxIHNxdWFyZXJvb3QgMC40NSAtPiAwLjY3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA4MiBzcXVhcmVyb290IDAuMDQ1IC0+IDAuMjEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDgzIHNxdWFyZXJvb3QgMC40NiAtPiAwLjY3OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA4NCBzcXVhcmVyb290IDAuMDQ2IC0+IDAuMjE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDg1IHNxdWFyZXJvb3QgMC40NyAtPiAwLjY4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA4NiBzcXVhcmVyb290IDAuMDQ3IC0+IDAuMjE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDg3IHNxdWFyZXJvb3QgMC40OCAtPiAwLjY5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA4OCBzcXVhcmVyb290IDAuMDQ4IC0+IDAuMjE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDg5IHNxdWFyZXJvb3QgMC40OSAtPiAwLjcKK3NxdHgzMDkwIHNxdWFyZXJvb3QgMC4wNDkgLT4gMC4yMjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwOTEgc3F1YXJlcm9vdCAwLjUxIC0+IDAuNzE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDkyIHNxdWFyZXJvb3QgMC4wNTEgLT4gMC4yMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwOTMgc3F1YXJlcm9vdCAwLjUyIC0+IDAuNzIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDk0IHNxdWFyZXJvb3QgMC4wNTIgLT4gMC4yMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDMwOTUgc3F1YXJlcm9vdCAwLjUzIC0+IDAuNzI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDk2IHNxdWFyZXJvb3QgMC4wNTMgLT4gMC4yMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwOTcgc3F1YXJlcm9vdCAwLjU0IC0+IDAuNzM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDk4IHNxdWFyZXJvb3QgMC4wNTQgLT4gMC4yMzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwOTkgc3F1YXJlcm9vdCAwLjU1IC0+IDAuNzQyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTAwIHNxdWFyZXJvb3QgMC4wNTUgLT4gMC4yMzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMDEgc3F1YXJlcm9vdCAwLjU2IC0+IDAuNzQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTAyIHNxdWFyZXJvb3QgMC4wNTYgLT4gMC4yMzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMDMgc3F1YXJlcm9vdCAwLjU3IC0+IDAuNzU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTA0IHNxdWFyZXJvb3QgMC4wNTcgLT4gMC4yMzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMDUgc3F1YXJlcm9vdCAwLjU4IC0+IDAuNzYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTA2IHNxdWFyZXJvb3QgMC4wNTggLT4gMC4yNDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMDcgc3F1YXJlcm9vdCAwLjU5IC0+IDAuNzY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTA4IHNxdWFyZXJvb3QgMC4wNTkgLT4gMC4yNDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMDkgc3F1YXJlcm9vdCAwLjYxIC0+IDAuNzgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTEwIHNxdWFyZXJvb3QgMC4wNjEgLT4gMC4yNDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMTEgc3F1YXJlcm9vdCAwLjYyIC0+IDAuNzg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTEyIHNxdWFyZXJvb3QgMC4wNjIgLT4gMC4yNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMTMgc3F1YXJlcm9vdCAwLjYzIC0+IDAuNzk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTE0IHNxdWFyZXJvb3QgMC4wNjMgLT4gMC4yNTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMTUgc3F1YXJlcm9vdCAwLjY0IC0+IDAuOAorc3F0eDMxMTYgc3F1YXJlcm9vdCAwLjA2NCAtPiAwLjI1MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzExNyBzcXVhcmVyb290IDAuNjUgLT4gMC44MDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMTggc3F1YXJlcm9vdCAwLjA2NSAtPiAwLjI1NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzExOSBzcXVhcmVyb290IDAuNjYgLT4gMC44MTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMjAgc3F1YXJlcm9vdCAwLjA2NiAtPiAwLjI1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEyMSBzcXVhcmVyb290IDAuNjcgLT4gMC44MTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMjIgc3F1YXJlcm9vdCAwLjA2NyAtPiAwLjI1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEyMyBzcXVhcmVyb290IDAuNjggLT4gMC44MjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMjQgc3F1YXJlcm9vdCAwLjA2OCAtPiAwLjI2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEyNSBzcXVhcmVyb290IDAuNjkgLT4gMC44MzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMjYgc3F1YXJlcm9vdCAwLjA2OSAtPiAwLjI2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEyNyBzcXVhcmVyb290IDAuNzEgLT4gMC44NDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMjggc3F1YXJlcm9vdCAwLjA3MSAtPiAwLjI2NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEyOSBzcXVhcmVyb290IDAuNzIgLT4gMC44NDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMzAgc3F1YXJlcm9vdCAwLjA3MiAtPiAwLjI2OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEzMSBzcXVhcmVyb290IDAuNzMgLT4gMC44NTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMzIgc3F1YXJlcm9vdCAwLjA3MyAtPiAwLjI3MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEzMyBzcXVhcmVyb290IDAuNzQgLT4gMC44NjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMzQgc3F1YXJlcm9vdCAwLjA3NCAtPiAwLjI3MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEzNSBzcXVhcmVyb290IDAuNzUgLT4gMC44NjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMzYgc3F1YXJlcm9vdCAwLjA3NSAtPiAwLjI3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEzNyBzcXVhcmVyb290IDAuNzYgLT4gMC44NzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMzggc3F1YXJlcm9vdCAwLjA3NiAtPiAwLjI3NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEzOSBzcXVhcmVyb290IDAuNzcgLT4gMC44NzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNDAgc3F1YXJlcm9vdCAwLjA3NyAtPiAwLjI3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE0MSBzcXVhcmVyb290IDAuNzggLT4gMC44ODMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNDIgc3F1YXJlcm9vdCAwLjA3OCAtPiAwLjI3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE0MyBzcXVhcmVyb290IDAuNzkgLT4gMC44ODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNDQgc3F1YXJlcm9vdCAwLjA3OSAtPiAwLjI4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE0NSBzcXVhcmVyb290IDAuODEgLT4gMC45CitzcXR4MzE0NiBzcXVhcmVyb290IDAuMDgxIC0+IDAuMjg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTQ3IHNxdWFyZXJvb3QgMC44MiAtPiAwLjkwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE0OCBzcXVhcmVyb290IDAuMDgyIC0+IDAuMjg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTQ5IHNxdWFyZXJvb3QgMC44MyAtPiAwLjkxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE1MCBzcXVhcmVyb290IDAuMDgzIC0+IDAuMjg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTUxIHNxdWFyZXJvb3QgMC44NCAtPiAwLjkxNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE1MiBzcXVhcmVyb290IDAuMDg0IC0+IDAuMjkwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTUzIHNxdWFyZXJvb3QgMC44NSAtPiAwLjkyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE1NCBzcXVhcmVyb290IDAuMDg1IC0+IDAuMjkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTU1IHNxdWFyZXJvb3QgMC44NiAtPiAwLjkyNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE1NiBzcXVhcmVyb290IDAuMDg2IC0+IDAuMjkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTU3IHNxdWFyZXJvb3QgMC44NyAtPiAwLjkzMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE1OCBzcXVhcmVyb290IDAuMDg3IC0+IDAuMjk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTU5IHNxdWFyZXJvb3QgMC44OCAtPiAwLjkzOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE2MCBzcXVhcmVyb290IDAuMDg4IC0+IDAuMjk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTYxIHNxdWFyZXJvb3QgMC44OSAtPiAwLjk0MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE2MiBzcXVhcmVyb290IDAuMDg5IC0+IDAuMjk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTYzIHNxdWFyZXJvb3QgMC45MSAtPiAwLjk1NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE2NCBzcXVhcmVyb290IDAuMDkxIC0+IDAuMzAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTY1IHNxdWFyZXJvb3QgMC45MiAtPiAwLjk1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE2NiBzcXVhcmVyb290IDAuMDkyIC0+IDAuMzAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTY3IHNxdWFyZXJvb3QgMC45MyAtPiAwLjk2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE2OCBzcXVhcmVyb290IDAuMDkzIC0+IDAuMzA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTY5IHNxdWFyZXJvb3QgMC45NCAtPiAwLjk3MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE3MCBzcXVhcmVyb290IDAuMDk0IC0+IDAuMzA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTcxIHNxdWFyZXJvb3QgMC45NSAtPiAwLjk3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE3MiBzcXVhcmVyb290IDAuMDk1IC0+IDAuMzA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTczIHNxdWFyZXJvb3QgMC45NiAtPiAwLjk4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE3NCBzcXVhcmVyb290IDAuMDk2IC0+IDAuMzEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTc1IHNxdWFyZXJvb3QgMC45NyAtPiAwLjk4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE3NiBzcXVhcmVyb290IDAuMDk3IC0+IDAuMzExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTc3IHNxdWFyZXJvb3QgMC45OCAtPiAwLjk5MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE3OCBzcXVhcmVyb290IDAuMDk4IC0+IDAuMzEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTc5IHNxdWFyZXJvb3QgMC45OSAtPiAwLjk5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE4MCBzcXVhcmVyb290IDAuMDk5IC0+IDAuMzE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTgxIHNxdWFyZXJvb3QgMC4xMDEgLT4gMC4zMTggIEluZXhhY3QgUm91bmRlZAorc3F0eDMxODIgc3F1YXJlcm9vdCAwLjAxMDEgLT4gMC4xMDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxODMgc3F1YXJlcm9vdCAwLjEwMiAtPiAwLjMxOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE4NCBzcXVhcmVyb290IDAuMDEwMiAtPiAwLjEwMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE4NSBzcXVhcmVyb290IDAuMTAzIC0+IDAuMzIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTg2IHNxdWFyZXJvb3QgMC4wMTAzIC0+IDAuMTAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTg3IHNxdWFyZXJvb3QgMC4xMDQgLT4gMC4zMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxODggc3F1YXJlcm9vdCAwLjAxMDQgLT4gMC4xMDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxODkgc3F1YXJlcm9vdCAwLjEwNSAtPiAwLjMyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE5MCBzcXVhcmVyb290IDAuMDEwNSAtPiAwLjEwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE5MSBzcXVhcmVyb290IDAuMTA2IC0+IDAuMzI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTkyIHNxdWFyZXJvb3QgMC4wMTA2IC0+IDAuMTAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTkzIHNxdWFyZXJvb3QgMC4xMDcgLT4gMC4zMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxOTQgc3F1YXJlcm9vdCAwLjAxMDcgLT4gMC4xMDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxOTUgc3F1YXJlcm9vdCAwLjEwOCAtPiAwLjMyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE5NiBzcXVhcmVyb290IDAuMDEwOCAtPiAwLjEwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE5NyBzcXVhcmVyb290IDAuMTA5IC0+IDAuMzMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTk4IHNxdWFyZXJvb3QgMC4wMTA5IC0+IDAuMTA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTk5IHNxdWFyZXJvb3QgMC4xMTEgLT4gMC4zMzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMDAgc3F1YXJlcm9vdCAwLjAxMTEgLT4gMC4xMDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMDEgc3F1YXJlcm9vdCAwLjExMiAtPiAwLjMzNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIwMiBzcXVhcmVyb290IDAuMDExMiAtPiAwLjEwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIwMyBzcXVhcmVyb290IDAuMTEzIC0+IDAuMzM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjA0IHNxdWFyZXJvb3QgMC4wMTEzIC0+IDAuMTA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjA1IHNxdWFyZXJvb3QgMC4xMTQgLT4gMC4zMzggIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMDYgc3F1YXJlcm9vdCAwLjAxMTQgLT4gMC4xMDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMDcgc3F1YXJlcm9vdCAwLjExNSAtPiAwLjMzOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIwOCBzcXVhcmVyb290IDAuMDExNSAtPiAwLjEwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIwOSBzcXVhcmVyb290IDAuMTE2IC0+IDAuMzQxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjEwIHNxdWFyZXJvb3QgMC4wMTE2IC0+IDAuMTA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjExIHNxdWFyZXJvb3QgMC4xMTcgLT4gMC4zNDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMTIgc3F1YXJlcm9vdCAwLjAxMTcgLT4gMC4xMDggIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMTMgc3F1YXJlcm9vdCAwLjExOCAtPiAwLjM0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIxNCBzcXVhcmVyb290IDAuMDExOCAtPiAwLjEwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIxNSBzcXVhcmVyb290IDAuMTE5IC0+IDAuMzQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjE2IHNxdWFyZXJvb3QgMC4wMTE5IC0+IDAuMTA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjE3IHNxdWFyZXJvb3QgMC4xMjEgLT4gMC4zNDggIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMTggc3F1YXJlcm9vdCAwLjAxMjEgLT4gMC4xMQorc3F0eDMyMTkgc3F1YXJlcm9vdCAwLjEyMiAtPiAwLjM0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIyMCBzcXVhcmVyb290IDAuMDEyMiAtPiAwLjExMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIyMSBzcXVhcmVyb290IDAuMTIzIC0+IDAuMzUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjIyIHNxdWFyZXJvb3QgMC4wMTIzIC0+IDAuMTExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjIzIHNxdWFyZXJvb3QgMC4xMjQgLT4gMC4zNTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMjQgc3F1YXJlcm9vdCAwLjAxMjQgLT4gMC4xMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMjUgc3F1YXJlcm9vdCAwLjEyNSAtPiAwLjM1NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIyNiBzcXVhcmVyb290IDAuMDEyNSAtPiAwLjExMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIyNyBzcXVhcmVyb290IDAuMTI2IC0+IDAuMzU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjI4IHNxdWFyZXJvb3QgMC4wMTI2IC0+IDAuMTEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjI5IHNxdWFyZXJvb3QgMC4xMjcgLT4gMC4zNTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMzAgc3F1YXJlcm9vdCAwLjAxMjcgLT4gMC4xMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMzEgc3F1YXJlcm9vdCAwLjEyOCAtPiAwLjM1OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIzMiBzcXVhcmVyb290IDAuMDEyOCAtPiAwLjExMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIzMyBzcXVhcmVyb290IDAuMTI5IC0+IDAuMzU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjM0IHNxdWFyZXJvb3QgMC4wMTI5IC0+IDAuMTE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjM1IHNxdWFyZXJvb3QgMC4xMzEgLT4gMC4zNjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMzYgc3F1YXJlcm9vdCAwLjAxMzEgLT4gMC4xMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMzcgc3F1YXJlcm9vdCAwLjEzMiAtPiAwLjM2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIzOCBzcXVhcmVyb290IDAuMDEzMiAtPiAwLjExNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIzOSBzcXVhcmVyb290IDAuMTMzIC0+IDAuMzY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjQwIHNxdWFyZXJvb3QgMC4wMTMzIC0+IDAuMTE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjQxIHNxdWFyZXJvb3QgMC4xMzQgLT4gMC4zNjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNDIgc3F1YXJlcm9vdCAwLjAxMzQgLT4gMC4xMTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNDMgc3F1YXJlcm9vdCAwLjEzNSAtPiAwLjM2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI0NCBzcXVhcmVyb290IDAuMDEzNSAtPiAwLjExNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI0NSBzcXVhcmVyb290IDAuMTM2IC0+IDAuMzY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjQ2IHNxdWFyZXJvb3QgMC4wMTM2IC0+IDAuMTE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjQ3IHNxdWFyZXJvb3QgMC4xMzcgLT4gMC4zNzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNDggc3F1YXJlcm9vdCAwLjAxMzcgLT4gMC4xMTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNDkgc3F1YXJlcm9vdCAwLjEzOCAtPiAwLjM3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI1MCBzcXVhcmVyb290IDAuMDEzOCAtPiAwLjExNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI1MSBzcXVhcmVyb290IDAuMTM5IC0+IDAuMzczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjUyIHNxdWFyZXJvb3QgMC4wMTM5IC0+IDAuMTE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjUzIHNxdWFyZXJvb3QgMC4xNDEgLT4gMC4zNzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNTQgc3F1YXJlcm9vdCAwLjAxNDEgLT4gMC4xMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNTUgc3F1YXJlcm9vdCAwLjE0MiAtPiAwLjM3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI1NiBzcXVhcmVyb290IDAuMDE0MiAtPiAwLjExOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI1NyBzcXVhcmVyb290IDAuMTQzIC0+IDAuMzc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjU4IHNxdWFyZXJvb3QgMC4wMTQzIC0+IDAuMTIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjU5IHNxdWFyZXJvb3QgMC4xNDQgLT4gMC4zNzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNjAgc3F1YXJlcm9vdCAwLjAxNDQgLT4gMC4xMgorc3F0eDMyNjEgc3F1YXJlcm9vdCAwLjE0NSAtPiAwLjM4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI2MiBzcXVhcmVyb290IDAuMDE0NSAtPiAwLjEyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI2MyBzcXVhcmVyb290IDAuMTQ2IC0+IDAuMzgyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjY0IHNxdWFyZXJvb3QgMC4wMTQ2IC0+IDAuMTIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjY1IHNxdWFyZXJvb3QgMC4xNDcgLT4gMC4zODMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNjYgc3F1YXJlcm9vdCAwLjAxNDcgLT4gMC4xMjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNjcgc3F1YXJlcm9vdCAwLjE0OCAtPiAwLjM4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI2OCBzcXVhcmVyb290IDAuMDE0OCAtPiAwLjEyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI2OSBzcXVhcmVyb290IDAuMTQ5IC0+IDAuMzg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjcwIHNxdWFyZXJvb3QgMC4wMTQ5IC0+IDAuMTIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjcxIHNxdWFyZXJvb3QgMC4xNTEgLT4gMC4zODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNzIgc3F1YXJlcm9vdCAwLjAxNTEgLT4gMC4xMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNzMgc3F1YXJlcm9vdCAwLjE1MiAtPiAwLjM5MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI3NCBzcXVhcmVyb290IDAuMDE1MiAtPiAwLjEyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI3NSBzcXVhcmVyb290IDAuMTUzIC0+IDAuMzkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjc2IHNxdWFyZXJvb3QgMC4wMTUzIC0+IDAuMTI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjc3IHNxdWFyZXJvb3QgMC4xNTQgLT4gMC4zOTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNzggc3F1YXJlcm9vdCAwLjAxNTQgLT4gMC4xMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNzkgc3F1YXJlcm9vdCAwLjE1NSAtPiAwLjM5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI4MCBzcXVhcmVyb290IDAuMDE1NSAtPiAwLjEyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI4MSBzcXVhcmVyb290IDAuMTU2IC0+IDAuMzk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjgyIHNxdWFyZXJvb3QgMC4wMTU2IC0+IDAuMTI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjgzIHNxdWFyZXJvb3QgMC4xNTcgLT4gMC4zOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyODQgc3F1YXJlcm9vdCAwLjAxNTcgLT4gMC4xMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyODUgc3F1YXJlcm9vdCAwLjE1OCAtPiAwLjM5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI4NiBzcXVhcmVyb290IDAuMDE1OCAtPiAwLjEyNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI4NyBzcXVhcmVyb290IDAuMTU5IC0+IDAuMzk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjg4IHNxdWFyZXJvb3QgMC4wMTU5IC0+IDAuMTI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjg5IHNxdWFyZXJvb3QgMC4xNjEgLT4gMC40MDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyOTAgc3F1YXJlcm9vdCAwLjAxNjEgLT4gMC4xMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyOTEgc3F1YXJlcm9vdCAwLjE2MiAtPiAwLjQwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI5MiBzcXVhcmVyb290IDAuMDE2MiAtPiAwLjEyNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI5MyBzcXVhcmVyb290IDAuMTYzIC0+IDAuNDA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjk0IHNxdWFyZXJvb3QgMC4wMTYzIC0+IDAuMTI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjk1IHNxdWFyZXJvb3QgMC4xNjQgLT4gMC40MDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyOTYgc3F1YXJlcm9vdCAwLjAxNjQgLT4gMC4xMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDMyOTcgc3F1YXJlcm9vdCAwLjE2NSAtPiAwLjQwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI5OCBzcXVhcmVyb290IDAuMDE2NSAtPiAwLjEyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI5OSBzcXVhcmVyb290IDAuMTY2IC0+IDAuNDA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzAwIHNxdWFyZXJvb3QgMC4wMTY2IC0+IDAuMTI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzAxIHNxdWFyZXJvb3QgMC4xNjcgLT4gMC40MDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMDIgc3F1YXJlcm9vdCAwLjAxNjcgLT4gMC4xMjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMDMgc3F1YXJlcm9vdCAwLjE2OCAtPiAwLjQxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMwNCBzcXVhcmVyb290IDAuMDE2OCAtPiAwLjEzMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMwNSBzcXVhcmVyb290IDAuMTY5IC0+IDAuNDExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzA2IHNxdWFyZXJvb3QgMC4wMTY5IC0+IDAuMTMKK3NxdHgzMzA3IHNxdWFyZXJvb3QgMC4xNzEgLT4gMC40MTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMDggc3F1YXJlcm9vdCAwLjAxNzEgLT4gMC4xMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMDkgc3F1YXJlcm9vdCAwLjE3MiAtPiAwLjQxNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMxMCBzcXVhcmVyb290IDAuMDE3MiAtPiAwLjEzMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMxMSBzcXVhcmVyb290IDAuMTczIC0+IDAuNDE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzEyIHNxdWFyZXJvb3QgMC4wMTczIC0+IDAuMTMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzEzIHNxdWFyZXJvb3QgMC4xNzQgLT4gMC40MTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMTQgc3F1YXJlcm9vdCAwLjAxNzQgLT4gMC4xMzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMTUgc3F1YXJlcm9vdCAwLjE3NSAtPiAwLjQxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMxNiBzcXVhcmVyb290IDAuMDE3NSAtPiAwLjEzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMxNyBzcXVhcmVyb290IDAuMTc2IC0+IDAuNDIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzE4IHNxdWFyZXJvb3QgMC4wMTc2IC0+IDAuMTMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzE5IHNxdWFyZXJvb3QgMC4xNzcgLT4gMC40MjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMjAgc3F1YXJlcm9vdCAwLjAxNzcgLT4gMC4xMzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMjEgc3F1YXJlcm9vdCAwLjE3OCAtPiAwLjQyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMyMiBzcXVhcmVyb290IDAuMDE3OCAtPiAwLjEzMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMyMyBzcXVhcmVyb290IDAuMTc5IC0+IDAuNDIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzI0IHNxdWFyZXJvb3QgMC4wMTc5IC0+IDAuMTM0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzI1IHNxdWFyZXJvb3QgMC4xODEgLT4gMC40MjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMjYgc3F1YXJlcm9vdCAwLjAxODEgLT4gMC4xMzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMjcgc3F1YXJlcm9vdCAwLjE4MiAtPiAwLjQyNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMyOCBzcXVhcmVyb290IDAuMDE4MiAtPiAwLjEzNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMyOSBzcXVhcmVyb290IDAuMTgzIC0+IDAuNDI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzMwIHNxdWFyZXJvb3QgMC4wMTgzIC0+IDAuMTM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzMxIHNxdWFyZXJvb3QgMC4xODQgLT4gMC40MjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMzIgc3F1YXJlcm9vdCAwLjAxODQgLT4gMC4xMzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMzMgc3F1YXJlcm9vdCAwLjE4NSAtPiAwLjQzMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMzNCBzcXVhcmVyb290IDAuMDE4NSAtPiAwLjEzNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMzNSBzcXVhcmVyb290IDAuMTg2IC0+IDAuNDMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzM2IHNxdWFyZXJvb3QgMC4wMTg2IC0+IDAuMTM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzM3IHNxdWFyZXJvb3QgMC4xODcgLT4gMC40MzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMzggc3F1YXJlcm9vdCAwLjAxODcgLT4gMC4xMzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMzkgc3F1YXJlcm9vdCAwLjE4OCAtPiAwLjQzNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM0MCBzcXVhcmVyb290IDAuMDE4OCAtPiAwLjEzNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM0MSBzcXVhcmVyb290IDAuMTg5IC0+IDAuNDM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzQyIHNxdWFyZXJvb3QgMC4wMTg5IC0+IDAuMTM3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzQzIHNxdWFyZXJvb3QgMC4xOTEgLT4gMC40MzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNDQgc3F1YXJlcm9vdCAwLjAxOTEgLT4gMC4xMzggIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNDUgc3F1YXJlcm9vdCAwLjE5MiAtPiAwLjQzOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM0NiBzcXVhcmVyb290IDAuMDE5MiAtPiAwLjEzOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM0NyBzcXVhcmVyb290IDAuMTkzIC0+IDAuNDM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzQ4IHNxdWFyZXJvb3QgMC4wMTkzIC0+IDAuMTM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzQ5IHNxdWFyZXJvb3QgMC4xOTQgLT4gMC40NDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNTAgc3F1YXJlcm9vdCAwLjAxOTQgLT4gMC4xMzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNTEgc3F1YXJlcm9vdCAwLjE5NSAtPiAwLjQ0MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM1MiBzcXVhcmVyb290IDAuMDE5NSAtPiAwLjE0MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM1MyBzcXVhcmVyb290IDAuMTk2IC0+IDAuNDQzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzU0IHNxdWFyZXJvb3QgMC4wMTk2IC0+IDAuMTQKK3NxdHgzMzU1IHNxdWFyZXJvb3QgMC4xOTcgLT4gMC40NDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNTYgc3F1YXJlcm9vdCAwLjAxOTcgLT4gMC4xNDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNTcgc3F1YXJlcm9vdCAwLjE5OCAtPiAwLjQ0NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM1OCBzcXVhcmVyb290IDAuMDE5OCAtPiAwLjE0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM1OSBzcXVhcmVyb290IDAuMTk5IC0+IDAuNDQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzYwIHNxdWFyZXJvb3QgMC4wMTk5IC0+IDAuMTQxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzYxIHNxdWFyZXJvb3QgMC4yMDEgLT4gMC40NDggIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNjIgc3F1YXJlcm9vdCAwLjAyMDEgLT4gMC4xNDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNjMgc3F1YXJlcm9vdCAwLjIwMiAtPiAwLjQ0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM2NCBzcXVhcmVyb290IDAuMDIwMiAtPiAwLjE0MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM2NSBzcXVhcmVyb290IDAuMjAzIC0+IDAuNDUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzY2IHNxdWFyZXJvb3QgMC4wMjAzIC0+IDAuMTQyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzY3IHNxdWFyZXJvb3QgMC4yMDQgLT4gMC40NTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNjggc3F1YXJlcm9vdCAwLjAyMDQgLT4gMC4xNDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNjkgc3F1YXJlcm9vdCAwLjIwNSAtPiAwLjQ1MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM3MCBzcXVhcmVyb290IDAuMDIwNSAtPiAwLjE0MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM3MSBzcXVhcmVyb290IDAuMjA2IC0+IDAuNDU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzcyIHNxdWFyZXJvb3QgMC4wMjA2IC0+IDAuMTQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzczIHNxdWFyZXJvb3QgMC4yMDcgLT4gMC40NTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNzQgc3F1YXJlcm9vdCAwLjAyMDcgLT4gMC4xNDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNzUgc3F1YXJlcm9vdCAwLjIwOCAtPiAwLjQ1NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM3NiBzcXVhcmVyb290IDAuMDIwOCAtPiAwLjE0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM3NyBzcXVhcmVyb290IDAuMjA5IC0+IDAuNDU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzc4IHNxdWFyZXJvb3QgMC4wMjA5IC0+IDAuMTQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzc5IHNxdWFyZXJvb3QgMC4yMTEgLT4gMC40NTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzODAgc3F1YXJlcm9vdCAwLjAyMTEgLT4gMC4xNDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzODEgc3F1YXJlcm9vdCAwLjIxMiAtPiAwLjQ2MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM4MiBzcXVhcmVyb290IDAuMDIxMiAtPiAwLjE0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM4MyBzcXVhcmVyb290IDAuMjEzIC0+IDAuNDYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzg0IHNxdWFyZXJvb3QgMC4wMjEzIC0+IDAuMTQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzg1IHNxdWFyZXJvb3QgMC4yMTQgLT4gMC40NjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzODYgc3F1YXJlcm9vdCAwLjAyMTQgLT4gMC4xNDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzODcgc3F1YXJlcm9vdCAwLjIxNSAtPiAwLjQ2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM4OCBzcXVhcmVyb290IDAuMDIxNSAtPiAwLjE0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM4OSBzcXVhcmVyb290IDAuMjE2IC0+IDAuNDY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzkwIHNxdWFyZXJvb3QgMC4wMjE2IC0+IDAuMTQ3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzkxIHNxdWFyZXJvb3QgMC4yMTcgLT4gMC40NjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzOTIgc3F1YXJlcm9vdCAwLjAyMTcgLT4gMC4xNDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzOTMgc3F1YXJlcm9vdCAwLjIxOCAtPiAwLjQ2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM5NCBzcXVhcmVyb290IDAuMDIxOCAtPiAwLjE0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM5NSBzcXVhcmVyb290IDAuMjE5IC0+IDAuNDY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzk2IHNxdWFyZXJvb3QgMC4wMjE5IC0+IDAuMTQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzk3IHNxdWFyZXJvb3QgMC4yMjEgLT4gMC40NzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzOTggc3F1YXJlcm9vdCAwLjAyMjEgLT4gMC4xNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzOTkgc3F1YXJlcm9vdCAwLjIyMiAtPiAwLjQ3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQwMCBzcXVhcmVyb290IDAuMDIyMiAtPiAwLjE0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQwMSBzcXVhcmVyb290IDAuMjIzIC0+IDAuNDcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDAyIHNxdWFyZXJvb3QgMC4wMjIzIC0+IDAuMTQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDAzIHNxdWFyZXJvb3QgMC4yMjQgLT4gMC40NzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MDQgc3F1YXJlcm9vdCAwLjAyMjQgLT4gMC4xNTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MDUgc3F1YXJlcm9vdCAwLjIyNSAtPiAwLjQ3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQwNiBzcXVhcmVyb290IDAuMDIyNSAtPiAwLjE1CitzcXR4MzQwNyBzcXVhcmVyb290IDAuMjI2IC0+IDAuNDc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDA4IHNxdWFyZXJvb3QgMC4wMjI2IC0+IDAuMTUwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDA5IHNxdWFyZXJvb3QgMC4yMjcgLT4gMC40NzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MTAgc3F1YXJlcm9vdCAwLjAyMjcgLT4gMC4xNTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MTEgc3F1YXJlcm9vdCAwLjIyOCAtPiAwLjQ3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQxMiBzcXVhcmVyb290IDAuMDIyOCAtPiAwLjE1MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQxMyBzcXVhcmVyb290IDAuMjI5IC0+IDAuNDc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDE0IHNxdWFyZXJvb3QgMC4wMjI5IC0+IDAuMTUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDE1IHNxdWFyZXJvb3QgMC4yMzEgLT4gMC40ODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MTYgc3F1YXJlcm9vdCAwLjAyMzEgLT4gMC4xNTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MTcgc3F1YXJlcm9vdCAwLjIzMiAtPiAwLjQ4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQxOCBzcXVhcmVyb290IDAuMDIzMiAtPiAwLjE1MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQxOSBzcXVhcmVyb290IDAuMjMzIC0+IDAuNDgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDIwIHNxdWFyZXJvb3QgMC4wMjMzIC0+IDAuMTUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDIxIHNxdWFyZXJvb3QgMC4yMzQgLT4gMC40ODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MjIgc3F1YXJlcm9vdCAwLjAyMzQgLT4gMC4xNTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MjMgc3F1YXJlcm9vdCAwLjIzNSAtPiAwLjQ4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQyNCBzcXVhcmVyb290IDAuMDIzNSAtPiAwLjE1MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQyNSBzcXVhcmVyb290IDAuMjM2IC0+IDAuNDg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDI2IHNxdWFyZXJvb3QgMC4wMjM2IC0+IDAuMTU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDI3IHNxdWFyZXJvb3QgMC4yMzcgLT4gMC40ODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0Mjggc3F1YXJlcm9vdCAwLjAyMzcgLT4gMC4xNTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0Mjkgc3F1YXJlcm9vdCAwLjIzOCAtPiAwLjQ4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQzMCBzcXVhcmVyb290IDAuMDIzOCAtPiAwLjE1NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQzMSBzcXVhcmVyb290IDAuMjM5IC0+IDAuNDg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDMyIHNxdWFyZXJvb3QgMC4wMjM5IC0+IDAuMTU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDMzIHNxdWFyZXJvb3QgMC4yNDEgLT4gMC40OTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MzQgc3F1YXJlcm9vdCAwLjAyNDEgLT4gMC4xNTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MzUgc3F1YXJlcm9vdCAwLjI0MiAtPiAwLjQ5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQzNiBzcXVhcmVyb290IDAuMDI0MiAtPiAwLjE1NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQzNyBzcXVhcmVyb290IDAuMjQzIC0+IDAuNDkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDM4IHNxdWFyZXJvb3QgMC4wMjQzIC0+IDAuMTU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDM5IHNxdWFyZXJvb3QgMC4yNDQgLT4gMC40OTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NDAgc3F1YXJlcm9vdCAwLjAyNDQgLT4gMC4xNTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NDEgc3F1YXJlcm9vdCAwLjI0NSAtPiAwLjQ5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ0MiBzcXVhcmVyb290IDAuMDI0NSAtPiAwLjE1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ0MyBzcXVhcmVyb290IDAuMjQ2IC0+IDAuNDk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDQ0IHNxdWFyZXJvb3QgMC4wMjQ2IC0+IDAuMTU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDQ1IHNxdWFyZXJvb3QgMC4yNDcgLT4gMC40OTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NDYgc3F1YXJlcm9vdCAwLjAyNDcgLT4gMC4xNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NDcgc3F1YXJlcm9vdCAwLjI0OCAtPiAwLjQ5OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ0OCBzcXVhcmVyb290IDAuMDI0OCAtPiAwLjE1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ0OSBzcXVhcmVyb290IDAuMjQ5IC0+IDAuNDk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDUwIHNxdWFyZXJvb3QgMC4wMjQ5IC0+IDAuMTU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDUxIHNxdWFyZXJvb3QgMC4yNTEgLT4gMC41MDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NTIgc3F1YXJlcm9vdCAwLjAyNTEgLT4gMC4xNTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NTMgc3F1YXJlcm9vdCAwLjI1MiAtPiAwLjUwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ1NCBzcXVhcmVyb290IDAuMDI1MiAtPiAwLjE1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ1NSBzcXVhcmVyb290IDAuMjUzIC0+IDAuNTAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDU2IHNxdWFyZXJvb3QgMC4wMjUzIC0+IDAuMTU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDU3IHNxdWFyZXJvb3QgMC4yNTQgLT4gMC41MDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NTggc3F1YXJlcm9vdCAwLjAyNTQgLT4gMC4xNTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NTkgc3F1YXJlcm9vdCAwLjI1NSAtPiAwLjUwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ2MCBzcXVhcmVyb290IDAuMDI1NSAtPiAwLjE2MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ2MSBzcXVhcmVyb290IDAuMjU2IC0+IDAuNTA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDYyIHNxdWFyZXJvb3QgMC4wMjU2IC0+IDAuMTYKK3NxdHgzNDYzIHNxdWFyZXJvb3QgMC4yNTcgLT4gMC41MDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NjQgc3F1YXJlcm9vdCAwLjAyNTcgLT4gMC4xNjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NjUgc3F1YXJlcm9vdCAwLjI1OCAtPiAwLjUwOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ2NiBzcXVhcmVyb290IDAuMDI1OCAtPiAwLjE2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ2NyBzcXVhcmVyb290IDAuMjU5IC0+IDAuNTA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDY4IHNxdWFyZXJvb3QgMC4wMjU5IC0+IDAuMTYxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDY5IHNxdWFyZXJvb3QgMC4yNjEgLT4gMC41MTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NzAgc3F1YXJlcm9vdCAwLjAyNjEgLT4gMC4xNjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NzEgc3F1YXJlcm9vdCAwLjI2MiAtPiAwLjUxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ3MiBzcXVhcmVyb290IDAuMDI2MiAtPiAwLjE2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ3MyBzcXVhcmVyb290IDAuMjYzIC0+IDAuNTEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDc0IHNxdWFyZXJvb3QgMC4wMjYzIC0+IDAuMTYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDc1IHNxdWFyZXJvb3QgMC4yNjQgLT4gMC41MTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NzYgc3F1YXJlcm9vdCAwLjAyNjQgLT4gMC4xNjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0Nzcgc3F1YXJlcm9vdCAwLjI2NSAtPiAwLjUxNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ3OCBzcXVhcmVyb290IDAuMDI2NSAtPiAwLjE2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ3OSBzcXVhcmVyb290IDAuMjY2IC0+IDAuNTE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDgwIHNxdWFyZXJvb3QgMC4wMjY2IC0+IDAuMTYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDgxIHNxdWFyZXJvb3QgMC4yNjcgLT4gMC41MTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0ODIgc3F1YXJlcm9vdCAwLjAyNjcgLT4gMC4xNjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0ODMgc3F1YXJlcm9vdCAwLjI2OCAtPiAwLjUxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ4NCBzcXVhcmVyb290IDAuMDI2OCAtPiAwLjE2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ4NSBzcXVhcmVyb290IDAuMjY5IC0+IDAuNTE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDg2IHNxdWFyZXJvb3QgMC4wMjY5IC0+IDAuMTY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDg3IHNxdWFyZXJvb3QgMC4yNzEgLT4gMC41MjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0ODggc3F1YXJlcm9vdCAwLjAyNzEgLT4gMC4xNjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0ODkgc3F1YXJlcm9vdCAwLjI3MiAtPiAwLjUyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ5MCBzcXVhcmVyb290IDAuMDI3MiAtPiAwLjE2NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ5MSBzcXVhcmVyb290IDAuMjczIC0+IDAuNTIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDkyIHNxdWFyZXJvb3QgMC4wMjczIC0+IDAuMTY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDkzIHNxdWFyZXJvb3QgMC4yNzQgLT4gMC41MjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0OTQgc3F1YXJlcm9vdCAwLjAyNzQgLT4gMC4xNjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0OTUgc3F1YXJlcm9vdCAwLjI3NSAtPiAwLjUyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ5NiBzcXVhcmVyb290IDAuMDI3NSAtPiAwLjE2NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ5NyBzcXVhcmVyb290IDAuMjc2IC0+IDAuNTI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDk4IHNxdWFyZXJvb3QgMC4wMjc2IC0+IDAuMTY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDk5IHNxdWFyZXJvb3QgMC4yNzcgLT4gMC41MjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MDAgc3F1YXJlcm9vdCAwLjAyNzcgLT4gMC4xNjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MDEgc3F1YXJlcm9vdCAwLjI3OCAtPiAwLjUyNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUwMiBzcXVhcmVyb290IDAuMDI3OCAtPiAwLjE2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUwMyBzcXVhcmVyb290IDAuMjc5IC0+IDAuNTI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTA0IHNxdWFyZXJvb3QgMC4wMjc5IC0+IDAuMTY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTA1IHNxdWFyZXJvb3QgMC4yODEgLT4gMC41MzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MDYgc3F1YXJlcm9vdCAwLjAyODEgLT4gMC4xNjggIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MDcgc3F1YXJlcm9vdCAwLjI4MiAtPiAwLjUzMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUwOCBzcXVhcmVyb290IDAuMDI4MiAtPiAwLjE2OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUwOSBzcXVhcmVyb290IDAuMjgzIC0+IDAuNTMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTEwIHNxdWFyZXJvb3QgMC4wMjgzIC0+IDAuMTY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTExIHNxdWFyZXJvb3QgMC4yODQgLT4gMC41MzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MTIgc3F1YXJlcm9vdCAwLjAyODQgLT4gMC4xNjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MTMgc3F1YXJlcm9vdCAwLjI4NSAtPiAwLjUzNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUxNCBzcXVhcmVyb290IDAuMDI4NSAtPiAwLjE2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUxNSBzcXVhcmVyb290IDAuMjg2IC0+IDAuNTM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTE2IHNxdWFyZXJvb3QgMC4wMjg2IC0+IDAuMTY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTE3IHNxdWFyZXJvb3QgMC4yODcgLT4gMC41MzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MTggc3F1YXJlcm9vdCAwLjAyODcgLT4gMC4xNjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MTkgc3F1YXJlcm9vdCAwLjI4OCAtPiAwLjUzNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUyMCBzcXVhcmVyb290IDAuMDI4OCAtPiAwLjE3MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUyMSBzcXVhcmVyb290IDAuMjg5IC0+IDAuNTM4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTIyIHNxdWFyZXJvb3QgMC4wMjg5IC0+IDAuMTcKK3NxdHgzNTIzIHNxdWFyZXJvb3QgMC4yOTEgLT4gMC41MzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MjQgc3F1YXJlcm9vdCAwLjAyOTEgLT4gMC4xNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MjUgc3F1YXJlcm9vdCAwLjI5MiAtPiAwLjU0MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUyNiBzcXVhcmVyb290IDAuMDI5MiAtPiAwLjE3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUyNyBzcXVhcmVyb290IDAuMjkzIC0+IDAuNTQxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTI4IHNxdWFyZXJvb3QgMC4wMjkzIC0+IDAuMTcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTI5IHNxdWFyZXJvb3QgMC4yOTQgLT4gMC41NDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MzAgc3F1YXJlcm9vdCAwLjAyOTQgLT4gMC4xNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MzEgc3F1YXJlcm9vdCAwLjI5NSAtPiAwLjU0MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUzMiBzcXVhcmVyb290IDAuMDI5NSAtPiAwLjE3MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUzMyBzcXVhcmVyb290IDAuMjk2IC0+IDAuNTQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTM0IHNxdWFyZXJvb3QgMC4wMjk2IC0+IDAuMTcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTM1IHNxdWFyZXJvb3QgMC4yOTcgLT4gMC41NDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MzYgc3F1YXJlcm9vdCAwLjAyOTcgLT4gMC4xNzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1Mzcgc3F1YXJlcm9vdCAwLjI5OCAtPiAwLjU0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUzOCBzcXVhcmVyb290IDAuMDI5OCAtPiAwLjE3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUzOSBzcXVhcmVyb290IDAuMjk5IC0+IDAuNTQ3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTQwIHNxdWFyZXJvb3QgMC4wMjk5IC0+IDAuMTczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTQxIHNxdWFyZXJvb3QgMC4zMDEgLT4gMC41NDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NDIgc3F1YXJlcm9vdCAwLjAzMDEgLT4gMC4xNzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NDMgc3F1YXJlcm9vdCAwLjMwMiAtPiAwLjU1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU0NCBzcXVhcmVyb290IDAuMDMwMiAtPiAwLjE3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU0NSBzcXVhcmVyb290IDAuMzAzIC0+IDAuNTUwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTQ2IHNxdWFyZXJvb3QgMC4wMzAzIC0+IDAuMTc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTQ3IHNxdWFyZXJvb3QgMC4zMDQgLT4gMC41NTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NDggc3F1YXJlcm9vdCAwLjAzMDQgLT4gMC4xNzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NDkgc3F1YXJlcm9vdCAwLjMwNSAtPiAwLjU1MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU1MCBzcXVhcmVyb290IDAuMDMwNSAtPiAwLjE3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU1MSBzcXVhcmVyb290IDAuMzA2IC0+IDAuNTUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTUyIHNxdWFyZXJvb3QgMC4wMzA2IC0+IDAuMTc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTUzIHNxdWFyZXJvb3QgMC4zMDcgLT4gMC41NTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NTQgc3F1YXJlcm9vdCAwLjAzMDcgLT4gMC4xNzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NTUgc3F1YXJlcm9vdCAwLjMwOCAtPiAwLjU1NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU1NiBzcXVhcmVyb290IDAuMDMwOCAtPiAwLjE3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU1NyBzcXVhcmVyb290IDAuMzA5IC0+IDAuNTU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTU4IHNxdWFyZXJvb3QgMC4wMzA5IC0+IDAuMTc2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTU5IHNxdWFyZXJvb3QgMC4zMTEgLT4gMC41NTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NjAgc3F1YXJlcm9vdCAwLjAzMTEgLT4gMC4xNzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NjEgc3F1YXJlcm9vdCAwLjMxMiAtPiAwLjU1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU2MiBzcXVhcmVyb290IDAuMDMxMiAtPiAwLjE3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU2MyBzcXVhcmVyb290IDAuMzEzIC0+IDAuNTU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTY0IHNxdWFyZXJvb3QgMC4wMzEzIC0+IDAuMTc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTY1IHNxdWFyZXJvb3QgMC4zMTQgLT4gMC41NjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NjYgc3F1YXJlcm9vdCAwLjAzMTQgLT4gMC4xNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1Njcgc3F1YXJlcm9vdCAwLjMxNSAtPiAwLjU2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU2OCBzcXVhcmVyb290IDAuMDMxNSAtPiAwLjE3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU2OSBzcXVhcmVyb290IDAuMzE2IC0+IDAuNTYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTcwIHNxdWFyZXJvb3QgMC4wMzE2IC0+IDAuMTc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTcxIHNxdWFyZXJvb3QgMC4zMTcgLT4gMC41NjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NzIgc3F1YXJlcm9vdCAwLjAzMTcgLT4gMC4xNzggIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NzMgc3F1YXJlcm9vdCAwLjMxOCAtPiAwLjU2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU3NCBzcXVhcmVyb290IDAuMDMxOCAtPiAwLjE3OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU3NSBzcXVhcmVyb290IDAuMzE5IC0+IDAuNTY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTc2IHNxdWFyZXJvb3QgMC4wMzE5IC0+IDAuMTc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTc3IHNxdWFyZXJvb3QgMC4zMjEgLT4gMC41NjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1Nzggc3F1YXJlcm9vdCAwLjAzMjEgLT4gMC4xNzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1Nzkgc3F1YXJlcm9vdCAwLjMyMiAtPiAwLjU2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU4MCBzcXVhcmVyb290IDAuMDMyMiAtPiAwLjE3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU4MSBzcXVhcmVyb290IDAuMzIzIC0+IDAuNTY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTgyIHNxdWFyZXJvb3QgMC4wMzIzIC0+IDAuMTgwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTgzIHNxdWFyZXJvb3QgMC4zMjQgLT4gMC41NjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1ODQgc3F1YXJlcm9vdCAwLjAzMjQgLT4gMC4xOAorc3F0eDM1ODUgc3F1YXJlcm9vdCAwLjMyNSAtPiAwLjU3MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU4NiBzcXVhcmVyb290IDAuMDMyNSAtPiAwLjE4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU4NyBzcXVhcmVyb290IDAuMzI2IC0+IDAuNTcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTg4IHNxdWFyZXJvb3QgMC4wMzI2IC0+IDAuMTgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTg5IHNxdWFyZXJvb3QgMC4zMjcgLT4gMC41NzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1OTAgc3F1YXJlcm9vdCAwLjAzMjcgLT4gMC4xODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1OTEgc3F1YXJlcm9vdCAwLjMyOCAtPiAwLjU3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU5MiBzcXVhcmVyb290IDAuMDMyOCAtPiAwLjE4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU5MyBzcXVhcmVyb290IDAuMzI5IC0+IDAuNTc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTk0IHNxdWFyZXJvb3QgMC4wMzI5IC0+IDAuMTgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTk1IHNxdWFyZXJvb3QgMC4zMzEgLT4gMC41NzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1OTYgc3F1YXJlcm9vdCAwLjAzMzEgLT4gMC4xODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1OTcgc3F1YXJlcm9vdCAwLjMzMiAtPiAwLjU3NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU5OCBzcXVhcmVyb290IDAuMDMzMiAtPiAwLjE4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU5OSBzcXVhcmVyb290IDAuMzMzIC0+IDAuNTc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjAwIHNxdWFyZXJvb3QgMC4wMzMzIC0+IDAuMTgyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjAxIHNxdWFyZXJvb3QgMC4zMzQgLT4gMC41NzggIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MDIgc3F1YXJlcm9vdCAwLjAzMzQgLT4gMC4xODMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MDMgc3F1YXJlcm9vdCAwLjMzNSAtPiAwLjU3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYwNCBzcXVhcmVyb290IDAuMDMzNSAtPiAwLjE4MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYwNSBzcXVhcmVyb290IDAuMzM2IC0+IDAuNTgwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjA2IHNxdWFyZXJvb3QgMC4wMzM2IC0+IDAuMTgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjA3IHNxdWFyZXJvb3QgMC4zMzcgLT4gMC41ODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MDggc3F1YXJlcm9vdCAwLjAzMzcgLT4gMC4xODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MDkgc3F1YXJlcm9vdCAwLjMzOCAtPiAwLjU4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYxMCBzcXVhcmVyb290IDAuMDMzOCAtPiAwLjE4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYxMSBzcXVhcmVyb290IDAuMzM5IC0+IDAuNTgyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjEyIHNxdWFyZXJvb3QgMC4wMzM5IC0+IDAuMTg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjEzIHNxdWFyZXJvb3QgMC4zNDEgLT4gMC41ODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MTQgc3F1YXJlcm9vdCAwLjAzNDEgLT4gMC4xODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MTUgc3F1YXJlcm9vdCAwLjM0MiAtPiAwLjU4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYxNiBzcXVhcmVyb290IDAuMDM0MiAtPiAwLjE4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYxNyBzcXVhcmVyb290IDAuMzQzIC0+IDAuNTg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjE4IHNxdWFyZXJvb3QgMC4wMzQzIC0+IDAuMTg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjE5IHNxdWFyZXJvb3QgMC4zNDQgLT4gMC41ODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MjAgc3F1YXJlcm9vdCAwLjAzNDQgLT4gMC4xODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MjEgc3F1YXJlcm9vdCAwLjM0NSAtPiAwLjU4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYyMiBzcXVhcmVyb290IDAuMDM0NSAtPiAwLjE4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYyMyBzcXVhcmVyb290IDAuMzQ2IC0+IDAuNTg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjI0IHNxdWFyZXJvb3QgMC4wMzQ2IC0+IDAuMTg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjI1IHNxdWFyZXJvb3QgMC4zNDcgLT4gMC41ODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MjYgc3F1YXJlcm9vdCAwLjAzNDcgLT4gMC4xODYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2Mjcgc3F1YXJlcm9vdCAwLjM0OCAtPiAwLjU5MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYyOCBzcXVhcmVyb290IDAuMDM0OCAtPiAwLjE4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYyOSBzcXVhcmVyb290IDAuMzQ5IC0+IDAuNTkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjMwIHNxdWFyZXJvb3QgMC4wMzQ5IC0+IDAuMTg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjMxIHNxdWFyZXJvb3QgMC4zNTEgLT4gMC41OTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MzIgc3F1YXJlcm9vdCAwLjAzNTEgLT4gMC4xODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MzMgc3F1YXJlcm9vdCAwLjM1MiAtPiAwLjU5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYzNCBzcXVhcmVyb290IDAuMDM1MiAtPiAwLjE4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYzNSBzcXVhcmVyb290IDAuMzUzIC0+IDAuNTk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjM2IHNxdWFyZXJvb3QgMC4wMzUzIC0+IDAuMTg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjM3IHNxdWFyZXJvb3QgMC4zNTQgLT4gMC41OTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2Mzggc3F1YXJlcm9vdCAwLjAzNTQgLT4gMC4xODggIEluZXhhY3QgUm91bmRlZAorc3F0eDM2Mzkgc3F1YXJlcm9vdCAwLjM1NSAtPiAwLjU5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY0MCBzcXVhcmVyb290IDAuMDM1NSAtPiAwLjE4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY0MSBzcXVhcmVyb290IDAuMzU2IC0+IDAuNTk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjQyIHNxdWFyZXJvb3QgMC4wMzU2IC0+IDAuMTg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjQzIHNxdWFyZXJvb3QgMC4zNTcgLT4gMC41OTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NDQgc3F1YXJlcm9vdCAwLjAzNTcgLT4gMC4xODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NDUgc3F1YXJlcm9vdCAwLjM1OCAtPiAwLjU5OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY0NiBzcXVhcmVyb290IDAuMDM1OCAtPiAwLjE4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY0NyBzcXVhcmVyb290IDAuMzU5IC0+IDAuNTk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjQ4IHNxdWFyZXJvb3QgMC4wMzU5IC0+IDAuMTg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjQ5IHNxdWFyZXJvb3QgMC4zNjEgLT4gMC42MDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NTAgc3F1YXJlcm9vdCAwLjAzNjEgLT4gMC4xOQorc3F0eDM2NTEgc3F1YXJlcm9vdCAwLjM2MiAtPiAwLjYwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY1MiBzcXVhcmVyb290IDAuMDM2MiAtPiAwLjE5MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY1MyBzcXVhcmVyb290IDAuMzYzIC0+IDAuNjAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjU0IHNxdWFyZXJvb3QgMC4wMzYzIC0+IDAuMTkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjU1IHNxdWFyZXJvb3QgMC4zNjQgLT4gMC42MDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NTYgc3F1YXJlcm9vdCAwLjAzNjQgLT4gMC4xOTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NTcgc3F1YXJlcm9vdCAwLjM2NSAtPiAwLjYwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY1OCBzcXVhcmVyb290IDAuMDM2NSAtPiAwLjE5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY1OSBzcXVhcmVyb290IDAuMzY2IC0+IDAuNjA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjYwIHNxdWFyZXJvb3QgMC4wMzY2IC0+IDAuMTkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjYxIHNxdWFyZXJvb3QgMC4zNjcgLT4gMC42MDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NjIgc3F1YXJlcm9vdCAwLjAzNjcgLT4gMC4xOTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NjMgc3F1YXJlcm9vdCAwLjM2OCAtPiAwLjYwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY2NCBzcXVhcmVyb290IDAuMDM2OCAtPiAwLjE5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY2NSBzcXVhcmVyb290IDAuMzY5IC0+IDAuNjA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjY2IHNxdWFyZXJvb3QgMC4wMzY5IC0+IDAuMTkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjY3IHNxdWFyZXJvb3QgMC4zNzEgLT4gMC42MDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2Njggc3F1YXJlcm9vdCAwLjAzNzEgLT4gMC4xOTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2Njkgc3F1YXJlcm9vdCAwLjM3MiAtPiAwLjYxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY3MCBzcXVhcmVyb290IDAuMDM3MiAtPiAwLjE5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY3MSBzcXVhcmVyb290IDAuMzczIC0+IDAuNjExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjcyIHNxdWFyZXJvb3QgMC4wMzczIC0+IDAuMTkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjczIHNxdWFyZXJvb3QgMC4zNzQgLT4gMC42MTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NzQgc3F1YXJlcm9vdCAwLjAzNzQgLT4gMC4xOTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NzUgc3F1YXJlcm9vdCAwLjM3NSAtPiAwLjYxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY3NiBzcXVhcmVyb290IDAuMDM3NSAtPiAwLjE5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY3NyBzcXVhcmVyb290IDAuMzc2IC0+IDAuNjEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjc4IHNxdWFyZXJvb3QgMC4wMzc2IC0+IDAuMTk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjc5IHNxdWFyZXJvb3QgMC4zNzcgLT4gMC42MTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2ODAgc3F1YXJlcm9vdCAwLjAzNzcgLT4gMC4xOTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2ODEgc3F1YXJlcm9vdCAwLjM3OCAtPiAwLjYxNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY4MiBzcXVhcmVyb290IDAuMDM3OCAtPiAwLjE5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY4MyBzcXVhcmVyb290IDAuMzc5IC0+IDAuNjE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjg0IHNxdWFyZXJvb3QgMC4wMzc5IC0+IDAuMTk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjg1IHNxdWFyZXJvb3QgMC4zODEgLT4gMC42MTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2ODYgc3F1YXJlcm9vdCAwLjAzODEgLT4gMC4xOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2ODcgc3F1YXJlcm9vdCAwLjM4MiAtPiAwLjYxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY4OCBzcXVhcmVyb290IDAuMDM4MiAtPiAwLjE5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY4OSBzcXVhcmVyb290IDAuMzgzIC0+IDAuNjE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjkwIHNxdWFyZXJvb3QgMC4wMzgzIC0+IDAuMTk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjkxIHNxdWFyZXJvb3QgMC4zODQgLT4gMC42MjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2OTIgc3F1YXJlcm9vdCAwLjAzODQgLT4gMC4xOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2OTMgc3F1YXJlcm9vdCAwLjM4NSAtPiAwLjYyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY5NCBzcXVhcmVyb290IDAuMDM4NSAtPiAwLjE5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY5NSBzcXVhcmVyb290IDAuMzg2IC0+IDAuNjIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjk2IHNxdWFyZXJvb3QgMC4wMzg2IC0+IDAuMTk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjk3IHNxdWFyZXJvb3QgMC4zODcgLT4gMC42MjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2OTggc3F1YXJlcm9vdCAwLjAzODcgLT4gMC4xOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2OTkgc3F1YXJlcm9vdCAwLjM4OCAtPiAwLjYyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcwMCBzcXVhcmVyb290IDAuMDM4OCAtPiAwLjE5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcwMSBzcXVhcmVyb290IDAuMzg5IC0+IDAuNjI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzAyIHNxdWFyZXJvb3QgMC4wMzg5IC0+IDAuMTk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzAzIHNxdWFyZXJvb3QgMC4zOTEgLT4gMC42MjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MDQgc3F1YXJlcm9vdCAwLjAzOTEgLT4gMC4xOTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MDUgc3F1YXJlcm9vdCAwLjM5MiAtPiAwLjYyNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcwNiBzcXVhcmVyb290IDAuMDM5MiAtPiAwLjE5OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcwNyBzcXVhcmVyb290IDAuMzkzIC0+IDAuNjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzA4IHNxdWFyZXJvb3QgMC4wMzkzIC0+IDAuMTk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzA5IHNxdWFyZXJvb3QgMC4zOTQgLT4gMC42MjggIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MTAgc3F1YXJlcm9vdCAwLjAzOTQgLT4gMC4xOTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MTEgc3F1YXJlcm9vdCAwLjM5NSAtPiAwLjYyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcxMiBzcXVhcmVyb290IDAuMDM5NSAtPiAwLjE5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcxMyBzcXVhcmVyb290IDAuMzk2IC0+IDAuNjI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzE0IHNxdWFyZXJvb3QgMC4wMzk2IC0+IDAuMTk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzE1IHNxdWFyZXJvb3QgMC4zOTcgLT4gMC42MzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MTYgc3F1YXJlcm9vdCAwLjAzOTcgLT4gMC4xOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MTcgc3F1YXJlcm9vdCAwLjM5OCAtPiAwLjYzMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcxOCBzcXVhcmVyb290IDAuMDM5OCAtPiAwLjE5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcxOSBzcXVhcmVyb290IDAuMzk5IC0+IDAuNjMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzIwIHNxdWFyZXJvb3QgMC4wMzk5IC0+IDAuMjAwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzIxIHNxdWFyZXJvb3QgMC40MDEgLT4gMC42MzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MjIgc3F1YXJlcm9vdCAwLjA0MDEgLT4gMC4yMDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MjMgc3F1YXJlcm9vdCAwLjQwMiAtPiAwLjYzNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcyNCBzcXVhcmVyb290IDAuMDQwMiAtPiAwLjIwMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcyNSBzcXVhcmVyb290IDAuNDAzIC0+IDAuNjM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzI2IHNxdWFyZXJvb3QgMC4wNDAzIC0+IDAuMjAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzI3IHNxdWFyZXJvb3QgMC40MDQgLT4gMC42MzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3Mjggc3F1YXJlcm9vdCAwLjA0MDQgLT4gMC4yMDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3Mjkgc3F1YXJlcm9vdCAwLjQwNSAtPiAwLjYzNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzczMCBzcXVhcmVyb290IDAuMDQwNSAtPiAwLjIwMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzczMSBzcXVhcmVyb290IDAuNDA2IC0+IDAuNjM3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzMyIHNxdWFyZXJvb3QgMC4wNDA2IC0+IDAuMjAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzMzIHNxdWFyZXJvb3QgMC40MDcgLT4gMC42MzggIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MzQgc3F1YXJlcm9vdCAwLjA0MDcgLT4gMC4yMDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MzUgc3F1YXJlcm9vdCAwLjQwOCAtPiAwLjYzOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzczNiBzcXVhcmVyb290IDAuMDQwOCAtPiAwLjIwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzczNyBzcXVhcmVyb290IDAuNDA5IC0+IDAuNjQwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzM4IHNxdWFyZXJvb3QgMC4wNDA5IC0+IDAuMjAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzM5IHNxdWFyZXJvb3QgMC40MTEgLT4gMC42NDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NDAgc3F1YXJlcm9vdCAwLjA0MTEgLT4gMC4yMDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NDEgc3F1YXJlcm9vdCAwLjQxMiAtPiAwLjY0MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc0MiBzcXVhcmVyb290IDAuMDQxMiAtPiAwLjIwMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc0MyBzcXVhcmVyb290IDAuNDEzIC0+IDAuNjQzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzQ0IHNxdWFyZXJvb3QgMC4wNDEzIC0+IDAuMjAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzQ1IHNxdWFyZXJvb3QgMC40MTQgLT4gMC42NDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NDYgc3F1YXJlcm9vdCAwLjA0MTQgLT4gMC4yMDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NDcgc3F1YXJlcm9vdCAwLjQxNSAtPiAwLjY0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc0OCBzcXVhcmVyb290IDAuMDQxNSAtPiAwLjIwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc0OSBzcXVhcmVyb290IDAuNDE2IC0+IDAuNjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzUwIHNxdWFyZXJvb3QgMC4wNDE2IC0+IDAuMjA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzUxIHNxdWFyZXJvb3QgMC40MTcgLT4gMC42NDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NTIgc3F1YXJlcm9vdCAwLjA0MTcgLT4gMC4yMDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NTMgc3F1YXJlcm9vdCAwLjQxOCAtPiAwLjY0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc1NCBzcXVhcmVyb290IDAuMDQxOCAtPiAwLjIwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc1NSBzcXVhcmVyb290IDAuNDE5IC0+IDAuNjQ3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzU2IHNxdWFyZXJvb3QgMC4wNDE5IC0+IDAuMjA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzU3IHNxdWFyZXJvb3QgMC40MjEgLT4gMC42NDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NTggc3F1YXJlcm9vdCAwLjA0MjEgLT4gMC4yMDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NTkgc3F1YXJlcm9vdCAwLjQyMiAtPiAwLjY1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc2MCBzcXVhcmVyb290IDAuMDQyMiAtPiAwLjIwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc2MSBzcXVhcmVyb290IDAuNDIzIC0+IDAuNjUwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzYyIHNxdWFyZXJvb3QgMC4wNDIzIC0+IDAuMjA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzYzIHNxdWFyZXJvb3QgMC40MjQgLT4gMC42NTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NjQgc3F1YXJlcm9vdCAwLjA0MjQgLT4gMC4yMDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NjUgc3F1YXJlcm9vdCAwLjQyNSAtPiAwLjY1MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc2NiBzcXVhcmVyb290IDAuMDQyNSAtPiAwLjIwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc2NyBzcXVhcmVyb290IDAuNDI2IC0+IDAuNjUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzY4IHNxdWFyZXJvb3QgMC4wNDI2IC0+IDAuMjA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzY5IHNxdWFyZXJvb3QgMC40MjcgLT4gMC42NTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NzAgc3F1YXJlcm9vdCAwLjA0MjcgLT4gMC4yMDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NzEgc3F1YXJlcm9vdCAwLjQyOCAtPiAwLjY1NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc3MiBzcXVhcmVyb290IDAuMDQyOCAtPiAwLjIwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc3MyBzcXVhcmVyb290IDAuNDI5IC0+IDAuNjU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzc0IHNxdWFyZXJvb3QgMC4wNDI5IC0+IDAuMjA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzc1IHNxdWFyZXJvb3QgMC40MzEgLT4gMC42NTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NzYgc3F1YXJlcm9vdCAwLjA0MzEgLT4gMC4yMDggIEluZXhhY3QgUm91bmRlZAorc3F0eDM3Nzcgc3F1YXJlcm9vdCAwLjQzMiAtPiAwLjY1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc3OCBzcXVhcmVyb290IDAuMDQzMiAtPiAwLjIwOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc3OSBzcXVhcmVyb290IDAuNDMzIC0+IDAuNjU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzgwIHNxdWFyZXJvb3QgMC4wNDMzIC0+IDAuMjA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzgxIHNxdWFyZXJvb3QgMC40MzQgLT4gMC42NTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3ODIgc3F1YXJlcm9vdCAwLjA0MzQgLT4gMC4yMDggIEluZXhhY3QgUm91bmRlZAorc3F0eDM3ODMgc3F1YXJlcm9vdCAwLjQzNSAtPiAwLjY2MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc4NCBzcXVhcmVyb290IDAuMDQzNSAtPiAwLjIwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc4NSBzcXVhcmVyb290IDAuNDM2IC0+IDAuNjYwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzg2IHNxdWFyZXJvb3QgMC4wNDM2IC0+IDAuMjA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzg3IHNxdWFyZXJvb3QgMC40MzcgLT4gMC42NjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3ODggc3F1YXJlcm9vdCAwLjA0MzcgLT4gMC4yMDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3ODkgc3F1YXJlcm9vdCAwLjQzOCAtPiAwLjY2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc5MCBzcXVhcmVyb290IDAuMDQzOCAtPiAwLjIwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc5MSBzcXVhcmVyb290IDAuNDM5IC0+IDAuNjYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzkyIHNxdWFyZXJvb3QgMC4wNDM5IC0+IDAuMjEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzkzIHNxdWFyZXJvb3QgMC40NDEgLT4gMC42NjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3OTQgc3F1YXJlcm9vdCAwLjA0NDEgLT4gMC4yMQorc3F0eDM3OTUgc3F1YXJlcm9vdCAwLjQ0MiAtPiAwLjY2NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc5NiBzcXVhcmVyb290IDAuMDQ0MiAtPiAwLjIxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc5NyBzcXVhcmVyb290IDAuNDQzIC0+IDAuNjY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzk4IHNxdWFyZXJvb3QgMC4wNDQzIC0+IDAuMjEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzk5IHNxdWFyZXJvb3QgMC40NDQgLT4gMC42NjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MDAgc3F1YXJlcm9vdCAwLjA0NDQgLT4gMC4yMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MDEgc3F1YXJlcm9vdCAwLjQ0NSAtPiAwLjY2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgwMiBzcXVhcmVyb290IDAuMDQ0NSAtPiAwLjIxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgwMyBzcXVhcmVyb290IDAuNDQ2IC0+IDAuNjY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODA0IHNxdWFyZXJvb3QgMC4wNDQ2IC0+IDAuMjExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODA1IHNxdWFyZXJvb3QgMC40NDcgLT4gMC42NjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MDYgc3F1YXJlcm9vdCAwLjA0NDcgLT4gMC4yMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MDcgc3F1YXJlcm9vdCAwLjQ0OCAtPiAwLjY2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgwOCBzcXVhcmVyb290IDAuMDQ0OCAtPiAwLjIxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgwOSBzcXVhcmVyb290IDAuNDQ5IC0+IDAuNjcwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODEwIHNxdWFyZXJvb3QgMC4wNDQ5IC0+IDAuMjEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODExIHNxdWFyZXJvb3QgMC40NTEgLT4gMC42NzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MTIgc3F1YXJlcm9vdCAwLjA0NTEgLT4gMC4yMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MTMgc3F1YXJlcm9vdCAwLjQ1MiAtPiAwLjY3MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgxNCBzcXVhcmVyb290IDAuMDQ1MiAtPiAwLjIxMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgxNSBzcXVhcmVyb290IDAuNDUzIC0+IDAuNjczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODE2IHNxdWFyZXJvb3QgMC4wNDUzIC0+IDAuMjEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODE3IHNxdWFyZXJvb3QgMC40NTQgLT4gMC42NzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MTggc3F1YXJlcm9vdCAwLjA0NTQgLT4gMC4yMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MTkgc3F1YXJlcm9vdCAwLjQ1NSAtPiAwLjY3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgyMCBzcXVhcmVyb290IDAuMDQ1NSAtPiAwLjIxMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgyMSBzcXVhcmVyb290IDAuNDU2IC0+IDAuNjc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODIyIHNxdWFyZXJvb3QgMC4wNDU2IC0+IDAuMjE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODIzIHNxdWFyZXJvb3QgMC40NTcgLT4gMC42NzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MjQgc3F1YXJlcm9vdCAwLjA0NTcgLT4gMC4yMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MjUgc3F1YXJlcm9vdCAwLjQ1OCAtPiAwLjY3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgyNiBzcXVhcmVyb290IDAuMDQ1OCAtPiAwLjIxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgyNyBzcXVhcmVyb290IDAuNDU5IC0+IDAuNjc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODI4IHNxdWFyZXJvb3QgMC4wNDU5IC0+IDAuMjE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODI5IHNxdWFyZXJvb3QgMC40NjEgLT4gMC42NzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MzAgc3F1YXJlcm9vdCAwLjA0NjEgLT4gMC4yMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MzEgc3F1YXJlcm9vdCAwLjQ2MiAtPiAwLjY4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgzMiBzcXVhcmVyb290IDAuMDQ2MiAtPiAwLjIxNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgzMyBzcXVhcmVyb290IDAuNDYzIC0+IDAuNjgwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODM0IHNxdWFyZXJvb3QgMC4wNDYzIC0+IDAuMjE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODM1IHNxdWFyZXJvb3QgMC40NjQgLT4gMC42ODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MzYgc3F1YXJlcm9vdCAwLjA0NjQgLT4gMC4yMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4Mzcgc3F1YXJlcm9vdCAwLjQ2NSAtPiAwLjY4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgzOCBzcXVhcmVyb290IDAuMDQ2NSAtPiAwLjIxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgzOSBzcXVhcmVyb290IDAuNDY2IC0+IDAuNjgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODQwIHNxdWFyZXJvb3QgMC4wNDY2IC0+IDAuMjE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODQxIHNxdWFyZXJvb3QgMC40NjcgLT4gMC42ODMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NDIgc3F1YXJlcm9vdCAwLjA0NjcgLT4gMC4yMTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NDMgc3F1YXJlcm9vdCAwLjQ2OCAtPiAwLjY4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg0NCBzcXVhcmVyb290IDAuMDQ2OCAtPiAwLjIxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg0NSBzcXVhcmVyb290IDAuNDY5IC0+IDAuNjg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODQ2IHNxdWFyZXJvb3QgMC4wNDY5IC0+IDAuMjE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODQ3IHNxdWFyZXJvb3QgMC40NzEgLT4gMC42ODYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NDggc3F1YXJlcm9vdCAwLjA0NzEgLT4gMC4yMTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NDkgc3F1YXJlcm9vdCAwLjQ3MiAtPiAwLjY4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg1MCBzcXVhcmVyb290IDAuMDQ3MiAtPiAwLjIxNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg1MSBzcXVhcmVyb290IDAuNDczIC0+IDAuNjg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODUyIHNxdWFyZXJvb3QgMC4wNDczIC0+IDAuMjE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODUzIHNxdWFyZXJvb3QgMC40NzQgLT4gMC42ODggIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NTQgc3F1YXJlcm9vdCAwLjA0NzQgLT4gMC4yMTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NTUgc3F1YXJlcm9vdCAwLjQ3NSAtPiAwLjY4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg1NiBzcXVhcmVyb290IDAuMDQ3NSAtPiAwLjIxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg1NyBzcXVhcmVyb290IDAuNDc2IC0+IDAuNjkwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODU4IHNxdWFyZXJvb3QgMC4wNDc2IC0+IDAuMjE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODU5IHNxdWFyZXJvb3QgMC40NzcgLT4gMC42OTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NjAgc3F1YXJlcm9vdCAwLjA0NzcgLT4gMC4yMTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NjEgc3F1YXJlcm9vdCAwLjQ3OCAtPiAwLjY5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg2MiBzcXVhcmVyb290IDAuMDQ3OCAtPiAwLjIxOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg2MyBzcXVhcmVyb290IDAuNDc5IC0+IDAuNjkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODY0IHNxdWFyZXJvb3QgMC4wNDc5IC0+IDAuMjE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODY1IHNxdWFyZXJvb3QgMC40ODEgLT4gMC42OTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NjYgc3F1YXJlcm9vdCAwLjA0ODEgLT4gMC4yMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4Njcgc3F1YXJlcm9vdCAwLjQ4MiAtPiAwLjY5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg2OCBzcXVhcmVyb290IDAuMDQ4MiAtPiAwLjIyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg2OSBzcXVhcmVyb290IDAuNDgzIC0+IDAuNjk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODcwIHNxdWFyZXJvb3QgMC4wNDgzIC0+IDAuMjIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODcxIHNxdWFyZXJvb3QgMC40ODQgLT4gMC42OTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NzIgc3F1YXJlcm9vdCAwLjA0ODQgLT4gMC4yMgorc3F0eDM4NzMgc3F1YXJlcm9vdCAwLjQ4NSAtPiAwLjY5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg3NCBzcXVhcmVyb290IDAuMDQ4NSAtPiAwLjIyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg3NSBzcXVhcmVyb290IDAuNDg2IC0+IDAuNjk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODc2IHNxdWFyZXJvb3QgMC4wNDg2IC0+IDAuMjIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODc3IHNxdWFyZXJvb3QgMC40ODcgLT4gMC42OTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM4Nzggc3F1YXJlcm9vdCAwLjA0ODcgLT4gMC4yMjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4Nzkgc3F1YXJlcm9vdCAwLjQ4OCAtPiAwLjY5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg4MCBzcXVhcmVyb290IDAuMDQ4OCAtPiAwLjIyMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg4MSBzcXVhcmVyb290IDAuNDg5IC0+IDAuNjk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODgyIHNxdWFyZXJvb3QgMC4wNDg5IC0+IDAuMjIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODgzIHNxdWFyZXJvb3QgMC40OTEgLT4gMC43MDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4ODQgc3F1YXJlcm9vdCAwLjA0OTEgLT4gMC4yMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4ODUgc3F1YXJlcm9vdCAwLjQ5MiAtPiAwLjcwMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg4NiBzcXVhcmVyb290IDAuMDQ5MiAtPiAwLjIyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg4NyBzcXVhcmVyb290IDAuNDkzIC0+IDAuNzAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODg4IHNxdWFyZXJvb3QgMC4wNDkzIC0+IDAuMjIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODg5IHNxdWFyZXJvb3QgMC40OTQgLT4gMC43MDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4OTAgc3F1YXJlcm9vdCAwLjA0OTQgLT4gMC4yMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4OTEgc3F1YXJlcm9vdCAwLjQ5NSAtPiAwLjcwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg5MiBzcXVhcmVyb290IDAuMDQ5NSAtPiAwLjIyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg5MyBzcXVhcmVyb290IDAuNDk2IC0+IDAuNzA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODk0IHNxdWFyZXJvb3QgMC4wNDk2IC0+IDAuMjIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODk1IHNxdWFyZXJvb3QgMC40OTcgLT4gMC43MDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4OTYgc3F1YXJlcm9vdCAwLjA0OTcgLT4gMC4yMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4OTcgc3F1YXJlcm9vdCAwLjQ5OCAtPiAwLjcwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg5OCBzcXVhcmVyb290IDAuMDQ5OCAtPiAwLjIyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg5OSBzcXVhcmVyb290IDAuNDk5IC0+IDAuNzA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTAwIHNxdWFyZXJvb3QgMC4wNDk5IC0+IDAuMjIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTAxIHNxdWFyZXJvb3QgMC41MDEgLT4gMC43MDggIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MDIgc3F1YXJlcm9vdCAwLjA1MDEgLT4gMC4yMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MDMgc3F1YXJlcm9vdCAwLjUwMiAtPiAwLjcwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkwNCBzcXVhcmVyb290IDAuMDUwMiAtPiAwLjIyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkwNSBzcXVhcmVyb290IDAuNTAzIC0+IDAuNzA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTA2IHNxdWFyZXJvb3QgMC4wNTAzIC0+IDAuMjI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTA3IHNxdWFyZXJvb3QgMC41MDQgLT4gMC43MTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MDggc3F1YXJlcm9vdCAwLjA1MDQgLT4gMC4yMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MDkgc3F1YXJlcm9vdCAwLjUwNSAtPiAwLjcxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkxMCBzcXVhcmVyb290IDAuMDUwNSAtPiAwLjIyNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkxMSBzcXVhcmVyb290IDAuNTA2IC0+IDAuNzExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTEyIHNxdWFyZXJvb3QgMC4wNTA2IC0+IDAuMjI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTEzIHNxdWFyZXJvb3QgMC41MDcgLT4gMC43MTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MTQgc3F1YXJlcm9vdCAwLjA1MDcgLT4gMC4yMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MTUgc3F1YXJlcm9vdCAwLjUwOCAtPiAwLjcxMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkxNiBzcXVhcmVyb290IDAuMDUwOCAtPiAwLjIyNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkxNyBzcXVhcmVyb290IDAuNTA5IC0+IDAuNzEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTE4IHNxdWFyZXJvb3QgMC4wNTA5IC0+IDAuMjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTE5IHNxdWFyZXJvb3QgMC41MTEgLT4gMC43MTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MjAgc3F1YXJlcm9vdCAwLjA1MTEgLT4gMC4yMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MjEgc3F1YXJlcm9vdCAwLjUxMiAtPiAwLjcxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkyMiBzcXVhcmVyb290IDAuMDUxMiAtPiAwLjIyNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkyMyBzcXVhcmVyb290IDAuNTEzIC0+IDAuNzE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTI0IHNxdWFyZXJvb3QgMC4wNTEzIC0+IDAuMjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTI1IHNxdWFyZXJvb3QgMC41MTQgLT4gMC43MTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MjYgc3F1YXJlcm9vdCAwLjA1MTQgLT4gMC4yMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5Mjcgc3F1YXJlcm9vdCAwLjUxNSAtPiAwLjcxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkyOCBzcXVhcmVyb290IDAuMDUxNSAtPiAwLjIyNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkyOSBzcXVhcmVyb290IDAuNTE2IC0+IDAuNzE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTMwIHNxdWFyZXJvb3QgMC4wNTE2IC0+IDAuMjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTMxIHNxdWFyZXJvb3QgMC41MTcgLT4gMC43MTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MzIgc3F1YXJlcm9vdCAwLjA1MTcgLT4gMC4yMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MzMgc3F1YXJlcm9vdCAwLjUxOCAtPiAwLjcyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkzNCBzcXVhcmVyb290IDAuMDUxOCAtPiAwLjIyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkzNSBzcXVhcmVyb290IDAuNTE5IC0+IDAuNzIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTM2IHNxdWFyZXJvb3QgMC4wNTE5IC0+IDAuMjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTM3IHNxdWFyZXJvb3QgMC41MjEgLT4gMC43MjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5Mzggc3F1YXJlcm9vdCAwLjA1MjEgLT4gMC4yMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDM5Mzkgc3F1YXJlcm9vdCAwLjUyMiAtPiAwLjcyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk0MCBzcXVhcmVyb290IDAuMDUyMiAtPiAwLjIyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk0MSBzcXVhcmVyb290IDAuNTIzIC0+IDAuNzIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTQyIHNxdWFyZXJvb3QgMC4wNTIzIC0+IDAuMjI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTQzIHNxdWFyZXJvb3QgMC41MjQgLT4gMC43MjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NDQgc3F1YXJlcm9vdCAwLjA1MjQgLT4gMC4yMjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NDUgc3F1YXJlcm9vdCAwLjUyNSAtPiAwLjcyNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk0NiBzcXVhcmVyb290IDAuMDUyNSAtPiAwLjIyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk0NyBzcXVhcmVyb290IDAuNTI2IC0+IDAuNzI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTQ4IHNxdWFyZXJvb3QgMC4wNTI2IC0+IDAuMjI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTQ5IHNxdWFyZXJvb3QgMC41MjcgLT4gMC43MjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NTAgc3F1YXJlcm9vdCAwLjA1MjcgLT4gMC4yMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NTEgc3F1YXJlcm9vdCAwLjUyOCAtPiAwLjcyNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk1MiBzcXVhcmVyb290IDAuMDUyOCAtPiAwLjIzMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk1MyBzcXVhcmVyb290IDAuNTI5IC0+IDAuNzI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTU0IHNxdWFyZXJvb3QgMC4wNTI5IC0+IDAuMjMKK3NxdHgzOTU1IHNxdWFyZXJvb3QgMC41MzEgLT4gMC43MjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NTYgc3F1YXJlcm9vdCAwLjA1MzEgLT4gMC4yMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NTcgc3F1YXJlcm9vdCAwLjUzMiAtPiAwLjcyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk1OCBzcXVhcmVyb290IDAuMDUzMiAtPiAwLjIzMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk1OSBzcXVhcmVyb290IDAuNTMzIC0+IDAuNzMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTYwIHNxdWFyZXJvb3QgMC4wNTMzIC0+IDAuMjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTYxIHNxdWFyZXJvb3QgMC41MzQgLT4gMC43MzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NjIgc3F1YXJlcm9vdCAwLjA1MzQgLT4gMC4yMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NjMgc3F1YXJlcm9vdCAwLjUzNSAtPiAwLjczMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk2NCBzcXVhcmVyb290IDAuMDUzNSAtPiAwLjIzMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk2NSBzcXVhcmVyb290IDAuNTM2IC0+IDAuNzMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTY2IHNxdWFyZXJvb3QgMC4wNTM2IC0+IDAuMjMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTY3IHNxdWFyZXJvb3QgMC41MzcgLT4gMC43MzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5Njggc3F1YXJlcm9vdCAwLjA1MzcgLT4gMC4yMzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5Njkgc3F1YXJlcm9vdCAwLjUzOCAtPiAwLjczMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk3MCBzcXVhcmVyb290IDAuMDUzOCAtPiAwLjIzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk3MSBzcXVhcmVyb290IDAuNTM5IC0+IDAuNzM0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTcyIHNxdWFyZXJvb3QgMC4wNTM5IC0+IDAuMjMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTczIHNxdWFyZXJvb3QgMC41NDEgLT4gMC43MzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NzQgc3F1YXJlcm9vdCAwLjA1NDEgLT4gMC4yMzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NzUgc3F1YXJlcm9vdCAwLjU0MiAtPiAwLjczNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk3NiBzcXVhcmVyb290IDAuMDU0MiAtPiAwLjIzMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk3NyBzcXVhcmVyb290IDAuNTQzIC0+IDAuNzM3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTc4IHNxdWFyZXJvb3QgMC4wNTQzIC0+IDAuMjMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTc5IHNxdWFyZXJvb3QgMC41NDQgLT4gMC43MzggIEluZXhhY3QgUm91bmRlZAorc3F0eDM5ODAgc3F1YXJlcm9vdCAwLjA1NDQgLT4gMC4yMzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5ODEgc3F1YXJlcm9vdCAwLjU0NSAtPiAwLjczOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk4MiBzcXVhcmVyb290IDAuMDU0NSAtPiAwLjIzMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk4MyBzcXVhcmVyb290IDAuNTQ2IC0+IDAuNzM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTg0IHNxdWFyZXJvb3QgMC4wNTQ2IC0+IDAuMjM0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTg1IHNxdWFyZXJvb3QgMC41NDcgLT4gMC43NDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5ODYgc3F1YXJlcm9vdCAwLjA1NDcgLT4gMC4yMzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5ODcgc3F1YXJlcm9vdCAwLjU0OCAtPiAwLjc0MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk4OCBzcXVhcmVyb290IDAuMDU0OCAtPiAwLjIzNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk4OSBzcXVhcmVyb290IDAuNTQ5IC0+IDAuNzQxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTkwIHNxdWFyZXJvb3QgMC4wNTQ5IC0+IDAuMjM0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTkxIHNxdWFyZXJvb3QgMC41NTEgLT4gMC43NDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5OTIgc3F1YXJlcm9vdCAwLjA1NTEgLT4gMC4yMzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5OTMgc3F1YXJlcm9vdCAwLjU1MiAtPiAwLjc0MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk5NCBzcXVhcmVyb290IDAuMDU1MiAtPiAwLjIzNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk5NSBzcXVhcmVyb290IDAuNTUzIC0+IDAuNzQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTk2IHNxdWFyZXJvb3QgMC4wNTUzIC0+IDAuMjM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTk3IHNxdWFyZXJvb3QgMC41NTQgLT4gMC43NDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5OTggc3F1YXJlcm9vdCAwLjA1NTQgLT4gMC4yMzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5OTkgc3F1YXJlcm9vdCAwLjU1NSAtPiAwLjc0NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAwMCBzcXVhcmVyb290IDAuMDU1NSAtPiAwLjIzNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAwMSBzcXVhcmVyb290IDAuNTU2IC0+IDAuNzQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDAyIHNxdWFyZXJvb3QgMC4wNTU2IC0+IDAuMjM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDAzIHNxdWFyZXJvb3QgMC41NTcgLT4gMC43NDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMDQgc3F1YXJlcm9vdCAwLjA1NTcgLT4gMC4yMzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMDUgc3F1YXJlcm9vdCAwLjU1OCAtPiAwLjc0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAwNiBzcXVhcmVyb290IDAuMDU1OCAtPiAwLjIzNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAwNyBzcXVhcmVyb290IDAuNTU5IC0+IDAuNzQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDA4IHNxdWFyZXJvb3QgMC4wNTU5IC0+IDAuMjM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDA5IHNxdWFyZXJvb3QgMC41NjEgLT4gMC43NDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMTAgc3F1YXJlcm9vdCAwLjA1NjEgLT4gMC4yMzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMTEgc3F1YXJlcm9vdCAwLjU2MiAtPiAwLjc1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAxMiBzcXVhcmVyb290IDAuMDU2MiAtPiAwLjIzNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAxMyBzcXVhcmVyb290IDAuNTYzIC0+IDAuNzUwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDE0IHNxdWFyZXJvb3QgMC4wNTYzIC0+IDAuMjM3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDE1IHNxdWFyZXJvb3QgMC41NjQgLT4gMC43NTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMTYgc3F1YXJlcm9vdCAwLjA1NjQgLT4gMC4yMzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMTcgc3F1YXJlcm9vdCAwLjU2NSAtPiAwLjc1MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAxOCBzcXVhcmVyb290IDAuMDU2NSAtPiAwLjIzOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAxOSBzcXVhcmVyb290IDAuNTY2IC0+IDAuNzUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDIwIHNxdWFyZXJvb3QgMC4wNTY2IC0+IDAuMjM4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDIxIHNxdWFyZXJvb3QgMC41NjcgLT4gMC43NTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMjIgc3F1YXJlcm9vdCAwLjA1NjcgLT4gMC4yMzggIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMjMgc3F1YXJlcm9vdCAwLjU2OCAtPiAwLjc1NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAyNCBzcXVhcmVyb290IDAuMDU2OCAtPiAwLjIzOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAyNSBzcXVhcmVyb290IDAuNTY5IC0+IDAuNzU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDI2IHNxdWFyZXJvb3QgMC4wNTY5IC0+IDAuMjM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDI3IHNxdWFyZXJvb3QgMC41NzEgLT4gMC43NTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMjggc3F1YXJlcm9vdCAwLjA1NzEgLT4gMC4yMzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMjkgc3F1YXJlcm9vdCAwLjU3MiAtPiAwLjc1NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAzMCBzcXVhcmVyb290IDAuMDU3MiAtPiAwLjIzOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAzMSBzcXVhcmVyb290IDAuNTczIC0+IDAuNzU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDMyIHNxdWFyZXJvb3QgMC4wNTczIC0+IDAuMjM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDMzIHNxdWFyZXJvb3QgMC41NzQgLT4gMC43NTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMzQgc3F1YXJlcm9vdCAwLjA1NzQgLT4gMC4yNDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMzUgc3F1YXJlcm9vdCAwLjU3NSAtPiAwLjc1OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAzNiBzcXVhcmVyb290IDAuMDU3NSAtPiAwLjI0MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAzNyBzcXVhcmVyb290IDAuNTc2IC0+IDAuNzU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDM4IHNxdWFyZXJvb3QgMC4wNTc2IC0+IDAuMjQKK3NxdHg0MDM5IHNxdWFyZXJvb3QgMC41NzcgLT4gMC43NjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNDAgc3F1YXJlcm9vdCAwLjA1NzcgLT4gMC4yNDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNDEgc3F1YXJlcm9vdCAwLjU3OCAtPiAwLjc2MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA0MiBzcXVhcmVyb290IDAuMDU3OCAtPiAwLjI0MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA0MyBzcXVhcmVyb290IDAuNTc5IC0+IDAuNzYxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDQ0IHNxdWFyZXJvb3QgMC4wNTc5IC0+IDAuMjQxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDQ1IHNxdWFyZXJvb3QgMC41ODEgLT4gMC43NjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNDYgc3F1YXJlcm9vdCAwLjA1ODEgLT4gMC4yNDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNDcgc3F1YXJlcm9vdCAwLjU4MiAtPiAwLjc2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA0OCBzcXVhcmVyb290IDAuMDU4MiAtPiAwLjI0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA0OSBzcXVhcmVyb290IDAuNTgzIC0+IDAuNzY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDUwIHNxdWFyZXJvb3QgMC4wNTgzIC0+IDAuMjQxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDUxIHNxdWFyZXJvb3QgMC41ODQgLT4gMC43NjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNTIgc3F1YXJlcm9vdCAwLjA1ODQgLT4gMC4yNDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNTMgc3F1YXJlcm9vdCAwLjU4NSAtPiAwLjc2NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA1NCBzcXVhcmVyb290IDAuMDU4NSAtPiAwLjI0MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA1NSBzcXVhcmVyb290IDAuNTg2IC0+IDAuNzY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDU2IHNxdWFyZXJvb3QgMC4wNTg2IC0+IDAuMjQyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDU3IHNxdWFyZXJvb3QgMC41ODcgLT4gMC43NjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNTggc3F1YXJlcm9vdCAwLjA1ODcgLT4gMC4yNDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNTkgc3F1YXJlcm9vdCAwLjU4OCAtPiAwLjc2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA2MCBzcXVhcmVyb290IDAuMDU4OCAtPiAwLjI0MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA2MSBzcXVhcmVyb290IDAuNTg5IC0+IDAuNzY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDYyIHNxdWFyZXJvb3QgMC4wNTg5IC0+IDAuMjQzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDYzIHNxdWFyZXJvb3QgMC41OTEgLT4gMC43NjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNjQgc3F1YXJlcm9vdCAwLjA1OTEgLT4gMC4yNDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNjUgc3F1YXJlcm9vdCAwLjU5MiAtPiAwLjc2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA2NiBzcXVhcmVyb290IDAuMDU5MiAtPiAwLjI0MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA2NyBzcXVhcmVyb290IDAuNTkzIC0+IDAuNzcwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDY4IHNxdWFyZXJvb3QgMC4wNTkzIC0+IDAuMjQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDY5IHNxdWFyZXJvb3QgMC41OTQgLT4gMC43NzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNzAgc3F1YXJlcm9vdCAwLjA1OTQgLT4gMC4yNDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNzEgc3F1YXJlcm9vdCAwLjU5NSAtPiAwLjc3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA3MiBzcXVhcmVyb290IDAuMDU5NSAtPiAwLjI0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA3MyBzcXVhcmVyb290IDAuNTk2IC0+IDAuNzcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDc0IHNxdWFyZXJvb3QgMC4wNTk2IC0+IDAuMjQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDc1IHNxdWFyZXJvb3QgMC41OTcgLT4gMC43NzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNzYgc3F1YXJlcm9vdCAwLjA1OTcgLT4gMC4yNDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNzcgc3F1YXJlcm9vdCAwLjU5OCAtPiAwLjc3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA3OCBzcXVhcmVyb290IDAuMDU5OCAtPiAwLjI0NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA3OSBzcXVhcmVyb290IDAuNTk5IC0+IDAuNzc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDgwIHNxdWFyZXJvb3QgMC4wNTk5IC0+IDAuMjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDgxIHNxdWFyZXJvb3QgMC42MDEgLT4gMC43NzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwODIgc3F1YXJlcm9vdCAwLjA2MDEgLT4gMC4yNDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwODMgc3F1YXJlcm9vdCAwLjYwMiAtPiAwLjc3NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA4NCBzcXVhcmVyb290IDAuMDYwMiAtPiAwLjI0NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA4NSBzcXVhcmVyb290IDAuNjAzIC0+IDAuNzc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDg2IHNxdWFyZXJvb3QgMC4wNjAzIC0+IDAuMjQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDg3IHNxdWFyZXJvb3QgMC42MDQgLT4gMC43NzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwODggc3F1YXJlcm9vdCAwLjA2MDQgLT4gMC4yNDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwODkgc3F1YXJlcm9vdCAwLjYwNSAtPiAwLjc3OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA5MCBzcXVhcmVyb290IDAuMDYwNSAtPiAwLjI0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA5MSBzcXVhcmVyb290IDAuNjA2IC0+IDAuNzc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDkyIHNxdWFyZXJvb3QgMC4wNjA2IC0+IDAuMjQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDkzIHNxdWFyZXJvb3QgMC42MDcgLT4gMC43NzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwOTQgc3F1YXJlcm9vdCAwLjA2MDcgLT4gMC4yNDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwOTUgc3F1YXJlcm9vdCAwLjYwOCAtPiAwLjc4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA5NiBzcXVhcmVyb290IDAuMDYwOCAtPiAwLjI0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA5NyBzcXVhcmVyb290IDAuNjA5IC0+IDAuNzgwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDk4IHNxdWFyZXJvb3QgMC4wNjA5IC0+IDAuMjQ3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDk5IHNxdWFyZXJvb3QgMC42MTEgLT4gMC43ODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMDAgc3F1YXJlcm9vdCAwLjA2MTEgLT4gMC4yNDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMDEgc3F1YXJlcm9vdCAwLjYxMiAtPiAwLjc4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEwMiBzcXVhcmVyb290IDAuMDYxMiAtPiAwLjI0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEwMyBzcXVhcmVyb290IDAuNjEzIC0+IDAuNzgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTA0IHNxdWFyZXJvb3QgMC4wNjEzIC0+IDAuMjQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTA1IHNxdWFyZXJvb3QgMC42MTQgLT4gMC43ODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMDYgc3F1YXJlcm9vdCAwLjA2MTQgLT4gMC4yNDggIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMDcgc3F1YXJlcm9vdCAwLjYxNSAtPiAwLjc4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEwOCBzcXVhcmVyb290IDAuMDYxNSAtPiAwLjI0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEwOSBzcXVhcmVyb290IDAuNjE2IC0+IDAuNzg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTEwIHNxdWFyZXJvb3QgMC4wNjE2IC0+IDAuMjQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTExIHNxdWFyZXJvb3QgMC42MTcgLT4gMC43ODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMTIgc3F1YXJlcm9vdCAwLjA2MTcgLT4gMC4yNDggIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMTMgc3F1YXJlcm9vdCAwLjYxOCAtPiAwLjc4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDExNCBzcXVhcmVyb290IDAuMDYxOCAtPiAwLjI0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDExNSBzcXVhcmVyb290IDAuNjE5IC0+IDAuNzg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTE2IHNxdWFyZXJvb3QgMC4wNjE5IC0+IDAuMjQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTE3IHNxdWFyZXJvb3QgMC42MjEgLT4gMC43ODggIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMTggc3F1YXJlcm9vdCAwLjA2MjEgLT4gMC4yNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMTkgc3F1YXJlcm9vdCAwLjYyMiAtPiAwLjc4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEyMCBzcXVhcmVyb290IDAuMDYyMiAtPiAwLjI0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEyMSBzcXVhcmVyb290IDAuNjIzIC0+IDAuNzg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTIyIHNxdWFyZXJvb3QgMC4wNjIzIC0+IDAuMjUwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTIzIHNxdWFyZXJvb3QgMC42MjQgLT4gMC43OTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMjQgc3F1YXJlcm9vdCAwLjA2MjQgLT4gMC4yNTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMjUgc3F1YXJlcm9vdCAwLjYyNSAtPiAwLjc5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEyNiBzcXVhcmVyb290IDAuMDYyNSAtPiAwLjI1CitzcXR4NDEyNyBzcXVhcmVyb290IDAuNjI2IC0+IDAuNzkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTI4IHNxdWFyZXJvb3QgMC4wNjI2IC0+IDAuMjUwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTI5IHNxdWFyZXJvb3QgMC42MjcgLT4gMC43OTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMzAgc3F1YXJlcm9vdCAwLjA2MjcgLT4gMC4yNTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMzEgc3F1YXJlcm9vdCAwLjYyOCAtPiAwLjc5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEzMiBzcXVhcmVyb290IDAuMDYyOCAtPiAwLjI1MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEzMyBzcXVhcmVyb290IDAuNjI5IC0+IDAuNzkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTM0IHNxdWFyZXJvb3QgMC4wNjI5IC0+IDAuMjUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTM1IHNxdWFyZXJvb3QgMC42MzEgLT4gMC43OTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMzYgc3F1YXJlcm9vdCAwLjA2MzEgLT4gMC4yNTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMzcgc3F1YXJlcm9vdCAwLjYzMiAtPiAwLjc5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEzOCBzcXVhcmVyb290IDAuMDYzMiAtPiAwLjI1MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEzOSBzcXVhcmVyb290IDAuNjMzIC0+IDAuNzk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTQwIHNxdWFyZXJvb3QgMC4wNjMzIC0+IDAuMjUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTQxIHNxdWFyZXJvb3QgMC42MzQgLT4gMC43OTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNDIgc3F1YXJlcm9vdCAwLjA2MzQgLT4gMC4yNTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNDMgc3F1YXJlcm9vdCAwLjYzNSAtPiAwLjc5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE0NCBzcXVhcmVyb290IDAuMDYzNSAtPiAwLjI1MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE0NSBzcXVhcmVyb290IDAuNjM2IC0+IDAuNzk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTQ2IHNxdWFyZXJvb3QgMC4wNjM2IC0+IDAuMjUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTQ3IHNxdWFyZXJvb3QgMC42MzcgLT4gMC43OTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNDggc3F1YXJlcm9vdCAwLjA2MzcgLT4gMC4yNTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNDkgc3F1YXJlcm9vdCAwLjYzOCAtPiAwLjc5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE1MCBzcXVhcmVyb290IDAuMDYzOCAtPiAwLjI1MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE1MSBzcXVhcmVyb290IDAuNjM5IC0+IDAuNzk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTUyIHNxdWFyZXJvb3QgMC4wNjM5IC0+IDAuMjUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTUzIHNxdWFyZXJvb3QgMC42NDEgLT4gMC44MDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNTQgc3F1YXJlcm9vdCAwLjA2NDEgLT4gMC4yNTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNTUgc3F1YXJlcm9vdCAwLjY0MiAtPiAwLjgwMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE1NiBzcXVhcmVyb290IDAuMDY0MiAtPiAwLjI1MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE1NyBzcXVhcmVyb290IDAuNjQzIC0+IDAuODAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTU4IHNxdWFyZXJvb3QgMC4wNjQzIC0+IDAuMjU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTU5IHNxdWFyZXJvb3QgMC42NDQgLT4gMC44MDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNjAgc3F1YXJlcm9vdCAwLjA2NDQgLT4gMC4yNTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNjEgc3F1YXJlcm9vdCAwLjY0NSAtPiAwLjgwMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE2MiBzcXVhcmVyb290IDAuMDY0NSAtPiAwLjI1NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE2MyBzcXVhcmVyb290IDAuNjQ2IC0+IDAuODA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTY0IHNxdWFyZXJvb3QgMC4wNjQ2IC0+IDAuMjU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTY1IHNxdWFyZXJvb3QgMC42NDcgLT4gMC44MDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNjYgc3F1YXJlcm9vdCAwLjA2NDcgLT4gMC4yNTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNjcgc3F1YXJlcm9vdCAwLjY0OCAtPiAwLjgwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE2OCBzcXVhcmVyb290IDAuMDY0OCAtPiAwLjI1NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE2OSBzcXVhcmVyb290IDAuNjQ5IC0+IDAuODA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTcwIHNxdWFyZXJvb3QgMC4wNjQ5IC0+IDAuMjU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTcxIHNxdWFyZXJvb3QgMC42NTEgLT4gMC44MDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNzIgc3F1YXJlcm9vdCAwLjA2NTEgLT4gMC4yNTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNzMgc3F1YXJlcm9vdCAwLjY1MiAtPiAwLjgwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE3NCBzcXVhcmVyb290IDAuMDY1MiAtPiAwLjI1NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE3NSBzcXVhcmVyb290IDAuNjUzIC0+IDAuODA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTc2IHNxdWFyZXJvb3QgMC4wNjUzIC0+IDAuMjU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTc3IHNxdWFyZXJvb3QgMC42NTQgLT4gMC44MDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNzggc3F1YXJlcm9vdCAwLjA2NTQgLT4gMC4yNTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNzkgc3F1YXJlcm9vdCAwLjY1NSAtPiAwLjgwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE4MCBzcXVhcmVyb290IDAuMDY1NSAtPiAwLjI1NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE4MSBzcXVhcmVyb290IDAuNjU2IC0+IDAuODEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTgyIHNxdWFyZXJvb3QgMC4wNjU2IC0+IDAuMjU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTgzIHNxdWFyZXJvb3QgMC42NTcgLT4gMC44MTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxODQgc3F1YXJlcm9vdCAwLjA2NTcgLT4gMC4yNTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxODUgc3F1YXJlcm9vdCAwLjY1OCAtPiAwLjgxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE4NiBzcXVhcmVyb290IDAuMDY1OCAtPiAwLjI1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE4NyBzcXVhcmVyb290IDAuNjU5IC0+IDAuODEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTg4IHNxdWFyZXJvb3QgMC4wNjU5IC0+IDAuMjU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTg5IHNxdWFyZXJvb3QgMC42NjEgLT4gMC44MTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxOTAgc3F1YXJlcm9vdCAwLjA2NjEgLT4gMC4yNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxOTEgc3F1YXJlcm9vdCAwLjY2MiAtPiAwLjgxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE5MiBzcXVhcmVyb290IDAuMDY2MiAtPiAwLjI1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE5MyBzcXVhcmVyb290IDAuNjYzIC0+IDAuODE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTk0IHNxdWFyZXJvb3QgMC4wNjYzIC0+IDAuMjU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTk1IHNxdWFyZXJvb3QgMC42NjQgLT4gMC44MTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxOTYgc3F1YXJlcm9vdCAwLjA2NjQgLT4gMC4yNTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQxOTcgc3F1YXJlcm9vdCAwLjY2NSAtPiAwLjgxNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE5OCBzcXVhcmVyb290IDAuMDY2NSAtPiAwLjI1OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE5OSBzcXVhcmVyb290IDAuNjY2IC0+IDAuODE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjAwIHNxdWFyZXJvb3QgMC4wNjY2IC0+IDAuMjU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjAxIHNxdWFyZXJvb3QgMC42NjcgLT4gMC44MTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMDIgc3F1YXJlcm9vdCAwLjA2NjcgLT4gMC4yNTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMDMgc3F1YXJlcm9vdCAwLjY2OCAtPiAwLjgxNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIwNCBzcXVhcmVyb290IDAuMDY2OCAtPiAwLjI1OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIwNSBzcXVhcmVyb290IDAuNjY5IC0+IDAuODE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjA2IHNxdWFyZXJvb3QgMC4wNjY5IC0+IDAuMjU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjA3IHNxdWFyZXJvb3QgMC42NzEgLT4gMC44MTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMDggc3F1YXJlcm9vdCAwLjA2NzEgLT4gMC4yNTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMDkgc3F1YXJlcm9vdCAwLjY3MiAtPiAwLjgyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIxMCBzcXVhcmVyb290IDAuMDY3MiAtPiAwLjI1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIxMSBzcXVhcmVyb290IDAuNjczIC0+IDAuODIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjEyIHNxdWFyZXJvb3QgMC4wNjczIC0+IDAuMjU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjEzIHNxdWFyZXJvb3QgMC42NzQgLT4gMC44MjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMTQgc3F1YXJlcm9vdCAwLjA2NzQgLT4gMC4yNjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMTUgc3F1YXJlcm9vdCAwLjY3NSAtPiAwLjgyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIxNiBzcXVhcmVyb290IDAuMDY3NSAtPiAwLjI2MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIxNyBzcXVhcmVyb290IDAuNjc2IC0+IDAuODIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjE4IHNxdWFyZXJvb3QgMC4wNjc2IC0+IDAuMjYKK3NxdHg0MjE5IHNxdWFyZXJvb3QgMC42NzcgLT4gMC44MjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMjAgc3F1YXJlcm9vdCAwLjA2NzcgLT4gMC4yNjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMjEgc3F1YXJlcm9vdCAwLjY3OCAtPiAwLjgyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIyMiBzcXVhcmVyb290IDAuMDY3OCAtPiAwLjI2MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIyMyBzcXVhcmVyb290IDAuNjc5IC0+IDAuODI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjI0IHNxdWFyZXJvb3QgMC4wNjc5IC0+IDAuMjYxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjI1IHNxdWFyZXJvb3QgMC42ODEgLT4gMC44MjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMjYgc3F1YXJlcm9vdCAwLjA2ODEgLT4gMC4yNjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMjcgc3F1YXJlcm9vdCAwLjY4MiAtPiAwLjgyNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIyOCBzcXVhcmVyb290IDAuMDY4MiAtPiAwLjI2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIyOSBzcXVhcmVyb290IDAuNjgzIC0+IDAuODI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjMwIHNxdWFyZXJvb3QgMC4wNjgzIC0+IDAuMjYxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjMxIHNxdWFyZXJvb3QgMC42ODQgLT4gMC44MjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMzIgc3F1YXJlcm9vdCAwLjA2ODQgLT4gMC4yNjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMzMgc3F1YXJlcm9vdCAwLjY4NSAtPiAwLjgyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIzNCBzcXVhcmVyb290IDAuMDY4NSAtPiAwLjI2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIzNSBzcXVhcmVyb290IDAuNjg2IC0+IDAuODI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjM2IHNxdWFyZXJvb3QgMC4wNjg2IC0+IDAuMjYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjM3IHNxdWFyZXJvb3QgMC42ODcgLT4gMC44MjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMzggc3F1YXJlcm9vdCAwLjA2ODcgLT4gMC4yNjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMzkgc3F1YXJlcm9vdCAwLjY4OCAtPiAwLjgyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI0MCBzcXVhcmVyb290IDAuMDY4OCAtPiAwLjI2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI0MSBzcXVhcmVyb290IDAuNjg5IC0+IDAuODMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjQyIHNxdWFyZXJvb3QgMC4wNjg5IC0+IDAuMjYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjQzIHNxdWFyZXJvb3QgMC42OTEgLT4gMC44MzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNDQgc3F1YXJlcm9vdCAwLjA2OTEgLT4gMC4yNjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNDUgc3F1YXJlcm9vdCAwLjY5MiAtPiAwLjgzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI0NiBzcXVhcmVyb290IDAuMDY5MiAtPiAwLjI2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI0NyBzcXVhcmVyb290IDAuNjkzIC0+IDAuODMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjQ4IHNxdWFyZXJvb3QgMC4wNjkzIC0+IDAuMjYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjQ5IHNxdWFyZXJvb3QgMC42OTQgLT4gMC44MzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNTAgc3F1YXJlcm9vdCAwLjA2OTQgLT4gMC4yNjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNTEgc3F1YXJlcm9vdCAwLjY5NSAtPiAwLjgzNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI1MiBzcXVhcmVyb290IDAuMDY5NSAtPiAwLjI2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI1MyBzcXVhcmVyb290IDAuNjk2IC0+IDAuODM0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjU0IHNxdWFyZXJvb3QgMC4wNjk2IC0+IDAuMjY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjU1IHNxdWFyZXJvb3QgMC42OTcgLT4gMC44MzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNTYgc3F1YXJlcm9vdCAwLjA2OTcgLT4gMC4yNjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNTcgc3F1YXJlcm9vdCAwLjY5OCAtPiAwLjgzNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI1OCBzcXVhcmVyb290IDAuMDY5OCAtPiAwLjI2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI1OSBzcXVhcmVyb290IDAuNjk5IC0+IDAuODM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjYwIHNxdWFyZXJvb3QgMC4wNjk5IC0+IDAuMjY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjYxIHNxdWFyZXJvb3QgMC43MDEgLT4gMC44MzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNjIgc3F1YXJlcm9vdCAwLjA3MDEgLT4gMC4yNjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNjMgc3F1YXJlcm9vdCAwLjcwMiAtPiAwLjgzOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI2NCBzcXVhcmVyb290IDAuMDcwMiAtPiAwLjI2NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI2NSBzcXVhcmVyb290IDAuNzAzIC0+IDAuODM4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjY2IHNxdWFyZXJvb3QgMC4wNzAzIC0+IDAuMjY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjY3IHNxdWFyZXJvb3QgMC43MDQgLT4gMC44MzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNjggc3F1YXJlcm9vdCAwLjA3MDQgLT4gMC4yNjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNjkgc3F1YXJlcm9vdCAwLjcwNSAtPiAwLjg0MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI3MCBzcXVhcmVyb290IDAuMDcwNSAtPiAwLjI2NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI3MSBzcXVhcmVyb290IDAuNzA2IC0+IDAuODQwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjcyIHNxdWFyZXJvb3QgMC4wNzA2IC0+IDAuMjY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjczIHNxdWFyZXJvb3QgMC43MDcgLT4gMC44NDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNzQgc3F1YXJlcm9vdCAwLjA3MDcgLT4gMC4yNjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNzUgc3F1YXJlcm9vdCAwLjcwOCAtPiAwLjg0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI3NiBzcXVhcmVyb290IDAuMDcwOCAtPiAwLjI2NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI3NyBzcXVhcmVyb290IDAuNzA5IC0+IDAuODQyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mjc4IHNxdWFyZXJvb3QgMC4wNzA5IC0+IDAuMjY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mjc5IHNxdWFyZXJvb3QgMC43MTEgLT4gMC44NDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyODAgc3F1YXJlcm9vdCAwLjA3MTEgLT4gMC4yNjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyODEgc3F1YXJlcm9vdCAwLjcxMiAtPiAwLjg0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI4MiBzcXVhcmVyb290IDAuMDcxMiAtPiAwLjI2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI4MyBzcXVhcmVyb290IDAuNzEzIC0+IDAuODQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mjg0IHNxdWFyZXJvb3QgMC4wNzEzIC0+IDAuMjY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mjg1IHNxdWFyZXJvb3QgMC43MTQgLT4gMC44NDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyODYgc3F1YXJlcm9vdCAwLjA3MTQgLT4gMC4yNjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyODcgc3F1YXJlcm9vdCAwLjcxNSAtPiAwLjg0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI4OCBzcXVhcmVyb290IDAuMDcxNSAtPiAwLjI2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI4OSBzcXVhcmVyb290IDAuNzE2IC0+IDAuODQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjkwIHNxdWFyZXJvb3QgMC4wNzE2IC0+IDAuMjY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjkxIHNxdWFyZXJvb3QgMC43MTcgLT4gMC44NDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyOTIgc3F1YXJlcm9vdCAwLjA3MTcgLT4gMC4yNjggIEluZXhhY3QgUm91bmRlZAorc3F0eDQyOTMgc3F1YXJlcm9vdCAwLjcxOCAtPiAwLjg0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI5NCBzcXVhcmVyb290IDAuMDcxOCAtPiAwLjI2OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI5NSBzcXVhcmVyb290IDAuNzE5IC0+IDAuODQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mjk2IHNxdWFyZXJvb3QgMC4wNzE5IC0+IDAuMjY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mjk3IHNxdWFyZXJvb3QgMC43MjEgLT4gMC44NDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyOTggc3F1YXJlcm9vdCAwLjA3MjEgLT4gMC4yNjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyOTkgc3F1YXJlcm9vdCAwLjcyMiAtPiAwLjg1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMwMCBzcXVhcmVyb290IDAuMDcyMiAtPiAwLjI2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMwMSBzcXVhcmVyb290IDAuNzIzIC0+IDAuODUwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzAyIHNxdWFyZXJvb3QgMC4wNzIzIC0+IDAuMjY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzAzIHNxdWFyZXJvb3QgMC43MjQgLT4gMC44NTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMDQgc3F1YXJlcm9vdCAwLjA3MjQgLT4gMC4yNjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMDUgc3F1YXJlcm9vdCAwLjcyNSAtPiAwLjg1MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMwNiBzcXVhcmVyb290IDAuMDcyNSAtPiAwLjI2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMwNyBzcXVhcmVyb290IDAuNzI2IC0+IDAuODUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzA4IHNxdWFyZXJvb3QgMC4wNzI2IC0+IDAuMjY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzA5IHNxdWFyZXJvb3QgMC43MjcgLT4gMC44NTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMTAgc3F1YXJlcm9vdCAwLjA3MjcgLT4gMC4yNzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMTEgc3F1YXJlcm9vdCAwLjcyOCAtPiAwLjg1MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMxMiBzcXVhcmVyb290IDAuMDcyOCAtPiAwLjI3MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMxMyBzcXVhcmVyb290IDAuNzI5IC0+IDAuODU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzE0IHNxdWFyZXJvb3QgMC4wNzI5IC0+IDAuMjcKK3NxdHg0MzE1IHNxdWFyZXJvb3QgMC43MzEgLT4gMC44NTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMTYgc3F1YXJlcm9vdCAwLjA3MzEgLT4gMC4yNzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMTcgc3F1YXJlcm9vdCAwLjczMiAtPiAwLjg1NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMxOCBzcXVhcmVyb290IDAuMDczMiAtPiAwLjI3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMxOSBzcXVhcmVyb290IDAuNzMzIC0+IDAuODU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzIwIHNxdWFyZXJvb3QgMC4wNzMzIC0+IDAuMjcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzIxIHNxdWFyZXJvb3QgMC43MzQgLT4gMC44NTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMjIgc3F1YXJlcm9vdCAwLjA3MzQgLT4gMC4yNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMjMgc3F1YXJlcm9vdCAwLjczNSAtPiAwLjg1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMyNCBzcXVhcmVyb290IDAuMDczNSAtPiAwLjI3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMyNSBzcXVhcmVyb290IDAuNzM2IC0+IDAuODU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzI2IHNxdWFyZXJvb3QgMC4wNzM2IC0+IDAuMjcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzI3IHNxdWFyZXJvb3QgMC43MzcgLT4gMC44NTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMjggc3F1YXJlcm9vdCAwLjA3MzcgLT4gMC4yNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMjkgc3F1YXJlcm9vdCAwLjczOCAtPiAwLjg1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMzMCBzcXVhcmVyb290IDAuMDczOCAtPiAwLjI3MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMzMSBzcXVhcmVyb290IDAuNzM5IC0+IDAuODYwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzMyIHNxdWFyZXJvb3QgMC4wNzM5IC0+IDAuMjcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzMzIHNxdWFyZXJvb3QgMC43NDEgLT4gMC44NjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMzQgc3F1YXJlcm9vdCAwLjA3NDEgLT4gMC4yNzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMzUgc3F1YXJlcm9vdCAwLjc0MiAtPiAwLjg2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMzNiBzcXVhcmVyb290IDAuMDc0MiAtPiAwLjI3MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMzNyBzcXVhcmVyb290IDAuNzQzIC0+IDAuODYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzM4IHNxdWFyZXJvb3QgMC4wNzQzIC0+IDAuMjczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzM5IHNxdWFyZXJvb3QgMC43NDQgLT4gMC44NjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNDAgc3F1YXJlcm9vdCAwLjA3NDQgLT4gMC4yNzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNDEgc3F1YXJlcm9vdCAwLjc0NSAtPiAwLjg2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM0MiBzcXVhcmVyb290IDAuMDc0NSAtPiAwLjI3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM0MyBzcXVhcmVyb290IDAuNzQ2IC0+IDAuODY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzQ0IHNxdWFyZXJvb3QgMC4wNzQ2IC0+IDAuMjczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzQ1IHNxdWFyZXJvb3QgMC43NDcgLT4gMC44NjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNDYgc3F1YXJlcm9vdCAwLjA3NDcgLT4gMC4yNzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNDcgc3F1YXJlcm9vdCAwLjc0OCAtPiAwLjg2NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM0OCBzcXVhcmVyb290IDAuMDc0OCAtPiAwLjI3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM0OSBzcXVhcmVyb290IDAuNzQ5IC0+IDAuODY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzUwIHNxdWFyZXJvb3QgMC4wNzQ5IC0+IDAuMjc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzUxIHNxdWFyZXJvb3QgMC43NTEgLT4gMC44NjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNTIgc3F1YXJlcm9vdCAwLjA3NTEgLT4gMC4yNzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNTMgc3F1YXJlcm9vdCAwLjc1MiAtPiAwLjg2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM1NCBzcXVhcmVyb290IDAuMDc1MiAtPiAwLjI3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM1NSBzcXVhcmVyb290IDAuNzUzIC0+IDAuODY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzU2IHNxdWFyZXJvb3QgMC4wNzUzIC0+IDAuMjc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzU3IHNxdWFyZXJvb3QgMC43NTQgLT4gMC44NjggIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNTggc3F1YXJlcm9vdCAwLjA3NTQgLT4gMC4yNzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNTkgc3F1YXJlcm9vdCAwLjc1NSAtPiAwLjg2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM2MCBzcXVhcmVyb290IDAuMDc1NSAtPiAwLjI3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM2MSBzcXVhcmVyb290IDAuNzU2IC0+IDAuODY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzYyIHNxdWFyZXJvb3QgMC4wNzU2IC0+IDAuMjc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzYzIHNxdWFyZXJvb3QgMC43NTcgLT4gMC44NzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNjQgc3F1YXJlcm9vdCAwLjA3NTcgLT4gMC4yNzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNjUgc3F1YXJlcm9vdCAwLjc1OCAtPiAwLjg3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM2NiBzcXVhcmVyb290IDAuMDc1OCAtPiAwLjI3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM2NyBzcXVhcmVyb290IDAuNzU5IC0+IDAuODcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzY4IHNxdWFyZXJvb3QgMC4wNzU5IC0+IDAuMjc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzY5IHNxdWFyZXJvb3QgMC43NjEgLT4gMC44NzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNzAgc3F1YXJlcm9vdCAwLjA3NjEgLT4gMC4yNzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNzEgc3F1YXJlcm9vdCAwLjc2MiAtPiAwLjg3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM3MiBzcXVhcmVyb290IDAuMDc2MiAtPiAwLjI3NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM3MyBzcXVhcmVyb290IDAuNzYzIC0+IDAuODczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mzc0IHNxdWFyZXJvb3QgMC4wNzYzIC0+IDAuMjc2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mzc1IHNxdWFyZXJvb3QgMC43NjQgLT4gMC44NzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNzYgc3F1YXJlcm9vdCAwLjA3NjQgLT4gMC4yNzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNzcgc3F1YXJlcm9vdCAwLjc2NSAtPiAwLjg3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM3OCBzcXVhcmVyb290IDAuMDc2NSAtPiAwLjI3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM3OSBzcXVhcmVyb290IDAuNzY2IC0+IDAuODc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzgwIHNxdWFyZXJvb3QgMC4wNzY2IC0+IDAuMjc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzgxIHNxdWFyZXJvb3QgMC43NjcgLT4gMC44NzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzODIgc3F1YXJlcm9vdCAwLjA3NjcgLT4gMC4yNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzODMgc3F1YXJlcm9vdCAwLjc2OCAtPiAwLjg3NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM4NCBzcXVhcmVyb290IDAuMDc2OCAtPiAwLjI3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM4NSBzcXVhcmVyb290IDAuNzY5IC0+IDAuODc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mzg2IHNxdWFyZXJvb3QgMC4wNzY5IC0+IDAuMjc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mzg3IHNxdWFyZXJvb3QgMC43NzEgLT4gMC44NzggIEluZXhhY3QgUm91bmRlZAorc3F0eDQzODggc3F1YXJlcm9vdCAwLjA3NzEgLT4gMC4yNzggIEluZXhhY3QgUm91bmRlZAorc3F0eDQzODkgc3F1YXJlcm9vdCAwLjc3MiAtPiAwLjg3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM5MCBzcXVhcmVyb290IDAuMDc3MiAtPiAwLjI3OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM5MSBzcXVhcmVyb290IDAuNzczIC0+IDAuODc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzkyIHNxdWFyZXJvb3QgMC4wNzczIC0+IDAuMjc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzkzIHNxdWFyZXJvb3QgMC43NzQgLT4gMC44ODAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzOTQgc3F1YXJlcm9vdCAwLjA3NzQgLT4gMC4yNzggIEluZXhhY3QgUm91bmRlZAorc3F0eDQzOTUgc3F1YXJlcm9vdCAwLjc3NSAtPiAwLjg4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM5NiBzcXVhcmVyb290IDAuMDc3NSAtPiAwLjI3OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM5NyBzcXVhcmVyb290IDAuNzc2IC0+IDAuODgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mzk4IHNxdWFyZXJvb3QgMC4wNzc2IC0+IDAuMjc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mzk5IHNxdWFyZXJvb3QgMC43NzcgLT4gMC44ODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MDAgc3F1YXJlcm9vdCAwLjA3NzcgLT4gMC4yNzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MDEgc3F1YXJlcm9vdCAwLjc3OCAtPiAwLjg4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQwMiBzcXVhcmVyb290IDAuMDc3OCAtPiAwLjI3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQwMyBzcXVhcmVyb290IDAuNzc5IC0+IDAuODgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDA0IHNxdWFyZXJvb3QgMC4wNzc5IC0+IDAuMjc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDA1IHNxdWFyZXJvb3QgMC43ODEgLT4gMC44ODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MDYgc3F1YXJlcm9vdCAwLjA3ODEgLT4gMC4yNzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MDcgc3F1YXJlcm9vdCAwLjc4MiAtPiAwLjg4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQwOCBzcXVhcmVyb290IDAuMDc4MiAtPiAwLjI4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQwOSBzcXVhcmVyb290IDAuNzgzIC0+IDAuODg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDEwIHNxdWFyZXJvb3QgMC4wNzgzIC0+IDAuMjgwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDExIHNxdWFyZXJvb3QgMC43ODQgLT4gMC44ODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MTIgc3F1YXJlcm9vdCAwLjA3ODQgLT4gMC4yOAorc3F0eDQ0MTMgc3F1YXJlcm9vdCAwLjc4NSAtPiAwLjg4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQxNCBzcXVhcmVyb290IDAuMDc4NSAtPiAwLjI4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQxNSBzcXVhcmVyb290IDAuNzg2IC0+IDAuODg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDE2IHNxdWFyZXJvb3QgMC4wNzg2IC0+IDAuMjgwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDE3IHNxdWFyZXJvb3QgMC43ODcgLT4gMC44ODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MTggc3F1YXJlcm9vdCAwLjA3ODcgLT4gMC4yODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MTkgc3F1YXJlcm9vdCAwLjc4OCAtPiAwLjg4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQyMCBzcXVhcmVyb290IDAuMDc4OCAtPiAwLjI4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQyMSBzcXVhcmVyb290IDAuNzg5IC0+IDAuODg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDIyIHNxdWFyZXJvb3QgMC4wNzg5IC0+IDAuMjgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDIzIHNxdWFyZXJvb3QgMC43OTEgLT4gMC44ODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MjQgc3F1YXJlcm9vdCAwLjA3OTEgLT4gMC4yODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MjUgc3F1YXJlcm9vdCAwLjc5MiAtPiAwLjg5MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQyNiBzcXVhcmVyb290IDAuMDc5MiAtPiAwLjI4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQyNyBzcXVhcmVyb290IDAuNzkzIC0+IDAuODkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDI4IHNxdWFyZXJvb3QgMC4wNzkzIC0+IDAuMjgyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDI5IHNxdWFyZXJvb3QgMC43OTQgLT4gMC44OTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MzAgc3F1YXJlcm9vdCAwLjA3OTQgLT4gMC4yODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MzEgc3F1YXJlcm9vdCAwLjc5NSAtPiAwLjg5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQzMiBzcXVhcmVyb290IDAuMDc5NSAtPiAwLjI4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQzMyBzcXVhcmVyb290IDAuNzk2IC0+IDAuODkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDM0IHNxdWFyZXJvb3QgMC4wNzk2IC0+IDAuMjgyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDM1IHNxdWFyZXJvb3QgMC43OTcgLT4gMC44OTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MzYgc3F1YXJlcm9vdCAwLjA3OTcgLT4gMC4yODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0Mzcgc3F1YXJlcm9vdCAwLjc5OCAtPiAwLjg5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQzOCBzcXVhcmVyb290IDAuMDc5OCAtPiAwLjI4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQzOSBzcXVhcmVyb290IDAuNzk5IC0+IDAuODk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDQwIHNxdWFyZXJvb3QgMC4wNzk5IC0+IDAuMjgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDQxIHNxdWFyZXJvb3QgMC44MDEgLT4gMC44OTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NDIgc3F1YXJlcm9vdCAwLjA4MDEgLT4gMC4yODMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NDMgc3F1YXJlcm9vdCAwLjgwMiAtPiAwLjg5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ0NCBzcXVhcmVyb290IDAuMDgwMiAtPiAwLjI4MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ0NSBzcXVhcmVyb290IDAuODAzIC0+IDAuODk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDQ2IHNxdWFyZXJvb3QgMC4wODAzIC0+IDAuMjgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDQ3IHNxdWFyZXJvb3QgMC44MDQgLT4gMC44OTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NDggc3F1YXJlcm9vdCAwLjA4MDQgLT4gMC4yODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NDkgc3F1YXJlcm9vdCAwLjgwNSAtPiAwLjg5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ1MCBzcXVhcmVyb290IDAuMDgwNSAtPiAwLjI4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ1MSBzcXVhcmVyb290IDAuODA2IC0+IDAuODk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDUyIHNxdWFyZXJvb3QgMC4wODA2IC0+IDAuMjg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDUzIHNxdWFyZXJvb3QgMC44MDcgLT4gMC44OTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NTQgc3F1YXJlcm9vdCAwLjA4MDcgLT4gMC4yODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NTUgc3F1YXJlcm9vdCAwLjgwOCAtPiAwLjg5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ1NiBzcXVhcmVyb290IDAuMDgwOCAtPiAwLjI4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ1NyBzcXVhcmVyb290IDAuODA5IC0+IDAuODk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDU4IHNxdWFyZXJvb3QgMC4wODA5IC0+IDAuMjg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDU5IHNxdWFyZXJvb3QgMC44MTEgLT4gMC45MDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NjAgc3F1YXJlcm9vdCAwLjA4MTEgLT4gMC4yODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NjEgc3F1YXJlcm9vdCAwLjgxMiAtPiAwLjkwMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ2MiBzcXVhcmVyb290IDAuMDgxMiAtPiAwLjI4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ2MyBzcXVhcmVyb290IDAuODEzIC0+IDAuOTAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDY0IHNxdWFyZXJvb3QgMC4wODEzIC0+IDAuMjg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDY1IHNxdWFyZXJvb3QgMC44MTQgLT4gMC45MDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NjYgc3F1YXJlcm9vdCAwLjA4MTQgLT4gMC4yODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0Njcgc3F1YXJlcm9vdCAwLjgxNSAtPiAwLjkwMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ2OCBzcXVhcmVyb290IDAuMDgxNSAtPiAwLjI4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ2OSBzcXVhcmVyb290IDAuODE2IC0+IDAuOTAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDcwIHNxdWFyZXJvb3QgMC4wODE2IC0+IDAuMjg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDcxIHNxdWFyZXJvb3QgMC44MTcgLT4gMC45MDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NzIgc3F1YXJlcm9vdCAwLjA4MTcgLT4gMC4yODYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NzMgc3F1YXJlcm9vdCAwLjgxOCAtPiAwLjkwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ3NCBzcXVhcmVyb290IDAuMDgxOCAtPiAwLjI4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ3NSBzcXVhcmVyb290IDAuODE5IC0+IDAuOTA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDc2IHNxdWFyZXJvb3QgMC4wODE5IC0+IDAuMjg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDc3IHNxdWFyZXJvb3QgMC44MjEgLT4gMC45MDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0Nzggc3F1YXJlcm9vdCAwLjA4MjEgLT4gMC4yODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0Nzkgc3F1YXJlcm9vdCAwLjgyMiAtPiAwLjkwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ4MCBzcXVhcmVyb290IDAuMDgyMiAtPiAwLjI4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ4MSBzcXVhcmVyb290IDAuODIzIC0+IDAuOTA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDgyIHNxdWFyZXJvb3QgMC4wODIzIC0+IDAuMjg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDgzIHNxdWFyZXJvb3QgMC44MjQgLT4gMC45MDggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0ODQgc3F1YXJlcm9vdCAwLjA4MjQgLT4gMC4yODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0ODUgc3F1YXJlcm9vdCAwLjgyNSAtPiAwLjkwOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ4NiBzcXVhcmVyb290IDAuMDgyNSAtPiAwLjI4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ4NyBzcXVhcmVyb290IDAuODI2IC0+IDAuOTA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDg4IHNxdWFyZXJvb3QgMC4wODI2IC0+IDAuMjg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDg5IHNxdWFyZXJvb3QgMC44MjcgLT4gMC45MDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0OTAgc3F1YXJlcm9vdCAwLjA4MjcgLT4gMC4yODggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0OTEgc3F1YXJlcm9vdCAwLjgyOCAtPiAwLjkxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ5MiBzcXVhcmVyb290IDAuMDgyOCAtPiAwLjI4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ5MyBzcXVhcmVyb290IDAuODI5IC0+IDAuOTEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDk0IHNxdWFyZXJvb3QgMC4wODI5IC0+IDAuMjg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDk1IHNxdWFyZXJvb3QgMC44MzEgLT4gMC45MTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0OTYgc3F1YXJlcm9vdCAwLjA4MzEgLT4gMC4yODggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0OTcgc3F1YXJlcm9vdCAwLjgzMiAtPiAwLjkxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ5OCBzcXVhcmVyb290IDAuMDgzMiAtPiAwLjI4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ5OSBzcXVhcmVyb290IDAuODMzIC0+IDAuOTEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTAwIHNxdWFyZXJvb3QgMC4wODMzIC0+IDAuMjg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTAxIHNxdWFyZXJvb3QgMC44MzQgLT4gMC45MTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MDIgc3F1YXJlcm9vdCAwLjA4MzQgLT4gMC4yODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MDMgc3F1YXJlcm9vdCAwLjgzNSAtPiAwLjkxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUwNCBzcXVhcmVyb290IDAuMDgzNSAtPiAwLjI4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUwNSBzcXVhcmVyb290IDAuODM2IC0+IDAuOTE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTA2IHNxdWFyZXJvb3QgMC4wODM2IC0+IDAuMjg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTA3IHNxdWFyZXJvb3QgMC44MzcgLT4gMC45MTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MDggc3F1YXJlcm9vdCAwLjA4MzcgLT4gMC4yODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MDkgc3F1YXJlcm9vdCAwLjgzOCAtPiAwLjkxNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUxMCBzcXVhcmVyb290IDAuMDgzOCAtPiAwLjI4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUxMSBzcXVhcmVyb290IDAuODM5IC0+IDAuOTE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTEyIHNxdWFyZXJvb3QgMC4wODM5IC0+IDAuMjkwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTEzIHNxdWFyZXJvb3QgMC44NDEgLT4gMC45MTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MTQgc3F1YXJlcm9vdCAwLjA4NDEgLT4gMC4yOQorc3F0eDQ1MTUgc3F1YXJlcm9vdCAwLjg0MiAtPiAwLjkxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUxNiBzcXVhcmVyb290IDAuMDg0MiAtPiAwLjI5MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUxNyBzcXVhcmVyb290IDAuODQzIC0+IDAuOTE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTE4IHNxdWFyZXJvb3QgMC4wODQzIC0+IDAuMjkwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTE5IHNxdWFyZXJvb3QgMC44NDQgLT4gMC45MTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MjAgc3F1YXJlcm9vdCAwLjA4NDQgLT4gMC4yOTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MjEgc3F1YXJlcm9vdCAwLjg0NSAtPiAwLjkxOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUyMiBzcXVhcmVyb290IDAuMDg0NSAtPiAwLjI5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUyMyBzcXVhcmVyb290IDAuODQ2IC0+IDAuOTIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTI0IHNxdWFyZXJvb3QgMC4wODQ2IC0+IDAuMjkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTI1IHNxdWFyZXJvb3QgMC44NDcgLT4gMC45MjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MjYgc3F1YXJlcm9vdCAwLjA4NDcgLT4gMC4yOTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1Mjcgc3F1YXJlcm9vdCAwLjg0OCAtPiAwLjkyMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUyOCBzcXVhcmVyb290IDAuMDg0OCAtPiAwLjI5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUyOSBzcXVhcmVyb290IDAuODQ5IC0+IDAuOTIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTMwIHNxdWFyZXJvb3QgMC4wODQ5IC0+IDAuMjkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTMxIHNxdWFyZXJvb3QgMC44NTEgLT4gMC45MjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MzIgc3F1YXJlcm9vdCAwLjA4NTEgLT4gMC4yOTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MzMgc3F1YXJlcm9vdCAwLjg1MiAtPiAwLjkyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUzNCBzcXVhcmVyb290IDAuMDg1MiAtPiAwLjI5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUzNSBzcXVhcmVyb290IDAuODUzIC0+IDAuOTI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTM2IHNxdWFyZXJvb3QgMC4wODUzIC0+IDAuMjkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTM3IHNxdWFyZXJvb3QgMC44NTQgLT4gMC45MjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1Mzggc3F1YXJlcm9vdCAwLjA4NTQgLT4gMC4yOTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1Mzkgc3F1YXJlcm9vdCAwLjg1NSAtPiAwLjkyNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU0MCBzcXVhcmVyb290IDAuMDg1NSAtPiAwLjI5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU0MSBzcXVhcmVyb290IDAuODU2IC0+IDAuOTI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTQyIHNxdWFyZXJvb3QgMC4wODU2IC0+IDAuMjkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTQzIHNxdWFyZXJvb3QgMC44NTcgLT4gMC45MjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NDQgc3F1YXJlcm9vdCAwLjA4NTcgLT4gMC4yOTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NDUgc3F1YXJlcm9vdCAwLjg1OCAtPiAwLjkyNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU0NiBzcXVhcmVyb290IDAuMDg1OCAtPiAwLjI5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU0NyBzcXVhcmVyb290IDAuODU5IC0+IDAuOTI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTQ4IHNxdWFyZXJvb3QgMC4wODU5IC0+IDAuMjkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTQ5IHNxdWFyZXJvb3QgMC44NjEgLT4gMC45MjggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NTAgc3F1YXJlcm9vdCAwLjA4NjEgLT4gMC4yOTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NTEgc3F1YXJlcm9vdCAwLjg2MiAtPiAwLjkyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU1MiBzcXVhcmVyb290IDAuMDg2MiAtPiAwLjI5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU1MyBzcXVhcmVyb290IDAuODYzIC0+IDAuOTI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTU0IHNxdWFyZXJvb3QgMC4wODYzIC0+IDAuMjk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTU1IHNxdWFyZXJvb3QgMC44NjQgLT4gMC45MzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NTYgc3F1YXJlcm9vdCAwLjA4NjQgLT4gMC4yOTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NTcgc3F1YXJlcm9vdCAwLjg2NSAtPiAwLjkzMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU1OCBzcXVhcmVyb290IDAuMDg2NSAtPiAwLjI5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU1OSBzcXVhcmVyb290IDAuODY2IC0+IDAuOTMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTYwIHNxdWFyZXJvb3QgMC4wODY2IC0+IDAuMjk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTYxIHNxdWFyZXJvb3QgMC44NjcgLT4gMC45MzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NjIgc3F1YXJlcm9vdCAwLjA4NjcgLT4gMC4yOTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NjMgc3F1YXJlcm9vdCAwLjg2OCAtPiAwLjkzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU2NCBzcXVhcmVyb290IDAuMDg2OCAtPiAwLjI5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU2NSBzcXVhcmVyb290IDAuODY5IC0+IDAuOTMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTY2IHNxdWFyZXJvb3QgMC4wODY5IC0+IDAuMjk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTY3IHNxdWFyZXJvb3QgMC44NzEgLT4gMC45MzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1Njggc3F1YXJlcm9vdCAwLjA4NzEgLT4gMC4yOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1Njkgc3F1YXJlcm9vdCAwLjg3MiAtPiAwLjkzNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU3MCBzcXVhcmVyb290IDAuMDg3MiAtPiAwLjI5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU3MSBzcXVhcmVyb290IDAuODczIC0+IDAuOTM0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTcyIHNxdWFyZXJvb3QgMC4wODczIC0+IDAuMjk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTczIHNxdWFyZXJvb3QgMC44NzQgLT4gMC45MzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NzQgc3F1YXJlcm9vdCAwLjA4NzQgLT4gMC4yOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NzUgc3F1YXJlcm9vdCAwLjg3NSAtPiAwLjkzNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU3NiBzcXVhcmVyb290IDAuMDg3NSAtPiAwLjI5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU3NyBzcXVhcmVyb290IDAuODc2IC0+IDAuOTM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTc4IHNxdWFyZXJvb3QgMC4wODc2IC0+IDAuMjk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTc5IHNxdWFyZXJvb3QgMC44NzcgLT4gMC45MzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1ODAgc3F1YXJlcm9vdCAwLjA4NzcgLT4gMC4yOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1ODEgc3F1YXJlcm9vdCAwLjg3OCAtPiAwLjkzNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU4MiBzcXVhcmVyb290IDAuMDg3OCAtPiAwLjI5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU4MyBzcXVhcmVyb290IDAuODc5IC0+IDAuOTM4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTg0IHNxdWFyZXJvb3QgMC4wODc5IC0+IDAuMjk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTg1IHNxdWFyZXJvb3QgMC44ODEgLT4gMC45MzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1ODYgc3F1YXJlcm9vdCAwLjA4ODEgLT4gMC4yOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1ODcgc3F1YXJlcm9vdCAwLjg4MiAtPiAwLjkzOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU4OCBzcXVhcmVyb290IDAuMDg4MiAtPiAwLjI5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU4OSBzcXVhcmVyb290IDAuODgzIC0+IDAuOTQwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTkwIHNxdWFyZXJvb3QgMC4wODgzIC0+IDAuMjk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTkxIHNxdWFyZXJvb3QgMC44ODQgLT4gMC45NDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1OTIgc3F1YXJlcm9vdCAwLjA4ODQgLT4gMC4yOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1OTMgc3F1YXJlcm9vdCAwLjg4NSAtPiAwLjk0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU5NCBzcXVhcmVyb290IDAuMDg4NSAtPiAwLjI5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU5NSBzcXVhcmVyb290IDAuODg2IC0+IDAuOTQxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTk2IHNxdWFyZXJvb3QgMC4wODg2IC0+IDAuMjk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTk3IHNxdWFyZXJvb3QgMC44ODcgLT4gMC45NDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1OTggc3F1YXJlcm9vdCAwLjA4ODcgLT4gMC4yOTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1OTkgc3F1YXJlcm9vdCAwLjg4OCAtPiAwLjk0MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYwMCBzcXVhcmVyb290IDAuMDg4OCAtPiAwLjI5OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYwMSBzcXVhcmVyb290IDAuODg5IC0+IDAuOTQzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjAyIHNxdWFyZXJvb3QgMC4wODg5IC0+IDAuMjk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjAzIHNxdWFyZXJvb3QgMC44OTEgLT4gMC45NDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MDQgc3F1YXJlcm9vdCAwLjA4OTEgLT4gMC4yOTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MDUgc3F1YXJlcm9vdCAwLjg5MiAtPiAwLjk0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYwNiBzcXVhcmVyb290IDAuMDg5MiAtPiAwLjI5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYwNyBzcXVhcmVyb290IDAuODkzIC0+IDAuOTQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjA4IHNxdWFyZXJvb3QgMC4wODkzIC0+IDAuMjk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjA5IHNxdWFyZXJvb3QgMC44OTQgLT4gMC45NDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MTAgc3F1YXJlcm9vdCAwLjA4OTQgLT4gMC4yOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MTEgc3F1YXJlcm9vdCAwLjg5NSAtPiAwLjk0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYxMiBzcXVhcmVyb290IDAuMDg5NSAtPiAwLjI5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYxMyBzcXVhcmVyb290IDAuODk2IC0+IDAuOTQ3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjE0IHNxdWFyZXJvb3QgMC4wODk2IC0+IDAuMjk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjE1IHNxdWFyZXJvb3QgMC44OTcgLT4gMC45NDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MTYgc3F1YXJlcm9vdCAwLjA4OTcgLT4gMC4yOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MTcgc3F1YXJlcm9vdCAwLjg5OCAtPiAwLjk0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYxOCBzcXVhcmVyb290IDAuMDg5OCAtPiAwLjMwMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYxOSBzcXVhcmVyb290IDAuODk5IC0+IDAuOTQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjIwIHNxdWFyZXJvb3QgMC4wODk5IC0+IDAuMzAwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjIxIHNxdWFyZXJvb3QgMC45MDEgLT4gMC45NDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MjIgc3F1YXJlcm9vdCAwLjA5MDEgLT4gMC4zMDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MjMgc3F1YXJlcm9vdCAwLjkwMiAtPiAwLjk1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYyNCBzcXVhcmVyb290IDAuMDkwMiAtPiAwLjMwMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYyNSBzcXVhcmVyb290IDAuOTAzIC0+IDAuOTUwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjI2IHNxdWFyZXJvb3QgMC4wOTAzIC0+IDAuMzAwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjI3IHNxdWFyZXJvb3QgMC45MDQgLT4gMC45NTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2Mjggc3F1YXJlcm9vdCAwLjA5MDQgLT4gMC4zMDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2Mjkgc3F1YXJlcm9vdCAwLjkwNSAtPiAwLjk1MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYzMCBzcXVhcmVyb290IDAuMDkwNSAtPiAwLjMwMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYzMSBzcXVhcmVyb290IDAuOTA2IC0+IDAuOTUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjMyIHNxdWFyZXJvb3QgMC4wOTA2IC0+IDAuMzAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjMzIHNxdWFyZXJvb3QgMC45MDcgLT4gMC45NTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MzQgc3F1YXJlcm9vdCAwLjA5MDcgLT4gMC4zMDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MzUgc3F1YXJlcm9vdCAwLjkwOCAtPiAwLjk1MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYzNiBzcXVhcmVyb290IDAuMDkwOCAtPiAwLjMwMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYzNyBzcXVhcmVyb290IDAuOTA5IC0+IDAuOTUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjM4IHNxdWFyZXJvb3QgMC4wOTA5IC0+IDAuMzAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjM5IHNxdWFyZXJvb3QgMC45MTEgLT4gMC45NTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NDAgc3F1YXJlcm9vdCAwLjA5MTEgLT4gMC4zMDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NDEgc3F1YXJlcm9vdCAwLjkxMiAtPiAwLjk1NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY0MiBzcXVhcmVyb290IDAuMDkxMiAtPiAwLjMwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY0MyBzcXVhcmVyb290IDAuOTEzIC0+IDAuOTU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjQ0IHNxdWFyZXJvb3QgMC4wOTEzIC0+IDAuMzAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjQ1IHNxdWFyZXJvb3QgMC45MTQgLT4gMC45NTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NDYgc3F1YXJlcm9vdCAwLjA5MTQgLT4gMC4zMDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NDcgc3F1YXJlcm9vdCAwLjkxNSAtPiAwLjk1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY0OCBzcXVhcmVyb290IDAuMDkxNSAtPiAwLjMwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY0OSBzcXVhcmVyb290IDAuOTE2IC0+IDAuOTU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjUwIHNxdWFyZXJvb3QgMC4wOTE2IC0+IDAuMzAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjUxIHNxdWFyZXJvb3QgMC45MTcgLT4gMC45NTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NTIgc3F1YXJlcm9vdCAwLjA5MTcgLT4gMC4zMDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NTMgc3F1YXJlcm9vdCAwLjkxOCAtPiAwLjk1OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY1NCBzcXVhcmVyb290IDAuMDkxOCAtPiAwLjMwMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY1NSBzcXVhcmVyb290IDAuOTE5IC0+IDAuOTU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjU2IHNxdWFyZXJvb3QgMC4wOTE5IC0+IDAuMzAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjU3IHNxdWFyZXJvb3QgMC45MjEgLT4gMC45NjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NTggc3F1YXJlcm9vdCAwLjA5MjEgLT4gMC4zMDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NTkgc3F1YXJlcm9vdCAwLjkyMiAtPiAwLjk2MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY2MCBzcXVhcmVyb290IDAuMDkyMiAtPiAwLjMwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY2MSBzcXVhcmVyb290IDAuOTIzIC0+IDAuOTYxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjYyIHNxdWFyZXJvb3QgMC4wOTIzIC0+IDAuMzA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjYzIHNxdWFyZXJvb3QgMC45MjQgLT4gMC45NjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NjQgc3F1YXJlcm9vdCAwLjA5MjQgLT4gMC4zMDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NjUgc3F1YXJlcm9vdCAwLjkyNSAtPiAwLjk2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY2NiBzcXVhcmVyb290IDAuMDkyNSAtPiAwLjMwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY2NyBzcXVhcmVyb290IDAuOTI2IC0+IDAuOTYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjY4IHNxdWFyZXJvb3QgMC4wOTI2IC0+IDAuMzA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjY5IHNxdWFyZXJvb3QgMC45MjcgLT4gMC45NjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NzAgc3F1YXJlcm9vdCAwLjA5MjcgLT4gMC4zMDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NzEgc3F1YXJlcm9vdCAwLjkyOCAtPiAwLjk2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY3MiBzcXVhcmVyb290IDAuMDkyOCAtPiAwLjMwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY3MyBzcXVhcmVyb290IDAuOTI5IC0+IDAuOTY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Njc0IHNxdWFyZXJvb3QgMC4wOTI5IC0+IDAuMzA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Njc1IHNxdWFyZXJvb3QgMC45MzEgLT4gMC45NjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NzYgc3F1YXJlcm9vdCAwLjA5MzEgLT4gMC4zMDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2Nzcgc3F1YXJlcm9vdCAwLjkzMiAtPiAwLjk2NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY3OCBzcXVhcmVyb290IDAuMDkzMiAtPiAwLjMwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY3OSBzcXVhcmVyb290IDAuOTMzIC0+IDAuOTY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjgwIHNxdWFyZXJvb3QgMC4wOTMzIC0+IDAuMzA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjgxIHNxdWFyZXJvb3QgMC45MzQgLT4gMC45NjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2ODIgc3F1YXJlcm9vdCAwLjA5MzQgLT4gMC4zMDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2ODMgc3F1YXJlcm9vdCAwLjkzNSAtPiAwLjk2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY4NCBzcXVhcmVyb290IDAuMDkzNSAtPiAwLjMwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY4NSBzcXVhcmVyb290IDAuOTM2IC0+IDAuOTY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Njg2IHNxdWFyZXJvb3QgMC4wOTM2IC0+IDAuMzA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Njg3IHNxdWFyZXJvb3QgMC45MzcgLT4gMC45NjggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2ODggc3F1YXJlcm9vdCAwLjA5MzcgLT4gMC4zMDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2ODkgc3F1YXJlcm9vdCAwLjkzOCAtPiAwLjk2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY5MCBzcXVhcmVyb290IDAuMDkzOCAtPiAwLjMwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY5MSBzcXVhcmVyb290IDAuOTM5IC0+IDAuOTY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjkyIHNxdWFyZXJvb3QgMC4wOTM5IC0+IDAuMzA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjkzIHNxdWFyZXJvb3QgMC45NDEgLT4gMC45NzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2OTQgc3F1YXJlcm9vdCAwLjA5NDEgLT4gMC4zMDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2OTUgc3F1YXJlcm9vdCAwLjk0MiAtPiAwLjk3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY5NiBzcXVhcmVyb290IDAuMDk0MiAtPiAwLjMwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY5NyBzcXVhcmVyb290IDAuOTQzIC0+IDAuOTcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Njk4IHNxdWFyZXJvb3QgMC4wOTQzIC0+IDAuMzA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Njk5IHNxdWFyZXJvb3QgMC45NDQgLT4gMC45NzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MDAgc3F1YXJlcm9vdCAwLjA5NDQgLT4gMC4zMDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MDEgc3F1YXJlcm9vdCAwLjk0NSAtPiAwLjk3MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcwMiBzcXVhcmVyb290IDAuMDk0NSAtPiAwLjMwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcwMyBzcXVhcmVyb290IDAuOTQ2IC0+IDAuOTczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzA0IHNxdWFyZXJvb3QgMC4wOTQ2IC0+IDAuMzA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzA1IHNxdWFyZXJvb3QgMC45NDcgLT4gMC45NzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MDYgc3F1YXJlcm9vdCAwLjA5NDcgLT4gMC4zMDggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MDcgc3F1YXJlcm9vdCAwLjk0OCAtPiAwLjk3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcwOCBzcXVhcmVyb290IDAuMDk0OCAtPiAwLjMwOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcwOSBzcXVhcmVyb290IDAuOTQ5IC0+IDAuOTc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzEwIHNxdWFyZXJvb3QgMC4wOTQ5IC0+IDAuMzA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzExIHNxdWFyZXJvb3QgMC45NTEgLT4gMC45NzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MTIgc3F1YXJlcm9vdCAwLjA5NTEgLT4gMC4zMDggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MTMgc3F1YXJlcm9vdCAwLjk1MiAtPiAwLjk3NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcxNCBzcXVhcmVyb290IDAuMDk1MiAtPiAwLjMwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcxNSBzcXVhcmVyb290IDAuOTUzIC0+IDAuOTc2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzE2IHNxdWFyZXJvb3QgMC4wOTUzIC0+IDAuMzA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzE3IHNxdWFyZXJvb3QgMC45NTQgLT4gMC45NzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MTggc3F1YXJlcm9vdCAwLjA5NTQgLT4gMC4zMDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MTkgc3F1YXJlcm9vdCAwLjk1NSAtPiAwLjk3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcyMCBzcXVhcmVyb290IDAuMDk1NSAtPiAwLjMwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcyMSBzcXVhcmVyb290IDAuOTU2IC0+IDAuOTc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzIyIHNxdWFyZXJvb3QgMC4wOTU2IC0+IDAuMzA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzIzIHNxdWFyZXJvb3QgMC45NTcgLT4gMC45NzggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MjQgc3F1YXJlcm9vdCAwLjA5NTcgLT4gMC4zMDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MjUgc3F1YXJlcm9vdCAwLjk1OCAtPiAwLjk3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcyNiBzcXVhcmVyb290IDAuMDk1OCAtPiAwLjMxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcyNyBzcXVhcmVyb290IDAuOTU5IC0+IDAuOTc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzI4IHNxdWFyZXJvb3QgMC4wOTU5IC0+IDAuMzEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzI5IHNxdWFyZXJvb3QgMC45NjEgLT4gMC45ODAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MzAgc3F1YXJlcm9vdCAwLjA5NjEgLT4gMC4zMQorc3F0eDQ3MzEgc3F1YXJlcm9vdCAwLjk2MiAtPiAwLjk4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDczMiBzcXVhcmVyb290IDAuMDk2MiAtPiAwLjMxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDczMyBzcXVhcmVyb290IDAuOTYzIC0+IDAuOTgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzM0IHNxdWFyZXJvb3QgMC4wOTYzIC0+IDAuMzEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzM1IHNxdWFyZXJvb3QgMC45NjQgLT4gMC45ODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MzYgc3F1YXJlcm9vdCAwLjA5NjQgLT4gMC4zMTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3Mzcgc3F1YXJlcm9vdCAwLjk2NSAtPiAwLjk4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDczOCBzcXVhcmVyb290IDAuMDk2NSAtPiAwLjMxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDczOSBzcXVhcmVyb290IDAuOTY2IC0+IDAuOTgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzQwIHNxdWFyZXJvb3QgMC4wOTY2IC0+IDAuMzExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzQxIHNxdWFyZXJvb3QgMC45NjcgLT4gMC45ODMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NDIgc3F1YXJlcm9vdCAwLjA5NjcgLT4gMC4zMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NDMgc3F1YXJlcm9vdCAwLjk2OCAtPiAwLjk4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc0NCBzcXVhcmVyb290IDAuMDk2OCAtPiAwLjMxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc0NSBzcXVhcmVyb290IDAuOTY5IC0+IDAuOTg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzQ2IHNxdWFyZXJvb3QgMC4wOTY5IC0+IDAuMzExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzQ3IHNxdWFyZXJvb3QgMC45NzEgLT4gMC45ODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NDggc3F1YXJlcm9vdCAwLjA5NzEgLT4gMC4zMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NDkgc3F1YXJlcm9vdCAwLjk3MiAtPiAwLjk4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc1MCBzcXVhcmVyb290IDAuMDk3MiAtPiAwLjMxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc1MSBzcXVhcmVyb290IDAuOTczIC0+IDAuOTg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzUyIHNxdWFyZXJvb3QgMC4wOTczIC0+IDAuMzEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzUzIHNxdWFyZXJvb3QgMC45NzQgLT4gMC45ODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NTQgc3F1YXJlcm9vdCAwLjA5NzQgLT4gMC4zMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NTUgc3F1YXJlcm9vdCAwLjk3NSAtPiAwLjk4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc1NiBzcXVhcmVyb290IDAuMDk3NSAtPiAwLjMxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc1NyBzcXVhcmVyb290IDAuOTc2IC0+IDAuOTg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzU4IHNxdWFyZXJvb3QgMC4wOTc2IC0+IDAuMzEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzU5IHNxdWFyZXJvb3QgMC45NzcgLT4gMC45ODggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NjAgc3F1YXJlcm9vdCAwLjA5NzcgLT4gMC4zMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NjEgc3F1YXJlcm9vdCAwLjk3OCAtPiAwLjk4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc2MiBzcXVhcmVyb290IDAuMDk3OCAtPiAwLjMxMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc2MyBzcXVhcmVyb290IDAuOTc5IC0+IDAuOTg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzY0IHNxdWFyZXJvb3QgMC4wOTc5IC0+IDAuMzEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzY1IHNxdWFyZXJvb3QgMC45ODEgLT4gMC45OTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NjYgc3F1YXJlcm9vdCAwLjA5ODEgLT4gMC4zMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3Njcgc3F1YXJlcm9vdCAwLjk4MiAtPiAwLjk5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc2OCBzcXVhcmVyb290IDAuMDk4MiAtPiAwLjMxMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc2OSBzcXVhcmVyb290IDAuOTgzIC0+IDAuOTkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzcwIHNxdWFyZXJvb3QgMC4wOTgzIC0+IDAuMzE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzcxIHNxdWFyZXJvb3QgMC45ODQgLT4gMC45OTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NzIgc3F1YXJlcm9vdCAwLjA5ODQgLT4gMC4zMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NzMgc3F1YXJlcm9vdCAwLjk4NSAtPiAwLjk5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc3NCBzcXVhcmVyb290IDAuMDk4NSAtPiAwLjMxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc3NSBzcXVhcmVyb290IDAuOTg2IC0+IDAuOTkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Nzc2IHNxdWFyZXJvb3QgMC4wOTg2IC0+IDAuMzE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Nzc3IHNxdWFyZXJvb3QgMC45ODcgLT4gMC45OTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3Nzggc3F1YXJlcm9vdCAwLjA5ODcgLT4gMC4zMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3Nzkgc3F1YXJlcm9vdCAwLjk4OCAtPiAwLjk5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc4MCBzcXVhcmVyb290IDAuMDk4OCAtPiAwLjMxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc4MSBzcXVhcmVyb290IDAuOTg5IC0+IDAuOTk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzgyIHNxdWFyZXJvb3QgMC4wOTg5IC0+IDAuMzE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzgzIHNxdWFyZXJvb3QgMC45OTEgLT4gMC45OTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3ODQgc3F1YXJlcm9vdCAwLjA5OTEgLT4gMC4zMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3ODUgc3F1YXJlcm9vdCAwLjk5MiAtPiAwLjk5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc4NiBzcXVhcmVyb290IDAuMDk5MiAtPiAwLjMxNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc4NyBzcXVhcmVyb290IDAuOTkzIC0+IDAuOTk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Nzg4IHNxdWFyZXJvb3QgMC4wOTkzIC0+IDAuMzE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Nzg5IHNxdWFyZXJvb3QgMC45OTQgLT4gMC45OTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3OTAgc3F1YXJlcm9vdCAwLjA5OTQgLT4gMC4zMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3OTEgc3F1YXJlcm9vdCAwLjk5NSAtPiAwLjk5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc5MiBzcXVhcmVyb290IDAuMDk5NSAtPiAwLjMxNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc5MyBzcXVhcmVyb290IDAuOTk2IC0+IDAuOTk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Nzk0IHNxdWFyZXJvb3QgMC4wOTk2IC0+IDAuMzE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Nzk1IHNxdWFyZXJvb3QgMC45OTcgLT4gMC45OTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3OTYgc3F1YXJlcm9vdCAwLjA5OTcgLT4gMC4zMTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3OTcgc3F1YXJlcm9vdCAwLjk5OCAtPiAwLjk5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc5OCBzcXVhcmVyb290IDAuMDk5OCAtPiAwLjMxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc5OSBzcXVhcmVyb290IDAuOTk5IC0+IDAuOTk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0ODAwIHNxdWFyZXJvb3QgMC4wOTk5IC0+IDAuMzE2ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gQSBncm91cCBvZiBwcmVjaXNpb24gNCB0ZXN0cyB3aGVyZSBIdWxsICYgQWJyaGFtIGFkanVzdG1lbnRzIGFyZQorLS0gbmVlZGVkIGluIHNvbWUgY2FzZXMgKGJvdGggdXAgYW5kIGRvd24pIFtzZWUgSHVsbDE5ODViXQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogICA0CitzcXR4NTAwMSBzcXVhcmVyb290IDAuMDExOCAgLT4gMC4xMDg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg1MDAyIHNxdWFyZXJvb3QgMC4xMTkgICAtPiAwLjM0NTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDUwMDMgc3F1YXJlcm9vdCAwLjAxMTkgIC0+IDAuMTA5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NTAwNCBzcXVhcmVyb290IDAuMTIxICAgLT4gMC4zNDc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg1MDA1IHNxdWFyZXJvb3QgMC4wMTIxICAtPiAwLjExCitzcXR4NTAwNiBzcXVhcmVyb290IDAuMTIyICAgLT4gMC4zNDkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg1MDA3IHNxdWFyZXJvb3QgMC4wMTIyICAtPiAwLjExMDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDUwMDggc3F1YXJlcm9vdCAwLjEyMyAgIC0+IDAuMzUwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NTAwOSBzcXVhcmVyb290IDAuNDk0ICAgLT4gMC43MDI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg1MDEwIHNxdWFyZXJvb3QgMC4wNjY5ICAtPiAwLjI1ODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDUwMTEgc3F1YXJlcm9vdCAwLjk1NTggIC0+IDAuOTc3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NTAxMiBzcXVhcmVyb290IDAuOTM0OCAgLT4gMC45NjY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg1MDEzIHNxdWFyZXJvb3QgMC45MzQ1ICAtPiAwLjk2NjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDUwMTQgc3F1YXJlcm9vdCAwLjA5MzQ1IC0+IDAuMzA1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NTAxNSBzcXVhcmVyb290IDAuOTM0NiAgLT4gMC45NjY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg1MDE2IHNxdWFyZXJvb3QgMC4wOTM0NiAtPiAwLjMwNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDUwMTcgc3F1YXJlcm9vdCAwLjkzNDcgIC0+IDAuOTY2OCAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjQXJpdGgKK3ByZWNpc2lvbjogOQorc3F0eDcwMCBzcXVhcmVyb290ICAwICAgICAgIC0+ICcwJworc3F0eDcwMSBzcXVhcmVyb290ICAtMCAgICAgIC0+ICctMCcKK3NxdHg3MDIgc3F1YXJlcm9vdCAgMC4zOSAgICAtPiAwLjYyNDQ5OTgwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg3MDMgc3F1YXJlcm9vdCAgMTAwICAgICAtPiAnMTAnCitzcXR4NzA0IHNxdWFyZXJvb3QgIDEuMDAgICAgLT4gJzEuMCcKK3NxdHg3MDUgc3F1YXJlcm9vdCAgNyAgICAgICAtPiAnMi42NDU3NTEzMScgICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg3MDYgc3F1YXJlcm9vdCAgMTAgICAgICAtPiAzLjE2MjI3NzY2ICAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBvbmUtb2ZmcworcHJlY2lzaW9uOiA5CitzcXR4NzExIHNxdWFyZXJvb3QgIDAuMSAgICAgLT4gMC4zMTYyMjc3NjYgICAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzEyIHNxdWFyZXJvb3QgIDAuMiAgICAgLT4gMC40NDcyMTM1OTUgICAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzEzIHNxdWFyZXJvb3QgIDAuMyAgICAgLT4gMC41NDc3MjI1NTggICAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzE0IHNxdWFyZXJvb3QgIDAuNCAgICAgLT4gMC42MzI0NTU1MzIgICAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzE1IHNxdWFyZXJvb3QgIDAuNSAgICAgLT4gMC43MDcxMDY3ODEgICAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzE2IHNxdWFyZXJvb3QgIDAuNiAgICAgLT4gMC43NzQ1OTY2NjkgICAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzE3IHNxdWFyZXJvb3QgIDAuNyAgICAgLT4gMC44MzY2NjAwMjcgICAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzE4IHNxdWFyZXJvb3QgIDAuOCAgICAgLT4gMC44OTQ0MjcxOTEgICAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzE5IHNxdWFyZXJvb3QgIDAuOSAgICAgLT4gMC45NDg2ODMyOTggICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEwICAgICAgICAgICAgICAgLS0gbm90ZSBubyBub3JtYWxpemF0b2luIGhlcmUKK3NxdHg3MjAgc3F1YXJlcm9vdCArMC4xICAgICAtPiAwLjMxNjIyNzc2NjAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTEKK3NxdHg3MjEgc3F1YXJlcm9vdCArMC4xICAgICAtPiAwLjMxNjIyNzc2NjAyICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTIKK3NxdHg3MjIgc3F1YXJlcm9vdCArMC4xICAgICAtPiAwLjMxNjIyNzc2NjAxNyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogOQorc3F0eDcyMyBzcXVhcmVyb290ICAwLjM5ICAgIC0+IDAuNjI0NDk5ODAwICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNQorc3F0eDcyNCBzcXVhcmVyb290ICAwLjM5ICAgIC0+IDAuNjI0NDk5Nzk5ODM5ODQwIEluZXhhY3QgUm91bmRlZAorCistLSBkaXNjdXNzaW9uIGNhc2VzCitwcmVjaXNpb246IDcKK3NxdHg3MzEgc3F1YXJlcm9vdCAgICAgOSAgIC0+ICAgMworc3F0eDczMiBzcXVhcmVyb290ICAgMTAwICAgLT4gIDEwCitzcXR4NzMzIHNxdWFyZXJvb3QgICAxMjMgICAtPiAgMTEuMDkwNTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDczNCBzcXVhcmVyb290ICAgMTQ0ICAgLT4gIDEyCitzcXR4NzM1IHNxdWFyZXJvb3QgICAxNTYgICAtPiAgMTIuNDkwMDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDczNiBzcXVhcmVyb290IDEwMDAwICAgLT4gMTAwCisKKy0tIHZhbHVlcyBjbG9zZSB0byBvdmVyZmxvdyAoaWYgdGhlcmUgd2VyZSBpbnB1dCByb3VuZGluZykKK21heGV4cG9uZW50OiA5OQorbWluZXhwb25lbnQ6IC05OQorcHJlY2lzaW9uOiA1CitzcXR4NzYwIHNxdWFyZXJvb3QgIDkuOTk5N0UrOTkgICAtPiA5Ljk5OThFKzQ5IEluZXhhY3QgUm91bmRlZAorc3F0eDc2MSBzcXVhcmVyb290ICA5Ljk5OThFKzk5ICAgLT4gOS45OTk5RSs0OSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg3NjIgc3F1YXJlcm9vdCAgOS45OTk5RSs5OSAgIC0+IDkuOTk5OUUrNDkgSW5leGFjdCBSb3VuZGVkCitzcXR4NzYzIHNxdWFyZXJvb3QgIDkuOTk5OTFFKzk5ICAtPiAxLjAwMDBFKzUwIEluZXhhY3QgUm91bmRlZAorc3F0eDc2NCBzcXVhcmVyb290ICA5Ljk5OTk0RSs5OSAgLT4gMS4wMDAwRSs1MCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg3NjUgc3F1YXJlcm9vdCAgOS45OTk5NUUrOTkgIC0+IDEuMDAwMEUrNTAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzY2IHNxdWFyZXJvb3QgIDkuOTk5OTlFKzk5ICAtPiAxLjAwMDBFKzUwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA5CitzcXR4NzcwIHNxdWFyZXJvb3QgIDkuOTk5N0UrOTkgICAtPiA5Ljk5OTg1MDAwRSs0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzcxIHNxdWFyZXJvb3QgIDkuOTk5OEUrOTkgICAtPiA5Ljk5OTkwMDAwRSs0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzcyIHNxdWFyZXJvb3QgIDkuOTk5OUUrOTkgICAtPiA5Ljk5OTk1MDAwRSs0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzczIHNxdWFyZXJvb3QgIDkuOTk5OTFFKzk5ICAtPiA5Ljk5OTk1NTAwRSs0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Nzc0IHNxdWFyZXJvb3QgIDkuOTk5OTRFKzk5ICAtPiA5Ljk5OTk3MDAwRSs0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Nzc1IHNxdWFyZXJvb3QgIDkuOTk5OTVFKzk5ICAtPiA5Ljk5OTk3NTAwRSs0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Nzc2IHNxdWFyZXJvb3QgIDkuOTk5OTlFKzk5ICAtPiA5Ljk5OTk5NTAwRSs0OSAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIwCitzcXR4NzgwIHNxdWFyZXJvb3QgIDkuOTk5N0UrOTkgICAtPiAnOS45OTk4NDk5OTg4NzQ5ODMxMjQ3RSs0OScgSW5leGFjdCBSb3VuZGVkCitzcXR4NzgxIHNxdWFyZXJvb3QgIDkuOTk5OEUrOTkgICAtPiAnOS45OTk4OTk5OTk0OTk5OTQ5OTk5RSs0OScgSW5leGFjdCBSb3VuZGVkCitzcXR4NzgyIHNxdWFyZXJvb3QgIDkuOTk5OUUrOTkgICAtPiAnOS45OTk5NDk5OTk4NzQ5OTkzNzUwRSs0OScgSW5leGFjdCBSb3VuZGVkCitzcXR4NzgzIHNxdWFyZXJvb3QgIDkuOTk5OTFFKzk5ICAtPiAnOS45OTk5NTQ5OTk4OTg3NDk1NDQ0RSs0OScgSW5leGFjdCBSb3VuZGVkCitzcXR4Nzg0IHNxdWFyZXJvb3QgIDkuOTk5OTRFKzk5ICAtPiAnOS45OTk5Njk5OTk5NTQ5OTk4NjUwRSs0OScgSW5leGFjdCBSb3VuZGVkCitzcXR4Nzg1IHNxdWFyZXJvb3QgIDkuOTk5OTVFKzk5ICAtPiAnOS45OTk5NzQ5OTk5Njg3NDk5MjE5RSs0OScgSW5leGFjdCBSb3VuZGVkCitzcXR4Nzg2IHNxdWFyZXJvb3QgIDkuOTk5OTlFKzk5ICAtPiAnOS45OTk5OTQ5OTk5OTg3NDk5OTk0RSs0OScgSW5leGFjdCBSb3VuZGVkCisKKy0tIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvd3MgW3RoZXNlIGNhbiBvbmx5IHJlc3VsdCB3aGVuIGVNYXggaXMgPCBkaWdpdHMrMV0KKy0tIEV0aW55ID0gLShFbWF4ICsgKHByZWNpc2lvbi0xKSkKKy0tIHN0YXJ0IHdpdGggc3Vibm9ybWFsIG9wZXJhbmRzIGFuZCBub3JtYWwgcmVzdWx0cworbWF4ZXhwb25lbnQ6IDkKK21pbmV4cG9uZW50OiAtOQorcHJlY2lzaW9uOiA5ICAgICAgICAgICAgICAgIC0tIEV0aW55PS0xNworc3F0eDgwMCBzcXVhcmVyb290ICAxRS0xNyAgIC0+IDMuMTYyMjc3NjZFLTkgSW5leGFjdCBSb3VuZGVkCitzcXR4ODAxIHNxdWFyZXJvb3QgMTBFLTE3ICAgLT4gMS4wRS04CitwcmVjaXNpb246IDEwICAgICAgICAgICAgICAgLS0gRXRpbnk9LTE4CitzcXR4ODAyIHNxdWFyZXJvb3QgMTBFLTE4ICAgLT4gMy4xNjIyNzc2NjBFLTkgSW5leGFjdCBSb3VuZGVkCitzcXR4ODAzIHNxdWFyZXJvb3QgIDFFLTE4ICAgLT4gMUUtOQorCitwcmVjaXNpb246IDExICAgICAgICAgICAgICAgLS0gRXRpbnk9LTE5CitzcXR4ODA0IHNxdWFyZXJvb3QgIDFFLTE5ICAgLT4gMy4xNjIyNzc2NjBFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODA1IHNxdWFyZXJvb3QgMTBFLTE5ICAgLT4gMS4wRS05ICAgICAgICAgICAgLS0gZXhhY3QKK3ByZWNpc2lvbjogMTIgICAgICAgICAgICAgICAtLSBFdGlueT0tMjAKK3NxdHg4MDYgc3F1YXJlcm9vdCAxMEUtMjAgICAtPiAzLjE2MjI3NzY2MDJFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODA3IHNxdWFyZXJvb3QgIDFFLTIwICAgLT4gMUUtMTAgU3Vibm9ybWFsICAgLS0gZXhhY3QgU3Vibm9ybWFsIGNhc2UKKworcHJlY2lzaW9uOiAxMyAgICAgICAgICAgICAgIC0tIEV0aW55PS0yMQorc3F0eDgwOCBzcXVhcmVyb290ICAxRS0yMSAgIC0+IDMuMTYyMjc3NjYwMkUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MDkgc3F1YXJlcm9vdCAxMEUtMjEgICAtPiAxLjBFLTEwIFN1Ym5vcm1hbCAtLSBleGFjdCBTdWJub3JtYWwgY2FzZQorcHJlY2lzaW9uOiAxNCAgICAgICAgICAgICAgIC0tIEV0aW55PS0yMgorc3F0eDgxMCBzcXVhcmVyb290ICAxRS0yMSAgIC0+IDMuMTYyMjc3NjYwMTdFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODExIHNxdWFyZXJvb3QgMTBFLTIyICAgLT4gMy4xNjIyNzc2NjAxN0UtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MTIgc3F1YXJlcm9vdCAgMUUtMjIgICAtPiAxRS0xMSBTdWJub3JtYWwgICAtLSBleGFjdCBTdWJub3JtYWwgY2FzZQorCistLSBOb3QgZW5vdWdoIGRpZ2l0cz8KK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK3NxdHg4MTUgc3F1YXJlcm9vdCAxLjAwMDAwMDAwMDEwMDAwMDBFLTc4ICAtPiAxLjAwMDAwMDAwMDA1MDAwMEUtMzkgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAyMzQ1Njc4OTAxMjM0NTYKKworLS0gc3BlY2lhbCB2YWx1ZXMKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitzcXR4ODIwIHNxdWFyZXJvb3QgICBJbmYgICAgLT4gSW5maW5pdHkKK3NxdHg4MjEgc3F1YXJlcm9vdCAgLUluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHg4MjIgc3F1YXJlcm9vdCAgIE5hTiAgICAtPiBOYU4KK3NxdHg4MjMgc3F1YXJlcm9vdCAgc05hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHByb3BhZ2F0aW5nIE5hTnMKK3NxdHg4MjQgc3F1YXJlcm9vdCAgc05hTjEyMyAtPiAgTmFOMTIzIEludmFsaWRfb3BlcmF0aW9uCitzcXR4ODI1IHNxdWFyZXJvb3QgLXNOYU4zMjEgLT4gLU5hTjMyMSBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDgyNiBzcXVhcmVyb290ICAgTmFONDU2IC0+ICBOYU40NTYKK3NxdHg4Mjcgc3F1YXJlcm9vdCAgLU5hTjY1NCAtPiAtTmFONjU0CitzcXR4ODI4IHNxdWFyZXJvb3QgICBOYU4xICAgLT4gIE5hTjEKKworLS0gcGF5bG9hZCBkZWNhcGl0YXRlCitwcmVjaXNpb246IDUKK3NxdHg4NDAgc3F1YXJlcm9vdCAtc05hTjEyMzQ1Njc4OTAgLT4gLU5hTjY3ODkwICBJbnZhbGlkX29wZXJhdGlvbgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tCistLSBTcGVjaWFsIHRoYW5rcyB0byBNYXJrIERpY2tpbnNvbiBmb3IgdGVzdHMgaW4gdGhlIHJhbmdlIDgwMDAtODk5OS4KKy0tCistLSBFeHRyYSB0ZXN0cyBmb3IgdGhlIHNxdWFyZSByb290IGZ1bmN0aW9uLCBkZWFsaW5nIHdpdGggYSB2YXJpZXR5IG9mCistLSBjb3JuZXIgY2FzZXMuICBJbiBwYXJ0aWN1bGFyLCB0aGVzZSB0ZXN0cyBjb25jZW50cmF0ZSBvbgorLS0gICAoMSkgY2FzZXMgd2hlcmUgdGhlIGlucHV0IHByZWNpc2lvbiBleGNlZWRzIHRoZSBjb250ZXh0IHByZWNpc2lvbiwgYW5kCistLSAgICgyKSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQgZXhwb25lbnQgaXMgb3V0c2lkZSB0aGUgY3VycmVudCBjb250ZXh0LAorLS0gICAgICAgYW5kIGluIHBhcnRpY3VsYXIgd2hlbiB0aGUgcmVzdWx0IGlzIHN1Ym5vcm1hbAorLS0KKy0tIG1heGV4cG9uZW50IGFuZCBtaW5leHBvbmVudCBhcmUgc2V0IHRvIDkgYW5kIC05IGZvciBtb3N0IG9mIHRoZXNlCistLSBjYXNlczsgb25seSB0aGUgcHJlY2lzaW9uIGNoYW5nZXMuICBUaGUgcm91bmRpbmcgYWxzbyBkb2VzIG5vdAorLS0gY2hhbmdlLCBiZWNhdXNlIGl0IGlzIGlnbm9yZWQgZm9yIHRoaXMgb3BlcmF0aW9uLgorbWF4ZXhwb25lbnQ6IDkKK21pbmV4cG9uZW50OiAtOQorCistLSBleGFjdCByZXN1bHRzLCBpbnB1dCBwcmVjaXNpb24gPiBjb250ZXh0IHByZWNpc2lvbgorcHJlY2lzaW9uOiAxCitzcXR4ODAwMCBzcXVhcmVyb290IDAgLT4gMAorc3F0eDgwMDEgc3F1YXJlcm9vdCAxIC0+IDEKK3NxdHg4MDAyIHNxdWFyZXJvb3QgNCAtPiAyCitzcXR4ODAwMyBzcXVhcmVyb290IDkgLT4gMworc3F0eDgwMDQgc3F1YXJlcm9vdCAxNiAtPiA0CitzcXR4ODAwNSBzcXVhcmVyb290IDI1IC0+IDUKK3NxdHg4MDA2IHNxdWFyZXJvb3QgMzYgLT4gNgorc3F0eDgwMDcgc3F1YXJlcm9vdCA0OSAtPiA3CitzcXR4ODAwOCBzcXVhcmVyb290IDY0IC0+IDgKK3NxdHg4MDA5IHNxdWFyZXJvb3QgODEgLT4gOQorc3F0eDgwMTAgc3F1YXJlcm9vdCAxMDAgLT4gMUUrMSBSb3VuZGVkCitzcXR4ODAxMSBzcXVhcmVyb290IDEyMSAtPiAxRSsxIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDIKK3NxdHg4MDEyIHNxdWFyZXJvb3QgMCAtPiAwCitzcXR4ODAxMyBzcXVhcmVyb290IDEgLT4gMQorc3F0eDgwMTQgc3F1YXJlcm9vdCA0IC0+IDIKK3NxdHg4MDE1IHNxdWFyZXJvb3QgOSAtPiAzCitzcXR4ODAxNiBzcXVhcmVyb290IDE2IC0+IDQKK3NxdHg4MDE3IHNxdWFyZXJvb3QgMjUgLT4gNQorc3F0eDgwMTggc3F1YXJlcm9vdCAzNiAtPiA2CitzcXR4ODAxOSBzcXVhcmVyb290IDQ5IC0+IDcKK3NxdHg4MDIwIHNxdWFyZXJvb3QgNjQgLT4gOAorc3F0eDgwMjEgc3F1YXJlcm9vdCA4MSAtPiA5CitzcXR4ODAyMiBzcXVhcmVyb290IDEwMCAtPiAxMAorc3F0eDgwMjMgc3F1YXJlcm9vdCAxMjEgLT4gMTEKK3NxdHg4MDI0IHNxdWFyZXJvb3QgMTQ0IC0+IDEyCitzcXR4ODAyNSBzcXVhcmVyb290IDE2OSAtPiAxMworc3F0eDgwMjYgc3F1YXJlcm9vdCAxOTYgLT4gMTQKK3NxdHg4MDI3IHNxdWFyZXJvb3QgMjI1IC0+IDE1CitzcXR4ODAyOCBzcXVhcmVyb290IDI1NiAtPiAxNgorc3F0eDgwMjkgc3F1YXJlcm9vdCAyODkgLT4gMTcKK3NxdHg4MDMwIHNxdWFyZXJvb3QgMzI0IC0+IDE4CitzcXR4ODAzMSBzcXVhcmVyb290IDM2MSAtPiAxOQorc3F0eDgwMzIgc3F1YXJlcm9vdCA0MDAgLT4gMjAKK3NxdHg4MDMzIHNxdWFyZXJvb3QgNDQxIC0+IDIxCitzcXR4ODAzNCBzcXVhcmVyb290IDQ4NCAtPiAyMgorc3F0eDgwMzUgc3F1YXJlcm9vdCA1MjkgLT4gMjMKK3NxdHg4MDM2IHNxdWFyZXJvb3QgNTc2IC0+IDI0CitzcXR4ODAzNyBzcXVhcmVyb290IDYyNSAtPiAyNQorc3F0eDgwMzggc3F1YXJlcm9vdCA2NzYgLT4gMjYKK3NxdHg4MDM5IHNxdWFyZXJvb3QgNzI5IC0+IDI3CitzcXR4ODA0MCBzcXVhcmVyb290IDc4NCAtPiAyOAorc3F0eDgwNDEgc3F1YXJlcm9vdCA4NDEgLT4gMjkKK3NxdHg4MDQyIHNxdWFyZXJvb3QgOTAwIC0+IDMwCitzcXR4ODA0MyBzcXVhcmVyb290IDk2MSAtPiAzMQorc3F0eDgwNDQgc3F1YXJlcm9vdCAxMDI0IC0+IDMyCitzcXR4ODA0NSBzcXVhcmVyb290IDEwODkgLT4gMzMKK3NxdHg4MDQ2IHNxdWFyZXJvb3QgMTE1NiAtPiAzNAorc3F0eDgwNDcgc3F1YXJlcm9vdCAxMjI1IC0+IDM1CitzcXR4ODA0OCBzcXVhcmVyb290IDEyOTYgLT4gMzYKK3NxdHg4MDQ5IHNxdWFyZXJvb3QgMTM2OSAtPiAzNworc3F0eDgwNTAgc3F1YXJlcm9vdCAxNDQ0IC0+IDM4CitzcXR4ODA1MSBzcXVhcmVyb290IDE1MjEgLT4gMzkKK3NxdHg4MDUyIHNxdWFyZXJvb3QgMTYwMCAtPiA0MAorc3F0eDgwNTMgc3F1YXJlcm9vdCAxNjgxIC0+IDQxCitzcXR4ODA1NCBzcXVhcmVyb290IDE3NjQgLT4gNDIKK3NxdHg4MDU1IHNxdWFyZXJvb3QgMTg0OSAtPiA0Mworc3F0eDgwNTYgc3F1YXJlcm9vdCAxOTM2IC0+IDQ0CitzcXR4ODA1NyBzcXVhcmVyb290IDIwMjUgLT4gNDUKK3NxdHg4MDU4IHNxdWFyZXJvb3QgMjExNiAtPiA0Ngorc3F0eDgwNTkgc3F1YXJlcm9vdCAyMjA5IC0+IDQ3CitzcXR4ODA2MCBzcXVhcmVyb290IDIzMDQgLT4gNDgKK3NxdHg4MDYxIHNxdWFyZXJvb3QgMjQwMSAtPiA0OQorc3F0eDgwNjIgc3F1YXJlcm9vdCAyNTAwIC0+IDUwCitzcXR4ODA2MyBzcXVhcmVyb290IDI2MDEgLT4gNTEKK3NxdHg4MDY0IHNxdWFyZXJvb3QgMjcwNCAtPiA1Mgorc3F0eDgwNjUgc3F1YXJlcm9vdCAyODA5IC0+IDUzCitzcXR4ODA2NiBzcXVhcmVyb290IDI5MTYgLT4gNTQKK3NxdHg4MDY3IHNxdWFyZXJvb3QgMzAyNSAtPiA1NQorc3F0eDgwNjggc3F1YXJlcm9vdCAzMTM2IC0+IDU2CitzcXR4ODA2OSBzcXVhcmVyb290IDMyNDkgLT4gNTcKK3NxdHg4MDcwIHNxdWFyZXJvb3QgMzM2NCAtPiA1OAorc3F0eDgwNzEgc3F1YXJlcm9vdCAzNDgxIC0+IDU5CitzcXR4ODA3MiBzcXVhcmVyb290IDM2MDAgLT4gNjAKK3NxdHg4MDczIHNxdWFyZXJvb3QgMzcyMSAtPiA2MQorc3F0eDgwNzQgc3F1YXJlcm9vdCAzODQ0IC0+IDYyCitzcXR4ODA3NSBzcXVhcmVyb290IDM5NjkgLT4gNjMKK3NxdHg4MDc2IHNxdWFyZXJvb3QgNDA5NiAtPiA2NAorc3F0eDgwNzcgc3F1YXJlcm9vdCA0MjI1IC0+IDY1CitzcXR4ODA3OCBzcXVhcmVyb290IDQzNTYgLT4gNjYKK3NxdHg4MDc5IHNxdWFyZXJvb3QgNDQ4OSAtPiA2Nworc3F0eDgwODAgc3F1YXJlcm9vdCA0NjI0IC0+IDY4CitzcXR4ODA4MSBzcXVhcmVyb290IDQ3NjEgLT4gNjkKK3NxdHg4MDgyIHNxdWFyZXJvb3QgNDkwMCAtPiA3MAorc3F0eDgwODMgc3F1YXJlcm9vdCA1MDQxIC0+IDcxCitzcXR4ODA4NCBzcXVhcmVyb290IDUxODQgLT4gNzIKK3NxdHg4MDg1IHNxdWFyZXJvb3QgNTMyOSAtPiA3Mworc3F0eDgwODYgc3F1YXJlcm9vdCA1NDc2IC0+IDc0CitzcXR4ODA4NyBzcXVhcmVyb290IDU2MjUgLT4gNzUKK3NxdHg4MDg4IHNxdWFyZXJvb3QgNTc3NiAtPiA3Ngorc3F0eDgwODkgc3F1YXJlcm9vdCA1OTI5IC0+IDc3CitzcXR4ODA5MCBzcXVhcmVyb290IDYwODQgLT4gNzgKK3NxdHg4MDkxIHNxdWFyZXJvb3QgNjI0MSAtPiA3OQorc3F0eDgwOTIgc3F1YXJlcm9vdCA2NDAwIC0+IDgwCitzcXR4ODA5MyBzcXVhcmVyb290IDY1NjEgLT4gODEKK3NxdHg4MDk0IHNxdWFyZXJvb3QgNjcyNCAtPiA4Mgorc3F0eDgwOTUgc3F1YXJlcm9vdCA2ODg5IC0+IDgzCitzcXR4ODA5NiBzcXVhcmVyb290IDcwNTYgLT4gODQKK3NxdHg4MDk3IHNxdWFyZXJvb3QgNzIyNSAtPiA4NQorc3F0eDgwOTggc3F1YXJlcm9vdCA3Mzk2IC0+IDg2CitzcXR4ODA5OSBzcXVhcmVyb290IDc1NjkgLT4gODcKK3NxdHg4MTAwIHNxdWFyZXJvb3QgNzc0NCAtPiA4OAorc3F0eDgxMDEgc3F1YXJlcm9vdCA3OTIxIC0+IDg5CitzcXR4ODEwMiBzcXVhcmVyb290IDgxMDAgLT4gOTAKK3NxdHg4MTAzIHNxdWFyZXJvb3QgODI4MSAtPiA5MQorc3F0eDgxMDQgc3F1YXJlcm9vdCA4NDY0IC0+IDkyCitzcXR4ODEwNSBzcXVhcmVyb290IDg2NDkgLT4gOTMKK3NxdHg4MTA2IHNxdWFyZXJvb3QgODgzNiAtPiA5NAorc3F0eDgxMDcgc3F1YXJlcm9vdCA5MDI1IC0+IDk1CitzcXR4ODEwOCBzcXVhcmVyb290IDkyMTYgLT4gOTYKK3NxdHg4MTA5IHNxdWFyZXJvb3QgOTQwOSAtPiA5Nworc3F0eDgxMTAgc3F1YXJlcm9vdCA5NjA0IC0+IDk4CitzcXR4ODExMSBzcXVhcmVyb290IDk4MDEgLT4gOTkKK3NxdHg4MTEyIHNxdWFyZXJvb3QgMTAwMDAgLT4gMS4wRSsyIFJvdW5kZWQKK3NxdHg4MTEzIHNxdWFyZXJvb3QgMTAyMDEgLT4gMS4wRSsyIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDMKK3NxdHg4MTE0IHNxdWFyZXJvb3QgODQxIC0+IDI5CitzcXR4ODExNSBzcXVhcmVyb290IDE2MDAgLT4gNDAKK3NxdHg4MTE2IHNxdWFyZXJvb3QgMjIwOSAtPiA0Nworc3F0eDgxMTcgc3F1YXJlcm9vdCA5NjA0IC0+IDk4CitzcXR4ODExOCBzcXVhcmVyb290IDIxMzE2IC0+IDE0Ngorc3F0eDgxMTkgc3F1YXJlcm9vdCA1MjQ0MSAtPiAyMjkKK3NxdHg4MTIwIHNxdWFyZXJvb3QgNjg2NDQgLT4gMjYyCitzcXR4ODEyMSBzcXVhcmVyb290IDY5Njk2IC0+IDI2NAorc3F0eDgxMjIgc3F1YXJlcm9vdCA3MDIyNSAtPiAyNjUKK3NxdHg4MTIzIHNxdWFyZXJvb3QgNzY3MjkgLT4gMjc3CitzcXR4ODEyNCBzcXVhcmVyb290IDEzMDMyMSAtPiAzNjEKK3NxdHg4MTI1IHNxdWFyZXJvb3QgMTcxMzk2IC0+IDQxNAorc3F0eDgxMjYgc3F1YXJlcm9vdCAyNzA0MDAgLT4gNTIwCitzcXR4ODEyNyBzcXVhcmVyb290IDI3OTg0MSAtPiA1MjkKK3NxdHg4MTI4IHNxdWFyZXJvb3QgNDA3MDQ0IC0+IDYzOAorc3F0eDgxMjkgc3F1YXJlcm9vdCA0MDgzMjEgLT4gNjM5CitzcXR4ODEzMCBzcXVhcmVyb290IDQ4MDI0OSAtPiA2OTMKK3NxdHg4MTMxIHNxdWFyZXJvb3QgNTE2OTYxIC0+IDcxOQorc3F0eDgxMzIgc3F1YXJlcm9vdCA2OTIyMjQgLT4gODMyCitzcXR4ODEzMyBzcXVhcmVyb290IDgyOTkyMSAtPiA5MTEKKworLS0gc2VsZWN0aW9uIG9mIHJhbmRvbSBleGFjdCByZXN1bHRzCitwcmVjaXNpb246IDYKK3NxdHg4MTM0IHNxdWFyZXJvb3QgMi4yNUUtMTIgLT4gMC4wMDAwMDE1CitzcXR4ODEzNSBzcXVhcmVyb290IDguNDFFLTE0IC0+IDIuOUUtNworc3F0eDgxMzYgc3F1YXJlcm9vdCA2LjI0MUUtMTUgLT4gNy45RS04CitzcXR4ODEzNyBzcXVhcmVyb290IDUuMDQxRSsxMyAtPiA3LjFFKzYKK3NxdHg4MTM4IHNxdWFyZXJvb3QgNDc2MSAtPiA2OQorc3F0eDgxMzkgc3F1YXJlcm9vdCAxLjM2OUUrMTcgLT4gMy43RSs4CitzcXR4ODE0MCBzcXVhcmVyb290IDAuMDAwMDIxMTYgLT4gMC4wMDQ2CitzcXR4ODE0MSBzcXVhcmVyb290IDcuMjlFKzQgLT4gMi43RSsyCitzcXR4ODE0MiBzcXVhcmVyb290IDQuNjI0RS0xMyAtPiA2LjhFLTcKK3NxdHg4MTQzIHNxdWFyZXJvb3QgMy45NjlFKzUgLT4gNi4zRSsyCitzcXR4ODE0NCBzcXVhcmVyb290IDMuNzMzMjFFLTExIC0+IDAuMDAwMDA2MTEKK3NxdHg4MTQ1IHNxdWFyZXJvb3QgNS42MTAwMUUrMTcgLT4gNy40OUUrOAorc3F0eDgxNDYgc3F1YXJlcm9vdCAyLjMwNDAwRS0xMSAtPiAwLjAwMDAwNDgwCitzcXR4ODE0NyBzcXVhcmVyb290IDQuMzAzMzZFKzE3IC0+IDYuNTZFKzgKK3NxdHg4MTQ4IHNxdWFyZXJvb3QgMC4wNTcxMjEgLT4gMC4yMzkKK3NxdHg4MTQ5IHNxdWFyZXJvb3QgNy4yMjVFKzE3IC0+IDguNUUrOAorc3F0eDgxNTAgc3F1YXJlcm9vdCAzLjE0NzIxRSsxMyAtPiA1LjYxRSs2CitzcXR4ODE1MSBzcXVhcmVyb290IDQuNjEwNDFFKzE3IC0+IDYuNzlFKzgKK3NxdHg4MTUyIHNxdWFyZXJvb3QgMS4zOTg3NkUtMTUgLT4gMy43NEUtOAorc3F0eDgxNTMgc3F1YXJlcm9vdCA2LjE5MzY5RS05IC0+IDAuMDAwMDc4Nworc3F0eDgxNTQgc3F1YXJlcm9vdCAxLjYyMDUyOUUtMTAgLT4gMC4wMDAwMTI3Mworc3F0eDgxNTUgc3F1YXJlcm9vdCAxMTc3LjE3NjEgLT4gMzQuMzEKK3NxdHg4MTU2IHNxdWFyZXJvb3QgNjcwNDMzNDQgLT4gODE4OAorc3F0eDgxNTcgc3F1YXJlcm9vdCA0Ljg0RSs2IC0+IDIuMkUrMworc3F0eDgxNTggc3F1YXJlcm9vdCAxLjIzOTA0RSsxMSAtPiAzLjUyRSs1CitzcXR4ODE1OSBzcXVhcmVyb290IDMyNjA0MTAwIC0+IDU3MTAKK3NxdHg4MTYwIHNxdWFyZXJvb3QgMi45NzU3MDI1RS0xMSAtPiAwLjAwMDAwNTQ1NQorc3F0eDgxNjEgc3F1YXJlcm9vdCA2LjM3NjAyMjVFLTkgLT4gMC4wMDAwNzk4NQorc3F0eDgxNjIgc3F1YXJlcm9vdCA0LjUxOTg3MjlFLTExIC0+IDAuMDAwMDA2NzIzCitzcXR4ODE2MyBzcXVhcmVyb290IDEuNDc0NTYwMEUtMTEgLT4gMC4wMDAwMDM4NDAKK3NxdHg4MTY0IHNxdWFyZXJvb3QgMTg5NjQyODMuMDQgLT4gNDM1NC44CitzcXR4ODE2NSBzcXVhcmVyb290IDMuMzA4ODk1NTI5RSsxMyAtPiA1Ljc1MjNFKzYKK3NxdHg4MTY2IHNxdWFyZXJvb3QgMC4wMDI4NTkwNDA5IC0+IDAuMDUzNDcKK3NxdHg4MTY3IHNxdWFyZXJvb3QgMzU3Mi4yMTM4MjQgLT4gNTkuNzY4CitzcXR4ODE2OCBzcXVhcmVyb290IDQuMjc0MDIxMzc2RSsxNSAtPiA2LjUzNzZFKzcKK3NxdHg4MTY5IHNxdWFyZXJvb3QgNDQ1NTQ3Ni42NCAtPiAyMTEwLjgKK3NxdHg4MTcwIHNxdWFyZXJvb3QgMzguNDQgLT4gNi4yCitzcXR4ODE3MSBzcXVhcmVyb290IDY4LjU1ODQwMCAtPiA4LjI4MAorc3F0eDgxNzIgc3F1YXJlcm9vdCA3MTU0MDIwMDkgLT4gMjY3NDcKK3NxdHg4MTczIHNxdWFyZXJvb3QgOTMuMzczNTY5IC0+IDkuNjYzCitzcXR4ODE3NCBzcXVhcmVyb290IDIuNjIxNDQwMDAwMDBFKzE1IC0+IDUuMTIwMDBFKzcKK3NxdHg4MTc1IHNxdWFyZXJvb3QgNy40ODIyNTAwMDAwMEUrMTUgLT4gOC42NTAwMEUrNworc3F0eDgxNzYgc3F1YXJlcm9vdCAzLjM4NzI0MDAwMDAwRS05IC0+IDAuMDAwMDU4MjAwMAorc3F0eDgxNzcgc3F1YXJlcm9vdCA1LjY0MDAxMDAwMDAwRS0xMyAtPiA3LjUxMDAwRS03CitzcXR4ODE3OCBzcXVhcmVyb290IDUuMDY5NDQwMDAwMDBFLTE1IC0+IDcuMTIwMDBFLTgKK3NxdHg4MTc5IHNxdWFyZXJvb3QgNC45NTYxNjAwMDAwMEUrMTcgLT4gNy4wNDAwMEUrOAorc3F0eDgxODAgc3F1YXJlcm9vdCAwLjAwMDAyNDIwNjQwMDAwMDAgLT4gMC4wMDQ5MjAwMAorc3F0eDgxODEgc3F1YXJlcm9vdCAxLjQ4OTk2MDAwMDAwRS0xNSAtPiAzLjg2MDAwRS04CitzcXR4ODE4MiBzcXVhcmVyb290IDkuMzcwMjQwMDAwMDBFKzE3IC0+IDkuNjgwMDBFKzgKK3NxdHg4MTgzIHNxdWFyZXJvb3QgNzEyODkwMC4wMDAwIC0+IDI2NzAuMDAKK3NxdHg4MTg0IHNxdWFyZXJvb3QgOC4yMzExNjEwMDAwRS0xMCAtPiAwLjAwMDAyODY5MDAKK3NxdHg4MTg1IHNxdWFyZXJvb3QgNDgyNzQ3MDQwMDAwIC0+IDY5NDgwMAorc3F0eDgxODYgc3F1YXJlcm9vdCA0LjE0NDc4NDQwMDAwRSsxNyAtPiA2LjQzODAwRSs4CitzcXR4ODE4NyBzcXVhcmVyb290IDUuMTA1MTAyNTAwMDBFLTcgLT4gMC4wMDA3MTQ1MDAKK3NxdHg4MTg4IHNxdWFyZXJvb3QgMzU1MDk2LjgxMDAwMCAtPiA1OTUuOTAwCitzcXR4ODE4OSBzcXVhcmVyb290IDE0Mjg4NDAwLjAwMDAgLT4gMzc4MC4wMAorc3F0eDgxOTAgc3F1YXJlcm9vdCAzLjM2MTY4MDQwMDAwRS0xNSAtPiA1Ljc5ODAwRS04CitzcXR4ODE5MSBzcXVhcmVyb290IDEuNzA4OTk1NjAwMDBFLTEzIC0+IDQuMTM0MDBFLTcKK3NxdHg4MTkyIHNxdWFyZXJvb3QgMC4wMDAwMzc4MzQ4MDEwMDAwIC0+IDAuMDA2MTUxMDAKK3NxdHg4MTkzIHNxdWFyZXJvb3QgMi4wMDk3Mjg5MDAwMEUtMTMgLT4gNC40ODMwMEUtNworc3F0eDgxOTQgc3F1YXJlcm9vdCA0LjA3MjIyNjU5NjAwRS0xMyAtPiA2LjM4MTQwRS03CitzcXR4ODE5NSBzcXVhcmVyb290IDEzMTQ4NjAxMjEwMCAtPiAzNjI2MTAKK3NxdHg4MTk2IHNxdWFyZXJvb3QgODE4MTkyNjExNjAwIC0+IDkwNDU0MAorc3F0eDgxOTcgc3F1YXJlcm9vdCA5Ljg1NTgzMjM2MDBFKzE2IC0+IDMuMTM5NDBFKzgKK3NxdHg4MTk4IHNxdWFyZXJvb3QgNTY0MS4wNjE0NDkwMCAtPiA3NS4xMDcwCitzcXR4ODE5OSBzcXVhcmVyb290IDQuNTg3ODk0NzU2MDBFKzE3IC0+IDYuNzczNDBFKzgKK3NxdHg4MjAwIHNxdWFyZXJvb3QgMy4yMTM4Njk0ODEwMEUtOSAtPiAwLjAwMDA1NjY5MTAKK3NxdHg4MjAxIHNxdWFyZXJvb3QgMy45NDQxOTYwMDAwRS04IC0+IDAuMDAwMTk4NjAwCitzcXR4ODIwMiBzcXVhcmVyb290IDI0MjcyMy43Mjg5MDAgLT4gNDkyLjY3MAorc3F0eDgyMDMgc3F1YXJlcm9vdCAxODc0Ljg5MDAwMDAwIC0+IDQzLjMwMDAKK3NxdHg4MjA0IHNxdWFyZXJvb3QgMi41NjcyMjU5NTY4NEUrMTUgLT4gNS4wNjY3OEUrNworc3F0eDgyMDUgc3F1YXJlcm9vdCAzLjk2NDM3NzE0Njg5RS0xNyAtPiA2LjI5NjMzRS05CitzcXR4ODIwNiBzcXVhcmVyb290IDMuODAxMDY3NzQ3ODRFLTE3IC0+IDYuMTY1MjhFLTkKK3NxdHg4MjA3IHNxdWFyZXJvb3QgMS40MjQwMzU4ODQ5NkUtMTMgLT4gMy43NzM2NEUtNworc3F0eDgyMDggc3F1YXJlcm9vdCA0NjA0Ljg0Mzg4MTAwIC0+IDY3Ljg1OTAKK3NxdHg4MjA5IHNxdWFyZXJvb3QgMjE1NzEwMDg2OS4xNiAtPiA0NjQ0NC42CitzcXR4ODIxMCBzcXVhcmVyb290IDM1NTI4ODU3MC44MSAtPiAxODg0OS4xCitzcXR4ODIxMSBzcXVhcmVyb290IDQuNjk3NzU5MDE2MDRFLTExIC0+IDAuMDAwMDA2ODU0MDIKK3NxdHg4MjEyIHNxdWFyZXJvb3QgOC4yMjExNTc3MDQzNkUrMTcgLT4gOS4wNjcwNkUrOAorc3F0eDgyMTMgc3F1YXJlcm9vdCA3LjE2NDQzNzQ0OTAwRSsxNSAtPiA4LjQ2NDMwRSs3CitzcXR4ODIxNCBzcXVhcmVyb290IDkuNDg5OTU0OTg4OTZFKzE1IC0+IDkuNzQxNjRFKzcKK3NxdHg4MjE1IHNxdWFyZXJvb3QgMC4wMDAwNDE5MDkxODAxMTI5IC0+IDAuMDA2NDczNzMKK3NxdHg4MjE2IHNxdWFyZXJvb3QgNTg2MjYyNzk5Ni44NCAtPiA3NjU2Ny44CitzcXR4ODIxNyBzcXVhcmVyb290IDkzNjk1MzcuMzQwOSAtPiAzMDYwLjk3CitzcXR4ODIxOCBzcXVhcmVyb290IDcuNzQ3OTI1Mjk3MjlFKzE3IC0+IDguODAyMjNFKzgKK3NxdHg4MjE5IHNxdWFyZXJvb3QgMS4wODYyNjkzMTM5NkUrMTcgLT4gMy4yOTU4NkUrOAorc3F0eDgyMjAgc3F1YXJlcm9vdCA4Ljg5NTg0NzM5Njg0RS03IC0+IDAuMDAwOTQzMTc4CitzcXR4ODIyMSBzcXVhcmVyb290IDQuMDI2NjA0MDg5NkUtMTggLT4gMi4wMDY2NEUtOQorc3F0eDgyMjIgc3F1YXJlcm9vdCA5LjI3NjY5NDgwMzM2RS03IC0+IDAuMDAwOTYzMTU2CitzcXR4ODIyMyBzcXVhcmVyb290IDAuMDAyMjU0OTc3MTc5NTYgLT4gMC4wNDc0ODY2CisKKy0tIHRlc3QgdXNlIG9mIHJvdW5kLWhhbGYtZXZlbiBmb3IgdGllcworcHJlY2lzaW9uOiAxCitzcXR4ODIyNCBzcXVhcmVyb290IDIyNSAtPiAyRSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDgyMjUgc3F1YXJlcm9vdCA2MjUgLT4gMkUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjI2IHNxdWFyZXJvb3QgMTIyNSAtPiA0RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDgyMjcgc3F1YXJlcm9vdCAyMDI1IC0+IDRFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODIyOCBzcXVhcmVyb290IDMwMjUgLT4gNkUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjI5IHNxdWFyZXJvb3QgNDIyNSAtPiA2RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDgyMzAgc3F1YXJlcm9vdCA1NjI1IC0+IDhFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODIzMSBzcXVhcmVyb290IDcyMjUgLT4gOEUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjMyIHNxdWFyZXJvb3QgOTAyNSAtPiAxRSsyIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDIKK3NxdHg4MjMzIHNxdWFyZXJvb3QgMTEwMjUgLT4gMS4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyMzQgc3F1YXJlcm9vdCAxMzIyNSAtPiAxLjJFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODIzNSBzcXVhcmVyb290IDE1NjI1IC0+IDEuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjM2IHNxdWFyZXJvb3QgMTgyMjUgLT4gMS40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyMzcgc3F1YXJlcm9vdCAyMTAyNSAtPiAxLjRFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODIzOCBzcXVhcmVyb290IDI0MDI1IC0+IDEuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjM5IHNxdWFyZXJvb3QgMjcyMjUgLT4gMS42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNDAgc3F1YXJlcm9vdCAzMDYyNSAtPiAxLjhFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODI0MSBzcXVhcmVyb290IDM0MjI1IC0+IDEuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjQyIHNxdWFyZXJvb3QgMzgwMjUgLT4gMi4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNDMgc3F1YXJlcm9vdCA0MjAyNSAtPiAyLjBFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODI0NCBzcXVhcmVyb290IDQ2MjI1IC0+IDIuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjQ1IHNxdWFyZXJvb3QgNTA2MjUgLT4gMi4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNDYgc3F1YXJlcm9vdCA1NTIyNSAtPiAyLjRFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODI0NyBzcXVhcmVyb290IDYwMDI1IC0+IDIuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjQ4IHNxdWFyZXJvb3QgNjUwMjUgLT4gMi42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNDkgc3F1YXJlcm9vdCA3MDIyNSAtPiAyLjZFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODI1MCBzcXVhcmVyb290IDc1NjI1IC0+IDIuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjUxIHNxdWFyZXJvb3QgODEyMjUgLT4gMi44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNTIgc3F1YXJlcm9vdCA4NzAyNSAtPiAzLjBFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODI1MyBzcXVhcmVyb290IDkzMDI1IC0+IDMuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjU0IHNxdWFyZXJvb3QgOTkyMjUgLT4gMy4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNTUgc3F1YXJlcm9vdCAxMDU2MjUgLT4gMy4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNTYgc3F1YXJlcm9vdCAxMTIyMjUgLT4gMy40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNTcgc3F1YXJlcm9vdCAxMTkwMjUgLT4gMy40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNTggc3F1YXJlcm9vdCAxMjYwMjUgLT4gMy42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNTkgc3F1YXJlcm9vdCAxMzMyMjUgLT4gMy42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNjAgc3F1YXJlcm9vdCAxNDA2MjUgLT4gMy44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNjEgc3F1YXJlcm9vdCAxNDgyMjUgLT4gMy44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNjIgc3F1YXJlcm9vdCAxNTYwMjUgLT4gNC4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNjMgc3F1YXJlcm9vdCAxNjQwMjUgLT4gNC4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNjQgc3F1YXJlcm9vdCAxNzIyMjUgLT4gNC4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNjUgc3F1YXJlcm9vdCAxODA2MjUgLT4gNC4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNjYgc3F1YXJlcm9vdCAxODkyMjUgLT4gNC40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNjcgc3F1YXJlcm9vdCAxOTgwMjUgLT4gNC40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNjggc3F1YXJlcm9vdCAyMDcwMjUgLT4gNC42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNjkgc3F1YXJlcm9vdCAyMTYyMjUgLT4gNC42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNzAgc3F1YXJlcm9vdCAyMjU2MjUgLT4gNC44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNzEgc3F1YXJlcm9vdCAyMzUyMjUgLT4gNC44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNzIgc3F1YXJlcm9vdCAyNDUwMjUgLT4gNS4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNzMgc3F1YXJlcm9vdCAyNTUwMjUgLT4gNS4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNzQgc3F1YXJlcm9vdCAyNjUyMjUgLT4gNS4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNzUgc3F1YXJlcm9vdCAyNzU2MjUgLT4gNS4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNzYgc3F1YXJlcm9vdCAyODYyMjUgLT4gNS40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNzcgc3F1YXJlcm9vdCAyOTcwMjUgLT4gNS40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNzggc3F1YXJlcm9vdCAzMDgwMjUgLT4gNS42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNzkgc3F1YXJlcm9vdCAzMTkyMjUgLT4gNS42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyODAgc3F1YXJlcm9vdCAzMzA2MjUgLT4gNS44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyODEgc3F1YXJlcm9vdCAzNDIyMjUgLT4gNS44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyODIgc3F1YXJlcm9vdCAzNTQwMjUgLT4gNi4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyODMgc3F1YXJlcm9vdCAzNjYwMjUgLT4gNi4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyODQgc3F1YXJlcm9vdCAzNzgyMjUgLT4gNi4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyODUgc3F1YXJlcm9vdCAzOTA2MjUgLT4gNi4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyODYgc3F1YXJlcm9vdCA0MDMyMjUgLT4gNi40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyODcgc3F1YXJlcm9vdCA0MTYwMjUgLT4gNi40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyODggc3F1YXJlcm9vdCA0MjkwMjUgLT4gNi42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyODkgc3F1YXJlcm9vdCA0NDIyMjUgLT4gNi42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyOTAgc3F1YXJlcm9vdCA0NTU2MjUgLT4gNi44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyOTEgc3F1YXJlcm9vdCA0NjkyMjUgLT4gNi44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyOTIgc3F1YXJlcm9vdCA0ODMwMjUgLT4gNy4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyOTMgc3F1YXJlcm9vdCA0OTcwMjUgLT4gNy4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyOTQgc3F1YXJlcm9vdCA1MTEyMjUgLT4gNy4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyOTUgc3F1YXJlcm9vdCA1MjU2MjUgLT4gNy4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyOTYgc3F1YXJlcm9vdCA1NDAyMjUgLT4gNy40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyOTcgc3F1YXJlcm9vdCA1NTUwMjUgLT4gNy40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyOTggc3F1YXJlcm9vdCA1NzAwMjUgLT4gNy42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyOTkgc3F1YXJlcm9vdCA1ODUyMjUgLT4gNy42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMDAgc3F1YXJlcm9vdCA2MDA2MjUgLT4gNy44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMDEgc3F1YXJlcm9vdCA2MTYyMjUgLT4gNy44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMDIgc3F1YXJlcm9vdCA2MzIwMjUgLT4gOC4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMDMgc3F1YXJlcm9vdCA2NDgwMjUgLT4gOC4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMDQgc3F1YXJlcm9vdCA2NjQyMjUgLT4gOC4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMDUgc3F1YXJlcm9vdCA2ODA2MjUgLT4gOC4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMDYgc3F1YXJlcm9vdCA2OTcyMjUgLT4gOC40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMDcgc3F1YXJlcm9vdCA3MTQwMjUgLT4gOC40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMDggc3F1YXJlcm9vdCA3MzEwMjUgLT4gOC42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMDkgc3F1YXJlcm9vdCA3NDgyMjUgLT4gOC42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMTAgc3F1YXJlcm9vdCA3NjU2MjUgLT4gOC44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMTEgc3F1YXJlcm9vdCA3ODMyMjUgLT4gOC44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMTIgc3F1YXJlcm9vdCA4MDEwMjUgLT4gOS4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMTMgc3F1YXJlcm9vdCA4MTkwMjUgLT4gOS4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMTQgc3F1YXJlcm9vdCA4MzcyMjUgLT4gOS4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMTUgc3F1YXJlcm9vdCA4NTU2MjUgLT4gOS4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMTYgc3F1YXJlcm9vdCA4NzQyMjUgLT4gOS40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMTcgc3F1YXJlcm9vdCA4OTMwMjUgLT4gOS40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMTggc3F1YXJlcm9vdCA5MTIwMjUgLT4gOS42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMTkgc3F1YXJlcm9vdCA5MzEyMjUgLT4gOS42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMjAgc3F1YXJlcm9vdCA5NTA2MjUgLT4gOS44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMjEgc3F1YXJlcm9vdCA5NzAyMjUgLT4gOS44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMjIgc3F1YXJlcm9vdCA5OTAwMjUgLT4gMS4wRSszIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDYKK3NxdHg4MzIzIHNxdWFyZXJvb3QgODg5NzU3MzQ5NjMwMjUgLT4gOS40MzI3MEUrNiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzI0IHNxdWFyZXJvb3QgNzEwODU1NTUwMDA2MjUgLT4gOC40MzEyMkUrNiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzI1IHNxdWFyZXJvb3QgMzk5OTQzMDQuMDUxMDI1IC0+IDYzMjQuMTAgSW5leGFjdCBSb3VuZGVkCitzcXR4ODMyNiBzcXVhcmVyb290IDAuMDAwMDA3MzI3MTcyMjY1NjI1IC0+IDAuMDAyNzA2ODggSW5leGFjdCBSb3VuZGVkCitzcXR4ODMyNyBzcXVhcmVyb290IDEuMDI1ODYwMDQzOTAyNUUtMTMgLT4gMy4yMDI5MEUtNyBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzI4IHNxdWFyZXJvb3QgMC4wMDM0NTgwNTc0Mjc1NjI1IC0+IDAuMDU4ODA1MiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzI5IHNxdWFyZXJvb3QgNy42ODQyMzE3NzAwNjI1RS03IC0+IDAuMDAwODc2NTk4IEluZXhhY3QgUm91bmRlZAorc3F0eDgzMzAgc3F1YXJlcm9vdCAxMjYzODM0NDk1LjIwMjUgLT4gMzU1NTAuNCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzMxIHNxdWFyZXJvb3QgNDMzOTcwNjY2NDYwLjI1IC0+IDY1ODc2NCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzMyIHNxdWFyZXJvb3QgNC41ODc5Mjg2MjMwNjI1RS03IC0+IDAuMDAwNjc3MzQyIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMzMgc3F1YXJlcm9vdCAwLjAwMjkzMDU2MDMzMDYyMjUgLT4gMC4wNTQxMzQ2IEluZXhhY3QgUm91bmRlZAorc3F0eDgzMzQgc3F1YXJlcm9vdCA3MDIxODI4Mi43MzMyMjUgLT4gODM3OS42NCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzM1IHNxdWFyZXJvb3QgMTE5NDI1MTkuMDgyMDI1IC0+IDM0NTUuODAgSW5leGFjdCBSb3VuZGVkCitzcXR4ODMzNiBzcXVhcmVyb290IDAuMDAyMTIzMDY2ODkwNTYyNSAtPiAwLjA0NjA3NjggSW5leGFjdCBSb3VuZGVkCitzcXR4ODMzNyBzcXVhcmVyb290IDAuOTAwODE4MzM0MTEwMjUgLT4gMC45NDkxMTQgSW5leGFjdCBSb3VuZGVkCitzcXR4ODMzOCBzcXVhcmVyb290IDUuNTEwNDEyMDkzNjIyNUUtMTcgLT4gNy40MjMyMkUtOSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzM5IHNxdWFyZXJvb3QgMC4xMDUzMDQ0Njg1NDIyNSAtPiAwLjMyNDUwNiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzQwIHNxdWFyZXJvb3QgOC43MDYwNjk4NjYwMjVFLTE0IC0+IDIuOTUwNjBFLTcgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM0MSBzcXVhcmVyb290IDIzODM4LjU4ODAwNjI1IC0+IDE1NC4zOTggSW5leGFjdCBSb3VuZGVkCitzcXR4ODM0MiBzcXVhcmVyb290IDAuMDAxMzQyNjkxMTI3NTYyNSAtPiAwLjAzNjY0MjggSW5leGFjdCBSb3VuZGVkCisKKy0tIHRlc3QgdXNlIG9mIHJvdW5kLWhhbGYtZXZlbiBpbiB1bmRlcmZsb3cgc2l0dWF0aW9ucworCistLSBwcmVjaXNpb25zIDI7IGFsbCBjYXNlcyB3aGVyZSByZXN1bHQgaXMgYm90aCBzdWJub3JtYWwgYW5kIGEgdGllCitwcmVjaXNpb246IDIKK3NxdHg4MzQzIHNxdWFyZXJvb3QgMi41RS0yMSAtPiAwRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitzcXR4ODM0NCBzcXVhcmVyb290IDIuMjVFLTIwIC0+IDJFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM0NSBzcXVhcmVyb290IDYuMjVFLTIwIC0+IDJFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM0NiBzcXVhcmVyb290IDEuMjI1RS0xOSAtPiA0RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNDcgc3F1YXJlcm9vdCAyLjAyNUUtMTkgLT4gNEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzQ4IHNxdWFyZXJvb3QgMy4wMjVFLTE5IC0+IDZFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM0OSBzcXVhcmVyb290IDQuMjI1RS0xOSAtPiA2RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNTAgc3F1YXJlcm9vdCA1LjYyNUUtMTkgLT4gOEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzUxIHNxdWFyZXJvb3QgNy4yMjVFLTE5IC0+IDhFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM1MiBzcXVhcmVyb290IDkuMDI1RS0xOSAtPiAxLjBFLTkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gcHJlY2lzaW9uIDMsIGlucHV0IHByZWNpc2lvbiA8PSA1CitwcmVjaXNpb246IDMKK3NxdHg4MzUzIHNxdWFyZXJvb3QgMi41RS0yMyAtPiAwRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitzcXR4ODM1NCBzcXVhcmVyb290IDIuMjVFLTIyIC0+IDJFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM1NSBzcXVhcmVyb290IDYuMjVFLTIyIC0+IDJFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM1NiBzcXVhcmVyb290IDEuMjI1RS0yMSAtPiA0RS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNTcgc3F1YXJlcm9vdCAyLjAyNUUtMjEgLT4gNEUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzU4IHNxdWFyZXJvb3QgMy4wMjVFLTIxIC0+IDZFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM1OSBzcXVhcmVyb290IDQuMjI1RS0yMSAtPiA2RS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNjAgc3F1YXJlcm9vdCA1LjYyNUUtMjEgLT4gOEUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzYxIHNxdWFyZXJvb3QgNy4yMjVFLTIxIC0+IDhFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM2MiBzcXVhcmVyb290IDkuMDI1RS0yMSAtPiAxLjBFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM2MyBzcXVhcmVyb290IDEuMTAyNUUtMjAgLT4gMS4wRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNjQgc3F1YXJlcm9vdCAxLjMyMjVFLTIwIC0+IDEuMkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzY1IHNxdWFyZXJvb3QgMS41NjI1RS0yMCAtPiAxLjJFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM2NiBzcXVhcmVyb290IDEuODIyNUUtMjAgLT4gMS40RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNjcgc3F1YXJlcm9vdCAyLjEwMjVFLTIwIC0+IDEuNEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzY4IHNxdWFyZXJvb3QgMi40MDI1RS0yMCAtPiAxLjZFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM2OSBzcXVhcmVyb290IDIuNzIyNUUtMjAgLT4gMS42RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNzAgc3F1YXJlcm9vdCAzLjA2MjVFLTIwIC0+IDEuOEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzcxIHNxdWFyZXJvb3QgMy40MjI1RS0yMCAtPiAxLjhFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM3MiBzcXVhcmVyb290IDMuODAyNUUtMjAgLT4gMi4wRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNzMgc3F1YXJlcm9vdCA0LjIwMjVFLTIwIC0+IDIuMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mzc0IHNxdWFyZXJvb3QgNC42MjI1RS0yMCAtPiAyLjJFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM3NSBzcXVhcmVyb290IDUuMDYyNUUtMjAgLT4gMi4yRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNzYgc3F1YXJlcm9vdCA1LjUyMjVFLTIwIC0+IDIuNEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mzc3IHNxdWFyZXJvb3QgNi4wMDI1RS0yMCAtPiAyLjRFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM3OCBzcXVhcmVyb290IDYuNTAyNUUtMjAgLT4gMi42RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNzkgc3F1YXJlcm9vdCA3LjAyMjVFLTIwIC0+IDIuNkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzgwIHNxdWFyZXJvb3QgNy41NjI1RS0yMCAtPiAyLjhFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM4MSBzcXVhcmVyb290IDguMTIyNUUtMjAgLT4gMi44RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzODIgc3F1YXJlcm9vdCA4LjcwMjVFLTIwIC0+IDMuMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzgzIHNxdWFyZXJvb3QgOS4zMDI1RS0yMCAtPiAzLjBFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM4NCBzcXVhcmVyb290IDkuOTIyNUUtMjAgLT4gMy4yRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLXByZWNpc2lvbiA0LCBpbnB1dCBwcmVjaXNpb24gPD0gNAorcHJlY2lzaW9uOiA0CitzcXR4ODM4NSBzcXVhcmVyb290IDIuNUUtMjUgLT4gMEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorc3F0eDgzODYgc3F1YXJlcm9vdCAyLjI1RS0yNCAtPiAyRS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzODcgc3F1YXJlcm9vdCA2LjI1RS0yNCAtPiAyRS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzODggc3F1YXJlcm9vdCAxLjIyNUUtMjMgLT4gNEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mzg5IHNxdWFyZXJvb3QgMi4wMjVFLTIzIC0+IDRFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM5MCBzcXVhcmVyb290IDMuMDI1RS0yMyAtPiA2RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzOTEgc3F1YXJlcm9vdCA0LjIyNUUtMjMgLT4gNkUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzkyIHNxdWFyZXJvb3QgNS42MjVFLTIzIC0+IDhFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM5MyBzcXVhcmVyb290IDcuMjI1RS0yMyAtPiA4RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzOTQgc3F1YXJlcm9vdCA5LjAyNUUtMjMgLT4gMS4wRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLXByZWNpc2lvbiA1LCBpbnB1dCBwcmVjaXNpb24gPD0gNQorcHJlY2lzaW9uOiA1CitzcXR4ODM5NSBzcXVhcmVyb290IDIuNUUtMjcgLT4gMEUtMTMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgIENsYW1wZWQKK3NxdHg4Mzk2IHNxdWFyZXJvb3QgMi4yNUUtMjYgLT4gMkUtMTMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mzk3IHNxdWFyZXJvb3QgNi4yNUUtMjYgLT4gMkUtMTMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mzk4IHNxdWFyZXJvb3QgMS4yMjVFLTI1IC0+IDRFLTEzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM5OSBzcXVhcmVyb290IDIuMDI1RS0yNSAtPiA0RS0xMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MDAgc3F1YXJlcm9vdCAzLjAyNUUtMjUgLT4gNkUtMTMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDAxIHNxdWFyZXJvb3QgNC4yMjVFLTI1IC0+IDZFLTEzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQwMiBzcXVhcmVyb290IDUuNjI1RS0yNSAtPiA4RS0xMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MDMgc3F1YXJlcm9vdCA3LjIyNUUtMjUgLT4gOEUtMTMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDA0IHNxdWFyZXJvb3QgOS4wMjVFLTI1IC0+IDEuMEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDA1IHNxdWFyZXJvb3QgMS4xMDI1RS0yNCAtPiAxLjBFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQwNiBzcXVhcmVyb290IDEuMzIyNUUtMjQgLT4gMS4yRS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MDcgc3F1YXJlcm9vdCAxLjU2MjVFLTI0IC0+IDEuMkUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDA4IHNxdWFyZXJvb3QgMS44MjI1RS0yNCAtPiAxLjRFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQwOSBzcXVhcmVyb290IDIuMTAyNUUtMjQgLT4gMS40RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MTAgc3F1YXJlcm9vdCAyLjQwMjVFLTI0IC0+IDEuNkUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDExIHNxdWFyZXJvb3QgMi43MjI1RS0yNCAtPiAxLjZFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQxMiBzcXVhcmVyb290IDMuMDYyNUUtMjQgLT4gMS44RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MTMgc3F1YXJlcm9vdCAzLjQyMjVFLTI0IC0+IDEuOEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDE0IHNxdWFyZXJvb3QgMy44MDI1RS0yNCAtPiAyLjBFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQxNSBzcXVhcmVyb290IDQuMjAyNUUtMjQgLT4gMi4wRS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MTYgc3F1YXJlcm9vdCA0LjYyMjVFLTI0IC0+IDIuMkUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDE3IHNxdWFyZXJvb3QgNS4wNjI1RS0yNCAtPiAyLjJFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQxOCBzcXVhcmVyb290IDUuNTIyNUUtMjQgLT4gMi40RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MTkgc3F1YXJlcm9vdCA2LjAwMjVFLTI0IC0+IDIuNEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDIwIHNxdWFyZXJvb3QgNi41MDI1RS0yNCAtPiAyLjZFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQyMSBzcXVhcmVyb290IDcuMDIyNUUtMjQgLT4gMi42RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MjIgc3F1YXJlcm9vdCA3LjU2MjVFLTI0IC0+IDIuOEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDIzIHNxdWFyZXJvb3QgOC4xMjI1RS0yNCAtPiAyLjhFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQyNCBzcXVhcmVyb290IDguNzAyNUUtMjQgLT4gMy4wRS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MjUgc3F1YXJlcm9vdCA5LjMwMjVFLTI0IC0+IDMuMEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDI2IHNxdWFyZXJvb3QgOS45MjI1RS0yNCAtPiAzLjJFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIGEgcmFuZG9tIHNlbGVjdGlvbiBvZiB2YWx1ZXMgdGhhdCBQeXRob24yLjUuMSByb3VuZHMgaW5jb3JyZWN0bHkKK3ByZWNpc2lvbjogMQorc3F0eDg0Mjcgc3F1YXJlcm9vdCAyMjcgLT4gMkUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDI4IHNxdWFyZXJvb3QgNjI1IC0+IDJFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQyOSBzcXVhcmVyb290IDEyMTUgLT4gM0UrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDMwIHNxdWFyZXJvb3QgMjAwOCAtPiA0RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MzEgc3F1YXJlcm9vdCAyMDIwIC0+IDRFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQzMiBzcXVhcmVyb290IDIwMjYgLT4gNUUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDMzIHNxdWFyZXJvb3QgMjAyNyAtPiA1RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MzQgc3F1YXJlcm9vdCAyMDY1IC0+IDVFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQzNSBzcXVhcmVyb290IDIwNzUgLT4gNUUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDM2IHNxdWFyZXJvb3QgMjA4OCAtPiA1RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDg0Mzcgc3F1YXJlcm9vdCAzMDQ5IC0+IDZFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQzOCBzcXVhcmVyb290IDMwNTcgLT4gNkUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDM5IHNxdWFyZXJvb3QgMzA2MSAtPiA2RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NDAgc3F1YXJlcm9vdCAzMDkyIC0+IDZFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ0MSBzcXVhcmVyb290IDQyMjIgLT4gNkUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDQyIHNxdWFyZXJvb3QgNTY3NiAtPiA4RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NDMgc3F1YXJlcm9vdCA1Njg2IC0+IDhFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ0NCBzcXVhcmVyb290IDcyMTUgLT4gOEUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDQ1IHNxdWFyZXJvb3QgOTA4NiAtPiAxRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NDYgc3F1YXJlcm9vdCA5MDk1IC0+IDFFKzIgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMgorc3F0eDg0NDcgc3F1YXJlcm9vdCAxMjY2IC0+IDM2IEluZXhhY3QgUm91bmRlZAorc3F0eDg0NDggc3F1YXJlcm9vdCAyNTUyIC0+IDUxIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NDkgc3F1YXJlcm9vdCA1NTU0IC0+IDc1IEluZXhhY3QgUm91bmRlZAorc3F0eDg0NTAgc3F1YXJlcm9vdCA3ODMyIC0+IDg4IEluZXhhY3QgUm91bmRlZAorc3F0eDg0NTEgc3F1YXJlcm9vdCAxMzIwMSAtPiAxLjFFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ1MiBzcXVhcmVyb290IDE1Njk1IC0+IDEuM0UrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDUzIHNxdWFyZXJvb3QgMTgyNzIgLT4gMS40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NTQgc3F1YXJlcm9vdCAyMTAyNiAtPiAxLjVFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ1NSBzcXVhcmVyb290IDI0MDY5IC0+IDEuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDU2IHNxdWFyZXJvb3QgMzQyNzcgLT4gMS45RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NTcgc3F1YXJlcm9vdCA0NjIzMyAtPiAyLjJFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ1OCBzcXVhcmVyb290IDQ2MjUxIC0+IDIuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDU5IHNxdWFyZXJvb3QgNDYyNzYgLT4gMi4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NjAgc3F1YXJlcm9vdCA3MDIxNCAtPiAyLjZFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ2MSBzcXVhcmVyb290IDgxMjQ5IC0+IDIuOUUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDYyIHNxdWFyZXJvb3QgODEyNjYgLT4gMi45RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NjMgc3F1YXJlcm9vdCA5MzA2NSAtPiAzLjFFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ2NCBzcXVhcmVyb290IDkzMDgzIC0+IDMuMUUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDY1IHNxdWFyZXJvb3QgOTkyMzAgLT4gMy4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NjYgc3F1YXJlcm9vdCA5OTI3MSAtPiAzLjJFKzIgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMworc3F0eDg0Njcgc3F1YXJlcm9vdCAxMTM0OSAtPiAxMDcgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ2OCBzcXVhcmVyb290IDI2NzM4IC0+IDE2NCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDY5IHNxdWFyZXJvb3QgMzE1MDggLT4gMTc4IEluZXhhY3QgUm91bmRlZAorc3F0eDg0NzAgc3F1YXJlcm9vdCA0NDczNCAtPiAyMTIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ3MSBzcXVhcmVyb290IDQ0NzM4IC0+IDIxMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDcyIHNxdWFyZXJvb3QgNTEzMDcgLT4gMjI3IEluZXhhY3QgUm91bmRlZAorc3F0eDg0NzMgc3F1YXJlcm9vdCA2MjI1OSAtPiAyNTAgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ3NCBzcXVhcmVyb290IDc1OTAxIC0+IDI3NiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDc1IHNxdWFyZXJvb3QgNzY0NTcgLT4gMjc3IEluZXhhY3QgUm91bmRlZAorc3F0eDg0NzYgc3F1YXJlcm9vdCAxODAyODcgLT4gNDI1IEluZXhhY3QgUm91bmRlZAorc3F0eDg0Nzcgc3F1YXJlcm9vdCAyMDIwNTMgLT4gNDUwIEluZXhhY3QgUm91bmRlZAorc3F0eDg0Nzggc3F1YXJlcm9vdCAyMzU3NDcgLT4gNDg2IEluZXhhY3QgUm91bmRlZAorc3F0eDg0Nzkgc3F1YXJlcm9vdCAyNTY1MzcgLT4gNTA2IEluZXhhY3QgUm91bmRlZAorc3F0eDg0ODAgc3F1YXJlcm9vdCAyOTk3NzIgLT4gNTQ4IEluZXhhY3QgUm91bmRlZAorc3F0eDg0ODEgc3F1YXJlcm9vdCA0MTUzMzcgLT4gNjQ0IEluZXhhY3QgUm91bmRlZAorc3F0eDg0ODIgc3F1YXJlcm9vdCA2MTcwNjcgLT4gNzg2IEluZXhhY3QgUm91bmRlZAorc3F0eDg0ODMgc3F1YXJlcm9vdCA2MjgwMjIgLT4gNzkyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0ODQgc3F1YXJlcm9vdCA2NDU2MjkgLT4gODA0IEluZXhhY3QgUm91bmRlZAorc3F0eDg0ODUgc3F1YXJlcm9vdCA3ODU4MzYgLT4gODg2IEluZXhhY3QgUm91bmRlZAorc3F0eDg0ODYgc3F1YXJlcm9vdCA5OTMwNjYgLT4gOTk3IEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDYKK3NxdHg4NDg3IHNxdWFyZXJvb3QgMTQ5MTc3ODEgLT4gMzg2Mi4zNSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDg4IHNxdWFyZXJvb3QgMTcyMzcyMzggLT4gNDE1MS43OCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDg5IHNxdWFyZXJvb3QgMTgwNTQ0NjMgLT4gNDI0OS4wNSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDkwIHNxdWFyZXJvb3QgMTk5OTA2OTQgLT4gNDQ3MS4xMCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDkxIHNxdWFyZXJvb3QgMjkwNjE4NTUgLT4gNTM5MC45MCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDkyIHNxdWFyZXJvb3QgNDkxNjYyNTcgLT4gNzAxMS44NyBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDkzIHNxdWFyZXJvb3QgNTMwODIwODYgLT4gNzI4NS43NSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDk0IHNxdWFyZXJvb3QgNTY3ODc5MDkgLT4gNzUzNS43OCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDk1IHNxdWFyZXJvb3QgODExNDAwMTkgLT4gOTAwNy43OCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDk2IHNxdWFyZXJvb3QgODc5Nzc1NTQgLT4gOTM3OS42NCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDk3IHNxdWFyZXJvb3QgOTM2MjQ2ODMgLT4gOTY3NS45OCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDk4IHNxdWFyZXJvb3QgOTg3MzI3NDcgLT4gOTkzNi40NCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDk5IHNxdWFyZXJvb3QgOTkyMjI4MTMgLT4gOTk2MS4wNiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTAwIHNxdWFyZXJvb3QgMTQzODgzNjI2IC0+IDExOTk1LjIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUwMSBzcXVhcmVyb290IDE4MDQzMzMwMSAtPiAxMzQzMi41IEluZXhhY3QgUm91bmRlZAorc3F0eDg1MDIgc3F1YXJlcm9vdCAyMjcwMzQwMjAgLT4gMTUwNjcuNiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTAzIHNxdWFyZXJvb3QgMjgzMjUzOTkyIC0+IDE2ODMwLjIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUwNCBzcXVhcmVyb290IDYxNzA0Nzk1NCAtPiAyNDg0MC40IEluZXhhY3QgUm91bmRlZAorc3F0eDg1MDUgc3F1YXJlcm9vdCA3MzY4NzAwOTQgLT4gMjcxNDUuNCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTA2IHNxdWFyZXJvb3QgODk3MzIyOTE1IC0+IDI5OTU1LjMgSW5leGFjdCBSb3VuZGVkCisKKy0tIHJlc3VsdHMgY2xvc2UgdG8gbWluaW11bSBub3JtYWwKK3ByZWNpc2lvbjogMQorc3F0eDg1MDcgc3F1YXJlcm9vdCAxRS0yMCAtPiAwRS05IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3NxdHg4NTA4IHNxdWFyZXJvb3QgMUUtMTkgLT4gMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitzcXR4ODUwOSBzcXVhcmVyb290IDFFLTE4IC0+IDFFLTkKKworcHJlY2lzaW9uOiAyCitzcXR4ODUxMCBzcXVhcmVyb290IDguMUUtMTkgLT4gOUUtMTAgU3Vibm9ybWFsCitzcXR4ODUxMSBzcXVhcmVyb290IDguMTBFLTE5IC0+IDlFLTEwIFN1Ym5vcm1hbCBSb3VuZGVkCitzcXR4ODUxMiBzcXVhcmVyb290IDkuMEUtMTkgLT4gOUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTEzIHNxdWFyZXJvb3QgOS4wMkUtMTkgLT4gOUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTE0IHNxdWFyZXJvb3QgOS4wM0UtMTkgLT4gMS4wRS05IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUxNSBzcXVhcmVyb290IDkuMUUtMTkgLT4gMS4wRS05IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUxNiBzcXVhcmVyb290IDkuOUUtMTkgLT4gMS4wRS05IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUxNyBzcXVhcmVyb290IDkuOTFFLTE5IC0+IDEuMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1MTggc3F1YXJlcm9vdCA5LjkyRS0xOSAtPiAxLjBFLTkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTE5IHNxdWFyZXJvb3QgOS45NUUtMTkgLT4gMS4wRS05IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUyMCBzcXVhcmVyb290IDkuOThFLTE5IC0+IDEuMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1MjEgc3F1YXJlcm9vdCA5Ljk5RS0xOSAtPiAxLjBFLTkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTIyIHNxdWFyZXJvb3QgMUUtMTggLT4gMUUtOQorc3F0eDg1MjMgc3F1YXJlcm9vdCAxLjBFLTE4IC0+IDEuMEUtOQorc3F0eDg1MjQgc3F1YXJlcm9vdCAxLjAwRS0xOCAtPiAxLjBFLTkKK3NxdHg4NTI1IHNxdWFyZXJvb3QgMS4wMDBFLTE4IC0+IDEuMEUtOSBSb3VuZGVkCitzcXR4ODUyNiBzcXVhcmVyb290IDEuMDAwMEUtMTggLT4gMS4wRS05IFJvdW5kZWQKK3NxdHg4NTI3IHNxdWFyZXJvb3QgMS4wMUUtMTggLT4gMS4wRS05IEluZXhhY3QgUm91bmRlZAorc3F0eDg1Mjggc3F1YXJlcm9vdCAxLjAyRS0xOCAtPiAxLjBFLTkgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUyOSBzcXVhcmVyb290IDEuMUUtMTggLT4gMS4wRS05IEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDMKK3NxdHg4NTMwIHNxdWFyZXJvb3QgOC4xRS0xOSAtPiA5RS0xMCBTdWJub3JtYWwKK3NxdHg4NTMxIHNxdWFyZXJvb3QgOC4xMEUtMTkgLT4gOS4wRS0xMCBTdWJub3JtYWwKK3NxdHg4NTMyIHNxdWFyZXJvb3QgOC4xMDBFLTE5IC0+IDkuMEUtMTAgU3Vibm9ybWFsCitzcXR4ODUzMyBzcXVhcmVyb290IDguMTAwMEUtMTkgLT4gOS4wRS0xMCBTdWJub3JtYWwgUm91bmRlZAorc3F0eDg1MzQgc3F1YXJlcm9vdCA5LjlFLTE5IC0+IDkuOUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTM1IHNxdWFyZXJvb3QgOS45MUUtMTkgLT4gMS4wMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1MzYgc3F1YXJlcm9vdCA5Ljk5RS0xOSAtPiAxLjAwRS05IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUzNyBzcXVhcmVyb290IDkuOTk4RS0xOSAtPiAxLjAwRS05IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUzOCBzcXVhcmVyb290IDFFLTE4IC0+IDFFLTkKK3NxdHg4NTM5IHNxdWFyZXJvb3QgMS4wRS0xOCAtPiAxLjBFLTkKK3NxdHg4NTQwIHNxdWFyZXJvb3QgMS4wMEUtMTggLT4gMS4wRS05CitzcXR4ODU0MSBzcXVhcmVyb290IDEuMDAwRS0xOCAtPiAxLjAwRS05CitzcXR4ODU0MiBzcXVhcmVyb290IDEuMDAwMEUtMTggLT4gMS4wMEUtOQorc3F0eDg1NDMgc3F1YXJlcm9vdCAxLjAwMDAwRS0xOCAtPiAxLjAwRS05IFJvdW5kZWQKK3NxdHg4NTQ0IHNxdWFyZXJvb3QgMS4wMDAwMDBFLTE4IC0+IDEuMDBFLTkgUm91bmRlZAorc3F0eDg1NDUgc3F1YXJlcm9vdCAxLjAxRS0xOCAtPiAxLjAwRS05IEluZXhhY3QgUm91bmRlZAorc3F0eDg1NDYgc3F1YXJlcm9vdCAxLjAyRS0xOCAtPiAxLjAxRS05IEluZXhhY3QgUm91bmRlZAorCistLSByZXN1bHQgZXhhY3RseSByZXByZXNlbnRhYmxlIHdpdGggcHJlY2lzaW9uIHAsIGJ1dCBub3QgbmVjZXNzYXJpbHkKKy0tIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBhcyBhIHN1Ym5vcm1hbDsgIGNoZWNrIHRoZSBjb3JyZWN0IGZsYWdzIGFyZSByYWlzZWQKK3ByZWNpc2lvbjogMgorc3F0eDg1NDcgc3F1YXJlcm9vdCAxLjIxRS0yMCAtPiAxRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1NDggc3F1YXJlcm9vdCAxLjQ0RS0yMCAtPiAxRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1NDkgc3F1YXJlcm9vdCA5LjYxRS0yMCAtPiAzRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1NTAgc3F1YXJlcm9vdCA4LjgzNkUtMTkgLT4gOUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTUxIHNxdWFyZXJvb3QgOS4yMTZFLTE5IC0+IDEuMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDMKK3NxdHg4NTUyIHNxdWFyZXJvb3QgMS4yMUUtMjIgLT4gMUUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTUzIHNxdWFyZXJvb3QgMS4yMUUtMjAgLT4gMS4xRS0xMCBTdWJub3JtYWwKK3NxdHg4NTU0IHNxdWFyZXJvb3QgMS45NkUtMjIgLT4gMUUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTU1IHNxdWFyZXJvb3QgMS45NkUtMjAgLT4gMS40RS0xMCBTdWJub3JtYWwKK3NxdHg4NTU2IHNxdWFyZXJvb3QgMi41NkUtMjIgLT4gMkUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTU3IHNxdWFyZXJvb3QgNC4wMEUtMjIgLT4gMkUtMTEgU3Vibm9ybWFsIFJvdW5kZWQKK3NxdHg4NTU4IHNxdWFyZXJvb3QgNy44NEUtMjIgLT4gM0UtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTU5IHNxdWFyZXJvb3QgOS44MDFFLTIxIC0+IDEuMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTYwIHNxdWFyZXJvb3QgOS44MDFFLTE5IC0+IDkuOUUtMTAgU3Vibm9ybWFsCitzcXR4ODU2MSBzcXVhcmVyb290IDEuMDIwMUUtMjAgLT4gMS4wRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1NjIgc3F1YXJlcm9vdCAxLjEwMjVFLTIwIC0+IDEuMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTYzIHNxdWFyZXJvb3QgMS4xMjM2RS0yMCAtPiAxLjFFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU2NCBzcXVhcmVyb290IDEuMjk5NkUtMjAgLT4gMS4xRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1NjUgc3F1YXJlcm9vdCAxLjMyMjVFLTIwIC0+IDEuMkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gQSBzZWxlY3Rpb24gb2Ygc3Vibm9ybWFsIHJlc3VsdHMgcHJvbmUgdG8gZG91YmxlIHJvdW5kaW5nIGVycm9ycworcHJlY2lzaW9uOiAyCitzcXR4ODU2NiBzcXVhcmVyb290IDIuM0UtMjEgLT4gMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorc3F0eDg1Njcgc3F1YXJlcm9vdCAyLjRFLTIxIC0+IDBFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3NxdHg4NTY4IHNxdWFyZXJvb3QgMi41RS0yMSAtPiAwRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitzcXR4ODU2OSBzcXVhcmVyb290IDIuNkUtMjEgLT4gMUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTcwIHNxdWFyZXJvb3QgMi43RS0yMSAtPiAxRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1NzEgc3F1YXJlcm9vdCAyLjhFLTIxIC0+IDFFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU3MiBzcXVhcmVyb290IDIuMkUtMjAgLT4gMUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTczIHNxdWFyZXJvb3QgMi4zRS0yMCAtPiAyRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1NzQgc3F1YXJlcm9vdCAyLjRFLTIwIC0+IDJFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU3NSBzcXVhcmVyb290IDYuMkUtMjAgLT4gMkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTc2IHNxdWFyZXJvb3QgNi4zRS0yMCAtPiAzRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1Nzcgc3F1YXJlcm9vdCA2LjRFLTIwIC0+IDNFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU3OCBzcXVhcmVyb290IDYuNUUtMjAgLT4gM0UtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTc5IHNxdWFyZXJvb3QgMS4yRS0xOSAtPiAzRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1ODAgc3F1YXJlcm9vdCAyLjBFLTE5IC0+IDRFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU4MSBzcXVhcmVyb290IDQuMkUtMTkgLT4gNkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTgyIHNxdWFyZXJvb3QgNS42RS0xOSAtPiA3RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1ODMgc3F1YXJlcm9vdCA1LjdFLTE5IC0+IDhFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU4NCBzcXVhcmVyb290IDkuMEUtMTkgLT4gOUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTg1IHNxdWFyZXJvb3QgOS4xRS0xOSAtPiAxLjBFLTkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMworc3F0eDg1ODYgc3F1YXJlcm9vdCAyLjZFLTIzIC0+IDFFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU4NyBzcXVhcmVyb290IDIuMjJFLTIyIC0+IDFFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU4OCBzcXVhcmVyb290IDYuMDdFLTIyIC0+IDJFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU4OSBzcXVhcmVyb290IDYuMjVFLTIyIC0+IDJFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU5MCBzcXVhcmVyb290IDYuNDVFLTIyIC0+IDNFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU5MSBzcXVhcmVyb290IDYuNTBFLTIyIC0+IDNFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU5MiBzcXVhcmVyb290IDEuMjJFLTIxIC0+IDNFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU5MyBzcXVhcmVyb290IDEuMjRFLTIxIC0+IDRFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU5NCBzcXVhcmVyb290IDQuMThFLTIxIC0+IDZFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU5NSBzcXVhcmVyb290IDcuMTlFLTIxIC0+IDhFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU5NiBzcXVhcmVyb290IDguOTRFLTIxIC0+IDlFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU5NyBzcXVhcmVyb290IDEuODFFLTIwIC0+IDEuM0UtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTk4IHNxdWFyZXJvb3QgNC42NEUtMjAgLT4gMi4yRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1OTkgc3F1YXJlcm9vdCA1LjA2RS0yMCAtPiAyLjJFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYwMCBzcXVhcmVyb290IDUuMDhFLTIwIC0+IDIuM0UtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjAxIHNxdWFyZXJvb3QgNy4wMEUtMjAgLT4gMi42RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg2MDIgc3F1YXJlcm9vdCAxLjgxRS0xOSAtPiA0LjNFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYwMyBzcXVhcmVyb290IDYuNjRFLTE5IC0+IDguMUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjA0IHNxdWFyZXJvb3QgNy40OEUtMTkgLT4gOC42RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg2MDUgc3F1YXJlcm9vdCA5LjkxRS0xOSAtPiAxLjAwRS05IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQKK3NxdHg4NjA2IHNxdWFyZXJvb3QgNi4yNEUtMjQgLT4gMkUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjA3IHNxdWFyZXJvb3QgNy4xNjJFLTIzIC0+IDhFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYwOCBzcXVhcmVyb290IDcuMjQzRS0yMyAtPiA5RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg2MDkgc3F1YXJlcm9vdCA4Ljk2MUUtMjMgLT4gOUUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjEwIHNxdWFyZXJvb3QgOS4wMjlFLTIzIC0+IDEuMEUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjExIHNxdWFyZXJvb3QgNC42MjRFLTIyIC0+IDIuMkUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjEyIHNxdWFyZXJvb3QgNS45ODBFLTIyIC0+IDIuNEUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjEzIHNxdWFyZXJvb3QgNi41MDdFLTIyIC0+IDIuNkUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjE0IHNxdWFyZXJvb3QgMS40ODNFLTIxIC0+IDMuOUUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjE1IHNxdWFyZXJvb3QgMy45MDNFLTIxIC0+IDYuMkUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjE2IHNxdWFyZXJvb3QgOC43MzNFLTIxIC0+IDkuM0UtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjE3IHNxdWFyZXJvb3QgMS43ODFFLTIwIC0+IDEuMzNFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYxOCBzcXVhcmVyb290IDYuNDI2RS0yMCAtPiAyLjUzRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg2MTkgc3F1YXJlcm9vdCA3LjEwMkUtMjAgLT4gMi42NkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjIwIHNxdWFyZXJvb3QgNy41MzVFLTIwIC0+IDIuNzRFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYyMSBzcXVhcmVyb290IDkuODkyRS0yMCAtPiAzLjE1RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg2MjIgc3F1YXJlcm9vdCAxLjYxMkUtMTkgLT4gNC4wMUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjIzIHNxdWFyZXJvb3QgMS43MjZFLTE5IC0+IDQuMTVFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYyNCBzcXVhcmVyb290IDEuODUzRS0xOSAtPiA0LjMwRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg2MjUgc3F1YXJlcm9vdCA0LjI0NUUtMTkgLT4gNi41MkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gY2xhbXBpbmcgYW5kIG92ZXJmbG93IGZvciBsYXJnZSBleHBvbmVudHMKK3ByZWNpc2lvbjogMQorc3F0eDg2MjYgc3F1YXJlcm9vdCAxRSsxOCAtPiAxRSs5CitzcXR4ODYyNyBzcXVhcmVyb290IDFFKzE5IC0+IDNFKzkgSW5leGFjdCBSb3VuZGVkCistLSBpbiB0aGlzIG5leHQgb25lLCBpbnRlcm1lZGlhdGUgcmVzdWx0IGlzIDk0ODY4MzI5ODAuNTA1MTM3OTk2Li4uCistLSBzbyByb3VuZHMgZG93biB0byA5IChub3QgdXAgdG8gMTAgd2hpY2ggd291bGQgY2F1c2UgSW5maW5pdHkgb3ZlcmZsb3cpCitzcXR4ODYyOCBzcXVhcmVyb290IDlFKzE5IC0+IDlFKzkgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYyOSBzcXVhcmVyb290IDkuMUUrMTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYzMCBzcXVhcmVyb290IDFFKzIwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDIKK3NxdHg4NjMxIHNxdWFyZXJvb3QgMUUrMTggLT4gMUUrOQorc3F0eDg2MzIgc3F1YXJlcm9vdCAxLjBFKzE4IC0+IDEuMEUrOQorc3F0eDg2MzMgc3F1YXJlcm9vdCAxLjAwRSsxOCAtPiAxLjBFKzkKK3NxdHg4NjM0IHNxdWFyZXJvb3QgMS4wMDBFKzE4IC0+IDEuMEUrOSBSb3VuZGVkCitzcXR4ODYzNSBzcXVhcmVyb290IDFFKzIwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbXA6IDEKK3NxdHg4NjM2IHNxdWFyZXJvb3QgMUUrMTggLT4gMS4wRSs5IENsYW1wZWQKK3NxdHg4NjM3IHNxdWFyZXJvb3QgMS4wRSsxOCAtPiAxLjBFKzkKK3NxdHg4NjM4IHNxdWFyZXJvb3QgMUUrMjAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitjbGFtcDogMAorCitwcmVjaXNpb246IDYKK3NxdHg4NjM5IHNxdWFyZXJvb3QgMUUrMTggLT4gMUUrOQorc3F0eDg2NDAgc3F1YXJlcm9vdCAxLjAwMDAwMDAwMDBFKzE4IC0+IDEuMDAwMDBFKzkKK3NxdHg4NjQxIHNxdWFyZXJvb3QgMS4wMDAwMDAwMDAwMEUrMTggLT4gMS4wMDAwMEUrOSBSb3VuZGVkCitzcXR4ODY0MiBzcXVhcmVyb290IDFFKzIwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbXA6IDEKK3NxdHg4NjQzIHNxdWFyZXJvb3QgMUUrOCAtPiAxRSs0CitzcXR4ODY0NCBzcXVhcmVyb290IDFFKzEwIC0+IDEuMEUrNSBDbGFtcGVkCitzcXR4ODY0NSBzcXVhcmVyb290IDEuMEUrMTAgLT4gMS4wRSs1CitzcXR4ODY0NiBzcXVhcmVyb290IDFFKzEyIC0+IDEuMDBFKzYgQ2xhbXBlZAorc3F0eDg2NDcgc3F1YXJlcm9vdCAxLjBFKzEyIC0+IDEuMDBFKzYgQ2xhbXBlZAorc3F0eDg2NDggc3F1YXJlcm9vdCAxLjAwRSsxMiAtPiAxLjAwRSs2IENsYW1wZWQKK3NxdHg4NjQ5IHNxdWFyZXJvb3QgMS4wMDBFKzEyIC0+IDEuMDBFKzYKK3NxdHg4NjUwIHNxdWFyZXJvb3QgMUUrMTggLT4gMS4wMDAwMEUrOSBDbGFtcGVkCitzcXR4ODY1MSBzcXVhcmVyb290IDEuMDAwMDAwMDBFKzE4IC0+IDEuMDAwMDBFKzkgQ2xhbXBlZAorc3F0eDg2NTIgc3F1YXJlcm9vdCAxLjAwMDAwMDAwMEUrMTggLT4gMS4wMDAwMEUrOQorc3F0eDg2NTMgc3F1YXJlcm9vdCAxRSsyMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW1wOiAwCisKKy0tIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjYXVzZXMgYSBUeXBlRXJyb3IgaW4gUHl0aG9uIDIuNS4xCitwcmVjaXNpb246IDMKK21heGV4cG9uZW50OiA5CittaW5leHBvbmVudDogLTkKK3NxdHg4NjU0IHNxdWFyZXJvb3QgMTAwMDAwMDAwMDAgLT4gMS4wMEUrNSBSb3VuZGVkCisKKy0tIEFkZGl0aW9uYWwgdHJpY2t5IGNhc2VzIG9mIHVuZGVyZmxvd24gc3Vibm9ybWFscworcm91bmRpbmc6IGhhbGZfZXZlbgorcHJlY2lzaW9uOiA1CittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorc3F0eDg3MDAgc3F1YXJlcm9vdCAyLjgwNzNFLTIwMDAgLT4gMS42NzVFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzAxIHNxdWFyZXJvb3QgMi44ODgzRS0yMDAwIC0+IDEuNjk5RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcwMiBzcXVhcmVyb290IDMuMTUyNEUtMjAwMCAtPiAxLjc3NUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MDMgc3F1YXJlcm9vdCAzLjIzODJFLTIwMDAgLT4gMS43OTlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzA0IHNxdWFyZXJvb3QgMy41MTc1RS0yMDAwIC0+IDEuODc1RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcwNSBzcXVhcmVyb290IDMuNjA4MUUtMjAwMCAtPiAxLjg5OUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MDYgc3F1YXJlcm9vdCAzLjkwMjZFLTIwMDAgLT4gMS45NzVFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzA3IHNxdWFyZXJvb3QgMy45OTgwRS0yMDAwIC0+IDEuOTk5RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcwOCBzcXVhcmVyb290IDQuMzA3N0UtMjAwMCAtPiAyLjA3NUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MDkgc3F1YXJlcm9vdCA0LjQwNzlFLTIwMDAgLT4gMi4wOTlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzEwIHNxdWFyZXJvb3QgNC43MzI4RS0yMDAwIC0+IDIuMTc1RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcxMSBzcXVhcmVyb290IDQuODM3OEUtMjAwMCAtPiAyLjE5OUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MTIgc3F1YXJlcm9vdCA1LjE3NzlFLTIwMDAgLT4gMi4yNzVFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzEzIHNxdWFyZXJvb3QgNS4yODc3RS0yMDAwIC0+IDIuMjk5RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcxNCBzcXVhcmVyb290IDUuNjQzMEUtMjAwMCAtPiAyLjM3NUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MTUgc3F1YXJlcm9vdCA1Ljc1NzZFLTIwMDAgLT4gMi4zOTlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzE2IHNxdWFyZXJvb3QgNi4xMjgxRS0yMDAwIC0+IDIuNDc1RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcxNyBzcXVhcmVyb290IDYuMjQ3NUUtMjAwMCAtPiAyLjQ5OUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MTggc3F1YXJlcm9vdCA2LjYzMzJFLTIwMDAgLT4gMi41NzVFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzE5IHNxdWFyZXJvb3QgNi43NTc0RS0yMDAwIC0+IDIuNTk5RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcyMCBzcXVhcmVyb290IDcuMTU4M0UtMjAwMCAtPiAyLjY3NUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MjEgc3F1YXJlcm9vdCA3LjI4NzNFLTIwMDAgLT4gMi42OTlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzIyIHNxdWFyZXJvb3QgNy43MDM0RS0yMDAwIC0+IDIuNzc1RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcyMyBzcXVhcmVyb290IDcuODM3MkUtMjAwMCAtPiAyLjc5OUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MjQgc3F1YXJlcm9vdCA4LjI2ODVFLTIwMDAgLT4gMi44NzVFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzI1IHNxdWFyZXJvb3QgOC40MDcxRS0yMDAwIC0+IDIuODk5RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcyNiBzcXVhcmVyb290IDguODUzNkUtMjAwMCAtPiAyLjk3NUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3Mjcgc3F1YXJlcm9vdCA4Ljk5NzBFLTIwMDAgLT4gMi45OTlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzI4IHNxdWFyZXJvb3QgOS40NTg3RS0yMDAwIC0+IDMuMDc1RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcyOSBzcXVhcmVyb290IDkuNjA2OUUtMjAwMCAtPiAzLjA5OUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorLS0gKEVuZCBvZiBNYXJrIERpY2tpbnNvbidzIHRlc3RjYXNlcy4pCisKKworLS0gU29tZSBhZGRpdGlvbmFsIGVkZ2UgY2FzZXMKK21heGV4cG9uZW50OiA5CittaW5leHBvbmVudDogLTkKK3ByZWNpc2lvbjogMgorc3F0eDkwMDAgc3F1YXJlcm9vdCA5OTgwLjAxIC0+IDEuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMworc3F0eDkwMDEgc3F1YXJlcm9vdCA5OTgwLjAxIC0+IDk5LjkKK3ByZWNpc2lvbjogNAorc3F0eDkwMDIgc3F1YXJlcm9vdCA5OTgwLjAxIC0+IDk5LjkKKworLS0gRXhhY3QgZnJvbSBvdmVyLXByZWNpc2UKK3ByZWNpc2lvbjogNAorc3F0eDkwMDMgc3F1YXJlcm9vdCAxMTAyNSAgIC0+IDEwNQorcHJlY2lzaW9uOiAzCitzcXR4OTAwNCBzcXVhcmVyb290IDExMDI1ICAgLT4gMTA1CitwcmVjaXNpb246IDIKK3NxdHg5MDA1IHNxdWFyZXJvb3QgMTEwMjUgICAtPiAxLjBFKzIgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxCitzcXR4OTAwNiBzcXVhcmVyb290IDExMDI1ICAgLT4gMUUrMiAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gYW4gaW50ZXJlc3RpbmcgY2FzZQorcHJlY2lzaW9uOiAgIDcKK3NxdHg5MDA3IHNxdWFyZXJvb3QgMTYwMDAwMGUxIC0+IDQwMDAKKworLS0gT3V0LW9mLWJvdW5kcyB6ZXJvcworcHJlY2lzaW9uOiA0CitzcXR4OTAxMCBzcXVhcmVyb290IDBFLTkgIC0+IDAuMDAwMDAKK3NxdHg5MDExIHNxdWFyZXJvb3QgMEUtMTAgLT4gMC4wMDAwMAorc3F0eDkwMTIgc3F1YXJlcm9vdCAwRS0xMSAtPiAwLjAwMDAwMAorc3F0eDkwMTMgc3F1YXJlcm9vdCAwRS0xMiAtPiAwLjAwMDAwMAorc3F0eDkwMTQgc3F1YXJlcm9vdCAwRS0xMyAtPiAwRS03CitzcXR4OTAxNSBzcXVhcmVyb290IDBFLTE0IC0+IDBFLTcKK3NxdHg5MDIwIHNxdWFyZXJvb3QgMEUtMTcgLT4gMEUtOQorc3F0eDkwMjEgc3F1YXJlcm9vdCAwRS0yMCAtPiAwRS0xMAorc3F0eDkwMjIgc3F1YXJlcm9vdCAwRS0yMiAtPiAwRS0xMQorc3F0eDkwMjMgc3F1YXJlcm9vdCAwRS0yNCAtPiAwRS0xMgorc3F0eDkwMjQgc3F1YXJlcm9vdCAwRS0yNSAtPiAwRS0xMiBDbGFtcGVkCitzcXR4OTAyNSBzcXVhcmVyb290IDBFLTI2IC0+IDBFLTEyIENsYW1wZWQKK3NxdHg5MDI2IHNxdWFyZXJvb3QgMEUtMjcgLT4gMEUtMTIgQ2xhbXBlZAorc3F0eDkwMjcgc3F1YXJlcm9vdCAwRS0yOCAtPiAwRS0xMiBDbGFtcGVkCisKK3NxdHg5MDMwIHNxdWFyZXJvb3QgMEUrOCAgLT4gMEUrNAorc3F0eDkwMzEgc3F1YXJlcm9vdCAwRSsxMCAtPiAwRSs1CitzcXR4OTAzMiBzcXVhcmVyb290IDBFKzEyIC0+IDBFKzYKK3NxdHg5MDMzIHNxdWFyZXJvb3QgMEUrMTQgLT4gMEUrNworc3F0eDkwMzQgc3F1YXJlcm9vdCAwRSsxNSAtPiAwRSs3CitzcXR4OTAzNSBzcXVhcmVyb290IDBFKzE2IC0+IDBFKzgKK3NxdHg5MDM2IHNxdWFyZXJvb3QgMEUrMTggLT4gMEUrOQorc3F0eDkwMzcgc3F1YXJlcm9vdCAwRSsxOSAtPiAwRSs5CitzcXR4OTAzOCBzcXVhcmVyb290IDBFKzIwIC0+IDBFKzkgQ2xhbXBlZAorc3F0eDkwMzkgc3F1YXJlcm9vdCAwRSsyMSAtPiAwRSs5IENsYW1wZWQKK3NxdHg5MDQwIHNxdWFyZXJvb3QgMEUrMjIgLT4gMEUrOSBDbGFtcGVkCisKKy0tIGlmIGRpZ2l0cyA+IGVtYXggbWF4aW11bSByZWFsIGV4cG9uZW50IGlzIG5lZ2F0aXZlCittYXhleHBvbmVudDogOQorbWluZXhwb25lbnQ6IC05CitwcmVjaXNpb246IDE1CitjbGFtcDogMQorc3F0eDkwNDUgc3F1YXJlcm9vdCAgMSAtPiAxLjAwMDAwICBDbGFtcGVkCisKKy0tIG90aGVyCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiAxNgorc3F0eDkwNDYgc3F1YXJlcm9vdCAgMTAgICAgLT4gMy4xNjIyNzc2NjAxNjgzNzkgICAgICAgICAgaW5leGFjdCByb3VuZGVkCitzcXR4OTA0NyBzcXVhcmVyb290ICAxMEUtMSAtPiAxLjAKK3NxdHg5MDQ4IHNxdWFyZXJvb3QgIDEwRS0yIC0+IDAuMzE2MjI3NzY2MDE2ODM3OSAgICAgICAgIGluZXhhY3Qgcm91bmRlZAorc3F0eDkwNDkgc3F1YXJlcm9vdCAgMTBFLTMgLT4gMC4xMAorCisKKy0tIEhpZ2gtcHJlY2lzaW9uIGV4YWN0IGFuZCBpbmV4YWN0CittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA0MDAKK3NxdHg5MDUwIHNxdWFyZXJvb3QgMiAtPiAxLjQxNDIxMzU2MjM3MzA5NTA0ODgwMTY4ODcyNDIwOTY5ODA3ODU2OTY3MTg3NTM3Njk0ODA3MzE3NjY3OTczNzk5MDczMjQ3ODQ2MjEwNzAzODg1MDM4NzUzNDMyNzY0MTU3MjczNTAxMzg0NjIzMDkxMjI5NzAyNDkyNDgzNjA1NTg1MDczNzIxMjY0NDEyMTQ5NzA5OTkzNTgzMTQxMzIyMjY2NTkyNzUwNTU5Mjc1NTc5OTk1MDUwMTE1Mjc4MjA2MDU3MTQ3MDEwOTU1OTk3MTYwNTk3MDI3NDUzNDU5Njg2MjAxNDcyODUxNzQxODY0MDg4OTE5ODYwOTU1MjMyOTIzMDQ4NDMwODcxNDMyMTQ1MDgzOTc2MjYwMzYyNzk5NTI1MTQwNzk4OTY4NzI1MzM5NjU0NjMzMTgwODgyOTY0MDYyMDYxNTI1ODM1MjM5NTA1NDc0NTc1MDI4Nzc1OTk2MTcyOTgzNTU3NTIyMDMzNzUzMTg1NzAxMTM1NDM3NDYwMzQwODQ5ODg0NyBJbmV4YWN0IFJvdW5kZWQKK3NxdHg5MDUxIHNxdWFyZXJvb3QgMTA4OSAtPiAzMworc3F0eDkwNTIgc3F1YXJlcm9vdCAxMC44OSAtPiAzLjMKKworLS0gTnVsbCB0ZXN0CitzcXR4OTkwMCBzcXVhcmVyb290ICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9zdWJ0cmFjdC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9zdWJ0cmFjdC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OTUyMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3N1YnRyYWN0LmRlY1Rlc3QKQEAgLTAsMCArMSw4NzMgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gc3VidHJhY3QuZGVjVGVzdCAtLSBkZWNpbWFsIHN1YnRyYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCistLSBbZmlyc3QgZ3JvdXAgYXJlICdxdWljayBjb25maWRlbmNlIGNoZWNrJ10KK3N1YngwMDEgc3VidHJhY3QgIDAgICAwICAtPiAnMCcKK3N1YngwMDIgc3VidHJhY3QgIDEgICAxICAtPiAnMCcKK3N1YngwMDMgc3VidHJhY3QgIDEgICAyICAtPiAnLTEnCitzdWJ4MDA0IHN1YnRyYWN0ICAyICAgMSAgLT4gJzEnCitzdWJ4MDA1IHN1YnRyYWN0ICAyICAgMiAgLT4gJzAnCitzdWJ4MDA2IHN1YnRyYWN0ICAzICAgMiAgLT4gJzEnCitzdWJ4MDA3IHN1YnRyYWN0ICAyICAgMyAgLT4gJy0xJworCitzdWJ4MDExIHN1YnRyYWN0IC0wICAgMCAgLT4gJy0wJworc3VieDAxMiBzdWJ0cmFjdCAtMSAgIDEgIC0+ICctMicKK3N1YngwMTMgc3VidHJhY3QgLTEgICAyICAtPiAnLTMnCitzdWJ4MDE0IHN1YnRyYWN0IC0yICAgMSAgLT4gJy0zJworc3VieDAxNSBzdWJ0cmFjdCAtMiAgIDIgIC0+ICctNCcKK3N1YngwMTYgc3VidHJhY3QgLTMgICAyICAtPiAnLTUnCitzdWJ4MDE3IHN1YnRyYWN0IC0yICAgMyAgLT4gJy01JworCitzdWJ4MDIxIHN1YnRyYWN0ICAwICAtMCAgLT4gJzAnCitzdWJ4MDIyIHN1YnRyYWN0ICAxICAtMSAgLT4gJzInCitzdWJ4MDIzIHN1YnRyYWN0ICAxICAtMiAgLT4gJzMnCitzdWJ4MDI0IHN1YnRyYWN0ICAyICAtMSAgLT4gJzMnCitzdWJ4MDI1IHN1YnRyYWN0ICAyICAtMiAgLT4gJzQnCitzdWJ4MDI2IHN1YnRyYWN0ICAzICAtMiAgLT4gJzUnCitzdWJ4MDI3IHN1YnRyYWN0ICAyICAtMyAgLT4gJzUnCisKK3N1YngwMzAgc3VidHJhY3QgIDExICAxICAtPiAxMAorc3VieDAzMSBzdWJ0cmFjdCAgMTAgIDEgIC0+ICA5CitzdWJ4MDMyIHN1YnRyYWN0ICA5ICAgMSAgLT4gIDgKK3N1YngwMzMgc3VidHJhY3QgIDEgICAxICAtPiAgMAorc3VieDAzNCBzdWJ0cmFjdCAgMCAgIDEgIC0+IC0xCitzdWJ4MDM1IHN1YnRyYWN0IC0xICAgMSAgLT4gLTIKK3N1YngwMzYgc3VidHJhY3QgLTkgICAxICAtPiAtMTAKK3N1YngwMzcgc3VidHJhY3QgLTEwICAxICAtPiAtMTEKK3N1YngwMzggc3VidHJhY3QgLTExICAxICAtPiAtMTIKKworc3VieDA0MCBzdWJ0cmFjdCAnNS43NScgJzMuMycgIC0+ICcyLjQ1Jworc3VieDA0MSBzdWJ0cmFjdCAnNScgICAgJy0zJyAgIC0+ICc4Jworc3VieDA0MiBzdWJ0cmFjdCAnLTUnICAgJy0zJyAgIC0+ICctMicKK3N1YngwNDMgc3VidHJhY3QgJy03JyAgICcyLjUnICAtPiAnLTkuNScKK3N1YngwNDQgc3VidHJhY3QgJzAuNycgICcwLjMnICAtPiAnMC40Jworc3VieDA0NSBzdWJ0cmFjdCAnMS4zJyAgJzAuMycgIC0+ICcxLjAnCitzdWJ4MDQ2IHN1YnRyYWN0ICcxLjI1JyAnMS4yNScgLT4gJzAuMDAnCisKK3N1YngwNTAgc3VidHJhY3QgJzEuMjM0NTY3ODknICAgICcxLjAwMDAwMDAwJyAtPiAnMC4yMzQ1Njc4OScKK3N1YngwNTEgc3VidHJhY3QgJzEuMjM0NTY3ODknICAgICcxLjAwMDAwMDg5JyAtPiAnMC4yMzQ1NjcwMCcKK3N1YngwNTIgc3VidHJhY3QgJzAuNTU1NTU1NTU1OScgICAgJzAuMDAwMDAwMDAwMScgLT4gJzAuNTU1NTU1NTU2JyBJbmV4YWN0IFJvdW5kZWQKK3N1YngwNTMgc3VidHJhY3QgJzAuNTU1NTU1NTU1OScgICAgJzAuMDAwMDAwMDAwNScgLT4gJzAuNTU1NTU1NTU1JyBJbmV4YWN0IFJvdW5kZWQKK3N1YngwNTQgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NCcgICAgJzAuMTExMTExMTExMScgLT4gJzAuMzMzMzMzMzMzJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngwNTUgc3VidHJhY3QgJzEuMDAwMDAwMDAwMCcgICAgJzAuMDAwMDAwMDEnIC0+ICcwLjk5OTk5OTk5MCcgUm91bmRlZAorc3VieDA1NiBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0OTk5JyAgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK3N1YngwNTcgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NTAwMCcgICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCisKK3N1YngwNjAgc3VidHJhY3QgJzcwJyAgICAnMTAwMDBlKzknIC0+ICctMS4wMDAwMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorc3VieDA2MSBzdWJ0cmFjdCAnNzAwJyAgICAnMTAwMDBlKzknIC0+ICctMS4wMDAwMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorc3VieDA2MiBzdWJ0cmFjdCAnNzAwMCcgICAgJzEwMDAwZSs5JyAtPiAnLTkuOTk5OTk5OTlFKzEyJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngwNjMgc3VidHJhY3QgJzcwMDAwJyAgICAnMTAwMDBlKzknIC0+ICctOS45OTk5OTk5M0UrMTInIFJvdW5kZWQKK3N1YngwNjQgc3VidHJhY3QgJzcwMDAwMCcgICAgJzEwMDAwZSs5JyAtPiAnLTkuOTk5OTk5MzBFKzEyJyBSb3VuZGVkCisgIC0tIHN5bW1ldHJ5Ogorc3VieDA2NSBzdWJ0cmFjdCAnMTAwMDBlKzknICAgICc3MCcgLT4gJzEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngwNjYgc3VidHJhY3QgJzEwMDAwZSs5JyAgICAnNzAwJyAtPiAnMS4wMDAwMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorc3VieDA2NyBzdWJ0cmFjdCAnMTAwMDBlKzknICAgICc3MDAwJyAtPiAnOS45OTk5OTk5OUUrMTInIEluZXhhY3QgUm91bmRlZAorc3VieDA2OCBzdWJ0cmFjdCAnMTAwMDBlKzknICAgICc3MDAwMCcgLT4gJzkuOTk5OTk5OTNFKzEyJyBSb3VuZGVkCitzdWJ4MDY5IHN1YnRyYWN0ICcxMDAwMGUrOScgICAgJzcwMDAwMCcgLT4gJzkuOTk5OTk5MzBFKzEyJyBSb3VuZGVkCisKKyAgLS0gY2hhbmdlIHByZWNpc2lvbgorc3VieDA4MCBzdWJ0cmFjdCAnMTAwMDBlKzknICAgICc3MDAwMCcgLT4gJzkuOTk5OTk5OTNFKzEyJyBSb3VuZGVkCitwcmVjaXNpb246IDYKK3N1YngwODEgc3VidHJhY3QgJzEwMDAwZSs5JyAgICAnNzAwMDAnIC0+ICcxLjAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDkKKworICAtLSBzb21lIG9mIHRoZSBuZXh0IGdyb3VwIGFyZSByZWFsbHkgY29uc3RydWN0b3IgdGVzdHMKK3N1YngwOTAgc3VidHJhY3QgJzAwLjAnICAgICcwLjAnICAtPiAnMC4wJworc3VieDA5MSBzdWJ0cmFjdCAnMDAuMCcgICAgJzAuMDAnIC0+ICcwLjAwJworc3VieDA5MiBzdWJ0cmFjdCAnMC4wMCcgICAgJzAwLjAnIC0+ICcwLjAwJworc3VieDA5MyBzdWJ0cmFjdCAnMDAuMCcgICAgJzAuMDAnIC0+ICcwLjAwJworc3VieDA5NCBzdWJ0cmFjdCAnMC4wMCcgICAgJzAwLjAnIC0+ICcwLjAwJworc3VieDA5NSBzdWJ0cmFjdCAnMycgICAgJy4zJyAgIC0+ICcyLjcnCitzdWJ4MDk2IHN1YnRyYWN0ICczLicgICAnLjMnICAgLT4gJzIuNycKK3N1YngwOTcgc3VidHJhY3QgJzMuMCcgICcuMycgICAtPiAnMi43Jworc3VieDA5OCBzdWJ0cmFjdCAnMy4wMCcgJy4zJyAgIC0+ICcyLjcwJworc3VieDA5OSBzdWJ0cmFjdCAnMycgICAgJzMnICAgIC0+ICcwJworc3VieDEwMCBzdWJ0cmFjdCAnMycgICAgJyszJyAgIC0+ICcwJworc3VieDEwMSBzdWJ0cmFjdCAnMycgICAgJy0zJyAgIC0+ICc2Jworc3VieDEwMiBzdWJ0cmFjdCAnMycgICAgJzAuMycgIC0+ICcyLjcnCitzdWJ4MTAzIHN1YnRyYWN0ICczLicgICAnMC4zJyAgLT4gJzIuNycKK3N1YngxMDQgc3VidHJhY3QgJzMuMCcgICcwLjMnICAtPiAnMi43Jworc3VieDEwNSBzdWJ0cmFjdCAnMy4wMCcgJzAuMycgIC0+ICcyLjcwJworc3VieDEwNiBzdWJ0cmFjdCAnMycgICAgJzMuMCcgIC0+ICcwLjAnCitzdWJ4MTA3IHN1YnRyYWN0ICczJyAgICAnKzMuMCcgLT4gJzAuMCcKK3N1YngxMDggc3VidHJhY3QgJzMnICAgICctMy4wJyAtPiAnNi4wJworCistLSB0aGUgYWJvdmUgYWxsIGZyb20gYWRkOyBtYXNzYWdlZCBhbmQgZXh0ZW5kZWQuICBOb3cgc29tZSBuZXcgb25lcy4uLgorLS0gW3BhcnRpY3VsYXJseSBpbXBvcnRhbnQgZm9yIGNvbXBhcmlzb25zXQorLS0gTkI6IC14RS04IGJlbG93IHdlcmUgbm9uLWV4cG9uZW50cyBwcmUtQU5TSSBYMy0yNzQsIGFuZCAtMUUtNyBvciAwRS03CistLSB3aXRoIGlucHV0IHJvdW5kaW5nLgorc3VieDEyMCBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg0JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTVFLTgnCitzdWJ4MTIxIHN1YnRyYWN0ICAnMTAuMjM0NTY3ODUnICAgICcxMC4yMzQ1Njc4OScgIC0+ICctNEUtOCcKK3N1YngxMjIgc3VidHJhY3QgICcxMC4yMzQ1Njc4NicgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJy0zRS04Jworc3VieDEyMyBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg3JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTJFLTgnCitzdWJ4MTI0IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODgnICAgICcxMC4yMzQ1Njc4OScgIC0+ICctMUUtOCcKK3N1YngxMjUgc3VidHJhY3QgICcxMC4yMzQ1Njc4OScgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJzBFLTgnCitzdWJ4MTI2IHN1YnRyYWN0ICAnMTAuMjM0NTY3OTAnICAgICcxMC4yMzQ1Njc4OScgIC0+ICcxRS04Jworc3VieDEyNyBzdWJ0cmFjdCAgJzEwLjIzNDU2NzkxJyAgICAnMTAuMjM0NTY3ODknICAtPiAnMkUtOCcKK3N1YngxMjggc3VidHJhY3QgICcxMC4yMzQ1Njc5MicgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJzNFLTgnCitzdWJ4MTI5IHN1YnRyYWN0ICAnMTAuMjM0NTY3OTMnICAgICcxMC4yMzQ1Njc4OScgIC0+ICc0RS04Jworc3VieDEzMCBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzk0JyAgICAnMTAuMjM0NTY3ODknICAtPiAnNUUtOCcKK3N1YngxMzEgc3VidHJhY3QgICcxMC4yMzQ1Njc4MScgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJy01RS04Jworc3VieDEzMiBzdWJ0cmFjdCAgJzEwLjIzNDU2NzgyJyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTRFLTgnCitzdWJ4MTMzIHN1YnRyYWN0ICAnMTAuMjM0NTY3ODMnICAgICcxMC4yMzQ1Njc4NicgIC0+ICctM0UtOCcKK3N1YngxMzQgc3VidHJhY3QgICcxMC4yMzQ1Njc4NCcgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJy0yRS04Jworc3VieDEzNSBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg1JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTFFLTgnCitzdWJ4MTM2IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODYnICAgICcxMC4yMzQ1Njc4NicgIC0+ICcwRS04Jworc3VieDEzNyBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg3JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnMUUtOCcKK3N1YngxMzggc3VidHJhY3QgICcxMC4yMzQ1Njc4OCcgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJzJFLTgnCitzdWJ4MTM5IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODknICAgICcxMC4yMzQ1Njc4NicgIC0+ICczRS04Jworc3VieDE0MCBzdWJ0cmFjdCAgJzEwLjIzNDU2NzkwJyAgICAnMTAuMjM0NTY3ODYnICAtPiAnNEUtOCcKK3N1YngxNDEgc3VidHJhY3QgICcxMC4yMzQ1Njc5MScgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJzVFLTgnCitzdWJ4MTQyIHN1YnRyYWN0ICAnMScgICAgICAgICAgICAgICcwLjk5OTk5OTk5OScgIC0+ICcxRS05Jworc3VieDE0MyBzdWJ0cmFjdCAgJzAuOTk5OTk5OTk5JyAgICAnMScgICAgICAgICAgICAtPiAnLTFFLTknCitzdWJ4MTQ0IHN1YnRyYWN0ICAnLTEwLjIzNDU2NzgwJyAgICctMTAuMjM0NTY3ODYnIC0+ICc2RS04Jworc3VieDE0NSBzdWJ0cmFjdCAgJy0xMC4yMzQ1Njc5MCcgICAnLTEwLjIzNDU2Nzg2JyAtPiAnLTRFLTgnCitzdWJ4MTQ2IHN1YnRyYWN0ICAnLTEwLjIzNDU2NzkxJyAgICctMTAuMjM0NTY3ODYnIC0+ICctNUUtOCcKKworcHJlY2lzaW9uOiAzCitzdWJ4MTUwIHN1YnRyYWN0ICcxMjM0NTY3ODkwMDAwMCcgJzk5OTk5OTk5OTk5OTknICAtPiAyLjM1RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3N1YngxNTEgc3VidHJhY3QgJzk5OTk5OTk5OTk5OTknICAnMTIzNDU2Nzg5MDAwMDAnIC0+IC0yLjM1RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNgorc3VieDE1MiBzdWJ0cmFjdCAnMTIzNDU2Nzg5MDAwMDAnICc5OTk5OTk5OTk5OTk5JyAgLT4gMi4zNDU2OEUrMTIgSW5leGFjdCBSb3VuZGVkCitzdWJ4MTUzIHN1YnRyYWN0ICc5OTk5OTk5OTk5OTk5JyAgJzEyMzQ1Njc4OTAwMDAwJyAtPiAtMi4zNDU2OEUrMTIgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDkKK3N1YngxNTQgc3VidHJhY3QgJzEyMzQ1Njc4OTAwMDAwJyAnOTk5OTk5OTk5OTk5OScgIC0+IDIuMzQ1Njc4OTBFKzEyIEluZXhhY3QgUm91bmRlZAorc3VieDE1NSBzdWJ0cmFjdCAnOTk5OTk5OTk5OTk5OScgICcxMjM0NTY3ODkwMDAwMCcgLT4gLTIuMzQ1Njc4OTBFKzEyIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMgorc3VieDE1NiBzdWJ0cmFjdCAnMTIzNDU2Nzg5MDAwMDAnICc5OTk5OTk5OTk5OTk5JyAgLT4gMi4zNDU2Nzg5MDAwMEUrMTIgSW5leGFjdCBSb3VuZGVkCitzdWJ4MTU3IHN1YnRyYWN0ICc5OTk5OTk5OTk5OTk5JyAgJzEyMzQ1Njc4OTAwMDAwJyAtPiAtMi4zNDU2Nzg5MDAwMEUrMTIgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE1CitzdWJ4MTU4IHN1YnRyYWN0ICcxMjM0NTY3ODkwMDAwMCcgJzk5OTk5OTk5OTk5OTknICAtPiAyMzQ1Njc4OTAwMDAxCitzdWJ4MTU5IHN1YnRyYWN0ICc5OTk5OTk5OTk5OTk5JyAgJzEyMzQ1Njc4OTAwMDAwJyAtPiAtMjM0NTY3ODkwMDAwMQorcHJlY2lzaW9uOiA5CisKKy0tIGFkZGl0aW9uYWwgc2NhbGVkIGFyaXRobWV0aWMgdGVzdHMgWzAuOTcgcHJvYmxlbV0KK3N1YngxNjAgc3VidHJhY3QgJzAnICAgICAnLjEnICAgICAgLT4gJy0wLjEnCitzdWJ4MTYxIHN1YnRyYWN0ICcwMCcgICAgJy45Nzk4MycgIC0+ICctMC45Nzk4MycKK3N1YngxNjIgc3VidHJhY3QgJzAnICAgICAnLjknICAgICAgLT4gJy0wLjknCitzdWJ4MTYzIHN1YnRyYWN0ICcwJyAgICAgJzAuMTAyJyAgIC0+ICctMC4xMDInCitzdWJ4MTY0IHN1YnRyYWN0ICcwJyAgICAgJy40JyAgICAgIC0+ICctMC40Jworc3VieDE2NSBzdWJ0cmFjdCAnMCcgICAgICcuMzA3JyAgICAtPiAnLTAuMzA3Jworc3VieDE2NiBzdWJ0cmFjdCAnMCcgICAgICcuNDM4MjInICAtPiAnLTAuNDM4MjInCitzdWJ4MTY3IHN1YnRyYWN0ICcwJyAgICAgJy45MTEnICAgIC0+ICctMC45MTEnCitzdWJ4MTY4IHN1YnRyYWN0ICcuMCcgICAgJy4wMicgICAgIC0+ICctMC4wMicKK3N1YngxNjkgc3VidHJhY3QgJzAwJyAgICAnLjM5MicgICAgLT4gJy0wLjM5MicKK3N1YngxNzAgc3VidHJhY3QgJzAnICAgICAnLjI2JyAgICAgLT4gJy0wLjI2Jworc3VieDE3MSBzdWJ0cmFjdCAnMCcgICAgICcwLjUxJyAgICAtPiAnLTAuNTEnCitzdWJ4MTcyIHN1YnRyYWN0ICcwJyAgICAgJy4yMjM0JyAgIC0+ICctMC4yMjM0Jworc3VieDE3MyBzdWJ0cmFjdCAnMCcgICAgICcuMicgICAgICAtPiAnLTAuMicKK3N1YngxNzQgc3VidHJhY3QgJy4wJyAgICAnLjAwMDgnICAgLT4gJy0wLjAwMDgnCistLSAwLiBvbiBsZWZ0CitzdWJ4MTgwIHN1YnRyYWN0ICcwLjAnICAgICAnLS4xJyAgICAgIC0+ICcwLjEnCitzdWJ4MTgxIHN1YnRyYWN0ICcwLjAwJyAgICAnLS45Nzk4MycgIC0+ICcwLjk3OTgzJworc3VieDE4MiBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uOScgICAgICAtPiAnMC45Jworc3VieDE4MyBzdWJ0cmFjdCAnMC4wJyAgICAgJy0wLjEwMicgICAtPiAnMC4xMDInCitzdWJ4MTg0IHN1YnRyYWN0ICcwLjAnICAgICAnLS40JyAgICAgIC0+ICcwLjQnCitzdWJ4MTg1IHN1YnRyYWN0ICcwLjAnICAgICAnLS4zMDcnICAgIC0+ICcwLjMwNycKK3N1YngxODYgc3VidHJhY3QgJzAuMCcgICAgICctLjQzODIyJyAgLT4gJzAuNDM4MjInCitzdWJ4MTg3IHN1YnRyYWN0ICcwLjAnICAgICAnLS45MTEnICAgIC0+ICcwLjkxMScKK3N1YngxODggc3VidHJhY3QgJzAuMCcgICAgICctLjAyJyAgICAgLT4gJzAuMDInCitzdWJ4MTg5IHN1YnRyYWN0ICcwLjAwJyAgICAnLS4zOTInICAgIC0+ICcwLjM5MicKK3N1YngxOTAgc3VidHJhY3QgJzAuMCcgICAgICctLjI2JyAgICAgLT4gJzAuMjYnCitzdWJ4MTkxIHN1YnRyYWN0ICcwLjAnICAgICAnLTAuNTEnICAgIC0+ICcwLjUxJworc3VieDE5MiBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMjIzNCcgICAtPiAnMC4yMjM0Jworc3VieDE5MyBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMicgICAgICAtPiAnMC4yJworc3VieDE5NCBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMDAwOCcgICAtPiAnMC4wMDA4JworLS0gbmVnYXRpdmVzIG9mIHNhbWUKK3N1YngyMDAgc3VidHJhY3QgJzAnICAgICAnLS4xJyAgICAgIC0+ICcwLjEnCitzdWJ4MjAxIHN1YnRyYWN0ICcwMCcgICAgJy0uOTc5ODMnICAtPiAnMC45Nzk4MycKK3N1YngyMDIgc3VidHJhY3QgJzAnICAgICAnLS45JyAgICAgIC0+ICcwLjknCitzdWJ4MjAzIHN1YnRyYWN0ICcwJyAgICAgJy0wLjEwMicgICAtPiAnMC4xMDInCitzdWJ4MjA0IHN1YnRyYWN0ICcwJyAgICAgJy0uNCcgICAgICAtPiAnMC40Jworc3VieDIwNSBzdWJ0cmFjdCAnMCcgICAgICctLjMwNycgICAgLT4gJzAuMzA3Jworc3VieDIwNiBzdWJ0cmFjdCAnMCcgICAgICctLjQzODIyJyAgLT4gJzAuNDM4MjInCitzdWJ4MjA3IHN1YnRyYWN0ICcwJyAgICAgJy0uOTExJyAgICAtPiAnMC45MTEnCitzdWJ4MjA4IHN1YnRyYWN0ICcuMCcgICAgJy0uMDInICAgICAtPiAnMC4wMicKK3N1YngyMDkgc3VidHJhY3QgJzAwJyAgICAnLS4zOTInICAgIC0+ICcwLjM5MicKK3N1YngyMTAgc3VidHJhY3QgJzAnICAgICAnLS4yNicgICAgIC0+ICcwLjI2Jworc3VieDIxMSBzdWJ0cmFjdCAnMCcgICAgICctMC41MScgICAgLT4gJzAuNTEnCitzdWJ4MjEyIHN1YnRyYWN0ICcwJyAgICAgJy0uMjIzNCcgICAtPiAnMC4yMjM0Jworc3VieDIxMyBzdWJ0cmFjdCAnMCcgICAgICctLjInICAgICAgLT4gJzAuMicKK3N1YngyMTQgc3VidHJhY3QgJy4wJyAgICAnLS4wMDA4JyAgIC0+ICcwLjAwMDgnCisKKy0tIG1vcmUgZml4ZWQsIExIUyBzd2FwcyBbcmVhbGx5IHRoZSBzYW1lIGFzIHRlc3RjYXNlcyB1bmRlciBhZGRdCitzdWJ4MjIwIHN1YnRyYWN0ICctNTYyNjdFLTEyJyAwICAtPiAnLTUuNjI2N0UtOCcKK3N1YngyMjEgc3VidHJhY3QgJy01NjI2N0UtMTEnIDAgIC0+ICctNS42MjY3RS03Jworc3VieDIyMiBzdWJ0cmFjdCAnLTU2MjY3RS0xMCcgMCAgLT4gJy0wLjAwMDAwNTYyNjcnCitzdWJ4MjIzIHN1YnRyYWN0ICctNTYyNjdFLTknICAwICAtPiAnLTAuMDAwMDU2MjY3Jworc3VieDIyNCBzdWJ0cmFjdCAnLTU2MjY3RS04JyAgMCAgLT4gJy0wLjAwMDU2MjY3Jworc3VieDIyNSBzdWJ0cmFjdCAnLTU2MjY3RS03JyAgMCAgLT4gJy0wLjAwNTYyNjcnCitzdWJ4MjI2IHN1YnRyYWN0ICctNTYyNjdFLTYnICAwICAtPiAnLTAuMDU2MjY3Jworc3VieDIyNyBzdWJ0cmFjdCAnLTU2MjY3RS01JyAgMCAgLT4gJy0wLjU2MjY3Jworc3VieDIyOCBzdWJ0cmFjdCAnLTU2MjY3RS0yJyAgMCAgLT4gJy01NjIuNjcnCitzdWJ4MjI5IHN1YnRyYWN0ICctNTYyNjdFLTEnICAwICAtPiAnLTU2MjYuNycKK3N1YngyMzAgc3VidHJhY3QgJy01NjI2N0UtMCcgIDAgIC0+ICctNTYyNjcnCistLSBzeW1tZXRyeSAuLi4KK3N1YngyNDAgc3VidHJhY3QgMCAnLTU2MjY3RS0xMicgIC0+ICc1LjYyNjdFLTgnCitzdWJ4MjQxIHN1YnRyYWN0IDAgJy01NjI2N0UtMTEnICAtPiAnNS42MjY3RS03Jworc3VieDI0MiBzdWJ0cmFjdCAwICctNTYyNjdFLTEwJyAgLT4gJzAuMDAwMDA1NjI2NycKK3N1YngyNDMgc3VidHJhY3QgMCAnLTU2MjY3RS05JyAgIC0+ICcwLjAwMDA1NjI2NycKK3N1YngyNDQgc3VidHJhY3QgMCAnLTU2MjY3RS04JyAgIC0+ICcwLjAwMDU2MjY3Jworc3VieDI0NSBzdWJ0cmFjdCAwICctNTYyNjdFLTcnICAgLT4gJzAuMDA1NjI2NycKK3N1YngyNDYgc3VidHJhY3QgMCAnLTU2MjY3RS02JyAgIC0+ICcwLjA1NjI2NycKK3N1YngyNDcgc3VidHJhY3QgMCAnLTU2MjY3RS01JyAgIC0+ICcwLjU2MjY3Jworc3VieDI0OCBzdWJ0cmFjdCAwICctNTYyNjdFLTInICAgLT4gJzU2Mi42NycKK3N1YngyNDkgc3VidHJhY3QgMCAnLTU2MjY3RS0xJyAgIC0+ICc1NjI2LjcnCitzdWJ4MjUwIHN1YnRyYWN0IDAgJy01NjI2N0UtMCcgICAtPiAnNTYyNjcnCisKKy0tIG5vdyBzb21lIG1vcmUgZnJvbSB0aGUgJ25ldycgYWRkCitwcmVjaXNpb246IDkKK3N1YngzMDEgc3VidHJhY3QgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAwMCcgLT4gJzAuMjM0NTY3ODknCitzdWJ4MzAyIHN1YnRyYWN0ICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMTEnIC0+ICcwLjIzNDU2Nzc4JworCitzdWJ4MzExIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1JyAtPiAnLTAuMTExMTExMTExJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngzMTIgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0MCcgICcwLjU1NTU1NTU1NTUnIC0+ICctMC4xMTExMTExMTInIEluZXhhY3QgUm91bmRlZAorc3VieDMxMyBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1MCcgLT4gJy0wLjExMTExMTExMScgSW5leGFjdCBSb3VuZGVkCitzdWJ4MzE0IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ5JyAgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK3N1YngzMTUgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDk5JyAgICcwJyAtPiAnMC40NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorc3VieDMxNiBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0OTk5JyAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4MzE3IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDUwMDAnICAnMCcgLT4gJzAuNDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK3N1YngzMTggc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NTAwMScgICcwJyAtPiAnMC40NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorc3VieDMxOSBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ1MDEnICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCitzdWJ4MzIwIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDUxJyAgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBjYXJyeWluZyBlZmZlY3RzCitzdWJ4MzIxIHN1YnRyYWN0ICcwLjk5OTgnICAnMC4wMDAwJyAtPiAnMC45OTk4Jworc3VieDMyMiBzdWJ0cmFjdCAnMC45OTk4JyAgJzAuMDAwMScgLT4gJzAuOTk5NycKK3N1YngzMjMgc3VidHJhY3QgJzAuOTk5OCcgICcwLjAwMDInIC0+ICcwLjk5OTYnCitzdWJ4MzI0IHN1YnRyYWN0ICcwLjk5OTgnICAnMC4wMDAzJyAtPiAnMC45OTk1Jworc3VieDMyNSBzdWJ0cmFjdCAnMC45OTk4JyAgJy0wLjAwMDAnIC0+ICcwLjk5OTgnCitzdWJ4MzI2IHN1YnRyYWN0ICcwLjk5OTgnICAnLTAuMDAwMScgLT4gJzAuOTk5OScKK3N1YngzMjcgc3VidHJhY3QgJzAuOTk5OCcgICctMC4wMDAyJyAtPiAnMS4wMDAwJworc3VieDMyOCBzdWJ0cmFjdCAnMC45OTk4JyAgJy0wLjAwMDMnIC0+ICcxLjAwMDEnCisKK3N1YngzMzAgc3VidHJhY3QgJzcwJyAgJzEwMDAwZSs5JyAtPiAnLTEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngzMzEgc3VidHJhY3QgJzcwMCcgICcxMDAwMGUrOScgLT4gJy0xLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCitzdWJ4MzMyIHN1YnRyYWN0ICc3MDAwJyAgJzEwMDAwZSs5JyAtPiAnLTkuOTk5OTk5OTlFKzEyJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngzMzMgc3VidHJhY3QgJzcwMDAwJyAgJzEwMDAwZSs5JyAtPiAnLTkuOTk5OTk5OTNFKzEyJyBSb3VuZGVkCitzdWJ4MzM0IHN1YnRyYWN0ICc3MDAwMDAnICAnMTAwMDBlKzknIC0+ICctOS45OTk5OTkzMEUrMTInIFJvdW5kZWQKK3N1YngzMzUgc3VidHJhY3QgJzcwMDAwMDAnICAnMTAwMDBlKzknIC0+ICctOS45OTk5OTMwMEUrMTInIFJvdW5kZWQKKy0tIHN5bW1ldHJ5Ogorc3VieDM0MCBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAnIC0+ICcxLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCitzdWJ4MzQxIHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MDAnIC0+ICcxLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCitzdWJ4MzQyIHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MDAwJyAtPiAnOS45OTk5OTk5OUUrMTInIEluZXhhY3QgUm91bmRlZAorc3VieDM0MyBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAwMDAnIC0+ICc5Ljk5OTk5OTkzRSsxMicgUm91bmRlZAorc3VieDM0NCBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAwMDAwJyAtPiAnOS45OTk5OTkzMEUrMTInIFJvdW5kZWQKK3N1YngzNDUgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwMDAwMDAnIC0+ICc5Ljk5OTk5MzAwRSsxMicgUm91bmRlZAorCistLSBzYW1lLCBoaWdoZXIgcHJlY2lzaW9uCitwcmVjaXNpb246IDE1CitzdWJ4MzQ2IHN1YnRyYWN0ICcxMDAwMGUrOScgICc3JyAgIC0+ICc5OTk5OTk5OTk5OTkzJworc3VieDM0NyBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAnICAgLT4gJzk5OTk5OTk5OTk5MzAnCitzdWJ4MzQ4IHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MDAnICAgLT4gJzk5OTk5OTk5OTkzMDAnCitzdWJ4MzQ5IHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MDAwJyAgIC0+ICc5OTk5OTk5OTkzMDAwJworc3VieDM1MCBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAwMDAnICAgLT4gJzk5OTk5OTk5MzAwMDAnCitzdWJ4MzUxIHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MDAwMDAnICAgLT4gJzk5OTk5OTkzMDAwMDAnCitzdWJ4MzUyIHN1YnRyYWN0ICc3JyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTk5OTkzJworc3VieDM1MyBzdWJ0cmFjdCAnNzAnICcxMDAwMGUrOScgICAtPiAnLTk5OTk5OTk5OTk5MzAnCitzdWJ4MzU0IHN1YnRyYWN0ICc3MDAnICcxMDAwMGUrOScgICAtPiAnLTk5OTk5OTk5OTkzMDAnCitzdWJ4MzU1IHN1YnRyYWN0ICc3MDAwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTkzMDAwJworc3VieDM1NiBzdWJ0cmFjdCAnNzAwMDAnICcxMDAwMGUrOScgICAtPiAnLTk5OTk5OTk5MzAwMDAnCitzdWJ4MzU3IHN1YnRyYWN0ICc3MDAwMDAnICcxMDAwMGUrOScgICAtPiAnLTk5OTk5OTkzMDAwMDAnCisKKy0tIHplcm8gcHJlc2VydmF0aW9uCitwcmVjaXNpb246IDYKK3N1YngzNjAgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwMDAwJyAtPiAnMS4wMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorc3VieDM2MSBzdWJ0cmFjdCAxICcwLjAwMDEnIC0+ICcwLjk5OTknCitzdWJ4MzYyIHN1YnRyYWN0IDEgJzAuMDAwMDEnIC0+ICcwLjk5OTk5Jworc3VieDM2MyBzdWJ0cmFjdCAxICcwLjAwMDAwMScgLT4gJzAuOTk5OTk5Jworc3VieDM2NCBzdWJ0cmFjdCAxICcwLjAwMDAwMDEnIC0+ICcxLjAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngzNjUgc3VidHJhY3QgMSAnMC4wMDAwMDAwMScgLT4gJzEuMDAwMDAnIEluZXhhY3QgUm91bmRlZAorCistLSBzb21lIGZ1bm55IHplcm9zIFtpbiBjYXNlIG9mIGJhZCBzaWdudW1dCitzdWJ4MzcwIHN1YnRyYWN0IDEgIDAgIC0+IDEKK3N1YngzNzEgc3VidHJhY3QgMSAwLiAgLT4gMQorc3VieDM3MiBzdWJ0cmFjdCAxICAuMCAtPiAxLjAKK3N1YngzNzMgc3VidHJhY3QgMSAwLjAgLT4gMS4wCitzdWJ4Mzc0IHN1YnRyYWN0ICAwICAxIC0+IC0xCitzdWJ4Mzc1IHN1YnRyYWN0IDAuICAxIC0+IC0xCitzdWJ4Mzc2IHN1YnRyYWN0ICAuMCAxIC0+IC0xLjAKK3N1YngzNzcgc3VidHJhY3QgMC4wIDEgLT4gLTEuMAorCitwcmVjaXNpb246IDkKKworLS0gbGVhZGluZyAwIGRpZ2l0IGJlZm9yZSByb3VuZAorc3VieDkxMCBzdWJ0cmFjdCAtMTAzNTE5MzYyIC01MTg5Nzk1NS4zIC0+IC01MTYyMTQwNi43CitzdWJ4OTExIHN1YnRyYWN0IDE1OTU3OS40NDQgODk4MjcuNTIyOSAtPiA2OTc1MS45MjExCisKK3N1Yng5MjAgc3VidHJhY3QgMzMzLjEyMzQ1NiAzMy4xMjM0NTY2IC0+IDI5OS45OTk5OTkgSW5leGFjdCBSb3VuZGVkCitzdWJ4OTIxIHN1YnRyYWN0IDMzMy4xMjM0NTYgMzMuMTIzNDU2NSAtPiAzMDAuMDAwMDAwIEluZXhhY3QgUm91bmRlZAorc3VieDkyMiBzdWJ0cmFjdCAxMzMuMTIzNDU2IDMzLjEyMzQ1NjUgLT4gIDk5Ljk5OTk5OTUKK3N1Yng5MjMgc3VidHJhY3QgMTMzLjEyMzQ1NiAzMy4xMjM0NTY0IC0+ICA5OS45OTk5OTk2CitzdWJ4OTI0IHN1YnRyYWN0IDEzMy4xMjM0NTYgMzMuMTIzNDU0MCAtPiAxMDAuMDAwMDAyIFJvdW5kZWQKK3N1Yng5MjUgc3VidHJhY3QgMTMzLjEyMzQ1NiA0My4xMjM0NTYwIC0+ICA5MC4wMDAwMDAwCitzdWJ4OTI2IHN1YnRyYWN0IDEzMy4xMjM0NTYgNDMuMTIzNDU2MSAtPiAgODkuOTk5OTk5OQorc3VieDkyNyBzdWJ0cmFjdCAxMzMuMTIzNDU2IDQzLjEyMzQ1NjYgLT4gIDg5Ljk5OTk5OTQKK3N1Yng5Mjggc3VidHJhY3QgMTAxLjEyMzQ1NiA5MS4xMjM0NTY2IC0+ICAgOS45OTk5OTk0CitzdWJ4OTI5IHN1YnRyYWN0IDEwMS4xMjM0NTYgOTkuMTIzNDU2NiAtPiAgIDEuOTk5OTk5NAorCistLSBtb3JlIG9mIHRoZSBzYW1lOyBwcm9iZSBmb3IgY2x1c3RlciBib3VuZGFyeSBwcm9ibGVtcworcHJlY2lzaW9uOiAxCitzdWJ4OTMwIHN1YnRyYWN0ICAxMSAyICAgICAgICAgICAtPiA5CitwcmVjaXNpb246IDIKK3N1Yng5MzIgc3VidHJhY3QgMTAxIDIgICAgICAgICAgIC0+IDk5CitwcmVjaXNpb246IDMKK3N1Yng5MzQgc3VidHJhY3QgMTAxIDIuMSAgICAgICAgIC0+IDk4LjkKK3N1Yng5MzUgc3VidHJhY3QgMTAxIDkyLjAxICAgICAgIC0+ICA4Ljk5CitwcmVjaXNpb246IDQKK3N1Yng5MzYgc3VidHJhY3QgMTAxIDIuMDEgICAgICAgIC0+IDk4Ljk5CitzdWJ4OTM3IHN1YnRyYWN0IDEwMSA5Mi4wMSAgICAgICAtPiAgOC45OQorc3VieDkzOCBzdWJ0cmFjdCAxMDEgOTIuMDA2ICAgICAgLT4gIDguOTk0CitwcmVjaXNpb246IDUKK3N1Yng5Mzkgc3VidHJhY3QgMTAxIDIuMDAxICAgICAgIC0+IDk4Ljk5OQorc3VieDk0MCBzdWJ0cmFjdCAxMDEgOTIuMDAxICAgICAgLT4gIDguOTk5CitzdWJ4OTQxIHN1YnRyYWN0IDEwMSA5Mi4wMDA2ICAgICAtPiAgOC45OTk0CitwcmVjaXNpb246IDYKK3N1Yng5NDIgc3VidHJhY3QgMTAxIDIuMDAwMSAgICAgIC0+IDk4Ljk5OTkKK3N1Yng5NDMgc3VidHJhY3QgMTAxIDkyLjAwMDEgICAgIC0+ICA4Ljk5OTkKK3N1Yng5NDQgc3VidHJhY3QgMTAxIDkyLjAwMDA2ICAgIC0+ICA4Ljk5OTk0CitwcmVjaXNpb246IDcKK3N1Yng5NDUgc3VidHJhY3QgMTAxIDIuMDAwMDEgICAgIC0+IDk4Ljk5OTk5CitzdWJ4OTQ2IHN1YnRyYWN0IDEwMSA5Mi4wMDAwMSAgICAtPiAgOC45OTk5OQorc3VieDk0NyBzdWJ0cmFjdCAxMDEgOTIuMDAwMDA2ICAgLT4gIDguOTk5OTk0CitwcmVjaXNpb246IDgKK3N1Yng5NDggc3VidHJhY3QgMTAxIDIuMDAwMDAxICAgIC0+IDk4Ljk5OTk5OQorc3VieDk0OSBzdWJ0cmFjdCAxMDEgOTIuMDAwMDAxICAgLT4gIDguOTk5OTk5CitzdWJ4OTUwIHN1YnRyYWN0IDEwMSA5Mi4wMDAwMDA2ICAtPiAgOC45OTk5OTk0CitwcmVjaXNpb246IDkKK3N1Yng5NTEgc3VidHJhY3QgMTAxIDIuMDAwMDAwMSAgIC0+IDk4Ljk5OTk5OTkKK3N1Yng5NTIgc3VidHJhY3QgMTAxIDkyLjAwMDAwMDEgIC0+ICA4Ljk5OTk5OTkKK3N1Yng5NTMgc3VidHJhY3QgMTAxIDkyLjAwMDAwMDA2IC0+ICA4Ljk5OTk5OTk0CisKK3ByZWNpc2lvbjogOQorCistLSBtb3JlIExIUyBzd2FwcyBbd2VyZSBmaXhlZF0KK3N1YngzOTAgc3VidHJhY3QgJy01NjI2N0UtMTAnICAgMCAtPiAgJy0wLjAwMDAwNTYyNjcnCitzdWJ4MzkxIHN1YnRyYWN0ICctNTYyNjdFLTYnICAgIDAgLT4gICctMC4wNTYyNjcnCitzdWJ4MzkyIHN1YnRyYWN0ICctNTYyNjdFLTUnICAgIDAgLT4gICctMC41NjI2NycKK3N1YngzOTMgc3VidHJhY3QgJy01NjI2N0UtNCcgICAgMCAtPiAgJy01LjYyNjcnCitzdWJ4Mzk0IHN1YnRyYWN0ICctNTYyNjdFLTMnICAgIDAgLT4gICctNTYuMjY3Jworc3VieDM5NSBzdWJ0cmFjdCAnLTU2MjY3RS0yJyAgICAwIC0+ICAnLTU2Mi42NycKK3N1YngzOTYgc3VidHJhY3QgJy01NjI2N0UtMScgICAgMCAtPiAgJy01NjI2LjcnCitzdWJ4Mzk3IHN1YnRyYWN0ICctNTYyNjdFLTAnICAgIDAgLT4gICctNTYyNjcnCitzdWJ4Mzk4IHN1YnRyYWN0ICctNUUtMTAnICAgICAgIDAgLT4gICctNUUtMTAnCitzdWJ4Mzk5IHN1YnRyYWN0ICctNUUtNycgICAgICAgIDAgLT4gICctNUUtNycKK3N1Yng0MDAgc3VidHJhY3QgJy01RS02JyAgICAgICAgMCAtPiAgJy0wLjAwMDAwNScKK3N1Yng0MDEgc3VidHJhY3QgJy01RS01JyAgICAgICAgMCAtPiAgJy0wLjAwMDA1Jworc3VieDQwMiBzdWJ0cmFjdCAnLTVFLTQnICAgICAgICAwIC0+ICAnLTAuMDAwNScKK3N1Yng0MDMgc3VidHJhY3QgJy01RS0xJyAgICAgICAgMCAtPiAgJy0wLjUnCitzdWJ4NDA0IHN1YnRyYWN0ICctNUUwJyAgICAgICAgIDAgLT4gICctNScKK3N1Yng0MDUgc3VidHJhY3QgJy01RTEnICAgICAgICAgMCAtPiAgJy01MCcKK3N1Yng0MDYgc3VidHJhY3QgJy01RTUnICAgICAgICAgMCAtPiAgJy01MDAwMDAnCitzdWJ4NDA3IHN1YnRyYWN0ICctNUU4JyAgICAgICAgIDAgLT4gICctNTAwMDAwMDAwJworc3VieDQwOCBzdWJ0cmFjdCAnLTVFOScgICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDBFKzknICAgUm91bmRlZAorc3VieDQwOSBzdWJ0cmFjdCAnLTVFMTAnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDBFKzEwJyAgUm91bmRlZAorc3VieDQxMCBzdWJ0cmFjdCAnLTVFMTEnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDBFKzExJyAgUm91bmRlZAorc3VieDQxMSBzdWJ0cmFjdCAnLTVFMTAwJyAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDBFKzEwMCcgUm91bmRlZAorCistLSBtb3JlIFJIUyBzd2FwcyBbd2VyZSBmaXhlZF0KK3N1Yng0MjAgc3VidHJhY3QgMCAgJy01NjI2N0UtMTAnIC0+ICAnMC4wMDAwMDU2MjY3Jworc3VieDQyMSBzdWJ0cmFjdCAwICAnLTU2MjY3RS02JyAgLT4gICcwLjA1NjI2NycKK3N1Yng0MjIgc3VidHJhY3QgMCAgJy01NjI2N0UtNScgIC0+ICAnMC41NjI2NycKK3N1Yng0MjMgc3VidHJhY3QgMCAgJy01NjI2N0UtNCcgIC0+ICAnNS42MjY3Jworc3VieDQyNCBzdWJ0cmFjdCAwICAnLTU2MjY3RS0zJyAgLT4gICc1Ni4yNjcnCitzdWJ4NDI1IHN1YnRyYWN0IDAgICctNTYyNjdFLTInICAtPiAgJzU2Mi42NycKK3N1Yng0MjYgc3VidHJhY3QgMCAgJy01NjI2N0UtMScgIC0+ICAnNTYyNi43Jworc3VieDQyNyBzdWJ0cmFjdCAwICAnLTU2MjY3RS0wJyAgLT4gICc1NjI2NycKK3N1Yng0Mjggc3VidHJhY3QgMCAgJy01RS0xMCcgICAgIC0+ICAnNUUtMTAnCitzdWJ4NDI5IHN1YnRyYWN0IDAgICctNUUtNycgICAgICAtPiAgJzVFLTcnCitzdWJ4NDMwIHN1YnRyYWN0IDAgICctNUUtNicgICAgICAtPiAgJzAuMDAwMDA1Jworc3VieDQzMSBzdWJ0cmFjdCAwICAnLTVFLTUnICAgICAgLT4gICcwLjAwMDA1Jworc3VieDQzMiBzdWJ0cmFjdCAwICAnLTVFLTQnICAgICAgLT4gICcwLjAwMDUnCitzdWJ4NDMzIHN1YnRyYWN0IDAgICctNUUtMScgICAgICAtPiAgJzAuNScKK3N1Yng0MzQgc3VidHJhY3QgMCAgJy01RTAnICAgICAgIC0+ICAnNScKK3N1Yng0MzUgc3VidHJhY3QgMCAgJy01RTEnICAgICAgIC0+ICAnNTAnCitzdWJ4NDM2IHN1YnRyYWN0IDAgICctNUU1JyAgICAgICAtPiAgJzUwMDAwMCcKK3N1Yng0Mzcgc3VidHJhY3QgMCAgJy01RTgnICAgICAgIC0+ICAnNTAwMDAwMDAwJworc3VieDQzOCBzdWJ0cmFjdCAwICAnLTVFOScgICAgICAgLT4gICc1LjAwMDAwMDAwRSs5JyAgICBSb3VuZGVkCitzdWJ4NDM5IHN1YnRyYWN0IDAgICctNUUxMCcgICAgICAtPiAgJzUuMDAwMDAwMDBFKzEwJyAgIFJvdW5kZWQKK3N1Yng0NDAgc3VidHJhY3QgMCAgJy01RTExJyAgICAgIC0+ICAnNS4wMDAwMDAwMEUrMTEnICAgUm91bmRlZAorc3VieDQ0MSBzdWJ0cmFjdCAwICAnLTVFMTAwJyAgICAgLT4gICc1LjAwMDAwMDAwRSsxMDAnICBSb3VuZGVkCisKKworLS0gdHJ5IGJvcmRlcmxpbmUgcHJlY2lzaW9uLCB3aXRoIGNhcnJpZXMsIGV0Yy4KK3ByZWNpc2lvbjogMTUKK3N1Yng0NjEgc3VidHJhY3QgJzFFKzEyJyAnMScgICAgICAgLT4gJzk5OTk5OTk5OTk5OScKK3N1Yng0NjIgc3VidHJhY3QgJzFFKzEyJyAnLTEuMTEnICAgLT4gJzEwMDAwMDAwMDAwMDEuMTEnCitzdWJ4NDYzIHN1YnRyYWN0ICcxLjExJyAgJy0xRSsxMicgIC0+ICcxMDAwMDAwMDAwMDAxLjExJworc3VieDQ2NCBzdWJ0cmFjdCAnLTEnICAgICctMUUrMTInICAtPiAnOTk5OTk5OTk5OTk5Jworc3VieDQ2NSBzdWJ0cmFjdCAnN0UrMTInICcxJyAgICAgICAtPiAnNjk5OTk5OTk5OTk5OScKK3N1Yng0NjYgc3VidHJhY3QgJzdFKzEyJyAnLTEuMTEnICAgLT4gJzcwMDAwMDAwMDAwMDEuMTEnCitzdWJ4NDY3IHN1YnRyYWN0ICcxLjExJyAgJy03RSsxMicgIC0+ICc3MDAwMDAwMDAwMDAxLjExJworc3VieDQ2OCBzdWJ0cmFjdCAnLTEnICAgICctN0UrMTInICAtPiAnNjk5OTk5OTk5OTk5OScKKworLS0gICAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NSAgICAgICAxMjM0NTY3ODkwMTIzNDUgICAgICAxIDIzNDU2Nzg5MDEyMzQ1CitzdWJ4NDcwIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NjMnIC0+ICcxLjAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng0NzEgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU2MicgLT4gJzEuMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorc3VieDQ3MiBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTYxJyAtPiAnMS4wMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NDczIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NjAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng0NzQgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1OScgLT4gJzEuMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorc3VieDQ3NSBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU4JyAtPiAnMS4wMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NDc2IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTcnIC0+ICcxLjAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng0Nzcgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NicgLT4gJzEuMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK3N1Yng0Nzggc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NScgLT4gJzAuOTk5OTk5OTk5OTk5OTk5Jworc3VieDQ3OSBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU0JyAtPiAnMC45OTk5OTk5OTk5OTk5OTgnCitzdWJ4NDgwIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTMnIC0+ICcwLjk5OTk5OTk5OTk5OTk5NycKK3N1Yng0ODEgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1MicgLT4gJzAuOTk5OTk5OTk5OTk5OTk2Jworc3VieDQ4MiBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTUxJyAtPiAnMC45OTk5OTk5OTk5OTk5OTUnCitzdWJ4NDgzIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTAnIC0+ICcwLjk5OTk5OTk5OTk5OTk5NCcKKworLS0gYW5kIHNvbWUgbW9yZSwgaW5jbHVkaW5nIHJlc2lkdWUgZWZmZWN0cyBhbmQgZGlmZmVyZW50IHJvdW5kaW5ncworcHJlY2lzaW9uOiA5Cityb3VuZGluZzogaGFsZl91cAorc3VieDUwMCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjM0NTY3ODknCitzdWJ4NTAxIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTAyIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTAzIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTA0IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTA1IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTA2IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTA3IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTA4IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTA5IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTEwIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTExIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTEyIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTEzIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTE0IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTE1IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTE2IHN1YnRyYWN0ICcxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcKK3N1Yng1MTcgc3VidHJhY3QgJzEyMzQ1Njc4OScgMS4wMDAwMDAwMDEgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1MTggc3VidHJhY3QgJzEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1MTkgc3VidHJhY3QgJzEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorc3VieDUyMCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjM0NTY3ODknCitzdWJ4NTIxIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTIyIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTIzIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTI0IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTI1IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTI2IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTI3IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTI4IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTI5IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTMwIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTMxIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTMyIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTMzIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTM0IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTM1IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTM2IHN1YnRyYWN0ICcxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcKK3N1Yng1Mzcgc3VidHJhY3QgJzEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1Mzggc3VidHJhY3QgJzEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1Mzkgc3VidHJhY3QgJzEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitzdWJ4NTQwIHN1YnRyYWN0ICcxMjM0NTY3ODgnIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTQxIHN1YnRyYWN0ICcxMjM0NTY3ODgnIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTQyIHN1YnRyYWN0ICcxMjM0NTY3ODgnIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4NycgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitzdWJ4NTUwIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScKK3N1Yng1NTEgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NTIgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NTMgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NTQgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NTUgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NTYgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NTcgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NTggc3VidHJhY3QgJzEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NTkgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NjAgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NjEgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NjIgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NjMgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NjQgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NjUgc3VidHJhY3QgJzEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1NjYgc3VidHJhY3QgJzEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzNDU2Nzg4Jworc3VieDU2NyBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjM0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorc3VieDU2OCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjM0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorc3VieDU2OSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjM0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorCistLSBzeW1tZXRyeS4uLgorcm91bmRpbmc6IGhhbGZfdXAKK3N1Yng2MDAgc3VidHJhY3QgMCAgICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScKK3N1Yng2MDEgc3VidHJhY3QgMC4wMDAwMDAwMDEgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjAyIHN1YnRyYWN0IDAuMDAwMDAxICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDYwMyBzdWJ0cmFjdCAwLjEgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MDQgc3VidHJhY3QgMC40ICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjA1IHN1YnRyYWN0IDAuNDkgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDYwNiBzdWJ0cmFjdCAwLjQ5OTk5OSAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MDcgc3VidHJhY3QgMC40OTk5OTk5OTkgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjA4IHN1YnRyYWN0IDAuNSAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDYwOSBzdWJ0cmFjdCAwLjUwMDAwMDAwMSAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MTAgc3VidHJhY3QgMC41MDAwMDEgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjExIHN1YnRyYWN0IDAuNTEgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYxMiBzdWJ0cmFjdCAwLjYgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MTMgc3VidHJhY3QgMC45ICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjE0IHN1YnRyYWN0IDAuOTk5OTkgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYxNSBzdWJ0cmFjdCAwLjk5OTk5OTk5OSAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MTYgc3VidHJhY3QgMSAgICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcKK3N1Yng2MTcgc3VidHJhY3QgMS4wMDAwMDAwMDEgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjE4IHN1YnRyYWN0IDEuMDAwMDEgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYxOSBzdWJ0cmFjdCAxLjEgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorc3VieDYyMCBzdWJ0cmFjdCAwICAgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg5Jworc3VieDYyMSBzdWJ0cmFjdCAwLjAwMDAwMDAwMSAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MjIgc3VidHJhY3QgMC4wMDAwMDEgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjIzIHN1YnRyYWN0IDAuMSAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDYyNCBzdWJ0cmFjdCAwLjQgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MjUgc3VidHJhY3QgMC40OSAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjI2IHN1YnRyYWN0IDAuNDk5OTk5ICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDYyNyBzdWJ0cmFjdCAwLjQ5OTk5OTk5OSAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2Mjggc3VidHJhY3QgMC41ICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjI5IHN1YnRyYWN0IDAuNTAwMDAwMDAxICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYzMCBzdWJ0cmFjdCAwLjUwMDAwMSAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MzEgc3VidHJhY3QgMC41MSAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjMyIHN1YnRyYWN0IDAuNiAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYzMyBzdWJ0cmFjdCAwLjkgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MzQgc3VidHJhY3QgMC45OTk5OSAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjM1IHN1YnRyYWN0IDAuOTk5OTk5OTk5ICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYzNiBzdWJ0cmFjdCAxICAgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4Jworc3VieDYzNyBzdWJ0cmFjdCAxLjAwMDAwMDAxICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2Mzggc3VidHJhY3QgMS4wMDAwMSAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjM5IHN1YnRyYWN0IDEuMSAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorLS0gY3JpdGljYWwgZmV3IHdpdGggZXZlbiBib3R0b20gZGlnaXQuLi4KK3N1Yng2NDAgc3VidHJhY3QgMC40OTk5OTk5OTkgICAnMTIzNDU2Nzg4JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjQxIHN1YnRyYWN0IDAuNSAgICAgICAgICAgJzEyMzQ1Njc4OCcgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDY0MiBzdWJ0cmFjdCAwLjUwMDAwMDAwMSAgICcxMjM0NTY3ODgnIC0+ICctMTIzNDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGRvd24KK3N1Yng2NTAgc3VidHJhY3QgMCAgICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScKK3N1Yng2NTEgc3VidHJhY3QgMC4wMDAwMDAwMDEgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjUyIHN1YnRyYWN0IDAuMDAwMDAxICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDY1MyBzdWJ0cmFjdCAwLjEgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2NTQgc3VidHJhY3QgMC40ICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjU1IHN1YnRyYWN0IDAuNDkgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDY1NiBzdWJ0cmFjdCAwLjQ5OTk5OSAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2NTcgc3VidHJhY3QgMC40OTk5OTk5OTkgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjU4IHN1YnRyYWN0IDAuNSAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDY1OSBzdWJ0cmFjdCAwLjUwMDAwMDAwMSAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2NjAgc3VidHJhY3QgMC41MDAwMDEgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjYxIHN1YnRyYWN0IDAuNTEgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDY2MiBzdWJ0cmFjdCAwLjYgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2NjMgc3VidHJhY3QgMC45ICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjY0IHN1YnRyYWN0IDAuOTk5OTkgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDY2NSBzdWJ0cmFjdCAwLjk5OTk5OTk5OSAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2NjYgc3VidHJhY3QgMSAgICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcKK3N1Yng2Njcgc3VidHJhY3QgMS4wMDAwMDAwMSAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4NycgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjY4IHN1YnRyYWN0IDEuMDAwMDEgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorc3VieDY2OSBzdWJ0cmFjdCAxLjEgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKKworCistLSBsb3RzIG9mIGxlYWRpbmcgemVyb3MgaW4gaW50ZXJtZWRpYXRlIHJlc3VsdCwgYW5kIHNob3dpbmcgZWZmZWN0cyBvZgorLS0gaW5wdXQgcm91bmRpbmcgd291bGQgaGF2ZSBhZmZlY3RlZCB0aGUgZm9sbG93aW5nCitwcmVjaXNpb246IDkKK3JvdW5kaW5nOiBoYWxmX3VwCitzdWJ4NjcwIHN1YnRyYWN0ICcxMjM0NTY3ODknICcxMjM0NTY3ODguMScgLT4gMC45CitzdWJ4NjcxIHN1YnRyYWN0ICcxMjM0NTY3ODknICcxMjM0NTY3ODguOScgLT4gMC4xCitzdWJ4NjcyIHN1YnRyYWN0ICcxMjM0NTY3ODknICcxMjM0NTY3ODkuMScgLT4gLTAuMQorc3VieDY3MyBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAnMTIzNDU2Nzg5LjUnIC0+IC0wLjUKK3N1Yng2NzQgc3VidHJhY3QgJzEyMzQ1Njc4OScgJzEyMzQ1Njc4OS45JyAtPiAtMC45CisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK3N1Yng2ODAgc3VidHJhY3QgJzEyMzQ1Njc4OScgJzEyMzQ1Njc4OC4xJyAtPiAwLjkKK3N1Yng2ODEgc3VidHJhY3QgJzEyMzQ1Njc4OScgJzEyMzQ1Njc4OC45JyAtPiAwLjEKK3N1Yng2ODIgc3VidHJhY3QgJzEyMzQ1Njc4OScgJzEyMzQ1Njc4OS4xJyAtPiAtMC4xCitzdWJ4NjgzIHN1YnRyYWN0ICcxMjM0NTY3ODknICcxMjM0NTY3ODkuNScgLT4gLTAuNQorc3VieDY4NCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAnMTIzNDU2Nzg5LjknIC0+IC0wLjkKKworc3VieDY4NSBzdWJ0cmFjdCAnMTIzNDU2Nzg4JyAnMTIzNDU2Nzg3LjEnIC0+IDAuOQorc3VieDY4NiBzdWJ0cmFjdCAnMTIzNDU2Nzg4JyAnMTIzNDU2Nzg3LjknIC0+IDAuMQorc3VieDY4NyBzdWJ0cmFjdCAnMTIzNDU2Nzg4JyAnMTIzNDU2Nzg4LjEnIC0+IC0wLjEKK3N1Yng2ODggc3VidHJhY3QgJzEyMzQ1Njc4OCcgJzEyMzQ1Njc4OC41JyAtPiAtMC41CitzdWJ4Njg5IHN1YnRyYWN0ICcxMjM0NTY3ODgnICcxMjM0NTY3ODguOScgLT4gLTAuOQorCityb3VuZGluZzogZG93bgorc3VieDY5MCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAnMTIzNDU2Nzg4LjEnIC0+IDAuOQorc3VieDY5MSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAnMTIzNDU2Nzg4LjknIC0+IDAuMQorc3VieDY5MiBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAnMTIzNDU2Nzg5LjEnIC0+IC0wLjEKK3N1Yng2OTMgc3VidHJhY3QgJzEyMzQ1Njc4OScgJzEyMzQ1Njc4OS41JyAtPiAtMC41CitzdWJ4Njk0IHN1YnRyYWN0ICcxMjM0NTY3ODknICcxMjM0NTY3ODkuOScgLT4gLTAuOQorCistLSBpbnB1dCBwcmVwYXJhdGlvbiB0ZXN0cworcm91bmRpbmc6IGhhbGZfdXAKK3ByZWNpc2lvbjogMworCitzdWJ4NzAwIHN1YnRyYWN0ICcxMjM0NTY3ODkwMDAwMCcgIC05OTk5OTk5OTk5OTk5IC0+ICAnMi4yM0UrMTMnIEluZXhhY3QgUm91bmRlZAorc3VieDcwMSBzdWJ0cmFjdCAgJzk5OTk5OTk5OTk5OTknIC0xMjM0NTY3ODkwMDAwMCAtPiAgJzIuMjNFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng3MDIgc3VidHJhY3QgJzEyRSszJyAgJy0zNDU2JyAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorc3VieDcwMyBzdWJ0cmFjdCAnMTJFKzMnICAnLTM0NDYnIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NzA0IHN1YnRyYWN0ICcxMkUrMycgICctMzQ1NCcgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng3MDUgc3VidHJhY3QgJzEyRSszJyAgJy0zNDQ0JyAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorCitzdWJ4NzA2IHN1YnRyYWN0ICczNDU2JyAgJy0xMkUrMycgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng3MDcgc3VidHJhY3QgJzM0NDYnICAnLTEyRSszJyAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorc3VieDcwOCBzdWJ0cmFjdCAnMzQ1NCcgICctMTJFKzMnIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NzA5IHN1YnRyYWN0ICczNDQ0JyAgJy0xMkUrMycgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cyBbc3Vibm9ybWFscyBub3cgcG9zc2libGVdCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcHJlY2lzaW9uOiA5Cityb3VuZGluZzogZG93bgorc3VieDcxMCBzdWJ0cmFjdCAxRSs5OTk5OTk5OTkgICAgLTlFKzk5OTk5OTk5OSAgIC0+IDkuOTk5OTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng3MTEgc3VidHJhY3QgOUUrOTk5OTk5OTk5ICAgIC0xRSs5OTk5OTk5OTkgICAtPiA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl91cAorc3VieDcxMiBzdWJ0cmFjdCAxRSs5OTk5OTk5OTkgICAgLTlFKzk5OTk5OTk5OSAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorc3VieDcxMyBzdWJ0cmFjdCA5RSs5OTk5OTk5OTkgICAgLTFFKzk5OTk5OTk5OSAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorc3VieDcxNCBzdWJ0cmFjdCAtMS4xRS05OTk5OTk5OTkgLTFFLTk5OTk5OTk5OSAgIC0+IC0xRS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorc3VieDcxNSBzdWJ0cmFjdCAxRS05OTk5OTk5OTkgICAgKzEuMWUtOTk5OTk5OTk5IC0+IC0xRS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorc3VieDcxNiBzdWJ0cmFjdCAtMUUrOTk5OTk5OTk5ICAgKzlFKzk5OTk5OTk5OSAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng3MTcgc3VidHJhY3QgLTlFKzk5OTk5OTk5OSAgICsxRSs5OTk5OTk5OTkgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitzdWJ4NzE4IHN1YnRyYWN0ICsxLjFFLTk5OTk5OTk5OSArMUUtOTk5OTk5OTk5ICAgLT4gMUUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK3N1Yng3MTkgc3VidHJhY3QgLTFFLTk5OTk5OTk5OSAgIC0xLjFlLTk5OTk5OTk5OSAtPiAxRS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorCitwcmVjaXNpb246IDMKK3N1Yng3MjAgc3VidHJhY3QgMSAgOS45OTlFKzk5OTk5OTk5OSAgIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3N1Yng3MjEgc3VidHJhY3QgMSAtOS45OTlFKzk5OTk5OTk5OSAgIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3N1Yng3MjIgc3VidHJhY3QgICAgOS45OTlFKzk5OTk5OTk5OSAxIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3N1Yng3MjMgc3VidHJhY3QgICAtOS45OTlFKzk5OTk5OTk5OSAxIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3N1Yng3MjQgc3VidHJhY3QgMSAgOS45OTlFKzk5OTk5OTk5OSAgIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3N1Yng3MjUgc3VidHJhY3QgMSAtOS45OTlFKzk5OTk5OTk5OSAgIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3N1Yng3MjYgc3VidHJhY3QgICAgOS45OTlFKzk5OTk5OTk5OSAxIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3N1Yng3Mjcgc3VidHJhY3QgICAtOS45OTlFKzk5OTk5OTk5OSAxIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworLS0gW21vcmUgYmVsb3ddCisKKy0tIGxvbmcgb3BlcmFuZCBjaGVja3MKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK3N1YjczMSBzdWJ0cmFjdCAxMjM0NTY3ODAwMCAwIC0+ICAxLjIzNDU2NzgwRSsxMCBSb3VuZGVkCitzdWI3MzIgc3VidHJhY3QgMCAxMjM0NTY3ODAwMCAtPiAtMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorc3ViNzMzIHN1YnRyYWN0IDEyMzQ1Njc4MDAgIDAgLT4gIDEuMjM0NTY3ODBFKzkgUm91bmRlZAorc3ViNzM0IHN1YnRyYWN0IDAgMTIzNDU2NzgwMCAgLT4gLTEuMjM0NTY3ODBFKzkgUm91bmRlZAorc3ViNzM1IHN1YnRyYWN0IDEyMzQ1Njc4OTAgIDAgLT4gIDEuMjM0NTY3ODlFKzkgUm91bmRlZAorc3ViNzM2IHN1YnRyYWN0IDAgMTIzNDU2Nzg5MCAgLT4gLTEuMjM0NTY3ODlFKzkgUm91bmRlZAorc3ViNzM3IHN1YnRyYWN0IDEyMzQ1Njc4OTEgIDAgLT4gIDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitzdWI3Mzggc3VidHJhY3QgMCAxMjM0NTY3ODkxICAtPiAtMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK3N1YjczOSBzdWJ0cmFjdCAxMjM0NTY3ODkwMSAwIC0+ICAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3N1Yjc0MCBzdWJ0cmFjdCAwIDEyMzQ1Njc4OTAxIC0+IC0xLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3N1Yjc0MSBzdWJ0cmFjdCAxMjM0NTY3ODk2ICAwIC0+ICAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorc3ViNzQyIHN1YnRyYWN0IDAgMTIzNDU2Nzg5NiAgLT4gLTEuMjM0NTY3OTBFKzkgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMTUKK3N1Yjc1MSBzdWJ0cmFjdCAxMjM0NTY3ODAwMCAwIC0+ICAxMjM0NTY3ODAwMAorc3ViNzUyIHN1YnRyYWN0IDAgMTIzNDU2NzgwMDAgLT4gLTEyMzQ1Njc4MDAwCitzdWI3NTMgc3VidHJhY3QgMTIzNDU2NzgwMCAgMCAtPiAgMTIzNDU2NzgwMAorc3ViNzU0IHN1YnRyYWN0IDAgMTIzNDU2NzgwMCAgLT4gLTEyMzQ1Njc4MDAKK3N1Yjc1NSBzdWJ0cmFjdCAxMjM0NTY3ODkwICAwIC0+ICAxMjM0NTY3ODkwCitzdWI3NTYgc3VidHJhY3QgMCAxMjM0NTY3ODkwICAtPiAtMTIzNDU2Nzg5MAorc3ViNzU3IHN1YnRyYWN0IDEyMzQ1Njc4OTEgIDAgLT4gIDEyMzQ1Njc4OTEKK3N1Yjc1OCBzdWJ0cmFjdCAwIDEyMzQ1Njc4OTEgIC0+IC0xMjM0NTY3ODkxCitzdWI3NTkgc3VidHJhY3QgMTIzNDU2Nzg5MDEgMCAtPiAgMTIzNDU2Nzg5MDEKK3N1Yjc2MCBzdWJ0cmFjdCAwIDEyMzQ1Njc4OTAxIC0+IC0xMjM0NTY3ODkwMQorc3ViNzYxIHN1YnRyYWN0IDEyMzQ1Njc4OTYgIDAgLT4gIDEyMzQ1Njc4OTYKK3N1Yjc2MiBzdWJ0cmFjdCAwIDEyMzQ1Njc4OTYgIC0+IC0xMjM0NTY3ODk2CisKKy0tIFNwZWNpYWxzCitzdWJ4NzgwIHN1YnRyYWN0IC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK3N1Yng3ODEgc3VidHJhY3QgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorc3VieDc4MiBzdWJ0cmFjdCAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitzdWJ4NzgzIHN1YnRyYWN0IC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK3N1Yng3ODQgc3VidHJhY3QgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorc3VieDc4NSBzdWJ0cmFjdCAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitzdWJ4Nzg3IHN1YnRyYWN0IC0xMDAwICBJbmYgICAtPiAtSW5maW5pdHkKK3N1Yng3ODggc3VidHJhY3QgLUluZiAgIEluZiAgIC0+IC1JbmZpbml0eQorc3VieDc4OSBzdWJ0cmFjdCAtMSAgICAgSW5mICAgLT4gLUluZmluaXR5CitzdWJ4NzkwIHN1YnRyYWN0ICAwICAgICBJbmYgICAtPiAtSW5maW5pdHkKK3N1Yng3OTEgc3VidHJhY3QgIDEgICAgIEluZiAgIC0+IC1JbmZpbml0eQorc3VieDc5MiBzdWJ0cmFjdCAgMTAwMCAgSW5mICAgLT4gLUluZmluaXR5CisKK3N1Yng4MDAgc3VidHJhY3QgIEluZiAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODAxIHN1YnRyYWN0ICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK3N1Yng4MDIgc3VidHJhY3QgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorc3VieDgwMyBzdWJ0cmFjdCAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitzdWJ4ODA0IHN1YnRyYWN0ICBJbmYgIC0wICAgICAtPiAgSW5maW5pdHkKK3N1Yng4MDUgc3VidHJhY3QgIEluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorc3VieDgwNiBzdWJ0cmFjdCAgSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitzdWJ4ODA3IHN1YnRyYWN0ICBJbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKK3N1Yng4MDggc3VidHJhY3QgLTEwMDAgLUluZiAgIC0+ICBJbmZpbml0eQorc3VieDgwOSBzdWJ0cmFjdCAtSW5mICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4MTAgc3VidHJhY3QgLTEgICAgLUluZiAgIC0+ICBJbmZpbml0eQorc3VieDgxMSBzdWJ0cmFjdCAtMCAgICAtSW5mICAgLT4gIEluZmluaXR5CitzdWJ4ODEyIHN1YnRyYWN0ICAwICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK3N1Yng4MTMgc3VidHJhY3QgIDEgICAgLUluZiAgIC0+ICBJbmZpbml0eQorc3VieDgxNCBzdWJ0cmFjdCAgMTAwMCAtSW5mICAgLT4gIEluZmluaXR5CitzdWJ4ODE1IHN1YnRyYWN0ICBJbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKKworc3VieDgyMSBzdWJ0cmFjdCAgTmFOICAgSW5mICAgLT4gIE5hTgorc3VieDgyMiBzdWJ0cmFjdCAtTmFOICAgMTAwMCAgLT4gLU5hTgorc3VieDgyMyBzdWJ0cmFjdCAgTmFOICAgMSAgICAgLT4gIE5hTgorc3VieDgyNCBzdWJ0cmFjdCAgTmFOICAgMCAgICAgLT4gIE5hTgorc3VieDgyNSBzdWJ0cmFjdCAgTmFOICAtMCAgICAgLT4gIE5hTgorc3VieDgyNiBzdWJ0cmFjdCAgTmFOICAtMSAgICAgLT4gIE5hTgorc3VieDgyNyBzdWJ0cmFjdCAgTmFOICAtMTAwMCAgLT4gIE5hTgorc3VieDgyOCBzdWJ0cmFjdCAgTmFOICAtSW5mICAgLT4gIE5hTgorc3VieDgyOSBzdWJ0cmFjdCAtTmFOICAgTmFOICAgLT4gLU5hTgorc3VieDgzMCBzdWJ0cmFjdCAtSW5mICAgTmFOICAgLT4gIE5hTgorc3VieDgzMSBzdWJ0cmFjdCAtMTAwMCAgTmFOICAgLT4gIE5hTgorc3VieDgzMiBzdWJ0cmFjdCAtMSAgICAgTmFOICAgLT4gIE5hTgorc3VieDgzMyBzdWJ0cmFjdCAtMCAgICAgTmFOICAgLT4gIE5hTgorc3VieDgzNCBzdWJ0cmFjdCAgMCAgICAgTmFOICAgLT4gIE5hTgorc3VieDgzNSBzdWJ0cmFjdCAgMSAgICAgTmFOICAgLT4gIE5hTgorc3VieDgzNiBzdWJ0cmFjdCAgMTAwMCAtTmFOICAgLT4gLU5hTgorc3VieDgzNyBzdWJ0cmFjdCAgSW5mICAgTmFOICAgLT4gIE5hTgorCitzdWJ4ODQxIHN1YnRyYWN0ICBzTmFOICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg0MiBzdWJ0cmFjdCAtc05hTiAgMTAwMCAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NDMgc3VidHJhY3QgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODQ0IHN1YnRyYWN0ICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg0NSBzdWJ0cmFjdCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NDYgc3VidHJhY3QgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODQ3IHN1YnRyYWN0ICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg0OCBzdWJ0cmFjdCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NDkgc3VidHJhY3QgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODUwIHN1YnRyYWN0ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg1MSBzdWJ0cmFjdCAtSW5mIC1zTmFOICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NTIgc3VidHJhY3QgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODUzIHN1YnRyYWN0IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg1NCBzdWJ0cmFjdCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NTUgc3VidHJhY3QgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODU2IHN1YnRyYWN0ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg1NyBzdWJ0cmFjdCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NTggc3VidHJhY3QgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODU5IHN1YnRyYWN0ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitzdWJ4ODYxIHN1YnRyYWN0ICBOYU4wMSAgIC1JbmYgICAgIC0+ICBOYU4xCitzdWJ4ODYyIHN1YnRyYWN0IC1OYU4wMiAgIC0xMDAwICAgIC0+IC1OYU4yCitzdWJ4ODYzIHN1YnRyYWN0ICBOYU4wMyAgICAxMDAwICAgIC0+ICBOYU4zCitzdWJ4ODY0IHN1YnRyYWN0ICBOYU4wNCAgICBJbmYgICAgIC0+ICBOYU40CitzdWJ4ODY1IHN1YnRyYWN0ICBOYU4wNSAgICBOYU42MSAgIC0+ICBOYU41CitzdWJ4ODY2IHN1YnRyYWN0IC1JbmYgICAgIC1OYU43MSAgIC0+IC1OYU43MQorc3VieDg2NyBzdWJ0cmFjdCAtMTAwMCAgICAgTmFOODEgICAtPiAgTmFOODEKK3N1Yng4Njggc3VidHJhY3QgIDEwMDAgICAgIE5hTjkxICAgLT4gIE5hTjkxCitzdWJ4ODY5IHN1YnRyYWN0ICBJbmYgICAgICBOYU4xMDEgIC0+ICBOYU4xMDEKK3N1Yng4NzEgc3VidHJhY3QgIHNOYU4wMTEgIC1JbmYgICAgLT4gIE5hTjExICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg3MiBzdWJ0cmFjdCAgc05hTjAxMiAgLTEwMDAgICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODczIHN1YnRyYWN0IC1zTmFOMDEzICAgMTAwMCAgIC0+IC1OYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NzQgc3VidHJhY3QgIHNOYU4wMTQgICBOYU4xNzEgLT4gIE5hTjE0ICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg3NSBzdWJ0cmFjdCAgc05hTjAxNSAgc05hTjE4MSAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODc2IHN1YnRyYWN0ICBOYU4wMTYgICBzTmFOMTkxIC0+ICBOYU4xOTEgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4Nzcgc3VidHJhY3QgLUluZiAgICAgIHNOYU4yMDEgLT4gIE5hTjIwMSBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg3OCBzdWJ0cmFjdCAtMTAwMCAgICAgc05hTjIxMSAtPiAgTmFOMjExIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODc5IHN1YnRyYWN0ICAxMDAwICAgIC1zTmFOMjIxIC0+IC1OYU4yMjEgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4ODAgc3VidHJhY3QgIEluZiAgICAgIHNOYU4yMzEgLT4gIE5hTjIzMSBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg4MSBzdWJ0cmFjdCAgTmFOMDI1ICAgc05hTjI0MSAtPiAgTmFOMjQxIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGVkZ2UgY2FzZSBzcGlsbHMKK3N1Yng5MDEgc3VidHJhY3QgIDIuRS0zICAxLjAwMiAgLT4gLTEuMDAwCitzdWJ4OTAyIHN1YnRyYWN0ICAyLjBFLTMgIDEuMDAyICAtPiAtMS4wMDAwCitzdWJ4OTAzIHN1YnRyYWN0ICAyLjAwRS0zICAxLjAwMjAgIC0+IC0xLjAwMDAwCitzdWJ4OTA0IHN1YnRyYWN0ICAyLjAwMEUtMyAgMS4wMDIwMCAgLT4gLTEuMDAwMDAwCitzdWJ4OTA1IHN1YnRyYWN0ICAyLjAwMDBFLTMgIDEuMDAyMDAwICAtPiAtMS4wMDAwMDAwCitzdWJ4OTA2IHN1YnRyYWN0ICAyLjAwMDAwRS0zICAxLjAwMjAwMDAgIC0+IC0xLjAwMDAwMDAwCitzdWJ4OTA3IHN1YnRyYWN0ICAyLjAwMDAwMEUtMyAgMS4wMDIwMDAwMCAgLT4gLTEuMDAwMDAwMDAwCitzdWJ4OTA4IHN1YnRyYWN0ICAyLjAwMDAwMDBFLTMgIDEuMDAyMDAwMDAwICAtPiAtMS4wMDAwMDAwMDAwCisKKy0tIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvd3MKK3ByZWNpc2lvbjogMworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3N1YngxMDEwIHN1YnRyYWN0ICAwICAxLjAwRS05OTkgICAgICAgLT4gIC0xLjAwRS05OTkKK3N1YngxMDExIHN1YnRyYWN0ICAwICAwLjFFLTk5OSAgICAgICAgLT4gIC0xRS0xMDAwICAgU3Vibm9ybWFsCitzdWJ4MTAxMiBzdWJ0cmFjdCAgMCAgMC4xMEUtOTk5ICAgICAgIC0+ICAtMS4wRS0xMDAwIFN1Ym5vcm1hbAorc3VieDEwMTMgc3VidHJhY3QgIDAgIDAuMTAwRS05OTkgICAgICAtPiAgLTEuMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorc3VieDEwMTQgc3VidHJhY3QgIDAgIDAuMDFFLTk5OSAgICAgICAtPiAgLTFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCitzdWJ4MTAxNSBzdWJ0cmFjdCAgMCAgMC45OTlFLTk5OSAgICAgIC0+ICAtMS4wMEUtOTk5IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTAxNiBzdWJ0cmFjdCAgMCAgMC4wOTlFLTk5OSAgICAgIC0+ICAtMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTAxNyBzdWJ0cmFjdCAgMCAgMC4wMDlFLTk5OSAgICAgIC0+ICAtMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTAxOCBzdWJ0cmFjdCAgMCAgMC4wMDFFLTk5OSAgICAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK3N1YngxMDE5IHN1YnRyYWN0ICAwICAwLjAwMDlFLTk5OSAgICAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorc3VieDEwMjAgc3VidHJhY3QgIDAgIDAuMDAwMUUtOTk5ICAgICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCisKK3N1YngxMDMwIHN1YnRyYWN0ICAwIC0xLjAwRS05OTkgICAgICAgLT4gICAxLjAwRS05OTkKK3N1YngxMDMxIHN1YnRyYWN0ICAwIC0wLjFFLTk5OSAgICAgICAgLT4gICAxRS0xMDAwICAgU3Vibm9ybWFsCitzdWJ4MTAzMiBzdWJ0cmFjdCAgMCAtMC4xMEUtOTk5ICAgICAgIC0+ICAgMS4wRS0xMDAwIFN1Ym5vcm1hbAorc3VieDEwMzMgc3VidHJhY3QgIDAgLTAuMTAwRS05OTkgICAgICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorc3VieDEwMzQgc3VidHJhY3QgIDAgLTAuMDFFLTk5OSAgICAgICAtPiAgIDFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCitzdWJ4MTAzNSBzdWJ0cmFjdCAgMCAtMC45OTlFLTk5OSAgICAgIC0+ICAgMS4wMEUtOTk5IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTAzNiBzdWJ0cmFjdCAgMCAtMC4wOTlFLTk5OSAgICAgIC0+ICAgMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTAzNyBzdWJ0cmFjdCAgMCAtMC4wMDlFLTk5OSAgICAgIC0+ICAgMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTAzOCBzdWJ0cmFjdCAgMCAtMC4wMDFFLTk5OSAgICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK3N1YngxMDM5IHN1YnRyYWN0ICAwIC0wLjAwMDlFLTk5OSAgICAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorc3VieDEwNDAgc3VidHJhY3QgIDAgLTAuMDAwMUUtOTk5ICAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCisKKy0tIHNvbWUgbm9uLXplcm8gc3Vibm9ybWFsIHN1YnRyYWN0cworLS0gc3VieDEwNTYgaXMgYSB0cmlja3kgY2FzZQorcm91bmRpbmc6IGhhbGZfdXAKK3N1YngxMDUwIHN1YnRyYWN0ICAxLjAwRS05OTkgICAwLjFFLTk5OSAgLT4gICA5LjBFLTEwMDAgIFN1Ym5vcm1hbAorc3VieDEwNTEgc3VidHJhY3QgIDAuMUUtOTk5ICAgIDAuMUUtOTk5ICAtPiAgIDBFLTEwMDAKK3N1YngxMDUyIHN1YnRyYWN0ICAwLjEwRS05OTkgICAwLjFFLTk5OSAgLT4gICAwRS0xMDAxCitzdWJ4MTA1MyBzdWJ0cmFjdCAgMC4xMDBFLTk5OSAgMC4xRS05OTkgIC0+ICAgMEUtMTAwMSAgICBDbGFtcGVkCitzdWJ4MTA1NCBzdWJ0cmFjdCAgMC4wMUUtOTk5ICAgMC4xRS05OTkgIC0+ICAgLTlFLTEwMDEgICBTdWJub3JtYWwKK3N1YngxMDU1IHN1YnRyYWN0ICAwLjk5OUUtOTk5ICAwLjFFLTk5OSAgLT4gICA5LjBFLTEwMDAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTA1NiBzdWJ0cmFjdCAgMC4wOTlFLTk5OSAgMC4xRS05OTkgIC0+ICAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitzdWJ4MTA1NyBzdWJ0cmFjdCAgMC4wMDlFLTk5OSAgMC4xRS05OTkgIC0+ICAgLTlFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDEwNTggc3VidHJhY3QgIDAuMDAxRS05OTkgIDAuMUUtOTk5ICAtPiAgIC0xLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK3N1YngxMDU5IHN1YnRyYWN0ICAwLjAwMDlFLTk5OSAwLjFFLTk5OSAgLT4gICAtMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTA2MCBzdWJ0cmFjdCAgMC4wMDAxRS05OTkgMC4xRS05OTkgIC0+ICAgLTEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCisKKy0tIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitwcmVjaXNpb246ICAgNQorbWF4ZXhwb25lbnQ6IDc5CittaW5leHBvbmVudDogLTc5CitzdWJ4MTEwMSBzdWJ0cmFjdCAgMCAxLjUyNDQ0RS04MCAtPiAtMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTEwMiBzdWJ0cmFjdCAgMCAxLjUyNDQ1RS04MCAtPiAtMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTEwMyBzdWJ0cmFjdCAgMCAxLjUyNDQ2RS04MCAtPiAtMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTEwNCBzdWJ0cmFjdCAgMS41MjQ0NEUtODAgMCAtPiAgMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTEwNSBzdWJ0cmFjdCAgMS41MjQ0NUUtODAgMCAtPiAgMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTEwNiBzdWJ0cmFjdCAgMS41MjQ0NkUtODAgMCAtPiAgMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKK3N1YngxMTExIHN1YnRyYWN0ICAxLjIzNDU2NzhFLTgwICAxLjIzNDU2NzFFLTgwIC0+ICAwRS04MyBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitzdWJ4MTExMiBzdWJ0cmFjdCAgMS4yMzQ1Njc4RS04MCAgMS4yMzQ1NjE4RS04MCAtPiAgMEUtODMgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorc3VieDExMTMgc3VidHJhY3QgIDEuMjM0NTY3OEUtODAgIDEuMjM0NTE3OEUtODAgLT4gIDBFLTgzIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK3N1YngxMTE0IHN1YnRyYWN0ICAxLjIzNDU2NzhFLTgwICAxLjIzNDE2NzhFLTgwIC0+ICAwRS04MyBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitzdWJ4MTExNSBzdWJ0cmFjdCAgMS4yMzQ1Njc4RS04MCAgMS4yMzE1Njc4RS04MCAtPiAgM0UtODMgICAgICAgICBSb3VuZGVkIFN1Ym5vcm1hbAorc3VieDExMTYgc3VidHJhY3QgIDEuMjM0NTY3OEUtODAgIDEuMjE0NTY3OEUtODAgLT4gIDIuMEUtODIgICAgICAgUm91bmRlZCBTdWJub3JtYWwKK3N1YngxMTE3IHN1YnRyYWN0ICAxLjIzNDU2NzhFLTgwICAxLjEzNDU2NzhFLTgwIC0+ICAxLjAwRS04MSAgICAgIFJvdW5kZWQgU3Vibm9ybWFsCitzdWJ4MTExOCBzdWJ0cmFjdCAgMS4yMzQ1Njc4RS04MCAgMC4yMzQ1Njc4RS04MCAtPiAgMS4wMDBFLTgwICAgICBSb3VuZGVkIFN1Ym5vcm1hbAorCitwcmVjaXNpb246ICAgMzQKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCistLSBFeGFtcGxlcyBmcm9tIFNRTCBwcm9wb3NhbCAoS3Jpc2huYSBLdWxrYXJuaSkKK3N1YngxMTI1ICBzdWJ0cmFjdCAxMzBFLTIgIDEyMEUtMiAtPiAwLjEwCitzdWJ4MTEyNiAgc3VidHJhY3QgMTMwRS0yICAxMkUtMSAgLT4gMC4xMAorc3VieDExMjcgIHN1YnRyYWN0IDEzMEUtMiAgMUUwICAgIC0+IDAuMzAKK3N1YngxMTI4ICBzdWJ0cmFjdCAxRTIgICAgIDFFNCAgICAtPiAtOS45RSszCisKKy0tIE51bGwgdGVzdHMKK3N1Yng5OTkwIHN1YnRyYWN0IDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3VieDk5OTEgc3VidHJhY3QgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3Rlc3RhbGwuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvdGVzdGFsbC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjY2U3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3Rlc3RhbGwuZGVjVGVzdApAQCAtMCwwICsxLDg3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHRlc3RhbGwuZGVjVGVzdCAtLSBydW4gYWxsIGdlbmVyYWwgZGVjaW1hbCBhcml0aG1ldGljIHRlc3RjYXNlcyAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gY29yZSB0ZXN0cyAodXNpbmcgRXh0ZW5kZWQ6IDEpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitkZWN0ZXN0OiBiYXNlCisKK2RlY3Rlc3Q6IGFicworZGVjdGVzdDogYWRkCitkZWN0ZXN0OiBhbmQKK2RlY3Rlc3Q6IGNsYW1wCitkZWN0ZXN0OiBjbGFzcworZGVjdGVzdDogY29tcGFyZQorZGVjdGVzdDogY29tcGFyZXNpZworZGVjdGVzdDogY29tcGFyZXRvdGFsCitkZWN0ZXN0OiBjb21wYXJldG90bWFnCitkZWN0ZXN0OiBjb3B5CitkZWN0ZXN0OiBjb3B5YWJzCitkZWN0ZXN0OiBjb3B5bmVnYXRlCitkZWN0ZXN0OiBjb3B5c2lnbgorZGVjdGVzdDogZGl2aWRlCitkZWN0ZXN0OiBkaXZpZGVpbnQKK2RlY3Rlc3Q6IGV4cAorZGVjdGVzdDogZm1hCitkZWN0ZXN0OiBpbmV4YWN0CitkZWN0ZXN0OiBpbnZlcnQKK2RlY3Rlc3Q6IGxuCitkZWN0ZXN0OiBsb2diCitkZWN0ZXN0OiBsb2cxMAorZGVjdGVzdDogbWF4CitkZWN0ZXN0OiBtYXhtYWcKK2RlY3Rlc3Q6IG1pbgorZGVjdGVzdDogbWlubWFnCitkZWN0ZXN0OiBtaW51cworZGVjdGVzdDogbXVsdGlwbHkKK2RlY3Rlc3Q6IG5leHRtaW51cworZGVjdGVzdDogbmV4dHBsdXMKK2RlY3Rlc3Q6IG5leHR0b3dhcmQKK2RlY3Rlc3Q6IG9yCitkZWN0ZXN0OiBwbHVzCitkZWN0ZXN0OiBwb3dlcgorZGVjdGVzdDogcG93ZXJzcXJ0CitkZWN0ZXN0OiBxdWFudGl6ZQorZGVjdGVzdDogcmFuZG9tcworZGVjdGVzdDogcmVkdWNlICAgICAgICAgICAgICAgLS0gW3dhcyBjYWxsZWQgbm9ybWFsaXplXQorZGVjdGVzdDogcmVtYWluZGVyCitkZWN0ZXN0OiByZW1haW5kZXJuZWFyCitkZWN0ZXN0OiByZXNjYWxlICAgICAgICAgICAgICAtLSBbb2Jzb2xldGVdCitkZWN0ZXN0OiByb3RhdGUKK2RlY3Rlc3Q6IHJvdW5kaW5nCitkZWN0ZXN0OiBzYW1lcXVhbnR1bQorZGVjdGVzdDogc2NhbGViCitkZWN0ZXN0OiBzaGlmdAorZGVjdGVzdDogc3F1YXJlcm9vdAorZGVjdGVzdDogc3VidHJhY3QKK2RlY3Rlc3Q6IHRvaW50ZWdyYWwKK2RlY3Rlc3Q6IHRvaW50ZWdyYWx4CitkZWN0ZXN0OiB0cmltCitkZWN0ZXN0OiB4b3IKKworLS0gVGhlIG5leHQgYXJlIGZvciB0aGUgU3RyYXdtYW4gNGQgY29uY3JldGUgcmVwcmVzZW50YXRpb25zIGFuZAorLS0gdGVzdHMgYXQgdGhvc2Ugc2l6ZXMgW2luY2x1ZGluZyBkc0VuY29kZSwgZGRFbmNvZGUsIGFuZCBkcUVuY29kZSwKKy0tIHdoaWNoIHJlcGxhY2UgZGVjaW1hbDMyLCBkZWNpbWFsNjQsIGFuZCBkZWNpbWFsMTI4XQorZGVjdGVzdDogZGVjU2luZ2xlCitkZWN0ZXN0OiBkZWNEb3VibGUKK2RlY3Rlc3Q6IGRlY1F1YWQKKworLS0gR2VuZXJhbCAzMS0+MzMtZGlnaXQgYm91bmRhcnkgdGVzdHMKK2RlY3Rlc3Q6IHJhbmRvbWJvdW5kMzIKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS90b2ludGVncmFsLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3RvaW50ZWdyYWwuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjNmYjk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS90b2ludGVncmFsLmRlY1Rlc3QKQEAgLTAsMCArMSwyNDEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gdG9pbnRlZ3JhbC5kZWNUZXN0IC0tIHJvdW5kIGRlY2ltYWwgdG8gaW50ZWdyYWwgdmFsdWUgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyB0ZXN0cyB0aGUgZXh0ZW5kZWQgc3BlY2lmaWNhdGlvbiAncm91bmQtdG8taW50ZWdyYWwKKy0tIHZhbHVlJyBvcGVyYXRpb24gKGZyb20gSUVFRSA4NTQsIGxhdGVyIG1vZGlmaWVkIGluIDc1NHIpLgorLS0gQWxsIG5vbi16ZXJvIHJlc3VsdHMgYXJlIGRlZmluZWQgYXMgYmVpbmcgdGhvc2UgZnJvbSBlaXRoZXIgY29weSBvcgorLS0gcXVhbnRpemUsIHNvIHRob3NlIGFyZSBhc3N1bWVkIHRvIGhhdmUgYmVlbiB0ZXN0ZWQuCistLSBOb3RlIHRoYXQgNzU0ciByZXF1aXJlcyB0aGF0IEluZXhhY3Qgbm90IGJlIHNldCwgYW5kIHdlIHNpbWlsYXJseQorLS0gYXNzdW1lIFJvdW5kZWQgaXMgbm90IHNldC4KKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworaW50eDAwMSB0b2ludGVncmFsICAgICAgMCAgICAgLT4gIDAKK2ludHgwMDIgdG9pbnRlZ3JhbCAgICAgIDAuMCAgIC0+ICAwCitpbnR4MDAzIHRvaW50ZWdyYWwgICAgICAwLjEgICAtPiAgMAoraW50eDAwNCB0b2ludGVncmFsICAgICAgMC4yICAgLT4gIDAKK2ludHgwMDUgdG9pbnRlZ3JhbCAgICAgIDAuMyAgIC0+ICAwCitpbnR4MDA2IHRvaW50ZWdyYWwgICAgICAwLjQgICAtPiAgMAoraW50eDAwNyB0b2ludGVncmFsICAgICAgMC41ICAgLT4gIDEKK2ludHgwMDggdG9pbnRlZ3JhbCAgICAgIDAuNiAgIC0+ICAxCitpbnR4MDA5IHRvaW50ZWdyYWwgICAgICAwLjcgICAtPiAgMQoraW50eDAxMCB0b2ludGVncmFsICAgICAgMC44ICAgLT4gIDEKK2ludHgwMTEgdG9pbnRlZ3JhbCAgICAgIDAuOSAgIC0+ICAxCitpbnR4MDEyIHRvaW50ZWdyYWwgICAgICAxICAgICAtPiAgMQoraW50eDAxMyB0b2ludGVncmFsICAgICAgMS4wICAgLT4gIDEKK2ludHgwMTQgdG9pbnRlZ3JhbCAgICAgIDEuMSAgIC0+ICAxCitpbnR4MDE1IHRvaW50ZWdyYWwgICAgICAxLjIgICAtPiAgMQoraW50eDAxNiB0b2ludGVncmFsICAgICAgMS4zICAgLT4gIDEKK2ludHgwMTcgdG9pbnRlZ3JhbCAgICAgIDEuNCAgIC0+ICAxCitpbnR4MDE4IHRvaW50ZWdyYWwgICAgICAxLjUgICAtPiAgMgoraW50eDAxOSB0b2ludGVncmFsICAgICAgMS42ICAgLT4gIDIKK2ludHgwMjAgdG9pbnRlZ3JhbCAgICAgIDEuNyAgIC0+ICAyCitpbnR4MDIxIHRvaW50ZWdyYWwgICAgICAxLjggICAtPiAgMgoraW50eDAyMiB0b2ludGVncmFsICAgICAgMS45ICAgLT4gIDIKKy0tIG5lZ2F0aXZlcworaW50eDAzMSB0b2ludGVncmFsICAgICAtMCAgICAgLT4gLTAKK2ludHgwMzIgdG9pbnRlZ3JhbCAgICAgLTAuMCAgIC0+IC0wCitpbnR4MDMzIHRvaW50ZWdyYWwgICAgIC0wLjEgICAtPiAtMAoraW50eDAzNCB0b2ludGVncmFsICAgICAtMC4yICAgLT4gLTAKK2ludHgwMzUgdG9pbnRlZ3JhbCAgICAgLTAuMyAgIC0+IC0wCitpbnR4MDM2IHRvaW50ZWdyYWwgICAgIC0wLjQgICAtPiAtMAoraW50eDAzNyB0b2ludGVncmFsICAgICAtMC41ICAgLT4gLTEKK2ludHgwMzggdG9pbnRlZ3JhbCAgICAgLTAuNiAgIC0+IC0xCitpbnR4MDM5IHRvaW50ZWdyYWwgICAgIC0wLjcgICAtPiAtMQoraW50eDA0MCB0b2ludGVncmFsICAgICAtMC44ICAgLT4gLTEKK2ludHgwNDEgdG9pbnRlZ3JhbCAgICAgLTAuOSAgIC0+IC0xCitpbnR4MDQyIHRvaW50ZWdyYWwgICAgIC0xICAgICAtPiAtMQoraW50eDA0MyB0b2ludGVncmFsICAgICAtMS4wICAgLT4gLTEKK2ludHgwNDQgdG9pbnRlZ3JhbCAgICAgLTEuMSAgIC0+IC0xCitpbnR4MDQ1IHRvaW50ZWdyYWwgICAgIC0xLjIgICAtPiAtMQoraW50eDA0NiB0b2ludGVncmFsICAgICAtMS4zICAgLT4gLTEKK2ludHgwNDcgdG9pbnRlZ3JhbCAgICAgLTEuNCAgIC0+IC0xCitpbnR4MDQ4IHRvaW50ZWdyYWwgICAgIC0xLjUgICAtPiAtMgoraW50eDA0OSB0b2ludGVncmFsICAgICAtMS42ICAgLT4gLTIKK2ludHgwNTAgdG9pbnRlZ3JhbCAgICAgLTEuNyAgIC0+IC0yCitpbnR4MDUxIHRvaW50ZWdyYWwgICAgIC0xLjggICAtPiAtMgoraW50eDA1MiB0b2ludGVncmFsICAgICAtMS45ICAgLT4gLTIKKy0tIG5leHQgdHdvIHdvdWxkIGJlIE5hTiB1c2luZyBxdWFudGl6ZSh4LCAwKQoraW50eDA1MyB0b2ludGVncmFsICAgIDEwRSszMCAgLT4gMS4wRSszMQoraW50eDA1NCB0b2ludGVncmFsICAgLTEwRSszMCAgLT4gLTEuMEUrMzEKKworLS0gbnVtYmVycyBhcm91bmQgcHJlY2lzaW9uCitwcmVjaXNpb246IDkKK2ludHgwNjAgdG9pbnRlZ3JhbCAnNTYyNjdFLTEwJyAgIC0+ICcwJworaW50eDA2MSB0b2ludGVncmFsICc1NjI2N0UtNScgICAgLT4gJzEnCitpbnR4MDYyIHRvaW50ZWdyYWwgJzU2MjY3RS0yJyAgICAtPiAnNTYzJworaW50eDA2MyB0b2ludGVncmFsICc1NjI2N0UtMScgICAgLT4gJzU2MjcnCitpbnR4MDY1IHRvaW50ZWdyYWwgJzU2MjY3RS0wJyAgICAtPiAnNTYyNjcnCitpbnR4MDY2IHRvaW50ZWdyYWwgJzU2MjY3RSswJyAgICAtPiAnNTYyNjcnCitpbnR4MDY3IHRvaW50ZWdyYWwgJzU2MjY3RSsxJyAgICAtPiAnNS42MjY3RSs1JworaW50eDA2OCB0b2ludGVncmFsICc1NjI2N0UrMicgICAgLT4gJzUuNjI2N0UrNicKK2ludHgwNjkgdG9pbnRlZ3JhbCAnNTYyNjdFKzMnICAgIC0+ICc1LjYyNjdFKzcnCitpbnR4MDcwIHRvaW50ZWdyYWwgJzU2MjY3RSs0JyAgICAtPiAnNS42MjY3RSs4JworaW50eDA3MSB0b2ludGVncmFsICc1NjI2N0UrNScgICAgLT4gJzUuNjI2N0UrOScKK2ludHgwNzIgdG9pbnRlZ3JhbCAnNTYyNjdFKzYnICAgIC0+ICc1LjYyNjdFKzEwJworaW50eDA3MyB0b2ludGVncmFsICcxLjIzRSs5NicgICAgLT4gJzEuMjNFKzk2JworaW50eDA3NCB0b2ludGVncmFsICcxLjIzRSszODQnICAgLT4gJzEuMjNFKzM4NCcKK2ludHgwNzUgdG9pbnRlZ3JhbCAnMS4yM0UrOTk5JyAgIC0+ICcxLjIzRSs5OTknCisKK2ludHgwODAgdG9pbnRlZ3JhbCAnLTU2MjY3RS0xMCcgIC0+ICctMCcKK2ludHgwODEgdG9pbnRlZ3JhbCAnLTU2MjY3RS01JyAgIC0+ICctMScKK2ludHgwODIgdG9pbnRlZ3JhbCAnLTU2MjY3RS0yJyAgIC0+ICctNTYzJworaW50eDA4MyB0b2ludGVncmFsICctNTYyNjdFLTEnICAgLT4gJy01NjI3JworaW50eDA4NSB0b2ludGVncmFsICctNTYyNjdFLTAnICAgLT4gJy01NjI2NycKK2ludHgwODYgdG9pbnRlZ3JhbCAnLTU2MjY3RSswJyAgIC0+ICctNTYyNjcnCitpbnR4MDg3IHRvaW50ZWdyYWwgJy01NjI2N0UrMScgICAtPiAnLTUuNjI2N0UrNScKK2ludHgwODggdG9pbnRlZ3JhbCAnLTU2MjY3RSsyJyAgIC0+ICctNS42MjY3RSs2JworaW50eDA4OSB0b2ludGVncmFsICctNTYyNjdFKzMnICAgLT4gJy01LjYyNjdFKzcnCitpbnR4MDkwIHRvaW50ZWdyYWwgJy01NjI2N0UrNCcgICAtPiAnLTUuNjI2N0UrOCcKK2ludHgwOTEgdG9pbnRlZ3JhbCAnLTU2MjY3RSs1JyAgIC0+ICctNS42MjY3RSs5JworaW50eDA5MiB0b2ludGVncmFsICctNTYyNjdFKzYnICAgLT4gJy01LjYyNjdFKzEwJworaW50eDA5MyB0b2ludGVncmFsICctMS4yM0UrOTYnICAgLT4gJy0xLjIzRSs5NicKK2ludHgwOTQgdG9pbnRlZ3JhbCAnLTEuMjNFKzM4NCcgIC0+ICctMS4yM0UrMzg0JworaW50eDA5NSB0b2ludGVncmFsICctMS4yM0UrOTk5JyAgLT4gJy0xLjIzRSs5OTknCisKKy0tIHN1Ym5vcm1hbCBpbnB1dHMKK2ludHgxMDAgdG9pbnRlZ3JhbCAgICAgICAgMUUtOTk5IC0+IDAKK2ludHgxMDEgdG9pbnRlZ3JhbCAgICAgIDAuMUUtOTk5IC0+IDAKK2ludHgxMDIgdG9pbnRlZ3JhbCAgICAgMC4wMUUtOTk5IC0+IDAKK2ludHgxMDMgdG9pbnRlZ3JhbCAgICAgICAgMEUtOTk5IC0+IDAKKworLS0gc3BlY2lhbHMgYW5kIHplcm9zCitpbnR4MTIwIHRvaW50ZWdyYWwgJ0luZicgICAgICAgLT4gIEluZmluaXR5CitpbnR4MTIxIHRvaW50ZWdyYWwgJy1JbmYnICAgICAgLT4gLUluZmluaXR5CitpbnR4MTIyIHRvaW50ZWdyYWwgICBOYU4gICAgICAgLT4gIE5hTgoraW50eDEyMyB0b2ludGVncmFsICBzTmFOICAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitpbnR4MTI0IHRvaW50ZWdyYWwgICAgIDAgICAgICAgLT4gIDAKK2ludHgxMjUgdG9pbnRlZ3JhbCAgICAtMCAgICAgICAtPiAtMAoraW50eDEyNiB0b2ludGVncmFsICAgICAwLjAwMCAgIC0+ICAwCitpbnR4MTI3IHRvaW50ZWdyYWwgICAgIDAuMDAgICAgLT4gIDAKK2ludHgxMjggdG9pbnRlZ3JhbCAgICAgMC4wICAgICAtPiAgMAoraW50eDEyOSB0b2ludGVncmFsICAgICAwICAgICAgIC0+ICAwCitpbnR4MTMwIHRvaW50ZWdyYWwgICAgIDBFLTMgICAgLT4gIDAKK2ludHgxMzEgdG9pbnRlZ3JhbCAgICAgMEUtMiAgICAtPiAgMAoraW50eDEzMiB0b2ludGVncmFsICAgICAwRS0xICAgIC0+ICAwCitpbnR4MTMzIHRvaW50ZWdyYWwgICAgIDBFLTAgICAgLT4gIDAKK2ludHgxMzQgdG9pbnRlZ3JhbCAgICAgMEUrMSAgICAtPiAgMEUrMQoraW50eDEzNSB0b2ludGVncmFsICAgICAwRSsyICAgIC0+ICAwRSsyCitpbnR4MTM2IHRvaW50ZWdyYWwgICAgIDBFKzMgICAgLT4gIDBFKzMKK2ludHgxMzcgdG9pbnRlZ3JhbCAgICAgMEUrNCAgICAtPiAgMEUrNAoraW50eDEzOCB0b2ludGVncmFsICAgICAwRSs1ICAgIC0+ICAwRSs1CitpbnR4MTM5IHRvaW50ZWdyYWwgICAgLTAuMDAwICAgLT4gLTAKK2ludHgxNDAgdG9pbnRlZ3JhbCAgICAtMC4wMCAgICAtPiAtMAoraW50eDE0MSB0b2ludGVncmFsICAgIC0wLjAgICAgIC0+IC0wCitpbnR4MTQyIHRvaW50ZWdyYWwgICAgLTAgICAgICAgLT4gLTAKK2ludHgxNDMgdG9pbnRlZ3JhbCAgICAtMEUtMyAgICAtPiAtMAoraW50eDE0NCB0b2ludGVncmFsICAgIC0wRS0yICAgIC0+IC0wCitpbnR4MTQ1IHRvaW50ZWdyYWwgICAgLTBFLTEgICAgLT4gLTAKK2ludHgxNDYgdG9pbnRlZ3JhbCAgICAtMEUtMCAgICAtPiAtMAoraW50eDE0NyB0b2ludGVncmFsICAgIC0wRSsxICAgIC0+IC0wRSsxCitpbnR4MTQ4IHRvaW50ZWdyYWwgICAgLTBFKzIgICAgLT4gLTBFKzIKK2ludHgxNDkgdG9pbnRlZ3JhbCAgICAtMEUrMyAgICAtPiAtMEUrMworaW50eDE1MCB0b2ludGVncmFsICAgIC0wRSs0ICAgIC0+IC0wRSs0CitpbnR4MTUxIHRvaW50ZWdyYWwgICAgLTBFKzUgICAgLT4gLTBFKzUKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2ludHgxNTIgdG9pbnRlZ3JhbCAgIE5hTjgwOCAgICAtPiAgTmFOODA4CitpbnR4MTUzIHRvaW50ZWdyYWwgIHNOYU4wODAgICAgLT4gIE5hTjgwICBJbnZhbGlkX29wZXJhdGlvbgoraW50eDE1NCB0b2ludGVncmFsICAtTmFOODA4ICAgIC0+IC1OYU44MDgKK2ludHgxNTUgdG9pbnRlZ3JhbCAtc05hTjA4MCAgICAtPiAtTmFOODAgIEludmFsaWRfb3BlcmF0aW9uCitpbnR4MTU2IHRvaW50ZWdyYWwgIC1OYU4gICAgICAgLT4gLU5hTgoraW50eDE1NyB0b2ludGVncmFsIC1zTmFOICAgICAgIC0+IC1OYU4gICAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gZXhhbXBsZXMKK3JvdW5kaW5nOiAgICBoYWxmX3VwCitwcmVjaXNpb246ICAgOQoraW50eDIwMCB0b2ludGVncmFsICAgICAyLjEgICAgLT4gMgoraW50eDIwMSB0b2ludGVncmFsICAgMTAwICAgICAgLT4gMTAwCitpbnR4MjAyIHRvaW50ZWdyYWwgICAxMDAuMCAgICAtPiAxMDAKK2ludHgyMDMgdG9pbnRlZ3JhbCAgIDEwMS41ICAgIC0+IDEwMgoraW50eDIwNCB0b2ludGVncmFsICAtMTAxLjUgICAgLT4gLTEwMgoraW50eDIwNSB0b2ludGVncmFsICAgMTBFKzUgICAgLT4gMS4wRSs2CitpbnR4MjA2IHRvaW50ZWdyYWwgIDcuODlFKzc3ICAtPiA3Ljg5RSs3NworaW50eDIwNyB0b2ludGVncmFsICAgLUluZiAgICAgLT4gLUluZmluaXR5CisKKworLS0gYWxsIHJvdW5kaW5nIG1vZGVzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2ludHgyMTAgdG9pbnRlZ3JhbCAgICAgNTUuNSAgIC0+ICA1NgoraW50eDIxMSB0b2ludGVncmFsICAgICA1Ni41ICAgLT4gIDU2CitpbnR4MjEyIHRvaW50ZWdyYWwgICAgIDU3LjUgICAtPiAgNTgKK2ludHgyMTMgdG9pbnRlZ3JhbCAgICAtNTUuNSAgIC0+IC01NgoraW50eDIxNCB0b2ludGVncmFsICAgIC01Ni41ICAgLT4gLTU2CitpbnR4MjE1IHRvaW50ZWdyYWwgICAgLTU3LjUgICAtPiAtNTgKKworcm91bmRpbmc6ICAgIGhhbGZfdXAKKworaW50eDIyMCB0b2ludGVncmFsICAgICA1NS41ICAgLT4gIDU2CitpbnR4MjIxIHRvaW50ZWdyYWwgICAgIDU2LjUgICAtPiAgNTcKK2ludHgyMjIgdG9pbnRlZ3JhbCAgICAgNTcuNSAgIC0+ICA1OAoraW50eDIyMyB0b2ludGVncmFsICAgIC01NS41ICAgLT4gLTU2CitpbnR4MjI0IHRvaW50ZWdyYWwgICAgLTU2LjUgICAtPiAtNTcKK2ludHgyMjUgdG9pbnRlZ3JhbCAgICAtNTcuNSAgIC0+IC01OAorCityb3VuZGluZzogICAgaGFsZl9kb3duCisKK2ludHgyMzAgdG9pbnRlZ3JhbCAgICAgNTUuNSAgIC0+ICA1NQoraW50eDIzMSB0b2ludGVncmFsICAgICA1Ni41ICAgLT4gIDU2CitpbnR4MjMyIHRvaW50ZWdyYWwgICAgIDU3LjUgICAtPiAgNTcKK2ludHgyMzMgdG9pbnRlZ3JhbCAgICAtNTUuNSAgIC0+IC01NQoraW50eDIzNCB0b2ludGVncmFsICAgIC01Ni41ICAgLT4gLTU2CitpbnR4MjM1IHRvaW50ZWdyYWwgICAgLTU3LjUgICAtPiAtNTcKKworcm91bmRpbmc6ICAgIHVwCisKK2ludHgyNDAgdG9pbnRlZ3JhbCAgICAgNTUuMyAgIC0+ICA1NgoraW50eDI0MSB0b2ludGVncmFsICAgICA1Ni4zICAgLT4gIDU3CitpbnR4MjQyIHRvaW50ZWdyYWwgICAgIDU3LjMgICAtPiAgNTgKK2ludHgyNDMgdG9pbnRlZ3JhbCAgICAtNTUuMyAgIC0+IC01NgoraW50eDI0NCB0b2ludGVncmFsICAgIC01Ni4zICAgLT4gLTU3CitpbnR4MjQ1IHRvaW50ZWdyYWwgICAgLTU3LjMgICAtPiAtNTgKKworcm91bmRpbmc6ICAgIGRvd24KKworaW50eDI1MCB0b2ludGVncmFsICAgICA1NS43ICAgLT4gIDU1CitpbnR4MjUxIHRvaW50ZWdyYWwgICAgIDU2LjcgICAtPiAgNTYKK2ludHgyNTIgdG9pbnRlZ3JhbCAgICAgNTcuNyAgIC0+ICA1NworaW50eDI1MyB0b2ludGVncmFsICAgIC01NS43ICAgLT4gLTU1CitpbnR4MjU0IHRvaW50ZWdyYWwgICAgLTU2LjcgICAtPiAtNTYKK2ludHgyNTUgdG9pbnRlZ3JhbCAgICAtNTcuNyAgIC0+IC01NworCityb3VuZGluZzogICAgY2VpbGluZworCitpbnR4MjYwIHRvaW50ZWdyYWwgICAgIDU1LjMgICAtPiAgNTYKK2ludHgyNjEgdG9pbnRlZ3JhbCAgICAgNTYuMyAgIC0+ICA1NworaW50eDI2MiB0b2ludGVncmFsICAgICA1Ny4zICAgLT4gIDU4CitpbnR4MjYzIHRvaW50ZWdyYWwgICAgLTU1LjMgICAtPiAtNTUKK2ludHgyNjQgdG9pbnRlZ3JhbCAgICAtNTYuMyAgIC0+IC01NgoraW50eDI2NSB0b2ludGVncmFsICAgIC01Ny4zICAgLT4gLTU3CisKK3JvdW5kaW5nOiAgICBmbG9vcgorCitpbnR4MjcwIHRvaW50ZWdyYWwgICAgIDU1LjcgICAtPiAgNTUKK2ludHgyNzEgdG9pbnRlZ3JhbCAgICAgNTYuNyAgIC0+ICA1NgoraW50eDI3MiB0b2ludGVncmFsICAgICA1Ny43ICAgLT4gIDU3CitpbnR4MjczIHRvaW50ZWdyYWwgICAgLTU1LjcgICAtPiAtNTYKK2ludHgyNzQgdG9pbnRlZ3JhbCAgICAtNTYuNyAgIC0+IC01NworaW50eDI3NSB0b2ludGVncmFsICAgIC01Ny43ICAgLT4gLTU4CisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvdG9pbnRlZ3JhbHguZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvdG9pbnRlZ3JhbHguZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjUwZTNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS90b2ludGVncmFseC5kZWNUZXN0CkBAIC0wLDAgKzEsMjU1IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHRvaW50ZWdyYWx4LmRlY1Rlc3QgLS0gcm91bmQgZGVjaW1hbCB0byBpbnRlZ3JhbCB2YWx1ZSwgZXhhY3QgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDIwMDEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBzZXQgb2YgdGVzdHMgdGVzdHMgdGhlIGV4dGVuZGVkIHNwZWNpZmljYXRpb24gJ3JvdW5kLXRvLWludGVncmFsCistLSB2YWx1ZScgb3BlcmF0aW9uIChmcm9tIElFRUUgODU0LCBsYXRlciBtb2RpZmllZCBpbiA3NTRyKS4KKy0tIEFsbCBub24temVybyByZXN1bHRzIGFyZSBkZWZpbmVkIGFzIGJlaW5nIHRob3NlIGZyb20gZWl0aGVyIGNvcHkgb3IKKy0tIHF1YW50aXplLCBzbyB0aG9zZSBhcmUgYXNzdW1lZCB0byBoYXZlIGJlZW4gdGVzdGVkLgorCistLSBUaGlzIHRlc3RzIHRvSW50ZWdyYUV4YWN0LCB3aGljaCBtYXkgc2V0IEluZXhhY3QKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworaW50eHgwMDEgdG9pbnRlZ3JhbHggICAgICAwICAgICAtPiAgMAoraW50eHgwMDIgdG9pbnRlZ3JhbHggICAgICAwLjAgICAtPiAgMAoraW50eHgwMDMgdG9pbnRlZ3JhbHggICAgICAwLjEgICAtPiAgMCBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDA0IHRvaW50ZWdyYWx4ICAgICAgMC4yICAgLT4gIDAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAwNSB0b2ludGVncmFseCAgICAgIDAuMyAgIC0+ICAwIEluZXhhY3QgUm91bmRlZAoraW50eHgwMDYgdG9pbnRlZ3JhbHggICAgICAwLjQgICAtPiAgMCBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDA3IHRvaW50ZWdyYWx4ICAgICAgMC41ICAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAwOCB0b2ludGVncmFseCAgICAgIDAuNiAgIC0+ICAxIEluZXhhY3QgUm91bmRlZAoraW50eHgwMDkgdG9pbnRlZ3JhbHggICAgICAwLjcgICAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDEwIHRvaW50ZWdyYWx4ICAgICAgMC44ICAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAxMSB0b2ludGVncmFseCAgICAgIDAuOSAgIC0+ICAxIEluZXhhY3QgUm91bmRlZAoraW50eHgwMTIgdG9pbnRlZ3JhbHggICAgICAxICAgICAtPiAgMQoraW50eHgwMTMgdG9pbnRlZ3JhbHggICAgICAxLjAgICAtPiAgMSBSb3VuZGVkCitpbnR4eDAxNCB0b2ludGVncmFseCAgICAgIDEuMSAgIC0+ICAxIEluZXhhY3QgUm91bmRlZAoraW50eHgwMTUgdG9pbnRlZ3JhbHggICAgICAxLjIgICAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDE2IHRvaW50ZWdyYWx4ICAgICAgMS4zICAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAxNyB0b2ludGVncmFseCAgICAgIDEuNCAgIC0+ICAxIEluZXhhY3QgUm91bmRlZAoraW50eHgwMTggdG9pbnRlZ3JhbHggICAgICAxLjUgICAtPiAgMiBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDE5IHRvaW50ZWdyYWx4ICAgICAgMS42ICAgLT4gIDIgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAyMCB0b2ludGVncmFseCAgICAgIDEuNyAgIC0+ICAyIEluZXhhY3QgUm91bmRlZAoraW50eHgwMjEgdG9pbnRlZ3JhbHggICAgICAxLjggICAtPiAgMiBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDIyIHRvaW50ZWdyYWx4ICAgICAgMS45ICAgLT4gIDIgSW5leGFjdCBSb3VuZGVkCistLSBuZWdhdGl2ZXMKK2ludHh4MDMxIHRvaW50ZWdyYWx4ICAgICAtMCAgICAgLT4gLTAKK2ludHh4MDMyIHRvaW50ZWdyYWx4ICAgICAtMC4wICAgLT4gLTAKK2ludHh4MDMzIHRvaW50ZWdyYWx4ICAgICAtMC4xICAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAzNCB0b2ludGVncmFseCAgICAgLTAuMiAgIC0+IC0wIEluZXhhY3QgUm91bmRlZAoraW50eHgwMzUgdG9pbnRlZ3JhbHggICAgIC0wLjMgICAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDM2IHRvaW50ZWdyYWx4ICAgICAtMC40ICAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAzNyB0b2ludGVncmFseCAgICAgLTAuNSAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAoraW50eHgwMzggdG9pbnRlZ3JhbHggICAgIC0wLjYgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDM5IHRvaW50ZWdyYWx4ICAgICAtMC43ICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA0MCB0b2ludGVncmFseCAgICAgLTAuOCAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAoraW50eHgwNDEgdG9pbnRlZ3JhbHggICAgIC0wLjkgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDQyIHRvaW50ZWdyYWx4ICAgICAtMSAgICAgLT4gLTEKK2ludHh4MDQzIHRvaW50ZWdyYWx4ICAgICAtMS4wICAgLT4gLTEgUm91bmRlZAoraW50eHgwNDQgdG9pbnRlZ3JhbHggICAgIC0xLjEgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDQ1IHRvaW50ZWdyYWx4ICAgICAtMS4yICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA0NiB0b2ludGVncmFseCAgICAgLTEuMyAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAoraW50eHgwNDcgdG9pbnRlZ3JhbHggICAgIC0xLjQgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDQ4IHRvaW50ZWdyYWx4ICAgICAtMS41ICAgLT4gLTIgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA0OSB0b2ludGVncmFseCAgICAgLTEuNiAgIC0+IC0yIEluZXhhY3QgUm91bmRlZAoraW50eHgwNTAgdG9pbnRlZ3JhbHggICAgIC0xLjcgICAtPiAtMiBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDUxIHRvaW50ZWdyYWx4ICAgICAtMS44ICAgLT4gLTIgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA1MiB0b2ludGVncmFseCAgICAgLTEuOSAgIC0+IC0yIEluZXhhY3QgUm91bmRlZAorLS0gbmV4dCB0d28gd291bGQgYmUgTmFOIHVzaW5nIHF1YW50aXplKHgsIDApCitpbnR4eDA1MyB0b2ludGVncmFseCAgICAxMEUrMzAgIC0+IDEuMEUrMzEKK2ludHh4MDU0IHRvaW50ZWdyYWx4ICAgLTEwRSszMCAgLT4gLTEuMEUrMzEKKworLS0gbnVtYmVycyBhcm91bmQgcHJlY2lzaW9uCitwcmVjaXNpb246IDkKK2ludHh4MDYwIHRvaW50ZWdyYWx4ICc1NjI2N0UtMTAnICAgLT4gJzAnICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA2MSB0b2ludGVncmFseCAnNTYyNjdFLTUnICAgIC0+ICcxJyAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAoraW50eHgwNjIgdG9pbnRlZ3JhbHggJzU2MjY3RS0yJyAgICAtPiAnNTYzJyAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDYzIHRvaW50ZWdyYWx4ICc1NjI2N0UtMScgICAgLT4gJzU2MjcnICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA2NSB0b2ludGVncmFseCAnNTYyNjdFLTAnICAgIC0+ICc1NjI2NycKK2ludHh4MDY2IHRvaW50ZWdyYWx4ICc1NjI2N0UrMCcgICAgLT4gJzU2MjY3JworaW50eHgwNjcgdG9pbnRlZ3JhbHggJzU2MjY3RSsxJyAgICAtPiAnNS42MjY3RSs1JworaW50eHgwNjggdG9pbnRlZ3JhbHggJzU2MjY3RSsyJyAgICAtPiAnNS42MjY3RSs2JworaW50eHgwNjkgdG9pbnRlZ3JhbHggJzU2MjY3RSszJyAgICAtPiAnNS42MjY3RSs3JworaW50eHgwNzAgdG9pbnRlZ3JhbHggJzU2MjY3RSs0JyAgICAtPiAnNS42MjY3RSs4JworaW50eHgwNzEgdG9pbnRlZ3JhbHggJzU2MjY3RSs1JyAgICAtPiAnNS42MjY3RSs5JworaW50eHgwNzIgdG9pbnRlZ3JhbHggJzU2MjY3RSs2JyAgICAtPiAnNS42MjY3RSsxMCcKK2ludHh4MDczIHRvaW50ZWdyYWx4ICcxLjIzRSs5NicgICAgLT4gJzEuMjNFKzk2JworaW50eHgwNzQgdG9pbnRlZ3JhbHggJzEuMjNFKzM4NCcgICAtPiAnMS4yM0UrMzg0JworaW50eHgwNzUgdG9pbnRlZ3JhbHggJzEuMjNFKzk5OScgICAtPiAnMS4yM0UrOTk5JworCitpbnR4eDA4MCB0b2ludGVncmFseCAnLTU2MjY3RS0xMCcgIC0+ICctMCcgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAoraW50eHgwODEgdG9pbnRlZ3JhbHggJy01NjI2N0UtNScgICAtPiAnLTEnICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDgyIHRvaW50ZWdyYWx4ICctNTYyNjdFLTInICAgLT4gJy01NjMnICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA4MyB0b2ludGVncmFseCAnLTU2MjY3RS0xJyAgIC0+ICctNTYyNycgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAoraW50eHgwODUgdG9pbnRlZ3JhbHggJy01NjI2N0UtMCcgICAtPiAnLTU2MjY3JworaW50eHgwODYgdG9pbnRlZ3JhbHggJy01NjI2N0UrMCcgICAtPiAnLTU2MjY3JworaW50eHgwODcgdG9pbnRlZ3JhbHggJy01NjI2N0UrMScgICAtPiAnLTUuNjI2N0UrNScKK2ludHh4MDg4IHRvaW50ZWdyYWx4ICctNTYyNjdFKzInICAgLT4gJy01LjYyNjdFKzYnCitpbnR4eDA4OSB0b2ludGVncmFseCAnLTU2MjY3RSszJyAgIC0+ICctNS42MjY3RSs3JworaW50eHgwOTAgdG9pbnRlZ3JhbHggJy01NjI2N0UrNCcgICAtPiAnLTUuNjI2N0UrOCcKK2ludHh4MDkxIHRvaW50ZWdyYWx4ICctNTYyNjdFKzUnICAgLT4gJy01LjYyNjdFKzknCitpbnR4eDA5MiB0b2ludGVncmFseCAnLTU2MjY3RSs2JyAgIC0+ICctNS42MjY3RSsxMCcKK2ludHh4MDkzIHRvaW50ZWdyYWx4ICctMS4yM0UrOTYnICAgLT4gJy0xLjIzRSs5NicKK2ludHh4MDk0IHRvaW50ZWdyYWx4ICctMS4yM0UrMzg0JyAgLT4gJy0xLjIzRSszODQnCitpbnR4eDA5NSB0b2ludGVncmFseCAnLTEuMjNFKzk5OScgIC0+ICctMS4yM0UrOTk5JworCistLSBzdWJub3JtYWwgaW5wdXRzCitpbnR4eDEwMCB0b2ludGVncmFseCAgICAgICAgMUUtOTk5IC0+IDAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAoraW50eHgxMDEgdG9pbnRlZ3JhbHggICAgICAwLjFFLTk5OSAtPiAwICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MTAyIHRvaW50ZWdyYWx4ICAgICAwLjAxRS05OTkgLT4gMCAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDEwMyB0b2ludGVncmFseCAgICAgICAgMEUtOTk5IC0+IDAKKworLS0gc3BlY2lhbHMgYW5kIHplcm9zCitpbnR4eDEyMCB0b2ludGVncmFseCAnSW5mJyAgICAgICAtPiAgSW5maW5pdHkKK2ludHh4MTIxIHRvaW50ZWdyYWx4ICctSW5mJyAgICAgIC0+IC1JbmZpbml0eQoraW50eHgxMjIgdG9pbnRlZ3JhbHggICBOYU4gICAgICAgLT4gIE5hTgoraW50eHgxMjMgdG9pbnRlZ3JhbHggIHNOYU4gICAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ludHh4MTI0IHRvaW50ZWdyYWx4ICAgICAwICAgICAgIC0+ICAwCitpbnR4eDEyNSB0b2ludGVncmFseCAgICAtMCAgICAgICAtPiAtMAoraW50eHgxMjYgdG9pbnRlZ3JhbHggICAgIDAuMDAwICAgLT4gIDAKK2ludHh4MTI3IHRvaW50ZWdyYWx4ICAgICAwLjAwICAgIC0+ICAwCitpbnR4eDEyOCB0b2ludGVncmFseCAgICAgMC4wICAgICAtPiAgMAoraW50eHgxMjkgdG9pbnRlZ3JhbHggICAgIDAgICAgICAgLT4gIDAKK2ludHh4MTMwIHRvaW50ZWdyYWx4ICAgICAwRS0zICAgIC0+ICAwCitpbnR4eDEzMSB0b2ludGVncmFseCAgICAgMEUtMiAgICAtPiAgMAoraW50eHgxMzIgdG9pbnRlZ3JhbHggICAgIDBFLTEgICAgLT4gIDAKK2ludHh4MTMzIHRvaW50ZWdyYWx4ICAgICAwRS0wICAgIC0+ICAwCitpbnR4eDEzNCB0b2ludGVncmFseCAgICAgMEUrMSAgICAtPiAgMEUrMQoraW50eHgxMzUgdG9pbnRlZ3JhbHggICAgIDBFKzIgICAgLT4gIDBFKzIKK2ludHh4MTM2IHRvaW50ZWdyYWx4ICAgICAwRSszICAgIC0+ICAwRSszCitpbnR4eDEzNyB0b2ludGVncmFseCAgICAgMEUrNCAgICAtPiAgMEUrNAoraW50eHgxMzggdG9pbnRlZ3JhbHggICAgIDBFKzUgICAgLT4gIDBFKzUKK2ludHh4MTM5IHRvaW50ZWdyYWx4ICAgIC0wLjAwMCAgIC0+IC0wCitpbnR4eDE0MCB0b2ludGVncmFseCAgICAtMC4wMCAgICAtPiAtMAoraW50eHgxNDEgdG9pbnRlZ3JhbHggICAgLTAuMCAgICAgLT4gLTAKK2ludHh4MTQyIHRvaW50ZWdyYWx4ICAgIC0wICAgICAgIC0+IC0wCitpbnR4eDE0MyB0b2ludGVncmFseCAgICAtMEUtMyAgICAtPiAtMAoraW50eHgxNDQgdG9pbnRlZ3JhbHggICAgLTBFLTIgICAgLT4gLTAKK2ludHh4MTQ1IHRvaW50ZWdyYWx4ICAgIC0wRS0xICAgIC0+IC0wCitpbnR4eDE0NiB0b2ludGVncmFseCAgICAtMEUtMCAgICAtPiAtMAoraW50eHgxNDcgdG9pbnRlZ3JhbHggICAgLTBFKzEgICAgLT4gLTBFKzEKK2ludHh4MTQ4IHRvaW50ZWdyYWx4ICAgIC0wRSsyICAgIC0+IC0wRSsyCitpbnR4eDE0OSB0b2ludGVncmFseCAgICAtMEUrMyAgICAtPiAtMEUrMworaW50eHgxNTAgdG9pbnRlZ3JhbHggICAgLTBFKzQgICAgLT4gLTBFKzQKK2ludHh4MTUxIHRvaW50ZWdyYWx4ICAgIC0wRSs1ICAgIC0+IC0wRSs1CistLSBwcm9wYWdhdGluZyBOYU5zCitpbnR4eDE1MiB0b2ludGVncmFseCAgIE5hTjgwOCAgICAtPiAgTmFOODA4CitpbnR4eDE1MyB0b2ludGVncmFseCAgc05hTjA4MCAgICAtPiAgTmFOODAgIEludmFsaWRfb3BlcmF0aW9uCitpbnR4eDE1NCB0b2ludGVncmFseCAgLU5hTjgwOCAgICAtPiAtTmFOODA4CitpbnR4eDE1NSB0b2ludGVncmFseCAtc05hTjA4MCAgICAtPiAtTmFOODAgIEludmFsaWRfb3BlcmF0aW9uCitpbnR4eDE1NiB0b2ludGVncmFseCAgLU5hTiAgICAgICAtPiAtTmFOCitpbnR4eDE1NyB0b2ludGVncmFseCAtc05hTiAgICAgICAtPiAtTmFOICAgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGV4YW1wbGVzCityb3VuZGluZzogICAgaGFsZl91cAorcHJlY2lzaW9uOiAgIDkKK2ludHh4MjAwIHRvaW50ZWdyYWx4ICAgICAyLjEgICAgLT4gMiAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDIwMSB0b2ludGVncmFseCAgIDEwMCAgICAgIC0+IDEwMAoraW50eHgyMDIgdG9pbnRlZ3JhbHggICAxMDAuMCAgICAtPiAxMDAgICAgICAgICAgICAgICAgICBSb3VuZGVkCitpbnR4eDIwMyB0b2ludGVncmFseCAgIDEwMS41ICAgIC0+IDEwMiAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyMDQgdG9pbnRlZ3JhbHggIC0xMDEuNSAgICAtPiAtMTAyICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjA1IHRvaW50ZWdyYWx4ICAgMTBFKzUgICAgLT4gMS4wRSs2CitpbnR4eDIwNiB0b2ludGVncmFseCAgNy44OUUrNzcgIC0+IDcuODlFKzc3CitpbnR4eDIwNyB0b2ludGVncmFseCAgIC1JbmYgICAgIC0+IC1JbmZpbml0eQorCisKKy0tIGFsbCByb3VuZGluZyBtb2Rlcworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitpbnR4eDIxMCB0b2ludGVncmFseCAgICAgNTUuNSAgIC0+ICA1NiAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyMTEgdG9pbnRlZ3JhbHggICAgIDU2LjUgICAtPiAgNTYgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjEyIHRvaW50ZWdyYWx4ICAgICA1Ny41ICAgLT4gIDU4ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDIxMyB0b2ludGVncmFseCAgICAtNTUuNSAgIC0+IC01NiAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyMTQgdG9pbnRlZ3JhbHggICAgLTU2LjUgICAtPiAtNTYgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjE1IHRvaW50ZWdyYWx4ICAgIC01Ny41ICAgLT4gLTU4ICAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX3VwCisKK2ludHh4MjIwIHRvaW50ZWdyYWx4ICAgICA1NS41ICAgLT4gIDU2ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDIyMSB0b2ludGVncmFseCAgICAgNTYuNSAgIC0+ICA1NyAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyMjIgdG9pbnRlZ3JhbHggICAgIDU3LjUgICAtPiAgNTggICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjIzIHRvaW50ZWdyYWx4ICAgIC01NS41ICAgLT4gLTU2ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDIyNCB0b2ludGVncmFseCAgICAtNTYuNSAgIC0+IC01NyAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyMjUgdG9pbnRlZ3JhbHggICAgLTU3LjUgICAtPiAtNTggICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorCitpbnR4eDIzMCB0b2ludGVncmFseCAgICAgNTUuNSAgIC0+ICA1NSAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyMzEgdG9pbnRlZ3JhbHggICAgIDU2LjUgICAtPiAgNTYgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjMyIHRvaW50ZWdyYWx4ICAgICA1Ny41ICAgLT4gIDU3ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDIzMyB0b2ludGVncmFseCAgICAtNTUuNSAgIC0+IC01NSAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyMzQgdG9pbnRlZ3JhbHggICAgLTU2LjUgICAtPiAtNTYgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjM1IHRvaW50ZWdyYWx4ICAgIC01Ny41ICAgLT4gLTU3ICAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICB1cAorCitpbnR4eDI0MCB0b2ludGVncmFseCAgICAgNTUuMyAgIC0+ICA1NiAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNDEgdG9pbnRlZ3JhbHggICAgIDU2LjMgICAtPiAgNTcgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjQyIHRvaW50ZWdyYWx4ICAgICA1Ny4zICAgLT4gIDU4ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI0MyB0b2ludGVncmFseCAgICAtNTUuMyAgIC0+IC01NiAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNDQgdG9pbnRlZ3JhbHggICAgLTU2LjMgICAtPiAtNTcgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjQ1IHRvaW50ZWdyYWx4ICAgIC01Ny4zICAgLT4gLTU4ICAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBkb3duCisKK2ludHh4MjUwIHRvaW50ZWdyYWx4ICAgICA1NS43ICAgLT4gIDU1ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI1MSB0b2ludGVncmFseCAgICAgNTYuNyAgIC0+ICA1NiAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNTIgdG9pbnRlZ3JhbHggICAgIDU3LjcgICAtPiAgNTcgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjUzIHRvaW50ZWdyYWx4ICAgIC01NS43ICAgLT4gLTU1ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI1NCB0b2ludGVncmFseCAgICAtNTYuNyAgIC0+IC01NiAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNTUgdG9pbnRlZ3JhbHggICAgLTU3LjcgICAtPiAtNTcgICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGNlaWxpbmcKKworaW50eHgyNjAgdG9pbnRlZ3JhbHggICAgIDU1LjMgICAtPiAgNTYgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjYxIHRvaW50ZWdyYWx4ICAgICA1Ni4zICAgLT4gIDU3ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI2MiB0b2ludGVncmFseCAgICAgNTcuMyAgIC0+ICA1OCAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNjMgdG9pbnRlZ3JhbHggICAgLTU1LjMgICAtPiAtNTUgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjY0IHRvaW50ZWdyYWx4ICAgIC01Ni4zICAgLT4gLTU2ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI2NSB0b2ludGVncmFseCAgICAtNTcuMyAgIC0+IC01NyAgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgZmxvb3IKKworaW50eHgyNzAgdG9pbnRlZ3JhbHggICAgIDU1LjcgICAtPiAgNTUgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjcxIHRvaW50ZWdyYWx4ICAgICA1Ni43ICAgLT4gIDU2ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI3MiB0b2ludGVncmFseCAgICAgNTcuNyAgIC0+ICA1NyAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNzMgdG9pbnRlZ3JhbHggICAgLTU1LjcgICAtPiAtNTYgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4Mjc0IHRvaW50ZWdyYWx4ICAgIC01Ni43ICAgLT4gLTU3ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI3NSB0b2ludGVncmFseCAgICAtNTcuNyAgIC0+IC01OCAgIEluZXhhY3QgUm91bmRlZAorCistLSBJbnQgYW5kIHVJbnQzMiBlZGdlIHZhbHVlcyBmb3IgdGVzdGluZyBjb252ZXJzaW9ucworcHJlY2lzaW9uOiAxNgoraW50eHgzMDAgdG9pbnRlZ3JhbHggLTIxNDc0ODM2NDYgIC0+IC0yMTQ3NDgzNjQ2CitpbnR4eDMwMSB0b2ludGVncmFseCAtMjE0NzQ4MzY0NyAgLT4gLTIxNDc0ODM2NDcKK2ludHh4MzAyIHRvaW50ZWdyYWx4IC0yMTQ3NDgzNjQ4ICAtPiAtMjE0NzQ4MzY0OAoraW50eHgzMDMgdG9pbnRlZ3JhbHggLTIxNDc0ODM2NDkgIC0+IC0yMTQ3NDgzNjQ5CitpbnR4eDMwNCB0b2ludGVncmFseCAgMjE0NzQ4MzY0NiAgLT4gIDIxNDc0ODM2NDYKK2ludHh4MzA1IHRvaW50ZWdyYWx4ICAyMTQ3NDgzNjQ3ICAtPiAgMjE0NzQ4MzY0NworaW50eHgzMDYgdG9pbnRlZ3JhbHggIDIxNDc0ODM2NDggIC0+ICAyMTQ3NDgzNjQ4CitpbnR4eDMwNyB0b2ludGVncmFseCAgMjE0NzQ4MzY0OSAgLT4gIDIxNDc0ODM2NDkKK2ludHh4MzA4IHRvaW50ZWdyYWx4ICA0Mjk0OTY3Mjk0ICAtPiAgNDI5NDk2NzI5NAoraW50eHgzMDkgdG9pbnRlZ3JhbHggIDQyOTQ5NjcyOTUgIC0+ICA0Mjk0OTY3Mjk1CitpbnR4eDMxMCB0b2ludGVncmFseCAgNDI5NDk2NzI5NiAgLT4gIDQyOTQ5NjcyOTYKK2ludHh4MzExIHRvaW50ZWdyYWx4ICA0Mjk0OTY3Mjk3ICAtPiAgNDI5NDk2NzI5NwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS94b3IuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEveG9yLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyOTc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEveG9yLmRlY1Rlc3QKQEAgLTAsMCArMSwzMzUgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0geG9yLmRlY1Rlc3QgLS0gZGlnaXR3aXNlIGxvZ2ljYWwgWE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5CittaW5FeHBvbmVudDogLTk5OQorCistLSBTYW5pdHkgY2hlY2sgKHRydXRoIHRhYmxlKQoreG9yeDAwMSB4b3IgICAgICAgICAgICAgMCAgICAwIC0+ICAgIDAKK3hvcngwMDIgeG9yICAgICAgICAgICAgIDAgICAgMSAtPiAgICAxCit4b3J4MDAzIHhvciAgICAgICAgICAgICAxICAgIDAgLT4gICAgMQoreG9yeDAwNCB4b3IgICAgICAgICAgICAgMSAgICAxIC0+ICAgIDAKK3hvcngwMDUgeG9yICAgICAgICAgIDExMDAgMTAxMCAtPiAgMTEwCit4b3J4MDA2IHhvciAgICAgICAgICAxMTExICAgMTAgLT4gMTEwMQorLS0gYW5kIGF0IG1zZCBhbmQgbXNkLTEKK3hvcngwMTAgeG9yIDAwMDAwMDAwMCAwMDAwMDAwMDAgLT4gICAgICAgICAgIDAKK3hvcngwMTEgeG9yIDAwMDAwMDAwMCAxMDAwMDAwMDAgLT4gICAxMDAwMDAwMDAKK3hvcngwMTIgeG9yIDEwMDAwMDAwMCAwMDAwMDAwMDAgLT4gICAxMDAwMDAwMDAKK3hvcngwMTMgeG9yIDEwMDAwMDAwMCAxMDAwMDAwMDAgLT4gICAgICAgICAgIDAKK3hvcngwMTQgeG9yIDAwMDAwMDAwMCAwMDAwMDAwMDAgLT4gICAgICAgICAgIDAKK3hvcngwMTUgeG9yIDAwMDAwMDAwMCAwMTAwMDAwMDAgLT4gICAgMTAwMDAwMDAKK3hvcngwMTYgeG9yIDAxMDAwMDAwMCAwMDAwMDAwMDAgLT4gICAgMTAwMDAwMDAKK3hvcngwMTcgeG9yIDAxMDAwMDAwMCAwMTAwMDAwMDAgLT4gICAgICAgICAgIDAKKworLS0gVmFyaW91cyBsZW5ndGhzCistLSAgICAgICAgMTIzNDU2Nzg5ICAgICAxMjM0NTY3ODkgICAgICAxMjM0NTY3ODkKK3hvcngwMjEgeG9yIDExMTExMTExMSAgICAgMTExMTExMTExICAtPiAgMAoreG9yeDAyMiB4b3IgMTExMTExMTExMTExICAxMTExMTExMTEgIC0+ICAwCit4b3J4MDIzIHhvciAgMTExMTExMTEgICAgICAxMTExMTExMSAgLT4gIDAKK3hvcngwMjUgeG9yICAgMTExMTExMSAgICAgICAxMTExMTExICAtPiAgMAoreG9yeDAyNiB4b3IgICAgMTExMTExICAgICAgICAxMTExMTEgIC0+ICAwCit4b3J4MDI3IHhvciAgICAgMTExMTEgICAgICAgICAxMTExMSAgLT4gIDAKK3hvcngwMjggeG9yICAgICAgMTExMSAgICAgICAgICAxMTExICAtPiAgMAoreG9yeDAyOSB4b3IgICAgICAgMTExICAgICAgICAgICAxMTEgIC0+ICAwCit4b3J4MDMxIHhvciAgICAgICAgMTEgICAgICAgICAgICAxMSAgLT4gIDAKK3hvcngwMzIgeG9yICAgICAgICAgMSAgICAgICAgICAgICAxICAtPiAgMAoreG9yeDAzMyB4b3IgMTExMTExMTExMTExIDExMTExMTExMTEgIC0+ICAwCit4b3J4MDM0IHhvciAxMTExMTExMTExMSAxMTExMTExMTExMSAgLT4gIDAKK3hvcngwMzUgeG9yIDExMTExMTExMTEgMTExMTExMTExMTExICAtPiAgMAoreG9yeDAzNiB4b3IgMTExMTExMTExIDExMTExMTExMTExMTEgIC0+ICAwCisKK3hvcngwNDAgeG9yIDExMTExMTExMSAgMTExMTExMTExMTExICAtPiAgMAoreG9yeDA0MSB4b3IgIDExMTExMTExICAxMTExMTExMTExMTEgIC0+ICAxMDAwMDAwMDAKK3hvcngwNDIgeG9yICAxMTExMTExMSAgICAgMTExMTExMTExICAtPiAgMTAwMDAwMDAwCit4b3J4MDQzIHhvciAgIDExMTExMTEgICAgIDEwMDAwMDAxMCAgLT4gIDEwMTExMTEwMQoreG9yeDA0NCB4b3IgICAgMTExMTExICAgICAxMDAwMDAxMDAgIC0+ICAxMDAxMTEwMTEKK3hvcngwNDUgeG9yICAgICAxMTExMSAgICAgMTAwMDAxMDAwICAtPiAgMTAwMDEwMTExCit4b3J4MDQ2IHhvciAgICAgIDExMTEgICAgIDEwMDAxMDAwMCAgLT4gIDEwMDAxMTExMQoreG9yeDA0NyB4b3IgICAgICAgMTExICAgICAxMDAxMDAwMDAgIC0+ICAxMDAxMDAxMTEKK3hvcngwNDggeG9yICAgICAgICAxMSAgICAgMTAxMDAwMDAwICAtPiAgMTAxMDAwMDExCit4b3J4MDQ5IHhvciAgICAgICAgIDEgICAgIDExMDAwMDAwMCAgLT4gIDExMDAwMDAwMQorCit4b3J4MDUwIHhvciAxMTExMTExMTExICAxICAtPiAgMTExMTExMTEwCit4b3J4MDUxIHhvciAgMTExMTExMTExICAxICAtPiAgMTExMTExMTEwCit4b3J4MDUyIHhvciAgIDExMTExMTExICAxICAtPiAgMTExMTExMTAKK3hvcngwNTMgeG9yICAgIDExMTExMTEgIDEgIC0+ICAxMTExMTEwCit4b3J4MDU0IHhvciAgICAgMTExMTExICAxICAtPiAgMTExMTEwCit4b3J4MDU1IHhvciAgICAgIDExMTExICAxICAtPiAgMTExMTAKK3hvcngwNTYgeG9yICAgICAgIDExMTEgIDEgIC0+ICAxMTEwCit4b3J4MDU3IHhvciAgICAgICAgMTExICAxICAtPiAgMTEwCit4b3J4MDU4IHhvciAgICAgICAgIDExICAxICAtPiAgMTAKK3hvcngwNTkgeG9yICAgICAgICAgIDEgIDEgIC0+ICAwCisKK3hvcngwNjAgeG9yIDExMTExMTExMTEgIDAgIC0+ICAxMTExMTExMTEKK3hvcngwNjEgeG9yICAxMTExMTExMTEgIDAgIC0+ICAxMTExMTExMTEKK3hvcngwNjIgeG9yICAgMTExMTExMTEgIDAgIC0+ICAxMTExMTExMQoreG9yeDA2MyB4b3IgICAgMTExMTExMSAgMCAgLT4gIDExMTExMTEKK3hvcngwNjQgeG9yICAgICAxMTExMTEgIDAgIC0+ICAxMTExMTEKK3hvcngwNjUgeG9yICAgICAgMTExMTEgIDAgIC0+ICAxMTExMQoreG9yeDA2NiB4b3IgICAgICAgMTExMSAgMCAgLT4gIDExMTEKK3hvcngwNjcgeG9yICAgICAgICAxMTEgIDAgIC0+ICAxMTEKK3hvcngwNjggeG9yICAgICAgICAgMTEgIDAgIC0+ICAxMQoreG9yeDA2OSB4b3IgICAgICAgICAgMSAgMCAgLT4gIDEKKworeG9yeDA3MCB4b3IgMSAgMTExMTExMTExMSAgLT4gIDExMTExMTExMAoreG9yeDA3MSB4b3IgMSAgIDExMTExMTExMSAgLT4gIDExMTExMTExMAoreG9yeDA3MiB4b3IgMSAgICAxMTExMTExMSAgLT4gIDExMTExMTEwCit4b3J4MDczIHhvciAxICAgICAxMTExMTExICAtPiAgMTExMTExMAoreG9yeDA3NCB4b3IgMSAgICAgIDExMTExMSAgLT4gIDExMTExMAoreG9yeDA3NSB4b3IgMSAgICAgICAxMTExMSAgLT4gIDExMTEwCit4b3J4MDc2IHhvciAxICAgICAgICAxMTExICAtPiAgMTExMAoreG9yeDA3NyB4b3IgMSAgICAgICAgIDExMSAgLT4gIDExMAoreG9yeDA3OCB4b3IgMSAgICAgICAgICAxMSAgLT4gIDEwCit4b3J4MDc5IHhvciAxICAgICAgICAgICAxICAtPiAgMAorCit4b3J4MDgwIHhvciAwICAxMTExMTExMTExICAtPiAgMTExMTExMTExCit4b3J4MDgxIHhvciAwICAgMTExMTExMTExICAtPiAgMTExMTExMTExCit4b3J4MDgyIHhvciAwICAgIDExMTExMTExICAtPiAgMTExMTExMTEKK3hvcngwODMgeG9yIDAgICAgIDExMTExMTEgIC0+ICAxMTExMTExCit4b3J4MDg0IHhvciAwICAgICAgMTExMTExICAtPiAgMTExMTExCit4b3J4MDg1IHhvciAwICAgICAgIDExMTExICAtPiAgMTExMTEKK3hvcngwODYgeG9yIDAgICAgICAgIDExMTEgIC0+ICAxMTExCit4b3J4MDg3IHhvciAwICAgICAgICAgMTExICAtPiAgMTExCit4b3J4MDg4IHhvciAwICAgICAgICAgIDExICAtPiAgMTEKK3hvcngwODkgeG9yIDAgICAgICAgICAgIDEgIC0+ICAxCisKK3hvcngwOTAgeG9yIDAxMTExMTExMSAgMTExMTAxMTExICAtPiAgMTAwMDEwMDAwCit4b3J4MDkxIHhvciAxMDExMTExMTEgIDExMTEwMTExMSAgLT4gICAxMDAxMDAwMAoreG9yeDA5MiB4b3IgMTEwMTExMTExICAxMTExMDExMTEgIC0+ICAgIDEwMTAwMDAKK3hvcngwOTMgeG9yIDExMTAxMTExMSAgMTExMTAxMTExICAtPiAgICAgMTEwMDAwCit4b3J4MDk0IHhvciAxMTExMDExMTEgIDExMTEwMTExMSAgLT4gICAgICAgICAgMAoreG9yeDA5NSB4b3IgMTExMTEwMTExICAxMTExMDExMTEgIC0+ICAgICAgMTEwMDAKK3hvcngwOTYgeG9yIDExMTExMTAxMSAgMTExMTAxMTExICAtPiAgICAgIDEwMTAwCit4b3J4MDk3IHhvciAxMTExMTExMDEgIDExMTEwMTExMSAgLT4gICAgICAxMDAxMAoreG9yeDA5OCB4b3IgMTExMTExMTEwICAxMTExMDExMTEgIC0+ICAgICAgMTAwMDEKKworeG9yeDEwMCB4b3IgMTExMTAxMTExICAwMTExMTExMTEgIC0+ICAxMDAwMTAwMDAKK3hvcngxMDEgeG9yIDExMTEwMTExMSAgMTAxMTExMTExICAtPiAgIDEwMDEwMDAwCit4b3J4MTAyIHhvciAxMTExMDExMTEgIDExMDExMTExMSAgLT4gICAgMTAxMDAwMAoreG9yeDEwMyB4b3IgMTExMTAxMTExICAxMTEwMTExMTEgIC0+ICAgICAxMTAwMDAKK3hvcngxMDQgeG9yIDExMTEwMTExMSAgMTExMTAxMTExICAtPiAgICAgICAgICAwCit4b3J4MTA1IHhvciAxMTExMDExMTEgIDExMTExMDExMSAgLT4gICAgICAxMTAwMAoreG9yeDEwNiB4b3IgMTExMTAxMTExICAxMTExMTEwMTEgIC0+ICAgICAgMTAxMDAKK3hvcngxMDcgeG9yIDExMTEwMTExMSAgMTExMTExMTAxICAtPiAgICAgIDEwMDEwCit4b3J4MTA4IHhvciAxMTExMDExMTEgIDExMTExMTExMCAgLT4gICAgICAxMDAwMQorCistLSBub24tMC8xIHNob3VsZCBub3QgYmUgYWNjZXB0ZWQsIG5vciBzaG91bGQgc2lnbnMKK3hvcngyMjAgeG9yIDExMTExMTExMiAgMTExMTExMTExICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjIxIHhvciAzMzMzMzMzMzMgIDMzMzMzMzMzMyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDIyMiB4b3IgNTU1NTU1NTU1ICA1NTU1NTU1NTUgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyMjMgeG9yIDc3Nzc3Nzc3NyAgNzc3Nzc3Nzc3ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjI0IHhvciA5OTk5OTk5OTkgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDIyNSB4b3IgMjIyMjIyMjIyICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyMjYgeG9yIDQ0NDQ0NDQ0NCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjI3IHhvciA2NjY2NjY2NjYgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDIyOCB4b3IgODg4ODg4ODg4ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyMjkgeG9yIDk5OTk5OTk5OSAgMjIyMjIyMjIyICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjMwIHhvciA5OTk5OTk5OTkgIDQ0NDQ0NDQ0NCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDIzMSB4b3IgOTk5OTk5OTk5ICA2NjY2NjY2NjYgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyMzIgeG9yIDk5OTk5OTk5OSAgODg4ODg4ODg4ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhIGZldyByYW5kb21zCit4b3J4MjQwIHhvciAgNTY3NDY4Njg5IC05MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI0MSB4b3IgIDU2NzM2NzY4OSAgOTM0OTgxOTQyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyNDIgeG9yIC02MzE5MTc3NzIgLTcwNjAxNDYzNCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjQzIHhvciAtNzU2MjUzMjU3ICAxMzg1NzkyMzQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI0NCB4b3IgIDgzNTU5MDE0OSAgNTY3NDM1NDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNECit4b3J4MjUwIHhvciAgMjAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjUxIHhvciAgNzAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjUyIHhvciAgODAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjUzIHhvciAgOTAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjU0IHhvciAgMjAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjU1IHhvciAgNzAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjU2IHhvciAgODAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjU3IHhvciAgOTAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjU4IHhvciAgMTAwMDAwMDAwIDIwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjU5IHhvciAgMTAwMDAwMDAwIDcwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjYwIHhvciAgMTAwMDAwMDAwIDgwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjYxIHhvciAgMTAwMDAwMDAwIDkwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjYyIHhvciAgMDAwMDAwMDAwIDIwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjYzIHhvciAgMDAwMDAwMDAwIDcwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjY0IHhvciAgMDAwMDAwMDAwIDgwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjY1IHhvciAgMDAwMDAwMDAwIDkwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRC0xCit4b3J4MjcwIHhvciAgMDIwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjcxIHhvciAgMDcwMTAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjcyIHhvciAgMDgwMDEwMDAwIDEwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjczIHhvciAgMDkwMDAxMDAwIDEwMDAwMDAxMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4Mjc0IHhvciAgMTAwMDAwMTAwIDAyMDAxMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4Mjc1IHhvciAgMTAwMDAwMDAwIDA3MDAwMTAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4Mjc2IHhvciAgMTAwMDAwMDEwIDA4MDAxMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4Mjc3IHhvciAgMTAwMDAwMDAwIDA5MDAwMDAxMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IExTRAoreG9yeDI4MCB4b3IgIDAwMTAwMDAwMiAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI4MSB4b3IgIDAwMDAwMDAwNyAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI4MiB4b3IgIDAwMDAwMDAwOCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI4MyB4b3IgIDAwMDAwMDAwOSAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI4NCB4b3IgIDEwMDAwMDAwMCAwMDAxMDAwMDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI4NSB4b3IgIDEwMDEwMDAwMCAwMDEwMDAwMDcgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI4NiB4b3IgIDEwMDAxMDAwMCAwMTAwMDAwMDggLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI4NyB4b3IgIDEwMDAwMTAwMCAxMDAwMDAwMDkgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNaWRkaWUKK3hvcngyODggeG9yICAwMDEwMjAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyODkgeG9yICAwMDAwNzAwMDEgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyOTAgeG9yICAwMDAwODAwMDAgMTAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyOTEgeG9yICAwMDAwOTAwMDAgMTAwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyOTIgeG9yICAxMDAwMDAwMTAgMDAwMDIwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyOTMgeG9yICAxMDAxMDAwMDAgMDAwMDcwMDEwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyOTQgeG9yICAxMDAwMTAxMDAgMDAwMDgwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyOTUgeG9yICAxMDAwMDEwMDAgMDAwMDkwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHNpZ25zCit4b3J4Mjk2IHhvciAtMTAwMDAxMDAwIC0wMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI5NyB4b3IgLTEwMDAwMTAwMCAgMDAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyOTggeG9yICAxMDAwMDEwMDAgLTAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4Mjk5IHhvciAgMTAwMDAxMDAwICAwMDAwMTEwMDAgLT4gIDEwMDAxMDAwMAorCistLSBObWF4LCBObWluLCBOdGlueQoreG9yeDMzMSB4b3IgIDIgICA5Ljk5OTk5OTk5RSs5OTkgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDMzMiB4b3IgIDMgICAxRS05OTkgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDMzMyB4b3IgIDQgICAxLjAwMDAwMDAwRS05OTkgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDMzNCB4b3IgIDUgICAxRS0xMDA3ICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDMzNSB4b3IgIDYgICAtMUUtMTAwNyAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDMzNiB4b3IgIDcgICAtMS4wMDAwMDAwMEUtOTk5ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDMzNyB4b3IgIDggICAtMUUtOTk5ICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDMzOCB4b3IgIDkgICAtOS45OTk5OTk5OUUrOTk5ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDM0MSB4b3IgIDkuOTk5OTk5OTlFKzk5OSAgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDM0MiB4b3IgIDFFLTk5OSAgICAgICAgICAgICAgIDAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDM0MyB4b3IgIDEuMDAwMDAwMDBFLTk5OSAgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDM0NCB4b3IgIDFFLTEwMDcgICAgICAgICAgICAgIDE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDM0NSB4b3IgIC0xRS0xMDA3ICAgICAgICAgICAgLTEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDM0NiB4b3IgIC0xLjAwMDAwMDAwRS05OTkgICAgIDE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDM0NyB4b3IgIC0xRS05OTkgICAgICAgICAgICAgIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDM0OCB4b3IgIC05Ljk5OTk5OTk5RSs5OTkgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBIGZldyBvdGhlciBub24taW50ZWdlcnMKK3hvcngzNjEgeG9yICAxLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNjIgeG9yICAxRSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNjMgeG9yICAwLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNjQgeG9yICAwRSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNjUgeG9yICA5LjkgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNjYgeG9yICA5RSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNzEgeG9yICAwIDEuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNzIgeG9yICAwIDFFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNzMgeG9yICAwIDAuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNzQgeG9yICAwIDBFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNzUgeG9yICAwIDkuOSAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNzYgeG9yICAwIDlFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQWxsIFNwZWNpYWxzIGFyZSBpbiBlcnJvcgoreG9yeDc4MCB4b3IgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc4MSB4b3IgLUluZiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc4MiB4b3IgLUluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc4MyB4b3IgLUluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc4NCB4b3IgLUluZiAgIDAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc4NSB4b3IgLUluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc4NiB4b3IgLUluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc4NyB4b3IgLTEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc4OCB4b3IgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc4OSB4b3IgLTEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc5MCB4b3IgLTAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc5MSB4b3IgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc5MiB4b3IgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc5MyB4b3IgIDEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDc5NCB4b3IgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCit4b3J4ODAwIHhvciAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODAxIHhvciAgSW5mICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODAyIHhvciAgSW5mICAtMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODAzIHhvciAgSW5mICAtMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODA0IHhvciAgSW5mICAgMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODA1IHhvciAgSW5mICAgMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODA2IHhvciAgSW5mICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODA3IHhvciAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODA4IHhvciAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODA5IHhvciAtSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODEwIHhvciAtMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODExIHhvciAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODEyIHhvciAgMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODEzIHhvciAgMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODE0IHhvciAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODE1IHhvciAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3hvcng4MjEgeG9yICBOYU4gLUluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MjIgeG9yICBOYU4gLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MjMgeG9yICBOYU4gLTEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MjQgeG9yICBOYU4gLTAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MjUgeG9yICBOYU4gIDAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MjYgeG9yICBOYU4gIDEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MjcgeG9yICBOYU4gIDEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MjggeG9yICBOYU4gIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MjkgeG9yICBOYU4gIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MzAgeG9yIC1JbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MzEgeG9yIC0xMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MzIgeG9yIC0xICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MzMgeG9yIC0wICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MzQgeG9yICAwICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MzUgeG9yICAxICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MzYgeG9yICAxMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4MzcgeG9yICBJbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworeG9yeDg0MSB4b3IgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODQyIHhvciAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NDMgeG9yICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDg0NCB4b3IgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODQ1IHhvciAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NDYgeG9yICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDg0NyB4b3IgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODQ4IHhvciAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NDkgeG9yICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDg1MCB4b3IgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODUxIHhvciAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NTIgeG9yIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDg1MyB4b3IgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODU0IHhvciAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NTUgeG9yICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDg1NiB4b3IgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODU3IHhvciAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NTggeG9yICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDg1OSB4b3IgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK3hvcng4NjEgeG9yICBOYU4xICAgLUluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NjIgeG9yICtOYU4yICAgLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NjMgeG9yICBOYU4zICAgIDEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NjQgeG9yICBOYU40ICAgIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NjUgeG9yICBOYU41ICAgK05hTjYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NjYgeG9yIC1JbmYgICAgIE5hTjcgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NjcgeG9yIC0xMDAwICAgIE5hTjggICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NjggeG9yICAxMDAwICAgIE5hTjkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NjkgeG9yICBJbmYgICAgK05hTjEwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NzEgeG9yICBzTmFOMTEgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NzIgeG9yICBzTmFOMTIgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NzMgeG9yICBzTmFOMTMgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NzQgeG9yICBzTmFOMTQgICBOYU4xNyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NzUgeG9yICBzTmFOMTUgIHNOYU4xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NzYgeG9yICBOYU4xNiAgIHNOYU4xOSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NzcgeG9yIC1JbmYgICAgK3NOYU4yMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NzggeG9yIC0xMDAwICAgIHNOYU4yMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NzkgeG9yICAxMDAwICAgIHNOYU4yMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4ODAgeG9yICBJbmYgICAgIHNOYU4yMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4ODEgeG9yICtOYU4yNSAgK3NOYU4yNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4ODIgeG9yIC1OYU4yNiAgICBOYU4yOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4ODMgeG9yIC1zTmFOMjcgIHNOYU4yOSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4ODQgeG9yICAxMDAwICAgIC1OYU4zMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng4ODUgeG9yICAxMDAwICAgLXNOYU4zMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kb2N0ZXN0X2FsaWFzZXMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvZG9jdGVzdF9hbGlhc2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzNmODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZG9jdGVzdF9hbGlhc2VzLnB5CkBAIC0wLDAgKzEsMTMgQEAKKyMgVXNlZCBieSB0ZXN0X2RvY3Rlc3QucHkuCisKK2NsYXNzIFR3b05hbWVzOgorICAgICcnJ2YoKSBhbmQgZygpIGFyZSB0d28gbmFtZXMgZm9yIHRoZSBzYW1lIG1ldGhvZCcnJworCisgICAgZGVmIGYoc2VsZik6CisgICAgICAgICcnJworICAgICAgICA+Pj4gcHJpbnQgVHdvTmFtZXMoKS5mKCkKKyAgICAgICAgZgorICAgICAgICAnJycKKyAgICAgICAgcmV0dXJuICdmJworCisgICAgZyA9IGYgIyBkZWZpbmUgYW4gYWxpYXMgZm9yIGYKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kb2N0ZXN0X2FsaWFzZXMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RvY3Rlc3RfYWxpYXNlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlZTFhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kb2N0ZXN0X2FsaWFzZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kb2N0ZXN0X2FsaWFzZXMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RvY3Rlc3RfYWxpYXNlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlZTFhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kb2N0ZXN0X2FsaWFzZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kb3VibGVfY29uc3QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvZG91YmxlX2NvbnN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YzMzYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZG91YmxlX2NvbnN0LnB5CkBAIC0wLDAgKzEsMzAgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RGYWlsZWQKKworIyBBIHRlc3QgZm9yIFNGIGJ1ZyA0MjIxNzc6ICBtYW5pZmVzdCBmbG9hdCBjb25zdGFudHMgdmFyaWVkIHdheSB0b28gbXVjaCBpbgorIyBwcmVjaXNpb24gZGVwZW5kaW5nIG9uIHdoZXRoZXIgUHl0aG9uIHdhcyBsb2FkaW5nIGEgbW9kdWxlIGZvciB0aGUgZmlyc3QKKyMgdGltZSwgb3IgcmVsb2FkaW5nIGl0IGZyb20gYSBwcmVjb21waWxlZCAucHljLiAgVGhlICJleHBlY3RlZCIgZmFpbHVyZQorIyBtb2RlIGlzIHRoYXQgd2hlbiB0ZXN0X2ltcG9ydCBpbXBvcnRzIHRoaXMgYWZ0ZXIgYWxsIC5weWMgZmlsZXMgaGF2ZSBiZWVuCisjIGVyYXNlZCwgaXQgcGFzc2VzLCBidXQgd2hlbiB0ZXN0X2ltcG9ydCBpbXBvcnRzIHRoaXMgZnJvbQorIyBkb3VibGVfY29uc3QucHljLCBpdCBmYWlscy4gIFRoaXMgaW5kaWNhdGVzIGEgd29lZnVsIGxvc3Mgb2YgcHJlY2lzaW9uIGluCisjIHRoZSBtYXJzaGFsIGZvcm1hdCBmb3IgZG91Ymxlcy4gIEl0J3MgYWxzbyBwb3NzaWJsZSB0aGF0IHJlcHIoKSBkb2Vzbid0CisjIHByb2R1Y2UgZW5vdWdoIGRpZ2l0cyB0byBnZXQgcmVhc29uYWJsZSBwcmVjaXNpb24gZm9yIHRoaXMgYm94LgorCitQSSAgICA9IDMuMTQxNTkyNjUzNTg5NzkzMjQKK1RXT1BJID0gNi4yODMxODUzMDcxNzk1ODY0OAorCitQSV9zdHIgICAgPSAiMy4xNDE1OTI2NTM1ODk3OTMyNCIKK1RXT1BJX3N0ciA9ICI2LjI4MzE4NTMwNzE3OTU4NjQ4IgorCisjIFZlcmlmeSB0aGF0IHRoZSBkb3VibGUgeCBpcyB3aXRoaW4gYSBmZXcgYml0cyBvZiBldmFsKHhfc3RyKS4KK2RlZiBjaGVja19vayh4LCB4X3N0cik6CisgICAgYXNzZXJ0IHggPiAwLjAKKyAgICB4MiA9IGV2YWwoeF9zdHIpCisgICAgYXNzZXJ0IHgyID4gMC4wCisgICAgZGlmZiA9IGFicyh4IC0geDIpCisgICAgIyBJZiBkaWZmIGlzIG5vIGxhcmdlciB0aGFuIDMgVUxQICh3cnQgeDIpLCB0aGVuIGRpZmYvOCBpcyBubyBsYXJnZXIKKyAgICAjIHRoYW4gMC4zNzUgVUxQLCBzbyBhZGRpbmcgZGlmZi84IHRvIHgyIHNob3VsZCBoYXZlIG5vIGVmZmVjdC4KKyAgICBpZiB4MiArIChkaWZmIC8gOC4pICE9IHgyOgorICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJNYW5pZmVzdCBjb25zdCAlcyBsb3N0IHRvbyBtdWNoIHByZWNpc2lvbiAiICUgeF9zdHIpCisKK2NoZWNrX29rKFBJLCBQSV9zdHIpCitjaGVja19vayhUV09QSSwgVFdPUElfc3RyKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RvdWJsZV9jb25zdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvZG91YmxlX2NvbnN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzU5NTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RvdWJsZV9jb25zdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RvdWJsZV9jb25zdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvZG91YmxlX2NvbnN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTc5ZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RvdWJsZV9jb25zdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2VtcHR5LnZicyBiL2xpYi9weXRob24yLjcvdGVzdC9lbXB0eS52YnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1ZjA3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9lbXB0eS52YnMKQEAgLTAsMCArMSBAQAorJ0VtcHR5IFZCUyBmaWxlLCBkb2VzIG5vdGhpbmcuICBIZWxwZXIgZm9yIExpYlx0ZXN0XHRlc3Rfc3RhcnRmaWxlLnB5LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9leGNlcHRpb25faGllcmFyY2h5LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9leGNlcHRpb25faGllcmFyY2h5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmI2ZGRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2V4Y2VwdGlvbl9oaWVyYXJjaHkudHh0CkBAIC0wLDAgKzEsNTAgQEAKK0Jhc2VFeGNlcHRpb24KKyArLS0gU3lzdGVtRXhpdAorICstLSBLZXlib2FyZEludGVycnVwdAorICstLSBHZW5lcmF0b3JFeGl0CisgKy0tIEV4Y2VwdGlvbgorICAgICAgKy0tIFN0b3BJdGVyYXRpb24KKyAgICAgICstLSBTdGFuZGFyZEVycm9yCisgICAgICB8ICAgICstLSBCdWZmZXJFcnJvcgorICAgICAgfCAgICArLS0gQXJpdGhtZXRpY0Vycm9yCisgICAgICB8ICAgIHwgICAgKy0tIEZsb2F0aW5nUG9pbnRFcnJvcgorICAgICAgfCAgICB8ICAgICstLSBPdmVyZmxvd0Vycm9yCisgICAgICB8ICAgIHwgICAgKy0tIFplcm9EaXZpc2lvbkVycm9yCisgICAgICB8ICAgICstLSBBc3NlcnRpb25FcnJvcgorICAgICAgfCAgICArLS0gQXR0cmlidXRlRXJyb3IKKyAgICAgIHwgICAgKy0tIEVudmlyb25tZW50RXJyb3IKKyAgICAgIHwgICAgfCAgICArLS0gSU9FcnJvcgorICAgICAgfCAgICB8ICAgICstLSBPU0Vycm9yCisgICAgICB8ICAgIHwgICAgICAgICArLS0gV2luZG93c0Vycm9yIChXaW5kb3dzKQorICAgICAgfCAgICB8ICAgICAgICAgKy0tIFZNU0Vycm9yIChWTVMpCisgICAgICB8ICAgICstLSBFT0ZFcnJvcgorICAgICAgfCAgICArLS0gSW1wb3J0RXJyb3IKKyAgICAgIHwgICAgKy0tIExvb2t1cEVycm9yCisgICAgICB8ICAgIHwgICAgKy0tIEluZGV4RXJyb3IKKyAgICAgIHwgICAgfCAgICArLS0gS2V5RXJyb3IKKyAgICAgIHwgICAgKy0tIE1lbW9yeUVycm9yCisgICAgICB8ICAgICstLSBOYW1lRXJyb3IKKyAgICAgIHwgICAgfCAgICArLS0gVW5ib3VuZExvY2FsRXJyb3IKKyAgICAgIHwgICAgKy0tIFJlZmVyZW5jZUVycm9yCisgICAgICB8ICAgICstLSBSdW50aW1lRXJyb3IKKyAgICAgIHwgICAgfCAgICArLS0gTm90SW1wbGVtZW50ZWRFcnJvcgorICAgICAgfCAgICArLS0gU3ludGF4RXJyb3IKKyAgICAgIHwgICAgfCAgICArLS0gSW5kZW50YXRpb25FcnJvcgorICAgICAgfCAgICB8ICAgICAgICAgKy0tIFRhYkVycm9yCisgICAgICB8ICAgICstLSBTeXN0ZW1FcnJvcgorICAgICAgfCAgICArLS0gVHlwZUVycm9yCisgICAgICB8ICAgICstLSBWYWx1ZUVycm9yCisgICAgICB8ICAgICAgICAgKy0tIFVuaWNvZGVFcnJvcgorICAgICAgfCAgICAgICAgICAgICAgKy0tIFVuaWNvZGVEZWNvZGVFcnJvcgorICAgICAgfCAgICAgICAgICAgICAgKy0tIFVuaWNvZGVFbmNvZGVFcnJvcgorICAgICAgfCAgICAgICAgICAgICAgKy0tIFVuaWNvZGVUcmFuc2xhdGVFcnJvcgorICAgICAgKy0tIFdhcm5pbmcKKyAgICAgICAgICAgKy0tIERlcHJlY2F0aW9uV2FybmluZworICAgICAgICAgICArLS0gUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZworICAgICAgICAgICArLS0gUnVudGltZVdhcm5pbmcKKyAgICAgICAgICAgKy0tIFN5bnRheFdhcm5pbmcKKyAgICAgICAgICAgKy0tIFVzZXJXYXJuaW5nCisgICAgICAgICAgICstLSBGdXR1cmVXYXJuaW5nCisJICAgKy0tIEltcG9ydFdhcm5pbmcKKwkgICArLS0gVW5pY29kZVdhcm5pbmcKKwkgICArLS0gQnl0ZXNXYXJuaW5nCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZmxvYXRpbmdfcG9pbnRzLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9mbG9hdGluZ19wb2ludHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTA3M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZmxvYXRpbmdfcG9pbnRzLnR4dApAQCAtMCwwICsxLDEwMjggQEAKKyMgVGhlc2UgbnVtYmVycyBhcmUgdXNlZCB0byB0ZXN0IGZsb2F0aW5nIHBvaW50IGJpbmFyeS10by1kZWNpbWFsIGNvbnZlcnNpb24uCisjIFRoZXkgYXJlIGJhc2VkIG9uIHRoZSBUQ0wgdGVzdCBzdWl0ZSAodGVzdHMvZXhwci50ZXN0KSwgd2hpY2ggaXMgYmFzZWQgb24KKyMgdGVzdCBkYXRhIGZyb206CisjIEJyaWdpdHRlIFZlcmRvbmssIEFubmllIEN1eXQsIERlbm5pcyBWZXJzY2hhZXJlbiwgQSBwcmVjaXNpb24gYW5kIHJhbmdlCisjIGluZGVwZW5kZW50IHRvb2wgZm9yIHRlc3RpbmcgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYyBJSTogQ29udmVyc2lvbnMsCisjIEFDTSBUcmFuc2FjdGlvbnMgb24gTWF0aGVtYXRpY2FsIFNvZnR3YXJlIDI3OjIgKE1hcmNoIDIwMDEpLCBwcC4gMTE5LTE0MC4KKworMEUwCistMEUwCisxRTAKKzE1RS0xCisxMjVFLTIKKzExMjVFLTMKKzEwNjI1RS00CisxMDMxMjVFLTUKKzEwMTU2MjVFLTYKKzEwMDc4MTI1RS03CisxMDAzOTA2MjVFLTgKKzEwMDE5NTMxMjVFLTkKKzEwMDA5NzY1NjI1RS0xMAorMTAwMDQ4ODI4MTI1RS0xMQorMTAwMDI0NDE0MDYyNUUtMTIKKzEwMDAxMjIwNzAzMTI1RS0xMworMTAwMDA2MTAzNTE1NjI1RS0xNAorMTAwMDAzMDUxNzU3ODEyNUUtMTUKKzEwMDAwMTUyNTg3ODkwNjI1RS0xNgorKzhFMTUzCistMUUxNTMKKys5RTMwNgorLTJFMTUzCisrN0UtMzA0CistM0UtNDkKKys3RS0zMDMKKy02RS00OQorKzlFNDMKKy05RTQ0CisrOEUzMDMKKy0xRTMwMworKzdFLTI4NworLTJFLTIwNAorKzJFLTIwNQorLTlFLTQ3CisrMzRFMTk1CistNjhFMTk1CisrODVFMTk0CistNjdFOTcKKys5M0UtMjM0CistMTlFLTg3CisrMzhFLTg3CistMzhFLTg4CistNjlFMjIwCisrMThFNDMKKy0zNkU0MworKzYxRS05OQorLTQzRS05MgorKzg2RS05MgorLTUxRS03NAorKzI4M0U4NQorLTU2NkU4NQorKzU4OUUxODcKKy04MzlFMTQzCistNzQ0RS0yMzQKKys5MzBFLTIzNQorLTE4NkUtMjM0CisrNjA0RTE3NQorLTMwMkUxNzUKKys3NTVFMTc0CistMTUxRTE3NQorKzY2MkUtMjEzCistNDA4RS03NAorKzUxMEUtNzUKKys2NzgyRTU1CistMjMwOUU5MgorKzc5NjNFMzQKKy0zMzkxRTU1CisrNzkwM0UtOTYKKy03NjExRS0yMjYKKys0OTA3RS0xOTYKKy01NTQ3RS0zMTEKKys1MzExRTI0MQorLTUzMTFFMjQzCisrNTMxMUUyNDIKKys5MjY5RS00NQorLTg1NTlFLTI4OQorKzg2OTlFLTI3NgorLTgwODVFLTY0CisrNzQ4MTlFMjAxCistODIwODFFNDEKKys1MTg4MUUzNworLTU1MDYxRTE1NworKzc3NDAyRS0yMTUKKy0zMzg5MUUtOTIKKyszODcwMUUtMjE1CistODIxMzlFLTc2CisrNzU4NTlFMjUKKys4OTUwOUUxNDAKKy01NzUzM0UyODcKKys0NjA3M0UtMzIKKy05MjE0NkUtMzIKKys4Mzc3MUUtNzQKKy0zNDc5NkUtMjc2CisrNTg0MTY5RTIyOQorKzE2NDE2MkU0MQorLTMyODMyNEU0MQorKzIwOTkwMUUtMTEKKy00MTk4MDJFLTExCisrOTQwMTg5RS0xMTIKKy04OTI3NzFFLTIxMworKzc1NzgwM0UxMjAKKy0yNTI2MDFFMTIwCisrMjUyNjAxRTEyMQorLTUwNTIwMkUxMjAKKys5NzA4MTFFLTI2NAorLTY1NDgzOUUtNjAKKysyODk3NjdFLTE3OAorLTU3OTUzNEUtMTc4CistODgyMzY5MUUxMzAKKys5MzQ2NzA0RTIyOQorLTExNjgzMzhFMjI5CistNjA2MzM2OUUtMTM2CisrMzg2NTQyMUUtMjI1CistNTc4Mzg5M0UtMTI3CisrMjU3MjIzMUUyMjMKKy01MTQ0NDYyRTIyMworKzE4MTc2MjNFMTA5CisrNjQzMTU0M0UtOTcKKy01NDQ0MDk3RS0yMQorKzgwNzY5OTlFLTEyMQorLTk5OTc2NDlFLTI3MAorKzUwNjA5MjYzRTE1NworKzcwNTg5NTI4RTEzMAorLTg4MjM2OTEwRTEyOQorKzg3NTc1NDM3RS0zMTAKKy0yMzEzNTU3MkUtMTI3CisrODU5MDA4ODFFMTc3CistODQ4NjMxNzFFMTEzCisrNjg3NjE1ODZFMjMyCistNTA0NjQwNjlFMjg2CisrMjc4NjkxNDdFLTI0OAorLTU1NzM4Mjk0RS0yNDgKKys3MDE3NjM1M0UtNTMKKy04MDU1NTA4NkUtMzIKKy00OTEwODA2NTRFMTIxCisrNTI2MjUwOTE4RTI4NworLTI0NTU0MDMyN0UxMjEKKy0xNzUxNTA4NzRFLTMxMAorKzM1MDMwMTc0OEUtMzEwCistNDM3ODc3MTg1RS0zMTEKKys0NTgxMTcxNjZFNTIKKy05MTYyMzQzMzJFNTIKKysyMjkwNTg1ODNFNTIKKy01MjU3ODk5MzVFOTgKKysyODI5MjY4OTdFLTIyNworLTU2NTg1Mzc5NEUtMjI3CisrNjY3Mjg0MTEzRS0yNDAKKy05NzEyMTI2MTFFLTEyNgorKzk5ODEzOTYzMTdFLTE4MgorLTUwMzUyMzE5NjVFLTE1NgorKzgzMzY5NjA0ODNFLTE1MworLTgwNTYzNzExNDRFLTE1NQorKzY0MTg0ODg4MjdFNzkKKy0zOTgxMDA2OTgzRTI1MgorKzc5NjIwMTM5NjZFMjUyCistNDcxMzg5ODU1MUUyNjEKKys4NzE1MzgwNjMzRS01OAorLTkwNzg1NTU4MzlFLTEwOQorKzk3MTIxMjYxMTBFLTEyNworKzQyMzMzODQyNDUxRTIwMQorLTg0NjY3Njg0OTAyRTIwMQorKzIzNzkyMTIwNzA5RS0zMTUKKy03ODU2NDAyMTUxOUUtMjI3CisrNzE4MTIwNTQ4ODNFLTE4OAorLTMwMzExMTYzNjMxRS0xMTYKKys3MTgwMzkxNDY1N0UyOTIKKyszNjMxNDIyMzM1NkUtMTA5CisrMTgxNTcxMTE2NzhFLTEwOQorLTQ1MzkyNzc5MTk1RS0xMTAKKys3NzgzODAzNjIyOTNFMjE4CistNjg1NzYzMDE1NjY5RTI4MAorKzk1MjkxODY2ODE1MUU3MAorLTU0ODM1NzQ0MzUwNUUzMgorKzM4NDg2NTAwNDkwN0UtMjg1CistNzY5NzMwMDA5ODE0RS0yODUKKys2OTcwMTU0MTg0MTdFLTkzCistOTE1NjU0MDQ5MzAxRS0yOAorKzE3ODU0ODY1NjMzOUUxNjkKKy03NDI1MjI4OTE1MTdFMjU5CisrNzQyNTIyODkxNTE3RTI1OAorLTM1NzA5NzMxMjY3OEUxNjkKKy0zMTEzNTIxNDQ5MTcyRTIxOAorKzM4OTE5MDE4MTE0NjVFMjE3CistMTU1Njc2MDcyNDU4NkUyMTgKKys5OTk3ODc4NTA3NTYzRS0xOTUKKy03MjQ3NTYzMDI5MTU0RS0zMTkKKyszNjIzNzgxNTE0NTc3RS0zMTkKKy0zMDkyNDQ2Mjk4MzIzRS0yMDAKKys2MzYzODU3OTIwNTkxRTE0NQorLTgyMzM1NTkzNjA4NDlFOTQKKysyNjg5ODQ1OTU0NTQ3RTQ5CistNTM3OTY5MTkwOTA5NEU0OQorKzU1NjAzMjI1MDE5MjZFLTMwMQorLTc4MTI4Nzg0ODkyNjFFLTE3OQorKzg0MzkzOTg1MzMwNTNFLTI1NgorLTI3ODAxNjEyNTA5NjNFLTMwMQorLTg3NjA1Njk5MTYxNjY1RTE1NQorLTE3NTIxMTM5ODMyMzMzRTE1NgorLTg4MjE4MTAxMzYzNTEzRS0xNzAKKyszODYzOTI0NDMxMTYyN0UtMTE1CisrMzU1OTM5NTk4MDczMDZFMjYxCistNTMzOTA5Mzk3MTA5NTlFMjYwCisrNzExODc5MTk2MTQ2MTJFMjYxCistODg5ODQ4OTk1MTgyNjVFMjYwCisrNzcwMDM2NjU2MTg4OTVFLTczCistMTU0MDA3MzMxMjM3NzlFLTcyCisrNjE2MDI5MzI0OTUxMTZFLTcyCistMzA4MDE0NjYyNDc1NThFLTcyCisrODM0NzM1NDk0OTE3MDYzRS0zMDAKKy01ODk3OTUxNDkyMDY0MzRFLTE1MQorKzQ3NTYwMzIxMzIyNjg1OUUtNDIKKy0yOTQ4OTc1NzQ2MDMyMTdFLTE1MQorKzg1MDgxMzAwODAwMTkxM0U5MworLTIwMzQ0OTE3MjA0MzMzOUUxODUKKys0MDY4OTgzNDQwODY2NzhFMTg1CistODEzNzk2Njg4MTczMzU2RTE4NQorKzYwNDUzMzg1MTQ2MDkzOTNFMjQ0CistNTE0NTk2Mzc3ODk1NDkwNkUxNDIKKysyNTcyOTgxODg5NDc3NDUzRTE0MgorLTY5NjU5NDk0Njk0ODcxNDZFNzQKKys2MTgyNDEwNDk0MjQxNjI3RS0xMTkKKy04NTEwMzA5NDk4MTg2OTg1RS0yNzcKKys2NjQ3NzA0NjM3MjczMzMxRS0yMTIKKy0yMjE1OTAxNTQ1NzU3Nzc3RS0yMTIKKyszNzcxNDc2MTg1Mzc2MzgzRTI3NgorLTM3Mjk5MDE4NDgwNDM4NDZFMjEyCisrMzc3MTQ3NjE4NTM3NjM4M0UyNzcKKy05OTc3ODMwNDY1NjQ5MTY2RTExOQorKzg0Mzk5Mjg0OTYzNDkzMTlFLTE0MgorLTgyMDQyMzAwODIwNzA4ODJFLTU5CisrODg1MzY4NjQzNDg0Mzk5N0UtMjQ0CistNTU1MzI3NDI3MjI4ODU1OUUtMTA0CisrMzYxNDkwMjM2MTEwOTYxNjJFMTQ0CistMzYxNDkwMjM2MTEwOTYxNjJFMTQ3CisrMTgwNzQ1MTE4MDU1NDgwODFFMTQ2CistMTgwNzQ1MTE4MDU1NDgwODFFMTQ3CisrOTczMzg3NzQxMzg5NTQ0MjFFLTI5MAorLTg4MTMzODA5ODA0OTUwOTYxRS0zMDgKKys5NDA4MDA1NTkwMjY4MjM5N0UtMjQzCistMjQ2OTEwMDI3MzI2NTQ4ODFFLTExNQorKzUyMzA2NDkwNTI3NTE0NjE0RTQ5CistMjYxNTMyNDUyNjM3NTczMDdFNDkKKys1NTE4ODY5MjI1NDE5MzYwNEUxNjUKKy02ODk4NTg2NTMxNzc0MjAwNUUxNjQKKysyNzE3NjI1ODAwNTMxOTE2N0UtMjYxCistNzMxNjkyMzAxMDcyNTYxMTZFLTI0OAorKzkxNDYxNTM3NjM0MDcwMTQ1RS0yNDkKKy01NDM1MjUxNjAxMDYzODMzNEUtMjYxCisrNTg2MTQ0Mjg5NjM4NTM1ODc4RTI4MAorLTYwMTExNzAwNjc4NTI5NTQzMUUyNDUKKysyOTMwNzIxNDQ4MTkyNjc5MzlFMjgwCistOTUzMTg0NzEzMjM4NTE2NjUyRTI3MgorKzkwMjA0MjM1ODI5MDM2NjUzOUUtMjgxCistNTU3MDM1NzMwMTg5ODU0NjYzRS0yOTQKKys5MDIwNDIzNTgyOTAzNjY1MzlFLTI4MAorLTM1NDk0NDEwMDUwNzU1NDM5M0UtMjM4CisrMjcyMTA0MDQxNTEyMjQyNDc5RTE5OQorLTgxNjMxMjEyNDUzNjcyNzQzN0UxOTkKKys1NDQyMDgwODMwMjQ0ODQ5NThFMTk5CistNzkyNjQ0OTI3ODUyMzc4MTU5RTc4CistNjc5NDA2NDUwMTMyOTc5MTc1RS0yNjMKKys1NDM1MjUxNjAxMDYzODMzNDBFLTI2MgorKzc0MDAyNTM2OTU2ODI5MjAxOTZFMjE1CistMTg1MDA2MzQyMzkyMDczMDA0OUUyMTUKKyszNzAwMTI2ODQ3ODQxNDYwMDk4RTIxNQorLTkyNTAzMTcxMTk2MDM2NTAyNDVFMjE0CisrODM5NjA5NDMwMDU2OTc3OTY4MUUtMjUyCistMzUwNzY2NTA4NTAwMzI5NjI4MUUtNzUKKys3MDE1MzMwMTcwMDA2NTkyNTYyRS03NQorLTcwMTUzMzAxNzAwMDY1OTI1NjJFLTc0CisrNzE4NTYyMDQzNDk1MTkxOTM1MUUyMDUKKy0xMzYwNTIwMjA3NTYxMjEyMzk1RTE5OAorKzIxNzg5OTkxODUzNDUxNTE3MzFFLTE4NAorLTg2OTEwODk0ODYyMDE1NjcxMDJFLTIxOAorKzQzNDU1NDQ3NDMxMDA3ODM1NTFFLTIxOAorLTQzNTc5OTgzNzA2OTAzMDM0NjJFLTE4NAorKzU5ODI1MjY3MzQ5MTA2ODkyNDYxRTE3NworLTYyMjU5MTEwNjg0NDIzOTU3NzkxRTQ3CisrNTgzODAxNjg0NzcwMzg1NjU1OTlFMjY1CistNjIyNTkxMTA2ODQ0MjM5NTc3OTFFNDgKKy0zMzU4NDM3NzIwMjI3OTExODcyNEUtMjUyCistNTc0ODQ5NjM0Nzk2MTUzNTQ4MDhFMjA1CisrNzE4NTYyMDQzNDk1MTkxOTM1MTBFMjA0CistMTQzNzEyNDA4Njk5MDM4Mzg3MDJFMjA1CisrMzY5OTIwODQ3NjAxNzc2MjQxNzdFLTMxOAorLTczOTg0MTY5NTIwMzU1MjQ4MzU0RS0zMTgKKys5OTI1Nzc2MzIyNzcxMzg5MDI0NEUtMTE1CistODczMzYzNjI0MjUxODI1NDc2OTdFLTI4MAorKzdFMjg5CistM0UxNTMKKys2RTE1MworLTVFMjQzCisrN0UtMTYxCistN0UtMTcyCisrOEUtNjMKKy03RS0xMTMKKys4RTEyNgorLTRFMTI2CisrNUUxMjUKKy0xRTEyNgorKzhFLTE2MworLTFFLTE2MworKzJFLTE2MworLTRFLTE2MworKzUxRTE5NQorLTM3RTQ2CisrNzRFNDYKKy01NkUyODkKKys2OUUtMTQ1CistNzBFLTE2MgorKzU2RS0xNjEKKy0yMUUtMzAzCisrMzRFLTI3NgorLTY4RS0yNzYKKys4NUUtMjc3CistODdFLTI3NAorKzgyOUUxMDIKKy02MjNFMTAwCisrNzIzRS0xNjIKKy00NTdFLTEwMgorKzkxNEUtMTAyCistMzIzRS0xMzUKKysxNTFFMTc2CistMzAyRTE3NgorKzkyMUU5MAorLTYwNEUxNzYKKys4MjNFLTIwNgorLTQ2M0UtMTE0CisrMzQ4RS0yNzQKKys5OTY4RTEwMAorLTYyMzBFOTkKKysxMjQ2RTEwMAorKzY2NzZFLTI5NgorLTgzNDVFLTI5NworKzE2NjlFLTI5NgorLTMzMzhFLTI5NgorKzMyNTdFNTgKKy02NTE0RTU4CisrMjQxNkUxNzYKKys4MDg1RS02MworLTMyMzRFLTYyCisrMTYxN0UtNjIKKy02NDY4RS02MgorKzUzNDE4RTExMQorLTYwNTEzRTE2MAorKzI2NzA5RTExMQorLTk5NDQ3RTE2NgorKzEyNTQ5RTQ4CistMjUwOThFNDgKKys1MDE5NkU0OAorLTYyNzQ1RTQ3CisrODM3NzFFLTczCistOTc0NTFFLTE2NworKzg2NjM3RS0yMDMKKy03NTU2OUUtMjU0CisrNDczODA2RTgzCistOTQ3NjEyRTgzCisrMjkyMzY5RTc2CistNTg0NzM4RTc2CisrOTMzNTg3RS0xNDAKKy03MjA5MTlFLTE0CisrNTM1MDAxRS0xNDkKKy04OTA1MjFFLTIzNQorKzU0ODA1N0U4MQorLTcwNjE4MUU4OAorKzgyMDk5N0UxMDYKKy0zMjA2ODFFNjMKKys5Mjg2MDlFLTI2MQorLTMwMjI3NkUtMjU0CisrMTUxMTM4RS0yNTQKKys0NjkxNzczRTQ1CistOTM4MzU0NkU0NQorKzMwNTk5NDlFLTI0MworLTYxMTk4OThFLTI0MworKzUzNTY2MjZFLTIxMworLTQ4NzczNzhFLTE5OQorKzc3MTY2OTNFMjIzCistNTQ1Mjg2OUUxMDkKKys0NTkwODMxRTE1NgorLTkxODE2NjJFMTU2CistMzcxNDQzNkUtMjYxCisrNDY0MzA0NUUtMjYyCistNzQyODg3MkUtMjYxCisrNTI5NDIxNDZFMTMwCistMjc5NjYwNjFFMTQ1CisrMjY0NzEwNzNFMTMwCistNTU5MzIxMjJFMTQ1CisrOTU0MTI1NDhFLTk5CistNDc3MDYyNzRFLTk5CisrMjM4NTMxMzdFLTk5CistNzg0OTM2NTRFLTMwMQorKzY1MzQ2NDE3RTI5CistNTEwODMwOTlFMTY3CisrODkzOTYzMzNFMjY0CistODQ4NjMxNzFFMTE0CisrNTk1NDA4MzZFLTI1MQorLTc0NDI2MDQ1RS0yNTIKKysxNDg4NTIwOUUtMjUxCistMjk3NzA0MThFLTI1MQorKzk4MjE2MTMwOEUxMjIKKy0yNDU1NDAzMjdFMTIyCisrNDkxMDgwNjU0RTEyMgorKzUyNTQ1MjYyMkUtMzEwCistNzcxODM3MTEzRS0xMzQKKys4MjA4NTgwODFFLTE1MAorLTI2MjcyNjMxMUUtMzEwCisrOTIzMDkxNDg3RTIwOQorLTY1Mzc3Nzc2N0UyNzMKKys4NDIxMTYyMzZFLTUzCistNzQxMTExMTY5RS0yMDIKKys4Mzk1MDcyNDdFLTI4NAorLTk1MTQ4NzI2OUUtMjY0CistOTgyMTYxMzA4MEUxMjEKKys2Njc3ODU2MDExRS0zMQorLTM1NzM3OTY4MjZFLTI2NgorKzcxNDc1OTM2NTJFLTI2NgorLTk5ODEzOTYzMTdFLTE4MQorKzMyNjg4ODg4MzVFMjcyCistMjYxNTExMTA2OEUyNzMKKysxMzA3NTU1NTM0RTI3MworKzI5OTA2NzExNTRFLTE5MAorLTE0OTUzMzU1NzdFLTE5MAorKzU5ODEzNDIzMDhFLTE5MAorLTc0NzY2Nzc4ODVFLTE5MQorKzgyMjU5Njg0MTk0RS0yMDIKKy05MzIyNzI2NzcyN0UtNDkKKys0MTEyOTg0MjA5N0UtMjAyCistNDc1ODQyNDE0MThFLTMxNAorLTc5MzYwMjkzNDA2RTkyCisrNTczMzIyNTkzNDlFMjI1CistNTcyMDIzMjYxNjJFMTExCisrODY4NjA1OTcwNTNFLTIwNgorLTUzODI3MDEwNjQzRS0yMDAKKys1MzU4NzEwNzQyM0UtNjEKKys2MzUwMDc2MzY3NjVFMjAwCisrNTA4MDA2MTA5NDEyRTIwMQorLTI1NDAwMzA1NDcwNkUyMDEKKys1NjEwMjk3MTg3MTVFLTcyCistODk3NjQ3NTQ5OTQ0RS03MQorKzExMjIwNTk0Mzc0M0UtNzEKKy04NzM5NDcwODYwODFFLTIzNgorKzgwOTE4NDcwOTE3N0UxMTYKKy01NzMxMTI5MTc0MjJFODEKKysyODY1NTY0NTg3MTFFODEKKys5NTI4MDU4MjE0OTFFLTI1OQorLTEzMjE4OTk5Mjg3M0UtNDQKKy0xNzM2OTYwMzg0OTNFLTE0NAorKzE4MzExMzI3NTc1OTlFLTEwNworLTkxNTU2NjM3ODc5OTVFLTEwOAorKzczMjQ1MzEwMzAzOTZFLTEwNworLTkyNzczMzg4OTQ5NjlFLTIwMAorKzgxODgyOTI0MjM5NzNFMjg3CistNTY3MjU1NzQzNzkzOEU1OQorKzI4MzYyNzg3MTg5NjlFNTkKKy05OTk1MTUzMTUzNDk0RTU0CisrOTIyNDc4NjQyMjA2OUUtMjkxCistMzE0MjIxMzE2NDk4N0UtMjk0CisrNjI4NDQyNjMyOTk3NEUtMjk0CistODM0MDQ4Mzc1Mjg4OUUtMzAxCisrNjcwMzkzNzE0ODY0NjZFODkKKy02MjE1MDc4NjYxNTIzOUUxOTcKKyszMzUxOTY4NTc0MzIzM0U4OQorLTUyNTYzNDE5NDk2OTk5RTE1NgorKzMyNTk5NDYwNDY2OTkxRS02NQorLTQxMDEwOTg4Nzk4MDA3RS0xMzMKKys2NTE5ODkyMDkzMzk4MkUtNjUKKy04MjAyMTk3NzU5NjAxNEUtMTMzCisrODA1Mjc5NzY2NDM4MDlFNjEKKy03NDcxMjYxMTUwNTIwOUUxNTgKKys1MzM5MDkzOTcxMDk1OUUyNjEKKy02OTI3NzMwMjY1OTE1NUUyMjUKKys0NjIwMjE5OTM3MTMzN0UtNzIKKy0yMzQzODYzNTQ2Nzc4M0UtMTc5CisrNDE5MjE1NjA2MTUzNDlFLTY3CistOTI0MDQzOTg3NDI2NzRFLTcyCisrNzM4NTQ1NjA2NjQ3MTk3RTEyNAorLTk3MjcwODE4MTE4Mjk0OUUxMTcKKy04Mzc5OTIxNDM1ODA4MjVFODcKKys2MDk2MTA5MjcxNDkwNTFFLTI1NQorLTQ3NTYwMzIxMzIyNjg1OUUtNDEKKys1NjMwMDI4MDA2NzEwMjNFLTE3NworLTk1MTIwNjQyNjQ1MzcxOEUtNDEKKys4MDU0MTY0MzI2NTY1MTlFMjAyCistNTMwNjU4Njc0Njk0MzM3RTE1OQorKzk0NjU3NDE3Mzg2MzkxOEUyMDgKKy0zMTgzMjk5NTMzMTg1NTNFMTEzCistNDYyMDIxOTkzNzEzMzcwRS03MworKzM2OTYxNzU5NDk3MDY5NkUtNzIKKyszNjY2MTU2MjEyMDE0OTk0RTIzMworLTE4MzMwNzgxMDYwMDc0OTdFMjMzCisrODMwMTc5MDUwODYyNDIzMkUxNzQKKy0xMDM3NzIzODEzNTc4MDI5RTE3NAorKzcyOTc2NjI4ODA1ODExMzlFLTI4NgorLTUxMDYxODU2OTg5MTIxOTFFLTI3NgorKzc0ODcyNTI3MjA5ODY4MjZFLTE2NQorLTM3NDM2MjYzNjA0OTM0MTNFLTE2NQorKzM3NzMwNTc0MzAxMDAyNTdFMjMwCistNzU0NjExNDg2MDIwMDUxNEUyMzAKKys0MzIxMjIyODkyNDYzODIyRTU4CistNzc5MzU2MDIxNzEzOTY1M0U1MQorKzI2NTI1OTkzOTQxMDEwNjgxRTExMgorLTUzMDUxOTg3ODgyMDIxMzYyRTExMgorKzcyODQ0ODcxNDE0MjQ3OTA3RTc3CistODg4MzkzNTk1OTY3NjMyNjFFMTA1CisrMTg3MTgxMzE4MDI0NjcwNjVFLTE2NgorLTE0OTc0NTA1NDQxOTczNjUyRS0xNjUKKys3MzQyOTM5NjAwNDY0MDIzOUUxMDYKKy01ODQ4MzkyMTA3ODM5ODI4M0U1NworKzQxMzkxNTE5MTkwNjQ1MjAzRTE2NQorLTgyNzgzMDM4MzgxMjkwNDA2RTE2NQorKzU4NzY3MDQzNzc2NzAyNjc3RS0xNjMKKy05MDUwNjIzMTgzMTIzMTk5OUUtMTI5CisrNjQ0MDkyNDA3Njk4NjE2ODlFLTE1OQorLTc3MzA1NDI3NDMyMjc3NzcxRS0xOTAKKys0NzY1OTIzNTY2MTkyNTgzMjZFMjczCistOTUzMTg0NzEzMjM4NTE2NjUyRTI3MworKzg5OTgxMDg5MjE3MjY0NjE2M0UyODMKKy05MjkxNjcwNzY4OTIwMTgzMzNFMTg3CisrNjQ3NzYxMjc4OTY3NTM0MjM5RS0zMTIKKy02NDQyOTA0Nzk4MjA1NDI5NDJFLTE4MAorKzkyNjE0NTM0NDYxMDcwMDAxOUUtMjI1CistOTU4NTA3OTMxODk2NTExOTY0RS0yNDYKKysyNzIxMDQwNDE1MTIyNDI0NzlFMjAwCistNzkyNjQ0OTI3ODUyMzc4MTU5RTc5CisrNTQ0MjA4MDgzMDI0NDg0OTU4RTIwMAorLTkyOTk2MzIxODYxNjEyNjM2NUUyOTAKKyszMDU1NzQzMzkxNjY4MTAxMDJFLTIxOQorLTE1Mjc4NzE2OTU4MzQwNTA1MUUtMjE5CisrNjExMTQ4Njc4MzMzNjIwMjA0RS0yMTkKKy03NjM5MzU4NDc5MTcwMjUyNTVFLTIyMAorKzc0Mzk1NTAyMjA5MjA3OTg2MTJFMTU4CistMzcxOTc3NTExMDQ2MDM5OTMwNkUxNTgKKys5Mjk5NDM3Nzc2MTUwOTk4MjY1RTE1NworLTcxMjAxOTA1MTc2MTI5NTk3MDNFMTIwCisrMzUwNzY2NTA4NTAwMzI5NjI4MUUtNzMKKy03MDE1MzMwMTcwMDA2NTkyNTYyRS03MworLTY2ODQ0Mjg3NjIyNzgyNTU5NTZFLTI5NAorLTEwODg0MTYxNjYwNDg5Njk5MTZFMjAwCistODcwNzMyOTMyODM5MTc1OTMyOEUyMDAKKys0NDM5MDIxNzgxNjA4NTU4MDAyRS02NQorLTg4NzgwNDM1NjMyMTcxMTYwMDRFLTY1CisrMjIxOTUxMDg5MDgwNDI3OTAwMUUtNjUKKyszMzA1MTIyMzk1MTkwNDk1NTgwMkU1NQorLTU2OTYxNTI0MTQwOTAzNjc3NjI0RTEyMAorKzcxMjAxOTA1MTc2MTI5NTk3MDMwRTExOQorKzE0MDMwNjYwMzQwMDEzMTg1MTI0RS03MworLTE3NTM4MzI1NDI1MDE2NDgxNDA1RS03NAorKzY3NTM2MjI4NjA5MTQxNTY5MTA5RS0xMzMKKy0zNTYyMDQ5Nzg0OTQ1MDIxODgwN0UtMzA2CisrNjY1NTAzNzY3OTc1ODI1MjE3NTFFLTEyNgorLTcxMjQwOTk1Njk4OTAwNDM3NjE0RS0zMDYKKyszRTI0CistNkUyNAorKzZFMjYKKy03RTI1CisrMUUtMTQKKy0yRS0xNAorKzRFLTE0CistOEUtMTQKKys1RTI2CistOEUyNworKzFFMjcKKy00RTI3CisrOUUtMTMKKy03RS0yMAorKzU2RTI1CistNzBFMjQKKys1MUUyNgorKzcxRS0xNworLTMxRS01CisrNjJFLTUKKy05NEUtOAorKzY3RTI3CistODFFMjQKKys1NEUyMworLTU0RTI1CisrNjNFLTIyCistNjNFLTIzCisrNDNFLTQKKy04NkUtNAorKzk0MkUyNgorLTQ3MUUyNQorKzgwM0UyNAorLTQ3MUUyNgorLTQwOUUtMjEKKys4MThFLTIxCistODY3RS04CisrNTM4RTI3CistODU3RTI0CisrMjY5RTI3CistNDAzRTI2CisrOTU5RS03CistOTU5RS02CisrMzczRS0yNworLTc0NkUtMjcKKys0MDY5RTI0CistNDA2OUUyMworLTgxMzhFMjQKKys4Mjk0RS0xNQorLTQxNDdFLTE0CisrNDE0N0UtMTUKKy04Mjk0RS0xNAorKzUzOEUyNworLTI2OTBFMjYKKysyNjlFMjcKKy0yMTUyRTI3CisrMTcyMUUtMTcKKy03OTc5RS0yNworKzY4ODRFLTE3CistODYwNUUtMTgKKys4Mjg1NEUyNworLTU1Njg0RTI0CisrMjc4NDJFMjQKKy00ODk1OUUyNQorKzgxOTIxRS0xNworLTc2MjA3RS04CisrNDE0N0UtMTUKKy00MTQ3MEUtMTYKKys4OTMwOUUyNAorKzc1ODU5RTI2CistNzU4NTlFMjUKKysxNDI1N0UtMjMKKy0yODUxNEUtMjMKKys1NzAyOEUtMjMKKy03MTI4NUUtMjQKKyszNDQ4NjNFMjcKKy05NTE3MzVFMjcKKysyMDA2NzdFMjMKKy00MDEzNTRFMjQKKys4Mzk2MDRFLTExCistMjA5OTAxRS0xMQorKzQxOTgwMkUtMTEKKy01Mzc3MzRFLTI0CisrOTEwMzA4RTI2CistMjI3NTc3RTI2CisrNDU1MTU0RTI2CistNTMxMDEzRTI1CisrOTYzMDE5RS0yMQorLTUxOTgyN0UtMTMKKys2MjM0MDJFLTI3CistMzExNzAxRS0yNworKzk2MTM2NTFFMjYKKy05MTkxMzE2RTIzCisrNDU5NTY1OEUyMworLTIyOTc4MjlFMjMKKy0xNjc5MjA4RS0xMQorKzMzNzkyMjNFMjcKKy02NzU4NDQ2RTI3CisrNTQ0NDA5N0UtMjEKKy04Mzk5OTY5RS0yNworKzgzNjY0ODdFLTE2CistODM2NjQ4N0UtMTUKKys2NTA2MDY3MUUyNQorKzY1MjEyMzg5RTIzCisrNTU1NDQ5NTdFLTEzCistNTEwNDA5MDVFLTIwCisrOTk1ODU3NjdFLTIyCistOTk1ODU3NjdFLTIzCisrNDA5NzgzOTNFMjYKKy02NzQ4ODE1OUUyNAorKzY5MDA1MzM5RTIzCistODE5NTY3ODZFMjYKKy04NzEwNTU1MkUtMjEKKysxMDg4ODE5NEUtMjEKKy0yMTc3NjM4OEUtMjEKKys2MzU4MDY2NjdFMjcKKy02NzAwMjY2MTRFMjUKKyszMzUwMTMzMDdFMjYKKy0zMzUwMTMzMDdFMjUKKyszNzE3OTA2MTdFLTI0CistMzcxNzkwNjE3RS0yNQorKzc0MzU4MTIzNEUtMjQKKy03NDM1ODEyMzRFLTI1CisrMjAyNDY0NDc3RTI0CistNDA0OTI4OTU0RTI0CisrOTk3ODUzNzU4RTI3CistOTk3ODUzNzU4RTI2CisrNDA1NDk4NDE4RS0xNworLTU4MjU3OTA4NEUtMTQKKys2MDgyNDc2MjdFLTE4CistMjkxMjg5NTQyRS0xNAorLTk1MzcxMDAwMDVFMjYKKys2MzU4MDY2NjcwRTI3CistMTI3MTYxMzMzNEUyNworKzUyMjk2NDY5OTlFLTE2CisrNTIyOTY0Njk5OUUtMTcKKys0NDI5OTQzNjE0RTI0CistODg1OTg4NzIyOEUyNAorKzIyMTQ5NzE4MDdFMjQKKy00MTc2ODg3MDkzRTI2CisrNDAwMzQ5NTI1N0UtMjAKKy00MzYxOTAxNjM3RS0yMworKzg3MjM4MDMyNzRFLTIzCistODAwNjk5MDUxNEUtMjAKKys3MjgzNTExMDA5OEUyNworLTM2NDE3NTU1MDQ5RTI3CisrODQyNzk2MzAxMDRFMjUKKy04NDI3OTYzMDEwNEUyNAorKzIxMjA2MTc2NDM3RS0yNworLTY2NDYxNTY2OTE3RS0yMgorKzY0ODA4MzU1NTM5RS0xNgorLTg0OTMyNjc5NjczRS0xOQorKzY1MjA1NDMwMDk0RTI2CistNjgzODQ0NjM0MjlFMjUKKyszMjYwMjcxNTA0N0UyNgorLTYyNjYyMjAzNDI2RTI3CisrNTg3ODQ0NDQ2NzhFLTE4CistNTA5ODAyMDMzNzNFLTIxCisrMjkzOTIyMjIzMzlFLTE4CistNzU1Mjk5NDAzMjNFLTI3CistOTM3NDk1OTA2Mjk5RTI2CisrODQyNjQyNDg1Nzk5RS0yMAorLTM4NzgyNDE1MDY5OUUtMjMKKys5MjQ5NDg4MTQ3MjZFLTI3CistNzc1NjQ4MzAxMzk4RS0yMworKzU0NzA3NTcwNzQzMkUyNQorKzY4Mzg0NDYzNDI5MEUyNAorLTEzNjc2ODkyNjg1OEUyNQorKzUwOTgwMjAzMzczMEUtMjIKKysxMDE5NjA0MDY3NDZFLTIxCistODE1NjgzMjUzOTY4RS0yMQorKzczNDQxMjQxMjM1MjRFMjQKKy05MTgwMTU1MTU0NDA1RTIzCisrNjQ3OTQ2MzMyNzMyM0UyNworLTE4MzYwMzEwMzA4ODFFMjQKKys0MzM3MjY5MjkzMDM5RS0xOQorLTQ1OTkxNjM1NTQzNzNFLTIzCisrOTE5ODMyNzEwODc0NkUtMjMKKys0ODEyODAzOTM4MzQ3RTI3CistODQxMjAzMDg5MDAxMUUyMworKzk2MjU2MDc4NzY2OTRFMjcKKy00NzM5OTY4ODI4MjQ5RTI0CisrOTY5NzE4Mzg5MTY3M0UtMjMKKy03MzY4MTA4NTE3NTQzRS0yMAorKzUxNDYxMzU4MTYxNDIyRTI1CistNzcxOTIwMzcyNDIxMzNFMjYKKys3NzE5MjAzNzI0MjEzM0UyNQorLTUxNDYxMzU4MTYxNDIyRTI3CisrNDM5OTk2NjE1NjE1NDFFLTIxCistODc5OTkzMjMxMjMwODJFLTIxCisrNDgzNzQ4ODY4MjYxMzdFLTI2CistNTc2ODQyNDY1NjcxMTFFLTIzCisrODcxOTI4MDU5NTc2ODZFMjMKKy03NTEwODcxMzAwNTkxM0UyNAorKzY0MjMzMTEwNTg3NDg3RTI3CistNzc1Nzc0NzExMzMzODRFLTIzCisrNDg0ODU5MTk0NTgzNjVFLTI0CistNTY5MDg1OTgyNjU3MTNFLTI2CisrNTg5NzIyMjk0NjIwMTMzRTIzCisrNjUyODM1ODA0NDQ5Mjg5RS0yMgorLTY1NjQxNTM2MzkzNjIwMkUtMjMKKys1NzkzMzY3NDk1ODU3NDVFLTI1CistMzgxMjkyNzY0OTgwODM5RS0yNgorKzk2NTI2NTg1OTY0OTY5OEUyMworLTg0ODkyNTIzNTQzNDg4MkUyNworKzUzNjE3NzYxMjIyMjQ5MUUyMworLTQyNDQ2MjYxNzcxNzQ0MUUyNworKzI3NjAwOTI3OTg4ODk4OUUtMjcKKy02MDg5MjcxNTgwNDM2OTFFLTI2CisrNTUyMDE4NTU5Nzc3OTc4RS0yNworLTQyNTY3ODM3NzY2Nzc1OEUtMjIKKys4MDEzNzAyNzI2OTI3MTE5RTI2CisrODg2MjYyNzk2MjM2MjAwMUUyNworLTUwNjgwMDc5MDc3NTcxNjJFMjYKKy03Mzc5NzE0Nzk5ODI4NDA2RS0yMworKzQxMTQ1MzgwNjQwMTYxMDdFLTI3CistMzY4OTg1NzM5OTkxNDIwM0UtMjMKKys1NTc1OTU0ODUxODE1NDc4RTIzCisrMzM5NTcwMDk0MTczOTUyOEUyNworKzQxMTU1MzU3Nzc1ODE5NjFFLTIzCistODIzMTA3MTU1NTE2MzkyMkUtMjMKKys2NTUwMjQ2Njk2MTkwODcxRS0yNgorLTY4MDgzMDQ2NDAzOTg2NzAxRTI3CisrNDM1NjYzODg1OTU3ODM2NDNFMjcKKy04NzEzMjc3NzE5MTU2NzI4NkUyNworKzU5NjQ0ODgxMDU5MzQyMTQxRTI1CistODM4NTI3NzA3MTg1NzY2NjdFMjMKKys5OTQ4Mjk2NzQxODIwNjk2MUUtMjUKKy05OTQ4Mjk2NzQxODIwNjk2MUUtMjYKKys4NzQ0NjY2OTk2OTk5NDYxNEUtMjcKKy00MzcyMzMzNDk4NDk5NzMwN0UtMjcKKys1RTI0CistOEUyNQorKzFFMjUKKy00RTI1CisrMkUtNQorLTVFLTYKKys0RS01CistM0UtMjAKKyszRTI3CistOUUyNgorKzdFMjUKKy02RTI3CisrMkUtMjEKKy01RS0yMgorLTRFLTIxCisrODdFMjUKKy05N0UyNAorKzgyRS0yNAorLTQxRS0yNAorKzc2RS0yMworKzgzRTI1CistNTBFMjcKKysyNUUyNworLTk5RTI3CisrOTdFLTEwCistNTdFLTIwCisrOTk3RTIzCisrNzc2RTI0CistMzg4RTI0CisrNTIxRS0xMAorLTUwNkUtMjYKKys3MzlFLTEwCistODY3RS03CistNDE1RTI0CisrMzMyRTI1CistNjY0RTI1CisrMjkxRS0xMworLTk4MkUtOAorKzU4MkUtMTMKKy00OTFFLTgKKys0NTc0RTI2CistODYwOUUyNgorKzIyODdFMjYKKy00ODE4RTI0CisrNjUyOUUtOAorLTgxNTFFLTIxCisrMTU1N0UtMTIKKy0yNTczRS0xOAorKzQ5MjlFLTE2CistMzA1M0UtMjIKKys5ODU4RS0xNgorLTc3NjdFLTExCisrNTQzMzlFMjYKKy02MjQwOUUyNQorKzMyODE5RTI3CistODk4NDlFMjcKKys2Mzg3NkUtMjAKKy0xNTk2OUUtMjAKKyszMTkzOEUtMjAKKy03OTg0NUUtMjEKKys4OTMwNkUyNworLTI1NDg3RTI0CisrNzk4ODlFMjQKKy05NzM3OUUyNgorKzgxMDAyRS04CistNDMxNDlFLTI1CisrNDA1MDFFLTgKKy02MDMxOEUtMTAKKy02NDgyOTlFMjcKKys3ODA2NDlFMjQKKys3MjA5MTlFLTE0CistNjI5NzAzRS0xMQorKzU1NzkxM0UyNAorLTg0Nzg5OUUyMworKzU2NTQ0NUUyNworLTczNjUzMUUyNAorKzY4MDAxM0UtMTkKKy01Mjk5ODFFLTEwCisrMzgyOTIzRS0yMworLTYzMzYxNEUtMTgKKysyMTY1NDc5RTI3CistODY2MTkxNkUyNworKzQzMzA5NThFMjcKKy05MzkxOTkzRTIyCistNTc2NzM1MkUtMTQKKys3MjA5MTkwRS0xNQorLTE0NDE4MzhFLTE0CisrODQ3ODk5MEUyMgorKzE0NzMwNjJFMjQKKys4MzY2NDg3RS0xNAorLTgzOTk5NjlFLTI1CisrOTM2NjczN0UtMTIKKy05NDA2MTQxRS0xMworKzY1OTcwOTc5RTI0CistNjUwNjA2NzFFMjYKKys1NDkyMzAwMkUyNworLTYzODQ2OTI3RTI1CisrOTk1ODU3NjdFLTIxCisrNjc0ODgxNTlFMjUKKy02OTAwNTMzOUUyNAorKzgxOTU2Nzg2RTI3CistNDA5NzgzOTNFMjcKKys3NzUwNTc1NEUtMTIKKy0zODc1Mjg3N0UtMTIKKys4Mjc3Mjk4MUUtMTUKKy05NTU5MzUxN0UtMjUKKysyMDAwMzY5ODlFMjUKKy03NzI2ODY0NTVFMjcKKys4NTkxMzk5MDdFMjMKKy00MDAwNzM5NzhFMjUKKys1NjkwMTQzMjdFLTE0CistNzk0MjYzODYyRS0xNQorKzM5NzEzMTkzMUUtMTUKKy0zODAzOTg5NTdFLTE2CisrNTY3MzY2NzczRTI3CistMzM3NDQwNzk1RTI0CisrMTM0OTc2MzE4RTI1CistMjY5OTUyNjM2RTI1CisrOTMyMDgwNTk3RS0yMAorLTMzMTA5MTkyNEUtMTUKKy00MTM4NjQ5MDVFLTE2CisrODUzOTI0NjI0N0UyNgorLTU4NTkxMzk3OTFFMjYKKys2MTA1MDEwMTQ5RTI0CistMzA5MDc0NTgyMEUyNworKzM0NzA4Nzc3NzNFLTIwCistNjEzNjMwOTA4OUUtMjcKKys4OTE3NzU4NzEzRS0xOQorLTY5NDE3NTU1NDZFLTIwCisrOTE5NDkwMDUzNUUyNQorLTE4Mzg5ODAxMDdFMjYKKys3MzU1OTIwNDI4RTI2CistMzY3Nzk2MDIxNEUyNgorKzg0NzM2MzQzNDNFLTE3CistODg3MDc2NjI3NEUtMTYKKys0NDM1MzgzMTM3RS0xNgorLTk1OTg5OTAxMjlFLTE1CisrNzE1NjM0OTY3NjRFMjYKKy04OTQ1NDM3MDk1NUUyNQorKzE3ODkwODc0MTkxRTI2CistMzU3ODE3NDgzODJFMjYKKys1Nzk3MzQ0Nzg0MkUtMTkKKy0yODk4NjcyMzkyMUUtMTkKKys3NjgyMjcxMTMxM0UtMTkKKy05NzY5OTQ2Njg3NEUtMjAKKys2Nzc0ODY1Njc2MkUyNworLTE5Mzk0ODQwOTkxRTI0CisrMzg3ODk2ODE5ODJFMjQKKy0zMzg3NDMyODM4MUUyNworKzU0MzIzNzYzODg2RS0yNworLTU4OTg3MTkzODg3RS0yMAorKzI3MTYxODgxOTQzRS0yNworLTkzMDQyNjQ4MDMzRS0xOQorKzUyMDgzMTA1OTA1NUUyNworLTc2ODEyNDI2NDM5NEUyNQorKzM4NDA2MjEzMjE5N0UyNQorKzc2NTMzNzc0OTg4OUUtMjUKKys3OTQzNjg5MTI3NzFFMjUKKy05OTQxNjIwOTAxNDZFMjMKKys3ODE2NTI3Nzk0MzFFMjYKKys5MTAwNzcxOTAwNDZFLTI2CistNDU1MDM4NTk1MDIzRS0yNgorKzQ3MTg5NzU1MTA5NkUtMjAKKy05MDY2OTg0MDk5MTFFLTIxCisrODg1NDEyODAwMzkzNUUyNQorLTgxNDYxMjI3MTYyOTlFMjcKKys3MDgzMzAyNDAzMTQ4RTI2CistMzU0MTY1MTIwMTU3NEUyNgorKzgzOTQ5MjA2NDkyOTFFLTI1CistNzY1Nzk3NTc1Njc1M0UtMjIKKys1NDczODM0MDAyMjI4RS0yMAorLTY4NDIyOTI1MDI3ODVFLTIxCistMjEwOTU2ODg4NDU5N0UyNQorKzg0MzgyNzU1MzgzODhFMjUKKy00MjE5MTM3NzY5MTk0RTI1CisrMzIwMDE0MTc4OTg0MUUtMjUKKy04NjU1Njg5MzIyNjA3RS0yMgorKzY0MDAyODM1Nzk2ODJFLTI1CistODgzNzcxOTYzNDQ5M0UtMjEKKysxOTQyODIxNzA3NTI5N0UyNAorLTM4ODU2NDM0MTUwNTk0RTI0CisrNzc3MTI4NjgzMDExODhFMjQKKy03NzE5MjAzNzI0MjEzM0UyNworKzc2NTc5NzU3NTY3NTMwRS0yMworKzE1MzE1OTUxNTEzNTA2RS0yMgorLTM4Mjg5ODc4NzgzNzY1RS0yMworKzQ5Mzc4MDMzOTI1MjAyRTI1CistNTA5NDA1MjcxMDIzNjdFMjQKKys5ODc1NjA2Nzg1MDQwNEUyNQorLTk5NTg5Mzk3NTQ0ODkyRTI2CistNTY5MDg1OTgyNjU3MTNFLTI1CisrOTc0NzA2OTU2OTk2NTdFLTIyCistMzU4NTE5MDEyNDczNDNFLTI1CisrMTU0Mzg0MDc0NDg0MjY2RTI3CistMzA4NzY4MTQ4OTY4NTMyRTI3CisrOTEwOTkwMzg5MDA1OTg1RTIzCisrMjcxNzQyNDI0MTY5MjAxRS0yNworLTU0MzQ4NDg0ODMzODQwMkUtMjcKKysxNjIxOTIwODMzNTc1NjNFLTI2CistODY5MjU0NTUyNzcwMDgxRS0yMworKzY2NDgzMTAwNzYyNjA0NkUyNAorLTMzMjQxNTUwMzgxMzAyM0UyNAorKzk0MzcwMTgyOTA0MTQyN0UyNAorLTEwMTg4MTA1NDIwNDczNEUyNAorKzgyODAyNzgzOTY2Njk2N0UtMjcKKy0yODAyNzYxMzU2MDg3NzdFLTI3CisrMjEyODM5MTg4ODMzODc5RS0yMQorLTExMzgxNzE5NjUzMTQyNkUtMjUKKys5NzExNTUzMTk3Nzk2ODgzRTI3CistMjczOTg0OTM4NjUyNDI2OUUyNgorKzU0Nzk2OTg3NzMwNDg1MzhFMjYKKys2MTI0NTY4MzE4NTIzMTEzRS0yNQorLTExMzk3Nzc5ODgxNzEwNzFFLTI0CisrNjMyMjYxMjMwMzEyODAxOUUtMjcKKy0yOTU1ODY0NTY0ODQ0NjE3RS0yNQorLTk5OTQwMjkxNDQ5OTg5NjFFMjUKKy0yOTcxMjM4MzI0MDIyMDg3RTI3CistMTY1NjA1NTY3OTMzMzkzNEUtMjcKKy0xNDQ1NDg4NzA5MTUwMjM0RS0yNgorKzU1ODI0NzE3NDk5ODg1MTcyRTI3CistNjk3ODA4OTY4NzQ4NTY0NjVFMjYKKys4NDE2MTUzODg2NzU0NTE5OUUyNQorLTI3OTEyMzU4NzQ5OTQyNTg2RTI3CisrMjQ3MTExMTI0NjI5MjYzMzFFLTI1CistMTI2NDUyMjQ2MDYyNTYwMzhFLTI3CistMTIyNDkxMzY2MzcwNDYyMjZFLTI1CisrNzQ4NzQ0NDgyODc0NjU3NTdFMjcKKy0zNTY0MjgzNjgzMjc1MzMwM0UyNAorLTcxMjg1NjczNjY1NTA2NjA2RTI0CisrNDM3MjMzMzQ5ODQ5OTczMDdFLTI2CisrMTAxODI0MTk4NDk1Mzc5NjNFLTI0CistOTM1MDE3MDM1NzI2NjE5ODJFLTI2CisKKyMgQSB2YWx1ZSB0aGF0IGNhdXNlZCBhIGNyYXNoIGluIGRlYnVnIGJ1aWxkcyBmb3IgUHl0aG9uID49IDIuNywgMy4xCisjIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNzYzMgorMjE4MzE2NzAxMjMxMjExMjMxMjMxMi4yMzUzODAyMDM3NDQyMDQ0NjE5MmUtMzcwCisKKyMgQW5vdGhlciB2YWx1ZSBkZXNpZ25lZCB0byB0ZXN0IGEgY29ybmVyIGNhc2Ugb2YgUHl0aG9uJ3Mgc3RydG9kIGNvZGUuCiswLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ZSsyMwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Zvcmtfd2FpdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC9mb3JrX3dhaXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0NmNiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9mb3JrX3dhaXQucHkKQEAgLTAsMCArMSw3OSBAQAorIiIiVGhpcyB0ZXN0IGNhc2UgcHJvdmlkZXMgc3VwcG9ydCBmb3IgY2hlY2tpbmcgZm9ya2luZyBhbmQgd2FpdCBiZWhhdmlvci4KKworVG8gdGVzdCBkaWZmZXJlbnQgd2FpdCBiZWhhdmlvciwgb3ZlcnJpZGUgdGhlIHdhaXRfaW1wbCBtZXRob2QuCisKK1dlIHdhbnQgZm9yazEoKSBzZW1hbnRpY3MgLS0gb25seSB0aGUgZm9ya2luZyB0aHJlYWQgc3Vydml2ZXMgaW4gdGhlCitjaGlsZCBhZnRlciBhIGZvcmsoKS4KKworT24gc29tZSBzeXN0ZW1zIChlLmcuIFNvbGFyaXMgd2l0aG91dCBwb3NpeCB0aHJlYWRzKSB3ZSBmaW5kIHRoYXQgYWxsCithY3RpdmUgdGhyZWFkcyBzdXJ2aXZlIGluIHRoZSBjaGlsZCBhZnRlciBhIGZvcmsoKTsgdGhpcyBpcyBhbiBlcnJvci4KKworV2hpbGUgQmVPUyBkb2Vzbid0IG9mZmljaWFsbHkgc3VwcG9ydCBmb3JrIGFuZCBuYXRpdmUgdGhyZWFkaW5nIGluCit0aGUgc2FtZSBhcHBsaWNhdGlvbiwgdGhlIHByZXNlbnQgZXhhbXBsZSBzaG91bGQgd29yayBqdXN0IGZpbmUuICBEQworIiIiCisKK2ltcG9ydCBvcywgc3lzLCB0aW1lLCB1bml0dGVzdAoraW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0IGFzIHRlc3Rfc3VwcG9ydAordGhyZWFkID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RocmVhZCcpCisKK0xPTkdTTEVFUCA9IDIKK1NIT1JUU0xFRVAgPSAwLjUKK05VTV9USFJFQURTID0gNAorCitjbGFzcyBGb3JrV2FpdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuYWxpdmUgPSB7fQorICAgICAgICBzZWxmLnN0b3AgPSAwCisKKyAgICBkZWYgZihzZWxmLCBpZCk6CisgICAgICAgIHdoaWxlIG5vdCBzZWxmLnN0b3A6CisgICAgICAgICAgICBzZWxmLmFsaXZlW2lkXSA9IG9zLmdldHBpZCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGltZS5zbGVlcChTSE9SVFNMRUVQKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHdhaXRfaW1wbChzZWxmLCBjcGlkKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgIyB3YWl0cGlkKCkgc2hvdWxkbid0IGhhbmcsIGJ1dCBzb21lIG9mIHRoZSBidWlsZGJvdHMgc2VlbSB0byBoYW5nCisgICAgICAgICAgICAjIGluIHRoZSBmb3JraW5nIHRlc3RzLiAgVGhpcyBpcyBhbiBhdHRlbXB0IHRvIGZpeCB0aGUgcHJvYmxlbS4KKyAgICAgICAgICAgIHNwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoY3BpZCwgb3MuV05PSEFORykKKyAgICAgICAgICAgIGlmIHNwaWQgPT0gY3BpZDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGltZS5zbGVlcCgyICogU0hPUlRTTEVFUCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwaWQsIGNwaWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKKworICAgIGRlZiB0ZXN0X3dhaXQoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKE5VTV9USFJFQURTKToKKyAgICAgICAgICAgIHRocmVhZC5zdGFydF9uZXcoc2VsZi5mLCAoaSwpKQorCisgICAgICAgIHRpbWUuc2xlZXAoTE9OR1NMRUVQKQorCisgICAgICAgIGEgPSBzZWxmLmFsaXZlLmtleXMoKQorICAgICAgICBhLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHJhbmdlKE5VTV9USFJFQURTKSkKKworICAgICAgICBwcmVmb3JrX2xpdmVzID0gc2VsZi5hbGl2ZS5jb3B5KCkKKworICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gWyd1bml4d2FyZTcnXToKKyAgICAgICAgICAgIGNwaWQgPSBvcy5mb3JrMSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjcGlkID0gb3MuZm9yaygpCisKKyAgICAgICAgaWYgY3BpZCA9PSAwOgorICAgICAgICAgICAgIyBDaGlsZAorICAgICAgICAgICAgdGltZS5zbGVlcChMT05HU0xFRVApCisgICAgICAgICAgICBuID0gMAorICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLmFsaXZlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuYWxpdmVba2V5XSAhPSBwcmVmb3JrX2xpdmVzW2tleV06CisgICAgICAgICAgICAgICAgICAgIG4gKz0gMQorICAgICAgICAgICAgb3MuX2V4aXQobikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgUGFyZW50CisgICAgICAgICAgICBzZWxmLndhaXRfaW1wbChjcGlkKQorICAgICAgICAgICAgIyBUZWxsIHRocmVhZHMgdG8gZGllCisgICAgICAgICAgICBzZWxmLnN0b3AgPSAxCisgICAgICAgICAgICB0aW1lLnNsZWVwKDIqU0hPUlRTTEVFUCkgIyBXYWl0IGZvciB0aHJlYWRzIHRvIGRpZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Zvcmtfd2FpdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvZm9ya193YWl0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2M2MDUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Zvcmtfd2FpdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Zvcmtfd2FpdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvZm9ya193YWl0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2M2MDUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Zvcmtfd2FpdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Zvcm1hdGZsb2F0X3Rlc3RjYXNlcy50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvZm9ybWF0ZmxvYXRfdGVzdGNhc2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2VmMDQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Zvcm1hdGZsb2F0X3Rlc3RjYXNlcy50eHQKQEAgLTAsMCArMSwzODAgQEAKKy0tICdmJyBjb2RlIGZvcm1hdHRpbmcsIHdpdGggZXhwbGljaXQgcHJlY2lzaW9uICg+PSAwKS4gIE91dHB1dCBhbHdheXMKKy0tIGhhcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHBsYWNlcyBhZnRlciB0aGUgcG9pbnQ7ICB6ZXJvcyBhcmUgYWRkZWQgaWYKKy0tIG5lY2Vzc2FyeSB0byBtYWtlIHRoaXMgdHJ1ZS4KKworLS0gemVyb3MKKyUuMGYgMCAtPiAwCislLjFmIDAgLT4gMC4wCislLjJmIDAgLT4gMC4wMAorJS4zZiAwIC0+IDAuMDAwCislLjUwZiAwIC0+IDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworLS0gcHJlY2lzaW9uIDA7ICByZXN1bHQgc2hvdWxkIG5ldmVyIGluY2x1ZGUgYSAuCislLjBmIDEuNSAtPiAyCislLjBmIDIuNSAtPiAyCislLjBmIDMuNSAtPiA0CislLjBmIDAuMCAtPiAwCislLjBmIDAuMSAtPiAwCislLjBmIDAuMDAxIC0+IDAKKyUuMGYgMTAuMCAtPiAxMAorJS4wZiAxMC4xIC0+IDEwCislLjBmIDEwLjAxIC0+IDEwCislLjBmIDEyMy40NTYgLT4gMTIzCislLjBmIDEyMzQuNTYgLT4gMTIzNQorJS4wZiAxZTQ5IC0+IDk5OTk5OTk5OTk5OTk5OTk0NjQ5MDI3Njk0NzU0ODE3OTMxOTY4NzI0MTQ3ODk2MzIKKyUuMGYgOS45OTk5OTk5OTk5OTk5OTg3ZSs0OSAtPiA5OTk5OTk5OTk5OTk5OTk4Njg2MDU4MjQwNjk1MjU3NjQ4OTE3Mjk3OTY1NDA2NjE3NgorJS4wZiAxZTUwIC0+IDEwMDAwMDAwMDAwMDAwMDAwNzYyOTc2OTg0MTA5MTg4NzAwMzI5NDk2NDk3MDk0NjU2MAorCistLSBwcmVjaXNpb24gMQorJS4xZiAwLjAwMDEgLT4gMC4wCislLjFmIDAuMDAxIC0+IDAuMAorJS4xZiAwLjAxIC0+IDAuMAorJS4xZiAwLjA0IC0+IDAuMAorJS4xZiAwLjA2IC0+IDAuMQorJS4xZiAwLjI1IC0+IDAuMgorJS4xZiAwLjc1IC0+IDAuOAorJS4xZiAxLjQgLT4gMS40CislLjFmIDEuNSAtPiAxLjUKKyUuMWYgMTAuMCAtPiAxMC4wCislLjFmIDEwMDAuMDMgLT4gMTAwMC4wCislLjFmIDEyMzQuNTY3OCAtPiAxMjM0LjYKKyUuMWYgMTIzNC43NDk5IC0+IDEyMzQuNworJS4xZiAxMjM0Ljc1IC0+IDEyMzQuOAorCistLSBwcmVjaXNpb24gMgorJS4yZiAwLjAwMDEgLT4gMC4wMAorJS4yZiAwLjAwMSAtPiAwLjAwCislLjJmIDAuMDA0OTk5IC0+IDAuMDAKKyUuMmYgMC4wMDUwMDEgLT4gMC4wMQorJS4yZiAwLjAxIC0+IDAuMDEKKyUuMmYgMC4xMjUgLT4gMC4xMgorJS4yZiAwLjM3NSAtPiAwLjM4CislLjJmIDEyMzQ1MDAgLT4gMTIzNDUwMC4wMAorJS4yZiAxMjM0NTYwIC0+IDEyMzQ1NjAuMDAKKyUuMmYgMTIzNDU2NyAtPiAxMjM0NTY3LjAwCislLjJmIDEyMzQ1NjcuOCAtPiAxMjM0NTY3LjgwCislLjJmIDEyMzQ1NjcuODkgLT4gMTIzNDU2Ny44OQorJS4yZiAxMjM0NTY3Ljg5MSAtPiAxMjM0NTY3Ljg5CislLjJmIDEyMzQ1NjcuODkxMiAtPiAxMjM0NTY3Ljg5CisKKy0tIGFsdGVybmF0ZSBmb3JtIGFsd2F5cyBpbmNsdWRlcyBhIGRlY2ltYWwgcG9pbnQuICBUaGlzIG9ubHkKKy0tIG1ha2VzIGEgZGlmZmVyZW5jZSB3aGVuIHRoZSBwcmVjaXNpb24gaXMgMC4KKyUjLjBmIDAgLT4gMC4KKyUjLjFmIDAgLT4gMC4wCislIy4wZiAxLjUgLT4gMi4KKyUjLjBmIDIuNSAtPiAyLgorJSMuMGYgMTAuMSAtPiAxMC4KKyUjLjBmIDEyMzQuNTYgLT4gMTIzNS4KKyUjLjFmIDEuNCAtPiAxLjQKKyUjLjJmIDAuMzc1IC0+IDAuMzgKKworLS0gaWYgcHJlY2lzaW9uIGlzIG9taXR0ZWQgaXQgZGVmYXVsdHMgdG8gNgorJWYgMCAtPiAwLjAwMDAwMAorJWYgMTIzMDAwMCAtPiAxMjMwMDAwLjAwMDAwMAorJWYgMTIzNDU2NyAtPiAxMjM0NTY3LjAwMDAwMAorJWYgMTIzLjQ1NjcgLT4gMTIzLjQ1NjcwMAorJWYgMS4yMzQ1Njc4OSAtPiAxLjIzNDU2OAorJWYgMC4wMDAxMiAtPiAwLjAwMDEyMAorJWYgMC4wMDAxMjMgLT4gMC4wMDAxMjMKKyVmIDAuMDAwMTIzNDUgLT4gMC4wMDAxMjMKKyVmIDAuMDAwMDAxIC0+IDAuMDAwMDAxCislZiAwLjAwMDAwMDUwMDEgLT4gMC4wMDAwMDEKKyVmIDAuMDAwMDAwNDk5OSAtPiAwLjAwMDAwMAorCistLSBuYW5zIGFuZCBpbmZpbml0aWVzCislZiBuYW4gLT4gbmFuCislZiBpbmYgLT4gaW5mCislZiAtaW5maW5pdHkgLT4gLWluZgorJUYgbmFuIC0+IE5BTgorJUYgaW5maW5pdHkgLT4gSU5GCislRiAtaW5mIC0+IC1JTkYKKworLS0gJ2UnIGNvZGUgZm9ybWF0dGluZyB3aXRoIGV4cGxpY2l0IHByZWNpc2lvbiAoPj0gMCkuIE91dHB1dCBzaG91bGQKKy0tIGFsd2F5cyBoYXZlIGV4YWN0bHkgdGhlIG51bWJlciBvZiBwbGFjZXMgYWZ0ZXIgdGhlIHBvaW50IHRoYXQgd2VyZQorLS0gcmVxdWVzdGVkLgorCistLSB6ZXJvcworJS4wZSAwIC0+IDBlKzAwCislLjFlIDAgLT4gMC4wZSswMAorJS4yZSAwIC0+IDAuMDBlKzAwCislLjEwZSAwIC0+IDAuMDAwMDAwMDAwMGUrMDAKKyUuNTBlIDAgLT4gMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGUrMDAKKworLS0gcHJlY2lzaW9uIDAuICBubyBkZWNpbWFsIHBvaW50IGluIHRoZSBvdXRwdXQKKyUuMGUgMC4wMSAtPiAxZS0wMgorJS4wZSAwLjEgLT4gMWUtMDEKKyUuMGUgMSAtPiAxZSswMAorJS4wZSAxMCAtPiAxZSswMQorJS4wZSAxMDAgLT4gMWUrMDIKKyUuMGUgMC4wMTIgLT4gMWUtMDIKKyUuMGUgMC4xMiAtPiAxZS0wMQorJS4wZSAxLjIgLT4gMWUrMDAKKyUuMGUgMTIgLT4gMWUrMDEKKyUuMGUgMTIwIC0+IDFlKzAyCislLjBlIDEyMy40NTYgLT4gMWUrMDIKKyUuMGUgMC4wMDAxMjM0NTYgLT4gMWUtMDQKKyUuMGUgMTIzNDU2MDAwIC0+IDFlKzA4CislLjBlIDAuNSAtPiA1ZS0wMQorJS4wZSAxLjQgLT4gMWUrMDAKKyUuMGUgMS41IC0+IDJlKzAwCislLjBlIDEuNiAtPiAyZSswMAorJS4wZSAyLjQ5OTk5OTkgLT4gMmUrMDAKKyUuMGUgMi41IC0+IDJlKzAwCislLjBlIDIuNTAwMDAwMSAtPiAzZSswMAorJS4wZSAzLjQ5OTk5OTk5OTk5OSAtPiAzZSswMAorJS4wZSAzLjUgLT4gNGUrMDAKKyUuMGUgNC41IC0+IDRlKzAwCislLjBlIDUuNSAtPiA2ZSswMAorJS4wZSA2LjUgLT4gNmUrMDAKKyUuMGUgNy41IC0+IDhlKzAwCislLjBlIDguNSAtPiA4ZSswMAorJS4wZSA5LjQ5OTkgLT4gOWUrMDAKKyUuMGUgOS41IC0+IDFlKzAxCislLjBlIDEwLjUgLT4gMWUrMDEKKyUuMGUgMTQuOTk5IC0+IDFlKzAxCislLjBlIDE1IC0+IDJlKzAxCisKKy0tIHByZWNpc2lvbiAxCislLjFlIDAuMDAwMSAtPiAxLjBlLTA0CislLjFlIDAuMDAxIC0+IDEuMGUtMDMKKyUuMWUgMC4wMSAtPiAxLjBlLTAyCislLjFlIDAuMSAtPiAxLjBlLTAxCislLjFlIDEgLT4gMS4wZSswMAorJS4xZSAxMCAtPiAxLjBlKzAxCislLjFlIDEwMCAtPiAxLjBlKzAyCislLjFlIDEyMCAtPiAxLjJlKzAyCislLjFlIDEyMyAtPiAxLjJlKzAyCislLjFlIDEyMy40IC0+IDEuMmUrMDIKKworLS0gcHJlY2lzaW9uIDIKKyUuMmUgMC4wMDAxMyAtPiAxLjMwZS0wNAorJS4yZSAwLjAwMDEzNSAtPiAxLjM1ZS0wNAorJS4yZSAwLjAwMDEzNTcgLT4gMS4zNmUtMDQKKyUuMmUgMC4wMDAxIC0+IDEuMDBlLTA0CislLjJlIDAuMDAxIC0+IDEuMDBlLTAzCislLjJlIDAuMDEgLT4gMS4wMGUtMDIKKyUuMmUgMC4xIC0+IDEuMDBlLTAxCislLjJlIDEgLT4gMS4wMGUrMDAKKyUuMmUgMTAgLT4gMS4wMGUrMDEKKyUuMmUgMTAwIC0+IDEuMDBlKzAyCislLjJlIDEwMDAgLT4gMS4wMGUrMDMKKyUuMmUgMTUwMCAtPiAxLjUwZSswMworJS4yZSAxNTkwIC0+IDEuNTllKzAzCislLjJlIDE1OTggLT4gMS42MGUrMDMKKyUuMmUgMTU5OC43IC0+IDEuNjBlKzAzCislLjJlIDE1OTguNzYgLT4gMS42MGUrMDMKKyUuMmUgOTk5OSAtPiAxLjAwZSswNAorCistLSBvbWl0dGVkIHByZWNpc2lvbiBkZWZhdWx0cyB0byA2CislZSAwIC0+IDAuMDAwMDAwZSswMAorJWUgMTY1IC0+IDEuNjUwMDAwZSswMgorJWUgMTIzNDU2NyAtPiAxLjIzNDU2N2UrMDYKKyVlIDEyMzQ1Njc4IC0+IDEuMjM0NTY4ZSswNworJWUgMS4xIC0+IDEuMTAwMDAwZSswMAorCistLSBhbHRlcm5hdGUgZm9ybSBhbHdheXMgY29udGFpbnMgYSBkZWNpbWFsIHBvaW50LiAgVGhpcyBvbmx5IG1ha2VzCistLSBhIGRpZmZlcmVuY2Ugd2hlbiBwcmVjaXNpb24gaXMgMC4KKworJSMuMGUgMC4wMSAtPiAxLmUtMDIKKyUjLjBlIDAuMSAtPiAxLmUtMDEKKyUjLjBlIDEgLT4gMS5lKzAwCislIy4wZSAxMCAtPiAxLmUrMDEKKyUjLjBlIDEwMCAtPiAxLmUrMDIKKyUjLjBlIDAuMDEyIC0+IDEuZS0wMgorJSMuMGUgMC4xMiAtPiAxLmUtMDEKKyUjLjBlIDEuMiAtPiAxLmUrMDAKKyUjLjBlIDEyIC0+IDEuZSswMQorJSMuMGUgMTIwIC0+IDEuZSswMgorJSMuMGUgMTIzLjQ1NiAtPiAxLmUrMDIKKyUjLjBlIDAuMDAwMTIzNDU2IC0+IDEuZS0wNAorJSMuMGUgMTIzNDU2MDAwIC0+IDEuZSswOAorJSMuMGUgMC41IC0+IDUuZS0wMQorJSMuMGUgMS40IC0+IDEuZSswMAorJSMuMGUgMS41IC0+IDIuZSswMAorJSMuMGUgMS42IC0+IDIuZSswMAorJSMuMGUgMi40OTk5OTk5IC0+IDIuZSswMAorJSMuMGUgMi41IC0+IDIuZSswMAorJSMuMGUgMi41MDAwMDAxIC0+IDMuZSswMAorJSMuMGUgMy40OTk5OTk5OTk5OTkgLT4gMy5lKzAwCislIy4wZSAzLjUgLT4gNC5lKzAwCislIy4wZSA0LjUgLT4gNC5lKzAwCislIy4wZSA1LjUgLT4gNi5lKzAwCislIy4wZSA2LjUgLT4gNi5lKzAwCislIy4wZSA3LjUgLT4gOC5lKzAwCislIy4wZSA4LjUgLT4gOC5lKzAwCislIy4wZSA5LjQ5OTkgLT4gOS5lKzAwCislIy4wZSA5LjUgLT4gMS5lKzAxCislIy4wZSAxMC41IC0+IDEuZSswMQorJSMuMGUgMTQuOTk5IC0+IDEuZSswMQorJSMuMGUgMTUgLT4gMi5lKzAxCislIy4xZSAxMjMuNCAtPiAxLjJlKzAyCislIy4yZSAwLjAwMDEzNTcgLT4gMS4zNmUtMDQKKworLS0gbmFucyBhbmQgaW5maW5pdGllcworJWUgbmFuIC0+IG5hbgorJWUgaW5mIC0+IGluZgorJWUgLWluZmluaXR5IC0+IC1pbmYKKyVFIG5hbiAtPiBOQU4KKyVFIGluZmluaXR5IC0+IElORgorJUUgLWluZiAtPiAtSU5GCisKKy0tICdnJyBjb2RlIGZvcm1hdHRpbmcuCisKKy0tIHplcm9zCislLjBnIDAgLT4gMAorJS4xZyAwIC0+IDAKKyUuMmcgMCAtPiAwCislLjNnIDAgLT4gMAorJS40ZyAwIC0+IDAKKyUuMTBnIDAgLT4gMAorJS41MGcgMCAtPiAwCislLjEwMGcgMCAtPiAwCisKKy0tIHByZWNpc2lvbiAwIGRvZXNuJ3QgbWFrZSBhIGxvdCBvZiBzZW5zZSBmb3IgdGhlICdnJyBjb2RlICh3aGF0IGRvZXMKKy0tIGl0IG1lYW4gdG8gaGF2ZSBubyBzaWduaWZpY2FudCBkaWdpdHM/KTsgaW4gcHJhY3RpY2UsIGl0J3MgaW50ZXJwcmV0ZWQKKy0tIGFzIGlkZW50aWNhbCB0byBwcmVjaXNpb24gMQorJS4wZyAxMDAwIC0+IDFlKzAzCislLjBnIDEwMCAtPiAxZSswMgorJS4wZyAxMCAtPiAxZSswMQorJS4wZyAxIC0+IDEKKyUuMGcgMC4xIC0+IDAuMQorJS4wZyAwLjAxIC0+IDAuMDEKKyUuMGcgMWUtMyAtPiAwLjAwMQorJS4wZyAxZS00IC0+IDAuMDAwMQorJS4wZyAxZS01IC0+IDFlLTA1CislLjBnIDFlLTYgLT4gMWUtMDYKKyUuMGcgMTIgLT4gMWUrMDEKKyUuMGcgMTIwIC0+IDFlKzAyCislLjBnIDEuMiAtPiAxCislLjBnIDAuMTIgLT4gMC4xCislLjBnIDAuMDEyIC0+IDAuMDEKKyUuMGcgMC4wMDEyIC0+IDAuMDAxCislLjBnIDAuMDAwMTIgLT4gMC4wMDAxCislLjBnIDAuMDAwMDEyIC0+IDFlLTA1CislLjBnIDAuMDAwMDAxMiAtPiAxZS0wNgorCistLSBwcmVjaXNpb24gMSBpZGVudGljYWwgdG8gcHJlY2lzaW9uIDAKKyUuMWcgMTAwMCAtPiAxZSswMworJS4xZyAxMDAgLT4gMWUrMDIKKyUuMWcgMTAgLT4gMWUrMDEKKyUuMWcgMSAtPiAxCislLjFnIDAuMSAtPiAwLjEKKyUuMWcgMC4wMSAtPiAwLjAxCislLjFnIDFlLTMgLT4gMC4wMDEKKyUuMWcgMWUtNCAtPiAwLjAwMDEKKyUuMWcgMWUtNSAtPiAxZS0wNQorJS4xZyAxZS02IC0+IDFlLTA2CislLjFnIDEyIC0+IDFlKzAxCislLjFnIDEyMCAtPiAxZSswMgorJS4xZyAxLjIgLT4gMQorJS4xZyAwLjEyIC0+IDAuMQorJS4xZyAwLjAxMiAtPiAwLjAxCislLjFnIDAuMDAxMiAtPiAwLjAwMQorJS4xZyAwLjAwMDEyIC0+IDAuMDAwMQorJS4xZyAwLjAwMDAxMiAtPiAxZS0wNQorJS4xZyAwLjAwMDAwMTIgLT4gMWUtMDYKKworLS0gcHJlY2lzaW9uIDIKKyUuMmcgMTAwMCAtPiAxZSswMworJS4yZyAxMDAgLT4gMWUrMDIKKyUuMmcgMTAgLT4gMTAKKyUuMmcgMSAtPiAxCislLjJnIDAuMSAtPiAwLjEKKyUuMmcgMC4wMSAtPiAwLjAxCislLjJnIDAuMDAxIC0+IDAuMDAxCislLjJnIDFlLTQgLT4gMC4wMDAxCislLjJnIDFlLTUgLT4gMWUtMDUKKyUuMmcgMWUtNiAtPiAxZS0wNgorJS4yZyAxMjM0IC0+IDEuMmUrMDMKKyUuMmcgMTIzIC0+IDEuMmUrMDIKKyUuMmcgMTIuMyAtPiAxMgorJS4yZyAxLjIzIC0+IDEuMgorJS4yZyAwLjEyMyAtPiAwLjEyCislLjJnIDAuMDEyMyAtPiAwLjAxMgorJS4yZyAwLjAwMTIzIC0+IDAuMDAxMgorJS4yZyAwLjAwMDEyMyAtPiAwLjAwMDEyCislLjJnIDAuMDAwMDEyMyAtPiAxLjJlLTA1CisKKy0tIGFsdGVybmF0ZSBnIGZvcm1hdHRpbmc6ICBhbHdheXMgaW5jbHVkZSBkZWNpbWFsIHBvaW50IGFuZAorLS0gZXhhY3RseSA8cHJlY2lzaW9uPiBzaWduaWZpY2FudCBkaWdpdHMuCislIy4wZyAwIC0+IDAuCislIy4xZyAwIC0+IDAuCislIy4yZyAwIC0+IDAuMAorJSMuM2cgMCAtPiAwLjAwCislIy40ZyAwIC0+IDAuMDAwCisKKyUjLjBnIDAuMiAtPiAwLjIKKyUjLjFnIDAuMiAtPiAwLjIKKyUjLjJnIDAuMiAtPiAwLjIwCislIy4zZyAwLjIgLT4gMC4yMDAKKyUjLjRnIDAuMiAtPiAwLjIwMDAKKyUjLjEwZyAwLjIgLT4gMC4yMDAwMDAwMDAwCisKKyUjLjBnIDIgLT4gMi4KKyUjLjFnIDIgLT4gMi4KKyUjLjJnIDIgLT4gMi4wCislIy4zZyAyIC0+IDIuMDAKKyUjLjRnIDIgLT4gMi4wMDAKKworJSMuMGcgMjAgLT4gMi5lKzAxCislIy4xZyAyMCAtPiAyLmUrMDEKKyUjLjJnIDIwIC0+IDIwLgorJSMuM2cgMjAgLT4gMjAuMAorJSMuNGcgMjAgLT4gMjAuMDAKKworJSMuMGcgMjM0LjU2IC0+IDIuZSswMgorJSMuMWcgMjM0LjU2IC0+IDIuZSswMgorJSMuMmcgMjM0LjU2IC0+IDIuM2UrMDIKKyUjLjNnIDIzNC41NiAtPiAyMzUuCislIy40ZyAyMzQuNTYgLT4gMjM0LjYKKyUjLjVnIDIzNC41NiAtPiAyMzQuNTYKKyUjLjZnIDIzNC41NiAtPiAyMzQuNTYwCisKKy0tIG5hbnMgYW5kIGluZmluaXRpZXMKKyVnIG5hbiAtPiBuYW4KKyVnIGluZiAtPiBpbmYKKyVnIC1pbmZpbml0eSAtPiAtaW5mCislRyBuYW4gLT4gTkFOCislRyBpbmZpbml0eSAtPiBJTkYKKyVHIC1pbmYgLT4gLUlORgorCistLSBmb3IgcmVwciBmb3JtYXR0aW5nIHNlZSB0aGUgc2VwYXJhdGUgdGVzdF9zaG9ydF9yZXByIHRlc3QgaW4KKy0tIHRlc3RfZmxvYXQucHkuICBOb3QgYWxsIHBsYXRmb3JtcyB1c2Ugc2hvcnQgcmVwciBmb3IgZmxvYXRzLgorCistLSBzdHIgZm9ybWF0dGluZy4gIFJlc3VsdCBhbHdheXMgaW5jbHVkZXMgZGVjaW1hbCBwb2ludCBhbmQgYXQKKy0tIGxlYXN0IG9uZSBkaWdpdCBhZnRlciB0aGUgcG9pbnQsIG9yIGFuIGV4cG9uZW50LgorJXMgMCAtPiAwLjAKKyVzIDEgLT4gMS4wCisKKyVzIDAuMDEgLT4gMC4wMQorJXMgMC4wMiAtPiAwLjAyCislcyAwLjAzIC0+IDAuMDMKKyVzIDAuMDQgLT4gMC4wNAorJXMgMC4wNSAtPiAwLjA1CisKKy0tIHN0ciB0cnVuY2F0ZXMgdG8gMTIgc2lnbmlmaWNhbnQgZGlnaXRzCislcyAxLjIzNDEyMzQxMjM0MSAtPiAxLjIzNDEyMzQxMjM0CislcyAxLjIzNDEyMzQxMjM0IC0+IDEuMjM0MTIzNDEyMzQKKyVzIDEuMjM0MTIzNDEyMyAtPiAxLjIzNDEyMzQxMjMKKworLS0gdmFsdWVzID49IDFlMTEgZ2V0IGFuIGV4cG9uZW50CislcyAxMCAtPiAxMC4wCislcyAxMDAgLT4gMTAwLjAKKyVzIDFlMTAgLT4gMTAwMDAwMDAwMDAuMAorJXMgOS45OTllMTAgLT4gOTk5OTAwMDAwMDAuMAorJXMgOTk5OTk5OTk5OTkgLT4gOTk5OTk5OTk5OTkuMAorJXMgOTk5OTk5OTk5OTkuOSAtPiA5OTk5OTk5OTk5OS45CislcyA5OTk5OTk5OTk5OS45OSAtPiAxZSsxMQorJXMgMWUxMSAtPiAxZSsxMQorJXMgMWUxMiAtPiAxZSsxMgorCistLSBhcyBkbyB2YWx1ZXMgPCAxZS00CislcyAxZS0zIC0+IDAuMDAxCislcyAxLjAwMWUtNCAtPiAwLjAwMDEwMDEKKyVzIDEuMDAwMDAwMDAwMDAxZS00IC0+IDAuMDAwMQorJXMgMS4wMDAwMDAwMDAwMWUtNCAtPiAwLjAwMDEwMDAwMDAwMDAwMQorJXMgMS4wMDAwMDAwMDAxZS00IC0+IDAuMDAwMTAwMDAwMDAwMDEKKyVzIDFlLTQgLT4gMC4wMDAxCislcyAwLjk5OTk5OTk5OTk5OWUtNCAtPiA5Ljk5OTk5OTk5OTk5ZS0wNQorJXMgMC45OTllLTQgLT4gOS45OWUtMDUKKyVzIDFlLTUgLT4gMWUtMDUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9nZGJfc2FtcGxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2dkYl9zYW1wbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczMmIyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9nZGJfc2FtcGxlLnB5CkBAIC0wLDAgKzEsMTIgQEAKKyMgU2FtcGxlIHNjcmlwdCBmb3IgdXNlIGJ5IHRlc3RfZ2RiLnB5CisKK2RlZiBmb28oYSwgYiwgYyk6CisgICAgYmFyKGEsIGIsIGMpCisKK2RlZiBiYXIoYSwgYiwgYyk6CisgICAgYmF6KGEsIGIsIGMpCisKK2RlZiBiYXooKmFyZ3MpOgorICAgIHByaW50KDQyKQorCitmb28oMSwgMiwgMykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9nZGJfc2FtcGxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9nZGJfc2FtcGxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTJlYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2dkYl9zYW1wbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9nZGJfc2FtcGxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9nZGJfc2FtcGxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTJlYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2dkYl9zYW1wbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9ncmV5cmdiLnV1ZSBiL2xpYi9weXRob24yLjcvdGVzdC9ncmV5cmdiLnV1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTFiZWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2dyZXlyZ2IudXVlCkBAIC0wLDAgKzEsMTU0NyBAQAorYmVnaW4gNjQ0IGdyZXl0ZXN0LnJnYgorTSA9SCEgMCAiIDAgISAgICEgICAgIjAgICApKCAgICAgO0ZcQDtGJU05MCAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhICAiICAgICAgI18gICAgICAgICAgICAgICAgJCAlLQorTVwgICAgICAgIDBdPCQgJSVaISAhMj5QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgSCAgICArIUAgICMgTCAgIFQxICAgLiVAICAjUUggICEgPgorTSAgIDEoUCAgJEJEICAhLE8gICA0LSAgICUzSCAgIThfICAgNzEwICAmJEggICFFMCAgIDo1MCAgJlVEIAorTSAhUT8gICA9OTAgICdGSCAgIV1QICAgQD1AICAoN0QgICIpXiAgIENBICAgKShEICAiNi8gICBGRSAgIAorTSlZSCAgIkI+ICAgSUkgICAqSkggICJOUCAgIExNMCAgKztEICAiWl8gICBPUSAgICwsQCAgIycsICAgUgorTVQgICAsXTQgICMzOSAgIFVXUCAgLU40ICAjP0ogICBYXCAgIC4/MCAgI0tYICAgW18gICAvMCggICNYJworTSAgIF8iQCAgMCEgICAkJDUgICEiJlAgIDBSJCAgJDBHICAhJSswICAxQyggICQ8WCAgISgvQCAgMjQoIAorTSAkSSggICErM0AgIDMlKCAgJFU4ICAhLjdAICAzVjAgICUhSiAgITE8ICAgNEc0ICAlLVogICE0QCAgIAorTTU4OCAgJTosICAhN0QwICA2KTggICVGOyAgITpIICAgNlowICAlUkggICE9SzAgIDdLKCAgJV5YICAhQAorTU9AICA4PDAgICYrKiAgIUNTMCAgOS0oICAmNzcgICFGVyAgIDleKCAgJkNIICAhSVtAICA6TzAgICZPWgorTSAgIUxfUCAgO0AsICAmXCkgICFQI0AgIDwxKCAgJyg4ICAhUydAICA9IiwgICc0SSAgIVYrUCAgPVMsIAorTSAnQFkgICFZL1AgID5EMCAgJ00qICAhXDQgICA/NTggICdZOiAgIV84ICAgQCYwICAoJUkgICIiO1AgIAorTUBXNCAgKDFbICAiJT9QICBBSDQgICg+KiAgIihEICAgQjk4ICAoSjwgICIrSEAgIEMqQCAgKFZOICAiLgorTUxAICBDWzggICkiWiAgIjFPUCAgREwwICApLyogICI0VCAgIEU9OCAgKTs8ICAiN1hAICBGLkAgIClHTQorTSAgIjpcQCAgRl9AICApU1wgICI+IEAgIEdQQCAgKiAuICAiQSRQICBIQTwgICosPCAgIkQoMCAgSTI4IAorTSAqOEsgICJHLCAgIEojOCAgKkRbICAiSjAwICBKVDwgICpRLSAgIk00UCAgS0VEICAqXT4gICJQOSAgIAorTUw2SCAgKylQICAiUz0gICBNJ0ggICs2ICAgIlZBQCAgTVhMICArQi8gICJZRFAgIE5JPCAgK049ICAiXAorTUhQICBPOkQgICtaTiAgIl9NICAgUCtIICAsJyAgICMiUUAgIFBcUCAgLDMxICAjJVVQICBRTVQgICw/QworTSAgIyhaICAgUj5UICAsS1MgICMrXVAgIFMvUCAgLFgiICAjLyIgICBUIFQgIC0kMiAgIzImICAgVFFYIAorTSAtMEQgICM1KkAgIFVCXCAgLTxVICAjOC5AICBWM1ggIC1JIyAgIzsyICAgVyRUICAtVTMgICM+NjAgIAorTVdVXCAgLiFFICAjQTpQICBYRyAgIC4tVCAgI0Q+MCAgWTdUICAuOiMgICNHQjAgIFooXCAgLkY0ICAjSgorTUYwICBaWVwgIC5SRCAgI01KICAgW0pYICAuXlQgICNQTjAgIFw7XCAgLyslICAjU1JAICBdLSAgIC83NgorTSAgI1ZWUCAgXV4gICAvQ0YgICNZWlAgIF5PICAgL09VICAjXF5QICBfQCQgIC9cJyAgJCAjICAhIDEoIAorTSAwKDYgICQjJlAgISEiJCAgMDRHICAkJisgICEhUyggIDBAWCAgJCkvICAhIkQoICAwTScgICQsMyAgIQorTSM1JCAgMFk2ICAgISFAICAgMDQgICAkJiAgICEhMCAgIDAwICAgJCQgICAhITAgICAwOCAgICQmICAgIQorTSEwICAgMDggICAkJSAgICEhQCAgIDA0ICAgJCYgICAhITAgICAwMCAgICQmICAgISFAICAgMDQgICAkJgorTSAgICEhQCAgIDAsICAgJCUgICAhIUAgICAwNCAgICQmICAgISEwICAgMDggICAkJCAgICEhQCAgIDA4IAorTSAgJCYgICAhITAgICAwMCAgICQmICAgISEwICAgMDAgICAkJCAgICEhICAgIDA0ICAgJCQgICAhIUAgIAorTSAwOCAgICQlICAgISFAICAgMDAgICAkJCAgICEhICAgIDA4ICAgJCUgICAhIFAgICAwOCAgICQlICAgIQorTSFAICAgMDggICAkJiAgICEhQCAgIDA0ICAgJCYgICAhIUAgICAwMCAgICQmICAgISFAICAgMDAgICAkJgorTSAgICEhQCAgIDA4ICAgJCYgICAhIUAgICAwNCAgICQlICAgISFAICAgMDggICAkJiAgICEhMCAgIDA0IAorTSAgJCUgICAhITAgICAwMCAgICQkICAgISEwICAgMDQgICAkJiAgICEhQCAgIDA4ICAgJCYgICAhIFAgIAorTSAwNCAgICQlICAgISEwICAgMDggICAkJiAgICEhQCAgIDA4ICAgJCYgICAhITAgICAwMCAgICQmICAgIQorTSEwICAgMDAgICAkJiAgICEhQCAgIDA0ICAgJCYgICAhIUAgICAwMCAgICQmICAgISFAICAgMDQgICAkJgorTSAgICEhQCAgIDA4ICAgJCQgICAhIUAgICAwMCAgICQlICAgISFAICAgMDggICAkJiAgICEhICAgIDA4IAorTSAgJCUgICAhIUAgICAwOCAgICQmICAgISFAICAgMDggICAkJiAgICEhICAgIDAwICAgJCQgICAhITAgIAorTSAwNCAgICQmICAgISFAICAgMDggICAkJiAgICEhQCAgIDA4ICAgJCUgICAhITAgICAwOCAgICQkICAgIQorTSFAICAgMDggICAkJiAgICEhMCAgIDAwICAgJCUgICAhITAgICAwNCAgICQlICAgISEwICAgMDggICAkJQorTSAgICEhQCAgIDA4ICAgJCYgICAhIUAgICAwOCAgICQlICAgISFAICAgMDggICAkJiAgICEhICAgIDA4IAorTSAgJCYgICAhIUAgICAwNCAgICQkICAgISEgICAgMDAgICAkJiAgICEhQCAgIDA4ICAgJCUgICAhIUAgIAorTSAwOCAgICQmICAgISFAICAgMDggICAkJSAgICEhQCAgIDA4ICAgJCYgICAhITAgICAwNCAgICQmICAgIQorTSEgICAgMDQgICAkJiAgICEhQCAgIDA0ICAgJCUgICAhIUAgICAwOCAgICQmICAgISFAICAgMDQgICAkJgorTSAgICEhMCAgIDAwICAgJCUgICAhITAgICAwNCAgICQmICAgISFAICAgMDggICAkJiAgICEhQCAgIDA0IAorTSAgJCQgICAhITAgICAwMCAgICQmICAgISFAICAgMDggICAkJSAgICEhMCAgIDA4ICAgJCUgICAhISAgIAorTSAwOCAgICQmICAgISEwICAgMDggICAkJiAgICEhMCAgIDA4ICAgJCYgICAhITAgICAwNCAgICQmICAgIQorTSEwICAgMDQgICAkJSAgICEhQCAgIDA4ICAgJCYgICAhITAgICAwOCAgICQkICAgISEwICAgMDggICAkJgorTSAgICEhMCAgIDA4ICAgJCYgICAhISAgICAwOCAgICQlICAgISEwICAgMDQgICAkJSAgICEhT1oqQEVBNgorTSozMTU2JDU6NlRVRjxERTgvUjRNLEMgXjE2OiI9N1VQMlNdSTxGTTs2Ji1CMTNFTzokXSQrNTk8PEc9JQorTTElSVI/N0lROkYlQzZFSUgyNDU/OVVBLzxHVF42NUlCOkcpTj1ISU02Q10pNiZdQjojIC4tR1YmPEYpQQorTTkoKUAsQjRNJTNFWjhGQUI4RiEiMjRVQzhWTTgrMiA9JlNFVUBXSU1CRFNeJEBENSs2RUo2VUhNKTMoXgorTTE2KVI8RkU6OEY9SjxGTS82JVFCOEYtOzZFOSk2RTlCOkctSzZWLUk4VUEpL0YlSjlGKUI7RzVVPzdJSAorTS9TUT84Vy1TOjRFQD8nLUo4RiBFJiRSKDg0NF46Nl1COiUwSSRFQEkjQShNMjU5PzonLVo7VEFIOCQxJAorTS9GKU82JUElNlYkXzNYIio4IjxWOlZJVD8nVUArM1xZQERRNiA0NCE6QCIoPkhJSSwjOSQ2JUQjLj9ZJAorTT1XNUg4JURfKjFAQCszITA8RjlLOEVAXzhXPUI6Vi1CNUJURTE2JUg3RDRNLCZdVzIkUTo2VylcOzVNUgorTTpVSTo4IyElOlc9RzE2LVoqNUE2NjZRWjtGWiE4Ri04JzMhQjhFSDsjQTUtO0VJLzhVUUY9U1hNLyMoVgorTTZDKUhARk1LPEZROzhWKUs6VEU1LlE0QDhISio9ODVSLyFALihGQU44RiBbJEJPVTYlNSQ6R1VaOFRVQworTTpWTUM3RilKO1ZNQDNWIUo2NUUtMSRBSjhTXTg3JkEtL0NZOzgmIUg4RilaPjcpVTpFQSU6NU1LQDRcWQorTThILVY+VkU4LUNRO0BXIFYrNFFPMyM9NjQhVSkxIyA1JiNNJDgnIUM8RyE4MyNZJDolQS07RUE4KzM5KworTTYlSVpDJ0krL0ZFSjtHViI+JERWLlRFQCAzRCExICNePDgpUC1FQUE4Rkk/KzFMRTwoKUY4Vi0/MjJETQorTS5SVS06RilCMyM4TTNXIUI7Vyk4LjNERyZTRUA2JUBJJzYpWzpGLUAzNklSNlRdUjpFSUkvQj04PEdJSworTTYkXUcvVTkkNkcpUjs3KVI0JylILEJVODxFOE0qU0U1OiYhJzZGRUI+VUBWPCYhOi9RTSk8RylaQFcpOgorTTlFTUI8RTlBMSEoNTEnSio9NzVdX0cwUiNBQSk6RklXOiIgOzI2QUI8NzVOOEQ1JDhHKUo4RV0wPkcpQAorTTE3PVs4RklIMjNZQDlUNSU4RkUtLjNRLTdWKUs1Qj1CQCcpWjpGRTs7JFVGQFRMVjpILU4/Ny04MjVJVworTT5XISkyNF1LMjI0VjVEMTY6NiRAJiMoXDE2RS02U0RNN1ZJOj1XSVo6Rk1ALUFMRSszOUY/J0k4MzZNOgorTTlHViJARkklL1gpJTpQJFYgNUAgXCcpTT5GLTs2VilWPVJULik2Lig4Ri1QPEYkVi1GIF42Rkk/MzZYWworTSZSVTs2SCIiOjNYVi8iIFIyMzk2MSM5OzxXQUk3JV1HOFVFJTwkVSU6I1hJMTYpUj1WQSkxVTksK1VBRworTTpFTTw6Vi1SOUVAWTE4IUo1REVIOkchQzgkRTE7V0lCMjVBKSlWWUAtQyk4PVZNSjM3NCM4T1kpMjJUNQorTSRCVUI8RklKPTZVQCxCIFYzNilcPVI0LiZTOUI+NylLOURVJTMmTUo4RkElOUdJLCs2XVc6RylLNkNdOQorTTokVTU6RylIOCQwWTI1TTwyMjRFOCZNUjlFTTs8Jy1aPVRFOT5IKU4/JzlAN0VFSjxGWTA+SCogOkQ1OworTTIzRSk6JlxQKVJFODYlSUA4UTQyLCZBJTwnSVU+R0lKNyJUQCUyNS06RVItMzM5QTpGSVo/KClaNlVBQAorTTxQJTggNkQgUicpMTpGKTg4VUlNP0VQOyk1OVMxJFVXPzcgVi42QS0zJFE2MjcpSC1DKFYxJ0oiPEVdNQorTTUzWTQ1MiBfOCVBKTYmLTk2Rl1SNkREXzokRFk4VkU+NkYpTT5GXSksJFBNKEAtKVo1QSk2JylSOUZFLQorTTVHKiM2RFVCOkZJJDZFOE0zJ1VaMjRVTjdFSS0tQlU7P1YpSzZHKVI6VikpNiNcUiszOUA2RkFDOUY5SgorTTcjOFYvVilVPVJUQCYhNTY8RlVKOkVdOC41SUE4Rl0oMic0ViZTRSw6R01NOiRFJTglOFYzNy1KOjYhKQorTTYmSUgvQiA1KzAtJFFUVS07V0lfOCJUWzdIKV07Rk1CNlVZOjpGUTs/OEYqPEVJQzgzOFA6NURCKjFNKQorTTgkNTY6UihJMSNEVjhWWVJBWC1dPVVcVixDWUo+RFBZKCM5TDxGVV09Nz1AMzZdWyA3SCE8ICJCQDZZQgorTTQ0QUA2Ni1SPVNcVC41XE0uNl1dQCYpOjwmXToxNERePjcpQC5SVT8+QC1SX0chRjMmIU4oIjUpOEVJJQorTS9TOSU6SCFCMyNZKTYkRTs+R0lMPEdJWjxFNFY4JEUkMjREXy9DOFk4JU1COkUhQjhIKVo3RUVKPTNYWQorTTYxTEk9R0klMTVZWz5HJF8mUzlaOFZNQj03NVI4RF0vOFZFNjMmKTs4Vl1GPEY5OTE0RTg2RklXN1U0WworTSxGLVI8RjlROkYtLzYiXSU7VilCOlUwQCgjOTs+RylRODowTTI0REcxNk08OFZBQjhXTVI5Uyg4LlVBJAorTS1FQSQ4NzFML0I0SSwnNiI4Ji1IMTY4JDpZTU5AKDldOUYtQS9SNT83IjRLKCJUWTU0VUoyNlFJKzJVOgorTTZFWCM+SFVdOlVJKTI2KiM4Myg4KEVRWiBWOiU6RiEtOlcoIT5AJVcgL1lbQUc9QDYjRS02RilTOiVBNQorTTE2RU88R0FZQEdOIkJHISktISlCOUYpMCs1SVM3RSFNPlZdLDY3LTUoIlUpOCVASyUzOUA+Ry1SOCNdOAorTTM2TiI7RDEvPEgpWjpVQS0yNUkpKzJUVjYjIFYvVFVKOEZNSDpIKUo2RU1DOCRFNSwjUVI6VFU5L1VJWgorTUBGVEAyJy1GPUZJQjhGVVM4RFVDPFgtVTpXIVI2NDZLPkdJQjQ0VUc6JUVKQEcpQjZGSUo6VlogPlZZSworTTojTFY3RUVKPVYtJCRCNUo+RzVOPVREQCZSVT86QC06TjQ1KD5XTUsrMUEpPEZJODpWLSk4NEw7JiJEXworTT4mVTo5RkRWMzctUzsmRTs9N0FdPUcpSzZVQS03IzkkL1MwOy9WIUIxNklIKzQ1OzZALUNFRk1LPTZNOgorTTI1OUI3Q1xNLUYhTC9UUUs4VUlCOkZIIThAJSQgL1lHQEdVUzYjISQ4JiE6NiNFJCs2IUs6VklSPkc9RAorTT83PU0zUjU4MjNEUis1RUI6JFVCPkchKTM3SU8vUyhSLlRMRSYiVUE6RylXMzNZTTM2SiI6UzhWNDZZVQorTT5GXSwxJVE2LEI0UjdEMFItQyE2MSUhQDM2SVI6VkVCOFVNQTI1OUo2NFVCL1M5Sz5GTEUpNUlLOlYoWQorTS9GKVI8RU06NCdWKjs2QUo2REdePEdNSjpWKVo8RFEkPTchRjolITs4RjlWPzdVVTxGPF4yMzFDPEYpJAorTSUyRUI9NykwPkggWyZTUTgzJUlIOCM4RzpHSUAmUFhNOEZJSz5XPUk4I1w4JTE0TTw1SSw4VyEpL0ZFWgorTTxGXUY0VVIiPidJTDtHKTo2REUsNjVYRSs1NS09VklGPkZJOzomISUvU1xWL1YgXikzWSw4Vk1COEVAUgorTSszRUs7VkFIQEcpWiA3PCE2MCNeOlc1Vj8kVF8yNFVBL1M4Vi5RTFYzNTk6NyZJUjY2OUIzNkFGNiREWworTSgiNFYvViE4OEc9TzZEVVI8RkEkMTNQXCpQWDsyNl1COkREVjolSUM/RUhQMjZVOzRXVVo2RDE2OSRUXAorTSs1QToyNiBeL1Y5SDolRTs4Rk1DMTRVSjpGLUI6JDE4NlVBOjpHKUEwMzElMzYpNisyNE82Rk1SOEQxQgorTUE2KSUzJUk/X0VRTTpGVUs7Rz1HNjclWTxGTFk1RVE8OEY5Wj03UVo2NChNNlcpOjgjOE0zJilIKjUiIworTToiVFkxMzhXOEZIXyo2QVo2QjQ4KTRVOjpHNVo6Vj05KlFALiglTVA6JUFLODNdLTw3SVo5RiEtPTc1UworTTZXSiM4VU1BNiYhSS8iRFY1NyE8MicpSzwmTUM2I10kL0RFQzZERF4rNi1SOlZFLSoyVEUxNyFDNlgpQgorTT1AJiIgNkQgQkYpQjlHTFYtRUFKOiVIIzI/WF8yNTk4NiU5OjxHKU86NDFAPFYtODUyREstIzkpNiVFQworTTpGPVI6VklLOCU0Xi1DIC4jQlVIOkYpJTNXKUo8R1xeJiI1Pzg0UVI8RVkpLUNZNjYzUF4zJiFSOiI9QAorTT5HKVo2NFFCOkVYXzVGXUo6Vj0+MjRFQjxHNVo9R0lSOEYhODY1MEkmUjRZPEZdRztYKUgvQzk4PVYpJworTTdVITo8RjlQOkY5Uj5GS1M1JFFCOlYpPDlFTiJARyE6MjZdTzMmQT4yNTkpNkNZLD5HSUk3VUUlLUNFQworTTIzWUI+RjxbLlQxOTY1STYzNilKOiRERSYgRDsyVUEsNkVEXi9SVSU6VU1SPkc5VTpEUU5CRz1DNlRRSAorTTpVNFsrNUFOPFVJOjhXKU47Rz1DMzRVSDpWTUo1QjRZOlYtSzZUMSkuUlU/NkRRJzpQJV0gNkwgX0VdJQorTTgoIFYrM0VKOzRRQTI0RT44Ji1KOiYhNjwoIVo9VF04OldJSjgjOFssQlUpOVVdLDMmKVs8NilHOjVATQorTS5TREAmIShfO1ZVKTM3KVdASCk0KCFARTI1TUY6Rik5LUNMUDYkNFkxNU1WPEIoUDpHKU8tQkUvPkdJSgorTTYkMUI6JU1DOCU5PD03VV0+VylTOkYtSTM2QTUuUUA7NkZJVUBIKUovQlU+Pz9ZUjY1OF4rNkk6NyZZOworTTNXJVc6JDFDPTZZTDYzXVI8Rl1COScpRy41SUI7Jl1IMyQxQ0BGWVM+VkE2NFRNQzlVST85RihQMjYlLQorTThVSTo4JklSPkZUXCpRQEk1RFUtMjVNJS9ERTgzJTlKPkdJRi9BVTpESClQODRFOjhETF42NkVGPzZYWQorTTgnKUs0J01SNiM5OjpYIV04UzhQOFZNRjg0USg6JiE/M1Q2IjZFUCE6QCVQIC9ZSC9UVVstIjQ9NFNYUAorTTojOFY2RklKOEVNKStVTic6RylSMzRWIjpGKUA3I1BAKzZBVzhERTo9V0k7OCYhOC1EMF8uUyhJKzYhSgorTTYlMTo6SCldPVU0VCpTOTg6VklDPCREUDI2JSkpU10tPEdIXyk1SU83UigyL1dJXzxFOEArNDE6OEVJQgorTTZHNV0/N0lKNyVJUT1EVSwuM0xHJiNNOTxILVw4QlRFOEZWTjlGSUIyIzk6NjVFSjY0RTo8RVBZMycpUAorTTxGSF42RilANkYpSjIxTUEzJSVLOkZAWS1WVUs5R0lXO1YhPzZQLUtTViElJlNNPy9UNUI4RklSPzhFWgorTThVIEArNkE4KzJVQDI0RSUyNiE4NkZNSzEiVEU1SSoqQEZBODIzXE0tRyFQNkdJWiwjITA6RDU6NyY4RQorTSszRVpCRyk5LjUhQjY1TS0tRkVSPCREUDhGXCE6ICVPIC9ZKTI1RUk2JTBbLlFMOzYjKCkzJklKOlYkVgorTSZUVV86RlVbOEYpSzMzXUo6VDA4JTRBWjwlRTo8R01KO1YtKS1EUUQvQlRSLURBOjM1XTgzVklKOEYhJQorTS5SVFk2Nk1CPEYoTS9WOUAtQzk6PkdNQiwkRTovQUAyKjZCIjpUNEUiMlUtNjQxLThXNiY/NllCLjJFOworTTtFSTgvQkQ4I0FAQDEnSVo1QihbPEcrXjo3KUo2M10+N1YpQjMlUUM6VFxeMjcpWjxGQFYuNU07NyZJSgorTTZBNT82Q11HOEYtQC42IUg2NllVO0ZBQzM0VTw8RkBeJlJVKC9DWS84VllSPEhFTThFREUmVTlNKCJVTQorTTEzOF8tQ1kpNkVBRioyITU4R0olREdJKS1CIDgpNylXOlZJTjgkTTg6Ri1POkZAWyoyNTk9N0lSNiU5QgorTThFTSUrNFFPOzY4WUBGQVEgNzwhMjAjUzYkNUAxJklXOCYlJSszXSktJV1LOlZBJTEjIUg6Vi1aPkZJSworTTpVXSk6JkxbJiFAXjxGTF8tRFFSPlcpTzZDOFI7ViUlLlNZNjZFOSQ2RilKO1YhOjZFOSkyMzhfPEc1VworTS4zOUA2M1xfOic1Uj5GJTA2MzhLLCM5KDonPE0uUUBJOCZBOy9UMSw7N0lKMzI0Mi1GPS0zNURNKjAsKQorTV9BTF42NERFMygpUjhHKUg4JU1COCVJOzhHKVo8RDBFMjchUj1HKT4zVUk7OVdNTDpUMS05VFFKOFVJSgorTThXIUgzNkoiOkYpVzo0RS89Vl06MlU0WyhDXTgzNkVSPTgxVTxFTSQtJEVJKCJVSDZERFsqUFktOEU5KQorTSRCIS04VilOQEhJRyowWC4lNSIiPzZJOTomIS06RjlVPkZNQDI1NUA2NUVaOkZBQzwoSUAtQzkpN1YpSgorTThGWVQgN0ghPCAjXjYjWSkxNj1PMyVFUDgzXSktRilaPVZAUDEkRSktQyFRQEZJSzpWLUtAJz0pKCI1NgorTThFSF8rMj1DQkZJSjZEMF8zNikvMSM5LTomXSU4JkVKPEZBOzonKVI4U1xNOEc5WjYjRT8uMlUlOEcpRAorTT5IKiI4Q0xSMjVBQDpGSUgsQERANiZJSjo0UFkzNylSOVU0QCs2IUA5VUk4NTJELiNCIFIsI1BNMyc1SgorTV9EPFkyJDVAPCZJOjM1WVU9NyktKzNdSzxHNUo6Vl1WOVVRUjtVTTgxNiFCPEZNOTY0UUA2RUlOQkcpOQorTTxHSS04J0laOCVBUTIhKEU1QyEpOkZFVUFIKUo2NE0kOCNMXDo2SUI4IyguJlVFQjEzOF84NThWLUVBTgorTThEUF8uUVRfPTgpVzZGLTYtVilVO0ZZRjtVXS04VlEvNTZJTzZGLUItRDE1KzI9QD5IKVpAQCVVIDcgIAorTV9FOFk2NTU2OiREUDhHPUk5Uzk2PEcpQzI1QUM2MjRAMyc1UjomKUo7R0lNPCQwRS4zWFkvVDRNLjcpPgorTThURF4yNDUtMSNEVi9VRUI5RUE7PCc9QjM1WiJCR0lLL0RFOjpGTSQ4Izg7LURVQjlWVVhBNk0kMENdKQorTTgmPTo7UUwpIjQ1NTM2XU82JDVLPEcpVzJTOUY3J0lMOCRFNDAyIEssQUxJKjNdTzpeSSkrMjRWMzZNSgorTTglSVA/NyFGOFUxNjhHKVI4RUlKPVclOzwnKUoxNEVDOUcpUjlURSQxNFU6OUgpVzZGLUIxJilaPEVFOAorTTxGIEUrM0xfMjRVMDpXVV03JUU/NkZBRDI2ITs4Rl00KjM5Tz5GKTgvQzhfNCJUXzxGPFsrM000MjZJVQorTTxGLUAxNEU6PTc1WiBXKjMxJUFQOjIoWThURTk6VUklMSFMMiwmKVBCQCVNIDc4IF9GIF44JVhHLjUwRQorTSwkUUY+RTk6OlZNOjM2RUw5QlQ7LUchUjclSUY+RzlLOlZZKzEiNEAtRUEpMzY9Njo0VTY6JiEvNkYhKQorTTYkVSQ6JEUvOFZJQCszRUs9SDYiODRFLTpGXSctVERJJlM5KTFXLVI/Nyk5OCREXjEkRTg5UzA1I0JVKQorTTM2TVc7VUlHNjY6IjhTIUAuNjlaOkQ0UDg0ME0vIyhWLlM5OTxLRUAvUiBWM1YpQjIkQVJCJzVGOEYpQAorTTZGKUo2VUE/O1ZJPDxGTUo2REVLPVcpQjgkRF8vREU6OEZNTzhGQS0xJUlSOjQ1NjpXKUg2NEQkNiwtOworTTpWWUI2NklPOzdJQzg1RS06R10/M1ZaKj5GXTgoQU0pNiRFVTxEREUtRiEnOEZNLzlURFA6Nk1GPEdJXQorTT82OUE2VylbKTQlKSczRU06VVhfLCFAOCs1RVogNlghPTAjXjhFXUs6IjRFNyU0Rys0MUI7VVFXPFZNMAorTTo2TUs2IiBNOFZQWTMzXTw8Ji07OCVJOC4xNE0xMyFDNiJNQDhGKVJAJSFCO1YtTDgzWSU4JkU6MTYgXgorTSszOFk7SClCMyVFSz1WID0yVUBFKjNcWTZHLVU9NUlCNkQxKS9VOUA1NDBALURVOThHKVI5RykpLCZJQAorTSc0QFY1R0laOCJVJTg0MSk2RUk4MzVFRl9FRFwsQ10lNiZNQDhHKVY7RylOOlcpSzIzOUA4ViE4OCYlOworTTZFXUM8R11ROjVAVi1DWTs6Vi1DO0dJSjI0NTg6Rk07OkcpUjokMSQ6Jk1LOFVAXzY2JUA4RyFDOUZZUgorTTg1QTk4Vk06NlY5SzhVTUgrMUBCMjM5Rj5HKS86JkksMSVJJDZFQE02JklKOSZVVUJFUUM5RyoiMTRBOAorTSoyKTg6Rik6OCRESSo4KF46UCVGIDZIIF9FSUg8JiBNKCNdTjIzXF4xJklSPkZNUjZEXTk6RjBJKTVJOgorTSs1QSUxJUU/L1MhKDI0RFIuUzg7LjNYOy9GKS08R10pMzZdUj1WJE0pNUFfO1NFOjs2JFYpNF1XOiQxOAorTTpXKUApNDE5LEJEXjI0XUs5Rjk2OEY9KTM1QSk2RUE5L1VFQDYkUS86RjlTOCMhLDgiNSkvVDUwO0cpOAorTTE2JU0vRilLOFVcWTM/WVA2IzhfLlQ1QDlHKVU9Ni1LOFVZRjwlMDI2JyFBMTVFQTY1QUA6JyldPzhFQQorTS5SRE0xNk1KOFcpWjpUNTg2RSFQOCVJUDxGQF8uNkomQTcpKS9VWUkzVEFSPEdJXz5HKVA4JyFDMjNZQAorTThEVS89VURLKjM4WzZXLiQ9V0laOiQxODcjWUc4RV1COkYpMz5IOTovVilaPTU4UC9CRDgyNzVCNyY5QAorTS9UTiIvRDQhPEAlQiAsUFY2JUA7L0NcXzglSTgyM1k4OkdJUjw2KF8uNU1JL0M5OTYiVTg5RUEtNiRESQorTSczOSk2JERWKzQwWykyVF8xJl1WMlM5Oj5IST4mIUBQPEglKy41TVI4VUFDPkdcRzg3KUY6IzhbIFNeKworTSwjXTs2VThPMSYhUTolOCMyP1ktMzYhUDhWQTk2Rl1NOzZNLDVGKF8yNiBSJzRdVzdTWS08RDE+O0clOworTSszRVM8NExWLUNZQTpXUU48RkFMPCZFSz1VWDguN11QL1RFQTomIUo7NklbPThJVzUhTEsrM0U4PDdKIworTThENS8xM106OiRFLThWRTkuNiIjQkZMXys1RUs4JFVCNyZVXD83SiM+Jkk5LjNZQThUVS06RiEpKjI0XworTTMlWiM+R0pDQEcpJzVERFA4RlVCNjVZSzcmOVU8VTklOldVSjE1MEUjQzlSOEIoXjElSU5AViQhLSAkQAorTSAvWFI2Jjk7MTVBODI1OTo2JERZNiZJWj01WFYsJEU2NjY9SzgzTSk1RFUtNlYhNCsyVSk2RUE2NyREVgorTS1FNF42Jz1LNjNYUDpISSkjQEQ1MTdJUDEjRTo6Vz1aPTdcUDVHPVE6RThNKTU1SDI0RUgzMzhWMyQxQgorTT5GRSkzVDElLjVCJD5HKTs6SCoiOUcpSjY1TUM2VlxbJlNZQjVERSk2Q0VRPFZRQTEkT149WClOLyFMVgorTTgmWiI9RllMOUdKID1IIUMmIU04OjM4UDZIIU82RkE6O1Y5XUBXIFwrMlQ7KTYuIkIlSSc2ViUlOCZNKQorTSwkNUk4M107PkdZVzdCVSk4RkFBNlRRPzxGSUpCSElPNkRVRj5HPS02Ry1IM1NENSs1TF84Ri07OlcpQgorTTgkRFY2RklKNkVBTj01STk6JikpNlgpUjpGQS8lMSk6MzJEVi4zXTlAR0lSIDggITUwI14yVF1LPCVBRworTTYzWF82Jik/MjNdLTxHLUsvQzhfMjQxOztGSTg6JkEpL0VJSztUTTg6JFBZOCVcUCoyKFYuNyogNlRdNQorTSozXVU4Ijw4KCJVLD1WRF8vVU1aPlcpWjgjRUpCRzU5KCBEQCwjOTY4REQ9L0ZdUj02QS06VylOM1M5LQorTT5HWUgrVFFaQEZJOj1XKSw5RlVJN0NdQDM0VU4yMzhZPkdJRjZUXUlfRy1dPlYkOCUzPVI+Ry1DMzRdXQorTUFHOV08I1BJLjVdMCkyXVpAJi1DOEZBQDxHOVY6JVhWJiFAXz5IKTovVSFUNlc9WzgiVFA4NUxWMTZNTgorTT5HQF8vVEVJNkRVKS42KTgzNzomO1YtJDQnKVU4Vk1SOlQxTDI0MVU2M1kkL0NFQz1XSVI2JkFKOFY5UworTT5HSUIzNUEtLjYuJzlFUTk4IzhALjRVJDJUNSkzKClDOUAmJiA3KCBfRkUlOldJOzpGLF4uNi1CN1VdOAorTTM2SVU8NiEpMjYhQDZGTUs6Jy1PNTRFQThGLSk4JylAKzYhRy1DKEckQU06QEZBJS9TXTk7Vk04NCUhKQorTTZFUT8vQzk0OkZZTj5XKS0xJ1VWM1IgOCNBQFQ4Jl0pLCNFLDxGQFkyNUlSOFM4VjYkQTo4MlUkPkdVTgorTTQ2SVI3JilNNlRdOjwlRFk5RVxNJlZNSzhWRSU2Xj1SOjdJSipRVE06RllLMjI8UD1YSV0/N01JN0M5JQorTTYiVEc6Rk1APCUhJDY3QUM1Q0U5O0MwQC9WTVIuMzhZOiZCIkJGVEktRjk6L1I1LzZXKVgyMzhWODREWQorTS5RVFYtQyFDQCZVTDEkVUY6Ri1bPlYtQTwmWVc/NyheKzJETTYnKVo8RklPPEYtQiBXKjY6ViEpLUJEWQorTT5GKUI2RUEkLlRFQi4zXTk8JDBeMyAqIyAvWVIuNFVaO1ZJRy4yTTs4JV1CPEZJSj03NU81RTlPOkVNOworTTZEUUY7VFE6OFYtQDdVSU44Q0U/OVQ1NSsxNDsxN0VPLUJVKzgnPUsyNUFANlYtOzY0RF8yNi1EOlglSgorTThENVJAR0FHLlFAQDEnPVI4JkVNM1Y5OiZRTFA8Rig9KzVdJS1EXSkxNl4iPTZBMTpHKVI2VExWL1VdRgorTTVEUTgtQ0UtOCRROCszI0c2Vi1XPUJUVDE1TUo6VDA4KjZOIj03VVs5RkBWL0ZFKTI2RS0xJzVJL0Q9SworTTtDMDsvR11GL1RVSjojXFYrM1koPkg9Ui9UTUk4RDRAKzQ1Q0EnITUtRDRfMlU0Ui1DITo8R1YjOUYtQQorTTdUMTE+R1VGNyYtUkBHSVAyUzhcLERFSzpTRE06WEFPMzAtO0VEXTk4NTRWKzRVWjdERSkxI1EkNUNYTQorTS9HUT8pMjQhPEAmIyAvWUsyNFVaOkchLC9DWUA4NSE6P1Y5SjpXKU8zNilXOlZFSDlVSF82NiU6NjYpSgorTTpWXVA4VUFCNjVBLTdVWSQzJylXMjM4Vi42TUgyNEU6OCVdPDhGXUIxJFUtN0dJQjpFUUY9OClaNlFMMgorTSs2XSQxJkooPkY5PyowWDs2NiA7KzZBJTdWQF4mVDIiQicpQjImVio2RVEpMEQxQjpFSSkuU1kvOCVJLAorTSsyN14xNi1KOkM8XzlGLUM6VExAKzZNWj1HIVc7JUBJK1ZdUDZGRFYoRilaO0ZdOzYiNEs6KDVXODYhUAorTTpGPTUqUzhfOkcpPDE0VU86RUxSJlFAWT8oMVcvUyBfNiYgXysyRF42NjlaLENFQjw0RSU9R1VVOCZBWgorTT8oKVAxI1E5MjYlUjslRF45V1VaOyVJLTIzXF86NjhcJlIpQjtDTTU4JiVJNkREXDI2TUBAQjQuIDRQIQorTT0wIyozI0U6PkRVVzgjWSg2RyFCMzclTT1WSUo4Q0UlPEdNUTxXPUsvQ102NiRVOzpVJUk2VU0+OlRdNgorTTMmLU87VkFGPEYpNTEjOTs6NUVIOERUXzE1SVo9VERWKVRVVzxGSTAzNigjPE9ZPy5TXTwpMlVDPzdVTgorTTdVNSEtRjlCLUM5SCwlIVIvQShFOigpRjMjWTpCRkheMSZBMDhWXTstQzhfOCZNUzo0RSk2NVlOPlVJQAorTTpWTVE4IzhFKzRdSz5WLSg6RUQ4JTRSIjxVREUmVTlWPEgpXzUxKEU6VzVTNlRVTDxGTUI4M1lPO1VZLworTTY1NTs+JiRSJiE0WzhHQio6M10vOjYtKS0jUTg2Ni1LLUJGUy9GOToxJklaO0YpSzxHSVo4U1xZOCVJSQorTT4mIS87RylVPUdVUjglQSQtRy1YMjJESzI0VFA6NklKPkcoWTY2LVM6MlQuIDM4ITwgI14pMVVAPkZFUgorTTlFSS02Jl1XMjYpUkJIJVo8JDRWNkcpQjpHLUszNE04MSNZJDlTRF8xM10tOyRVNjEkRTs9V01INyYpQAorTTYzWTo6NUlfO1QwTS1EMUo+RkUkKCNFSkBHTUY2Ri0sNkclVzpGLUkpMzlCPkcpSjMmKUo0JylbOCYhVgorTS41SUg2IzBLMjcpQjI0MUJAR0kvMjZBNjgnKTgpMjUkPEhBWjhFQUlfRkUxM1YpOjpGRUM9VyBeKTM5OAorTTM3KVEzJiklJzFAVjxGSSkqMzk6NlUlUkJGODgmI0VCOjYpQzpWSUMzNkRWNyZJLThWOFktRVlJLEE0RQorTTYlIVo/NylDOydJSjxCVF46Nl1COiYlJC42XUQzNF1POEQxQDhFUUY2M1BNNUNdOj1WJUI8RzlOPEc1UgorTT5HPSkmVl1XOCNZQDgzOEU1Ri07PkgpKS9WKVs9WCk+KCAkOyAzXCBVUUA1LUVKIDxGLSQrVjFPNkI9OgorTTxHUiJARy1NMzVBQjM0QUo9VDUpNiRVQDgmKSkxI1xWMTZBSTolQFArNUVSPUYhOjZFQFYxNj05QVdJOAorTSszXUA4RjlXODM5KTgnNV08RU1DMjNdOTxGMUI9UzhWOEdJUjZALUNfRilKPTdJUToyVSkyNFVBMjVNRgorTTM0NTY6WDYiOUVdOStTOUE1MkxFLEZaJT1TXF8zNllRMjJdJTpFSTs+V0lPM1YlQTE2LVc3RkBWKCIgXworTTw2TTYtJEVJLUMhOT5HPSUoIUxWM1VJUjxFWTozVl04NUZBODdHLTk3RUlPL1FAVjolSU80JVFXO0c9SworTT0zWFYzNl0sLVVJLS42TUozJDFIPCJVLTMzRS08Kjk4KzNcUiwmKUY8RzVWOFZFQzZFUVo1ISk5PzVNJQorTTZXJTkyNk1IMicpUzIyIFlASFVaN0AkUiAyICBfQkRLLENZXUImXSQnMz1ALyIgXjhHNiJAJi06NycpSworTTVDTFk8Ji04NkVBSzw1QFc2NiBbLUYpUj5HPSkrM0U5PEZNJDEzOEUvViElPkdVSDI2KVo9Vk1LPVYpJQorTTI2TVI8RilCOFREVjhGTTk5Rl0tOlc1PDEmITE4V01QM1dKIjszXFYtQ0U6Nkc9SzEiVSk4VkVaPTcpQgorTSwiIFYuM1k1L1cpXTxERTg2X1k8PTc9OC42IFAvRylNOzZJWjpTRTo9Vi0tL1JESS9GLTo1IlRZOUQwSQorTTE2SUo9IzBAKTJUVjpXTTsxJk1SPERRQjwmJUs8NyFCPEY8TS9XPVI4UzhUOlctTDxHKUA2JU1JMjI1LworTS9URUM4RDRFMTYgVjVERF4uNy1RMSJUVi9GJUs/JllSOiZRUDo2TVc3QUBZP1cgXzI3JUkzJklNMTZJOgorTS1BKEc4SCoiQkc8ITIwJFIgL1k5N0Q1LzooKV07VTkpL1JESTglSUo/KClKNiVJUjpGKSQsJUlDOCZFSworTTpXKUAvVUFIL0IgVjtXSVo7VUE4MzZdUDYjODglMjRfLCchUjhENTw/Nyk6NkdKIDZENUM4RkVSOkcpSAorTTElOUo5RilIOEVJTjo0USkrVFVbPEYpXURHSF8uUlReMzYpUjojWDsrNERSNlgpUjxFQEApUiBNN0RFUworTT82OTA8R08xOEVRSztUVTgpMlUlMTUhTUAmXFkzNylMNlVEXyszOSQvU1xNL0ZNOC9URVA4Rk0+LEIgSworTS1GSiI6NEVLPkc1OTgnLUw4Vk1JMzUhSDNVRVNAJk0kKzRVUjpWSVI7VylaPlYpJTZURFkyNkFPISM6SworTTVEVUIyVz4iO0NQOy1GIU5ARzlOOyY5WkAnOiA4UUA7NiZEViwlSiA7VUlIMzVJOTtDMDspVjoiPzAlSAorTSA1RCBfSCFCNjVZODhWWVs+RikpKCFBSjw2OU4+RilLPCVRSjpGRTUuNFUpNkZJSjxGXTkyNUkkKjFNLAorTTxHNVI4JUEpPCdJVzEhQDgmUiA7OyVdKS9VSiI8IzBfPEgpUjZGKUM2REE8PEdJQDVGKUs2VFVINiQ1LQorTS9DUEItRl0wN0dWLEBFOF4rNDE7O1cpTzEyVFIuUjRWPkZVSzoiRDUmIiBbNiZBUjEkJVVCT1ogNlNdOgorTThHISUtQ1BUMjYpRjxFQUw7Rk1BOCYlKzg0RSk1IiA9MTYpKSwnKV86VkU1KlJVKThXSVo+J01bPCRFLQorTTxWTUk0NFU5LCMhODtXOVs8RkE1LVRdQTEmKUQ+SDYjPEVJQzgzOFA6NURCKjM5KTM0MUg6Ny1dPlYkOAorTSUzPVI+Ry1DMzRdXUFHOV08I1BJLjVdMCkyXVpAJi1DNlYpQT84IT4tRDYiPVc0ITsgJUsgL1oiMzNFQAorTTE1QSw8J01LNSIgMjhXSUs6Vz1COkZFLDYnKVo6I1hNKTI0XjhHKVc6RiUvL0QwWzI1SUo8RkheLCYqIgorTT5GQF8uMjRAKCZBRzEjXTo+RyheLjYtTjxGIUI6ViBWL1VFSzokVTk+Rj0lOEVIXisxTEAlMzktKzI9SgorTUBHUS0tQlRbLjZNSzxHKTYyNERJKTdJUjlGTTUlMTRALERFQDZDOUFAWCNeREc8UCwjXUs2MzklL1VJTworTTMlRUI+RlkwOkclOzhHSUI4VjBUJzM5TzMzOU9AJllDOjRFJC9VIUM8RzYiPEVBKTM2TVs6VUBfNTMgRQorTTYmWVY8RklLNkVBQTEyPTg0JlogQUdVRjhWJF8pNV08KTFMTT1WQS02VU1SOjdJSipRVE06RllLMjI8UAorTT1YSV0/N01JN0M5JTYiVEc6Rk1APCY9MDpXSV1AJkUvQEVJQiA3KCE+QCNeQFRERzYzOSkuNkVQOEU0QAorTSk1SVo+RilKOkYpOCszOUI5J1k7LSJEOCgkNUM8Rl07MlJVKTo2QUA6N0laMSI9OkBIKVo6JERFKzQ1SAorTTY1MFYyNkFLMzVFQjxHKUg6NjlKNiRFJDE0VFk3VylaLjVFOzgjKC4jQUBUMjJUOzM3SiI2MlRbLlFMWQorTTM2KiA6RUVAKzFNUjxGTU86Mzg1JiJVKTYkREI4SEFOX0cyIzhTTEU4I1xWNTYhSTxGOF8xJz1LMSVRSQorTSszIVc/JU04LUJNKz1VQFk8V0k+NkVJSDw0RSU6NylOPzctJTYzRSg/Ny1QODNYQCZURVpAVyk7N1Q1OworTT4mIFk2Jik7PTdBXT1HKUs2VUEtNyM4Oyk1SVI5RUhQNlYtVz1CVFQxNU1KOlQwOCo2TiI9N1VbOUZAVgorTS9GRSkyNkUtMSc2KDo3PUs8RylJLygoOylQJUYgOCwgUEdNKSk0RFwrMU0tOCNEVigiNTg8SClPOkYpNgorTS4zOFYvQz1SOFUxJCwiIE0xJi1INUJUOC1GXVA4Ni1UQEVASTEnKilAR01SKzMhRjwlSS01NEUpODRdQAorTTZALVJfRkU7OkcpQjdTWFYrNF1OQEYpUjpGLT4sQUBSODZBNSo0NUs/JkxQLjM8SSkyPS0+Rk1NO1NcQAorTTE3IVI6Vyk8KjIgVDU2JFYkQ0VKPkdWJjxFQFI4I1xcN1YtUzxWRSk4J1FTOkYpQCkxQSxCJiUlKCFMWQorTUFWIFA6RylBNkQ1O0A0XFk6VylTQVgtQjdTPSk8JjlQODJELiNCVUI+R0lDOCQ1Q0BGTS84W01SOUUtPAorTUBHQVo7JllSNkVJKTU0RTg4Rl1JKTQ1QzpGSFcvVjlDOFZNKygiVUs+RzlQPVZROCoyXU88JUlJLUIpQgorTUJHSUs4JkVLOCM4LiNAJFAgNiggX0M5WkAmITkrMjxWODQwSSgiRTg8R0laPERcXy41QUY3RF1VOEVdOAorTTEjKFIsJTlCOENcQCs2QU82NTlKPkZIWSs0VVo/N0laL1JVOj5GTTo4RUBfMjQxLS9WKUs8RkFIOFcpRAorTTZWMF8vJEVGPyQ9Sz02OVIyMUxSOkgpTy9DOUI5KCFGOCQwXzUyKSU8RVFGQEYsWys0RUY8Rk1ILUI1PgorTT82LTkqU1lDQk9aLUJHTUwzNik4MTZFOzpYJS8uNiojPUdNSTYjOFw2WC1QLUFAOC1IKUsvViVINkRRPworTThWTTgvVk1KOUhKLzxGRF84JiUoPDYkSSUxQE0zNklLOlZAWTM3TVA2JFVKOUYhLT03NVM2V0ojOFVNQQorTTZWTVM2Ri1JMjVFPjtHTTo4Jk1LPDYgVikyVS86V01DMiZJOSYhNSxARy05KTFNNj03OUcsQjRAKTNaIgorTT1VNCIlMCNeMjZJW0AmWVI6JDVAMSNMUis1OUI8RyogNlVdSDg2UVc6Nj0lOkc9ODYkRSQzVilKOiVYXworTTgmRTk2RklaPTZBJC9WKVU6RjlBMTVFVj1GTUM4ViUtMSM4TTNWKU4xNU1SQCYpQjNVOSk2Jk1KMSRVLQorTTcmSFYlMjUsOSYoVik2LiJAR1VdOzZJNSUzOVI5VSFaPEVIXzVGIUo7VTgyJTVKJzonITkyNiojX0g2JgorTT84JUE2VkU7OyRVRkBUTFY6SC1OPzctODI1SVc+VyEpKlJFKTpWTTs4NFVAMTYpSjpERFQ4VkEvPkhVVgorTTojRSwxIyFJOFQwQCgjXUk8VFUoPFY5JThXPSksJFE7PEdJVj02SSw7SElXOFVNQjpXKUA2RilJOjUlLworTThFSUo6Ni1XPCNYRS1FQS08RyUsOEQ0PSYjOVI6RERJLUVJPDZWXSkuMjw4KzgpTzswJC4gMkQgX0RFOQorTTknPTA5SCFCNiQwUixEMSkzNl1LOkQxMDtWKTk7VylAKzZBUjhVOF8xJUU6NjU5OC9UNF8xNiFLPEc9QgorTTE0XU88VyE6NjRFLTxHPUI3RklPOiRUVik0RU84M0RQOidNUjclXUg2Jk1bPkcpUDM2KUo1MjRNNiVdJAorTSZRTTk+R1YlPyZJSy9RQEk8J0lGPFc9QjNWQT83JjxZJiBERzxGSU46NiEtOUglWiBXV1w8RiU7NlchUworTT5HPSk2N0oiO0dRVjglWTk6RylONCVAXDI2KTo2RUBZNiYlQjlHISsnNFVILjY6MUBGIE0rNTUpODZNRgorTS1CIFY4VzxWKTVJTzZVTVA2IyBeNUZJWj5GOF4nNUoyQEchQTVHIUkyNDUlMzZZUTIyXSU6RUk7PldJTworTTNWJUExNi1XN0ZAVigiIF88Nk02LSRFSTNTOUssJDE6KTM5V0BQJE0gMjwgTDRFLTZGRSQyJ0lSOlRETQorTSs0RT4xJi1XMzRFLTZGKTk2VylQKzVFVzpVXFYrNEU/L1NZKTYlQFIoRV1DOldJOy1ERCM8TE1IMjNYVgorTTpXKUc2RilSPEYgTSYjPUgyNEA7L0ZJQi9WKUo2NyolPzc6ITpWKUI6NEU4OVchKSYhQFY6NjldQEZJLworTSZQWDs4KClVPVcpTzZFSS84RUBNLlJEOzE2LUI2VUBfNDcsIz87IVo6RF0sO1dJXzgiVFs3SCldO0ZNQgorTTZVWTo6RlE7OCVJLzYkRS04I1heNlcpTDlFNDUrNVBZNkguKjwiNDsyVyAjPVxFQy8jPUM+RURUL0RVOworTTo2XUEyMzk2NkZNSzEiVEU1SSoqQEZBKTcmLSkvREU7Nyc1VzYjRUAsI1lSOzZVSj5GTFk2Rz1DMzNcSQorTSozWUM2RTBNLjY5QTEmXSUtQ0w7JlRSIiA2QCEvQCNeOiRVQzwkRSU6VzYnOVI0STUlQSU2RzEkMiZBOworTTdGISU3R1UpMzddUjpFRSQ1RFUpLlNZKTgjXEU4NlFaPkYoVi9VUVs8Rkk4KzFNQzxHKUs8R0lVPCQwTQorTS9VUFs1IzhNMjNETTM2KTs5KEokNSc1UjhGTUs2Rj1XO1RERSgiVTg2NjlVPkVESSNAWF5AR1VaPEUhLAorTS4zIUg4IyhfNUNYVjZFRE0tRUFARURVPj03ViM9NU0kODcxTC9CNEksJzYiOCYtSTE2OCQ6WUVRPEZMWQorTS9VQU4vQlRfNkZNKDUzMFQvUzklOUchVykxTSsgVysqOjYlNi42LiNANyE/L0RVVT5GSTsqNEU6NiY4SQorTSglRUo/ODYyPkZFRzlGKSU2R01CNyZNTzM1QEUrNDUlNCZWIDtTRS08RlE7NjNcTS1EMF8vUlReOlc9OAorTTkmPTguUiA7KzZAIT1QJTwgK0U6LCNFSC9DRUc+SC1XMjRFQDdUNS06JUU5OiZBQzgkRS88RkksOlZNQworTThWQUc3VFReL0U5QC9TIUk8JylKNiREXjE3KVU8RUBFJiVAIzpPPVo+RzojPEVdPzI0RTo7NVxeKzJVJQorTTZEPUI/OEU6NCZJUjxGSSw2NylLNiM4SS1ERTk6NjlKOjNQOCYiNUI8RylLNkVATSk1QT8xI11GN0M5JAorTSswWEAxNUBNLCVNSz84KVs4VEVBMlFMOCozXVg7NUlGOzJVKTxXLUw6Nk1OOyM4VjI3ITgvUzklNkQ1OAorTTlGRSQtRDVCOFRURSZTXVM3QC07UiYgVi1GOiQ+Vz1BNlc1WzhVSE0zNik2MjEoODM3KUY9OSoqPEZNTgorTT5WJSVCSCE7L1VJQjwkNFYvIzEpOEY5UjYmUU46ViVAODRNQTI0RTQoIVUlPiYpQjdVQSktQkRJLjAlSAorTSA1SCBXJThWKzRETSs0RVJAV0kwODYlQjglRUA4Ji1SOEZBQCsyVTs/VylIOCRdODhWSUg2REUpNiZdLQorTSs0NUI8RkEtMjRFLThWSUg1IlQuMjU5QjpXKVo+WCoiOlYhKTI1SUo+RThWL1RFJTM1SVI+RiBeNUZJVAorTTxEVTg6Rk06IFRHXjckXTs2RVFINiM4Ui9DWUI6RiEpMjQwXjYlOF4tRTk2NiU0VCNBTE02JCRFKzMhSworTUJJKVs4NiBfJiE0NSs3JTozJjlXMjNZST5HKU88RVFDLlJUVjhWRU44Ni06L1NFOjpFRF86N0lXLUI0SQorTS9VJFkpUzlDPCREQCwnKUI5Rl1DO0dJWz1TWUI7VThJJTIhJDxFRTo+R1VSOkZaJT1TXiBERzxQLURFQAorTUg1QFYxM106O1RROThHSU40JklRNlYpWjhGLUQtIVRWPVZdOjM0RSUxI1xWKzAkXyA1QCBfQj0nNCQxNgorTTM0VTo6R1VaOkNFODhGSTouNklVO0VASSgiVUdCRzlMOjNYRS9GXUI1RkFLPEZJQDYlTU08Rk07NUVBQQorTT1WTUAvUzhfOCYhVz5HNVI8RkVAMzYhOjYlSUo8RklPOCRdLTZWTVI8RUEtNTNdQDxGWVM2VERfOCcpTworTTYyVEkuNUlVPEZFOzhWUUs2I1xWL1RVOzwlREspNkVBNjZBKy0iTSs6P1lJLyFALi9YKi1ARylHNjJMOAorTSNCITs8JkE4OlYkXzM3JVo+SClbNlQwUi1FQUo7VyFSPCYlJDhXKTgzVyomQCNcVjI3JUEtQUA7OCZRJAorTSgjKUk4I106MzQxMTtILFk4RylDLEIgWTM3SUY4NkVOOVQ9UkJHKTU7RzIjOFNcWTYkRFw1NiFJOlYkXworTTM2TUszJVFJKzMhSDwmITgtQk0pOlZEXi1DKE0vRkoiO1M4Ii9QI142JUEpLUQxLTM2RVI9N0lLLUNZOAorTTQ1QF46R0lGMzMwXC1UNVo+RllDLEFMQDhVTSU4RklKO0ZRQztWVU47JUUpO1cpSjtFSSkvU1kpNkcqIgorTUBHNUs8Vk1ANkYhQjgmQU04VylSNlQ1Qz5XSVI2M0U+NTYhUzxHKTspMjVAPUcpQzEiIEUyNk1aPVUhQworTT83NUkxIkQ7LUZBUDozXEUxNiE4OlYgVis0NVJfSCE1I0BYXz03VVU8NkFGL1JMOCo0RUY7VURZMTVAXgorTTZGOVI9SElQN0NcVjI2KUo8Ry1aPVVBSjpVSUg4VzYjM1VFPz5XMSQqMlU7OiNcQCxFSVc2VU0+LUMhKAorTTlFQTo6RlEvLUQxKTxXLUI2RlBeJlQxXTpFQVo/ODlSNiNdODJTUT84NkVJNjNdODo2LUI4RiBFKzRVSworTTg0TEAtRFVLOiNcRSoyRE0zKClDMzAlLyA2JCBfRi1DMSM4Vi9UTUg8RjlIQCU0TS9DOSQ6JjlVOEI8RQorTTg2RTg2RzVaOiM4QClTTTg7RyFKM1VJQjpXSU46RkReLUcpUjY0PF82I0xFKjM5Oj5HVVU6RllLOEVJQAorTThWSUs6RikxPkcwOzI3KVI6RzUlMTVJUDxXOVc4IzBANkZZOzNVQEUmU11BNlVMRzEnSVY8RkRfJiJFQQorTTolWUcxI1xfKzgtTDIyNFA6X1lbLyBYLjVHNVs7RlFIPDY5JCoyTTg4Vi1QKTFVJDI0RUI6JSFOOyYlKQorTS9VRTo4R0FOPkg9UDsmUS86JlFXP0VNQS41TVc6NE1BPCc9OSozOSU8RylDOjVZNTI2IVA7VUktMzVJSgorTTZGSUoxMzkvL1NNKThWPTs8RylLMyRdNjomWVI7VUE1LUIgOy9VQTo4RkE2L0NZKTI1TUo8Jk07NlYgUgorTSkzTSk4VkIiOURcITVAJUkgKz1DOEVIXisyKFs8JVlDNlc5QywjOEAmVUFaOlNENSk2RU06RF0vQCZZOAorTS5TKE0sJl4iPkYpLTI0QVo+ViE7KTIhOTpVQSkvQ1xWIFIiKCs1UVI7RklKO0ZIIzhPWUY+RlVLOFcpVworTSs0TTozVSVWPCYlQDNWSUY8Ri0+L1YlSzE0XUkxI11CPEcpRi1DTTA8Ry4gOyMoRTglSTg6JkVJNiNeIworTTpURDsvR0FaMjFAODEmSVo6VUElOEdBOi5TXTg4ViVLN0U1KzgmISg7VUBfMzYkXCo2RUY3RUlGQFdVTgorTThXPUo4RUVLQEYtRixDOTY6NkYhPEcpSTI1QSs4SCFMOFYpSThXJls6VllTMjI9Nj5GSTY2VDBFLUYhSQorTTo1XUI4RylSO1VFLTZXKUY5Rl0sOCNQOCNCRSk2JilPNlYhKS9TWS08RzlSOERdSzZCIFYzNlFSOkZAIQorTTpQJVIgL1lLMyYpTSRBKFY1REFBNlY5Vy9CVEkmIlVOOjI0Lik2QU43Jk1LPkcpQjIyVE0xJUVdQEcpPworTTYlOUo+Vk02LlQxOTolSS02JUUpLUNQXCxDWUI7VUU8PkZJSzpWIS06RFE5Plc9WjM2IUEzNDU6O1cpVworTTg2RTo2RilCOyZNSDYlRVA4NF1CPkc2IDxGRSU4RVlOOkY4XzZGLUk6VllTPCYiIjpUMDgyOC9eQkclOAorTTE0RT8+VlEkJlMhUzwlRSssJU1XOlZFUTgkVUYyNFVIL1M5JCkyVTk2NUBfNlcpSzomJUo+RyBQLjctVworTTwkTE0uNUE7OVcpQzNVTUkvVilaPEVIXjMlWVIzNSIiOVI1NT1XISU2NUBcMjVBSTxGKTA4RklSO1VBLQorTTpHKVI6RyE2OkZUXycyISk2VllaPEZdSTI0MTg9VylSOlVJQzokTTUxJU1DQEQ1MCA3SCE9MCJUOVQxSgorTUBRTDIxJFUkOEZNPDpWLTg1IzBNOCVcTSgjOUw8RilPPUdJTThEREsoRThfOEYpQzY1XVU9RzVKNUNZKQorTS9GRUczMDFAX0ZBST01XS84MzhSPVYpLzMlQSU2IzheO0cpUjlGSVc6RFRWLCYqIkBHLTkxNUE+PEcpOgorTTI0VVI7JUVDPEYtUjs3NVI9Vi0vNkY5SzwlTT46Vk1KN0Y5XzZUMEkpViooQFgqIDNUQVI8IygyJzVFSgorTThVWSQvRilCPVZdNjI1STguNEVAODMoQCs1RTgvU104OCM5JTlVSVI8I1BFMVgtUjwkTFY2JyFDODxBQQorTTI1IUYvVUlCNUNESSo0XTszNU1aPVM4RzgmLFAyVV05NkM5LzxGPSUvVD1CO1ZBOjpXKVo8Rk1KO1cpQAorTS9SVSQ2JyVaO1VZSzM0RUI2VllLOkVJQjQmKVc4RiUpJlFUITogJUYgLCFCMyZaMSkxQTU2VUlIPEYtMQorTThGKTo2JE0kL1M4WTNXKVU8RylKOzZJKSsyTDgyNiE4LjM4UDZHKV1AVkElLCJUTThXPUk2NU1AOkcqIQorTT5WTS82IyhNIFcrMzg0VS02I1hfOiYtQjs2TVU+RihSJTJdV0InSS8uNUksO1ZNQTEzWUk4VUFIPkZNOgorTTImSVpAVyUlNjZNTTxEXS82Rl1DM1UlSjYjOSQqMj0tPEhKKjslJUo6UlRHKTM4UDI1SSQpMjRNO0cpQworTTg2LCM2PjVIPVMoQC0mIUg4JEU4L1FARTJVRVA6VUBFLUctUz5XIF81RylcOjRVOjM0NF86NiBeKTE0SQorTTI1QF4xJklaPEQxKS4zOTg6JUk4L1RFSjhURSQuNDFHOkYtRzpGTVI8Rk1LPEYpNi9FQUA6RylHMzVJQAorTTM2JSk2RylHM1ZFKTQ3OV08RiRJJlAlOSA2SCBCJUhQNkhJOCwlQUMhJk9eODVBMDM1QUgqMUxJMSYhSgorTTtIKVU8Ri1QMSFMUikzWU02IzBJKjNZOTlHST8vRDBJKCNZQz5FITk2VUlOQEc1QjM1QF8yN0laQFchLQorTTg1TSUvViE4LjYpRj5YQUMpMEQyNkgtVzgjRF4uVik6ODRVLzNUNF42R01MOFYtSD5ISUwsJEFaPTcpJQorTS9URUM4Ri1DOjYkTTEjOEktRFVVQkdJLzQnLTg3RVk1XSJETTUjTDgmUlU5PEZNWkA2JF8uNikwLlJEVgorTTI2SVI4ViEkKzNRNTonPVI3QjRXOlcpXTxGJUM2VjlbOEVMXyszIU87NERJJiI1JDIyVDsvRloiP1UwPQorTS8kRUI3JiRcLUNdOjZGIUg8NjlOQEchKTE3PiA8RF0lMzVBQjpXPVc6RUhQK1YhOzZDOFk2RUhZPDRdLQorTThHSVU8RiRWIDYkITxAI146I107O0cpQTM2KVI6RSFDPEcpOzI0XT8uMSgyKTRFQzxISiI+Rk1IN0NMVgorTTg2IUgyMzBULyVBOThWTSkrMzk7KCEoVjolSTg2RU1OPlcpOzM1QFY2JllVQiYoVDhXITgyNFxeKTMgXworTUApJVAqMFg4MjcpRjpWJF4vVkE5OFZRQTJUMFYtVj1BOCZNWj04LUMtRDVbQEc9QC9TRSk4NylaNkZEVgorTS9TWE1fQzktOEc6IjZUVUw8JU1BOjVRKTgzXFIrMzkpNkYtWkBHITgyNlUtKzNNJDE1SUs8Vyk5L1VBOAorTThXIVM4Uzk1N0dKIjpVTVE2VDFSQidJQS9TOUk6NERSKjJUXzgyTEApNiolPzZATS1FTUo8RExXLyRNOQorTTEkMUs8Vik+Plc9QTYnKiM9NiReL0VBOjtHPVI6RiBJJENdLzYjWF8yNDBHOFZFODYlIUY+SClXMzAlOgorTSA3LCBfRk07OFZJWjpVOUI+Rk06OFcpVj4mIS0zJTQ4I0BYSTI3SjJBJzVSOkVBKTI4QiM8RFRSKzNZSQorTTtWKUg1IkQyNiJELiRCVSk1RV1IPFdJUjomKUItQ0UlOUgtQCwmKVI6VlFIMjMoKSZWSik+RERUKzVBSworTTdHKVMvREVQOEYtSzgzXTk3Q1k5MTVBQj1VUVo8NDU4PEdNWjxUME0xJUVSPzc1RjhWQSUxOV1AOlYpPgorTTExVSw6RylQMSFMRThHSUI0NUE4L0FVODg0NF8sJi0wLjJVKSBWIks2VilSPEZZSzsmRTUvIlUtPTdVUworTThWUVM4VU1COjZRVj02VUM2Q1hWNiZBQDM1XUo2RUxZMjdSIjswLVJMJ00kKzU1QDdDXF44V0lQNlcpUgorTThWLUs+VylCL1VBQTM2SVA8RSE4LEFARTI2LUg5VTkkLlVNRjpGLSQ0JylVOFAlSyA3KCBfRi0wNkVZXAorTT1UPUI+Rk04OEcpVT5GXS04JUA7IjBYOC1GTipCRlU+MzM4VjEoSiVARl00KzJVLDtUUFc1RSA9MjQwUAorTSUxQFsxJiFQOFcpUjtWTUs2IlQ7L1dBUC42KVU5JylSMyMoKSYlRiI9VU0+NiQ1KSwmIU8uNUFBOjZFQgorTTYjITo6I11BMjRVOTckVVI+JU05OFZRWjpEMEktQzlDPzclOzNWIFYvWiFaO0ZBQzYyNE0yNVooO0NMUgorTTZXNVI6Vi1PLUJVKTYkNTQvRUBWKCFNJTZQLThQRFEtNlYtQzo2LTkyNiFROldJUjdHKUs2VEUvODY9UgorTT02OUE4I10pPVgtSjlHIVI2IzhFL1dOIjtHNVI6RiE+KTQpQDYkRF8zJzVONkYtQDEmTUM8RklPOCAtQworTUYnSVM+RkFAMjMwSTYlSVI7ViEtOiZFQzpGUSQzNjlKOFApWyAvWUYzM00tPUdVJDM1SSwtJiFKOzctVQorTTQmSVAsQTQuJzNRT0BIVVoxMlRJKzRFWj4oKVU8RVkpM1ZNKSkzOTYxJTlJODIgOCxDUSU6NFU7PEYpQgorTTdGIEAmIjUtOFVBTjpEXUZARUxWJiIhQD5HPSQuNyFJLUEoVjgjOS8xNUFJMzQwOy9VWEcvVDEsOVQxKQorTTsnKUMyMjxfPEZMUCs0MFYvVz1SNkVNRis0R149VTFXPkY4TSgiNTo+V01IMjVJUjo3PiA9ViElM1VJKQorTThGQUYrMFg4L1RVJS9EVSktQ104OCVJOjYkRUA+RilLPEcpTjhERSUyNDEpOFYpLThWLTg4SCoxPEZSIQorTT8mJEkoIlVKPkc9WjZTWFA4IkRLL1NYXy1DRUo8VFE4OiRdQDg2RUk4RilILjRWIj5GSUI4RTheMSREWQorTTo2XSQxNilLNkVRRjhWJT9ARDExIDdIIT8wI149Nyk4MTZJWjokRSkrMUBeNTRVW0AlISw8RDRQJTIgUgorTTMnSVY+RiRSKCFMVjpXOVY6RjlSPkgqIDpENTsyM0UpOiZcUClSRTg2JUlAOFZVSjYlTTsxJllGKTI1QgorTUJHKF86SDVaPCM4TTY3SVs4IjRQPCZUOy1GQUA4MzkvPEYpPiozWVE1MkRNMjchOzY0XUI6RkRcLERRQgorTTIzOSQyUzkpOFYtQjwkRF5dJkUoPEgpWDdDIEU4VlVLOiNFLTo0QTk/OClSO0VFLzNWQUs4UzAuKCRFLQorTTI0RTg2NUlCNiM4RS9FSUA2ViBeLCY6IztHJUkyNDUkLUVNRi40XUk4NUlCQEcpNDtGWUIrMUxCMzZJSgorTT8mXUY2VFxSKlQxKzUzOSk4VyklL0Y5Vzg1QTs8Rk1CL1FARTtXKUg2JFE4L0QxKShGIUsgVUIpNyYpKAorTSxDRUI8NEUlIDc4IT8wI147R0laOiVNRjtTIFYxM0RWMSNFUkJHSTo6RTk1KzNRQThXKUo7RiBWKjJEXAorTTNXIU47JilEPzhGKjxFSUM4MzhQOjVEQioxTSk4JDU2OlZVQjdVWFYuN01CJlE0Vz02XSc6JkFVPzRETQorTTM1UVZAMlQyKzVASSZVOUM5Qj05PiZJUC9TIVM7MjRWNjQwUDhHJUY7R0lKNlRFJzomJTgyVEUvMjQ1JAorTTxGXS9fRiFIOlZZUzZTTF44VylLOFNQWTg2JTo6V0ojPiZBMTwnPVI5VTQ1KTRVOi40RTs2VilWPVJUQAorTS1FQUA2RUBeJlQxSzM3KiA6NiVAMTVBUDY0VUI4VUxfOUgtSzhWKVA3QyhSPSRRJDhHTVpAJi01LUQ1QQorTTg1QUE6NyE1LUVJSzhVQSU4Vy1PLUFARTg2XUo4JUk5MzVdKSk2RVM8Nik4OUclLy1CRF45SCk6MSAlSgorTSA3SCBfRjFGO0ZVUjZVQEUlMlRcL1NYWTwoOig6VUk6OUNZJDtHSUo6NylBL1JUXzg0NUk3JklLNCZaIAorTUFHVUY4ViRfKTVdPCkyTEArM0U1MzZJUjpVWSkmUlVDLUBELic2SVo4VyEkNjhBKy8lTTo8KClBLjIgRQorTS8hQEU2Jjg1L0ctJzdVRSk8RyhNL1ZEWyUyTVA7RzYqO0YtUDpWUU86JFUnNjREViwmTVc2T1ktOkZRQworTTY1WFAtRD1GPEchKSwlSUM6Ni1LQEgxTjM2KUs8Rk1GMSRFUDpDKFY2Ji06OzdZPCozKSk2JFUpOUJURQorTS9TWUM8Vy1MOERVSDhVQTg6RjlAKzZKJjxWLSU6RikpLlZJLDYmRiI+SC0+OEZUXi1ENTk2VkVLOCRdQworTTpGKUkvVEVDPFZFJTEmLVA6Jl1SOiVJRzZFNUI8R0lKMSY6IjhWJSQuNl4iOSRUITNQJU8gL1laOEVROworTTpWRTYvQTRAKTU0Vi8mQV0/NkklMlVBQDE1Rig2VUVXOjNcTTYnIS04VFFCQCYpOz03QV09RylLNlVBLQorTTcjOSQvUzA7L1YhQjxGXUAyUUxfOiQwRycxTUJCR1VbODVCIi9TOUE8J0oqPkYgTSs0NEAlMlRWIjI1QAorTS9DIFk4JllaNlchSzUzMF82VF1GQFZNLz5IQVs7Ryk5MjVFNCkxNS08Ri9eODZNQzpWLUs2NExWMTYpWgorTTZSNF86Vk1JOFcuKj82TTozJU1QOFRRNjxGTTgxJFFANjYtUj1TXF8xNThfL0ZdTSxCNF82Ni1GPFVRQworTTojRSQ2JilOOiJVLDxHPUorNEU2NURFOjdWQUs8R0ooMDRVWjtCVE0tRDVJOjRVODo2TVM8REU0NlVZUworTTpVOSg8JFVQPVcpSzpGOUMuM11OPlVRQj01UTozM0VLQEZJLCA0MCE6UCNeQFcpJzZHJUM4RiRSJTFAVgorTS9DWUY/NzVLKzJUVjwmQS09VU1JPVYkXy1EUUI2RUBQLEc9UjlFLTxAR0FaOyZZUjZFSSkzJUU+KTJVNQorTTM2IVc2VFBeOCgiIDpSNCktR0ldPUcpQkBVRFAuNklaPzhJSy9FRUEtIkRLJTBYOzglQFYrNiFXPVVJUgorTTomIUA4Nk07NkZZSSwmLipBR0lKOCNZJS9BQC4rNV0wX0UhSjlHQVI8Nz1TOCU1OTpVXE0vVi08O1chRgorTT84KVU8RUkpOEZMXzEmUUs2JUEtLjRVOjhHLUgzVEUpNkZCI0FWRE0vVDU6OUdJQjhGPE0oQzhfPVcpKworTTE2KU48RUBWMSQxKTE2LU86REU+PlVFTT5GVTsxIzhfOiVATSszRTxASC0sMTYlJThWRTg1RUUpOCZJUgorTT03KU84QUwyLjdJVztHKUIzU10pOFgpQjEwJEUgNDQgX0dJWzE1OUMxNUlSO1NcWSkyVSQ4VzVIPEJENQorTSZVQUs7VykoOVZRJS9GLUk2Q0UpLUQ1SjpGOUAzNzVVPFVNWkBWLTs4NUFAOjNQSS1FNSQ4RUxeODZRTgorTT8nPFwoIlU6PkdJRjhHPVEzNTFMPlcqIj5WLUY6NVkpNCQkQCxFQUAxIzktOUcpQjM1RTk2JFVaPEVJOgorTTgyPTo/OD1aOUYtODIzXDUiMUBfMlpEVi1VSVo3Ji1bO0ZdQDglSS02NiVDNlYtTDpXVVI+RzlQNlYpSgorTTdFXVo6VF04MzNFJDgmITo2ICxfVSYtUkJHVVI6NUxfMzYtWj5FUTg1Myg7KVZNUjdDRSQ4Rk1DMlNZNAorTS9SPFY0JlE1MzYoWTxISUY2VURWOjghNSZRQEktRjooOiRdOjE1RUAxNFBZNUU5OzlHSVo8RiA7JTFNOworTTtGOU06RU0pOlchSi9AJDsgMjwgX0giKjpGLTk2RkVSOUVBQCsyVSU6V01SPENcSSYjKSg+RzVCPEYsWQorTTU2OiE9UzhWOCc9UDMlTVI+RzlVOkRRTkJHPUM2VFFIOlU0Wys1QUEzNERCL1ZdUjlHPS8tRE0tOzgtUgorTTlGVVczM0VJPEZNQzlHPU84Ri05NlY4RTU1TSkyNiFPPCc9SC1DXFYrMj1LPEZRVDwkMUs/OElbOFVNSQorTTg0REkiMFhNMT9YQCZVOUovVUohPEZBQjglTSk2RiVDPDVNQTlHKVI9RzVSPEZdRDI2XiI8RkEtMjNdKQorTTM2JF8tQzhbKzZJRkBHSUM6Ri01NlVZTkI2QTg2VjhJJlQ1Qjw0RSkyJkE7OCNERSszUDstRkVJOkVAQgorTTZILUwzMzhFOEgtTy8iIFI1MzlLQiZdQTI1XUg2RFUlMjU5KDZHNVo9VEUkLEFNKTwmLVI5Q10tPkgqIgorTTpVWCExICU0IC9ZXUJHVUw0Jj1SPEVZOS4zOSQtQ0VQO0ZNSDo0TE0sJk4hOFY5QClURSkyJyhNJzVJWgorTTYjRTY6R0laOUNYPTZJKiI8JiUpNkYpKy9FRUk2RylSMSI1Qj5XKVIzMzhfKzJdSjxFUUA8RlFAOiVJQworTTYjRTo6NUBfL0VJSSo0RTQoIilIPkcpWzxGLUg1MUA4MjYpLDhVUTo8WColPzZNSDpHIUI3QyA4KCJHXgorTSgiISk4UlRQPVYpOjM0RTkxNUlRPEVZQzglSUs4REFdPlZJXz1TOUs/NzVaOUM4VjYmSUg2REUpNiM5SgorTTs3NVs7VFxWNiYlUDsnKTovVEVJOjRMXjZGTUA4JU1BL1ZBNCoyVUAsQjVNNjY5UTI2LiM6VURWLyVNWgorTTxWOFwyNUBWL1dJTjZWJUg8Jl1INiU5QDYkVUo/NyE0ODZERytWQTs3Ry07M1cqJ0BHISwgNkAhOkAjXgorTTpYKVw6RiU6OkdJUjoiPFY9JDA7LUYtOjxWWUgvUjU6PlZNSzlSNFY1I102JlFAUDdUKE02JUlLOlQwTQorTSk1OjJCSClINiREXyszOVA8I0VIQkZANS9GSTw7VUBeNTIgQDElQFk2JylaPlcpQjsmKUA3Vi06LUJVKQorTTgzXSktQFg1LCQ1LDQmMVU9NzxJI0IoXjUjXEcpVUlaPTc1RjpWTU4+Rk0+LlIgRV9DUFY2VyRcKTVBLQorTTokRSQvIjUrQFddLy40VUI8JiBHPEctQzxHLSU7JzVSO1ZAViszRUo7NFE+MjRFRjhVUTA6RjxeKTNZLworTTsmUUMyMzhWMzc5VzM0VUo2RyFAOFU1QjVDOE0zNDBSOiRNJT5XJUxAVyk6MjREXjZHNVo8RyVAMSNdRgorTTlEXUE4Vy1TOyZFNjhWIFk0JklIN0VBODUzOUAzNDVSPEYpRj04KiI4UCktIC9ZJTpXSVU6VU04OSgpTworTSkyVVE6M0xFMjQ1SzpGTUAsRTlSOEVNSzI0RUEzVEReMSNYWS1BVSk2RUFGKjIhOTpHViVER0kpLUIgOAorTSk3KVc2JU4qPVJEXzg0UUs7NUFBLyNRODYjOFA3J0oqPkdJVzpXKVc7VikrLyJVJTI1QTUuMyhWKjIoXgorTTElSU5AViRUKCI1ODIxTDgxNz1OOkVZLzomOVU7VkU0LlM7XjIzWUE+RkBbLURFVzgjTEAlMlVPPlVEQAorTSs2IVM6I11IOlYpSjpWJUo3VSFHNUMwRSc1LF4vREReLUYhSDVDMS0yMyBcMSVJUzxGKTY1M1klOlgtSworTTVGISU6Vk0vPTZJNS5SNSUsI11aMlNdUj5HKV08Vi1BLlFMRTpIKV1ARi1GO1ZNOjdGJUM8VzVLOFQxQgorTTwkUSU2VUU+L1JUXy1SVFk6VyE1LlRdRkBHUiMgNUwhLjAjXis1QU4+RlVLOERdTTwjXE04SCFQL0NZKQorTTdVSTk2MzktPFZdPDhEUUM9JFEkOEZNOSszUE0zNik2MjEoODM3KUY9OSoqOVJELiNBNTBARylCPTghQQorTThVTE8zVklLOFNFODsmIFwmUyFTQFZZVj5GUVI+R0lSOjQ0RSs0MUA8NyFBL1JUSS1DRF82N0lSQCU0UgorTTYmOTsxJUVaPEZJOS1FQU85JjlPN0VdK19FQFkzN0VSMjI1JD5WQFIlMUBNODZcXCNBTF46VylXPlcpSgorTThFWUE6RERQOlVBODUjTFspMlUkLlM5LTpVXSU2M1xHLCRFLzsnLUAtVEUpMlYuI0BGSUM4NllbNlcpSworTTZEMEAyMyhWPTYpOzo2IUo+R1VROjQ0Syk0VVI+RylDOyctQzZWKUk7JzlVOzYsRzEnKT82RiU2MzM4RQorTS1TOEsrNF1aPTVIWThIKTA+QCVIIDM4IE0xTF88JllGPTdJQjQmIE0lMyFKQCVdKTUkNSU1Q1heMTYpUgorTTxFQFAzNyksNiZFWjlTTFYvRilPNUJENSgkMVI2NUlaPzc8VCBQWlktRylRPEdJSzhHLUMvQ0U6QCZATQorTTMnPUIxIUA1MTctUjY0XTs8RzVVQEdBNCkzKF84Ni1POCVBJDEkTSUyNFFDOUg5UjJUXUs8JklCIFcqUgorTTgzOFA6RkEvOlctSzg1QFYxJk1JMTFMTTg1QTUvIzEpO1Y8SSNBNFIzNilaQjcpSjhFRT44RExQOCQxSgorTT1WIUExIzgjL101ODhWPSkyVTBWLSM5JTYlISkmUjRNL1RRUUBGVTw7JlldPEghOjg2MFY4M1hfNCZNRworTT1VUSw+RllLOjYlJDgmRUo7Ri0+PEZNOzI0XUE5VylVOUYlKTgmKS0zNk1ANlRMVjdFWSQrM0VKQFZIRQorTTZERUIgNiwhKzAjXigjIT46JFVOQEZJQjYiIC4qNEVOOSRVSDEzOF4pVEU4MSVRUjhDOSk4RUlIOlcpRgorTTg0RFk4RylDLEIgWTM3SUY4NkVOPFY4UCNAWE06VlVVQEcpOTpGSTgtRiVdOlQxJEAmXSknMTRFMydJTAorTTY1RTs6VjlWPVREOygiPUA2RlFANiREVjElRVAxI1ksQFgtSTE2TVo8Rk1LOUc9STUzOUM4VE1DPldJUgorTV9GUUA2Jk1QOUMwSSkyPTg6NEVDPkZEQCIxQEkvVDFGPzdJOzM0VUAzVUE6MjQ1RztUUTk8JVhfMjNdOgorTTo2ITY2NERfN0RFODglXSQrMyhJLUM5JDtGSTo8VylGPTghLzg2KTYvRUE2MSRFQDw2QTYyNEUkOCVJSgorTTM1OUI2Q1xNNiZBSjokVSU7V0lKPVZFODolXSkyNik6NkVFKTonITgsQjU4Pkc8UjYoKTs6UCUvIDM4IAorTV9DXSs4Jlk7M1dVUjQ2IFwlMlU2OUZJOztGIFsoITRXN1NdKTsnIF8xJDVDO1ZJOzQmLUA2JUlKOyRcVgorTTEkRVM8Vik6OydJSjlCTDIrNilaOzdFWjpWSU8vUilAPkVRPiwnKUo1QykhLyI9SjxGXUg2RU0xOVYoTQorTSgiIEkvRFFRPVZFKS1CVF4/JVxFKTcqIzxDRS0+RzVSOkZWIjwlWFA2JUErOlcpTT8/Wik8RUVCPldNRgorTTYhQDgrNF1BPCdZUC1CRE0tRUFAOCUhTzpVQSU2Q0UvOygtUjZENUI6Jk1INjRFLDZFTSkzNUhWKzVJSworTTwmKUI2IyEkNiVZNTYmKTk4KCIgNlZJUjE2XUo2NEU5NUYhLTEmKVo6NEUvMSRVJDxIIUo2NUBWKCNZOAorTThGXTYuNkVSOFcpWjhFRToyM0UpL1M9ODlGQVI2IjQ4LyctXTgzWiIzKCAhNlAkViAvWFkuNUVOPlZJWgorTTxGKUM2QzhXL0Q1Uj83OUs2IkxNNiYpNjI2SVAyMzxHLUUhTDYkNTg4RyFPNkRVLTZGSTo6RkklLURdWgorTT5GSTUpMyhZOkddQjhHSUY7VDBJL1ZJQjVDXUs+RiRNMSU4VjgnLVo7NiktOicpOCoyXTg7Q0xQOCgpWgorTTgkRFwuNylDKTBZLD02TSkzN0laPEY5TUBHLUsvUjRNOCctSzZXS15ERz0vOFdKIj02WSEmIyhNMldJUgorTTM0RS02JiFAOEZNQC1HSUozNiRNLUYtWjhUVTg4RilNPkctWjwmITgvRFVGLUFAVjpXSVI4VVxeLjYhWAorTTwnMUAtQlVVQEctSzwmKVI9Vik6MjNFNjwkRFQ6RylSOkVATSlWSilARik2NTQkVi9DRUM8JFUoOlVNRgorTT5GSTY6JkBbKzRERTE2JVI+RkBFI0FVQjtHTElAQyFSIDYsIS9QI14qMUxeO1dSIkBHSUY6VU1BNjRFJQorTThHNiY9NFxHL0ZNUzpXIVI8Ri0rLyFMVjo0VFYyVyFLO0ctKSlVOVo6RTk7MSI0VjxHVTo1IlRWNiZKIAorTThFTU4zVU1CN0RFSzxFRS88R0lLN0I8UC1EXVpARllAMTZJWjoiREUxOSE2JlJVUkBEUFk4NkFbOjI0LgorTS1HISwuNUlaPlcpQzcmWUw8RiRAJTNFQzpUXUpfSEoiNiU5SkBYLVU8JE0/N0RFSDpVQTg4Jk1LOiZFRgorTTpFQVI9Nk1KLlIpJTlVOTs4Rk1KOlZNTj84KVc6M1xfOEVYOy1GIUs9Nz1MODNdLzpEVSUpMyhJMzc1WworTTtWKVJAR0lOPEVYTSwmQUgtRDU5Ozg9NiZRNF5ASElaOEYlPzgjOEIvRUlDLSVJQDonKUo2NklGMjMpSQorTS8iVSk8R1VQLSFAOy9FSU4vWChfOlAlSyA1OCBfQjRLNjZNXT5XVU06JiEkNkVBQzhGRVJBR1UtKCJVOworTT02WVpASClTOkYgUik2VFklMlVBMzUiIjlSNTU9VyElNjVAXDI3IVs7VVhSKTNFQkBHIUo5RikwN0ZNKQorTTZHNUM4R0lOOFc8Vi8jKFlAJ0lDLUM5OjlHPTUpM14iO0IgOzI4KVAyM11CQkglPighTF8pMVVAPkc9UgorTTpWXVU9RzVGLSJMTTNWRSUxL1laQkZEUDE3UVs9RylJMyYpUjI2JS82VUlOPEcpSTZWSVI8V01OOFU0OworTSs1RS88R0lDOFVROzpXTiM/NyE4NiZJRisyVTgzNilYOjYpLTZGTUApMUxWNiVJPDpGLTY6R0lSPEdJSgorTThFXUI6VDBJKTQ+IjVCIC4mVUVaOzZJSDQ3PUEvRDEpOiVBNjMlIUI4VkVKM1VBODpWJEUsJi1VPEZFNQorTS8kVVA+VUYiODcoITpAJSQgLlhAL1ZBO0BHNV05RVE7MyNYVjNWRTk5R1VaNkIoNS42KT87SC4mQEZNLQorTTEjKUgxIUxNL0Q1OT5HPFYpViFDLCRNPzY1SVM9Nkk6MTJURStWOV08RlVLM1YpQjglSUs8Jz1TNyZNVQorTTElWSQsRyoiOiI0OyszKUo6NUUpOyctRikyRUs7NERALjgqLT5FWEkmUTQ1LUAtOl9GKUs+RzVaPERNJAorTTI0TUE2NUFRQEcgVi9GLUY9NilAKVQ1UC9URSQzM11COlcpSDomLVI+V1VTOFNcOCYiVFA4RyklMzRVLworTThXKVo+Vz1KOkc9PixDUSsuNDVQOlVNQDo3KVA2M10vPictUjpGKS03Vl1KOkZNMDknXVo8RUBWLURRTgorTThEKEkoIlVAM1VFTTEmLVA2VUBfNjc9STIzOSk2JiFALCI9QTo4XUktIkUvOFYtSzolRSQ4VzlLPCdIIQorTTxAJSkgKjBJL1ZNLztHSiI8Ri0pL1RQXiwmLUI6RllOM1UgQC5TWFYzV0oiQUZNJSwjXVo7U1wjLUxUVworTTpHSVIxJERZLUVBSDZGLVI8Rz1ONjNcTSs2LU47RilDNlZBOjhXIUo6RzVLM1VJSC9GRVg2Rl1aNUFALgorTSYjUUM6VlFANlZJVzYjOUA6QzgyKVYqJkM4KFwoIVRJLENZJC9TXFQ6UC1aX0VAUDg1RSkyNkVSOzdJQworTTo2RSg5Ry05LUVFSTg0VSQtQlUvOEZZJTZWXVo9RzVVPEM4OCNBQFY4Vy02L1QxOjpWXUIzNklXPEchJAorTS9VXUktQzk8OkYpSDpWKUs9VkExOFc2JD5GKF81RklCNjVdLDFXJiI+R0lPOjVNRjpWQT4vIlUkLjQxNQorTShDXVA4RUBWM1dRWjwlQTk4RUlAL1MpODpXLTUqMlRZOzhFTDMzODsrNjlQPVcwITxAJUAgL1hNKVYpQworTTZGTVU/KC1LL0VBNiczRSw8WClONlYlKTVEREktRj1VQkcpKSxDOVU+Rl0pKzFMMi9GWiI/VTA9LyRVQgorTTdHKUs5R0laPEZRKy1GKU48RFEkLUZFQDEmQU5AR0kwNjRETSlWRig7RzYiOjMwOCZUTUs7RyktMTRRUgorTTolOU89VlhUJlI9RkE4NUk1NV0+MTRdPjE0MSQ2VllaQCYoRTMlSSUyNyNePEUlSjhGSVgxNDVSOlYpSworTT1WXUgzMzhFMjZdQS4zIUg8Rk1KOEYpNSghNDsyNk1aOlVEXzE2TiE2MkRZNycpSC9TXTk9VURWLUVZJQorTTM0RE0xJlFSODJNOj84KUsqM11KOiU5KTI0NSQ6R0lcQEdJSzpGSVI9JExWLURFQDUhTEU2JUReNjYtXAorTT02TUI2Nl1ANkYlQDo3KVs6NDBAJlYhUC9RNC4iMlU7QEQ1JyA3KCE4QCNeKzQxTzxFRSw2VlYqPEQ1KQorTTgjOFYuNkYiPkc9UzwmSUA2JTU7OUdVWzgzWF40J0lcPCUwSSYiNUJBN1VIKzM5LDY2LUw9VlFPPDc1WgorTThFQUg5Ri1AL1IhJTojRSU2SCoiMSNYXCYgRSQ+R0ldQFdJQSkxQF44VylQL0MhJDxHPTozVildQCVYVgorTTE3PVU7Jk4gOEVFPjdDTSk6Jl1GOldJUjJWISUrM1lXX0glTjhFJTo9Vi04NkdJWjxHXVI8RiBNJiM9SAorTTI0QDsvRklJOiRVJTo2LEApNkFaPzZMXy1DKTpARl0kLURdTzgkRSkpVV1MLyJUWzI1NE0mIVRZOlcgRQorTS1GOV88QlRHMzZdQTI0RSQoREFROzgpWTtGSUo9V01QNSJUXztWVF8tRFVALUNdQz03NUIxNEFDMiRVSQorTTZHKUI4VUk+LSIhLTtVNDIjQUBNMzgoXilQJSwgNDAgX0JEXjY2TU84RylSPkcpSDVEVT43IyEkQDdVTgorTTxHNVIzNU1XPCYpUj02SToxI106OSYxWDgzKEUzNlUzOVZFKTglUUs3Jk1TPEcpTjtFSTA6RUkpODVYRQorTS1GQUAxNUFbQEZAViZSIEssJilLPkgpWjhTKEApMyFAOlY4Vi1GQVI5Q0UkPkdWIDo0XTo4RylaQERUWQorTTgkREUmVDVSPEY5TjlGTVAxMUxFMS9ZW0FHPUA2Rk1IMjQyIEBXSiY+RzVQMSJUXzcjTTQtQlUtOiZNQQorTTJVSUMuMlVCQEdVSyxBTEU2KClaOiVBOz1XLUI1MiBWOCREUis2JVU1M1BNLVVNUTdDOTg6Ri0pLENEXgorTTIzWF4yMzhZN1VFSjtGXUg4RyldQCY8Wy1GIUcvUzk/O1UwUDpHNVI2QyBeNiQxLDdTRUgzNiUlOEZFKworTTw3TUAqMkRSMjVCIjYmICE6MCU+IC9ZPC9TOFAuM11SQEcpSzZURFk4Vl0pKzVFWjlFWUY6IzhZPTgpQworTTM2XUg2VkVBNiQ0X0AnKFYtRyFDKVRBTzI2TVI4VVFDN0ZZUjpVSSk2Ni1JMlYpTzBCRF41QzkkPkgxUgorTTEhTTg2MjxZMzY6Ij83KUM3RCRAL0VNQCsyKSQyM1xFLUZNTjxGTFwmUj1GQFgtKSlVRSkqMFhFOVcpUgorTTwmIUs+JjhbLlVHSDlYKV08Vi06OCI0OzgnXUs8R0laQFcpPzgkRF82RlU/MzYtTzhWJVA2MVQ7MjcpVgorTTozUDUlM11XPkZJODE2KVA2RkVGLUVNNi8iIFk7VU0lMjVBQTw2QF4tQyE6OiYhNCszOSUuU0U4NiYhQgorTTlGSUA3RUVNPkgpQjg0RTY1QlRNNic5Ry9HJiI+RigjL0hFKThWIFY1Ri0/OlQ8IzhIRUE2JF1AMzVJQgorTTdWTCE+ICYgIC9ZVzZURFIkQU1APkZRQzgjOEU2VylQMjQ2IDokVTA4IiA7NkgpSzNVOSwzNyFfPCRVLworTT9XPF4tRkFCMjVBQDE2LUs4RUk7NlZZWjxGSSkvRFFJOCZFWzojTEcvQlRNPChKIjIyKS02MjRNMjYlUgorTT03LVI6ViRfMjYlRi1CVF8vUkQ1KzYpWj5WXE0jQFhQOEdNKSk0RTwsQTRANiZFUj1WLUM6VkUpM1ZHVgorTTpXNVY/JyE/NTIgLis2KUg4Vy1aPkgpUjhURF8zVklaN1ZNSDM2JUs4MkRANicpUjpVRFImUzlKPkZVQQorTTYmJTsxNUVTNjVNSDUzTFwzNDBQKzNZQzwmTT8vUzk+OEghTyxCRFYvVEU2NjVJQjxHJUg2RUVCOSdFQgorTTMkMSkxIyhNMTY9LDYnKiJARk02KzI0VjhGSTo2Rik6PEYtOjZALUJBVkFGNyRdSTpWKCE5QCVVIC9ZWworTTxGRSQiMTRWNkYpPDZDUE0yNk1SPEYqIjwkUTo4IkwyKzYtVzomIFYuNU4jPlNEVjpIIUszNiEoOCYxLAorTTgnKTw6Rk1DN0Y5WjxWSSQoI0VBLjYpWjxGLSktQiA4MyheKjwlRSs4NERfMzYtSDcnKVo8Rj07NjYpSworTTYkTTk2IzhJKjQ1Uj83PF8oIiBNMSZNPiszIT4xIkRPMTVNOz5HKUM4REUlNkZPTThGKUY+V0FLN0IgNQorTSglRU84RylSOjYhLTglTTg2RklSOkcpOi9ERTE4JDEpOlZZSzw0XSQqMzlLPkclQjhWWUEvVUFGOjVZSworTTZETTg4JERWKCIgXzVGLVI2ViFIMzZJSjIzKFYyNFU2MjRFLTlXJVE8RkFCNkVJUjlTRFYyM1BWL1REVgorTTM2SVo/NylKL1IgVjVALTpEJilCOkZJLTZGKSwzJ11XOiQ1ODhWSCE4QCVGIC9ZUjxGTT4oIUBSL0Q1OgorTTZDWE02Ji1COlcqIz5GJTo6JURJJiNFTzclQFsvVFVLPEJUOy1GKVI6RiBeNUYgWTZIKUo8VlFGOlQxQworTTsmJF4mU104KTRRRDs3KUkyMiAuKzdFVT1HJFkxNy1QOEYpRzM2KU48RllQOyYtQzZGJTs6JyE+LCM5QgorTTtHKUgyVUE5OiZRSDIyVFIuU1EpNlVNLDlHNU82JDReNiciXDdUNUBAKClWOVVAVCxFRVI6VzVLOyZBQAorTTZFQS0zVkFNOFYtOi1CVE0tQyk2QCYpPj1UME0oIjVAPEZZSTZGJUE2JU1DOFcpWjgjOFk6NiRfIFIiNworTSwlSUAxJj1LOCJUOCYjTTs7RylMODVBKTI0NUI8JEQjL1o9JTY2QTs2JUFBODVRWjwkXSQ6VzU7MyYtOAorTTYiVEkvRUlDN1QxJDgkUFYpVUk+PCZFNjQmVCE8QCVCICpdUThFSUIuUUBbNiMhJDIyVEU3RkUvMydOIgorTT5GSTo6VykpKCJVTzZDOF42JiEwMyNMUikyXS02RFVBOFZFOjMgMVJfRVFLMzYtSzglNFItRVhNOCVNQgorTTpGUSkmIFhCNkRVOzUxVF8+R1FGNkZVQDglUUI8J0FbOFVdKTg2JUI+Vyk8L1RFLThWPUg8Ri1SPEZJQgorTTUyIDUrNkFJOiVAXzxGSSs2M1xQO1ZAXzM3TV0/N0lSN0Q1KzI0MUI6VVk6OlY4VikyRSk8RilLOiUwWworTSoxNEAxN0lGOUhBQCpRQEA2R0lbPCVNJTI0NTo8PFUoOkdJTysxTF42JExNKjJMRzY0MFA2RylBLVFAOAorTSs2JV09RllQOjVZKS1ENVI8JExWL0REVi1DWF82R0FYOFZNSzdCVFk7R01QOFVFKS8jMSQ4Nj04KzNFQgorTTI0MFYrMVUtP1YpLTlAJiIgNjggSUglSDQmJSQtREU4LjNMUiYiISk2Q0RHPChJXDhFQVI+RkRWLjZBOgorTSszOUM9VjheLCREWyBSNzQrNiVKPCdNSTM2KU4+VylMNkZJWjpWIF8vVUUpOCYtSzpWSSkmIERSN0JUTQorTSggRF88RlU2LjYpQzhFUFk6Nz1aOlVFNTo3IVA6RVFaOiQwWzJVSUM+Rjk+PkZJTjwjRC4pNilPOiVEXworTTpWIFAyMlQyIFRHXjY2RUs9RylbPVYpQS9RTFYzNiE/Njc8XCghQEI4RilSPkZBPiowWEAyNlFDOkdJTworTS1CIFY6N04iPkZBOjIzXFk2Vi1BPVctNS0jRTg2MzhWNTM5KyxBKSU6Vi0lLCFURTE2TVI4RUFAOEYpUgorTTw2VVc4UzhWNTJUNSgiNFA6R1VaPTZZVy9BTSxCSElbPCVJODY1SU48RiBeL0YhLTg3ISsoIjVCOiM4WQorTSA3TCE9QCMpQEcpQi9VQTs6Jk1JNjJUOC0jRTs1QilAQjhJTzZHKig9RiE6NlVEUis2RiM+RiBfLUREVAorTScwWDsyNFE6Pkg1Oi9VWiM+RylCOldJVTpUUSU1NDE4MzYhUj5GQT4sQ11IKTAsKV9CKUI/ViBZN1YpSAorTTokRTg5Ryk/LCRFSTgmLU80Jl1PL1MxKzZGXiM6JU1SOlcpSy5RQEAxJi1JM1VZQzYjIFYoIUBFJlIoXgorTThWUUgzVzYpPlVFJCghNE07RkU7OEVQRyNAWTYzNj1KNCZNNSYiITg4JUktPEYsTSk1NVI8RzVaPlchQQorTTg0RSU6RyFbQiZdQDYmIT8tQlU8NkVAOCNCNUA4RkVBMSMwRzEoXUozNFVAOUZJUjtWQU48VUU+NjNEIworTSYqKEkxJilCNyZNUzUhNEc5JlVWPlcpSztWTU49RklCNkQ1JDM4IUs1IykkN1IoTSA2KCE7MCMpOlYtUgorTTdTXS0+R1FTOEVBJDYjISQ7IihQOzgpWjgmLV05RDVLPkVATSgkRiI8RylQNjNYUiNAREAwQj0pO0g2KgorTTpXKV0+RjlCOydJRj5HSUAsIj07NFFVLT5GIVI7SCFIKCAsNV9CIFY6WCFDOCQ1JTtHISU4JyU4LERFQworTTYkUVdCJ0lLMSIgTS9WLVs4I0U6OldJTy8iRF42JDU4OSYtUDZGITg1IyhUKjJEMiwmLSwvRFYiP1ZFNQorTSggWEU8KDVQNlYhPi5RQE02Ni0tLCVBPiZRQFw2NilAPVRMRSgjTUM4VilSPlZNPjxGRFA4RilSQEdJUgorTTlFSU0sQzlGODVFJDEjUSQ2RylLOjU0RSs5TS0sI1lCOFZVUjlGKTg6Vk1QOyRERyUwWFQ4JFRZLjVJQgorTTUzMCMrOTklPVc5Tjo2TT48RllfPEQxNC5WTVc2ViVSOlQwViA0RCE2UCNeMzNZJzhTWFk8RylDPCYpQAorTTokVTU6I10kNlYpOjZXTiI4U0VAPkVIVi1ERVI7RllKOjUwSyIxNEcrMTUpNlY6ID04NV08NjlGPlcpOQorTTo4KVcvQiE2MiI1KTpEQUM2V0lQLEMgXC5STEUzN01CNjNcXjlGXF42JyFIMSVFQDhWQUZAWCk6L0NERQorTS5VQUY2IlRNMTcpUzUyIFk7VDRfOkZZWjM2LVAzU1hfX0NcWypSVSkuUyhcO0ZVUDYyPDgrNjojPVVJOworTTYmISElM1k5MjVFQTolNFwxJFVKOEYgWTYjUFQuNDU6PEctQjM3SiA2JF06NkVROztVXF82IlRHNkZNSAorTTglQT43RFFTOFctNCZRQE0yMzktOkZZTjhGOTU4VkFSPFZEVighKFQ7JUxeNkYtOThWLTUqUUA7NUcpTAorTTQmKUw6VlVdPERRQzYkVUo2RVFaPUgpSTEwJFAgNUwgX0VYTSZVQUI2VyEtLCYhSjhFSSw7JyktMydJLQorTSlTOUs9Ni0kOicpQjYlRTw8R0lKOEVJRi8hQEcsIiAuKjM4XjM1Tig+Rik8OlcpUjtWWVI6ViE4M1VNSAorTThGSUI8JklKNyZUXy9VQFIoJFYgOkRVOjM2TUkuU11APTVAViwkVVAyJylbLUIoVikyVSk4JERUKzU1TAorTUA2XSQyNyk5KzRFTEJENSU7NUhWMT9ZLTMlWSQvVEUkLjZdKDomISQxI1lKQFgpTDhGKVI7I1ErNiQxLQorTTZVSU86RkU6OiZAViZURT4rMiBWNicpUDZTRUZAVk1ANyZBJS9VQUg2NUEiLENdQz1UQFkzVyBNOEYtTworTTUxQDIqNUhNLUYpWTtVWUszVFU5OjctWzYjMEctJiU7LjZKITsnLVI5Q1BAJTM5UjxVSTw8RzVbPzYoWworTTY0NFs2VU1DOUc2Ij03LCE4ICU5IC9ZOC5RKSQ+RjlCL0NdJDgmISwxNi1SMyJFWjgzKFcyNi0vMlchSworTThGSUs6Rl1aOzZJLzokRDgmIiA4JTIgVjEhTE0+V0k5NkchLzlHUVU2M11CPlVBLTxVSTo6RyokPkVJSgorTTUzWTovIUxQPEZJSjlUUTo4U1hFLjc9UC9CVSQ4Vi4gQFU0SSszKEIuNlxeKCFMWTpYIUI4R0FaOVJURQorTTI4NT8uNikpKjRHXjZUPUI5RTU5NjRdUDYkUF4xJkE4MzZZWj1WTUo8Vz1IMzVNKTU2ISU4V0laOUY5SQorTS1CRSk2JDBSLlVBVzhWJUg8R01OPEZJSjYkVTo4RlFDOCNYXzY2STgtREU5MjRdQzZENFQoIlU6LUI1JQorTUBHSUI4RTUkLjRdTkBXISsyM0U4MjM5QkM4LiNARy1BM1I0VjpXKUc4RllbOlgtRzE2RF8vVilLOUVZPAorTUBFJVIgNyghMzAjXi9RTC4rNylSNkQxQDY2OUAyUzkkPEZdKT5GSSUyNEU5LUMhPDpGLVI6VUlKPkdJSworTThWVTkvIykkMSMwVDI1UDIoJklXMiYpXTZGKVo8RkBeMDY4XjEnXUgvVFU5OzgqIjtVUSk1NDBLKjYhOgorTTlGXUA6NkE0LCMpOjhFNTg4NiE+QEhFUi9CNFwqMjVDMTBYLiU0RS0rNDFaPkY8TSUyPUo6VUlPODI0VgorTV9GIUA2NUktMjRVKzpHPUAyM0VDPVREUi9WTVI5RVlOPVRBLTYzWUEyNiVOQEchOjYzXUE/NEUrN0NdSAorTT1WKUA5RyojPkc6IDxWIUA3VFFGPEchPzY2JUo4NUErNiVFOTZURFYtIjRfOCM4Oys2SV08RiklNiNMUAorTTZHSVo6VFxQMjNMRTE4UixBR1VTOFVIVCxFQTw5Rik8OiU5VTlTXUIuM0U2PVZJTDo4KSU2QCVKIDVMIAorTVpFQEkmIjVCNyYpLTY2LVE7JyEtLUVKIkBXVUsyM1xWMjNESS42KUM8Vy1LOkdKIzhWKVA4VUVAOkZdSQorTTdWSTYjQjU/PERNJzxGLUM6RlVTPVVNOCZSVVc+Rik6N1YpTEMnSTo2JUEpMSRFQzwmXUs4RyFQOCU1OQorTTlEMUA6Ryk7MydKMkJGXFwxJDBQNkMwIyNPWDUlMFhWPkdJQjEjMSQ6JUU4OFclKS9EXUk1RUlPNiQ1KQorTTFWWVI2I106PkZcSSUyVTk2I0RfPUU4XjYiVFYzVlFKPkdJTS9SRUI/VFRfOjNZJDxGKS02VlojPEYtWgorTUAmPS0xIkUsPFdJSzgmJTs6Ni1ANlVBQDYkRFwrMlUpNkM4RSo0UUpAVk0lL0M4QCwmTVY7RkRfMSJEQAorTSs4Ki1BOC1TOFVJODY0XjM2RklGMzVJRjpGSUM5Q1g9KTZNSzxXPS0zIClLICpFQjdDKFI2Iz05MTNFOAorTTZWIVI8U1xHOEhJXTtFTS8xI10kLlM9QTtGUVI7NjlaPkYpJTZERSU8QC4iR1ZNUjsxTF8zJilJLjVAWQorTTNWIUI9OC1TN0BEODE2WVc4Vi1IM1dJUzE0UCM2L1lANjcpUjdVRVI8Rik7OjZAVjdXSiI6NFVaREkpWgorTTY0NTkyNyBWLCNEQCNARC4tSCoiOkRFKzw4LTk2Ji1KO1ZdKDgzRFk+JyElMTZBOTpWRUg6RlVaNSI8QAorTSs1STMvRiktMTU0TSUyVSw2RylTO1M4SThGRE0sJyU4KzREXi0lXUY8RU0pNDZVVzhTXEUuNlFaPkZNQAorTTglXU88JiE4OFVEVi1DKFY4JipSL0QxJC1DKUo4VUBSLEJMSTM2OU48RyEpJEEoSTs4NVU/N1lAMzZNUQorTTIkVT44VUk4Okc1RkBHNTwrMUxQNDdJUzMzRCE6UCVSICgxVTxGQSQgVUteNTQ1JCZSVTo8RiRCLjdJXAorTTtHPVA4VTRNKTIgXjtVSUA5RjojOUZBOCsxNEU2N0laPzcpRDxCNE0vVUFCMjNMRSkzTSQ2WClON1NESQorTS1HPU48RUUpNjUwRSU0VUs4RiVLOFZNQzpVRVI2REReODVEUjM3NiU8RVlOQkg5VTglQTgyNz06NkdBNQorTSghNC4qNyFaOFQ1KTxIOUgsIylAOUdJSzlSREUzJVxHXjIhVzEjRUdCOEldPlchRi1DOTs6VDVIOEVJQAorTS1CTFQrM1k2OEYgXDI2IUApMjVCOUJURzEkXUY+SCFSOCRVQjxHITkvJE1COzdNUjpFTUE4RilDNiZNQQorTSxBQEAtRkFLOCVNSDJTKF42VjxSLSNQVi9VQSkxNk1OMDFUOzNWTTE+WElDMTY6Ij5GTUM4UyBQPEdJRAorTTxGOUk4NTBWN1ZdOjI1QCE4UCVWICspWj5XPUg5Rkk5ODVATSRCIFYyNi0kLCYpTTxHSU48JiBUJTMpKQorTTYkVSk2NylVMzVBOCUwWDUsJUE+OUVIXzdWOF4tQC06X0RESSUyNE0yN0lSNiRMXzYnKVo6RiBeMTNYOAorTSNCVT80JSFKOUdBUjw3PU86JVhWLUNQSS1FTVU7Ri1EPzgpUjpWTUkxNk1NPEcpUTY0JFArNiFGNlRFOworTT1XVVcyMzk7OEc1SzslQTYzNUBNKCVQViZTRVpBN1FdPkc9ODg2UUovVilPNCYtJTI1TFYyNERXL1M4VgorTTNWRTUtRUEtKzI1KTo2WVZCOClQMyxNLThWQSkvRFVJOkc9UjhUXVc6NF1DOjdJTDExQDUrNiFCOicpUAorTTwlOF4zJkkvNTY4XCszXFcrM0VMPVU0WzNUVTk+SElQMzVRVkE3VVo7I1BFOygpVT03LU84REUpOkchKQorTS9EVCE3ICVSIC9ZOT1WSUY+Rkk7OiYgTSgiREAtRiBeKTNZLDxXVU48RiBSJTNZQC9ERTgyNk1KMjQ1NAorTSUwWEArNDU5OEYpNjE3NVMyNUFJOFVFKS1DOSQ2Jz1XNlRFKTZGWVU6Ri04MjNcNSIxQF8yUzhXNkdJPAorTThXTUY6Vz0+LUQwXCk0UUoxVUlKOzYpPjxHKUgzNk1VPVYtUDwlQT43ViEtNlNZLz5HVVI8JUE7OydLXgorTTxGOVI8RkU6NTMpNTUxTEU2RzVUO0Y5WjsmTVI6RDBXPVcpQzhWTTg2JiE4LUJUVisyVS06NUVBLUJVNQorTTg2SUI0J0olPlU4XjY1QSk1NiVCNjZJXzhUVVA6VilCOlgqIzIxQC4rNU1DNlYlS0E3WV1AVjktMjRQVgorTSkzPFYqMjUvPldBOi4yXUJAV1lVNkVJSjwoOV07NkUpOVc1TTs3VVo2MylJPkZIVkBDOT8gNighOVAjXgorTTE3ITwyJylLPCZNQzVDWSktREVDNkREXis2LVs7NyEtKjIhKTkjWF83RUlMM1RFKTgjXFI0JVE7ODYpSgorTT1UVVJCRiknPCZZQzolOSk2JFFPPVYpODI0XVI9Rk07OjYlKSowRC4rNDRAJlU5Si9VSiE6NilSNiMhOworTTojOSQ2RDEkNjVMXi0mTUo4Ji1bPDYpOjsnISw2Ri1AOCVMWzYnNVs4JylDMTVKIV9HKTEzJlVbOlVAOworTS1FNFstREVIOkZNQzxWTUQ9NlxeJzVdUjhWSVM2RUlSOlRERSozKDstRUBfM1MoVjZYJV86VUlGQFghLQorTS1ERTgvVFVAODM4UjpFTSQ8Jl1CNlYtWj5FQEUnM1FAOCVJOTZXTiZBWElXOFYhOzJTOT43RDBNLjZaIworTTpCNDssR0lSOlYtSDZVUV0/NVFCNic9RjpWWV0+RFBLOFdFRys4KEc2MCVKIDVcIF9EVU48VUk6OFcpTgorTTtHPUkzNTlIOlZNSjVCNFk6Vi1LNlQwVjVGXTwyNiVJPEZJQDZHSVAzJEVPNyYtOjg3KF40OClSMiZJTAorTThWTUY4RyE6NjdJTzZFQTs9R0lLOiZJUDhFWFAmIiBJKCIhKThSVFA9VUE2OFVATTI2SVA4VkFIOCVFOAorTS9DITs4VF1DPzYhJTM2KUs4REUpL1VJSjMlSU0+Ni1COCNFOT5fWUsuMkUlPEddRixDOF4xNERWLjVNOQorTThXPUI4RylKOCM4VjEkUTo4Ri1LPTcpTzUzKEkoI1FGMTM4RS1DXUhAKClCNkdKIjVBVFA3JiEpLjVFNQorTS9VQTUrNylSNkRVMTs2MU84M1BeN1RdLS9DRS09OFYqPEVNOTZFRSk6JyE4LEI1OD5HPFImIkVCMyNFKworTTZGITs8SC1aNlQ1OC1WKVM7RzVKMzYpRDgzOiIrNFQhNkAlJCAvWFY5R1VOLjYhUjpVIVs8RUBWNkZOIAorTT82LFYsJi1LOUYlLC9URUI7Vk1CPEZNTTxFSVI/NihQM1RVODgmTUstQj1GPEYhQjhVWVI+RilXNiMhQgorTTolRTo2RllVOUZNSztHSUs3Q0xAKTNQVjZXJFwpNUEpNiYlQzI0RUtCR0lLPkddTjpUREUyJi06OEc1SQorTS9TRSw6Rkk2L1JFJDxFTTg4RylPOFVAWTZII146U0xFKzVFWzxFTUI3RiFALlI8Wy1DRUo6VUlIL1YpUAorTTEiVSkyNDU7PVc1Qz1XUUAvQyhHNlYhJCkzKE0rNVFaOFRVLzxFODsoJTlLOiMgVjYkTUA4NTlaPFQ1LworTTZGQSQ2Ny1YODVNODolQFQrNUlaQUdJSS9TPTg5RkFSNiI0OC8nLV04NEU1NDQwRSszXSkzVSFaQEVJNQorTS1CNF43JD1GPkdBUjVFQSRAQlVGIDVAIScwI14rNUlaPkMgUDQmSSU2RVFGKTJUWT5ISVI2M0UwOEVFOworTTM0TF8xJilQNyY9MTNXKUIzVllSMjNcXi9VRVI7VU0pMzVRSjgkRSg6RylOQCYkVjI1TS01RUlOOkVZLworTTomOVU7VkU0LlM5KS9GJVo6I0xWNlYtOjgmITg6SEFTMyYqIkBHSUkuUyE4OVcpVTo0RFYsJiFIOiU0TQorTStWITsxNU1LOjYpOzhXKVpfRylALyNRLzlXKUo7RkVJPEY5JC1CNEUzNlFDMjRFUDlTWFY5RUEkM1ZNUworTThGWVczJiVLLCNFQTYjXSEoIjReOCZdSTM1RSkoITRePVc9JCszIFY2Ji1IPEZEXzI2JTgyNUlNPzcpUgorTTg3IUM1Mz0vOldVUjo0REUxNiVSPkZARSNBVUI7R01aPlYtKS8jOSkuNkVJOydIWSszKFIyNUkpMTY6IgorTUBHPUgtSCg9NiAlQSAyNCBGRUFLOkZZQDJVQUo4Vl1KOiNMSSk1RVU+Ryk4NUYpQjZUNS0gViNeOEYpSworTTNVQUo8RilKO0RVNjIyNFA6J0lPPEZNOTpGSS0vVDEkNydNWjo2TUIyM0UpPEZJOS1FQU85JjlPN0VdKworTTYjRS0+NykpKTRVQjdUXSkzNyooPCMgWTxXSiJAVkRWLjY6Ij03PSkrMyk4MzRVQDYjWFkzNDVKOkU5JAorTTZGSV87NzVKODRVODZFTUI8Ji1GPVc9SzEiIDgqNF0/MSVBXzxEME04JERQWFRMWThHKVI4UkRePVRERworTTM1QF81MyhUMSNZOjwmKUg1QkwuKzciIDozOEUtI0VCPCYpPy9TXTgyNF1DO0ZVUTxGRUM4VF0rNjYtTgorTThFUUkvIlUpPEdVUC0hQDsvRUlOPzhJWDgjXSsvUik7PFZJSykwWE0rNDUwN1NFQkBINV08Q1xAL1AlSgorTSA2JCBcWCldOkVFSDgkVUo5RzVaOlYhKTU2ITk2N0lKOiYtUDgjOE04RylVOUYpUjokRTk7RylLOkYpQQorTS1BNDUxJylOPTdJOjhHPiA8JERcL1cpVT03KUQyM1xfPEcpQS1DIUo6JF1LPFZNQTYjOSQ6VkUlJlYpSAorTTglQF8uNVFaPEYhKzgmKVpAVkxfKTNdVTxHRUgvQlU4L1JUXzZURCMrPT1CQCJURzdWIS0zWCFSNlRVSworTT1WJFk6Jl1KPEdJVzZUMEAnMlU2NkZNXz1GRTg6NDRWNTMoVj1XXTkpUU1AOzQxODZUNUYxJEVIMzUhTAorTTtWWUIxIkxUMychUDEiNFQvJSFXO0ZJJC9URF8xNUlLOkcpWz5GLCM2WllJOEZNODM2TUEpMyFDPTcpSQorTTUzUS08J04lQzdBQzE0NT4vJU1KMiJULiNDWFwvU0RNLCYqIkE3JVI4VTRfIDNEITpQI149OClXNkYtNgorTS1WKVU7RllGO1VdLThWUS81NklPNkYtQi1BTSQ6RlVLNjY5UTVFXVA6VkEvOkcgWyNAWEUyNDVHPVRRKQorTTlIOig6JThZOidJUj5HKFYvVVlGPVZFNS1GLUMyVi1bPkcpTDglQUs8JjhUMSRVLTI2IUAzJk05PEdRRworTTM2TUs5JkU6L1RRRj03NUo2JU04MlVFSDg0MEUkQ0VKL1IgWTEhTEdfRl1SLjMhP0BXIF8vVU1CPTdJWgorTTpGJFQmIiBWMzZOIDxGTUM6VERWLyJERTpISU8uUUBQOCZFXTozRUo7VkVQNiRdOjZIKUsxMzxWMSZBVworTTgyRE0xNEVTPkdJSThURSQsIl02NUVRVkJHKUM6Vk1SO0ZJODM2RUktIkUvOFYtSzolRSQ4VzotREghTworTTMzRS02Ji0wLjNEPSNDWUA9MzgpJTNFW0E2WUIzOCkpLlAkPSAzXCBCVklVPEYtQDE0RTo9NzVaIFcrXgorTTElQVA6MihZOFRFOTpVSFs2JUVKP1YpSjxFOSc2VklQMTQ1SzlSRD0uU0xFL1VcRy1GSVo+RkReJlQ1SworTTZXKU0vQzhfOzgpUDdDITg2JE1LPEZVXUI3KTk4R01bOUREWSsyNSk7VUlQOEZWKD5GLUs2Q11SPkZEVgorTS9UVVJAVl1BOCVNQThWXUAvIiBNLEYpJC4zUEsrNU1XKzFAUDxHNT4sJEU6PEdJWlxHKVI1MiBAJlJVNgorTTpWWU08VyE5L1NQOyZUPiU+RUhUKTJVKTtHIFYxJlVPOCNFKTVCXVI6VURUJlJVJDhGXTUpMlRHOEcpVQorTT83SUA2MzhAKzMoVjpYViM4RjlOPEZZWjhWJUs8VTRJKzNFTTskVFYmUlVGQUkqLUBWSF8tRUlTODRFQQorTTAwWDsuNkk8KCFMXzxILVU5UzhFLlAlNCA0RCBXRilLM1Y9KSwmRUs5RylaPzdVRjg1TVI+UjUhMjFUWQorTTs2TUgzVDEvPkdJWT5GSUY1RklbOjMhOzxERE0uNERSKCREUiZWJU82Q1hSKCQxQDE1SUIzNDBNOzgpUworTTpTXEUrNiFTOlVNWkRHPS84V0oiPTVIXiggWEU3VTktOCYoJDxPWUEuNU1SOkREUihEQVo6VilLOERBOgorTTxHPTszU1xZOCYgXzNVWFY3WCFOMSM5QzxHIE0xNUVVPEYpOjtGWSQvIyhLMTYhMThXKU8uMlU+LENRQgorTT84KVAvQ0RAKTRVVzIzIT84Q1g7LjZEXzZWIF8tIjxJLUM5JTlDMDgpNEU/OkdJXTZWLTguUlRFLEYpVQorTUBVUTk+VzVOPFQ1OzxHTUkxIiA7OCcgXyUwWj4iMlVMPychXUBGLFYxN0FSMzRBRigiNEksRzE+JlMhOQorTTs3NVcyMUxWIDYgITFQI14xJUkkNkVATTM2SUo5JkFVQkVRQzlHKiIxNEE4KjIpODpGQTguNFVaPyc1XQorTUBHKTs2WCooN1VFQzhGITY4VlhFL0NQOy42STkvIyhWOUYpKS9ERUIyM108O0ZRUjgyIDUuNi1LM1ZKKgorTUBFQTY6SC4jODJURyUyVU0vQyEpLjI8XjtXSVAyNUE6OkYkXyozOUY4Rk1LOjRVOzxHSUo6RkFDOFVIQgorTSwkMFBfRFVaPkYgWTY2TVAtI11CPTZNQTYkXUM4JTlBLSM5LTI0VUg2IlQ4OjVdSTpWSVJAVDBSJlFAXgorTTpFQTY6JihbJlM5UDYlQT4tQlRcMSU0Xi42JSQpNDEkOCZJUjtFSVA2UzhJJlM5QDcmWSwyJllOOlcgTQorTS42KUM2RVhUKCRVTzUxKCkjQiEsNlRdND5HKFkrNk1dNlRVUjEjOE0tRkFSNjJNODZGOVo8SCkvOiAlSgorTSA0UCBfRDE4NyJdVzhFXUI6VikzPkg5Oi9WKVo9NThQL0JEODI3NTovQ0UlPkdNKDQnTVI4RUlVQEcpQworTTNWJUI2JklSLURBJC5TWTk6RjBJLUc9UjZURF42I0RfOlcpUzxGOFQqUlUvOjQ1JD5ISUksJDVcPlVAOworTSoxQEU5I1heNiNQOCZWIVo+RyFINkYpSTJWOUA3RUlBOEZFSjxHTVo8RylRQCZNKSYhQDsmX1hZPEYoWQorTSwjRT88JUEpOjddUjpWTUk4RDUtPEVYSS41QTg6JERFKCcpWjxGQSw0KEFXMSJEOzI2QT86SC1KMjNRQAorTTxGSVE4M1xcLlRdSTIzXS0xIUxNNTZBUjxFSFk6VFxNJiE0TTM0MToxNUVMOFYtUDIzXS04NDVCOjRNUQorTT5WIEAlMiE1OjVJOC42KVI1IzlDPzZRJTpWJFkqNUE2PEcpKTYlRTs8WDIiPVdIIT5AJUggLyknNUREOworTTxHNUI2NVlLNyY5VTxVOSU6V1VKMTUwRSNDOVI9U0RFLCZNXzIzIUI4Ri1SPTdJUjpEVS0xNEVDOFM5OgorTTomRUkzVilXNiMhSjpVQSUyM1hWL1YpUj03NVAyVDEpMlYlOTYnJiI8IzheOFY5KSoyIDgqNThWOjZJKQorTSgiVUc9N0lOOFZFQTgjOUA6RiEsMjNFKTY2VCM+T1lNPEg2IjhTKD0jQUBfOlYpJC9DRFk3Vik7OUdJSworTTY3Jig9VUk7OkchPjJURSk4NERAI0ZGJEBHKSktVk4qOiNMTTI2IUA5R0lKMyVNUD5GWiE8VERbL1Q1SQorTTJTISsvUkxNNiZFV0AkVSs4NExUKCJNJDJTRFYuNiFOOkYtUjo0XT44NEU6PCY5Wj82QFwtJUIjPlYtQworTTdFJVI5U0UxPEc9OzQ0VFkpU1orLjRRSDYmKUgzJVojPkdIIUBAJVIgL1lCOCRERTZGSUo2RUFLPEYpOQorTTomKSk2WClSOkZBJCZRTTo+RVxSJlNFQi9CVTg4JklNPkc1Rj03KSkxNkVQNlM5JDxGVVc1Qz1LOFYtUgorTTpERF4vUzk5NUQ1RjxHSVo2IyFBNjRFKTo3KU0+Ri1JOjRAXzlGTFYtRUBWOCYhKSs0NVI+SClHMjYtSgorTThTWSQ7VFRNMjVYTSs0NU49Nlk5O0dCKjxVQEsoIiNeNUc9QjomKTs2NUEtNlY9SzhEUUZASClVPEcpRgorTTlGKT82Ji01JiBZLUBISVU3QlUpQEZcWSxDOSk3Vz1SOCRRSjxWWUY6NylBLUNQTTYlQEUsQlRWN0Y4VgorTTZHSVA8Rkk5L0NdPjo2RT4tQ11DOEQwWT03PSk2JUkpNiVJRkBHVU42UzkvQkdNMTsmTTE2Vik+MjVNUgorTTpVQF8zJE05N0U4Xy42TiI2U11CQEYtOyA2TCE8QCNePEcpSDZGQUo4VjlSPEc1RjYlQS0uNi4nOUVRMAorTTojKEAuNikxNyI0Ui9CNDUxJklCNDdJWjhGUUozJEVQPCZJJCxGKU49VVxeMzNdQjxHSUI2JUElOjYtKQorTTZWWVpAJihFMyVJJTI3IVI0NklCOkdBJSo2KiA6I1hfMjRVKS9FMUg8RlVSNUNRQjxHKUIzNUkkJlJVOAorTTEjOFA2RyVCMyYhTkI3TUkyMzhNX0NdSDhWLUgzNTk6LURBSzxGJTk3RlldPTZaJT5WOUI2VU05LyFALgorTS1HSV06RkU4M1gpUjEzOEUuNTlKOlVdNjpGTUM7VUE5OiRFJC1FQUAuUkRSLlRFPyszOUg7VU1OOlYhOQorTThWTVI6NUUpOCRcOyZWKVIyJERXKzNFJTZGVVA6VSBfMTdVWzImLVI6ViE8OiZFSDxHIS04IzhZOzcpSAorTShCNUNCRzU5L0gpJC9AJFAgNiwgVlcpWjpGKUs8Ri1CO0cpUjpWISkrMTRZPkYpSDhGKSkuU10tM1ZFKQorTS9DUEkoIzlPOiQ1UkBIKVU6JEUpOlZJSjozOSQ8SDlSOlZAUDI1WUo6Vi04MlVNQjomXUY6V0lSMlYhJQorTSszWVdANllCNDVJVzhTMUE+SCFKMzRUIzI4TTg+R0lSOFM4STYmSVI4UC04UzQwTSszOFYxJi1DOkVJOgorTThXNVI6JiE4MjVZOjgmKUsyMyBeLlJVJDpGRTg2NilaOlVRXT5GLUA2JERfKzIgNShGTVo7Vk0pKjcqIAorTTpFXF8vRFU6NkVBQDhWLUk8RTksPCZFODg2UUAgU18iMjRVOC8kRTk2JUVIPEZZVzpGKUo6VyFBMzJUPQorTSZUVVIxM0xLKlM9ODhGLUM2U1xfMzZZXDYkNU82REVDOiYpRztHJTk3IUw7MjYlKCNBKSVAR1VSL0JURQorTSAyNCE1QCNeOlZNKS1GTig7VFU4NlVBKzY2RT4tQjU2PkVYVi9TUFsuUzhWO0c9QzdGWTUtRFVAOkcpPAorTTMlQVM2IlRXNjVNSjghTE06RllCOkUhKS9UXUs6ViBfL1YhJTxHKUY7RjlLPCQ0Oyk0MVtBRz1ANkZNSAorTTlGTVA3U1xJKzQ1QjpFXSkuNEU6PFcpSDglQSkyNFVDPlZNOjM2SUs0JkU6OFYpOjY1QTo4Vi04X0YpMAorTTgoKUsxJSE4OFNMQC1DKFk4RyFLNjVJRjg1NSsyM1xWL1QwSyYhTT88M10pMiVBMD5GTUM5Ri04OiYtQQorTTglQF8rNUlSOlchSjo1RF84JU06NkVNQz5GRUEzNFE7OUZJUjtGUSU0Nl1IMjNNJDhWLVM6NTRNMDRFKQorTTEmRUw6M1xWMzYtUDIyPS0vUyE6OlZJSzhUVTo6NiRWMTZNOCs2IV0+R0lQMlgoVi8gJEsgM1wgX0cpTAorTTYzWUc/N0lMNkRFJS1DXUs6Mzg4KEYpTi5VRUA4NiU1KTNZSDE0MUM7Vj0rMzZJWjhUVTo+RkRFKzU5QQorTTo1QEApNk4jQkc9OCoyVTk9VylAMjRFSCk2PVI8RyFAOldBRi5TTTk5WCldPFYtOjgjRSQ6VkRNI0FAVgorTTlHKUMzMlUlNjRFQjs3SUkyM10pOFc1WjhGKUo6RFFJOEVJLzZGJSkzNUlDOy9ZQjIzXUo8RjlPPicpOQorTSxCVFwtQyFSPzZNSjlGLUI2U1xbL1RdQzEgWC4tRi0pL1RNODM2OUs6VylLOFYtUjo2LTgsQUBNM1YtUgorTTpWLS8yNk1OOFVZQzlGWU46VUBWKzRRQjpGIUkvU1lIOjVAVi9YIiI+V01JLUNFSTIyPSU6VkUpL1ReIworTT1WJTk6NURfMzYtRzpUNEczNlFbOFY5SjZVRUw+R1YiPCQyIi8lRCEyMCVBIC9ZWDgkXU48RzVWPzcpQAorTTYkMFY8V0EpKjJNKTMzIUk6RjlbPSNRJC9SVF85VllTOlVJUkBWTFkuNjldL1QxPjpWTUEsIkU/QEhWIAorTTUxQEA2NylDOjVFOzoyITg6NylXOFYtSzo0RS86Nk1VPUdRUDdVNSsvRUlIL1NFJDI1SUM5RihJKzM4OworTS9GTV08VUxfL1YpXT5FSSw8RllDPEdJSTE0NVA4M0UpMzdLS0AmLFk2Rjk+OzdVWjpEPF81Mig7Nkc5UgorTTxHLVs+RUxeMlVNQDpFREcjQiEpMjNdOzo2JTo5RllVPEZNQjlHKVM7RERLJiI1KzsmLTkyVUVcPkYtLworTTZWKUo7R0lPL1I0XjYmKS8xNDRfODZFJS1EMVpBVl1aPUVEXj1XIFQvVkU7MTVEWT03KTg2Rk1DOjUgIworTTgpKFsmIlUoPzghUz1HSUc4VUlSPkYsXy42ICE2QCVJIC9ZVzg2KVI9RllSPTcpWj1URDs7Vz1AL0YhQQorTS1CNTY4VU1aP1clQy9RTEUyNk1SOUVNUkFHIFYtRU1SOlVNSjxHKUgxJDFLQFhaIzgyTSU3VilCOjYtSworTTpTPSU2VU1aPEYtQjI0NTo6VilCOUdNWDpVWUk2JiFTOlctSzgkXUw8Vik5MSIgLi1HLVY8RihZL0ZBXgorTUBERFA4V0lTOFYpVC5SNUg9VFUvMjZHXkEnLF8xNi0+NlZVWjZVTSkzIz0kOFZZTj03NV1CRl0lMjYtSworTThVSU4vIUxSKzNROTZWQUA6Ny1GPkgpSzcmPVI+VkRZJiEoXDsmQTg2ViVbQEYsVjUmJS04R01bOCMpKQorTTY1RSQvJDRfMjU4SSUyXVo/JU1GPCYtOD5HTUE2Nk0vMTZNOTNUUFkvRiE6N1U1LTE0RUMqUUBFM1dVTQorTTs4KU44JiE5OUVEXEBCVTYgM1whNkAjXjhGOVI9NzlDOjYtOjcnSTQkRUVdNlQ1Ozw1RSk6VkEoPEdVXQorTUI1REslMkUlOlZJQj04LU8xJUk6NCchQDZHIVI6I1xZOkg6JjxENFc6NkUvMicpTzxHSSk2VU0sOUc1TworTTYkNF42JyE/MzYpWkBHOUc4Vi1LOkY5UjxGLSk0Ji0kPlcgQiNCVUs8RllKL0JVLD5IKS0rNDFaPVVZOgorTTlTOEAxNi0nNjVBS19HKVY6NDUsOUZNOjgzKSw2JExfNkZRSjtHNVY9OClaOFVFOzhWLTg+RlxNKjFARQorTS9TRS0zNyFSNkZNVT02TUY6WCFSKzBYLis1SToxNk1LPTdJOi9FRUEyVFVdPzVJSTxHIUkvIzk5OjZBJAorTSYgWDIzNy0lMjVFJTgnOU48Vk1INlVFUkBXIFktQyE4NlVERSszUF44VVkhKlJFQjpGKUg9Njk/LjRVUAorTTYoKE0vUCRSIDMgIF9GJUs/JllSOiZRUDo2TVc3QUBZP1cgXzI3JUkzJklNMTZJWzwpKVo1IUxLKzNFOAorTTw3SiM4RDUvMTNdOjokRS04VkU5LjYiI0JGLFYpVUVLOCRVQjcmVVw6JkVINiNdUjpETTkvUyFPOVRFOAorTT5HSV0+RFEoOlZdQjcmSVM4UzhQKVdNVS8hQE07J0lVOURUWy42PVoxIzkpOEZNQzpWXTw1NDU4MzVNRworTT5PWU46VyE6MjRRVzsmJSs2Ji0+KjNFPjpWLU49NyldQEZdQS9FSTs4JyojNjNMRSoyRE0vREVKOlYtQworTTlHKUs8VylaPFJELiUxQFYuUlU7NCUhSzM0NUM6NiU5Pzc1JTpGWVI6IzhSNidKKTUxQDUmVFVTMjMgVgorTSk1OVs8Ri1DPCZNSzs3ViQ2MzhfNjVIXygiNFQxNU0wO1Y4VC42QUs3RllRNlJUWTxXJiIxIlQhLUAkXgorTSAsUUA7SClWO0ZRRj5IIVZAJiw4JlVBSS1DITpAJl06OiRVOj1VJiZCR0BcKzJUOyk2LiJCJUknNlYlJQorTTgmTSksJDVJODNdOz5HWVc3QlUpOEZBQTZUUT88RilPOiVEXzpWIFAyMlQyIFRHQjY2RUs9RylDNlVZSworTTokVTA8RyBZLVM5UjtGRE0pNUFaQFctQTNTRTo+RFBeNTRROjsnKUY2NiRZODVJKDpXSU48Rk0tL1NFQQorTThXIUo7VkksLEI0WTtWTU48RlldQkcpQC1ENS8zNylVN0VFKTEyTEsvVE1ANkcpUTNVSVJAV01RPCNQIworTSgsSE8tUlU4LCIpJDI0VTo4VyVSPzc5OzpWSUo4IlRFLjc2KjwjUFQsRFVXOjMwOCYjWVI7RiFCO1ZJUgorTTpGViY9JE04OjYkVi0jMEsrNERZMyctNS1EUUI8Ny1MODQxKz1YKU4vICQ7IDM4IF9DPVI+Ry1DMzRdXQorTUFHOV08I1BJLjVdMCkyXVpAJi1DNlYpSDYnSVo9RkE+LUFAOC9XSiI2Q10wPSVNVz5WIE0sJiU7LUQ1SworTTtHSVgvU10pOjVJLTIzRUIxJi1JM1VZQzYjIFYrMjRJKTI0XjhWUUgzVzVaOlUlQjolQUk4Q1lBO1ZZRgorTTpEREUvVk4qQEYtQjMlWVo6RUEpMjVZSjtHKT4xMik+OCRRSjxPWUY7Nz07MjQwVi42UUA6VkktNTIgOworTTMmKUI8VllcQVcpNi9TXSkxNilVNlZFQzYzUFw2NVkpLjcpVzYzXUtASDlVNyU5OC9STFI1NTktKjEoSQorTS1FRTkxNUlOPzdNSzxHKUM2QiAuJlRBWj1WRUE4NFVSOyU0QCgjXUI6VkFDOEY5VzxXKVVAJU06Plc8XgorTS9FRSUtQ1hfMjZZWDg0RTA+R0lGNlRdSTxXViI+ViQhJiAkNSAsTE06RllLMjI8UD1YSV0/N01JN0M5JQorTTYiVEc6Rk1APCY9MDElRVg4VThZNjZYVCgjXUs8Q0RWLjZBSEBISU0qMzlGNkNcRTNVTVI+JERWLUYlKQorTS4zTD0tRUElNiYxQzwlSUAzNDAkLU9YRS42LSwvRlVVPkRVJTZUXUEzM0VAPEdJSjpGJF8uNEVVQEY5OQorTThXTiM8RFRPLlYlVD5ILVs2IlRfNiRVUjtFSTk8RkkoMjJUUjg2KUIzVFVQKTBYQiszMUo+RzVdPkVJOworTTg1QFY4Nk1AOlYtJTIzOSU4M1w7MyZJSC1EUVI+JzU7NCZNRi8iVS89NFxNJiFAVzlFNSUxJSFVPUZNUgorTTxGKUAsQiBLM1ZeUTpXKVI7NU08OlRVJC8kRTo2NilINlVRSzlWXUs8RFUlPEglODYmUVA2REVBOjZJXQorTTwzWS08RylGOjQ1OzxGRVo6QCRLIDFUIFZENTs6Rk0kJiJFS0BHNV0+VjlILUNZSTI0RUkzNDFVQiZEXgorTTFWTU4tIUxeP1Y4XzM2SUgvUzhNL0RBWkFXKF8yVkVCMTIgTTE2LiQ8JTRWMTNdNTdCVFYsJTlOPERVQworTTtUMTY2VF0lMyZNQjMnKVszNTlLM1VAUiswLVJfRiUtMzVAXi9WQUM4RlVLPEc9QjYnTio7RERFJlMhQgorTT84Oio6ViU4MTQxTj5GPF82R0k5LjJUXzUlTUI2I0VaMTJMNSUxTSQ7NVE7PkYpPj1WIFY4RiFDOlYpKQorTTUjXFs2NURAKERFSTIzOTs8Ryk6MzZNUDIzOSVAJEQ9KCJFKzs0XTUyNFFCPEdJTjxFWTE4JVlAOkchQgorTTlHKVo4ViVDLjU1QDJVQF4xKi02NkVFQzMmKVI6U0RNOEctLzhHTiM6JDVGQEcpTjxDWSw4VV0kOCJUUAorTTZWLVc9QCRNIDMwIF9GOUM4Vk0rKCJVSz5HOVA9VlE4KjJdTzwlSUktQilCQkdJTjtVTTgpMk1IQTc9QQorTTgnIUo5VTRLLUNdSjxFUSUzNl1KNlMoOyYjRVxBJzxfLCM9LzgzOEkrNDE6OUNFQzlWKUo6VixWLUVRQgorTTI2TVI6VUlCMzVAXzI3SVpAVyEtODVNJS9WITguNilGPkdJSDI3Kio9NUkkKTFMWTknNiY+RUlBODQ1QgorTUFPWVozNDFKOjU0VjJVMS04JkRbPEdBRi5SIFkyNU0kKVYpQjQ3LU8tRilQOjYpOjo2RS8yVi1MLUIhOAorTTpGRSkzVilUMzQ1PjtEXF82SCk2JTE0TTglOFAyNiU7OCVRRjsnTS0uNSFGOUZRUjpFUTo6Rk1JOCM5LQorTT02LS0vU0UlL0RFQC9UVU46JERbLlRAUDQnViM8VDU6PTcpVj5WJF82ViBfMyJURTE2LiI6RkghLVAkXworTSAvWUs6VyVALUI0TTNWTVs4VEFKNjFANTMoKVM2MjQ7NUc1VjxIKV81MShFOlc1UzZUVUw8Rk1CODNZTworTTtVWS82NTU7PiYkUiYhNFs4R0IqOjNdLzsmRSUtI1E2OCYtSTZGKUc6RylLM1VBPDhFTUs2RUE4NlRVOAorTS1FQU49OEFCLSYtUDYkRS8vQjRQMSdKIDpURTpARzU1MjNZODYlJUY7Vj0lMzc9NipXV14/JylPNkQ1QQorTTg0VTozJy1SMjRRSzxWLSQ2Ri0tNiVdOjhGUUo6Qj06O0dJKS42TVM4VVlTPSQ0OzMoKVIzJDU6OkRFKworTTwmWUA2NUldOCEoLiYjXFsoIjUsOiYtQDglWVo6VFxbMTYtUj5HNUM3VUlDNlRMXy43NVs6VUkrNkVFKworTTM0XSw6Ni1JOUJUQCgkNUo9R01TOFVJKD5HVVczNi1SPFZFKTI1RT5ARllbIDVIITggI146Ni1XPCNYRQorTS1FQS08RyUsOEQ0PSYjOVI6RERJLUVJPDZVJVVDNlg4JiNFQjo2KUM6VklDMzZEVjcmSS04VjhZLUVZSQorTSxBNEU2JSFaPzcpQzsnSUo8QlReOjZdQj5GLS04Vk1LOFVZQjpHKUk4U0RfNlZBQjhDOFkxNjojOCMhQgorTTxGTUw6JERSIjFNSkI3KSkuNzVKL1MhQThFRUA+VylDM1RdSjIxTTxfRzVUPlYpQTomLF82NEFOPVVARworTTM2OUA2Ji07LCMhQzpHKVo9VThSMTYpVzIyVS06VllDOyZMXCNDOVU6Q0UlNiVcUC43KUM2NlFKPFYsVAorTSUyNSkyNTRUMjYpQTElQUw7NllaOERFLTpIOiI7JU07OFRUUCsyKUJARylGNiVJQzo1TUE2NiFBOyYoTQorTSgiISkzNU1GPlcxODMnOiJAJi1SQidJQjYmRUk0OCkvOEAlOiA2SCBfRUk7PldJTzNWJUExNi1XN0ZAVgorTSgiIF88Nk02LSRFSTNTOEc2N1VYMTIgOy1EXTo8Ryk+NkRdTzYlOUg2JVlTNjVZOjtTXDgtRkE6O1UhPAorTT1WWVc6VzReLURVTzMmWUIxNDFCPEZJQjdVIVo+RiBeL1c9TzpWTTgrMUxfPicgWThHNUQ8RyksLEBEOAorTTY4KVc2U0VDOENYVjZHITozN0lSMzQ1Sz5HISkxLkk8PTdBLDM1IVA3VUk7Olc1Oi1ENUA2JUlKOFM4VgorTTNWTVU/Nz0pLUNdOzxFRSkyNUlKOUZJLSZTISk8VkBZNiYtQzUzXUMxMyE6PEgtUzwzUFY2I00rODYpQgorTTYiNEIzJk1aQEcpSS40QV0/Nl0vNiZNOixCVFY4V1VaOiQwWThHJUw4VjlMOkcpQisyVFQhI14yO0dJOworTThYKVY9Ri1OQTc8Xy9UVU48NERPIDQ0ITpAI14sI1lSOzZVSj5GTFk2Rz1DMzNcSSozWUM2RTBNLjY5QQorTTEiRFk6RjlULSIgRSszOUs+VU0kOlcpUjMmKVA4Nk1RPCYpUjlSVF89VylDLUMxSzxWUVI8RiE4NlZFKQorTTpWOS0xNFFLOkYpSDE2OVozIlRNO1YpQjdGIEAmIjUtOFVBTjpEXUZARUxWJiIhQD5HPSQvVUkvLCRVSQorTTsmQTo6JFBHJzVKIjxWTSlfRUVSO0VAVi1GLUo4VkFSQEcgXzdFSSQzNk1PL0JVLz1XKU4+VUBNLUVNUgorTTQlRUM4VilDODQwOCs1TVo9VUU6NlYtUThWLF8oIj0wPzgtXDhVOTouM11TOlVJOSwgWDs3J0ldQCYsXworTS40QUI+RUk5OCYlKSszRTE6RylMKVFNJD5IJUo6VlFKPTZAXzElOTgsIlRFMTYpOzlXTVM5RVlSPzcpKQorTTYlTTw9OClXNiAkWSA2ICBfQjRNMTQ1MDs4IU8uNFVSOyVNOS9SVFYxI1xfKzNZSz1VQF8yNyFCOlVYUgorTSgiTFY6SClJMjZNWj01RUA8VlFDOlZFLTQmQS82Ny4gOlQwTTM3KUs6RylPPEdJWzhGSUo3VUBZNkYlQgorTTtUQSg9MzguJlNFSjYlTTsxJllGKTI1QkJHKF86SDVaPCM4TTY3SVs4JDU7OCM4VjEmKVc8RVhNJTFAWQorTTpVSUM2XlFSO0ZNQjUzXS06VklCPEdJWjI2LUMxJF1CMzI0RTI3LVI6V01QLlIhKTo0MTg4VjFLOEYlSQorTS8iRS08V01QOlYlQjpXLVM2M1BJKzZOIj5WQTE4RExZOFYlJTNTPC4jQzlQQkg5SjZVWFA1N0lLOiYtUAorTTgzTFAyNDEwNkFMLic2KiM+Rkk8Okc1PDI2JUk6NDAjL1kkWS43IVI+RU0oPFdVRjQnKVs4RVFLO1AlLQorTSA1QCBfRDRWLyMxKThGOVI2JlFOOlYlQDg0TUEyNEU0KCFVJT4mKSksJylfOlZFNSpSVSk4V0laPidNWworTTwkRS08Vk1JNDRVOSwjITg7VzlbPEZBNS1UXUExJilEPkg2IzxGOVE6Ri0vNiJdJTtWKUI6VTBQKCIhQgorTTdVWFYuN01CJlE0Vz02XSc6JkFVPzRETTM1UVZAM0U7OlYtNSszPVJAVixfMSQxOTZWIUM6T1lVOkYpOworTThGTTE5Rkk6N0cpXTxHLUMzNlFBJzFAOC1HJTw0J0lWNCRFTz1VQS04Nkk8NjcpUzhSVSQ5RllKPlghUgorTThWOVs8RUEkMTVBTj5VTS86Jik6OFVJODNTMEApUlxZPUhFUDwmRF8zJk07OlZNW0A2RF8yNEUrL0FALgorTSZTXU48RykvOFc5QDI2IUs4RiVBOFZEUic0NUY9VFUtPEcpJDA3NipAJU4iL1VIIThAJVAgL1k5LUQ0XworTTZGXSw2NilaO0UhSjw1TUI+RilDOSMwPS1HPU8zMzlPQCZZQzo0RSQvVSFDPEc2IjxFQSkzNk1bOlVAXworTTUzIEU2JllWPEZJSzZFQUExMj04NCZaIEFHVU5AJ01OOlZAWy1FWTk6Rz1DODQwMjpVWSkmUlVDLUBELgorTSc2SVo4VyEkNjhBKy8lTTo8KCk5MyZaIj1VQFIzJ0VSPCZFKS9DRUE8JjtePCQ9Qjw1TTw4Vl07MSNdPgorTT04OVo6U11GNiBYNSpTXUo2RDFLOlVRKD5IKVI4Jl1QLjMpSzxGSSQsJUFCNkc6Iz5WLTo+R0lLODVBOAorTTdGKFkxJi1KOkYlNjpWRF4qNDE4LURRSzhWTU86NklBODZRMTxIKVo6JFVCOjVAVC0jKSk6JUk6NlUlTgorTTwmJTo2JDEtNlZOITlDKEk4VyhZMTdJSC1GJiNAKSlXQEMgUCAzXCE6UCNeL1M5NTgmRVI5Q10kPVZNJAorTTcmRE0sJz1cNlVAVipUTiM9VUBZPFdJPjZFSUg8NEUlOjcpTj83LSU2M0UoPzctUDgzWEAmVEVaQFcpOworTTdUNTs+JiBZNiYpOz03QV05RzldPzc1UjlTWSktJi1SOEYlJCU2XUAyUUxfOiQwRycxTUJCR1VbODVCIgorTS9TOUE8J0ojMjI8Uj5ISU44NDU8PEc1VzZDTEUxJyk6X0YsTzMoIVM4VilLNkQwUiwmOVw7RklCOFVESworTSo0RVA6VkU5OCRFSzZXOVU+Rk1aPlREWThVTSktQlUpNiRVUz83VVI6RklCNyZFPj8mUTkuNDUtNjcpNgorTS42KTAyMlU5OlY5LTMkNUM4VVhWOiZNNjE1OSkrVDVLOkZNOzY1NSkzVk1QLjNcXzImTUw2VURfKzIoUAorTTxHTUEtQ0UpKjMhUjIyKUJCJllUQFgpQy5QJEUgNiAgX0NcXDdWLVM8VkUpOCdRUzpGKUApMUEsQiYlJQorTSghTFk+SD1ALCZJUjg1SSU2WCUvLjZNUjxYPiM4RVxXMjchRjwmJEkjQFhNOEdJWjhWISU4WClLM1YtUgorTTlFLTxARVFCOUdJVT8nSTkwQlU7PEVJSDgjOVc2VFBeOCgiIDpSNCktR0ldPUcpQkBVRFAuNklaOlM4OworTSk1WVo6RihWMjdNWjxEVSsxNiFKMT9ZOC4zRVo/NylCMzNFKTUyVS09NklDNlVFLSsyVSU2Vi1POFRETQorTThWTVY+R0lKO0dNOjY3KUMtQkRQLEQwXzhXKV1ARzlTOlVBQDQ3KVI2IzkkNTQ1UjokNS0vQ0RNMzcpUworTThUNSQ2VFRQLUVRUDslSF8uMzklPEZdTjZVTTkyNUEwPTNYRS1DOUM6VUk4OUJELiRDRVI9RyUpLyIgTQorTTozODIuNklaPzg6IjxFQCEsQCVAIC9ZODE2RTs6WCUvLjYqIz1HTUk2IzhcNlgtUC1BQDgtR04tOyNdQQorTTolSSw3Vi1LNiNdSzpGOipDVylJL1YhQTInJUEqMTQ4KzRVSjpWTUguNFVbPCVBLTpGOUAzNzVLOEVRRgorTTZYKiI8JUkpO1ZdLDM2QT44RUxeODZRTj8nPFwoIlU6PkdJRjhHPVEzNTFMPFZATSYiISk2Ni0pJlJVSQorTT1GTS02Ji1SOkRXXjszRD00JlVSPCREQCs1QE0tRklOPFVNQDgjRT44NUktNyZBPis1QVI7RlYiOSY5WgorTTgjRUY8Q1hNLEJUTS5TRTE+WDlSPEdJQjhWRUI4VERJNjclLzlXKUw6VERfL1NFQjxGTS01RiBZKCNZJAorTThVWUIxMjRfMTY5VT5GKTs2MzkpNlZNQS1UTUE8Vz1LNyZEWyYhNEU2WC4xOyU4OCs2JTkqU1lDQkhWKgorTUBHTUwgNFQhOEAjXjo1TUwzNjojMlM5SkBWWV08VUEpNkc9WzwkREsqM11aPzZNOzg0VUAxNilKOkREVAorTThWQS8+SFVWOiNFLDEjIUk4VDBAKCNdSTxUVSg8VjklOFc9KSwkUTs8R0lWPTZZSzZEVVI8Rl1COScpRworTS41QTo4RFUpKENdTzxGOVczUzkrMzZWIzxGOU09VFRZOjcpSC8iRDgsQ10tL1FMRTY2LTs4NFVLPEZJLQorTV9GOTgtJTkxOVctSTU0TS0rMjVCO0dJTDhFSFk6Vi0/MjQxQDgyNFk4RylVQEVZMDtGLE0xNikpMlM4VAorTSgiRDspVildPEYpVTxWTVI6VDRWKTZCIjQkVUJAVylBODYtPDZHKVI2Ri1SN0NdPzYmTUM2U1xAKzNdOworTUFIOVIzJi0pMTZdUjhTXS86VilLO0ZNSzgzUDgmVDVaREgpQSkyVUg8JUUpOEguJUFIKV1AMCVBIDVMIAorTV9FTTs8Jy1aPVRFOT5IKU4/JzlAN0VFSjxGWTA2I1ElOFZNLTZFSFk2JiVCOUchKyc0VUguNjoxQEYgTQorTSs1NSk4Nk1GLUIgVjhXPFYpNUlPNlVNUDYjIF41RklaPkcpRjpGKS04RilANkYpSjIxTSk4NFFSPEQwRQorTThHTVI8RFRWL1JUTzpHKTw4JylMOCZBOjhWOUYxIlUpODVcXCs0RSkxNUEoOlY5PjhfVUI2RUVLOCYtRgorTTxXKVQ6IzhAM1ZRWz02TS0uNklEM1M4TS42JF8tIyE5PzgpTjpXIUMyVEU7MzYlKzEiVEkoIiEtOCZNSAorTTpGUVM+RkxNJTI1Qz5GSSkxNy1SOFYtSjpFRUg5Rk1LPEZJQDhFSUs8VlEpLlJUPS44OiJARU07LjJVRworTTslRF8zVUxZLjRVQjpWTT4mIShNNyZZWjsjXSk6RllJOCRVRj5ALV0gNyghODAiTzNUUU8+R11AKzNNPgorTUBHVU46Vik7N0VJSjslTUA2RF04NkRFLDgjWF42VylMOUU0NSs1UFk2SC4qPCI0OzJXICM9X1lDLyM9QworTT5FRFQvRFU7OjZdQTIzOTY2Rk1LMSJUWTZIKipARkE4MjNcTS1HIVAuNkIqOiE0XjpFUU82I1k1KCIhJAorTTYjRTg8R0lbPEYpTDo2SUktQ0UtM1NcWy4zIFYvRDFMOlVRVz1GSTs0JEFIOEYtTD82WSsoIlVAPkdJSgorTTM0XVI8RkBcKCJFODZVRFIuNyoiPkcpUDlGIS03VUlLOjRETSxDRF86NisrOEcpSTZHKVU6IlRFMTYtRgorTT5WJSkzNi0tNichTTZVSSQ6R01QM1RVQjpVTUI8RiE1NjMwTT82OUo8RyBbJlNZSjpVQUI2UyhSLUNFQgorTTo0NEAmIjUpNicpSjE0VUM4RU04L1UlUyBXVCE+QCVKICkhOzEmJVQ7I1hFKjMhVUBGIUM6NDVGISZOOgorTTw3KUs3I0RfNiZYXiszXTo6VEE1LSMwXy1ENUY8JzxFJlRMIzxPWUk4NThZOFguITwlXF4zNzVaOkVMSQorTTI1STg5QkRANjZJXUE5KVoyMzhAJiI1Uj1VQTtCRzxJL1YlLDpWVTg4M1BcNiVAViwlUVpCR0laPEYtSworTTpGLUM2VURWL0REWy1CVF44Rk05QCg6Iz0lQF42JUk6PEgpTjhUMDsyOCIiOyQ1OztGWUgxMkRJMjVZUgorTTJTXVA9RylOOyZNOjIkUSQ4Rk1AL1M5KTZGTiQ4VSFCOyAtQlImLTQvRkFCN0dJVzYjXFsrNFVXOUctSworTTNWPVZAJiEvOUcpSzZHKVIzNiFBN1gpOCxFSUIyMiBNOlgpUDlGPF4rMzg9MjU0RS40MF82NF1QOEM4UAorTTZFRE0tRUFAMzVZVT8wJiMgNzQgTCdNQzI2JSsmUUBJL1dBTTZGOU0rNEVTPFZRSTpWWUw2QzhWMjchOAorTS9TOSU2RDU4OUZFJC1ENUI4VThAJlNdUzdALTtfRiBWLUY6JD5XPUE2VzVbOFVITTM2KTYyMSg4MzcpRgorTT05Kio5UkQuI0E1MEBHKUI9OCFBOFVMTzNWSUs4U0U4OyYgXCZTIVNAVllWPkZJSzpWLUo6Vi04L1VBOAorTTUzXTU6JFRPPEg2Jj5GJTkxM0UkOydJVThERDIrNjoiOkNdQjxGWUAuUyhUL1RBPDMzIUM5Rkk6NCZdJQorTS1ERSs4NF06NiNdOzgmIUE1TFU5OkVNKTM1QUI4VkE6ODVJTT1UREAlM0VPLjYpUjlGRUY8Ri1JOyZNSworTTpHKVMzM10lPChJSy1TOEkoITRAMzcqIjxGSUYzVTBbMSRMVy9UTUE4VUVCODNcRzEiVC4oJDU4KzMhOworTTpQJV0gOCggU1kpWzg2IF8mITQ1KzclOjMmOVcyM1lJPkcpTzxFUUMzM0xNLUYtSTtGJUM2Q1xZNkZJOQorTS9WViBBUkQ4KTNdMS4yPFY4VyEpKCMhUjhGOU84VllaPlc8XjhGXTYqMTRAMScpOTZHSV09UzAjI09YVgorTTxHJVI+Rk1CPFYsXi41SiA6IlUsPVYpJCYhNSU8Vyk5NlVFSzpVJSQ6VSEpL0NZNThVSTA7RUxNOkhBXAorTTdFTUo2IUxCN1YhSjhFQEsoJDFZO0VNPj5GTUkyMyhbLlQxOjZFQT42Rkk6LCVAViozOSU7VV0kMlRFLQorTTM0RSwzNF1RMlJUVjg0VUs4Vi1QL1UlUCswWC4rNiBWLjRRQjo2RS0xNk1IMTZWTjs2SVo6U0U6PVYtLQorTS9SREkvRi06NSJUWTxGUVI9OC1YM1RFODIzRTs6NUFBODRFKTdCTC4mUlU4MDI0TSwgJUsgOEggX0hWIgorTTxGPTkqUUAuKCVNUDolQUs4M10tPDdJWkBHTTs2RDBSLUVBSjtXIVI8JiUkOFcpODNXKipEIzhUMjclQQorTS1BQDs4JlEkKCMpSTgjXTozNDExO0gsWThHKUMsQiBZMzdJRjg2RU48VjhQI0BYTTpWVVVARyk5OkZJOAorTS1GJV06VDEkQCZdKScxNEUzJ0lLNkRVQjpUVFk7VFBQKVMpKTpWQSg6RkxWMz9aIz00VSk2VkxWLUVdQgorTTZUQUM7MzhWOjY5SztHSUI3JlkrL0M5JThWOVM7VSIgPkYtTjlCRFYxNyk4MjVNUTokRF4yM1hHN1QwTQorTSs0RSU4RlFDNkVBUDw0MEAnMzE+OCVNOzhFSUktQlU2OCM5JTQmViA7U0UtPEZROzYzXE0tRDBfL1JUXgorTThFWU49OSIiO0chSTYjRS82JEU7OCNFKT1VQEsqVE1JOjNSIiYgWCEvUCYiIC9ZXT03JUg5Q1xLJiJFKQorTTlGXTkuNDU4L0VJRjxHOio8JiE+L1M5KThGSVI8V0lXNiZJSzZGQUM9OC0vNjVdWz0kMEkrNU1IL1IgUgorTTZHPTs2VVhWLCRBRjYlSUo7JFxWMSRFUzxWKTo7J0lKOUJMMis2KVo7N0VaOlZJTy9SKUA+RVE+LCcpSgorTTVDKSEvIj1COlYhLTgmXToxNkk6KzIgVjNXPVs6JiE6KVMjXjxHISQyNUFDNkVJUjxGTFc2V0xWKVU0WQorTTQlIUo6VU1LOERUVjE1STw8SCE6OUdVRztGQF8tRDVaNkM4VztIIVAyNUUkLEVBJC1VRSkxJUVaPVQ1JQorTThHKToxI0xfNiVNOjhXLTozI10kNiY4TS0kRUI5Rkk7OFZZSzg2IUEyViUpMjUwQCc1QS86RyImQSZNVgorTUEmUSk2NUBfMTRUXzI3SUgtQlUlPEghNUBAWC4gM1whPTAjXj5WWUw6JyVGMSJESzYmLUM8IjQ9MSRFKQorTThGQTA7RlFKODREXzY1SUI+JllaQVchTDskXUg7Jz1eNlYkWTZXPUkyViVQPVVESS1ENVI8Ri1JN0U1KQorTTgnIU82RFUtNkZJOjpGSSUtRF1aPkZJNSkzKFk6R11COEdJRjtUMEkvVklCNUNdSz5GJE0xJTheNkZFQworTTM1QVo4JFVDMzJUSS9UQVFARz1GODM5NV9HKU4vVDFANlVBMDhGOVI6Ji4jN0JVKTJVTF8uNyVSOlVJOQorTTYkVS0uNFYiO0VJRjtFWUM2JDBHO0YgVixFQVc6VilCNlYhSDMjWUk4M1hUOEZJOjNUUUozNDUpL1RVJQorTTM2IVM8RFE2L0RFOzVDXTo7VUU6OEcpSzQmSVE2VilaOEYtRC0hVFkpVEU+PkgtLTRYSiI4Ri1AMjNMXworTTI2RiM7JERFLCZNWy8oKC4jQCU2IDc0IF9HSUs2JDVCPiVIWy9VQUM4Nk0+NTRNQDgkQU82I10tPCYkXAorTSo2RUY3RUlGQFdVTjhXPUo4RUVLQEYtRixDOTY6NkYhPEcpSTI1QSs4SCFMOFYpSThXJUs7Ry0pKVU5WgorTTpFOTsxIjRWPEdVOjUiVFY2JkogOEVNTjNVTUI3REVLPEVFLzxHSUs3QjxQLURdSDhURSk+RylSOkM4OworTSZTOFY4SElaN0ZFQThfWV89VF1ANkYlODM1ST46RylEQTc1OjZWRU8xIikkPDctOjE1RS04MzkkPkgpQgorTTQkVUA2VFVON0VJLS1CVTs/Vik7NjQ1JTZFRFAyVlE+LUNFJDg2QS0zNUErNiRFOC1DISk6R0lSOkRMXworTTYlQUA6NylBMzVJUjpUMTw6MlRQPVdROzYjOEs1MiBANUdJWjE0VV0+RylSOzZETTU0NUtAVk0pJlNZWAorTT5ERiImIUAhMSAlSiAvWVs7JDA7LCctUDY0TFA2Vz1LOjclQDM2OSkzNkBfLUYlJCkyVTk2NUBfNlcpSworTTomJUo+RyBQLjctVzwkTE0uNUE7OVcpQzNVTUkvVilaPEVIXjMlWVIzNSIiOVI1NT1XISU2NUBcMjchWworTTtVWFIpM0VCQEchSjlGKTA3Rk0pNkc1QzhHSU44VzxWLyM5KTxGTS01RylaPzdJPipSIE0uVUlWQEY5SworTTtFW144REBQOFRVQzglTS82RilKPEZZWjtGKVM8VlEpMTY5WzZERSQxNkkvOjZJWjtGLFkyNkElN0dNWgorTTwzXDstR0lDOCVAWykzIUgyMyFSPkZFKyszWTg2I1kkNTM4UDxDWFItRiVCOyghODEjXSk4Vy1TOjRNQAorTT4nLUo4RURNKTRSKDg0NEAqNDBJJiNFUjxGOVI+Rk0tN0ctUCZSVFA4WClLMSFBKUBYSVFARUElIDREIQorTTdQI148RyBSJEFVOTpGLUExI0VCOEc9TzVERTo2I0UpOCYlPixBQE04JUBeL1VBQC1ENUc2RylQLyI1JworTUBXKVAyUzk4PCYtQTg0RTA5Q106OEU4WSoyRS82VFU7Pkc8VilWIUMsJE0/NjVJUz02SToxMlRFK1Y5XQorTTxGVUszVilCOCVJSzwnPVM3Jk1VMSVZJDE2TVIxJDFGPTc2JjhTXF8uVUVLPEdVUjtHVUlfRDBWLURdNQorTTE0VTo4VilCOiYhSzxGSSg8RllKOCRVOjtGSVA1Q0UpNlcpUj5HKUEuNEVPNjNdOj5IKU0oJEFTOUQ1QgorTTwkNFk2JUBbPlhJWjpVWTUxJExNKTJUMiZWKUAtQU0kMjNdVzhVRSkvVU1LQDVAXjhILVY+VkU4LUNRQQorTT1WRFwoIkU0LEI0TTNWSUZAOC1QLjNZUj5CTDgmVU1fNlQwSSlWKihAWCoiQCAlLyA0QCBERklLKzI8RQorTS1DISU4JEQ7JlFVVT02LUE4UC05X0ZBVzoiREAtJi1POCQxOC8hQEUyVUVQOlVARS1HLVM+VyBfNUcpXAorTTo0VTozNDRfOjYgXikxNEkyNUBeMSZJWjxEMSkuMzk4OiVJQzxHKVc7RURfKzJVQztGWUI4VU1INkYtUAorTTpGSVU6VF06OiNZST4lSU8+Q1hNOEZJMT00UFY2IzhfOCZZWj82WVg8RDUrOjZZQSwkNS8yNV1NPkZNSgorTTxGSUE6VylKOE5NQDYiXSQ9OD04KzRdVUBHVVo2Q1ktPEYoXy1GTVo6UjRFNkZdOzZWTTguNEUlNjdWLQorTT5GKVc8JilJMSJEMigjUTk7VTA7LUZFOzpWUUM2I0UtOUgtKy1GSiM7R1VTNjRFODwnLUsyMyhUODU0VworTS8kVTk2R0okPFM4QDQnNSQmIFhZOkVAVjEiREc0JyoyREAlTCA1JCBCRSFTNiVZPjUyRE02I0wjI09ZSgorTTxGWVpANiRfLjYpMDgjTEkrNDFKPVYtQDEiVFw1NkFXPEVYRS1WTVI/NylBOFVNRj5WKTsvUlRQPCc1NQorTSYgWDsxJERNJlNZTkBHXTQnM1EtOEVZUjpWOVo+RylMMlM5QjtHKSwxIzlJOCQxSDtIKVo0JUUpKzI9SQorTUImWVVAREQyNkcpPjMiPEUyM0xSMTRVRj5WVU48Q0RNOEc9OCoyVFYmU1lLPzdLUzE3LUs4RVFOPEZBQworTTVCRE0xV0lSKzRRTT83SVIzNDU7PkYtKy9WLVU4NCRUL0RVOzo2XUEyM0RHM1c2Kj1FUVY8Ri1TOjU0SworTSxFOUI7ViUkNidJUjo1TS0rMU1TPkc9KTY3KV07R1FWOCVZOTpGWUs2RUBcPEc9PjE2LUI2NllbPCRESQorTS42QSkpUFhWOjYkTTEjUDUmVDFdREAlWyA0XCBfRFVMPCVNQTo1USk4M1xAJzE1QzhGLVpARyE4MjZVLQorTS9SVFwxIlUoOlctUjYzXTg2JVlTPlYsVjU1WVpARk07PDVNJDxIQVo4M1xNPEglOCRAWDUvRiRLKCI1QgorTUE3VUgrMzksNjYtTD1WUU88NzVaOEVBSDlGLUAvUiElOiNFJTZIKiIxI1hcJiBFJD5HSV1AUzhFNldJUgorTTYiNEAxJUE2L0NNOj01UTk/X1krKjQ1UCs1RSQoIFhWPFc5Ui9WQVA4RUlLO0YtOTZFWT4zNklCKzY9VworTT5HNUIxJFVIOkRVJDg2XVI2RTlQN1NZLT03SUo2UzhSL1ZJXT82TU08RilbPEY4XC1ERTk6M1xWNkYpUgorTT5HISkqUiFaP1YgUC9VWVU9NllLOEVNPjZGSUw2ViE6LjZBTjI2KVo6VjlaPkZBKS9VRSkqMFhFNkZEVgorTS1DWDUmIjYiNjdUIUBAJTsgL1lDPkc9QTNWLU84VkUlKzMoOC9TWTA8SCFTOlZFUjpUMEUvVjhfLjYhUgorTT1HITk2RFUtOFcpSTg3JF83J0ogNDcpTi9UQVpBJyEtMTc2IjgxVC4mIlUpMlM4VjM2VTM5VkUpOCVRSworTTcmTVM8RylOO0VJMDpFSSk4NVhFLUZBQDE1QVtARkBWJlIgSywmKUs+SChWLUZOIj5GLFslMzk5PCVJKQorTTg3KUMxJys+OFM4XjojKVs8IiguKzZNUjtGIUg6VU1DOlZVSTIjWUM+RylAL0I1Qj03VVIzMyklPCZMXgorTS1GKVo+ViEpPlc9QTZXNVs4VUhZOURFLDtIKVU6RikoOlZZOzY1RTs4JUBWKzNEUDMmTVI4VVk1PSZQXgorTSkyVSk6RylKOFZBJTlAMUtHRyVSJlQ1SCwjRVo9NVFOPzcpQjI0XSkpMFg4MjYkTShBTDsuNDU4O0AmIworTSA3LCBfRylaQEdBSDhXLVM/JkE4MSJEQC9EVS07N0lSPkdJUjYjPSk8ViRWNicpVj5HIUAyNTUlMyRVLQorTTxFQFk3KCFXPEc9KSk1IVw8I0RfPTgtWDEjMSQtQ11AL1NZSDhSPSg7VEVLPEYtPDhVWU48Rk06MjVFQworTTo0TUI7VChJL0U4VjEnSiQ8RDA7NiVERy40VUZARTRQOFgpXTpERDImU1lbO1YlQzxGXS02X1k7L0RFSAorTTlHTVUvIUBNOydJVTpGUUs4VkFSOUYpKSlUUV0+VyBWKzYpVkBHTTYuVDFCO1QwVjMnKVI6JUFCOUZdQworTTtHSVs9Uik4NiJVOT03MiE6VUlLOEMpOjhWSUs2JEU8NiRNODgkUTk8J0FBMlFMOCozXUM6JilGOzJVKQorTTxXLUw6Nk1ALUMpRisxVTk6RUlCPUctSTYlRTQqMUBLODcpQTEiIDsvVkYiPEZMIT1AJVcgL1lSPUdJWworTTxGOVI9SC1SPEcwWyYjOSkzNU1LPEdKIzxGISs2Ji05LUNNQjxHVVs4NUU5LUJUTSwmKTsvU0VCPVVFSQorTTUiISQ8Ry0sL1ZKIj5GJTk+Jjk5OiRFJTomKSk2JiElOFZNQjZFTTs7R0lSOkREXjMmRUA6N01ILlI8XgorTSsyVVBCSCkpKERVOSkyVSk4NylCL0YtXT5GWUgqMTRUOEY5SztHNVU6JU9eOCU5ODo3LVI7RkRNKTVBWgorTT81US06VjogPzZJOjIzOS06VylSMjUxQjpXViI7VkFLOFZNLTI0MUs4RUkpOCNdOjM0MTE7SCxbMjYkVgorTTJWXUo8Rik4OyYoUDE2KUY8Ri0tODRVOjo1REcpVUVbOCNcOCUxNFY4NiEtOUc9KS9GRVo8RylPNkM4WworTTwlRF82JyFIOjchSzpVTUk4M1BSL1ZBVzpWLTsmUlVDQEcpUyA2UCE4UCNeNjcpSjxXKTs6Vz1bOUZWKAorTTYyIFstRFUsMzZNTj1GWUw4NU07M1NcVzE2Sio+RF0tOEU0Uis1NVEzUzxJLjZdQDg0TDspVk1bPCRFTworTUBGUTYtJi1ROlcpSDYlSSg4JjEsOCcpPDpGTUM3RjlaPFZJJCgjRUEuNilaPEYtKS1CIDgzKF4qPCVFKworTTg0RF8zNi1INkNdLTxGSVI8JERHLlY5JzY2XVo9RzVMX0YtQTlGRUs7RjlKMjI1KTpXOTotRDEwPTgpUgorTTZUVTk4Ji1HPEVNSThGIUI/JkVNQidJUjZGLVM6NiUpLUc9OzZVWFYsJEFGOjZBSTsmSVI7Jk0tMyYpUAorTTY0NFkxJylXOEYtJS41QF4mIFg9MSY9OSpRQC4oJUFPOiVBSzgzXS06RzlWPEYsTSo2TUMzVSVVPUdNXAorTT1XKUs9ViElNiYhOThGQTw7MlQ7MjgpSj5AJU8gNEAgRjRNQjM0UVI4REFHPEchWz5GTTUvIUxAKCNdQQorTTIjRSU8RiwjNi9YXyxBVFk6WCE4LCNdTjgzPUM+RF0kL1RFQz5XVTkoIU06Pkc9LTxIRVM4IzhZOFZNQgorTTtWKToxNTlALjVKIjpHLUw5Rk0kOFZRQS9BTF82IjUsOSZVUjo0REAjQlVZPTc5US40NVM8JilCOVQ1RworTTNVRUI7Nyk5MjYhUjdDUSk2I0UnPkcpSzxGUUM8RklGODQxJTZGTUMvQyBeOEclVThFRTszVTktOEZTRAorTThGLTo8J01LNlZZUD0zRSxARiU4LjVBUjxGLUk3RTUtNlVJJTtHSVY7RylCL1JVKUAnKTguUUxZPzcpTAorTTZERTkrMiBHJTFNSDlDXEsmIkUpOEZNQDI0NTgvRUlGPEcpUCpRTTY2IjQ7LjVdUj8oIUs7RyxfLCYtUgorTTZUTF4sJUBeKzJUXjpAJVcgNUAgUjZdSjI0NUs8JFUvOlZNTjo2IUI5Q1BQJlNdVzMyVFA4JExWMTZNSQorTS9SNEUxNl1JMlMhRj4mRUw9RkU4MTVNRz5GXSUuVDFJPEZNLTxISVs4RUBfL1VATzM1SS04Ni1JNkRQJAorTTxPWTw6VFVDOlYhNSxDOT4rNiE7OEZJTDIxQC4oRUktNlU0PS9XSVw5RUlANiYgWSs1SVo8RU1BPVdJQworTTZVWSQoQkUnOFVJSjhUVTg1RTlDOCRVOjhGTTsuNDFIPEcpSjwmKTkxI1k5OlYtOjMmWVU8Rk0lNkc1TgorTTgnNSUtRDU7OEghTDhWKUE4VkUrL1VJXT5GLUk2Q0xFMjc9VTtWWFYrNl1LOyVNMDs0MlMpVDBQJlZBUQorTTlEMEkqVEVBOFYhKS9ENSkyNilDOEYtJC5VQUMmIEQ4KzRVTj9XSU44VEUrOVZJPjwlQFwxJE01LyI1JQorTSA3KCE4QCMhPFZNLDg3PUw4NiVYPDQ1JTM0XUMyVU01MzdJQS1ERTkrMiBWQFglTTUzMFY2JUU5NicpWAorTT1WWUs8JUhfNlVNTTlSVE01RyFSMzI9WD5HPTozJkFBMzM4Iys/WUE6RyFbOjRVQjtHTVI7JUlKPkZNQAorTS9TXTkyNiFDOlZNSjIxQCksRVhNKzIgKS9XKU02RFU6NiVATSZUNVI5RFVDPEgpPDImQF4oIlRZMjQ1LworTTMiVSU4RllGNiM4TS1GKUMyMzhfMyYtWj03PUMrMUxWOiYoRTM3PTo4JzxZMSYiI0I2WFYrNiVDOEdJUgorTTZDWSw2VkktL1YuJEBGTS8xMzhWNkY5Sz1XKlwuMzlQPEZdSTY3SVUyVVk+LlQ1Qj4lSFsvVUFAOFYtPgorTTYkTUA4JEFJNlRVOTE1RVAuUVQ9KCMpLDxIQVwzVEVXPkcpUj5GRTUvU1lJOiNZOCA1QCE0ICNDPCQ0UAorTThYIUI2R04qQFVEXjI1QUExNUFBMyZNSTYlQSQlMFg7QDhKIj1WJF8tQkRWODhCIj03KUY6VFxeODNdLQorTTwkRE0vVklPLUFNUEBXQS0uNkVSNiM4QCZSRSkzJUlaQTVIXzdILVo8RilLPkc1SzMkNTUxJUEtOCcpWgorTTolWFIvVkBFIFBHXihGKV84JDU4MzVAUio0MUoyJUE6OEgpTzZFSF4tQ10pMjRVLzIyRFIzVk1POCQwUgorTS0kVS0xM1A7JlNdWj03SVIxIUBANlYgQDE3KUA2RkBZMTYhVj5WKEUrNkE5NkYpNi4yREkzVUxZNiciIworTUE4KTsyNiE4OCYhPjxWQF4uNk1LNlVJUDxHSVw8RyE/JlMhUzwlRSsuNU1LOlZFUTgkVUYyNFVIL1ZNKQorTUZENUs3QkRLKVJUUDZYLVo1RUVTO0cpTkBXTUAvUj1KPFRFJSA0NCE4MCNDPDQwOy43KUkzNyotQkZdNgorTTckRTo6NUUsNiYhTDw1TTUpUFhAPkg6KkBXPTkqMFg1LjgqLEEnVUs4JE05NjM5KTsmQTk4NyVPMlI1TworTT5HLTk2Ji1GOCM4QCYiISIpVEVOQThJSzxHVVo5RilMPkY5Wj5GIFApVU0zJzRVWjgnKU5AJkBAIFE3XgorTSgjOUtAJi1AMjVFKS1ERT8xJE0sNjgtUDsmTSk1NiVDOFREXzo1UFwxJi1aPEYhKS9TOFIpMkQuI0IpMAorTT5IKVo4JCRbNCYgVjgnPUM2RiBWKVVJVTxFRDsqNTkpOjYgXikxNEkyNUBNMzc9OzkoQSwvRy1aOiYlMQorTTpGRTg2RloiOCNFOjtGTVM5RVxZJEFVOTpGLUExI10vOCcpTzVERTo2I0UpOCcpTEZGJUo8MyhJKjM4XAorTTZXSVIzJkVSPCZBQj1ISVo2IzlDPVYgXyAyVCE3QCNePDVAOygmKVAuNF4mQ0cpLDE0TTo9VkUrMTRdSQorTTpVOS0vIUA4NkcpVT84JUYoIEQpKEZOLEE4LVI4JUVBOEYhOzhUVS07KCoiOFQ1SDhGKUk8Vk1DNiMwOAorTSUyPE0lNEU7OUghVUE3VVE5RjlbPEVFSUBHPF4oJTkoKTRFSjImLTs+RyBSLCNQWypSNS0+Vik4NiRFQAorTTI0MS0xNUUlMThCKjtGLSgyNU1SWCcpQC41IUkzNDVIPEcpQjhFRF4oIUA1JTFUUjElSVpCJURWOCZNLQorTTYmTiI+Rkk5OCM5LDtGTUkvVVlIMzchVTUxQC4mVDEpL0VFSiwjPU8vQilDQkdRVTgmLUsxM00kPkcoVgorTTI3LUs6VUhfKzJMRS1DISU4JDBFKTM5Sj02LUE4UC05RzZBSjxHIVM/NkUhKTJUWThXTVI4JiU5NDQ1JQorTTZHViM6RUFCPEchKyAyVCEzUCNePFZUOyYkNUg4NUVSQkdJOC8kRSQ6WClDLCRdUThUVSkvUzBSLjVBPgorTTlHLUAmIEQpKTciKj8nVVoyNDVDOUZJSjozOE03SComOlQ1KS9UTUY+Rk06NiNQOClTIEAjQkRWL0RVOworTUInSUI3Jk1SPEZdTjxGTUA2JF07OiYpSjhHIUo6RVFNL1NdOCxCIS1AJkktL1MhODVDOE0vViBZKVcqKgorTT5HKTguM11MXSZVUjtERTs2NDU6OkZNWzxGRSktI0RQKCMxNTBENVJBVDBCNidJJTZGQU48R0lNOkZBQworTThEQU8xNUFUOCcqITYhKC4lM1lBL1YpRjUzRT4xITRZPkgiIjw2LTgrMTQ7MzZcXjg4KiI8ViBbKlQxOQorTTUyRE02I0xAKCJVOjxGWVpANiRfLjYpOzhWKVI/NzU+LEIgPTInKiI+Ry1GIFM6KTEnKVs6Vi1COFZRJQorTSAzUCEzUCNeOlZJPjAzXTk3Vi4gPzZZSTg1TTg0JklJLURVSTZEVSQyVUU5MjVFOjhHKU4tQzBAKTYqIworTUBHKVc2I1kvMzQ1OjwiVDs2N1VdO1RUUikzOUpAVz0pLEREOCYiIDglMiBWMSFMTT5XSTk2RyEvOUdRVQorTTYzXUI+VUEtPFVJOjpHKiQ+RUlKNTNZOi8hTFA8RklKLlI1JDYiVDstRkFBL0VJUjcnSUgvQzktX0RdSgorTTxGTUk2Q1xZMzVRW0E3SUI1RUUkJlI1KS40TVpCI0Q7MjZNLTZEUS0zJkk7PEc6JDpDXUIvUlUsPEc2IgorTTgxVC4mIlUpLUZVVzpVSSk2IzhfOFZVXT84LUsqMTQ4LUQxNThHUV0+Vl0kKzVFQTolUSk4M1xJKCJFKQorTTZWLVpARyE4MjZVUDMzRU5BVlVCL1NQQCs0MU5BSC1XOCYkXi1FRUIxNUlPOFgpQC1AJSkgNkQgX0RVQgorTT1XJSkxM1lCPkc1SzxHPUM6VilPOiVFQDZTWE0vJUUtNkMgVjgmJUY8I10rMSI1JDxHKUY9JkVJNiNcRworTS9FWDsmI0VKPEchPjU0MFY4WEIgODNdOS8jKSQxIzBUMjVQMigmSVcyJildNkYpWjxGQF4wNjheMSddSAorTS9UVTk7OCoiO1VRKTYkNEAqNiE6OUNYSTI1QEAkQkUoOychPjxEQVE8RDUpNi0wXzMlRUo9VihfLUNFLQorTTlHNVU5VyFPOiMwOy1CVSk9SDlBKjNZOzVGLTs4NU1CMyc9XUFHTTs2RUBbLjZJVUBXQSQtJDBWL1FNLAorTT5HNU8xJTklNichSDQlUipCRjklLEI0RTYmPU05Rz1WNiM5OzZWLCM6KkUpLSMoSS9DWTA8SCFTOlZFUgorTTtWIF83R106NkYhODY1NF4zNlokPFY9VzgkTUE2VF0+PEZJLSZQJF4gNUggX0NFJTxHXTsvQikpOEUhOgorTTxHSVc8RjlTOFVJSDgiVDsrNUVAODNYTS42RUs7JE04N0M5KTpWJFk3J0lVOEVEVi9FQFwtQ10tNkVZOQorTTgmIFAyJllSOEc9QzY2IUo7VkU/OkU4Lik1XVIyVD1SOFYtSjs3LVc2VUA7Kzc9WjhFSUI5RkosPkVJOAorTTdERTUyNi1QO1M4XDdGJFQmIjRCMiZJLTpVIUc8RV1COE9ZQTYjWTk8VkReLURFRzNUQUI3Rl1COjRESworTSkyIFY6RzVSODRFQDgmLTs2VUEsLjcqIkBHKTs4Vi1GNiZFOzo1XTY4NTRcKlJETTMnSVo2RUBNMScpUgorTSwjIVI/JylLOCI0QDYmSU80JyojPFVBUzo2RUw8Ry1INiQwSSgjWS0zNlVaPEdJWjhGLUM7Jl0lLjU5NgorTThWRTs2JFFbPFYuIEA1TTk4VUlLPkcqIjYyICErMCReIC9ZJC1UUVI4NDBAKVREWS41SVI6RlVWPlcpPgorTTpWQTUsQlRfNkZJQSxCNS08Vk1BODZFQDonQUAoIyIpPkYpKTYmIUA6NyVJMjRNOzJWLUgsJEVSNjMpUgorTTxFWUo6Ni1bOCM5KChCKSw8Ryk6MjVNUC40NTs2Rk06MzYtSThHKUs8RkklLjQ1QjlXNTs4SDoiOlNcTQorTS1GITsyMzhbLyRdOjZGTSQyNilDOkYrXjpHKS8xNilDL1I0VjhUXFYtRDU/NkYtLTEiRDUsRilKNyZBJAorTTZHKUo4RDE4MjMhSj03SVs0JSFDOiZNSzpGST87Vy0+L1VZTS5RVUA/NzxfJlM5QjlDOFY8JjlCNicgVgorTSgjRT85UzktPEdZWj5XKUY6Vy1bPEcpVC5RQFYyNFU7OlcpWkBWKUs7Jy1JNTM4TTYnIVc8ViUtPEctNgorTTxINUs2ViEsOlZRR0BGRTUgMzghLlAjXjtWKSw4Vl1AN0NYVjJVQTk2VFVLPTdRWzpWRUo8JkU+MjYpPAorTThTOEktRiE6OEZBUTlGWiI8M0xNQDgtUjNUNSw4JklaPVRVLTtVTUo6NF06PkY4TTMmTUM4RylSPTZNQQorTTdDMFQtRF1POkVJLD1UUE0zNilCNkUlQjxUVSUyJklSOCNdOzZUVUIxI0VNQkghLS1SVS82JEReMjVNUAorTThWOiA6I1xZOFgpOF9FSUY6Vk1KOEUkRS1GKUkyMlRWNiYlSDYlQFQkQlU4NkU5LC1DIU08VlxWLUVBQAorTTpGKVI/Njk6OiRROzhGOU46JU1SOiMhJTxGODgrNkooL1E0STI1RTk4WCVTOiRBOS9CRFIyNUBQMTYpRgorTTtHLVI3Jk1XPlY5TUIlREAuUzktMyRVSztHOVA6VylSOFYkWyhDRUI9OC1SNiVBWzo2XVI6Rz1KOlchOworTTgoKUI4QCU5IDVIIF9HNVo6JVFSN0ZBPiwlTiE+ViRQNkZZWj82KS8zNk4iPVVNSjxETFcvJTU+LjQxSworTTxWKT4+Vz1BMTcqIz02JF4vRUE6O0c9LTM2KTs5VU0pMjY5UTdENSg4RUlCPEZNQjglJT82JERZNycpUgorTTZGSTgpMyFCOiYtSThWUTkxMyEtNygpTjxEXFY2JFUkOlc2IjojPFs2NU0pL0NFKTwmPSc+Ry0pJzVOKgorTThPWSQxVjlaOzZNQyszXUI8Nyk4LUU1KDZGTUs1QiBSOUZNSDYiVEk2V01XMjJVJTpWQSQ4R0lOOyYpQAorTTM1SS04Vl0kNCZcVi1GXU0mUSkkPTREUjU2IUg1Ri1SPkgpUjYkRE0vVFU4LUQ1OzMlITk8Ri0vOVcpUAorTT5XSUs1M1A7KCIgXzg0QFk4VU1XPkYpQTUyRE0tRiolQFZFQj5HNVY6VUlDOUctUDZWUiI6JDAhODAlQworTSAvWUI5RllSPEVJODIxTFlAWDlLNiYlSjtGWUIyM1k6PVdJUjxHTSQrNTVAN0NcXjhXSVA2VylSOFYtSworTT5XKUIvVUFBMzZJUDM2ITs4JkU7OCYlPjpWLUExNiEpLjRdUjhVOF42JiElKzQ1Sj03KUc2U1xSMSZNRgorTThGOU44RTheLUQ1XT83OUgxNF1DOldBUj83QSktRkFQMzRFKTEmRU8uNklaLVFNKUBFT142RF0tOkRROQorTT5TIF86V1FaOlMhPi9CPTo7NyhNLUZFTTtWQSkvJFVaQCZEXC8mJUMyNEFLOFVZJDo2JSkqVi1HL0Q1TworTTI0RUs5QUw4L1c1OzM2RVA7VEElLjQ9WkE3SU8vVEU2L1MoWTZFTUkzNk1MMzRdSzpWWUk4JilGLyMgOworTS9XPS0rM1xWOFcpLTE1RSUqMUBQO0gpTDpXSU4+Ryk7NiRRSDo2JUtARyBWIDNYITMwIk82Ri0hOFdRLQorTS1CRDgsJyogOUZNSz03KUI5ViUpNjVFPDxGSUA3QjUiOCVBKS9UUVU7RUlDOCQxSzhXKUo7ViAjOF9ZWgorTTxWIUM4VkFDOFcpWztGRS04RkVBMjJURTxGTS0pU11VNiJUTTMmWVo4RUktM1NdOTZENSQ7Jik5L1M4VgorTTZGWUY4RU0sOEZZTkBHViI6VFVCPEYpOjglRUI6I10vPlVcRzgnKSc6RiklNiM4XjtDTFA3KCoiOyMhSAorTTEhQEUzOCEpLCZJUjhFUUAzM11CPEchOC9UMUg4VSFCOlZAVjI2RT4uNUU7MjRHLjolSUc8Rk0kLUVJSworTTo2UUM6RylCOUJUQjZGUV0+RiFCNiJUSS1FSUY+Ri1ROlYlQT4nJSUxNFUvOFRNOzU0VVo4MzhNKTRFOworTS9TPF8yUzguJiQ1QjE1TVI5R0lSOiYpOzY2JUE4VylIIDNYIS0gI14sI1g4Klc9Qy8iIDgmVSFbOFYpQgorTT03SUs7Vk0tL1NdODZTWFA4IkRLL1NYXy1DRUo8VFE4OiRdQDg2RUk4RilILjRWIj5FRSg4Vl1SPEdJVgorTTs3QTo0NUUvNjQwXEBHSUApMj1HOCJUOy1HSiIvU0UpNiVBOjolOFkzNFFBNiQxKTElQS8xVERSM1RRQgorTT5GMU48RUVDNyZNQzMmTiM3Ij0pPEcpOzwmQSlfRik8MzVAXi9WQFspNDFWPzYtNj1VRDImJDFaPEVFQgorTTtWLSU2NTheLjRRQTgjID0xJi1KOEcpVy1DRUM+JkEpLURNQDZFSVI+RlFSODRVODMmPTkzNylSPFYwVgorTTYkVTA9NzVaO1NQUis0NU48VkFXOEYpW0JILTkvREU4ODQ1ODg0UUs6NUBWKCJVOTIzXSUxM0w4JiRNOgorTSszISgxNSFLOlVZOzImIU46WClSPFAlVyAzXCBfQ1xAJTJVSz1VQSQnMFhHOlcpSTZGPVc9NzVaNkNZKQorTTpGXUY2VFxSKlQxKzUzOSk4VyklL0Y5Vzg1QTs8Rk1CL1FARTtXKF8pNFVLOldSJDxWIVo8RUkpMTRFKQorTTEmWVo7U0RNMTM4OCUyRTw/NERNMjVFPzhWOUM4VURQOjdJOjM0VUI6NU1AL1NcVjMnLTA3JVEtMTMhLQorTS4yPUJCRig7LURRLTpWWS01T1ktMVYlOzEzXUAvQyk7PTZUXjtXSUoqMShFNCdKIDhGLUkvU0UtOCVFOQorTThGTSQuU106OlYpQjxDXFYyJ01SMjFNJDwlRSU8R0lGPEZJLzYkRTU2I0UwPkdJUjo2KTo2NjlaPkZJOAorTTEiXFY4VylAOiYtMTxIVio7VTk8MjVJSTY0UTg4JlFRMjIgQC9WITo4JjhfJlFNOTo0RFsyNEReNlYtOgorTTZUNSc5VVIiPDY8IT5AJVwgL1lJLyJMVjg2TTk1Qyg4KTRdSzpWJTo4RlleQCVJKTJWWVs+SCFDNTM5JQorTTg2JTg4NkVQNTM5OjpWLTgxNi1TO1M4OCk2JU8vITRJL1NFRkBILV08Ry1GNiVBLTNVQUo+R0lLODVAOworTSNCPTw6VzVIL0VZQjtXKUs3Rjk2JlQxVT02OS80JU0lLjRFLSwkMUo6NFxZMjJUNSoxQDUuNzVXLUNcXgorTSlUPTAxJTteMzRVQzwlQSkzU0U4OEcpOyc2TV07RUBJKCJVR0JHOUw6MzhFLUZBOjonKVo7Vj04NlZVVworTTxGLF82NiVXPEVYRS1GLUM4J0oiOlY5SDo2IS04JkUvMicpWjpXSVIyNU1TPlc1UjYkRSktRU1JNiVNQworTTM1RiZDRyksMTRNOj1WRSsxNF1JOlZMWygiNSU2JildNjJMRTo3ISs2I1xWLjZFSDE0USUxJFE4QEZFOworTSA2LCFAQCJdPkZAUis0VTo2VF01LSMwXjo2XUI2RFU5PEdNOSxCVUJAR0ojN0YpTS9DOSU2NU1JOlYhLworTThWSUI6M10pOFctSTE0MUM8JVhSJlI0RS41SUY+UC1DIFVPXjY2IUs/N1VaPFYoSSYiRTo6Rkk6MSQ1LAorTTtILVo6RU0tMSRdUj82WVI4M0RQLUNZNi9FOTo6RkE4NjU0OycxVEArNFFIMjRdQTYlQSktRDEtMzYpUgorTTpWUUgtQ1k4NDVETTpHSUYzM10kL1Q1UjxGTUgpMUBFNiRVQjpGOVI8Ri1POzcpUjYzXVc8RklOOFU0XAorTS9ERUI+SFoqPTZNUzwlTSk6JzEsOiZVQ083KVs2UkVDQFdJUjYzRT41NiFINlVNQDY1QVJCR0k4LyRFJAorTTpYKUMsJF1ROFdJSTEiRDstRkVXOjNcRTE2ISU6NURcLUZBSzVENTYyMl0lOlVIITEgJUogL1lKO1Q1JAorTTglSUI2JiRcKlI0VjomRTs4NF1DOkREOyRDRVI+SEEhMzdJTisyVFYxNkVJMzVBSTpXLVIyNTE7N0ctSworTTVEQVA8NiEhLSNdKTNWKVE7JVlDODVNOzglRVJBKDFVPEYoVis1MVA+Ry1CNkVIXjQoNio6RDU7OkY5TgorTT1GWiM8Ri0pKzJVKzg2UUs8RyE7MiZETSgjTSk4VkFGM1U5SThWLSQtQzteL1RNSDxGOUhAJTRNL0M5JAorTTomOVU2RilLOlYtOzglQF84IjQ4JzNNUTxGQS82RilLPkZZSjpTWE08Ryk5MVNdOC5RTEUrNioqQUdVSgorTTxHSUIrNDFSOlZNSjhFJVo9IU0pPEcpSj00NSU2Rl1LOlZFQC9SITo7RU0vNiI0Oy9WJTs2Uj0kPkc5UgorTTozXDgqNiVIN0Y9JC9TXE04NU0kLUVRUDslSF8uMzklQEcqICAzRCEvUCNeOjZNOTZWQUw8NkVPNjJURQorTSgkNT84Ji05NkZcViNAREUyNVlbNjZVWjs1TSQtQ11INiJUTS41UiJAVFElODQ1Qzo1QTY2Nz1SNkUxOQorTTY1TVI+R0lQOFYtOzNVQS8+SFIkPTZZQzIzOUA9N01aNiYtTDo0NUo/NihZMyZJTDlGTVQ6NiIqPkRMTQorTS1EMU4+RzlSOCRVSDUyRFYzNlFSOkZBSzxGLUI2Q1hNX0IoWzwlWUM2VzlDLCM4QCZVQVo6VkFJPEchSworTTZWRUEyNlk5LyMoTTtYKVo4RFUpMidJWzglTEUoJUVLNiREUi9DKC4mIUBNNlc1VTpGSVM7VV1BOEY5WgorTTs2TUM8RzxNMlVJLzQ3OVA4NiEvOkZJSzhVWF84Nk0lM1ZFJC9WKVI8RjhWLlUhUjxYIUwsQjVANkVBSAorTTo2RTgvU0VAO0NZJDhVWUIxMjRfMTgpRkBAJTkgNEQgX0YhOTZGLS88SEVSPVcpQC0iNSsxNiVMN1RdUAorTTZSRFAvJTUtOENFUkJGOTs2MzlJQCU0OyYiRFY5SEFIM1VJJTY2ISUzI0U6O1ZNOzZGJUM6VVlbPFcpUworTTolTTgyNkldQSdJRjg0TFYzJylaOzRdOjlIIUI4Rk1AL0NZPDtGTUI8VjlHQTghSS9DODsyNz1VPTZNOQorTTZVQSs1NDE7OFQ1MD5HNUszJilNJE9YMi1FOSg4NU1GPVNYTSoxQE07RkVWPldRVzxGTVc4JDVSOERETQorTSs1RV1ARyk/NiU5Sj5WTTYuVDE5OiVJLTlGJSsqMzBcLENZQjtVRTw+RklLOlYhLTpEUTk+Vz1aMzYhQQorTTM0NTo7VylXODZFOjZGKUI7Jk1INiVFUDg0XUI+RzYgPEZFJThFWU46RjhfNkYtSTpWWVM8JiA7L1ghPworTTYmTUM2U1xAKzNeIjZYKCE4QCU7IC9YXCczRUg2Ji4nPkZZWj02TTg4VDUtOiRVQDpGKFY1NE1JOkVAQgorTTZILUwzMzhFOEgtTy8iIFI1MzlLQiZdQTI1XUg2RFUlL1RVSjtURUM6ViBUOFcpU0AmXTs2JUFCPEc1WgorTTpVRF8xIyEkOEQ9STY0PVs8Ri06N1UwXiwlTUIyJklVPzg6ID5GISkqMyE7O0ZNSjhFTTs4Ji1CODREOworTSc2QUY5VDFKQFFOTiREMS0xJilLNyZNQzYlMFQrNiE/N1cpXEAmTU48U1xQOzYpKSpSKF84Rik7NjVdVQorTT1HNUo1Q1kpL0ZFRy4wLUNTVkVKPDc1PzNWJFYsRz1CM1RRODE1QFYvRllSPEY5Sj1WSS0tQyFCQEgpUworTTY0NTg3RylSNkRFLTxGUTk4VylDPEZVVTxHPUMzVUlGOlchOzdGTUs6RVlGKjNFSzhFSUs8VlEpLlJUPQorTS43ICE4UCU2IC5UXCgjOTk2NU1XPlcpUj1XSUs6Ri1QOjNdJTZFQFAvVDE5OUclKThYLUs2MzhcNldJUworTTlDUSk2IzhfPkZZOzg2QVA7VkE4LjNdPDxGQUo7ViBHLCQ1Qz5GTUA2RUE6NkVRXUBWRFk1M1w9KzFNQgorTThDRT44VUE6NiRRNi1DWS0rVFVOPzhKJj8nPTgtIjRfNCcpQyBVTyg3RzldPEYkSSZVRUo4RFFORDI0OAorTTU1TTo6JylDNDYpQjZFQSsxI1xNMzZZXz5GWUMyNE1KMjJUSyYlUTguMzhQNkcpXUBWQSUsIlRNOFc9SQorTTY1TTo6R0ohPlZNLzYjKE0gVysjODRVLTYjWF86Ji1COzZNVT5GKFIlMl1XQidJLy41SSw7Vk1BMTNZSQorTThVQUg+Rk06MiZJWkBXJSU2Nk1NPERdLzZGXUMzVSVJOFZJQjpVTUI8RiE1NjMwTTggJUogNiAgX0RMUAorTTdHIUIzJVFSOiVNQj5HKTozJy1aOFRNKTYlRTgyNE0lPlclTEBXKToyNEReNkc1WjxHJUAxI11GOURdQQorTThXLVM7JkU4MlYlWDlVWUM8JTRUKzRVUDNVTUA2RUklLEZOKj1TOFYrMUBLKlQ1TzgkMF4yNUk7NiREWQorTS9URE0uNiFKPzg6IzxFTTUqMjRNNkVJLTZVTS84R0lVPEYkVjg3KTosJUoqNigsUDYmLCQ6X0VBNiUhLQorTTYmQEkmUiBSMycqKD8kXSk9VyEkJlMoRTs1QFYqMkReNjY5WjdTWSQqMiBeOFdJMDY1TTo7SClVOERVOAorTS9URVo+SC1QMzYlOzEzXUA2I0VCOUdOKDhSNCkkRUojPVYgWS9DTUI2RiUtM1RdJS9FSVs7Ji1DOidKKgorTTsjISg+RzVSMTNdKThWKUM4V0ojPFY5UjpVSVI8RFVAODVdSSA1SCE0MCMiL1JFLT5HPSwzJyFAL1NFTworTTxERFY2R0lONiQ1JTgmXSsyU11SPkcpXTxWLUEuUUxFOkgpXUBGLUY7Vk06N0YlQzxXNUs4ViRZLCZdVworTTZEQUo6JERWMjZFOyEmIkUyMlRfPThJUTIzODguViUlOyctOS1DRTY0JiE5MjRFOC5TRUE2Vi4iQEctOgorTTgkTFIuUC0pX0VNQzYlQTA5R0lXMzVJUzojXTs7RylBMzYpUjpFIUM8Ryk7MjRdPy4xKEcrMyE7QFdJNgorTTY3LUg3Q0xWODZBKS0jMFw2JUVDOlRETS1FTEAkQzlINkVBOjZWWVs8RU0tNiM5ODtHNig4QzFDPCVBKQorTTNTWEUsI14gRDcgSSNBQSk8RjlLODNYXzolRUM7JiUrMSM4VzlWJUA6V0lVQFYsVjE3TiI9ViBfLjkpKQorTTg3KVo/N1VOOyZNSzpHKVMzM10lPCc8ITswJS0gL1kkJlI1Qj5GKTE4VkRNJzVBQTEzXFA4VSBNLUNdQQorTT1WOUI2VkVAOkdJXTw2RSUqUjUtPTdVUzhWUVM4VU1COjZRVj02VUM3UlQ7NkgpSDE1XSwuM10lOjYhQworTTo2IVI7ViBZNkgqJDpUQEkvVyEkMzcpUC4zKE8uNUFANkYlSTIzWUI4Vk1bPTY5QjZWJUg5VTkpMTVNQgorTTpGLSQ0JylVOFZNUjpVTUM6R0teOlU5Qj5GTTo4VylWPiYhLTM0MEAqMzhcNldJUjMmRVI6RUEpNUcpTworTTMzKE0vRkVPOEZBNCoxKTgqMFgyKzRFNjdWQVM+RylIOEYoVi40NUZAViBQOEcpSzsmQSksQEQ7OkhFWgorTTIzME02Jk0+PEcsXjI3IUI4Vk1BL1VFPi9FRSU2JilXNydJUTE1QVI+V0lTMSJVJDY3KV09NjlDOiQ1JworTT1XKTo3RDQ9QERRSiA3KCE8ICNeO0NMUjZXNVI6Vi1PLUJVKTYkNTQvRUBWKzQxODhWWVI8Rj1XNyRRWgorTTtGTUk4NDFAPDZNWjxFWVI6VU0pM1YlRzxHNUY4NiBfMjc+IzpGOVAyMlRbMTYlOzZWTU87Rk1POjUhUgorTUBWVTgvU0U6LUNZSzxERFYrMzksOCRFLz5VWSUxNFVTPUcpQjgkRS08Rl1AMzYpQzhWSUwxJFVGOkYtWworTT5WLTA2RVlcX0c9JzhHSUs2JilSPTdJTzZGITQqMkRNLjYtWzxGIUE2NFRWL0RVVz5GTTQrMlUsO1RQVworTTVFID0yNDBQJTFAWzEmIVA4VylSO1ZNSzYiVDsvV0FQLjYpVTknKVIzIygpJiVGIj1VTT42JDUpLCYhTworTS41QUE6NkVCNiMhOjojXUEyNFU5NyRVUj4lTTk4VlFaOkQwSS1DOUM/NyU7M1YgVi9XSU46Ji05KTgoTQorTTIwJT4gOEAgX0dNSDI1SVI6Nz4gPVYhJTNVSSk4RkFGKzIgVjE1SUI5RllLPCNYUDhFSUI4RURWNldJQgorTTpXKVI7RikpMTRFJDI2LUIzNi1DNiYqIkQ3KUxANkBfMSQ1QTlDRSU9VEEoOldJQzhHWU0zJERQLUI0XgorTTcnKUM2IzhNLjU4Ry43SU4xMzhJNDVJPjpGIFYrNkVPMSRFQDhWKTw5Ri1BN1QxMT5HVUYzM00tPU9ZXQorTTEkVTozIzFAOkZVUz01IUI4U0xSKCFVKDxIKVo8VjhNKjJVKTxHSVU8RVkpM1ZNKSkzOTYxJTlJODIgOAorTSxDUSU6NFU7PEYpQjdGIEAmIjUtOFVBTjpEXUZARUxWJiIhQD5HPSQuNyFJLUEoVjgjOS8xNUFJMzQwOworTS9VWEcvVDEsOVQxKTsnKUMyMjxfPEZMUCs0MFYvVz1SNkVNRis0RVc1Jz1aOUJWIigiNCE2QCVbIC5NSworTTojRS06NEE5PzgpUjtFRS8zVkFLOFMwLiNCNF4zNFU8OkcpOTU1TTg2NUlBMjRRQy9DIUZAVllROjRFJQorTTEjOTs5Q0UvOjYlOjhIKVI1JllCOlZFOTNVUEUoJk0pMTVJUjY1TVs8VVFANTM4XDE0UUI4Vi0pLUM4RQorTSNCPUI6REVCN0M4PS1FTT4rMU1AOlAtOl9GKUIzMyhZOEclKTE3OV09Nyk4MTZJWjokRSkrMUBeNTRVWworTUAlISw8RDRfLyIgTTEmWiZAVzxSKCFMVjpXOUo5RylaQEghSjE1TSkuNEVIO1MgRyo1QTg2RiFDOzZJOAorTTZVTSQ7RjhFKTYqKjxDXUpBN0lQLUJVOT5HTUApMyFQOzFMVjomITkvVUFSOEVYSS9HJTUqMlUpPCVNOQorTTNWKUo6M1BSMyYpKS1JKSQyUzkpOFYtQjwkRF46NEFSQEdBPiwiNCE4UCVNIC9ZSzhTUFk4NiU6OldKIworTT4mQTE8Jz1SOVU1MCghQFYyNF05OEYpLThWQTkyMyE5OiU5QC1BTSQ6VFVSQCZFQTgkNTg8JUUtOEYtOworTS9WOiM6Vi07OlctUDgzWEUrNi1IO1ZNTjZFSVpCRylLOyVBQDo2KUI2NklKMyY5JSgiKTk4MzlXPlYkWQorTS9GITgvVEVJPFclQjZGKUszUzhJL0Y5OjEmSVo7R0laOiVPXjlGXFAtRDRZLUQwWTxISVo2Rkk2OCVBOQorTTUzWS07SDFTLUJESS8kXU47JilEPzhGKjxFSUM4MzhQOjVEQioxTSk4JDU2OlZVQjdVWFYuN01CJlE0VworTT02XSc6JkFVPzRETTM1UVZAMlQyKzVASSZVOUI4M1k5OlZJUC9TIVM7MjRWNjQwUDhHJUY7R0lKNlRFJworTTomJTgyVEUvMjQ1JDxGXS84JkFLO0ctO0BDTF4gNiwhPEAjXjxHISksJUlDOjYtS0BIMU4zNilLPEZNRgorTTxEMEktRFUvMychTzYlQUY6VVhcOCYgVDE2OE0pM1xeOFctUzsmKS06Ji04NiZJRjgiVUpBRy1DNkcpWgorTTsmJSsvI1EvPCcqID5GLTo7SEVaN0YtOjonKUY4VF08OkMhQDhVQFYuNUBeN0dJUjZERTovQ0U6OEcpWgorTTpEMUZARi1BMSNFTzkkVS87VjFGO0ZVUl9FTTgpMTRNLyNcXi43IiZCJk06NkY4XjEmWVo6RkVSODNcTQorTS9WJSU3JklLNCZaIEFHVUY4ViRfKTVdPCkyTEArM0U1MzZJUjpVWSkmUlVDLUBELic2SVo4VyEkNjhBKworTS8lTTo8KClBLjIgRS8hQEU2J0laMjMxKTw2JFYmIU1AOyQwWyUyTVA7RzYqO0YtUDpWUU86JFUnNjREVgorTSwmTVc2RFVKOyYtOTdIKFAtQCUnIDY4IF9GKVo2UjRfOlZNSThXLio/Nk06MyVNUDhWSTY1I0RfNjRVOgorTT1XIFk2RylBOjdVUC1DOU87MyhFL1VFQzlHLTw4VkBZMSVBQjtGQE0zJylXOkUhUj5GLS82JiU1MjcpSgorTT03NU42VVomQFYpMDhGOUo5RylLOFchKTI1ITsvUU0lODRFQzxVSFAyUlRfOiNEXztHTTw4RzU8NkRUWQorTTpWSSwxJk1aOEVROzpfWUk1Q1g1KCI1NS1DUUg/N1VKMTRNODgkNTlCJU05PVZEXys1QVAzNFFCQCYpOworTT03QV09RylLNlVBLTcjOSQvUzA7L1YhQjxGXUAyUUxfOiQwRycxTUJCR1VbODVCIi9TOUE8J0oqPkYgTQorTSs0NEAlMlVVQFRdOTdXTVQxIkRNNlZAXzUzMF82VF1GQFZNLz5IQVs7Ryk5MjVFNCkxNS08Ri1BOlYtSworTThWTiI2NEwhLUAlJSAvWTk6VVxNL1YtPDtXIUY/OClVPEVJKThGTUA2NkFAMTVFOTZGTVApVFFOL1YqIgorTUBGKUNAWD1JKzNdJTZGOVo4RilHKzIoVi9XPVIyVDVCO0cpQzpHKUs2JEUlNiYlUjxWVUo7Nkk7PUdVTQorTTZVSU48RilSPEZFTD1WUUE2I0wyKzNZKzg2OTgsIyg1LCYkOyRDRVo9VllSOERcXzI2LUIxMjUlQFcpJworTTZHJ144VilBLEE0OC1DWF45R1VVOlJUTS1HIUgzNylCL1M5Sz5DOSw4RUhQLEc9UjlFLTxAR0FaOyZZUgorTTZFSSkzJUU+KTJVNTM2IVc2VFBeOCgiIDpSNCktR0ldPUcpQkBVRFAuNklaPzhJSy9FRUEtIkRLPVdZOworTTgzRTs9VkUrODchVzY2IUA4Nk07NkZZSSwmLipBR0lKOCNZJS9BQC4rNV0wNCZJRj4nKVFARz1TIDYgIQorTTUwI144JUktNjYlQzZWLUw6V1VSPkc5UDZWKUo2RiVMOjQ1NS9UXUI6U10vNyQxOjxHSVU7OEldPEZFOworTS9UVUM+R0k8NiU0UiZSPUs8RVhZMSYpSzhEUUI6VlRbKCJVLzM2OVs9Nk1LOUZZVTtGTS88R1VaO0ZZSworTTlGSUk+JkErLVJEOzI2XUAvUyBbKlM5JCZRNDs2VllGOzZJOzI2TVA6Q1g7KVdJWzE1OUNfRDU6PEZcXworTS4yNE0xJi1VOicoSSUxTTg6VU1aOFRMXzhXNUM6NUhZLUQ1SjpGOUAzNzVVPFVNWkBWLTs4NUFAOjNQSQorTS1FNSQ4RUxeODZRTj8nPFwoIlU6PkdJRjhHPVEzNTFMPlcqIj5WLUY6NVkpNCZOIjhWOFItRTlJOjglUgorTTxGRTk2JFVaPEVJOjgyPTo/OD1aOUYtODIzXDUiMUBfMlM4VzZHSTw4WClbO0AlTyA2ICBVNiE7MjVJQQorTThXJTs4NjlSPEc5VTxHKU85JkU7OkZdLTI0MSU3VklCOCVFPjhGSiI8RjoiPkYtSjhVNTs3RlopOiVBOworTTlCRDsxNilRMjRFKDolMEcuNU1JLyJMSykxVFY7VzVSOFZNUDpGTUMyNilVPzY8IzpIJU4gVyteOlZAXAorTSRFRVs4RUBNKVNFSDgkMFImVEVQOFcpRi9UVVpARk0+MSUyIEJGSUM2NUlJPEY5ODgiVE0xNk1bPEcoXworTSoxQFIyJkFKMzQxQTtXKUpANzxWOCc9UDMlTVI+RzlVOkRRTkJHPUM2VFFIOlU0Wys1QUEzNERCL1ZdUgorTTlHPS8tRE0tOzgtUjlGVVczM0VJPEZNQzlHPU84Ri05NlNFUz1XISsrM0U4SSVNRzxGLS8tQlRHOlcpTAorTT0nISQ6V1YqPlYtOzo2JSkqMEQuKzQ0QCZVOUovVUohPEAlSCA2KCBfREU5MTVJUTxFWUM4JUlLOEUhWgorTT5WSV89VyFMPEZJOS1CVE0vVyE5MzNFQDgkNUs6RlVVPlZdLy1FQUE8JlFSNkNdKTo2RSsvRUlLOCYhOworTTg1ME0rNFU4MlVFMCsyREItVSVCMyUhQzxHKUMzNUlLO0YpOTQ1SUY7RylaPkZAVyU0VVI2RSFDODRVMQorTThGTUkpUl1INlVZUzZUXVJBVyEsOiZJXUJHVUw0L1lHPEcpPjYzRFYxIzhZPCZZSzomRSsrMyFQOlRVJQorTTgnKVIzNUlAL1VJWjYjRTY6R0laOUNYPTZJKiI8JiUpNkYpKy9FRUk2RylSMSI1Qj5XKVIzMzhfKzJdSgorTTxFUUA8RlFAOiVJQzYjRTo6NUBfL0VIRTFYLVI8JExWNichQzg2JSk1MUA4MjYpLDhVUTo8WColPzZNSAorTTpHIUI3QyA4KCJEQCgkRUMrMyIiPVYoITZAJS0gL1kkLyI1K0BXXS8uNFVCOlYgUDpXKUI8R0FSPEhWKgorTTtVOTwyNUlJNjRQTTYmITg2Vi08NCZJRy9CNF4zVlFMOFREVi1EVVY9VFUtOkVJUDgmLUY2I104LjQxQAorTTg1RSkyNVxQMjRQTy42LVI8RilCOiZJOjEjRSU2RylCPEZAXy1GTVo2VUhfOUdRUzhEVTo4RTRWOCRVJQorTTxHKUI5RzYiOFRVLTpYKVw6RideNkZJWjxGQEctRzEkJlM5QzZHLU46I1xFNkcpSjhWIF4vREUtMjM4XgorTTY0KE02JUlLOlQwTSk1OjJCSClINiREXyszOVA8I0VIQkZANS9GSTw7VUBeNTIgQDElQFk2JylaPlcpQgorTTsmKUA3Vi06LUJVKSkzOVM8V01QL1U5Uj8mRS02RzxJI0IoXjUjXEcpVUlaPTc1RjpWTU4+Rk0+LlIgRQorTS8jOTs8M1BFQEVBLSA2QCEyMCNeLlIgNSs2XVs2MiBNOCctSDJWQUs3JjlLOlVSJkNHKSwxNE06PVZFKworTS9UTUM4VkFJNUMxLTIzIFwxJUlTPEYpNjUzWSU6WC1LNUYhJTpWTS84VkU7ODM4Ry9UXS8xVi1SMjM5KQorTSlSVSk2VylSOkZNSjlVQF8uNEVQNldJQzJUMUM7RUE6NlcpVT5HKUAzVUEpKzU5JC42QU46Vk1GPygtOworTS40NUs+RzVLX0VNODkoKU8pMlVROjNMRTI0NUs6Rk1ALEU5TjlGKUoyNEVBNUREXy9DRFYnNEU6NiY4SQorTSglRUo/ODYyPkREVighQEU8Rz04NlhJVyozXUEzJk1NNiYkXC8lQTgtQyE8PkhJWj5HPUs8Rz1POERMXAorTSsyNFc6VyldPEYlQzZWOVs4RU4jODMwQCk1QSkmUUElPVZZSjdEXUg5RzVPOjUwWy1ERF44N0lILlgoVgorTTIwJVcgNiAgTzMoNSYiVUE7U1AuJlNZSzxHPVs8RklCOEVNOzxISVo2I1EpMSZOIjhTOF82Vk1DOlVdJQorTTYzXEcsJEUvOyctQC1URSkyVi4jQEZJQzg2WVs2VSAjOj9ZQTEjPSUvVFFGPzcgWTEjOE0vUl1CPlUhLworTTpGTVE5REUlOyZBSjM0UUA6JkEpMzcqIj83SU04RFU4LjJVNS9ENUA5VUlKOEUhWjojOE02JllaOzZNQgorTTNWVVAvUlVCQCcgXi9ERT82RUU5LURVUztVUUIzJi1UMyQxQjYyVFwrNFVCNUREMiYkVVI5RzYyQkY8SQorTSNAWDU0KClSOEc2IDg2LTsrVF1KOlYvIC41QUw4I1A7LCcuIztHOVo7JylaPkcpSTEyNFY1NVlaQEZNOworTTw1TSQ8SEFaPkcqIDUzKTg5RU0kNjdJUjpFRFY2Jl1EOUZdPjdUTTguNFVZPERERTEgJVsgNkAgX0U0XAorTS0kRU85UkQuJTMpLThHSik8RklCNjVIVjZGWTszVUBFJlNdQTZTKFYxNlVJOUY9KTJVMFYtIzklNiUhKQorTSZSNE0vVFFRQEZVPDsmWV08Rk1COFZRTzw2LUkxJFEtPlgpOjEjOE0vIjRZOVQwUDEmLUs7VFRZOFchSworTTYkUTo4JUBFMTcpQD04KUY0NUE4L0I9JCwjWUA6JDUkNkRFQjhSVDsvVyFOOUpdVT5GKTA4IlQ1LCZKIAorTTdURTQxNDU2L0NZJThHKVI2IyEtPERRODo2PFstQ1lCO1U4SSUyISQ8RUU6PkdVVy0gLC5OMzlSPDcpWgorTTpWKVM4U1hZNkghSCs0UVc4RDA4JTQ1UzxFRS82VylVPTgpWDUiNUE8M108PkghMTxGWF8yJ0okOFY6JgorTTxETS86VyFKOEAtUkRGJFYsJklIM1ZNUzpWJTgtRDFLOjQ0OyswJUEgNUAgX0VBSTI2LVo6MiApI0IgXworTS42KV0+RU0tMzYhJDg2TSUzVkUkL1YpUjxDXFIrNUVLOyYpNjY0RF83REU4OCVdJCszKEktQzkkO0ZJOgorTTxXKUY9N1VAMSYtTzlGWVc2I1xQOlgpWjojXE01NVkkNlU0Vi1EVTs6RDBWNkdJXT02SSkpMiBFNTYoTworTTY3SUI1RUE8NUJUVi1ENTo8JUUpNiVNSzNTOEAsJVlIMz9ZTkBGSUI2IiAuKjRFTjkkVUgxMzheKVRFOAorTTElUVI4QzkpOEVJSDpWOUEyM0VCPEYsUigjRS0+RjlBOjZZUzlDIC4jQlVLOzc2IjxFRUo6RUBWODdVSworTTEkMiA7VEQ9JTI1LD5GUTk2NU1LOUc5VzIxTS08RUBZNyghVzxHPSkpNSFcL0RSI0BWRSU6V0lSOlZNRgorTT1WRTUtRi1DMlYtWz5HKUw4JUFLPCY6Ii0iRCEpMCRHIC9YTTNWJVA/RyBSJTBYRTY2IUA0Jl1LNiQ1OgorTTsmTUg2JUVQODRdQj5HNUg2NEUkN1VNKTM1SFYrNUlLPCYpQjYjISQ2JVk1NiYpOTgoIiA2VkldOkNZLAorTTZFWUs7JiU6MTRVUj5HIUExNilPNkRVQzYzXS04Rk0lLUQ1Oj5HVUsxIiA4KCVBOjJXIVIxVEU4MTYgTQorTSpSVFYzJU1CMlNZLEAlTFYvVE1AO0VPXjNXVVI0NiBcJTJVNjlGSTs7RiBbKCE0VzdTXSk7JyBfMSQ1QworTTtWSTA4ViE4NkZJTDNTOSQyNy1TOEVJTD5GSUYqUShNOEdJTT43SUs6RlxfKEYhWjclWFA8Rkk2LEQkXAorTSlWSVI7VkE6NlUlRzhCVEAsJik7L1NFQj1VRUk1IiEkPEI0RTxILVIuNFVaPTcpSjs4KVA3QyE4NiRNSworTTxGVV1CNyk5OEdNW0BGOTggQUAgWiMoTTJXIiI+RERSKCM5ST5XPFAzJ0lKMzYlUjxFSSkzNylMNlYtUgorTThXSVM+RyFANiNZLTlDODgtRk1aPEYtPy9DRUA+JyFUOCM4TT04KVM6VklCNkVFOjhWTTo2RyEpL1YtRgorTThGLUM8R01ALUYtSjZGRVY+RkRfLjNFLTxGRFYmIiBSL1MhKEAnLTggVEdeODM4Qi1CPSkzNiU4KjMhUgorTThTXFkuNUVOPlZJWjxGKUM2QzhXL0Q1Uj83OUs2IkxNNiYpNjI2SVAyMzxWL0VBRzE1QUI8Jl06MzRVOgorTTpFSUo6RDRWM1dJWjpFNEUsQ0VKP1YpQj5GOU8xIkRfOkYpNi9WTVo4MlUkNUM5QDxXSU04RFVIPEVASQorTStVNVEzUzxJLjZdSDg0RDsrNixJI0RRVTpURS0+R0lSRTY5TUBHLUsvUjRNOCctSzZXSjI9VF1DPkgpVQorTTtAJSEgMUAgX0VdPjI0JTxAI0RWLENZUkBXKTk2RylVOlZJTzpWJSUvRkVDNiYtUzpWTU4/OClXOjNcXworTThFWDspNkVLPTc9TDgzXS86RFUlKTMoSTM3NVs7VFUlNkYtOzonSUI2RllDNTRFJThWOTo6RylCL1RVSQorTThXKipBSClLOjREXzZWIF8sRDE+OCNYTThYJVI6NUktOCZFPDgkMSU2JUk4L1NdSzpVOEkmU1lPPy9aIgorTUBHSUY6VU1BNjRFJThHNiY9NFxHL0ZNUzpXIVI8Ri0rL1M4XzIzXSs8Jk1OPFRERzVHSUo1RU0kKTM5UgorTT81STQrMzk4OkghQjZWWS82Vik+MjZNUjY0XVI+Rk0+KVMgVjNXSiI7RiElOkdJSCoyNUM+RF0kL1RFQworTT1XITUvU0UvKjFAVjwkUFk2R0lbPEYtPDtGUVI4MiA1LjYtSzNWSipARUE2OkguIkBXNCE8ICUrIC9ZLAorTThHKE0tVyBHMyZZUj5HKT46VylTPlZZQzhFSUEzNF0vMTQ1OjwmUTs6V04jPzchODYmSUYoIU1JLjVJWAorTTo2KS02Rk1AKTFMVjYlSTw6RkEpKzNZQDZWTVo8RklSPEYtKTE3JVMxVFVCOFVFLTNVOTs/N1FVPUgpTworTTVENTg5RDU7OlZJQC9TRVA7NylCNUNdUDpHSUs1RiFMODVFQTxGSSQpMk05OldXXj5XVU06JiEkNkVBQworTThGRVJBR1UtKCJVOz02WVpASClTOkVAWy9VNE0rNiUtNCgpRyk1NVc8JDU5NiNRKTwnTU83QyhFLjYqIgorTTwmSUY4RSE+OlRFOj02LUI+RllDPVM4XCxDRiA+RixWLUVJRj1VNEUvWClOKCFNKUBHITgyNUlSPCVAQAorTSZTXEUnNiFaPVcpSztXNVY9NjhUKlJVLzo0NSQ+SElJLCQ1XEBHTVYgNyghOjAjXilUNVA1Iz1LL1RdPAorTTxISVs4RklaQFgtWjpWQTk2ViU5MlQwWy9GKUEzVi1SPkdNVzpGSVc3QyhLNjI1JTwmTTs4JkVSPCVEXworTTNXQVM9VklINTM4TTEmRUw7RklCOkcpQi4zWUw+RDBHL1YtLTYmJUA2NjlSPSZZWjlFQF4tRDVBNkY5TgorTTlURF43VUVLO1VNJTglIVU6RFElOUY5SzwnSVIyMiBfOiVOIlonNV05RVE7MyNYVjNWRTk5R1VaNkIoNQorTS42KT87SC4mQEZNLS9TUTgmUlReMTVFWj1TOEc4JixQMlVdOTZHLVU6RUklKzI0TzlHVVI7Nk0vOEYpQAorTTZGTVA9Vy08Olc1JDdEMFI8SClIKTFMTSxGSUk2NEVMPFY4RSo2TU0yMiEkPTgtWjdCRDslMTRWIFVKNQorTThGTVo9N0lSMlQxKTJWJTk2JyYiPCM4XjhWOVUgNighOCAjXi1FRUkyMlVKOEYhOT04NiI4RSFGPUdVXAorTUBYIFYmUUBALlYtTDVENSQ2Rk1POERVSj1XKVAxI10/OjM4VjcmSUI6Jk1COlc9SDQ2LVVBJ0lLNlVAVAorTSs2KVo+Rl0lNkY5MC42JVM8VEQ7KzQwUDM2TVI6RSVCOzc1VTdGITguU11ANkRVQjhEMS06Nk1GOEVJQAorTThUXUs3RUE6OEYtUD1XMVI4IkRfOlRdTkdHSiI8Ri0pL1RQXiwmLUI6RllOM1UgQC5TWFYzV0oiQUZNJQorTSwjXVovUCxWUzM9Sj5HKSQyM0RWNiZBOjhXKVI9Vlk5L1JUTThWWU44Ri07OiVJQzwmSUo9Nk0vNkZAXgorTTo3QTo7V0k2JiBYOC8mLUs7JiE7Okc9OC1GIUotQShHOEg6LUBDUEAnMkRSL0QwXy9TMUsgV0ovNiMhQQorTTY0RSk6NylNPkYtSTo0QUYgNywhNjAjXjhGTVcvQiFQNjRUWTpXVVo8RiBeOFZNOzo4ITsqMUBAMjZNWgorTTpVRF8xNk4hNjJEWTcnKUgvU105PVVEVi1FWSUzNERNMSZRUjgyTTpBKClOOEVIXylUQVU/Nz05PEVEXgorTSpWUiM/NkBeNTUwRTMnKVs9RiE7NlZJVThFIUk2JUVCOERdLDM0RTg6VylGOlRVNjhFSUw4JUE6MyYtOworTTE0PVI4QlRHOEYtOl9GTVU/KC1LL0VBNiczRSw8WClONlYlKTVEREktRj1VQkcpKSxDOVU7VERNJlEoXgorTTtIKV81IVRcMzYpPjxGTUY+R0lSOyRMVjhGWVIzJDBWOjYhJDomWiI+RSE5MjJURzo4QU49OClJLSFAOworTTJWTU48RFUlMycpSDVGXVc7QzA7KVY6JUE2RTU3VVklM1VZJTEkMTs7R0ogOEI1LDZENSk8JykxOkYpSgorTT4oKSUxMCVSIDZMIF9HSVI/VEQyMTchKSs0UVI+RyVQLUZFTy9DITg8JixAKTZBWj82TF8tQyk6QEZdJAorTS1EXU84JEUpKVVdTC8iVFsyNTRNJiFUWTpXIEUrNkoiPUZNQzgjOSU8SCldOkhJQysyVUA+SClPMyYlKQorTSZXIVpAWC1SOlYhOThGQSg2Vi1LPFYpKTYkRSk2RlVaPEcpOjo1SSwzJFVGM1Q1OjdTWEczJDBNMSZdUgorTTY/WSw2VlYqPEQ1KTgjOFYuNkYiPkc9UzwmSUA2JTU7OUdVWzgzWF40J1FQNSJEOCk2KiU/NkBNLURROQorTThWUVc7Jl1RPTdJQjYmQUY4ViBfKCQ1SC40NTpASCkkL0NQOCI0MVo+R1YjPkYkRSYjWUM8RyBeLCQxUgorTT1VSS84R1YgN0M5JT1XNUw6WCFCNjVZPi5URUg7VjlLPkcpKzgkNE0vRz4hO0YpMTZHPiI4VUAhNkAlWgorTSAvWiM+SDlQLCNFTzojXSU4V0lGOENdSD1WJFwtRUlDLjJVQkBHVUssQUxFNigpWjolQTs9Vy1CNTIgVgorTTgkRFIrNiVVNTNQTS1VTVE3Qzk4OlZNRjhXIUk4RlVcQFctUjgiREAvVylaOkM4ViswWTo8RkVVPkcpSgorTTY2KVI2VFU7OUc1Ri4zOFYsJTlSPTdRUjQ3IUIyM1hJNiVBJDhVSTo4JkU+KjNZOTpWX144RylSPkcpSAorTTVEVT43IyEkQDdVTjxHNVIzNU1XPCYpUj02SToxI11EOSdBQSxCNS07NS1HOjRFQDcmTTw6Vy1SPEZZTgorTTZFIUo2REVBN0I0VjomISU2J04iOiM4OygiTFA4Rk1aQEdJQyxCIEUsJiFLOUM4VjonKUYuNDFaPzghSQorTTNVSUI8R0oiMzNFQDIyNDsxNylSOUZZRjpXISUmUjUkPlg5VzglSUtARkEpIDQwIUAgI14/Vk1OQFYhOworTTxGSS02JklaOERRODpXPUM6NkVQNjFUOzI3KVY6M1A1JTNdVz5GSTgxNilQNkZFRi1FTTYvIiBZO1VNJQorTTI1QUE8NkBeLUMhOjolRS87Vz1GPkdJUjZDXDgjQkU6OkZJNSZRNDUyNikvOEZJTTs0PSw8R0kwODcpUAorTTtDRE0qMUxZPEcpWjpUPUI4VilANiRdQzZGLUo3Vk1YQCVQXy1DIFlfQ11SQEcpSzZURFk4Vl0pKzVFWgorTTlFWUY6IzhZPTgpQzM2XUg2VkVBMTNeIDxDOFY8JixHMiZdKTpXKUM3Ji0+O0cpSzZERTk4VkUrOEZdIgorTSozWTYtRDFaQScpJCZVQTkpU0UtOUgpXTxGLT4wMiBeNlYgTShEMSkvUjRWOlZZUjpTUDspVjojQFRERworTTY0REkjQjVHPEcpUDgmTVg5Q0xbNjY+Ij83LUM2SClAKTAkOyA2ICBbNilJN0dJSThIKVI1RklaPkZNJAorTThXLUszJi1XOlYkSSglQVI8Rk05LEFMVjpHSU04NUFBNlQ1OTxVRTs6JTRbLyRVJCwiVF44VyFLN1NcVgorTTdGQT4tRD1LNydJXDxGLFsjQFg7NiZJSjszUEAwNi1JMyYpQjxHPTgxJik6MSVOID03KTgtQ1BNL1ctXQorTT5HKUM2RUQjOE9ZSDlFUS86Nk1COUc1VzZURFIkQU1APkZRQzgjOEU2VylQMjQ2IDokVTA4IiA7NkgpSworTTNVOSwzNyFXNiVJSz1TWFY6JikpNiYhJThWTUI2RU07O0dJUjpERF4zJkVAOjdNSC5SPF4rMlVQQkgpKQorTShEVTkpMlUpODcpVTxXKUs4M10pODY4ViszXF8qMTRNOEdJWztSVC4jQyFCPlRERTI1UFIlMiE4OjcqMAorTT1WLUM6VkUpM1ZFSz03OVw8JV01KCAkLiAyVCBfRUVPN0cpQjhXVVMzNVFSPFcpKTZHKT8pVDFDNDYhJAorTTI2TU46VyUvMSJEVjpXSVE4Ri1OODNdODlGRT46VUkrNiYhKS1CIEAvVTlDPEVNQDpGKSUrNEVJOEcpVgorTT1XPUkuUkRWOCYtOjpURFYyN01SMzRVOT5XNTw6NixWK1YtVkBHNUMvVTUpNkc1XDlGTUozNU1DMjRRXworTT1WQSU2Ji1KOEY5WzxGRSQiP1g1LUVJQjclSFwrNEVLPEcpQkBHISw2RiBLJEJVQz1WQUAtQ1k7OCVBLQorTThGXUszNiEoOCYxLDgnKTw6Rk1DN0Y5WjxWSSQoI0VBLjYpWjxGLSktQiA4MyheKjwlRSs4NERfMzYtSAorTTcnKVo8Rj07NjYpSzYkTTk2IzhJKjQ1Uj83PF8oIiBNMSZNPiszIT4xIkRPMTVNOz5HKUM4REUlNkZNQgorTThGOVs+Jk4iN0IgISUwJEAgKy05PEZNUzslTUg9ViBWKjQ1SzokUUM3UUw7LEJUVixFOiA4RVlXMSJUQAorTSk2IVI7RkU6ODYlODZWLUM8R0lALUNFSTgzXCMoL1hQNkYgXztXSUsxIzEpOjZJUj03KVJAJyk5OCc9RgorTTElQSkvVEVPPkREXjM3KUo2Rk1KMSNMWThILU04RF0pMzZJTD01UT8xJDFAMyM4RzZFWVA6NTkwOzcpQgorTTxHKUs3QiA4LENZJTZFSF4rNUFDOEZNUkBXSUE2RkE5KjFAWTtVUTgvU104NkREXjE2KVI6RiBeNUYgWQorTTZIKUo8VlFGOlQxQzsmJF4mU18qNiI1LDkmVVI6NERAI0JVWT03OVEuNDVTPCYpQjlUVUI7RylOPCZRQworTThVSUE2VkFQN0MgVjhGWVI6JE04NjZBTDokRE0sQ0xcMjVNOzMmOVU7VUElL0VBUDdUNUBAKClWOVVAIQorTS0gJFIgL1krMjQxSjwlSTk8RyBJJiI1LTxFTUw8JERJKTJENSgkNVo6RkogOCJMOCglSVo+VyE7MTRFJQorTTZHJSg6R0lPKzFMXjYkTE0qMkxHNjQwQjhISVI2JDE4OCVFSjpWTUJAV1VDPEgtUjIkRSUvVDVaPlRFJAorTTomOUM6RVFDMTREQjYnSUY2NUUlMyZJRjpWTTgrM0VCMjQwVisxVS0/ViktOUgpRjw2KTo4Q05JJiNNOAorTSwkMSkrMjU+OjRdLD5YKVo6RUlLPEREQCs2XTotQ1k4OCVAXy1CNE8zNUktODYtSTZEUCQ8TS08OlRVQworTTpWITUsQzk+KzYhOzhGSUwyMUAuKEVJLTZVND0vV0lcOUVJTTgmITw4RyFYPlYtPzI2JUE4R01SNyNdKQorTTM2LUc6JylDPEcpSjhFNEAlMlVIOjZBOC9XKUoyVURfLCZdSC9UVVs/N1VaPEAlPiA0NCBfRiRfJlM5OAorTThFQTk9U0wuI0IpQjhHPiA6NVk1KjBYQDI2RUM6RzlJLUIgVjo3TiI+RkE6MjNcWTZWLUE9Vy01LSNFOAorTTYzOFY1MzkrLEEpJD9XKTs6Jy1LNkVJOzhTWVM+Ri1GPkc1QzZFOSkrN0YqOlVJQjcmTUs2RU0pLlFNOAorTT03KS0xM104O0ZFRjxWIF4vRiEtODchKygiNUI6IzhZPlc6ITolIUExKiBWMjVAWS5TKDgoJEU6LjI9UAorTUJHUUI2JylaOjM4WTolSE0tRi1QODNZKS5QLEVVIlVBOkchWzo0VUI7R01SOyVJSj5GTUAvU105MjYhQworTTpWTUoyMUApLEVYTSsyICkvVylNNUNFQjhWKTwuNkVXPkZNOTU2RVA8Jkk8PkZBJC5UTTo4V0lGN0dJSgorTTtHIFkjQjVCO1ZBOS9WTUAsJERNJEAtKUFFRUk6VzlSPlAlVyA2KCBfRUUkKCE0TTtGRTs4RVBHI0BZNgorTTM2PUo0Jk1XNTFAQDYmITo2RylDKzI1NTxHKVU+R01QODYlKTE2SVA+WEFPOCVBQDdTOE03JUk4JiBYRQorTTgkRTg6V0lbOlVJODYkRUM5Vk1OOURdRzZGLSklNUVcQEcpPDhWKUo4RiEpL0MxKTtHOS0pVEVCOlY9RgorTT5GSUI2RDUkMzghSzUjKSQ3UihNOEZWIjxGKF82LC07OiZNSTYyVDgtI0U7NUIpQEI4SU82RyooPUYhOgorTTZVRFIrNiVaPEREXjIzMD0jQU0pMyVJWkE1SF83SC1aPEYpSz5HNUszJDU1MSVBLTgnKVo6JVhSL1ZARQorTSBQRlooRilfOCNFPzhGQUgyNUFGPEVcUDI2RUA4Vl0wO1ZcXy0kTTo7WC1INlcpSzxGTFsmIiEkOFZFLworTTdGLTgsIzhAJiI0OyhDWUM7JkEvPTAmKSA3TCBfRkU1KCBYRTwoNVA2ViE+LlFATTY2LS0sJUFQN0FMOAorTS8lRUI4Jz0rKTIgWzhWLUI8R01LN0cpSSwmKUI8SClaPEY5OjszKFY5RiU5MSQwXDEhTFA4RlogPEVJNgorTTI0VTs2RilVOkZNJDEmKFAiMyksOSclPDhFUVI8Rk04KVM5QzpWWTYpMzkkOCUhOUAmWV88RDE0LlZNVworTTZWJVI6VDBWMjVNSzhXKT8vXC0tPkdRUzhFQSQ2IyEkOyIoUDs4KVo4Ji1dOUQ1Sz5FQE0oJEVaPEZNOQorTS9DKC4iMiEiKVRFTkE4SUs8R1VaOUYpTD5GOVo+RiBQKVVNMyc0VVo4JylOQCZAQCBRNlooIzlLQCYtQAorTTE0NU48JDVAPDVAUjI2LTgzJz4oPkZNJCgiVF84V01ALjVJSz5GXFwqM1k4MTVBRDhXITo4JUE0LEMwSQorTSoxKFA4VFBeMzAmIiA3XCBfRyE5KVFATTlILVc2RU04OCQkNS9FRSk2NiVBOiU0XDEkVUo4RiBZNiNQVAorTS40NTo8Ry1CMzdKIDYkXTo2RVE7O1VcXzYiVEc2Rk1IOCVBPjdDUF84VylaPEVBODNUXTg2VkE5MVc9SgorTTZGJTUtJE1LPEZZQi40NVJCR1U5KzIpQjpGTU83REUpNiRRQjxGVV08RFFDNiRVSjZFUVo9RkUlLCVNLQorTS9EPUMvT1hZPEcpQzwmKUA6JFU1OiNdJDZWKTo2V04iOFNFQD5FSFYtREVSO0ZJSTUiTCklMjxNJTRFOworTTlIIVVBN1VROUY5WzxFRUlARzxeKCU5KCk0RUoyJi07PkcgUiwjUFsqUjUtPlYpOS9TWUY7U1k4PCZBJAorTTY2IUM6JjojQEVIXi4yNFs2Jik4LUJVJTxHLTUoI0VPMTNdSjtHSS04VyEvL0NcXy5STE0yM04iLENQIQorTTtAJU0gL1lIOCQxJC9GSiNARlFCOEcpTC8kTTgxJFU7ODVJTzpGRTo6JkBWJlRFPisyIFY2JylQNlNFRgorTUBWTUA3JkElL1VBSDY1QSIsQ11DPVRAWTNXIT4xNi1LO0chKTYlQSk2JUFAMzMhPjxGUVI8JDE7PFgqIworTTohVDs2SFYqOkM4OClUVSg6Nik7NjQxLTtWOVs/NihbNjQ0WzZVTUM5RzVVPFYhOTdCVDs2JiteNlchLQorTSwmIUo4RUksOycpLTMnSS0pUzlLPTYtJDonKUI2JUU8PEdJQjZGOFwmIjxQKCBYSS1DWS02WEFaOEVRSworTTxHKU87RylLOCVBLzZWQUI6RilQOkZJPDszXF82IyhAMzghSjM1SS06VkRbL1YhVTYjOFAzNyEoPEdMVgorTShDOEUrNEU6MjM4TTU2UiE7VDEpPEVETTI2UioxNDVNNkM5JTM0UT4xI10pQEQwWSA2XCEyICNeMyNZJAorTTolQS07R0lXOlZJUz1WQS02VEU1OCRVJThXSVo5RjlJLUJFKTYkMFIuVUFXOFYlSDxHTU48RklKNiRVOgorTThGUUM4I1hfNjZJOCszIVA4M107PEZNSzNVSTgzVUEtNiYgXjIlSSg8R0k2NiY5XUElXDIjQzldREhJOQorTSkyRF8xNFUkNjVIUC9UNFc6WC1HMTZEXy9WKUs5RVk8NDcpUjM1QFskRDFaX0Y5Qi9DXSQ4JiEsMTYtUgorTTMiRVo4MyhXMjYtLzJXIUs4RklLOkZdWjpEXUgyMUA4KCFANSgjOSQmUlVbPkVFOjwkXUY/JzU5L1YpWworTTYkVVM2RUlKPEgxWjZGSTUvRUhcJlMhUjpGSUczJUlDL0I0WT1XIF4rNDFDOFgiIzUyRE0sQihZNiNcRQorTSZTRUtAJilCPidJRysyNSlBNVxZOERESTI1TSc4Rjk1NjgpOTNQJVAgNUAgX0YhKS42LVcyMyhfOlcpRgorTTdGWVcyJFU5L0YlKTI2JU5ARyE6NjNdQT80RSs3Q11IPVYpQDlHKiM+RzogPFYhQDdUUUY8RyE/NjYlSgorTTlEMF84ViElODdBUTpWRTs4NEU5NUVFQzo1RF8pVUFCNUNFO0BIKVgwMUBSOlg6Kj1VQF82NilAKzNdQQorTTIzTEIoRTlVOVNdQi4zRTY9VklMOjQ1OjpFTF8mUFhNPE9ZUjZEMUA2NjlAMlM5JDxGXSk+RkklMjRFOQorTS1DITw6Ri1SOlVJSj5GTUM7NURcLEQxJC0jMSk3IShAOkc9KDhHVTo4R0lSOiNZITlDWSQ/VkBfMzVFTQorTUBIKU83JEU4MTIgSTglSUY7ViFJOiUwUCxFSUI1NUFBOCVaIkI3KF4pM1BJLUVBJCUwWDUyNFRNMSdJWgorTTlSVDUpVklLNkZdQSkzOUA4JUU6MzRGIjM0TCE6QCVXIC9ZUjYjXTo+RlxJJTJVOTYjRF89RTheNiJUVgorTS1EXUw6R0laOzNcSThHXS0vVkReMScpQjM1TU5AVylDPkghRzM0MEkzJy1aOlYhQTZWRUM6Ji0+L1VBTworTTpGLUM2NUBeMjQ1ODM3IVA2VUVINjVARS42VV1BJyBWMlYtTkBHSVIzVFFCNiI9ODxIIU8yM11GOkZJQworTTlDWD0pNk1LPFc9LTMmTUs2IkQ4KTYrXjcmKS02Ni1ROychLS1FSiJAV1VLMjNcVjIzREkuNilDPFctSworTTpHSUY4RyFDNjYhSjtWRT86RTguKTVdUjJUPVI4Vi1KOzctVzZVQDsrNz1aOEVJPzhGUiw+RUk4N0RFNQorTTI2LVA7Vk1CPCchQDU1RUYxJiFKPEVNLD5JKio7U1BfMSNdKS5RQC4jQTQ1I0M5Wj5GKSQtJDFINjVBQworTTw0RF4zVkU2NkZdOEBENSkgNDwhO0AjXjpWRUg6RlVaNSI8QCs1STMvRiktMTU0TSUxKE0zJUlSPFZcVgorTSo2KUkrMyFRNiJVKS9DMT85Ryk7MjUlTT1WLF8pM0VMPkdJSzgmIT87VyE/ODQ1OjtGSUA2JERfMzVEXworTTIkRUA+Vj1QO1Y5RzEzRUg7N0lSMTQ1LThHKVU+Ryk6OyVASTE2WipARzVLOkc1RkBHNTwrMUxQNDdJUworTTMzRUs8Rik+LEMpOEhTPTkxM0U4NlYhUjxTXEc4SEldO0VNLzEjXSQuUz1BO0ZRUjs2WVI4RFU4MjQ1UgorTSBYKzo6VylNJlNdLDhGRFk2I0UvOCYpVUBXLT4iMUElO0c9QzhWQS8+Ry0lMyVBKTVGITk8Ryk/NjcpUgorTThFTUk6Izk/PkgpSTM3SjJER0k7MTVBODgjXFQuMiAuIjBYVkBIKUoyNE1RQFVFODhWSU87VEFBLjNFWAorTTwkNSUgNkAhNjAjXS42PilCR1VbPCY4Vi1FTUsxNkFCNkYgVipSTFQrM1k2OEYgXDI2IUApMjVCOUJURworTTEkXUY+SCFSOCRVQjxHITkvJE1COzdNUjpFTUE4RilJNjRVOjpXPUw4JVkpOFZFQS9DOSU2JUlKOERROAorTTo0VUk4RUVCOUYhKTYkVTs+WCk6OkZBKTVHKik+JzVOPEdJRDxGOUk4NTBWN1ZdOjI1QUM9RzVSOiQwIworTTZPWTUxNDA7KzVJUjgyKFk+R1FOPVchQzUyVEUoI1lPNkYhRjpXKUgyMlQ1KCVGIj5HVVI5JyhFKzNdOAorTThERFspMjRbMSVOIjtFXFkqMlUkNUYhQjpWKVc8RDEpL1RNQzolTUA8RUU6PEVJKS9GJTksRFVVQTcpPgorTTtISiY9NiE7NiVBUDZFSVg1MiA1I0JFUD5GLSUyNyomOiMgUjgmOVo6VjxJKTRRPylSICE9UCUkIC9YOworTS43SiU/J1VaPVVBQTsmSF84Rl0wOFQ1KTYlTFYyNERXL1M4VjNWRTUtRUEtKzI1KTo2WVZCOClQMyRVQworTTokRF4zNkVKPVcpQzNXPUsxNi1ALjMhOj5HIVM8NiVJPEcpOy9VQSwuNFUlLUM5QDgmSUsyM0U8OCVFQAorTS9DRVM8U11COEMgWTxINVw8RilMQEc1VTxWXUIyNEVKPCREXjM1UVI+R01XOiY6TDpFRUE2IlQyKCM5KQorTThUMFA4RlVSPkZZUDgjMDUsREU4MzRFOTtHKTo2ITQpIjI9OjY2OTovVV1GL0M4IzZNJFk2RylKNiI9OQorTTg2QUs4Vk0tMjQxSzhFSSk4I1xfLURFSzojWF88JklCO1ZBPi1DOFwqMzk7PTZZQzknViI8Rk1LOjQ1SworTTs3KVI8NUUhLCJVQDlFTSk2Vz1dPVREVjZWKVU6VlE4NURVOCsyICE3ICRWIC9YOyk1SVU9JllGPkZRSworTTxGSSQtVz1SOFYtSztVQTg4JUBWKzM4TSs0VUk2NiRWKzU1QTpGKTA+SDVbNUNZOTYkRTU4Nik5OkddQworTTM4JVczNiVDLUFARzVEVVI8RSVXPzc5OzY2TVAzM0UpMjNEUDElSUs2Q0VCOiVJQzdTXUA2QzlQNiI0RQorTTM3NVU7NkFHPTZVTT83STksRkVaOkM4VjdWKUc2Nz1KOUdLXjpFTUg4IlRAKjIgVjgjWEUvRFFTPzZZUgorTTgjKDUvRiBeMjVBKTpWSSU1ITQuJTIgXjY2PUI1RDVVPFRFODomKS0zNzVTNlMgWTM2Sig+Ryk6OFctSQorTTg0RFY9VU04LUNFSzdRVEU4RllKOUZNVzdDOSQvIjUsOkQ9OjpGVUI3RylSOiRVSz03PUM8JyE4N0VdQAorTTM1TF4zV0ldPEchODZWUVo8RjlSPEZFOkBFNFIgRTQgX0NMVjI2QUo6Vi1TOlYxVTtTWD03VylDOkctWworTTZFSVI6VERFKjMoOy1FQF8zUyhWNlglXzpVSUZAWCEtLURFOC9UVUA4MzhSOkVMUkA3SSw3Vl01KjFMTQorTS41UUIzNyolPTVJOzpWWUgrNEVIOjNcXys0NTkxNilSOlYtSjglXF4nNkFALUM4XjY2KSc4Vz1GOlZZVQorTTxFIEs4V0VHKzI9OTpFXSU6Vik6PE9ZSzpWQUI2I1kpLURFQzZERF4rNi1bOzchLSoyISk5I1hfN0VJQworTTclOUAvUykwN0YhQzhGSVczNk1aOEVFSzpGLUM7RzVSOCU5LDhGSU49M0UsQEYlOC41QVI8RyE5KzYpQAorTSozOUo6RiVJOEcpOCwlTUgtRDE6MSQxOTZTWFQ6VklAOFdNUThFSUw8JFE6OFYhQDZTTTg9N01APEYtJQorTTZIJVI0NFFNPlZOIjYhTCEtQCU1IC9ZJTIzOFk2VUVDPVYpQjxGSUAtQzkkMyVJQjxGLUs9NylPNTMoSQorTSgjUUYxMzhFLUNdSEAoKUI2R0oiNUFUUDcmISkuNUU1L1VBNSs3SVoxJFVXPCVYQCs2MUI1REVGQEc1OgorTTZHLVI2QlRfOlcpVTlCNFI2JV1KO0cpSzlHKUgvQU1DOFQ1LTM0MFkpMyE4LVYpTjpGWUg2RilEODM4TQorTTM1SSQzNi1MNlVPXjhGSUo4Vk1AMjRFODpGTUo1QjRZOlYtSzZUMFY1Rl08MjYlQzpGKTo6VyEsMjZdPAorTThVSUE8REU7PVZdOjhGTUI2Rk1LOkZVUjhGKS03JylOOCc1JS1ENTs4SCFOPFVBODIzUSk2RFRQNiU5QworTTYiVSk6RyFDOiZBQDY1QF4sJU1DM1YtXTgkNS04Rk1CMjREXzZGSSw2RlVZOFYpQC41RVs6U0RJMTcpXworTUBGOFIgMzghL0AjXjo3KUYxIzhFKTRVTDhURSk8JjxeL1YlODEkVS86Vy1CO0c9LDg2TFAuNiU4L1QkQAorTSkzWUA7VkUtNjRESSgmIUo6VklCNDdJVDhWQVI6M10pPkghOS1EMSkvUjRNOEdWJTpTRSw6Mzg7N0dJUgorTTpUVE0xI1k6OEVJUUBIKVI0I1hNPEgqKj5GOUk3UzBALEMpKTZEXS05SCoiPVZAVic1OUAsQlU6PEcoUAorTV9ENTo4VUlCOEYgXi1ENVpCRyk5LjUhQjY1TS0yU10kOEchPDhVTTw4RF1OPEREXy9DXTk8Rl07NiVNQgorTTpGISkrMkU4NiQxJD84KUMxNDVAPUdNQikyVUg2NUlCMTY5WjtWISszNiE5LUVNQzZGIUA2JkooPFRRQgorTUBIKVo6M0xQNiY9Uj02RSktQyFAOiZBNSsyXUA2VDU7OlZFQjZWLVI+RylALyNRLzlYKVI6QCVOIDZEIAorTV9GOVc9Vk0kKCFASTNVXSQ2J11QNTNZODIzISkyU0VCPEcpQyozXU8yMj0tNiNdNSxDMSQvRUlQOEZBNgorTSxCITg5R0lNOlYtUj1WKVA4RVxWKzZKIjpERSk2MlQuJEU5Tj83SSwvU1xFJlVCIj00VSkpMzhNMjRUXgorTTY2WiI+VEQ7JlVJTUJHVVI8Rz1JL1JUTTE1IT8uNioiQTdVUi9SRF84ViU7OlZJTjgpNSs2JklDO1ZJQgorTS9TKEU2NzVaPEVBNjhGKTsxNFQjOCslQjhGTS82JylCOkZZLTVEREUsJkFaO1cpSzY2SUozMiBANyYlLQorTTZXNiU4IzhHNkc1UjYxTEk1REVJOCRFQjtGTUggVi5UOlRFLThFXS8yNFVSQicgUC43LVpASC1JLUNFRgorTUBHNVcyMlRSNiRVLTglQF4uNFUlOkZJNjElSUo/VlVVOkYlLTYlSTs4QCVQIDYsIF9GSVI+Rz07MSIgPQorTSs1OTo6V11WOjVNQTEzKSU3QyhWPVddOSoyNTg5REU4NlQ1RjEkRUgzNSFMO1ZZQDEiVTgzNkksNjdNVworTT5FIVc7RkkkLUYuIDlGQTg2M1BQKTYtXUE4RUoyUzhAKCM5UjpDIS01M0xbOCVNOTJUNTE+RUA1JTNFSworTT5GOTozJilbOlNYXC9TRE0sJioiQTclUjhVNF8vRj4iPzZJOTouVUAzNklGPTdJSzgkRTU4JUU5PkZJSAorTThXIUAtQlVCPEc1RjhHKUgyNllSOlZJQjgzODUlNDFSO0c1WjZGKVdAIjRAOFZRRjY3Nio2NiBWMyZZSworTTozXT46JFVQPTchWzZWKUgxJilKOlZFQjomITgvU0U8PkcpQDJWIUI+SC1LL1I0Xz03KVk6I1hNNiNcTQorTS9VTSkgUlYwOEggTSlVXUAzNF4gPEVNLTpXPUEuMCVIIDZcIF9GKVU+R0lKODMwOCgjOS06WCFSOjYtTAorTTIyNE0vUyhQOkhJTy5SIFA2RkVdOjNFSjtWRVA2JF06NkgpSzIzUTYxNUBWL0ZZUjpVSUs+R0lJOFcpWworTTomIF4uNkFNMlgiKkEnUVI4VTk0NTRNSjhTXF42RF0kOCYpUjpVRE82NThSLCI9Sj01USQrMyFQOENZQAorTT0zOCklM0VbQTZZQjM0RFsnM11VQEc9OjhfWTYtVilVO0ZZRjtVXS04VlEvNTZJTzZGLUItQU0kOkZVSworTTY2OVE1RyFLOiRdSjwjTC4jQjUpMTY9VzMkRUZBQlRcOFZNTzEmSiY7NklIOFYpKDtUNTg9JiFSQDZdVQorTTolSUcrM0U6OlchJDM0VSk4JiEsOlVFUj8mPS06Vk1EOjVIXzMmOVU9Nkk4NlVBKzY2QUExIjQyLjZIXworTSgjRSQmUj1PPENEUDdYLiI8I1whL1AlOyAvWTo8R0laPEcpNSgiIDsrNTlLNUNdKzhVSSkvQyE7PEZJUAorTTM1SFQpMlUpO0cgVjEmVU84I0UpNUQxUjpVRFQzNFU4L0NdSDhFSFk3Vk1VPzdJXD1WQUAvUzk6OlYlRgorTT82WUY6RUlLOkcpWj82XSw3RTlAMjRRLz84LVc3RTk4LVVBKThHSVc2Q101OFMgOy42STwoIUxfPEgtVQorTTlTOEUuVTEpOkc1UjhWIiYxNEU6PTc1WiBXK1cxJUFQOjIoWThURTk6VUhbNiVFSj9WKUo8RTk7OkchJQorTTE2TUcqMVRbLlI0XzdSPFY6R0hWNSZNQzYzPSw2VU1SPUgxSi9WKF8rNFFSPTgpTzpWSUs8RTBNL0ZBWAorTTIzRE0pNEVINkchQjs4QVo4Vk06L1cpWjozOF8zNyojO1YlQDZWJUM7ViBcKCJUUjhEMFkvIkxNNlc8TQorTSYjIVI9NVghLCAlKSAvWTk9NylCNkZZTjEjUFIqVDU4MzRVQDpWTUo1QlRfOlYtSzhWQF4uMiBFMzc9KQorTSwlXUIvQlReOCRFOjgjXFQzNiU7MTNdQDYjRFIyNUlGPzgqJUAmKSw6JyFJOEZAWTI0MSQzJDFPOkVRTgorTT03KSg6JylPOiVBJDo3QVU4RUlBMiQ1W0BIOVo2VF07PCNMRSozKVQ3QUxQNjZVVT1URDstRiEnOEZNLworTTlURzgsJkVLOUcpWj83VUY4NU1SPlI1ITIxVFk7Nk1IM1QxLz5HSVk+Rkk2OkdNSSwlTVIyMlRZMjMoQAorTTIzKDs4Nl06NUZJSjM0RSUpVFFXPzg5WzZVSTguU0VKPTgtWjlFSUs+RjxWKzVdWDZDWEAlMlU/NURVQAorTThAMVJJJiRZNlcpSjIzKEIyJ0lLOEZNQjIlSVI9VU0vL1NFQDgjXS83Qzk/QCZZJC1GLVI8ICRNIDQ0IAorTV9GKVU6ViU4M1YtQDVGJFQtRFUpL0RdS0AnVUMtQyFDOlYtQzxEVFImUUBeOkVBNjomKFsmU11IOCVBPgorTS1CVFQ4VyE4MjRcXik0MSQ6Ji1VPTc9WzpVSUs+RklCOENEQis0RSUtRkE/NlVJOjpUVTs6RF1KOlRRSgorTT83NUw4Ri06LjVZVD83NUw4VU1DNiM4TS1GQVI2Mk04NkY5WjxEXUg6RFEkNkQxOjYvWE0zNklKOSZBVQorTUJFUUM5RyoiMTRBOCoyKTg6RkE4LjRVWj8nNV1ARU07QEhBPzY2LUI4JTlDO0I0Xi8hTFk6RyFCNlZJOworTTZWIFYuNyoiQEcpOzhWLUY2JkU7OjVFNi9WLVo9VURfOCc9QSsyPDUsRjhfLCREWSlTWU8+RyEpNiVJSgorTTgzXEktRjlCOlZNSTM1TVI+RklKOiYtQzZCKFAxIyEtPkdJQC41RiI6VyAhLSAkXyAvWUk/VylLOlZFQgorTTE0VVI3QkRZODJUTS43Sio8RURZNCYpOjhXSVcxIkQ7MjZBPzpILUoyM1FAPEZJUTgzXFwuNUlLOlZRSAorTTIzKFI1NkVSPVVJOzxHIUs7N0lLNjVJKSZRTTw5VUFJNkZBSDElIUo4RiklMzVIWTcoSVI7RylTOENdJQorTTFUXVI8RkU+NCRUWSo1QTY8RykpNiVFOzxYMVc+R0lIMSVBPCtXP144RV1COlYpMz5IOTovVilaPTU4UAorTS9CRDgyNzU6L0NFJT5HTSg0J01CNkc2IjxGLS84Nik4OkcoVjIkMFsvRUYhPEUhQjomIUk2IyFKPTdJWworTTQlIUM6Jk1LOkZJJDI0RTg5WCE4MjQxQjYhTEkmIjVEL0NZOC8hQDs4J0laPCZBOjhGRSs5RiE+NkYlQAorTTomQVI+V0lSPEcmIDpURDgmIUw7LjcpQi4zIFlARV1QIDVAITIwIyM5R0lLNjcmKD1VSTs6RyE+MlZAWworTSoyNTk9N0lSNiU5QjhFTUtCRkBbKzRFQDgmOVo6RFE7PCdJTkA3LSkvU10pOCVAUDIzXE0tRUFJPVghLQorTTElRUI6NSFSO1AtKV9CVEUrNFVLO1VJLThWIS06RyFDNjVFKShEPiI7NllVOUZJJC9FOTo4RzVdPEZBLQorTS4yPF4uNFFINiYpSDMlWiM+R0oiPEQ9NjIxTVI9Nik5N0ZNPDlHNVM1RDVLPzZJJTUiNC4tRylXLjI0UAorTTpXXSksJilDPEc1WjxGSS0zNDUpOFYsVjZGQUk6NF4jPzRROjpWLUI8JiFKOEcpXTlFSUgzJU1COUZZJAorTS1KOTg4JDFIM1VFOTZEREkoIUBJNUM5STpEREArNj1VPkZZQzo2JUAtRiFKOCRRKS9ERTk6QC1aRDZVUgorTUE4KUMsQVQuJiNdSzhEMF4uM0U/IDYoITZQI145Vk1CMyY6IkBHNVI8RjlGOEZNQDI1NUA2NUVaOkZBQworTTpWITg+RlxZLEM5KTdXPVI4JFFKPFZZRjo3KUEtQ1BZMzU4TSxCVFY2NjhWNCgpUDMzIFA4JDUoOiRVLQorTTYjTEkpMzlJPEVJOjhWITg2RklCNkZFSSoyPUM+R1VWOEVZOCo1OUs2VjldPzZZQjMkTTk3RThfLjZOIgorTTZTXUI4VU1LPEYpQDIyNTpfRklKNkVBTj01STk6JikpNlgpUjpGQS8lMSk6PkVcUiZTRUIvQlU4OkZVWgorTT02OVU8REUlOjchOy1EMVI7Nz02QEdQWTI1ST8xVy1LOiQxQj5GWUw4RiEtNkRVQy9SNFk4NF07OiZNSAorTTEzXUY6UzhWNiM5QDhURE0xNylaQEY9KThWSUMvRDFPMzJVKTcjOFAxNllVO0VFTj4oSVM3IkQ4KCU5VworTThGQUI2WCk5NiAlLSA1TCBfRk1SODVFPjtHVVU7SDVbOUVZRjtVXS04VkUvNUZJTzgmLUA2WClSMTM4RQorTS41OUo6VV0tOkZNQztVQTk6JEUkLUVBOC1CIDsmVTk/KTJVSzxHITUrNDU5MzZNSDYmISUpMTRFODchOgorTTYmTTk2NF1KOFVBSjxUREIuNk4lQFZdOTYjOF40JkU7O0gtQjYzOFk7NylIKEI1Q0JHNTkvRDBeLCZJWgorTT5HKTg6L1lKOFY5Uz5XSTszNUEtLjYuJzlFUS87MlQ1LjYpMTciNFIvQjQ1MSYpMT5HSUI7JkksMjchUAorTTpEMFI4RllXN1dWJS4yNEIvQ0VCODYtKTImTUM3RDFJODRESzhWITUyNiU7NlYtPjozOEk4SCFIL0NdKQorTTU0NF41JkFSOzcpNi8mKVI+RkBZOENcOys1QSQtQyE6PDYpLDgmWilAJlUwLUJEXzomLUM6JFYiNUVIIQorTS1AJSggKFUkOkZFODY2KVo6VVFdPkYpSiBXK14xJU1LOFM4WThUVTo4QkVSQCZJPy5TISk2RUktOichSworTTtWTTgzJyFJNiYlTDgjTEAlMiBWNTNRJDY0VTs9VjkpNjVNQzpVQUYyMUAuJTRFOTg3JVg2Q0VSPEVJQworTT5HVUEmUU0sPTc1SjYzRFsqMj0sNkQ9UjhDRDsmVEVBMiBYMjE4KV08Q1hNKTI1LT04SVU6Rl1SOFYpVQorTT84PVM4JERNJTNFWjhGQUJcJilAMERFLTNWRSkvQ1BJKCM5SDE3KiJARzVIMjRFSzpGSUktRDFSQUcpTQorTUJEUDIiMTRNOjZJOzZCVEUsQ1klOEcpUjo1SU86VUlKOlcpSzZWKFYtJiVaQCZJQzgkQE0rNUFaPkcpQworTS1CRTg7SDYjNkYhLS8iVE0tQzkkOFYtSjZFSUM+R1FXOiVRKTdFSUA4Rk0pLCNYIS5QJE0gL1g7L0Y9TworTTZFTUY7VilNO0YpQj83VUY4NiFLO1M4XzIyRFk2QyE7PEcpVztDOFAyUzhWOEZJQjxHIF4sJV1VNDZNTgorTThEMDgpM1BNLUZZQDEiNFk6VkEtODVNJDE0NUovUjRLKjQwUC42TiAxUj4hOkRRQjs4KUkqUjUtPEZJQgorTTMzOEkxJDBNL0RVSTZUREkoIzxWL0FMODE3OU09Q1g7KTNRJDM3VVo2NktePlc5TjxGKU1AVylIMjM4XworTTZDKUhARk1LPEZROzhXPVA6JDBWNSNZSjI1RVxCRzVAMTRFQThWOUksQilCPzc1VUE3KFwmIFhCOiZZQgorTTgjTDIqVUE1MSZJXT5GLUo8RUlLOydNWjhUVTUyNkVXPlcpUjwjWDsmJEVaP1ZZPykxQEUxWCoiOkZBJQorTTIyVE0tQ11BPVY5QjZWRUA6R0ldPEVAWTZGJF84Vyk5QEJURSA1NCEsQCNeKCFMWTxHPTs4R0lSPEZVSQorTTo3NiI4Ri1GPEdJKTIlQE0rNDRFL0RRRj5ILUArNDErLyUhUDMmKUgqMTRPOjVJQjpWTSQoJDFOLlFNUAorTTtUME0vRkVDMyVdODIzOF44RUE1LUM5RisxNF44QVQuO1YxOzY1JU4zMzkpPEc1WjpFQFwoJiVLNiM5QAorTT1WRUA3RE0kLUREVy5VSU04RihNI0I0TSsxVUI+NDE7X0dVRjdHSUY2NilGOlZFODYkNDsyNylSPkgtUgorTTZEVU4+RzU8LjVJOTQkRE85WCE6LjVBSTg3IUs2IlRNNkcpSj03NV09IyguJiRFSjpHPUgoIU0pOiYpUQorTT02WUI6RkklOCZKIkBGKF42JUVLPEZNSz5IKTgmITRSN0c9QjEzIC4lMlVRPTdJUDM2IF8rM104Ojc1XQorTTxGPVc3JFFaO0cpPy1DISknM0VPMzgoTS1AJS0gNDAgVFJUOCZUVUo2RkVaOkYpSjsmKUgyMzhWMjZFQworTThHKU8yM0UlLUNMSTgoKiM8IzxWMjU1NjpWQUI6IiBALlVFOTZGKUgsQUBSOFU0RTpGXSkvRFVLOiRdOAorTTgkRTgyNDBZN1MoOzZERDssQ1xNKjVJMCBXK146U0RCL1dNXD02SSwtIiFJPkZIXzI3SVo7VilBMjRNSQorTS40RUo+RllAKjFUVC8jKEk3VihNN1ZROjhHSVo5Rlk+OFYhODE2WUAtQyk4PVZNSjM0VUs7NzVLMzYhSgorTTdVQE0yNyk/KzRVUDhWOVgyMyhfOFYtSzpGSVI7NVxSKCM5LThHUVcpMFg7LUYpWTxGTUY6JlxWLUVFVQorTUBGKSkyNUFAOFRVOTpXKUJKRDRULURRQjo0UFQmI1FAPEcpWjxGKUAtQUxWMjVJQjlHSUs8I1hQOEVJPAorTTpWIF8uUjReOERETSwgJTsgNjggX0U0TS1FWTgxNilaOiRVQjxGSVczMjRALUYhMDZHKig7VUEpL1NcRQorTTI3SiI6Q1xWLjQxQzwnSVI6JF0pN0VJOTonKUkvIiBAMjQxKT1XIS0vVFVKOlVFKTYkMS02VFBWMjNYTQorTS42QFsuNEU5OCVBJDxHUiE+RTRSKzZNVT03KS0oQTUtO0ZAXitWTiI8RFEpKVRFVywjOSU+SDlLMjMpJQorTTo1WSk4I0RFO14lSjY1SVpAVSEtOCVNLTtFWTozMzhNNlddQjpUUTg6VilDOkY5SzpWSUM1MzksNiNZJQorTTxGSTw+VUBfMTZFOjM2KUo5RjlKNUM4Vi9WKVI7UzhAJiE1NjxGVUo6R0omNkNdQj5HNTYsI1hSKjRFSgorTTdURSU2JiVBNjRFLTomWFsmVEVCIFcqPDlFUUcuUiA1KTNFJTElUUo8RUU1NlVBLDcmTUk2IlU8OiVBNAorTS1AJSUgNlwgX0VdKTZWWUk4NkFSNkQ1Sj5HKV8+I1A1LSYlPi1DKUpARikpKzRFSTYmWiM+RyFBL0NNQAorTTQ2LUMzNilLPVZJNjZHIVc6JDBNKzIgXkBHSVA4Vi1TOlVNKTJTXF44RklXOEVAWS1FQTgrNDVKOEVFKworTTtILV0/NFBWNTZJUT5HSUIsI0U2NCVEViUzWVpARkhNKCJVQTEjODUsR0lLLjREUCwkMUg6Izg7Lj9ZOgorTTYkMTo+RixZMjZBJTdHTVo8M1w7LUdJQztFSS0zJFVAOlVRUjxGKUIuMiBSKTFATTlEUFQ4RklALVVJPAorTS1FSUM5RylGNjQ1KTYlSUo7VUEkLlMpQzxHKUY8NjlVPFU5JTpXVUoxNTBNKCM5Uj1URF4yNilANjNcVgorTTZGTT4vU10kNkYtQjdUVUg5RDBAKCM5KTNVRUI4RFVDOiVFLDZGSVI2IyE7MzNGIjIzWCErMCU2IC9ZOQorTTYkNS04R0lbPVNYPTI3SUY+SCEkJTFNJDwjTDIuN11XLUEoRzhGKUxAV0lSPCVBQT82JTYvUkUvOldOKAorTTs0RTs8Rk1CODQwSSs3KVpARylGPzgpSC9TXFYvViE6PEZJSDolTTs1QVRFNkVJJTgmSVE9N1VCLCU5TAorTT5HOVY8REVCOiRUVzIzOFk5SDYjOCU1JTY2SUgsQkUtN1MhJDlDWE02RllALEJHNi9VQSk2RylBLjRFTworTTYzXTo+SClNKCRBUzlHOUsyMzhCLjchRj5ILUo7M1hSLEE0LiREMUYxNFFSO1Q1KTtDXE0vRylaPEYtPworTTIzOSs4Rik2KTVJSjpFSTg7RzU6NjZBQjI1TiI8RklIM1IgRTVHNU86NTgjMjo8XzY2TUgxI1kpOiYgXworTSoxTFY6Vk04L1JEVjVFQSc8Jl04NiY5SztWQT46VkBWMzREWS5TXCE1MCUvIC9ZQDpVRFQxJl1aPkREWworTS1EUUs7Jk05LEMpQz5FNEApNilXL1IhJDIkVUM+R0lCOEVAXzpHKUE1MkxFMTY6Ij5XPT83Jk1DPCZEXworTSs2KVpAR0lGPUhJVzIzME0vVilCOlYpSjpGKVE6Iig1LEJUXjpGKSQ4Vy1DL1QxLTxGWVo8Vi1VPTZIXgorTTIyVF46WDopPEYpNTYmKVM4I1BeOCVJSD5GQTY2Ry1LNkJXSC1GIUIxJU06L0RVUjhDXFY6V0lLKTI1OgorTTtXKVI7VVhNKzRFJzs3QU4/ViBQMSQkOCNCVUg1REVNPEZBKThHITQvVjk8OzghSzgjXSk+R0lSNiZBSgorTThWOVM9RzVGMzVBLS42Lic5RVEwN1M4RS9GMUY6Vik8MlU4WTM3RVIyMlUkPlYkViZRQE04JkAjMjk0WQorTS9VRS02Rz1QLjVJUj5XPUg3RyFANUVJNSlTXCE9MCU7IC9ZLzpGUT4yNiU8PEUhSTIyRTs8I1xfL0RdWgorTT5FRFssRF1SOzQ1SDgkNS88R0ksMVYgWTZGKT86RiBAKTNFVz83SUoxVUVCOUZNKSo0VU0/N0lSPkdVWworTTozMFQxNilHO1ZJQjtGXVU+RVxbLyI1JTxFRSQ6NiUvNiYhOzpWOTw4VllVQEdJOCsxKEk6J1YlQEYpKQorTTE2UUs2VTBZMzNdQj02KTA6J0lLOjI3Kyk1QUsuM10tMTVNWjhUTF84VzVBMDMwXjM1UTk7VVElL1U5OQorTT1WWUI7NyBQMjY4SSYiVSw6JUU6OlYtLTY2SVAzJikwNydJVTZDRTY9OElVOkZdUjhWKU48R0lLOCRETQorTSUzRVogVipSNkREWy9WQS86Vy1LOFVAVjEmTUkxMUxNODVBNS8jMSk7ViBbNUZBQDE1RTk2Rk1QKVRRTgorTT84KUo3Rk1LOEYhKykyPCFAMCVJIC9ZNjEmTUw4Vk1JOiVNQzgjWTk8IlQ7KzQ1VzxFSTYvUzk5OlVNSAorTTolRTg6R0lGMTRQXjIzXSQ8KCU8KTI9QjxFUUI4I0UwPCZEXyk0RUg8RzlOPEdJWjxFQFYyNilKOlZZRgorTTlHKipDKClDOiNdOkBGTTY4VExfM1c9TjpGIFYyNkldQTg1UCowWEAzJklVRCc9JCk2SUIxJkU4OCJcWQorTTIjIEczNz08ODNHXiZTOTYuNDUkMzZBSjM0MUE7Vyk6NUchPy9GKSw4Rik4MTRBS0BXIUI5RyksMzZdKworTS1EQVM5RDVCPCQ0WTdVRUg2RklPOzZVWjojISk6VkxZKzZOKDtUVTg2VUErNjZFPi1CNTY8RVklMjQwWworTS5WLSs4V0lWPEZNQDYmTVA5QzBJKTI9ODo0RUM+RkRAODZRSTE1NF8zVilLL1RdPDxISVs4RklXOyYtJAorTUBBTDsgNkwhOkAjXjkjRS08NUlCQTc9TzpHKTo4RzxbJiI1KTtWSTo2NVkkMTRVQDIlQSkxJilNO1YgXworTS8jKEApNiFVPVU5IjVFSSUzNkBZLjYpOi8hQFIyVkVPOlZJTj03QUItQzk4OCYtTjxFUUo/ODYiPEVJSAorTTRXNVY8I1hCKCJdSjxGSSQrNTVSPCdKIz9VWEAuVkU6L1dKLzMhTEUyMzksOEcpSjklREUlMjUtNiQxOAorTV9FMFkrMjU2LEQ1UDpTWFY4R0lbOCRFWz1WJVI7VikwNlREXzpHUVU6VilSO0YpSzslWEU2Rl07NlZNOAorTS41OUA6Vk1SPEclQjpHKTkrNylMNjNZRz83SUw2REUlLUNdSzozODgoRilGL1U1QDgmJTgyVk1SOzdOIworTTxFRUI+V01GNiFAOCs0XUE8J1lQLEVNSjtUVSkxJDU/OkYpQDY3NiVARikwOkYpQjg4KFIpMCU4IDZAIAorTV9GTSkuNk1HOCglTjhGSVI6VSFLNiMoTThWSUMzNFVPO1VNQTpVSS0vU0U6OFYpQC9TOFIkQyk2M1cpUgorTTpGTTkvViVLNjNFKS1DTFItRDVDOFZJRjlHNVc6IzhWM1RFOztYKS0vVylSOUcoXzcmOUI8SCheJiFATQorTTZWSTgrMik4P1ZZSjs3SVctQzlAOiJdLUBHPFwqNEUpLCNdTEI4LVg2NFxfMSVNODQvWUs2UzkkNiNNJAorTThGXSQtRFFSPEZBODhGOU86SClWOCYhJS9GTVo9JlU7OkcpWj5HTVctI1ktNlZFTzg0RSkzNk1XO0ZVUgorTTZGTVI/U11YOCRdTjxHNVY/NylANiQwVjxXQSkqMk0pMzMhQzpGSVAtRiFTOlVNWkRHPS84V0oiPTZZIQorTSYjKE0yVyIiPkRFTDxGSTktQlRNL1chOTMzRUs/N0lSOCRFJDlXPiI6JTQhKzAlLSArSUE2IyE2PEdKIgorTTxGSUs7RylDN1RRNTE2KUA2RiEtPDZVLTM3TVo6NChWOCVZPzdVST4sQUBJMjNZOjpXKVo7VERZMyZFQAorTTYzXFIpNE06IFYrXjpGWVI+RiheL1VAVi1EVVs6RFVKO1UhUzhGKVI6RkojPCRFNTEjWTgxMlRFMTcpXQorTTpFRTo6VFUpLjVFJClVRVo2QyEtOkYgUDEnSiI+RklLPCYkWTZHKUo2Ij05ODZBSzhWTS0yNDFLOEVJKQorTTgjXTo2WClSPThBSzE1SVI8RlE4LUMpQkBHVVo8JVxeMzc1WjpFTFssJkYoPEY5TzEkXUI8RkFXODYpUgorTVBXOU48RzVSPkc9KSZWXVc4I1lAODM4RTVGKUI6UlReOFZNLzpISiI2JTlKQFgtVTwkTT83REUhOEZdLAorTTo3SVA4U1xJLEI1JTwkRE0zJylaPDcgXCk0UVo+R0AhKCAkRSAvWTYuMlReOkc1VjxHPU82RlFQNkRVOAorTTE2RUYxNEU7O1ZIXi9XOVU7VTRWNkZJMDIjRTgsQyhLKzM5ODQmKVU+RyEkL0YpQzo0XFImU11AOkcpSworTThGTU4/VylBNkVMXy1DOUo+RilOOkNdSkBGSVo8RklVPEUhSzYjIFsvQzhJMjZaIkE2LTo6RUk6MjRRQAorTTU2JVI2QihWNjYpPy1FQVo9NjFGPEchJDM3N14+VUxHLjRVTUInSVI2Ri1TOjYlKS1HPTs2U0VLM1Y6JQorTTxEXUA+RllaOCIgMilVTVI4R01XODVNVT5WLTomUU07QEdVUjxFRTo7VjlKOEY5Uj03OUM6Ni06NydJNAorTSRFRV02VDU7PDVFKTpWLTo4QzhUM1ZFJTEnSio6MyElPydNVjxGRSw4RyhfMSVIXjZFJUM7ViBWMSQwWQorTTtWQF8xNi1aOUYpNSsyVUNASClaIDM4ISxAI146MzhNMjYtSzdFLU04QyEtOFRUXjI0NUk4VDUlN0ZRSAorTTYkViM7RUk4JlNFSzhURFYvQkRNKzFATTgjWSU6V0lSOiVJPzg1JSUyMkRWNiZJTj02ST43Rk1SPlZdQgorTTokRFAzJik8OEYxOzpXNUo8RllKPEZFLTpWLSkrMlRJJEI1LT0oOVU6VikoMjU5JDMkRSg6RlxWMjVBOQorTThEMSQ8Rlk+M1VRTjpWLVVfR1VaOCRcWTZWWVA9M0UsQEYlOC41QVI8RixQMzQxSjxEVFAxNz1NPzZMXAorTSpSRFk3U0VCOUZdQztHSVs9UEQyLCZJWj03SUY4RklCOEYlSz8mWVI6JlFQOjZNVzdBQFk/VyBfMjclSQorTTMmSU0zNikkMjRNQTY1QVFARyBWL0YtRj02KUApVDVQNSNcXC8lRFAqViFILUNdSTZXKUozNUFKPkYpLAorTTYjXE0zOClaPkAoXiAtLUY1IjUpOiYhLDM1UUArMyEsLEI0WzI2LTgvVUFCOlVdODZHSV04RUBJKzYhUAorTTY1SUYuMyhAJTJFQi1DWT86JyVPOEZNSTIzIFsqMyEtNkVNSz9WXTozJilSOkYpQjUzXFYuVFUkOEcpUgorTTlGSVo7UC1LX0YpQjdFXFIuUiApIjJVRjxHNiI+QzklO1VJJCsyPS84RDVLPEYpSzhEMUs5RiEtLCQxQgorTTZHPVo7JzYgNjZNJTZHNU44JzUlLUQ1OzhIIUwyM10kOlZNJCgiKUA7J0lVPEZBQDYkRFY2I106MzQxMQorTTtILFAoIlU2PEc1VTs3SiA6RUFAO0gpVjtGUUY+SCFWQCYsOCZVQUktQyE6QCZdOjokVTosJiU5MjpJKQorTTo3KU0+Ri1JOjRBRjxVRFY2NkUpKzJEXDozWEU2JUhNKzRVQkBHKTY6R0laOlQwWTI0XUI8RyghLEAkTQorTSAvWF4vQVUlO1ZNQzomLUk3RDVGKzJEUi1EVE0rNl1fOiRVLDhHSiU+VkE4NUVJSjY1RVI4JDBUKlRNQAorTS1DWS84NyFQOEcpXzojOEUsIyFJNlNFOj5HNUo1RUlCOUcpLDYkRE0pUzhZOCZJOjhFSVI8RVExOkZZSworTTdFXFYtQ0wuIjFMRy1UQTNAJDRQNjZdQS9CVF4uM01TPkY5QzpFSVA6RkksKTM4ViwmK142U0VEQzddVworTS40MUBAWEVOLUJVQThWKVo8RUkpKVNZMDs0TFY3VUUvPEgpSjtVSF8tRkFANlVYViwkQUY6JiFANkZJQgorTTMmMiFCR0ktLVcpWjxWLS0zV1YmPUdVUC8iRFk3VSBFK1dKIDhWLTs4QjUsNkQ1KTwnKTE6RilKPiQ1JQorTTxGTUI6VzxeKCFMVjhFOF8zNUBSKzMhQz83LS05J1YjPEREWzM3KU9ARik7IDJEISZQI14vUyg4LUc9VQorTThWQTs8RkBfOiJUTTUzTE0kQU06QkZdKS41SUs/OClROUcxSzxGST48Rk1JMjM5TTNTOSU2Vk1KO1VJMQorTUAnPTgrM0RJOFY4VjY3SVo8Rl1CMzZOIjMlQFkrM1xfL0VFQjYlTS03JkkpLCQxTTtGKUIyNEReKCMgWworTSghTDssJylJMlQxQjZFTTgxMyhFOCdJVjpWKSw4WCoiOkU5KSoyITlfRERHMSdWKjojRSU4JzlbOEI0TQorTTolRTo4RTktMjFMNS9IJVI6Vyk1KEVFVzQlRUEtQzlIPEYtSTdFNS82RUlLPEchQy4yNSw+SDlbMTJVSgorTTtGTSkpUyFXQkdVXT5WRT4tRDU4KzI9SjpWIVA5VSErOCQ0TS9HPiE7RikxNkc9QzYlSVo+RylfMjEoLgorTSZVSUk7RyE/LlFMQjg2WUouVDVVPzcpKS41QVJASClKM1AlNSA0MCBfRjxWJiFNOTxEVSkzNyVSN1YoWworTSlVQTQpMEQ1LCdJWjokRF4xNylaPEY5UjsmVU47RkkvOFYgXzwlMEUrNEVKPEZJNjE2OUIzUzkkLVYlPworTS41RVI5RllSOCNFQz5GRUcqMjUpOUVNOzpEVTo6VklLNUM4RzhHKVI6RUlDOCRFSj1WIF8xJV1VPlchQworTThUQS08RFBJLCQ1OTtHXUIrMzlXQEZVXzYiIDU4KUVGMzVNVUE2IFYpVUlVPEVEOyo1OSk6NiBeNjMwLgorTSNCKUIgVktEMjEoTTdUMSw6JDA7OEghTDhWKTs4JUxQMTZOIDoiNDgyNylaPkYpJTZWSUsxIUBJOlgpVQorTT83TUY6IzheOjRFKTo0VSQ9OEFJOlchJSZSNSQ+WDlXOCVJSzokRSRAKC1aQUcgUCNBNSQ2V0owO1JUOworTSxERVc7UzhQOCVZQjgkRF44KCFKL1AlOyA3PCBfSCEpKjI1KThERF8uNF1aQCY5QTE0RT81MiA4KCU5VAorTT5GTSQpNFFMOEVRMDhWLUY+RkEkM1VFLTolQEklMUxfPkcpRjEkVFkxMzhWLlRFOCwlQUIvVUlKN1M5OgorTTxFRUwpMFhFMSVFQjpDWS1AR1VXOEQoSTYmKVI8RFEsMiMhPj83SUY6RylGOlZJTT1UMFk6RUhAKjQxJQorTTMnNUMvUkVBQVZVWjgiNEA4X1lMOUVFVUJFRUAtRFFOOlZEXzdGQS08JzU1MlFMKSNCISkzNFBfN1QxOQorTTdDOFA2RlRNOEdJUjZDWSw2RUhFJTM5SjlRTDg4J0k6NkcpRjhWLUsyUiBNOldJVjwnPUw2IkRPO1chOgorTTozOEI4SElaOldBRi5TTTk5WCldPFYtOjgiNDs4J11LO0gtQCgiIFYsRlYyPkNcSTUkMTo9U1hNNiM4UAorTTY1QFYsJyoiPCNYIStQJUogL1lfPEcxRDomKTgtQjRJOlkhUjhWISk2RkE2LlFAOy9WVU03U1BZOERQXgorTSs0RTgyJylJL1M5OTgmQTgvIkRALUZBUjsmQUgyNV0kKTJETTEiVFYyMzhZOCYhQjtWTSk4JDBAKlRNLQorTThFODsrN0oqPkZJLCszTFY4SCFDMlMgVi1EXiY+Ri1VOjU5JTZXSTszNklQNCBYTTYmSUo3JUkpNkdJVQorTTpVQE0vJi9eOlZdJDpIOU06RkFDOERBTzE1QVQ4JyohNiY4TSYhQSQ8Jl0/OCZNSz5HSTouVDVINUVJQgorTTVDREkqNF07LjFMTTZGQEkoRk4gLUI9WjpWTVE4IzhFKzRdSz5WLSg6RUQ4JTRSIjxVREUmVTlVPUYtSworTTo0RS86Nk1VPUdNUDdVNEAjQlVCOjVZWjozUFwtQzlLQEcpOi5TOF8uNkUtLUVBJCZTWT8yMUxfQEYlPgorTSAxNCEuMCNeNkVJVz5HXVI6Izg7LSVBVTpVSVc3VE1INlRESSRCVTo4RV1GMjVdOC1CVTg4NilSO1M4OworTS9WQVAvUzk+N0QwWTZGTVI9ViFBNiNQSShDOEcqU1BNLUVBMTpXSVI8JkVALEJFJDgkUFAjQU1LQyZVSgorTThFQTUtRiIiOlRVLTdCND0+RlVRPkZVNi1EVVo2VDFGOlZAQCYkRVo8RFxQNkYpTTxHIUEtRTFLX0YtOQorTS1UUTs2VylWQSZIXzhDXE0zJylVQEYmKDtTWEUvVkVINkZBSzpHNVo8RV0sOiYlSDgjWEUlMkUpNiYgTQorTS9GSUIuUjVSQFM4LjpWRUM9VyBeKTM5ODM3KVEzJiklJzFAVjxGSSkqMzk6NyVNQzhERSU2Rk1COEY5UworTTwmQT4oITRANjZdPjxGKSw4IyE+PCdNVzhGPTk4JkFLN1NFJDRTOSk6JkBSKzgoVjgwKE0gL1hNLUZFTgorTUBHVU8wMjUkNiRRLS1HKTovRkFPNjY5JC9VTU86Ri1COFYgXCs1QUM+WC1RNSJMVjgnJF8uNilfOiQ1OQorTTQ2OVU+Nk07OCRNPjYjXFQqUUxWNiRRQz5HNVc4RURfLyM9SDEiVFAoJUIqOzYpLThWPS04RylCL1VJOgorTS5SRVI9JlVaPCVBJTInXUIvVklKO1M4Oy1HSVo2IlU4NlYpMDZWJTo1RkteOkRVKTEyPSw9V1YmPlVNOgorTTYjTFk6RzYjPic1XDhVRTQvRDU4NjZJQDpWPVI4RilKO1chVTUxQC4mVDEpOENcWTdTIEAmVUlaMjFNQAorTTZFTVs+Rl0vODYlJThXPT46IzhAKCNdUTpVOS0yNEFaPlYhOykyITk6VUEpL0Q0WyNBQDgtIyk5PEZNUworTTslTUgtRiFPPkdJSzokVUE9NylSPSVATSwlOVJARiRfQEJNKyA0RCErMCNeLEJFKTpHNiI+RTRNN0ZBJAorTTMzWUIzUzk6PCRdQjtUVS08SCFLOUZdSjVDOFkzN0olPEZBOTUmQVAyNEVDPyctOC9TRSg5R0lSOEYtOgorTTomTTo5I1A7KzRFKTMnKVc7NikkK1QwWTpDWEUsQUxePCctQjE2JUw8J0lVMzMhOzZETEAzJ0lVPzdVUAorTTMkRUs7Vi1INlZAXCk0RVU9NkEtN1YpSDEzRSg8Jik7SFZJOzZWIFYuNyoiQEcpOzhWLUY2JkU7OjVdJworTTxGTUY9VFRCNiRRQi41RS01RDU6IFcrOkA1QDIjQTReOCZdPzI0REUlMU04O1VIVjpDIF48RlVNOkdJSworTS41SVc4VFRfKjJEXjhVSTQ3VUE2OkdNSzVDTSQ2NkE6MzY5QTJSRFQvJVklMlRFJDpHITo2NTU2OFdVWgorTTpFSTkvU11XPThKJTIyRFY2R0lPN0NNNiA1QCEuUCNeMSFMVDI2LVI8RUBNNjYpOjdWLUgtQjUpOCRRLworTThFQFk4SClaOkchUDclTFYsJyoiPDRVQjZGKVI2M1kkPVglSjYjTE04JyFDOiVJOjImLTw8JTBNKzNZKQorTTI2OUo6RUk/L0VFJDYlOEAlMU0pL1YtQCs0NUI8R0FdOlRVPzhWIFssRUVSO0dSJzgkVTk2Vk1QMyRQSQorTSk2KiM6VjlCOEZJSjMzITlANykwVkYpSDgmRTgsJklVPkdNMDQmLUg6Vk1KOkVcUDhHPUI8JDBWMjVJNgorTSszXSkrMjUpOlYtUj5GJD0jQUBNMjcpUjpWJF8tJUFLOlVARTEiNE0xNDUwOzghTy40VVI7JU05L1JUVgorTTEjXF82NV1VPUc1SjVDWSkvRkVHLjAtQ0hWRUo8Nz1CODNcOy1FQUI2JERWLjcpWjhENF8pMU07Pyg6KgorTTokMSQxNkVDOCRFNiA1XCE2MCM4OjYhODpUVUs8JEQ9MTZBOTY2LVc2QiBfOCQ1ODdUXSs2R1VaOVRVSworTThWOSQvVVFVOkNFJS41SUs4M1xcMzchUDolXF8zNU0pODY5JTdWISw2RFRfLUVBRjNWRUI7JSE7NkZKIAorTT5GPTgsQlU4MjRVPy1DXSQ5UC1SX0YtRDxGSToyM0VBOFZaIjxFNSQxNi1TNkM8SSk0RV06Ri1COEcpWgorTTIxVTpAV1UsNkZNQzhHIUA6RilSPzY5OjokUTs4RjlOOiNZLDkmSVI3VUU/NkYhJTEjTDgjQ1lKOCZJSworTTlEJFQxIzhfPkg2IjxFRSk7V0lKNTIgOzEzOFwtJEVCOUcpODsmWUs4NiFBMlYlKTI1MFA2RyldQFZBJQorTSwiVE04Vz1JNjo1OzZGSVpAOEVbNjQwQCUyVU46NEReLCYpSjo1WFkoIyEkOkc2IjtFRS0yNU1COFU5PworTSA0VCE6UCJPQCZdOThDXUA6NUhWMTZBOThTXUI6JEUpOjYhODZVQUk3RylVNlNFLDhWKSwyNDVKPEYhJAorTS9VOTs1REVJOjYsIzhPWUg7ViEtNlYgSTI2XUAyM1kkJlNFSTQmLUI9NF1DMTUmKkMoKVcyMzkpNlYtQgorTTI1WTkxNkoiPkYpOTxHSS8yMlRfOERFO0BHKUo6JFw1KERVTys0RUYzNEUkLjZeKTgiVSxAR1BZMjVJPworTTFXLUs6JDFCPkZZTDhGIS02RFVDO1QxLTZVTS00JyFCNkYtLTVDOEAoJDVIOiU4VCxDKDsqVTEsOkdBXQorTT5FRy4zJyoiPEYsXyxFRFYxM106O1RROThHSU40JklRNlYpWjhGLUQqM1k5OUdJPy9EMEkoI1lDPkUhOQorTTZVSU5ASClfOjU0QCNCNUE8JEUkMjVBJDgmUUkuUlU2OiY5XT5WKSkuM0U4OiRVOCA1RCE9QCNeQkc9LworTThSNFY1RV0lOCZJLDpVQFY2JERZOCYhOC9UXVI+R1YiOiNcXzhWSUAyM107OkYhNjomITgvU11LPkcpSworTTNUVVJAR0lKOlZMXzZGTUs6JERcKjNdOzgnKVI6RSFCMjRFVT83Vio7RF0pMzVJQjMmJSkmVSIqQkY5KAorTTZHSVcuMlRWMzNFQ0FWOTwzVlRNJTNZPzYlQUIuMiA4JTNFUD5GXUY/ODRZX0I0Qi9DRUI4Ni0pMiZNQworTTdEMUk4NERLOFY9QjpGTUMrMlVCOERdQzhVQFcyNFU6O1cpSDdFNTYxIzkpKzNZSjtHKTo0JllaPTdJSworTTYzXFY1NiFJPEY4XzEnPUsxJVFJKzMhVz8lTTgvJUE5OFZNKSszOTsoIShWOiVJODZFTU4+VllNPCVERworQSYjOUI8JE0pNjYgXywlSVs8IlRWNkYpUkBHSVA1IyEpNkgpQDYgJTkgNzQgCisgCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9odHRwc19zdm5fcHl0aG9uX29yZ19yb290LnBlbSBiL2xpYi9weXRob24yLjcvdGVzdC9odHRwc19zdm5fcHl0aG9uX29yZ19yb290LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2RmYzgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2h0dHBzX3N2bl9weXRob25fb3JnX3Jvb3QucGVtCkBAIC0wLDAgKzEsNDEgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJSFBUQ0NCU1dnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFRRkFEQjVNUkF3RGdZRFZRUUtFd2RTYjI5MAorSUVOQk1SNHdIQVlEVlFRTEV4Vm9kSFJ3T2k4dmQzZDNMbU5oWTJWeWRDNXZjbWN4SWpBZ0JnTlZCQU1UR1VOQgorSUVObGNuUWdVMmxuYm1sdVp5QkJkWFJvYjNKcGRIa3hJVEFmQmdrcWhraUc5dzBCQ1FFV0VuTjFjSEJ2Y25SQQorWTJGalpYSjBMbTl5WnpBZUZ3MHdNekF6TXpBeE1qSTVORGxhRncwek16QXpNamt4TWpJNU5EbGFNSGt4RURBTworQmdOVkJBb1RCMUp2YjNRZ1EwRXhIakFjQmdOVkJBc1RGV2gwZEhBNkx5OTNkM2N1WTJGalpYSjBMbTl5WnpFaQorTUNBR0ExVUVBeE1aUTBFZ1EyVnlkQ0JUYVdkdWFXNW5JRUYxZEdodmNtbDBlVEVoTUI4R0NTcUdTSWIzRFFFSgorQVJZU2MzVndjRzl5ZEVCallXTmxjblF1YjNKbk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQworQ2dLQ0FnRUF6aUxBNGtaOTdEWW9CMUNXOHFBelFJeEw4VHRtUHpIbGF3STIyOVo4OXZHSWowNTNOZ1ZCbGZrSgorOEJMUFJvWnpZTGR1ZnVqQVdHU3V6YkN0UlJjTVkvcG5DdWpXMHI4KzU1akU4RXo2NEFPN05WMXNJZDZlSU5tNgoreldZeU4zTDY5d2oxeDgxWXlZN25EbDdxUHY0Y29SUUtGV3lHaEZ0a1ppcDZxVXRUZWZXSW9udnVMd3BoSzQyeQorZmsxV3BSUHM2dHFTbnF4RVFSNVlZR1VGWnZqQVJMM0xsUGRDZmd2M1pXaVlVUVh3OHdXUkJCMGJGNExzeUZlNwordzJ0NmlQR3djc3dsV3lDUjdCWUNFbzh5NlJjWVNOREhCUzRDTUVLNEpad0ZheitxT3FmclUwajM2TksyQjVqYworRzhZMGYzL0pISUo2QlZnckNGdnpPS0tyRjExbXlaalhuaENMb3RMZGRKcjNjUXh5WU4vTmI1Z3puWlkwZGo0aworZXBLd0RwVWViK2FnUlRoSHF0ZEI3VXEzRXZiWEc0T0tEeTdZQ2JaWjE2b0UvOUtUZldndTNZdExxMWk2TDQzcQorbGFlZ3cxU0pwZnZiaTFFaW5iTER2aEcrTEpHR2k1WjRyU0RUaWk4YVA4YlFVV1dISWJFWkFXVi9SUnlIOVh6UQorUVV4UEtaZ2gvVE1mZFF3RVVmb1pkOXZVRkJ6dWdjTWQ5WmkzYVFhUkl0MEFVTXlCTWF3U0IzczQybWhiNWl2VQorZnNsZnJlanJja3p6QWVWTElMK2FwbGZLa1FBQmk2RjFJVGUxWXcxblBrWlBjQ0JuenNYV1dkc0M0UERTeTgyNgorWXJlUVFlamRJT1FwdkdRcFFzZ2kzSGlhLzBQc21Cc0pVVXRhV3NKeDhjVExjNm5sb1FzQ0F3RUFBYU9DQWM0dworZ2dIS01CMEdBMVVkRGdRV0JCUVd0VEliMU1mejRPYU84NzNTc0RydXNqa1kwVENCb3dZRFZSMGpCSUdiTUlHWQorZ0JRV3RUSWIxTWZ6NE9hTzg3M1NzRHJ1c2prWTBhRjlwSHN3ZVRFUU1BNEdBMVVFQ2hNSFVtOXZkQ0JEUVRFZQorTUJ3R0ExVUVDeE1WYUhSMGNEb3ZMM2QzZHk1allXTmxjblF1YjNKbk1TSXdJQVlEVlFRREV4bERRU0JEWlhKMAorSUZOcFoyNXBibWNnUVhWMGFHOXlhWFI1TVNFd0h3WUpLb1pJaHZjTkFRa0JGaEp6ZFhCd2IzSjBRR05oWTJWeQorZEM1dmNtZUNBUUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekF5QmdOVkhSOEVLekFwTUNlZ0phQWpoaUZvZEhSdworY3pvdkwzZDNkeTVqWVdObGNuUXViM0puTDNKbGRtOXJaUzVqY213d01BWUpZSVpJQVliNFFnRUVCQ01XSVdoMAorZEhCek9pOHZkM2QzTG1OaFkyVnlkQzV2Y21jdmNtVjJiMnRsTG1OeWJEQTBCZ2xnaGtnQmh2aENBUWdFSnhZbAorYUhSMGNEb3ZMM2QzZHk1allXTmxjblF1YjNKbkwybHVaR1Y0TG5Cb2NEOXBaRDB4TURCV0JnbGdoa2dCaHZoQworQVEwRVNSWkhWRzhnWjJWMElIbHZkWElnYjNkdUlHTmxjblJwWm1sallYUmxJR1p2Y2lCR1VrVkZJR2hsWVdRZworYjNabGNpQjBieUJvZEhSd09pOHZkM2QzTG1OaFkyVnlkQzV2Y21jd0RRWUpLb1pJaHZjTkFRRUVCUUFEZ2dJQgorQUNqSDdweUNBcnBjZ0JMS05Rb2RnVytKYXBuTThtZ1BmNmZoalZpVlByM3lCc09RV3F5MVlQYVpRd0dqaUhDYworbldLZHBJZXZaMWdOTURZNzVxMUkwOHQwQW9aeFB1SXJBMmp4TkdKQVJqdFQ2aWowclB0bWxWT0tUVjM5TzlsZworMThwNWFUdXhaWktteG9HQ1hKek42MDBCaXFYZkVWV3FGY29mTjhDQ21IQmgyMnA4bHFPT0xsUStUeUdwa08vYworZ3IvYzZFV3RUWkJ6Q0R5VVpiQUVtWFovNHJ6Q2FoV3Fsd1EzSk5nZWxFNXREbEcrMXNTUHlwWnQ5MFBmNkRCbAorSnp0N3UwTkRZOFJEOTdMc2FNemhHWTRpKzVqaGUxbytBVGM3aXdpd292T1ZUaHJMbTgyYXNkdXljUEF0U3R2WQorc09OdlJVZ3pFdi8rUERJcVZQZkU5NHJ3aUNQQ1IvNWtlbkhBMFI2bVk3QUhmcVF2MHdHUDNKOHJ0c1lJcVErVAorU0NYOEV2MmZRdHp6eEQ3MlY3RFgzV25SQm5jMENrdlN5cUQvSE1hTXlSYSt4TXd5TjJoelh3ajdVZmRKVXpZRgorQ3BVQ1RQSjVHaEQyMkRwMW5QTWQ4YUlOY0dlR0c3TVc5Uy9scE90NWh2azlDOEp6QzZXWnJHLzhaN2psTHd1bQorR0NTTmU5RklOU2tZUUt5VFlPR1dobEMwZWxuWWp5RUxuOCtDa2NZN3YydmNCNUc1bDFZanFyWnNsTVpJQmp6aworems2cTVQWXZDZHhUYnk3OGRPczZZNW5DcHF5SnZLZXlSS0FOaWhEamJQSWt5L3FibjNCSEx0NFVpOVN5SUFtVworb21UeEpCemNvVFdjRmJMVXZGVXVmUWIxbkE1VjlGcldrOXAyclNWelRNVkQKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9pZWVlNzU0LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9pZWVlNzU0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJiMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2llZWU3NTQudHh0CkBAIC0wLDAgKzEsMTg1IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorUHl0aG9uIElFRUUgNzU0IGZsb2F0aW5nIHBvaW50IHN1cHBvcnQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz4+PiBmcm9tIHN5cyBpbXBvcnQgZmxvYXRfaW5mbyBhcyBGSQorPj4+IGZyb20gbWF0aCBpbXBvcnQgKgorPj4+IFBJID0gcGkKKz4+PiBFID0gZQorCitZb3UgbXVzdCBuZXZlciBjb21wYXJlIHR3byBmbG9hdHMgd2l0aCA9PSBiZWNhdXNlIHlvdSBhcmUgbm90IGdvaW5nIHRvIGdldAord2hhdCB5b3UgZXhwZWN0LiBXZSB0cmVhdCB0d28gZmxvYXRzIGFzIGVxdWFsIGlmIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbQoraXMgc21hbGwgdGhhbiBlcHNpbG9uLgorPj4+IEVQUyA9IDFFLTE1Cis+Pj4gZGVmIGVxdWFsKHgsIHkpOgorLi4uICAgICAiIiJBbG1vc3QgZXF1YWwgaGVscGVyIGZvciBmbG9hdHMiIiIKKy4uLiAgICAgcmV0dXJuIGFicyh4IC0geSkgPCBFUFMKKworCitOYU5zIGFuZCBJTkZzCis9PT09PT09PT09PT09CisKK0luIFB5dGhvbiAyLjYgYW5kIG5ld2VyIE5hTnMgKG5vdCBhIG51bWJlcikgYW5kIGluZmluaXR5IGNhbiBiZSBjb25zdHJ1Y3RlZAorZnJvbSB0aGUgc3RyaW5ncyAnaW5mJyBhbmQgJ25hbicuCisKKz4+PiBJTkYgPSBmbG9hdCgnaW5mJykKKz4+PiBOSU5GID0gZmxvYXQoJy1pbmYnKQorPj4+IE5BTiA9IGZsb2F0KCduYW4nKQorCis+Pj4gSU5GCitpbmYKKz4+PiBOSU5GCistaW5mCis+Pj4gTkFOCituYW4KKworVGhlIG1hdGggbW9kdWxlJ3MgYGBpc25hbmBgIGFuZCBgYGlzaW5mYGAgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIHRvIGRldGVjdCBJTkYKK2FuZCBOQU46Cis+Pj4gaXNpbmYoSU5GKSwgaXNpbmYoTklORiksIGlzbmFuKE5BTikKKyhUcnVlLCBUcnVlLCBUcnVlKQorPj4+IElORiA9PSAtTklORgorVHJ1ZQorCitJbmZpbml0eQorLS0tLS0tLS0KKworQW1iaWd1b3VzIG9wZXJhdGlvbnMgbGlrZSBgYDAgKiBpbmZgYCBvciBgYGluZiAtIGluZmBgIHJlc3VsdCBpbiBOYU4uCis+Pj4gSU5GICogMAorbmFuCis+Pj4gSU5GIC0gSU5GCituYW4KKz4+PiBJTkYgLyBJTkYKK25hbgorCitIb3dldmVyIHVuYW1iaWdvdXMgb3BlcmF0aW9ucyB3aXRoIGluZiByZXR1cm4gaW5mOgorPj4+IElORiAqIElORgoraW5mCis+Pj4gMS41ICogSU5GCitpbmYKKz4+PiAwLjUgKiBJTkYKK2luZgorPj4+IElORiAvIDEwMDAKK2luZgorCitOb3QgYSBOdW1iZXIKKy0tLS0tLS0tLS0tLQorCitOYU5zIGFyZSBuZXZlciBlcXVhbCB0byBhbm90aGVyIG51bWJlciwgZXZlbiBpdHNlbGYKKz4+PiBOQU4gPT0gTkFOCitGYWxzZQorPj4+IE5BTiA8IDAKK0ZhbHNlCis+Pj4gTkFOID49IDAKK0ZhbHNlCisKK0FsbCBvcGVyYXRpb25zIGludm9sdmluZyBhIE5hTiByZXR1cm4gYSBOYU4gZXhjZXB0IGZvciBuYW4qKjAgYW5kIDEqKm5hbi4KKz4+PiAxICsgTkFOCituYW4KKz4+PiAxICogTkFOCituYW4KKz4+PiAwICogTkFOCituYW4KKz4+PiAxICoqIE5BTgorMS4wCis+Pj4gTkFOICoqIDAKKzEuMAorPj4+IDAgKiogTkFOCituYW4KKz4+PiAoMS4wICsgRkkuZXBzaWxvbikgKiBOQU4KK25hbgorCitNaXNjIEZ1bmN0aW9ucworPT09PT09PT09PT09PT0KKworVGhlIHBvd2VyIG9mIDEgcmFpc2VkIHRvIHggaXMgYWx3YXlzIDEuMCwgZXZlbiBmb3Igc3BlY2lhbCB2YWx1ZXMgbGlrZSAwLAoraW5maW5pdHkgYW5kIE5hTi4KKworPj4+IHBvdygxLCAwKQorMS4wCis+Pj4gcG93KDEsIElORikKKzEuMAorPj4+IHBvdygxLCAtSU5GKQorMS4wCis+Pj4gcG93KDEsIE5BTikKKzEuMAorCitUaGUgcG93ZXIgb2YgMCByYWlzZWQgdG8geCBpcyBkZWZpbmVkIGFzIDAsIGlmIHggaXMgcG9zaXRpdmUuIE5lZ2F0aXZlCit2YWx1ZXMgYXJlIGEgZG9tYWluIGVycm9yIG9yIHplcm8gZGl2aXNpb24gZXJyb3IgYW5kIE5hTiByZXN1bHQgaW4gYQorc2lsZW50IE5hTi4KKworPj4+IHBvdygwLCAwKQorMS4wCis+Pj4gcG93KDAsIElORikKKzAuMAorPj4+IHBvdygwLCAtSU5GKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorLi4uCitWYWx1ZUVycm9yOiBtYXRoIGRvbWFpbiBlcnJvcgorPj4+IDAgKiogLTEKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKy4uLgorWmVyb0RpdmlzaW9uRXJyb3I6IDAuMCBjYW5ub3QgYmUgcmFpc2VkIHRvIGEgbmVnYXRpdmUgcG93ZXIKKz4+PiBwb3coMCwgTkFOKQorbmFuCisKKworVHJpZ29ub21ldHJpYyBGdW5jdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09CisKKz4+PiBzaW4oSU5GKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorLi4uCitWYWx1ZUVycm9yOiBtYXRoIGRvbWFpbiBlcnJvcgorPj4+IHNpbihOSU5GKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorLi4uCitWYWx1ZUVycm9yOiBtYXRoIGRvbWFpbiBlcnJvcgorPj4+IHNpbihOQU4pCituYW4KKz4+PiBjb3MoSU5GKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorLi4uCitWYWx1ZUVycm9yOiBtYXRoIGRvbWFpbiBlcnJvcgorPj4+IGNvcyhOSU5GKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorLi4uCitWYWx1ZUVycm9yOiBtYXRoIGRvbWFpbiBlcnJvcgorPj4+IGNvcyhOQU4pCituYW4KKz4+PiB0YW4oSU5GKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorLi4uCitWYWx1ZUVycm9yOiBtYXRoIGRvbWFpbiBlcnJvcgorPj4+IHRhbihOSU5GKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorLi4uCitWYWx1ZUVycm9yOiBtYXRoIGRvbWFpbiBlcnJvcgorPj4+IHRhbihOQU4pCituYW4KKworTmVpdGhlciBwaSBub3IgdGFuIGFyZSBleGFjdCwgYnV0IHlvdSBjYW4gYXNzdW1lIHRoYXQgdGFuKHBpLzIpIGlzIGEgbGFyZ2UgdmFsdWUKK2FuZCB0YW4ocGkpIGlzIGEgdmVyeSBzbWFsbCB2YWx1ZToKKz4+PiB0YW4oUEkvMikgPiAxRTEwCitUcnVlCis+Pj4gLXRhbigtUEkvMikgPiAxRTEwCitUcnVlCis+Pj4gdGFuKFBJKSA8IDFFLTE1CitUcnVlCisKKz4+PiBhc2luKE5BTiksIGFjb3MoTkFOKSwgYXRhbihOQU4pCisobmFuLCBuYW4sIG5hbikKKz4+PiBhc2luKElORiksIGFzaW4oTklORikKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKy4uLgorVmFsdWVFcnJvcjogbWF0aCBkb21haW4gZXJyb3IKKz4+PiBhY29zKElORiksIGFjb3MoTklORikKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKy4uLgorVmFsdWVFcnJvcjogbWF0aCBkb21haW4gZXJyb3IKKz4+PiBlcXVhbChhdGFuKElORiksIFBJLzIpLCBlcXVhbChhdGFuKE5JTkYpLCAtUEkvMikKKyhUcnVlLCBUcnVlKQorCisKK0h5YmVyYm9saWMgRnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PQorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvaW5maW5pdGVfcmVsb2FkLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2luZmluaXRlX3JlbG9hZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDFjY2FkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2luZmluaXRlX3JlbG9hZC5weQpAQCAtMCwwICsxLDggQEAKKyMgRm9yIHRlc3RpbmcgaHR0cDovL3B5dGhvbi5vcmcvc2YvNzQyMzQyLCB3aGljaCByZXBvcnRzIHRoYXQgUHl0aG9uCisjICBzZWdmYXVsdHMgKGluZmluaXRlIHJlY3Vyc2lvbiBpbiBDKSBpbiB0aGUgcHJlc2VuY2Ugb2YgaW5maW5pdGUKKyMgIHJlbG9hZCgpaW5nLiBUaGlzIG1vZHVsZSBpcyBpbXBvcnRlZCBieSB0ZXN0X2ltcG9ydC5weTp0ZXN0X2luZmluaXRlX3JlbG9hZAorIyAgdG8gbWFrZSBzdXJlIHRoaXMgZG9lc24ndCBoYXBwZW4gYW55IG1vcmUuCisKK2ltcG9ydCBpbXAKK2ltcG9ydCBpbmZpbml0ZV9yZWxvYWQKK2ltcC5yZWxvYWQoaW5maW5pdGVfcmVsb2FkKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2luZmluaXRlX3JlbG9hZC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvaW5maW5pdGVfcmVsb2FkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWM0N2JhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2luZmluaXRlX3JlbG9hZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2luZmluaXRlX3JlbG9hZC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvaW5maW5pdGVfcmVsb2FkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWM0N2JhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2luZmluaXRlX3JlbG9hZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2luc3BlY3RfZm9kZGVyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2luc3BlY3RfZm9kZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZGUyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvaW5zcGVjdF9mb2RkZXIucHkKQEAgLTAsMCArMSw1NiBAQAorIyBsaW5lIDEKKydBIG1vZHVsZSBkb2NzdHJpbmcuJworCitpbXBvcnQgc3lzLCBpbnNwZWN0CisjIGxpbmUgNQorCisjIGxpbmUgNworZGVmIHNwYW0oYSwgYiwgYywgZD0zLCAoZSwgKGYsKSk9KDQsICg1LCkpLCAqZywgKipoKToKKyAgICBlZ2dzKGIgKyBkLCBjICsgZikKKworIyBsaW5lIDExCitkZWYgZWdncyh4LCB5KToKKyAgICAiQSBkb2NzdHJpbmcuIgorICAgIGdsb2JhbCBmciwgc3QKKyAgICBmciA9IGluc3BlY3QuY3VycmVudGZyYW1lKCkKKyAgICBzdCA9IGluc3BlY3Quc3RhY2soKQorICAgIHAgPSB4CisgICAgcSA9IHkgLy8gMAorCisjIGxpbmUgMjAKK2NsYXNzIFN0dXBpZEdpdDoKKyAgICAiIiJBIGxvbmdlciwKKworICAgIGluZGVudGVkCisKKyAgICBkb2NzdHJpbmcuIiIiCisjIGxpbmUgMjcKKworICAgIGRlZiBhYnVzZShzZWxmLCBhLCBiLCBjKToKKyAgICAgICAgIiIiQW5vdGhlcgorCitcdGRvY3N0cmluZworCisgICAgICAgIGNvbnRhaW5pbmcKKworXHR0YWJzCitcdAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hcmd1ZShhLCBiLCBjKQorIyBsaW5lIDQwCisgICAgZGVmIGFyZ3VlKHNlbGYsIGEsIGIsIGMpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzcGFtKGEsIGIsIGMpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZXggPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgc2VsZi50ciA9IGluc3BlY3QudHJhY2UoKQorCisjIGxpbmUgNDgKK2NsYXNzIE1hbG9kb3JvdXNQZXJ2ZXJ0KFN0dXBpZEdpdCk6CisgICAgcGFzcworCitjbGFzcyBQYXJyb3REcm9wcGluZ3M6CisgICAgcGFzcworCitjbGFzcyBGZXN0ZXJpbmdHb2IoTWFsb2Rvcm91c1BlcnZlcnQsIFBhcnJvdERyb3BwaW5ncyk6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2luc3BlY3RfZm9kZGVyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkMzE1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2luc3BlY3RfZm9kZGVyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkMzE1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2luc3BlY3RfZm9kZGVyMi5weSBiL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlcjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5NzhjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlcjIucHkKQEAgLTAsMCArMSw5OSBAQAorIyBsaW5lIDEKK2RlZiB3cmFwKGZvbz1Ob25lKToKKyAgICBkZWYgd3JhcHBlcihmdW5jKToKKyAgICAgICAgcmV0dXJuIGZ1bmMKKyAgICByZXR1cm4gd3JhcHBlcgorCisjIGxpbmUgNworZGVmIHJlcGxhY2UoZnVuYyk6CisgICAgZGVmIGluc3RlYWRmdW5jKCk6CisgICAgICAgIHByaW50ICdoZWxsbycKKyAgICByZXR1cm4gaW5zdGVhZGZ1bmMKKworIyBsaW5lIDEzCitAd3JhcCgpCitAd3JhcCh3cmFwKQorZGVmIHdyYXBwZWQoKToKKyAgICBwYXNzCisKKyMgbGluZSAxOQorQHJlcGxhY2UKK2RlZiBnb25lKCk6CisgICAgcGFzcworCisjIGxpbmUgMjQKK29sbCA9IGxhbWJkYSBtOiBtCisKKyMgbGluZSAyNwordGxsID0gbGFtYmRhIGc6IGcgYW5kIFwKK2cgYW5kIFwKK2cKKworIyBsaW5lIDMyCit0bGxpID0gbGFtYmRhIGQ6IGQgYW5kIFwKKyAgICBkCisKKyMgbGluZSAzNgorZGVmIG9uZWxpbmVmdW5jKCk6IHBhc3MKKworIyBsaW5lIDM5CitkZWYgbWFueWFyZ3MoYXJnMSwgYXJnMiwKK2FyZzMsIGFyZzQpOiBwYXNzCisKKyMgbGluZSA0MworZGVmIHR3b2xpbmVmdW5jKG0pOiByZXR1cm4gbSBhbmQgXAorbQorCisjIGxpbmUgNDcKK2EgPSBbTm9uZSwKKyAgICAgbGFtYmRhIHg6IHgsCisgICAgIE5vbmVdCisKKyMgbGluZSA1MgorZGVmIHNldGZ1bmMoZnVuYyk6CisgICAgZ2xvYmFscygpWyJhbm9ueW1vdXMiXSA9IGZ1bmMKK3NldGZ1bmMobGFtYmRhIHgsIHk6IHgqeSkKKworIyBsaW5lIDU3CitkZWYgd2l0aF9jb21tZW50KCk6ICAjIGhlbGxvCisgICAgd29ybGQKKworIyBsaW5lIDYxCittdWx0aWxpbmVfc2lnID0gWworICAgIGxhbWJkYSAoeCwKKyAgICAgICAgICAgIHkpOiB4K3ksCisgICAgTm9uZSwKKyAgICBdCisKKyMgbGluZSA2OAorZGVmIGZ1bmM2OSgpOgorICAgIGNsYXNzIGNsczcwOgorICAgICAgICBkZWYgZnVuYzcxKCk6CisgICAgICAgICAgICBwYXNzCisgICAgcmV0dXJuIGNsczcwCitleHRyYTc0ID0gNzQKKworIyBsaW5lIDc2CitkZWYgZnVuYzc3KCk6IHBhc3MKKyhleHRyYTc4LCBzdHVmZjc4KSA9ICd4eScKK2V4dHJhNzkgPSAnc3RvcCcKKworIyBsaW5lIDgxCitjbGFzcyBjbHM4MjoKKyAgICBkZWYgZnVuYzgzKCk6IHBhc3MKKyhleHRyYTg0LCBzdHVmZjg0KSA9ICd4eScKK2V4dHJhODUgPSAnc3RvcCcKKworIyBsaW5lIDg3CitkZWYgZnVuYzg4KCk6CisgICAgIyBjb21tZW50CisgICAgcmV0dXJuIDkwCisKKyMgbGluZSA5MgorZGVmIGYoKToKKyAgICBjbGFzcyBYOgorICAgICAgICBkZWYgZygpOgorICAgICAgICAgICAgImRvYyIKKyAgICAgICAgICAgIHJldHVybiA0MgorICAgIHJldHVybiBYCittZXRob2RfaW5fZHluYW1pY19jbGFzcyA9IGYoKS5nLmltX2Z1bmMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlcjIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L2luc3BlY3RfZm9kZGVyMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1ZDQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlcjIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlcjIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L2luc3BlY3RfZm9kZGVyMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1ZDQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlcjIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9rZXljZXJ0LnBlbSBiL2xpYi9weXRob24yLjcvdGVzdC9rZXljZXJ0LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDMxOGFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2tleWNlcnQucGVtCkBAIC0wLDAgKzEsMzEgQEAKKy0tLS0tQkVHSU4gUFJJVkFURSBLRVktLS0tLQorTUlJQ2R3SUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NBbUV3Z2dKZEFnRUFBb0dCQU50YjArWXJLdXhldkdwbQorTHJqYVVoWlNnejZ6RkFtdUdGbUttVWJkam1mdjl6U21tZHNRSWtzSysrakswQmU5TGVaeTIwajZhaE9mdVZhMAordWZFbVBvUDdGeTRoWGVnS1pSOWNDV2NJZS9BNkgyeFdGMUlJSkxSVExhVThvbC9JN1QrdW01SEQ1QXdBd05QUAorVVNOVTBFZWdtdnAreHhXdTNOWDJtMVZlb3Q4NUFnTUJBQUVDZ1lBM1pkWjY3M1gwb2V4RmxxN0FBbXJ1dGtIdAorQ0w3THZ3cnBPaWFCamh5VHhUZVNOV3p2dFFCa0lVOERPSTBiSWF6QTRVcmVBRmZmd3R2RXVQbW9uRGIzRitJcQorU01BdTQyWGNHeVZaRWwrZ0hsVFBVOVhSWDduVE9YVnQrTWxSUlJ4TDZ0OUdrR2ZVQVhJM1h4SkRYVzNjMHZCSworVUw5eHFEOGNPUlhPZkUwNnJRSkJBUDhtRVgxRVJrUjY0UHRzb2U0MjgxdmpUbE5mSWJzN05NUGtVbnJuOU4vWQorQkxoak5JZlEzSEZaRzhCVE1MZlg3a0NTOUQ1OTNEVzV0VjRaOUJQL2M2Y0NRUURjRnpDY1ZBck5oMkpTeXdPUQorWmZUZlJiSmcvWjVMdDlGa25ndjFtZWVHTlBnSU1MTjhTZzY3OXBBT09XbXpkTU8zVjcwNnJOUHpTVk1NRTdFNQorb1BJZkFrRUE4cERkZGFyUDV0Q3ZUVGdVcG1URmJha20wS29UWm0yK0Z6SGNuQTRqUmgrWE5UalRPdjk4WTZJaworZU81ZDFabktYc2VXdmtabmNRZ3hmZG5NcXFwajV3SkFjTnEvUlZuZTFEYllsd1djaFQyU2k2NU1ZbW1KOHQrRgorMG1jc1VMcWpPbkVNd2Y1ZStwdHE1THp3YnlySFpZcTVGTms3b2N1ZlB2L1pRcmNTU0MrY0Z3SkJBS3ZPSkJ5UworeDU2cXlHZVpMT1FsV1MySlMzS0pvNTlYdUxGR3FjYmdOOU9tOXhGYTQxWWI0TjlOdnBsRml2c3ZaZHczbTFRLworU1BJWFF1VDhSTVBEVk5RPQorLS0tLS1FTkQgUFJJVkFURSBLRVktLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDVkRDQ0FiMmdBd0lCQWdJSkFOZkhPQmtacjhKT01BMEdDU3FHU0liM0RRRUJCUVVBTUY4eEN6QUpCZ05WCitCQVlUQWxoWk1SY3dGUVlEVlFRSEV3NURZWE4wYkdVZ1FXNTBhSEpoZURFak1DRUdBMVVFQ2hNYVVIbDBhRzl1CitJRk52Wm5SM1lYSmxJRVp2ZFc1a1lYUnBiMjR4RWpBUUJnTlZCQU1UQ1d4dlkyRnNhRzl6ZERBZUZ3MHhNREV3CitNRGd5TXpBeE5UWmFGdzB5TURFd01EVXlNekF4TlRaYU1GOHhDekFKQmdOVkJBWVRBbGhaTVJjd0ZRWURWUVFICitFdzVEWVhOMGJHVWdRVzUwYUhKaGVERWpNQ0VHQTFVRUNoTWFVSGwwYUc5dUlGTnZablIzWVhKbElFWnZkVzVrCitZWFJwYjI0eEVqQVFCZ05WQkFNVENXeHZZMkZzYUc5emREQ0JuekFOQmdrcWhraUc5dzBCQVFFRkFBT0JqUUF3CitnWWtDZ1lFQTIxdlQ1aXNxN0Y2OGFtWXV1TnBTRmxLRFByTVVDYTRZV1lxWlJ0Mk9aKy8zTkthWjJ4QWlTd3I3Cis2TXJRRjcwdDVuTGJTUHBxRTUrNVZyUzU4U1krZy9zWExpRmQ2QXBsSDF3Slp3aDc4RG9mYkZZWFVnZ2t0Rk10CitwVHlpWDhqdFA2NmJrY1BrREFEQTA4OVJJMVRRUjZDYStuN0hGYTdjMWZhYlZWNmkzemtDQXdFQUFhTVlNQll3CitGQVlEVlIwUkJBMHdDNElKYkc5allXeG9iM04wTUEwR0NTcUdTSWIzRFFFQkJRVUFBNEdCQUhQY3RRQkVRNHdkCitCSjYrSmNwSXJhb3BMbjhCR2hiak5XajQwbW1ScVdCL05BV0Y2TTVuZTdLcEdBdTd0TGVHNGhiMXpMYWxkSzhHCitseHkyR1BTUkY2TEZTNDhkcEVqMkhiTXYybnZ2Nnh4YWxETUo5K0RpY1dnQUtUUTZiY1gyajNHVWtDUjBnL1QxCitDUmxOQkFBbHZoS3pPN0NscGY5bDBZS0JFZnJhSkJ5WAorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2xpc3RfdGVzdHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvbGlzdF90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQ2ZDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2xpc3RfdGVzdHMucHkKQEAgLTAsMCArMSw1MzQgQEAKKyIiIgorVGVzdHMgY29tbW9uIHRvIGxpc3QgYW5kIFVzZXJMaXN0LlVzZXJMaXN0CisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCBzZXFfdGVzdHMKKworY2xhc3MgQ29tbW9uVGVzdChzZXFfdGVzdHMuQ29tbW9uVGVzdCk6CisKKyAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgICAgICAjIEl0ZXJhYmxlIGFyZyBpcyBvcHRpb25hbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KFtdKSwgc2VsZi50eXBlMnRlc3QoKSkKKworICAgICAgICAjIEluaXQgY2xlYXJzIHByZXZpb3VzIHZhbHVlcworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzEsIDIsIDNdKQorICAgICAgICBhLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbXSkpCisKKyAgICAgICAgIyBJbml0IG92ZXJ3cml0ZXMgcHJldmlvdXMgdmFsdWVzCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMSwgMiwgM10pCisgICAgICAgIGEuX19pbml0X18oWzQsIDUsIDZdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFs0LCA1LCA2XSkpCisKKyAgICAgICAgIyBNdXRhYmxlcyBhbHdheXMgcmV0dXJuIGEgbmV3IG9iamVjdAorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChhKSwgaWQoYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIGwwID0gW10KKyAgICAgICAgbDIgPSBbMCwgMSwgMl0KKyAgICAgICAgYTAgPSBzZWxmLnR5cGUydGVzdChsMCkKKyAgICAgICAgYTIgPSBzZWxmLnR5cGUydGVzdChsMikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihhMCksIHN0cihsMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhMCksIHJlcHIobDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYTIpLCByZXByKGwyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYTIpLCAiWzAsIDEsIDJdIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEyKSwgIlswLCAxLCAyXSIpCisKKyAgICAgICAgYTIuYXBwZW5kKGEyKQorICAgICAgICBhMi5hcHBlbmQoMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYTIpLCAiWzAsIDEsIDIsIFsuLi5dLCAzXSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhMiksICJbMCwgMSwgMiwgWy4uLl0sIDNdIikKKworICAgICAgICBsMCA9IFtdCisgICAgICAgIGZvciBpIGluIHhyYW5nZShzeXMuZ2V0cmVjdXJzaW9ubGltaXQoKSArIDEwMCk6CisgICAgICAgICAgICBsMCA9IFtsMF0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCByZXByLCBsMCkKKworICAgIGRlZiB0ZXN0X3ByaW50KHNlbGYpOgorICAgICAgICBkID0gc2VsZi50eXBlMnRlc3QoeHJhbmdlKDIwMCkpCisgICAgICAgIGQuYXBwZW5kKGQpCisgICAgICAgIGQuZXh0ZW5kKHhyYW5nZSgyMDAsNDAwKSkKKyAgICAgICAgZC5hcHBlbmQoZCkKKyAgICAgICAgZC5hcHBlbmQoNDAwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikgYXMgZm86CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gZm8sIGQsCisgICAgICAgICAgICB3aXRoIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikgYXMgZm86CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby5yZWFkKCksIHJlcHIoZCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X3NldF9zdWJzY3JpcHQoc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChyYW5nZSgyMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEuX19zZXRpdGVtX18sIHNsaWNlKDAsIDEwLCAwKSwgWzEsMiwzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fc2V0aXRlbV9fLCBzbGljZSgwLCAxMCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEuX19zZXRpdGVtX18sIHNsaWNlKDAsIDEwLCAyKSwgWzEsMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX2dldGl0ZW1fXywgJ3gnLCAxKQorICAgICAgICBhW3NsaWNlKDIsMTAsMyldID0gWzEsMiwzXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFswLCAxLCAxLCAzLCA0LCAyLCA2LCA3LCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMTcsIDE4LCAxOV0pKQorCisgICAgZGVmIHRlc3RfcmV2ZXJzZWQoc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChyYW5nZSgyMCkpCisgICAgICAgIHIgPSByZXZlcnNlZChhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QociksIHNlbGYudHlwZTJ0ZXN0KHJhbmdlKDE5LCAtMSwgLTEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgci5uZXh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmV2ZXJzZWQoc2VsZi50eXBlMnRlc3QoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZTJ0ZXN0KCkpCisgICAgICAgICMgQnVnIDM2ODk6IG1ha2Ugc3VyZSBsaXN0LXJldmVyc2VkLWl0ZXJhdG9yIGRvZXNuJ3QgaGF2ZSBfX2xlbl9fCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGVuLCByZXZlcnNlZChbMSwyLDNdKSkKKworICAgIGRlZiB0ZXN0X3NldGl0ZW0oc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIGFbMF0gPSAwCisgICAgICAgIGFbMV0gPSAxMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMCwgMTAwXSkpCisgICAgICAgIGFbLTFdID0gMjAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzAsIDIwMF0pKQorICAgICAgICBhWy0yXSA9IDEwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFsxMDAsIDIwMF0pKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLl9fc2V0aXRlbV9fLCAtMywgMjAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLl9fc2V0aXRlbV9fLCAyLCAyMDApCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLl9fc2V0aXRlbV9fLCAwLCAyMDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEuX19zZXRpdGVtX18sIC0xLCAyMDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX3NldGl0ZW1fXykKKworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsMSwyLDMsNF0pCisgICAgICAgIGFbMExdID0gMQorICAgICAgICBhWzFMXSA9IDIKKyAgICAgICAgYVsyTF0gPSAzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzEsMiwzLDMsNF0pKQorICAgICAgICBhWzBdID0gNQorICAgICAgICBhWzFdID0gNgorICAgICAgICBhWzJdID0gNworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFs1LDYsNywzLDRdKSkKKyAgICAgICAgYVstMkxdID0gODgKKyAgICAgICAgYVstMUxdID0gOTkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbNSw2LDcsODgsOTldKSkKKyAgICAgICAgYVstMl0gPSA4CisgICAgICAgIGFbLTFdID0gOQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFs1LDYsNyw4LDldKSkKKworICAgIGRlZiB0ZXN0X2RlbGl0ZW0oc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIGRlbCBhWzFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgWzBdKQorICAgICAgICBkZWwgYVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFtdKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIGRlbCBhWy0yXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFsxXSkKKyAgICAgICAgZGVsIGFbLTFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgW10pCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5fX2RlbGl0ZW1fXywgLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEuX19kZWxpdGVtX18sIDIpCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLl9fZGVsaXRlbV9fLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX2RlbGl0ZW1fXykKKworICAgIGRlZiB0ZXN0X3NldHNsaWNlKHNlbGYpOgorICAgICAgICBsID0gWzAsIDFdCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChsKQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKC0zLCA0KToKKyAgICAgICAgICAgIGFbOmldID0gbFs6aV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgbCkKKyAgICAgICAgICAgIGEyID0gYVs6XQorICAgICAgICAgICAgYTJbOmldID0gYVs6aV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYTIsIGEpCisgICAgICAgICAgICBhW2k6XSA9IGxbaTpdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGwpCisgICAgICAgICAgICBhMiA9IGFbOl0KKyAgICAgICAgICAgIGEyW2k6XSA9IGFbaTpdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEyLCBhKQorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoLTMsIDQpOgorICAgICAgICAgICAgICAgIGFbaTpqXSA9IGxbaTpqXQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgbCkKKyAgICAgICAgICAgICAgICBhMiA9IGFbOl0KKyAgICAgICAgICAgICAgICBhMltpOmpdID0gYVtpOmpdCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMiwgYSkKKworICAgICAgICBhYTIgPSBhMls6XQorICAgICAgICBhYTJbOjBdID0gWy0yLCAtMV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYTIsIFstMiwgLTEsIDAsIDFdKQorICAgICAgICBhYTJbMDpdID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYTIsIFtdKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMSwgMiwgMywgNCwgNV0pCisgICAgICAgIGFbOi0xXSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMSwgMiwgMywgNCwgNSwgNV0pKQorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzEsIDIsIDMsIDQsIDVdKQorICAgICAgICBhWzE6XSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMSwgMSwgMiwgMywgNCwgNV0pKQorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzEsIDIsIDMsIDQsIDVdKQorICAgICAgICBhWzE6LTFdID0gYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFsxLCAxLCAyLCAzLCA0LCA1LCA1XSkpCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFtdKQorICAgICAgICBhWzpdID0gdHVwbGUocmFuZ2UoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KHJhbmdlKDEwKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fc2V0c2xpY2VfXywgMCwgMSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fc2V0aXRlbV9fLCBzbGljZSgwLCAxLCA1KSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19zZXRzbGljZV9fKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19zZXRpdGVtX18pCisKKyAgICBkZWYgdGVzdF9kZWxzbGljZShzZWxmKToKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgZGVsIGFbMToyXQorICAgICAgICBkZWwgYVswOjFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoW10pKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIGRlbCBhWzFMOjJMXQorICAgICAgICBkZWwgYVswTDoxTF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbXSkpCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgZGVsIGFbLTI6LTFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzFdKSkKKworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICBkZWwgYVstMkw6LTFMXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFsxXSkpCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgZGVsIGFbMTpdCisgICAgICAgIGRlbCBhWzoxXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFtdKSkKKworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICBkZWwgYVsxTDpdCisgICAgICAgIGRlbCBhWzoxTF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbXSkpCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgZGVsIGFbLTE6XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFswXSkpCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgZGVsIGFbLTFMOl0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMF0pKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIGRlbCBhWzpdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoW10pKQorCisgICAgZGVmIHRlc3RfYXBwZW5kKHNlbGYpOgorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoW10pCisgICAgICAgIGEuYXBwZW5kKDApCisgICAgICAgIGEuYXBwZW5kKDEpCisgICAgICAgIGEuYXBwZW5kKDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzAsIDEsIDJdKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuYXBwZW5kKQorCisgICAgZGVmIHRlc3RfZXh0ZW5kKHNlbGYpOgorICAgICAgICBhMSA9IHNlbGYudHlwZTJ0ZXN0KFswXSkKKyAgICAgICAgYTIgPSBzZWxmLnR5cGUydGVzdCgoMCwgMSkpCisgICAgICAgIGEgPSBhMVs6XQorICAgICAgICBhLmV4dGVuZChhMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhMSArIGEyKQorCisgICAgICAgIGEuZXh0ZW5kKHNlbGYudHlwZTJ0ZXN0KFtdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhMSArIGEyKQorCisgICAgICAgIGEuZXh0ZW5kKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzAsIDAsIDEsIDAsIDAsIDFdKSkKKworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoInNwYW0iKQorICAgICAgICBhLmV4dGVuZCgiZWdncyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgbGlzdCgic3BhbWVnZ3MiKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuZXh0ZW5kLCBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5leHRlbmQpCisKKyAgICBkZWYgdGVzdF9pbnNlcnQoc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMSwgMl0pCisgICAgICAgIGEuaW5zZXJ0KDAsIC0yKQorICAgICAgICBhLmluc2VydCgxLCAtMSkKKyAgICAgICAgYS5pbnNlcnQoMiwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbLTIsIC0xLCAwLCAwLCAxLCAyXSkKKworICAgICAgICBiID0gYVs6XQorICAgICAgICBiLmluc2VydCgtMiwgImZvbyIpCisgICAgICAgIGIuaW5zZXJ0KC0yMDAsICJsZWZ0IikKKyAgICAgICAgYi5pbnNlcnQoMjAwLCAicmlnaHQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIHNlbGYudHlwZTJ0ZXN0KFsibGVmdCIsLTIsLTEsMCwwLCJmb28iLDEsMiwicmlnaHQiXSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmluc2VydCkKKworICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFstMSwgMCwgMV0pCisgICAgICAgIGEucG9wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbLTEsIDBdKQorICAgICAgICBhLnBvcCgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5wb3AsIDUpCisgICAgICAgIGEucG9wKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEucG9wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEucG9wLCA0MiwgNDIpCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMTAsIDIwLCAzMCwgNDBdKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDAsIDFdKQorICAgICAgICBhLnJlbW92ZSgxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFswLCAwXSkKKyAgICAgICAgYS5yZW1vdmUoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbMF0pCisgICAgICAgIGEucmVtb3ZlKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgW10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5yZW1vdmUsIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLnJlbW92ZSkKKworICAgICAgICBjbGFzcyBCYWRFeGMoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBCYWRDbXA6CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBpZiBvdGhlciA9PSAyOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBCYWRFeGMoKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJhZEV4YywgYS5yZW1vdmUsIEJhZENtcCgpKQorCisgICAgICAgIGNsYXNzIEJhZENtcDI6CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBCYWRFeGMoKQorCisgICAgICAgIGQgPSBzZWxmLnR5cGUydGVzdCgnYWJjZGVmZ2hjaWonKQorICAgICAgICBkLnJlbW92ZSgnYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgc2VsZi50eXBlMnRlc3QoJ2FiZGVmZ2hjaWonKSkKKyAgICAgICAgZC5yZW1vdmUoJ2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHNlbGYudHlwZTJ0ZXN0KCdhYmRlZmdoaWonKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZC5yZW1vdmUsICdjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBzZWxmLnR5cGUydGVzdCgnYWJkZWZnaGlqJykpCisKKyAgICAgICAgIyBIYW5kbGUgY29tcGFyaXNvbiBlcnJvcnMKKyAgICAgICAgZCA9IHNlbGYudHlwZTJ0ZXN0KFsnYScsICdiJywgQmFkQ21wMigpLCAnYyddKQorICAgICAgICBlID0gc2VsZi50eXBlMnRlc3QoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQmFkRXhjLCBkLnJlbW92ZSwgJ2MnKQorICAgICAgICBmb3IgeCwgeSBpbiB6aXAoZCwgZSk6CisgICAgICAgICAgICAjIHZlcmlmeSB0aGF0IG9yaWdpbmFsIG9yZGVyIGFuZCB2YWx1ZXMgYXJlIHJldGFpbmVkLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh4LCB5KQorCisgICAgZGVmIHRlc3RfY291bnQoc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMSwgMl0pKjMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmNvdW50KDApLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuY291bnQoMSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5jb3VudCgzKSwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuY291bnQpCisKKyAgICAgICAgY2xhc3MgQmFkRXhjKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkQ21wOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgaWYgb3RoZXIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQmFkRXhjKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhCYWRFeGMsIGEuY291bnQsIEJhZENtcCgpKQorCisgICAgZGVmIHRlc3RfaW5kZXgoc2VsZik6CisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5pbmRleCgwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmluZGV4KDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1LmluZGV4LCAyKQorCisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdChbLTIsIC0xLCAwLCAwLCAxLCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmNvdW50KDApLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuaW5kZXgoMCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5pbmRleCgwLCAyKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmluZGV4KC0yLCAtMTApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuaW5kZXgoMCwgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5pbmRleCgwLCAzLCA0KSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdS5pbmRleCwgMiwgMCwgLTEwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdS5pbmRleCkKKworICAgICAgICBjbGFzcyBCYWRFeGMoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBCYWRDbXA6CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBpZiBvdGhlciA9PSAyOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBCYWRFeGMoKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJhZEV4YywgYS5pbmRleCwgQmFkQ21wKCkpCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFstMiwgLTEsIDAsIDAsIDEsIDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoMCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCgwLCAyKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmluZGV4KDAsIC00KSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmluZGV4KC0yLCAtMTApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoMCwgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCgwLCAtMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCgwLCAzLCA0KSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmluZGV4KDAsIC0zLCAtMiksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCgwLCAtNCpzeXMubWF4aW50LCA0KnN5cy5tYXhpbnQpLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLmluZGV4LCAwLCA0KnN5cy5tYXhpbnQsLTQqc3lzLm1heGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5pbmRleCwgMiwgMCwgLTEwKQorICAgICAgICBhLnJlbW92ZSgwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLmluZGV4LCAyLCAwLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFstMiwgLTEsIDAsIDEsIDJdKSkKKworICAgICAgICAjIFRlc3QgbW9kaWZ5aW5nIHRoZSBsaXN0IGR1cmluZyBpbmRleCdzIGl0ZXJhdGlvbgorICAgICAgICBjbGFzcyBFdmlsQ21wOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZpY3RpbSk6CisgICAgICAgICAgICAgICAgc2VsZi52aWN0aW0gPSB2aWN0aW0KKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnZpY3RpbVs6XQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoKQorICAgICAgICBhWzpdID0gW0V2aWxDbXAoYSkgZm9yIF8gaW4geHJhbmdlKDEwMCldCisgICAgICAgICMgVGhpcyB1c2VkIHRvIHNlZyBmYXVsdCBiZWZvcmUgcGF0Y2ggIzEwMDU3NzgKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5pbmRleCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JldmVyc2Uoc2VsZik6CisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdChbLTIsIC0xLCAwLCAxLCAyXSkKKyAgICAgICAgdTIgPSB1WzpdCisgICAgICAgIHUucmV2ZXJzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgWzIsIDEsIDAsIC0xLCAtMl0pCisgICAgICAgIHUucmV2ZXJzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgdTIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1LnJldmVyc2UsIDQyKQorCisgICAgZGVmIHRlc3Rfc29ydChzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICAgICAoInRoZSBjbXAgYXJndW1lbnQgaXMgbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9zb3J0KCkKKworICAgIGRlZiBfdGVzdF9zb3J0KHNlbGYpOgorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWzEsIDBdKQorICAgICAgICB1LnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIFswLCAxXSkKKworICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWzIsMSwwLC0xLC0yXSkKKyAgICAgICAgdS5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzZWxmLnR5cGUydGVzdChbLTIsLTEsMCwxLDJdKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUuc29ydCwgNDIsIDQyKQorCisgICAgICAgIGRlZiByZXZjbXAoYSwgYik6CisgICAgICAgICAgICByZXR1cm4gY21wKGIsIGEpCisgICAgICAgIHUuc29ydChyZXZjbXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgc2VsZi50eXBlMnRlc3QoWzIsMSwwLC0xLC0yXSkpCisKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIGR1bXBzIGNvcmUgaW4gdW5wYXRjaGVkIFB5dGhvbiAxLjU6CisgICAgICAgIGRlZiBteUNvbXBhcmlzb24oeCx5KToKKyAgICAgICAgICAgIHJldHVybiBjbXAoeCUzLCB5JTcpCisgICAgICAgIHogPSBzZWxmLnR5cGUydGVzdChyYW5nZSgxMikpCisgICAgICAgIHouc29ydChteUNvbXBhcmlzb24pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB6LnNvcnQsIDIpCisKKyAgICAgICAgZGVmIHNlbGZtb2RpZnlpbmdDb21wYXJpc29uKHgseSk6CisgICAgICAgICAgICB6LmFwcGVuZCgxKQorICAgICAgICAgICAgcmV0dXJuIGNtcCh4LCB5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB6LnNvcnQsIHNlbGZtb2RpZnlpbmdDb21wYXJpc29uKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgei5zb3J0LCBsYW1iZGEgeCwgeTogJ3MnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgei5zb3J0LCA0MiwgNDIsIDQyLCA0MikKKworICAgIGRlZiB0ZXN0X3NsaWNlKHNlbGYpOgorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoInNwYW0iKQorICAgICAgICB1WzoyXSA9ICJoIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIGxpc3QoImhhbSIpKQorCisgICAgZGVmIHRlc3RfaWFkZChzZWxmKToKKyAgICAgICAgc3VwZXIoQ29tbW9uVGVzdCwgc2VsZikudGVzdF9pYWRkKCkKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgdTIgPSB1CisgICAgICAgIHUgKz0gWzIsIDNdCisgICAgICAgIHNlbGYuYXNzZXJ0SXModSwgdTIpCisKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KCJzcGFtIikKKyAgICAgICAgdSArPSAiZWdncyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzZWxmLnR5cGUydGVzdCgic3BhbWVnZ3MiKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUuX19pYWRkX18sIE5vbmUpCisKKyAgICBkZWYgdGVzdF9pbXVsKHNlbGYpOgorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICB1ICo9IDMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzZWxmLnR5cGUydGVzdChbMCwgMSwgMCwgMSwgMCwgMV0pKQorICAgICAgICB1ICo9IDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzZWxmLnR5cGUydGVzdChbXSkpCisgICAgICAgIHMgPSBzZWxmLnR5cGUydGVzdChbXSkKKyAgICAgICAgb2xkaWQgPSBpZChzKQorICAgICAgICBzICo9IDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQocyksIG9sZGlkKQorCisgICAgZGVmIHRlc3RfZXh0ZW5kZWRzbGljaW5nKHNlbGYpOgorICAgICAgICAjICBzdWJzY3JpcHQKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLDEsMiwzLDRdKQorCisgICAgICAgICMgIGRlbGV0aW9uCisgICAgICAgIGRlbCBhWzo6Ml0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMSwzXSkpCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChyYW5nZSg1KSkKKyAgICAgICAgZGVsIGFbMTo6Ml0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMCwyLDRdKSkKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KHJhbmdlKDUpKQorICAgICAgICBkZWwgYVsxOjotMl0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMCwyLDMsNF0pKQorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QocmFuZ2UoMTApKQorICAgICAgICBkZWwgYVs6OjEwMDBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldKSkKKyAgICAgICAgIyAgYXNzaWdubWVudAorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QocmFuZ2UoMTApKQorICAgICAgICBhWzo6Ml0gPSBbLTFdKjUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbLTEsIDEsIC0xLCAzLCAtMSwgNSwgLTEsIDcsIC0xLCA5XSkpCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChyYW5nZSgxMCkpCisgICAgICAgIGFbOjotNF0gPSBbMTBdKjMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMCwgMTAsIDIsIDMsIDQsIDEwLCA2LCA3LCA4ICwxMF0pKQorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QocmFuZ2UoNCkpCisgICAgICAgIGFbOjotMV0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzMsIDIsIDEsIDBdKSkKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KHJhbmdlKDEwKSkKKyAgICAgICAgYiA9IGFbOl0KKyAgICAgICAgYyA9IGFbOl0KKyAgICAgICAgYVsyOjNdID0gc2VsZi50eXBlMnRlc3QoWyJ0d28iLCAiZWxlbWVudHMiXSkKKyAgICAgICAgYltzbGljZSgyLDMpXSA9IHNlbGYudHlwZTJ0ZXN0KFsidHdvIiwgImVsZW1lbnRzIl0pCisgICAgICAgIGNbMjozOl0gPSBzZWxmLnR5cGUydGVzdChbInR3byIsICJlbGVtZW50cyJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYykKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KHJhbmdlKDEwKSkKKyAgICAgICAgYVs6OjJdID0gdHVwbGUocmFuZ2UoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzAsIDEsIDEsIDMsIDIsIDUsIDMsIDcsIDQsIDldKSkKKyAgICAgICAgIyB0ZXN0IGlzc3VlNzc4OAorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QocmFuZ2UoMTApKQorICAgICAgICBkZWwgYVs5OjoxPDwzMzNdCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3Rvcl9leGNlcHRpb25faGFuZGxpbmcoc2VsZik6CisgICAgICAgICMgQnVnICMxMjQyNjU3CisgICAgICAgIGNsYXNzIEYob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlib2FyZEludGVycnVwdCwgbGlzdCwgRigpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2xpc3RfdGVzdHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L2xpc3RfdGVzdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjNmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvbGlzdF90ZXN0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2xpc3RfdGVzdHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L2xpc3RfdGVzdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MjNmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvbGlzdF90ZXN0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2xvY2tfdGVzdHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvbG9ja190ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjZmOWJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2xvY2tfdGVzdHMucHkKQEAgLTAsMCArMSw1NDYgQEAKKyIiIgorVmFyaW91cyB0ZXN0cyBmb3Igc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMuCisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2Zyb20gdGhyZWFkIGltcG9ydCBzdGFydF9uZXdfdGhyZWFkLCBnZXRfaWRlbnQKK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0CisKKworZGVmIF93YWl0KCk6CisgICAgIyBBIGNydWRlIHdhaXQveWllbGQgZnVuY3Rpb24gbm90IHJlbHlpbmcgb24gc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMuCisgICAgdGltZS5zbGVlcCgwLjAxKQorCitjbGFzcyBCdW5jaChvYmplY3QpOgorICAgICIiIgorICAgIEEgYnVuY2ggb2YgdGhyZWFkcy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZiwgbiwgd2FpdF9iZWZvcmVfZXhpdD1GYWxzZSk6CisgICAgICAgICIiIgorICAgICAgICBDb25zdHJ1Y3QgYSBidW5jaCBvZiBgbmAgdGhyZWFkcyBydW5uaW5nIHRoZSBzYW1lIGZ1bmN0aW9uIGBmYC4KKyAgICAgICAgSWYgYHdhaXRfYmVmb3JlX2V4aXRgIGlzIFRydWUsIHRoZSB0aHJlYWRzIHdvbid0IHRlcm1pbmF0ZSB1bnRpbAorICAgICAgICBkb19maW5pc2goKSBpcyBjYWxsZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmYgPSBmCisgICAgICAgIHNlbGYubiA9IG4KKyAgICAgICAgc2VsZi5zdGFydGVkID0gW10KKyAgICAgICAgc2VsZi5maW5pc2hlZCA9IFtdCisgICAgICAgIHNlbGYuX2Nhbl9leGl0ID0gbm90IHdhaXRfYmVmb3JlX2V4aXQKKyAgICAgICAgZGVmIHRhc2soKToKKyAgICAgICAgICAgIHRpZCA9IGdldF9pZGVudCgpCisgICAgICAgICAgICBzZWxmLnN0YXJ0ZWQuYXBwZW5kKHRpZCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2VsZi5maW5pc2hlZC5hcHBlbmQodGlkKQorICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLl9jYW5fZXhpdDoKKyAgICAgICAgICAgICAgICAgICAgX3dhaXQoKQorICAgICAgICBmb3IgaSBpbiByYW5nZShuKToKKyAgICAgICAgICAgIHN0YXJ0X25ld190aHJlYWQodGFzaywgKCkpCisKKyAgICBkZWYgd2FpdF9mb3Jfc3RhcnRlZChzZWxmKToKKyAgICAgICAgd2hpbGUgbGVuKHNlbGYuc3RhcnRlZCkgPCBzZWxmLm46CisgICAgICAgICAgICBfd2FpdCgpCisKKyAgICBkZWYgd2FpdF9mb3JfZmluaXNoZWQoc2VsZik6CisgICAgICAgIHdoaWxlIGxlbihzZWxmLmZpbmlzaGVkKSA8IHNlbGYubjoKKyAgICAgICAgICAgIF93YWl0KCkKKworICAgIGRlZiBkb19maW5pc2goc2VsZik6CisgICAgICAgIHNlbGYuX2Nhbl9leGl0ID0gVHJ1ZQorCisKK2NsYXNzIEJhc2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl90aHJlYWRzID0gc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzdXBwb3J0LnRocmVhZGluZ19jbGVhbnVwKCpzZWxmLl90aHJlYWRzKQorICAgICAgICBzdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQorCisKK2NsYXNzIEJhc2VMb2NrVGVzdHMoQmFzZVRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0cyBmb3IgYm90aCByZWN1cnNpdmUgYW5kIG5vbi1yZWN1cnNpdmUgbG9ja3MuCisgICAgIiIiCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgbG9jayA9IHNlbGYubG9ja3R5cGUoKQorICAgICAgICBkZWwgbG9jaworCisgICAgZGVmIHRlc3RfYWNxdWlyZV9kZXN0cm95KHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIGRlbCBsb2NrCisKKyAgICBkZWYgdGVzdF9hY3F1aXJlX3JlbGVhc2Uoc2VsZik6CisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgbG9jay5yZWxlYXNlKCkKKyAgICAgICAgZGVsIGxvY2sKKworICAgIGRlZiB0ZXN0X3RyeV9hY3F1aXJlKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2NrLmFjcXVpcmUoRmFsc2UpKQorICAgICAgICBsb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIHRlc3RfdHJ5X2FjcXVpcmVfY29udGVuZGVkKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxvY2suYWNxdWlyZShGYWxzZSkpCisgICAgICAgIEJ1bmNoKGYsIDEpLndhaXRfZm9yX2ZpbmlzaGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHRbMF0pCisgICAgICAgIGxvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgdGVzdF9hY3F1aXJlX2NvbnRlbmRlZChzZWxmKToKKyAgICAgICAgbG9jayA9IHNlbGYubG9ja3R5cGUoKQorICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICBOID0gNQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpCisKKyAgICAgICAgYiA9IEJ1bmNoKGYsIE4pCisgICAgICAgIGIud2FpdF9mb3Jfc3RhcnRlZCgpCisgICAgICAgIF93YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYi5maW5pc2hlZCksIDApCisgICAgICAgIGxvY2sucmVsZWFzZSgpCisgICAgICAgIGIud2FpdF9mb3JfZmluaXNoZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiLmZpbmlzaGVkKSwgTikKKworICAgIGRlZiB0ZXN0X3dpdGgoc2VsZik6CisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICBkZWYgX3dpdGgoZXJyPU5vbmUpOgorICAgICAgICAgICAgd2l0aCBsb2NrOgorICAgICAgICAgICAgICAgIGlmIGVyciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyCisgICAgICAgIF93aXRoKCkKKyAgICAgICAgIyBDaGVjayB0aGUgbG9jayBpcyB1bmFjcXVpcmVkCisgICAgICAgIEJ1bmNoKGYsIDEpLndhaXRfZm9yX2ZpbmlzaGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBfd2l0aCwgVHlwZUVycm9yKQorICAgICAgICAjIENoZWNrIHRoZSBsb2NrIGlzIHVuYWNxdWlyZWQKKyAgICAgICAgQnVuY2goZiwgMSkud2FpdF9mb3JfZmluaXNoZWQoKQorCisgICAgZGVmIHRlc3RfdGhyZWFkX2xlYWsoc2VsZik6CisgICAgICAgICMgVGhlIGxvY2sgc2hvdWxkbid0IGxlYWsgYSBUaHJlYWQgaW5zdGFuY2Ugd2hlbiB1c2VkIGZyb20gYSBmb3JlaWduCisgICAgICAgICMgKG5vbi10aHJlYWRpbmcpIHRocmVhZC4KKyAgICAgICAgbG9jayA9IHNlbGYubG9ja3R5cGUoKQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpCisgICAgICAgIG4gPSBsZW4odGhyZWFkaW5nLmVudW1lcmF0ZSgpKQorICAgICAgICAjIFdlIHJ1biBtYW55IHRocmVhZHMgaW4gdGhlIGhvcGUgdGhhdCBleGlzdGluZyB0aHJlYWRzIGlkcyB3b24ndAorICAgICAgICAjIGJlIHJlY3ljbGVkLgorICAgICAgICBCdW5jaChmLCAxNSkud2FpdF9mb3JfZmluaXNoZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4sIGxlbih0aHJlYWRpbmcuZW51bWVyYXRlKCkpKQorCisKK2NsYXNzIExvY2tUZXN0cyhCYXNlTG9ja1Rlc3RzKToKKyAgICAiIiIKKyAgICBUZXN0cyBmb3Igbm9uLXJlY3Vyc2l2ZSwgd2VhayBsb2NrcworICAgICh3aGljaCBjYW4gYmUgYWNxdWlyZWQgYW5kIHJlbGVhc2VkIGZyb20gZGlmZmVyZW50IHRocmVhZHMpLgorICAgICIiIgorICAgIGRlZiB0ZXN0X3JlYWNxdWlyZShzZWxmKToKKyAgICAgICAgIyBMb2NrIG5lZWRzIHRvIGJlIHJlbGVhc2VkIGJlZm9yZSByZS1hY3F1aXJpbmcuCisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgcGhhc2UgPSBbXQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgIHBoYXNlLmFwcGVuZChOb25lKQorICAgICAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgIHBoYXNlLmFwcGVuZChOb25lKQorICAgICAgICBzdGFydF9uZXdfdGhyZWFkKGYsICgpKQorICAgICAgICB3aGlsZSBsZW4ocGhhc2UpID09IDA6CisgICAgICAgICAgICBfd2FpdCgpCisgICAgICAgIF93YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGhhc2UpLCAxKQorICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICB3aGlsZSBsZW4ocGhhc2UpID09IDE6CisgICAgICAgICAgICBfd2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBoYXNlKSwgMikKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVudF90aHJlYWQoc2VsZik6CisgICAgICAgICMgTG9jayBjYW4gYmUgcmVsZWFzZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQuCisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpCisgICAgICAgIGIgPSBCdW5jaChmLCAxKQorICAgICAgICBiLndhaXRfZm9yX2ZpbmlzaGVkKCkKKyAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgbG9jay5yZWxlYXNlKCkKKworCitjbGFzcyBSTG9ja1Rlc3RzKEJhc2VMb2NrVGVzdHMpOgorICAgICIiIgorICAgIFRlc3RzIGZvciByZWN1cnNpdmUgbG9ja3MuCisgICAgIiIiCisgICAgZGVmIHRlc3RfcmVhY3F1aXJlKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIGxvY2sucmVsZWFzZSgpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIGxvY2sucmVsZWFzZSgpCisgICAgICAgIGxvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgdGVzdF9yZWxlYXNlX3VuYWNxdWlyZWQoc2VsZik6CisgICAgICAgICMgQ2Fubm90IHJlbGVhc2UgYW4gdW5hY3F1aXJlZCBsb2NrCisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBsb2NrLnJlbGVhc2UpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIGxvY2sucmVsZWFzZSgpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIGxvY2sucmVsZWFzZSgpCisgICAgICAgIGxvY2sucmVsZWFzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgbG9jay5yZWxlYXNlKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW50X3RocmVhZChzZWxmKToKKyAgICAgICAgIyBDYW5ub3QgcmVsZWFzZSBmcm9tIGEgZGlmZmVyZW50IHRocmVhZAorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICBiID0gQnVuY2goZiwgMSwgVHJ1ZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBsb2NrLnJlbGVhc2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBiLmRvX2ZpbmlzaCgpCisKKyAgICBkZWYgdGVzdF9faXNfb3duZWQoc2VsZik6CisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsb2NrLl9pc19vd25lZCgpKQorICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobG9jay5faXNfb3duZWQoKSkKKyAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvY2suX2lzX293bmVkKCkpCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxvY2suX2lzX293bmVkKCkpCisgICAgICAgIEJ1bmNoKGYsIDEpLndhaXRfZm9yX2ZpbmlzaGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHRbMF0pCisgICAgICAgIGxvY2sucmVsZWFzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2NrLl9pc19vd25lZCgpKQorICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxvY2suX2lzX293bmVkKCkpCisKKworY2xhc3MgRXZlbnRUZXN0cyhCYXNlVGVzdENhc2UpOgorICAgICIiIgorICAgIFRlc3RzIGZvciBFdmVudCBvYmplY3RzLgorICAgICIiIgorCisgICAgZGVmIHRlc3RfaXNfc2V0KHNlbGYpOgorICAgICAgICBldnQgPSBzZWxmLmV2ZW50dHlwZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZXZ0LmlzX3NldCgpKQorICAgICAgICBldnQuc2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2dC5pc19zZXQoKSkKKyAgICAgICAgZXZ0LnNldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldnQuaXNfc2V0KCkpCisgICAgICAgIGV2dC5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZXZ0LmlzX3NldCgpKQorICAgICAgICBldnQuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGV2dC5pc19zZXQoKSkKKworICAgIGRlZiBfY2hlY2tfbm90aWZ5KHNlbGYsIGV2dCk6CisgICAgICAgICMgQWxsIHRocmVhZHMgZ2V0IG5vdGlmaWVkCisgICAgICAgIE4gPSA1CisgICAgICAgIHJlc3VsdHMxID0gW10KKyAgICAgICAgcmVzdWx0czIgPSBbXQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcmVzdWx0czEuYXBwZW5kKGV2dC53YWl0KCkpCisgICAgICAgICAgICByZXN1bHRzMi5hcHBlbmQoZXZ0LndhaXQoKSkKKyAgICAgICAgYiA9IEJ1bmNoKGYsIE4pCisgICAgICAgIGIud2FpdF9mb3Jfc3RhcnRlZCgpCisgICAgICAgIF93YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0czEpLCAwKQorICAgICAgICBldnQuc2V0KCkKKyAgICAgICAgYi53YWl0X2Zvcl9maW5pc2hlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0czEsIFtUcnVlXSAqIE4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0czIsIFtUcnVlXSAqIE4pCisKKyAgICBkZWYgdGVzdF9ub3RpZnkoc2VsZik6CisgICAgICAgIGV2dCA9IHNlbGYuZXZlbnR0eXBlKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfbm90aWZ5KGV2dCkKKyAgICAgICAgIyBBbm90aGVyIHRpbWUsIGFmdGVyIGFuIGV4cGxpY2l0IGNsZWFyKCkKKyAgICAgICAgZXZ0LnNldCgpCisgICAgICAgIGV2dC5jbGVhcigpCisgICAgICAgIHNlbGYuX2NoZWNrX25vdGlmeShldnQpCisKKyAgICBkZWYgdGVzdF90aW1lb3V0KHNlbGYpOgorICAgICAgICBldnQgPSBzZWxmLmV2ZW50dHlwZSgpCisgICAgICAgIHJlc3VsdHMxID0gW10KKyAgICAgICAgcmVzdWx0czIgPSBbXQorICAgICAgICBOID0gNQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcmVzdWx0czEuYXBwZW5kKGV2dC53YWl0KDAuMCkpCisgICAgICAgICAgICB0MSA9IHRpbWUudGltZSgpCisgICAgICAgICAgICByID0gZXZ0LndhaXQoMC4yKQorICAgICAgICAgICAgdDIgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgcmVzdWx0czIuYXBwZW5kKChyLCB0MiAtIHQxKSkKKyAgICAgICAgQnVuY2goZiwgTikud2FpdF9mb3JfZmluaXNoZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMxLCBbRmFsc2VdICogTikKKyAgICAgICAgZm9yIHIsIGR0IGluIHJlc3VsdHMyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGR0ID49IDAuMiwgZHQpCisgICAgICAgICMgVGhlIGV2ZW50IGlzIHNldAorICAgICAgICByZXN1bHRzMSA9IFtdCisgICAgICAgIHJlc3VsdHMyID0gW10KKyAgICAgICAgZXZ0LnNldCgpCisgICAgICAgIEJ1bmNoKGYsIE4pLndhaXRfZm9yX2ZpbmlzaGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzMSwgW1RydWVdICogTikKKyAgICAgICAgZm9yIHIsIGR0IGluIHJlc3VsdHMyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIpCisKKworY2xhc3MgQ29uZGl0aW9uVGVzdHMoQmFzZVRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0cyBmb3IgY29uZGl0aW9uIHZhcmlhYmxlcy4KKyAgICAiIiIKKworICAgIGRlZiB0ZXN0X2FjcXVpcmUoc2VsZik6CisgICAgICAgIGNvbmQgPSBzZWxmLmNvbmR0eXBlKCkKKyAgICAgICAgIyBCZSBkZWZhdWx0IHdlIGhhdmUgYW4gUkxvY2s6IHRoZSBjb25kaXRpb24gY2FuIGJlIGFjcXVpcmVkIG11bHRpcGxlCisgICAgICAgICMgdGltZXMuCisgICAgICAgIGNvbmQuYWNxdWlyZSgpCisgICAgICAgIGNvbmQuYWNxdWlyZSgpCisgICAgICAgIGNvbmQucmVsZWFzZSgpCisgICAgICAgIGNvbmQucmVsZWFzZSgpCisgICAgICAgIGxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIGNvbmQgPSBzZWxmLmNvbmR0eXBlKGxvY2spCisgICAgICAgIGNvbmQuYWNxdWlyZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9jay5hY3F1aXJlKEZhbHNlKSkKKyAgICAgICAgY29uZC5yZWxlYXNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvY2suYWNxdWlyZShGYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY29uZC5hY3F1aXJlKEZhbHNlKSkKKyAgICAgICAgbG9jay5yZWxlYXNlKCkKKyAgICAgICAgd2l0aCBjb25kOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsb2NrLmFjcXVpcmUoRmFsc2UpKQorCisgICAgZGVmIHRlc3RfdW5hY3F1aXJlZF93YWl0KHNlbGYpOgorICAgICAgICBjb25kID0gc2VsZi5jb25kdHlwZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY29uZC53YWl0KQorCisgICAgZGVmIHRlc3RfdW5hY3F1aXJlZF9ub3RpZnkoc2VsZik6CisgICAgICAgIGNvbmQgPSBzZWxmLmNvbmR0eXBlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjb25kLm5vdGlmeSkKKworICAgIGRlZiBfY2hlY2tfbm90aWZ5KHNlbGYsIGNvbmQpOgorICAgICAgICBOID0gNQorICAgICAgICByZXN1bHRzMSA9IFtdCisgICAgICAgIHJlc3VsdHMyID0gW10KKyAgICAgICAgcGhhc2VfbnVtID0gMAorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgY29uZC5hY3F1aXJlKCkKKyAgICAgICAgICAgIGNvbmQud2FpdCgpCisgICAgICAgICAgICBjb25kLnJlbGVhc2UoKQorICAgICAgICAgICAgcmVzdWx0czEuYXBwZW5kKHBoYXNlX251bSkKKyAgICAgICAgICAgIGNvbmQuYWNxdWlyZSgpCisgICAgICAgICAgICBjb25kLndhaXQoKQorICAgICAgICAgICAgY29uZC5yZWxlYXNlKCkKKyAgICAgICAgICAgIHJlc3VsdHMyLmFwcGVuZChwaGFzZV9udW0pCisgICAgICAgIGIgPSBCdW5jaChmLCBOKQorICAgICAgICBiLndhaXRfZm9yX3N0YXJ0ZWQoKQorICAgICAgICBfd2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0czEsIFtdKQorICAgICAgICAjIE5vdGlmeSAzIHRocmVhZHMgYXQgZmlyc3QKKyAgICAgICAgY29uZC5hY3F1aXJlKCkKKyAgICAgICAgY29uZC5ub3RpZnkoMykKKyAgICAgICAgX3dhaXQoKQorICAgICAgICBwaGFzZV9udW0gPSAxCisgICAgICAgIGNvbmQucmVsZWFzZSgpCisgICAgICAgIHdoaWxlIGxlbihyZXN1bHRzMSkgPCAzOgorICAgICAgICAgICAgX3dhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMxLCBbMV0gKiAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMyLCBbXSkKKyAgICAgICAgIyBOb3RpZnkgNSB0aHJlYWRzOiB0aGV5IG1pZ2h0IGJlIGluIHRoZWlyIGZpcnN0IG9yIHNlY29uZCB3YWl0CisgICAgICAgIGNvbmQuYWNxdWlyZSgpCisgICAgICAgIGNvbmQubm90aWZ5KDUpCisgICAgICAgIF93YWl0KCkKKyAgICAgICAgcGhhc2VfbnVtID0gMgorICAgICAgICBjb25kLnJlbGVhc2UoKQorICAgICAgICB3aGlsZSBsZW4ocmVzdWx0czEpICsgbGVuKHJlc3VsdHMyKSA8IDg6CisgICAgICAgICAgICBfd2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0czEsIFsxXSAqIDMgKyBbMl0gKiAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMyLCBbMl0gKiAzKQorICAgICAgICAjIE5vdGlmeSBhbGwgdGhyZWFkczogdGhleSBhcmUgYWxsIGluIHRoZWlyIHNlY29uZCB3YWl0CisgICAgICAgIGNvbmQuYWNxdWlyZSgpCisgICAgICAgIGNvbmQubm90aWZ5X2FsbCgpCisgICAgICAgIF93YWl0KCkKKyAgICAgICAgcGhhc2VfbnVtID0gMworICAgICAgICBjb25kLnJlbGVhc2UoKQorICAgICAgICB3aGlsZSBsZW4ocmVzdWx0czIpIDwgNToKKyAgICAgICAgICAgIF93YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzMSwgWzFdICogMyArIFsyXSAqIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0czIsIFsyXSAqIDMgKyBbM10gKiAyKQorICAgICAgICBiLndhaXRfZm9yX2ZpbmlzaGVkKCkKKworICAgIGRlZiB0ZXN0X25vdGlmeShzZWxmKToKKyAgICAgICAgY29uZCA9IHNlbGYuY29uZHR5cGUoKQorICAgICAgICBzZWxmLl9jaGVja19ub3RpZnkoY29uZCkKKyAgICAgICAgIyBBIHNlY29uZCB0aW1lLCB0byBjaGVjayBpbnRlcm5hbCBzdGF0ZSBpcyBzdGlsbCBvay4KKyAgICAgICAgc2VsZi5fY2hlY2tfbm90aWZ5KGNvbmQpCisKKyAgICBkZWYgdGVzdF90aW1lb3V0KHNlbGYpOgorICAgICAgICBjb25kID0gc2VsZi5jb25kdHlwZSgpCisgICAgICAgIHJlc3VsdHMgPSBbXQorICAgICAgICBOID0gNQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgY29uZC5hY3F1aXJlKCkKKyAgICAgICAgICAgIHQxID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIGNvbmQud2FpdCgwLjIpCisgICAgICAgICAgICB0MiA9IHRpbWUudGltZSgpCisgICAgICAgICAgICBjb25kLnJlbGVhc2UoKQorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQodDIgLSB0MSkKKyAgICAgICAgQnVuY2goZiwgTikud2FpdF9mb3JfZmluaXNoZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHRzKSwgNSkKKyAgICAgICAgZm9yIGR0IGluIHJlc3VsdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZHQgPj0gMC4yLCBkdCkKKworCitjbGFzcyBCYXNlU2VtYXBob3JlVGVzdHMoQmFzZVRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBDb21tb24gdGVzdHMgZm9yIHtib3VuZGVkLCB1bmJvdW5kZWR9IHNlbWFwaG9yZSBvYmplY3RzLgorICAgICIiIgorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuc2VtdHlwZSwgdmFsdWUgPSAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5zZW10eXBlLCB2YWx1ZSA9IC1zeXMubWF4aW50KQorCisgICAgZGVmIHRlc3RfYWNxdWlyZShzZWxmKToKKyAgICAgICAgc2VtID0gc2VsZi5zZW10eXBlKDEpCisgICAgICAgIHNlbS5hY3F1aXJlKCkKKyAgICAgICAgc2VtLnJlbGVhc2UoKQorICAgICAgICBzZW0gPSBzZWxmLnNlbXR5cGUoMikKKyAgICAgICAgc2VtLmFjcXVpcmUoKQorICAgICAgICBzZW0uYWNxdWlyZSgpCisgICAgICAgIHNlbS5yZWxlYXNlKCkKKyAgICAgICAgc2VtLnJlbGVhc2UoKQorCisgICAgZGVmIHRlc3RfYWNxdWlyZV9kZXN0cm95KHNlbGYpOgorICAgICAgICBzZW0gPSBzZWxmLnNlbXR5cGUoKQorICAgICAgICBzZW0uYWNxdWlyZSgpCisgICAgICAgIGRlbCBzZW0KKworICAgIGRlZiB0ZXN0X2FjcXVpcmVfY29udGVuZGVkKHNlbGYpOgorICAgICAgICBzZW0gPSBzZWxmLnNlbXR5cGUoNykKKyAgICAgICAgc2VtLmFjcXVpcmUoKQorICAgICAgICBOID0gMTAKKyAgICAgICAgcmVzdWx0czEgPSBbXQorICAgICAgICByZXN1bHRzMiA9IFtdCisgICAgICAgIHBoYXNlX251bSA9IDAKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIHNlbS5hY3F1aXJlKCkKKyAgICAgICAgICAgIHJlc3VsdHMxLmFwcGVuZChwaGFzZV9udW0pCisgICAgICAgICAgICBzZW0uYWNxdWlyZSgpCisgICAgICAgICAgICByZXN1bHRzMi5hcHBlbmQocGhhc2VfbnVtKQorICAgICAgICBiID0gQnVuY2goZiwgMTApCisgICAgICAgIGIud2FpdF9mb3Jfc3RhcnRlZCgpCisgICAgICAgIHdoaWxlIGxlbihyZXN1bHRzMSkgKyBsZW4ocmVzdWx0czIpIDwgNjoKKyAgICAgICAgICAgIF93YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzMSArIHJlc3VsdHMyLCBbMF0gKiA2KQorICAgICAgICBwaGFzZV9udW0gPSAxCisgICAgICAgIGZvciBpIGluIHJhbmdlKDcpOgorICAgICAgICAgICAgc2VtLnJlbGVhc2UoKQorICAgICAgICB3aGlsZSBsZW4ocmVzdWx0czEpICsgbGVuKHJlc3VsdHMyKSA8IDEzOgorICAgICAgICAgICAgX3dhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChyZXN1bHRzMSArIHJlc3VsdHMyKSwgWzBdICogNiArIFsxXSAqIDcpCisgICAgICAgIHBoYXNlX251bSA9IDIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNik6CisgICAgICAgICAgICBzZW0ucmVsZWFzZSgpCisgICAgICAgIHdoaWxlIGxlbihyZXN1bHRzMSkgKyBsZW4ocmVzdWx0czIpIDwgMTk6CisgICAgICAgICAgICBfd2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHJlc3VsdHMxICsgcmVzdWx0czIpLCBbMF0gKiA2ICsgWzFdICogNyArIFsyXSAqIDYpCisgICAgICAgICMgVGhlIHNlbWFwaG9yZSBpcyBzdGlsbCBsb2NrZWQKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZW0uYWNxdWlyZShGYWxzZSkpCisgICAgICAgICMgRmluYWwgcmVsZWFzZSwgdG8gbGV0IHRoZSBsYXN0IHRocmVhZCBmaW5pc2gKKyAgICAgICAgc2VtLnJlbGVhc2UoKQorICAgICAgICBiLndhaXRfZm9yX2ZpbmlzaGVkKCkKKworICAgIGRlZiB0ZXN0X3RyeV9hY3F1aXJlKHNlbGYpOgorICAgICAgICBzZW0gPSBzZWxmLnNlbXR5cGUoMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbS5hY3F1aXJlKEZhbHNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbS5hY3F1aXJlKEZhbHNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZW0uYWNxdWlyZShGYWxzZSkpCisgICAgICAgIHNlbS5yZWxlYXNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbS5hY3F1aXJlKEZhbHNlKSkKKworICAgIGRlZiB0ZXN0X3RyeV9hY3F1aXJlX2NvbnRlbmRlZChzZWxmKToKKyAgICAgICAgc2VtID0gc2VsZi5zZW10eXBlKDQpCisgICAgICAgIHNlbS5hY3F1aXJlKCkKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChzZW0uYWNxdWlyZShGYWxzZSkpCisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChzZW0uYWNxdWlyZShGYWxzZSkpCisgICAgICAgIEJ1bmNoKGYsIDUpLndhaXRfZm9yX2ZpbmlzaGVkKCkKKyAgICAgICAgIyBUaGVyZSBjYW4gYmUgYSB0aHJlYWQgc3dpdGNoIGJldHdlZW4gYWNxdWlyaW5nIHRoZSBzZW1hcGhvcmUgYW5kCisgICAgICAgICMgYXBwZW5kaW5nIHRoZSByZXN1bHQsIHRoZXJlZm9yZSByZXN1bHRzIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlCisgICAgICAgICMgb3JkZXJlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQocmVzdWx0cyksIFtGYWxzZV0gKiA3ICsgW1RydWVdICogIDMgKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF92YWx1ZShzZWxmKToKKyAgICAgICAgIyBUaGUgZGVmYXVsdCBpbml0aWFsIHZhbHVlIGlzIDEuCisgICAgICAgIHNlbSA9IHNlbGYuc2VtdHlwZSgpCisgICAgICAgIHNlbS5hY3F1aXJlKCkKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIHNlbS5hY3F1aXJlKCkKKyAgICAgICAgICAgIHNlbS5yZWxlYXNlKCkKKyAgICAgICAgYiA9IEJ1bmNoKGYsIDEpCisgICAgICAgIGIud2FpdF9mb3Jfc3RhcnRlZCgpCisgICAgICAgIF93YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiLmZpbmlzaGVkKQorICAgICAgICBzZW0ucmVsZWFzZSgpCisgICAgICAgIGIud2FpdF9mb3JfZmluaXNoZWQoKQorCisgICAgZGVmIHRlc3Rfd2l0aChzZWxmKToKKyAgICAgICAgc2VtID0gc2VsZi5zZW10eXBlKDIpCisgICAgICAgIGRlZiBfd2l0aChlcnI9Tm9uZSk6CisgICAgICAgICAgICB3aXRoIHNlbToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VtLmFjcXVpcmUoRmFsc2UpKQorICAgICAgICAgICAgICAgIHNlbS5yZWxlYXNlKCkKKyAgICAgICAgICAgICAgICB3aXRoIHNlbToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZW0uYWNxdWlyZShGYWxzZSkpCisgICAgICAgICAgICAgICAgICAgIGlmIGVycjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycgorICAgICAgICBfd2l0aCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZW0uYWNxdWlyZShGYWxzZSkpCisgICAgICAgIHNlbS5yZWxlYXNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBfd2l0aCwgVHlwZUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VtLmFjcXVpcmUoRmFsc2UpKQorICAgICAgICBzZW0ucmVsZWFzZSgpCisKK2NsYXNzIFNlbWFwaG9yZVRlc3RzKEJhc2VTZW1hcGhvcmVUZXN0cyk6CisgICAgIiIiCisgICAgVGVzdHMgZm9yIHVuYm91bmRlZCBzZW1hcGhvcmVzLgorICAgICIiIgorCisgICAgZGVmIHRlc3RfcmVsZWFzZV91bmFjcXVpcmVkKHNlbGYpOgorICAgICAgICAjIFVuYm91bmRlZCByZWxlYXNlcyBhcmUgYWxsb3dlZCBhbmQgaW5jcmVtZW50IHRoZSBzZW1hcGhvcmUncyB2YWx1ZQorICAgICAgICBzZW0gPSBzZWxmLnNlbXR5cGUoMSkKKyAgICAgICAgc2VtLnJlbGVhc2UoKQorICAgICAgICBzZW0uYWNxdWlyZSgpCisgICAgICAgIHNlbS5hY3F1aXJlKCkKKyAgICAgICAgc2VtLnJlbGVhc2UoKQorCisKK2NsYXNzIEJvdW5kZWRTZW1hcGhvcmVUZXN0cyhCYXNlU2VtYXBob3JlVGVzdHMpOgorICAgICIiIgorICAgIFRlc3RzIGZvciBib3VuZGVkIHNlbWFwaG9yZXMuCisgICAgIiIiCisKKyAgICBkZWYgdGVzdF9yZWxlYXNlX3VuYWNxdWlyZWQoc2VsZik6CisgICAgICAgICMgQ2Fubm90IGdvIHBhc3QgdGhlIGluaXRpYWwgdmFsdWUKKyAgICAgICAgc2VtID0gc2VsZi5zZW10eXBlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VtLnJlbGVhc2UpCisgICAgICAgIHNlbS5hY3F1aXJlKCkKKyAgICAgICAgc2VtLnJlbGVhc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZW0ucmVsZWFzZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9sb2NrX3Rlc3RzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9sb2NrX3Rlc3RzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQ3NjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2xvY2tfdGVzdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9sb2NrX3Rlc3RzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9sb2NrX3Rlc3RzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQ3NjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2xvY2tfdGVzdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L21hcHBpbmdfdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQzNzUwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5CkBAIC0wLDAgKzEsNjg2IEBACisjIHRlc3RzIGNvbW1vbiB0byBkaWN0IGFuZCBVc2VyRGljdAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgVXNlckRpY3QKK2ltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitjbGFzcyBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGhpcyBiYXNlIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoYXQgYW4gb2JqZWN0IGNvbmZvcm1zIHRvIHRoZQorICAgICMgbWFwcGluZyBwcm90b2NvbAorCisgICAgIyBGdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZnVsIHRvIG92ZXJyaWRlIHRvIGFkYXB0IHRvIGRpY3Rpb25hcnkKKyAgICAjIHNlbWFudGljcworICAgIHR5cGUydGVzdCA9IE5vbmUgIyB3aGljaCBjbGFzcyBpcyBiZWluZyB0ZXN0ZWQgKG92ZXJ3cml0ZSBpbiBzdWJjbGFzc2VzKQorCisgICAgZGVmIF9yZWZlcmVuY2Uoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGRpY3Rpb25hcnkgb2YgdmFsdWVzIHdoaWNoIGFyZSBpbnZhcmlhbnQgYnkgc3RvcmFnZQorICAgICAgICBpbiB0aGUgb2JqZWN0IHVuZGVyIHRlc3QuIiIiCisgICAgICAgIHJldHVybiB7MToyLCAia2V5MSI6InZhbHVlMSIsICJrZXkyIjooMSwyLDMpfQorICAgIGRlZiBfZW1wdHlfbWFwcGluZyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGVtcHR5IG1hcHBpbmcgb2JqZWN0IiIiCisgICAgICAgIHJldHVybiBzZWxmLnR5cGUydGVzdCgpCisgICAgZGVmIF9mdWxsX21hcHBpbmcoc2VsZiwgZGF0YSk6CisgICAgICAgICIiIlJldHVybiBhIG1hcHBpbmcgb2JqZWN0IHdpdGggdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiBkYXRhCisgICAgICAgIGRpY3Rpb25hcnkiIiIKKyAgICAgICAgeCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkYXRhLml0ZW1zKCk6CisgICAgICAgICAgICB4W2tleV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4geAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCisgICAgICAgIHNlbGYucmVmZXJlbmNlID0gc2VsZi5fcmVmZXJlbmNlKCkuY29weSgpCisKKyAgICAgICAgIyBBIChrZXksIHZhbHVlKSBwYWlyIG5vdCBpbiB0aGUgbWFwcGluZworICAgICAgICBrZXksIHZhbHVlID0gc2VsZi5yZWZlcmVuY2UucG9waXRlbSgpCisgICAgICAgIHNlbGYub3RoZXIgPSB7a2V5OnZhbHVlfQorCisgICAgICAgICMgQSAoa2V5LCB2YWx1ZSkgcGFpciBpbiB0aGUgbWFwcGluZworICAgICAgICBrZXksIHZhbHVlID0gc2VsZi5yZWZlcmVuY2UucG9waXRlbSgpCisgICAgICAgIHNlbGYuaW5tYXBwaW5nID0ge2tleTp2YWx1ZX0KKyAgICAgICAgc2VsZi5yZWZlcmVuY2Vba2V5XSA9IHZhbHVlCisKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIHJlYWQgb25seSBvcGVyYXRpb25zIG9uIG1hcHBpbmcKKyAgICAgICAgcCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBwMSA9IGRpY3QocCkgI3dvcmthcm91bmQgZm9yIHNpbmdsZXRvbiBvYmplY3RzCisgICAgICAgIGQgPSBzZWxmLl9mdWxsX21hcHBpbmcoc2VsZi5yZWZlcmVuY2UpCisgICAgICAgIGlmIGQgaXMgcDoKKyAgICAgICAgICAgIHAgPSBwMQorICAgICAgICAjSW5kZXhpbmcKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5yZWZlcmVuY2UuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFtrZXldLCB2YWx1ZSkKKyAgICAgICAga25vd25rZXkgPSBzZWxmLm90aGVyLmtleXMoKVswXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOmRba25vd25rZXldKQorICAgICAgICAjbGVuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgbGVuKHNlbGYucmVmZXJlbmNlKSkKKyAgICAgICAgI2luCisgICAgICAgIGZvciBrIGluIHNlbGYucmVmZXJlbmNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihrLCBkKQorICAgICAgICBmb3IgayBpbiBzZWxmLm90aGVyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihrLCBkKQorICAgICAgICAjaGFzX2tleQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKHF1aWV0PVRydWUpOgorICAgICAgICAgICAgZm9yIGsgaW4gc2VsZi5yZWZlcmVuY2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaGFzX2tleShrKSkKKyAgICAgICAgICAgIGZvciBrIGluIHNlbGYub3RoZXI6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkLmhhc19rZXkoaykpCisgICAgICAgICNjbXAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAocCxwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZCxkKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAocCxkKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGQscCksIDEpCisgICAgICAgICNfX25vbl9femVyb19fCisgICAgICAgIGlmIHA6IHNlbGYuZmFpbCgiRW1wdHkgbWFwcGluZyBtdXN0IGNvbXBhcmUgdG8gRmFsc2UiKQorICAgICAgICBpZiBub3QgZDogc2VsZi5mYWlsKCJGdWxsIG1hcHBpbmcgbXVzdCBjb21wYXJlIHRvIFRydWUiKQorICAgICAgICAjIGtleXMoKSwgaXRlbXMoKSwgaXRlcmtleXMoKSAuLi4KKyAgICAgICAgZGVmIGNoZWNrX2l0ZXJhbmRsaXN0KGl0ZXIsIGxzdCwgcmVmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGl0ZXIsICduZXh0JykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihpdGVyLCAnX19pdGVyX18nKSkKKyAgICAgICAgICAgIHggPSBsaXN0KGl0ZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KHgpPT1zZXQobHN0KT09c2V0KHJlZikpCisgICAgICAgIGNoZWNrX2l0ZXJhbmRsaXN0KGQuaXRlcmtleXMoKSwgZC5rZXlzKCksIHNlbGYucmVmZXJlbmNlLmtleXMoKSkKKyAgICAgICAgY2hlY2tfaXRlcmFuZGxpc3QoaXRlcihkKSwgZC5rZXlzKCksIHNlbGYucmVmZXJlbmNlLmtleXMoKSkKKyAgICAgICAgY2hlY2tfaXRlcmFuZGxpc3QoZC5pdGVydmFsdWVzKCksIGQudmFsdWVzKCksIHNlbGYucmVmZXJlbmNlLnZhbHVlcygpKQorICAgICAgICBjaGVja19pdGVyYW5kbGlzdChkLml0ZXJpdGVtcygpLCBkLml0ZW1zKCksIHNlbGYucmVmZXJlbmNlLml0ZW1zKCkpCisgICAgICAgICNnZXQKKyAgICAgICAga2V5LCB2YWx1ZSA9IGQuaXRlcml0ZW1zKCkubmV4dCgpCisgICAgICAgIGtub3dua2V5LCBrbm93bnZhbHVlID0gc2VsZi5vdGhlci5pdGVyaXRlbXMoKS5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChrZXksIGtub3dudmFsdWUpLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChrbm93bmtleSwga25vd252YWx1ZSksIGtub3dudmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oa25vd25rZXksIGQpCisKKyAgICBkZWYgdGVzdF93cml0ZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciB3cml0ZSBvcGVyYXRpb25zIG9uIG1hcHBpbmcKKyAgICAgICAgcCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICAjSW5kZXhpbmcKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5yZWZlcmVuY2UuaXRlbXMoKToKKyAgICAgICAgICAgIHBba2V5XSA9IHZhbHVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBba2V5XSwgdmFsdWUpCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5yZWZlcmVuY2Uua2V5cygpOgorICAgICAgICAgICAgZGVsIHBba2V5XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTpwW2tleV0pCisgICAgICAgIHAgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgI3VwZGF0ZQorICAgICAgICBwLnVwZGF0ZShzZWxmLnJlZmVyZW5jZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0KHApLCBzZWxmLnJlZmVyZW5jZSkKKyAgICAgICAgaXRlbXMgPSBwLml0ZW1zKCkKKyAgICAgICAgcCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBwLnVwZGF0ZShpdGVtcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0KHApLCBzZWxmLnJlZmVyZW5jZSkKKyAgICAgICAgZCA9IHNlbGYuX2Z1bGxfbWFwcGluZyhzZWxmLnJlZmVyZW5jZSkKKyAgICAgICAgI3NldGRlZmF1bHQKKyAgICAgICAga2V5LCB2YWx1ZSA9IGQuaXRlcml0ZW1zKCkubmV4dCgpCisgICAgICAgIGtub3dua2V5LCBrbm93bnZhbHVlID0gc2VsZi5vdGhlci5pdGVyaXRlbXMoKS5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnNldGRlZmF1bHQoa2V5LCBrbm93bnZhbHVlKSwgdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFtrZXldLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnNldGRlZmF1bHQoa25vd25rZXksIGtub3dudmFsdWUpLCBrbm93bnZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRba25vd25rZXldLCBrbm93bnZhbHVlKQorICAgICAgICAjcG9wCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5wb3Aoa25vd25rZXkpLCBrbm93bnZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGtub3dua2V5LCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5wb3AsIGtub3dua2V5KQorICAgICAgICBkZWZhdWx0ID0gOTA5CisgICAgICAgIGRba25vd25rZXldID0ga25vd252YWx1ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucG9wKGtub3dua2V5LCBkZWZhdWx0KSwga25vd252YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihrbm93bmtleSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBvcChrbm93bmtleSwgZGVmYXVsdCksIGRlZmF1bHQpCisgICAgICAgICNwb3BpdGVtCisgICAgICAgIGtleSwgdmFsdWUgPSBkLnBvcGl0ZW0oKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGtleSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgc2VsZi5yZWZlcmVuY2Vba2V5XSkKKyAgICAgICAgcD1zZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHAucG9waXRlbSkKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2VtcHR5X21hcHBpbmcoKSwgc2VsZi5fZW1wdHlfbWFwcGluZygpKQorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLl9lbXB0eV9tYXBwaW5nKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnJlZmVyZW5jZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJvb2woc2VsZi5fZW1wdHlfbWFwcGluZygpKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJvb2woc2VsZi5yZWZlcmVuY2UpIGlzIFRydWUpCisKKyAgICBkZWYgdGVzdF9rZXlzKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5rZXlzKCksIFtdKQorICAgICAgICBkID0gc2VsZi5yZWZlcmVuY2UKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzZWxmLmlubWFwcGluZy5rZXlzKClbMF0sIGQua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHNlbGYub3RoZXIua2V5cygpWzBdLCBkLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmtleXMsIE5vbmUpCisKKyAgICBkZWYgdGVzdF92YWx1ZXMoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnZhbHVlcygpLCBbXSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQudmFsdWVzLCBOb25lKQorCisgICAgZGVmIHRlc3RfaXRlbXMoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLml0ZW1zKCksIFtdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5pdGVtcywgTm9uZSkKKworICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMCkKKworICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CisgICAgICAgIGQgPSBzZWxmLnJlZmVyZW5jZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbc2VsZi5pbm1hcHBpbmcua2V5cygpWzBdXSwgc2VsZi5pbm1hcHBpbmcudmFsdWVzKClbMF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLl9fZ2V0aXRlbV9fKQorCisgICAgZGVmIHRlc3RfdXBkYXRlKHNlbGYpOgorICAgICAgICAjIG1hcHBpbmcgYXJndW1lbnQKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBkLnVwZGF0ZShzZWxmLm90aGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaXRlbXMoKSwgc2VsZi5vdGhlci5pdGVtcygpKQorCisgICAgICAgICMgTm8gYXJndW1lbnQKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBkLnVwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgc2VsZi5fZW1wdHlfbWFwcGluZygpKQorCisgICAgICAgICMgaXRlbSBzZXF1ZW5jZQorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIGQudXBkYXRlKHNlbGYub3RoZXIuaXRlbXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLml0ZW1zKCksIHNlbGYub3RoZXIuaXRlbXMoKSkKKworICAgICAgICAjIEl0ZXJhdG9yCisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgZC51cGRhdGUoc2VsZi5vdGhlci5pdGVyaXRlbXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLml0ZW1zKCksIHNlbGYub3RoZXIuaXRlbXMoKSkKKworICAgICAgICAjIEZJWE1FOiBEb2Vzbid0IHdvcmsgd2l0aCBVc2VyRGljdAorICAgICAgICAjIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgZC51cGRhdGUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgZC51cGRhdGUsIDQyKQorCisgICAgICAgIG91dGVyc2VsZiA9IHNlbGYKKyAgICAgICAgY2xhc3MgU2ltcGxlVXNlckRpY3Q6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5kID0gb3V0ZXJzZWxmLnJlZmVyZW5jZQorICAgICAgICAgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZC5rZXlzKCkKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kW2ldCisgICAgICAgIGQuY2xlYXIoKQorICAgICAgICBkLnVwZGF0ZShTaW1wbGVVc2VyRGljdCgpKQorICAgICAgICBpMSA9IGQuaXRlbXMoKQorICAgICAgICBpMiA9IHNlbGYucmVmZXJlbmNlLml0ZW1zKCkKKworICAgICAgICBkZWYgc2FmZV9zb3J0X2tleShrdik6CisgICAgICAgICAgICBrLCB2ID0ga3YKKyAgICAgICAgICAgIHJldHVybiBpZCh0eXBlKGspKSwgaWQodHlwZSh2KSksIGssIHYKKyAgICAgICAgaTEuc29ydChrZXk9c2FmZV9zb3J0X2tleSkKKyAgICAgICAgaTIuc29ydChrZXk9c2FmZV9zb3J0X2tleSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpMSwgaTIpCisKKyAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKKworICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIGNsYXNzIEZhaWxpbmdVc2VyRGljdDoKKyAgICAgICAgICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGQudXBkYXRlLCBGYWlsaW5nVXNlckRpY3QoKSkKKworICAgICAgICBkLmNsZWFyKCkKKworICAgICAgICBjbGFzcyBGYWlsaW5nVXNlckRpY3Q6CisgICAgICAgICAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgICAgICAgICBjbGFzcyBCb2dvbkl0ZXI6CisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaSA9IDEKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pID0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnYScKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4YworICAgICAgICAgICAgICAgIHJldHVybiBCb2dvbkl0ZXIoKQorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGtleQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGQudXBkYXRlLCBGYWlsaW5nVXNlckRpY3QoKSkKKworICAgICAgICBjbGFzcyBGYWlsaW5nVXNlckRpY3Q6CisgICAgICAgICAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgICAgICAgICBjbGFzcyBCb2dvbkl0ZXI6CisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaSA9IG9yZCgnYScpCisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5pIDw9IG9yZCgneicpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0biA9IGNocihzZWxmLmkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnRuCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgcmV0dXJuIEJvZ29uSXRlcigpCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBkLnVwZGF0ZSwgRmFpbGluZ1VzZXJEaWN0KCkpCisKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBjbGFzcyBiYWRzZXEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjKCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGQudXBkYXRlLCBiYWRzZXEoKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkLnVwZGF0ZSwgWygxLCAyLCAzKV0pCisKKyAgICAjIG5vIHRlc3RfZnJvbWtleXMgb3IgdGVzdF9jb3B5IGFzIGJvdGggb3MuZW52aXJvbiBhbmQgc2VsdmVzIGRvbid0IHN1cHBvcnQgaXQKKworICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5nZXQoc2VsZi5vdGhlci5rZXlzKClbMF0pIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoc2VsZi5vdGhlci5rZXlzKClbMF0sIDMpLCAzKQorICAgICAgICBkID0gc2VsZi5yZWZlcmVuY2UKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0KHNlbGYub3RoZXIua2V5cygpWzBdKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KHNlbGYub3RoZXIua2V5cygpWzBdLCAzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChzZWxmLmlubWFwcGluZy5rZXlzKClbMF0pLCBzZWxmLmlubWFwcGluZy52YWx1ZXMoKVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChzZWxmLmlubWFwcGluZy5rZXlzKClbMF0sIDMpLCBzZWxmLmlubWFwcGluZy52YWx1ZXMoKVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmdldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmdldCwgTm9uZSwgTm9uZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3NldGRlZmF1bHQoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLnNldGRlZmF1bHQpCisKKyAgICBkZWYgdGVzdF9wb3BpdGVtKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBkLnBvcGl0ZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5wb3BpdGVtLCA0MikKKworICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBrLCB2ID0gc2VsZi5pbm1hcHBpbmcuaXRlbXMoKVswXQorICAgICAgICBkW2tdID0gdgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5wb3AsIHNlbGYub3RoZXIua2V5cygpWzBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5wb3AoayksIHYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBkLnBvcCwgaykKKworCitjbGFzcyBUZXN0TWFwcGluZ1Byb3RvY29sKEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X2NvbnN0cnVjdG9yKHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9lbXB0eV9tYXBwaW5nKCkgaXMgbm90IHNlbGYuX2VtcHR5X21hcHBpbmcoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdCh4PTEsIHk9MiksIHsieCI6IDEsICJ5IjogMn0pCisKKyAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgorICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF9ib29sKHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc2VsZi5fZW1wdHlfbWFwcGluZygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fZnVsbF9tYXBwaW5nKHsieCI6ICJ5In0pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYm9vbChzZWxmLl9lbXB0eV9tYXBwaW5nKCkpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYm9vbChzZWxmLl9mdWxsX21hcHBpbmcoeyJ4IjogInkifSkpIGlzIFRydWUpCisKKyAgICBkZWYgdGVzdF9rZXlzKHNlbGYpOgorICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF9rZXlzKHNlbGYpCisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmtleXMoKSwgW10pCisgICAgICAgIGQgPSBzZWxmLl9mdWxsX21hcHBpbmcoeydhJzogMSwgJ2InOiAyfSkKKyAgICAgICAgayA9IGQua2V5cygpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCBrKQorICAgICAgICBzZWxmLmFzc2VydEluKCdiJywgaykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignYycsIGspCisKKyAgICBkZWYgdGVzdF92YWx1ZXMoc2VsZik6CisgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X3ZhbHVlcyhzZWxmKQorICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsxOjJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQudmFsdWVzKCksIFsyXSkKKworICAgIGRlZiB0ZXN0X2l0ZW1zKHNlbGYpOgorICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF9pdGVtcyhzZWxmKQorCisgICAgICAgIGQgPSBzZWxmLl9mdWxsX21hcHBpbmcoezE6Mn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pdGVtcygpLCBbKDEsIDIpXSkKKworICAgIGRlZiB0ZXN0X2hhc19rZXkoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkLmhhc19rZXkoJ2EnKSkKKyAgICAgICAgZCA9IHNlbGYuX2Z1bGxfbWFwcGluZyh7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBrID0gZC5rZXlzKCkKKyAgICAgICAgay5zb3J0KGtleT1sYW1iZGEgazogKGlkKHR5cGUoaykpLCBrKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBbJ2EnLCAnYiddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5oYXNfa2V5KQorCisgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignYScsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKCdhJyBpbiBkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBub3QgaW4gZCkKKyAgICAgICAgZCA9IHNlbGYuX2Z1bGxfbWFwcGluZyh7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYicsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2MnLCBkKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5fX2NvbnRhaW5zX18pCisKKyAgICBkZWYgdGVzdF9sZW4oc2VsZik6CisgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X2xlbihzZWxmKQorICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsnYSc6IDEsICdiJzogMn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAyKQorCisgICAgZGVmIHRlc3RfZ2V0aXRlbShzZWxmKToKKyAgICAgICAgQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3RfZ2V0aXRlbShzZWxmKQorICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsnYSc6IDEsICdiJzogMn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYSddLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2InXSwgMikKKyAgICAgICAgZFsnYyddID0gMworICAgICAgICBkWydhJ10gPSA0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYyddLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2EnXSwgNCkKKyAgICAgICAgZGVsIGRbJ2InXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHsnYSc6IDQsICdjJzogM30pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLl9fZ2V0aXRlbV9fKQorCisgICAgZGVmIHRlc3RfY2xlYXIoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLl9mdWxsX21hcHBpbmcoezE6MSwgMjoyLCAzOjN9KQorICAgICAgICBkLmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7fSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuY2xlYXIsIE5vbmUpCisKKyAgICBkZWYgdGVzdF91cGRhdGUoc2VsZik6CisgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X3VwZGF0ZShzZWxmKQorICAgICAgICAjIG1hcHBpbmcgYXJndW1lbnQKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBkLnVwZGF0ZSh7MToxMDB9KQorICAgICAgICBkLnVwZGF0ZSh7MjoyMH0pCisgICAgICAgIGQudXBkYXRlKHsxOjEsIDI6MiwgMzozfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7MToxLCAyOjIsIDM6M30pCisKKyAgICAgICAgIyBubyBhcmd1bWVudAorICAgICAgICBkLnVwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgezE6MSwgMjoyLCAzOjN9KQorCisgICAgICAgICMga2V5d29yZCBhcmd1bWVudHMKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBkLnVwZGF0ZSh4PTEwMCkKKyAgICAgICAgZC51cGRhdGUoeT0yMCkKKyAgICAgICAgZC51cGRhdGUoeD0xLCB5PTIsIHo9MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7IngiOjEsICJ5IjoyLCAieiI6M30pCisKKyAgICAgICAgIyBpdGVtIHNlcXVlbmNlCisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgZC51cGRhdGUoWygieCIsIDEwMCksICgieSIsIDIwKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgeyJ4IjoxMDAsICJ5IjoyMH0pCisKKyAgICAgICAgIyBCb3RoIGl0ZW0gc2VxdWVuY2UgYW5kIGtleXdvcmQgYXJndW1lbnRzCisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgZC51cGRhdGUoWygieCIsIDEwMCksICgieSIsIDIwKV0sIHg9MSwgeT0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHsieCI6MSwgInkiOjJ9KQorCisgICAgICAgICMgaXRlcmF0b3IKKyAgICAgICAgZCA9IHNlbGYuX2Z1bGxfbWFwcGluZyh7MTozLCAyOjR9KQorICAgICAgICBkLnVwZGF0ZShzZWxmLl9mdWxsX21hcHBpbmcoezE6MiwgMzo0LCA1OjZ9KS5pdGVyaXRlbXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7MToyLCAyOjQsIDM6NCwgNTo2fSkKKworICAgICAgICBjbGFzcyBTaW1wbGVVc2VyRGljdDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmQgPSB7MToxLCAyOjIsIDM6M30KKyAgICAgICAgICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmQua2V5cygpCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZFtpXQorICAgICAgICBkLmNsZWFyKCkKKyAgICAgICAgZC51cGRhdGUoU2ltcGxlVXNlckRpY3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7MToxLCAyOjIsIDM6M30pCisKKyAgICBkZWYgdGVzdF9mcm9ta2V5cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdC5mcm9ta2V5cygnYWJjJyksIHsnYSc6Tm9uZSwgJ2InOk5vbmUsICdjJzpOb25lfSkKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90KGQuZnJvbWtleXMoJ2FiYycpIGlzIGQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZnJvbWtleXMoJ2FiYycpLCB7J2EnOk5vbmUsICdiJzpOb25lLCAnYyc6Tm9uZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mcm9ta2V5cygoNCw1KSwwKSwgezQ6MCwgNTowfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZyb21rZXlzKFtdKSwge30pCisgICAgICAgIGRlZiBnKCk6CisgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mcm9ta2V5cyhnKCkpLCB7MTpOb25lfSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS5mcm9ta2V5cywgMykKKyAgICAgICAgY2xhc3MgZGljdGxpa2Uoc2VsZi50eXBlMnRlc3QpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdGxpa2UuZnJvbWtleXMoJ2EnKSwgeydhJzpOb25lfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0bGlrZSgpLmZyb21rZXlzKCdhJyksIHsnYSc6Tm9uZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0bGlrZS5mcm9ta2V5cygnYScpLl9fY2xhc3NfXyBpcyBkaWN0bGlrZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpY3RsaWtlKCkuZnJvbWtleXMoJ2EnKS5fX2NsYXNzX18gaXMgZGljdGxpa2UpCisgICAgICAgICMgRklYTUU6IHRoZSBmb2xsb3dpbmcgd29uJ3Qgd29yayB3aXRoIFVzZXJEaWN0LCBiZWNhdXNlIGl0J3MgYW4gb2xkIHN0eWxlIGNsYXNzCisgICAgICAgICMgc2VsZi5hc3NlcnRUcnVlKHR5cGUoZGljdGxpa2UuZnJvbWtleXMoJ2EnKSkgaXMgZGljdGxpa2UpCisgICAgICAgIGNsYXNzIG15ZGljdChzZWxmLnR5cGUydGVzdCk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMpOgorICAgICAgICAgICAgICAgIHJldHVybiBVc2VyRGljdC5Vc2VyRGljdCgpCisgICAgICAgIHVkID0gbXlkaWN0LmZyb21rZXlzKCdhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodWQsIHsnYSc6Tm9uZSwgJ2InOk5vbmV9KQorICAgICAgICAjIEZJWE1FOiB0aGUgZm9sbG93aW5nIHdvbid0IHdvcmsgd2l0aCBVc2VyRGljdCwgYmVjYXVzZSBpdCdzIGFuIG9sZCBzdHlsZSBjbGFzcworICAgICAgICAjIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh1ZCwgVXNlckRpY3QuVXNlckRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGljdC5mcm9ta2V5cykKKworICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKTogcGFzcworCisgICAgICAgIGNsYXNzIGJhZGRpY3QxKHNlbGYudHlwZTJ0ZXN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgYmFkZGljdDEuZnJvbWtleXMsIFsxXSkKKworICAgICAgICBjbGFzcyBCYWRTZXEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjKCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIHNlbGYudHlwZTJ0ZXN0LmZyb21rZXlzLCBCYWRTZXEoKSkKKworICAgICAgICBjbGFzcyBiYWRkaWN0MihzZWxmLnR5cGUydGVzdCk6CisgICAgICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjKCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGJhZGRpY3QyLmZyb21rZXlzLCBbMV0pCisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsxOjEsIDI6MiwgMzozfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmNvcHkoKSwgezE6MSwgMjoyLCAzOjN9KQorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5jb3B5KCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLmNvcHkoKSwgZC5fX2NsYXNzX18pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5jb3B5LCBOb25lKQorCisgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgorICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF9nZXQoc2VsZikKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5nZXQoJ2MnKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdjJywgMyksIDMpCisgICAgICAgIGQgPSBzZWxmLl9mdWxsX21hcHBpbmcoeydhJyA6IDEsICdiJyA6IDJ9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5nZXQoJ2MnKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdjJywgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2EnKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYScsIDMpLCAxKQorCisgICAgZGVmIHRlc3Rfc2V0ZGVmYXVsdChzZWxmKToKKyAgICAgICAgQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3Rfc2V0ZGVmYXVsdChzZWxmKQorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLnNldGRlZmF1bHQoJ2tleTAnKSBpcyBOb25lKQorICAgICAgICBkLnNldGRlZmF1bHQoJ2tleTAnLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuc2V0ZGVmYXVsdCgna2V5MCcpIGlzIE5vbmUpCisgICAgICAgIGQuc2V0ZGVmYXVsdCgna2V5JywgW10pLmFwcGVuZCgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2tleSddWzBdLCAzKQorICAgICAgICBkLnNldGRlZmF1bHQoJ2tleScsIFtdKS5hcHBlbmQoNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZFsna2V5J10pLCAyKQorCisgICAgZGVmIHRlc3RfcG9waXRlbShzZWxmKToKKyAgICAgICAgQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3RfcG9waXRlbShzZWxmKQorICAgICAgICBmb3IgY29weW1vZGUgaW4gLTEsICsxOgorICAgICAgICAgICAgIyAtMTogYiBoYXMgc2FtZSBzdHJ1Y3R1cmUgYXMgYQorICAgICAgICAgICAgIyArMTogYiBpcyBhLmNvcHkoKQorICAgICAgICAgICAgZm9yIGxvZzJzaXplIGluIHJhbmdlKDEyKToKKyAgICAgICAgICAgICAgICBzaXplID0gMioqbG9nMnNpemUKKyAgICAgICAgICAgICAgICBhID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgICAgICAgICAgYiA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgICAgICBhW3JlcHIoaSldID0gaQorICAgICAgICAgICAgICAgICAgICBpZiBjb3B5bW9kZSA8IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBiW3JlcHIoaSldID0gaQorICAgICAgICAgICAgICAgIGlmIGNvcHltb2RlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgYiA9IGEuY29weSgpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgICAgIGthLCB2YSA9IHRhID0gYS5wb3BpdGVtKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YSwgaW50KGthKSkKKyAgICAgICAgICAgICAgICAgICAga2IsIHZiID0gdGIgPSBiLnBvcGl0ZW0oKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZiLCBpbnQoa2IpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90KGNvcHltb2RlIDwgMCBhbmQgdGEgIT0gdGIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGIpCisKKyAgICBkZWYgdGVzdF9wb3Aoc2VsZik6CisgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X3BvcChzZWxmKQorCisgICAgICAgICMgVGVzdHMgZm9yIHBvcCB3aXRoIHNwZWNpZmllZCBrZXkKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBrLCB2ID0gJ2FiYycsICdkZWYnCisKKyAgICAgICAgIyB2ZXJpZnkgbG9uZ3MvaW50cyBnZXQgc2FtZSB2YWx1ZSB3aGVuIGtleSA+IDMyIGJpdHMgKGZvciA2NC1iaXQgYXJjaHMpCisgICAgICAgICMgc2VlIFNGIGJ1ZyAjNjg5NjU5CisgICAgICAgIHggPSA0NTAzNTk5NjI3MzcwNDk2TAorICAgICAgICB5ID0gNDUwMzU5OTYyNzM3MDQ5NgorICAgICAgICBoID0gc2VsZi5fZnVsbF9tYXBwaW5nKHt4OiAnYW55dGhpbmcnLCB5OiAnc29tZXRoaW5nIGVsc2UnfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoW3hdLCBoW3ldKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5wb3AoaywgdiksIHYpCisgICAgICAgIGRba10gPSB2CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5wb3AoaywgMSksIHYpCisKKworY2xhc3MgVGVzdEhhc2hNYXBwaW5nUHJvdG9jb2woVGVzdE1hcHBpbmdQcm90b2NvbCk6CisKKyAgICBkZWYgdGVzdF9nZXRpdGVtKHNlbGYpOgorICAgICAgICBUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3RfZ2V0aXRlbShzZWxmKQorICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKTogcGFzcworCisgICAgICAgIGNsYXNzIEJhZEVxKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyNAorCisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgZFtCYWRFcSgpXSA9IDQyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBkLl9fZ2V0aXRlbV9fLCAyMykKKworICAgICAgICBjbGFzcyBCYWRIYXNoKG9iamVjdCk6CisgICAgICAgICAgICBmYWlsID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmZhaWw6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICB4ID0gQmFkSGFzaCgpCisgICAgICAgIGRbeF0gPSA0MgorICAgICAgICB4LmZhaWwgPSBUcnVlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgZC5fX2dldGl0ZW1fXywgeCkKKworICAgIGRlZiB0ZXN0X2Zyb21rZXlzKHNlbGYpOgorICAgICAgICBUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3RfZnJvbWtleXMoc2VsZikKKyAgICAgICAgY2xhc3MgbXlkaWN0KHNlbGYudHlwZTJ0ZXN0KToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFVzZXJEaWN0LlVzZXJEaWN0KCkKKyAgICAgICAgdWQgPSBteWRpY3QuZnJvbWtleXMoJ2FiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ZCwgeydhJzpOb25lLCAnYic6Tm9uZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh1ZCwgVXNlckRpY3QuVXNlckRpY3QpCisKKyAgICBkZWYgdGVzdF9wb3Aoc2VsZik6CisgICAgICAgIFRlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF9wb3Aoc2VsZikKKworICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKTogcGFzcworCisgICAgICAgIGNsYXNzIEJhZEhhc2gob2JqZWN0KToKKyAgICAgICAgICAgIGZhaWwgPSBGYWxzZQorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmFpbDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDIKKworICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHggPSBCYWRIYXNoKCkKKyAgICAgICAgZFt4XSA9IDQyCisgICAgICAgIHguZmFpbCA9IFRydWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBkLnBvcCwgeCkKKworICAgIGRlZiB0ZXN0X211dGF0aW5naXRlcmF0aW9uKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIGRbMV0gPSAxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIGQ6CisgICAgICAgICAgICAgICAgZFtpKzFdID0gMQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJjaGFuZ2luZyBkaWN0IHNpemUgZHVyaW5nIGl0ZXJhdGlvbiBkb2Vzbid0IHJhaXNlIEVycm9yIikKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQpLCAne30nKQorICAgICAgICBkWzFdID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZCksICd7MTogMn0nKQorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIGRbMV0gPSBkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihkKSwgJ3sxOiB7Li4ufX0nKQorCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOiBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkUmVwcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisKKyAgICAgICAgZCA9IHNlbGYuX2Z1bGxfbWFwcGluZyh7MTogQmFkUmVwcigpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCByZXByLCBkKQorCisgICAgZGVmIHRlc3RfbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHNlbGYuX2VtcHR5X21hcHBpbmcoKSA8IHNlbGYuX2VtcHR5X21hcHBpbmcoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHNlbGYuX2Z1bGxfbWFwcGluZyh7MTogMn0pIDwgc2VsZi5fZnVsbF9tYXBwaW5nKHsxTDogMkx9KSkpCisKKyAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKKworICAgICAgICBjbGFzcyBCYWRDbXAob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisKKyAgICAgICAgZDEgPSBzZWxmLl9mdWxsX21hcHBpbmcoe0JhZENtcCgpOiAxfSkKKyAgICAgICAgZDIgPSBzZWxmLl9mdWxsX21hcHBpbmcoezE6IDF9KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkMSA8IGQyCisgICAgICAgIGV4Y2VwdCBFeGM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIjwgZGlkbid0IHJhaXNlIEV4YyIpCisKKyAgICBkZWYgdGVzdF9zZXRkZWZhdWx0KHNlbGYpOgorICAgICAgICBUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3Rfc2V0ZGVmYXVsdChzZWxmKQorCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOiBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkSGFzaChvYmplY3QpOgorICAgICAgICAgICAgZmFpbCA9IEZhbHNlCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5mYWlsOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgeCA9IEJhZEhhc2goKQorICAgICAgICBkW3hdID0gNDIKKyAgICAgICAgeC5mYWlsID0gVHJ1ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGQuc2V0ZGVmYXVsdCwgeCwgW10pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvbWFwcGluZ190ZXN0cy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvbWFwcGluZ190ZXN0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzNDVkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvbWFwcGluZ190ZXN0cy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvbWFwcGluZ190ZXN0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIzNDVkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvbWF0aF90ZXN0Y2FzZXMudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L21hdGhfdGVzdGNhc2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTFhNDlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L21hdGhfdGVzdGNhc2VzLnR4dApAQCAtMCwwICsxLDQ0NyBAQAorLS0gVGVzdGNhc2VzIGZvciBmdW5jdGlvbnMgaW4gbWF0aC4KKy0tCistLSBFYWNoIGxpbmUgdGFrZXMgdGhlIGZvcm06CistLQorLS0gPHRlc3RpZD4gPGZ1bmN0aW9uPiA8aW5wdXRfdmFsdWU+IC0+IDxvdXRwdXRfdmFsdWU+IDxmbGFncz4KKy0tCistLSB3aGVyZToKKy0tCistLSAgIDx0ZXN0aWQ+IGlzIGEgc2hvcnQgbmFtZSBpZGVudGlmeWluZyB0aGUgdGVzdCwKKy0tCistLSAgIDxmdW5jdGlvbj4gaXMgdGhlIGZ1bmN0aW9uIHRvIGJlIHRlc3RlZCAoZXhwLCBjb3MsIGFzaW5oLCAuLi4pLAorLS0KKy0tICAgPGlucHV0X3ZhbHVlPiBpcyBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBmbG9hdGluZy1wb2ludCB2YWx1ZQorLS0KKy0tICAgPG91dHB1dF92YWx1ZT4gaXMgdGhlIGV4cGVjdGVkIChpZGVhbCkgb3V0cHV0IHZhbHVlLCBhZ2FpbgorLS0gICAgIHJlcHJlc2VudGVkIGFzIGEgc3RyaW5nLgorLS0KKy0tICAgPGZsYWdzPiBpcyBhIGxpc3Qgb2YgdGhlIGZsb2F0aW5nLXBvaW50IGZsYWdzIHJlcXVpcmVkIGJ5IEM5OQorLS0KKy0tIFRoZSBwb3NzaWJsZSBmbGFncyBhcmU6CistLQorLS0gICBkaXZpZGUtYnktemVybyA6IHJhaXNlZCB3aGVuIGEgZmluaXRlIGlucHV0IGdpdmVzIGEKKy0tICAgICBtYXRoZW1hdGljYWxseSBpbmZpbml0ZSByZXN1bHQuCistLQorLS0gICBvdmVyZmxvdyA6IHJhaXNlZCB3aGVuIGEgZmluaXRlIGlucHV0IGdpdmVzIGEgZmluaXRlIHJlc3VsdCB0aGF0CistLSAgICAgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbiB0aGUgdXN1YWwgcmFuZ2Ugb2YgYW4gSUVFRSA3NTQgZG91YmxlLgorLS0KKy0tICAgaW52YWxpZCA6IHJhaXNlZCBmb3IgaW52YWxpZCBpbnB1dHMgKGUuZy4sIHNxcnQoLTEpKQorLS0KKy0tICAgaWdub3JlLXNpZ24gOiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2lnbiBvZiB0aGUgcmVzdWx0IGlzCistLSAgICAgdW5zcGVjaWZpZWQ7IGUuZy4sIGlmIHRoZSByZXN1bHQgaXMgZ2l2ZW4gYXMgaW5mLAorLS0gICAgIHRoZW4gYm90aCAtaW5mIGFuZCBpbmYgc2hvdWxkIGJlIGFjY2VwdGVkIGFzIGNvcnJlY3QuCistLQorLS0gRmxhZ3MgbWF5IGFwcGVhciBpbiBhbnkgb3JkZXIuCistLQorLS0gTGluZXMgYmVnaW5uaW5nIHdpdGggJy0tJyAobGlrZSB0aGlzIG9uZSkgc3RhcnQgYSBjb21tZW50LCBhbmQgYXJlCistLSBpZ25vcmVkLiAgQmxhbmsgbGluZXMsIG9yIGxpbmVzIGNvbnRhaW5pbmcgb25seSB3aGl0ZXNwYWNlLCBhcmUgYWxzbworLS0gaWdub3JlZC4KKworLS0gTWFueSBvZiB0aGUgdmFsdWVzIGJlbG93IHdlcmUgY29tcHV0ZWQgd2l0aCB0aGUgaGVscCBvZgorLS0gdmVyc2lvbiAyLjQgb2YgdGhlIE1QRlIgbGlicmFyeSBmb3IgbXVsdGlwbGUtcHJlY2lzaW9uCistLSBmbG9hdGluZy1wb2ludCBjb21wdXRhdGlvbnMgd2l0aCBjb3JyZWN0IHJvdW5kaW5nLiAgQWxsIG91dHB1dAorLS0gdmFsdWVzIGluIHRoaXMgZmlsZSBhcmUgKG1vZHVsbyB5ZXQtdG8tYmUtZGlzY292ZXJlZCBidWdzKQorLS0gY29ycmVjdGx5IHJvdW5kZWQsIHByb3ZpZGVkIHRoYXQgZWFjaCBpbnB1dCBhbmQgb3V0cHV0IGRlY2ltYWwKKy0tIGZsb2F0aW5nLXBvaW50IHZhbHVlIGJlbG93IGlzIGludGVycHJldGVkIGFzIGEgcmVwcmVzZW50YXRpb24gb2YKKy0tIHRoZSBjb3JyZXNwb25kaW5nIG5lYXJlc3QgSUVFRSA3NTQgZG91YmxlLXByZWNpc2lvbiB2YWx1ZS4gIFNlZSB0aGUKKy0tIE1QRlIgaG9tZXBhZ2UgYXQgaHR0cDovL3d3dy5tcGZyLm9yZyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKy0tIE1QRlIgcHJvamVjdC4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBlcmY6IGVycm9yIGZ1bmN0aW9uIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2VyZjAwMDAgZXJmIDAuMCAtPiAwLjAKK2VyZjAwMDEgZXJmIC0wLjAgLT4gLTAuMAorZXJmMDAwMiBlcmYgaW5mIC0+IDEuMAorZXJmMDAwMyBlcmYgLWluZiAtPiAtMS4wCitlcmYwMDA0IGVyZiBuYW4gLT4gbmFuCisKKy0tIHRpbnkgdmFsdWVzCitlcmYwMDEwIGVyZiAxZS0zMDggLT4gMS4xMjgzNzkxNjcwOTU1MTI1ZS0zMDgKK2VyZjAwMTEgZXJmIDVlLTMyNCAtPiA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNAorZXJmMDAxMiBlcmYgMWUtMTAgLT4gMS4xMjgzNzkxNjcwOTU1MTI2ZS0xMAorCistLSBzbWFsbCBpbnRlZ2VycworZXJmMDAyMCBlcmYgMSAtPiAwLjg0MjcwMDc5Mjk0OTcxNDg5CitlcmYwMDIxIGVyZiAyIC0+IDAuOTk1MzIyMjY1MDE4OTUyNzEKK2VyZjAwMjIgZXJmIDMgLT4gMC45OTk5Nzc5MDk1MDMwMDEzNgorZXJmMDAyMyBlcmYgNCAtPiAwLjk5OTk5OTk4NDU4Mjc0MjA5CitlcmYwMDI0IGVyZiA1IC0+IDAuOTk5OTk5OTk5OTk4NDYyNTYKK2VyZjAwMjUgZXJmIDYgLT4gMS4wCisKK2VyZjAwMzAgZXJmIC0xIC0+IC0wLjg0MjcwMDc5Mjk0OTcxNDg5CitlcmYwMDMxIGVyZiAtMiAtPiAtMC45OTUzMjIyNjUwMTg5NTI3MQorZXJmMDAzMiBlcmYgLTMgLT4gLTAuOTk5OTc3OTA5NTAzMDAxMzYKK2VyZjAwMzMgZXJmIC00IC0+IC0wLjk5OTk5OTk4NDU4Mjc0MjA5CitlcmYwMDM0IGVyZiAtNSAtPiAtMC45OTk5OTk5OTk5OTg0NjI1NgorZXJmMDAzNSBlcmYgLTYgLT4gLTEuMAorCistLSBodWdlIHZhbHVlcyBzaG91bGQgYWxsIGdvIHRvICsvLTEsIGRlcGVuZGluZyBvbiBzaWduCitlcmYwMDQwIGVyZiAtNDAgLT4gLTEuMAorZXJmMDA0MSBlcmYgMWUxNiAtPiAxLjAKK2VyZjAwNDIgZXJmIC0xZTE1MCAtPiAtMS4wCitlcmYwMDQzIGVyZiAxLjdlMzA4IC0+IDEuMAorCistLSBJc3N1ZSA4OTg2OiBpbnB1dHMgeCB3aXRoIGV4cCgteCp4KSBuZWFyIHRoZSB1bmRlcmZsb3cgdGhyZXNob2xkCistLSBpbmNvcnJlY3RseSBzaWduYWxsZWQgb3ZlcmZsb3cgb24gc29tZSBwbGF0Zm9ybXMuCitlcmYwMTAwIGVyZiAyNi4yIC0+IDEuMAorZXJmMDEwMSBlcmYgMjYuNCAtPiAxLjAKK2VyZjAxMDIgZXJmIDI2LjYgLT4gMS4wCitlcmYwMTAzIGVyZiAyNi44IC0+IDEuMAorZXJmMDEwNCBlcmYgMjcuMCAtPiAxLjAKK2VyZjAxMDUgZXJmIDI3LjIgLT4gMS4wCitlcmYwMTA2IGVyZiAyNy40IC0+IDEuMAorZXJmMDEwNyBlcmYgMjcuNiAtPiAxLjAKKworZXJmMDExMCBlcmYgLTI2LjIgLT4gLTEuMAorZXJmMDExMSBlcmYgLTI2LjQgLT4gLTEuMAorZXJmMDExMiBlcmYgLTI2LjYgLT4gLTEuMAorZXJmMDExMyBlcmYgLTI2LjggLT4gLTEuMAorZXJmMDExNCBlcmYgLTI3LjAgLT4gLTEuMAorZXJmMDExNSBlcmYgLTI3LjIgLT4gLTEuMAorZXJmMDExNiBlcmYgLTI3LjQgLT4gLTEuMAorZXJmMDExNyBlcmYgLTI3LjYgLT4gLTEuMAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBlcmZjOiBjb21wbGVtZW50YXJ5IGVycm9yIGZ1bmN0aW9uIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2VyZmMwMDAwIGVyZmMgMC4wIC0+IDEuMAorZXJmYzAwMDEgZXJmYyAtMC4wIC0+IDEuMAorZXJmYzAwMDIgZXJmYyBpbmYgLT4gMC4wCitlcmZjMDAwMyBlcmZjIC1pbmYgLT4gMi4wCitlcmZjMDAwNCBlcmZjIG5hbiAtPiBuYW4KKworLS0gdGlueSB2YWx1ZXMKK2VyZmMwMDEwIGVyZmMgMWUtMzA4IC0+IDEuMAorZXJmYzAwMTEgZXJmYyA1ZS0zMjQgLT4gMS4wCitlcmZjMDAxMiBlcmZjIDFlLTEwIC0+IDAuOTk5OTk5OTk5ODg3MTYyMDQKKworLS0gc21hbGwgaW50ZWdlcnMKK2VyZmMwMDIwIGVyZmMgMSAtPiAwLjE1NzI5OTIwNzA1MDI4NTEzCitlcmZjMDAyMSBlcmZjIDIgLT4gMC4wMDQ2Nzc3MzQ5ODEwNDcyNjYyCitlcmZjMDAyMiBlcmZjIDMgLT4gMi4yMDkwNDk2OTk4NTg1NDQxZS0wNQorZXJmYzAwMjMgZXJmYyA0IC0+IDEuNTQxNzI1NzkwMDI4MDAyZS0wOAorZXJmYzAwMjQgZXJmYyA1IC0+IDEuNTM3NDU5Nzk0NDI4MDM0OWUtMTIKK2VyZmMwMDI1IGVyZmMgNiAtPiAyLjE1MTk3MzY3MTI0OTg5MTNlLTE3CisKK2VyZmMwMDMwIGVyZmMgLTEgLT4gMS44NDI3MDA3OTI5NDk3MTQ4CitlcmZjMDAzMSBlcmZjIC0yIC0+IDEuOTk1MzIyMjY1MDE4OTUyOAorZXJmYzAwMzIgZXJmYyAtMyAtPiAxLjk5OTk3NzkwOTUwMzAwMTUKK2VyZmMwMDMzIGVyZmMgLTQgLT4gMS45OTk5OTk5ODQ1ODI3NDIxCitlcmZjMDAzNCBlcmZjIC01IC0+IDEuOTk5OTk5OTk5OTk4NDYyNgorZXJmYzAwMzUgZXJmYyAtNiAtPiAyLjAKKworLS0gYXMgeCAtPiBpbmZpbml0eSwgZXJmYyh4KSBiZWhhdmVzIGxpa2UgZXhwKC14KngpL3gvc3FydChwaSkKK2VyZmMwMDQwIGVyZmMgMjAgLT4gNS4zOTU4NjU2MTE2MDc5MDEyZS0xNzYKK2VyZmMwMDQxIGVyZmMgMjUgLT4gOC4zMDAxNzI1NzExOTY1MjI4ZS0yNzQKK2VyZmMwMDQyIGVyZmMgMjcgLT4gNS4yMzcwNDY0MzkzNTI2MjkyZS0zMTkKK2VyZmMwMDQzIGVyZmMgMjggLT4gMC4wCisKKy0tIGh1Z2UgdmFsdWVzCitlcmZjMDA1MCBlcmZjIC00MCAtPiAyLjAKK2VyZmMwMDUxIGVyZmMgMWUxNiAtPiAwLjAKK2VyZmMwMDUyIGVyZmMgLTFlMTUwIC0+IDIuMAorZXJmYzAwNTMgZXJmYyAxLjdlMzA4IC0+IDAuMAorCistLSBJc3N1ZSA4OTg2OiBpbnB1dHMgeCB3aXRoIGV4cCgteCp4KSBuZWFyIHRoZSB1bmRlcmZsb3cgdGhyZXNob2xkCistLSBpbmNvcnJlY3RseSBzaWduYWxsZWQgb3ZlcmZsb3cgb24gc29tZSBwbGF0Zm9ybXMuCitlcmZjMDEwMCBlcmZjIDI2LjIgLT4gMS42NDMyNTA3OTI0Mzg5NDYxZS0zMDAKK2VyZmMwMTAxIGVyZmMgMjYuNCAtPiA0LjQwMTc3Njg1ODgwMzU0MjZlLTMwNQorZXJmYzAxMDIgZXJmYyAyNi42IC0+IDEuMDg4NTEyNTg4NTQ0MjI2OWUtMzA5CitlcmZjMDEwMyBlcmZjIDI2LjggLT4gMi40ODQ5NjIxNTcxOTY2NjI5ZS0zMTQKK2VyZmMwMTA0IGVyZmMgMjcuMCAtPiA1LjIzNzA0NjQzOTM1MjYyOTJlLTMxOQorZXJmYzAxMDUgZXJmYyAyNy4yIC0+IDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0CitlcmZjMDEwNiBlcmZjIDI3LjQgLT4gMC4wCitlcmZjMDEwNyBlcmZjIDI3LjYgLT4gMC4wCisKK2VyZmMwMTEwIGVyZmMgLTI2LjIgLT4gMi4wCitlcmZjMDExMSBlcmZjIC0yNi40IC0+IDIuMAorZXJmYzAxMTIgZXJmYyAtMjYuNiAtPiAyLjAKK2VyZmMwMTEzIGVyZmMgLTI2LjggLT4gMi4wCitlcmZjMDExNCBlcmZjIC0yNy4wIC0+IDIuMAorZXJmYzAxMTUgZXJmYyAtMjcuMiAtPiAyLjAKK2VyZmMwMTE2IGVyZmMgLTI3LjQgLT4gMi4wCitlcmZjMDExNyBlcmZjIC0yNy42IC0+IDIuMAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGxnYW1tYTogbG9nIG9mIGFic29sdXRlIHZhbHVlIG9mIHRoZSBnYW1tYSBmdW5jdGlvbiAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tIHNwZWNpYWwgdmFsdWVzCitsZ2FtMDAwMCBsZ2FtbWEgMC4wIC0+IGluZiAgICAgIGRpdmlkZS1ieS16ZXJvCitsZ2FtMDAwMSBsZ2FtbWEgLTAuMCAtPiBpbmYgICAgIGRpdmlkZS1ieS16ZXJvCitsZ2FtMDAwMiBsZ2FtbWEgaW5mIC0+IGluZgorbGdhbTAwMDMgbGdhbW1hIC1pbmYgLT4gaW5mCitsZ2FtMDAwNCBsZ2FtbWEgbmFuIC0+IG5hbgorCistLSBuZWdhdGl2ZSBpbnRlZ2VycworbGdhbTAwMTAgbGdhbW1hIC0xIC0+IGluZiAgICAgICBkaXZpZGUtYnktemVybworbGdhbTAwMTEgbGdhbW1hIC0yIC0+IGluZiAgICAgICBkaXZpZGUtYnktemVybworbGdhbTAwMTIgbGdhbW1hIC0xZTE2IC0+IGluZiAgICBkaXZpZGUtYnktemVybworbGdhbTAwMTMgbGdhbW1hIC0xZTMwMCAtPiBpbmYgICBkaXZpZGUtYnktemVybworbGdhbTAwMTQgbGdhbW1hIC0xLjc5ZTMwOCAtPiBpbmYgZGl2aWRlLWJ5LXplcm8KKworLS0gc21hbGwgcG9zaXRpdmUgaW50ZWdlcnMgZ2l2ZSBmYWN0b3JpYWxzCitsZ2FtMDAyMCBsZ2FtbWEgMSAtPiAwLjAKK2xnYW0wMDIxIGxnYW1tYSAyIC0+IDAuMAorbGdhbTAwMjIgbGdhbW1hIDMgLT4gMC42OTMxNDcxODA1NTk5NDUyOQorbGdhbTAwMjMgbGdhbW1hIDQgLT4gMS43OTE3NTk0NjkyMjgwNTUKK2xnYW0wMDI0IGxnYW1tYSA1IC0+IDMuMTc4MDUzODMwMzQ3OTQ1OAorbGdhbTAwMjUgbGdhbW1hIDYgLT4gNC43ODc0OTE3NDI3ODIwNDU4CisKKy0tIGhhbGYgaW50ZWdlcnMKK2xnYW0wMDMwIGxnYW1tYSAwLjUgLT4gMC41NzIzNjQ5NDI5MjQ3MDAwOAorbGdhbTAwMzEgbGdhbW1hIDEuNSAtPiAtMC4xMjA3ODIyMzc2MzUyNDUyMgorbGdhbTAwMzIgbGdhbW1hIDIuNSAtPiAwLjI4NDY4Mjg3MDQ3MjkxOTE4CitsZ2FtMDAzMyBsZ2FtbWEgMy41IC0+IDEuMjAwOTczNjAyMzQ3MDc0MworbGdhbTAwMzQgbGdhbW1hIC0wLjUgLT4gMS4yNjU1MTIxMjM0ODQ2NDU0CitsZ2FtMDAzNSBsZ2FtbWEgLTEuNSAtPiAwLjg2MDA0NzAxNTM3NjQ4MDk4CitsZ2FtMDAzNiBsZ2FtbWEgLTIuNSAtPiAtMC4wNTYyNDM3MTY0OTc2NzQwNTQKK2xnYW0wMDM3IGxnYW1tYSAtMy41IC0+IC0xLjMwOTAwNjY4NDk5MzA0MgorCistLSB2YWx1ZXMgbmVhciAwCitsZ2FtMDA0MCBsZ2FtbWEgMC4xIC0+IDIuMjUyNzEyNjUxNzM0MjA2CitsZ2FtMDA0MSBsZ2FtbWEgMC4wMSAtPiA0LjU5OTQ3OTg3ODA0MjAyMTkKK2xnYW0wMDQyIGxnYW1tYSAxZS04IC0+IDE4LjQyMDY4MDczODE4MDIwOQorbGdhbTAwNDMgbGdhbW1hIDFlLTE2IC0+IDM2Ljg0MTM2MTQ4NzkwNDczNAorbGdhbTAwNDQgbGdhbW1hIDFlLTMwIC0+IDY5LjA3NzU1Mjc4OTgyMTM2OAorbGdhbTAwNDUgbGdhbW1hIDFlLTE2MCAtPiAzNjguNDEzNjE0ODc5MDQ3MzIKK2xnYW0wMDQ2IGxnYW1tYSAxZS0zMDggLT4gNzA5LjE5NjIwODY0MjE2NjA4CitsZ2FtMDA0NyBsZ2FtbWEgNS42ZS0zMDkgLT4gNzA5Ljc3NjAyNzEzNzQxODk2CitsZ2FtMDA0OCBsZ2FtbWEgNS41ZS0zMDkgLT4gNzA5Ljc5NDA0NTY0MjkyMTY3CitsZ2FtMDA0OSBsZ2FtbWEgMWUtMzA5IC0+IDcxMS40OTg3OTM3MzUxNjAxMgorbGdhbTAwNTAgbGdhbW1hIDFlLTMyMyAtPiA3NDMuNzQ2OTI0NzQwODIxMzMKK2xnYW0wMDUxIGxnYW1tYSA1ZS0zMjQgLT4gNzQ0LjQ0MDA3MTkyMTM4MTIyCitsZ2FtMDA2MCBsZ2FtbWEgLTAuMSAtPiAyLjM2ODk2MTMzMjcyODc4ODYKK2xnYW0wMDYxIGxnYW1tYSAtMC4wMSAtPiA0LjYxMTAyNDk5Mjc1MjgwMTMKK2xnYW0wMDYyIGxnYW1tYSAtMWUtOCAtPiAxOC40MjA2ODA3NDk3MjQ1MjIKK2xnYW0wMDYzIGxnYW1tYSAtMWUtMTYgLT4gMzYuODQxMzYxNDg3OTA0NzM0CitsZ2FtMDA2NCBsZ2FtbWEgLTFlLTMwIC0+IDY5LjA3NzU1Mjc4OTgyMTM2OAorbGdhbTAwNjUgbGdhbW1hIC0xZS0xNjAgLT4gMzY4LjQxMzYxNDg3OTA0NzMyCitsZ2FtMDA2NiBsZ2FtbWEgLTFlLTMwOCAtPiA3MDkuMTk2MjA4NjQyMTY2MDgKK2xnYW0wMDY3IGxnYW1tYSAtNS42ZS0zMDkgLT4gNzA5Ljc3NjAyNzEzNzQxODk2CitsZ2FtMDA2OCBsZ2FtbWEgLTUuNWUtMzA5IC0+IDcwOS43OTQwNDU2NDI5MjE2NworbGdhbTAwNjkgbGdhbW1hIC0xZS0zMDkgLT4gNzExLjQ5ODc5MzczNTE2MDEyCitsZ2FtMDA3MCBsZ2FtbWEgLTFlLTMyMyAtPiA3NDMuNzQ2OTI0NzQwODIxMzMKK2xnYW0wMDcxIGxnYW1tYSAtNWUtMzI0IC0+IDc0NC40NDAwNzE5MjEzODEyMgorCistLSB2YWx1ZXMgbmVhciBuZWdhdGl2ZSBpbnRlZ2VycworbGdhbTAwODAgbGdhbW1hIC0wLjk5OTk5OTk5OTk5OTk5OTg5IC0+IDM2LjczNjgwMDU2OTY3NzEwMQorbGdhbTAwODEgbGdhbW1hIC0xLjAwMDAwMDAwMDAwMDAwMDIgLT4gMzYuMDQzNjUzMzg5MTE3MTU0CitsZ2FtMDA4MiBsZ2FtbWEgLTEuOTk5OTk5OTk5OTk5OTk5OCAtPiAzNS4zNTA1MDYyMDg1NTcyMTMKK2xnYW0wMDgzIGxnYW1tYSAtMi4wMDAwMDAwMDAwMDAwMDA0IC0+IDM0LjY1NzM1OTAyNzk5NzI2NgorbGdhbTAwODQgbGdhbW1hIC0xMDAuMDAwMDAwMDAwMDAwMDEgLT4gLTMzMS44NTQ2MDUyNDk4MDYwNworbGdhbTAwODUgbGdhbW1hIC05OS45OTk5OTk5OTk5OTk5ODYgLT4gLTMzMS44NTQ2MDUyNDk4MDU5NgorCistLSBsYXJnZSBpbnB1dHMKK2xnYW0wMTAwIGxnYW1tYSAxNzAgLT4gNzAxLjQzNzI2MzgwODczNzA0CitsZ2FtMDEwMSBsZ2FtbWEgMTcxIC0+IDcwNi41NzMwNjIyNDU3ODczNgorbGdhbTAxMDIgbGdhbW1hIDE3MS42MjQgLT4gNzA5Ljc4MDc3NDQzNjY5ODk1CitsZ2FtMDEwMyBsZ2FtbWEgMTcxLjYyNSAtPiA3MDkuNzg1OTE2ODI5NDgzNjUKK2xnYW0wMTA0IGxnYW1tYSAxNzIgLT4gNzExLjcxNDcyNTgwMjI4OTk5CitsZ2FtMDEwNSBsZ2FtbWEgMjAwMCAtPiAxMzE5OC45MjM0NDgwNTQyNjUKK2xnYW0wMTA2IGxnYW1tYSAyLjU1OTk4MzMyNzg1MTYzZTMwNSAtPiAxLjc5NzY5MzEzNDg2MjMwOTllKzMwOAorbGdhbTAxMDcgbGdhbW1hIDIuNTU5OTgzMzI3ODUxNjRlMzA1IC0+IGluZiBvdmVyZmxvdworbGdhbTAxMDggbGdhbW1hIDEuN2UzMDggLT4gaW5mIG92ZXJmbG93CisKKy0tIGlucHV0cyBmb3Igd2hpY2ggZ2FtbWEoeCkgaXMgdGlueQorbGdhbTAxMjAgbGdhbW1hIC0xMDAuNSAtPiAtMzY0LjkwMDk2ODMwOTQyNzM2CitsZ2FtMDEyMSBsZ2FtbWEgLTE2MC41IC0+IC02NTYuODgwMDUyNjExMjY0MzIKK2xnYW0wMTIyIGxnYW1tYSAtMTcwLjUgLT4gLTcwNy45OTg0MzMxNDUwNzg4MgorbGdhbTAxMjMgbGdhbW1hIC0xNzEuNSAtPiAtNzEzLjE0MzAxNjQxMTY4NDgxCitsZ2FtMDEyNCBsZ2FtbWEgLTE3Ni41IC0+IC03MzguOTUyNDc1OTA4NDY0ODYKK2xnYW0wMTI1IGxnYW1tYSAtMTc3LjUgLT4gLTc0NC4xMzE0NDY1MTczODAzNworbGdhbTAxMjYgbGdhbW1hIC0xNzguNSAtPiAtNzQ5LjMxNjAzNTExODYwMDEKKworbGdhbTAxMzAgbGdhbW1hIC0xMDAwLjUgLT4gLTU5MTQuNDM3NzAxMTE2ODUxNworbGdhbTAxMzEgbGdhbW1hIC0zMDAwMC41IC0+IC0yNzkyNzguNjYyOTk1OTE0NAorbGdhbTAxMzIgbGdhbW1hIC00NTAzNTk5NjI3MzcwNDk1LjUgLT4gLTEuNTc4MjI1ODQzNDQ5Mjg4M2UrMTcKKworLS0gcmVzdWx0cyBjbG9zZSB0byAwOiAgcG9zaXRpdmUgYXJndW1lbnQgLi4uCitsZ2FtMDE1MCBsZ2FtbWEgMC45OTk5OTk5OTk5OTk5OTk4OSAtPiA2LjQwODM4MTIxMzQ4MDAwNzVlLTE3CitsZ2FtMDE1MSBsZ2FtbWEgMS4wMDAwMDAwMDAwMDAwMDAyIC0+IC0xLjI4MTY3NjI0MjY5NjAwMDhlLTE2CitsZ2FtMDE1MiBsZ2FtbWEgMS45OTk5OTk5OTk5OTk5OTk4IC0+IC05LjM4NzY5ODA2NTU0MzExNzBlLTE3CitsZ2FtMDE1MyBsZ2FtbWEgMi4wMDAwMDAwMDAwMDAwMDA0IC0+IDEuODc3NTM5NjEzMTA4NjI0NGUtMTYKKworLS0gLi4uIGFuZCBuZWdhdGl2ZSBhcmd1bWVudAorbGdhbTAxNjAgbGdhbW1hIC0yLjc0NzY4MjY0NjcgLT4gLTUuMjQ3NzQwODE0NzY4OTEzNmUtMTEKK2xnYW0wMTYxIGxnYW1tYSAtMi40NTcwMjQ3MzggLT4gMy4zNDY0NjM3NTQxOTEyOTMyZS0xMAorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZ2FtbWE6IEdhbW1hIGZ1bmN0aW9uIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gc3BlY2lhbCB2YWx1ZXMKK2dhbTAwMDAgZ2FtbWEgMC4wIC0+IGluZiAgICAgICAgZGl2aWRlLWJ5LXplcm8KK2dhbTAwMDEgZ2FtbWEgLTAuMCAtPiAtaW5mICAgICAgZGl2aWRlLWJ5LXplcm8KK2dhbTAwMDIgZ2FtbWEgaW5mIC0+IGluZgorZ2FtMDAwMyBnYW1tYSAtaW5mIC0+IG5hbiAgICAgICBpbnZhbGlkCitnYW0wMDA0IGdhbW1hIG5hbiAtPiBuYW4KKworLS0gbmVnYXRpdmUgaW50ZWdlcnMgaW5wdXRzIGFyZSBpbnZhbGlkCitnYW0wMDEwIGdhbW1hIC0xIC0+IG5hbiAgICAgICAgIGludmFsaWQKK2dhbTAwMTEgZ2FtbWEgLTIgLT4gbmFuICAgICAgICAgaW52YWxpZAorZ2FtMDAxMiBnYW1tYSAtMWUxNiAtPiBuYW4gICAgICBpbnZhbGlkCitnYW0wMDEzIGdhbW1hIC0xZTMwMCAtPiBuYW4gICAgIGludmFsaWQKKworLS0gc21hbGwgcG9zaXRpdmUgaW50ZWdlcnMgZ2l2ZSBmYWN0b3JpYWxzCitnYW0wMDIwIGdhbW1hIDEgLT4gMQorZ2FtMDAyMSBnYW1tYSAyIC0+IDEKK2dhbTAwMjIgZ2FtbWEgMyAtPiAyCitnYW0wMDIzIGdhbW1hIDQgLT4gNgorZ2FtMDAyNCBnYW1tYSA1IC0+IDI0CitnYW0wMDI1IGdhbW1hIDYgLT4gMTIwCisKKy0tIGhhbGYgaW50ZWdlcnMKK2dhbTAwMzAgZ2FtbWEgMC41IC0+IDEuNzcyNDUzODUwOTA1NTE2MQorZ2FtMDAzMSBnYW1tYSAxLjUgLT4gMC44ODYyMjY5MjU0NTI3NTgwNQorZ2FtMDAzMiBnYW1tYSAyLjUgLT4gMS4zMjkzNDAzODgxNzkxMzcwCitnYW0wMDMzIGdhbW1hIDMuNSAtPiAzLjMyMzM1MDk3MDQ0Nzg0MjYKK2dhbTAwMzQgZ2FtbWEgLTAuNSAtPiAtMy41NDQ5MDc3MDE4MTEwMzIyCitnYW0wMDM1IGdhbW1hIC0xLjUgLT4gMi4zNjMyNzE4MDEyMDczNTQ4CitnYW0wMDM2IGdhbW1hIC0yLjUgLT4gLTAuOTQ1MzA4NzIwNDgyOTQxOTAKK2dhbTAwMzcgZ2FtbWEgLTMuNSAtPiAwLjI3MDA4ODIwNTg1MjI2OTExCisKKy0tIHZhbHVlcyBuZWFyIDAKK2dhbTAwNDAgZ2FtbWEgMC4xIC0+IDkuNTEzNTA3Njk4NjY4NzMwNgorZ2FtMDA0MSBnYW1tYSAwLjAxIC0+IDk5LjQzMjU4NTExOTE1MDYwMgorZ2FtMDA0MiBnYW1tYSAxZS04IC0+IDk5OTk5OTk5LjQyMjc4NDM0MworZ2FtMDA0MyBnYW1tYSAxZS0xNiAtPiAxMDAwMDAwMDAwMDAwMDAwMAorZ2FtMDA0NCBnYW1tYSAxZS0zMCAtPiA5Ljk5OTk5OTk5OTk5OTk5ODhlKzI5CitnYW0wMDQ1IGdhbW1hIDFlLTE2MCAtPiAxLjAwMDAwMDAwMDAwMDAwMDBlKzE2MAorZ2FtMDA0NiBnYW1tYSAxZS0zMDggLT4gMS4wMDAwMDAwMDAwMDAwMDAwZSszMDgKK2dhbTAwNDcgZ2FtbWEgNS42ZS0zMDkgLT4gMS43ODU3MTQyODU3MTQyODQ4ZSszMDgKK2dhbTAwNDggZ2FtbWEgNS41ZS0zMDkgLT4gaW5mICAgb3ZlcmZsb3cKK2dhbTAwNDkgZ2FtbWEgMWUtMzA5IC0+IGluZiAgICAgb3ZlcmZsb3cKK2dhbTAwNTAgZ2FtbWEgMWUtMzIzIC0+IGluZiAgICAgb3ZlcmZsb3cKK2dhbTAwNTEgZ2FtbWEgNWUtMzI0IC0+IGluZiAgICAgb3ZlcmZsb3cKK2dhbTAwNjAgZ2FtbWEgLTAuMSAtPiAtMTAuNjg2Mjg3MDIxMTkzMTkzCitnYW0wMDYxIGdhbW1hIC0wLjAxIC0+IC0xMDAuNTg3MTk3OTY0NDEwNzgKK2dhbTAwNjIgZ2FtbWEgLTFlLTggLT4gLTEwMDAwMDAwMC41NzcyMTU2NworZ2FtMDA2MyBnYW1tYSAtMWUtMTYgLT4gLTEwMDAwMDAwMDAwMDAwMDAwCitnYW0wMDY0IGdhbW1hIC0xZS0zMCAtPiAtOS45OTk5OTk5OTk5OTk5OTg4ZSsyOQorZ2FtMDA2NSBnYW1tYSAtMWUtMTYwIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDBlKzE2MAorZ2FtMDA2NiBnYW1tYSAtMWUtMzA4IC0+IC0xLjAwMDAwMDAwMDAwMDAwMDBlKzMwOAorZ2FtMDA2NyBnYW1tYSAtNS42ZS0zMDkgLT4gLTEuNzg1NzE0Mjg1NzE0Mjg0OGUrMzA4CitnYW0wMDY4IGdhbW1hIC01LjVlLTMwOSAtPiAtaW5mIG92ZXJmbG93CitnYW0wMDY5IGdhbW1hIC0xZS0zMDkgLT4gLWluZiAgIG92ZXJmbG93CitnYW0wMDcwIGdhbW1hIC0xZS0zMjMgLT4gLWluZiAgIG92ZXJmbG93CitnYW0wMDcxIGdhbW1hIC01ZS0zMjQgLT4gLWluZiAgIG92ZXJmbG93CisKKy0tIHZhbHVlcyBuZWFyIG5lZ2F0aXZlIGludGVnZXJzCitnYW0wMDgwIGdhbW1hIC0wLjk5OTk5OTk5OTk5OTk5OTg5IC0+IC05MDA3MTk5MjU0NzQwOTkyLjAKK2dhbTAwODEgZ2FtbWEgLTEuMDAwMDAwMDAwMDAwMDAwMiAtPiA0NTAzNTk5NjI3MzcwNDk1LjUKK2dhbTAwODIgZ2FtbWEgLTEuOTk5OTk5OTk5OTk5OTk5OCAtPiAyMjUxNzk5ODEzNjg1MjQ4LjUKK2dhbTAwODMgZ2FtbWEgLTIuMDAwMDAwMDAwMDAwMDAwNCAtPiAtMTEyNTg5OTkwNjg0MjYyMy41CitnYW0wMDg0IGdhbW1hIC0xMDAuMDAwMDAwMDAwMDAwMDEgLT4gLTcuNTQwMDgzMzM0ODgzMTA5MGUtMTQ1CitnYW0wMDg1IGdhbW1hIC05OS45OTk5OTk5OTk5OTk5ODYgLT4gNy41NDAwODMzMzQ4ODQwOTYyZS0xNDUKKworLS0gbGFyZ2UgaW5wdXRzCitnYW0wMTAwIGdhbW1hIDE3MCAtPiA0LjI2OTA2ODAwOTAwNDcwNTFlKzMwNAorZ2FtMDEwMSBnYW1tYSAxNzEgLT4gNy4yNTc0MTU2MTUzMDc5OTkwZSszMDYKK2dhbTAxMDIgZ2FtbWEgMTcxLjYyNCAtPiAxLjc5NDIxMTc1OTkyNDgxMDRlKzMwOAorZ2FtMDEwMyBnYW1tYSAxNzEuNjI1IC0+IGluZiAgICBvdmVyZmxvdworZ2FtMDEwNCBnYW1tYSAxNzIgLT4gaW5mICAgICAgICBvdmVyZmxvdworZ2FtMDEwNSBnYW1tYSAyMDAwIC0+IGluZiAgICAgICBvdmVyZmxvdworZ2FtMDEwNiBnYW1tYSAxLjdlMzA4IC0+IGluZiAgICBvdmVyZmxvdworCistLSBpbnB1dHMgZm9yIHdoaWNoIGdhbW1hKHgpIGlzIHRpbnkKK2dhbTAxMjAgZ2FtbWEgLTEwMC41IC0+IC0zLjM1MzY5MDgxOTgwNzY3ODdlLTE1OQorZ2FtMDEyMSBnYW1tYSAtMTYwLjUgLT4gLTUuMjU1NTQ2NDQ3MDA3ODI5M2UtMjg2CitnYW0wMTIyIGdhbW1hIC0xNzAuNSAtPiAtMy4zMTI3Mzk1MjE1Mzg2MDc0ZS0zMDgKK2dhbTAxMjMgZ2FtbWEgLTE3MS41IC0+IDEuOTMxNjI2NTQzMTcxMTkwMmUtMzEwCitnYW0wMTI0IGdhbW1hIC0xNzYuNSAtPiAtMS4xOTU2Mzg4NjI5MzU4MTY2ZS0zMjEKK2dhbTAxMjUgZ2FtbWEgLTE3Ny41IC0+IDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0CitnYW0wMTI2IGdhbW1hIC0xNzguNSAtPiAtMC4wCitnYW0wMTI3IGdhbW1hIC0xNzkuNSAtPiAwLjAKK2dhbTAxMjggZ2FtbWEgLTIwMS4wMDAxIC0+IDAuMAorZ2FtMDEyOSBnYW1tYSAtMjAyLjk5OTkgLT4gLTAuMAorZ2FtMDEzMCBnYW1tYSAtMTAwMC41IC0+IC0wLjAKK2dhbTAxMzEgZ2FtbWEgLTEwMDAwMDAwMDAuMyAtPiAtMC4wCitnYW0wMTMyIGdhbW1hIC00NTAzNTk5NjI3MzcwNDk1LjUgLT4gMC4wCisKKy0tIGlucHV0cyB0aGF0IGNhdXNlIHByb2JsZW1zIGZvciB0aGUgc3RhbmRhcmQgcmVmbGVjdGlvbiBmb3JtdWxhLAorLS0gdGhhbmtzIHRvIGxvc3Mgb2YgYWNjdXJhY3kgaW4gMS14CitnYW0wMTQwIGdhbW1hIC02My4zNDkwNzg3MjkwMjI5ODUgLT4gNC4xNzc3OTcxNjc3NzYxODgwZS04OAorZ2FtMDE0MSBnYW1tYSAtMTI3LjQ1MTE3NjMyOTQzMjk1IC0+IDEuMTgzMTExMDg5NjIzNjgxMGUtMjE0CisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGV4cG0xOiBleHAoeCkgLSAxLCB3aXRob3V0IHByZWNpc2lvbiBsb3NzIGZvciBzbWFsbCB4IC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSBzcGVjaWFsIHZhbHVlcworZXhwbTEwMDAwIGV4cG0xIDAuMCAtPiAwLjAKK2V4cG0xMDAwMSBleHBtMSAtMC4wIC0+IC0wLjAKK2V4cG0xMDAwMiBleHBtMSBpbmYgLT4gaW5mCitleHBtMTAwMDMgZXhwbTEgLWluZiAtPiAtMS4wCitleHBtMTAwMDQgZXhwbTEgbmFuIC0+IG5hbgorCistLSBleHBtMSh4KSB+IHggZm9yIHRpbnkgeAorZXhwbTEwMDEwIGV4cG0xIDVlLTMyNCAtPiA1ZS0zMjQKK2V4cG0xMDAxMSBleHBtMSAxZS0zMjAgLT4gMWUtMzIwCitleHBtMTAwMTIgZXhwbTEgMWUtMzAwIC0+IDFlLTMwMAorZXhwbTEwMDEzIGV4cG0xIDFlLTE1MCAtPiAxZS0xNTAKK2V4cG0xMDAxNCBleHBtMSAxZS0yMCAtPiAxZS0yMAorCitleHBtMTAwMjAgZXhwbTEgLTVlLTMyNCAtPiAtNWUtMzI0CitleHBtMTAwMjEgZXhwbTEgLTFlLTMyMCAtPiAtMWUtMzIwCitleHBtMTAwMjIgZXhwbTEgLTFlLTMwMCAtPiAtMWUtMzAwCitleHBtMTAwMjMgZXhwbTEgLTFlLTE1MCAtPiAtMWUtMTUwCitleHBtMTAwMjQgZXhwbTEgLTFlLTIwIC0+IC0xZS0yMAorCistLSBtb2RlcmF0ZSBzaXplZCB2YWx1ZXMsIHdoZXJlIGRpcmVjdCBldmFsdWF0aW9uIHJ1bnMgaW50byB0cm91YmxlCitleHBtMTAxMDAgZXhwbTEgMWUtMTAgLT4gMS4wMDAwMDAwMDAwNTAwMDAwZS0xMAorZXhwbTEwMTAxIGV4cG0xIC05Ljk5OTk5OTk5OTk5OTk5OTVlLTA4IC0+IC05Ljk5OTk5OTUwMDAwMDAxNjNlLTgKK2V4cG0xMDEwMiBleHBtMSAzLjAwMDAwMDAwMDAwMDAwMDFlLTA1IC0+IDMuMDAwMDQ1MDAwNDUwMDAzNGUtNQorZXhwbTEwMTAzIGV4cG0xIC0wLjAwNzAwMDAwMDAwMDAwMDAwMDEgLT4gLTAuMDA2OTc1NTU3MDY2NzY0ODk1MQorZXhwbTEwMTA0IGV4cG0xIC0wLjA3MTQ5OTIwODc0MDA5NDYzMyAtPiAtMC4wNjkwMDI5ODU3NDQ4MjAyNTAKK2V4cG0xMDEwNSBleHBtMSAtMC4wNjMyOTYwMDQxODAxMTY3OTkgLT4gLTAuMDYxMzM0NDE2MzczNjMzMDA5CitleHBtMTAxMDYgZXhwbTEgMC4wMjM5MDk1NDAzNTU5Nzc1NiAtPiAwLjAyNDE5NzY2NTE0MzgxOTk0MgorZXhwbTEwMTA3IGV4cG0xIDAuMDg1NjM3MzUyNjQ5MDQ0OTAxIC0+IDAuMDg5NDExMTg0NTgwMzU3NzY3CitleHBtMTAxMDggZXhwbTEgMC41OTY2MTc0OTQ3NDExMDA2IC0+IDAuODE1OTY1ODg1OTY1MDE0ODUKK2V4cG0xMDEwOSBleHBtMSAwLjMwMjQ3MjA2MjEyMDc1MTM5IC0+IDAuMzUzMTk5ODcwMzU4NDg2NzcKK2V4cG0xMDExMCBleHBtMSAwLjc0NTc0NzI3Mzc1ODg5NTE2IC0+IDEuMTA4MDE2MTExNjczNzQ1OQorZXhwbTEwMTExIGV4cG0xIDAuOTc3Njc1MTI5MjY1NTU3MTEgLT4gMS42NTgyNjg5MjA3MzcyMTg1CitleHBtMTAxMTIgZXhwbTEgMC44NDUwMTU0NTY2Nzg3NzEyIC0+IDEuMzI4MDEzNzk3NjUzNTg5NworZXhwbTEwMTEzIGV4cG0xIC0wLjEzOTc5MjYwMzIzMTI1MjY0IC0+IC0wLjEzMDQ2MTQ0MzgxMzk2MDYwCitleHBtMTAxMTQgZXhwbTEgLTAuNTI4OTkzMjIwMzk2NDMyNzEgLT4gLTAuNDEwODAyMTM2NDM2OTU5MjMKK2V4cG0xMDExNSBleHBtMSAtMC43NDA4MzI2MTQ3ODkwMDYzMSAtPiAtMC41MjMyODMxNzEyNDc5NzA5NworZXhwbTEwMTE2IGV4cG0xIC0wLjkzODQ3NzY2OTg0NTQ2MDU1IC0+IC0wLjYwODc3NzA0NzI0MDg1OTQ2CitleHBtMTAxMTcgZXhwbTEgMTAuMCAtPiAyMjAyNS40NjU3OTQ4MDY3MTgKK2V4cG0xMDExOCBleHBtMSAyNy4wIC0+IDUzMjA0ODI0MDYwMC43OTg2NQorZXhwbTEwMTE5IGV4cG0xIDEyMyAtPiAyLjYxOTUxNzMxODc0OTA2MjZlKzUzCitleHBtMTAxMjAgZXhwbTEgLTEyLjAgLT4gLTAuOTk5OTkzODU1Nzg3NjQ2NjYKK2V4cG0xMDEyMSBleHBtMSAtMzUuMTAwMDAwMDAwMDAwMDAxIC0+IC0wLjk5OTk5OTk5OTk5OTk5OTQ0CisKKy0tIGV4dHJlbWUgbmVnYXRpdmUgdmFsdWVzCitleHBtMTAyMDEgZXhwbTEgLTM3LjAgLT4gLTAuOTk5OTk5OTk5OTk5OTk5ODkKK2V4cG0xMDIwMCBleHBtMSAtMzguMCAtPiAtMS4wCitleHBtMTAyMTAgZXhwbTEgLTcxMC4wIC0+IC0xLjAKKy0tIHRoZSBmb3JtdWxhIGV4cG0xKHgpID0gMiAqIHNpbmgoeC8yKSAqIGV4cCh4LzIpIGRvZXNuJ3Qgd29yayBzbworLS0gd2VsbCB3aGVuIGV4cCh4LzIpIGlzIHN1Ym5vcm1hbCBvciB1bmRlcmZsb3dzIHRvIHplcm87IGNoZWNrIHdlJ3JlCistLSBub3QgdXNpbmcgaXQhCitleHBtMTAyMTEgZXhwbTEgLTE0MjAuMCAtPiAtMS4wCitleHBtMTAyMTIgZXhwbTEgLTE0NTAuMCAtPiAtMS4wCitleHBtMTAyMTMgZXhwbTEgLTE1MDAuMCAtPiAtMS4wCitleHBtMTAyMTQgZXhwbTEgLTFlNTAgLT4gLTEuMAorZXhwbTEwMjE1IGV4cG0xIC0xLjc5ZTMwOCAtPiAtMS4wCisKKy0tIGV4dHJlbWUgcG9zaXRpdmUgdmFsdWVzCitleHBtMTAzMDAgZXhwbTEgMzAwIC0+IDEuOTQyNDI2Mzk1MjQxMjU1OGUrMTMwCitleHBtMTAzMDEgZXhwbTEgNzAwIC0+IDEuMDE0MjMyMDU0NzM1MDA0NWUrMzA0CistLSB0aGUgbmV4dCB0ZXN0IChleHBtMTAzMDIpIGlzIGRpc2FibGVkIGJlY2F1c2UgaXQgY2F1c2VzIGZhaWx1cmUgb24KKy0tIE9TIFggMTAuNC9JbnRlbDogYXBwYXJlbnRseSBhbGwgdmFsdWVzIG92ZXIgNzA5Ljc4IHByb2R1Y2UgYW4KKy0tIG92ZXJmbG93IG9uIHRoYXQgcGxhdGZvcm0uICBTZWUgaXNzdWUgIzc1NzUuCistLSBleHBtMTAzMDIgZXhwbTEgNzA5Ljc4MjcxMjg5MzI4MzkzIC0+IDEuNzk3NjkzMTM0NjgyNDI0MGUrMzA4CitleHBtMTAzMDMgZXhwbTEgNzA5Ljc4MjcxMjg5MzQ4NDAyIC0+IGluZiBvdmVyZmxvdworZXhwbTEwMzA0IGV4cG0xIDEwMDAgLT4gaW5mIG92ZXJmbG93CitleHBtMTAzMDUgZXhwbTEgMWU1MCAtPiBpbmYgb3ZlcmZsb3cKK2V4cG0xMDMwNiBleHBtMSAxLjc5ZTMwOCAtPiBpbmYgb3ZlcmZsb3cKKworLS0gd2Vha2VyIHZlcnNpb24gb2YgZXhwbTEwMzAyCitleHBtMTAzMDcgZXhwbTEgNzA5LjUgLT4gMS4zNTQ5ODYzMTkzMTQ2MzI4ZSszMDgKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9tcF9mb3JrX2JvbWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvbXBfZm9ya19ib21iLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyY2VhMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvbXBfZm9ya19ib21iLnB5CkBAIC0wLDAgKzEsMTYgQEAKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKKworZGVmIGZvbyhjb25uKToKKyAgICBjb25uLnNlbmQoIjEyMyIpCisKKyMgQmVjYXVzZSAiaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJyIgaXMgbWlzc2luZyB0aGlzIHdpbGwgbm90IHdvcmsKKyMgY29ycmVjdGx5IG9uIFdpbmRvd3MuICBIb3dldmVyLCB3ZSBzaG91bGQgZ2V0IGEgUnVudGltZUVycm9yIHJhdGhlcgorIyB0aGFuIHRoZSBXaW5kb3dzIGVxdWl2YWxlbnQgb2YgYSBmb3JrIGJvbWIuCisKK3IsIHcgPSBtdWx0aXByb2Nlc3NpbmcuUGlwZShGYWxzZSkKK3AgPSBtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcyh0YXJnZXQ9Zm9vLCBhcmdzPSh3LCkpCitwLnN0YXJ0KCkKK3cuY2xvc2UoKQorcHJpbnQoci5yZWN2KCkpCityLmNsb3NlKCkKK3Auam9pbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvbXBfZm9ya19ib21iLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9tcF9mb3JrX2JvbWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjY1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvbXBfZm9ya19ib21iLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvbXBfZm9ya19ib21iLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9tcF9mb3JrX2JvbWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjY1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvbXBfZm9ya19ib21iLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvbm9raWEucGVtIGIvbGliL3B5dGhvbjIuNy90ZXN0L25va2lhLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDA0NGRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L25va2lhLnBlbQpAQCAtMCwwICsxLDMxIEBACisjIENlcnRpZmljYXRlIGZvciBwcm9qZWN0cy5kZXZlbG9wZXIubm9raWEuY29tOjQ0MyAoc2VlIGlzc3VlIDEzMDM0KQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGTERDQ0JCU2dBd0lCQWdJUUx1YnFka0NnZGM3bEFGOU5mSGxVbWpBTkJna3Foa2lHOXcwQkFRVUZBRENCCit2REVMTUFrR0ExVUVCaE1DVlZNeEZ6QVZCZ05WQkFvVERsWmxjbWxUYVdkdUxDQkpibU11TVI4d0hRWURWUVFMCitFeFpXWlhKcFUybG5iaUJVY25WemRDQk9aWFIzYjNKck1Uc3dPUVlEVlFRTEV6SlVaWEp0Y3lCdlppQjFjMlVnCitZWFFnYUhSMGNITTZMeTkzZDNjdWRtVnlhWE5wWjI0dVkyOXRMM0p3WVNBb1l5a3hNREUyTURRR0ExVUVBeE10CitWbVZ5YVZOcFoyNGdRMnhoYzNNZ015QkpiblJsY201aGRHbHZibUZzSUZObGNuWmxjaUJEUVNBdElFY3pNQjRYCitEVEV4TURreU1UQXdNREF3TUZvWERURXlNRGt5TURJek5UazFPVm93Y1RFTE1Ba0dBMVVFQmhNQ1Jra3hEakFNCitCZ05WQkFnVEJVVnpjRzl2TVE0d0RBWURWUVFIRkFWRmMzQnZiekVPTUF3R0ExVUVDaFFGVG05cmFXRXhDekFKCitCZ05WQkFzVUFrSkpNU1V3SXdZRFZRUURGQnh3Y205cVpXTjBjeTVrWlhabGJHOXdaWEl1Ym05cmFXRXVZMjl0CitNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUUNyOTJ3MWJwSFlTWXhVRXg4Ti84SWRkZGEyCitsWWkrYVhOdFFmVi9sMkZ3OVlrdjNJcHc0bkxlR1RqMThGRmxBWmdNZFBSbGdyekYvTk5YR3cvOWwzL3FLZG93CitDeXBrUWY4bExheGI5WmUxRS9LS21rUkphNDhRVE9xdm82R3FLdVRJNkhDZUdsRzFSeERiOFlTS2NRV0xpeXRuCit5ajNXcDRNZ1JRTzI2NnhtTVFJREFRQUJvNElCOWpDQ0FmSXdRUVlEVlIwUkJEb3dPSUljY0hKdmFtVmpkSE11CitaR1YyWld4dmNHVnlMbTV2YTJsaExtTnZiWUlZY0hKdmFtVmpkSE11Wm05eWRXMHVibTlyYVdFdVkyOXRNQWtHCitBMVVkRXdRQ01BQXdDd1lEVlIwUEJBUURBZ1dnTUVFR0ExVWRId1E2TURnd05xQTBvREtHTUdoMGRIQTZMeTlUCitWbEpKYm5Sc0xVY3pMV055YkM1MlpYSnBjMmxuYmk1amIyMHZVMVpTU1c1MGJFY3pMbU55YkRCRUJnTlZIU0FFCitQVEE3TURrR0MyQ0dTQUdHK0VVQkJ4Y0RNQ293S0FZSUt3WUJCUVVIQWdFV0hHaDBkSEJ6T2k4dmQzZDNMblpsCitjbWx6YVdkdUxtTnZiUzl5Y0dFd0tBWURWUjBsQkNFd0h3WUpZSVpJQVliNFFnUUJCZ2dyQmdFRkJRY0RBUVlJCitLd1lCQlFVSEF3SXdjZ1lJS3dZQkJRVUhBUUVFWmpCa01DUUdDQ3NHQVFVRkJ6QUJoaGhvZEhSd09pOHZiMk56CitjQzUyWlhKcGMybG5iaTVqYjIwd1BBWUlLd1lCQlFVSE1BS0dNR2gwZEhBNkx5OVRWbEpKYm5Sc0xVY3pMV0ZwCitZUzUyWlhKcGMybG5iaTVqYjIwdlUxWlNTVzUwYkVjekxtTmxjakJ1QmdnckJnRUZCUWNCREFSaU1HQ2hYcUJjCitNRm93V0RCV0ZnbHBiV0ZuWlM5bmFXWXdJVEFmTUFjR0JTc09Bd0lhQkJSTGE3a29sZ1lNdTlCU09Kc3ByRXNICitpeUVGR0RBbUZpUm9kSFJ3T2k4dmJHOW5ieTUyWlhKcGMybG5iaTVqYjIwdmRuTnNiMmR2TVM1bmFXWXdEUVlKCitLb1pJaHZjTkFRRUZCUUFEZ2dFQkFDUXVQeUlKcVh3VXlGUld3OXg1eURYZ01XNHpZRm9wUVlPdy9JdFJZNTIyCitPNUJzeVNUaDU2QldTNm1RQjA3WFZmeG1ZVUdBdlJRREE1UUhwbVk4aklsTndTbU4zczhSS28rZkF0aU5SbGNMCit4L21XU2Z1TXMzRC9TNmV2M0Q2K2RwRU1adGpyaE9kY3RzYXJNS3A4bi9oUGJ3aEFiZzVoVmpwa1c1bjh2ejJ5CiswS3h2dmtBMUF4cEx3cFZ2N09sSzE3dHR6SUh3OGJwOUhUbEhCVTVzOGJLejRhNTY1Vi9hNUhJMENTRXYvKzB5CitrbzQvZ2hUblpjMUNrbVVuZ0tLZUZNU2FoL21UL3hBaDhYbkUybDFBYXpGYThVS3VZa2kxZStBckhhR1pjNGl4CitVWU90aVJwaHdmdVlRaFJaN3FYOXEyTU1rQ01JNjVYTksvU2FGckFiYkcwPQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L251bGxjZXJ0LnBlbSBiL2xpYi9weXRob24yLjcvdGVzdC9udWxsY2VydC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9udWxsY2VydC5wZW0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L291dHN0YW5kaW5nX2J1Z3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhZmNiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5CkBAIC0wLDAgKzEsMjIgQEAKKyMKKyMgVGhpcyBmaWxlIGlzIGZvciBldmVyeWJvZHkgdG8gYWRkIHRlc3RzIGZvciBidWdzIHRoYXQgYXJlbid0CisjIGZpeGVkIHlldC4gUGxlYXNlIGFkZCBhIHRlc3QgY2FzZSBhbmQgYXBwcm9wcmlhdGUgYnVnIGRlc2NyaXB0aW9uLgorIworIyBXaGVuIHlvdSBmaXggb25lIG9mIHRoZSBidWdzLCBwbGVhc2UgbW92ZSB0aGUgdGVzdCB0byB0aGUgY29ycmVjdAorIyB0ZXN0XyBtb2R1bGUuCisjCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIworIyBObyB0ZXN0IGNhc2VzIGZvciBvdXRzdGFuZGluZyBidWdzIGF0IHRoZSBtb21lbnQuCisjCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgICN0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCkKKyAgICBwYXNzCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTUyNzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L291dHN0YW5kaW5nX2J1Z3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTUyNzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L291dHN0YW5kaW5nX2J1Z3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9waWNrbGV0ZXN0ZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvcGlja2xldGVzdGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Y2FmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcGlja2xldGVzdGVyLnB5CkBAIC0wLDAgKzEsMTMxOSBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgcGlja2xlCitpbXBvcnQgY1BpY2tsZQoraW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgY1N0cmluZ0lPCitpbXBvcnQgcGlja2xldG9vbHMKK2ltcG9ydCBjb3B5X3JlZworCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0RmFpbGVkLCB2ZXJib3NlLCBoYXZlX3VuaWNvZGUsIFRFU1RGTgordHJ5OgorICAgIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IF8yRywgXzFNLCBwcmVjaXNpb25iaWdtZW10ZXN0CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyB0aGlzIGltcG9ydCBtaWdodCBmYWlsIHdoZW4gcnVuIG9uIG9sZGVyIFB5dGhvbiB2ZXJzaW9ucyBieSB0ZXN0X3hwaWNrbGUKKyAgICBfMkcgPSBfMU0gPSAwCisgICAgZGVmIHByZWNpc2lvbmJpZ21lbXRlc3QoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIGxhbWJkYSBzZWxmOiBOb25lCisKKyMgVGVzdHMgdGhhdCB0cnkgYSBudW1iZXIgb2YgcGlja2xlIHByb3RvY29scyBzaG91bGQgaGF2ZSBhCisjICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorIyBraW5kIG9mIG91dGVyIGxvb3AuCithc3NlcnQgcGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgPT0gY1BpY2tsZS5ISUdIRVNUX1BST1RPQ09MID09IDIKK3Byb3RvY29scyA9IHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSkKKworIyBDb3B5IG9mIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl93aXRoX2xvY2FsZS4gVGhpcyBpcyBuZWVkZWQgdG8gc3VwcG9ydCBQeXRob24KKyMgMi40LCB3aGljaCBkaWRuJ3QgaW5jbHVkZSBpdC4gVGhpcyBpcyBhbGwgdG8gc3VwcG9ydCB0ZXN0X3hwaWNrbGUsIHdoaWNoCisjIGJvdW5jZXMgcGlja2xlZCBvYmplY3RzIHRocm91Z2ggb2xkZXIgUHl0aG9uIHZlcnNpb25zIHRvIHRlc3QgYmFja3dhcmRzCisjIGNvbXBhdGliaWxpdHkuCitkZWYgcnVuX3dpdGhfbG9jYWxlKGNhdHN0ciwgKmxvY2FsZXMpOgorICAgIGRlZiBkZWNvcmF0b3IoZnVuYyk6CisgICAgICAgIGRlZiBpbm5lcigqYXJncywgKiprd2RzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgbG9jYWxlCisgICAgICAgICAgICAgICAgY2F0ZWdvcnkgPSBnZXRhdHRyKGxvY2FsZSwgY2F0c3RyKQorICAgICAgICAgICAgICAgIG9yaWdfbG9jYWxlID0gbG9jYWxlLnNldGxvY2FsZShjYXRlZ29yeSkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIGlmIHRoZSB0ZXN0IGF1dGhvciBnaXZlcyB1cyBhbiBpbnZhbGlkIGNhdGVnb3J5IHN0cmluZworICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBjYW5ub3QgcmV0cmlldmUgb3JpZ2luYWwgbG9jYWxlLCBzbyBkbyBub3RoaW5nCisgICAgICAgICAgICAgICAgbG9jYWxlID0gb3JpZ19sb2NhbGUgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBsb2MgaW4gbG9jYWxlczoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShjYXRlZ29yeSwgbG9jKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAjIG5vdyBydW4gdGhlIGZ1bmN0aW9uLCByZXNldHRpbmcgdGhlIGxvY2FsZSBvbiBleGNlcHRpb25zCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3dkcykKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgbG9jYWxlIGFuZCBvcmlnX2xvY2FsZToKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShjYXRlZ29yeSwgb3JpZ19sb2NhbGUpCisgICAgICAgIGlubmVyLmZ1bmNfbmFtZSA9IGZ1bmMuZnVuY19uYW1lCisgICAgICAgIGlubmVyLl9fZG9jX18gPSBmdW5jLl9fZG9jX18KKyAgICAgICAgcmV0dXJuIGlubmVyCisgICAgcmV0dXJuIGRlY29yYXRvcgorCisKKyMgUmV0dXJuIFRydWUgaWYgb3Bjb2RlIGNvZGUgYXBwZWFycyBpbiB0aGUgcGlja2xlLCBlbHNlIEZhbHNlLgorZGVmIG9wY29kZV9pbl9waWNrbGUoY29kZSwgcGlja2xlKToKKyAgICBmb3Igb3AsIGR1bW15LCBkdW1teSBpbiBwaWNrbGV0b29scy5nZW5vcHMocGlja2xlKToKKyAgICAgICAgaWYgb3AuY29kZSA9PSBjb2RlOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworIyBSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBvcGNvZGUgY29kZSBhcHBlYXJzIGluIHBpY2tsZS4KK2RlZiBjb3VudF9vcGNvZGUoY29kZSwgcGlja2xlKToKKyAgICBuID0gMAorICAgIGZvciBvcCwgZHVtbXksIGR1bW15IGluIHBpY2tsZXRvb2xzLmdlbm9wcyhwaWNrbGUpOgorICAgICAgICBpZiBvcC5jb2RlID09IGNvZGU6CisgICAgICAgICAgICBuICs9IDEKKyAgICByZXR1cm4gbgorCisjIFdlIGNhbid0IHZlcnkgd2VsbCB0ZXN0IHRoZSBleHRlbnNpb24gcmVnaXN0cnkgd2l0aG91dCBwdXR0aW5nIGtub3duIHN0dWZmCisjIGluIGl0LCBidXQgd2UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvIHJlc3RvcmUgaXRzIG9yaWdpbmFsIHN0YXRlLiAgQ29kZQorIyBzaG91bGQgZG8gdGhpczoKKyMKKyMgICAgIGUgPSBFeHRlbnNpb25TYXZlcihleHRlbnNpb25fY29kZSkKKyMgICAgIHRyeToKKyMgICAgICAgICBmaWRkbGUgdy8gdGhlIGV4dGVuc2lvbiByZWdpc3RyeSdzIHN0dWZmIGZvciBleHRlbnNpb25fY29kZQorIyAgICAgZmluYWxseToKKyMgICAgICAgICBlLnJlc3RvcmUoKQorCitjbGFzcyBFeHRlbnNpb25TYXZlcjoKKyAgICAjIFJlbWVtYmVyIGN1cnJlbnQgcmVnaXN0cmF0aW9uIGZvciBjb2RlIChpZiBhbnkpLCBhbmQgcmVtb3ZlIGl0IChpZgorICAgICMgdGhlcmUgaXMgb25lKS4KKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29kZSk6CisgICAgICAgIHNlbGYuY29kZSA9IGNvZGUKKyAgICAgICAgaWYgY29kZSBpbiBjb3B5X3JlZy5faW52ZXJ0ZWRfcmVnaXN0cnk6CisgICAgICAgICAgICBzZWxmLnBhaXIgPSBjb3B5X3JlZy5faW52ZXJ0ZWRfcmVnaXN0cnlbY29kZV0KKyAgICAgICAgICAgIGNvcHlfcmVnLnJlbW92ZV9leHRlbnNpb24oc2VsZi5wYWlyWzBdLCBzZWxmLnBhaXJbMV0sIGNvZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnBhaXIgPSBOb25lCisKKyAgICAjIFJlc3RvcmUgcHJldmlvdXMgcmVnaXN0cmF0aW9uIGZvciBjb2RlLgorICAgIGRlZiByZXN0b3JlKHNlbGYpOgorICAgICAgICBjb2RlID0gc2VsZi5jb2RlCisgICAgICAgIGN1cnBhaXIgPSBjb3B5X3JlZy5faW52ZXJ0ZWRfcmVnaXN0cnkuZ2V0KGNvZGUpCisgICAgICAgIGlmIGN1cnBhaXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb3B5X3JlZy5yZW1vdmVfZXh0ZW5zaW9uKGN1cnBhaXJbMF0sIGN1cnBhaXJbMV0sIGNvZGUpCisgICAgICAgIHBhaXIgPSBzZWxmLnBhaXIKKyAgICAgICAgaWYgcGFpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvcHlfcmVnLmFkZF9leHRlbnNpb24ocGFpclswXSwgcGFpclsxXSwgY29kZSkKKworY2xhc3MgQzoKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBjbXAoc2VsZi5fX2RpY3RfXywgb3RoZXIuX19kaWN0X18pCisKK2ltcG9ydCBfX21haW5fXworX19tYWluX18uQyA9IEMKK0MuX19tb2R1bGVfXyA9ICJfX21haW5fXyIKKworY2xhc3MgbXlpbnQoaW50KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgIHNlbGYuc3RyID0gc3RyKHgpCisKK2NsYXNzIGluaXRhcmcoQyk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYSwgYik6CisgICAgICAgIHNlbGYuYSA9IGEKKyAgICAgICAgc2VsZi5iID0gYgorCisgICAgZGVmIF9fZ2V0aW5pdGFyZ3NfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYSwgc2VsZi5iCisKK2NsYXNzIG1ldGFjbGFzcyh0eXBlKToKKyAgICBwYXNzCisKK2NsYXNzIHVzZV9tZXRhY2xhc3Mob2JqZWN0KToKKyAgICBfX21ldGFjbGFzc19fID0gbWV0YWNsYXNzCisKK2NsYXNzIHBpY2tsaW5nX21ldGFjbGFzcyh0eXBlKToKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuICh0eXBlKHNlbGYpID09IHR5cGUob3RoZXIpIGFuZAorICAgICAgICAgICAgICAgIHNlbGYucmVkdWNlX2FyZ3MgPT0gb3RoZXIucmVkdWNlX2FyZ3MpCisKKyAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChjcmVhdGVfZHluYW1pY19jbGFzcywgc2VsZi5yZWR1Y2VfYXJncykKKworICAgIF9faGFzaF9fID0gTm9uZQorCitkZWYgY3JlYXRlX2R5bmFtaWNfY2xhc3MobmFtZSwgYmFzZXMpOgorICAgIHJlc3VsdCA9IHBpY2tsaW5nX21ldGFjbGFzcyhuYW1lLCBiYXNlcywgZGljdCgpKQorICAgIHJlc3VsdC5yZWR1Y2VfYXJncyA9IChuYW1lLCBiYXNlcykKKyAgICByZXR1cm4gcmVzdWx0CisKKyMgREFUQTAgLi4gREFUQTIgYXJlIHRoZSBwaWNrbGVzIHdlIGV4cGVjdCB1bmRlciB0aGUgdmFyaW91cyBwcm90b2NvbHMsIGZvcgorIyB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IGNyZWF0ZV9kYXRhKCkuCisKKyMgYnJlYWsgaW50byBtdWx0aXBsZSBzdHJpbmdzIHRvIGF2b2lkIGNvbmZ1c2luZyBmb250LWxvY2stbW9kZQorREFUQTAgPSAiIiIobHAxCitJMAorYUwxTAorYUYyCithY19fYnVpbHRpbl9fCitjb21wbGV4CitwMgorIiIiICsgXAorIiIiKEYzCitGMAordFJwMworYUkxCithSS0xCithSTI1NQorYUktMjU1CithSS0yNTYKK2FJNjU1MzUKK2FJLTY1NTM1CithSS02NTUzNgorYUkyMTQ3NDgzNjQ3CithSS0yMTQ3NDgzNjQ3CithSS0yMTQ3NDgzNjQ4CithIiIiICsgXAorIiIiKFMnYWJjJworcDQKK2c0CisiIiIgKyBcCisiIiIoaV9fbWFpbl9fCitDCitwNQorIiIiICsgXAorIiIiKGRwNgorUydmb28nCitwNworSTEKK3NTJ2JhcicKK3A4CitJMgorc2JnNQordHA5CithZzkKK2FJNQorYS4KKyIiIgorCisjIERpc2Fzc2VtYmx5IG9mIERBVEEwLgorREFUQTBfRElTID0gIiIiXAorICAgIDA6ICggICAgTUFSSworICAgIDE6IGwgICAgICAgIExJU1QgICAgICAgKE1BUksgYXQgMCkKKyAgICAyOiBwICAgIFBVVCAgICAgICAgMQorICAgIDU6IEkgICAgSU5UICAgICAgICAwCisgICAgODogYSAgICBBUFBFTkQKKyAgICA5OiBMICAgIExPTkcgICAgICAgMUwKKyAgIDEzOiBhICAgIEFQUEVORAorICAgMTQ6IEYgICAgRkxPQVQgICAgICAyLjAKKyAgIDE3OiBhICAgIEFQUEVORAorICAgMTg6IGMgICAgR0xPQkFMICAgICAnX19idWlsdGluX18gY29tcGxleCcKKyAgIDM5OiBwICAgIFBVVCAgICAgICAgMgorICAgNDI6ICggICAgTUFSSworICAgNDM6IEYgICAgICAgIEZMT0FUICAgICAgMy4wCisgICA0NjogRiAgICAgICAgRkxPQVQgICAgICAwLjAKKyAgIDQ5OiB0ICAgICAgICBUVVBMRSAgICAgIChNQVJLIGF0IDQyKQorICAgNTA6IFIgICAgUkVEVUNFCisgICA1MTogcCAgICBQVVQgICAgICAgIDMKKyAgIDU0OiBhICAgIEFQUEVORAorICAgNTU6IEkgICAgSU5UICAgICAgICAxCisgICA1ODogYSAgICBBUFBFTkQKKyAgIDU5OiBJICAgIElOVCAgICAgICAgLTEKKyAgIDYzOiBhICAgIEFQUEVORAorICAgNjQ6IEkgICAgSU5UICAgICAgICAyNTUKKyAgIDY5OiBhICAgIEFQUEVORAorICAgNzA6IEkgICAgSU5UICAgICAgICAtMjU1CisgICA3NjogYSAgICBBUFBFTkQKKyAgIDc3OiBJICAgIElOVCAgICAgICAgLTI1NgorICAgODM6IGEgICAgQVBQRU5ECisgICA4NDogSSAgICBJTlQgICAgICAgIDY1NTM1CisgICA5MTogYSAgICBBUFBFTkQKKyAgIDkyOiBJICAgIElOVCAgICAgICAgLTY1NTM1CisgIDEwMDogYSAgICBBUFBFTkQKKyAgMTAxOiBJICAgIElOVCAgICAgICAgLTY1NTM2CisgIDEwOTogYSAgICBBUFBFTkQKKyAgMTEwOiBJICAgIElOVCAgICAgICAgMjE0NzQ4MzY0NworICAxMjI6IGEgICAgQVBQRU5ECisgIDEyMzogSSAgICBJTlQgICAgICAgIC0yMTQ3NDgzNjQ3CisgIDEzNjogYSAgICBBUFBFTkQKKyAgMTM3OiBJICAgIElOVCAgICAgICAgLTIxNDc0ODM2NDgKKyAgMTUwOiBhICAgIEFQUEVORAorICAxNTE6ICggICAgTUFSSworICAxNTI6IFMgICAgICAgIFNUUklORyAgICAgJ2FiYycKKyAgMTU5OiBwICAgICAgICBQVVQgICAgICAgIDQKKyAgMTYyOiBnICAgICAgICBHRVQgICAgICAgIDQKKyAgMTY1OiAoICAgICAgICBNQVJLCisgIDE2NjogaSAgICAgICAgICAgIElOU1QgICAgICAgJ19fbWFpbl9fIEMnIChNQVJLIGF0IDE2NSkKKyAgMTc4OiBwICAgICAgICBQVVQgICAgICAgIDUKKyAgMTgxOiAoICAgICAgICBNQVJLCisgIDE4MjogZCAgICAgICAgICAgIERJQ1QgICAgICAgKE1BUksgYXQgMTgxKQorICAxODM6IHAgICAgICAgIFBVVCAgICAgICAgNgorICAxODY6IFMgICAgICAgIFNUUklORyAgICAgJ2ZvbycKKyAgMTkzOiBwICAgICAgICBQVVQgICAgICAgIDcKKyAgMTk2OiBJICAgICAgICBJTlQgICAgICAgIDEKKyAgMTk5OiBzICAgICAgICBTRVRJVEVNCisgIDIwMDogUyAgICAgICAgU1RSSU5HICAgICAnYmFyJworICAyMDc6IHAgICAgICAgIFBVVCAgICAgICAgOAorICAyMTA6IEkgICAgICAgIElOVCAgICAgICAgMgorICAyMTM6IHMgICAgICAgIFNFVElURU0KKyAgMjE0OiBiICAgICAgICBCVUlMRAorICAyMTU6IGcgICAgICAgIEdFVCAgICAgICAgNQorICAyMTg6IHQgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgMTUxKQorICAyMTk6IHAgICAgUFVUICAgICAgICA5CisgIDIyMjogYSAgICBBUFBFTkQKKyAgMjIzOiBnICAgIEdFVCAgICAgICAgOQorICAyMjY6IGEgICAgQVBQRU5ECisgIDIyNzogSSAgICBJTlQgICAgICAgIDUKKyAgMjMwOiBhICAgIEFQUEVORAorICAyMzE6IC4gICAgU1RPUAoraGlnaGVzdCBwcm90b2NvbCBhbW9uZyBvcGNvZGVzID0gMAorIiIiCisKK0RBVEExID0gKCddcVx4MDEoS1x4MDBMMUxcbkdAXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcKKyAgICAgICAgICdjX19idWlsdGluX19cbmNvbXBsZXhcbnFceDAyKEdAXHgwOFx4MDBceDAwXHgwMFx4MDBceDAwJworICAgICAgICAgJ1x4MDBHXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDB0UnFceDAzS1x4MDFKXHhmZlx4ZmYnCisgICAgICAgICAnXHhmZlx4ZmZLXHhmZkpceDAxXHhmZlx4ZmZceGZmSlx4MDBceGZmXHhmZlx4ZmZNXHhmZlx4ZmYnCisgICAgICAgICAnSlx4MDFceDAwXHhmZlx4ZmZKXHgwMFx4MDBceGZmXHhmZkpceGZmXHhmZlx4ZmZceDdmSlx4MDFceDAwJworICAgICAgICAgJ1x4MDBceDgwSlx4MDBceDAwXHgwMFx4ODAoVVx4MDNhYmNxXHgwNGhceDA0KGNfX21haW5fX1xuJworICAgICAgICAgJ0NcbnFceDA1b3FceDA2fXFceDA3KFVceDAzZm9vcVx4MDhLXHgwMVVceDAzYmFycVx0S1x4MDJ1YmgnCisgICAgICAgICAnXHgwNnRxXG5oXG5LXHgwNWUuJworICAgICAgICApCisKKyMgRGlzYXNzZW1ibHkgb2YgREFUQTEuCitEQVRBMV9ESVMgPSAiIiJcCisgICAgMDogXSAgICBFTVBUWV9MSVNUCisgICAgMTogcSAgICBCSU5QVVQgICAgIDEKKyAgICAzOiAoICAgIE1BUksKKyAgICA0OiBLICAgICAgICBCSU5JTlQxICAgIDAKKyAgICA2OiBMICAgICAgICBMT05HICAgICAgIDFMCisgICAxMDogRyAgICAgICAgQklORkxPQVQgICAyLjAKKyAgIDE5OiBjICAgICAgICBHTE9CQUwgICAgICdfX2J1aWx0aW5fXyBjb21wbGV4JworICAgNDA6IHEgICAgICAgIEJJTlBVVCAgICAgMgorICAgNDI6ICggICAgICAgIE1BUksKKyAgIDQzOiBHICAgICAgICAgICAgQklORkxPQVQgICAzLjAKKyAgIDUyOiBHICAgICAgICAgICAgQklORkxPQVQgICAwLjAKKyAgIDYxOiB0ICAgICAgICAgICAgVFVQTEUgICAgICAoTUFSSyBhdCA0MikKKyAgIDYyOiBSICAgICAgICBSRURVQ0UKKyAgIDYzOiBxICAgICAgICBCSU5QVVQgICAgIDMKKyAgIDY1OiBLICAgICAgICBCSU5JTlQxICAgIDEKKyAgIDY3OiBKICAgICAgICBCSU5JTlQgICAgIC0xCisgICA3MjogSyAgICAgICAgQklOSU5UMSAgICAyNTUKKyAgIDc0OiBKICAgICAgICBCSU5JTlQgICAgIC0yNTUKKyAgIDc5OiBKICAgICAgICBCSU5JTlQgICAgIC0yNTYKKyAgIDg0OiBNICAgICAgICBCSU5JTlQyICAgIDY1NTM1CisgICA4NzogSiAgICAgICAgQklOSU5UICAgICAtNjU1MzUKKyAgIDkyOiBKICAgICAgICBCSU5JTlQgICAgIC02NTUzNgorICAgOTc6IEogICAgICAgIEJJTklOVCAgICAgMjE0NzQ4MzY0NworICAxMDI6IEogICAgICAgIEJJTklOVCAgICAgLTIxNDc0ODM2NDcKKyAgMTA3OiBKICAgICAgICBCSU5JTlQgICAgIC0yMTQ3NDgzNjQ4CisgIDExMjogKCAgICAgICAgTUFSSworICAxMTM6IFUgICAgICAgICAgICBTSE9SVF9CSU5TVFJJTkcgJ2FiYycKKyAgMTE4OiBxICAgICAgICAgICAgQklOUFVUICAgICA0CisgIDEyMDogaCAgICAgICAgICAgIEJJTkdFVCAgICAgNAorICAxMjI6ICggICAgICAgICAgICBNQVJLCisgIDEyMzogYyAgICAgICAgICAgICAgICBHTE9CQUwgICAgICdfX21haW5fXyBDJworICAxMzU6IHEgICAgICAgICAgICAgICAgQklOUFVUICAgICA1CisgIDEzNzogbyAgICAgICAgICAgICAgICBPQkogICAgICAgIChNQVJLIGF0IDEyMikKKyAgMTM4OiBxICAgICAgICAgICAgQklOUFVUICAgICA2CisgIDE0MDogfSAgICAgICAgICAgIEVNUFRZX0RJQ1QKKyAgMTQxOiBxICAgICAgICAgICAgQklOUFVUICAgICA3CisgIDE0MzogKCAgICAgICAgICAgIE1BUksKKyAgMTQ0OiBVICAgICAgICAgICAgICAgIFNIT1JUX0JJTlNUUklORyAnZm9vJworICAxNDk6IHEgICAgICAgICAgICAgICAgQklOUFVUICAgICA4CisgIDE1MTogSyAgICAgICAgICAgICAgICBCSU5JTlQxICAgIDEKKyAgMTUzOiBVICAgICAgICAgICAgICAgIFNIT1JUX0JJTlNUUklORyAnYmFyJworICAxNTg6IHEgICAgICAgICAgICAgICAgQklOUFVUICAgICA5CisgIDE2MDogSyAgICAgICAgICAgICAgICBCSU5JTlQxICAgIDIKKyAgMTYyOiB1ICAgICAgICAgICAgICAgIFNFVElURU1TICAgKE1BUksgYXQgMTQzKQorICAxNjM6IGIgICAgICAgICAgICBCVUlMRAorICAxNjQ6IGggICAgICAgICAgICBCSU5HRVQgICAgIDYKKyAgMTY2OiB0ICAgICAgICAgICAgVFVQTEUgICAgICAoTUFSSyBhdCAxMTIpCisgIDE2NzogcSAgICAgICAgQklOUFVUICAgICAxMAorICAxNjk6IGggICAgICAgIEJJTkdFVCAgICAgMTAKKyAgMTcxOiBLICAgICAgICBCSU5JTlQxICAgIDUKKyAgMTczOiBlICAgICAgICBBUFBFTkRTICAgIChNQVJLIGF0IDMpCisgIDE3NDogLiAgICBTVE9QCitoaWdoZXN0IHByb3RvY29sIGFtb25nIG9wY29kZXMgPSAxCisiIiIKKworREFUQTIgPSAoJ1x4ODBceDAyXXFceDAxKEtceDAwXHg4YVx4MDFceDAxR0BceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJworICAgICAgICAgJ2NfX2J1aWx0aW5fX1xuY29tcGxleFxucVx4MDJHQFx4MDhceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBHXHgwMCcKKyAgICAgICAgICdceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHg4NlJxXHgwM0tceDAxSlx4ZmZceGZmXHhmZlx4ZmZLJworICAgICAgICAgJ1x4ZmZKXHgwMVx4ZmZceGZmXHhmZkpceDAwXHhmZlx4ZmZceGZmTVx4ZmZceGZmSlx4MDFceDAwXHhmZlx4ZmYnCisgICAgICAgICAnSlx4MDBceDAwXHhmZlx4ZmZKXHhmZlx4ZmZceGZmXHg3ZkpceDAxXHgwMFx4MDBceDgwSlx4MDBceDAwXHgwMCcKKyAgICAgICAgICdceDgwKFVceDAzYWJjcVx4MDRoXHgwNChjX19tYWluX19cbkNcbnFceDA1b3FceDA2fXFceDA3KFVceDAzZm9vJworICAgICAgICAgJ3FceDA4S1x4MDFVXHgwM2JhcnFcdEtceDAydWJoXHgwNnRxXG5oXG5LXHgwNWUuJykKKworIyBEaXNhc3NlbWJseSBvZiBEQVRBMi4KK0RBVEEyX0RJUyA9ICIiIlwKKyAgICAwOiBceDgwIFBST1RPICAgICAgMgorICAgIDI6IF0gICAgRU1QVFlfTElTVAorICAgIDM6IHEgICAgQklOUFVUICAgICAxCisgICAgNTogKCAgICBNQVJLCisgICAgNjogSyAgICAgICAgQklOSU5UMSAgICAwCisgICAgODogXHg4YSAgICAgTE9ORzEgICAgICAxTAorICAgMTE6IEcgICAgICAgIEJJTkZMT0FUICAgMi4wCisgICAyMDogYyAgICAgICAgR0xPQkFMICAgICAnX19idWlsdGluX18gY29tcGxleCcKKyAgIDQxOiBxICAgICAgICBCSU5QVVQgICAgIDIKKyAgIDQzOiBHICAgICAgICBCSU5GTE9BVCAgIDMuMAorICAgNTI6IEcgICAgICAgIEJJTkZMT0FUICAgMC4wCisgICA2MTogXHg4NiAgICAgVFVQTEUyCisgICA2MjogUiAgICAgICAgUkVEVUNFCisgICA2MzogcSAgICAgICAgQklOUFVUICAgICAzCisgICA2NTogSyAgICAgICAgQklOSU5UMSAgICAxCisgICA2NzogSiAgICAgICAgQklOSU5UICAgICAtMQorICAgNzI6IEsgICAgICAgIEJJTklOVDEgICAgMjU1CisgICA3NDogSiAgICAgICAgQklOSU5UICAgICAtMjU1CisgICA3OTogSiAgICAgICAgQklOSU5UICAgICAtMjU2CisgICA4NDogTSAgICAgICAgQklOSU5UMiAgICA2NTUzNQorICAgODc6IEogICAgICAgIEJJTklOVCAgICAgLTY1NTM1CisgICA5MjogSiAgICAgICAgQklOSU5UICAgICAtNjU1MzYKKyAgIDk3OiBKICAgICAgICBCSU5JTlQgICAgIDIxNDc0ODM2NDcKKyAgMTAyOiBKICAgICAgICBCSU5JTlQgICAgIC0yMTQ3NDgzNjQ3CisgIDEwNzogSiAgICAgICAgQklOSU5UICAgICAtMjE0NzQ4MzY0OAorICAxMTI6ICggICAgICAgIE1BUksKKyAgMTEzOiBVICAgICAgICAgICAgU0hPUlRfQklOU1RSSU5HICdhYmMnCisgIDExODogcSAgICAgICAgICAgIEJJTlBVVCAgICAgNAorICAxMjA6IGggICAgICAgICAgICBCSU5HRVQgICAgIDQKKyAgMTIyOiAoICAgICAgICAgICAgTUFSSworICAxMjM6IGMgICAgICAgICAgICAgICAgR0xPQkFMICAgICAnX19tYWluX18gQycKKyAgMTM1OiBxICAgICAgICAgICAgICAgIEJJTlBVVCAgICAgNQorICAxMzc6IG8gICAgICAgICAgICAgICAgT0JKICAgICAgICAoTUFSSyBhdCAxMjIpCisgIDEzODogcSAgICAgICAgICAgIEJJTlBVVCAgICAgNgorICAxNDA6IH0gICAgICAgICAgICBFTVBUWV9ESUNUCisgIDE0MTogcSAgICAgICAgICAgIEJJTlBVVCAgICAgNworICAxNDM6ICggICAgICAgICAgICBNQVJLCisgIDE0NDogVSAgICAgICAgICAgICAgICBTSE9SVF9CSU5TVFJJTkcgJ2ZvbycKKyAgMTQ5OiBxICAgICAgICAgICAgICAgIEJJTlBVVCAgICAgOAorICAxNTE6IEsgICAgICAgICAgICAgICAgQklOSU5UMSAgICAxCisgIDE1MzogVSAgICAgICAgICAgICAgICBTSE9SVF9CSU5TVFJJTkcgJ2JhcicKKyAgMTU4OiBxICAgICAgICAgICAgICAgIEJJTlBVVCAgICAgOQorICAxNjA6IEsgICAgICAgICAgICAgICAgQklOSU5UMSAgICAyCisgIDE2MjogdSAgICAgICAgICAgICAgICBTRVRJVEVNUyAgIChNQVJLIGF0IDE0MykKKyAgMTYzOiBiICAgICAgICAgICAgQlVJTEQKKyAgMTY0OiBoICAgICAgICAgICAgQklOR0VUICAgICA2CisgIDE2NjogdCAgICAgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgMTEyKQorICAxNjc6IHEgICAgICAgIEJJTlBVVCAgICAgMTAKKyAgMTY5OiBoICAgICAgICBCSU5HRVQgICAgIDEwCisgIDE3MTogSyAgICAgICAgQklOSU5UMSAgICA1CisgIDE3MzogZSAgICAgICAgQVBQRU5EUyAgICAoTUFSSyBhdCA1KQorICAxNzQ6IC4gICAgU1RPUAoraGlnaGVzdCBwcm90b2NvbCBhbW9uZyBvcGNvZGVzID0gMgorIiIiCisKK2RlZiBjcmVhdGVfZGF0YSgpOgorICAgIGMgPSBDKCkKKyAgICBjLmZvbyA9IDEKKyAgICBjLmJhciA9IDIKKyAgICB4ID0gWzAsIDFMLCAyLjAsIDMuMCswal0KKyAgICAjIEFwcGVuZCBzb21lIGludGVnZXIgdGVzdCBjYXNlcyBhdCBjUGlja2xlLmMncyBpbnRlcm5hbCBzaXplCisgICAgIyBjdXRvZmZzLgorICAgIHVpbnQxbWF4ID0gMHhmZgorICAgIHVpbnQybWF4ID0gMHhmZmZmCisgICAgaW50NG1heCA9IDB4N2ZmZmZmZmYKKyAgICB4LmV4dGVuZChbMSwgLTEsCisgICAgICAgICAgICAgIHVpbnQxbWF4LCAtdWludDFtYXgsIC11aW50MW1heC0xLAorICAgICAgICAgICAgICB1aW50Mm1heCwgLXVpbnQybWF4LCAtdWludDJtYXgtMSwKKyAgICAgICAgICAgICAgIGludDRtYXgsICAtaW50NG1heCwgIC1pbnQ0bWF4LTFdKQorICAgIHkgPSAoJ2FiYycsICdhYmMnLCBjLCBjKQorICAgIHguYXBwZW5kKHkpCisgICAgeC5hcHBlbmQoeSkKKyAgICB4LmFwcGVuZCg1KQorICAgIHJldHVybiB4CisKK2NsYXNzIEFic3RyYWN0UGlja2xlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgU3ViY2xhc3MgbXVzdCBkZWZpbmUgc2VsZi5kdW1wcywgc2VsZi5sb2Fkcywgc2VsZi5lcnJvci4KKworICAgIF90ZXN0ZGF0YSA9IGNyZWF0ZV9kYXRhKCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfbWlzYyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHZhcmlvdXMgZGF0YXR5cGVzIG5vdCB0ZXN0ZWQgYnkgdGVzdGRhdGEKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHggPSBteWludCg0KQorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorCisgICAgICAgICAgICB4ID0gKDEsICgpKQorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorCisgICAgICAgICAgICB4ID0gaW5pdGFyZygxLCB4KQorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorCisgICAgICAgICMgWFhYIHRlc3QgX19yZWR1Y2VfXyBwcm90b2NvbD8KKworICAgIGRlZiB0ZXN0X3JvdW5kdHJpcF9lcXVhbGl0eShzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSBzZWxmLl90ZXN0ZGF0YQorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoZXhwZWN0ZWQsIHByb3RvKQorICAgICAgICAgICAgZ290ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorCisgICAgZGVmIHRlc3RfbG9hZF9mcm9tX2Nhbm5lZF9zdHJpbmcoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gc2VsZi5fdGVzdGRhdGEKKyAgICAgICAgZm9yIGNhbm5lZCBpbiBEQVRBMCwgREFUQTEsIERBVEEyOgorICAgICAgICAgICAgZ290ID0gc2VsZi5sb2FkcyhjYW5uZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisKKyAgICAjIFRoZXJlIGFyZSBncmF0dWl0b3VzIGRpZmZlcmVuY2VzIGJldHdlZW4gcGlja2xlcyBwcm9kdWNlZCBieQorICAgICMgcGlja2xlIGFuZCBjUGlja2xlLCBsYXJnZWx5IGJlY2F1c2UgY1BpY2tsZSBzdGFydHMgUFVUIGluZGljZXMgYXQKKyAgICAjIDEgYW5kIHBpY2tsZSBzdGFydHMgdGhlbSBhdCAwLiAgU2VlIFhYWCBjb21tZW50IGluIGNQaWNrbGUncyBwdXQyKCkgLS0KKyAgICAjIHRoZXJlJ3MgYSBjb21tZW50IHdpdGggYW4gZXhjbGFtYXRpb24gcG9pbnQgdGhlcmUgd2hvc2UgbWVhbmluZworICAgICMgaXMgYSBteXN0ZXJ5LiAgY1BpY2tsZSBhbHNvIHN1cHByZXNzZXMgUFVUIGZvciBvYmplY3RzIHdpdGggYSByZWZjb3VudAorICAgICMgb2YgMS4KKyAgICBkZWYgZG9udF90ZXN0X2Rpc2Fzc2VtYmx5KHNlbGYpOgorICAgICAgICBmcm9tIHBpY2tsZXRvb2xzIGltcG9ydCBkaXMKKworICAgICAgICBmb3IgcHJvdG8sIGV4cGVjdGVkIGluICgwLCBEQVRBMF9ESVMpLCAoMSwgREFUQTFfRElTKToKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHNlbGYuX3Rlc3RkYXRhLCBwcm90bykKKyAgICAgICAgICAgIGZpbGVsaWtlID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIGRpcyhzLCBvdXQ9ZmlsZWxpa2UpCisgICAgICAgICAgICBnb3QgPSBmaWxlbGlrZS5nZXR2YWx1ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisKKyAgICBkZWYgdGVzdF9yZWN1cnNpdmVfbGlzdChzZWxmKToKKyAgICAgICAgbCA9IFtdCisgICAgICAgIGwuYXBwZW5kKGwpCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyhsLCBwcm90bykKKyAgICAgICAgICAgIHggPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih4KSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIHhbMF0pCisKKyAgICBkZWYgdGVzdF9yZWN1cnNpdmVfdHVwbGUoc2VsZik6CisgICAgICAgIHQgPSAoW10sKQorICAgICAgICB0WzBdLmFwcGVuZCh0KQorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHModCwgcHJvdG8pCisgICAgICAgICAgICB4ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oeCksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih4WzBdKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIHhbMF1bMF0pCisKKyAgICBkZWYgdGVzdF9yZWN1cnNpdmVfZGljdChzZWxmKToKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGRbMV0gPSBkCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyhkLCBwcm90bykKKyAgICAgICAgICAgIHggPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgua2V5cygpLCBbMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeFsxXSBpcyB4KQorCisgICAgZGVmIHRlc3RfcmVjdXJzaXZlX2luc3Qoc2VsZik6CisgICAgICAgIGkgPSBDKCkKKyAgICAgICAgaS5hdHRyID0gaQorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoaSwgcHJvdG8pCisgICAgICAgICAgICB4ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIoeCksIGRpcihpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoeC5hdHRyLCB4KQorCisgICAgZGVmIHRlc3RfcmVjdXJzaXZlX211bHRpKHNlbGYpOgorICAgICAgICBsID0gW10KKyAgICAgICAgZCA9IHsxOmx9CisgICAgICAgIGkgPSBDKCkKKyAgICAgICAgaS5hdHRyID0gZAorICAgICAgICBsLmFwcGVuZChpKQorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMobCwgcHJvdG8pCisgICAgICAgICAgICB4ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oeCksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcih4WzBdKSwgZGlyKGkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzBdLmF0dHIua2V5cygpLCBbMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeFswXS5hdHRyWzFdIGlzIHgpCisKKyAgICBkZWYgdGVzdF9nYXJ5cChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5lcnJvciwgc2VsZi5sb2FkcywgJ2dhcnlwJykKKworICAgIGRlZiB0ZXN0X2luc2VjdXJlX3N0cmluZ3Moc2VsZik6CisgICAgICAgIGluc2VjdXJlID0gWyJhYmMiLCAiMiArIDIiLCAjIG5vdCBxdW90ZWQKKyAgICAgICAgICAgICAgICAgICAgIyInYWJjJyArICdkZWYnIiwgIyBub3QgYSBzaW5nbGUgcXVvdGVkIHN0cmluZworICAgICAgICAgICAgICAgICAgICAiJ2FiYyIsICMgcXVvdGUgaXMgbm90IGNsb3NlZAorICAgICAgICAgICAgICAgICAgICAiJ2FiY1wiIiwgIyBvcGVuIHF1b3RlIGFuZCBjbG9zZSBxdW90ZSBkb24ndCBtYXRjaAorICAgICAgICAgICAgICAgICAgICAiJ2FiYycgICA/IiwgIyBqdW5rIGFmdGVyIGNsb3NlIHF1b3RlCisgICAgICAgICAgICAgICAgICAgICInXFwnIiwgIyB0cmFpbGluZyBiYWNrc2xhc2gKKyAgICAgICAgICAgICAgICAgICAgIiciLCAgICAjIGlzc3VlICMxNzcxMAorICAgICAgICAgICAgICAgICAgICAiJyAiLCAgICMgaXNzdWUgIzE3NzEwCisgICAgICAgICAgICAgICAgICAgICMgc29tZSB0ZXN0cyBvZiB0aGUgcXVvdGluZyBydWxlcworICAgICAgICAgICAgICAgICAgICAjIidhYmNcIlwnJyIsCisgICAgICAgICAgICAgICAgICAgICMiJ1xcXFxhXCdcJ1wnXFxcJ1xcXFxcJyciLAorICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIGZvciBzIGluIGluc2VjdXJlOgorICAgICAgICAgICAgYnVmID0gIlMiICsgcyArICJcMDEycDBcMDEyLiIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYubG9hZHMsIGJ1ZikKKworICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKKyAgICAgICAgICAgIGVuZGNhc2VzID0gW3UnJywgdSc8XFx1PicsIHUnPFxcXHUxMjM0PicsIHUnPFxuPicsCisgICAgICAgICAgICAgICAgICAgICAgICB1JzxcXD4nLCB1JzxcXFxVMDAwMTIzNDU+J10KKyAgICAgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICAgICAgZm9yIHUgaW4gZW5kY2FzZXM6CisgICAgICAgICAgICAgICAgICAgIHAgPSBzZWxmLmR1bXBzKHUsIHByb3RvKQorICAgICAgICAgICAgICAgICAgICB1MiA9IHNlbGYubG9hZHMocCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MiwgdSkKKworICAgICAgICBkZWYgdGVzdF91bmljb2RlX2hpZ2hfcGxhbmUoc2VsZik6CisgICAgICAgICAgICB0ID0gdSdcVTAwMDEyMzQ1JworICAgICAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgICAgICBwID0gc2VsZi5kdW1wcyh0LCBwcm90bykKKyAgICAgICAgICAgICAgICB0MiA9IHNlbGYubG9hZHMocCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLCB0KQorCisgICAgZGVmIHRlc3RfaW50cyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgbiA9IHN5cy5tYXhpbnQKKyAgICAgICAgICAgIHdoaWxlIG46CisgICAgICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluICgtbiwgbik6CisgICAgICAgICAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKGV4cGVjdGVkLCBwcm90bykKKyAgICAgICAgICAgICAgICAgICAgbjIgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIG4yKQorICAgICAgICAgICAgICAgIG4gPSBuID4+IDEKKworICAgIGRlZiB0ZXN0X21heGludDY0KHNlbGYpOgorICAgICAgICBtYXhpbnQ2NCA9ICgxTCA8PCA2MykgLSAxCisgICAgICAgIGRhdGEgPSAnSScgKyBzdHIobWF4aW50NjQpICsgJ1xuLicKKyAgICAgICAgZ290ID0gc2VsZi5sb2FkcyhkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgbWF4aW50NjQpCisKKyAgICAgICAgIyBUcnkgdG9vIHdpdGggYSBib2d1cyBsaXRlcmFsLgorICAgICAgICBkYXRhID0gJ0knICsgc3RyKG1heGludDY0KSArICdKVU5LXG4uJworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmxvYWRzLCBkYXRhKQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgICMgMjU2IGJ5dGVzIGlzIHdoZXJlIExPTkc0IGJlZ2lucy4KKyAgICAgICAgICAgIGZvciBuYml0cyBpbiAxLCA4LCA4KjI1NCwgOCoyNTUsIDgqMjU2LCA4KjI1NzoKKyAgICAgICAgICAgICAgICBuYmFzZSA9IDFMIDw8IG5iaXRzCisgICAgICAgICAgICAgICAgZm9yIG5wb3MgaW4gbmJhc2UtMSwgbmJhc2UsIG5iYXNlKzE6CisgICAgICAgICAgICAgICAgICAgIGZvciBuIGluIG5wb3MsIC1ucG9zOgorICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlID0gc2VsZi5kdW1wcyhuLCBwcm90bykKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdCA9IHNlbGYubG9hZHMocGlja2xlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuLCBnb3QpCisgICAgICAgICMgVHJ5IGEgbW9uc3Rlci4gIFRoaXMgaXMgcXVhZHJhdGljLXRpbWUgaW4gcHJvdG9zIDAgJiAxLCBzbyBkb24ndAorICAgICAgICAjIGJvdGhlciB3aXRoIHRob3NlLgorICAgICAgICBuYmFzZSA9IGxvbmcoImRlYWRiZWVmZmVlZGZhY2UiLCAxNikKKyAgICAgICAgbmJhc2UgKz0gbmJhc2UgPDwgMTAwMDAwMAorICAgICAgICBmb3IgbiBpbiBuYmFzZSwgLW5iYXNlOgorICAgICAgICAgICAgcCA9IHNlbGYuZHVtcHMobiwgMikKKyAgICAgICAgICAgIGdvdCA9IHNlbGYubG9hZHMocCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobiwgZ290KQorCisgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CisgICAgICAgIHRlc3RfdmFsdWVzID0gWzAuMCwgNC45NGUtMzI0LCAxZS0zMTAsIDdlLTMwOCwgNi42MjZlLTM0LCAwLjEsIDAuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgMy4xNCwgMjYzLjQ0NTgyMDYyMzc0MDUzLCA2LjAyMmUyMywgMWUzMF0KKyAgICAgICAgdGVzdF92YWx1ZXMgPSB0ZXN0X3ZhbHVlcyArIFsteCBmb3IgeCBpbiB0ZXN0X3ZhbHVlc10KKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB0ZXN0X3ZhbHVlczoKKyAgICAgICAgICAgICAgICBwaWNrbGUgPSBzZWxmLmR1bXBzKHZhbHVlLCBwcm90bykKKyAgICAgICAgICAgICAgICBnb3QgPSBzZWxmLmxvYWRzKHBpY2tsZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCBnb3QpCisKKyAgICBAcnVuX3dpdGhfbG9jYWxlKCdMQ19BTEwnLCAnZGVfREUnLCAnZnJfRlInKQorICAgIGRlZiB0ZXN0X2Zsb2F0X2Zvcm1hdChzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCBmbG9hdHMgYXJlIGZvcm1hdHRlZCBsb2NhbGUgaW5kZXBlbmRlbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmR1bXBzKDEuMilbMDozXSwgJ0YxLicpCisKKyAgICBkZWYgdGVzdF9yZWR1Y2Uoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2dldGluaXRhcmdzKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9tZXRhY2xhc3Moc2VsZik6CisgICAgICAgIGEgPSB1c2VfbWV0YWNsYXNzKCkKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKGEsIHByb3RvKQorICAgICAgICAgICAgYiA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2NsYXNzX18sIGIuX19jbGFzc19fKQorCisgICAgZGVmIHRlc3RfZHluYW1pY19jbGFzcyhzZWxmKToKKyAgICAgICAgYSA9IGNyZWF0ZV9keW5hbWljX2NsYXNzKCJteV9keW5hbWljX2NsYXNzIiwgKG9iamVjdCwpKQorICAgICAgICBjb3B5X3JlZy5waWNrbGUocGlja2xpbmdfbWV0YWNsYXNzLCBwaWNrbGluZ19tZXRhY2xhc3MuX19yZWR1Y2VfXykKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKGEsIHByb3RvKQorICAgICAgICAgICAgYiA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKworICAgIGRlZiB0ZXN0X3N0cnVjdHNlcShzZWxmKToKKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgaW1wb3J0IG9zCisKKyAgICAgICAgdCA9IHRpbWUubG9jYWx0aW1lKCkKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHQsIHByb3RvKQorICAgICAgICAgICAgdSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdSkKKyAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJzdGF0Iik6CisgICAgICAgICAgICAgICAgdCA9IG9zLnN0YXQob3MuY3VyZGlyKQorICAgICAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHQsIHByb3RvKQorICAgICAgICAgICAgICAgIHUgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCB1KQorICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgInN0YXR2ZnMiKToKKyAgICAgICAgICAgICAgICB0ID0gb3Muc3RhdHZmcyhvcy5jdXJkaXIpCisgICAgICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHModCwgcHJvdG8pCisgICAgICAgICAgICAgICAgdSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHUpCisKKyAgICAjIFRlc3RzIGZvciBwcm90b2NvbCAyCisKKyAgICBkZWYgdGVzdF9wcm90byhzZWxmKToKKyAgICAgICAgYnVpbGRfbm9uZSA9IHBpY2tsZS5OT05FICsgcGlja2xlLlNUT1AKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIGV4cGVjdGVkID0gYnVpbGRfbm9uZQorICAgICAgICAgICAgaWYgcHJvdG8gPj0gMjoKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHBpY2tsZS5QUk9UTyArIGNocihwcm90bykgKyBleHBlY3RlZAorICAgICAgICAgICAgcCA9IHNlbGYuZHVtcHMoTm9uZSwgcHJvdG8pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIGV4cGVjdGVkKQorCisgICAgICAgIG9vYiA9IHByb3RvY29sc1stMV0gKyAxICAgICAjIGEgZnV0dXJlIHByb3RvY29sCisgICAgICAgIGJhZHBpY2tsZSA9IHBpY2tsZS5QUk9UTyArIGNocihvb2IpICsgYnVpbGRfbm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmxvYWRzKGJhZHBpY2tsZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGRldGFpbDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIoZGV0YWlsKS5zdGFydHN3aXRoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgcGlja2xlIHByb3RvY29sIikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGJhZCBwcm90b2NvbCBudW1iZXIgdG8gcmFpc2UgVmFsdWVFcnJvciIpCisKKyAgICBkZWYgdGVzdF9sb25nMShzZWxmKToKKyAgICAgICAgeCA9IDEyMzQ1Njc4OTEwMTExMjEzMTQxNTE2MTc4OTIwTAorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGNvZGVfaW5fcGlja2xlKHBpY2tsZS5MT05HMSwgcyksIHByb3RvID49IDIpCisKKyAgICBkZWYgdGVzdF9sb25nNChzZWxmKToKKyAgICAgICAgeCA9IDEyMzQ1Njc4OTEwMTExMjEzMTQxNTE2MTc4OTIwTCA8PCAoMjU2KjgpCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyh4LCBwcm90bykKKyAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wY29kZV9pbl9waWNrbGUocGlja2xlLkxPTkc0LCBzKSwgcHJvdG8gPj0gMikKKworICAgIGRlZiB0ZXN0X3Nob3J0X3R1cGxlcyhzZWxmKToKKyAgICAgICAgIyBNYXAgKHByb3RvLCBsZW4odHVwbGUpKSB0byBleHBlY3RlZCBvcGNvZGUuCisgICAgICAgIGV4cGVjdGVkX29wY29kZSA9IHsoMCwgMCk6IHBpY2tsZS5UVVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCAxKTogcGlja2xlLlRVUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIDIpOiBwaWNrbGUuVFVQTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgMyk6IHBpY2tsZS5UVVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCA0KTogcGlja2xlLlRVUExFLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgMCk6IHBpY2tsZS5FTVBUWV9UVVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAxKTogcGlja2xlLlRVUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsIDIpOiBwaWNrbGUuVFVQTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgMyk6IHBpY2tsZS5UVVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCA0KTogcGlja2xlLlRVUExFLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgMCk6IHBpY2tsZS5FTVBUWV9UVVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAxKTogcGlja2xlLlRVUExFMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAyKTogcGlja2xlLlRVUExFMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAzKTogcGlja2xlLlRVUExFMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCA0KTogcGlja2xlLlRVUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIGEgPSAoKQorICAgICAgICBiID0gKDEsKQorICAgICAgICBjID0gKDEsIDIpCisgICAgICAgIGQgPSAoMSwgMiwgMykKKyAgICAgICAgZSA9ICgxLCAyLCAzLCA0KQorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgZm9yIHggaW4gYSwgYiwgYywgZCwgZToKKyAgICAgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyh4LCBwcm90bykKKyAgICAgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSwgKHByb3RvLCB4LCBzLCB5KSkKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGV4cGVjdGVkX29wY29kZVtwcm90bywgbGVuKHgpXQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Bjb2RlX2luX3BpY2tsZShleHBlY3RlZCwgcyksIFRydWUpCisKKyAgICBkZWYgdGVzdF9zaW5nbGV0b25zKHNlbGYpOgorICAgICAgICAjIE1hcCAocHJvdG8sIHNpbmdsZXRvbikgdG8gZXhwZWN0ZWQgb3Bjb2RlLgorICAgICAgICBleHBlY3RlZF9vcGNvZGUgPSB7KDAsIE5vbmUpOiBwaWNrbGUuTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCBOb25lKTogcGlja2xlLk5PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgTm9uZSk6IHBpY2tsZS5OT05FLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgVHJ1ZSk6IHBpY2tsZS5JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgVHJ1ZSk6IHBpY2tsZS5JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgVHJ1ZSk6IHBpY2tsZS5ORVdUUlVFLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgRmFsc2UpOiBwaWNrbGUuSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsIEZhbHNlKTogcGlja2xlLklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCBGYWxzZSk6IHBpY2tsZS5ORVdGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgZm9yIHggaW4gTm9uZSwgRmFsc2UsIFRydWU6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyB5LCAocHJvdG8sIHgsIHMsIHkpKQorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWRfb3Bjb2RlW3Byb3RvLCB4XQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Bjb2RlX2luX3BpY2tsZShleHBlY3RlZCwgcyksIFRydWUpCisKKyAgICBkZWYgdGVzdF9uZXdvYmpfdHVwbGUoc2VsZik6CisgICAgICAgIHggPSBNeVR1cGxlKFsxLCAyLCAzXSkKKyAgICAgICAgeC5mb28gPSA0MgorICAgICAgICB4LmJhciA9ICJoZWxsbyIKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoeCksIHR1cGxlKHkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9fZGljdF9fLCB5Ll9fZGljdF9fKQorCisgICAgZGVmIHRlc3RfbmV3b2JqX2xpc3Qoc2VsZik6CisgICAgICAgIHggPSBNeUxpc3QoWzEsIDIsIDNdKQorICAgICAgICB4LmZvbyA9IDQyCisgICAgICAgIHguYmFyID0gImhlbGxvIgorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHgpLCBsaXN0KHkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9fZGljdF9fLCB5Ll9fZGljdF9fKQorCisgICAgZGVmIHRlc3RfbmV3b2JqX2dlbmVyaWMoc2VsZik6CisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBmb3IgQyBpbiBteWNsYXNzZXM6CisgICAgICAgICAgICAgICAgQiA9IEMuX19iYXNlX18KKyAgICAgICAgICAgICAgICB4ID0gQyhDLnNhbXBsZSkKKyAgICAgICAgICAgICAgICB4LmZvbyA9IDQyCisgICAgICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgICAgICBkZXRhaWwgPSAocHJvdG8sIEMsIEIsIHgsIHksIHR5cGUoeSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChCKHgpLCBCKHkpLCBkZXRhaWwpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9fZGljdF9fLCB5Ll9fZGljdF9fLCBkZXRhaWwpCisKKyAgICAjIFJlZ2lzdGVyIGEgdHlwZSB3aXRoIGNvcHlfcmVnLCB3aXRoIGV4dGVuc2lvbiBjb2RlIGV4dGNvZGUuICBQaWNrbGUKKyAgICAjIGFuIG9iamVjdCBvZiB0aGF0IHR5cGUuICBDaGVjayB0aGF0IHRoZSByZXN1bHRpbmcgcGlja2xlIHVzZXMgb3Bjb2RlCisgICAgIyAoRVhUWzEyNF0pIHVuZGVyIHByb3RvIDIsIGFuZCBub3QgaW4gcHJvdG8gMS4KKworICAgIGRlZiBwcm9kdWNlX2dsb2JhbF9leHQoc2VsZiwgZXh0Y29kZSwgb3Bjb2RlKToKKyAgICAgICAgZSA9IEV4dGVuc2lvblNhdmVyKGV4dGNvZGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvcHlfcmVnLmFkZF9leHRlbnNpb24oX19uYW1lX18sICJNeUxpc3QiLCBleHRjb2RlKQorICAgICAgICAgICAgeCA9IE15TGlzdChbMSwgMiwgM10pCisgICAgICAgICAgICB4LmZvbyA9IDQyCisgICAgICAgICAgICB4LmJhciA9ICJoZWxsbyIKKworICAgICAgICAgICAgIyBEdW1wIHVzaW5nIHByb3RvY29sIDEgZm9yIGNvbXBhcmlzb24uCisgICAgICAgICAgICBzMSA9IHNlbGYuZHVtcHMoeCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oX19uYW1lX18sIHMxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigiTXlMaXN0IiwgczEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wY29kZV9pbl9waWNrbGUob3Bjb2RlLCBzMSksIEZhbHNlKQorCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4KSwgbGlzdCh5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fX2RpY3RfXywgeS5fX2RpY3RfXykKKworICAgICAgICAgICAgIyBEdW1wIHVzaW5nIHByb3RvY29sIDIgZm9yIHRlc3QuCisgICAgICAgICAgICBzMiA9IHNlbGYuZHVtcHMoeCwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oX19uYW1lX18sIHMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiTXlMaXN0IiwgczIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wY29kZV9pbl9waWNrbGUob3Bjb2RlLCBzMiksIFRydWUpCisKKyAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHgpLCBsaXN0KHkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9fZGljdF9fLCB5Ll9fZGljdF9fKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBlLnJlc3RvcmUoKQorCisgICAgZGVmIHRlc3RfZ2xvYmFsX2V4dDEoc2VsZik6CisgICAgICAgIHNlbGYucHJvZHVjZV9nbG9iYWxfZXh0KDB4MDAwMDAwMDEsIHBpY2tsZS5FWFQxKSAgIyBzbWFsbGVzdCBFWFQxIGNvZGUKKyAgICAgICAgc2VsZi5wcm9kdWNlX2dsb2JhbF9leHQoMHgwMDAwMDBmZiwgcGlja2xlLkVYVDEpICAjIGxhcmdlc3QgRVhUMSBjb2RlCisKKyAgICBkZWYgdGVzdF9nbG9iYWxfZXh0MihzZWxmKToKKyAgICAgICAgc2VsZi5wcm9kdWNlX2dsb2JhbF9leHQoMHgwMDAwMDEwMCwgcGlja2xlLkVYVDIpICAjIHNtYWxsZXN0IEVYVDIgY29kZQorICAgICAgICBzZWxmLnByb2R1Y2VfZ2xvYmFsX2V4dCgweDAwMDBmZmZmLCBwaWNrbGUuRVhUMikgICMgbGFyZ2VzdCBFWFQyIGNvZGUKKyAgICAgICAgc2VsZi5wcm9kdWNlX2dsb2JhbF9leHQoMHgwMDAwYWJjZCwgcGlja2xlLkVYVDIpICAjIGNoZWNrIGVuZGlhbm5lc3MKKworICAgIGRlZiB0ZXN0X2dsb2JhbF9leHQ0KHNlbGYpOgorICAgICAgICBzZWxmLnByb2R1Y2VfZ2xvYmFsX2V4dCgweDAwMDEwMDAwLCBwaWNrbGUuRVhUNCkgICMgc21hbGxlc3QgRVhUNCBjb2RlCisgICAgICAgIHNlbGYucHJvZHVjZV9nbG9iYWxfZXh0KDB4N2ZmZmZmZmYsIHBpY2tsZS5FWFQ0KSAgIyBsYXJnZXN0IEVYVDQgY29kZQorICAgICAgICBzZWxmLnByb2R1Y2VfZ2xvYmFsX2V4dCgweDEyYWJjZGVmLCBwaWNrbGUuRVhUNCkgICMgY2hlY2sgZW5kaWFubmVzcworCisgICAgZGVmIHRlc3RfbGlzdF9jaHVua2luZyhzZWxmKToKKyAgICAgICAgbiA9IDEwICAjIHRvbyBzbWFsbCB0byBjaHVuaworICAgICAgICB4ID0gcmFuZ2UobikKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgICAgIG51bV9hcHBlbmRzID0gY291bnRfb3Bjb2RlKHBpY2tsZS5BUFBFTkRTLCBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW1fYXBwZW5kcywgcHJvdG8gPiAwKQorCisgICAgICAgIG4gPSAyNTAwICAjIGV4cGVjdCBhdCBsZWFzdCB0d28gY2h1bmtzIHdoZW4gcHJvdG8gPiAwCisgICAgICAgIHggPSByYW5nZShuKQorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICAgICAgbnVtX2FwcGVuZHMgPSBjb3VudF9vcGNvZGUocGlja2xlLkFQUEVORFMsIHMpCisgICAgICAgICAgICBpZiBwcm90byA9PSAwOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtX2FwcGVuZHMsIDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShudW1fYXBwZW5kcyA+PSAyKQorCisgICAgZGVmIHRlc3RfZGljdF9jaHVua2luZyhzZWxmKToKKyAgICAgICAgbiA9IDEwICAjIHRvbyBzbWFsbCB0byBjaHVuaworICAgICAgICB4ID0gZGljdC5mcm9ta2V5cyhyYW5nZShuKSkKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgICAgIG51bV9zZXRpdGVtcyA9IGNvdW50X29wY29kZShwaWNrbGUuU0VUSVRFTVMsIHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG51bV9zZXRpdGVtcywgcHJvdG8gPiAwKQorCisgICAgICAgIG4gPSAyNTAwICAjIGV4cGVjdCBhdCBsZWFzdCB0d28gY2h1bmtzIHdoZW4gcHJvdG8gPiAwCisgICAgICAgIHggPSBkaWN0LmZyb21rZXlzKHJhbmdlKG4pKQorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICAgICAgbnVtX3NldGl0ZW1zID0gY291bnRfb3Bjb2RlKHBpY2tsZS5TRVRJVEVNUywgcykKKyAgICAgICAgICAgIGlmIHByb3RvID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW1fc2V0aXRlbXMsIDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShudW1fc2V0aXRlbXMgPj0gMikKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9uZXdvYmooc2VsZik6CisgICAgICAgIHggPSBvYmplY3QuX19uZXdfXyhTaW1wbGVOZXdPYmopICAjIGF2b2lkIF9faW5pdF9fCisgICAgICAgIHguYWJjID0gNjY2CisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyh4LCBwcm90bykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Bjb2RlX2luX3BpY2tsZShwaWNrbGUuTkVXT0JKLCBzKSwgcHJvdG8gPj0gMikKKyAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpICAgIyB3aWxsIHJhaXNlIFR5cGVFcnJvciBpZiBfX2luaXRfXyBjYWxsZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5hYmMsIDY2NikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fX2RpY3RfXywgeS5fX2RpY3RfXykKKworICAgIGRlZiB0ZXN0X25ld29ial9saXN0X3Nsb3RzKHNlbGYpOgorICAgICAgICB4ID0gU2xvdExpc3QoWzEsIDIsIDNdKQorICAgICAgICB4LmZvbyA9IDQyCisgICAgICAgIHguYmFyID0gImhlbGxvIgorICAgICAgICBzID0gc2VsZi5kdW1wcyh4LCAyKQorICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCksIGxpc3QoeSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fX2RpY3RfXywgeS5fX2RpY3RfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZvbywgeS5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5iYXIsIHkuYmFyKQorCisgICAgZGVmIHRlc3RfcmVkdWNlX292ZXJyaWRlc19kZWZhdWx0X3JlZHVjZV9leChzZWxmKToKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHggPSBSRVhfb25lKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fcmVkdWNlX2NhbGxlZCwgMCkKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9yZWR1Y2VfY2FsbGVkLCAxKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fcmVkdWNlX2NhbGxlZCwgMCkKKworICAgIGRlZiB0ZXN0X3JlZHVjZV9leF9jYWxsZWQoc2VsZik6CisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICB4ID0gUkVYX3R3bygpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX3Byb3RvLCBOb25lKQorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX3Byb3RvLCBwcm90bykKKyAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuX3Byb3RvLCBOb25lKQorCisgICAgZGVmIHRlc3RfcmVkdWNlX2V4X292ZXJyaWRlc19yZWR1Y2Uoc2VsZik6CisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICB4ID0gUkVYX3RocmVlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fcHJvdG8sIE5vbmUpCisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyh4LCBwcm90bykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fcHJvdG8sIHByb3RvKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fcHJvdG8sIE5vbmUpCisKKyAgICBkZWYgdGVzdF9yZWR1Y2VfZXhfY2FsbHNfYmFzZShzZWxmKToKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHggPSBSRVhfZm91cigpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX3Byb3RvLCBOb25lKQorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX3Byb3RvLCBwcm90bykKKyAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuX3Byb3RvLCBwcm90bykKKworICAgIGRlZiB0ZXN0X3JlZHVjZV9jYWxsc19iYXNlKHNlbGYpOgorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgeCA9IFJFWF9maXZlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fcmVkdWNlX2NhbGxlZCwgMCkKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9yZWR1Y2VfY2FsbGVkLCAxKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fcmVkdWNlX2NhbGxlZCwgMSkKKworICAgIGRlZiB0ZXN0X3JlZHVjZV9iYWRfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgICMgSXNzdWU0MTc2OiBjcmFzaCB3aGVuIDR0aCBhbmQgNXRoIGl0ZW1zIG9mIF9fcmVkdWNlX18oKQorICAgICAgICAjIGFyZSBub3QgaXRlcmF0b3JzCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgICMgNHRoIGl0ZW0gaXMgbm90IGFuIGl0ZXJhdG9yCisgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3QsICgpLCBOb25lLCBbXSwgTm9uZQorICAgICAgICBjbGFzcyBEKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAjIDV0aCBpdGVtIGlzIG5vdCBhbiBpdGVyYXRvcgorICAgICAgICAgICAgICAgIHJldHVybiBkaWN0LCAoKSwgTm9uZSwgTm9uZSwgW10KKworICAgICAgICAjIFByb3RvY29sIDAgaXMgbGVzcyBzdHJpY3QgYW5kIGFsc28gYWNjZXB0IGl0ZXJhYmxlcy4KKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmR1bXBzKEMoKSwgcHJvdG8pCisgICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBwaWNrbGUuUGlja2xlRXJyb3IsIGNQaWNrbGUuUGlja2xlRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmR1bXBzKEQoKSwgcHJvdG8pCisgICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBwaWNrbGUuUGlja2xlRXJyb3IsIGNQaWNrbGUuUGlja2xlRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X21hbnlfcHV0c19hbmRfZ2V0cyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGNvcnJlY3RseSBkZWFsIHdpdGggbG90cyBvZgorICAgICAgICAjIHB1dHMvZ2V0cy4KKyAgICAgICAga2V5cyA9ICgiYWFhIiArIHN0cihpKSBmb3IgaSBpbiB4cmFuZ2UoMTAwKSkKKyAgICAgICAgbGFyZ2VfZGljdCA9IGRpY3QoKGssIFs0LCA1LCA2XSkgZm9yIGsgaW4ga2V5cykKKyAgICAgICAgb2JqID0gW2RpY3QobGFyZ2VfZGljdCksIGRpY3QobGFyZ2VfZGljdCksIGRpY3QobGFyZ2VfZGljdCldCisKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIGR1bXBlZCA9IHNlbGYuZHVtcHMob2JqLCBwcm90bykKKyAgICAgICAgICAgIGxvYWRlZCA9IHNlbGYubG9hZHMoZHVtcGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZWQsIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCBwcm90b2NvbCAlZDogJXIgIT0gJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHByb3RvLCBvYmosIGxvYWRlZCkpCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVfbmFtZV9pbnRlcm5pbmcoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGF0dHJpYnV0ZSBuYW1lcyBvZiBwaWNrbGVkIG9iamVjdHMgYXJlIGludGVybmVkIHdoZW4KKyAgICAgICAgIyB1bnBpY2tsaW5nLgorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgeCA9IEMoKQorICAgICAgICAgICAgeC5mb28gPSA0MgorICAgICAgICAgICAgeC5iYXIgPSAiaGVsbG8iCisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyh4LCBwcm90bykKKyAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICB4X2tleXMgPSBzb3J0ZWQoeC5fX2RpY3RfXykKKyAgICAgICAgICAgIHlfa2V5cyA9IHNvcnRlZCh5Ll9fZGljdF9fKQorICAgICAgICAgICAgZm9yIHhfa2V5LCB5X2tleSBpbiB6aXAoeF9rZXlzLCB5X2tleXMpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoeF9rZXksIHlfa2V5KQorCisKKyMgVGVzdCBjbGFzc2VzIGZvciByZWR1Y2VfZXgKKworY2xhc3MgUkVYX29uZShvYmplY3QpOgorICAgIF9yZWR1Y2VfY2FsbGVkID0gMAorICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICBzZWxmLl9yZWR1Y2VfY2FsbGVkID0gMQorICAgICAgICByZXR1cm4gUkVYX29uZSwgKCkKKyAgICAjIE5vIF9fcmVkdWNlX2V4X18gaGVyZSwgYnV0IGluaGVyaXRpbmcgaXQgZnJvbSBvYmplY3QKKworY2xhc3MgUkVYX3R3byhvYmplY3QpOgorICAgIF9wcm90byA9IE5vbmUKKyAgICBkZWYgX19yZWR1Y2VfZXhfXyhzZWxmLCBwcm90byk6CisgICAgICAgIHNlbGYuX3Byb3RvID0gcHJvdG8KKyAgICAgICAgcmV0dXJuIFJFWF90d28sICgpCisgICAgIyBObyBfX3JlZHVjZV9fIGhlcmUsIGJ1dCBpbmhlcml0aW5nIGl0IGZyb20gb2JqZWN0CisKK2NsYXNzIFJFWF90aHJlZShvYmplY3QpOgorICAgIF9wcm90byA9IE5vbmUKKyAgICBkZWYgX19yZWR1Y2VfZXhfXyhzZWxmLCBwcm90byk6CisgICAgICAgIHNlbGYuX3Byb3RvID0gcHJvdG8KKyAgICAgICAgcmV0dXJuIFJFWF90d28sICgpCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICJUaGlzIF9fcmVkdWNlX18gc2hvdWxkbid0IGJlIGNhbGxlZCIKKworY2xhc3MgUkVYX2ZvdXIob2JqZWN0KToKKyAgICBfcHJvdG8gPSBOb25lCisgICAgZGVmIF9fcmVkdWNlX2V4X18oc2VsZiwgcHJvdG8pOgorICAgICAgICBzZWxmLl9wcm90byA9IHByb3RvCisgICAgICAgIHJldHVybiBvYmplY3QuX19yZWR1Y2VfZXhfXyhzZWxmLCBwcm90bykKKyAgICAjIENhbGxpbmcgYmFzZSBjbGFzcyBtZXRob2Qgc2hvdWxkIHN1Y2NlZWQKKworY2xhc3MgUkVYX2ZpdmUob2JqZWN0KToKKyAgICBfcmVkdWNlX2NhbGxlZCA9IDAKKyAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fcmVkdWNlX2NhbGxlZCA9IDEKKyAgICAgICAgcmV0dXJuIG9iamVjdC5fX3JlZHVjZV9fKHNlbGYpCisgICAgIyBUaGlzIG9uZSB1c2VkIHRvIGZhaWwgd2l0aCBpbmZpbml0ZSByZWN1cnNpb24KKworIyBUZXN0IGNsYXNzZXMgZm9yIG5ld29iagorCitjbGFzcyBNeUludChpbnQpOgorICAgIHNhbXBsZSA9IDEKKworY2xhc3MgTXlMb25nKGxvbmcpOgorICAgIHNhbXBsZSA9IDFMCisKK2NsYXNzIE15RmxvYXQoZmxvYXQpOgorICAgIHNhbXBsZSA9IDEuMAorCitjbGFzcyBNeUNvbXBsZXgoY29tcGxleCk6CisgICAgc2FtcGxlID0gMS4wICsgMC4wagorCitjbGFzcyBNeVN0cihzdHIpOgorICAgIHNhbXBsZSA9ICJoZWxsbyIKKworY2xhc3MgTXlVbmljb2RlKHVuaWNvZGUpOgorICAgIHNhbXBsZSA9IHUiaGVsbG8gXHUxMjM0IgorCitjbGFzcyBNeVR1cGxlKHR1cGxlKToKKyAgICBzYW1wbGUgPSAoMSwgMiwgMykKKworY2xhc3MgTXlMaXN0KGxpc3QpOgorICAgIHNhbXBsZSA9IFsxLCAyLCAzXQorCitjbGFzcyBNeURpY3QoZGljdCk6CisgICAgc2FtcGxlID0geyJhIjogMSwgImIiOiAyfQorCitteWNsYXNzZXMgPSBbTXlJbnQsIE15TG9uZywgTXlGbG9hdCwKKyAgICAgICAgICAgICBNeUNvbXBsZXgsCisgICAgICAgICAgICAgTXlTdHIsIE15VW5pY29kZSwKKyAgICAgICAgICAgICBNeVR1cGxlLCBNeUxpc3QsIE15RGljdF0KKworCitjbGFzcyBTbG90TGlzdChNeUxpc3QpOgorICAgIF9fc2xvdHNfXyA9IFsiZm9vIl0KKworY2xhc3MgU2ltcGxlTmV3T2JqKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGEsIGIsIGMpOgorICAgICAgICAjIHJhaXNlIGFuIGVycm9yLCB0byBtYWtlIHN1cmUgdGhpcyBpc24ndCBjYWxsZWQKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJTaW1wbGVOZXdPYmouX19pbml0X18oKSBkaWRuJ3QgZXhwZWN0IHRvIGdldCBjYWxsZWQiKQorCitjbGFzcyBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2R1bXBfY2xvc2VkX2ZpbGUoc2VsZik6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBmID0gb3BlbihURVNURk4sICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLm1vZHVsZS5kdW1wLCAxMjMsIGYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5yZW1vdmUoVEVTVEZOKQorCisgICAgZGVmIHRlc3RfbG9hZF9jbG9zZWRfZmlsZShzZWxmKToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYubW9kdWxlLmR1bXAsIDEyMywgZikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJlbW92ZShURVNURk4pCisKKyAgICBkZWYgdGVzdF9sb2FkX2Zyb21fYW5kX2R1bXBfdG9fZmlsZShzZWxmKToKKyAgICAgICAgc3RyZWFtID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgZGF0YSA9IFsxMjMsIHt9LCAxMjRdCisgICAgICAgIHNlbGYubW9kdWxlLmR1bXAoZGF0YSwgc3RyZWFtKQorICAgICAgICBzdHJlYW0uc2VlaygwKQorICAgICAgICB1bnBpY2tsZWQgPSBzZWxmLm1vZHVsZS5sb2FkKHN0cmVhbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bnBpY2tsZWQsIGRhdGEpCisKKyAgICBkZWYgdGVzdF9oaWdoZXN0X3Byb3RvY29sKHNlbGYpOgorICAgICAgICAjIE9mIGNvdXJzZSB0aGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgd2hlbiBISUdIRVNUX1BST1RPQ09MIGNoYW5nZXMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5tb2R1bGUuSElHSEVTVF9QUk9UT0NPTCwgMikKKworICAgIGRlZiB0ZXN0X2NhbGxhcGkoc2VsZik6CisgICAgICAgIGYgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAjIFdpdGggYW5kIHdpdGhvdXQga2V5d29yZCBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5tb2R1bGUuZHVtcCgxMjMsIGYsIC0xKQorICAgICAgICBzZWxmLm1vZHVsZS5kdW1wKDEyMywgZmlsZT1mLCBwcm90b2NvbD0tMSkKKyAgICAgICAgc2VsZi5tb2R1bGUuZHVtcHMoMTIzLCAtMSkKKyAgICAgICAgc2VsZi5tb2R1bGUuZHVtcHMoMTIzLCBwcm90b2NvbD0tMSkKKyAgICAgICAgc2VsZi5tb2R1bGUuUGlja2xlcihmLCAtMSkKKyAgICAgICAgc2VsZi5tb2R1bGUuUGlja2xlcihmLCBwcm90b2NvbD0tMSkKKworICAgIGRlZiB0ZXN0X2luY29tcGxldGVfaW5wdXQoc2VsZik6CisgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygiWCcnLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBzZWxmLm1vZHVsZS5sb2FkLCBzKQorCisgICAgZGVmIHRlc3RfcmVzdHJpY3RlZChzZWxmKToKKyAgICAgICAgIyBpc3N1ZTcxMjg6IGNQaWNrbGUgZmFpbGVkIGluIHJlc3RyaWN0ZWQgbW9kZQorICAgICAgICBidWlsdGlucyA9IHtzZWxmLm1vZHVsZS5fX25hbWVfXzogc2VsZi5tb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICdfX2ltcG9ydF9fJzogX19pbXBvcnRfX30KKyAgICAgICAgZCA9IHt9CisgICAgICAgIHRlc3RzdHIgPSAiZGVmIGYoKTogezB9LmR1bXBzKDApIi5mb3JtYXQoc2VsZi5tb2R1bGUuX19uYW1lX18pCisgICAgICAgIGV4ZWMgdGVzdHN0ciBpbiB7J19fYnVpbHRpbnNfXyc6IGJ1aWx0aW5zfSwgZAorICAgICAgICBkWydmJ10oKQorCisgICAgZGVmIHRlc3RfYmFkX2lucHV0KHNlbGYpOgorICAgICAgICAjIFRlc3QgaXNzdWU0Mjk4CisgICAgICAgIHMgPSAnXHg1OFwwXDBcMFx4NTQnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBzZWxmLm1vZHVsZS5sb2FkcywgcykKKyAgICAgICAgIyBUZXN0IGlzc3VlNzQ1NQorICAgICAgICBzID0gJzAnCisgICAgICAgICMgWFhYIFdoeSBkb2Vzbid0IHBpY2tsZSByYWlzZSBVbnBpY2tsaW5nRXJyb3I/CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChJbmRleEVycm9yLCBjUGlja2xlLlVucGlja2xpbmdFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLmxvYWRzLCBzKQorCitjbGFzcyBBYnN0cmFjdFBlcnNpc3RlbnRQaWNrbGVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBUaGlzIGNsYXNzIGRlZmluZXMgcGVyc2lzdGVudF9pZCgpIGFuZCBwZXJzaXN0ZW50X2xvYWQoKQorICAgICMgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIHBpY2tsZXIuICBBbGwgZXZlbiBpbnRlZ2VycworICAgICMgYXJlIHBpY2tsZWQgdXNpbmcgcGVyc2lzdGVudCBpZHMuCisKKyAgICBkZWYgcGVyc2lzdGVudF9pZChzZWxmLCBvYmplY3QpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG9iamVjdCwgaW50KSBhbmQgb2JqZWN0ICUgMiA9PSAwOgorICAgICAgICAgICAgc2VsZi5pZF9jb3VudCArPSAxCisgICAgICAgICAgICByZXR1cm4gc3RyKG9iamVjdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgcGVyc2lzdGVudF9sb2FkKHNlbGYsIG9pZCk6CisgICAgICAgIHNlbGYubG9hZF9jb3VudCArPSAxCisgICAgICAgIG9iamVjdCA9IGludChvaWQpCisgICAgICAgIGFzc2VydCBvYmplY3QgJSAyID09IDAKKyAgICAgICAgcmV0dXJuIG9iamVjdAorCisgICAgZGVmIHRlc3RfcGVyc2lzdGVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuaWRfY291bnQgPSAwCisgICAgICAgIHNlbGYubG9hZF9jb3VudCA9IDAKKyAgICAgICAgTCA9IHJhbmdlKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMoc2VsZi5kdW1wcyhMKSksIEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5pZF9jb3VudCwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRfY291bnQsIDUpCisKKyAgICBkZWYgdGVzdF9iaW5fcGVyc2lzdGVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuaWRfY291bnQgPSAwCisgICAgICAgIHNlbGYubG9hZF9jb3VudCA9IDAKKyAgICAgICAgTCA9IHJhbmdlKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMoc2VsZi5kdW1wcyhMLCAxKSksIEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5pZF9jb3VudCwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRfY291bnQsIDUpCisKK2NsYXNzIEFic3RyYWN0UGlja2xlclVucGlja2xlck9iamVjdFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIHBpY2tsZXJfY2xhc3MgPSBOb25lCisgICAgdW5waWNrbGVyX2NsYXNzID0gTm9uZQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5waWNrbGVyX2NsYXNzCisgICAgICAgIGFzc2VydCBzZWxmLnVucGlja2xlcl9jbGFzcworCisgICAgZGVmIHRlc3RfY2xlYXJfcGlja2xlcl9tZW1vKHNlbGYpOgorICAgICAgICAjIFRvIHRlc3Qgd2hldGhlciBjbGVhcl9tZW1vKCkgaGFzIGFueSBlZmZlY3QsIHdlIHBpY2tsZSBhbiBvYmplY3QsCisgICAgICAgICMgdGhlbiBwaWNrbGUgaXQgYWdhaW4gd2l0aG91dCBjbGVhcmluZyB0aGUgbWVtbzsgdGhlIHR3byBzZXJpYWxpemVkCisgICAgICAgICMgZm9ybXMgc2hvdWxkIGJlIGRpZmZlcmVudC4gSWYgd2UgY2xlYXJfbWVtbygpIGFuZCB0aGVuIHBpY2tsZSB0aGUKKyAgICAgICAgIyBvYmplY3QgYWdhaW4sIHRoZSB0aGlyZCBzZXJpYWxpemVkIGZvcm0gc2hvdWxkIGJlIGlkZW50aWNhbCB0byB0aGUKKyAgICAgICAgIyBmaXJzdCBvbmUgd2Ugb2J0YWluZWQuCisgICAgICAgIGRhdGEgPSBbImFiY2RlZmciLCAiYWJjZGVmZyIsIDQ0XQorICAgICAgICBmID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgcGlja2xlciA9IHNlbGYucGlja2xlcl9jbGFzcyhmKQorCisgICAgICAgIHBpY2tsZXIuZHVtcChkYXRhKQorICAgICAgICBmaXJzdF9waWNrbGVkID0gZi5nZXR2YWx1ZSgpCisKKyAgICAgICAgIyBSZXNldCBTdHJpbmdJTyBvYmplY3QuCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBmLnRydW5jYXRlKCkKKworICAgICAgICBwaWNrbGVyLmR1bXAoZGF0YSkKKyAgICAgICAgc2Vjb25kX3BpY2tsZWQgPSBmLmdldHZhbHVlKCkKKworICAgICAgICAjIFJlc2V0IHRoZSBQaWNrbGVyIGFuZCBTdHJpbmdJTyBvYmplY3RzLgorICAgICAgICBwaWNrbGVyLmNsZWFyX21lbW8oKQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgZi50cnVuY2F0ZSgpCisKKyAgICAgICAgcGlja2xlci5kdW1wKGRhdGEpCisgICAgICAgIHRoaXJkX3BpY2tsZWQgPSBmLmdldHZhbHVlKCkKKworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZpcnN0X3BpY2tsZWQsIHNlY29uZF9waWNrbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3BpY2tsZWQsIHRoaXJkX3BpY2tsZWQpCisKKyAgICBkZWYgdGVzdF9wcmltaW5nX3BpY2tsZXJfbWVtbyhzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB3ZSBjYW4gc2V0IHRoZSBQaWNrbGVyJ3MgbWVtbyBhdHRyaWJ1dGUuCisgICAgICAgIGRhdGEgPSBbImFiY2RlZmciLCAiYWJjZGVmZyIsIDQ0XQorICAgICAgICBmID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgcGlja2xlciA9IHNlbGYucGlja2xlcl9jbGFzcyhmKQorCisgICAgICAgIHBpY2tsZXIuZHVtcChkYXRhKQorICAgICAgICBmaXJzdF9waWNrbGVkID0gZi5nZXR2YWx1ZSgpCisKKyAgICAgICAgZiA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHByaW1lZCA9IHNlbGYucGlja2xlcl9jbGFzcyhmKQorICAgICAgICBwcmltZWQubWVtbyA9IHBpY2tsZXIubWVtbworCisgICAgICAgIHByaW1lZC5kdW1wKGRhdGEpCisgICAgICAgIHByaW1lZF9waWNrbGVkID0gZi5nZXR2YWx1ZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmaXJzdF9waWNrbGVkLCBwcmltZWRfcGlja2xlZCkKKworICAgIGRlZiB0ZXN0X3ByaW1pbmdfdW5waWNrbGVyX21lbW8oc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgd2UgY2FuIHNldCB0aGUgVW5waWNrbGVyJ3MgbWVtbyBhdHRyaWJ1dGUuCisgICAgICAgIGRhdGEgPSBbImFiY2RlZmciLCAiYWJjZGVmZyIsIDQ0XQorICAgICAgICBmID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgcGlja2xlciA9IHNlbGYucGlja2xlcl9jbGFzcyhmKQorCisgICAgICAgIHBpY2tsZXIuZHVtcChkYXRhKQorICAgICAgICBmaXJzdF9waWNrbGVkID0gZi5nZXR2YWx1ZSgpCisKKyAgICAgICAgZiA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHByaW1lZCA9IHNlbGYucGlja2xlcl9jbGFzcyhmKQorICAgICAgICBwcmltZWQubWVtbyA9IHBpY2tsZXIubWVtbworCisgICAgICAgIHByaW1lZC5kdW1wKGRhdGEpCisgICAgICAgIHByaW1lZF9waWNrbGVkID0gZi5nZXR2YWx1ZSgpCisKKyAgICAgICAgdW5waWNrbGVyID0gc2VsZi51bnBpY2tsZXJfY2xhc3MoY1N0cmluZ0lPLlN0cmluZ0lPKGZpcnN0X3BpY2tsZWQpKQorICAgICAgICB1bnBpY2tsZWRfZGF0YTEgPSB1bnBpY2tsZXIubG9hZCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bnBpY2tsZWRfZGF0YTEsIGRhdGEpCisKKyAgICAgICAgcHJpbWVkID0gc2VsZi51bnBpY2tsZXJfY2xhc3MoY1N0cmluZ0lPLlN0cmluZ0lPKHByaW1lZF9waWNrbGVkKSkKKyAgICAgICAgcHJpbWVkLm1lbW8gPSB1bnBpY2tsZXIubWVtbworICAgICAgICB1bnBpY2tsZWRfZGF0YTIgPSBwcmltZWQubG9hZCgpCisKKyAgICAgICAgcHJpbWVkLm1lbW8uY2xlYXIoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5waWNrbGVkX2RhdGEyLCBkYXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5waWNrbGVkX2RhdGEyIGlzIHVucGlja2xlZF9kYXRhMSkKKworICAgIGRlZiB0ZXN0X3JldXNpbmdfdW5waWNrbGVyX29iamVjdHMoc2VsZik6CisgICAgICAgIGRhdGExID0gWyJhYmNkZWZnIiwgImFiY2RlZmciLCA0NF0KKyAgICAgICAgZiA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHBpY2tsZXIgPSBzZWxmLnBpY2tsZXJfY2xhc3MoZikKKyAgICAgICAgcGlja2xlci5kdW1wKGRhdGExKQorICAgICAgICBwaWNrbGVkMSA9IGYuZ2V0dmFsdWUoKQorCisgICAgICAgIGRhdGEyID0gWyJhYmNkZWZnIiwgNDQsIDQ0XQorICAgICAgICBmID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgcGlja2xlciA9IHNlbGYucGlja2xlcl9jbGFzcyhmKQorICAgICAgICBwaWNrbGVyLmR1bXAoZGF0YTIpCisgICAgICAgIHBpY2tsZWQyID0gZi5nZXR2YWx1ZSgpCisKKyAgICAgICAgZiA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGYud3JpdGUocGlja2xlZDEpCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICB1bnBpY2tsZXIgPSBzZWxmLnVucGlja2xlcl9jbGFzcyhmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVucGlja2xlci5sb2FkKCksIGRhdGExKQorCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBmLnRydW5jYXRlKCkKKyAgICAgICAgZi53cml0ZShwaWNrbGVkMikKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5waWNrbGVyLmxvYWQoKSwgZGF0YTIpCisKK2NsYXNzIEJpZ21lbVBpY2tsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICMgTWVtb3J5IHJlcXVpcmVtZW50czogMSBieXRlIHBlciBjaGFyYWN0ZXIgZm9yIGlucHV0IHN0cmluZ3MsIDEgYnl0ZQorICAgICMgZm9yIHBpY2tsZWQgZGF0YSwgMSBieXRlIGZvciB1bnBpY2tsZWQgc3RyaW5ncywgMSBieXRlIGZvciBpbnRlcm5hbAorICAgICMgYnVmZmVyIGFuZCAxIGJ5dGUgb2YgZnJlZSBzcGFjZSBmb3IgcmVzaXppbmcgb2YgaW50ZXJuYWwgYnVmZmVyLgorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fMkcgKyAxMDAqXzFNLCBtZW11c2U9NSkKKyAgICBkZWYgdGVzdF9odWdlX3N0cmxpc3Qoc2VsZiwgc2l6ZSk6CisgICAgICAgIGNodW5rc2l6ZSA9IDIqKjIwCisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICB3aGlsZSBzaXplID4gY2h1bmtzaXplOgorICAgICAgICAgICAgZGF0YS5hcHBlbmQoJ3gnICogY2h1bmtzaXplKQorICAgICAgICAgICAgc2l6ZSAtPSBjaHVua3NpemUKKyAgICAgICAgICAgIGNodW5rc2l6ZSArPSAxCisgICAgICAgIGRhdGEuYXBwZW5kKCd5JyAqIHNpemUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBpY2tsZWQgPSBzZWxmLmR1bXBzKGRhdGEsIHByb3RvKQorICAgICAgICAgICAgICAgICAgICByZXMgPSBzZWxmLmxvYWRzKHBpY2tsZWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBkYXRhKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgcGlja2xlZCA9IE5vbmUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRhdGEgPSBOb25lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcGlja2xldGVzdGVyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9waWNrbGV0ZXN0ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGVjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcGlja2xldGVzdGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcGlja2xldGVzdGVyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9waWNrbGV0ZXN0ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2RjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcGlja2xldGVzdGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcHJvZmlsZWUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHJvZmlsZWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkMmM4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9wcm9maWxlZS5weQpAQCAtMCwwICsxLDExNSBAQAorIiIiCitJbnB1dCBmb3IgdGVzdF9wcm9maWxlLnB5IGFuZCB0ZXN0X2Nwcm9maWxlLnB5LgorCitJTVBPUlRBTlQ6IFRoaXMgc3R1ZmYgaXMgdG91Y2h5LiBJZiB5b3UgbW9kaWZ5IGFueXRoaW5nIGFib3ZlIHRoZQordGVzdCBjbGFzcyB5b3UnbGwgaGF2ZSB0byByZWdlbmVyYXRlIHRoZSBzdGF0cyBieSBydW5uaW5nIHRoZSB0d28KK3Rlc3QgZmlsZXMuCisKKypBTEwqIE5VTUJFUlMgaW4gdGhlIGV4cGVjdGVkIG91dHB1dCBhcmUgcmVsZXZhbnQuICBJZiB5b3UgY2hhbmdlCit0aGUgZm9ybWF0dGluZyBvZiBwc3RhdHMsIHBsZWFzZSBkb24ndCBqdXN0IHJlZ2VuZXJhdGUgdGhlIGV4cGVjdGVkCitvdXRwdXQgd2l0aG91dCBjaGVja2luZyB2ZXJ5IGNhcmVmdWxseSB0aGF0IG5vdCBhIHNpbmdsZSBudW1iZXIgaGFzCitjaGFuZ2VkLgorIiIiCisKK2ltcG9ydCBzeXMKKworIyBJbiBvcmRlciB0byBoYXZlIHJlcHJvZHVjaWJsZSB0aW1lLCB3ZSBzaW11bGF0ZSBhIHRpbWVyIGluIHRoZSBnbG9iYWwKKyMgdmFyaWFibGUgJ1RJQ0tTJywgd2hpY2ggcmVwcmVzZW50cyBzaW11bGF0ZWQgdGltZSBpbiBtaWxsaXNlY29uZHMuCisjIChXZSBjYW4ndCB1c2UgYSBoZWxwZXIgZnVuY3Rpb24gaW5jcmVtZW50IHRoZSB0aW1lciBzaW5jZSBpdCB3b3VsZCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgcHJvZmlsZSBhbmQgd291bGQgYXBwZWFyIHRvIGNvbnN1bWUgYWxsIHRoZSB0aW1lLikKK1RJQ0tTID0gNDIwMDAKKworZGVmIHRpbWVyKCk6CisgICAgcmV0dXJuIFRJQ0tTCisKK2RlZiB0ZXN0ZnVuYygpOgorICAgICMgMSBjYWxsCisgICAgIyAxMDAwIHRpY2tzIHRvdGFsOiAyNzAgdGlja3MgbG9jYWwsIDczMCB0aWNrcyBpbiBzdWJmdW5jdGlvbnMKKyAgICBnbG9iYWwgVElDS1MKKyAgICBUSUNLUyArPSA5OQorICAgIGhlbHBlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMzAwCisgICAgaGVscGVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAzMDAKKyAgICBUSUNLUyArPSAxNzEKKyAgICBmYWN0b3JpYWwoMTQpICAgICAgICAgICAgICAgICAgICAgICAjIDEzMAorCitkZWYgZmFjdG9yaWFsKG4pOgorICAgICMgMjMgY2FsbHMgdG90YWwKKyAgICAjIDE3MCB0aWNrcyB0b3RhbCwgMTUwIHRpY2tzIGxvY2FsCisgICAgIyAzIHByaW1pdGl2ZSBjYWxscywgMTMwLCAyMCBhbmQgMjAgdGlja3MgdG90YWwKKyAgICAjIGluY2x1ZGluZyAxMTYsIDE3LCAxNyB0aWNrcyBsb2NhbAorICAgIGdsb2JhbCBUSUNLUworICAgIGlmIG4gPiAwOgorICAgICAgICBUSUNLUyArPSBuCisgICAgICAgIHJldHVybiBtdWwobiwgZmFjdG9yaWFsKG4tMSkpCisgICAgZWxzZToKKyAgICAgICAgVElDS1MgKz0gMTEKKyAgICAgICAgcmV0dXJuIDEKKworZGVmIG11bChhLCBiKToKKyAgICAjIDIwIGNhbGxzCisgICAgIyAxIHRpY2ssIGxvY2FsCisgICAgZ2xvYmFsIFRJQ0tTCisgICAgVElDS1MgKz0gMQorICAgIHJldHVybiBhICogYgorCitkZWYgaGVscGVyKCk6CisgICAgIyAyIGNhbGxzCisgICAgIyAzMDAgdGlja3MgdG90YWw6IDIwIHRpY2tzIGxvY2FsLCAyNjAgdGlja3MgaW4gc3ViZnVuY3Rpb25zCisgICAgZ2xvYmFsIFRJQ0tTCisgICAgVElDS1MgKz0gMQorICAgIGhlbHBlcjEoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMzAKKyAgICBUSUNLUyArPSAyCisgICAgaGVscGVyMSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAzMAorICAgIFRJQ0tTICs9IDYKKyAgICBoZWxwZXIyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDUwCisgICAgVElDS1MgKz0gMworICAgIGhlbHBlcjIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgNTAKKyAgICBUSUNLUyArPSAyCisgICAgaGVscGVyMigpICAgICAgICAgICAgICAgICAgICAgICAgICAgIyA1MAorICAgIFRJQ0tTICs9IDUKKyAgICBoZWxwZXIyX2luZGlyZWN0KCkgICAgICAgICAgICAgICAgICAjIDcwCisgICAgVElDS1MgKz0gMQorCitkZWYgaGVscGVyMSgpOgorICAgICMgNCBjYWxscworICAgICMgMzAgdGlja3MgdG90YWw6IDI5IHRpY2tzIGxvY2FsLCAxIHRpY2sgaW4gc3ViZnVuY3Rpb25zCisgICAgZ2xvYmFsIFRJQ0tTCisgICAgVElDS1MgKz0gMTAKKyAgICBoYXNhdHRyKEMoKSwgImZvbyIpICAgICAgICAgICAgICAgICAjIDEKKyAgICBUSUNLUyArPSAxOQorICAgIGxzdCA9IFtdCisgICAgbHN0LmFwcGVuZCg0MikgICAgICAgICAgICAgICAgICAgICAgIyAwCisgICAgc3lzLmV4Y19pbmZvKCkgICAgICAgICAgICAgICAgICAgICAgIyAwCisKK2RlZiBoZWxwZXIyX2luZGlyZWN0KCk6CisgICAgaGVscGVyMigpICAgICAgICAgICAgICAgICAgICAgICAgICAgIyA1MAorICAgIGZhY3RvcmlhbCgzKSAgICAgICAgICAgICAgICAgICAgICAgICMgMjAKKworZGVmIGhlbHBlcjIoKToKKyAgICAjIDggY2FsbHMKKyAgICAjIDUwIHRpY2tzIGxvY2FsOiAzOSB0aWNrcyBsb2NhbCwgMTEgdGlja3MgaW4gc3ViZnVuY3Rpb25zCisgICAgZ2xvYmFsIFRJQ0tTCisgICAgVElDS1MgKz0gMTEKKyAgICBoYXNhdHRyKEMoKSwgImJhciIpICAgICAgICAgICAgICAgICAjIDEKKyAgICBUSUNLUyArPSAxMworICAgIHN1YmhlbHBlcigpICAgICAgICAgICAgICAgICAgICAgICAgICMgMTAKKyAgICBUSUNLUyArPSAxNQorCitkZWYgc3ViaGVscGVyKCk6CisgICAgIyA4IGNhbGxzCisgICAgIyAxMCB0aWNrcyB0b3RhbDogOCB0aWNrcyBsb2NhbCwgMiB0aWNrcyBpbiBzdWJmdW5jdGlvbnMKKyAgICBnbG9iYWwgVElDS1MKKyAgICBUSUNLUyArPSAyCisgICAgZm9yIGkgaW4gcmFuZ2UoMik6ICAgICAgICAgICAgICAgICAgIyAwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEMoKS5mb28gICAgICAgICAgICAgICAgICAgICAjIDEgeCAyCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIFRJQ0tTICs9IDMgICAgICAgICAgICAgICAgICAjIDMgeCAyCisKK2NsYXNzIEM6CisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAjIDI4IGNhbGxzCisgICAgICAgICMgMSB0aWNrLCBsb2NhbAorICAgICAgICBnbG9iYWwgVElDS1MKKyAgICAgICAgVElDS1MgKz0gMQorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Byb2ZpbGVlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9wcm9maWxlZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlMTBiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9wcm9maWxlZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Byb2ZpbGVlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9wcm9maWxlZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlMTBiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9wcm9maWxlZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3B5Y2xicl9pbnB1dC5weSBiL2xpYi9weXRob24yLjcvdGVzdC9weWNsYnJfaW5wdXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljY2Q2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9weWNsYnJfaW5wdXQucHkKQEAgLTAsMCArMSwzMyBAQAorIiIiVGVzdCBjYXNlcyBmb3IgdGVzdF9weWNsYnIucHkiIiIKKworZGVmIGYoKTogcGFzcworCitjbGFzcyBPdGhlcihvYmplY3QpOgorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmb28oYyk6IHBhc3MKKworICAgIGRlZiBvbShzZWxmKTogcGFzcworCitjbGFzcyBCIChvYmplY3QpOgorICAgIGRlZiBibShzZWxmKTogcGFzcworCitjbGFzcyBDIChCKToKKyAgICBmb28gPSBPdGhlcigpLmZvbworICAgIG9tID0gT3RoZXIub20KKworICAgIGQgPSAxMAorCisgICAgIyBYWFg6IFRoaXMgY2F1c2VzIHRlc3RfcHljbGJyLnB5IHRvIGZhaWwsIGJ1dCBvbmx5IGJlY2F1c2UgdGhlCisgICAgIyAgICAgIGludHJvc3BlY3Rpb24tYmFzZWQgaXNfbWV0aG9kKCkgY29kZSBpbiB0aGUgdGVzdCBjYW4ndAorICAgICMgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoaXMgYW5kIGEgZ2VudWluZSBtZXRob2QgZnVuY3Rpb24gbGlrZSBtKCkuCisgICAgIyAgICAgIFRoZSBweWNsYnIucHkgbW9kdWxlIGdldHMgdGhpcyByaWdodCBhcyBpdCBwYXJzZXMgdGhlIHRleHQuCisgICAgIworICAgICNmID0gZgorCisgICAgZGVmIG0oc2VsZik6IHBhc3MKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgc20oc2VsZik6IHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBjbShzZWxmKTogcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3B5Y2xicl9pbnB1dC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHljbGJyX2lucHV0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDBmODZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5Y2xicl9pbnB1dC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3B5Y2xicl9pbnB1dC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvcHljbGJyX2lucHV0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDBmODZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5Y2xicl9pbnB1dC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3B5ZG9jX21vZC5weSBiL2xpYi9weXRob24yLjcvdGVzdC9weWRvY19tb2QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM1MzMyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9weWRvY19tb2QucHkKQEAgLTAsMCArMSwyNyBAQAorIiIiVGhpcyBpcyBhIHRlc3QgbW9kdWxlIGZvciB0ZXN0X3B5ZG9jIiIiCisKK19fYXV0aG9yX18gPSAiQmVuamFtaW4gUGV0ZXJzb24iCitfX2NyZWRpdHNfXyA9ICJOb2JvZHkiCitfX3ZlcnNpb25fXyA9ICIxLjIuMy40IgorCisKK2NsYXNzIEE6CisgICAgIiIiSGVsbG8gYW5kIGdvb2RieWUiIiIKKyAgICBkZWYgX19pbml0X18oKToKKyAgICAgICAgIiIiV293LCBJIGhhdmUgbm8gZnVuY3Rpb24hIiIiCisgICAgICAgIHBhc3MKKworY2xhc3MgQihvYmplY3QpOgorICAgIE5PX01FQU5JTkcgPSAiZWdncyIKKyAgICBwYXNzCisKK2RlZiBkb2NfZnVuYygpOgorICAgICIiIgorICAgIFRoaXMgZnVuY3Rpb24gc29sdmVzIGFsbCBvZiB0aGUgd29ybGQncyBwcm9ibGVtczoKKyAgICBodW5nZXIKKyAgICBsYWNrIG9mIFB5dGhvbgorICAgIHdhcgorICAgICIiIgorCitkZWYgbm9kb2NfZnVuYygpOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9weWRvY19tb2QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5ZG9jX21vZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5ZTQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9weWRvY19tb2QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9weWRvY19tb2QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5ZG9jX21vZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5ZTQ5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9weWRvY19tb2QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9weWRvY2ZvZGRlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC9weWRvY2ZvZGRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2YxY2JkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5ZG9jZm9kZGVyLnB5CkBAIC0wLDAgKzEsMjE2IEBACisiIiJTb21ldGhpbmcganVzdCB0byBsb29rIGF0IHZpYSBweWRvYy4iIiIKKworaW1wb3J0IHR5cGVzCisKK2NsYXNzIEFfY2xhc3NpYzoKKyAgICAiQSBjbGFzc2ljIGNsYXNzLiIKKyAgICBkZWYgQV9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLiIKKyAgICBkZWYgQUJfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSBhbmQgQi4iCisgICAgZGVmIEFDX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEgYW5kIEMuIgorICAgIGRlZiBBRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBIGFuZCBELiIKKyAgICBkZWYgQUJDX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEIgYW5kIEMuIgorICAgIGRlZiBBQkRfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiBhbmQgRC4iCisgICAgZGVmIEFDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBDIGFuZCBELiIKKyAgICBkZWYgQUJDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCLCBDIGFuZCBELiIKKworCitjbGFzcyBCX2NsYXNzaWMoQV9jbGFzc2ljKToKKyAgICAiQSBjbGFzc2ljIGNsYXNzLCBkZXJpdmVkIGZyb20gQV9jbGFzc2ljLiIKKyAgICBkZWYgQUJfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSBhbmQgQi4iCisgICAgZGVmIEFCQ19tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCIGFuZCBDLiIKKyAgICBkZWYgQUJEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEIgYW5kIEQuIgorICAgIGRlZiBBQkNEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEIsIEMgYW5kIEQuIgorICAgIGRlZiBCX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEIuIgorICAgIGRlZiBCQ19tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBCIGFuZCBDLiIKKyAgICBkZWYgQkRfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQiBhbmQgRC4iCisgICAgZGVmIEJDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBCLCBDIGFuZCBELiIKKworY2xhc3MgQ19jbGFzc2ljKEFfY2xhc3NpYyk6CisgICAgIkEgY2xhc3NpYyBjbGFzcywgZGVyaXZlZCBmcm9tIEFfY2xhc3NpYy4iCisgICAgZGVmIEFDX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEgYW5kIEMuIgorICAgIGRlZiBBQkNfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiBhbmQgQy4iCisgICAgZGVmIEFDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBDIGFuZCBELiIKKyAgICBkZWYgQUJDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCLCBDIGFuZCBELiIKKyAgICBkZWYgQkNfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQiBhbmQgQy4iCisgICAgZGVmIEJDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBCLCBDIGFuZCBELiIKKyAgICBkZWYgQ19tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBDLiIKKyAgICBkZWYgQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQyBhbmQgRC4iCisKK2NsYXNzIERfY2xhc3NpYyhCX2NsYXNzaWMsIENfY2xhc3NpYyk6CisgICAgIkEgY2xhc3NpYyBjbGFzcywgZGVyaXZlZCBmcm9tIEJfY2xhc3NpYyBhbmQgQ19jbGFzc2ljLiIKKyAgICBkZWYgQURfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSBhbmQgRC4iCisgICAgZGVmIEFCRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCIGFuZCBELiIKKyAgICBkZWYgQUNEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEMgYW5kIEQuIgorICAgIGRlZiBBQkNEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEIsIEMgYW5kIEQuIgorICAgIGRlZiBCRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBCIGFuZCBELiIKKyAgICBkZWYgQkNEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEIsIEMgYW5kIEQuIgorICAgIGRlZiBDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBDIGFuZCBELiIKKyAgICBkZWYgRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBELiIKKworCitjbGFzcyBBX25ldyhvYmplY3QpOgorICAgICJBIG5ldy1zdHlsZSBjbGFzcy4iCisKKyAgICBkZWYgQV9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLiIKKyAgICBkZWYgQUJfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSBhbmQgQi4iCisgICAgZGVmIEFDX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEgYW5kIEMuIgorICAgIGRlZiBBRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBIGFuZCBELiIKKyAgICBkZWYgQUJDX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEIgYW5kIEMuIgorICAgIGRlZiBBQkRfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiBhbmQgRC4iCisgICAgZGVmIEFDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBDIGFuZCBELiIKKyAgICBkZWYgQUJDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCLCBDIGFuZCBELiIKKworICAgIGRlZiBBX2NsYXNzbWV0aG9kKGNscywgeCk6CisgICAgICAgICJBIGNsYXNzIG1ldGhvZCBkZWZpbmVkIGluIEEuIgorICAgIEFfY2xhc3NtZXRob2QgPSBjbGFzc21ldGhvZChBX2NsYXNzbWV0aG9kKQorCisgICAgZGVmIEFfc3RhdGljbWV0aG9kKCk6CisgICAgICAgICJBIHN0YXRpYyBtZXRob2QgZGVmaW5lZCBpbiBBLiIKKyAgICBBX3N0YXRpY21ldGhvZCA9IHN0YXRpY21ldGhvZChBX3N0YXRpY21ldGhvZCkKKworICAgIGRlZiBfZ2V0eChzZWxmKToKKyAgICAgICAgIkEgcHJvcGVydHkgZ2V0dGVyIGZ1bmN0aW9uLiIKKyAgICBkZWYgX3NldHgoc2VsZiwgdmFsdWUpOgorICAgICAgICAiQSBwcm9wZXJ0eSBzZXR0ZXIgZnVuY3Rpb24uIgorICAgIGRlZiBfZGVseChzZWxmKToKKyAgICAgICAgIkEgcHJvcGVydHkgZGVsZXRlciBmdW5jdGlvbi4iCisgICAgQV9wcm9wZXJ0eSA9IHByb3BlcnR5KGZkZWw9X2RlbHgsIGZnZXQ9X2dldHgsIGZzZXQ9X3NldHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYz0iQSBzYW1wbGUgcHJvcGVydHkgZGVmaW5lZCBpbiBBLiIpCisKKyAgICBBX2ludF9hbGlhcyA9IGludAorCitjbGFzcyBCX25ldyhBX25ldyk6CisgICAgIkEgbmV3LXN0eWxlIGNsYXNzLCBkZXJpdmVkIGZyb20gQV9uZXcuIgorCisgICAgZGVmIEFCX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEgYW5kIEIuIgorICAgIGRlZiBBQkNfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiBhbmQgQy4iCisgICAgZGVmIEFCRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCIGFuZCBELiIKKyAgICBkZWYgQUJDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCLCBDIGFuZCBELiIKKyAgICBkZWYgQl9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBCLiIKKyAgICBkZWYgQkNfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQiBhbmQgQy4iCisgICAgZGVmIEJEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEIgYW5kIEQuIgorICAgIGRlZiBCQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQiwgQyBhbmQgRC4iCisKK2NsYXNzIENfbmV3KEFfbmV3KToKKyAgICAiQSBuZXctc3R5bGUgY2xhc3MsIGRlcml2ZWQgZnJvbSBBX25ldy4iCisKKyAgICBkZWYgQUNfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSBhbmQgQy4iCisgICAgZGVmIEFCQ19tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCIGFuZCBDLiIKKyAgICBkZWYgQUNEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEMgYW5kIEQuIgorICAgIGRlZiBBQkNEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEIsIEMgYW5kIEQuIgorICAgIGRlZiBCQ19tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBCIGFuZCBDLiIKKyAgICBkZWYgQkNEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEIsIEMgYW5kIEQuIgorICAgIGRlZiBDX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEMuIgorICAgIGRlZiBDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBDIGFuZCBELiIKKworY2xhc3MgRF9uZXcoQl9uZXcsIENfbmV3KToKKyAgICAiIiJBIG5ldy1zdHlsZSBjbGFzcywgZGVyaXZlZCBmcm9tIEJfbmV3IGFuZCBDX25ldy4KKyAgICAiIiIKKworICAgIGRlZiBBRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBIGFuZCBELiIKKyAgICBkZWYgQUJEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEIgYW5kIEQuIgorICAgIGRlZiBBQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQyBhbmQgRC4iCisgICAgZGVmIEFCQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiwgQyBhbmQgRC4iCisgICAgZGVmIEJEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEIgYW5kIEQuIgorICAgIGRlZiBCQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQiwgQyBhbmQgRC4iCisgICAgZGVmIENEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEMgYW5kIEQuIgorICAgIGRlZiBEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEQuIgorCitjbGFzcyBGdW5reVByb3BlcnRpZXMob2JqZWN0KToKKyAgICAiIiJGcm9tIFNGIGJ1ZyA0NzIzNDcsIGJ5IFJvZWxhbmQgUmVuZ2VsaW5rLgorCisgICAgUHJvcGVydHkgZ2V0dGVycyBldGMgbWF5IG5vdCBiZSB2YW5pbGxhIGZ1bmN0aW9ucyBvciBtZXRob2RzLAorICAgIGFuZCB0aGlzIHVzZWQgdG8gbWFrZSBHVUkgcHlkb2MgYmxvdyB1cC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5kZXNjID0geyd4JzowfQorCisgICAgY2xhc3MgZ2V0X2Rlc2M6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgICAgIHNlbGYuYXR0ciA9IGF0dHIKKyAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYsIGluc3QpOgorICAgICAgICAgICAgcHJpbnQgJ0dldCBjYWxsZWQnLCBzZWxmLCBpbnN0CisgICAgICAgICAgICByZXR1cm4gaW5zdC5kZXNjW3NlbGYuYXR0cl0KKyAgICBjbGFzcyBzZXRfZGVzYzoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGF0dHIpOgorICAgICAgICAgICAgc2VsZi5hdHRyID0gYXR0cgorICAgICAgICBkZWYgX19jYWxsX18oc2VsZiwgaW5zdCwgdmFsKToKKyAgICAgICAgICAgIHByaW50ICdTZXQgY2FsbGVkJywgc2VsZiwgaW5zdCwgdmFsCisgICAgICAgICAgICBpbnN0LmRlc2Nbc2VsZi5hdHRyXSA9IHZhbAorICAgIGNsYXNzIGRlbF9kZXNjOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYXR0cik6CisgICAgICAgICAgICBzZWxmLmF0dHIgPSBhdHRyCisgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBpbnN0KToKKyAgICAgICAgICAgIHByaW50ICdEZWwgY2FsbGVkJywgc2VsZiwgaW5zdAorICAgICAgICAgICAgZGVsIGluc3QuZGVzY1tzZWxmLmF0dHJdCisKKyAgICB4ID0gcHJvcGVydHkoZ2V0X2Rlc2MoJ3gnKSwgc2V0X2Rlc2MoJ3gnKSwgZGVsX2Rlc2MoJ3gnKSwgJ3Byb3AgeCcpCisKKworc3VibW9kdWxlID0gdHlwZXMuTW9kdWxlVHlwZShfX25hbWVfXyArICcuc3VibW9kdWxlJywKKyAgICAiIiJBIHN1Ym1vZHVsZSwgd2hpY2ggc2hvdWxkIGFwcGVhciBpbiBpdHMgcGFyZW50J3Mgc3VtbWFyeSIiIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9weWRvY2ZvZGRlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2Nmb2RkZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzk3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2Nmb2RkZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9weWRvY2ZvZGRlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2Nmb2RkZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzk3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2Nmb2RkZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9weXN0b25lLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5c3RvbmUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzk4OTJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9weXN0b25lLnB5CkBAIC0wLDAgKzEsMjcwIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIgorIlBZU1RPTkUiIEJlbmNobWFyayBQcm9ncmFtCisKK1ZlcnNpb246ICAgICAgICBQeXRob24vMS4xIChjb3JyZXNwb25kcyB0byBDLzEuMSBwbHVzIDIgUHlzdG9uZSBmaXhlcykKKworQXV0aG9yOiAgICAgICAgIFJlaW5ob2xkIFAuIFdlaWNrZXIsICBDQUNNIFZvbCAyNywgTm8gMTAsIDEwLzg0IHBnLiAxMDEzLgorCisgICAgICAgICAgICAgICAgVHJhbnNsYXRlZCBmcm9tIEFEQSB0byBDIGJ5IFJpY2sgUmljaGFyZHNvbi4KKyAgICAgICAgICAgICAgICBFdmVyeSBtZXRob2QgdG8gcHJlc2VydmUgQURBLWxpa2VuZXNzIGhhcyBiZWVuIHVzZWQsCisgICAgICAgICAgICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgQy1uZXNzLgorCisgICAgICAgICAgICAgICAgVHJhbnNsYXRlZCBmcm9tIEMgdG8gUHl0aG9uIGJ5IEd1aWRvIHZhbiBSb3NzdW0uCisKK1ZlcnNpb24gSGlzdG9yeToKKworICAgICAgICAgICAgICAgIFZlcnNpb24gMS4xIGNvcnJlY3RzIHR3byBidWdzIGluIHZlcnNpb24gMS4wOgorCisgICAgICAgICAgICAgICAgRmlyc3QsIGl0IGxlYWtlZCBtZW1vcnk6IGluIFByb2MxKCksIE5leHRSZWNvcmQgZW5kcworICAgICAgICAgICAgICAgIHVwIGhhdmluZyBhIHBvaW50ZXIgdG8gaXRzZWxmLiAgSSBoYXZlIGNvcnJlY3RlZCB0aGlzCisgICAgICAgICAgICAgICAgYnkgemFwcGluZyBOZXh0UmVjb3JkLlB0ckNvbXAgYXQgdGhlIGVuZCBvZiBQcm9jMSgpLgorCisgICAgICAgICAgICAgICAgU2Vjb25kLCBQcm9jMygpIHVzZWQgdGhlIG9wZXJhdG9yICE9IHRvIGNvbXBhcmUgYQorICAgICAgICAgICAgICAgIHJlY29yZCB0byBOb25lLiAgVGhpcyBpcyByYXRoZXIgaW5lZmZpY2llbnQgYW5kIG5vdAorICAgICAgICAgICAgICAgIHRydWUgdG8gdGhlIGludGVudGlvbiBvZiB0aGUgb3JpZ2luYWwgYmVuY2htYXJrICh3aGVyZQorICAgICAgICAgICAgICAgIGEgcG9pbnRlciBjb21wYXJpc29uIHRvIE5vbmUgaXMgaW50ZW5kZWQ7IHRoZSAhPQorICAgICAgICAgICAgICAgIG9wZXJhdG9yIGF0dGVtcHRzIHRvIGZpbmQgYSBtZXRob2QgX19jbXBfXyB0byBkbyB2YWx1ZQorICAgICAgICAgICAgICAgIGNvbXBhcmlzb24gb2YgdGhlIHJlY29yZCkuICBWZXJzaW9uIDEuMSBydW5zIDUtMTAKKyAgICAgICAgICAgICAgICBwZXJjZW50IGZhc3RlciB0aGFuIHZlcnNpb24gMS4wLCBzbyBiZW5jaG1hcmsgZmlndXJlcworICAgICAgICAgICAgICAgIG9mIGRpZmZlcmVudCB2ZXJzaW9ucyBjYW4ndCBiZSBjb21wYXJlZCBkaXJlY3RseS4KKworIiIiCisKK0xPT1BTID0gNTAwMDAKKworZnJvbSB0aW1lIGltcG9ydCBjbG9jaworCitfX3ZlcnNpb25fXyA9ICIxLjEiCisKK1tJZGVudDEsIElkZW50MiwgSWRlbnQzLCBJZGVudDQsIElkZW50NV0gPSByYW5nZSgxLCA2KQorCitjbGFzcyBSZWNvcmQ6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgUHRyQ29tcCA9IE5vbmUsIERpc2NyID0gMCwgRW51bUNvbXAgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICBJbnRDb21wID0gMCwgU3RyaW5nQ29tcCA9IDApOgorICAgICAgICBzZWxmLlB0ckNvbXAgPSBQdHJDb21wCisgICAgICAgIHNlbGYuRGlzY3IgPSBEaXNjcgorICAgICAgICBzZWxmLkVudW1Db21wID0gRW51bUNvbXAKKyAgICAgICAgc2VsZi5JbnRDb21wID0gSW50Q29tcAorICAgICAgICBzZWxmLlN0cmluZ0NvbXAgPSBTdHJpbmdDb21wCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgcmV0dXJuIFJlY29yZChzZWxmLlB0ckNvbXAsIHNlbGYuRGlzY3IsIHNlbGYuRW51bUNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5JbnRDb21wLCBzZWxmLlN0cmluZ0NvbXApCisKK1RSVUUgPSAxCitGQUxTRSA9IDAKKworZGVmIG1haW4obG9vcHM9TE9PUFMpOgorICAgIGJlbmNodGltZSwgc3RvbmVzID0gcHlzdG9uZXMobG9vcHMpCisgICAgcHJpbnQgIlB5c3RvbmUoJXMpIHRpbWUgZm9yICVkIHBhc3NlcyA9ICVnIiAlIFwKKyAgICAgICAgICAoX192ZXJzaW9uX18sIGxvb3BzLCBiZW5jaHRpbWUpCisgICAgcHJpbnQgIlRoaXMgbWFjaGluZSBiZW5jaG1hcmtzIGF0ICVnIHB5c3RvbmVzL3NlY29uZCIgJSBzdG9uZXMKKworCitkZWYgcHlzdG9uZXMobG9vcHM9TE9PUFMpOgorICAgIHJldHVybiBQcm9jMChsb29wcykKKworSW50R2xvYiA9IDAKK0Jvb2xHbG9iID0gRkFMU0UKK0NoYXIxR2xvYiA9ICdcMCcKK0NoYXIyR2xvYiA9ICdcMCcKK0FycmF5MUdsb2IgPSBbMF0qNTEKK0FycmF5Mkdsb2IgPSBtYXAobGFtYmRhIHg6IHhbOl0sIFtBcnJheTFHbG9iXSo1MSkKK1B0ckdsYiA9IE5vbmUKK1B0ckdsYk5leHQgPSBOb25lCisKK2RlZiBQcm9jMChsb29wcz1MT09QUyk6CisgICAgZ2xvYmFsIEludEdsb2IKKyAgICBnbG9iYWwgQm9vbEdsb2IKKyAgICBnbG9iYWwgQ2hhcjFHbG9iCisgICAgZ2xvYmFsIENoYXIyR2xvYgorICAgIGdsb2JhbCBBcnJheTFHbG9iCisgICAgZ2xvYmFsIEFycmF5Mkdsb2IKKyAgICBnbG9iYWwgUHRyR2xiCisgICAgZ2xvYmFsIFB0ckdsYk5leHQKKworICAgIHN0YXJ0dGltZSA9IGNsb2NrKCkKKyAgICBmb3IgaSBpbiByYW5nZShsb29wcyk6CisgICAgICAgIHBhc3MKKyAgICBudWxsdGltZSA9IGNsb2NrKCkgLSBzdGFydHRpbWUKKworICAgIFB0ckdsYk5leHQgPSBSZWNvcmQoKQorICAgIFB0ckdsYiA9IFJlY29yZCgpCisgICAgUHRyR2xiLlB0ckNvbXAgPSBQdHJHbGJOZXh0CisgICAgUHRyR2xiLkRpc2NyID0gSWRlbnQxCisgICAgUHRyR2xiLkVudW1Db21wID0gSWRlbnQzCisgICAgUHRyR2xiLkludENvbXAgPSA0MAorICAgIFB0ckdsYi5TdHJpbmdDb21wID0gIkRIUllTVE9ORSBQUk9HUkFNLCBTT01FIFNUUklORyIKKyAgICBTdHJpbmcxTG9jID0gIkRIUllTVE9ORSBQUk9HUkFNLCAxJ1NUIFNUUklORyIKKyAgICBBcnJheTJHbG9iWzhdWzddID0gMTAKKworICAgIHN0YXJ0dGltZSA9IGNsb2NrKCkKKworICAgIGZvciBpIGluIHJhbmdlKGxvb3BzKToKKyAgICAgICAgUHJvYzUoKQorICAgICAgICBQcm9jNCgpCisgICAgICAgIEludExvYzEgPSAyCisgICAgICAgIEludExvYzIgPSAzCisgICAgICAgIFN0cmluZzJMb2MgPSAiREhSWVNUT05FIFBST0dSQU0sIDInTkQgU1RSSU5HIgorICAgICAgICBFbnVtTG9jID0gSWRlbnQyCisgICAgICAgIEJvb2xHbG9iID0gbm90IEZ1bmMyKFN0cmluZzFMb2MsIFN0cmluZzJMb2MpCisgICAgICAgIHdoaWxlIEludExvYzEgPCBJbnRMb2MyOgorICAgICAgICAgICAgSW50TG9jMyA9IDUgKiBJbnRMb2MxIC0gSW50TG9jMgorICAgICAgICAgICAgSW50TG9jMyA9IFByb2M3KEludExvYzEsIEludExvYzIpCisgICAgICAgICAgICBJbnRMb2MxID0gSW50TG9jMSArIDEKKyAgICAgICAgUHJvYzgoQXJyYXkxR2xvYiwgQXJyYXkyR2xvYiwgSW50TG9jMSwgSW50TG9jMykKKyAgICAgICAgUHRyR2xiID0gUHJvYzEoUHRyR2xiKQorICAgICAgICBDaGFySW5kZXggPSAnQScKKyAgICAgICAgd2hpbGUgQ2hhckluZGV4IDw9IENoYXIyR2xvYjoKKyAgICAgICAgICAgIGlmIEVudW1Mb2MgPT0gRnVuYzEoQ2hhckluZGV4LCAnQycpOgorICAgICAgICAgICAgICAgIEVudW1Mb2MgPSBQcm9jNihJZGVudDEpCisgICAgICAgICAgICBDaGFySW5kZXggPSBjaHIob3JkKENoYXJJbmRleCkrMSkKKyAgICAgICAgSW50TG9jMyA9IEludExvYzIgKiBJbnRMb2MxCisgICAgICAgIEludExvYzIgPSBJbnRMb2MzIC8gSW50TG9jMQorICAgICAgICBJbnRMb2MyID0gNyAqIChJbnRMb2MzIC0gSW50TG9jMikgLSBJbnRMb2MxCisgICAgICAgIEludExvYzEgPSBQcm9jMihJbnRMb2MxKQorCisgICAgYmVuY2h0aW1lID0gY2xvY2soKSAtIHN0YXJ0dGltZSAtIG51bGx0aW1lCisgICAgaWYgYmVuY2h0aW1lID09IDAuMDoKKyAgICAgICAgbG9vcHNQZXJCZW5jaHRpbWUgPSAwLjAKKyAgICBlbHNlOgorICAgICAgICBsb29wc1BlckJlbmNodGltZSA9IChsb29wcyAvIGJlbmNodGltZSkKKyAgICByZXR1cm4gYmVuY2h0aW1lLCBsb29wc1BlckJlbmNodGltZQorCitkZWYgUHJvYzEoUHRyUGFySW4pOgorICAgIFB0clBhckluLlB0ckNvbXAgPSBOZXh0UmVjb3JkID0gUHRyR2xiLmNvcHkoKQorICAgIFB0clBhckluLkludENvbXAgPSA1CisgICAgTmV4dFJlY29yZC5JbnRDb21wID0gUHRyUGFySW4uSW50Q29tcAorICAgIE5leHRSZWNvcmQuUHRyQ29tcCA9IFB0clBhckluLlB0ckNvbXAKKyAgICBOZXh0UmVjb3JkLlB0ckNvbXAgPSBQcm9jMyhOZXh0UmVjb3JkLlB0ckNvbXApCisgICAgaWYgTmV4dFJlY29yZC5EaXNjciA9PSBJZGVudDE6CisgICAgICAgIE5leHRSZWNvcmQuSW50Q29tcCA9IDYKKyAgICAgICAgTmV4dFJlY29yZC5FbnVtQ29tcCA9IFByb2M2KFB0clBhckluLkVudW1Db21wKQorICAgICAgICBOZXh0UmVjb3JkLlB0ckNvbXAgPSBQdHJHbGIuUHRyQ29tcAorICAgICAgICBOZXh0UmVjb3JkLkludENvbXAgPSBQcm9jNyhOZXh0UmVjb3JkLkludENvbXAsIDEwKQorICAgIGVsc2U6CisgICAgICAgIFB0clBhckluID0gTmV4dFJlY29yZC5jb3B5KCkKKyAgICBOZXh0UmVjb3JkLlB0ckNvbXAgPSBOb25lCisgICAgcmV0dXJuIFB0clBhckluCisKK2RlZiBQcm9jMihJbnRQYXJJTyk6CisgICAgSW50TG9jID0gSW50UGFySU8gKyAxMAorICAgIHdoaWxlIDE6CisgICAgICAgIGlmIENoYXIxR2xvYiA9PSAnQSc6CisgICAgICAgICAgICBJbnRMb2MgPSBJbnRMb2MgLSAxCisgICAgICAgICAgICBJbnRQYXJJTyA9IEludExvYyAtIEludEdsb2IKKyAgICAgICAgICAgIEVudW1Mb2MgPSBJZGVudDEKKyAgICAgICAgaWYgRW51bUxvYyA9PSBJZGVudDE6CisgICAgICAgICAgICBicmVhaworICAgIHJldHVybiBJbnRQYXJJTworCitkZWYgUHJvYzMoUHRyUGFyT3V0KToKKyAgICBnbG9iYWwgSW50R2xvYgorCisgICAgaWYgUHRyR2xiIGlzIG5vdCBOb25lOgorICAgICAgICBQdHJQYXJPdXQgPSBQdHJHbGIuUHRyQ29tcAorICAgIGVsc2U6CisgICAgICAgIEludEdsb2IgPSAxMDAKKyAgICBQdHJHbGIuSW50Q29tcCA9IFByb2M3KDEwLCBJbnRHbG9iKQorICAgIHJldHVybiBQdHJQYXJPdXQKKworZGVmIFByb2M0KCk6CisgICAgZ2xvYmFsIENoYXIyR2xvYgorCisgICAgQm9vbExvYyA9IENoYXIxR2xvYiA9PSAnQScKKyAgICBCb29sTG9jID0gQm9vbExvYyBvciBCb29sR2xvYgorICAgIENoYXIyR2xvYiA9ICdCJworCitkZWYgUHJvYzUoKToKKyAgICBnbG9iYWwgQ2hhcjFHbG9iCisgICAgZ2xvYmFsIEJvb2xHbG9iCisKKyAgICBDaGFyMUdsb2IgPSAnQScKKyAgICBCb29sR2xvYiA9IEZBTFNFCisKK2RlZiBQcm9jNihFbnVtUGFySW4pOgorICAgIEVudW1QYXJPdXQgPSBFbnVtUGFySW4KKyAgICBpZiBub3QgRnVuYzMoRW51bVBhckluKToKKyAgICAgICAgRW51bVBhck91dCA9IElkZW50NAorICAgIGlmIEVudW1QYXJJbiA9PSBJZGVudDE6CisgICAgICAgIEVudW1QYXJPdXQgPSBJZGVudDEKKyAgICBlbGlmIEVudW1QYXJJbiA9PSBJZGVudDI6CisgICAgICAgIGlmIEludEdsb2IgPiAxMDA6CisgICAgICAgICAgICBFbnVtUGFyT3V0ID0gSWRlbnQxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFbnVtUGFyT3V0ID0gSWRlbnQ0CisgICAgZWxpZiBFbnVtUGFySW4gPT0gSWRlbnQzOgorICAgICAgICBFbnVtUGFyT3V0ID0gSWRlbnQyCisgICAgZWxpZiBFbnVtUGFySW4gPT0gSWRlbnQ0OgorICAgICAgICBwYXNzCisgICAgZWxpZiBFbnVtUGFySW4gPT0gSWRlbnQ1OgorICAgICAgICBFbnVtUGFyT3V0ID0gSWRlbnQzCisgICAgcmV0dXJuIEVudW1QYXJPdXQKKworZGVmIFByb2M3KEludFBhckkxLCBJbnRQYXJJMik6CisgICAgSW50TG9jID0gSW50UGFySTEgKyAyCisgICAgSW50UGFyT3V0ID0gSW50UGFySTIgKyBJbnRMb2MKKyAgICByZXR1cm4gSW50UGFyT3V0CisKK2RlZiBQcm9jOChBcnJheTFQYXIsIEFycmF5MlBhciwgSW50UGFySTEsIEludFBhckkyKToKKyAgICBnbG9iYWwgSW50R2xvYgorCisgICAgSW50TG9jID0gSW50UGFySTEgKyA1CisgICAgQXJyYXkxUGFyW0ludExvY10gPSBJbnRQYXJJMgorICAgIEFycmF5MVBhcltJbnRMb2MrMV0gPSBBcnJheTFQYXJbSW50TG9jXQorICAgIEFycmF5MVBhcltJbnRMb2MrMzBdID0gSW50TG9jCisgICAgZm9yIEludEluZGV4IGluIHJhbmdlKEludExvYywgSW50TG9jKzIpOgorICAgICAgICBBcnJheTJQYXJbSW50TG9jXVtJbnRJbmRleF0gPSBJbnRMb2MKKyAgICBBcnJheTJQYXJbSW50TG9jXVtJbnRMb2MtMV0gPSBBcnJheTJQYXJbSW50TG9jXVtJbnRMb2MtMV0gKyAxCisgICAgQXJyYXkyUGFyW0ludExvYysyMF1bSW50TG9jXSA9IEFycmF5MVBhcltJbnRMb2NdCisgICAgSW50R2xvYiA9IDUKKworZGVmIEZ1bmMxKENoYXJQYXIxLCBDaGFyUGFyMik6CisgICAgQ2hhckxvYzEgPSBDaGFyUGFyMQorICAgIENoYXJMb2MyID0gQ2hhckxvYzEKKyAgICBpZiBDaGFyTG9jMiAhPSBDaGFyUGFyMjoKKyAgICAgICAgcmV0dXJuIElkZW50MQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBJZGVudDIKKworZGVmIEZ1bmMyKFN0clBhckkxLCBTdHJQYXJJMik6CisgICAgSW50TG9jID0gMQorICAgIHdoaWxlIEludExvYyA8PSAxOgorICAgICAgICBpZiBGdW5jMShTdHJQYXJJMVtJbnRMb2NdLCBTdHJQYXJJMltJbnRMb2MrMV0pID09IElkZW50MToKKyAgICAgICAgICAgIENoYXJMb2MgPSAnQScKKyAgICAgICAgICAgIEludExvYyA9IEludExvYyArIDEKKyAgICBpZiBDaGFyTG9jID49ICdXJyBhbmQgQ2hhckxvYyA8PSAnWic6CisgICAgICAgIEludExvYyA9IDcKKyAgICBpZiBDaGFyTG9jID09ICdYJzoKKyAgICAgICAgcmV0dXJuIFRSVUUKKyAgICBlbHNlOgorICAgICAgICBpZiBTdHJQYXJJMSA+IFN0clBhckkyOgorICAgICAgICAgICAgSW50TG9jID0gSW50TG9jICsgNworICAgICAgICAgICAgcmV0dXJuIFRSVUUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGQUxTRQorCitkZWYgRnVuYzMoRW51bVBhckluKToKKyAgICBFbnVtTG9jID0gRW51bVBhckluCisgICAgaWYgRW51bUxvYyA9PSBJZGVudDM6IHJldHVybiBUUlVFCisgICAgcmV0dXJuIEZBTFNFCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHN5cworICAgIGRlZiBlcnJvcihtc2cpOgorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsIG1zZywKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAidXNhZ2U6ICVzIFtudW1iZXJfb2ZfbG9vcHNdIiAlIHN5cy5hcmd2WzBdCisgICAgICAgIHN5cy5leGl0KDEwMCkKKyAgICBuYXJncyA9IGxlbihzeXMuYXJndikgLSAxCisgICAgaWYgbmFyZ3MgPiAxOgorICAgICAgICBlcnJvcigiJWQgYXJndW1lbnRzIGFyZSB0b28gbWFueTsiICUgbmFyZ3MpCisgICAgZWxpZiBuYXJncyA9PSAxOgorICAgICAgICB0cnk6IGxvb3BzID0gaW50KHN5cy5hcmd2WzFdKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIGVycm9yKCJJbnZhbGlkIGFyZ3VtZW50ICVyOyIgJSBzeXMuYXJndlsxXSkKKyAgICBlbHNlOgorICAgICAgICBsb29wcyA9IExPT1BTCisgICAgbWFpbihsb29wcykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9weXN0b25lLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9weXN0b25lLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGIzZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5c3RvbmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9weXN0b25lLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9weXN0b25lLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGIzZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5c3RvbmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9yYW5kdjJfMzIucGNrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JhbmR2Ml8zMi5wY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3YWIyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9yYW5kdjJfMzIucGNrCkBAIC0wLDAgKzEsNjMzIEBACitjcmFuZG9tCitSYW5kb20KK3AwCisodFJwMQorKEkyCisoSS0yMTQ3NDgzNjQ4CitJLTg0NTk3NDk4NQorSS0xMjk0MDkwMDg2CitJMTE5MzY1OTIzOQorSS0xODQ5NDgxNzM2CitJLTk0NjU3OTczMgorSS0zNDQwNjc3MAorSTE3NDkwNDk0NzEKK0kxOTk3Nzc0NjgyCitJMTQzMjAyNjQ1NworSTEyODgxMjcwNzMKK0ktOTQzMTc1NjU1CitJLTE3MTgwNzM5NjQKK0kzMzk5OTM1NDgKK0ktMTA0NTI2MDU3NQorSTU4MjUwNTAzNworSS0xNTU1MTA4MjUwCitJLTExMTQ3NjU2MjAKK0kxNTc4NjQ4NzUwCitJLTM1MDM4NDQxMgorSS0yMDg0NTg0OAorSS0yODgyNTUzMTQKK0k3Mzg3OTA5NTMKK0kxOTAxMjQ5NjQxCitJMTk5OTMyNDY3MgorSS0yNzczNjEwNjgKK0ktMTUxNTg4NTgzOQorSTIwNjE3NjE1OTYKK0ktODA5MDY4MDg5CitJMTI4Nzk4MTEzNgorSTI1ODEyOTQ5MgorSS02MzAzNzQ1CitJLTc2NTE0ODMzNworSTEwOTAzNDQ5MTEKK0kxNjUzNDM0NzAzCitJLTEyNDI5MjM2MjgKK0kxNjM5MTcxMzEzCitJLTE4NzAwNDI2NjAKK0ktMTY1NTAxNDA1MAorSTM0NTYwOTA0OAorSTIwOTM0MTAxMzgKK0kxOTYzMjYzMzc0CitJLTIxMjIwOTgzNDIKK0kxMzM2ODU5OTYxCitJLTgxMDk0MjcyOQorSTk0NTg1Nzc1MworSTIxMDMwNDk5NDIKK0k2MjM5MjI2ODQKK0kxNDE4MzQ5NTQ5CitJNjkwODc3MzQyCitJNzU0OTczMTA3CitJLTE2MDUxMTE4NDcKK0kxNjA3MTM3ODEzCitJLTE3MDQ5MTcxMzEKK0kxMzE3NTM2NDI4CitJMTcxNDg4Mjg3MgorSS0xNjY1Mzg1MTIwCitJMTgyMzY5NDM5NworSS0xNzkwODM2ODY2CitJLTE2OTY3MjQ4MTIKK0ktNjAzOTc5ODQ3CitJLTQ5ODU5OTM5NAorSS0zNDEyNjUyOTEKK0k5MjczODg4MDQKK0kxNzc4NTYyMTM1CitJMTcxNjg5NTc4MQorSTEwMjMxOTgxMjIKK0kxNzI2MTQ1OTY3CitJOTQxOTU1NTI1CitJMTI0MDE0ODk1MAorSS0xOTI5NjM0NTQ1CitJLTEyODgxNDcwODMKK0ktNTE5MzE4MzM1CitJNzU0NTU5Nzc3CitJLTcwNzU3MTk1OAorSTM3NDYwNDAyMgorSTQyMDQyNDA2MQorSS0xMDk1NDQzNDg2CitJMTYyMTkzNDk0NAorSS0xMjIwNTAyNTIyCitJLTE0MDA0OTYwOAorSS05MTg5MTcxMjIKK0kzMDQzNDEwMjQKK0ktMTYzNzQ0NjA1NworSS0zNTM5MzQ0ODUKK0kxOTczNDM2MjM1CitJNDMzMzgwMjQxCitJLTY4Njc1OTQ2NQorSS0yMTExNTYzMTU0CitJLTU3MzQyMjAzMgorSTgwNDMwNDU0MQorSTE1MTMwNjM0ODMKK0kxNDE3MzgxNjg5CitJLTgwNDc3ODcyOQorSTIxMTc1NjQwOAorSTU0NDUzNzMyMgorSTg5MDg4MTY0MQorSTE1MDM3ODM3NAorSTE3NjU3MzkzOTIKK0kxMDExNjA0MTE2CitJNTg0ODg5MDk1CitJMTQwMDUyMDU1NAorSTQxMzc0NzgwOAorSS0xNzQxOTkyNTg3CitJLTE4ODI0MjE1NzQKK0ktMTM3MzAwMTkwMworSS0xODg1MzQ4NTM4CitJOTAzODE5NDgwCitJMTA4MzIyMDAzOAorSS0xMzE4MTA1NDI0CitJMTc0MDQyMTQwNAorSTE2OTMwODk2MjUKK0k3NzU5NjU1NTcKK0kxMzE5NjA4MDM3CitJLTIxMjc0NzU3ODUKK0ktMzY3NTYyODk1CitJLTE0MTYyNzM0NTEKK0kxNjkzMDAwMzI3CitJLTEyMTc0Mzg0MjEKK0k4MzQ0MDU1MjIKK0ktMTI4Mjg3Mjc1CitJODY0MDU3NTQ4CitJLTk3MzkxNzM1NgorSTczMDQxMTEKK0kxNzEyMjUzMTgyCitJMTM1Mzg5Nzc0MQorSTY3Mjk4MjI4OAorSTE3Nzg1NzU1NTkKK0ktNDAzMDU4Mzc3CitJLTM4NTQwMzc4CitJLTEzOTM3MTM0OTYKK0kxMzE5MzE3MQorSTExMjcxOTYyMDAKK0kyMDUxNzY0NzIKK0ktMjEwNDc5MDUwNgorSTI5OTk4NTQxNgorSTE0MDM1NDE2ODUKK0ktMTAxODI3MDY2NworSS0xOTgwNjc3NDkwCitJLTExODI2MjU3OTcKK0kxNjM3MDE1MTgxCitJLTE3OTUzNTc0MTQKK0kxNTE0NDEzNDA1CitJLTkyNDUxNjIzNworSS0xODQxODczNjUwCitJLTEwMTQ1OTEyNjkKK0kxNTc2NjE2MDY1CitJLTEzMTkxMDMxMzUKK0ktMTIwODQ3ODQwCitJMjA2MjI1OTc3OAorSS05Mjg1MDcwCitJMTE2MDg5MDMwMAorSS01NzUxMzczMTMKK0ktMTUwOTEwODI3NQorSTQ2NzAxOTI2CitJLTI4NzU2MDkxNAorSS0yNTY4MjQ5NjAKK0k1Nzc1NTgyNTAKK0k5MDA1OTgzMTAKK0k5NDQ2MDc4NjcKK0kyMTIxMTU0OTIwCitJLTExNzA1MDUxOTIKK0ktMTM0NzE3MDU3NQorSTc3MjQ3Nzc4CitJLTE4OTkwMTU3NjUKK0kxMjM0MTAzMzI3CitJMTAyNzA1MzY1OAorSTE5MzQ2MzIzMjIKK0ktNzkyMDMxMjM0CitJMTE0NzMyMjUzNgorSTEyOTA2NTUxMTcKK0kxMDAyMDU5NzE1CitJMTMyNTg5ODUzOAorSTg5NjAyOTc5MworSS03OTA5NDA2OTQKK0ktOTgwNDcwNzIxCitJLTE5MjI2NDgyNTUKK0ktOTUxNjcyODE0CitJMjkxNTQzOTQzCitJMTE1ODc0MDIxOAorSS0xOTU5MDIzNzM2CitJLTE5NzcxODUyMzYKK0kxNTI3OTAwMDc2CitJNTE0MTA0MTk1CitJLTgxNDE1NDExMworSS01OTMxNTc4ODMKK0ktMTAyMzcwNDY2MAorSTEyODU2ODgzNzcKK0ktMjExNzUyNTM4NgorSTc2ODk1NDM2MAorSS0zODY3Njg0NgorSS03OTk4NDg2NTkKK0ktMTMwNTUxNzI1OQorSS0xOTM4MjEzNjQxCitJLTQ2MjE0Njc1OAorSS0xNjYzMzAyODkyCitJMTg5OTU5MTA2OQorSS0yMjkzNTM4OAorSS0yNzU4NTY5NzYKK0ktNDQzNzM2ODkzCitJLTczOTQ0MTE1NgorSTkzODYyMDY4CitJLTgzODEwNTY2OQorSTE3MzU2Mjk4NDUKK0ktODE3NDg0MjA2CitJMjgwODE0NTU1CitJMTc1MzU0NzE3OQorSTE4MTExMjM0NzkKK0kxOTc0NTQzNjMyCitJLTQ4NDQ3NDY1CitJLTY0MjY5NDM0NQorSS01MzExNDk2MTMKK0k1MTg2OTg5NTMKK0ktMjIxNjQyNjI3CitJLTY4NjUxOTE4NworSTc3NjY0NDMwMworSTI1Nzc3NDQwMAorSS0xNDk5MTM0ODU3CitJLTEwNTUyNzM0NTUKK0ktMjM3MDIzOTQzCitJMTk4MTc1MjMzMAorSS05MTc2NzE2NjIKK0ktMzcyOTA1OTgzCitJMTU4ODA1ODQyMAorSTExNzE5MzY2NjAKK0ktMTczMDk3NzEyMQorSTEzNjAwMjg5ODkKK0kxNzY5NDY5Mjg3CitJMTkxMDcwOTU0MgorSS04NTI2OTI5NTkKK0kxMzk2OTQ0NjY3CitJLTE3MjM5OTkxNTUKK0ktMzEwOTc1NDM1CitJLTE5NjU0NTM5NTQKK0ktMTYzNjg1ODU3MAorSTIwMDU2NTA3OTQKK0k2ODAyOTM3MTUKK0kxMzU1NjI5Mzg2CitJODQ0NTE0Njg0CitJLTE5MDkxNTI4MDcKK0ktODA4NjQ2MDc0CitJMTkzNjUxMDAxOAorSTExMzQ0MTM4MTAKK0ktMTQzNDExMDQ3CitJLTE0Nzg0MzYzMDQKK0kxMzk0OTY5MjQ0CitJLTExNzAxMTA2NjAKK0kxOTYzMTEyMDg2CitJLTE1MTgzNTEwNDkKK0ktMTUwNjI4NzQ0MworSS00NTUwMjMwOTAKK0ktODU1MzY2MDI4CitJLTE3NDY3ODU1NjgKK0k5MzM5OTA4ODIKK0ktNzAzNjI1MTQxCitJLTI4NTAzNjg3MgorSTE4ODI3NzkwNQorSTE0NzE1Nzg2MjAKK0ktOTgxMzgyODM1CitJLTU4Njk3NDIyMAorSTk0NTYxOTc1OAorSTE2MDg3Nzg0NDQKK0ktMTcwODU0ODA2NgorSS0xODk3NjI5MzIwCitJLTQyNjE3ODEwCitJLTgzNjg0MDc5MAorSTUzOTE1NDQ4NworSS0yMzU3MDY5NjIKK0kzMzIwNzQ0MTgKK0ktNTc1NzAwNTg5CitJMTUzNDYwODAwMworSTYzMjExNjU2MAorSS0xODE5NzYwNjUzCitJNjQyMDUyOTU4CitJLTcyMjM5MTc3MQorSS0xMTA0NzE5NDc1CitJLTExOTY4NDcwODQKK0k1ODI0MTM5NzMKK0kxNTYzMzk0ODc2CitJNjQyMDA3OTQ0CitJMTA4OTg5NDU2CitJMzYxNjI1MDE0CitJNjc3MzA4NjI1CitJLTE4MDY1Mjk0OTYKK0ktOTU5MDUwNzA4CitJLTE4NTgyNTEwNzAKK0ktMjE2MDY5ODMyCitJNzAxNjI0NTc5CitJNTAxMjM4MDMzCitJMTIyODcwMzAKK0kxODk1MTA3MTA3CitJMjA4OTA5ODYzOAorSS04NzQ4MDYyMzAKK0kxMjM2Mjc5MjAzCitJNTYzNzE4ODkwCitJLTU0NDM1MjQ4OQorSS0xODc5NzA3NDk4CitJMTc2NzU4MzM5MworSS0xNzc2NjA0NjU2CitJLTY5MzI5NDMwMQorSS04ODg4MjgzMQorSTE2OTMwMzM1NworSTEyOTkxOTYxNTIKK0ktMTEyMjc5MTA4OQorSS0zNzkxNTcxNzIKK0kxOTM0NjcxODUxCitJMTU3NTczNjk2MQorSS0xOTU3MzE3NAorSS0xNDAxNTExMDA5CitJOTMwNTE2NworSS0xMTE1MTc0NDY3CitJMTY3MDczNTUzNworSTEyMjY0MzY1MDEKK0ktMjAwNDUyNDUzNQorSTE3Njc0NjM4NzgKK0ktMTcyMjg1NTA3OQorSS01NTk0MTM5MjYKK0kxNTI5ODEwODUxCitJMTIwMTI3MjA4NworSS0xMjk3MTMwOTcxCitJLTExODgxNDk5ODIKK0kxMzk2NTU3MTg4CitJLTM3MDM1ODM0MgorSS0xMDA2NjE5NzAyCitJMTYwMDk0MjQ2MworSTkwNjA4NzEzMAorSS03Njk5MTkwOQorSTIwNjk1ODAxNzkKK0ktMTY3NDE5NTE4MQorSS0yMDk4NDA0NzI5CitJLTk0MDk3MjQ1OQorSS01NzMzOTkxODcKK0ktMTkzMDM4NjI3NworSS03MjEzMTExOTkKK0ktNjQ3ODM0NzQ0CitJMTQ1MjE4MTY3MQorSTY4ODY4MTkxNgorSTE4MTI3OTM3MzEKK0kxNzA0MzgwNjIwCitJLTEzODk2MTUxNzkKK0k4NjYyODc4MzcKK0ktMTQzNTI2NTAwNworSTM4ODQwMDc4MgorSS0xNDc5ODY2MDAKK0ktMTYxMzU5ODg1MQorSS0xMDQwMzQ3NDA4CitJNzgyMDYzMzIzCitJLTIzOTI4MjAzMQorSS01NzU5NjY3MjIKK0ktMTg2NTIwODE3NAorSS00ODEzNjUxNDYKK0k1Nzk1NzI4MDMKK0ktMTIzOTQ4MTQ5NAorSTMzNTM2MTI4MAorSS00Mjk3MjI5NDcKK0kxODgxNzcyNzg5CitJMTkwODEwMzgwOAorSTE2NTM2OTAwMTMKK0ktMTY2ODU4ODM0NAorSTE5MzM3ODc5NTMKK0ktMjAzMzQ4MDYwOQorSTIyMTYyNzk3CitJLTE1MTY1MjcwNDAKK0ktNDYxMjMyNDgyCitJLTE2MjAxMzcyCitJLTIwNDMwOTIwMzAKK0kxMTQ5OTAzMzcKK0ktMTUyNDA5MDA4NAorSTE0NTYzNzQwMjAKK0k0NTg2MDY0NDAKK0ktMTkyODA4MzIxOAorSTIyNzc3MzEyNQorSS0xMTI5MDI4MTU5CitJMTY3ODY4OQorSTE1NzU4OTY5MDcKK0ktMTc5MjkzNTIyMAorSS0xNTEzODc1NzUKK0k2NDA4NDA4OAorSS05NTczNzIxNQorSTEzMzczMzU2ODgKK0ktMTk2MzQ2NjM0NQorSTEyNDMzMTUxMzAKK0ktMTc5ODUxODQxMQorSS01NDYwMTMyMTIKK0ktNjA3MDY1Mzk2CitJMTIxOTgyNDE2MAorSTE3MTUyMTg0NjkKK0ktMTM2ODE2Mzc4MworSTE3MDE1NTI5MTMKK0ktMzgxMTE0ODg4CitJMTA2ODgyMTcxNworSTI2NjA2Mjk3MQorSS0yMDY2NTEzMTcyCitJMTc2NzQwNzIyOQorSS03ODA5MzY0MTQKK0ktNzA1NDEzNDQzCitJLTEyNTYyNjg4NDcKK0kxNjQ2ODc0MTQ5CitJMTEwNzY5MDM1MworSTgzOTEzMzA3MgorSTY3MDAxNzQ5CitJODYwNzYzNTAzCitJODg0ODgwNjEzCitJOTE5NzcwODQKK0k3NTUzNzE5MzMKK0k0MjA3NDUxNTMKK0ktNTc4NDgwNjkwCitJLTE1MjAxOTM1NTEKK0kxMDExMzY5MzMxCitJLTk5NzU0NTc1CitJLTczMzE0MTA2NAorSS01MDA1OTg1ODgKK0kxMDgxMTI0MjcxCitJLTEzNDEyNjY1NzUKK0k5MjEwMDI2MTIKK0ktODQ4ODUyNDg3CitJLTE5MDQ0NjczNDEKK0ktMTI5NDI1Njk3MworSS05NDA3NDcxNAorSS0xNzc4NzU4NDk4CitJLTE0MDExODg1NDcKK0kyMTAxODMwNTc4CitJMjA1ODg2NDg3NworSS0yNzI4NzU5OTEKK0ktMTM3NTg1NDc3OQorSS0xMzMyOTM3ODcwCitJNjE5NDI1NTI1CitJLTEwMzQ1Mjk2MzkKK0ktMzY0NTQzOTMKK0ktMjAzMDQ5OTk4NQorSS0xNjM3MTI3NTAwCitJLTE0MDgxMTAyODcKK0ktMjEwODYyNTc0OQorSS05NjEwMDc0MzYKK0kxNDc1NjU0OTUxCitJLTc5MTk0NjI1MQorSTE2Njc3OTIxMTUKK0kxODE4OTc4ODMwCitJMTg5Nzk4MDUxNAorSTE5NTk1NDY0NzcKK0ktNzQ0Nzg5MTEKK0ktNTA4NjQzMzQ3CitJNDYxNTk0Mzk5CitJNTM4ODAyNzE1CitJLTIwOTQ5NzAwNzEKK0ktMjA3NjY2MDI1MworSTEwOTEzNTg5NDQKK0kxOTQ0MDI5MjQ2CitJLTM0Mzk1NzQzNgorSS0xOTE1ODQ1MDIyCitJMTIzNzYyMDE4OAorSTExNDQxMjUxNzQKK0kxNTIyMTkwNTIwCitJLTY3MDI1Mjk1MgorSS0xOTQ2OTIyNgorSTY3NTYyNjUxMAorSTc1ODc1MDA5NgorSTkwOTcyNDM1NAorSS0xODQ2MjU5NjUyCitJNTQ0NjY5MzQzCitJNDQ1MTgyNDk1CitJLTgyMTUxOTkzMAorSS0xMTI0Mjc5Njg1CitJLTE2Njg5OTUxMjIKK0kxNjUzMjg0NzkzCitJLTY3ODU1NTE1MQorSS02ODc1MTMyMDcKK0kxNTU4MjU5NDQ1CitJLTE5Nzg4NjY4MzkKK0kxNTU4ODM1NjAxCitJMTczMjEzODQ3MgorSS0xOTA0NzkzMzYzCitJNjIwMDIwMjk2CitJMTU2MjU5Nzg3NAorSTE5NDI2MTcyMjcKK0ktNTQ5NjMyNTUyCitJNzIxNjAzNzk1CitJNDE3OTc4NDU2CitJLTEzNTUyODE1MjIKK0ktNTM4MDY1MjA4CitJLTEwNzk1MjMxOTYKK0kxODczNzU2OTkKK0k0NDkwNjQ5NzIKK0kxMDE4MDgzOTQ3CitJMTYzMjM4ODg4MgorSS00OTMyNjk4NjYKK0k5Mjc2OTA0MQorSTE0NzcxNDY3NTAKK0kxNzgyNzA4NDA0CitJNDQ0ODczMzc2CitJMTA4NTg1MTEwNAorSS02ODIzMjcyCitJLTEzMDIyNTE4NTMKK0kxNjAyMDUwNjg4CitJLTEwNDIxODc4MjQKK0kyODcxNjE3NDUKK0ktMTk3MjA5NDQ3OQorSTEwMzI3MTQ5MQorSTIxMzE2MTk3NzMKK0ktMjA2NDExNTg3MAorSTc2NjgxNTQ5OAorSTk5MDg2MTQ1OAorSS0xNjY0NDA3Mzc4CitJMTA4Mzc0Njc1NgorSS0xMDE4MzMxOTA0CitJLTY3NzMxNTY4NworSS05NTE2NzA2NDcKK0ktOTUyMzU2ODc0CitJNDUxNDYwNjA5CitJLTgxODYxNTU2NAorSTg1MTQzOTUwOAorSTY1NjM2MjYzNAorSS0xMzUxMjQwNDg1CitJODIzMzc4MDc4CitJMTk4NTU5NzM4NQorSTU5Nzc1Nzc0MAorSS0xNTEyMzAzMDU3CitJMTU5MDg3Mjc5OAorSTExMDg0MjQyMTMKK0k4MTg4NTA4OTgKK0ktMTM2ODU5NDMwNgorSS0yMDExMDc3NjEKK0kxNzkzMzcwMzc4CitJMTI0NzU5NzYxMQorSS0xNTk0MzI2MjY0CitJLTYwMTY1Mzg5MAorSTQyNzY0Mjc1OQorSTI0ODMyMjExMworSS0yOTI1NDUzMzgKK0kxNzA4OTg1ODcwCitJMTkxNzA0Mjc3MQorSTQyOTM1NDUwMworSS00Nzg0NzAzMjkKK0k3OTM5NjAwMTQKK0kzNjk5MzkxMzMKK0kxNzI4MTg5MTU3CitJLTUxODk2MzYyNgorSS0yNzg1MjM5NzQKK0ktMTg3NzI4OTY5NgorSS0yMDg4NjE3NjU4CitJLTEzNjc5NDAwNDkKK0ktNjIyOTU5MjUKK0kxOTc5NzUxMTkKK0ktMjUyOTAwNzc3CitJODAzNDMwNTM5CitJNDg1NzU5NDQxCitJLTUyODI4MzQ4MAorSS0xMjg3NDQzOTYzCitJLTQ3ODYxNzQ0NAorSS04NjE5MDY5NDYKK0ktNjQ5MDk1NTU1CitJLTg5MzE4NDMzNworSTIwNTA1NzEzMjIKK0k4MDM0MzMxMzMKK0kxNjI5NTc0NTcxCitJMTY0OTcyMDQxNworSS0yMDUwMjI1MjA5CitJMTIwODU5ODk3NworSTcyMDMxNDM0NAorSS02MTUxNjYyNTEKK0ktODM1MDc3MTI3CitJLTE0MDUzNzI0MjkKK0k5OTU2OTgwNjQKK0kxNDgxMjMyNDAKK0ktOTQzMDE2Njc2CitJLTU5NDYwOTYyMgorSS0xMzgxNTk2NzExCitJMTAxNzE5NTMwMQorSS0xMjY4ODkzMDEzCitJLTE4MTU5ODUxNzkKK0ktMTM5MzU3MDM1MQorSS04NzAwMjczNjQKK0ktNDc2MDY0NDcyCitJMTg1NTgyNjQ1CitJNTY5ODYzMzI2CitJMTA5ODU4NDI2NworSS0xNTk5MTQ3MDA2CitJLTQ4NTA1NDM5MQorSS04NTIwOTgzNjUKK0kxNDc3MzIwMTM1CitJMjIyMzE2NzYyCitJLTE1MTU1ODMwNjQKK0ktOTM1MDUxMzY3CitJMzkzMzgzMDYzCitJODE5NjE3MjI2CitJNzIyOTIxODM3CitJLTEyNDE4MDY0OTkKK0ktMTM1ODU2NjM4NQorSTE2NjY4MTM1OTEKK0kxMzMzODc1MTE0CitJLTE2NjM2ODgzMTcKK0ktNDcyNTQ2MjMKK0ktODg1ODAwNzI2CitJMzA3Mzg4OTkxCitJLTEyMTk0NTk0OTYKK0kxMzc0ODcwMzAwCitJMjEzMjA0Nzg3NworSS0xMzg1NjI0MTk4CitJLTI0NTEzOTIwNgorSTEwMTUxMzkyMTQKK0ktOTI2MTk4NTU5CitJMTk2OTc5ODg2OAorSS0xOTUwNDgwNjE5CitJLTU1OTE5MzQzMgorSS0xMjU2NDQ2NTE4CitJLTE5ODM0NzY5ODEKK0k3OTAxNzk2NTUKK0kxMDA0Mjg5NjU5CitJMTU0MTgyNzYxNworSTE1NTU4MDU1NzUKK0k1MDExMjczMzMKK0ktMTEyMzQ0Njc5NworSS00NTMyMzA5MTUKK0kyMDM1MTA0ODgzCitJMTI5NjEyMjM5OAorSS0xODQzNjk4NjA0CitJLTcxNTQ2NDU4OAorSTMzNzE0Mzk3MQorSS0xOTcyMTE5MTkyCitJNjA2Nzc3OTA5CitJNzI2OTc3MzAyCitJLTExNDk1MDE4NzIKK0ktMTk2MzczMzUyMgorSS0xNzk3NTA0NjQ0CitJNjI0Cit0cDIKK050cDMKK2IuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3JhbmR2Ml82NC5wY2sgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmFuZHYyXzY0LnBjawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTBkZDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JhbmR2Ml82NC5wY2sKQEAgLTAsMCArMSw2MzMgQEAKK2NyYW5kb20KK1JhbmRvbQorcDAKKyh0UnAxCisoSTIKKyhJMjE0NzQ4MzY0OAorSTE4MTIxMTU2ODIKK0kyNzQxNzU1NDk3CitJMTAyODA1NTczMAorSTgwOTE2NjAzNgorSTI3NzM2Mjg2NTAKK0k2MjMyMTk1MAorSTUzNTI5MDA0MworSTM0OTg3NzgwMAorSTk3NjE2NzAzOQorSTI0OTA2OTY5NDAKK0kzNjMxMzI2OTU1CitJMjEwNzk5MTExNAorSTI5NDEyMDU3OTMKK0kzMTk5NjExNjA1CitJMTg3MTk3MTU1NgorSTE0NTYxMDg1NDAKK0kyOTg0NTkxMDQ0CitJMTQwODM2ODAxCitJNDIwMzIyNzMxMAorSTM2NTI3MjI5ODAKK0k0MDMxOTcxMjM0CitJNTU1NzY5NzYwCitJNjk3MzAxMjk2CitJMjM0NzYzODg4MAorSTMzMDIzMzU4NTgKK0kzMjAyNTUxNjIKK0kyNTUzNTg2NjA4CitJMTU3MDIyNDM2MQorSTI4Mzg3ODA5MTIKK0kyMzE1ODM0OTE4CitJMjM1MTM0ODE1OAorSTM1NDU0MzMwMTUKK0kyMjkyMDE4NTc5CitJMTE3NzU2OTMzMQorSTc1ODQ5NzU1OQorSTI5MTMzMTExNzUKK0kxMDE0OTQ4ODgwCitJMTc5MzYxOTI0MworSTM5ODI0NTEwNTMKK0kzODUwOTg4MzQyCitJMjM5Mzk4NDMyNAorSTE1ODMxMDAwOTMKK0kzMTQ0NzQyNTQzCitJMzY1NTA0NzQ5MworSTM1MDc1MzIzODUKK0kzMDk0NTE1NDQyCitJMzUwMDQyNDM0CitJMjQ1NTI5NDg0NAorSTEwMzg3MzkzMTIKK0kzMTM4MDkxNTIKK0kxODk0MzMwNzIKK0kxNjUzMTY1NDUyCitJNDE4NjY1MDU5MworSTE5MjgxNDU1CitJMjU4OTY4MDYxOQorSTQxNDU5MzE1OTAKK0k0MjgzMjY2MTE4CitJNjM2MjgzMTcyCitJOTQzNjE4MzM3CitJMzE3MDE4NDYzMworSTIzMDg3NjYyMzEKK0k2MzQ2MTUxNTkKK0k1MzgxNTI2NDcKK0kyMDc5NTc2ODkxCitJMTAyOTQ0MjYxNgorSTM0MTA2ODk0MTIKK0kxMzcwMjkyNzYxCitJMTA3MTcxODk3OAorSTIxMzk0OTYzMjIKK0kxODc2Njk5NTQzCitJMzQ4NTg2NjE4NworSTMxNTc0OTAxMzAKK0kxNjMzMTA1Mzg2CitJMTQ1MzI1MzE2MAorSTM4NDEzMjIwODAKK0kzNzg5NjA4OTI0CitJNDExMDc3MDc5MgorSTk1MDgzNjczCitJOTMxMzU0NjI3CitJMjA2NTM4OTU5MQorSTM0NDgzMzk4MjcKK0kzMzQ4MjA0NTc3CitJMzI2MzUyODU2MAorSTI0MTEzMjQ1OTAKK0k0MDAzMDU1MDI2CitJMTg2OTY3MDA5MworSTI3MzcyMzE4NDMKK0k0MTUwNzAxMTU1CitJMjY4OTY2NzYyMQorSTI5OTMyNjMyMjQKK0kzMjM5ODkwMTQwCitJMTE5MTQzMDQ4MworSTEyMTQzOTk3NzkKK0kzNjIzNDI4NTMzCitJMTgxNzA1ODg2NgorSTMwNTIyNzQ0NTEKK0kzMjYwMzAwODIKK0kxNTA1MTI5MzEyCitJMjMwNjgxMjI2MgorSTEzNDkxNTAzNjMKK0kxMDk5MTI3ODk1CitJMjU0MzQ2NTU3NAorSTIzOTYzODAxOTMKK0k1MDM5MjY0NjYKK0kxNjA3MTA5NzMwCitJMzQ1MTcxNjgxNworSTU4MDM3MTE0CitJNDI5MDA4MTExOQorSTk0NzUxNzU5NworSTMwODM0NDAxODYKK0k1MjA1MjI2MzAKK0kyOTQ4OTYyNDk2CitJNDE4NDMxOTU3NAorSTI5NTc2MzYzMzUKK0k2NjgzNzQyMDEKK0kyMzI1NDQ2NDczCitJNDcyNzg1MzE0CitJMzc5MTkzMjM2NgorSTU3MzAxNzE4OQorSTIxODU3MjUzNzkKK0kxMjYyMjUxNDkyCitJMzUyNTA4OTM3OQorSTI5NTEyNjI2NTMKK0kxMzA1MzQ3MzA1CitJOTQwOTU4MTIyCitJMzM0Mzc1NDU2NgorSTM1OTM3MTc0NAorSTM4NzQwNDQ5NzMKK0kzOTY4OTcyMzIKK0kxNDcxODgyNDgKK0k3MTY2ODM3MDMKK0k0MDEzODgwMzE1CitJMTEzMzM1OTU4NgorSTE3OTQ2MTIyNDkKK0kzNDgwODE1MTkyCitJMzk4ODc4NzgwNAorSTE3MjkzNTU4MDkKK0k1NzM0MDg1NDIKK0kxNDE5MzEwOTM0CitJMTc3MDAzMDQ0NworSTM1NTI4NDU1NjcKK0kxNjkzOTc2NTAyCitJMTI3MTE4OTg5MworSTIyOTgyMzY3MzgKK0kyMDQ5MjE5MDI3CitJMzQ2NDE5ODA3MAorSTEyMzM1NzQwODIKK0kxMDA3NDUxNzgxCitJMTgzODI1Mzc1MAorSTY4NzA5NjU5MworSTExMzEzNzU2MDMKK0kxMjIzMDEzODk1CitJMTQ5MDQ3ODQzNQorSTMzOTI2NTQzOQorSTQyMzI3OTI2NTkKK0k0OTE1Mzg1MzYKK0kyODE2MjU2NzY5CitJMTA0NDA5NzUyMgorSTI1NjYyMjcwNDkKK0k3NDg3NjI3OTMKK0kxNTExODMwNDk0CitJMzU5MzI1OTgyMgorSTQxMjEyNzkyMTMKK0kzNzM1NTQxMzA5CitJMzYwOTc5NDc5NworSTE5Mzk5NDIzMzEKK0kzNzc1NzA0MzQKK0kxNDM3OTU3NTU0CitJMTgzMTI4NTY5NgorSTU1MDYyODExCitJMjA0Njc4MzExMAorSTEzMDM5MDIyODMKK0kxODM4MzQ5ODc3CitJNDIwOTkzNTU2CitJMTI1NjM5MjU2MAorSTI3OTUyMTY1MDYKK0kyNzgzNjg3OTI0CitJMzMyMjMwMzE2OQorSTUxMjc5NDc0OQorSTMwODQwNTgyNgorSTUxNzE2NDQyOQorSTMzMjA0MzYwMjIKK0kxMzI4NDAzNjMyCitJMjI2OTE4NDc0NgorSTM3Mjk1MjI4MTAKK0kzMzA0MzE0NDUwCitJMjIzODc1NjEyNAorSTE2OTA1ODEzNjEKK0kzODEzMjc3NTMyCitJNDExOTcwNjg3OQorSTI2NTk0NDc4NzUKK0kzODg4MTg5NzgKK0kyMDY0NTgwODE0CitJMTU4NjIyNzY3NgorSTI2Mjc1MjI2ODUKK0kyMDE3NzkyMjY5CitJNTQ3OTI4MTA5CitJODU5MTA3NDUwCitJMTA2MjIzODkyOQorSTg1ODg4NjIzNworSTM3OTU3ODMxNDYKK0k0MTczOTE0NzU2CitJMzgzNTkxNTk2NQorSTMzMjk1MDQ4MjEKK0kzNDk0NTc5OTA0CitJODM4ODYzMjA1CitJMzM5OTczNDcyNAorSTQyNDczODc0ODEKK0kzNjE4NDE0ODM0CitJMjk4NDQzMzc5OAorSTIxNjUyMDU1NjEKK0k0MjYwNjg1Njg0CitJMzA0NTkwNDI0NAorSTM0NTAwOTM4MzYKK0kzNTk3MzA3NTk1CitJMzIxNTg1MTE2NgorSTMxNjI4MDEzMjgKK0kyNTU4MjgzNzk5CitJOTUwMDY4MTA1CitJMTgyOTY2NDExNworSTMxMDg1NDI5ODcKK0kyMzc4ODYwNTI3CitJNzkwMDIzNDYwCitJMjgwMDg3NzUwCitJMTE3MTQ3ODAxOAorSTIzMzM2NTM3MjgKK0kzOTc2OTMyMTQwCitJODk2NzQ2MTUyCitJMTgwMjQ5NDE5NQorSTEyMzI4NzM3OTQKK0kyNzQ5NDQwODM2CitJMjAzMjAzNzI5NgorSTIwMTIwOTE2ODIKK0kxMjk2MTMxMDM0CitJMzg5MjEzMzM4NQorSTkwODE2MTMzNAorSTIyOTY3OTE3OTUKK0k1NDgxNjk3OTQKK0k2OTYyNjUKK0k4OTMxNTY4MjgKK0k0MjY5MDQ3MDkKK0kzNTY1Mzc0NTM1CitJMjY1NTkwNjgyNQorSTI3OTIxNzg1MTUKK0kyNDA2ODE0NjMyCitJNDAzODg0NzU3OQorSTMxMjM5MzQ2NDIKK0kyMTk3NTAzMDA0CitJMzUzNTAzMjU5NworSTIyNjYyMTY2ODkKK0kyMTE3NjEzNDYyCitJMTc4NzQ0ODUxOAorSTE4NzUwODk0MTYKK0kyMDM3MTY1Mzg0CitJMTE0MDY3NjMyMQorSTM2MDYyOTY0NjQKK0kzMjI5MTM4MjMxCitJMjQ1ODI2NzEzMgorSTE4NzQ2NTExNzEKK0kzMzMxOTAwODY3CitJMTAwMDU1NzY1NAorSTE0MzI4NjE3MDEKK0k0NzM2MzYzMjMKK0kyNjkxNzgzOTI3CitJMTg3MTQzNzQ0NworSTEzMjgwMTY0MDEKK0k0MTE4NjkwMDYyCitJNDQ5NDY3NjAyCitJNjgxNzg5MDM1CitJODY0ODg5NDQyCitJMTIwMDg4ODkyOAorSTc1NzY5NDQ1CitJNDAwODY5MDAzNworSTI0NjQ1Nzc2NjcKK0k0MTY3Nzk1ODIzCitJMzA3MDA5NzY0OAorSTI1NzkxNzQ4ODIKK0kxMjE2ODg2NTY4CitJMzgxMDExNjM0MworSTIyNDk1MDc0ODUKK0kzMjY2OTAzNDgwCitJMzY3MTIzMzQ4MAorSTEwMDE5MTY1OAorSTMwODcxMjEzMzQKK0kzNjUwNjMwODcKK0kzODIxMjc1MTc2CitJMjE2NTA1Mjg0OAorSTEyODI0NjUyNDUKK0kzNjAxNTcwNjM3CitJMzEzMjQxMzIzNgorSTI3ODA1NzA0NTkKK0kzMjIyMTQyOTE3CitJMzEyOTc5NDY5MgorSTI2MTE1OTA4MTEKK0k5NDcwMzE2NzcKK0kyOTkxOTA4OTM4CitJNzUwOTk3OTQ5CitJMzYzMjU3NTEzMQorSTE2MzIwMTQ0NjEKK0kyODQ2NDg0NzU1CitJMjM0NzI2MTc3OQorSTI5MDM5NTk0NDgKK0kxMzk3MzE2Njg2CitJMTkwNDU3ODM5MgorSTc3NDY0OTU3OAorSTMxNjQ1OTg1NTgKK0kyNDI5NTg3NjA5CitJNzM4MjQ0NTE2CitJMTU2MzMwNDk3NQorSTEzOTkzMTc0MTQKK0kxMDIxMzE2Mjk3CitJMzE4NzkzMzIzNAorSTIxMjY3ODA3NTcKK0k0MDExOTA3ODQ3CitJNDA5NTE2OTIxOQorSTMzNTgwMTAwNTQKK0kyNzI5OTc4MjQ3CitJMzczNjgxMTY0NgorSTMwMDk2NTY0MTAKK0kyODkzMDQzNjM3CitJNDAyNzQ0NzM4NQorSTEyMzk2MTAxMTAKK0kxNDg4ODA2OTAwCitJMjY3NDg2Njg0NAorSTQ0Mjg3NjM3NAorSTI4NTM2ODcyNjAKK0kyNzg1OTIxMDA1CitJMzE1MTM3ODUyOAorSTExODA1NjcKK0kyODAzMTQ2OTY0CitJOTgyMjIxNzU5CitJMjE5MjkxOTQxNworSTMwODcwMjYxODEKK0kyNDgwODM4MDAyCitJNzM4NDUyOTIxCitJNjg3OTg2MTg1CitJMzA0OTM3MTY3NgorSTM2MzY0OTI5NTQKK0kzNDY4MzExMjk5CitJMjM3OTYyMTEwMgorSTc4ODk4ODYzMworSTE2NDMyMTA2MDEKK0kyOTgzOTk4MTY4CitJMjQ5MjczMDgwMQorSTI1ODYwNDg3MDUKK0k2MDQwNzMwMjkKK0k0MTIxMDgyODE1CitJMTQ5NjQ3NjkyOAorSTI5NzIzNTcxMTAKK0kyNjYzMTE2OTY4CitJMjY0MjYyODU5MgorSTIxMTYwNTIwMzkKK0k0ODcxODYyNzkKK0kyNTc3NjgwMzI4CitJMzk3NDc2NjYxNAorSTczMDc3NjYzNgorSTM4NDI1Mjg4NTUKK0kxOTI5MDkzNjk1CitJNDQ2MjY2MjIKK0kzOTg5OTA4ODMzCitJMTY5NTQyNjIyMgorSTM2NzU0NzkzODIKK0kzMDUxNzg0OTY0CitJMTUxNDg3NjYxMworSTEyNTQwMzY1OTUKK0kyNDIwNDUwNjQ5CitJMzAzNDM3NzM2MQorSTIzMzI5OTA1OTAKK0kxNTM1MTc1MTI2CitJMTg1ODM0Mzg0CitJMTEwNzM3MjkwMAorSTE3MDcyNzgxODUKK0kxMjg2Mjg1Mjk1CitJMzMzMjU3NDIyNQorSTI3ODU2NzI0MzcKK0k4ODMxNzA2NDUKK0kyMDA1NjY2NDczCitJMzQwMzEzMTMyNworSTQxMjIwMjEzNTIKK0kxNDY0MDMyODU4CitJMzcwMjU3NjExMgorSTI2MDU1NDU5OAorSTE4Mzc3MzE2NTAKK0kyNTk0NDM1MzQ1CitJNzU3NzEwNDkKK0kyMDEyNDg0Mjg5CitJMzA1ODY0OTc3NQorSTI5OTc5NzAzCitJMzg2MTMzNTMzNQorSTI1MDY0OTUxNTIKK0kzNzg2NDQ4NzA0CitJNDQyOTQ3NzkwCitJMjU4MjcyNDc3NAorSTQyOTEzMzYyNDMKK0kyNTY4MTg5ODQzCitJMTkyMzA3MjY5MAorSTExMjE1ODk2MTEKK0k4Mzc2OTYzMDIKK0kzMjg0NjMxNzIwCitJMzg2NTAyMTMyNAorSTM1NzY0NTMxNjUKK0kyNTU5NTMxNjI5CitJMTQ1OTIzMTc2MgorSTM1MDY1NTAwMzYKK0kzNzU0NDIwMTU5CitJMjYyMjAwMDc1NworSTEyNDIyODU5NgorSTEwODQzMjg2MDUKK0kxNjkyODMwNzUzCitJNTQ3MjczNTU4CitJNjc0MjgyNjIxCitJNjU1MjU5MTAzCitJMzE4ODYyOTYxMAorSTQ5MDUwMjE3NAorSTIwODEwMDEyOTMKK0kzMTkxMzMwNzA0CitJNDEwOTk0MzU5MworSTE4NTk5NDg1MDQKK0kzMTYzODA2NDYwCitJNTA4ODMzMTY4CitJMTI1NjM3MTAzMworSTI3MDkyNTM3OTAKK0kyMDY4OTU2NTcyCitJMzA5Mjg0MjgxNAorSTM5MTM5MjY1MjkKK0kyMDM5NjM4NzU5CitJOTgxOTgyNTI5CitJNTM2MDk0MTkwCitJMzY4ODU1Mjk1CitJNTE5OTM5NzUKK0kxNTk3NDgwNzMyCitJNDA1ODE3NTUyMgorSTIxNTU4OTY3MDIKK0kzMTk2MjUxOTkxCitJMTA4MTkxMzg5MworSTM5NTIzNTM3ODgKK0kzNTQ1NTQ4MTA4CitJMjM3MDY2OTY0NworSTIyMDY1NzIzMDgKK0kyNTc2MzkyOTkxCitJMTczMjMwMzM3NAorSTExNTMxMzYyOTAKK0k1Mzc2NDE5NTUKK0kxNzM4NjkxNzQ3CitJMzIzMjg1NDE4NgorSTI1Mzk2MzIyMDYKK0kyODI5NzYwMjc4CitJMzA1ODE4Nzg1MworSTEyMDI0MjU3OTIKK0kzNzYyMzYxOTcwCitJMjg2Mzk0OTM0MgorSTI2NDA2MzU4NjcKK0kzNzY2Mzg3NDQKK0kxODU3Njc5NzU3CitJMzMwNzk4MDg3CitJMTQ1NzQwMDUwNQorSTExMzU2MTAwNDYKK0k2MDY0MDA3MTUKK0kxODU5NTM2MDI2CitJNTA5ODExMzM1CitJNTI5NzcyMzA4CitJMjU3OTI3MzI0NAorSTE4OTAzODIwMDQKK0kzOTU5OTA4ODc2CitJMjYxMjMzNTk3MQorSTI4MzQwNTIyMjcKK0kxNDM0NDc1OTg2CitJMzY4NDIwMjcxNworSTQwMTUwMTEzNDUKK0k1ODI1Njc4NTIKK0kzNjg5OTY5NTcxCitJMzkzNDc1MzQ2MAorSTMwMzQ5NjA2OTEKK0kyMDg1NzMyOTIKK0k0MDA0MTEzNzQyCitJMzk5MjkwNDg0MgorSTI1ODcxNTM3MTkKK0kzNTI5MTc5MDc5CitJMTU2NTQyNDk4NworSTc3OTEzMDY3OAorSTEwNDg1ODI5MzUKK0kzMjEzNTkxNjIyCitJMzYwNzc5MzQzNAorSTM5NTEyNTQ5MzcKK0kyMDQ3ODExOTAxCitJNzUwODg1MAorSTI0ODU0NDYwNQorSTQyMTAwOTAzMjQKK0kyMzMxNDkwODg0CitJNzAwNTcyMTMKK0k3NzY0NzQ5NDUKK0kxMzQ1NTI4ODg5CitJMzI5MDQwMzYxMgorSTE2NjQ5NTUyNjkKK0kxNTMzMTQzMTE2CitJNTQ1MDAzNDI0CitJNDE0MTU2NDQ3OAorSTEyNTczMjYxMzkKK0k4Njg4NDM2MDEKK0kyMzM3NjAzMDI5CitJMTkxODEzMTQ0OQorSTE4NDM0Mzk1MjMKK0kxMTI1NTE5MDM1CitJNjczMzQwMTE4CitJNDIxNDA4ODUyCitJMTUyMDQ1NDkwNgorSTE4MDQ3MjI2MzAKK0kzNjIxMjU0MTk2CitJMjMyOTk2ODAwMAorSTM5NDY0NjcyCitJNDMwNTgzMTM0CitJMjk0MDI2NTEyCitJNTM5Nzg1MjUKK0kyODkyMjc2MTA1CitJMTQxODg2Mzc2NAorSTM0MTkwNTQ0NTEKK0kxMzkxNTk1Nzk3CitJMzU0NDk4MTc5OAorSTQxOTE3ODA4NTgKK0k4MjU2NzIzNTcKK0kyOTcyMDAwODQ0CitJMTU3MTMwNTA2OQorSTQyMzE5ODI4NDUKK0kzNjExOTE2NDE5CitJMzA0NTE2MzE2OAorSTI5ODIzNDk3MzMKK0kyNzg1NzIxNDEKK0k0MjE1MzM4MDc4CitJODM5ODYwNTA0CitJMTgxOTE1MTc3OQorSTE0MTIzNDc0NzkKK0kxMzg2NzcwMzUzCitJMzkxNDU4OTQ5MQorSTM3ODMxMDQ5NzcKK0k0MTI0Mjk2NzMzCitJODMwNTQ2MjU4CitJODk4MjU2MjQKK0k0MTEwNjAxMzI4CitJMjU0NTQ4MzQyOQorSTMwMDYwMDUyNworSTUxNjY0MTE1OAorSTM2OTMwMjEwMzQKK0kyODUyOTEyODU0CitJMzI0MDAzOTg2OAorSTQxNjc0MDc5NTkKK0kxNDc5NTU3OTQ2CitJMzYyMTE4ODgwNAorSTEzOTE1OTA5NDQKK0kzNTc4NDQxMTI4CitJMTIyNzA1NTU1NgorSTQwNjg5ODM5NgorSTMwNjQwNTQ5ODMKK0kyNTgzNTMzOAorSTQwMjY2NDE2NQorSTQwOTc2ODI3NzkKK0kyMTA2NzI4MDEyCitJMjAzNjEzNjIyCitJMzA0NTQ2NzY4NgorSTEzODE3MjY0MzgKK0kzNzk4NjcwMTEwCitJMTM0MjMxNDk2MQorSTM1NTI0OTczNjEKK0k1MzU5MTM2MTkKK0kyNjI1Nzg3NTgzCitJMTYwNjU3NDMwNworSTExMDEyNjk2MzAKK0kxOTUwNTEzNzUyCitJMTEyMTM1NTg2MgorSTM1ODY4MTY5MDMKK0k0Mzg1Mjk5ODQKK0kyNDczMTgyMTIxCitJMTIyOTk5NzIwMworSTQwNTQ0NTk0MAorSTE2OTU1MzUzMTUKK0k0MjcwMTQzMzYKK0kzOTE2NzY4NDMwCitJMzkyMjk4MzU5CitJMTg4NDY0Mjg2OAorSTEyNDQ3MzA4MjEKK0k3NDEwNTgwODAKK0k1Njc0Nzk5NTcKK0kzNTI3NjIxMTY4CitJMzE5MTk3MTAxMQorSTMyNjcwNjkxMDQKK0k0MTA4NjY4MTQ2CitJMTUyMDc5NTU4NworSTE2NjU4MTAwNgorSTQ3Mzc5NDQ3NworSTE1NjIxMjY1NTAKK0k5Mjk4NDMwMTAKK0k4ODk1MzMyOTQKK0kxMjY2NTU2NjA4CitJODc0NTE4NjUwCitJMzUyMDE2MjA5MgorSTMwMTM3NjUwNDkKK0k0MjIwMjMxNDE0CitJNTQ3MjQ2NDQ5CitJMzk5ODA5Mzc2OQorSTM3MzcxOTM3NDYKK0kzODcyOTQ0MjA3CitJNzkzNjUxODc2CitJMjYwNjM4NDMxOAorSTg3NTk5MTAxMgorSTEzOTQ4MzYzMzQKK0k0MTAyMDExNjQ0CitJODU0MzgwNDI2CitJMjYxODY2Njc2NworSTI1NjgzMDIwMDAKK0kxOTk1NTEyMTMyCitJMjI5NDkxMDkzCitJMjY3MzUwMDI4NgorSTMzNjQ1NTA3MzkKK0kzODM2OTIzNDE2CitJMjQzNjU2OTg3CitJMzk0NDM4ODk4MworSTQwNjQ5NDk2NzcKK0kxNDE2OTU2Mzc4CitJMTcwMzI0NDQ4NworSTM5OTA3OTg4MjkKK0kyMDIzNDI1NzgxCitJMzkyNjcwMjIxNAorSTEyMjkwMTU1MDEKK0kzMTc0MjQ3ODI0CitJNjI0Cit0cDIKK050cDMKK2IuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3JhbmR2My5wY2sgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmFuZHYzLnBjawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWZjMzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JhbmR2My5wY2sKQEAgLTAsMCArMSw2MzMgQEAKK2NyYW5kb20KK1JhbmRvbQorcDAKKyh0UnAxCisoSTMKKyhMMjE0NzQ4MzY0OEwKK0w5OTQwODE4MzFMCitMMjgwNjI4NzI2NUwKK0wyMjI4OTk5ODMwTAorTDMzOTY0OTgwNjlMCitMMjk1NjgwNTQ1N0wKK0wzMjczOTI3NzYxTAorTDkyMDcyNjUwN0wKK0wxODYyNjI0NDkyTAorTDI5MjEyOTI0ODVMCitMMTc3OTUyNjg0M0wKK0wyNDY5MTA1NTAzTAorTDI1MTY5NjI5M0wKK0wxMjU0MzkwNzE3TAorTDc3OTE5NzA4MEwKK0wzMTY1MzU2ODMwTAorTDIwMDczNjUyMThMCitMMTg3MDAyODgxMkwKK0wyODk2NTE5MzYzTAorTDE4NTU1Nzg0MzhMCitMOTc5NTE4NDE2TAorTDM0ODE3MTAyNDZMCitMMzE5MTg2MTUwN0wKK0wzOTkzMDA2NTkzTAorTDI5Njc5NzE0NzlMCitMMzM1MzM0Mjc1M0wKK0wzNTc2NzgyNTcyTAorTDMzOTY4NTU1OEwKK0wyMzY3Njc1NzMyTAorTDExNjIwODU1NUwKK0wxMjIwMDU0NDM3TAorTDQ4NjU5NzA1NkwKK0wxOTEyMTE1MTQxTAorTDEwMzcwNDQ3OTJMCitMNDA5NjkwNDcyM0wKK0wzNDA5MTQ2MTc1TAorTDM3MDE2NTEyMjdMCitMMzE1ODI0NjEwTAorTDQxMzg2MDQ1ODNMCitMMTM4NTc2NDg5MkwKK0wxOTE4Nzg5MDBMCitMMjMyMDU4MjIxOUwKK0wzNDIwNjc3NDk0TAorTDI3NzY1MDMxNjlMCitMMTE0ODI0NzQwM0wKK0w4Mjk1NTUwNjlMCitMOTAyMDY0MDEyTAorTDI5MzQ2NDI3NDFMCitMMjQ3NzEwODU3N0wKK0wyNTgzOTI4MjE3TAorTDE2NTg2MTI1NzlMCitMMjg2NTQ0NzkxM0wKK0wxMjkxNDczNDZMCitMMzY5MTE3MTg4N0wKK0wxNTY5MzI4MTEwTAorTDEzNzI4NjAxNDNMCitMMTA1NDEzOTE4M0wKK0wxNjE3NzA3MDgwTAorTDY5MDIwNTkyTAorTDM4MTAyNzE2MDNMCitMMTg1Mzk1MzQxNkwKK0wzNDk5ODAzMDczTAorTDEwMjc1NDUwMjdMCitMMzIyOTA0MzYwNUwKK0wyNTA4NDg3MjBMCitMMzMyNDkzMjYyNkwKK0wzNTM3MDAyOTYyTAorTDI0OTQzMjMzNDVMCitMMzIzODEwMzk2MkwKK0w0MTQ3NTQxNTc5TAorTDM2MzYzNDgxODZMCitMMzAyNTQ1NTA4M0wKK0wyNjc4NzcxOTc3TAorTDU4NDcwMDI1NkwKK0wzNDYxODI2OTA5TAorTDg1NDUxMTQyMEwKK0w5NDM0NjM1NTJMCitMMzYwOTIzOTAyNUwKK0wzOTc3NTc3OTg5TAorTDI1MzA3MDA5MEwKK0w3NzczOTQ1NDRMCitMMjE0NDA4NjU2N0wKK0wxMDkyOTQ3OTkyTAorTDg1NDMyNzI4NEwKK0wyMjIyNzUwMDgyTAorTDM2MDE4MzUxMEwKK0wxMzEyNDY2NDgzTAorTDMyMjc1MzEwOTFMCitMMjIzNTAyMjUwMEwKK0wzMDEzMDYwNTMwTAorTDI1NDEwOTEyOThMCitMMzQ4MDEyNjM0MkwKK0wxODM5NzYyNzc1TAorTDI2MzI2MDgxOTBMCitMMTEwODg4OTQwM0wKK0wzMDQ1MDUwOTIzTAorTDczMTUxMzEyNkwKK0wzNTA1NDM2Nzg4TAorTDMwNjI3NjIwMTdMCitMMTY2NzM5MjY4MEwKK0wxMzU0MTI2NTAwTAorTDExNDM1NzM5MzBMCitMMjgxNjY0NTcwMkwKK0wyMTAwMzU2ODczTAorTDI4MTc2NzkxMDZMCitMMTIxMDc0NjAxMEwKK0wyNDA5OTE1MjQ4TAorTDI5MTAxMTk5NjRMCitMMjMwOTAwMTQyMEwKK0wyMjAzNTE4MjRMCitMMzY2NzM1Mjg3MUwKK0wzOTkzMTQ4NTkwTAorTDI4ODYxNjAyMzJMCitMNDIzOTM5MzcwMUwKK0wxMTg5MjcwNTgxTAorTDMwNjc5ODU1NDFMCitMMTQ3Mzc0NTczTAorTDIzNTUxNjQ4NjlMCitMMzY5NjAxMzU1MEwKK0w0MjI3MDM3ODQ2TAorTDE5MDUxMTI3NDNMCitMMzMxMjg0MzY4OUwKK0wyOTMwNjc4MjY2TAorTDE4Mjg3OTUzNTVMCitMNzY5MzM1OTRMCitMMzk4NzEwMDc5NkwKK0wxMjg4MzYxNDM1TAorTDM0NjQ1MjkxNTFMCitMOTY1NDk4MDc5TAorTDE0NDQ2MjMwOTNMCitMMTM3Mjg5MzQxNUwKK0wxNTM2MjM1NTk3TAorTDEzNDE5OTQ4NTBMCitMOTYzNTk0NzU4TAorTDIxMTUyOTU3NTRMCitMOTgyMDk4Njg1TAorTDEwNTM0MzM5MDRMCitMMjA3ODQ2OTg0NEwKK0wzMDU5NzY1NzkyTAorTDE3NTM2MDYxODFMCitMMjEzMDE3MTI1NEwKK0w1Njc1ODgxOTRMCitMNTI5NjI5NDI2TAorTDM2MjE1MjM1MzRMCitMMzAyNzU3NjU2NEwKK0wxMTc2NDM4MDgzTAorTDQwOTYyODc4NThMCitMMTE2ODU3NDY4M0wKK0wxNDI1MDU4OTYyTAorTDE0Mjk2MzE2NTVMCitMMjkwMjEwNjc1OUwKK0w3NjE5MDA2NDFMCitMMTMyOTE4Mzk1NkwKK0wxOTQ3MDUwOTMyTAorTDQ0NzQ5MDI4OUwKK0wzMjgyNTE2Mjc2TAorTDIwMDAzNzM4OUwKK0w5MjE4NjgxOTdMCitMMzMzMTQwMzk5OUwKK0w0MDg4NzYwMjQ5TAorTDIxODgzMjYzMThMCitMMjg4NDAxOTYxTAorTDEzNjA4MDI2NzVMCitMMzE0MzAyODA4TAorTDMzMTQ2MzkyMTBMCitMMzc0OTgyMTIwM0wKK0wyMjg2MDgxNTcwTAorTDI3Njg5MzkwNjJMCitMMzIwMDU0MTAxNkwKK0wyMTMzNDk1NDgyTAorTDM4NTAyOTg4MEwKK0w0MjE3MjMyMjAyTAorTDMxNzE2MTcyMzFMCitMMTY2MDg0NjY1M0wKK0wyNDU5OTg3NjIxTAorTDI2OTE3NzYxMjRMCitMNDIyNTAzMDQwOEwKK0wzNTk1Mzk2NzczTAorTDExMDM2ODA2NjFMCitMNTM5MDY0MDU3TAorTDE0OTI4NDExMDFMCitMMTY2MTk1Mzk0TAorTDc1Nzk3MzY1OEwKK0w1MzM4OTMwNTRMCitMMjc4NDg3OTU5NEwKK0wxMDIxODIxODgzTAorTDIzNTA1NDgxNjJMCitMMTc2ODUyMTE2TAorTDM1MDMxNjYwMjVMCitMMTQ4MDc5OTE0TAorTDE2MzM0NjYyMzZMCitMMjc3MzA5MDE2NUwKK0wxMTYyODQ2NzAxTAorTDM1NzU3Mzc3OTVMCitMMTYyNDE3ODIzOUwKK0wyNDU0ODk0NzEwTAorTDMwMTQ2OTE5MzhMCitMNTI2MzU1Njc5TAorTDE4NzA4MjQwODFMCitMMzM2MjQyNTg1N0wKK0wzOTA3NTY2NjY1TAorTDM0NjI1NjMxODRMCitMMjIyOTExMjAwNEwKK0w0MjAzNzM1NzQ4TAorTDE1NTc0NDI0ODFMCitMOTI0MTMzOTk5TAorTDE5MDY2MzQyMTRMCitMODgwNDU5NzI3TAorTDQwNjU4OTU4NzBMCitMMTQxNDI2MjU0TAorTDEyNTg0NTAxNTlMCitMMzI0MzExNTAyN0wKK0wxNTc0OTU4ODQwTAorTDMxMzkzOTI5NEwKK0wzMDU1NjY0MjYwTAorTDM0NTk3MTQyNTVMCitMNTMxNzc4NzkwTAorTDUwOTUwNTUwNkwKK0wxNjIwMjI3NDkxTAorTDI2NzU1NTQ5NDJMCitMMjUxNjUwOTU2MEwKK0wzNzk3Mjk5ODg3TAorTDIzNzEzNTg5MEwKK0wzMjAzMTQyMjEzTAorTDEwODc3NDUzMTBMCitMMTg5NzE1MTg1NEwKK0wzOTM2NTkwMDQxTAorTDEzMjc2NTE2N0wKK0wyMzg1OTA4MDYzTAorTDEzNjA2MDAyODlMCitMMzU3NDU2Nzc2OUwKK0wyNzUyNzg4MTE0TAorTDI2NDQyMjg5NjZMCitMMjM3NzcwNTE4M0wKK0w2MDEyNzc5MDlMCitMNDA0NjQ4MDQ5OEwKK0wzMjQ0MDE0MDhMCitMMzI3OTkzMTc2MEwKK0wyMjI3MDU5Mzc3TAorTDE1Mzg4Mjc0OTNMCitMNDIyMDUzMjA2NEwKK0w0NzgwNDQ1NjRMCitMMjkxNzExNzc2MUwKK0w2MzU0OTI4MzJMCitMMjMxOTc2MzI2MUwKK0w3OTU5NDQyMDZMCitMMTgyMDQ3MzIzNEwKK0wxNjczMTUxNDA5TAorTDE0MDQwOTU0MDJMCitMMTY2MTA2NzUwNUwKK0wzMjE3MTA2OTM4TAorTDI0MDYzMTA2ODNMCitMMTkzMTMwOTI0OEwKK0wyNDU4NjIyODY4TAorTDMzMjM2NzA1MjRMCitMMzI2Njg1Mjc1NUwKK0wyNDAwODM5NDNMCitMMzE2ODM4NzM5N0wKK0w2MDc3MjIxOThMCitMMTI1NjgzNzY5MEwKK0wzNjA4MTI0OTEzTAorTDQyNDQ5NjkzNTdMCitMMTI4OTk1OTI5M0wKK0w1MTk3NTAzMjhMCitMMzIyOTQ4MjQ2M0wKK0wxMTA1MTk2OTg4TAorTDE4MzI2ODQ0NzlMCitMMzc2MTAzNzIyNEwKK0wyMzYzNjMxODIyTAorTDMyOTc5NTc3MTFMCitMNTcyNzY2MzU1TAorTDExOTU4MjIxMzdMCitMMjIzOTIwNzk4MUwKK0wyMDM0MjQxMjAzTAorTDE2MzU0MDUxNEwKK0wyODgxNjAyNTVMCitMNzE2NDAzNjgwTAorTDQwMTk0MzkxNDNMCitMMTUzNjI4MTkzNUwKK0wyMzQ1MTAwNDU4TAorTDI3ODYwNTkxNzhMCitMMjgyMjIzMjEwOUwKK0w5ODcwMjUzOTVMCitMMzA2MTE2NjU1OUwKK0w0OTA0MjI1MTNMCitMMjU1MTAzMDExNUwKK0wyNjM4NzA3NjIwTAorTDEzNDQ3Mjg1MDJMCitMNzE0MTA4OTExTAorTDI4MzE3MTk3MDBMCitMMjE4ODYxNTM2OUwKK0wzNzM1MDkwNjFMCitMMTM1MTA3NzUwNEwKK0wzMTM2MjE3MDU2TAorTDc4MzUyMTA5NUwKK0wyNTU0OTQ5NDY4TAorTDI2NjI0OTk1NTBMCitMMTIwMzgyNjk1MUwKK0wxMzc5NjMyMzg4TAorTDE5MTg4NTg5ODVMCitMNjA3NDY1OTc2TAorTDE5ODA0NTAyMzdMCitMMzU0MDA3OTIxMUwKK0wzMzk3ODEzNDEwTAorTDI5MTMzMDkyNjZMCitMMjI4OTU3MjYyMUwKK0w0MTMzOTM1MzI3TAorTDQxNjYyMjc2NjNMCitMMzM3MTgwMTcwNEwKK0wzMDY1NDc0OTA5TAorTDM1ODA1NjIzNDNMCitMMzgzMjE3MjM3OEwKK0wyNTU2MTMwNzE5TAorTDMxMDQ3MzcwNUwKK0wzNzM0MDE0MzQ2TAorTDI0OTA0MTM4MTBMCitMMzQ3MjMzMDU2TAorTDUyNjY2ODAzN0wKK0wxMTU4MzkzNjU2TAorTDU0NDMyOTcwM0wKK0wyMTUwMDg1NDE5TAorTDM5MTQwMzgxNDZMCitMMTA2MDIzNzU4NkwKK0w0MTU5Mzk0ODM3TAorTDExMzIwNTEyMUwKK0wzMDk5NjY3NzVMCitMNDA5ODc4NDQ2NUwKK0wzNjM1MjIyOTYwTAorTDI0MTc1MTY1NjlMCitMMjA4OTU3OTIzM0wKK0wxNzI1ODA3NTQxTAorTDI3MjgxMjI1MjZMCitMMjM2NTgzNjUyM0wKK0wyNTA0MDc4NTIyTAorTDE0NDM5NDY4NjlMCitMMjM4NDE3MTQxMUwKK0w5OTcwNDY1MzRMCitMMzI0OTEzMTY1N0wKK0wxNjk5ODc1OTg2TAorTDM2MTgwOTcxNDZMCitMMTcxNjAzODIyNEwKK0wyNjI5ODE4NjA3TAorTDI5MjkyMTc4NzZMCitMMTM2NzI1MDMxNEwKK0wxNzI2NDM0OTUxTAorTDEzODg0OTYzMjVMCitMMjEwNzYwMjE4MUwKK0wyODIyMzY2ODQyTAorTDMwNTI5NzkxOTBMCitMMzc5Njc5ODYzM0wKK0wxNTQzODEzMzgxTAorTDk1OTAwMDEyMUwKK0wxMzYzODQ1OTk5TAorTDI5NTI1MjgxNTBMCitMODc0MTg0OTMyTAorTDE4ODgzODcxOTRMCitMMjMyODY5NTI5NUwKK0wzNDQyOTU5ODU1TAorTDg0MTgwNTk0N0wKK0wxMDg3NzM5Mjc1TAorTDMyMzAwMDU0MzRMCitMMzA0NTM5OTI2NUwKK0wxMTYxODE3MzE4TAorTDI4OTg2NzMxMzlMCitMODYwMDExMDk0TAorTDk0MDUzOTc4MkwKK0wxMjk3ODE4MDgwTAorTDQyNDM5NDE2MjNMCitMMTU3NzYxMzAzM0wKK0w0MjA0MTMxODg3TAorTDM4MTkwNTcyMjVMCitMMTk2OTQzOTU1OEwKK0wzMjk3OTYzOTMyTAorTDI0MTg3NDA2OUwKK0wzNTE3MDMzNDUzTAorTDIyOTUzNDU2NjRMCitMMTA5ODkxMTQyMkwKK0w4ODY5NTUwMDhMCitMMTQ3NzM5NzYyMUwKK0w0Mjc5MzQ3MzMyTAorTDM2MTY1NTg3OTFMCitMMjM4NDQxMTk1N0wKK0w3NDI1Mzc3MzFMCitMNzY0MjIxNTQwTAorTDI4NzE2OTg5MDBMCitMMzUzMDYzNjM5M0wKK0w2OTEyNTY2NDRMCitMNzU4NzMwOTY2TAorTDE3MTc3NzMwOTBMCitMMjc1MTg1NjM3N0wKK0wzMTg4NDg0MDAwTAorTDM3Njc0Njk2NzBMCitMMTYyMzg2MzA1M0wKK0wzNTMzMjM2NzkzTAorTDQwOTkyODQxNzZMCitMNzIzOTIxMTA3TAorTDMxMDU5NDAzNkwKK0wyMjM5Nzg3NDVMCitMMjI2NjU2NTc3NkwKK0wyMDE4NDMzMDNMCitMMjk2OTk2ODU0NkwKK0wzMzUxMTcwODg4TAorTDM0NjUxMTM2MjRMCitMMjcxMjI0NjcxMkwKK0wxNTIxMzgzMDU3TAorTDIzODQ0NjE3OThMCitMMjE2MzU3NTUxTAorTDIxNjczMDE5NzVMCitMMzE0NDY1MzE5NEwKK0wyNzgxMjIwMTU1TAorTDM2MjA3NDc2NjZMCitMOTU5NzEyNjVMCitMNDI1NTQwMDI0M0wKK0w1OTk5OTc1N0wKK0w0MTc0MjczNDcyTAorTDM5NzQ1MTE1MjRMCitMMTAwNzEyMzk1MEwKK0wzMTEyNDc3NjI4TAorTDgwNjQ2MTUxMkwKK0wzMTQ4MDc0MDA4TAorTDUyODM1Mjg4MkwKK0wyNTQ1OTc5NTg4TAorTDI1NjIyODE5NjlMCitMMzAxMDI0OTQ3N0wKK0wxODg2MzMxNjExTAorTDMyMTA2NTY0MzNMCitMMTAzNDA5OTk3NkwKK0wyOTA2ODkzNTc5TAorTDExOTcwNDg3NzlMCitMMTg3MDAwNDQwMUwKK0wzODk4MzAwNDkwTAorTDI2ODY4NTY0MDJMCitMMzk3NTcyMzQ3OEwKK0w2MTMwNDM1MzJMCitMMjU2NTY3NDM1M0wKK0wzNzYwMDQ1MzEwTAorTDM0Njg5ODQzNzZMCitMNDEyNjI1OEwKK0wzMDM4NTU0MjRMCitMMzk4ODk2MzU1MkwKK0wyNzYyNTY3OTZMCitMNTQ0MDcxODA3TAorTDEwMjM4NzIwNjJMCitMMTc0NzQ2MTUxOUwKK0wxOTc1NTcxMjYwTAorTDQwMzM3NjY5NThMCitMMjk0NjU1NTU1N0wKK0wxNDkyOTU3Nzk2TAorTDk1ODI3MTY4NUwKK0w0NjQ4MDUxNUwKK0w5MDc3NjA2MzVMCitMMTMwNjYyNjM1N0wKK0w4MTk2NTIzNzhMCitMMTE3MjMwMDI3OUwKK0wxMTE2ODUxMzE5TAorTDQ5NTYwMTA3NUwKK0wxMTU3NzE1MzMwTAorTDUzNDIyMDEwOEwKK0wzNzczMjAwMjhMCitMMTY3MjI4NjEwNkwKK0wyMDY2MjE5Mjg0TAorTDE4NDIzODYzNTVMCitMMjU0NjA1OTQ2NEwKK0wxODM5NDU3MzM2TAorTDM0NzYxOTQ0NDZMCitMMzA1MDU1MDAyOEwKK0w1OTQ3MDU1ODJMCitMMTkwNTgxMzUzNUwKK0wxODEzMDMzNDEyTAorTDI3MDA4NTgxNTdMCitMMTY5MDY3OTcyTAorTDQyNTI4ODkwNDVMCitMMTkyMTk0NDU1NUwKK0w0OTc2NzE0NzRMCitMMjEwMTQzOTM1TAorTDI2ODgzOTg0ODlMCitMMzI1MTU4Mzc1TAorTDM0NTA4NDY0NDdMCitMODkxNzYwNTk3TAorTDcxMjgwMjUzNkwKK0wxMTMyNTU3NDM2TAorTDE0MTcwNDQwNzVMCitMMTYzOTg4OTY2MEwKK0wxNzQ2Mzc5OTcwTAorTDE0Nzg3NDE2NDdMCitMMjgxNzU2MzQ4NkwKK0wyNTczNjEyNTMyTAorTDQyNjY0NDQ0NTdMCitMMjkxMTYwMTYxNUwKK0w4MDQ3NDU0MTFMCitMMjIwNzI1NDY1MkwKK0wxMTg5MTQwNjQ2TAorTDM4Mjk3MjUxMTFMCitMMzYzNzM2NzM0OEwKK0wxOTQ0NzMxNzQ3TAorTDIxOTM0NDAzNDNMCitMMTQzMDE5NTQxM0wKK0wxMTczNTE1MjI5TAorTDE1ODI2MTgyMTdMCitMMjA3MDc2NzAzN0wKK0wyNDc5MDg5MzZMCitMMTQ2MDY3NTQzOUwKK0w1NTYwMDE1OTZMCitMMzI3NjI5MzM1TAorTDEwMzYxMzM4NzZMCitMNDIyODEyOTYwNUwKK0w5OTkxNzQwNDhMCitMMzYzNTgwNDAzOUwKK0wxNDE2NTUwNDgxTAorTDEyNzA1NDAyNjlMCitMNDI4MDc0MzgxNUwKK0wzOTYwNzY1OUwKK0wxNTUyNTQwNjIzTAorTDI3NjIyOTQwNjJMCitMNTA0MTM3Mjg5TAorTDQxMTcwNDQyMzlMCitMMTQxNzEzMDIyNUwKK0wxMzQyOTcwMDU2TAorTDE3NTU3MTY0NDlMCitMMTE2OTQ0NzMyMkwKK0wyNzMxNDAxMzU2TAorTDIzMTk5NzY3NDVMCitMMjg2OTIyMTQ3OUwKK0wyMzk3MjY1NUwKK0wyMjUxNDk1Mzg5TAorTDE0Mjk4NjA4NzhMCitMMzcyODEzNTk5MkwKK0w0MjQxNDMyOTczTAorTDM2OTgyNzUwNzZMCitMMjE2NDE2NDMyTAorTDQwNDAwNDY5NjBMCitMMjQ2MDc3MTc2TAorTDg5NDY3NTY4NUwKK0wzOTMyMjgyMjU5TAorTDMwOTcyMDUxMDBMCitMMjEyODgxODY1MEwKK0wxMzE5MDEwNjU2TAorTDE2MDE5NzQwMDlMCitMMjU1Mjk2MDk1N0wKK0wzNTU0MDE2MDU1TAorTDQyMDkzOTU2NDFMCitMMjAxMzM0MDEwMkwKK0wzMzcwNDQ3ODAxTAorTDIzMDcyNzIwMDJMCitMMTc5NTA5MTM1NEwKK0wyMDIxMDk0MDFMCitMOTg4MzQ1MDcwTAorTDI1MTQ4NzA3NThMCitMMTEzMjcyNjg1MEwKK0w1ODI3NDYyMjRMCitMMzExMjMwNTQyMUwKK0wxODQzMDIwNjgzTAorTDM2MDAxODkyMjNMCitMMTEwMTM0OTE2NUwKK0w0MjExOTA1ODU1TAorTDI4NjY2Nzc1ODFMCitMMjg4MTYyMTEzMEwKK0w0MTY1MzI0MTA5TAorTDQyMzg3NzMxOTFMCitMMzYzNTY0OTU1MEwKK0wyNjcwNDgxMDQ0TAorTDI5OTYyNDgyMTlMCitMMTY3Njk5MjQ4MEwKK0wzNDczMDY3MDUwTAorTDQyMDU3OTM2OTlMCitMNDAxOTQ5MDg5N0wKK0wxNTc5OTkwNDgxTAorTDE4OTk2MTc5OTBMCitMMTEzNjM0NzcxM0wKK0wxODAyODQyMjY4TAorTDM1OTE3NTI5NjBMCitMMTE5NzMwODczOUwKK0w0MzM2Mjk3ODZMCitMNDAzMjE0Mjc5MEwKK0wzMTQ4MDQxOTc5TAorTDMzMTIxMzg4NDVMCitMMzg5Njg2MDQ0OUwKK0wzMjk4MTgyNTY3TAorTDkwNzYwNTE3MEwKK0wxNjU4NjY0MDY3TAorTDI2ODI5ODAzMTNMCitMMjUyMzUyMzE3M0wKK0wxMjA4NzIyMTAzTAorTDM4MDg1MzAzNjNMCitMMTA3OTAwMzk0NkwKK0w0MjgyNDAyODY0TAorTDIwNDEwMTAwNzNMCitMMjY2NzU1NTA3MUwKK0w2ODgwMTgxODBMCitMMTQwNTEyMTAxMkwKK0w0MTY3OTk0MDc2TAorTDM1MDQ2OTUzMzZMCitMMTkyMzk0NDc0OUwKK0wxMTQzNTk4NzkwTAorTDM5MzYyNjg4OThMCitMMzYwNjI0Mzg0NkwKK0wxMDE3NDIwMDgwTAorTDQwMjYyMTExNjlMCitMNTk2NTI5NzYzTAorTDE4NDQyNTk2MjRMCitMMjg0MDIxNjI4MkwKK0wyNjczODA3NzU5TAorTDM0MDcyMDI1NzVMCitMMjczNzk3MTA4M0wKK0w0MDc1NDIzMDY4TAorTDM2ODQwNTc0MzJMCitMMzE0NjYyNzI0MUwKK0w1OTk2NTA1MTNMCitMNjk3NzMxMTRMCitMMTI1NzAzNTkxOUwKK0w4MDc0ODUyOTFMCitMMjM3NjIzMDY4N0wKK0wzMDM2NTkzMTQ3TAorTDI2NDI0MTE2NThMCitMMTA2MDgwMDQ0TAorTDIxOTk2MjI3MjlMCitMMjkxODM0NTExTAorTDI2OTc2MTEzNjFMCitMMTE2ODk3MzNMCitMNjI1MTIzOTUyTAorTDMyMjYwMjMwNjJMCitMMzIyOTY2MzI2NUwKK0w3NTMwNTk0NDRMCitMMjg0MzYxMDE4OUwKK0w2MjRMCit0cDIKK050cDMKK2IuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3JlX3Rlc3RzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlX3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI1YjEyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVfdGVzdHMucHkKQEAgLTAsMCArMSw2NzQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyAtKi0gbW9kZTogcHl0aG9uIC0qLQorCisjIFJlIHRlc3Qgc3VpdGUgYW5kIGJlbmNobWFyayBzdWl0ZSB2MS41CisKKyMgVGhlIDMgcG9zc2libGUgb3V0Y29tZXMgZm9yIGVhY2ggcGF0dGVybgorW1NVQ0NFRUQsIEZBSUwsIFNZTlRBWF9FUlJPUl0gPSByYW5nZSgzKQorCisjIEJlbmNobWFyayBzdWl0ZSAobmVlZHMgZXhwYW5zaW9uKQorIworIyBUaGUgYmVuY2htYXJrIHN1aXRlIGRvZXMgbm90IHRlc3QgY29ycmVjdG5lc3MsIGp1c3Qgc3BlZWQuICBUaGUKKyMgZmlyc3QgZWxlbWVudCBvZiBlYWNoIHR1cGxlIGlzIHRoZSByZWdleCBwYXR0ZXJuOyB0aGUgc2Vjb25kIGlzIGEKKyMgc3RyaW5nIHRvIG1hdGNoIGl0IGFnYWluc3QuICBUaGUgYmVuY2htYXJraW5nIGNvZGUgd2lsbCBlbWJlZCB0aGUKKyMgc2Vjb25kIHN0cmluZyBpbnNpZGUgc2V2ZXJhbCBzaXplcyBvZiBwYWRkaW5nLCB0byB0ZXN0IGhvdyByZWdleAorIyBtYXRjaGluZyBwZXJmb3JtcyBvbiBsYXJnZSBzdHJpbmdzLgorCitiZW5jaG1hcmtzID0gWworCisgICAgIyB0ZXN0IGNvbW1vbiBwcmVmaXgKKyAgICAoJ1B5dGhvbnxQZXJsJywgJ1BlcmwnKSwgICAgIyBBbHRlcm5hdGlvbgorICAgICgnKFB5dGhvbnxQZXJsKScsICdQZXJsJyksICAjIEdyb3VwZWQgYWx0ZXJuYXRpb24KKworICAgICgnUHl0aG9ufFBlcmx8VGNsJywgJ1BlcmwnKSwgICAgICAgICMgQWx0ZXJuYXRpb24KKyAgICAoJyhQeXRob258UGVybHxUY2wpJywgJ1BlcmwnKSwgICAgICAjIEdyb3VwZWQgYWx0ZXJuYXRpb24KKworICAgICgnKFB5dGhvbilcXDEnLCAnUHl0aG9uUHl0aG9uJyksICAgICMgQmFja3JlZmVyZW5jZQorICAgICgnKFswYS16XVthLXowLTldKiwpKycsICdhNSxiNyxjOSwnKSwgIyBEaXNhYmxlIHRoZSBmYXN0bWFwIG9wdGltaXphdGlvbgorICAgICgnKFthLXpdW2EtejAtOV0qLCkrJywgJ2E1LGI3LGM5LCcpLCAjIEEgZmV3IHNldHMKKworICAgICgnUHl0aG9uJywgJ1B5dGhvbicpLCAgICAgICAgICAgICAgICMgU2ltcGxlIHRleHQgbGl0ZXJhbAorICAgICgnLipQeXRob24nLCAnUHl0aG9uJyksICAgICAgICAgICAgICMgQmFkIHRleHQgbGl0ZXJhbAorICAgICgnLipQeXRob24uKicsICdQeXRob24nKSwgICAgICAgICAgICMgV29yc2UgdGV4dCBsaXRlcmFsCisgICAgKCcuKihQeXRob24pJywgJ1B5dGhvbicpLCAgICAgICAgICAgIyBCYWQgdGV4dCBsaXRlcmFsIHdpdGggZ3JvdXBpbmcKKworXQorCisjIFRlc3Qgc3VpdGUgKGZvciB2ZXJpZnlpbmcgY29ycmVjdG5lc3MpCisjCisjIFRoZSB0ZXN0IHN1aXRlIGlzIGEgbGlzdCBvZiA1LSBvciAzLXR1cGxlcy4gIFRoZSA1IHBhcnRzIG9mIGEKKyMgY29tcGxldGUgdHVwbGUgYXJlOgorIyBlbGVtZW50IDA6IGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdHRlcm4KKyMgICAgICAgICAxOiB0aGUgc3RyaW5nIHRvIG1hdGNoIGFnYWluc3QgdGhlIHBhdHRlcm4KKyMgICAgICAgICAyOiB0aGUgZXhwZWN0ZWQgcmVzdWx0IChTVUNDRUVELCBGQUlMLCBTWU5UQVhfRVJST1IpCisjICAgICAgICAgMzogYSBzdHJpbmcgdGhhdCB3aWxsIGJlIGV2YWwoKSdlZCB0byBwcm9kdWNlIGEgdGVzdCBzdHJpbmcuCisjICAgICAgICAgICAgVGhpcyBpcyBhbiBhcmJpdHJhcnkgUHl0aG9uIGV4cHJlc3Npb247IHRoZSBhdmFpbGFibGUKKyMgICAgICAgICAgICB2YXJpYWJsZXMgYXJlICJmb3VuZCIgKHRoZSB3aG9sZSBtYXRjaCksIGFuZCAiZzEiLCAiZzIiLCAuLi4KKyMgICAgICAgICAgICB1cCB0byAiZzk5IiBjb250YWluIHRoZSBjb250ZW50cyBvZiBlYWNoIGdyb3VwLCBvciB0aGUKKyMgICAgICAgICAgICBzdHJpbmcgJ05vbmUnIGlmIHRoZSBncm91cCB3YXNuJ3QgZ2l2ZW4gYSB2YWx1ZSwgb3IgdGhlCisjICAgICAgICAgICAgc3RyaW5nICdFcnJvcicgaWYgdGhlIGdyb3VwIGluZGV4IHdhcyBvdXQgb2YgcmFuZ2U7CisjICAgICAgICAgICAgYWxzbyAiZ3JvdXBzIiwgdGhlIHJldHVybiB2YWx1ZSBvZiBtLmdyb3VwKCkgKGEgdHVwbGUpLgorIyAgICAgICAgIDQ6IFRoZSBleHBlY3RlZCByZXN1bHQgb2YgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbi4KKyMgICAgICAgICAgICBJZiB0aGUgdHdvIGRvbid0IG1hdGNoLCBhbiBlcnJvciBpcyByZXBvcnRlZC4KKyMKKyMgSWYgdGhlIHJlZ2V4IGlzbid0IGV4cGVjdGVkIHRvIHdvcmssIHRoZSBsYXR0ZXIgdHdvIGVsZW1lbnRzIGNhbiBiZSBvbWl0dGVkLgorCit0ZXN0cyA9IFsKKyAgICAjIFRlc3QgP1A8IGFuZCA/UD0gZXh0ZW5zaW9ucworICAgICgnKD9QPGZvb18xMjMnLCAnJywgU1lOVEFYX0VSUk9SKSwgICAgICAjIFVudGVybWluYXRlZCBncm91cCBpZGVudGlmaWVyCisgICAgKCcoP1A8MT5hKScsICcnLCBTWU5UQVhfRVJST1IpLCAgICAgICAgICMgQmVnaW5zIHdpdGggYSBkaWdpdAorICAgICgnKD9QPCE+YSknLCAnJywgU1lOVEFYX0VSUk9SKSwgICAgICAgICAjIEJlZ2lucyB3aXRoIGFuIGlsbGVnYWwgY2hhcgorICAgICgnKD9QPGZvbyE+YSknLCAnJywgU1lOVEFYX0VSUk9SKSwgICAgICAjIEJlZ2lucyB3aXRoIGFuIGlsbGVnYWwgY2hhcgorCisgICAgIyBTYW1lIHRlc3RzLCBmb3IgdGhlID9QPSBmb3JtCisgICAgKCcoP1A8Zm9vXzEyMz5hKSg/UD1mb29fMTIzJywgJ2FhJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJyg/UDxmb29fMTIzPmEpKD9QPTEpJywgJ2FhJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJyg/UDxmb29fMTIzPmEpKD9QPSEpJywgJ2FhJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJyg/UDxmb29fMTIzPmEpKD9QPWZvb18xMjQnLCAnYWEnLCBTWU5UQVhfRVJST1IpLCAgIyBCYWNrcmVmIHRvIHVuZGVmaW5lZCBncm91cAorCisgICAgKCcoP1A8Zm9vXzEyMz5hKScsICdhJywgU1VDQ0VFRCwgJ2cxJywgJ2EnKSwKKyAgICAoJyg/UDxmb29fMTIzPmEpKD9QPWZvb18xMjMpJywgJ2FhJywgU1VDQ0VFRCwgJ2cxJywgJ2EnKSwKKworICAgICMgVGVzdCBvY3RhbCBlc2NhcGVzCisgICAgKCdcXDEnLCAnYScsIFNZTlRBWF9FUlJPUiksICAgICMgQmFja3JlZmVyZW5jZQorICAgICgnW1xcMV0nLCAnXDEnLCBTVUNDRUVELCAnZm91bmQnLCAnXDEnKSwgICMgQ2hhcmFjdGVyCisgICAgKCdcXDA5JywgY2hyKDApICsgJzknLCBTVUNDRUVELCAnZm91bmQnLCBjaHIoMCkgKyAnOScpLAorICAgICgnXFwxNDEnLCAnYScsIFNVQ0NFRUQsICdmb3VuZCcsICdhJyksCisgICAgKCcoYSkoYikoYykoZCkoZSkoZikoZykoaCkoaSkoaikoaykobClcXDExOScsICdhYmNkZWZnaGlqa2xrOScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzExJywgJ2FiY2RlZmdoaWprbGs5LWsnKSwKKworICAgICMgVGVzdCBcMCBpcyBoYW5kbGVkIGV2ZXJ5d2hlcmUKKyAgICAocidcMCcsICdcMCcsIFNVQ0NFRUQsICdmb3VuZCcsICdcMCcpLAorICAgIChyJ1tcMGFdJywgJ1wwJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ1wwJyksCisgICAgKHInW2FcMF0nLCAnXDAnLCBTVUNDRUVELCAnZm91bmQnLCAnXDAnKSwKKyAgICAocidbXmFcMF0nLCAnXDAnLCBGQUlMKSwKKworICAgICMgVGVzdCB2YXJpb3VzIGxldHRlciBlc2NhcGVzCisgICAgKHInXGFbXGJdXGZcblxyXHRcdicsICdcYVxiXGZcblxyXHRcdicsIFNVQ0NFRUQsICdmb3VuZCcsICdcYVxiXGZcblxyXHRcdicpLAorICAgIChyJ1tcYV1bXGJdW1xmXVtcbl1bXHJdW1x0XVtcdl0nLCAnXGFcYlxmXG5cclx0XHYnLCBTVUNDRUVELCAnZm91bmQnLCAnXGFcYlxmXG5cclx0XHYnKSwKKyAgICAjIE5PVEU6IG5vdCBhbiBlcnJvciB1bmRlciBQQ1JFL1BSRToKKyAgICAjIChyJ1x1JywgJycsIFNZTlRBWF9FUlJPUiksICAgICMgQSBQZXJsIGVzY2FwZQorICAgIChyJ1xjXGVcZ1xoXGlcalxrXG1cb1xwXHFceVx6JywgJ2NlZ2hpamttb3BxeXonLCBTVUNDRUVELCAnZm91bmQnLCAnY2VnaGlqa21vcHF5eicpLAorICAgIChyJ1x4ZmYnLCAnXDM3NycsIFNVQ0NFRUQsICdmb3VuZCcsIGNocigyNTUpKSwKKyAgICAjIG5ldyBceCBzZW1hbnRpY3MKKyAgICAocidceDAwZmZmZmZmZmZmZmZmZmYnLCAnXDM3NycsIEZBSUwsICdmb3VuZCcsIGNocigyNTUpKSwKKyAgICAocidceDAwZicsICdcMDE3JywgRkFJTCwgJ2ZvdW5kJywgY2hyKDE1KSksCisgICAgKHInXHgwMGZlJywgJ1wzNzYnLCBGQUlMLCAnZm91bmQnLCBjaHIoMjU0KSksCisgICAgIyAocidceDAwZmZmZmZmZmZmZmZmZmYnLCAnXDM3NycsIFNVQ0NFRUQsICdmb3VuZCcsIGNocigyNTUpKSwKKyAgICAjIChyJ1x4MDBmJywgJ1wwMTcnLCBTVUNDRUVELCAnZm91bmQnLCBjaHIoMTUpKSwKKyAgICAjIChyJ1x4MDBmZScsICdcMzc2JywgU1VDQ0VFRCwgJ2ZvdW5kJywgY2hyKDI1NCkpLAorCisgICAgKHIiXlx3Kz0oXFxbXDAwMC1cMjc3XXxbXlxuXFxdKSoiLCAiU1JDPWV2YWwuYyBnLmMgYmxhaCBibGFoIGJsYWggXFxcXFxuXHRhcGVzLmMiLAorICAgICBTVUNDRUVELCAnZm91bmQnLCAiU1JDPWV2YWwuYyBnLmMgYmxhaCBibGFoIGJsYWggXFxcXCIpLAorCisgICAgIyBUZXN0IHRoYXQgLiBvbmx5IG1hdGNoZXMgXG4gaW4gRE9UQUxMIG1vZGUKKyAgICAoJ2EuYicsICdhY2InLCBTVUNDRUVELCAnZm91bmQnLCAnYWNiJyksCisgICAgKCdhLmInLCAnYVxuYicsIEZBSUwpLAorICAgICgnYS4qYicsICdhY2NcbmNjYicsIEZBSUwpLAorICAgICgnYS57NCw1fWInLCAnYWNjXG5jY2InLCBGQUlMKSwKKyAgICAoJ2EuYicsICdhXHJiJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FccmInKSwKKyAgICAoJ2EuYig/cyknLCAnYVxuYicsIFNVQ0NFRUQsICdmb3VuZCcsICdhXG5iJyksCisgICAgKCdhLiooP3MpYicsICdhY2NcbmNjYicsIFNVQ0NFRUQsICdmb3VuZCcsICdhY2NcbmNjYicpLAorICAgICgnKD9zKWEuezQsNX1iJywgJ2FjY1xuY2NiJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FjY1xuY2NiJyksCisgICAgKCcoP3MpYS5iJywgJ2FcbmInLCBTVUNDRUVELCAnZm91bmQnLCAnYVxuYicpLAorCisgICAgKCcpJywgJycsIFNZTlRBWF9FUlJPUiksICAgICAgICAgICAjIFVubWF0Y2hlZCByaWdodCBicmFja2V0CisgICAgKCcnLCAnJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJycpLCAgICAjIEVtcHR5IHBhdHRlcm4KKyAgICAoJ2FiYycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYmMnLCAneGJjJywgRkFJTCksCisgICAgKCdhYmMnLCAnYXhjJywgRkFJTCksCisgICAgKCdhYmMnLCAnYWJ4JywgRkFJTCksCisgICAgKCdhYmMnLCAneGFiY3knLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYmMnLCAnYWJhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYipjJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ2FiKmJjJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ2FiKmJjJywgJ2FiYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJiYycpLAorICAgICgnYWIqYmMnLCAnYWJiYmJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYmJiYycpLAorICAgICgnYWIrYmMnLCAnYWJiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmJjJyksCisgICAgKCdhYitiYycsICdhYmMnLCBGQUlMKSwKKyAgICAoJ2FiK2JjJywgJ2FicScsIEZBSUwpLAorICAgICgnYWIrYmMnLCAnYWJiYmJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYmJiYycpLAorICAgICgnYWI/YmMnLCAnYWJiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmJjJyksCisgICAgKCdhYj9iYycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYj9iYycsICdhYmJiYmMnLCBGQUlMKSwKKyAgICAoJ2FiP2MnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnXmFiYyQnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnXmFiYyQnLCAnYWJjYycsIEZBSUwpLAorICAgICgnXmFiYycsICdhYmNjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnXmFiYyQnLCAnYWFiYycsIEZBSUwpLAorICAgICgnYWJjJCcsICdhYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnXicsICdhYmMnLCBTVUNDRUVELCAnZm91bmQrIi0iJywgJy0nKSwKKyAgICAoJyQnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIicsICctJyksCisgICAgKCdhLmMnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnYS5jJywgJ2F4YycsIFNVQ0NFRUQsICdmb3VuZCcsICdheGMnKSwKKyAgICAoJ2EuKmMnLCAnYXh5emMnLCBTVUNDRUVELCAnZm91bmQnLCAnYXh5emMnKSwKKyAgICAoJ2EuKmMnLCAnYXh5emQnLCBGQUlMKSwKKyAgICAoJ2FbYmNdZCcsICdhYmMnLCBGQUlMKSwKKyAgICAoJ2FbYmNdZCcsICdhYmQnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJkJyksCisgICAgKCdhW2ItZF1lJywgJ2FiZCcsIEZBSUwpLAorICAgICgnYVtiLWRdZScsICdhY2UnLCBTVUNDRUVELCAnZm91bmQnLCAnYWNlJyksCisgICAgKCdhW2ItZF0nLCAnYWFjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FjJyksCisgICAgKCdhWy1iXScsICdhLScsIFNVQ0NFRUQsICdmb3VuZCcsICdhLScpLAorICAgICgnYVtcXC1iXScsICdhLScsIFNVQ0NFRUQsICdmb3VuZCcsICdhLScpLAorICAgICMgTk9URTogbm90IGFuIGVycm9yIHVuZGVyIFBDUkUvUFJFOgorICAgICMgKCdhW2ItXScsICdhLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCdhW11iJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnYVsnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCdhXFwnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCdhYmMpJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnKGFiYycsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJ2FdJywgJ2FdJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FdJyksCisgICAgKCdhW11dYicsICdhXWInLCBTVUNDRUVELCAnZm91bmQnLCAnYV1iJyksCisgICAgKCdhW1xdXWInLCAnYV1iJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FdYicpLAorICAgICgnYVteYmNdZCcsICdhZWQnLCBTVUNDRUVELCAnZm91bmQnLCAnYWVkJyksCisgICAgKCdhW15iY11kJywgJ2FiZCcsIEZBSUwpLAorICAgICgnYVteLWJdYycsICdhZGMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWRjJyksCisgICAgKCdhW14tYl1jJywgJ2EtYycsIEZBSUwpLAorICAgICgnYVteXWJdYycsICdhXWMnLCBGQUlMKSwKKyAgICAoJ2FbXl1iXWMnLCAnYWRjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FkYycpLAorICAgICgnXFxiYVxcYicsICdhLScsIFNVQ0NFRUQsICciLSInLCAnLScpLAorICAgICgnXFxiYVxcYicsICctYScsIFNVQ0NFRUQsICciLSInLCAnLScpLAorICAgICgnXFxiYVxcYicsICctYS0nLCBTVUNDRUVELCAnIi0iJywgJy0nKSwKKyAgICAoJ1xcYnlcXGInLCAneHknLCBGQUlMKSwKKyAgICAoJ1xcYnlcXGInLCAneXonLCBGQUlMKSwKKyAgICAoJ1xcYnlcXGInLCAneHl6JywgRkFJTCksCisgICAgKCd4XFxiJywgJ3h5eicsIEZBSUwpLAorICAgICgneFxcQicsICd4eXonLCBTVUNDRUVELCAnIi0iJywgJy0nKSwKKyAgICAoJ1xcQnonLCAneHl6JywgU1VDQ0VFRCwgJyItIicsICctJyksCisgICAgKCd6XFxCJywgJ3h5eicsIEZBSUwpLAorICAgICgnXFxCeCcsICd4eXonLCBGQUlMKSwKKyAgICAoJ1xcQmFcXEInLCAnYS0nLCBGQUlMLCAnIi0iJywgJy0nKSwKKyAgICAoJ1xcQmFcXEInLCAnLWEnLCBGQUlMLCAnIi0iJywgJy0nKSwKKyAgICAoJ1xcQmFcXEInLCAnLWEtJywgRkFJTCwgJyItIicsICctJyksCisgICAgKCdcXEJ5XFxCJywgJ3h5JywgRkFJTCksCisgICAgKCdcXEJ5XFxCJywgJ3l6JywgRkFJTCksCisgICAgKCdcXEJ5XFxiJywgJ3h5JywgU1VDQ0VFRCwgJyItIicsICctJyksCisgICAgKCdcXGJ5XFxCJywgJ3l6JywgU1VDQ0VFRCwgJyItIicsICctJyksCisgICAgKCdcXEJ5XFxCJywgJ3h5eicsIFNVQ0NFRUQsICciLSInLCAnLScpLAorICAgICgnYWJ8Y2QnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiJyksCisgICAgKCdhYnxjZCcsICdhYmNkJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiJyksCisgICAgKCcoKWVmJywgJ2RlZicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnZWYtJyksCisgICAgKCckYicsICdiJywgRkFJTCksCisgICAgKCdhXFwoYicsICdhKGInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2EoYi1FcnJvcicpLAorICAgICgnYVxcKCpiJywgJ2FiJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiJyksCisgICAgKCdhXFwoKmInLCAnYSgoYicsIFNVQ0NFRUQsICdmb3VuZCcsICdhKChiJyksCisgICAgKCdhXFxcXGInLCAnYVxcYicsIFNVQ0NFRUQsICdmb3VuZCcsICdhXFxiJyksCisgICAgKCcoKGEpKScsICdhYmMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdhLWEtYScpLAorICAgICgnKGEpYihjKScsICdhYmMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdhYmMtYS1jJyksCisgICAgKCdhK2IrYycsICdhYWJiYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnKGErfGIpKicsICdhYicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWItYicpLAorICAgICgnKGErfGIpKycsICdhYicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWItYicpLAorICAgICgnKGErfGIpPycsICdhYicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYS1hJyksCisgICAgKCcpKCcsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJ1teYWJdKicsICdjZGUnLCBTVUNDRUVELCAnZm91bmQnLCAnY2RlJyksCisgICAgKCdhYmMnLCAnJywgRkFJTCksCisgICAgKCdhKicsICcnLCBTVUNDRUVELCAnZm91bmQnLCAnJyksCisgICAgKCdhfGJ8Y3xkfGUnLCAnZScsIFNVQ0NFRUQsICdmb3VuZCcsICdlJyksCisgICAgKCcoYXxifGN8ZHxlKWYnLCAnZWYnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2VmLWUnKSwKKyAgICAoJ2FiY2QqZWZnJywgJ2FiY2RlZmcnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjZGVmZycpLAorICAgICgnYWIqJywgJ3hhYnlhYmJieicsIFNVQ0NFRUQsICdmb3VuZCcsICdhYicpLAorICAgICgnYWIqJywgJ3hheWFiYmJ6JywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2EnKSwKKyAgICAoJyhhYnxjZCllJywgJ2FiY2RlJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdjZGUtY2QnKSwKKyAgICAoJ1thYmhnZWZkY11paicsICdoaWonLCBTVUNDRUVELCAnZm91bmQnLCAnaGlqJyksCisgICAgKCdeKGFifGNkKWUnLCAnYWJjZGUnLCBGQUlMLCAneGcxeScsICd4eScpLAorICAgICgnKGFiY3wpZWYnLCAnYWJjZGVmJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdlZi0nKSwKKyAgICAoJyhhfGIpYypkJywgJ2FiY2QnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2JjZC1iJyksCisgICAgKCcoYWJ8YWIqKWJjJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWJjLWEnKSwKKyAgICAoJ2EoW2JjXSopYyonLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYmMtYmMnKSwKKyAgICAoJ2EoW2JjXSopKGMqZCknLCAnYWJjZCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2FiY2QtYmMtZCcpLAorICAgICgnYShbYmNdKykoYypkKScsICdhYmNkJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnYWJjZC1iYy1kJyksCisgICAgKCdhKFtiY10qKShjK2QpJywgJ2FiY2QnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdhYmNkLWItY2QnKSwKKyAgICAoJ2FbYmNkXSpkY2RjZGUnLCAnYWRjZGNkZScsIFNVQ0NFRUQsICdmb3VuZCcsICdhZGNkY2RlJyksCisgICAgKCdhW2JjZF0rZGNkY2RlJywgJ2FkY2RjZGUnLCBGQUlMKSwKKyAgICAoJyhhYnxhKWIqYycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiYy1hYicpLAorICAgICgnKChhKShiKWMpKGQpJywgJ2FiY2QnLCBTVUNDRUVELCAnZzErIi0iK2cyKyItIitnMysiLSIrZzQnLCAnYWJjLWEtYi1kJyksCisgICAgKCdbYS16QS1aX11bYS16QS1aMC05X10qJywgJ2FscGhhJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FscGhhJyksCisgICAgKCdeYShiYyt8YltlaF0pZ3wuaCQnLCAnYWJoJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdiaC1Ob25lJyksCisgICAgKCcoYmMrZCR8ZWYqZy58aD9pKGp8aykpJywgJ2VmZmd6JywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnZWZmZ3otZWZmZ3otTm9uZScpLAorICAgICgnKGJjK2QkfGVmKmcufGg/aShqfGspKScsICdpaicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2lqLWlqLWonKSwKKyAgICAoJyhiYytkJHxlZipnLnxoP2koanxrKSknLCAnZWZmZycsIEZBSUwpLAorICAgICgnKGJjK2QkfGVmKmcufGg/aShqfGspKScsICdiY2RkJywgRkFJTCksCisgICAgKCcoYmMrZCR8ZWYqZy58aD9pKGp8aykpJywgJ3JlZmZneicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2VmZmd6LWVmZmd6LU5vbmUnKSwKKyAgICAoJygoKCgoKCgoKGEpKSkpKSkpKSknLCAnYScsIFNVQ0NFRUQsICdmb3VuZCcsICdhJyksCisgICAgKCdtdWx0aXBsZSB3b3JkcyBvZiB0ZXh0JywgJ3VoLXVoJywgRkFJTCksCisgICAgKCdtdWx0aXBsZSB3b3JkcycsICdtdWx0aXBsZSB3b3JkcywgeWVhaCcsIFNVQ0NFRUQsICdmb3VuZCcsICdtdWx0aXBsZSB3b3JkcycpLAorICAgICgnKC4qKWMoLiopJywgJ2FiY2RlJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnYWJjZGUtYWItZGUnKSwKKyAgICAoJ1xcKCguKiksICguKilcXCknLCAnKGEsIGIpJywgU1VDQ0VFRCwgJ2cyKyItIitnMScsICdiLWEnKSwKKyAgICAoJ1trXScsICdhYicsIEZBSUwpLAorICAgICgnYVstXT9jJywgJ2FjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FjJyksCisgICAgKCcoYWJjKVxcMScsICdhYmNhYmMnLCBTVUNDRUVELCAnZzEnLCAnYWJjJyksCisgICAgKCcoW2EtY10qKVxcMScsICdhYmNhYmMnLCBTVUNDRUVELCAnZzEnLCAnYWJjJyksCisgICAgKCdeKC4rKT9CJywgJ0FCJywgU1VDQ0VFRCwgJ2cxJywgJ0EnKSwKKyAgICAoJyhhKykuXFwxJCcsICdhYWFhYScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWFhYWEtYWEnKSwKKyAgICAoJ14oYSspLlxcMSQnLCAnYWFhYScsIEZBSUwpLAorICAgICgnKGFiYylcXDEnLCAnYWJjYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYmNhYmMtYWJjJyksCisgICAgKCcoW2EtY10rKVxcMScsICdhYmNhYmMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiY2FiYy1hYmMnKSwKKyAgICAoJyhhKVxcMScsICdhYScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWEtYScpLAorICAgICgnKGErKVxcMScsICdhYScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWEtYScpLAorICAgICgnKGErKStcXDEnLCAnYWEnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FhLWEnKSwKKyAgICAoJyhhKS4rXFwxJywgJ2FiYScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWJhLWEnKSwKKyAgICAoJyhhKWJhKlxcMScsICdhYmEnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiYS1hJyksCisgICAgKCcoYWF8YSlhXFwxJCcsICdhYWEnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FhYS1hJyksCisgICAgKCcoYXxhYSlhXFwxJCcsICdhYWEnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FhYS1hJyksCisgICAgKCcoYSspYVxcMSQnLCAnYWFhJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYWEtYScpLAorICAgICgnKFthYmNdKilcXDEnLCAnYWJjYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYmNhYmMtYWJjJyksCisgICAgKCcoYSkoYiljfGFiJywgJ2FiJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnYWItTm9uZS1Ob25lJyksCisgICAgKCcoYSkreCcsICdhYWF4JywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYWF4LWEnKSwKKyAgICAoJyhbYWNdKSt4JywgJ2FhY3gnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FhY3gtYycpLAorICAgICgnKFteL10qLykqc3ViMS8nLCAnZDptc2dzL3RkaXIvc3ViMS90cmlhbC9hd2F5LmNwcCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnZDptc2dzL3RkaXIvc3ViMS8tdGRpci8nKSwKKyAgICAoJyhbXi5dKilcXC4oW146XSopOltUIF0rKC4qKScsICd0cmFjazEudGl0bGU6VEJsYWggYmxhaCBibGFoJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzIrIi0iK2czJywgJ3RyYWNrMS50aXRsZTpUQmxhaCBibGFoIGJsYWgtdHJhY2sxLXRpdGxlLUJsYWggYmxhaCBibGFoJyksCisgICAgKCcoW15OXSpOKSsnLCAnYWJOTnh5ek4nLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiTk54eXpOLXh5ek4nKSwKKyAgICAoJyhbXk5dKk4pKycsICdhYk5OeHl6JywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYk5OLU4nKSwKKyAgICAoJyhbYWJjXSopeCcsICdhYmN4JywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYmN4LWFiYycpLAorICAgICgnKFthYmNdKil4JywgJ2FiYycsIEZBSUwpLAorICAgICgnKFt4eXpdKil4JywgJ2FiY3gnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ3gtJyksCisgICAgKCcoYSkrYnxhYWMnLCAnYWFjJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYWMtTm9uZScpLAorCisgICAgIyBUZXN0IHN5bWJvbGljIGdyb3VwcworCisgICAgKCcoP1A8aSBkPmFhYSlhJywgJ2FhYWEnLCBTWU5UQVhfRVJST1IpLAorICAgICgnKD9QPGlkPmFhYSlhJywgJ2FhYWEnLCBTVUNDRUVELCAnZm91bmQrIi0iK2lkJywgJ2FhYWEtYWFhJyksCisgICAgKCcoP1A8aWQ+YWEpKD9QPWlkKScsICdhYWFhJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitpZCcsICdhYWFhLWFhJyksCisgICAgKCcoP1A8aWQ+YWEpKD9QPXhkKScsICdhYWFhJywgU1lOVEFYX0VSUk9SKSwKKworICAgICMgVGVzdCBvY3RhbCBlc2NhcGVzL21lbW9yeSByZWZlcmVuY2VzCisKKyAgICAoJ1xcMScsICdhJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJ1xcMDknLCBjaHIoMCkgKyAnOScsIFNVQ0NFRUQsICdmb3VuZCcsIGNocigwKSArICc5JyksCisgICAgKCdcXDE0MScsICdhJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2EnKSwKKyAgICAoJyhhKShiKShjKShkKShlKShmKShnKShoKShpKShqKShrKShsKVxcMTE5JywgJ2FiY2RlZmdoaWprbGs5JywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMTEnLCAnYWJjZGVmZ2hpamtsazktaycpLAorCisgICAgIyBBbGwgdGVzdHMgZnJvbSBQZXJsCisKKyAgICAoJ2FiYycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYmMnLCAneGJjJywgRkFJTCksCisgICAgKCdhYmMnLCAnYXhjJywgRkFJTCksCisgICAgKCdhYmMnLCAnYWJ4JywgRkFJTCksCisgICAgKCdhYmMnLCAneGFiY3knLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYmMnLCAnYWJhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYipjJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ2FiKmJjJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ2FiKmJjJywgJ2FiYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJiYycpLAorICAgICgnYWIqYmMnLCAnYWJiYmJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYmJiYycpLAorICAgICgnYWJ7MCx9YmMnLCAnYWJiYmJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYmJiYycpLAorICAgICgnYWIrYmMnLCAnYWJiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmJjJyksCisgICAgKCdhYitiYycsICdhYmMnLCBGQUlMKSwKKyAgICAoJ2FiK2JjJywgJ2FicScsIEZBSUwpLAorICAgICgnYWJ7MSx9YmMnLCAnYWJxJywgRkFJTCksCisgICAgKCdhYitiYycsICdhYmJiYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJiYmJjJyksCisgICAgKCdhYnsxLH1iYycsICdhYmJiYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJiYmJjJyksCisgICAgKCdhYnsxLDN9YmMnLCAnYWJiYmJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYmJiYycpLAorICAgICgnYWJ7Myw0fWJjJywgJ2FiYmJiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmJiYmMnKSwKKyAgICAoJ2FiezQsNX1iYycsICdhYmJiYmMnLCBGQUlMKSwKKyAgICAoJ2FiP2JjJywgJ2FiYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJiYycpLAorICAgICgnYWI/YmMnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnYWJ7MCwxfWJjJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ2FiP2JjJywgJ2FiYmJiYycsIEZBSUwpLAorICAgICgnYWI/YycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYnswLDF9YycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdeYWJjJCcsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdeYWJjJCcsICdhYmNjJywgRkFJTCksCisgICAgKCdeYWJjJywgJ2FiY2MnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdeYWJjJCcsICdhYWJjJywgRkFJTCksCisgICAgKCdhYmMkJywgJ2FhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdeJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICcnKSwKKyAgICAoJyQnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJycpLAorICAgICgnYS5jJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ2EuYycsICdheGMnLCBTVUNDRUVELCAnZm91bmQnLCAnYXhjJyksCisgICAgKCdhLipjJywgJ2F4eXpjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2F4eXpjJyksCisgICAgKCdhLipjJywgJ2F4eXpkJywgRkFJTCksCisgICAgKCdhW2JjXWQnLCAnYWJjJywgRkFJTCksCisgICAgKCdhW2JjXWQnLCAnYWJkJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiZCcpLAorICAgICgnYVtiLWRdZScsICdhYmQnLCBGQUlMKSwKKyAgICAoJ2FbYi1kXWUnLCAnYWNlJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FjZScpLAorICAgICgnYVtiLWRdJywgJ2FhYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYycpLAorICAgICgnYVstYl0nLCAnYS0nLCBTVUNDRUVELCAnZm91bmQnLCAnYS0nKSwKKyAgICAoJ2FbYi1dJywgJ2EtJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2EtJyksCisgICAgKCdhW2ItYV0nLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCdhW11iJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnYVsnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCdhXScsICdhXScsIFNVQ0NFRUQsICdmb3VuZCcsICdhXScpLAorICAgICgnYVtdXWInLCAnYV1iJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FdYicpLAorICAgICgnYVteYmNdZCcsICdhZWQnLCBTVUNDRUVELCAnZm91bmQnLCAnYWVkJyksCisgICAgKCdhW15iY11kJywgJ2FiZCcsIEZBSUwpLAorICAgICgnYVteLWJdYycsICdhZGMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWRjJyksCisgICAgKCdhW14tYl1jJywgJ2EtYycsIEZBSUwpLAorICAgICgnYVteXWJdYycsICdhXWMnLCBGQUlMKSwKKyAgICAoJ2FbXl1iXWMnLCAnYWRjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FkYycpLAorICAgICgnYWJ8Y2QnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiJyksCisgICAgKCdhYnxjZCcsICdhYmNkJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiJyksCisgICAgKCcoKWVmJywgJ2RlZicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnZWYtJyksCisgICAgKCcqYScsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJygqKWInLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCckYicsICdiJywgRkFJTCksCisgICAgKCdhXFwnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCdhXFwoYicsICdhKGInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2EoYi1FcnJvcicpLAorICAgICgnYVxcKCpiJywgJ2FiJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiJyksCisgICAgKCdhXFwoKmInLCAnYSgoYicsIFNVQ0NFRUQsICdmb3VuZCcsICdhKChiJyksCisgICAgKCdhXFxcXGInLCAnYVxcYicsIFNVQ0NFRUQsICdmb3VuZCcsICdhXFxiJyksCisgICAgKCdhYmMpJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnKGFiYycsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJygoYSkpJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2EtYS1hJyksCisgICAgKCcoYSliKGMpJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2FiYy1hLWMnKSwKKyAgICAoJ2ErYitjJywgJ2FhYmJhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhezEsfWJ7MSx9YycsICdhYWJiYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnYSoqJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnYS4rP2MnLCAnYWJjYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnKGErfGIpKicsICdhYicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWItYicpLAorICAgICgnKGErfGIpezAsfScsICdhYicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWItYicpLAorICAgICgnKGErfGIpKycsICdhYicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWItYicpLAorICAgICgnKGErfGIpezEsfScsICdhYicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWItYicpLAorICAgICgnKGErfGIpPycsICdhYicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYS1hJyksCisgICAgKCcoYSt8Yil7MCwxfScsICdhYicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYS1hJyksCisgICAgKCcpKCcsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJ1teYWJdKicsICdjZGUnLCBTVUNDRUVELCAnZm91bmQnLCAnY2RlJyksCisgICAgKCdhYmMnLCAnJywgRkFJTCksCisgICAgKCdhKicsICcnLCBTVUNDRUVELCAnZm91bmQnLCAnJyksCisgICAgKCcoW2FiY10pKmQnLCAnYWJiYmNkJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYmJiY2QtYycpLAorICAgICgnKFthYmNdKSpiY2QnLCAnYWJjZCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWJjZC1hJyksCisgICAgKCdhfGJ8Y3xkfGUnLCAnZScsIFNVQ0NFRUQsICdmb3VuZCcsICdlJyksCisgICAgKCcoYXxifGN8ZHxlKWYnLCAnZWYnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2VmLWUnKSwKKyAgICAoJ2FiY2QqZWZnJywgJ2FiY2RlZmcnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjZGVmZycpLAorICAgICgnYWIqJywgJ3hhYnlhYmJieicsIFNVQ0NFRUQsICdmb3VuZCcsICdhYicpLAorICAgICgnYWIqJywgJ3hheWFiYmJ6JywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2EnKSwKKyAgICAoJyhhYnxjZCllJywgJ2FiY2RlJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdjZGUtY2QnKSwKKyAgICAoJ1thYmhnZWZkY11paicsICdoaWonLCBTVUNDRUVELCAnZm91bmQnLCAnaGlqJyksCisgICAgKCdeKGFifGNkKWUnLCAnYWJjZGUnLCBGQUlMKSwKKyAgICAoJyhhYmN8KWVmJywgJ2FiY2RlZicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnZWYtJyksCisgICAgKCcoYXxiKWMqZCcsICdhYmNkJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdiY2QtYicpLAorICAgICgnKGFifGFiKiliYycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiYy1hJyksCisgICAgKCdhKFtiY10qKWMqJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWJjLWJjJyksCisgICAgKCdhKFtiY10qKShjKmQpJywgJ2FiY2QnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdhYmNkLWJjLWQnKSwKKyAgICAoJ2EoW2JjXSspKGMqZCknLCAnYWJjZCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2FiY2QtYmMtZCcpLAorICAgICgnYShbYmNdKikoYytkKScsICdhYmNkJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnYWJjZC1iLWNkJyksCisgICAgKCdhW2JjZF0qZGNkY2RlJywgJ2FkY2RjZGUnLCBTVUNDRUVELCAnZm91bmQnLCAnYWRjZGNkZScpLAorICAgICgnYVtiY2RdK2RjZGNkZScsICdhZGNkY2RlJywgRkFJTCksCisgICAgKCcoYWJ8YSliKmMnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYmMtYWInKSwKKyAgICAoJygoYSkoYiljKShkKScsICdhYmNkJywgU1VDQ0VFRCwgJ2cxKyItIitnMisiLSIrZzMrIi0iK2c0JywgJ2FiYy1hLWItZCcpLAorICAgICgnW2EtekEtWl9dW2EtekEtWjAtOV9dKicsICdhbHBoYScsIFNVQ0NFRUQsICdmb3VuZCcsICdhbHBoYScpLAorICAgICgnXmEoYmMrfGJbZWhdKWd8LmgkJywgJ2FiaCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYmgtTm9uZScpLAorICAgICgnKGJjK2QkfGVmKmcufGg/aShqfGspKScsICdlZmZneicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2VmZmd6LWVmZmd6LU5vbmUnKSwKKyAgICAoJyhiYytkJHxlZipnLnxoP2koanxrKSknLCAnaWonLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdpai1pai1qJyksCisgICAgKCcoYmMrZCR8ZWYqZy58aD9pKGp8aykpJywgJ2VmZmcnLCBGQUlMKSwKKyAgICAoJyhiYytkJHxlZipnLnxoP2koanxrKSknLCAnYmNkZCcsIEZBSUwpLAorICAgICgnKGJjK2QkfGVmKmcufGg/aShqfGspKScsICdyZWZmZ3onLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdlZmZnei1lZmZnei1Ob25lJyksCisgICAgKCcoKCgoKCgoKCgoYSkpKSkpKSkpKSknLCAnYScsIFNVQ0NFRUQsICdnMTAnLCAnYScpLAorICAgICgnKCgoKCgoKCgoKGEpKSkpKSkpKSkpXFwxMCcsICdhYScsIFNVQ0NFRUQsICdmb3VuZCcsICdhYScpLAorIyBQeXRob24gZG9lcyBub3QgaGF2ZSB0aGUgc2FtZSBydWxlcyBmb3IgXFw0MSBzbyB0aGlzIGlzIGEgc3ludGF4IGVycm9yCisjICAgICgnKCgoKCgoKCgoKGEpKSkpKSkpKSkpXFw0MScsICdhYScsIEZBSUwpLAorIyAgICAoJygoKCgoKCgoKChhKSkpKSkpKSkpKVxcNDEnLCAnYSEnLCBTVUNDRUVELCAnZm91bmQnLCAnYSEnKSwKKyAgICAoJygoKCgoKCgoKChhKSkpKSkpKSkpKVxcNDEnLCAnJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJyg/aSkoKCgoKCgoKCgoYSkpKSkpKSkpKSlcXDQxJywgJycsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoKCgoKCgoKChhKSkpKSkpKSkpJywgJ2EnLCBTVUNDRUVELCAnZm91bmQnLCAnYScpLAorICAgICgnbXVsdGlwbGUgd29yZHMgb2YgdGV4dCcsICd1aC11aCcsIEZBSUwpLAorICAgICgnbXVsdGlwbGUgd29yZHMnLCAnbXVsdGlwbGUgd29yZHMsIHllYWgnLCBTVUNDRUVELCAnZm91bmQnLCAnbXVsdGlwbGUgd29yZHMnKSwKKyAgICAoJyguKiljKC4qKScsICdhYmNkZScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2FiY2RlLWFiLWRlJyksCisgICAgKCdcXCgoLiopLCAoLiopXFwpJywgJyhhLCBiKScsIFNVQ0NFRUQsICdnMisiLSIrZzEnLCAnYi1hJyksCisgICAgKCdba10nLCAnYWInLCBGQUlMKSwKKyAgICAoJ2FbLV0/YycsICdhYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYycpLAorICAgICgnKGFiYylcXDEnLCAnYWJjYWJjJywgU1VDQ0VFRCwgJ2cxJywgJ2FiYycpLAorICAgICgnKFthLWNdKilcXDEnLCAnYWJjYWJjJywgU1VDQ0VFRCwgJ2cxJywgJ2FiYycpLAorICAgICgnKD9pKWFiYycsICdBQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJDJyksCisgICAgKCcoP2kpYWJjJywgJ1hCQycsIEZBSUwpLAorICAgICgnKD9pKWFiYycsICdBWEMnLCBGQUlMKSwKKyAgICAoJyg/aSlhYmMnLCAnQUJYJywgRkFJTCksCisgICAgKCcoP2kpYWJjJywgJ1hBQkNZJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQycpLAorICAgICgnKD9pKWFiYycsICdBQkFCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkMnKSwKKyAgICAoJyg/aSlhYipjJywgJ0FCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkMnKSwKKyAgICAoJyg/aSlhYipiYycsICdBQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJDJyksCisgICAgKCcoP2kpYWIqYmMnLCAnQUJCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkJDJyksCisgICAgKCcoP2kpYWIqP2JjJywgJ0FCQkJCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkJCQkMnKSwKKyAgICAoJyg/aSlhYnswLH0/YmMnLCAnQUJCQkJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQkJCQycpLAorICAgICgnKD9pKWFiKz9iYycsICdBQkJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQkMnKSwKKyAgICAoJyg/aSlhYitiYycsICdBQkMnLCBGQUlMKSwKKyAgICAoJyg/aSlhYitiYycsICdBQlEnLCBGQUlMKSwKKyAgICAoJyg/aSlhYnsxLH1iYycsICdBQlEnLCBGQUlMKSwKKyAgICAoJyg/aSlhYitiYycsICdBQkJCQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJCQkJDJyksCisgICAgKCcoP2kpYWJ7MSx9P2JjJywgJ0FCQkJCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkJCQkMnKSwKKyAgICAoJyg/aSlhYnsxLDN9P2JjJywgJ0FCQkJCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkJCQkMnKSwKKyAgICAoJyg/aSlhYnszLDR9P2JjJywgJ0FCQkJCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkJCQkMnKSwKKyAgICAoJyg/aSlhYns0LDV9P2JjJywgJ0FCQkJCQycsIEZBSUwpLAorICAgICgnKD9pKWFiPz9iYycsICdBQkJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQkMnKSwKKyAgICAoJyg/aSlhYj8/YmMnLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQycpLAorICAgICgnKD9pKWFiezAsMX0/YmMnLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQycpLAorICAgICgnKD9pKWFiPz9iYycsICdBQkJCQkMnLCBGQUlMKSwKKyAgICAoJyg/aSlhYj8/YycsICdBQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJDJyksCisgICAgKCcoP2kpYWJ7MCwxfT9jJywgJ0FCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkMnKSwKKyAgICAoJyg/aSleYWJjJCcsICdBQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJDJyksCisgICAgKCcoP2kpXmFiYyQnLCAnQUJDQycsIEZBSUwpLAorICAgICgnKD9pKV5hYmMnLCAnQUJDQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkMnKSwKKyAgICAoJyg/aSleYWJjJCcsICdBQUJDJywgRkFJTCksCisgICAgKCcoP2kpYWJjJCcsICdBQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQycpLAorICAgICgnKD9pKV4nLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJycpLAorICAgICgnKD9pKSQnLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJycpLAorICAgICgnKD9pKWEuYycsICdBQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJDJyksCisgICAgKCcoP2kpYS5jJywgJ0FYQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBWEMnKSwKKyAgICAoJyg/aSlhLio/YycsICdBWFlaQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBWFlaQycpLAorICAgICgnKD9pKWEuKmMnLCAnQVhZWkQnLCBGQUlMKSwKKyAgICAoJyg/aSlhW2JjXWQnLCAnQUJDJywgRkFJTCksCisgICAgKCcoP2kpYVtiY11kJywgJ0FCRCcsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkQnKSwKKyAgICAoJyg/aSlhW2ItZF1lJywgJ0FCRCcsIEZBSUwpLAorICAgICgnKD9pKWFbYi1kXWUnLCAnQUNFJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FDRScpLAorICAgICgnKD9pKWFbYi1kXScsICdBQUMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUMnKSwKKyAgICAoJyg/aSlhWy1iXScsICdBLScsIFNVQ0NFRUQsICdmb3VuZCcsICdBLScpLAorICAgICgnKD9pKWFbYi1dJywgJ0EtJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0EtJyksCisgICAgKCcoP2kpYVtiLWFdJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnKD9pKWFbXWInLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoP2kpYVsnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoP2kpYV0nLCAnQV0nLCBTVUNDRUVELCAnZm91bmQnLCAnQV0nKSwKKyAgICAoJyg/aSlhW11dYicsICdBXUInLCBTVUNDRUVELCAnZm91bmQnLCAnQV1CJyksCisgICAgKCcoP2kpYVteYmNdZCcsICdBRUQnLCBTVUNDRUVELCAnZm91bmQnLCAnQUVEJyksCisgICAgKCcoP2kpYVteYmNdZCcsICdBQkQnLCBGQUlMKSwKKyAgICAoJyg/aSlhW14tYl1jJywgJ0FEQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBREMnKSwKKyAgICAoJyg/aSlhW14tYl1jJywgJ0EtQycsIEZBSUwpLAorICAgICgnKD9pKWFbXl1iXWMnLCAnQV1DJywgRkFJTCksCisgICAgKCcoP2kpYVteXWJdYycsICdBREMnLCBTVUNDRUVELCAnZm91bmQnLCAnQURDJyksCisgICAgKCcoP2kpYWJ8Y2QnLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCJyksCisgICAgKCcoP2kpYWJ8Y2QnLCAnQUJDRCcsIFNVQ0NFRUQsICdmb3VuZCcsICdBQicpLAorICAgICgnKD9pKSgpZWYnLCAnREVGJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdFRi0nKSwKKyAgICAoJyg/aSkqYScsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJyg/aSkoKiliJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnKD9pKSRiJywgJ0InLCBGQUlMKSwKKyAgICAoJyg/aSlhXFwnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoP2kpYVxcKGInLCAnQShCJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdBKEItRXJyb3InKSwKKyAgICAoJyg/aSlhXFwoKmInLCAnQUInLCBTVUNDRUVELCAnZm91bmQnLCAnQUInKSwKKyAgICAoJyg/aSlhXFwoKmInLCAnQSgoQicsIFNVQ0NFRUQsICdmb3VuZCcsICdBKChCJyksCisgICAgKCcoP2kpYVxcXFxiJywgJ0FcXEInLCBTVUNDRUVELCAnZm91bmQnLCAnQVxcQicpLAorICAgICgnKD9pKWFiYyknLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoP2kpKGFiYycsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJyg/aSkoKGEpKScsICdBQkMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdBLUEtQScpLAorICAgICgnKD9pKShhKWIoYyknLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnQUJDLUEtQycpLAorICAgICgnKD9pKWErYitjJywgJ0FBQkJBQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJDJyksCisgICAgKCcoP2kpYXsxLH1iezEsfWMnLCAnQUFCQkFCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkMnKSwKKyAgICAoJyg/aSlhKionLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoP2kpYS4rP2MnLCAnQUJDQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQycpLAorICAgICgnKD9pKWEuKj9jJywgJ0FCQ0FCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkMnKSwKKyAgICAoJyg/aSlhLnswLDV9P2MnLCAnQUJDQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQycpLAorICAgICgnKD9pKShhK3xiKSonLCAnQUInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0FCLUInKSwKKyAgICAoJyg/aSkoYSt8Yil7MCx9JywgJ0FCJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdBQi1CJyksCisgICAgKCcoP2kpKGErfGIpKycsICdBQicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnQUItQicpLAorICAgICgnKD9pKShhK3xiKXsxLH0nLCAnQUInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0FCLUInKSwKKyAgICAoJyg/aSkoYSt8Yik/JywgJ0FCJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdBLUEnKSwKKyAgICAoJyg/aSkoYSt8Yil7MCwxfScsICdBQicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnQS1BJyksCisgICAgKCcoP2kpKGErfGIpezAsMX0/JywgJ0FCJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICctTm9uZScpLAorICAgICgnKD9pKSkoJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnKD9pKVteYWJdKicsICdDREUnLCBTVUNDRUVELCAnZm91bmQnLCAnQ0RFJyksCisgICAgKCcoP2kpYWJjJywgJycsIEZBSUwpLAorICAgICgnKD9pKWEqJywgJycsIFNVQ0NFRUQsICdmb3VuZCcsICcnKSwKKyAgICAoJyg/aSkoW2FiY10pKmQnLCAnQUJCQkNEJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdBQkJCQ0QtQycpLAorICAgICgnKD9pKShbYWJjXSkqYmNkJywgJ0FCQ0QnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0FCQ0QtQScpLAorICAgICgnKD9pKWF8YnxjfGR8ZScsICdFJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0UnKSwKKyAgICAoJyg/aSkoYXxifGN8ZHxlKWYnLCAnRUYnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0VGLUUnKSwKKyAgICAoJyg/aSlhYmNkKmVmZycsICdBQkNERUZHJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQ0RFRkcnKSwKKyAgICAoJyg/aSlhYionLCAnWEFCWUFCQkJaJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCJyksCisgICAgKCcoP2kpYWIqJywgJ1hBWUFCQkJaJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0EnKSwKKyAgICAoJyg/aSkoYWJ8Y2QpZScsICdBQkNERScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnQ0RFLUNEJyksCisgICAgKCcoP2kpW2FiaGdlZmRjXWlqJywgJ0hJSicsIFNVQ0NFRUQsICdmb3VuZCcsICdISUonKSwKKyAgICAoJyg/aSleKGFifGNkKWUnLCAnQUJDREUnLCBGQUlMKSwKKyAgICAoJyg/aSkoYWJjfCllZicsICdBQkNERUYnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0VGLScpLAorICAgICgnKD9pKShhfGIpYypkJywgJ0FCQ0QnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0JDRC1CJyksCisgICAgKCcoP2kpKGFifGFiKiliYycsICdBQkMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0FCQy1BJyksCisgICAgKCcoP2kpYShbYmNdKiljKicsICdBQkMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0FCQy1CQycpLAorICAgICgnKD9pKWEoW2JjXSopKGMqZCknLCAnQUJDRCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ0FCQ0QtQkMtRCcpLAorICAgICgnKD9pKWEoW2JjXSspKGMqZCknLCAnQUJDRCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ0FCQ0QtQkMtRCcpLAorICAgICgnKD9pKWEoW2JjXSopKGMrZCknLCAnQUJDRCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ0FCQ0QtQi1DRCcpLAorICAgICgnKD9pKWFbYmNkXSpkY2RjZGUnLCAnQURDRENERScsIFNVQ0NFRUQsICdmb3VuZCcsICdBRENEQ0RFJyksCisgICAgKCcoP2kpYVtiY2RdK2RjZGNkZScsICdBRENEQ0RFJywgRkFJTCksCisgICAgKCcoP2kpKGFifGEpYipjJywgJ0FCQycsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnQUJDLUFCJyksCisgICAgKCcoP2kpKChhKShiKWMpKGQpJywgJ0FCQ0QnLCBTVUNDRUVELCAnZzErIi0iK2cyKyItIitnMysiLSIrZzQnLCAnQUJDLUEtQi1EJyksCisgICAgKCcoP2kpW2EtekEtWl9dW2EtekEtWjAtOV9dKicsICdBTFBIQScsIFNVQ0NFRUQsICdmb3VuZCcsICdBTFBIQScpLAorICAgICgnKD9pKV5hKGJjK3xiW2VoXSlnfC5oJCcsICdBQkgnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0JILU5vbmUnKSwKKyAgICAoJyg/aSkoYmMrZCR8ZWYqZy58aD9pKGp8aykpJywgJ0VGRkdaJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnRUZGR1otRUZGR1otTm9uZScpLAorICAgICgnKD9pKShiYytkJHxlZipnLnxoP2koanxrKSknLCAnSUonLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdJSi1JSi1KJyksCisgICAgKCcoP2kpKGJjK2QkfGVmKmcufGg/aShqfGspKScsICdFRkZHJywgRkFJTCksCisgICAgKCcoP2kpKGJjK2QkfGVmKmcufGg/aShqfGspKScsICdCQ0REJywgRkFJTCksCisgICAgKCcoP2kpKGJjK2QkfGVmKmcufGg/aShqfGspKScsICdSRUZGR1onLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdFRkZHWi1FRkZHWi1Ob25lJyksCisgICAgKCcoP2kpKCgoKCgoKCgoKGEpKSkpKSkpKSkpJywgJ0EnLCBTVUNDRUVELCAnZzEwJywgJ0EnKSwKKyAgICAoJyg/aSkoKCgoKCgoKCgoYSkpKSkpKSkpKSlcXDEwJywgJ0FBJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FBJyksCisgICAgIygnKD9pKSgoKCgoKCgoKChhKSkpKSkpKSkpKVxcNDEnLCAnQUEnLCBGQUlMKSwKKyAgICAjKCcoP2kpKCgoKCgoKCgoKGEpKSkpKSkpKSkpXFw0MScsICdBIScsIFNVQ0NFRUQsICdmb3VuZCcsICdBIScpLAorICAgICgnKD9pKSgoKCgoKCgoKGEpKSkpKSkpKSknLCAnQScsIFNVQ0NFRUQsICdmb3VuZCcsICdBJyksCisgICAgKCcoP2kpKD86KD86KD86KD86KD86KD86KD86KD86KD86KGEpKSkpKSkpKSkpJywgJ0EnLCBTVUNDRUVELCAnZzEnLCAnQScpLAorICAgICgnKD9pKSg/Oig/Oig/Oig/Oig/Oig/Oig/Oig/Oig/OihhfGJ8YykpKSkpKSkpKSknLCAnQycsIFNVQ0NFRUQsICdnMScsICdDJyksCisgICAgKCcoP2kpbXVsdGlwbGUgd29yZHMgb2YgdGV4dCcsICdVSC1VSCcsIEZBSUwpLAorICAgICgnKD9pKW11bHRpcGxlIHdvcmRzJywgJ01VTFRJUExFIFdPUkRTLCBZRUFIJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ01VTFRJUExFIFdPUkRTJyksCisgICAgKCcoP2kpKC4qKWMoLiopJywgJ0FCQ0RFJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnQUJDREUtQUItREUnKSwKKyAgICAoJyg/aSlcXCgoLiopLCAoLiopXFwpJywgJyhBLCBCKScsIFNVQ0NFRUQsICdnMisiLSIrZzEnLCAnQi1BJyksCisgICAgKCcoP2kpW2tdJywgJ0FCJywgRkFJTCksCisjICAgICgnKD9pKWFiY2QnLCAnQUJDRCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrXFxmb3VuZCsiLSIrXFxcXGZvdW5kJywgJ0FCQ0QtJCYtXFxBQkNEJyksCisjICAgICgnKD9pKWEoYmMpZCcsICdBQkNEJywgU1VDQ0VFRCwgJ2cxKyItIitcXGcxKyItIitcXFxcZzEnLCAnQkMtJDEtXFxCQycpLAorICAgICgnKD9pKWFbLV0/YycsICdBQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQycpLAorICAgICgnKD9pKShhYmMpXFwxJywgJ0FCQ0FCQycsIFNVQ0NFRUQsICdnMScsICdBQkMnKSwKKyAgICAoJyg/aSkoW2EtY10qKVxcMScsICdBQkNBQkMnLCBTVUNDRUVELCAnZzEnLCAnQUJDJyksCisgICAgKCdhKD8hYikuJywgJ2FiYWQnLCBTVUNDRUVELCAnZm91bmQnLCAnYWQnKSwKKyAgICAoJ2EoPz1kKS4nLCAnYWJhZCcsIFNVQ0NFRUQsICdmb3VuZCcsICdhZCcpLAorICAgICgnYSg/PWN8ZCkuJywgJ2FiYWQnLCBTVUNDRUVELCAnZm91bmQnLCAnYWQnKSwKKyAgICAoJ2EoPzpifGN8ZCkoLiknLCAnYWNlJywgU1VDQ0VFRCwgJ2cxJywgJ2UnKSwKKyAgICAoJ2EoPzpifGN8ZCkqKC4pJywgJ2FjZScsIFNVQ0NFRUQsICdnMScsICdlJyksCisgICAgKCdhKD86YnxjfGQpKz8oLiknLCAnYWNlJywgU1VDQ0VFRCwgJ2cxJywgJ2UnKSwKKyAgICAoJ2EoPzpifChjfGUpezEsMn0/fGQpKz8oLiknLCAnYWNlJywgU1VDQ0VFRCwgJ2cxICsgZzInLCAnY2UnKSwKKyAgICAoJ14oLispP0InLCAnQUInLCBTVUNDRUVELCAnZzEnLCAnQScpLAorCisgICAgIyBsb29rYmVoaW5kOiBzcGxpdCBieSA6IGJ1dCBub3QgaWYgaXQgaXMgZXNjYXBlZCBieSAtLgorICAgICgnKD88IS0pOiguKj8pKD88IS0pOicsICdhOmJjLTpkZTpmJywgU1VDQ0VFRCwgJ2cxJywgJ2JjLTpkZScgKSwKKyAgICAjIGVzY2FwaW5nIHdpdGggXCBhcyB3ZSBrbm93IGl0CisgICAgKCcoPzwhXFxcKTooLio/KSg/PCFcXFwpOicsICdhOmJjXFw6ZGU6ZicsIFNVQ0NFRUQsICdnMScsICdiY1xcOmRlJyApLAorICAgICMgdGVybWluYXRpbmcgd2l0aCAnIGFuZCBlc2NhcGluZyB3aXRoID8gYXMgaW4gZWRpZmFjdAorICAgICgiKD88IVxcPyknKC4qPykoPzwhXFw/KSciLCAiYSdiYz8nZGUnZiIsIFNVQ0NFRUQsICdnMScsICJiYz8nZGUiICksCisKKyAgICAjIENvbW1lbnRzIHVzaW5nIHRoZSAoPyMuLi4pIHN5bnRheAorCisgICAgKCd3KD8jIGNvbW1lbnQnLCAndycsIFNZTlRBWF9FUlJPUiksCisgICAgKCd3KD8jIGNvbW1lbnQgMSl4eSg/IyBjb21tZW50IDIpeicsICd3eHl6JywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ3d4eXonKSwKKworICAgICMgQ2hlY2sgb2RkIHBsYWNlbWVudCBvZiBlbWJlZGRlZCBwYXR0ZXJuIG1vZGlmaWVycworCisgICAgIyBub3QgYW4gZXJyb3IgdW5kZXIgUENSRS9QUkU6CisgICAgKCd3KD9pKScsICdXJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ1cnKSwKKyAgICAjICgndyg/aSknLCAnVycsIFNZTlRBWF9FUlJPUiksCisKKyAgICAjIENvbW1lbnRzIHVzaW5nIHRoZSB4IGVtYmVkZGVkIHBhdHRlcm4gbW9kaWZpZXIKKworICAgICgiIiIoP3gpdyMgY29tbWVudCAxCisgICAgICAgIHggeQorICAgICAgICAjIGNvbW1lbnQgMgorICAgICAgICB6IiIiLCAnd3h5eicsIFNVQ0NFRUQsICdmb3VuZCcsICd3eHl6JyksCisKKyAgICAjIHVzaW5nIHRoZSBtIGVtYmVkZGVkIHBhdHRlcm4gbW9kaWZpZXIKKworICAgICgnXmFiYycsICIiImprbAorYWJjCit4eXoiIiIsIEZBSUwpLAorICAgICgnKD9tKV5hYmMnLCAiIiJqa2wKK2FiYworeHl6IiIiLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisKKyAgICAoJyg/bSlhYmMkJywgIiIiamtsCit4eXphYmMKKzEyMyIiIiwgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorCisgICAgIyB1c2luZyB0aGUgcyBlbWJlZGRlZCBwYXR0ZXJuIG1vZGlmaWVyCisKKyAgICAoJ2EuYicsICdhXG5iJywgRkFJTCksCisgICAgKCcoP3MpYS5iJywgJ2FcbmInLCBTVUNDRUVELCAnZm91bmQnLCAnYVxuYicpLAorCisgICAgIyB0ZXN0IFx3LCBldGMuIGJvdGggaW5zaWRlIGFuZCBvdXRzaWRlIGNoYXJhY3RlciBjbGFzc2VzCisKKyAgICAoJ1xcdysnLCAnLS1hYl9jZDAxMjMtLScsIFNVQ0NFRUQsICdmb3VuZCcsICdhYl9jZDAxMjMnKSwKKyAgICAoJ1tcXHddKycsICctLWFiX2NkMDEyMy0tJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiX2NkMDEyMycpLAorICAgICgnXFxEKycsICcxMjM0YWJjNTY3OCcsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ1tcXERdKycsICcxMjM0YWJjNTY3OCcsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ1tcXGRhLWZBLUZdKycsICcxMjNhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnMTIzYWJjJyksCisgICAgIyBub3QgYW4gZXJyb3IgdW5kZXIgUENSRS9QUkU6CisgICAgIyAoJ1tcXGQteF0nLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKHInKFtcc10qKShbXFNdKikoW1xzXSopJywgJyB0ZXN0aW5nITE5NzInLCBTVUNDRUVELCAnZzMrZzIrZzEnLCAndGVzdGluZyExOTcyICcpLAorICAgIChyJyhccyopKFxTKikoXHMqKScsICcgdGVzdGluZyExOTcyJywgU1VDQ0VFRCwgJ2czK2cyK2cxJywgJ3Rlc3RpbmchMTk3MiAnKSwKKworICAgIChyJ1x4ZmYnLCAnXDM3NycsIFNVQ0NFRUQsICdmb3VuZCcsIGNocigyNTUpKSwKKyAgICAjIG5ldyBceCBzZW1hbnRpY3MKKyAgICAocidceDAwZmYnLCAnXDM3NycsIEZBSUwpLAorICAgICMgKHInXHgwMGZmJywgJ1wzNzcnLCBTVUNDRUVELCAnZm91bmQnLCBjaHIoMjU1KSksCisgICAgKHInXHRcblx2XHJcZlxhXGcnLCAnXHRcblx2XHJcZlxhZycsIFNVQ0NFRUQsICdmb3VuZCcsICdcdFxuXHZcclxmXGFnJyksCisgICAgKCdcdFxuXHZcclxmXGFcZycsICdcdFxuXHZcclxmXGFnJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ1x0XG5cdlxyXGZcYWcnKSwKKyAgICAocidcdFxuXHZcclxmXGEnLCAnXHRcblx2XHJcZlxhJywgU1VDQ0VFRCwgJ2ZvdW5kJywgY2hyKDkpK2NocigxMCkrY2hyKDExKStjaHIoMTMpK2NocigxMikrY2hyKDcpKSwKKyAgICAocidbXHRdW1xuXVtcdl1bXHJdW1xmXVtcYl0nLCAnXHRcblx2XHJcZlxiJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ1x0XG5cdlxyXGZcYicpLAorCisgICAgIworICAgICMgcG9zdC0xLjUuMiBhZGRpdGlvbnMKKworICAgICMgeG1sbGliIHByb2JsZW0KKyAgICAocicoKFthLXpdKyk6KT8oW2Etel0rKSQnLCAnc21pbCcsIFNVQ0NFRUQsICdnMSsiLSIrZzIrIi0iK2czJywgJ05vbmUtTm9uZS1zbWlsJyksCisgICAgIyBidWcgMTEwODY2OiByZWZlcmVuY2UgdG8gdW5kZWZpbmVkIGdyb3VwCisgICAgKHInKCguKVwxKyknLCAnJywgU1lOVEFYX0VSUk9SKSwKKyAgICAjIGJ1ZyAxMTE4Njk6IHNlYXJjaCAoUFJFL1BDUkUgZmFpbHMgb24gdGhpcyBvbmUsIFNSRSBkb2Vzbid0KQorICAgIChyJy4qZCcsICdhYmNcbmFiZCcsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmQnKSwKKyAgICAjIGJ1ZyAxMTI0Njg6IHZhcmlvdXMgZXhwZWN0ZWQgc3ludGF4IGVycm9ycworICAgIChyJygnLCAnJywgU1lOVEFYX0VSUk9SKSwKKyAgICAocidbXDQxXScsICchJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJyEnKSwKKyAgICAjIGJ1ZyAxMTQwMzM6IG5vdGhpbmcgdG8gcmVwZWF0CisgICAgKHInKHg/KT8nLCAneCcsIFNVQ0NFRUQsICdmb3VuZCcsICd4JyksCisgICAgIyBidWcgMTE1MDQwOiByZXNjYW4gaWYgZmxhZ3MgYXJlIG1vZGlmaWVkIGluc2lkZSBwYXR0ZXJuCisgICAgKHInICg/eClmb28gJywgJ2ZvbycsIFNVQ0NFRUQsICdmb3VuZCcsICdmb28nKSwKKyAgICAjIGJ1ZyAxMTU2MTg6IG5lZ2F0aXZlIGxvb2thaGVhZAorICAgIChyJyg/PCFhYmMpKGQuZiknLCAnYWJjZGVmZG9mJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2RvZicpLAorICAgICMgYnVnIDExNjI1MTogY2hhcmFjdGVyIGNsYXNzIGJ1ZworICAgIChyJ1tcdy1dKycsICdsYXNlcl9iZWFtJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2xhc2VyX2JlYW0nKSwKKyAgICAjIGJ1ZyAxMjM3NjkrMTI3MjU5OiBub24tZ3JlZWR5IGJhY2t0cmFja2luZyBidWcKKyAgICAocicuKj9cUyAqOicsICd4eDonLCBTVUNDRUVELCAnZm91bmQnLCAneHg6JyksCisgICAgKHInYVsgXSo/XCAoXGQrKS4qJywgJ2EgICAxMCcsIFNVQ0NFRUQsICdmb3VuZCcsICdhICAgMTAnKSwKKyAgICAocidhWyBdKj9cIChcZCspLionLCAnYSAgICAxMCcsIFNVQ0NFRUQsICdmb3VuZCcsICdhICAgIDEwJyksCisgICAgIyBidWcgMTI3MjU5OiBcWiBzaG91bGRuJ3QgZGVwZW5kIG9uIG11bHRpbGluZSBtb2RlCisgICAgKHInKD9tcykuKj94XHMqXFooLiopJywneHhcbnhcbicsIFNVQ0NFRUQsICdnMScsICcnKSwKKyAgICAjIGJ1ZyAxMjg4OTk6IHVwcGVyY2FzZSBsaXRlcmFscyB1bmRlciB0aGUgaWdub3JlY2FzZSBmbGFnCisgICAgKHInKD9pKU0rJywgJ01NTScsIFNVQ0NFRUQsICdmb3VuZCcsICdNTU0nKSwKKyAgICAocicoP2kpbSsnLCAnTU1NJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ01NTScpLAorICAgIChyJyg/aSlbTV0rJywgJ01NTScsIFNVQ0NFRUQsICdmb3VuZCcsICdNTU0nKSwKKyAgICAocicoP2kpW21dKycsICdNTU0nLCBTVUNDRUVELCAnZm91bmQnLCAnTU1NJyksCisgICAgIyBidWcgMTMwNzQ4OiBeKiBzaG91bGQgYmUgYW4gZXJyb3IgKG5vdGhpbmcgdG8gcmVwZWF0KQorICAgIChyJ14qJywgJycsIFNZTlRBWF9FUlJPUiksCisgICAgIyBidWcgMTMzMjgzOiBtaW5pbWl6aW5nIHJlcGVhdCBwcm9ibGVtCisgICAgKHInIig/OlxcInxbXiJdKSo/IicsIHInIlwiIicsIFNVQ0NFRUQsICdmb3VuZCcsIHInIlwiIicpLAorICAgICMgYnVnIDQ3NzcyODogbWluaW1pemluZyByZXBlYXQgcHJvYmxlbQorICAgIChyJ14uKj8kJywgJ29uZVxudHdvXG50aHJlZVxuJywgRkFJTCksCisgICAgIyBidWcgNDgzNzg5OiBtaW5pbWl6aW5nIHJlcGVhdCBwcm9ibGVtCisgICAgKHInYVtePl0qP2InLCAnYT5iJywgRkFJTCksCisgICAgIyBidWcgNDkwNTczOiBtaW5pbWl6aW5nIHJlcGVhdCBwcm9ibGVtCisgICAgKHInXmEqPyQnLCAnZm9vJywgRkFJTCksCisgICAgIyBidWcgNDcwNTgyOiBuZXN0ZWQgZ3JvdXBzIHByb2JsZW0KKyAgICAocideKChhKWMpPyhhYikkJywgJ2FiJywgU1VDQ0VFRCwgJ2cxKyItIitnMisiLSIrZzMnLCAnTm9uZS1Ob25lLWFiJyksCisgICAgIyBhbm90aGVyIG1pbmltaXppbmcgcmVwZWF0IHByb2JsZW0gKGNhcHR1cmluZyBncm91cHMgaW4gYXNzZXJ0aW9ucykKKyAgICAoJ14oW2FiXSo/KSg/PShiKT8pYycsICdhYmMnLCBTVUNDRUVELCAnZzErIi0iK2cyJywgJ2FiLU5vbmUnKSwKKyAgICAoJ14oW2FiXSo/KSg/IShiKSljJywgJ2FiYycsIFNVQ0NFRUQsICdnMSsiLSIrZzInLCAnYWItTm9uZScpLAorICAgICgnXihbYWJdKj8pKD88IShhKSljJywgJ2FiYycsIFNVQ0NFRUQsICdnMSsiLSIrZzInLCAnYWItTm9uZScpLAorXQorCit0cnk6CisgICAgdSA9IGV2YWwoInUnXE57TEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJU30nIikKK2V4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIHRlc3RzLmV4dGVuZChbCisgICAgIyBidWcgNDEwMjcxOiBcYiBicm9rZW4gdW5kZXIgbG9jYWxlcworICAgIChyJ1xiLlxiJywgJ2EnLCBTVUNDRUVELCAnZm91bmQnLCAnYScpLAorICAgIChyJyg/dSlcYi5cYicsIHUsIFNVQ0NFRUQsICdmb3VuZCcsIHUpLAorICAgIChyJyg/dSlcdycsIHUsIFNVQ0NFRUQsICdmb3VuZCcsIHUpLAorICAgIF0pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcmVfdGVzdHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlX3Rlc3RzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjRlYjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlX3Rlc3RzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcmVfdGVzdHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlX3Rlc3RzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjRlYjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlX3Rlc3RzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcmVncnRlc3QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVncnRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2YzY2Q2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9yZWdydGVzdC5weQpAQCAtMCwwICsxLDE1NjEgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiCitVc2FnZToKKworcHl0aG9uIC1tIHRlc3QucmVncnRlc3QgW29wdGlvbnNdIFt0ZXN0X25hbWUxIFt0ZXN0X25hbWUyIC4uLl1dCitweXRob24gcGF0aC90by9MaWIvdGVzdC9yZWdydGVzdC5weSBbb3B0aW9uc10gW3Rlc3RfbmFtZTEgW3Rlc3RfbmFtZTIgLi4uXV0KKworCitJZiBubyBhcmd1bWVudHMgb3Igb3B0aW9ucyBhcmUgcHJvdmlkZWQsIGZpbmRzIGFsbCBmaWxlcyBtYXRjaGluZwordGhlIHBhdHRlcm4gInRlc3RfKiIgaW4gdGhlIExpYi90ZXN0IHN1YmRpcmVjdG9yeSBhbmQgcnVucwordGhlbSBpbiBhbHBoYWJldGljYWwgb3JkZXIgKGJ1dCBzZWUgLU0gYW5kIC11LCBiZWxvdywgZm9yIGV4Y2VwdGlvbnMpLgorCitGb3IgbW9yZSByaWdvcm91cyB0ZXN0aW5nLCBpdCBpcyB1c2VmdWwgdG8gdXNlIHRoZSBmb2xsb3dpbmcKK2NvbW1hbmQgbGluZToKKworcHl0aG9uIC1FIC10dCAtV2QgLTMgLW0gdGVzdC5yZWdydGVzdCBbb3B0aW9uc10gW3Rlc3RfbmFtZTEgLi4uXQorCisKK09wdGlvbnM6CisKKy1oLy0taGVscCAgICAgICAtLSBwcmludCB0aGlzIHRleHQgYW5kIGV4aXQKKworVmVyYm9zaXR5CisKKy12Ly0tdmVyYm9zZSAgICAtLSBydW4gdGVzdHMgaW4gdmVyYm9zZSBtb2RlIHdpdGggb3V0cHV0IHRvIHN0ZG91dAorLXcvLS12ZXJib3NlMiAgIC0tIHJlLXJ1biBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlCistVy8tLXZlcmJvc2UzICAgLS0gcmUtcnVuIGZhaWxlZCB0ZXN0cyBpbiB2ZXJib3NlIG1vZGUgaW1tZWRpYXRlbHkKKy1xLy0tcXVpZXQgICAgICAtLSBubyBvdXRwdXQgdW5sZXNzIG9uZSBvciBtb3JlIHRlc3RzIGZhaWwKKy1TLy0tc2xvdyAgICAgICAtLSBwcmludCB0aGUgc2xvd2VzdCAxMCB0ZXN0cworICAgLS1oZWFkZXIgICAgIC0tIHByaW50IGhlYWRlciB3aXRoIGludGVycHJldGVyIGluZm8KKworU2VsZWN0aW5nIHRlc3RzCisKKy1yLy0tcmFuZG9taXplICAtLSByYW5kb21pemUgdGVzdCBleGVjdXRpb24gb3JkZXIgKHNlZSBiZWxvdykKKyAgIC0tcmFuZHNlZWQgICAtLSBwYXNzIGEgcmFuZG9tIHNlZWQgdG8gcmVwcm9kdWNlIGEgcHJldmlvdXMgcmFuZG9tIHJ1bgorLWYvLS1mcm9tZmlsZSAgIC0tIHJlYWQgbmFtZXMgb2YgdGVzdHMgdG8gcnVuIGZyb20gYSBmaWxlIChzZWUgYmVsb3cpCisteC8tLWV4Y2x1ZGUgICAgLS0gYXJndW1lbnRzIGFyZSB0ZXN0cyB0byAqZXhjbHVkZSoKKy1zLy0tc2luZ2xlICAgICAtLSBzaW5nbGUgc3RlcCB0aHJvdWdoIGEgc2V0IG9mIHRlc3RzIChzZWUgYmVsb3cpCistdS8tLXVzZSBSRVMxLFJFUzIsLi4uCisgICAgICAgICAgICAgICAgLS0gc3BlY2lmeSB3aGljaCBzcGVjaWFsIHJlc291cmNlIGludGVuc2l2ZSB0ZXN0cyB0byBydW4KKy1NLy0tbWVtbGltaXQgTElNSVQKKyAgICAgICAgICAgICAgICAtLSBydW4gdmVyeSBsYXJnZSBtZW1vcnktY29uc3VtaW5nIHRlc3RzCisKK1NwZWNpYWwgcnVucworCistbC8tLWZpbmRsZWFrcyAgLS0gaWYgR0MgaXMgYXZhaWxhYmxlIGRldGVjdCB0ZXN0cyB0aGF0IGxlYWsgbWVtb3J5CistTC8tLXJ1bmxlYWtzICAgLS0gcnVuIHRoZSBsZWFrcygxKSBjb21tYW5kIGp1c3QgYmVmb3JlIGV4aXQKKy1SLy0taHVudHJsZWFrcyBSVU5DT1VOVFMKKyAgICAgICAgICAgICAgICAtLSBzZWFyY2ggZm9yIHJlZmVyZW5jZSBsZWFrcyAobmVlZHMgZGVidWcgYnVpbGQsIHYuIHNsb3cpCistai8tLW11bHRpcHJvY2VzcyBQUk9DRVNTRVMKKyAgICAgICAgICAgICAgICAtLSBydW4gUFJPQ0VTU0VTIHByb2Nlc3NlcyBhdCBvbmNlCistVC8tLWNvdmVyYWdlICAgLS0gdHVybiBvbiBjb2RlIGNvdmVyYWdlIHRyYWNpbmcgdXNpbmcgdGhlIHRyYWNlIG1vZHVsZQorLUQvLS1jb3ZlcmRpciBESVJFQ1RPUlkKKyAgICAgICAgICAgICAgICAtLSBEaXJlY3Rvcnkgd2hlcmUgY292ZXJhZ2UgZmlsZXMgYXJlIHB1dAorLU4vLS1ub2NvdmVyZGlyIC0tIFB1dCBjb3ZlcmFnZSBmaWxlcyBhbG9uZ3NpZGUgbW9kdWxlcworLXQvLS10aHJlc2hvbGQgVEhSRVNIT0xECisgICAgICAgICAgICAgICAgLS0gY2FsbCBnYy5zZXRfdGhyZXNob2xkKFRIUkVTSE9MRCkKKy1GLy0tZm9yZXZlciAgICAtLSBydW4gdGhlIHNwZWNpZmllZCB0ZXN0cyBpbiBhIGxvb3AsIHVudGlsIGFuIGVycm9yIGhhcHBlbnMKKworCitBZGRpdGlvbmFsIE9wdGlvbiBEZXRhaWxzOgorCistciByYW5kb21pemVzIHRlc3QgZXhlY3V0aW9uIG9yZGVyLiBZb3UgY2FuIHVzZSAtLXJhbmRzZWVkPWludCB0byBwcm92aWRlIGEKK2ludCBzZWVkIHZhbHVlIGZvciB0aGUgcmFuZG9taXplcjsgdGhpcyBpcyB1c2VmdWwgZm9yIHJlcHJvZHVjaW5nIHRyb3VibGVzb21lCit0ZXN0IG9yZGVycy4KKworLXMgT24gdGhlIGZpcnN0IGludm9jYXRpb24gb2YgcmVncnRlc3QgdXNpbmcgLXMsIHRoZSBmaXJzdCB0ZXN0IGZpbGUgZm91bmQKK29yIHRoZSBmaXJzdCB0ZXN0IGZpbGUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSBpcyBydW4sIGFuZCB0aGUgbmFtZSBvZgordGhlIG5leHQgdGVzdCBpcyByZWNvcmRlZCBpbiBhIGZpbGUgbmFtZWQgcHluZXh0dGVzdC4gIElmIHJ1biBmcm9tIHRoZQorUHl0aG9uIGJ1aWxkIGRpcmVjdG9yeSwgcHluZXh0dGVzdCBpcyBsb2NhdGVkIGluIHRoZSAnYnVpbGQnIHN1YmRpcmVjdG9yeSwKK290aGVyd2lzZSBpdCBpcyBsb2NhdGVkIGluIHRlbXBmaWxlLmdldHRlbXBkaXIoKS4gIE9uIHN1YnNlcXVlbnQgcnVucywKK3RoZSB0ZXN0IGluIHB5bmV4dHRlc3QgaXMgcnVuLCBhbmQgdGhlIG5leHQgdGVzdCBpcyB3cml0dGVuIHRvIHB5bmV4dHRlc3QuCitXaGVuIHRoZSBsYXN0IHRlc3QgaGFzIGJlZW4gcnVuLCBweW5leHR0ZXN0IGlzIGRlbGV0ZWQuICBJbiB0aGlzIHdheSBpdAoraXMgcG9zc2libGUgdG8gc2luZ2xlIHN0ZXAgdGhyb3VnaCB0aGUgdGVzdCBmaWxlcy4gIFRoaXMgaXMgdXNlZnVsIHdoZW4KK2RvaW5nIG1lbW9yeSBhbmFseXNpcyBvbiB0aGUgUHl0aG9uIGludGVycHJldGVyLCB3aGljaCBwcm9jZXNzIHRlbmRzIHRvCitjb25zdW1lIHRvbyBtYW55IHJlc291cmNlcyB0byBydW4gdGhlIGZ1bGwgcmVncmVzc2lvbiB0ZXN0IG5vbi1zdG9wLgorCistZiByZWFkcyB0aGUgbmFtZXMgb2YgdGVzdHMgZnJvbSB0aGUgZmlsZSBnaXZlbiBhcyBmJ3MgYXJndW1lbnQsIG9uZQorb3IgbW9yZSB0ZXN0IG5hbWVzIHBlciBsaW5lLiAgV2hpdGVzcGFjZSBpcyBpZ25vcmVkLiAgQmxhbmsgbGluZXMgYW5kCitsaW5lcyBiZWdpbm5pbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGZvcgord2hpdHRsaW5nIGRvd24gZmFpbHVyZXMgaW52b2x2aW5nIGludGVyYWN0aW9ucyBhbW9uZyB0ZXN0cy4KKworLUwgY2F1c2VzIHRoZSBsZWFrcygxKSBjb21tYW5kIHRvIGJlIHJ1biBqdXN0IGJlZm9yZSBleGl0IGlmIGl0IGV4aXN0cy4KK2xlYWtzKDEpIGlzIGF2YWlsYWJsZSBvbiBNYWMgT1MgWCBhbmQgcHJlc3VtYWJseSBvbiBzb21lIG90aGVyCitGcmVlQlNELWRlcml2ZWQgc3lzdGVtcy4KKworLVIgcnVucyBlYWNoIHRlc3Qgc2V2ZXJhbCB0aW1lcyBhbmQgZXhhbWluZXMgc3lzLmdldHRvdGFscmVmY291bnQoKSB0bworc2VlIGlmIHRoZSB0ZXN0IGFwcGVhcnMgdG8gYmUgbGVha2luZyByZWZlcmVuY2VzLiAgVGhlIGFyZ3VtZW50IHNob3VsZAorYmUgb2YgdGhlIGZvcm0gc3RhYjpydW46Zm5hbWUgd2hlcmUgJ3N0YWInIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCit0ZXN0IGlzIHJ1biB0byBsZXQgZ2V0dG90YWxyZWZjb3VudCBzZXR0bGUgZG93biwgJ3J1bicgaXMgdGhlIG51bWJlcgorb2YgdGltZXMgZnVydGhlciBpdCBpcyBydW4gYW5kICdmbmFtZScgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhlCityZXBvcnRzIGFyZSB3cml0dGVuIHRvLiAgVGhlc2UgcGFyYW1ldGVycyBhbGwgaGF2ZSBkZWZhdWx0cyAoNSwgNCBhbmQKKyJyZWZsb2cudHh0IiByZXNwZWN0aXZlbHkpLCBhbmQgdGhlIG1pbmltYWwgaW52b2NhdGlvbiBpcyAnLVIgOicuCisKKy1NIHJ1bnMgdGVzdHMgdGhhdCByZXF1aXJlIGFuIGV4b3JiaXRhbnQgYW1vdW50IG9mIG1lbW9yeS4gVGhlc2UgdGVzdHMKK3R5cGljYWxseSB0cnkgdG8gYXNjZXJ0YWluIGNvbnRhaW5lcnMga2VlcCB3b3JraW5nIHdoZW4gY29udGFpbmluZyBtb3JlIHRoYW4KKzIgYmlsbGlvbiBvYmplY3RzLCB3aGljaCBvbmx5IHdvcmtzIG9uIDY0LWJpdCBzeXN0ZW1zLiBUaGVyZSBhcmUgYWxzbyBzb21lCit0ZXN0cyB0aGF0IHRyeSB0byBleGhhdXN0IHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwcm9jZXNzLCB3aGljaCBvbmx5IG1ha2VzCitzZW5zZSBvbiAzMi1iaXQgc3lzdGVtcyB3aXRoIGF0IGxlYXN0IDJHYiBvZiBtZW1vcnkuIFRoZSBwYXNzZWQtaW4gbWVtbGltaXQsCit3aGljaCBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiAnMi41R2InLCBkZXRlcm1pbmVzIGhvd211Y2ggbWVtb3J5IHRoZQordGVzdHMgd2lsbCBsaW1pdCB0aGVtc2VsdmVzIHRvIChidXQgdGhleSBtYXkgZ28gc2xpZ2h0bHkgb3Zlci4pIFRoZSBudW1iZXIKK3Nob3VsZG4ndCBiZSBtb3JlIG1lbW9yeSB0aGFuIHRoZSBtYWNoaW5lIGhhcyAoaW5jbHVkaW5nIHN3YXAgbWVtb3J5KS4gWW91CitzaG91bGQgYWxzbyBrZWVwIGluIG1pbmQgdGhhdCBzd2FwIG1lbW9yeSBpcyBnZW5lcmFsbHkgbXVjaCwgbXVjaCBzbG93ZXIKK3RoYW4gUkFNLCBhbmQgc2V0dGluZyBtZW1saW1pdCB0byBhbGwgYXZhaWxhYmxlIFJBTSBvciBoaWdoZXIgd2lsbCBoZWF2aWx5Cit0YXggdGhlIG1hY2hpbmUuIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBpcyBubyB1c2UgcnVubmluZyB0aGVzZSB0ZXN0cyB3aXRoIGEKK2xpbWl0IG9mIGxlc3MgdGhhbiAyLjVHYiwgYW5kIG1hbnkgcmVxdWlyZSBtb3JlIHRoYW4gMjBHYi4gVGVzdHMgdGhhdCBleHBlY3QKK3RvIHVzZSBtb3JlIHRoYW4gbWVtbGltaXQgbWVtb3J5IHdpbGwgYmUgc2tpcHBlZC4gVGhlIGJpZy1tZW1vcnkgdGVzdHMKK2dlbmVyYWxseSBydW4gdmVyeSwgdmVyeSBsb25nLgorCistdSBpcyB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggc3BlY2lhbCByZXNvdXJjZSBpbnRlbnNpdmUgdGVzdHMgdG8gcnVuLAorc3VjaCBhcyB0aG9zZSByZXF1aXJpbmcgbGFyZ2UgZmlsZSBzdXBwb3J0IG9yIG5ldHdvcmsgY29ubmVjdGl2aXR5LgorVGhlIGFyZ3VtZW50IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygd29yZHMgaW5kaWNhdGluZyB0aGUKK3Jlc291cmNlcyB0byB0ZXN0LiAgQ3VycmVudGx5IG9ubHkgdGhlIGZvbGxvd2luZyBhcmUgZGVmaW5lZDoKKworICAgIGFsbCAtICAgICAgIEVuYWJsZSBhbGwgc3BlY2lhbCByZXNvdXJjZXMuCisKKyAgICBhdWRpbyAtICAgICBUZXN0cyB0aGF0IHVzZSB0aGUgYXVkaW8gZGV2aWNlLiAgKFRoZXJlIGFyZSBrbm93bgorICAgICAgICAgICAgICAgIGNhc2VzIG9mIGJyb2tlbiBhdWRpbyBkcml2ZXJzIHRoYXQgY2FuIGNyYXNoIFB5dGhvbiBvcgorICAgICAgICAgICAgICAgIGV2ZW4gdGhlIExpbnV4IGtlcm5lbC4pCisKKyAgICBjdXJzZXMgLSAgICBUZXN0cyB0aGF0IHVzZSBjdXJzZXMgYW5kIHdpbGwgbW9kaWZ5IHRoZSB0ZXJtaW5hbCdzCisgICAgICAgICAgICAgICAgc3RhdGUgYW5kIG91dHB1dCBtb2Rlcy4KKworICAgIGxhcmdlZmlsZSAtIEl0IGlzIG9rYXkgdG8gcnVuIHNvbWUgdGVzdCB0aGF0IG1heSBjcmVhdGUgaHVnZQorICAgICAgICAgICAgICAgIGZpbGVzLiAgVGhlc2UgdGVzdHMgY2FuIHRha2UgYSBsb25nIHRpbWUgYW5kIG1heQorICAgICAgICAgICAgICAgIGNvbnN1bWUgPjJHQiBvZiBkaXNrIHNwYWNlIHRlbXBvcmFyaWx5LgorCisgICAgbmV0d29yayAtICAgSXQgaXMgb2theSB0byBydW4gdGVzdHMgdGhhdCB1c2UgZXh0ZXJuYWwgbmV0d29yaworICAgICAgICAgICAgICAgIHJlc291cmNlLCBlLmcuIHRlc3RpbmcgU1NMIHN1cHBvcnQgZm9yIHNvY2tldHMuCisKKyAgICBic2RkYiAtICAgICBJdCBpcyBva2F5IHRvIHJ1biB0aGUgYnNkZGIgdGVzdHN1aXRlLCB3aGljaCB0YWtlcworICAgICAgICAgICAgICAgIGEgbG9uZyB0aW1lIHRvIGNvbXBsZXRlLgorCisgICAgZGVjaW1hbCAtICAgVGVzdCB0aGUgZGVjaW1hbCBtb2R1bGUgYWdhaW5zdCBhIGxhcmdlIHN1aXRlIHRoYXQKKyAgICAgICAgICAgICAgICB2ZXJpZmllcyBjb21wbGlhbmNlIHdpdGggc3RhbmRhcmRzLgorCisgICAgY3B1IC0gICAgICAgVXNlZCBmb3IgY2VydGFpbiBDUFUtaGVhdnkgdGVzdHMuCisKKyAgICBzdWJwcm9jZXNzICBSdW4gYWxsIHRlc3RzIGZvciB0aGUgc3VicHJvY2VzcyBtb2R1bGUuCisKKyAgICB1cmxmZXRjaCAtICBJdCBpcyBva2F5IHRvIGRvd25sb2FkIGZpbGVzIHJlcXVpcmVkIG9uIHRlc3RpbmcuCisKKyAgICBndWkgLSAgICAgICBSdW4gdGVzdHMgdGhhdCByZXF1aXJlIGEgcnVubmluZyBHVUkuCisKKyAgICB4cGlja2xlIC0gICBUZXN0IHBpY2tsZSBhbmQgY1BpY2tsZSBhZ2FpbnN0IFB5dGhvbiAyLjQsIDIuNSBhbmQgMi42IHRvCisgICAgICAgICAgICAgICAgdGVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gVGhlc2UgdGVzdHMgdGFrZSBhIGxvbmcgdGltZQorICAgICAgICAgICAgICAgIHRvIHJ1bi4KKworVG8gZW5hYmxlIGFsbCByZXNvdXJjZXMgZXhjZXB0IG9uZSwgdXNlICctdWFsbCwtPHJlc291cmNlPicuICBGb3IKK2V4YW1wbGUsIHRvIHJ1biBhbGwgdGhlIHRlc3RzIGV4Y2VwdCBmb3IgdGhlIGJzZGRiIHRlc3RzLCBnaXZlIHRoZQorb3B0aW9uICctdWFsbCwtYnNkZGInLgorIiIiCisKK2ltcG9ydCBTdHJpbmdJTworaW1wb3J0IGdldG9wdAoraW1wb3J0IGpzb24KK2ltcG9ydCBvcworaW1wb3J0IHJhbmRvbQoraW1wb3J0IHJlCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHdhcm5pbmdzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IGltcAoraW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgc3lzY29uZmlnCisKKworIyBTb21lIHRpbWVzIF9fcGF0aF9fIGFuZCBfX2ZpbGVfXyBhcmUgbm90IGFic29sdXRlIChlLmcuIHdoaWxlIHJ1bm5pbmcgZnJvbQorIyBMaWIvKSBhbmQsIGlmIHdlIGNoYW5nZSB0aGUgQ1dEIHRvIHJ1biB0aGUgdGVzdHMgaW4gYSB0ZW1wb3JhcnkgZGlyLCBzb21lCisjIGltcG9ydHMgbWlnaHQgZmFpbC4gIFRoaXMgYWZmZWN0cyBvbmx5IHRoZSBtb2R1bGVzIGltcG9ydGVkIGJlZm9yZSBvcy5jaGRpcigpLgorIyBUaGVzZSBtb2R1bGVzIGFyZSBzZWFyY2hlZCBmaXJzdCBpbiBzeXMucGF0aFswXSAoc28gJycgLS0gdGhlIENXRCkgYW5kIGlmCisjIHRoZXkgYXJlIGZvdW5kIGluIHRoZSBDV0QgdGhlaXIgX19maWxlX18gYW5kIF9fcGF0aF9fIHdpbGwgYmUgcmVsYXRpdmUgKHRoaXMKKyMgaGFwcGVucyBiZWZvcmUgdGhlIGNoZGlyKS4gIEFsbCB0aGUgbW9kdWxlcyBpbXBvcnRlZCBhZnRlciB0aGUgY2hkaXIsIGFyZQorIyBub3QgZm91bmQgaW4gdGhlIENXRCwgYW5kIHNpbmNlIHRoZSBvdGhlciBwYXRocyBpbiBzeXMucGF0aFsxOl0gYXJlIGFic29sdXRlCisjIChzaXRlLnB5IGFic29sdXRpemUgdGhlbSksIHRoZSBfX2ZpbGVfXyBhbmQgX19wYXRoX18gd2lsbCBiZSBhYnNvbHV0ZSB0b28uCisjIFRoZXJlZm9yZSBpdCBpcyBuZWNlc3NhcnkgdG8gYWJzb2x1dGl6ZSBtYW51YWxseSB0aGUgX19maWxlX18gYW5kIF9fcGF0aF9fIG9mCisjIHRoZSBwYWNrYWdlcyB0byBwcmV2ZW50IGxhdGVyIGltcG9ydHMgdG8gZmFpbCB3aGVuIHRoZSBDV0QgaXMgZGlmZmVyZW50LgorZm9yIG1vZHVsZSBpbiBzeXMubW9kdWxlcy5pdGVydmFsdWVzKCk6CisgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX3BhdGhfXycpOgorICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBbb3MucGF0aC5hYnNwYXRoKHBhdGgpIGZvciBwYXRoIGluIG1vZHVsZS5fX3BhdGhfX10KKyAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6CisgICAgICAgIG1vZHVsZS5fX2ZpbGVfXyA9IG9zLnBhdGguYWJzcGF0aChtb2R1bGUuX19maWxlX18pCisKKworIyBNYWNPU1ggKGEuay5hLiBEYXJ3aW4pIGhhcyBhIGRlZmF1bHQgc3RhY2sgc2l6ZSB0aGF0IGlzIHRvbyBzbWFsbAorIyBmb3IgZGVlcGx5IHJlY3Vyc2l2ZSByZWd1bGFyIGV4cHJlc3Npb25zLiAgV2Ugc2VlIHRoaXMgYXMgY3Jhc2hlcyBpbgorIyB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUgd2hlbiBydW5uaW5nIHRlc3RfcmUucHkgYW5kIHRlc3Rfc3JlLnB5LiAgVGhlCisjIGZpeCBpcyB0byBzZXQgdGhlIHN0YWNrIGxpbWl0IHRvIDIwNDguCisjIFRoaXMgYXBwcm9hY2ggbWF5IGFsc28gYmUgdXNlZnVsIGZvciBvdGhlciBVbml4eSBwbGF0Zm9ybXMgdGhhdAorIyBzdWZmZXIgZnJvbSBzbWFsbCBkZWZhdWx0IHN0YWNrIGxpbWl0cy4KK2lmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCByZXNvdXJjZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHNvZnQsIGhhcmQgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLKQorICAgICAgICBuZXdzb2Z0ID0gbWluKGhhcmQsIG1heChzb2Z0LCAxMDI0KjIwNDgpKQorICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX1NUQUNLLCAobmV3c29mdCwgaGFyZCkpCisKKyMgVGVzdCByZXN1bHQgY29uc3RhbnRzLgorUEFTU0VEID0gMQorRkFJTEVEID0gMAorRU5WX0NIQU5HRUQgPSAtMQorU0tJUFBFRCA9IC0yCitSRVNPVVJDRV9ERU5JRUQgPSAtMworSU5URVJSVVBURUQgPSAtNAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitSRVNPVVJDRV9OQU1FUyA9ICgnYXVkaW8nLCAnY3Vyc2VzJywgJ2xhcmdlZmlsZScsICduZXR3b3JrJywgJ2JzZGRiJywKKyAgICAgICAgICAgICAgICAgICdkZWNpbWFsJywgJ2NwdScsICdzdWJwcm9jZXNzJywgJ3VybGZldGNoJywgJ2d1aScsCisgICAgICAgICAgICAgICAgICAneHBpY2tsZScpCisKK1RFTVBESVIgPSBvcy5wYXRoLmFic3BhdGgodGVtcGZpbGUuZ2V0dGVtcGRpcigpKQorCisKK2RlZiB1c2FnZShjb2RlLCBtc2c9JycpOgorICAgIHByaW50IF9fZG9jX18KKyAgICBpZiBtc2c6IHByaW50IG1zZworICAgIHN5cy5leGl0KGNvZGUpCisKKworZGVmIG1haW4odGVzdHM9Tm9uZSwgdGVzdGRpcj1Ob25lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlLAorICAgICAgICAgZXhjbHVkZT1GYWxzZSwgc2luZ2xlPUZhbHNlLCByYW5kb21pemU9RmFsc2UsIGZyb21maWxlPU5vbmUsCisgICAgICAgICBmaW5kbGVha3M9RmFsc2UsIHVzZV9yZXNvdXJjZXM9Tm9uZSwgdHJhY2U9RmFsc2UsIGNvdmVyZGlyPSdjb3ZlcmFnZScsCisgICAgICAgICBydW5sZWFrcz1GYWxzZSwgaHVudHJsZWFrcz1GYWxzZSwgdmVyYm9zZTI9RmFsc2UsIHByaW50X3Nsb3c9RmFsc2UsCisgICAgICAgICByYW5kb21fc2VlZD1Ob25lLCB1c2VfbXA9Tm9uZSwgdmVyYm9zZTM9RmFsc2UsIGZvcmV2ZXI9RmFsc2UsCisgICAgICAgICBoZWFkZXI9RmFsc2UpOgorICAgICIiIkV4ZWN1dGUgYSB0ZXN0IHN1aXRlLgorCisgICAgVGhpcyBhbHNvIHBhcnNlcyBjb21tYW5kLWxpbmUgb3B0aW9ucyBhbmQgbW9kaWZpZXMgaXRzIGJlaGF2aW9yCisgICAgYWNjb3JkaW5nbHkuCisKKyAgICB0ZXN0cyAtLSBhIGxpc3Qgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRlc3QgbmFtZXMgKG9wdGlvbmFsKQorICAgIHRlc3RkaXIgLS0gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBsb29rIGZvciB0ZXN0cyAob3B0aW9uYWwpCisKKyAgICBVc2VycyBvdGhlciB0aGFuIHRoZSBQeXRob24gdGVzdCBzdWl0ZSB3aWxsIGNlcnRhaW5seSB3YW50IHRvCisgICAgc3BlY2lmeSB0ZXN0ZGlyOyBpZiBpdCdzIG9taXR0ZWQsIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUKKyAgICBQeXRob24gdGVzdCBzdWl0ZSBpcyBzZWFyY2hlZCBmb3IuCisKKyAgICBJZiB0aGUgdGVzdHMgYXJndW1lbnQgaXMgb21pdHRlZCwgdGhlIHRlc3RzIGxpc3RlZCBvbiB0aGUKKyAgICBjb21tYW5kLWxpbmUgd2lsbCBiZSB1c2VkLiAgSWYgdGhhdCdzIGVtcHR5LCB0b28sIHRoZW4gYWxsICoucHkKKyAgICBmaWxlcyBiZWdpbm5pbmcgd2l0aCB0ZXN0XyB3aWxsIGJlIHVzZWQuCisKKyAgICBUaGUgb3RoZXIgZGVmYXVsdCBhcmd1bWVudHMgKHZlcmJvc2UsIHF1aWV0LCBleGNsdWRlLAorICAgIHNpbmdsZSwgcmFuZG9taXplLCBmaW5kbGVha3MsIHVzZV9yZXNvdXJjZXMsIHRyYWNlLCBjb3ZlcmRpciwKKyAgICBwcmludF9zbG93LCBhbmQgcmFuZG9tX3NlZWQpIGFsbG93IHByb2dyYW1tZXJzIGNhbGxpbmcgbWFpbigpCisgICAgZGlyZWN0bHkgdG8gc2V0IHRoZSB2YWx1ZXMgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBzZXQgYnkgZmxhZ3MKKyAgICBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICIiIgorCisgICAgdGVzdF9zdXBwb3J0LnJlY29yZF9vcmlnaW5hbF9zdGRvdXQoc3lzLnN0ZG91dCkKKyAgICB0cnk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ2h2cXhzU3JmOmx1OnQ6VEQ6TkxSOkZ3V006ajonLAorICAgICAgICAgICAgWydoZWxwJywgJ3ZlcmJvc2UnLCAndmVyYm9zZTInLCAndmVyYm9zZTMnLCAncXVpZXQnLAorICAgICAgICAgICAgICdleGNsdWRlJywgJ3NpbmdsZScsICdzbG93JywgJ3JhbmRvbWl6ZScsICdmcm9tZmlsZT0nLCAnZmluZGxlYWtzJywKKyAgICAgICAgICAgICAndXNlPScsICd0aHJlc2hvbGQ9JywgJ3RyYWNlJywgJ2NvdmVyZGlyPScsICdub2NvdmVyZGlyJywKKyAgICAgICAgICAgICAncnVubGVha3MnLCAnaHVudHJsZWFrcz0nLCAnbWVtbGltaXQ9JywgJ3JhbmRzZWVkPScsCisgICAgICAgICAgICAgJ211bHRpcHJvY2Vzcz0nLCAnc2xhdmVhcmdzPScsICdmb3JldmVyJywgJ2hlYWRlciddKQorICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKKyAgICAgICAgdXNhZ2UoMiwgbXNnKQorCisgICAgIyBEZWZhdWx0cworICAgIGlmIHJhbmRvbV9zZWVkIGlzIE5vbmU6CisgICAgICAgIHJhbmRvbV9zZWVkID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwMDAwMCkKKyAgICBpZiB1c2VfcmVzb3VyY2VzIGlzIE5vbmU6CisgICAgICAgIHVzZV9yZXNvdXJjZXMgPSBbXQorICAgIGZvciBvLCBhIGluIG9wdHM6CisgICAgICAgIGlmIG8gaW4gKCctaCcsICctLWhlbHAnKToKKyAgICAgICAgICAgIHVzYWdlKDApCisgICAgICAgIGVsaWYgbyBpbiAoJy12JywgJy0tdmVyYm9zZScpOgorICAgICAgICAgICAgdmVyYm9zZSArPSAxCisgICAgICAgIGVsaWYgbyBpbiAoJy13JywgJy0tdmVyYm9zZTInKToKKyAgICAgICAgICAgIHZlcmJvc2UyID0gVHJ1ZQorICAgICAgICBlbGlmIG8gaW4gKCctVycsICctLXZlcmJvc2UzJyk6CisgICAgICAgICAgICB2ZXJib3NlMyA9IFRydWUKKyAgICAgICAgZWxpZiBvIGluICgnLXEnLCAnLS1xdWlldCcpOgorICAgICAgICAgICAgcXVpZXQgPSBUcnVlOworICAgICAgICAgICAgdmVyYm9zZSA9IDAKKyAgICAgICAgZWxpZiBvIGluICgnLXgnLCAnLS1leGNsdWRlJyk6CisgICAgICAgICAgICBleGNsdWRlID0gVHJ1ZQorICAgICAgICBlbGlmIG8gaW4gKCctcycsICctLXNpbmdsZScpOgorICAgICAgICAgICAgc2luZ2xlID0gVHJ1ZQorICAgICAgICBlbGlmIG8gaW4gKCctUycsICctLXNsb3cnKToKKyAgICAgICAgICAgIHByaW50X3Nsb3cgPSBUcnVlCisgICAgICAgIGVsaWYgbyBpbiAoJy1yJywgJy0tcmFuZG9taXplJyk6CisgICAgICAgICAgICByYW5kb21pemUgPSBUcnVlCisgICAgICAgIGVsaWYgbyA9PSAnLS1yYW5kc2VlZCc6CisgICAgICAgICAgICByYW5kb21fc2VlZCA9IGludChhKQorICAgICAgICBlbGlmIG8gaW4gKCctZicsICctLWZyb21maWxlJyk6CisgICAgICAgICAgICBmcm9tZmlsZSA9IGEKKyAgICAgICAgZWxpZiBvIGluICgnLWwnLCAnLS1maW5kbGVha3MnKToKKyAgICAgICAgICAgIGZpbmRsZWFrcyA9IFRydWUKKyAgICAgICAgZWxpZiBvIGluICgnLUwnLCAnLS1ydW5sZWFrcycpOgorICAgICAgICAgICAgcnVubGVha3MgPSBUcnVlCisgICAgICAgIGVsaWYgbyBpbiAoJy10JywgJy0tdGhyZXNob2xkJyk6CisgICAgICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgICAgIGdjLnNldF90aHJlc2hvbGQoaW50KGEpKQorICAgICAgICBlbGlmIG8gaW4gKCctVCcsICctLWNvdmVyYWdlJyk6CisgICAgICAgICAgICB0cmFjZSA9IFRydWUKKyAgICAgICAgZWxpZiBvIGluICgnLUQnLCAnLS1jb3ZlcmRpcicpOgorICAgICAgICAgICAgY292ZXJkaXIgPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIGEpCisgICAgICAgIGVsaWYgbyBpbiAoJy1OJywgJy0tbm9jb3ZlcmRpcicpOgorICAgICAgICAgICAgY292ZXJkaXIgPSBOb25lCisgICAgICAgIGVsaWYgbyBpbiAoJy1SJywgJy0taHVudHJsZWFrcycpOgorICAgICAgICAgICAgaHVudHJsZWFrcyA9IGEuc3BsaXQoJzonKQorICAgICAgICAgICAgaWYgbGVuKGh1bnRybGVha3MpIG5vdCBpbiAoMiwgMyk6CisgICAgICAgICAgICAgICAgcHJpbnQgYSwgaHVudHJsZWFrcworICAgICAgICAgICAgICAgIHVzYWdlKDIsICctUiB0YWtlcyAyIG9yIDMgY29sb24tc2VwYXJhdGVkIGFyZ3VtZW50cycpCisgICAgICAgICAgICBpZiBub3QgaHVudHJsZWFrc1swXToKKyAgICAgICAgICAgICAgICBodW50cmxlYWtzWzBdID0gNQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBodW50cmxlYWtzWzBdID0gaW50KGh1bnRybGVha3NbMF0pCisgICAgICAgICAgICBpZiBub3QgaHVudHJsZWFrc1sxXToKKyAgICAgICAgICAgICAgICBodW50cmxlYWtzWzFdID0gNAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBodW50cmxlYWtzWzFdID0gaW50KGh1bnRybGVha3NbMV0pCisgICAgICAgICAgICBpZiBsZW4oaHVudHJsZWFrcykgPT0gMiBvciBub3QgaHVudHJsZWFrc1syXToKKyAgICAgICAgICAgICAgICBodW50cmxlYWtzWzI6XSA9IFsicmVmbG9nLnR4dCJdCisgICAgICAgIGVsaWYgbyBpbiAoJy1NJywgJy0tbWVtbGltaXQnKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5zZXRfbWVtbGltaXQoYSkKKyAgICAgICAgZWxpZiBvIGluICgnLXUnLCAnLS11c2UnKToKKyAgICAgICAgICAgIHUgPSBbeC5sb3dlcigpIGZvciB4IGluIGEuc3BsaXQoJywnKV0KKyAgICAgICAgICAgIGZvciByIGluIHU6CisgICAgICAgICAgICAgICAgaWYgciA9PSAnYWxsJzoKKyAgICAgICAgICAgICAgICAgICAgdXNlX3Jlc291cmNlc1s6XSA9IFJFU09VUkNFX05BTUVTCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcmVtb3ZlID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiByWzBdID09ICctJzoKKyAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICByID0gclsxOl0KKyAgICAgICAgICAgICAgICBpZiByIG5vdCBpbiBSRVNPVVJDRV9OQU1FUzoKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2UoMSwgJ0ludmFsaWQgLXUvLS11c2Ugb3B0aW9uOiAnICsgYSkKKyAgICAgICAgICAgICAgICBpZiByZW1vdmU6CisgICAgICAgICAgICAgICAgICAgIGlmIHIgaW4gdXNlX3Jlc291cmNlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZV9yZXNvdXJjZXMucmVtb3ZlKHIpCisgICAgICAgICAgICAgICAgZWxpZiByIG5vdCBpbiB1c2VfcmVzb3VyY2VzOgorICAgICAgICAgICAgICAgICAgICB1c2VfcmVzb3VyY2VzLmFwcGVuZChyKQorICAgICAgICBlbGlmIG8gaW4gKCctRicsICctLWZvcmV2ZXInKToKKyAgICAgICAgICAgIGZvcmV2ZXIgPSBUcnVlCisgICAgICAgIGVsaWYgbyBpbiAoJy1qJywgJy0tbXVsdGlwcm9jZXNzJyk6CisgICAgICAgICAgICB1c2VfbXAgPSBpbnQoYSkKKyAgICAgICAgZWxpZiBvID09ICctLWhlYWRlcic6CisgICAgICAgICAgICBoZWFkZXIgPSBUcnVlCisgICAgICAgIGVsaWYgbyA9PSAnLS1zbGF2ZWFyZ3MnOgorICAgICAgICAgICAgYXJncywga3dhcmdzID0ganNvbi5sb2FkcyhhKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3QoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gSU5URVJSVVBURUQsIGUuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgICAgICBwcmludCAgICMgRm9yY2UgYSBuZXdsaW5lIChqdXN0IGluIGNhc2UpCisgICAgICAgICAgICBwcmludCBqc29uLmR1bXBzKHJlc3VsdCkKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICgiTm8gaGFuZGxlciBmb3Igb3B0aW9uIHt9LiAgUGxlYXNlICIKKyAgICAgICAgICAgICAgICAicmVwb3J0IHRoaXMgYXMgYSBidWcgYXQgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy4iKS5mb3JtYXQobykKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgaWYgc2luZ2xlIGFuZCBmcm9tZmlsZToKKyAgICAgICAgdXNhZ2UoMiwgIi1zIGFuZCAtZiBkb24ndCBnbyB0b2dldGhlciEiKQorICAgIGlmIHVzZV9tcCBhbmQgdHJhY2U6CisgICAgICAgIHVzYWdlKDIsICItVCBhbmQgLWogZG9uJ3QgZ28gdG9nZXRoZXIhIikKKyAgICBpZiB1c2VfbXAgYW5kIGZpbmRsZWFrczoKKyAgICAgICAgdXNhZ2UoMiwgIi1sIGFuZCAtaiBkb24ndCBnbyB0b2dldGhlciEiKQorCisgICAgZ29vZCA9IFtdCisgICAgYmFkID0gW10KKyAgICBza2lwcGVkID0gW10KKyAgICByZXNvdXJjZV9kZW5pZWRzID0gW10KKyAgICBlbnZpcm9ubWVudF9jaGFuZ2VkID0gW10KKyAgICBpbnRlcnJ1cHRlZCA9IEZhbHNlCisKKyAgICBpZiBmaW5kbGVha3M6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBnYworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwcmludCAnTm8gR0MgYXZhaWxhYmxlLCBkaXNhYmxpbmcgZmluZGxlYWtzLicKKyAgICAgICAgICAgIGZpbmRsZWFrcyA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byByZXBvcnQgZ2FyYmFnZSB0aGF0IGlzIG5vdAorICAgICAgICAgICAgIyBmcmVlYWJsZSBieSByZWZlcmVuY2UgY291bnRpbmcgYWxvbmUuICBCeSBkZWZhdWx0IG9ubHkKKyAgICAgICAgICAgICMgZ2FyYmFnZSB0aGF0IGlzIG5vdCBjb2xsZWN0YWJsZSBieSB0aGUgR0MgaXMgcmVwb3J0ZWQuCisgICAgICAgICAgICAjZ2Muc2V0X2RlYnVnKGdjLkRFQlVHX1NBVkVBTEwpCisgICAgICAgICAgICBmb3VuZF9nYXJiYWdlID0gW10KKworICAgIGlmIHNpbmdsZToKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4odGVtcGZpbGUuZ2V0dGVtcGRpcigpLCAncHluZXh0dGVzdCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwID0gb3BlbihmaWxlbmFtZSwgJ3InKQorICAgICAgICAgICAgbmV4dF90ZXN0ID0gZnAucmVhZCgpLnN0cmlwKCkKKyAgICAgICAgICAgIHRlc3RzID0gW25leHRfdGVzdF0KKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBpZiBmcm9tZmlsZToKKyAgICAgICAgdGVzdHMgPSBbXQorICAgICAgICBmcCA9IG9wZW4ob3MucGF0aC5qb2luKHRlc3Rfc3VwcG9ydC5TQVZFRENXRCwgZnJvbWZpbGUpKQorICAgICAgICBmb3IgbGluZSBpbiBmcDoKKyAgICAgICAgICAgIGd1dHMgPSBsaW5lLnNwbGl0KCkgIyBhc3N1bWluZyBubyB0ZXN0IGhhcyB3aGl0ZXNwYWNlIGluIGl0cyBuYW1lCisgICAgICAgICAgICBpZiBndXRzIGFuZCBub3QgZ3V0c1swXS5zdGFydHN3aXRoKCcjJyk6CisgICAgICAgICAgICAgICAgdGVzdHMuZXh0ZW5kKGd1dHMpCisgICAgICAgIGZwLmNsb3NlKCkKKworICAgICMgU3RyaXAgLnB5IGV4dGVuc2lvbnMuCisgICAgcmVtb3ZlcHkoYXJncykKKyAgICByZW1vdmVweSh0ZXN0cykKKworICAgIHN0ZHRlc3RzID0gU1REVEVTVFNbOl0KKyAgICBub3R0ZXN0cyA9IE5PVFRFU1RTLmNvcHkoKQorICAgIGlmIGV4Y2x1ZGU6CisgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgIGlmIGFyZyBpbiBzdGR0ZXN0czoKKyAgICAgICAgICAgICAgICBzdGR0ZXN0cy5yZW1vdmUoYXJnKQorICAgICAgICAgICAgbm90dGVzdHMuYWRkKGFyZykKKyAgICAgICAgYXJncyA9IFtdCisKKyAgICAjIEZvciBhIHBhcnRpYWwgcnVuLCB3ZSBkbyBub3QgbmVlZCB0byBjbHV0dGVyIHRoZSBvdXRwdXQuCisgICAgaWYgdmVyYm9zZSBvciBoZWFkZXIgb3Igbm90IChxdWlldCBvciBzaW5nbGUgb3IgdGVzdHMgb3IgYXJncyk6CisgICAgICAgICMgUHJpbnQgYmFzaWMgcGxhdGZvcm0gaW5mb3JtYXRpb24KKyAgICAgICAgcHJpbnQgIj09IiwgcGxhdGZvcm0ucHl0aG9uX2ltcGxlbWVudGF0aW9uKCksIFwKKyAgICAgICAgICAgICAgICAgICAgIiAiLmpvaW4oc3lzLnZlcnNpb24uc3BsaXQoKSkKKyAgICAgICAgcHJpbnQgIj09ICAiLCBwbGF0Zm9ybS5wbGF0Zm9ybShhbGlhc2VkPVRydWUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgIiVzLWVuZGlhbiIgJSBzeXMuYnl0ZW9yZGVyCisgICAgICAgIHByaW50ICI9PSAgIiwgb3MuZ2V0Y3dkKCkKKyAgICAgICAgcHJpbnQgIlRlc3Rpbmcgd2l0aCBmbGFnczoiLCBzeXMuZmxhZ3MKKworICAgIGFsbHRlc3RzID0gZmluZHRlc3RzKHRlc3RkaXIsIHN0ZHRlc3RzLCBub3R0ZXN0cykKKyAgICBzZWxlY3RlZCA9IHRlc3RzIG9yIGFyZ3Mgb3IgYWxsdGVzdHMKKyAgICBpZiBzaW5nbGU6CisgICAgICAgIHNlbGVjdGVkID0gc2VsZWN0ZWRbOjFdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHRfc2luZ2xlX3Rlc3QgPSBhbGx0ZXN0c1thbGx0ZXN0cy5pbmRleChzZWxlY3RlZFswXSkrMV0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBuZXh0X3NpbmdsZV90ZXN0ID0gTm9uZQorICAgIGlmIHJhbmRvbWl6ZToKKyAgICAgICAgcmFuZG9tLnNlZWQocmFuZG9tX3NlZWQpCisgICAgICAgIHByaW50ICJVc2luZyByYW5kb20gc2VlZCIsIHJhbmRvbV9zZWVkCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKHNlbGVjdGVkKQorICAgIGlmIHRyYWNlOgorICAgICAgICBpbXBvcnQgdHJhY2UKKyAgICAgICAgdHJhY2VyID0gdHJhY2UuVHJhY2UoaWdub3JlZGlycz1bc3lzLnByZWZpeCwgc3lzLmV4ZWNfcHJlZml4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2U9RmFsc2UsIGNvdW50PVRydWUpCisKKyAgICB0ZXN0X3RpbWVzID0gW10KKyAgICB0ZXN0X3N1cHBvcnQudXNlX3Jlc291cmNlcyA9IHVzZV9yZXNvdXJjZXMKKyAgICBzYXZlX21vZHVsZXMgPSBzeXMubW9kdWxlcy5rZXlzKCkKKworICAgIGRlZiBhY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpOgorICAgICAgICBvaywgdGVzdF90aW1lID0gcmVzdWx0CisgICAgICAgIHRlc3RfdGltZXMuYXBwZW5kKCh0ZXN0X3RpbWUsIHRlc3QpKQorICAgICAgICBpZiBvayA9PSBQQVNTRUQ6CisgICAgICAgICAgICBnb29kLmFwcGVuZCh0ZXN0KQorICAgICAgICBlbGlmIG9rID09IEZBSUxFRDoKKyAgICAgICAgICAgIGJhZC5hcHBlbmQodGVzdCkKKyAgICAgICAgZWxpZiBvayA9PSBFTlZfQ0hBTkdFRDoKKyAgICAgICAgICAgIGJhZC5hcHBlbmQodGVzdCkKKyAgICAgICAgICAgIGVudmlyb25tZW50X2NoYW5nZWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gU0tJUFBFRDoKKyAgICAgICAgICAgIHNraXBwZWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gUkVTT1VSQ0VfREVOSUVEOgorICAgICAgICAgICAgc2tpcHBlZC5hcHBlbmQodGVzdCkKKyAgICAgICAgICAgIHJlc291cmNlX2RlbmllZHMuYXBwZW5kKHRlc3QpCisKKyAgICBpZiBmb3JldmVyOgorICAgICAgICBkZWYgdGVzdF9mb3JldmVyKHRlc3RzPWxpc3Qoc2VsZWN0ZWQpKToKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgZm9yIHRlc3QgaW4gdGVzdHM6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgaWYgYmFkOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRlc3RzID0gdGVzdF9mb3JldmVyKCkKKyAgICBlbHNlOgorICAgICAgICB0ZXN0cyA9IGl0ZXIoc2VsZWN0ZWQpCisKKyAgICBpZiB1c2VfbXA6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBUaHJlYWQKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcHJpbnQgIk11bHRpcHJvY2VzcyBvcHRpb24gcmVxdWlyZXMgdGhyZWFkIHN1cHBvcnQiCisgICAgICAgICAgICBzeXMuZXhpdCgyKQorICAgICAgICBmcm9tIFF1ZXVlIGltcG9ydCBRdWV1ZQorICAgICAgICBmcm9tIHN1YnByb2Nlc3MgaW1wb3J0IFBvcGVuLCBQSVBFCisgICAgICAgIGRlYnVnX291dHB1dF9wYXQgPSByZS5jb21waWxlKHIiXFtcZCsgcmVmc1xdJCIpCisgICAgICAgIG91dHB1dCA9IFF1ZXVlKCkKKyAgICAgICAgZGVmIHRlc3RzX2FuZF9hcmdzKCk6CisgICAgICAgICAgICBmb3IgdGVzdCBpbiB0ZXN0czoKKyAgICAgICAgICAgICAgICBhcmdzX3R1cGxlID0gKAorICAgICAgICAgICAgICAgICAgICAodGVzdCwgdmVyYm9zZSwgcXVpZXQpLAorICAgICAgICAgICAgICAgICAgICBkaWN0KGh1bnRybGVha3M9aHVudHJsZWFrcywgdXNlX3Jlc291cmNlcz11c2VfcmVzb3VyY2VzKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB5aWVsZCAodGVzdCwgYXJnc190dXBsZSkKKyAgICAgICAgcGVuZGluZyA9IHRlc3RzX2FuZF9hcmdzKCkKKyAgICAgICAgb3B0X2FyZ3MgPSB0ZXN0X3N1cHBvcnQuYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkKKyAgICAgICAgYmFzZV9jbWQgPSBbc3lzLmV4ZWN1dGFibGVdICsgb3B0X2FyZ3MgKyBbJy1tJywgJ3Rlc3QucmVncnRlc3QnXQorICAgICAgICBkZWYgd29yaygpOgorICAgICAgICAgICAgIyBBIHdvcmtlciB0aHJlYWQuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdCwgYXJnc190dXBsZSA9IG5leHQocGVuZGluZykKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAjIC1FIGlzIG5lZWRlZCBieSBzb21lIHRlc3RzLCBlLmcuIHRlc3RfaW1wb3J0CisgICAgICAgICAgICAgICAgICAgIHBvcGVuID0gUG9wZW4oYmFzZV9jbWQgKyBbJy0tc2xhdmVhcmdzJywganNvbi5kdW1wcyhhcmdzX3R1cGxlKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1QSVBFLCBzdGRlcnI9UElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz0ob3MubmFtZSAhPSAnbnQnKSkKKyAgICAgICAgICAgICAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwb3Blbi5jb21tdW5pY2F0ZSgpCisgICAgICAgICAgICAgICAgICAgICMgU3RyaXAgbGFzdCByZWZjb3VudCBvdXRwdXQgbGluZSBpZiBpdCBleGlzdHMsIHNpbmNlIGl0CisgICAgICAgICAgICAgICAgICAgICMgY29tZXMgZnJvbSB0aGUgc2h1dGRvd24gb2YgdGhlIGludGVycHJldGVyIGluIHRoZSBzdWJjb21tYW5kLgorICAgICAgICAgICAgICAgICAgICBzdGRlcnIgPSBkZWJ1Z19vdXRwdXRfcGF0LnN1YigiIiwgc3RkZXJyKQorICAgICAgICAgICAgICAgICAgICBzdGRvdXQsIF8sIHJlc3VsdCA9IHN0ZG91dC5zdHJpcCgpLnJwYXJ0aXRpb24oIlxuIikKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXQoKE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGpzb24ubG9hZHMocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcXVpZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQgPSB0ZXN0Kydcbicrc3Rkb3V0CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXQoKHRlc3QsIHN0ZG91dC5yc3RyaXAoKSwgc3RkZXJyLnJzdHJpcCgpLCByZXN1bHQpKQorICAgICAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb246CisgICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgd29ya2VycyA9IFtUaHJlYWQodGFyZ2V0PXdvcmspIGZvciBpIGluIHJhbmdlKHVzZV9tcCldCisgICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKKyAgICAgICAgICAgIHdvcmtlci5zdGFydCgpCisgICAgICAgIGZpbmlzaGVkID0gMAorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBmaW5pc2hlZCA8IHVzZV9tcDoKKyAgICAgICAgICAgICAgICB0ZXN0LCBzdGRvdXQsIHN0ZGVyciwgcmVzdWx0ID0gb3V0cHV0LmdldCgpCisgICAgICAgICAgICAgICAgaWYgdGVzdCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBmaW5pc2hlZCArPSAxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgc3Rkb3V0OgorICAgICAgICAgICAgICAgICAgICBwcmludCBzdGRvdXQKKyAgICAgICAgICAgICAgICBpZiBzdGRlcnI6CisgICAgICAgICAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgc3RkZXJyCisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0WzBdID09IElOVEVSUlVQVEVEOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcmVzdWx0WzFdID09ICdLZXlib2FyZEludGVycnVwdCcKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQgICAjIFdoYXQgZWxzZT8KKyAgICAgICAgICAgICAgICBhY2N1bXVsYXRlX3Jlc3VsdCh0ZXN0LCByZXN1bHQpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIGludGVycnVwdGVkID0gVHJ1ZQorICAgICAgICAgICAgcGVuZGluZy5jbG9zZSgpCisgICAgICAgIGZvciB3b3JrZXIgaW4gd29ya2VyczoKKyAgICAgICAgICAgIHdvcmtlci5qb2luKCkKKyAgICBlbHNlOgorICAgICAgICBmb3IgdGVzdCBpbiB0ZXN0czoKKyAgICAgICAgICAgIGlmIG5vdCBxdWlldDoKKyAgICAgICAgICAgICAgICBwcmludCB0ZXN0CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICBpZiB0cmFjZToKKyAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIHRyYWNpbmcgY29kZSBjb3ZlcmFnZSwgdGhlbiB3ZSBkb24ndCBleGl0IHdpdGggc3RhdHVzCisgICAgICAgICAgICAgICAgIyBpZiBvbiBhIGZhbHNlIHJldHVybiB2YWx1ZSBmcm9tIG1haW4uCisgICAgICAgICAgICAgICAgdHJhY2VyLnJ1bmN0eCgncnVudGVzdCh0ZXN0LCB2ZXJib3NlLCBxdWlldCknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFscz1nbG9iYWxzKCksIGxvY2Fscz12YXJzKCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcnVudGVzdCh0ZXN0LCB2ZXJib3NlLCBxdWlldCwgaHVudHJsZWFrcykKKyAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQorICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlMyBhbmQgcmVzdWx0WzBdID09IEZBSUxFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJSZS1ydW5uaW5nIHRlc3QgJXIgaW4gdmVyYm9zZSBtb2RlIiAlIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRlc3QodGVzdCwgVHJ1ZSwgcXVpZXQsIGh1bnRybGVha3MpCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBpZiBmaW5kbGVha3M6CisgICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICAgICAgaWYgZ2MuZ2FyYmFnZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIldhcm5pbmc6IHRlc3QgY3JlYXRlZCIsIGxlbihnYy5nYXJiYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgInVuY29sbGVjdGFibGUgb2JqZWN0KHMpLiIKKyAgICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRoZSB1bmNvbGxlY3RhYmxlIG9iamVjdHMgc29tZXdoZXJlIHNvIHdlIGRvbid0IHNlZQorICAgICAgICAgICAgICAgICAgICAjIHRoZW0gYWdhaW4KKyAgICAgICAgICAgICAgICAgICAgZm91bmRfZ2FyYmFnZS5leHRlbmQoZ2MuZ2FyYmFnZSkKKyAgICAgICAgICAgICAgICAgICAgZGVsIGdjLmdhcmJhZ2VbOl0KKyAgICAgICAgICAgICMgVW5sb2FkIHRoZSBuZXdseSBpbXBvcnRlZCBtb2R1bGVzIChiZXN0IGVmZm9ydCBmaW5hbGl6YXRpb24pCisgICAgICAgICAgICBmb3IgbW9kdWxlIGluIHN5cy5tb2R1bGVzLmtleXMoKToKKyAgICAgICAgICAgICAgICBpZiBtb2R1bGUgbm90IGluIHNhdmVfbW9kdWxlcyBhbmQgbW9kdWxlLnN0YXJ0c3dpdGgoInRlc3QuIik6CisgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxvYWQobW9kdWxlKQorCisgICAgaWYgaW50ZXJydXB0ZWQ6CisgICAgICAgICMgcHJpbnQgYSBuZXdsaW5lIGFmdGVyIF5DCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICJUZXN0IHN1aXRlIGludGVycnVwdGVkIGJ5IHNpZ25hbCBTSUdJTlQuIgorICAgICAgICBvbWl0dGVkID0gc2V0KHNlbGVjdGVkKSAtIHNldChnb29kKSAtIHNldChiYWQpIC0gc2V0KHNraXBwZWQpCisgICAgICAgIHByaW50IGNvdW50KGxlbihvbWl0dGVkKSwgInRlc3QiKSwgIm9taXR0ZWQ6IgorICAgICAgICBwcmludGxpc3Qob21pdHRlZCkKKyAgICBpZiBnb29kIGFuZCBub3QgcXVpZXQ6CisgICAgICAgIGlmIG5vdCBiYWQgYW5kIG5vdCBza2lwcGVkIGFuZCBub3QgaW50ZXJydXB0ZWQgYW5kIGxlbihnb29kKSA+IDE6CisgICAgICAgICAgICBwcmludCAiQWxsIiwKKyAgICAgICAgcHJpbnQgY291bnQobGVuKGdvb2QpLCAidGVzdCIpLCAiT0suIgorICAgIGlmIHByaW50X3Nsb3c6CisgICAgICAgIHRlc3RfdGltZXMuc29ydChyZXZlcnNlPVRydWUpCisgICAgICAgIHByaW50ICIxMCBzbG93ZXN0IHRlc3RzOiIKKyAgICAgICAgZm9yIHRpbWUsIHRlc3QgaW4gdGVzdF90aW1lc1s6MTBdOgorICAgICAgICAgICAgcHJpbnQgIiVzOiAlLjFmcyIgJSAodGVzdCwgdGltZSkKKyAgICBpZiBiYWQ6CisgICAgICAgIGJhZCA9IHNldChiYWQpIC0gc2V0KGVudmlyb25tZW50X2NoYW5nZWQpCisgICAgICAgIGlmIGJhZDoKKyAgICAgICAgICAgIHByaW50IGNvdW50KGxlbihiYWQpLCAidGVzdCIpLCAiZmFpbGVkOiIKKyAgICAgICAgICAgIHByaW50bGlzdChiYWQpCisgICAgICAgIGlmIGVudmlyb25tZW50X2NoYW5nZWQ6CisgICAgICAgICAgICBwcmludCAie30gYWx0ZXJlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50OiIuZm9ybWF0KAorICAgICAgICAgICAgICAgIGNvdW50KGxlbihlbnZpcm9ubWVudF9jaGFuZ2VkKSwgInRlc3QiKSkKKyAgICAgICAgICAgIHByaW50bGlzdChlbnZpcm9ubWVudF9jaGFuZ2VkKQorICAgIGlmIHNraXBwZWQgYW5kIG5vdCBxdWlldDoKKyAgICAgICAgcHJpbnQgY291bnQobGVuKHNraXBwZWQpLCAidGVzdCIpLCAic2tpcHBlZDoiCisgICAgICAgIHByaW50bGlzdChza2lwcGVkKQorCisgICAgICAgIGUgPSBfRXhwZWN0ZWRTa2lwcygpCisgICAgICAgIHBsYXQgPSBzeXMucGxhdGZvcm0KKyAgICAgICAgaWYgZS5pc3ZhbGlkKCk6CisgICAgICAgICAgICBzdXJwcmlzZSA9IHNldChza2lwcGVkKSAtIGUuZ2V0ZXhwZWN0ZWQoKSAtIHNldChyZXNvdXJjZV9kZW5pZWRzKQorICAgICAgICAgICAgaWYgc3VycHJpc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgY291bnQobGVuKHN1cnByaXNlKSwgInNraXAiKSwgXAorICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIG9uIiwgcGxhdCArICI6IgorICAgICAgICAgICAgICAgIHByaW50bGlzdChzdXJwcmlzZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIlRob3NlIHNraXBzIGFyZSBhbGwgZXhwZWN0ZWQgb24iLCBwbGF0ICsgIi4iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiQXNrIHNvbWVvbmUgdG8gdGVhY2ggcmVncnRlc3QucHkgYWJvdXQgd2hpY2ggdGVzdHMgYXJlIgorICAgICAgICAgICAgcHJpbnQgImV4cGVjdGVkIHRvIGdldCBza2lwcGVkIG9uIiwgcGxhdCArICIuIgorCisgICAgaWYgdmVyYm9zZTIgYW5kIGJhZDoKKyAgICAgICAgcHJpbnQgIlJlLXJ1bm5pbmcgZmFpbGVkIHRlc3RzIGluIHZlcmJvc2UgbW9kZSIKKyAgICAgICAgZm9yIHRlc3QgaW4gYmFkOgorICAgICAgICAgICAgcHJpbnQgIlJlLXJ1bm5pbmcgdGVzdCAlciBpbiB2ZXJib3NlIG1vZGUiICUgdGVzdAorICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnZlcmJvc2UgPSBUcnVlCisgICAgICAgICAgICAgICAgb2sgPSBydW50ZXN0KHRlc3QsIFRydWUsIHF1aWV0LCBodW50cmxlYWtzKQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgICMgcHJpbnQgYSBuZXdsaW5lIHNlcGFyYXRlIGZyb20gdGhlIF5DCisgICAgICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBpZiBzaW5nbGU6CisgICAgICAgIGlmIG5leHRfc2luZ2xlX3Rlc3Q6CisgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3JykgYXMgZnA6CisgICAgICAgICAgICAgICAgZnAud3JpdGUobmV4dF9zaW5nbGVfdGVzdCArICdcbicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCisKKyAgICBpZiB0cmFjZToKKyAgICAgICAgciA9IHRyYWNlci5yZXN1bHRzKCkKKyAgICAgICAgci53cml0ZV9yZXN1bHRzKHNob3dfbWlzc2luZz1UcnVlLCBzdW1tYXJ5PVRydWUsIGNvdmVyZGlyPWNvdmVyZGlyKQorCisgICAgaWYgcnVubGVha3M6CisgICAgICAgIG9zLnN5c3RlbSgibGVha3MgJWQiICUgb3MuZ2V0cGlkKCkpCisKKyAgICBzeXMuZXhpdChsZW4oYmFkKSA+IDAgb3IgaW50ZXJydXB0ZWQpCisKKworU1REVEVTVFMgPSBbCisgICAgJ3Rlc3RfZ3JhbW1hcicsCisgICAgJ3Rlc3Rfb3Bjb2RlcycsCisgICAgJ3Rlc3RfZGljdCcsCisgICAgJ3Rlc3RfYnVpbHRpbicsCisgICAgJ3Rlc3RfZXhjZXB0aW9ucycsCisgICAgJ3Rlc3RfdHlwZXMnLAorICAgICd0ZXN0X3VuaXR0ZXN0JywKKyAgICAndGVzdF9kb2N0ZXN0JywKKyAgICAndGVzdF9kb2N0ZXN0MicsCitdCisKK05PVFRFU1RTID0geworICAgICd0ZXN0X3N1cHBvcnQnLAorICAgICd0ZXN0X2Z1dHVyZTEnLAorICAgICd0ZXN0X2Z1dHVyZTInLAorfQorCitkZWYgZmluZHRlc3RzKHRlc3RkaXI9Tm9uZSwgc3RkdGVzdHM9U1REVEVTVFMsIG5vdHRlc3RzPU5PVFRFU1RTKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBhcHBsaWNhYmxlIHRlc3QgbW9kdWxlcy4iIiIKKyAgICB0ZXN0ZGlyID0gZmluZHRlc3RkaXIodGVzdGRpcikKKyAgICBuYW1lcyA9IG9zLmxpc3RkaXIodGVzdGRpcikKKyAgICB0ZXN0cyA9IFtdCisgICAgb3RoZXJzID0gc2V0KHN0ZHRlc3RzKSB8IG5vdHRlc3RzCisgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgIG1vZG5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQobmFtZSkKKyAgICAgICAgaWYgbW9kbmFtZVs6NV0gPT0gInRlc3RfIiBhbmQgZXh0ID09ICIucHkiIGFuZCBtb2RuYW1lIG5vdCBpbiBvdGhlcnM6CisgICAgICAgICAgICB0ZXN0cy5hcHBlbmQobW9kbmFtZSkKKyAgICByZXR1cm4gc3RkdGVzdHMgKyBzb3J0ZWQodGVzdHMpCisKK2RlZiBydW50ZXN0KHRlc3QsIHZlcmJvc2UsIHF1aWV0LAorICAgICAgICAgICAgaHVudHJsZWFrcz1GYWxzZSwgdXNlX3Jlc291cmNlcz1Ob25lKToKKyAgICAiIiJSdW4gYSBzaW5nbGUgdGVzdC4KKworICAgIHRlc3QgLS0gdGhlIG5hbWUgb2YgdGhlIHRlc3QKKyAgICB2ZXJib3NlIC0tIGlmIHRydWUsIHByaW50IG1vcmUgbWVzc2FnZXMKKyAgICBxdWlldCAtLSBpZiB0cnVlLCBkb24ndCBwcmludCAnc2tpcHBlZCcgbWVzc2FnZXMgKHByb2JhYmx5IHJlZHVuZGFudCkKKyAgICB0ZXN0X3RpbWVzIC0tIGEgbGlzdCBvZiAodGltZSwgdGVzdF9uYW1lKSBwYWlycworICAgIGh1bnRybGVha3MgLS0gcnVuIG11bHRpcGxlIHRpbWVzIHRvIHRlc3QgZm9yIGxlYWtzOyByZXF1aXJlcyBhIGRlYnVnCisgICAgICAgICAgICAgICAgICBidWlsZDsgYSB0cmlwbGUgY29ycmVzcG9uZGluZyB0byAtUidzIHRocmVlIGFyZ3VtZW50cworICAgIFJldHVybnMgb25lIG9mIHRoZSB0ZXN0IHJlc3VsdCBjb25zdGFudHM6CisgICAgICAgIElOVEVSUlVQVEVEICAgICAgS2V5Ym9hcmRJbnRlcnJ1cHQgd2hlbiBydW4gdW5kZXIgLWoKKyAgICAgICAgUkVTT1VSQ0VfREVOSUVEICB0ZXN0IHNraXBwZWQgYmVjYXVzZSByZXNvdXJjZSBkZW5pZWQKKyAgICAgICAgU0tJUFBFRCAgICAgICAgICB0ZXN0IHNraXBwZWQgZm9yIHNvbWUgb3RoZXIgcmVhc29uCisgICAgICAgIEVOVl9DSEFOR0VEICAgICAgdGVzdCBmYWlsZWQgYmVjYXVzZSBpdCBjaGFuZ2VkIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQKKyAgICAgICAgRkFJTEVEICAgICAgICAgICB0ZXN0IGZhaWxlZAorICAgICAgICBQQVNTRUQgICAgICAgICAgIHRlc3QgcGFzc2VkCisgICAgIiIiCisKKyAgICB0ZXN0X3N1cHBvcnQudmVyYm9zZSA9IHZlcmJvc2UgICMgVGVsbCB0ZXN0cyB0byBiZSBtb2RlcmF0ZWx5IHF1aWV0CisgICAgaWYgdXNlX3Jlc291cmNlcyBpcyBub3QgTm9uZToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSB1c2VfcmVzb3VyY2VzCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gcnVudGVzdF9pbm5lcih0ZXN0LCB2ZXJib3NlLCBxdWlldCwgaHVudHJsZWFrcykKKyAgICBmaW5hbGx5OgorICAgICAgICBjbGVhbnVwX3Rlc3RfZHJvcHBpbmdzKHRlc3QsIHZlcmJvc2UpCisKKworIyBVbml0IHRlc3RzIGFyZSBzdXBwb3NlZCB0byBsZWF2ZSB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50IHVuY2hhbmdlZAorIyBvbmNlIHRoZXkgY29tcGxldGUuICBCdXQgc29tZXRpbWVzIHRlc3RzIGhhdmUgYnVncywgZXNwZWNpYWxseSB3aGVuCisjIHRlc3RzIGZhaWwsIGFuZCB0aGUgY2hhbmdlcyB0byBlbnZpcm9ubWVudCBnbyBvbiB0byBtZXNzIHVwIG90aGVyCisjIHRlc3RzLiAgVGhpcyBjYW4gY2F1c2UgaXNzdWVzIHdpdGggYnVpbGRib3Qgc3RhYmlsaXR5LCBzaW5jZSB0ZXN0cworIyBhcmUgcnVuIGluIHJhbmRvbSBvcmRlciBhbmQgc28gcHJvYmxlbXMgbWF5IGFwcGVhciB0byBjb21lIGFuZCBnby4KKyMgVGhlcmUgYXJlIGEgZmV3IHRoaW5ncyB3ZSBjYW4gc2F2ZSBhbmQgcmVzdG9yZSB0byBtaXRpZ2F0ZSB0aGlzLCBhbmQKKyMgdGhlIGZvbGxvd2luZyBjb250ZXh0IG1hbmFnZXIgaGFuZGxlcyB0aGlzIHRhc2suCisKK2NsYXNzIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQ6CisgICAgIiIiU2F2ZSBiaXRzIG9mIHRoZSB0ZXN0IGVudmlyb25tZW50IGFuZCByZXN0b3JlIHRoZW0gYXQgYmxvY2sgZXhpdC4KKworICAgICAgICB3aXRoIHNhdmVkX3Rlc3RfZW52aXJvbm1lbnQodGVzdG5hbWUsIHZlcmJvc2UsIHF1aWV0KToKKyAgICAgICAgICAgICNzdHVmZgorCisgICAgVW5sZXNzIHF1aWV0IGlzIFRydWUsIGEgd2FybmluZyBpcyBwcmludGVkIHRvIHN0ZGVyciBpZiBhbnkgb2YKKyAgICB0aGUgc2F2ZWQgaXRlbXMgd2FzIGNoYW5nZWQgYnkgdGhlIHRlc3QuICBUaGUgYXR0cmlidXRlICdjaGFuZ2VkJworICAgIGlzIGluaXRpYWxseSBGYWxzZSwgYnV0IGlzIHNldCB0byBUcnVlIGlmIGEgY2hhbmdlIGlzIGRldGVjdGVkLgorCisgICAgSWYgdmVyYm9zZSBpcyBtb3JlIHRoYW4gMSwgdGhlIGJlZm9yZSBhbmQgYWZ0ZXIgc3RhdGUgb2YgY2hhbmdlZAorICAgIGl0ZW1zIGlzIGFsc28gcHJpbnRlZC4KKyAgICAiIiIKKworICAgIGNoYW5nZWQgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RuYW1lLCB2ZXJib3NlPTAsIHF1aWV0PUZhbHNlKToKKyAgICAgICAgc2VsZi50ZXN0bmFtZSA9IHRlc3RuYW1lCisgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgc2VsZi5xdWlldCA9IHF1aWV0CisKKyAgICAjIFRvIGFkZCB0aGluZ3MgdG8gc2F2ZSBhbmQgcmVzdG9yZSwgYWRkIGEgbmFtZSBYWFggdG8gdGhlIHJlc291cmNlcyBsaXN0CisgICAgIyBhbmQgYWRkIGNvcnJlc3BvbmRpbmcgZ2V0X1hYWC9yZXN0b3JlX1hYWCBmdW5jdGlvbnMuICBnZXRfWFhYIHNob3VsZAorICAgICMgcmV0dXJuIHRoZSB2YWx1ZSB0byBiZSBzYXZlZCBhbmQgY29tcGFyZWQgYWdhaW5zdCBhIHNlY29uZCBjYWxsIHRvIHRoZQorICAgICMgZ2V0IGZ1bmN0aW9uIHdoZW4gdGVzdCBleGVjdXRpb24gY29tcGxldGVzLiAgcmVzdG9yZV9YWFggc2hvdWxkIGFjY2VwdAorICAgICMgdGhlIHNhdmVkIHZhbHVlIGFuZCByZXN0b3JlIHRoZSByZXNvdXJjZSB1c2luZyBpdC4gIEl0IHdpbGwgYmUgY2FsbGVkIGlmCisgICAgIyBhbmQgb25seSBpZiBhIGNoYW5nZSBpbiB0aGUgdmFsdWUgaXMgZGV0ZWN0ZWQuCisgICAgIworICAgICMgTm90ZTogWFhYIHdpbGwgaGF2ZSBhbnkgJy4nIHJlcGxhY2VkIHdpdGggJ18nIGNoYXJhY3RlcnMgd2hlbiBkZXRlcm1pbmluZworICAgICMgdGhlIGNvcnJlc3BvbmRpbmcgbWV0aG9kIG5hbWVzLgorCisgICAgcmVzb3VyY2VzID0gKCdzeXMuYXJndicsICdjd2QnLCAnc3lzLnN0ZGluJywgJ3N5cy5zdGRvdXQnLCAnc3lzLnN0ZGVycicsCisgICAgICAgICAgICAgICAgICdvcy5lbnZpcm9uJywgJ3N5cy5wYXRoJywgJ2FzeW5jb3JlLnNvY2tldF9tYXAnLAorICAgICAgICAgICAgICAgICAndGVzdF9zdXBwb3J0LlRFU1RGTicsCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGdldF9zeXNfYXJndihzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKHN5cy5hcmd2KSwgc3lzLmFyZ3YsIHN5cy5hcmd2WzpdCisgICAgZGVmIHJlc3RvcmVfc3lzX2FyZ3Yoc2VsZiwgc2F2ZWRfYXJndik6CisgICAgICAgIHN5cy5hcmd2ID0gc2F2ZWRfYXJndlsxXQorICAgICAgICBzeXMuYXJndls6XSA9IHNhdmVkX2FyZ3ZbMl0KKworICAgIGRlZiBnZXRfY3dkKHNlbGYpOgorICAgICAgICByZXR1cm4gb3MuZ2V0Y3dkKCkKKyAgICBkZWYgcmVzdG9yZV9jd2Qoc2VsZiwgc2F2ZWRfY3dkKToKKyAgICAgICAgb3MuY2hkaXIoc2F2ZWRfY3dkKQorCisgICAgZGVmIGdldF9zeXNfc3Rkb3V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLnN0ZG91dAorICAgIGRlZiByZXN0b3JlX3N5c19zdGRvdXQoc2VsZiwgc2F2ZWRfc3Rkb3V0KToKKyAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVkX3N0ZG91dAorCisgICAgZGVmIGdldF9zeXNfc3RkZXJyKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGVycgorICAgIGRlZiByZXN0b3JlX3N5c19zdGRlcnIoc2VsZiwgc2F2ZWRfc3RkZXJyKToKKyAgICAgICAgc3lzLnN0ZGVyciA9IHNhdmVkX3N0ZGVycgorCisgICAgZGVmIGdldF9zeXNfc3RkaW4oc2VsZik6CisgICAgICAgIHJldHVybiBzeXMuc3RkaW4KKyAgICBkZWYgcmVzdG9yZV9zeXNfc3RkaW4oc2VsZiwgc2F2ZWRfc3RkaW4pOgorICAgICAgICBzeXMuc3RkaW4gPSBzYXZlZF9zdGRpbgorCisgICAgZGVmIGdldF9vc19lbnZpcm9uKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQob3MuZW52aXJvbiksIG9zLmVudmlyb24sIGRpY3Qob3MuZW52aXJvbikKKyAgICBkZWYgcmVzdG9yZV9vc19lbnZpcm9uKHNlbGYsIHNhdmVkX2Vudmlyb24pOgorICAgICAgICBvcy5lbnZpcm9uID0gc2F2ZWRfZW52aXJvblsxXQorICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKKyAgICAgICAgb3MuZW52aXJvbi51cGRhdGUoc2F2ZWRfZW52aXJvblsyXSkKKworICAgIGRlZiBnZXRfc3lzX3BhdGgoc2VsZik6CisgICAgICAgIHJldHVybiBpZChzeXMucGF0aCksIHN5cy5wYXRoLCBzeXMucGF0aFs6XQorICAgIGRlZiByZXN0b3JlX3N5c19wYXRoKHNlbGYsIHNhdmVkX3BhdGgpOgorICAgICAgICBzeXMucGF0aCA9IHNhdmVkX3BhdGhbMV0KKyAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlZF9wYXRoWzJdCisKKyAgICBkZWYgZ2V0X2FzeW5jb3JlX3NvY2tldF9tYXAoc2VsZik6CisgICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCisgICAgICAgICMgWFhYIE1ha2luZyBhIGNvcHkga2VlcHMgb2JqZWN0cyBhbGl2ZSB1bnRpbCBfX2V4aXRfXyBnZXRzIGNhbGxlZC4KKyAgICAgICAgcmV0dXJuIGFzeW5jb3JlIGFuZCBhc3luY29yZS5zb2NrZXRfbWFwLmNvcHkoKSBvciB7fQorICAgIGRlZiByZXN0b3JlX2FzeW5jb3JlX3NvY2tldF9tYXAoc2VsZiwgc2F2ZWRfbWFwKToKKyAgICAgICAgYXN5bmNvcmUgPSBzeXMubW9kdWxlcy5nZXQoJ2FzeW5jb3JlJykKKyAgICAgICAgaWYgYXN5bmNvcmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhc3luY29yZS5jbG9zZV9hbGwoaWdub3JlX2FsbD1UcnVlKQorICAgICAgICAgICAgYXN5bmNvcmUuc29ja2V0X21hcC51cGRhdGUoc2F2ZWRfbWFwKQorCisgICAgZGVmIGdldF90ZXN0X3N1cHBvcnRfVEVTVEZOKHNlbGYpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKToKKyAgICAgICAgICAgIHJlc3VsdCA9ICdmJworICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIodGVzdF9zdXBwb3J0LlRFU1RGTik6CisgICAgICAgICAgICByZXN1bHQgPSAnZCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIGRlZiByZXN0b3JlX3Rlc3Rfc3VwcG9ydF9URVNURk4oc2VsZiwgc2F2ZWRfdmFsdWUpOgorICAgICAgICBpZiBzYXZlZF92YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTik6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIodGVzdF9zdXBwb3J0LlRFU1RGTik6CisgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHJlc291cmNlX2luZm8oc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIHNlbGYucmVzb3VyY2VzOgorICAgICAgICAgICAgbWV0aG9kX3N1ZmZpeCA9IG5hbWUucmVwbGFjZSgnLicsICdfJykKKyAgICAgICAgICAgIGdldF9uYW1lID0gJ2dldF8nICsgbWV0aG9kX3N1ZmZpeAorICAgICAgICAgICAgcmVzdG9yZV9uYW1lID0gJ3Jlc3RvcmVfJyArIG1ldGhvZF9zdWZmaXgKKyAgICAgICAgICAgIHlpZWxkIG5hbWUsIGdldGF0dHIoc2VsZiwgZ2V0X25hbWUpLCBnZXRhdHRyKHNlbGYsIHJlc3RvcmVfbmFtZSkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuc2F2ZWRfdmFsdWVzID0gZGljdCgobmFtZSwgZ2V0KCkpIGZvciBuYW1lLCBnZXQsIHJlc3RvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHNlbGYucmVzb3VyY2VfaW5mbygpKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgorICAgICAgICBzYXZlZF92YWx1ZXMgPSBzZWxmLnNhdmVkX3ZhbHVlcworICAgICAgICBkZWwgc2VsZi5zYXZlZF92YWx1ZXMKKyAgICAgICAgZm9yIG5hbWUsIGdldCwgcmVzdG9yZSBpbiBzZWxmLnJlc291cmNlX2luZm8oKToKKyAgICAgICAgICAgIGN1cnJlbnQgPSBnZXQoKQorICAgICAgICAgICAgb3JpZ2luYWwgPSBzYXZlZF92YWx1ZXMucG9wKG5hbWUpCisgICAgICAgICAgICAjIENoZWNrIGZvciBjaGFuZ2VzIHRvIHRoZSByZXNvdXJjZSdzIHZhbHVlCisgICAgICAgICAgICBpZiBjdXJyZW50ICE9IG9yaWdpbmFsOgorICAgICAgICAgICAgICAgIHNlbGYuY2hhbmdlZCA9IFRydWUKKyAgICAgICAgICAgICAgICByZXN0b3JlKG9yaWdpbmFsKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnF1aWV0OgorICAgICAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmcgLS0ge30gd2FzIG1vZGlmaWVkIGJ5IHt9Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgc2VsZi50ZXN0bmFtZSkpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZSA+IDE6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIEJlZm9yZToge31cbiAgQWZ0ZXI6ICB7fSAiLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwsIGN1cnJlbnQpKQorICAgICAgICAgICAgIyBYWFggKG5jb2dobGFuKTogZm9yIG1vc3QgcmVzb3VyY2VzIChlLmcuIHN5cy5wYXRoKSBpZGVudGl0eQorICAgICAgICAgICAgIyBtYXR0ZXJzIGF0IGxlYXN0IGFzIG11Y2ggYXMgdmFsdWUuIEZvciBvdGhlcnMgKGUuZy4gY3dkKSwKKyAgICAgICAgICAgICMgaWRlbnRpdHkgaXMgaXJyZWxldmFudC4gU2hvdWxkIHdlIGFkZCBhIG1lY2hhbmlzbSB0byBjaGVjaworICAgICAgICAgICAgIyBmb3Igc3Vic3RpdHV0aW9uIGluIHRoZSBjYXNlcyB3aGVyZSBpdCBtYXR0ZXJzPworICAgICAgICByZXR1cm4gRmFsc2UKKworCitkZWYgcnVudGVzdF9pbm5lcih0ZXN0LCB2ZXJib3NlLCBxdWlldCwgaHVudHJsZWFrcz1GYWxzZSk6CisgICAgdGVzdF9zdXBwb3J0LnVubG9hZCh0ZXN0KQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIGNhcHR1cmVfc3Rkb3V0ID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIGNhcHR1cmVfc3Rkb3V0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorCisgICAgdGVzdF90aW1lID0gMC4wCisgICAgcmVmbGVhayA9IEZhbHNlICAjIFRydWUgaWYgdGhlIHRlc3QgbGVha2VkIHJlZmVyZW5jZXMuCisgICAgdHJ5OgorICAgICAgICBzYXZlX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgY2FwdHVyZV9zdGRvdXQ6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IGNhcHR1cmVfc3Rkb3V0CisgICAgICAgICAgICBpZiB0ZXN0LnN0YXJ0c3dpdGgoJ3Rlc3QuJyk6CisgICAgICAgICAgICAgICAgYWJzdGVzdCA9IHRlc3QKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBbHdheXMgaW1wb3J0IGl0IGZyb20gdGhlIHRlc3QgcGFja2FnZQorICAgICAgICAgICAgICAgIGFic3Rlc3QgPSAndGVzdC4nICsgdGVzdAorICAgICAgICAgICAgd2l0aCBzYXZlZF90ZXN0X2Vudmlyb25tZW50KHRlc3QsIHZlcmJvc2UsIHF1aWV0KSBhcyBlbnZpcm9ubWVudDoKKyAgICAgICAgICAgICAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgICAgICB0aGVfcGFja2FnZSA9IF9faW1wb3J0X18oYWJzdGVzdCwgZ2xvYmFscygpLCBsb2NhbHMoKSwgW10pCisgICAgICAgICAgICAgICAgdGhlX21vZHVsZSA9IGdldGF0dHIodGhlX3BhY2thZ2UsIHRlc3QpCisgICAgICAgICAgICAgICAgIyBPbGQgdGVzdHMgcnVuIHRvIGNvbXBsZXRpb24gc2ltcGx5IGFzIGEgc2lkZS1lZmZlY3Qgb2YKKyAgICAgICAgICAgICAgICAjIGJlaW5nIGltcG9ydGVkLiAgRm9yIHRlc3RzIGJhc2VkIG9uIHVuaXR0ZXN0IG9yIGRvY3Rlc3QsCisgICAgICAgICAgICAgICAgIyBleHBsaWNpdGx5IGludm9rZSB0aGVpciB0ZXN0X21haW4oKSBmdW5jdGlvbiAoaWYgaXQgZXhpc3RzKS4KKyAgICAgICAgICAgICAgICBpbmRpcmVjdF90ZXN0ID0gZ2V0YXR0cih0aGVfbW9kdWxlLCAidGVzdF9tYWluIiwgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiBpbmRpcmVjdF90ZXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBpbmRpcmVjdF90ZXN0KCkKKyAgICAgICAgICAgICAgICBpZiBodW50cmxlYWtzOgorICAgICAgICAgICAgICAgICAgICByZWZsZWFrID0gZGFzaF9SKHRoZV9tb2R1bGUsIHRlc3QsIGluZGlyZWN0X3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBodW50cmxlYWtzKQorICAgICAgICAgICAgICAgIHRlc3RfdGltZSA9IHRpbWUudGltZSgpIC0gc3RhcnRfdGltZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CisgICAgZXhjZXB0IHRlc3Rfc3VwcG9ydC5SZXNvdXJjZURlbmllZCwgbXNnOgorICAgICAgICBpZiBub3QgcXVpZXQ6CisgICAgICAgICAgICBwcmludCB0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZworICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgIHJldHVybiBSRVNPVVJDRV9ERU5JRUQsIHRlc3RfdGltZQorICAgIGV4Y2VwdCB1bml0dGVzdC5Ta2lwVGVzdCwgbXNnOgorICAgICAgICBpZiBub3QgcXVpZXQ6CisgICAgICAgICAgICBwcmludCB0ZXN0LCAic2tpcHBlZCAtLSIsIG1zZworICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgIHJldHVybiBTS0lQUEVELCB0ZXN0X3RpbWUKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHJhaXNlCisgICAgZXhjZXB0IHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkLCBtc2c6CisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgInRlc3QiLCB0ZXN0LCAiZmFpbGVkIC0tIiwgbXNnCisgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQorICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKKyAgICBleGNlcHQ6CisgICAgICAgIHR5cGUsIHZhbHVlID0gc3lzLmV4Y19pbmZvKClbOjJdCisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgInRlc3QiLCB0ZXN0LCAiY3Jhc2hlZCAtLSIsIHN0cih0eXBlKSArICI6IiwgdmFsdWUKKyAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQorICAgICAgICByZXR1cm4gRkFJTEVELCB0ZXN0X3RpbWUKKyAgICBlbHNlOgorICAgICAgICBpZiByZWZsZWFrOgorICAgICAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisgICAgICAgIGlmIGVudmlyb25tZW50LmNoYW5nZWQ6CisgICAgICAgICAgICByZXR1cm4gRU5WX0NIQU5HRUQsIHRlc3RfdGltZQorICAgICAgICAjIEV4Y2VwdCBpbiB2ZXJib3NlIG1vZGUsIHRlc3RzIHNob3VsZCBub3QgcHJpbnQgYW55dGhpbmcKKyAgICAgICAgaWYgdmVyYm9zZSBvciBodW50cmxlYWtzOgorICAgICAgICAgICAgcmV0dXJuIFBBU1NFRCwgdGVzdF90aW1lCisgICAgICAgIG91dHB1dCA9IGNhcHR1cmVfc3Rkb3V0LmdldHZhbHVlKCkKKyAgICAgICAgaWYgbm90IG91dHB1dDoKKyAgICAgICAgICAgIHJldHVybiBQQVNTRUQsIHRlc3RfdGltZQorICAgICAgICBwcmludCAidGVzdCIsIHRlc3QsICJwcm9kdWNlZCB1bmV4cGVjdGVkIG91dHB1dDoiCisgICAgICAgIHByaW50ICIqIiAqIDcwCisgICAgICAgIHByaW50IG91dHB1dAorICAgICAgICBwcmludCAiKiIgKiA3MAorICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisKK2RlZiBjbGVhbnVwX3Rlc3RfZHJvcHBpbmdzKHRlc3RuYW1lLCB2ZXJib3NlKToKKyAgICBpbXBvcnQgc3RhdAorICAgIGltcG9ydCBnYworCisgICAgIyBGaXJzdCBraWxsIGFueSBkYW5nbGluZyByZWZlcmVuY2VzIHRvIG9wZW4gZmlsZXMgZXRjLgorICAgIGdjLmNvbGxlY3QoKQorCisgICAgIyBUcnkgdG8gY2xlYW4gdXAganVuayBjb21tb25seSBsZWZ0IGJlaGluZC4gIFdoaWxlIHRlc3RzIHNob3VsZG4ndCBsZWF2ZQorICAgICMgYW55IGZpbGVzIG9yIGRpcmVjdG9yaWVzIGJlaGluZCwgd2hlbiBhIHRlc3QgZmFpbHMgdGhhdCBjYW4gYmUgdGVkaW91cworICAgICMgZm9yIGl0IHRvIGFycmFuZ2UuICBUaGUgY29uc2VxdWVuY2VzIGNhbiBiZSBlc3BlY2lhbGx5IG5hc3R5IG9uIFdpbmRvd3MsCisgICAgIyBzaW5jZSBpZiBhIHRlc3QgbGVhdmVzIGEgZmlsZSBvcGVuLCBpdCBjYW5ub3QgYmUgZGVsZXRlZCBieSBuYW1lICh3aGlsZQorICAgICMgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGF0IGhlcmUgZWl0aGVyLCB3ZSBjYW4gZGlzcGxheSB0aGUKKyAgICAjIG5hbWUgb2YgdGhlIG9mZmVuZGluZyB0ZXN0LCB3aGljaCBpcyBhIHJlYWwgaGVscCkuCisgICAgZm9yIG5hbWUgaW4gKHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICJkYl9ob21lIiwKKyAgICAgICAgICAgICAgICApOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobmFtZSk6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIobmFtZSk6CisgICAgICAgICAgICBraW5kLCBudWtlciA9ICJkaXJlY3RvcnkiLCBzaHV0aWwucm10cmVlCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUobmFtZSk6CisgICAgICAgICAgICBraW5kLCBudWtlciA9ICJmaWxlIiwgb3MudW5saW5rCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FcnJvcigib3MucGF0aCBzYXlzICVyIGV4aXN0cyBidXQgaXMgbmVpdGhlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5IG5vciBmaWxlIiAlIG5hbWUpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIlciBsZWZ0IGJlaGluZCAlcyAlciIgJSAodGVzdG5hbWUsIGtpbmQsIG5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgaWYgd2UgaGF2ZSBjaG1vZCwgZml4IHBvc3NpYmxlIHBlcm1pc3Npb25zIHByb2JsZW1zCisgICAgICAgICAgICAjIHRoYXQgbWlnaHQgcHJldmVudCBjbGVhbnVwCisgICAgICAgICAgICBpZiAoaGFzYXR0cihvcywgJ2NobW9kJykpOgorICAgICAgICAgICAgICAgIG9zLmNobW9kKG5hbWUsIHN0YXQuU19JUldYVSB8IHN0YXQuU19JUldYRyB8IHN0YXQuU19JUldYTykKKyAgICAgICAgICAgIG51a2VyKG5hbWUpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIG1zZzoKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICgiJXIgbGVmdCBiZWhpbmQgJXMgJXIgYW5kIGl0IGNvdWxkbid0IGJlICIKKyAgICAgICAgICAgICAgICAicmVtb3ZlZDogJXMiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lLCBtc2cpKQorCitkZWYgZGFzaF9SKHRoZV9tb2R1bGUsIHRlc3QsIGluZGlyZWN0X3Rlc3QsIGh1bnRybGVha3MpOgorICAgICIiIlJ1biBhIHRlc3QgbXVsdGlwbGUgdGltZXMsIGxvb2tpbmcgZm9yIHJlZmVyZW5jZSBsZWFrcy4KKworICAgIFJldHVybnM6CisgICAgICAgIEZhbHNlIGlmIHRoZSB0ZXN0IGRpZG4ndCBsZWFrIHJlZmVyZW5jZXM7IFRydWUgaWYgd2UgZGV0ZWN0ZWQgcmVmbGVha3MuCisgICAgIiIiCisgICAgIyBUaGlzIGNvZGUgaXMgaGFja2lzaCBhbmQgaW5lbGVnYW50LCBidXQgaXQgc2VlbXMgdG8gZG8gdGhlIGpvYi4KKyAgICBpbXBvcnQgY29weV9yZWcsIF9hYmNvbGwsIF9weWlvCisKKyAgICBpZiBub3QgaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50Jyk6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVHJhY2tpbmcgcmVmZXJlbmNlIGxlYWtzIHJlcXVpcmVzIGEgZGVidWcgYnVpbGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgIm9mIFB5dGhvbiIpCisKKyAgICAjIFNhdmUgY3VycmVudCB2YWx1ZXMgZm9yIGRhc2hfUl9jbGVhbnVwKCkgdG8gcmVzdG9yZS4KKyAgICBmcyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KKyAgICBwcyA9IGNvcHlfcmVnLmRpc3BhdGNoX3RhYmxlLmNvcHkoKQorICAgIHBpYyA9IHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmNvcHkoKQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHppcGltcG9ydAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgemRjID0gTm9uZSAjIFJ1biB1bm1vZGlmaWVkIG9uIHBsYXRmb3JtcyB3aXRob3V0IHppcGltcG9ydCBzdXBwb3J0CisgICAgZWxzZToKKyAgICAgICAgemRjID0gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLmNvcHkoKQorICAgIGFiY3MgPSB7fQorICAgIG1vZHVsZXMgPSBfYWJjb2xsLCBfcHlpbworICAgIGZvciBhYmMgaW4gW2dldGF0dHIobW9kLCBhKSBmb3IgbW9kIGluIG1vZHVsZXMgZm9yIGEgaW4gbW9kLl9fYWxsX19dOgorICAgICAgICAjIFhYWCBpc2luc3RhbmNlKGFiYywgQUJDTWV0YSkgbGVhZHMgdG8gaW5maW5pdGUgcmVjdXJzaW9uCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKGFiYywgJ19hYmNfcmVnaXN0cnknKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZvciBvYmogaW4gYWJjLl9fc3ViY2xhc3Nlc19fKCkgKyBbYWJjXToKKyAgICAgICAgICAgIGFiY3Nbb2JqXSA9IG9iai5fYWJjX3JlZ2lzdHJ5LmNvcHkoKQorCisgICAgaWYgaW5kaXJlY3RfdGVzdDoKKyAgICAgICAgZGVmIHJ1bl90aGVfdGVzdCgpOgorICAgICAgICAgICAgaW5kaXJlY3RfdGVzdCgpCisgICAgZWxzZToKKyAgICAgICAgZGVmIHJ1bl90aGVfdGVzdCgpOgorICAgICAgICAgICAgaW1wLnJlbG9hZCh0aGVfbW9kdWxlKQorCisgICAgZGVsdGFzID0gW10KKyAgICBud2FybXVwLCBudHJhY2tlZCwgZm5hbWUgPSBodW50cmxlYWtzCisgICAgZm5hbWUgPSBvcy5wYXRoLmpvaW4odGVzdF9zdXBwb3J0LlNBVkVEQ1dELCBmbmFtZSkKKyAgICByZXBjb3VudCA9IG53YXJtdXAgKyBudHJhY2tlZAorICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJiZWdpbm5pbmciLCByZXBjb3VudCwgInJlcGV0aXRpb25zIgorICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICgiMTIzNDU2Nzg5MCIqKHJlcGNvdW50Ly8xMCArIDEpKVs6cmVwY291bnRdCisgICAgZGFzaF9SX2NsZWFudXAoZnMsIHBzLCBwaWMsIHpkYywgYWJjcykKKyAgICBmb3IgaSBpbiByYW5nZShyZXBjb3VudCk6CisgICAgICAgIHJjX2JlZm9yZSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcnVuX3RoZV90ZXN0KCkKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnLicpCisgICAgICAgIGRhc2hfUl9jbGVhbnVwKGZzLCBwcywgcGljLCB6ZGMsIGFiY3MpCisgICAgICAgIHJjX2FmdGVyID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBpZiBpID49IG53YXJtdXA6CisgICAgICAgICAgICBkZWx0YXMuYXBwZW5kKHJjX2FmdGVyIC0gcmNfYmVmb3JlKQorICAgIHByaW50ID4+IHN5cy5zdGRlcnIKKyAgICBpZiBhbnkoZGVsdGFzKToKKyAgICAgICAgbXNnID0gJyVzIGxlYWtlZCAlcyByZWZlcmVuY2VzLCBzdW09JXMnICUgKHRlc3QsIGRlbHRhcywgc3VtKGRlbHRhcykpCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZworICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICJhIikgYXMgcmVmcmVwOgorICAgICAgICAgICAgcHJpbnQgPj4gcmVmcmVwLCBtc2cKKyAgICAgICAgICAgIHJlZnJlcC5mbHVzaCgpCisgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBkYXNoX1JfY2xlYW51cChmcywgcHMsIHBpYywgemRjLCBhYmNzKToKKyAgICBpbXBvcnQgZ2MsIGNvcHlfcmVnCisgICAgaW1wb3J0IF9zdHJwdGltZSwgbGluZWNhY2hlCisgICAgZGlyY2FjaGUgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnZGlyY2FjaGUnLCBkZXByZWNhdGVkPVRydWUpCisgICAgaW1wb3J0IHVybHBhcnNlLCB1cmxsaWIsIHVybGxpYjIsIG1pbWV0eXBlcywgZG9jdGVzdAorICAgIGltcG9ydCBzdHJ1Y3QsIGZpbGVjbXAKKyAgICBmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgX3BhdGhfY3JlYXRlZAorCisgICAgIyBDbGVhciB0aGUgd2FybmluZ3MgcmVnaXN0cnksIHNvIHRoZXkgY2FuIGJlIGRpc3BsYXllZCBhZ2FpbgorICAgIGZvciBtb2QgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6CisgICAgICAgIGlmIGhhc2F0dHIobW9kLCAnX193YXJuaW5ncmVnaXN0cnlfXycpOgorICAgICAgICAgICAgZGVsIG1vZC5fX3dhcm5pbmdyZWdpc3RyeV9fCisKKyAgICAjIFJlc3RvcmUgc29tZSBvcmlnaW5hbCB2YWx1ZXMuCisgICAgd2FybmluZ3MuZmlsdGVyc1s6XSA9IGZzCisgICAgY29weV9yZWcuZGlzcGF0Y2hfdGFibGUuY2xlYXIoKQorICAgIGNvcHlfcmVnLmRpc3BhdGNoX3RhYmxlLnVwZGF0ZShwcykKKyAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5jbGVhcigpCisgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUudXBkYXRlKHBpYykKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB6aXBpbXBvcnQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MgIyBSdW4gdW5tb2RpZmllZCBvbiBwbGF0Zm9ybXMgd2l0aG91dCB6aXBpbXBvcnQgc3VwcG9ydAorICAgIGVsc2U6CisgICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jbGVhcigpCisgICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS51cGRhdGUoemRjKQorCisgICAgIyBjbGVhciB0eXBlIGNhY2hlCisgICAgc3lzLl9jbGVhcl90eXBlX2NhY2hlKCkKKworICAgICMgQ2xlYXIgQUJDIHJlZ2lzdHJpZXMsIHJlc3RvcmluZyBwcmV2aW91c2x5IHNhdmVkIEFCQyByZWdpc3RyaWVzLgorICAgIGZvciBhYmMsIHJlZ2lzdHJ5IGluIGFiY3MuaXRlbXMoKToKKyAgICAgICAgYWJjLl9hYmNfcmVnaXN0cnkgPSByZWdpc3RyeS5jb3B5KCkKKyAgICAgICAgYWJjLl9hYmNfY2FjaGUuY2xlYXIoKQorICAgICAgICBhYmMuX2FiY19uZWdhdGl2ZV9jYWNoZS5jbGVhcigpCisKKyAgICAjIENsZWFyIGFzc29ydGVkIG1vZHVsZSBjYWNoZXMuCisgICAgX3BhdGhfY3JlYXRlZC5jbGVhcigpCisgICAgcmUucHVyZ2UoKQorICAgIF9zdHJwdGltZS5fcmVnZXhfY2FjaGUuY2xlYXIoKQorICAgIHVybHBhcnNlLmNsZWFyX2NhY2hlKCkKKyAgICB1cmxsaWIudXJsY2xlYW51cCgpCisgICAgdXJsbGliMi5pbnN0YWxsX29wZW5lcihOb25lKQorICAgIGRpcmNhY2hlLnJlc2V0KCkKKyAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCisgICAgbWltZXR5cGVzLl9kZWZhdWx0X21pbWVfdHlwZXMoKQorICAgIGZpbGVjbXAuX2NhY2hlLmNsZWFyKCkKKyAgICBzdHJ1Y3QuX2NsZWFyY2FjaGUoKQorICAgIGRvY3Rlc3QubWFzdGVyID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGN0eXBlcworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgIyBEb24ndCB3b3JyeSBhYm91dCByZXNldHRpbmcgdGhlIGNhY2hlIGlmIGN0eXBlcyBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBjdHlwZXMuX3Jlc2V0X2NhY2hlKCkKKworICAgICMgQ29sbGVjdCBjeWNsaWMgdHJhc2guCisgICAgZ2MuY29sbGVjdCgpCisKK2RlZiBmaW5kdGVzdGRpcihwYXRoPU5vbmUpOgorICAgIHJldHVybiBwYXRoIG9yIG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3Igb3MuY3VyZGlyCisKK2RlZiByZW1vdmVweShuYW1lcyk6CisgICAgaWYgbm90IG5hbWVzOgorICAgICAgICByZXR1cm4KKyAgICBmb3IgaWR4LCBuYW1lIGluIGVudW1lcmF0ZShuYW1lcyk6CisgICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCisgICAgICAgIGlmIGV4dCA9PSAnLnB5JzoKKyAgICAgICAgICAgIG5hbWVzW2lkeF0gPSBiYXNlbmFtZQorCitkZWYgY291bnQobiwgd29yZCk6CisgICAgaWYgbiA9PSAxOgorICAgICAgICByZXR1cm4gIiVkICVzIiAlIChuLCB3b3JkKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAiJWQgJXNzIiAlIChuLCB3b3JkKQorCitkZWYgcHJpbnRsaXN0KHgsIHdpZHRoPTcwLCBpbmRlbnQ9NCk6CisgICAgIiIiUHJpbnQgdGhlIGVsZW1lbnRzIG9mIGl0ZXJhYmxlIHggdG8gc3Rkb3V0LgorCisgICAgT3B0aW9uYWwgYXJnIHdpZHRoIChkZWZhdWx0IDcwKSBpcyB0aGUgbWF4aW11bSBsaW5lIGxlbmd0aC4KKyAgICBPcHRpb25hbCBhcmcgaW5kZW50IChkZWZhdWx0IDQpIGlzIHRoZSBudW1iZXIgb2YgYmxhbmtzIHdpdGggd2hpY2ggdG8KKyAgICBiZWdpbiBlYWNoIGxpbmUuCisgICAgIiIiCisKKyAgICBmcm9tIHRleHR3cmFwIGltcG9ydCBmaWxsCisgICAgYmxhbmtzID0gJyAnICogaW5kZW50CisgICAgIyBQcmludCB0aGUgc29ydGVkIGxpc3Q6ICd4JyBtYXkgYmUgYSAnLS1yYW5kb20nIGxpc3Qgb3IgYSBzZXQoKQorICAgIHByaW50IGZpbGwoJyAnLmpvaW4oc3RyKGVsdCkgZm9yIGVsdCBpbiBzb3J0ZWQoeCkpLCB3aWR0aCwKKyAgICAgICAgICAgICAgIGluaXRpYWxfaW5kZW50PWJsYW5rcywgc3Vic2VxdWVudF9pbmRlbnQ9YmxhbmtzKQorCisjIE1hcCBzeXMucGxhdGZvcm0gdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgYmFzZW5hbWVzIG9mIHRlc3RzCisjIGV4cGVjdGVkIHRvIGJlIHNraXBwZWQgb24gdGhhdCBwbGF0Zm9ybS4KKyMKKyMgU3BlY2lhbCBjYXNlczoKKyMgICAgIHRlc3RfcGVwMjc3CisjICAgICAgICAgVGhlIF9FeHBlY3RlZFNraXBzIGNvbnN0cnVjdG9yIGFkZHMgdGhpcyB0byB0aGUgc2V0IG9mIGV4cGVjdGVkCisjICAgICAgICAgc2tpcHMgaWYgbm90IG9zLnBhdGguc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMuCisjICAgICB0ZXN0X3RpbWVvdXQKKyMgICAgICAgICBDb250cm9sbGVkIGJ5IHRlc3RfdGltZW91dC5za2lwX2V4cGVjdGVkLiAgUmVxdWlyZXMgdGhlIG5ldHdvcmsKKyMgICAgICAgICByZXNvdXJjZSBhbmQgYSBzb2NrZXQgbW9kdWxlLgorIworIyBUZXN0cyB0aGF0IGFyZSBleHBlY3RlZCB0byBiZSBza2lwcGVkIGV2ZXJ5d2hlcmUgZXhjZXB0IG9uIG9uZSBwbGF0Zm9ybQorIyBhcmUgYWxzbyBoYW5kbGVkIHNlcGFyYXRlbHkuCisKK19leHBlY3RhdGlvbnMgPSB7CisgICAgJ3dpbjMyJzoKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3RfX2xvY2FsZQorICAgICAgICB0ZXN0X2JzZGRiMTg1CisgICAgICAgIHRlc3RfYnNkZGIzCisgICAgICAgIHRlc3RfY29tbWFuZHMKKyAgICAgICAgdGVzdF9jcnlwdAorICAgICAgICB0ZXN0X2N1cnNlcworICAgICAgICB0ZXN0X2RibQorICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZmNudGwKKyAgICAgICAgdGVzdF9mb3JrMQorICAgICAgICB0ZXN0X2Vwb2xsCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2dycAorICAgICAgICB0ZXN0X2lvY3RsCisgICAgICAgIHRlc3RfbGFyZ2VmaWxlCisgICAgICAgIHRlc3Rfa3F1ZXVlCisgICAgICAgIHRlc3RfbWhsaWIKKyAgICAgICAgdGVzdF9vcGVucHR5CisgICAgICAgIHRlc3Rfb3NzYXVkaW9kZXYKKyAgICAgICAgdGVzdF9waXBlcworICAgICAgICB0ZXN0X3BvbGwKKyAgICAgICAgdGVzdF9wb3NpeAorICAgICAgICB0ZXN0X3B0eQorICAgICAgICB0ZXN0X3B3ZAorICAgICAgICB0ZXN0X3Jlc291cmNlCisgICAgICAgIHRlc3Rfc2lnbmFsCisgICAgICAgIHRlc3RfdGhyZWFkc2lnbmFscworICAgICAgICB0ZXN0X3RpbWluZworICAgICAgICB0ZXN0X3dhaXQzCisgICAgICAgIHRlc3Rfd2FpdDQKKyAgICAgICAgIiIiLAorICAgICdsaW51eDInOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9ic2RkYjE4NQorICAgICAgICB0ZXN0X2N1cnNlcworICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfbGFyZ2VmaWxlCisgICAgICAgIHRlc3Rfa3F1ZXVlCisgICAgICAgIHRlc3Rfb3NzYXVkaW9kZXYKKyAgICAgICAgIiIiLAorICAgICd1bml4d2FyZTcnOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9ic2RkYgorICAgICAgICB0ZXN0X2JzZGRiMTg1CisgICAgICAgIHRlc3RfZGwKKyAgICAgICAgdGVzdF9lcG9sbAorICAgICAgICB0ZXN0X2xhcmdlZmlsZQorICAgICAgICB0ZXN0X2txdWV1ZQorICAgICAgICB0ZXN0X21pbmlkb20KKyAgICAgICAgdGVzdF9vcGVucHR5CisgICAgICAgIHRlc3RfcHlleHBhdAorICAgICAgICB0ZXN0X3NheAorICAgICAgICB0ZXN0X3N1bmRyeQorICAgICAgICAiIiIsCisgICAgJ29wZW51bml4OCc6CisgICAgICAgICIiIgorICAgICAgICB0ZXN0X2JzZGRiCisgICAgICAgIHRlc3RfYnNkZGIxODUKKyAgICAgICAgdGVzdF9kbAorICAgICAgICB0ZXN0X2Vwb2xsCisgICAgICAgIHRlc3RfbGFyZ2VmaWxlCisgICAgICAgIHRlc3Rfa3F1ZXVlCisgICAgICAgIHRlc3RfbWluaWRvbQorICAgICAgICB0ZXN0X29wZW5wdHkKKyAgICAgICAgdGVzdF9weWV4cGF0CisgICAgICAgIHRlc3Rfc2F4CisgICAgICAgIHRlc3Rfc3VuZHJ5CisgICAgICAgICIiIiwKKyAgICAnc2NvX3N2Myc6CisgICAgICAgICIiIgorICAgICAgICB0ZXN0X2FzeW5jaGF0CisgICAgICAgIHRlc3RfYnNkZGIKKyAgICAgICAgdGVzdF9ic2RkYjE4NQorICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZm9yazEKKyAgICAgICAgdGVzdF9lcG9sbAorICAgICAgICB0ZXN0X2dldHRleHQKKyAgICAgICAgdGVzdF9sYXJnZWZpbGUKKyAgICAgICAgdGVzdF9sb2NhbGUKKyAgICAgICAgdGVzdF9rcXVldWUKKyAgICAgICAgdGVzdF9taW5pZG9tCisgICAgICAgIHRlc3Rfb3BlbnB0eQorICAgICAgICB0ZXN0X3B5ZXhwYXQKKyAgICAgICAgdGVzdF9xdWV1ZQorICAgICAgICB0ZXN0X3NheAorICAgICAgICB0ZXN0X3N1bmRyeQorICAgICAgICB0ZXN0X3RocmVhZAorICAgICAgICB0ZXN0X3RocmVhZGVkX2ltcG9ydAorICAgICAgICB0ZXN0X3RocmVhZGVkdGVtcGZpbGUKKyAgICAgICAgdGVzdF90aHJlYWRpbmcKKyAgICAgICAgIiIiLAorICAgICdyaXNjb3MnOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9hc3luY2hhdAorICAgICAgICB0ZXN0X2F0ZXhpdAorICAgICAgICB0ZXN0X2JzZGRiCisgICAgICAgIHRlc3RfYnNkZGIxODUKKyAgICAgICAgdGVzdF9ic2RkYjMKKyAgICAgICAgdGVzdF9jb21tYW5kcworICAgICAgICB0ZXN0X2NyeXB0CisgICAgICAgIHRlc3RfZGJtCisgICAgICAgIHRlc3RfZGwKKyAgICAgICAgdGVzdF9mY250bAorICAgICAgICB0ZXN0X2ZvcmsxCisgICAgICAgIHRlc3RfZXBvbGwKKyAgICAgICAgdGVzdF9nZGJtCisgICAgICAgIHRlc3RfZ3JwCisgICAgICAgIHRlc3RfbGFyZ2VmaWxlCisgICAgICAgIHRlc3RfbG9jYWxlCisgICAgICAgIHRlc3Rfa3F1ZXVlCisgICAgICAgIHRlc3RfbW1hcAorICAgICAgICB0ZXN0X29wZW5wdHkKKyAgICAgICAgdGVzdF9wb2xsCisgICAgICAgIHRlc3RfcG9wZW4yCisgICAgICAgIHRlc3RfcHR5CisgICAgICAgIHRlc3RfcHdkCisgICAgICAgIHRlc3Rfc3Ryb3AKKyAgICAgICAgdGVzdF9zdW5kcnkKKyAgICAgICAgdGVzdF90aHJlYWQKKyAgICAgICAgdGVzdF90aHJlYWRlZF9pbXBvcnQKKyAgICAgICAgdGVzdF90aHJlYWRlZHRlbXBmaWxlCisgICAgICAgIHRlc3RfdGhyZWFkaW5nCisgICAgICAgIHRlc3RfdGltaW5nCisgICAgICAgICIiIiwKKyAgICAnZGFyd2luJzoKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3RfX2xvY2FsZQorICAgICAgICB0ZXN0X2JzZGRiCisgICAgICAgIHRlc3RfYnNkZGIzCisgICAgICAgIHRlc3RfY3Vyc2VzCisgICAgICAgIHRlc3RfZXBvbGwKKyAgICAgICAgdGVzdF9nZGIKKyAgICAgICAgdGVzdF9nZGJtCisgICAgICAgIHRlc3RfbGFyZ2VmaWxlCisgICAgICAgIHRlc3RfbG9jYWxlCisgICAgICAgIHRlc3Rfa3F1ZXVlCisgICAgICAgIHRlc3RfbWluaWRvbQorICAgICAgICB0ZXN0X29zc2F1ZGlvZGV2CisgICAgICAgIHRlc3RfcG9sbAorICAgICAgICAiIiIsCisgICAgJ3N1bm9zNSc6CisgICAgICAgICIiIgorICAgICAgICB0ZXN0X2JzZGRiCisgICAgICAgIHRlc3RfYnNkZGIxODUKKyAgICAgICAgdGVzdF9jdXJzZXMKKyAgICAgICAgdGVzdF9kYm0KKyAgICAgICAgdGVzdF9lcG9sbAorICAgICAgICB0ZXN0X2txdWV1ZQorICAgICAgICB0ZXN0X2dkYm0KKyAgICAgICAgdGVzdF9nemlwCisgICAgICAgIHRlc3Rfb3BlbnB0eQorICAgICAgICB0ZXN0X3ppcGZpbGUKKyAgICAgICAgdGVzdF96bGliCisgICAgICAgICIiIiwKKyAgICAnaHAtdXgxMSc6CisgICAgICAgICIiIgorICAgICAgICB0ZXN0X2JzZGRiCisgICAgICAgIHRlc3RfYnNkZGIxODUKKyAgICAgICAgdGVzdF9jdXJzZXMKKyAgICAgICAgdGVzdF9kbAorICAgICAgICB0ZXN0X2Vwb2xsCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2d6aXAKKyAgICAgICAgdGVzdF9sYXJnZWZpbGUKKyAgICAgICAgdGVzdF9sb2NhbGUKKyAgICAgICAgdGVzdF9rcXVldWUKKyAgICAgICAgdGVzdF9taW5pZG9tCisgICAgICAgIHRlc3Rfb3BlbnB0eQorICAgICAgICB0ZXN0X3B5ZXhwYXQKKyAgICAgICAgdGVzdF9zYXgKKyAgICAgICAgdGVzdF96aXBmaWxlCisgICAgICAgIHRlc3RfemxpYgorICAgICAgICAiIiIsCisgICAgJ2F0aGVvcyc6CisgICAgICAgICIiIgorICAgICAgICB0ZXN0X2JzZGRiMTg1CisgICAgICAgIHRlc3RfY3Vyc2VzCisgICAgICAgIHRlc3RfZGwKKyAgICAgICAgdGVzdF9nZGJtCisgICAgICAgIHRlc3RfZXBvbGwKKyAgICAgICAgdGVzdF9sYXJnZWZpbGUKKyAgICAgICAgdGVzdF9sb2NhbGUKKyAgICAgICAgdGVzdF9rcXVldWUKKyAgICAgICAgdGVzdF9taGxpYgorICAgICAgICB0ZXN0X21tYXAKKyAgICAgICAgdGVzdF9wb2xsCisgICAgICAgIHRlc3RfcG9wZW4yCisgICAgICAgIHRlc3RfcmVzb3VyY2UKKyAgICAgICAgIiIiLAorICAgICdjeWd3aW4nOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9ic2RkYjE4NQorICAgICAgICB0ZXN0X2JzZGRiMworICAgICAgICB0ZXN0X2N1cnNlcworICAgICAgICB0ZXN0X2RibQorICAgICAgICB0ZXN0X2Vwb2xsCisgICAgICAgIHRlc3RfaW9jdGwKKyAgICAgICAgdGVzdF9rcXVldWUKKyAgICAgICAgdGVzdF9sYXJnZWZpbGUKKyAgICAgICAgdGVzdF9sb2NhbGUKKyAgICAgICAgdGVzdF9vc3NhdWRpb2RldgorICAgICAgICB0ZXN0X3NvY2tldHNlcnZlcgorICAgICAgICAiIiIsCisgICAgJ29zMmVteCc6CisgICAgICAgICIiIgorICAgICAgICB0ZXN0X2F1ZGlvb3AKKyAgICAgICAgdGVzdF9ic2RkYjE4NQorICAgICAgICB0ZXN0X2JzZGRiMworICAgICAgICB0ZXN0X2NvbW1hbmRzCisgICAgICAgIHRlc3RfY3Vyc2VzCisgICAgICAgIHRlc3RfZGwKKyAgICAgICAgdGVzdF9lcG9sbAorICAgICAgICB0ZXN0X2txdWV1ZQorICAgICAgICB0ZXN0X2xhcmdlZmlsZQorICAgICAgICB0ZXN0X21obGliCisgICAgICAgIHRlc3RfbW1hcAorICAgICAgICB0ZXN0X29wZW5wdHkKKyAgICAgICAgdGVzdF9vc3NhdWRpb2RldgorICAgICAgICB0ZXN0X3B0eQorICAgICAgICB0ZXN0X3Jlc291cmNlCisgICAgICAgIHRlc3Rfc2lnbmFsCisgICAgICAgICIiIiwKKyAgICAnZnJlZWJzZDQnOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9ic2RkYgorICAgICAgICB0ZXN0X2JzZGRiMworICAgICAgICB0ZXN0X2Vwb2xsCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2xvY2FsZQorICAgICAgICB0ZXN0X29zc2F1ZGlvZGV2CisgICAgICAgIHRlc3RfcGVwMjc3CisgICAgICAgIHRlc3RfcHR5CisgICAgICAgIHRlc3Rfc29ja2V0c2VydmVyCisgICAgICAgIHRlc3RfdGNsCisgICAgICAgIHRlc3RfdGsKKyAgICAgICAgdGVzdF90dGtfZ3Vpb25seQorICAgICAgICB0ZXN0X3R0a190ZXh0b25seQorICAgICAgICB0ZXN0X3RpbWVvdXQKKyAgICAgICAgdGVzdF91cmxsaWJuZXQKKyAgICAgICAgdGVzdF9tdWx0aXByb2Nlc3NpbmcKKyAgICAgICAgIiIiLAorICAgICdhaXg1JzoKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3RfYnNkZGIKKyAgICAgICAgdGVzdF9ic2RkYjE4NQorICAgICAgICB0ZXN0X2JzZGRiMworICAgICAgICB0ZXN0X2J6MgorICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZXBvbGwKKyAgICAgICAgdGVzdF9nZGJtCisgICAgICAgIHRlc3RfZ3ppcAorICAgICAgICB0ZXN0X2txdWV1ZQorICAgICAgICB0ZXN0X29zc2F1ZGlvZGV2CisgICAgICAgIHRlc3RfdGNsCisgICAgICAgIHRlc3RfdGsKKyAgICAgICAgdGVzdF90dGtfZ3Vpb25seQorICAgICAgICB0ZXN0X3R0a190ZXh0b25seQorICAgICAgICB0ZXN0X3ppcGltcG9ydAorICAgICAgICB0ZXN0X3psaWIKKyAgICAgICAgIiIiLAorICAgICdvcGVuYnNkMyc6CisgICAgICAgICIiIgorICAgICAgICB0ZXN0X2FzY2lpX2Zvcm1hdGQKKyAgICAgICAgdGVzdF9ic2RkYgorICAgICAgICB0ZXN0X2JzZGRiMworICAgICAgICB0ZXN0X2N0eXBlcworICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZXBvbGwKKyAgICAgICAgdGVzdF9nZGJtCisgICAgICAgIHRlc3RfbG9jYWxlCisgICAgICAgIHRlc3Rfbm9ybWFsaXphdGlvbgorICAgICAgICB0ZXN0X29zc2F1ZGlvZGV2CisgICAgICAgIHRlc3RfcGVwMjc3CisgICAgICAgIHRlc3RfdGNsCisgICAgICAgIHRlc3RfdGsKKyAgICAgICAgdGVzdF90dGtfZ3Vpb25seQorICAgICAgICB0ZXN0X3R0a190ZXh0b25seQorICAgICAgICB0ZXN0X211bHRpcHJvY2Vzc2luZworICAgICAgICAiIiIsCisgICAgJ25ldGJzZDMnOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9hc2NpaV9mb3JtYXRkCisgICAgICAgIHRlc3RfYnNkZGIKKyAgICAgICAgdGVzdF9ic2RkYjE4NQorICAgICAgICB0ZXN0X2JzZGRiMworICAgICAgICB0ZXN0X2N0eXBlcworICAgICAgICB0ZXN0X2N1cnNlcworICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZXBvbGwKKyAgICAgICAgdGVzdF9nZGJtCisgICAgICAgIHRlc3RfbG9jYWxlCisgICAgICAgIHRlc3Rfb3NzYXVkaW9kZXYKKyAgICAgICAgdGVzdF9wZXAyNzcKKyAgICAgICAgdGVzdF90Y2wKKyAgICAgICAgdGVzdF90aworICAgICAgICB0ZXN0X3R0a19ndWlvbmx5CisgICAgICAgIHRlc3RfdHRrX3RleHRvbmx5CisgICAgICAgIHRlc3RfbXVsdGlwcm9jZXNzaW5nCisgICAgICAgICIiIiwKK30KK19leHBlY3RhdGlvbnNbJ2ZyZWVic2Q1J10gPSBfZXhwZWN0YXRpb25zWydmcmVlYnNkNCddCitfZXhwZWN0YXRpb25zWydmcmVlYnNkNiddID0gX2V4cGVjdGF0aW9uc1snZnJlZWJzZDQnXQorX2V4cGVjdGF0aW9uc1snZnJlZWJzZDcnXSA9IF9leHBlY3RhdGlvbnNbJ2ZyZWVic2Q0J10KK19leHBlY3RhdGlvbnNbJ2ZyZWVic2Q4J10gPSBfZXhwZWN0YXRpb25zWydmcmVlYnNkNCddCisKK2NsYXNzIF9FeHBlY3RlZFNraXBzOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgaW1wb3J0IG9zLnBhdGgKKyAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3RpbWVvdXQKKworICAgICAgICBzZWxmLnZhbGlkID0gRmFsc2UKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluIF9leHBlY3RhdGlvbnM6CisgICAgICAgICAgICBzID0gX2V4cGVjdGF0aW9uc1tzeXMucGxhdGZvcm1dCisgICAgICAgICAgICBzZWxmLmV4cGVjdGVkID0gc2V0KHMuc3BsaXQoKSkKKworICAgICAgICAgICAgIyBleHBlY3RlZCB0byBiZSBza2lwcGVkIG9uIGV2ZXJ5IHBsYXRmb3JtLCBldmVuIExpbnV4CisgICAgICAgICAgICBzZWxmLmV4cGVjdGVkLmFkZCgndGVzdF9saW51eGF1ZGlvZGV2JykKKworICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXM6CisgICAgICAgICAgICAgICAgc2VsZi5leHBlY3RlZC5hZGQoJ3Rlc3RfcGVwMjc3JykKKworICAgICAgICAgICAgaWYgdGVzdF90aW1lb3V0LnNraXBfZXhwZWN0ZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5leHBlY3RlZC5hZGQoJ3Rlc3RfdGltZW91dCcpCisKKyAgICAgICAgICAgIGlmIHN5cy5tYXhpbnQgPT0gOTIyMzM3MjAzNjg1NDc3NTgwN0w6CisgICAgICAgICAgICAgICAgc2VsZi5leHBlY3RlZC5hZGQoJ3Rlc3RfaW1hZ2VvcCcpCisKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAiZGFyd2luIjoKKyAgICAgICAgICAgICAgICBNQUNfT05MWSA9IFsidGVzdF9tYWNvcyIsICJ0ZXN0X21hY29zdG9vbHMiLCAidGVzdF9hZXBhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X3BsaXN0bGliIiwgInRlc3Rfc2NyaXB0cGFja2FnZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X2FwcGxlc2luZ2xlIl0KKyAgICAgICAgICAgICAgICBmb3Igc2tpcCBpbiBNQUNfT05MWToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBlY3RlZC5hZGQoc2tpcCkKKyAgICAgICAgICAgIGVsaWYgbGVuKHUnXDAnLmVuY29kZSgndW5pY29kZS1pbnRlcm5hbCcpKSA9PSA0OgorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0ZWQuYWRkKCJ0ZXN0X21hY29zdG9vbHMiKQorCisKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAid2luMzIiOgorICAgICAgICAgICAgICAgICMgdGVzdF9zcWxpdGUgaXMgb25seSByZWxpYWJsZSBvbiBXaW5kb3dzIHdoZXJlIHRoZSBsaWJyYXJ5CisgICAgICAgICAgICAgICAgIyBpcyBkaXN0cmlidXRlZCB3aXRoIFB5dGhvbgorICAgICAgICAgICAgICAgIFdJTl9PTkxZID0gWyJ0ZXN0X3VuaWNvZGVfZmlsZSIsICJ0ZXN0X3dpbnJlZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Rfd2luc291bmQiLCAidGVzdF9zdGFydGZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X3NxbGl0ZSIsICJ0ZXN0X21zaWxpYiJdCisgICAgICAgICAgICAgICAgZm9yIHNraXAgaW4gV0lOX09OTFk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0ZWQuYWRkKHNraXApCisKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnaXJpeCc6CisgICAgICAgICAgICAgICAgSVJJWF9PTkxZID0gWyJ0ZXN0X2ltYWdlb3AiLCAidGVzdF9hbCIsICJ0ZXN0X2NkIiwgInRlc3RfY2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF9nbCIsICJ0ZXN0X2ltZ2ZpbGUiXQorICAgICAgICAgICAgICAgIGZvciBza2lwIGluIElSSVhfT05MWToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5leHBlY3RlZC5hZGQoc2tpcCkKKworICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICdzdW5vczUnOgorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0ZWQuYWRkKCd0ZXN0X3N1bmF1ZGlvZGV2JykKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGVjdGVkLmFkZCgndGVzdF9uaXMnKQorCisgICAgICAgICAgICBpZiBub3Qgc3lzLnB5M2t3YXJuaW5nOgorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0ZWQuYWRkKCd0ZXN0X3B5M2t3YXJuJykKKworICAgICAgICAgICAgc2VsZi52YWxpZCA9IFRydWUKKworICAgIGRlZiBpc3ZhbGlkKHNlbGYpOgorICAgICAgICAiUmV0dXJuIHRydWUgaWZmIF9FeHBlY3RlZFNraXBzIGtub3dzIGFib3V0IHRoZSBjdXJyZW50IHBsYXRmb3JtLiIKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsaWQKKworICAgIGRlZiBnZXRleHBlY3RlZChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHNldCBvZiB0ZXN0IG5hbWVzIHdlIGV4cGVjdCB0byBza2lwIG9uIGN1cnJlbnQgcGxhdGZvcm0uCisKKyAgICAgICAgc2VsZi5pc3ZhbGlkKCkgbXVzdCBiZSB0cnVlLgorICAgICAgICAiIiIKKworICAgICAgICBhc3NlcnQgc2VsZi5pc3ZhbGlkKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwZWN0ZWQKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAjIGZpbmR0ZXN0ZGlyKCkgZ2V0cyB0aGUgZGlybmFtZSBvdXQgb2YgX19maWxlX18sIHNvIHdlIGhhdmUgdG8gbWFrZSBpdAorICAgICMgYWJzb2x1dGUgYmVmb3JlIGNoYW5naW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAjIEZvciBleGFtcGxlIF9fZmlsZV9fIG1heSBiZSByZWxhdGl2ZSB3aGVuIHJ1bm5pbmcgdHJhY2Ugb3IgcHJvZmlsZS4KKyAgICAjIFNlZSBpc3N1ZSAjOTMyMy4KKyAgICBfX2ZpbGVfXyA9IG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykKKworICAgICMgc2FuaXR5IGNoZWNrCisgICAgYXNzZXJ0IF9fZmlsZV9fID09IG9zLnBhdGguYWJzcGF0aChzeXMuYXJndlswXSkKKworICAgICMgV2hlbiB0ZXN0cyBhcmUgcnVuIGZyb20gdGhlIFB5dGhvbiBidWlsZCBkaXJlY3RvcnksIGl0IGlzIGJlc3QgcHJhY3RpY2UKKyAgICAjIHRvIGtlZXAgdGhlIHRlc3QgZmlsZXMgaW4gYSBzdWJmb2xkZXIuICBJdCBlYXNlcyB0aGUgY2xlYW51cCBvZiBsZWZ0b3ZlcgorICAgICMgZmlsZXMgdXNpbmcgY29tbWFuZCAibWFrZSBkaXN0Y2xlYW4iLgorICAgIGlmIHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKKyAgICAgICAgVEVNUERJUiA9IG9zLnBhdGguYWJzcGF0aCgnYnVpbGQnKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoVEVNUERJUik6CisgICAgICAgICAgICBvcy5ta2RpcihURU1QRElSKQorCisgICAgIyBEZWZpbmUgYSB3cml0YWJsZSB0ZW1wIGRpciB0aGF0IHdpbGwgYmUgdXNlZCBhcyBjd2Qgd2hpbGUgcnVubmluZworICAgICMgdGhlIHRlc3RzLiBUaGUgbmFtZSBvZiB0aGUgZGlyIGluY2x1ZGVzIHRoZSBwaWQgdG8gYWxsb3cgcGFyYWxsZWwKKyAgICAjIHRlc3RpbmcgKHNlZSB0aGUgLWogb3B0aW9uKS4KKyAgICBURVNUQ1dEID0gJ3Rlc3RfcHl0aG9uX3t9Jy5mb3JtYXQob3MuZ2V0cGlkKCkpCisKKyAgICBURVNUQ1dEID0gb3MucGF0aC5qb2luKFRFTVBESVIsIFRFU1RDV0QpCisKKyAgICAjIFJ1biB0aGUgdGVzdHMgaW4gYSBjb250ZXh0IG1hbmFnZXIgdGhhdCB0ZW1wb3JhcnkgY2hhbmdlcyB0aGUgQ1dEIHRvIGEKKyAgICAjIHRlbXBvcmFyeSBhbmQgd3JpdGFibGUgZGlyZWN0b3J5LiBJZiBpdCdzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgb3IKKyAgICAjIGNoYW5nZSB0aGUgQ1dELCB0aGUgb3JpZ2luYWwgQ1dEIHdpbGwgYmUgdXNlZC4gVGhlIG9yaWdpbmFsIENXRCBpcworICAgICMgYXZhaWxhYmxlIGZyb20gdGVzdF9zdXBwb3J0LlNBVkVEQ1dELgorICAgIHdpdGggdGVzdF9zdXBwb3J0LnRlbXBfY3dkKFRFU1RDV0QsIHF1aWV0PVRydWUpOgorICAgICAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9yZWdydGVzdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVncnRlc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZGU3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVncnRlc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9yZWdydGVzdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVncnRlc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZjVmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVncnRlc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9yZWxpbXBvcnQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVsaW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYWE0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVsaW1wb3J0LnB5CkBAIC0wLDAgKzEgQEAKK2Zyb20gLnRlc3RfaW1wb3J0IGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcmVsaW1wb3J0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9yZWxpbXBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MzQwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVsaW1wb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcmVsaW1wb3J0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9yZWxpbXBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MzQwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVsaW1wb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcmVwZXJmLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlcGVyZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGFjNDBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlcGVyZi5weQpAQCAtMCwwICsxLDIzIEBACitpbXBvcnQgcmUKK2ltcG9ydCB0aW1lCisKK2RlZiBtYWluKCk6CisgICAgcyA9ICJcMTNoZWxsb1wxNCBcMTN3b3JsZFwxNCAiICogMTAwMAorICAgIHAgPSByZS5jb21waWxlKHIiKFtcMTNcMTRdKSIpCisgICAgdGltZWZ1bmMoMTAsIHAuc3ViLCAiIiwgcykKKyAgICB0aW1lZnVuYygxMCwgcC5zcGxpdCwgcykKKyAgICB0aW1lZnVuYygxMCwgcC5maW5kYWxsLCBzKQorCitkZWYgdGltZWZ1bmMobiwgZnVuYywgKmFyZ3MsICoqa3cpOgorICAgIHQwID0gdGltZS5jbG9jaygpCisgICAgdHJ5OgorICAgICAgICBmb3IgaSBpbiByYW5nZShuKToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMoKmFyZ3MsICoqa3cpCisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICBmaW5hbGx5OgorICAgICAgICB0MSA9IHRpbWUuY2xvY2soKQorICAgICAgICBpZiBuID4gMToKKyAgICAgICAgICAgIHByaW50IG4sICJ0aW1lcyIsCisgICAgICAgIHByaW50IGZ1bmMuX19uYW1lX18sICIlLjNmIiAlICh0MS10MCksICJDUFUgc2Vjb25kcyIKKworbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcmVwZXJmLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9yZXBlcmYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYmYyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVwZXJmLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcmVwZXJmLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9yZXBlcmYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYmYyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVwZXJmLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhZGVlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdC5weQpAQCAtMCwwICsxLDc2IEBACisiIiJUaGlzIGlzIGEgc2FtcGxlIG1vZHVsZSB0aGF0IGRvZXNuJ3QgcmVhbGx5IHRlc3QgYW55dGhpbmcgYWxsIHRoYXQKKyAgIGludGVyZXN0aW5nLgorCitJdCBzaW1wbHkgaGFzIGEgZmV3IHRlc3RzLCBzb21lIG9mIHdoaWNoIHN1Y2NlZWQgYW5kIHNvbWUgb2Ygd2hpY2ggZmFpbC4KKworSXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgbnVtYmVycyByZW1haW4gY29uc3RhbnQgYXMgYW5vdGhlciB0ZXN0IGlzCit0ZXN0aW5nIHRoZSBydW5uaW5nIG9mIHRoZXNlIHRlc3RzLgorCisKKz4+PiAyKzIKKzQKKyIiIgorCisKK2RlZiBmb28oKToKKyAgICAiIiIKKworICAgID4+PiAyKzIKKyAgICA1CisKKyAgICA+Pj4gMisyCisgICAgNAorICAgICIiIgorCitkZWYgYmFyKCk6CisgICAgIiIiCisKKyAgICA+Pj4gMisyCisgICAgNAorICAgICIiIgorCitkZWYgdGVzdF9zaWxseV9zZXR1cCgpOgorICAgICIiIgorCisgICAgPj4+IGltcG9ydCB0ZXN0LnRlc3RfZG9jdGVzdAorICAgID4+PiB0ZXN0LnRlc3RfZG9jdGVzdC5zaWxseVNldHVwCisgICAgVHJ1ZQorICAgICIiIgorCitkZWYgd19ibGFuaygpOgorICAgICIiIgorICAgID4+PiBpZiAxOgorICAgIC4uLiAgICBwcmludCAnYScKKyAgICAuLi4gICAgcHJpbnQKKyAgICAuLi4gICAgcHJpbnQgJ2InCisgICAgYQorICAgIDxCTEFOS0xJTkU+CisgICAgYgorICAgICIiIgorCit4ID0gMQorZGVmIHhfaXNfb25lKCk6CisgICAgIiIiCisgICAgPj4+IHgKKyAgICAxCisgICAgIiIiCisKK2RlZiB5X2lzX29uZSgpOgorICAgICIiIgorICAgID4+PiB5CisgICAgMQorICAgICIiIgorCitfX3Rlc3RfXyA9IHsnZ29vZCc6ICIiIgorICAgICAgICAgICAgICAgICAgICA+Pj4gNDIKKyAgICAgICAgICAgICAgICAgICAgNDIKKyAgICAgICAgICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgJ2JhZCc6ICAiIiIKKyAgICAgICAgICAgICAgICAgICAgPj4+IDQyCisgICAgICAgICAgICAgICAgICAgIDY2NgorICAgICAgICAgICAgICAgICAgICAiIiIsCisgICAgICAgICAgIH0KKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICBpbXBvcnQgZG9jdGVzdAorICAgIHJldHVybiBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZSgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjA1NzIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjA1NzIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jc3RyaW5ncy5weSBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MjAxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jc3RyaW5ncy5weQpAQCAtMCwwICsxLDEyIEBACisjIFRoaXMgaXMgYSBzYW1wbGUgbW9kdWxlIHVzZWQgZm9yIHRlc3RpbmcgZG9jdGVzdC4KKyMKKyMgVGhpcyBtb2R1bGUgaXMgZm9yIHRlc3RpbmcgaG93IGRvY3Rlc3QgaGFuZGxlcyBhIG1vZHVsZSB3aXRoIG5vCisjIGRvY3N0cmluZ3MuCisKKworY2xhc3MgRm9vKG9iamVjdCk6CisKKyAgICAjIEEgY2xhc3Mgd2l0aCBubyBkb2NzdHJpbmcuCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDkyODYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0X25vX2RvY3N0cmluZ3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDkyODYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0X25vX2RvY3N0cmluZ3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2N0ZXN0cy5weSBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2N0ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGFhNTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0X25vX2RvY3Rlc3RzLnB5CkBAIC0wLDAgKzEsMTUgQEAKKyIiIlRoaXMgaXMgYSBzYW1wbGUgbW9kdWxlIHVzZWQgZm9yIHRlc3RpbmcgZG9jdGVzdC4KKworVGhpcyBtb2R1bGUgaXMgZm9yIHRlc3RpbmcgaG93IGRvY3Rlc3QgaGFuZGxlcyBhIG1vZHVsZSB3aXRoIGRvY3N0cmluZ3MKK2J1dCBubyBkb2N0ZXN0IGV4YW1wbGVzLgorCisiIiIKKworCitjbGFzcyBGb28ob2JqZWN0KToKKyAgICAiIiJBIGRvY3N0cmluZyB3aXRoIG5vIGRvY3Rlc3QgZXhhbXBsZXMuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0X25vX2RvY3Rlc3RzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2N0ZXN0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlOGNhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2N0ZXN0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0X25vX2RvY3Rlc3RzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2N0ZXN0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlOGNhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2N0ZXN0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3NjcmlwdF9oZWxwZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2NyaXB0X2hlbHBlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjdjNzBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NjcmlwdF9oZWxwZXIucHkKQEAgLTAsMCArMSwxNzAgQEAKKyMgQ29tbW9uIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgYnkgdmFyaW91cyBzY3JpcHQgZXhlY3V0aW9uIHRlc3RzCisjICBlLmcuIHRlc3RfY21kX2xpbmUsIHRlc3RfY21kX2xpbmVfc2NyaXB0IGFuZCB0ZXN0X3J1bnB5CisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHB5X2NvbXBpbGUKK2ltcG9ydCBjb250ZXh0bGliCitpbXBvcnQgc2h1dGlsCit0cnk6CisgICAgaW1wb3J0IHppcGZpbGUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIElmIFB5dGhvbiBpcyBidWlsZCB3aXRob3V0IFVuaWNvZGUgc3VwcG9ydCwgaW1wb3J0aW5nIF9pbyB3aWxsCisgICAgIyBmYWlsLCB3aGljaCwgaW4gdHVybiwgbWVhbnMgdGhhdCB6aXBmaWxlIGNhbm5vdCBiZSBpbXBvcnRlZAorICAgICMgTW9zdCBvZiB0aGlzIG1vZHVsZSBjYW4gdGhlbiBzdGlsbCBiZSB1c2VkLgorICAgIHBhc3MKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgc3RyaXBfcHl0aG9uX3N0ZGVycgorCisjIEV4ZWN1dGluZyB0aGUgaW50ZXJwcmV0ZXIgaW4gYSBzdWJwcm9jZXNzCitkZWYgX2Fzc2VydF9weXRob24oZXhwZWN0ZWRfc3VjY2VzcywgKmFyZ3MsICoqZW52X3ZhcnMpOgorICAgIGNtZF9saW5lID0gW3N5cy5leGVjdXRhYmxlXQorICAgIGlmIG5vdCBlbnZfdmFyczoKKyAgICAgICAgY21kX2xpbmUuYXBwZW5kKCctRScpCisgICAgY21kX2xpbmUuZXh0ZW5kKGFyZ3MpCisgICAgIyBOZWVkIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBlbnZpcm9ubWVudCwgZm9yIGluLXBsYWNlIHRlc3Rpbmcgb2YKKyAgICAjIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkcy4KKyAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgIGVudi51cGRhdGUoZW52X3ZhcnMpCisgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kX2xpbmUsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1lbnYpCisgICAgdHJ5OgorICAgICAgICBvdXQsIGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgIGZpbmFsbHk6CisgICAgICAgIHN1YnByb2Nlc3MuX2NsZWFudXAoKQorICAgICAgICBwLnN0ZG91dC5jbG9zZSgpCisgICAgICAgIHAuc3RkZXJyLmNsb3NlKCkKKyAgICByYyA9IHAucmV0dXJuY29kZQorICAgIGVyciA9ICBzdHJpcF9weXRob25fc3RkZXJyKGVycikKKyAgICBpZiAocmMgYW5kIGV4cGVjdGVkX3N1Y2Nlc3MpIG9yIChub3QgcmMgYW5kIG5vdCBleHBlY3RlZF9zdWNjZXNzKToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgICAiUHJvY2VzcyByZXR1cm4gY29kZSBpcyAlZCwgIgorICAgICAgICAgICAgInN0ZGVyciBmb2xsb3dzOlxuJXMiICUgKHJjLCBlcnIuZGVjb2RlKCdhc2NpaScsICdpZ25vcmUnKSkpCisgICAgcmV0dXJuIHJjLCBvdXQsIGVycgorCitkZWYgYXNzZXJ0X3B5dGhvbl9vaygqYXJncywgKiplbnZfdmFycyk6CisgICAgIiIiCisgICAgQXNzZXJ0IHRoYXQgcnVubmluZyB0aGUgaW50ZXJwcmV0ZXIgd2l0aCBgYXJnc2AgYW5kIG9wdGlvbmFsIGVudmlyb25tZW50CisgICAgdmFyaWFibGVzIGBlbnZfdmFyc2AgaXMgb2sgYW5kIHJldHVybiBhIChyZXR1cm4gY29kZSwgc3Rkb3V0LCBzdGRlcnIpIHR1cGxlLgorICAgICIiIgorICAgIHJldHVybiBfYXNzZXJ0X3B5dGhvbihUcnVlLCAqYXJncywgKiplbnZfdmFycykKKworZGVmIGFzc2VydF9weXRob25fZmFpbHVyZSgqYXJncywgKiplbnZfdmFycyk6CisgICAgIiIiCisgICAgQXNzZXJ0IHRoYXQgcnVubmluZyB0aGUgaW50ZXJwcmV0ZXIgd2l0aCBgYXJnc2AgYW5kIG9wdGlvbmFsIGVudmlyb25tZW50CisgICAgdmFyaWFibGVzIGBlbnZfdmFyc2AgZmFpbHMgYW5kIHJldHVybiBhIChyZXR1cm4gY29kZSwgc3Rkb3V0LCBzdGRlcnIpIHR1cGxlLgorICAgICIiIgorICAgIHJldHVybiBfYXNzZXJ0X3B5dGhvbihGYWxzZSwgKmFyZ3MsICoqZW52X3ZhcnMpCisKK2RlZiBweXRob25fZXhpdF9jb2RlKCphcmdzKToKKyAgICBjbWRfbGluZSA9IFtzeXMuZXhlY3V0YWJsZSwgJy1FJ10KKyAgICBjbWRfbGluZS5leHRlbmQoYXJncykKKyAgICB3aXRoIG9wZW4ob3MuZGV2bnVsbCwgJ3cnKSBhcyBkZXZudWxsOgorICAgICAgICByZXR1cm4gc3VicHJvY2Vzcy5jYWxsKGNtZF9saW5lLCBzdGRvdXQ9ZGV2bnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorCitkZWYgc3Bhd25fcHl0aG9uKCphcmdzLCAqKmt3YXJncyk6CisgICAgY21kX2xpbmUgPSBbc3lzLmV4ZWN1dGFibGUsICctRSddCisgICAgY21kX2xpbmUuZXh0ZW5kKGFyZ3MpCisgICAgcmV0dXJuIHN1YnByb2Nlc3MuUG9wZW4oY21kX2xpbmUsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCisKK2RlZiBraWxsX3B5dGhvbihwKToKKyAgICBwLnN0ZGluLmNsb3NlKCkKKyAgICBkYXRhID0gcC5zdGRvdXQucmVhZCgpCisgICAgcC5zdGRvdXQuY2xvc2UoKQorICAgICMgdHJ5IHRvIGNsZWFudXAgdGhlIGNoaWxkIHNvIHdlIGRvbid0IGFwcGVhciB0byBsZWFrIHdoZW4gcnVubmluZworICAgICMgd2l0aCByZWdydGVzdCAtUi4KKyAgICBwLndhaXQoKQorICAgIHN1YnByb2Nlc3MuX2NsZWFudXAoKQorICAgIHJldHVybiBkYXRhCisKK2RlZiBydW5fcHl0aG9uKCphcmdzLCAqKmt3YXJncyk6CisgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICBwID0gc3Bhd25fcHl0aG9uKCphcmdzLCAqKmt3YXJncykKKyAgICBlbHNlOgorICAgICAgICBwID0gc3Bhd25fcHl0aG9uKCctTycsICphcmdzLCAqKmt3YXJncykKKyAgICBzdGRvdXRfZGF0YSA9IGtpbGxfcHl0aG9uKHApCisgICAgcmV0dXJuIHAud2FpdCgpLCBzdGRvdXRfZGF0YQorCisjIFNjcmlwdCBjcmVhdGlvbiB1dGlsaXRpZXMKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgdGVtcF9kaXIoKToKKyAgICBkaXJuYW1lID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgZGlybmFtZSA9IG9zLnBhdGgucmVhbHBhdGgoZGlybmFtZSkKKyAgICB0cnk6CisgICAgICAgIHlpZWxkIGRpcm5hbWUKKyAgICBmaW5hbGx5OgorICAgICAgICBzaHV0aWwucm10cmVlKGRpcm5hbWUpCisKK2RlZiBtYWtlX3NjcmlwdChzY3JpcHRfZGlyLCBzY3JpcHRfYmFzZW5hbWUsIHNvdXJjZSk6CisgICAgc2NyaXB0X2ZpbGVuYW1lID0gc2NyaXB0X2Jhc2VuYW1lK29zLmV4dHNlcCsncHknCisgICAgc2NyaXB0X25hbWUgPSBvcy5wYXRoLmpvaW4oc2NyaXB0X2Rpciwgc2NyaXB0X2ZpbGVuYW1lKQorICAgIHNjcmlwdF9maWxlID0gb3BlbihzY3JpcHRfbmFtZSwgJ3cnKQorICAgIHNjcmlwdF9maWxlLndyaXRlKHNvdXJjZSkKKyAgICBzY3JpcHRfZmlsZS5jbG9zZSgpCisgICAgcmV0dXJuIHNjcmlwdF9uYW1lCisKK2RlZiBjb21waWxlX3NjcmlwdChzY3JpcHRfbmFtZSk6CisgICAgcHlfY29tcGlsZS5jb21waWxlKHNjcmlwdF9uYW1lLCBkb3JhaXNlPVRydWUpCisgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICBjb21waWxlZF9uYW1lID0gc2NyaXB0X25hbWUgKyAnYycKKyAgICBlbHNlOgorICAgICAgICBjb21waWxlZF9uYW1lID0gc2NyaXB0X25hbWUgKyAnbycKKyAgICByZXR1cm4gY29tcGlsZWRfbmFtZQorCitkZWYgbWFrZV96aXBfc2NyaXB0KHppcF9kaXIsIHppcF9iYXNlbmFtZSwgc2NyaXB0X25hbWUsIG5hbWVfaW5femlwPU5vbmUpOgorICAgIHppcF9maWxlbmFtZSA9IHppcF9iYXNlbmFtZStvcy5leHRzZXArJ3ppcCcKKyAgICB6aXBfbmFtZSA9IG9zLnBhdGguam9pbih6aXBfZGlyLCB6aXBfZmlsZW5hbWUpCisgICAgemlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUoemlwX25hbWUsICd3JykKKyAgICBpZiBuYW1lX2luX3ppcCBpcyBOb25lOgorICAgICAgICBuYW1lX2luX3ppcCA9IG9zLnBhdGguYmFzZW5hbWUoc2NyaXB0X25hbWUpCisgICAgemlwX2ZpbGUud3JpdGUoc2NyaXB0X25hbWUsIG5hbWVfaW5femlwKQorICAgIHppcF9maWxlLmNsb3NlKCkKKyAgICAjaWYgdGVzdC50ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAjICAgIHppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKHppcF9uYW1lLCAncicpCisgICAgIyAgICBwcmludCAnQ29udGVudHMgb2YgJXI6JyAlIHppcF9uYW1lCisgICAgIyAgICB6aXBfZmlsZS5wcmludGRpcigpCisgICAgIyAgICB6aXBfZmlsZS5jbG9zZSgpCisgICAgcmV0dXJuIHppcF9uYW1lLCBvcy5wYXRoLmpvaW4oemlwX25hbWUsIG5hbWVfaW5femlwKQorCitkZWYgbWFrZV9wa2cocGtnX2Rpcik6CisgICAgb3MubWtkaXIocGtnX2RpcikKKyAgICBtYWtlX3NjcmlwdChwa2dfZGlyLCAnX19pbml0X18nLCAnJykKKworZGVmIG1ha2VfemlwX3BrZyh6aXBfZGlyLCB6aXBfYmFzZW5hbWUsIHBrZ19uYW1lLCBzY3JpcHRfYmFzZW5hbWUsCisgICAgICAgICAgICAgICAgIHNvdXJjZSwgZGVwdGg9MSwgY29tcGlsZWQ9RmFsc2UpOgorICAgIHVubGluayA9IFtdCisgICAgaW5pdF9uYW1lID0gbWFrZV9zY3JpcHQoemlwX2RpciwgJ19faW5pdF9fJywgJycpCisgICAgdW5saW5rLmFwcGVuZChpbml0X25hbWUpCisgICAgaW5pdF9iYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoaW5pdF9uYW1lKQorICAgIHNjcmlwdF9uYW1lID0gbWFrZV9zY3JpcHQoemlwX2Rpciwgc2NyaXB0X2Jhc2VuYW1lLCBzb3VyY2UpCisgICAgdW5saW5rLmFwcGVuZChzY3JpcHRfbmFtZSkKKyAgICBpZiBjb21waWxlZDoKKyAgICAgICAgaW5pdF9uYW1lID0gY29tcGlsZV9zY3JpcHQoaW5pdF9uYW1lKQorICAgICAgICBzY3JpcHRfbmFtZSA9IGNvbXBpbGVfc2NyaXB0KHNjcmlwdF9uYW1lKQorICAgICAgICB1bmxpbmsuZXh0ZW5kKChpbml0X25hbWUsIHNjcmlwdF9uYW1lKSkKKyAgICBwa2dfbmFtZXMgPSBbb3Muc2VwLmpvaW4oW3BrZ19uYW1lXSppKSBmb3IgaSBpbiByYW5nZSgxLCBkZXB0aCsxKV0KKyAgICBzY3JpcHRfbmFtZV9pbl96aXAgPSBvcy5wYXRoLmpvaW4ocGtnX25hbWVzWy0xXSwgb3MucGF0aC5iYXNlbmFtZShzY3JpcHRfbmFtZSkpCisgICAgemlwX2ZpbGVuYW1lID0gemlwX2Jhc2VuYW1lK29zLmV4dHNlcCsnemlwJworICAgIHppcF9uYW1lID0gb3MucGF0aC5qb2luKHppcF9kaXIsIHppcF9maWxlbmFtZSkKKyAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZSh6aXBfbmFtZSwgJ3cnKQorICAgIGZvciBuYW1lIGluIHBrZ19uYW1lczoKKyAgICAgICAgaW5pdF9uYW1lX2luX3ppcCA9IG9zLnBhdGguam9pbihuYW1lLCBpbml0X2Jhc2VuYW1lKQorICAgICAgICB6aXBfZmlsZS53cml0ZShpbml0X25hbWUsIGluaXRfbmFtZV9pbl96aXApCisgICAgemlwX2ZpbGUud3JpdGUoc2NyaXB0X25hbWUsIHNjcmlwdF9uYW1lX2luX3ppcCkKKyAgICB6aXBfZmlsZS5jbG9zZSgpCisgICAgZm9yIG5hbWUgaW4gdW5saW5rOgorICAgICAgICBvcy51bmxpbmsobmFtZSkKKyAgICAjaWYgdGVzdC50ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAjICAgIHppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKHppcF9uYW1lLCAncicpCisgICAgIyAgICBwcmludCAnQ29udGVudHMgb2YgJXI6JyAlIHppcF9uYW1lCisgICAgIyAgICB6aXBfZmlsZS5wcmludGRpcigpCisgICAgIyAgICB6aXBfZmlsZS5jbG9zZSgpCisgICAgcmV0dXJuIHppcF9uYW1lLCBvcy5wYXRoLmpvaW4oemlwX25hbWUsIHNjcmlwdF9uYW1lX2luX3ppcCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zY3JpcHRfaGVscGVyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9zY3JpcHRfaGVscGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzVhMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NjcmlwdF9oZWxwZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zY3JpcHRfaGVscGVyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9zY3JpcHRfaGVscGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWFmZjUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NjcmlwdF9oZWxwZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zZXFfdGVzdHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2VxX3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTRlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2VxX3Rlc3RzLnB5CkBAIC0wLDAgKzEsMzkyIEBACisiIiIKK1Rlc3RzIGNvbW1vbiB0byB0dXBsZSwgbGlzdCBhbmQgVXNlckxpc3QuVXNlckxpc3QKKyIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKKworIyBWYXJpb3VzIGl0ZXJhYmxlcworIyBUaGlzIGlzIHVzZWQgZm9yIGNoZWNraW5nIHRoZSBjb25zdHJ1Y3RvciAoaGVyZSBhbmQgaW4gdGVzdF9kZXF1ZS5weSkKK2RlZiBpdGVyZnVuYyhzZXFuKToKKyAgICAnUmVndWxhciBnZW5lcmF0b3InCisgICAgZm9yIGkgaW4gc2VxbjoKKyAgICAgICAgeWllbGQgaQorCitjbGFzcyBTZXF1ZW5jZToKKyAgICAnU2VxdWVuY2UgdXNpbmcgX19nZXRpdGVtX18nCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5zZXFuW2ldCisKK2NsYXNzIEl0ZXJGdW5jOgorICAgICdTZXF1ZW5jZSB1c2luZyBpdGVyYXRvciBwcm90b2NvbCcKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pID49IGxlbihzZWxmLnNlcW4pOiByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHYgPSBzZWxmLnNlcW5bc2VsZi5pXQorICAgICAgICBzZWxmLmkgKz0gMQorICAgICAgICByZXR1cm4gdgorCitjbGFzcyBJdGVyR2VuOgorICAgICdTZXF1ZW5jZSB1c2luZyBpdGVyYXRvciBwcm90b2NvbCBkZWZpbmVkIHdpdGggYSBnZW5lcmF0b3InCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIGZvciB2YWwgaW4gc2VsZi5zZXFuOgorICAgICAgICAgICAgeWllbGQgdmFsCisKK2NsYXNzIEl0ZXJOZXh0T25seToKKyAgICAnTWlzc2luZyBfX2dldGl0ZW1fXyBhbmQgX19pdGVyX18nCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pID49IGxlbihzZWxmLnNlcW4pOiByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHYgPSBzZWxmLnNlcW5bc2VsZi5pXQorICAgICAgICBzZWxmLmkgKz0gMQorICAgICAgICByZXR1cm4gdgorCitjbGFzcyBJdGVyTm9OZXh0OgorICAgICdJdGVyYXRvciBtaXNzaW5nIG5leHQoKScKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworY2xhc3MgSXRlckdlbkV4YzoKKyAgICAnVGVzdCBwcm9wYWdhdGlvbiBvZiBleGNlcHRpb25zJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAzIC8vIDAKKworY2xhc3MgSXRlckZ1bmNTdG9wOgorICAgICdUZXN0IGltbWVkaWF0ZSBzdG9wJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgcGFzcworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4sIGltYXAKK2RlZiBpdGVybXVsdGkoc2Vxbik6CisgICAgJ1Rlc3QgbXVsdGlwbGUgdGllcnMgb2YgaXRlcmF0b3JzJworICAgIHJldHVybiBjaGFpbihpbWFwKGxhbWJkYSB4OngsIGl0ZXJmdW5jKEl0ZXJHZW4oU2VxdWVuY2Uoc2VxbikpKSkpCisKK2NsYXNzIENvbW1vblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGhlIHR5cGUgdG8gYmUgdGVzdGVkCisgICAgdHlwZTJ0ZXN0ID0gTm9uZQorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3JzKHNlbGYpOgorICAgICAgICBsMCA9IFtdCisgICAgICAgIGwxID0gWzBdCisgICAgICAgIGwyID0gWzAsIDFdCisKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KCkKKyAgICAgICAgdTAgPSBzZWxmLnR5cGUydGVzdChsMCkKKyAgICAgICAgdTEgPSBzZWxmLnR5cGUydGVzdChsMSkKKyAgICAgICAgdTIgPSBzZWxmLnR5cGUydGVzdChsMikKKworICAgICAgICB1dSA9IHNlbGYudHlwZTJ0ZXN0KHUpCisgICAgICAgIHV1MCA9IHNlbGYudHlwZTJ0ZXN0KHUwKQorICAgICAgICB1dTEgPSBzZWxmLnR5cGUydGVzdCh1MSkKKyAgICAgICAgdXUyID0gc2VsZi50eXBlMnRlc3QodTIpCisKKyAgICAgICAgdiA9IHNlbGYudHlwZTJ0ZXN0KHR1cGxlKHUpKQorICAgICAgICBjbGFzcyBPdGhlclNlcToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbml0c2VxKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fZGF0YSA9IGluaXRzZXEKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZi5fX2RhdGEpCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kYXRhW2ldCisgICAgICAgIHMgPSBPdGhlclNlcSh1MCkKKyAgICAgICAgdjAgPSBzZWxmLnR5cGUydGVzdChzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2MCksIGxlbihzKSkKKworICAgICAgICBzID0gInRoaXMgaXMgYWxzbyBhIHNlcXVlbmNlIgorICAgICAgICB2diA9IHNlbGYudHlwZTJ0ZXN0KHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZ2KSwgbGVuKHMpKQorCisgICAgICAgICMgQ3JlYXRlIGZyb20gdmFyaW91cyBpdGVyYXRhYmxlcworICAgICAgICBmb3IgcyBpbiAoIjEyMyIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSkpOgorICAgICAgICAgICAgZm9yIGcgaW4gKFNlcXVlbmNlLCBJdGVyRnVuYywgSXRlckdlbiwKKyAgICAgICAgICAgICAgICAgICAgICBpdGVybXVsdGksIGl0ZXJmdW5jKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGcocykpLCBzZWxmLnR5cGUydGVzdChzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoSXRlckZ1bmNTdG9wKHMpKSwgc2VsZi50eXBlMnRlc3QoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYyBmb3IgYyBpbiAiMTIzIiksIHNlbGYudHlwZTJ0ZXN0KCIxMjMiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50eXBlMnRlc3QsIEl0ZXJOZXh0T25seShzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50eXBlMnRlc3QsIEl0ZXJOb05leHQocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgc2VsZi50eXBlMnRlc3QsIEl0ZXJHZW5FeGMocykpCisKKyAgICBkZWYgdGVzdF90cnV0aChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR5cGUydGVzdCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50eXBlMnRlc3QoWzQyXSkpCisKKyAgICBkZWYgdGVzdF9nZXRpdGVtKHNlbGYpOgorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWzAsIDEsIDIsIDMsIDRdKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKHUpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVtpXSwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVtsb25nKGkpXSwgaSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKC1sZW4odSksIC0xKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVtpXSwgbGVuKHUpK2kpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbbG9uZyhpKV0sIGxlbih1KStpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB1Ll9fZ2V0aXRlbV9fLCAtbGVuKHUpLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHUuX19nZXRpdGVtX18sIGxlbih1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdS5fX2dldGl0ZW1fXywgc2xpY2UoMCwxMCwwKSkKKworICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB1Ll9fZ2V0aXRlbV9fLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB1Ll9fZ2V0aXRlbV9fLCAtMSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUuX19nZXRpdGVtX18pCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFsxMCwgMTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMF0sIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMV0sIDExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTJdLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xXSwgMTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEuX19nZXRpdGVtX18sIC0zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLl9fZ2V0aXRlbV9fLCAzKQorCisgICAgZGVmIHRlc3RfZ2V0c2xpY2Uoc2VsZik6CisgICAgICAgIGwgPSBbMCwgMSwgMiwgMywgNF0KKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KGwpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzA6MF0sIHNlbGYudHlwZTJ0ZXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVsxOjJdLCBzZWxmLnR5cGUydGVzdChbMV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbLTI6LTFdLCBzZWxmLnR5cGUydGVzdChbM10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbLTEwMDA6MTAwMF0sIHUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVsxMDAwOi0xMDAwXSwgc2VsZi50eXBlMnRlc3QoW10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbOl0sIHUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVsxOk5vbmVdLCBzZWxmLnR5cGUydGVzdChbMSwgMiwgMywgNF0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbTm9uZTozXSwgc2VsZi50eXBlMnRlc3QoWzAsIDEsIDJdKSkKKworICAgICAgICAjIEV4dGVuZGVkIHNsaWNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbOjpdLCB1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbOjoyXSwgc2VsZi50eXBlMnRlc3QoWzAsIDIsIDRdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzE6OjJdLCBzZWxmLnR5cGUydGVzdChbMSwgM10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbOjotMV0sIHNlbGYudHlwZTJ0ZXN0KFs0LCAzLCAyLCAxLCAwXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVs6Oi0yXSwgc2VsZi50eXBlMnRlc3QoWzQsIDIsIDBdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzM6Oi0yXSwgc2VsZi50eXBlMnRlc3QoWzMsIDFdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzM6MzotMl0sIHNlbGYudHlwZTJ0ZXN0KFtdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzM6MjotMl0sIHNlbGYudHlwZTJ0ZXN0KFszXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVszOjE6LTJdLCBzZWxmLnR5cGUydGVzdChbM10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbMzowOi0yXSwgc2VsZi50eXBlMnRlc3QoWzMsIDFdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Wzo6LTEwMF0sIHNlbGYudHlwZTJ0ZXN0KFs0XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVsxMDA6LTEwMDpdLCBzZWxmLnR5cGUydGVzdChbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVstMTAwOjEwMDpdLCB1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbMTAwOi0xMDA6LTFdLCB1Wzo6LTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbLTEwMDoxMDA6LTFdLCBzZWxmLnR5cGUydGVzdChbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVstMTAwTDoxMDBMOjJMXSwgc2VsZi50eXBlMnRlc3QoWzAsIDIsIDRdKSkKKworICAgICAgICAjIFRlc3QgZXh0cmVtZSBjYXNlcyB3aXRoIGxvbmcgaW50cworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsMSwyLDMsNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsgLXBvdygyLDEyOEwpOiAzIF0sIHNlbGYudHlwZTJ0ZXN0KFswLDEsMl0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbIDM6IHBvdygyLDE0NUwpIF0sIHNlbGYudHlwZTJ0ZXN0KFszLDRdKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUuX19nZXRzbGljZV9fKQorCisgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdChbMCwgMSwgMl0pCisgICAgICAgIGZvciBpIGluIHU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGksIHUpCisgICAgICAgIGZvciBpIGluIG1pbih1KS0xLCBtYXgodSkrMToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oaSwgdSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUuX19jb250YWluc19fKQorCisgICAgZGVmIHRlc3RfY29udGFpbnNfZmFrZShzZWxmKToKKyAgICAgICAgY2xhc3MgQWxsRXE6CisgICAgICAgICAgICAjIFNlcXVlbmNlcyBtdXN0IHVzZSByaWNoIGNvbXBhcmlzb24gYWdhaW5zdCBlYWNoIGl0ZW0KKyAgICAgICAgICAgICMgKHVubGVzcyAiaXMiIGlzIHRydWUsIG9yIGFuIGVhcmxpZXIgaXRlbSBhbnN3ZXJlZCkKKyAgICAgICAgICAgICMgU28gaW5zdGFuY2VzIG9mIEFsbEVxIG11c3QgYmUgZm91bmQgaW4gYWxsIG5vbi1lbXB0eSBzZXF1ZW5jZXMuCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICMgQ2FuJ3QgbWVldCBoYXNoIGludmFyaWFudCByZXF1aXJlbWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihBbGxFcSgpLCBzZWxmLnR5cGUydGVzdChbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oQWxsRXEoKSwgc2VsZi50eXBlMnRlc3QoWzFdKSkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zX29yZGVyKHNlbGYpOgorICAgICAgICAjIFNlcXVlbmNlcyBtdXN0IHRlc3QgaW4tb3JkZXIuICBJZiBhIHJpY2ggY29tcGFyaXNvbiBoYXMgc2lkZQorICAgICAgICAjIGVmZmVjdHMsIHRoZXNlIHdpbGwgYmUgdmlzaWJsZSB0byB0ZXN0cyBhZ2FpbnN0IGxhdGVyIG1lbWJlcnMuCisgICAgICAgICMgSW4gdGhpcyB0ZXN0LCB0aGUgInNpZGUgZWZmZWN0IiBpcyBhIHNob3J0LWNpcmN1aXRpbmcgcmFpc2UuCisgICAgICAgIGNsYXNzIERvTm90VGVzdEVxKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIFN0b3BDb21wYXJlczoKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIERvTm90VGVzdEVxCisKKyAgICAgICAgY2hlY2tmaXJzdCA9IHNlbGYudHlwZTJ0ZXN0KFsxLCBTdG9wQ29tcGFyZXMoKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oMSwgY2hlY2tmaXJzdCkKKyAgICAgICAgY2hlY2tsYXN0ID0gc2VsZi50eXBlMnRlc3QoW1N0b3BDb21wYXJlcygpLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRG9Ob3RUZXN0RXEsIGNoZWNrbGFzdC5fX2NvbnRhaW5zX18sIDEpCisKKyAgICBkZWYgdGVzdF9sZW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYudHlwZTJ0ZXN0KCkpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnR5cGUydGVzdChbXSkpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnR5cGUydGVzdChbMF0pKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi50eXBlMnRlc3QoWzAsIDEsIDJdKSksIDMpCisKKyAgICBkZWYgdGVzdF9taW5tYXgoc2VsZik6CisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdChbMCwgMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWluKHUpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heCh1KSwgMikKKworICAgIGRlZiB0ZXN0X2FkZG11bChzZWxmKToKKyAgICAgICAgdTEgPSBzZWxmLnR5cGUydGVzdChbMF0pCisgICAgICAgIHUyID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUxLCB1MSArIHNlbGYudHlwZTJ0ZXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTEsIHNlbGYudHlwZTJ0ZXN0KCkgKyB1MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MSArIHNlbGYudHlwZTJ0ZXN0KFsxXSksIHUyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KFstMV0pICsgdTEsIHNlbGYudHlwZTJ0ZXN0KFstMSwgMF0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KCksIHUyKjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoKSwgMCp1MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdCgpLCB1MiowTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdCgpLCAwTCp1MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MiwgdTIqMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MiwgMSp1MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MiwgdTIqMUwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIsIDFMKnUyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUyK3UyLCB1MioyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUyK3UyLCAyKnUyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUyK3UyLCB1MioyTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Mit1MiwgMkwqdTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIrdTIrdTIsIHUyKjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIrdTIrdTIsIDMqdTIpCisKKyAgICAgICAgY2xhc3Mgc3ViY2xhc3Moc2VsZi50eXBlMnRlc3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB1MyA9IHN1YmNsYXNzKFswLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MywgdTMqMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdCh1MywgdTMqMSkKKworICAgIGRlZiB0ZXN0X2lhZGQoc2VsZik6CisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIHUgKz0gc2VsZi50eXBlMnRlc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkpCisgICAgICAgIHUgKz0gc2VsZi50eXBlMnRlc3QoWzIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIHNlbGYudHlwZTJ0ZXN0KFswLCAxLCAyLCAzXSkpCisgICAgICAgIHUgKz0gc2VsZi50eXBlMnRlc3QoWzQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIHNlbGYudHlwZTJ0ZXN0KFswLCAxLCAyLCAzLCA0LCA1XSkpCisKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KCJzcGFtIikKKyAgICAgICAgdSArPSBzZWxmLnR5cGUydGVzdCgiZWdncyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgc2VsZi50eXBlMnRlc3QoInNwYW1lZ2dzIikpCisKKyAgICBkZWYgdGVzdF9pbXVsKHNlbGYpOgorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICB1ICo9IDMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzZWxmLnR5cGUydGVzdChbMCwgMSwgMCwgMSwgMCwgMV0pKQorCisgICAgZGVmIHRlc3RfZ2V0aXRlbW92ZXJ3cml0ZWl0ZXIoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgX19nZXRpdGVtX18gb3ZlcnJpZGVzIGFyZSBub3QgcmVjb2duaXplZCBieSBfX2l0ZXJfXworICAgICAgICBjbGFzcyBUKHNlbGYudHlwZTJ0ZXN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdHIoa2V5KSArICchISEnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlcihUKCgxLDIpKSkubmV4dCgpLCAxKQorCisgICAgZGVmIHRlc3RfcmVwZWF0KHNlbGYpOgorICAgICAgICBmb3IgbSBpbiB4cmFuZ2UoNCk6CisgICAgICAgICAgICBzID0gdHVwbGUocmFuZ2UobSkpCisgICAgICAgICAgICBmb3IgbiBpbiB4cmFuZ2UoLTMsIDUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QocypuKSwgc2VsZi50eXBlMnRlc3QocykqbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QocykqKC00KSwgc2VsZi50eXBlMnRlc3QoW10pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChzKSwgaWQocyoxKSkKKworICAgIGRlZiB0ZXN0X2JpZ3JlcGVhdChzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpZiBzeXMubWF4aW50IDw9IDIxNDc0ODM2NDc6CisgICAgICAgICAgICB4ID0gc2VsZi50eXBlMnRlc3QoWzBdKQorICAgICAgICAgICAgeCAqPSAyKioxNgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTWVtb3J5RXJyb3IsIHguX19tdWxfXywgMioqMTYpCisgICAgICAgICAgICBpZiBoYXNhdHRyKHgsICdfX2ltdWxfXycpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE1lbW9yeUVycm9yLCB4Ll9faW11bF9fLCAyKioxNikKKworICAgIGRlZiB0ZXN0X3N1YnNjcmlwdChzZWxmKToKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFsxMCwgMTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19nZXRpdGVtX18oMEwpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZ2V0aXRlbV9fKDFMKSwgMTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2dldGl0ZW1fXygtMkwpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZ2V0aXRlbV9fKC0xTCksIDExKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLl9fZ2V0aXRlbV9fLCAtMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5fX2dldGl0ZW1fXywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZ2V0aXRlbV9fKHNsaWNlKDAsMSkpLCBzZWxmLnR5cGUydGVzdChbMTBdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZ2V0aXRlbV9fKHNsaWNlKDEsMikpLCBzZWxmLnR5cGUydGVzdChbMTFdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZ2V0aXRlbV9fKHNsaWNlKDAsMikpLCBzZWxmLnR5cGUydGVzdChbMTAsIDExXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2dldGl0ZW1fXyhzbGljZSgwLDMpKSwgc2VsZi50eXBlMnRlc3QoWzEwLCAxMV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19nZXRpdGVtX18oc2xpY2UoMyw1KSksIHNlbGYudHlwZTJ0ZXN0KFtdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5fX2dldGl0ZW1fXywgc2xpY2UoMCwgMTAsIDApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19nZXRpdGVtX18sICd4JykKKworICAgIGRlZiB0ZXN0X2NvdW50KHNlbGYpOgorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDEsIDJdKSozCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5jb3VudCgwKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmNvdW50KDEpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuY291bnQoMyksIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmNvdW50KQorCisgICAgICAgIGNsYXNzIEJhZEV4YyhFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEJhZENtcDoKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIGlmIG90aGVyID09IDI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJhZEV4YygpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQmFkRXhjLCBhLmNvdW50LCBCYWRDbXAoKSkKKworICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYpOgorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuaW5kZXgoMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5pbmRleCgxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdS5pbmRleCwgMikKKworICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWy0yLCAtMSwgMCwgMCwgMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5jb3VudCgwKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmluZGV4KDApLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuaW5kZXgoMCwgMiksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5pbmRleCgtMiwgLTEwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmluZGV4KDAsIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuaW5kZXgoMCwgMywgNCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUuaW5kZXgsIDIsIDAsIC0xMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUuaW5kZXgpCisKKyAgICAgICAgY2xhc3MgQmFkRXhjKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkQ21wOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgaWYgb3RoZXIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQmFkRXhjKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhCYWRFeGMsIGEuaW5kZXgsIEJhZENtcCgpKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbLTIsIC0xLCAwLCAwLCAxLCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmluZGV4KDApLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoMCwgMiksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCgwLCAtNCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCgtMiwgLTEwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmluZGV4KDAsIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoMCwgLTMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoMCwgMywgNCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCgwLCAtMywgLTIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoMCwgLTQqc3lzLm1heGludCwgNCpzeXMubWF4aW50KSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5pbmRleCwgMCwgNCpzeXMubWF4aW50LC00KnN5cy5tYXhpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEuaW5kZXgsIDIsIDAsIC0xMCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zZXFfdGVzdHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NlcV90ZXN0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxOWJiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zZXFfdGVzdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zZXFfdGVzdHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NlcV90ZXN0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcxOWJiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zZXFfdGVzdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zZ21sX2lucHV0Lmh0bWwgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2dtbF9pbnB1dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDJlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2dtbF9pbnB1dC5odG1sCkBAIC0wLDAgKzEsMjEyIEBACis8aHRtbD4KKyA8aGVhZD4KKyAgPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+CisgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHA6Ly9vZ2FtZTE4Mi5kZS9lcGljYmx1ZS9mb3JtYXRlLmNzcyI+CisgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiIHNyYz0ianMvZmxvdHRlbi5qcyI+PC9zY3JpcHQ+CisgPC9oZWFkPgorIDxib2R5PgorICAgIDxzY3JpcHQgbGFuZ3VhZ2U9SmF2YVNjcmlwdD4gaWYgKHBhcmVudC5mcmFtZXMubGVuZ3RoID09IDApIHsgdG9wLmxvY2F0aW9uLmhyZWYgPSAiaHR0cDovL2VzLm9nYW1lLm9yZy8iOyB9IDwvc2NyaXB0PiA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0Ij4KK2Z1bmN0aW9uIGhhaGEoejEpIHsKKyAgZXZhbCgibG9jYXRpb249JyIrejEub3B0aW9uc1t6MS5zZWxlY3RlZEluZGV4XS52YWx1ZSsiJyIpOworfQorPC9zY3JpcHQ+Cis8Y2VudGVyPgorPHRhYmxlPgorIDx0cj4KKyAgPHRkPjwvdGQ+CisgIDx0ZD4KKyAgIDxjZW50ZXI+CisgICA8dGFibGU+CisgICAgPHRyPgorICAgICA8dGQ+PGltZyBzcmM9Imh0dHA6Ly9vZ2FtZTE4Mi5kZS9lcGljYmx1ZS9wbGFuZXRlbi9zbWFsbC9zX2RzY2hqdW5nZWxwbGFuZXQwNC5qcGciIHdpZHRoPSI1MCIgaGVpZ2h0PSI1MCI+PC90ZD4KKyAgICAgPHRkPgorICAgICAgPHRhYmxlIGJvcmRlcj0iMSI+CisgICAgICAgPHNlbGVjdCBzaXplPSIxIiBvbmNoYW5nZT0iaGFoYSh0aGlzKSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii9nYW1lL2Zsb3R0ZW4xLnBocD9zZXNzaW9uPTg5MTJhZTkxMmZlYyZjcD0zMzg3NTM0MSZtb2RlPUZsb3R0ZSZnaWQ9Jm1lc3NhZ2V6aWVsPSZyZT0wIiBzZWxlY3RlZD5BbGllbiBzZXggZnJpZW5kICAgIFsyOjI1MDo2XTwvb3B0aW9uPiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iL2dhbWUvZmxvdHRlbjEucGhwP3Nlc3Npb249ODkxMmFlOTEyZmVjJmNwPTMzOTA1MTAwJm1vZGU9RmxvdHRlJmdpZD0mbWVzc2FnZXppZWw9JnJlPTAiID4xOTg5ICAgIFsyOjI0ODoxNF08L29wdGlvbj4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii9nYW1lL2Zsb3R0ZW4xLnBocD9zZXNzaW9uPTg5MTJhZTkxMmZlYyZjcD0zNDU3MDgwOCZtb2RlPUZsb3R0ZSZnaWQ9Jm1lc3NhZ2V6aWVsPSZyZT0wIiA+MTk5MCAgICBbMjoyNDg6Nl08L29wdGlvbj4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii9nYW1lL2Zsb3R0ZW4xLnBocD9zZXNzaW9uPTg5MTJhZTkxMmZlYyZjcD0zNDU3MDg1OCZtb2RlPUZsb3R0ZSZnaWQ9Jm1lc3NhZ2V6aWVsPSZyZT0wIiA+MTk5MSAgICBbMjoyNTQ6Nl08L29wdGlvbj4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii9nYW1lL2Zsb3R0ZW4xLnBocD9zZXNzaW9uPTg5MTJhZTkxMmZlYyZjcD0zNDU3MjkyOSZtb2RlPUZsb3R0ZSZnaWQ9Jm1lc3NhZ2V6aWVsPSZyZT0wIiA+Q29sb25pYSAgICBbMjoyNTM6MTJdPC9vcHRpb24+IAorICAgICAgICAgICAgICAgPC9zZWxlY3Q+CisgICAgICA8L3RhYmxlPgorICAgICA8L3RkPgorICAgIDwvdHI+CisgIDwvdGFibGU+CisgIDwvY2VudGVyPgorICA8L3RkPgorICA8dGQ+CisgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KKyAgICA8dHI+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij4KKyAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly9vZ2FtZTE4Mi5kZS9lcGljYmx1ZS9pbWFnZXMvbWV0YWxsLmdpZiIgd2lkdGg9IjQyIiBoZWlnaHQ9IjIyIj4KKyAgICAgPC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+CisgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vb2dhbWUxODIuZGUvZXBpY2JsdWUvaW1hZ2VzL2tyaXN0YWxsLmdpZiIgd2lkdGg9IjQyIiBoZWlnaHQ9IjIyIj4KKyAgICAgPC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+CisgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vb2dhbWUxODIuZGUvZXBpY2JsdWUvaW1hZ2VzL2RldXRlcml1bS5naWYiIHdpZHRoPSI0MiIgaGVpZ2h0PSIyMiI+CisgICAgIDwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPgorICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iaHR0cDovL29nYW1lMTgyLmRlL2VwaWNibHVlL2ltYWdlcy9lbmVyZ2llLmdpZiIgd2lkdGg9IjQyIiBoZWlnaHQ9IjIyIj4KKyAgICAgPC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiPjwvdGQ+CisgICAgPC90cj4KKyAgICA8dHI+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48aT48Yj4mbmJzcDsmbmJzcDs8L2I+PC9pPjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjxpPjxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5NZXRhbDwvZm9udD48L2I+PC9pPjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjxpPjxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5DcmlzdGFsPC9mb250PjwvYj48L2k+PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+PGk+PGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkRldXRlcmlvPC9mb250PjwvYj48L2k+PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+PGk+PGI+PGZvbnQgY29sb3I9IiNmZmZmZmYiPkVuZXJn7WE8L2ZvbnQ+PC9iPjwvaT48L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciI+PGk+PGI+Jm5ic3A7Jm5ic3A7PC9iPjwvaT48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICA8dGQgYWxpZ249ImNlbnRlciI+PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+MTYwLjYzNjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjMuNDA2PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+MzkuMjMwPC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+PGZvbnQgY29sb3I9I2ZmMDAwMD4tODA8L2ZvbnQ+LzMuOTY1PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiPjwvdGQ+CisgICAgPC90cj4KKyAgIDwvdGFibGU+CisgIDwvdHI+CisgPC90YWJsZT4KKyAgPC9jZW50ZXI+Cis8YnIgLz4KKyAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CisgIDwhLS0KKyAgICAgZnVuY3Rpb24gbGlua190b19nYW1lcGF5KCkgeworICAgIHNlbGYubG9jYXRpb24gPSAiaHR0cHM6Ly93d3cuZ2FtZXBheS5kZS8/bGFuZz1lcyZzZXJ2ZXJJRD04JnVzZXJJRD0xMjkzNjAmZ2FtZUlEPW9nYW1lJmd1aT12MiZjaGtzdW09YTk3NTFhZmE5ZTM3ZTZiMWI4MjYzNTZiY2NhNDU2NzUiOworICB9CisvLy0tPgorICA8L3NjcmlwdD4KKzxjZW50ZXI+CisgIDx0YWJsZSB3aWR0aD0iNTE5IiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMSI+CisgICA8dHIgaGVpZ2h0PSIyMCI+CisgIDx0ZCBjb2xzcGFuPSI4IiBjbGFzcz0iYyI+RmxvdGFzIChtYXguIDkpPC90ZD4KKyAgIDwvdHI+CisgICAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGg+TnVtLjwvdGg+CisgICAgPHRoPk1pc2nzbjwvdGg+CisgICAgPHRoPkNhbnRpZGFkPC90aD4KKyAgICA8dGg+Q29taWVuem88L3RoPgorICAgIDx0aD5TYWxpZGE8L3RoPgorICAgIDx0aD5PYmpldGl2bzwvdGg+CisgICAgPHRoPkxsZWdhZGE8L3RoPgorICAgIDx0aD5PcmRlbjwvdGg+ICAgCisgICA8L3RyPgorICAgICA8dHIgaGVpZ2h0PSIyMCI+CisgICAgPHRoPjE8L3RoPgorICAgIDx0aD4gIAorICAgICAgPGEgdGl0bGU9IiI+RXNwaW9uYWplPC9hPgorICAgICAgPGEgdGl0bGU9IkZsb3RhIGVuIGVsIHBsYW5ldGEiPihGKTwvYT4KKyAgICA8L3RoPgorICAgIDx0aD4gPGEgdGl0bGU9IlNvbmRhIGRlIGVzcGlvbmFqZTogMyAKKyI+MzwvYT48L3RoPgorICAgIDx0aD5bMjoyNTA6Nl08L3RoPgorICAgIDx0aD5XZWQgQXVnIDkgMTg6MDA6MDI8L3RoPgorICAgIDx0aD5bMjoyNDI6NV08L3RoPgorICAgIDx0aD5XZWQgQXVnIDkgMTg6MDE6MDI8L3RoPgorICAgIDx0aD4KKyAgICAgICAgIDxmb3JtIGFjdGlvbj0iZmxvdHRlbjEucGhwP3Nlc3Npb249ODkxMmFlOTEyZmVjIiBtZXRob2Q9IlBPU1QiPgorCTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im9yZGVyX3JldHVybiIgdmFsdWU9IjI1MDU0NDkwIiAvPgorICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iRW52aWFyIGRlIHJlZ3Jlc28iIC8+CisgICAgIDwvZm9ybT4KKyAgICAgICAgICAgIDwvdGg+CisgICA8L3RyPgorICAgPHRyIGhlaWdodD0iMjAiPgorICAgIDx0aD4yPC90aD4KKyAgICA8dGg+ICAKKyAgICAgIDxhIHRpdGxlPSIiPkVzcGlvbmFqZTwvYT4KKyAgICAgIDxhIHRpdGxlPSJWb2x2ZXIgYWwgcGxhbmV0YSI+KFYpPC9hPgorICAgIDwvdGg+CisgICAgPHRoPiA8YSB0aXRsZT0iU29uZGEgZGUgZXNwaW9uYWplOiAzIAorIj4zPC9hPjwvdGg+CisgICAgPHRoPlsyOjI1MDo2XTwvdGg+CisgICAgPHRoPldlZCBBdWcgOSAxNzo1OTo1NTwvdGg+CisgICAgPHRoPlsyOjI0MjoxXTwvdGg+CisgICAgPHRoPldlZCBBdWcgOSAxODowMTo1NTwvdGg+CisgICAgPHRoPgorICAgICAgICAgICAgPC90aD4KKyAgIDwvdHI+CisgIDwvdGFibGU+CisKKworICAKKzxmb3JtIGFjdGlvbj0iZmxvdHRlbjIucGhwP3Nlc3Npb249ODkxMmFlOTEyZmVjIiBtZXRob2Q9IlBPU1QiPgorICA8dGFibGUgd2lkdGg9IjUxOSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjEiPgorICAgICAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgPHRkIGNvbHNwYW49IjQiIGNsYXNzPSJjIj5OdWV2YSBtaXNp8246IGVsZWdpciBuYXZlczwvdGQ+CisgICA8L3RyPgorICAgPHRyIGhlaWdodD0iMjAiPgorICA8dGg+TmF2ZXM8L3RoPgorICA8dGg+RGlzcG9uaWJsZXM8L3RoPgorPCEtLSAgICA8dGg+R2VzY2guPC90aD4gLS0+CisgICAgPHRoPi08L3RoPgorICAgIDx0aD4tPC90aD4KKyAgIDwvdHI+CisgICA8dHIgaGVpZ2h0PSIyMCI+CisgICAgPHRoPjxhIHRpdGxlPSJWZWxvY2lkYWQ6IDg1MDAiPk5hdmUgcGVxdWXxYSBkZSBjYXJnYTwvYT48L3RoPiAKKyAgICA8dGg+MTA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJtYXhzaGlwMjAyIiB2YWx1ZT0iMTAiLz48L3RoPgorPCEtLSAgICA8dGg+ODUwMCAtLT4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY29uc3VtcHRpb24yMDIiIHZhbHVlPSIxMCIvPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVlZDIwMiIgdmFsdWU9Ijg1MDAiIC8+PC90aD4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2FwYWNpdHkyMDIiIHZhbHVlPSI1MDAwIiAvPjwvdGg+CisgICAgIDx0aD48YSBocmVmPSJqYXZhc2NyaXB0Om1heFNoaXAoJ3NoaXAyMDInKTsiID5t4Xg8L2E+IDwvdGg+CisgICAgIDx0aD48aW5wdXQgbmFtZT0ic2hpcDIwMiIgc2l6ZT0iMTAiIHZhbHVlPSIwIiBhbHQ9Ik5hdmUgcGVxdWXxYSBkZSBjYXJnYSAxMCIvPjwvdGg+CisgICA8L3RyPgorICAgPHRyIGhlaWdodD0iMjAiPgorICAgIDx0aD48YSB0aXRsZT0iVmVsb2NpZGFkOiAxMjc1MCI+TmF2ZSBncmFuZGUgZGUgY2FyZ2E8L2E+PC90aD4gCisgICAgPHRoPjE5PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibWF4c2hpcDIwMyIgdmFsdWU9IjE5Ii8+PC90aD4KKzwhLS0gICAgPHRoPjEyNzUwIC0tPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjb25zdW1wdGlvbjIwMyIgdmFsdWU9IjUwIi8+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWVkMjAzIiB2YWx1ZT0iMTI3NTAiIC8+PC90aD4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY2FwYWNpdHkyMDMiIHZhbHVlPSIyNTAwMCIgLz48L3RoPgorICAgICA8dGg+PGEgaHJlZj0iamF2YXNjcmlwdDptYXhTaGlwKCdzaGlwMjAzJyk7IiA+beF4PC9hPiA8L3RoPgorICAgICA8dGg+PGlucHV0IG5hbWU9InNoaXAyMDMiIHNpemU9IjEwIiB2YWx1ZT0iMCIgYWx0PSJOYXZlIGdyYW5kZSBkZSBjYXJnYSAxOSIvPjwvdGg+CisgICA8L3RyPgorICAgPHRyIGhlaWdodD0iMjAiPgorICAgIDx0aD48YSB0aXRsZT0iVmVsb2NpZGFkOiAyNzAwMCI+Q3J1Y2VybzwvYT48L3RoPiAKKyAgICA8dGg+NjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im1heHNoaXAyMDYiIHZhbHVlPSI2Ii8+PC90aD4KKzwhLS0gICAgPHRoPjI3MDAwIC0tPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjb25zdW1wdGlvbjIwNiIgdmFsdWU9IjMwMCIvPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVlZDIwNiIgdmFsdWU9IjI3MDAwIiAvPjwvdGg+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNhcGFjaXR5MjA2IiB2YWx1ZT0iODAwIiAvPjwvdGg+CisgICAgIDx0aD48YSBocmVmPSJqYXZhc2NyaXB0Om1heFNoaXAoJ3NoaXAyMDYnKTsiID5t4Xg8L2E+IDwvdGg+CisgICAgIDx0aD48aW5wdXQgbmFtZT0ic2hpcDIwNiIgc2l6ZT0iMTAiIHZhbHVlPSIwIiBhbHQ9IkNydWNlcm8gNiIvPjwvdGg+CisgICA8L3RyPgorICAgPHRyIGhlaWdodD0iMjAiPgorICAgIDx0aD48YSB0aXRsZT0iVmVsb2NpZGFkOiAzNDAwIj5SZWNpY2xhZG9yPC9hPjwvdGg+IAorICAgIDx0aD4xPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibWF4c2hpcDIwOSIgdmFsdWU9IjEiLz48L3RoPgorPCEtLSAgICA8dGg+MzQwMCAtLT4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY29uc3VtcHRpb24yMDkiIHZhbHVlPSIzMDAiLz4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlZWQyMDkiIHZhbHVlPSIzNDAwIiAvPjwvdGg+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNhcGFjaXR5MjA5IiB2YWx1ZT0iMjAwMDAiIC8+PC90aD4KKyAgICAgPHRoPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWF4U2hpcCgnc2hpcDIwOScpOyIgPm3heDwvYT4gPC90aD4KKyAgICAgPHRoPjxpbnB1dCBuYW1lPSJzaGlwMjA5IiBzaXplPSIxMCIgdmFsdWU9IjAiIGFsdD0iUmVjaWNsYWRvciAxIi8+PC90aD4KKyAgIDwvdHI+CisgICA8dHIgaGVpZ2h0PSIyMCI+CisgICAgPHRoPjxhIHRpdGxlPSJWZWxvY2lkYWQ6IDE3MDAwMDAwMCI+U29uZGEgZGUgZXNwaW9uYWplPC9hPjwvdGg+IAorICAgIDx0aD4xMzk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJtYXhzaGlwMjEwIiB2YWx1ZT0iMTM5Ii8+PC90aD4KKzwhLS0gICAgPHRoPjE3MDAwMDAwMCAtLT4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY29uc3VtcHRpb24yMTAiIHZhbHVlPSIxIi8+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWVkMjEwIiB2YWx1ZT0iMTcwMDAwMDAwIiAvPjwvdGg+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNhcGFjaXR5MjEwIiB2YWx1ZT0iNSIgLz48L3RoPgorICAgICA8dGg+PGEgaHJlZj0iamF2YXNjcmlwdDptYXhTaGlwKCdzaGlwMjEwJyk7IiA+beF4PC9hPiA8L3RoPgorICAgICA8dGg+PGlucHV0IG5hbWU9InNoaXAyMTAiIHNpemU9IjEwIiB2YWx1ZT0iMCIgYWx0PSJTb25kYSBkZSBlc3Bpb25hamUgMTM5Ii8+PC90aD4KKyAgIDwvdHI+CisgICA8dHIgaGVpZ2h0PSIyMCI+CisgIDx0aCBjb2xzcGFuPSIyIj48YSBocmVmPSJqYXZhc2NyaXB0Om5vU2hpcHMoKTsiID5OaW5ndW5hIG5hdmU8L2E+PC90aD4KKyAgPHRoIGNvbHNwYW49IjIiPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWF4U2hpcHMoKTsiID5Ub2RhcyBsYXMgbmF2ZXM8L2E+PC90aD4KKyAgIDwvdHI+CisgICAgPHRyIGhlaWdodD0iMjAiPgorICAgIDx0aCBjb2xzcGFuPSI0Ij48aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iQ29udGludWFyIiAvPjwvdGg+CisgICA8L3RyPgorPHRyPjx0aCBjb2xzcGFuPTQ+Cis8aWZyYW1lIGlkPSdhNDRmYjUyMicgbmFtZT0nYTQ0ZmI1MjInIHNyYz0naHR0cDovL2Fkcy5nYW1lZm9yZ2VhZHMuZGUvYWRmcmFtZS5waHA/bj1hNDRmYjUyMiZhbXA7d2hhdD16b25lOjU3OCcgZnJhbWVzcGFjaW5nPScwJyBmcmFtZWJvcmRlcj0nbm8nIHNjcm9sbGluZz0nbm8nIHdpZHRoPSc0NjgnIGhlaWdodD0nNjAnPjwvaWZyYW1lPgorPGJyPjxjZW50ZXI+PC9jZW50ZXI+PC9icj4KKzwvdGg+PC90cj4KKzwvZm9ybT4KKzwvdGFibGU+CisgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3NoYTI1Ni5wZW0gYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2hhMjU2LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDc1NTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NoYTI1Ni5wZW0KQEAgLTAsMCArMSwxMjggQEAKKyMgQ2VydGlmaWNhdGUgY2hhaW4gZm9yIGh0dHBzOi8vc2hhMjU2LnRicy1pbnRlcm5ldC5jb20KKyAwIHM6L0M9RlIvcG9zdGFsQ29kZT0xNDAwMC9TVD1DYWx2YWRvcy9MPUNBRU4vc3RyZWV0PTIyIHJ1ZSBkZSBCcmV0YWduZS9PPVRCUyBJTlRFUk5FVC9PVT0wMDAyIDQ0MDQ0MzgxMC9PVT1DZXJ0aWZpY2F0cyBUQlMgWDUwOS9DTj1lY29tLnRicy14NTA5LmNvbQorICAgaTovQz1GUi9TVD1DYWx2YWRvcy9MPUNhZW4vTz1UQlMgSU5URVJORVQvT1U9VGVybXMgYW5kIENvbmRpdGlvbnM6IGh0dHA6Ly93d3cudGJzLWludGVybmV0LmNvbS9DQS9yZXBvc2l0b3J5L09VPVRCUyBJTlRFUk5FVCBDQS9DTj1UQlMgWDUwOSBDQSBidXNpbmVzcworLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlHVGpDQ0JUYWdBd0lCQWdJUU9oM2Q5ZE5EUHExY1NkSm1FaU1wcURBTkJna3Foa2lHOXcwQkFRVUZBRENCCit5VEVMTUFrR0ExVUVCaE1DUmxJeEVUQVBCZ05WQkFnVENFTmhiSFpoWkc5ek1RMHdDd1lEVlFRSEV3UkRZV1Z1CitNUlV3RXdZRFZRUUtFd3hVUWxNZ1NVNVVSVkpPUlZReFNEQkdCZ05WQkFzVFAxUmxjbTF6SUdGdVpDQkRiMjVrCithWFJwYjI1ek9pQm9kSFJ3T2k4dmQzZDNMblJpY3kxcGJuUmxjbTVsZEM1amIyMHZRMEV2Y21Wd2IzTnBkRzl5CitlVEVZTUJZR0ExVUVDeE1QVkVKVElFbE9WRVZTVGtWVUlFTkJNUjB3R3dZRFZRUURFeFJVUWxNZ1dEVXdPU0JECitRU0JpZFhOcGJtVnpjekFlRncweE1UQXhNalV3TURBd01EQmFGdzB4TXpBeU1EVXlNelU1TlRsYU1JSEhNUXN3CitDUVlEVlFRR0V3SkdVakVPTUF3R0ExVUVFUk1GTVRRd01EQXhFVEFQQmdOVkJBZ1RDRU5oYkhaaFpHOXpNUTB3CitDd1lEVlFRSEV3UkRRVVZPTVJzd0dRWURWUVFKRXhJeU1pQnlkV1VnWkdVZ1FuSmxkR0ZuYm1VeEZUQVRCZ05WCitCQW9UREZSQ1V5QkpUbFJGVWs1RlZERVhNQlVHQTFVRUN4TU9NREF3TWlBME5EQTBORE00TVRBeEhUQWJCZ05WCitCQXNURkVObGNuUnBabWxqWVhSeklGUkNVeUJZTlRBNU1Sb3dHQVlEVlFRREV4RmxZMjl0TG5SaWN5MTROVEE1CitMbU52YlRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS1JybEhVbkorKzFscGNnCitqdFljbzdjZG1SZStFRWZUbXdQZkNkZlYzRzFRZnNUU3ZZNkZmTXBtLzgzcHFIZlQrNEFOd3IxOHdEOVpyQUVOCitHMTZtZjlWZENHSzEyK1RQN0RtcWVaeUdJcWxGRm9haFFubWI4RWFydkU0My8xVWVRMkNWOVhtendadnBxZWxpCitMZlhzRm9uYXdyWTNINlpuTXdTNjRTdDYxWis5Z2R5dVovUmJzb1pCYlQ1S1VqREVHODQ0UVJVNE9UMUlHZUVJCitlWTVOTTVSTkloNlpOaFZ0cWVlQ3hNUzdhZk9Oa0hRck9jbzczUmRTVFJjay9Iajk2T2ZsM01ITkhyeXIrQU1LCitER0ZrMWtMQ1pHcFBkWHRreFh2YURlUW9pWURsaWwyNkNXYytZSzZ4eURQTWRzV3ZvRzE0Wkx5Q3B6TVhBNy83Cis0WUFRUkgwQ0F3RUFBYU9DQWpBd2dnSXNNQjhHQTFVZEl3UVlNQmFBRkJvSkJNejVDWSs3SHFETzFLUVVmMHZWCitJMWpOTUIwR0ExVWREZ1FXQkJRZ09VOEhzV3pibUQ0V1pQNVd0ZHc3amNhMldEQU9CZ05WSFE4QkFmOEVCQU1DCitCYUF3REFZRFZSMFRBUUgvQkFJd0FEQWRCZ05WSFNVRUZqQVVCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd0l3CitUQVlEVlIwZ0JFVXdRekJCQmdzckJnRUVBWURsTndJQkFUQXlNREFHQ0NzR0FRVUZCd0lCRmlSb2RIUndjem92CitMM2QzZHk1MFluTXRhVzUwWlhKdVpYUXVZMjl0TDBOQkwwTlFVekV3ZHdZRFZSMGZCSEF3YmpBM29EV2dNNFl4CithSFIwY0RvdkwyTnliQzUwWW5NdGFXNTBaWEp1WlhRdVkyOXRMMVJDVTFnMU1EbERRV0oxYzJsdVpYTnpMbU55CitiREF6b0RHZ0w0WXRhSFIwY0RvdkwyTnliQzUwWW5NdGVEVXdPUzVqYjIwdlZFSlRXRFV3T1VOQlluVnphVzVsCitjM011WTNKc01JR3dCZ2dyQmdFRkJRY0JBUVNCb3pDQm9EQTlCZ2dyQmdFRkJRY3dBb1l4YUhSMGNEb3ZMMk55CitkQzUwWW5NdGFXNTBaWEp1WlhRdVkyOXRMMVJDVTFnMU1EbERRV0oxYzJsdVpYTnpMbU55ZERBNUJnZ3JCZ0VGCitCUWN3QW9ZdGFIUjBjRG92TDJOeWRDNTBZbk10ZURVd09TNWpiMjB2VkVKVFdEVXdPVU5CWW5WemFXNWxjM011CitZM0owTUNRR0NDc0dBUVVGQnpBQmhoaG9kSFJ3T2k4dmIyTnpjQzUwWW5NdGVEVXdPUzVqYjIwd013WURWUjBSCitCQ3d3S29JUlpXTnZiUzUwWW5NdGVEVXdPUzVqYjIyQ0ZYZDNkeTVsWTI5dExuUmljeTE0TlRBNUxtTnZiVEFOCitCZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFyVDROSGZiWTg3YkdBdzhsUFY0RG1IbG11RHVWcC95N2x0TzNZbnNlCiszUno4UnhXMkF6dU8wT3kyRjBDdTR5V0t0TXlFeU1YeUhxV3RhZTdFbFJiZFR1NXc1R3dWQkxKSENsQ3pDOFM5CitTcGdNTVFUeDNSZ244dmprSHVVOVZaUWx1bFp5aVBLN3l1bmpjN2MzMTBTOUZSWjdYeE93ZjhObng0V25CK05vCitXcmZBcHpoaFFsMzF3K1J5ck54WmU1OGhDZkRESG1ldlJ2d0xqUTc4NVpvUVhKRGoyajNxQUQ0YUkyeUI4bEI1CitvYUUxamxDSnpDN0ttei9ZOWp6Zm12L3pBczFMUVRtOWt0ZXZ2NEJUVUZhR2p2OWp4blExeG5TODYyWmlvdUxXCit6WllJbFlQZjRGNkpqWEdpSVFnUVJnbElMVWZxM2Z0SmQ5L29rOVc5WkY4aDh3PT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKyAxIHM6L0M9RlIvU1Q9Q2FsdmFkb3MvTD1DYWVuL089VEJTIElOVEVSTkVUL09VPVRlcm1zIGFuZCBDb25kaXRpb25zOiBodHRwOi8vd3d3LnRicy1pbnRlcm5ldC5jb20vQ0EvcmVwb3NpdG9yeS9PVT1UQlMgSU5URVJORVQgQ0EvQ049VEJTIFg1MDkgQ0EgYnVzaW5lc3MKKyAgIGk6L0M9U0UvTz1BZGRUcnVzdCBBQi9PVT1BZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yay9DTj1BZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290CistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZQekNDQkNlZ0F3SUJBZ0lRRGxCei8rK2lSU21MRGVWUkhUL2hBREFOQmdrcWhraUc5dzBCQVFVRkFEQnYKK01Rc3dDUVlEVlFRR0V3SlRSVEVVTUJJR0ExVUVDaE1MUVdSa1ZISjFjM1FnUVVJeEpqQWtCZ05WQkFzVEhVRmsKK1pGUnlkWE4wSUVWNGRHVnlibUZzSUZSVVVDQk9aWFIzYjNKck1TSXdJQVlEVlFRREV4bEJaR1JVY25WemRDQkYKK2VIUmxjbTVoYkNCRFFTQlNiMjkwTUI0WERUQTFNVEl3TVRBd01EQXdNRm9YRFRFNU1EY3dPVEU0TVRreU1sb3cKK2dja3hDekFKQmdOVkJBWVRBa1pTTVJFd0R3WURWUVFJRXdoRFlXeDJZV1J2Y3pFTk1Bc0dBMVVFQnhNRVEyRmwKK2JqRVZNQk1HQTFVRUNoTU1WRUpUSUVsT1ZFVlNUa1ZVTVVnd1JnWURWUVFMRXo5VVpYSnRjeUJoYm1RZ1EyOXUKK1pHbDBhVzl1Y3pvZ2FIUjBjRG92TDNkM2R5NTBZbk10YVc1MFpYSnVaWFF1WTI5dEwwTkJMM0psY0c5emFYUnYKK2Nua3hHREFXQmdOVkJBc1REMVJDVXlCSlRsUkZVazVGVkNCRFFURWRNQnNHQTFVRUF4TVVWRUpUSUZnMU1Ea2cKK1EwRWdZblZ6YVc1bGMzTXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFEQjFQQVUKK3F1ZENjejN0bXlHY2YrdTZFa1pxb25LS0hyVjRnWllidlZrSVJvam1tbGhmaS9qd3ZwSHZvOGJxU3QvOVJqNVMKK2poQ0RXMHBjYkkrSVBQdEQxSnkrQ0hOU2ZuTXFWRHk2Q0tRM3A1bWFUekNNRzZaVCtYam52Y05ENXYrRnRhaUIKK3hrMWlDWDZ1dnQwamVVdGRadllieXl0c1NERTZjM1k1Ly93UnhPRjh0TTFKeGlid08zcHlFUjI2amJiTjJnUXoKK20vRWtkR2pMZEo0c3ZQazIzV0RBdlE2RzAvejJMY0FhSkIrWExmcVJ3ZlFwSFF2ZkthMXVUaThQaXZDOHF0aXAKK3JtTlFNTVBNanhTSzJhelg4Y0tqalRESmlVS2FDYjRWSGxKRFdLRXNDRlJwZ0pBb0F1WDhmN1lmczFNNGVzR28KK3NXYjNQR3NwSzNPMjJ1SWxBZ01CQUFHamdnRjZNSUlCZGpBZEJnTlZIUTRFRmdRVUdna0V6UGtKajdzZW9NN1UKK3BCUi9TOVVqV00wd0RnWURWUjBQQVFIL0JBUURBZ0VHTUJJR0ExVWRFd0VCL3dRSU1BWUJBZjhDQVFBd0dBWUQKK1ZSMGdCQkV3RHpBTkJnc3JCZ0VFQVlEbE53SUJBVEI3QmdOVkhSOEVkREJ5TURpZ05xQTBoakpvZEhSd09pOHYKK1kzSnNMbU52Ylc5a2IyTmhMbU52YlM5QlpHUlVjblZ6ZEVWNGRHVnlibUZzUTBGU2IyOTBMbU55YkRBMm9EU2cKK01vWXdhSFIwY0RvdkwyTnliQzVqYjIxdlpHOHVibVYwTDBGa1pGUnlkWE4wUlhoMFpYSnVZV3hEUVZKdmIzUXUKK1kzSnNNSUdHQmdnckJnRUZCUWNCQVFSNk1IZ3dPd1lJS3dZQkJRVUhNQUtHTDJoMGRIQTZMeTlqY25RdVkyOXQKK2IyUnZZMkV1WTI5dEwwRmtaRlJ5ZFhOMFZWUk9VMlZ5ZG1WeVEwRXVZM0owTURrR0NDc0dBUVVGQnpBQ2hpMW8KK2RIUndPaTh2WTNKMExtTnZiVzlrYnk1dVpYUXZRV1JrVkhKMWMzUlZWRTVUWlhKMlpYSkRRUzVqY25Rd0VRWUoKK1lJWklBWWI0UWdFQkJBUURBZ0lFTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBN21xck1nay9NckU2UW5iTkEKK2g0blJDbjJ0aTRiZzR3MkMzbEI2YlN2UlBuWXd1Tnc5SmI4dnVLa05GelJEeE5KWHFWRFpkZkZXNUNWUUp1eWQKK25mQXg4Myt3aytzcHp2RmFFMUtoRllmTjlHOXBRZlhVZnZEUm9JY0pnUEVLVVhMMXdSaU9HK0lqVTNWVkk4cGcKK0lncUhrcjd5bGxuNWk1ekNpRkFQdUlKbVlVU0ZnL2d4SDV4a0NOY2pKcXFySHJIYXRKcjZRcnJrZTkzam91cHcKK29VMW5qZkFjWnRZcDZmYmlLNnUyYjFwSnF3a1ZCRThSc2ZMblBoUmorU0ZicHZqdjhPZDdvL2llSmhGSVlRTlUKK2syalgydThxWm5BaU53OTNMWlc5bHBZanR1dk1YcThRUXBwRU5OamE1YjUzcTdVd0krbFU3WkdqWjdxdXVFU3AKK0o2LzUKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKyAyIHM6L0M9U0UvTz1BZGRUcnVzdCBBQi9PVT1BZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yay9DTj1BZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290CisgICBpOi9DPVVTL1NUPVVUL0w9U2FsdCBMYWtlIENpdHkvTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsvT1U9aHR0cDovL3d3dy51c2VydHJ1c3QuY29tL0NOPVVUTi1VU0VSRmlyc3QtSGFyZHdhcmUKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRVR6Q0NBemVnQXdJQkFnSVFITTVFWXBVWmVwMWpVdm55STZtMm1EQU5CZ2txaGtpRzl3MEJBUVVGQURDQgorbHpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBbFZVTVJjd0ZRWURWUVFIRXc1VFlXeDBJRXhoYTJVZworUTJsMGVURWVNQndHQTFVRUNoTVZWR2hsSUZWVFJWSlVVbFZUVkNCT1pYUjNiM0pyTVNFd0h3WURWUVFMRXhobworZEhSd09pOHZkM2QzTG5WelpYSjBjblZ6ZEM1amIyMHhIekFkQmdOVkJBTVRGbFZVVGkxVlUwVlNSbWx5YzNRdAorU0dGeVpIZGhjbVV3SGhjTk1EVXdOakEzTURnd09URXdXaGNOTVRrd056QTVNVGd4T1RJeVdqQnZNUXN3Q1FZRAorVlFRR0V3SlRSVEVVTUJJR0ExVUVDaE1MUVdSa1ZISjFjM1FnUVVJeEpqQWtCZ05WQkFzVEhVRmtaRlJ5ZFhOMAorSUVWNGRHVnlibUZzSUZSVVVDQk9aWFIzYjNKck1TSXdJQVlEVlFRREV4bEJaR1JVY25WemRDQkZlSFJsY201aAorYkNCRFFTQlNiMjkwTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF0L2NhTStieQorQUFRdE9lQk9XKzBmdkd3UHpiWDZJN2JPM3BzUk01ZWtLVXg5azUrOVNyeVQ3UU1hNDQvUDVXMVFXdGFYS1pSYQorZ0xCSmV0c3VsZjI0eXI4M09DMGVQcEZCclhCV3gvQlBQK2d5bm5US3lKQlU2Y1pmRDNpZG1rQThEcXhocWw0VQorajU2SG9XcFEzTmVhVHE4RnM2WnhsSnh4czFCZ0NzY1RuVGdIaGdLbzZhaHBKaGlRcTB5d1R5T3JPaytFMk4vTworbitGcGI3dlhRdGRyUk9USHJlNXRRVjl5V25FSU43TjVaYVJab0pRMzl3QXZEY0tTY3RyUU9ITGJGS2hGeEYwcQorZmJlMDFzVHVyTTBUUkxmSks5MURBQ1g2WWJscGFsZ2pFYmVuTTQ5V2RWbjF6U25YUnJjS0syVzIwMEp2RmJLNAorZS92djZWMVQxVFJhSndJREFRQUJvNEc5TUlHNk1COEdBMVVkSXdRWU1CYUFGS0Z5WHlZYktKaERsVjBITjlXRgorbHAxTDBzTkZNQjBHQTFVZERnUVdCQlN0dlpoNk5MUW05L3JFSmxUdkE3M2dKTXRVR2pBT0JnTlZIUThCQWY4RQorQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QVJCZ2xnaGtnQmh2aENBUUVFQkFNQ0FRSXdSQVlEVlIwZgorQkQwd096QTVvRGVnTllZemFIUjBjRG92TDJOeWJDNTFjMlZ5ZEhKMWMzUXVZMjl0TDFWVVRpMVZVMFZTUm1seQorYzNRdFNHRnlaSGRoY21VdVkzSnNNQTBHQ1NxR1NJYjNEUUVCQlFVQUE0SUJBUUJ5UWhBTk9zNGtDbHJ3RjhCVworb252VU9HQ1NqUks1MnpZWmdEWFlOakR0bXI1cko2TnlQRkRObitKeGtMcGpZZXRJRk1UYlNSZTY3OUJ0OG03YQorZ0lBb1FZRlF0eE11eUxuSmVnQjJhRWJRaUl4aC90QzIxVWNGRjdrdGRuRG9UbEE2dzNwTHV2dW5hSTg0T2YzbworMllCcmh6a1RiQ2ZhWWs1SlJsVHB1ZFc5RGtVa0hCc3l4M25rblBLbnBsa0lHYUswamduOEUwbitTRmFiWWFIaworSTlMcm9ZVC8rSnRMZWZoOWxnQmRBZ1Z2MFVQYnpvR2Z1RHNyay9aaCtVcmdiTEZwSG9WbkVsaHpia2g2NFowWAorT0dhSnVuUWM2OGNDWnU1SFRuL2FLN2ZCR01jVmZsUkNYTFZFUXBVOVBJQWRHQThZbnZnNjg0dDhHTWFLc1JsMQoraklHWgorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQorIDMgczovQz1VUy9TVD1VVC9MPVNhbHQgTGFrZSBDaXR5L089VGhlIFVTRVJUUlVTVCBOZXR3b3JrL09VPWh0dHA6Ly93d3cudXNlcnRydXN0LmNvbS9DTj1VVE4tVVNFUkZpcnN0LUhhcmR3YXJlCisgICBpOi9DPVVTL1NUPVVUL0w9U2FsdCBMYWtlIENpdHkvTz1UaGUgVVNFUlRSVVNUIE5ldHdvcmsvT1U9aHR0cDovL3d3dy51c2VydHJ1c3QuY29tL0NOPVVUTi1VU0VSRmlyc3QtSGFyZHdhcmUKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRWREQ0NBMXlnQXdJQkFnSVFSTDRNaTFBQUpMUVIwellxL21VSy9UQU5CZ2txaGtpRzl3MEJBUVVGQURDQgorbHpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBbFZVTVJjd0ZRWURWUVFIRXc1VFlXeDBJRXhoYTJVZworUTJsMGVURWVNQndHQTFVRUNoTVZWR2hsSUZWVFJWSlVVbFZUVkNCT1pYUjNiM0pyTVNFd0h3WURWUVFMRXhobworZEhSd09pOHZkM2QzTG5WelpYSjBjblZ6ZEM1amIyMHhIekFkQmdOVkJBTVRGbFZVVGkxVlUwVlNSbWx5YzNRdAorU0dGeVpIZGhjbVV3SGhjTk9Ua3dOekE1TVRneE1EUXlXaGNOTVRrd056QTVNVGd4T1RJeVdqQ0JsekVMTUFrRworQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWxWVU1SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aGEyVWdRMmwwZVRFZQorTUJ3R0ExVUVDaE1WVkdobElGVlRSVkpVVWxWVFZDQk9aWFIzYjNKck1TRXdId1lEVlFRTEV4aG9kSFJ3T2k4dgorZDNkM0xuVnpaWEowY25WemRDNWpiMjB4SHpBZEJnTlZCQU1URmxWVVRpMVZVMFZTUm1seWMzUXRTR0Z5WkhkaAorY21Vd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN4OThNNFA3U29mODg1Z2xGbgorMEcyZjB2OVk4K2VmSyt3TmlWU1p1VGlaRnZmZ0lYbEl3cnRoZEJLV0hUeHFjdFU4RUdjNk9lMHJFODFtNjVVSgorTTZSc2w3SG94dXpCZFhtY1JsNk5xOUJxL2JrcVZSY1FWTE1aOEpyMjhiRmR0cWR0KytCeEYydWlpUHNBMy80YQorTVhjTW1nRjZzVExqS3dFSE9HN0RwVjRqdkVXYmUxREJ5VENQMitVcmV0TmIrek5BSHFEVm1CZThpNGZEaWROZAorb0k2eXFxcjJqbW1JQnNYNmlTSHpDSjFwTGdrem15a05SZytNekVrMHNHbFJ2ZmtHeldpdFpreThQcXhodlFxSQorRHNqZlBlNThCRXlkQ2w1cmtkYnV4KzBvamF0Tmg0bHowRzZrMEI0V2l4VGhka1FEZjJPczVNMUpuTVdTOUtzeQorb1VoYkFnTUJBQUdqZ2Jrd2diWXdDd1lEVlIwUEJBUURBZ0hHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRAorVlIwT0JCWUVGS0Z5WHlZYktKaERsVjBITjlXRmxwMUwwc05GTUVRR0ExVWRId1E5TURzd09hQTNvRFdHTTJoMAorZEhBNkx5OWpjbXd1ZFhObGNuUnlkWE4wTG1OdmJTOVZWRTR0VlZORlVrWnBjbk4wTFVoaGNtUjNZWEpsTG1OeQorYkRBeEJnTlZIU1VFS2pBb0JnZ3JCZ0VGQlFjREFRWUlLd1lCQlFVSEF3VUdDQ3NHQVFVRkJ3TUdCZ2dyQmdFRgorQlFjREJ6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUFSeGtQM25UR21aZXYvSzBvWG5XTzZ5MW43azU3SzljTQorLy9iZXkxV2lDdUZNVkdXVFlHdWZFcHl0WG9NczYxcXV3T1F0OUFCakhiakFiUExQU2J0TmsyOEdwZ29pc2tsaQorQ0U3L3lNZ1Vzb2dXWGVjQjVCS1Y1VVUwczR0cHZjKzBoWTkxVVo1OU9qZzZGRWdTeHZ1bk94cU5EWUpBQitnRQorQ0pDaGljc1pVTi9LSEFHOEhRUVpleEIybHp2dWtKREt4QTRmRm01MTd6UDQwMjliSHBiajRIUjNkSHVLb200dAorM1hiV09UQ0M4S3VjVXZJcXg2OUpYbjdIYU9XQ2djaHFKL2tuaUNyVldGQ1ZIL0E3SEZlN2ZSUTVZaXVheVpTUworS3FNaURQK0pKbjFmSXl0SDF4VWRxV3FlVVEwcVVaNkIrZFE3WG5BU2Z4QXluQjY3bmZobXFBPT0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zb3J0cGVyZi5weSBiL2xpYi9weXRob24yLjcvdGVzdC9zb3J0cGVyZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzgzZWU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NvcnRwZXJmLnB5CkBAIC0wLDAgKzEsMTY5IEBACisiIiJTb3J0IHBlcmZvcm1hbmNlIHRlc3QuCisKK1NlZSBtYWluKCkgZm9yIGNvbW1hbmQgbGluZSBzeW50YXguCitTZWUgdGFidWxhdGUoKSBmb3Igb3V0cHV0IGZvcm1hdC4KKworIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgbWFyc2hhbAoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgb3MKKwordGQgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKKworZGVmIHJhbmRmbG9hdHMobik6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBuIHJhbmRvbSBmbG9hdHMgaW4gWzAsIDEpLiIiIgorICAgICMgR2VuZXJhdGluZyBmbG9hdHMgaXMgZXhwZW5zaXZlLCBzbyB0aGlzIHdyaXRlcyB0aGVtIG91dCB0byBhIGZpbGUgaW4KKyAgICAjIGEgdGVtcCBkaXJlY3RvcnkuICBJZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cywgaXQganVzdCByZWFkcyB0aGVtCisgICAgIyBiYWNrIGluIGFuZCBzaHVmZmxlcyB0aGVtIGEgYml0LgorICAgIGZuID0gb3MucGF0aC5qb2luKHRkLCAicnIlMDZkIiAlIG4pCisgICAgdHJ5OgorICAgICAgICBmcCA9IG9wZW4oZm4sICJyYiIpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHIgPSByYW5kb20ucmFuZG9tCisgICAgICAgIHJlc3VsdCA9IFtyKCkgZm9yIGkgaW4geHJhbmdlKG4pXQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnAgPSBvcGVuKGZuLCAid2IiKQorICAgICAgICAgICAgICAgIG1hcnNoYWwuZHVtcChyZXN1bHQsIGZwKQorICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBmcCA9IE5vbmUKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgZnA6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmbikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICAgICAgcHJpbnQgImNhbid0IHdyaXRlIiwgZm4sICI6IiwgbXNnCisgICAgZWxzZToKKyAgICAgICAgcmVzdWx0ID0gbWFyc2hhbC5sb2FkKGZwKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICMgU2h1ZmZsZSBpdCBhIGJpdC4uLgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBpID0gcmFuZG9tLnJhbmRyYW5nZShuKQorICAgICAgICAgICAgdGVtcCA9IHJlc3VsdFs6aV0KKyAgICAgICAgICAgIGRlbCByZXN1bHRbOmldCisgICAgICAgICAgICB0ZW1wLnJldmVyc2UoKQorICAgICAgICAgICAgcmVzdWx0LmV4dGVuZCh0ZW1wKQorICAgICAgICAgICAgZGVsIHRlbXAKKyAgICBhc3NlcnQgbGVuKHJlc3VsdCkgPT0gbgorICAgIHJldHVybiByZXN1bHQKKworZGVmIGZsdXNoKCk6CisgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisKK2RlZiBkb2l0KEwpOgorICAgIHQwID0gdGltZS5jbG9jaygpCisgICAgTC5zb3J0KCkKKyAgICB0MSA9IHRpbWUuY2xvY2soKQorICAgIHByaW50ICIlNi4yZiIgJSAodDEtdDApLAorICAgIGZsdXNoKCkKKworZGVmIHRhYnVsYXRlKHIpOgorICAgICIiIlRhYnVsYXRlIHNvcnQgc3BlZWQgZm9yIGxpc3RzIG9mIHZhcmlvdXMgc2l6ZXMuCisKKyAgICBUaGUgc2l6ZXMgYXJlIDIqKmkgZm9yIGkgaW4gciAodGhlIGFyZ3VtZW50LCBhIGxpc3QpLgorCisgICAgVGhlIG91dHB1dCBkaXNwbGF5cyBpLCAyKippLCBhbmQgdGhlIHRpbWUgdG8gc29ydCBhcnJheXMgb2YgMioqaQorICAgIGZsb2F0aW5nIHBvaW50IG51bWJlcnMgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisKKyAgICAqc29ydDogcmFuZG9tIGRhdGEKKyAgICBcc29ydDogZGVzY2VuZGluZyBkYXRhCisgICAgL3NvcnQ6IGFzY2VuZGluZyBkYXRhCisgICAgM3NvcnQ6IGFzY2VuZGluZywgdGhlbiAzIHJhbmRvbSBleGNoYW5nZXMKKyAgICArc29ydDogYXNjZW5kaW5nLCB0aGVuIDEwIHJhbmRvbSBhdCB0aGUgZW5kCisgICAgJXNvcnQ6IGFzY2VuZGluZywgdGhlbiByYW5kb21seSByZXBsYWNlIDElIG9mIHRoZSBlbGVtZW50cyB3LyByYW5kb20gdmFsdWVzCisgICAgfnNvcnQ6IG1hbnkgZHVwbGljYXRlcworICAgID1zb3J0OiBhbGwgZXF1YWwKKyAgICAhc29ydDogd29yc3QgY2FzZSBzY2VuYXJpbworCisgICAgIiIiCisgICAgY2FzZXMgPSB0dXBsZShbY2ggKyAic29ydCIgZm9yIGNoIGluIHIiKlwvMyslfj0hIl0pCisgICAgZm10ID0gKCIlMnMgJTdzIiArICIgJTZzIipsZW4oY2FzZXMpKQorICAgIHByaW50IGZtdCAlICgoImkiLCAiMioqaSIpICsgY2FzZXMpCisgICAgZm9yIGkgaW4gcjoKKyAgICAgICAgbiA9IDEgPDwgaQorICAgICAgICBMID0gcmFuZGZsb2F0cyhuKQorICAgICAgICBwcmludCAiJTJkICU3ZCIgJSAoaSwgbiksCisgICAgICAgIGZsdXNoKCkKKyAgICAgICAgZG9pdChMKSAjICpzb3J0CisgICAgICAgIEwucmV2ZXJzZSgpCisgICAgICAgIGRvaXQoTCkgIyBcc29ydAorICAgICAgICBkb2l0KEwpICMgL3NvcnQKKworICAgICAgICAjIERvIDMgcmFuZG9tIGV4Y2hhbmdlcy4KKyAgICAgICAgZm9yIGR1bW15IGluIHJhbmdlKDMpOgorICAgICAgICAgICAgaTEgPSByYW5kb20ucmFuZHJhbmdlKG4pCisgICAgICAgICAgICBpMiA9IHJhbmRvbS5yYW5kcmFuZ2UobikKKyAgICAgICAgICAgIExbaTFdLCBMW2kyXSA9IExbaTJdLCBMW2kxXQorICAgICAgICBkb2l0KEwpICMgM3NvcnQKKworICAgICAgICAjIFJlcGxhY2UgdGhlIGxhc3QgMTAgd2l0aCByYW5kb20gZmxvYXRzLgorICAgICAgICBpZiBuID49IDEwOgorICAgICAgICAgICAgTFstMTA6XSA9IFtyYW5kb20ucmFuZG9tKCkgZm9yIGR1bW15IGluIHJhbmdlKDEwKV0KKyAgICAgICAgZG9pdChMKSAjICtzb3J0CisKKyAgICAgICAgIyBSZXBsYWNlIDElIG9mIHRoZSBlbGVtZW50cyBhdCByYW5kb20uCisgICAgICAgIGZvciBkdW1teSBpbiB4cmFuZ2UobiAvLyAxMDApOgorICAgICAgICAgICAgTFtyYW5kb20ucmFuZHJhbmdlKG4pXSA9IHJhbmRvbS5yYW5kb20oKQorICAgICAgICBkb2l0KEwpICMgJXNvcnQKKworICAgICAgICAjIEFycmFuZ2UgZm9yIGxvdHMgb2YgZHVwbGljYXRlcy4KKyAgICAgICAgaWYgbiA+IDQ6CisgICAgICAgICAgICBkZWwgTFs0Ol0KKyAgICAgICAgICAgIEwgPSBMICogKG4gLy8gNCkKKyAgICAgICAgICAgICMgRm9yY2UgdGhlIGVsZW1lbnRzIHRvIGJlIGRpc3RpbmN0IG9iamVjdHMsIGVsc2UgdGltaW5ncyBjYW4gYmUKKyAgICAgICAgICAgICMgYXJ0aWZpY2lhbGx5IGxvdy4KKyAgICAgICAgICAgIEwgPSBtYXAobGFtYmRhIHg6IC0teCwgTCkKKyAgICAgICAgZG9pdChMKSAjIH5zb3J0CisgICAgICAgIGRlbCBMCisKKyAgICAgICAgIyBBbGwgZXF1YWwuICBBZ2FpbiwgZm9yY2UgdGhlIGVsZW1lbnRzIHRvIGJlIGRpc3RpbmN0IG9iamVjdHMuCisgICAgICAgIEwgPSBtYXAoYWJzLCBbLTAuNV0gKiBuKQorICAgICAgICBkb2l0KEwpICMgPXNvcnQKKyAgICAgICAgZGVsIEwKKworICAgICAgICAjIFRoaXMgb25lIGxvb2tzIGxpa2UgWzMsIDIsIDEsIDAsIDAsIDEsIDIsIDNdLiAgSXQgd2FzIGEgYmFkIGNhc2UKKyAgICAgICAgIyBmb3IgYW4gb2xkZXIgaW1wbGVtZW50YXRpb24gb2YgcXVpY2tzb3J0LCB3aGljaCB1c2VkIHRoZSBtZWRpYW4KKyAgICAgICAgIyBvZiB0aGUgZmlyc3QsIGxhc3QgYW5kIG1pZGRsZSBlbGVtZW50cyBhcyB0aGUgcGl2b3QuCisgICAgICAgIGhhbGYgPSBuIC8vIDIKKyAgICAgICAgTCA9IHJhbmdlKGhhbGYgLSAxLCAtMSwgLTEpCisgICAgICAgIEwuZXh0ZW5kKHJhbmdlKGhhbGYpKQorICAgICAgICAjIEZvcmNlIHRvIGZsb2F0LCBzbyB0aGF0IHRoZSB0aW1pbmdzIGFyZSBjb21wYXJhYmxlLiAgVGhpcyBpcworICAgICAgICAjIHNpZ25pZmljYW50bHkgZmFzdGVyIGlmIHdlIGxlYXZlIHRoYW0gYXMgaW50cy4KKyAgICAgICAgTCA9IG1hcChmbG9hdCwgTCkKKyAgICAgICAgZG9pdChMKSAjICFzb3J0CisgICAgICAgIHByaW50CisKK2RlZiBtYWluKCk6CisgICAgIiIiTWFpbiBwcm9ncmFtIHdoZW4gaW52b2tlZCBhcyBhIHNjcmlwdC4KKworICAgIE9uZSBhcmd1bWVudDogdGFidWxhdGUgYSBzaW5nbGUgcm93LgorICAgIFR3byBhcmd1bWVudHM6IHRhYnVsYXRlIGEgcmFuZ2UgKGluY2x1c2l2ZSkuCisgICAgRXh0cmEgYXJndW1lbnRzIGFyZSB1c2VkIHRvIHNlZWQgdGhlIHJhbmRvbSBnZW5lcmF0b3IuCisKKyAgICAiIiIKKyAgICAjIGRlZmF1bHQgcmFuZ2UgKGluY2x1c2l2ZSkKKyAgICBrMSA9IDE1CisgICAgazIgPSAyMAorICAgIGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgIyBvbmUgYXJndW1lbnQ6IHNpbmdsZSBwb2ludAorICAgICAgICBrMSA9IGsyID0gaW50KHN5cy5hcmd2WzFdKQorICAgICAgICBpZiBzeXMuYXJndlsyOl06CisgICAgICAgICAgICAjIHR3byBhcmd1bWVudHM6IHNwZWNpZnkgcmFuZ2UKKyAgICAgICAgICAgIGsyID0gaW50KHN5cy5hcmd2WzJdKQorICAgICAgICAgICAgaWYgc3lzLmFyZ3ZbMzpdOgorICAgICAgICAgICAgICAgICMgZGVyaXZlIHJhbmRvbSBzZWVkIGZyb20gcmVtYWluaW5nIGFyZ3VtZW50cworICAgICAgICAgICAgICAgIHggPSAxCisgICAgICAgICAgICAgICAgZm9yIGEgaW4gc3lzLmFyZ3ZbMzpdOgorICAgICAgICAgICAgICAgICAgICB4ID0gNjkwNjkgKiB4ICsgaGFzaChhKQorICAgICAgICAgICAgICAgIHJhbmRvbS5zZWVkKHgpCisgICAgciA9IHJhbmdlKGsxLCBrMisxKSAgICAgICAgICAgICAgICAgIyBpbmNsdWRlIHRoZSBlbmQgcG9pbnQKKyAgICB0YWJ1bGF0ZShyKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3NvcnRwZXJmLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9zb3J0cGVyZi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0YTY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zb3J0cGVyZi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3NvcnRwZXJmLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9zb3J0cGVyZi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjOTViNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zb3J0cGVyZi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3N0cmluZ190ZXN0cy5weSBiL2xpYi9weXRob24yLjcvdGVzdC9zdHJpbmdfdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhYjZhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zdHJpbmdfdGVzdHMucHkKQEAgLTAsMCArMSwxMzU1IEBACisiIiIKK0NvbW1vbiB0ZXN0cyBzaGFyZWQgYnkgdGVzdF9zdHIsIHRlc3RfdW5pY29kZSwgdGVzdF91c2Vyc3RyaW5nIGFuZCB0ZXN0X3N0cmluZy4KKyIiIgorCitpbXBvcnQgdW5pdHRlc3QsIHN0cmluZywgc3lzLCBzdHJ1Y3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIFVzZXJMaXN0IGltcG9ydCBVc2VyTGlzdAoraW1wb3J0IF90ZXN0Y2FwaQorCitjbGFzcyBTZXF1ZW5jZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VxPSd3eHl6Jyk6IHNlbGYuc2VxID0gc2VxCisgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiBsZW4oc2VsZi5zZXEpCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOiByZXR1cm4gc2VsZi5zZXFbaV0KKworY2xhc3MgQmFkU2VxMShTZXF1ZW5jZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLnNlcSA9IFs3LCAnaGVsbG8nLCAxMjNMXQorCitjbGFzcyBCYWRTZXEyKFNlcXVlbmNlKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6IHNlbGYuc2VxID0gWydhJywgJ2InLCAnYyddCisgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiA4CisKK2NsYXNzIENvbW1vblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGhpcyB0ZXN0Y2FzZSBjb250YWlucyB0ZXN0IHRoYXQgY2FuIGJlIHVzZWQgaW4gYWxsCisgICAgIyBzdHJpbmdsaWtlIGNsYXNzZXMuIEN1cnJlbnRseSB0aGlzIGlzIHN0ciwgdW5pY29kZQorICAgICMgVXNlclN0cmluZyBhbmQgdGhlIHN0cmluZyBtb2R1bGUuCisKKyAgICAjIFRoZSB0eXBlIHRvIGJlIHRlc3RlZAorICAgICMgQ2hhbmdlIGluIHN1YmNsYXNzZXMgdG8gY2hhbmdlIHRoZSBiZWhhdmlvdXIgb2YgZml4dGVzdHR5cGUoKQorICAgIHR5cGUydGVzdCA9IE5vbmUKKworICAgICMgQWxsIHRlc3RzIHBhc3MgdGhlaXIgYXJndW1lbnRzIHRvIHRoZSB0ZXN0aW5nIG1ldGhvZHMKKyAgICAjIGFzIHN0ciBvYmplY3RzLiBmaXh0ZXN0dHlwZSgpIGNhbiBiZSB1c2VkIHRvIHByb3BhZ2F0ZQorICAgICMgdGhlc2UgYXJndW1lbnRzIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlCisgICAgZGVmIGZpeHR5cGUoc2VsZiwgb2JqKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIHN0cik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18udHlwZTJ0ZXN0KG9iaikKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG9iaiwgbGlzdCk6CisgICAgICAgICAgICByZXR1cm4gW3NlbGYuZml4dHlwZSh4KSBmb3IgeCBpbiBvYmpdCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIHR1cGxlKToKKyAgICAgICAgICAgIHJldHVybiB0dXBsZShbc2VsZi5maXh0eXBlKHgpIGZvciB4IGluIG9ial0pCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIGRpY3QpOgorICAgICAgICAgICAgcmV0dXJuIGRpY3QoWworICAgICAgICAgICAgICAgKHNlbGYuZml4dHlwZShrZXkpLCBzZWxmLmZpeHR5cGUodmFsdWUpKQorICAgICAgICAgICAgICAgZm9yIChrZXksIHZhbHVlKSBpbiBvYmouaXRlcml0ZW1zKCkKKyAgICAgICAgICAgIF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gb2JqCisKKyAgICAjIGNoZWNrIHRoYXQgb2JqZWN0Lm1ldGhvZCgqYXJncykgcmV0dXJucyByZXN1bHQKKyAgICBkZWYgY2hlY2tlcXVhbChzZWxmLCByZXN1bHQsIG9iamVjdCwgbWV0aG9kbmFtZSwgKmFyZ3MpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmZpeHR5cGUocmVzdWx0KQorICAgICAgICBvYmplY3QgPSBzZWxmLmZpeHR5cGUob2JqZWN0KQorICAgICAgICBhcmdzID0gc2VsZi5maXh0eXBlKGFyZ3MpCisgICAgICAgIHJlYWxyZXN1bHQgPSBnZXRhdHRyKG9iamVjdCwgbWV0aG9kbmFtZSkoKmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICByZXN1bHQsCisgICAgICAgICAgICByZWFscmVzdWx0CisgICAgICAgICkKKyAgICAgICAgIyBpZiB0aGUgb3JpZ2luYWwgaXMgcmV0dXJuZWQgbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgIyB0aGlzIGRvZXNuJ3QgaGFwcGVuIHdpdGggc3ViY2xhc3NlcworICAgICAgICBpZiBvYmplY3QgPT0gcmVhbHJlc3VsdDoKKyAgICAgICAgICAgIGNsYXNzIHN1YnR5cGUoc2VsZi5fX2NsYXNzX18udHlwZTJ0ZXN0KToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBvYmplY3QgPSBzdWJ0eXBlKG9iamVjdCkKKyAgICAgICAgICAgIHJlYWxyZXN1bHQgPSBnZXRhdHRyKG9iamVjdCwgbWV0aG9kbmFtZSkoKmFyZ3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob2JqZWN0IGlzIG5vdCByZWFscmVzdWx0KQorCisgICAgIyBjaGVjayB0aGF0IG9iamVjdC5tZXRob2QoKmFyZ3MpIHJhaXNlcyBleGMKKyAgICBkZWYgY2hlY2tyYWlzZXMoc2VsZiwgZXhjLCBvYmplY3QsIG1ldGhvZG5hbWUsICphcmdzKToKKyAgICAgICAgb2JqZWN0ID0gc2VsZi5maXh0eXBlKG9iamVjdCkKKyAgICAgICAgYXJncyA9IHNlbGYuZml4dHlwZShhcmdzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIGV4YywKKyAgICAgICAgICAgIGdldGF0dHIob2JqZWN0LCBtZXRob2RuYW1lKSwKKyAgICAgICAgICAgICphcmdzCisgICAgICAgICkKKworICAgICMgY2FsbCBvYmplY3QubWV0aG9kKCphcmdzKSB3aXRob3V0IGFueSBjaGVja3MKKyAgICBkZWYgY2hlY2tjYWxsKHNlbGYsIG9iamVjdCwgbWV0aG9kbmFtZSwgKmFyZ3MpOgorICAgICAgICBvYmplY3QgPSBzZWxmLmZpeHR5cGUob2JqZWN0KQorICAgICAgICBhcmdzID0gc2VsZi5maXh0eXBlKGFyZ3MpCisgICAgICAgIGdldGF0dHIob2JqZWN0LCBtZXRob2RuYW1lKSgqYXJncykKKworICAgIGRlZiB0ZXN0X2hhc2goc2VsZik6CisgICAgICAgICMgU0YgYnVnIDEwNTQxMzk6ICArPSBvcHRpbWl6YXRpb24gd2FzIG5vdCBpbnZhbGlkYXRpbmcgY2FjaGVkIGhhc2ggdmFsdWUKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KCdETlNTRUMnKQorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoJycpCisgICAgICAgIGZvciBjIGluIGE6CisgICAgICAgICAgICBiICs9IGMKKyAgICAgICAgICAgIGhhc2goYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKGIpKQorCisgICAgZGVmIHRlc3RfY2FwaXRhbGl6ZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcgaGVsbG8gJywgJyBoZWxsbyAnLCAnY2FwaXRhbGl6ZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnSGVsbG8gJywgJ0hlbGxvICcsJ2NhcGl0YWxpemUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ0hlbGxvICcsICdoZWxsbyAnLCdjYXBpdGFsaXplJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdBYWFhJywgJ2FhYWEnLCAnY2FwaXRhbGl6ZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnQWFhYScsICdBYUFhJywgJ2NhcGl0YWxpemUnKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnY2FwaXRhbGl6ZScsIDQyKQorCisgICAgZGVmIHRlc3RfY291bnQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgzLCAnYWFhJywgJ2NvdW50JywgJ2EnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMCwgJ2FhYScsICdjb3VudCcsICdiJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsICdhYWEnLCAnY291bnQnLCAnYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnYWFhJywgJ2NvdW50JywgJ2InKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMywgJ2FhYScsICdjb3VudCcsICdhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICdhYWEnLCAnY291bnQnLCAnYicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnYWFhJywgJ2NvdW50JywgJ2InKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMiwgJ2FhYScsICdjb3VudCcsICdhJywgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICdhYWEnLCAnY291bnQnLCAnYScsIDEwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMSwgJ2FhYScsICdjb3VudCcsICdhJywgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgzLCAnYWFhJywgJ2NvdW50JywgJ2EnLCAtMTApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxLCAnYWFhJywgJ2NvdW50JywgJ2EnLCAwLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMywgJ2FhYScsICdjb3VudCcsICdhJywgMCwgMTApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgyLCAnYWFhJywgJ2NvdW50JywgJ2EnLCAwLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICdhYWEnLCAnY291bnQnLCAnYScsIDAsIC0xMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsICdhYWEnLCAnY291bnQnLCAnJywgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEsICdhYWEnLCAnY291bnQnLCAnJywgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICdhYWEnLCAnY291bnQnLCAnJywgMTApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgyLCAnYWFhJywgJ2NvdW50JywgJycsIC0xKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoNCwgJ2FhYScsICdjb3VudCcsICcnLCAtMTApCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEsICcnLCAnY291bnQnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICcnLCAnY291bnQnLCAnJywgMSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICcnLCAnY291bnQnLCAnJywgc3lzLm1heGludCwgMCkKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMCwgJycsICdjb3VudCcsICd4eCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnJywgJ2NvdW50JywgJ3h4JywgMSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICcnLCAnY291bnQnLCAneHgnLCBzeXMubWF4aW50LCAwKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnY291bnQnKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ2NvdW50JywgNDIpCisKKyAgICAgICAgIyBGb3IgYSB2YXJpZXR5IG9mIGNvbWJpbmF0aW9ucywKKyAgICAgICAgIyAgICB2ZXJpZnkgdGhhdCBzdHIuY291bnQoKSBtYXRjaGVzIGFuIGVxdWl2YWxlbnQgZnVuY3Rpb24KKyAgICAgICAgIyAgICByZXBsYWNpbmcgYWxsIG9jY3VycmVuY2VzIGFuZCB0aGVuIGRpZmZlcmVuY2luZyB0aGUgc3RyaW5nIGxlbmd0aHMKKyAgICAgICAgY2hhcnNldCA9IFsnJywgJ2EnLCAnYiddCisgICAgICAgIGRpZ2l0cyA9IDcKKyAgICAgICAgYmFzZSA9IGxlbihjaGFyc2V0KQorICAgICAgICB0ZXN0c3RyaW5ncyA9IHNldCgpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShiYXNlICoqIGRpZ2l0cyk6CisgICAgICAgICAgICBlbnRyeSA9IFtdCisgICAgICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoZGlnaXRzKToKKyAgICAgICAgICAgICAgICBpLCBtID0gZGl2bW9kKGksIGJhc2UpCisgICAgICAgICAgICAgICAgZW50cnkuYXBwZW5kKGNoYXJzZXRbbV0pCisgICAgICAgICAgICB0ZXN0c3RyaW5ncy5hZGQoJycuam9pbihlbnRyeSkpCisgICAgICAgIHRlc3RzdHJpbmdzID0gbGlzdCh0ZXN0c3RyaW5ncykKKyAgICAgICAgZm9yIGkgaW4gdGVzdHN0cmluZ3M6CisgICAgICAgICAgICBpID0gc2VsZi5maXh0eXBlKGkpCisgICAgICAgICAgICBuID0gbGVuKGkpCisgICAgICAgICAgICBmb3IgaiBpbiB0ZXN0c3RyaW5nczoKKyAgICAgICAgICAgICAgICByMSA9IGkuY291bnQoaikKKyAgICAgICAgICAgICAgICBpZiBqOgorICAgICAgICAgICAgICAgICAgICByMiwgcmVtID0gZGl2bW9kKG4gLSBsZW4oaS5yZXBsYWNlKGosICcnKSksIGxlbihqKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByMiwgcmVtID0gbGVuKGkpKzEsIDAKKyAgICAgICAgICAgICAgICBpZiByZW0gb3IgcjEgIT0gcjI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVtLCAwLCAnJXMgIT0gMCBmb3IgJXMnICUgKHJlbSwgaSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEsIHIyLCAnJXMgIT0gJXMgZm9yICVzJyAlIChyMSwgcjIsIGkpKQorCisgICAgZGVmIHRlc3RfZmluZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICdhYmNkZWZnaGlhYmMnLCAnZmluZCcsICdhYmMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoOSwgJ2FiY2RlZmdoaWFiYycsICdmaW5kJywgJ2FiYycsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgtMSwgJ2FiY2RlZmdoaWFiYycsICdmaW5kJywgJ2RlZicsIDQpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICdhYmMnLCAnZmluZCcsICcnLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMywgJ2FiYycsICdmaW5kJywgJycsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgtMSwgJ2FiYycsICdmaW5kJywgJycsIDQpCisKKyAgICAgICAgIyB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBwYXNzIE5vbmUgYXMgZGVmYXVsdHMKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCAyLCAncnJhcnJycnJycnJyYScsICdmaW5kJywgJ2EnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMTIsICdycmFycnJycnJycnJhJywgJ2ZpbmQnLCAnYScsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgtMSwgJ3JyYXJycnJycnJycmEnLCAnZmluZCcsICdhJywgNCwgNikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEyLCAncnJhcnJycnJycnJyYScsICdmaW5kJywgJ2EnLCA0LCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoIDIsICdycmFycnJycnJycnJhJywgJ2ZpbmQnLCAnYScsIE5vbmUsIDYpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdmaW5kJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdmaW5kJywgNDIpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICcnLCAnZmluZCcsICcnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoLTEsICcnLCAnZmluZCcsICcnLCAxLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoLTEsICcnLCAnZmluZCcsICcnLCBzeXMubWF4aW50LCAwKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgtMSwgJycsICdmaW5kJywgJ3h4JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKC0xLCAnJywgJ2ZpbmQnLCAneHgnLCAxLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoLTEsICcnLCAnZmluZCcsICd4eCcsIHN5cy5tYXhpbnQsIDApCisKKyAgICAgICAgIyBpc3N1ZSA3NDU4CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgtMSwgJ2FiJywgJ2ZpbmQnLCAneHh4Jywgc3lzLm1heHNpemUgKyAxLCAwKQorCisgICAgICAgICMgRm9yIGEgdmFyaWV0eSBvZiBjb21iaW5hdGlvbnMsCisgICAgICAgICMgICAgdmVyaWZ5IHRoYXQgc3RyLmZpbmQoKSBtYXRjaGVzIF9fY29udGFpbnNfXworICAgICAgICAjICAgIGFuZCB0aGF0IHRoZSBmb3VuZCBzdWJzdHJpbmcgaXMgcmVhbGx5IGF0IHRoYXQgbG9jYXRpb24KKyAgICAgICAgY2hhcnNldCA9IFsnJywgJ2EnLCAnYicsICdjJ10KKyAgICAgICAgZGlnaXRzID0gNQorICAgICAgICBiYXNlID0gbGVuKGNoYXJzZXQpCisgICAgICAgIHRlc3RzdHJpbmdzID0gc2V0KCkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGJhc2UgKiogZGlnaXRzKToKKyAgICAgICAgICAgIGVudHJ5ID0gW10KKyAgICAgICAgICAgIGZvciBqIGluIHhyYW5nZShkaWdpdHMpOgorICAgICAgICAgICAgICAgIGksIG0gPSBkaXZtb2QoaSwgYmFzZSkKKyAgICAgICAgICAgICAgICBlbnRyeS5hcHBlbmQoY2hhcnNldFttXSkKKyAgICAgICAgICAgIHRlc3RzdHJpbmdzLmFkZCgnJy5qb2luKGVudHJ5KSkKKyAgICAgICAgdGVzdHN0cmluZ3MgPSBsaXN0KHRlc3RzdHJpbmdzKQorICAgICAgICBmb3IgaSBpbiB0ZXN0c3RyaW5nczoKKyAgICAgICAgICAgIGkgPSBzZWxmLmZpeHR5cGUoaSkKKyAgICAgICAgICAgIGZvciBqIGluIHRlc3RzdHJpbmdzOgorICAgICAgICAgICAgICAgIGxvYyA9IGkuZmluZChqKQorICAgICAgICAgICAgICAgIHIxID0gKGxvYyAhPSAtMSkKKyAgICAgICAgICAgICAgICByMiA9IGogaW4gaQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEsIHIyKQorICAgICAgICAgICAgICAgIGlmIGxvYyAhPSAtMToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpW2xvYzpsb2MrbGVuKGopXSwgaikKKworICAgIGRlZiB0ZXN0X3JmaW5kKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoOSwgICdhYmNkZWZnaGlhYmMnLCAncmZpbmQnLCAnYWJjJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEyLCAnYWJjZGVmZ2hpYWJjJywgJ3JmaW5kJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnYWJjZGVmZ2hpYWJjJywgJ3JmaW5kJywgJ2FiY2QnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoLTEsICdhYmNkZWZnaGlhYmMnLCAncmZpbmQnLCAnYWJjeicpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsICdhYmMnLCAncmZpbmQnLCAnJywgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsICdhYmMnLCAncmZpbmQnLCAnJywgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKC0xLCAnYWJjJywgJ3JmaW5kJywgJycsIDQpCisKKyAgICAgICAgIyB0byBjaGVjayB0aGUgYWJpbGl0eSB0byBwYXNzIE5vbmUgYXMgZGVmYXVsdHMKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEyLCAncnJhcnJycnJycnJyYScsICdyZmluZCcsICdhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEyLCAncnJhcnJycnJycnJyYScsICdyZmluZCcsICdhJywgNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKC0xLCAncnJhcnJycnJycnJyYScsICdyZmluZCcsICdhJywgNCwgNikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEyLCAncnJhcnJycnJycnJyYScsICdyZmluZCcsICdhJywgNCwgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCAyLCAncnJhcnJycnJycnJyYScsICdyZmluZCcsICdhJywgTm9uZSwgNikKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3JmaW5kJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdyZmluZCcsIDQyKQorCisgICAgICAgICMgRm9yIGEgdmFyaWV0eSBvZiBjb21iaW5hdGlvbnMsCisgICAgICAgICMgICAgdmVyaWZ5IHRoYXQgc3RyLnJmaW5kKCkgbWF0Y2hlcyBfX2NvbnRhaW5zX18KKyAgICAgICAgIyAgICBhbmQgdGhhdCB0aGUgZm91bmQgc3Vic3RyaW5nIGlzIHJlYWxseSBhdCB0aGF0IGxvY2F0aW9uCisgICAgICAgIGNoYXJzZXQgPSBbJycsICdhJywgJ2InLCAnYyddCisgICAgICAgIGRpZ2l0cyA9IDUKKyAgICAgICAgYmFzZSA9IGxlbihjaGFyc2V0KQorICAgICAgICB0ZXN0c3RyaW5ncyA9IHNldCgpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShiYXNlICoqIGRpZ2l0cyk6CisgICAgICAgICAgICBlbnRyeSA9IFtdCisgICAgICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoZGlnaXRzKToKKyAgICAgICAgICAgICAgICBpLCBtID0gZGl2bW9kKGksIGJhc2UpCisgICAgICAgICAgICAgICAgZW50cnkuYXBwZW5kKGNoYXJzZXRbbV0pCisgICAgICAgICAgICB0ZXN0c3RyaW5ncy5hZGQoJycuam9pbihlbnRyeSkpCisgICAgICAgIHRlc3RzdHJpbmdzID0gbGlzdCh0ZXN0c3RyaW5ncykKKyAgICAgICAgZm9yIGkgaW4gdGVzdHN0cmluZ3M6CisgICAgICAgICAgICBpID0gc2VsZi5maXh0eXBlKGkpCisgICAgICAgICAgICBmb3IgaiBpbiB0ZXN0c3RyaW5nczoKKyAgICAgICAgICAgICAgICBsb2MgPSBpLnJmaW5kKGopCisgICAgICAgICAgICAgICAgcjEgPSAobG9jICE9IC0xKQorICAgICAgICAgICAgICAgIHIyID0gaiBpbiBpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyMSwgcjIpCisgICAgICAgICAgICAgICAgaWYgbG9jICE9IC0xOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlbbG9jOmxvYytsZW4oaildLCBzZWxmLmZpeHR5cGUoaikpCisKKyAgICAgICAgIyBpc3N1ZSA3NDU4CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgtMSwgJ2FiJywgJ3JmaW5kJywgJ3h4eCcsIHN5cy5tYXhzaXplICsgMSwgMCkKKworICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMCwgJ2FiY2RlZmdoaWFiYycsICdpbmRleCcsICcnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMywgJ2FiY2RlZmdoaWFiYycsICdpbmRleCcsICdkZWYnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMCwgJ2FiY2RlZmdoaWFiYycsICdpbmRleCcsICdhYmMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoOSwgJ2FiY2RlZmdoaWFiYycsICdpbmRleCcsICdhYmMnLCAxKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ2FiY2RlZmdoaWFiYycsICdpbmRleCcsICdoaWInKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICdhYmNkZWZnaGlhYicsICdpbmRleCcsICdhYmMnLCAxKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICdhYmNkZWZnaGknLCAnaW5kZXgnLCAnZ2hpJywgOCkKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnYWJjZGVmZ2hpJywgJ2luZGV4JywgJ2doaScsIC0xKQorCisgICAgICAgICMgdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gcGFzcyBOb25lIGFzIGRlZmF1bHRzCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCggMiwgJ3JyYXJycnJycnJycmEnLCAnaW5kZXgnLCAnYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxMiwgJ3JyYXJycnJycnJycmEnLCAnaW5kZXgnLCAnYScsIDQpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ3JyYXJycnJycnJycmEnLCAnaW5kZXgnLCAnYScsIDQsIDYpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxMiwgJ3JyYXJycnJycnJycmEnLCAnaW5kZXgnLCAnYScsIDQsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCggMiwgJ3JyYXJycnJycnJycmEnLCAnaW5kZXgnLCAnYScsIE5vbmUsIDYpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdpbmRleCcpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnaW5kZXgnLCA0MikKKworICAgIGRlZiB0ZXN0X3JpbmRleChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEyLCAnYWJjZGVmZ2hpYWJjJywgJ3JpbmRleCcsICcnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMywgICdhYmNkZWZnaGlhYmMnLCAncmluZGV4JywgJ2RlZicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCg5LCAgJ2FiY2RlZmdoaWFiYycsICdyaW5kZXgnLCAnYWJjJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICAnYWJjZGVmZ2hpYWJjJywgJ3JpbmRleCcsICdhYmMnLCAwLCAtMSkKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICdhYmNkZWZnaGlhYmMnLCAncmluZGV4JywgJ2hpYicpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ2RlZmdoaWFiYycsICdyaW5kZXgnLCAnZGVmJywgMSkKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnZGVmZ2hpYWJjJywgJ3JpbmRleCcsICdhYmMnLCAwLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnYWJjZGVmZ2hpJywgJ3JpbmRleCcsICdnaGknLCAwLCA4KQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICdhYmNkZWZnaGknLCAncmluZGV4JywgJ2doaScsIDAsIC0xKQorCisgICAgICAgICMgdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gcGFzcyBOb25lIGFzIGRlZmF1bHRzCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxMiwgJ3JyYXJycnJycnJycmEnLCAncmluZGV4JywgJ2EnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMTIsICdycmFycnJycnJycnJhJywgJ3JpbmRleCcsICdhJywgNCkKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAncnJhcnJycnJycnJyYScsICdyaW5kZXgnLCAnYScsIDQsIDYpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxMiwgJ3JyYXJycnJycnJycmEnLCAncmluZGV4JywgJ2EnLCA0LCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoIDIsICdycmFycnJycnJycnJhJywgJ3JpbmRleCcsICdhJywgTm9uZSwgNikKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3JpbmRleCcpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAncmluZGV4JywgNDIpCisKKyAgICBkZWYgdGVzdF9sb3dlcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoZWxsbycsICdIZUxMbycsICdsb3dlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnaGVsbG8nLCAnaGVsbG8nLCAnbG93ZXInKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ2xvd2VyJywgNDIpCisKKyAgICBkZWYgdGVzdF91cHBlcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdIRUxMTycsICdIZUxMbycsICd1cHBlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnSEVMTE8nLCAnSEVMTE8nLCAndXBwZXInKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3VwcGVyJywgNDIpCisKKyAgICBkZWYgdGVzdF9leHBhbmR0YWJzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiY1xyYWIgICAgICBkZWZcbmcgICAgICAgaGknLCAnYWJjXHJhYlx0ZGVmXG5nXHRoaScsICdleHBhbmR0YWJzJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmNccmFiICAgICAgZGVmXG5nICAgICAgIGhpJywgJ2FiY1xyYWJcdGRlZlxuZ1x0aGknLCAnZXhwYW5kdGFicycsIDgpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjXHJhYiAgZGVmXG5nICAgaGknLCAnYWJjXHJhYlx0ZGVmXG5nXHRoaScsICdleHBhbmR0YWJzJywgNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmNcclxuYWIgIGRlZlxuZyAgIGhpJywgJ2FiY1xyXG5hYlx0ZGVmXG5nXHRoaScsICdleHBhbmR0YWJzJywgNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmNccmFiICAgICAgZGVmXG5nICAgICAgIGhpJywgJ2FiY1xyYWJcdGRlZlxuZ1x0aGknLCAnZXhwYW5kdGFicycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScsICdhYmNccmFiXHRkZWZcbmdcdGhpJywgJ2V4cGFuZHRhYnMnLCA4KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiY1xyXG5hYlxyXG5kZWZcbmdcclxuaGknLCAnYWJjXHJcbmFiXHJcbmRlZlxuZ1xyXG5oaScsICdleHBhbmR0YWJzJywgNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcgIGFcbiBiJywgJyBcdGFcblx0YicsICdleHBhbmR0YWJzJywgMSkKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ2V4cGFuZHRhYnMnLCA0MiwgNDIpCisgICAgICAgICMgVGhpcyB0ZXN0IGlzIG9ubHkgdmFsaWQgd2hlbiBzaXplb2YoaW50KSA9PSBzaXplb2Yodm9pZCopID09IDQuCisgICAgICAgIGlmIHN5cy5tYXhpbnQgPCAoMSA8PCAzMikgYW5kIHN0cnVjdC5jYWxjc2l6ZSgnUCcpID09IDQ6CisgICAgICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKE92ZXJmbG93RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcdGFcblx0YicsICdleHBhbmR0YWJzJywgc3lzLm1heGludCkKKworICAgIGRlZiB0ZXN0X3NwbGl0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWyd0aGlzJywgJ2lzJywgJ3RoZScsICdzcGxpdCcsICdmdW5jdGlvbiddLAorICAgICAgICAgICAgJ3RoaXMgaXMgdGhlIHNwbGl0IGZ1bmN0aW9uJywgJ3NwbGl0JykKKworICAgICAgICAjIGJ5IHdoaXRlc3BhY2UKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYSBiIGMgZCAnLCAnc3BsaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2IgYyBkJ10sICdhIGIgYyBkJywgJ3NwbGl0JywgTm9uZSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MgZCddLCAnYSBiIGMgZCcsICdzcGxpdCcsIE5vbmUsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EgYiBjIGQnLCAnc3BsaXQnLCBOb25lLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhIGIgYyBkJywgJ3NwbGl0JywgTm9uZSwgNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYSBiIGMgZCcsICdzcGxpdCcsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBzeXMubWF4aW50LTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EgYiBjIGQnXSwgJ2EgYiBjIGQnLCAnc3BsaXQnLCBOb25lLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhIGIgYyBkJ10sICcgIGEgYiBjIGQnLCAnc3BsaXQnLCBOb25lLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYyAgZCddLCAnYSAgYiAgYyAgZCcsICdzcGxpdCcsIE5vbmUsIDIpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFtdLCAnICAgICAgICAgJywgJ3NwbGl0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddLCAnICBhICAgICcsICdzcGxpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYiddLCAnICBhICAgIGIgICAnLCAnc3BsaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2IgICAnXSwgJyAgYSAgICBiICAgJywgJ3NwbGl0JywgTm9uZSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiICAgYyAgICddLCAnICBhICAgIGIgICBjICAgJywgJ3NwbGl0JywgTm9uZSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MgICAnXSwgJyAgYSAgICBiICAgYyAgICcsICdzcGxpdCcsIE5vbmUsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYiddLCAnXG5cdGEgXHRcciBiIFx2ICcsICdzcGxpdCcpCisgICAgICAgIGFhYSA9ICcgYSAnKjIwCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSoyMCwgYWFhLCAnc3BsaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10gKyBbYWFhWzQ6XV0sIGFhYSwgJ3NwbGl0JywgTm9uZSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddKjE5ICsgWydhICddLCBhYWEsICdzcGxpdCcsIE5vbmUsIDE5KQorCisgICAgICAgICMgYnkgYSBjaGFyCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2F8YnxjfGQnLCAnc3BsaXQnLCAnfCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2F8YnxjfGQnXSwgJ2F8YnxjfGQnLCAnc3BsaXQnLCAnfCcsIDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYnxjfGQnXSwgJ2F8YnxjfGQnLCAnc3BsaXQnLCAnfCcsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjfGQnXSwgJ2F8YnxjfGQnLCAnc3BsaXQnLCAnfCcsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2F8YnxjfGQnLCAnc3BsaXQnLCAnfCcsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2F8YnxjfGQnLCAnc3BsaXQnLCAnfCcsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2F8YnxjfGQnLCAnc3BsaXQnLCAnfCcsCisgICAgICAgICAgICAgICAgICAgICAgICBzeXMubWF4aW50LTIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2F8YnxjfGQnXSwgJ2F8YnxjfGQnLCAnc3BsaXQnLCAnfCcsIDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnJywgJ2J8fGN8fGQnXSwgJ2F8fGJ8fGN8fGQnLCAnc3BsaXQnLCAnfCcsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2VuZGNhc2UgJywgJyddLCAnZW5kY2FzZSB8JywgJ3NwbGl0JywgJ3wnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnIHN0YXJ0Y2FzZSddLCAnfCBzdGFydGNhc2UnLCAnc3BsaXQnLCAnfCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJycsICdib3RoY2FzZScsICcnXSwgJ3xib3RoY2FzZXwnLCAnc3BsaXQnLCAnfCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnJywgJ2JceDAwY1x4MDBkJ10sICdhXHgwMFx4MDBiXHgwMGNceDAwZCcsICdzcGxpdCcsICdceDAwJywgMikKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMjAsICgnYXwnKjIwKVs6LTFdLCAnc3BsaXQnLCAnfCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSoxNSArWydhfGF8YXxhfGEnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdhfCcqMjApWzotMV0sICdzcGxpdCcsICd8JywgMTUpCisKKyAgICAgICAgIyBieSBzdHJpbmcKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYS8vYi8vYy8vZCcsICdzcGxpdCcsICcvLycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYi8vYy8vZCddLCAnYS8vYi8vYy8vZCcsICdzcGxpdCcsICcvLycsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjLy9kJ10sICdhLy9iLy9jLy9kJywgJ3NwbGl0JywgJy8vJywgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYS8vYi8vYy8vZCcsICdzcGxpdCcsICcvLycsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EvL2IvL2MvL2QnLCAnc3BsaXQnLCAnLy8nLCA0KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhLy9iLy9jLy9kJywgJ3NwbGl0JywgJy8vJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5tYXhpbnQtMTApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EvL2IvL2MvL2QnXSwgJ2EvL2IvL2MvL2QnLCAnc3BsaXQnLCAnLy8nLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJycsICdiLy8vL2MvLy8vZCddLCAnYS8vLy9iLy8vL2MvLy8vZCcsICdzcGxpdCcsICcvLycsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2VuZGNhc2UgJywgJyddLCAnZW5kY2FzZSB0ZXN0JywgJ3NwbGl0JywgJ3Rlc3QnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnIGJlZ2luY2FzZSddLCAndGVzdCBiZWdpbmNhc2UnLCAnc3BsaXQnLCAndGVzdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJycsICcgYm90aGNhc2UgJywgJyddLCAndGVzdCBib3RoY2FzZSB0ZXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzcGxpdCcsICd0ZXN0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiYyddLCAnYWJiYmMnLCAnc3BsaXQnLCAnYmInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnJ10sICdhYWEnLCAnc3BsaXQnLCAnYWFhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYWFhJ10sICdhYWEnLCAnc3BsaXQnLCAnYWFhJywgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYWInLCAnYWInXSwgJ2FiYmFhYicsICdzcGxpdCcsICdiYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FhYWEnXSwgJ2FhYWEnLCAnc3BsaXQnLCAnYWFiJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJ10sICcnLCAnc3BsaXQnLCAnYWFhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYWEnXSwgJ2FhJywgJ3NwbGl0JywgJ2FhYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ0EnLCAnYm9iYiddLCAnQWJib2JiYm9iYicsICdzcGxpdCcsICdiYm9iYicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ0EnLCAnQicsICcnXSwgJ0FiYm9iYkJiYm9iYicsICdzcGxpdCcsICdiYm9iYicpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddKjIwLCAoJ2FCTEFIJyoyMClbOi00XSwgJ3NwbGl0JywgJ0JMQUgnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMjAsICgnYUJMQUgnKjIwKVs6LTRdLCAnc3BsaXQnLCAnQkxBSCcsIDE5KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMTggKyBbJ2FCTEFIYSddLCAoJ2FCTEFIJyoyMClbOi00XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdzcGxpdCcsICdCTEFIJywgMTgpCisKKyAgICAgICAgIyBtaXhlZCB1c2Ugb2Ygc3RyIGFuZCB1bmljb2RlCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbdSdhJywgdSdiJywgdSdjIGQnXSwgJ2EgYiBjIGQnLCAnc3BsaXQnLCB1JyAnLCAyKQorCisgICAgICAgICMgYXJndW1lbnQgdHlwZQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3NwbGl0JywgNDIsIDQyLCA0MikKKworICAgICAgICAjIG51bGwgY2FzZQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICdoZWxsbycsICdzcGxpdCcsICcnKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICdoZWxsbycsICdzcGxpdCcsICcnLCAwKQorCisgICAgZGVmIHRlc3RfcnNwbGl0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWyd0aGlzJywgJ2lzJywgJ3RoZScsICdyc3BsaXQnLCAnZnVuY3Rpb24nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGhpcyBpcyB0aGUgcnNwbGl0IGZ1bmN0aW9uJywgJ3JzcGxpdCcpCisKKyAgICAgICAgIyBieSB3aGl0ZXNwYWNlCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EgYiBjIGQgJywgJ3JzcGxpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EgYiBjJywgJ2QnXSwgJ2EgYiBjIGQnLCAncnNwbGl0JywgTm9uZSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSBiJywgJ2MnLCAnZCddLCAnYSBiIGMgZCcsICdyc3BsaXQnLCBOb25lLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhIGIgYyBkJywgJ3JzcGxpdCcsIE5vbmUsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EgYiBjIGQnLCAncnNwbGl0JywgTm9uZSwgNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYSBiIGMgZCcsICdyc3BsaXQnLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLm1heGludC0yMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSBiIGMgZCddLCAnYSBiIGMgZCcsICdyc3BsaXQnLCBOb25lLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhIGIgYyBkJ10sICdhIGIgYyBkICAnLCAncnNwbGl0JywgTm9uZSwgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSAgYicsICdjJywgJ2QnXSwgJ2EgIGIgIGMgIGQnLCAncnNwbGl0JywgTm9uZSwgMikKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoW10sICcgICAgICAgICAnLCAncnNwbGl0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddLCAnICBhICAgICcsICdyc3BsaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InXSwgJyAgYSAgICBiICAgJywgJ3JzcGxpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJyAgYScsICdiJ10sICcgIGEgICAgYiAgICcsICdyc3BsaXQnLCBOb25lLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycgIGEgICAgYicsJ2MnXSwgJyAgYSAgICBiICAgYyAgICcsICdyc3BsaXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnICBhJywgJ2InLCAnYyddLCAnICBhICAgIGIgICBjICAgJywgJ3JzcGxpdCcsCisgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InXSwgJ1xuXHRhIFx0XHIgYiBcdiAnLCAncnNwbGl0JywgTm9uZSwgODgpCisgICAgICAgIGFhYSA9ICcgYSAnKjIwCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSoyMCwgYWFhLCAncnNwbGl0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFthYWFbOi00XV0gKyBbJ2EnXSwgYWFhLCAncnNwbGl0JywgTm9uZSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnIGEgIGEnXSArIFsnYSddKjE4LCBhYWEsICdyc3BsaXQnLCBOb25lLCAxOCkKKworCisgICAgICAgICMgYnkgYSBjaGFyCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2F8YnxjfGQnLCAncnNwbGl0JywgJ3wnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhfGJ8YycsICdkJ10sICdhfGJ8Y3xkJywgJ3JzcGxpdCcsICd8JywgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYXxiJywgJ2MnLCAnZCddLCAnYXxifGN8ZCcsICdyc3BsaXQnLCAnfCcsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2F8YnxjfGQnLCAncnNwbGl0JywgJ3wnLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3JzcGxpdCcsICd8JywgNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYXxifGN8ZCcsICdyc3BsaXQnLCAnfCcsCisgICAgICAgICAgICAgICAgICAgICAgICBzeXMubWF4aW50LTEwMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYXxifGN8ZCddLCAnYXxifGN8ZCcsICdyc3BsaXQnLCAnfCcsIDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2F8fGJ8fGMnLCAnJywgJ2QnXSwgJ2F8fGJ8fGN8fGQnLCAncnNwbGl0JywgJ3wnLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnIGJlZ2luY2FzZSddLCAnfCBiZWdpbmNhc2UnLCAncnNwbGl0JywgJ3wnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydlbmRjYXNlICcsICcnXSwgJ2VuZGNhc2UgfCcsICdyc3BsaXQnLCAnfCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJycsICdib3RoY2FzZScsICcnXSwgJ3xib3RoY2FzZXwnLCAncnNwbGl0JywgJ3wnKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FceDAwXHgwMGInLCAnYycsICdkJ10sICdhXHgwMFx4MDBiXHgwMGNceDAwZCcsICdyc3BsaXQnLCAnXHgwMCcsIDIpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddKjIwLCAoJ2F8JyoyMClbOi0xXSwgJ3JzcGxpdCcsICd8JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYXxhfGF8YXxhJ10rWydhJ10qMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAoJ2F8JyoyMClbOi0xXSwgJ3JzcGxpdCcsICd8JywgMTUpCisKKyAgICAgICAgIyBieSBzdHJpbmcKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYS8vYi8vYy8vZCcsICdyc3BsaXQnLCAnLy8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhLy9iLy9jJywgJ2QnXSwgJ2EvL2IvL2MvL2QnLCAncnNwbGl0JywgJy8vJywgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYS8vYicsICdjJywgJ2QnXSwgJ2EvL2IvL2MvL2QnLCAncnNwbGl0JywgJy8vJywgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYS8vYi8vYy8vZCcsICdyc3BsaXQnLCAnLy8nLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhLy9iLy9jLy9kJywgJ3JzcGxpdCcsICcvLycsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EvL2IvL2MvL2QnLCAncnNwbGl0JywgJy8vJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5tYXhpbnQtNSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYS8vYi8vYy8vZCddLCAnYS8vYi8vYy8vZCcsICdyc3BsaXQnLCAnLy8nLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhLy8vL2IvLy8vYycsICcnLCAnZCddLCAnYS8vLy9iLy8vL2MvLy8vZCcsICdyc3BsaXQnLCAnLy8nLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnIGJlZ2luY2FzZSddLCAndGVzdCBiZWdpbmNhc2UnLCAncnNwbGl0JywgJ3Rlc3QnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydlbmRjYXNlICcsICcnXSwgJ2VuZGNhc2UgdGVzdCcsICdyc3BsaXQnLCAndGVzdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJycsICcgYm90aGNhc2UgJywgJyddLCAndGVzdCBib3RoY2FzZSB0ZXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdyc3BsaXQnLCAndGVzdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FiJywgJ2MnXSwgJ2FiYmJjJywgJ3JzcGxpdCcsICdiYicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJycsICcnXSwgJ2FhYScsICdyc3BsaXQnLCAnYWFhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYWFhJ10sICdhYWEnLCAncnNwbGl0JywgJ2FhYScsIDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FiJywgJ2FiJ10sICdhYmJhYWInLCAncnNwbGl0JywgJ2JhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYWFhYSddLCAnYWFhYScsICdyc3BsaXQnLCAnYWFiJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJ10sICcnLCAncnNwbGl0JywgJ2FhYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FhJ10sICdhYScsICdyc3BsaXQnLCAnYWFhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYmJvYicsICdBJ10sICdiYm9iYmJvYmJBJywgJ3JzcGxpdCcsICdiYm9iYicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJycsICdCJywgJ0EnXSwgJ2Jib2JiQmJib2JiQScsICdyc3BsaXQnLCAnYmJvYmInKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSoyMCwgKCdhQkxBSCcqMjApWzotNF0sICdyc3BsaXQnLCAnQkxBSCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSoyMCwgKCdhQkxBSCcqMjApWzotNF0sICdyc3BsaXQnLCAnQkxBSCcsIDE5KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhQkxBSGEnXSArIFsnYSddKjE4LCAoJ2FCTEFIJyoyMClbOi00XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdyc3BsaXQnLCAnQkxBSCcsIDE4KQorCisgICAgICAgICMgbWl4ZWQgdXNlIG9mIHN0ciBhbmQgdW5pY29kZQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoW3UnYSBiJywgdSdjJywgdSdkJ10sICdhIGIgYyBkJywgJ3JzcGxpdCcsIHUnICcsIDIpCisKKyAgICAgICAgIyBhcmd1bWVudCB0eXBlCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAncnNwbGl0JywgNDIsIDQyLCA0MikKKworICAgICAgICAjIG51bGwgY2FzZQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICdoZWxsbycsICdyc3BsaXQnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnaGVsbG8nLCAncnNwbGl0JywgJycsIDApCisKKyAgICBkZWYgdGVzdF9zdHJpcChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoZWxsbycsICcgICBoZWxsbyAgICcsICdzdHJpcCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnaGVsbG8gICAnLCAnICAgaGVsbG8gICAnLCAnbHN0cmlwJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcgICBoZWxsbycsICcgICBoZWxsbyAgICcsICdyc3RyaXAnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2hlbGxvJywgJ2hlbGxvJywgJ3N0cmlwJykKKworICAgICAgICAjIHN0cmlwL2xzdHJpcC9yc3RyaXAgd2l0aCBOb25lIGFyZworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2hlbGxvJywgJyAgIGhlbGxvICAgJywgJ3N0cmlwJywgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoZWxsbyAgICcsICcgICBoZWxsbyAgICcsICdsc3RyaXAnLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJyAgIGhlbGxvJywgJyAgIGhlbGxvICAgJywgJ3JzdHJpcCcsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnaGVsbG8nLCAnaGVsbG8nLCAnc3RyaXAnLCBOb25lKQorCisgICAgICAgICMgc3RyaXAvbHN0cmlwL3JzdHJpcCB3aXRoIHN0ciBhcmcKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoZWxsbycsICd4eXp6eWhlbGxveHl6enknLCAnc3RyaXAnLCAneHl6JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoZWxsb3h5enp5JywgJ3h5enp5aGVsbG94eXp6eScsICdsc3RyaXAnLCAneHl6JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCd4eXp6eWhlbGxvJywgJ3h5enp5aGVsbG94eXp6eScsICdyc3RyaXAnLCAneHl6JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoZWxsbycsICdoZWxsbycsICdzdHJpcCcsICd4eXonKQorCisgICAgICAgICMgc3RyaXAvbHN0cmlwL3JzdHJpcCB3aXRoIHVuaWNvZGUgYXJnCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwodW5pY29kZSgnaGVsbG8nLCAnYXNjaWknKSwgJ3h5enp5aGVsbG94eXp6eScsCisgICAgICAgICAgICAgICAgICdzdHJpcCcsIHVuaWNvZGUoJ3h5eicsICdhc2NpaScpKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKHVuaWNvZGUoJ2hlbGxveHl6enknLCAnYXNjaWknKSwgJ3h5enp5aGVsbG94eXp6eScsCisgICAgICAgICAgICAgICAgICdsc3RyaXAnLCB1bmljb2RlKCd4eXonLCAnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1bmljb2RlKCd4eXp6eWhlbGxvJywgJ2FzY2lpJyksICd4eXp6eWhlbGxveHl6enknLAorICAgICAgICAgICAgICAgICAncnN0cmlwJywgdW5pY29kZSgneHl6JywgJ2FzY2lpJykpCisgICAgICAgICAgICAjIFhYWAorICAgICAgICAgICAgI3NlbGYuY2hlY2tlcXVhbCh1bmljb2RlKCdoZWxsbycsICdhc2NpaScpLCAnaGVsbG8nLAorICAgICAgICAgICAgIyAgICAgJ3N0cmlwJywgdW5pY29kZSgneHl6JywgJ2FzY2lpJykpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdzdHJpcCcsIDQyLCA0MikKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdsc3RyaXAnLCA0MiwgNDIpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAncnN0cmlwJywgNDIsIDQyKQorCisgICAgZGVmIHRlc3RfbGp1c3Qoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjICAgICAgICcsICdhYmMnLCAnbGp1c3QnLCAxMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmMgICAnLCAnYWJjJywgJ2xqdXN0JywgNikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmMnLCAnYWJjJywgJ2xqdXN0JywgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmMnLCAnYWJjJywgJ2xqdXN0JywgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmMqKioqKioqJywgJ2FiYycsICdsanVzdCcsIDEwLCAnKicpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnYWJjJywgJ2xqdXN0JykKKworICAgIGRlZiB0ZXN0X3JqdXN0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJyAgICAgICBhYmMnLCAnYWJjJywgJ3JqdXN0JywgMTApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnICAgYWJjJywgJ2FiYycsICdyanVzdCcsIDYpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjJywgJ2FiYycsICdyanVzdCcsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjJywgJ2FiYycsICdyanVzdCcsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnKioqKioqKmFiYycsICdhYmMnLCAncmp1c3QnLCAxMCwgJyonKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdyanVzdCcpCisKKyAgICBkZWYgdGVzdF9jZW50ZXIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnICAgYWJjICAgICcsICdhYmMnLCAnY2VudGVyJywgMTApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnIGFiYyAgJywgJ2FiYycsICdjZW50ZXInLCA2KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYycsICdhYmMnLCAnY2VudGVyJywgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmMnLCAnYWJjJywgJ2NlbnRlcicsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnKioqYWJjKioqKicsICdhYmMnLCAnY2VudGVyJywgMTAsICcqJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnY2VudGVyJykKKworICAgIGRlZiB0ZXN0X3N3YXBjYXNlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2hFbGxPIENvTVB1VEVyUycsICdIZUxMbyBjT21wVXRlUnMnLCAnc3dhcGNhc2UnKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnc3dhcGNhc2UnLCA0MikKKworICAgIGRlZiB0ZXN0X3JlcGxhY2Uoc2VsZik6CisgICAgICAgIEVRID0gc2VsZi5jaGVja2VxdWFsCisKKyAgICAgICAgIyBPcGVyYXRpb25zIG9uIHRoZSBlbXB0eSBzdHJpbmcKKyAgICAgICAgRVEoIiIsICIiLCAicmVwbGFjZSIsICIiLCAiIikKKyAgICAgICAgRVEoIkEiLCAiIiwgInJlcGxhY2UiLCAiIiwgIkEiKQorICAgICAgICBFUSgiIiwgIiIsICJyZXBsYWNlIiwgIkEiLCAiIikKKyAgICAgICAgRVEoIiIsICIiLCAicmVwbGFjZSIsICJBIiwgIkEiKQorICAgICAgICBFUSgiIiwgIiIsICJyZXBsYWNlIiwgIiIsICIiLCAxMDApCisgICAgICAgIEVRKCIiLCAiIiwgInJlcGxhY2UiLCAiIiwgIiIsIHN5cy5tYXhpbnQpCisKKyAgICAgICAgIyBpbnRlcmxlYXZlIChmcm9tPT0iIiwgJ3RvJyBnZXRzIGluc2VydGVkIGV2ZXJ5d2hlcmUpCisgICAgICAgIEVRKCJBIiwgIkEiLCAicmVwbGFjZSIsICIiLCAiIikKKyAgICAgICAgRVEoIipBKiIsICJBIiwgInJlcGxhY2UiLCAiIiwgIioiKQorICAgICAgICBFUSgiKjFBKjEiLCAiQSIsICJyZXBsYWNlIiwgIiIsICIqMSIpCisgICAgICAgIEVRKCIqLSNBKi0jIiwgIkEiLCAicmVwbGFjZSIsICIiLCAiKi0jIikKKyAgICAgICAgRVEoIiotQSotQSotIiwgIkFBIiwgInJlcGxhY2UiLCAiIiwgIiotIikKKyAgICAgICAgRVEoIiotQSotQSotIiwgIkFBIiwgInJlcGxhY2UiLCAiIiwgIiotIiwgLTEpCisgICAgICAgIEVRKCIqLUEqLUEqLSIsICJBQSIsICJyZXBsYWNlIiwgIiIsICIqLSIsIHN5cy5tYXhpbnQpCisgICAgICAgIEVRKCIqLUEqLUEqLSIsICJBQSIsICJyZXBsYWNlIiwgIiIsICIqLSIsIDQpCisgICAgICAgIEVRKCIqLUEqLUEqLSIsICJBQSIsICJyZXBsYWNlIiwgIiIsICIqLSIsIDMpCisgICAgICAgIEVRKCIqLUEqLUEiLCAiQUEiLCAicmVwbGFjZSIsICIiLCAiKi0iLCAyKQorICAgICAgICBFUSgiKi1BQSIsICJBQSIsICJyZXBsYWNlIiwgIiIsICIqLSIsIDEpCisgICAgICAgIEVRKCJBQSIsICJBQSIsICJyZXBsYWNlIiwgIiIsICIqLSIsIDApCisKKyAgICAgICAgIyBzaW5nbGUgY2hhcmFjdGVyIGRlbGV0aW9uIChmcm9tPT0iQSIsIHRvPT0iIikKKyAgICAgICAgRVEoIiIsICJBIiwgInJlcGxhY2UiLCAiQSIsICIiKQorICAgICAgICBFUSgiIiwgIkFBQSIsICJyZXBsYWNlIiwgIkEiLCAiIikKKyAgICAgICAgRVEoIiIsICJBQUEiLCAicmVwbGFjZSIsICJBIiwgIiIsIC0xKQorICAgICAgICBFUSgiIiwgIkFBQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgc3lzLm1heGludCkKKyAgICAgICAgRVEoIiIsICJBQUEiLCAicmVwbGFjZSIsICJBIiwgIiIsIDQpCisgICAgICAgIEVRKCIiLCAiQUFBIiwgInJlcGxhY2UiLCAiQSIsICIiLCAzKQorICAgICAgICBFUSgiQSIsICJBQUEiLCAicmVwbGFjZSIsICJBIiwgIiIsIDIpCisgICAgICAgIEVRKCJBQSIsICJBQUEiLCAicmVwbGFjZSIsICJBIiwgIiIsIDEpCisgICAgICAgIEVRKCJBQUEiLCAiQUFBIiwgInJlcGxhY2UiLCAiQSIsICIiLCAwKQorICAgICAgICBFUSgiIiwgIkFBQUFBQUFBQUEiLCAicmVwbGFjZSIsICJBIiwgIiIpCisgICAgICAgIEVRKCJCQ0QiLCAiQUJBQ0FEQSIsICJyZXBsYWNlIiwgIkEiLCAiIikKKyAgICAgICAgRVEoIkJDRCIsICJBQkFDQURBIiwgInJlcGxhY2UiLCAiQSIsICIiLCAtMSkKKyAgICAgICAgRVEoIkJDRCIsICJBQkFDQURBIiwgInJlcGxhY2UiLCAiQSIsICIiLCBzeXMubWF4aW50KQorICAgICAgICBFUSgiQkNEIiwgIkFCQUNBREEiLCAicmVwbGFjZSIsICJBIiwgIiIsIDUpCisgICAgICAgIEVRKCJCQ0QiLCAiQUJBQ0FEQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgNCkKKyAgICAgICAgRVEoIkJDREEiLCAiQUJBQ0FEQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgMykKKyAgICAgICAgRVEoIkJDQURBIiwgIkFCQUNBREEiLCAicmVwbGFjZSIsICJBIiwgIiIsIDIpCisgICAgICAgIEVRKCJCQUNBREEiLCAiQUJBQ0FEQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgMSkKKyAgICAgICAgRVEoIkFCQUNBREEiLCAiQUJBQ0FEQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgMCkKKyAgICAgICAgRVEoIkJDRCIsICJBQkNBRCIsICJyZXBsYWNlIiwgIkEiLCAiIikKKyAgICAgICAgRVEoIkJDRCIsICJBQkNBREFBIiwgInJlcGxhY2UiLCAiQSIsICIiKQorICAgICAgICBFUSgiQkNEIiwgIkJDRCIsICJyZXBsYWNlIiwgIkEiLCAiIikKKyAgICAgICAgRVEoIioqKioqKioqKioqKioiLCAiKioqKioqKioqKioqKiIsICJyZXBsYWNlIiwgIkEiLCAiIikKKyAgICAgICAgRVEoIl5BXiIsICJeIisiQSIqMTAwMCsiXiIsICJyZXBsYWNlIiwgIkEiLCAiIiwgOTk5KQorCisgICAgICAgICMgc3Vic3RyaW5nIGRlbGV0aW9uIChmcm9tPT0idGhlIiwgdG89PSIiKQorICAgICAgICBFUSgiIiwgInRoZSIsICJyZXBsYWNlIiwgInRoZSIsICIiKQorICAgICAgICBFUSgiYXRlciIsICJ0aGVhdGVyIiwgInJlcGxhY2UiLCAidGhlIiwgIiIpCisgICAgICAgIEVRKCIiLCAidGhldGhlIiwgInJlcGxhY2UiLCAidGhlIiwgIiIpCisgICAgICAgIEVRKCIiLCAidGhldGhldGhldGhlIiwgInJlcGxhY2UiLCAidGhlIiwgIiIpCisgICAgICAgIEVRKCJhYWFhIiwgInRoZWF0aGVhdGhlYXRoZWEiLCAicmVwbGFjZSIsICJ0aGUiLCAiIikKKyAgICAgICAgRVEoInRoYXQiLCAidGhhdCIsICJyZXBsYWNlIiwgInRoZSIsICIiKQorICAgICAgICBFUSgidGhhZXQiLCAidGhhZXQiLCAicmVwbGFjZSIsICJ0aGUiLCAiIikKKyAgICAgICAgRVEoImhlcmUgYW5kIHJlIiwgImhlcmUgYW5kIHRoZXJlIiwgInJlcGxhY2UiLCAidGhlIiwgIiIpCisgICAgICAgIEVRKCJoZXJlIGFuZCByZSBhbmQgcmUiLCAiaGVyZSBhbmQgdGhlcmUgYW5kIHRoZXJlIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAidGhlIiwgIiIsIHN5cy5tYXhpbnQpCisgICAgICAgIEVRKCJoZXJlIGFuZCByZSBhbmQgcmUiLCAiaGVyZSBhbmQgdGhlcmUgYW5kIHRoZXJlIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAidGhlIiwgIiIsIC0xKQorICAgICAgICBFUSgiaGVyZSBhbmQgcmUgYW5kIHJlIiwgImhlcmUgYW5kIHRoZXJlIGFuZCB0aGVyZSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInRoZSIsICIiLCAzKQorICAgICAgICBFUSgiaGVyZSBhbmQgcmUgYW5kIHJlIiwgImhlcmUgYW5kIHRoZXJlIGFuZCB0aGVyZSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInRoZSIsICIiLCAyKQorICAgICAgICBFUSgiaGVyZSBhbmQgcmUgYW5kIHRoZXJlIiwgImhlcmUgYW5kIHRoZXJlIGFuZCB0aGVyZSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInRoZSIsICIiLCAxKQorICAgICAgICBFUSgiaGVyZSBhbmQgdGhlcmUgYW5kIHRoZXJlIiwgImhlcmUgYW5kIHRoZXJlIGFuZCB0aGVyZSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInRoZSIsICIiLCAwKQorICAgICAgICBFUSgiaGVyZSBhbmQgcmUgYW5kIHJlIiwgImhlcmUgYW5kIHRoZXJlIGFuZCB0aGVyZSIsICJyZXBsYWNlIiwgInRoZSIsICIiKQorCisgICAgICAgIEVRKCJhYmMiLCAiYWJjIiwgInJlcGxhY2UiLCAidGhlIiwgIiIpCisgICAgICAgIEVRKCJhYmNkZWZnIiwgImFiY2RlZmciLCAicmVwbGFjZSIsICJ0aGUiLCAiIikKKworICAgICAgICAjIHN1YnN0cmluZyBkZWxldGlvbiAoZnJvbT09ImJvYiIsIHRvPT0iIikKKyAgICAgICAgRVEoImJvYiIsICJiYm9ib2IiLCAicmVwbGFjZSIsICJib2IiLCAiIikKKyAgICAgICAgRVEoImJvYlhib2IiLCAiYmJvYm9iWGJib2JvYiIsICJyZXBsYWNlIiwgImJvYiIsICIiKQorICAgICAgICBFUSgiYWFhYWFhYSIsICJhYWFhYWFhYm9iIiwgInJlcGxhY2UiLCAiYm9iIiwgIiIpCisgICAgICAgIEVRKCJhYWFhYWFhIiwgImFhYWFhYWEiLCAicmVwbGFjZSIsICJib2IiLCAiIikKKworICAgICAgICAjIHNpbmdsZSBjaGFyYWN0ZXIgcmVwbGFjZSBpbiBwbGFjZSAobGVuKGZyb20pPT1sZW4odG8pPT0xKQorICAgICAgICBFUSgiV2hvIGdvZXMgdGhlcmU/IiwgIldobyBnb2VzIHRoZXJlPyIsICJyZXBsYWNlIiwgIm8iLCAibyIpCisgICAgICAgIEVRKCJXaE8gZ09lcyB0aGVyZT8iLCAiV2hvIGdvZXMgdGhlcmU/IiwgInJlcGxhY2UiLCAibyIsICJPIikKKyAgICAgICAgRVEoIldoTyBnT2VzIHRoZXJlPyIsICJXaG8gZ29lcyB0aGVyZT8iLCAicmVwbGFjZSIsICJvIiwgIk8iLCBzeXMubWF4aW50KQorICAgICAgICBFUSgiV2hPIGdPZXMgdGhlcmU/IiwgIldobyBnb2VzIHRoZXJlPyIsICJyZXBsYWNlIiwgIm8iLCAiTyIsIC0xKQorICAgICAgICBFUSgiV2hPIGdPZXMgdGhlcmU/IiwgIldobyBnb2VzIHRoZXJlPyIsICJyZXBsYWNlIiwgIm8iLCAiTyIsIDMpCisgICAgICAgIEVRKCJXaE8gZ09lcyB0aGVyZT8iLCAiV2hvIGdvZXMgdGhlcmU/IiwgInJlcGxhY2UiLCAibyIsICJPIiwgMikKKyAgICAgICAgRVEoIldoTyBnb2VzIHRoZXJlPyIsICJXaG8gZ29lcyB0aGVyZT8iLCAicmVwbGFjZSIsICJvIiwgIk8iLCAxKQorICAgICAgICBFUSgiV2hvIGdvZXMgdGhlcmU/IiwgIldobyBnb2VzIHRoZXJlPyIsICJyZXBsYWNlIiwgIm8iLCAiTyIsIDApCisKKyAgICAgICAgRVEoIldobyBnb2VzIHRoZXJlPyIsICJXaG8gZ29lcyB0aGVyZT8iLCAicmVwbGFjZSIsICJhIiwgInEiKQorICAgICAgICBFUSgid2hvIGdvZXMgdGhlcmU/IiwgIldobyBnb2VzIHRoZXJlPyIsICJyZXBsYWNlIiwgIlciLCAidyIpCisgICAgICAgIEVRKCJ3d2hvIGdvZXMgdGhlcmU/d3ciLCAiV1dobyBnb2VzIHRoZXJlP1dXIiwgInJlcGxhY2UiLCAiVyIsICJ3IikKKyAgICAgICAgRVEoIldobyBnb2VzIHRoZXJlISIsICJXaG8gZ29lcyB0aGVyZT8iLCAicmVwbGFjZSIsICI/IiwgIiEiKQorICAgICAgICBFUSgiV2hvIGdvZXMgdGhlcmUhISIsICJXaG8gZ29lcyB0aGVyZT8/IiwgInJlcGxhY2UiLCAiPyIsICIhIikKKworICAgICAgICBFUSgiV2hvIGdvZXMgdGhlcmU/IiwgIldobyBnb2VzIHRoZXJlPyIsICJyZXBsYWNlIiwgIi4iLCAiISIpCisKKyAgICAgICAgIyBzdWJzdHJpbmcgcmVwbGFjZSBpbiBwbGFjZSAobGVuKGZyb20pPT1sZW4odG8pID4gMSkKKyAgICAgICAgRVEoIlRoKiogKiogYSB0KipzdWUiLCAiVGhpcyBpcyBhIHRpc3N1ZSIsICJyZXBsYWNlIiwgImlzIiwgIioqIikKKyAgICAgICAgRVEoIlRoKiogKiogYSB0KipzdWUiLCAiVGhpcyBpcyBhIHRpc3N1ZSIsICJyZXBsYWNlIiwgImlzIiwgIioqIiwgc3lzLm1heGludCkKKyAgICAgICAgRVEoIlRoKiogKiogYSB0KipzdWUiLCAiVGhpcyBpcyBhIHRpc3N1ZSIsICJyZXBsYWNlIiwgImlzIiwgIioqIiwgLTEpCisgICAgICAgIEVRKCJUaCoqICoqIGEgdCoqc3VlIiwgIlRoaXMgaXMgYSB0aXNzdWUiLCAicmVwbGFjZSIsICJpcyIsICIqKiIsIDQpCisgICAgICAgIEVRKCJUaCoqICoqIGEgdCoqc3VlIiwgIlRoaXMgaXMgYSB0aXNzdWUiLCAicmVwbGFjZSIsICJpcyIsICIqKiIsIDMpCisgICAgICAgIEVRKCJUaCoqICoqIGEgdGlzc3VlIiwgIlRoaXMgaXMgYSB0aXNzdWUiLCAicmVwbGFjZSIsICJpcyIsICIqKiIsIDIpCisgICAgICAgIEVRKCJUaCoqIGlzIGEgdGlzc3VlIiwgIlRoaXMgaXMgYSB0aXNzdWUiLCAicmVwbGFjZSIsICJpcyIsICIqKiIsIDEpCisgICAgICAgIEVRKCJUaGlzIGlzIGEgdGlzc3VlIiwgIlRoaXMgaXMgYSB0aXNzdWUiLCAicmVwbGFjZSIsICJpcyIsICIqKiIsIDApCisgICAgICAgIEVRKCJjb2JvYiIsICJib2JvYiIsICJyZXBsYWNlIiwgImJvYiIsICJjb2IiKQorICAgICAgICBFUSgiY29ib2JYY29ib2NvYiIsICJib2JvYlhib2JvYm9iIiwgInJlcGxhY2UiLCAiYm9iIiwgImNvYiIpCisgICAgICAgIEVRKCJib2JvYiIsICJib2JvYiIsICJyZXBsYWNlIiwgImJvdCIsICJib3QiKQorCisgICAgICAgICMgcmVwbGFjZSBzaW5nbGUgY2hhcmFjdGVyIChsZW4oZnJvbSk9PTEsIGxlbih0byk+MSkKKyAgICAgICAgRVEoIlJleUtLamF2aUtLIiwgIlJleWtqYXZpayIsICJyZXBsYWNlIiwgImsiLCAiS0siKQorICAgICAgICBFUSgiUmV5S0tqYXZpS0siLCAiUmV5a2phdmlrIiwgInJlcGxhY2UiLCAiayIsICJLSyIsIC0xKQorICAgICAgICBFUSgiUmV5S0tqYXZpS0siLCAiUmV5a2phdmlrIiwgInJlcGxhY2UiLCAiayIsICJLSyIsIHN5cy5tYXhpbnQpCisgICAgICAgIEVRKCJSZXlLS2phdmlLSyIsICJSZXlramF2aWsiLCAicmVwbGFjZSIsICJrIiwgIktLIiwgMikKKyAgICAgICAgRVEoIlJleUtLamF2aWsiLCAiUmV5a2phdmlrIiwgInJlcGxhY2UiLCAiayIsICJLSyIsIDEpCisgICAgICAgIEVRKCJSZXlramF2aWsiLCAiUmV5a2phdmlrIiwgInJlcGxhY2UiLCAiayIsICJLSyIsIDApCisgICAgICAgIEVRKCJBLS0tLUItLS0tQy0tLS0iLCAiQS5CLkMuIiwgInJlcGxhY2UiLCAiLiIsICItLS0tIikKKworICAgICAgICBFUSgiUmV5a2phdmlrIiwgIlJleWtqYXZpayIsICJyZXBsYWNlIiwgInEiLCAiS0siKQorCisgICAgICAgICMgcmVwbGFjZSBzdWJzdHJpbmcgKGxlbihmcm9tKT4xLCBsZW4odG8pIT1sZW4oZnJvbSkpCisgICAgICAgIEVRKCJoYW0sIGhhbSwgZWdncyBhbmQgaGFtIiwgInNwYW0sIHNwYW0sIGVnZ3MgYW5kIHNwYW0iLAorICAgICAgICAgICAicmVwbGFjZSIsICJzcGFtIiwgImhhbSIpCisgICAgICAgIEVRKCJoYW0sIGhhbSwgZWdncyBhbmQgaGFtIiwgInNwYW0sIHNwYW0sIGVnZ3MgYW5kIHNwYW0iLAorICAgICAgICAgICAicmVwbGFjZSIsICJzcGFtIiwgImhhbSIsIHN5cy5tYXhpbnQpCisgICAgICAgIEVRKCJoYW0sIGhhbSwgZWdncyBhbmQgaGFtIiwgInNwYW0sIHNwYW0sIGVnZ3MgYW5kIHNwYW0iLAorICAgICAgICAgICAicmVwbGFjZSIsICJzcGFtIiwgImhhbSIsIC0xKQorICAgICAgICBFUSgiaGFtLCBoYW0sIGVnZ3MgYW5kIGhhbSIsICJzcGFtLCBzcGFtLCBlZ2dzIGFuZCBzcGFtIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAic3BhbSIsICJoYW0iLCA0KQorICAgICAgICBFUSgiaGFtLCBoYW0sIGVnZ3MgYW5kIGhhbSIsICJzcGFtLCBzcGFtLCBlZ2dzIGFuZCBzcGFtIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAic3BhbSIsICJoYW0iLCAzKQorICAgICAgICBFUSgiaGFtLCBoYW0sIGVnZ3MgYW5kIHNwYW0iLCAic3BhbSwgc3BhbSwgZWdncyBhbmQgc3BhbSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInNwYW0iLCAiaGFtIiwgMikKKyAgICAgICAgRVEoImhhbSwgc3BhbSwgZWdncyBhbmQgc3BhbSIsICJzcGFtLCBzcGFtLCBlZ2dzIGFuZCBzcGFtIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAic3BhbSIsICJoYW0iLCAxKQorICAgICAgICBFUSgic3BhbSwgc3BhbSwgZWdncyBhbmQgc3BhbSIsICJzcGFtLCBzcGFtLCBlZ2dzIGFuZCBzcGFtIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAic3BhbSIsICJoYW0iLCAwKQorCisgICAgICAgIEVRKCJib2JvYiIsICJib2JvYm9iIiwgInJlcGxhY2UiLCAiYm9ib2IiLCAiYm9iIikKKyAgICAgICAgRVEoImJvYm9iWGJvYm9iIiwgImJvYm9ib2JYYm9ib2JvYiIsICJyZXBsYWNlIiwgImJvYm9iIiwgImJvYiIpCisgICAgICAgIEVRKCJCT0JPQk9CIiwgIkJPQk9CT0IiLCAicmVwbGFjZSIsICJib2IiLCAiYm9iYnkiKQorCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIGJhID0gYnVmZmVyKCdhJykKKyAgICAgICAgICAgIGJiID0gYnVmZmVyKCdiJykKKyAgICAgICAgRVEoImJiYyIsICJhYmMiLCAicmVwbGFjZSIsIGJhLCBiYikKKyAgICAgICAgRVEoImFhYyIsICJhYmMiLCAicmVwbGFjZSIsIGJiLCBiYSkKKworICAgICAgICAjCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnb25lQHR3byF0aHJlZSEnLCAnb25lIXR3byF0aHJlZSEnLCAncmVwbGFjZScsICchJywgJ0AnLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ29uZXR3b3RocmVlJywgJ29uZSF0d28hdGhyZWUhJywgJ3JlcGxhY2UnLCAnIScsICcnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ29uZUB0d29AdGhyZWUhJywgJ29uZSF0d28hdGhyZWUhJywgJ3JlcGxhY2UnLCAnIScsICdAJywgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdvbmVAdHdvQHRocmVlQCcsICdvbmUhdHdvIXRocmVlIScsICdyZXBsYWNlJywgJyEnLCAnQCcsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnb25lQHR3b0B0aHJlZUAnLCAnb25lIXR3byF0aHJlZSEnLCAncmVwbGFjZScsICchJywgJ0AnLCA0KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ29uZSF0d28hdGhyZWUhJywgJ29uZSF0d28hdGhyZWUhJywgJ3JlcGxhY2UnLCAnIScsICdAJywgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdvbmVAdHdvQHRocmVlQCcsICdvbmUhdHdvIXRocmVlIScsICdyZXBsYWNlJywgJyEnLCAnQCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnb25lIXR3byF0aHJlZSEnLCAnb25lIXR3byF0aHJlZSEnLCAncmVwbGFjZScsICd4JywgJ0AnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ29uZSF0d28hdGhyZWUhJywgJ29uZSF0d28hdGhyZWUhJywgJ3JlcGxhY2UnLCAneCcsICdAJywgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCctYS1iLWMtJywgJ2FiYycsICdyZXBsYWNlJywgJycsICctJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCctYS1iLWMnLCAnYWJjJywgJ3JlcGxhY2UnLCAnJywgJy0nLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYycsICdhYmMnLCAncmVwbGFjZScsICcnLCAnLScsIDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnJywgJycsICdyZXBsYWNlJywgJycsICcnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYycsICdhYmMnLCAncmVwbGFjZScsICdhYicsICctLScsIDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjJywgJ2FiYycsICdyZXBsYWNlJywgJ3h5JywgJy0tJykKKyAgICAgICAgIyBOZXh0IHRocmVlIGZvciBTRiBidWcgNDIyMDg4OiBbT1NGMSBhbHBoYV0gc3RyaW5nLnJlcGxhY2UoKTsgZGllZCB3aXRoCisgICAgICAgICMgTWVtb3J5RXJyb3IgZHVlIHRvIGVtcHR5IHJlc3VsdCAocGxhdGZvcm0gbWFsbG9jIGlzc3VlIHdoZW4gcmVxdWVzdGluZworICAgICAgICAjIDAgYnl0ZXMpLgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJycsICcxMjMnLCAncmVwbGFjZScsICcxMjMnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcnLCAnMTIzMTIzJywgJ3JlcGxhY2UnLCAnMTIzJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgneCcsICcxMjN4MTIzJywgJ3JlcGxhY2UnLCAnMTIzJywgJycpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdyZXBsYWNlJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdyZXBsYWNlJywgNDIpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAncmVwbGFjZScsIDQyLCAnaCcpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAncmVwbGFjZScsICdoJywgNDIpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlX292ZXJmbG93KHNlbGYpOgorICAgICAgICAjIENoZWNrIGZvciBvdmVyZmxvdyBjaGVja2luZyBvbiAzMiBiaXQgbWFjaGluZXMKKyAgICAgICAgaWYgc3lzLm1heGludCAhPSAyMTQ3NDgzNjQ3IG9yIHN0cnVjdC5jYWxjc2l6ZSgiUCIpID4gNDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBBMl8xNiA9ICJBIiAqICgyKioxNikKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhPdmVyZmxvd0Vycm9yLCBBMl8xNiwgInJlcGxhY2UiLCAiIiwgQTJfMTYpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoT3ZlcmZsb3dFcnJvciwgQTJfMTYsICJyZXBsYWNlIiwgIkEiLCBBMl8xNikKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhPdmVyZmxvd0Vycm9yLCBBMl8xNiwgInJlcGxhY2UiLCAiQUEiLCBBMl8xNitBMl8xNikKKworICAgIGRlZiB0ZXN0X3pmaWxsKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJzEyMycsICcxMjMnLCAnemZpbGwnLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJzEyMycsICcxMjMnLCAnemZpbGwnLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJzAxMjMnLCAnMTIzJywgJ3pmaWxsJywgNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcrMTIzJywgJysxMjMnLCAnemZpbGwnLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJysxMjMnLCAnKzEyMycsICd6ZmlsbCcsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnKzAxMjMnLCAnKzEyMycsICd6ZmlsbCcsIDUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnLTEyMycsICctMTIzJywgJ3pmaWxsJywgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCctMTIzJywgJy0xMjMnLCAnemZpbGwnLCA0KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJy0wMTIzJywgJy0xMjMnLCAnemZpbGwnLCA1KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJzAwMCcsICcnLCAnemZpbGwnLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJzM0JywgJzM0JywgJ3pmaWxsJywgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcwMDM0JywgJzM0JywgJ3pmaWxsJywgNCkKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJzEyMycsICd6ZmlsbCcpCisKKyMgWFhYIGFsaWFzIGZvciBweTNrIGZvcndhcmQgY29tcGF0aWJpbGl0eQorQmFzZVRlc3QgPSBDb21tb25UZXN0CisKK2NsYXNzIE1peGluU3RyVW5pY29kZVVzZXJTdHJpbmdUZXN0OgorICAgICMgYWRkaXRpb25hbCB0ZXN0cyB0aGF0IG9ubHkgd29yayBmb3IKKyAgICAjIHN0cmluZ2xpa2Ugb2JqZWN0cywgaS5lLiBzdHIsIHVuaWNvZGUsIFVzZXJTdHJpbmcKKyAgICAjIChidXQgbm90IHRoZSBzdHJpbmcgbW9kdWxlKQorCisgICAgZGVmIHRlc3RfaXNsb3dlcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnJywgJ2lzbG93ZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2EnLCAnaXNsb3dlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ0EnLCAnaXNsb3dlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ1xuJywgJ2lzbG93ZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2FiYycsICdpc2xvd2VyJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnYUJjJywgJ2lzbG93ZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2FiY1xuJywgJ2lzbG93ZXInKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdpc2xvd2VyJywgNDIpCisKKyAgICBkZWYgdGVzdF9pc3VwcGVyKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICcnLCAnaXN1cHBlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2EnLCAnaXN1cHBlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnQScsICdpc3VwcGVyJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnXG4nLCAnaXN1cHBlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnQUJDJywgJ2lzdXBwZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdBYkMnLCAnaXN1cHBlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnQUJDXG4nLCAnaXN1cHBlcicpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnYWJjJywgJ2lzdXBwZXInLCA0MikKKworICAgIGRlZiB0ZXN0X2lzdGl0bGUoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJycsICdpc3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnYScsICdpc3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdBJywgJ2lzdGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdcbicsICdpc3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdBIFRpdGxlY2FzZWQgTGluZScsICdpc3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdBXG5UaXRsZWNhc2VkIExpbmUnLCAnaXN0aXRsZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnQSBUaXRsZWNhc2VkLCBMaW5lJywgJ2lzdGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdOb3QgYSBjYXBpdGFsaXplZCBTdHJpbmcnLCAnaXN0aXRsZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ05vdFx0YSBUaXRsZWNhc2UgU3RyaW5nJywgJ2lzdGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdOb3QtLWEgVGl0bGVjYXNlIFN0cmluZycsICdpc3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnTk9UJywgJ2lzdGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdpc3RpdGxlJywgNDIpCisKKyAgICBkZWYgdGVzdF9pc3NwYWNlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICcnLCAnaXNzcGFjZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2EnLCAnaXNzcGFjZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnICcsICdpc3NwYWNlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdcdCcsICdpc3NwYWNlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdccicsICdpc3NwYWNlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdcbicsICdpc3NwYWNlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICcgXHRcclxuJywgJ2lzc3BhY2UnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICcgXHRcclxuYScsICdpc3NwYWNlJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnaXNzcGFjZScsIDQyKQorCisgICAgZGVmIHRlc3RfaXNhbHBoYShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnJywgJ2lzYWxwaGEnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2EnLCAnaXNhbHBoYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnQScsICdpc2FscGhhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnXG4nLCAnaXNhbHBoYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnYWJjJywgJ2lzYWxwaGEnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdhQmMxMjMnLCAnaXNhbHBoYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2FiY1xuJywgJ2lzYWxwaGEnKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdpc2FscGhhJywgNDIpCisKKyAgICBkZWYgdGVzdF9pc2FsbnVtKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICcnLCAnaXNhbG51bScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnYScsICdpc2FsbnVtJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdBJywgJ2lzYWxudW0nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdcbicsICdpc2FsbnVtJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICcxMjNhYmM0NTYnLCAnaXNhbG51bScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnYTFiM2MnLCAnaXNhbG51bScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2FCYzAwMCAnLCAnaXNhbG51bScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2FiY1xuJywgJ2lzYWxudW0nKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdpc2FsbnVtJywgNDIpCisKKyAgICBkZWYgdGVzdF9pc2RpZ2l0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICcnLCAnaXNkaWdpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2EnLCAnaXNkaWdpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnMCcsICdpc2RpZ2l0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICcwMTIzNDU2Nzg5JywgJ2lzZGlnaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICcwMTIzNDU2Nzg5YScsICdpc2RpZ2l0JykKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdpc2RpZ2l0JywgNDIpCisKKyAgICBkZWYgdGVzdF90aXRsZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcgSGVsbG8gJywgJyBoZWxsbyAnLCAndGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ0hlbGxvICcsICdoZWxsbyAnLCAndGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ0hlbGxvICcsICdIZWxsbyAnLCAndGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ0Zvcm1hdCBUaGlzIEFzIFRpdGxlIFN0cmluZycsICJmT3JNYVQgdGhJcyBhUyB0aXRMZSBTdHJpbmciLCAndGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ0Zvcm1hdCxUaGlzLUFzKlRpdGxlO1N0cmluZycsICJmT3JNYVQsdGhJcy1hUyp0aXRMZTtTdHJpbmciLCAndGl0bGUnLCApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnR2V0aW50JywgImdldEludCIsICd0aXRsZScpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAndGl0bGUnLCA0MikKKworICAgIGRlZiB0ZXN0X3NwbGl0bGluZXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FiYycsICdkZWYnLCAnJywgJ2doaSddLCAiYWJjXG5kZWZcblxyZ2hpIiwgJ3NwbGl0bGluZXMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYmMnLCAnZGVmJywgJycsICdnaGknXSwgImFiY1xuZGVmXG5cclxuZ2hpIiwgJ3NwbGl0bGluZXMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYmMnLCAnZGVmJywgJ2doaSddLCAiYWJjXG5kZWZcclxuZ2hpIiwgJ3NwbGl0bGluZXMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYmMnLCAnZGVmJywgJ2doaSddLCAiYWJjXG5kZWZcclxuZ2hpXG4iLCAnc3BsaXRsaW5lcycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FiYycsICdkZWYnLCAnZ2hpJywgJyddLCAiYWJjXG5kZWZcclxuZ2hpXG5cciIsICdzcGxpdGxpbmVzJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJywgJ2FiYycsICdkZWYnLCAnZ2hpJywgJyddLCAiXG5hYmNcbmRlZlxyXG5naGlcblxyIiwgJ3NwbGl0bGluZXMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydcbicsICdhYmNcbicsICdkZWZcclxuJywgJ2doaVxuJywgJ1xyJ10sICJcbmFiY1xuZGVmXHJcbmdoaVxuXHIiLCAnc3BsaXRsaW5lcycsIDEpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnc3BsaXRsaW5lcycsIDQyLCA0MikKKworICAgIGRlZiB0ZXN0X3N0YXJ0c3dpdGgoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICdoZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICdoZWxsbycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnaGVsbG8gd29ybGQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICdlbGxvJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgJ2VsbG8nLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnbycsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnbycsIDUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICcnLCA1KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdzdGFydHN3aXRoJywgJ2xvJywgNikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ3N0YXJ0c3dpdGgnLCAnbG93bycsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdzdGFydHN3aXRoJywgJ2xvd28nLCAzLCA3KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsb3dvcmxkJywgJ3N0YXJ0c3dpdGgnLCAnbG93bycsIDMsIDYpCisKKyAgICAgICAgIyB0ZXN0IG5lZ2F0aXZlIGluZGljZXMKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgJ2hlJywgMCwgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICdoZScsIC01MywgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nLCAwLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICdoZWxsbyB3b3JsZCcsIC0xLCAtMTApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnZWxsbycsIC01KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnZWxsbycsIC00KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdzdGFydHN3aXRoJywgJ28nLCAtMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgJ28nLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgJycsIC0zLCAtMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICdsbycsIC05KQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsIDQyKQorCisgICAgICAgICMgdGVzdCB0dXBsZSBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgKCdoZScsICdoYScpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdzdGFydHN3aXRoJywgKCdsbycsICdsbG8nKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgKCdoZWxsb3gnLCAnaGVsbG8nKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICgpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvd29ybGQnLCAnc3RhcnRzd2l0aCcsICgnaGVsbG93bycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdybGQnLCAnbG93bycpLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsb3dvcmxkJywgJ3N0YXJ0c3dpdGgnLCAoJ2hlbGxvd28nLCAnZWxsbycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmxkJyksIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICgnbG8nLCAnaGUnKSwgMCwgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoJ2hlJywgJ2hlbCcpLCAwLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoJ2hlJywgJ2hlbCcpLCAwLCAyKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICg0MiwpKQorCisgICAgZGVmIHRlc3RfZW5kc3dpdGgoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAnbG8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdlbmRzd2l0aCcsICdoZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAnaGVsbG8gd29ybGQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ3dvcmwnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAnd29ybCcsIDMsIDkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICd3b3JsZCcsIDMsIDEyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAnbG93bycsIDEsIDcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICdsb3dvJywgMiwgNykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ2xvd28nLCAzLCA3KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ2xvd28nLCA0LCA3KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ2xvd28nLCAzLCA4KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdhYicsICdlbmRzd2l0aCcsICdhYicsIDAsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2FiJywgJ2VuZHN3aXRoJywgJ2FiJywgMCwgMCkKKworICAgICAgICAjIHRlc3QgbmVnYXRpdmUgaW5kaWNlcworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgJ2xvJywgLTIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgJ2hlJywgLTIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAnJywgLTMsIC0zKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdlbmRzd2l0aCcsICdoZWxsbyB3b3JsZCcsIC0xMCwgLTIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAnd29ybCcsIC02KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAnd29ybCcsIC01LCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ3dvcmwnLCAtNSwgOSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ3dvcmxkJywgLTcsIDEyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAnbG93bycsIC05OSwgLTMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICdsb3dvJywgLTgsIC0zKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAnbG93bycsIC03LCAtMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICdsb3dvJywgMywgLTQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAnbG93bycsIC04LCAtMikKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ2VuZHN3aXRoJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdlbmRzd2l0aCcsIDQyKQorCisgICAgICAgICMgdGVzdCB0dXBsZSBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAoJ2hlJywgJ2hhJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAoJ2xvJywgJ2xsbycpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdoZWxsb3gnLCAnaGVsbG8nKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAoKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgKCdoZWxsb3dvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JsZCcsICdsb3dvJyksIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAoJ2hlbGxvd28nLCAnZWxsbycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmxkJyksIDMsIC0xKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdoZWxsJywgJ2VsbCcpLCAwLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAoJ2hlJywgJ2hlbCcpLCAwLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdoZScsICdoZWxsJyksIDAsIDQpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdlbmRzd2l0aCcsICg0MiwpKQorCisgICAgZGVmIHRlc3RfX19jb250YWluc19fKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJycsICdfX2NvbnRhaW5zX18nLCAnJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdhYmMnLCAnX19jb250YWluc19fJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2FiYycsICdfX2NvbnRhaW5zX18nLCAnXDAnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ1wwYWJjJywgJ19fY29udGFpbnNfXycsICdcMCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnYWJjXDAnLCAnX19jb250YWluc19fJywgJ1wwJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdcMGFiYycsICdfX2NvbnRhaW5zX18nLCAnYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnYXNkZicsICdfX2NvbnRhaW5zX18nLCAnYXNkZicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2FzZCcsICdfX2NvbnRhaW5zX18nLCAnYXNkZicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJycsICdfX2NvbnRhaW5zX18nLCAnYXNkZicpCisKKyAgICBkZWYgdGVzdF9zdWJzY3JpcHQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1J2EnLCAnYWJjJywgJ19fZ2V0aXRlbV9fJywgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKHUnYycsICdhYmMnLCAnX19nZXRpdGVtX18nLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKHUnYScsICdhYmMnLCAnX19nZXRpdGVtX18nLCAwTCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKHUnYWJjJywgJ2FiYycsICdfX2dldGl0ZW1fXycsIHNsaWNlKDAsIDMpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwodSdhYmMnLCAnYWJjJywgJ19fZ2V0aXRlbV9fJywgc2xpY2UoMCwgMTAwMCkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1J2EnLCAnYWJjJywgJ19fZ2V0aXRlbV9fJywgc2xpY2UoMCwgMSkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1JycsICdhYmMnLCAnX19nZXRpdGVtX18nLCBzbGljZSgwLCAwKSkKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdfX2dldGl0ZW1fXycsICdkZWYnKQorCisgICAgZGVmIHRlc3Rfc2xpY2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjJywgJ2FiYycsICdfX2dldHNsaWNlX18nLCAwLCAxMDAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYycsICdhYmMnLCAnX19nZXRzbGljZV9fJywgMCwgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYicsICdhYmMnLCAnX19nZXRzbGljZV9fJywgMCwgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdiYycsICdhYmMnLCAnX19nZXRzbGljZV9fJywgMSwgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdiJywgJ2FiYycsICdfX2dldHNsaWNlX18nLCAxLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJycsICdhYmMnLCAnX19nZXRzbGljZV9fJywgMiwgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcnLCAnYWJjJywgJ19fZ2V0c2xpY2VfXycsIDEwMDAsIDEwMDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnJywgJ2FiYycsICdfX2dldHNsaWNlX18nLCAyMDAwLCAxMDAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJycsICdhYmMnLCAnX19nZXRzbGljZV9fJywgMiwgMSkKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdfX2dldHNsaWNlX18nLCAnZGVmJykKKworICAgIGRlZiB0ZXN0X2V4dGVuZGVkX2dldHNsaWNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZXh0ZW5kZWQgc2xpY2luZyBieSBjb21wYXJpbmcgd2l0aCBsaXN0IHNsaWNpbmcuCisgICAgICAgIHMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMKKyAgICAgICAgaW5kaWNlcyA9ICgwLCBOb25lLCAxLCAzLCA0MSwgLTEsIC0yLCAtMzcpCisgICAgICAgIGZvciBzdGFydCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgZm9yIHN0b3AgaW4gaW5kaWNlczoKKyAgICAgICAgICAgICAgICAjIFNraXAgc3RlcCAwIChpbnZhbGlkKQorICAgICAgICAgICAgICAgIGZvciBzdGVwIGluIGluZGljZXNbMTpdOgorICAgICAgICAgICAgICAgICAgICBMID0gbGlzdChzKVtzdGFydDpzdG9wOnN0ZXBdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1IiIuam9pbihMKSwgcywgJ19fZ2V0aXRlbV9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlKHN0YXJ0LCBzdG9wLCBzdGVwKSkKKworICAgIGRlZiB0ZXN0X211bChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcnLCAnYWJjJywgJ19fbXVsX18nLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcnLCAnYWJjJywgJ19fbXVsX18nLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYycsICdhYmMnLCAnX19tdWxfXycsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjYWJjYWJjJywgJ2FiYycsICdfX211bF9fJywgMykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnX19tdWxfXycpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnYWJjJywgJ19fbXVsX18nLCAnJykKKyAgICAgICAgIyBYWFg6IG9uIGEgNjQtYml0IHN5c3RlbSwgdGhpcyBkb2Vzbid0IHJhaXNlIGFuIG92ZXJmbG93IGVycm9yLAorICAgICAgICAjIGJ1dCBlaXRoZXIgcmFpc2VzIGEgTWVtb3J5RXJyb3IsIG9yIHN1Y2NlZWRzIChpZiB5b3UgaGF2ZSA1NFRpQikKKyAgICAgICAgI3NlbGYuY2hlY2tyYWlzZXMoT3ZlcmZsb3dFcnJvciwgMTAwMDAqJ2FiYycsICdfX211bF9fJywgMjAwMDAwMDAwMCkKKworICAgIGRlZiB0ZXN0X2pvaW4oc2VsZik6CisgICAgICAgICMgam9pbiBub3cgd29ya3Mgd2l0aCBhbnkgc2VxdWVuY2UgdHlwZQorICAgICAgICAjIG1vdmVkIGhlcmUsIGJlY2F1c2UgdGhlIGFyZ3VtZW50IG9yZGVyIGlzCisgICAgICAgICMgZGlmZmVyZW50IGluIHN0cmluZy5qb2luIChzZWUgdGhlIHRlc3QgaW4KKyAgICAgICAgIyB0ZXN0LnRlc3Rfc3RyaW5nLlN0cmluZ1Rlc3QudGVzdF9qb2luKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2EgYiBjIGQnLCAnICcsICdqb2luJywgWydhJywgJ2InLCAnYycsICdkJ10pCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjZCcsICcnLCAnam9pbicsICgnYScsICdiJywgJ2MnLCAnZCcpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2JkJywgJycsICdqb2luJywgKCcnLCAnYicsICcnLCAnZCcpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FjJywgJycsICdqb2luJywgKCdhJywgJycsICdjJywgJycpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3cgeCB5IHonLCAnICcsICdqb2luJywgU2VxdWVuY2UoKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmMnLCAnYScsICdqb2luJywgKCdhYmMnLCkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgneicsICdhJywgJ2pvaW4nLCBVc2VyTGlzdChbJ3onXSkpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwodW5pY29kZSgnYS5iLmMnKSwgdW5pY29kZSgnLicpLCAnam9pbicsIFsnYScsICdiJywgJ2MnXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1bmljb2RlKCdhLmIuYycpLCAnLicsICdqb2luJywgW3VuaWNvZGUoJ2EnKSwgJ2InLCAnYyddKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKHVuaWNvZGUoJ2EuYi5jJyksICcuJywgJ2pvaW4nLCBbJ2EnLCB1bmljb2RlKCdiJyksICdjJ10pCisgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwodW5pY29kZSgnYS5iLmMnKSwgJy4nLCAnam9pbicsIFsnYScsICdiJywgdW5pY29kZSgnYycpXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnLicsICdqb2luJywgWydhJywgdW5pY29kZSgnYicpLCAzXSkKKyAgICAgICAgZm9yIGkgaW4gWzUsIDI1LCAxMjVdOgorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgoKCdhJyAqIGkpICsgJy0nKSAqIGkpWzotMV0sICctJywgJ2pvaW4nLAorICAgICAgICAgICAgICAgICBbJ2EnICogaV0gKiBpKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgoKCdhJyAqIGkpICsgJy0nKSAqIGkpWzotMV0sICctJywgJ2pvaW4nLAorICAgICAgICAgICAgICAgICAoJ2EnICogaSwpICogaSkKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJyAnLCAnam9pbicsIEJhZFNlcTEoKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhIGIgYycsICcgJywgJ2pvaW4nLCBCYWRTZXEyKCkpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICcgJywgJ2pvaW4nKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJyAnLCAnam9pbicsIDcpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnICcsICdqb2luJywgU2VxdWVuY2UoWzcsICdoZWxsbycsIDEyM0xdKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICAgICB5aWVsZCA0ICsgIiIKKyAgICAgICAgICAgIHNlbGYuZml4dHlwZSgnICcpLmpvaW4oZigpKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlOgorICAgICAgICAgICAgaWYgJysnIG5vdCBpbiBzdHIoZSk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdqb2luKCkgYXRlIGV4Y2VwdGlvbiBtZXNzYWdlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnZXhjZXB0aW9uIG5vdCByYWlzZWQnKQorCisgICAgZGVmIHRlc3RfZm9ybWF0dGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcraGVsbG8rJywgJyslcysnLCAnX19tb2RfXycsICdoZWxsbycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnKzEwKycsICcrJWQrJywgJ19fbW9kX18nLCAxMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhJywgIiVjIiwgJ19fbW9kX18nLCAiYSIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYScsICIlYyIsICdfX21vZF9fJywgImEiKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJyInLCAiJWMiLCAnX19tb2RfXycsIDM0KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJyQnLCAiJWMiLCAnX19tb2RfXycsIDM2KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJzEwJywgIiVkIiwgJ19fbW9kX18nLCAxMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdceDdmJywgIiVjIiwgJ19fbW9kX18nLCAweDdmKQorCisgICAgICAgIGZvciBvcmRpbmFsIGluICgtMTAwLCAweDIwMDAwMCk6CisgICAgICAgICAgICAjIHVuaWNvZGUgcmFpc2VzIFZhbHVlRXJyb3IsIHN0ciByYWlzZXMgT3ZlcmZsb3dFcnJvcgorICAgICAgICAgICAgc2VsZi5jaGVja3JhaXNlcygoVmFsdWVFcnJvciwgT3ZlcmZsb3dFcnJvciksICclYycsICdfX21vZF9fJywgb3JkaW5hbCkKKworICAgICAgICBsb25ndmFsdWUgPSBzeXMubWF4aW50ICsgMTBMCisgICAgICAgIHNsb25ndmFsdWUgPSBzdHIobG9uZ3ZhbHVlKQorICAgICAgICBpZiBzbG9uZ3ZhbHVlWy0xXSBpbiAoIkwiLCJsIik6IHNsb25ndmFsdWUgPSBzbG9uZ3ZhbHVlWzotMV0KKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcgNDInLCAnJTNsZCcsICdfX21vZF9fJywgNDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnNDInLCAnJWQnLCAnX19tb2RfXycsIDQyTCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCc0MicsICclZCcsICdfX21vZF9fJywgNDIuMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKHNsb25ndmFsdWUsICclZCcsICdfX21vZF9fJywgbG9uZ3ZhbHVlKQorICAgICAgICBzZWxmLmNoZWNrY2FsbCgnJWQnLCAnX19tb2RfXycsIGZsb2F0KGxvbmd2YWx1ZSkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnMDA0Mi4wMCcsICclMDcuMmYnLCAnX19tb2RfXycsIDQyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJzAwNDIuMDAnLCAnJTA3LjJGJywgJ19fbW9kX18nLCA0MikKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdfX21vZF9fJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICclKGZvbylzJywgJ19fbW9kX18nLCA0MikKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICclcyVzJywgJ19fbW9kX18nLCAoNDIsKSkKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICclYycsICdfX21vZF9fJywgKE5vbmUsKSkKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnJShmb28nLCAnX19tb2RfXycsIHt9KQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJyUoZm9vKXMgJShiYXIpcycsICdfX21vZF9fJywgKCdmb28nLCA0MikpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnJWQnLCAnX19tb2RfXycsICI0MiIpICMgbm90IG51bWVyaWMKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICclZCcsICdfX21vZF9fJywgKDQyKzBqKSkgIyBubyBpbnQvbG9uZyBjb252ZXJzaW9uIHByb3ZpZGVkCisKKyAgICAgICAgIyBhcmd1bWVudCBuYW1lcyB3aXRoIHByb3Blcmx5IG5lc3RlZCBicmFja2V0cyBhcmUgc3VwcG9ydGVkCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYmFyJywgJyUoKGZvbykpcycsICdfX21vZF9fJywgeycoZm9vKSc6ICdiYXInfSkKKworICAgICAgICAjIDEwMCBpcyBhIG1hZ2ljIG51bWJlciBpbiBQeVVuaWNvZGVfRm9ybWF0LCB0aGlzIGZvcmNlcyBhIHJlc2l6ZQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMTAzKidhJysneCcsICclc3gnLCAnX19tb2RfXycsIDEwMyonYScpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICclKnMnLCAnX19tb2RfXycsICgnZm9vJywgJ2JhcicpKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJyUxMC4qZicsICdfX21vZF9fJywgKCdmb28nLCA0Mi4pKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICclMTAnLCAnX19tb2RfXycsICg0MiwpKQorCisgICAgICAgIHdpZHRoID0gaW50KF90ZXN0Y2FwaS5QWV9TU0laRV9UX01BWCArIDEpCisgICAgICAgIGlmIHdpZHRoIDw9IHN5cy5tYXhpbnQ6CisgICAgICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKE92ZXJmbG93RXJyb3IsICclKnMnLCAnX19tb2RfXycsICh3aWR0aCwgJycpKQorICAgICAgICBwcmVjID0gaW50KF90ZXN0Y2FwaS5JTlRfTUFYICsgMSkKKyAgICAgICAgaWYgcHJlYyA8PSBzeXMubWF4aW50OgorICAgICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhPdmVyZmxvd0Vycm9yLCAnJS4qZicsICdfX21vZF9fJywgKHByZWMsIDEuIC8gNykpCisgICAgICAgICMgSXNzdWUgMTU5ODkKKyAgICAgICAgd2lkdGggPSBpbnQoMSA8PCAoX3Rlc3RjYXBpLlBZX1NTSVpFX1RfTUFYLmJpdF9sZW5ndGgoKSArIDEpKQorICAgICAgICBpZiB3aWR0aCA8PSBzeXMubWF4aW50OgorICAgICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhPdmVyZmxvd0Vycm9yLCAnJSpzJywgJ19fbW9kX18nLCAod2lkdGgsICcnKSkKKyAgICAgICAgcHJlYyA9IGludChfdGVzdGNhcGkuVUlOVF9NQVggKyAxKQorICAgICAgICBpZiBwcmVjIDw9IHN5cy5tYXhpbnQ6CisgICAgICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKE92ZXJmbG93RXJyb3IsICclLipmJywgJ19fbW9kX18nLCAocHJlYywgMS4gLyA3KSkKKworICAgICAgICBjbGFzcyBYKG9iamVjdCk6IHBhc3MKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnX19tb2RfXycsIFgoKSkKKyAgICAgICAgY2xhc3MgWChFeGNlcHRpb24pOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGspOgorICAgICAgICAgICAgICAgIHJldHVybiBrCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnbWVsb24gYXBwbGUnLCAnJShtZWxvbilzICUoYXBwbGUpcycsICdfX21vZF9fJywgWCgpKQorCisgICAgZGVmIHRlc3RfZmxvYXRmb3JtYXR0aW5nKHNlbGYpOgorICAgICAgICAjIGZsb2F0IGZvcm1hdHRpbmcKKyAgICAgICAgZm9yIHByZWMgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBmb3JtYXQgPSAnJSUuJWlmJyAlIHByZWMKKyAgICAgICAgICAgIHZhbHVlID0gMC4wMQorICAgICAgICAgICAgZm9yIHggaW4geHJhbmdlKDYwKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMy4xNDE1OTI2NTM1OSAvIDMuMCAqIDEwLjAKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrY2FsbChmb3JtYXQsICJfX21vZF9fIiwgdmFsdWUpCisKKyAgICBkZWYgdGVzdF9pbnBsYWNlX3Jld3JpdGVzKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgc3RyaW5ncyBkb24ndCBjb3B5IGFuZCBtb2RpZnkgY2FjaGVkIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5ncworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2EnLCAnQScsICdsb3dlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnQScsICdpc3VwcGVyJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdBJywgJ2EnLCAndXBwZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2EnLCAnaXNsb3dlcicpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhJywgJ0EnLCAncmVwbGFjZScsICdBJywgJ2EnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ0EnLCAnaXN1cHBlcicpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdBJywgJ2EnLCAnY2FwaXRhbGl6ZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnYScsICdpc2xvd2VyJykKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ0EnLCAnYScsICdzd2FwY2FzZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnYScsICdpc2xvd2VyJykKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ0EnLCAnYScsICd0aXRsZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnYScsICdpc2xvd2VyJykKKworICAgIGRlZiB0ZXN0X3BhcnRpdGlvbihzZWxmKToKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCd0aGlzIGlzIHRoZSBwYXInLCAndGknLCAndGlvbiBtZXRob2QnKSwKKyAgICAgICAgICAgICd0aGlzIGlzIHRoZSBwYXJ0aXRpb24gbWV0aG9kJywgJ3BhcnRpdGlvbicsICd0aScpCisKKyAgICAgICAgIyBmcm9tIHJheW1vbmQncyBvcmlnaW5hbCBzcGVjaWZpY2F0aW9uCisgICAgICAgIFMgPSAnaHR0cDovL3d3dy5weXRob24ub3JnJworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCdodHRwJywgJzovLycsICd3d3cucHl0aG9uLm9yZycpLCBTLCAncGFydGl0aW9uJywgJzovLycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoJ2h0dHA6Ly93d3cucHl0aG9uLm9yZycsICcnLCAnJyksIFMsICdwYXJ0aXRpb24nLCAnPycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoJycsICdodHRwOi8vJywgJ3d3dy5weXRob24ub3JnJyksIFMsICdwYXJ0aXRpb24nLCAnaHR0cDovLycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoJ2h0dHA6Ly93d3cucHl0aG9uLicsICdvcmcnLCAnJyksIFMsICdwYXJ0aXRpb24nLCAnb3JnJykKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsIFMsICdwYXJ0aXRpb24nLCAnJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsIFMsICdwYXJ0aXRpb24nLCBOb25lKQorCisgICAgICAgICMgbWl4ZWQgdXNlIG9mIHN0ciBhbmQgdW5pY29kZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhL2IvYycucGFydGl0aW9uKHUnLycpLCAoJ2EnLCAnLycsICdiL2MnKSkKKworICAgIGRlZiB0ZXN0X3JwYXJ0aXRpb24oc2VsZik6CisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgndGhpcyBpcyB0aGUgcnBhcnRpJywgJ3RpJywgJ29uIG1ldGhvZCcpLAorICAgICAgICAgICAgJ3RoaXMgaXMgdGhlIHJwYXJ0aXRpb24gbWV0aG9kJywgJ3JwYXJ0aXRpb24nLCAndGknKQorCisgICAgICAgICMgZnJvbSByYXltb25kJ3Mgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbgorICAgICAgICBTID0gJ2h0dHA6Ly93d3cucHl0aG9uLm9yZycKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgnaHR0cCcsICc6Ly8nLCAnd3d3LnB5dGhvbi5vcmcnKSwgUywgJ3JwYXJ0aXRpb24nLCAnOi8vJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgnJywgJycsICdodHRwOi8vd3d3LnB5dGhvbi5vcmcnKSwgUywgJ3JwYXJ0aXRpb24nLCAnPycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoJycsICdodHRwOi8vJywgJ3d3dy5weXRob24ub3JnJyksIFMsICdycGFydGl0aW9uJywgJ2h0dHA6Ly8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCdodHRwOi8vd3d3LnB5dGhvbi4nLCAnb3JnJywgJycpLCBTLCAncnBhcnRpdGlvbicsICdvcmcnKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgUywgJ3JwYXJ0aXRpb24nLCAnJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsIFMsICdycGFydGl0aW9uJywgTm9uZSkKKworICAgICAgICAjIG1peGVkIHVzZSBvZiBzdHIgYW5kIHVuaWNvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYS9iL2MnLnJwYXJ0aXRpb24odScvJyksICgnYS9iJywgJy8nLCAnYycpKQorCisgICAgZGVmIHRlc3Rfbm9uZV9hcmd1bWVudHMoc2VsZik6CisgICAgICAgICMgaXNzdWUgMTE4MjgKKyAgICAgICAgcyA9ICdoZWxsbycKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDIsIHMsICdmaW5kJywgJ2wnLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMywgcywgJ2ZpbmQnLCAnbCcsIC0yLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMiwgcywgJ2ZpbmQnLCAnbCcsIE5vbmUsIC0yKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMCwgcywgJ2ZpbmQnLCAnaCcsIE5vbmUsIE5vbmUpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsIHMsICdyZmluZCcsICdsJywgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsIHMsICdyZmluZCcsICdsJywgLTIsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgyLCBzLCAncmZpbmQnLCAnbCcsIE5vbmUsIC0yKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMCwgcywgJ3JmaW5kJywgJ2gnLCBOb25lLCBOb25lKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgyLCBzLCAnaW5kZXgnLCAnbCcsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgzLCBzLCAnaW5kZXgnLCAnbCcsIC0yLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMiwgcywgJ2luZGV4JywgJ2wnLCBOb25lLCAtMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsIHMsICdpbmRleCcsICdoJywgTm9uZSwgTm9uZSkKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMywgcywgJ3JpbmRleCcsICdsJywgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsIHMsICdyaW5kZXgnLCAnbCcsIC0yLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMiwgcywgJ3JpbmRleCcsICdsJywgTm9uZSwgLTIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCBzLCAncmluZGV4JywgJ2gnLCBOb25lLCBOb25lKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgyLCBzLCAnY291bnQnLCAnbCcsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxLCBzLCAnY291bnQnLCAnbCcsIC0yLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMSwgcywgJ2NvdW50JywgJ2wnLCBOb25lLCAtMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsIHMsICdjb3VudCcsICd4JywgTm9uZSwgTm9uZSkKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgcywgJ2VuZHN3aXRoJywgJ28nLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgcywgJ2VuZHN3aXRoJywgJ2xvJywgLTIsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCBzLCAnZW5kc3dpdGgnLCAnbCcsIE5vbmUsIC0yKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsIHMsICdlbmRzd2l0aCcsICd4JywgTm9uZSwgTm9uZSkKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgcywgJ3N0YXJ0c3dpdGgnLCAnaCcsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCBzLCAnc3RhcnRzd2l0aCcsICdsJywgLTIsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCBzLCAnc3RhcnRzd2l0aCcsICdoJywgTm9uZSwgLTIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgcywgJ3N0YXJ0c3dpdGgnLCAneCcsIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9maW5kX2V0Y19yYWlzZV9jb3JyZWN0X2Vycm9yX21lc3NhZ2VzKHNlbGYpOgorICAgICAgICAjIGlzc3VlIDExODI4CisgICAgICAgIHMgPSAnaGVsbG8nCisgICAgICAgIHggPSAneCcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVHlwZUVycm9yLCByJ1xiZmluZFxiJywgcy5maW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsIHInXGJyZmluZFxiJywgcy5yZmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVHlwZUVycm9yLCByJ1xiaW5kZXhcYicsIHMuaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgcidcYnJpbmRleFxiJywgcy5yaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgcideY291bnRcKCcsIHMuY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgcidec3RhcnRzd2l0aFwoJywgcy5zdGFydHN3aXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsIHInXmVuZHN3aXRoXCgnLCBzLmVuZHN3aXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCBOb25lLCBOb25lLCBOb25lKQorCitjbGFzcyBNaXhpblN0clN0cmluZ1VzZXJTdHJpbmdUZXN0OgorICAgICMgQWRkaXRpb25hbCB0ZXN0cyBmb3IgOGJpdCBzdHJpbmdzLCBpLmUuIHN0ciwgVXNlclN0cmluZyBhbmQKKyAgICAjIHRoZSBzdHJpbmcgbW9kdWxlCisKKyAgICBkZWYgdGVzdF9tYWtldHJhbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICcnLmpvaW4obWFwKGNociwgeHJhbmdlKDI1NikpKS5yZXBsYWNlKCdhYmMnLCAneHl6JyksCisgICAgICAgICAgIHN0cmluZy5tYWtldHJhbnMoJ2FiYycsICd4eXonKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cmluZy5tYWtldHJhbnMsICdhYmMnLCAneHl6dycpCisKKyAgICBkZWYgdGVzdF90cmFuc2xhdGUoc2VsZik6CisgICAgICAgIHRhYmxlID0gc3RyaW5nLm1ha2V0cmFucygnYWJjJywgJ3h5eicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgneHl6eHl6JywgJ3h5emFiY2RlZicsICd0cmFuc2xhdGUnLCB0YWJsZSwgJ2RlZicpCisKKyAgICAgICAgdGFibGUgPSBzdHJpbmcubWFrZXRyYW5zKCdhJywgJ0EnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ0FiYycsICdhYmMnLCAndHJhbnNsYXRlJywgdGFibGUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgneHl6JywgJ3h5eicsICd0cmFuc2xhdGUnLCB0YWJsZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCd5eicsICd4eXonLCAndHJhbnNsYXRlJywgdGFibGUsICd4JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCd5eCcsICd6eXp6eCcsICd0cmFuc2xhdGUnLCBOb25lLCAneicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnenl6engnLCAnenl6engnLCAndHJhbnNsYXRlJywgTm9uZSwgJycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnenl6engnLCAnenl6engnLCAndHJhbnNsYXRlJywgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAneHl6JywgJ3RyYW5zbGF0ZScsICd0b28gc2hvcnQnLCAnc3RyaXAnKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICd4eXonLCAndHJhbnNsYXRlJywgJ3RvbyBzaG9ydCcpCisKKworY2xhc3MgTWl4aW5TdHJVc2VyU3RyaW5nVGVzdDoKKyAgICAjIEFkZGl0aW9uYWwgdGVzdHMgdGhhdCBvbmx5IHdvcmsgd2l0aAorICAgICMgOGJpdCBjb21wYXRpYmxlIG9iamVjdCwgaS5lLiBzdHIgYW5kIFVzZXJTdHJpbmcKKworICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgIGRlZiB0ZXN0X2VuY29kaW5nX2RlY29kaW5nKHNlbGYpOgorICAgICAgICAgICAgY29kZWNzID0gWygncm90MTMnLCAndXJ5eWIgamJleXEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJ2Jhc2U2NCcsICdhR1ZzYkc4Z2QyOXliR1E9XG4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJ2hleCcsICc2ODY1NmM2YzZmMjA3NzZmNzI2YzY0JyksCisgICAgICAgICAgICAgICAgICAgICAgKCd1dScsICdiZWdpbiA2NjYgPGRhdGE+XG4rOiY1TDsmXFxAPVZdUjsmMCBcbiBcbmVuZFxuJyldCisgICAgICAgICAgICBmb3IgZW5jb2RpbmcsIGRhdGEgaW4gY29kZWNzOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChkYXRhLCAnaGVsbG8gd29ybGQnLCAnZW5jb2RlJywgZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoZWxsbyB3b3JsZCcsIGRhdGEsICdkZWNvZGUnLCBlbmNvZGluZykKKyAgICAgICAgICAgICMgemxpYiBpcyBvcHRpb25hbCwgc28gd2UgbWFrZSB0aGUgdGVzdCBvcHRpb25hbCB0b28uLi4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgemxpYgorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGF0YSA9ICd4XHg5Y1x4Y2JIXHhjZFx4YzlceGM5VyhceGNmL1x4Y2FJXHgwMVx4MDBceDFhXHgwYlx4MDRdJworICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbChkYXRhLCAnaGVsbG8gd29ybGQnLCAnZW5jb2RlJywgJ3psaWInKQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnaGVsbG8gd29ybGQnLCBkYXRhLCAnZGVjb2RlJywgJ3psaWInKQorCisgICAgICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ3h5eicsICdkZWNvZGUnLCA0MikKKyAgICAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAneHl6JywgJ2VuY29kZScsIDQyKQorCisKK2NsYXNzIE1peGluU3RyVW5pY29kZVRlc3Q6CisgICAgIyBBZGRpdGlvbmFsIHRlc3RzIHRoYXQgb25seSB3b3JrIHdpdGggc3RyIGFuZCB1bmljb2RlLgorCisgICAgZGVmIHRlc3RfYnVnMTAwMTAxMShzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgam9pbiByZXR1cm5zIGEgTkVXIG9iamVjdCBmb3Igc2luZ2xlIGl0ZW0gc2VxdWVuY2VzCisgICAgICAgICMgaW52b2x2aW5nIGEgc3ViY2xhc3MuCisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgaXQgaXMgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCisgICAgICAgICMgQ2hlY2sgdGhlIG9wdGltaXNhdGlvbiBzdGlsbCBvY2N1cnMgZm9yIHN0YW5kYXJkIG9iamVjdHMuCisgICAgICAgIHQgPSBzZWxmLnR5cGUydGVzdAorICAgICAgICBjbGFzcyBzdWJjbGFzcyh0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgczEgPSBzdWJjbGFzcygiYWJjZCIpCisgICAgICAgIHMyID0gdCgpLmpvaW4oW3MxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMxIGlzIG5vdCBzMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoczIpIGlzIHQpCisKKyAgICAgICAgczEgPSB0KCJhYmNkIikKKyAgICAgICAgczIgPSB0KCkuam9pbihbczFdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoczEgaXMgczIpCisKKyAgICAgICAgIyBTaG91bGQgYWxzbyB0ZXN0IG1peGVkLXR5cGUgam9pbi4KKyAgICAgICAgaWYgdCBpcyB1bmljb2RlOgorICAgICAgICAgICAgczEgPSBzdWJjbGFzcygiYWJjZCIpCisgICAgICAgICAgICBzMiA9ICIiLmpvaW4oW3MxXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSBpcyBub3QgczIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShzMikgaXMgdCkKKworICAgICAgICAgICAgczEgPSB0KCJhYmNkIikKKyAgICAgICAgICAgIHMyID0gIiIuam9pbihbczFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMxIGlzIHMyKQorCisgICAgICAgIGVsaWYgdCBpcyBzdHI6CisgICAgICAgICAgICBzMSA9IHN1YmNsYXNzKCJhYmNkIikKKyAgICAgICAgICAgIHMyID0gdSIiLmpvaW4oW3MxXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSBpcyBub3QgczIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShzMikgaXMgdW5pY29kZSkgIyBwcm9tb3RlcyEKKworICAgICAgICAgICAgczEgPSB0KCJhYmNkIikKKyAgICAgICAgICAgIHMyID0gdSIiLmpvaW4oW3MxXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSBpcyBub3QgczIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShzMikgaXMgdW5pY29kZSkgIyBwcm9tb3RlcyEKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmV4cGVjdGVkIHR5cGUgZm9yIE1peGluU3RyVW5pY29kZVRlc3QgJXIiICUgdCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zdHJpbmdfdGVzdHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3N0cmluZ190ZXN0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkYjIzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zdHJpbmdfdGVzdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zdHJpbmdfdGVzdHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3N0cmluZ190ZXN0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkYjIzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zdHJpbmdfdGVzdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zdWJwcm9jZXNzZGF0YS9zaWdjaGlsZF9pZ25vcmUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc3VicHJvY2Vzc2RhdGEvc2lnY2hpbGRfaWdub3JlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MzIwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc3VicHJvY2Vzc2RhdGEvc2lnY2hpbGRfaWdub3JlLnB5CkBAIC0wLDAgKzEsMTUgQEAKK2ltcG9ydCBzaWduYWwsIHN1YnByb2Nlc3MsIHN5cywgdGltZQorIyBPbiBMaW51eCB0aGlzIGNhdXNlcyBvcy53YWl0cGlkIHRvIGZhaWwgd2l0aCBPU0Vycm9yIGFzIHRoZSBPUyBoYXMgYWxyZWFkeQorIyByZWFwZWQgb3VyIGNoaWxkIHByb2Nlc3MuICBUaGUgd2FpdCgpIHBhc3NpbmcgdGhlIE9TRXJyb3Igb24gdG8gdGhlIGNhbGxlcgorIyBhbmQgY2F1c2luZyB1cyB0byBleGl0IHdpdGggYW4gZXJyb3IgaXMgd2hhdCB3ZSBhcmUgdGVzdGluZyBhZ2FpbnN0Lgorc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQ0hMRCwgc2lnbmFsLlNJR19JR04pCitzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgJ3ByaW50KCJhbGJhdHJvc3MiKSddKS53YWl0KCkKKyMgQWxzbyBlbnN1cmUgcG9sbCgpIGhhbmRsZXMgYW4gZXJybm8uRUNISUxEIGFwcHJvcHJpYXRlbHkuCitwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICctYycsICdwcmludCgiYWxiYXRyb3NzIiknXSkKK251bV9wb2xscyA9IDAKK3doaWxlIHAucG9sbCgpIGlzIE5vbmU6CisgICAgIyBXYWl0aW5nIGZvciB0aGUgcHJvY2VzcyB0byBmaW5pc2guCisgICAgdGltZS5zbGVlcCgwLjAxKSAgIyBBdm9pZCBiZWluZyBhIENQVSBidXN5IGxvb3AuCisgICAgbnVtX3BvbGxzICs9IDEKKyAgICBpZiBudW1fcG9sbHMgPiAzMDAwOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3BvbGwgc2hvdWxkIGhhdmUgcmV0dXJuZWQgMCB3aXRoaW4gMzAgc2Vjb25kcycpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc3VicHJvY2Vzc2RhdGEvc2lnY2hpbGRfaWdub3JlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9zdWJwcm9jZXNzZGF0YS9zaWdjaGlsZF9pZ25vcmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZGU2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc3VicHJvY2Vzc2RhdGEvc2lnY2hpbGRfaWdub3JlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc3VicHJvY2Vzc2RhdGEvc2lnY2hpbGRfaWdub3JlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9zdWJwcm9jZXNzZGF0YS9zaWdjaGlsZF9pZ25vcmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZGU2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc3VicHJvY2Vzc2RhdGEvc2lnY2hpbGRfaWdub3JlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc3ltbGlua19zdXBwb3J0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3N5bWxpbmtfc3VwcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFkMGY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3N5bWxpbmtfc3VwcG9ydC5weQpAQCAtMCwwICsxLDEwMCBAQAoraW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBwbGF0Zm9ybQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4KKworZGVmIGNhbl9zeW1saW5rKCk6CisgICAgIyBjYWNoZSB0aGUgcmVzdWx0IGluIGNhbl9zeW1saW5rLnByZXZfdmFsCisgICAgcHJldl92YWwgPSBnZXRhdHRyKGNhbl9zeW1saW5rLCAncHJldl92YWwnLCBOb25lKQorICAgIGlmIHByZXZfdmFsIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gcHJldl92YWwKKyAgICBzeW1saW5rX3BhdGggPSBURVNURk4gKyAiY2FuX3N5bWxpbmsiCisgICAgdHJ5OgorICAgICAgICBzeW1saW5rKFRFU1RGTiwgc3ltbGlua19wYXRoKQorICAgICAgICBjYW4gPSBUcnVlCisgICAgZXhjZXB0IChPU0Vycm9yLCBOb3RJbXBsZW1lbnRlZEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgIGNhbiA9IEZhbHNlCisgICAgZWxzZToKKyAgICAgICAgb3MucmVtb3ZlKHN5bWxpbmtfcGF0aCkKKyAgICBjYW5fc3ltbGluay5wcmV2X3ZhbCA9IGNhbgorICAgIHJldHVybiBjYW4KKworZGVmIHNraXBfdW5sZXNzX3N5bWxpbmsodGVzdCk6CisgICAgIiIiU2tpcCBkZWNvcmF0b3IgZm9yIHRlc3RzIHRoYXQgcmVxdWlyZSBmdW5jdGlvbmFsIHN5bWxpbmsiIiIKKyAgICBvayA9IGNhbl9zeW1saW5rKCkKKyAgICBtc2cgPSAiUmVxdWlyZXMgZnVuY3Rpb25hbCBzeW1saW5rIGltcGxlbWVudGF0aW9uIgorICAgIHJldHVybiB0ZXN0IGlmIG9rIGVsc2UgdW5pdHRlc3Quc2tpcChtc2cpKHRlc3QpCisKK2RlZiBfc3ltbGlua193aW4zMih0YXJnZXQsIGxpbmssIHRhcmdldF9pc19kaXJlY3Rvcnk9RmFsc2UpOgorICAgICIiIgorICAgIEN0eXBlcyBzeW1saW5rIGltcGxlbWVudGF0aW9uIHNpbmNlIFB5dGhvbiBkb2Vzbid0IHN1cHBvcnQKKyAgICBzeW1saW5rcyBpbiB3aW5kb3dzIHlldC4gQm9ycm93ZWQgZnJvbSBqYXJhY28ud2luZG93cyBwcm9qZWN0LgorICAgICIiIgorICAgIGltcG9ydCBjdHlwZXMud2ludHlwZXMKKyAgICBDcmVhdGVTeW1ib2xpY0xpbmsgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkNyZWF0ZVN5bWJvbGljTGlua1cKKyAgICBDcmVhdGVTeW1ib2xpY0xpbmsuYXJndHlwZXMgPSAoCisgICAgICAgIGN0eXBlcy53aW50eXBlcy5MUFdTVFIsCisgICAgICAgIGN0eXBlcy53aW50eXBlcy5MUFdTVFIsCisgICAgICAgIGN0eXBlcy53aW50eXBlcy5EV09SRCwKKyAgICAgICAgKQorICAgIENyZWF0ZVN5bWJvbGljTGluay5yZXN0eXBlID0gY3R5cGVzLndpbnR5cGVzLkJPT0xFQU4KKworICAgIGRlZiBmb3JtYXRfc3lzdGVtX21lc3NhZ2UoZXJybm8pOgorICAgICAgICAiIiIKKyAgICAgICAgQ2FsbCBGb3JtYXRNZXNzYWdlIHdpdGggYSBzeXN0ZW0gZXJyb3IgbnVtYmVyIHRvIHJldHJpZXZlCisgICAgICAgIHRoZSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlLgorICAgICAgICAiIiIKKyAgICAgICAgIyBmaXJzdCBzb21lIGZsYWdzIHVzZWQgYnkgRm9ybWF0TWVzc2FnZVcKKyAgICAgICAgQUxMT0NBVEVfQlVGRkVSID0gMHgxMDAKKyAgICAgICAgQVJHVU1FTlRfQVJSQVkgPSAweDIwMDAKKyAgICAgICAgRlJPTV9ITU9EVUxFID0gMHg4MDAKKyAgICAgICAgRlJPTV9TVFJJTkcgPSAweDQwMAorICAgICAgICBGUk9NX1NZU1RFTSA9IDB4MTAwMAorICAgICAgICBJR05PUkVfSU5TRVJUUyA9IDB4MjAwCisKKyAgICAgICAgIyBMZXQgRm9ybWF0TWVzc2FnZVcgYWxsb2NhdGUgdGhlIGJ1ZmZlciAod2UnbGwgZnJlZSBpdCBiZWxvdykKKyAgICAgICAgIyBBbHNvLCBsZXQgaXQga25vdyB3ZSB3YW50IGEgc3lzdGVtIGVycm9yIG1lc3NhZ2UuCisgICAgICAgIGZsYWdzID0gQUxMT0NBVEVfQlVGRkVSIHwgRlJPTV9TWVNURU0KKyAgICAgICAgc291cmNlID0gTm9uZQorICAgICAgICBtZXNzYWdlX2lkID0gZXJybm8KKyAgICAgICAgbGFuZ3VhZ2VfaWQgPSAwCisgICAgICAgIHJlc3VsdF9idWZmZXIgPSBjdHlwZXMud2ludHlwZXMuTFBXU1RSKCkKKyAgICAgICAgYnVmZmVyX3NpemUgPSAwCisgICAgICAgIGFyZ3VtZW50cyA9IE5vbmUKKyAgICAgICAgYnl0ZXMgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkZvcm1hdE1lc3NhZ2VXKAorICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICBzb3VyY2UsCisgICAgICAgICAgICBtZXNzYWdlX2lkLAorICAgICAgICAgICAgbGFuZ3VhZ2VfaWQsCisgICAgICAgICAgICBjdHlwZXMuYnlyZWYocmVzdWx0X2J1ZmZlciksCisgICAgICAgICAgICBidWZmZXJfc2l6ZSwKKyAgICAgICAgICAgIGFyZ3VtZW50cywKKyAgICAgICAgICAgICkKKyAgICAgICAgIyBub3RlIHRoZSBmb2xsb3dpbmcgd2lsbCBjYXVzZSBhbiBpbmZpbml0ZSBsb29wIGlmIEdldExhc3RFcnJvcgorICAgICAgICAjICByZXBlYXRlZGx5IHJldHVybnMgYW4gZXJyb3IgdGhhdCBjYW5ub3QgYmUgZm9ybWF0dGVkLCBhbHRob3VnaAorICAgICAgICAjICB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICBoYW5kbGVfbm9uemVyb19zdWNjZXNzKGJ5dGVzKQorICAgICAgICBtZXNzYWdlID0gcmVzdWx0X2J1ZmZlci52YWx1ZQorICAgICAgICBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkxvY2FsRnJlZShyZXN1bHRfYnVmZmVyKQorICAgICAgICByZXR1cm4gbWVzc2FnZQorCisgICAgZGVmIGhhbmRsZV9ub256ZXJvX3N1Y2Nlc3MocmVzdWx0KToKKyAgICAgICAgaWYgcmVzdWx0ID09IDA6CisgICAgICAgICAgICB2YWx1ZSA9IGN0eXBlcy53aW5kbGwua2VybmVsMzIuR2V0TGFzdEVycm9yKCkKKyAgICAgICAgICAgIHN0cmVycm9yID0gZm9ybWF0X3N5c3RlbV9tZXNzYWdlKHZhbHVlKQorICAgICAgICAgICAgcmFpc2UgV2luZG93c0Vycm9yKHZhbHVlLCBzdHJlcnJvcikKKworICAgIHRhcmdldF9pc19kaXJlY3RvcnkgPSB0YXJnZXRfaXNfZGlyZWN0b3J5IG9yIG9zLnBhdGguaXNkaXIodGFyZ2V0KQorICAgIGhhbmRsZV9ub256ZXJvX3N1Y2Nlc3MoQ3JlYXRlU3ltYm9saWNMaW5rKGxpbmssIHRhcmdldCwgdGFyZ2V0X2lzX2RpcmVjdG9yeSkpCisKK3N5bWxpbmsgPSBvcy5zeW1saW5rIGlmIGhhc2F0dHIob3MsICdzeW1saW5rJykgZWxzZSAoCisgICAgX3N5bWxpbmtfd2luMzIgaWYgcGxhdGZvcm0uc3lzdGVtKCkgPT0gJ1dpbmRvd3MnIGVsc2UgTm9uZQorKQorCitkZWYgcmVtb3ZlX3N5bWxpbmsobmFtZSk6CisgICAgIyBPbiBXaW5kb3dzLCB0byByZW1vdmUgYSBkaXJlY3Rvcnkgc3ltbGluaywgb25lIG11c3QgdXNlIHJtZGlyCisgICAgdHJ5OgorICAgICAgICBvcy5ybWRpcihuYW1lKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBvcy5yZW1vdmUobmFtZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zeW1saW5rX3N1cHBvcnQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3N5bWxpbmtfc3VwcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyZDI1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zeW1saW5rX3N1cHBvcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zeW1saW5rX3N1cHBvcnQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3N5bWxpbmtfc3VwcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyZDI1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zeW1saW5rX3N1cHBvcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X01pbWVXcml0ZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9NaW1lV3JpdGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNjYzNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9NaW1lV3JpdGVyLnB5CkBAIC0wLDAgKzEsMjkyIEBACisiIiJUZXN0IHByb2dyYW0gZm9yIE1pbWVXcml0ZXIgbW9kdWxlLgorCitUaGUgdGVzdCBwcm9ncmFtIHdhcyB0b28gYmlnIHRvIGNvbWZvcnRhYmx5IGZpdCBpbiB0aGUgTWltZVdyaXRlcgorY2xhc3MsIHNvIGl0J3MgaGVyZSBpbiBpdHMgb3duIGZpbGUuCisKK1RoaXMgc2hvdWxkIGdlbmVyYXRlIEJhcnJ5J3MgZXhhbXBsZSwgbW9kdWxvIHNvbWUgcXVvdGVzIGFuZCBuZXdsaW5lcy4KKworIiIiCisKK2ltcG9ydCB1bml0dGVzdCwgU3RyaW5nSU8KK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZQorCitpbXBvcnRfbW9kdWxlKCJNaW1lV3JpdGVyIiwgZGVwcmVjYXRlZD1UcnVlKQorZnJvbSBNaW1lV3JpdGVyIGltcG9ydCBNaW1lV3JpdGVyCisKK1NFTExFUiA9ICcnJ1wKK0lOVEVSRkFDRSBTZWxsZXItMTsKKworVFlQRSBTZWxsZXIgPSBPQkpFQ1QKKyAgICBET0NVTUVOVEFUSU9OICJBIHNpbXBsZSBTZWxsZXIgaW50ZXJmYWNlIHRvIHRlc3QgSUxVIgorICAgIE1FVEhPRFMKKyAgICAgICAgICAgIHByaWNlKCk6SU5URUdFUiwKKyAgICBFTkQ7CisnJycKKworQlVZRVIgPSAnJydcCitjbGFzcyBCdXllcjoKKyAgICBkZWYgX19zZXR1cF9fKHNlbGYsIG1heHByaWNlKToKKyAgICAgICAgc2VsZi5fbWF4cHJpY2UgPSBtYXhwcmljZQorCisgICAgZGVmIF9fbWFpbl9fKHNlbGYsIGtvcyk6CisgICAgICAgICIiIkVudHJ5IHBvaW50IHVwb24gYXJyaXZhbCBhdCBhIG5ldyBLT1MuIiIiCisgICAgICAgIGJyb2tlciA9IGtvcy5icm9rZXIoKQorICAgICAgICAjIEI0ID09IEJhcnJ5J3MgQmlnIEJhc3MgQnVzaW5lc3MgOi0pCisgICAgICAgIHNlbGxlciA9IGJyb2tlci5sb29rdXAoJ1NlbGxlcl8xLlNlbGxlcicsICdCNCcpCisgICAgICAgIGlmIHNlbGxlcjoKKyAgICAgICAgICAgIHByaWNlID0gc2VsbGVyLnByaWNlKCkKKyAgICAgICAgICAgIHByaW50ICdTZWxsZXIgd2FudHMgJCcsIHByaWNlLCAnLi4uICcKKyAgICAgICAgICAgIGlmIHByaWNlID4gc2VsZi5fbWF4cHJpY2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3RvbyBtdWNoIScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIkknbGwgdGFrZSBpdCEiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAnbm8gc2VsbGVyIGZvdW5kIGhlcmUnCisnJycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEb24ndCBhc2sgd2h5IHRoaXMgY29tbWVudCBpcyBoZXJlCisKK1NUQVRFID0gJycnXAorIyBpbnN0YW50aWF0ZSBhIGJ1eWVyIGluc3RhbmNlIGFuZCBwdXQgaXQgaW4gYSBtYWdpYyBwbGFjZSBmb3IgdGhlIEtPUworIyB0byBmaW5kLgorX19rcF9fID0gQnV5ZXIoKQorX19rcF9fLl9fc2V0dXBfXyg1MDApCisnJycKKworU0lNUExFX01FVEFEQVRBID0gWworICAgICAgICAoIkludGVycHJldGVyIiwgInB5dGhvbiIpLAorICAgICAgICAoIkludGVycHJldGVyLVZlcnNpb24iLCAiMS4zIiksCisgICAgICAgICgiT3duZXItTmFtZSIsICJCYXJyeSBXYXJzYXciKSwKKyAgICAgICAgKCJPd25lci1SZW5kZXp2b3VzIiwgImJ3YXJzYXdAY25yaS5yZXN0b24udmEudXMiKSwKKyAgICAgICAgKCJIb21lLUtTUyIsICJrc3MuY25yaS5yZXN0b24udmEudXMiKSwKKyAgICAgICAgKCJJZGVudGlmaWVyIiwgImhkbDovL2Nucmkua3NzL215X2ZpcnN0X2tub3dib3QiKSwKKyAgICAgICAgKCJMYXVuY2gtRGF0ZSIsICJNb24gRmViIDEyIDE2OjM5OjAzIEVTVCAxOTk2IiksCisgICAgICAgIF0KKworQ09NUExFWF9NRVRBREFUQSA9IFsKKyAgICAgICAgKCJNZXRhZGF0YS1UeXBlIiwgImNvbXBsZXgiKSwKKyAgICAgICAgKCJNZXRhZGF0YS1LZXkiLCAiY29ubmVjdGlvbiIpLAorICAgICAgICAoIkFjY2VzcyIsICJyZWFkLW9ubHkiKSwKKyAgICAgICAgKCJDb25uZWN0aW9uLURlc2NyaXB0aW9uIiwgIkJhcnJ5J3MgQmlnIEJhc3MgQnVzaW5lc3MiKSwKKyAgICAgICAgKCJDb25uZWN0aW9uLUlkIiwgIkI0IiksCisgICAgICAgICgiQ29ubmVjdGlvbi1EaXJlY3Rpb24iLCAiY2xpZW50IiksCisgICAgICAgIF0KKworRVhURVJOQUxfTUVUQURBVEEgPSBbCisgICAgICAgICgiTWV0YWRhdGEtVHlwZSIsICJjb21wbGV4IiksCisgICAgICAgICgiTWV0YWRhdGEtS2V5IiwgImdlbmVyaWMtaW50ZXJmYWNlIiksCisgICAgICAgICgiQWNjZXNzIiwgInJlYWQtb25seSIpLAorICAgICAgICAoIkNvbm5lY3Rpb24tRGVzY3JpcHRpb24iLCAiR2VuZXJpYyBJbnRlcmZhY2UgZm9yIEFsbCBLbm93Ym90cyIpLAorICAgICAgICAoIkNvbm5lY3Rpb24tSWQiLCAiZ2VuZXJpYy1rcCIpLAorICAgICAgICAoIkNvbm5lY3Rpb24tRGlyZWN0aW9uIiwgImNsaWVudCIpLAorICAgICAgICBdCisKKworT1VUUFVUID0gJycnXAorRnJvbTogYndhcnNhd0BjbnJpLnJlc3Rvbi52YS51cworRGF0ZTogTW9uIEZlYiAxMiAxNzoyMTo0OCBFU1QgMTk5NgorVG86IGtzcy1zdWJtaXRAY25yaS5yZXN0b24udmEudXMKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9rbm93Ym90OworICAgIGJvdW5kYXJ5PSI4MDFzcGFtOTk5IjsKKyAgICB2ZXJzaW9uPSIwLjEiCisKK1RoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuCisKKy0tODAxc3BhbTk5OQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQva25vd2JvdC1tZXRhZGF0YTsKKyAgICBib3VuZGFyeT0iODAyc3BhbTk5OSIKKworCistLTgwMnNwYW05OTkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK0tQLU1ldGFkYXRhLVR5cGU6IHNpbXBsZQorS1AtQWNjZXNzOiByZWFkLW9ubHkKKworS1BNRC1JbnRlcnByZXRlcjogcHl0aG9uCitLUE1ELUludGVycHJldGVyLVZlcnNpb246IDEuMworS1BNRC1Pd25lci1OYW1lOiBCYXJyeSBXYXJzYXcKK0tQTUQtT3duZXItUmVuZGV6dm91czogYndhcnNhd0BjbnJpLnJlc3Rvbi52YS51cworS1BNRC1Ib21lLUtTUzoga3NzLmNucmkucmVzdG9uLnZhLnVzCitLUE1ELUlkZW50aWZpZXI6IGhkbDovL2Nucmkua3NzL215X2ZpcnN0X2tub3dib3QKK0tQTUQtTGF1bmNoLURhdGU6IE1vbiBGZWIgMTIgMTY6Mzk6MDMgRVNUIDE5OTYKKworLS04MDJzcGFtOTk5CitDb250ZW50LVR5cGU6IHRleHQvaXNsCitLUC1NZXRhZGF0YS1UeXBlOiBjb21wbGV4CitLUC1NZXRhZGF0YS1LZXk6IGNvbm5lY3Rpb24KK0tQLUFjY2VzczogcmVhZC1vbmx5CitLUC1Db25uZWN0aW9uLURlc2NyaXB0aW9uOiBCYXJyeSdzIEJpZyBCYXNzIEJ1c2luZXNzCitLUC1Db25uZWN0aW9uLUlkOiBCNAorS1AtQ29ubmVjdGlvbi1EaXJlY3Rpb246IGNsaWVudAorCitJTlRFUkZBQ0UgU2VsbGVyLTE7CisKK1RZUEUgU2VsbGVyID0gT0JKRUNUCisgICAgRE9DVU1FTlRBVElPTiAiQSBzaW1wbGUgU2VsbGVyIGludGVyZmFjZSB0byB0ZXN0IElMVSIKKyAgICBNRVRIT0RTCisgICAgICAgICAgICBwcmljZSgpOklOVEVHRVIsCisgICAgRU5EOworCistLTgwMnNwYW05OTkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9leHRlcm5hbC1ib2R5OworICAgIGFjY2Vzcy10eXBlPSJVUkwiOworICAgIFVSTD0iaGRsOi8vY25yaS5rc3MvZ2VuZXJpYy1rbm93Ym90IgorCitDb250ZW50LVR5cGU6IHRleHQvaXNsCitLUC1NZXRhZGF0YS1UeXBlOiBjb21wbGV4CitLUC1NZXRhZGF0YS1LZXk6IGdlbmVyaWMtaW50ZXJmYWNlCitLUC1BY2Nlc3M6IHJlYWQtb25seQorS1AtQ29ubmVjdGlvbi1EZXNjcmlwdGlvbjogR2VuZXJpYyBJbnRlcmZhY2UgZm9yIEFsbCBLbm93Ym90cworS1AtQ29ubmVjdGlvbi1JZDogZ2VuZXJpYy1rcAorS1AtQ29ubmVjdGlvbi1EaXJlY3Rpb246IGNsaWVudAorCisKKy0tODAyc3BhbTk5OS0tCisKKy0tODAxc3BhbTk5OQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQva25vd2JvdC1jb2RlOworICAgIGJvdW5kYXJ5PSI4MDNzcGFtOTk5IgorCisKKy0tODAzc3BhbTk5OQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitLUC1Nb2R1bGUtTmFtZTogQnV5ZXJLUAorCitjbGFzcyBCdXllcjoKKyAgICBkZWYgX19zZXR1cF9fKHNlbGYsIG1heHByaWNlKToKKyAgICAgICAgc2VsZi5fbWF4cHJpY2UgPSBtYXhwcmljZQorCisgICAgZGVmIF9fbWFpbl9fKHNlbGYsIGtvcyk6CisgICAgICAgICIiIkVudHJ5IHBvaW50IHVwb24gYXJyaXZhbCBhdCBhIG5ldyBLT1MuIiIiCisgICAgICAgIGJyb2tlciA9IGtvcy5icm9rZXIoKQorICAgICAgICAjIEI0ID09IEJhcnJ5J3MgQmlnIEJhc3MgQnVzaW5lc3MgOi0pCisgICAgICAgIHNlbGxlciA9IGJyb2tlci5sb29rdXAoJ1NlbGxlcl8xLlNlbGxlcicsICdCNCcpCisgICAgICAgIGlmIHNlbGxlcjoKKyAgICAgICAgICAgIHByaWNlID0gc2VsbGVyLnByaWNlKCkKKyAgICAgICAgICAgIHByaW50ICdTZWxsZXIgd2FudHMgJCcsIHByaWNlLCAnLi4uICcKKyAgICAgICAgICAgIGlmIHByaWNlID4gc2VsZi5fbWF4cHJpY2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3RvbyBtdWNoIScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIkknbGwgdGFrZSBpdCEiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAnbm8gc2VsbGVyIGZvdW5kIGhlcmUnCisKKy0tODAzc3BhbTk5OS0tCisKKy0tODAxc3BhbTk5OQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQva25vd2JvdC1zdGF0ZTsKKyAgICBib3VuZGFyeT0iODA0c3BhbTk5OSIKK0tQLU1haW4tTW9kdWxlOiBtYWluCisKKworLS04MDRzcGFtOTk5CitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KK0tQLU1vZHVsZS1OYW1lOiBtYWluCisKKyMgaW5zdGFudGlhdGUgYSBidXllciBpbnN0YW5jZSBhbmQgcHV0IGl0IGluIGEgbWFnaWMgcGxhY2UgZm9yIHRoZSBLT1MKKyMgdG8gZmluZC4KK19fa3BfXyA9IEJ1eWVyKCkKK19fa3BfXy5fX3NldHVwX18oNTAwKQorCistLTgwNHNwYW05OTktLQorCistLTgwMXNwYW05OTktLQorJycnCisKK2NsYXNzIE1pbWV3cml0ZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBidWYgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisKKyAgICAgICAgIyBUb3BsZXZlbCBoZWFkZXJzCisKKyAgICAgICAgdG9wbGV2ZWwgPSBNaW1lV3JpdGVyKGJ1ZikKKyAgICAgICAgdG9wbGV2ZWwuYWRkaGVhZGVyKCJGcm9tIiwgImJ3YXJzYXdAY25yaS5yZXN0b24udmEudXMiKQorICAgICAgICB0b3BsZXZlbC5hZGRoZWFkZXIoIkRhdGUiLCAiTW9uIEZlYiAxMiAxNzoyMTo0OCBFU1QgMTk5NiIpCisgICAgICAgIHRvcGxldmVsLmFkZGhlYWRlcigiVG8iLCAia3NzLXN1Ym1pdEBjbnJpLnJlc3Rvbi52YS51cyIpCisgICAgICAgIHRvcGxldmVsLmFkZGhlYWRlcigiTUlNRS1WZXJzaW9uIiwgIjEuMCIpCisKKyAgICAgICAgIyBUb3BsZXZlbCBib2R5IHBhcnRzCisKKyAgICAgICAgZiA9IHRvcGxldmVsLnN0YXJ0bXVsdGlwYXJ0Ym9keSgia25vd2JvdCIsICI4MDFzcGFtOTk5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKCJ2ZXJzaW9uIiwgIjAuMSIpXSwgcHJlZml4PTApCisgICAgICAgIGYud3JpdGUoIlRoaXMgaXMgYSBtdWx0aS1wYXJ0IG1lc3NhZ2UgaW4gTUlNRSBmb3JtYXQuXG4iKQorCisgICAgICAgICMgRmlyc3QgdG9wbGV2ZWwgYm9keSBwYXJ0OiBtZXRhZGF0YQorCisgICAgICAgIG1kID0gdG9wbGV2ZWwubmV4dHBhcnQoKQorICAgICAgICBtZC5zdGFydG11bHRpcGFydGJvZHkoImtub3dib3QtbWV0YWRhdGEiLCAiODAyc3BhbTk5OSIpCisKKyAgICAgICAgIyBNZXRhZGF0YSBwYXJ0IDEKKworICAgICAgICBtZDEgPSBtZC5uZXh0cGFydCgpCisgICAgICAgIG1kMS5hZGRoZWFkZXIoIktQLU1ldGFkYXRhLVR5cGUiLCAic2ltcGxlIikKKyAgICAgICAgbWQxLmFkZGhlYWRlcigiS1AtQWNjZXNzIiwgInJlYWQtb25seSIpCisgICAgICAgIG0gPSBNaW1lV3JpdGVyKG1kMS5zdGFydGJvZHkoIm1lc3NhZ2UvcmZjODIyIikpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIFNJTVBMRV9NRVRBREFUQToKKyAgICAgICAgICAgIG0uYWRkaGVhZGVyKCJLUE1ELSIgKyBrZXksIHZhbHVlKQorICAgICAgICBtLmZsdXNoaGVhZGVycygpCisgICAgICAgIGRlbCBtZDEKKworICAgICAgICAjIE1ldGFkYXRhIHBhcnQgMgorCisgICAgICAgIG1kMiA9IG1kLm5leHRwYXJ0KCkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gQ09NUExFWF9NRVRBREFUQToKKyAgICAgICAgICAgIG1kMi5hZGRoZWFkZXIoIktQLSIgKyBrZXksIHZhbHVlKQorICAgICAgICBmID0gbWQyLnN0YXJ0Ym9keSgidGV4dC9pc2wiKQorICAgICAgICBmLndyaXRlKFNFTExFUikKKyAgICAgICAgZGVsIG1kMgorCisgICAgICAgICMgTWV0YWRhdGEgcGFydCAzCisKKyAgICAgICAgbWQzID0gbWQubmV4dHBhcnQoKQorICAgICAgICBmID0gbWQzLnN0YXJ0Ym9keSgibWVzc2FnZS9leHRlcm5hbC1ib2R5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWygiYWNjZXNzLXR5cGUiLCAiVVJMIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoIlVSTCIsICJoZGw6Ly9jbnJpLmtzcy9nZW5lcmljLWtub3dib3QiKV0pCisgICAgICAgIG0gPSBNaW1lV3JpdGVyKGYpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIEVYVEVSTkFMX01FVEFEQVRBOgorICAgICAgICAgICAgbWQzLmFkZGhlYWRlcigiS1AtIiArIGtleSwgdmFsdWUpCisgICAgICAgIG1kMy5zdGFydGJvZHkoInRleHQvaXNsIikKKyAgICAgICAgIyBQaGFudG9tIGJvZHkgZG9lc24ndCBuZWVkIHRvIGJlIHdyaXR0ZW4KKworICAgICAgICBtZC5sYXN0cGFydCgpCisKKyAgICAgICAgIyBTZWNvbmQgdG9wbGV2ZWwgYm9keSBwYXJ0OiBjb2RlCisKKyAgICAgICAgY29kZSA9IHRvcGxldmVsLm5leHRwYXJ0KCkKKyAgICAgICAgY29kZS5zdGFydG11bHRpcGFydGJvZHkoImtub3dib3QtY29kZSIsICI4MDNzcGFtOTk5IikKKworICAgICAgICAjIENvZGU6IGJ1eWVyIHByb2dyYW0gc291cmNlCisKKyAgICAgICAgYnV5ZXIgPSBjb2RlLm5leHRwYXJ0KCkKKyAgICAgICAgYnV5ZXIuYWRkaGVhZGVyKCJLUC1Nb2R1bGUtTmFtZSIsICJCdXllcktQIikKKyAgICAgICAgZiA9IGJ1eWVyLnN0YXJ0Ym9keSgidGV4dC9wbGFpbiIpCisgICAgICAgIGYud3JpdGUoQlVZRVIpCisKKyAgICAgICAgY29kZS5sYXN0cGFydCgpCisKKyAgICAgICAgIyBUaGlyZCB0b3BsZXZlbCBib2R5IHBhcnQ6IHN0YXRlCisKKyAgICAgICAgc3RhdGUgPSB0b3BsZXZlbC5uZXh0cGFydCgpCisgICAgICAgIHN0YXRlLmFkZGhlYWRlcigiS1AtTWFpbi1Nb2R1bGUiLCAibWFpbiIpCisgICAgICAgIHN0YXRlLnN0YXJ0bXVsdGlwYXJ0Ym9keSgia25vd2JvdC1zdGF0ZSIsICI4MDRzcGFtOTk5IikKKworICAgICAgICAjIFN0YXRlOiBhIGJ1bmNoIG9mIGFzc2lnbm1lbnRzCisKKyAgICAgICAgc3QgPSBzdGF0ZS5uZXh0cGFydCgpCisgICAgICAgIHN0LmFkZGhlYWRlcigiS1AtTW9kdWxlLU5hbWUiLCAibWFpbiIpCisgICAgICAgIGYgPSBzdC5zdGFydGJvZHkoInRleHQvcGxhaW4iKQorICAgICAgICBmLndyaXRlKFNUQVRFKQorCisgICAgICAgIHN0YXRlLmxhc3RwYXJ0KCkKKworICAgICAgICAjIEVuZCB0b3BsZXZlbCBib2R5IHBhcnRzCisKKyAgICAgICAgdG9wbGV2ZWwubGFzdHBhcnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLmdldHZhbHVlKCksIE9VVFBVVCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChNaW1ld3JpdGVyVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfTWltZVdyaXRlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9NaW1lV3JpdGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGMyYjMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfTWltZVdyaXRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfTWltZVdyaXRlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9NaW1lV3JpdGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGMyYjMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfTWltZVdyaXRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU2ltcGxlSFRUUFNlcnZlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1NpbXBsZUhUVFBTZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZlYzg1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1NpbXBsZUhUVFBTZXJ2ZXIucHkKQEAgLTAsMCArMSw0MSBAQAorIiIiCitUaGVzZSB0ZXN0cyBvbmx5IGNoZWNrIHVybCBwYXJzaW5nIGZvciBub3cuCitXZSBkb24ndCB3YW50IHRvIHJlcXVpcmUgdGhlICduZXR3b3JrJyByZXNvdXJjZS4KKyIiIgorCitpbXBvcnQgb3MsIHVuaXR0ZXN0Citmcm9tIFNpbXBsZUhUVFBTZXJ2ZXIgaW1wb3J0IFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlcgorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitjbGFzcyBTb2NrZXRsZXNzUmVxdWVzdEhhbmRsZXIgKFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiIgVGVzdCB1cmwgcGFyc2luZyAiIiIKKyAgICBkZWYgc2V0VXAgKHNlbGYpOgorICAgICAgICBzZWxmLnRyYW5zbGF0ZWQgPSBvcy5nZXRjd2QoKQorICAgICAgICBzZWxmLnRyYW5zbGF0ZWQgPSBvcy5wYXRoLmpvaW4oc2VsZi50cmFuc2xhdGVkLCAnZmlsZW5hbWUnKQorICAgICAgICBzZWxmLmhhbmRsZXIgPSBTb2NrZXRsZXNzUmVxdWVzdEhhbmRsZXIgKCkKKworICAgIGRlZiB0ZXN0X3F1ZXJ5QXJndW1lbnRzIChzZWxmKToKKyAgICAgICAgcGF0aCA9IHNlbGYuaGFuZGxlci50cmFuc2xhdGVfcGF0aCAoJy9maWxlbmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwgKHBhdGgsIHNlbGYudHJhbnNsYXRlZCkKKyAgICAgICAgcGF0aCA9IHNlbGYuaGFuZGxlci50cmFuc2xhdGVfcGF0aCAoJy9maWxlbmFtZT9mb289YmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCAocGF0aCwgc2VsZi50cmFuc2xhdGVkKQorICAgICAgICBwYXRoID0gc2VsZi5oYW5kbGVyLnRyYW5zbGF0ZV9wYXRoICgnL2ZpbGVuYW1lP2E9YiZzcGFtPWVnZ3Mjem90JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCAocGF0aCwgc2VsZi50cmFuc2xhdGVkKQorCisgICAgZGVmIHRlc3Rfc3RhcnRXaXRoRG91YmxlU2xhc2ggKHNlbGYpOgorICAgICAgICBwYXRoID0gc2VsZi5oYW5kbGVyLnRyYW5zbGF0ZV9wYXRoICgnLy9maWxlbmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwgKHBhdGgsIHNlbGYudHJhbnNsYXRlZCkKKyAgICAgICAgcGF0aCA9IHNlbGYuaGFuZGxlci50cmFuc2xhdGVfcGF0aCAoJy8vZmlsZW5hbWU/Zm9vPWJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwgKHBhdGgsIHNlbGYudHJhbnNsYXRlZCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXJUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU2ltcGxlSFRUUFNlcnZlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9TaW1wbGVIVFRQU2VydmVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjkyYzVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU2ltcGxlSFRUUFNlcnZlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU2ltcGxlSFRUUFNlcnZlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9TaW1wbGVIVFRQU2VydmVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjkyYzVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU2ltcGxlSFRUUFNlcnZlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU3RyaW5nSU8ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9TdHJpbmdJTy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmYzMDdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU3RyaW5nSU8ucHkKQEAgLTAsMCArMSwyMjQgQEAKKyMgVGVzdHMgU3RyaW5nSU8gYW5kIGNTdHJpbmdJTworCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBTdHJpbmdJTworaW1wb3J0IGNTdHJpbmdJTworaW1wb3J0IHR5cGVzCitpbXBvcnQgYXJyYXkKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKworY2xhc3MgVGVzdEdlbmVyaWNTdHJpbmdJTyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyB1c2UgYSBjbGFzcyB2YXJpYWJsZSBNT0RVTEUgdG8gZGVmaW5lIHdoaWNoIG1vZHVsZSBpcyBiZWluZyB0ZXN0ZWQKKworICAgICMgTGluZSBvZiBkYXRhIHRvIHRlc3QgYXMgc3RyaW5nCisgICAgX2xpbmUgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiEnCisKKyAgICAjIENvbnN0cnVjdG9yIHRvIHVzZSBmb3IgdGhlIHRlc3QgZGF0YSAoLl9saW5lIGlzIHBhc3NlZCB0byB0aGlzCisgICAgIyBjb25zdHJ1Y3RvcikKKyAgICBjb25zdHJ1Y3RvciA9IHN0cgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9saW5lcyA9IHNlbGYuY29uc3RydWN0b3IoKHNlbGYuX2xpbmUgKyAnXG4nKSAqIDUpCisgICAgICAgIHNlbGYuX2ZwID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8oc2VsZi5fbGluZXMpCisKKyAgICBkZWYgdGVzdF9yZWFkcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5fZnAuc2VlaykKKyAgICAgICAgZXEoc2VsZi5fZnAucmVhZCgxMCksIHNlbGYuX2xpbmVbOjEwXSkKKyAgICAgICAgZXEoc2VsZi5fZnAucmVhZCgwKSwgJycpCisgICAgICAgIGVxKHNlbGYuX2ZwLnJlYWRsaW5lKDApLCAnJykKKyAgICAgICAgZXEoc2VsZi5fZnAucmVhZGxpbmUoKSwgc2VsZi5fbGluZVsxMDpdICsgJ1xuJykKKyAgICAgICAgZXEobGVuKHNlbGYuX2ZwLnJlYWRsaW5lcyg2MCkpLCAyKQorICAgICAgICBzZWxmLl9mcC5zZWVrKDApCisgICAgICAgIGVxKHNlbGYuX2ZwLnJlYWRsaW5lKC0xKSwgc2VsZi5fbGluZSArICdcbicpCisKKyAgICBkZWYgdGVzdF93cml0ZXMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLk1PRFVMRS5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZi5zZWVrKQorICAgICAgICBmLndyaXRlKHNlbGYuX2xpbmVbOjZdKQorICAgICAgICBmLnNlZWsoMykKKyAgICAgICAgZi53cml0ZShzZWxmLl9saW5lWzIwOjI2XSkKKyAgICAgICAgZi53cml0ZShzZWxmLl9saW5lWzUyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldHZhbHVlKCksICdhYmN1dnd4eXohJykKKworICAgIGRlZiB0ZXN0X3dyaXRlbGluZXMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLk1PRFVMRS5TdHJpbmdJTygpCisgICAgICAgIGYud3JpdGVsaW5lcyhbc2VsZi5fbGluZVswXSwgc2VsZi5fbGluZVsxXSwgc2VsZi5fbGluZVsyXV0pCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0dmFsdWUoKSwgJ2FiYycpCisKKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzX2Vycm9yKHNlbGYpOgorICAgICAgICBkZWYgZXJyb3JHZW4oKToKKyAgICAgICAgICAgIHlpZWxkICdhJworICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQoKQorICAgICAgICBmID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlib2FyZEludGVycnVwdCwgZi53cml0ZWxpbmVzLCBlcnJvckdlbigpKQorCisgICAgZGVmIHRlc3RfdHJ1bmNhdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8oKQorICAgICAgICBmLndyaXRlKHNlbGYuX2xpbmVzKQorICAgICAgICBmLnNlZWsoMTApCisgICAgICAgIGYudHJ1bmNhdGUoKQorICAgICAgICBlcShmLmdldHZhbHVlKCksICdhYmNkZWZnaGlqJykKKyAgICAgICAgZi50cnVuY2F0ZSg1KQorICAgICAgICBlcShmLmdldHZhbHVlKCksICdhYmNkZScpCisgICAgICAgIGYud3JpdGUoJ3h5eicpCisgICAgICAgIGVxKGYuZ2V0dmFsdWUoKSwgJ2FiY2RleHl6JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZi50cnVuY2F0ZSwgLTEpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLndyaXRlLCAnZnJvYm5pdHonKQorCisgICAgZGVmIHRlc3RfY2xvc2VkX2ZsYWcoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLk1PRFVMRS5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5jbG9zZWQsIEZhbHNlKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmNsb3NlZCwgVHJ1ZSkKKyAgICAgICAgZiA9IHNlbGYuTU9EVUxFLlN0cmluZ0lPKCJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuY2xvc2VkLCBGYWxzZSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5jbG9zZWQsIFRydWUpCisKKyAgICBkZWYgdGVzdF9pc2F0dHkoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLk1PRFVMRS5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZi5pc2F0dHksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5pc2F0dHkoKSwgRmFsc2UpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLmlzYXR0eSkKKworICAgIGRlZiB0ZXN0X2l0ZXJhdG9yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgIGVxKGl0ZXIoc2VsZi5fZnApLCBzZWxmLl9mcCkKKyAgICAgICAgIyBEb2VzIHRoaXMgb2JqZWN0IHN1cHBvcnQgdGhlIGl0ZXJhdGlvbiBwcm90b2NvbD8KKyAgICAgICAgdW5sZXNzKGhhc2F0dHIoc2VsZi5fZnAsICdfX2l0ZXJfXycpKQorICAgICAgICB1bmxlc3MoaGFzYXR0cihzZWxmLl9mcCwgJ25leHQnKSkKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5fZnA6CisgICAgICAgICAgICBlcShsaW5lLCBzZWxmLl9saW5lICsgJ1xuJykKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBlcShpLCA1KQorICAgICAgICBzZWxmLl9mcC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuX2ZwLm5leHQpCisKKyAgICBkZWYgdGVzdF9nZXR2YWx1ZShzZWxmKToKKyAgICAgICAgc2VsZi5fZnAuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLl9mcC5nZXR2YWx1ZSkKKworICAgIEB0ZXN0X3N1cHBvcnQuYmlnbWVtdGVzdCh0ZXN0X3N1cHBvcnQuXzJHICsgMioqMjYsIG1lbXVzZT0yLjAwMSkKKyAgICBkZWYgdGVzdF9yZWFkc19mcm9tX2xhcmdlX3N0cmVhbShzZWxmLCBzaXplKToKKyAgICAgICAgbGluZXNpemUgPSAyKioyNiAjIDY0IE1pQgorICAgICAgICBsaW5lcyA9IFsneCcgKiAobGluZXNpemUgLSAxKSArICdcbiddICogKHNpemUgLy8gbGluZXNpemUpICsgXAorICAgICAgICAgICAgICAgIFsneScgKiAoc2l6ZSAlIGxpbmVzaXplKV0KKyAgICAgICAgZiA9IHNlbGYuTU9EVUxFLlN0cmluZ0lPKCcnLmpvaW4obGluZXMpKQorICAgICAgICBmb3IgaSwgZXhwZWN0ZWQgaW4gZW51bWVyYXRlKGxpbmVzKToKKyAgICAgICAgICAgIGxpbmUgPSBmLnJlYWQobGVuKGV4cGVjdGVkKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmUpLCBsZW4oZXhwZWN0ZWQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgJycpCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBmb3IgaSwgZXhwZWN0ZWQgaW4gZW51bWVyYXRlKGxpbmVzKToKKyAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmUpLCBsZW4oZXhwZWN0ZWQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lKCksICcnKQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lcygpLCBsaW5lcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lcygpLCBbXSkKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZXMoc2l6ZSksIGxpbmVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmVzKCksIFtdKQorCisgICAgIyBJbiB3b3JzdCBjYXNlIGNTdHJpbmdJTyByZXF1aXJlcyAyICsgMSArIDEvMiArIDEvMioqMiArIC4uLiA9IDQKKyAgICAjIGJ5dGVzIHBlciBpbnB1dCBjaGFyYWN0ZXIuCisgICAgQHRlc3Rfc3VwcG9ydC5iaWdtZW10ZXN0KHRlc3Rfc3VwcG9ydC5fMkcsIG1lbXVzZT00KQorICAgIGRlZiB0ZXN0X3dyaXRlc190b19sYXJnZV9zdHJlYW0oc2VsZiwgc2l6ZSk6CisgICAgICAgIHMgPSAneCcgKiAyKioyNiAjIDY0IE1pQgorICAgICAgICBmID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8oKQorICAgICAgICBuID0gc2l6ZQorICAgICAgICB3aGlsZSBuID4gbGVuKHMpOgorICAgICAgICAgICAgZi53cml0ZShzKQorICAgICAgICAgICAgbiAtPSBsZW4ocykKKyAgICAgICAgcyA9IE5vbmUKKyAgICAgICAgZi53cml0ZSgneCcgKiBuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmLmdldHZhbHVlKCkpLCBzaXplKQorCisKK2NsYXNzIFRlc3RTdHJpbmdJTyhUZXN0R2VuZXJpY1N0cmluZ0lPKToKKyAgICBNT0RVTEUgPSBTdHJpbmdJTworCisgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKKworICAgICAgICBpZiBub3QgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZTogcmV0dXJuCisKKyAgICAgICAgIyBUaGUgU3RyaW5nSU8gbW9kdWxlIGFsc28gc3VwcG9ydHMgY29uY2F0ZW5hdGluZyBVbmljb2RlCisgICAgICAgICMgc25pcHBldHMgdG8gbGFyZ2VyIFVuaWNvZGUgc3RyaW5ncy4gVGhpcyBpcyB0ZXN0ZWQgYnkgdGhpcworICAgICAgICAjIG1ldGhvZC4gTm90ZSB0aGF0IGNTdHJpbmdJTyBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZXh0ZW5zaW9uLgorCisgICAgICAgIGYgPSBzZWxmLk1PRFVMRS5TdHJpbmdJTygpCisgICAgICAgIGYud3JpdGUoc2VsZi5fbGluZVs6Nl0pCisgICAgICAgIGYuc2VlaygzKQorICAgICAgICBmLndyaXRlKHVuaWNvZGUoc2VsZi5fbGluZVsyMDoyNl0pKQorICAgICAgICBmLndyaXRlKHVuaWNvZGUoc2VsZi5fbGluZVs1Ml0pKQorICAgICAgICBzID0gZi5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgdW5pY29kZSgnYWJjdXZ3eHl6IScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHR5cGVzLlVuaWNvZGVUeXBlKQorCitjbGFzcyBUZXN0Y1N0cmluZ0lPKFRlc3RHZW5lcmljU3RyaW5nSU8pOgorICAgIE1PRFVMRSA9IGNTdHJpbmdJTworCisgICAgZGVmIHRlc3RfYXJyYXlfc3VwcG9ydChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTczMDExNDogY1N0cmluZ0lPIHNob3VsZCBhY2NlcHQgYXJyYXkgb2JqZWN0cworICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ0InLCBbMCwxLDJdKQorICAgICAgICBmID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8oYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldHZhbHVlKCksICdceDAwXHgwMVx4MDInKQorCisgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKKworICAgICAgICBpZiBub3QgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZTogcmV0dXJuCisKKyAgICAgICAgIyBUaGUgY1N0cmluZ0lPIG1vZHVsZSBjb252ZXJ0cyBVbmljb2RlIHN0cmluZ3MgdG8gY2hhcmFjdGVyCisgICAgICAgICMgc3RyaW5ncyB3aGVuIHdyaXRpbmcgdGhlbSB0byBjU3RyaW5nSU8gb2JqZWN0cy4KKyAgICAgICAgIyBDaGVjayB0aGF0IHRoaXMgd29ya3MuCisKKyAgICAgICAgZiA9IHNlbGYuTU9EVUxFLlN0cmluZ0lPKCkKKyAgICAgICAgZi53cml0ZSh1J2FiY2RlJykKKyAgICAgICAgcyA9IGYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICdhYmNkZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgc3RyKQorCisgICAgICAgIGYgPSBzZWxmLk1PRFVMRS5TdHJpbmdJTyh1J2FiY2RlJykKKyAgICAgICAgcyA9IGYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICdhYmNkZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgc3RyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgc2VsZi5NT0RVTEUuU3RyaW5nSU8sIHUnXHhmNCcpCisKKworaW1wb3J0IHN5cworaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKKyAgICAjIEp5dGhvbiBkb2Vzbid0IGhhdmUgYSBidWZmZXIgb2JqZWN0LCBzbyB3ZSBqdXN0IGRvIGEgdXNlbGVzcworICAgICMgZmFrZSBvZiB0aGUgYnVmZmVyIHRlc3RzLgorICAgIGJ1ZmZlciA9IHN0cgorCitjbGFzcyBUZXN0QnVmZmVyU3RyaW5nSU8oVGVzdFN0cmluZ0lPKToKKyAgICBjb25zdHJ1Y3RvciA9IGJ1ZmZlcgorCitjbGFzcyBUZXN0QnVmZmVyY1N0cmluZ0lPKFRlc3RjU3RyaW5nSU8pOgorICAgIGNvbnN0cnVjdG9yID0gYnVmZmVyCisKK2NsYXNzIFRlc3RNZW1vcnl2aWV3Y1N0cmluZ0lPKFRlc3RjU3RyaW5nSU8pOgorICAgIGNvbnN0cnVjdG9yID0gbWVtb3J5dmlldworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RTdHJpbmdJTywgVGVzdGNTdHJpbmdJTykKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCgiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0QnVmZmVyU3RyaW5nSU8sIFRlc3RCdWZmZXJjU3RyaW5nSU8pCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0TWVtb3J5dmlld2NTdHJpbmdJTykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU3RyaW5nSU8ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU3RyaW5nSU8ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjhiNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9TdHJpbmdJTy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU3RyaW5nSU8ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU3RyaW5nSU8ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NjhiNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9TdHJpbmdJTy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX19hbGxfXy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fYWxsX18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1ZGJlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fYWxsX18ucHkKQEAgLTAsMCArMSwxMjMgQEAKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworIyBTZXR1cCBic2RkYiB3YXJuaW5ncwordHJ5OgorICAgIGJzZGRiID0gc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdic2RkYicsIGRlcHJlY2F0ZWQ9VHJ1ZSkKK2V4Y2VwdCB1bml0dGVzdC5Ta2lwVGVzdDoKKyAgICBwYXNzCisKKworY2xhc3MgTm9BbGwoUnVudGltZUVycm9yKToKKyAgICBwYXNzCisKK2NsYXNzIEZhaWxlZEltcG9ydChSdW50aW1lRXJyb3IpOgorICAgIHBhc3MKKworCitjbGFzcyBBbGxUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBjaGVja19hbGwoc2VsZiwgbW9kbmFtZSk6CisgICAgICAgIG5hbWVzID0ge30KKyAgICAgICAgd2l0aCBzdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgiLiogKG1vZHVsZXxwYWNrYWdlKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSwgcXVpZXQ9VHJ1ZSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXhlYyAiaW1wb3J0ICVzIiAlIG1vZG5hbWUgaW4gbmFtZXMKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIFNpbGVudCBmYWlsIGhlcmUgc2VlbXMgdGhlIGJlc3Qgcm91dGUgc2luY2Ugc29tZSBtb2R1bGVzCisgICAgICAgICAgICAgICAgIyBtYXkgbm90IGJlIGF2YWlsYWJsZSBvciBub3QgaW5pdGlhbGl6ZSBwcm9wZXJseSBpbiBhbGwKKyAgICAgICAgICAgICAgICAjIGVudmlyb25tZW50cy4KKyAgICAgICAgICAgICAgICByYWlzZSBGYWlsZWRJbXBvcnQobW9kbmFtZSkKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3lzLm1vZHVsZXNbbW9kbmFtZV0sICJfX2FsbF9fIik6CisgICAgICAgICAgICByYWlzZSBOb0FsbChtb2RuYW1lKQorICAgICAgICBuYW1lcyA9IHt9CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgImZyb20gJXMgaW1wb3J0ICoiICUgbW9kbmFtZSBpbiBuYW1lcworICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAjIEluY2x1ZGUgdGhlIG1vZHVsZSBuYW1lIGluIHRoZSBleGNlcHRpb24gc3RyaW5nCisgICAgICAgICAgICBzZWxmLmZhaWwoIl9fYWxsX18gZmFpbHVyZSBpbiB7fToge306IHt9Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSwgZS5fX2NsYXNzX18uX19uYW1lX18sIGUpKQorICAgICAgICBpZiAiX19idWlsdGluc19fIiBpbiBuYW1lczoKKyAgICAgICAgICAgIGRlbCBuYW1lc1siX19idWlsdGluc19fIl0KKyAgICAgICAga2V5cyA9IHNldChuYW1lcykKKyAgICAgICAgYWxsID0gc2V0KHN5cy5tb2R1bGVzW21vZG5hbWVdLl9fYWxsX18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5cywgYWxsKQorCisgICAgZGVmIHdhbGtfbW9kdWxlcyhzZWxmLCBiYXNlZGlyLCBtb2RwYXRoKToKKyAgICAgICAgZm9yIGZuIGluIHNvcnRlZChvcy5saXN0ZGlyKGJhc2VkaXIpKToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZWRpciwgZm4pCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgICAgIHBrZ19pbml0ID0gb3MucGF0aC5qb2luKHBhdGgsICdfX2luaXRfXy5weScpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGtnX2luaXQpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBwa2dfaW5pdCwgbW9kcGF0aCArIGZuCisgICAgICAgICAgICAgICAgICAgIGZvciBwLCBtIGluIHNlbGYud2Fsa19tb2R1bGVzKHBhdGgsIG1vZHBhdGggKyBmbiArICIuIik6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBwLCBtCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5vdCBmbi5lbmRzd2l0aCgnLnB5Jykgb3IgZm4gPT0gJ19faW5pdF9fLnB5JzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgeWllbGQgcGF0aCwgbW9kcGF0aCArIGZuWzotM10KKworICAgIGRlZiB0ZXN0X2FsbChzZWxmKToKKyAgICAgICAgIyBCbGFja2xpc3RlZCBtb2R1bGVzIGFuZCBwYWNrYWdlcworICAgICAgICBibGFja2xpc3QgPSBzZXQoWworICAgICAgICAgICAgIyBXaWxsIHJhaXNlIGEgU3ludGF4RXJyb3Igd2hlbiBjb21waWxpbmcgdGhlIGV4ZWMgc3RhdGVtZW50CisgICAgICAgICAgICAnX19mdXR1cmVfXycsCisgICAgICAgIF0pCisKKyAgICAgICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgICAgICAgICAjIEluIGNhc2UgX3NvY2tldCBmYWlscyB0byBidWlsZCwgbWFrZSB0aGlzIHRlc3QgZmFpbCBtb3JlIGdyYWNlZnVsbHkKKyAgICAgICAgICAgICMgdGhhbiBhbiBBdHRyaWJ1dGVFcnJvciBzb21ld2hlcmUgZGVlcCBpbiBDR0lIVFRQU2VydmVyLgorICAgICAgICAgICAgaW1wb3J0IF9zb2NrZXQKKworICAgICAgICAjIHJsY29tcGxldGVyIG5lZWRzIHNwZWNpYWwgY29uc2lkZXJhdGlvbjsgaXQgaW1wb3J0IHJlYWRsaW5lIHdoaWNoCisgICAgICAgICMgaW5pdGlhbGl6ZXMgR05VIHJlYWRsaW5lIHdoaWNoIGNhbGxzIHNldGxvY2FsZShMQ19DVFlQRSwgIiIpLi4uIDotKAorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgcmxjb21wbGV0ZXIKKyAgICAgICAgICAgIGltcG9ydCBsb2NhbGUKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQ1RZUEUsICdDJykKKworICAgICAgICBpZ25vcmVkID0gW10KKyAgICAgICAgZmFpbGVkX2ltcG9ydHMgPSBbXQorICAgICAgICBsaWJfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCisgICAgICAgIGZvciBwYXRoLCBtb2RuYW1lIGluIHNlbGYud2Fsa19tb2R1bGVzKGxpYl9kaXIsICIiKToKKyAgICAgICAgICAgIG0gPSBtb2RuYW1lCisgICAgICAgICAgICBibGFja2xpc3RlZCA9IEZhbHNlCisgICAgICAgICAgICB3aGlsZSBtOgorICAgICAgICAgICAgICAgIGlmIG0gaW4gYmxhY2tsaXN0OgorICAgICAgICAgICAgICAgICAgICBibGFja2xpc3RlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBtID0gbS5ycGFydGl0aW9uKCcuJylbMF0KKyAgICAgICAgICAgIGlmIGJsYWNrbGlzdGVkOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQobW9kbmFtZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFRoaXMgaGV1cmlzdGljIHNwZWVkcyB1cCB0aGUgcHJvY2VzcyBieSByZW1vdmluZywgZGUgZmFjdG8sCisgICAgICAgICAgICAgICAgIyBtb3N0IHRlc3QgbW9kdWxlcyAoYW5kIGF2b2lkaW5nIHRoZSBhdXRvLWV4ZWN1dGluZyBvbmVzKS4KKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4ocGF0aCwgInJiIikgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgaWYgIl9fYWxsX18iIG5vdCBpbiBmLnJlYWQoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIE5vQWxsKG1vZG5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfYWxsKG1vZG5hbWUpCisgICAgICAgICAgICBleGNlcHQgTm9BbGw6CisgICAgICAgICAgICAgICAgaWdub3JlZC5hcHBlbmQobW9kbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBGYWlsZWRJbXBvcnQ6CisgICAgICAgICAgICAgICAgZmFpbGVkX2ltcG9ydHMuYXBwZW5kKG1vZG5hbWUpCisKKyAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoJ0ZvbGxvd2luZyBtb2R1bGVzIGhhdmUgbm8gX19hbGxfXyBhbmQgaGF2ZSBiZWVuIGlnbm9yZWQ6JywKKyAgICAgICAgICAgICAgICAgIGlnbm9yZWQpCisgICAgICAgICAgICBwcmludCgnRm9sbG93aW5nIG1vZHVsZXMgZmFpbGVkIHRvIGJlIGltcG9ydGVkOicsIGZhaWxlZF9pbXBvcnRzKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChBbGxUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2FsbF9fLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fYWxsX18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNzRhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2FsbF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2FsbF9fLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fYWxsX18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNzRhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2FsbF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2Z1dHVyZV9fLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDhmOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weQpAQCAtMCwwICsxLDY2IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgX19mdXR1cmVfXworCitHT09EX1NFUklBTFMgPSAoImFscGhhIiwgImJldGEiLCAiY2FuZGlkYXRlIiwgImZpbmFsIikKKworZmVhdHVyZXMgPSBfX2Z1dHVyZV9fLmFsbF9mZWF0dXJlX25hbWVzCisKK2NsYXNzIEZ1dHVyZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbmFtZXMoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgYWxsX2ZlYXR1cmVfbmFtZXMgYXBwZWFycyBjb3JyZWN0LgorICAgICAgICBnaXZlbl9mZWF0dXJlX25hbWVzID0gZmVhdHVyZXNbOl0KKyAgICAgICAgZm9yIG5hbWUgaW4gZGlyKF9fZnV0dXJlX18pOgorICAgICAgICAgICAgb2JqID0gZ2V0YXR0cihfX2Z1dHVyZV9fLCBuYW1lLCBOb25lKQorICAgICAgICAgICAgaWYgb2JqIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKG9iaiwgX19mdXR1cmVfXy5fRmVhdHVyZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICBuYW1lIGluIGdpdmVuX2ZlYXR1cmVfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICIlciBzaG91bGQgaGF2ZSBiZWVuIGluIGFsbF9mZWF0dXJlX25hbWVzIiAlIG5hbWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgZ2l2ZW5fZmVhdHVyZV9uYW1lcy5yZW1vdmUobmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ2l2ZW5fZmVhdHVyZV9uYW1lcyksIDAsCisgICAgICAgICAgICAgICAiYWxsX2ZlYXR1cmVfbmFtZXMgaGFzIHRvbyBtdWNoOiAlciIgJSBnaXZlbl9mZWF0dXJlX25hbWVzKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgZm9yIGZlYXR1cmUgaW4gZmVhdHVyZXM6CisgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoX19mdXR1cmVfXywgZmVhdHVyZSkKKworICAgICAgICAgICAgb3B0aW9uYWwgPSB2YWx1ZS5nZXRPcHRpb25hbFJlbGVhc2UoKQorICAgICAgICAgICAgbWFuZGF0b3J5ID0gdmFsdWUuZ2V0TWFuZGF0b3J5UmVsZWFzZSgpCisKKyAgICAgICAgICAgIGEgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgICAgIGUgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICAgICBkZWYgY2hlY2sodCwgbmFtZSk6CisgICAgICAgICAgICAgICAgYShpc2luc3RhbmNlKHQsIHR1cGxlKSwgIiVzIGlzbid0IHR1cGxlIiAlIG5hbWUpCisgICAgICAgICAgICAgICAgZShsZW4odCksIDUsICIlcyBpc24ndCA1LXR1cGxlIiAlIG5hbWUpCisgICAgICAgICAgICAgICAgKG1ham9yLCBtaW5vciwgbWljcm8sIGxldmVsLCBzZXJpYWwpID0gdAorICAgICAgICAgICAgICAgIGEoaXNpbnN0YW5jZShtYWpvciwgaW50KSwgIiVzIG1ham9yIGlzbid0IGludCIgICUgbmFtZSkKKyAgICAgICAgICAgICAgICBhKGlzaW5zdGFuY2UobWlub3IsIGludCksICIlcyBtaW5vciBpc24ndCBpbnQiICUgbmFtZSkKKyAgICAgICAgICAgICAgICBhKGlzaW5zdGFuY2UobWljcm8sIGludCksICIlcyBtaWNybyBpc24ndCBpbnQiICUgbmFtZSkKKyAgICAgICAgICAgICAgICBhKGlzaW5zdGFuY2UobGV2ZWwsIGJhc2VzdHJpbmcpLAorICAgICAgICAgICAgICAgICAgICAiJXMgbGV2ZWwgaXNuJ3Qgc3RyaW5nIiAlIG5hbWUpCisgICAgICAgICAgICAgICAgYShsZXZlbCBpbiBHT09EX1NFUklBTFMsCisgICAgICAgICAgICAgICAgICAgICAgICIlcyBsZXZlbCBzdHJpbmcgaGFzIHVua25vd24gdmFsdWUiICUgbmFtZSkKKyAgICAgICAgICAgICAgICBhKGlzaW5zdGFuY2Uoc2VyaWFsLCBpbnQpLCAiJXMgc2VyaWFsIGlzbid0IGludCIgJSBuYW1lKQorCisgICAgICAgICAgICBjaGVjayhvcHRpb25hbCwgIm9wdGlvbmFsIikKKyAgICAgICAgICAgIGlmIG1hbmRhdG9yeSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjaGVjayhtYW5kYXRvcnksICJtYW5kYXRvcnkiKQorICAgICAgICAgICAgICAgIGEob3B0aW9uYWwgPCBtYW5kYXRvcnksCisgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbCBub3QgbGVzcyB0aGFuIG1hbmRhdG9yeSwgYW5kIG1hbmRhdG9yeSBub3QgTm9uZSIpCisKKyAgICAgICAgICAgIGEoaGFzYXR0cih2YWx1ZSwgImNvbXBpbGVyX2ZsYWciKSwKKyAgICAgICAgICAgICAgICAgICAiZmVhdHVyZSBpcyBtaXNzaW5nIGEgLmNvbXBpbGVyX2ZsYWcgYXR0ciIpCisgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgY29tcGlsZSBhY2NlcHRzIHRoZSBmbGFnLgorICAgICAgICAgICAgY29tcGlsZSgiIiwgIjx0ZXN0PiIsICJleGVjIiwgdmFsdWUuY29tcGlsZXJfZmxhZykKKyAgICAgICAgICAgIGEoaXNpbnN0YW5jZShnZXRhdHRyKHZhbHVlLCAiY29tcGlsZXJfZmxhZyIpLCBpbnQpLAorICAgICAgICAgICAgICAgICAgICIuY29tcGlsZXJfZmxhZyBpc24ndCBpbnQiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEZ1dHVyZVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fZnV0dXJlX18ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxMWRlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fZnV0dXJlX18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fZnV0dXJlX18ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcxMWRlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fZnV0dXJlX18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19sb2NhbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fbG9jYWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmY2I5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fbG9jYWxlLnB5CkBAIC0wLDAgKzEsMTM3IEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKK2Zyb20gX2xvY2FsZSBpbXBvcnQgKHNldGxvY2FsZSwgTENfTlVNRVJJQywgbG9jYWxlY29udiwgRXJyb3IpCit0cnk6CisgICAgZnJvbSBfbG9jYWxlIGltcG9ydCAoUkFESVhDSEFSLCBUSE9VU0VQLCBubF9sYW5naW5mbykKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBubF9sYW5naW5mbyA9IE5vbmUKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCitmcm9tIHBsYXRmb3JtIGltcG9ydCB1bmFtZQorCitpZiB1bmFtZSgpWzBdID09ICJEYXJ3aW4iOgorICAgIG1haiwgbWluLCBtaWMgPSBbaW50KHBhcnQpIGZvciBwYXJ0IGluIHVuYW1lKClbMl0uc3BsaXQoIi4iKV0KKyAgICBpZiAobWFqLCBtaW4sIG1pYykgPCAoOCwgMCwgMCk6CisgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJsb2NhbGUgc3VwcG9ydCBicm9rZW4gZm9yIE9TIFggPCAxMC40IikKKworY2FuZGlkYXRlX2xvY2FsZXMgPSBbJ2VzX1VZJywgJ2ZyX0ZSJywgJ2ZpX0ZJJywgJ2VzX0NPJywgJ3B0X1BUJywgJ2l0X0lUJywKKyAgICAnZXRfRUUnLCAnZXNfUFknLCAnbm9fTk8nLCAnbmxfTkwnLCAnbHZfTFYnLCAnZWxfR1InLCAnYmVfQlknLCAnZnJfQkUnLAorICAgICdyb19STycsICdydV9VQScsICdydV9SVScsICdlc19WRScsICdjYV9FUycsICdzZV9OTycsICdlc19FQycsICdpZF9JRCcsCisgICAgJ2thX0dFJywgJ2VzX0NMJywgJ2h1X0hVJywgJ3dhX0JFJywgJ2x0X0xUJywgJ3NsX1NJJywgJ2hyX0hSJywgJ2VzX0FSJywKKyAgICAnZXNfRVMnLCAnb2NfRlInLCAnZ2xfRVMnLCAnYmdfQkcnLCAnaXNfSVMnLCAnbWtfTUsnLCAnZGVfQVQnLCAncHRfQlInLAorICAgICdkYV9ESycsICdubl9OTycsICdjc19DWicsICdkZV9MVScsICdlc19CTycsICdzcV9BTCcsICdza19TSycsICdmcl9DSCcsCisgICAgJ2RlX0RFJywgJ3NyX1lVJywgJ2JyX0ZSJywgJ25sX0JFJywgJ3N2X0ZJJywgJ3BsX1BMJywgJ2ZyX0NBJywgJ2ZvX0ZPJywKKyAgICAnYnNfQkEnLCAnZnJfTFUnLCAna2xfR0wnLCAnZmFfSVInLCAnZGVfQkUnLCAnc3ZfU0UnLCAnaXRfQ0gnLCAndWtfVUEnLAorICAgICdldV9FUycsICd2aV9WTicsICdhZl9aQScsICduYl9OTycsICdlbl9ESycsICd0Z19USicsICdlbl9VUycsCisgICAgJ2VzX0VTLklTTzg4NTktMScsICdmcl9GUi5JU084ODU5LTE1JywgJ3J1X1JVLktPSTgtUicsICdrb19LUi5ldWNLUiddCisKKyMgV29ya2Fyb3VuZCBmb3IgTVNWQzYoZGVidWcpIGNyYXNoIGJ1ZworaWYgIk1TQyB2LjEyMDAiIGluIHN5cy52ZXJzaW9uOgorICAgIGRlZiBhY2NlcHQobG9jKToKKyAgICAgICAgYSA9IGxvYy5zcGxpdCgiLiIpCisgICAgICAgIHJldHVybiBub3QobGVuKGEpID09IDIgYW5kIGxlbihhWy0xXSkgPj0gOSkKKyAgICBjYW5kaWRhdGVfbG9jYWxlcyA9IFtsb2MgZm9yIGxvYyBpbiBjYW5kaWRhdGVfbG9jYWxlcyBpZiBhY2NlcHQobG9jKV0KKworIyBMaXN0IGtub3duIGxvY2FsZSB2YWx1ZXMgdG8gdGVzdCBhZ2FpbnN0IHdoZW4gYXZhaWxhYmxlLgorIyBEaWN0IGZvcm1hdHRlZCBhcyBgYDxsb2NhbGU+IDogKDxkZWNpbWFsX3BvaW50PiwgPHRob3VzYW5kc19zZXA+KWBgLiAgSWYgYQorIyB2YWx1ZSBpcyBub3Qga25vd24sIHVzZSAnJyAuCitrbm93bl9udW1lcmljcyA9IHsnZnJfRlInIDogKCcsJywgJycpLCAnZW5fVVMnOignLicsICcsJyl9CisKK2NsYXNzIF9Mb2NhbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYub2xkbG9jYWxlID0gc2V0bG9jYWxlKExDX05VTUVSSUMpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNldGxvY2FsZShMQ19OVU1FUklDLCBzZWxmLm9sZGxvY2FsZSkKKworICAgICMgV2FudCB0byBrbm93IHdoYXQgdmFsdWUgd2FzIGNhbGN1bGF0ZWQsIHdoYXQgaXQgd2FzIGNvbXBhcmVkIGFnYWluc3QsCisgICAgIyB3aGF0IGZ1bmN0aW9uIHdhcyB1c2VkIGZvciB0aGUgY2FsY3VsYXRpb24sIHdoYXQgdHlwZSBvZiBkYXRhIHdhcyB1c2VkLAorICAgICMgdGhlIGxvY2FsZSB0aGF0IHdhcyBzdXBwb3NlZGx5IHNldCwgYW5kIHRoZSBhY3R1YWwgbG9jYWxlIHRoYXQgaXMgc2V0LgorICAgIGxjX251bWVyaWNfZXJyX21zZyA9ICIlcyAhPSAlcyAoJXMgZm9yICVzOyBzZXQgdG8gJXMsIHVzaW5nICVzKSIKKworICAgIGRlZiBudW1lcmljX3Rlc3RlcihzZWxmLCBjYWxjX3R5cGUsIGNhbGNfdmFsdWUsIGRhdGFfdHlwZSwgdXNlZF9sb2NhbGUpOgorICAgICAgICAiIiJDb21wYXJlIGNhbGN1bGF0aW9uIGFnYWluc3Qga25vd24gdmFsdWUsIGlmIGF2YWlsYWJsZSIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZXRfbG9jYWxlID0gc2V0bG9jYWxlKExDX05VTUVSSUMpCisgICAgICAgIGV4Y2VwdCBFcnJvcjoKKyAgICAgICAgICAgIHNldF9sb2NhbGUgPSAiPG5vdCBhYmxlIHRvIGRldGVybWluZT4iCisgICAgICAgIGtub3duX3ZhbHVlID0ga25vd25fbnVtZXJpY3MuZ2V0KHVzZWRfbG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcnLCAnJykpW2RhdGFfdHlwZSA9PSAndGhvdXNhbmRzX3NlcCddCisgICAgICAgIGlmIGtub3duX3ZhbHVlIGFuZCBjYWxjX3ZhbHVlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxjX3ZhbHVlLCBrbm93bl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sY19udW1lcmljX2Vycl9tc2cgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjX3ZhbHVlLCBrbm93bl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNfdHlwZSwgZGF0YV90eXBlLCBzZXRfbG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZF9sb2NhbGUpKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MobmxfbGFuZ2luZm8sICJubF9sYW5naW5mbyBpcyBub3QgYXZhaWxhYmxlIikKKyAgICBkZWYgdGVzdF9sY19udW1lcmljX25sX2xhbmdpbmZvKHNlbGYpOgorICAgICAgICAjIFRlc3QgbmxfbGFuZ2luZm8gYWdhaW5zdCBrbm93biB2YWx1ZXMKKyAgICAgICAgZm9yIGxvYyBpbiBjYW5kaWRhdGVfbG9jYWxlczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZXRsb2NhbGUoTENfTlVNRVJJQywgbG9jKQorICAgICAgICAgICAgZXhjZXB0IEVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmb3IgbGksIGxjIGluICgoUkFESVhDSEFSLCAiZGVjaW1hbF9wb2ludCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUSE9VU0VQLCAidGhvdXNhbmRzX3NlcCIpKToKKyAgICAgICAgICAgICAgICBzZWxmLm51bWVyaWNfdGVzdGVyKCdubF9sYW5naW5mbycsIG5sX2xhbmdpbmZvKGxpKSwgbGMsIGxvYykKKworICAgIGRlZiB0ZXN0X2xjX251bWVyaWNfbG9jYWxlY29udihzZWxmKToKKyAgICAgICAgIyBUZXN0IGxvY2FsZWNvbnYgYWdhaW5zdCBrbm93biB2YWx1ZXMKKyAgICAgICAgZm9yIGxvYyBpbiBjYW5kaWRhdGVfbG9jYWxlczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZXRsb2NhbGUoTENfTlVNRVJJQywgbG9jKQorICAgICAgICAgICAgZXhjZXB0IEVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmb3IgbGMgaW4gKCJkZWNpbWFsX3BvaW50IiwgInRob3VzYW5kc19zZXAiKToKKyAgICAgICAgICAgICAgICBzZWxmLm51bWVyaWNfdGVzdGVyKCdsb2NhbGVjb252JywgbG9jYWxlY29udigpW2xjXSwgbGMsIGxvYykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG5sX2xhbmdpbmZvLCAibmxfbGFuZ2luZm8gaXMgbm90IGF2YWlsYWJsZSIpCisgICAgZGVmIHRlc3RfbGNfbnVtZXJpY19iYXNpYyhzZWxmKToKKyAgICAgICAgIyBUZXN0IG5sX2xhbmdpbmZvIGFnYWluc3QgbG9jYWxlY29udgorICAgICAgICBmb3IgbG9jIGluIGNhbmRpZGF0ZV9sb2NhbGVzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNldGxvY2FsZShMQ19OVU1FUklDLCBsb2MpCisgICAgICAgICAgICBleGNlcHQgRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZvciBsaSwgbGMgaW4gKChSQURJWENIQVIsICJkZWNpbWFsX3BvaW50IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRIT1VTRVAsICJ0aG91c2FuZHNfc2VwIikpOgorICAgICAgICAgICAgICAgIG5sX3JhZGl4Y2hhciA9IG5sX2xhbmdpbmZvKGxpKQorICAgICAgICAgICAgICAgIGxpX3JhZGl4Y2hhciA9IGxvY2FsZWNvbnYoKVtsY10KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNldF9sb2NhbGUgPSBzZXRsb2NhbGUoTENfTlVNRVJJQykKKyAgICAgICAgICAgICAgICBleGNlcHQgRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNldF9sb2NhbGUgPSAiPG5vdCBhYmxlIHRvIGRldGVybWluZT4iCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChubF9yYWRpeGNoYXIsIGxpX3JhZGl4Y2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIChubF9sYW5naW5mbykgIT0gJXMgKGxvY2FsZWNvbnYpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzZXQgdG8gJXMsIHVzaW5nICVzKSIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubF9yYWRpeGNoYXIsIGxpX3JhZGl4Y2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYywgc2V0X2xvY2FsZSkpCisKKyAgICBkZWYgdGVzdF9mbG9hdF9wYXJzaW5nKHNlbGYpOgorICAgICAgICAjIEJ1ZyAjMTM5MTg3MjogVGVzdCB3aGV0aGVyIGZsb2F0IHBhcnNpbmcgaXMgb2theSBvbiBFdXJvcGVhbgorICAgICAgICAjIGxvY2FsZXMuCisgICAgICAgIGZvciBsb2MgaW4gY2FuZGlkYXRlX2xvY2FsZXM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2V0bG9jYWxlKExDX05VTUVSSUMsIGxvYykKKyAgICAgICAgICAgIGV4Y2VwdCBFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIElnbm9yZSBidWdneSBsb2NhbGUgZGF0YWJhc2VzLiAoTWFjIE9TIDEwLjQgYW5kIHNvbWUgb3RoZXIgQlNEcykKKyAgICAgICAgICAgIGlmIGxvYyA9PSAnZXVfRVMnIGFuZCBsb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXSA9PSAiJyAiOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGV2YWwoJzMuMTQnKSAqIDEwMCksIDMxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIGV2YWwoJzMuMTQnKSBmYWlsZWQgZm9yICVzIiAlIGxvYykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KCczLjE0JykgKiAxMDApLCAzMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBmbG9hdCgnMy4xNCcpIGZhaWxlZCBmb3IgJXMiICUgbG9jKQorICAgICAgICAgICAgaWYgbG9jYWxlY29udigpWydkZWNpbWFsX3BvaW50J10gIT0gJy4nOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZWNvbnYoKVsnZGVjaW1hbF9wb2ludCddLmpvaW4oWycxJywgJzIzJ10pKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KF9Mb2NhbGVUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX2xvY2FsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fbG9jYWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWU2OGFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX2xvY2FsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX2xvY2FsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fbG9jYWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWU2OGFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX2xvY2FsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNmNlYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fb3N4X3N1cHBvcnQucHkKQEAgLTAsMCArMSwyNzkgQEAKKyIiIgorVGVzdCBzdWl0ZSBmb3IgX29zeF9zdXBwb3J0OiBzaGFyZWQgT1MgWCBzdXBwb3J0IGZ1bmN0aW9ucy4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHNodXRpbAoraW1wb3J0IHN0YXQKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKKworaW1wb3J0IF9vc3hfc3VwcG9ydAorCitAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgiZGFyd2luIiksICJyZXF1aXJlcyBPUyBYIikKK2NsYXNzIFRlc3RfT1NYU3VwcG9ydCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubWF4RGlmZiA9IE5vbmUKKyAgICAgICAgc2VsZi5wcm9nX25hbWUgPSAnYm9ndXNfcHJvZ3JhbV94eHh4JworICAgICAgICBzZWxmLnRlbXBfcGF0aF9kaXIgPSBvcy5wYXRoLmFic3BhdGgob3MuZ2V0Y3dkKCkpCisgICAgICAgIHNlbGYuZW52ID0gdGVzdC50ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZWxmLmVudi5fX2V4aXRfXykKKyAgICAgICAgZm9yIGN2IGluICgnQ0ZMQUdTJywgJ0xERkxBR1MnLCAnQ1BQRkxBR1MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCQVNFQ0ZMQUdTJywgJ0JMRFNIQVJFRCcsICdMRFNIQVJFRCcsICdDQycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NYWCcsICdQWV9DRkxBR1MnLCAnUFlfTERGTEFHUycsICdQWV9DUFBGTEFHUycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BZX0NPUkVfQ0ZMQUdTJyk6CisgICAgICAgICAgICBpZiBjdiBpbiBzZWxmLmVudjoKKyAgICAgICAgICAgICAgICBzZWxmLmVudi51bnNldChjdikKKworICAgIGRlZiBhZGRfZXhwZWN0ZWRfc2F2ZWRfaW5pdGlhbF92YWx1ZXMoc2VsZiwgY29uZmlnX3ZhcnMsIGV4cGVjdGVkX3ZhcnMpOgorICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBpbml0aWFsIHZhbHVlcyBmb3IgYWxsIG1vZGlmaWVkIGNvbmZpZyB2YXJzCisgICAgICAgICMgYXJlIGFsc28gc2F2ZWQgd2l0aCBtb2RpZmllZCBrZXlzLgorICAgICAgICBleHBlY3RlZF92YXJzLnVwZGF0ZSgoJ19PU1hfU1VQUE9SVF9JTklUSUFMXycrIGssCisgICAgICAgICAgICAgICAgY29uZmlnX3ZhcnNba10pIGZvciBrIGluIGNvbmZpZ192YXJzCisgICAgICAgICAgICAgICAgICAgIGlmIGNvbmZpZ192YXJzW2tdICE9IGV4cGVjdGVkX3ZhcnNba10pCisKKyAgICBkZWYgdGVzdF9fZmluZF9leGVjdXRhYmxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmVudlsnUEFUSCddOgorICAgICAgICAgICAgc2VsZi5lbnZbJ1BBVEgnXSA9IHNlbGYuZW52WydQQVRIJ10gKyAnOicKKyAgICAgICAgc2VsZi5lbnZbJ1BBVEgnXSA9IHNlbGYuZW52WydQQVRIJ10gKyBvcy5wYXRoLmFic3BhdGgoc2VsZi50ZW1wX3BhdGhfZGlyKQorICAgICAgICB0ZXN0LnRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5wcm9nX25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKF9vc3hfc3VwcG9ydC5fZmluZF9leGVjdXRhYmxlKHNlbGYucHJvZ19uYW1lKSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3QudGVzdF9zdXBwb3J0LnVubGluaywgc2VsZi5wcm9nX25hbWUpCisgICAgICAgIHdpdGggb3BlbihzZWxmLnByb2dfbmFtZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgiIyEvYmluL3NoXG4vYmluL2VjaG8gT0tcbiIpCisgICAgICAgIG9zLmNobW9kKHNlbGYucHJvZ19uYW1lLCBzdGF0LlNfSVJXWFUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wcm9nX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29zeF9zdXBwb3J0Ll9maW5kX2V4ZWN1dGFibGUoc2VsZi5wcm9nX25hbWUpKQorCisgICAgZGVmIHRlc3RfX3JlYWRfb3V0cHV0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmVudlsnUEFUSCddOgorICAgICAgICAgICAgc2VsZi5lbnZbJ1BBVEgnXSA9IHNlbGYuZW52WydQQVRIJ10gKyAnOicKKyAgICAgICAgc2VsZi5lbnZbJ1BBVEgnXSA9IHNlbGYuZW52WydQQVRIJ10gKyBvcy5wYXRoLmFic3BhdGgoc2VsZi50ZW1wX3BhdGhfZGlyKQorICAgICAgICB0ZXN0LnRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5wcm9nX25hbWUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0LnRlc3Rfc3VwcG9ydC51bmxpbmssIHNlbGYucHJvZ19uYW1lKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5wcm9nX25hbWUsICd3JykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoIiMhL2Jpbi9zaFxuL2Jpbi9lY2hvIEV4cGVjdGVkT3V0cHV0XG4iKQorICAgICAgICBvcy5jaG1vZChzZWxmLnByb2dfbmFtZSwgc3RhdC5TX0lSV1hVKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdFeHBlY3RlZE91dHB1dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29zeF9zdXBwb3J0Ll9yZWFkX291dHB1dChzZWxmLnByb2dfbmFtZSkpCisKKyAgICBkZWYgdGVzdF9fZmluZF9idWlsZF90b29sKHNlbGYpOgorICAgICAgICBvdXQgPSBfb3N4X3N1cHBvcnQuX2ZpbmRfYnVpbGRfdG9vbCgnY2MnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUob3V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2Mgbm90IGZvdW5kIC0gY2hlY2sgeGNvZGUtc2VsZWN0JykKKworICAgIGRlZiB0ZXN0X19nZXRfc3lzdGVtX3ZlcnNpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwbGF0Zm9ybS5tYWNfdmVyKClbMF0uc3RhcnRzd2l0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5fZ2V0X3N5c3RlbV92ZXJzaW9uKCkpKQorCisgICAgZGVmIHRlc3RfX3JlbW92ZV9vcmlnaW5hbF92YWx1ZXMoc2VsZik6CisgICAgICAgIGNvbmZpZ192YXJzID0geworICAgICAgICAnQ0MnOiAnZ2NjLXRlc3QgLXB0aHJlYWRzJywKKyAgICAgICAgfQorICAgICAgICBleHBlY3RlZF92YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcgLXB0aHJlYWRzJywKKyAgICAgICAgfQorICAgICAgICBjdiA9ICdDQycKKyAgICAgICAgbmV3dmFsdWUgPSAnY2xhbmcgLXB0aHJlYWRzJworICAgICAgICBfb3N4X3N1cHBvcnQuX3NhdmVfbW9kaWZpZWRfdmFsdWUoY29uZmlnX3ZhcnMsIGN2LCBuZXd2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChleHBlY3RlZF92YXJzLCBjb25maWdfdmFycykKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGNvbmZpZ192YXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3ZhcnMsIGNvbmZpZ192YXJzKQorCisgICAgZGVmIHRlc3RfX3NhdmVfbW9kaWZpZWRfdmFsdWUoc2VsZik6CisgICAgICAgIGNvbmZpZ192YXJzID0geworICAgICAgICAnQ0MnOiAnZ2NjLXRlc3QgLXB0aHJlYWRzJywKKyAgICAgICAgfQorICAgICAgICBleHBlY3RlZF92YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcgLXB0aHJlYWRzJywKKyAgICAgICAgfQorICAgICAgICBzZWxmLmFkZF9leHBlY3RlZF9zYXZlZF9pbml0aWFsX3ZhbHVlcyhjb25maWdfdmFycywgZXhwZWN0ZWRfdmFycykKKyAgICAgICAgY3YgPSAnQ0MnCisgICAgICAgIG5ld3ZhbHVlID0gJ2NsYW5nIC1wdGhyZWFkcycKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9zYXZlX21vZGlmaWVkX3ZhbHVlKGNvbmZpZ192YXJzLCBjdiwgbmV3dmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFycywgY29uZmlnX3ZhcnMpCisKKyAgICBkZWYgdGVzdF9fc2F2ZV9tb2RpZmllZF92YWx1ZV91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIGNvbmZpZ192YXJzID0geworICAgICAgICAnQ0MnOiAnZ2NjLXRlc3QgLXB0aHJlYWRzJywKKyAgICAgICAgfQorICAgICAgICBleHBlY3RlZF92YXJzID0gY29uZmlnX3ZhcnMuY29weSgpCisgICAgICAgIGN2ID0gJ0NDJworICAgICAgICBuZXd2YWx1ZSA9ICdnY2MtdGVzdCAtcHRocmVhZHMnCisgICAgICAgIF9vc3hfc3VwcG9ydC5fc2F2ZV9tb2RpZmllZF92YWx1ZShjb25maWdfdmFycywgY3YsIG5ld3ZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3ZhcnMsIGNvbmZpZ192YXJzKQorCisgICAgZGVmIHRlc3RfX3N1cHBvcnRzX3VuaXZlcnNhbF9idWlsZHMoc2VsZik6CisgICAgICAgIGltcG9ydCBwbGF0Zm9ybQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsYXRmb3JtLm1hY192ZXIoKVswXS5zcGxpdCgnLicpID49IFsnMTAnLCAnNCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5fc3VwcG9ydHNfdW5pdmVyc2FsX2J1aWxkcygpKQorCisgICAgZGVmIHRlc3RfX2ZpbmRfYXBwcm9wcmlhdGVfY29tcGlsZXIoc2VsZik6CisgICAgICAgIGNvbXBpbGVycyA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICgnZ2NjLXRlc3QnLCAnaTY4Ni1hcHBsZS1kYXJ3aW4xMS1sbHZtLWdjYy00LjInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgnY2xhbmcnLCAnY2xhbmcgdmVyc2lvbiAzLjEnKSwKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBjb25maWdfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2djYy10ZXN0IC1wdGhyZWFkcycsCisgICAgICAgICdDWFgnOiAnY2MrKy10ZXN0JywKKyAgICAgICAgJ0NGTEFHUyc6ICctZm5vLXN0cmljdC1hbGlhc2luZyAgLWcgLU8zIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICAnLAorICAgICAgICAnTERGTEFHUyc6ICctYXJjaCBwcGMgLWFyY2ggaTM4NiAgIC1nJywKKyAgICAgICAgJ0NQUEZMQUdTJzogJy1JLiAtaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkaycsCisgICAgICAgICdCTERTSEFSRUQnOiAnZ2NjLXRlc3QgLWJ1bmRsZSAtYXJjaCBwcGMgLWFyY2ggaTM4NiAtZycsCisgICAgICAgICdMRFNIQVJFRCc6ICdnY2MtdGVzdCAtYnVuZGxlIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICctaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayAtZycsCisgICAgICAgIH0KKyAgICAgICAgZXhwZWN0ZWRfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2NsYW5nIC1wdGhyZWFkcycsCisgICAgICAgICdDWFgnOiAnY2xhbmcrKycsCisgICAgICAgICdDRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1nIC1PMyAtYXJjaCBwcGMgLWFyY2ggaTM4NiAgJywKKyAgICAgICAgJ0xERkxBR1MnOiAnLWFyY2ggcHBjIC1hcmNoIGkzODYgICAtZycsCisgICAgICAgICdDUFBGTEFHUyc6ICctSS4gLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsnLAorICAgICAgICAnQkxEU0hBUkVEJzogJ2NsYW5nIC1idW5kbGUgLWFyY2ggcHBjIC1hcmNoIGkzODYgLWcnLAorICAgICAgICAnTERTSEFSRUQnOiAnY2xhbmcgLWJ1bmRsZSAtYXJjaCBwcGMgLWFyY2ggaTM4NiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgLWcnLAorICAgICAgICB9CisgICAgICAgIHNlbGYuYWRkX2V4cGVjdGVkX3NhdmVkX2luaXRpYWxfdmFsdWVzKGNvbmZpZ192YXJzLCBleHBlY3RlZF92YXJzKQorCisgICAgICAgIHN1ZmZpeCA9ICgnOicgKyBzZWxmLmVudlsnUEFUSCddKSBpZiBzZWxmLmVudlsnUEFUSCddIGVsc2UgJycKKyAgICAgICAgc2VsZi5lbnZbJ1BBVEgnXSA9IG9zLnBhdGguYWJzcGF0aChzZWxmLnRlbXBfcGF0aF9kaXIpICsgc3VmZml4CisgICAgICAgIGZvciBjX25hbWUsIGNfb3V0cHV0IGluIGNvbXBpbGVyczoKKyAgICAgICAgICAgIHRlc3QudGVzdF9zdXBwb3J0LnVubGluayhjX25hbWUpCisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAodGVzdC50ZXN0X3N1cHBvcnQudW5saW5rLCBjX25hbWUpCisgICAgICAgICAgICB3aXRoIG9wZW4oY19uYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiIyEvYmluL3NoXG4vYmluL2VjaG8gIiArIGNfb3V0cHV0KQorICAgICAgICAgICAgb3MuY2htb2QoY19uYW1lLCBzdGF0LlNfSVJXWFUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3N4X3N1cHBvcnQuX2ZpbmRfYXBwcm9wcmlhdGVfY29tcGlsZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfdmFycykpCisKKyAgICBkZWYgdGVzdF9fcmVtb3ZlX3VuaXZlcnNhbF9mbGFncyhzZWxmKToKKyAgICAgICAgY29uZmlnX3ZhcnMgPSB7CisgICAgICAgICdDRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1nIC1PMyAtYXJjaCBwcGMgLWFyY2ggaTM4NiAgJywKKyAgICAgICAgJ0xERkxBR1MnOiAnLWFyY2ggcHBjIC1hcmNoIGkzODYgICAtZycsCisgICAgICAgICdDUFBGTEFHUyc6ICctSS4gLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsnLAorICAgICAgICAnQkxEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgLWFyY2ggcHBjIC1hcmNoIGkzODYgLWcnLAorICAgICAgICAnTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAtYXJjaCBwcGMgLWFyY2ggaTM4NiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgLWcnLAorICAgICAgICB9CisgICAgICAgIGV4cGVjdGVkX3ZhcnMgPSB7CisgICAgICAgICdDRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1nIC1PMyAgICAnLAorICAgICAgICAnTERGTEFHUyc6ICcgICAgLWcnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuICAnLAorICAgICAgICAnQkxEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgICAtZycsCisgICAgICAgICdMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgICAgICAtZycsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hZGRfZXhwZWN0ZWRfc2F2ZWRfaW5pdGlhbF92YWx1ZXMoY29uZmlnX3ZhcnMsIGV4cGVjdGVkX3ZhcnMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF92YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5fcmVtb3ZlX3VuaXZlcnNhbF9mbGFncygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ192YXJzKSkKKworICAgIGRlZiB0ZXN0X19yZW1vdmVfdW5zdXBwb3J0ZWRfYXJjaHMoc2VsZik6CisgICAgICAgIGNvbmZpZ192YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcnLAorICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgLWFyY2ggcHBjIC1hcmNoIGkzODYgICcsCisgICAgICAgICdMREZMQUdTJzogJy1hcmNoIHBwYyAtYXJjaCBpMzg2ICAgLWcnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuIC1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrJywKKyAgICAgICAgJ0JMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgIC1hcmNoIHBwYyAtYXJjaCBpMzg2IC1nJywKKyAgICAgICAgJ0xEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgLWFyY2ggcHBjIC1hcmNoIGkzODYgJworICAgICAgICAgICAgICAgICAgICAgICAgJy1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrIC1nJywKKyAgICAgICAgfQorICAgICAgICBleHBlY3RlZF92YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcnLAorICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgIC1hcmNoIGkzODYgICcsCisgICAgICAgICdMREZMQUdTJzogJyAtYXJjaCBpMzg2ICAgLWcnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuIC1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrJywKKyAgICAgICAgJ0JMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgICAtYXJjaCBpMzg2IC1nJywKKyAgICAgICAgJ0xEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgIC1hcmNoIGkzODYgJworICAgICAgICAgICAgICAgICAgICAgICAgJy1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrIC1nJywKKyAgICAgICAgfQorICAgICAgICBzZWxmLmFkZF9leHBlY3RlZF9zYXZlZF9pbml0aWFsX3ZhbHVlcyhjb25maWdfdmFycywgZXhwZWN0ZWRfdmFycykKKworICAgICAgICBzdWZmaXggPSAoJzonICsgc2VsZi5lbnZbJ1BBVEgnXSkgaWYgc2VsZi5lbnZbJ1BBVEgnXSBlbHNlICcnCisgICAgICAgIHNlbGYuZW52WydQQVRIJ10gPSBvcy5wYXRoLmFic3BhdGgoc2VsZi50ZW1wX3BhdGhfZGlyKSArIHN1ZmZpeAorICAgICAgICBjX25hbWUgPSAnY2xhbmcnCisgICAgICAgIHRlc3QudGVzdF9zdXBwb3J0LnVubGluayhjX25hbWUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0LnRlc3Rfc3VwcG9ydC51bmxpbmssIGNfbmFtZSkKKyAgICAgICAgIyBleGl0IHN0YXR1cyAyNTUgbWVhbnMgbm8gUFBDIHN1cHBvcnQgaW4gdGhpcyBjb21waWxlciBjaGFpbgorICAgICAgICB3aXRoIG9wZW4oY19uYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCIjIS9iaW4vc2hcbmV4aXQgMjU1IikKKyAgICAgICAgb3MuY2htb2QoY19uYW1lLCBzdGF0LlNfSVJXWFUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3N4X3N1cHBvcnQuX3JlbW92ZV91bnN1cHBvcnRlZF9hcmNocygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ192YXJzKSkKKworICAgIGRlZiB0ZXN0X19vdmVycmlkZV9hbGxfYXJjaHMoc2VsZik6CisgICAgICAgIHNlbGYuZW52WydBUkNIRkxBR1MnXSA9ICctYXJjaCB4ODZfNjQnCisgICAgICAgIGNvbmZpZ192YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcnLAorICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgLWFyY2ggcHBjIC1hcmNoIGkzODYgICcsCisgICAgICAgICdMREZMQUdTJzogJy1hcmNoIHBwYyAtYXJjaCBpMzg2ICAgLWcnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuIC1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrJywKKyAgICAgICAgJ0JMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgIC1hcmNoIHBwYyAtYXJjaCBpMzg2IC1nJywKKyAgICAgICAgJ0xEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAtYXJjaCBwcGMgLWFyY2ggaTM4NiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgLWcnLAorICAgICAgICB9CisgICAgICAgIGV4cGVjdGVkX3ZhcnMgPSB7CisgICAgICAgICdDQyc6ICdjbGFuZycsCisgICAgICAgICdDRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1nIC1PMyAgICAgLWFyY2ggeDg2XzY0JywKKyAgICAgICAgJ0xERkxBR1MnOiAnICAgIC1nIC1hcmNoIHg4Nl82NCcsCisgICAgICAgICdDUFBGTEFHUyc6ICctSS4gLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsnLAorICAgICAgICAnQkxEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgICAtZyAtYXJjaCB4ODZfNjQnLAorICAgICAgICAnTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAgLWlzeXNyb290ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICcvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrIC1nIC1hcmNoIHg4Nl82NCcsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hZGRfZXhwZWN0ZWRfc2F2ZWRfaW5pdGlhbF92YWx1ZXMoY29uZmlnX3ZhcnMsIGV4cGVjdGVkX3ZhcnMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF92YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5fb3ZlcnJpZGVfYWxsX2FyY2hzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX3ZhcnMpKQorCisgICAgZGVmIHRlc3RfX2NoZWNrX2Zvcl91bmF2YWlsYWJsZV9zZGsoc2VsZik6CisgICAgICAgIGNvbmZpZ192YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcnLAorICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgLWFyY2ggcHBjIC1hcmNoIGkzODYgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICctaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjEuc2RrJywKKyAgICAgICAgJ0xERkxBR1MnOiAnLWFyY2ggcHBjIC1hcmNoIGkzODYgICAtZycsCisgICAgICAgICdDUFBGTEFHUyc6ICctSS4gLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC4xLnNkaycsCisgICAgICAgICdCTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAtYXJjaCBwcGMgLWFyY2ggaTM4NiAtZycsCisgICAgICAgICdMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICctaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjEuc2RrIC1nJywKKyAgICAgICAgfQorICAgICAgICBleHBlY3RlZF92YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcnLAorICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgLWFyY2ggcHBjIC1hcmNoIGkzODYgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICcgJywKKyAgICAgICAgJ0xERkxBR1MnOiAnLWFyY2ggcHBjIC1hcmNoIGkzODYgICAtZycsCisgICAgICAgICdDUFBGTEFHUyc6ICctSS4gICcsCisgICAgICAgICdCTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAtYXJjaCBwcGMgLWFyY2ggaTM4NiAtZycsCisgICAgICAgICdMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICcgLWcnLAorICAgICAgICB9CisgICAgICAgIHNlbGYuYWRkX2V4cGVjdGVkX3NhdmVkX2luaXRpYWxfdmFsdWVzKGNvbmZpZ192YXJzLCBleHBlY3RlZF92YXJzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3N4X3N1cHBvcnQuX2NoZWNrX2Zvcl91bmF2YWlsYWJsZV9zZGsoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfdmFycykpCisKKyAgICBkZWYgdGVzdF9nZXRfcGxhdGZvcm1fb3N4KHNlbGYpOgorICAgICAgICAjIE5vdGUsIGdldF9wbGF0Zm9ybV9vc3ggaXMgY3VycmVudGx5IHRlc3RlZCBtb3JlIGV4dGVuc2l2ZWx5CisgICAgICAgICMgaW5kaXJlY3RseSBieSB0ZXN0X3N5c2NvbmZpZyBhbmQgdGVzdF9kaXN0dXRpbHMKKyAgICAgICAgY29uZmlnX3ZhcnMgPSB7CisgICAgICAgICdDRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1nIC1PMyAtYXJjaCBwcGMgLWFyY2ggaTM4NiAgJworICAgICAgICAgICAgICAgICAgICAgICAgJy1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuMS5zZGsnLAorICAgICAgICAnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJzogJzEwLjYnLAorICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IF9vc3hfc3VwcG9ydC5nZXRfcGxhdGZvcm1fb3N4KGNvbmZpZ192YXJzLCAnICcsICcgJywgJyAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgnbWFjb3N4JywgJzEwLjYnLCAnZmF0JyksIHJlc3VsdCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RfT1NYU3VwcG9ydCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2MzE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2MzE0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJjLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOGMzYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hYmMucHkKQEAgLTAsMCArMSwyMzMgQEAKKyMgQ29weXJpZ2h0IDIwMDcgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiVW5pdCB0ZXN0cyBmb3IgYWJjLnB5LiIiIgorCitpbXBvcnQgdW5pdHRlc3QsIHdlYWtyZWYKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2ltcG9ydCBhYmMKK2Zyb20gaW5zcGVjdCBpbXBvcnQgaXNhYnN0cmFjdAorCisKK2NsYXNzIFRlc3RBQkModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYWJzdHJhY3RtZXRob2RfYmFzaWNzKHNlbGYpOgorICAgICAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgICAgIGRlZiBmb28oc2VsZik6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvby5fX2lzYWJzdHJhY3RtZXRob2RfXykKKyAgICAgICAgZGVmIGJhcihzZWxmKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYmFyLCAiX19pc2Fic3RyYWN0bWV0aG9kX18iKSkKKworICAgIGRlZiB0ZXN0X2Fic3RyYWN0cHJvcGVydHlfYmFzaWNzKHNlbGYpOgorICAgICAgICBAYWJjLmFic3RyYWN0cHJvcGVydHkKKyAgICAgICAgZGVmIGZvbyhzZWxmKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9vLl9faXNhYnN0cmFjdG1ldGhvZF9fKQorICAgICAgICBkZWYgYmFyKHNlbGYpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihiYXIsICJfX2lzYWJzdHJhY3RtZXRob2RfXyIpKQorCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKKyAgICAgICAgICAgIEBhYmMuYWJzdHJhY3Rwcm9wZXJ0eQorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKTogcmV0dXJuIDMKKyAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKTogcmV0dXJuIHN1cGVyKEQsIHNlbGYpLmZvbworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQoKS5mb28sIDMpCisKKyAgICBkZWYgdGVzdF9hYnN0cmFjdG1ldGhvZF9pbnRlZ3JhdGlvbihzZWxmKToKKyAgICAgICAgZm9yIGFic3RyYWN0dGhpbmcgaW4gW2FiYy5hYnN0cmFjdG1ldGhvZCwgYWJjLmFic3RyYWN0cHJvcGVydHldOgorICAgICAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKKyAgICAgICAgICAgICAgICBAYWJzdHJhY3R0aGluZworICAgICAgICAgICAgICAgIGRlZiBmb28oc2VsZik6IHBhc3MgICMgYWJzdHJhY3QKKyAgICAgICAgICAgICAgICBkZWYgYmFyKHNlbGYpOiBwYXNzICAjIGNvbmNyZXRlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuX19hYnN0cmFjdG1ldGhvZHNfXywgc2V0KFsiZm9vIl0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBDKSAgIyBiZWNhdXNlIGZvbyBpcyBhYnN0cmFjdAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzYWJzdHJhY3QoQykpCisgICAgICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgICAgIGRlZiBiYXIoc2VsZik6IHBhc3MgICMgY29uY3JldGUgb3ZlcnJpZGUgb2YgY29uY3JldGUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRC5fX2Fic3RyYWN0bWV0aG9kc19fLCBzZXQoWyJmb28iXSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEQpICAjIGJlY2F1c2UgZm9vIGlzIHN0aWxsIGFic3RyYWN0CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNhYnN0cmFjdChEKSkKKyAgICAgICAgICAgIGNsYXNzIEUoRCk6CisgICAgICAgICAgICAgICAgZGVmIGZvbyhzZWxmKTogcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChFLl9fYWJzdHJhY3RtZXRob2RzX18sIHNldCgpKQorICAgICAgICAgICAgRSgpICAjIG5vdyBmb28gaXMgY29uY3JldGUsIHRvbworICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2Fic3RyYWN0KEUpKQorICAgICAgICAgICAgY2xhc3MgRihFKToKKyAgICAgICAgICAgICAgICBAYWJzdHJhY3R0aGluZworICAgICAgICAgICAgICAgIGRlZiBiYXIoc2VsZik6IHBhc3MgICMgYWJzdHJhY3Qgb3ZlcnJpZGUgb2YgY29uY3JldGUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRi5fX2Fic3RyYWN0bWV0aG9kc19fLCBzZXQoWyJiYXIiXSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEYpICAjIGJlY2F1c2UgYmFyIGlzIGFic3RyYWN0IG5vdworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzYWJzdHJhY3QoRikpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc19vbGRzdHlsZV9jbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBhYmMuQUJDTWV0YQorICAgICAgICBjbGFzcyBPbGRzdHlsZUNsYXNzOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoT2xkc3R5bGVDbGFzcywgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhBLCBPbGRzdHlsZUNsYXNzKSkKKworICAgIGRlZiB0ZXN0X2lzaW5zdGFuY2VfY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKKyAgICAgICAgY2xhc3MgT2xkc3R5bGVDbGFzczoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKE9sZHN0eWxlQ2xhc3MsIEEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShPbGRzdHlsZUNsYXNzLCB0eXBlKE9sZHN0eWxlQ2xhc3MpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKEEsIE9sZHN0eWxlQ2xhc3MpKQorICAgICAgICAjIFRoaXMgcmFpc2VzIGEgcmVjdXJzaW9uIGRlcHRoIGVycm9yLCBidXQgaXMgbG93LXByaW9yaXR5OgorICAgICAgICAjIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKEEsIGFiYy5BQkNNZXRhKSkKKworICAgIGRlZiB0ZXN0X3JlZ2lzdHJhdGlvbl9iYXNpY3Moc2VsZik6CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKKyAgICAgICAgY2xhc3MgQihvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBiID0gQigpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhCLCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEIsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoYiwgQSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKGIsIChBLCkpCisgICAgICAgIEEucmVnaXN0ZXIoQikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQiwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEIsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYiwgQSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGIsIChBLCkpCisgICAgICAgIGNsYXNzIEMoQik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQywgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYywgQSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGMsIChBLCkpCisKKyAgICBkZWYgdGVzdF9pc2luc3RhbmNlX2ludmFsaWRhdGlvbihzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBhYmMuQUJDTWV0YQorICAgICAgICBjbGFzcyBCKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGIgPSBCKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKGIsIEEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UoYiwgKEEsKSkpCisgICAgICAgIEEucmVnaXN0ZXIoQikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYiwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGIsIChBLCkpKQorCisgICAgZGVmIHRlc3RfcmVnaXN0cmF0aW9uX2J1aWx0aW5zKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisgICAgICAgIEEucmVnaXN0ZXIoaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoNDIsIEEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSg0MiwgKEEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoaW50LCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoaW50LCAoQSwpKSkKKyAgICAgICAgY2xhc3MgQihBKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgQi5yZWdpc3RlcihiYXNlc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoIiIsIEEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSgiIiwgKEEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3RyLCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3RyLCAoQSwpKSkKKworICAgIGRlZiB0ZXN0X3JlZ2lzdHJhdGlvbl9lZGdlX2Nhc2VzKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisgICAgICAgIEEucmVnaXN0ZXIoQSkgICMgc2hvdWxkIHBhc3Mgc2lsZW50bHkKKyAgICAgICAgY2xhc3MgQTEoQSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgQTEucmVnaXN0ZXIsIEEpICAjIGN5Y2xlcyBub3QgYWxsb3dlZAorICAgICAgICBjbGFzcyBCKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIEExLnJlZ2lzdGVyKEIpICAjIG9rCisgICAgICAgIEExLnJlZ2lzdGVyKEIpICAjIHNob3VsZCBwYXNzIHNpbGVudGx5CisgICAgICAgIGNsYXNzIEMoQSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIEEucmVnaXN0ZXIoQykgICMgc2hvdWxkIHBhc3Mgc2lsZW50bHkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBDLnJlZ2lzdGVyLCBBKSAgIyBjeWNsZXMgbm90IGFsbG93ZWQKKyAgICAgICAgQy5yZWdpc3RlcihCKSAgIyBvaworCisgICAgZGVmIHRlc3RfcmVnaXN0ZXJfbm9uX2NsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVHlwZUVycm9yLCAiQ2FuIG9ubHkgcmVnaXN0ZXIgY2xhc3NlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEucmVnaXN0ZXIsIDQpCisKKyAgICBkZWYgdGVzdF9yZWdpc3RyYXRpb25fdHJhbnNpdGl2ZW5lc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQSwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEEsIChBLCkpKQorICAgICAgICBjbGFzcyBCOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhBLCBCKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEEsIChCLCkpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQiwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhCLCAoQSwpKSkKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBhYmMuQUJDTWV0YQorICAgICAgICBBLnJlZ2lzdGVyKEIpCisgICAgICAgIGNsYXNzIEIxKEIpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhCMSwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEIxLCAoQSwpKSkKKyAgICAgICAgY2xhc3MgQzEoQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIEIxLnJlZ2lzdGVyKEMxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQywgQikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDLCAoQiwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEMsIEIxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEMsIChCMSwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQzEsIEEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDMSwgKEEsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMxLCBCKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQzEsIChCLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDMSwgQjEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDMSwgKEIxLCkpKQorICAgICAgICBDMS5yZWdpc3RlcihpbnQpCisgICAgICAgIGNsYXNzIE15SW50KGludCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKE15SW50LCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoTXlJbnQsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoNDIsIEEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSg0MiwgKEEsKSkKKworICAgIGRlZiB0ZXN0X2FsbF9uZXdfbWV0aG9kc19hcmVfY2FsbGVkKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisgICAgICAgIGNsYXNzIEIob2JqZWN0KToKKyAgICAgICAgICAgIGNvdW50ZXIgPSAwCisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMpOgorICAgICAgICAgICAgICAgIEIuY291bnRlciArPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKEIsIGNscykuX19uZXdfXyhjbHMpCisgICAgICAgIGNsYXNzIEMoQSwgQik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQi5jb3VudGVyLCAwKQorICAgICAgICBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChCLmNvdW50ZXIsIDEpCisKKyAgICBkZWYgdGVzdF9jYWNoZV9sZWFrKHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAjMjUyMS4KKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisgICAgICAgICAgICBAYWJjLmFic3RyYWN0bWV0aG9kCisgICAgICAgICAgICBkZWYgZihzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEMoQSk6CisgICAgICAgICAgICBkZWYgZihzZWxmKToKKyAgICAgICAgICAgICAgICBBLmYoc2VsZikKKyAgICAgICAgciA9IHdlYWtyZWYucmVmKEMpCisgICAgICAgICMgVHJpZ2dlciBjYWNoZS4KKyAgICAgICAgQygpLmYoKQorICAgICAgICBkZWwgQworICAgICAgICB0ZXN0X3N1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocigpLCBOb25lKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0QUJDKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hYmMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDIwNzcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hYmMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDIwNzcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hYnN0cmFjdF9udW1iZXJzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJzdHJhY3RfbnVtYmVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjVmOGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJzdHJhY3RfbnVtYmVycy5weQpAQCAtMCwwICsxLDUyIEBACisiIiJVbml0IHRlc3RzIGZvciBudW1iZXJzLnB5LiIiIgorCitpbXBvcnQgbWF0aAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIG51bWJlcnMgaW1wb3J0IENvbXBsZXgsIFJlYWwsIFJhdGlvbmFsLCBJbnRlZ3JhbAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgVGVzdE51bWJlcnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2ludChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoaW50LCBJbnRlZ3JhbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGludCwgQ29tcGxleCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg3LCBpbnQoNykucmVhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBpbnQoNykuaW1hZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg3LCBpbnQoNykuY29uanVnYXRlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNywgaW50KDcpLm51bWVyYXRvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBpbnQoNykuZGVub21pbmF0b3IpCisKKyAgICBkZWYgdGVzdF9sb25nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhsb25nLCBJbnRlZ3JhbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGxvbmcsIENvbXBsZXgpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNywgbG9uZyg3KS5yZWFsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxvbmcoNykuaW1hZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg3LCBsb25nKDcpLmNvbmp1Z2F0ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDcsIGxvbmcoNykubnVtZXJhdG9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxvbmcoNykuZGVub21pbmF0b3IpCisKKyAgICBkZWYgdGVzdF9mbG9hdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGZsb2F0LCBSYXRpb25hbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGZsb2F0LCBSZWFsKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDcuMywgZmxvYXQoNy4zKS5yZWFsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGZsb2F0KDcuMykuaW1hZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg3LjMsIGZsb2F0KDcuMykuY29uanVnYXRlKCkpCisKKyAgICBkZWYgdGVzdF9jb21wbGV4KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoY29tcGxleCwgUmVhbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGNvbXBsZXgsIENvbXBsZXgpKQorCisgICAgICAgIGMxLCBjMiA9IGNvbXBsZXgoMywgMiksIGNvbXBsZXgoNCwxKQorICAgICAgICAjIFhYWDogVGhpcyBpcyBub3QgaWRlYWwsIGJ1dCBzZWUgdGhlIGNvbW1lbnQgaW4gbWF0aF90cnVuYygpLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgbWF0aC50cnVuYywgYzEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmxvYXQsIGMxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGludCwgYzEpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3ROdW1iZXJzKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hYnN0cmFjdF9udW1iZXJzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Fic3RyYWN0X251bWJlcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YWFiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hYnN0cmFjdF9udW1iZXJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hYnN0cmFjdF9udW1iZXJzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Fic3RyYWN0X251bWJlcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YWFiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hYnN0cmFjdF9udW1iZXJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hZXBhY2sucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hZXBhY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlYTI1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FlcGFjay5weQpAQCAtMCwwICsxLDkwIEBACisjIENvcHlyaWdodCAoQykgMjAwMyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworYWV0eXBlcyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdhZXR5cGVzJykKK2FlcGFjayA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdhZXBhY2snKQorCitjbGFzcyBUZXN0QWVwYWNrKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBPQkpFQ1RTID0gWworICAgICAgICBhZXR5cGVzLkVudW0oJ2VudW0nKSwKKyAgICAgICAgYWV0eXBlcy5UeXBlKCd0eXBlJyksCisgICAgICAgIGFldHlwZXMuS2V5d29yZCgna3dyZCcpLAorICAgICAgICBhZXR5cGVzLlJhbmdlKDEsIDEwKSwKKyAgICAgICAgYWV0eXBlcy5Db21wYXJpc29uKDEsICc8ICAgJywgMTApLAorICAgICAgICBhZXR5cGVzLkxvZ2ljYWwoJ25vdCAnLCAxKSwKKyAgICAgICAgYWV0eXBlcy5JbnRsVGV4dCgwLCAwLCAnaW50ZXJuYXRpb25hbCB0ZXh0JyksCisgICAgICAgIGFldHlwZXMuSW50bFdyaXRpbmdDb2RlKDAsMCksCisgICAgICAgIGFldHlwZXMuUURQb2ludCg1MCwxMDApLAorICAgICAgICBhZXR5cGVzLlFEUmVjdGFuZ2xlKDUwLDEwMCwxNTAsMjAwKSwKKyAgICAgICAgYWV0eXBlcy5SR0JDb2xvcigweDcwMDAsIDB4NjAwMCwgMHg1MDAwKSwKKyAgICAgICAgYWV0eXBlcy5Vbmtub3duKCd4eHh4JywgJ3Vua25vd24gdHlwZSBkYXRhJyksCisgICAgICAgIGFldHlwZXMuQ2hhcmFjdGVyKDEpLAorICAgICAgICBhZXR5cGVzLkNoYXJhY3RlcigyLCBhZXR5cGVzLkxpbmUoMikpLAorICAgIF0KKworICAgIGRlZiB0ZXN0X3JvdW5kdHJpcF9zdHJpbmcoc2VsZik6CisgICAgICAgIG8gPSAnYSBzdHJpbmcnCisgICAgICAgIHBhY2tlZCA9IGFlcGFjay5wYWNrKG8pCisgICAgICAgIHVucGFja2VkID0gYWVwYWNrLnVucGFjayhwYWNrZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobywgdW5wYWNrZWQpCisKKyAgICBkZWYgdGVzdF9yb3VuZHRyaXBfaW50KHNlbGYpOgorICAgICAgICBvID0gMTIKKyAgICAgICAgcGFja2VkID0gYWVwYWNrLnBhY2sobykKKyAgICAgICAgdW5wYWNrZWQgPSBhZXBhY2sudW5wYWNrKHBhY2tlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLCB1bnBhY2tlZCkKKworICAgIGRlZiB0ZXN0X3JvdW5kdHJpcF9mbG9hdChzZWxmKToKKyAgICAgICAgbyA9IDEyLjEKKyAgICAgICAgcGFja2VkID0gYWVwYWNrLnBhY2sobykKKyAgICAgICAgdW5wYWNrZWQgPSBhZXBhY2sudW5wYWNrKHBhY2tlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLCB1bnBhY2tlZCkKKworICAgIGRlZiB0ZXN0X3JvdW5kdHJpcF9Ob25lKHNlbGYpOgorICAgICAgICBvID0gTm9uZQorICAgICAgICBwYWNrZWQgPSBhZXBhY2sucGFjayhvKQorICAgICAgICB1bnBhY2tlZCA9IGFlcGFjay51bnBhY2socGFja2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8sIHVucGFja2VkKQorCisgICAgZGVmIHRlc3Rfcm91bmR0cmlwX2Flb2JqZWN0cyhzZWxmKToKKyAgICAgICAgZm9yIG8gaW4gc2VsZi5PQkpFQ1RTOgorICAgICAgICAgICAgcGFja2VkID0gYWVwYWNrLnBhY2sobykKKyAgICAgICAgICAgIHVucGFja2VkID0gYWVwYWNrLnVucGFjayhwYWNrZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIobyksIHJlcHIodW5wYWNrZWQpKQorCisgICAgZGVmIHRlc3Rfcm91bmR0cmlwX0ZTU3BlYyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IENhcmJvbi5GaWxlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKENhcmJvbi5GaWxlLCAiRlNTcGVjIik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbyA9IENhcmJvbi5GaWxlLkZTU3BlYyhvcy5jdXJkaXIpCisgICAgICAgIHBhY2tlZCA9IGFlcGFjay5wYWNrKG8pCisgICAgICAgIHVucGFja2VkID0gYWVwYWNrLnVucGFjayhwYWNrZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5hc19wYXRobmFtZSgpLCB1bnBhY2tlZC5hc19wYXRobmFtZSgpKQorCisgICAgZGVmIHRlc3Rfcm91bmR0cmlwX0FsaWFzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgQ2FyYm9uLkZpbGUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKENhcmJvbi5GaWxlLCAiRlNTcGVjIik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbyA9IENhcmJvbi5GaWxlLkZTU3BlYyhvcy5jdXJkaXIpLk5ld0FsaWFzTWluaW1hbCgpCisgICAgICAgIHBhY2tlZCA9IGFlcGFjay5wYWNrKG8pCisgICAgICAgIHVucGFja2VkID0gYWVwYWNrLnVucGFjayhwYWNrZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5GU1Jlc29sdmVBbGlhcyhOb25lKVswXS5hc19wYXRobmFtZSgpLAorICAgICAgICAgICAgdW5wYWNrZWQuRlNSZXNvbHZlQWxpYXMoTm9uZSlbMF0uYXNfcGF0aG5hbWUoKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0QWVwYWNrKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FlcGFjay5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hZXBhY2sucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODI4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hZXBhY2sucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FlcGFjay5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hZXBhY2sucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODI4M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hZXBhY2sucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FpZmMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9haWZjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYjNkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9haWZjLnB5CkBAIC0wLDAgKzEsMTYwIEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBmaW5kZmlsZSwgcnVuX3VuaXR0ZXN0LCBURVNURk4KK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgaW8KKworaW1wb3J0IGFpZmMKKworCitjbGFzcyBBSUZDVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZiA9IHNlbGYuZm91dCA9IE5vbmUKKyAgICAgICAgc2VsZi5zbmRmaWxlcGF0aCA9IGZpbmRmaWxlKCdTaW5lLTEwMDBIei0zMDBtcy5haWYnKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLmZvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5mb3V0LmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCAoYWlmYy5FcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9za2lwdW5rbm93bihzZWxmKToKKyAgICAgICAgI0lzc3VlIDIyNDUKKyAgICAgICAgI1RoaXMgZmlsZSBjb250YWlucyBjaHVuayB0eXBlcyBhaWZjIGRvZXNuJ3QgcmVjb2duaXplLgorICAgICAgICBzZWxmLmYgPSBhaWZjLm9wZW4oc2VsZi5zbmRmaWxlcGF0aCkKKworICAgIGRlZiB0ZXN0X3BhcmFtcyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYuZiA9IGFpZmMub3BlbihzZWxmLnNuZGZpbGVwYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0bmNoYW5uZWxzKCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRzYW1wd2lkdGgoKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldGZyYW1lcmF0ZSgpLCA0ODAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldG5mcmFtZXMoKSwgMTQ0MDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRjb21wdHlwZSgpLCAnTk9ORScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRjb21wbmFtZSgpLCAnbm90IGNvbXByZXNzZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0cGFyYW1zKCksICgyLCAyLCA0ODAwMCwgMTQ0MDAsICdOT05FJywgJ25vdCBjb21wcmVzc2VkJykpCisKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5mID0gYWlmYy5vcGVuKHNlbGYuc25kZmlsZXBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKDIpLCAnXHgwMFx4MDBceDAwXHgwMFx4MGJceGQ0XHgwYlx4ZDQnKQorICAgICAgICBmLnJld2luZCgpCisgICAgICAgIHBvczAgPSBmLnRlbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvczAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKDIpLCAnXHgwMFx4MDBceDAwXHgwMFx4MGJceGQ0XHgwYlx4ZDQnKQorICAgICAgICBwb3MyID0gZi50ZWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3MyLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGZyYW1lcygyKSwgJ1x4MTd0XHgxN3QiXHhhZCJceGFkJykKKyAgICAgICAgZi5zZXRwb3MocG9zMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRmcmFtZXMoMiksICdceDE3dFx4MTd0Ilx4YWQiXHhhZCcpCisgICAgICAgIGYuc2V0cG9zKHBvczApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKDIpLCAnXHgwMFx4MDBceDAwXHgwMFx4MGJceGQ0XHgwYlx4ZDQnKQorCisgICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLmYgPSBhaWZjLm9wZW4oc2VsZi5zbmRmaWxlcGF0aCkKKyAgICAgICAgZm91dCA9IHNlbGYuZm91dCA9IGFpZmMub3BlbihURVNURk4sICd3YicpCisgICAgICAgIGZvdXQuYWlmYygpCisgICAgICAgIGZvdXQuc2V0cGFyYW1zKGYuZ2V0cGFyYW1zKCkpCisgICAgICAgIGZvciBmcmFtZSBpbiByYW5nZShmLmdldG5mcmFtZXMoKSk6CisgICAgICAgICAgICBmb3V0LndyaXRlZnJhbWVzKGYucmVhZGZyYW1lcygxKSkKKyAgICAgICAgZm91dC5jbG9zZSgpCisgICAgICAgIGZvdXQgPSBzZWxmLmZvdXQgPSBhaWZjLm9wZW4oVEVTVEZOLCAncmInKQorICAgICAgICBmLnJld2luZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRwYXJhbXMoKSwgZm91dC5nZXRwYXJhbXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRmcmFtZXMoNSksIGZvdXQucmVhZGZyYW1lcyg1KSkKKworICAgIGRlZiB0ZXN0X2NvbXByZXNzKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5mID0gYWlmYy5vcGVuKHNlbGYuc25kZmlsZXBhdGgpCisgICAgICAgIGZvdXQgPSBzZWxmLmZvdXQgPSBhaWZjLm9wZW4oVEVTVEZOLCAnd2InKQorICAgICAgICBmb3V0LmFpZmMoKQorICAgICAgICBmb3V0LnNldG5jaGFubmVscyhmLmdldG5jaGFubmVscygpKQorICAgICAgICBmb3V0LnNldHNhbXB3aWR0aChmLmdldHNhbXB3aWR0aCgpKQorICAgICAgICBmb3V0LnNldGZyYW1lcmF0ZShmLmdldGZyYW1lcmF0ZSgpKQorICAgICAgICBmb3V0LnNldGNvbXB0eXBlKCdVTEFXJywgJ2ZvbycpCisgICAgICAgIGZvciBmcmFtZSBpbiByYW5nZShmLmdldG5mcmFtZXMoKSk6CisgICAgICAgICAgICBmb3V0LndyaXRlZnJhbWVzKGYucmVhZGZyYW1lcygxKSkKKyAgICAgICAgZm91dC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcygKKyAgICAgICAgICAgIG9zLnN0YXQoVEVTVEZOKS5zdF9zaXplLAorICAgICAgICAgICAgb3Muc3RhdChzZWxmLnNuZGZpbGVwYXRoKS5zdF9zaXplKjAuNzUsCisgICAgICAgICAgICApCisgICAgICAgIGZvdXQgPSBzZWxmLmZvdXQgPSBhaWZjLm9wZW4oVEVTVEZOLCAncmInKQorICAgICAgICBmLnJld2luZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRwYXJhbXMoKVswOjNdLCBmb3V0LmdldHBhcmFtcygpWzA6M10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm91dC5nZXRjb21wdHlwZSgpLCAnVUxBVycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm91dC5nZXRjb21wbmFtZSgpLCAnZm9vJykKKyAgICAgICAgIyBYWFg6IHRoaXMgdGVzdCBmYWlscywgbm90IHN1cmUgaWYgaXQgc2hvdWxkIHN1Y2NlZWQgb3Igbm90CisgICAgICAgICMgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRmcmFtZXMoNSksIGZvdXQucmVhZGZyYW1lcyg1KSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlKHNlbGYpOgorICAgICAgICBjbGFzcyBXcmFwZmlsZShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUpOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZSA9IG9wZW4oZmlsZSwgJ3JiJykKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCisgICAgICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKTogcmV0dXJuIGdldGF0dHIoc2VsZi5maWxlLCBhdHRyKQorICAgICAgICB0ZXN0ZmlsZSA9IFdyYXBmaWxlKHNlbGYuc25kZmlsZXBhdGgpCisgICAgICAgIGYgPSBzZWxmLmYgPSBhaWZjLm9wZW4odGVzdGZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdGZpbGUuY2xvc2VkLCBGYWxzZSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdGZpbGUuY2xvc2VkLCBUcnVlKQorICAgICAgICB0ZXN0ZmlsZSA9IG9wZW4oVEVTVEZOLCAnd2InKQorICAgICAgICBmb3V0ID0gYWlmYy5vcGVuKHRlc3RmaWxlLCAnd2InKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHRlc3RmaWxlLmNsb3NlZCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhhaWZjLkVycm9yKToKKyAgICAgICAgICAgIGZvdXQuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGVzdGZpbGUuY2xvc2VkKQorICAgICAgICBmb3V0LmNsb3NlKCkgIyBkbyBub3RoaW5nCisKKworY2xhc3MgQUlGQ0xvd0xldmVsVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9yZWFkX3dyaXR0ZW4oc2VsZik6CisgICAgICAgIGRlZiByZWFkX3dyaXR0ZW4oc2VsZiwgd2hhdCk6CisgICAgICAgICAgICBmID0gaW8uQnl0ZXNJTygpCisgICAgICAgICAgICBnZXRhdHRyKGFpZmMsICdfd3JpdGVfJyArIHdoYXQpKGYsIHgpCisgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKGFpZmMsICdfcmVhZF8nICsgd2hhdCkoZikKKyAgICAgICAgZm9yIHggaW4gKC0xLCAwLCAwLjEsIDEpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkX3dyaXR0ZW4oeCwgJ2Zsb2F0JyksIHgpCisgICAgICAgIGZvciB4IGluIChmbG9hdCgnTmFOJyksIGZsb2F0KCdJbmYnKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRfd3JpdHRlbih4LCAnZmxvYXQnKSwgYWlmYy5fSFVHRV9WQUwpCisgICAgICAgIGZvciB4IGluIChiJycsIGInZm9vJywgYidhJyAqIDI1NSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRfd3JpdHRlbih4LCAnc3RyaW5nJyksIHgpCisgICAgICAgIGZvciB4IGluICgtMHg3RkZGRkZGRiwgLTEsIDAsIDEsIDB4N0ZGRkZGRkYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkX3dyaXR0ZW4oeCwgJ2xvbmcnKSwgeCkKKyAgICAgICAgZm9yIHggaW4gKDAsIDEsIDB4RkZGRkZGRkYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkX3dyaXR0ZW4oeCwgJ3Vsb25nJyksIHgpCisgICAgICAgIGZvciB4IGluICgtMHg3RkZGLCAtMSwgMCwgMSwgMHg3RkZGKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZF93cml0dGVuKHgsICdzaG9ydCcpLCB4KQorICAgICAgICBmb3IgeCBpbiAoMCwgMSwgMHhGRkZGKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZF93cml0dGVuKHgsICd1c2hvcnQnKSwgeCkKKworICAgIGRlZiB0ZXN0X3JlYWRfcmFpc2VzKHNlbGYpOgorICAgICAgICBmID0gaW8uQnl0ZXNJTyhiJ1x4MDAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgYWlmYy5fcmVhZF91bG9uZywgZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGFpZmMuX3JlYWRfbG9uZywgZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGFpZmMuX3JlYWRfdXNob3J0LCBmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgYWlmYy5fcmVhZF9zaG9ydCwgZikKKworICAgIGRlZiB0ZXN0X3dyaXRlX2xvbmdfc3RyaW5nX3JhaXNlcyhzZWxmKToKKyAgICAgICAgZiA9IGlvLkJ5dGVzSU8oKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgYWlmYy5fd3JpdGVfc3RyaW5nKGYsIGIndG9vIGxvbmcnICogMjU1KQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoQUlGQ1Rlc3QpCisgICAgcnVuX3VuaXR0ZXN0KEFJRkNMb3dMZXZlbFRlc3QpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FpZmMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWlmYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjYmZjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FpZmMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FpZmMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWlmYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjYmZjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FpZmMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjg4NTc2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FsLnB5CkBAIC0wLDAgKzEsMjUgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIldoaW1weSB0ZXN0IHNjcmlwdCBmb3IgdGhlIGFsIG1vZHVsZQorICAgUm9nZXIgRS4gTWFzc2UKKyIiIgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgaW1wb3J0X21vZHVsZQorYWwgPSBpbXBvcnRfbW9kdWxlKCdhbCcsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworYWxhdHRycyA9IFsnX19kb2NfXycsICdfX25hbWVfXycsICdnZXRkZWZhdWx0JywgJ2dldG1pbm1heCcsICdnZXRuYW1lJywgJ2dldHBhcmFtcycsCisgICAgICAgICAgICduZXdjb25maWcnLCAnb3BlbnBvcnQnLCAncXVlcnlwYXJhbXMnLCAnc2V0cGFyYW1zJ10KKworIyBUaGlzIGlzIGEgdmVyeSB1bm9idHJ1c2l2ZSB0ZXN0IGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBhbCBtb2R1bGUgYW5kIGFsbCBpdHMKKyMgYXR0cmlidXRlcy4gIE1vcmUgY29tcHJlaGVuc2l2ZSBleGFtcGxlcyBjYW4gYmUgZm91bmQgaW4gRGVtby9hbAorCitkZWYgdGVzdF9tYWluKCk6CisgICAgIyB0b3VjaCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgYWwgd2l0aG91dCBkb2luZyBhbnl0aGluZworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdUb3VjaGluZyBhbCBtb2R1bGUgYXR0cmlidXRlcy4uLicKKyAgICBmb3IgYXR0ciBpbiBhbGF0dHJzOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ3RvdWNoaW5nOiAnLCBhdHRyCisgICAgICAgIGdldGF0dHIoYWwsIGF0dHIpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNjhjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNjhjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYW55ZGJtLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYW55ZGJtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMWRkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hbnlkYm0ucHkKQEAgLTAsMCArMSw5NyBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiVGVzdCBzY3JpcHQgZm9yIHRoZSBhbnlkYm0gbW9kdWxlCisgICBiYXNlZCBvbiB0ZXN0ZHVtYmRibS5weQorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgZ2xvYgorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworX2ZuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorCisjIFNpbGVuY2UgUHkzayB3YXJuaW5nCithbnlkYm0gPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnYW55ZGJtJywgZGVwcmVjYXRlZD1UcnVlKQorCitkZWYgX2RlbGV0ZV9maWxlcygpOgorICAgICMgd2UgZG9uJ3Qga25vdyB0aGUgcHJlY2lzZSBuYW1lIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHVzZXMKKyAgICAjIHNvIHdlIHVzZSBnbG9iIHRvIGxvY2F0ZSBhbGwgbmFtZXMKKyAgICBmb3IgZiBpbiBnbG9iLmdsb2IoX2ZuYW1lICsgIioiKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKGYpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBBbnlEQk1UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgX2RpY3QgPSB7JzAnOiAnJywKKyAgICAgICAgICAgICAnYSc6ICdQeXRob246JywKKyAgICAgICAgICAgICAnYic6ICdQcm9ncmFtbWluZycsCisgICAgICAgICAgICAgJ2MnOiAndGhlJywKKyAgICAgICAgICAgICAnZCc6ICd3YXknLAorICAgICAgICAgICAgICdmJzogJ0d1aWRvJywKKyAgICAgICAgICAgICAnZyc6ICdpbnRlbmRlZCcKKyAgICAgICAgICAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5fX2luaXRfXyhzZWxmLCAqYXJncykKKworICAgIGRlZiB0ZXN0X2FueWRibV9jcmVhdGlvbihzZWxmKToKKyAgICAgICAgZiA9IGFueWRibS5vcGVuKF9mbmFtZSwgJ2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYua2V5cygpLCBbXSkKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9kaWN0OgorICAgICAgICAgICAgZltrZXldID0gc2VsZi5fZGljdFtrZXldCisgICAgICAgIHNlbGYucmVhZF9oZWxwZXIoZikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9hbnlkYm1fbW9kaWZpY2F0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmluaXRfZGIoKQorICAgICAgICBmID0gYW55ZGJtLm9wZW4oX2ZuYW1lLCAnYycpCisgICAgICAgIHNlbGYuX2RpY3RbJ2cnXSA9IGZbJ2cnXSA9ICJpbmRlbnRlZCIKKyAgICAgICAgc2VsZi5yZWFkX2hlbHBlcihmKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2FueWRibV9yZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmluaXRfZGIoKQorICAgICAgICBmID0gYW55ZGJtLm9wZW4oX2ZuYW1lLCAncicpCisgICAgICAgIHNlbGYucmVhZF9oZWxwZXIoZikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9hbnlkYm1fa2V5cyhzZWxmKToKKyAgICAgICAgc2VsZi5pbml0X2RiKCkKKyAgICAgICAgZiA9IGFueWRibS5vcGVuKF9mbmFtZSwgJ3InKQorICAgICAgICBrZXlzID0gc2VsZi5rZXlzX2hlbHBlcihmKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiByZWFkX2hlbHBlcihzZWxmLCBmKToKKyAgICAgICAga2V5cyA9IHNlbGYua2V5c19oZWxwZXIoZikKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9kaWN0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kaWN0W2tleV0sIGZba2V5XSkKKworICAgIGRlZiBpbml0X2RiKHNlbGYpOgorICAgICAgICBmID0gYW55ZGJtLm9wZW4oX2ZuYW1lLCAnbicpCisgICAgICAgIGZvciBrIGluIHNlbGYuX2RpY3Q6CisgICAgICAgICAgICBmW2tdID0gc2VsZi5fZGljdFtrXQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBrZXlzX2hlbHBlcihzZWxmLCBmKToKKyAgICAgICAga2V5cyA9IGYua2V5cygpCisgICAgICAgIGtleXMuc29ydCgpCisgICAgICAgIGRrZXlzID0gc2VsZi5fZGljdC5rZXlzKCkKKyAgICAgICAgZGtleXMuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5cywgZGtleXMpCisgICAgICAgIHJldHVybiBrZXlzCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIF9kZWxldGVfZmlsZXMoKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBfZGVsZXRlX2ZpbGVzKCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRyeToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChBbnlEQk1UZXN0Q2FzZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBfZGVsZXRlX2ZpbGVzKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYW55ZGJtLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FueWRibS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4OWM1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FueWRibS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYW55ZGJtLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FueWRibS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE4OWM1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FueWRibS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hcHBsZXNpbmdsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmVmZmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHkKQEAgLTAsMCArMSw3MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgc3RydWN0CisKK01hY09TID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ01hY09TJykKKyMgVGhlIGZvbGxvd2luZyBzaG91bGQgZXhpc3QgaWYgTWFjT1MgZG9lcy4KK2ltcG9ydCBhcHBsZXNpbmdsZQorCitBU19NQUdJQz0weDAwMDUxNjAwCitBU19WRVJTSU9OPTB4MDAwMjAwMDAKK2RhdGFmb3JrZGF0YSA9ICdoZWxsb1xyXDB3b3JsZFxuJworcmVzb3VyY2Vmb3JrZGF0YSA9ICdnb29kYnllXG5jcnVlbFwwd29ybGRccicKKworYXBwbGVzaW5nbGVkYXRhID0gc3RydWN0LnBhY2soIj5sbDE2c2giLCBBU19NQUdJQywgQVNfVkVSU0lPTiwgImZvbyIsIDIpICsgXAorICAgIHN0cnVjdC5wYWNrKCI+bGxsbGxsIiwgMSwgNTAsIGxlbihkYXRhZm9ya2RhdGEpLAorICAgICAgICAyLCA1MCtsZW4oZGF0YWZvcmtkYXRhKSwgbGVuKHJlc291cmNlZm9ya2RhdGEpKSArIFwKKyAgICBkYXRhZm9ya2RhdGEgKyBcCisgICAgcmVzb3VyY2Vmb3JrZGF0YQorVEVTVEZOMiA9IHRlc3Rfc3VwcG9ydC5URVNURk4gKyAnMicKKworY2xhc3MgVGVzdEFwcGxlc2luZ2xlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3JykKKyAgICAgICAgZnAud3JpdGUoYXBwbGVzaW5nbGVkYXRhKQorICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4yKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgY29tcGFyZURhdGEoc2VsZiwgaXNyZiwgZGF0YSk6CisgICAgICAgIGlmIGlzcmY6CisgICAgICAgICAgICBmcCA9IE1hY09TLm9wZW5yZihURVNURk4yLCAnKnJiJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZwID0gb3BlbihURVNURk4yLCAncmInKQorICAgICAgICBmaWxlZGF0YSA9IGZwLnJlYWQoMTAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBmaWxlZGF0YSkKKworICAgIGRlZiB0ZXN0X2FwcGxlc2luZ2xlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOMikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBhcHBsZXNpbmdsZS5kZWNvZGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgVEVTVEZOMikKKyAgICAgICAgc2VsZi5jb21wYXJlRGF0YShGYWxzZSwgZGF0YWZvcmtkYXRhKQorICAgICAgICBzZWxmLmNvbXBhcmVEYXRhKFRydWUsIHJlc291cmNlZm9ya2RhdGEpCisKKyAgICBkZWYgdGVzdF9hcHBsZXNpbmdsZV9yZXNvbmx5KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOMikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBhcHBsZXNpbmdsZS5kZWNvZGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgVEVTVEZOMiwgcmVzb25seT1UcnVlKQorICAgICAgICBzZWxmLmNvbXBhcmVEYXRhKEZhbHNlLCByZXNvdXJjZWZvcmtkYXRhKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0QXBwbGVzaW5nbGUpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjQ2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hcHBsZXNpbmdsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NjQ2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hcHBsZXNpbmdsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJncGFyc2UucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hcmdwYXJzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGZkZjRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJncGFyc2UucHkKQEAgLTAsMCArMSw0NzYzIEBACisjIEF1dGhvcjogU3RldmVuIEouIEJldGhhcmQgPHN0ZXZlbi5iZXRoYXJkQGdtYWlsLmNvbT4uCisKK2ltcG9ydCBjb2RlY3MKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdGF0CitpbXBvcnQgc3lzCitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgYXJncGFyc2UKKworZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworY2xhc3MgU3RkSU9CdWZmZXIoU3RyaW5nSU8pOgorICAgIHBhc3MKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGFzc2VydEVxdWFsKHNlbGYsIG9iajEsIG9iajIpOgorICAgICAgICBpZiBvYmoxICE9IG9iajI6CisgICAgICAgICAgICBwcmludCgnJykKKyAgICAgICAgICAgIHByaW50KHJlcHIob2JqMSkpCisgICAgICAgICAgICBwcmludChyZXByKG9iajIpKQorICAgICAgICAgICAgcHJpbnQob2JqMSkKKyAgICAgICAgICAgIHByaW50KG9iajIpCisgICAgICAgIHN1cGVyKFRlc3RDYXNlLCBzZWxmKS5hc3NlcnRFcXVhbChvYmoxLCBvYmoyKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIFRoZSB0ZXN0cyBhc3N1bWUgdGhhdCBsaW5lIHdyYXBwaW5nIG9jY3VycyBhdCA4MCBjb2x1bW5zLCBidXQgdGhpcworICAgICAgICAjIGJlaGF2aW91ciBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzZXR0aW5nIHRoZSBDT0xVTU5TIGVudmlyb25tZW50CisgICAgICAgICMgdmFyaWFibGUuICBUbyBlbnN1cmUgdGhhdCB0aGlzIGFzc3VtcHRpb24gaXMgdHJ1ZSwgdW5zZXQgQ09MVU1OUy4KKyAgICAgICAgZW52ID0gdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKQorICAgICAgICBlbnYudW5zZXQoIkNPTFVNTlMiKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoZW52Ll9fZXhpdF9fKQorCisKK2NsYXNzIFRlbXBEaXJNaXhpbihvYmplY3QpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHNlbGYub2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHNlbGYudGVtcF9kaXIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIG9zLmNoZGlyKHNlbGYub2xkX2RpcikKKyAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLnRlbXBfZGlyLCBUcnVlKQorCisgICAgZGVmIGNyZWF0ZV9yZWFkb25seV9maWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYudGVtcF9kaXIsIGZpbGVuYW1lKQorICAgICAgICB3aXRoIG9wZW4oZmlsZV9wYXRoLCAndycpIGFzIGZpbGU6CisgICAgICAgICAgICBmaWxlLndyaXRlKGZpbGVuYW1lKQorICAgICAgICBvcy5jaG1vZChmaWxlX3BhdGgsIHN0YXQuU19JUkVBRCkKKworY2xhc3MgU2lnKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5hcmdzID0gYXJncworICAgICAgICBzZWxmLmt3YXJncyA9IGt3YXJncworCisKK2NsYXNzIE5TKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShrd2FyZ3MpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHNvcnRlZF9pdGVtcyA9IHNvcnRlZChzZWxmLl9fZGljdF9fLml0ZW1zKCkpCisgICAgICAgIGt3YXJnX3N0ciA9ICcsICcuam9pbihbJyVzPSVyJyAlIHR1cCBmb3IgdHVwIGluIHNvcnRlZF9pdGVtc10pCisgICAgICAgIHJldHVybiAnJXMoJXMpJyAlICh0eXBlKHNlbGYpLl9fbmFtZV9fLCBrd2FyZ19zdHIpCisKKyAgICBfX2hhc2hfXyA9IE5vbmUKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gdmFycyhzZWxmKSA9PSB2YXJzKG90aGVyKQorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKKworY2xhc3MgQXJndW1lbnRQYXJzZXJFcnJvcihFeGNlcHRpb24pOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwgZXJyb3JfY29kZT1Ob25lKToKKyAgICAgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIHN0ZG91dCwgc3RkZXJyKQorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisgICAgICAgIHNlbGYuc3Rkb3V0ID0gc3Rkb3V0CisgICAgICAgIHNlbGYuc3RkZXJyID0gc3RkZXJyCisgICAgICAgIHNlbGYuZXJyb3JfY29kZSA9IGVycm9yX2NvZGUKKworCitkZWYgc3RkZXJyX3RvX3BhcnNlcl9lcnJvcihwYXJzZV9hcmdzLCAqYXJncywgKiprd2FyZ3MpOgorICAgICMgaWYgdGhpcyBpcyBiZWluZyBjYWxsZWQgcmVjdXJzaXZlbHkgYW5kIHN0ZGVyciBvciBzdGRvdXQgaXMgYWxyZWFkeSBiZWluZworICAgICMgcmVkaXJlY3RlZCwgc2ltcGx5IGNhbGwgdGhlIGZ1bmN0aW9uIGFuZCBsZXQgdGhlIGVuY2xvc2luZyBmdW5jdGlvbgorICAgICMgY2F0Y2ggdGhlIGV4Y2VwdGlvbgorICAgIGlmIGlzaW5zdGFuY2Uoc3lzLnN0ZGVyciwgU3RkSU9CdWZmZXIpIG9yIGlzaW5zdGFuY2Uoc3lzLnN0ZG91dCwgU3RkSU9CdWZmZXIpOgorICAgICAgICByZXR1cm4gcGFyc2VfYXJncygqYXJncywgKiprd2FyZ3MpCisKKyAgICAjIGlmIHRoaXMgaXMgbm90IGJlaW5nIGNhbGxlZCByZWN1cnNpdmVseSwgcmVkaXJlY3Qgc3RkZXJyIGFuZAorICAgICMgdXNlIGl0IGFzIHRoZSBBcmd1bWVudFBhcnNlckVycm9yIG1lc3NhZ2UKKyAgICBvbGRfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgIG9sZF9zdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgc3lzLnN0ZG91dCA9IFN0ZElPQnVmZmVyKCkKKyAgICBzeXMuc3RkZXJyID0gU3RkSU9CdWZmZXIoKQorICAgIHRyeToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gcGFyc2VfYXJncygqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICBmb3Iga2V5IGluIGxpc3QodmFycyhyZXN1bHQpKToKKyAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKHJlc3VsdCwga2V5KSBpcyBzeXMuc3Rkb3V0OgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHJlc3VsdCwga2V5LCBvbGRfc3Rkb3V0KQorICAgICAgICAgICAgICAgIGlmIGdldGF0dHIocmVzdWx0LCBrZXkpIGlzIHN5cy5zdGRlcnI6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIocmVzdWx0LCBrZXksIG9sZF9zdGRlcnIpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgY29kZSA9IHN5cy5leGNfaW5mbygpWzFdLmNvZGUKKyAgICAgICAgICAgIHN0ZG91dCA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICAgICAgc3RkZXJyID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgICAgICByYWlzZSBBcmd1bWVudFBhcnNlckVycm9yKCJTeXN0ZW1FeGl0Iiwgc3Rkb3V0LCBzdGRlcnIsIGNvZGUpCisgICAgZmluYWxseToKKyAgICAgICAgc3lzLnN0ZG91dCA9IG9sZF9zdGRvdXQKKyAgICAgICAgc3lzLnN0ZGVyciA9IG9sZF9zdGRlcnIKKworCitjbGFzcyBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcik6CisKKyAgICBkZWYgcGFyc2VfYXJncyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBwYXJzZV9hcmdzID0gc3VwZXIoRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIsIHNlbGYpLnBhcnNlX2FyZ3MKKyAgICAgICAgcmV0dXJuIHN0ZGVycl90b19wYXJzZXJfZXJyb3IocGFyc2VfYXJncywgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGV4aXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgZXhpdCA9IHN1cGVyKEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyLCBzZWxmKS5leGl0CisgICAgICAgIHJldHVybiBzdGRlcnJfdG9fcGFyc2VyX2Vycm9yKGV4aXQsICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBlcnJvcihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBlcnJvciA9IHN1cGVyKEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyLCBzZWxmKS5lcnJvcgorICAgICAgICByZXR1cm4gc3RkZXJyX3RvX3BhcnNlcl9lcnJvcihlcnJvciwgKmFyZ3MsICoqa3dhcmdzKQorCisKK2NsYXNzIFBhcnNlclRlc3Rlck1ldGFjbGFzcyh0eXBlKToKKyAgICAiIiJBZGRzIHBhcnNlciB0ZXN0cyB1c2luZyB0aGUgY2xhc3MgYXR0cmlidXRlcy4KKworICAgIENsYXNzZXMgb2YgdGhpcyB0eXBlIHNob3VsZCBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgLS0gYSBsaXN0IG9mIFNpZyBvYmplY3RzIHdoaWNoIHNwZWNpZnkKKyAgICAgICAgdGhlIHNpZ25hdHVyZXMgb2YgQXJndW1lbnQgb2JqZWN0cyB0byBiZSBjcmVhdGVkCisgICAgZmFpbHVyZXMgLS0gYSBsaXN0IG9mIGFyZ3MgbGlzdHMgdGhhdCBzaG91bGQgY2F1c2UgdGhlIHBhcnNlcgorICAgICAgICB0byBmYWlsCisgICAgc3VjY2Vzc2VzIC0tIGEgbGlzdCBvZiAoaW5pdGlhbF9hcmdzLCBvcHRpb25zLCByZW1haW5pbmdfYXJncykgdHVwbGVzCisgICAgICAgIHdoZXJlIGluaXRpYWxfYXJncyBzcGVjaWZpZXMgdGhlIHN0cmluZyBhcmdzIHRvIGJlIHBhcnNlZCwKKyAgICAgICAgb3B0aW9ucyBpcyBhIGRpY3QgdGhhdCBzaG91bGQgbWF0Y2ggdGhlIHZhcnMoKSBvZiB0aGUgb3B0aW9ucworICAgICAgICBwYXJzZWQgb3V0IG9mIGluaXRpYWxfYXJncywgYW5kIHJlbWFpbmluZ19hcmdzIHNob3VsZCBiZSBhbnkKKyAgICAgICAgcmVtYWluaW5nIHVucGFyc2VkIGFyZ3VtZW50cworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKGNscywgbmFtZSwgYmFzZXMsIGJvZHlkaWN0KToKKyAgICAgICAgaWYgbmFtZSA9PSAnUGFyc2VyVGVzdENhc2UnOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBkZWZhdWx0IHBhcnNlciBzaWduYXR1cmUgaXMgZW1wdHkKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoY2xzLCAncGFyc2VyX3NpZ25hdHVyZScpOgorICAgICAgICAgICAgY2xzLnBhcnNlcl9zaWduYXR1cmUgPSBTaWcoKQorICAgICAgICBpZiBub3QgaGFzYXR0cihjbHMsICdwYXJzZXJfY2xhc3MnKToKKyAgICAgICAgICAgIGNscy5wYXJzZXJfY2xhc3MgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcgorCisgICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICMgZnVuY3Rpb25zIGZvciBhZGRpbmcgb3B0aW9uYWwgYXJndW1lbnRzCisgICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGRlZiBub19ncm91cHMocGFyc2VyLCBhcmd1bWVudF9zaWduYXR1cmVzKToKKyAgICAgICAgICAgICIiIkFkZCBhbGwgYXJndW1lbnRzIGRpcmVjdGx5IHRvIHRoZSBwYXJzZXIiIiIKKyAgICAgICAgICAgIGZvciBzaWcgaW4gYXJndW1lbnRfc2lnbmF0dXJlczoKKyAgICAgICAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCpzaWcuYXJncywgKipzaWcua3dhcmdzKQorCisgICAgICAgIGRlZiBvbmVfZ3JvdXAocGFyc2VyLCBhcmd1bWVudF9zaWduYXR1cmVzKToKKyAgICAgICAgICAgICIiIkFkZCBhbGwgYXJndW1lbnRzIHVuZGVyIGEgc2luZ2xlIGdyb3VwIGluIHRoZSBwYXJzZXIiIiIKKyAgICAgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnZm9vJykKKyAgICAgICAgICAgIGZvciBzaWcgaW4gYXJndW1lbnRfc2lnbmF0dXJlczoKKyAgICAgICAgICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoKnNpZy5hcmdzLCAqKnNpZy5rd2FyZ3MpCisKKyAgICAgICAgZGVmIG1hbnlfZ3JvdXBzKHBhcnNlciwgYXJndW1lbnRfc2lnbmF0dXJlcyk6CisgICAgICAgICAgICAiIiJBZGQgZWFjaCBhcmd1bWVudCBpbiBpdHMgb3duIGdyb3VwIHRvIHRoZSBwYXJzZXIiIiIKKyAgICAgICAgICAgIGZvciBpLCBzaWcgaW4gZW51bWVyYXRlKGFyZ3VtZW50X3NpZ25hdHVyZXMpOgorICAgICAgICAgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnZm9vOiVpJyAlIGkpCisgICAgICAgICAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCpzaWcuYXJncywgKipzaWcua3dhcmdzKQorCisgICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgIyBmdW5jdGlvbnMgZm9yIHBhcnNpbmcgYXJncworICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIGRlZiBsaXN0YXJncyhwYXJzZXIsIGFyZ3MpOgorICAgICAgICAgICAgIiIiUGFyc2UgdGhlIGFyZ3MgYnkgcGFzc2luZyBpbiBhIGxpc3QiIiIKKyAgICAgICAgICAgIHJldHVybiBwYXJzZXIucGFyc2VfYXJncyhhcmdzKQorCisgICAgICAgIGRlZiBzeXNhcmdzKHBhcnNlciwgYXJncyk6CisgICAgICAgICAgICAiIiJQYXJzZSB0aGUgYXJncyBieSBkZWZhdWx0aW5nIHRvIHN5cy5hcmd2IiIiCisgICAgICAgICAgICBvbGRfc3lzX2FyZ3YgPSBzeXMuYXJndgorICAgICAgICAgICAgc3lzLmFyZ3YgPSBbb2xkX3N5c19hcmd2WzBdXSArIGFyZ3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzeXMuYXJndiA9IG9sZF9zeXNfYXJndgorCisgICAgICAgICMgY2xhc3MgdGhhdCBob2xkcyB0aGUgY29tYmluYXRpb24gb2Ygb25lIG9wdGlvbmFsIGFyZ3VtZW50CisgICAgICAgICMgYWRkaXRpb24gbWV0aG9kIGFuZCBvbmUgYXJnIHBhcnNpbmcgbWV0aG9kCisgICAgICAgIGNsYXNzIEFkZFRlc3RzKG9iamVjdCk6CisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0ZXJfY2xzLCBhZGRfYXJndW1lbnRzLCBwYXJzZV9hcmdzKToKKyAgICAgICAgICAgICAgICBzZWxmLl9hZGRfYXJndW1lbnRzID0gYWRkX2FyZ3VtZW50cworICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlX2FyZ3MgPSBwYXJzZV9hcmdzCisKKyAgICAgICAgICAgICAgICBhZGRfYXJndW1lbnRzX25hbWUgPSBzZWxmLl9hZGRfYXJndW1lbnRzLl9fbmFtZV9fCisgICAgICAgICAgICAgICAgcGFyc2VfYXJnc19uYW1lID0gc2VsZi5fcGFyc2VfYXJncy5fX25hbWVfXworICAgICAgICAgICAgICAgIGZvciB0ZXN0X2Z1bmMgaW4gW3NlbGYudGVzdF9mYWlsdXJlcywgc2VsZi50ZXN0X3N1Y2Nlc3Nlc106CisgICAgICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSA9IHRlc3RfZnVuYy5fX25hbWVfXworICAgICAgICAgICAgICAgICAgICBuYW1lcyA9IGZ1bmNfbmFtZSwgYWRkX2FyZ3VtZW50c19uYW1lLCBwYXJzZV9hcmdzX25hbWUKKyAgICAgICAgICAgICAgICAgICAgdGVzdF9uYW1lID0gJ18nLmpvaW4obmFtZXMpCisKKyAgICAgICAgICAgICAgICAgICAgZGVmIHdyYXBwZXIoc2VsZiwgdGVzdF9mdW5jPXRlc3RfZnVuYyk6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2Z1bmMoc2VsZikKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci5fX25hbWVfXyA9IHRlc3RfbmFtZQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHRlc3Rlcl9jbHMsIHRlc3RfbmFtZSwgd3JhcHBlcikKKworICAgICAgICAgICAgZGVmIF9nZXRfcGFyc2VyKHNlbGYsIHRlc3Rlcik6CisgICAgICAgICAgICAgICAgYXJncyA9IHRlc3Rlci5wYXJzZXJfc2lnbmF0dXJlLmFyZ3MKKyAgICAgICAgICAgICAgICBrd2FyZ3MgPSB0ZXN0ZXIucGFyc2VyX3NpZ25hdHVyZS5rd2FyZ3MKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSB0ZXN0ZXIucGFyc2VyX2NsYXNzKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgICAgICBzZWxmLl9hZGRfYXJndW1lbnRzKHBhcnNlciwgdGVzdGVyLmFyZ3VtZW50X3NpZ25hdHVyZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlcgorCisgICAgICAgICAgICBkZWYgdGVzdF9mYWlsdXJlcyhzZWxmLCB0ZXN0ZXIpOgorICAgICAgICAgICAgICAgIHBhcnNlciA9IHNlbGYuX2dldF9wYXJzZXIodGVzdGVyKQorICAgICAgICAgICAgICAgIGZvciBhcmdzX3N0ciBpbiB0ZXN0ZXIuZmFpbHVyZXM6CisgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzX3N0ci5zcGxpdCgpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlcyA9IHRlc3Rlci5hc3NlcnRSYWlzZXMKKyAgICAgICAgICAgICAgICAgICAgcmFpc2VzKEFyZ3VtZW50UGFyc2VyRXJyb3IsIHBhcnNlci5wYXJzZV9hcmdzLCBhcmdzKQorCisgICAgICAgICAgICBkZWYgdGVzdF9zdWNjZXNzZXMoc2VsZiwgdGVzdGVyKToKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBzZWxmLl9nZXRfcGFyc2VyKHRlc3RlcikKKyAgICAgICAgICAgICAgICBmb3IgYXJncywgZXhwZWN0ZWRfbnMgaW4gdGVzdGVyLnN1Y2Nlc3NlczoKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmdzLCBzdHIpOgorICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3Muc3BsaXQoKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRfbnMgPSBzZWxmLl9wYXJzZV9hcmdzKHBhcnNlciwgYXJncykKKyAgICAgICAgICAgICAgICAgICAgdGVzdGVyLmFzc2VydEVxdWFsKGV4cGVjdGVkX25zLCByZXN1bHRfbnMpCisKKyAgICAgICAgIyBhZGQgdGVzdHMgZm9yIGVhY2ggY29tYmluYXRpb24gb2YgYW4gb3B0aW9uYWxzIGFkZGluZyBtZXRob2QKKyAgICAgICAgIyBhbmQgYW4gYXJnIHBhcnNpbmcgbWV0aG9kCisgICAgICAgIGZvciBhZGRfYXJndW1lbnRzIGluIFtub19ncm91cHMsIG9uZV9ncm91cCwgbWFueV9ncm91cHNdOgorICAgICAgICAgICAgZm9yIHBhcnNlX2FyZ3MgaW4gW2xpc3RhcmdzLCBzeXNhcmdzXToKKyAgICAgICAgICAgICAgICBBZGRUZXN0cyhjbHMsIGFkZF9hcmd1bWVudHMsIHBhcnNlX2FyZ3MpCisKK2Jhc2VzID0gVGVzdENhc2UsCitQYXJzZXJUZXN0Q2FzZSA9IFBhcnNlclRlc3Rlck1ldGFjbGFzcygnUGFyc2VyVGVzdENhc2UnLCBiYXNlcywge30pCisKKyMgPT09PT09PT09PT09PT09CisjIE9wdGlvbmFscyB0ZXN0cworIyA9PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdE9wdGlvbmFsc1NpbmdsZURhc2goUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYW4gT3B0aW9uYWwgd2l0aCBhIHNpbmdsZS1kYXNoIG9wdGlvbiBzdHJpbmciIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCcteCcpXQorICAgIGZhaWx1cmVzID0gWycteCcsICdhJywgJy0tZm9vJywgJy14IC0tZm9vJywgJy14IC15J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoeD1Ob25lKSksCisgICAgICAgICgnLXggYScsIE5TKHg9J2EnKSksCisgICAgICAgICgnLXhhJywgTlMoeD0nYScpKSwKKyAgICAgICAgKCcteCAtMScsIE5TKHg9Jy0xJykpLAorICAgICAgICAoJy14LTEnLCBOUyh4PSctMScpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc1NpbmdsZURhc2hDb21iaW5lZChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhbiBPcHRpb25hbCB3aXRoIGEgc2luZ2xlLWRhc2ggb3B0aW9uIHN0cmluZyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcteCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpLAorICAgICAgICBTaWcoJy15eXknLCBhY3Rpb249J3N0b3JlX2NvbnN0JywgY29uc3Q9NDIpLAorICAgICAgICBTaWcoJy16JyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWydhJywgJy0tZm9vJywgJy14YScsICcteCAtLWZvbycsICcteCAteicsICcteiAteCcsCisgICAgICAgICAgICAgICAgJy15eCcsICcteXogYScsICcteXl5eCcsICcteXl5emEnLCAnLXh5emEnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh4PUZhbHNlLCB5eXk9Tm9uZSwgej1Ob25lKSksCisgICAgICAgICgnLXgnLCBOUyh4PVRydWUsIHl5eT1Ob25lLCB6PU5vbmUpKSwKKyAgICAgICAgKCctemEnLCBOUyh4PUZhbHNlLCB5eXk9Tm9uZSwgej0nYScpKSwKKyAgICAgICAgKCcteiBhJywgTlMoeD1GYWxzZSwgeXl5PU5vbmUsIHo9J2EnKSksCisgICAgICAgICgnLXh6YScsIE5TKHg9VHJ1ZSwgeXl5PU5vbmUsIHo9J2EnKSksCisgICAgICAgICgnLXh6IGEnLCBOUyh4PVRydWUsIHl5eT1Ob25lLCB6PSdhJykpLAorICAgICAgICAoJy14IC16YScsIE5TKHg9VHJ1ZSwgeXl5PU5vbmUsIHo9J2EnKSksCisgICAgICAgICgnLXggLXogYScsIE5TKHg9VHJ1ZSwgeXl5PU5vbmUsIHo9J2EnKSksCisgICAgICAgICgnLXknLCBOUyh4PUZhbHNlLCB5eXk9NDIsIHo9Tm9uZSkpLAorICAgICAgICAoJy15eXknLCBOUyh4PUZhbHNlLCB5eXk9NDIsIHo9Tm9uZSkpLAorICAgICAgICAoJy14IC15eXkgLXphJywgTlMoeD1UcnVlLCB5eXk9NDIsIHo9J2EnKSksCisgICAgICAgICgnLXggLXl5eSAteiBhJywgTlMoeD1UcnVlLCB5eXk9NDIsIHo9J2EnKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNTaW5nbGVEYXNoTG9uZyhQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhbiBPcHRpb25hbCB3aXRoIGEgbXVsdGktY2hhcmFjdGVyIHNpbmdsZS1kYXNoIG9wdGlvbiBzdHJpbmciIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCctZm9vJyldCisgICAgZmFpbHVyZXMgPSBbJy1mb28nLCAnYScsICctLWZvbycsICctZm9vIC0tZm9vJywgJy1mb28gLXknLCAnLWZvb2EnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhmb289Tm9uZSkpLAorICAgICAgICAoJy1mb28gYScsIE5TKGZvbz0nYScpKSwKKyAgICAgICAgKCctZm9vIC0xJywgTlMoZm9vPSctMScpKSwKKyAgICAgICAgKCctZm8gYScsIE5TKGZvbz0nYScpKSwKKyAgICAgICAgKCctZiBhJywgTlMoZm9vPSdhJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzU2luZ2xlRGFzaFN1YnNldEFtYmlndW91cyhQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBPcHRpb25hbHMgd2hlcmUgb3B0aW9uIHN0cmluZ3MgYXJlIHN1YnNldHMgb2YgZWFjaCBvdGhlciIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy1mJyksIFNpZygnLWZvb2JhcicpLCBTaWcoJy1mb29yYWInKV0KKyAgICBmYWlsdXJlcyA9IFsnLWYnLCAnLWZvbycsICctZm8nLCAnLWZvbyBiJywgJy1mb29iJywgJy1mb29iYScsICctZm9vcmEnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhmPU5vbmUsIGZvb2Jhcj1Ob25lLCBmb29yYWI9Tm9uZSkpLAorICAgICAgICAoJy1mIGEnLCBOUyhmPSdhJywgZm9vYmFyPU5vbmUsIGZvb3JhYj1Ob25lKSksCisgICAgICAgICgnLWZhJywgTlMoZj0nYScsIGZvb2Jhcj1Ob25lLCBmb29yYWI9Tm9uZSkpLAorICAgICAgICAoJy1mb2EnLCBOUyhmPSdvYScsIGZvb2Jhcj1Ob25lLCBmb29yYWI9Tm9uZSkpLAorICAgICAgICAoJy1mb29hJywgTlMoZj0nb29hJywgZm9vYmFyPU5vbmUsIGZvb3JhYj1Ob25lKSksCisgICAgICAgICgnLWZvb2JhciBhJywgTlMoZj1Ob25lLCBmb29iYXI9J2EnLCBmb29yYWI9Tm9uZSkpLAorICAgICAgICAoJy1mb29yYWIgYScsIE5TKGY9Tm9uZSwgZm9vYmFyPU5vbmUsIGZvb3JhYj0nYScpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc1NpbmdsZURhc2hBbWJpZ3VvdXMoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgT3B0aW9uYWxzIHRoYXQgcGFydGlhbGx5IG1hdGNoIGJ1dCBhcmUgbm90IHN1YnNldHMiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCctZm9vYmFyJyksIFNpZygnLWZvb3JhYicpXQorICAgIGZhaWx1cmVzID0gWyctZicsICctZiBhJywgJy1mYScsICctZm9hJywgJy1mb28nLCAnLWZvJywgJy1mb28gYiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGZvb2Jhcj1Ob25lLCBmb29yYWI9Tm9uZSkpLAorICAgICAgICAoJy1mb29iIGEnLCBOUyhmb29iYXI9J2EnLCBmb29yYWI9Tm9uZSkpLAorICAgICAgICAoJy1mb29yIGEnLCBOUyhmb29iYXI9Tm9uZSwgZm9vcmFiPSdhJykpLAorICAgICAgICAoJy1mb29iYSBhJywgTlMoZm9vYmFyPSdhJywgZm9vcmFiPU5vbmUpKSwKKyAgICAgICAgKCctZm9vcmEgYScsIE5TKGZvb2Jhcj1Ob25lLCBmb29yYWI9J2EnKSksCisgICAgICAgICgnLWZvb2JhciBhJywgTlMoZm9vYmFyPSdhJywgZm9vcmFiPU5vbmUpKSwKKyAgICAgICAgKCctZm9vcmFiIGEnLCBOUyhmb29iYXI9Tm9uZSwgZm9vcmFiPSdhJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzTnVtZXJpYyhQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhbiBPcHRpb25hbCB3aXRoIGEgc2hvcnQgb3B0IHN0cmluZyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy0xJywgZGVzdD0nb25lJyldCisgICAgZmFpbHVyZXMgPSBbJy0xJywgJ2EnLCAnLTEgLS1mb28nLCAnLTEgLXknLCAnLTEgLTEnLCAnLTEgLTInXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhvbmU9Tm9uZSkpLAorICAgICAgICAoJy0xIGEnLCBOUyhvbmU9J2EnKSksCisgICAgICAgICgnLTFhJywgTlMob25lPSdhJykpLAorICAgICAgICAoJy0xLTInLCBOUyhvbmU9Jy0yJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzRG91YmxlRGFzaChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhbiBPcHRpb25hbCB3aXRoIGEgZG91YmxlLWRhc2ggb3B0aW9uIHN0cmluZyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy0tZm9vJyldCisgICAgZmFpbHVyZXMgPSBbJy0tZm9vJywgJy1mJywgJy1mIGEnLCAnYScsICctLWZvbyAteCcsICctLWZvbyAtLWJhciddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGZvbz1Ob25lKSksCisgICAgICAgICgnLS1mb28gYScsIE5TKGZvbz0nYScpKSwKKyAgICAgICAgKCctLWZvbz1hJywgTlMoZm9vPSdhJykpLAorICAgICAgICAoJy0tZm9vIC0yLjUnLCBOUyhmb289Jy0yLjUnKSksCisgICAgICAgICgnLS1mb289LTIuNScsIE5TKGZvbz0nLTIuNScpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0RvdWJsZURhc2hQYXJ0aWFsTWF0Y2goUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHBhcnRpYWwgbWF0Y2hpbmcgd2l0aCBhIGRvdWJsZS1kYXNoIG9wdGlvbiBzdHJpbmciIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1iYWRnZXInLCBhY3Rpb249J3N0b3JlX3RydWUnKSwKKyAgICAgICAgU2lnKCctLWJhdCcpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLS1iYXInLCAnLS1iJywgJy0tYmEnLCAnLS1iPTInLCAnLS1iYT00JywgJy0tYmFkZ2UgNSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGJhZGdlcj1GYWxzZSwgYmF0PU5vbmUpKSwKKyAgICAgICAgKCctLWJhdCBYJywgTlMoYmFkZ2VyPUZhbHNlLCBiYXQ9J1gnKSksCisgICAgICAgICgnLS1iYWQnLCBOUyhiYWRnZXI9VHJ1ZSwgYmF0PU5vbmUpKSwKKyAgICAgICAgKCctLWJhZGcnLCBOUyhiYWRnZXI9VHJ1ZSwgYmF0PU5vbmUpKSwKKyAgICAgICAgKCctLWJhZGdlJywgTlMoYmFkZ2VyPVRydWUsIGJhdD1Ob25lKSksCisgICAgICAgICgnLS1iYWRnZXInLCBOUyhiYWRnZXI9VHJ1ZSwgYmF0PU5vbmUpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0RvdWJsZURhc2hQcmVmaXhNYXRjaChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgd2hlbiBvbmUgZG91YmxlLWRhc2ggb3B0aW9uIHN0cmluZyBpcyBhIHByZWZpeCBvZiBhbm90aGVyIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy0tYmFkZ2VyJywgYWN0aW9uPSdzdG9yZV90cnVlJyksCisgICAgICAgIFNpZygnLS1iYScpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLS1iYXInLCAnLS1iJywgJy0tYmEnLCAnLS1iPTInLCAnLS1iYWRnZSA1J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoYmFkZ2VyPUZhbHNlLCBiYT1Ob25lKSksCisgICAgICAgICgnLS1iYSBYJywgTlMoYmFkZ2VyPUZhbHNlLCBiYT0nWCcpKSwKKyAgICAgICAgKCctLWJhPVgnLCBOUyhiYWRnZXI9RmFsc2UsIGJhPSdYJykpLAorICAgICAgICAoJy0tYmFkJywgTlMoYmFkZ2VyPVRydWUsIGJhPU5vbmUpKSwKKyAgICAgICAgKCctLWJhZGcnLCBOUyhiYWRnZXI9VHJ1ZSwgYmE9Tm9uZSkpLAorICAgICAgICAoJy0tYmFkZ2UnLCBOUyhiYWRnZXI9VHJ1ZSwgYmE9Tm9uZSkpLAorICAgICAgICAoJy0tYmFkZ2VyJywgTlMoYmFkZ2VyPVRydWUsIGJhPU5vbmUpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc1NpbmdsZURvdWJsZURhc2goUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYW4gT3B0aW9uYWwgd2l0aCBzaW5nbGUtIGFuZCBkb3VibGUtZGFzaCBvcHRpb24gc3RyaW5ncyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctZicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpLAorICAgICAgICBTaWcoJy0tYmFyJyksCisgICAgICAgIFNpZygnLWJheicsIGFjdGlvbj0nc3RvcmVfY29uc3QnLCBjb25zdD00MiksCisgICAgXQorICAgIGZhaWx1cmVzID0gWyctLWJhcicsICctZmJhcicsICctZmJheicsICctYmF6ZicsICctYiBCJywgJ0InXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhmPUZhbHNlLCBiYXI9Tm9uZSwgYmF6PU5vbmUpKSwKKyAgICAgICAgKCctZicsIE5TKGY9VHJ1ZSwgYmFyPU5vbmUsIGJhej1Ob25lKSksCisgICAgICAgICgnLS1iYSBCJywgTlMoZj1GYWxzZSwgYmFyPSdCJywgYmF6PU5vbmUpKSwKKyAgICAgICAgKCctZiAtLWJhciBCJywgTlMoZj1UcnVlLCBiYXI9J0InLCBiYXo9Tm9uZSkpLAorICAgICAgICAoJy1mIC1iJywgTlMoZj1UcnVlLCBiYXI9Tm9uZSwgYmF6PTQyKSksCisgICAgICAgICgnLWJhIC1mJywgTlMoZj1UcnVlLCBiYXI9Tm9uZSwgYmF6PTQyKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNBbHRlcm5hdGVQcmVmaXhDaGFycyhQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhbiBPcHRpb25hbCB3aXRoIG9wdGlvbiBzdHJpbmdzIHdpdGggY3VzdG9tIHByZWZpeGVzIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByZWZpeF9jaGFycz0nKzovJywgYWRkX2hlbHA9RmFsc2UpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcrZicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpLAorICAgICAgICBTaWcoJzo6YmFyJyksCisgICAgICAgIFNpZygnL2JheicsIGFjdGlvbj0nc3RvcmVfY29uc3QnLCBjb25zdD00MiksCisgICAgXQorICAgIGZhaWx1cmVzID0gWyctLWJhcicsICctZmJhcicsICctYiBCJywgJ0InLCAnLWYnLCAnLS1iYXIgQicsICctYmF6JywgJy1oJywgJy0taGVscCcsICcraCcsICc6OmhlbHAnLCAnL2hlbHAnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhmPUZhbHNlLCBiYXI9Tm9uZSwgYmF6PU5vbmUpKSwKKyAgICAgICAgKCcrZicsIE5TKGY9VHJ1ZSwgYmFyPU5vbmUsIGJhej1Ob25lKSksCisgICAgICAgICgnOjpiYSBCJywgTlMoZj1GYWxzZSwgYmFyPSdCJywgYmF6PU5vbmUpKSwKKyAgICAgICAgKCcrZiA6OmJhciBCJywgTlMoZj1UcnVlLCBiYXI9J0InLCBiYXo9Tm9uZSkpLAorICAgICAgICAoJytmIC9iJywgTlMoZj1UcnVlLCBiYXI9Tm9uZSwgYmF6PTQyKSksCisgICAgICAgICgnL2JhICtmJywgTlMoZj1UcnVlLCBiYXI9Tm9uZSwgYmF6PTQyKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNBbHRlcm5hdGVQcmVmaXhDaGFyc0FkZGVkSGVscChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiV2hlbiBgYC1gYCBub3QgaW4gcHJlZml4X2NoYXJzLCBkZWZhdWx0IG9wZXJhdG9ycyBjcmVhdGVkIGZvciBoZWxwCisgICAgICAgc2hvdWxkIHVzZSB0aGUgcHJlZml4X2NoYXJzIGluIHVzZSByYXRoZXIgdGhhbiAtIG9yIC0tCisgICAgICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTk0NDQiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJlZml4X2NoYXJzPScrOi8nLCBhZGRfaGVscD1UcnVlKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnK2YnLCBhY3Rpb249J3N0b3JlX3RydWUnKSwKKyAgICAgICAgU2lnKCc6OmJhcicpLAorICAgICAgICBTaWcoJy9iYXonLCBhY3Rpb249J3N0b3JlX2NvbnN0JywgY29uc3Q9NDIpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLS1iYXInLCAnLWZiYXInLCAnLWIgQicsICdCJywgJy1mJywgJy0tYmFyIEInLCAnLWJheiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGY9RmFsc2UsIGJhcj1Ob25lLCBiYXo9Tm9uZSkpLAorICAgICAgICAoJytmJywgTlMoZj1UcnVlLCBiYXI9Tm9uZSwgYmF6PU5vbmUpKSwKKyAgICAgICAgKCc6OmJhIEInLCBOUyhmPUZhbHNlLCBiYXI9J0InLCBiYXo9Tm9uZSkpLAorICAgICAgICAoJytmIDo6YmFyIEInLCBOUyhmPVRydWUsIGJhcj0nQicsIGJhej1Ob25lKSksCisgICAgICAgICgnK2YgL2InLCBOUyhmPVRydWUsIGJhcj1Ob25lLCBiYXo9NDIpKSwKKyAgICAgICAgKCcvYmEgK2YnLCBOUyhmPVRydWUsIGJhcj1Ob25lLCBiYXo9NDIpKQorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzQWx0ZXJuYXRlUHJlZml4Q2hhcnNNdWx0aXBsZVNob3J0QXJncyhQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVmVyaWZ5IHRoYXQgT3B0aW9uYWxzIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlaXIgZGVmaW5lZCBwcmVmaXhlcyIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcmVmaXhfY2hhcnM9JystJywgYWRkX2hlbHA9RmFsc2UpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcteCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpLAorICAgICAgICBTaWcoJyt5JywgYWN0aW9uPSdzdG9yZV90cnVlJyksCisgICAgICAgIFNpZygnK3onLCBhY3Rpb249J3N0b3JlX3RydWUnKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJy13JywKKyAgICAgICAgICAgICAgICAnLXh5eicsCisgICAgICAgICAgICAgICAgJyt4JywKKyAgICAgICAgICAgICAgICAnLXknLAorICAgICAgICAgICAgICAgICcreHl6JywKKyAgICBdCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHg9RmFsc2UsIHk9RmFsc2UsIHo9RmFsc2UpKSwKKyAgICAgICAgKCcteCcsIE5TKHg9VHJ1ZSwgeT1GYWxzZSwgej1GYWxzZSkpLAorICAgICAgICAoJyt5IC14JywgTlMoeD1UcnVlLCB5PVRydWUsIHo9RmFsc2UpKSwKKyAgICAgICAgKCcreXogLXgnLCBOUyh4PVRydWUsIHk9VHJ1ZSwgej1UcnVlKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNTaG9ydExvbmcoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBjb21iaW5hdGlvbiBvZiBzaW5nbGUtIGFuZCBkb3VibGUtZGFzaCBvcHRpb24gc3RyaW5ncyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctdicsICctLXZlcmJvc2UnLCAnLW4nLCAnLS1ub2lzeScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLS14IC0tdmVyYm9zZScsICctTicsICdhJywgJy12IHgnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh2ZXJib3NlPUZhbHNlKSksCisgICAgICAgICgnLXYnLCBOUyh2ZXJib3NlPVRydWUpKSwKKyAgICAgICAgKCctLXZlcmJvc2UnLCBOUyh2ZXJib3NlPVRydWUpKSwKKyAgICAgICAgKCctbicsIE5TKHZlcmJvc2U9VHJ1ZSkpLAorICAgICAgICAoJy0tbm9pc3knLCBOUyh2ZXJib3NlPVRydWUpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0Rlc3QoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHZhcmlvdXMgbWVhbnMgb2Ygc2V0dGluZyBkZXN0aW5hdGlvbiIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy0tZm9vLWJhcicpLCBTaWcoJy0tYmF6JywgZGVzdD0nemFiYmF6JyldCisgICAgZmFpbHVyZXMgPSBbJ2EnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCctLWZvby1iYXIgZicsIE5TKGZvb19iYXI9J2YnLCB6YWJiYXo9Tm9uZSkpLAorICAgICAgICAoJy0tYmF6IGcnLCBOUyhmb29fYmFyPU5vbmUsIHphYmJhej0nZycpKSwKKyAgICAgICAgKCctLWZvby1iYXIgaCAtLWJheiBpJywgTlMoZm9vX2Jhcj0naCcsIHphYmJhej0naScpKSwKKyAgICAgICAgKCctLWJheiBqIC0tZm9vLWJhciBrJywgTlMoZm9vX2Jhcj0naycsIHphYmJhej0naicpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0RlZmF1bHQoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHNwZWNpZnlpbmcgYSBkZWZhdWx0IGZvciBhbiBPcHRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy14JyksIFNpZygnLXknLCBkZWZhdWx0PTQyKV0KKyAgICBmYWlsdXJlcyA9IFsnYSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHg9Tm9uZSwgeT00MikpLAorICAgICAgICAoJy14eCcsIE5TKHg9J3gnLCB5PTQyKSksCisgICAgICAgICgnLXl5JywgTlMoeD1Ob25lLCB5PSd5JykpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzTmFyZ3NEZWZhdWx0KFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBub3Qgc3BlY2lmeWluZyB0aGUgbnVtYmVyIG9mIGFyZ3MgZm9yIGFuIE9wdGlvbmFsIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnLXgnKV0KKyAgICBmYWlsdXJlcyA9IFsnYScsICcteCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHg9Tm9uZSkpLAorICAgICAgICAoJy14IGEnLCBOUyh4PSdhJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzTmFyZ3MxKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBzcGVjaWZ5aW5nIHRoZSAxIGFyZyBmb3IgYW4gT3B0aW9uYWwiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCcteCcsIG5hcmdzPTEpXQorICAgIGZhaWx1cmVzID0gWydhJywgJy14J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoeD1Ob25lKSksCisgICAgICAgICgnLXggYScsIE5TKHg9WydhJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc05hcmdzMyhQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgc3BlY2lmeWluZyB0aGUgMyBhcmdzIGZvciBhbiBPcHRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy14JywgbmFyZ3M9MyldCisgICAgZmFpbHVyZXMgPSBbJ2EnLCAnLXgnLCAnLXggYScsICcteCBhIGInLCAnYSAteCcsICdhIC14IGInXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh4PU5vbmUpKSwKKyAgICAgICAgKCcteCBhIGIgYycsIE5TKHg9WydhJywgJ2InLCAnYyddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNOYXJnc09wdGlvbmFsKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBzcGVjaWZ5aW5nIGFuIE9wdGlvbmFsIGFyZyBmb3IgYW4gT3B0aW9uYWwiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXcnLCBuYXJncz0nPycpLAorICAgICAgICBTaWcoJy14JywgbmFyZ3M9Jz8nLCBjb25zdD00MiksCisgICAgICAgIFNpZygnLXknLCBuYXJncz0nPycsIGRlZmF1bHQ9J3NwYW0nKSwKKyAgICAgICAgU2lnKCcteicsIG5hcmdzPSc/JywgdHlwZT1pbnQsIGNvbnN0PSc0MicsIGRlZmF1bHQ9Jzg0JyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWycyJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlModz1Ob25lLCB4PU5vbmUsIHk9J3NwYW0nLCB6PTg0KSksCisgICAgICAgICgnLXcnLCBOUyh3PU5vbmUsIHg9Tm9uZSwgeT0nc3BhbScsIHo9ODQpKSwKKyAgICAgICAgKCctdyAyJywgTlModz0nMicsIHg9Tm9uZSwgeT0nc3BhbScsIHo9ODQpKSwKKyAgICAgICAgKCcteCcsIE5TKHc9Tm9uZSwgeD00MiwgeT0nc3BhbScsIHo9ODQpKSwKKyAgICAgICAgKCcteCAyJywgTlModz1Ob25lLCB4PScyJywgeT0nc3BhbScsIHo9ODQpKSwKKyAgICAgICAgKCcteScsIE5TKHc9Tm9uZSwgeD1Ob25lLCB5PU5vbmUsIHo9ODQpKSwKKyAgICAgICAgKCcteSAyJywgTlModz1Ob25lLCB4PU5vbmUsIHk9JzInLCB6PTg0KSksCisgICAgICAgICgnLXonLCBOUyh3PU5vbmUsIHg9Tm9uZSwgeT0nc3BhbScsIHo9NDIpKSwKKyAgICAgICAgKCcteiAyJywgTlModz1Ob25lLCB4PU5vbmUsIHk9J3NwYW0nLCB6PTIpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc05hcmdzWmVyb09yTW9yZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgc3BlY2lmeWluZyBhbiBhcmdzIGZvciBhbiBPcHRpb25hbCB0aGF0IGFjY2VwdHMgemVybyBvciBtb3JlIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgbmFyZ3M9JyonKSwKKyAgICAgICAgU2lnKCcteScsIG5hcmdzPScqJywgZGVmYXVsdD0nc3BhbScpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnYSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHg9Tm9uZSwgeT0nc3BhbScpKSwKKyAgICAgICAgKCcteCcsIE5TKHg9W10sIHk9J3NwYW0nKSksCisgICAgICAgICgnLXggYScsIE5TKHg9WydhJ10sIHk9J3NwYW0nKSksCisgICAgICAgICgnLXggYSBiJywgTlMoeD1bJ2EnLCAnYiddLCB5PSdzcGFtJykpLAorICAgICAgICAoJy15JywgTlMoeD1Ob25lLCB5PVtdKSksCisgICAgICAgICgnLXkgYScsIE5TKHg9Tm9uZSwgeT1bJ2EnXSkpLAorICAgICAgICAoJy15IGEgYicsIE5TKHg9Tm9uZSwgeT1bJ2EnLCAnYiddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNOYXJnc09uZU9yTW9yZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgc3BlY2lmeWluZyBhbiBhcmdzIGZvciBhbiBPcHRpb25hbCB0aGF0IGFjY2VwdHMgb25lIG9yIG1vcmUiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCBuYXJncz0nKycpLAorICAgICAgICBTaWcoJy15JywgbmFyZ3M9JysnLCBkZWZhdWx0PSdzcGFtJyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWydhJywgJy14JywgJy15JywgJ2EgLXgnLCAnYSAteSBiJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoeD1Ob25lLCB5PSdzcGFtJykpLAorICAgICAgICAoJy14IGEnLCBOUyh4PVsnYSddLCB5PSdzcGFtJykpLAorICAgICAgICAoJy14IGEgYicsIE5TKHg9WydhJywgJ2InXSwgeT0nc3BhbScpKSwKKyAgICAgICAgKCcteSBhJywgTlMoeD1Ob25lLCB5PVsnYSddKSksCisgICAgICAgICgnLXkgYSBiJywgTlMoeD1Ob25lLCB5PVsnYScsICdiJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0Nob2ljZXMoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHNwZWNpZnlpbmcgdGhlIGNob2ljZXMgZm9yIGFuIE9wdGlvbmFsIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy1mJywgY2hvaWNlcz0nYWJjJyksCisgICAgICAgIFNpZygnLWcnLCB0eXBlPWludCwgY2hvaWNlcz1yYW5nZSg1KSldCisgICAgZmFpbHVyZXMgPSBbJ2EnLCAnLWYgZCcsICctZmFkJywgJy1nYScsICctZyA2J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoZj1Ob25lLCBnPU5vbmUpKSwKKyAgICAgICAgKCctZiBhJywgTlMoZj0nYScsIGc9Tm9uZSkpLAorICAgICAgICAoJy1mIGMnLCBOUyhmPSdjJywgZz1Ob25lKSksCisgICAgICAgICgnLWcgMCcsIE5TKGY9Tm9uZSwgZz0wKSksCisgICAgICAgICgnLWcgMDMnLCBOUyhmPU5vbmUsIGc9MykpLAorICAgICAgICAoJy1mYiAtZzQnLCBOUyhmPSdiJywgZz00KSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNSZXF1aXJlZChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgdGhlIGFuIG9wdGlvbmFsIGFjdGlvbiB0aGF0IGlzIHJlcXVpcmVkIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgdHlwZT1pbnQsIHJlcXVpcmVkPVRydWUpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnYScsICcnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcteCAxJywgTlMoeD0xKSksCisgICAgICAgICgnLXg0MicsIE5TKHg9NDIpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0FjdGlvblN0b3JlKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyB0aGUgc3RvcmUgYWN0aW9uIGZvciBhbiBPcHRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy14JywgYWN0aW9uPSdzdG9yZScpXQorICAgIGZhaWx1cmVzID0gWydhJywgJ2EgLXgnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh4PU5vbmUpKSwKKyAgICAgICAgKCcteGZvbycsIE5TKHg9J2ZvbycpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0FjdGlvblN0b3JlQ29uc3QoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHRoZSBzdG9yZV9jb25zdCBhY3Rpb24gZm9yIGFuIE9wdGlvbmFsIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnLXknLCBhY3Rpb249J3N0b3JlX2NvbnN0JywgY29uc3Q9b2JqZWN0KV0KKyAgICBmYWlsdXJlcyA9IFsnYSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHk9Tm9uZSkpLAorICAgICAgICAoJy15JywgTlMoeT1vYmplY3QpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0FjdGlvblN0b3JlRmFsc2UoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHRoZSBzdG9yZV9mYWxzZSBhY3Rpb24gZm9yIGFuIE9wdGlvbmFsIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnLXonLCBhY3Rpb249J3N0b3JlX2ZhbHNlJyldCisgICAgZmFpbHVyZXMgPSBbJ2EnLCAnLXphJywgJy16IGEnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh6PVRydWUpKSwKKyAgICAgICAgKCcteicsIE5TKHo9RmFsc2UpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0FjdGlvblN0b3JlVHJ1ZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgdGhlIHN0b3JlX3RydWUgYWN0aW9uIGZvciBhbiBPcHRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy0tYXBwbGUnLCBhY3Rpb249J3N0b3JlX3RydWUnKV0KKyAgICBmYWlsdXJlcyA9IFsnYScsICctLWFwcGxlPWInLCAnLS1hcHBsZSBiJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoYXBwbGU9RmFsc2UpKSwKKyAgICAgICAgKCctLWFwcGxlJywgTlMoYXBwbGU9VHJ1ZSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzQWN0aW9uQXBwZW5kKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyB0aGUgYXBwZW5kIGFjdGlvbiBmb3IgYW4gT3B0aW9uYWwiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCctLWJheicsIGFjdGlvbj0nYXBwZW5kJyldCisgICAgZmFpbHVyZXMgPSBbJ2EnLCAnLS1iYXonLCAnYSAtLWJheicsICctLWJheiBhIGInXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhiYXo9Tm9uZSkpLAorICAgICAgICAoJy0tYmF6IGEnLCBOUyhiYXo9WydhJ10pKSwKKyAgICAgICAgKCctLWJheiBhIC0tYmF6IGInLCBOUyhiYXo9WydhJywgJ2InXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzQWN0aW9uQXBwZW5kV2l0aERlZmF1bHQoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHRoZSBhcHBlbmQgYWN0aW9uIGZvciBhbiBPcHRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy0tYmF6JywgYWN0aW9uPSdhcHBlbmQnLCBkZWZhdWx0PVsnWCddKV0KKyAgICBmYWlsdXJlcyA9IFsnYScsICctLWJheicsICdhIC0tYmF6JywgJy0tYmF6IGEgYiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGJhej1bJ1gnXSkpLAorICAgICAgICAoJy0tYmF6IGEnLCBOUyhiYXo9WydYJywgJ2EnXSkpLAorICAgICAgICAoJy0tYmF6IGEgLS1iYXogYicsIE5TKGJhej1bJ1gnLCAnYScsICdiJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0FjdGlvbkFwcGVuZENvbnN0KFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyB0aGUgYXBwZW5kX2NvbnN0IGFjdGlvbiBmb3IgYW4gT3B0aW9uYWwiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLWInLCBhY3Rpb249J2FwcGVuZF9jb25zdCcsIGNvbnN0PUV4Y2VwdGlvbiksCisgICAgICAgIFNpZygnLWMnLCBhY3Rpb249J2FwcGVuZCcsIGRlc3Q9J2InKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJ2EnLCAnLWMnLCAnYSAtYycsICctYngnLCAnLWIgeCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGI9Tm9uZSkpLAorICAgICAgICAoJy1iJywgTlMoYj1bRXhjZXB0aW9uXSkpLAorICAgICAgICAoJy1iIC1jeCAtYiAtY3l6JywgTlMoYj1bRXhjZXB0aW9uLCAneCcsIEV4Y2VwdGlvbiwgJ3l6J10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0FjdGlvbkFwcGVuZENvbnN0V2l0aERlZmF1bHQoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHRoZSBhcHBlbmRfY29uc3QgYWN0aW9uIGZvciBhbiBPcHRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctYicsIGFjdGlvbj0nYXBwZW5kX2NvbnN0JywgY29uc3Q9RXhjZXB0aW9uLCBkZWZhdWx0PVsnWCddKSwKKyAgICAgICAgU2lnKCctYycsIGFjdGlvbj0nYXBwZW5kJywgZGVzdD0nYicpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnYScsICctYycsICdhIC1jJywgJy1ieCcsICctYiB4J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoYj1bJ1gnXSkpLAorICAgICAgICAoJy1iJywgTlMoYj1bJ1gnLCBFeGNlcHRpb25dKSksCisgICAgICAgICgnLWIgLWN4IC1iIC1jeXonLCBOUyhiPVsnWCcsIEV4Y2VwdGlvbiwgJ3gnLCBFeGNlcHRpb24sICd5eiddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNBY3Rpb25Db3VudChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgdGhlIGNvdW50IGFjdGlvbiBmb3IgYW4gT3B0aW9uYWwiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCcteCcsIGFjdGlvbj0nY291bnQnKV0KKyAgICBmYWlsdXJlcyA9IFsnYScsICcteCBhJywgJy14IGInLCAnLXggYSAteCBiJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoeD1Ob25lKSksCisgICAgICAgICgnLXgnLCBOUyh4PTEpKSwKKyAgICBdCisKKworIyA9PT09PT09PT09PT09PT09CisjIFBvc2l0aW9uYWwgdGVzdHMKKyMgPT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc05vbmUoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBQb3NpdGlvbmFsIHRoYXQgZG9lc24ndCBzcGVjaWZ5IG5hcmdzIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJyldCisgICAgZmFpbHVyZXMgPSBbJycsICcteCcsICdhIGInXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhJywgTlMoZm9vPSdhJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnczEoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBQb3NpdGlvbmFsIHRoYXQgc3BlY2lmaWVzIGFuIG5hcmdzIG9mIDEiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nLCBuYXJncz0xKV0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy14JywgJ2EgYiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EnLCBOUyhmb289WydhJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3MyKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB0aGF0IHNwZWNpZmllcyBhbiBuYXJncyBvZiAyIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9MildCisgICAgZmFpbHVyZXMgPSBbJycsICdhJywgJy14JywgJ2EgYiBjJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSBiJywgTlMoZm9vPVsnYScsICdiJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NaZXJvT3JNb3JlKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB0aGF0IHNwZWNpZmllcyB1bmxpbWl0ZWQgbmFyZ3MiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nLCBuYXJncz0nKicpXQorICAgIGZhaWx1cmVzID0gWycteCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGZvbz1bXSkpLAorICAgICAgICAoJ2EnLCBOUyhmb289WydhJ10pKSwKKyAgICAgICAgKCdhIGInLCBOUyhmb289WydhJywgJ2InXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc1plcm9Pck1vcmVEZWZhdWx0KFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB0aGF0IHNwZWNpZmllcyB1bmxpbWl0ZWQgbmFyZ3MgYW5kIGEgZGVmYXVsdCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPScqJywgZGVmYXVsdD0nYmFyJyldCisgICAgZmFpbHVyZXMgPSBbJy14J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoZm9vPSdiYXInKSksCisgICAgICAgICgnYScsIE5TKGZvbz1bJ2EnXSkpLAorICAgICAgICAoJ2EgYicsIE5TKGZvbz1bJ2EnLCAnYiddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzT25lT3JNb3JlKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB0aGF0IHNwZWNpZmllcyBvbmUgb3IgbW9yZSBuYXJncyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPScrJyldCisgICAgZmFpbHVyZXMgPSBbJycsICcteCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EnLCBOUyhmb289WydhJ10pKSwKKyAgICAgICAgKCdhIGInLCBOUyhmb289WydhJywgJ2InXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc09wdGlvbmFsKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBhbiBPcHRpb25hbCBQb3NpdGlvbmFsIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9Jz8nKV0KKyAgICBmYWlsdXJlcyA9IFsnLXgnLCAnYSBiJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoZm9vPU5vbmUpKSwKKyAgICAgICAgKCdhJywgTlMoZm9vPSdhJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc09wdGlvbmFsRGVmYXVsdChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgYW4gT3B0aW9uYWwgUG9zaXRpb25hbCB3aXRoIGEgZGVmYXVsdCB2YWx1ZSIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPSc/JywgZGVmYXVsdD00MildCisgICAgZmFpbHVyZXMgPSBbJy14JywgJ2EgYiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGZvbz00MikpLAorICAgICAgICAoJ2EnLCBOUyhmb289J2EnKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzT3B0aW9uYWxDb252ZXJ0ZWREZWZhdWx0KFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBhbiBPcHRpb25hbCBQb3NpdGlvbmFsIHdpdGggYSBkZWZhdWx0IHZhbHVlCisgICAgdGhhdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUuCisgICAgIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ2ZvbycsIG5hcmdzPSc/JywgdHlwZT1pbnQsIGRlZmF1bHQ9JzQyJyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWycteCcsICdhIGInLCAnMSAyJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoZm9vPTQyKSksCisgICAgICAgICgnMScsIE5TKGZvbz0xKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzTm9uZU5vbmUoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgdHdvIFBvc2l0aW9uYWxzIHRoYXQgZG9uJ3Qgc3BlY2lmeSBuYXJncyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycpLCBTaWcoJ2JhcicpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLXgnLCAnYScsICdhIGIgYyddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EgYicsIE5TKGZvbz0nYScsIGJhcj0nYicpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NOb25lMShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCBubyBuYXJncyBmb2xsb3dlZCBieSBvbmUgd2l0aCAxIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJyksIFNpZygnYmFyJywgbmFyZ3M9MSldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdhJywgJ2EgYiBjJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSBiJywgTlMoZm9vPSdhJywgYmFyPVsnYiddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzMk5vbmUoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBQb3NpdGlvbmFsIHdpdGggMiBuYXJncyBmb2xsb3dlZCBieSBvbmUgd2l0aCBub25lIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9MiksIFNpZygnYmFyJyldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdhJywgJ2EgYicsICdhIGIgYyBkJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289WydhJywgJ2InXSwgYmFyPSdjJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc05vbmVaZXJvT3JNb3JlKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB3aXRoIG5vIG5hcmdzIGZvbGxvd2VkIGJ5IG9uZSB3aXRoIHVubGltaXRlZCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycpLCBTaWcoJ2JhcicsIG5hcmdzPScqJyldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbyddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EnLCBOUyhmb289J2EnLCBiYXI9W10pKSwKKyAgICAgICAgKCdhIGInLCBOUyhmb289J2EnLCBiYXI9WydiJ10pKSwKKyAgICAgICAgKCdhIGIgYycsIE5TKGZvbz0nYScsIGJhcj1bJ2InLCAnYyddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzTm9uZU9uZU9yTW9yZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCBubyBuYXJncyBmb2xsb3dlZCBieSBvbmUgd2l0aCBvbmUgb3IgbW9yZSIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycpLCBTaWcoJ2JhcicsIG5hcmdzPScrJyldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdhJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSBiJywgTlMoZm9vPSdhJywgYmFyPVsnYiddKSksCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289J2EnLCBiYXI9WydiJywgJ2MnXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc05vbmVPcHRpb25hbChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCBubyBuYXJncyBmb2xsb3dlZCBieSBvbmUgd2l0aCBhbiBPcHRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycpLCBTaWcoJ2JhcicsIG5hcmdzPSc/JyldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdhIGIgYyddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EnLCBOUyhmb289J2EnLCBiYXI9Tm9uZSkpLAorICAgICAgICAoJ2EgYicsIE5TKGZvbz0nYScsIGJhcj0nYicpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NaZXJvT3JNb3JlTm9uZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCB1bmxpbWl0ZWQgbmFyZ3MgZm9sbG93ZWQgYnkgb25lIHdpdGggbm9uZSIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPScqJyksIFNpZygnYmFyJyldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbyddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EnLCBOUyhmb289W10sIGJhcj0nYScpKSwKKyAgICAgICAgKCdhIGInLCBOUyhmb289WydhJ10sIGJhcj0nYicpKSwKKyAgICAgICAgKCdhIGIgYycsIE5TKGZvbz1bJ2EnLCAnYiddLCBiYXI9J2MnKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzT25lT3JNb3JlTm9uZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCBvbmUgb3IgbW9yZSBuYXJncyBmb2xsb3dlZCBieSBvbmUgd2l0aCBub25lIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9JysnKSwgU2lnKCdiYXInKV0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy0tZm9vJywgJ2EnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhIGInLCBOUyhmb289WydhJ10sIGJhcj0nYicpKSwKKyAgICAgICAgKCdhIGIgYycsIE5TKGZvbz1bJ2EnLCAnYiddLCBiYXI9J2MnKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzT3B0aW9uYWxOb25lKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB3aXRoIGFuIE9wdGlvbmFsIG5hcmdzIGZvbGxvd2VkIGJ5IG9uZSB3aXRoIG5vbmUiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nLCBuYXJncz0nPycsIGRlZmF1bHQ9NDIpLCBTaWcoJ2JhcicpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nLCAnYSBiIGMnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhJywgTlMoZm9vPTQyLCBiYXI9J2EnKSksCisgICAgICAgICgnYSBiJywgTlMoZm9vPSdhJywgYmFyPSdiJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnczJaZXJvT3JNb3JlKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB3aXRoIDIgbmFyZ3MgZm9sbG93ZWQgYnkgb25lIHdpdGggdW5saW1pdGVkIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9MiksIFNpZygnYmFyJywgbmFyZ3M9JyonKV0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy0tZm9vJywgJ2EnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhIGInLCBOUyhmb289WydhJywgJ2InXSwgYmFyPVtdKSksCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289WydhJywgJ2InXSwgYmFyPVsnYyddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzMk9uZU9yTW9yZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCAyIG5hcmdzIGZvbGxvd2VkIGJ5IG9uZSB3aXRoIG9uZSBvciBtb3JlIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9MiksIFNpZygnYmFyJywgbmFyZ3M9JysnKV0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy0tZm9vJywgJ2EnLCAnYSBiJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289WydhJywgJ2InXSwgYmFyPVsnYyddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzMk9wdGlvbmFsKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB3aXRoIDIgbmFyZ3MgZm9sbG93ZWQgYnkgb25lIG9wdGlvbmFsIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9MiksIFNpZygnYmFyJywgbmFyZ3M9Jz8nKV0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy0tZm9vJywgJ2EnLCAnYSBiIGMgZCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EgYicsIE5TKGZvbz1bJ2EnLCAnYiddLCBiYXI9Tm9uZSkpLAorICAgICAgICAoJ2EgYiBjJywgTlMoZm9vPVsnYScsICdiJ10sIGJhcj0nYycpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NaZXJvT3JNb3JlMShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCB1bmxpbWl0ZWQgbmFyZ3MgZm9sbG93ZWQgYnkgb25lIHdpdGggMSIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPScqJyksIFNpZygnYmFyJywgbmFyZ3M9MSldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsIF0KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYScsIE5TKGZvbz1bXSwgYmFyPVsnYSddKSksCisgICAgICAgICgnYSBiJywgTlMoZm9vPVsnYSddLCBiYXI9WydiJ10pKSwKKyAgICAgICAgKCdhIGIgYycsIE5TKGZvbz1bJ2EnLCAnYiddLCBiYXI9WydjJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NPbmVPck1vcmUxKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB3aXRoIG9uZSBvciBtb3JlIG5hcmdzIGZvbGxvd2VkIGJ5IG9uZSB3aXRoIDEiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nLCBuYXJncz0nKycpLCBTaWcoJ2JhcicsIG5hcmdzPTEpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nLCAnYSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EgYicsIE5TKGZvbz1bJ2EnXSwgYmFyPVsnYiddKSksCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289WydhJywgJ2InXSwgYmFyPVsnYyddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzT3B0aW9uYWwxKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB3aXRoIGFuIE9wdGlvbmFsIG5hcmdzIGZvbGxvd2VkIGJ5IG9uZSB3aXRoIDEiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nLCBuYXJncz0nPycpLCBTaWcoJ2JhcicsIG5hcmdzPTEpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nLCAnYSBiIGMnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhJywgTlMoZm9vPU5vbmUsIGJhcj1bJ2EnXSkpLAorICAgICAgICAoJ2EgYicsIE5TKGZvbz0nYScsIGJhcj1bJ2InXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc05vbmVaZXJvT3JNb3JlMShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aHJlZSBQb3NpdGlvbmFsczogbm8gbmFyZ3MsIHVubGltaXRlZCBuYXJncyBhbmQgMSBuYXJncyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCdmb28nKSwKKyAgICAgICAgU2lnKCdiYXInLCBuYXJncz0nKicpLAorICAgICAgICBTaWcoJ2JheicsIG5hcmdzPTEpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy0tZm9vJywgJ2EnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhIGInLCBOUyhmb289J2EnLCBiYXI9W10sIGJhej1bJ2InXSkpLAorICAgICAgICAoJ2EgYiBjJywgTlMoZm9vPSdhJywgYmFyPVsnYiddLCBiYXo9WydjJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NOb25lT25lT3JNb3JlMShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aHJlZSBQb3NpdGlvbmFsczogbm8gbmFyZ3MsIG9uZSBvciBtb3JlIG5hcmdzIGFuZCAxIG5hcmdzIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ2ZvbycpLAorICAgICAgICBTaWcoJ2JhcicsIG5hcmdzPScrJyksCisgICAgICAgIFNpZygnYmF6JywgbmFyZ3M9MSksCisgICAgXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nLCAnYScsICdiJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289J2EnLCBiYXI9WydiJ10sIGJhej1bJ2MnXSkpLAorICAgICAgICAoJ2EgYiBjIGQnLCBOUyhmb289J2EnLCBiYXI9WydiJywgJ2MnXSwgYmF6PVsnZCddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzTm9uZU9wdGlvbmFsMShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aHJlZSBQb3NpdGlvbmFsczogbm8gbmFyZ3MsIG9wdGlvbmFsIG5hcmcgYW5kIDEgbmFyZ3MiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnZm9vJyksCisgICAgICAgIFNpZygnYmFyJywgbmFyZ3M9Jz8nLCBkZWZhdWx0PTAuNjI1KSwKKyAgICAgICAgU2lnKCdiYXonLCBuYXJncz0xKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdhJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSBiJywgTlMoZm9vPSdhJywgYmFyPTAuNjI1LCBiYXo9WydiJ10pKSwKKyAgICAgICAgKCdhIGIgYycsIE5TKGZvbz0nYScsIGJhcj0nYicsIGJhej1bJ2MnXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc09wdGlvbmFsT3B0aW9uYWwoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgdHdvIG9wdGlvbmFsIG5hcmdzIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ2ZvbycsIG5hcmdzPSc/JyksCisgICAgICAgIFNpZygnYmFyJywgbmFyZ3M9Jz8nLCBkZWZhdWx0PTQyKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJy0tZm9vJywgJ2EgYiBjJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoZm9vPU5vbmUsIGJhcj00MikpLAorICAgICAgICAoJ2EnLCBOUyhmb289J2EnLCBiYXI9NDIpKSwKKyAgICAgICAgKCdhIGInLCBOUyhmb289J2EnLCBiYXI9J2InKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzT3B0aW9uYWxaZXJvT3JNb3JlKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGFuIE9wdGlvbmFsIG5hcmcgZm9sbG93ZWQgYnkgdW5saW1pdGVkIG5hcmdzIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9Jz8nKSwgU2lnKCdiYXInLCBuYXJncz0nKicpXQorICAgIGZhaWx1cmVzID0gWyctLWZvbyddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGZvbz1Ob25lLCBiYXI9W10pKSwKKyAgICAgICAgKCdhJywgTlMoZm9vPSdhJywgYmFyPVtdKSksCisgICAgICAgICgnYSBiJywgTlMoZm9vPSdhJywgYmFyPVsnYiddKSksCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289J2EnLCBiYXI9WydiJywgJ2MnXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc09wdGlvbmFsT25lT3JNb3JlKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGFuIE9wdGlvbmFsIG5hcmcgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgbmFyZ3MiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nLCBuYXJncz0nPycpLCBTaWcoJ2JhcicsIG5hcmdzPScrJyldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbyddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EnLCBOUyhmb289Tm9uZSwgYmFyPVsnYSddKSksCisgICAgICAgICgnYSBiJywgTlMoZm9vPSdhJywgYmFyPVsnYiddKSksCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289J2EnLCBiYXI9WydiJywgJ2MnXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNDaG9pY2VzU3RyaW5nKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgc2V0IG9mIHNpbmdsZS1jaGFyYWN0ZXIgY2hvaWNlcyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ3NwYW0nLCBjaG9pY2VzPXNldCgnYWJjZGVmZycpKV0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy0tZm9vJywgJ2gnLCAnNDInLCAnZWYnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhJywgTlMoc3BhbT0nYScpKSwKKyAgICAgICAgKCdnJywgTlMoc3BhbT0nZycpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzQ2hvaWNlc0ludChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIHNldCBvZiBpbnRlZ2VyIGNob2ljZXMiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdzcGFtJywgdHlwZT1pbnQsIGNob2ljZXM9cmFuZ2UoMjApKV0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy0tZm9vJywgJ2gnLCAnNDInLCAnZWYnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCc0JywgTlMoc3BhbT00KSksCisgICAgICAgICgnMTUnLCBOUyhzcGFtPTE1KSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc0FjdGlvbkFwcGVuZChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGUgJ2FwcGVuZCcgYWN0aW9uIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ3NwYW0nLCBhY3Rpb249J2FwcGVuZCcpLAorICAgICAgICBTaWcoJ3NwYW0nLCBhY3Rpb249J2FwcGVuZCcsIG5hcmdzPTIpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy0tZm9vJywgJ2EnLCAnYSBiJywgJ2EgYiBjIGQnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhIGIgYycsIE5TKHNwYW09WydhJywgWydiJywgJ2MnXV0pKSwKKyAgICBdCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBDb21iaW5lZCBvcHRpb25hbHMgYW5kIHBvc2l0aW9uYWxzIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdE9wdGlvbmFsc051bWVyaWNBbmRQb3NpdGlvbmFscyhQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgbmVnYXRpdmUgbnVtYmVyIGFyZ3Mgd2hlbiBudW1lcmljIG9wdGlvbnMgYXJlIHByZXNlbnQiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygneCcsIG5hcmdzPSc/JyksCisgICAgICAgIFNpZygnLTQnLCBkZXN0PSd5JywgYWN0aW9uPSdzdG9yZV90cnVlJyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWyctMicsICctMzE1J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoeD1Ob25lLCB5PUZhbHNlKSksCisgICAgICAgICgnYScsIE5TKHg9J2EnLCB5PUZhbHNlKSksCisgICAgICAgICgnLTQnLCBOUyh4PU5vbmUsIHk9VHJ1ZSkpLAorICAgICAgICAoJy00IGEnLCBOUyh4PSdhJywgeT1UcnVlKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNBbG1vc3ROdW1lcmljQW5kUG9zaXRpb25hbHMoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIG5lZ2F0aXZlIG51bWJlciBhcmdzIHdoZW4gYWxtb3N0IG51bWVyaWMgb3B0aW9ucyBhcmUgcHJlc2VudCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCd4JywgbmFyZ3M9Jz8nKSwKKyAgICAgICAgU2lnKCctazQnLCBkZXN0PSd5JywgYWN0aW9uPSdzdG9yZV90cnVlJyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWyctazMnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh4PU5vbmUsIHk9RmFsc2UpKSwKKyAgICAgICAgKCctMicsIE5TKHg9Jy0yJywgeT1GYWxzZSkpLAorICAgICAgICAoJ2EnLCBOUyh4PSdhJywgeT1GYWxzZSkpLAorICAgICAgICAoJy1rNCcsIE5TKHg9Tm9uZSwgeT1UcnVlKSksCisgICAgICAgICgnLWs0IGEnLCBOUyh4PSdhJywgeT1UcnVlKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RFbXB0eUFuZFNwYWNlQ29udGFpbmluZ0FyZ3VtZW50cyhQYXJzZXJUZXN0Q2FzZSk6CisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ3gnLCBuYXJncz0nPycpLAorICAgICAgICBTaWcoJy15JywgJy0teXl5JywgZGVzdD0neScpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLXknXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKFsnJ10sIE5TKHg9JycsIHk9Tm9uZSkpLAorICAgICAgICAoWydhIGJhZGdlciddLCBOUyh4PSdhIGJhZGdlcicsIHk9Tm9uZSkpLAorICAgICAgICAoWyctYSBiYWRnZXInXSwgTlMoeD0nLWEgYmFkZ2VyJywgeT1Ob25lKSksCisgICAgICAgIChbJy15JywgJyddLCBOUyh4PU5vbmUsIHk9JycpKSwKKyAgICAgICAgKFsnLXknLCAnYSBiYWRnZXInXSwgTlMoeD1Ob25lLCB5PSdhIGJhZGdlcicpKSwKKyAgICAgICAgKFsnLXknLCAnLWEgYmFkZ2VyJ10sIE5TKHg9Tm9uZSwgeT0nLWEgYmFkZ2VyJykpLAorICAgICAgICAoWyctLXl5eT1hIGJhZGdlciddLCBOUyh4PU5vbmUsIHk9J2EgYmFkZ2VyJykpLAorICAgICAgICAoWyctLXl5eT0tYSBiYWRnZXInXSwgTlMoeD1Ob25lLCB5PSctYSBiYWRnZXInKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQcmVmaXhDaGFyYWN0ZXJPbmx5QXJndW1lbnRzKFBhcnNlclRlc3RDYXNlKToKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJlZml4X2NoYXJzPSctKycpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctJywgZGVzdD0neCcsIG5hcmdzPSc/JywgY29uc3Q9J2JhZGdlcicpLAorICAgICAgICBTaWcoJysnLCBkZXN0PSd5JywgdHlwZT1pbnQsIGRlZmF1bHQ9NDIpLAorICAgICAgICBTaWcoJy0rLScsIGRlc3Q9J3onLCBhY3Rpb249J3N0b3JlX3RydWUnKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJy15JywgJysgLSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHg9Tm9uZSwgeT00Miwgej1GYWxzZSkpLAorICAgICAgICAoJy0nLCBOUyh4PSdiYWRnZXInLCB5PTQyLCB6PUZhbHNlKSksCisgICAgICAgICgnLSBYJywgTlMoeD0nWCcsIHk9NDIsIHo9RmFsc2UpKSwKKyAgICAgICAgKCcrIC0zJywgTlMoeD1Ob25lLCB5PS0zLCB6PUZhbHNlKSksCisgICAgICAgICgnLSstJywgTlMoeD1Ob25lLCB5PTQyLCB6PVRydWUpKSwKKyAgICAgICAgKCctID09PScsIE5TKHg9Jz09PScsIHk9NDIsIHo9RmFsc2UpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE5hcmdzWmVyb09yTW9yZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgc3BlY2lmeWluZyBhbiBhcmdzIGZvciBhbiBPcHRpb25hbCB0aGF0IGFjY2VwdHMgemVybyBvciBtb3JlIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnLXgnLCBuYXJncz0nKicpLCBTaWcoJ3knLCBuYXJncz0nKicpXQorICAgIGZhaWx1cmVzID0gW10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoeD1Ob25lLCB5PVtdKSksCisgICAgICAgICgnLXgnLCBOUyh4PVtdLCB5PVtdKSksCisgICAgICAgICgnLXggYScsIE5TKHg9WydhJ10sIHk9W10pKSwKKyAgICAgICAgKCcteCBhIC0tIGInLCBOUyh4PVsnYSddLCB5PVsnYiddKSksCisgICAgICAgICgnYScsIE5TKHg9Tm9uZSwgeT1bJ2EnXSkpLAorICAgICAgICAoJ2EgLXgnLCBOUyh4PVtdLCB5PVsnYSddKSksCisgICAgICAgICgnYSAteCBiJywgTlMoeD1bJ2InXSwgeT1bJ2EnXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0TmFyZ3NSZW1haW5kZXIoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHNwZWNpZnlpbmcgYSBwb3NpdGlvbmFsIHdpdGggbmFyZ3M9UkVNQUlOREVSIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygneCcpLCBTaWcoJ3knLCBuYXJncz0nLi4uJyksIFNpZygnLXonKV0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy16JywgJy16IFonXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdYJywgTlMoeD0nWCcsIHk9W10sIHo9Tm9uZSkpLAorICAgICAgICAoJy16IFogWCcsIE5TKHg9J1gnLCB5PVtdLCB6PSdaJykpLAorICAgICAgICAoJ1ggQSBCIC16IFonLCBOUyh4PSdYJywgeT1bJ0EnLCAnQicsICcteicsICdaJ10sIHo9Tm9uZSkpLAorICAgICAgICAoJ1ggWSAtLWZvbycsIE5TKHg9J1gnLCB5PVsnWScsICctLWZvbyddLCB6PU5vbmUpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbkxpa2UoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIG9wdGlvbnMgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBhcmd1bWVudHMiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCB0eXBlPWZsb2F0KSwKKyAgICAgICAgU2lnKCctMycsIHR5cGU9ZmxvYXQsIGRlc3Q9J3knKSwKKyAgICAgICAgU2lnKCd6JywgbmFyZ3M9JyonKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJy14JywgJy15Mi41JywgJy14YScsICcteCAtYScsCisgICAgICAgICAgICAgICAgJy14IC0zJywgJy14IC0zLjUnLCAnLTMgLTMuNScsCisgICAgICAgICAgICAgICAgJy14IC0yLjUnLCAnLXggLTIuNSBhJywgJy0zIC0uNScsCisgICAgICAgICAgICAgICAgJ2EgeCAtMScsICcteCAtMSBhJywgJy0zIC0xIGEnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh4PU5vbmUsIHk9Tm9uZSwgej1bXSkpLAorICAgICAgICAoJy14IDIuNScsIE5TKHg9Mi41LCB5PU5vbmUsIHo9W10pKSwKKyAgICAgICAgKCcteCAyLjUgYScsIE5TKHg9Mi41LCB5PU5vbmUsIHo9WydhJ10pKSwKKyAgICAgICAgKCctMy41JywgTlMoeD1Ob25lLCB5PTAuNSwgej1bXSkpLAorICAgICAgICAoJy0zLS41JywgTlMoeD1Ob25lLCB5PS0wLjUsIHo9W10pKSwKKyAgICAgICAgKCctMyAuNScsIE5TKHg9Tm9uZSwgeT0wLjUsIHo9W10pKSwKKyAgICAgICAgKCdhIC0zLjUnLCBOUyh4PU5vbmUsIHk9MC41LCB6PVsnYSddKSksCisgICAgICAgICgnYScsIE5TKHg9Tm9uZSwgeT1Ob25lLCB6PVsnYSddKSksCisgICAgICAgICgnYSAteCAxJywgTlMoeD0xLjAsIHk9Tm9uZSwgej1bJ2EnXSkpLAorICAgICAgICAoJy14IDEgYScsIE5TKHg9MS4wLCB5PU5vbmUsIHo9WydhJ10pKSwKKyAgICAgICAgKCctMyAxIGEnLCBOUyh4PU5vbmUsIHk9MS4wLCB6PVsnYSddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3REZWZhdWx0U3VwcHJlc3MoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYWN0aW9ucyB3aXRoIHN1cHByZXNzZWQgZGVmYXVsdHMiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnZm9vJywgbmFyZ3M9Jz8nLCBkZWZhdWx0PWFyZ3BhcnNlLlNVUFBSRVNTKSwKKyAgICAgICAgU2lnKCdiYXInLCBuYXJncz0nKicsIGRlZmF1bHQ9YXJncGFyc2UuU1VQUFJFU1MpLAorICAgICAgICBTaWcoJy0tYmF6JywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1hcmdwYXJzZS5TVVBQUkVTUyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWycteCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKCkpLAorICAgICAgICAoJ2EnLCBOUyhmb289J2EnKSksCisgICAgICAgICgnYSBiJywgTlMoZm9vPSdhJywgYmFyPVsnYiddKSksCisgICAgICAgICgnLS1iYXonLCBOUyhiYXo9VHJ1ZSkpLAorICAgICAgICAoJ2EgLS1iYXonLCBOUyhmb289J2EnLCBiYXo9VHJ1ZSkpLAorICAgICAgICAoJy0tYmF6IGEgYicsIE5TKGZvbz0nYScsIGJhcj1bJ2InXSwgYmF6PVRydWUpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBhcnNlckRlZmF1bHRTdXBwcmVzcyhQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhY3Rpb25zIHdpdGggYSBwYXJzZXItbGV2ZWwgZGVmYXVsdCBvZiBTVVBQUkVTUyIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhhcmd1bWVudF9kZWZhdWx0PWFyZ3BhcnNlLlNVUFBSRVNTKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnZm9vJywgbmFyZ3M9Jz8nKSwKKyAgICAgICAgU2lnKCdiYXInLCBuYXJncz0nKicpLAorICAgICAgICBTaWcoJy0tYmF6JywgYWN0aW9uPSdzdG9yZV90cnVlJyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWycteCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKCkpLAorICAgICAgICAoJ2EnLCBOUyhmb289J2EnKSksCisgICAgICAgICgnYSBiJywgTlMoZm9vPSdhJywgYmFyPVsnYiddKSksCisgICAgICAgICgnLS1iYXonLCBOUyhiYXo9VHJ1ZSkpLAorICAgICAgICAoJ2EgLS1iYXonLCBOUyhmb289J2EnLCBiYXo9VHJ1ZSkpLAorICAgICAgICAoJy0tYmF6IGEgYicsIE5TKGZvbz0nYScsIGJhcj1bJ2InXSwgYmF6PVRydWUpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBhcnNlckRlZmF1bHQ0MihQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhY3Rpb25zIHdpdGggYSBwYXJzZXItbGV2ZWwgZGVmYXVsdCBvZiA0MiIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhhcmd1bWVudF9kZWZhdWx0PTQyLCB2ZXJzaW9uPScxLjAnKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnZm9vJywgbmFyZ3M9Jz8nKSwKKyAgICAgICAgU2lnKCdiYXInLCBuYXJncz0nKicpLAorICAgICAgICBTaWcoJy0tYmF6JywgYWN0aW9uPSdzdG9yZV90cnVlJyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWycteCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGZvbz00MiwgYmFyPTQyLCBiYXo9NDIpKSwKKyAgICAgICAgKCdhJywgTlMoZm9vPSdhJywgYmFyPTQyLCBiYXo9NDIpKSwKKyAgICAgICAgKCdhIGInLCBOUyhmb289J2EnLCBiYXI9WydiJ10sIGJhej00MikpLAorICAgICAgICAoJy0tYmF6JywgTlMoZm9vPTQyLCBiYXI9NDIsIGJhej1UcnVlKSksCisgICAgICAgICgnYSAtLWJheicsIE5TKGZvbz0nYScsIGJhcj00MiwgYmF6PVRydWUpKSwKKyAgICAgICAgKCctLWJheiBhIGInLCBOUyhmb289J2EnLCBiYXI9WydiJ10sIGJhej1UcnVlKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RBcmd1bWVudHNGcm9tRmlsZShUZW1wRGlyTWl4aW4sIFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHJlYWRpbmcgYXJndW1lbnRzIGZyb20gYSBmaWxlIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RBcmd1bWVudHNGcm9tRmlsZSwgc2VsZikuc2V0VXAoKQorICAgICAgICBmaWxlX3RleHRzID0gWworICAgICAgICAgICAgKCdoZWxsbycsICdoZWxsbyB3b3JsZCFcbicpLAorICAgICAgICAgICAgKCdyZWN1cnNpdmUnLCAnLWFcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ0BoZWxsbycpLAorICAgICAgICAgICAgKCdpbnZhbGlkJywgJ0Buby1zdWNoLXBhdGhcbicpLAorICAgICAgICBdCisgICAgICAgIGZvciBwYXRoLCB0ZXh0IGluIGZpbGVfdGV4dHM6CisgICAgICAgICAgICBmaWxlID0gb3BlbihwYXRoLCAndycpCisgICAgICAgICAgICBmaWxlLndyaXRlKHRleHQpCisgICAgICAgICAgICBmaWxlLmNsb3NlKCkKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcoZnJvbWZpbGVfcHJlZml4X2NoYXJzPSdAJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy1hJyksCisgICAgICAgIFNpZygneCcpLAorICAgICAgICBTaWcoJ3knLCBuYXJncz0nKycpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy1iJywgJ1gnLCAnQGludmFsaWQnLCAnQG1pc3NpbmcnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdYIFknLCBOUyhhPU5vbmUsIHg9J1gnLCB5PVsnWSddKSksCisgICAgICAgICgnWCAtYSBBIFkgWicsIE5TKGE9J0EnLCB4PSdYJywgeT1bJ1knLCAnWiddKSksCisgICAgICAgICgnQGhlbGxvIFgnLCBOUyhhPU5vbmUsIHg9J2hlbGxvIHdvcmxkIScsIHk9WydYJ10pKSwKKyAgICAgICAgKCdYIEBoZWxsbycsIE5TKGE9Tm9uZSwgeD0nWCcsIHk9WydoZWxsbyB3b3JsZCEnXSkpLAorICAgICAgICAoJy1hIEIgQHJlY3Vyc2l2ZSBZIFonLCBOUyhhPSdBJywgeD0naGVsbG8gd29ybGQhJywgeT1bJ1knLCAnWiddKSksCisgICAgICAgICgnWCBAcmVjdXJzaXZlIFogLWEgQicsIE5TKGE9J0InLCB4PSdYJywgeT1bJ2hlbGxvIHdvcmxkIScsICdaJ10pKSwKKyAgICAgICAgKFsiLWEiLCAiIiwgIlgiLCAiWSJdLCBOUyhhPScnLCB4PSdYJywgeT1bJ1knXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0QXJndW1lbnRzRnJvbUZpbGVDb252ZXJ0ZXIoVGVtcERpck1peGluLCBQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCByZWFkaW5nIGFyZ3VtZW50cyBmcm9tIGEgZmlsZSIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0QXJndW1lbnRzRnJvbUZpbGVDb252ZXJ0ZXIsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgZmlsZV90ZXh0cyA9IFsKKyAgICAgICAgICAgICgnaGVsbG8nLCAnaGVsbG8gd29ybGQhXG4nKSwKKyAgICAgICAgXQorICAgICAgICBmb3IgcGF0aCwgdGV4dCBpbiBmaWxlX3RleHRzOgorICAgICAgICAgICAgZmlsZSA9IG9wZW4ocGF0aCwgJ3cnKQorICAgICAgICAgICAgZmlsZS53cml0ZSh0ZXh0KQorICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisKKyAgICBjbGFzcyBGcm9tRmlsZUNvbnZlcnRlckFyZ3VtZW50UGFyc2VyKEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKToKKworICAgICAgICBkZWYgY29udmVydF9hcmdfbGluZV90b19hcmdzKHNlbGYsIGFyZ19saW5lKToKKyAgICAgICAgICAgIGZvciBhcmcgaW4gYXJnX2xpbmUuc3BsaXQoKToKKyAgICAgICAgICAgICAgICBpZiBub3QgYXJnLnN0cmlwKCk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgeWllbGQgYXJnCisgICAgcGFyc2VyX2NsYXNzID0gRnJvbUZpbGVDb252ZXJ0ZXJBcmd1bWVudFBhcnNlcgorICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcoZnJvbWZpbGVfcHJlZml4X2NoYXJzPSdAJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ3knLCBuYXJncz0nKycpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFtdCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ0BoZWxsbyBYJywgTlMoeT1bJ2hlbGxvJywgJ3dvcmxkIScsICdYJ10pKSwKKyAgICBdCisKKworIyA9PT09PT09PT09PT09PT09PT09PT0KKyMgVHlwZSBjb252ZXJzaW9uIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0RmlsZVR5cGVSZXByKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3Ioc2VsZik6CisgICAgICAgIHR5cGUgPSBhcmdwYXJzZS5GaWxlVHlwZSgncicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkZpbGVUeXBlKCdyJykiLCByZXByKHR5cGUpKQorCisgICAgZGVmIHRlc3Rfd2JfMShzZWxmKToKKyAgICAgICAgdHlwZSA9IGFyZ3BhcnNlLkZpbGVUeXBlKCd3YicsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkZpbGVUeXBlKCd3YicsIDEpIiwgcmVwcih0eXBlKSkKKworCitjbGFzcyBSRmlsZShvYmplY3QpOgorICAgIHNlZW4gPSB7fQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICBfX2hhc2hfXyA9IE5vbmUKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBvdGhlciBpbiBzZWxmLnNlZW46CisgICAgICAgICAgICB0ZXh0ID0gc2VsZi5zZWVuW290aGVyXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGV4dCA9IHNlbGYuc2VlbltvdGhlcl0gPSBvdGhlci5yZWFkKCkKKyAgICAgICAgICAgIG90aGVyLmNsb3NlKCkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodGV4dCwgc3RyKToKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LmRlY29kZSgnYXNjaWknKQorICAgICAgICByZXR1cm4gc2VsZi5uYW1lID09IG90aGVyLm5hbWUgPT0gdGV4dAorCisKK2NsYXNzIFRlc3RGaWxlVHlwZVIoVGVtcERpck1peGluLCBQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGUgRmlsZVR5cGUgb3B0aW9uL2FyZ3VtZW50IHR5cGUgZm9yIHJlYWRpbmcgZmlsZXMiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdEZpbGVUeXBlUiwgc2VsZikuc2V0VXAoKQorICAgICAgICBmb3IgZmlsZV9uYW1lIGluIFsnZm9vJywgJ2JhciddOgorICAgICAgICAgICAgZmlsZSA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYudGVtcF9kaXIsIGZpbGVfbmFtZSksICd3JykKKyAgICAgICAgICAgIGZpbGUud3JpdGUoZmlsZV9uYW1lKQorICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgIHNlbGYuY3JlYXRlX3JlYWRvbmx5X2ZpbGUoJ3JlYWRvbmx5JykKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCkpLAorICAgICAgICBTaWcoJ3NwYW0nLCB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJykpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLXgnLCAnLXggYmFyJywgJ25vbi1leGlzdGVudC1maWxlLnR4dCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2ZvbycsIE5TKHg9Tm9uZSwgc3BhbT1SRmlsZSgnZm9vJykpKSwKKyAgICAgICAgKCcteCBmb28gYmFyJywgTlMoeD1SRmlsZSgnZm9vJyksIHNwYW09UkZpbGUoJ2JhcicpKSksCisgICAgICAgICgnYmFyIC14IGZvbycsIE5TKHg9UkZpbGUoJ2ZvbycpLCBzcGFtPVJGaWxlKCdiYXInKSkpLAorICAgICAgICAoJy14IC0gLScsIE5TKHg9c3lzLnN0ZGluLCBzcGFtPXN5cy5zdGRpbikpLAorICAgICAgICAoJ3JlYWRvbmx5JywgTlMoeD1Ob25lLCBzcGFtPVJGaWxlKCdyZWFkb25seScpKSksCisgICAgXQorCitjbGFzcyBUZXN0RmlsZVR5cGVEZWZhdWx0cyhUZW1wRGlyTWl4aW4sIFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgYSBmaWxlIGlzIG5vdCBjcmVhdGVkIHVubGVzcyB0aGUgZGVmYXVsdCBpcyBuZWVkZWQiIiIKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RGaWxlVHlwZURlZmF1bHRzLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIGZpbGUgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLnRlbXBfZGlyLCAnZ29vZCcpLCAndycpCisgICAgICAgIGZpbGUud3JpdGUoJ2dvb2QnKQorICAgICAgICBmaWxlLmNsb3NlKCkKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLWMnLCB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksIGRlZmF1bHQ9J25vLWZpbGUudHh0JyksCisgICAgXQorICAgICMgc2hvdWxkIHByb3Zva2Ugbm8gc3VjaCBmaWxlIGVycm9yCisgICAgZmFpbHVyZXMgPSBbJyddCisgICAgIyBzaG91bGQgbm90IHByb3Zva2UgZXJyb3IgYmVjYXVzZSBkZWZhdWx0IGZpbGUgaXMgY3JlYXRlZAorICAgIHN1Y2Nlc3NlcyA9IFsoJy1jIGdvb2QnLCBOUyhjPVJGaWxlKCdnb29kJykpKV0KKworCitjbGFzcyBUZXN0RmlsZVR5cGVSQihUZW1wRGlyTWl4aW4sIFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoZSBGaWxlVHlwZSBvcHRpb24vYXJndW1lbnQgdHlwZSBmb3IgcmVhZGluZyBmaWxlcyIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0RmlsZVR5cGVSQiwgc2VsZikuc2V0VXAoKQorICAgICAgICBmb3IgZmlsZV9uYW1lIGluIFsnZm9vJywgJ2JhciddOgorICAgICAgICAgICAgZmlsZSA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYudGVtcF9kaXIsIGZpbGVfbmFtZSksICd3JykKKyAgICAgICAgICAgIGZpbGUud3JpdGUoZmlsZV9uYW1lKQorICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncmInKSksCisgICAgICAgIFNpZygnc3BhbScsIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3JiJykpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLXgnLCAnLXggYmFyJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnZm9vJywgTlMoeD1Ob25lLCBzcGFtPVJGaWxlKCdmb28nKSkpLAorICAgICAgICAoJy14IGZvbyBiYXInLCBOUyh4PVJGaWxlKCdmb28nKSwgc3BhbT1SRmlsZSgnYmFyJykpKSwKKyAgICAgICAgKCdiYXIgLXggZm9vJywgTlMoeD1SRmlsZSgnZm9vJyksIHNwYW09UkZpbGUoJ2JhcicpKSksCisgICAgICAgICgnLXggLSAtJywgTlMoeD1zeXMuc3RkaW4sIHNwYW09c3lzLnN0ZGluKSksCisgICAgXQorCisKK2NsYXNzIFdGaWxlKG9iamVjdCk6CisgICAgc2VlbiA9IHNldCgpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgIF9faGFzaF9fID0gTm9uZQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG90aGVyIG5vdCBpbiBzZWxmLnNlZW46CisgICAgICAgICAgICB0ZXh0ID0gJ0NoZWNrIHRoYXQgZmlsZSBpcyB3cml0YWJsZS4nCisgICAgICAgICAgICBpZiAnYicgaW4gb3RoZXIubW9kZToKKyAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5lbmNvZGUoJ2FzY2lpJykKKyAgICAgICAgICAgIG90aGVyLndyaXRlKHRleHQpCisgICAgICAgICAgICBvdGhlci5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLnNlZW4uYWRkKG90aGVyKQorICAgICAgICByZXR1cm4gc2VsZi5uYW1lID09IG90aGVyLm5hbWUKKworCitAdW5pdHRlc3Quc2tpcElmKGhhc2F0dHIob3MsICdnZXRldWlkJykgYW5kIG9zLmdldGV1aWQoKSA9PSAwLAorICAgICAgICAgICAgICAgICAibm9uLXJvb3QgdXNlciByZXF1aXJlZCIpCitjbGFzcyBUZXN0RmlsZVR5cGVXKFRlbXBEaXJNaXhpbiwgUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIEZpbGVUeXBlIG9wdGlvbi9hcmd1bWVudCB0eXBlIGZvciB3cml0aW5nIGZpbGVzIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RGaWxlVHlwZVcsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5jcmVhdGVfcmVhZG9ubHlfZmlsZSgncmVhZG9ubHknKQorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcteCcsIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3cnKSksCisgICAgICAgIFNpZygnc3BhbScsIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3cnKSksCisgICAgXQorICAgIGZhaWx1cmVzID0gWycteCcsICcteCBiYXInXQorICAgIGZhaWx1cmVzID0gWycteCcsICcteCBiYXInLCAncmVhZG9ubHknXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdmb28nLCBOUyh4PU5vbmUsIHNwYW09V0ZpbGUoJ2ZvbycpKSksCisgICAgICAgICgnLXggZm9vIGJhcicsIE5TKHg9V0ZpbGUoJ2ZvbycpLCBzcGFtPVdGaWxlKCdiYXInKSkpLAorICAgICAgICAoJ2JhciAteCBmb28nLCBOUyh4PVdGaWxlKCdmb28nKSwgc3BhbT1XRmlsZSgnYmFyJykpKSwKKyAgICAgICAgKCcteCAtIC0nLCBOUyh4PXN5cy5zdGRvdXQsIHNwYW09c3lzLnN0ZG91dCkpLAorICAgIF0KKworCitjbGFzcyBUZXN0RmlsZVR5cGVXQihUZW1wRGlyTWl4aW4sIFBhcnNlclRlc3RDYXNlKToKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCd3YicpKSwKKyAgICAgICAgU2lnKCdzcGFtJywgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgnd2InKSksCisgICAgXQorICAgIGZhaWx1cmVzID0gWycteCcsICcteCBiYXInXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdmb28nLCBOUyh4PU5vbmUsIHNwYW09V0ZpbGUoJ2ZvbycpKSksCisgICAgICAgICgnLXggZm9vIGJhcicsIE5TKHg9V0ZpbGUoJ2ZvbycpLCBzcGFtPVdGaWxlKCdiYXInKSkpLAorICAgICAgICAoJ2JhciAteCBmb28nLCBOUyh4PVdGaWxlKCdmb28nKSwgc3BhbT1XRmlsZSgnYmFyJykpKSwKKyAgICAgICAgKCcteCAtIC0nLCBOUyh4PXN5cy5zdGRvdXQsIHNwYW09c3lzLnN0ZG91dCkpLAorICAgIF0KKworCitjbGFzcyBUZXN0VHlwZUNhbGxhYmxlKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHNvbWUgY2FsbGFibGVzIGFzIG9wdGlvbi9hcmd1bWVudCB0eXBlcyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctLWVnZ3MnLCB0eXBlPWNvbXBsZXgpLAorICAgICAgICBTaWcoJ3NwYW0nLCB0eXBlPWZsb2F0KSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJ2EnLCAnNDJqJywgJy0tZWdncyBhJywgJy0tZWdncyAyaSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJy0tZWdncz00MiA0MicsIE5TKGVnZ3M9NDIsIHNwYW09NDIuMCkpLAorICAgICAgICAoJy0tZWdncyAyaiAtLSAtMS41JywgTlMoZWdncz0yaiwgc3BhbT0tMS41KSksCisgICAgICAgICgnMTAyNC42NzUnLCBOUyhlZ2dzPU5vbmUsIHNwYW09MTAyNC42NzUpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFR5cGVVc2VyRGVmaW5lZChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIHVzZXItZGVmaW5lZCBvcHRpb24vYXJndW1lbnQgdHlwZSIiIgorCisgICAgY2xhc3MgTXlUeXBlKFRlc3RDYXNlKToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisKKyAgICAgICAgX19oYXNoX18gPSBOb25lCisKKyAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gKHR5cGUoc2VsZiksIHNlbGYudmFsdWUpID09ICh0eXBlKG90aGVyKSwgb3RoZXIudmFsdWUpCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgdHlwZT1NeVR5cGUpLAorICAgICAgICBTaWcoJ3NwYW0nLCB0eXBlPU15VHlwZSksCisgICAgXQorICAgIGZhaWx1cmVzID0gW10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSAteCBiJywgTlMoeD1NeVR5cGUoJ2InKSwgc3BhbT1NeVR5cGUoJ2EnKSkpLAorICAgICAgICAoJy14ZiBnJywgTlMoeD1NeVR5cGUoJ2YnKSwgc3BhbT1NeVR5cGUoJ2cnKSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0VHlwZUNsYXNzaWNDbGFzcyhQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIGNsYXNzaWMgY2xhc3MgdHlwZSIiIgorCisgICAgY2xhc3MgQzoKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisKKyAgICAgICAgX19oYXNoX18gPSBOb25lCisKKyAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gKHR5cGUoc2VsZiksIHNlbGYudmFsdWUpID09ICh0eXBlKG90aGVyKSwgb3RoZXIudmFsdWUpCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgdHlwZT1DKSwKKyAgICAgICAgU2lnKCdzcGFtJywgdHlwZT1DKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhIC14IGInLCBOUyh4PUMoJ2InKSwgc3BhbT1DKCdhJykpKSwKKyAgICAgICAgKCcteGYgZycsIE5TKHg9QygnZicpLCBzcGFtPUMoJ2cnKSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0VHlwZVJlZ2lzdHJhdGlvbihUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIHVzZXItZGVmaW5lZCB0eXBlIGJ5IHJlZ2lzdGVyaW5nIGl0IiIiCisKKyAgICBkZWYgdGVzdChzZWxmKToKKworICAgICAgICBkZWYgZ2V0X215X3R5cGUoc3RyaW5nKToKKyAgICAgICAgICAgIHJldHVybiAnbXlfdHlwZXslc30nICUgc3RyaW5nCisKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIucmVnaXN0ZXIoJ3R5cGUnLCAnbXlfdHlwZScsIGdldF9teV90eXBlKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCcteCcsIHR5cGU9J215X3R5cGUnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCd5JywgdHlwZT0nbXlfdHlwZScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIucGFyc2VfYXJncygnMScuc3BsaXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlMoeD1Ob25lLCB5PSdteV90eXBlezF9JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLnBhcnNlX2FyZ3MoJy14IDEgNDInLnNwbGl0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5TKHg9J215X3R5cGV7MX0nLCB5PSdteV90eXBlezQyfScpKQorCisKKyMgPT09PT09PT09PT09CisjIEFjdGlvbiB0ZXN0cworIyA9PT09PT09PT09PT0KKworY2xhc3MgVGVzdEFjdGlvblVzZXJEZWZpbmVkKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgdXNlci1kZWZpbmVkIG9wdGlvbi9hcmd1bWVudCBhY3Rpb24iIiIKKworICAgIGNsYXNzIE9wdGlvbmFsQWN0aW9uKGFyZ3BhcnNlLkFjdGlvbik6CisKKyAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHBhcnNlciwgbmFtZXNwYWNlLCB2YWx1ZSwgb3B0aW9uX3N0cmluZz1Ob25lKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIGNoZWNrIGRlc3RpbmF0aW9uIGFuZCBvcHRpb24gc3RyaW5nCisgICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuZGVzdCA9PSAnc3BhbScsICdkZXN0OiAlcycgJSBzZWxmLmRlc3QKKyAgICAgICAgICAgICAgICBhc3NlcnQgb3B0aW9uX3N0cmluZyA9PSAnLXMnLCAnZmxhZzogJXMnICUgb3B0aW9uX3N0cmluZworICAgICAgICAgICAgICAgICMgd2hlbiBvcHRpb24gaXMgYmVmb3JlIGFyZ3VtZW50LCBiYWRnZXI9MiwgYW5kIHdoZW4KKyAgICAgICAgICAgICAgICAjIG9wdGlvbiBpcyBhZnRlciBhcmd1bWVudCwgYmFkZ2VyPTx3aGF0ZXZlciB3YXMgc2V0PgorICAgICAgICAgICAgICAgIGV4cGVjdGVkX25zID0gTlMoc3BhbT0wLjI1KQorICAgICAgICAgICAgICAgIGlmIHZhbHVlIGluIFswLjEyNSwgMC42MjVdOgorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9ucy5iYWRnZXIgPSAyCisgICAgICAgICAgICAgICAgZWxpZiB2YWx1ZSBpbiBbMi4wXToKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbnMuYmFkZ2VyID0gODQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigndmFsdWU6ICVzJyAlIHZhbHVlKQorICAgICAgICAgICAgICAgIGFzc2VydCBleHBlY3RlZF9ucyA9PSBuYW1lc3BhY2UsICgnZXhwZWN0ZWQgJXMsIGdvdCAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0ZWRfbnMsIG5hbWVzcGFjZSkpCisgICAgICAgICAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3I6CisgICAgICAgICAgICAgICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRQYXJzZXJFcnJvcignb3B0X2FjdGlvbiBmYWlsZWQ6ICVzJyAlIGUpCisgICAgICAgICAgICBzZXRhdHRyKG5hbWVzcGFjZSwgJ3NwYW0nLCB2YWx1ZSkKKworICAgIGNsYXNzIFBvc2l0aW9uYWxBY3Rpb24oYXJncGFyc2UuQWN0aW9uKToKKworICAgICAgICBkZWYgX19jYWxsX18oc2VsZiwgcGFyc2VyLCBuYW1lc3BhY2UsIHZhbHVlLCBvcHRpb25fc3RyaW5nPU5vbmUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGFzc2VydCBvcHRpb25fc3RyaW5nIGlzIE5vbmUsICgnb3B0aW9uX3N0cmluZzogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX3N0cmluZykKKyAgICAgICAgICAgICAgICAjIGNoZWNrIGRlc3RpbmF0aW9uCisgICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuZGVzdCA9PSAnYmFkZ2VyJywgJ2Rlc3Q6ICVzJyAlIHNlbGYuZGVzdAorICAgICAgICAgICAgICAgICMgd2hlbiBhcmd1bWVudCBpcyBiZWZvcmUgb3B0aW9uLCBzcGFtPTAuMjUsIGFuZCB3aGVuCisgICAgICAgICAgICAgICAgIyBvcHRpb24gaXMgYWZ0ZXIgYXJndW1lbnQsIHNwYW09PHdoYXRldmVyIHdhcyBzZXQ+CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbnMgPSBOUyhiYWRnZXI9MikKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpbiBbNDIsIDg0XToKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbnMuc3BhbSA9IDAuMjUKKyAgICAgICAgICAgICAgICBlbGlmIHZhbHVlIGluIFsxXToKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbnMuc3BhbSA9IDAuNjI1CisgICAgICAgICAgICAgICAgZWxpZiB2YWx1ZSBpbiBbMl06CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX25zLnNwYW0gPSAwLjEyNQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCd2YWx1ZTogJXMnICUgdmFsdWUpCisgICAgICAgICAgICAgICAgYXNzZXJ0IGV4cGVjdGVkX25zID09IG5hbWVzcGFjZSwgKCdleHBlY3RlZCAlcywgZ290ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHBlY3RlZF9ucywgbmFtZXNwYWNlKSkKKyAgICAgICAgICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvcjoKKyAgICAgICAgICAgICAgICBlID0gc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgICAgICAgICByYWlzZSBBcmd1bWVudFBhcnNlckVycm9yKCdhcmdfYWN0aW9uIGZhaWxlZDogJXMnICUgZSkKKyAgICAgICAgICAgIHNldGF0dHIobmFtZXNwYWNlLCAnYmFkZ2VyJywgdmFsdWUpCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy1zJywgZGVzdD0nc3BhbScsIGFjdGlvbj1PcHRpb25hbEFjdGlvbiwKKyAgICAgICAgICAgIHR5cGU9ZmxvYXQsIGRlZmF1bHQ9MC4yNSksCisgICAgICAgIFNpZygnYmFkZ2VyJywgYWN0aW9uPVBvc2l0aW9uYWxBY3Rpb24sCisgICAgICAgICAgICB0eXBlPWludCwgbmFyZ3M9Jz8nLCBkZWZhdWx0PTIpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFtdCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJy1zMC4xMjUnLCBOUyhzcGFtPTAuMTI1LCBiYWRnZXI9MikpLAorICAgICAgICAoJzQyJywgTlMoc3BhbT0wLjI1LCBiYWRnZXI9NDIpKSwKKyAgICAgICAgKCctcyAwLjYyNSAxJywgTlMoc3BhbT0wLjYyNSwgYmFkZ2VyPTEpKSwKKyAgICAgICAgKCc4NCAtczInLCBOUyhzcGFtPTIuMCwgYmFkZ2VyPTg0KSksCisgICAgXQorCisKK2NsYXNzIFRlc3RBY3Rpb25SZWdpc3RyYXRpb24oVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSB1c2VyLWRlZmluZWQgYWN0aW9uIHN1cHBsaWVkIGJ5IHJlZ2lzdGVyaW5nIGl0IiIiCisKKyAgICBjbGFzcyBNeUFjdGlvbihhcmdwYXJzZS5BY3Rpb24pOgorCisgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBwYXJzZXIsIG5hbWVzcGFjZSwgdmFsdWVzLCBvcHRpb25fc3RyaW5nPU5vbmUpOgorICAgICAgICAgICAgc2V0YXR0cihuYW1lc3BhY2UsIHNlbGYuZGVzdCwgJ2Zvb1slc10nICUgdmFsdWVzKQorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIucmVnaXN0ZXIoJ2FjdGlvbicsICdteV9hY3Rpb24nLCBzZWxmLk15QWN0aW9uKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdiYWRnZXInLCBhY3Rpb249J215X2FjdGlvbicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIucGFyc2VfYXJncyhbJzEnXSksIE5TKGJhZGdlcj0nZm9vWzFdJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLnBhcnNlX2FyZ3MoWyc0MiddKSwgTlMoYmFkZ2VyPSdmb29bNDJdJykpCisKKworIyA9PT09PT09PT09PT09PT09CisjIFN1YnBhcnNlcnMgdGVzdHMKKyMgPT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0QWRkU3VicGFyc2VycyhUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGUgYWRkX3N1YnBhcnNlcnMgbWV0aG9kIiIiCisKKyAgICBkZWYgYXNzZXJ0QXJndW1lbnRQYXJzZXJFcnJvcihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudFBhcnNlckVycm9yLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgX2dldF9wYXJzZXIoc2VsZiwgc3VicGFyc2VyX2hlbHA9RmFsc2UsIHByZWZpeF9jaGFycz1Ob25lKToKKyAgICAgICAgIyBjcmVhdGUgYSBwYXJzZXIgd2l0aCBhIHN1YnBhcnNlcnMgYXJndW1lbnQKKyAgICAgICAgaWYgcHJlZml4X2NoYXJzOgorICAgICAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoCisgICAgICAgICAgICAgICAgcHJvZz0nUFJPRycsIGRlc2NyaXB0aW9uPSdtYWluIGRlc2NyaXB0aW9uJywgcHJlZml4X2NoYXJzPXByZWZpeF9jaGFycykKKyAgICAgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICAgICAgICAgcHJlZml4X2NoYXJzWzBdICogMiArICdmb28nLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdmb28gaGVscCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigKKyAgICAgICAgICAgICAgICBwcm9nPSdQUk9HJywgZGVzY3JpcHRpb249J21haW4gZGVzY3JpcHRpb24nKQorICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICAgICAgICAgICAnLS1mb28nLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdmb28gaGVscCcpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICAgICAnYmFyJywgdHlwZT1mbG9hdCwgaGVscD0nYmFyIGhlbHAnKQorCisgICAgICAgICMgY2hlY2sgdGhhdCBvbmx5IG9uZSBzdWJwYXJzZXJzIGFyZ3VtZW50IGNhbiBiZSBhZGRlZAorICAgICAgICBzdWJwYXJzZXJzID0gcGFyc2VyLmFkZF9zdWJwYXJzZXJzKGhlbHA9J2NvbW1hbmQgaGVscCcpCisgICAgICAgIHNlbGYuYXNzZXJ0QXJndW1lbnRQYXJzZXJFcnJvcihwYXJzZXIuYWRkX3N1YnBhcnNlcnMpCisKKyAgICAgICAgIyBhZGQgZmlyc3Qgc3ViLXBhcnNlcgorICAgICAgICBwYXJzZXIxX2t3YXJncyA9IGRpY3QoZGVzY3JpcHRpb249JzEgZGVzY3JpcHRpb24nKQorICAgICAgICBpZiBzdWJwYXJzZXJfaGVscDoKKyAgICAgICAgICAgIHBhcnNlcjFfa3dhcmdzWydoZWxwJ10gPSAnMSBoZWxwJworICAgICAgICBwYXJzZXIxID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCcxJywgKipwYXJzZXIxX2t3YXJncykKKyAgICAgICAgcGFyc2VyMS5hZGRfYXJndW1lbnQoJy13JywgdHlwZT1pbnQsIGhlbHA9J3cgaGVscCcpCisgICAgICAgIHBhcnNlcjEuYWRkX2FyZ3VtZW50KCd4JywgY2hvaWNlcz0nYWJjJywgaGVscD0neCBoZWxwJykKKworICAgICAgICAjIGFkZCBzZWNvbmQgc3ViLXBhcnNlcgorICAgICAgICBwYXJzZXIyX2t3YXJncyA9IGRpY3QoZGVzY3JpcHRpb249JzIgZGVzY3JpcHRpb24nKQorICAgICAgICBpZiBzdWJwYXJzZXJfaGVscDoKKyAgICAgICAgICAgIHBhcnNlcjJfa3dhcmdzWydoZWxwJ10gPSAnMiBoZWxwJworICAgICAgICBwYXJzZXIyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCcyJywgKipwYXJzZXIyX2t3YXJncykKKyAgICAgICAgcGFyc2VyMi5hZGRfYXJndW1lbnQoJy15JywgY2hvaWNlcz0nMTIzJywgaGVscD0neSBoZWxwJykKKyAgICAgICAgcGFyc2VyMi5hZGRfYXJndW1lbnQoJ3onLCB0eXBlPWNvbXBsZXgsIG5hcmdzPScqJywgaGVscD0neiBoZWxwJykKKworICAgICAgICAjIGFkZCB0aGlyZCBzdWItcGFyc2VyCisgICAgICAgIHBhcnNlcjNfa3dhcmdzID0gZGljdChkZXNjcmlwdGlvbj0nMyBkZXNjcmlwdGlvbicpCisgICAgICAgIGlmIHN1YnBhcnNlcl9oZWxwOgorICAgICAgICAgICAgcGFyc2VyM19rd2FyZ3NbJ2hlbHAnXSA9ICczIGhlbHAnCisgICAgICAgIHBhcnNlcjMgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoJzMnLCAqKnBhcnNlcjNfa3dhcmdzKQorICAgICAgICBwYXJzZXIzLmFkZF9hcmd1bWVudCgndCcsIHR5cGU9aW50LCBoZWxwPSd0IGhlbHAnKQorICAgICAgICBwYXJzZXIzLmFkZF9hcmd1bWVudCgndScsIG5hcmdzPScuLi4nLCBoZWxwPSd1IGhlbHAnKQorCisgICAgICAgICMgcmV0dXJuIHRoZSBtYWluIHBhcnNlcgorICAgICAgICByZXR1cm4gcGFyc2VyCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RBZGRTdWJwYXJzZXJzLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYucGFyc2VyID0gc2VsZi5fZ2V0X3BhcnNlcigpCisgICAgICAgIHNlbGYuY29tbWFuZF9oZWxwX3BhcnNlciA9IHNlbGYuX2dldF9wYXJzZXIoc3VicGFyc2VyX2hlbHA9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3BhcnNlX2FyZ3NfZmFpbHVyZXMoc2VsZik6CisgICAgICAgICMgY2hlY2sgc29tZSBmYWlsdXJlIGNhc2VzOgorICAgICAgICBmb3IgYXJnc19zdHIgaW4gWycnLCAnYScsICdhIGEnLCAnMC41IGEnLCAnMC41IDEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICcwLjUgMSAteScsICcwLjUgMiAtdyddOgorICAgICAgICAgICAgYXJncyA9IGFyZ3Nfc3RyLnNwbGl0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QXJndW1lbnRQYXJzZXJFcnJvcihzZWxmLnBhcnNlci5wYXJzZV9hcmdzLCBhcmdzKQorCisgICAgZGVmIHRlc3RfcGFyc2VfYXJncyhzZWxmKToKKyAgICAgICAgIyBjaGVjayBzb21lIG5vbi1mYWlsdXJlIGNhc2VzOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VfYXJncygnMC41IDEgYiAtdyA3Jy5zcGxpdCgpKSwKKyAgICAgICAgICAgIE5TKGZvbz1GYWxzZSwgYmFyPTAuNSwgdz03LCB4PSdiJyksCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoJzAuMjUgLS1mb28gMiAteSAyIDNqIC0tIC0xaicuc3BsaXQoKSksCisgICAgICAgICAgICBOUyhmb289VHJ1ZSwgYmFyPTAuMjUsIHk9JzInLCB6PVszaiwgLTFqXSksCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoJy0tZm9vIDAuMTI1IDEgYycuc3BsaXQoKSksCisgICAgICAgICAgICBOUyhmb289VHJ1ZSwgYmFyPTAuMTI1LCB3PU5vbmUsIHg9J2MnKSwKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VfYXJncygnLTEuNSAzIDExIC0tIGEgLS1mb28gNyAtLSBiJy5zcGxpdCgpKSwKKyAgICAgICAgICAgIE5TKGZvbz1GYWxzZSwgYmFyPS0xLjUsIHQ9MTEsIHU9WydhJywgJy0tZm9vJywgJzcnLCAnLS0nLCAnYiddKSwKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfcGFyc2Vfa25vd25fYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlX2tub3duX2FyZ3MoJzAuNSAxIGIgLXcgNycuc3BsaXQoKSksCisgICAgICAgICAgICAoTlMoZm9vPUZhbHNlLCBiYXI9MC41LCB3PTcsIHg9J2InKSwgW10pLAorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZV9rbm93bl9hcmdzKCcwLjUgLXAgMSBiIC13IDcnLnNwbGl0KCkpLAorICAgICAgICAgICAgKE5TKGZvbz1GYWxzZSwgYmFyPTAuNSwgdz03LCB4PSdiJyksIFsnLXAnXSksCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlX2tub3duX2FyZ3MoJzAuNSAxIGIgLXcgNyAtcCcuc3BsaXQoKSksCisgICAgICAgICAgICAoTlMoZm9vPUZhbHNlLCBiYXI9MC41LCB3PTcsIHg9J2InKSwgWyctcCddKSwKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2Vfa25vd25fYXJncygnMC41IDEgYiAtcSAtcnMgLXcgNycuc3BsaXQoKSksCisgICAgICAgICAgICAoTlMoZm9vPUZhbHNlLCBiYXI9MC41LCB3PTcsIHg9J2InKSwgWyctcScsICctcnMnXSksCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlX2tub3duX2FyZ3MoJzAuNSAtVyAxIGIgLVggWSAtdyA3IFonLnNwbGl0KCkpLAorICAgICAgICAgICAgKE5TKGZvbz1GYWxzZSwgYmFyPTAuNSwgdz03LCB4PSdiJyksIFsnLVcnLCAnLVgnLCAnWScsICdaJ10pLAorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9kZXN0KHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJywgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICAgICAgc3VicGFyc2VycyA9IHBhcnNlci5hZGRfc3VicGFyc2VycyhkZXN0PSdiYXInKQorICAgICAgICBwYXJzZXIxID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCcxJykKKyAgICAgICAgcGFyc2VyMS5hZGRfYXJndW1lbnQoJ2JheicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoZm9vPUZhbHNlLCBiYXI9JzEnLCBiYXo9JzInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncygnMSAyJy5zcGxpdCgpKSkKKworICAgIGRlZiB0ZXN0X2hlbHAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuZm9ybWF0X3VzYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzYWdlOiBQUk9HIFstaF0gWy0tZm9vXSBiYXIgezEsMiwzfSAuLi5cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuZm9ybWF0X2hlbHAoKSwgdGV4dHdyYXAuZGVkZW50KCcnJ1wKKyAgICAgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy0tZm9vXSBiYXIgezEsMiwzfSAuLi4KKworICAgICAgICAgICAgbWFpbiBkZXNjcmlwdGlvbgorCisgICAgICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgYmFyICAgICAgICAgYmFyIGhlbHAKKyAgICAgICAgICAgICAgezEsMiwzfSAgICAgY29tbWFuZCBoZWxwCisKKyAgICAgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgICAgICAtLWZvbyAgICAgICBmb28gaGVscAorICAgICAgICAgICAgJycnKSkKKworICAgIGRlZiB0ZXN0X2hlbHBfZXh0cmFfcHJlZml4X2NoYXJzKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSAtIGlzIHN0aWxsIHVzZWQgZm9yIGhlbHAgaWYgaXQgaXMgYSBub24tZmlyc3QgcHJlZml4IGNoYXIKKyAgICAgICAgcGFyc2VyID0gc2VsZi5fZ2V0X3BhcnNlcihwcmVmaXhfY2hhcnM9Jys6LScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmZvcm1hdF91c2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd1c2FnZTogUFJPRyBbLWhdIFsrK2Zvb10gYmFyIHsxLDIsM30gLi4uXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5mb3JtYXRfaGVscCgpLCB0ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbKytmb29dIGJhciB7MSwyLDN9IC4uLgorCisgICAgICAgICAgICBtYWluIGRlc2NyaXB0aW9uCisKKyAgICAgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgICAgICBiYXIgICAgICAgICBiYXIgaGVscAorICAgICAgICAgICAgICB7MSwyLDN9ICAgICBjb21tYW5kIGhlbHAKKworICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgICAgICsrZm9vICAgICAgIGZvbyBoZWxwCisgICAgICAgICAgICAnJycpKQorCisKKyAgICBkZWYgdGVzdF9oZWxwX2FsdGVybmF0ZV9wcmVmaXhfY2hhcnMoc2VsZik6CisgICAgICAgIHBhcnNlciA9IHNlbGYuX2dldF9wYXJzZXIocHJlZml4X2NoYXJzPScrOi8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5mb3JtYXRfdXNhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndXNhZ2U6IFBST0cgWytoXSBbKytmb29dIGJhciB7MSwyLDN9IC4uLlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZm9ybWF0X2hlbHAoKSwgdGV4dHdyYXAuZGVkZW50KCcnJ1wKKyAgICAgICAgICAgIHVzYWdlOiBQUk9HIFsraF0gWysrZm9vXSBiYXIgezEsMiwzfSAuLi4KKworICAgICAgICAgICAgbWFpbiBkZXNjcmlwdGlvbgorCisgICAgICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgYmFyICAgICAgICAgYmFyIGhlbHAKKyAgICAgICAgICAgICAgezEsMiwzfSAgICAgY29tbWFuZCBoZWxwCisKKyAgICAgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgK2gsICsraGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgICAgICArK2ZvbyAgICAgICBmb28gaGVscAorICAgICAgICAgICAgJycnKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlcl9jb21tYW5kX2hlbHAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21tYW5kX2hlbHBfcGFyc2VyLmZvcm1hdF91c2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd1c2FnZTogUFJPRyBbLWhdIFstLWZvb10gYmFyIHsxLDIsM30gLi4uXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tbWFuZF9oZWxwX3BhcnNlci5mb3JtYXRfaGVscCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRleHR3cmFwLmRlZGVudCgnJydcCisgICAgICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstLWZvb10gYmFyIHsxLDIsM30gLi4uCisKKyAgICAgICAgICAgIG1haW4gZGVzY3JpcHRpb24KKworICAgICAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIGJhciAgICAgICAgIGJhciBoZWxwCisgICAgICAgICAgICAgIHsxLDIsM30gICAgIGNvbW1hbmQgaGVscAorICAgICAgICAgICAgICAgIDEgICAgICAgICAxIGhlbHAKKyAgICAgICAgICAgICAgICAyICAgICAgICAgMiBoZWxwCisgICAgICAgICAgICAgICAgMyAgICAgICAgIDMgaGVscAorCisgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAgICAgLS1mb28gICAgICAgZm9vIGhlbHAKKyAgICAgICAgICAgICcnJykpCisKKyAgICBkZWYgdGVzdF9zdWJwYXJzZXJfdGl0bGVfaGVscChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSdtYWluIGRlc2NyaXB0aW9uJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb28nLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdmb28gaGVscCcpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2JhcicsIGhlbHA9J2JhciBoZWxwJykKKyAgICAgICAgc3VicGFyc2VycyA9IHBhcnNlci5hZGRfc3VicGFyc2Vycyh0aXRsZT0nc3ViY29tbWFuZHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSdjb21tYW5kIGhlbHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J2FkZGl0aW9uYWwgdGV4dCcpCisgICAgICAgIHBhcnNlcjEgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoJzEnKQorICAgICAgICBwYXJzZXIyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCcyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZm9ybWF0X3VzYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzYWdlOiBQUk9HIFstaF0gWy0tZm9vXSBiYXIgezEsMn0gLi4uXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5mb3JtYXRfaGVscCgpLCB0ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1mb29dIGJhciB7MSwyfSAuLi4KKworICAgICAgICAgICAgbWFpbiBkZXNjcmlwdGlvbgorCisgICAgICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgYmFyICAgICAgICAgYmFyIGhlbHAKKworICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgICAgIC0tZm9vICAgICAgIGZvbyBoZWxwCisKKyAgICAgICAgICAgIHN1YmNvbW1hbmRzOgorICAgICAgICAgICAgICBjb21tYW5kIGhlbHAKKworICAgICAgICAgICAgICB7MSwyfSAgICAgICBhZGRpdGlvbmFsIHRleHQKKyAgICAgICAgICAgICcnJykpCisKKyAgICBkZWYgX3Rlc3Rfc3VicGFyc2VyX2hlbHAoc2VsZiwgYXJnc19zdHIsIGV4cGVjdGVkX2hlbHApOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKGFyZ3Nfc3RyLnNwbGl0KCkpCisgICAgICAgIGV4Y2VwdCBBcmd1bWVudFBhcnNlckVycm9yOgorICAgICAgICAgICAgZXJyID0gc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgICAgIGlmIGVyci5zdGRvdXQgIT0gZXhwZWN0ZWRfaGVscDoKKyAgICAgICAgICAgICAgICBwcmludChyZXByKGV4cGVjdGVkX2hlbHApKQorICAgICAgICAgICAgICAgIHByaW50KHJlcHIoZXJyLnN0ZG91dCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyci5zdGRvdXQsIGV4cGVjdGVkX2hlbHApCisKKyAgICBkZWYgdGVzdF9zdWJwYXJzZXIxX2hlbHAoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3Rfc3VicGFyc2VyX2hlbHAoJzUuMCAxIC1oJywgdGV4dHdyYXAuZGVkZW50KCcnJ1wKKyAgICAgICAgICAgIHVzYWdlOiBQUk9HIGJhciAxIFstaF0gWy13IFddIHthLGIsY30KKworICAgICAgICAgICAgMSBkZXNjcmlwdGlvbgorCisgICAgICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAge2EsYixjfSAgICAgeCBoZWxwCisKKyAgICAgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgICAgICAtdyBXICAgICAgICB3IGhlbHAKKyAgICAgICAgICAgICcnJykpCisKKyAgICBkZWYgdGVzdF9zdWJwYXJzZXIyX2hlbHAoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3Rfc3VicGFyc2VyX2hlbHAoJzUuMCAyIC1oJywgdGV4dHdyYXAuZGVkZW50KCcnJ1wKKyAgICAgICAgICAgIHVzYWdlOiBQUk9HIGJhciAyIFstaF0gWy15IHsxLDIsM31dIFt6IFt6IC4uLl1dCisKKyAgICAgICAgICAgIDIgZGVzY3JpcHRpb24KKworICAgICAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIHogICAgICAgICAgIHogaGVscAorCisgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAgICAgLXkgezEsMiwzfSAgeSBoZWxwCisgICAgICAgICAgICAnJycpKQorCisjID09PT09PT09PT09PQorIyBHcm91cHMgdGVzdHMKKyMgPT09PT09PT09PT09CisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc0dyb3VwcyhUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgdGhhdCBvcmRlciBvZiBncm91cCBwb3NpdGlvbmFscyBtYXRjaGVzIGNvbnN0cnVjdGlvbiBvcmRlciIiIgorCisgICAgZGVmIHRlc3Rfbm9uZ3JvdXBfZmlyc3Qoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnZm9vJykKKyAgICAgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdnJykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCdiYXInKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdiYXonKQorICAgICAgICBleHBlY3RlZCA9IE5TKGZvbz0nMScsIGJhcj0nMicsIGJhej0nMycpCisgICAgICAgIHJlc3VsdCA9IHBhcnNlci5wYXJzZV9hcmdzKCcxIDIgMycuc3BsaXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgcmVzdWx0KQorCisgICAgZGVmIHRlc3RfZ3JvdXBfZmlyc3Qoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCd4eHgnKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJ2ZvbycpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2JhcicpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2JheicpCisgICAgICAgIGV4cGVjdGVkID0gTlMoZm9vPScxJywgYmFyPScyJywgYmF6PSczJykKKyAgICAgICAgcmVzdWx0ID0gcGFyc2VyLnBhcnNlX2FyZ3MoJzEgMiAzJy5zcGxpdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCByZXN1bHQpCisKKyAgICBkZWYgdGVzdF9pbnRlcmxlYXZlZF9ncm91cHMoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCd4eHgnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdmb28nKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJ2JhcicpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2JheicpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgneXl5JykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCdmcmVsbCcpCisgICAgICAgIGV4cGVjdGVkID0gTlMoZm9vPScxJywgYmFyPScyJywgYmF6PSczJywgZnJlbGw9JzQnKQorICAgICAgICByZXN1bHQgPSBwYXJzZXIucGFyc2VfYXJncygnMSAyIDMgNCcuc3BsaXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgcmVzdWx0KQorCisjID09PT09PT09PT09PT09PT09PT0KKyMgUGFyZW50IHBhcnNlciB0ZXN0cworIyA9PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RQYXJlbnRQYXJzZXJzKFRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyB0aGF0IHBhcnNlcnMgY2FuIGJlIGNyZWF0ZWQgd2l0aCBwYXJlbnQgcGFyc2VycyIiIgorCisgICAgZGVmIGFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3Ioc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRQYXJzZXJFcnJvciwgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0UGFyZW50UGFyc2Vycywgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLnd4eXpfcGFyZW50ID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoYWRkX2hlbHA9RmFsc2UpCisgICAgICAgIHNlbGYud3h5el9wYXJlbnQuYWRkX2FyZ3VtZW50KCctLXcnKQorICAgICAgICB4X2dyb3VwID0gc2VsZi53eHl6X3BhcmVudC5hZGRfYXJndW1lbnRfZ3JvdXAoJ3gnKQorICAgICAgICB4X2dyb3VwLmFkZF9hcmd1bWVudCgnLXknKQorICAgICAgICBzZWxmLnd4eXpfcGFyZW50LmFkZF9hcmd1bWVudCgneicpCisKKyAgICAgICAgc2VsZi5hYmNkX3BhcmVudCA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKGFkZF9oZWxwPUZhbHNlKQorICAgICAgICBzZWxmLmFiY2RfcGFyZW50LmFkZF9hcmd1bWVudCgnYScpCisgICAgICAgIHNlbGYuYWJjZF9wYXJlbnQuYWRkX2FyZ3VtZW50KCctYicpCisgICAgICAgIGNfZ3JvdXAgPSBzZWxmLmFiY2RfcGFyZW50LmFkZF9hcmd1bWVudF9ncm91cCgnYycpCisgICAgICAgIGNfZ3JvdXAuYWRkX2FyZ3VtZW50KCctLWQnKQorCisgICAgICAgIHNlbGYud19wYXJlbnQgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihhZGRfaGVscD1GYWxzZSkKKyAgICAgICAgc2VsZi53X3BhcmVudC5hZGRfYXJndW1lbnQoJy0tdycpCisKKyAgICAgICAgc2VsZi56X3BhcmVudCA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKGFkZF9oZWxwPUZhbHNlKQorICAgICAgICBzZWxmLnpfcGFyZW50LmFkZF9hcmd1bWVudCgneicpCisKKyAgICAgICAgIyBwYXJlbnRzIHdpdGggbXV0dWFsbHkgZXhjbHVzaXZlIGdyb3VwcworICAgICAgICBzZWxmLmFiX211dGV4X3BhcmVudCA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKGFkZF9oZWxwPUZhbHNlKQorICAgICAgICBncm91cCA9IHNlbGYuYWJfbXV0ZXhfcGFyZW50LmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAoKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJy1hJywgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctYicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKyAgICAgICAgc2VsZi5tYWluX3Byb2dyYW0gPSBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKQorCisgICAgZGVmIHRlc3Rfc2luZ2xlX3BhcmVudChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocGFyZW50cz1bc2VsZi53eHl6X3BhcmVudF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLnBhcnNlX2FyZ3MoJy15IDEgMiAtLXcgMycuc3BsaXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlModz0nMycsIHk9JzEnLCB6PScyJykpCisKKyAgICBkZWYgdGVzdF9zaW5nbGVfcGFyZW50X211dGV4KHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X211dGV4X2FiKHNlbGYuYWJfbXV0ZXhfcGFyZW50LnBhcnNlX2FyZ3MpCisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHBhcmVudHM9W3NlbGYuYWJfbXV0ZXhfcGFyZW50XSkKKyAgICAgICAgc2VsZi5fdGVzdF9tdXRleF9hYihwYXJzZXIucGFyc2VfYXJncykKKworICAgIGRlZiB0ZXN0X3NpbmdsZV9ncmFucGFyZW50X211dGV4KHNlbGYpOgorICAgICAgICBwYXJlbnRzID0gW3NlbGYuYWJfbXV0ZXhfcGFyZW50XQorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihhZGRfaGVscD1GYWxzZSwgcGFyZW50cz1wYXJlbnRzKQorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihwYXJlbnRzPVtwYXJzZXJdKQorICAgICAgICBzZWxmLl90ZXN0X211dGV4X2FiKHBhcnNlci5wYXJzZV9hcmdzKQorCisgICAgZGVmIF90ZXN0X211dGV4X2FiKHNlbGYsIHBhcnNlX2FyZ3MpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlX2FyZ3MoW10pLCBOUyhhPUZhbHNlLCBiPUZhbHNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZV9hcmdzKFsnLWEnXSksIE5TKGE9VHJ1ZSwgYj1GYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VfYXJncyhbJy1iJ10pLCBOUyhhPUZhbHNlLCBiPVRydWUpKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IocGFyc2VfYXJncywgWyctYScsICctYiddKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IocGFyc2VfYXJncywgWyctYicsICctYSddKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IocGFyc2VfYXJncywgWyctYyddKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IocGFyc2VfYXJncywgWyctYScsICctYyddKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IocGFyc2VfYXJncywgWyctYicsICctYyddKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfcGFyZW50cyhzZWxmKToKKyAgICAgICAgcGFyZW50cyA9IFtzZWxmLmFiY2RfcGFyZW50LCBzZWxmLnd4eXpfcGFyZW50XQorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihwYXJlbnRzPXBhcmVudHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLnBhcnNlX2FyZ3MoJy0tZCAxIC0tdyAyIDMgNCcuc3BsaXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlMoYT0nMycsIGI9Tm9uZSwgZD0nMScsIHc9JzInLCB5PU5vbmUsIHo9JzQnKSkKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX3BhcmVudHNfbXV0ZXgoc2VsZik6CisgICAgICAgIHBhcmVudHMgPSBbc2VsZi5hYl9tdXRleF9wYXJlbnQsIHNlbGYud3h5el9wYXJlbnRdCisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHBhcmVudHM9cGFyZW50cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIucGFyc2VfYXJncygnLWEgLS13IDIgMycuc3BsaXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlMoYT1UcnVlLCBiPUZhbHNlLCB3PScyJywgeT1Ob25lLCB6PSczJykpCisgICAgICAgIHNlbGYuYXNzZXJ0QXJndW1lbnRQYXJzZXJFcnJvcigKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzLCAnLWEgLS13IDIgMyAtYicuc3BsaXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKAorICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MsICctYSAtYiAtLXcgMiAzJy5zcGxpdCgpKQorCisgICAgZGVmIHRlc3RfY29uZmxpY3RpbmdfcGFyZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBhcmdwYXJzZS5Bcmd1bWVudEVycm9yLAorICAgICAgICAgICAgYXJncGFyc2UuQXJndW1lbnRQYXJzZXIsCisgICAgICAgICAgICBwYXJlbnRzPVtzZWxmLndfcGFyZW50LCBzZWxmLnd4eXpfcGFyZW50XSkKKworICAgIGRlZiB0ZXN0X2NvbmZsaWN0aW5nX3BhcmVudHNfbXV0ZXgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgYXJncGFyc2UuQXJndW1lbnRFcnJvciwKKyAgICAgICAgICAgIGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyLAorICAgICAgICAgICAgcGFyZW50cz1bc2VsZi5hYmNkX3BhcmVudCwgc2VsZi5hYl9tdXRleF9wYXJlbnRdKQorCisgICAgZGVmIHRlc3Rfc2FtZV9hcmd1bWVudF9uYW1lX3BhcmVudHMoc2VsZik6CisgICAgICAgIHBhcmVudHMgPSBbc2VsZi53eHl6X3BhcmVudCwgc2VsZi56X3BhcmVudF0KKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocGFyZW50cz1wYXJlbnRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5wYXJzZV9hcmdzKCcxIDInLnNwbGl0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5TKHc9Tm9uZSwgeT1Ob25lLCB6PScyJykpCisKKyAgICBkZWYgdGVzdF9zdWJwYXJzZXJfcGFyZW50cyhzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBzdWJwYXJzZXJzID0gcGFyc2VyLmFkZF9zdWJwYXJzZXJzKCkKKyAgICAgICAgYWJjZGVfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCdiYXInLCBwYXJlbnRzPVtzZWxmLmFiY2RfcGFyZW50XSkKKyAgICAgICAgYWJjZGVfcGFyc2VyLmFkZF9hcmd1bWVudCgnZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLnBhcnNlX2FyZ3MoJ2JhciAtYiAxIC0tZCAyIDMgNCcuc3BsaXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlMoYT0nMycsIGI9JzEnLCBkPScyJywgZT0nNCcpKQorCisgICAgZGVmIHRlc3Rfc3VicGFyc2VyX3BhcmVudHNfbXV0ZXgoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgc3VicGFyc2VycyA9IHBhcnNlci5hZGRfc3VicGFyc2VycygpCisgICAgICAgIHBhcmVudHMgPSBbc2VsZi5hYl9tdXRleF9wYXJlbnRdCisgICAgICAgIGFiY19wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoJ2ZvbycsIHBhcmVudHM9cGFyZW50cykKKyAgICAgICAgY19ncm91cCA9IGFiY19wYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdjX2dyb3VwJykKKyAgICAgICAgY19ncm91cC5hZGRfYXJndW1lbnQoJ2MnKQorICAgICAgICBwYXJlbnRzID0gW3NlbGYud3h5el9wYXJlbnQsIHNlbGYuYWJfbXV0ZXhfcGFyZW50XQorICAgICAgICB3eHl6YWJlX3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignYmFyJywgcGFyZW50cz1wYXJlbnRzKQorICAgICAgICB3eHl6YWJlX3BhcnNlci5hZGRfYXJndW1lbnQoJ2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5wYXJzZV9hcmdzKCdmb28gLWEgNCcuc3BsaXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlMoYT1UcnVlLCBiPUZhbHNlLCBjPSc0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLnBhcnNlX2FyZ3MoJ2JhciAtYiAgLS13IDIgMyA0Jy5zcGxpdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOUyhhPUZhbHNlLCBiPVRydWUsIHc9JzInLCB5PU5vbmUsIHo9JzMnLCBlPSc0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0QXJndW1lbnRQYXJzZXJFcnJvcigKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzLCAnZm9vIC1hIC1iIDQnLnNwbGl0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QXJndW1lbnRQYXJzZXJFcnJvcigKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzLCAnYmFyIC1iIC1hIDQnLnNwbGl0KCkpCisKKyAgICBkZWYgdGVzdF9wYXJlbnRfaGVscChzZWxmKToKKyAgICAgICAgcGFyZW50cyA9IFtzZWxmLmFiY2RfcGFyZW50LCBzZWxmLnd4eXpfcGFyZW50XQorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihwYXJlbnRzPXBhcmVudHMpCisgICAgICAgIHBhcnNlcl9oZWxwID0gcGFyc2VyLmZvcm1hdF9oZWxwKCkKKyAgICAgICAgcHJvZ25hbWUgPSBzZWxmLm1haW5fcHJvZ3JhbQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlcl9oZWxwLCB0ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgICAgICAgdXNhZ2U6IHt9e31bLWhdIFstYiBCXSBbLS1kIERdIFstLXcgV10gWy15IFldIGEgegorCisgICAgICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgYQorICAgICAgICAgICAgICB6CisKKyAgICAgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgICAgICAtYiBCCisgICAgICAgICAgICAgIC0tdyBXCisKKyAgICAgICAgICAgIGM6CisgICAgICAgICAgICAgIC0tZCBECisKKyAgICAgICAgICAgIHg6CisgICAgICAgICAgICAgIC15IFkKKyAgICAgICAgJycnLmZvcm1hdChwcm9nbmFtZSwgJyAnIGlmIHByb2duYW1lIGVsc2UgJycgKSkpCisKKyAgICBkZWYgdGVzdF9ncm91cHNfcGFyZW50cyhzZWxmKToKKyAgICAgICAgcGFyZW50ID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoYWRkX2hlbHA9RmFsc2UpCisgICAgICAgIGcgPSBwYXJlbnQuYWRkX2FyZ3VtZW50X2dyb3VwKHRpdGxlPSdnJywgZGVzY3JpcHRpb249J2dkJykKKyAgICAgICAgZy5hZGRfYXJndW1lbnQoJy13JykKKyAgICAgICAgZy5hZGRfYXJndW1lbnQoJy14JykKKyAgICAgICAgbSA9IHBhcmVudC5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKCkKKyAgICAgICAgbS5hZGRfYXJndW1lbnQoJy15JykKKyAgICAgICAgbS5hZGRfYXJndW1lbnQoJy16JykKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocGFyZW50cz1bcGFyZW50XSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudFBhcnNlckVycm9yLCBwYXJzZXIucGFyc2VfYXJncywKKyAgICAgICAgICAgIFsnLXknLCAnWScsICcteicsICdaJ10pCisKKyAgICAgICAgcGFyc2VyX2hlbHAgPSBwYXJzZXIuZm9ybWF0X2hlbHAoKQorICAgICAgICBwcm9nbmFtZSA9IHNlbGYubWFpbl9wcm9ncmFtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyX2hlbHAsIHRleHR3cmFwLmRlZGVudCgnJydcCisgICAgICAgICAgICB1c2FnZToge317fVstaF0gWy13IFddIFsteCBYXSBbLXkgWSB8IC16IFpdCisKKyAgICAgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgICAgICAteSBZCisgICAgICAgICAgICAgIC16IFoKKworICAgICAgICAgICAgZzoKKyAgICAgICAgICAgICAgZ2QKKworICAgICAgICAgICAgICAtdyBXCisgICAgICAgICAgICAgIC14IFgKKyAgICAgICAgJycnLmZvcm1hdChwcm9nbmFtZSwgJyAnIGlmIHByb2duYW1lIGVsc2UgJycgKSkpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIE11dHVhbGx5IGV4Y2x1c2l2ZSBncm91cCB0ZXN0cworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdE11dHVhbGx5RXhjbHVzaXZlR3JvdXBFcnJvcnMoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfaW52YWxpZF9hZGRfYXJndW1lbnRfZ3JvdXAoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyAgICAgICAgcmFpc2VzKFR5cGVFcnJvciwgcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAsIHRpdGxlPSdmb28nKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9hZGRfYXJndW1lbnQoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cCgpCisgICAgICAgIGFkZF9hcmd1bWVudCA9IGdyb3VwLmFkZF9hcmd1bWVudAorICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcworICAgICAgICByYWlzZXMoVmFsdWVFcnJvciwgYWRkX2FyZ3VtZW50LCAnLS1mb28nLCByZXF1aXJlZD1UcnVlKQorICAgICAgICByYWlzZXMoVmFsdWVFcnJvciwgYWRkX2FyZ3VtZW50LCAnYmFyJykKKyAgICAgICAgcmFpc2VzKFZhbHVlRXJyb3IsIGFkZF9hcmd1bWVudCwgJ2JhcicsIG5hcmdzPScrJykKKyAgICAgICAgcmFpc2VzKFZhbHVlRXJyb3IsIGFkZF9hcmd1bWVudCwgJ2JhcicsIG5hcmdzPTEpCisgICAgICAgIHJhaXNlcyhWYWx1ZUVycm9yLCBhZGRfYXJndW1lbnQsICdiYXInLCBuYXJncz1hcmdwYXJzZS5QQVJTRVIpCisKKyAgICBkZWYgdGVzdF9oZWxwKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihwcm9nPSdQUk9HJykKKyAgICAgICAgZ3JvdXAxID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAoKQorICAgICAgICBncm91cDEuYWRkX2FyZ3VtZW50KCctLWZvbycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgICAgIGdyb3VwMS5hZGRfYXJndW1lbnQoJy0tYmFyJywgYWN0aW9uPSdzdG9yZV9mYWxzZScpCisgICAgICAgIGdyb3VwMiA9IHBhcnNlci5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKCkKKyAgICAgICAgZ3JvdXAyLmFkZF9hcmd1bWVudCgnLS1zb3VwJywgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICAgICAgZ3JvdXAyLmFkZF9hcmd1bWVudCgnLS1udXRzJywgYWN0aW9uPSdzdG9yZV9mYWxzZScpCisgICAgICAgIGV4cGVjdGVkID0gJycnXAorICAgICAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1mb28gfCAtLWJhcl0gWy0tc291cCB8IC0tbnV0c10KKworICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgICAgIC0tZm9vCisgICAgICAgICAgICAgIC0tYmFyCisgICAgICAgICAgICAgIC0tc291cAorICAgICAgICAgICAgICAtLW51dHMKKyAgICAgICAgICAgICAgJycnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmZvcm1hdF9oZWxwKCksIHRleHR3cmFwLmRlZGVudChleHBlY3RlZCkpCisKK2NsYXNzIE1FTWl4aW4ob2JqZWN0KToKKworICAgIGRlZiB0ZXN0X2ZhaWx1cmVzX3doZW5fbm90X3JlcXVpcmVkKHNlbGYpOgorICAgICAgICBwYXJzZV9hcmdzID0gc2VsZi5nZXRfcGFyc2VyKHJlcXVpcmVkPUZhbHNlKS5wYXJzZV9hcmdzCisgICAgICAgIGVycm9yID0gQXJndW1lbnRQYXJzZXJFcnJvcgorICAgICAgICBmb3IgYXJnc19zdHJpbmcgaW4gc2VsZi5mYWlsdXJlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9yLCBwYXJzZV9hcmdzLCBhcmdzX3N0cmluZy5zcGxpdCgpKQorCisgICAgZGVmIHRlc3RfZmFpbHVyZXNfd2hlbl9yZXF1aXJlZChzZWxmKToKKyAgICAgICAgcGFyc2VfYXJncyA9IHNlbGYuZ2V0X3BhcnNlcihyZXF1aXJlZD1UcnVlKS5wYXJzZV9hcmdzCisgICAgICAgIGVycm9yID0gQXJndW1lbnRQYXJzZXJFcnJvcgorICAgICAgICBmb3IgYXJnc19zdHJpbmcgaW4gc2VsZi5mYWlsdXJlcyArIFsnJ106CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhlcnJvciwgcGFyc2VfYXJncywgYXJnc19zdHJpbmcuc3BsaXQoKSkKKworICAgIGRlZiB0ZXN0X3N1Y2Nlc3Nlc193aGVuX25vdF9yZXF1aXJlZChzZWxmKToKKyAgICAgICAgcGFyc2VfYXJncyA9IHNlbGYuZ2V0X3BhcnNlcihyZXF1aXJlZD1GYWxzZSkucGFyc2VfYXJncworICAgICAgICBzdWNjZXNzZXMgPSBzZWxmLnN1Y2Nlc3NlcyArIHNlbGYuc3VjY2Vzc2VzX3doZW5fbm90X3JlcXVpcmVkCisgICAgICAgIGZvciBhcmdzX3N0cmluZywgZXhwZWN0ZWRfbnMgaW4gc3VjY2Vzc2VzOgorICAgICAgICAgICAgYWN0dWFsX25zID0gcGFyc2VfYXJncyhhcmdzX3N0cmluZy5zcGxpdCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWxfbnMsIGV4cGVjdGVkX25zKQorCisgICAgZGVmIHRlc3Rfc3VjY2Vzc2VzX3doZW5fcmVxdWlyZWQoc2VsZik6CisgICAgICAgIHBhcnNlX2FyZ3MgPSBzZWxmLmdldF9wYXJzZXIocmVxdWlyZWQ9VHJ1ZSkucGFyc2VfYXJncworICAgICAgICBmb3IgYXJnc19zdHJpbmcsIGV4cGVjdGVkX25zIGluIHNlbGYuc3VjY2Vzc2VzOgorICAgICAgICAgICAgYWN0dWFsX25zID0gcGFyc2VfYXJncyhhcmdzX3N0cmluZy5zcGxpdCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWxfbnMsIGV4cGVjdGVkX25zKQorCisgICAgZGVmIHRlc3RfdXNhZ2Vfd2hlbl9ub3RfcmVxdWlyZWQoc2VsZik6CisgICAgICAgIGZvcm1hdF91c2FnZSA9IHNlbGYuZ2V0X3BhcnNlcihyZXF1aXJlZD1GYWxzZSkuZm9ybWF0X3VzYWdlCisgICAgICAgIGV4cGVjdGVkX3VzYWdlID0gc2VsZi51c2FnZV93aGVuX25vdF9yZXF1aXJlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdF91c2FnZSgpLCB0ZXh0d3JhcC5kZWRlbnQoZXhwZWN0ZWRfdXNhZ2UpKQorCisgICAgZGVmIHRlc3RfdXNhZ2Vfd2hlbl9yZXF1aXJlZChzZWxmKToKKyAgICAgICAgZm9ybWF0X3VzYWdlID0gc2VsZi5nZXRfcGFyc2VyKHJlcXVpcmVkPVRydWUpLmZvcm1hdF91c2FnZQorICAgICAgICBleHBlY3RlZF91c2FnZSA9IHNlbGYudXNhZ2Vfd2hlbl9yZXF1aXJlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdF91c2FnZSgpLCB0ZXh0d3JhcC5kZWRlbnQoZXhwZWN0ZWRfdXNhZ2UpKQorCisgICAgZGVmIHRlc3RfaGVscF93aGVuX25vdF9yZXF1aXJlZChzZWxmKToKKyAgICAgICAgZm9ybWF0X2hlbHAgPSBzZWxmLmdldF9wYXJzZXIocmVxdWlyZWQ9RmFsc2UpLmZvcm1hdF9oZWxwCisgICAgICAgIGhlbHAgPSBzZWxmLnVzYWdlX3doZW5fbm90X3JlcXVpcmVkICsgc2VsZi5oZWxwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0X2hlbHAoKSwgdGV4dHdyYXAuZGVkZW50KGhlbHApKQorCisgICAgZGVmIHRlc3RfaGVscF93aGVuX3JlcXVpcmVkKHNlbGYpOgorICAgICAgICBmb3JtYXRfaGVscCA9IHNlbGYuZ2V0X3BhcnNlcihyZXF1aXJlZD1UcnVlKS5mb3JtYXRfaGVscAorICAgICAgICBoZWxwID0gc2VsZi51c2FnZV93aGVuX3JlcXVpcmVkICsgc2VsZi5oZWxwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0X2hlbHAoKSwgdGV4dHdyYXAuZGVkZW50KGhlbHApKQorCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZVNpbXBsZShNRU1peGluLCBUZXN0Q2FzZSk6CisKKyAgICBkZWYgZ2V0X3BhcnNlcihzZWxmLCByZXF1aXJlZD1Ob25lKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAocmVxdWlyZWQ9cmVxdWlyZWQpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1iYXInLCBoZWxwPSdiYXIgaGVscCcpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1iYXonLCBuYXJncz0nPycsIGNvbnN0PSdaJywgaGVscD0nYmF6IGhlbHAnKQorICAgICAgICByZXR1cm4gcGFyc2VyCisKKyAgICBmYWlsdXJlcyA9IFsnLS1iYXIgWCAtLWJheiBZJywgJy0tYmFyIFggLS1iYXonXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCctLWJhciBYJywgTlMoYmFyPSdYJywgYmF6PU5vbmUpKSwKKyAgICAgICAgKCctLWJhciBYIC0tYmFyIFonLCBOUyhiYXI9J1onLCBiYXo9Tm9uZSkpLAorICAgICAgICAoJy0tYmF6IFknLCBOUyhiYXI9Tm9uZSwgYmF6PSdZJykpLAorICAgICAgICAoJy0tYmF6JywgTlMoYmFyPU5vbmUsIGJhej0nWicpKSwKKyAgICBdCisgICAgc3VjY2Vzc2VzX3doZW5fbm90X3JlcXVpcmVkID0gWworICAgICAgICAoJycsIE5TKGJhcj1Ob25lLCBiYXo9Tm9uZSkpLAorICAgIF0KKworICAgIHVzYWdlX3doZW5fbm90X3JlcXVpcmVkID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstLWJhciBCQVIgfCAtLWJheiBbQkFaXV0KKyAgICAgICAgJycnCisgICAgdXNhZ2Vfd2hlbl9yZXF1aXJlZCA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSAoLS1iYXIgQkFSIHwgLS1iYXogW0JBWl0pCisgICAgICAgICcnJworICAgIGhlbHAgPSAnJydcCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLS1iYXIgQkFSICAgIGJhciBoZWxwCisgICAgICAgICAgLS1iYXogW0JBWl0gIGJheiBoZWxwCisgICAgICAgICcnJworCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZUxvbmcoTUVNaXhpbiwgVGVzdENhc2UpOgorCisgICAgZGVmIGdldF9wYXJzZXIoc2VsZiwgcmVxdWlyZWQ9Tm9uZSk6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWFiY2RlJywgaGVscD0nYWJjZGUgaGVscCcpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZmdoaWonLCBoZWxwPSdmZ2hpaiBoZWxwJykKKyAgICAgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cChyZXF1aXJlZD1yZXF1aXJlZCkKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLWtsbW5vJywgaGVscD0na2xtbm8gaGVscCcpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1wcXJzdCcsIGhlbHA9J3BxcnN0IGhlbHAnKQorICAgICAgICByZXR1cm4gcGFyc2VyCisKKyAgICBmYWlsdXJlcyA9IFsnLS1rbG1ubyBYIC0tcHFyc3QgWSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJy0ta2xtbm8gWCcsIE5TKGFiY2RlPU5vbmUsIGZnaGlqPU5vbmUsIGtsbW5vPSdYJywgcHFyc3Q9Tm9uZSkpLAorICAgICAgICAoJy0tYWJjZGUgWSAtLWtsbW5vIFgnLAorICAgICAgICAgICAgTlMoYWJjZGU9J1knLCBmZ2hpaj1Ob25lLCBrbG1ubz0nWCcsIHBxcnN0PU5vbmUpKSwKKyAgICAgICAgKCctLXBxcnN0IFgnLCBOUyhhYmNkZT1Ob25lLCBmZ2hpaj1Ob25lLCBrbG1ubz1Ob25lLCBwcXJzdD0nWCcpKSwKKyAgICAgICAgKCctLXBxcnN0IFggLS1mZ2hpaiBZJywKKyAgICAgICAgICAgIE5TKGFiY2RlPU5vbmUsIGZnaGlqPSdZJywga2xtbm89Tm9uZSwgcHFyc3Q9J1gnKSksCisgICAgXQorICAgIHN1Y2Nlc3Nlc193aGVuX25vdF9yZXF1aXJlZCA9IFsKKyAgICAgICAgKCcnLCBOUyhhYmNkZT1Ob25lLCBmZ2hpaj1Ob25lLCBrbG1ubz1Ob25lLCBwcXJzdD1Ob25lKSksCisgICAgXQorCisgICAgdXNhZ2Vfd2hlbl9ub3RfcmVxdWlyZWQgPSAnJydcCisgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1hYmNkZSBBQkNERV0gWy0tZmdoaWogRkdISUpdCisgICAgICAgICAgICAgICAgWy0ta2xtbm8gS0xNTk8gfCAtLXBxcnN0IFBRUlNUXQorICAgICcnJworICAgIHVzYWdlX3doZW5fcmVxdWlyZWQgPSAnJydcCisgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1hYmNkZSBBQkNERV0gWy0tZmdoaWogRkdISUpdCisgICAgICAgICAgICAgICAgKC0ta2xtbm8gS0xNTk8gfCAtLXBxcnN0IFBRUlNUKQorICAgICcnJworICAgIGhlbHAgPSAnJydcCisKKyAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAtaCwgLS1oZWxwICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAtLWFiY2RlIEFCQ0RFICBhYmNkZSBoZWxwCisgICAgICAtLWZnaGlqIEZHSElKICBmZ2hpaiBoZWxwCisgICAgICAtLWtsbW5vIEtMTU5PICBrbG1ubyBoZWxwCisgICAgICAtLXBxcnN0IFBRUlNUICBwcXJzdCBoZWxwCisgICAgJycnCisKKworY2xhc3MgVGVzdE11dHVhbGx5RXhjbHVzaXZlRmlyc3RTdXBwcmVzc2VkKE1FTWl4aW4sIFRlc3RDYXNlKToKKworICAgIGRlZiBnZXRfcGFyc2VyKHNlbGYsIHJlcXVpcmVkKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAocmVxdWlyZWQ9cmVxdWlyZWQpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXgnLCBoZWxwPWFyZ3BhcnNlLlNVUFBSRVNTKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJy15JywgYWN0aW9uPSdzdG9yZV9mYWxzZScsIGhlbHA9J3kgaGVscCcpCisgICAgICAgIHJldHVybiBwYXJzZXIKKworICAgIGZhaWx1cmVzID0gWycteCBYIC15J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnLXggWCcsIE5TKHg9J1gnLCB5PVRydWUpKSwKKyAgICAgICAgKCcteCBYIC14IFknLCBOUyh4PSdZJywgeT1UcnVlKSksCisgICAgICAgICgnLXknLCBOUyh4PU5vbmUsIHk9RmFsc2UpKSwKKyAgICBdCisgICAgc3VjY2Vzc2VzX3doZW5fbm90X3JlcXVpcmVkID0gWworICAgICAgICAoJycsIE5TKHg9Tm9uZSwgeT1UcnVlKSksCisgICAgXQorCisgICAgdXNhZ2Vfd2hlbl9ub3RfcmVxdWlyZWQgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy15XQorICAgICAgICAnJycKKyAgICB1c2FnZV93aGVuX3JlcXVpcmVkID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIC15CisgICAgICAgICcnJworICAgIGhlbHAgPSAnJydcCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAteSAgICAgICAgICB5IGhlbHAKKyAgICAgICAgJycnCisKKworY2xhc3MgVGVzdE11dHVhbGx5RXhjbHVzaXZlTWFueVN1cHByZXNzZWQoTUVNaXhpbiwgVGVzdENhc2UpOgorCisgICAgZGVmIGdldF9wYXJzZXIoc2VsZiwgcmVxdWlyZWQpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihwcm9nPSdQUk9HJykKKyAgICAgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cChyZXF1aXJlZD1yZXF1aXJlZCkKKyAgICAgICAgYWRkID0gZ3JvdXAuYWRkX2FyZ3VtZW50CisgICAgICAgIGFkZCgnLS1zcGFtJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD1hcmdwYXJzZS5TVVBQUkVTUykKKyAgICAgICAgYWRkKCctLWJhZGdlcicsIGFjdGlvbj0nc3RvcmVfZmFsc2UnLCBoZWxwPWFyZ3BhcnNlLlNVUFBSRVNTKQorICAgICAgICBhZGQoJy0tYmxhZGRlcicsIGhlbHA9YXJncGFyc2UuU1VQUFJFU1MpCisgICAgICAgIHJldHVybiBwYXJzZXIKKworICAgIGZhaWx1cmVzID0gWworICAgICAgICAnLS1zcGFtIC0tYmFkZ2VyJywKKyAgICAgICAgJy0tYmFkZ2VyIC0tYmxhZGRlciBCJywKKyAgICAgICAgJy0tYmxhZGRlciBCIC0tc3BhbScsCisgICAgXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCctLXNwYW0nLCBOUyhzcGFtPVRydWUsIGJhZGdlcj1UcnVlLCBibGFkZGVyPU5vbmUpKSwKKyAgICAgICAgKCctLWJhZGdlcicsIE5TKHNwYW09RmFsc2UsIGJhZGdlcj1GYWxzZSwgYmxhZGRlcj1Ob25lKSksCisgICAgICAgICgnLS1ibGFkZGVyIEInLCBOUyhzcGFtPUZhbHNlLCBiYWRnZXI9VHJ1ZSwgYmxhZGRlcj0nQicpKSwKKyAgICAgICAgKCctLXNwYW0gLS1zcGFtJywgTlMoc3BhbT1UcnVlLCBiYWRnZXI9VHJ1ZSwgYmxhZGRlcj1Ob25lKSksCisgICAgXQorICAgIHN1Y2Nlc3Nlc193aGVuX25vdF9yZXF1aXJlZCA9IFsKKyAgICAgICAgKCcnLCBOUyhzcGFtPUZhbHNlLCBiYWRnZXI9VHJ1ZSwgYmxhZGRlcj1Ob25lKSksCisgICAgXQorCisgICAgdXNhZ2Vfd2hlbl9yZXF1aXJlZCA9IHVzYWdlX3doZW5fbm90X3JlcXVpcmVkID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdCisgICAgICAgICcnJworICAgIGhlbHAgPSAnJydcCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgJycnCisKKworY2xhc3MgVGVzdE11dHVhbGx5RXhjbHVzaXZlT3B0aW9uYWxBbmRQb3NpdGlvbmFsKE1FTWl4aW4sIFRlc3RDYXNlKToKKworICAgIGRlZiBnZXRfcGFyc2VyKHNlbGYsIHJlcXVpcmVkKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAocmVxdWlyZWQ9cmVxdWlyZWQpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1mb28nLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdGT08nKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tc3BhbScsIGhlbHA9J1NQQU0nKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJ2JhZGdlcicsIG5hcmdzPScqJywgZGVmYXVsdD0nWCcsIGhlbHA9J0JBREdFUicpCisgICAgICAgIHJldHVybiBwYXJzZXIKKworICAgIGZhaWx1cmVzID0gWworICAgICAgICAnLS1mb28gLS1zcGFtIFMnLAorICAgICAgICAnLS1zcGFtIFMgWCcsCisgICAgICAgICdYIC0tZm9vJywKKyAgICAgICAgJ1ggWSBaIC0tc3BhbSBTJywKKyAgICAgICAgJy0tZm9vIFggWScsCisgICAgXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCctLWZvbycsIE5TKGZvbz1UcnVlLCBzcGFtPU5vbmUsIGJhZGdlcj0nWCcpKSwKKyAgICAgICAgKCctLXNwYW0gUycsIE5TKGZvbz1GYWxzZSwgc3BhbT0nUycsIGJhZGdlcj0nWCcpKSwKKyAgICAgICAgKCdYJywgTlMoZm9vPUZhbHNlLCBzcGFtPU5vbmUsIGJhZGdlcj1bJ1gnXSkpLAorICAgICAgICAoJ1ggWSBaJywgTlMoZm9vPUZhbHNlLCBzcGFtPU5vbmUsIGJhZGdlcj1bJ1gnLCAnWScsICdaJ10pKSwKKyAgICBdCisgICAgc3VjY2Vzc2VzX3doZW5fbm90X3JlcXVpcmVkID0gWworICAgICAgICAoJycsIE5TKGZvbz1GYWxzZSwgc3BhbT1Ob25lLCBiYWRnZXI9J1gnKSksCisgICAgXQorCisgICAgdXNhZ2Vfd2hlbl9ub3RfcmVxdWlyZWQgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy0tZm9vIHwgLS1zcGFtIFNQQU0gfCBiYWRnZXIgW2JhZGdlciAuLi5dXQorICAgICAgICAnJycKKyAgICB1c2FnZV93aGVuX3JlcXVpcmVkID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdICgtLWZvbyB8IC0tc3BhbSBTUEFNIHwgYmFkZ2VyIFtiYWRnZXIgLi4uXSkKKyAgICAgICAgJycnCisgICAgaGVscCA9ICcnJ1wKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBiYWRnZXIgICAgICAgQkFER0VSCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLS1mb28gICAgICAgIEZPTworICAgICAgICAgIC0tc3BhbSBTUEFNICBTUEFNCisgICAgICAgICcnJworCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZU9wdGlvbmFsc01peGVkKE1FTWl4aW4sIFRlc3RDYXNlKToKKworICAgIGRlZiBnZXRfcGFyc2VyKHNlbGYsIHJlcXVpcmVkKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy14JywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0neCBoZWxwJykKKyAgICAgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cChyZXF1aXJlZD1yZXF1aXJlZCkKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctYScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J2EgaGVscCcpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWInLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdiIGhlbHAnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCcteScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J3kgaGVscCcpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWMnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdjIGhlbHAnKQorICAgICAgICByZXR1cm4gcGFyc2VyCisKKyAgICBmYWlsdXJlcyA9IFsnLWEgLWInLCAnLWIgLWMnLCAnLWEgLWMnLCAnLWEgLWIgLWMnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCctYScsIE5TKGE9VHJ1ZSwgYj1GYWxzZSwgYz1GYWxzZSwgeD1GYWxzZSwgeT1GYWxzZSkpLAorICAgICAgICAoJy1iJywgTlMoYT1GYWxzZSwgYj1UcnVlLCBjPUZhbHNlLCB4PUZhbHNlLCB5PUZhbHNlKSksCisgICAgICAgICgnLWMnLCBOUyhhPUZhbHNlLCBiPUZhbHNlLCBjPVRydWUsIHg9RmFsc2UsIHk9RmFsc2UpKSwKKyAgICAgICAgKCctYSAteCcsIE5TKGE9VHJ1ZSwgYj1GYWxzZSwgYz1GYWxzZSwgeD1UcnVlLCB5PUZhbHNlKSksCisgICAgICAgICgnLXkgLWInLCBOUyhhPUZhbHNlLCBiPVRydWUsIGM9RmFsc2UsIHg9RmFsc2UsIHk9VHJ1ZSkpLAorICAgICAgICAoJy14IC15IC1jJywgTlMoYT1GYWxzZSwgYj1GYWxzZSwgYz1UcnVlLCB4PVRydWUsIHk9VHJ1ZSkpLAorICAgIF0KKyAgICBzdWNjZXNzZXNfd2hlbl9ub3RfcmVxdWlyZWQgPSBbCisgICAgICAgICgnJywgTlMoYT1GYWxzZSwgYj1GYWxzZSwgYz1GYWxzZSwgeD1GYWxzZSwgeT1GYWxzZSkpLAorICAgICAgICAoJy14JywgTlMoYT1GYWxzZSwgYj1GYWxzZSwgYz1GYWxzZSwgeD1UcnVlLCB5PUZhbHNlKSksCisgICAgICAgICgnLXknLCBOUyhhPUZhbHNlLCBiPUZhbHNlLCBjPUZhbHNlLCB4PUZhbHNlLCB5PVRydWUpKSwKKyAgICBdCisKKyAgICB1c2FnZV93aGVuX3JlcXVpcmVkID0gdXNhZ2Vfd2hlbl9ub3RfcmVxdWlyZWQgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy14XSBbLWFdIFstYl0gWy15XSBbLWNdCisgICAgICAgICcnJworICAgIGhlbHAgPSAnJydcCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAteCAgICAgICAgICB4IGhlbHAKKyAgICAgICAgICAtYSAgICAgICAgICBhIGhlbHAKKyAgICAgICAgICAtYiAgICAgICAgICBiIGhlbHAKKyAgICAgICAgICAteSAgICAgICAgICB5IGhlbHAKKyAgICAgICAgICAtYyAgICAgICAgICBjIGhlbHAKKyAgICAgICAgJycnCisKKworY2xhc3MgVGVzdE11dHVhbGx5RXhjbHVzaXZlSW5Hcm91cChNRU1peGluLCBUZXN0Q2FzZSk6CisKKyAgICBkZWYgZ2V0X3BhcnNlcihzZWxmLCByZXF1aXJlZD1Ob25lKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCisgICAgICAgIHRpdGxlZF9ncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoCisgICAgICAgICAgICB0aXRsZT0nVGl0bGVkIGdyb3VwJywgZGVzY3JpcHRpb249J0dyb3VwIGRlc2NyaXB0aW9uJykKKyAgICAgICAgbXV0ZXhfZ3JvdXAgPSBcCisgICAgICAgICAgICB0aXRsZWRfZ3JvdXAuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cChyZXF1aXJlZD1yZXF1aXJlZCkKKyAgICAgICAgbXV0ZXhfZ3JvdXAuYWRkX2FyZ3VtZW50KCctLWJhcicsIGhlbHA9J2JhciBoZWxwJykKKyAgICAgICAgbXV0ZXhfZ3JvdXAuYWRkX2FyZ3VtZW50KCctLWJheicsIGhlbHA9J2JheiBoZWxwJykKKyAgICAgICAgcmV0dXJuIHBhcnNlcgorCisgICAgZmFpbHVyZXMgPSBbJy0tYmFyIFggLS1iYXogWScsICctLWJheiBYIC0tYmFyIFknXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCctLWJhciBYJywgTlMoYmFyPSdYJywgYmF6PU5vbmUpKSwKKyAgICAgICAgKCctLWJheiBZJywgTlMoYmFyPU5vbmUsIGJhej0nWScpKSwKKyAgICBdCisgICAgc3VjY2Vzc2VzX3doZW5fbm90X3JlcXVpcmVkID0gWworICAgICAgICAoJycsIE5TKGJhcj1Ob25lLCBiYXo9Tm9uZSkpLAorICAgIF0KKworICAgIHVzYWdlX3doZW5fbm90X3JlcXVpcmVkID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstLWJhciBCQVIgfCAtLWJheiBCQVpdCisgICAgICAgICcnJworICAgIHVzYWdlX3doZW5fcmVxdWlyZWQgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gKC0tYmFyIEJBUiB8IC0tYmF6IEJBWikKKyAgICAgICAgJycnCisgICAgaGVscCA9ICcnJ1wKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorCisgICAgICAgIFRpdGxlZCBncm91cDoKKyAgICAgICAgICBHcm91cCBkZXNjcmlwdGlvbgorCisgICAgICAgICAgLS1iYXIgQkFSICAgYmFyIGhlbHAKKyAgICAgICAgICAtLWJheiBCQVogICBiYXogaGVscAorICAgICAgICAnJycKKworCitjbGFzcyBUZXN0TXV0dWFsbHlFeGNsdXNpdmVPcHRpb25hbHNBbmRQb3NpdGlvbmFsc01peGVkKE1FTWl4aW4sIFRlc3RDYXNlKToKKworICAgIGRlZiBnZXRfcGFyc2VyKHNlbGYsIHJlcXVpcmVkKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3gnLCBoZWxwPSd4IGhlbHAnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCcteScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J3kgaGVscCcpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAocmVxdWlyZWQ9cmVxdWlyZWQpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnYScsIG5hcmdzPSc/JywgaGVscD0nYSBoZWxwJykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctYicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J2IgaGVscCcpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWMnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdjIGhlbHAnKQorICAgICAgICByZXR1cm4gcGFyc2VyCisKKyAgICBmYWlsdXJlcyA9IFsnWCBBIC1iJywgJy1iIC1jJywgJy1jIFggQSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ1ggQScsIE5TKGE9J0EnLCBiPUZhbHNlLCBjPUZhbHNlLCB4PSdYJywgeT1GYWxzZSkpLAorICAgICAgICAoJ1ggLWInLCBOUyhhPU5vbmUsIGI9VHJ1ZSwgYz1GYWxzZSwgeD0nWCcsIHk9RmFsc2UpKSwKKyAgICAgICAgKCdYIC1jJywgTlMoYT1Ob25lLCBiPUZhbHNlLCBjPVRydWUsIHg9J1gnLCB5PUZhbHNlKSksCisgICAgICAgICgnWCBBIC15JywgTlMoYT0nQScsIGI9RmFsc2UsIGM9RmFsc2UsIHg9J1gnLCB5PVRydWUpKSwKKyAgICAgICAgKCdYIC15IC1iJywgTlMoYT1Ob25lLCBiPVRydWUsIGM9RmFsc2UsIHg9J1gnLCB5PVRydWUpKSwKKyAgICBdCisgICAgc3VjY2Vzc2VzX3doZW5fbm90X3JlcXVpcmVkID0gWworICAgICAgICAoJ1gnLCBOUyhhPU5vbmUsIGI9RmFsc2UsIGM9RmFsc2UsIHg9J1gnLCB5PUZhbHNlKSksCisgICAgICAgICgnWCAteScsIE5TKGE9Tm9uZSwgYj1GYWxzZSwgYz1GYWxzZSwgeD0nWCcsIHk9VHJ1ZSkpLAorICAgIF0KKworICAgIHVzYWdlX3doZW5fcmVxdWlyZWQgPSB1c2FnZV93aGVuX25vdF9yZXF1aXJlZCA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXldIFstYl0gWy1jXSB4IFthXQorICAgICAgICAnJycKKyAgICBoZWxwID0gJycnXAorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIHggICAgICAgICAgIHggaGVscAorICAgICAgICAgIGEgICAgICAgICAgIGEgaGVscAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXkgICAgICAgICAgeSBoZWxwCisgICAgICAgICAgLWIgICAgICAgICAgYiBoZWxwCisgICAgICAgICAgLWMgICAgICAgICAgYyBoZWxwCisgICAgICAgICcnJworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgTXV0dWFsbHkgZXhjbHVzaXZlIGdyb3VwIGluIHBhcmVudCBwYXJzZXIgdGVzdHMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBNRVBCYXNlKG9iamVjdCk6CisKKyAgICBkZWYgZ2V0X3BhcnNlcihzZWxmLCByZXF1aXJlZD1Ob25lKToKKyAgICAgICAgcGFyZW50ID0gc3VwZXIoTUVQQmFzZSwgc2VsZikuZ2V0X3BhcnNlcihyZXF1aXJlZD1yZXF1aXJlZCkKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoCisgICAgICAgICAgICBwcm9nPXBhcmVudC5wcm9nLCBhZGRfaGVscD1GYWxzZSwgcGFyZW50cz1bcGFyZW50XSkKKyAgICAgICAgcmV0dXJuIHBhcnNlcgorCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZUdyb3VwRXJyb3JzUGFyZW50KAorICAgIE1FUEJhc2UsIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZUdyb3VwRXJyb3JzKToKKyAgICBwYXNzCisKKworY2xhc3MgVGVzdE11dHVhbGx5RXhjbHVzaXZlU2ltcGxlUGFyZW50KAorICAgIE1FUEJhc2UsIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZVNpbXBsZSk6CisgICAgcGFzcworCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZUxvbmdQYXJlbnQoCisgICAgTUVQQmFzZSwgVGVzdE11dHVhbGx5RXhjbHVzaXZlTG9uZyk6CisgICAgcGFzcworCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZUZpcnN0U3VwcHJlc3NlZFBhcmVudCgKKyAgICBNRVBCYXNlLCBUZXN0TXV0dWFsbHlFeGNsdXNpdmVGaXJzdFN1cHByZXNzZWQpOgorICAgIHBhc3MKKworCitjbGFzcyBUZXN0TXV0dWFsbHlFeGNsdXNpdmVNYW55U3VwcHJlc3NlZFBhcmVudCgKKyAgICBNRVBCYXNlLCBUZXN0TXV0dWFsbHlFeGNsdXNpdmVNYW55U3VwcHJlc3NlZCk6CisgICAgcGFzcworCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZU9wdGlvbmFsQW5kUG9zaXRpb25hbFBhcmVudCgKKyAgICBNRVBCYXNlLCBUZXN0TXV0dWFsbHlFeGNsdXNpdmVPcHRpb25hbEFuZFBvc2l0aW9uYWwpOgorICAgIHBhc3MKKworCitjbGFzcyBUZXN0TXV0dWFsbHlFeGNsdXNpdmVPcHRpb25hbHNNaXhlZFBhcmVudCgKKyAgICBNRVBCYXNlLCBUZXN0TXV0dWFsbHlFeGNsdXNpdmVPcHRpb25hbHNNaXhlZCk6CisgICAgcGFzcworCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZU9wdGlvbmFsc0FuZFBvc2l0aW9uYWxzTWl4ZWRQYXJlbnQoCisgICAgTUVQQmFzZSwgVGVzdE11dHVhbGx5RXhjbHVzaXZlT3B0aW9uYWxzQW5kUG9zaXRpb25hbHNNaXhlZCk6CisgICAgcGFzcworCisjID09PT09PT09PT09PT09PT09CisjIFNldCBkZWZhdWx0IHRlc3RzCisjID09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RTZXREZWZhdWx0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zZXRfZGVmYXVsdHNfbm9fYXJncyhzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKHg9J2ZvbycpCisgICAgICAgIHBhcnNlci5zZXRfZGVmYXVsdHMoeT0nYmFyJywgej0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKHg9J2ZvbycsIHk9J2JhcicsIHo9MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoW10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKHg9J2ZvbycsIHk9J2JhcicsIHo9MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoW10sIE5TKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKHg9J2JheicsIHk9J2JhcicsIHo9MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoW10sIE5TKHg9J2JheicpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh4PSdiYXonLCB5PSdiYXInLCB6PTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKFtdLCBOUyh4PSdiYXonLCB6PTIpKSkKKworICAgIGRlZiB0ZXN0X3NldF9kZWZhdWx0c193aXRoX2FyZ3Moc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnNldF9kZWZhdWx0cyh4PSdmb28nLCB5PSdiYXInKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCcteCcsIGRlZmF1bHQ9J3hmb294JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh4PSd4Zm9veCcsIHk9J2JhcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKFtdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh4PSd4Zm9veCcsIHk9J2JhcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKFtdLCBOUygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh4PSdiYXonLCB5PSdiYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncyhbXSwgTlMoeD0nYmF6JykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKHg9JzEnLCB5PSdiYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncygnLXggMScuc3BsaXQoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoeD0nMScsIHk9J2JhcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKCcteCAxJy5zcGxpdCgpLCBOUygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh4PScxJywgeT0nYmFyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoJy14IDEnLnNwbGl0KCksIE5TKHg9J2JheicpKSkKKworICAgIGRlZiB0ZXN0X3NldF9kZWZhdWx0c19zdWJwYXJzZXJzKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRfZGVmYXVsdHMoeD0nZm9vJykKKyAgICAgICAgc3VicGFyc2VycyA9IHBhcnNlci5hZGRfc3VicGFyc2VycygpCisgICAgICAgIHBhcnNlcl9hID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCdhJykKKyAgICAgICAgcGFyc2VyX2Euc2V0X2RlZmF1bHRzKHk9J2JhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoeD0nZm9vJywgeT0nYmFyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoJ2EnLnNwbGl0KCkpKQorCisgICAgZGVmIHRlc3Rfc2V0X2RlZmF1bHRzX3BhcmVudHMoc2VsZik6CisgICAgICAgIHBhcmVudCA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKGFkZF9oZWxwPUZhbHNlKQorICAgICAgICBwYXJlbnQuc2V0X2RlZmF1bHRzKHg9J2ZvbycpCisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHBhcmVudHM9W3BhcmVudF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoeD0nZm9vJyksIHBhcnNlci5wYXJzZV9hcmdzKFtdKSkKKworICAgIGRlZiB0ZXN0X3NldF9kZWZhdWx0c19zYW1lX2FzX2FkZF9hcmd1bWVudChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKHc9J1cnLCB4PSdYJywgeT0nWScsIHo9J1onKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdycpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy14JywgZGVmYXVsdD0nWFgnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCd5JywgbmFyZ3M9Jz8nKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCd6JywgbmFyZ3M9Jz8nLCBkZWZhdWx0PSdaWicpCisKKyAgICAgICAgIyBkZWZhdWx0cyBzZXQgcHJldmlvdXNseQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKHc9J1cnLCB4PSdYWCcsIHk9J1knLCB6PSdaWicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKFtdKSkKKworICAgICAgICAjIHJlc2V0IGRlZmF1bHRzCisgICAgICAgIHBhcnNlci5zZXRfZGVmYXVsdHModz0nV1cnLCB4PSdYJywgeT0nWVknLCB6PSdaJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh3PSdXVycsIHg9J1gnLCB5PSdZWScsIHo9J1onKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncyhbXSkpCisKKyAgICBkZWYgdGVzdF9zZXRfZGVmYXVsdHNfc2FtZV9hc19hZGRfYXJndW1lbnRfZ3JvdXAoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnNldF9kZWZhdWx0cyh3PSdXJywgeD0nWCcsIHk9J1knLCB6PSdaJykKKyAgICAgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCdmb28nKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJy13JykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCcteCcsIGRlZmF1bHQ9J1hYJykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCd5JywgbmFyZ3M9Jz8nKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJ3onLCBuYXJncz0nPycsIGRlZmF1bHQ9J1paJykKKworCisgICAgICAgICMgZGVmYXVsdHMgc2V0IHByZXZpb3VzbHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh3PSdXJywgeD0nWFgnLCB5PSdZJywgej0nWlonKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncyhbXSkpCisKKyAgICAgICAgIyByZXNldCBkZWZhdWx0cworICAgICAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKHc9J1dXJywgeD0nWCcsIHk9J1lZJywgej0nWicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlModz0nV1cnLCB4PSdYJywgeT0nWVknLCB6PSdaJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoW10pKQorCisjID09PT09PT09PT09PT09PT09CisjIEdldCBkZWZhdWx0IHRlc3RzCisjID09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RHZXREZWZhdWx0KFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2dldF9kZWZhdWx0KHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgcGFyc2VyLmdldF9kZWZhdWx0KCJmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBwYXJzZXIuZ2V0X2RlZmF1bHQoImJhciIpKQorCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBwYXJzZXIuZ2V0X2RlZmF1bHQoImZvbyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHBhcnNlci5nZXRfZGVmYXVsdCgiYmFyIikpCisKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1iYXIiLCB0eXBlPWludCwgZGVmYXVsdD00MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBwYXJzZXIuZ2V0X2RlZmF1bHQoImZvbyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBwYXJzZXIuZ2V0X2RlZmF1bHQoImJhciIpKQorCisgICAgICAgIHBhcnNlci5zZXRfZGVmYXVsdHMoZm9vPSJiYWRnZXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJiYWRnZXIiLCBwYXJzZXIuZ2V0X2RlZmF1bHQoImZvbyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBwYXJzZXIuZ2V0X2RlZmF1bHQoImJhciIpKQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09CisjIE5hbWVzcGFjZSAnY29udGFpbnMnIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3ROYW1lc3BhY2VDb250YWluc1NpbXBsZShUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKKyAgICAgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnIGluIG5zLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBub3QgaW4gbnMsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3gnIGluIG5zLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X25vbl9lbXB0eShzZWxmKToKKyAgICAgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoeD0xLCB5PTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3gnIGluIG5zLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd4JyBub3QgaW4gbnMsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd5JyBpbiBucywgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBpbiBucywgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3h4JyBpbiBucywgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3onIGluIG5zLCBGYWxzZSkKKworIyA9PT09PT09PT09PT09PT09PT09PT0KKyMgSGVscCBmb3JtYXR0aW5nIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0SGVscEZvcm1hdHRpbmdNZXRhY2xhc3ModHlwZSk6CisKKyAgICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgYm9keWRpY3QpOgorICAgICAgICBpZiBuYW1lID09ICdIZWxwVGVzdENhc2UnOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgY2xhc3MgQWRkVGVzdHMob2JqZWN0KToKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RfY2xhc3MsIGZ1bmNfc3VmZml4LCBzdGRfbmFtZSk6CisgICAgICAgICAgICAgICAgc2VsZi5mdW5jX3N1ZmZpeCA9IGZ1bmNfc3VmZml4CisgICAgICAgICAgICAgICAgc2VsZi5zdGRfbmFtZSA9IHN0ZF9uYW1lCisKKyAgICAgICAgICAgICAgICBmb3IgdGVzdF9mdW5jIGluIFtzZWxmLnRlc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGVzdF9wcmludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlc3RfcHJpbnRfZmlsZV06CisgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSA9ICclc18lcycgJSAodGVzdF9mdW5jLl9fbmFtZV9fLCBmdW5jX3N1ZmZpeCkKKworICAgICAgICAgICAgICAgICAgICBkZWYgdGVzdF93cmFwcGVyKHNlbGYsIHRlc3RfZnVuYz10ZXN0X2Z1bmMpOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9mdW5jKHNlbGYpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfd3JhcHBlci5fX25hbWVfXyA9IHRlc3RfbmFtZQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHRlc3RfY2xhc3MsIHRlc3RfbmFtZSwgdGVzdF93cmFwcGVyKQorCisgICAgICAgICAgICBkZWYgX2dldF9wYXJzZXIoc2VsZiwgdGVzdGVyKToKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICAgICAgICAgICAgICAgICAgKnRlc3Rlci5wYXJzZXJfc2lnbmF0dXJlLmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICoqdGVzdGVyLnBhcnNlcl9zaWduYXR1cmUua3dhcmdzKQorICAgICAgICAgICAgICAgIGZvciBhcmd1bWVudF9zaWcgaW4gZ2V0YXR0cih0ZXN0ZXIsICdhcmd1bWVudF9zaWduYXR1cmVzJywgW10pOgorICAgICAgICAgICAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCphcmd1bWVudF9zaWcuYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmFyZ3VtZW50X3NpZy5rd2FyZ3MpCisgICAgICAgICAgICAgICAgZ3JvdXBfc2lncyA9IGdldGF0dHIodGVzdGVyLCAnYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcycsIFtdKQorICAgICAgICAgICAgICAgIGZvciBncm91cF9zaWcsIGFyZ3VtZW50X3NpZ3MgaW4gZ3JvdXBfc2lnczoKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKCpncm91cF9zaWcuYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqZ3JvdXBfc2lnLmt3YXJncykKKyAgICAgICAgICAgICAgICAgICAgZm9yIGFyZ3VtZW50X3NpZyBpbiBhcmd1bWVudF9zaWdzOgorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCphcmd1bWVudF9zaWcuYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmFyZ3VtZW50X3NpZy5rd2FyZ3MpCisgICAgICAgICAgICAgICAgc3VicGFyc2Vyc19zaWdzID0gZ2V0YXR0cih0ZXN0ZXIsICdzdWJwYXJzZXJzX3NpZ25hdHVyZXMnLCBbXSkKKyAgICAgICAgICAgICAgICBpZiBzdWJwYXJzZXJzX3NpZ3M6CisgICAgICAgICAgICAgICAgICAgIHN1YnBhcnNlcnMgPSBwYXJzZXIuYWRkX3N1YnBhcnNlcnMoKQorICAgICAgICAgICAgICAgICAgICBmb3Igc3VicGFyc2VyX3NpZyBpbiBzdWJwYXJzZXJzX3NpZ3M6CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoKnN1YnBhcnNlcl9zaWcuYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKipzdWJwYXJzZXJfc2lnLmt3YXJncykKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyCisKKyAgICAgICAgICAgIGRlZiBfdGVzdChzZWxmLCB0ZXN0ZXIsIHBhcnNlcl90ZXh0KToKKyAgICAgICAgICAgICAgICBleHBlY3RlZF90ZXh0ID0gZ2V0YXR0cih0ZXN0ZXIsIHNlbGYuZnVuY19zdWZmaXgpCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfdGV4dCA9IHRleHR3cmFwLmRlZGVudChleHBlY3RlZF90ZXh0KQorICAgICAgICAgICAgICAgIGlmIGV4cGVjdGVkX3RleHQgIT0gcGFyc2VyX3RleHQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50KHJlcHIoZXhwZWN0ZWRfdGV4dCkpCisgICAgICAgICAgICAgICAgICAgIHByaW50KHJlcHIocGFyc2VyX3RleHQpKQorICAgICAgICAgICAgICAgICAgICBmb3IgY2hhcjEsIGNoYXIyIGluIHppcChleHBlY3RlZF90ZXh0LCBwYXJzZXJfdGV4dCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGFyMSAhPSBjaGFyMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCgnZmlyc3QgZGlmZjogJXIgJXInICUgKGNoYXIxLCBjaGFyMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB0ZXN0ZXIuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdGV4dCwgcGFyc2VyX3RleHQpCisKKyAgICAgICAgICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmLCB0ZXN0ZXIpOgorICAgICAgICAgICAgICAgIHBhcnNlciA9IHNlbGYuX2dldF9wYXJzZXIodGVzdGVyKQorICAgICAgICAgICAgICAgIGZvcm1hdCA9IGdldGF0dHIocGFyc2VyLCAnZm9ybWF0XyVzJyAlIHNlbGYuZnVuY19zdWZmaXgpCisgICAgICAgICAgICAgICAgc2VsZi5fdGVzdCh0ZXN0ZXIsIGZvcm1hdCgpKQorCisgICAgICAgICAgICBkZWYgdGVzdF9wcmludChzZWxmLCB0ZXN0ZXIpOgorICAgICAgICAgICAgICAgIHBhcnNlciA9IHNlbGYuX2dldF9wYXJzZXIodGVzdGVyKQorICAgICAgICAgICAgICAgIHByaW50XyA9IGdldGF0dHIocGFyc2VyLCAncHJpbnRfJXMnICUgc2VsZi5mdW5jX3N1ZmZpeCkKKyAgICAgICAgICAgICAgICBvbGRfc3RyZWFtID0gZ2V0YXR0cihzeXMsIHNlbGYuc3RkX25hbWUpCisgICAgICAgICAgICAgICAgc2V0YXR0cihzeXMsIHNlbGYuc3RkX25hbWUsIFN0ZElPQnVmZmVyKCkpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwcmludF8oKQorICAgICAgICAgICAgICAgICAgICBwYXJzZXJfdGV4dCA9IGdldGF0dHIoc3lzLCBzZWxmLnN0ZF9uYW1lKS5nZXR2YWx1ZSgpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzeXMsIHNlbGYuc3RkX25hbWUsIG9sZF9zdHJlYW0pCisgICAgICAgICAgICAgICAgc2VsZi5fdGVzdCh0ZXN0ZXIsIHBhcnNlcl90ZXh0KQorCisgICAgICAgICAgICBkZWYgdGVzdF9wcmludF9maWxlKHNlbGYsIHRlc3Rlcik6CisgICAgICAgICAgICAgICAgcGFyc2VyID0gc2VsZi5fZ2V0X3BhcnNlcih0ZXN0ZXIpCisgICAgICAgICAgICAgICAgcHJpbnRfID0gZ2V0YXR0cihwYXJzZXIsICdwcmludF8lcycgJSBzZWxmLmZ1bmNfc3VmZml4KQorICAgICAgICAgICAgICAgIHNmaWxlID0gU3RkSU9CdWZmZXIoKQorICAgICAgICAgICAgICAgIHByaW50XyhzZmlsZSkKKyAgICAgICAgICAgICAgICBwYXJzZXJfdGV4dCA9IHNmaWxlLmdldHZhbHVlKCkKKyAgICAgICAgICAgICAgICBzZWxmLl90ZXN0KHRlc3RlciwgcGFyc2VyX3RleHQpCisKKyAgICAgICAgIyBhZGQgdGVzdHMgZm9yIHtmb3JtYXQscHJpbnR9X3t1c2FnZSxoZWxwLHZlcnNpb259CisgICAgICAgIGZvciBmdW5jX3N1ZmZpeCwgc3RkX25hbWUgaW4gWygndXNhZ2UnLCAnc3Rkb3V0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnaGVscCcsICdzdGRvdXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCd2ZXJzaW9uJywgJ3N0ZGVycicpXToKKyAgICAgICAgICAgIEFkZFRlc3RzKGNscywgZnVuY19zdWZmaXgsIHN0ZF9uYW1lKQorCitiYXNlcyA9IFRlc3RDYXNlLAorSGVscFRlc3RDYXNlID0gVGVzdEhlbHBGb3JtYXR0aW5nTWV0YWNsYXNzKCdIZWxwVGVzdENhc2UnLCBiYXNlcywge30pCisKKworY2xhc3MgVGVzdEhlbHBCaWdnZXJPcHRpb25hbHMoSGVscFRlc3RDYXNlKToKKyAgICAiIiJNYWtlIHN1cmUgdGhhdCBhcmd1bWVudCBoZWxwIGFsaWducyB3aGVuIG9wdGlvbnMgYXJlIGxvbmdlciIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJywgZGVzY3JpcHRpb249J0RFU0NSSVBUSU9OJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwaWxvZz0nRVBJTE9HJywgdmVyc2lvbj0nMC4xJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nWCBIRUxQJyksCisgICAgICAgIFNpZygnLS15JywgaGVscD0nWSBIRUxQJyksCisgICAgICAgIFNpZygnZm9vJywgaGVscD0nRk9PIEhFTFAnKSwKKyAgICAgICAgU2lnKCdiYXInLCBoZWxwPSdCQVIgSEVMUCcpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXZdIFsteF0gWy0teSBZXSBmb28gYmFyCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBERVNDUklQVElPTgorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIGZvbyAgICAgICAgICAgIEZPTyBIRUxQCisgICAgICAgICAgYmFyICAgICAgICAgICAgQkFSIEhFTFAKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC12LCAtLXZlcnNpb24gIHNob3cgcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0CisgICAgICAgICAgLXggICAgICAgICAgICAgWCBIRUxQCisgICAgICAgICAgLS15IFkgICAgICAgICAgWSBIRUxQCisKKyAgICAgICAgRVBJTE9HCisgICAgJycnCisgICAgdmVyc2lvbiA9ICcnJ1wKKyAgICAgICAgMC4xCisgICAgICAgICcnJworCisKK2NsYXNzIFRlc3RIZWxwQmlnZ2VyT3B0aW9uYWxHcm91cHMoSGVscFRlc3RDYXNlKToKKyAgICAiIiJNYWtlIHN1cmUgdGhhdCBhcmd1bWVudCBoZWxwIGFsaWducyB3aGVuIG9wdGlvbnMgYXJlIGxvbmdlciIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJywgZGVzY3JpcHRpb249J0RFU0NSSVBUSU9OJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVwaWxvZz0nRVBJTE9HJywgdmVyc2lvbj0nMC4xJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nWCBIRUxQJyksCisgICAgICAgIFNpZygnLS15JywgaGVscD0nWSBIRUxQJyksCisgICAgICAgIFNpZygnZm9vJywgaGVscD0nRk9PIEhFTFAnKSwKKyAgICAgICAgU2lnKCdiYXInLCBoZWxwPSdCQVIgSEVMUCcpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gWworICAgICAgICAoU2lnKCdHUk9VUCBUSVRMRScsIGRlc2NyaXB0aW9uPSdHUk9VUCBERVNDUklQVElPTicpLCBbCisgICAgICAgICAgICBTaWcoJ2JheicsIGhlbHA9J0JBWiBIRUxQJyksCisgICAgICAgICAgICBTaWcoJy16JywgbmFyZ3M9JysnLCBoZWxwPSdaIEhFTFAnKV0pLAorICAgIF0KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXZdIFsteF0gWy0teSBZXSBbLXogWiBbWiAuLi5dXSBmb28gYmFyIGJhegorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgREVTQ1JJUFRJT04KKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBmb28gICAgICAgICAgICBGT08gSEVMUAorICAgICAgICAgIGJhciAgICAgICAgICAgIEJBUiBIRUxQCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtdiwgLS12ZXJzaW9uICBzaG93IHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorICAgICAgICAgIC14ICAgICAgICAgICAgIFggSEVMUAorICAgICAgICAgIC0teSBZICAgICAgICAgIFkgSEVMUAorCisgICAgICAgIEdST1VQIFRJVExFOgorICAgICAgICAgIEdST1VQIERFU0NSSVBUSU9OCisKKyAgICAgICAgICBiYXogICAgICAgICAgICBCQVogSEVMUAorICAgICAgICAgIC16IFogW1ogLi4uXSAgIFogSEVMUAorCisgICAgICAgIEVQSUxPRworICAgICcnJworICAgIHZlcnNpb24gPSAnJydcCisgICAgICAgIDAuMQorICAgICAgICAnJycKKworCitjbGFzcyBUZXN0SGVscEJpZ2dlclBvc2l0aW9uYWxzKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiTWFrZSBzdXJlIHRoYXQgaGVscCBhbGlnbnMgd2hlbiBhcmd1bWVudHMgYXJlIGxvbmdlciIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyh1c2FnZT0nVVNBR0UnLCBkZXNjcmlwdGlvbj0nREVTQ1JJUFRJT04nKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdYIEhFTFAnKSwKKyAgICAgICAgU2lnKCctLXknLCBoZWxwPSdZIEhFTFAnKSwKKyAgICAgICAgU2lnKCdla2lla2lla2lmZWthbmcnLCBoZWxwPSdFS0kgSEVMUCcpLAorICAgICAgICBTaWcoJ2JhcicsIGhlbHA9J0JBUiBIRUxQJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogVVNBR0UKKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIERFU0NSSVBUSU9OCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgZWtpZWtpZWtpZmVrYW5nICBFS0kgSEVMUAorICAgICAgICAgIGJhciAgICAgICAgICAgICAgQkFSIEhFTFAKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXggICAgICAgICAgICAgICBYIEhFTFAKKyAgICAgICAgICAtLXkgWSAgICAgICAgICAgIFkgSEVMUAorICAgICAgICAnJycKKworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwUmVmb3JtYXR0aW5nKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiTWFrZSBzdXJlIHRoYXQgdGV4dCBhZnRlciBzaG9ydCBuYW1lcyBzdGFydHMgb24gdGhlIGZpcnN0IGxpbmUiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcoCisgICAgICAgIHByb2c9J1BST0cnLAorICAgICAgICBkZXNjcmlwdGlvbj0nICAgb2RkbHkgICAgZm9ybWF0dGVkXG4nCisgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvblxuJworICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICd0aGF0IGlzIHNvIGxvbmcgdGhhdCBpdCBzaG91bGQgZ28gb250byBtdWx0aXBsZSAnCisgICAgICAgICAgICAgICAgICAgICdsaW5lcyB3aGVuIHdyYXBwZWQnKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCBtZXRhdmFyPSdYWCcsIGhlbHA9J29kZGx5XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBmb3JtYXR0ZWQgLXggaGVscCcpLAorICAgICAgICBTaWcoJ3knLCBtZXRhdmFyPSd5eXknLCBoZWxwPSdub3JtYWwgeSBoZWxwJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbCisgICAgICAgIChTaWcoJ3RpdGxlJywgZGVzY3JpcHRpb249J1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgb2RkbHkgZm9ybWF0dGVkIGdyb3VwXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicpLAorICAgICAgICAgW1NpZygnLWEnLCBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgICAgICAgICBoZWxwPScgb2RkbHkgXG4nCisgICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlZCAgICAtYSAgaGVscCAgXG4nCisgICAgICAgICAgICAgICAgICAgJyAgICBhZ2Fpbiwgc28gbG9uZyB0aGF0IGl0IHNob3VsZCBiZSB3cmFwcGVkIG92ZXIgJworICAgICAgICAgICAgICAgICAgICdtdWx0aXBsZSBsaW5lcycpXSksCisgICAgXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFsteCBYWF0gWy1hXSB5eXkKKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIG9kZGx5IGZvcm1hdHRlZCBkZXNjcmlwdGlvbiB0aGF0IGlzIHNvIGxvbmcgdGhhdCBpdCBzaG91bGQgZ28gb250byBcCittdWx0aXBsZQorICAgICAgICBsaW5lcyB3aGVuIHdyYXBwZWQKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICB5eXkgICAgICAgICBub3JtYWwgeSBoZWxwCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAteCBYWCAgICAgICBvZGRseSBmb3JtYXR0ZWQgLXggaGVscAorCisgICAgICAgIHRpdGxlOgorICAgICAgICAgIG9kZGx5IGZvcm1hdHRlZCBncm91cCBkZXNjcmlwdGlvbgorCisgICAgICAgICAgLWEgICAgICAgICAgb2RkbHkgZm9ybWF0dGVkIC1hIGhlbHAgYWdhaW4sIHNvIGxvbmcgdGhhdCBpdCBzaG91bGQgXAorYmUgd3JhcHBlZAorICAgICAgICAgICAgICAgICAgICAgIG92ZXIgbXVsdGlwbGUgbGluZXMKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBXcmFwcGluZ1Nob3J0TmFtZXMoSGVscFRlc3RDYXNlKToKKyAgICAiIiJNYWtlIHN1cmUgdGhhdCB0ZXh0IGFmdGVyIHNob3J0IG5hbWVzIHN0YXJ0cyBvbiB0aGUgZmlyc3QgbGluZSIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJywgZGVzY3JpcHRpb249ICdEXG5EJyAqIDMwKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCBtZXRhdmFyPSdYWCcsIGhlbHA9J1hISCBIWCcgKiAyMCksCisgICAgICAgIFNpZygneScsIG1ldGF2YXI9J3l5eScsIGhlbHA9J1lIIFlIJyAqIDIwKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgKFNpZygnQUxQSEFTJyksIFsKKyAgICAgICAgICAgIFNpZygnLWEnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdBSEhIIEhIQScgKiAxMCldKSwKKyAgICBdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy14IFhYXSBbLWFdIHl5eQorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgRCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBcCitERCBERCBERAorICAgICAgICBERCBERCBERCBERCBECisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgeXl5ICAgICAgICAgWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFlIWUggWUhZSCBcCitZSFlIIFlIWUgKKyAgICAgICAgICAgICAgICAgICAgICBZSFlIIFlIWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFlICisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAteCBYWCAgICAgICBYSEggSFhYSEggSFhYSEggSFhYSEggSFhYSEggSFhYSEggSFhYSEggSFhYSEggSFhYSEggXAorSFhYSEggSFhYSEgKKyAgICAgICAgICAgICAgICAgICAgICBIWFhISCBIWFhISCBIWFhISCBIWFhISCBIWFhISCBIWFhISCBIWFhISCBIWFhISCBIWFhISCBIWAorCisgICAgICAgIEFMUEhBUzoKKyAgICAgICAgICAtYSAgICAgICAgICBBSEhIIEhIQUFISEggSEhBQUhISCBISEFBSEhIIEhIQUFISEggSEhBQUhISCBISEFBSEhIIFwKK0hIQUFISEgKKyAgICAgICAgICAgICAgICAgICAgICBISEFBSEhIIEhIQUFISEggSEhBCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwV3JhcHBpbmdMb25nTmFtZXMoSGVscFRlc3RDYXNlKToKKyAgICAiIiJNYWtlIHN1cmUgdGhhdCB0ZXh0IGFmdGVyIGxvbmcgbmFtZXMgc3RhcnRzIG9uIHRoZSBuZXh0IGxpbmUiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcodXNhZ2U9J1VTQUdFJywgZGVzY3JpcHRpb249ICdEIEQnICogMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPSdWIFYnKjMwKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCBtZXRhdmFyPSdYJyAqIDI1LCBoZWxwPSdYSCBYSCcgKiAyMCksCisgICAgICAgIFNpZygneScsIG1ldGF2YXI9J3knICogMjUsIGhlbHA9J1lIIFlIJyAqIDIwKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgKFNpZygnQUxQSEFTJyksIFsKKyAgICAgICAgICAgIFNpZygnLWEnLCBtZXRhdmFyPSdBJyAqIDI1LCBoZWxwPSdBSCBBSCcgKiAyMCksCisgICAgICAgICAgICBTaWcoJ3onLCBtZXRhdmFyPSd6JyAqIDI1LCBoZWxwPSdaSCBaSCcgKiAyMCldKSwKKyAgICBdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBVU0FHRQorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgRCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBERCBcCitERCBERCBERAorICAgICAgICBERCBERCBERCBERCBECisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFlIWUggXAorWUhZSCBZSFlICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlIWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFlICisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXYsIC0tdmVyc2lvbiAgICAgICAgIHNob3cgcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0CisgICAgICAgICAgLXggWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYSCBYSFhIIFhIWEggWEhYSCBYSFhIIFhIWEggWEhYSCBYSFhIIFhIWEggXAorWEhYSCBYSFhICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhIWEggWEhYSCBYSFhIIFhIWEggWEhYSCBYSFhIIFhIWEggWEhYSCBYSFhIIFhICisKKyAgICAgICAgQUxQSEFTOgorICAgICAgICAgIC1hIEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUggQUhBSCBBSEFIIEFIQUggQUhBSCBBSEFIIEFIQUggQUhBSCBBSEFIIFwKK0FIQUggQUhBSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBSEFIIEFIQUggQUhBSCBBSEFIIEFIQUggQUhBSCBBSEFIIEFIQUggQUhBSCBBSAorICAgICAgICAgIHp6enp6enp6enp6enp6enp6enp6enp6enoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkggWkhaSCBaSFpIIFpIWkggWkhaSCBaSFpIIFpIWkggWkhaSCBaSFpIIFwKK1pIWkggWkhaSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaSFpIIFpIWkggWkhaSCBaSFpIIFpIWkggWkhaSCBaSFpIIFpIWkggWkhaSCBaSAorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycnXAorICAgICAgICBWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFZWIFwKK1ZWIFZWIFZWCisgICAgICAgIFZWIFZWIFZWIFZWIFYKKyAgICAgICAgJycnCisKKworY2xhc3MgVGVzdEhlbHBVc2FnZShIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgYmFzaWMgdXNhZ2UgbWVzc2FnZXMiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctdycsIG5hcmdzPScrJywgaGVscD0ndycpLAorICAgICAgICBTaWcoJy14JywgbmFyZ3M9JyonLCBoZWxwPSd4JyksCisgICAgICAgIFNpZygnYScsIGhlbHA9J2EnKSwKKyAgICAgICAgU2lnKCdiJywgaGVscD0nYicsIG5hcmdzPTIpLAorICAgICAgICBTaWcoJ2MnLCBoZWxwPSdjJywgbmFyZ3M9Jz8nKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgKFNpZygnZ3JvdXAnKSwgWworICAgICAgICAgICAgU2lnKCcteScsIG5hcmdzPSc/JywgaGVscD0neScpLAorICAgICAgICAgICAgU2lnKCcteicsIG5hcmdzPTMsIGhlbHA9J3onKSwKKyAgICAgICAgICAgIFNpZygnZCcsIGhlbHA9J2QnLCBuYXJncz0nKicpLAorICAgICAgICAgICAgU2lnKCdlJywgaGVscD0nZScsIG5hcmdzPScrJyksCisgICAgICAgIF0pCisgICAgXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstdyBXIFtXIC4uLl1dIFsteCBbWCBbWCAuLi5dXV0gWy15IFtZXV0gWy16IFogWiBaXQorICAgICAgICAgICAgICAgICAgICBhIGIgYiBbY10gW2QgW2QgLi4uXV0gZSBbZSAuLi5dCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBhICAgICAgICAgICAgICAgYQorICAgICAgICAgIGIgICAgICAgICAgICAgICBiCisgICAgICAgICAgYyAgICAgICAgICAgICAgIGMKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtdyBXIFtXIC4uLl0gICAgdworICAgICAgICAgIC14IFtYIFtYIC4uLl1dICB4CisKKyAgICAgICAgZ3JvdXA6CisgICAgICAgICAgLXkgW1ldICAgICAgICAgIHkKKyAgICAgICAgICAteiBaIFogWiAgICAgICAgegorICAgICAgICAgIGQgICAgICAgICAgICAgICBkCisgICAgICAgICAgZSAgICAgICAgICAgICAgIGUKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBPbmx5VXNlckdyb3VwcyhIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgYmFzaWMgdXNhZ2UgbWVzc2FnZXMiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsIGFkZF9oZWxwPUZhbHNlKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbCisgICAgICAgIChTaWcoJ3h4eHgnKSwgWworICAgICAgICAgICAgU2lnKCcteCcsIGhlbHA9J3gnKSwKKyAgICAgICAgICAgIFNpZygnYScsIGhlbHA9J2EnKSwKKyAgICAgICAgXSksCisgICAgICAgIChTaWcoJ3l5eXknKSwgWworICAgICAgICAgICAgU2lnKCdiJywgaGVscD0nYicpLAorICAgICAgICAgICAgU2lnKCcteScsIGhlbHA9J3knKSwKKyAgICAgICAgXSksCisgICAgXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLXggWF0gWy15IFldIGEgYgorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgeHh4eDoKKyAgICAgICAgICAteCBYICB4CisgICAgICAgICAgYSAgICAgYQorCisgICAgICAgIHl5eXk6CisgICAgICAgICAgYiAgICAgYgorICAgICAgICAgIC15IFkgIHkKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBVc2FnZUxvbmdQcm9nKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB1c2FnZSBtZXNzYWdlcyB3aGVyZSB0aGUgcHJvZyBpcyBsb25nIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1AnICogNjApCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctdycsIG1ldGF2YXI9J1cnKSwKKyAgICAgICAgU2lnKCcteCcsIG1ldGF2YXI9J1gnKSwKKyAgICAgICAgU2lnKCdhJyksCisgICAgICAgIFNpZygnYicpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAorICAgICAgICAgICAgICAgWy1oXSBbLXcgV10gWy14IFhdIGEgYgorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgYQorICAgICAgICAgIGIKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC13IFcKKyAgICAgICAgICAteCBYCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwVXNhZ2VMb25nUHJvZ09wdGlvbnNXcmFwKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB1c2FnZSBtZXNzYWdlcyB3aGVyZSB0aGUgcHJvZyBpcyBsb25nIGFuZCB0aGUgb3B0aW9uYWxzIHdyYXAiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUCcgKiA2MCkKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy13JywgbWV0YXZhcj0nVycgKiAyNSksCisgICAgICAgIFNpZygnLXgnLCBtZXRhdmFyPSdYJyAqIDI1KSwKKyAgICAgICAgU2lnKCcteScsIG1ldGF2YXI9J1knICogMjUpLAorICAgICAgICBTaWcoJy16JywgbWV0YXZhcj0nWicgKiAyNSksCisgICAgICAgIFNpZygnYScpLAorICAgICAgICBTaWcoJ2InKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFtdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAKKyAgICAgICAgICAgICAgIFstaF0gWy13IFdXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1ddIFwKK1steCBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXQorICAgICAgICAgICAgICAgWy15IFlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVldIFsteiBaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaXQorICAgICAgICAgICAgICAgYSBiCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBhCisgICAgICAgICAgYgorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC13IFdXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1cKKyAgICAgICAgICAteCBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCisgICAgICAgICAgLXkgWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWQorICAgICAgICAgIC16IFpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWloKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBVc2FnZUxvbmdQcm9nUG9zaXRpb25hbHNXcmFwKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB1c2FnZSBtZXNzYWdlcyB3aGVyZSB0aGUgcHJvZyBpcyBsb25nIGFuZCB0aGUgcG9zaXRpb25hbHMgd3JhcCIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQJyAqIDYwLCBhZGRfaGVscD1GYWxzZSkKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ2EnICogMjUpLAorICAgICAgICBTaWcoJ2InICogMjUpLAorICAgICAgICBTaWcoJ2MnICogMjUpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUAorICAgICAgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSBiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiCisgICAgICAgICAgICAgICBjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhCisgICAgICAgICAgYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgorICAgICAgICAgIGNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBVc2FnZU9wdGlvbmFsc1dyYXAoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHVzYWdlIG1lc3NhZ2VzIHdoZXJlIHRoZSBvcHRpb25hbHMgd3JhcCIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy13JywgbWV0YXZhcj0nVycgKiAyNSksCisgICAgICAgIFNpZygnLXgnLCBtZXRhdmFyPSdYJyAqIDI1KSwKKyAgICAgICAgU2lnKCcteScsIG1ldGF2YXI9J1knICogMjUpLAorICAgICAgICBTaWcoJy16JywgbWV0YXZhcj0nWicgKiAyNSksCisgICAgICAgIFNpZygnYScpLAorICAgICAgICBTaWcoJ2InKSwKKyAgICAgICAgU2lnKCdjJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstdyBXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXXSBcCitbLXggWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF0KKyAgICAgICAgICAgICAgICAgICAgWy15IFlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVldIFwKK1steiBaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaXQorICAgICAgICAgICAgICAgICAgICBhIGIgYworICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgYQorICAgICAgICAgIGIKKyAgICAgICAgICBjCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXcgV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXVworICAgICAgICAgIC14IFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKKyAgICAgICAgICAteSBZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZCisgICAgICAgICAgLXogWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWgorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFVzYWdlUG9zaXRpb25hbHNXcmFwKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB1c2FnZSBtZXNzYWdlcyB3aGVyZSB0aGUgcG9zaXRpb25hbHMgd3JhcCIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JyksCisgICAgICAgIFNpZygnLXknKSwKKyAgICAgICAgU2lnKCcteicpLAorICAgICAgICBTaWcoJ2EnICogMjUpLAorICAgICAgICBTaWcoJ2InICogMjUpLAorICAgICAgICBTaWcoJ2MnICogMjUpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXggWF0gWy15IFldIFsteiBaXQorICAgICAgICAgICAgICAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIKKyAgICAgICAgICAgICAgICAgICAgY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYworICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQorICAgICAgICAgIGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIKKyAgICAgICAgICBjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXggWAorICAgICAgICAgIC15IFkKKyAgICAgICAgICAteiBaCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwVXNhZ2VPcHRpb25hbHNQb3NpdGlvbmFsc1dyYXAoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHVzYWdlIG1lc3NhZ2VzIHdoZXJlIHRoZSBvcHRpb25hbHMgYW5kIHBvc2l0aW9uYWxzIHdyYXAiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcteCcsIG1ldGF2YXI9J1gnICogMjUpLAorICAgICAgICBTaWcoJy15JywgbWV0YXZhcj0nWScgKiAyNSksCisgICAgICAgIFNpZygnLXonLCBtZXRhdmFyPSdaJyAqIDI1KSwKKyAgICAgICAgU2lnKCdhJyAqIDI1KSwKKyAgICAgICAgU2lnKCdiJyAqIDI1KSwKKyAgICAgICAgU2lnKCdjJyAqIDI1KSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFtdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy14IFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhdIFwKK1steSBZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZXQorICAgICAgICAgICAgICAgICAgICBbLXogWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl0KKyAgICAgICAgICAgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSBiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiCisgICAgICAgICAgICAgICAgICAgIGNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MKKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEKKyAgICAgICAgICBiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiCisgICAgICAgICAgY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYworCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC14IFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKKyAgICAgICAgICAteSBZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZCisgICAgICAgICAgLXogWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWgorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFVzYWdlT3B0aW9uYWxzT25seVdyYXAoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHVzYWdlIG1lc3NhZ2VzIHdoZXJlIHRoZXJlIGFyZSBvbmx5IG9wdGlvbmFscyBhbmQgdGhleSB3cmFwIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCBtZXRhdmFyPSdYJyAqIDI1KSwKKyAgICAgICAgU2lnKCcteScsIG1ldGF2YXI9J1knICogMjUpLAorICAgICAgICBTaWcoJy16JywgbWV0YXZhcj0nWicgKiAyNSksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFsteCBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXSBcCitbLXkgWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWV0KKyAgICAgICAgICAgICAgICAgICAgWy16IFpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpdCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAteCBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCisgICAgICAgICAgLXkgWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWQorICAgICAgICAgIC16IFpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWloKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBVc2FnZVBvc2l0aW9uYWxzT25seVdyYXAoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHVzYWdlIG1lc3NhZ2VzIHdoZXJlIHRoZXJlIGFyZSBvbmx5IHBvc2l0aW9uYWxzIGFuZCB0aGV5IHdyYXAiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsIGFkZF9oZWxwPUZhbHNlKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnYScgKiAyNSksCisgICAgICAgIFNpZygnYicgKiAyNSksCisgICAgICAgIFNpZygnYycgKiAyNSksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIKKyAgICAgICAgICAgICAgICAgICAgY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYworICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQorICAgICAgICAgIGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIKKyAgICAgICAgICBjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwVmFyaWFibGVFeHBhbnNpb24oSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgdmFyaWFibGVzIGFyZSBleHBhbmRlZCBwcm9wZXJseSBpbiBoZWxwIG1lc3NhZ2VzIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCB0eXBlPWludCwKKyAgICAgICAgICAgIGhlbHA9J3ggJShwcm9nKXMgJShkZWZhdWx0KXMgJSh0eXBlKXMgJSUnKSwKKyAgICAgICAgU2lnKCcteScsIGFjdGlvbj0nc3RvcmVfY29uc3QnLCBkZWZhdWx0PTQyLCBjb25zdD0nWFhYJywKKyAgICAgICAgICAgIGhlbHA9J3kgJShwcm9nKXMgJShkZWZhdWx0KXMgJShjb25zdClzJyksCisgICAgICAgIFNpZygnLS1mb28nLCBjaG9pY2VzPSdhYmMnLAorICAgICAgICAgICAgaGVscD0nZm9vICUocHJvZylzICUoZGVmYXVsdClzICUoY2hvaWNlcylzJyksCisgICAgICAgIFNpZygnLS1iYXInLCBkZWZhdWx0PSdiYXonLCBjaG9pY2VzPVsxLCAyXSwgbWV0YXZhcj0nQkJCJywKKyAgICAgICAgICAgIGhlbHA9J2JhciAlKHByb2cpcyAlKGRlZmF1bHQpcyAlKGRlc3QpcycpLAorICAgICAgICBTaWcoJ3NwYW0nLCBoZWxwPSdzcGFtICUocHJvZylzICUoZGVmYXVsdClzJyksCisgICAgICAgIFNpZygnYmFkZ2VyJywgZGVmYXVsdD0wLjUsIGhlbHA9J2JhZGdlciAlKHByb2cpcyAlKGRlZmF1bHQpcycpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gWworICAgICAgICAoU2lnKCdncm91cCcpLCBbCisgICAgICAgICAgICBTaWcoJy1hJywgaGVscD0nYSAlKHByb2cpcyAlKGRlZmF1bHQpcycpLAorICAgICAgICAgICAgU2lnKCctYicsIGRlZmF1bHQ9LTEsIGhlbHA9J2IgJShwcm9nKXMgJShkZWZhdWx0KXMnKSwKKyAgICAgICAgXSkKKyAgICBdCisgICAgdXNhZ2UgPSAoJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFsteCBYXSBbLXldIFstLWZvbyB7YSxiLGN9XSBbLS1iYXIgQkJCXSBbLWEgQV0gWy1iIEJdCisgICAgICAgICAgICAgICAgICAgIHNwYW0gYmFkZ2VyCisgICAgICAgICcnJykKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgc3BhbSAgICAgICAgICAgc3BhbSBQUk9HIE5vbmUKKyAgICAgICAgICBiYWRnZXIgICAgICAgICBiYWRnZXIgUFJPRyAwLjUKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC14IFggICAgICAgICAgIHggUFJPRyBOb25lIGludCAlCisgICAgICAgICAgLXkgICAgICAgICAgICAgeSBQUk9HIDQyIFhYWAorICAgICAgICAgIC0tZm9vIHthLGIsY30gIGZvbyBQUk9HIE5vbmUgYSwgYiwgYworICAgICAgICAgIC0tYmFyIEJCQiAgICAgIGJhciBQUk9HIGJheiBiYXIKKworICAgICAgICBncm91cDoKKyAgICAgICAgICAtYSBBICAgICAgICAgICBhIFBST0cgTm9uZQorICAgICAgICAgIC1iIEIgICAgICAgICAgIGIgUFJPRyAtMQorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFZhcmlhYmxlRXhwYW5zaW9uVXNhZ2VTdXBwbGllZChIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCB2YXJpYWJsZXMgYXJlIGV4cGFuZGVkIHByb3Blcmx5IHdoZW4gdXNhZ2U9IGlzIHByZXNlbnQiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsIHVzYWdlPSclKHByb2cpcyBGT08nKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gKCcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgRk9PCisgICAgICAgICcnJykKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBWYXJpYWJsZUV4cGFuc2lvbk5vQXJndW1lbnRzKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGF0IHZhcmlhYmxlcyBhcmUgZXhwYW5kZWQgcHJvcGVybHkgd2l0aCBubyBhcmd1bWVudHMiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsIGFkZF9oZWxwPUZhbHNlKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gKCcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cKKyAgICAgICAgJycnKQorICAgIGhlbHAgPSB1c2FnZQorICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwU3VwcHJlc3NVc2FnZShIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCBpdGVtcyBjYW4gYmUgc3VwcHJlc3NlZCBpbiB1c2FnZSBtZXNzYWdlcyIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJywgdXNhZ2U9YXJncGFyc2UuU1VQUFJFU1MpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctLWZvbycsIGhlbHA9J2ZvbyBoZWxwJyksCisgICAgICAgIFNpZygnc3BhbScsIGhlbHA9J3NwYW0gaGVscCcpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICBoZWxwID0gJycnXAorICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBzcGFtICAgICAgICBzcGFtIGhlbHAKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC0tZm9vIEZPTyAgIGZvbyBoZWxwCisgICAgICAgICcnJworICAgIHVzYWdlID0gJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFN1cHByZXNzT3B0aW9uYWwoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgb3B0aW9uYWwgYXJndW1lbnRzIGNhbiBiZSBzdXBwcmVzc2VkIGluIGhlbHAgbWVzc2FnZXMiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsIGFkZF9oZWxwPUZhbHNlKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1mb28nLCBoZWxwPWFyZ3BhcnNlLlNVUFBSRVNTKSwKKyAgICAgICAgU2lnKCdzcGFtJywgaGVscD0nc3BhbSBoZWxwJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBzcGFtCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBzcGFtICBzcGFtIGhlbHAKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBTdXBwcmVzc09wdGlvbmFsR3JvdXAoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgb3B0aW9uYWwgZ3JvdXBzIGNhbiBiZSBzdXBwcmVzc2VkIGluIGhlbHAgbWVzc2FnZXMiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctLWZvbycsIGhlbHA9J2ZvbyBoZWxwJyksCisgICAgICAgIFNpZygnc3BhbScsIGhlbHA9J3NwYW0gaGVscCcpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gWworICAgICAgICAoU2lnKCdncm91cCcpLCBbU2lnKCctLWJhcicsIGhlbHA9YXJncGFyc2UuU1VQUFJFU1MpXSksCisgICAgXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstLWZvbyBGT09dIHNwYW0KKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIHNwYW0gICAgICAgIHNwYW0gaGVscAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLS1mb28gRk9PICAgZm9vIGhlbHAKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBTdXBwcmVzc1Bvc2l0aW9uYWwoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgcG9zaXRpb25hbCBhcmd1bWVudHMgY2FuIGJlIHN1cHByZXNzZWQgaW4gaGVscCBtZXNzYWdlcyIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy0tZm9vJywgaGVscD0nZm9vIGhlbHAnKSwKKyAgICAgICAgU2lnKCdzcGFtJywgaGVscD1hcmdwYXJzZS5TVVBQUkVTUyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstLWZvbyBGT09dCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC0tZm9vIEZPTyAgIGZvbyBoZWxwCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwUmVxdWlyZWRPcHRpb25hbChIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCByZXF1aXJlZCBvcHRpb25zIGRvbid0IGxvb2sgb3B0aW9uYWwiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctLWZvbycsIHJlcXVpcmVkPVRydWUsIGhlbHA9J2ZvbyBoZWxwJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIC0tZm9vIEZPTworICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtLWZvbyBGT08gICBmb28gaGVscAorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscEFsdGVybmF0ZVByZWZpeENoYXJzKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGF0IG9wdGlvbnMgZGlzcGxheSB3aXRoIGRpZmZlcmVudCBwcmVmaXggY2hhcmFjdGVycyIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJywgcHJlZml4X2NoYXJzPSdeOycsIGFkZF9oZWxwPUZhbHNlKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnXl5mb28nLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdmb28gaGVscCcpLAorICAgICAgICBTaWcoJztiJywgJzs7YmFyJywgaGVscD0nYmFyIGhlbHAnKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFtdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFteXmZvb10gWztiIEJBUl0KKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBeXmZvbyAgICAgICAgICAgICAgZm9vIGhlbHAKKyAgICAgICAgICA7YiBCQVIsIDs7YmFyIEJBUiAgYmFyIGhlbHAKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBOb0hlbHBPcHRpb25hbChIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCB0aGUgLS1oZWxwIGFyZ3VtZW50IGNhbiBiZSBzdXBwcmVzc2VkIGhlbHAgbWVzc2FnZXMiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsIGFkZF9oZWxwPUZhbHNlKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1mb28nLCBoZWxwPSdmb28gaGVscCcpLAorICAgICAgICBTaWcoJ3NwYW0nLCBoZWxwPSdzcGFtIGhlbHAnKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFtdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstLWZvbyBGT09dIHNwYW0KKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIHNwYW0gICAgICAgc3BhbSBoZWxwCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC0tZm9vIEZPTyAgZm9vIGhlbHAKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBWZXJzaW9uT3B0aW9uYWwoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgdGhlIC0tdmVyc2lvbiBhcmd1bWVudCBjYW4gYmUgc3VwcHJlc3NlZCBoZWxwIG1lc3NhZ2VzIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnLCB2ZXJzaW9uPScxLjAnKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1mb28nLCBoZWxwPSdmb28gaGVscCcpLAorICAgICAgICBTaWcoJ3NwYW0nLCBoZWxwPSdzcGFtIGhlbHAnKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFtdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy12XSBbLS1mb28gRk9PXSBzcGFtCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBzcGFtICAgICAgICAgICBzcGFtIGhlbHAKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC12LCAtLXZlcnNpb24gIHNob3cgcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0CisgICAgICAgICAgLS1mb28gRk9PICAgICAgZm9vIGhlbHAKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnJ1wKKyAgICAgICAgMS4wCisgICAgICAgICcnJworCisKK2NsYXNzIFRlc3RIZWxwTm9uZShIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCBubyBlcnJvcnMgb2NjdXIgaWYgbm8gaGVscCBpcyBzcGVjaWZpZWQiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctLWZvbycpLAorICAgICAgICBTaWcoJ3NwYW0nKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFtdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy0tZm9vIEZPT10gc3BhbQorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgc3BhbQorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLS1mb28gRk9PCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwVHVwbGVNZXRhdmFyKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBzcGVjaWZ5aW5nIG1ldGF2YXIgYXMgYSB0dXBsZSIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy13JywgaGVscD0ndycsIG5hcmdzPScrJywgbWV0YXZhcj0oJ1cxJywgJ1cyJykpLAorICAgICAgICBTaWcoJy14JywgaGVscD0neCcsIG5hcmdzPScqJywgbWV0YXZhcj0oJ1gxJywgJ1gyJykpLAorICAgICAgICBTaWcoJy15JywgaGVscD0neScsIG5hcmdzPTMsIG1ldGF2YXI9KCdZMScsICdZMicsICdZMycpKSwKKyAgICAgICAgU2lnKCcteicsIGhlbHA9J3onLCBuYXJncz0nPycsIG1ldGF2YXI9KCdaMScsICkpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXcgVzEgW1cyIC4uLl1dIFsteCBbWDEgW1gyIC4uLl1dXSBbLXkgWTEgWTIgWTNdIFwKK1steiBbWjFdXQorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtdyBXMSBbVzIgLi4uXSAgICB3CisgICAgICAgICAgLXggW1gxIFtYMiAuLi5dXSAgeAorICAgICAgICAgIC15IFkxIFkyIFkzICAgICAgIHkKKyAgICAgICAgICAteiBbWjFdICAgICAgICAgICB6CisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwUmF3VGV4dChIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIFJhd1RleHRIZWxwRm9ybWF0dGVyIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKAorICAgICAgICBwcm9nPSdQUk9HJywgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLlJhd1RleHRIZWxwRm9ybWF0dGVyLAorICAgICAgICBkZXNjcmlwdGlvbj0nS2VlcCB0aGUgZm9ybWF0dGluZ1xuJworICAgICAgICAgICAgICAgICAgICAnICAgIGV4YWN0bHkgYXMgaXQgaXMgd3JpdHRlblxuJworICAgICAgICAgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAgICAgICAgICdoZXJlXG4nKQorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctLWZvbycsIGhlbHA9JyAgICBmb28gaGVscCBzaG91bGQgYWxzb1xuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwZWFyIGFzIGdpdmVuIGhlcmUnKSwKKyAgICAgICAgU2lnKCdzcGFtJywgaGVscD0nc3BhbSBoZWxwJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbCisgICAgICAgIChTaWcoJ3RpdGxlJywgZGVzY3JpcHRpb249JyAgICBUaGlzIHRleHRcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICBzaG91bGQgYmUgaW5kZW50ZWRcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGV4YWN0bHkgbGlrZSBpdCBpcyBoZXJlXG4nKSwKKyAgICAgICAgIFtTaWcoJy0tYmFyJywgaGVscD0nYmFyIGhlbHAnKV0pLAorICAgIF0KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1mb28gRk9PXSBbLS1iYXIgQkFSXSBzcGFtCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBLZWVwIHRoZSBmb3JtYXR0aW5nCisgICAgICAgICAgICBleGFjdGx5IGFzIGl0IGlzIHdyaXR0ZW4KKworICAgICAgICBoZXJlCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgc3BhbSAgICAgICAgc3BhbSBoZWxwCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtLWZvbyBGT08gICAgICAgZm9vIGhlbHAgc2hvdWxkIGFsc28KKyAgICAgICAgICAgICAgICAgICAgICBhcHBlYXIgYXMgZ2l2ZW4gaGVyZQorCisgICAgICAgIHRpdGxlOgorICAgICAgICAgICAgICBUaGlzIHRleHQKKyAgICAgICAgICAgIHNob3VsZCBiZSBpbmRlbnRlZAorICAgICAgICAgICAgICBleGFjdGx5IGxpa2UgaXQgaXMgaGVyZQorCisgICAgICAgICAgLS1iYXIgQkFSICAgYmFyIGhlbHAKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBSYXdEZXNjcmlwdGlvbihIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIFJhd1RleHRIZWxwRm9ybWF0dGVyIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKAorICAgICAgICBwcm9nPSdQUk9HJywgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLlJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlciwKKyAgICAgICAgZGVzY3JpcHRpb249J0tlZXAgdGhlIGZvcm1hdHRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBleGFjdGx5IGFzIGl0IGlzIHdyaXR0ZW5cbicKKyAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAnaGVyZVxuJykKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1mb28nLCBoZWxwPScgIGZvbyBoZWxwIHNob3VsZCBub3RcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICByZXRhaW4gdGhpcyBvZGQgZm9ybWF0dGluZycpLAorICAgICAgICBTaWcoJ3NwYW0nLCBoZWxwPSdzcGFtIGhlbHAnKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgKFNpZygndGl0bGUnLCBkZXNjcmlwdGlvbj0nICAgIFRoaXMgdGV4dFxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgIHNob3VsZCBiZSBpbmRlbnRlZFxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgZXhhY3RseSBsaWtlIGl0IGlzIGhlcmVcbicpLAorICAgICAgICAgW1NpZygnLS1iYXInLCBoZWxwPSdiYXIgaGVscCcpXSksCisgICAgXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstLWZvbyBGT09dIFstLWJhciBCQVJdIHNwYW0KKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIEtlZXAgdGhlIGZvcm1hdHRpbmcKKyAgICAgICAgICAgIGV4YWN0bHkgYXMgaXQgaXMgd3JpdHRlbgorCisgICAgICAgIGhlcmUKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBzcGFtICAgICAgICBzcGFtIGhlbHAKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC0tZm9vIEZPTyAgIGZvbyBoZWxwIHNob3VsZCBub3QgcmV0YWluIHRoaXMgb2RkIGZvcm1hdHRpbmcKKworICAgICAgICB0aXRsZToKKyAgICAgICAgICAgICAgVGhpcyB0ZXh0CisgICAgICAgICAgICBzaG91bGQgYmUgaW5kZW50ZWQKKyAgICAgICAgICAgICAgZXhhY3RseSBsaWtlIGl0IGlzIGhlcmUKKworICAgICAgICAgIC0tYmFyIEJBUiAgIGJhciBoZWxwCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwQXJndW1lbnREZWZhdWx0cyhIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIEFyZ3VtZW50RGVmYXVsdHNIZWxwRm9ybWF0dGVyIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKAorICAgICAgICBwcm9nPSdQUk9HJywgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLkFyZ3VtZW50RGVmYXVsdHNIZWxwRm9ybWF0dGVyLAorICAgICAgICBkZXNjcmlwdGlvbj0nZGVzY3JpcHRpb24nKQorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctLWZvbycsIGhlbHA9J2ZvbyBoZWxwIC0gb2ggYW5kIGJ5IHRoZSB3YXksICUoZGVmYXVsdClzJyksCisgICAgICAgIFNpZygnLS1iYXInLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdiYXIgaGVscCcpLAorICAgICAgICBTaWcoJ3NwYW0nLCBoZWxwPSdzcGFtIGhlbHAnKSwKKyAgICAgICAgU2lnKCdiYWRnZXInLCBuYXJncz0nPycsIGRlZmF1bHQ9J3dvb2RlbicsIGhlbHA9J2JhZGdlciBoZWxwJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbCisgICAgICAgIChTaWcoJ3RpdGxlJywgZGVzY3JpcHRpb249J2Rlc2NyaXB0aW9uJyksCisgICAgICAgICBbU2lnKCctLWJheicsIHR5cGU9aW50LCBkZWZhdWx0PTQyLCBoZWxwPSdiYXogaGVscCcpXSksCisgICAgXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstLWZvbyBGT09dIFstLWJhcl0gWy0tYmF6IEJBWl0gc3BhbSBbYmFkZ2VyXQorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgZGVzY3JpcHRpb24KKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBzcGFtICAgICAgICBzcGFtIGhlbHAKKyAgICAgICAgICBiYWRnZXIgICAgICBiYWRnZXIgaGVscCAoZGVmYXVsdDogd29vZGVuKQorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLS1mb28gRk9PICAgZm9vIGhlbHAgLSBvaCBhbmQgYnkgdGhlIHdheSwgTm9uZQorICAgICAgICAgIC0tYmFyICAgICAgIGJhciBoZWxwIChkZWZhdWx0OiBGYWxzZSkKKworICAgICAgICB0aXRsZToKKyAgICAgICAgICBkZXNjcmlwdGlvbgorCisgICAgICAgICAgLS1iYXogQkFaICAgYmF6IGhlbHAgKGRlZmF1bHQ6IDQyKQorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworY2xhc3MgVGVzdEhlbHBWZXJzaW9uQWN0aW9uKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGUgZGVmYXVsdCBoZWxwIGZvciB0aGUgdmVyc2lvbiBhY3Rpb24iIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsIGRlc2NyaXB0aW9uPSdkZXNjcmlwdGlvbicpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy1WJywgJy0tdmVyc2lvbicsIGFjdGlvbj0ndmVyc2lvbicsIHZlcnNpb249JzMuNicpXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstVl0KKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIGRlc2NyaXB0aW9uCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtViwgLS12ZXJzaW9uICBzaG93IHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworY2xhc3MgVGVzdEhlbHBTdWJwYXJzZXJzT3JkZXJpbmcoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IG9yZGVyaW5nIG9mIHN1YmNvbW1hbmRzIGluIGhlbHAgbWF0Y2hlcyB0aGUgY29kZSIiIgorICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0nZGlzcGxheSBzb21lIHN1YmNvbW1hbmRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249JzAuMScpCisKKyAgICBzdWJwYXJzZXJzX3NpZ25hdHVyZXMgPSBbU2lnKG5hbWU9bmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gKCdhJywgJ2InLCAnYycsICdkJywgJ2UnKV0KKworICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstdl0ge2EsYixjLGQsZX0gLi4uCisgICAgICAgICcnJworCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIGRpc3BsYXkgc29tZSBzdWJjb21tYW5kcworCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIHthLGIsYyxkLGV9CisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtdiwgLS12ZXJzaW9uICBzaG93IHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorICAgICAgICAnJycKKworICAgIHZlcnNpb24gPSAnJydcCisgICAgICAgIDAuMQorICAgICAgICAnJycKKworY2xhc3MgVGVzdEhlbHBTdWJwYXJzZXJzV2l0aEhlbHBPcmRlcmluZyhIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3Qgb3JkZXJpbmcgb2Ygc3ViY29tbWFuZHMgaW4gaGVscCBtYXRjaGVzIHRoZSBjb2RlIiIiCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSdkaXNwbGF5IHNvbWUgc3ViY29tbWFuZHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0nMC4xJykKKworICAgIHN1YmNvbW1hbmRfZGF0YSA9ICgoJ2EnLCAnYSBzdWJjb21tYW5kIGhlbHAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKCdiJywgJ2Igc3ViY29tbWFuZCBoZWxwJyksCisgICAgICAgICAgICAgICAgICAgICAgICgnYycsICdjIHN1YmNvbW1hbmQgaGVscCcpLAorICAgICAgICAgICAgICAgICAgICAgICAoJ2QnLCAnZCBzdWJjb21tYW5kIGhlbHAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKCdlJywgJ2Ugc3ViY29tbWFuZCBoZWxwJyksCisgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgIHN1YnBhcnNlcnNfc2lnbmF0dXJlcyA9IFtTaWcobmFtZT1uYW1lLCBoZWxwPWhlbHApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCBoZWxwIGluIHN1YmNvbW1hbmRfZGF0YV0KKworICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstdl0ge2EsYixjLGQsZX0gLi4uCisgICAgICAgICcnJworCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIGRpc3BsYXkgc29tZSBzdWJjb21tYW5kcworCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIHthLGIsYyxkLGV9CisgICAgICAgICAgICBhICAgICAgICAgICAgYSBzdWJjb21tYW5kIGhlbHAKKyAgICAgICAgICAgIGIgICAgICAgICAgICBiIHN1YmNvbW1hbmQgaGVscAorICAgICAgICAgICAgYyAgICAgICAgICAgIGMgc3ViY29tbWFuZCBoZWxwCisgICAgICAgICAgICBkICAgICAgICAgICAgZCBzdWJjb21tYW5kIGhlbHAKKyAgICAgICAgICAgIGUgICAgICAgICAgICBlIHN1YmNvbW1hbmQgaGVscAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXYsIC0tdmVyc2lvbiAgc2hvdyBwcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQKKyAgICAgICAgJycnCisKKyAgICB2ZXJzaW9uID0gJycnXAorICAgICAgICAwLjEKKyAgICAgICAgJycnCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIE9wdGlvbmFsL1Bvc2l0aW9uYWwgY29uc3RydWN0b3IgdGVzdHMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0SW52YWxpZEFyZ3VtZW50Q29uc3RydWN0b3JzKFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgYnVuY2ggb2YgaW52YWxpZCBBcmd1bWVudCBjb25zdHJ1Y3RvcnMiIiIKKworICAgIGRlZiBhc3NlcnRUeXBlRXJyb3Ioc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBhcnNlci5hZGRfYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBhc3NlcnRWYWx1ZUVycm9yKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcGFyc2VyLmFkZF9hcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9rZXl3b3JkX2FyZ3VtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlRXJyb3IoJy14JywgYmFyPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKCcteScsIGNhbGxiYWNrPSdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcignLXknLCBjYWxsYmFja19hcmdzPSgpKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcignLXknLCBjYWxsYmFja19rd2FyZ3M9e30pCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2Rlc3RpbmF0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcigpCisgICAgICAgIGZvciBhY3Rpb24gaW4gWydhcHBlbmQnLCAnc3RvcmUnXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKGFjdGlvbj1hY3Rpb24pCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX29wdGlvbl9zdHJpbmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFZhbHVlRXJyb3IoJy0tJykKKyAgICAgICAgc2VsZi5hc3NlcnRWYWx1ZUVycm9yKCctLS0nKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFZhbHVlRXJyb3IoJy0tZm9vJywgdHlwZT0naW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRWYWx1ZUVycm9yKCctLWZvbycsIHR5cGU9KGludCwgZmxvYXQpKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9hY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VmFsdWVFcnJvcignLXgnLCBhY3Rpb249J2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0VmFsdWVFcnJvcignZm9vJywgYWN0aW9uPSdiYXonKQorICAgICAgICBzZWxmLmFzc2VydFZhbHVlRXJyb3IoJy0tZm9vJywgYWN0aW9uPSgnc3RvcmUnLCAnYXBwZW5kJykpCisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1mb28iLCBhY3Rpb249InN0b3JlLXRydWUiKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIGUgPSBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICAgICAgZXhwZWN0ZWQgPSAndW5rbm93biBhY3Rpb24nCisgICAgICAgICAgICBtc2cgPSAnZXhwZWN0ZWQgJXIsIGZvdW5kICVyJyAlIChleHBlY3RlZCwgZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHBlY3RlZCBpbiBzdHIoZSksIG1zZykKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX2Rlc3Qoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudChkZXN0PSdmb28nKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdiYXInLCBkZXN0PSdiYXonKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIGUgPSBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICAgICAgZXhwZWN0ZWQgPSAnZGVzdCBzdXBwbGllZCB0d2ljZSBmb3IgcG9zaXRpb25hbCBhcmd1bWVudCcKKyAgICAgICAgICAgIG1zZyA9ICdleHBlY3RlZCAlciwgZm91bmQgJXInICUgKGV4cGVjdGVkLCBlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4cGVjdGVkIGluIHN0cihlKSwgbXNnKQorCisgICAgZGVmIHRlc3Rfbm9fYXJndW1lbnRfYWN0aW9ucyhzZWxmKToKKyAgICAgICAgZm9yIGFjdGlvbiBpbiBbJ3N0b3JlX2NvbnN0JywgJ3N0b3JlX3RydWUnLCAnc3RvcmVfZmFsc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAnYXBwZW5kX2NvbnN0JywgJ2NvdW50J106CisgICAgICAgICAgICBmb3IgYXR0cnMgaW4gW2RpY3QodHlwZT1pbnQpLCBkaWN0KG5hcmdzPScrJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QoY2hvaWNlcz0nYWInKV06CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUeXBlRXJyb3IoJy14JywgYWN0aW9uPWFjdGlvbiwgKiphdHRycykKKworICAgIGRlZiB0ZXN0X25vX2FyZ3VtZW50X25vX2NvbnN0X2FjdGlvbnMoc2VsZik6CisgICAgICAgICMgb3B0aW9ucyB3aXRoIHplcm8gYXJndW1lbnRzCisgICAgICAgIGZvciBhY3Rpb24gaW4gWydzdG9yZV90cnVlJywgJ3N0b3JlX2ZhbHNlJywgJ2NvdW50J106CisKKyAgICAgICAgICAgICMgY29uc3QgaXMgYWx3YXlzIGRpc2FsbG93ZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKCcteCcsIGNvbnN0PSdmb28nLCBhY3Rpb249YWN0aW9uKQorCisgICAgICAgICAgICAjIG5hcmdzIGlzIGFsd2F5cyBkaXNhbGxvd2VkCisgICAgICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcignLXgnLCBuYXJncz0nKicsIGFjdGlvbj1hY3Rpb24pCisKKyAgICBkZWYgdGVzdF9tb3JlX3RoYW5fb25lX2FyZ3VtZW50X2FjdGlvbnMoc2VsZik6CisgICAgICAgIGZvciBhY3Rpb24gaW4gWydzdG9yZScsICdhcHBlbmQnXToKKworICAgICAgICAgICAgIyBuYXJncz0wIGlzIGRpc2FsbG93ZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VmFsdWVFcnJvcignLXgnLCBuYXJncz0wLCBhY3Rpb249YWN0aW9uKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRWYWx1ZUVycm9yKCdzcGFtJywgbmFyZ3M9MCwgYWN0aW9uPWFjdGlvbikKKworICAgICAgICAgICAgIyBjb25zdCBpcyBkaXNhbGxvd2VkIHdpdGggbm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICAgICAgICAgICAgZm9yIG5hcmdzIGluIFsxLCAnKicsICcrJ106CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRWYWx1ZUVycm9yKCcteCcsIGNvbnN0PSdmb28nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXJncz1uYXJncywgYWN0aW9uPWFjdGlvbikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFZhbHVlRXJyb3IoJ3NwYW0nLCBjb25zdD0nZm9vJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFyZ3M9bmFyZ3MsIGFjdGlvbj1hY3Rpb24pCisKKyAgICBkZWYgdGVzdF9yZXF1aXJlZF9jb25zdF9hY3Rpb25zKHNlbGYpOgorICAgICAgICBmb3IgYWN0aW9uIGluIFsnc3RvcmVfY29uc3QnLCAnYXBwZW5kX2NvbnN0J106CisKKyAgICAgICAgICAgICMgbmFyZ3MgaXMgYWx3YXlzIGRpc2FsbG93ZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKCcteCcsIG5hcmdzPScrJywgYWN0aW9uPWFjdGlvbikKKworICAgIGRlZiB0ZXN0X3BhcnNlcnNfYWN0aW9uX21pc3NpbmdfcGFyYW1zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcignY29tbWFuZCcsIGFjdGlvbj0ncGFyc2VycycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKCdjb21tYW5kJywgYWN0aW9uPSdwYXJzZXJzJywgcHJvZz0nUFJPRycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKCdjb21tYW5kJywgYWN0aW9uPSdwYXJzZXJzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyX2NsYXNzPWFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKQorCisgICAgZGVmIHRlc3RfcmVxdWlyZWRfcG9zaXRpb25hbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlRXJyb3IoJ2ZvbycsIHJlcXVpcmVkPVRydWUpCisKKyAgICBkZWYgdGVzdF91c2VyX2RlZmluZWRfYWN0aW9uKHNlbGYpOgorCisgICAgICAgIGNsYXNzIFN1Y2Nlc3MoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBBY3Rpb24ob2JqZWN0KToKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlKToKKyAgICAgICAgICAgICAgICBpZiBkZXN0ID09ICdzcGFtJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgY29uc3QgaXMgU3VjY2VzczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlZmF1bHQgaXMgU3VjY2VzczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBTdWNjZXNzKCkKKworICAgICAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3VjY2VzcywgcGFyc2VyLmFkZF9hcmd1bWVudCwgJy0tc3BhbScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj1BY3Rpb24sIGRlZmF1bHQ9U3VjY2VzcywgY29uc3Q9U3VjY2VzcykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3VjY2VzcywgcGFyc2VyLmFkZF9hcmd1bWVudCwgJ3NwYW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249QWN0aW9uLCBkZWZhdWx0PVN1Y2Nlc3MsIGNvbnN0PVN1Y2Nlc3MpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQWN0aW9ucyByZXR1cm5lZCBieSBhZGRfYXJndW1lbnQKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEFjdGlvbnNSZXR1cm5lZChUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9kZXN0KHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIGFjdGlvbiA9IHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24uZGVzdCwgJ2ZvbycpCisgICAgICAgIGFjdGlvbiA9IHBhcnNlci5hZGRfYXJndW1lbnQoJy1iJywgJy0tYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24uZGVzdCwgJ2JhcicpCisgICAgICAgIGFjdGlvbiA9IHBhcnNlci5hZGRfYXJndW1lbnQoJy14JywgJy15JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24uZGVzdCwgJ3gnKQorCisgICAgZGVmIHRlc3RfbWlzYyhzZWxmKToKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBhY3Rpb24gPSBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvbycsIG5hcmdzPSc/JywgY29uc3Q9NDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD04NCwgdHlwZT1pbnQsIGNob2ljZXM9WzEsIDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0ZPTycsIG1ldGF2YXI9J0JBUicsIGRlc3Q9J2JheicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLm5hcmdzLCAnPycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLmNvbnN0LCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24uZGVmYXVsdCwgODQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLnR5cGUsIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24uY2hvaWNlcywgWzEsIDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbi5oZWxwLCAnRk9PJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24ubWV0YXZhciwgJ0JBUicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLmRlc3QsICdiYXonKQorCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQXJndW1lbnQgY29uZmxpY3QgaGFuZGxpbmcgdGVzdHMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdENvbmZsaWN0SGFuZGxpbmcoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFkX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdF9oYW5kbGVyPSdmb28nKQorCisgICAgZGVmIHRlc3RfY29uZmxpY3RfZXJyb3Ioc2VsZik6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhcmdwYXJzZS5Bcmd1bWVudEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50LCAnLXgnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNwYW0nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhcmdwYXJzZS5Bcmd1bWVudEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50LCAnLS1zcGFtJykKKworICAgIGRlZiB0ZXN0X3Jlc29sdmVfZXJyb3Ioc2VsZik6CisgICAgICAgIGdldF9wYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcgorICAgICAgICBwYXJzZXIgPSBnZXRfcGFyc2VyKHByb2c9J1BST0cnLCBjb25mbGljdF9oYW5kbGVyPSdyZXNvbHZlJykKKworICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCcteCcsIGhlbHA9J09MRCBYJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXgnLCBoZWxwPSdORVcgWCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmZvcm1hdF9oZWxwKCksIHRleHR3cmFwLmRlZGVudCgnJydcCisgICAgICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFsteCBYXQorCisgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAgICAgLXggWCAgICAgICAgTkVXIFgKKyAgICAgICAgICAgICcnJykpCisKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zcGFtJywgbWV0YXZhcj0nT0xEX1NQQU0nKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNwYW0nLCBtZXRhdmFyPSdORVdfU1BBTScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmZvcm1hdF9oZWxwKCksIHRleHR3cmFwLmRlZGVudCgnJydcCisgICAgICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFsteCBYXSBbLS1zcGFtIE5FV19TUEFNXQorCisgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIC1oLCAtLWhlbHAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgICAgICAteCBYICAgICAgICAgICAgIE5FVyBYCisgICAgICAgICAgICAgIC0tc3BhbSBORVdfU1BBTQorICAgICAgICAgICAgJycnKSkKKworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEhlbHAgYW5kIFZlcnNpb24gb3B0aW9uIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RPcHRpb25hbHNIZWxwVmVyc2lvbkFjdGlvbnMoVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIGhlbHAgYW5kIHZlcnNpb24gYWN0aW9ucyIiIgorCisgICAgZGVmIF9nZXRfZXJyb3Ioc2VsZiwgZnVuYywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIGV4Y2VwdCBBcmd1bWVudFBhcnNlckVycm9yOgorICAgICAgICAgICAgcmV0dXJuIHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudFBhcnNlckVycm9yLCBmdW5jLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgYXNzZXJ0UHJpbnRIZWxwRXhpdChzZWxmLCBwYXJzZXIsIGFyZ3Nfc3RyKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHBhcnNlci5mb3JtYXRfaGVscCgpLAorICAgICAgICAgICAgc2VsZi5fZ2V0X2Vycm9yKHBhcnNlci5wYXJzZV9hcmdzLCBhcmdzX3N0ci5zcGxpdCgpKS5zdGRvdXQpCisKKyAgICBkZWYgYXNzZXJ0UHJpbnRWZXJzaW9uRXhpdChzZWxmLCBwYXJzZXIsIGFyZ3Nfc3RyKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHBhcnNlci5mb3JtYXRfdmVyc2lvbigpLAorICAgICAgICAgICAgc2VsZi5fZ2V0X2Vycm9yKHBhcnNlci5wYXJzZV9hcmdzLCBhcmdzX3N0ci5zcGxpdCgpKS5zdGRlcnIpCisKKyAgICBkZWYgYXNzZXJ0QXJndW1lbnRQYXJzZXJFcnJvcihzZWxmLCBwYXJzZXIsICphcmdzKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRQYXJzZXJFcnJvciwgcGFyc2VyLnBhcnNlX2FyZ3MsIGFyZ3MpCisKKyAgICBkZWYgdGVzdF92ZXJzaW9uKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcih2ZXJzaW9uPScxLjAnKQorICAgICAgICBzZWxmLmFzc2VydFByaW50SGVscEV4aXQocGFyc2VyLCAnLWgnKQorICAgICAgICBzZWxmLmFzc2VydFByaW50SGVscEV4aXQocGFyc2VyLCAnLS1oZWxwJykKKyAgICAgICAgc2VsZi5hc3NlcnRQcmludFZlcnNpb25FeGl0KHBhcnNlciwgJy12JykKKyAgICAgICAgc2VsZi5hc3NlcnRQcmludFZlcnNpb25FeGl0KHBhcnNlciwgJy0tdmVyc2lvbicpCisKKyAgICBkZWYgdGVzdF92ZXJzaW9uX2Zvcm1hdChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocHJvZz0nUFBQJywgdmVyc2lvbj0nJShwcm9nKXMgMy41JykKKyAgICAgICAgbXNnID0gc2VsZi5fZ2V0X2Vycm9yKHBhcnNlci5wYXJzZV9hcmdzLCBbJy12J10pLnN0ZGVycgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdQUFAgMy41XG4nLCBtc2cpCisKKyAgICBkZWYgdGVzdF92ZXJzaW9uX25vX2hlbHAoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKGFkZF9oZWxwPUZhbHNlLCB2ZXJzaW9uPScxLjAnKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IocGFyc2VyLCAnLWgnKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IocGFyc2VyLCAnLS1oZWxwJykKKyAgICAgICAgc2VsZi5hc3NlcnRQcmludFZlcnNpb25FeGl0KHBhcnNlciwgJy12JykKKyAgICAgICAgc2VsZi5hc3NlcnRQcmludFZlcnNpb25FeGl0KHBhcnNlciwgJy0tdmVyc2lvbicpCisKKyAgICBkZWYgdGVzdF92ZXJzaW9uX2FjdGlvbihzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocHJvZz0nWFhYJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLVYnLCBhY3Rpb249J3ZlcnNpb24nLCB2ZXJzaW9uPSclKHByb2cpcyAzLjcnKQorICAgICAgICBtc2cgPSBzZWxmLl9nZXRfZXJyb3IocGFyc2VyLnBhcnNlX2FyZ3MsIFsnLVYnXSkuc3RkZXJyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1hYWCAzLjdcbicsIG1zZykKKworICAgIGRlZiB0ZXN0X25vX2hlbHAoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKGFkZF9oZWxwPUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IocGFyc2VyLCAnLWgnKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IocGFyc2VyLCAnLS1oZWxwJykKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlciwgJy12JykKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlciwgJy0tdmVyc2lvbicpCisKKyAgICBkZWYgdGVzdF9hbHRlcm5hdGVfaGVscF92ZXJzaW9uKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy14JywgYWN0aW9uPSdoZWxwJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXknLCBhY3Rpb249J3ZlcnNpb24nKQorICAgICAgICBzZWxmLmFzc2VydFByaW50SGVscEV4aXQocGFyc2VyLCAnLXgnKQorICAgICAgICBzZWxmLmFzc2VydFByaW50VmVyc2lvbkV4aXQocGFyc2VyLCAnLXknKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IocGFyc2VyLCAnLXYnKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IocGFyc2VyLCAnLS12ZXJzaW9uJykKKworICAgIGRlZiB0ZXN0X2hlbHBfdmVyc2lvbl9leHRyYV9hcmd1bWVudHMoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHZlcnNpb249JzEuMCcpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy14JywgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgneScpCisKKyAgICAgICAgIyB0cnkgYWxsIGNvbWJpbmF0aW9ucyBvZiB2YWxpZCBwcmVmaXhlcyBhbmQgc3VmZml4ZXMKKyAgICAgICAgdmFsaWRfcHJlZml4ZXMgPSBbJycsICcteCcsICdmb28nLCAnLXggYmFyJywgJ2JheiAteCddCisgICAgICAgIHZhbGlkX3N1ZmZpeGVzID0gdmFsaWRfcHJlZml4ZXMgKyBbJy0tYmFkLW9wdGlvbicsICdmb28gYmFyIGJheiddCisgICAgICAgIGZvciBwcmVmaXggaW4gdmFsaWRfcHJlZml4ZXM6CisgICAgICAgICAgICBmb3Igc3VmZml4IGluIHZhbGlkX3N1ZmZpeGVzOgorICAgICAgICAgICAgICAgIGZvcm1hdCA9ICclcyAlJXMgJXMnICUgKHByZWZpeCwgc3VmZml4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRQcmludEhlbHBFeGl0KHBhcnNlciwgZm9ybWF0ICUgJy1oJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UHJpbnRIZWxwRXhpdChwYXJzZXIsIGZvcm1hdCAlICctLWhlbHAnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRQcmludFZlcnNpb25FeGl0KHBhcnNlciwgZm9ybWF0ICUgJy12JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UHJpbnRWZXJzaW9uRXhpdChwYXJzZXIsIGZvcm1hdCAlICctLXZlcnNpb24nKQorCisKKyMgPT09PT09PT09PT09PT09PT09PT09PQorIyBzdHIoKSBhbmQgcmVwcigpIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdFN0cmluZ3MoVGVzdENhc2UpOgorICAgICIiIlRlc3Qgc3RyKCkgIGFuZCByZXByKCkgb24gT3B0aW9uYWxzIGFuZCBQb3NpdGlvbmFscyIiIgorCisgICAgZGVmIGFzc2VydFN0cmluZ0VxdWFsKHNlbGYsIG9iaiwgcmVzdWx0X3N0cmluZyk6CisgICAgICAgIGZvciBmdW5jIGluIFtzdHIsIHJlcHJdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKG9iaiksIHJlc3VsdF9zdHJpbmcpCisKKyAgICBkZWYgdGVzdF9vcHRpb25hbChzZWxmKToKKyAgICAgICAgb3B0aW9uID0gYXJncGFyc2UuQWN0aW9uKAorICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3M9WyctLWZvbycsICctYScsICctYiddLAorICAgICAgICAgICAgZGVzdD0nYicsCisgICAgICAgICAgICB0eXBlPSdpbnQnLAorICAgICAgICAgICAgbmFyZ3M9JysnLAorICAgICAgICAgICAgZGVmYXVsdD00MiwKKyAgICAgICAgICAgIGNob2ljZXM9WzEsIDIsIDNdLAorICAgICAgICAgICAgaGVscD0nSEVMUCcsCisgICAgICAgICAgICBtZXRhdmFyPSdNRVRBVkFSJykKKyAgICAgICAgc3RyaW5nID0gKAorICAgICAgICAgICAgIkFjdGlvbihvcHRpb25fc3RyaW5ncz1bJy0tZm9vJywgJy1hJywgJy1iJ10sIGRlc3Q9J2InLCAiCisgICAgICAgICAgICAibmFyZ3M9JysnLCBjb25zdD1Ob25lLCBkZWZhdWx0PTQyLCB0eXBlPSdpbnQnLCAiCisgICAgICAgICAgICAiY2hvaWNlcz1bMSwgMiwgM10sIGhlbHA9J0hFTFAnLCBtZXRhdmFyPSdNRVRBVkFSJykiKQorICAgICAgICBzZWxmLmFzc2VydFN0cmluZ0VxdWFsKG9wdGlvbiwgc3RyaW5nKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnQoc2VsZik6CisgICAgICAgIGFyZ3VtZW50ID0gYXJncGFyc2UuQWN0aW9uKAorICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3M9W10sCisgICAgICAgICAgICBkZXN0PSd4JywKKyAgICAgICAgICAgIHR5cGU9ZmxvYXQsCisgICAgICAgICAgICBuYXJncz0nPycsCisgICAgICAgICAgICBkZWZhdWx0PTIuNSwKKyAgICAgICAgICAgIGNob2ljZXM9WzAuNSwgMS41LCAyLjVdLAorICAgICAgICAgICAgaGVscD0nSCBISCBIJywKKyAgICAgICAgICAgIG1ldGF2YXI9J01WIE1WIE1WJykKKyAgICAgICAgc3RyaW5nID0gKAorICAgICAgICAgICAgIkFjdGlvbihvcHRpb25fc3RyaW5ncz1bXSwgZGVzdD0neCcsIG5hcmdzPSc/JywgIgorICAgICAgICAgICAgImNvbnN0PU5vbmUsIGRlZmF1bHQ9Mi41LCB0eXBlPSVyLCBjaG9pY2VzPVswLjUsIDEuNSwgMi41XSwgIgorICAgICAgICAgICAgImhlbHA9J0ggSEggSCcsIG1ldGF2YXI9J01WIE1WIE1WJykiICUgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyaW5nRXF1YWwoYXJndW1lbnQsIHN0cmluZykKKworICAgIGRlZiB0ZXN0X25hbWVzcGFjZShzZWxmKToKKyAgICAgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoZm9vPTQyLCBiYXI9J3NwYW0nKQorICAgICAgICBzdHJpbmcgPSAiTmFtZXNwYWNlKGJhcj0nc3BhbScsIGZvbz00MikiCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyaW5nRXF1YWwobnMsIHN0cmluZykKKworICAgIGRlZiB0ZXN0X3BhcnNlcihzZWxmKToKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCisgICAgICAgIHN0cmluZyA9ICgKKyAgICAgICAgICAgICJBcmd1bWVudFBhcnNlcihwcm9nPSdQUk9HJywgdXNhZ2U9Tm9uZSwgZGVzY3JpcHRpb249Tm9uZSwgIgorICAgICAgICAgICAgInZlcnNpb249Tm9uZSwgZm9ybWF0dGVyX2NsYXNzPSVyLCBjb25mbGljdF9oYW5kbGVyPSdlcnJvcicsICIKKyAgICAgICAgICAgICJhZGRfaGVscD1UcnVlKSIgJSBhcmdwYXJzZS5IZWxwRm9ybWF0dGVyKQorICAgICAgICBzZWxmLmFzc2VydFN0cmluZ0VxdWFsKHBhcnNlciwgc3RyaW5nKQorCisjID09PT09PT09PT09PT09PQorIyBOYW1lc3BhY2UgdGVzdHMKKyMgPT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3ROYW1lc3BhY2UoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIG5zID0gYXJncGFyc2UuTmFtZXNwYWNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGdldGF0dHIsIG5zLCAneCcpCisKKyAgICAgICAgbnMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoYT00MiwgYj0nc3BhbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuYSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMuYiwgJ3NwYW0nKQorCisgICAgZGVmIHRlc3RfZXF1YWxpdHkoc2VsZik6CisgICAgICAgIG5zMSA9IGFyZ3BhcnNlLk5hbWVzcGFjZShhPTEsIGI9MikKKyAgICAgICAgbnMyID0gYXJncGFyc2UuTmFtZXNwYWNlKGI9MiwgYT0xKQorICAgICAgICBuczMgPSBhcmdwYXJzZS5OYW1lc3BhY2UoYT0xKQorICAgICAgICBuczQgPSBhcmdwYXJzZS5OYW1lc3BhY2UoYj0yKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnMxLCBuczIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobnMxLCBuczMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobnMxLCBuczQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobnMyLCBuczMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobnMyLCBuczQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuczEgIT0gbnMzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobnMxICE9IG5zNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zMiAhPSBuczMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuczIgIT0gbnM0KQorCisKKyMgPT09PT09PT09PT09PT09PT09PQorIyBGaWxlIGVuY29kaW5nIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEVuY29kaW5nKFRlc3RDYXNlKToKKworICAgIGRlZiBfdGVzdF9tb2R1bGVfZW5jb2Rpbmcoc2VsZiwgcGF0aCk6CisgICAgICAgIHBhdGgsIF8gPSBvcy5wYXRoLnNwbGl0ZXh0KHBhdGgpCisgICAgICAgIHBhdGggKz0gIi5weSIKKyAgICAgICAgd2l0aCBjb2RlY3Mub3BlbihwYXRoLCAncicsICd1dGY4JykgYXMgZjoKKyAgICAgICAgICAgIGYucmVhZCgpCisKKyAgICBkZWYgdGVzdF9hcmdwYXJzZV9tb2R1bGVfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfbW9kdWxlX2VuY29kaW5nKGFyZ3BhcnNlLl9fZmlsZV9fKQorCisgICAgZGVmIHRlc3RfdGVzdF9hcmdwYXJzZV9tb2R1bGVfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfbW9kdWxlX2VuY29kaW5nKF9fZmlsZV9fKQorCisjID09PT09PT09PT09PT09PT09PT0KKyMgQXJndW1lbnRFcnJvciB0ZXN0cworIyA9PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RBcmd1bWVudEVycm9yKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50X2Vycm9yKHNlbGYpOgorICAgICAgICBtc2cgPSAibXkgZXJyb3IgaGVyZSIKKyAgICAgICAgZXJyb3IgPSBhcmdwYXJzZS5Bcmd1bWVudEVycm9yKE5vbmUsIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZXJyb3IpLCBtc2cpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT0KKyMgQXJndW1lbnRUeXBlRXJyb3IgdGVzdHMKKyMgPT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEFyZ3VtZW50VHlwZUVycm9yKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50X3R5cGVfZXJyb3Ioc2VsZik6CisKKyAgICAgICAgZGVmIHNwYW0oc3RyaW5nKToKKyAgICAgICAgICAgIHJhaXNlIGFyZ3BhcnNlLkFyZ3VtZW50VHlwZUVycm9yKCdzcGFtIScpCisKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycsIGFkZF9oZWxwPUZhbHNlKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCd4JywgdHlwZT1zcGFtKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncyhbJ1hYWCddKQorICAgICAgICBleGNlcHQgQXJndW1lbnRQYXJzZXJFcnJvcjoKKyAgICAgICAgICAgIGV4cGVjdGVkID0gJ3VzYWdlOiBQUk9HIHhcblBST0c6IGVycm9yOiBhcmd1bWVudCB4OiBzcGFtIVxuJworICAgICAgICAgICAgbXNnID0gc3lzLmV4Y19pbmZvKClbMV0uc3RkZXJyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBtc2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoKQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBDaGVjayB0aGF0IHRoZSB0eXBlIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uY2UKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RUeXBlRnVuY3Rpb25DYWxsT25seU9uY2UoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdHlwZV9mdW5jdGlvbl9jYWxsX29ubHlfb25jZShzZWxmKToKKyAgICAgICAgZGVmIHNwYW0oc3RyaW5nX3RvX2NvbnZlcnQpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfdG9fY29udmVydCwgJ3NwYW0hJykKKyAgICAgICAgICAgIHJldHVybiAnZm9vX2NvbnZlcnRlZCcKKworICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJywgdHlwZT1zcGFtLCBkZWZhdWx0PSdiYXInKQorICAgICAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoJy0tZm9vIHNwYW0hJy5zcGxpdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKGZvbz0nZm9vX2NvbnZlcnRlZCcpLCBhcmdzKQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBDaGVjayBzZW1hbnRpY3MgcmVnYXJkaW5nIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGFuZCB0eXBlIGNvbnZlcnNpb24KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RUeXBlRnVuY3Rpb25DYWxsZWRPbkRlZmF1bHQoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdHlwZV9mdW5jdGlvbl9jYWxsX3dpdGhfbm9uX3N0cmluZ19kZWZhdWx0KHNlbGYpOgorICAgICAgICBkZWYgc3BhbShpbnRfdG9fY29udmVydCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludF90b19jb252ZXJ0LCAwKQorICAgICAgICAgICAgcmV0dXJuICdmb29fY29udmVydGVkJworCisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb28nLCB0eXBlPXNwYW0sIGRlZmF1bHQ9MCkKKyAgICAgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKFtdKQorICAgICAgICAjIGZvbyBzaG91bGQgKm5vdCogYmUgY29udmVydGVkIGJlY2F1c2UgaXRzIGRlZmF1bHQgaXMgbm90IGEgc3RyaW5nLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKGZvbz0wKSwgYXJncykKKworICAgIGRlZiB0ZXN0X3R5cGVfZnVuY3Rpb25fY2FsbF93aXRoX3N0cmluZ19kZWZhdWx0KHNlbGYpOgorICAgICAgICBkZWYgc3BhbShpbnRfdG9fY29udmVydCk6CisgICAgICAgICAgICByZXR1cm4gJ2Zvb19jb252ZXJ0ZWQnCisKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvbycsIHR5cGU9c3BhbSwgZGVmYXVsdD0nMCcpCisgICAgICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhbXSkKKyAgICAgICAgIyBmb28gaXMgY29udmVydGVkIGJlY2F1c2UgaXRzIGRlZmF1bHQgaXMgYSBzdHJpbmcuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoZm9vPSdmb29fY29udmVydGVkJyksIGFyZ3MpCisKKyAgICBkZWYgdGVzdF9ub19kb3VibGVfdHlwZV9jb252ZXJzaW9uX29mX2RlZmF1bHQoc2VsZik6CisgICAgICAgIGRlZiBleHRlbmQoc3RyX3RvX2NvbnZlcnQpOgorICAgICAgICAgICAgcmV0dXJuIHN0cl90b19jb252ZXJ0ICsgJyonCisKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRlc3QnLCB0eXBlPWV4dGVuZCwgZGVmYXVsdD0nKicpCisgICAgICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhbXSkKKyAgICAgICAgIyBUaGUgdGVzdCBhcmd1bWVudCB3aWxsIGJlIHR3byBzdGFycywgb25lIGNvbWluZyBmcm9tIHRoZSBkZWZhdWx0CisgICAgICAgICMgdmFsdWUgYW5kIG9uZSBjb21pbmcgZnJvbSB0aGUgdHlwZSBjb252ZXJzaW9uIGJlaW5nIGNhbGxlZCBleGFjdGx5CisgICAgICAgICMgb25jZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh0ZXN0PScqKicpLCBhcmdzKQorCisgICAgZGVmIHRlc3RfaXNzdWVfMTU5MDYoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE1OTA2OiBXaGVuIGFjdGlvbj0nYXBwZW5kJywgdHlwZT1zdHIsIGRlZmF1bHQ9W10gYXJlCisgICAgICAgICMgcHJvdmlkaW5nLCB0aGUgZGVzdCB2YWx1ZSB3YXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiAiW10iIHdoZW4gaXQKKyAgICAgICAgIyBzaG91bGQgaGF2ZSBiZWVuIGFuIGVtcHR5IGxpc3QuCisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS10ZXN0JywgZGVzdD0ndGVzdCcsIHR5cGU9c3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9W10sIGFjdGlvbj0nYXBwZW5kJykKKyAgICAgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MudGVzdCwgW10pCisKKyMgPT09PT09PT09PT09PT09PT09PT09PQorIyBwYXJzZV9rbm93bl9hcmdzIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdFBhcnNlS25vd25BcmdzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50c190dXBsZShzZWxmKToKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIucGFyc2VfYXJncygoKSkKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50c19saXN0KHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKFtdKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRzX3R1cGxlX3Bvc2l0aW9uYWwoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgneCcpCisgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKCgneCcsKSkKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50c19saXN0X3Bvc2l0aW9uYWwoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgneCcpCisgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKFsneCddKQorCisgICAgZGVmIHRlc3Rfb3B0aW9uYWxzKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJykKKyAgICAgICAgYXJncywgZXh0cmFzID0gcGFyc2VyLnBhcnNlX2tub3duX2FyZ3MoJy0tZm9vIEYgLS1iYXIgLS1iYXonLnNwbGl0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoZm9vPSdGJyksIGFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyctLWJhcicsICctLWJheiddLCBleHRyYXMpCisKKyAgICBkZWYgdGVzdF9taXhlZChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctdicsIG5hcmdzPSc/JywgY29uc3Q9MSwgdHlwZT1pbnQpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tc3BhbScsIGFjdGlvbj0nc3RvcmVfZmFsc2UnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdiYWRnZXInKQorCisgICAgICAgIGFyZ3YgPSBbIkIiLCAiQyIsICItLWZvbyIsICItdiIsICIzIiwgIjQiXQorICAgICAgICBhcmdzLCBleHRyYXMgPSBwYXJzZXIucGFyc2Vfa25vd25fYXJncyhhcmd2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKHY9Mywgc3BhbT1UcnVlLCBiYWRnZXI9IkIiKSwgYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbIkMiLCAiLS1mb28iLCAiNCJdLCBleHRyYXMpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgYWRkX2FyZ3VtZW50IG1ldGF2YXIgdGVzdHMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEFkZEFyZ3VtZW50TWV0YXZhcihUZXN0Q2FzZSk6CisKKyAgICBFWFBFQ1RFRF9NRVNTQUdFID0gImxlbmd0aCBvZiBtZXRhdmFyIHR1cGxlIGRvZXMgbm90IG1hdGNoIG5hcmdzIgorCisgICAgZGVmIGRvX3Rlc3Rfbm9fZXhjZXB0aW9uKHNlbGYsIG5hcmdzLCBtZXRhdmFyKToKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWZvbyIsIG5hcmdzPW5hcmdzLCBtZXRhdmFyPW1ldGF2YXIpCisKKyAgICBkZWYgZG9fdGVzdF9leGNlcHRpb24oc2VsZiwgbmFyZ3MsIG1ldGF2YXIpOgorICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgY206CisgICAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWZvbyIsIG5hcmdzPW5hcmdzLCBtZXRhdmFyPW1ldGF2YXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmFyZ3NbMF0sIHNlbGYuRVhQRUNURURfTUVTU0FHRSkKKworICAgICMgVW5pdCB0ZXN0cyBmb3IgZGlmZmVyZW50IHZhbHVlcyBvZiBtZXRhdmFyIHdoZW4gbmFyZ3M9Tm9uZQorCisgICAgZGVmIHRlc3RfbmFyZ3NfTm9uZV9tZXRhdmFyX3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz1Ob25lLCBtZXRhdmFyPSIxIikKKworICAgIGRlZiB0ZXN0X25hcmdzX05vbmVfbWV0YXZhcl9sZW5ndGgwKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPU5vbmUsIG1ldGF2YXI9dHVwbGUoKSkKKworICAgIGRlZiB0ZXN0X25hcmdzX05vbmVfbWV0YXZhcl9sZW5ndGgxKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPU5vbmUsIG1ldGF2YXI9KCIxIikpCisKKyAgICBkZWYgdGVzdF9uYXJnc19Ob25lX21ldGF2YXJfbGVuZ3RoMihzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X2V4Y2VwdGlvbihuYXJncz1Ob25lLCBtZXRhdmFyPSgiMSIsICIyIikpCisKKyAgICBkZWYgdGVzdF9uYXJnc19Ob25lX21ldGF2YXJfbGVuZ3RoMyhzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X2V4Y2VwdGlvbihuYXJncz1Ob25lLCBtZXRhdmFyPSgiMSIsICIyIiwgIjMiKSkKKworICAgICMgVW5pdCB0ZXN0cyBmb3IgZGlmZmVyZW50IHZhbHVlcyBvZiBtZXRhdmFyIHdoZW4gbmFyZ3M9PworCisgICAgZGVmIHRlc3RfbmFyZ3Nfb3B0aW9uYWxfbWV0YXZhcl9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9Ij8iLCBtZXRhdmFyPSIxIikKKworICAgIGRlZiB0ZXN0X25hcmdzX29wdGlvbmFsX21ldGF2YXJfbGVuZ3RoMChzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X2V4Y2VwdGlvbihuYXJncz0iPyIsIG1ldGF2YXI9dHVwbGUoKSkKKworICAgIGRlZiB0ZXN0X25hcmdzX29wdGlvbmFsX21ldGF2YXJfbGVuZ3RoMShzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz0iPyIsIG1ldGF2YXI9KCIxIikpCisKKyAgICBkZWYgdGVzdF9uYXJnc19vcHRpb25hbF9tZXRhdmFyX2xlbmd0aDIoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9Ij8iLCBtZXRhdmFyPSgiMSIsICIyIikpCisKKyAgICBkZWYgdGVzdF9uYXJnc19vcHRpb25hbF9tZXRhdmFyX2xlbmd0aDMoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9Ij8iLCBtZXRhdmFyPSgiMSIsICIyIiwgIjMiKSkKKworICAgICMgVW5pdCB0ZXN0cyBmb3IgZGlmZmVyZW50IHZhbHVlcyBvZiBtZXRhdmFyIHdoZW4gbmFyZ3M9KgorCisgICAgZGVmIHRlc3RfbmFyZ3NfemVyb29ybW9yZV9tZXRhdmFyX3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz0iKiIsIG1ldGF2YXI9IjEiKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfemVyb29ybW9yZV9tZXRhdmFyX2xlbmd0aDAoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9IioiLCBtZXRhdmFyPXR1cGxlKCkpCisKKyAgICBkZWYgdGVzdF9uYXJnc196ZXJvb3Jtb3JlX21ldGF2YXJfbGVuZ3RoMShzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz0iKiIsIG1ldGF2YXI9KCIxIikpCisKKyAgICBkZWYgdGVzdF9uYXJnc196ZXJvb3Jtb3JlX21ldGF2YXJfbGVuZ3RoMihzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz0iKiIsIG1ldGF2YXI9KCIxIiwgIjIiKSkKKworICAgIGRlZiB0ZXN0X25hcmdzX3plcm9vcm1vcmVfbWV0YXZhcl9sZW5ndGgzKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPSIqIiwgbWV0YXZhcj0oIjEiLCAiMiIsICIzIikpCisKKyAgICAjIFVuaXQgdGVzdHMgZm9yIGRpZmZlcmVudCB2YWx1ZXMgb2YgbWV0YXZhciB3aGVuIG5hcmdzPSsKKworICAgIGRlZiB0ZXN0X25hcmdzX29uZW9ybW9yZV9tZXRhdmFyX3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz0iKyIsIG1ldGF2YXI9IjEiKQorCisgICAgZGVmIHRlc3RfbmFyZ3Nfb25lb3Jtb3JlX21ldGF2YXJfbGVuZ3RoMChzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X2V4Y2VwdGlvbihuYXJncz0iKyIsIG1ldGF2YXI9dHVwbGUoKSkKKworICAgIGRlZiB0ZXN0X25hcmdzX29uZW9ybW9yZV9tZXRhdmFyX2xlbmd0aDEoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9IisiLCBtZXRhdmFyPSgiMSIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3Nfb25lb3Jtb3JlX21ldGF2YXJfbGVuZ3RoMihzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz0iKyIsIG1ldGF2YXI9KCIxIiwgIjIiKSkKKworICAgIGRlZiB0ZXN0X25hcmdzX29uZW9ybW9yZV9tZXRhdmFyX2xlbmd0aDMoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9IisiLCBtZXRhdmFyPSgiMSIsICIyIiwgIjMiKSkKKworICAgICMgVW5pdCB0ZXN0cyBmb3IgZGlmZmVyZW50IHZhbHVlcyBvZiBtZXRhdmFyIHdoZW4gbmFyZ3M9Li4uCisKKyAgICBkZWYgdGVzdF9uYXJnc19yZW1haW5kZXJfbWV0YXZhcl9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9Ii4uLiIsIG1ldGF2YXI9IjEiKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfcmVtYWluZGVyX21ldGF2YXJfbGVuZ3RoMChzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz0iLi4uIiwgbWV0YXZhcj10dXBsZSgpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfcmVtYWluZGVyX21ldGF2YXJfbGVuZ3RoMShzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz0iLi4uIiwgbWV0YXZhcj0oIjEiKSkKKworICAgIGRlZiB0ZXN0X25hcmdzX3JlbWFpbmRlcl9tZXRhdmFyX2xlbmd0aDIoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9Ii4uLiIsIG1ldGF2YXI9KCIxIiwgIjIiKSkKKworICAgIGRlZiB0ZXN0X25hcmdzX3JlbWFpbmRlcl9tZXRhdmFyX2xlbmd0aDMoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9Ii4uLiIsIG1ldGF2YXI9KCIxIiwgIjIiLCAiMyIpKQorCisgICAgIyBVbml0IHRlc3RzIGZvciBkaWZmZXJlbnQgdmFsdWVzIG9mIG1ldGF2YXIgd2hlbiBuYXJncz1BLi4uCisKKyAgICBkZWYgdGVzdF9uYXJnc19wYXJzZXJfbWV0YXZhcl9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9IkEuLi4iLCBtZXRhdmFyPSIxIikKKworICAgIGRlZiB0ZXN0X25hcmdzX3BhcnNlcl9tZXRhdmFyX2xlbmd0aDAoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9IkEuLi4iLCBtZXRhdmFyPXR1cGxlKCkpCisKKyAgICBkZWYgdGVzdF9uYXJnc19wYXJzZXJfbWV0YXZhcl9sZW5ndGgxKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPSJBLi4uIiwgbWV0YXZhcj0oIjEiKSkKKworICAgIGRlZiB0ZXN0X25hcmdzX3BhcnNlcl9tZXRhdmFyX2xlbmd0aDIoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9IkEuLi4iLCBtZXRhdmFyPSgiMSIsICIyIikpCisKKyAgICBkZWYgdGVzdF9uYXJnc19wYXJzZXJfbWV0YXZhcl9sZW5ndGgzKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPSJBLi4uIiwgbWV0YXZhcj0oIjEiLCAiMiIsICIzIikpCisKKyAgICAjIFVuaXQgdGVzdHMgZm9yIGRpZmZlcmVudCB2YWx1ZXMgb2YgbWV0YXZhciB3aGVuIG5hcmdzPTEKKworICAgIGRlZiB0ZXN0X25hcmdzXzFfbWV0YXZhcl9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9MSwgbWV0YXZhcj0iMSIpCisKKyAgICBkZWYgdGVzdF9uYXJnc18xX21ldGF2YXJfbGVuZ3RoMChzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X2V4Y2VwdGlvbihuYXJncz0xLCBtZXRhdmFyPXR1cGxlKCkpCisKKyAgICBkZWYgdGVzdF9uYXJnc18xX21ldGF2YXJfbGVuZ3RoMShzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz0xLCBtZXRhdmFyPSgiMSIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfMV9tZXRhdmFyX2xlbmd0aDIoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9MSwgbWV0YXZhcj0oIjEiLCAiMiIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfMV9tZXRhdmFyX2xlbmd0aDMoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9MSwgbWV0YXZhcj0oIjEiLCAiMiIsICIzIikpCisKKyAgICAjIFVuaXQgdGVzdHMgZm9yIGRpZmZlcmVudCB2YWx1ZXMgb2YgbWV0YXZhciB3aGVuIG5hcmdzPTIKKworICAgIGRlZiB0ZXN0X25hcmdzXzJfbWV0YXZhcl9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9MiwgbWV0YXZhcj0iMSIpCisKKyAgICBkZWYgdGVzdF9uYXJnc18yX21ldGF2YXJfbGVuZ3RoMChzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X2V4Y2VwdGlvbihuYXJncz0yLCBtZXRhdmFyPXR1cGxlKCkpCisKKyAgICBkZWYgdGVzdF9uYXJnc18yX21ldGF2YXJfbGVuZ3RoMShzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz0yLCBtZXRhdmFyPSgiMSIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfMl9tZXRhdmFyX2xlbmd0aDIoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9MiwgbWV0YXZhcj0oIjEiLCAiMiIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfMl9tZXRhdmFyX2xlbmd0aDMoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9MiwgbWV0YXZhcj0oIjEiLCAiMiIsICIzIikpCisKKyAgICAjIFVuaXQgdGVzdHMgZm9yIGRpZmZlcmVudCB2YWx1ZXMgb2YgbWV0YXZhciB3aGVuIG5hcmdzPTMKKworICAgIGRlZiB0ZXN0X25hcmdzXzNfbWV0YXZhcl9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9MywgbWV0YXZhcj0iMSIpCisKKyAgICBkZWYgdGVzdF9uYXJnc18zX21ldGF2YXJfbGVuZ3RoMChzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X2V4Y2VwdGlvbihuYXJncz0zLCBtZXRhdmFyPXR1cGxlKCkpCisKKyAgICBkZWYgdGVzdF9uYXJnc18zX21ldGF2YXJfbGVuZ3RoMShzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz0zLCBtZXRhdmFyPSgiMSIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfM19tZXRhdmFyX2xlbmd0aDIoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9MywgbWV0YXZhcj0oIjEiLCAiMiIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfM19tZXRhdmFyX2xlbmd0aDMoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9MywgbWV0YXZhcj0oIjEiLCAiMiIsICIzIikpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBmcm9tIGFyZ3BhcnNlIGltcG9ydCAqIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEltcG9ydFN0YXIoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIGFyZ3BhcnNlLl9fYWxsX186CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhcmdwYXJzZSwgbmFtZSkpCisKKyAgICBkZWYgdGVzdF9hbGxfZXhwb3J0c19ldmVyeXRoaW5nX2J1dF9tb2R1bGVzKHNlbGYpOgorICAgICAgICBpdGVtcyA9IFsKKyAgICAgICAgICAgIG5hbWUKKyAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiB2YXJzKGFyZ3BhcnNlKS5pdGVtcygpCisgICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCJfIikKKyAgICAgICAgICAgIGlmIG5vdCBpbnNwZWN0LmlzbW9kdWxlKHZhbHVlKQorICAgICAgICBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGl0ZW1zKSwgc29ydGVkKGFyZ3BhcnNlLl9fYWxsX18pKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgIyBzaWxlbmNlIHdhcm5pbmdzIGFib3V0IHZlcnNpb24gYXJndW1lbnQgLSB0aGVzZSBhcmUgZXhwZWN0ZWQKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygKKyAgICAgICAgICAgICgnVGhlICJ2ZXJzaW9uIiBhcmd1bWVudCB0byBBcmd1bWVudFBhcnNlciBpcyBkZXByZWNhdGVkLicsCisgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICgnVGhlIChmb3JtYXR8cHJpbnQpX3ZlcnNpb24gbWV0aG9kIGlzIGRlcHJlY2F0ZWQnLAorICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorICAgICMgUmVtb3ZlIGdsb2JhbCByZWZlcmVuY2VzIHRvIGF2b2lkIGxvb2tpbmcgbGlrZSB3ZSBoYXZlIHJlZmxlYWtzLgorICAgIFJGaWxlLnNlZW4gPSB7fQorICAgIFdGaWxlLnNlZW4gPSBzZXQoKQorCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJncGFyc2UucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJncGFyc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YzQxZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hcmdwYXJzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJncGFyc2UucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJncGFyc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYTVhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hcmdwYXJzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJyYXkucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hcnJheS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NGRjY2JmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJyYXkucHkKQEAgLTAsMCArMSwxMTExIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJUZXN0IHRoZSBhcnJheW1vZHVsZS4KKyAgIFJvZ2VyIEUuIE1hc3NlCisiIiIKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5CitpbXBvcnQgYXJyYXksIGNTdHJpbmdJTworZnJvbSBjUGlja2xlIGltcG9ydCBsb2FkcywgZHVtcHMsIEhJR0hFU1RfUFJPVE9DT0wKKworY2xhc3MgQXJyYXlTdWJjbGFzcyhhcnJheS5hcnJheSk6CisgICAgcGFzcworCitjbGFzcyBBcnJheVN1YmNsYXNzV2l0aEt3YXJncyhhcnJheS5hcnJheSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVjb2RlLCBuZXdhcmc9Tm9uZSk6CisgICAgICAgIGFycmF5LmFycmF5Ll9faW5pdF9fKHNlbGYsIHR5cGVjb2RlKQorCit0ZXN0cyA9IFtdICMgbGlzdCB0byBhY2N1bXVsYXRlIGFsbCB0ZXN0cwordHlwZWNvZGVzID0gImN1YkJoSGlJbExmZCIKKworY2xhc3MgQmFkQ29uc3RydWN0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFycmF5LmFycmF5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFycmF5LmFycmF5LCBzcGFtPTQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFycmF5LmFycmF5LCAneHgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhcnJheS5hcnJheSwgJ3gnKQorCit0ZXN0cy5hcHBlbmQoQmFkQ29uc3RydWN0b3JUZXN0KQorCitjbGFzcyBCYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBSZXF1aXJlZCBjbGFzcyBhdHRyaWJ1dGVzIChwcm92aWRlZCBieSBzdWJjbGFzc2VzCisgICAgIyB0eXBlY29kZTogdGhlIHR5cGVjb2RlIHRvIHRlc3QKKyAgICAjIGV4YW1wbGU6IGFuIGluaXRpYWxpemVyIHVzYWJsZSBpbiB0aGUgY29uc3RydWN0b3IgZm9yIHRoaXMgdHlwZQorICAgICMgc21hbGxlcmV4YW1wbGU6IHRoZSBzYW1lIGxlbmd0aCBhcyBleGFtcGxlLCBidXQgc21hbGxlcgorICAgICMgYmlnZ2VyZXhhbXBsZTogdGhlIHNhbWUgbGVuZ3RoIGFzIGV4YW1wbGUsIGJ1dCBiaWdnZXIKKyAgICAjIG91dHNpZGU6IEFuIGVudHJ5IHRoYXQgaXMgbm90IGluIGV4YW1wbGUKKyAgICAjIG1pbml0ZW1zaXplOiB0aGUgbWluaW11bSBndWFyYW50ZWVkIGl0ZW1zaXplCisKKyAgICBkZWYgYXNzZXJ0RW50cnlFcXVhbChzZWxmLCBlbnRyeTEsIGVudHJ5Mik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW50cnkxLCBlbnRyeTIpCisKKyAgICBkZWYgYmFkdHlwZWNvZGUoc2VsZik6CisgICAgICAgICMgUmV0dXJuIGEgdHlwZWNvZGUgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSBvdXIgb3duCisgICAgICAgIHJldHVybiB0eXBlY29kZXNbKHR5cGVjb2Rlcy5pbmRleChzZWxmLnR5cGVjb2RlKSsxKSAlIGxlbih0eXBlY29kZXMpXQorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEudHlwZWNvZGUsIHNlbGYudHlwZWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhLml0ZW1zaXplPj1zZWxmLm1pbml0ZW1zaXplKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFycmF5LmFycmF5LCBzZWxmLnR5cGVjb2RlLCBOb25lKQorCisgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgYS5hcHBlbmQoc2VsZi5leGFtcGxlWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhKSwgMSkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhKSwgbGVuKHNlbGYuZXhhbXBsZSkpCisKKyAgICBkZWYgdGVzdF9idWZmZXJfaW5mbyhzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmJ1ZmZlcl9pbmZvLCA0MikKKyAgICAgICAgYmkgPSBhLmJ1ZmZlcl9pbmZvKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGJpLCB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYmkpLCAyKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYmlbMF0sIChpbnQsIGxvbmcpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYmlbMV0sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaVsxXSwgbGVuKGEpKQorCisgICAgZGVmIHRlc3RfYnl0ZXN3YXAoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5ieXRlc3dhcCwgNDIpCisgICAgICAgIGlmIGEuaXRlbXNpemUgaW4gKDEsIDIsIDQsIDgpOgorICAgICAgICAgICAgYiA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgICAgIGIuYnl0ZXN3YXAoKQorICAgICAgICAgICAgaWYgYS5pdGVtc2l6ZT09MToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYSwgYikKKyAgICAgICAgICAgIGIuYnl0ZXN3YXAoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgaW1wb3J0IGNvcHkKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYiA9IGNvcHkuY29weShhKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGEpLCBpZChiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHkoc2VsZik6CisgICAgICAgIGltcG9ydCBjb3B5CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGIgPSBjb3B5LmRlZXBjb3B5KGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoYSksIGlkKGIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisKKyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CisgICAgICAgIGZvciBwcm90b2NvbCBpbiByYW5nZShISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICAgICAgYiA9IGxvYWRzKGR1bXBzKGEsIHByb3RvY29sKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoYSksIGlkKGIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCisgICAgICAgICAgICBhID0gQXJyYXlTdWJjbGFzcyhzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgICAgICBhLnggPSAxMAorICAgICAgICAgICAgYiA9IGxvYWRzKGR1bXBzKGEsIHByb3RvY29sKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoYSksIGlkKGIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLngsIGIueCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhKSwgdHlwZShiKSkKKworICAgIGRlZiB0ZXN0X3BpY2tsZV9mb3JfZW1wdHlfYXJyYXkoc2VsZik6CisgICAgICAgIGZvciBwcm90b2NvbCBpbiByYW5nZShISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgICAgIGIgPSBsb2FkcyhkdW1wcyhhLCBwcm90b2NvbCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGEpLCBpZChiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKworICAgICAgICAgICAgYSA9IEFycmF5U3ViY2xhc3Moc2VsZi50eXBlY29kZSkKKyAgICAgICAgICAgIGEueCA9IDEwCisgICAgICAgICAgICBiID0gbG9hZHMoZHVtcHMoYSwgcHJvdG9jb2wpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChhKSwgaWQoYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEueCwgYi54KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGEpLCB0eXBlKGIpKQorCisgICAgZGVmIHRlc3RfaW5zZXJ0KHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhLmluc2VydCgwLCBzZWxmLmV4YW1wbGVbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGEpLCAxK2xlbihzZWxmLmV4YW1wbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMF0sIGFbMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5pbnNlcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5pbnNlcnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5pbnNlcnQsIDAsIE5vbmUpCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYS5pbnNlcnQoLTEsIHNlbGYuZXhhbXBsZVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheSgKKyAgICAgICAgICAgICAgICBzZWxmLnR5cGVjb2RlLAorICAgICAgICAgICAgICAgIHNlbGYuZXhhbXBsZVs6LTFdICsgc2VsZi5leGFtcGxlWzoxXSArIHNlbGYuZXhhbXBsZVstMTpdCisgICAgICAgICAgICApCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhLmluc2VydCgtMTAwMCwgc2VsZi5leGFtcGxlWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVs6MV0gKyBzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhLmluc2VydCgxMDAwLCBzZWxmLmV4YW1wbGVbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlICsgc2VsZi5leGFtcGxlWzoxXSkKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfdG9mcm9tZmlsZShzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDIqc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEudG9maWxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEudG9maWxlLCBjU3RyaW5nSU8uU3RyaW5nSU8oKSkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAnd2InKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhLnRvZmlsZShmKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBiID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICdyYicpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGIuZnJvbWZpbGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgYi5mcm9tZmlsZSwKKyAgICAgICAgICAgICAgICBjU3RyaW5nSU8uU3RyaW5nSU8oKSwgbGVuKHNlbGYuZXhhbXBsZSkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGIuZnJvbWZpbGUoZiwgbGVuKHNlbGYuZXhhbXBsZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGEsIGIpCisgICAgICAgICAgICBiLmZyb21maWxlKGYsIGxlbihzZWxmLmV4YW1wbGUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGIuZnJvbWZpbGUsIGYsIDEpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlZDoKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2Zyb21maWxlX2lvZXJyb3Ioc2VsZik6CisgICAgICAgICMgSXNzdWUgIzUzOTU6IENoZWNrIGlmIGZyb21maWxlIHJhaXNlcyBhIHByb3BlciBJT0Vycm9yCisgICAgICAgICMgaW5zdGVhZCBvZiBFT0ZFcnJvci4KKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3YicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGEuZnJvbWZpbGUsIGYsIGxlbihzZWxmLmV4YW1wbGUpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9maWxld3JpdGUoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCAyKnNlbGYuZXhhbXBsZSkKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3diJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZShhKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBiID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICdyYicpCisgICAgICAgICAgICBiLmZyb21maWxlKGYsIGxlbihzZWxmLmV4YW1wbGUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChhLCBiKQorICAgICAgICAgICAgYi5mcm9tZmlsZShmLCBsZW4oc2VsZi5leGFtcGxlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IGYuY2xvc2VkOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfdG9mcm9tbGlzdChzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDIqc2VsZi5leGFtcGxlKQorICAgICAgICBiID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLnRvbGlzdCwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYi5mcm9tbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiLmZyb21saXN0LCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiLmZyb21saXN0LCBbTm9uZV0pCisgICAgICAgIGIuZnJvbWxpc3QoYS50b2xpc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCisgICAgZGVmIHRlc3RfdG9mcm9tc3RyaW5nKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgMipzZWxmLmV4YW1wbGUpCisgICAgICAgIGIgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEudG9zdHJpbmcsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGIuZnJvbXN0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiLmZyb21zdHJpbmcsIDQyKQorICAgICAgICBiLmZyb21zdHJpbmcoYS50b3N0cmluZygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisgICAgICAgIGlmIGEuaXRlbXNpemU+MToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGIuZnJvbXN0cmluZywgIngiKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDIqc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGV2YWwocmVwcihhKSwgeyJhcnJheSI6IGFycmF5LmFycmF5fSkpCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhKSwgImFycmF5KCclcycpIiAlIHNlbGYudHlwZWNvZGUpCisKKyAgICBkZWYgdGVzdF9zdHIoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCAyKnNlbGYuZXhhbXBsZSkKKyAgICAgICAgc3RyKGEpCisKKyAgICBkZWYgdGVzdF9jbXAoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA9PSA0MikgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAhPSA0MikgaXMgVHJ1ZSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPT0gYSkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICE9IGEpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPCBhKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDw9IGEpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+IGEpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPj0gYSkgaXMgVHJ1ZSkKKworICAgICAgICBhbCA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuc21hbGxlcmV4YW1wbGUpCisgICAgICAgIGFiID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5iaWdnZXJleGFtcGxlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA9PSAyKmEpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gMiphKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPCAyKmEpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8PSAyKmEpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+IDIqYSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PSAyKmEpIGlzIEZhbHNlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA9PSBhbCkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAhPSBhbCkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDwgYWwpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPD0gYWwpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPiBhbCkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID49IGFsKSBpcyBUcnVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA9PSBhYikgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAhPSBhYikgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDwgYWIpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8PSBhYikgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID4gYWIpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPj0gYWIpIGlzIEZhbHNlKQorCisgICAgZGVmIHRlc3RfYWRkKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKSBcCisgICAgICAgICAgICArIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVs6Oi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUgKyBzZWxmLmV4YW1wbGVbOjotMV0pCisgICAgICAgICkKKworICAgICAgICBiID0gYXJyYXkuYXJyYXkoc2VsZi5iYWR0eXBlY29kZSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19hZGRfXywgYikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19hZGRfXywgImJhZCIpCisKKyAgICBkZWYgdGVzdF9pYWRkKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzo6LTFdKQorICAgICAgICBiID0gYQorICAgICAgICBhICs9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDIqc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVs6Oi0xXSsyKnNlbGYuZXhhbXBsZSkKKyAgICAgICAgKQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhICs9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUgKyBzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKworICAgICAgICBiID0gYXJyYXkuYXJyYXkoc2VsZi5iYWR0eXBlY29kZSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19hZGRfXywgYikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19pYWRkX18sICJiYWQiKQorCisgICAgZGVmIHRlc3RfbXVsKHNlbGYpOgorICAgICAgICBhID0gNSphcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgNSpzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKSo1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKjUpCisgICAgICAgICkKKworICAgICAgICBhID0gMCphcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgKQorCisgICAgICAgIGEgPSAoLTEpKmFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fbXVsX18sICJiYWQiKQorCisgICAgZGVmIHRlc3RfaW11bChzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYiA9IGEKKworICAgICAgICBhICo9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCA1KnNlbGYuZXhhbXBsZSkKKyAgICAgICAgKQorCisgICAgICAgIGEgKj0gMAorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpKQorCisgICAgICAgIGEgKj0gMTAwMAorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpKQorCisgICAgICAgIGEgKj0gLTEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKSkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhICo9IC0xCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9faW11bF9fLCAiYmFkIikKKworICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhWzBdLCBzZWxmLmV4YW1wbGVbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhWzBMXSwgc2VsZi5leGFtcGxlWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVudHJ5RXF1YWwoYVstMV0sIHNlbGYuZXhhbXBsZVstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhWy0xTF0sIHNlbGYuZXhhbXBsZVstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhW2xlbihzZWxmLmV4YW1wbGUpLTFdLCBzZWxmLmV4YW1wbGVbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVudHJ5RXF1YWwoYVstbGVuKHNlbGYuZXhhbXBsZSldLCBzZWxmLmV4YW1wbGVbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX2dldGl0ZW1fXykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5fX2dldGl0ZW1fXywgbGVuKHNlbGYuZXhhbXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEuX19nZXRpdGVtX18sIC1sZW4oc2VsZi5leGFtcGxlKS0xKQorCisgICAgZGVmIHRlc3Rfc2V0aXRlbShzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYVswXSA9IGFbLTFdCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhWzBdLCBhWy0xXSkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWzBMXSA9IGFbLTFdCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhWzBdLCBhWy0xXSkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWy0xXSA9IGFbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFbnRyeUVxdWFsKGFbMF0sIGFbLTFdKQorCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGFbLTFMXSA9IGFbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFbnRyeUVxdWFsKGFbMF0sIGFbLTFdKQorCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGFbbGVuKHNlbGYuZXhhbXBsZSktMV0gPSBhWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhWzBdLCBhWy0xXSkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWy1sZW4oc2VsZi5leGFtcGxlKV0gPSBhWy0xXQorICAgICAgICBzZWxmLmFzc2VydEVudHJ5RXF1YWwoYVswXSwgYVstMV0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fc2V0aXRlbV9fKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19zZXRpdGVtX18sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX3NldGl0ZW1fXywgMCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBJbmRleEVycm9yLAorICAgICAgICAgICAgYS5fX3NldGl0ZW1fXywKKyAgICAgICAgICAgIGxlbihzZWxmLmV4YW1wbGUpLCBzZWxmLmV4YW1wbGVbMF0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIEluZGV4RXJyb3IsCisgICAgICAgICAgICBhLl9fc2V0aXRlbV9fLAorICAgICAgICAgICAgLWxlbihzZWxmLmV4YW1wbGUpLTEsIHNlbGYuZXhhbXBsZVswXQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBkZWwgYVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVsxOl0pCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBkZWwgYVstMV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbOi0xXSkKKyAgICAgICAgKQorCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGRlbCBhW2xlbihzZWxmLmV4YW1wbGUpLTFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzotMV0pCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBkZWwgYVstbGVuKHNlbGYuZXhhbXBsZSldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzE6XSkKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX2RlbGl0ZW1fXykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fZGVsaXRlbV9fLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLl9fZGVsaXRlbV9fLCBsZW4oc2VsZi5leGFtcGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5fX2RlbGl0ZW1fXywgLWxlbihzZWxmLmV4YW1wbGUpLTEpCisKKyAgICBkZWYgdGVzdF9nZXRzbGljZShzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzpdLCBhKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhWzE6XSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVsxOl0pCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYVs6MV0sCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbOjFdKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGFbOi0xXSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVs6LTFdKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGFbLTE6XSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVstMTpdKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGFbLTE6LTFdLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhWzI6MV0sCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGFbMTAwMDpdLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTEwMDA6XSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzoxMDAwXSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGFbOi0xMDAwXSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xMDAwOjEwMDBdLCBhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYVsyMDAwOjEwMDBdLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfZXh0ZW5kZWRfZ2V0c2xpY2Uoc2VsZik6CisgICAgICAgICMgVGVzdCBleHRlbmRlZCBzbGljaW5nIGJ5IGNvbXBhcmluZyB3aXRoIGxpc3Qgc2xpY2luZworICAgICAgICAjIChBc3N1bWVzIGxpc3QgY29udmVyc2lvbiB3b3JrcyBjb3JyZWN0bHksIHRvbykKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgaW5kaWNlcyA9ICgwLCBOb25lLCAxLCAzLCAxOSwgMTAwLCAtMSwgLTIsIC0zMSwgLTEwMCkKKyAgICAgICAgZm9yIHN0YXJ0IGluIGluZGljZXM6CisgICAgICAgICAgICBmb3Igc3RvcCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgICAgICMgRXZlcnl0aGluZyBleGNlcHQgdGhlIGluaXRpYWwgMCAoaW52YWxpZCBzdGVwKQorICAgICAgICAgICAgICAgIGZvciBzdGVwIGluIGluZGljZXNbMTpdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYVtzdGFydDpzdG9wOnN0ZXBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KGEpW3N0YXJ0OnN0b3A6c3RlcF0pCisKKyAgICBkZWYgdGVzdF9zZXRzbGljZShzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYVs6MV0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlICsgc2VsZi5leGFtcGxlWzE6XSkKKyAgICAgICAgKQorCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGFbOi0xXSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUgKyBzZWxmLmV4YW1wbGVbLTE6XSkKKyAgICAgICAgKQorCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGFbLTE6XSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbOi0xXSArIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgKQorCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGFbMTpdID0gYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVs6MV0gKyBzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWzE6LTFdID0gYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KAorICAgICAgICAgICAgICAgIHNlbGYudHlwZWNvZGUsCisgICAgICAgICAgICAgICAgc2VsZi5leGFtcGxlWzoxXSArIHNlbGYuZXhhbXBsZSArIHNlbGYuZXhhbXBsZVstMTpdCisgICAgICAgICAgICApCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWzEwMDA6XSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCAyKnNlbGYuZXhhbXBsZSkKKyAgICAgICAgKQorCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGFbLTEwMDA6XSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWzoxMDAwXSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWzotMTAwMF0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgMipzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWzE6MF0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzoxXSArIHNlbGYuZXhhbXBsZSArIHNlbGYuZXhhbXBsZVsxOl0pCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWzIwMDA6MTAwMF0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgMipzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19zZXRzbGljZV9fLCAwLCAwLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19zZXRpdGVtX18sIHNsaWNlKDAsIDApLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19zZXRpdGVtX18sIHNsaWNlKDAsIDEpLCBOb25lKQorCisgICAgICAgIGIgPSBhcnJheS5hcnJheShzZWxmLmJhZHR5cGVjb2RlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX3NldHNsaWNlX18sIDAsIDAsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX3NldGl0ZW1fXywgc2xpY2UoMCwgMCksIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX3NldGl0ZW1fXywgc2xpY2UoMCwgMSksIGIpCisKKyAgICBkZWYgdGVzdF9leHRlbmRlZF9zZXRfZGVsX3NsaWNlKHNlbGYpOgorICAgICAgICBpbmRpY2VzID0gKDAsIE5vbmUsIDEsIDMsIDE5LCAxMDAsIC0xLCAtMiwgLTMxLCAtMTAwKQorICAgICAgICBmb3Igc3RhcnQgaW4gaW5kaWNlczoKKyAgICAgICAgICAgIGZvciBzdG9wIGluIGluZGljZXM6CisgICAgICAgICAgICAgICAgIyBFdmVyeXRoaW5nIGV4Y2VwdCB0aGUgaW5pdGlhbCAwIChpbnZhbGlkIHN0ZXApCisgICAgICAgICAgICAgICAgZm9yIHN0ZXAgaW4gaW5kaWNlc1sxOl06CisgICAgICAgICAgICAgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgICAgICAgICAgICAgIEwgPSBsaXN0KGEpCisgICAgICAgICAgICAgICAgICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYSBzbGljZSBvZiBleGFjdGx5IHRoZSByaWdodCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICMgYnV0IHdpdGggKGhvcGVmdWxseSkgZGlmZmVyZW50IGRhdGEuCisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBMW3N0YXJ0OnN0b3A6c3RlcF0KKyAgICAgICAgICAgICAgICAgICAgZGF0YS5yZXZlcnNlKCkKKyAgICAgICAgICAgICAgICAgICAgTFtzdGFydDpzdG9wOnN0ZXBdID0gZGF0YQorICAgICAgICAgICAgICAgICAgICBhW3N0YXJ0OnN0b3A6c3RlcF0gPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBkYXRhKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIEwpKQorCisgICAgICAgICAgICAgICAgICAgIGRlbCBMW3N0YXJ0OnN0b3A6c3RlcF0KKyAgICAgICAgICAgICAgICAgICAgZGVsIGFbc3RhcnQ6c3RvcDpzdGVwXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIEwpKQorCisgICAgZGVmIHRlc3RfaW5kZXgoc2VsZik6CisgICAgICAgIGV4YW1wbGUgPSAyKnNlbGYuZXhhbXBsZQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmluZGV4KQorICAgICAgICBmb3IgeCBpbiBleGFtcGxlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmluZGV4KHgpLCBleGFtcGxlLmluZGV4KHgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLmluZGV4LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLmluZGV4LCBzZWxmLm91dHNpZGUpCisKKyAgICBkZWYgdGVzdF9jb3VudChzZWxmKToKKyAgICAgICAgZXhhbXBsZSA9IDIqc2VsZi5leGFtcGxlCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBleGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuY291bnQpCisgICAgICAgIGZvciB4IGluIGV4YW1wbGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuY291bnQoeCksIGV4YW1wbGUuY291bnQoeCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5jb3VudChzZWxmLm91dHNpZGUpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuY291bnQoTm9uZSksIDApCisKKyAgICBkZWYgdGVzdF9yZW1vdmUoc2VsZik6CisgICAgICAgIGZvciB4IGluIHNlbGYuZXhhbXBsZToKKyAgICAgICAgICAgIGV4YW1wbGUgPSAyKnNlbGYuZXhhbXBsZQorICAgICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIGV4YW1wbGUpCisgICAgICAgICAgICBwb3MgPSBleGFtcGxlLmluZGV4KHgpCisgICAgICAgICAgICBleGFtcGxlMiA9IGV4YW1wbGVbOnBvc10gKyBleGFtcGxlW3BvcysxOl0KKyAgICAgICAgICAgIGEucmVtb3ZlKHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIGV4YW1wbGUyKSkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLnJlbW92ZSwgc2VsZi5vdXRzaWRlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEucmVtb3ZlLCBOb25lKQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5wb3ApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDIqc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEucG9wLCA0MiwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5wb3AsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEucG9wLCBsZW4oYSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEucG9wLCAtbGVuKGEpLTEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFbnRyeUVxdWFsKGEucG9wKDApLCBzZWxmLmV4YW1wbGVbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzE6XStzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFbnRyeUVxdWFsKGEucG9wKDEpLCBzZWxmLmV4YW1wbGVbMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzE6Ml0rc2VsZi5leGFtcGxlWzM6XStzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFbnRyeUVxdWFsKGEucG9wKDApLCBzZWxmLmV4YW1wbGVbMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhLnBvcCgpLCBzZWxmLmV4YW1wbGVbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVszOl0rc2VsZi5leGFtcGxlWzotMV0pCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X3JldmVyc2Uoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5yZXZlcnNlLCA0MikKKyAgICAgICAgYS5yZXZlcnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbOjotMV0pCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2V4dGVuZChzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmV4dGVuZCkKKyAgICAgICAgYS5leHRlbmQoYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzo6LTFdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUrc2VsZi5leGFtcGxlWzo6LTFdKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYS5leHRlbmQoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUrc2VsZi5leGFtcGxlKQorICAgICAgICApCisKKyAgICAgICAgYiA9IGFycmF5LmFycmF5KHNlbGYuYmFkdHlwZWNvZGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmV4dGVuZCwgYikKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhLmV4dGVuZChzZWxmLmV4YW1wbGVbOjotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlK3NlbGYuZXhhbXBsZVs6Oi0xXSkKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Jfd2l0aF9pdGVyYWJsZV9hcmd1bWVudChzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIGl0ZXIoc2VsZi5leGFtcGxlKSkKKyAgICAgICAgYiA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCisgICAgICAgICMgbm9uLWl0ZXJhYmxlIGFyZ3VtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYXJyYXkuYXJyYXksIHNlbGYudHlwZWNvZGUsIDEwKQorCisgICAgICAgICMgcGFzcyB0aHJvdWdoIGVycm9ycyByYWlzZWQgaW4gX19pdGVyX18KKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBhcnJheS5hcnJheSwgc2VsZi50eXBlY29kZSwgQSgpKQorCisgICAgICAgICMgcGFzcyB0aHJvdWdoIGVycm9ycyByYWlzZWQgaW4gbmV4dCgpCisgICAgICAgIGRlZiBCKCk6CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IKKyAgICAgICAgICAgIHlpZWxkIE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBhcnJheS5hcnJheSwgc2VsZi50eXBlY29kZSwgQigpKQorCisgICAgZGVmIHRlc3RfY292ZXJpdGVydHJhdmVyc2Uoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBnYworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgIGwgPSBbaXRlcihhKV0KKyAgICAgICAgbC5hcHBlbmQobCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICBkZWYgdGVzdF9idWZmZXIoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIGIgPSBidWZmZXIoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzBdLCBhLnRvc3RyaW5nKClbMF0pCisKKyAgICBkZWYgdGVzdF93ZWFrcmVmKHNlbGYpOgorICAgICAgICBzID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBwID0gcHJveHkocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnRvc3RyaW5nKCksIHMudG9zdHJpbmcoKSkKKyAgICAgICAgcyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUmVmZXJlbmNlRXJyb3IsIGxlbiwgcCkKKworICAgIGRlZiB0ZXN0X2J1Z183ODIzNjkoc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaWYgaGFzYXR0cihzeXMsICJnZXRyZWZjb3VudCIpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgICAgIGIgPSBhcnJheS5hcnJheSgnQicsIHJhbmdlKDY0KSkKKyAgICAgICAgICAgIHJjID0gc3lzLmdldHJlZmNvdW50KDEwKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgICAgIGIgPSBhcnJheS5hcnJheSgnQicsIHJhbmdlKDY0KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIHN5cy5nZXRyZWZjb3VudCgxMCkpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc193aXRoX2t3YXJncyhzZWxmKToKKyAgICAgICAgIyBTRiBidWcgIzE0ODY2NjMgLS0gdGhpcyB1c2VkIHRvIGVycm9uZW91c2x5IHJhaXNlIGEgVHlwZUVycm9yCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAnJywgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgQXJyYXlTdWJjbGFzc1dpdGhLd2FyZ3MoJ2InLCBuZXdhcmc9MSkKKworCitjbGFzcyBTdHJpbmdUZXN0KEJhc2VUZXN0KToKKworICAgIGRlZiB0ZXN0X3NldGl0ZW0oc2VsZik6CisgICAgICAgIHN1cGVyKFN0cmluZ1Rlc3QsIHNlbGYpLnRlc3Rfc2V0aXRlbSgpCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX3NldGl0ZW1fXywgMCwgc2VsZi5leGFtcGxlWzoyXSkKKworY2xhc3MgQ2hhcmFjdGVyVGVzdChTdHJpbmdUZXN0KToKKyAgICB0eXBlY29kZSA9ICdjJworICAgIGV4YW1wbGUgPSAnXHgwMWF6QVpceDAwXHhmZScKKyAgICBzbWFsbGVyZXhhbXBsZSA9ICdceDAxYXpBWVx4MDBceGZlJworICAgIGJpZ2dlcmV4YW1wbGUgPSAnXHgwMWF6QVpceDAwXHhmZicKKyAgICBvdXRzaWRlID0gJ1x4MzMnCisgICAgbWluaXRlbXNpemUgPSAxCisKKyAgICBkZWYgdGVzdF9zdWJiY2xhc3Npbmcoc2VsZik6CisgICAgICAgIGNsYXNzIEVkaXRhYmxlU3RyaW5nKGFycmF5LmFycmF5KToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgcywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkuYXJyYXkuX19uZXdfXyhjbHMsICdjJywgcykKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHMsIGNvbG9yPSdibHVlJyk6CisgICAgICAgICAgICAgICAgc2VsZi5jb2xvciA9IGNvbG9yCisKKyAgICAgICAgICAgIGRlZiBzdHJpcChzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmWzpdID0gYXJyYXkuYXJyYXkoJ2MnLCBzZWxmLnRvc3RyaW5nKCkuc3RyaXAoKSkKKworICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAnRWRpdGFibGVTdHJpbmcoJXIpJyAlIHNlbGYudG9zdHJpbmcoKQorCisgICAgICAgIHMgPSBFZGl0YWJsZVN0cmluZygiXHR0ZXN0XHJcbiIpCisgICAgICAgIHMuc3RyaXAoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudG9zdHJpbmcoKSwgInRlc3QiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb2xvciwgImJsdWUiKQorICAgICAgICBzLmNvbG9yID0gInJlZCIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvbG9yLCAicmVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLl9fZGljdF9fLmtleXMoKSwgWyJjb2xvciJdKQorCisgICAgZGVmIHRlc3Rfbm91bmljb2RlKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLmZyb211bmljb2RlLCB1bmljb2RlKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS50b3VuaWNvZGUpCisKK3Rlc3RzLmFwcGVuZChDaGFyYWN0ZXJUZXN0KQorCitpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgIGNsYXNzIFVuaWNvZGVUZXN0KFN0cmluZ1Rlc3QpOgorICAgICAgICB0eXBlY29kZSA9ICd1JworICAgICAgICBleGFtcGxlID0gdW5pY29kZShyJ1x4MDFcdTI2M2FceDAwXHVmZWZmJywgJ3VuaWNvZGUtZXNjYXBlJykKKyAgICAgICAgc21hbGxlcmV4YW1wbGUgPSB1bmljb2RlKHInXHgwMVx1MjYzYVx4MDBcdWZlZmUnLCAndW5pY29kZS1lc2NhcGUnKQorICAgICAgICBiaWdnZXJleGFtcGxlID0gdW5pY29kZShyJ1x4MDFcdTI2M2FceDAxXHVmZWZmJywgJ3VuaWNvZGUtZXNjYXBlJykKKyAgICAgICAgb3V0c2lkZSA9IHVuaWNvZGUoJ1x4MzMnKQorICAgICAgICBtaW5pdGVtc2l6ZSA9IDIKKworICAgICAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhcnJheS5hcnJheSwgJ2InLCB1bmljb2RlKCdmb28nLCAnYXNjaWknKSkKKworICAgICAgICAgICAgYSA9IGFycmF5LmFycmF5KCd1JywgdW5pY29kZShyJ1x4YTBceGMyXHUxMjM0JywgJ3VuaWNvZGUtZXNjYXBlJykpCisgICAgICAgICAgICBhLmZyb211bmljb2RlKHVuaWNvZGUoJyAnLCAnYXNjaWknKSkKKyAgICAgICAgICAgIGEuZnJvbXVuaWNvZGUodW5pY29kZSgnJywgJ2FzY2lpJykpCisgICAgICAgICAgICBhLmZyb211bmljb2RlKHVuaWNvZGUoJycsICdhc2NpaScpKQorICAgICAgICAgICAgYS5mcm9tdW5pY29kZSh1bmljb2RlKHInXHgxMWFiY1x4ZmZcdTEyMzQnLCAndW5pY29kZS1lc2NhcGUnKSkKKyAgICAgICAgICAgIHMgPSBhLnRvdW5pY29kZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIHMsCisgICAgICAgICAgICAgICAgdW5pY29kZShyJ1x4YTBceGMyXHUxMjM0IFx4MTFhYmNceGZmXHUxMjM0JywgJ3VuaWNvZGUtZXNjYXBlJykKKyAgICAgICAgICAgICkKKworICAgICAgICAgICAgcyA9IHVuaWNvZGUocidceDAwPSJcJ2FcXGJceDgwXHhmZlx1MDAwMFx1MDAwMVx1MTIzNCcsICd1bmljb2RlLWVzY2FwZScpCisgICAgICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ3UnLCBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICByZXByKGEpLAorICAgICAgICAgICAgICAgIHIiIiJhcnJheSgndScsIHUnXHgwMD0iXCdhXFxiXHg4MFx4ZmZceDAwXHgwMVx1MTIzNCcpIiIiCisgICAgICAgICAgICApCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5mcm9tdW5pY29kZSkKKworICAgIHRlc3RzLmFwcGVuZChVbmljb2RlVGVzdCkKKworY2xhc3MgTnVtYmVyVGVzdChCYXNlVGVzdCk6CisKKyAgICBkZWYgdGVzdF9leHRzbGljZShzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHJhbmdlKDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjpdLCBhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjoyXSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgWzAsMiw0XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxOjoyXSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgWzEsM10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjotMV0sIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIFs0LDMsMiwxLDBdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6LTJdLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBbNCwyLDBdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzM6Oi0yXSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgWzMsMV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTEwMDoxMDA6XSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzEwMDotMTAwOi0xXSwgYVs6Oi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xMDBMOjEwMEw6MkxdLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBbMCwyLDRdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzEwMDA6MjAwMDoyXSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgW10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTEwMDA6LTIwMDA6LTJdLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBbXSkpCisKKyAgICBkZWYgdGVzdF9kZWxzbGljZShzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHJhbmdlKDUpKQorICAgICAgICBkZWwgYVs6OjJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgWzEsM10pKQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgcmFuZ2UoNSkpCisgICAgICAgIGRlbCBhWzE6OjJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgWzAsMiw0XSkpCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCByYW5nZSg1KSkKKyAgICAgICAgZGVsIGFbMTo6LTJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgWzAsMiwzLDRdKSkKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHJhbmdlKDEwKSkKKyAgICAgICAgZGVsIGFbOjoxMDAwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIFsxLDIsMyw0LDUsNiw3LDgsOV0pKQorICAgICAgICAjIHRlc3QgaXNzdWU3Nzg4CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCByYW5nZSgxMCkpCisgICAgICAgIGRlbCBhWzk6OjE8PDMzM10KKworICAgIGRlZiB0ZXN0X2Fzc2lnbm1lbnQoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCByYW5nZSgxMCkpCisgICAgICAgIGFbOjoyXSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIFs0Ml0qNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBbNDIsIDEsIDQyLCAzLCA0MiwgNSwgNDIsIDcsIDQyLCA5XSkpCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCByYW5nZSgxMCkpCisgICAgICAgIGFbOjotNF0gPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBbMTBdKjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgWzAsIDEwLCAyLCAzLCA0LCAxMCwgNiwgNywgOCAsMTBdKSkKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHJhbmdlKDQpKQorICAgICAgICBhWzo6LTFdID0gYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIFszLCAyLCAxLCAwXSkpCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCByYW5nZSgxMCkpCisgICAgICAgIGIgPSBhWzpdCisgICAgICAgIGMgPSBhWzpdCisgICAgICAgIGlucyA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHJhbmdlKDIpKQorICAgICAgICBhWzI6M10gPSBpbnMKKyAgICAgICAgYltzbGljZSgyLDMpXSA9IGlucworICAgICAgICBjWzI6MzpdID0gaW5zCisKKyAgICBkZWYgdGVzdF9pdGVyYXRpb25jb250YWlucyhzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHJhbmdlKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGEpLCByYW5nZSgxMCkpCisgICAgICAgIGIgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBbMjBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTFdIGluIGEsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlswXSBub3QgaW4gYSwgVHJ1ZSkKKworICAgIGRlZiBjaGVja19vdmVyZmxvdyhzZWxmLCBsb3dlciwgdXBwZXIpOgorICAgICAgICAjIG1ldGhvZCB0byBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMKKworICAgICAgICAjIHNob3VsZCBub3Qgb3ZlcmZsb3cgYXNzaWduaW5nIGxvd2VyIGxpbWl0CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBbbG93ZXJdKQorICAgICAgICBhWzBdID0gbG93ZXIKKyAgICAgICAgIyBzaG91bGQgb3ZlcmZsb3cgYXNzaWduaW5nIGxlc3MgdGhhbiBsb3dlciBsaW1pdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBhcnJheS5hcnJheSwgc2VsZi50eXBlY29kZSwgW2xvd2VyLTFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBhLl9fc2V0aXRlbV9fLCAwLCBsb3dlci0xKQorICAgICAgICAjIHNob3VsZCBub3Qgb3ZlcmZsb3cgYXNzaWduaW5nIHVwcGVyIGxpbWl0CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBbdXBwZXJdKQorICAgICAgICBhWzBdID0gdXBwZXIKKyAgICAgICAgIyBzaG91bGQgb3ZlcmZsb3cgYXNzaWduaW5nIG1vcmUgdGhhbiB1cHBlciBsaW1pdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBhcnJheS5hcnJheSwgc2VsZi50eXBlY29kZSwgW3VwcGVyKzFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBhLl9fc2V0aXRlbV9fLCAwLCB1cHBlcisxKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3Npbmcoc2VsZik6CisgICAgICAgIHR5cGVjb2RlID0gc2VsZi50eXBlY29kZQorICAgICAgICBjbGFzcyBFeGFnZ2VyYXRpbmdBcnJheShhcnJheS5hcnJheSk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbJ29mZnNldCddCisKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgdHlwZWNvZGUsIGRhdGEsIG9mZnNldCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5LmFycmF5Ll9fbmV3X18oY2xzLCB0eXBlY29kZSwgZGF0YSkKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVjb2RlLCBkYXRhLCBvZmZzZXQpOgorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ID0gb2Zmc2V0CisKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkuYXJyYXkuX19nZXRpdGVtX18oc2VsZiwgaSkgKyBzZWxmLm9mZnNldAorCisgICAgICAgIGEgPSBFeGFnZ2VyYXRpbmdBcnJheShzZWxmLnR5cGVjb2RlLCBbMywgNiwgNywgMTFdLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVudHJ5RXF1YWwoYVswXSwgNykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgYSwgImNvbG9yIiwgImJsdWUiKQorCitjbGFzcyBTaWduZWROdW1iZXJUZXN0KE51bWJlclRlc3QpOgorICAgIGV4YW1wbGUgPSBbLTEsIDAsIDEsIDQyLCAweDdmXQorICAgIHNtYWxsZXJleGFtcGxlID0gWy0xLCAwLCAxLCA0MiwgMHg3ZV0KKyAgICBiaWdnZXJleGFtcGxlID0gWy0xLCAwLCAxLCA0MywgMHg3Zl0KKyAgICBvdXRzaWRlID0gMjMKKworICAgIGRlZiB0ZXN0X292ZXJmbG93KHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgbG93ZXIgPSAtMSAqIGxvbmcocG93KDIsIGEuaXRlbXNpemUgKiA4IC0gMSkpCisgICAgICAgIHVwcGVyID0gbG9uZyhwb3coMiwgYS5pdGVtc2l6ZSAqIDggLSAxKSkgLSAxTAorICAgICAgICBzZWxmLmNoZWNrX292ZXJmbG93KGxvd2VyLCB1cHBlcikKKworY2xhc3MgVW5zaWduZWROdW1iZXJUZXN0KE51bWJlclRlc3QpOgorICAgIGV4YW1wbGUgPSBbMCwgMSwgMTcsIDIzLCA0MiwgMHhmZl0KKyAgICBzbWFsbGVyZXhhbXBsZSA9IFswLCAxLCAxNywgMjMsIDQyLCAweGZlXQorICAgIGJpZ2dlcmV4YW1wbGUgPSBbMCwgMSwgMTcsIDIzLCA0MywgMHhmZl0KKyAgICBvdXRzaWRlID0gMHhhYQorCisgICAgZGVmIHRlc3Rfb3ZlcmZsb3coc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKQorICAgICAgICBsb3dlciA9IDAKKyAgICAgICAgdXBwZXIgPSBsb25nKHBvdygyLCBhLml0ZW1zaXplICogOCkpIC0gMUwKKyAgICAgICAgc2VsZi5jaGVja19vdmVyZmxvdyhsb3dlciwgdXBwZXIpCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3NpemVvZl93aXRoX2J1ZmZlcihzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYmFzZXNpemUgPSB0ZXN0X3N1cHBvcnQuY2FsY3ZvYmpzaXplKCc0UCcpCisgICAgICAgIGJ1ZmZlcl9zaXplID0gYS5idWZmZXJfaW5mbygpWzFdICogYS5pdGVtc2l6ZQorICAgICAgICB0ZXN0X3N1cHBvcnQuY2hlY2tfc2l6ZW9mKHNlbGYsIGEsIGJhc2VzaXplICsgYnVmZmVyX3NpemUpCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3NpemVvZl93aXRob3V0X2J1ZmZlcihzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgIGJhc2VzaXplID0gdGVzdF9zdXBwb3J0LmNhbGN2b2Jqc2l6ZSgnNFAnKQorICAgICAgICB0ZXN0X3N1cHBvcnQuY2hlY2tfc2l6ZW9mKHNlbGYsIGEsIGJhc2VzaXplKQorCisKK2NsYXNzIEJ5dGVUZXN0KFNpZ25lZE51bWJlclRlc3QpOgorICAgIHR5cGVjb2RlID0gJ2InCisgICAgbWluaXRlbXNpemUgPSAxCit0ZXN0cy5hcHBlbmQoQnl0ZVRlc3QpCisKK2NsYXNzIFVuc2lnbmVkQnl0ZVRlc3QoVW5zaWduZWROdW1iZXJUZXN0KToKKyAgICB0eXBlY29kZSA9ICdCJworICAgIG1pbml0ZW1zaXplID0gMQordGVzdHMuYXBwZW5kKFVuc2lnbmVkQnl0ZVRlc3QpCisKK2NsYXNzIFNob3J0VGVzdChTaWduZWROdW1iZXJUZXN0KToKKyAgICB0eXBlY29kZSA9ICdoJworICAgIG1pbml0ZW1zaXplID0gMgordGVzdHMuYXBwZW5kKFNob3J0VGVzdCkKKworY2xhc3MgVW5zaWduZWRTaG9ydFRlc3QoVW5zaWduZWROdW1iZXJUZXN0KToKKyAgICB0eXBlY29kZSA9ICdIJworICAgIG1pbml0ZW1zaXplID0gMgordGVzdHMuYXBwZW5kKFVuc2lnbmVkU2hvcnRUZXN0KQorCitjbGFzcyBJbnRUZXN0KFNpZ25lZE51bWJlclRlc3QpOgorICAgIHR5cGVjb2RlID0gJ2knCisgICAgbWluaXRlbXNpemUgPSAyCit0ZXN0cy5hcHBlbmQoSW50VGVzdCkKKworY2xhc3MgVW5zaWduZWRJbnRUZXN0KFVuc2lnbmVkTnVtYmVyVGVzdCk6CisgICAgdHlwZWNvZGUgPSAnSScKKyAgICBtaW5pdGVtc2l6ZSA9IDIKK3Rlc3RzLmFwcGVuZChVbnNpZ25lZEludFRlc3QpCisKK2NsYXNzIExvbmdUZXN0KFNpZ25lZE51bWJlclRlc3QpOgorICAgIHR5cGVjb2RlID0gJ2wnCisgICAgbWluaXRlbXNpemUgPSA0Cit0ZXN0cy5hcHBlbmQoTG9uZ1Rlc3QpCisKK2NsYXNzIFVuc2lnbmVkTG9uZ1Rlc3QoVW5zaWduZWROdW1iZXJUZXN0KToKKyAgICB0eXBlY29kZSA9ICdMJworICAgIG1pbml0ZW1zaXplID0gNAordGVzdHMuYXBwZW5kKFVuc2lnbmVkTG9uZ1Rlc3QpCisKK2NsYXNzIEZQVGVzdChOdW1iZXJUZXN0KToKKyAgICBleGFtcGxlID0gWy00Mi4wLCAwLCA0MiwgMWU1LCAtMWUxMF0KKyAgICBzbWFsbGVyZXhhbXBsZSA9IFstNDIuMCwgMCwgNDIsIDFlNSwgLTJlMTBdCisgICAgYmlnZ2VyZXhhbXBsZSA9IFstNDIuMCwgMCwgNDIsIDFlNSwgMWUxMF0KKyAgICBvdXRzaWRlID0gMjMKKworICAgIGRlZiBhc3NlcnRFbnRyeUVxdWFsKHNlbGYsIGVudHJ5MSwgZW50cnkyKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChlbnRyeTEsIGVudHJ5MikKKworICAgIGRlZiB0ZXN0X2J5dGVzd2FwKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuYnl0ZXN3YXAsIDQyKQorICAgICAgICBpZiBhLml0ZW1zaXplIGluICgxLCAyLCA0LCA4KToKKyAgICAgICAgICAgIGIgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgICAgICBiLmJ5dGVzd2FwKCkKKyAgICAgICAgICAgIGlmIGEuaXRlbXNpemU9PTE6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIE9uIGFscGhhcyB0cmVhdGluZyB0aGUgYnl0ZSBzd2FwcGVkIGJpdCBwYXR0ZXJzIGFzCisgICAgICAgICAgICAgICAgIyBmbG9hdHMvZG91YmxlcyByZXN1bHRzIGluIGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbnMKKyAgICAgICAgICAgICAgICAjID0+IGNvbXBhcmUgdGhlIDhiaXQgc3RyaW5nIHZhbHVlcyBpbnN0ZWFkCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChhLnRvc3RyaW5nKCksIGIudG9zdHJpbmcoKSkKKyAgICAgICAgICAgIGIuYnl0ZXN3YXAoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCitjbGFzcyBGbG9hdFRlc3QoRlBUZXN0KToKKyAgICB0eXBlY29kZSA9ICdmJworICAgIG1pbml0ZW1zaXplID0gNAordGVzdHMuYXBwZW5kKEZsb2F0VGVzdCkKKworY2xhc3MgRG91YmxlVGVzdChGUFRlc3QpOgorICAgIHR5cGVjb2RlID0gJ2QnCisgICAgbWluaXRlbXNpemUgPSA4CisKKyAgICBkZWYgdGVzdF9hbGxvY19vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IG1heHNpemUKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KCdkJywgWy0xXSo2NTUzNikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYSAqPSBtYXhzaXplLy82NTUzNiArIDEKKyAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJBcnJheSBvZiBzaXplID4gbWF4c2l6ZSBjcmVhdGVkIC0gTWVtb3J5RXJyb3IgZXhwZWN0ZWQiKQorICAgICAgICBiID0gYXJyYXkuYXJyYXkoJ2QnLCBbIDIuNzE4MjgxODMsIDMuMTQxNTkyNjUsIC0xXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYiAqIChtYXhzaXplLy8zICsgMSkKKyAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJBcnJheSBvZiBzaXplID4gbWF4c2l6ZSBjcmVhdGVkIC0gTWVtb3J5RXJyb3IgZXhwZWN0ZWQiKQorCit0ZXN0cy5hcHBlbmQoRG91YmxlVGVzdCkKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIGltcG9ydCBzeXMKKworICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorCisgICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCisgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgIGltcG9ydCBnYworICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBwcmludCBjb3VudHMKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJyYXkucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJyYXkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMzhlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hcnJheS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJyYXkucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJyYXkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMzhlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hcnJheS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXNjaWlfZm9ybWF0ZC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzY2lpX2Zvcm1hdGQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRhNjE2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzY2lpX2Zvcm1hdGQucHkKQEAgLTAsMCArMSw1OCBAQAorIyBQeU9TX2FzY2lpX2Zvcm1hdGQgaXMgZGVwcmVjYXRlZCBhbmQgbm90IGNhbGxlZCBmcm9tIGFueXdoZXJlIGluCisjICBQeXRob24gaXRzZWxmLiBTbyB0aGlzIG1vZHVsZSBpcyB0aGUgb25seSBwbGFjZSBpdCBnZXRzIHRlc3RlZC4KKyMgVGVzdCB0aGF0IGl0IHdvcmtzLCBhbmQgdGVzdCB0aGF0IGl0J3MgZGVwcmVjYXRlZC4KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjaGVja193YXJuaW5ncywgcnVuX3VuaXR0ZXN0LCBpbXBvcnRfbW9kdWxlCisKKyMgU2tpcCB0ZXN0cyBpZiBfY3R5cGVzIG1vZHVsZSBkb2VzIG5vdCBleGlzdAoraW1wb3J0X21vZHVsZSgnX2N0eXBlcycpCisKK2Zyb20gY3R5cGVzIGltcG9ydCBweXRob25hcGksIGNyZWF0ZV9zdHJpbmdfYnVmZmVyLCBzaXplb2YsIGJ5cmVmLCBjX2RvdWJsZQorUHlPU19hc2NpaV9mb3JtYXRkID0gcHl0aG9uYXBpLlB5T1NfYXNjaWlfZm9ybWF0ZAorCisKK2NsYXNzIEZvcm1hdERlcHJlY2F0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZm9ybWF0X2RlcHJlY2F0aW9uKHNlbGYpOgorICAgICAgICBidWYgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcignICcgKiAxMDApCisKKyAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygoJ1B5T1NfYXNjaWlfZm9ybWF0ZCBpcyBkZXByZWNhdGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICBQeU9TX2FzY2lpX2Zvcm1hdGQoYnlyZWYoYnVmKSwgc2l6ZW9mKGJ1ZiksICclKy4xMGYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfZG91YmxlKDEwLjApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICcrMTAuMDAwMDAwMDAwMCcpCisKKworY2xhc3MgRm9ybWF0VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgZW5zdXJlIHRoYXQsIGZvciB0aGUgcmVzdHJpY3RlZCBzZXQgb2YgZm9ybWF0IGNvZGVzLAorICAgICMgJS1mb3JtYXR0aW5nIHJldHVybnMgdGhlIHNhbWUgdmFsdWVzIG9zIFB5T1NfYXNjaWlfZm9ybWF0ZAorICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmKToKKyAgICAgICAgYnVmID0gY3JlYXRlX3N0cmluZ19idWZmZXIoJyAnICogMTAwKQorCisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgICAgKCclZicsIDEwMC4wKSwKKyAgICAgICAgICAgICgnJWcnLCAxMDAuMCksCisgICAgICAgICAgICAoJyUjZycsIDEwMC4wKSwKKyAgICAgICAgICAgICgnJSMuMmcnLCAxMDAuMCksCisgICAgICAgICAgICAoJyUjLjJnJywgMTIzLjQ1NjcpLAorICAgICAgICAgICAgKCclIy4yZycsIDEuMjM0NTY3ZTIwMCksCisgICAgICAgICAgICAoJyVlJywgMS4yMzQ1NjdlMjAwKSwKKyAgICAgICAgICAgICgnJWUnLCAxLjIzNCksCisgICAgICAgICAgICAoJyUrZScsIDEuMjM0KSwKKyAgICAgICAgICAgICgnJS1lJywgMS4yMzQpLAorICAgICAgICAgICAgXQorCisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCdQeU9TX2FzY2lpX2Zvcm1hdGQgaXMgZGVwcmVjYXRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgZm9yIGZvcm1hdCwgdmFsIGluIHRlc3RzOgorICAgICAgICAgICAgICAgIFB5T1NfYXNjaWlfZm9ybWF0ZChieXJlZihidWYpLCBzaXplb2YoYnVmKSwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2RvdWJsZSh2YWwpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCBmb3JtYXQgJSB2YWwpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChGb3JtYXREZXByZWNhdGlvblRlc3RzLCBGb3JtYXRUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXNjaWlfZm9ybWF0ZC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc2NpaV9mb3JtYXRkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWVkNzVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXNjaWlfZm9ybWF0ZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXNjaWlfZm9ybWF0ZC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc2NpaV9mb3JtYXRkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWVkNzVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXNjaWlfZm9ybWF0ZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODAxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc3QucHkKQEAgLTAsMCArMSw1ODAgQEAKK2ltcG9ydCBzeXMsIGl0ZXJ0b29scywgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgYXN0CisKK2RlZiB0b190dXBsZSh0KToKKyAgICBpZiB0IGlzIE5vbmUgb3IgaXNpbnN0YW5jZSh0LCAoYmFzZXN0cmluZywgaW50LCBsb25nLCBjb21wbGV4KSk6CisgICAgICAgIHJldHVybiB0CisgICAgZWxpZiBpc2luc3RhbmNlKHQsIGxpc3QpOgorICAgICAgICByZXR1cm4gW3RvX3R1cGxlKGUpIGZvciBlIGluIHRdCisgICAgcmVzdWx0ID0gW3QuX19jbGFzc19fLl9fbmFtZV9fXQorICAgIGlmIGhhc2F0dHIodCwgJ2xpbmVubycpIGFuZCBoYXNhdHRyKHQsICdjb2xfb2Zmc2V0Jyk6CisgICAgICAgIHJlc3VsdC5hcHBlbmQoKHQubGluZW5vLCB0LmNvbF9vZmZzZXQpKQorICAgIGlmIHQuX2ZpZWxkcyBpcyBOb25lOgorICAgICAgICByZXR1cm4gdHVwbGUocmVzdWx0KQorICAgIGZvciBmIGluIHQuX2ZpZWxkczoKKyAgICAgICAgcmVzdWx0LmFwcGVuZCh0b190dXBsZShnZXRhdHRyKHQsIGYpKSkKKyAgICByZXR1cm4gdHVwbGUocmVzdWx0KQorCisKKyMgVGhlc2UgdGVzdHMgYXJlIGNvbXBpbGVkIHRocm91Z2ggImV4ZWMiCisjIFRoZXJlIHNob3VsZCBiZSBhdGxlYXN0IG9uZSB0ZXN0IHBlciBzdGF0ZW1lbnQKK2V4ZWNfdGVzdHMgPSBbCisgICAgIyBOb25lCisgICAgIk5vbmUiLAorICAgICMgRnVuY3Rpb25EZWYKKyAgICAiZGVmIGYoKTogcGFzcyIsCisgICAgIyBGdW5jdGlvbkRlZiB3aXRoIGFyZworICAgICJkZWYgZihhKTogcGFzcyIsCisgICAgIyBGdW5jdGlvbkRlZiB3aXRoIGFyZyBhbmQgZGVmYXVsdCB2YWx1ZQorICAgICJkZWYgZihhPTApOiBwYXNzIiwKKyAgICAjIEZ1bmN0aW9uRGVmIHdpdGggdmFyYXJncworICAgICJkZWYgZigqYXJncyk6IHBhc3MiLAorICAgICMgRnVuY3Rpb25EZWYgd2l0aCBrd2FyZ3MKKyAgICAiZGVmIGYoKiprd2FyZ3MpOiBwYXNzIiwKKyAgICAjIEZ1bmN0aW9uRGVmIHdpdGggYWxsIGtpbmQgb2YgYXJncworICAgICJkZWYgZihhLCBiPTEsIGM9Tm9uZSwgZD1bXSwgZT17fSwgKmFyZ3MsICoqa3dhcmdzKTogcGFzcyIsCisgICAgIyBDbGFzc0RlZgorICAgICJjbGFzcyBDOnBhc3MiLAorICAgICMgQ2xhc3NEZWYsIG5ldyBzdHlsZSBjbGFzcworICAgICJjbGFzcyBDKG9iamVjdCk6IHBhc3MiLAorICAgICMgUmV0dXJuCisgICAgImRlZiBmKCk6cmV0dXJuIDEiLAorICAgICMgRGVsZXRlCisgICAgImRlbCB2IiwKKyAgICAjIEFzc2lnbgorICAgICJ2ID0gMSIsCisgICAgIyBBdWdBc3NpZ24KKyAgICAidiArPSAxIiwKKyAgICAjIFByaW50CisgICAgInByaW50ID4+ZiwgMSwgIiwKKyAgICAjIEZvcgorICAgICJmb3IgdiBpbiB2OnBhc3MiLAorICAgICMgV2hpbGUKKyAgICAid2hpbGUgdjpwYXNzIiwKKyAgICAjIElmCisgICAgImlmIHY6cGFzcyIsCisgICAgIyBSYWlzZQorICAgICJyYWlzZSBFeGNlcHRpb24sICdzdHJpbmcnIiwKKyAgICAjIFRyeUV4Y2VwdAorICAgICJ0cnk6XG4gIHBhc3NcbmV4Y2VwdCBFeGNlcHRpb246XG4gIHBhc3MiLAorICAgICMgVHJ5RmluYWxseQorICAgICJ0cnk6XG4gIHBhc3NcbmZpbmFsbHk6XG4gIHBhc3MiLAorICAgICMgQXNzZXJ0CisgICAgImFzc2VydCB2IiwKKyAgICAjIEltcG9ydAorICAgICJpbXBvcnQgc3lzIiwKKyAgICAjIEltcG9ydEZyb20KKyAgICAiZnJvbSBzeXMgaW1wb3J0IHYiLAorICAgICMgRXhlYworICAgICJleGVjICd2JyIsCisgICAgIyBHbG9iYWwKKyAgICAiZ2xvYmFsIHYiLAorICAgICMgRXhwcgorICAgICIxIiwKKyAgICAjIFBhc3MsCisgICAgInBhc3MiLAorICAgICMgQnJlYWsKKyAgICAiYnJlYWsiLAorICAgICMgQ29udGludWUKKyAgICAiY29udGludWUiLAorICAgICMgZm9yIHN0YXRlbWVudHMgd2l0aCBuYWtlZCB0dXBsZXMgKHNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNjcwNCkKKyAgICAiZm9yIGEsYiBpbiBjOiBwYXNzIiwKKyAgICAiWyhhLGIpIGZvciBhLGIgaW4gY10iLAorICAgICIoKGEsYikgZm9yIGEsYiBpbiBjKSIsCisgICAgIigoYSxiKSBmb3IgKGEsYikgaW4gYykiLAorICAgICMgTXVsdGlsaW5lIGdlbmVyYXRvciBleHByZXNzaW9uICh0ZXN0IGZvciAubGluZW5vICYgLmNvbF9vZmZzZXQpCisgICAgIiIiKAorICAgICgKKyAgICBBYQorICAgICwKKyAgICAgICBCYgorICAgICkKKyAgICBmb3IKKyAgICBBYQorICAgICwKKyAgICBCYiBpbiBDYworICAgICkiIiIsCisgICAgIyBkaWN0Y29tcAorICAgICJ7YSA6IGIgZm9yIHcgaW4geCBmb3IgbSBpbiBwIGlmIGd9IiwKKyAgICAjIGRpY3Rjb21wIHdpdGggbmFrZWQgdHVwbGUKKyAgICAie2EgOiBiIGZvciB2LHcgaW4geH0iLAorICAgICMgc2V0Y29tcAorICAgICJ7ciBmb3IgbCBpbiB4IGlmIGd9IiwKKyAgICAjIHNldGNvbXAgd2l0aCBuYWtlZCB0dXBsZQorICAgICJ7ciBmb3IgbCxtIGluIHh9IiwKK10KKworIyBUaGVzZSBhcmUgY29tcGlsZWQgdGhyb3VnaCAic2luZ2xlIgorIyBiZWNhdXNlIG9mIG92ZXJsYXAgd2l0aCAiZXZhbCIsIGl0IGp1c3QgdGVzdHMgd2hhdAorIyBjYW4ndCBiZSB0ZXN0ZWQgd2l0aCAiZXZhbCIKK3NpbmdsZV90ZXN0cyA9IFsKKyAgICAiMSsyIgorXQorCisjIFRoZXNlIGFyZSBjb21waWxlZCB0aHJvdWdoICJldmFsIgorIyBJdCBzaG91bGQgdGVzdCBhbGwgZXhwcmVzc2lvbnMKK2V2YWxfdGVzdHMgPSBbCisgICMgTm9uZQorICAiTm9uZSIsCisgICMgQm9vbE9wCisgICJhIGFuZCBiIiwKKyAgIyBCaW5PcAorICAiYSArIGIiLAorICAjIFVuYXJ5T3AKKyAgIm5vdCB2IiwKKyAgIyBMYW1iZGEKKyAgImxhbWJkYTpOb25lIiwKKyAgIyBEaWN0CisgICJ7IDE6MiB9IiwKKyAgIyBFbXB0eSBkaWN0CisgICJ7fSIsCisgICMgU2V0CisgICJ7Tm9uZSx9IiwKKyAgIyBNdWx0aWxpbmUgZGljdCAodGVzdCBmb3IgLmxpbmVubyAmIC5jb2xfb2Zmc2V0KQorICAiIiJ7CisgICAgICAxCisgICAgICAgIDoKKyAgICAgICAgICAyCisgICAgIH0iIiIsCisgICMgTGlzdENvbXAKKyAgIlthIGZvciBiIGluIGMgaWYgZF0iLAorICAjIEdlbmVyYXRvckV4cAorICAiKGEgZm9yIGIgaW4gYyBpZiBkKSIsCisgICMgWWllbGQgLSB5aWVsZCBleHByZXNzaW9ucyBjYW4ndCB3b3JrIG91dHNpZGUgYSBmdW5jdGlvbgorICAjCisgICMgQ29tcGFyZQorICAiMSA8IDIgPCAzIiwKKyAgIyBDYWxsCisgICJmKDEsMixjPTMsKmQsKiplKSIsCisgICMgUmVwcgorICAiYHZgIiwKKyAgIyBOdW0KKyAgIjEwTCIsCisgICMgU3RyCisgICInc3RyaW5nJyIsCisgICMgQXR0cmlidXRlCisgICJhLmIiLAorICAjIFN1YnNjcmlwdAorICAiYVtiOmNdIiwKKyAgIyBOYW1lCisgICJ2IiwKKyAgIyBMaXN0CisgICJbMSwyLDNdIiwKKyAgIyBFbXB0eSBsaXN0CisgICJbXSIsCisgICMgVHVwbGUKKyAgIjEsMiwzIiwKKyAgIyBUdXBsZQorICAiKDEsMiwzKSIsCisgICMgRW1wdHkgdHVwbGUKKyAgIigpIiwKKyAgIyBDb21iaW5hdGlvbgorICAiYS5iLmMuZChhLmJbMToyXSkiLAorCitdCisKKyMgVE9ETzogZXhwcl9jb250ZXh0LCBzbGljZSwgYm9vbG9wLCBvcGVyYXRvciwgdW5hcnlvcCwgY21wb3AsIGNvbXByZWhlbnNpb24KKyMgZXhjZXB0aGFuZGxlciwgYXJndW1lbnRzLCBrZXl3b3JkcywgYWxpYXMKKworY2xhc3MgQVNUX1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBfYXNzZXJ0VHJ1ZW9yZGVyKHNlbGYsIGFzdF9ub2RlLCBwYXJlbnRfcG9zKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYXN0X25vZGUsIGFzdC5BU1QpIG9yIGFzdF9ub2RlLl9maWVsZHMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBpc2luc3RhbmNlKGFzdF9ub2RlLCAoYXN0LmV4cHIsIGFzdC5zdG10LCBhc3QuZXhjZXB0aGFuZGxlcikpOgorICAgICAgICAgICAgbm9kZV9wb3MgPSAoYXN0X25vZGUubGluZW5vLCBhc3Rfbm9kZS5jb2xfb2Zmc2V0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vZGVfcG9zID49IHBhcmVudF9wb3MpCisgICAgICAgICAgICBwYXJlbnRfcG9zID0gKGFzdF9ub2RlLmxpbmVubywgYXN0X25vZGUuY29sX29mZnNldCkKKyAgICAgICAgZm9yIG5hbWUgaW4gYXN0X25vZGUuX2ZpZWxkczoKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihhc3Rfbm9kZSwgbmFtZSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGxpc3QpOgorICAgICAgICAgICAgICAgIGZvciBjaGlsZCBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0VHJ1ZW9yZGVyKGNoaWxkLCBwYXJlbnRfcG9zKQorICAgICAgICAgICAgZWxpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLl9hc3NlcnRUcnVlb3JkZXIodmFsdWUsIHBhcmVudF9wb3MpCisKKyAgICBkZWYgdGVzdF9BU1Rfb2JqZWN0cyhzZWxmKToKKyAgICAgICAgeCA9IGFzdC5BU1QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX2ZpZWxkcywgKCkpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICB4LnZhcmFyZworCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgeC5mb29iYXIgPSAyMQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgYXN0LkFTVChsaW5lbm89MikKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICAjICJfYXN0LkFTVCBjb25zdHJ1Y3RvciB0YWtlcyAwIHBvc2l0aW9uYWwgYXJndW1lbnRzIgorICAgICAgICAgICAgYXN0LkFTVCgyKQorCisgICAgZGVmIHRlc3Rfc25pcHBldHMoc2VsZik6CisgICAgICAgIGZvciBpbnB1dCwgb3V0cHV0LCBraW5kIGluICgoZXhlY190ZXN0cywgZXhlY19yZXN1bHRzLCAiZXhlYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpbmdsZV90ZXN0cywgc2luZ2xlX3Jlc3VsdHMsICJzaW5nbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmFsX3Rlc3RzLCBldmFsX3Jlc3VsdHMsICJldmFsIikpOgorICAgICAgICAgICAgZm9yIGksIG8gaW4gaXRlcnRvb2xzLml6aXAoaW5wdXQsIG91dHB1dCk6CisgICAgICAgICAgICAgICAgYXN0X3RyZWUgPSBjb21waWxlKGksICI/Iiwga2luZCwgYXN0LlB5Q0ZfT05MWV9BU1QpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0b190dXBsZShhc3RfdHJlZSksIG8pCisgICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0VHJ1ZW9yZGVyKGFzdF90cmVlLCAoMCwgMCkpCisKKyAgICBkZWYgdGVzdF9zbGljZShzZWxmKToKKyAgICAgICAgc2xjID0gYXN0LnBhcnNlKCJ4Wzo6XSIpLmJvZHlbMF0udmFsdWUuc2xpY2UKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2xjLnVwcGVyKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzbGMubG93ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzbGMuc3RlcCwgYXN0Lk5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xjLnN0ZXAuaWQsICJOb25lIikKKworICAgIGRlZiB0ZXN0X2Zyb21faW1wb3J0KHNlbGYpOgorICAgICAgICBpbSA9IGFzdC5wYXJzZSgiZnJvbSAuIGltcG9ydCB5IikuYm9keVswXQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShpbS5tb2R1bGUpCisKKyAgICBkZWYgdGVzdF9ub25faW50ZXJuZWRfZnV0dXJlX2Zyb21fYXN0KHNlbGYpOgorICAgICAgICBtb2QgPSBhc3QucGFyc2UoImZyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24iKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobW9kLmJvZHlbMF0sIGFzdC5JbXBvcnRGcm9tKQorICAgICAgICBtb2QuYm9keVswXS5tb2R1bGUgPSAiIF9fZnV0dXJlX18gIi5zdHJpcCgpCisgICAgICAgIGNvbXBpbGUobW9kLCAiPHRlc3Q+IiwgImV4ZWMiKQorCisgICAgZGVmIHRlc3RfYmFzZV9jbGFzc2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhhc3QuRm9yLCBhc3Quc3RtdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGFzdC5OYW1lLCBhc3QuZXhwcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGFzdC5zdG10LCBhc3QuQVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoYXN0LmV4cHIsIGFzdC5BU1QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhhc3QuY29tcHJlaGVuc2lvbiwgYXN0LkFTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGFzdC5HdCwgYXN0LkFTVCkpCisKKyAgICBkZWYgdGVzdF9maWVsZF9hdHRyX2V4aXN0ZW5jZShzZWxmKToKKyAgICAgICAgZm9yIG5hbWUsIGl0ZW0gaW4gYXN0Ll9fZGljdF9fLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCB0eXBlKSBhbmQgbmFtZSAhPSAnQVNUJyBhbmQgbmFtZVswXS5pc3VwcGVyKCk6CisgICAgICAgICAgICAgICAgeCA9IGl0ZW0oKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoeCwgYXN0LkFTVCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh4Ll9maWVsZHMpLCB0dXBsZSkKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50cyhzZWxmKToKKyAgICAgICAgeCA9IGFzdC5hcmd1bWVudHMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX2ZpZWxkcywgKCdhcmdzJywgJ3ZhcmFyZycsICdrd2FyZycsICdkZWZhdWx0cycpKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgeC52YXJhcmcKKworICAgICAgICB4ID0gYXN0LmFyZ3VtZW50cygxLCAyLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgudmFyYXJnLCAyKQorCisgICAgZGVmIHRlc3RfZmllbGRfYXR0cl93cml0YWJsZShzZWxmKToKKyAgICAgICAgeCA9IGFzdC5OdW0oKQorICAgICAgICAjIFdlIGNhbiBhc3NpZ24gdG8gX2ZpZWxkcworICAgICAgICB4Ll9maWVsZHMgPSA2NjYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9maWVsZHMsIDY2NikKKworICAgIGRlZiB0ZXN0X2NsYXNzYXR0cnMoc2VsZik6CisgICAgICAgIHggPSBhc3QuTnVtKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9maWVsZHMsICgnbicsKSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIHgubgorCisgICAgICAgIHggPSBhc3QuTnVtKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgubiwgNDIpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICB4LmxpbmVubworCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgeC5mb29iYXIKKworICAgICAgICB4ID0gYXN0Lk51bShsaW5lbm89MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmxpbmVubywgMikKKworICAgICAgICB4ID0gYXN0Lk51bSg0MiwgbGluZW5vPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5saW5lbm8sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fZmllbGRzLCAoJ24nLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5uLCA0MikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFzdC5OdW0sIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYXN0Lk51bSwgMSwgMiwgbGluZW5vPTApCisKKyAgICBkZWYgdGVzdF9tb2R1bGUoc2VsZik6CisgICAgICAgIGJvZHkgPSBbYXN0Lk51bSg0MildCisgICAgICAgIHggPSBhc3QuTW9kdWxlKGJvZHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5ib2R5LCBib2R5KQorCisgICAgZGVmIHRlc3Rfbm9kZWNsYXNzZXMoc2VsZik6CisgICAgICAgICMgWmVybyBhcmd1bWVudHMgY29uc3RydWN0b3IgZXhwbGljaXRlbHkgYWxsb3dlZAorICAgICAgICB4ID0gYXN0LkJpbk9wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9maWVsZHMsICgnbGVmdCcsICdvcCcsICdyaWdodCcpKQorCisgICAgICAgICMgUmFuZG9tIGF0dHJpYnV0ZSBhbGxvd2VkIHRvbworICAgICAgICB4LmZvb2JhcmJheiA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZvb2JhcmJheiwgNSkKKworICAgICAgICBuMSA9IGFzdC5OdW0oMSkKKyAgICAgICAgbjMgPSBhc3QuTnVtKDMpCisgICAgICAgIGFkZG9wID0gYXN0LkFkZCgpCisgICAgICAgIHggPSBhc3QuQmluT3AobjEsIGFkZG9wLCBuMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmxlZnQsIG4xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgub3AsIGFkZG9wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgucmlnaHQsIG4zKQorCisgICAgICAgIHggPSBhc3QuQmluT3AoMSwgMiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmxlZnQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5vcCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnJpZ2h0LCAzKQorCisgICAgICAgIHggPSBhc3QuQmluT3AoMSwgMiwgMywgbGluZW5vPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5sZWZ0LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgub3AsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5yaWdodCwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmxpbmVubywgMCkKKworICAgICAgICAjIG5vZGUgcmFpc2VzIGV4Y2VwdGlvbiB3aGVuIG5vdCBnaXZlbiBlbm91Z2ggYXJndW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYXN0LkJpbk9wLCAxLCAyKQorICAgICAgICAjIG5vZGUgcmFpc2VzIGV4Y2VwdGlvbiB3aGVuIGdpdmVuIHRvbyBtYW55IGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFzdC5CaW5PcCwgMSwgMiwgMywgNCkKKyAgICAgICAgIyBub2RlIHJhaXNlcyBleGNlcHRpb24gd2hlbiBub3QgZ2l2ZW4gZW5vdWdoIGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFzdC5CaW5PcCwgMSwgMiwgbGluZW5vPTApCisgICAgICAgICMgbm9kZSByYWlzZXMgZXhjZXB0aW9uIHdoZW4gZ2l2ZW4gdG9vIG1hbnkgYXJndW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYXN0LkJpbk9wLCAxLCAyLCAzLCA0LCBsaW5lbm89MCkKKworICAgICAgICAjIGNhbiBzZXQgYXR0cmlidXRlcyB0aHJvdWdoIGt3YXJncyB0b28KKyAgICAgICAgeCA9IGFzdC5CaW5PcChsZWZ0PTEsIG9wPTIsIHJpZ2h0PTMsIGxpbmVubz0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgubGVmdCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Lm9wLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgucmlnaHQsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5saW5lbm8sIDApCisKKyAgICAgICAgIyBSYW5kb20ga3dhcmdzIGFsc28gYWxsb3dlZAorICAgICAgICB4ID0gYXN0LkJpbk9wKDEsIDIsIDMsIGZvb2JhcmJhej00MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZvb2JhcmJheiwgNDIpCisKKyAgICBkZWYgdGVzdF9ub19maWVsZHMoc2VsZik6CisgICAgICAgICMgdGhpcyB1c2VkIHRvIGZhaWwgYmVjYXVzZSBTdWIuX2ZpZWxkcyB3YXMgTm9uZQorICAgICAgICB4ID0gYXN0LlN1YigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fZmllbGRzLCAoKSkKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIG1vZHMgPSBbcGlja2xlXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgY1BpY2tsZQorICAgICAgICAgICAgbW9kcy5hcHBlbmQoY1BpY2tsZSkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBwcm90b2NvbHMgPSBbMCwgMSwgMl0KKyAgICAgICAgZm9yIG1vZCBpbiBtb2RzOgorICAgICAgICAgICAgZm9yIHByb3RvY29sIGluIHByb3RvY29sczoKKyAgICAgICAgICAgICAgICBmb3IgYXN0IGluIChjb21waWxlKGksICI/IiwgImV4ZWMiLCAweDQwMCkgZm9yIGkgaW4gZXhlY190ZXN0cyk6CisgICAgICAgICAgICAgICAgICAgIGFzdDIgPSBtb2QubG9hZHMobW9kLmR1bXBzKGFzdCwgcHJvdG9jb2wpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRvX3R1cGxlKGFzdDIpLCB0b190dXBsZShhc3QpKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9pZGVudGl0aWZlcihzZWxmKToKKyAgICAgICAgbSA9IGFzdC5Nb2R1bGUoW2FzdC5FeHByKGFzdC5OYW1lKHUieCIsIGFzdC5Mb2FkKCkpKV0pCisgICAgICAgIGFzdC5maXhfbWlzc2luZ19sb2NhdGlvbnMobSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgY29tcGlsZShtLCAiPHRlc3Q+IiwgImV4ZWMiKQorICAgICAgICBzZWxmLmFzc2VydEluKCJpZGVudGlmaWVyIG11c3QgYmUgb2YgdHlwZSBzdHIiLCBzdHIoY20uZXhjZXB0aW9uKSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfc3RyaW5nKHNlbGYpOgorICAgICAgICBtID0gYXN0Lk1vZHVsZShbYXN0LkV4cHIoYXN0LlN0cig0MykpXSkKKyAgICAgICAgYXN0LmZpeF9taXNzaW5nX2xvY2F0aW9ucyhtKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcikgYXMgY206CisgICAgICAgICAgICBjb21waWxlKG0sICI8dGVzdD4iLCAiZXhlYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oInN0cmluZyBtdXN0IGJlIG9mIHR5cGUgc3RyIG9yIHVuaSIsIHN0cihjbS5leGNlcHRpb24pKQorCisKK2NsYXNzIEFTVEhlbHBlcnNfVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9wYXJzZShzZWxmKToKKyAgICAgICAgYSA9IGFzdC5wYXJzZSgnZm9vKDEgKyAxKScpCisgICAgICAgIGIgPSBjb21waWxlKCdmb28oMSArIDEpJywgJzx1bmtub3duPicsICdleGVjJywgYXN0LlB5Q0ZfT05MWV9BU1QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmR1bXAoYSksIGFzdC5kdW1wKGIpKQorCisgICAgZGVmIHRlc3RfZHVtcChzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdC5wYXJzZSgnc3BhbShlZ2dzLCAiYW5kIGNoZWVzZSIpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QuZHVtcChub2RlKSwKKyAgICAgICAgICAgICJNb2R1bGUoYm9keT1bRXhwcih2YWx1ZT1DYWxsKGZ1bmM9TmFtZShpZD0nc3BhbScsIGN0eD1Mb2FkKCkpLCAiCisgICAgICAgICAgICAiYXJncz1bTmFtZShpZD0nZWdncycsIGN0eD1Mb2FkKCkpLCBTdHIocz0nYW5kIGNoZWVzZScpXSwgIgorICAgICAgICAgICAgImtleXdvcmRzPVtdLCBzdGFyYXJncz1Ob25lLCBrd2FyZ3M9Tm9uZSkpXSkiCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QuZHVtcChub2RlLCBhbm5vdGF0ZV9maWVsZHM9RmFsc2UpLAorICAgICAgICAgICAgIk1vZHVsZShbRXhwcihDYWxsKE5hbWUoJ3NwYW0nLCBMb2FkKCkpLCBbTmFtZSgnZWdncycsIExvYWQoKSksICIKKyAgICAgICAgICAgICJTdHIoJ2FuZCBjaGVlc2UnKV0sIFtdLCBOb25lLCBOb25lKSldKSIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5kdW1wKG5vZGUsIGluY2x1ZGVfYXR0cmlidXRlcz1UcnVlKSwKKyAgICAgICAgICAgICJNb2R1bGUoYm9keT1bRXhwcih2YWx1ZT1DYWxsKGZ1bmM9TmFtZShpZD0nc3BhbScsIGN0eD1Mb2FkKCksICIKKyAgICAgICAgICAgICJsaW5lbm89MSwgY29sX29mZnNldD0wKSwgYXJncz1bTmFtZShpZD0nZWdncycsIGN0eD1Mb2FkKCksICIKKyAgICAgICAgICAgICJsaW5lbm89MSwgY29sX29mZnNldD01KSwgU3RyKHM9J2FuZCBjaGVlc2UnLCBsaW5lbm89MSwgIgorICAgICAgICAgICAgImNvbF9vZmZzZXQ9MTEpXSwga2V5d29yZHM9W10sIHN0YXJhcmdzPU5vbmUsIGt3YXJncz1Ob25lLCAiCisgICAgICAgICAgICAibGluZW5vPTEsIGNvbF9vZmZzZXQ9MCksIGxpbmVubz0xLCBjb2xfb2Zmc2V0PTApXSkiCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2NvcHlfbG9jYXRpb24oc2VsZik6CisgICAgICAgIHNyYyA9IGFzdC5wYXJzZSgnMSArIDEnLCBtb2RlPSdldmFsJykKKyAgICAgICAgc3JjLmJvZHkucmlnaHQgPSBhc3QuY29weV9sb2NhdGlvbihhc3QuTnVtKDIpLCBzcmMuYm9keS5yaWdodCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QuZHVtcChzcmMsIGluY2x1ZGVfYXR0cmlidXRlcz1UcnVlKSwKKyAgICAgICAgICAgICdFeHByZXNzaW9uKGJvZHk9QmluT3AobGVmdD1OdW0obj0xLCBsaW5lbm89MSwgY29sX29mZnNldD0wKSwgJworICAgICAgICAgICAgJ29wPUFkZCgpLCByaWdodD1OdW0obj0yLCBsaW5lbm89MSwgY29sX29mZnNldD00KSwgbGluZW5vPTEsICcKKyAgICAgICAgICAgICdjb2xfb2Zmc2V0PTApKScKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfZml4X21pc3NpbmdfbG9jYXRpb25zKHNlbGYpOgorICAgICAgICBzcmMgPSBhc3QucGFyc2UoJ3dyaXRlKCJzcGFtIiknKQorICAgICAgICBzcmMuYm9keS5hcHBlbmQoYXN0LkV4cHIoYXN0LkNhbGwoYXN0Lk5hbWUoJ3NwYW0nLCBhc3QuTG9hZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthc3QuU3RyKCdlZ2dzJyldLCBbXSwgTm9uZSwgTm9uZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNyYywgYXN0LmZpeF9taXNzaW5nX2xvY2F0aW9ucyhzcmMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5kdW1wKHNyYywgaW5jbHVkZV9hdHRyaWJ1dGVzPVRydWUpLAorICAgICAgICAgICAgIk1vZHVsZShib2R5PVtFeHByKHZhbHVlPUNhbGwoZnVuYz1OYW1lKGlkPSd3cml0ZScsIGN0eD1Mb2FkKCksICIKKyAgICAgICAgICAgICJsaW5lbm89MSwgY29sX29mZnNldD0wKSwgYXJncz1bU3RyKHM9J3NwYW0nLCBsaW5lbm89MSwgIgorICAgICAgICAgICAgImNvbF9vZmZzZXQ9NildLCBrZXl3b3Jkcz1bXSwgc3RhcmFyZ3M9Tm9uZSwga3dhcmdzPU5vbmUsICIKKyAgICAgICAgICAgICJsaW5lbm89MSwgY29sX29mZnNldD0wKSwgbGluZW5vPTEsIGNvbF9vZmZzZXQ9MCksICIKKyAgICAgICAgICAgICJFeHByKHZhbHVlPUNhbGwoZnVuYz1OYW1lKGlkPSdzcGFtJywgY3R4PUxvYWQoKSwgbGluZW5vPTEsICIKKyAgICAgICAgICAgICJjb2xfb2Zmc2V0PTApLCBhcmdzPVtTdHIocz0nZWdncycsIGxpbmVubz0xLCBjb2xfb2Zmc2V0PTApXSwgIgorICAgICAgICAgICAgImtleXdvcmRzPVtdLCBzdGFyYXJncz1Ob25lLCBrd2FyZ3M9Tm9uZSwgbGluZW5vPTEsICIKKyAgICAgICAgICAgICJjb2xfb2Zmc2V0PTApLCBsaW5lbm89MSwgY29sX29mZnNldD0wKV0pIgorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRfbGluZW5vKHNlbGYpOgorICAgICAgICBzcmMgPSBhc3QucGFyc2UoJzEgKyAxJywgbW9kZT0nZXZhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmluY3JlbWVudF9saW5lbm8oc3JjLCBuPTMpLCBzcmMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmR1bXAoc3JjLCBpbmNsdWRlX2F0dHJpYnV0ZXM9VHJ1ZSksCisgICAgICAgICAgICAnRXhwcmVzc2lvbihib2R5PUJpbk9wKGxlZnQ9TnVtKG49MSwgbGluZW5vPTQsIGNvbF9vZmZzZXQ9MCksICcKKyAgICAgICAgICAgICdvcD1BZGQoKSwgcmlnaHQ9TnVtKG49MSwgbGluZW5vPTQsIGNvbF9vZmZzZXQ9NCksIGxpbmVubz00LCAnCisgICAgICAgICAgICAnY29sX29mZnNldD0wKSknCisgICAgICAgICkKKyAgICAgICAgIyBpc3N1ZTEwODY5OiBkbyBub3QgaW5jcmVtZW50IGxpbmVubyBvZiByb290IHR3aWNlCisgICAgICAgIHNyYyA9IGFzdC5wYXJzZSgnMSArIDEnLCBtb2RlPSdldmFsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QuaW5jcmVtZW50X2xpbmVubyhzcmMuYm9keSwgbj0zKSwgc3JjLmJvZHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmR1bXAoc3JjLCBpbmNsdWRlX2F0dHJpYnV0ZXM9VHJ1ZSksCisgICAgICAgICAgICAnRXhwcmVzc2lvbihib2R5PUJpbk9wKGxlZnQ9TnVtKG49MSwgbGluZW5vPTQsIGNvbF9vZmZzZXQ9MCksICcKKyAgICAgICAgICAgICdvcD1BZGQoKSwgcmlnaHQ9TnVtKG49MSwgbGluZW5vPTQsIGNvbF9vZmZzZXQ9NCksIGxpbmVubz00LCAnCisgICAgICAgICAgICAnY29sX29mZnNldD0wKSknCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2l0ZXJfZmllbGRzKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0LnBhcnNlKCdmb28oKScsIG1vZGU9J2V2YWwnKQorICAgICAgICBkID0gZGljdChhc3QuaXRlcl9maWVsZHMobm9kZS5ib2R5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBvcCgnZnVuYycpLmlkLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7J2tleXdvcmRzJzogW10sICdrd2FyZ3MnOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJncyc6IFtdLCAnc3RhcmFyZ3MnOiBOb25lfSkKKworICAgIGRlZiB0ZXN0X2l0ZXJfY2hpbGRfbm9kZXMoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3QucGFyc2UoInNwYW0oMjMsIDQyLCBlZ2dzPSdsZWVrJykiLCBtb2RlPSdldmFsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGlzdChhc3QuaXRlcl9jaGlsZF9ub2Rlcyhub2RlLmJvZHkpKSksIDQpCisgICAgICAgIGl0ZXJhdG9yID0gYXN0Lml0ZXJfY2hpbGRfbm9kZXMobm9kZS5ib2R5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoaXRlcmF0b3IpLmlkLCAnc3BhbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChpdGVyYXRvcikubiwgMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChpdGVyYXRvcikubiwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmR1bXAobmV4dChpdGVyYXRvcikpLAorICAgICAgICAgICAgImtleXdvcmQoYXJnPSdlZ2dzJywgdmFsdWU9U3RyKHM9J2xlZWsnKSkiCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2dldF9kb2NzdHJpbmcoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3QucGFyc2UoJ2RlZiBmb28oKTpcbiAgIiIibGluZSBvbmVcbiAgbGluZSB0d28iIiInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5nZXRfZG9jc3RyaW5nKG5vZGUuYm9keVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmUgb25lXG5saW5lIHR3bycpCisKKyAgICBkZWYgdGVzdF9saXRlcmFsX2V2YWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmxpdGVyYWxfZXZhbCgnWzEsIDIsIDNdJyksIFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QubGl0ZXJhbF9ldmFsKCd7ImZvbyI6IDQyfScpLCB7ImZvbyI6IDQyfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QubGl0ZXJhbF9ldmFsKCcoVHJ1ZSwgRmFsc2UsIE5vbmUpJyksIChUcnVlLCBGYWxzZSwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGFzdC5saXRlcmFsX2V2YWwsICdmb28oKScpCisKKyAgICBkZWYgdGVzdF9saXRlcmFsX2V2YWxfaXNzdWU0OTA3KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5saXRlcmFsX2V2YWwoJzJqJyksIDJqKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5saXRlcmFsX2V2YWwoJzEwICsgMmonKSwgMTAgKyAyaikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QubGl0ZXJhbF9ldmFsKCcxLjUgLSAyaicpLCAxLjUgLSAyaikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYXN0LmxpdGVyYWxfZXZhbCwgJzIgKyAoMyArIDRqKScpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKCJiYWNrcXVvdGUgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQVNUX1Rlc3RzLCBBU1RIZWxwZXJzX1Rlc3QpCisKK2RlZiBtYWluKCk6CisgICAgaWYgX19uYW1lX18gIT0gJ19fbWFpbl9fJzoKKyAgICAgICAgcmV0dXJuCisgICAgaWYgc3lzLmFyZ3ZbMTpdID09IFsnLWcnXToKKyAgICAgICAgZm9yIHN0YXRlbWVudHMsIGtpbmQgaW4gKChleGVjX3Rlc3RzLCAiZXhlYyIpLCAoc2luZ2xlX3Rlc3RzLCAic2luZ2xlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZhbF90ZXN0cywgImV2YWwiKSk6CisgICAgICAgICAgICBwcmludCBraW5kKyJfcmVzdWx0cyA9IFsiCisgICAgICAgICAgICBmb3IgcyBpbiBzdGF0ZW1lbnRzOgorICAgICAgICAgICAgICAgIHByaW50IHJlcHIodG9fdHVwbGUoY29tcGlsZShzLCAiPyIsIGtpbmQsIDB4NDAwKSkpKyIsIgorICAgICAgICAgICAgcHJpbnQgIl0iCisgICAgICAgIHByaW50ICJtYWluKCkiCisgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQKKyAgICB0ZXN0X21haW4oKQorCisjIyMjIEVWRVJZVEhJTkcgQkVMT1cgSVMgR0VORVJBVEVEICMjIyMjCitleGVjX3Jlc3VsdHMgPSBbCisoJ01vZHVsZScsIFsoJ0V4cHInLCAoMSwgMCksICgnTmFtZScsICgxLCAwKSwgJ05vbmUnLCAoJ0xvYWQnLCkpKV0pLAorKCdNb2R1bGUnLCBbKCdGdW5jdGlvbkRlZicsICgxLCAwKSwgJ2YnLCAoJ2FyZ3VtZW50cycsIFtdLCBOb25lLCBOb25lLCBbXSksIFsoJ1Bhc3MnLCAoMSwgOSkpXSwgW10pXSksCisoJ01vZHVsZScsIFsoJ0Z1bmN0aW9uRGVmJywgKDEsIDApLCAnZicsICgnYXJndW1lbnRzJywgWygnTmFtZScsICgxLCA2KSwgJ2EnLCAoJ1BhcmFtJywpKV0sIE5vbmUsIE5vbmUsIFtdKSwgWygnUGFzcycsICgxLCAxMCkpXSwgW10pXSksCisoJ01vZHVsZScsIFsoJ0Z1bmN0aW9uRGVmJywgKDEsIDApLCAnZicsICgnYXJndW1lbnRzJywgWygnTmFtZScsICgxLCA2KSwgJ2EnLCAoJ1BhcmFtJywpKV0sIE5vbmUsIE5vbmUsIFsoJ051bScsICgxLCA4KSwgMCldKSwgWygnUGFzcycsICgxLCAxMikpXSwgW10pXSksCisoJ01vZHVsZScsIFsoJ0Z1bmN0aW9uRGVmJywgKDEsIDApLCAnZicsICgnYXJndW1lbnRzJywgW10sICdhcmdzJywgTm9uZSwgW10pLCBbKCdQYXNzJywgKDEsIDE0KSldLCBbXSldKSwKKygnTW9kdWxlJywgWygnRnVuY3Rpb25EZWYnLCAoMSwgMCksICdmJywgKCdhcmd1bWVudHMnLCBbXSwgTm9uZSwgJ2t3YXJncycsIFtdKSwgWygnUGFzcycsICgxLCAxNykpXSwgW10pXSksCisoJ01vZHVsZScsIFsoJ0Z1bmN0aW9uRGVmJywgKDEsIDApLCAnZicsICgnYXJndW1lbnRzJywgWygnTmFtZScsICgxLCA2KSwgJ2EnLCAoJ1BhcmFtJywpKSwgKCdOYW1lJywgKDEsIDkpLCAnYicsICgnUGFyYW0nLCkpLCAoJ05hbWUnLCAoMSwgMTQpLCAnYycsICgnUGFyYW0nLCkpLCAoJ05hbWUnLCAoMSwgMjIpLCAnZCcsICgnUGFyYW0nLCkpLCAoJ05hbWUnLCAoMSwgMjgpLCAnZScsICgnUGFyYW0nLCkpXSwgJ2FyZ3MnLCAna3dhcmdzJywgWygnTnVtJywgKDEsIDExKSwgMSksICgnTmFtZScsICgxLCAxNiksICdOb25lJywgKCdMb2FkJywpKSwgKCdMaXN0JywgKDEsIDI0KSwgW10sICgnTG9hZCcsKSksICgnRGljdCcsICgxLCAzMCksIFtdLCBbXSldKSwgWygnUGFzcycsICgxLCA1MikpXSwgW10pXSksCisoJ01vZHVsZScsIFsoJ0NsYXNzRGVmJywgKDEsIDApLCAnQycsIFtdLCBbKCdQYXNzJywgKDEsIDgpKV0sIFtdKV0pLAorKCdNb2R1bGUnLCBbKCdDbGFzc0RlZicsICgxLCAwKSwgJ0MnLCBbKCdOYW1lJywgKDEsIDgpLCAnb2JqZWN0JywgKCdMb2FkJywpKV0sIFsoJ1Bhc3MnLCAoMSwgMTcpKV0sIFtdKV0pLAorKCdNb2R1bGUnLCBbKCdGdW5jdGlvbkRlZicsICgxLCAwKSwgJ2YnLCAoJ2FyZ3VtZW50cycsIFtdLCBOb25lLCBOb25lLCBbXSksIFsoJ1JldHVybicsICgxLCA4KSwgKCdOdW0nLCAoMSwgMTUpLCAxKSldLCBbXSldKSwKKygnTW9kdWxlJywgWygnRGVsZXRlJywgKDEsIDApLCBbKCdOYW1lJywgKDEsIDQpLCAndicsICgnRGVsJywpKV0pXSksCisoJ01vZHVsZScsIFsoJ0Fzc2lnbicsICgxLCAwKSwgWygnTmFtZScsICgxLCAwKSwgJ3YnLCAoJ1N0b3JlJywpKV0sICgnTnVtJywgKDEsIDQpLCAxKSldKSwKKygnTW9kdWxlJywgWygnQXVnQXNzaWduJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgMCksICd2JywgKCdTdG9yZScsKSksICgnQWRkJywpLCAoJ051bScsICgxLCA1KSwgMSkpXSksCisoJ01vZHVsZScsIFsoJ1ByaW50JywgKDEsIDApLCAoJ05hbWUnLCAoMSwgOCksICdmJywgKCdMb2FkJywpKSwgWygnTnVtJywgKDEsIDExKSwgMSldLCBGYWxzZSldKSwKKygnTW9kdWxlJywgWygnRm9yJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgNCksICd2JywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCA5KSwgJ3YnLCAoJ0xvYWQnLCkpLCBbKCdQYXNzJywgKDEsIDExKSldLCBbXSldKSwKKygnTW9kdWxlJywgWygnV2hpbGUnLCAoMSwgMCksICgnTmFtZScsICgxLCA2KSwgJ3YnLCAoJ0xvYWQnLCkpLCBbKCdQYXNzJywgKDEsIDgpKV0sIFtdKV0pLAorKCdNb2R1bGUnLCBbKCdJZicsICgxLCAwKSwgKCdOYW1lJywgKDEsIDMpLCAndicsICgnTG9hZCcsKSksIFsoJ1Bhc3MnLCAoMSwgNSkpXSwgW10pXSksCisoJ01vZHVsZScsIFsoJ1JhaXNlJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgNiksICdFeGNlcHRpb24nLCAoJ0xvYWQnLCkpLCAoJ1N0cicsICgxLCAxNyksICdzdHJpbmcnKSwgTm9uZSldKSwKKygnTW9kdWxlJywgWygnVHJ5RXhjZXB0JywgKDEsIDApLCBbKCdQYXNzJywgKDIsIDIpKV0sIFsoJ0V4Y2VwdEhhbmRsZXInLCAoMywgMCksICgnTmFtZScsICgzLCA3KSwgJ0V4Y2VwdGlvbicsICgnTG9hZCcsKSksIE5vbmUsIFsoJ1Bhc3MnLCAoNCwgMikpXSldLCBbXSldKSwKKygnTW9kdWxlJywgWygnVHJ5RmluYWxseScsICgxLCAwKSwgWygnUGFzcycsICgyLCAyKSldLCBbKCdQYXNzJywgKDQsIDIpKV0pXSksCisoJ01vZHVsZScsIFsoJ0Fzc2VydCcsICgxLCAwKSwgKCdOYW1lJywgKDEsIDcpLCAndicsICgnTG9hZCcsKSksIE5vbmUpXSksCisoJ01vZHVsZScsIFsoJ0ltcG9ydCcsICgxLCAwKSwgWygnYWxpYXMnLCAnc3lzJywgTm9uZSldKV0pLAorKCdNb2R1bGUnLCBbKCdJbXBvcnRGcm9tJywgKDEsIDApLCAnc3lzJywgWygnYWxpYXMnLCAndicsIE5vbmUpXSwgMCldKSwKKygnTW9kdWxlJywgWygnRXhlYycsICgxLCAwKSwgKCdTdHInLCAoMSwgNSksICd2JyksIE5vbmUsIE5vbmUpXSksCisoJ01vZHVsZScsIFsoJ0dsb2JhbCcsICgxLCAwKSwgWyd2J10pXSksCisoJ01vZHVsZScsIFsoJ0V4cHInLCAoMSwgMCksICgnTnVtJywgKDEsIDApLCAxKSldKSwKKygnTW9kdWxlJywgWygnUGFzcycsICgxLCAwKSldKSwKKygnTW9kdWxlJywgWygnQnJlYWsnLCAoMSwgMCkpXSksCisoJ01vZHVsZScsIFsoJ0NvbnRpbnVlJywgKDEsIDApKV0pLAorKCdNb2R1bGUnLCBbKCdGb3InLCAoMSwgMCksICgnVHVwbGUnLCAoMSwgNCksIFsoJ05hbWUnLCAoMSwgNCksICdhJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCA2KSwgJ2InLCAoJ1N0b3JlJywpKV0sICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTEpLCAnYycsICgnTG9hZCcsKSksIFsoJ1Bhc3MnLCAoMSwgMTQpKV0sIFtdKV0pLAorKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ0xpc3RDb21wJywgKDEsIDEpLCAoJ1R1cGxlJywgKDEsIDIpLCBbKCdOYW1lJywgKDEsIDIpLCAnYScsICgnTG9hZCcsKSksICgnTmFtZScsICgxLCA0KSwgJ2InLCAoJ0xvYWQnLCkpXSwgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnVHVwbGUnLCAoMSwgMTEpLCBbKCdOYW1lJywgKDEsIDExKSwgJ2EnLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDEzKSwgJ2InLCAoJ1N0b3JlJywpKV0sICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTgpLCAnYycsICgnTG9hZCcsKSksIFtdKV0pKV0pLAorKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ0dlbmVyYXRvckV4cCcsICgxLCAxKSwgKCdUdXBsZScsICgxLCAyKSwgWygnTmFtZScsICgxLCAyKSwgJ2EnLCAoJ0xvYWQnLCkpLCAoJ05hbWUnLCAoMSwgNCksICdiJywgKCdMb2FkJywpKV0sICgnTG9hZCcsKSksIFsoJ2NvbXByZWhlbnNpb24nLCAoJ1R1cGxlJywgKDEsIDExKSwgWygnTmFtZScsICgxLCAxMSksICdhJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxMyksICdiJywgKCdTdG9yZScsKSldLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDE4KSwgJ2MnLCAoJ0xvYWQnLCkpLCBbXSldKSldKSwKKygnTW9kdWxlJywgWygnRXhwcicsICgxLCAwKSwgKCdHZW5lcmF0b3JFeHAnLCAoMSwgMSksICgnVHVwbGUnLCAoMSwgMiksIFsoJ05hbWUnLCAoMSwgMiksICdhJywgKCdMb2FkJywpKSwgKCdOYW1lJywgKDEsIDQpLCAnYicsICgnTG9hZCcsKSldLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdUdXBsZScsICgxLCAxMiksIFsoJ05hbWUnLCAoMSwgMTIpLCAnYScsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTQpLCAnYicsICgnU3RvcmUnLCkpXSwgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAyMCksICdjJywgKCdMb2FkJywpKSwgW10pXSkpXSksCisoJ01vZHVsZScsIFsoJ0V4cHInLCAoMSwgMCksICgnR2VuZXJhdG9yRXhwJywgKDIsIDQpLCAoJ1R1cGxlJywgKDMsIDQpLCBbKCdOYW1lJywgKDMsIDQpLCAnQWEnLCAoJ0xvYWQnLCkpLCAoJ05hbWUnLCAoNSwgNyksICdCYicsICgnTG9hZCcsKSldLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdUdXBsZScsICg4LCA0KSwgWygnTmFtZScsICg4LCA0KSwgJ0FhJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxMCwgNCksICdCYicsICgnU3RvcmUnLCkpXSwgKCdTdG9yZScsKSksICgnTmFtZScsICgxMCwgMTApLCAnQ2MnLCAoJ0xvYWQnLCkpLCBbXSldKSldKSwKKygnTW9kdWxlJywgWygnRXhwcicsICgxLCAwKSwgKCdEaWN0Q29tcCcsICgxLCAxKSwgKCdOYW1lJywgKDEsIDEpLCAnYScsICgnTG9hZCcsKSksICgnTmFtZScsICgxLCA1KSwgJ2InLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdOYW1lJywgKDEsIDExKSwgJ3cnLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDE2KSwgJ3gnLCAoJ0xvYWQnLCkpLCBbXSksICgnY29tcHJlaGVuc2lvbicsICgnTmFtZScsICgxLCAyMiksICdtJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAyNyksICdwJywgKCdMb2FkJywpKSwgWygnTmFtZScsICgxLCAzMiksICdnJywgKCdMb2FkJywpKV0pXSkpXSksCisoJ01vZHVsZScsIFsoJ0V4cHInLCAoMSwgMCksICgnRGljdENvbXAnLCAoMSwgMSksICgnTmFtZScsICgxLCAxKSwgJ2EnLCAoJ0xvYWQnLCkpLCAoJ05hbWUnLCAoMSwgNSksICdiJywgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnVHVwbGUnLCAoMSwgMTEpLCBbKCdOYW1lJywgKDEsIDExKSwgJ3YnLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDEzKSwgJ3cnLCAoJ1N0b3JlJywpKV0sICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTgpLCAneCcsICgnTG9hZCcsKSksIFtdKV0pKV0pLAorKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ1NldENvbXAnLCAoMSwgMSksICgnTmFtZScsICgxLCAxKSwgJ3InLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdOYW1lJywgKDEsIDcpLCAnbCcsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTIpLCAneCcsICgnTG9hZCcsKSksIFsoJ05hbWUnLCAoMSwgMTcpLCAnZycsICgnTG9hZCcsKSldKV0pKV0pLAorKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ1NldENvbXAnLCAoMSwgMSksICgnTmFtZScsICgxLCAxKSwgJ3InLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdUdXBsZScsICgxLCA3KSwgWygnTmFtZScsICgxLCA3KSwgJ2wnLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDkpLCAnbScsICgnU3RvcmUnLCkpXSwgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxNCksICd4JywgKCdMb2FkJywpKSwgW10pXSkpXSksCitdCitzaW5nbGVfcmVzdWx0cyA9IFsKKygnSW50ZXJhY3RpdmUnLCBbKCdFeHByJywgKDEsIDApLCAoJ0Jpbk9wJywgKDEsIDApLCAoJ051bScsICgxLCAwKSwgMSksICgnQWRkJywpLCAoJ051bScsICgxLCAyKSwgMikpKV0pLAorXQorZXZhbF9yZXN1bHRzID0gWworKCdFeHByZXNzaW9uJywgKCdOYW1lJywgKDEsIDApLCAnTm9uZScsICgnTG9hZCcsKSkpLAorKCdFeHByZXNzaW9uJywgKCdCb29sT3AnLCAoMSwgMCksICgnQW5kJywpLCBbKCdOYW1lJywgKDEsIDApLCAnYScsICgnTG9hZCcsKSksICgnTmFtZScsICgxLCA2KSwgJ2InLCAoJ0xvYWQnLCkpXSkpLAorKCdFeHByZXNzaW9uJywgKCdCaW5PcCcsICgxLCAwKSwgKCdOYW1lJywgKDEsIDApLCAnYScsICgnTG9hZCcsKSksICgnQWRkJywpLCAoJ05hbWUnLCAoMSwgNCksICdiJywgKCdMb2FkJywpKSkpLAorKCdFeHByZXNzaW9uJywgKCdVbmFyeU9wJywgKDEsIDApLCAoJ05vdCcsKSwgKCdOYW1lJywgKDEsIDQpLCAndicsICgnTG9hZCcsKSkpKSwKKygnRXhwcmVzc2lvbicsICgnTGFtYmRhJywgKDEsIDApLCAoJ2FyZ3VtZW50cycsIFtdLCBOb25lLCBOb25lLCBbXSksICgnTmFtZScsICgxLCA3KSwgJ05vbmUnLCAoJ0xvYWQnLCkpKSksCisoJ0V4cHJlc3Npb24nLCAoJ0RpY3QnLCAoMSwgMCksIFsoJ051bScsICgxLCAyKSwgMSldLCBbKCdOdW0nLCAoMSwgNCksIDIpXSkpLAorKCdFeHByZXNzaW9uJywgKCdEaWN0JywgKDEsIDApLCBbXSwgW10pKSwKKygnRXhwcmVzc2lvbicsICgnU2V0JywgKDEsIDApLCBbKCdOYW1lJywgKDEsIDEpLCAnTm9uZScsICgnTG9hZCcsKSldKSksCisoJ0V4cHJlc3Npb24nLCAoJ0RpY3QnLCAoMSwgMCksIFsoJ051bScsICgyLCA2KSwgMSldLCBbKCdOdW0nLCAoNCwgMTApLCAyKV0pKSwKKygnRXhwcmVzc2lvbicsICgnTGlzdENvbXAnLCAoMSwgMSksICgnTmFtZScsICgxLCAxKSwgJ2EnLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdOYW1lJywgKDEsIDcpLCAnYicsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTIpLCAnYycsICgnTG9hZCcsKSksIFsoJ05hbWUnLCAoMSwgMTcpLCAnZCcsICgnTG9hZCcsKSldKV0pKSwKKygnRXhwcmVzc2lvbicsICgnR2VuZXJhdG9yRXhwJywgKDEsIDEpLCAoJ05hbWUnLCAoMSwgMSksICdhJywgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnTmFtZScsICgxLCA3KSwgJ2InLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDEyKSwgJ2MnLCAoJ0xvYWQnLCkpLCBbKCdOYW1lJywgKDEsIDE3KSwgJ2QnLCAoJ0xvYWQnLCkpXSldKSksCisoJ0V4cHJlc3Npb24nLCAoJ0NvbXBhcmUnLCAoMSwgMCksICgnTnVtJywgKDEsIDApLCAxKSwgWygnTHQnLCksICgnTHQnLCldLCBbKCdOdW0nLCAoMSwgNCksIDIpLCAoJ051bScsICgxLCA4KSwgMyldKSksCisoJ0V4cHJlc3Npb24nLCAoJ0NhbGwnLCAoMSwgMCksICgnTmFtZScsICgxLCAwKSwgJ2YnLCAoJ0xvYWQnLCkpLCBbKCdOdW0nLCAoMSwgMiksIDEpLCAoJ051bScsICgxLCA0KSwgMildLCBbKCdrZXl3b3JkJywgJ2MnLCAoJ051bScsICgxLCA4KSwgMykpXSwgKCdOYW1lJywgKDEsIDExKSwgJ2QnLCAoJ0xvYWQnLCkpLCAoJ05hbWUnLCAoMSwgMTUpLCAnZScsICgnTG9hZCcsKSkpKSwKKygnRXhwcmVzc2lvbicsICgnUmVwcicsICgxLCAwKSwgKCdOYW1lJywgKDEsIDEpLCAndicsICgnTG9hZCcsKSkpKSwKKygnRXhwcmVzc2lvbicsICgnTnVtJywgKDEsIDApLCAxMEwpKSwKKygnRXhwcmVzc2lvbicsICgnU3RyJywgKDEsIDApLCAnc3RyaW5nJykpLAorKCdFeHByZXNzaW9uJywgKCdBdHRyaWJ1dGUnLCAoMSwgMCksICgnTmFtZScsICgxLCAwKSwgJ2EnLCAoJ0xvYWQnLCkpLCAnYicsICgnTG9hZCcsKSkpLAorKCdFeHByZXNzaW9uJywgKCdTdWJzY3JpcHQnLCAoMSwgMCksICgnTmFtZScsICgxLCAwKSwgJ2EnLCAoJ0xvYWQnLCkpLCAoJ1NsaWNlJywgKCdOYW1lJywgKDEsIDIpLCAnYicsICgnTG9hZCcsKSksICgnTmFtZScsICgxLCA0KSwgJ2MnLCAoJ0xvYWQnLCkpLCBOb25lKSwgKCdMb2FkJywpKSksCisoJ0V4cHJlc3Npb24nLCAoJ05hbWUnLCAoMSwgMCksICd2JywgKCdMb2FkJywpKSksCisoJ0V4cHJlc3Npb24nLCAoJ0xpc3QnLCAoMSwgMCksIFsoJ051bScsICgxLCAxKSwgMSksICgnTnVtJywgKDEsIDMpLCAyKSwgKCdOdW0nLCAoMSwgNSksIDMpXSwgKCdMb2FkJywpKSksCisoJ0V4cHJlc3Npb24nLCAoJ0xpc3QnLCAoMSwgMCksIFtdLCAoJ0xvYWQnLCkpKSwKKygnRXhwcmVzc2lvbicsICgnVHVwbGUnLCAoMSwgMCksIFsoJ051bScsICgxLCAwKSwgMSksICgnTnVtJywgKDEsIDIpLCAyKSwgKCdOdW0nLCAoMSwgNCksIDMpXSwgKCdMb2FkJywpKSksCisoJ0V4cHJlc3Npb24nLCAoJ1R1cGxlJywgKDEsIDEpLCBbKCdOdW0nLCAoMSwgMSksIDEpLCAoJ051bScsICgxLCAzKSwgMiksICgnTnVtJywgKDEsIDUpLCAzKV0sICgnTG9hZCcsKSkpLAorKCdFeHByZXNzaW9uJywgKCdUdXBsZScsICgxLCAwKSwgW10sICgnTG9hZCcsKSkpLAorKCdFeHByZXNzaW9uJywgKCdDYWxsJywgKDEsIDApLCAoJ0F0dHJpYnV0ZScsICgxLCAwKSwgKCdBdHRyaWJ1dGUnLCAoMSwgMCksICgnQXR0cmlidXRlJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgMCksICdhJywgKCdMb2FkJywpKSwgJ2InLCAoJ0xvYWQnLCkpLCAnYycsICgnTG9hZCcsKSksICdkJywgKCdMb2FkJywpKSwgWygnU3Vic2NyaXB0JywgKDEsIDgpLCAoJ0F0dHJpYnV0ZScsICgxLCA4KSwgKCdOYW1lJywgKDEsIDgpLCAnYScsICgnTG9hZCcsKSksICdiJywgKCdMb2FkJywpKSwgKCdTbGljZScsICgnTnVtJywgKDEsIDEyKSwgMSksICgnTnVtJywgKDEsIDE0KSwgMiksIE5vbmUpLCAoJ0xvYWQnLCkpXSwgW10sIE5vbmUsIE5vbmUpKSwKK10KK21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyMmEzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyMmEzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNoYXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc3luY2hhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODFlYzBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNoYXQucHkKQEAgLTAsMCArMSwyNzMgQEAKKyMgdGVzdCBhc3luY2hhdAorCitpbXBvcnQgYXN5bmNvcmUsIGFzeW5jaGF0LCBzb2NrZXQsIHRpbWUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkaW5nID0gTm9uZQorCitIT1NUID0gdGVzdF9zdXBwb3J0LkhPU1QKK1NFUlZFUl9RVUlUID0gJ1FVSVRcbicKKworaWYgdGhyZWFkaW5nOgorICAgIGNsYXNzIGVjaG9fc2VydmVyKHRocmVhZGluZy5UaHJlYWQpOgorICAgICAgICAjIHBhcmFtZXRlciB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBieXRlcyBwYXNzZWQgYmFjayB0byB0aGUKKyAgICAgICAgIyBjbGllbnQgZWFjaCBzZW5kCisgICAgICAgIGNodW5rX3NpemUgPSAxCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV2ZW50KToKKyAgICAgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgIHNlbGYuZXZlbnQgPSBldmVudAorICAgICAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICAgICAgc2VsZi5wb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZWxmLnNvY2spCisgICAgICAgICAgICAjIFRoaXMgd2lsbCBiZSBzZXQgaWYgdGhlIGNsaWVudCB3YW50cyB1cyB0byB3YWl0IGJlZm9yZSBlY2hvaW5nIGRhdGEKKyAgICAgICAgICAgICMgYmFjay4KKyAgICAgICAgICAgIHNlbGYuc3RhcnRfcmVzZW5kX2V2ZW50ID0gTm9uZQorCisgICAgICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICAgICBzZWxmLnNvY2subGlzdGVuKDEpCisgICAgICAgICAgICBzZWxmLmV2ZW50LnNldCgpCisgICAgICAgICAgICBjb25uLCBjbGllbnQgPSBzZWxmLnNvY2suYWNjZXB0KCkKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gIiIKKyAgICAgICAgICAgICMgY29sbGVjdCBkYXRhIHVudGlsIHF1aXQgbWVzc2FnZSBpcyBzZWVuCisgICAgICAgICAgICB3aGlsZSBTRVJWRVJfUVVJVCBub3QgaW4gc2VsZi5idWZmZXI6CisgICAgICAgICAgICAgICAgZGF0YSA9IGNvbm4ucmVjdigxKQorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXIgKyBkYXRhCisKKyAgICAgICAgICAgICMgcmVtb3ZlIHRoZSBTRVJWRVJfUVVJVCBtZXNzYWdlCisgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IHNlbGYuYnVmZmVyLnJlcGxhY2UoU0VSVkVSX1FVSVQsICcnKQorCisgICAgICAgICAgICBpZiBzZWxmLnN0YXJ0X3Jlc2VuZF9ldmVudDoKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0X3Jlc2VuZF9ldmVudC53YWl0KCkKKworICAgICAgICAgICAgIyByZS1zZW5kIGVudGlyZSBzZXQgb2YgY29sbGVjdGVkIGRhdGEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIHRoaXMgbWF5IGZhaWwgb24gc29tZSB0ZXN0cywgc3VjaCBhcyB0ZXN0X2Nsb3NlX3doZW5fZG9uZSwgc2luY2UKKyAgICAgICAgICAgICAgICAjIHRoZSBjbGllbnQgY2xvc2VzIHRoZSBjaGFubmVsIHdoZW4gaXQncyBkb25lIHNlbmRpbmcKKyAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLmJ1ZmZlcjoKKyAgICAgICAgICAgICAgICAgICAgbiA9IGNvbm4uc2VuZChzZWxmLmJ1ZmZlcls6c2VsZi5jaHVua19zaXplXSkKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAwMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlcltuOl0KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKworICAgIGNsYXNzIGVjaG9fY2xpZW50KGFzeW5jaGF0LmFzeW5jX2NoYXQpOgorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXJtaW5hdG9yLCBzZXJ2ZXJfcG9ydCk6CisgICAgICAgICAgICBhc3luY2hhdC5hc3luY19jaGF0Ll9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICBzZWxmLmNvbnRlbnRzID0gW10KKyAgICAgICAgICAgIHNlbGYuY3JlYXRlX3NvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICAgICAgc2VsZi5jb25uZWN0KChIT1NULCBzZXJ2ZXJfcG9ydCkpCisgICAgICAgICAgICBzZWxmLnNldF90ZXJtaW5hdG9yKHRlcm1pbmF0b3IpCisgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9ICcnCisKKyAgICAgICAgZGVmIGhhbmRsZV9jb25uZWN0KHNlbGYpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgICMgc2VsZWN0LnBvbGwgcmV0dXJucyBhIHNlbGVjdC5QT0xMSFVQIGF0IHRoZSBlbmQgb2YgdGhlIHRlc3RzCisgICAgICAgICAgICAjIG9uIGRhcndpbiwgc28ganVzdCBpZ25vcmUgaXQKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfZXhwdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIGNvbGxlY3RfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyICs9IGRhdGEKKworICAgICAgICBkZWYgZm91bmRfdGVybWluYXRvcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuY29udGVudHMuYXBwZW5kKHNlbGYuYnVmZmVyKQorICAgICAgICAgICAgc2VsZi5idWZmZXIgPSAiIgorCisKKyAgICBkZWYgc3RhcnRfZWNob19zZXJ2ZXIoKToKKyAgICAgICAgZXZlbnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzID0gZWNob19zZXJ2ZXIoZXZlbnQpCisgICAgICAgIHMuc3RhcnQoKQorICAgICAgICBldmVudC53YWl0KCkKKyAgICAgICAgZXZlbnQuY2xlYXIoKQorICAgICAgICB0aW1lLnNsZWVwKDAuMDEpICMgR2l2ZSBzZXJ2ZXIgdGltZSB0byBzdGFydCBhY2NlcHRpbmcuCisgICAgICAgIHJldHVybiBzLCBldmVudAorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCitjbGFzcyBUZXN0QXN5bmNoYXQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHVzZXBvbGwgPSBGYWxzZQorCisgICAgZGVmIHNldFVwIChzZWxmKToKKyAgICAgICAgc2VsZi5fdGhyZWFkcyA9IHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQorCisgICAgZGVmIHRlYXJEb3duIChzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnRocmVhZGluZ19jbGVhbnVwKCpzZWxmLl90aHJlYWRzKQorCisgICAgZGVmIGxpbmVfdGVybWluYXRvcl9jaGVjayhzZWxmLCB0ZXJtLCBzZXJ2ZXJfY2h1bmspOgorICAgICAgICBldmVudCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHMgPSBlY2hvX3NlcnZlcihldmVudCkKKyAgICAgICAgcy5jaHVua19zaXplID0gc2VydmVyX2NodW5rCisgICAgICAgIHMuc3RhcnQoKQorICAgICAgICBldmVudC53YWl0KCkKKyAgICAgICAgZXZlbnQuY2xlYXIoKQorICAgICAgICB0aW1lLnNsZWVwKDAuMDEpICMgR2l2ZSBzZXJ2ZXIgdGltZSB0byBzdGFydCBhY2NlcHRpbmcuCisgICAgICAgIGMgPSBlY2hvX2NsaWVudCh0ZXJtLCBzLnBvcnQpCisgICAgICAgIGMucHVzaCgiaGVsbG8gIikKKyAgICAgICAgYy5wdXNoKCJ3b3JsZCVzIiAlIHRlcm0pCisgICAgICAgIGMucHVzaCgiSSdtIG5vdCBkZWFkIHlldCElcyIgJSB0ZXJtKQorICAgICAgICBjLnB1c2goU0VSVkVSX1FVSVQpCisgICAgICAgIGFzeW5jb3JlLmxvb3AodXNlX3BvbGw9c2VsZi51c2Vwb2xsLCBjb3VudD0zMDAsIHRpbWVvdXQ9LjAxKQorICAgICAgICBzLmpvaW4oKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb250ZW50cywgWyJoZWxsbyB3b3JsZCIsICJJJ20gbm90IGRlYWQgeWV0ISJdKQorCisgICAgIyB0aGUgbGluZSB0ZXJtaW5hdG9yIHRlc3RzIGJlbG93IGNoZWNrIHJlY2VpdmluZyB2YXJpb3VzbHktc2l6ZWQKKyAgICAjIGNodW5rcyBiYWNrIGZyb20gdGhlIHNlcnZlciBpbiBvcmRlciB0byBleGVyY2lzZSBhbGwgYnJhbmNoZXMgb2YKKyAgICAjIGFzeW5jX2NoYXQuaGFuZGxlX3JlYWQKKworICAgIGRlZiB0ZXN0X2xpbmVfdGVybWluYXRvcjEoc2VsZik6CisgICAgICAgICMgdGVzdCBvbmUtY2hhcmFjdGVyIHRlcm1pbmF0b3IKKyAgICAgICAgZm9yIGwgaW4gKDEsMiwzKToKKyAgICAgICAgICAgIHNlbGYubGluZV90ZXJtaW5hdG9yX2NoZWNrKCdcbicsIGwpCisKKyAgICBkZWYgdGVzdF9saW5lX3Rlcm1pbmF0b3IyKHNlbGYpOgorICAgICAgICAjIHRlc3QgdHdvLWNoYXJhY3RlciB0ZXJtaW5hdG9yCisgICAgICAgIGZvciBsIGluICgxLDIsMyk6CisgICAgICAgICAgICBzZWxmLmxpbmVfdGVybWluYXRvcl9jaGVjaygnXHJcbicsIGwpCisKKyAgICBkZWYgdGVzdF9saW5lX3Rlcm1pbmF0b3IzKHNlbGYpOgorICAgICAgICAjIHRlc3QgdGhyZWUtY2hhcmFjdGVyIHRlcm1pbmF0b3IKKyAgICAgICAgZm9yIGwgaW4gKDEsMiwzKToKKyAgICAgICAgICAgIHNlbGYubGluZV90ZXJtaW5hdG9yX2NoZWNrKCdxcXEnLCBsKQorCisgICAgZGVmIG51bWVyaWNfdGVybWluYXRvcl9jaGVjayhzZWxmLCB0ZXJtbGVuKToKKyAgICAgICAgIyBUcnkgcmVhZGluZyBhIGZpeGVkIG51bWJlciBvZiBieXRlcworICAgICAgICBzLCBldmVudCA9IHN0YXJ0X2VjaG9fc2VydmVyKCkKKyAgICAgICAgYyA9IGVjaG9fY2xpZW50KHRlcm1sZW4sIHMucG9ydCkKKyAgICAgICAgZGF0YSA9ICJoZWxsbyB3b3JsZCwgSSdtIG5vdCBkZWFkIHlldCFcbiIKKyAgICAgICAgYy5wdXNoKGRhdGEpCisgICAgICAgIGMucHVzaChTRVJWRVJfUVVJVCkKKyAgICAgICAgYXN5bmNvcmUubG9vcCh1c2VfcG9sbD1zZWxmLnVzZXBvbGwsIGNvdW50PTMwMCwgdGltZW91dD0uMDEpCisgICAgICAgIHMuam9pbigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbnRlbnRzLCBbZGF0YVs6dGVybWxlbl1dKQorCisgICAgZGVmIHRlc3RfbnVtZXJpY190ZXJtaW5hdG9yMShzZWxmKToKKyAgICAgICAgIyBjaGVjayB0aGF0IGludHMgJiBsb25ncyBib3RoIHdvcmsgKHNpbmNlIHR5cGUgaXMKKyAgICAgICAgIyBleHBsaWNpdGx5IGNoZWNrZWQgaW4gYXN5bmNfY2hhdC5oYW5kbGVfcmVhZCkKKyAgICAgICAgc2VsZi5udW1lcmljX3Rlcm1pbmF0b3JfY2hlY2soMSkKKyAgICAgICAgc2VsZi5udW1lcmljX3Rlcm1pbmF0b3JfY2hlY2soMUwpCisKKyAgICBkZWYgdGVzdF9udW1lcmljX3Rlcm1pbmF0b3IyKHNlbGYpOgorICAgICAgICBzZWxmLm51bWVyaWNfdGVybWluYXRvcl9jaGVjayg2TCkKKworICAgIGRlZiB0ZXN0X25vbmVfdGVybWluYXRvcihzZWxmKToKKyAgICAgICAgIyBUcnkgcmVhZGluZyBhIGZpeGVkIG51bWJlciBvZiBieXRlcworICAgICAgICBzLCBldmVudCA9IHN0YXJ0X2VjaG9fc2VydmVyKCkKKyAgICAgICAgYyA9IGVjaG9fY2xpZW50KE5vbmUsIHMucG9ydCkKKyAgICAgICAgZGF0YSA9ICJoZWxsbyB3b3JsZCwgSSdtIG5vdCBkZWFkIHlldCFcbiIKKyAgICAgICAgYy5wdXNoKGRhdGEpCisgICAgICAgIGMucHVzaChTRVJWRVJfUVVJVCkKKyAgICAgICAgYXN5bmNvcmUubG9vcCh1c2VfcG9sbD1zZWxmLnVzZXBvbGwsIGNvdW50PTMwMCwgdGltZW91dD0uMDEpCisgICAgICAgIHMuam9pbigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbnRlbnRzLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmJ1ZmZlciwgZGF0YSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9wcm9kdWNlcihzZWxmKToKKyAgICAgICAgcywgZXZlbnQgPSBzdGFydF9lY2hvX3NlcnZlcigpCisgICAgICAgIGMgPSBlY2hvX2NsaWVudCgnXG4nLCBzLnBvcnQpCisgICAgICAgIGRhdGEgPSAiaGVsbG8gd29ybGRcbkknbSBub3QgZGVhZCB5ZXQhXG4iCisgICAgICAgIHAgPSBhc3luY2hhdC5zaW1wbGVfcHJvZHVjZXIoZGF0YStTRVJWRVJfUVVJVCwgYnVmZmVyX3NpemU9OCkKKyAgICAgICAgYy5wdXNoX3dpdGhfcHJvZHVjZXIocCkKKyAgICAgICAgYXN5bmNvcmUubG9vcCh1c2VfcG9sbD1zZWxmLnVzZXBvbGwsIGNvdW50PTMwMCwgdGltZW91dD0uMDEpCisgICAgICAgIHMuam9pbigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbnRlbnRzLCBbImhlbGxvIHdvcmxkIiwgIkknbSBub3QgZGVhZCB5ZXQhIl0pCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfcHJvZHVjZXIoc2VsZik6CisgICAgICAgIHMsIGV2ZW50ID0gc3RhcnRfZWNob19zZXJ2ZXIoKQorICAgICAgICBjID0gZWNob19jbGllbnQoJ1xuJywgcy5wb3J0KQorICAgICAgICBkYXRhID0gImhlbGxvIHdvcmxkXG5JJ20gbm90IGRlYWQgeWV0IVxuIgorICAgICAgICBjLnB1c2hfd2l0aF9wcm9kdWNlcihkYXRhK1NFUlZFUl9RVUlUKQorICAgICAgICBhc3luY29yZS5sb29wKHVzZV9wb2xsPXNlbGYudXNlcG9sbCwgY291bnQ9MzAwLCB0aW1lb3V0PS4wMSkKKyAgICAgICAgcy5qb2luKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29udGVudHMsIFsiaGVsbG8gd29ybGQiLCAiSSdtIG5vdCBkZWFkIHlldCEiXSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2xpbmUoc2VsZik6CisgICAgICAgICMgY2hlY2tzIHRoYXQgZW1wdHkgbGluZXMgYXJlIGhhbmRsZWQgY29ycmVjdGx5CisgICAgICAgIHMsIGV2ZW50ID0gc3RhcnRfZWNob19zZXJ2ZXIoKQorICAgICAgICBjID0gZWNob19jbGllbnQoJ1xuJywgcy5wb3J0KQorICAgICAgICBjLnB1c2goImhlbGxvIHdvcmxkXG5cbkknbSBub3QgZGVhZCB5ZXQhXG4iKQorICAgICAgICBjLnB1c2goU0VSVkVSX1FVSVQpCisgICAgICAgIGFzeW5jb3JlLmxvb3AodXNlX3BvbGw9c2VsZi51c2Vwb2xsLCBjb3VudD0zMDAsIHRpbWVvdXQ9LjAxKQorICAgICAgICBzLmpvaW4oKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb250ZW50cywgWyJoZWxsbyB3b3JsZCIsICIiLCAiSSdtIG5vdCBkZWFkIHlldCEiXSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlX3doZW5fZG9uZShzZWxmKToKKyAgICAgICAgcywgZXZlbnQgPSBzdGFydF9lY2hvX3NlcnZlcigpCisgICAgICAgIHMuc3RhcnRfcmVzZW5kX2V2ZW50ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgYyA9IGVjaG9fY2xpZW50KCdcbicsIHMucG9ydCkKKyAgICAgICAgYy5wdXNoKCJoZWxsbyB3b3JsZFxuSSdtIG5vdCBkZWFkIHlldCFcbiIpCisgICAgICAgIGMucHVzaChTRVJWRVJfUVVJVCkKKyAgICAgICAgYy5jbG9zZV93aGVuX2RvbmUoKQorICAgICAgICBhc3luY29yZS5sb29wKHVzZV9wb2xsPXNlbGYudXNlcG9sbCwgY291bnQ9MzAwLCB0aW1lb3V0PS4wMSkKKworICAgICAgICAjIE9ubHkgYWxsb3cgdGhlIHNlcnZlciB0byBzdGFydCBlY2hvaW5nIGRhdGEgYmFjayB0byB0aGUgY2xpZW50IGFmdGVyCisgICAgICAgICMgdGhlIGNsaWVudCBoYXMgY2xvc2VkIGl0cyBjb25uZWN0aW9uLiAgVGhpcyBwcmV2ZW50cyBhIHJhY2UgY29uZGl0aW9uCisgICAgICAgICMgd2hlcmUgdGhlIHNlcnZlciBlY2hvZXMgYWxsIG9mIGl0cyBkYXRhIGJlZm9yZSB3ZSBjYW4gY2hlY2sgdGhhdCBpdAorICAgICAgICAjIGdvdCBhbnkgZG93biBiZWxvdy4KKyAgICAgICAgcy5zdGFydF9yZXNlbmRfZXZlbnQuc2V0KCkKKyAgICAgICAgcy5qb2luKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29udGVudHMsIFtdKQorICAgICAgICAjIHRoZSBzZXJ2ZXIgbWlnaHQgaGF2ZSBiZWVuIGFibGUgdG8gc2VuZCBhIGJ5dGUgb3IgdHdvIGJhY2ssIGJ1dCB0aGlzCisgICAgICAgICMgYXQgbGVhc3QgY2hlY2tzIHRoYXQgaXQgcmVjZWl2ZWQgc29tZXRoaW5nIGFuZCBkaWRuJ3QganVzdCBmYWlsCisgICAgICAgICMgKHdoaWNoIGNvdWxkIHN0aWxsIHJlc3VsdCBpbiB0aGUgY2xpZW50IG5vdCBoYXZpbmcgcmVjZWl2ZWQgYW55dGhpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocy5idWZmZXIpID4gMCkKKworCitjbGFzcyBUZXN0QXN5bmNoYXRfV2l0aFBvbGwoVGVzdEFzeW5jaGF0KToKKyAgICB1c2Vwb2xsID0gVHJ1ZQorCitjbGFzcyBUZXN0SGVscGVyRnVuY3Rpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9maW5kX3ByZWZpeF9hdF9lbmQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN5bmNoYXQuZmluZF9wcmVmaXhfYXRfZW5kKCJxd2VydHlcciIsICJcclxuIiksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN5bmNoYXQuZmluZF9wcmVmaXhfYXRfZW5kKCJxd2VydHlka2pmIiwgIlxyXG4iKSwgMCkKKworY2xhc3MgVGVzdEZpZm8odW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBmID0gYXN5bmNoYXQuZmlmbygpCisgICAgICAgIGYucHVzaCg3KQorICAgICAgICBmLnB1c2goJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmZpcnN0KCksIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDEsIDcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmZpcnN0KCksICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmlzX2VtcHR5KCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgxLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmlzX2VtcHR5KCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDAsIE5vbmUpKQorCisgICAgZGVmIHRlc3RfZ2l2ZW5fbGlzdChzZWxmKToKKyAgICAgICAgZiA9IGFzeW5jaGF0LmZpZm8oWyd4JywgMTcsIDNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMSwgJ3gnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMSwgMTcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgxLCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMCwgTm9uZSkpCisKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdEFzeW5jaGF0LCBUZXN0QXN5bmNoYXRfV2l0aFBvbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0SGVscGVyRnVuY3Rpb25zLCBUZXN0RmlmbykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNoYXQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNoYXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhY2NiODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc3luY2hhdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNoYXQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNoYXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhY2NiODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc3luY2hhdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNvcmUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc3luY29yZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQ0NzBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNvcmUucHkKQEAgLTAsMCArMSw3NDUgQEAKK2ltcG9ydCBhc3luY29yZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc2VsZWN0CitpbXBvcnQgb3MKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCBlcnJubworaW1wb3J0IHN0cnVjdAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QsIHVubGluaworZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKwordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCisKK0hPU1QgPSB0ZXN0X3N1cHBvcnQuSE9TVAorCitjbGFzcyBkdW1teXNvY2tldDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2VkID0gRmFsc2UKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCisKKyAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICByZXR1cm4gNDIKKworY2xhc3MgZHVtbXljaGFubmVsOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zb2NrZXQgPSBkdW1teXNvY2tldCgpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKKworY2xhc3MgZXhpdGluZ2R1bW15OgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGhhbmRsZV9yZWFkX2V2ZW50KHNlbGYpOgorICAgICAgICByYWlzZSBhc3luY29yZS5FeGl0Tm93KCkKKworICAgIGhhbmRsZV93cml0ZV9ldmVudCA9IGhhbmRsZV9yZWFkX2V2ZW50CisgICAgaGFuZGxlX2Nsb3NlID0gaGFuZGxlX3JlYWRfZXZlbnQKKyAgICBoYW5kbGVfZXhwdF9ldmVudCA9IGhhbmRsZV9yZWFkX2V2ZW50CisKK2NsYXNzIGNyYXNoaW5nZHVtbXk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmVycm9yX2hhbmRsZWQgPSBGYWxzZQorCisgICAgZGVmIGhhbmRsZV9yZWFkX2V2ZW50KHNlbGYpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oKQorCisgICAgaGFuZGxlX3dyaXRlX2V2ZW50ID0gaGFuZGxlX3JlYWRfZXZlbnQKKyAgICBoYW5kbGVfY2xvc2UgPSBoYW5kbGVfcmVhZF9ldmVudAorICAgIGhhbmRsZV9leHB0X2V2ZW50ID0gaGFuZGxlX3JlYWRfZXZlbnQKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuZXJyb3JfaGFuZGxlZCA9IFRydWUKKworIyB1c2VkIHdoZW4gdGVzdGluZyBzZW5kZXJzOyBqdXN0IGNvbGxlY3RzIHdoYXQgaXQgZ2V0cyB1bnRpbCBuZXdsaW5lIGlzIHNlbnQKK2RlZiBjYXB0dXJlX3NlcnZlcihldnQsIGJ1Ziwgc2Vydik6CisgICAgdHJ5OgorICAgICAgICBzZXJ2Lmxpc3Rlbig1KQorICAgICAgICBjb25uLCBhZGRyID0gc2Vydi5hY2NlcHQoKQorICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIG4gPSAyMDAKKyAgICAgICAgd2hpbGUgbiA+IDA6CisgICAgICAgICAgICByLCB3LCBlID0gc2VsZWN0LnNlbGVjdChbY29ubl0sIFtdLCBbXSkKKyAgICAgICAgICAgIGlmIHI6CisgICAgICAgICAgICAgICAgZGF0YSA9IGNvbm4ucmVjdigxMCkKKyAgICAgICAgICAgICAgICAjIGtlZXAgZXZlcnl0aGluZyBleGNlcHQgZm9yIHRoZSBuZXdsaW5lIHRlcm1pbmF0b3IKKyAgICAgICAgICAgICAgICBidWYud3JpdGUoZGF0YS5yZXBsYWNlKCdcbicsICcnKSkKKyAgICAgICAgICAgICAgICBpZiAnXG4nIGluIGRhdGE6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBuIC09IDEKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKKworICAgICAgICBjb25uLmNsb3NlKCkKKyAgICBmaW5hbGx5OgorICAgICAgICBzZXJ2LmNsb3NlKCkKKyAgICAgICAgZXZ0LnNldCgpCisKKworY2xhc3MgSGVscGVyRnVuY3Rpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcmVhZHdyaXRlZXhjKHNlbGYpOgorICAgICAgICAjIENoZWNrIGV4Y2VwdGlvbiBoYW5kbGluZyBiZWhhdmlvciBvZiByZWFkLCB3cml0ZSBhbmQgX2V4Y2VwdGlvbgorCisgICAgICAgICMgY2hlY2sgdGhhdCBFeGl0Tm93IGV4Y2VwdGlvbnMgaW4gdGhlIG9iamVjdCBoYW5kbGVyIG1ldGhvZAorICAgICAgICAjIGJ1YmJsZXMgYWxsIHRoZSB3YXkgdXAgdGhyb3VnaCBhc3luY29yZSByZWFkL3dyaXRlL19leGNlcHRpb24gY2FsbHMKKyAgICAgICAgdHIxID0gZXhpdGluZ2R1bW15KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXN5bmNvcmUuRXhpdE5vdywgYXN5bmNvcmUucmVhZCwgdHIxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhc3luY29yZS5FeGl0Tm93LCBhc3luY29yZS53cml0ZSwgdHIxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhc3luY29yZS5FeGl0Tm93LCBhc3luY29yZS5fZXhjZXB0aW9uLCB0cjEpCisKKyAgICAgICAgIyBjaGVjayB0aGF0IGFuIGV4Y2VwdGlvbiBvdGhlciB0aGFuIEV4aXROb3cgaW4gdGhlIG9iamVjdCBoYW5kbGVyCisgICAgICAgICMgbWV0aG9kIGNhdXNlcyB0aGUgaGFuZGxlX2Vycm9yIG1ldGhvZCB0byBnZXQgY2FsbGVkCisgICAgICAgIHRyMiA9IGNyYXNoaW5nZHVtbXkoKQorICAgICAgICBhc3luY29yZS5yZWFkKHRyMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cjIuZXJyb3JfaGFuZGxlZCwgVHJ1ZSkKKworICAgICAgICB0cjIgPSBjcmFzaGluZ2R1bW15KCkKKyAgICAgICAgYXN5bmNvcmUud3JpdGUodHIyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyMi5lcnJvcl9oYW5kbGVkLCBUcnVlKQorCisgICAgICAgIHRyMiA9IGNyYXNoaW5nZHVtbXkoKQorICAgICAgICBhc3luY29yZS5fZXhjZXB0aW9uKHRyMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cjIuZXJyb3JfaGFuZGxlZCwgVHJ1ZSkKKworICAgICMgYXN5bmNvcmUucmVhZHdyaXRlIHVzZXMgY29uc3RhbnRzIGluIHRoZSBzZWxlY3QgbW9kdWxlIHRoYXQKKyAgICAjIGFyZSBub3QgcHJlc2VudCBpbiBXaW5kb3dzIHN5c3RlbXMgKHNlZSB0aGlzIHRocmVhZDoKKyAgICAjIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1saXN0LzIwMDEtT2N0b2Jlci8xMDk5NzMuaHRtbCkKKyAgICAjIFRoZXNlIGNvbnN0YW50cyBzaG91bGQgYmUgcHJlc2VudCBhcyBsb25nIGFzIHBvbGwgaXMgYXZhaWxhYmxlCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHNlbGVjdCwgJ3BvbGwnKSwgJ3NlbGVjdC5wb2xsIHJlcXVpcmVkJykKKyAgICBkZWYgdGVzdF9yZWFkd3JpdGUoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBjb3JyZWN0IG1ldGhvZHMgYXJlIGNhbGxlZCBieSByZWFkd3JpdGUoKQorCisgICAgICAgIGF0dHJpYnV0ZXMgPSAoJ3JlYWQnLCAnZXhwdCcsICd3cml0ZScsICdjbG9zZWQnLCAnZXJyb3JfaGFuZGxlZCcpCisKKyAgICAgICAgZXhwZWN0ZWQgPSAoCisgICAgICAgICAgICAoc2VsZWN0LlBPTExJTiwgJ3JlYWQnKSwKKyAgICAgICAgICAgIChzZWxlY3QuUE9MTFBSSSwgJ2V4cHQnKSwKKyAgICAgICAgICAgIChzZWxlY3QuUE9MTE9VVCwgJ3dyaXRlJyksCisgICAgICAgICAgICAoc2VsZWN0LlBPTExFUlIsICdjbG9zZWQnKSwKKyAgICAgICAgICAgIChzZWxlY3QuUE9MTEhVUCwgJ2Nsb3NlZCcpLAorICAgICAgICAgICAgKHNlbGVjdC5QT0xMTlZBTCwgJ2Nsb3NlZCcpLAorICAgICAgICAgICAgKQorCisgICAgICAgIGNsYXNzIHRlc3RvYmo6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkID0gRmFsc2UKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlID0gRmFsc2UKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgc2VsZi5leHB0ID0gRmFsc2UKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yX2hhbmRsZWQgPSBGYWxzZQorCisgICAgICAgICAgICBkZWYgaGFuZGxlX3JlYWRfZXZlbnQoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkID0gVHJ1ZQorCisgICAgICAgICAgICBkZWYgaGFuZGxlX3dyaXRlX2V2ZW50KHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUgPSBUcnVlCisKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfY2xvc2Uoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCisKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfZXhwdF9ldmVudChzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmV4cHQgPSBUcnVlCisKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVkID0gVHJ1ZQorCisgICAgICAgIGZvciBmbGFnLCBleHBlY3RlZGF0dHIgaW4gZXhwZWN0ZWQ6CisgICAgICAgICAgICB0b2JqID0gdGVzdG9iaigpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIodG9iaiwgZXhwZWN0ZWRhdHRyKSwgRmFsc2UpCisgICAgICAgICAgICBhc3luY29yZS5yZWFkd3JpdGUodG9iaiwgZmxhZykKKworICAgICAgICAgICAgIyBPbmx5IHRoZSBhdHRyaWJ1dGUgbW9kaWZpZWQgYnkgdGhlIHJvdXRpbmUgd2UgZXhwZWN0IHRvIGJlCisgICAgICAgICAgICAjIGNhbGxlZCBzaG91bGQgYmUgVHJ1ZS4KKyAgICAgICAgICAgIGZvciBhdHRyIGluIGF0dHJpYnV0ZXM6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKHRvYmosIGF0dHIpLCBhdHRyPT1leHBlY3RlZGF0dHIpCisKKyAgICAgICAgICAgICMgY2hlY2sgdGhhdCBFeGl0Tm93IGV4Y2VwdGlvbnMgaW4gdGhlIG9iamVjdCBoYW5kbGVyIG1ldGhvZAorICAgICAgICAgICAgIyBidWJibGVzIGFsbCB0aGUgd2F5IHVwIHRocm91Z2ggYXN5bmNvcmUgcmVhZHdyaXRlIGNhbGwKKyAgICAgICAgICAgIHRyMSA9IGV4aXRpbmdkdW1teSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhc3luY29yZS5FeGl0Tm93LCBhc3luY29yZS5yZWFkd3JpdGUsIHRyMSwgZmxhZykKKworICAgICAgICAgICAgIyBjaGVjayB0aGF0IGFuIGV4Y2VwdGlvbiBvdGhlciB0aGFuIEV4aXROb3cgaW4gdGhlIG9iamVjdCBoYW5kbGVyCisgICAgICAgICAgICAjIG1ldGhvZCBjYXVzZXMgdGhlIGhhbmRsZV9lcnJvciBtZXRob2QgdG8gZ2V0IGNhbGxlZAorICAgICAgICAgICAgdHIyID0gY3Jhc2hpbmdkdW1teSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyMi5lcnJvcl9oYW5kbGVkLCBGYWxzZSkKKyAgICAgICAgICAgIGFzeW5jb3JlLnJlYWR3cml0ZSh0cjIsIGZsYWcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyMi5lcnJvcl9oYW5kbGVkLCBUcnVlKQorCisgICAgZGVmIHRlc3RfY2xvc2VhbGwoc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2VhbGxfY2hlY2soRmFsc2UpCisKKyAgICBkZWYgdGVzdF9jbG9zZWFsbF9kZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlYWxsX2NoZWNrKFRydWUpCisKKyAgICBkZWYgY2xvc2VhbGxfY2hlY2soc2VsZiwgdXNlZGVmYXVsdCk6CisgICAgICAgICMgQ2hlY2sgdGhhdCBjbG9zZV9hbGwoKSBjbG9zZXMgZXZlcnl0aGluZyBpbiBhIGdpdmVuIG1hcAorCisgICAgICAgIGwgPSBbXQorICAgICAgICB0ZXN0bWFwID0ge30KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgYyA9IGR1bW15Y2hhbm5lbCgpCisgICAgICAgICAgICBsLmFwcGVuZChjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnNvY2tldC5jbG9zZWQsIEZhbHNlKQorICAgICAgICAgICAgdGVzdG1hcFtpXSA9IGMKKworICAgICAgICBpZiB1c2VkZWZhdWx0OgorICAgICAgICAgICAgc29ja2V0bWFwID0gYXN5bmNvcmUuc29ja2V0X21hcAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGFzeW5jb3JlLnNvY2tldF9tYXAgPSB0ZXN0bWFwCisgICAgICAgICAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdGVzdG1hcCwgYXN5bmNvcmUuc29ja2V0X21hcCA9IGFzeW5jb3JlLnNvY2tldF9tYXAsIHNvY2tldG1hcAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKHRlc3RtYXApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGVzdG1hcCksIDApCisKKyAgICAgICAgZm9yIGMgaW4gbDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zb2NrZXQuY2xvc2VkLCBUcnVlKQorCisgICAgZGVmIHRlc3RfY29tcGFjdF90cmFjZWJhY2soc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiSSBkb24ndCBsaWtlIHNwYW0hIikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmVhbF90LCByZWFsX3YsIHJlYWxfdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgciA9IGFzeW5jb3JlLmNvbXBhY3RfdHJhY2ViYWNrKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKworICAgICAgICAoZiwgZnVuY3Rpb24sIGxpbmUpLCB0LCB2LCBpbmZvID0gcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguc3BsaXQoZilbLTFdLCAndGVzdF9hc3luY29yZS5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuY3Rpb24sICd0ZXN0X2NvbXBhY3RfdHJhY2ViYWNrJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCByZWFsX3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgcmVhbF92KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm8sICdbJXN8JXN8JXNdJyAlIChmLCBmdW5jdGlvbiwgbGluZSkpCisKKworY2xhc3MgRGlzcGF0Y2hlclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKCkKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBkID0gYXN5bmNvcmUuZGlzcGF0Y2hlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5yZWFkYWJsZSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQud3JpdGFibGUoKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIGQgPSBhc3luY29yZS5kaXNwYXRjaGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQpLCAnPGFzeW5jb3JlLmRpc3BhdGNoZXIgYXQgJSN4PicgJSBpZChkKSkKKworICAgIGRlZiB0ZXN0X2xvZyhzZWxmKToKKyAgICAgICAgZCA9IGFzeW5jb3JlLmRpc3BhdGNoZXIoKQorCisgICAgICAgICMgY2FwdHVyZSBvdXRwdXQgb2YgZGlzcGF0Y2hlci5sb2coKSAodG8gc3RkZXJyKQorICAgICAgICBmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgc3RkZXJyID0gc3lzLnN0ZGVycgorICAgICAgICBsMSA9ICJMb3ZlbHkgc3BhbSEgV29uZGVyZnVsIHNwYW0hIgorICAgICAgICBsMiA9ICJJIGRvbid0IGxpa2Ugc3BhbSEiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBmcAorICAgICAgICAgICAgZC5sb2cobDEpCisgICAgICAgICAgICBkLmxvZyhsMikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzdGRlcnIKKworICAgICAgICBsaW5lcyA9IGZwLmdldHZhbHVlKCkuc3BsaXRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMsIFsnbG9nOiAlcycgJSBsMSwgJ2xvZzogJXMnICUgbDJdKQorCisgICAgZGVmIHRlc3RfbG9nX2luZm8oc2VsZik6CisgICAgICAgIGQgPSBhc3luY29yZS5kaXNwYXRjaGVyKCkKKworICAgICAgICAjIGNhcHR1cmUgb3V0cHV0IG9mIGRpc3BhdGNoZXIubG9nX2luZm8oKSAodG8gc3Rkb3V0IHZpYSBwcmludCkKKyAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgIHN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgbDEgPSAiSGF2ZSB5b3UgZ290IGFueXRoaW5nIHdpdGhvdXQgc3BhbT8iCisgICAgICAgIGwyID0gIldoeSBjYW4ndCBzaGUgaGF2ZSBlZ2cgYmFjb24gc3BhbSBhbmQgc2F1c2FnZT8iCisgICAgICAgIGwzID0gIlRIQVQnUyBnb3Qgc3BhbSBpbiBpdCEiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBmcAorICAgICAgICAgICAgZC5sb2dfaW5mbyhsMSwgJ0VHR1MnKQorICAgICAgICAgICAgZC5sb2dfaW5mbyhsMikKKyAgICAgICAgICAgIGQubG9nX2luZm8obDMsICdTUEFNJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzdGRvdXQKKworICAgICAgICBsaW5lcyA9IGZwLmdldHZhbHVlKCkuc3BsaXRsaW5lcygpCisgICAgICAgIGV4cGVjdGVkID0gWydFR0dTOiAlcycgJSBsMSwgJ2luZm86ICVzJyAlIGwyLCAnU1BBTTogJXMnICUgbDNdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lcywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF91bmhhbmRsZWQoc2VsZik6CisgICAgICAgIGQgPSBhc3luY29yZS5kaXNwYXRjaGVyKCkKKyAgICAgICAgZC5pZ25vcmVfbG9nX3R5cGVzID0gKCkKKworICAgICAgICAjIGNhcHR1cmUgb3V0cHV0IG9mIGRpc3BhdGNoZXIubG9nX2luZm8oKSAodG8gc3Rkb3V0IHZpYSBwcmludCkKKyAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgIHN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IGZwCisgICAgICAgICAgICBkLmhhbmRsZV9leHB0KCkKKyAgICAgICAgICAgIGQuaGFuZGxlX3JlYWQoKQorICAgICAgICAgICAgZC5oYW5kbGVfd3JpdGUoKQorICAgICAgICAgICAgZC5oYW5kbGVfY29ubmVjdCgpCisgICAgICAgICAgICBkLmhhbmRsZV9hY2NlcHQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN0ZG91dAorCisgICAgICAgIGxpbmVzID0gZnAuZ2V0dmFsdWUoKS5zcGxpdGxpbmVzKCkKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ3dhcm5pbmc6IHVuaGFuZGxlZCBpbmNvbWluZyBwcmlvcml0eSBldmVudCcsCisgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nOiB1bmhhbmRsZWQgcmVhZCBldmVudCcsCisgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nOiB1bmhhbmRsZWQgd3JpdGUgZXZlbnQnLAorICAgICAgICAgICAgICAgICAgICAnd2FybmluZzogdW5oYW5kbGVkIGNvbm5lY3QgZXZlbnQnLAorICAgICAgICAgICAgICAgICAgICAnd2FybmluZzogdW5oYW5kbGVkIGFjY2VwdCBldmVudCddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfaXNzdWVfODU5NChzZWxmKToKKyAgICAgICAgIyBYWFggLSB0aGlzIHRlc3QgaXMgc3VwcG9zZWQgdG8gYmUgcmVtb3ZlZCBpbiBuZXh0IG1ham9yIFB5dGhvbgorICAgICAgICAjIHZlcnNpb24KKyAgICAgICAgZCA9IGFzeW5jb3JlLmRpc3BhdGNoZXIoc29ja2V0LnNvY2tldCgpKQorICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgZXJyb3IgbWVzc2FnZSBubyBsb25nZXIgcmVmZXJzIHRvIHRoZSBzb2NrZXQKKyAgICAgICAgIyBvYmplY3QgYnV0IHRoZSBkaXNwYXRjaGVyIGluc3RhbmNlIGluc3RlYWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoQXR0cmlidXRlRXJyb3IsICdkaXNwYXRjaGVyIGluc3RhbmNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0ciwgZCwgJ2ZvbycpCisgICAgICAgICMgY2hlYXAgaW5oZXJpdGFuY2Ugd2l0aCB0aGUgdW5kZXJseWluZyBzb2NrZXQgaXMgc3VwcG9zZWQKKyAgICAgICAgIyB0byBzdGlsbCB3b3JrIGJ1dCBhIERlcHJlY2F0aW9uV2FybmluZyBpcyBleHBlY3RlZAorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJhbHdheXMiKQorICAgICAgICAgICAgZmFtaWx5ID0gZC5mYW1pbHkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmFtaWx5LCBzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Mod1swXS5jYXRlZ29yeSwgRGVwcmVjYXRpb25XYXJuaW5nKSkKKworICAgIGRlZiB0ZXN0X3N0cmVycm9yKHNlbGYpOgorICAgICAgICAjIHJlZmVycyB0byBidWcgIzg1NzMKKyAgICAgICAgZXJyID0gYXN5bmNvcmUuX3N0cmVycm9yKGVycm5vLkVQRVJNKQorICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc3RyZXJyb3InKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBvcy5zdHJlcnJvcihlcnJuby5FUEVSTSkpCisgICAgICAgIGVyciA9IGFzeW5jb3JlLl9zdHJlcnJvcigtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVyciAhPSAiIikKKworCitjbGFzcyBkaXNwYXRjaGVyd2l0aHNlbmRfbm9yZWFkKGFzeW5jb3JlLmRpc3BhdGNoZXJfd2l0aF9zZW5kKToKKyAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGhhbmRsZV9jb25uZWN0KHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIERpc3BhdGNoZXJXaXRoU2VuZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICB1c2Vwb2xsID0gRmFsc2UKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBhc3luY29yZS5jbG9zZV9hbGwoKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBAdGVzdF9zdXBwb3J0LnJlYXBfdGhyZWFkcworICAgIGRlZiB0ZXN0X3NlbmQoc2VsZik6CisgICAgICAgIGV2dCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNvY2suc2V0dGltZW91dCgzKQorICAgICAgICBwb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzb2NrKQorCisgICAgICAgIGNhcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgYXJncyA9IChldnQsIGNhcCwgc29jaykKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWNhcHR1cmVfc2VydmVyLCBhcmdzPWFyZ3MpCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHdhaXQgYSBsaXR0bGUgbG9uZ2VyIGZvciB0aGUgc2VydmVyIHRvIGluaXRpYWxpemUgKGl0IHNvbWV0aW1lcworICAgICAgICAgICAgIyByZWZ1c2VzIGNvbm5lY3Rpb25zIG9uIHNsb3cgbWFjaGluZXMgd2l0aG91dCB0aGlzIHdhaXQpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMikKKworICAgICAgICAgICAgZGF0YSA9ICJTdXBwb3NlIHRoZXJlIGlzbid0IGEgMTYtdG9uIHdlaWdodD8iCisgICAgICAgICAgICBkID0gZGlzcGF0Y2hlcndpdGhzZW5kX25vcmVhZCgpCisgICAgICAgICAgICBkLmNyZWF0ZV9zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgIGQuY29ubmVjdCgoSE9TVCwgcG9ydCkpCisKKyAgICAgICAgICAgICMgZ2l2ZSB0aW1lIGZvciBzb2NrZXQgdG8gY29ubmVjdAorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisKKyAgICAgICAgICAgIGQuc2VuZChkYXRhKQorICAgICAgICAgICAgZC5zZW5kKGRhdGEpCisgICAgICAgICAgICBkLnNlbmQoJ1xuJykKKworICAgICAgICAgICAgbiA9IDEwMDAKKyAgICAgICAgICAgIHdoaWxlIGQub3V0X2J1ZmZlciBhbmQgbiA+IDA6CisgICAgICAgICAgICAgICAgYXN5bmNvcmUucG9sbCgpCisgICAgICAgICAgICAgICAgbiAtPSAxCisKKyAgICAgICAgICAgIGV2dC53YWl0KCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXAuZ2V0dmFsdWUoKSwgZGF0YSoyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdC5qb2luKCkKKworCitjbGFzcyBEaXNwYXRjaGVyV2l0aFNlbmRUZXN0c19Vc2VQb2xsKERpc3BhdGNoZXJXaXRoU2VuZFRlc3RzKToKKyAgICB1c2Vwb2xsID0gVHJ1ZQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKGFzeW5jb3JlLCAnZmlsZV93cmFwcGVyJyksCisgICAgICAgICAgICAgICAgICAgICAnYXN5bmNvcmUuZmlsZV93cmFwcGVyIHJlcXVpcmVkJykKK2NsYXNzIEZpbGVXcmFwcGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmQgPSAiSXQncyBub3QgZGVhZCwgaXQncyBzbGVlcGluZyEiCisgICAgICAgIHdpdGggZmlsZShURVNURk4sICd3JykgYXMgaDoKKyAgICAgICAgICAgIGgud3JpdGUoc2VsZi5kKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB1bmxpbmsoVEVTVEZOKQorCisgICAgZGVmIHRlc3RfcmVjdihzZWxmKToKKyAgICAgICAgZmQgPSBvcy5vcGVuKFRFU1RGTiwgb3MuT19SRE9OTFkpCisgICAgICAgIHcgPSBhc3luY29yZS5maWxlX3dyYXBwZXIoZmQpCisgICAgICAgIG9zLmNsb3NlKGZkKQorCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwody5mZCwgZmQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwody5maWxlbm8oKSwgZmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwody5yZWN2KDEzKSwgIkl0J3Mgbm90IGRlYWQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcucmVhZCg2KSwgIiwgaXQncyIpCisgICAgICAgIHcuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCB3LnJlYWQsIDEpCisKKworICAgIGRlZiB0ZXN0X3NlbmQoc2VsZik6CisgICAgICAgIGQxID0gIkNvbWUgYWdhaW4/IgorICAgICAgICBkMiA9ICJJIHdhbnQgdG8gYnV5IHNvbWUgY2hlZXNlLiIKKyAgICAgICAgZmQgPSBvcy5vcGVuKFRFU1RGTiwgb3MuT19XUk9OTFkgfCBvcy5PX0FQUEVORCkKKyAgICAgICAgdyA9IGFzeW5jb3JlLmZpbGVfd3JhcHBlcihmZCkKKyAgICAgICAgb3MuY2xvc2UoZmQpCisKKyAgICAgICAgdy53cml0ZShkMSkKKyAgICAgICAgdy5zZW5kKGQyKQorICAgICAgICB3LmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlKFRFU1RGTikucmVhZCgpLCBzZWxmLmQgKyBkMSArIGQyKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihhc3luY29yZSwgJ2ZpbGVfZGlzcGF0Y2hlcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdhc3luY29yZS5maWxlX2Rpc3BhdGNoZXIgcmVxdWlyZWQnKQorICAgIGRlZiB0ZXN0X2Rpc3BhdGNoZXIoc2VsZik6CisgICAgICAgIGZkID0gb3Mub3BlbihURVNURk4sIG9zLk9fUkRPTkxZKQorICAgICAgICBkYXRhID0gW10KKyAgICAgICAgY2xhc3MgRmlsZURpc3BhdGNoZXIoYXN5bmNvcmUuZmlsZV9kaXNwYXRjaGVyKToKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfcmVhZChzZWxmKToKKyAgICAgICAgICAgICAgICBkYXRhLmFwcGVuZChzZWxmLnJlY3YoMjkpKQorICAgICAgICBzID0gRmlsZURpc3BhdGNoZXIoZmQpCisgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICBhc3luY29yZS5sb29wKHRpbWVvdXQ9MC4wMSwgdXNlX3BvbGw9VHJ1ZSwgY291bnQ9MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIiIuam9pbihkYXRhKSwgc2VsZi5kKQorCisKK2NsYXNzIEJhc2VUZXN0SGFuZGxlcihhc3luY29yZS5kaXNwYXRjaGVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NrPU5vbmUpOgorICAgICAgICBhc3luY29yZS5kaXNwYXRjaGVyLl9faW5pdF9fKHNlbGYsIHNvY2spCisgICAgICAgIHNlbGYuZmxhZyA9IEZhbHNlCisKKyAgICBkZWYgaGFuZGxlX2FjY2VwdChzZWxmKToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJoYW5kbGVfYWNjZXB0IG5vdCBzdXBwb3NlZCB0byBiZSBjYWxsZWQiKQorCisgICAgZGVmIGhhbmRsZV9jb25uZWN0KHNlbGYpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oImhhbmRsZV9jb25uZWN0IG5vdCBzdXBwb3NlZCB0byBiZSBjYWxsZWQiKQorCisgICAgZGVmIGhhbmRsZV9leHB0KHNlbGYpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oImhhbmRsZV9leHB0IG5vdCBzdXBwb3NlZCB0byBiZSBjYWxsZWQiKQorCisgICAgZGVmIGhhbmRsZV9jbG9zZShzZWxmKToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJoYW5kbGVfY2xvc2Ugbm90IHN1cHBvc2VkIHRvIGJlIGNhbGxlZCIpCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICByYWlzZQorCisKK2NsYXNzIFRDUFNlcnZlcihhc3luY29yZS5kaXNwYXRjaGVyKToKKyAgICAiIiJBIHNlcnZlciB3aGljaCBsaXN0ZW5zIG9uIGFuIGFkZHJlc3MgYW5kIGRpc3BhdGNoZXMgdGhlCisgICAgY29ubmVjdGlvbiB0byBhIGhhbmRsZXIuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGFuZGxlcj1CYXNlVGVzdEhhbmRsZXIsIGhvc3Q9SE9TVCwgcG9ydD0wKToKKyAgICAgICAgYXN5bmNvcmUuZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZV9zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5zZXRfcmV1c2VfYWRkcigpCisgICAgICAgIHNlbGYuYmluZCgoaG9zdCwgcG9ydCkpCisgICAgICAgIHNlbGYubGlzdGVuKDUpCisgICAgICAgIHNlbGYuaGFuZGxlciA9IGhhbmRsZXIKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBhZGRyZXNzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zb2NrZXQuZ2V0c29ja25hbWUoKVs6Ml0KKworICAgIGRlZiBoYW5kbGVfYWNjZXB0KHNlbGYpOgorICAgICAgICBwYWlyID0gc2VsZi5hY2NlcHQoKQorICAgICAgICBpZiBwYWlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVyKHBhaXJbMF0pCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICByYWlzZQorCisKK2NsYXNzIEJhc2VDbGllbnQoQmFzZVRlc3RIYW5kbGVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzKToKKyAgICAgICAgQmFzZVRlc3RIYW5kbGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuY3JlYXRlX3NvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLmNvbm5lY3QoYWRkcmVzcykKKworICAgIGRlZiBoYW5kbGVfY29ubmVjdChzZWxmKToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIEJhc2VUZXN0QVBJKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKCkKKworICAgIGRlZiBsb29wX3dhaXRpbmdfZm9yX2ZsYWcoc2VsZiwgaW5zdGFuY2UsIHRpbWVvdXQ9NSk6CisgICAgICAgIHRpbWVvdXQgPSBmbG9hdCh0aW1lb3V0KSAvIDEwMAorICAgICAgICBjb3VudCA9IDEwMAorICAgICAgICB3aGlsZSBhc3luY29yZS5zb2NrZXRfbWFwIGFuZCBjb3VudCA+IDA6CisgICAgICAgICAgICBhc3luY29yZS5sb29wKHRpbWVvdXQ9MC4wMSwgY291bnQ9MSwgdXNlX3BvbGw9c2VsZi51c2VfcG9sbCkKKyAgICAgICAgICAgIGlmIGluc3RhbmNlLmZsYWc6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBjb3VudCAtPSAxCisgICAgICAgICAgICB0aW1lLnNsZWVwKHRpbWVvdXQpCisgICAgICAgIHNlbGYuZmFpbCgiZmxhZyBub3Qgc2V0IikKKworICAgIGRlZiB0ZXN0X2hhbmRsZV9jb25uZWN0KHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSBoYW5kbGVfY29ubmVjdCBpcyBjYWxsZWQgb24gY29ubmVjdCgpCisKKyAgICAgICAgY2xhc3MgVGVzdENsaWVudChCYXNlQ2xpZW50KToKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfY29ubmVjdChzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmZsYWcgPSBUcnVlCisKKyAgICAgICAgc2VydmVyID0gVENQU2VydmVyKCkKKyAgICAgICAgY2xpZW50ID0gVGVzdENsaWVudChzZXJ2ZXIuYWRkcmVzcykKKyAgICAgICAgc2VsZi5sb29wX3dhaXRpbmdfZm9yX2ZsYWcoY2xpZW50KQorCisgICAgZGVmIHRlc3RfaGFuZGxlX2FjY2VwdChzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgaGFuZGxlX2FjY2VwdCgpIGlzIGNhbGxlZCB3aGVuIGEgY2xpZW50IGNvbm5lY3RzCisKKyAgICAgICAgY2xhc3MgVGVzdExpc3RlbmVyKEJhc2VUZXN0SGFuZGxlcik6CisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBCYXNlVGVzdEhhbmRsZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgICAgICBzZWxmLmJpbmQoKEhPU1QsIDApKQorICAgICAgICAgICAgICAgIHNlbGYubGlzdGVuKDUpCisgICAgICAgICAgICAgICAgc2VsZi5hZGRyZXNzID0gc2VsZi5zb2NrZXQuZ2V0c29ja25hbWUoKVs6Ml0KKworICAgICAgICAgICAgZGVmIGhhbmRsZV9hY2NlcHQoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5mbGFnID0gVHJ1ZQorCisgICAgICAgIHNlcnZlciA9IFRlc3RMaXN0ZW5lcigpCisgICAgICAgIGNsaWVudCA9IEJhc2VDbGllbnQoc2VydmVyLmFkZHJlc3MpCisgICAgICAgIHNlbGYubG9vcF93YWl0aW5nX2Zvcl9mbGFnKHNlcnZlcikKKworICAgIGRlZiB0ZXN0X2hhbmRsZV9yZWFkKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSBoYW5kbGVfcmVhZCBpcyBjYWxsZWQgb24gZGF0YSByZWNlaXZlZAorCisgICAgICAgIGNsYXNzIFRlc3RDbGllbnQoQmFzZUNsaWVudCk6CisgICAgICAgICAgICBkZWYgaGFuZGxlX3JlYWQoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5mbGFnID0gVHJ1ZQorCisgICAgICAgIGNsYXNzIFRlc3RIYW5kbGVyKEJhc2VUZXN0SGFuZGxlcik6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubik6CisgICAgICAgICAgICAgICAgQmFzZVRlc3RIYW5kbGVyLl9faW5pdF9fKHNlbGYsIGNvbm4pCisgICAgICAgICAgICAgICAgc2VsZi5zZW5kKCd4JyAqIDEwMjQpCisKKyAgICAgICAgc2VydmVyID0gVENQU2VydmVyKFRlc3RIYW5kbGVyKQorICAgICAgICBjbGllbnQgPSBUZXN0Q2xpZW50KHNlcnZlci5hZGRyZXNzKQorICAgICAgICBzZWxmLmxvb3Bfd2FpdGluZ19mb3JfZmxhZyhjbGllbnQpCisKKyAgICBkZWYgdGVzdF9oYW5kbGVfd3JpdGUoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIGhhbmRsZV93cml0ZSBpcyBjYWxsZWQKKworICAgICAgICBjbGFzcyBUZXN0Q2xpZW50KEJhc2VDbGllbnQpOgorICAgICAgICAgICAgZGVmIGhhbmRsZV93cml0ZShzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmZsYWcgPSBUcnVlCisKKyAgICAgICAgc2VydmVyID0gVENQU2VydmVyKCkKKyAgICAgICAgY2xpZW50ID0gVGVzdENsaWVudChzZXJ2ZXIuYWRkcmVzcykKKyAgICAgICAgc2VsZi5sb29wX3dhaXRpbmdfZm9yX2ZsYWcoY2xpZW50KQorCisgICAgZGVmIHRlc3RfaGFuZGxlX2Nsb3NlKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSBoYW5kbGVfY2xvc2UgaXMgY2FsbGVkIHdoZW4gdGhlIG90aGVyIGVuZCBjbG9zZXMKKyAgICAgICAgIyB0aGUgY29ubmVjdGlvbgorCisgICAgICAgIGNsYXNzIFRlc3RDbGllbnQoQmFzZUNsaWVudCk6CisKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfcmVhZChzZWxmKToKKyAgICAgICAgICAgICAgICAjIGluIG9yZGVyIHRvIG1ha2UgaGFuZGxlX2Nsb3NlIGJlIGNhbGxlZCB3ZSBhcmUgc3VwcG9zZWQKKyAgICAgICAgICAgICAgICAjIHRvIG1ha2UgYXQgbGVhc3Qgb25lIHJlY3YoKSBjYWxsCisgICAgICAgICAgICAgICAgc2VsZi5yZWN2KDEwMjQpCisKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfY2xvc2Uoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5mbGFnID0gVHJ1ZQorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgICAgIGNsYXNzIFRlc3RIYW5kbGVyKEJhc2VUZXN0SGFuZGxlcik6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubik6CisgICAgICAgICAgICAgICAgQmFzZVRlc3RIYW5kbGVyLl9faW5pdF9fKHNlbGYsIGNvbm4pCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICAgICAgc2VydmVyID0gVENQU2VydmVyKFRlc3RIYW5kbGVyKQorICAgICAgICBjbGllbnQgPSBUZXN0Q2xpZW50KHNlcnZlci5hZGRyZXNzKQorICAgICAgICBzZWxmLmxvb3Bfd2FpdGluZ19mb3JfZmxhZyhjbGllbnQpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJzdW5vcyIpLAorICAgICAgICAgICAgICAgICAgICAgIk9PQiBzdXBwb3J0IGlzIGJyb2tlbiBvbiBTb2xhcmlzIikKKyAgICBkZWYgdGVzdF9oYW5kbGVfZXhwdChzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgaGFuZGxlX2V4cHQgaXMgY2FsbGVkIG9uIE9PQiBkYXRhIHJlY2VpdmVkLgorICAgICAgICAjIE5vdGU6IHRoaXMgbWlnaHQgZmFpbCBvbiBzb21lIHBsYXRmb3JtcyBhcyBPT0IgZGF0YSBpcworICAgICAgICAjIHRlbnVvdXNseSBzdXBwb3J0ZWQgYW5kIHJhcmVseSB1c2VkLgorCisgICAgICAgIGNsYXNzIFRlc3RDbGllbnQoQmFzZUNsaWVudCk6CisgICAgICAgICAgICBkZWYgaGFuZGxlX2V4cHQoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5mbGFnID0gVHJ1ZQorCisgICAgICAgIGNsYXNzIFRlc3RIYW5kbGVyKEJhc2VUZXN0SGFuZGxlcik6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubik6CisgICAgICAgICAgICAgICAgQmFzZVRlc3RIYW5kbGVyLl9faW5pdF9fKHNlbGYsIGNvbm4pCisgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuc2VuZChjaHIoMjQ0KSwgc29ja2V0Lk1TR19PT0IpCisKKyAgICAgICAgc2VydmVyID0gVENQU2VydmVyKFRlc3RIYW5kbGVyKQorICAgICAgICBjbGllbnQgPSBUZXN0Q2xpZW50KHNlcnZlci5hZGRyZXNzKQorICAgICAgICBzZWxmLmxvb3Bfd2FpdGluZ19mb3JfZmxhZyhjbGllbnQpCisKKyAgICBkZWYgdGVzdF9oYW5kbGVfZXJyb3Ioc2VsZik6CisKKyAgICAgICAgY2xhc3MgVGVzdENsaWVudChCYXNlQ2xpZW50KToKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfd3JpdGUoc2VsZik6CisgICAgICAgICAgICAgICAgMS4wIC8gMAorICAgICAgICAgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmZsYWcgPSBUcnVlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiZXhjZXB0aW9uIG5vdCByYWlzZWQiKQorCisgICAgICAgIHNlcnZlciA9IFRDUFNlcnZlcigpCisgICAgICAgIGNsaWVudCA9IFRlc3RDbGllbnQoc2VydmVyLmFkZHJlc3MpCisgICAgICAgIHNlbGYubG9vcF93YWl0aW5nX2Zvcl9mbGFnKGNsaWVudCkKKworICAgIGRlZiB0ZXN0X2Nvbm5lY3Rpb25fYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgc2VydmVyID0gVENQU2VydmVyKCkKKyAgICAgICAgY2xpZW50ID0gQmFzZUNsaWVudChzZXJ2ZXIuYWRkcmVzcykKKworICAgICAgICAjIHdlIHN0YXJ0IGRpc2Nvbm5lY3RlZAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlcnZlci5jb25uZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXJ2ZXIuYWNjZXB0aW5nKQorICAgICAgICAjIHRoaXMgY2FuJ3QgYmUgdGFrZW4gZm9yIGdyYW50ZWQgYWNyb3NzIGFsbCBwbGF0Zm9ybXMKKyAgICAgICAgI3NlbGYuYXNzZXJ0RmFsc2UoY2xpZW50LmNvbm5lY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbGllbnQuYWNjZXB0aW5nKQorCisgICAgICAgICMgZXhlY3V0ZSBzb21lIGxvb3BzIHNvIHRoYXQgY2xpZW50IGNvbm5lY3RzIHRvIHNlcnZlcgorICAgICAgICBhc3luY29yZS5sb29wKHRpbWVvdXQ9MC4wMSwgdXNlX3BvbGw9c2VsZi51c2VfcG9sbCwgY291bnQ9MTAwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlcnZlci5jb25uZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXJ2ZXIuYWNjZXB0aW5nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xpZW50LmNvbm5lY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbGllbnQuYWNjZXB0aW5nKQorCisgICAgICAgICMgZGlzY29ubmVjdCB0aGUgY2xpZW50CisgICAgICAgIGNsaWVudC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VydmVyLmNvbm5lY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlcnZlci5hY2NlcHRpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2xpZW50LmNvbm5lY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbGllbnQuYWNjZXB0aW5nKQorCisgICAgICAgICMgc3RvcCBzZXJ2aW5nCisgICAgICAgIHNlcnZlci5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VydmVyLmNvbm5lY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZXJ2ZXIuYWNjZXB0aW5nKQorCisgICAgZGVmIHRlc3RfY3JlYXRlX3NvY2tldChzZWxmKToKKyAgICAgICAgcyA9IGFzeW5jb3JlLmRpc3BhdGNoZXIoKQorICAgICAgICBzLmNyZWF0ZV9zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnNvY2tldC5mYW1pbHksIHNvY2tldC5BRl9JTkVUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc29ja2V0LnR5cGUsIHNvY2tldC5TT0NLX1NUUkVBTSkKKworICAgIGRlZiB0ZXN0X2JpbmQoc2VsZik6CisgICAgICAgIHMxID0gYXN5bmNvcmUuZGlzcGF0Y2hlcigpCisgICAgICAgIHMxLmNyZWF0ZV9zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgczEuYmluZCgoSE9TVCwgMCkpCisgICAgICAgIHMxLmxpc3Rlbig1KQorICAgICAgICBwb3J0ID0gczEuc29ja2V0LmdldHNvY2tuYW1lKClbMV0KKworICAgICAgICBzMiA9IGFzeW5jb3JlLmRpc3BhdGNoZXIoKQorICAgICAgICBzMi5jcmVhdGVfc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICMgRUFERFJJTlVTRSBpbmRpY2F0ZXMgdGhlIHNvY2tldCB3YXMgY29ycmVjdGx5IGJvdW5kCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgczIuYmluZCwgKEhPU1QsIHBvcnQpKQorCisgICAgZGVmIHRlc3Rfc2V0X3JldXNlX2FkZHIoc2VsZik6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgdW5pdHRlc3Quc2tpcCgiU09fUkVVU0VBRERSIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGlmIFNPX1JFVVNFQUREUiBzdWNjZWVkZWQgZm9yIHNvY2sgd2UgZXhwZWN0IGFzeW5jb3JlCisgICAgICAgICAgICAjIHRvIGRvIHRoZSBzYW1lCisgICAgICAgICAgICBzID0gYXN5bmNvcmUuZGlzcGF0Y2hlcihzb2NrZXQuc29ja2V0KCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuc29ja2V0LmdldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LlNPX1JFVVNFQUREUikpCisgICAgICAgICAgICBzLmNyZWF0ZV9zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgIHMuc2V0X3JldXNlX2FkZHIoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc29ja2V0LmdldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LlNPX1JFVVNFQUREUikpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrLmNsb3NlKCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCisgICAgQHRlc3Rfc3VwcG9ydC5yZWFwX3RocmVhZHMKKyAgICBkZWYgdGVzdF9xdWlja19jb25uZWN0KHNlbGYpOgorICAgICAgICAjIHNlZTogaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEwMzQwCisgICAgICAgIHNlcnZlciA9IFRDUFNlcnZlcigpCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1sYW1iZGE6IGFzeW5jb3JlLmxvb3AodGltZW91dD0wLjEsIGNvdW50PTUwMCkpCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAodC5qb2luKQorCisgICAgICAgIGZvciB4IGluIHhyYW5nZSgyMCk6CisgICAgICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICAgICAgcy5zZXR0aW1lb3V0KC4yKQorICAgICAgICAgICAgcy5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fTElOR0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5wYWNrKCdpaScsIDEsIDApKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHMuY29ubmVjdChzZXJ2ZXIuYWRkcmVzcykKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKworCitjbGFzcyBUZXN0QVBJX1VzZVNlbGVjdChCYXNlVGVzdEFQSSk6CisgICAgdXNlX3BvbGwgPSBGYWxzZQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHNlbGVjdCwgJ3BvbGwnKSwgJ3NlbGVjdC5wb2xsIHJlcXVpcmVkJykKK2NsYXNzIFRlc3RBUElfVXNlUG9sbChCYXNlVGVzdEFQSSk6CisgICAgdXNlX3BvbGwgPSBUcnVlCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3RzID0gW0hlbHBlckZ1bmN0aW9uVGVzdHMsIERpc3BhdGNoZXJUZXN0cywgRGlzcGF0Y2hlcldpdGhTZW5kVGVzdHMsCisgICAgICAgICAgICAgRGlzcGF0Y2hlcldpdGhTZW5kVGVzdHNfVXNlUG9sbCwgVGVzdEFQSV9Vc2VTZWxlY3QsCisgICAgICAgICAgICAgVGVzdEFQSV9Vc2VQb2xsLCBGaWxlV3JhcHBlclRlc3RdCisgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNvcmUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNvcmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjM2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc3luY29yZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNvcmUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNvcmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjM2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc3luY29yZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXRleGl0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXRleGl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmODViNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hdGV4aXQucHkKQEAgLTAsMCArMSw4MiBAQAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBhdGV4aXQKK2Zyb20gaW1wIGltcG9ydCByZWxvYWQKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHNlbGYuc2F2ZV9zdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuc3RkZXJyID0gc2VsZi5zdWJzdF9pbyA9IHMKKyAgICAgICAgc2VsZi5zYXZlX2hhbmRsZXJzID0gYXRleGl0Ll9leGl0aGFuZGxlcnMKKyAgICAgICAgYXRleGl0Ll9leGl0aGFuZGxlcnMgPSBbXQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5zYXZlX3N0ZG91dAorICAgICAgICBzeXMuc3RkZXJyID0gc2VsZi5zYXZlX3N0ZGVycgorICAgICAgICBhdGV4aXQuX2V4aXRoYW5kbGVycyA9IHNlbGYuc2F2ZV9oYW5kbGVycworCisgICAgZGVmIHRlc3RfYXJncyhzZWxmKToKKyAgICAgICAgYXRleGl0LnJlZ2lzdGVyKHNlbGYuaDEpCisgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihzZWxmLmg0KQorICAgICAgICBhdGV4aXQucmVnaXN0ZXIoc2VsZi5oNCwgNCwga3c9ImFiYyIpCisgICAgICAgIGF0ZXhpdC5fcnVuX2V4aXRmdW5jcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdWJzdF9pby5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJoNCAoNCwpIHsna3cnOiAnYWJjJ31cbmg0ICgpIHt9XG5oMVxuIikKKworICAgIGRlZiB0ZXN0X2JhZGFyZ3Moc2VsZik6CisgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihsYW1iZGE6IDEsIDAsIDAsICh4IGZvciB4IGluICgxLDIpKSwgMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhdGV4aXQuX3J1bl9leGl0ZnVuY3MpCisKKyAgICBkZWYgdGVzdF9vcmRlcihzZWxmKToKKyAgICAgICAgYXRleGl0LnJlZ2lzdGVyKHNlbGYuaDEpCisgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihzZWxmLmgyKQorICAgICAgICBhdGV4aXQucmVnaXN0ZXIoc2VsZi5oMykKKyAgICAgICAgYXRleGl0Ll9ydW5fZXhpdGZ1bmNzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN1YnN0X2lvLmdldHZhbHVlKCksICJoM1xuaDJcbmgxXG4iKQorCisgICAgZGVmIHRlc3Rfc3lzX292ZXJyaWRlKHNlbGYpOgorICAgICAgICAjIGJlIHN1cmUgYSBwcmVzZXQgc3lzLmV4aXRmdW5jIGlzIGhhbmRsZWQgcHJvcGVybHkKKyAgICAgICAgZXhmdW5jID0gc3lzLmV4aXRmdW5jCisgICAgICAgIHN5cy5leGl0ZnVuYyA9IHNlbGYuaDEKKyAgICAgICAgcmVsb2FkKGF0ZXhpdCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXRleGl0LnJlZ2lzdGVyKHNlbGYuaDIpCisgICAgICAgICAgICBhdGV4aXQuX3J1bl9leGl0ZnVuY3MoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLmV4aXRmdW5jID0gZXhmdW5jCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdWJzdF9pby5nZXR2YWx1ZSgpLCAiaDJcbmgxXG4iKQorCisgICAgZGVmIHRlc3RfcmFpc2Uoc2VsZik6CisgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihzZWxmLnJhaXNlMSkKKyAgICAgICAgYXRleGl0LnJlZ2lzdGVyKHNlbGYucmFpc2UyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGF0ZXhpdC5fcnVuX2V4aXRmdW5jcykKKworICAgICMjIyBoZWxwZXJzCisgICAgZGVmIGgxKHNlbGYpOgorICAgICAgICBwcmludCAiaDEiCisKKyAgICBkZWYgaDIoc2VsZik6CisgICAgICAgIHByaW50ICJoMiIKKworICAgIGRlZiBoMyhzZWxmKToKKyAgICAgICAgcHJpbnQgImgzIgorCisgICAgZGVmIGg0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHByaW50ICJoNCIsIGFyZ3MsIGt3YXJncworCisgICAgZGVmIHJhaXNlMShzZWxmKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yCisKKyAgICBkZWYgcmFpc2UyKHNlbGYpOgorICAgICAgICByYWlzZSBTeXN0ZW1FcnJvcgorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hdGV4aXQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXRleGl0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTU2NDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXRleGl0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hdGV4aXQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXRleGl0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTU2NDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXRleGl0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hdWRpb29wLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVkaW9vcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWE1MTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVkaW9vcC5weQpAQCAtMCwwICsxLDM5MyBAQAoraW1wb3J0IGF1ZGlvb3AKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN0cnVjdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKKworZm9ybWF0cyA9IHsKKyAgICAxOiAnYicsCisgICAgMjogJ2gnLAorICAgIDQ6ICdpJywKK30KKworZGVmIHBhY2sod2lkdGgsIGRhdGEpOgorICAgIHJldHVybiBzdHJ1Y3QucGFjaygnPSVkJXMnICUgKGxlbihkYXRhKSwgZm9ybWF0c1t3aWR0aF0pLCAqZGF0YSkKKworcGFja3MgPSB7CisgICAgMTogbGFtYmRhICpkYXRhOiBwYWNrKDEsIGRhdGEpLAorICAgIDI6IGxhbWJkYSAqZGF0YTogcGFjaygyLCBkYXRhKSwKKyAgICA0OiBsYW1iZGEgKmRhdGE6IHBhY2soNCwgZGF0YSksCit9CittYXh2YWx1ZXMgPSB7dzogKDEgPDwgKDggKiB3IC0gMSkpIC0gMSBmb3IgdyBpbiAoMSwgMiwgNCl9CittaW52YWx1ZXMgPSB7dzogLTEgPDwgKDggKiB3IC0gMSkgZm9yIHcgaW4gKDEsIDIsIDQpfQorCitkYXRhcyA9IHsKKyAgICAxOiBiJ1x4MDBceDEyXHg0NVx4YmJceDdmXHg4MFx4ZmYnLAorICAgIDI6IHBhY2tzWzJdKDAsIDB4MTIzNCwgMHg0NTY3LCAtMHg0NTY3LCAweDdmZmYsIC0weDgwMDAsIC0xKSwKKyAgICA0OiBwYWNrc1s0XSgwLCAweDEyMzQ1Njc4LCAweDQ1Njc4OWFiLCAtMHg0NTY3ODlhYiwKKyAgICAgICAgICAgICAgICAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwgLTEpLAorfQorCitJTlZBTElEX0RBVEEgPSBbCisgICAgKGInYWJjJywgMCksCisgICAgKGInYWJjJywgMiksCisgICAgKGInYWJjJywgNCksCitdCisKKworY2xhc3MgVGVzdEF1ZGlvb3AodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbWF4KHNlbGYpOgorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heChiJycsIHcpLCAwKQorICAgICAgICAgICAgcCA9IHBhY2tzW3ddCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4KHAoNSksIHcpLCA1KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heChwKDUsIC04LCAtMSksIHcpLCA4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heChwKG1heHZhbHVlc1t3XSksIHcpLCBtYXh2YWx1ZXNbd10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4KHAobWludmFsdWVzW3ddKSwgdyksIC1taW52YWx1ZXNbd10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4KGRhdGFzW3ddLCB3KSwgLW1pbnZhbHVlc1t3XSkKKworICAgIGRlZiB0ZXN0X21pbm1heChzZWxmKToKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5taW5tYXgoYicnLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKSkKKyAgICAgICAgICAgIHAgPSBwYWNrc1t3XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1pbm1heChwKDUpLCB3KSwgKDUsIDUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1pbm1heChwKDUsIC04LCAtMSksIHcpLCAoLTgsIDUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1pbm1heChwKG1heHZhbHVlc1t3XSksIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4dmFsdWVzW3ddLCBtYXh2YWx1ZXNbd10pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1pbm1heChwKG1pbnZhbHVlc1t3XSksIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWludmFsdWVzW3ddLCBtaW52YWx1ZXNbd10pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1pbm1heChkYXRhc1t3XSwgdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtaW52YWx1ZXNbd10sIG1heHZhbHVlc1t3XSkpCisKKyAgICBkZWYgdGVzdF9tYXhwcChzZWxmKToKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tYXhwcChiJycsIHcpLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heHBwKHBhY2tzW3ddKCpyYW5nZSgxMDApKSwgdyksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4cHAocGFja3Nbd10oOSwgMTAsIDUsIDUsIDAsIDEpLCB3KSwgMTApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4cHAoZGF0YXNbd10sIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXh2YWx1ZXNbd10gLSBtaW52YWx1ZXNbd10pCisKKyAgICBkZWYgdGVzdF9hdmcoc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKGInJywgdyksIDApCisgICAgICAgICAgICBwID0gcGFja3Nbd10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmcocCg1KSwgdyksIDUpCisgICAgICAgICAgICBzZWxmIC5hc3NlcnRFcXVhbChhdWRpb29wLmF2ZyhwKDUsIDgpLCB3KSwgNikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmcocCg1LCAtOCksIHcpLCAtMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmcocChtYXh2YWx1ZXNbd10sIG1heHZhbHVlc1t3XSksIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXh2YWx1ZXNbd10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKHAobWludmFsdWVzW3ddLCBtaW52YWx1ZXNbd10pLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludmFsdWVzW3ddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKHBhY2tzWzRdKDB4NTAwMDAwMDAsIDB4NzAwMDAwMDApLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDYwMDAwMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKHBhY2tzWzRdKC0weDUwMDAwMDAwLCAtMHg3MDAwMDAwMCksIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIC0weDYwMDAwMDAwKQorCisgICAgZGVmIHRlc3RfYXZncHAoc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZncHAoYicnLCB3KSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmdwcChwYWNrc1t3XSgqcmFuZ2UoMTAwKSksIHcpLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmF2Z3BwKHBhY2tzW3ddKDksIDEwLCA1LCA1LCAwLCAxKSwgdyksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZncHAoZGF0YXNbMV0sIDEpLCAxOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmdwcChkYXRhc1syXSwgMiksIDUwNTM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZncHAoZGF0YXNbNF0sIDQpLCAzMzExODk3MDAyKQorCisgICAgZGVmIHRlc3Rfcm1zKHNlbGYpOgorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnJtcyhiJycsIHcpLCAwKQorICAgICAgICAgICAgcCA9IHBhY2tzW3ddCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3Aucm1zKHAoKnJhbmdlKDEwMCkpLCB3KSwgNTcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGF1ZGlvb3Aucm1zKHAobWF4dmFsdWVzW3ddKSAqIDUsIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXh2YWx1ZXNbd10sIGRlbHRhPTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGF1ZGlvb3Aucm1zKHAobWludmFsdWVzW3ddKSAqIDUsIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbWludmFsdWVzW3ddLCBkZWx0YT0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3Aucm1zKGRhdGFzWzFdLCAxKSwgNzcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5ybXMoZGF0YXNbMl0sIDIpLCAyMDAwMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnJtcyhkYXRhc1s0XSwgNCksIDEzMTA4NTQxNTIpCisKKyAgICBkZWYgdGVzdF9jcm9zcyhzZWxmKToKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5jcm9zcyhiJycsIHcpLCAtMSkKKyAgICAgICAgICAgIHAgPSBwYWNrc1t3XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmNyb3NzKHAoMCwgMSwgMiksIHcpLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmNyb3NzKHAoMSwgMiwgLTMsIC00KSwgdyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuY3Jvc3MocCgtMSwgLTIsIDMsIDQpLCB3KSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5jcm9zcyhwKDAsIG1pbnZhbHVlc1t3XSksIHcpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmNyb3NzKHAobWludmFsdWVzW3ddLCBtYXh2YWx1ZXNbd10pLCB3KSwgMSkKKworICAgIGRlZiB0ZXN0X2FkZChzZWxmKToKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hZGQoYicnLCBiJycsIHcpLCBiJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYWRkKGRhdGFzW3ddLCBiJ1wwJyAqIGxlbihkYXRhc1t3XSksIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc1t3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmFkZChkYXRhc1sxXSwgZGF0YXNbMV0sIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInXHgwMFx4MjRceDdmXHg4MFx4N2ZceDgwXHhmZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hZGQoZGF0YXNbMl0sIGRhdGFzWzJdLCAyKSwKKyAgICAgICAgICAgICAgICBwYWNrc1syXSgwLCAweDI0NjgsIDB4N2ZmZiwgLTB4ODAwMCwgMHg3ZmZmLCAtMHg4MDAwLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hZGQoZGF0YXNbNF0sIGRhdGFzWzRdLCA0KSwKKyAgICAgICAgICAgICAgICBwYWNrc1s0XSgwLCAweDI0NjhhY2YwLCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIC0yKSkKKworICAgIGRlZiB0ZXN0X2JpYXMoc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBmb3IgYmlhcyBpbiAwLCAxLCAtMSwgMTI3LCAtMTI4LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYmlhcyhiJycsIHcsIGJpYXMpLCBiJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5iaWFzKGRhdGFzWzFdLCAxLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4MDFceDEzXHg0Nlx4YmNceDgwXHg4MVx4MDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYmlhcyhkYXRhc1sxXSwgMSwgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInXHhmZlx4MTFceDQ0XHhiYVx4N2VceDdmXHhmZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5iaWFzKGRhdGFzWzFdLCAxLCAweDdmZmZmZmZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4ZmZceDExXHg0NFx4YmFceDdlXHg3Zlx4ZmUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYmlhcyhkYXRhc1sxXSwgMSwgLTB4ODAwMDAwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzWzFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYmlhcyhkYXRhc1syXSwgMiwgMSksCisgICAgICAgICAgICAgICAgcGFja3NbMl0oMSwgMHgxMjM1LCAweDQ1NjgsIC0weDQ1NjYsIC0weDgwMDAsIC0weDdmZmYsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYmlhcyhkYXRhc1syXSwgMiwgLTEpLAorICAgICAgICAgICAgICAgIHBhY2tzWzJdKC0xLCAweDEyMzMsIDB4NDU2NiwgLTB4NDU2OCwgMHg3ZmZlLCAweDdmZmYsIC0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbMl0sIDIsIDB4N2ZmZmZmZmYpLAorICAgICAgICAgICAgICAgIHBhY2tzWzJdKC0xLCAweDEyMzMsIDB4NDU2NiwgLTB4NDU2OCwgMHg3ZmZlLCAweDdmZmYsIC0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbMl0sIDIsIC0weDgwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICBkYXRhc1syXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbNF0sIDQsIDEpLAorICAgICAgICAgICAgICAgIHBhY2tzWzRdKDEsIDB4MTIzNDU2NzksIDB4NDU2Nzg5YWMsIC0weDQ1Njc4OWFhLAorICAgICAgICAgICAgICAgICAgICAgICAgIC0weDgwMDAwMDAwLCAtMHg3ZmZmZmZmZiwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5iaWFzKGRhdGFzWzRdLCA0LCAtMSksCisgICAgICAgICAgICAgICAgcGFja3NbNF0oLTEsIDB4MTIzNDU2NzcsIDB4NDU2Nzg5YWEsIC0weDQ1Njc4OWFjLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2ZmZmZmZmUsIDB4N2ZmZmZmZmYsIC0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbNF0sIDQsIDB4N2ZmZmZmZmYpLAorICAgICAgICAgICAgICAgIHBhY2tzWzRdKDB4N2ZmZmZmZmYsIC0weDZkY2JhOTg5LCAtMHgzYTk4NzY1NiwgMHgzYTk4NzY1NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtMiwgLTEsIDB4N2ZmZmZmZmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYmlhcyhkYXRhc1s0XSwgNCwgLTB4ODAwMDAwMDApLAorICAgICAgICAgICAgICAgIHBhY2tzWzRdKC0weDgwMDAwMDAwLCAtMHg2ZGNiYTk4OCwgLTB4M2E5ODc2NTUsIDB4M2E5ODc2NTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIDAsIDB4N2ZmZmZmZmYpKQorCisgICAgZGVmIHRlc3RfbGluMmxpbihzZWxmKToKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ybGluKGRhdGFzW3ddLCB3LCB3KSwgZGF0YXNbd10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJsaW4oZGF0YXNbMV0sIDEsIDIpLAorICAgICAgICAgICAgcGFja3NbMl0oMCwgMHgxMjAwLCAweDQ1MDAsIC0weDQ1MDAsIDB4N2YwMCwgLTB4ODAwMCwgLTB4MTAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJsaW4oZGF0YXNbMV0sIDEsIDQpLAorICAgICAgICAgICAgcGFja3NbNF0oMCwgMHgxMjAwMDAwMCwgMHg0NTAwMDAwMCwgLTB4NDUwMDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAweDdmMDAwMDAwLCAtMHg4MDAwMDAwMCwgLTB4MTAwMDAwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ybGluKGRhdGFzWzJdLCAyLCAxKSwKKyAgICAgICAgICAgIGInXHgwMFx4MTJceDQ1XHhiYVx4N2ZceDgwXHhmZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ybGluKGRhdGFzWzJdLCAyLCA0KSwKKyAgICAgICAgICAgIHBhY2tzWzRdKDAsIDB4MTIzNDAwMDAsIDB4NDU2NzAwMDAsIC0weDQ1NjcwMDAwLAorICAgICAgICAgICAgICAgICAgICAgMHg3ZmZmMDAwMCwgLTB4ODAwMDAwMDAsIC0weDEwMDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJsaW4oZGF0YXNbNF0sIDQsIDEpLAorICAgICAgICAgICAgYidceDAwXHgxMlx4NDVceGJhXHg3Zlx4ODBceGZmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJsaW4oZGF0YXNbNF0sIDQsIDIpLAorICAgICAgICAgICAgcGFja3NbMl0oMCwgMHgxMjM0LCAweDQ1NjcsIC0weDQ1NjgsIDB4N2ZmZiwgLTB4ODAwMCwgLTEpKQorCisgICAgZGVmIHRlc3RfYWRwY20ybGluKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYWRwY20ybGluKGInXHgwN1x4N2ZceDdmJywgMSwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGInXHgwMFx4MDBceDAwXHhmZlx4MDBceGZmJywgKC0xNzksIDQwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hZHBjbTJsaW4oYidceDA3XHg3Zlx4N2YnLCAyLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAocGFja3NbMl0oMCwgMHhiLCAweDI5LCAtMHgxNiwgMHg3MiwgLTB4YjMpLCAoLTE3OSwgNDApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmFkcGNtMmxpbihiJ1x4MDdceDdmXHg3ZicsIDQsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChwYWNrc1s0XSgwLCAweGIwMDAwLCAweDI5MDAwMCwgLTB4MTYwMDAwLCAweDcyMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTB4YjMwMDAwKSwgKC0xNzksIDQwKSkpCisKKyAgICAgICAgIyBWZXJ5IGN1cnNvcnkgdGVzdAorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmFkcGNtMmxpbihiJ1wwJyAqIDUsIHcsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYidcMCcgKiB3ICogMTAsICgwLCAwKSkpCisKKyAgICBkZWYgdGVzdF9saW4yYWRwY20oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWRwY20oZGF0YXNbMV0sIDEsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChiJ1x4MDdceDdmXHg3ZicsICgtMjIxLCAzOSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmFkcGNtKGRhdGFzWzJdLCAyLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYidceDA3XHg3Zlx4N2YnLCAoMzEsIDM5KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWRwY20oZGF0YXNbNF0sIDQsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChiJ1x4MDdceDdmXHg3ZicsICgzMSwgMzkpKSkKKworICAgICAgICAjIFZlcnkgY3Vyc29yeSB0ZXN0CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmFkcGNtKGInXDAnICogdyAqIDEwLCB3LCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGInXDAnICogNSwgKDAsIDApKSkKKworICAgIGRlZiB0ZXN0X2xpbjJhbGF3KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmFsYXcoZGF0YXNbMV0sIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInXHhkNVx4ODdceGE0XHgyNFx4YWFceDJhXHg1YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWxhdyhkYXRhc1syXSwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidceGQ1XHg4N1x4YTRceDI0XHhhYVx4MmFceDU1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJhbGF3KGRhdGFzWzRdLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4ZDVceDg3XHhhNFx4MjRceGFhXHgyYVx4NTUnKQorCisgICAgZGVmIHRlc3RfYWxhdzJsaW4oc2VsZik6CisgICAgICAgIGVuY29kZWQgPSBiJ1x4MDBceDAzXHgyNFx4MmFceDUxXHg1NFx4NTVceDU4XHg2Ylx4NzFceDdmJ1wKKyAgICAgICAgICAgICAgICAgIGInXHg4MFx4ODNceGE0XHhhYVx4ZDFceGQ0XHhkNVx4ZDhceGViXHhmMVx4ZmYnCisgICAgICAgIHNyYyA9IFstNjg4LCAtNzIwLCAtMjI0MCwgLTQwMzIsIC05LCAtMywgLTEsIC0yNywgLTI0NCwgLTgyLCAtMTA2LAorICAgICAgICAgICAgICAgNjg4LCA3MjAsIDIyNDAsIDQwMzIsIDksIDMsIDEsIDI3LCAyNDQsIDgyLCAxMDZdCisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYWxhdzJsaW4oZW5jb2RlZCwgdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tzW3ddKCooeCA8PCAodyAqIDgpID4+IDEzIGZvciB4IGluIHNyYykpKQorCisgICAgICAgIGVuY29kZWQgPSAnJy5qb2luKGNocih4KSBmb3IgeCBpbiB4cmFuZ2UoMjU2KSkKKyAgICAgICAgZm9yIHcgaW4gMiwgNDoKKyAgICAgICAgICAgIGRlY29kZWQgPSBhdWRpb29wLmFsYXcybGluKGVuY29kZWQsIHcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmFsYXcoZGVjb2RlZCwgdyksIGVuY29kZWQpCisKKyAgICBkZWYgdGVzdF9saW4ydWxhdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJ1bGF3KGRhdGFzWzFdLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4ZmZceGFkXHg4ZVx4MGVceDgwXHgwMFx4NjcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMnVsYXcoZGF0YXNbMl0sIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInXHhmZlx4YWRceDhlXHgwZVx4ODBceDAwXHg3ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ydWxhdyhkYXRhc1s0XSwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidceGZmXHhhZFx4OGVceDBlXHg4MFx4MDBceDdlJykKKworICAgIGRlZiB0ZXN0X3VsYXcybGluKHNlbGYpOgorICAgICAgICBlbmNvZGVkID0gYidceDAwXHgwZVx4MjhceDNmXHg1N1x4NmFceDc2XHg3Y1x4N2VceDdmJ1wKKyAgICAgICAgICAgICAgICAgIGInXHg4MFx4OGVceGE4XHhiZlx4ZDdceGVhXHhmNlx4ZmNceGZlXHhmZicKKyAgICAgICAgc3JjID0gWy04MDMxLCAtNDQ0NywgLTE0NzEsIC00OTUsIC0xNjMsIC01MywgLTE4LCAtNiwgLTIsIDAsCisgICAgICAgICAgICAgICA4MDMxLCA0NDQ3LCAxNDcxLCA0OTUsIDE2MywgNTMsIDE4LCA2LCAyLCAwXQorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnVsYXcybGluKGVuY29kZWQsIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrc1t3XSgqKHggPDwgKHcgKiA4KSA+PiAxNCBmb3IgeCBpbiBzcmMpKSkKKworICAgICAgICAjIEN1cnJlbnQgdS1sYXcgaW1wbGVtZW50YXRpb24gaGFzIHR3byBjb2RlcyBmbyAwOiAweDdmIGFuZCAweGZmLgorICAgICAgICBlbmNvZGVkID0gJycuam9pbihjaHIoeCkgZm9yIHggaW4gcmFuZ2UoMTI3KSArIHJhbmdlKDEyOCwgMjU2KSkKKyAgICAgICAgZm9yIHcgaW4gMiwgNDoKKyAgICAgICAgICAgIGRlY29kZWQgPSBhdWRpb29wLnVsYXcybGluKGVuY29kZWQsIHcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMnVsYXcoZGVjb2RlZCwgdyksIGVuY29kZWQpCisKKyAgICBkZWYgdGVzdF9tdWwoc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubXVsKGInJywgdywgMiksIGInJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tdWwoZGF0YXNbd10sIHcsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiJ1wwJyAqIGxlbihkYXRhc1t3XSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubXVsKGRhdGFzW3ddLCB3LCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNbd10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tdWwoZGF0YXNbMV0sIDEsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInXHgwMFx4MjRceDdmXHg4MFx4N2ZceDgwXHhmZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tdWwoZGF0YXNbMl0sIDIsIDIpLAorICAgICAgICAgICAgICAgIHBhY2tzWzJdKDAsIDB4MjQ2OCwgMHg3ZmZmLCAtMHg4MDAwLCAweDdmZmYsIC0weDgwMDAsIC0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm11bChkYXRhc1s0XSwgNCwgMiksCisgICAgICAgICAgICAgICAgcGFja3NbNF0oMCwgMHgyNDY4YWNmMCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIC0yKSkKKworICAgIGRlZiB0ZXN0X3JhdGVjdihzZWxmKToKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5yYXRlY3YoYicnLCB3LCAxLCA4MDAwLCA4MDAwLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGInJywgKC0xLCAoKDAsIDApLCkpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5yYXRlY3YoYicnLCB3LCA1LCA4MDAwLCA4MDAwLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGInJywgKC0xLCAoKDAsIDApLCkgKiA1KSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AucmF0ZWN2KGInJywgdywgMSwgODAwMCwgMTYwMDAsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYicnLCAoLTIsICgoMCwgMCksKSkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnJhdGVjdihkYXRhc1t3XSwgdywgMSwgODAwMCwgODAwMCwgTm9uZSlbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzW3ddKQorICAgICAgICBzdGF0ZSA9IE5vbmUKKyAgICAgICAgZDEsIHN0YXRlID0gYXVkaW9vcC5yYXRlY3YoYidceDAwXHgwMVx4MDInLCAxLCAxLCA4MDAwLCAxNjAwMCwgc3RhdGUpCisgICAgICAgIGQyLCBzdGF0ZSA9IGF1ZGlvb3AucmF0ZWN2KGInXHgwMFx4MDFceDAyJywgMSwgMSwgODAwMCwgMTYwMDAsIHN0YXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxICsgZDIsIGInXDAwMFwwMDBcMDAxXDAwMVwwMDJcMDAxXDAwMFwwMDBcMDAxXDAwMVwwMDInKQorCisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBkMCwgc3RhdGUwID0gYXVkaW9vcC5yYXRlY3YoZGF0YXNbd10sIHcsIDEsIDgwMDAsIDE2MDAwLCBOb25lKQorICAgICAgICAgICAgZCwgc3RhdGUgPSBiJycsIE5vbmUKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihkYXRhc1t3XSksIHcpOgorICAgICAgICAgICAgICAgIGQxLCBzdGF0ZSA9IGF1ZGlvb3AucmF0ZWN2KGRhdGFzW3ddW2k6aSArIHddLCB3LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMDAsIDE2MDAwLCBzdGF0ZSkKKyAgICAgICAgICAgICAgICBkICs9IGQxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGQwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgc3RhdGUwKQorCisgICAgZGVmIHRlc3RfcmV2ZXJzZShzZWxmKToKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5yZXZlcnNlKGInJywgdyksIGInJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5yZXZlcnNlKHBhY2tzW3ddKDAsIDEsIDIpLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja3Nbd10oMiwgMSwgMCkpCisKKyAgICBkZWYgdGVzdF90b21vbm8oc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBkYXRhMSA9IGRhdGFzW3ddCisgICAgICAgICAgICBkYXRhMiA9IGJ5dGVhcnJheSgyICogbGVuKGRhdGExKSkKKyAgICAgICAgICAgIGZvciBrIGluIHJhbmdlKHcpOgorICAgICAgICAgICAgICAgIGRhdGEyW2s6OjIqd10gPSBkYXRhMVtrOjp3XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnRvbW9ubyhzdHIoZGF0YTIpLCB3LCAxLCAwKSwgZGF0YTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AudG9tb25vKHN0cihkYXRhMiksIHcsIDAsIDEpLCBiJ1wwJyAqIGxlbihkYXRhMSkpCisgICAgICAgICAgICBmb3IgayBpbiByYW5nZSh3KToKKyAgICAgICAgICAgICAgICBkYXRhMltrK3c6OjIqd10gPSBkYXRhMVtrOjp3XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnRvbW9ubyhzdHIoZGF0YTIpLCB3LCAwLjUsIDAuNSksIGRhdGExKQorCisgICAgZGVmIHRlc3RfdG9zdGVyZW8oc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBkYXRhMSA9IGRhdGFzW3ddCisgICAgICAgICAgICBkYXRhMiA9IGJ5dGVhcnJheSgyICogbGVuKGRhdGExKSkKKyAgICAgICAgICAgIGZvciBrIGluIHJhbmdlKHcpOgorICAgICAgICAgICAgICAgIGRhdGEyW2s6OjIqd10gPSBkYXRhMVtrOjp3XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnRvc3RlcmVvKGRhdGExLCB3LCAxLCAwKSwgZGF0YTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AudG9zdGVyZW8oZGF0YTEsIHcsIDAsIDApLCBiJ1wwJyAqIGxlbihkYXRhMikpCisgICAgICAgICAgICBmb3IgayBpbiByYW5nZSh3KToKKyAgICAgICAgICAgICAgICBkYXRhMltrK3c6OjIqd10gPSBkYXRhMVtrOjp3XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnRvc3RlcmVvKGRhdGExLCB3LCAxLCAxKSwgZGF0YTIpCisKKyAgICBkZWYgdGVzdF9maW5kZmFjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZmluZGZhY3RvcihkYXRhc1syXSwgZGF0YXNbMl0pLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5maW5kZmFjdG9yKGInXDAnICogbGVuKGRhdGFzWzJdKSwgZGF0YXNbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCkKKworICAgIGRlZiB0ZXN0X2ZpbmRmaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5maW5kZml0KGRhdGFzWzJdLCBkYXRhc1syXSksICgwLCAxLjApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZmluZGZpdChkYXRhc1syXSwgcGFja3NbMl0oMSwgMiwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgxLCA4MDM4LjgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZmluZGZpdChkYXRhc1syXVs6LTJdICogNSArIGRhdGFzWzJdLCBkYXRhc1syXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKDMwLCAxLjApKQorCisgICAgZGVmIHRlc3RfZmluZG1heChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmZpbmRtYXgoZGF0YXNbMl0sIDEpLCA1KQorCisgICAgZGVmIHRlc3RfZ2V0c2FtcGxlKHNlbGYpOgorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgZGF0YSA9IHBhY2tzW3ddKDAsIDEsIC0xLCBtYXh2YWx1ZXNbd10sIG1pbnZhbHVlc1t3XSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5nZXRzYW1wbGUoZGF0YSwgdywgMCksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZ2V0c2FtcGxlKGRhdGEsIHcsIDEpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmdldHNhbXBsZShkYXRhLCB3LCAyKSwgLTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZ2V0c2FtcGxlKGRhdGEsIHcsIDMpLCBtYXh2YWx1ZXNbd10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZ2V0c2FtcGxlKGRhdGEsIHcsIDQpLCBtaW52YWx1ZXNbd10pCisKKyAgICBkZWYgdGVzdF9uZWdhdGl2ZWxlbihzZWxmKToKKyAgICAgICAgIyBmcm9tIGlzc3VlIDMzMDYsIHByZXZpb3VzbHkgaXQgc2VnZmF1bHRlZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLAorICAgICAgICAgICAgYXVkaW9vcC5maW5kbWF4LCAnJy5qb2luKCBjaHIoeCkgZm9yIHggaW4geHJhbmdlKDI1NikpLCAtMjM5MjM5MikKKworICAgIGRlZiB0ZXN0X2lzc3VlNzY3MyhzZWxmKToKKyAgICAgICAgc3RhdGUgPSBOb25lCisgICAgICAgIGZvciBkYXRhLCBzaXplIGluIElOVkFMSURfREFUQToKKyAgICAgICAgICAgIHNpemUyID0gc2l6ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5nZXRzYW1wbGUsIGRhdGEsIHNpemUsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLm1heCwgZGF0YSwgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AubWlubWF4LCBkYXRhLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5hdmcsIGRhdGEsIHNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLnJtcywgZGF0YSwgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AuYXZncHAsIGRhdGEsIHNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLm1heHBwLCBkYXRhLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5jcm9zcywgZGF0YSwgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AubXVsLCBkYXRhLCBzaXplLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLnRvbW9ubywgZGF0YSwgc2l6ZSwgMC41LCAwLjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLnRvc3RlcmVvLCBkYXRhLCBzaXplLCAwLjUsIDAuNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AuYWRkLCBkYXRhLCBkYXRhLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5iaWFzLCBkYXRhLCBzaXplLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5yZXZlcnNlLCBkYXRhLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5saW4ybGluLCBkYXRhLCBzaXplLCBzaXplMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AucmF0ZWN2LCBkYXRhLCBzaXplLCAxLCAxLCAxLCBzdGF0ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AubGluMnVsYXcsIGRhdGEsIHNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLmxpbjJhbGF3LCBkYXRhLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5saW4yYWRwY20sIGRhdGEsIHNpemUsIHN0YXRlKQorCisgICAgZGVmIHRlc3Rfd3JvbmdzaXplKHNlbGYpOgorICAgICAgICBkYXRhID0gYidhYmNkZWZnaCcKKyAgICAgICAgc3RhdGUgPSBOb25lCisgICAgICAgIGZvciBzaXplIGluICgtMSwgMCwgMywgNSwgMTAyNCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLnVsYXcybGluLCBkYXRhLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5hbGF3MmxpbiwgZGF0YSwgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AuYWRwY20ybGluLCBkYXRhLCBzaXplLCBzdGF0ZSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUZXN0QXVkaW9vcCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVkaW9vcC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hdWRpb29wLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDZlNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVkaW9vcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVkaW9vcC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hdWRpb29wLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDZlNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVkaW9vcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OWU4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKQEAgLTAsMCArMSwzMzEgQEAKKyMgQXVnbWVudGVkIGFzc2lnbm1lbnQgdGVzdC4KKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBjaGVja19weTNrX3dhcm5pbmdzCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBBdWdBc3NpZ25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdEJhc2ljKHNlbGYpOgorICAgICAgICB4ID0gMgorICAgICAgICB4ICs9IDEKKyAgICAgICAgeCAqPSAyCisgICAgICAgIHggKio9IDIKKyAgICAgICAgeCAtPSA4CisgICAgICAgIHggLy89IDUKKyAgICAgICAgeCAlPSAzCisgICAgICAgIHggJj0gMgorICAgICAgICB4IHw9IDUKKyAgICAgICAgeCBePSAxCisgICAgICAgIHggLz0gMgorICAgICAgICBpZiAxLzIgPT0gMDoKKyAgICAgICAgICAgICMgY2xhc3NpYyBkaXZpc2lvbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCAzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBuZXctc3R5bGUgZGl2aXNpb24gKHdpdGggLVFuZXcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIDMuMCkKKworICAgIGRlZiB0ZXN0X3dpdGhfdW5wYWNraW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZSwgIngsIGIgKz0gMyIsICI8dGVzdD4iLCAiZXhlYyIpCisKKyAgICBkZWYgdGVzdEluTGlzdChzZWxmKToKKyAgICAgICAgeCA9IFsyXQorICAgICAgICB4WzBdICs9IDEKKyAgICAgICAgeFswXSAqPSAyCisgICAgICAgIHhbMF0gKio9IDIKKyAgICAgICAgeFswXSAtPSA4CisgICAgICAgIHhbMF0gLy89IDUKKyAgICAgICAgeFswXSAlPSAzCisgICAgICAgIHhbMF0gJj0gMgorICAgICAgICB4WzBdIHw9IDUKKyAgICAgICAgeFswXSBePSAxCisgICAgICAgIHhbMF0gLz0gMgorICAgICAgICBpZiAxLzIgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFswXSwgMykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFswXSwgMy4wKQorCisgICAgZGVmIHRlc3RJbkRpY3Qoc2VsZik6CisgICAgICAgIHggPSB7MDogMn0KKyAgICAgICAgeFswXSArPSAxCisgICAgICAgIHhbMF0gKj0gMgorICAgICAgICB4WzBdICoqPSAyCisgICAgICAgIHhbMF0gLT0gOAorICAgICAgICB4WzBdIC8vPSA1CisgICAgICAgIHhbMF0gJT0gMworICAgICAgICB4WzBdICY9IDIKKyAgICAgICAgeFswXSB8PSA1CisgICAgICAgIHhbMF0gXj0gMQorICAgICAgICB4WzBdIC89IDIKKyAgICAgICAgaWYgMS8yID09IDA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbMF0sIDMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbMF0sIDMuMCkKKworICAgIGRlZiB0ZXN0U2VxdWVuY2VzKHNlbGYpOgorICAgICAgICB4ID0gWzEsMl0KKyAgICAgICAgeCArPSBbMyw0XQorICAgICAgICB4ICo9IDIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIFsxLCAyLCAzLCA0LCAxLCAyLCAzLCA0XSkKKworICAgICAgICB4ID0gWzEsIDIsIDNdCisgICAgICAgIHkgPSB4CisgICAgICAgIHhbMToyXSAqPSAyCisgICAgICAgIHlbMToyXSArPSBbMV0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIFsxLCAyLCAxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgeSkKKworICAgIGRlZiB0ZXN0Q3VzdG9tTWV0aG9kczEoc2VsZik6CisKKyAgICAgICAgY2xhc3MgYXVnX3Rlc3Q6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsID0gdmFsdWUKKyAgICAgICAgICAgIGRlZiBfX3JhZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbCArIHZhbAorICAgICAgICAgICAgZGVmIF9fYWRkX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICByZXR1cm4gYXVnX3Rlc3Qoc2VsZi52YWwgKyB2YWwpCisKKyAgICAgICAgY2xhc3MgYXVnX3Rlc3QyKGF1Z190ZXN0KToKKyAgICAgICAgICAgIGRlZiBfX2lhZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsID0gc2VsZi52YWwgKyB2YWwKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGNsYXNzIGF1Z190ZXN0MyhhdWdfdGVzdCk6CisgICAgICAgICAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICByZXR1cm4gYXVnX3Rlc3QzKHNlbGYudmFsICsgdmFsKQorCisgICAgICAgIHggPSBhdWdfdGVzdCgxKQorICAgICAgICB5ID0geAorICAgICAgICB4ICs9IDEwCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHgsIGF1Z190ZXN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnZhbCwgMTEpCisKKyAgICAgICAgeCA9IGF1Z190ZXN0MigyKQorICAgICAgICB5ID0geAorICAgICAgICB4ICs9IDEwCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnZhbCwgMTIpCisKKyAgICAgICAgeCA9IGF1Z190ZXN0MygzKQorICAgICAgICB5ID0geAorICAgICAgICB4ICs9IDEwCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHgsIGF1Z190ZXN0MykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC52YWwsIDEzKQorCisKKyAgICBkZWYgdGVzdEN1c3RvbU1ldGhvZHMyKHRlc3Rfc2VsZik6CisgICAgICAgIG91dHB1dCA9IFtdCisKKyAgICAgICAgY2xhc3MgdGVzdGFsbDoKKyAgICAgICAgICAgIGRlZiBfX2FkZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19hZGRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcmFkZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yYWRkX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lhZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faWFkZF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZGVmIF9fc3ViX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3N1Yl9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19yc3ViX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3JzdWJfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faXN1Yl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pc3ViX18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICAgICBkZWYgX19tdWxfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fbXVsX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3JtdWxfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcm11bF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pbXVsX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2ltdWxfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiBfX2Rpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19kaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcmRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faWRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZGVmIF9fZmxvb3JkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fZmxvb3JkaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgX19pZmxvb3JkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faWZsb29yZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIF9fcmZsb29yZGl2X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3JmbG9vcmRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZGVmIF9fdHJ1ZWRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX190cnVlZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIF9faXRydWVkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faXRydWVkaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiBfX21vZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19tb2RfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcm1vZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ybW9kX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2ltb2RfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faW1vZF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZGVmIF9fcG93X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3Bvd19fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19ycG93X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3Jwb3dfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faXBvd19fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pcG93X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICAgICBkZWYgX19vcl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19vcl9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19yb3JfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcm9yX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lvcl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pb3JfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiBfX2FuZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19hbmRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcmFuZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yYW5kX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lhbmRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faWFuZF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZGVmIF9feG9yX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3hvcl9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19yeG9yX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3J4b3JfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faXhvcl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19peG9yX18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICAgICBkZWYgX19yc2hpZnRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcnNoaWZ0X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3Jyc2hpZnRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcnJzaGlmdF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pcnNoaWZ0X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lyc2hpZnRfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiBfX2xzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19sc2hpZnRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcmxzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ybHNoaWZ0X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lsc2hpZnRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faWxzaGlmdF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICB4ID0gdGVzdGFsbCgpCisgICAgICAgIHggKyAxCisgICAgICAgIDEgKyB4CisgICAgICAgIHggKz0gMQorCisgICAgICAgIHggLSAxCisgICAgICAgIDEgLSB4CisgICAgICAgIHggLT0gMQorCisgICAgICAgIHggKiAxCisgICAgICAgIDEgKiB4CisgICAgICAgIHggKj0gMQorCisgICAgICAgIGlmIDEvMiA9PSAwOgorICAgICAgICAgICAgeCAvIDEKKyAgICAgICAgICAgIDEgLyB4CisgICAgICAgICAgICB4IC89IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVHJ1ZSBkaXZpc2lvbiBpcyBpbiBlZmZlY3QsIHNvICIvIiBkb2Vzbid0IG1hcCB0byBfX2Rpdl9fIGV0YzsKKyAgICAgICAgICAgICMgYnV0IHRoZSBjYW5uZWQgZXhwZWN0ZWQtb3V0cHV0IGZpbGUgcmVxdWlyZXMgdGhhdCB0aG9zZSBnZXQgY2FsbGVkLgorICAgICAgICAgICAgeC5fX2Rpdl9fKDEpCisgICAgICAgICAgICB4Ll9fcmRpdl9fKDEpCisgICAgICAgICAgICB4Ll9faWRpdl9fKDEpCisKKyAgICAgICAgeCAvLyAxCisgICAgICAgIDEgLy8geAorICAgICAgICB4IC8vPSAxCisKKyAgICAgICAgeCAlIDEKKyAgICAgICAgMSAlIHgKKyAgICAgICAgeCAlPSAxCisKKyAgICAgICAgeCAqKiAxCisgICAgICAgIDEgKiogeAorICAgICAgICB4ICoqPSAxCisKKyAgICAgICAgeCB8IDEKKyAgICAgICAgMSB8IHgKKyAgICAgICAgeCB8PSAxCisKKyAgICAgICAgeCAmIDEKKyAgICAgICAgMSAmIHgKKyAgICAgICAgeCAmPSAxCisKKyAgICAgICAgeCBeIDEKKyAgICAgICAgMSBeIHgKKyAgICAgICAgeCBePSAxCisKKyAgICAgICAgeCA+PiAxCisgICAgICAgIDEgPj4geAorICAgICAgICB4ID4+PSAxCisKKyAgICAgICAgeCA8PCAxCisgICAgICAgIDEgPDwgeAorICAgICAgICB4IDw8PSAxCisKKyAgICAgICAgdGVzdF9zZWxmLmFzc2VydEVxdWFsKG91dHB1dCwgJycnXAorX19hZGRfXyBjYWxsZWQKK19fcmFkZF9fIGNhbGxlZAorX19pYWRkX18gY2FsbGVkCitfX3N1Yl9fIGNhbGxlZAorX19yc3ViX18gY2FsbGVkCitfX2lzdWJfXyBjYWxsZWQKK19fbXVsX18gY2FsbGVkCitfX3JtdWxfXyBjYWxsZWQKK19faW11bF9fIGNhbGxlZAorX19kaXZfXyBjYWxsZWQKK19fcmRpdl9fIGNhbGxlZAorX19pZGl2X18gY2FsbGVkCitfX2Zsb29yZGl2X18gY2FsbGVkCitfX3JmbG9vcmRpdl9fIGNhbGxlZAorX19pZmxvb3JkaXZfXyBjYWxsZWQKK19fbW9kX18gY2FsbGVkCitfX3Jtb2RfXyBjYWxsZWQKK19faW1vZF9fIGNhbGxlZAorX19wb3dfXyBjYWxsZWQKK19fcnBvd19fIGNhbGxlZAorX19pcG93X18gY2FsbGVkCitfX29yX18gY2FsbGVkCitfX3Jvcl9fIGNhbGxlZAorX19pb3JfXyBjYWxsZWQKK19fYW5kX18gY2FsbGVkCitfX3JhbmRfXyBjYWxsZWQKK19faWFuZF9fIGNhbGxlZAorX194b3JfXyBjYWxsZWQKK19fcnhvcl9fIGNhbGxlZAorX19peG9yX18gY2FsbGVkCitfX3JzaGlmdF9fIGNhbGxlZAorX19ycnNoaWZ0X18gY2FsbGVkCitfX2lyc2hpZnRfXyBjYWxsZWQKK19fbHNoaWZ0X18gY2FsbGVkCitfX3Jsc2hpZnRfXyBjYWxsZWQKK19faWxzaGlmdF9fIGNhbGxlZAorJycnLnNwbGl0bGluZXMoKSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygoImNsYXNzaWMgaW50IGRpdmlzaW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHJ1bl91bml0dGVzdChBdWdBc3NpZ25UZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDhjZTZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDhjZTZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXNlNjQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXNlNjQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YyY2VlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc2U2NC5weQpAQCAtMCwwICsxLDIxNiBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IGJhc2U2NAorCisKKwwKK2NsYXNzIExlZ2FjeUJhc2U2NFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGVzdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjQuZW5jb2Rlc3RyaW5nKCJ3d3cucHl0aG9uLm9yZyIpLCAiZDNkM0xuQjVkR2h2Ymk1dmNtYz1cbiIpCisgICAgICAgIGVxKGJhc2U2NC5lbmNvZGVzdHJpbmcoImEiKSwgIllRPT1cbiIpCisgICAgICAgIGVxKGJhc2U2NC5lbmNvZGVzdHJpbmcoImFiIiksICJZV0k9XG4iKQorICAgICAgICBlcShiYXNlNjQuZW5jb2Rlc3RyaW5nKCJhYmMiKSwgIllXSmpcbiIpCisgICAgICAgIGVxKGJhc2U2NC5lbmNvZGVzdHJpbmcoIiIpLCAiIikKKyAgICAgICAgZXEoYmFzZTY0LmVuY29kZXN0cmluZygiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwMTIzNDU2Nzg5IUAjMF4mKigpOzo8PiwuIFtde30iKSwKKyAgICAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVhwQlFrTkUiCisgICAgICAgICAgICJSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2pBeE1qTTBcbk5UIgorICAgICAgICAgICAiWTNPRGtoUUNNd1hpWXFLQ2s3T2p3K0xDNGdXMTE3ZlE9PVxuIikKKyAgICAgICAgIyBOb24tYnl0ZXMKKyAgICAgICAgZXEoYmFzZTY0LmVuY29kZXN0cmluZyhieXRlYXJyYXkoJ2FiYycpKSwgJ1lXSmpcbicpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVzdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjQuZGVjb2Rlc3RyaW5nKCJkM2QzTG5CNWRHaHZiaTV2Y21jPVxuIiksICJ3d3cucHl0aG9uLm9yZyIpCisgICAgICAgIGVxKGJhc2U2NC5kZWNvZGVzdHJpbmcoIllRPT1cbiIpLCAiYSIpCisgICAgICAgIGVxKGJhc2U2NC5kZWNvZGVzdHJpbmcoIllXST1cbiIpLCAiYWIiKQorICAgICAgICBlcShiYXNlNjQuZGVjb2Rlc3RyaW5nKCJZV0pqXG4iKSwgImFiYyIpCisgICAgICAgIGVxKGJhc2U2NC5kZWNvZGVzdHJpbmcoIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVhwQlFrTkUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXakF4TWpNMFxuTlQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlkzT0RraFFDTXdYaVlxS0NrN09qdytMQzRnVzExN2ZRPT1cbiIpLAorICAgICAgICAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCisgICAgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIKKyAgICAgICAgICAgIjAxMjM0NTY3ODkhQCMwXiYqKCk7Ojw+LC4gW117fSIpCisgICAgICAgIGVxKGJhc2U2NC5kZWNvZGVzdHJpbmcoJycpLCAnJykKKyAgICAgICAgIyBOb24tYnl0ZXMKKyAgICAgICAgZXEoYmFzZTY0LmRlY29kZXN0cmluZyhieXRlYXJyYXkoIllXSmpcbiIpKSwgImFiYyIpCisKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgaW5mcCA9IFN0cmluZ0lPKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKKyAgICAgICAgICAgICAgICAgICAgICAgICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKKyAgICAgICAgICAgICAgICAgICAgICAgICcwMTIzNDU2Nzg5IUAjMF4mKigpOzo8PiwuIFtde30nKQorICAgICAgICBvdXRmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgYmFzZTY0LmVuY29kZShpbmZwLCBvdXRmcCkKKyAgICAgICAgZXEob3V0ZnAuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgJ1lXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVhwQlFrTkUnCisgICAgICAgICAgICdSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2pBeE1qTTBcbk5UJworICAgICAgICAgICAnWTNPRGtoUUNNd1hpWXFLQ2s3T2p3K0xDNGdXMTE3ZlE9PVxuJykKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGluZnAgPSBTdHJpbmdJTygnZDNkM0xuQjVkR2h2Ymk1dmNtYz0nKQorICAgICAgICBvdXRmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgYmFzZTY0LmRlY29kZShpbmZwLCBvdXRmcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRmcC5nZXR2YWx1ZSgpLCAnd3d3LnB5dGhvbi5vcmcnKQorCisKKwwKK2NsYXNzIEJhc2VYWVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9iNjRlbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFRlc3QgZGVmYXVsdCBhbHBoYWJldAorICAgICAgICBlcShiYXNlNjQuYjY0ZW5jb2RlKCJ3d3cucHl0aG9uLm9yZyIpLCAiZDNkM0xuQjVkR2h2Ymk1dmNtYz0iKQorICAgICAgICBlcShiYXNlNjQuYjY0ZW5jb2RlKCdceDAwJyksICdBQT09JykKKyAgICAgICAgZXEoYmFzZTY0LmI2NGVuY29kZSgiYSIpLCAiWVE9PSIpCisgICAgICAgIGVxKGJhc2U2NC5iNjRlbmNvZGUoImFiIiksICJZV0k9IikKKyAgICAgICAgZXEoYmFzZTY0LmI2NGVuY29kZSgiYWJjIiksICJZV0pqIikKKyAgICAgICAgZXEoYmFzZTY0LmI2NGVuY29kZSgiIiksICIiKQorICAgICAgICBlcShiYXNlNjQuYjY0ZW5jb2RlKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAxMjM0NTY3ODkhQCMwXiYqKCk7Ojw+LC4gW117fSIpLAorICAgICAgICAgICAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEZ5YzNSMWRuZDRlWHBCUWtORSIKKyAgICAgICAgICAgIlJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXakF4TWpNME5UIgorICAgICAgICAgICAiWTNPRGtoUUNNd1hpWXFLQ2s3T2p3K0xDNGdXMTE3ZlE9PSIpCisgICAgICAgICMgVGVzdCB3aXRoIGFyYml0cmFyeSBhbHRlcm5hdGl2ZSBjaGFyYWN0ZXJzCisgICAgICAgIGVxKGJhc2U2NC5iNjRlbmNvZGUoJ1x4ZDNWXHhiZW9ceGY3XHgxZCcsIGFsdGNoYXJzPScqJCcpLCAnMDFhKmIkY2QnKQorICAgICAgICAjIE5vbi1ieXRlcworICAgICAgICBlcShiYXNlNjQuYjY0ZW5jb2RlKGJ5dGVhcnJheSgnYWJjZCcpKSwgJ1lXSmpaQT09JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiYXNlNjQuYjY0ZW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnXHhkM1ZceGJlb1x4ZjdceDFkJywgYWx0Y2hhcnM9Ynl0ZWFycmF5KCcqJCcpKQorICAgICAgICAjIFRlc3Qgc3RhbmRhcmQgYWxwaGFiZXQKKyAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGVuY29kZSgid3d3LnB5dGhvbi5vcmciKSwgImQzZDNMbkI1ZEdodmJpNXZjbWM9IikKKyAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGVuY29kZSgiYSIpLCAiWVE9PSIpCisgICAgICAgIGVxKGJhc2U2NC5zdGFuZGFyZF9iNjRlbmNvZGUoImFiIiksICJZV0k9IikKKyAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGVuY29kZSgiYWJjIiksICJZV0pqIikKKyAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGVuY29kZSgiIiksICIiKQorICAgICAgICBlcShiYXNlNjQuc3RhbmRhcmRfYjY0ZW5jb2RlKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAxMjM0NTY3ODkhQCMwXiYqKCk7Ojw+LC4gW117fSIpLAorICAgICAgICAgICAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEZ5YzNSMWRuZDRlWHBCUWtORSIKKyAgICAgICAgICAgIlJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXakF4TWpNME5UIgorICAgICAgICAgICAiWTNPRGtoUUNNd1hpWXFLQ2s3T2p3K0xDNGdXMTE3ZlE9PSIpCisgICAgICAgICMgTm9uLWJ5dGVzCisgICAgICAgIGVxKGJhc2U2NC5zdGFuZGFyZF9iNjRlbmNvZGUoYnl0ZWFycmF5KCdhYmNkJykpLCAnWVdKalpBPT0nKQorICAgICAgICAjIFRlc3Qgd2l0aCAnVVJMIHNhZmUnIGFsdGVybmF0aXZlIGNoYXJhY3RlcnMKKyAgICAgICAgZXEoYmFzZTY0LnVybHNhZmVfYjY0ZW5jb2RlKCdceGQzVlx4YmVvXHhmN1x4MWQnKSwgJzAxYS1iX2NkJykKKyAgICAgICAgIyBOb24tYnl0ZXMKKyAgICAgICAgZXEoYmFzZTY0LnVybHNhZmVfYjY0ZW5jb2RlKGJ5dGVhcnJheSgnXHhkM1ZceGJlb1x4ZjdceDFkJykpLCAnMDFhLWJfY2QnKQorCisgICAgZGVmIHRlc3RfYjY0ZGVjb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0LmI2NGRlY29kZSgiZDNkM0xuQjVkR2h2Ymk1dmNtYz0iKSwgInd3dy5weXRob24ub3JnIikKKyAgICAgICAgZXEoYmFzZTY0LmI2NGRlY29kZSgnQUE9PScpLCAnXHgwMCcpCisgICAgICAgIGVxKGJhc2U2NC5iNjRkZWNvZGUoIllRPT0iKSwgImEiKQorICAgICAgICBlcShiYXNlNjQuYjY0ZGVjb2RlKCJZV0k9IiksICJhYiIpCisgICAgICAgIGVxKGJhc2U2NC5iNjRkZWNvZGUoIllXSmoiKSwgImFiYyIpCisgICAgICAgIGVxKGJhc2U2NC5iNjRkZWNvZGUoIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVhwQlFrTkUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXakF4TWpNMFxuTlQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlkzT0RraFFDTXdYaVlxS0NrN09qdytMQzRnVzExN2ZRPT0iKSwKKyAgICAgICAgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgorICAgICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiCisgICAgICAgICAgICIwMTIzNDU2Nzg5IUAjMF4mKigpOzo8PiwuIFtde30iKQorICAgICAgICBlcShiYXNlNjQuYjY0ZGVjb2RlKCcnKSwgJycpCisgICAgICAgICMgVGVzdCB3aXRoIGFyYml0cmFyeSBhbHRlcm5hdGl2ZSBjaGFyYWN0ZXJzCisgICAgICAgIGVxKGJhc2U2NC5iNjRkZWNvZGUoJzAxYSpiJGNkJywgYWx0Y2hhcnM9JyokJyksICdceGQzVlx4YmVvXHhmN1x4MWQnKQorICAgICAgICAjIE5vbi1ieXRlcworICAgICAgICBlcShiYXNlNjQuYjY0ZGVjb2RlKGJ5dGVhcnJheSgiWVdKaiIpKSwgImFiYyIpCisgICAgICAgICMgVGVzdCBzdGFuZGFyZCBhbHBoYWJldAorICAgICAgICBlcShiYXNlNjQuc3RhbmRhcmRfYjY0ZGVjb2RlKCJkM2QzTG5CNWRHaHZiaTV2Y21jPSIpLCAid3d3LnB5dGhvbi5vcmciKQorICAgICAgICBlcShiYXNlNjQuc3RhbmRhcmRfYjY0ZGVjb2RlKCJZUT09IiksICJhIikKKyAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGRlY29kZSgiWVdJPSIpLCAiYWIiKQorICAgICAgICBlcShiYXNlNjQuc3RhbmRhcmRfYjY0ZGVjb2RlKCJZV0pqIiksICJhYmMiKQorICAgICAgICBlcShiYXNlNjQuc3RhbmRhcmRfYjY0ZGVjb2RlKCIiKSwgIiIpCisgICAgICAgIGVxKGJhc2U2NC5zdGFuZGFyZF9iNjRkZWNvZGUoIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVhwQlFrTkUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXakF4TWpNME5UIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZM09Ea2hRQ013WGlZcUtDazdPancrTEM0Z1cxMTdmUT09IiksCisgICAgICAgICAgICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKKyAgICAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgorICAgICAgICAgICAiMDEyMzQ1Njc4OSFAIzBeJiooKTs6PD4sLiBbXXt9IikKKyAgICAgICAgIyBOb24tYnl0ZXMKKyAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGRlY29kZShieXRlYXJyYXkoIllXSmoiKSksICJhYmMiKQorICAgICAgICAjIFRlc3Qgd2l0aCAnVVJMIHNhZmUnIGFsdGVybmF0aXZlIGNoYXJhY3RlcnMKKyAgICAgICAgZXEoYmFzZTY0LnVybHNhZmVfYjY0ZGVjb2RlKCcwMWEtYl9jZCcpLCAnXHhkM1ZceGJlb1x4ZjdceDFkJykKKyAgICAgICAgIyBOb24tYnl0ZXMKKyAgICAgICAgZXEoYmFzZTY0LnVybHNhZmVfYjY0ZGVjb2RlKGJ5dGVhcnJheSgnMDFhLWJfY2QnKSksICdceGQzVlx4YmVvXHhmN1x4MWQnKQorCisgICAgZGVmIHRlc3RfYjY0ZGVjb2RlX2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJhc2U2NC5iNjRkZWNvZGUsICdhYmMnKQorCisgICAgZGVmIHRlc3RfYjMyZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0LmIzMmVuY29kZSgnJyksICcnKQorICAgICAgICBlcShiYXNlNjQuYjMyZW5jb2RlKCdceDAwJyksICdBQT09PT09PScpCisgICAgICAgIGVxKGJhc2U2NC5iMzJlbmNvZGUoJ2EnKSwgJ01FPT09PT09JykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmVuY29kZSgnYWInKSwgJ01GUkE9PT09JykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmVuY29kZSgnYWJjJyksICdNRlJHRz09PScpCisgICAgICAgIGVxKGJhc2U2NC5iMzJlbmNvZGUoJ2FiY2QnKSwgJ01GUkdHWkE9JykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmVuY29kZSgnYWJjZGUnKSwgJ01GUkdHWkRGJykKKyAgICAgICAgIyBOb24tYnl0ZXMKKyAgICAgICAgZXEoYmFzZTY0LmIzMmVuY29kZShieXRlYXJyYXkoJ2FiY2QnKSksICdNRlJHR1pBPScpCisKKyAgICBkZWYgdGVzdF9iMzJkZWNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCcnKSwgJycpCisgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ0FBPT09PT09JyksICdceDAwJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnTUU9PT09PT0nKSwgJ2EnKQorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdNRlJBPT09PScpLCAnYWInKQorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdNRlJHRz09PScpLCAnYWJjJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnTUZSR0daQT0nKSwgJ2FiY2QnKQorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdNRlJHR1pERicpLCAnYWJjZGUnKQorICAgICAgICAjIE5vbi1ieXRlcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJhc2U2NC5iMzJkZWNvZGUsIGJ5dGVhcnJheSgnTUZSR0c9PT0nKSkKKworICAgIGRlZiB0ZXN0X2IzMmRlY29kZV9jYXNlZm9sZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJycsIFRydWUpLCAnJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnTUU9PT09PT0nLCBUcnVlKSwgJ2EnKQorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdNRlJBPT09PScsIFRydWUpLCAnYWInKQorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdNRlJHRz09PScsIFRydWUpLCAnYWJjJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnTUZSR0daQT0nLCBUcnVlKSwgJ2FiY2QnKQorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdNRlJHR1pERicsIFRydWUpLCAnYWJjZGUnKQorICAgICAgICAjIExvd2VyIGNhc2VzCisgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ21lPT09PT09JywgVHJ1ZSksICdhJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnbWZyYT09PT0nLCBUcnVlKSwgJ2FiJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnbWZyZ2c9PT0nLCBUcnVlKSwgJ2FiYycpCisgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ21mcmdnemE9JywgVHJ1ZSksICdhYmNkJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnbWZyZ2d6ZGYnLCBUcnVlKSwgJ2FiY2RlJykKKyAgICAgICAgIyBFeHBlY3RlZCBleGNlcHRpb25zCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmFzZTY0LmIzMmRlY29kZSwgJ21lPT09PT09JykKKyAgICAgICAgIyBNYXBwaW5nIHplcm8gYW5kIG9uZQorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdNTE8yMzQ1NicpLCAnYlx4ZGRceGFkXHhmM1x4YmUnKQorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdNMTAyMzQ1NicsIG1hcDAxPSdMJyksICdiXHhkZFx4YWRceGYzXHhiZScpCisgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ00xMDIzNDU2JywgbWFwMDE9J0knKSwgJ2JceDFkXHhhZFx4ZjNceGJlJykKKworICAgIGRlZiB0ZXN0X2IzMmRlY29kZV9lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiYXNlNjQuYjMyZGVjb2RlLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiYXNlNjQuYjMyZGVjb2RlLCAnQUJDREVGPT0nKQorCisgICAgZGVmIHRlc3RfYjE2ZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0LmIxNmVuY29kZSgnXHgwMVx4MDJceGFiXHhjZFx4ZWYnKSwgJzAxMDJBQkNERUYnKQorICAgICAgICBlcShiYXNlNjQuYjE2ZW5jb2RlKCdceDAwJyksICcwMCcpCisgICAgICAgICMgTm9uLWJ5dGVzCisgICAgICAgIGVxKGJhc2U2NC5iMTZlbmNvZGUoYnl0ZWFycmF5KCdceDAxXHgwMlx4YWJceGNkXHhlZicpKSwgJzAxMDJBQkNERUYnKQorCisgICAgZGVmIHRlc3RfYjE2ZGVjb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0LmIxNmRlY29kZSgnMDEwMkFCQ0RFRicpLCAnXHgwMVx4MDJceGFiXHhjZFx4ZWYnKQorICAgICAgICBlcShiYXNlNjQuYjE2ZGVjb2RlKCcwMCcpLCAnXHgwMCcpCisgICAgICAgICMgTG93ZXIgY2FzZSBpcyBub3QgYWxsb3dlZCB3aXRob3V0IGEgZmxhZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJhc2U2NC5iMTZkZWNvZGUsICcwMTAyYWJjZGVmJykKKyAgICAgICAgIyBDYXNlIGZvbGQKKyAgICAgICAgZXEoYmFzZTY0LmIxNmRlY29kZSgnMDEwMmFiY2RlZicsIFRydWUpLCAnXHgwMVx4MDJceGFiXHhjZFx4ZWYnKQorICAgICAgICAjIE5vbi1ieXRlcworICAgICAgICBlcShiYXNlNjQuYjE2ZGVjb2RlKGJ5dGVhcnJheSgiMDEwMkFCQ0RFRiIpKSwgJ1x4MDFceDAyXHhhYlx4Y2RceGVmJykKKworCisMCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmFzZTY0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc2U2NC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjNDQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc2U2NC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmFzZTY0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc2U2NC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjNDQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc2U2NC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmFzdGlvbi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc3Rpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc2MGVjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc3Rpb24ucHkKQEAgLTAsMCArMSwzIEBACisjI2ltcG9ydCBCYXN0aW9uCisjIworIyNCYXN0aW9uLl90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc3Rpb24ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmFzdGlvbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyNzQwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc3Rpb24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc3Rpb24ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmFzdGlvbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyNzQwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc3Rpb24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjE5YTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlnYWRkcnNwYWNlLnB5CkBAIC0wLDAgKzEsNDYgQEAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBiaWdhZGRyc3BhY2V0ZXN0LCBNQVhfUHlfc3NpemVfdAorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcGVyYXRvcgoraW1wb3J0IHN5cworCisKK2NsYXNzIFN0clRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQGJpZ2FkZHJzcGFjZXRlc3QKKyAgICBkZWYgdGVzdF9jb25jYXQoc2VsZik6CisgICAgICAgIHMxID0gJ3gnICogTUFYX1B5X3NzaXplX3QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgb3BlcmF0b3IuYWRkLCBzMSwgJz8nKQorCisgICAgQGJpZ2FkZHJzcGFjZXRlc3QKKyAgICBkZWYgdGVzdF9vcHRpbWl6ZWRfY29uY2F0KHNlbGYpOgorICAgICAgICB4ID0gJ3gnICogTUFYX1B5X3NzaXplX3QKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeCA9IHggKyAnPycgICAgICMgdGhpcyBzdGF0ZW1lbnQgdXNlcyBhIGZhc3QgcGF0aCBpbiBjZXZhbC5jCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgT3ZlcmZsb3dFcnJvciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHggKz0gJz8nICAgICAgICAjIHRoaXMgc3RhdGVtZW50IHVzZXMgYSBmYXN0IHBhdGggaW4gY2V2YWwuYworICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIE92ZXJmbG93RXJyb3IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih4KSwgTUFYX1B5X3NzaXplX3QpCisKKyAgICAjIyMgdGhlIGZvbGxvd2luZyB0ZXN0IGlzIHBlbmRpbmcgYSBwYXRjaAorICAgICMgICAoaHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDA2LUp1bHkvMDY3Nzc0Lmh0bWwpCisgICAgI0BiaWdhZGRyc3BhY2V0ZXN0CisgICAgI2RlZiB0ZXN0X3JlcGVhdChzZWxmKToKKyAgICAjICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9wZXJhdG9yLm11bCwgJ3gnLCBNQVhfUHlfc3NpemVfdCArIDEpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3RyVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnNldF9tZW1saW1pdChzeXMuYXJndlsxXSkKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlnYWRkcnNwYWNlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5ZjE2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlnYWRkcnNwYWNlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5ZjE2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlnbWVtLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlnbWVtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MWMzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaWdtZW0ucHkKQEAgLTAsMCArMSwxMDczIEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgYmlnbWVtdGVzdCwgXzFHLCBfMkcsIF80RywgcHJlY2lzaW9uYmlnbWVtdGVzdAorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcGVyYXRvcgoraW1wb3J0IHN0cmluZworaW1wb3J0IHN5cworCisjIEJpZ21lbSB0ZXN0aW5nIGhvdXNlcnVsZXM6CisjCisjICAtIFRyeSBub3QgdG8gYWxsb2NhdGUgdG9vIG1hbnkgbGFyZ2Ugb2JqZWN0cy4gSXQncyBva2F5IHRvIHJlbHkgb24KKyMgICAgcmVmY291bnRpbmcgc2VtYW50aWNzLCBidXQgZG9uJ3QgZm9yZ2V0IHRoYXQgJ3MgPSBjcmVhdGVfbGFyZ2VzdHJpbmcoKScKKyMgICAgZG9lc24ndCByZWxlYXNlIHRoZSBvbGQgJ3MnIChpZiBpdCBleGlzdHMpIHVudGlsIHdlbGwgYWZ0ZXIgaXRzIG5ldworIyAgICB2YWx1ZSBoYXMgYmVlbiBjcmVhdGVkLiBVc2UgJ2RlbCBzJyBiZWZvcmUgdGhlIGNyZWF0ZV9sYXJnZXN0cmluZyBjYWxsLgorIworIyAgLSBEbyAqbm90KiBjb21wYXJlIGxhcmdlIG9iamVjdHMgdXNpbmcgYXNzZXJ0RXF1YWwgb3Igc2ltaWxhci4gSXQncyBhCisjICAgIGxlbmd0eSBvcGVyYXRpb24gYW5kIHRoZSBlcnJvcm1lc3NhZ2Ugd2lsbCBiZSB1dHRlcmx5IHVzZWxlc3MgZHVlIHRvCisjICAgIGl0cyBzaXplLiBUbyBtYWtlIHN1cmUgd2hldGhlciBhIHJlc3VsdCBoYXMgdGhlIHJpZ2h0IGNvbnRlbnRzLCBiZXR0ZXIKKyMgICAgdG8gdXNlIHRoZSBzdHJpcCBvciBjb3VudCBtZXRob2RzLCBvciBjb21wYXJlIG1lYW5pbmdmdWwgc2xpY2VzLgorIworIyAgLSBEb24ndCBmb3JnZXQgdG8gdGVzdCBmb3IgbGFyZ2UgaW5kaWNlcywgb2Zmc2V0cyBhbmQgcmVzdWx0cyBhbmQgc3VjaCwKKyMgICAgaW4gYWRkaXRpb24gdG8gbGFyZ2Ugc2l6ZXMuCisjCisjICAtIFdoZW4gcmVwZWF0aW5nIGFuIG9iamVjdCAoc2F5LCBhIHN1YnN0cmluZywgb3IgYSBzbWFsbCBsaXN0KSB0byBjcmVhdGUKKyMgICAgYSBsYXJnZSBvYmplY3QsIG1ha2UgdGhlIHN1Ym9iamVjdCBvZiBhIGxlbmd0aCB0aGF0IGlzIG5vdCBhIHBvd2VyIG9mCisjICAgIDIuIFRoYXQgd2F5LCBpbnQtd3JhcHBpbmcgcHJvYmxlbXMgYXJlIG1vcmUgZWFzaWx5IGRldGVjdGVkLgorIworIyAgLSBXaGlsZSB0aGUgYmlnbWVtdGVzdCBkZWNvcmF0b3Igc3BlYWtzIG9mICdtaW5zaXplJywgYWxsIHRlc3RzIHdpbGwKKyMgICAgYWN0dWFsbHkgYmUgY2FsbGVkIHdpdGggYSBtdWNoIHNtYWxsZXIgbnVtYmVyIHRvbywgaW4gdGhlIG5vcm1hbAorIyAgICB0ZXN0IHJ1biAoNUtiIGN1cnJlbnRseS4pIFRoaXMgaXMgc28gdGhlIHRlc3RzIHRoZW1zZWx2ZXMgZ2V0IGZyZXF1ZW50CisjICAgIHRlc3RpbmcuIENvbnNlcXVlbnRseSwgYWx3YXlzIG1ha2UgYWxsIGxhcmdlIGFsbG9jYXRpb25zIGJhc2VkIG9uIHRoZQorIyAgICBwYXNzZWQtaW4gJ3NpemUnLCBhbmQgZG9uJ3QgcmVseSBvbiB0aGUgc2l6ZSBiZWluZyB2ZXJ5IGxhcmdlLiBBbHNvLAorIyAgICBtZW11c2UtcGVyLXNpemUgc2hvdWxkIHJlbWFpbiBzYW5lIChsZXNzIHRoYW4gYSBmZXcgdGhvdXNhbmQpOyBpZiB5b3VyCisjICAgIHRlc3QgdXNlcyBtb3JlLCBhZGp1c3QgJ3NpemUnIHVwd2FyZCwgaW5zdGVhZC4KKworY2xhc3MgU3RyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2NhcGl0YWxpemUoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHMgPSAnLScgKiBzaXplICsgU1VCU1RSCisgICAgICAgIGNhcHMgPSBzLmNhcGl0YWxpemUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhcHNbLWxlbihTVUJTVFIpOl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgU1VCU1RSLmNhcGl0YWxpemUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXBzLmxzdHJpcCgnLScpLCBTVUJTVFIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9jZW50ZXIoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHMgPSBTVUJTVFIuY2VudGVyKHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplKQorICAgICAgICBscGFkc2l6ZSA9IHJwYWRzaXplID0gKGxlbihzKSAtIGxlbihTVUJTVFIpKSAvLyAyCisgICAgICAgIGlmIGxlbihzKSAlIDI6CisgICAgICAgICAgICBscGFkc2l6ZSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1tscGFkc2l6ZTotcnBhZHNpemVdLCBTVUJTVFIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdHJpcCgpLCBTVUJTVFIuc3RyaXAoKSkKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzJHIC0gMSwgbWVtdXNlPTEpCisgICAgZGVmIHRlc3RfY2VudGVyX3VuaWNvZGUoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9IHUnIGFiYyBkZWYgZ2hpJworICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gU1VCU1RSLmNlbnRlcihzaXplKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHBhc3MgIyBhY2NlcHRhYmxlIG9uIDMyLWJpdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgICAgICBscGFkc2l6ZSA9IHJwYWRzaXplID0gKGxlbihzKSAtIGxlbihTVUJTVFIpKSAvLyAyCisgICAgICAgICAgICBpZiBsZW4ocykgJSAyOgorICAgICAgICAgICAgICAgIGxwYWRzaXplICs9IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1tscGFkc2l6ZTotcnBhZHNpemVdLCBTVUJTVFIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RyaXAoKSwgU1VCU1RSLnN0cmlwKCkpCisgICAgICAgICAgICBkZWwgcworCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2NvdW50KHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJworICAgICAgICBzID0gJy4nICogc2l6ZSArIFNVQlNUUgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJy4nKSwgc2l6ZSkKKyAgICAgICAgcyArPSAnLicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCcuJyksIHNpemUgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJyAnKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCdpJyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnaicpLCAwKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAyLCBtZW11c2U9MykKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZiwgc2l6ZSk6CisgICAgICAgIHMgPSAnLicgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMuZGVjb2RlKCd1dGYtOCcpKSwgc2l6ZSkKKworICAgIGRlZiBiYXNpY19lbmNvZGVfdGVzdChzZWxmLCBzaXplLCBlbmMsIGM9dScuJywgZXhwZWN0ZWRzaXplPU5vbmUpOgorICAgICAgICBpZiBleHBlY3RlZHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIGV4cGVjdGVkc2l6ZSA9IHNpemUKKworICAgICAgICBzID0gYyAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocy5lbmNvZGUoZW5jKSksIGV4cGVjdGVkc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTMpCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY19lbmNvZGVfdGVzdChzaXplLCAndXRmLTgnKQorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgLy8gNiArIDIsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2VuY29kZV9yYXdfdW5pY29kZV9lc2NhcGUoc2VsZiwgc2l6ZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX2VuY29kZV90ZXN0KHNpemUsICdyYXdfdW5pY29kZV9lc2NhcGUnKQorICAgICAgICBleGNlcHQgTWVtb3J5RXJyb3I6CisgICAgICAgICAgICBwYXNzICMgYWNjZXB0YWJsZSBvbiAzMi1iaXQKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8vIDUgKyA3MCwgbWVtdXNlPTMpCisgICAgZGVmIHRlc3RfZW5jb2RlX3V0Zjcoc2VsZiwgc2l6ZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX2VuY29kZV90ZXN0KHNpemUsICd1dGY3JykKKyAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgICAgICAgICAgcGFzcyAjIGFjY2VwdGFibGUgb24gMzItYml0CisKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyAvLyA0ICsgNSwgbWVtdXNlPTYpCisgICAgZGVmIHRlc3RfZW5jb2RlX3V0ZjMyKHNlbGYsIHNpemUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5iYXNpY19lbmNvZGVfdGVzdChzaXplLCAndXRmMzInLCBleHBlY3RlZHNpemU9NCpzaXplKzQpCisgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MgIyBhY2NlcHRhYmxlIG9uIDMyLWJpdAorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fMkctMSwgbWVtdXNlPTQpCisgICAgZGVmIHRlc3RfZGVjb2RlYXNjaWkoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX2VuY29kZV90ZXN0KHNpemUsICdhc2NpaScsIGM9J0EnKQorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgLy8gNSwgbWVtdXNlPTYrMikKKyAgICBkZWYgdGVzdF91bmljb2RlX3JlcHJfb2ZsdyhzZWxmLCBzaXplKToKKyAgICAgICAgc2VsZi5za2lwVGVzdCgidGVzdCBjcmFzaGVzIC0gc2VlIGlzc3VlICMxNDkwNCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSB1Ilx1QUFBQSIqc2l6ZQorICAgICAgICAgICAgciA9IHJlcHIocykKKyAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgICAgICAgICAgcGFzcyAjIGFjY2VwdGFibGUgb24gMzItYml0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocyA9PSBldmFsKHIpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2VuZHN3aXRoKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJworICAgICAgICBzID0gJy0nICogc2l6ZSArIFNVQlNUUgorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5lbmRzd2l0aChTVUJTVFIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5lbmRzd2l0aChzKSkKKyAgICAgICAgczIgPSAnLi4uJyArIHMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMyLmVuZHN3aXRoKHMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuZW5kc3dpdGgoJ2EnICsgU1VCU1RSKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShTVUJTVFIuZW5kc3dpdGgocykpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9leHBhbmR0YWJzKHNlbGYsIHNpemUpOgorICAgICAgICBzID0gJy0nICogc2l6ZQorICAgICAgICB0YWJzaXplID0gOAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZXhwYW5kdGFicygpLCBzKQorICAgICAgICBkZWwgcworICAgICAgICBzbGVuLCByZW1haW5kZXIgPSBkaXZtb2Qoc2l6ZSwgdGFic2l6ZSkKKyAgICAgICAgcyA9ICcgICAgICAgXHQnICogc2xlbgorICAgICAgICBzID0gcy5leHBhbmR0YWJzKHRhYnNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplIC0gcmVtYWluZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzLnN0cmlwKCcgJykpLCAwKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2ZpbmQoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHN1YmxlbiA9IGxlbihTVUJTVFIpCisgICAgICAgIHMgPSAnJy5qb2luKFtTVUJTVFIsICctJyAqIHNpemUsIFNVQlNUUl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5maW5kKCcgJyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5maW5kKFNVQlNUUiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5maW5kKCcgJywgc3VibGVuKSwgc3VibGVuICsgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmZpbmQoU1VCU1RSLCBsZW4oU1VCU1RSKSksIHN1YmxlbiArIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5maW5kKCdpJyksIFNVQlNUUi5maW5kKCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5maW5kKCdpJywgc3VibGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWJsZW4gKyBzaXplICsgU1VCU1RSLmZpbmQoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmZpbmQoJ2knLCBzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWJsZW4gKyBzaXplICsgU1VCU1RSLmZpbmQoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmZpbmQoJ2onKSwgLTEpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfaW5kZXgoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHN1YmxlbiA9IGxlbihTVUJTVFIpCisgICAgICAgIHMgPSAnJy5qb2luKFtTVUJTVFIsICctJyAqIHNpemUsIFNVQlNUUl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5pbmRleCgnICcpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuaW5kZXgoU1VCU1RSKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmluZGV4KCcgJywgc3VibGVuKSwgc3VibGVuICsgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmluZGV4KFNVQlNUUiwgc3VibGVuKSwgc3VibGVuICsgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmluZGV4KCdpJyksIFNVQlNUUi5pbmRleCgnaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuaW5kZXgoJ2knLCBzdWJsZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmxlbiArIHNpemUgKyBTVUJTVFIuaW5kZXgoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmluZGV4KCdpJywgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VibGVuICsgc2l6ZSArIFNVQlNUUi5pbmRleCgnaScpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzLmluZGV4LCAnaicpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfaXNhbG51bShzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJzEyMzQ1NicKKyAgICAgICAgcyA9ICdhJyAqIHNpemUgKyBTVUJTVFIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuaXNhbG51bSgpKQorICAgICAgICBzICs9ICcuJworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXNhbG51bSgpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2lzYWxwaGEoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICd6enp6enp6JworICAgICAgICBzID0gJ2EnICogc2l6ZSArIFNVQlNUUgorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc2FscGhhKCkpCisgICAgICAgIHMgKz0gJy4nCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocy5pc2FscGhhKCkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfaXNkaWdpdChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJzEyMzQ1NicKKyAgICAgICAgcyA9ICc5JyAqIHNpemUgKyBTVUJTVFIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuaXNkaWdpdCgpKQorICAgICAgICBzICs9ICd6JworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXNkaWdpdCgpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2lzbG93ZXIoc2VsZiwgc2l6ZSk6CisgICAgICAgIGNoYXJzID0gJycuam9pbihbIGNocihjKSBmb3IgYyBpbiByYW5nZSgyNTUpIGlmIG5vdCBjaHIoYykuaXN1cHBlcigpIF0pCisgICAgICAgIHJlcGVhdHMgPSBzaXplIC8vIGxlbihjaGFycykgKyAyCisgICAgICAgIHMgPSBjaGFycyAqIHJlcGVhdHMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuaXNsb3dlcigpKQorICAgICAgICBzICs9ICdBJworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXNsb3dlcigpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2lzc3BhY2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIHdoaXRlc3BhY2UgPSAnIFxmXG5cclx0XHYnCisgICAgICAgIHJlcGVhdHMgPSBzaXplIC8vIGxlbih3aGl0ZXNwYWNlKSArIDIKKyAgICAgICAgcyA9IHdoaXRlc3BhY2UgKiByZXBlYXRzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmlzc3BhY2UoKSkKKyAgICAgICAgcyArPSAnaicKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmlzc3BhY2UoKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9pc3RpdGxlKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnMTIzNDU2JworICAgICAgICBzID0gJycuam9pbihbJ0EnLCAnYScgKiBzaXplLCBTVUJTVFJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc3RpdGxlKCkpCisgICAgICAgIHMgKz0gJ0EnCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmlzdGl0bGUoKSkKKyAgICAgICAgcyArPSAnYUEnCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocy5pc3RpdGxlKCkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfaXN1cHBlcihzZWxmLCBzaXplKToKKyAgICAgICAgY2hhcnMgPSAnJy5qb2luKFsgY2hyKGMpIGZvciBjIGluIHJhbmdlKDI1NSkgaWYgbm90IGNocihjKS5pc2xvd2VyKCkgXSkKKyAgICAgICAgcmVwZWF0cyA9IHNpemUgLy8gbGVuKGNoYXJzKSArIDIKKyAgICAgICAgcyA9IGNoYXJzICogcmVwZWF0cworICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc3VwcGVyKCkpCisgICAgICAgIHMgKz0gJ2EnCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocy5pc3VwcGVyKCkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3Rfam9pbihzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICdBJyAqIHNpemUKKyAgICAgICAgeCA9IHMuam9pbihbJ2FhYWFhJywgJ2JiYmJiJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5jb3VudCgnYScpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguY291bnQoJ2InKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguc3RhcnRzd2l0aCgnYWFhYWFBJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LmVuZHN3aXRoKCdBYmJiYmInKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X2xqdXN0KHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJworICAgICAgICBzID0gU1VCU1RSLmxqdXN0KHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoU1VCU1RSICsgJyAgJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RyaXAoKSwgU1VCU1RSLnN0cmlwKCkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9sb3dlcihzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICdBJyAqIHNpemUKKyAgICAgICAgcyA9IHMubG93ZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCdhJyksIHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9sc3RyaXAoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICdhYmMgZGVmIGdoaScKKyAgICAgICAgcyA9IFNVQlNUUi5yanVzdChzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmxzdHJpcCgpLCBTVUJTVFIubHN0cmlwKCkpCisgICAgICAgIGRlbCBzCisgICAgICAgIHMgPSBTVUJTVFIubGp1c3Qoc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHN0cmlwcGVkID0gcy5sc3RyaXAoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyaXBwZWQgaXMgcykKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X3JlcGxhY2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJlcGxhY2VtZW50ID0gJ2EnCisgICAgICAgIHMgPSAnICcgKiBzaXplCisgICAgICAgIHMgPSBzLnJlcGxhY2UoJyAnLCByZXBsYWNlbWVudCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudChyZXBsYWNlbWVudCksIHNpemUpCisgICAgICAgIHMgPSBzLnJlcGxhY2UocmVwbGFjZW1lbnQsICcgJywgc2l6ZSAtIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQocmVwbGFjZW1lbnQpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbLTEwOl0sICcgICAgICBhYWFhJykKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9yZmluZChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJyBhYmMgZGVmIGdoaScKKyAgICAgICAgc3VibGVuID0gbGVuKFNVQlNUUikKKyAgICAgICAgcyA9ICcnLmpvaW4oW1NVQlNUUiwgJy0nICogc2l6ZSwgU1VCU1RSXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJmaW5kKCcgJyksIHN1YmxlbiArIHNpemUgKyBTVUJTVFIucmZpbmQoJyAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJmaW5kKFNVQlNUUiksIHN1YmxlbiArIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yZmluZCgnICcsIDAsIHNpemUpLCBTVUJTVFIucmZpbmQoJyAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJmaW5kKFNVQlNUUiwgMCwgc3VibGVuICsgc2l6ZSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yZmluZCgnaScpLCBzdWJsZW4gKyBzaXplICsgU1VCU1RSLnJmaW5kKCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yZmluZCgnaScsIDAsIHN1YmxlbiksIFNVQlNUUi5yZmluZCgnaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmZpbmQoJ2knLCAwLCBzdWJsZW4gKyBzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTVUJTVFIucmZpbmQoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJmaW5kKCdqJyksIC0xKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X3JpbmRleChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJyBhYmMgZGVmIGdoaScKKyAgICAgICAgc3VibGVuID0gbGVuKFNVQlNUUikKKyAgICAgICAgcyA9ICcnLmpvaW4oW1NVQlNUUiwgJy0nICogc2l6ZSwgU1VCU1RSXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJpbmRleCgnICcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJsZW4gKyBzaXplICsgU1VCU1RSLnJpbmRleCgnICcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmluZGV4KFNVQlNUUiksIHN1YmxlbiArIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yaW5kZXgoJyAnLCAwLCBzdWJsZW4gKyBzaXplIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgU1VCU1RSLnJpbmRleCgnICcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmluZGV4KFNVQlNUUiwgMCwgc3VibGVuICsgc2l6ZSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yaW5kZXgoJ2knKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWJsZW4gKyBzaXplICsgU1VCU1RSLnJpbmRleCgnaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmluZGV4KCdpJywgMCwgc3VibGVuKSwgU1VCU1RSLnJpbmRleCgnaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmluZGV4KCdpJywgMCwgc3VibGVuICsgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgU1VCU1RSLnJpbmRleCgnaScpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzLnJpbmRleCwgJ2onKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTEpCisgICAgZGVmIHRlc3Rfcmp1c3Qoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHMgPSBTVUJTVFIubGp1c3Qoc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aChTVUJTVFIgKyAnICAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdHJpcCgpLCBTVUJTVFIuc3RyaXAoKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X3JzdHJpcChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJyBhYmMgZGVmIGdoaScKKyAgICAgICAgcyA9IFNVQlNUUi5sanVzdChzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJzdHJpcCgpLCBTVUJTVFIucnN0cmlwKCkpCisgICAgICAgIGRlbCBzCisgICAgICAgIHMgPSBTVUJTVFIucmp1c3Qoc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHN0cmlwcGVkID0gcy5yc3RyaXAoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyaXBwZWQgaXMgcykKKworICAgICMgVGhlIHRlc3QgdGFrZXMgYWJvdXQgc2l6ZSBieXRlcyB0byBidWlsZCBhIHN0cmluZywgYW5kIHRoZW4gYWJvdXQKKyAgICAjIHNxcnQoc2l6ZSkgc3Vic3RyaW5ncyBvZiBzcXJ0KHNpemUpIGluIHNpemUgYW5kIGEgbGlzdCB0bworICAgICMgaG9sZCBzcXJ0KHNpemUpIGl0ZW1zLiBJdCdzIGNsb3NlIGJ1dCBqdXN0IG92ZXIgMnggc2l6ZS4KKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIuMSkKKyAgICBkZWYgdGVzdF9zcGxpdF9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgIyBDcnVkZWx5IGNhbGN1bGF0ZSBhbiBlc3RpbWF0ZSBzbyB0aGF0IHRoZSByZXN1bHQgb2Ygcy5zcGxpdCB3b24ndAorICAgICAgICAjIHRha2UgdXAgYW4gaW5vcmRpbmF0ZSBhbW91bnQgb2YgbWVtb3J5CisgICAgICAgIGNodW5rc2l6ZSA9IGludChzaXplICoqIDAuNSArIDIpCisgICAgICAgIFNVQlNUUiA9ICdhJyArICcgJyAqIGNodW5rc2l6ZQorICAgICAgICBzID0gU1VCU1RSICogY2h1bmtzaXplCisgICAgICAgIGwgPSBzLnNwbGl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIGNodW5rc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobCksIHNldChbJ2EnXSkpCisgICAgICAgIGRlbCBsCisgICAgICAgIGwgPSBzLnNwbGl0KCdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIGNodW5rc2l6ZSArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGwpLCBzZXQoWycnLCAnICcgKiBjaHVua3NpemVdKSkKKworICAgICMgQWxsb2NhdGVzIGEgc3RyaW5nIG9mIHR3aWNlIHNpemUgKGFuZCBicmllZmx5IHR3bykgYW5kIGEgbGlzdCBvZgorICAgICMgc2l6ZS4gIEJlY2F1c2Ugb2YgaW50ZXJuYWwgYWZmYWlycywgdGhlIHMuc3BsaXQoKSBjYWxsIHByb2R1Y2VzIGEKKyAgICAjIGxpc3Qgb2Ygc2l6ZSB0aW1lcyB0aGUgc2FtZSBvbmUtY2hhcmFjdGVyIHN0cmluZywgc28gd2Ugb25seQorICAgICMgc3VmZmVyIGZvciB0aGUgbGlzdCBzaXplLiAoT3RoZXJ3aXNlLCBpdCdkIGNvc3QgYW5vdGhlciA0OCB0aW1lcworICAgICMgc2l6ZSBpbiBieXRlcyEpIE5ldmVydGhlbGVzcywgYSBsaXN0IG9mIHNpemUgdGFrZXMKKyAgICAjIDgqc2l6ZSBieXRlcy4KKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDUsIG1lbXVzZT0xMCkKKyAgICBkZWYgdGVzdF9zcGxpdF9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICcgYScgKiBzaXplICsgJyAnCisgICAgICAgIGwgPSBzLnNwbGl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGwpLCBzZXQoWydhJ10pKQorICAgICAgICBkZWwgbAorICAgICAgICBsID0gcy5zcGxpdCgnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobCksIHNldChbJyAnXSkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIuMSkKKyAgICBkZWYgdGVzdF9zcGxpdGxpbmVzKHNlbGYsIHNpemUpOgorICAgICAgICAjIENydWRlbHkgY2FsY3VsYXRlIGFuIGVzdGltYXRlIHNvIHRoYXQgdGhlIHJlc3VsdCBvZiBzLnNwbGl0IHdvbid0CisgICAgICAgICMgdGFrZSB1cCBhbiBpbm9yZGluYXRlIGFtb3VudCBvZiBtZW1vcnkKKyAgICAgICAgY2h1bmtzaXplID0gaW50KHNpemUgKiogMC41ICsgMikgLy8gMgorICAgICAgICBTVUJTVFIgPSAnICcgKiBjaHVua3NpemUgKyAnXG4nICsgJyAnICogY2h1bmtzaXplICsgJ1xyXG4nCisgICAgICAgIHMgPSBTVUJTVFIgKiBjaHVua3NpemUKKyAgICAgICAgbCA9IHMuc3BsaXRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBjaHVua3NpemUgKiAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChsKSwgc2V0KFsnICcgKiBjaHVua3NpemVdKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9zdGFydHN3aXRoKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJworICAgICAgICBzID0gJy0nICogc2l6ZSArIFNVQlNUUgorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKHMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCctJyAqIHNpemUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuc3RhcnRzd2l0aChTVUJTVFIpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X3N0cmlwKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnICAgYWJjIGRlZiBnaGkgICAnCisgICAgICAgIHMgPSBTVUJTVFIucmp1c3Qoc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdHJpcCgpLCBTVUJTVFIuc3RyaXAoKSkKKyAgICAgICAgZGVsIHMKKyAgICAgICAgcyA9IFNVQlNUUi5sanVzdChzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN0cmlwKCksIFNVQlNUUi5zdHJpcCgpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X3N3YXBjYXNlKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAiYUJjRGVGRzEyLidceGE5XHgwMCIKKyAgICAgICAgc3VibGVuID0gbGVuKFNVQlNUUikKKyAgICAgICAgcmVwZWF0cyA9IHNpemUgLy8gc3VibGVuICsgMgorICAgICAgICBzID0gU1VCU1RSICogcmVwZWF0cworICAgICAgICBzID0gcy5zd2FwY2FzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzdWJsZW4gKiByZXBlYXRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbOnN1YmxlbiAqIDNdLCBTVUJTVFIuc3dhcGNhc2UoKSAqIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1stc3VibGVuICogMzpdLCBTVUJTVFIuc3dhcGNhc2UoKSAqIDMpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfdGl0bGUoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICdTcGFhSEFhYUFhaGFtJworICAgICAgICBzID0gU1VCU1RSICogKHNpemUgLy8gbGVuKFNVQlNUUikgKyAyKQorICAgICAgICBzID0gcy50aXRsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoKFNVQlNUUiAqIDMpLnRpdGxlKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5lbmRzd2l0aChTVUJTVFIubG93ZXIoKSAqIDMpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X3RyYW5zbGF0ZShzZWxmLCBzaXplKToKKyAgICAgICAgdHJhbnMgPSBzdHJpbmcubWFrZXRyYW5zKCcuYVonLCAnLSEkJykKKyAgICAgICAgU1VCU1RSID0gJ2Faei56LkFhei4nCisgICAgICAgIHN1YmxlbiA9IGxlbihTVUJTVFIpCisgICAgICAgIHJlcGVhdHMgPSBzaXplIC8vIHN1YmxlbiArIDIKKyAgICAgICAgcyA9IFNVQlNUUiAqIHJlcGVhdHMKKyAgICAgICAgcyA9IHMudHJhbnNsYXRlKHRyYW5zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgcmVwZWF0cyAqIHN1YmxlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWzpzdWJsZW5dLCBTVUJTVFIudHJhbnNsYXRlKHRyYW5zKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWy1zdWJsZW46XSwgU1VCU1RSLnRyYW5zbGF0ZSh0cmFucykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnLicpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJyEnKSwgcmVwZWF0cyAqIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgneicpLCByZXBlYXRzICogMykKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgNSwgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfdXBwZXIoc2VsZiwgc2l6ZSk6CisgICAgICAgIHMgPSAnYScgKiBzaXplCisgICAgICAgIHMgPSBzLnVwcGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnQScpLCBzaXplKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAyMCwgbWVtdXNlPTEpCisgICAgZGVmIHRlc3RfemZpbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICctNTY4MzI0NzIzNTk4MjM0JworICAgICAgICBzID0gU1VCU1RSLnpmaWxsKHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmVuZHN3aXRoKCcwJyArIFNVQlNUUlsxOl0pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCctMCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCcwJyksIHNpemUgLSBsZW4oU1VCU1RSKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICctJyAqIHNpemUKKyAgICAgICAgc2YgPSAnJXMnICUgKHMsKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocyA9PSBzZikKKyAgICAgICAgZGVsIHNmCisgICAgICAgIHNmID0gJy4uJXMuLicgJSAocywpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNmKSwgbGVuKHMpICsgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNmLnN0YXJ0c3dpdGgoJy4uLScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2YuZW5kc3dpdGgoJy0uLicpKQorICAgICAgICBkZWwgcywgc2YKKworICAgICAgICBzaXplIC8vPSAyCisgICAgICAgIGVkZ2UgPSAnLScgKiBzaXplCisgICAgICAgIHMgPSAnJy5qb2luKFtlZGdlLCAnJXMnLCBlZGdlXSkKKyAgICAgICAgZGVsIGVkZ2UKKyAgICAgICAgcyA9IHMgJSAnLi4uJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSAqIDIgKyAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJy4nKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCctJyksIHNpemUgKiAyKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTUpCisgICAgZGVmIHRlc3RfcmVwcl9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICctJyAqIHNpemUKKyAgICAgICAgcyA9IHJlcHIocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUgKyAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbMF0sICInIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWy0xXSwgIiciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJy0nKSwgc2l6ZSkKKyAgICAgICAgZGVsIHMKKyAgICAgICAgIyByZXByKCkgd2lsbCBjcmVhdGUgYSBzdHJpbmcgZm91ciB0aW1lcyBhcyBsYXJnZSBhcyB0aGlzICdiaW5hcnkKKyAgICAgICAgIyBzdHJpbmcnLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBtdWNoIG1vcmUgdGhhbiB0d2ljZQorICAgICAgICAjIHNpemUgaW4gdG90YWwuICAoV2UgZG8gZXh0cmEgdGVzdGluZyBpbiB0ZXN0X3JlcHJfbGFyZ2UoKSkKKyAgICAgICAgcyA9ICdceDAwJyAqIHNpemUKKyAgICAgICAgcyA9IHJlcHIocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUgKiA0ICsgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWzBdLCAiJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1stMV0sICInIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCdcXCcpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJzAnKSwgc2l6ZSAqIDIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9NSkKKyAgICBkZWYgdGVzdF9yZXByX2xhcmdlKHNlbGYsIHNpemUpOgorICAgICAgICBzID0gJ1x4MDAnICogc2l6ZQorICAgICAgICBzID0gcmVwcihzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSAqIDQgKyAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbMF0sICInIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWy0xXSwgIiciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJ1xcJyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnMCcpLCBzaXplICogMikKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9MioqMzIgLy8gNSwgbWVtdXNlPTYrMikKKyAgICBkZWYgdGVzdF91bmljb2RlX3JlcHIoc2VsZiwgc2l6ZSk6CisgICAgICAgIHMgPSB1Ilx1QUFBQSIgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocmVwcihzKSkgPiBzaXplKQorCisgICAgIyBUaGlzIHRlc3QgaXMgbWVhbmluZ2Z1bCBldmVuIHdpdGggc2l6ZSA8IDJHLCBhcyBsb25nIGFzIHRoZQorICAgICMgZG91YmxlZCBzdHJpbmcgaXMgPiAyRyAoYnV0IGl0IHRlc3RzIG1vcmUgaWYgYm90aCBhcmUgPiAyRyA6KQorICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzFHICsgMiwgbWVtdXNlPTMpCisgICAgZGVmIHRlc3RfY29uY2F0KHNlbGYsIHNpemUpOgorICAgICAgICBzID0gJy4nICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgcyA9IHMgKyBzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCcuJyksIHNpemUgKiAyKQorCisgICAgIyBUaGlzIHRlc3QgaXMgbWVhbmluZ2Z1bCBldmVuIHdpdGggc2l6ZSA8IDJHLCBhcyBsb25nIGFzIHRoZQorICAgICMgcmVwZWF0ZWQgc3RyaW5nIGlzID4gMkcgKGJ1dCBpdCB0ZXN0cyBtb3JlIGlmIGJvdGggYXJlID4gMkcgOikKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8xRyArIDIsIG1lbXVzZT0zKQorICAgIGRlZiB0ZXN0X3JlcGVhdChzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICcuJyAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHMgPSBzICogMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSAqIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnLicpLCBzaXplICogMikKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMjAsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X3NsaWNlX2FuZF9nZXRpdGVtKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnMDEyMzQ1Njc4OScKKyAgICAgICAgc3VibGVuID0gbGVuKFNVQlNUUikKKyAgICAgICAgcyA9IFNVQlNUUiAqIChzaXplIC8vIHN1YmxlbikKKyAgICAgICAgc3RlcHNpemUgPSBsZW4ocykgLy8gMTAwCisgICAgICAgIHN0ZXBzaXplID0gc3RlcHNpemUgLSAoc3RlcHNpemUgJSBzdWJsZW4pCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihzKSAtIHN0ZXBzaXplLCBzdGVwc2l6ZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbaV0sIFNVQlNUUlswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1tpOmkgKyBzdWJsZW5dLCBTVUJTVFIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbaTppICsgc3VibGVuOjJdLCBTVUJTVFJbOjoyXSkKKyAgICAgICAgICAgIGlmIGkgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1tpICsgc3VibGVuIC0gMTppIC0gMTotM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJTVFJbc3VibGVuOjotM10pCisgICAgICAgICMgTWFrZSBzdXJlIHdlIGRvIHNvbWUgc2xpY2luZyBhbmQgaW5kZXhpbmcgbmVhciB0aGUgZW5kIG9mIHRoZQorICAgICAgICAjIHN0cmluZywgdG9vLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbbGVuKHMpIC0gMV0sIFNVQlNUUlstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1stMV0sIFNVQlNUUlstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1tsZW4ocykgLSAxMF0sIFNVQlNUUlswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWy1zdWJsZW5dLCBTVUJTVFJbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1tsZW4ocyk6XSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1tsZW4ocykgLSAxOl0sIFNVQlNUUlstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1stMTpdLCBTVUJTVFJbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbbGVuKHMpIC0gc3VibGVuOl0sIFNVQlNUUikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWy1zdWJsZW46XSwgU1VCU1RSKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzWzpdKSwgbGVuKHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzWzpsZW4ocykgLSA1XSksIGxlbihzKSAtIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNbNTotNV0pLCBsZW4ocykgLSAxMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBvcGVyYXRvci5nZXRpdGVtLCBzLCBsZW4ocykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIHMsIGxlbihzKSArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIHMsIGxlbihzKSArIDE8PDMxKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnMDEyMzQ1Njc4OScKKyAgICAgICAgZWRnZSA9ICctJyAqIChzaXplIC8vIDIpCisgICAgICAgIHMgPSAnJy5qb2luKFtlZGdlLCBTVUJTVFIsIGVkZ2VdKQorICAgICAgICBkZWwgZWRnZQorICAgICAgICBzZWxmLmFzc2VydEluKFNVQlNUUiwgcykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihTVUJTVFIgKiAyLCBzKQorICAgICAgICBzZWxmLmFzc2VydEluKCctJywgcykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignYScsIHMpCisgICAgICAgIHMgKz0gJ2EnCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCBzKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmLCBzaXplKToKKyAgICAgICAgczEgPSAnLScgKiBzaXplCisgICAgICAgIHMyID0gJy0nICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoczEgPT0gczIpCisgICAgICAgIGRlbCBzMgorICAgICAgICBzMiA9IHMxICsgJ2EnCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoczEgPT0gczIpCisgICAgICAgIGRlbCBzMgorICAgICAgICBzMiA9ICcuJyAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzMSA9PSBzMikKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X2hhc2goc2VsZiwgc2l6ZSk6CisgICAgICAgICMgTm90IHN1cmUgaWYgd2UgY2FuIGRvIGFueSBtZWFuaW5nZnVsIHRlc3RzIGhlcmUuLi4gIEV2ZW4gaWYgd2UKKyAgICAgICAgIyBzdGFydCByZWx5aW5nIG9uIHRoZSBleGFjdCBhbGdvcml0aG0gdXNlZCwgdGhlIHJlc3VsdCB3aWxsIGJlCisgICAgICAgICMgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgQyAnbG9uZyBpbnQnLiAgRXZlbiB0aGlzCisgICAgICAgICMgdGVzdCBpcyBkb2RneSAodGhlcmUncyBubyAqZ3VhcmFudGVlKiB0aGF0IHRoZSB0d28gdGhpbmdzIHNob3VsZAorICAgICAgICAjIGhhdmUgYSBkaWZmZXJlbnQgaGFzaCwgZXZlbiBpZiB0aGV5LCBpbiB0aGUgY3VycmVudAorICAgICAgICAjIGltcGxlbWVudGF0aW9uLCBhbG1vc3QgYWx3YXlzIGRvLikKKyAgICAgICAgcyA9ICdceDAwJyAqIHNpemUKKyAgICAgICAgaDEgPSBoYXNoKHMpCisgICAgICAgIGRlbCBzCisgICAgICAgIHMgPSAnXHgwMCcgKiAoc2l6ZSArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaDEgPT0gaGFzaChzKSkKKworY2xhc3MgVHVwbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICMgVHVwbGVzIGhhdmUgYSBzbWFsbCwgZml4ZWQtc2l6ZWQgaGVhZCBhbmQgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8KKyAgICAjIGRhdGEuICBTaW5jZSB3ZSdyZSB0ZXN0aW5nIDY0LWJpdCBhZGRyZXNzaW5nLCB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlCisgICAgIyBwb2ludGVycyBhcmUgOCBieXRlcywgYW5kIHRoYXQgdGh1cyB0aGF0IHRoZSB0dXBsZXMgdGFrZSB1cCA4IGJ5dGVzCisgICAgIyBwZXIgc2l6ZS4KKworICAgICMgQXMgYSBzaWRlLWVmZmVjdCBvZiB0ZXN0aW5nIGxvbmcgdHVwbGVzLCB0aGVzZSB0ZXN0cyBoYXBwZW4gdG8gdGVzdAorICAgICMgaGF2aW5nIG1vcmUgdGhhbiAyPDwzMSByZWZlcmVuY2VzIHRvIGFueSBnaXZlbiBvYmplY3QuIEhlbmNlIHRoZQorICAgICMgdXNlIG9mIGRpZmZlcmVudCB0eXBlcyBvZiBvYmplY3RzIGFzIGNvbnRlbnRzIGluIGRpZmZlcmVudCB0ZXN0cy4KKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTE2KQorICAgIGRlZiB0ZXN0X2NvbXBhcmUoc2VsZiwgc2l6ZSk6CisgICAgICAgIHQxID0gKHUnJywpICogc2l6ZQorICAgICAgICB0MiA9ICh1JycsKSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID09IHQyKQorICAgICAgICBkZWwgdDIKKyAgICAgICAgdDIgPSAodScnLCkgKiAoc2l6ZSArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDEgPT0gdDIpCisgICAgICAgIGRlbCB0MgorICAgICAgICB0MiA9ICgxLCkgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDEgPT0gdDIpCisKKyAgICAjIFRlc3QgY29uY2F0ZW5hdGluZyBpbnRvIGEgc2luZ2xlIHR1cGxlIG9mIG1vcmUgdGhhbiAyRyBpbiBsZW5ndGgsCisgICAgIyBhbmQgY29uY2F0ZW5hdGluZyBhIHR1cGxlIG9mIG1vcmUgdGhhbiAyRyBpbiBsZW5ndGggc2VwYXJhdGVseSwgc28KKyAgICAjIHRoZSBzbWFsbGVyIHRlc3Qgc3RpbGwgZ2V0cyBydW4gZXZlbiBpZiB0aGVyZSBpc24ndCBtZW1vcnkgZm9yIHRoZQorICAgICMgbGFyZ2VyIHRlc3QgKGJ1dCB3ZSBzdGlsbCBsZXQgdGhlIHRlc3RlciBrbm93IHRoZSBsYXJnZXIgdGVzdCBpcworICAgICMgc2tpcHBlZCwgaW4gdmVyYm9zZSBtb2RlLikKKyAgICBkZWYgYmFzaWNfY29uY2F0X3Rlc3Qoc2VsZiwgc2l6ZSk6CisgICAgICAgIHQgPSAoKCksKSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odCksIHNpemUpCisgICAgICAgIHQgPSB0ICsgdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0KSwgc2l6ZSAqIDIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAyICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X2NvbmNhdF9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfY29uY2F0X3Rlc3Qoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X2NvbmNhdF9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfY29uY2F0X3Rlc3Qoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDUgKyAxMCwgbWVtdXNlPTggKiA1KQorICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYsIHNpemUpOgorICAgICAgICB0ID0gKDEsIDIsIDMsIDQsIDUpICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0KSwgc2l6ZSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oNSwgdCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigoMSwgMiwgMywgNCwgNSksIHQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMCwgdCkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT04KQorICAgIGRlZiB0ZXN0X2hhc2goc2VsZiwgc2l6ZSk6CisgICAgICAgIHQxID0gKDAsKSAqIHNpemUKKyAgICAgICAgaDEgPSBoYXNoKHQxKQorICAgICAgICBkZWwgdDEKKyAgICAgICAgdDIgPSAoMCwpICogKHNpemUgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGgxID09IGhhc2godDIpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTgpCisgICAgZGVmIHRlc3RfaW5kZXhfYW5kX3NsaWNlKHNlbGYsIHNpemUpOgorICAgICAgICB0ID0gKE5vbmUsKSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFstMV0sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFs1XSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0W3NpemUgLSAxXSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgdCwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Wzo1XSwgKE5vbmUsKSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFstNTpdLCAoTm9uZSwpICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0WzIwOjI1XSwgKE5vbmUsKSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFstMjU6LTIwXSwgKE5vbmUsKSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFtzaXplIC0gNTpdLCAoTm9uZSwpICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0W3NpemUgLSA1OnNpemVdLCAoTm9uZSwpICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0W3NpemUgLSA2OnNpemUgLSAyXSwgKE5vbmUsKSAqIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFtzaXplOnNpemVdLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0W3NpemU6c2l6ZSs1XSwgKCkpCisKKyAgICAjIExpa2UgdGVzdF9jb25jYXQsIHNwbGl0IGluIHR3by4KKyAgICBkZWYgYmFzaWNfdGVzdF9yZXBlYXQoc2VsZiwgc2l6ZSk6CisgICAgICAgIHQgPSAoJycsKSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odCksIHNpemUpCisgICAgICAgIHQgPSB0ICogMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0KSwgc2l6ZSAqIDIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAyICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X3JlcGVhdF9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXBlYXQoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X3JlcGVhdF9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXBlYXQoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzFHIC0gMSwgbWVtdXNlPTEyKQorICAgIGRlZiB0ZXN0X3JlcGVhdF9sYXJnZV8yKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X3JlcGVhdChzaXplKQorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fMUcgLSAxLCBtZW11c2U9OSkKKyAgICBkZWYgdGVzdF9mcm9tXzJHX2dlbmVyYXRvcihzZWxmLCBzaXplKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdCA9IHR1cGxlKHhyYW5nZShzaXplKSkKKyAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgICAgICAgICAgcGFzcyAjIGFjY2VwdGFibGUgb24gMzItYml0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgIGZvciBpdGVtIGluIHQ6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtLCBjb3VudCkKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBzaXplKQorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fMUcgLSAyNSwgbWVtdXNlPTkpCisgICAgZGVmIHRlc3RfZnJvbV9hbG1vc3RfMkdfZ2VuZXJhdG9yKHNlbGYsIHNpemUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ID0gdHVwbGUoeHJhbmdlKHNpemUpKQorICAgICAgICAgICAgY291bnQgPSAwCisgICAgICAgICAgICBmb3IgaXRlbSBpbiB0OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbSwgY291bnQpCisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgc2l6ZSkKKyAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgICAgICAgICAgcGFzcyAjIGFjY2VwdGFibGUsIGV4cGVjdGVkIG9uIDMyLWJpdAorCisgICAgIyBMaWtlIHRlc3RfY29uY2F0LCBzcGxpdCBpbiB0d28uCisgICAgZGVmIGJhc2ljX3Rlc3RfcmVwcihzZWxmLCBzaXplKToKKyAgICAgICAgdCA9ICgwLCkgKiBzaXplCisgICAgICAgIHMgPSByZXByKHQpCisgICAgICAgICMgVGhlIHJlcHIgb2YgYSB0dXBsZSBvZiAwJ3MgaXMgZXhhY3RseSB0aHJlZSB0aW1lcyB0aGUgdHVwbGUgbGVuZ3RoLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSAqIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1s6NV0sICcoMCwgMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1stNTpdLCAnMCwgMCknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJzAnKSwgc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDMgKyAyLCBtZW11c2U9OCArIDMpCisgICAgZGVmIHRlc3RfcmVwcl9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXByKHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT04ICsgMykKKyAgICBkZWYgdGVzdF9yZXByX2xhcmdlKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X3JlcHIoc2l6ZSkKKworY2xhc3MgTGlzdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBMaWtlIHR1cGxlcywgbGlzdHMgaGF2ZSBhIHNtYWxsLCBmaXhlZC1zaXplZCBoZWFkIGFuZCBhbiBhcnJheSBvZgorICAgICMgcG9pbnRlcnMgdG8gZGF0YSwgc28gOCBieXRlcyBwZXIgc2l6ZS4gQWxzbyBsaWtlIHR1cGxlcywgd2UgbWFrZSB0aGUKKyAgICAjIGxpc3RzIGhvbGQgcmVmZXJlbmNlcyB0byB2YXJpb3VzIG9iamVjdHMgdG8gdGVzdCB0aGVpciByZWZjb3VudAorICAgICMgbGltaXRzLgorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAyLCBtZW11c2U9MTYpCisgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmLCBzaXplKToKKyAgICAgICAgbDEgPSBbdScnXSAqIHNpemUKKyAgICAgICAgbDIgPSBbdScnXSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwxID09IGwyKQorICAgICAgICBkZWwgbDIKKyAgICAgICAgbDIgPSBbdScnXSAqIChzaXplICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsMSA9PSBsMikKKyAgICAgICAgZGVsIGwyCisgICAgICAgIGwyID0gWzJdICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGwxID09IGwyKQorCisgICAgIyBUZXN0IGNvbmNhdGVuYXRpbmcgaW50byBhIHNpbmdsZSBsaXN0IG9mIG1vcmUgdGhhbiAyRyBpbiBsZW5ndGgsCisgICAgIyBhbmQgY29uY2F0ZW5hdGluZyBhIGxpc3Qgb2YgbW9yZSB0aGFuIDJHIGluIGxlbmd0aCBzZXBhcmF0ZWx5LCBzbworICAgICMgdGhlIHNtYWxsZXIgdGVzdCBzdGlsbCBnZXRzIHJ1biBldmVuIGlmIHRoZXJlIGlzbid0IG1lbW9yeSBmb3IgdGhlCisgICAgIyBsYXJnZXIgdGVzdCAoYnV0IHdlIHN0aWxsIGxldCB0aGUgdGVzdGVyIGtub3cgdGhlIGxhcmdlciB0ZXN0IGlzCisgICAgIyBza2lwcGVkLCBpbiB2ZXJib3NlIG1vZGUuKQorICAgIGRlZiBiYXNpY190ZXN0X2NvbmNhdChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFtbXV0gKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBsID0gbCArIGwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUgKiAyKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gMiArIDIsIG1lbXVzZT0yNCkKKyAgICBkZWYgdGVzdF9jb25jYXRfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfY29uY2F0KHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT0yNCkKKyAgICBkZWYgdGVzdF9jb25jYXRfbGFyZ2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfY29uY2F0KHNpemUpCisKKyAgICBkZWYgYmFzaWNfdGVzdF9pbnBsYWNlX2NvbmNhdChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFtzeXMuc3Rkb3V0XSAqIHNpemUKKyAgICAgICAgbCArPSBsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxbMF0gaXMgbFstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsW3NpemUgLSAxXSBpcyBsW3NpemUgKyAxXSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDIgKyAyLCBtZW11c2U9MjQpCisgICAgZGVmIHRlc3RfaW5wbGFjZV9jb25jYXRfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfaW5wbGFjZV9jb25jYXQoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X2lucGxhY2VfY29uY2F0X2xhcmdlKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X2lucGxhY2VfY29uY2F0KHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyA1ICsgMTAsIG1lbXVzZT04ICogNSkKKyAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFsxLCAyLCAzLCA0LCA1XSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUgKiA1KQorICAgICAgICBzZWxmLmFzc2VydEluKDUsIGwpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oWzEsIDIsIDMsIDQsIDVdLCBsKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDAsIGwpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9OCkKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYsIHNpemUpOgorICAgICAgICBsID0gWzBdICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIGwpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9OCkKKyAgICBkZWYgdGVzdF9pbmRleF9hbmRfc2xpY2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbTm9uZV0gKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbLTFdLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbNV0sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFtzaXplIC0gMV0sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIGwsIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFs6NV0sIFtOb25lXSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFstNTpdLCBbTm9uZV0gKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbMjA6MjVdLCBbTm9uZV0gKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbLTI1Oi0yMF0sIFtOb25lXSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFtzaXplIC0gNTpdLCBbTm9uZV0gKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbc2l6ZSAtIDU6c2l6ZV0sIFtOb25lXSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFtzaXplIC0gNjpzaXplIC0gMl0sIFtOb25lXSAqIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFtzaXplOnNpemVdLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsW3NpemU6c2l6ZSs1XSwgW10pCisKKyAgICAgICAgbFtzaXplIC0gMl0gPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbLTM6XSwgW05vbmUsIDUsIE5vbmVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwuY291bnQoNSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGwsIHNpemUsIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorCisgICAgICAgIGxbc2l6ZSAtIDc6XSA9IFsxLCAyLCAzLCA0LCA1XQorICAgICAgICBzaXplIC09IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFstNzpdLCBbTm9uZSwgTm9uZSwgMSwgMiwgMywgNCwgNV0pCisKKyAgICAgICAgbFs6N10gPSBbMSwgMiwgMywgNCwgNV0KKyAgICAgICAgc2l6ZSAtPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbOjddLCBbMSwgMiwgMywgNCwgNSwgTm9uZSwgTm9uZV0pCisKKyAgICAgICAgZGVsIGxbc2l6ZSAtIDFdCisgICAgICAgIHNpemUgLT0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWy0xXSwgNCkKKworICAgICAgICBkZWwgbFstMjpdCisgICAgICAgIHNpemUgLT0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWy0xXSwgMikKKworICAgICAgICBkZWwgbFswXQorICAgICAgICBzaXplIC09IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFswXSwgMikKKworICAgICAgICBkZWwgbFs6Ml0KKyAgICAgICAgc2l6ZSAtPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbMF0sIDQpCisKKyAgICAjIExpa2UgdGVzdF9jb25jYXQsIHNwbGl0IGluIHR3by4KKyAgICBkZWYgYmFzaWNfdGVzdF9yZXBlYXQoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbXSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsKQorICAgICAgICBsID0gWycnXSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIGwgPSBsICogMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSAqIDIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAyICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X3JlcGVhdF9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXBlYXQoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X3JlcGVhdF9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXBlYXQoc2l6ZSkKKworICAgIGRlZiBiYXNpY190ZXN0X2lucGxhY2VfcmVwZWF0KHNlbGYsIHNpemUpOgorICAgICAgICBsID0gWycnXQorICAgICAgICBsICo9IHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsWzBdIGlzIGxbLTFdKQorICAgICAgICBkZWwgbAorCisgICAgICAgIGwgPSBbJyddICogc2l6ZQorICAgICAgICBsICo9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUgKiAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobFtzaXplIC0gMV0gaXMgbFstMV0pCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAyICsgMiwgbWVtdXNlPTE2KQorICAgIGRlZiB0ZXN0X2lucGxhY2VfcmVwZWF0X3NtYWxsKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X2lucGxhY2VfcmVwZWF0KHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT0xNikKKyAgICBkZWYgdGVzdF9pbnBsYWNlX3JlcGVhdF9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9pbnBsYWNlX3JlcGVhdChzaXplKQorCisgICAgZGVmIGJhc2ljX3Rlc3RfcmVwcihzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFswXSAqIHNpemUKKyAgICAgICAgcyA9IHJlcHIobCkKKyAgICAgICAgIyBUaGUgcmVwciBvZiBhIGxpc3Qgb2YgMCdzIGlzIGV4YWN0bHkgdGhyZWUgdGltZXMgdGhlIGxpc3QgbGVuZ3RoLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSAqIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1s6NV0sICdbMCwgMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1stNTpdLCAnMCwgMF0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJzAnKSwgc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDMgKyAyLCBtZW11c2U9OCArIDMpCisgICAgZGVmIHRlc3RfcmVwcl9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXByKHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT04ICsgMykKKyAgICBkZWYgdGVzdF9yZXByX2xhcmdlKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X3JlcHIoc2l6ZSkKKworICAgICMgbGlzdCBvdmVyYWxsb2NhdGVzIH4xLzh0aCBvZiB0aGUgdG90YWwgc2l6ZSAob24gZmlyc3QgZXhwYW5zaW9uKSBzbworICAgICMgdGhlIHNpbmdsZSBsaXN0LmFwcGVuZCBjYWxsIHB1dHMgbWVtdXNlIGF0IDkgYnl0ZXMgcGVyIHNpemUuCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT05KQorICAgIGRlZiB0ZXN0X2FwcGVuZChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFtvYmplY3QoKV0gKiBzaXplCisgICAgICAgIGwuYXBwZW5kKG9iamVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSsxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobFstM10gaXMgbFstMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobFstMl0gaXMgbFstMV0pCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyA1ICsgMiwgbWVtdXNlPTggKiA1KQorICAgIGRlZiB0ZXN0X2NvdW50KHNlbGYsIHNpemUpOgorICAgICAgICBsID0gWzEsIDIsIDMsIDQsIDVdICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwuY291bnQoMSksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5jb3VudCgiMSIpLCAwKQorCisgICAgZGVmIGJhc2ljX3Rlc3RfZXh0ZW5kKHNlbGYsIHNpemUpOgorICAgICAgICBsID0gW2ZpbGVdICogc2l6ZQorICAgICAgICBsLmV4dGVuZChsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSAqIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsWzBdIGlzIGxbLTFdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobFtzaXplIC0gMV0gaXMgbFtzaXplICsgMV0pCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAyICsgMiwgbWVtdXNlPTE2KQorICAgIGRlZiB0ZXN0X2V4dGVuZF9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9leHRlbmQoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTE2KQorICAgIGRlZiB0ZXN0X2V4dGVuZF9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9leHRlbmQoc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDUgKyAyLCBtZW11c2U9OCAqIDUpCisgICAgZGVmIHRlc3RfaW5kZXgoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbMUwsIDJMLCAzTCwgNEwsIDVMXSAqIHNpemUKKyAgICAgICAgc2l6ZSAqPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5pbmRleCgxKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLmluZGV4KDUsIHNpemUgLSA1KSwgc2l6ZSAtIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5pbmRleCg1LCBzaXplIC0gNSwgc2l6ZSksIHNpemUgLSAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsLmluZGV4LCAxLCBzaXplIC0gNCwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbC5pbmRleCwgNkwpCisKKyAgICAjIFRoaXMgdGVzdHMgc3VmZmVycyBmcm9tIG92ZXJhbGxvY2F0aW9uLCBqdXN0IGxpa2UgdGVzdF9hcHBlbmQuCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTkpCisgICAgZGVmIHRlc3RfaW5zZXJ0KHNlbGYsIHNpemUpOgorICAgICAgICBsID0gWzEuMF0gKiBzaXplCisgICAgICAgIGwuaW5zZXJ0KHNpemUgLSAxLCAiQSIpCisgICAgICAgIHNpemUgKz0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWy0zOl0sIFsxLjAsICJBIiwgMS4wXSkKKworICAgICAgICBsLmluc2VydChzaXplICsgMSwgIkIiKQorICAgICAgICBzaXplICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFstMzpdLCBbIkEiLCAxLjAsICJCIl0pCisKKyAgICAgICAgbC5pbnNlcnQoMSwgIkMiKQorICAgICAgICBzaXplICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFs6M10sIFsxLjAsICJDIiwgMS4wXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsW3NpemUgLSAzOl0sIFsiQSIsIDEuMCwgIkIiXSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDUgKyA0LCBtZW11c2U9OCAqIDUpCisgICAgZGVmIHRlc3RfcG9wKHNlbGYsIHNpemUpOgorICAgICAgICBsID0gW3UiYSIsIHUiYiIsIHUiYyIsIHUiZCIsIHUiZSJdICogc2l6ZQorICAgICAgICBzaXplICo9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisKKyAgICAgICAgaXRlbSA9IGwucG9wKCkKKyAgICAgICAgc2l6ZSAtPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW0sIHUiZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFstMjpdLCBbdSJjIiwgdSJkIl0pCisKKyAgICAgICAgaXRlbSA9IGwucG9wKDApCisgICAgICAgIHNpemUgLT0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtLCB1ImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbOjJdLCBbdSJiIiwgdSJjIl0pCisKKyAgICAgICAgaXRlbSA9IGwucG9wKHNpemUgLSAyKQorICAgICAgICBzaXplIC09IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbSwgdSJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWy0yOl0sIFt1ImIiLCB1ImQiXSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT04KQorICAgIGRlZiB0ZXN0X3JlbW92ZShzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFsxMF0gKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorCisgICAgICAgIGwucmVtb3ZlKDEwKQorICAgICAgICBzaXplIC09IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisKKyAgICAgICAgIyBCZWNhdXNlIG9mIHRoZSBlYXJsaWVyIGwucmVtb3ZlKCksIHRoaXMgYXBwZW5kIGRvZXNuJ3QgdHJpZ2dlcgorICAgICAgICAjIGEgcmVzaXplLgorICAgICAgICBsLmFwcGVuZCg1KQorICAgICAgICBzaXplICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFstMjpdLCBbMTAsIDVdKQorICAgICAgICBsLnJlbW92ZSg1KQorICAgICAgICBzaXplIC09IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFstMjpdLCBbMTAsIDEwXSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDUgKyAyLCBtZW11c2U9OCAqIDUpCisgICAgZGVmIHRlc3RfcmV2ZXJzZShzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFsxLCAyLCAzLCA0LCA1XSAqIHNpemUKKyAgICAgICAgbC5yZXZlcnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUgKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbLTU6XSwgWzUsIDQsIDMsIDIsIDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbOjVdLCBbNSwgNCwgMywgMiwgMV0pCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyA1ICsgMiwgbWVtdXNlPTggKiA1KQorICAgIGRlZiB0ZXN0X3NvcnQoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbMSwgMiwgMywgNCwgNV0gKiBzaXplCisgICAgICAgIGwuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLmNvdW50KDEpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbOjEwXSwgWzFdICogMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFstMTA6XSwgWzVdICogMTApCisKK2NsYXNzIEJ1ZmZlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fMUcsIG1lbXVzZT00KQorICAgIGRlZiB0ZXN0X3JlcGVhdChzZWxmLCBzaXplKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgICAgIGIgPSBidWZmZXIoIkFBQUEiKSpzaXplCisgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MgIyBhY2NlcHRhYmxlIG9uIDMyLWJpdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY291bnQgPSAwCisgICAgICAgICAgICBmb3IgYyBpbiBiOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgJ0EnKQorICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIHNpemUqNCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3RyVGVzdCwgVHVwbGVUZXN0LCBMaXN0VGVzdCwgQnVmZmVyVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnNldF9tZW1saW1pdChzeXMuYXJndlsxXSkKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlnbWVtLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ21lbS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmODdiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ21lbS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlnbWVtLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ21lbS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmODdiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ21lbS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluYXNjaWkucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5hc2NpaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODI1ZjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluYXNjaWkucHkKQEAgLTAsMCArMSwyMzYgQEAKKyIiIlRlc3QgdGhlIGJpbmFzY2lpIEMgbW9kdWxlLiIiIgorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgYmluYXNjaWkKK2ltcG9ydCBhcnJheQorCisjIE5vdGU6ICIqX2hleCIgZnVuY3Rpb25zIGFyZSBhbGlhc2VzIGZvciAiKHVuKWhleGxpZnkiCitiMmFfZnVuY3Rpb25zID0gWydiMmFfYmFzZTY0JywgJ2IyYV9oZXgnLCAnYjJhX2hxeCcsICdiMmFfcXAnLCAnYjJhX3V1JywKKyAgICAgICAgICAgICAgICAgJ2hleGxpZnknLCAncmxlY29kZV9ocXgnXQorYTJiX2Z1bmN0aW9ucyA9IFsnYTJiX2Jhc2U2NCcsICdhMmJfaGV4JywgJ2EyYl9ocXgnLCAnYTJiX3FwJywgJ2EyYl91dScsCisgICAgICAgICAgICAgICAgICd1bmhleGxpZnknLCAncmxlZGVjb2RlX2hxeCddCithbGxfZnVuY3Rpb25zID0gYTJiX2Z1bmN0aW9ucyArIGIyYV9mdW5jdGlvbnMgKyBbJ2NyYzMyJywgJ2NyY19ocXgnXQorCisKK2NsYXNzIEJpbkFTQ0lJVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICB0eXBlMnRlc3QgPSBzdHIKKyAgICAjIENyZWF0ZSBiaW5hcnkgdGVzdCBkYXRhCisgICAgcmF3ZGF0YSA9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLlxyXG4iCisgICAgIyBCZSBzbG93IHNvIHdlIGRvbid0IGRlcGVuZCBvbiBvdGhlciBtb2R1bGVzCisgICAgcmF3ZGF0YSArPSAiIi5qb2luKG1hcChjaHIsIHhyYW5nZSgyNTYpKSkKKyAgICByYXdkYXRhICs9ICJcclxuSGVsbG8gd29ybGQuXG4iCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYudHlwZTJ0ZXN0KHNlbGYucmF3ZGF0YSkKKworICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgICMgQ2hlY2sgbW9kdWxlIGV4Y2VwdGlvbnMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoYmluYXNjaWkuRXJyb3IsIEV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGJpbmFzY2lpLkluY29tcGxldGUsIEV4Y2VwdGlvbikpCisKKyAgICBkZWYgdGVzdF9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgICMgQ2hlY2sgcHJlc2VuY2Ugb2YgYWxsIGZ1bmN0aW9ucworICAgICAgICBmb3IgbmFtZSBpbiBhbGxfZnVuY3Rpb25zOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZ2V0YXR0cihiaW5hc2NpaSwgbmFtZSksICdfX2NhbGxfXycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhdHRyKGJpbmFzY2lpLCBuYW1lKSkKKworICAgIGRlZiB0ZXN0X3JldHVybmVkX3ZhbHVlKHNlbGYpOgorICAgICAgICAjIExpbWl0IHRvIHRoZSBtaW5pbXVtIG9mIGFsbCBsaW1pdHMgKGIyYV91dSkKKyAgICAgICAgTUFYX0FMTCA9IDQ1CisgICAgICAgIHJhdyA9IHNlbGYucmF3ZGF0YVs6TUFYX0FMTF0KKyAgICAgICAgZm9yIGZhLCBmYiBpbiB6aXAoYTJiX2Z1bmN0aW9ucywgYjJhX2Z1bmN0aW9ucyk6CisgICAgICAgICAgICBhMmIgPSBnZXRhdHRyKGJpbmFzY2lpLCBmYSkKKyAgICAgICAgICAgIGIyYSA9IGdldGF0dHIoYmluYXNjaWksIGZiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGEgPSBiMmEoc2VsZi50eXBlMnRlc3QocmF3KSkKKyAgICAgICAgICAgICAgICByZXMgPSBhMmIoc2VsZi50eXBlMnRlc3QoYSkpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlcnI6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ7fS97fSBjb252ZXJzaW9uIHJhaXNlcyB7IXJ9Ii5mb3JtYXQoZmIsIGZhLCBlcnIpKQorICAgICAgICAgICAgaWYgZmIgPT0gJ2IyYV9ocXgnOgorICAgICAgICAgICAgICAgICMgYjJhX2hxeCByZXR1cm5zIGEgdHVwbGUKKyAgICAgICAgICAgICAgICByZXMsIF8gPSByZXMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCByYXcsICJ7fS97fSBjb252ZXJzaW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7IXJ9ICE9IHshcn0iLmZvcm1hdChmYiwgZmEsIHJlcywgcmF3KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyZXMsIHN0cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShhLCBzdHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydExlc3MobWF4KG9yZChjKSBmb3IgYyBpbiBhKSwgMTI4KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYmluYXNjaWkuY3JjX2hxeChyYXcsIDApLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShiaW5hc2NpaS5jcmMzMihyYXcpLCBpbnQpCisKKyAgICBkZWYgdGVzdF9iYXNlNjR2YWxpZChzZWxmKToKKyAgICAgICAgIyBUZXN0IGJhc2U2NCB3aXRoIHZhbGlkIGRhdGEKKyAgICAgICAgTUFYX0JBU0U2NCA9IDU3CisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHNlbGYucmF3ZGF0YSksIE1BWF9CQVNFNjQpOgorICAgICAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KHNlbGYucmF3ZGF0YVtpOmkrTUFYX0JBU0U2NF0pCisgICAgICAgICAgICBhID0gYmluYXNjaWkuYjJhX2Jhc2U2NChiKQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKGEpCisgICAgICAgIHJlcyA9ICIiCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KGxpbmUpCisgICAgICAgICAgICBiID0gYmluYXNjaWkuYTJiX2Jhc2U2NChhKQorICAgICAgICAgICAgcmVzID0gcmVzICsgYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgc2VsZi5yYXdkYXRhKQorCisgICAgZGVmIHRlc3RfYmFzZTY0aW52YWxpZChzZWxmKToKKyAgICAgICAgIyBUZXN0IGJhc2U2NCB3aXRoIHJhbmRvbSBpbnZhbGlkIGNoYXJhY3RlcnMgc3ByaW5rbGVkIHRocm91Z2hvdXQKKyAgICAgICAgIyAoVGhpcyByZXF1aXJlcyBhIG5ldyB2ZXJzaW9uIG9mIGJpbmFzY2lpLikKKyAgICAgICAgTUFYX0JBU0U2NCA9IDU3CisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHNlbGYuZGF0YSksIE1BWF9CQVNFNjQpOgorICAgICAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KHNlbGYucmF3ZGF0YVtpOmkrTUFYX0JBU0U2NF0pCisgICAgICAgICAgICBhID0gYmluYXNjaWkuYjJhX2Jhc2U2NChiKQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKGEpCisKKyAgICAgICAgZmlsbGVycyA9ICIiCisgICAgICAgIHZhbGlkID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5Ky8iCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgyNTYpOgorICAgICAgICAgICAgYyA9IGNocihpKQorICAgICAgICAgICAgaWYgYyBub3QgaW4gdmFsaWQ6CisgICAgICAgICAgICAgICAgZmlsbGVycyArPSBjCisgICAgICAgIGRlZiBhZGRub2lzZShsaW5lKToKKyAgICAgICAgICAgIG5vaXNlID0gZmlsbGVycworICAgICAgICAgICAgcmF0aW8gPSBsZW4obGluZSkgLy8gbGVuKG5vaXNlKQorICAgICAgICAgICAgcmVzID0gIiIKKyAgICAgICAgICAgIHdoaWxlIGxpbmUgYW5kIG5vaXNlOgorICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lKSAvLyBsZW4obm9pc2UpID4gcmF0aW86CisgICAgICAgICAgICAgICAgICAgIGMsIGxpbmUgPSBsaW5lWzBdLCBsaW5lWzE6XQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGMsIG5vaXNlID0gbm9pc2VbMF0sIG5vaXNlWzE6XQorICAgICAgICAgICAgICAgIHJlcyArPSBjCisgICAgICAgICAgICByZXR1cm4gcmVzICsgbm9pc2UgKyBsaW5lCisgICAgICAgIHJlcyA9ICIiCisgICAgICAgIGZvciBsaW5lIGluIG1hcChhZGRub2lzZSwgbGluZXMpOgorICAgICAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KGxpbmUpCisgICAgICAgICAgICBiID0gYmluYXNjaWkuYTJiX2Jhc2U2NChhKQorICAgICAgICAgICAgcmVzICs9IGIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHNlbGYucmF3ZGF0YSkKKworICAgICAgICAjIFRlc3QgYmFzZTY0IHdpdGgganVzdCBpbnZhbGlkIGNoYXJhY3RlcnMsIHdoaWNoIHNob3VsZCByZXR1cm4KKyAgICAgICAgIyBlbXB0eSBzdHJpbmdzLiBUQkQ6IHNob3VsZG4ndCBpdCByYWlzZSBhbiBleGNlcHRpb24gaW5zdGVhZCA/CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYTJiX2Jhc2U2NChzZWxmLnR5cGUydGVzdChmaWxsZXJzKSksICcnKQorCisgICAgZGVmIHRlc3RfdXUoc2VsZik6CisgICAgICAgIE1BWF9VVSA9IDQ1CisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHNlbGYuZGF0YSksIE1BWF9VVSk6CisgICAgICAgICAgICBiID0gc2VsZi50eXBlMnRlc3Qoc2VsZi5yYXdkYXRhW2k6aStNQVhfVVVdKQorICAgICAgICAgICAgYSA9IGJpbmFzY2lpLmIyYV91dShiKQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKGEpCisgICAgICAgIHJlcyA9ICIiCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KGxpbmUpCisgICAgICAgICAgICBiID0gYmluYXNjaWkuYTJiX3V1KGEpCisgICAgICAgICAgICByZXMgKz0gYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgc2VsZi5yYXdkYXRhKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYTJiX3V1KCJceDdmIiksICJceDAwIiozMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5hMmJfdXUoIlx4ODAiKSwgIlx4MDAiKjMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmEyYl91dSgiXHhmZiIpLCAiXHgwMCIqMzEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGJpbmFzY2lpLkVycm9yLCBiaW5hc2NpaS5hMmJfdXUsICJceGZmXHgwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGJpbmFzY2lpLkVycm9yLCBiaW5hc2NpaS5hMmJfdXUsICIhISEhIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhiaW5hc2NpaS5FcnJvciwgYmluYXNjaWkuYjJhX3V1LCA0NioiISIpCisKKyAgICAgICAgIyBJc3N1ZSAjNzcwMSAoY3Jhc2ggb24gYSBweWRlYnVnIGJ1aWxkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmIyYV91dSgneCcpLCAnIT4gICBcbicpCisKKyAgICBkZWYgdGVzdF9jcmMzMihzZWxmKToKKyAgICAgICAgY3JjID0gYmluYXNjaWkuY3JjMzIoc2VsZi50eXBlMnRlc3QoIlRlc3QgdGhlIENSQy0zMiBvZiIpKQorICAgICAgICBjcmMgPSBiaW5hc2NpaS5jcmMzMihzZWxmLnR5cGUydGVzdCgiIHRoaXMgc3RyaW5nLiIpLCBjcmMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3JjLCAxNTcxMjIwMzMwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmluYXNjaWkuY3JjMzIpCisKKyAgICBkZWYgdGVzdF9ocXgoc2VsZik6CisgICAgICAgICMgUGVyZm9ybSBiaW5oZXg0IHN0eWxlIFJMRS1jb21wcmVzc2lvbgorICAgICAgICAjIFRoZW4gY2FsY3VsYXRlIHRoZSBoZXhiaW40IGJpbmFyeS10by1BU0NJSSB0cmFuc2xhdGlvbgorICAgICAgICBybGUgPSBiaW5hc2NpaS5ybGVjb2RlX2hxeChzZWxmLmRhdGEpCisgICAgICAgIGEgPSBiaW5hc2NpaS5iMmFfaHF4KHNlbGYudHlwZTJ0ZXN0KHJsZSkpCisgICAgICAgIGIsIF8gPSBiaW5hc2NpaS5hMmJfaHF4KHNlbGYudHlwZTJ0ZXN0KGEpKQorICAgICAgICByZXMgPSBiaW5hc2NpaS5ybGVkZWNvZGVfaHF4KGIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHNlbGYucmF3ZGF0YSkKKworICAgIGRlZiB0ZXN0X2hleChzZWxmKToKKyAgICAgICAgIyB0ZXN0IGhleGxpZmljYXRpb24KKyAgICAgICAgcyA9ICd7c1wwMDVcMDAwXDAwMFwwMDB3b3JsZGlcMDAyXDAwMFwwMDBcMDAwc1wwMDVcMDAwXDAwMFwwMDBoZWxsb2lcMDAxXDAwMFwwMDBcMDAwMCcKKyAgICAgICAgdCA9IGJpbmFzY2lpLmIyYV9oZXgoc2VsZi50eXBlMnRlc3QocykpCisgICAgICAgIHUgPSBiaW5hc2NpaS5hMmJfaGV4KHNlbGYudHlwZTJ0ZXN0KHQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmluYXNjaWkuYTJiX2hleCwgdFs6LTFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJpbmFzY2lpLmEyYl9oZXgsIHRbOi0xXSArICdxJykKKworICAgICAgICAjIFZlcmlmeSB0aGUgdHJlYXRtZW50IG9mIFVuaWNvZGUgc3RyaW5ncworICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5oZXhsaWZ5KHVuaWNvZGUoJ2EnLCAnYXNjaWknKSksICc2MScpCisKKyAgICBkZWYgdGVzdF9xcChzZWxmKToKKyAgICAgICAgIyBBIHRlc3QgZm9yIFNGIGJ1ZyA1MzQzNDcgKHNlZ2ZhdWx0cyB3aXRob3V0IHRoZSBwcm9wZXIgZml4KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBiaW5hc2NpaS5hMmJfcXAoIiIsICoqezE6MX0pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImJpbmFzY2lpLmEyYl9xcCgqKnsxOjF9KSBkaWRuJ3QgcmFpc2UgVHlwZUVycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5hMmJfcXAoIj0gIiksICI9ICIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYTJiX3FwKCI9PSIpLCAiPSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYTJiX3FwKCI9QVgiKSwgIj1BWCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmluYXNjaWkuYjJhX3FwLCBmb289ImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYTJiX3FwKCI9MDBcclxuPTAwIiksICJceDAwXHJcblx4MDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYmluYXNjaWkuYjJhX3FwKCJceGZmXHJcblx4ZmZcblx4ZmYiKSwKKyAgICAgICAgICAgICI9RkZcclxuPUZGXHJcbj1GRiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYmluYXNjaWkuYjJhX3FwKCIwIio3NSsiXHhmZlxyXG5ceGZmXHJcblx4ZmYiKSwKKyAgICAgICAgICAgICIwIio3NSsiPVxyXG49RkZcclxuPUZGXHJcbj1GRiIKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYjJhX3FwKCdcMFxuJyksICc9MDBcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYjJhX3FwKCdcMFxuJywgcXVvdGV0YWJzPVRydWUpLCAnPTAwXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmIyYV9xcCgnZm9vXHRiYXJcdFxuJyksICdmb29cdGJhcj0wOVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfcXAoJ2Zvb1x0YmFyXHRcbicsIHF1b3RldGFicz1UcnVlKSwgJ2Zvbz0wOWJhcj0wOVxuJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmIyYV9xcCgnLicpLCAnPTJFJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfcXAoJy5cbicpLCAnPTJFXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmIyYV9xcCgnYS5cbicpLCAnYS5cbicpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9zdHJpbmcoc2VsZik6CisgICAgICAgICMgQSB0ZXN0IGZvciBTRiBidWcgIzEwMjI5NTMuICBNYWtlIHN1cmUgU3lzdGVtRXJyb3IgaXMgbm90IHJhaXNlZC4KKyAgICAgICAgZW1wdHkgPSBzZWxmLnR5cGUydGVzdCgnJykKKyAgICAgICAgZm9yIGZ1bmMgaW4gYWxsX2Z1bmN0aW9uczoKKyAgICAgICAgICAgIGlmIGZ1bmMgPT0gJ2NyY19ocXgnOgorICAgICAgICAgICAgICAgICMgY3JjX2hxeCBuZWVkcyAyIGFyZ3VtZW50cworICAgICAgICAgICAgICAgIGJpbmFzY2lpLmNyY19ocXgoZW1wdHksIDApCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGYgPSBnZXRhdHRyKGJpbmFzY2lpLCBmdW5jKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYoZW1wdHkpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlcnI6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ7fSh7IXJ9KSByYWlzZXMgeyFyfSIuZm9ybWF0KGZ1bmMsIGVtcHR5LCBlcnIpKQorCisKK2NsYXNzIEFycmF5QmluQVNDSUlUZXN0KEJpbkFTQ0lJVGVzdCk6CisgICAgZGVmIHR5cGUydGVzdChzZWxmLCBzKToKKyAgICAgICAgcmV0dXJuIGFycmF5LmFycmF5KCdjJywgcykKKworCitjbGFzcyBCeXRlYXJyYXlCaW5BU0NJSVRlc3QoQmluQVNDSUlUZXN0KToKKyAgICB0eXBlMnRlc3QgPSBieXRlYXJyYXkKKworCitjbGFzcyBNZW1vcnl2aWV3QmluQVNDSUlUZXN0KEJpbkFTQ0lJVGVzdCk6CisgICAgdHlwZTJ0ZXN0ID0gbWVtb3J5dmlldworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEJpbkFTQ0lJVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5QmluQVNDSUlUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZWFycmF5QmluQVNDSUlUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5dmlld0JpbkFTQ0lJVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluYXNjaWkucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluYXNjaWkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MDE3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5hc2NpaS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluYXNjaWkucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluYXNjaWkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MDE3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5hc2NpaS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluaGV4LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluaGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmODk3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5oZXgucHkKQEAgLTAsMCArMSw0OSBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiVGVzdCBzY3JpcHQgZm9yIHRoZSBiaW5oZXggQyBtb2R1bGUKKworICAgVXNlcyB0aGUgbWVjaGFuaXNtIG9mIHRoZSBweXRob24gYmluaGV4IG1vZHVsZQorICAgQmFzZWQgb24gYW4gb3JpZ2luYWwgdGVzdCBieSBSb2dlciBFLiBNYXNzZS4KKyIiIgoraW1wb3J0IGJpbmhleAoraW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKworY2xhc3MgQmluSGV4VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZuYW1lMSA9IHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIKKyAgICAgICAgc2VsZi5mbmFtZTIgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRyeTogb3MudW5saW5rKHNlbGYuZm5hbWUxKQorICAgICAgICBleGNlcHQgT1NFcnJvcjogcGFzcworCisgICAgICAgIHRyeTogb3MudW5saW5rKHNlbGYuZm5hbWUyKQorICAgICAgICBleGNlcHQgT1NFcnJvcjogcGFzcworCisgICAgREFUQSA9ICdKYWNrIGlzIG15IGhlcm8nCisKKyAgICBkZWYgdGVzdF9iaW5oZXgoc2VsZik6CisgICAgICAgIGYgPSBvcGVuKHNlbGYuZm5hbWUxLCAndycpCisgICAgICAgIGYud3JpdGUoc2VsZi5EQVRBKQorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBiaW5oZXguYmluaGV4KHNlbGYuZm5hbWUxLCBzZWxmLmZuYW1lMikKKworICAgICAgICBiaW5oZXguaGV4YmluKHNlbGYuZm5hbWUyLCBzZWxmLmZuYW1lMSkKKworICAgICAgICBmID0gb3BlbihzZWxmLmZuYW1lMSwgJ3InKQorICAgICAgICBmaW5pc2ggPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLkRBVEEsIGZpbmlzaCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChCaW5IZXhUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5oZXgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluaGV4LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzI4MDY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluaGV4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5oZXgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluaGV4LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzI4MDY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluaGV4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5vcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpbm9wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZWY2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5vcC5weQpAQCAtMCwwICsxLDMzMSBAQAorIiIiVGVzdHMgZm9yIGJpbmFyeSBvcGVyYXRvcnMgb24gc3VidHlwZXMgb2YgYnVpbHQtaW4gdHlwZXMuIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworZGVmIGdjZChhLCBiKToKKyAgICAiIiJHcmVhdGVzdCBjb21tb24gZGl2aXNvciB1c2luZyBFdWNsaWQncyBhbGdvcml0aG0uIiIiCisgICAgd2hpbGUgYToKKyAgICAgICAgYSwgYiA9IGIlYSwgYQorICAgIHJldHVybiBiCisKK2RlZiBpc2ludCh4KToKKyAgICAiIiJUZXN0IHdoZXRoZXIgYW4gb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGludCBvciBsb25nLiIiIgorICAgIHJldHVybiBpc2luc3RhbmNlKHgsIGludCkgb3IgaXNpbnN0YW5jZSh4LCBsb25nKQorCitkZWYgaXNudW0oeCk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBhIGJ1aWx0LWluIG51bWVyaWMgdHlwZS4iIiIKKyAgICBmb3IgVCBpbiBpbnQsIGxvbmcsIGZsb2F0LCBjb21wbGV4OgorICAgICAgICBpZiBpc2luc3RhbmNlKHgsIFQpOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICByZXR1cm4gMAorCitkZWYgaXNSYXQoeCk6CisgICAgIiIiVGVzdCB3aGV0ZXIgYW4gb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIHRoZSBSYXQgY2xhc3MuIiIiCisgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgUmF0KQorCitjbGFzcyBSYXQob2JqZWN0KToKKworICAgICIiIlJhdGlvbmFsIG51bWJlciBpbXBsZW1lbnRlZCBhcyBhIG5vcm1hbGl6ZWQgcGFpciBvZiBsb25ncy4iIiIKKworICAgIF9fc2xvdHNfXyA9IFsnX1JhdF9fbnVtJywgJ19SYXRfX2RlbiddCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbnVtPTBMLCBkZW49MUwpOgorICAgICAgICAiIiJDb25zdHJ1Y3RvcjogUmF0KFtudW1bLCBkZW5dXSkuCisKKyAgICAgICAgVGhlIGFyZ3VtZW50cyBtdXN0IGJlIGludHMgb3IgbG9uZ3MsIGFuZCBkZWZhdWx0IHRvICgwLCAxKS4iIiIKKyAgICAgICAgaWYgbm90IGlzaW50KG51bSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJSYXQgbnVtZXJhdG9yIG11c3QgYmUgaW50IG9yIGxvbmcgKCVyKSIgJSBudW0KKyAgICAgICAgaWYgbm90IGlzaW50KGRlbik6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJSYXQgZGVub21pbmF0b3IgbXVzdCBiZSBpbnQgb3IgbG9uZyAoJXIpIiAlIGRlbgorICAgICAgICAjIEJ1dCB0aGUgemVybyBpcyBhbHdheXMgb24KKyAgICAgICAgaWYgZGVuID09IDA6CisgICAgICAgICAgICByYWlzZSBaZXJvRGl2aXNpb25FcnJvciwgInplcm8gZGVub21pbmF0b3IiCisgICAgICAgIGcgPSBnY2QoZGVuLCBudW0pCisgICAgICAgIHNlbGYuX19udW0gPSBsb25nKG51bS8vZykKKyAgICAgICAgc2VsZi5fX2RlbiA9IGxvbmcoZGVuLy9nKQorCisgICAgZGVmIF9nZXRfbnVtKHNlbGYpOgorICAgICAgICAiIiJBY2Nlc3NvciBmdW5jdGlvbiBmb3IgcmVhZC1vbmx5ICdudW0nIGF0dHJpYnV0ZSBvZiBSYXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fbnVtCisgICAgbnVtID0gcHJvcGVydHkoX2dldF9udW0sIE5vbmUpCisKKyAgICBkZWYgX2dldF9kZW4oc2VsZik6CisgICAgICAgICIiIkFjY2Vzc29yIGZ1bmN0aW9uIGZvciByZWFkLW9ubHkgJ2RlbicgYXR0cmlidXRlIG9mIFJhdC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19kZW4KKyAgICBkZW4gPSBwcm9wZXJ0eShfZ2V0X2RlbiwgTm9uZSkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIiQ29udmVydCBhIFJhdCB0byBhbiBzdHJpbmcgcmVzZW1ibGluZyBhIFJhdCBjb25zdHJ1Y3RvciBjYWxsLiIiIgorICAgICAgICByZXR1cm4gIlJhdCglZCwgJWQpIiAlIChzZWxmLl9fbnVtLCBzZWxmLl9fZGVuKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICIiIkNvbnZlcnQgYSBSYXQgdG8gYSBzdHJpbmcgcmVzZW1ibGluZyBhIGRlY2ltYWwgbnVtZXJpYyB2YWx1ZS4iIiIKKyAgICAgICAgcmV0dXJuIHN0cihmbG9hdChzZWxmKSkKKworICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICIiIkNvbnZlcnQgYSBSYXQgdG8gYSBmbG9hdC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19udW0qMS4wL3NlbGYuX19kZW4KKworICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAiIiJDb252ZXJ0IGEgUmF0IHRvIGFuIGludDsgc2VsZi5kZW4gbXVzdCBiZSAxLiIiIgorICAgICAgICBpZiBzZWxmLl9fZGVuID09IDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGludChzZWxmLl9fbnVtKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvciwgKCIlcyB0b28gbGFyZ2UgdG8gY29udmVydCB0byBpbnQiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcihzZWxmKSkKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImNhbid0IGNvbnZlcnQgJXMgdG8gaW50IiAlIHJlcHIoc2VsZikKKworICAgIGRlZiBfX2xvbmdfXyhzZWxmKToKKyAgICAgICAgIiIiQ29udmVydCBhIFJhdCB0byBhbiBsb25nOyBzZWxmLmRlbiBtdXN0IGJlIDEuIiIiCisgICAgICAgIGlmIHNlbGYuX19kZW4gPT0gMToKKyAgICAgICAgICAgIHJldHVybiBsb25nKHNlbGYuX19udW0pCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJjYW4ndCBjb252ZXJ0ICVzIHRvIGxvbmciICUgcmVwcihzZWxmKQorCisgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJBZGQgdHdvIFJhdHMsIG9yIGEgUmF0IGFuZCBhIG51bWJlci4iIiIKKyAgICAgICAgaWYgaXNpbnQob3RoZXIpOgorICAgICAgICAgICAgb3RoZXIgPSBSYXQob3RoZXIpCisgICAgICAgIGlmIGlzUmF0KG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBSYXQoc2VsZi5fX251bSpvdGhlci5fX2RlbiArIG90aGVyLl9fbnVtKnNlbGYuX19kZW4sCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19kZW4qb3RoZXIuX19kZW4pCisgICAgICAgIGlmIGlzbnVtKG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBmbG9hdChzZWxmKSArIG90aGVyCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgX19yYWRkX18gPSBfX2FkZF9fCisKKyAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlN1YnRyYWN0IHR3byBSYXRzLCBvciBhIFJhdCBhbmQgYSBudW1iZXIuIiIiCisgICAgICAgIGlmIGlzaW50KG90aGVyKToKKyAgICAgICAgICAgIG90aGVyID0gUmF0KG90aGVyKQorICAgICAgICBpZiBpc1JhdChvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gUmF0KHNlbGYuX19udW0qb3RoZXIuX19kZW4gLSBvdGhlci5fX251bSpzZWxmLl9fZGVuLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZGVuKm90aGVyLl9fZGVuKQorICAgICAgICBpZiBpc251bShvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoc2VsZikgLSBvdGhlcgorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgIGRlZiBfX3JzdWJfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlN1YnRyYWN0IHR3byBSYXRzLCBvciBhIFJhdCBhbmQgYSBudW1iZXIgKHJldmVyc2VkIGFyZ3MpLiIiIgorICAgICAgICBpZiBpc2ludChvdGhlcik6CisgICAgICAgICAgICBvdGhlciA9IFJhdChvdGhlcikKKyAgICAgICAgaWYgaXNSYXQob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIFJhdChvdGhlci5fX251bSpzZWxmLl9fZGVuIC0gc2VsZi5fX251bSpvdGhlci5fX2RlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2RlbipvdGhlci5fX2RlbikKKyAgICAgICAgaWYgaXNudW0ob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyIC0gZmxvYXQoc2VsZikKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICBkZWYgX19tdWxfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIk11bHRpcGx5IHR3byBSYXRzLCBvciBhIFJhdCBhbmQgYSBudW1iZXIuIiIiCisgICAgICAgIGlmIGlzUmF0KG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBSYXQoc2VsZi5fX251bSpvdGhlci5fX251bSwgc2VsZi5fX2RlbipvdGhlci5fX2RlbikKKyAgICAgICAgaWYgaXNpbnQob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIFJhdChzZWxmLl9fbnVtKm90aGVyLCBzZWxmLl9fZGVuKQorICAgICAgICBpZiBpc251bShvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoc2VsZikqb3RoZXIKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICBfX3JtdWxfXyA9IF9fbXVsX18KKworICAgIGRlZiBfX3RydWVkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIkRpdmlkZSB0d28gUmF0cywgb3IgYSBSYXQgYW5kIGEgbnVtYmVyLiIiIgorICAgICAgICBpZiBpc1JhdChvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gUmF0KHNlbGYuX19udW0qb3RoZXIuX19kZW4sIHNlbGYuX19kZW4qb3RoZXIuX19udW0pCisgICAgICAgIGlmIGlzaW50KG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBSYXQoc2VsZi5fX251bSwgc2VsZi5fX2RlbipvdGhlcikKKyAgICAgICAgaWYgaXNudW0ob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHNlbGYpIC8gb3RoZXIKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICBfX2Rpdl9fID0gX190cnVlZGl2X18KKworICAgIGRlZiBfX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJEaXZpZGUgdHdvIFJhdHMsIG9yIGEgUmF0IGFuZCBhIG51bWJlciAocmV2ZXJzZWQgYXJncykuIiIiCisgICAgICAgIGlmIGlzUmF0KG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBSYXQob3RoZXIuX19udW0qc2VsZi5fX2Rlbiwgb3RoZXIuX19kZW4qc2VsZi5fX251bSkKKyAgICAgICAgaWYgaXNpbnQob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIFJhdChvdGhlcipzZWxmLl9fZGVuLCBzZWxmLl9fbnVtKQorICAgICAgICBpZiBpc251bShvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIgLyBmbG9hdChzZWxmKQorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgIF9fcmRpdl9fID0gX19ydHJ1ZWRpdl9fCisKKyAgICBkZWYgX19mbG9vcmRpdl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiRGl2aWRlIHR3byBSYXRzLCByZXR1cm5pbmcgdGhlIGZsb29yZWQgcmVzdWx0LiIiIgorICAgICAgICBpZiBpc2ludChvdGhlcik6CisgICAgICAgICAgICBvdGhlciA9IFJhdChvdGhlcikKKyAgICAgICAgZWxpZiBub3QgaXNSYXQob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHggPSBzZWxmL290aGVyCisgICAgICAgIHJldHVybiB4Ll9fbnVtIC8vIHguX19kZW4KKworICAgIGRlZiBfX3JmbG9vcmRpdl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiRGl2aWRlIHR3byBSYXRzLCByZXR1cm5pbmcgdGhlIGZsb29yZWQgcmVzdWx0IChyZXZlcnNlZCBhcmdzKS4iIiIKKyAgICAgICAgeCA9IG90aGVyL3NlbGYKKyAgICAgICAgcmV0dXJuIHguX19udW0gLy8geC5fX2RlbgorCisgICAgZGVmIF9fZGl2bW9kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJEaXZpZGUgdHdvIFJhdHMsIHJldHVybmluZyBxdW90aWVudCBhbmQgcmVtYWluZGVyLiIiIgorICAgICAgICBpZiBpc2ludChvdGhlcik6CisgICAgICAgICAgICBvdGhlciA9IFJhdChvdGhlcikKKyAgICAgICAgZWxpZiBub3QgaXNSYXQob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHggPSBzZWxmLy9vdGhlcgorICAgICAgICByZXR1cm4gKHgsIHNlbGYgLSBvdGhlciAqIHgpCisKKyAgICBkZWYgX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJEaXZpZGUgdHdvIFJhdHMsIHJldHVybmluZyBxdW90aWVudCBhbmQgcmVtYWluZGVyIChyZXZlcnNlZCBhcmdzKS4iIiIKKyAgICAgICAgaWYgaXNpbnQob3RoZXIpOgorICAgICAgICAgICAgb3RoZXIgPSBSYXQob3RoZXIpCisgICAgICAgIGVsaWYgbm90IGlzUmF0KG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gZGl2bW9kKG90aGVyLCBzZWxmKQorCisgICAgZGVmIF9fbW9kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJUYWtlIG9uZSBSYXQgbW9kdWxvIGFub3RoZXIuIiIiCisgICAgICAgIHJldHVybiBkaXZtb2Qoc2VsZiwgb3RoZXIpWzFdCisKKyAgICBkZWYgX19ybW9kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJUYWtlIG9uZSBSYXQgbW9kdWxvIGFub3RoZXIgKHJldmVyc2VkIGFyZ3MpLiIiIgorICAgICAgICByZXR1cm4gZGl2bW9kKG90aGVyLCBzZWxmKVsxXQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIkNvbXBhcmUgdHdvIFJhdHMgZm9yIGVxdWFsaXR5LiIiIgorICAgICAgICBpZiBpc2ludChvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlbiA9PSAxIGFuZCBzZWxmLl9fbnVtID09IG90aGVyCisgICAgICAgIGlmIGlzUmF0KG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fbnVtID09IG90aGVyLl9fbnVtIGFuZCBzZWxmLl9fZGVuID09IG90aGVyLl9fZGVuCisgICAgICAgIGlmIGlzbnVtKG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBmbG9hdChzZWxmKSA9PSBvdGhlcgorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJDb21wYXJlIHR3byBSYXRzIGZvciBpbmVxdWFsaXR5LiIiIgorICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKKworICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKyAgICBfX2hhc2hfXyA9IE5vbmUKKworY2xhc3MgUmF0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlVuaXQgdGVzdHMgZm9yIFJhdCBjbGFzcyBhbmQgaXRzIHN1cHBvcnQgdXRpbGl0aWVzLiIiIgorCisgICAgZGVmIHRlc3RfZ2NkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjZCgxMCwgMTIpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjZCgxMCwgMTUpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjZCgxMCwgMTEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjZCgxMDAsIDE1KSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnY2QoLTEwLCAyKSwgLTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2NkKDEwLCAtMiksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2NkKC0xMCwgLTIpLCAtMikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgMjApOgorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoMSwgMjApOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnY2QoaSwgaikgPiAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnY2QoLWksIGopIDwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2NkKGksIC1qKSA+IDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdjZCgtaSwgLWopIDwgMCkKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBhID0gUmF0KDEwLCAxNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm51bSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmRlbiwgMykKKyAgICAgICAgYSA9IFJhdCgxMEwsIDE1TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm51bSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmRlbiwgMykKKyAgICAgICAgYSA9IFJhdCgxMCwgLTE1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEubnVtLCAtMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmRlbiwgMykKKyAgICAgICAgYSA9IFJhdCgtMTAsIDE1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEubnVtLCAtMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmRlbiwgMykKKyAgICAgICAgYSA9IFJhdCgtMTAsIC0xNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm51bSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmRlbiwgMykKKyAgICAgICAgYSA9IFJhdCg3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEubnVtLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZGVuLCAxKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhID0gUmF0KDEsIDApCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiUmF0KDEsIDApIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCisgICAgICAgIGZvciBiYWQgaW4gIjAiLCAwLjAsIDBqLCAoKSwgW10sIHt9LCBOb25lLCBSYXQsIHVuaXR0ZXN0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGEgPSBSYXQoYmFkKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUmF0KCVyKSBkaWRuJ3QgcmFpc2UgVHlwZUVycm9yIiAlIGJhZCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhID0gUmF0KDEsIGJhZCkKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlJhdCgxLCAlcikgZGlkbid0IHJhaXNlIFR5cGVFcnJvciIgJSBiYWQpCisKKyAgICBkZWYgdGVzdF9hZGQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmF0KDIsIDMpICsgUmF0KDEsIDMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgyLCAzKSArIDEsIFJhdCg1LCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxICsgUmF0KDIsIDMpLCBSYXQoNSwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMS4wICsgUmF0KDEsIDIpLCAxLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmF0KDEsIDIpICsgMS4wLCAxLjUpCisKKyAgICBkZWYgdGVzdF9zdWIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmF0KDcsIDIpIC0gUmF0KDcsIDUpLCBSYXQoMjEsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSYXQoNywgNSkgLSAxLCBSYXQoMiwgNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSAtIFJhdCgzLCA1KSwgUmF0KDIsIDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgzLCAyKSAtIDEuMCwgMC41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEuMCAtIFJhdCgxLCAyKSwgMC41KQorCisgICAgZGVmIHRlc3RfbXVsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgyLCAzKSAqIFJhdCg1LCA3KSwgUmF0KDEwLCAyMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmF0KDEwLCAzKSAqIDMsIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMgKiBSYXQoMTAsIDMpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSYXQoMTAsIDUpICogMC41LCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMC41ICogUmF0KDEwLCA1KSwgMS4wKQorCisgICAgZGVmIHRlc3RfZGl2KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgxMCwgMykgLyBSYXQoNSwgNyksIFJhdCgxNCwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmF0KDEwLCAzKSAvIDMsIFJhdCgxMCwgOSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiAvIFJhdCg1KSwgUmF0KDIsIDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMuMCAqIFJhdCgxLCAyKSwgMS41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgxLCAyKSAqIDMuMCwgMS41KQorCisgICAgZGVmIHRlc3RfZmxvb3JkaXYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmF0KDEwKSAvLyBSYXQoNCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmF0KDEwLCAzKSAvLyBSYXQoNCwgMyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmF0KDEwKSAvLyA0LCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEwIC8vIFJhdCg0KSwgMikKKworICAgIGRlZiB0ZXN0X2VxKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgxMCksIFJhdCgyMCwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmF0KDEwKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAsIFJhdCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmF0KDEwKSwgMTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMC4wLCBSYXQoMTApKQorCisgICAgZGVmIHRlc3RfZnV0dXJlX2RpdihzZWxmKToKKyAgICAgICAgZXhlYyBmdXR1cmVfdGVzdAorCisgICAgIyBYWFggUmFuIG91dCBvZiBzdGVhbTsgVE8gRE86IGRpdm1vZCwgZGl2LCBmdXR1cmUgZGl2aXNpb24KKworZnV0dXJlX3Rlc3QgPSAiIiIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KK3NlbGYuYXNzZXJ0RXF1YWwoUmF0KDEwLCAzKSAvIFJhdCg1LCA3KSwgUmF0KDE0LCAzKSkKK3NlbGYuYXNzZXJ0RXF1YWwoUmF0KDEwLCAzKSAvIDMsIFJhdCgxMCwgOSkpCitzZWxmLmFzc2VydEVxdWFsKDIgLyBSYXQoNSksIFJhdCgyLCA1KSkKK3NlbGYuYXNzZXJ0RXF1YWwoMy4wICogUmF0KDEsIDIpLCAxLjUpCitzZWxmLmFzc2VydEVxdWFsKFJhdCgxLCAyKSAqIDMuMCwgMS41KQorc2VsZi5hc3NlcnRFcXVhbChldmFsKCcxLzInKSwgMC41KQorIiIiCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFJhdFRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpbm9wLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpbm9wLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTMwNzIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlub3AucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpbm9wLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpbm9wLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTMwNzIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlub3AucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpc2VjdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpc2VjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzMzMzBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlzZWN0LnB5CkBAIC0wLDAgKzEsMzY4IEBACitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIFVzZXJMaXN0IGltcG9ydCBVc2VyTGlzdAorCisjIFdlIGRvIGEgYml0IG9mIHRyaWNrZXJ5IGhlcmUgdG8gYmUgYWJsZSB0byB0ZXN0IGJvdGggdGhlIEMgaW1wbGVtZW50YXRpb24KKyMgYW5kIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZHVsZS4KKworIyBNYWtlIGl0IGltcG9zc2libGUgdG8gaW1wb3J0IHRoZSBDIGltcGxlbWVudGF0aW9uIGFueW1vcmUuCitzeXMubW9kdWxlc1snX2Jpc2VjdCddID0gMAorIyBXZSBtdXN0IGFsc28gaGFuZGxlIHRoZSBjYXNlIHRoYXQgYmlzZWN0IHdhcyBpbXBvcnRlZCBiZWZvcmUuCitpZiAnYmlzZWN0JyBpbiBzeXMubW9kdWxlczoKKyAgICBkZWwgc3lzLm1vZHVsZXNbJ2Jpc2VjdCddCisKKyMgTm93IHdlIGNhbiBpbXBvcnQgdGhlIG1vZHVsZSBhbmQgZ2V0IHRoZSBwdXJlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbi4KK2ltcG9ydCBiaXNlY3QgYXMgcHlfYmlzZWN0CisKKyMgUmVzdG9yZSBldmVyeXRoaW5nIHRvIG5vcm1hbC4KK2RlbCBzeXMubW9kdWxlc1snX2Jpc2VjdCddCitkZWwgc3lzLm1vZHVsZXNbJ2Jpc2VjdCddCisKKyMgVGhpcyBpcyBub3cgdGhlIG1vZHVsZSB3aXRoIHRoZSBDIGltcGxlbWVudGF0aW9uLgoraW1wb3J0IGJpc2VjdCBhcyBjX2Jpc2VjdAorCisKK2NsYXNzIFJhbmdlKG9iamVjdCk6CisgICAgIiIiQSB0cml2aWFsIHhyYW5nZSgpLWxpa2Ugb2JqZWN0IHdpdGhvdXQgYW55IGludGVnZXIgd2lkdGggbGltaXRhdGlvbnMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBzdG9wKToKKyAgICAgICAgc2VsZi5zdGFydCA9IHN0YXJ0CisgICAgICAgIHNlbGYuc3RvcCA9IHN0b3AKKyAgICAgICAgc2VsZi5sYXN0X2luc2VydCA9IE5vbmUKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdG9wIC0gc2VsZi5zdGFydAorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGlkeCk6CisgICAgICAgIG4gPSBzZWxmLnN0b3AgLSBzZWxmLnN0YXJ0CisgICAgICAgIGlmIGlkeCA8IDA6CisgICAgICAgICAgICBpZHggKz0gbgorICAgICAgICBpZiBpZHggPj0gbjoKKyAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IoaWR4KQorICAgICAgICByZXR1cm4gc2VsZi5zdGFydCArIGlkeAorCisgICAgZGVmIGluc2VydChzZWxmLCBpZHgsIGl0ZW0pOgorICAgICAgICBzZWxmLmxhc3RfaW5zZXJ0ID0gaWR4LCBpdGVtCisKKworY2xhc3MgVGVzdEJpc2VjdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgbW9kdWxlID0gTm9uZQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnByZWNvbXB1dGVkQ2FzZXMgPSBbCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbXSwgMSwgMCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMV0sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzFdLCAxLCAxKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxXSwgMiwgMSksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMV0sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDFdLCAxLCAyKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAxXSwgMiwgMiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMSwgMV0sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDEsIDFdLCAxLCAzKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAxLCAxXSwgMiwgMyksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMSwgMSwgMV0sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDEsIDEsIDFdLCAxLCA0KSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAxLCAxLCAxXSwgMiwgNCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMl0sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDJdLCAxLCAxKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyXSwgMS41LCAxKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyXSwgMiwgMiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMl0sIDMsIDIpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDEsIDIsIDJdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAxLCAyLCAyXSwgMSwgMiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMSwgMiwgMl0sIDEuNSwgMiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMSwgMiwgMl0sIDIsIDQpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDEsIDIsIDJdLCAzLCA0KSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyLCAzXSwgMCwgMCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMiwgM10sIDEsIDEpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDIsIDNdLCAxLjUsIDEpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDIsIDNdLCAyLCAyKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyLCAzXSwgMi41LCAyKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyLCAzXSwgMywgMyksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMiwgM10sIDQsIDMpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDRdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgMSwgMSksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNF0sIDEuNSwgMSksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNF0sIDIsIDMpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDRdLCAyLjUsIDMpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDRdLCAzLCA2KSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgMy41LCA2KSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgNCwgMTApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDRdLCA1LCAxMCksCisKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgW10sIDEsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMV0sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMV0sIDEsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMV0sIDIsIDEpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMV0sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMV0sIDEsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMV0sIDIsIDIpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMSwgMV0sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMSwgMV0sIDEsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMSwgMV0sIDIsIDMpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMSwgMSwgMV0sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMSwgMSwgMV0sIDEsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMSwgMSwgMV0sIDIsIDQpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMl0sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMl0sIDEsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMl0sIDEuNSwgMSksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyXSwgMiwgMSksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyXSwgMywgMiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAxLCAyLCAyXSwgMCwgMCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAxLCAyLCAyXSwgMSwgMCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAxLCAyLCAyXSwgMS41LCAyKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDEsIDIsIDJdLCAyLCAyKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDEsIDIsIDJdLCAzLCA0KSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDIsIDNdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDIsIDNdLCAxLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDIsIDNdLCAxLjUsIDEpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMiwgM10sIDIsIDEpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMiwgM10sIDIuNSwgMiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyLCAzXSwgMywgMiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyLCAzXSwgNCwgMyksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgMCwgMCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgMSwgMCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgMS41LCAxKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDRdLCAyLCAxKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDRdLCAyLjUsIDMpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNF0sIDMsIDMpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNF0sIDMuNSwgNiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgNCwgNiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgNSwgMTApCisgICAgICAgIF0KKworICAgIGRlZiB0ZXN0X3ByZWNvbXB1dGVkKHNlbGYpOgorICAgICAgICBmb3IgZnVuYywgZGF0YSwgZWxlbSwgZXhwZWN0ZWQgaW4gc2VsZi5wcmVjb21wdXRlZENhc2VzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKGRhdGEsIGVsZW0pLCBleHBlY3RlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyhVc2VyTGlzdChkYXRhKSwgZWxlbSksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfbmVnYXRpdmVfbG8oc2VsZik6CisgICAgICAgICMgSXNzdWUgMzMwMQorICAgICAgICBtb2QgPSBzZWxmLm1vZHVsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtb2QuYmlzZWN0X2xlZnQsIFsxLCAyLCAzXSwgNSwgLTEsIDMpLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtb2QuYmlzZWN0X3JpZ2h0LCBbMSwgMiwgM10sIDUsIC0xLCAzKSwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbW9kLmluc29ydF9sZWZ0LCBbMSwgMiwgM10sIDUsIC0xLCAzKSwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbW9kLmluc29ydF9yaWdodCwgWzEsIDIsIDNdLCA1LCAtMSwgMyksCisKKyAgICBkZWYgdGVzdF9sYXJnZV9yYW5nZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxMzQ5NgorICAgICAgICBtb2QgPSBzZWxmLm1vZHVsZQorICAgICAgICBuID0gc3lzLm1heHNpemUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IHhyYW5nZShuLTEpCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiY2FuJ3QgY3JlYXRlIGEgeHJhbmdlKCkgb2JqZWN0IG9mIHNpemUgYHN5cy5tYXhzaXplYCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmJpc2VjdF9sZWZ0KGRhdGEsIG4tMyksIG4tMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuYmlzZWN0X3JpZ2h0KGRhdGEsIG4tMyksIG4tMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuYmlzZWN0X2xlZnQoZGF0YSwgbi0zLCBuLTEwLCBuKSwgbi0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5iaXNlY3RfcmlnaHQoZGF0YSwgbi0zLCBuLTEwLCBuKSwgbi0yKQorCisgICAgZGVmIHRlc3RfbGFyZ2VfcHlyYW5nZShzZWxmKToKKyAgICAgICAgIyBTYW1lIGFzIGFib3ZlLCBidXQgd2l0aG91dCBDLWltcG9zZWQgbGltaXRzIG9uIHJhbmdlKCkgcGFyYW1ldGVycworICAgICAgICBtb2QgPSBzZWxmLm1vZHVsZQorICAgICAgICBuID0gc3lzLm1heHNpemUKKyAgICAgICAgZGF0YSA9IFJhbmdlKDAsIG4tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuYmlzZWN0X2xlZnQoZGF0YSwgbi0zKSwgbi0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5iaXNlY3RfcmlnaHQoZGF0YSwgbi0zKSwgbi0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5iaXNlY3RfbGVmdChkYXRhLCBuLTMsIG4tMTAsIG4pLCBuLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmJpc2VjdF9yaWdodChkYXRhLCBuLTMsIG4tMTAsIG4pLCBuLTIpCisgICAgICAgIHggPSBuIC0gMTAwCisgICAgICAgIG1vZC5pbnNvcnRfbGVmdChkYXRhLCB4LCB4IC0gNTAsIHggKyA1MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLmxhc3RfaW5zZXJ0LCAoeCwgeCkpCisgICAgICAgIHggPSBuIC0gMjAwCisgICAgICAgIG1vZC5pbnNvcnRfcmlnaHQoZGF0YSwgeCwgeCAtIDUwLCB4ICsgNTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5sYXN0X2luc2VydCwgKHggKyAxLCB4KSkKKworICAgIGRlZiB0ZXN0X3JhbmRvbShzZWxmLCBuPTI1KToKKyAgICAgICAgZnJvbSByYW5kb20gaW1wb3J0IHJhbmRyYW5nZQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uobik6CisgICAgICAgICAgICBkYXRhID0gW3JhbmRyYW5nZSgwLCBuLCAyKSBmb3IgaiBpbiB4cmFuZ2UoaSldCisgICAgICAgICAgICBkYXRhLnNvcnQoKQorICAgICAgICAgICAgZWxlbSA9IHJhbmRyYW5nZSgtMSwgbisxKQorICAgICAgICAgICAgaXAgPSBzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdChkYXRhLCBlbGVtKQorICAgICAgICAgICAgaWYgaXAgPCBsZW4oZGF0YSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gPD0gZGF0YVtpcF0pCisgICAgICAgICAgICBpZiBpcCA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhdGFbaXAtMV0gPCBlbGVtKQorICAgICAgICAgICAgaXAgPSBzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQoZGF0YSwgZWxlbSkKKyAgICAgICAgICAgIGlmIGlwIDwgbGVuKGRhdGEpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIDwgZGF0YVtpcF0pCisgICAgICAgICAgICBpZiBpcCA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhdGFbaXAtMV0gPD0gZWxlbSkKKworICAgIGRlZiB0ZXN0X29wdGlvbmFsU2xpY2luZyhzZWxmKToKKyAgICAgICAgZm9yIGZ1bmMsIGRhdGEsIGVsZW0sIGV4cGVjdGVkIGluIHNlbGYucHJlY29tcHV0ZWRDYXNlczoKKyAgICAgICAgICAgIGZvciBsbyBpbiB4cmFuZ2UoNCk6CisgICAgICAgICAgICAgICAgbG8gPSBtaW4obGVuKGRhdGEpLCBsbykKKyAgICAgICAgICAgICAgICBmb3IgaGkgaW4geHJhbmdlKDMsOCk6CisgICAgICAgICAgICAgICAgICAgIGhpID0gbWluKGxlbihkYXRhKSwgaGkpCisgICAgICAgICAgICAgICAgICAgIGlwID0gZnVuYyhkYXRhLCBlbGVtLCBsbywgaGkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsbyA8PSBpcCA8PSBoaSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZnVuYyBpcyBzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCBhbmQgaXAgPCBoaToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIDw9IGRhdGFbaXBdKQorICAgICAgICAgICAgICAgICAgICBpZiBmdW5jIGlzIHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0IGFuZCBpcCA+IGxvOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhdGFbaXAtMV0gPCBlbGVtKQorICAgICAgICAgICAgICAgICAgICBpZiBmdW5jIGlzIHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCBhbmQgaXAgPCBoaToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIDwgZGF0YVtpcF0pCisgICAgICAgICAgICAgICAgICAgIGlmIGZ1bmMgaXMgc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0IGFuZCBpcCA+IGxvOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhdGFbaXAtMV0gPD0gZWxlbSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpcCwgbWF4KGxvLCBtaW4oaGksIGV4cGVjdGVkKSkpCisKKyAgICBkZWYgdGVzdF9iYWNrY29tcGF0aWJpbGl0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1vZHVsZS5iaXNlY3QsIHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCkKKworICAgIGRlZiB0ZXN0X2tleXdvcmRfYXJncyhzZWxmKToKKyAgICAgICAgZGF0YSA9IFsxMCwgMjAsIDMwLCA0MCwgNTBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQoYT1kYXRhLCB4PTI1LCBsbz0xLCBoaT0zKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQoYT1kYXRhLCB4PTI1LCBsbz0xLCBoaT0zKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1vZHVsZS5iaXNlY3QoYT1kYXRhLCB4PTI1LCBsbz0xLCBoaT0zKSwgMikKKyAgICAgICAgc2VsZi5tb2R1bGUuaW5zb3J0X2xlZnQoYT1kYXRhLCB4PTI1LCBsbz0xLCBoaT0zKQorICAgICAgICBzZWxmLm1vZHVsZS5pbnNvcnRfcmlnaHQoYT1kYXRhLCB4PTI1LCBsbz0xLCBoaT0zKQorICAgICAgICBzZWxmLm1vZHVsZS5pbnNvcnQoYT1kYXRhLCB4PTI1LCBsbz0xLCBoaT0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIFsxMCwgMjAsIDI1LCAyNSwgMjUsIDMwLCA0MCwgNTBdKQorCitjbGFzcyBUZXN0QmlzZWN0UHl0aG9uKFRlc3RCaXNlY3QpOgorICAgIG1vZHVsZSA9IHB5X2Jpc2VjdAorCitjbGFzcyBUZXN0QmlzZWN0QyhUZXN0QmlzZWN0KToKKyAgICBtb2R1bGUgPSBjX2Jpc2VjdAorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RJbnNvcnQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIG1vZHVsZSA9IE5vbmUKKworICAgIGRlZiB0ZXN0X3ZzQnVpbHRpblNvcnQoc2VsZiwgbj01MDApOgorICAgICAgICBmcm9tIHJhbmRvbSBpbXBvcnQgY2hvaWNlCisgICAgICAgIGZvciBpbnNvcnRlZCBpbiAobGlzdCgpLCBVc2VyTGlzdCgpKToKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShuKToKKyAgICAgICAgICAgICAgICBkaWdpdCA9IGNob2ljZSgiMDEyMzQ1Njc4OSIpCisgICAgICAgICAgICAgICAgaWYgZGlnaXQgaW4gIjAyNDY4IjoKKyAgICAgICAgICAgICAgICAgICAgZiA9IHNlbGYubW9kdWxlLmluc29ydF9sZWZ0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZiA9IHNlbGYubW9kdWxlLmluc29ydF9yaWdodAorICAgICAgICAgICAgICAgIGYoaW5zb3J0ZWQsIGRpZ2l0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoaW5zb3J0ZWQpLCBpbnNvcnRlZCkKKworICAgIGRlZiB0ZXN0X2JhY2tjb21wYXRpYmlsaXR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubW9kdWxlLmluc29ydCwgc2VsZi5tb2R1bGUuaW5zb3J0X3JpZ2h0KQorCisgICAgZGVmIHRlc3RfbGlzdERlcml2ZWQoc2VsZik6CisgICAgICAgIGNsYXNzIExpc3QobGlzdCk6CisgICAgICAgICAgICBkYXRhID0gW10KKyAgICAgICAgICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIGl0ZW0pOgorICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5pbnNlcnQoaW5kZXgsIGl0ZW0pCisKKyAgICAgICAgbHN0ID0gTGlzdCgpCisgICAgICAgIHNlbGYubW9kdWxlLmluc29ydF9sZWZ0KGxzdCwgMTApCisgICAgICAgIHNlbGYubW9kdWxlLmluc29ydF9yaWdodChsc3QsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDEwXSwgbHN0LmRhdGEpCisKK2NsYXNzIFRlc3RJbnNvcnRQeXRob24oVGVzdEluc29ydCk6CisgICAgbW9kdWxlID0gcHlfYmlzZWN0CisKK2NsYXNzIFRlc3RJbnNvcnRDKFRlc3RJbnNvcnQpOgorICAgIG1vZHVsZSA9IGNfYmlzZWN0CisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitjbGFzcyBMZW5Pbmx5OgorICAgICJEdW1teSBzZXF1ZW5jZSBjbGFzcyBkZWZpbmluZyBfX2xlbl9fIGJ1dCBub3QgX19nZXRpdGVtX18uIgorICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gMTAKKworY2xhc3MgR2V0T25seToKKyAgICAiRHVtbXkgc2VxdWVuY2UgY2xhc3MgZGVmaW5pbmcgX19nZXRpdGVtX18gYnV0IG5vdCBfX2xlbl9fLiIKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmR4KToKKyAgICAgICAgcmV0dXJuIDEwCisKK2NsYXNzIENtcEVycjoKKyAgICAiRHVtbXkgZWxlbWVudCB0aGF0IGFsd2F5cyByYWlzZXMgYW4gZXJyb3IgZHVyaW5nIGNvbXBhcmlzb24iCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByYWlzZSBaZXJvRGl2aXNpb25FcnJvcgorCitjbGFzcyBUZXN0RXJyb3JIYW5kbGluZyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgbW9kdWxlID0gTm9uZQorCisgICAgZGVmIHRlc3Rfbm9uX3NlcXVlbmNlKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwKKyAgICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLmluc29ydF9sZWZ0LCBzZWxmLm1vZHVsZS5pbnNvcnRfcmlnaHQpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCAxMCwgMTApCisKKyAgICBkZWYgdGVzdF9sZW5fb25seShzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsCisgICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5pbnNvcnRfbGVmdCwgc2VsZi5tb2R1bGUuaW5zb3J0X3JpZ2h0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBmLCBMZW5Pbmx5KCksIDEwKQorCisgICAgZGVmIHRlc3RfZ2V0X29ubHkoc2VsZik6CisgICAgICAgIGZvciBmIGluIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LAorICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuaW5zb3J0X2xlZnQsIHNlbGYubW9kdWxlLmluc29ydF9yaWdodCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZiwgR2V0T25seSgpLCAxMCkKKworICAgIGRlZiB0ZXN0X2NtcF9lcnIoc2VsZik6CisgICAgICAgIHNlcSA9IFtDbXBFcnIoKSwgQ21wRXJyKCksIENtcEVycigpXQorICAgICAgICBmb3IgZiBpbiAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwKKyAgICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLmluc29ydF9sZWZ0LCBzZWxmLm1vZHVsZS5pbnNvcnRfcmlnaHQpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGYsIHNlcSwgMTApCisKKyAgICBkZWYgdGVzdF9hcmdfcGFyc2luZyhzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsCisgICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5pbnNvcnRfbGVmdCwgc2VsZi5tb2R1bGUuaW5zb3J0X3JpZ2h0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgMTApCisKK2NsYXNzIFRlc3RFcnJvckhhbmRsaW5nUHl0aG9uKFRlc3RFcnJvckhhbmRsaW5nKToKKyAgICBtb2R1bGUgPSBweV9iaXNlY3QKKworY2xhc3MgVGVzdEVycm9ySGFuZGxpbmdDKFRlc3RFcnJvckhhbmRsaW5nKToKKyAgICBtb2R1bGUgPSBjX2Jpc2VjdAorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2xpYnJlZnRlc3QgPSAiIiIKK0V4YW1wbGUgZnJvbSB0aGUgTGlicmFyeSBSZWZlcmVuY2U6ICBEb2MvbGlicmFyeS9iaXNlY3QucnN0CisKK1RoZSBiaXNlY3QoKSBmdW5jdGlvbiBpcyBnZW5lcmFsbHkgdXNlZnVsIGZvciBjYXRlZ29yaXppbmcgbnVtZXJpYyBkYXRhLgorVGhpcyBleGFtcGxlIHVzZXMgYmlzZWN0KCkgdG8gbG9vayB1cCBhIGxldHRlciBncmFkZSBmb3IgYW4gZXhhbSB0b3RhbAorKHNheSkgYmFzZWQgb24gYSBzZXQgb2Ygb3JkZXJlZCBudW1lcmljIGJyZWFrcG9pbnRzOiA4NSBhbmQgdXAgaXMgYW4gYEEnLAorNzUuLjg0IGlzIGEgYEInLCBldGMuCisKKyAgICA+Pj4gZ3JhZGVzID0gIkZFRENCQSIKKyAgICA+Pj4gYnJlYWtwb2ludHMgPSBbMzAsIDQ0LCA2NiwgNzUsIDg1XQorICAgID4+PiBmcm9tIGJpc2VjdCBpbXBvcnQgYmlzZWN0CisgICAgPj4+IGRlZiBncmFkZSh0b3RhbCk6CisgICAgLi4uICAgICAgICAgICByZXR1cm4gZ3JhZGVzW2Jpc2VjdChicmVha3BvaW50cywgdG90YWwpXQorICAgIC4uLgorICAgID4+PiBncmFkZSg2NikKKyAgICAnQycKKyAgICA+Pj4gbWFwKGdyYWRlLCBbMzMsIDk5LCA3NywgNDQsIDEyLCA4OF0pCisgICAgWydFJywgJ0EnLCAnQicsICdEJywgJ0YnLCAnQSddCisKKyIiIgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK19fdGVzdF9fID0geydsaWJyZWZ0ZXN0JyA6IGxpYnJlZnRlc3R9CisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfYmlzZWN0CisKKyAgICB0ZXN0X2NsYXNzZXMgPSBbVGVzdEJpc2VjdFB5dGhvbiwgVGVzdEJpc2VjdEMsCisgICAgICAgICAgICAgICAgICAgIFRlc3RJbnNvcnRQeXRob24sIFRlc3RJbnNvcnRDLAorICAgICAgICAgICAgICAgICAgICBUZXN0RXJyb3JIYW5kbGluZ1B5dGhvbiwgVGVzdEVycm9ySGFuZGxpbmdDXQorCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X2Jpc2VjdCwgdmVyYm9zZSkKKworICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIHByaW50IGNvdW50cworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaXNlY3QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlzZWN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ViYmZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlzZWN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaXNlY3QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlzZWN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ViYmZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlzZWN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ib29sLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYm9vbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmNkMWFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYm9vbC5weQpAQCAtMCwwICsxLDM3MCBAQAorIyBUZXN0IHByb3BlcnRpZXMgb2YgYm9vbCBwcm9taXNlZCBieSBQRVAgMjg1CisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworaW1wb3J0IG9zCisKK2NsYXNzIEJvb2xUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBDKGJvb2wpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiYm9vbCBzaG91bGQgbm90IGJlIHN1YmNsYXNzYWJsZSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbnQuX19uZXdfXywgYm9vbCwgMCkKKworICAgIGRlZiB0ZXN0X3ByaW50KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmbyA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgICAgIHByaW50ID4+IGZvLCBGYWxzZSwgVHJ1ZQorICAgICAgICAgICAgZm8uY2xvc2UoKQorICAgICAgICAgICAgZm8gPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvLnJlYWQoKSwgJ0ZhbHNlIFRydWVcbicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmby5jbG9zZSgpCisgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihGYWxzZSksICdGYWxzZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihUcnVlKSwgJ1RydWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwocmVwcihGYWxzZSkpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHJlcHIoVHJ1ZSkpLCBUcnVlKQorCisgICAgZGVmIHRlc3Rfc3RyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGYWxzZSksICdGYWxzZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFRydWUpLCAnVHJ1ZScpCisKKyAgICBkZWYgdGVzdF9pbnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KEZhbHNlKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChpbnQoRmFsc2UpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoVHJ1ZSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoaW50KFRydWUpLCBUcnVlKQorCisgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoRmFsc2UpLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoZmxvYXQoRmFsc2UpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChUcnVlKSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KGZsb2F0KFRydWUpLCBUcnVlKQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKEZhbHNlKSwgMEwpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QobG9uZyhGYWxzZSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoVHJ1ZSksIDFMKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KGxvbmcoVHJ1ZSksIFRydWUpCisKKyAgICBkZWYgdGVzdF9tYXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCtGYWxzZSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdCgrRmFsc2UsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC1GYWxzZSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdCgtRmFsc2UsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhGYWxzZSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoYWJzKEZhbHNlKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoK1RydWUsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoK1RydWUsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLVRydWUsIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhUcnVlKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChhYnMoVHJ1ZSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwofkZhbHNlLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh+VHJ1ZSwgLTIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSsyLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUrMiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyK0ZhbHNlLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIrVHJ1ZSwgMykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlK0ZhbHNlLCAwKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KEZhbHNlK0ZhbHNlLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZStUcnVlLCAxKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KEZhbHNlK1RydWUsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZStGYWxzZSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChUcnVlK0ZhbHNlLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUrVHJ1ZSwgMikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUtVHJ1ZSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChUcnVlLVRydWUsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLUZhbHNlLCAwKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KEZhbHNlLUZhbHNlLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLUZhbHNlLCAxKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KFRydWUtRmFsc2UsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UtVHJ1ZSwgLTEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlKjEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UqMSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChGYWxzZSoxLCBGYWxzZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUvLzEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoVHJ1ZS8vMSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZS8vMSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChGYWxzZS8vMSwgRmFsc2UpCisKKyAgICAgICAgZm9yIGIgaW4gRmFsc2UsIFRydWU6CisgICAgICAgICAgICBmb3IgaSBpbiAwLCAxLCAyOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYioqaSwgaW50KGIpKippKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoYioqaSwgYm9vbChpbnQoYikqKmkpKQorCisgICAgICAgIGZvciBhIGluIEZhbHNlLCBUcnVlOgorICAgICAgICAgICAgZm9yIGIgaW4gRmFsc2UsIFRydWU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhhJmIsIGJvb2woaW50KGEpJmludChiKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhhfGIsIGJvb2woaW50KGEpfGludChiKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhhXmIsIGJvb2woaW50KGEpXmludChiKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhJmludChiKSwgaW50KGEpJmludChiKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm90KGEmaW50KGIpLCBib29sKGludChhKSZpbnQoYikpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXxpbnQoYiksIGludChhKXxpbnQoYikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdChhfGludChiKSwgYm9vbChpbnQoYSl8aW50KGIpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFeaW50KGIpLCBpbnQoYSleaW50KGIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoYV5pbnQoYiksIGJvb2woaW50KGEpXmludChiKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoYSkmYiwgaW50KGEpJmludChiKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm90KGludChhKSZiLCBib29sKGludChhKSZpbnQoYikpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGEpfGIsIGludChhKXxpbnQoYikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdChpbnQoYSl8YiwgYm9vbChpbnQoYSl8aW50KGIpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChhKV5iLCBpbnQoYSleaW50KGIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoaW50KGEpXmIsIGJvb2woaW50KGEpXmludChiKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJcygxPT0xLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKDE9PTAsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKDA8MSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygxPDAsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKDA8PTAsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMTw9MCwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMT4wLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKDE+MSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMT49MSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygwPj0xLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygwIT0xLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKDAhPTAsIEZhbHNlKQorCisgICAgICAgIHggPSBbMV0KKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4IGlzIHgsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeCBpcyBub3QgeCwgRmFsc2UpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJcygxIGluIHgsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMCBpbiB4LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygxIG5vdCBpbiB4LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygwIG5vdCBpbiB4LCBUcnVlKQorCisgICAgICAgIHggPSB7MTogMn0KKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4IGlzIHgsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeCBpcyBub3QgeCwgRmFsc2UpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJcygxIGluIHgsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMCBpbiB4LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygxIG5vdCBpbiB4LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygwIG5vdCBpbiB4LCBUcnVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobm90IFRydWUsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKG5vdCBGYWxzZSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2NvbnZlcnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYm9vbCwgNDIsIDQyKQorICAgICAgICBzZWxmLmFzc2VydElzKGJvb2woMTApLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGJvb2woMSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYm9vbCgtMSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYm9vbCgwKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYm9vbCgiaGVsbG8iKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhib29sKCIiKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYm9vbCgpLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiJWQiICUgRmFsc2UsICIwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiJWQiICUgVHJ1ZSwgIjEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIleCIgJSBGYWxzZSwgIjAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIleCIgJSBUcnVlLCAiMSIpCisKKyAgICBkZWYgdGVzdF9oYXNhdHRyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKGhhc2F0dHIoW10sICJhcHBlbmQiKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhoYXNhdHRyKFtdLCAid29iYmxlIiksIEZhbHNlKQorCisgICAgZGVmIHRlc3RfY2FsbGFibGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoY2FsbGFibGUobGVuKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjYWxsYWJsZSgxKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9pc2luc3RhbmNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKGlzaW5zdGFuY2UoVHJ1ZSwgYm9vbCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoaXNpbnN0YW5jZShGYWxzZSwgYm9vbCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoaXNpbnN0YW5jZShUcnVlLCBpbnQpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGlzaW5zdGFuY2UoRmFsc2UsIGludCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoaXNpbnN0YW5jZSgxLCBib29sKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoaXNpbnN0YW5jZSgwLCBib29sKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9pc3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKGlzc3ViY2xhc3MoYm9vbCwgaW50KSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhpc3N1YmNsYXNzKGludCwgYm9vbCksIEZhbHNlKQorCisgICAgZGVmIHRlc3RfaGFza2V5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKDEgaW4ge30sIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKDEgaW4gezE6MX0sIFRydWUpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoe30uaGFzX2tleSgxKSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHsxOjF9Lmhhc19rZXkoMSksIFRydWUpCisKKyAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoInh5eiIuZW5kc3dpdGgoInoiKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygieHl6Ii5lbmRzd2l0aCgieCIpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygieHl6MDEyMyIuaXNhbG51bSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKCJAIyQlIi5pc2FsbnVtKCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKCJ4eXoiLmlzYWxwaGEoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygiQCMkJSIuaXNhbHBoYSgpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygiMDEyMyIuaXNkaWdpdCgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKCJ4eXoiLmlzZGlnaXQoKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoInh5eiIuaXNsb3dlcigpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKCJYWVoiLmlzbG93ZXIoKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoIiAiLmlzc3BhY2UoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygiWFlaIi5pc3NwYWNlKCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKCJYIi5pc3RpdGxlKCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoIngiLmlzdGl0bGUoKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoIlhZWiIuaXN1cHBlcigpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKCJ4eXoiLmlzdXBwZXIoKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoInh5eiIuc3RhcnRzd2l0aCgieCIpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKCJ4eXoiLnN0YXJ0c3dpdGgoInoiKSwgRmFsc2UpCisKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgieHl6IiwgJ2FzY2lpJykuZW5kc3dpdGgodW5pY29kZSgieiIsICdhc2NpaScpKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgieHl6IiwgJ2FzY2lpJykuZW5kc3dpdGgodW5pY29kZSgieCIsICdhc2NpaScpKSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoInh5ejAxMjMiLCAnYXNjaWknKS5pc2FsbnVtKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoIkAjJCUiLCAnYXNjaWknKS5pc2FsbnVtKCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh1bmljb2RlKCJ4eXoiLCAnYXNjaWknKS5pc2FscGhhKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoIkAjJCUiLCAnYXNjaWknKS5pc2FscGhhKCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh1bmljb2RlKCIwMTIzIiwgJ2FzY2lpJykuaXNkZWNpbWFsKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoInh5eiIsICdhc2NpaScpLmlzZGVjaW1hbCgpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgiMDEyMyIsICdhc2NpaScpLmlzZGlnaXQoKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgieHl6IiwgJ2FzY2lpJykuaXNkaWdpdCgpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgieHl6IiwgJ2FzY2lpJykuaXNsb3dlcigpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh1bmljb2RlKCJYWVoiLCAnYXNjaWknKS5pc2xvd2VyKCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh1bmljb2RlKCIwMTIzIiwgJ2FzY2lpJykuaXNudW1lcmljKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoInh5eiIsICdhc2NpaScpLmlzbnVtZXJpYygpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgiICIsICdhc2NpaScpLmlzc3BhY2UoKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgiWFlaIiwgJ2FzY2lpJykuaXNzcGFjZSgpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgiWCIsICdhc2NpaScpLmlzdGl0bGUoKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgieCIsICdhc2NpaScpLmlzdGl0bGUoKSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoIlhZWiIsICdhc2NpaScpLmlzdXBwZXIoKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgieHl6IiwgJ2FzY2lpJykuaXN1cHBlcigpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgieHl6IiwgJ2FzY2lpJykuc3RhcnRzd2l0aCh1bmljb2RlKCJ4IiwgJ2FzY2lpJykpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh1bmljb2RlKCJ4eXoiLCAnYXNjaWknKS5zdGFydHN3aXRoKHVuaWNvZGUoInoiLCAnYXNjaWknKSksIEZhbHNlKQorCisgICAgZGVmIHRlc3RfYm9vbGVhbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlICYgMSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKFRydWUgJiAxLCBib29sKQorICAgICAgICBzZWxmLmFzc2VydElzKFRydWUgJiBUcnVlLCBUcnVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSB8IDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShUcnVlIHwgMSwgYm9vbCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhUcnVlIHwgVHJ1ZSwgVHJ1ZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUgXiAxLCAwKQorICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoVHJ1ZSBeIDEsIGJvb2wpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoVHJ1ZSBeIFRydWUsIEZhbHNlKQorCisgICAgZGVmIHRlc3RfZmlsZWNsb3NlZChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhmLmNsb3NlZCwgRmFsc2UpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZi5jbG9zZWQsIFRydWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X3R5cGVzKHNlbGYpOgorICAgICAgICAjIHR5cGVzIGFyZSBhbHdheXMgdHJ1ZS4KKyAgICAgICAgZm9yIHQgaW4gW2Jvb2wsIGNvbXBsZXgsIGRpY3QsIGZpbGUsIGZsb2F0LCBpbnQsIGxpc3QsIGxvbmcsIG9iamVjdCwKKyAgICAgICAgICAgICAgICAgIHNldCwgc3RyLCB0dXBsZSwgdHlwZV06CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGJvb2wodCksIFRydWUpCisKKyAgICBkZWYgdGVzdF9vcGVyYXRvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IG9wZXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IudHJ1dGgoMCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLnRydXRoKDEpLCBUcnVlKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzQ2FsbGFibGUoMCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc0NhbGxhYmxlKGxlbiksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNOdW1iZXJUeXBlKE5vbmUpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc051bWJlclR5cGUoMCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3Iubm90XygxKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3Iubm90XygwKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSgwKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUoW10pLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmNvbnRhaW5zKFtdLCAxKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuY29udGFpbnMoWzFdLCAxKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc01hcHBpbmdUeXBlKDEpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc01hcHBpbmdUeXBlKHt9KSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5sdCgwLCAwKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IubHQoMCwgMSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNfKFRydWUsIFRydWUpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzXyhUcnVlLCBGYWxzZSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzX25vdChUcnVlLCBUcnVlKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNfbm90KFRydWUsIEZhbHNlKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X21hcnNoYWwoc2VsZik6CisgICAgICAgIGltcG9ydCBtYXJzaGFsCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKFRydWUpKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMoRmFsc2UpKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CisgICAgICAgIGltcG9ydCBwaWNrbGUKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKFRydWUpKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKEZhbHNlKSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoVHJ1ZSwgVHJ1ZSkpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoRmFsc2UsIFRydWUpKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9jcGlja2xlKHNlbGYpOgorICAgICAgICBpbXBvcnQgY1BpY2tsZQorICAgICAgICBzZWxmLmFzc2VydElzKGNQaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyhUcnVlKSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoY1BpY2tsZS5sb2FkcyhjUGlja2xlLmR1bXBzKEZhbHNlKSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKGNQaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyhUcnVlLCBUcnVlKSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoY1BpY2tsZS5sb2FkcyhjUGlja2xlLmR1bXBzKEZhbHNlLCBUcnVlKSksIEZhbHNlKQorCisgICAgZGVmIHRlc3RfbWl4ZWRwaWNrbGUoc2VsZik6CisgICAgICAgIGltcG9ydCBwaWNrbGUsIGNQaWNrbGUKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhwaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyhUcnVlKSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocGlja2xlLmxvYWRzKGNQaWNrbGUuZHVtcHMoRmFsc2UpKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocGlja2xlLmxvYWRzKGNQaWNrbGUuZHVtcHMoVHJ1ZSwgVHJ1ZSkpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKHBpY2tsZS5sb2FkcyhjUGlja2xlLmR1bXBzKEZhbHNlLCBUcnVlKSksIEZhbHNlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoY1BpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoVHJ1ZSkpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGNQaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKEZhbHNlKSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKGNQaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKFRydWUsIFRydWUpKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjUGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhGYWxzZSwgVHJ1ZSkpLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X3BpY2tsZXZhbHVlcyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZSwgY1BpY2tsZQorCisgICAgICAgICMgVGVzdCBmb3Igc3BlY2lmaWMgYmFja3dhcmRzLWNvbXBhdGlibGUgcGlja2xlIHZhbHVlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpY2tsZS5kdW1wcyhUcnVlKSwgIkkwMVxuLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGlja2xlLmR1bXBzKEZhbHNlKSwgIkkwMFxuLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY1BpY2tsZS5kdW1wcyhUcnVlKSwgIkkwMVxuLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY1BpY2tsZS5kdW1wcyhGYWxzZSksICJJMDBcbi4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpY2tsZS5kdW1wcyhUcnVlLCBUcnVlKSwgIkkwMVxuLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGlja2xlLmR1bXBzKEZhbHNlLCBUcnVlKSwgIkkwMFxuLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY1BpY2tsZS5kdW1wcyhUcnVlLCBUcnVlKSwgIkkwMVxuLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY1BpY2tsZS5kdW1wcyhGYWxzZSwgVHJ1ZSksICJJMDBcbi4iKQorCisgICAgZGVmIHRlc3RfY29udmVydF90b19ib29sKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IFR5cGVFcnJvciBvY2N1cnMgd2hlbiBiYWQgdGhpbmdzIGFyZSByZXR1cm5lZAorICAgICAgICAjIGZyb20gX19ub256ZXJvX18oKS4gIFRoaXMgaXNuJ3QgcmVhbGx5IGEgYm9vbCB0ZXN0LCBidXQKKyAgICAgICAgIyBpdCdzIHJlbGF0ZWQuCisgICAgICAgIGNoZWNrID0gbGFtYmRhIG86IHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYm9vbCwgbykKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgY2hlY2soRm9vKCkpCisKKyAgICAgICAgY2xhc3MgQmFyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJZZXMiCisgICAgICAgIGNoZWNrKEJhcigpKQorCisgICAgICAgIGNsYXNzIEJheihpbnQpOgorICAgICAgICAgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGNoZWNrKEJheigpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEJvb2xUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ib29sLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jvb2wucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNTQ5ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ib29sLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ib29sLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jvb2wucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNTQ5ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ib29sLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxZWUwYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYi5weQpAQCAtMCwwICsxLDM1NyBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiVGVzdCBzY3JpcHQgZm9yIHRoZSBic2RkYiBDIG1vZHVsZSBieSBSb2dlciBFLiBNYXNzZQorICAgQWRhcHRlZCB0byB1bml0dGVzdCBmb3JtYXQgYW5kIGV4cGFuZGVkIHNjb3BlIGJ5IFJheW1vbmQgSGV0dGluZ2VyCisiIiIKK2ltcG9ydCBvcywgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgU2tpcCB0ZXN0IGlmIF9ic2RkYiB3YXNuJ3QgYnVpbHQuCit0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnX2JzZGRiJykKKworYnNkZGIgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnYnNkZGInLCBkZXByZWNhdGVkPVRydWUpCisjIEp1c3Qgc28gd2Uga25vdyBpdCdzIGltcG9ydGVkOgordGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2RiaGFzaCcsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworCitjbGFzcyBUZXN0QlNEREIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIG9wZW5mbGFnID0gJ2MnCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZiA9IHNlbGYub3Blbm1ldGhvZFswXShzZWxmLmZuYW1lLCBzZWxmLm9wZW5mbGFnLCBjYWNoZXNpemU9MzI3NjgpCisgICAgICAgIHNlbGYuZCA9IGRpY3QocT0nR3VpZG8nLCB3PSd2YW4nLCBlPSdSb3NzdW0nLCByPSdpbnZlbnRlZCcsIHQ9J1B5dGhvbicsIHk9JycpCisgICAgICAgIGZvciBrLCB2IGluIHNlbGYuZC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuZltrXSA9IHYKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5mLnN5bmMoKQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLmZuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuZm5hbWUpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CisgICAgICAgIGZvciBrLCB2IGluIHNlbGYuZC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mW2tdLCB2KQorCisgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLmYpLCBsZW4oc2VsZi5kKSkKKworICAgIGRlZiB0ZXN0X2NoYW5nZShzZWxmKToKKyAgICAgICAgc2VsZi5mWydyJ10gPSAnZGlzY292ZXJlZCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZbJ3InXSwgJ2Rpc2NvdmVyZWQnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdyJywgc2VsZi5mLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignZGlzY292ZXJlZCcsIHNlbGYuZi52YWx1ZXMoKSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlX2FuZF9yZW9wZW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYuZm5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICMgaWYgd2UncmUgdXNpbmcgYW4gaW4tbWVtb3J5IG9ubHkgZGIsIHdlIGNhbid0IHJlb3BlbiBpdAorICAgICAgICAgICAgIyBzbyBmaW5pc2ggaGVyZS4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBzZWxmLmYgPSBzZWxmLm9wZW5tZXRob2RbMF0oc2VsZi5mbmFtZSwgJ3cnKQorICAgICAgICBmb3IgaywgdiBpbiBzZWxmLmQuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZltrXSwgdikKKworICAgIGRlZiBhc3NlcnRTZXRFcXVhbHMoc2VsZiwgc2VxbjEsIHNlcW4yKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VxbjEpLCBzZXQoc2VxbjIpKQorCisgICAgZGVmIHRlc3RfbWFwcGluZ19pdGVyYXRpb25fbWV0aG9kcyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYuZgorICAgICAgICBkID0gc2VsZi5kCisgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWxzKGQsIGYpCisgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWxzKGQua2V5cygpLCBmLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbHMoZC52YWx1ZXMoKSwgZi52YWx1ZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbHMoZC5pdGVtcygpLCBmLml0ZW1zKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWxzKGQuaXRlcmtleXMoKSwgZi5pdGVya2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydFNldEVxdWFscyhkLml0ZXJ2YWx1ZXMoKSwgZi5pdGVydmFsdWVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWxzKGQuaXRlcml0ZW1zKCksIGYuaXRlcml0ZW1zKCkpCisKKyAgICBkZWYgdGVzdF9pdGVyX3doaWxlX21vZGlmeWluZ192YWx1ZXMoc2VsZik6CisgICAgICAgIGRpID0gaXRlcihzZWxmLmQpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAga2V5ID0gZGkubmV4dCgpCisgICAgICAgICAgICAgICAgc2VsZi5kW2tleV0gPSAnbW9kaWZpZWQgJytrZXkKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgIyBpdCBzaG91bGQgYmVoYXZlIHRoZSBzYW1lIGFzIGEgZGljdC4gIG1vZGlmeWluZyB2YWx1ZXMKKyAgICAgICAgIyBvZiBleGlzdGluZyBrZXlzIHNob3VsZCBub3QgYnJlYWsgaXRlcmF0aW9uLiAgKGFkZGluZworICAgICAgICAjIG9yIHJlbW92aW5nIGtleXMgc2hvdWxkKQorICAgICAgICBsb29wc19sZWZ0ID0gbGVuKHNlbGYuZikKKyAgICAgICAgZmkgPSBpdGVyKHNlbGYuZikKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBrZXkgPSBmaS5uZXh0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmZba2V5XSA9ICdtb2RpZmllZCAnK2tleQorICAgICAgICAgICAgICAgIGxvb3BzX2xlZnQgLT0gMQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb29wc19sZWZ0LCAwKQorCisgICAgICAgIHNlbGYudGVzdF9tYXBwaW5nX2l0ZXJhdGlvbl9tZXRob2RzKCkKKworICAgIGRlZiB0ZXN0X2l0ZXJfYWJvcnRfb25fY2hhbmdlZF9zaXplKHNlbGYpOgorICAgICAgICBkZWYgRGljdEl0ZXJBYm9ydCgpOgorICAgICAgICAgICAgZGkgPSBpdGVyKHNlbGYuZCkKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkaS5uZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kWyduZXdrZXknXSA9ICdTUEFNJworICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIERpY3RJdGVyQWJvcnQpCisKKyAgICAgICAgZGVmIERiSXRlckFib3J0KCk6CisgICAgICAgICAgICBmaSA9IGl0ZXIoc2VsZi5mKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZpLm5leHQoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmZbJ25ld2tleSddID0gJ1NQQU0nCisgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgRGJJdGVyQWJvcnQpCisKKyAgICBkZWYgdGVzdF9pdGVyaXRlbXNfYWJvcnRfb25fY2hhbmdlZF9zaXplKHNlbGYpOgorICAgICAgICBkZWYgRGljdEl0ZXJpdGVtc0Fib3J0KCk6CisgICAgICAgICAgICBkaSA9IHNlbGYuZC5pdGVyaXRlbXMoKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRpLm5leHQoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmRbJ25ld2tleSddID0gJ1NQQU0nCisgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgRGljdEl0ZXJpdGVtc0Fib3J0KQorCisgICAgICAgIGRlZiBEYkl0ZXJpdGVtc0Fib3J0KCk6CisgICAgICAgICAgICBmaSA9IHNlbGYuZi5pdGVyaXRlbXMoKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGtleSwgdmFsdWUgPSBmaS5uZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuZltrZXldCisgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgRGJJdGVyaXRlbXNBYm9ydCkKKworICAgIGRlZiB0ZXN0X2l0ZXJpdGVtc193aGlsZV9tb2RpZnlpbmdfdmFsdWVzKHNlbGYpOgorICAgICAgICBkaSA9IHNlbGYuZC5pdGVyaXRlbXMoKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGssIHYgPSBkaS5uZXh0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmRba10gPSAnbW9kaWZpZWQgJyt2CisgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICMgaXQgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZSBhcyBhIGRpY3QuICBtb2RpZnlpbmcgdmFsdWVzCisgICAgICAgICMgb2YgZXhpc3Rpbmcga2V5cyBzaG91bGQgbm90IGJyZWFrIGl0ZXJhdGlvbi4gIChhZGRpbmcKKyAgICAgICAgIyBvciByZW1vdmluZyBrZXlzIHNob3VsZCkKKyAgICAgICAgbG9vcHNfbGVmdCA9IGxlbihzZWxmLmYpCisgICAgICAgIGZpID0gc2VsZi5mLml0ZXJpdGVtcygpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaywgdiA9IGZpLm5leHQoKQorICAgICAgICAgICAgICAgIHNlbGYuZltrXSA9ICdtb2RpZmllZCAnK3YKKyAgICAgICAgICAgICAgICBsb29wc19sZWZ0IC09IDEKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9vcHNfbGVmdCwgMCkKKworICAgICAgICBzZWxmLnRlc3RfbWFwcGluZ19pdGVyYXRpb25fbWV0aG9kcygpCisKKyAgICBkZWYgdGVzdF9maXJzdF9uZXh0X2xvb3Bpbmcoc2VsZik6CisgICAgICAgIGl0ZW1zID0gW3NlbGYuZi5maXJzdCgpXQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMSwgbGVuKHNlbGYuZikpOgorICAgICAgICAgICAgaXRlbXMuYXBwZW5kKHNlbGYuZi5uZXh0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWxzKGl0ZW1zLCBzZWxmLmQuaXRlbXMoKSkKKworICAgIGRlZiB0ZXN0X3ByZXZpb3VzX2xhc3RfbG9vcGluZyhzZWxmKToKKyAgICAgICAgaXRlbXMgPSBbc2VsZi5mLmxhc3QoKV0KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEsIGxlbihzZWxmLmYpKToKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChzZWxmLmYucHJldmlvdXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbHMoaXRlbXMsIHNlbGYuZC5pdGVtcygpKQorCisgICAgZGVmIHRlc3RfZmlyc3Rfd2hpbGVfZGVsZXRpbmcoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgYnVnIDE3MjU4NTYKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLmQpID49IDIsICJ0ZXN0IHJlcXVpcmVzID49MiBpdGVtcyIpCisgICAgICAgIGZvciBfIGluIHNlbGYuZDoKKyAgICAgICAgICAgIGtleSA9IHNlbGYuZi5maXJzdCgpWzBdCisgICAgICAgICAgICBkZWwgc2VsZi5mW2tleV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgc2VsZi5mLml0ZW1zKCksICJleHBlY3RlZCBlbXB0eSBkYiBhZnRlciB0ZXN0IikKKworICAgIGRlZiB0ZXN0X2xhc3Rfd2hpbGVfZGVsZXRpbmcoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgYnVnIDE3MjU4NTYncyBldmlsIHR3aW4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLmQpID49IDIsICJ0ZXN0IHJlcXVpcmVzID49MiBpdGVtcyIpCisgICAgICAgIGZvciBfIGluIHNlbGYuZDoKKyAgICAgICAgICAgIGtleSA9IHNlbGYuZi5sYXN0KClbMF0KKyAgICAgICAgICAgIGRlbCBzZWxmLmZba2V5XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBzZWxmLmYuaXRlbXMoKSwgImV4cGVjdGVkIGVtcHR5IGRiIGFmdGVyIHRlc3QiKQorCisgICAgZGVmIHRlc3Rfc2V0X2xvY2F0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5zZXRfbG9jYXRpb24oJ2UnKSwgKCdlJywgc2VsZi5kWydlJ10pKQorCisgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CisgICAgICAgIGZvciBrIGluIHNlbGYuZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaywgc2VsZi5mKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdub3QgaGVyZScsIHNlbGYuZikKKworICAgIGRlZiB0ZXN0X2hhc19rZXkoc2VsZik6CisgICAgICAgIGZvciBrIGluIHNlbGYuZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmYuaGFzX2tleShrKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmYuaGFzX2tleSgnbm90IGhlcmUnKSkKKworICAgIGRlZiB0ZXN0X2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLmYuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLmYpLCAwKQorCisgICAgZGVmIHRlc3RfX25vX2RlYWRsb2NrX2ZpcnN0KHNlbGYsIGRlYnVnPTApOgorICAgICAgICAjIGRvIHRoaXMgc28gdGhhdCB0ZXN0ZXJzIGNhbiBzZWUgd2hhdCBmdW5jdGlvbiB3ZSdyZSBpbiBpbgorICAgICAgICAjIHZlcmJvc2UgbW9kZSB3aGVuIHdlIGRlYWRsb2NrLgorICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKworICAgICAgICAjIGluIHB5YnNkZGIncyBfREJXaXRoQ3Vyc29yIHRoaXMgY2F1c2VzIGFuIGludGVybmFsIERCQ3Vyc29yCisgICAgICAgICMgb2JqZWN0IGlzIGNyZWF0ZWQuICBPdGhlciB0ZXN0XyBtZXRob2RzIGluIHRoaXMgY2xhc3MgY291bGQKKyAgICAgICAgIyBpbmFkdmVydGVudGx5IGNhdXNlIHRoZSBkZWFkbG9jayBidXQgYW4gZXhwbGljaXQgdGVzdCBpcyBuZWVkZWQuCisgICAgICAgIGlmIGRlYnVnOiBwcmludCAiQSIKKyAgICAgICAgayx2ID0gc2VsZi5mLmZpcnN0KCkKKyAgICAgICAgaWYgZGVidWc6IHByaW50ICJCIiwgaworICAgICAgICBzZWxmLmZba10gPSAiZGVhZGxvY2suICBkbyBub3QgcGFzcyBnby4gIGRvIG5vdCBjb2xsZWN0ICQyMDAuIgorICAgICAgICBpZiBkZWJ1ZzogcHJpbnQgIkMiCisgICAgICAgICMgaWYgdGhlIGJzZGRiIGltcGxlbWVudGF0aW9uIGxlYXZlcyB0aGUgREJDdXJzb3Igb3BlbiBkdXJpbmcKKyAgICAgICAgIyB0aGUgZGF0YWJhc2Ugd3JpdGUgYW5kIGxvY2tpbmcrdGhyZWFkaW5nIHN1cHBvcnQgaXMgZW5hYmxlZAorICAgICAgICAjIHRoZSBjdXJzb3IncyByZWFkIGxvY2sgd2lsbCBkZWFkbG9jayB0aGUgd3JpdGUgbG9jayByZXF1ZXN0Li4KKworICAgICAgICAjIHRlc3QgdGhlIGl0ZXJhdG9yIGludGVyZmFjZQorICAgICAgICBpZiBUcnVlOgorICAgICAgICAgICAgaWYgZGVidWc6IHByaW50ICJEIgorICAgICAgICAgICAgaSA9IHNlbGYuZi5pdGVyaXRlbXMoKQorICAgICAgICAgICAgayx2ID0gaS5uZXh0KCkKKyAgICAgICAgICAgIGlmIGRlYnVnOiBwcmludCAiRSIKKyAgICAgICAgICAgIHNlbGYuZltrXSA9ICJwbGVhc2UgZG9uJ3QgZGVhZGxvY2siCisgICAgICAgICAgICBpZiBkZWJ1ZzogcHJpbnQgIkYiCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgayx2ID0gaS5uZXh0KCkKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGRlYnVnOiBwcmludCAiRjIiCisKKyAgICAgICAgICAgIGkgPSBpdGVyKHNlbGYuZikKKyAgICAgICAgICAgIGlmIGRlYnVnOiBwcmludCAiRyIKKyAgICAgICAgICAgIHdoaWxlIGk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBkZWJ1ZzogcHJpbnQgIkgiCisgICAgICAgICAgICAgICAgICAgIGsgPSBpLm5leHQoKQorICAgICAgICAgICAgICAgICAgICBpZiBkZWJ1ZzogcHJpbnQgIkkiCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZltrXSA9ICJkZWFkbG9ja3Mtci11cyIKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVidWc6IHByaW50ICJKIgorICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICBpID0gTm9uZQorICAgICAgICAgICAgaWYgZGVidWc6IHByaW50ICJLIgorCisgICAgICAgICMgdGVzdCB0aGUgbGVnYWN5IGN1cnNvciBpbnRlcmZhY2UgbWl4ZWQgd2l0aCB3cml0ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzZWxmLmYuZmlyc3QoKVswXSwgc2VsZi5kKQorICAgICAgICBrID0gc2VsZi5mLm5leHQoKVswXQorICAgICAgICBzZWxmLmFzc2VydEluKGssIHNlbGYuZCkKKyAgICAgICAgc2VsZi5mW2tdID0gImJlIGdvbmUgd2l0aCB5ZSBkZWFkbG9ja3MiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZba10sICJiZSBnb25lIHdpdGggeWUgZGVhZGxvY2tzIikKKworICAgIGRlZiB0ZXN0X2Zvcl9jdXJzb3JfbWVtbGVhayhzZWxmKToKKyAgICAgICAgIyBkbyB0aGUgYnNkZGIuX0RCV2l0aEN1cnNvciBpdGVyYXRvciBpbnRlcm5hbHMgbGVhayBjdXJzb3JzPworICAgICAgICBuYzEgPSBsZW4oc2VsZi5mLl9jdXJzb3JfcmVmcykKKyAgICAgICAgIyBjcmVhdGUgaXRlcmF0b3IKKyAgICAgICAgaSA9IHNlbGYuZi5pdGVyaXRlbXMoKQorICAgICAgICBuYzIgPSBsZW4oc2VsZi5mLl9jdXJzb3JfcmVmcykKKyAgICAgICAgIyB1c2UgdGhlIGl0ZXJhdG9yIChzaG91bGQgcnVuIHRvIHRoZSBmaXJzdCB5aWVsZCwgY3JlYXRpbmcgdGhlIGN1cnNvcikKKyAgICAgICAgaywgdiA9IGkubmV4dCgpCisgICAgICAgIG5jMyA9IGxlbihzZWxmLmYuX2N1cnNvcl9yZWZzKQorICAgICAgICAjIGRlc3Ryb3kgdGhlIGl0ZXJhdG9yOyB0aGlzIHNob3VsZCBjYXVzZSB0aGUgd2Vha3JlZiBjYWxsYmFjaworICAgICAgICAjIHRvIHJlbW92ZSB0aGUgY3Vyc29yIG9iamVjdCBmcm9tIHNlbGYuZi5fY3Vyc29yX3JlZnMKKyAgICAgICAgZGVsIGkKKyAgICAgICAgbmM0ID0gbGVuKHNlbGYuZi5fY3Vyc29yX3JlZnMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYzEsIG5jMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYzEsIG5jNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5jMyA9PSBuYzErMSkKKworICAgIGRlZiB0ZXN0X3BvcGl0ZW0oc2VsZik6CisgICAgICAgIGssIHYgPSBzZWxmLmYucG9waXRlbSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oaywgc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEluKHYsIHNlbGYuZC52YWx1ZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihrLCBzZWxmLmYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuZCktMSwgbGVuKHNlbGYuZikpCisKKyAgICBkZWYgdGVzdF9wb3Aoc2VsZik6CisgICAgICAgIGsgPSAndycKKyAgICAgICAgdiA9IHNlbGYuZi5wb3AoaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCBzZWxmLmRba10pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oaywgc2VsZi5mKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHYsIHNlbGYuZi52YWx1ZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5kKS0xLCBsZW4oc2VsZi5mKSkKKworICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYuZ2V0KCdOb3RIZXJlJyksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmdldCgnTm90SGVyZScsICdEZWZhdWx0JyksICdEZWZhdWx0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYuZ2V0KCdxJywgJ0RlZmF1bHQnKSwgc2VsZi5kWydxJ10pCisKKyAgICBkZWYgdGVzdF9zZXRkZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5zZXRkZWZhdWx0KCduZXcnLCAnZG9nJyksICdkb2cnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5zZXRkZWZhdWx0KCdyJywgJ2NhdCcpLCBzZWxmLmRbJ3InXSkKKworICAgIGRlZiB0ZXN0X3VwZGF0ZShzZWxmKToKKyAgICAgICAgbmV3ID0gZGljdCh5PSdsaWZlJywgdT0nb2YnLCBpPSdicmlhbicpCisgICAgICAgIHNlbGYuZi51cGRhdGUobmV3KQorICAgICAgICBzZWxmLmQudXBkYXRlKG5ldykKKyAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5kLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZba10sIHYpCisKKyAgICBkZWYgdGVzdF9rZXlvcmRlcmluZyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5vcGVubWV0aG9kWzBdIGlzIG5vdCBic2RkYi5idG9wZW46CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAga2V5cyA9IHNlbGYuZC5rZXlzKCkKKyAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYuZmlyc3QoKVswXSwga2V5c1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYubmV4dCgpWzBdLCBrZXlzWzFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5sYXN0KClbMF0sIGtleXNbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5wcmV2aW91cygpWzBdLCBrZXlzWy0yXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHNlbGYuZiksIGtleXMpCisKK2NsYXNzIFRlc3RCVHJlZShUZXN0QlNEREIpOgorICAgIGZuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgIG9wZW5tZXRob2QgPSBbYnNkZGIuYnRvcGVuXQorCitjbGFzcyBUZXN0QlRyZWVfSW5NZW1vcnkoVGVzdEJTRERCKToKKyAgICBmbmFtZSA9IE5vbmUKKyAgICBvcGVubWV0aG9kID0gW2JzZGRiLmJ0b3Blbl0KKworY2xhc3MgVGVzdEJUcmVlX0luTWVtb3J5X1RydW5jYXRlKFRlc3RCU0REQik6CisgICAgZm5hbWUgPSBOb25lCisgICAgb3BlbmZsYWcgPSAnbicKKyAgICBvcGVubWV0aG9kID0gW2JzZGRiLmJ0b3Blbl0KKworY2xhc3MgVGVzdEhhc2hUYWJsZShUZXN0QlNEREIpOgorICAgIGZuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgIG9wZW5tZXRob2QgPSBbYnNkZGIuaGFzaG9wZW5dCisKK2NsYXNzIFRlc3RIYXNoVGFibGVfSW5NZW1vcnkoVGVzdEJTRERCKToKKyAgICBmbmFtZSA9IE5vbmUKKyAgICBvcGVubWV0aG9kID0gW2JzZGRiLmhhc2hvcGVuXQorCisjIyAgICAgICAgICMgKGJzZGRiLnJub3BlbiwnUmVjb3JkIE51bWJlcnMnKSwgJ3B1dCcgZm9yIFJFQ05PIGZvciBic2RkYiAxLjg1CisjIyAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcnMgYnJva2VuLi4uIGF0IGxlYXN0IG9uCisjIyAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbGFyaXMgSW50ZWwgLSBybWFzc2UgMS85NworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgVGVzdEJUcmVlLAorICAgICAgICBUZXN0SGFzaFRhYmxlLAorICAgICAgICBUZXN0QlRyZWVfSW5NZW1vcnksCisgICAgICAgIFRlc3RIYXNoVGFibGVfSW5NZW1vcnksCisgICAgICAgIFRlc3RCVHJlZV9Jbk1lbW9yeV9UcnVuY2F0ZSwKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE4ZDQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGE4ZDQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiMTg1LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIxODUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxMDJjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiMTg1LnB5CkBAIC0wLDAgKzEsNDMgQEAKKyIiIlRlc3RzIGZvciB0aGUgYnNkZGIxODUgbW9kdWxlLgorCitUaGUgZmlsZSAxODV0ZXN0LmRiIGZvdW5kIGluIExpYi90ZXN0LyBpcyBmb3IgdGVzdGluZyBwdXJwb3NlcyB3aXRoIHRoaXMKK3Rlc3Rpbmcgc3VpdGUuCisKKyIiIgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBmaW5kZmlsZSwgaW1wb3J0X21vZHVsZQoraW1wb3J0IHVuaXR0ZXN0Citic2RkYjE4NSA9IGltcG9ydF9tb2R1bGUoJ2JzZGRiMTg1JywgZGVwcmVjYXRlZD1UcnVlKQoraW1wb3J0IGFueWRibQoraW1wb3J0IHdoaWNoZGIKK2ltcG9ydCBvcworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc2h1dGlsCisKK2NsYXNzIEJzZGRiMTg1VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfb3Blbl9leGlzdGluZ19oYXNoKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB3ZSBjYW4gb3BlbiBhIGZpbGUga25vd24gdG8gYmUgYSBoYXNoIHYyIGZpbGUKKyAgICAgICAgZGIgPSBic2RkYjE4NS5oYXNob3BlbihmaW5kZmlsZSgiMTg1dGVzdC5kYiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRiWyIxIl0sICIxIikKKyAgICAgICAgZGIuY2xvc2UoKQorCisgICAgZGVmIHRlc3Rfd2hpY2hkYihzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB3aGljaGRiIGNvcnJlY3RseSBzbmlmZnMgdGhlIGtub3duIGhhc2ggdjIgZmlsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdoaWNoZGIud2hpY2hkYihmaW5kZmlsZSgiMTg1dGVzdC5kYiIpKSwgImJzZGRiMTg1IikKKworICAgIGRlZiB0ZXN0X2FueWRibV9jcmVhdGUoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgYW55ZGJtLm9wZW4gZG9lcyAqbm90KiBjcmVhdGUgYSBic2RkYjE4NSBmaWxlCisgICAgICAgIHRtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYmZpbGUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAiZm9vLmRiIikKKyAgICAgICAgICAgIGFueWRibS5vcGVuKGRiZmlsZSwgImMiKS5jbG9zZSgpCisgICAgICAgICAgICBmdHlwZSA9IHdoaWNoZGIud2hpY2hkYihkYmZpbGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZ0eXBlLCAiYnNkZGIxODUiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0bXBkaXIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoQnNkZGIxODVUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIxODUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIxODUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDA4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYjE4NS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIxODUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIxODUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDA4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYjE4NS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTE0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYjMucHkKQEAgLTAsMCArMSw4MSBAQAorIyBUZXN0IGRyaXZlciBmb3IgYnNkZGIgcGFja2FnZS4KKyIiIgorUnVuIGFsbCB0ZXN0IGNhc2VzLgorIiIiCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMsIHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZQorCisjIFNraXAgdGVzdCBpZiBfYnNkZGIgbW9kdWxlIHdhcyBub3QgYnVpbHQuCitpbXBvcnRfbW9kdWxlKCdfYnNkZGInKQorIyBTaWxlbmNlIFB5M2sgd2FybmluZworaW1wb3J0X21vZHVsZSgnYnNkZGInLCBkZXByZWNhdGVkPVRydWUpCisKKyMgV2hlbiBydW5uaW5nIGFzIGEgc2NyaXB0IGluc3RlYWQgb2Ygd2l0aGluIHRoZSByZWdydGVzdCBmcmFtZXdvcmssIHNraXAgdGhlCisjIHJlcXVpcmVzIHRlc3QsIHNpbmNlIGl0J3Mgb2J2aW91cyB3ZSB3YW50IHRvIHJ1biB0aGVtLgoraWYgX19uYW1lX18gIT0gJ19fbWFpbl9fJzoKKyAgICByZXF1aXJlcygnYnNkZGInKQorCit2ZXJib3NlID0gRmFsc2UKK2lmICd2ZXJib3NlJyBpbiBzeXMuYXJndjoKKyAgICB2ZXJib3NlID0gVHJ1ZQorICAgIHN5cy5hcmd2LnJlbW92ZSgndmVyYm9zZScpCisKK2lmICdzaWxlbnQnIGluIHN5cy5hcmd2OiAgIyB0YWtlIGNhcmUgb2Ygb2xkIGZsYWcsIGp1c3QgaW4gY2FzZQorICAgIHZlcmJvc2UgPSBGYWxzZQorICAgIHN5cy5hcmd2LnJlbW92ZSgnc2lsZW50JykKKworCitjbGFzcyBUaW1pbmdDaGVjayh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJUaGlzIGNsYXNzIGlzIG5vdCBhIHJlYWwgdGVzdC4gIEl0cyBwdXJwb3NlIGlzIHRvIHByaW50IGEgbWVzc2FnZQorICAgIHBlcmlvZGljYWxseSB3aGVuIHRoZSB0ZXN0IHJ1bnMgc2xvd2x5LiAgVGhpcyB3aWxsIHByZXZlbnQgdGhlIGJ1aWxkYm90cworICAgIGZyb20gdGltaW5nIG91dCBvbiBzbG93IG1hY2hpbmVzLiIiIgorCisgICAgIyBIb3cgbXVjaCB0aW1lIGluIHNlY29uZHMgYmVmb3JlIHByaW50aW5nIGEgJ1N0aWxsIHdvcmtpbmcnIG1lc3NhZ2UuCisgICAgIyBTaW5jZSB0aGlzIGlzIHJ1biBhdCBtb3N0IG9uY2UgYmV0d2VlbiBlYWNoIHRlc3QgbW9kdWxlLCB1c2UgYSBzbWFsbGVyCisgICAgIyBpbnRlcnZhbCB0aGFuIG90aGVyIHRlc3RzLgorICAgIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTCA9IDQgKiA2MAorCisgICAgIyBuZXh0X3RpbWUgaXMgdXNlZCBhcyBhIGdsb2JhbCB2YXJpYWJsZSB0aGF0IHN1cnZpdmVzIGVhY2ggaW5zdGFuY2UuCisgICAgIyBUaGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSBhIG5ldyBpbnN0YW5jZSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggdGVzdC4KKyAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAorCisgICAgZGVmIHRlc3RDaGVja0VsYXBzZWRUaW1lKHNlbGYpOgorICAgICAgICAjIFByaW50IHN0aWxsIHdvcmtpbmcgbWVzc2FnZSBzaW5jZSB0aGVzZSB0ZXN0cyBjYW4gYmUgcmVhbGx5IHNsb3cuCisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIGlmIHNlbGYubmV4dF90aW1lIDw9IG5vdzoKKyAgICAgICAgICAgIFRpbWluZ0NoZWNrLm5leHRfdGltZSA9IG5vdyArIHNlbGYuX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMCisgICAgICAgICAgICBzeXMuX19zdGRvdXRfXy53cml0ZSgnICB0ZXN0X2JzZGRiMyBzdGlsbCB3b3JraW5nLCBiZSBwYXRpZW50Li4uXG4nKQorICAgICAgICAgICAgc3lzLl9fc3Rkb3V0X18uZmx1c2goKQorCisKKyMgRm9yIGludm9jYXRpb24gdGhyb3VnaCByZWdydGVzdAorZGVmIHRlc3RfbWFpbigpOgorICAgIGZyb20gYnNkZGIgaW1wb3J0IGRiCisgICAgZnJvbSBic2RkYi50ZXN0IGltcG9ydCB0ZXN0X2FsbAorICAgIHRlc3RfYWxsLnNldF90ZXN0X3BhdGhfcHJlZml4KG9zLnBhdGguam9pbih0ZW1wZmlsZS5nZXR0ZW1wZGlyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnei10ZXN0X2JzZGRiMy0lcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuZ2V0cGlkKCkpKQorICAgICMgUGxlYXNlIGxlYXZlIHRoaXMgcHJpbnQgaW4sIGhhdmluZyB0aGlzIHNob3cgdXAgaW4gdGhlIGJ1aWxkYm90cworICAgICMgbWFrZXMgZGlhZ25vc2luZyBwcm9ibGVtcyBhIGxvdCBlYXNpZXIuCisgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCBkYi5EQl9WRVJTSU9OX1NUUklORworICAgIHByaW50ID4+c3lzLnN0ZGVyciwgJ1Rlc3QgcGF0aCBwcmVmaXg6ICcsIHRlc3RfYWxsLmdldF90ZXN0X3BhdGhfcHJlZml4KCkKKyAgICB0cnk6CisgICAgICAgIHJ1bl91bml0dGVzdCh0ZXN0X2FsbC5zdWl0ZShtb2R1bGVfcHJlZml4PSdic2RkYi50ZXN0LicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1pbmdfY2hlY2s9VGltaW5nQ2hlY2spKQorICAgIGZpbmFsbHk6CisgICAgICAgICMgVGhlIG9ubHkgcmVhc29uIHRvIHJlbW92ZSBkYl9ob21lIGlzIGluIGNhc2UgaWYgdGhlcmUgaXMgYW4gb2xkCisgICAgICAgICMgb25lIGx5aW5nIGFyb3VuZC4gIFRoaXMgbWlnaHQgYmUgYnkgYSBkaWZmZXJlbnQgdXNlciwgc28ganVzdAorICAgICAgICAjIGlnbm9yZSBlcnJvcnMuICBXZSBzaG91bGQgYWx3YXlzIG1ha2UgYSB1bmlxdWUgbmFtZSBub3cuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3RfYWxsLnJlbW92ZV90ZXN0X3BhdGhfZGlyZWN0b3J5KCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiMy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYjMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYTBjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYjMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiMy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYjMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYTBjZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYjMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmZlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzhlNjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVmZmVyLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyIiIlVuaXQgdGVzdHMgZm9yIGJ1ZmZlciBvYmplY3RzLgorCitGb3Igbm93LCB0ZXN0cyBqdXN0IG5ldyBvciBjaGFuZ2VkIGZ1bmN0aW9uYWxpdHkuCisKKyIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIEJ1ZmZlclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2V4dGVuZGVkX2dldHNsaWNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZXh0ZW5kZWQgc2xpY2luZyBieSBjb21wYXJpbmcgd2l0aCBsaXN0IHNsaWNpbmcuCisgICAgICAgIHMgPSAiIi5qb2luKGNocihjKSBmb3IgYyBpbiBsaXN0KHJhbmdlKDI1NSwgLTEsIC0xKSkpCisgICAgICAgIGIgPSBidWZmZXIocykKKyAgICAgICAgaW5kaWNlcyA9ICgwLCBOb25lLCAxLCAzLCAxOSwgMzAwLCAtMSwgLTIsIC0zMSwgLTMwMCkKKyAgICAgICAgZm9yIHN0YXJ0IGluIGluZGljZXM6CisgICAgICAgICAgICBmb3Igc3RvcCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgICAgICMgU2tpcCBzdGVwIDAgKGludmFsaWQpCisgICAgICAgICAgICAgICAgZm9yIHN0ZXAgaW4gaW5kaWNlc1sxOl06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYltzdGFydDpzdG9wOnN0ZXBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbc3RhcnQ6c3RvcDpzdGVwXSkKKworICAgIGRlZiB0ZXN0X25ld2J1ZmZlcl9pbnRlcmZhY2Uoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRoZSBidWZmZXIgb2JqZWN0IGhhcyB0aGUgbmV3IGJ1ZmZlciBpbnRlcmZhY2UKKyAgICAgICAgIyBhcyB1c2VkIGJ5IHRoZSBtZW1vcnl2aWV3IG9iamVjdAorICAgICAgICBzID0gIiIuam9pbihjaHIoYykgZm9yIGMgaW4gbGlzdChyYW5nZSgyNTUsIC0xLCAtMSkpKQorICAgICAgICBiID0gYnVmZmVyKHMpCisgICAgICAgIG0gPSBtZW1vcnl2aWV3KGIpICMgU2hvdWxkIG5vdCByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRvYnl0ZXMoKSwgcykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygoImJ1ZmZlci4uIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEJ1ZmZlclRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWZmZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVmZmVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFiOWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVmZmVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWZmZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVmZmVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFiOWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVmZmVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWZpby5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmlvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOGIxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWZpby5weQpAQCAtMCwwICsxLDc5IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0IGFzIHN1cHBvcnQKKworaW1wb3J0IGlvICMgQyBpbXBsZW1lbnRhdGlvbi4KK2ltcG9ydCBfcHlpbyBhcyBweWlvICMgUHl0aG9uIGltcGxlbWVudGF0aW9uLgorCisjIFNpbXBsZSB0ZXN0IHRvIGVuc3VyZSB0aGF0IG9wdGltaXphdGlvbnMgaW4gdGhlIElPIGxpYnJhcnkgZGVsaXZlciB0aGUKKyMgZXhwZWN0ZWQgcmVzdWx0cy4gIEZvciBiZXN0IHRlc3RpbmcsIHJ1biB0aGlzIHVuZGVyIGEgZGVidWctYnVpbGQgUHl0aG9uIHRvbworIyAodG8gZXhlcmNpc2UgYXNzZXJ0cyBpbiB0aGUgQyBjb2RlKS4KKworbGVuZ3RocyA9IGxpc3QocmFuZ2UoMSwgMjU3KSkgKyBbNTEyLCAxMDAwLCAxMDI0LCAyMDQ4LCA0MDk2LCA4MTkyLCAxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2Mzg0LCAzMjc2OCwgNjU1MzYsIDEwMDAwMDBdCisKK2NsYXNzIEJ1ZmZlclNpemVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdHJ5X29uZShzZWxmLCBzKToKKyAgICAgICAgIyBXcml0ZSBzICsgIlxuIiArIHMgdG8gZmlsZSwgdGhlbiBvcGVuIGl0IGFuZCBlbnN1cmUgdGhhdCBzdWNjZXNzaXZlCisgICAgICAgICMgLnJlYWRsaW5lKClzIGRlbGl2ZXIgd2hhdCB3ZSB3cm90ZS4KKworICAgICAgICAjIEVuc3VyZSB3ZSBjYW4gb3BlbiBURVNURk4gZm9yIHdyaXRpbmcuCisgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQorCisgICAgICAgICMgU2luY2UgQyBkb2Vzbid0IGd1YXJhbnRlZSB3ZSBjYW4gd3JpdGUvcmVhZCBhcmJpdHJhcnkgYnl0ZXMgaW4gdGV4dAorICAgICAgICAjIGZpbGVzLCB1c2UgYmluYXJ5IG1vZGUuCisgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgd3JpdGUgb25jZSB3aXRoIFxuIGFuZCBvbmNlIHdpdGhvdXQKKyAgICAgICAgICAgIGYud3JpdGUocykKKyAgICAgICAgICAgIGYud3JpdGUoYiJcbiIpCisgICAgICAgICAgICBmLndyaXRlKHMpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGYgPSBvcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKQorICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBzICsgYiJcbiIpCisgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIHMpCisgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGxpbmUpICMgTXVzdCBiZSBhdCBFT0YKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgZHJpdmVfb25lKHNlbGYsIHBhdHRlcm4pOgorICAgICAgICBmb3IgbGVuZ3RoIGluIGxlbmd0aHM6CisgICAgICAgICAgICAjIFJlcGVhdCBzdHJpbmcgJ3BhdHRlcm4nIGFzIG9mdGVuIGFzIG5lZWRlZCB0byByZWFjaCB0b3RhbCBsZW5ndGgKKyAgICAgICAgICAgICMgJ2xlbmd0aCcuICBUaGVuIGNhbGwgdHJ5X29uZSB3aXRoIHRoYXQgc3RyaW5nLCBhIHN0cmluZyBvbmUgbGFyZ2VyCisgICAgICAgICAgICAjIHRoYW4gdGhhdCwgYW5kIGEgc3RyaW5nIG9uZSBzbWFsbGVyIHRoYW4gdGhhdC4gIFRyeSB0aGlzIHdpdGggYWxsCisgICAgICAgICAgICAjIHNtYWxsIHNpemVzIGFuZCB2YXJpb3VzIHBvd2VycyBvZiAyLCBzbyB3ZSBleGVyY2lzZSBhbGwgbGlrZWx5CisgICAgICAgICAgICAjIHN0ZGlvIGJ1ZmZlciBzaXplcywgYW5kICJvZmYgYnkgb25lIiBlcnJvcnMgb24gYm90aCBzaWRlcy4KKyAgICAgICAgICAgIHEsIHIgPSBkaXZtb2QobGVuZ3RoLCBsZW4ocGF0dGVybikpCisgICAgICAgICAgICB0ZXN0c3RyaW5nID0gcGF0dGVybiAqIHEgKyBwYXR0ZXJuWzpyXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGVzdHN0cmluZyksIGxlbmd0aCkKKyAgICAgICAgICAgIHNlbGYudHJ5X29uZSh0ZXN0c3RyaW5nKQorICAgICAgICAgICAgc2VsZi50cnlfb25lKHRlc3RzdHJpbmcgKyBiIngiKQorICAgICAgICAgICAgc2VsZi50cnlfb25lKHRlc3RzdHJpbmdbOi0xXSkKKworICAgIGRlZiB0ZXN0X3ByaW1lcGF0KHNlbGYpOgorICAgICAgICAjIEEgcGF0dGVybiB3aXRoIHByaW1lIGxlbmd0aCwgdG8gYXZvaWQgc2ltcGxlIHJlbGF0aW9uc2hpcHMgd2l0aAorICAgICAgICAjIHN0ZGlvIGJ1ZmZlciBzaXplcy4KKyAgICAgICAgc2VsZi5kcml2ZV9vbmUoYiIxMjM0NTY3ODkwXDAwXDAxXDAyXDAzXDA0XDA1XDA2IikKKworICAgIGRlZiB0ZXN0X251bGxwYXQoc2VsZik6CisgICAgICAgIHNlbGYuZHJpdmVfb25lKGJ5dGVzKDEwMDApKQorCisKK2NsYXNzIENCdWZmZXJTaXplVGVzdChCdWZmZXJTaXplVGVzdCk6CisgICAgb3BlbiA9IGlvLm9wZW4KKworY2xhc3MgUHlCdWZmZXJTaXplVGVzdChCdWZmZXJTaXplVGVzdCk6CisgICAgb3BlbiA9IHN0YXRpY21ldGhvZChweWlvLm9wZW4pCisKK2NsYXNzIEJ1aWx0aW5CdWZmZXJTaXplVGVzdChCdWZmZXJTaXplVGVzdCk6CisgICAgb3BlbiA9IG9wZW4KKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ0J1ZmZlclNpemVUZXN0LCBQeUJ1ZmZlclNpemVUZXN0LCBCdWlsdGluQnVmZmVyU2l6ZVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmlvLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmlvLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM5NzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVmaW8ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmlvLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmlvLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM5NzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVmaW8ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1aWx0aW4ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWlsdGluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZGU1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWlsdGluLnB5CkBAIC0wLDAgKzEsMTcxMiBAQAorIyBQeXRob24gdGVzdCBzZXQgLS0gYnVpbHQtaW4gZnVuY3Rpb25zCisKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBmY21wLCBoYXZlX3VuaWNvZGUsIFRFU1RGTiwgdW5saW5rLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fdW5pdHRlc3QsIGNoZWNrX3B5M2tfd2FybmluZ3MKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBvcGVyYXRvciBpbXBvcnQgbmVnCisKK2ltcG9ydCBzeXMsIGNTdHJpbmdJTywgcmFuZG9tLCBVc2VyRGljdAorCisjIGNvdW50IHRoZSBudW1iZXIgb2YgdGVzdCBydW5zLgorIyB1c2VkIHRvIHNraXAgcnVubmluZyB0ZXN0X2V4ZWNmaWxlKCkgbXVsdGlwbGUgdGltZXMKKyMgYW5kIHRvIGNyZWF0ZSB1bmlxdWUgc3RyaW5ncyB0byBpbnRlcm4gaW4gdGVzdF9pbnRlcm4oKQorbnVtcnVucyA9IDAKKworY2xhc3MgU3F1YXJlczoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXgpOgorICAgICAgICBzZWxmLm1heCA9IG1heAorICAgICAgICBzZWxmLnNvZmFyID0gW10KKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuc29mYXIpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgIGlmIG5vdCAwIDw9IGkgPCBzZWxmLm1heDogcmFpc2UgSW5kZXhFcnJvcgorICAgICAgICBuID0gbGVuKHNlbGYuc29mYXIpCisgICAgICAgIHdoaWxlIG4gPD0gaToKKyAgICAgICAgICAgIHNlbGYuc29mYXIuYXBwZW5kKG4qbikKKyAgICAgICAgICAgIG4gKz0gMQorICAgICAgICByZXR1cm4gc2VsZi5zb2ZhcltpXQorCitjbGFzcyBTdHJTcXVhcmVzOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1heCk6CisgICAgICAgIHNlbGYubWF4ID0gbWF4CisgICAgICAgIHNlbGYuc29mYXIgPSBbXQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5zb2ZhcikKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgaWYgbm90IDAgPD0gaSA8IHNlbGYubWF4OgorICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorICAgICAgICBuID0gbGVuKHNlbGYuc29mYXIpCisgICAgICAgIHdoaWxlIG4gPD0gaToKKyAgICAgICAgICAgIHNlbGYuc29mYXIuYXBwZW5kKHN0cihuKm4pKQorICAgICAgICAgICAgbiArPSAxCisgICAgICAgIHJldHVybiBzZWxmLnNvZmFyW2ldCisKK2NsYXNzIEJpdEJ1Y2tldDoKKyAgICBkZWYgd3JpdGUoc2VsZiwgbGluZSk6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBUZXN0RmFpbGluZ0Jvb2w6CisgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKworY2xhc3MgVGVzdEZhaWxpbmdJdGVyOgorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisKK2NsYXNzIEJ1aWx0aW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2ltcG9ydChzZWxmKToKKyAgICAgICAgX19pbXBvcnRfXygnc3lzJykKKyAgICAgICAgX19pbXBvcnRfXygndGltZScpCisgICAgICAgIF9faW1wb3J0X18oJ3N0cmluZycpCisgICAgICAgIF9faW1wb3J0X18obmFtZT0nc3lzJykKKyAgICAgICAgX19pbXBvcnRfXyhuYW1lPSd0aW1lJywgbGV2ZWw9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IsIF9faW1wb3J0X18sICdzcGFtc3BhbScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgX19pbXBvcnRfXywgMSwgMiwgMywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgX19pbXBvcnRfXywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgX19pbXBvcnRfXywgJ3N5cycsIG5hbWU9J3N5cycpCisKKyAgICBkZWYgdGVzdF9hYnMoc2VsZik6CisgICAgICAgICMgaW50CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzKDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicygxMjM0KSwgMTIzNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoLTEyMzQpLCAxMjM0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWJzKC1zeXMubWF4aW50LTEpID4gMCkKKyAgICAgICAgIyBmbG9hdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicygwLjApLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzKDMuMTQpLCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicygtMy4xNCksIDMuMTQpCisgICAgICAgICMgbG9uZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicygwTCksIDBMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicygxMjM0TCksIDEyMzRMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicygtMTIzNEwpLCAxMjM0TCkKKyAgICAgICAgIyBzdHIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhYnMsICdhJykKKyAgICAgICAgIyBib29sCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzKFRydWUpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhGYWxzZSksIDApCisgICAgICAgICMgb3RoZXIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhYnMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYWJzLCBOb25lKQorICAgICAgICBjbGFzcyBBYnNDbGFzcyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fYWJzX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIC01CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzKEFic0NsYXNzKCkpLCAtNSkKKworICAgIGRlZiB0ZXN0X2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGwoWzIsIDQsIDZdKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGwoWzIsIE5vbmUsIDZdKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgYWxsLCBbMiwgVGVzdEZhaWxpbmdCb29sKCksIDZdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGFsbCwgVGVzdEZhaWxpbmdJdGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYWxsLCAxMCkgICAgICAgICAgICAgICAjIE5vbi1pdGVyYWJsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFsbCkgICAgICAgICAgICAgICAgICAgIyBObyBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYWxsLCBbMiwgNCwgNl0sIFtdKSAgICAjIFRvbyBtYW55IGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGwoW10pLCBUcnVlKSAgICAgICAgICAgICAgICAgICAgICMgRW1wdHkgaXRlcmF0b3IKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGwoWzAsIFRlc3RGYWlsaW5nQm9vbCgpXSksIEZhbHNlKSMgU2hvcnQtY2lyY3VpdAorICAgICAgICBTID0gWzUwLCA2MF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGwoeCA+IDQyIGZvciB4IGluIFMpLCBUcnVlKQorICAgICAgICBTID0gWzUwLCA0MCwgNjBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsKHggPiA0MiBmb3IgeCBpbiBTKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9hbnkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW55KFtOb25lLCBOb25lLCBOb25lXSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFueShbTm9uZSwgNCwgTm9uZV0pLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGFueSwgW05vbmUsIFRlc3RGYWlsaW5nQm9vbCgpLCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBhbnksIFRlc3RGYWlsaW5nSXRlcigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFueSwgMTApICAgICAgICAgICAgICAgIyBOb24taXRlcmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhbnkpICAgICAgICAgICAgICAgICAgICMgTm8gYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFueSwgWzIsIDQsIDZdLCBbXSkgICAgIyBUb28gbWFueSBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW55KFtdKSwgRmFsc2UpICAgICAgICAgICAgICAgICAgICAjIEVtcHR5IGl0ZXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW55KFsxLCBUZXN0RmFpbGluZ0Jvb2woKV0pLCBUcnVlKSAjIFNob3J0LWNpcmN1aXQKKyAgICAgICAgUyA9IFs0MCwgNjAsIDMwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFueSh4ID4gNDIgZm9yIHggaW4gUyksIFRydWUpCisgICAgICAgIFMgPSBbMTAsIDIwLCAzMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbnkoeCA+IDQyIGZvciB4IGluIFMpLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X25lZyhzZWxmKToKKyAgICAgICAgeCA9IC1zeXMubWF4aW50LTEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgteCwgc3lzLm1heGludCsxKQorCisgICAgZGVmIHRlc3RfYXBwbHkoc2VsZik6CisgICAgICAgIGRlZiBmMCgqYXJncyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsICgpKQorICAgICAgICBkZWYgZjEoYTEpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMSwgMSkKKyAgICAgICAgZGVmIGYyKGExLCBhMik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGExLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMiwgMikKKyAgICAgICAgZGVmIGYzKGExLCBhMiwgYTMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYTIsIDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEzLCAzKQorICAgICAgICBhcHBseShmMCwgKCkpCisgICAgICAgIGFwcGx5KGYxLCAoMSwpKQorICAgICAgICBhcHBseShmMiwgKDEsIDIpKQorICAgICAgICBhcHBseShmMywgKDEsIDIsIDMpKQorCisgICAgICAgICMgQSBQeUNGdW5jdGlvbiB0aGF0IHRha2VzIG9ubHkgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHNob3VsZCBhbGxvdyBhbgorICAgICAgICAjIGVtcHR5IGtleXdvcmQgZGljdGlvbmFyeSB0byBwYXNzIHdpdGhvdXQgYSBjb21wbGFpbnQsIGJ1dCByYWlzZSBhCisgICAgICAgICMgVHlwZUVycm9yIGlmIHRoZSBkaWN0aW9uYXJ5IGlzIG5vbi1lbXB0eS4KKyAgICAgICAgYXBwbHkoaWQsICgxLCksIHt9KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFwcGx5LCBpZCwgKDEsKSwgeyJmb28iOiAxfSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhcHBseSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhcHBseSwgaWQsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFwcGx5LCBpZCwgKDQyLCksIDQyKQorCisgICAgZGVmIHRlc3RfY2FsbGFibGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZShsZW4pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNhbGxhYmxlKCJhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZShjYWxsYWJsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZShsYW1iZGEgeCwgeTogeCArIHkpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNhbGxhYmxlKF9fYnVpbHRpbnNfXykpCisgICAgICAgIGRlZiBmKCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKGYpKQorCisgICAgICAgIGNsYXNzIENsYXNzaWM6CisgICAgICAgICAgICBkZWYgbWV0aChzZWxmKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydFRydWUoY2FsbGFibGUoQ2xhc3NpYykpCisgICAgICAgIGMgPSBDbGFzc2ljKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKGMubWV0aCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2FsbGFibGUoYykpCisKKyAgICAgICAgY2xhc3MgTmV3U3R5bGUob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBtZXRoKHNlbGYpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZShOZXdTdHlsZSkpCisgICAgICAgIG4gPSBOZXdTdHlsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZShuLm1ldGgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNhbGxhYmxlKG4pKQorCisgICAgICAgICMgQ2xhc3NpYyBhbmQgbmV3LXN0eWxlIGNsYXNzZXMgZXZhbHVhdGUgX19jYWxsX18oKSBkaWZmZXJlbnRseQorICAgICAgICBjLl9fY2FsbF9fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2FsbGFibGUoYykpCisgICAgICAgIGRlbCBjLl9fY2FsbF9fCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2FsbGFibGUoYykpCisgICAgICAgIG4uX19jYWxsX18gPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2FsbGFibGUobikpCisgICAgICAgIGRlbCBuLl9fY2FsbF9fCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2FsbGFibGUobikpCisKKyAgICAgICAgY2xhc3MgTjIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmKTogcGFzcworICAgICAgICBuMiA9IE4yKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKG4yKSkKKyAgICAgICAgY2xhc3MgTjMoTjIpOiBwYXNzCisgICAgICAgIG4zID0gTjMoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2FsbGFibGUobjMpKQorCisgICAgZGVmIHRlc3RfY2hyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNocigzMiksICcgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaHIoNjUpLCAnQScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2hyKDk3KSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNocigweGZmKSwgJ1x4ZmYnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjaHIsIDI1NikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjaHIpCisKKyAgICBkZWYgdGVzdF9jbXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKC0xLCAxKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKDEsIC0xKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoMSwgMSksIDApCisgICAgICAgICMgdmVyaWZ5IHRoYXQgY2lyY3VsYXIgb2JqZWN0cyBhcmUgbm90IGhhbmRsZWQKKyAgICAgICAgYSA9IFtdOyBhLmFwcGVuZChhKQorICAgICAgICBiID0gW107IGIuYXBwZW5kKGIpCisgICAgICAgIGZyb20gVXNlckxpc3QgaW1wb3J0IFVzZXJMaXN0CisgICAgICAgIGMgPSBVc2VyTGlzdCgpOyBjLmFwcGVuZChjKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGNtcCwgYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjbXAsIGIsIGMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY21wLCBjLCBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGNtcCwgYSwgYykKKyAgICAgICAjIG9rYXksIG5vdyBicmVhayB0aGUgY3ljbGVzCisgICAgICAgIGEucG9wKCk7IGIucG9wKCk7IGMucG9wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXApCisKKyAgICBkZWYgdGVzdF9jb2VyY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZmNtcChjb2VyY2UoMSwgMS4xKSwgKDEuMCwgMS4xKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29lcmNlKDEsIDFMKSwgKDFMLCAxTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZmNtcChjb2VyY2UoMUwsIDEuMSksICgxLjAsIDEuMSkpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZXJjZSkKKyAgICAgICAgY2xhc3MgQmFkTnVtYmVyOgorICAgICAgICAgICAgZGVmIF9fY29lcmNlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29lcmNlLCA0MiwgQmFkTnVtYmVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGNvZXJjZSwgMC41LCBpbnQoIjEyMzQ1IiAqIDEwMDApKQorCisgICAgZGVmIHRlc3RfY29tcGlsZShzZWxmKToKKyAgICAgICAgY29tcGlsZSgncHJpbnQgMVxuJywgJycsICdleGVjJykKKyAgICAgICAgYm9tID0gJ1x4ZWZceGJiXHhiZicKKyAgICAgICAgY29tcGlsZShib20gKyAncHJpbnQgMVxuJywgJycsICdleGVjJykKKyAgICAgICAgY29tcGlsZShzb3VyY2U9J3Bhc3MnLCBmaWxlbmFtZT0nPycsIG1vZGU9J2V4ZWMnKQorICAgICAgICBjb21waWxlKGRvbnRfaW5oZXJpdD0wLCBmaWxlbmFtZT0ndG1wJywgc291cmNlPScwJywgbW9kZT0nZXZhbCcpCisgICAgICAgIGNvbXBpbGUoJ3Bhc3MnLCAnPycsIGRvbnRfaW5oZXJpdD0xLCBtb2RlPSdleGVjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21waWxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21waWxlLCAncHJpbnQgNDJcbicsICc8c3RyaW5nPicsICdiYWRtb2RlJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGlsZSwgJ3ByaW50IDQyXG4nLCAnPHN0cmluZz4nLCAnc2luZ2xlJywgMHhmZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21waWxlLCBjaHIoMCksICdmJywgJ2V4ZWMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBpbGUsICdwYXNzJywgJz8nLCAnZXhlYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9J2V2YWwnLCBzb3VyY2U9JzAnLCBmaWxlbmFtZT0ndG1wJykKKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgY29tcGlsZSh1bmljb2RlKCdwcmludCB1Ilx4YzNceGE1IlxuJywgJ3V0ZjgnKSwgJycsICdleGVjJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGlsZSwgdW5pY2hyKDApLCAnZicsICdleGVjJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBpbGUsIHVuaWNvZGUoJ2EgPSAxJyksICdmJywgJ2JhZCcpCisKKworICAgIGRlZiB0ZXN0X2RlbGF0dHIoc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgc3lzLnNwYW0gPSAxCisgICAgICAgIGRlbGF0dHIoc3lzLCAnc3BhbScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGVsYXR0cikKKworICAgIGRlZiB0ZXN0X2RpcihzZWxmKToKKyAgICAgICAgIyBkaXIod3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkaXIsIDQyLCA0MikKKworICAgICAgICAjIGRpcigpIC0gbG9jYWwgc2NvcGUKKyAgICAgICAgbG9jYWxfdmFyID0gMQorICAgICAgICBzZWxmLmFzc2VydEluKCdsb2NhbF92YXInLCBkaXIoKSkKKworICAgICAgICAjIGRpcihtb2R1bGUpCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgc2VsZi5hc3NlcnRJbignZXhpdCcsIGRpcihzeXMpKQorCisgICAgICAgICMgZGlyKG1vZHVsZV93aXRoX2ludmFsaWRfX2RpY3RfXykKKyAgICAgICAgaW1wb3J0IHR5cGVzCisgICAgICAgIGNsYXNzIEZvbyh0eXBlcy5Nb2R1bGVUeXBlKToKKyAgICAgICAgICAgIF9fZGljdF9fID0gOAorICAgICAgICBmID0gRm9vKCJmb28iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRpciwgZikKKworICAgICAgICAjIGRpcih0eXBlKQorICAgICAgICBzZWxmLmFzc2VydEluKCJzdHJpcCIsIGRpcihzdHIpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJfX21yb19fIiwgZGlyKHN0cikpCisKKyAgICAgICAgIyBkaXIob2JqKQorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSA3CisgICAgICAgICAgICAgICAgc2VsZi55ID0gOAorICAgICAgICAgICAgICAgIHNlbGYueiA9IDkKKyAgICAgICAgZiA9IEZvbygpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oInkiLCBkaXIoZikpCisKKyAgICAgICAgIyBkaXIob2JqX25vX19kaWN0X18pCisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gW10KKyAgICAgICAgZiA9IEZvbygpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIl9fcmVwcl9fIiwgZGlyKGYpKQorCisgICAgICAgICMgZGlyKG9ial9ub19fY2xhc3NfX3dpdGhfX2RpY3RfXykKKyAgICAgICAgIyAoYW4gdWdseSB0cmljayB0byBjYXVzZSBnZXRhdHRyKGYsICJfX2NsYXNzX18iKSB0byBmYWlsKQorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiX19jbGFzc19fIiwgIl9fZGljdF9fIl0KKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmJhciA9ICJ3b3ciCisgICAgICAgIGYgPSBGb28oKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJfX3JlcHJfXyIsIGRpcihmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiYmFyIiwgZGlyKGYpKQorCisgICAgICAgICMgZGlyKG9ial91c2luZyBfX2Rpcl9fKQorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBbImthbiIsICJnYSIsICJyb28iXQorICAgICAgICBmID0gRm9vKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpcihmKSA9PSBbImdhIiwgImthbiIsICJyb28iXSkKKworICAgICAgICAjIGRpcihvYmpfX2Rpcl9fbm90X2xpc3QpCisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZGlyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDcKKyAgICAgICAgZiA9IEZvbygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGlyLCBmKQorCisgICAgZGVmIHRlc3RfZGl2bW9kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpdm1vZCgxMiwgNyksICgxLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXZtb2QoLTEyLCA3KSwgKC0yLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXZtb2QoMTIsIC03KSwgKC0yLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKC0xMiwgLTcpLCAoMSwgLTUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKDEyTCwgN0wpLCAoMUwsIDVMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXZtb2QoLTEyTCwgN0wpLCAoLTJMLCAyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKDEyTCwgLTdMKSwgKC0yTCwgLTJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXZtb2QoLTEyTCwgLTdMKSwgKDFMLCAtNUwpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKDEyLCA3TCksICgxLCA1TCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKC0xMiwgN0wpLCAoLTIsIDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXZtb2QoMTJMLCAtNyksICgtMkwsIC0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXZtb2QoLTEyTCwgLTcpLCAoMUwsIC01KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpdm1vZCgtc3lzLm1heGludC0xLCAtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHN5cy5tYXhpbnQrMSwgMCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmY21wKGRpdm1vZCgzLjI1LCAxLjApLCAoMy4wLCAwLjI1KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZmNtcChkaXZtb2QoLTMuMjUsIDEuMCksICgtNC4wLCAwLjc1KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZmNtcChkaXZtb2QoMy4yNSwgLTEuMCksICgtNC4wLCAtMC43NSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZjbXAoZGl2bW9kKC0zLjI1LCAtMS4wKSwgKDMuMCwgLTAuMjUpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRpdm1vZCkKKworICAgIGRlZiB0ZXN0X2V2YWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnMSsxJyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnIDErMVxuJyksIDIpCisgICAgICAgIGdsb2JhbHMgPSB7J2EnOiAxLCAnYic6IDJ9CisgICAgICAgIGxvY2FscyA9IHsnYic6IDIwMCwgJ2MnOiAzMDB9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnYScsIGdsb2JhbHMpICwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdhJywgZ2xvYmFscywgbG9jYWxzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdiJywgZ2xvYmFscywgbG9jYWxzKSwgMjAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ2MnLCBnbG9iYWxzLCBsb2NhbHMpLCAzMDApCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCh1bmljb2RlKCcxKzEnKSksIDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwodW5pY29kZSgnIDErMVxuJykpLCAyKQorICAgICAgICBnbG9iYWxzID0geydhJzogMSwgJ2InOiAyfQorICAgICAgICBsb2NhbHMgPSB7J2InOiAyMDAsICdjJzogMzAwfQorICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwodW5pY29kZSgnYScpLCBnbG9iYWxzKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCh1bmljb2RlKCdhJyksIGdsb2JhbHMsIGxvY2FscyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwodW5pY29kZSgnYicpLCBnbG9iYWxzLCBsb2NhbHMpLCAyMDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwodW5pY29kZSgnYycpLCBnbG9iYWxzLCBsb2NhbHMpLCAzMDApCisgICAgICAgICAgICBib20gPSAnXHhlZlx4YmJceGJmJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGJvbSArICdhJywgZ2xvYmFscywgbG9jYWxzKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCh1bmljb2RlKCd1Ilx4YzNceGE1IicsICd1dGY4JyksIGdsb2JhbHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlKCdceGMzXHhhNScsICd1dGY4JykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCAoKSkKKworICAgIGRlZiB0ZXN0X2dlbmVyYWxfZXZhbChzZWxmKToKKyAgICAgICAgIyBUZXN0cyB0aGF0IGdlbmVyYWwgbWFwcGluZ3MgY2FuIGJlIHVzZWQgZm9yIHRoZSBsb2NhbHMgYXJndW1lbnQKKworICAgICAgICBjbGFzcyBNOgorICAgICAgICAgICAgIlRlc3QgbWFwcGluZyBpbnRlcmZhY2UgdmVyc3VzIHBvc3NpYmxlIGNhbGxzIGZyb20gZXZhbCgpLiIKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnYSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yCisgICAgICAgICAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdCgneHl6JykKKworICAgICAgICBtID0gTSgpCisgICAgICAgIGcgPSBnbG9iYWxzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdhJywgZywgbSksIDEyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOYW1lRXJyb3IsIGV2YWwsICdiJywgZywgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdkaXIoKScsIGcsIG0pLCBsaXN0KCd4eXonKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdnbG9iYWxzKCknLCBnLCBtKSwgZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdsb2NhbHMoKScsIGcsIG0pLCBtKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICdhJywgbSkKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICJOb24tbWFwcGluZyIKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbSA9IEEoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICdhJywgZywgbSkKKworICAgICAgICAjIFZlcmlmeSB0aGF0IGRpY3Qgc3ViY2xhc3NlcyB3b3JrIGFzIHdlbGwKKyAgICAgICAgY2xhc3MgRChkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnYSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMgorICAgICAgICAgICAgICAgIHJldHVybiBkaWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKKyAgICAgICAgICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBsaXN0KCd4eXonKQorCisgICAgICAgIGQgPSBEKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdhJywgZywgZCksIDEyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOYW1lRXJyb3IsIGV2YWwsICdiJywgZywgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdkaXIoKScsIGcsIGQpLCBsaXN0KCd4eXonKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdnbG9iYWxzKCknLCBnLCBkKSwgZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdsb2NhbHMoKScsIGcsIGQpLCBkKQorCisgICAgICAgICMgVmVyaWZ5IGxvY2FscyBzdG9yZXMgKHVzZWQgYnkgbGlzdCBjb21wcykKKyAgICAgICAgZXZhbCgnW2xvY2FscygpIGZvciBpIGluICgyLDMpXScsIGcsIGQpCisgICAgICAgIGV2YWwoJ1tsb2NhbHMoKSBmb3IgaSBpbiAoMiwzKV0nLCBnLCBVc2VyRGljdC5Vc2VyRGljdCgpKQorCisgICAgICAgIGNsYXNzIFNwcmVhZFNoZWV0OgorICAgICAgICAgICAgIlNhbXBsZSBhcHBsaWNhdGlvbiBzaG93aW5nIG5lc3RlZCwgY2FsY3VsYXRlZCBsb29rdXBzLiIKKyAgICAgICAgICAgIF9jZWxscyA9IHt9CisgICAgICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBmb3JtdWxhKToKKyAgICAgICAgICAgICAgICBzZWxmLl9jZWxsc1trZXldID0gZm9ybXVsYQorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGV2YWwoc2VsZi5fY2VsbHNba2V5XSwgZ2xvYmFscygpLCBzZWxmKQorCisgICAgICAgIHNzID0gU3ByZWFkU2hlZXQoKQorICAgICAgICBzc1snYTEnXSA9ICc1JworICAgICAgICBzc1snYTInXSA9ICdhMSo2JworICAgICAgICBzc1snYTMnXSA9ICdhMio3JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNzWydhMyddLCAyMTApCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBkaXIoKSBjYXRjaGVzIGEgbm9uLWxpc3QgcmV0dXJuZWQgYnkgZXZhbAorICAgICAgICAjIFNGIGJ1ZyAjMTAwNDY2OQorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGl0ZW0pOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKGl0ZW0pCisgICAgICAgICAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2EnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCwgJ2RpcigpJywgZ2xvYmFscygpLCBDKCkpCisKKyAgICAjIERvbmUgb3V0c2lkZSBvZiB0aGUgbWV0aG9kIHRlc3RfeiB0byBnZXQgdGhlIGNvcnJlY3Qgc2NvcGUKKyAgICB6ID0gMAorICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3cnKQorICAgIGYud3JpdGUoJ3ogPSB6KzFcbicpCisgICAgZi53cml0ZSgneiA9IHoqMlxuJykKKyAgICBmLmNsb3NlKCkKKyAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKCJleGVjZmlsZS4uIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICBleGVjZmlsZShURVNURk4pCisKKyAgICBkZWYgdGVzdF9leGVjZmlsZShzZWxmKToKKyAgICAgICAgZ2xvYmFsIG51bXJ1bnMKKyAgICAgICAgaWYgbnVtcnVuczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBudW1ydW5zICs9IDEKKworICAgICAgICBnbG9iYWxzID0geydhJzogMSwgJ2InOiAyfQorICAgICAgICBsb2NhbHMgPSB7J2InOiAyMDAsICdjJzogMzAwfQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fX2NsYXNzX18ueiwgMikKKyAgICAgICAgZ2xvYmFsc1sneiddID0gMAorICAgICAgICBleGVjZmlsZShURVNURk4sIGdsb2JhbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2xvYmFsc1sneiddLCAyKQorICAgICAgICBsb2NhbHNbJ3onXSA9IDAKKyAgICAgICAgZXhlY2ZpbGUoVEVTVEZOLCBnbG9iYWxzLCBsb2NhbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWxzWyd6J10sIDIpCisKKyAgICAgICAgY2xhc3MgTToKKyAgICAgICAgICAgICJUZXN0IG1hcHBpbmcgaW50ZXJmYWNlIHZlcnN1cyBwb3NzaWJsZSBjYWxscyBmcm9tIGV4ZWNmaWxlKCkuIgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYueiA9IDEwCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ3onOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi56CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IKKyAgICAgICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ3onOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnogPSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcgorCisgICAgICAgIGxvY2FscyA9IE0oKQorICAgICAgICBsb2NhbHNbJ3onXSA9IDAKKyAgICAgICAgZXhlY2ZpbGUoVEVTVEZOLCBnbG9iYWxzLCBsb2NhbHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWxzWyd6J10sIDIpCisKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBleGVjZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBleGVjZmlsZSwgVEVTVEZOLCB7fSwgKCkpCisgICAgICAgIGltcG9ydCBvcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBleGVjZmlsZSwgb3MuY3VyZGlyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBleGVjZmlsZSwgIklfZG9udF9leGlzdCIpCisKKyAgICBkZWYgdGVzdF9maWx0ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKGxhbWJkYSBjOiAnYScgPD0gYyA8PSAneicsICdIZWxsbyBXb3JsZCcpLCAnZWxsb29ybGQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihOb25lLCBbMSwgJ2hlbGxvJywgW10sIFszXSwgJycsIE5vbmUsIDksIDBdKSwgWzEsICdoZWxsbycsIFszXSwgOV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKGxhbWJkYSB4OiB4ID4gMCwgWzEsIC0zLCA5LCAwLCAyXSksIFsxLCA5LCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIoTm9uZSwgU3F1YXJlcygxMCkpLCBbMSwgNCwgOSwgMTYsIDI1LCAzNiwgNDksIDY0LCA4MV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKGxhbWJkYSB4OiB4JTIsIFNxdWFyZXMoMTApKSwgWzEsIDksIDI1LCA0OSwgODFdKQorICAgICAgICBkZWYgaWRlbnRpdHkoaXRlbSk6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBmaWx0ZXIoaWRlbnRpdHksIFNxdWFyZXMoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmlsdGVyKQorICAgICAgICBjbGFzcyBCYWRTZXEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgaWYgaW5kZXg8NDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmaWx0ZXIsIGxhbWJkYSB4OiB4LCBCYWRTZXEoKSkKKyAgICAgICAgZGVmIGJhZGZ1bmMoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmaWx0ZXIsIGJhZGZ1bmMsIHJhbmdlKDUpKQorCisgICAgICAgICMgdGVzdCBibHRpbm1vZHVsZS5jOjpmaWx0ZXJ0dXBsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKE5vbmUsICgxLCAyKSksICgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIobGFtYmRhIHg6IHg+PTMsICgxLCAyLCAzLCA0KSksICgzLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmaWx0ZXIsIDQyLCAoMSwgMikpCisKKyAgICAgICAgIyB0ZXN0IGJsdGlubW9kdWxlLmM6OmZpbHRlcnN0cmluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKE5vbmUsICIxMiIpLCAiMTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihsYW1iZGEgeDogeD49IjMiLCAiMTIzNCIpLCAiMzQiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZpbHRlciwgNDIsICIxMiIpCisgICAgICAgIGNsYXNzIGJhZHN0cihzdHIpOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZpbHRlciwgbGFtYmRhIHg6IHggPj0iMyIsIGJhZHN0cigiMTIzNCIpKQorCisgICAgICAgIGNsYXNzIGJhZHN0cjIoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmlsdGVyLCBsYW1iZGEgeDogeCA+PTQyLCBiYWRzdHIyKCIxMjM0IikpCisKKyAgICAgICAgY2xhc3Mgd2VpcmRzdHIoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHdlaXJkc3RyKDIqc3RyLl9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIobGFtYmRhIHg6IHg+PSIzMyIsIHdlaXJkc3RyKCIxMjM0IikpLCAiMzM0NCIpCisKKyAgICAgICAgY2xhc3Mgc2hpZnRzdHIoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNocihvcmQoc3RyLl9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KSkrMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIobGFtYmRhIHg6IHg+PSIzIiwgc2hpZnRzdHIoIjEyMzQiKSksICIzNDUiKQorCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgICMgdGVzdCBibHRpbm1vZHVsZS5jOjpmaWx0ZXJ1bmljb2RlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKE5vbmUsIHVuaWNvZGUoIjEyIikpLCB1bmljb2RlKCIxMiIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIobGFtYmRhIHg6IHg+PSIzIiwgdW5pY29kZSgiMTIzNCIpKSwgdW5pY29kZSgiMzQiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmlsdGVyLCA0MiwgdW5pY29kZSgiMTIiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZpbHRlciwgbGFtYmRhIHg6IHggPj0iMyIsIGJhZHN0cih1bmljb2RlKCIxMjM0IikpKQorCisgICAgICAgICAgICBjbGFzcyBiYWR1bmljb2RlKHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmaWx0ZXIsIGxhbWJkYSB4OiB4ID49NDIsIGJhZHVuaWNvZGUoIjEyMzQiKSkKKworICAgICAgICAgICAgY2xhc3Mgd2VpcmR1bmljb2RlKHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZWlyZHVuaWNvZGUoMip1bmljb2RlLl9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgZmlsdGVyKGxhbWJkYSB4OiB4Pj11bmljb2RlKCIzMyIpLCB3ZWlyZHVuaWNvZGUoIjEyMzQiKSksIHVuaWNvZGUoIjMzNDQiKSkKKworICAgICAgICAgICAgY2xhc3Mgc2hpZnR1bmljb2RlKHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmljaHIob3JkKHVuaWNvZGUuX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpKSsxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICBmaWx0ZXIobGFtYmRhIHg6IHg+PXVuaWNvZGUoIjMiKSwgc2hpZnR1bmljb2RlKCIxMjM0IikpLAorICAgICAgICAgICAgICAgIHVuaWNvZGUoIjM0NSIpCisgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9maWx0ZXJfc3ViY2xhc3NlcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHRoYXQgZmlsdGVyKCkgbmV2ZXIgcmV0dXJucyB0dXBsZSwgc3RyIG9yIHVuaWNvZGUgc3ViY2xhc3NlcworICAgICAgICAjIGFuZCB0aGF0IHRoZSByZXN1bHQgYWx3YXlzIGdvZXMgdGhyb3VnaCBfX2dldGl0ZW1fXworICAgICAgICBmdW5jcyA9IChOb25lLCBib29sLCBsYW1iZGEgeDogVHJ1ZSkKKyAgICAgICAgY2xhc3MgdHVwbGUyKHR1cGxlKToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDIqdHVwbGUuX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpCisgICAgICAgIGNsYXNzIHN0cjIoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDIqc3RyLl9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KQorICAgICAgICBpbnB1dHMgPSB7CisgICAgICAgICAgICB0dXBsZTI6IHsoKTogKCksICgxLCAyLCAzKTogKDIsIDQsIDYpfSwKKyAgICAgICAgICAgIHN0cjI6ICAgeyIiOiAiIiwgIjEyMyI6ICIxMTIyMzMifQorICAgICAgICB9CisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIGNsYXNzIHVuaWNvZGUyKHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAyKnVuaWNvZGUuX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpCisgICAgICAgICAgICBpbnB1dHNbdW5pY29kZTJdID0geworICAgICAgICAgICAgICAgIHVuaWNvZGUoKTogdW5pY29kZSgpLAorICAgICAgICAgICAgICAgIHVuaWNvZGUoIjEyMyIpOiB1bmljb2RlKCIxMTIyMzMiKQorICAgICAgICAgICAgfQorCisgICAgICAgIGZvciAoY2xzLCBpbnBzKSBpbiBpbnB1dHMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBmb3IgKGlucCwgZXhwKSBpbiBpbnBzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgICMgbWFrZSBzdXJlIHRoZSBvdXRwdXQgZ29lcyB0aHJvdWdoIF9fZ2V0aXRlbV9fCisgICAgICAgICAgICAgICAgIyBldmVuIGlmIGZ1bmMgaXMgTm9uZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIGZpbHRlcihmdW5jc1swXSwgY2xzKGlucCkpLAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZnVuY3NbMV0sIGNscyhpbnApKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBmb3IgZnVuYyBpbiBmdW5jczoKKyAgICAgICAgICAgICAgICAgICAgb3V0cCA9IGZpbHRlcihmdW5jLCBjbHMoaW5wKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwLCBleHApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZShvdXRwLCBjbHMpKQorCisgICAgZGVmIHRlc3RfZ2V0YXR0cihzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2V0YXR0cihzeXMsICdzdGRvdXQnKSBpcyBzeXMuc3Rkb3V0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGF0dHIsIHN5cywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhdHRyLCBzeXMsIDEsICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGF0dHIpCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgZ2V0YXR0ciwgc3lzLCB1bmljaHIoc3lzLm1heHVuaWNvZGUpKQorCisgICAgZGVmIHRlc3RfaGFzYXR0cihzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzeXMsICdzdGRvdXQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNhdHRyLCBzeXMsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzYXR0cikKKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBoYXNhdHRyLCBzeXMsIHVuaWNocihzeXMubWF4dW5pY29kZSkpCisKKyAgICAgICAgIyBDaGVjayB0aGF0IGhhc2F0dHIgYWxsb3dzIFN5c3RlbUV4aXQgYW5kIEtleWJvYXJkSW50ZXJydXB0cyBieQorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIHdoYXQpOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleWJvYXJkSW50ZXJydXB0LCBoYXNhdHRyLCBBKCksICJiIikKKyAgICAgICAgY2xhc3MgQjoKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCB3aGF0KToKKyAgICAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQsIGhhc2F0dHIsIEIoKSwgImIiKQorCisgICAgZGVmIHRlc3RfaGFzaChzZWxmKToKKyAgICAgICAgaGFzaChOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goMSksIGhhc2goMUwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goMSksIGhhc2goMS4wKSkKKyAgICAgICAgaGFzaCgnc3BhbScpCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCgnc3BhbScpLCBoYXNoKHVuaWNvZGUoJ3NwYW0nKSkpCisgICAgICAgIGhhc2goKDAsMSwyLDMpKQorICAgICAgICBkZWYgZigpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwge30pCisgICAgICAgICMgQnVnIDE1MzYwMjE6IEFsbG93IGhhc2ggdG8gcmV0dXJuIGxvbmcgb2JqZWN0cworICAgICAgICBjbGFzcyBYOgorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyKioxMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGhhc2goWCgpKSksIGludCkKKyAgICAgICAgY2xhc3MgWShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyKioxMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGhhc2goWSgpKSksIGludCkKKyAgICAgICAgY2xhc3MgWihsb25nKToKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goWig0MikpLCBoYXNoKDQyTCkpCisKKyAgICBkZWYgdGVzdF9oZXgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4KDE2KSwgJzB4MTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleCgxNkwpLCAnMHgxMEwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleCgtMTYpLCAnLTB4MTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleCgtMTZMKSwgJy0weDEwTCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGV4LCB7fSkKKworICAgIGRlZiB0ZXN0X2lkKHNlbGYpOgorICAgICAgICBpZChOb25lKQorICAgICAgICBpZCgxKQorICAgICAgICBpZCgxTCkKKyAgICAgICAgaWQoMS4wKQorICAgICAgICBpZCgnc3BhbScpCisgICAgICAgIGlkKCgwLDEsMiwzKSkKKyAgICAgICAgaWQoWzAsMSwyLDNdKQorICAgICAgICBpZCh7J3NwYW0nOiAxLCAnZWdncyc6IDIsICdoYW0nOiAzfSkKKworICAgICMgVGVzdCBpbnB1dCgpIGxhdGVyLCB0b2dldGhlciB3aXRoIHJhd19pbnB1dAorCisgICAgIyB0ZXN0X2ludCgpOiBzZWUgdGVzdF9pbnQucHkgZm9yIGludCgpIHRlc3RzLgorCisgICAgZGVmIHRlc3RfaW50ZXJuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGludGVybikKKyAgICAgICAgIyBUaGlzIGZhaWxzIGlmIHRoZSB0ZXN0IGlzIHJ1biB0d2ljZSB3aXRoIGEgY29uc3RhbnQgc3RyaW5nLAorICAgICAgICAjIHRoZXJlZm9yZSBhcHBlbmQgdGhlIHJ1biBjb3VudGVyCisgICAgICAgIHMgPSAibmV2ZXIgaW50ZXJuZWQgYmVmb3JlICIgKyBzdHIobnVtcnVucykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludGVybihzKSBpcyBzKQorICAgICAgICBzMiA9IHMuc3dhcGNhc2UoKS5zd2FwY2FzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnRlcm4oczIpIGlzIHMpCisKKyAgICAgICAgIyBTdWJjbGFzc2VzIG9mIHN0cmluZyBjYW4ndCBiZSBpbnRlcm5lZCwgYmVjYXVzZSB0aGV5CisgICAgICAgICMgcHJvdmlkZSB0b28gbXVjaCBvcHBvcnR1bml0eSBmb3IgaW5zYW5lIHRoaW5ncyB0byBoYXBwZW4uCisgICAgICAgICMgV2UgZG9uJ3Qgd2FudCB0aGVtIGluIHRoZSBpbnRlcm5lZCBkaWN0IGFuZCBpZiB0aGV5IGFyZW4ndAorICAgICAgICAjIGFjdHVhbGx5IGludGVybmVkLCB3ZSBkb24ndCB3YW50IHRvIGNyZWF0ZSB0aGUgYXBwZWFyYW5jZQorICAgICAgICAjIHRoYXQgdGhleSBhcmUgYnkgYWxsb3dpbmcgaW50ZXJuKCkgdG8gc3VjY2VlZC4KKyAgICAgICAgY2xhc3MgUyhzdHIpOgorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAxMjMKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGludGVybiwgUygiYWJjIikpCisKKyAgICAgICAgIyBJdCdzIHN0aWxsIHNhZmUgdG8gcGFzcyB0aGVzZSBzdHJpbmdzIHRvIHJvdXRpbmVzIHRoYXQKKyAgICAgICAgIyBjYWxsIGludGVybiBpbnRlcm5hbGx5LCBlLmcuIFB5T2JqZWN0X1NldEF0dHIoKS4KKyAgICAgICAgcyA9IFMoImFiYyIpCisgICAgICAgIHNldGF0dHIocywgcywgcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKHMsIHMpLCBzKQorCisgICAgZGVmIHRlc3RfaXRlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpdGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGl0ZXIsIDQyLCA0MikKKyAgICAgICAgbGlzdHMgPSBbKCIxIiwgIjIiKSwgWyIxIiwgIjIiXSwgIjEyIl0KKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgbGlzdHMuYXBwZW5kKHVuaWNvZGUoIjEyIikpCisgICAgICAgIGZvciBsIGluIGxpc3RzOgorICAgICAgICAgICAgaSA9IGl0ZXIobCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5uZXh0KCksICcxJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5uZXh0KCksICcyJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIGkubmV4dCkKKworICAgIGRlZiB0ZXN0X2lzaW5zdGFuY2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEU6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgZCA9IEQoKQorICAgICAgICBlID0gRSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGMsIEMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShkLCBDKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc2luc3RhbmNlKGUsIEMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzaW5zdGFuY2UoYywgRCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZSgnZm9vJywgRSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXNpbnN0YW5jZSwgRSwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXNpbnN0YW5jZSkKKworICAgIGRlZiB0ZXN0X2lzc3ViY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEU6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgZCA9IEQoKQorICAgICAgICBlID0gRSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEQsIEMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDLCBDKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc3N1YmNsYXNzKEMsIEQpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlzc3ViY2xhc3MsICdmb28nLCBFKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlzc3ViY2xhc3MsIEUsICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlzc3ViY2xhc3MpCisKKyAgICBkZWYgdGVzdF9sZW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKCcxMjMnKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oKCkpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbigoMSwgMiwgMywgNCkpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihbMSwgMiwgMywgNF0pLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih7fSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHsnYSc6MSwgJ2InOiAyfSksIDIpCisgICAgICAgIGNsYXNzIEJhZFNlcToKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGVuLCBCYWRTZXEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsZW4sIDIpCisgICAgICAgIGNsYXNzIENsYXNzaWNTdHlsZTogcGFzcworICAgICAgICBjbGFzcyBOZXdTdHlsZShvYmplY3QpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBsZW4sIENsYXNzaWNTdHlsZSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxlbiwgTmV3U3R5bGUoKSkKKworICAgIGRlZiB0ZXN0X21hcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1hcChOb25lLCAnaGVsbG8gd29ybGQnKSwKKyAgICAgICAgICAgIFsnaCcsJ2UnLCdsJywnbCcsJ28nLCcgJywndycsJ28nLCdyJywnbCcsJ2QnXQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtYXAoTm9uZSwgJ2FiY2QnLCAnZWZnJyksCisgICAgICAgICAgICBbKCdhJywgJ2UnKSwgKCdiJywgJ2YnKSwgKCdjJywgJ2cnKSwgKCdkJywgTm9uZSldCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1hcChOb25lLCByYW5nZSgxMCkpLAorICAgICAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1hcChsYW1iZGEgeDogeCp4LCByYW5nZSgxLDQpKSwKKyAgICAgICAgICAgIFsxLCA0LCA5XQorICAgICAgICApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gbWF0aCBpbXBvcnQgc3FydAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBkZWYgc3FydCh4KToKKyAgICAgICAgICAgICAgICByZXR1cm4gcG93KHgsIDAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1hcChsYW1iZGEgeDogbWFwKHNxcnQseCksIFtbMTYsIDRdLCBbODEsIDldXSksCisgICAgICAgICAgICBbWzQuMCwgMi4wXSwgWzkuMCwgMy4wXV0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbWFwKGxhbWJkYSB4LCB5OiB4K3ksIFsxLDMsMl0sIFs5LDEsNF0pLAorICAgICAgICAgICAgWzEwLCA0LCA2XQorICAgICAgICApCisKKyAgICAgICAgZGVmIHBsdXMoKnYpOgorICAgICAgICAgICAgYWNjdSA9IDAKKyAgICAgICAgICAgIGZvciBpIGluIHY6IGFjY3UgPSBhY2N1ICsgaQorICAgICAgICAgICAgcmV0dXJuIGFjY3UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1hcChwbHVzLCBbMSwgMywgN10pLAorICAgICAgICAgICAgWzEsIDMsIDddCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1hcChwbHVzLCBbMSwgMywgN10sIFs0LCA5LCAyXSksCisgICAgICAgICAgICBbMSs0LCAzKzksIDcrMl0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbWFwKHBsdXMsIFsxLCAzLCA3XSwgWzQsIDksIDJdLCBbMSwgMSwgMF0pLAorICAgICAgICAgICAgWzErNCsxLCAzKzkrMSwgNysyKzBdCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1hcChOb25lLCBTcXVhcmVzKDEwKSksCisgICAgICAgICAgICBbMCwgMSwgNCwgOSwgMTYsIDI1LCAzNiwgNDksIDY0LCA4MV0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbWFwKGludCwgU3F1YXJlcygxMCkpLAorICAgICAgICAgICAgWzAsIDEsIDQsIDksIDE2LCAyNSwgMzYsIDQ5LCA2NCwgODFdCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1hcChOb25lLCBTcXVhcmVzKDMpLCBTcXVhcmVzKDIpKSwKKyAgICAgICAgICAgIFsoMCwwKSwgKDEsMSksICg0LE5vbmUpXQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtYXAobWF4LCBTcXVhcmVzKDMpLCBTcXVhcmVzKDIpKSwKKyAgICAgICAgICAgIFswLCAxLCA0XQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWFwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hcCwgbGFtYmRhIHg6IHgsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChOb25lLCBbNDJdKSwgWzQyXSkKKyAgICAgICAgY2xhc3MgQmFkU2VxOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hcCwgbGFtYmRhIHg6IHgsIEJhZFNlcSgpKQorICAgICAgICBkZWYgYmFkZnVuYyh4KToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG1hcCwgYmFkZnVuYywgcmFuZ2UoNSkpCisKKyAgICBkZWYgdGVzdF9tYXgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF4KCcxMjMxMjMnKSwgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heCgxLCAyLCAzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoKDEsIDIsIDMsIDEsIDIsIDMpKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoWzEsIDIsIDMsIDEsIDIsIDNdKSwgMykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heCgxLCAyTCwgMy4wKSwgMy4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heCgxTCwgMi4wLCAzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoMS4wLCAyLCAzTCksIDNMKQorCisgICAgICAgIGZvciBzdG10IGluICgKKyAgICAgICAgICAgICJtYXgoa2V5PWludCkiLCAgICAgICAgICAgICAgICAgIyBubyBhcmdzCisgICAgICAgICAgICAibWF4KDEsIGtleT1pbnQpIiwgICAgICAgICAgICAgICMgc2luZ2xlIGFyZyBub3QgaXRlcmFibGUKKyAgICAgICAgICAgICJtYXgoMSwgMiwga2V5c3RvbmU9aW50KSIsICAgICAgIyB3cm9uZyBrZXl3b3JkCisgICAgICAgICAgICAibWF4KDEsIDIsIGtleT1pbnQsIGFiYz1pbnQpIiwgICMgdHdvIG1hbnkga2V5d29yZHMKKyAgICAgICAgICAgICJtYXgoMSwgMiwga2V5PTEpIiwgICAgICAgICAgICAgIyBrZXlmdW5jIGlzIG5vdCBjYWxsYWJsZQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBleGVjKHN0bXQpIGluIGdsb2JhbHMoKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbChzdG10KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF4KCgxLCksIGtleT1uZWcpLCAxKSAgICAgIyBvbmUgZWxlbSBpdGVyYWJsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heCgoMSwyKSwga2V5PW5lZyksIDEpICAgICMgdHdvIGVsZW0gaXRlcmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoMSwgMiwga2V5PW5lZyksIDEpICAgICAjIHR3byBlbGVtcworCisgICAgICAgIGRhdGEgPSBbcmFuZG9tLnJhbmRyYW5nZSgyMDApIGZvciBpIGluIHJhbmdlKDEwMCldCisgICAgICAgIGtleXMgPSBkaWN0KChlbGVtLCByYW5kb20ucmFuZHJhbmdlKDUwKSkgZm9yIGVsZW0gaW4gZGF0YSkKKyAgICAgICAgZiA9IGtleXMuX19nZXRpdGVtX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoZGF0YSwga2V5PWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZChyZXZlcnNlZChkYXRhKSwga2V5PWYpWy0xXSkKKworICAgIGRlZiB0ZXN0X21pbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oJzEyMzEyMycpLCAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWluKDEsIDIsIDMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbigoMSwgMiwgMywgMSwgMiwgMykpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbihbMSwgMiwgMywgMSwgMiwgM10pLCAxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWluKDEsIDJMLCAzLjApLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbigxTCwgMi4wLCAzKSwgMUwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWluKDEuMCwgMiwgM0wpLCAxLjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtaW4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWluLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWluLCAoKSkKKyAgICAgICAgY2xhc3MgQmFkU2VxOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1pbiwgQmFkU2VxKCkpCisgICAgICAgIGNsYXNzIEJhZE51bWJlcjoKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1pbiwgKDQyLCBCYWROdW1iZXIoKSkpCisKKyAgICAgICAgZm9yIHN0bXQgaW4gKAorICAgICAgICAgICAgIm1pbihrZXk9aW50KSIsICAgICAgICAgICAgICAgICAjIG5vIGFyZ3MKKyAgICAgICAgICAgICJtaW4oMSwga2V5PWludCkiLCAgICAgICAgICAgICAgIyBzaW5nbGUgYXJnIG5vdCBpdGVyYWJsZQorICAgICAgICAgICAgIm1pbigxLCAyLCBrZXlzdG9uZT1pbnQpIiwgICAgICAjIHdyb25nIGtleXdvcmQKKyAgICAgICAgICAgICJtaW4oMSwgMiwga2V5PWludCwgYWJjPWludCkiLCAgIyB0d28gbWFueSBrZXl3b3JkcworICAgICAgICAgICAgIm1pbigxLCAyLCBrZXk9MSkiLCAgICAgICAgICAgICAjIGtleWZ1bmMgaXMgbm90IGNhbGxhYmxlCisgICAgICAgICAgICApOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGV4ZWMoc3RtdCkgaW4gZ2xvYmFscygpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKHN0bXQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oKDEsKSwga2V5PW5lZyksIDEpICAgICAjIG9uZSBlbGVtIGl0ZXJhYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWluKCgxLDIpLCBrZXk9bmVnKSwgMikgICAgIyB0d28gZWxlbSBpdGVyYWJsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbigxLCAyLCBrZXk9bmVnKSwgMikgICAgICMgdHdvIGVsZW1zCisKKyAgICAgICAgZGF0YSA9IFtyYW5kb20ucmFuZHJhbmdlKDIwMCkgZm9yIGkgaW4gcmFuZ2UoMTAwKV0KKyAgICAgICAga2V5cyA9IGRpY3QoKGVsZW0sIHJhbmRvbS5yYW5kcmFuZ2UoNTApKSBmb3IgZWxlbSBpbiBkYXRhKQorICAgICAgICBmID0ga2V5cy5fX2dldGl0ZW1fXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbihkYXRhLCBrZXk9ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkKGRhdGEsIGtleT1mKVswXSkKKworICAgIGRlZiB0ZXN0X25leHQoc2VsZik6CisgICAgICAgIGl0ID0gaXRlcihyYW5nZSgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0KSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0KSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgbmV4dCwgaXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIG5leHQsIGl0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoaXQsIDQyKSwgNDIpCisKKyAgICAgICAgY2xhc3MgSXRlcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKKyAgICAgICAgaXQgPSBpdGVyKEl0ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0LCA0MiksIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBuZXh0LCBpdCkKKworICAgICAgICBkZWYgZ2VuKCk6CisgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpdCA9IGdlbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChpdCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIG5leHQsIGl0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoaXQsIDQyKSwgNDIpCisKKyAgICBkZWYgdGVzdF9vY3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2N0KDEwMCksICcwMTQ0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvY3QoMTAwTCksICcwMTQ0TCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2N0KC0xMDApLCAnLTAxNDQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9jdCgtMTAwTCksICctMDE0NEwnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9jdCwgKCkpCisKKyAgICBkZWYgd3JpdGVfdGVzdGZpbGUoc2VsZik6CisgICAgICAgICMgTkIgdGhlIGZpcnN0IDQgbGluZXMgYXJlIGFsc28gdXNlZCB0byB0ZXN0IGlucHV0IGFuZCByYXdfaW5wdXQsIGJlbG93CisgICAgICAgIGZwID0gb3BlbihURVNURk4sICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnAud3JpdGUoJzErMVxuJykKKyAgICAgICAgICAgIGZwLndyaXRlKCcxKzFcbicpCisgICAgICAgICAgICBmcC53cml0ZSgnVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZycpCisgICAgICAgICAgICBmcC53cml0ZSgnLlxuJykKKyAgICAgICAgICAgIGZwLndyaXRlKCdEZWFyIEpvaG5cbicpCisgICAgICAgICAgICBmcC53cml0ZSgnWFhYJyoxMDApCisgICAgICAgICAgICBmcC53cml0ZSgnWVlZJyoxMDApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9vcGVuKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlX3Rlc3RmaWxlKCkKKyAgICAgICAgZnAgPSBvcGVuKFRFU1RGTiwgJ3InKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLnJlYWRsaW5lKDQpLCAnMSsxXG4nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5yZWFkbGluZSg0KSwgJzErMVxuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAucmVhZGxpbmUoKSwgJ1RoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuXG4nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5yZWFkbGluZSg0KSwgJ0RlYXInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5yZWFkbGluZSgxMDApLCAnIEpvaG5cbicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLnJlYWQoMzAwKSwgJ1hYWCcqMTAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5yZWFkKDEwMDApLCAnWVlZJyoxMDApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHVubGluayhURVNURk4pCisKKyAgICBkZWYgdGVzdF9vcmQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JkKCcgJyksIDMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yZCgnQScpLCA2NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmQoJ2EnKSwgOTcpCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JkKHVuaWNocihzeXMubWF4dW5pY29kZSkpLCBzeXMubWF4dW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcmQsIDQyKQorICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9yZCwgdW5pY29kZSgiMTIiKSkKKworICAgIGRlZiB0ZXN0X3BvdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMCwwKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMCwxKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMSwwKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMSwxKSwgMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygyLDApLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygyLDEwKSwgMTAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMiwyMCksIDEwMjQqMTAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMiwzMCksIDEwMjQqMTAyNCoxMDI0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KC0yLDApLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygtMiwxKSwgLTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KC0yLDIpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygtMiwzKSwgLTgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMEwsMCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDBMLDEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygxTCwwKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMUwsMSksIDEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMkwsMCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDJMLDEwKSwgMTAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMkwsMjApLCAxMDI0KjEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDJMLDMwKSwgMTAyNCoxMDI0KjEwMjQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coLTJMLDApLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygtMkwsMSksIC0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygtMkwsMiksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KC0yTCwzKSwgLTgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coMC4sMCksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBvdygwLiwxKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocG93KDEuLDApLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coMS4sMSksIDEuKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocG93KDIuLDApLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coMi4sMTApLCAxMDI0LikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coMi4sMjApLCAxMDI0LioxMDI0LikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coMi4sMzApLCAxMDI0LioxMDI0LioxMDI0LikKKworICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBvdygtMi4sMCksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBvdygtMi4sMSksIC0yLikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coLTIuLDIpLCA0LikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coLTIuLDMpLCAtOC4pCisKKyAgICAgICAgZm9yIHggaW4gMiwgMkwsIDIuMDoKKyAgICAgICAgICAgIGZvciB5IGluIDEwLCAxMEwsIDEwLjA6CisgICAgICAgICAgICAgICAgZm9yIHogaW4gMTAwMCwgMTAwMEwsIDEwMDAuMDoKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCBmbG9hdCkgb3IgXAorICAgICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHksIGZsb2F0KSBvciBcCisgICAgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoeiwgZmxvYXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb3csIHgsIHksIHopCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBvdyh4LCB5LCB6KSwgMjQuMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvdywgLTEsIC0yLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwb3csIDEsIDIsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG93LCAtMUwsIC0yTCwgM0wpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvdywgMUwsIDJMLCAwTCkKKyAgICAgICAgIyBXaWxsIHJldHVybiBjb21wbGV4IGluIDMuMDoKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG93LCAtMzQyLjQzLCAwLjIzNCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvdykKKworICAgIGRlZiB0ZXN0X3JhbmdlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKDMpLCBbMCwgMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZ2UoMSwgNSksIFsxLCAyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZSgwKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZ2UoLTMpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZSgxLCAxMCwgMyksIFsxLCA0LCA3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZSg1LCAtNSwgLTMpLCBbNSwgMiwgLTEsIC00XSkKKworICAgICAgICAjIE5vdyB0ZXN0IHJhbmdlKCkgd2l0aCBsb25ncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKC0yKioxMDApLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZSgwLCAtMioqMTAwKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZ2UoMCwgMioqMTAwLCAtMSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKDAsIDIqKjEwMCwgLTEpLCBbXSkKKworICAgICAgICBhID0gbG9uZygxMCAqIHN5cy5tYXhpbnQpCisgICAgICAgIGIgPSBsb25nKDEwMCAqIHN5cy5tYXhpbnQpCisgICAgICAgIGMgPSBsb25nKDUwICogc3lzLm1heGludCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKGEsIGErMiksIFthLCBhKzFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKGErMiwgYSwgLTFMKSwgW2ErMiwgYSsxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZShhKzQsIGEsIC0yKSwgW2ErNCwgYSsyXSkKKworICAgICAgICBzZXEgPSByYW5nZShhLCBiLCBjKQorICAgICAgICBzZWxmLmFzc2VydEluKGEsIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihiLCBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlcSksIDIpCisKKyAgICAgICAgc2VxID0gcmFuZ2UoYiwgYSwgLWMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYiwgc2VxKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGEsIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VxKSwgMikKKworICAgICAgICBzZXEgPSByYW5nZSgtYSwgLWIsIC1jKQorICAgICAgICBzZWxmLmFzc2VydEluKC1hLCBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oLWIsIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VxKSwgMikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAxLCAyLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByYW5nZSwgMSwgMiwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmFuZ2UsIGEsIGEgKyAxLCBsb25nKDApKQorCisgICAgICAgIGNsYXNzIGJhZHplcm8oaW50KToKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIEludmFsaWQgY21wIG1ha2VzIHRoaXMgdW5oYXNoYWJsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHJhbmdlLCBhLCBhICsgMSwgYmFkemVybygxKSkKKworICAgICAgICAjIFJlamVjdCBmbG9hdHMuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDEuLCAxLiwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDFlMTAwLCAxZTEwMSwgMWUxMDEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMCwgInNwYW0iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAwLCA0MiwgInNwYW0iKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHJhbmdlLCAtc3lzLm1heGludCwgc3lzLm1heGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcmFuZ2UsIDAsIDIqc3lzLm1heGludCkKKworICAgICAgICBiaWdudW0gPSAyKnN5cy5tYXhpbnQKKyAgICAgICAgc21hbGxudW0gPSA0MgorICAgICAgICAjIE9sZC1zdHlsZSB1c2VyLWRlZmluZWQgY2xhc3Mgd2l0aCBfX2ludF9fIG1ldGhvZAorICAgICAgICBjbGFzcyBJMDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuKToKKyAgICAgICAgICAgICAgICBzZWxmLm4gPSBpbnQobikKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZShJMChiaWdudW0pLCBJMChiaWdudW0gKyAxKSksIFtiaWdudW1dKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKEkwKHNtYWxsbnVtKSwgSTAoc21hbGxudW0gKyAxKSksIFtzbWFsbG51bV0pCisKKyAgICAgICAgIyBOZXctc3R5bGUgdXNlci1kZWZpbmVkIGNsYXNzIHdpdGggX19pbnRfXyBtZXRob2QKKyAgICAgICAgY2xhc3MgSTEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuKToKKyAgICAgICAgICAgICAgICBzZWxmLm4gPSBpbnQobikKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZShJMShiaWdudW0pLCBJMShiaWdudW0gKyAxKSksIFtiaWdudW1dKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKEkxKHNtYWxsbnVtKSwgSTEoc21hbGxudW0gKyAxKSksIFtzbWFsbG51bV0pCisKKyAgICAgICAgIyBOZXctc3R5bGUgdXNlci1kZWZpbmVkIGNsYXNzIHdpdGggZmFpbGluZyBfX2ludF9fIG1ldGhvZAorICAgICAgICBjbGFzcyBJWChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgcmFuZ2UsIElYKCkpCisKKyAgICAgICAgIyBOZXctc3R5bGUgdXNlci1kZWZpbmVkIGNsYXNzIHdpdGggaW52YWxpZCBfX2ludF9fIG1ldGhvZAorICAgICAgICBjbGFzcyBJTihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJub3QgYSBudW1iZXIiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIElOKCkpCisKKyAgICAgICAgIyBFeGVyY2lzZSB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBiYWQgYXJndW1lbnRzLCB0byBjaGVjaworICAgICAgICAjIHJlZmNvdW50aW5nIGxvZ2ljCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDAuMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAwLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDAuMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMC4wLCAwLjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMCwgMCwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAwLCAwLjAsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDAsIDAuMCwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAwLjAsIDAsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDAuMCwgMCwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAwLjAsIDAuMCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMC4wLCAwLjAsIDEuMCkKKworCisKKyAgICBkZWYgdGVzdF9pbnB1dF9hbmRfcmF3X2lucHV0KHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlX3Rlc3RmaWxlKCkKKyAgICAgICAgZnAgPSBvcGVuKFRFU1RGTiwgJ3InKQorICAgICAgICBzYXZlc3RkaW4gPSBzeXMuc3RkaW4KKyAgICAgICAgc2F2ZXN0ZG91dCA9IHN5cy5zdGRvdXQgIyBFYXRzIHRoZSBlY2hvCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5zdGRpbiA9IGZwCisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gQml0QnVja2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5wdXQoKSwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5wdXQoJ3Rlc3RpbmdcbicpLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdfaW5wdXQoKSwgJ1RoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3X2lucHV0KCd0ZXN0aW5nXG4nKSwgJ0RlYXIgSm9obicpCisKKyAgICAgICAgICAgICMgU0YgMTUzNTE2NTogZG9uJ3Qgc2VnZmF1bHQgb24gY2xvc2VkIHN0ZGluCisgICAgICAgICAgICAjIHN5cy5zdGRvdXQgbXVzdCBiZSBhIHJlZ3VsYXIgZmlsZSBmb3IgdHJpZ2dlcmluZworICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVzdGRvdXQKKyAgICAgICAgICAgIHN5cy5zdGRpbi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnB1dCkKKworICAgICAgICAgICAgc3lzLnN0ZG91dCA9IEJpdEJ1Y2tldCgpCisgICAgICAgICAgICBzeXMuc3RkaW4gPSBjU3RyaW5nSU8uU3RyaW5nSU8oIk5VTExcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlucHV0LCA0MiwgNDIpCisgICAgICAgICAgICBzeXMuc3RkaW4gPSBjU3RyaW5nSU8uU3RyaW5nSU8oIiAgICAnd2hpdGVzcGFjZSciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnB1dCgpLCAnd2hpdGVzcGFjZScpCisgICAgICAgICAgICBzeXMuc3RkaW4gPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGlucHV0KQorCisgICAgICAgICAgICAjIFNGIDg3NjE3ODogbWFrZSBzdXJlIGlucHV0KCkgcmVzcGVjdCBmdXR1cmUgb3B0aW9ucy4KKyAgICAgICAgICAgIHN5cy5zdGRpbiA9IGNTdHJpbmdJTy5TdHJpbmdJTygnMS8yJykKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgZXhlYyBjb21waWxlKCdwcmludCBpbnB1dCgpJywgJ3Rlc3RfYnVpbHRpbl90bXAnLCAnZXhlYycpCisgICAgICAgICAgICBzeXMuc3RkaW4uc2VlaygwLCAwKQorICAgICAgICAgICAgZXhlYyBjb21waWxlKCdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uO3ByaW50IGlucHV0KCknLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2J1aWx0aW5fdG1wJywgJ2V4ZWMnKQorICAgICAgICAgICAgc3lzLnN0ZGluLnNlZWsoMCwgMCkKKyAgICAgICAgICAgIGV4ZWMgY29tcGlsZSgncHJpbnQgaW5wdXQoKScsICd0ZXN0X2J1aWx0aW5fdG1wJywgJ2V4ZWMnKQorICAgICAgICAgICAgIyBUaGUgcmVzdWx0IHdlIGV4cGVjdCBkZXBlbmRzIG9uIHdoZXRoZXIgbmV3IGRpdmlzaW9uIHNlbWFudGljcworICAgICAgICAgICAgIyBhcmUgYWxyZWFkeSBpbiBlZmZlY3QuCisgICAgICAgICAgICBpZiAxLzIgPT0gMDoKKyAgICAgICAgICAgICAgICAjIFRoaXMgdGVzdCB3YXMgY29tcGlsZWQgd2l0aCBvbGQgc2VtYW50aWNzLgorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gWycwJywgJzAuNScsICcwJ10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBUaGlzIHRlc3Qgd2FzIGNvbXBpbGVkIHdpdGggbmV3IHNlbWFudGljcyAoZS5nLiwgLVFuZXcKKyAgICAgICAgICAgICAgICAjIHdhcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gWycwLjUnLCAnMC41JywgJzAuNSddCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5zdGRvdXQuZ2V0dmFsdWUoKS5zcGxpdGxpbmVzKCksIGV4cGVjdGVkKQorCisgICAgICAgICAgICBkZWwgc3lzLnN0ZG91dAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBpbnB1dCwgJ3Byb21wdCcpCisgICAgICAgICAgICBkZWwgc3lzLnN0ZGluCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGlucHV0LCAncHJvbXB0JykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRpbiA9IHNhdmVzdGRpbgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVzdGRvdXQKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgIHVubGluayhURVNURk4pCisKKyAgICBkZWYgdGVzdF9yZWR1Y2Uoc2VsZik6CisgICAgICAgIGFkZCA9IGxhbWJkYSB4LCB5OiB4K3kKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UoYWRkLCBbJ2EnLCAnYicsICdjJ10sICcnKSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICByZWR1Y2UoYWRkLCBbWydhJywgJ2MnXSwgW10sIFsnZCcsICd3J11dLCBbXSksCisgICAgICAgICAgICBbJ2EnLCdjJywnZCcsJ3cnXQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGxhbWJkYSB4LCB5OiB4KnksIHJhbmdlKDIsOCksIDEpLCA1MDQwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcmVkdWNlKGxhbWJkYSB4LCB5OiB4KnksIHJhbmdlKDIsMjEpLCAxTCksCisgICAgICAgICAgICAyNDMyOTAyMDA4MTc2NjQwMDAwTAorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGFkZCwgU3F1YXJlcygxMCkpLCAyODUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGFkZCwgU3F1YXJlcygxMCksIDApLCAyODUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGFkZCwgU3F1YXJlcygwKSwgMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVkdWNlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZHVjZSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVkdWNlLCA0MiwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVkdWNlLCA0MiwgNDIsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZHVjZSwgTm9uZSwgcmFuZ2UoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVkdWNlLCBhZGQsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZSg0MiwgIjEiKSwgIjEiKSAjIGZ1bmMgaXMgbmV2ZXIgY2FsbGVkIHdpdGggb25lIGl0ZW0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UoNDIsICIiLCAiMSIpLCAiMSIpICMgZnVuYyBpcyBuZXZlciBjYWxsZWQgd2l0aCBvbmUgaXRlbQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZHVjZSwgNDIsICg0MiwgNDIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZHVjZSwgYWRkLCBbXSkgIyBhcmcgMiBtdXN0IG5vdCBiZSBlbXB0eSBzZXF1ZW5jZSB3aXRoIG5vIGluaXRpYWwgdmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWR1Y2UsIGFkZCwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVkdWNlLCBhZGQsICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShhZGQsIFtdLCBOb25lKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UoYWRkLCBbXSwgNDIpLCA0MikKKworICAgICAgICBjbGFzcyBCYWRTZXE6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmVkdWNlLCA0MiwgQmFkU2VxKCkpCisKKyAgICBkZWYgdGVzdF9yZWxvYWQoc2VsZik6CisgICAgICAgIGltcG9ydCBtYXJzaGFsCisgICAgICAgIHJlbG9hZChtYXJzaGFsKQorICAgICAgICBpbXBvcnQgc3RyaW5nCisgICAgICAgIHJlbG9hZChzdHJpbmcpCisgICAgICAgICMjIGltcG9ydCBzeXMKKyAgICAgICAgIyMgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IsIHJlbG9hZCwgc3lzKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKCcnKSwgJ1wnXCcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoMCksICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKDBMKSwgJzBMJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKCgpKSwgJygpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKFtdKSwgJ1tdJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHt9KSwgJ3t9JykKKyAgICAgICAgYSA9IFtdCisgICAgICAgIGEuYXBwZW5kKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhKSwgJ1tbLi4uXV0nKQorICAgICAgICBhID0ge30KKyAgICAgICAgYVswXSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEpLCAnezA6IHsuLi59fScpCisKKyAgICBkZWYgdGVzdF9yb3VuZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgwLjApLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyb3VuZCgwLjApKSwgZmxvYXQpICAjIFdpbGwgYmUgaW50IGluIDMuMC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxLjApLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMTAuMCksIDEwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMTAwMDAwMDAwMC4wKSwgMTAwMDAwMDAwMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDFlMjApLCAxZTIwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTEuMCksIC0xLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTEwLjApLCAtMTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtMTAwMDAwMDAwMC4wKSwgLTEwMDAwMDAwMDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtMWUyMCksIC0xZTIwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMC4xKSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDEuMSksIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxMC4xKSwgMTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxMDAwMDAwMDAwLjEpLCAxMDAwMDAwMDAwLjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtMS4xKSwgLTEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtMTAuMSksIC0xMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC0xMDAwMDAwMDAwLjEpLCAtMTAwMDAwMDAwMC4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMC45KSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDkuOSksIDEwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoOTk5OTk5OTk5LjkpLCAxMDAwMDAwMDAwLjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtMC45KSwgLTEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtOS45KSwgLTEwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTk5OTk5OTk5OS45KSwgLTEwMDAwMDAwMDAuMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC04LjAsIC0xKSwgLTEwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyb3VuZCgtOC4wLCAtMSkpLCBmbG9hdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocm91bmQoLTguMCwgMCkpLCBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJvdW5kKC04LjAsIDEpKSwgZmxvYXQpCisKKyAgICAgICAgIyBDaGVjayBoYWxmIHJvdW5kaW5nIGJlaGF2aW91ci4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg1LjUpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDYuNSksIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTUuNSksIC02KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC02LjUpLCAtNykKKworICAgICAgICAjIENoZWNrIGJlaGF2aW9yIG9uIGludHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg4KSwgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtOCksIC04KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocm91bmQoMCkpLCBmbG9hdCkgICMgV2lsbCBiZSBpbnQgaW4gMy4wLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocm91bmQoLTgsIC0xKSksIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocm91bmQoLTgsIDApKSwgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyb3VuZCgtOCwgMSkpLCBmbG9hdCkKKworICAgICAgICAjIHRlc3QgbmV3IGt3YXJncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKG51bWJlcj0tOC4wLCBuZGlnaXRzPS0xKSwgLTEwLjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByb3VuZCkKKworICAgICAgICAjIHRlc3QgZ2VuZXJpYyByb3VuZGluZyBkZWxlZ2F0aW9uIGZvciByZWFscworICAgICAgICBjbGFzcyBUZXN0Um91bmQob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDIzLjAKKworICAgICAgICBjbGFzcyBUZXN0Tm9Sb3VuZChvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoVGVzdFJvdW5kKCkpLCAyMykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJvdW5kLCAxLCAyLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJvdW5kLCBUZXN0Tm9Sb3VuZCgpKQorCisgICAgICAgIHQgPSBUZXN0Tm9Sb3VuZCgpCisgICAgICAgIHQuX19mbG9hdF9fID0gbGFtYmRhICphcmdzOiBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcm91bmQsIHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcm91bmQsIHQsIDApCisKKyAgICAjIFNvbWUgdmVyc2lvbnMgb2YgZ2xpYmMgZm9yIGFscGhhIGhhdmUgYSBidWcgdGhhdCBhZmZlY3RzCisgICAgIyBmbG9hdCAtPiBpbnRlZ2VyIHJvdW5kaW5nIChmbG9vciwgY2VpbCwgcmludCwgcm91bmQpIGZvcgorICAgICMgdmFsdWVzIGluIHRoZSByYW5nZSBbMioqNTIsIDIqKjUzKS4gIFNlZToKKyAgICAjCisgICAgIyAgIGh0dHA6Ly9zb3VyY2VzLnJlZGhhdC5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUzNTAKKyAgICAjCisgICAgIyBXZSBza2lwIHRoaXMgdGVzdCBvbiBMaW51eC9hbHBoYSBpZiBpdCB3b3VsZCBmYWlsLgorICAgIGxpbnV4X2FscGhhID0gKHBsYXRmb3JtLnN5c3RlbSgpLnN0YXJ0c3dpdGgoJ0xpbnV4JykgYW5kCisgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0ubWFjaGluZSgpLnN0YXJ0c3dpdGgoJ2FscGhhJykpCisgICAgc3lzdGVtX3JvdW5kX2J1ZyA9IHJvdW5kKDVlMTUrMSkgIT0gNWUxNSsxCisgICAgQHVuaXR0ZXN0LnNraXBJZihsaW51eF9hbHBoYSBhbmQgc3lzdGVtX3JvdW5kX2J1ZywKKyAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IHdpbGwgZmFpbDsgIGZhaWx1cmUgaXMgcHJvYmFibHkgZHVlIHRvIGEgIgorICAgICAgICAgICAgICAgICAgICAgImJ1Z2d5IHN5c3RlbSByb3VuZCBmdW5jdGlvbiIpCisgICAgZGVmIHRlc3Rfcm91bmRfbGFyZ2Uoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE4Njk6IGludGVncmFsIGZsb2F0cyBzaG91bGQgcmVtYWluIHVuY2hhbmdlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDVlMTUtMSksIDVlMTUtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg1ZTE1KSwgNWUxNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg1ZTE1KzEpLCA1ZTE1KzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNWUxNSsyKSwgNWUxNSsyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDVlMTUrMyksIDVlMTUrMykKKworICAgIGRlZiB0ZXN0X3NldGF0dHIoc2VsZik6CisgICAgICAgIHNldGF0dHIoc3lzLCAnc3BhbScsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLnNwYW0sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgc3lzLCAxLCAnc3BhbScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0cikKKworICAgIGRlZiB0ZXN0X3N1bShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oW10pLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShyYW5nZSgyLDgpKSwgMjcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKGl0ZXIocmFuZ2UoMiw4KSkpLCAyNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oU3F1YXJlcygxMCkpLCAyODUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKGl0ZXIoU3F1YXJlcygxMCkpKSwgMjg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShbWzFdLCBbMl0sIFszXV0sIFtdKSwgWzEsIDIsIDNdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3VtKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN1bSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3VtLCBbJ2EnLCAnYicsICdjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3VtLCBbJ2EnLCAnYicsICdjJ10sICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN1bSwgW1sxXSwgWzJdLCBbM11dKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN1bSwgW3syOjN9XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdW0sIFt7MjozfV0qMiwgezI6M30pCisKKyAgICAgICAgY2xhc3MgQmFkU2VxOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN1bSwgQmFkU2VxKCkpCisKKyAgICAgICAgZW1wdHkgPSBbXQorICAgICAgICBzdW0oKFt4XSBmb3IgeCBpbiByYW5nZSgxMCkpLCBlbXB0eSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbXB0eSwgW10pCisKKyAgICBkZWYgdGVzdF90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoJycpLCAgdHlwZSgnMTIzJykpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodHlwZSgnJyksIHR5cGUoKCkpKQorCisgICAgZGVmIHRlc3RfdW5pY2hyKHNlbGYpOgorICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNocigzMiksIHVuaWNvZGUoJyAnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY2hyKDY1KSwgdW5pY29kZSgnQScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljaHIoOTcpLCB1bmljb2RlKCdhJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIHVuaWNocihzeXMubWF4dW5pY29kZSksCisgICAgICAgICAgICAgICAgdW5pY29kZSgnXFxVJTA4eCcgJSAoc3lzLm1heHVuaWNvZGUpLCAndW5pY29kZS1lc2NhcGUnKQorICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdW5pY2hyLCBzeXMubWF4dW5pY29kZSsxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1bmljaHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoT3ZlcmZsb3dFcnJvciwgVmFsdWVFcnJvciksIHVuaWNociwgMioqMzIpCisKKyAgICAjIFdlIGRvbid0IHdhbnQgc2VsZiBpbiB2YXJzKCksIHNvIHRoZXNlIGFyZSBzdGF0aWMgbWV0aG9kcworCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBnZXRfdmFyc19mMCgpOgorICAgICAgICByZXR1cm4gdmFycygpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGdldF92YXJzX2YyKCk6CisgICAgICAgIEJ1aWx0aW5UZXN0LmdldF92YXJzX2YwKCkKKyAgICAgICAgYSA9IDEKKyAgICAgICAgYiA9IDIKKyAgICAgICAgcmV0dXJuIHZhcnMoKQorCisgICAgY2xhc3MgQ19nZXRfdmFycyhvYmplY3QpOgorICAgICAgICBkZWYgZ2V0RGljdChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiB7J2EnOjJ9CisgICAgICAgIF9fZGljdF9fID0gcHJvcGVydHkoZmdldD1nZXREaWN0KQorCisgICAgZGVmIHRlc3RfdmFycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQodmFycygpKSwgc2V0KGRpcigpKSkKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldCh2YXJzKHN5cykpLCBzZXQoZGlyKHN5cykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X3ZhcnNfZjAoKSwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfdmFyc19mMigpLCB7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHZhcnMsIDQyLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB2YXJzLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXJzKHNlbGYuQ19nZXRfdmFycygpKSwgeydhJzoyfSkKKworICAgIGRlZiB0ZXN0X3ppcChzZWxmKToKKyAgICAgICAgYSA9ICgxLCAyLCAzKQorICAgICAgICBiID0gKDQsIDUsIDYpCisgICAgICAgIHQgPSBbKDEsIDQpLCAoMiwgNSksICgzLCA2KV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoYSwgYiksIHQpCisgICAgICAgIGIgPSBbNCwgNSwgNl0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoYSwgYiksIHQpCisgICAgICAgIGIgPSAoNCwgNSwgNiwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoYSwgYiksIHQpCisgICAgICAgIGNsYXNzIEk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgaSA8IDAgb3IgaSA+IDI6IHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgICAgICAgICByZXR1cm4gaSArIDQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoYSwgSSgpKSwgdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKCpbXSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHppcCwgTm9uZSkKKyAgICAgICAgY2xhc3MgRzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB6aXAsIGEsIEcoKSkKKworICAgICAgICAjIE1ha2Ugc3VyZSB6aXAgZG9lc24ndCB0cnkgdG8gYWxsb2NhdGUgYSBiaWxsaW9uIGVsZW1lbnRzIGZvciB0aGUKKyAgICAgICAgIyByZXN1bHQgbGlzdCB3aGVuIG9uZSBvZiBpdHMgYXJndW1lbnRzIGRvZXNuJ3Qgc2F5IGhvdyBsb25nIGl0IGlzLgorICAgICAgICAjIEEgTWVtb3J5RXJyb3IgaXMgdGhlIG1vc3QgbGlrZWx5IGZhaWx1cmUgbW9kZS4KKyAgICAgICAgY2xhc3MgU2VxdWVuY2VXaXRob3V0QUxlbmd0aDoKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBpZiBpID09IDU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgemlwKFNlcXVlbmNlV2l0aG91dEFMZW5ndGgoKSwgeHJhbmdlKDIqKjMwKSksCisgICAgICAgICAgICBsaXN0KGVudW1lcmF0ZShyYW5nZSg1KSkpCisgICAgICAgICkKKworICAgICAgICBjbGFzcyBCYWRTZXE6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgaSA9PSA1OgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgemlwLCBCYWRTZXEoKSwgQmFkU2VxKCkpCisKKyAgICBkZWYgdGVzdF9mb3JtYXQoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGUgYmFzaWMgbWFjaGluZXJ5IG9mIHRoZSBmb3JtYXQoKSBidWlsdGluLiAgRG9uJ3QgdGVzdAorICAgICAgICAjICB0aGUgc3BlY2lmaWNzIG9mIHRoZSB2YXJpb3VzIGZvcm1hdHRlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMywgJycpLCAnMycpCisKKyAgICAgICAgIyBSZXR1cm5zIHNvbWUgY2xhc3NlcyB0byB1c2UgZm9yIHZhcmlvdXMgdGVzdHMuICBUaGVyZSdzCisgICAgICAgICMgIGFuIG9sZC1zdHlsZSB2ZXJzaW9uLCBhbmQgYSBuZXctc3R5bGUgdmVyc2lvbgorICAgICAgICBkZWYgY2xhc3Nlc19uZXcoKToKKyAgICAgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZi54KSArIGZvcm1hdF9zcGVjCisgICAgICAgICAgICBjbGFzcyBEZXJpdmVkRnJvbUEoQSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBjbGFzcyBTaW1wbGUob2JqZWN0KTogcGFzcworICAgICAgICAgICAgY2xhc3MgRGVyaXZlZEZyb21TaW1wbGUoU2ltcGxlKToKKyAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZi54KSArIGZvcm1hdF9zcGVjCisgICAgICAgICAgICBjbGFzcyBEZXJpdmVkRnJvbVNpbXBsZTIoRGVyaXZlZEZyb21TaW1wbGUpOiBwYXNzCisgICAgICAgICAgICByZXR1cm4gQSwgRGVyaXZlZEZyb21BLCBEZXJpdmVkRnJvbVNpbXBsZSwgRGVyaXZlZEZyb21TaW1wbGUyCisKKyAgICAgICAgIyBJbiAzLjAsIGNsYXNzZXNfY2xhc3NpYyBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBjbGFzc2VzX25ldworICAgICAgICBkZWYgY2xhc3Nlc19jbGFzc2ljKCk6CisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmLngpICsgZm9ybWF0X3NwZWMKKyAgICAgICAgICAgIGNsYXNzIERlcml2ZWRGcm9tQShBKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGNsYXNzIFNpbXBsZTogcGFzcworICAgICAgICAgICAgY2xhc3MgRGVyaXZlZEZyb21TaW1wbGUoU2ltcGxlKToKKyAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZi54KSArIGZvcm1hdF9zcGVjCisgICAgICAgICAgICBjbGFzcyBEZXJpdmVkRnJvbVNpbXBsZTIoRGVyaXZlZEZyb21TaW1wbGUpOiBwYXNzCisgICAgICAgICAgICByZXR1cm4gQSwgRGVyaXZlZEZyb21BLCBEZXJpdmVkRnJvbVNpbXBsZSwgRGVyaXZlZEZyb21TaW1wbGUyCisKKyAgICAgICAgZGVmIGNsYXNzX3Rlc3QoQSwgRGVyaXZlZEZyb21BLCBEZXJpdmVkRnJvbVNpbXBsZSwgRGVyaXZlZEZyb21TaW1wbGUyKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KEEoMyksICdzcGVjJyksICczc3BlYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdChEZXJpdmVkRnJvbUEoNCksICdzcGVjJyksICc0c3BlYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdChEZXJpdmVkRnJvbVNpbXBsZSg1KSwgJ2FiYycpLCAnNWFiYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdChEZXJpdmVkRnJvbVNpbXBsZTIoMTApLCAnYWJjZGVmJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMGFiY2RlZicpCisKKyAgICAgICAgY2xhc3NfdGVzdCgqY2xhc3Nlc19uZXcoKSkKKyAgICAgICAgY2xhc3NfdGVzdCgqY2xhc3Nlc19jbGFzc2ljKCkpCisKKyAgICAgICAgZGVmIGVtcHR5X2Zvcm1hdF9zcGVjKHZhbHVlKToKKyAgICAgICAgICAgICMgdGVzdCB0aGF0OgorICAgICAgICAgICAgIyAgZm9ybWF0KHgsICcnKSA9PSBzdHIoeCkKKyAgICAgICAgICAgICMgIGZvcm1hdCh4KSA9PSBzdHIoeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHZhbHVlLCAiIiksIHN0cih2YWx1ZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh2YWx1ZSksIHN0cih2YWx1ZSkpCisKKyAgICAgICAgIyBmb3IgYnVpbHRpbiB0eXBlcywgZm9ybWF0KHgsICIiKSA9PSBzdHIoeCkKKyAgICAgICAgZW1wdHlfZm9ybWF0X3NwZWMoMTcqKjEzKQorICAgICAgICBlbXB0eV9mb3JtYXRfc3BlYygxLjApCisgICAgICAgIGVtcHR5X2Zvcm1hdF9zcGVjKDMuMTQxNWUxMDQpCisgICAgICAgIGVtcHR5X2Zvcm1hdF9zcGVjKC0zLjE0MTVlMTA0KQorICAgICAgICBlbXB0eV9mb3JtYXRfc3BlYygzLjE0MTVlLTEwNCkKKyAgICAgICAgZW1wdHlfZm9ybWF0X3NwZWMoLTMuMTQxNWUtMTA0KQorICAgICAgICBlbXB0eV9mb3JtYXRfc3BlYyhvYmplY3QpCisgICAgICAgIGVtcHR5X2Zvcm1hdF9zcGVjKE5vbmUpCisKKyAgICAgICAgIyBUeXBlRXJyb3IgYmVjYXVzZSBzZWxmLl9fZm9ybWF0X18gcmV0dXJucyB0aGUgd3JvbmcgdHlwZQorICAgICAgICBjbGFzcyBCYWRGb3JtYXRSZXN1bHQ6CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEuMAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZvcm1hdCwgQmFkRm9ybWF0UmVzdWx0KCksICIiKQorCisgICAgICAgICMgVHlwZUVycm9yIGJlY2F1c2UgZm9ybWF0X3NwZWMgaXMgbm90IHVuaWNvZGUgb3Igc3RyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZm9ybWF0LCBvYmplY3QoKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmb3JtYXQsIG9iamVjdCgpLCBvYmplY3QoKSkKKworICAgICAgICAjIHRlc3RzIGZvciBvYmplY3QuX19mb3JtYXRfXyByZWFsbHkgYmVsb25nIGVsc2V3aGVyZSwgYnV0CisgICAgICAgICMgIHRoZXJlJ3Mgbm8gZ29vZCBwbGFjZSB0byBwdXQgdGhlbQorICAgICAgICB4ID0gb2JqZWN0KCkuX19mb3JtYXRfXygnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguc3RhcnRzd2l0aCgnPG9iamVjdCBvYmplY3QgYXQnKSkKKworICAgICAgICAjIGZpcnN0IGFyZ3VtZW50IHRvIG9iamVjdC5fX2Zvcm1hdF9fIG11c3QgYmUgc3RyaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb2JqZWN0KCkuX19mb3JtYXRfXywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvYmplY3QoKS5fX2Zvcm1hdF9fLCBvYmplY3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvYmplY3QoKS5fX2Zvcm1hdF9fLCBOb25lKQorCisgICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgIyBJc3N1ZSAjNzk5NDogb2JqZWN0Ll9fZm9ybWF0X18gd2l0aCBhIG5vbi1lbXB0eSBmb3JtYXQgc3RyaW5nIGlzCisgICAgICAgICMgIHBlbmRpbmcgZGVwcmVjYXRlZAorICAgICAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2Zvcm1hdF9zdHJpbmcob2JqLCBmbXRfc3RyLCBzaG91bGRfcmFpc2Vfd2FybmluZyk6CisgICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiYWx3YXlzIiwgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgICAgICBmb3JtYXQob2JqLCBmbXRfc3RyKQorICAgICAgICAgICAgaWYgc2hvdWxkX3JhaXNlX3dhcm5pbmc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHdbMF0ubWVzc2FnZSwgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdvYmplY3QuX19mb3JtYXRfXyB3aXRoIGEgbm9uLWVtcHR5IGZvcm1hdCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nJywgc3RyKHdbMF0ubWVzc2FnZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAwKQorCisgICAgICAgIGZtdF9zdHJzID0gWycnLCAncycsIHUnJywgdSdzJ10KKworICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm10X3N0cik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdCgnJywgZm10X3N0cikKKworICAgICAgICBmb3IgZm10X3N0ciBpbiBmbXRfc3RyczoKKyAgICAgICAgICAgIHRlc3RfZGVwcmVjYXRlZF9mb3JtYXRfc3RyaW5nKEEoKSwgZm10X3N0ciwgRmFsc2UpCisKKyAgICAgICAgY2xhc3MgQjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZm9yIGNscyBpbiBbb2JqZWN0LCBCLCBDXToKKyAgICAgICAgICAgIGZvciBmbXRfc3RyIGluIGZtdF9zdHJzOgorICAgICAgICAgICAgICAgIHRlc3RfZGVwcmVjYXRlZF9mb3JtYXRfc3RyaW5nKGNscygpLCBmbXRfc3RyLCBsZW4oZm10X3N0cikgIT0gMCkKKyAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgICMgbWFrZSBzdXJlIHdlIGNhbiB0YWtlIGEgc3ViY2xhc3Mgb2Ygc3RyIGFzIGEgZm9ybWF0IHNwZWMKKyAgICAgICAgY2xhc3MgRGVyaXZlZEZyb21TdHIoc3RyKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgwLCBEZXJpdmVkRnJvbVN0cignMTAnKSksICcgICAgICAgICAwJykKKworICAgIGRlZiB0ZXN0X2JpbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oMCksICcwYjAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbigxKSwgJzBiMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKC0xKSwgJy0wYjEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbigyKio2NSksICcwYjEnICsgJzAnICogNjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKDIqKjY1LTEpLCAnMGInICsgJzEnICogNjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKC0oMioqNjUpKSwgJy0wYjEnICsgJzAnICogNjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKC0oMioqNjUtMSkpLCAnLTBiJyArICcxJyAqIDY1KQorCisgICAgZGVmIHRlc3RfYnl0ZWFycmF5X3RyYW5zbGF0ZShzZWxmKToKKyAgICAgICAgeCA9IGJ5dGVhcnJheSgiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgeC50cmFuc2xhdGUsICIxIiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB4LnRyYW5zbGF0ZSwgIjEiKjI1NiwgMSkKKworY2xhc3MgVGVzdFNvcnRlZCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgZGF0YSA9IHJhbmdlKDEwMCkKKyAgICAgICAgY29weSA9IGRhdGFbOl0KKyAgICAgICAgcmFuZG9tLnNodWZmbGUoY29weSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzb3J0ZWQoY29weSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZGF0YSwgY29weSkKKworICAgICAgICBkYXRhLnJldmVyc2UoKQorICAgICAgICByYW5kb20uc2h1ZmZsZShjb3B5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNvcnRlZChjb3B5LCBjbXA9bGFtYmRhIHgsIHk6IGNtcCh5LHgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYXRhLCBjb3B5KQorICAgICAgICByYW5kb20uc2h1ZmZsZShjb3B5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNvcnRlZChjb3B5LCBrZXk9bGFtYmRhIHg6IC14KSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYXRhLCBjb3B5KQorICAgICAgICByYW5kb20uc2h1ZmZsZShjb3B5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNvcnRlZChjb3B5LCByZXZlcnNlPTEpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGRhdGEsIGNvcHkpCisKKyAgICBkZWYgdGVzdF9pbnB1dHR5cGVzKHNlbGYpOgorICAgICAgICBzID0gJ2FicmFjYWRhYnJhJworICAgICAgICB0eXBlcyA9IFtsaXN0LCB0dXBsZV0KKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgdHlwZXMuaW5zZXJ0KDAsIHVuaWNvZGUpCisgICAgICAgIGZvciBUIGluIHR5cGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQocyksIHNvcnRlZChUKHMpKSkKKworICAgICAgICBzID0gJycuam9pbihkaWN0LmZyb21rZXlzKHMpLmtleXMoKSkgICMgdW5pcXVlIGxldHRlcnMgb25seQorICAgICAgICB0eXBlcyA9IFtzZXQsIGZyb3plbnNldCwgbGlzdCwgdHVwbGUsIGRpY3QuZnJvbWtleXNdCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHR5cGVzLmluc2VydCgwLCB1bmljb2RlKQorICAgICAgICBmb3IgVCBpbiB0eXBlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHMpLCBzb3J0ZWQoVChzKSkpCisKKyAgICBkZWYgdGVzdF9iYWRkZWNvcmF0b3Ioc2VsZik6CisgICAgICAgIGRhdGEgPSAnVGhlIHF1aWNrIEJyb3duIGZveCBKdW1wZWQgb3ZlciBUaGUgbGF6eSBEb2cnLnNwbGl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzb3J0ZWQsIGRhdGEsIE5vbmUsIGxhbWJkYSB4LHk6IDApCisKK2RlZiBfcnVuX3VuaXR0ZXN0KCphcmdzKToKKyAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoIi4rIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICgiLisgaXMgcmVuYW1lZCB0byBpbXAucmVsb2FkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICgiY2xhc3NpYyBpbnQgZGl2aXNpb24iLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KCphcmdzKQorCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9jbGFzc2VzID0gKEJ1aWx0aW5UZXN0LCBUZXN0U29ydGVkKQorCisgICAgX3J1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorCisgICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCisgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgIGltcG9ydCBnYworICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICBfcnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcHJpbnQgY291bnRzCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVpbHRpbi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWlsdGluLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWUxMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVpbHRpbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVpbHRpbi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWlsdGluLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWUxMGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVpbHRpbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnl0ZXMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ieXRlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODhiOTMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnl0ZXMucHkKQEAgLTAsMCArMSwxMTQwIEBACisiIiJVbml0IHRlc3RzIGZvciB0aGUgYnl0ZXMgYW5kIGJ5dGVhcnJheSB0eXBlcy4KKworWFhYIFRoaXMgaXMgYSBtZXNzLiAgQ29tbW9uIHRlc3RzIHNob3VsZCBiZSBtb3ZlZCB0byBidWZmZXJfdGVzdHMucHksCit3aGljaCBpdHNlbGYgb3VnaHQgdG8gYmUgdW5pZmllZCB3aXRoIHN0cmluZ190ZXN0cy5weSAoYW5kIHRoZSBsYXR0ZXIKK3Nob3VsZCBiZSBtb2Rlcm5pemVkKS4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IGNvcHkKK2ltcG9ydCBmdW5jdG9vbHMKK2ltcG9ydCBwaWNrbGUKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKK2ltcG9ydCB0ZXN0LnN0cmluZ190ZXN0cworaW1wb3J0IHRlc3QuYnVmZmVyX3Rlc3RzCisKKworaWYgc3lzLmZsYWdzLmJ5dGVzX3dhcm5pbmc6CisgICAgZGVmIGNoZWNrX2J5dGVzX3dhcm5pbmdzKGZ1bmMpOgorICAgICAgICBAZnVuY3Rvb2xzLndyYXBzKGZ1bmMpCisgICAgICAgIGRlZiB3cmFwcGVyKCphcmdzLCAqKmt3KToKKyAgICAgICAgICAgIHdpdGggdGVzdC50ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCcnLCBCeXRlc1dhcm5pbmcpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprdykKKyAgICAgICAgcmV0dXJuIHdyYXBwZXIKK2Vsc2U6CisgICAgIyBuby1vcAorICAgIGRlZiBjaGVja19ieXRlc193YXJuaW5ncyhmdW5jKToKKyAgICAgICAgcmV0dXJuIGZ1bmMKKworCitjbGFzcyBJbmRleGFibGU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlPTApOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQorCisKK2NsYXNzIEJhc2VCeXRlc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYiksIHNlbGYudHlwZTJ0ZXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuX19jbGFzc19fLCBzZWxmLnR5cGUydGVzdCkKKworICAgIGRlZiB0ZXN0X2VtcHR5X3NlcXVlbmNlKHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBiWzBdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBsYW1iZGE6IGJbMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogYltzeXMubWF4aW50XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBiW3N5cy5tYXhpbnQrMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogYlsxMCoqMTAwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBiWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBiWy0yXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBiWy1zeXMubWF4aW50XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBiWy1zeXMubWF4aW50LTFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBsYW1iZGE6IGJbLXN5cy5tYXhpbnQtMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogYlstMTAqKjEwMF0pCisKKyAgICBkZWYgdGVzdF9mcm9tX2xpc3Qoc2VsZik6CisgICAgICAgIGludHMgPSBsaXN0KHJhbmdlKDI1NikpCisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChpIGZvciBpIGluIGludHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCAyNTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgaW50cykKKworICAgIGRlZiB0ZXN0X2Zyb21faW5kZXgoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChbSW5kZXhhYmxlKCksIEluZGV4YWJsZSgxKSwgSW5kZXhhYmxlKDI1NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhhYmxlKDI1NSldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIFswLCAxLCAyNTQsIDI1NV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBbSW5kZXhhYmxlKC0xKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBbSW5kZXhhYmxlKDI1NildKQorCisgICAgZGVmIHRlc3RfZnJvbV9zc2l6ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdCgwKSwgYicnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KDEpLCBiJ1x4MDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KDUpLCBiJ1x4MDBceDAwXHgwMFx4MDBceDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QsIC0xKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoJzAnLCAnYXNjaWknKSwgYicwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiJzAnKSwgYicwJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc2VsZi50eXBlMnRlc3QsIHN5cy5tYXhzaXplICsgMSkKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yX3R5cGVfZXJyb3JzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCAwLjApCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgYWxsb3dlZCBpbiAyLngKKyAgICAgICAgI3NlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50eXBlMnRlc3QsIFsiMCJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBbMC4wXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgW05vbmVdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBbQygpXSkKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yX3ZhbHVlX2Vycm9ycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QsIFstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBbLXN5cy5tYXhpbnRdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgWy1zeXMubWF4aW50LTFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgWy1zeXMubWF4aW50LTJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgWy0xMCoqMTAwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QsIFsyNTZdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgWzI1N10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBbc3lzLm1heGludF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBbc3lzLm1heGludCsxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QsIFsxMCoqMTAwXSkKKworICAgIGRlZiB0ZXN0X2NvbXBhcmUoc2VsZik6CisgICAgICAgIGIxID0gc2VsZi50eXBlMnRlc3QoWzEsIDIsIDNdKQorICAgICAgICBiMiA9IHNlbGYudHlwZTJ0ZXN0KFsxLCAyLCAzXSkKKyAgICAgICAgYjMgPSBzZWxmLnR5cGUydGVzdChbMSwgM10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiMSwgYjIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiMiAhPSBiMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIxIDw9IGIyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYjEgPD0gYjMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiMSA8ICBiMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIxID49IGIyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYjMgPj0gYjIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiMyA+ICBiMikKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxICE9IGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIyID09IGIzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxID4gIGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxID4gIGIzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxID49IGIzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxIDwgIGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIzIDwgIGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIzIDw9IGIyKQorCisgICAgQGNoZWNrX2J5dGVzX3dhcm5pbmdzCisgICAgZGVmIHRlc3RfY29tcGFyZV90b19zdHIoc2VsZik6CisgICAgICAgICMgQnl0ZSBjb21wYXJpc29ucyB3aXRoIHVuaWNvZGUgc2hvdWxkIGFsd2F5cyBmYWlsIQorICAgICAgICAjIFRlc3QgdGhpcyBmb3IgYWxsIGV4cGVjdGVkIGJ5dGUgb3JkZXJzIGFuZCBVbmljb2RlIGNoYXJhY3RlciBzaXplcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGIiXDBhXDBiXDBjIikgPT0gdSJhYmMiLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiIlwwXDBcMGFcMFwwXDBiXDBcMFwwYyIpID09IHUiYWJjIiwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYiJhXDBiXDBjXDAiKSA9PSB1ImFiYyIsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGIiYVwwXDBcMGJcMFwwXDBjXDBcMFwwIikgPT0gdSJhYmMiLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdCgpID09IHVuaWNvZGUoKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoKSAhPSB1bmljb2RlKCksIFRydWUpCisKKyAgICBkZWYgdGVzdF9yZXZlcnNlZChzZWxmKToKKyAgICAgICAgaW5wdXQgPSBsaXN0KG1hcChvcmQsICJIZWxsbyIpKQorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoaW5wdXQpCisgICAgICAgIG91dHB1dCA9IGxpc3QocmV2ZXJzZWQoYikpCisgICAgICAgIGlucHV0LnJldmVyc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dCwgaW5wdXQpCisKKyAgICBkZWYgdGVzdF9nZXRzbGljZShzZWxmKToKKyAgICAgICAgZGVmIGJ5KHMpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHlwZTJ0ZXN0KG1hcChvcmQsIHMpKQorICAgICAgICBiID0gYnkoIkhlbGxvLCB3b3JsZCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo1XSwgYnkoIkhlbGxvIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlsxOjVdLCBieSgiZWxsbyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbNTo3XSwgYnkoIiwgIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls3Ol0sIGJ5KCJ3b3JsZCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbNzoxMl0sIGJ5KCJ3b3JsZCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbNzoxMDBdLCBieSgid29ybGQiKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOi03XSwgYnkoIkhlbGxvIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlstMTE6LTddLCBieSgiZWxsbyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbLTc6LTVdLCBieSgiLCAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWy01Ol0sIGJ5KCJ3b3JsZCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbLTU6MTJdLCBieSgid29ybGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWy01OjEwMF0sIGJ5KCJ3b3JsZCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbLTEwMDo1XSwgYnkoIkhlbGxvIikpCisKKyAgICBkZWYgdGVzdF9leHRlbmRlZF9nZXRzbGljZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGV4dGVuZGVkIHNsaWNpbmcgYnkgY29tcGFyaW5nIHdpdGggbGlzdCBzbGljaW5nLgorICAgICAgICBMID0gbGlzdChyYW5nZSgyNTUpKQorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoTCkKKyAgICAgICAgaW5kaWNlcyA9ICgwLCBOb25lLCAxLCAzLCAxOSwgMTAwLCAtMSwgLTIsIC0zMSwgLTEwMCkKKyAgICAgICAgZm9yIHN0YXJ0IGluIGluZGljZXM6CisgICAgICAgICAgICBmb3Igc3RvcCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgICAgICMgU2tpcCBzdGVwIDAgKGludmFsaWQpCisgICAgICAgICAgICAgICAgZm9yIHN0ZXAgaW4gaW5kaWNlc1sxOl06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYltzdGFydDpzdG9wOnN0ZXBdLCBzZWxmLnR5cGUydGVzdChMW3N0YXJ0OnN0b3A6c3RlcF0pKQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHNhbXBsZSA9IHUiSGVsbG8gd29ybGRcblx1MTIzNFx1NTY3OFx1OWFiY1x1ZGVmMCIKKyAgICAgICAgZm9yIGVuYyBpbiAoInV0ZjgiLCAidXRmMTYiKToKKyAgICAgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChzYW1wbGUsIGVuYykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgc2VsZi50eXBlMnRlc3Qoc2FtcGxlLmVuY29kZShlbmMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgc2FtcGxlLCAibGF0aW4xIikKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KHNhbXBsZSwgImxhdGluMSIsICJpZ25vcmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIHNlbGYudHlwZTJ0ZXN0KHNhbXBsZVs6LTRdLCAidXRmLTgiKSkKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgc2FtcGxlID0gdSJIZWxsbyB3b3JsZFxuXHUxMjM0XHU1Njc4XHU5YWJjXGRlZjBcZGVmMCIKKyAgICAgICAgZm9yIGVuYyBpbiAoInV0ZjgiLCAidXRmMTYiKToKKyAgICAgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChzYW1wbGUsIGVuYykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5kZWNvZGUoZW5jKSwgc2FtcGxlKQorICAgICAgICBzYW1wbGUgPSB1IkhlbGxvIHdvcmxkXG5ceDgwXHg4MVx4ZmVceGZmIgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3Qoc2FtcGxlLCAibGF0aW4xIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBiLmRlY29kZSwgInV0ZjgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZGVjb2RlKCJ1dGY4IiwgImlnbm9yZSIpLCAiSGVsbG8gd29ybGRcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5kZWNvZGUoZXJyb3JzPSJpZ25vcmUiLCBlbmNvZGluZz0idXRmOCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJIZWxsbyB3b3JsZFxuIikKKworICAgIGRlZiB0ZXN0X2Zyb21faW50KHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBzZWxmLnR5cGUydGVzdCgpKQorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgc2VsZi50eXBlMnRlc3QoWzBdKjEwKSkKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KDEwMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIHNlbGYudHlwZTJ0ZXN0KFswXSoxMDAwMCkpCisKKyAgICBkZWYgdGVzdF9jb25jYXQoc2VsZik6CisgICAgICAgIGIxID0gc2VsZi50eXBlMnRlc3QoYiJhYmMiKQorICAgICAgICBiMiA9IHNlbGYudHlwZTJ0ZXN0KGIiZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiMSArIGIyLCBiImFiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYjEgKyBieXRlcyhiImRlZiIpLCBiImFiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYiJkZWYiKSArIGIxLCBiImRlZmFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBiMSArIHUiZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHUiYWJjIiArIGIyKQorCisgICAgZGVmIHRlc3RfcmVwZWF0KHNlbGYpOgorICAgICAgICBmb3IgYiBpbiBiImFiYyIsIHNlbGYudHlwZTJ0ZXN0KGIiYWJjIik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIgKiAzLCBiImFiY2FiY2FiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIgKiAwLCBiIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIgKiAtMSwgYiIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGIgKiAzLjE0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IDMuMTQgKiBiKQorICAgICAgICAgICAgIyBYWFggU2hvdWxkbid0IGJ5dGVzIGFuZCBieXRlYXJyYXkgYWdyZWUgb24gd2hhdCB0byByYWlzZT8KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChPdmVyZmxvd0Vycm9yLCBNZW1vcnlFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGIgKiBzeXMubWF4c2l6ZSkKKworICAgIGRlZiB0ZXN0X3JlcGVhdF8xY2hhcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiJ3gnKSoxMDAsIHNlbGYudHlwZTJ0ZXN0KFtvcmQoJ3gnKV0qMTAwKSkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYiJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEluKG9yZCgnYScpLCBiKQorICAgICAgICBzZWxmLmFzc2VydEluKGludChvcmQoJ2EnKSksIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMjAwLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IDMwMCBpbiBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IC0xIGluIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBOb25lIGluIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBmbG9hdChvcmQoJ2EnKSkgaW4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHUiYSIgaW4gYikKKyAgICAgICAgZm9yIGYgaW4gYnl0ZXMsIGJ5dGVhcnJheToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZihiIiIpLCBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihmKGIiYSIpLCBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihmKGIiYiIpLCBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihmKGIiYyIpLCBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihmKGIiYWIiKSwgYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZihiImJjIiksIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGYoYiJhYmMiKSwgYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oZihiImFjIiksIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGYoYiJkIiksIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGYoYiJkYWIiKSwgYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oZihiImFiZCIpLCBiKQorCisgICAgZGVmIHRlc3RfZnJvbWhleChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdC5mcm9taGV4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QuZnJvbWhleCh1JycpLCBzZWxmLnR5cGUydGVzdCgpKQorICAgICAgICBiID0gYnl0ZWFycmF5KFsweDFhLCAweDJiLCAweDMwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdC5mcm9taGV4KHUnMWEyQjMwJyksIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QuZnJvbWhleCh1JyAgMUEgMkIgIDMwICAgJyksIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QuZnJvbWhleCh1JzAwMDAnKSwgYidcMFwwJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QuZnJvbWhleCwgdSdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QuZnJvbWhleCwgdSdydCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgsIHUnMWEgYiBjZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgsIHUnXHgwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgsIHUnMTIgICBceDAwICAgMzQnKQorCisgICAgZGVmIHRlc3Rfam9pbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiIiIpLmpvaW4oW10pLCBiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYiIiKS5qb2luKFtiIiJdKSwgYiIiKQorICAgICAgICBmb3IgbHN0IGluIFtbYiJhYmMiXSwgW2IiYSIsIGIiYmMiXSwgW2IiYWIiLCBiImMiXSwgW2IiYSIsIGIiYiIsIGIiYyJdXToKKyAgICAgICAgICAgIGxzdCA9IGxpc3QobWFwKHNlbGYudHlwZTJ0ZXN0LCBsc3QpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiIiIpLmpvaW4obHN0KSwgYiJhYmMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiIiIpLmpvaW4odHVwbGUobHN0KSksIGIiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYiIiKS5qb2luKGl0ZXIobHN0KSksIGIiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiIi4iKS5qb2luKFtiImFiIiwgYiJjZCJdKSwgYiJhYi5jZCIpCisgICAgICAgICMgWFhYIG1vcmUuLi4KKworICAgIGRlZiB0ZXN0X2NvdW50KHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYidtaXNzaXNzaXBwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5jb3VudChiJ2knKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmNvdW50KGInc3MnKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmNvdW50KGIndycpLCAwKQorCisgICAgZGVmIHRlc3Rfc3RhcnRzd2l0aChzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudHlwZTJ0ZXN0KCkuc3RhcnRzd2l0aChiImFueXRoaW5nIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiLnN0YXJ0c3dpdGgoYiJoZWxsbyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYi5zdGFydHN3aXRoKGIiaGVsIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiLnN0YXJ0c3dpdGgoYiJoIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYi5zdGFydHN3aXRoKGIiaGVsbG93IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYi5zdGFydHN3aXRoKGIiaGEiKSkKKworICAgIGRlZiB0ZXN0X2VuZHN3aXRoKHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYidoZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYnl0ZWFycmF5KCkuZW5kc3dpdGgoYiJhbnl0aGluZyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYi5lbmRzd2l0aChiImhlbGxvIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiLmVuZHN3aXRoKGIibGxvIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiLmVuZHN3aXRoKGIibyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIuZW5kc3dpdGgoYiJ3aGVsbG8iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiLmVuZHN3aXRoKGIibm8iKSkKKworICAgIGRlZiB0ZXN0X2ZpbmQoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ21pc3Npc3NpcHBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmZpbmQoYidzcycpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZmluZChiJ3NzJywgMyksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5maW5kKGInc3MnLCAxLCA3KSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmZpbmQoYidzcycsIDEsIDMpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmZpbmQoYid3JyksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZmluZChiJ21pc3Npc3NpcHBpYW4nKSwgLTEpCisKKyAgICBkZWYgdGVzdF9yZmluZChzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInbWlzc2lzc2lwcGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucmZpbmQoYidzcycpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucmZpbmQoYidzcycsIDMpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucmZpbmQoYidzcycsIDAsIDYpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucmZpbmQoYid3JyksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucmZpbmQoYidtaXNzaXNzaXBwaWFuJyksIC0xKQorCisgICAgZGVmIHRlc3RfaW5kZXgoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ3dvcmxkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmluZGV4KGIndycpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuaW5kZXgoYidvcmwnKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYi5pbmRleCwgYid3b3JtJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYi5pbmRleCwgYidsZG8nKQorCisgICAgZGVmIHRlc3RfcmluZGV4KHNlbGYpOgorICAgICAgICAjIFhYWCBjb3VsZCBiZSBtb3JlIHJpZ29yb3VzCisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ3dvcmxkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJpbmRleChiJ3cnKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJpbmRleChiJ29ybCcpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiLnJpbmRleCwgYid3b3JtJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYi5yaW5kZXgsIGInbGRvJykKKworICAgIGRlZiB0ZXN0X3JlcGxhY2Uoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ21pc3Npc3NpcHBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJlcGxhY2UoYidpJywgYidhJyksIGInbWFzc2Fzc2FwcGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucmVwbGFjZShiJ3NzJywgYid4JyksIGInbWl4aXhpcHBpJykKKworICAgIGRlZiB0ZXN0X3NwbGl0KHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYidtaXNzaXNzaXBwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zcGxpdChiJ2knKSwgW2InbScsIGInc3MnLCBiJ3NzJywgYidwcCcsIGInJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zcGxpdChiJ3NzJyksIFtiJ21pJywgYidpJywgYidpcHBpJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zcGxpdChiJ3cnKSwgW2JdKQorCisgICAgZGVmIHRlc3Rfc3BsaXRfd2hpdGVzcGFjZShzZWxmKToKKyAgICAgICAgZm9yIGIgaW4gKGInICBhcmYgIGJhcmYgICcsIGInYXJmXHRiYXJmJywgYidhcmZcbmJhcmYnLCBiJ2FyZlxyYmFyZicsCisgICAgICAgICAgICAgICAgICBiJ2FyZlxmYmFyZicsIGInYXJmXHZiYXJmJyk6CisgICAgICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zcGxpdCgpLCBbYidhcmYnLCBiJ2JhcmYnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zcGxpdChOb25lKSwgW2InYXJmJywgYidiYXJmJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuc3BsaXQoTm9uZSwgMiksIFtiJ2FyZicsIGInYmFyZiddKQorICAgICAgICBmb3IgYiBpbiAoYidhXHgxQ2InLCBiJ2FceDFEYicsIGInYVx4MUViJywgYidhXHgxRmInKToKKyAgICAgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnNwbGl0KCksIFtiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiJyAgYSAgYmIgIGMgICcpLnNwbGl0KE5vbmUsIDApLCBbYidhICBiYiAgYyAgJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYicgIGEgIGJiICBjICAnKS5zcGxpdChOb25lLCAxKSwgW2InYScsIGInYmIgIGMgICddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGInICBhICBiYiAgYyAgJykuc3BsaXQoTm9uZSwgMiksIFtiJ2EnLCBiJ2JiJywgYidjICAnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiJyAgYSAgYmIgIGMgICcpLnNwbGl0KE5vbmUsIDMpLCBbYidhJywgYidiYicsIGInYyddKQorCisgICAgZGVmIHRlc3Rfc3BsaXRfc3RyaW5nX2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0KGInYSBiJykuc3BsaXQsIHUnICcpCisKKyAgICBkZWYgdGVzdF9zcGxpdF91bmljb2Rld2hpdGVzcGFjZShzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGIiXHgwOVx4MEFceDBCXHgwQ1x4MERceDFDXHgxRFx4MUVceDFGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnNwbGl0KCksIFtiJ1x4MWNceDFkXHgxZVx4MWYnXSkKKworICAgIGRlZiB0ZXN0X3JzcGxpdChzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInbWlzc2lzc2lwcGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucnNwbGl0KGInaScpLCBbYidtJywgYidzcycsIGInc3MnLCBiJ3BwJywgYicnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJzcGxpdChiJ3NzJyksIFtiJ21pJywgYidpJywgYidpcHBpJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yc3BsaXQoYid3JyksIFtiXSkKKworICAgIGRlZiB0ZXN0X3JzcGxpdF93aGl0ZXNwYWNlKHNlbGYpOgorICAgICAgICBmb3IgYiBpbiAoYicgIGFyZiAgYmFyZiAgJywgYidhcmZcdGJhcmYnLCBiJ2FyZlxuYmFyZicsIGInYXJmXHJiYXJmJywKKyAgICAgICAgICAgICAgICAgIGInYXJmXGZiYXJmJywgYidhcmZcdmJhcmYnKToKKyAgICAgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJzcGxpdCgpLCBbYidhcmYnLCBiJ2JhcmYnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yc3BsaXQoTm9uZSksIFtiJ2FyZicsIGInYmFyZiddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJzcGxpdChOb25lLCAyKSwgW2InYXJmJywgYidiYXJmJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYicgIGEgIGJiICBjICAnKS5yc3BsaXQoTm9uZSwgMCksIFtiJyAgYSAgYmIgIGMnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiJyAgYSAgYmIgIGMgICcpLnJzcGxpdChOb25lLCAxKSwgW2InICBhICBiYicsIGInYyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGInICBhICBiYiAgYyAgJykucnNwbGl0KE5vbmUsIDIpLCBbYicgIGEnLCBiJ2JiJywgYidjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYicgIGEgIGJiICBjICAnKS5yc3BsaXQoTm9uZSwgMyksIFtiJ2EnLCBiJ2JiJywgYidjJ10pCisKKyAgICBkZWYgdGVzdF9yc3BsaXRfc3RyaW5nX2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0KGInYSBiJykucnNwbGl0LCB1JyAnKQorCisgICAgZGVmIHRlc3RfcnNwbGl0X3VuaWNvZGV3aGl0ZXNwYWNlKHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYiJceDA5XHgwQVx4MEJceDBDXHgwRFx4MUNceDFEXHgxRVx4MUYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucnNwbGl0KCksIFtiJ1x4MWNceDFkXHgxZVx4MWYnXSkKKworICAgIGRlZiB0ZXN0X3BhcnRpdGlvbihzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInbWlzc2lzc2lwcGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucGFydGl0aW9uKGInc3MnKSwgKGInbWknLCBiJ3NzJywgYidpc3NpcHBpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5wYXJ0aXRpb24oYid3JyksIChiJ21pc3Npc3NpcHBpJywgYicnLCBiJycpKQorCisgICAgZGVmIHRlc3RfcnBhcnRpdGlvbihzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInbWlzc2lzc2lwcGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucnBhcnRpdGlvbihiJ3NzJyksIChiJ21pc3NpJywgYidzcycsIGInaXBwaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucnBhcnRpdGlvbihiJ2knKSwgKGInbWlzc2lzc2lwcCcsIGInaScsIGInJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5ycGFydGl0aW9uKGIndycpLCAoYicnLCBiJycsIGInbWlzc2lzc2lwcGknKSkKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgorICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgIGZvciBiIGluIGIiIiwgYiJhIiwgYiJhYmMiLCBiIlx4ZmZhYlx4ODAiLCBiIlwwXDBcMzc3XDBcMCI6CisgICAgICAgICAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGIpCisgICAgICAgICAgICAgICAgcHMgPSBwaWNrbGUuZHVtcHMoYiwgcHJvdG8pCisgICAgICAgICAgICAgICAgcSA9IHBpY2tsZS5sb2FkcyhwcykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIHEpCisKKyAgICBkZWYgdGVzdF9zdHJpcChzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInbWlzc2lzc2lwcGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuc3RyaXAoYidpJyksIGInbWlzc2lzc2lwcCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zdHJpcChiJ20nKSwgYidpc3Npc3NpcHBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnN0cmlwKGIncGknKSwgYidtaXNzaXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnN0cmlwKGInaW0nKSwgYidzc2lzc2lwcCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zdHJpcChiJ3BpbScpLCBiJ3NzaXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnN0cmlwKGIpLCBiJycpCisKKyAgICBkZWYgdGVzdF9sc3RyaXAoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ21pc3Npc3NpcHBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmxzdHJpcChiJ2knKSwgYidtaXNzaXNzaXBwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5sc3RyaXAoYidtJyksIGInaXNzaXNzaXBwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5sc3RyaXAoYidwaScpLCBiJ21pc3Npc3NpcHBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmxzdHJpcChiJ2ltJyksIGInc3Npc3NpcHBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmxzdHJpcChiJ3BpbScpLCBiJ3NzaXNzaXBwaScpCisKKyAgICBkZWYgdGVzdF9yc3RyaXAoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ21pc3Npc3NpcHBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJzdHJpcChiJ2knKSwgYidtaXNzaXNzaXBwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJzdHJpcChiJ20nKSwgYidtaXNzaXNzaXBwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yc3RyaXAoYidwaScpLCBiJ21pc3Npc3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucnN0cmlwKGInaW0nKSwgYidtaXNzaXNzaXBwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJzdHJpcChiJ3BpbScpLCBiJ21pc3Npc3MnKQorCisgICAgZGVmIHRlc3Rfc3RyaXBfd2hpdGVzcGFjZShzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInIFx0XG5cclxmXHZhYmMgXHRcblxyXGZcdicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zdHJpcCgpLCBiJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5sc3RyaXAoKSwgYidhYmMgXHRcblxyXGZcdicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yc3RyaXAoKSwgYicgXHRcblxyXGZcdmFiYycpCisKKyAgICBkZWYgdGVzdF9zdHJpcF9ieXRlYXJyYXkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYidhYmMnKS5zdHJpcChtZW1vcnl2aWV3KGInYWMnKSksIGInYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYidhYmMnKS5sc3RyaXAobWVtb3J5dmlldyhiJ2FjJykpLCBiJ2JjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiJ2FiYycpLnJzdHJpcChtZW1vcnl2aWV3KGInYWMnKSksIGInYWInKQorCisgICAgZGVmIHRlc3Rfc3RyaXBfc3RyaW5nX2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0KGInYWJjJykuc3RyaXAsIHUnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50eXBlMnRlc3QoYidhYmMnKS5sc3RyaXAsIHUnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50eXBlMnRlc3QoYidhYmMnKS5yc3RyaXAsIHUnYicpCisKKyAgICBkZWYgdGVzdF9vcmQoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ1wwQVx4N2ZceDgwXHhmZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW29yZChiW2k6aSsxXSkgZm9yIGkgaW4gcmFuZ2UobGVuKGIpKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDY1LCAxMjcsIDEyOCwgMjU1XSkKKworICAgIGRlZiB0ZXN0X25vbmVfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICAjIGlzc3VlIDExODI4CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ2hlbGxvJykKKyAgICAgICAgbCA9IHNlbGYudHlwZTJ0ZXN0KGInbCcpCisgICAgICAgIGggPSBzZWxmLnR5cGUydGVzdChiJ2gnKQorICAgICAgICB4ID0gc2VsZi50eXBlMnRlc3QoYid4JykKKyAgICAgICAgbyA9IHNlbGYudHlwZTJ0ZXN0KGInbycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBiLmZpbmQobCwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgYi5maW5kKGwsIC0yLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBiLmZpbmQobCwgTm9uZSwgLTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGIuZmluZChoLCBOb25lLCBOb25lKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGIucmZpbmQobCwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgYi5yZmluZChsLCAtMiwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgYi5yZmluZChsLCBOb25lLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgYi5yZmluZChoLCBOb25lLCBOb25lKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGIuaW5kZXgobCwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgYi5pbmRleChsLCAtMiwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgYi5pbmRleChsLCBOb25lLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgYi5pbmRleChoLCBOb25lLCBOb25lKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGIucmluZGV4KGwsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGIucmluZGV4KGwsIC0yLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBiLnJpbmRleChsLCBOb25lLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgYi5yaW5kZXgoaCwgTm9uZSwgTm9uZSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBiLmNvdW50KGwsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGIuY291bnQobCwgLTIsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGIuY291bnQobCwgTm9uZSwgLTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGIuY291bnQoeCwgTm9uZSwgTm9uZSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBiLmVuZHN3aXRoKG8sIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGIuZW5kc3dpdGgobywgLTIsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGIuZW5kc3dpdGgobCwgTm9uZSwgLTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBiLmVuZHN3aXRoKHgsIE5vbmUsIE5vbmUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgYi5zdGFydHN3aXRoKGgsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGIuc3RhcnRzd2l0aChsLCAtMiwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgYi5zdGFydHN3aXRoKGgsIE5vbmUsIC0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgYi5zdGFydHN3aXRoKHgsIE5vbmUsIE5vbmUpKQorCisgICAgZGVmIHRlc3RfZmluZF9ldGNfcmFpc2VfY29ycmVjdF9lcnJvcl9tZXNzYWdlcyhzZWxmKToKKyAgICAgICAgIyBpc3N1ZSAxMTgyOAorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYidoZWxsbycpCisgICAgICAgIHggPSBzZWxmLnR5cGUydGVzdChiJ3gnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsIHInXGJmaW5kXGInLCBiLmZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgcidcYnJmaW5kXGInLCBiLnJmaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsIHInXGJpbmRleFxiJywgYi5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVHlwZUVycm9yLCByJ1xicmluZGV4XGInLCBiLnJpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVHlwZUVycm9yLCByJ1xiY291bnRcYicsIGIuY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgcidcYnN0YXJ0c3dpdGhcYicsIGIuc3RhcnRzd2l0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVHlwZUVycm9yLCByJ1xiZW5kc3dpdGhcYicsIGIuZW5kc3dpdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIE5vbmUsIE5vbmUsIE5vbmUpCisKKworY2xhc3MgQnl0ZUFycmF5VGVzdChCYXNlQnl0ZXNUZXN0KToKKyAgICB0eXBlMnRlc3QgPSBieXRlYXJyYXkKKworICAgIGRlZiB0ZXN0X25vaGFzaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBieXRlYXJyYXkoKSkKKworICAgIGRlZiB0ZXN0X2J5dGVhcnJheV9hcGkoc2VsZik6CisgICAgICAgIHNob3J0X3NhbXBsZSA9IGIiSGVsbG8gd29ybGRcbiIKKyAgICAgICAgc2FtcGxlID0gc2hvcnRfc2FtcGxlICsgYiJcMCIqKDIwIC0gbGVuKHNob3J0X3NhbXBsZSkpCisgICAgICAgIHRmbiA9IHRlbXBmaWxlLm1rdGVtcCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgUHJlcGFyZQorICAgICAgICAgICAgd2l0aCBvcGVuKHRmbiwgIndiIikgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKHNob3J0X3NhbXBsZSkKKyAgICAgICAgICAgICMgVGVzdCByZWFkaW50bworICAgICAgICAgICAgd2l0aCBvcGVuKHRmbiwgInJiIikgYXMgZjoKKyAgICAgICAgICAgICAgICBiID0gYnl0ZWFycmF5KDIwKQorICAgICAgICAgICAgICAgIG4gPSBmLnJlYWRpbnRvKGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4sIGxlbihzaG9ydF9zYW1wbGUpKQorICAgICAgICAgICAgIyBQeXRob24gMi54CisgICAgICAgICAgICBiX3NhbXBsZSA9IChvcmQocykgZm9yIHMgaW4gc2FtcGxlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCBsaXN0KGJfc2FtcGxlKSkKKyAgICAgICAgICAgICMgVGVzdCB3cml0aW5nIGluIGJpbmFyeSBtb2RlCisgICAgICAgICAgICB3aXRoIG9wZW4odGZuLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoYikKKyAgICAgICAgICAgIHdpdGggb3Blbih0Zm4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgc2FtcGxlKQorICAgICAgICAgICAgIyBUZXh0IG1vZGUgaXMgYW1iaWd1b3VzOyBkb24ndCB0ZXN0CisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRmbikKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9yZXZlcnNlKHNlbGYpOgorICAgICAgICBiID0gYnl0ZWFycmF5KGInaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucmV2ZXJzZSgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInb2xsZWgnKQorICAgICAgICBiID0gYnl0ZWFycmF5KGInaGVsbG8xJykgIyB0ZXN0IGV2ZW4gbnVtYmVyIG9mIGl0ZW1zCisgICAgICAgIGIucmV2ZXJzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYicxb2xsZWgnKQorICAgICAgICBiID0gYnl0ZWFycmF5KCkKKyAgICAgICAgYi5yZXZlcnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiKQorCisgICAgZGVmIHRlc3RfcmVnZXhwcyhzZWxmKToKKyAgICAgICAgZGVmIGJ5KHMpOgorICAgICAgICAgICAgcmV0dXJuIGJ5dGVhcnJheShtYXAob3JkLCBzKSkKKyAgICAgICAgYiA9IGJ5KCJIZWxsbywgd29ybGQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmZpbmRhbGwociJcdysiLCBiKSwgW2J5KCJIZWxsbyIpLCBieSgid29ybGQiKV0pCisKKyAgICBkZWYgdGVzdF9zZXRpdGVtKHNlbGYpOgorICAgICAgICBiID0gYnl0ZWFycmF5KFsxLCAyLCAzXSkKKyAgICAgICAgYlsxXSA9IDEwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShbMSwgMTAwLCAzXSkpCisgICAgICAgIGJbLTFdID0gMjAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KFsxLCAxMDAsIDIwMF0pKQorICAgICAgICBiWzBdID0gSW5kZXhhYmxlKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShbMTAsIDEwMCwgMjAwXSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJbM10gPSAwCisgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCByYWlzZSBJbmRleEVycm9yIikKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJbLTEwXSA9IDAKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IHJhaXNlIEluZGV4RXJyb3IiKQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYlswXSA9IDI1NgorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgcmFpc2UgVmFsdWVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBiWzBdID0gSW5kZXhhYmxlKC0xKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgcmFpc2UgVmFsdWVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBiWzBdID0gTm9uZQorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgcmFpc2UgVHlwZUVycm9yIikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2RlbGl0ZW0oc2VsZik6CisgICAgICAgIGIgPSBieXRlYXJyYXkocmFuZ2UoMTApKQorICAgICAgICBkZWwgYlswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShyYW5nZSgxLCAxMCkpKQorICAgICAgICBkZWwgYlstMV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkocmFuZ2UoMSwgOSkpKQorICAgICAgICBkZWwgYls0XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShbMSwgMiwgMywgNCwgNiwgNywgOF0pKQorCisgICAgZGVmIHRlc3Rfc2V0c2xpY2Uoc2VsZik6CisgICAgICAgIGIgPSBieXRlYXJyYXkocmFuZ2UoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIGxpc3QocmFuZ2UoMTApKSkKKworICAgICAgICBiWzA6NV0gPSBieXRlYXJyYXkoWzEsIDEsIDEsIDEsIDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShbMSwgMSwgMSwgMSwgMSwgNSwgNiwgNywgOCwgOV0pKQorCisgICAgICAgIGRlbCBiWzA6LTVdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KFs1LCA2LCA3LCA4LCA5XSkpCisKKyAgICAgICAgYlswOjBdID0gYnl0ZWFycmF5KFswLCAxLCAyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkocmFuZ2UoMTApKSkKKworICAgICAgICBiWy03Oi0zXSA9IGJ5dGVhcnJheShbMTAwLCAxMDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShbMCwgMSwgMiwgMTAwLCAxMDEsIDcsIDgsIDldKSkKKworICAgICAgICBiWzM6NV0gPSBbMywgNCwgNSwgNl0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkocmFuZ2UoMTApKSkKKworICAgICAgICBiWzM6MF0gPSBbNDIsIDQyLCA0Ml0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoWzAsIDEsIDIsIDQyLCA0MiwgNDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldKSkKKworICAgICAgICBiWzM6XSA9IGInZm9vJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShbMCwgMSwgMiwgMTAyLCAxMTEsIDExMV0pKQorCisgICAgICAgIGJbOjNdID0gbWVtb3J5dmlldyhiJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KFsxMDIsIDExMSwgMTExLCAxMDIsIDExMSwgMTExXSkpCisKKyAgICAgICAgYlszOjRdID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoWzEwMiwgMTExLCAxMTEsIDExMSwgMTExXSkpCisKKyAgICAgICAgYlsxOl0gPSBsaXN0KGIndXV1dScpICAjIHRoaXMgd29ya3Mgb25seSBvbiBQeXRob24yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KFsxMDIsIDExNywgMTE3LCAxMTcsIDExN10pKQorCisgICAgICAgIGZvciBlbGVtIGluIFs1LCAtNSwgMCwgbG9uZygxMGUyMCksIHUnc3RyJywgMi4zLCBbdSdhJywgdSdiJ10sIFtbXV1dOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgICAgIGJbMzo0XSA9IGVsZW0KKworICAgICAgICBmb3IgZWxlbSBpbiBbWzI1NCwgMjU1LCAyNTZdLCBbLTI1NiwgOTAwMF1dOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICBiWzM6NF0gPSBlbGVtCisKKyAgICBkZWYgdGVzdF9leHRlbmRlZF9zZXRfZGVsX3NsaWNlKHNlbGYpOgorICAgICAgICBpbmRpY2VzID0gKDAsIE5vbmUsIDEsIDMsIDE5LCAzMDAsIDE8PDMzMywgLTEsIC0yLCAtMzEsIC0zMDApCisgICAgICAgIGZvciBzdGFydCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgZm9yIHN0b3AgaW4gaW5kaWNlczoKKyAgICAgICAgICAgICAgICAjIFNraXAgaW52YWxpZCBzdGVwIDAKKyAgICAgICAgICAgICAgICBmb3Igc3RlcCBpbiBpbmRpY2VzWzE6XToKKyAgICAgICAgICAgICAgICAgICAgTCA9IGxpc3QocmFuZ2UoMjU1KSkKKyAgICAgICAgICAgICAgICAgICAgYiA9IGJ5dGVhcnJheShMKQorICAgICAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgc2xpY2Ugb2YgZXhhY3RseSB0aGUgcmlnaHQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAjIGJ1dCB3aXRoIGRpZmZlcmVudCBkYXRhLgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gTFtzdGFydDpzdG9wOnN0ZXBdCisgICAgICAgICAgICAgICAgICAgIGRhdGEucmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgICAgIExbc3RhcnQ6c3RvcDpzdGVwXSA9IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgYltzdGFydDpzdG9wOnN0ZXBdID0gZGF0YQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShMKSkKKworICAgICAgICAgICAgICAgICAgICBkZWwgTFtzdGFydDpzdG9wOnN0ZXBdCisgICAgICAgICAgICAgICAgICAgIGRlbCBiW3N0YXJ0OnN0b3A6c3RlcF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoTCkpCisKKyAgICBkZWYgdGVzdF9zZXRzbGljZV90cmFwKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHdlIGNvcnJlY3RseSBoYW5kbGUgYXNzaWduaW5nIHNlbGYKKyAgICAgICAgIyB0byBhIHNsaWNlIG9mIHNlbGYgKHRoZSBvbGQgTGFtYmVydCBNZWVydGVucyB0cmFwKS4KKyAgICAgICAgYiA9IGJ5dGVhcnJheShyYW5nZSgyNTYpKQorICAgICAgICBiWzg6XSA9IGIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkobGlzdChyYW5nZSg4KSkgKyBsaXN0KHJhbmdlKDI1NikpKSkKKworICAgIGRlZiB0ZXN0X2ljb25jYXQoc2VsZik6CisgICAgICAgIGIgPSBieXRlYXJyYXkoYiJhYmMiKQorICAgICAgICBiMSA9IGIKKyAgICAgICAgYiArPSBiImRlZiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiImFiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGlzIGIxKQorICAgICAgICBiICs9IGIieHl6IgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiYWJjZGVmeHl6IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYiArPSB1IiIKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiYnl0ZXMgKz0gdW5pY29kZSBkaWRuJ3QgcmFpc2UgVHlwZUVycm9yIikKKworICAgIGRlZiB0ZXN0X2lyZXBlYXQoc2VsZik6CisgICAgICAgIGIgPSBieXRlYXJyYXkoYiJhYmMiKQorICAgICAgICBiMSA9IGIKKyAgICAgICAgYiAqPSAzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYiJhYmNhYmNhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiBpcyBiMSkKKworICAgIGRlZiB0ZXN0X2lyZXBlYXRfMWNoYXIoc2VsZik6CisgICAgICAgIGIgPSBieXRlYXJyYXkoYiJ4IikKKyAgICAgICAgYjEgPSBiCisgICAgICAgIGIgKj0gMTAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYiJ4IioxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGlzIGIxKQorCisgICAgZGVmIHRlc3RfYWxsb2Moc2VsZik6CisgICAgICAgIGIgPSBieXRlYXJyYXkoKQorICAgICAgICBhbGxvYyA9IGIuX19hbGxvY19fKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbG9jID49IDApCisgICAgICAgIHNlcSA9IFthbGxvY10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwKToKKyAgICAgICAgICAgIGIgKz0gYiJ4IgorICAgICAgICAgICAgYWxsb2MgPSBiLl9fYWxsb2NfXygpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWxsb2MgPj0gbGVuKGIpKQorICAgICAgICAgICAgaWYgYWxsb2Mgbm90IGluIHNlcToKKyAgICAgICAgICAgICAgICBzZXEuYXBwZW5kKGFsbG9jKQorCisgICAgZGVmIHRlc3RfZXh0ZW5kKHNlbGYpOgorICAgICAgICBvcmlnID0gYidoZWxsbycKKyAgICAgICAgYSA9IGJ5dGVhcnJheShvcmlnKQorICAgICAgICBhLmV4dGVuZChhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIG9yaWcgKyBvcmlnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbNTpdLCBvcmlnKQorICAgICAgICBhID0gYnl0ZWFycmF5KGInJykKKyAgICAgICAgIyBUZXN0IGl0ZXJhdG9ycyB0aGF0IGRvbid0IGhhdmUgYSBfX2xlbmd0aF9oaW50X18KKyAgICAgICAgYS5leHRlbmQobWFwKG9yZCwgb3JpZyAqIDI1KSkKKyAgICAgICAgYS5leHRlbmQob3JkKHgpIGZvciB4IGluIG9yaWcgKiAyNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBvcmlnICogNTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstNTpdLCBvcmlnKQorICAgICAgICBhID0gYnl0ZWFycmF5KGInJykKKyAgICAgICAgYS5leHRlbmQoaXRlcihtYXAob3JkLCBvcmlnICogNTApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBvcmlnICogNTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstNTpdLCBvcmlnKQorICAgICAgICBhID0gYnl0ZWFycmF5KGInJykKKyAgICAgICAgYS5leHRlbmQobGlzdChtYXAob3JkLCBvcmlnICogNTApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBvcmlnICogNTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstNTpdLCBvcmlnKQorICAgICAgICBhID0gYnl0ZWFycmF5KGInJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5leHRlbmQsIFswLCAxLCAyLCAyNTZdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLmV4dGVuZCwgWzAsIDEsIDIsIC0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYSksIDApCisgICAgICAgIGEgPSBieXRlYXJyYXkoYicnKQorICAgICAgICBhLmV4dGVuZChbSW5kZXhhYmxlKG9yZCgnYScpKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYidhJykKKworICAgIGRlZiB0ZXN0X3JlbW92ZShzZWxmKToKKyAgICAgICAgYiA9IGJ5dGVhcnJheShiJ2hlbGxvJykKKyAgICAgICAgYi5yZW1vdmUob3JkKCdsJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYidoZWxvJykKKyAgICAgICAgYi5yZW1vdmUob3JkKCdsJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYidoZW8nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IGIucmVtb3ZlKG9yZCgnbCcpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBiLnJlbW92ZSg0MDApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYi5yZW1vdmUodSdlJykpCisgICAgICAgICMgcmVtb3ZlIGZpcnN0IGFuZCBsYXN0CisgICAgICAgIGIucmVtb3ZlKG9yZCgnbycpKQorICAgICAgICBiLnJlbW92ZShvcmQoJ2gnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiJ2UnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYi5yZW1vdmUodSdlJykpCisgICAgICAgIGIucmVtb3ZlKEluZGV4YWJsZShvcmQoJ2UnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYicnKQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICBiID0gYnl0ZWFycmF5KGInd29ybGQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucG9wKCksIG9yZCgnZCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucG9wKDApLCBvcmQoJ3cnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnBvcCgtMiksIG9yZCgncicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBsYW1iZGE6IGIucG9wKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBieXRlYXJyYXkoKS5wb3AoKSkKKyAgICAgICAgIyB0ZXN0IGZvciBpc3N1ZSAjNjg0NgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVhcnJheShiJ1x4ZmYnKS5wb3AoKSwgMHhmZikKKworICAgIGRlZiB0ZXN0X25vc29ydChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGxhbWJkYTogYnl0ZWFycmF5KCkuc29ydCgpKQorCisgICAgZGVmIHRlc3RfYXBwZW5kKHNlbGYpOgorICAgICAgICBiID0gYnl0ZWFycmF5KGInaGVsbCcpCisgICAgICAgIGIuYXBwZW5kKG9yZCgnbycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuYXBwZW5kKDEwMCksIE5vbmUpCisgICAgICAgIGIgPSBieXRlYXJyYXkoKQorICAgICAgICBiLmFwcGVuZChvcmQoJ0EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBiLmFwcGVuZCh1J28nKSkKKyAgICAgICAgYiA9IGJ5dGVhcnJheSgpCisgICAgICAgIGIuYXBwZW5kKEluZGV4YWJsZShvcmQoJ0EnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYidBJykKKworICAgIGRlZiB0ZXN0X2luc2VydChzZWxmKToKKyAgICAgICAgYiA9IGJ5dGVhcnJheShiJ21zc3NzcHAnKQorICAgICAgICBiLmluc2VydCgxLCBvcmQoJ2knKSkKKyAgICAgICAgYi5pbnNlcnQoNCwgb3JkKCdpJykpCisgICAgICAgIGIuaW5zZXJ0KC0yLCBvcmQoJ2knKSkKKyAgICAgICAgYi5pbnNlcnQoMTAwMCwgb3JkKCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYidtaXNzaXNzaXBwaScpCisgICAgICAgICMgYWxsb3dlZCBpbiAyLngKKyAgICAgICAgI3NlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBiLmluc2VydCgwLCBiJzEnKSkKKyAgICAgICAgYiA9IGJ5dGVhcnJheSgpCisgICAgICAgIGIuaW5zZXJ0KDAsIEluZGV4YWJsZShvcmQoJ0EnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYidBJykKKworICAgIGRlZiB0ZXN0X2NvcGllZChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA0MzQ4LiAgTWFrZSBzdXJlIHRoYXQgb3BlcmF0aW9ucyB0aGF0IGRvbid0IG11dGF0ZSB0aGUgYXJyYXkKKyAgICAgICAgIyBjb3B5IHRoZSBieXRlcy4KKyAgICAgICAgYiA9IGJ5dGVhcnJheShiJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYiBpcyBiLnJlcGxhY2UoYidhYmMnLCBiJ2NkZScsIDApKQorCisgICAgICAgIHQgPSBieXRlYXJyYXkoW2kgZm9yIGkgaW4gcmFuZ2UoMjU2KV0pCisgICAgICAgIHggPSBieXRlYXJyYXkoYicnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHggaXMgeC50cmFuc2xhdGUodCkpCisKKyAgICBkZWYgdGVzdF9wYXJ0aXRpb25fYnl0ZWFycmF5X2RvZXNudF9zaGFyZV9udWxsc3RyaW5nKHNlbGYpOgorICAgICAgICBhLCBiLCBjID0gYnl0ZWFycmF5KGIieCIpLnBhcnRpdGlvbihiInkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGlzIG5vdCBjKQorICAgICAgICBiICs9IGIiISIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiIiIpCisgICAgICAgIGEsIGIsIGMgPSBieXRlYXJyYXkoYiJ4IikucGFydGl0aW9uKGIieSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYiIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIGIiIikKKyAgICAgICAgIyBTYW1lIGZvciBycGFydGl0aW9uCisgICAgICAgIGIsIGMsIGEgPSBieXRlYXJyYXkoYiJ4IikucnBhcnRpdGlvbihiInkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGlzIG5vdCBjKQorICAgICAgICBiICs9IGIiISIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiIiIpCisgICAgICAgIGMsIGIsIGEgPSBieXRlYXJyYXkoYiJ4IikucnBhcnRpdGlvbihiInkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiIiIpCisKKyAgICBkZWYgdGVzdF9yZXNpemVfZm9yYmlkZGVuKHNlbGYpOgorICAgICAgICAjICM0NTA5OiBjYW4ndCByZXNpemUgYSBieXRlYXJyYXkgd2hlbiB0aGVyZSBhcmUgYnVmZmVyIGV4cG9ydHMsIGV2ZW4KKyAgICAgICAgIyBpZiBpdCB3b3VsZG4ndCByZWFsbG9jYXRlIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlci4KKyAgICAgICAgIyBGdXJ0aGVybW9yZSwgbm8gZGVzdHJ1Y3RpdmUgY2hhbmdlcyB0byB0aGUgYnVmZmVyIG1heSBiZSBhcHBsaWVkCisgICAgICAgICMgYmVmb3JlIHJhaXNpbmcgdGhlIGVycm9yLgorICAgICAgICBiID0gYnl0ZWFycmF5KHJhbmdlKDEwKSkKKyAgICAgICAgdiA9IG1lbW9yeXZpZXcoYikKKyAgICAgICAgZGVmIHJlc2l6ZShuKToKKyAgICAgICAgICAgIGJbMTotMV0gPSByYW5nZShuICsgMSwgMipuIC0gMSkKKyAgICAgICAgcmVzaXplKDEwKQorICAgICAgICBvcmlnID0gYls6XQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhCdWZmZXJFcnJvciwgcmVzaXplLCAxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBvcmlnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhCdWZmZXJFcnJvciwgcmVzaXplLCA5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIG9yaWcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJ1ZmZlckVycm9yLCByZXNpemUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgb3JpZykKKyAgICAgICAgIyBPdGhlciBvcGVyYXRpb25zIGltcGx5aW5nIHJlc2l6ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhCdWZmZXJFcnJvciwgYi5wb3AsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgb3JpZykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQnVmZmVyRXJyb3IsIGIucmVtb3ZlLCBiWzFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIG9yaWcpCisgICAgICAgIGRlZiBkZWxpdGVtKCk6CisgICAgICAgICAgICBkZWwgYlsxXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhCdWZmZXJFcnJvciwgZGVsaXRlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBvcmlnKQorICAgICAgICAjIGRlbGV0aW5nIGEgbm9uLWNvbnRpZ3VvdXMgc2xpY2UKKyAgICAgICAgZGVmIGRlbHNsaWNlKCk6CisgICAgICAgICAgICBiWzE6LTE6Ml0gPSBiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQnVmZmVyRXJyb3IsIGRlbHNsaWNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIG9yaWcpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9ieXRlYXJyYXkoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzc1NjE6IG9wZXJhdGlvbnMgb24gZW1wdHkgYnl0ZWFycmF5cyBjb3VsZCBjcmFzaCBpbiBtYW55CisgICAgICAgICMgc2l0dWF0aW9ucywgZHVlIHRvIGEgZnJhZ2lsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKKyAgICAgICAgIyBQeUJ5dGVBcnJheV9BU19TVFJJTkcoKSBDIG1hY3JvLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsIGJ5dGVhcnJheShiJycpKQorCisKK2NsYXNzIEFzc29ydGVkQnl0ZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjCisgICAgIyBUZXN0IHZhcmlvdXMgY29tYmluYXRpb25zIG9mIGJ5dGVzIGFuZCBieXRlYXJyYXkKKyAgICAjCisKKyAgICBAY2hlY2tfYnl0ZXNfd2FybmluZ3MKKyAgICBkZWYgdGVzdF9yZXByX3N0cihzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gc3RyLCByZXByOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKGJ5dGVhcnJheSgpKSwgImJ5dGVhcnJheShiJycpIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihieXRlYXJyYXkoWzBdKSksICJieXRlYXJyYXkoYidcXHgwMCcpIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihieXRlYXJyYXkoWzAsIDEsIDI1NCwgMjU1XSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZWFycmF5KGInXFx4MDBcXHgwMVxceGZlXFx4ZmYnKSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoYiJhYmMiKSwgImInYWJjJyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoYiInIiksICcnJ2IiJyInJycpICMgJycnCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoYiInXCIiKSwgciIiImInXCciJyIiIikgIyAnCisKKyAgICBkZWYgdGVzdF9jb21wYXJlX2J5dGVzX3RvX2J5dGVhcnJheShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFiYyIgPT0gYnl0ZXMoYiJhYmMiKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFiIiAhPSBieXRlcyhiImFiYyIpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWIiIDw9IGJ5dGVzKGIiYWJjIiksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYiIgPCBieXRlcyhiImFiYyIpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjIiA+PSBieXRlcyhiImFiIiksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmMiID4gYnl0ZXMoYiJhYiIpLCBUcnVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmMiICE9IGJ5dGVzKGIiYWJjIiksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWIiID09IGJ5dGVzKGIiYWJjIiksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWIiID4gYnl0ZXMoYiJhYmMiKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYiIgPj0gYnl0ZXMoYiJhYmMiKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmMiIDwgYnl0ZXMoYiJhYiIpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFiYyIgPD0gYnl0ZXMoYiJhYiIpLCBGYWxzZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKGIiYWJjIikgPT0gYiJhYmMiLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKGIiYWIiKSAhPSBiImFiYyIsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYiJhYiIpIDw9IGIiYWJjIiwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhiImFiIikgPCBiImFiYyIsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYiJhYmMiKSA+PSBiImFiIiwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhiImFiYyIpID4gYiJhYiIsIFRydWUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhiImFiYyIpICE9IGIiYWJjIiwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYiJhYiIpID09IGIiYWJjIiwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYiJhYiIpID4gYiJhYmMiLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhiImFiIikgPj0gYiJhYmMiLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhiImFiYyIpIDwgYiJhYiIsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKGIiYWJjIikgPD0gYiJhYiIsIEZhbHNlKQorCisgICAgQHRlc3QudGVzdF9zdXBwb3J0LnJlcXVpcmVzX2RvY3N0cmluZ3MKKyAgICBkZWYgdGVzdF9kb2Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGJ5dGVhcnJheS5fX2RvY19fKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYnl0ZWFycmF5Ll9fZG9jX18uc3RhcnRzd2l0aCgiYnl0ZWFycmF5KCIpLCBieXRlYXJyYXkuX19kb2NfXykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoYnl0ZXMuX19kb2NfXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJ5dGVzLl9fZG9jX18uc3RhcnRzd2l0aCgiYnl0ZXMoIiksIGJ5dGVzLl9fZG9jX18pCisKKyAgICBkZWYgdGVzdF9mcm9tX2J5dGVhcnJheShzZWxmKToKKyAgICAgICAgc2FtcGxlID0gYnl0ZXMoYiJIZWxsbyB3b3JsZFxuXHg4MFx4ODFceGZlXHhmZiIpCisgICAgICAgIGJ1ZiA9IG1lbW9yeXZpZXcoc2FtcGxlKQorICAgICAgICBiID0gYnl0ZWFycmF5KGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoc2FtcGxlKSkKKworICAgIEBjaGVja19ieXRlc193YXJuaW5ncworICAgIGRlZiB0ZXN0X3RvX3N0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYicnKSwgImInJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGIneCcpLCAiYid4JyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGInXHg4MCcpLCAiYidcXHg4MCciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihieXRlYXJyYXkoYicnKSksICJieXRlYXJyYXkoYicnKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGJ5dGVhcnJheShiJ3gnKSksICJieXRlYXJyYXkoYid4JykiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihieXRlYXJyYXkoYidceDgwJykpLCAiYnl0ZWFycmF5KGInXFx4ODAnKSIpCisKKyAgICBkZWYgdGVzdF9saXRlcmFsKHNlbGYpOgorICAgICAgICB0ZXN0cyA9ICBbCisgICAgICAgICAgICAoYiJXb25kZXJmdWwgc3BhbSIsICJXb25kZXJmdWwgc3BhbSIpLAorICAgICAgICAgICAgKGJyIldvbmRlcmZ1bCBzcGFtIHRvbyIsICJXb25kZXJmdWwgc3BhbSB0b28iKSwKKyAgICAgICAgICAgIChiIlx4YWFceDAwXDAwMFwyMDAiLCAiXHhhYVx4MDBcMDAwXDIwMCIpLAorICAgICAgICAgICAgKGJyIlx4YWFceDAwXDAwMFwyMDAiLCByIlx4YWFceDAwXDAwMFwyMDAiKSwKKyAgICAgICAgXQorICAgICAgICBmb3IgYiwgcyBpbiB0ZXN0czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KHMsICdsYXRpbi0xJykpCisgICAgICAgIGZvciBjIGluIHJhbmdlKDEyOCwgMjU2KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2IiJXMiJyAlIGNocihjKSkKKworICAgIGRlZiB0ZXN0X3RyYW5zbGF0ZShzZWxmKToKKyAgICAgICAgYiA9IGInaGVsbG8nCisgICAgICAgIGJhID0gYnl0ZWFycmF5KGIpCisgICAgICAgIHJvc2V0dGEgPSBieXRlYXJyYXkocmFuZ2UoMCwgMjU2KSkKKyAgICAgICAgcm9zZXR0YVtvcmQoJ28nKV0gPSBvcmQoJ2UnKQorICAgICAgICBjID0gYi50cmFuc2xhdGUocm9zZXR0YSwgYidsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiJ2hlZScpCisgICAgICAgIGMgPSBiYS50cmFuc2xhdGUocm9zZXR0YSwgYidsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYSwgYidoZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidoZWUnKQorICAgICAgICBjID0gYi50cmFuc2xhdGUoTm9uZSwgYidlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiJ2hsbG8nKQorICAgICAgICBjID0gYmEudHJhbnNsYXRlKE5vbmUsIGInZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidobGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiLnRyYW5zbGF0ZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiYS50cmFuc2xhdGUsIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9zcGxpdF9ieXRlYXJyYXkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidhIGInLnNwbGl0KG1lbW9yeXZpZXcoYicgJykpLCBbYidhJywgYidiJ10pCisKKyAgICBkZWYgdGVzdF9yc3BsaXRfYnl0ZWFycmF5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYSBiJy5yc3BsaXQobWVtb3J5dmlldyhiJyAnKSksIFtiJ2EnLCBiJ2InXSkKKworICAgICMgT3B0aW1pemF0aW9uczoKKyAgICAjIF9faXRlcl9fPyAob3B0aW1pemF0aW9uKQorICAgICMgX19yZXZlcnNlZF9fPyAob3B0aW1pemF0aW9uKQorCisgICAgIyBYWFggTW9yZSBzdHJpbmcgbWV0aG9kcz8gIChUaG9zZSB0aGF0IGRvbid0IHVzZSBjaGFyYWN0ZXIgcHJvcGVydGllcykKKworICAgICMgVGhlcmUgYXJlIHRlc3RzIGluIHN0cmluZ190ZXN0cy5weSB0aGF0IGFyZSBtb3JlCisgICAgIyBjb21wcmVoZW5zaXZlIGZvciB0aGluZ3MgbGlrZSBzcGxpdCwgcGFydGl0aW9uLCBldGMuCisgICAgIyBVbmZvcnR1bmF0ZWx5IHRoZXkgYXJlIGFsbCBidW5kbGVkIHdpdGggdGVzdHMgdGhhdAorICAgICMgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgYnl0ZXMKKworICAgICMgSSd2ZSBzdGFydGVkIHBvcnRpbmcgc29tZSBvZiB0aG9zZSBpbnRvIGJ5dGVhcnJheV90ZXN0cy5weSwgd2Ugc2hvdWxkIHBvcnQKKyAgICAjIHRoZSByZXN0IHRoYXQgbWFrZSBzZW5zZSAodGhlIGNvZGUgY2FuIGJlIGNsZWFuZWQgdXAgdG8gdXNlIG1vZGVybgorICAgICMgdW5pdHRlc3QgbWV0aG9kcyBhdCB0aGUgc2FtZSB0aW1lKS4KKworY2xhc3MgQnl0ZWFycmF5UEVQMzEzN1Rlc3QodW5pdHRlc3QuVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgIHRlc3QuYnVmZmVyX3Rlc3RzLk1peGluQnl0ZXNCdWZmZXJDb21tb25UZXN0cyk6CisgICAgZGVmIG1hcnNoYWwoc2VsZiwgeCk6CisgICAgICAgIHJldHVybiBieXRlYXJyYXkoeCkKKworICAgIGRlZiB0ZXN0X3JldHVybnNfbmV3X2NvcHkoc2VsZik6CisgICAgICAgIHZhbCA9IHNlbGYubWFyc2hhbChiJzEyMzQnKQorICAgICAgICAjIE9uIGltbXV0YWJsZSB0eXBlcyB0aGVzZSBNQVkgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZW1zZWx2ZXMKKyAgICAgICAgIyBidXQgb24gbXV0YWJsZSB0eXBlcyBsaWtlIGJ5dGVhcnJheSB0aGV5IE1VU1QgcmV0dXJuIGEgbmV3IGNvcHkuCisgICAgICAgIGZvciBtZXRobmFtZSBpbiAoJ3pmaWxsJywgJ3JqdXN0JywgJ2xqdXN0JywgJ2NlbnRlcicpOgorICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cih2YWwsIG1ldGhuYW1lKQorICAgICAgICAgICAgbmV3dmFsID0gbWV0aG9kKDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgbmV3dmFsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbCBpcyBub3QgbmV3dmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhuYW1lKycgcmV0dXJuZWQgc2VsZiBvbiBhIG11dGFibGUgb2JqZWN0JykKKyAgICAgICAgZm9yIGV4cHIgaW4gKCd2YWwuc3BsaXQoKVswXScsICd2YWwucnNwbGl0KClbMF0nLAorICAgICAgICAgICAgICAgICAgICAgJ3ZhbC5wYXJ0aXRpb24oIi4iKVswXScsICd2YWwucnBhcnRpdGlvbigiLiIpWzJdJywKKyAgICAgICAgICAgICAgICAgICAgICd2YWwuc3BsaXRsaW5lcygpWzBdJywgJ3ZhbC5yZXBsYWNlKCIiLCAiIiknKToKKyAgICAgICAgICAgIG5ld3ZhbCA9IGV2YWwoZXhwcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCBuZXd2YWwpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsIGlzIG5vdCBuZXd2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcisnIHJldHVybmVkIHZhbCBvbiBhIG11dGFibGUgb2JqZWN0JykKKworY2xhc3MgRml4ZWRTdHJpbmdUZXN0KHRlc3Quc3RyaW5nX3Rlc3RzLkJhc2VUZXN0KToKKworICAgIGRlZiBmaXh0eXBlKHNlbGYsIG9iaik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBzdHIpOgorICAgICAgICAgICAgcmV0dXJuIG9iai5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgcmV0dXJuIHN1cGVyKEZpeGVkU3RyaW5nVGVzdCwgc2VsZikuZml4dHlwZShvYmopCisKKyAgICAjIEN1cnJlbnRseSB0aGUgYnl0ZXMgY29udGFpbm1lbnQgdGVzdGluZyB1c2VzIGEgc2luZ2xlIGludGVnZXIKKyAgICAjIHZhbHVlLiBUaGlzIG1heSBub3QgYmUgdGhlIGZpbmFsIGRlc2lnbiwgYnV0IHVudGlsIHRoZW4gdGhlCisgICAgIyBieXRlcyBzZWN0aW9uIHdpdGggaW4gYSBieXRlcyBjb250YWlubWVudCBub3QgdmFsaWQKKyAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKKyAgICAgICAgcGFzcworICAgIGRlZiB0ZXN0X2V4cGFuZHRhYnMoc2VsZik6CisgICAgICAgIHBhc3MKKyAgICBkZWYgdGVzdF91cHBlcihzZWxmKToKKyAgICAgICAgcGFzcworICAgIGRlZiB0ZXN0X2xvd2VyKHNlbGYpOgorICAgICAgICBwYXNzCisgICAgZGVmIHRlc3RfaGFzaChzZWxmKToKKyAgICAgICAgIyBYWFggY2hlY2sgdGhpcyBvdXQKKyAgICAgICAgcGFzcworCisKK2NsYXNzIEJ5dGVBcnJheUFzU3RyaW5nVGVzdChGaXhlZFN0cmluZ1Rlc3QpOgorICAgIHR5cGUydGVzdCA9IGJ5dGVhcnJheQorCisKK2NsYXNzIEJ5dGVBcnJheVN1YmNsYXNzKGJ5dGVhcnJheSk6CisgICAgcGFzcworCitjbGFzcyBCeXRlQXJyYXlTdWJjbGFzc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEJ5dGVBcnJheVN1YmNsYXNzLCBieXRlYXJyYXkpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoQnl0ZUFycmF5U3ViY2xhc3MoKSwgYnl0ZWFycmF5KQorCisgICAgICAgIGEsIGIgPSBiImFiY2QiLCBiImVmZ2giCisgICAgICAgIF9hLCBfYiA9IEJ5dGVBcnJheVN1YmNsYXNzKGEpLCBCeXRlQXJyYXlTdWJjbGFzcyhiKQorCisgICAgICAgICMgdGVzdCBjb21wYXJpc29uIG9wZXJhdG9ycyB3aXRoIHN1YmNsYXNzIGluc3RhbmNlcworICAgICAgICBzZWxmLmFzc2VydFRydWUoX2EgPT0gX2EpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfYSAhPSBfYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9hIDwgX2IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfYSA8PSBfYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9iID49IF9hKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2IgPiBfYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9hIGlzIG5vdCBhKQorCisgICAgICAgICMgdGVzdCBjb25jYXQgb2Ygc3ViY2xhc3MgaW5zdGFuY2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSArIGIsIF9hICsgX2IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSArIGIsIGEgKyBfYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICsgYiwgX2EgKyBiKQorCisgICAgICAgICMgdGVzdCByZXBlYXQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEqNSA9PSBfYSo1KQorCisgICAgZGVmIHRlc3Rfam9pbihzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgam9pbiByZXR1cm5zIGEgTkVXIG9iamVjdCBmb3Igc2luZ2xlIGl0ZW0gc2VxdWVuY2VzCisgICAgICAgICMgaW52b2x2aW5nIGEgc3ViY2xhc3MuCisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgaXQgaXMgb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUuCisgICAgICAgIHMxID0gQnl0ZUFycmF5U3ViY2xhc3MoYiJhYmNkIikKKyAgICAgICAgczIgPSBieXRlYXJyYXkoKS5qb2luKFtzMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSBpcyBub3QgczIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHMyKSBpcyBieXRlYXJyYXksIHR5cGUoczIpKQorCisgICAgICAgICMgVGVzdCByZXZlcnNlLCBjYWxsaW5nIGpvaW4gb24gc3ViY2xhc3MKKyAgICAgICAgczMgPSBzMS5qb2luKFtiImFiY2QiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoczMpIGlzIGJ5dGVhcnJheSkKKworICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKKyAgICAgICAgYSA9IEJ5dGVBcnJheVN1YmNsYXNzKGIiYWJjZCIpCisgICAgICAgIGEueCA9IDEwCisgICAgICAgIGEueSA9IEJ5dGVBcnJheVN1YmNsYXNzKGIiZWZnaCIpCisgICAgICAgIGZvciBwcm90byBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgorICAgICAgICAgICAgYiA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoYSwgcHJvdG8pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChhKSwgaWQoYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEueCwgYi54KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnksIGIueSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhKSwgdHlwZShiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhLnkpLCB0eXBlKGIueSkpCisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBhID0gQnl0ZUFycmF5U3ViY2xhc3MoYiJhYmNkIikKKyAgICAgICAgYS54ID0gMTAKKyAgICAgICAgYS55ID0gQnl0ZUFycmF5U3ViY2xhc3MoYiJlZmdoIikKKyAgICAgICAgZm9yIGNvcHlfbWV0aG9kIGluIChjb3B5LmNvcHksIGNvcHkuZGVlcGNvcHkpOgorICAgICAgICAgICAgYiA9IGNvcHlfbWV0aG9kKGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGEpLCBpZChiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS54LCBiLngpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEueSwgYi55KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGEpLCB0eXBlKGIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGEueSksIHR5cGUoYi55KSkKKworICAgIGRlZiB0ZXN0X2luaXRfb3ZlcnJpZGUoc2VsZik6CisgICAgICAgIGNsYXNzIHN1YmNsYXNzKGJ5dGVhcnJheSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmV3YXJnPTEsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgYnl0ZWFycmF5Ll9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgeCA9IHN1YmNsYXNzKDQsIHNvdXJjZT1iImFiY2QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIGIiYWJjZCIpCisgICAgICAgIHggPSBzdWJjbGFzcyhuZXdhcmc9NCwgc291cmNlPWIiYWJjZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgYiJhYmNkIikKKworZGVmIHRlc3RfbWFpbigpOgorICAgICN0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQnl0ZXNUZXN0KQorICAgICN0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQXNzb3J0ZWRCeXRlc1Rlc3QpCisgICAgI3Rlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChCeXRlc0FzU3RyaW5nVGVzdCkKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIEJ5dGVBcnJheVRlc3QsCisgICAgICAgIEJ5dGVBcnJheUFzU3RyaW5nVGVzdCwKKyAgICAgICAgQnl0ZUFycmF5U3ViY2xhc3NUZXN0LAorICAgICAgICBCeXRlYXJyYXlQRVAzMTM3VGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnl0ZXMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnl0ZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMWUwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ieXRlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnl0ZXMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnl0ZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMWUwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ieXRlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnoyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnoyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNzUxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iejIucHkKQEAgLTAsMCArMSw0ODIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgXzRHLCBiaWdtZW10ZXN0LCBpbXBvcnRfbW9kdWxlLCBmaW5kZmlsZQorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKKworYnoyID0gaW1wb3J0X21vZHVsZSgnYnoyJykKK2Zyb20gYnoyIGltcG9ydCBCWjJGaWxlLCBCWjJDb21wcmVzc29yLCBCWjJEZWNvbXByZXNzb3IKKworaGFzX2NtZGxpbmVfYnVuemlwMiA9IHN5cy5wbGF0Zm9ybSBub3QgaW4gKCJ3aW4zMiIsICJvczJlbXgiLCAicmlzY29zIikKKworY2xhc3MgQmFzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICJCYXNlIGZvciBvdGhlciB0ZXN0Y2FzZXMuIgorICAgIFRFWFQgPSAncm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaFxuYmluOng6MToxOmJpbjovYmluOlxuZGFlbW9uOng6MjoyOmRhZW1vbjovc2JpbjpcbmFkbTp4OjM6NDphZG06L3Zhci9hZG06XG5scDp4OjQ6NzpscDovdmFyL3Nwb29sL2xwZDpcbnN5bmM6eDo1OjA6c3luYzovc2JpbjovYmluL3N5bmNcbnNodXRkb3duOng6NjowOnNodXRkb3duOi9zYmluOi9zYmluL3NodXRkb3duXG5oYWx0Ong6NzowOmhhbHQ6L3NiaW46L3NiaW4vaGFsdFxubWFpbDp4Ojg6MTI6bWFpbDovdmFyL3Nwb29sL21haWw6XG5uZXdzOng6OToxMzpuZXdzOi92YXIvc3Bvb2wvbmV3czpcbnV1Y3A6eDoxMDoxNDp1dWNwOi92YXIvc3Bvb2wvdXVjcDpcbm9wZXJhdG9yOng6MTE6MDpvcGVyYXRvcjovcm9vdDpcbmdhbWVzOng6MTI6MTAwOmdhbWVzOi91c3IvZ2FtZXM6XG5nb3BoZXI6eDoxMzozMDpnb3BoZXI6L3Vzci9saWIvZ29waGVyLWRhdGE6XG5mdHA6eDoxNDo1MDpGVFAgVXNlcjovdmFyL2Z0cDovYmluL2Jhc2hcbm5vYm9keTp4OjY1NTM0OjY1NTM0Ok5vYm9keTovaG9tZTpcbnBvc3RmaXg6eDoxMDA6MTAxOnBvc3RmaXg6L3Zhci9zcG9vbC9wb3N0Zml4OlxubmllbWV5ZXI6eDo1MDA6NTAwOjovaG9tZS9uaWVtZXllcjovYmluL2Jhc2hcbnBvc3RncmVzOng6MTAxOjEwMjpQb3N0Z3JlU1FMIFNlcnZlcjovdmFyL2xpYi9wZ3NxbDovYmluL2Jhc2hcbm15c3FsOng6MTAyOjEwMzpNeVNRTCBzZXJ2ZXI6L3Zhci9saWIvbXlzcWw6L2Jpbi9iYXNoXG53d3c6eDoxMDM6MTA0OjovdmFyL3d3dzovYmluL2ZhbHNlXG4nCisgICAgREFUQSA9ICdCWmg5MUFZJlNZLlx4YzhOXHgxOFx4MDBceDAxPl9ceDgwXHgwMFx4MTBAXHgwMlx4ZmZceGYwXHgwMVx4MDduXHgwMD9ceGU3XHhmZlx4ZTAwXHgwMVx4OTlceGFhXHgwMFx4YzBceDAzRlx4ODZceDhjIyZceDgzRlx4OWFceDAzXHgwNlx4YTZceGQwXHhhNlx4OTNNXHgwZlFceGE3XHhhOFx4MDZceDgwNGhoXHgxMiRceDExXHhhNGk0XHhmMTRTXHhkMjxRXHhiNVx4MGZIXHhkM1x4ZDRceGRkXHhkNVx4ODdceGJiXHhmOFx4OTRcclx4OGZceGFmSVx4MTJceGUxXHhjOVx4ZjgvRVx4MDBwdVx4ODlceDEyXVx4YzlceGJiRExcblFceDBlXHQxXHgxMlx4ZGZceGEwXHhjMFx4OTdceGFjMk85XHg4OVx4MTNceDk0XHgwZVx4MWM3XHgwZWRceDk1SVx4MGNceGFhSlx4YTRceDE4TFx4MTBceDA1I1x4OWNceGFmXHhiYVx4YmMvXHg5N1x4OGEjQ1x4YzhceGUxXHg4Y1dceGY5XHhlMlx4ZDBceGQ2TVx4YTdceDhiWGE8ZVx4ODR0XHhjYkxceGIzXHhhN1x4ZDlceGNkXHhkMVx4Y2JceDg0Llx4YWZceGIzXHhhYlx4YWJceGFkYG59XHhhMGxoXHRFLFx4OGVaXHgxNVx4MTdWSD5ceDg4XHhlNVx4Y2Q5Z2Q2XHgwYlxuXHhlOVx4OWJceGQ1XHg4YVx4OTlceGY3XHgwOC5LXHg4ZXZceGZiXHhmN3h3XHhiYlx4ZGZceGExXHg5Mlx4ZjFceGRkfC8iO1x4YTJceGJhXHg5Zlx4ZDVceGIxI0FceGI2XHhmNlx4YjNvXHhjOVx4YzV5XFxceGViT1x4ZTdceDg1XHg5YVx4YmNceGI2ZjhceDk1Mlx4ZDVceGQ3IiVceDg5PlYsXHhmN1x4YTZ6XHhlMlx4OWZceGEzXHhkZlx4MTFceDExIlx4ZDZFKUlceGE5XHgxM15ceGNhXHhmM3JceGQwXHgwM1VceDkyMlx4ZjI2XHhlY1x4YjZceGVkXHg4Ylx4YzNVXHgxM1x4OWRceGM1XHgxNzBceGE0XHhmYV5ceDkyXHhhY0RGXHg4YVx4OTdceGQ2XHgxOVx4ZmVceGRkXHhiOFx4YmRceDFhXHg5YVx4MTlceGEzXHg4MGFua1JceDhiXHhlNVx4ZDgzXVx4YTlceGM2XHgwOFx4ODJmXHhmNlx4YjkiNmwkXHhiOGpAXHhjMFx4OGFceGIwbDEuLlx4YmFrXHg4M2xzXHgxNVx4YmNceGY0XHhjMVx4MTNceGJlXHhmOEVceGI4XHg5ZFxyXHhhOFx4OWRrXHg4NFx4ZDNuXHhmYVx4YWNRXHgwN1x4YjEleVx4YWF2XHhiNFx4MDhceGUwelx4MWJceDE2XHhmNVx4MDRceGU5XHhjY1x4YjlceDA4elx4MWVuNy5HXHhmY11ceGM5XHgxNFx4ZTFCQFx4YmIhOGAnCisgICAgREFUQV9DUkxGID0gJ0JaaDkxQVkmU1lceGFlelx4YmJOXHgwMFx4MDFIXHhkZlx4ODBceDAwXHgxMkBceDAyXHhmZlx4ZjBceDAxXHgwN25ceDAwP1x4ZTdceGZmXHhlMEBceDAxXHhiY1x4YzZgXHg4NipceDhkPU1ceGE5XHg5YVx4ODZceGQwTEBceDBmSVx4YTYhXHhhMVx4MTNceGM4XHg4OGpkaVx4OGRAXHgwM0BceDFhXHgxYVx4MGNceDBjXHg4MyBceDAwXHhjNGgyXHgxOVx4MDFceDgyRFx4ODRlXHRceGU4XHg5OVx4ODlceDE5XHgxYWhceDAwXHJceDFhXHgxMVx4YWZceDliXHgwZkdceGY1KFx4MWJceDFmP1x0XHgxMlx4Y2ZceGI1XHhmY1x4OTVFXHgwMHBzXHg4OVx4MTJeXHhhNFx4ZGRceGEyJlx4MDUoXHg4N1x4MDRceDk4XHg4OXVceGU0MCVceGI2XHgxOVwnXHg4Y1x4YzRceDg5XHhjYVx4MDdceDBlXHgxYiFceDkxVUlGVSVDXHg5OTQhRElceGQyXHhmYVx4ZjBceGYxTjhXXHhkZVx4MTNBXHhmNVx4OWNyJT9ceDlmMztJNDVBXHhkMVx4OGJUXHhiMTxsXHhiYVx4Y2JfXHhjMDB4WVx4MTdyXHgxN1x4ODhceDA4XHgwOEBceGEwXHJ5QFx4MTBceDA0JClgXHhmMlx4Y2VceDg5elx4YjBzXHhlY1x4OWIuaVdceDlkXHg4MVx4YjUtK3RceDlmXHgxYVwnXHg5N2RCXHhmNXhceGI1XHhiZS5bLlx4ZDdceDBlXHg4MVx4ZTdceDA4XHgxY05gXHg4OFx4MTBceGNhXHg4N1x4YzMhIlx4ODBceDkyUlx4YTEvXHhkMVx4YzBceGU2bWZceGFjXHhiZFx4OTlceGNjYVx4YjNceDg3ODA+XHhhNFx4YzdceDhkXHgxYVxcIlx4YWRceGExXHhhYnlCZ1x4MTVceGI5bFx4ODhceDg4XHg5MWsiXHg5NFx4YTRceGQ0XHg4OVx4YWUqXHhhNlx4MGJceDEwXHgwY1x4ZDZceGQ0bVx4ZTg2XHhlY1x4YjVqXHg4YVx4ODZqXCc7XHhjYS5ceDAxSVx4ZjJceGFhSlx4ZThceDg4XHg4Y1UrdDNceGZiXHgwY1xuXHhhMzNceDEzcjJcclx4MTZceGUwXHhiMyhceGJmXHgxZFx4ODNyXHhlN01ceGYwRFx4MTM2NVx4ZDhceDg4XHhkM1x4YTRceDkyXHhjYjJceDA2XHgwNFxcXHhjMVx4YjBceGVhLy9ceGJlayZceGQ4XHhlNit0XHhlNVx4YTFceDEzXHhhZGFceDE2XHhkZXI1InddXHhhMmlceGI3W1x4OTdSIFx4ZTJJVFx4Y2Q7Wlx4MDRkazRceGFkXHg4YVx0XHhkM1x4ODF6XHgxMFx4ZjE6XmBceGFiXHgxZlx4YzVceGRjXHg5MU5ceDE0JCtceDllXHhhZVx4ZDNceDgwJworICAgIEVNUFRZX0RBVEEgPSAnQlpoOVx4MTdyRThQXHg5MFx4MDBceDAwXHgwMFx4MDAnCisKKyAgICBpZiBoYXNfY21kbGluZV9idW56aXAyOgorICAgICAgICBkZWYgZGVjb21wcmVzcyhzZWxmLCBkYXRhKToKKyAgICAgICAgICAgIHBvcCA9IHN1YnByb2Nlc3MuUG9wZW4oImJ1bnppcDIiLCBzaGVsbD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICAgICAgICAgIHBvcC5zdGRpbi53cml0ZShkYXRhKQorICAgICAgICAgICAgcG9wLnN0ZGluLmNsb3NlKCkKKyAgICAgICAgICAgIHJldCA9IHBvcC5zdGRvdXQucmVhZCgpCisgICAgICAgICAgICBwb3Auc3Rkb3V0LmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHBvcC53YWl0KCkgIT0gMDoKKyAgICAgICAgICAgICAgICByZXQgPSBiejIuZGVjb21wcmVzcyhkYXRhKQorICAgICAgICAgICAgcmV0dXJuIHJldAorCisgICAgZWxzZToKKyAgICAgICAgIyBidW56aXAyIGlzbid0IGF2YWlsYWJsZSB0byBydW4gb24gV2luZG93cy4KKyAgICAgICAgZGVmIGRlY29tcHJlc3Moc2VsZiwgZGF0YSk6CisgICAgICAgICAgICByZXR1cm4gYnoyLmRlY29tcHJlc3MoZGF0YSkKKworCitjbGFzcyBCWjJGaWxlVGVzdChCYXNlVGVzdCk6CisgICAgIlRlc3QgQloyRmlsZSB0eXBlIG1pc2NlbGxhbmVvdXMgbWV0aG9kcy4iCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBURVNURk4KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2VsZi5maWxlbmFtZSk6CisgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5maWxlbmFtZSkKKworICAgIGRlZiBjcmVhdGVUZW1wRmlsZShzZWxmLCBjcmxmPTApOgorICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlbmFtZSwgIndiIikgYXMgZjoKKyAgICAgICAgICAgIGlmIGNybGY6CisgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuREFUQV9DUkxGCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLkRBVEEKKyAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKworICAgIGRlZiB0ZXN0UmVhZChzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLnJlYWQoKSIKKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZSgpCisgICAgICAgIHdpdGggQloyRmlsZShzZWxmLmZpbGVuYW1lKSBhcyBiejJmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiejJmLnJlYWQsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYucmVhZCgpLCBzZWxmLlRFWFQpCisKKyAgICBkZWYgdGVzdFJlYWQwKHNlbGYpOgorICAgICAgICAjIFRlc3QgQkJaMkZpbGUucmVhZCgwKSIKKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZSgpCisgICAgICAgIHdpdGggQloyRmlsZShzZWxmLmZpbGVuYW1lKSBhcyBiejJmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiejJmLnJlYWQsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYucmVhZCgwKSwgIiIpCisKKyAgICBkZWYgdGVzdFJlYWRDaHVuazEwKHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkZpbGUucmVhZCgpIGluIGNodW5rcyBvZiAxMCBieXRlcyIKKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZSgpCisgICAgICAgIHdpdGggQloyRmlsZShzZWxmLmZpbGVuYW1lKSBhcyBiejJmOgorICAgICAgICAgICAgdGV4dCA9ICcnCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHN0ciA9IGJ6MmYucmVhZCgxMCkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc3RyOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHRleHQgKz0gc3RyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIHNlbGYuVEVYVCkKKworICAgIGRlZiB0ZXN0UmVhZDEwMChzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLnJlYWQoMTAwKSIKKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZSgpCisgICAgICAgIHdpdGggQloyRmlsZShzZWxmLmZpbGVuYW1lKSBhcyBiejJmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJmLnJlYWQoMTAwKSwgc2VsZi5URVhUWzoxMDBdKQorCisgICAgZGVmIHRlc3RSZWFkTGluZShzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLnJlYWRsaW5lKCkiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSkgYXMgYnoyZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnoyZi5yZWFkbGluZSwgTm9uZSkKKyAgICAgICAgICAgIHNpbyA9IFN0cmluZ0lPKHNlbGYuVEVYVCkKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHNpby5yZWFkbGluZXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYucmVhZGxpbmUoKSwgbGluZSkKKworICAgIGRlZiB0ZXN0UmVhZExpbmVzKHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkZpbGUucmVhZGxpbmVzKCkiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSkgYXMgYnoyZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnoyZi5yZWFkbGluZXMsIE5vbmUpCisgICAgICAgICAgICBzaW8gPSBTdHJpbmdJTyhzZWxmLlRFWFQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYucmVhZGxpbmVzKCksIHNpby5yZWFkbGluZXMoKSkKKworICAgIGRlZiB0ZXN0SXRlcmF0b3Ioc2VsZik6CisgICAgICAgICMgIlRlc3QgaXRlcihCWjJGaWxlKSIKKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZSgpCisgICAgICAgIHdpdGggQloyRmlsZShzZWxmLmZpbGVuYW1lKSBhcyBiejJmOgorICAgICAgICAgICAgc2lvID0gU3RyaW5nSU8oc2VsZi5URVhUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0ZXIoYnoyZikpLCBzaW8ucmVhZGxpbmVzKCkpCisKKyAgICBkZWYgdGVzdENsb3NlZEl0ZXJhdG9yRGVhZGxvY2soc2VsZik6CisgICAgICAgICMgIlRlc3QgdGhhdCBpdGVyYXRpb24gb24gYSBjbG9zZWQgYnoyZmlsZSByZWxlYXNlcyB0aGUgbG9jay4iCisgICAgICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTMzMDkKKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZSgpCisgICAgICAgIGJ6MmYgPSBCWjJGaWxlKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGJ6MmYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiejJmLm5leHQpCisgICAgICAgICMgVGhpcyBjYWxsIHdpbGwgZGVhZGxvY2sgb2YgdGhlIGFib3ZlIC5uZXh0IGNhbGwgZmFpbGVkIHRvCisgICAgICAgICMgcmVsZWFzZSB0aGUgbG9jay4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnoyZi5yZWFkbGluZXMpCisKKyAgICBkZWYgdGVzdFhSZWFkTGluZXMoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRmlsZS54cmVhZGxpbmVzKCkiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICBiejJmID0gQloyRmlsZShzZWxmLmZpbGVuYW1lKQorICAgICAgICBzaW8gPSBTdHJpbmdJTyhzZWxmLlRFWFQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiejJmLnhyZWFkbGluZXMoKSksIHNpby5yZWFkbGluZXMoKSkKKyAgICAgICAgYnoyZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFVuaXZlcnNhbE5ld2xpbmVzTEYoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRmlsZS5yZWFkKCkgd2l0aCB1bml2ZXJzYWwgbmV3bGluZXMgKFxcbikiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICBiejJmID0gQloyRmlsZShzZWxmLmZpbGVuYW1lLCAiclUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYucmVhZCgpLCBzZWxmLlRFWFQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnoyZi5uZXdsaW5lcywgIlxuIikKKyAgICAgICAgYnoyZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFVuaXZlcnNhbE5ld2xpbmVzQ1JMRihzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLnJlYWQoKSB3aXRoIHVuaXZlcnNhbCBuZXdsaW5lcyAoXFxyXFxuKSIKKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZShjcmxmPTEpCisgICAgICAgIGJ6MmYgPSBCWjJGaWxlKHNlbGYuZmlsZW5hbWUsICJyVSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnoyZi5yZWFkKCksIHNlbGYuVEVYVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJmLm5ld2xpbmVzLCAiXHJcbiIpCisgICAgICAgIGJ6MmYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RXcml0ZShzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLndyaXRlKCkiCisgICAgICAgIHdpdGggQloyRmlsZShzZWxmLmZpbGVuYW1lLCAidyIpIGFzIGJ6MmY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJ6MmYud3JpdGUpCisgICAgICAgICAgICBiejJmLndyaXRlKHNlbGYuVEVYVCkKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZW5hbWUsICdyYicpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGVjb21wcmVzcyhmLnJlYWQoKSksIHNlbGYuVEVYVCkKKworICAgIGRlZiB0ZXN0V3JpdGVDaHVua3MxMChzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLndyaXRlKCkgd2l0aCBjaHVua3Mgb2YgMTAgYnl0ZXMiCisgICAgICAgIHdpdGggQloyRmlsZShzZWxmLmZpbGVuYW1lLCAidyIpIGFzIGJ6MmY6CisgICAgICAgICAgICBuID0gMAorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBzdHIgPSBzZWxmLlRFWFRbbioxMDoobisxKSoxMF0KKyAgICAgICAgICAgICAgICBpZiBub3Qgc3RyOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGJ6MmYud3JpdGUoc3RyKQorICAgICAgICAgICAgICAgIG4gKz0gMQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlbmFtZSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kZWNvbXByZXNzKGYucmVhZCgpKSwgc2VsZi5URVhUKQorCisgICAgZGVmIHRlc3RXcml0ZUxpbmVzKHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkZpbGUud3JpdGVsaW5lcygpIgorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSwgInciKSBhcyBiejJmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiejJmLndyaXRlbGluZXMpCisgICAgICAgICAgICBzaW8gPSBTdHJpbmdJTyhzZWxmLlRFWFQpCisgICAgICAgICAgICBiejJmLndyaXRlbGluZXMoc2lvLnJlYWRsaW5lcygpKQorICAgICAgICAjIHBhdGNoICMxNTM1NTAwCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ6MmYud3JpdGVsaW5lcywgWyJhIl0pCisgICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGVuYW1lLCAncmInKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRlY29tcHJlc3MoZi5yZWFkKCkpLCBzZWxmLlRFWFQpCisKKyAgICBkZWYgdGVzdFdyaXRlTWV0aG9kc09uUmVhZE9ubHlGaWxlKHNlbGYpOgorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSwgInciKSBhcyBiejJmOgorICAgICAgICAgICAgYnoyZi53cml0ZSgiYWJjIikKKworICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSwgInIiKSBhcyBiejJmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgYnoyZi53cml0ZSwgImEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgYnoyZi53cml0ZWxpbmVzLCBbImEiXSkKKworICAgIGRlZiB0ZXN0U2Vla0ZvcndhcmQoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRmlsZS5zZWVrKDE1MCwgMCkiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSkgYXMgYnoyZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnoyZi5zZWVrKQorICAgICAgICAgICAgYnoyZi5zZWVrKDE1MCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnoyZi5yZWFkKCksIHNlbGYuVEVYVFsxNTA6XSkKKworICAgIGRlZiB0ZXN0U2Vla0JhY2t3YXJkcyhzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLnNlZWsoLTE1MCwgMSkiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSkgYXMgYnoyZjoKKyAgICAgICAgICAgIGJ6MmYucmVhZCg1MDApCisgICAgICAgICAgICBiejJmLnNlZWsoLTE1MCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnoyZi5yZWFkKCksIHNlbGYuVEVYVFs1MDAtMTUwOl0pCisKKyAgICBkZWYgdGVzdFNlZWtCYWNrd2FyZHNGcm9tRW5kKHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkZpbGUuc2VlaygtMTUwLCAyKSIKKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZSgpCisgICAgICAgIHdpdGggQloyRmlsZShzZWxmLmZpbGVuYW1lKSBhcyBiejJmOgorICAgICAgICAgICAgYnoyZi5zZWVrKC0xNTAsIDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYucmVhZCgpLCBzZWxmLlRFWFRbbGVuKHNlbGYuVEVYVCktMTUwOl0pCisKKyAgICBkZWYgdGVzdFNlZWtQb3N0RW5kKHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkZpbGUuc2VlaygxNTAwMDApIgorICAgICAgICBzZWxmLmNyZWF0ZVRlbXBGaWxlKCkKKyAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUpIGFzIGJ6MmY6CisgICAgICAgICAgICBiejJmLnNlZWsoMTUwMDAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJmLnRlbGwoKSwgbGVuKHNlbGYuVEVYVCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYucmVhZCgpLCAiIikKKworICAgIGRlZiB0ZXN0U2Vla1Bvc3RFbmRUd2ljZShzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLnNlZWsoMTUwMDAwKSB0d2ljZSIKKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZSgpCisgICAgICAgIHdpdGggQloyRmlsZShzZWxmLmZpbGVuYW1lKSBhcyBiejJmOgorICAgICAgICAgICAgYnoyZi5zZWVrKDE1MDAwMCkKKyAgICAgICAgICAgIGJ6MmYuc2VlaygxNTAwMDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYudGVsbCgpLCBsZW4oc2VsZi5URVhUKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnoyZi5yZWFkKCksICIiKQorCisgICAgZGVmIHRlc3RTZWVrUHJlU3RhcnQoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRmlsZS5zZWVrKC0xNTAsIDApIgorICAgICAgICBzZWxmLmNyZWF0ZVRlbXBGaWxlKCkKKyAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUpIGFzIGJ6MmY6CisgICAgICAgICAgICBiejJmLnNlZWsoLTE1MCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnoyZi50ZWxsKCksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYucmVhZCgpLCBzZWxmLlRFWFQpCisKKyAgICBkZWYgdGVzdE9wZW5EZWwoc2VsZik6CisgICAgICAgICMgIlRlc3Qgb3BlbmluZyBhbmQgZGVsZXRpbmcgYSBmaWxlIG1hbnkgdGltZXMiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwMDApOgorICAgICAgICAgICAgbyA9IEJaMkZpbGUoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgICAgIGRlbCBvCisKKyAgICBkZWYgdGVzdE9wZW5Ob25leGlzdGVudChzZWxmKToKKyAgICAgICAgIyAiVGVzdCBvcGVuaW5nIGEgbm9uZXhpc3RlbnQgZmlsZSIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgQloyRmlsZSwgIi9ub24vZXhpc3RlbnQiKQorCisgICAgZGVmIHRlc3RNb2RlVShzZWxmKToKKyAgICAgICAgIyBCdWcgIzExOTQxODE6IGJ6Mi5CWjJGaWxlIG9wZW5lZCBmb3Igd3JpdGUgd2l0aCBtb2RlICJVIgorICAgICAgICBzZWxmLmNyZWF0ZVRlbXBGaWxlKCkKKyAgICAgICAgYnoyZiA9IEJaMkZpbGUoc2VsZi5maWxlbmFtZSwgIlUiKQorICAgICAgICBiejJmLmNsb3NlKCkKKyAgICAgICAgZiA9IGZpbGUoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZi5zZWVrKDAsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIGxlbihzZWxmLkRBVEEpKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0QnVnMTE5MTA0MyhzZWxmKToKKyAgICAgICAgIyByZWFkbGluZXMoKSBmb3IgZmlsZXMgY29udGFpbmluZyBubyBuZXdsaW5lCisgICAgICAgIGRhdGEgPSAnQlpoOTFBWSZTWVx4ZDliXHg4OV1ceDAwXHgwMFx4MDBceDAzXHg4MFx4MDRceDAwXHgwMlx4MDBceDBjXHgwMCBceDAwIVx4OWFoM01ceDEzPF1ceGM5XHgxNFx4ZTFCQ2VceDhhJXQnCisgICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGVuYW1lLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSkgYXMgYnoyZjoKKyAgICAgICAgICAgIGxpbmVzID0gYnoyZi5yZWFkbGluZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBbJ1Rlc3QnXSkKKyAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUpIGFzIGJ6MmY6CisgICAgICAgICAgICB4bGluZXMgPSBsaXN0KGJ6MmYucmVhZGxpbmVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeGxpbmVzLCBbJ1Rlc3QnXSkKKworICAgIGRlZiB0ZXN0Q29udGV4dFByb3RvY29sKHNlbGYpOgorICAgICAgICAjIEJaMkZpbGUgc3VwcG9ydHMgdGhlIGNvbnRleHQgbWFuYWdlbWVudCBwcm90b2NvbAorICAgICAgICBmID0gTm9uZQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSwgIndiIikgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoYiJ4eHgiKQorICAgICAgICBmID0gQloyRmlsZShzZWxmLmZpbGVuYW1lLCAicmIiKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBmOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIl9fZW50ZXJfXyBvbiBhIGNsb3NlZCBmaWxlIGRpZG4ndCByYWlzZSBhbiBleGNlcHRpb24iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSwgIndiIikgYXMgZjoKKyAgICAgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCIxIC8vIDAgZGlkbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiIpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIGRlZiB0ZXN0VGhyZWFkaW5nKHNlbGYpOgorICAgICAgICAjIFVzaW5nIGEgQloyRmlsZSBmcm9tIHNldmVyYWwgdGhyZWFkcyBkb2Vzbid0IGRlYWRsb2NrIChpc3N1ZSAjNzIwNSkuCisgICAgICAgIGRhdGEgPSAiMSIgKiAyKioyMAorICAgICAgICBudGhyZWFkcyA9IDEwCisgICAgICAgIHdpdGggYnoyLkJaMkZpbGUoc2VsZi5maWxlbmFtZSwgJ3diJykgYXMgZjoKKyAgICAgICAgICAgIGRlZiBjb21wKCk6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIHRocmVhZHMgPSBbdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9Y29tcCkgZm9yIGkgaW4gcmFuZ2UobnRocmVhZHMpXQorICAgICAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICAgICAgdC5qb2luKCkKKworICAgIGRlZiB0ZXN0TWl4ZWRJdGVyYXRpb25SZWFkcyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjODM5NzogbWl4ZWQgaXRlcmF0aW9uIGFuZCByZWFkcyBzaG91bGQgYmUgZm9yYmlkZGVuLgorICAgICAgICB3aXRoIGJ6Mi5CWjJGaWxlKHNlbGYuZmlsZW5hbWUsICd3YicpIGFzIGY6CisgICAgICAgICAgICAjIFRoZSBpbnRlcm5hbCBidWZmZXIgc2l6ZSBpcyBoYXJkLXdpcmVkIHRvIDgxOTIgYnl0ZXMsIHdlIG11c3QKKyAgICAgICAgICAgICMgd3JpdGUgb3V0IG1vcmUgdGhhbiB0aGF0IGZvciB0aGUgdGVzdCB0byBzdG9wIGhhbGYgdGhyb3VnaAorICAgICAgICAgICAgIyB0aGUgYnVmZmVyLgorICAgICAgICAgICAgZi53cml0ZShzZWxmLlRFWFQgKiAxMDApCisgICAgICAgIHdpdGggYnoyLkJaMkZpbGUoc2VsZi5maWxlbmFtZSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIG5leHQoZikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYucmVhZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYucmVhZGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLnJlYWRsaW5lcykKKworY2xhc3MgQloyQ29tcHJlc3NvclRlc3QoQmFzZVRlc3QpOgorICAgIGRlZiB0ZXN0Q29tcHJlc3Moc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyQ29tcHJlc3Nvci5jb21wcmVzcygpL2ZsdXNoKCkiCisgICAgICAgIGJ6MmMgPSBCWjJDb21wcmVzc29yKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiejJjLmNvbXByZXNzKQorICAgICAgICBkYXRhID0gYnoyYy5jb21wcmVzcyhzZWxmLlRFWFQpCisgICAgICAgIGRhdGEgKz0gYnoyYy5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kZWNvbXByZXNzKGRhdGEpLCBzZWxmLlRFWFQpCisKKyAgICBkZWYgdGVzdENvbXByZXNzRW1wdHlTdHJpbmcoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyQ29tcHJlc3Nvci5jb21wcmVzcygpL2ZsdXNoKCkgb2YgZW1wdHkgc3RyaW5nIgorICAgICAgICBiejJjID0gQloyQ29tcHJlc3NvcigpCisgICAgICAgIGRhdGEgPSBiejJjLmNvbXByZXNzKCcnKQorICAgICAgICBkYXRhICs9IGJ6MmMuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNlbGYuRU1QVFlfREFUQSkKKworICAgIGRlZiB0ZXN0Q29tcHJlc3NDaHVua3MxMChzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJDb21wcmVzc29yLmNvbXByZXNzKCkvZmx1c2goKSB3aXRoIGNodW5rcyBvZiAxMCBieXRlcyIKKyAgICAgICAgYnoyYyA9IEJaMkNvbXByZXNzb3IoKQorICAgICAgICBuID0gMAorICAgICAgICBkYXRhID0gJycKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHN0ciA9IHNlbGYuVEVYVFtuKjEwOihuKzEpKjEwXQorICAgICAgICAgICAgaWYgbm90IHN0cjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZGF0YSArPSBiejJjLmNvbXByZXNzKHN0cikKKyAgICAgICAgICAgIG4gKz0gMQorICAgICAgICBkYXRhICs9IGJ6MmMuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGVjb21wcmVzcyhkYXRhKSwgc2VsZi5URVhUKQorCisgICAgQGJpZ21lbXRlc3QoXzRHLCBtZW11c2U9MS4yNSkKKyAgICBkZWYgdGVzdEJpZ21lbShzZWxmLCBzaXplKToKKyAgICAgICAgdGV4dCA9ICJhIiAqIHNpemUKKyAgICAgICAgYnoyYyA9IGJ6Mi5CWjJDb21wcmVzc29yKCkKKyAgICAgICAgZGF0YSA9IGJ6MmMuY29tcHJlc3ModGV4dCkgKyBiejJjLmZsdXNoKCkKKyAgICAgICAgZGVsIHRleHQKKyAgICAgICAgdGV4dCA9IHNlbGYuZGVjb21wcmVzcyhkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0ZXh0KSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LnN0cmlwKCJhIiksICIiKQorCisKK2NsYXNzIEJaMkRlY29tcHJlc3NvclRlc3QoQmFzZVRlc3QpOgorICAgIGRlZiB0ZXN0X0NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEJaMkRlY29tcHJlc3NvciwgNDIpCisKKyAgICBkZWYgdGVzdERlY29tcHJlc3Moc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRGVjb21wcmVzc29yLmRlY29tcHJlc3MoKSIKKyAgICAgICAgYnoyZCA9IEJaMkRlY29tcHJlc3NvcigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnoyZC5kZWNvbXByZXNzKQorICAgICAgICB0ZXh0ID0gYnoyZC5kZWNvbXByZXNzKHNlbGYuREFUQSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBzZWxmLlRFWFQpCisKKyAgICBkZWYgdGVzdERlY29tcHJlc3NDaHVua3MxMChzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJEZWNvbXByZXNzb3IuZGVjb21wcmVzcygpIHdpdGggY2h1bmtzIG9mIDEwIGJ5dGVzIgorICAgICAgICBiejJkID0gQloyRGVjb21wcmVzc29yKCkKKyAgICAgICAgdGV4dCA9ICcnCisgICAgICAgIG4gPSAwCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBzdHIgPSBzZWxmLkRBVEFbbioxMDoobisxKSoxMF0KKyAgICAgICAgICAgIGlmIG5vdCBzdHI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRleHQgKz0gYnoyZC5kZWNvbXByZXNzKHN0cikKKyAgICAgICAgICAgIG4gKz0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIHNlbGYuVEVYVCkKKworICAgIGRlZiB0ZXN0RGVjb21wcmVzc1VudXNlZERhdGEoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRGVjb21wcmVzc29yLmRlY29tcHJlc3MoKSB3aXRoIHVudXNlZCBkYXRhIgorICAgICAgICBiejJkID0gQloyRGVjb21wcmVzc29yKCkKKyAgICAgICAgdW51c2VkX2RhdGEgPSAidGhpcyBpcyB1bnVzZWQgZGF0YSIKKyAgICAgICAgdGV4dCA9IGJ6MmQuZGVjb21wcmVzcyhzZWxmLkRBVEErdW51c2VkX2RhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgc2VsZi5URVhUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmQudW51c2VkX2RhdGEsIHVudXNlZF9kYXRhKQorCisgICAgZGVmIHRlc3RFT0ZFcnJvcihzZWxmKToKKyAgICAgICAgIyAiQ2FsbGluZyBCWjJEZWNvbXByZXNzb3IuZGVjb21wcmVzcygpIGFmdGVyIEVPUyBtdXN0IHJhaXNlIEVPRkVycm9yIgorICAgICAgICBiejJkID0gQloyRGVjb21wcmVzc29yKCkKKyAgICAgICAgdGV4dCA9IGJ6MmQuZGVjb21wcmVzcyhzZWxmLkRBVEEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBiejJkLmRlY29tcHJlc3MsICJhbnl0aGluZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBiejJkLmRlY29tcHJlc3MsICIiKQorCisgICAgQGJpZ21lbXRlc3QoXzRHLCBtZW11c2U9MS4yNSkKKyAgICBkZWYgdGVzdEJpZ21lbShzZWxmLCBzaXplKToKKyAgICAgICAgIyBJc3N1ZSAjMTQzOTg6IGRlY29tcHJlc3Npb24gZmFpbHMgd2hlbiBvdXRwdXQgZGF0YSBpcyA+PTJHQi4KKyAgICAgICAgaWYgc2l6ZSA8IF80RzoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIlRlc3QgbmVlZHMgNUdCIG9mIG1lbW9yeSB0byBydW4uIikKKyAgICAgICAgY29tcHJlc3NlZCA9IGJ6Mi5jb21wcmVzcygiYSIgKiBfNEcpCisgICAgICAgIHRleHQgPSBiejIuQloyRGVjb21wcmVzc29yKCkuZGVjb21wcmVzcyhjb21wcmVzc2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0ZXh0KSwgXzRHKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuc3RyaXAoImEiKSwgIiIpCisKKworY2xhc3MgRnVuY1Rlc3QoQmFzZVRlc3QpOgorICAgICJUZXN0IG1vZHVsZSBmdW5jdGlvbnMiCisKKyAgICBkZWYgdGVzdENvbXByZXNzKHNlbGYpOgorICAgICAgICAjICJUZXN0IGNvbXByZXNzKCkgZnVuY3Rpb24iCisgICAgICAgIGRhdGEgPSBiejIuY29tcHJlc3Moc2VsZi5URVhUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGVjb21wcmVzcyhkYXRhKSwgc2VsZi5URVhUKQorCisgICAgZGVmIHRlc3RDb21wcmVzc0VtcHR5U3RyaW5nKHNlbGYpOgorICAgICAgICAjICJUZXN0IGNvbXByZXNzKCkgb2YgZW1wdHkgc3RyaW5nIgorICAgICAgICB0ZXh0ID0gYnoyLmNvbXByZXNzKCcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIHNlbGYuRU1QVFlfREFUQSkKKworICAgIGRlZiB0ZXN0RGVjb21wcmVzcyhzZWxmKToKKyAgICAgICAgIyAiVGVzdCBkZWNvbXByZXNzKCkgZnVuY3Rpb24iCisgICAgICAgIHRleHQgPSBiejIuZGVjb21wcmVzcyhzZWxmLkRBVEEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgc2VsZi5URVhUKQorCisgICAgZGVmIHRlc3REZWNvbXByZXNzRW1wdHkoc2VsZik6CisgICAgICAgICMgIlRlc3QgZGVjb21wcmVzcygpIGZ1bmN0aW9uIHdpdGggZW1wdHkgc3RyaW5nIgorICAgICAgICB0ZXh0ID0gYnoyLmRlY29tcHJlc3MoIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgIiIpCisKKyAgICBkZWYgdGVzdERlY29tcHJlc3NUb0VtcHR5U3RyaW5nKHNlbGYpOgorICAgICAgICAjICJUZXN0IGRlY29tcHJlc3MoKSBvZiBtaW5pbWFsIGJ6MiBkYXRhIHRvIGVtcHR5IHN0cmluZyIKKyAgICAgICAgdGV4dCA9IGJ6Mi5kZWNvbXByZXNzKHNlbGYuRU1QVFlfREFUQSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCAnJykKKworICAgIGRlZiB0ZXN0RGVjb21wcmVzc0luY29tcGxldGUoc2VsZik6CisgICAgICAgICMgIlRlc3QgZGVjb21wcmVzcygpIGZ1bmN0aW9uIHdpdGggaW5jb21wbGV0ZSBkYXRhIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiejIuZGVjb21wcmVzcywgc2VsZi5EQVRBWzotMTBdKQorCisgICAgQGJpZ21lbXRlc3QoXzRHLCBtZW11c2U9MS4yNSkKKyAgICBkZWYgdGVzdENvbXByZXNzQmlnbWVtKHNlbGYsIHNpemUpOgorICAgICAgICB0ZXh0ID0gImEiICogc2l6ZQorICAgICAgICBkYXRhID0gYnoyLmNvbXByZXNzKHRleHQpCisgICAgICAgIGRlbCB0ZXh0CisgICAgICAgIHRleHQgPSBzZWxmLmRlY29tcHJlc3MoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGV4dCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zdHJpcCgiYSIpLCAiIikKKworICAgIEBiaWdtZW10ZXN0KF80RywgbWVtdXNlPTEuMjUpCisgICAgZGVmIHRlc3REZWNvbXByZXNzQmlnbWVtKHNlbGYsIHNpemUpOgorICAgICAgICAjIElzc3VlICMxNDM5ODogZGVjb21wcmVzc2lvbiBmYWlscyB3aGVuIG91dHB1dCBkYXRhIGlzID49MkdCLgorICAgICAgICBpZiBzaXplIDwgXzRHOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiVGVzdCBuZWVkcyA1R0Igb2YgbWVtb3J5IHRvIHJ1bi4iKQorICAgICAgICBjb21wcmVzc2VkID0gYnoyLmNvbXByZXNzKCJhIiAqIF80RykKKyAgICAgICAgdGV4dCA9IGJ6Mi5kZWNvbXByZXNzKGNvbXByZXNzZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRleHQpLCBfNEcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zdHJpcCgiYSIpLCAiIikKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIEJaMkZpbGVUZXN0LAorICAgICAgICBCWjJDb21wcmVzc29yVGVzdCwKKyAgICAgICAgQloyRGVjb21wcmVzc29yVGVzdCwKKyAgICAgICAgRnVuY1Rlc3QKKyAgICApCisgICAgdGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCisKKyMgdmltOnRzPTQ6c3c9NApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnoyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J6Mi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2MjJkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J6Mi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnoyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J6Mi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2MjJkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J6Mi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsZW5kYXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYWxlbmRhci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGZiNzZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsZW5kYXIucHkKQEAgLTAsMCArMSw0NzUgQEAKK2ltcG9ydCBjYWxlbmRhcgoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgbG9jYWxlCitpbXBvcnQgZGF0ZXRpbWUKKworCityZXN1bHRfMjAwNF90ZXh0ID0gIiIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwNAorCisgICAgICBKYW51YXJ5ICAgICAgICAgICAgICAgICAgIEZlYnJ1YXJ5ICAgICAgICAgICAgICAgICAgIE1hcmNoCitNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UKKyAgICAgICAgICAxICAyICAzICA0ICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgMSAgMiAgMyAgNCAgNSAgNiAgNworIDUgIDYgIDcgIDggIDkgMTAgMTEgICAgICAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgICAgICA4ICA5IDEwIDExIDEyIDEzIDE0CisxMiAxMyAxNCAxNSAxNiAxNyAxOCAgICAgICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgICAgMTUgMTYgMTcgMTggMTkgMjAgMjEKKzE5IDIwIDIxIDIyIDIzIDI0IDI1ICAgICAgMTYgMTcgMTggMTkgMjAgMjEgMjIgICAgICAyMiAyMyAyNCAyNSAyNiAyNyAyOAorMjYgMjcgMjggMjkgMzAgMzEgICAgICAgICAyMyAyNCAyNSAyNiAyNyAyOCAyOSAgICAgIDI5IDMwIDMxCisKKyAgICAgICBBcHJpbCAgICAgICAgICAgICAgICAgICAgICBNYXkgICAgICAgICAgICAgICAgICAgICAgIEp1bmUKK01vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UgICAgICBNbyBUdSBXZSBUaCBGciBTYSBTdQorICAgICAgICAgIDEgIDIgIDMgIDQgICAgICAgICAgICAgICAgICAgICAgMSAgMiAgICAgICAgICAxICAyICAzICA0ICA1ICA2CisgNSAgNiAgNyAgOCAgOSAxMCAxMSAgICAgICAzICA0ICA1ICA2ICA3ICA4ICA5ICAgICAgIDcgIDggIDkgMTAgMTEgMTIgMTMKKzEyIDEzIDE0IDE1IDE2IDE3IDE4ICAgICAgMTAgMTEgMTIgMTMgMTQgMTUgMTYgICAgICAxNCAxNSAxNiAxNyAxOCAxOSAyMAorMTkgMjAgMjEgMjIgMjMgMjQgMjUgICAgICAxNyAxOCAxOSAyMCAyMSAyMiAyMyAgICAgIDIxIDIyIDIzIDI0IDI1IDI2IDI3CisyNiAyNyAyOCAyOSAzMCAgICAgICAgICAgIDI0IDI1IDI2IDI3IDI4IDI5IDMwICAgICAgMjggMjkgMzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMzEKKworICAgICAgICBKdWx5ICAgICAgICAgICAgICAgICAgICAgQXVndXN0ICAgICAgICAgICAgICAgICAgU2VwdGVtYmVyCitNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UKKyAgICAgICAgICAxICAyICAzICA0ICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgMSAgMiAgMyAgNCAgNQorIDUgIDYgIDcgIDggIDkgMTAgMTEgICAgICAgMiAgMyAgNCAgNSAgNiAgNyAgOCAgICAgICA2ICA3ICA4ICA5IDEwIDExIDEyCisxMiAxMyAxNCAxNSAxNiAxNyAxOCAgICAgICA5IDEwIDExIDEyIDEzIDE0IDE1ICAgICAgMTMgMTQgMTUgMTYgMTcgMTggMTkKKzE5IDIwIDIxIDIyIDIzIDI0IDI1ICAgICAgMTYgMTcgMTggMTkgMjAgMjEgMjIgICAgICAyMCAyMSAyMiAyMyAyNCAyNSAyNgorMjYgMjcgMjggMjkgMzAgMzEgICAgICAgICAyMyAyNCAyNSAyNiAyNyAyOCAyOSAgICAgIDI3IDI4IDI5IDMwCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMwIDMxCisKKyAgICAgIE9jdG9iZXIgICAgICAgICAgICAgICAgICAgTm92ZW1iZXIgICAgICAgICAgICAgICAgICBEZWNlbWJlcgorTW8gVHUgV2UgVGggRnIgU2EgU3UgICAgICBNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1CisgICAgICAgICAgICAgMSAgMiAgMyAgICAgICAxICAyICAzICA0ICA1ICA2ICA3ICAgICAgICAgICAgIDEgIDIgIDMgIDQgIDUKKyA0ICA1ICA2ICA3ICA4ICA5IDEwICAgICAgIDggIDkgMTAgMTEgMTIgMTMgMTQgICAgICAgNiAgNyAgOCAgOSAxMCAxMSAxMgorMTEgMTIgMTMgMTQgMTUgMTYgMTcgICAgICAxNSAxNiAxNyAxOCAxOSAyMCAyMSAgICAgIDEzIDE0IDE1IDE2IDE3IDE4IDE5CisxOCAxOSAyMCAyMSAyMiAyMyAyNCAgICAgIDIyIDIzIDI0IDI1IDI2IDI3IDI4ICAgICAgMjAgMjEgMjIgMjMgMjQgMjUgMjYKKzI1IDI2IDI3IDI4IDI5IDMwIDMxICAgICAgMjkgMzAgICAgICAgICAgICAgICAgICAgICAyNyAyOCAyOSAzMCAzMQorIiIiCisKK3Jlc3VsdF8yMDA0X2h0bWwgPSAiIiIKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9ImFzY2lpIj8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbD4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9YXNjaWkiIC8+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJjYWxlbmRhci5jc3MiIC8+Cis8dGl0bGU+Q2FsZW5kYXIgZm9yIDIwMDQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+Cis8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJ5ZWFyIj4KKzx0cj48dGggY29sc3Bhbj0iMyIgY2xhc3M9InllYXIiPjIwMDQ8L3RoPjwvdHI+PHRyPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+SmFudWFyeTwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xPC90ZD48dGQgY2xhc3M9ImZyaSI+MjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjM8L3RkPjx0ZCBjbGFzcz0ic3VuIj40PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj41PC90ZD48dGQgY2xhc3M9InR1ZSI+NjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjc8L3RkPjx0ZCBjbGFzcz0idGh1Ij44PC90ZD48dGQgY2xhc3M9ImZyaSI+OTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjEwPC90ZD48dGQgY2xhc3M9InN1biI+MTE8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjEyPC90ZD48dGQgY2xhc3M9InR1ZSI+MTM8L3RkPjx0ZCBjbGFzcz0id2VkIj4xNDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE1PC90ZD48dGQgY2xhc3M9ImZyaSI+MTY8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xNzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE4PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xOTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjIwPC90ZD48dGQgY2xhc3M9IndlZCI+MjE8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yMjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjIzPC90ZD48dGQgY2xhc3M9InNhdCI+MjQ8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yNTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjY8L3RkPjx0ZCBjbGFzcz0idHVlIj4yNzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI4PC90ZD48dGQgY2xhc3M9InRodSI+Mjk8L3RkPjx0ZCBjbGFzcz0iZnJpIj4zMDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjMxPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPkZlYnJ1YXJ5PC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI8L3RkPjx0ZCBjbGFzcz0idHVlIj4zPC90ZD48dGQgY2xhc3M9IndlZCI+NDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjU8L3RkPjx0ZCBjbGFzcz0iZnJpIj42PC90ZD48dGQgY2xhc3M9InNhdCI+NzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjg8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjk8L3RkPjx0ZCBjbGFzcz0idHVlIj4xMDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjExPC90ZD48dGQgY2xhc3M9InRodSI+MTI8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xMzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE0PC90ZD48dGQgY2xhc3M9InN1biI+MTU8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE2PC90ZD48dGQgY2xhc3M9InR1ZSI+MTc8L3RkPjx0ZCBjbGFzcz0id2VkIj4xODwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE5PC90ZD48dGQgY2xhc3M9ImZyaSI+MjA8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yMTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjIyPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yMzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI0PC90ZD48dGQgY2xhc3M9IndlZCI+MjU8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yNjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI3PC90ZD48dGQgY2xhc3M9InNhdCI+Mjg8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yOTwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+TWFyY2g8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI8L3RkPjx0ZCBjbGFzcz0id2VkIj4zPC90ZD48dGQgY2xhc3M9InRodSI+NDwvdGQ+PHRkIGNsYXNzPSJmcmkiPjU8L3RkPjx0ZCBjbGFzcz0ic2F0Ij42PC90ZD48dGQgY2xhc3M9InN1biI+NzwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+ODwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjk8L3RkPjx0ZCBjbGFzcz0id2VkIj4xMDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjExPC90ZD48dGQgY2xhc3M9ImZyaSI+MTI8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE0PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xNTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE2PC90ZD48dGQgY2xhc3M9IndlZCI+MTc8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xODwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE5PC90ZD48dGQgY2xhc3M9InNhdCI+MjA8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yMTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjI8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI0PC90ZD48dGQgY2xhc3M9InRodSI+MjU8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yNjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI3PC90ZD48dGQgY2xhc3M9InN1biI+Mjg8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI5PC90ZD48dGQgY2xhc3M9InR1ZSI+MzA8L3RkPjx0ZCBjbGFzcz0id2VkIj4zMTwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PC90cj48dHI+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5BcHJpbDwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xPC90ZD48dGQgY2xhc3M9ImZyaSI+MjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjM8L3RkPjx0ZCBjbGFzcz0ic3VuIj40PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj41PC90ZD48dGQgY2xhc3M9InR1ZSI+NjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjc8L3RkPjx0ZCBjbGFzcz0idGh1Ij44PC90ZD48dGQgY2xhc3M9ImZyaSI+OTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjEwPC90ZD48dGQgY2xhc3M9InN1biI+MTE8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjEyPC90ZD48dGQgY2xhc3M9InR1ZSI+MTM8L3RkPjx0ZCBjbGFzcz0id2VkIj4xNDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE1PC90ZD48dGQgY2xhc3M9ImZyaSI+MTY8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xNzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE4PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xOTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjIwPC90ZD48dGQgY2xhc3M9IndlZCI+MjE8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yMjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjIzPC90ZD48dGQgY2xhc3M9InNhdCI+MjQ8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yNTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjY8L3RkPjx0ZCBjbGFzcz0idHVlIj4yNzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI4PC90ZD48dGQgY2xhc3M9InRodSI+Mjk8L3RkPjx0ZCBjbGFzcz0iZnJpIj4zMDwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPk1heTwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9InNhdCI+MTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjM8L3RkPjx0ZCBjbGFzcz0idHVlIj40PC90ZD48dGQgY2xhc3M9IndlZCI+NTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjY8L3RkPjx0ZCBjbGFzcz0iZnJpIj43PC90ZD48dGQgY2xhc3M9InNhdCI+ODwvdGQ+PHRkIGNsYXNzPSJzdW4iPjk8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjEwPC90ZD48dGQgY2xhc3M9InR1ZSI+MTE8L3RkPjx0ZCBjbGFzcz0id2VkIj4xMjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjEzPC90ZD48dGQgY2xhc3M9ImZyaSI+MTQ8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xNTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE2PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xNzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE4PC90ZD48dGQgY2xhc3M9IndlZCI+MTk8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yMDwvdGQ+PHRkIGNsYXNzPSJmcmkiPjIxPC90ZD48dGQgY2xhc3M9InNhdCI+MjI8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yMzwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjQ8L3RkPjx0ZCBjbGFzcz0idHVlIj4yNTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI2PC90ZD48dGQgY2xhc3M9InRodSI+Mjc8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yODwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI5PC90ZD48dGQgY2xhc3M9InN1biI+MzA8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjMxPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5KdW5lPC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9InR1ZSI+MTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI8L3RkPjx0ZCBjbGFzcz0idGh1Ij4zPC90ZD48dGQgY2xhc3M9ImZyaSI+NDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjU8L3RkPjx0ZCBjbGFzcz0ic3VuIj42PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj43PC90ZD48dGQgY2xhc3M9InR1ZSI+ODwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjk8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xMDwvdGQ+PHRkIGNsYXNzPSJmcmkiPjExPC90ZD48dGQgY2xhc3M9InNhdCI+MTI8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xMzwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTQ8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE2PC90ZD48dGQgY2xhc3M9InRodSI+MTc8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xODwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE5PC90ZD48dGQgY2xhc3M9InN1biI+MjA8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIxPC90ZD48dGQgY2xhc3M9InR1ZSI+MjI8L3RkPjx0ZCBjbGFzcz0id2VkIj4yMzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI0PC90ZD48dGQgY2xhc3M9ImZyaSI+MjU8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI3PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yODwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI5PC90ZD48dGQgY2xhc3M9IndlZCI+MzA8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjwvdHI+PHRyPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+SnVseTwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xPC90ZD48dGQgY2xhc3M9ImZyaSI+MjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjM8L3RkPjx0ZCBjbGFzcz0ic3VuIj40PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj41PC90ZD48dGQgY2xhc3M9InR1ZSI+NjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjc8L3RkPjx0ZCBjbGFzcz0idGh1Ij44PC90ZD48dGQgY2xhc3M9ImZyaSI+OTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjEwPC90ZD48dGQgY2xhc3M9InN1biI+MTE8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjEyPC90ZD48dGQgY2xhc3M9InR1ZSI+MTM8L3RkPjx0ZCBjbGFzcz0id2VkIj4xNDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE1PC90ZD48dGQgY2xhc3M9ImZyaSI+MTY8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xNzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE4PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xOTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjIwPC90ZD48dGQgY2xhc3M9IndlZCI+MjE8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yMjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjIzPC90ZD48dGQgY2xhc3M9InNhdCI+MjQ8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yNTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjY8L3RkPjx0ZCBjbGFzcz0idHVlIj4yNzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI4PC90ZD48dGQgY2xhc3M9InRodSI+Mjk8L3RkPjx0ZCBjbGFzcz0iZnJpIj4zMDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjMxPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPkF1Z3VzdDwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yPC90ZD48dGQgY2xhc3M9InR1ZSI+MzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij41PC90ZD48dGQgY2xhc3M9ImZyaSI+NjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjc8L3RkPjx0ZCBjbGFzcz0ic3VuIj44PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj45PC90ZD48dGQgY2xhc3M9InR1ZSI+MTA8L3RkPjx0ZCBjbGFzcz0id2VkIj4xMTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjEyPC90ZD48dGQgY2xhc3M9ImZyaSI+MTM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xNDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE1PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xNjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE3PC90ZD48dGQgY2xhc3M9IndlZCI+MTg8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xOTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjIwPC90ZD48dGQgY2xhc3M9InNhdCI+MjE8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yMjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjM8L3RkPjx0ZCBjbGFzcz0idHVlIj4yNDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI1PC90ZD48dGQgY2xhc3M9InRodSI+MjY8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yNzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI4PC90ZD48dGQgY2xhc3M9InN1biI+Mjk8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjMwPC90ZD48dGQgY2xhc3M9InR1ZSI+MzE8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5TZXB0ZW1iZXI8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yPC90ZD48dGQgY2xhc3M9ImZyaSI+MzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjQ8L3RkPjx0ZCBjbGFzcz0ic3VuIj41PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj42PC90ZD48dGQgY2xhc3M9InR1ZSI+NzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjg8L3RkPjx0ZCBjbGFzcz0idGh1Ij45PC90ZD48dGQgY2xhc3M9ImZyaSI+MTA8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjEyPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE0PC90ZD48dGQgY2xhc3M9IndlZCI+MTU8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE3PC90ZD48dGQgY2xhc3M9InNhdCI+MTg8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xOTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjA8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIyPC90ZD48dGQgY2xhc3M9InRodSI+MjM8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yNDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI1PC90ZD48dGQgY2xhc3M9InN1biI+MjY8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI3PC90ZD48dGQgY2xhc3M9InR1ZSI+Mjg8L3RkPjx0ZCBjbGFzcz0id2VkIj4yOTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjMwPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PC90cj48dHI+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5PY3RvYmVyPC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9ImZyaSI+MTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI8L3RkPjx0ZCBjbGFzcz0ic3VuIj4zPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj40PC90ZD48dGQgY2xhc3M9InR1ZSI+NTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjY8L3RkPjx0ZCBjbGFzcz0idGh1Ij43PC90ZD48dGQgY2xhc3M9ImZyaSI+ODwvdGQ+PHRkIGNsYXNzPSJzYXQiPjk8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xMDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTE8L3RkPjx0ZCBjbGFzcz0idHVlIj4xMjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjEzPC90ZD48dGQgY2xhc3M9InRodSI+MTQ8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE2PC90ZD48dGQgY2xhc3M9InN1biI+MTc8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE4PC90ZD48dGQgY2xhc3M9InR1ZSI+MTk8L3RkPjx0ZCBjbGFzcz0id2VkIj4yMDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIxPC90ZD48dGQgY2xhc3M9ImZyaSI+MjI8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yMzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI0PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI2PC90ZD48dGQgY2xhc3M9IndlZCI+Mjc8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yODwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI5PC90ZD48dGQgY2xhc3M9InNhdCI+MzA8L3RkPjx0ZCBjbGFzcz0ic3VuIj4zMTwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+Tm92ZW1iZXI8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI8L3RkPjx0ZCBjbGFzcz0id2VkIj4zPC90ZD48dGQgY2xhc3M9InRodSI+NDwvdGQ+PHRkIGNsYXNzPSJmcmkiPjU8L3RkPjx0ZCBjbGFzcz0ic2F0Ij42PC90ZD48dGQgY2xhc3M9InN1biI+NzwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+ODwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjk8L3RkPjx0ZCBjbGFzcz0id2VkIj4xMDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjExPC90ZD48dGQgY2xhc3M9ImZyaSI+MTI8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE0PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xNTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE2PC90ZD48dGQgY2xhc3M9IndlZCI+MTc8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xODwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE5PC90ZD48dGQgY2xhc3M9InNhdCI+MjA8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yMTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjI8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI0PC90ZD48dGQgY2xhc3M9InRodSI+MjU8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yNjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI3PC90ZD48dGQgY2xhc3M9InN1biI+Mjg8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI5PC90ZD48dGQgY2xhc3M9InR1ZSI+MzA8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5EZWNlbWJlcjwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9IndlZCI+MTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI8L3RkPjx0ZCBjbGFzcz0iZnJpIj4zPC90ZD48dGQgY2xhc3M9InNhdCI+NDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjU8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjY8L3RkPjx0ZCBjbGFzcz0idHVlIj43PC90ZD48dGQgY2xhc3M9IndlZCI+ODwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjk8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xMDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjExPC90ZD48dGQgY2xhc3M9InN1biI+MTI8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjEzPC90ZD48dGQgY2xhc3M9InR1ZSI+MTQ8L3RkPjx0ZCBjbGFzcz0id2VkIj4xNTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE2PC90ZD48dGQgY2xhc3M9ImZyaSI+MTc8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xODwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE5PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yMDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjIxPC90ZD48dGQgY2xhc3M9IndlZCI+MjI8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yMzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI0PC90ZD48dGQgY2xhc3M9InNhdCI+MjU8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yNjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+Mjc8L3RkPjx0ZCBjbGFzcz0idHVlIj4yODwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI5PC90ZD48dGQgY2xhc3M9InRodSI+MzA8L3RkPjx0ZCBjbGFzcz0iZnJpIj4zMTwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48L3RyPjwvdGFibGU+PC9ib2R5PgorPC9odG1sPgorIiIiCisKKworY2xhc3MgT3V0cHV0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBub3JtYWxpemVfY2FsZW5kYXIoc2VsZiwgcyk6CisgICAgICAgICMgRmlsdGVycyBvdXQgbG9jYWxlIGRlcGVuZGVudCBzdHJpbmdzCisgICAgICAgIGRlZiBuZWl0aGVyc3BhY2Vub3JkaWdpdChjKToKKyAgICAgICAgICAgIHJldHVybiBub3QgYy5pc3NwYWNlKCkgYW5kIG5vdCBjLmlzZGlnaXQoKQorCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgZm9yIGxpbmUgaW4gcy5zcGxpdGxpbmVzKEZhbHNlKToKKyAgICAgICAgICAgICMgRHJvcCB0ZXh0cywgYXMgdGhleSBhcmUgbG9jYWxlIGRlcGVuZGVudAorICAgICAgICAgICAgaWYgbGluZSBhbmQgbm90IGZpbHRlcihuZWl0aGVyc3BhY2Vub3JkaWdpdCwgbGluZSk6CisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgIHJldHVybiBsaW5lcworCisgICAgZGVmIHRlc3Rfb3V0cHV0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5ub3JtYWxpemVfY2FsZW5kYXIoY2FsZW5kYXIuY2FsZW5kYXIoMjAwNCkpLAorICAgICAgICAgICAgc2VsZi5ub3JtYWxpemVfY2FsZW5kYXIocmVzdWx0XzIwMDRfdGV4dCkKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3Rfb3V0cHV0X3RleHRjYWxlbmRhcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNhbGVuZGFyLlRleHRDYWxlbmRhcigpLmZvcm1hdHllYXIoMjAwNCkuc3RyaXAoKSwKKyAgICAgICAgICAgIHJlc3VsdF8yMDA0X3RleHQuc3RyaXAoKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9vdXRwdXRfaHRtbGNhbGVuZGFyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY2FsZW5kYXIuSFRNTENhbGVuZGFyKCkuZm9ybWF0eWVhcnBhZ2UoMjAwNCkuc3RyaXAoKSwKKyAgICAgICAgICAgIHJlc3VsdF8yMDA0X2h0bWwuc3RyaXAoKQorICAgICAgICApCisKKworY2xhc3MgQ2FsZW5kYXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfaXNsZWFwKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXR1cm4gaXMgcmlnaHQgZm9yIGEgZmV3IHllYXJzLCBhbmQKKyAgICAgICAgIyBlbnN1cmUgdGhhdCB0aGUgcmV0dXJuIHZhbHVlcyBhcmUgMSBvciAwLCBub3QganVzdCB0cnVlIG9yCisgICAgICAgICMgZmFsc2UgKHNlZSBTRiBidWcgIzQ4NTc5NCkuICBTcGVjaWZpYyBhZGRpdGlvbmFsIHRlc3RzIG1heQorICAgICAgICAjIGJlIGFwcHJvcHJpYXRlOyB0aGlzIHRlc3RzIGEgc2luZ2xlICJjeWNsZSIuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FsZW5kYXIuaXNsZWFwKDIwMDApLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGVuZGFyLmlzbGVhcCgyMDAxKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxlbmRhci5pc2xlYXAoMjAwMiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FsZW5kYXIuaXNsZWFwKDIwMDMpLCAwKQorCisgICAgZGVmIHRlc3Rfc2V0Zmlyc3R3ZWVrZGF5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjYWxlbmRhci5zZXRmaXJzdHdlZWtkYXksICdmbGFiYmVyJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2FsZW5kYXIuc2V0Zmlyc3R3ZWVrZGF5LCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2FsZW5kYXIuc2V0Zmlyc3R3ZWVrZGF5LCAyMDApCisgICAgICAgIG9yaWcgPSBjYWxlbmRhci5maXJzdHdlZWtkYXkoKQorICAgICAgICBjYWxlbmRhci5zZXRmaXJzdHdlZWtkYXkoY2FsZW5kYXIuU1VOREFZKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGVuZGFyLmZpcnN0d2Vla2RheSgpLCBjYWxlbmRhci5TVU5EQVkpCisgICAgICAgIGNhbGVuZGFyLnNldGZpcnN0d2Vla2RheShjYWxlbmRhci5NT05EQVkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FsZW5kYXIuZmlyc3R3ZWVrZGF5KCksIGNhbGVuZGFyLk1PTkRBWSkKKyAgICAgICAgY2FsZW5kYXIuc2V0Zmlyc3R3ZWVrZGF5KG9yaWcpCisKKyAgICBkZWYgdGVzdF9lbnVtZXJhdGV3ZWVrZGF5cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgY2FsZW5kYXIuZGF5X2FiYnIuX19nZXRpdGVtX18sIC0xMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgY2FsZW5kYXIuZGF5X25hbWUuX19nZXRpdGVtX18sIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihbZCBmb3IgZCBpbiBjYWxlbmRhci5kYXlfYWJicl0pLCA3KQorCisgICAgZGVmIHRlc3RfZGF5cyhzZWxmKToKKyAgICAgICAgZm9yIGF0dHIgaW4gImRheV9uYW1lIiwgImRheV9hYmJyIjoKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihjYWxlbmRhciwgYXR0cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlKSwgNykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlWzpdKSwgNykKKyAgICAgICAgICAgICMgZW5zdXJlIHRoZXkncmUgYWxsIHVuaXF1ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2V0KHZhbHVlKSksIDcpCisgICAgICAgICAgICAjIHZlcmlmeSBpdCAiYWN0cyBsaWtlIGEgc2VxdWVuY2UiIGluIHR3byBmb3JtcyBvZiBpdGVyYXRpb24KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbOjotMV0sIGxpc3QocmV2ZXJzZWQodmFsdWUpKSkKKworICAgIGRlZiB0ZXN0X21vbnRocyhzZWxmKToKKyAgICAgICAgZm9yIGF0dHIgaW4gIm1vbnRoX25hbWUiLCAibW9udGhfYWJiciI6CisgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoY2FsZW5kYXIsIGF0dHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZSksIDEzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVbOl0pLCAxMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbMF0sICIiKQorICAgICAgICAgICAgIyBlbnN1cmUgdGhleSdyZSBhbGwgdW5pcXVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXQodmFsdWUpKSwgMTMpCisgICAgICAgICAgICAjIHZlcmlmeSBpdCAiYWN0cyBsaWtlIGEgc2VxdWVuY2UiIGluIHR3byBmb3JtcyBvZiBpdGVyYXRpb24KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbOjotMV0sIGxpc3QocmV2ZXJzZWQodmFsdWUpKSkKKworICAgIGRlZiB0ZXN0X2xvY2FsZWNhbGVuZGFycyhzZWxmKToKKyAgICAgICAgIyBlbnN1cmUgdGhhdCBMb2NhbGV7VGV4dCxIVE1MfUNhbGVuZGFyIHJlc2V0cyB0aGUgbG9jYWxlIHByb3Blcmx5CisgICAgICAgICMgKGl0IGlzIHN0aWxsIG5vdCB0aHJlYWQtc2FmZSB0aG91Z2gpCisgICAgICAgIG9sZF9vY3RvYmVyID0gY2FsZW5kYXIuVGV4dENhbGVuZGFyKCkuZm9ybWF0bW9udGhuYW1lKDIwMTAsIDEwLCAxMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2FsID0gY2FsZW5kYXIuTG9jYWxlVGV4dENhbGVuZGFyKGxvY2FsZT0nJykKKyAgICAgICAgICAgIGxvY2FsX3dlZWtkYXkgPSBjYWwuZm9ybWF0d2Vla2RheSgxLCAxMCkKKyAgICAgICAgICAgIGxvY2FsX21vbnRoID0gY2FsLmZvcm1hdG1vbnRobmFtZSgyMDEwLCAxMCwgMTApCisgICAgICAgIGV4Y2VwdCBsb2NhbGUuRXJyb3I6CisgICAgICAgICAgICAjIGNhbm5vdCBzZXQgdGhlIHN5c3RlbSBkZWZhdWx0IGxvY2FsZSAtLSBza2lwIHJlc3Qgb2YgdGVzdAorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ2Nhbm5vdCBzZXQgdGhlIHN5c3RlbSBkZWZhdWx0IGxvY2FsZScpCisgICAgICAgICMgc2hvdWxkIGJlIGVuY29kYWJsZQorICAgICAgICBsb2NhbF93ZWVrZGF5LmVuY29kZSgndXRmLTgnKQorICAgICAgICBsb2NhbF9tb250aC5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9jYWxfd2Vla2RheSksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChsZW4obG9jYWxfbW9udGgpLCAxMCkKKyAgICAgICAgY2FsID0gY2FsZW5kYXIuTG9jYWxlSFRNTENhbGVuZGFyKGxvY2FsZT0nJykKKyAgICAgICAgbG9jYWxfd2Vla2RheSA9IGNhbC5mb3JtYXR3ZWVrZGF5KDEpCisgICAgICAgIGxvY2FsX21vbnRoID0gY2FsLmZvcm1hdG1vbnRobmFtZSgyMDEwLCAxMCkKKyAgICAgICAgIyBzaG91bGQgYmUgZW5jb2RhYmxlCisgICAgICAgIGxvY2FsX3dlZWtkYXkuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIGxvY2FsX21vbnRoLmVuY29kZSgndXRmLTgnKQorICAgICAgICBuZXdfb2N0b2JlciA9IGNhbGVuZGFyLlRleHRDYWxlbmRhcigpLmZvcm1hdG1vbnRobmFtZSgyMDEwLCAxMCwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2xkX29jdG9iZXIsIG5ld19vY3RvYmVyKQorCisgICAgZGVmIHRlc3RfaXRlcm1vbnRoZGF0ZXMoc2VsZik6CisgICAgICAgICMgZW5zdXJlIGl0ZXJtb250aGRhdGVzIGRvZXNuJ3Qgb3ZlcmZsb3cgYWZ0ZXIgZGF0ZXRpbWUuTUFYWUVBUgorICAgICAgICAjIHNlZSAjMTU0MjEKKyAgICAgICAgbGlzdChjYWxlbmRhci5DYWxlbmRhcigpLml0ZXJtb250aGRhdGVzKGRhdGV0aW1lLk1BWFlFQVIsIDEyKSkKKworCitjbGFzcyBNb250aENhbGVuZGFyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5vbGRmaXJzdHdlZWtkYXkgPSBjYWxlbmRhci5maXJzdHdlZWtkYXkoKQorICAgICAgICBjYWxlbmRhci5zZXRmaXJzdHdlZWtkYXkoc2VsZi5maXJzdHdlZWtkYXkpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGNhbGVuZGFyLnNldGZpcnN0d2Vla2RheShzZWxmLm9sZGZpcnN0d2Vla2RheSkKKworICAgIGRlZiBjaGVja193ZWVrcyhzZWxmLCB5ZWFyLCBtb250aCwgd2Vla3MpOgorICAgICAgICBjYWwgPSBjYWxlbmRhci5tb250aGNhbGVuZGFyKHllYXIsIG1vbnRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjYWwpLCBsZW4od2Vla3MpKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKHdlZWtzKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdlZWtzW2ldLCBzdW0oZGF5ICE9IDAgZm9yIGRheSBpbiBjYWxbaV0pKQorCisKK2NsYXNzIE1vbmRheVRlc3RDYXNlKE1vbnRoQ2FsZW5kYXJUZXN0Q2FzZSk6CisgICAgZmlyc3R3ZWVrZGF5ID0gY2FsZW5kYXIuTU9OREFZCisKKyAgICBkZWYgdGVzdF9mZWJydWFyeShzZWxmKToKKyAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBtb25kYXkgKDcrNys3KzcgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk5LCAyLCAoNywgNywgNywgNykpCisKKyAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiB0dWVzZGF5ICg2KzcrNys3KzEgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygyMDA1LCAyLCAoNiwgNywgNywgNywgMSkpCisKKyAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBzdW5kYXkgKDErNys3KzcrNiBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5ODcsIDIsICgxLCA3LCA3LCA3LCA2KSkKKworICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIG1vbmRheSAoNys3KzcrNysxIGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk4OCwgMiwgKDcsIDcsIDcsIDcsIDEpKQorCisgICAgICAgICMgQSAyOS1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gdHVlc2RheSAoNis3KzcrNysyIGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk3MiwgMiwgKDYsIDcsIDcsIDcsIDIpKQorCisgICAgICAgICMgQSAyOS1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gc3VuZGF5ICgxKzcrNys3KzcgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygyMDA0LCAyLCAoMSwgNywgNywgNywgNykpCisKKyAgICBkZWYgdGVzdF9hcHJpbChzZWxmKToKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBtb25kYXkgKDcrNys3KzcrMiBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5MzUsIDQsICg3LCA3LCA3LCA3LCAyKSkKKworICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHR1ZXNkYXkgKDYrNys3KzcrMyBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NzUsIDQsICg2LCA3LCA3LCA3LCAzKSkKKworICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHN1bmRheSAoMSs3KzcrNys3KzEgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTQ1LCA0LCAoMSwgNywgNywgNywgNywgMSkpCisKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBzYXR1cmRheSAoMis3KzcrNys3IGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk5NSwgNCwgKDIsIDcsIDcsIDcsIDcpKQorCisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gZnJpZGF5ICgzKzcrNys3KzYgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk0LCA0LCAoMywgNywgNywgNywgNikpCisKKyAgICBkZWYgdGVzdF9kZWNlbWJlcihzZWxmKToKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBtb25kYXkgKDcrNys3KzcrMyBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5ODAsIDEyLCAoNywgNywgNywgNywgMykpCisKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiB0dWVzZGF5ICg2KzcrNys3KzQgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTg3LCAxMiwgKDYsIDcsIDcsIDcsIDQpKQorCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gc3VuZGF5ICgxKzcrNys3KzcrMiBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NjgsIDEyLCAoMSwgNywgNywgNywgNywgMikpCisKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiB0aHVyc2RheSAoNCs3KzcrNys2IGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk4OCwgMTIsICg0LCA3LCA3LCA3LCA2KSkKKworICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIGZyaWRheSAoMys3KzcrNys3IGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjAxNywgMTIsICgzLCA3LCA3LCA3LCA3KSkKKworICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHNhdHVyZGF5ICgyKzcrNys3KzcrMSBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDIwNjgsIDEyLCAoMiwgNywgNywgNywgNywgMSkpCisKKworY2xhc3MgU3VuZGF5VGVzdENhc2UoTW9udGhDYWxlbmRhclRlc3RDYXNlKToKKyAgICBmaXJzdHdlZWtkYXkgPSBjYWxlbmRhci5TVU5EQVkKKworICAgIGRlZiB0ZXN0X2ZlYnJ1YXJ5KHNlbGYpOgorICAgICAgICAjIEEgMjgtZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHN1bmRheSAoNys3KzcrNyBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDIwMDksIDIsICg3LCA3LCA3LCA3KSkKKworICAgICAgICAjIEEgMjgtZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIG1vbmRheSAoNis3KzcrNysxIGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk5OSwgMiwgKDYsIDcsIDcsIDcsIDEpKQorCisgICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gc2F0dXJkYXkgKDErNys3KzcrNiBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5OTcsIDIsICgxLCA3LCA3LCA3LCA2KSkKKworICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHN1bmRheSAoNys3KzcrNysxIGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjAwNCwgMiwgKDcsIDcsIDcsIDcsIDEpKQorCisgICAgICAgICMgQSAyOS1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gbW9uZGF5ICg2KzcrNys3KzIgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTYwLCAyLCAoNiwgNywgNywgNywgMikpCisKKyAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBzYXR1cmRheSAoMSs3KzcrNys3IGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk2NCwgMiwgKDEsIDcsIDcsIDcsIDcpKQorCisgICAgZGVmIHRlc3RfYXByaWwoc2VsZik6CisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gc3VuZGF5ICg3KzcrNys3KzIgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTIzLCA0LCAoNywgNywgNywgNywgMikpCisKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBtb25kYXkgKDYrNys3KzcrMyBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5MTgsIDQsICg2LCA3LCA3LCA3LCAzKSkKKworICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHNhdHVyZGF5ICgxKzcrNys3KzcrMSBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NTAsIDQsICgxLCA3LCA3LCA3LCA3LCAxKSkKKworICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIGZyaWRheSAoMis3KzcrNys3IGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk2MCwgNCwgKDIsIDcsIDcsIDcsIDcpKQorCisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gdGh1cnNkYXkgKDMrNys3KzcrNiBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5MDksIDQsICgzLCA3LCA3LCA3LCA2KSkKKworICAgIGRlZiB0ZXN0X2RlY2VtYmVyKHNlbGYpOgorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHN1bmRheSAoNys3KzcrNyszIGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjA4MCwgMTIsICg3LCA3LCA3LCA3LCAzKSkKKworICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIG1vbmRheSAoNis3KzcrNys0IGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk0MSwgMTIsICg2LCA3LCA3LCA3LCA0KSkKKworICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHNhdHVyZGF5ICgxKzcrNys3KzcrMiBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5MjMsIDEyLCAoMSwgNywgNywgNywgNywgMikpCisKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiB3ZWRuZXNkYXkgKDQrNys3KzcrNiBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NDgsIDEyLCAoNCwgNywgNywgNywgNikpCisKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiB0aHVyc2RheSAoMys3KzcrNys3IGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTkyNywgMTIsICgzLCA3LCA3LCA3LCA3KSkKKworICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIGZyaWRheSAoMis3KzcrNys3KzEgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk1LCAxMiwgKDIsIDcsIDcsIDcsIDcsIDEpKQorCisKK2NsYXNzIE1vbnRoUmFuZ2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfamFudWFyeShzZWxmKToKKyAgICAgICAgIyBUZXN0cyB2YWxpZCBsb3dlciBib3VuZGFyeSBjYXNlLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGVuZGFyLm1vbnRocmFuZ2UoMjAwNCwxKSwgKDMsMzEpKQorCisgICAgZGVmIHRlc3RfZmVicnVhcnlfbGVhcChzZWxmKToKKyAgICAgICAgIyBUZXN0cyBGZWJydWFyeSBkdXJpbmcgbGVhcCB5ZWFyLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGVuZGFyLm1vbnRocmFuZ2UoMjAwNCwyKSwgKDYsMjkpKQorCisgICAgZGVmIHRlc3RfZmVicnVhcnlfbm9ubGVhcChzZWxmKToKKyAgICAgICAgIyBUZXN0cyBGZWJydWFyeSBpbiBub24tbGVhcCB5ZWFyLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGVuZGFyLm1vbnRocmFuZ2UoMjAxMCwyKSwgKDAsMjgpKQorCisgICAgZGVmIHRlc3RfZGVjZW1iZXIoc2VsZik6CisgICAgICAgICMgVGVzdHMgdmFsaWQgdXBwZXIgYm91bmRhcnkgY2FzZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxlbmRhci5tb250aHJhbmdlKDIwMDQsMTIpLCAoMiwzMSkpCisKKyAgICBkZWYgdGVzdF96ZXJvdGhfbW9udGgoc2VsZik6CisgICAgICAgICMgVGVzdHMgbG93IGludmFsaWQgYm91bmRhcnkgY2FzZS4KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhjYWxlbmRhci5JbGxlZ2FsTW9udGhFcnJvcik6CisgICAgICAgICAgICBjYWxlbmRhci5tb250aHJhbmdlKDIwMDQsIDApCisKKyAgICBkZWYgdGVzdF90aGlydGVlbnRoX21vbnRoKHNlbGYpOgorICAgICAgICAjIFRlc3RzIGhpZ2ggaW52YWxpZCBib3VuZGFyeSBjYXNlLgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKGNhbGVuZGFyLklsbGVnYWxNb250aEVycm9yKToKKyAgICAgICAgICAgIGNhbGVuZGFyLm1vbnRocmFuZ2UoMjAwNCwgMTMpCisKK2NsYXNzIExlYXBkYXlzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X25vX3JhbmdlKHNlbGYpOgorICAgICAgICAjIHRlc3Qgd2hlbiBubyByYW5nZSBpLmUuIHR3byBpZGVudGljYWwgeWVhcnMgYXMgYXJncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGVuZGFyLmxlYXBkYXlzKDIwMTAsMjAxMCksIDApCisKKyAgICBkZWYgdGVzdF9ub19sZWFwZGF5cyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHdoZW4gbm8gbGVhcCB5ZWFycyBpbiByYW5nZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGVuZGFyLmxlYXBkYXlzKDIwMTAsMjAxMSksIDApCisKKyAgICBkZWYgdGVzdF9ub19sZWFwZGF5c191cHBlcl9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgIyB0ZXN0IG5vIGxlYXAgeWVhcnMgaW4gcmFuZ2UsIHdoZW4gdXBwZXIgYm91bmRhcnkgaXMgYSBsZWFwIHllYXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxlbmRhci5sZWFwZGF5cygyMDEwLDIwMTIpLCAwKQorCisgICAgZGVmIHRlc3Rfb25lX2xlYXBkYXlfbG93ZXJfYm91bmRhcnkoc2VsZik6CisgICAgICAgICMgdGVzdCB3aGVuIG9uZSBsZWFwIHllYXIgaW4gcmFuZ2UsIGxvd2VyIGJvdW5kYXJ5IGlzIGxlYXAgeWVhcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGVuZGFyLmxlYXBkYXlzKDIwMTIsMjAxMyksIDEpCisKKyAgICBkZWYgdGVzdF9zZXZlcmFsX2xlYXB5ZWFyc19pbl9yYW5nZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxlbmRhci5sZWFwZGF5cygxOTk3LDIwMjApLCA1KQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBPdXRwdXRUZXN0Q2FzZSwKKyAgICAgICAgQ2FsZW5kYXJUZXN0Q2FzZSwKKyAgICAgICAgTW9uZGF5VGVzdENhc2UsCisgICAgICAgIFN1bmRheVRlc3RDYXNlLAorICAgICAgICBNb250aFJhbmdlVGVzdENhc2UsCisgICAgICAgIExlYXBkYXlzVGVzdENhc2UsCisgICAgKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGVuZGFyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGVuZGFyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjA5NTZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsZW5kYXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGVuZGFyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGVuZGFyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjA5NTZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsZW5kYXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGwucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNmMyYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYWxsLnB5CkBAIC0wLDAgKzEsMTM0IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgVGhlIHRlc3QgY2FzZXMgaGVyZSBjb3ZlciBzZXZlcmFsIHBhdGhzIHRocm91Z2ggdGhlIGZ1bmN0aW9uIGNhbGxpbmcKKyMgY29kZS4gIFRoZXkgZGVwZW5kIG9uIHRoZSBNRVRIX1hYWCBmbGFnIHRoYXQgaXMgdXNlZCB0byBkZWZpbmUgYSBDCisjIGZ1bmN0aW9uLCB3aGljaCBjYW4ndCBiZSB2ZXJpZmllZCBmcm9tIFB5dGhvbi4gIElmIHRoZSBNRVRIX1hYWCBkZWNsCisjIGZvciBhIEMgZnVuY3Rpb24gY2hhbmdlcywgdGhlc2UgdGVzdHMgbWF5IG5vdCBjb3ZlciB0aGUgcmlnaHQgcGF0aHMuCisKK2NsYXNzIENGdW5jdGlvbkNhbGxzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3ZhcmFyZ3MwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9Lmhhc19rZXkpCisKKyAgICBkZWYgdGVzdF92YXJhcmdzMShzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAge30uaGFzX2tleSgwKQorCisgICAgZGVmIHRlc3RfdmFyYXJnczIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwge30uaGFzX2tleSwgMCwgMSkKKworICAgIGRlZiB0ZXN0X3ZhcmFyZ3MwX2V4dChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAge30uaGFzX2tleSgqKCkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF92YXJhcmdzMV9leHQoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHt9Lmhhc19rZXkoKigwLCkpCisKKyAgICBkZWYgdGVzdF92YXJhcmdzMl9leHQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgICAgICB7fS5oYXNfa2V5KCooMSwgMikpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKworICAgIGRlZiB0ZXN0X3ZhcmFyZ3MwX2t3KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9Lmhhc19rZXksIHg9MikKKworICAgIGRlZiB0ZXN0X3ZhcmFyZ3MxX2t3KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9Lmhhc19rZXksIHg9MikKKworICAgIGRlZiB0ZXN0X3ZhcmFyZ3MyX2t3KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9Lmhhc19rZXksIHg9MiwgeT0yKQorCisgICAgZGVmIHRlc3Rfb2xkYXJnczBfMChzZWxmKToKKyAgICAgICAge30ua2V5cygpCisKKyAgICBkZWYgdGVzdF9vbGRhcmdzMF8xKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9LmtleXMsIDApCisKKyAgICBkZWYgdGVzdF9vbGRhcmdzMF8yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9LmtleXMsIDAsIDEpCisKKyAgICBkZWYgdGVzdF9vbGRhcmdzMF8wX2V4dChzZWxmKToKKyAgICAgICAge30ua2V5cygqKCkpCisKKyAgICBkZWYgdGVzdF9vbGRhcmdzMF8xX2V4dChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAge30ua2V5cygqKDAsKSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorCisgICAgZGVmIHRlc3Rfb2xkYXJnczBfMl9leHQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHt9LmtleXMoKigxLCAyKSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorCisgICAgZGVmIHRlc3Rfb2xkYXJnczBfMF9rdyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAge30ua2V5cyh4PTIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKworICAgIGRlZiB0ZXN0X29sZGFyZ3MwXzFfa3coc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwge30ua2V5cywgeD0yKQorCisgICAgZGVmIHRlc3Rfb2xkYXJnczBfMl9rdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS5rZXlzLCB4PTIsIHk9MikKKworICAgIGRlZiB0ZXN0X29sZGFyZ3MxXzAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgW10uY291bnQpCisKKyAgICBkZWYgdGVzdF9vbGRhcmdzMV8xKHNlbGYpOgorICAgICAgICBbXS5jb3VudCgxKQorCisgICAgZGVmIHRlc3Rfb2xkYXJnczFfMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBbXS5jb3VudCwgMSwgMikKKworICAgIGRlZiB0ZXN0X29sZGFyZ3MxXzBfZXh0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBbXS5jb3VudCgqKCkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKworICAgIGRlZiB0ZXN0X29sZGFyZ3MxXzFfZXh0KHNlbGYpOgorICAgICAgICBbXS5jb3VudCgqKDEsKSkKKworICAgIGRlZiB0ZXN0X29sZGFyZ3MxXzJfZXh0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBbXS5jb3VudCgqKDEsIDIpKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisKKyAgICBkZWYgdGVzdF9vbGRhcmdzMV8wX2t3KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFtdLmNvdW50LCB4PTIpCisKKyAgICBkZWYgdGVzdF9vbGRhcmdzMV8xX2t3KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFtdLmNvdW50LCB7fSwgeD0yKQorCisgICAgZGVmIHRlc3Rfb2xkYXJnczFfMl9rdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBbXS5jb3VudCwgeD0yLCB5PTIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ0Z1bmN0aW9uQ2FsbHMpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYWxsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNhYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYWxsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWNhYWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FwaS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhcGkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkYjNiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhcGkucHkKQEAgLTAsMCArMSwxNDAgQEAKKyMgUnVuIHRoZSBfdGVzdGNhcGkgbW9kdWxlIHRlc3RzICh0ZXN0cyBmb3IgdGhlIFB5dGhvbi9DIEFQSSk6ICBieSBkZWZuLAorIyB0aGVzZSBhcmUgYWxsIGZ1bmN0aW9ucyBfdGVzdGNhcGkgZXhwb3J0cyB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoICd0ZXN0XycuCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Cit0cnk6CisgICAgaW1wb3J0IHRocmVhZAorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWQgPSBOb25lCisgICAgdGhyZWFkaW5nID0gTm9uZQoraW1wb3J0IF90ZXN0Y2FwaQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgVGVzdFBlbmRpbmdDYWxscyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgcGVuZGluZ2NhbGxzX3N1Ym1pdChzZWxmLCBsLCBuKToKKyAgICAgICAgZGVmIGNhbGxiYWNrKCk6CisgICAgICAgICAgICAjdGhpcyBmdW5jdGlvbiBjYW4gYmUgaW50ZXJydXB0ZWQgYnkgdGhyZWFkIHN3aXRjaGluZyBzbyBsZXQncworICAgICAgICAgICAgI3VzZSBhbiBhdG9taWMgb3BlcmF0aW9uCisgICAgICAgICAgICBsLmFwcGVuZChOb25lKQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgdGltZS5zbGVlcChyYW5kb20ucmFuZG9tKCkqMC4wMikgIzAuMDEgc2VjcyBvbiBhdmVyYWdlCisgICAgICAgICAgICAjdHJ5IHN1Ym1pdHRpbmcgY2FsbGJhY2sgdW50aWwgc3VjY2Vzc2Z1bC4KKyAgICAgICAgICAgICNyZWx5IG9uIHJlZ3VsYXIgaW50ZXJydXB0IHRvIGZsdXNoIHF1ZXVlIGlmIHdlIGFyZQorICAgICAgICAgICAgI3Vuc3VjY2Vzc2Z1bC4KKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgaWYgX3Rlc3RjYXBpLl9wZW5kaW5nX3RocmVhZGZ1bmMoY2FsbGJhY2spOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgIGRlZiBwZW5kaW5nY2FsbHNfd2FpdChzZWxmLCBsLCBuLCBjb250ZXh0ID0gTm9uZSk6CisgICAgICAgICNub3csIHN0aWNrIGFyb3VuZCB1bnRpbCBsWzBdIGhhcyBncm93biB0byAxMAorICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIHdoaWxlIGxlbihsKSAhPSBuOgorICAgICAgICAgICAgI3RoaXMgYnVzeSBsb29wIGlzIHdoZXJlIHdlIGV4cGVjdCB0byBiZSBpbnRlcnJ1cHRlZCB0bworICAgICAgICAgICAgI3J1biBvdXIgY2FsbGJhY2tzLiAgTm90ZSB0aGF0IGNhbGxiYWNrcyBhcmUgb25seSBydW4gb24gdGhlCisgICAgICAgICAgICAjbWFpbiB0aHJlYWQKKyAgICAgICAgICAgIGlmIEZhbHNlIGFuZCB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiKCVpKSIlKGxlbihsKSwpLAorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMDApOgorICAgICAgICAgICAgICAgIGEgPSBpKmkKKyAgICAgICAgICAgIGlmIGNvbnRleHQgYW5kIG5vdCBjb250ZXh0LmV2ZW50LmlzX3NldCgpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY291bnQgPCAxMDAwMCwKKyAgICAgICAgICAgICAgICAidGltZW91dCB3YWl0aW5nIGZvciAlaSBjYWxsYmFja3MsIGdvdCAlaSIlKG4sIGxlbihsKSkpCisgICAgICAgIGlmIEZhbHNlIGFuZCB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIoJWkpIiUobGVuKGwpLCkKKworICAgIGRlZiB0ZXN0X3BlbmRpbmdjYWxsc190aHJlYWRlZChzZWxmKToKKyAgICAgICAgI2RvIGV2ZXJ5IGNhbGxiYWNrIG9uIGEgc2VwYXJhdGUgdGhyZWFkCisgICAgICAgIG4gPSAzMiAjdG90YWwgY2FsbGJhY2tzCisgICAgICAgIHRocmVhZHMgPSBbXQorICAgICAgICBjbGFzcyBmb28ob2JqZWN0KTpwYXNzCisgICAgICAgIGNvbnRleHQgPSBmb28oKQorICAgICAgICBjb250ZXh0LmwgPSBbXQorICAgICAgICBjb250ZXh0Lm4gPSAyICNzdWJtaXRzIHBlciB0aHJlYWQKKyAgICAgICAgY29udGV4dC5uVGhyZWFkcyA9IG4gLy8gY29udGV4dC5uCisgICAgICAgIGNvbnRleHQubkZpbmlzaGVkID0gMAorICAgICAgICBjb250ZXh0LmxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIGNvbnRleHQuZXZlbnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKGNvbnRleHQublRocmVhZHMpOgorICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYucGVuZGluZ2NhbGxzX3RocmVhZCwgYXJncyA9IChjb250ZXh0LCkpCisgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIHRocmVhZHMuYXBwZW5kKHQpCisKKyAgICAgICAgc2VsZi5wZW5kaW5nY2FsbHNfd2FpdChjb250ZXh0LmwsIG4sIGNvbnRleHQpCisKKyAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgIHQuam9pbigpCisKKyAgICBkZWYgcGVuZGluZ2NhbGxzX3RocmVhZChzZWxmLCBjb250ZXh0KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5wZW5kaW5nY2FsbHNfc3VibWl0KGNvbnRleHQubCwgY29udGV4dC5uKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgd2l0aCBjb250ZXh0LmxvY2s6CisgICAgICAgICAgICAgICAgY29udGV4dC5uRmluaXNoZWQgKz0gMQorICAgICAgICAgICAgICAgIG5GaW5pc2hlZCA9IGNvbnRleHQubkZpbmlzaGVkCisgICAgICAgICAgICAgICAgaWYgRmFsc2UgYW5kIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiZmluaXNoZWQgdGhyZWFkczogIiwgbkZpbmlzaGVkCisgICAgICAgICAgICBpZiBuRmluaXNoZWQgPT0gY29udGV4dC5uVGhyZWFkczoKKyAgICAgICAgICAgICAgICBjb250ZXh0LmV2ZW50LnNldCgpCisKKyAgICBkZWYgdGVzdF9wZW5kaW5nY2FsbHNfbm9uX3RocmVhZGVkKHNlbGYpOgorICAgICAgICAjYWdhaW4sIGp1c3QgdXNpbmcgdGhlIG1haW4gdGhyZWFkLCBsaWtlbHkgdGhleSB3aWxsIGFsbCBiZSBkaXNwYXRjaGVkIGF0CisgICAgICAgICNvbmNlLiAgSXQgaXMgb2sgdG8gYXNrIGZvciB0b28gbWFueSwgYmVjYXVzZSB3ZSBsb29wIHVudGlsIHdlIGZpbmQgYSBzbG90LgorICAgICAgICAjdGhlIGxvb3AgY2FuIGJlIGludGVycnVwdGVkIHRvIGRpc3BhdGNoLgorICAgICAgICAjdGhlcmUgYXJlIG9ubHkgMzIgZGlzcGF0Y2ggc2xvdHMsIHNvIHdlIGdvIGZvciB0d2ljZSB0aGF0IQorICAgICAgICBsID0gW10KKyAgICAgICAgbiA9IDY0CisgICAgICAgIHNlbGYucGVuZGluZ2NhbGxzX3N1Ym1pdChsLCBuKQorICAgICAgICBzZWxmLnBlbmRpbmdjYWxsc193YWl0KGwsIG4pCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nIGFuZCB0aHJlYWQsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgVGVzdFRocmVhZFN0YXRlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEB0ZXN0X3N1cHBvcnQucmVhcF90aHJlYWRzCisgICAgZGVmIHRlc3RfdGhyZWFkX3N0YXRlKHNlbGYpOgorICAgICAgICAjIHNvbWUgZXh0cmEgdGhyZWFkLXN0YXRlIHRlc3RzIGRyaXZlbiB2aWEgX3Rlc3RjYXBpCisgICAgICAgIGRlZiB0YXJnZXQoKToKKyAgICAgICAgICAgIGlkZW50cyA9IFtdCisKKyAgICAgICAgICAgIGRlZiBjYWxsYmFjaygpOgorICAgICAgICAgICAgICAgIGlkZW50cy5hcHBlbmQodGhyZWFkLmdldF9pZGVudCgpKQorCisgICAgICAgICAgICBfdGVzdGNhcGkuX3Rlc3RfdGhyZWFkX3N0YXRlKGNhbGxiYWNrKQorICAgICAgICAgICAgYSA9IGIgPSBjYWxsYmFjaworICAgICAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICAgICAgIyBDaGVjayBvdXIgbWFpbiB0aHJlYWQgaXMgaW4gdGhlIGxpc3QgZXhhY3RseSAzIHRpbWVzLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZGVudHMuY291bnQodGhyZWFkLmdldF9pZGVudCgpKSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgbWFpbiB0aHJlYWQgY29ycmVjdGx5IGluIHRoZSBsaXN0IikKKworICAgICAgICB0YXJnZXQoKQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9dGFyZ2V0KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgZm9yIG5hbWUgaW4gZGlyKF90ZXN0Y2FwaSk6CisgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgndGVzdF8nKToKKyAgICAgICAgICAgIHRlc3QgPSBnZXRhdHRyKF90ZXN0Y2FwaSwgbmFtZSkKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJpbnRlcm5hbCIsIG5hbWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ZXN0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBfdGVzdGNhcGkuZXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgdGVzdF9zdXBwb3J0LlRlc3RGYWlsZWQsIHN5cy5leGNfaW5mbygpWzFdCisKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RQZW5kaW5nQ2FsbHMsIFRlc3RUaHJlYWRTdGF0ZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FwaS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYXBpLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGZiMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FwaS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FwaS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYXBpLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGZiMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FwaS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZGFhODJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2QucHkKQEAgLTAsMCArMSwzMCBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiV2hpbXB5IHRlc3Qgc2NyaXB0IGZvciB0aGUgY2QgbW9kdWxlCisgICBSb2dlciBFLiBNYXNzZQorIiIiCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBpbXBvcnRfbW9kdWxlCisKK2NkID0gaW1wb3J0X21vZHVsZSgnY2QnKQorCitjZGF0dHJzID0gWydCTE9DS1NJWkUnLCAnQ0RST00nLCAnREFUQVNJWkUnLCAnRVJST1InLCAnTk9ESVNDJywgJ1BBVVNFRCcsICdQTEFZSU5HJywgJ1JFQURZJywKKyAgICAgICAgICAgJ1NUSUxMJywgJ19fZG9jX18nLCAnX19uYW1lX18nLCAnYXRpbWUnLCAnYXVkaW8nLCAnY2F0YWxvZycsICdjb250cm9sJywgJ2NyZWF0ZXBhcnNlcicsICdlcnJvcicsCisgICAgICAgICAgICdpZGVudCcsICdpbmRleCcsICdtc2Z0b2ZyYW1lJywgJ29wZW4nLCAncG51bScsICdwdGltZSddCisKKworIyBUaGlzIGlzIGEgdmVyeSBpbm9idHJ1c2l2ZSB0ZXN0IGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBjZCBtb2R1bGUgYW5kIGFsbCBpdHMKKyMgYXR0cmlidXRlcy4gIE1vcmUgY29tcHJlaGVuc2l2ZSBleGFtcGxlcyBjYW4gYmUgZm91bmQgaW4gRGVtby9jZCBhbmQKKyMgcmVxdWlyZSB0aGF0IHlvdSBoYXZlIGEgQ0QgYW5kIGEgQ0QgUk9NIGRyaXZlCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICAjIHRvdWNoIGFsbCB0aGUgYXR0cmlidXRlcyBvZiBjZCB3aXRob3V0IGRvaW5nIGFueXRoaW5nCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ1RvdWNoaW5nIGNkIG1vZHVsZSBhdHRyaWJ1dGVzLi4uJworICAgIGZvciBhdHRyIGluIGNkYXR0cnM6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAndG91Y2hpbmc6ICcsIGF0dHIKKyAgICAgICAgZ2V0YXR0cihjZCwgYXR0cikKKworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NkLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTRjMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NkLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTRjMDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NmZ3BhcnNlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NmZ3BhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDA3M2YwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CkBAIC0wLDAgKzEsNzM4IEBACitpbXBvcnQgQ29uZmlnUGFyc2VyCitpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgVXNlckRpY3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitjbGFzcyBTb3J0ZWREaWN0KFVzZXJEaWN0LlVzZXJEaWN0KToKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuZGF0YS5pdGVtcygpCisgICAgICAgIHJlc3VsdC5zb3J0KCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuZGF0YS5rZXlzKCkKKyAgICAgICAgcmVzdWx0LnNvcnQoKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICAjIFhYWCBuZXZlciB1c2VkPworICAgICAgICByZXN1bHQgPSBzZWxmLml0ZW1zKCkKKyAgICAgICAgcmV0dXJuIFtpWzFdIGZvciBpIGluIHJlc3VsdF0KKworICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6IHJldHVybiBpdGVyKHNlbGYuaXRlbXMoKSkKKyAgICBkZWYgaXRlcmtleXMoc2VsZik6IHJldHVybiBpdGVyKHNlbGYua2V5cygpKQorICAgIF9faXRlcl9fID0gaXRlcmtleXMKKyAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKTogcmV0dXJuIGl0ZXIoc2VsZi52YWx1ZXMoKSkKKworCitjbGFzcyBUZXN0Q2FzZUJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGFsbG93X25vX3ZhbHVlID0gRmFsc2UKKworICAgIGRlZiBuZXdjb25maWcoc2VsZiwgZGVmYXVsdHM9Tm9uZSk6CisgICAgICAgIGlmIGRlZmF1bHRzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmNmID0gc2VsZi5jb25maWdfY2xhc3MoYWxsb3dfbm9fdmFsdWU9c2VsZi5hbGxvd19ub192YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2YgPSBzZWxmLmNvbmZpZ19jbGFzcyhkZWZhdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19ub192YWx1ZT1zZWxmLmFsbG93X25vX3ZhbHVlKQorICAgICAgICByZXR1cm4gc2VsZi5jZgorCisgICAgZGVmIGZyb21zdHJpbmcoc2VsZiwgc3RyaW5nLCBkZWZhdWx0cz1Ob25lKToKKyAgICAgICAgY2YgPSBzZWxmLm5ld2NvbmZpZyhkZWZhdWx0cykKKyAgICAgICAgc2lvID0gU3RyaW5nSU8uU3RyaW5nSU8oc3RyaW5nKQorICAgICAgICBjZi5yZWFkZnAoc2lvKQorICAgICAgICByZXR1cm4gY2YKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBjb25maWdfc3RyaW5nID0gKAorICAgICAgICAgICAgIltGb28gQmFyXVxuIgorICAgICAgICAgICAgImZvbz1iYXJcbiIKKyAgICAgICAgICAgICJbU3BhY2V5IEJhcl1cbiIKKyAgICAgICAgICAgICJmb28gPSBiYXJcbiIKKyAgICAgICAgICAgICJbQ29tbWVudGVkIEJhcl1cbiIKKyAgICAgICAgICAgICJmb286IGJhciA7IGNvbW1lbnRcbiIKKyAgICAgICAgICAgICJbTG9uZyBMaW5lXVxuIgorICAgICAgICAgICAgImZvbzogdGhpcyBsaW5lIGlzIG11Y2gsIG11Y2ggbG9uZ2VyIHRoYW4gbXkgZWRpdG9yXG4iCisgICAgICAgICAgICAiICAgbGlrZXMgaXQuXG4iCisgICAgICAgICAgICAiW1NlY3Rpb25cXHdpdGgkd2VpcmQlY2hhcmFjdGVyc1tcdF1cbiIKKyAgICAgICAgICAgICJbSW50ZXJuYXRpb25hbGl6ZWQgU3R1ZmZdXG4iCisgICAgICAgICAgICAiZm9vW2JnXTogQnVsZ2FyaWFuXG4iCisgICAgICAgICAgICAiZm9vPURlZmF1bHRcbiIKKyAgICAgICAgICAgICJmb29bZW5dPUVuZ2xpc2hcbiIKKyAgICAgICAgICAgICJmb29bZGVdPURldXRzY2hcbiIKKyAgICAgICAgICAgICJbU3BhY2VzXVxuIgorICAgICAgICAgICAgImtleSB3aXRoIHNwYWNlcyA6IHZhbHVlXG4iCisgICAgICAgICAgICAiYW5vdGhlciB3aXRoIHNwYWNlcyA9IHNwbGF0IVxuIgorICAgICAgICAgICAgKQorICAgICAgICBpZiBzZWxmLmFsbG93X25vX3ZhbHVlOgorICAgICAgICAgICAgY29uZmlnX3N0cmluZyArPSAoCisgICAgICAgICAgICAgICAgIltOb1ZhbHVlXVxuIgorICAgICAgICAgICAgICAgICJvcHRpb24td2l0aG91dC12YWx1ZVxuIgorICAgICAgICAgICAgICAgICkKKworICAgICAgICBjZiA9IHNlbGYuZnJvbXN0cmluZyhjb25maWdfc3RyaW5nKQorICAgICAgICBMID0gY2Yuc2VjdGlvbnMoKQorICAgICAgICBMLnNvcnQoKQorICAgICAgICBFID0gW3InQ29tbWVudGVkIEJhcicsCisgICAgICAgICAgICAgcidGb28gQmFyJywKKyAgICAgICAgICAgICByJ0ludGVybmF0aW9uYWxpemVkIFN0dWZmJywKKyAgICAgICAgICAgICByJ0xvbmcgTGluZScsCisgICAgICAgICAgICAgcidTZWN0aW9uXHdpdGgkd2VpcmQlY2hhcmFjdGVyc1snICdcdCcsCisgICAgICAgICAgICAgcidTcGFjZXMnLAorICAgICAgICAgICAgIHInU3BhY2V5IEJhcicsCisgICAgICAgICAgICAgXQorICAgICAgICBpZiBzZWxmLmFsbG93X25vX3ZhbHVlOgorICAgICAgICAgICAgRS5hcHBlbmQocidOb1ZhbHVlJykKKyAgICAgICAgRS5zb3J0KCkKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKEwsIEUpCisKKyAgICAgICAgIyBUaGUgdXNlIG9mIHNwYWNlcyBpbiB0aGUgc2VjdGlvbiBuYW1lcyBzZXJ2ZXMgYXMgYQorICAgICAgICAjIHJlZ3Jlc3Npb24gdGVzdCBmb3IgU291cmNlRm9yZ2UgYnVnICM1ODMyNDg6CisgICAgICAgICMgaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzU4MzI0OAorICAgICAgICBlcShjZi5nZXQoJ0ZvbyBCYXInLCAnZm9vJyksICdiYXInKQorICAgICAgICBlcShjZi5nZXQoJ1NwYWNleSBCYXInLCAnZm9vJyksICdiYXInKQorICAgICAgICBlcShjZi5nZXQoJ0NvbW1lbnRlZCBCYXInLCAnZm9vJyksICdiYXInKQorICAgICAgICBlcShjZi5nZXQoJ1NwYWNlcycsICdrZXkgd2l0aCBzcGFjZXMnKSwgJ3ZhbHVlJykKKyAgICAgICAgZXEoY2YuZ2V0KCdTcGFjZXMnLCAnYW5vdGhlciB3aXRoIHNwYWNlcycpLCAnc3BsYXQhJykKKyAgICAgICAgaWYgc2VsZi5hbGxvd19ub192YWx1ZToKKyAgICAgICAgICAgIGVxKGNmLmdldCgnTm9WYWx1ZScsICdvcHRpb24td2l0aG91dC12YWx1ZScpLCBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ19fbmFtZV9fJywgY2Yub3B0aW9ucygiRm9vIEJhciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdfX25hbWVfXyAib3B0aW9uIiBzaG91bGQgbm90IGJlIGV4cG9zZWQgYnkgdGhlIEFQSSEnKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSByaWdodCB0aGluZ3MgaGFwcGVuIGZvciByZW1vdmVfb3B0aW9uKCk7CisgICAgICAgICMgYWRkZWQgdG8gaW5jbHVkZSBjaGVjayBmb3IgU291cmNlRm9yZ2UgYnVnICMxMjMzMjQ6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZi5yZW1vdmVfb3B0aW9uKCdGb28gQmFyJywgJ2ZvbycpLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlbW92ZV9vcHRpb24oKSBmYWlsZWQgdG8gcmVwb3J0IGV4aXN0ZW5jZSBvZiBvcHRpb24iKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNmLmhhc19vcHRpb24oJ0ZvbyBCYXInLCAnZm9vJyksCisgICAgICAgICAgICAgICAgICAgICJyZW1vdmVfb3B0aW9uKCkgZmFpbGVkIHRvIHJlbW92ZSBvcHRpb24iKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNmLnJlbW92ZV9vcHRpb24oJ0ZvbyBCYXInLCAnZm9vJyksCisgICAgICAgICAgICAgICAgICAgICJyZW1vdmVfb3B0aW9uKCkgZmFpbGVkIHRvIHJlcG9ydCBub24tZXhpc3RlbmNlIG9mIG9wdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgIiB0aGF0IHdhcyByZW1vdmVkIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhDb25maWdQYXJzZXIuTm9TZWN0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLnJlbW92ZV9vcHRpb24sICdObyBTdWNoIFNlY3Rpb24nLCAnZm9vJykKKworICAgICAgICBlcShjZi5nZXQoJ0xvbmcgTGluZScsICdmb28nKSwKKyAgICAgICAgICAgJ3RoaXMgbGluZSBpcyBtdWNoLCBtdWNoIGxvbmdlciB0aGFuIG15IGVkaXRvclxubGlrZXMgaXQuJykKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2Vuc2l0aXZpdHkoc2VsZik6CisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoKQorICAgICAgICBjZi5hZGRfc2VjdGlvbigiQSIpCisgICAgICAgIGNmLmFkZF9zZWN0aW9uKCJhIikKKyAgICAgICAgTCA9IGNmLnNlY3Rpb25zKCkKKyAgICAgICAgTC5zb3J0KCkKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKEwsIFsiQSIsICJhIl0pCisgICAgICAgIGNmLnNldCgiYSIsICJCIiwgInZhbHVlIikKKyAgICAgICAgZXEoY2Yub3B0aW9ucygiYSIpLCBbImIiXSkKKyAgICAgICAgZXEoY2YuZ2V0KCJhIiwgImIiKSwgInZhbHVlIiwKKyAgICAgICAgICAgImNvdWxkIG5vdCBsb2NhdGUgb3B0aW9uLCBleHBlY3RpbmcgY2FzZS1pbnNlbnNpdGl2ZSBvcHRpb24gbmFtZXMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2YuaGFzX29wdGlvbigiYSIsICJiIikpCisgICAgICAgIGNmLnNldCgiQSIsICJBLUIiLCAiQS1CIHZhbHVlIikKKyAgICAgICAgZm9yIG9wdCBpbiAoImEtYiIsICJBLWIiLCAiYS1CIiwgIkEtQiIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgIGNmLmhhc19vcHRpb24oIkEiLCBvcHQpLAorICAgICAgICAgICAgICAgICJoYXNfb3B0aW9uKCkgcmV0dXJuZWQgZmFsc2UgZm9yIG9wdGlvbiB3aGljaCBzaG91bGQgZXhpc3QiKQorICAgICAgICBlcShjZi5vcHRpb25zKCJBIiksIFsiYS1iIl0pCisgICAgICAgIGVxKGNmLm9wdGlvbnMoImEiKSwgWyJiIl0pCisgICAgICAgIGNmLnJlbW92ZV9vcHRpb24oImEiLCAiQiIpCisgICAgICAgIGVxKGNmLm9wdGlvbnMoImEiKSwgW10pCisKKyAgICAgICAgIyBTRiBidWcgIzQzMjM2OToKKyAgICAgICAgY2YgPSBzZWxmLmZyb21zdHJpbmcoCisgICAgICAgICAgICAiW015U2VjdGlvbl1cbk9wdGlvbjogZmlyc3QgbGluZVxuXHRzZWNvbmQgbGluZVxuIikKKyAgICAgICAgZXEoY2Yub3B0aW9ucygiTXlTZWN0aW9uIiksIFsib3B0aW9uIl0pCisgICAgICAgIGVxKGNmLmdldCgiTXlTZWN0aW9uIiwgIk9wdGlvbiIpLCAiZmlyc3QgbGluZVxuc2Vjb25kIGxpbmUiKQorCisgICAgICAgICMgU0YgYnVnICM1NjE4MjI6CisgICAgICAgIGNmID0gc2VsZi5mcm9tc3RyaW5nKCJbc2VjdGlvbl1cbm5la2V5PW5ldmFsdWVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzPXsia2V5IjoidmFsdWUifSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNmLmhhc19vcHRpb24oInNlY3Rpb24iLCAiS2V5IikpCisKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfY2FzZV9zZW5zaXRpdml0eShzZWxmKToKKyAgICAgICAgY2YgPSBzZWxmLm5ld2NvbmZpZyh7ImZvbyI6ICJCYXIifSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNmLmdldCgiREVGQVVMVCIsICJGb28iKSwgIkJhciIsCisgICAgICAgICAgICAiY291bGQgbm90IGxvY2F0ZSBvcHRpb24sIGV4cGVjdGluZyBjYXNlLWluc2Vuc2l0aXZlIG9wdGlvbiBuYW1lcyIpCisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoeyJGb28iOiAiQmFyIn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjZi5nZXQoIkRFRkFVTFQiLCAiRm9vIiksICJCYXIiLAorICAgICAgICAgICAgImNvdWxkIG5vdCBsb2NhdGUgb3B0aW9uLCBleHBlY3RpbmcgY2FzZS1pbnNlbnNpdGl2ZSBkZWZhdWx0cyIpCisKKyAgICBkZWYgdGVzdF9wYXJzZV9lcnJvcnMoc2VsZik6CisgICAgICAgIHNlbGYubmV3Y29uZmlnKCkKKyAgICAgICAgc2VsZi5wYXJzZV9lcnJvcihDb25maWdQYXJzZXIuUGFyc2luZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbRm9vXVxuICBleHRyYS1zcGFjZXM6IHNwbGF0XG4iKQorICAgICAgICBzZWxmLnBhcnNlX2Vycm9yKENvbmZpZ1BhcnNlci5QYXJzaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIltGb29dXG4gIGV4dHJhLXNwYWNlcz0gc3BsYXRcbiIpCisgICAgICAgIHNlbGYucGFyc2VfZXJyb3IoQ29uZmlnUGFyc2VyLlBhcnNpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiW0Zvb11cbjp2YWx1ZS13aXRob3V0LW9wdGlvbi1uYW1lXG4iKQorICAgICAgICBzZWxmLnBhcnNlX2Vycm9yKENvbmZpZ1BhcnNlci5QYXJzaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIltGb29dXG49dmFsdWUtd2l0aG91dC1vcHRpb24tbmFtZVxuIikKKyAgICAgICAgc2VsZi5wYXJzZV9lcnJvcihDb25maWdQYXJzZXIuTWlzc2luZ1NlY3Rpb25IZWFkZXJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gU2VjdGlvbiFcbiIpCisKKyAgICBkZWYgcGFyc2VfZXJyb3Ioc2VsZiwgZXhjLCBzcmMpOgorICAgICAgICBzaW8gPSBTdHJpbmdJTy5TdHJpbmdJTyhzcmMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGV4Yywgc2VsZi5jZi5yZWFkZnAsIHNpbykKKworICAgIGRlZiB0ZXN0X3F1ZXJ5X2Vycm9ycyhzZWxmKToKKyAgICAgICAgY2YgPSBzZWxmLm5ld2NvbmZpZygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2Yuc2VjdGlvbnMoKSwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5ldyBDb25maWdQYXJzZXIgc2hvdWxkIGhhdmUgbm8gZGVmaW5lZCBzZWN0aW9ucyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2YuaGFzX3NlY3Rpb24oIkZvbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJuZXcgQ29uZmlnUGFyc2VyIHNob3VsZCBoYXZlIG5vIGFja25vd2xlZGdlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInNlY3Rpb25zIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQ29uZmlnUGFyc2VyLk5vU2VjdGlvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjZi5vcHRpb25zLCAiRm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQ29uZmlnUGFyc2VyLk5vU2VjdGlvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjZi5zZXQsICJmb28iLCAiYmFyIiwgInZhbHVlIikKKyAgICAgICAgc2VsZi5nZXRfZXJyb3IoQ29uZmlnUGFyc2VyLk5vU2VjdGlvbkVycm9yLCAiZm9vIiwgImJhciIpCisgICAgICAgIGNmLmFkZF9zZWN0aW9uKCJmb28iKQorICAgICAgICBzZWxmLmdldF9lcnJvcihDb25maWdQYXJzZXIuTm9PcHRpb25FcnJvciwgImZvbyIsICJiYXIiKQorCisgICAgZGVmIGdldF9lcnJvcihzZWxmLCBleGMsIHNlY3Rpb24sIG9wdGlvbik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2YuZ2V0KHNlY3Rpb24sIG9wdGlvbikKKyAgICAgICAgZXhjZXB0IGV4YywgZToKKyAgICAgICAgICAgIHJldHVybiBlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiB0eXBlICVzLiVzIgorICAgICAgICAgICAgICAgICAgICAgICUgKGV4Yy5fX21vZHVsZV9fLCBleGMuX19uYW1lX18pKQorCisgICAgZGVmIHRlc3RfYm9vbGVhbihzZWxmKToKKyAgICAgICAgY2YgPSBzZWxmLmZyb21zdHJpbmcoCisgICAgICAgICAgICAiW0JPT0xURVNUXVxuIgorICAgICAgICAgICAgIlQxPTFcbiIKKyAgICAgICAgICAgICJUMj1UUlVFXG4iCisgICAgICAgICAgICAiVDM9VHJ1ZVxuIgorICAgICAgICAgICAgIlQ0PW9OXG4iCisgICAgICAgICAgICAiVDU9eWVzXG4iCisgICAgICAgICAgICAiRjE9MFxuIgorICAgICAgICAgICAgIkYyPUZBTFNFXG4iCisgICAgICAgICAgICAiRjM9RmFsc2VcbiIKKyAgICAgICAgICAgICJGND1vRkZcbiIKKyAgICAgICAgICAgICJGNT1uT1xuIgorICAgICAgICAgICAgIkUxPTJcbiIKKyAgICAgICAgICAgICJFMj1mb29cbiIKKyAgICAgICAgICAgICJFMz0tMVxuIgorICAgICAgICAgICAgIkU0PTAuMVxuIgorICAgICAgICAgICAgIkU1PUZBTFNFIEFORCBNT1JFIgorICAgICAgICAgICAgKQorICAgICAgICBmb3IgeCBpbiByYW5nZSgxLCA1KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZi5nZXRib29sZWFuKCdCT09MVEVTVCcsICd0JWQnICUgeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNmLmdldGJvb2xlYW4oJ0JPT0xURVNUJywgJ2YlZCcgJSB4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZi5nZXRib29sZWFuLCAnQk9PTFRFU1QnLCAnZSVkJyAlIHgpCisKKyAgICBkZWYgdGVzdF93ZWlyZF9lcnJvcnMoc2VsZik6CisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoKQorICAgICAgICBjZi5hZGRfc2VjdGlvbigiRm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQ29uZmlnUGFyc2VyLkR1cGxpY2F0ZVNlY3Rpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2YuYWRkX3NlY3Rpb24sICJGb28iKQorCisgICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6CisgICAgICAgIGNvbmZpZ19zdHJpbmcgPSAoCisgICAgICAgICAgICAiW0xvbmcgTGluZV1cbiIKKyAgICAgICAgICAgICJmb286IHRoaXMgbGluZSBpcyBtdWNoLCBtdWNoIGxvbmdlciB0aGFuIG15IGVkaXRvclxuIgorICAgICAgICAgICAgIiAgIGxpa2VzIGl0LlxuIgorICAgICAgICAgICAgIltERUZBVUxUXVxuIgorICAgICAgICAgICAgImZvbzogYW5vdGhlciB2ZXJ5XG4iCisgICAgICAgICAgICAiIGxvbmcgbGluZVxuIgorICAgICAgICAgICAgKQorICAgICAgICBpZiBzZWxmLmFsbG93X25vX3ZhbHVlOgorICAgICAgICAgICAgY29uZmlnX3N0cmluZyArPSAoCisgICAgICAgICAgICAiW1ZhbHVlbGVzc11cbiIKKyAgICAgICAgICAgICJvcHRpb24td2l0aG91dC12YWx1ZVxuIgorICAgICAgICAgICAgKQorCisgICAgICAgIGNmID0gc2VsZi5mcm9tc3RyaW5nKGNvbmZpZ19zdHJpbmcpCisgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgY2Yud3JpdGUob3V0cHV0KQorICAgICAgICBleHBlY3Rfc3RyaW5nID0gKAorICAgICAgICAgICAgIltERUZBVUxUXVxuIgorICAgICAgICAgICAgImZvbyA9IGFub3RoZXIgdmVyeVxuIgorICAgICAgICAgICAgIlx0bG9uZyBsaW5lXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiW0xvbmcgTGluZV1cbiIKKyAgICAgICAgICAgICJmb28gPSB0aGlzIGxpbmUgaXMgbXVjaCwgbXVjaCBsb25nZXIgdGhhbiBteSBlZGl0b3JcbiIKKyAgICAgICAgICAgICJcdGxpa2VzIGl0LlxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgKQorICAgICAgICBpZiBzZWxmLmFsbG93X25vX3ZhbHVlOgorICAgICAgICAgICAgZXhwZWN0X3N0cmluZyArPSAoCisgICAgICAgICAgICAgICAgIltWYWx1ZWxlc3NdXG4iCisgICAgICAgICAgICAgICAgIm9wdGlvbi13aXRob3V0LXZhbHVlXG4iCisgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQuZ2V0dmFsdWUoKSwgZXhwZWN0X3N0cmluZykKKworICAgIGRlZiB0ZXN0X3NldF9zdHJpbmdfdHlwZXMoc2VsZik6CisgICAgICAgIGNmID0gc2VsZi5mcm9tc3RyaW5nKCJbc2VjdF1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbjE9Zm9vXG4iKQorICAgICAgICAjIENoZWNrIHRoYXQgd2UgZG9uJ3QgZ2V0IGFuIGV4Y2VwdGlvbiB3aGVuIHNldHRpbmcgdmFsdWVzIGluCisgICAgICAgICMgYW4gZXhpc3Rpbmcgc2VjdGlvbiB1c2luZyBzdHJpbmdzOgorICAgICAgICBjbGFzcyBteXN0cihzdHIpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjZi5zZXQoInNlY3QiLCAib3B0aW9uMSIsICJzcGxhdCIpCisgICAgICAgIGNmLnNldCgic2VjdCIsICJvcHRpb24xIiwgbXlzdHIoInNwbGF0IikpCisgICAgICAgIGNmLnNldCgic2VjdCIsICJvcHRpb24yIiwgInNwbGF0IikKKyAgICAgICAgY2Yuc2V0KCJzZWN0IiwgIm9wdGlvbjIiLCBteXN0cigic3BsYXQiKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdW5pY29kZQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2Yuc2V0KCJzZWN0IiwgIm9wdGlvbjEiLCB1bmljb2RlKCJzcGxhdCIpKQorICAgICAgICAgICAgY2Yuc2V0KCJzZWN0IiwgIm9wdGlvbjIiLCB1bmljb2RlKCJzcGxhdCIpKQorCisgICAgZGVmIHRlc3RfcmVhZF9yZXR1cm5zX2ZpbGVfbGlzdChzZWxmKToKKyAgICAgICAgZmlsZTEgPSB0ZXN0X3N1cHBvcnQuZmluZGZpbGUoImNmZ3BhcnNlci4xIikKKyAgICAgICAgIyBjaGVjayB3aGVuIHdlIHBhc3MgYSBtaXggb2YgcmVhZGFibGUgYW5kIG5vbi1yZWFkYWJsZSBmaWxlczoKKyAgICAgICAgY2YgPSBzZWxmLm5ld2NvbmZpZygpCisgICAgICAgIHBhcnNlZF9maWxlcyA9IGNmLnJlYWQoW2ZpbGUxLCAibm9uZXhpc3RlbnQtZmlsZSJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZF9maWxlcywgW2ZpbGUxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5nZXQoIkZvbyBCYXIiLCAiZm9vIiksICJuZXdiYXIiKQorICAgICAgICAjIGNoZWNrIHdoZW4gd2UgcGFzcyBvbmx5IGEgZmlsZW5hbWU6CisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoKQorICAgICAgICBwYXJzZWRfZmlsZXMgPSBjZi5yZWFkKGZpbGUxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZF9maWxlcywgW2ZpbGUxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5nZXQoIkZvbyBCYXIiLCAiZm9vIiksICJuZXdiYXIiKQorICAgICAgICAjIGNoZWNrIHdoZW4gd2UgcGFzcyBvbmx5IG1pc3NpbmcgZmlsZXM6CisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoKQorICAgICAgICBwYXJzZWRfZmlsZXMgPSBjZi5yZWFkKFsibm9uZXhpc3RlbnQtZmlsZSJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZF9maWxlcywgW10pCisgICAgICAgICMgY2hlY2sgd2hlbiB3ZSBwYXNzIG5vIGZpbGVzOgorICAgICAgICBjZiA9IHNlbGYubmV3Y29uZmlnKCkKKyAgICAgICAgcGFyc2VkX2ZpbGVzID0gY2YucmVhZChbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWRfZmlsZXMsIFtdKQorCisgICAgIyBzaGFyZWQgYnkgc3ViY2xhc3NlcworICAgIGRlZiBnZXRfaW50ZXJwb2xhdGlvbl9jb25maWcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmZyb21zdHJpbmcoCisgICAgICAgICAgICAiW0Zvb11cbiIKKyAgICAgICAgICAgICJiYXI9c29tZXRoaW5nICUod2l0aDEpcyBpbnRlcnBvbGF0aW9uICgxIHN0ZXApXG4iCisgICAgICAgICAgICAiYmFyOT1zb21ldGhpbmcgJSh3aXRoOSlzIGxvdHMgb2YgaW50ZXJwb2xhdGlvbiAoOSBzdGVwcylcbiIKKyAgICAgICAgICAgICJiYXIxMD1zb21ldGhpbmcgJSh3aXRoMTApcyBsb3RzIG9mIGludGVycG9sYXRpb24gKDEwIHN0ZXBzKVxuIgorICAgICAgICAgICAgImJhcjExPXNvbWV0aGluZyAlKHdpdGgxMSlzIGxvdHMgb2YgaW50ZXJwb2xhdGlvbiAoMTEgc3RlcHMpXG4iCisgICAgICAgICAgICAid2l0aDExPSUod2l0aDEwKXNcbiIKKyAgICAgICAgICAgICJ3aXRoMTA9JSh3aXRoOSlzXG4iCisgICAgICAgICAgICAid2l0aDk9JSh3aXRoOClzXG4iCisgICAgICAgICAgICAid2l0aDg9JShXaXRoNylzXG4iCisgICAgICAgICAgICAid2l0aDc9JShXSVRINilzXG4iCisgICAgICAgICAgICAid2l0aDY9JSh3aXRoNSlzXG4iCisgICAgICAgICAgICAiV2l0aDU9JSh3aXRoNClzXG4iCisgICAgICAgICAgICAiV0lUSDQ9JSh3aXRoMylzXG4iCisgICAgICAgICAgICAid2l0aDM9JSh3aXRoMilzXG4iCisgICAgICAgICAgICAid2l0aDI9JSh3aXRoMSlzXG4iCisgICAgICAgICAgICAid2l0aDE9d2l0aFxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIltNdXR1YWwgUmVjdXJzaW9uXVxuIgorICAgICAgICAgICAgImZvbz0lKGJhcilzXG4iCisgICAgICAgICAgICAiYmFyPSUoZm9vKXNcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICJbSW50ZXJwb2xhdGlvbiBFcnJvcl1cbiIKKyAgICAgICAgICAgICJuYW1lPSUocmVmZXJlbmNlKXNcbiIsCisgICAgICAgICAgICAjIG5vIGRlZmluaXRpb24gZm9yICdyZWZlcmVuY2UnCisgICAgICAgICAgICBkZWZhdWx0cz17ImdldG5hbWUiOiAiJShfX25hbWVfXylzIn0pCisKKyAgICBkZWYgY2hlY2tfaXRlbXNfY29uZmlnKHNlbGYsIGV4cGVjdGVkKToKKyAgICAgICAgY2YgPSBzZWxmLmZyb21zdHJpbmcoCisgICAgICAgICAgICAiW3NlY3Rpb25dXG4iCisgICAgICAgICAgICAibmFtZSA9IHZhbHVlXG4iCisgICAgICAgICAgICAia2V5OiB8JShuYW1lKXN8IFxuIgorICAgICAgICAgICAgImdldGRlZmF1bHQ6IHwlKGRlZmF1bHQpc3xcbiIKKyAgICAgICAgICAgICJnZXRuYW1lOiB8JShfX25hbWVfXylzfCIsCisgICAgICAgICAgICBkZWZhdWx0cz17ImRlZmF1bHQiOiAiPGRlZmF1bHQ+In0pCisgICAgICAgIEwgPSBsaXN0KGNmLml0ZW1zKCJzZWN0aW9uIikpCisgICAgICAgIEwuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTCwgZXhwZWN0ZWQpCisKKworY2xhc3MgQ29uZmlnUGFyc2VyVGVzdENhc2UoVGVzdENhc2VCYXNlKToKKyAgICBjb25maWdfY2xhc3MgPSBDb25maWdQYXJzZXIuQ29uZmlnUGFyc2VyCisgICAgYWxsb3dfbm9fdmFsdWUgPSBUcnVlCisKKyAgICBkZWYgdGVzdF9pbnRlcnBvbGF0aW9uKHNlbGYpOgorICAgICAgICByYXd2YWwgPSB7CisgICAgICAgICAgICBDb25maWdQYXJzZXIuQ29uZmlnUGFyc2VyOiAoInNvbWV0aGluZyAlKHdpdGgxMSlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG90cyBvZiBpbnRlcnBvbGF0aW9uICgxMSBzdGVwcykiKSwKKyAgICAgICAgICAgIENvbmZpZ1BhcnNlci5TYWZlQ29uZmlnUGFyc2VyOiAiJSh3aXRoMSlzIiwKKyAgICAgICAgfQorICAgICAgICBjZiA9IHNlbGYuZ2V0X2ludGVycG9sYXRpb25fY29uZmlnKCkKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGNmLmdldCgiRm9vIiwgImdldG5hbWUiKSwgIkZvbyIpCisgICAgICAgIGVxKGNmLmdldCgiRm9vIiwgImJhciIpLCAic29tZXRoaW5nIHdpdGggaW50ZXJwb2xhdGlvbiAoMSBzdGVwKSIpCisgICAgICAgIGVxKGNmLmdldCgiRm9vIiwgImJhcjkiKSwKKyAgICAgICAgICAgInNvbWV0aGluZyB3aXRoIGxvdHMgb2YgaW50ZXJwb2xhdGlvbiAoOSBzdGVwcykiKQorICAgICAgICBlcShjZi5nZXQoIkZvbyIsICJiYXIxMCIpLAorICAgICAgICAgICAic29tZXRoaW5nIHdpdGggbG90cyBvZiBpbnRlcnBvbGF0aW9uICgxMCBzdGVwcykiKQorICAgICAgICBzZWxmLmdldF9lcnJvcihDb25maWdQYXJzZXIuSW50ZXJwb2xhdGlvbkRlcHRoRXJyb3IsICJGb28iLCAiYmFyMTEiKQorCisgICAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbl9taXNzaW5nX3ZhbHVlKHNlbGYpOgorICAgICAgICBzZWxmLmdldF9pbnRlcnBvbGF0aW9uX2NvbmZpZygpCisgICAgICAgIGUgPSBzZWxmLmdldF9lcnJvcihDb25maWdQYXJzZXIuSW50ZXJwb2xhdGlvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVycG9sYXRpb24gRXJyb3IiLCAibmFtZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5yZWZlcmVuY2UsICJyZWZlcmVuY2UiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuc2VjdGlvbiwgIkludGVycG9sYXRpb24gRXJyb3IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUub3B0aW9uLCAibmFtZSIpCisKKyAgICBkZWYgdGVzdF9pdGVtcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pdGVtc19jb25maWcoWygnZGVmYXVsdCcsICc8ZGVmYXVsdD4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZ2V0ZGVmYXVsdCcsICd8PGRlZmF1bHQ+fCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdnZXRuYW1lJywgJ3xzZWN0aW9ufCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdrZXknLCAnfHZhbHVlfCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCduYW1lJywgJ3ZhbHVlJyldKQorCisgICAgZGVmIHRlc3Rfc2V0X25vbnN0cmluZ190eXBlcyhzZWxmKToKKyAgICAgICAgY2YgPSBzZWxmLm5ld2NvbmZpZygpCisgICAgICAgIGNmLmFkZF9zZWN0aW9uKCdub24tc3RyaW5nJykKKyAgICAgICAgY2Yuc2V0KCdub24tc3RyaW5nJywgJ2ludCcsIDEpCisgICAgICAgIGNmLnNldCgnbm9uLXN0cmluZycsICdsaXN0JywgWzAsIDEsIDEsIDIsIDMsIDUsIDgsIDEzLCAnJSgnXSkKKyAgICAgICAgY2Yuc2V0KCdub24tc3RyaW5nJywgJ2RpY3QnLCB7J3BpJzogMy4xNDE1OSwgJyUoJzogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyUobGlzdCknOiAnJShsaXN0KSd9KQorICAgICAgICBjZi5zZXQoJ25vbi1zdHJpbmcnLCAnc3RyaW5nX3dpdGhfaW50ZXJwb2xhdGlvbicsICclKGxpc3QpcycpCisgICAgICAgIGNmLnNldCgnbm9uLXN0cmluZycsICduby12YWx1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2YuZ2V0KCdub24tc3RyaW5nJywgJ2ludCcsIHJhdz1UcnVlKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjZi5nZXQsICdub24tc3RyaW5nJywgJ2ludCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2YuZ2V0KCdub24tc3RyaW5nJywgJ2xpc3QnLCByYXc9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDEsIDEsIDIsIDMsIDUsIDgsIDEzLCAnJSgnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjZi5nZXQsICdub24tc3RyaW5nJywgJ2xpc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNmLmdldCgnbm9uLXN0cmluZycsICdkaWN0JywgcmF3PVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsncGknOiAzLjE0MTU5LCAnJSgnOiAxLCAnJShsaXN0KSc6ICclKGxpc3QpJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2YuZ2V0LCAnbm9uLXN0cmluZycsICdkaWN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5nZXQoJ25vbi1zdHJpbmcnLCAnc3RyaW5nX3dpdGhfaW50ZXJwb2xhdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdz1UcnVlKSwgJyUobGlzdClzJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2YuZ2V0LCAnbm9uLXN0cmluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmdfd2l0aF9pbnRlcnBvbGF0aW9uJywgcmF3PUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNmLmdldCgnbm9uLXN0cmluZycsICduby12YWx1ZScpLCBOb25lKQorCitjbGFzcyBNdWx0aWxpbmVWYWx1ZXNUZXN0Q2FzZShUZXN0Q2FzZUJhc2UpOgorICAgIGNvbmZpZ19jbGFzcyA9IENvbmZpZ1BhcnNlci5Db25maWdQYXJzZXIKKyAgICB3b25kZXJmdWxfc3BhbSA9ICgiSSdtIGhhdmluZyBzcGFtIHNwYW0gc3BhbSBzcGFtICIKKyAgICAgICAgICAgICAgICAgICAgICAic3BhbSBzcGFtIHNwYW0gYmVha2VkIGJlYW5zIHNwYW0gIgorICAgICAgICAgICAgICAgICAgICAgICJzcGFtIHNwYW0gYW5kIHNwYW0hIikucmVwbGFjZSgnICcsICdcdFxuJykKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgY2YgPSBzZWxmLm5ld2NvbmZpZygpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMCk6CisgICAgICAgICAgICBzID0gJ3NlY3Rpb257fScuZm9ybWF0KGkpCisgICAgICAgICAgICBjZi5hZGRfc2VjdGlvbihzKQorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgICAgIGNmLnNldChzLCAnbG92ZWx5X3NwYW17fScuZm9ybWF0KGopLCBzZWxmLndvbmRlcmZ1bF9zcGFtKQorICAgICAgICB3aXRoIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgY2Yud3JpdGUoZikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9kb21pbmF0aW5nX211bHRpbGluZV92YWx1ZXMoc2VsZik6CisgICAgICAgICMgd2UncmUgcmVhZGluZyBmcm9tIGZpbGUgYmVjYXVzZSB0aGlzIGlzIHdoZXJlIHRoZSBjb2RlIGNoYW5nZWQKKyAgICAgICAgIyBkdXJpbmcgcGVyZm9ybWFuY2UgdXBkYXRlcyBpbiBQeXRob24gMy4yCisgICAgICAgIGNmX2Zyb21fZmlsZSA9IHNlbGYubmV3Y29uZmlnKCkKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4pIGFzIGY6CisgICAgICAgICAgICBjZl9mcm9tX2ZpbGUucmVhZGZwKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2ZfZnJvbV9maWxlLmdldCgnc2VjdGlvbjgnLCAnbG92ZWx5X3NwYW00JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53b25kZXJmdWxfc3BhbS5yZXBsYWNlKCdcdFxuJywgJ1xuJykpCisKK2NsYXNzIFJhd0NvbmZpZ1BhcnNlclRlc3RDYXNlKFRlc3RDYXNlQmFzZSk6CisgICAgY29uZmlnX2NsYXNzID0gQ29uZmlnUGFyc2VyLlJhd0NvbmZpZ1BhcnNlcgorCisgICAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbihzZWxmKToKKyAgICAgICAgY2YgPSBzZWxmLmdldF9pbnRlcnBvbGF0aW9uX2NvbmZpZygpCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShjZi5nZXQoIkZvbyIsICJnZXRuYW1lIiksICIlKF9fbmFtZV9fKXMiKQorICAgICAgICBlcShjZi5nZXQoIkZvbyIsICJiYXIiKSwKKyAgICAgICAgICAgInNvbWV0aGluZyAlKHdpdGgxKXMgaW50ZXJwb2xhdGlvbiAoMSBzdGVwKSIpCisgICAgICAgIGVxKGNmLmdldCgiRm9vIiwgImJhcjkiKSwKKyAgICAgICAgICAgInNvbWV0aGluZyAlKHdpdGg5KXMgbG90cyBvZiBpbnRlcnBvbGF0aW9uICg5IHN0ZXBzKSIpCisgICAgICAgIGVxKGNmLmdldCgiRm9vIiwgImJhcjEwIiksCisgICAgICAgICAgICJzb21ldGhpbmcgJSh3aXRoMTApcyBsb3RzIG9mIGludGVycG9sYXRpb24gKDEwIHN0ZXBzKSIpCisgICAgICAgIGVxKGNmLmdldCgiRm9vIiwgImJhcjExIiksCisgICAgICAgICAgICJzb21ldGhpbmcgJSh3aXRoMTEpcyBsb3RzIG9mIGludGVycG9sYXRpb24gKDExIHN0ZXBzKSIpCisKKyAgICBkZWYgdGVzdF9pdGVtcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pdGVtc19jb25maWcoWygnZGVmYXVsdCcsICc8ZGVmYXVsdD4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZ2V0ZGVmYXVsdCcsICd8JShkZWZhdWx0KXN8JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2dldG5hbWUnLCAnfCUoX19uYW1lX18pc3wnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgna2V5JywgJ3wlKG5hbWUpc3wnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnbmFtZScsICd2YWx1ZScpXSkKKworICAgIGRlZiB0ZXN0X3NldF9ub25zdHJpbmdfdHlwZXMoc2VsZik6CisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoKQorICAgICAgICBjZi5hZGRfc2VjdGlvbignbm9uLXN0cmluZycpCisgICAgICAgIGNmLnNldCgnbm9uLXN0cmluZycsICdpbnQnLCAxKQorICAgICAgICBjZi5zZXQoJ25vbi1zdHJpbmcnLCAnbGlzdCcsIFswLCAxLCAxLCAyLCAzLCA1LCA4LCAxM10pCisgICAgICAgIGNmLnNldCgnbm9uLXN0cmluZycsICdkaWN0JywgeydwaSc6IDMuMTQxNTl9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNmLmdldCgnbm9uLXN0cmluZycsICdpbnQnKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5nZXQoJ25vbi1zdHJpbmcnLCAnbGlzdCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAxLCAxLCAyLCAzLCA1LCA4LCAxM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2YuZ2V0KCdub24tc3RyaW5nJywgJ2RpY3QnKSwgeydwaSc6IDMuMTQxNTl9KQorCisKK2NsYXNzIFNhZmVDb25maWdQYXJzZXJUZXN0Q2FzZShDb25maWdQYXJzZXJUZXN0Q2FzZSk6CisgICAgY29uZmlnX2NsYXNzID0gQ29uZmlnUGFyc2VyLlNhZmVDb25maWdQYXJzZXIKKworICAgIGRlZiB0ZXN0X3NhZmVfaW50ZXJwb2xhdGlvbihzZWxmKToKKyAgICAgICAgIyBTZWUgaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzUxMTczNworICAgICAgICBjZiA9IHNlbGYuZnJvbXN0cmluZygiW3NlY3Rpb25dXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24xPXh4eFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uMj0lKG9wdGlvbjEpcy94eHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9rPSUob3B0aW9uMSlzLyUlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90X29rPSUob3B0aW9uMilzLyUlcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2YuZ2V0KCJzZWN0aW9uIiwgIm9rIiksICJ4eHgvJXMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNmLmdldCgic2VjdGlvbiIsICJub3Rfb2siKSwgInh4eC94eHgvJXMiKQorCisgICAgZGVmIHRlc3Rfc2V0X21hbGZvcm1hdHRlZF9pbnRlcnBvbGF0aW9uKHNlbGYpOgorICAgICAgICBjZiA9IHNlbGYuZnJvbXN0cmluZygiW3NlY3RdXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24xPWZvb1xuIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNmLmdldCgnc2VjdCcsICJvcHRpb24xIiksICJmb28iKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNmLnNldCwgInNlY3QiLCAib3B0aW9uMSIsICIlZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2Yuc2V0LCAic2VjdCIsICJvcHRpb24xIiwgImZvbyUiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjZi5zZXQsICJzZWN0IiwgIm9wdGlvbjEiLCAiZiVvbyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5nZXQoJ3NlY3QnLCAib3B0aW9uMSIpLCAiZm9vIikKKworICAgICAgICAjIGJ1ZyAjNTc0MTogZG91YmxlIHBlcmNlbnRzIGFyZSAqbm90KiBtYWxmb3JtZWQKKyAgICAgICAgY2Yuc2V0KCJzZWN0IiwgIm9wdGlvbjIiLCAiZm9vJSViYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNmLmdldCgic2VjdCIsICJvcHRpb24yIiksICJmb28lYmFyIikKKworICAgIGRlZiB0ZXN0X3NldF9ub25zdHJpbmdfdHlwZXMoc2VsZik6CisgICAgICAgIGNmID0gc2VsZi5mcm9tc3RyaW5nKCJbc2VjdF1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbjE9Zm9vXG4iKQorICAgICAgICAjIENoZWNrIHRoYXQgd2UgZ2V0IGEgVHlwZUVycm9yIHdoZW4gc2V0dGluZyBub24tc3RyaW5nIHZhbHVlcworICAgICAgICAjIGluIGFuIGV4aXN0aW5nIHNlY3Rpb246CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2Yuc2V0LCAic2VjdCIsICJvcHRpb24xIiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjZi5zZXQsICJzZWN0IiwgIm9wdGlvbjEiLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2Yuc2V0LCAic2VjdCIsICJvcHRpb24xIiwgb2JqZWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2Yuc2V0LCAic2VjdCIsICJvcHRpb24yIiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjZi5zZXQsICJzZWN0IiwgIm9wdGlvbjIiLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2Yuc2V0LCAic2VjdCIsICJvcHRpb24yIiwgb2JqZWN0KCkpCisKKyAgICBkZWYgdGVzdF9hZGRfc2VjdGlvbl9kZWZhdWx0XzEoc2VsZik6CisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjZi5hZGRfc2VjdGlvbiwgImRlZmF1bHQiKQorCisgICAgZGVmIHRlc3RfYWRkX3NlY3Rpb25fZGVmYXVsdF8yKHNlbGYpOgorICAgICAgICBjZiA9IHNlbGYubmV3Y29uZmlnKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2YuYWRkX3NlY3Rpb24sICJERUZBVUxUIikKKworCitjbGFzcyBTYWZlQ29uZmlnUGFyc2VyVGVzdENhc2VOb1ZhbHVlKFNhZmVDb25maWdQYXJzZXJUZXN0Q2FzZSk6CisgICAgYWxsb3dfbm9fdmFsdWUgPSBUcnVlCisKK2NsYXNzIFRlc3RDaGFpbk1hcCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfaXNzdWVfMTI3MTcoc2VsZik6CisgICAgICAgIGQxID0gZGljdChyZWQ9MSwgZ3JlZW49MikKKyAgICAgICAgZDIgPSBkaWN0KGdyZWVuPTMsIGJsdWU9NCkKKyAgICAgICAgZGNvbWIgPSBkMi5jb3B5KCkKKyAgICAgICAgZGNvbWIudXBkYXRlKGQxKQorICAgICAgICBjbSA9IENvbmZpZ1BhcnNlci5fQ2hhaW5tYXAoZDEsIGQyKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoY20ua2V5cygpLCBsaXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChjbS5rZXlzKCkpLCBzZXQoZGNvbWIua2V5cygpKSkgICAgICAjIGtleXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChjbS52YWx1ZXMoKSksIHNldChkY29tYi52YWx1ZXMoKSkpICAjIHZhbHVlcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGNtLml0ZW1zKCkpLCBzZXQoZGNvbWIuaXRlbXMoKSkpICAgICMgaXRlbXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChjbSksIHNldChkY29tYikpICAgICAgICAgICAgICAgICAgICAjIF9faXRlcl9fICgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20sIGRjb21iKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgX19lcV9fKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbY21ba10gZm9yIGsgaW4gZGNvbWJdLCBkY29tYi52YWx1ZXMoKSkgIyBfX2dldGl0ZW1fXygpCisgICAgICAgIGtsaXN0ID0gJ3JlZCBncmVlbiBibHVlIGJsYWNrIGJyb3duJy5zcGxpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2NtLmdldChrLCAxMCkgZm9yIGsgaW4ga2xpc3RdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtkY29tYi5nZXQoaywgMTApIGZvciBrIGluIGtsaXN0XSkgICAgICAjIGdldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2sgaW4gY20gZm9yIGsgaW4ga2xpc3RdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtrIGluIGRjb21iIGZvciBrIGluIGtsaXN0XSkgICAgICAgICAgICAjIF9fY29udGFpbnNfXygpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2NtLmhhc19rZXkoaykgZm9yIGsgaW4ga2xpc3RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGNvbWIuaGFzX2tleShrKSBmb3IgayBpbiBrbGlzdF0pICAjIGhhc19rZXkoKQorCitjbGFzcyBJc3N1ZTcwMDVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBvdXRwdXQgd2hlbiBOb25lIGlzIHNldCgpIGFzIGEgdmFsdWUgYW5kIGFsbG93X25vX3ZhbHVlID09IEZhbHNlLgorCisgICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTcwMDUKKworICAgICIiIgorCisgICAgZXhwZWN0ZWRfb3V0cHV0ID0gIltzZWN0aW9uXVxub3B0aW9uID0gTm9uZVxuXG4iCisKKyAgICBkZWYgcHJlcGFyZShzZWxmLCBjb25maWdfY2xhc3MpOgorICAgICAgICAjIFRoaXMgaXMgdGhlIGRlZmF1bHQsIGJ1dCB0aGF0J3MgdGhlIHBvaW50LgorICAgICAgICBjcCA9IGNvbmZpZ19jbGFzcyhhbGxvd19ub192YWx1ZT1GYWxzZSkKKyAgICAgICAgY3AuYWRkX3NlY3Rpb24oInNlY3Rpb24iKQorICAgICAgICBjcC5zZXQoInNlY3Rpb24iLCAib3B0aW9uIiwgTm9uZSkKKyAgICAgICAgc2lvID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBjcC53cml0ZShzaW8pCisgICAgICAgIHJldHVybiBzaW8uZ2V0dmFsdWUoKQorCisgICAgZGVmIHRlc3Rfbm9uZV9hc192YWx1ZV9zdHJpbmdpZmllZChzZWxmKToKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5wcmVwYXJlKENvbmZpZ1BhcnNlci5Db25maWdQYXJzZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LCBzZWxmLmV4cGVjdGVkX291dHB1dCkKKworICAgIGRlZiB0ZXN0X25vbmVfYXNfdmFsdWVfc3RyaW5naWZpZWRfcmF3KHNlbGYpOgorICAgICAgICBvdXRwdXQgPSBzZWxmLnByZXBhcmUoQ29uZmlnUGFyc2VyLlJhd0NvbmZpZ1BhcnNlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQsIHNlbGYuZXhwZWN0ZWRfb3V0cHV0KQorCisKK2NsYXNzIFNvcnRlZFRlc3RDYXNlKFJhd0NvbmZpZ1BhcnNlclRlc3RDYXNlKToKKyAgICBkZWYgbmV3Y29uZmlnKHNlbGYsIGRlZmF1bHRzPU5vbmUpOgorICAgICAgICBzZWxmLmNmID0gc2VsZi5jb25maWdfY2xhc3MoZGVmYXVsdHM9ZGVmYXVsdHMsIGRpY3RfdHlwZT1Tb3J0ZWREaWN0KQorICAgICAgICByZXR1cm4gc2VsZi5jZgorCisgICAgZGVmIHRlc3Rfc29ydGVkKHNlbGYpOgorICAgICAgICBzZWxmLmZyb21zdHJpbmcoIltiXVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIm80PTFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvMz0yXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAibzI9M1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgIm8xPTRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJbYV1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJrPXZcbiIpCisgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5jZi53cml0ZShvdXRwdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIlthXVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJrID0gdlxuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIltiXVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJvMSA9IDRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAibzIgPSAzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIm8zID0gMlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJvNCA9IDFcblxuIikKKworCitjbGFzcyBFeGNlcHRpb25QaWNrbGluZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgaXNzdWUgIzEzNzYwOiBDb25maWdQYXJzZXIgZXhjZXB0aW9ucyBhcmUgbm90IHBpY2tsYWJsZS4iIiIKKworICAgIGRlZiB0ZXN0X2Vycm9yKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIGUxID0gQ29uZmlnUGFyc2VyLkVycm9yKCd2YWx1ZScpCisgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuZHVtcHMoZTEpCisgICAgICAgIGUyID0gcGlja2xlLmxvYWRzKHBpY2tsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubWVzc2FnZSwgZTIubWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGUxKSwgcmVwcihlMikpCisKKyAgICBkZWYgdGVzdF9ub3NlY3Rpb25lcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5Ob1NlY3Rpb25FcnJvcignc2VjdGlvbicpCisgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuZHVtcHMoZTEpCisgICAgICAgIGUyID0gcGlja2xlLmxvYWRzKHBpY2tsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubWVzc2FnZSwgZTIubWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5hcmdzLCBlMi5hcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLnNlY3Rpb24sIGUyLnNlY3Rpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisgICAgZGVmIHRlc3Rfbm9vcHRpb25lcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5Ob09wdGlvbkVycm9yKCdvcHRpb24nLCAnc2VjdGlvbicpCisgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuZHVtcHMoZTEpCisgICAgICAgIGUyID0gcGlja2xlLmxvYWRzKHBpY2tsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubWVzc2FnZSwgZTIubWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5hcmdzLCBlMi5hcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLnNlY3Rpb24sIGUyLnNlY3Rpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEub3B0aW9uLCBlMi5vcHRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisgICAgZGVmIHRlc3RfZHVwbGljYXRlc2VjdGlvbmVycm9yKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIGUxID0gQ29uZmlnUGFyc2VyLkR1cGxpY2F0ZVNlY3Rpb25FcnJvcignc2VjdGlvbicpCisgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuZHVtcHMoZTEpCisgICAgICAgIGUyID0gcGlja2xlLmxvYWRzKHBpY2tsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubWVzc2FnZSwgZTIubWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5hcmdzLCBlMi5hcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLnNlY3Rpb24sIGUyLnNlY3Rpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisgICAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbmVycm9yKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIGUxID0gQ29uZmlnUGFyc2VyLkludGVycG9sYXRpb25FcnJvcignb3B0aW9uJywgJ3NlY3Rpb24nLCAnbXNnJykKKyAgICAgICAgcGlja2xlZCA9IHBpY2tsZS5kdW1wcyhlMSkKKyAgICAgICAgZTIgPSBwaWNrbGUubG9hZHMocGlja2xlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5tZXNzYWdlLCBlMi5tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLmFyZ3MsIGUyLmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuc2VjdGlvbiwgZTIuc2VjdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5vcHRpb24sIGUyLm9wdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGUxKSwgcmVwcihlMikpCisKKyAgICBkZWYgdGVzdF9pbnRlcnBvbGF0aW9ubWlzc2luZ29wdGlvbmVycm9yKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIGUxID0gQ29uZmlnUGFyc2VyLkludGVycG9sYXRpb25NaXNzaW5nT3B0aW9uRXJyb3IoJ29wdGlvbicsICdzZWN0aW9uJywKKyAgICAgICAgICAgICdyYXd2YWwnLCAncmVmZXJlbmNlJykKKyAgICAgICAgcGlja2xlZCA9IHBpY2tsZS5kdW1wcyhlMSkKKyAgICAgICAgZTIgPSBwaWNrbGUubG9hZHMocGlja2xlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5tZXNzYWdlLCBlMi5tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLmFyZ3MsIGUyLmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuc2VjdGlvbiwgZTIuc2VjdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5vcHRpb24sIGUyLm9wdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5yZWZlcmVuY2UsIGUyLnJlZmVyZW5jZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGUxKSwgcmVwcihlMikpCisKKyAgICBkZWYgdGVzdF9pbnRlcnBvbGF0aW9uc3ludGF4ZXJyb3Ioc2VsZik6CisgICAgICAgIGltcG9ydCBwaWNrbGUKKyAgICAgICAgZTEgPSBDb25maWdQYXJzZXIuSW50ZXJwb2xhdGlvblN5bnRheEVycm9yKCdvcHRpb24nLCAnc2VjdGlvbicsICdtc2cnKQorICAgICAgICBwaWNrbGVkID0gcGlja2xlLmR1bXBzKGUxKQorICAgICAgICBlMiA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm1lc3NhZ2UsIGUyLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuYXJncywgZTIuYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5zZWN0aW9uLCBlMi5zZWN0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm9wdGlvbiwgZTIub3B0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZTEpLCByZXByKGUyKSkKKworICAgIGRlZiB0ZXN0X2ludGVycG9sYXRpb25kZXB0aGVycm9yKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIGUxID0gQ29uZmlnUGFyc2VyLkludGVycG9sYXRpb25EZXB0aEVycm9yKCdvcHRpb24nLCAnc2VjdGlvbicsCisgICAgICAgICAgICAncmF3dmFsJykKKyAgICAgICAgcGlja2xlZCA9IHBpY2tsZS5kdW1wcyhlMSkKKyAgICAgICAgZTIgPSBwaWNrbGUubG9hZHMocGlja2xlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5tZXNzYWdlLCBlMi5tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLmFyZ3MsIGUyLmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuc2VjdGlvbiwgZTIuc2VjdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5vcHRpb24sIGUyLm9wdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGUxKSwgcmVwcihlMikpCisKKyAgICBkZWYgdGVzdF9wYXJzaW5nZXJyb3Ioc2VsZik6CisgICAgICAgIGltcG9ydCBwaWNrbGUKKyAgICAgICAgZTEgPSBDb25maWdQYXJzZXIuUGFyc2luZ0Vycm9yKCdzb3VyY2UnKQorICAgICAgICBlMS5hcHBlbmQoMSwgJ2xpbmUxJykKKyAgICAgICAgZTEuYXBwZW5kKDIsICdsaW5lMicpCisgICAgICAgIGUxLmFwcGVuZCgzLCAnbGluZTMnKQorICAgICAgICBwaWNrbGVkID0gcGlja2xlLmR1bXBzKGUxKQorICAgICAgICBlMiA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm1lc3NhZ2UsIGUyLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuYXJncywgZTIuYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5maWxlbmFtZSwgZTIuZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuZXJyb3JzLCBlMi5lcnJvcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ3NlY3Rpb25oZWFkZXJlcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5NaXNzaW5nU2VjdGlvbkhlYWRlckVycm9yKCdmaWxlbmFtZScsIDEyMywgJ2xpbmUnKQorICAgICAgICBwaWNrbGVkID0gcGlja2xlLmR1bXBzKGUxKQorICAgICAgICBlMiA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm1lc3NhZ2UsIGUyLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuYXJncywgZTIuYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5saW5lLCBlMi5saW5lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLmZpbGVuYW1lLCBlMi5maWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5saW5lbm8sIGUyLmxpbmVubykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGUxKSwgcmVwcihlMikpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIENvbmZpZ1BhcnNlclRlc3RDYXNlLAorICAgICAgICBNdWx0aWxpbmVWYWx1ZXNUZXN0Q2FzZSwKKyAgICAgICAgUmF3Q29uZmlnUGFyc2VyVGVzdENhc2UsCisgICAgICAgIFNhZmVDb25maWdQYXJzZXJUZXN0Q2FzZSwKKyAgICAgICAgU2FmZUNvbmZpZ1BhcnNlclRlc3RDYXNlTm9WYWx1ZSwKKyAgICAgICAgU29ydGVkVGVzdENhc2UsCisgICAgICAgIElzc3VlNzAwNVRlc3RDYXNlLAorICAgICAgICBUZXN0Q2hhaW5NYXAsCisgICAgICAgIEV4Y2VwdGlvblBpY2tsaW5nVGVzdENhc2UsCisgICAgICAgICkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZmdwYXJzZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBiZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZmdwYXJzZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDBiZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZ2kucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZ2kucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhYmU5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NnaS5weQpAQCAtMCwwICsxLDM5NCBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBjaGVja193YXJuaW5ncworaW1wb3J0IGNnaQoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBIYWNrZWRTeXNNb2R1bGU6CisgICAgIyBUaGUgcmVncmVzc2lvbiB0ZXN0IHdpbGwgaGF2ZSByZWFsIHZhbHVlcyBpbiBzeXMuYXJndiwgd2hpY2gKKyAgICAjIHdpbGwgY29tcGxldGVseSBjb25mdXNlIHRoZSB0ZXN0IG9mIHRoZSBjZ2kgbW9kdWxlCisgICAgYXJndiA9IFtdCisgICAgc3RkaW4gPSBzeXMuc3RkaW4KKworY2dpLnN5cyA9IEhhY2tlZFN5c01vZHVsZSgpCisKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitjbGFzcyBDb21wYXJhYmxlRXhjZXB0aW9uOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnIpOgorICAgICAgICBzZWxmLmVyciA9IGVycgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZi5lcnIpCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBhbkV4Yyk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGFuRXhjLCBFeGNlcHRpb24pOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIHggPSBjbXAoc2VsZi5lcnIuX19jbGFzc19fLCBhbkV4Yy5fX2NsYXNzX18pCisgICAgICAgIGlmIHggIT0gMDoKKyAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgIHJldHVybiBjbXAoc2VsZi5lcnIuYXJncywgYW5FeGMuYXJncykKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5lcnIsIGF0dHIpCisKK2RlZiBkb190ZXN0KGJ1ZiwgbWV0aG9kKToKKyAgICBlbnYgPSB7fQorICAgIGlmIG1ldGhvZCA9PSAiR0VUIjoKKyAgICAgICAgZnAgPSBOb25lCisgICAgICAgIGVudlsnUkVRVUVTVF9NRVRIT0QnXSA9ICdHRVQnCisgICAgICAgIGVudlsnUVVFUllfU1RSSU5HJ10gPSBidWYKKyAgICBlbGlmIG1ldGhvZCA9PSAiUE9TVCI6CisgICAgICAgIGZwID0gU3RyaW5nSU8oYnVmKQorICAgICAgICBlbnZbJ1JFUVVFU1RfTUVUSE9EJ10gPSAnUE9TVCcKKyAgICAgICAgZW52WydDT05URU5UX1RZUEUnXSA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnCisgICAgICAgIGVudlsnQ09OVEVOVF9MRU5HVEgnXSA9IHN0cihsZW4oYnVmKSkKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidW5rbm93biBtZXRob2Q6ICVzIiAlIG1ldGhvZAorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGNnaS5wYXJzZShmcCwgZW52LCBzdHJpY3RfcGFyc2luZz0xKQorICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yLCBlcnI6CisgICAgICAgIHJldHVybiBDb21wYXJhYmxlRXhjZXB0aW9uKGVycikKKworcGFyc2Vfc3RyaWN0X3Rlc3RfY2FzZXMgPSBbCisgICAgKCIiLCBWYWx1ZUVycm9yKCJiYWQgcXVlcnkgZmllbGQ6ICcnIikpLAorICAgICgiJiIsIFZhbHVlRXJyb3IoImJhZCBxdWVyeSBmaWVsZDogJyciKSksCisgICAgKCImJiIsIFZhbHVlRXJyb3IoImJhZCBxdWVyeSBmaWVsZDogJyciKSksCisgICAgKCI7IiwgVmFsdWVFcnJvcigiYmFkIHF1ZXJ5IGZpZWxkOiAnJyIpKSwKKyAgICAoIjsmOyIsIFZhbHVlRXJyb3IoImJhZCBxdWVyeSBmaWVsZDogJyciKSksCisgICAgIyBTaG91bGQgdGhlIG5leHQgZmV3IHJlYWxseSBiZSB2YWxpZD8KKyAgICAoIj0iLCB7fSksCisgICAgKCI9Jj0iLCB7fSksCisgICAgKCI9Oz0iLCB7fSksCisgICAgIyBUaGlzIHJlc3Qgc2VlbSB0byBtYWtlIHNlbnNlCisgICAgKCI9YSIsIHsnJzogWydhJ119KSwKKyAgICAoIiY9YSIsIFZhbHVlRXJyb3IoImJhZCBxdWVyeSBmaWVsZDogJyciKSksCisgICAgKCI9YSYiLCBWYWx1ZUVycm9yKCJiYWQgcXVlcnkgZmllbGQ6ICcnIikpLAorICAgICgiPSZhIiwgVmFsdWVFcnJvcigiYmFkIHF1ZXJ5IGZpZWxkOiAnYSciKSksCisgICAgKCJiPWEiLCB7J2InOiBbJ2EnXX0pLAorICAgICgiYis9YSIsIHsnYiAnOiBbJ2EnXX0pLAorICAgICgiYT1iPWEiLCB7J2EnOiBbJ2I9YSddfSksCisgICAgKCJhPStiPWEiLCB7J2EnOiBbJyBiPWEnXX0pLAorICAgICgiJmI9YSIsIFZhbHVlRXJyb3IoImJhZCBxdWVyeSBmaWVsZDogJyciKSksCisgICAgKCJiJj1hIiwgVmFsdWVFcnJvcigiYmFkIHF1ZXJ5IGZpZWxkOiAnYiciKSksCisgICAgKCJhPWErYiZiPWIrYyIsIHsnYSc6IFsnYSBiJ10sICdiJzogWydiIGMnXX0pLAorICAgICgiYT1hK2ImYT1iK2EiLCB7J2EnOiBbJ2EgYicsICdiIGEnXX0pLAorICAgICgieD0xJnk9Mi4wJno9Mi0zLiUyYjAiLCB7J3gnOiBbJzEnXSwgJ3knOiBbJzIuMCddLCAneic6IFsnMi0zLiswJ119KSwKKyAgICAoIng9MTt5PTIuMCZ6PTItMy4lMmIwIiwgeyd4JzogWycxJ10sICd5JzogWycyLjAnXSwgJ3onOiBbJzItMy4rMCddfSksCisgICAgKCJ4PTE7eT0yLjA7ej0yLTMuJTJiMCIsIHsneCc6IFsnMSddLCAneSc6IFsnMi4wJ10sICd6JzogWycyLTMuKzAnXX0pLAorICAgICgiSGJjNTE2MTE2OGM1NDIzMzM2MzMzMTVkZWUxMTgyMjI3OmtleV9zdG9yZV9zZXFpZD00MDAwMDYmY3V5ZXI9ciZ2aWV3PWJ1c3RvbWVyJm9yZGVyX2lkPTBiYjJlMjQ4NjM4ODMzZDQ4Y2I3ZmVkMzAwMDAwZjFiJmV4cGlyZT05NjQ1NDYyNjMmbG9iYWxlPWVuLVVTJmtpZD0xMzAwMDMuMzAwMDM4JnNzPWVudiIsCisgICAgIHsnSGJjNTE2MTE2OGM1NDIzMzM2MzMzMTVkZWUxMTgyMjI3OmtleV9zdG9yZV9zZXFpZCc6IFsnNDAwMDA2J10sCisgICAgICAnY3V5ZXInOiBbJ3InXSwKKyAgICAgICdleHBpcmUnOiBbJzk2NDU0NjI2MyddLAorICAgICAgJ2tpZCc6IFsnMTMwMDAzLjMwMDAzOCddLAorICAgICAgJ2xvYmFsZSc6IFsnZW4tVVMnXSwKKyAgICAgICdvcmRlcl9pZCc6IFsnMGJiMmUyNDg2Mzg4MzNkNDhjYjdmZWQzMDAwMDBmMWInXSwKKyAgICAgICdzcyc6IFsnZW52J10sCisgICAgICAndmlldyc6IFsnYnVzdG9tZXInXSwKKyAgICAgIH0pLAorCisgICAgKCJncm91cF9pZD01NDcwJnNldD1jdXN0b20mX2Fzc2lnbmVkX3RvPTMxMzkyJl9zdGF0dXM9MSZfY2F0ZWdvcnk9MTAwJlNVQk1JVD1Ccm93c2UiLAorICAgICB7J1NVQk1JVCc6IFsnQnJvd3NlJ10sCisgICAgICAnX2Fzc2lnbmVkX3RvJzogWyczMTM5MiddLAorICAgICAgJ19jYXRlZ29yeSc6IFsnMTAwJ10sCisgICAgICAnX3N0YXR1cyc6IFsnMSddLAorICAgICAgJ2dyb3VwX2lkJzogWyc1NDcwJ10sCisgICAgICAnc2V0JzogWydjdXN0b20nXSwKKyAgICAgIH0pCisgICAgXQorCitkZWYgZmlyc3RfZWx0cyhsaXN0KToKKyAgICByZXR1cm4gbWFwKGxhbWJkYSB4OnhbMF0sIGxpc3QpCisKK2RlZiBmaXJzdF9zZWNvbmRfZWx0cyhsaXN0KToKKyAgICByZXR1cm4gbWFwKGxhbWJkYSBwOihwWzBdLCBwWzFdWzBdKSwgbGlzdCkKKworZGVmIGdlbl9yZXN1bHQoZGF0YSwgZW52aXJvbik6CisgICAgZmFrZV9zdGRpbiA9IFN0cmluZ0lPKGRhdGEpCisgICAgZmFrZV9zdGRpbi5zZWVrKDApCisgICAgZm9ybSA9IGNnaS5GaWVsZFN0b3JhZ2UoZnA9ZmFrZV9zdGRpbiwgZW52aXJvbj1lbnZpcm9uKQorCisgICAgcmVzdWx0ID0ge30KKyAgICBmb3IgaywgdiBpbiBkaWN0KGZvcm0pLml0ZW1zKCk6CisgICAgICAgIHJlc3VsdFtrXSA9IGlzaW5zdGFuY2UodiwgbGlzdCkgYW5kIGZvcm0uZ2V0bGlzdChrKSBvciB2LnZhbHVlCisKKyAgICByZXR1cm4gcmVzdWx0CisKK2NsYXNzIENnaVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2VzY2FwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgidGVzdCAmYW1wOyBzdHJpbmciLCBjZ2kuZXNjYXBlKCJ0ZXN0ICYgc3RyaW5nIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIiZsdDt0ZXN0IHN0cmluZyZndDsiLCBjZ2kuZXNjYXBlKCI8dGVzdCBzdHJpbmc+IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIiZxdW90O3Rlc3Qgc3RyaW5nJnF1b3Q7IiwgY2dpLmVzY2FwZSgnInRlc3Qgc3RyaW5nIicsIFRydWUpKQorCisgICAgZGVmIHRlc3Rfc3RyaWN0KHNlbGYpOgorICAgICAgICBmb3Igb3JpZywgZXhwZWN0IGluIHBhcnNlX3N0cmljdF90ZXN0X2Nhc2VzOgorICAgICAgICAgICAgIyBUZXN0IGJhc2ljIHBhcnNpbmcKKyAgICAgICAgICAgIGQgPSBkb190ZXN0KG9yaWcsICJHRVQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBleHBlY3QsICJFcnJvciBwYXJzaW5nICVzIiAlIHJlcHIob3JpZykpCisgICAgICAgICAgICBkID0gZG9fdGVzdChvcmlnLCAiUE9TVCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGV4cGVjdCwgIkVycm9yIHBhcnNpbmcgJXMiICUgcmVwcihvcmlnKSkKKworICAgICAgICAgICAgZW52ID0geydRVUVSWV9TVFJJTkcnOiBvcmlnfQorICAgICAgICAgICAgZmNkID0gY2dpLkZvcm1Db250ZW50RGljdChlbnYpCisgICAgICAgICAgICBzZCA9IGNnaS5TdkZvcm1Db250ZW50RGljdChlbnYpCisgICAgICAgICAgICBmcyA9IGNnaS5GaWVsZFN0b3JhZ2UoZW52aXJvbj1lbnYpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4cGVjdCwgZGljdCk6CisgICAgICAgICAgICAgICAgIyB0ZXN0IGRpY3QgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXhwZWN0KSwgbGVuKGZjZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKGV4cGVjdC5rZXlzKCksIGZjZC5rZXlzKCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKGV4cGVjdC52YWx1ZXMoKSwgZmNkLnZhbHVlcygpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChleHBlY3QuaXRlbXMoKSwgZmNkLml0ZW1zKCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmY2QuZ2V0KCJub25leGlzdGVudCBmaWVsZCIsICJkZWZhdWx0IiksICJkZWZhdWx0IikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZCksIGxlbihmcykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKHNkLmtleXMoKSwgZnMua2V5cygpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnMuZ2V0dmFsdWUoIm5vbmV4aXN0ZW50IGZpZWxkIiwgImRlZmF1bHQiKSwgImRlZmF1bHQiKQorICAgICAgICAgICAgICAgICMgdGVzdCBpbmRpdmlkdWFsIGZpZWxkcworICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gZXhwZWN0LmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3ZhbCA9IGV4cGVjdFtrZXldCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmY2QuaGFzX2tleShrZXkpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwoZmNkW2tleV0sIGV4cGVjdFtrZXldKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZjZC5nZXQoa2V5LCAiZGVmYXVsdCIpLCBmY2Rba2V5XSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZzLmhhc19rZXkoa2V5KSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGV4cGVjdF92YWwpID4gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZV92YWx1ZSA9IDAKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZV92YWx1ZSA9IDEKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gc2Rba2V5XQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2luZ2xlX3ZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcy5nZXR2YWx1ZShrZXkpLCBleHBlY3RfdmFsKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNpbmdsZV92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCBleHBlY3RfdmFsWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcy5nZXR2YWx1ZShrZXkpLCBleHBlY3RfdmFsWzBdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwoc2QuZ2V0bGlzdChrZXkpLCBleHBlY3RfdmFsKQorICAgICAgICAgICAgICAgICAgICBpZiBzaW5nbGVfdmFsdWU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwoc2QudmFsdWVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9lbHRzKGV4cGVjdC52YWx1ZXMoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwoc2QuaXRlbXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3NlY29uZF9lbHRzKGV4cGVjdC5pdGVtcygpKSkKKworICAgIGRlZiB0ZXN0X3dlaXJkX2Zvcm1jb250ZW50ZGljdChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoZSB3ZWlyZCBGb3JtQ29udGVudERpY3QgY2xhc3NlcworICAgICAgICBlbnYgPSB7J1FVRVJZX1NUUklORyc6ICJ4PTEmeT0yLjAmej0yLTMuJTJiMCYxPTFhYmMifQorICAgICAgICBleHBlY3QgPSB7J3gnOiAxLCAneSc6IDIuMCwgJ3onOiAnMi0zLiswJywgJzEnOiAnMWFiYyd9CisgICAgICAgIGQgPSBjZ2kuSW50ZXJwRm9ybUNvbnRlbnREaWN0KGVudikKKyAgICAgICAgZm9yIGssIHYgaW4gZXhwZWN0Lml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRba10sIHYpCisgICAgICAgIGZvciBrLCB2IGluIGQuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0W2tdLCB2KQorICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwoZXhwZWN0LnZhbHVlcygpLCBkLnZhbHVlcygpKQorCisgICAgZGVmIHRlc3RfbG9nKHNlbGYpOgorICAgICAgICBjZ2kubG9nKCJUZXN0aW5nIikKKworICAgICAgICBjZ2kubG9nZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGNnaS5pbml0bG9nKCIlcyIsICJUZXN0aW5nIGluaXRsb2cgMSIpCisgICAgICAgIGNnaS5sb2coIiVzIiwgIlRlc3RpbmcgbG9nIDIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNnaS5sb2dmcC5nZXR2YWx1ZSgpLCAiVGVzdGluZyBpbml0bG9nIDFcblRlc3RpbmcgbG9nIDJcbiIpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKCIvZGV2L251bGwiKToKKyAgICAgICAgICAgIGNnaS5sb2dmcCA9IE5vbmUKKyAgICAgICAgICAgIGNnaS5sb2dmaWxlID0gIi9kZXYvbnVsbCIKKyAgICAgICAgICAgIGNnaS5pbml0bG9nKCIlcyIsICJUZXN0aW5nIGxvZyAzIikKKyAgICAgICAgICAgIGNnaS5sb2coIlRlc3RpbmcgbG9nIDQiKQorCisgICAgZGVmIHRlc3RfZmllbGRzdG9yYWdlX3JlYWRsaW5lKHNlbGYpOgorICAgICAgICAjIEZpZWxkU3RvcmFnZSB1c2VzIHJlYWRsaW5lLCB3aGljaCBoYXMgdGhlIGNhcGFjaXR5IHRvIHJlYWQgYWxsCisgICAgICAgICMgY29udGVudHMgb2YgdGhlIGlucHV0IGZpbGUgaW50byBtZW1vcnk7IHdlIHVzZSByZWFkbGluZSdzIHNpemUgYXJndW1lbnQKKyAgICAgICAgIyB0byBwcmV2ZW50IHRoYXQgZm9yIGZpbGVzIHRoYXQgZG8gbm90IGNvbnRhaW4gYW55IG5ld2xpbmVzIGluCisgICAgICAgICMgbm9uLUdFVC9IRUFEIHJlcXVlc3RzCisgICAgICAgIGNsYXNzIFRlc3RSZWFkbGluZUZpbGU6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSk6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICAgICAgICAgIHNlbGYubnVtY2FsbHMgPSAwCisKKyAgICAgICAgICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPU5vbmUpOgorICAgICAgICAgICAgICAgIHNlbGYubnVtY2FsbHMgKz0gMQorICAgICAgICAgICAgICAgIGlmIHNpemU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGUucmVhZGxpbmUoc2l6ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlLnJlYWRsaW5lKCkKKworICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIGZpbGUgPSBzZWxmLl9fZGljdF9fWydmaWxlJ10KKyAgICAgICAgICAgICAgICBhID0gZ2V0YXR0cihmaWxlLCBuYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGEsIGludCk6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgYSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYQorCisgICAgICAgIGYgPSBUZXN0UmVhZGxpbmVGaWxlKHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoKSkKKyAgICAgICAgZi53cml0ZSgneCcgKiAyNTYgKiAxMDI0KQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgZW52ID0geydSRVFVRVNUX01FVEhPRCc6J1BVVCd9CisgICAgICAgIGZzID0gY2dpLkZpZWxkU3RvcmFnZShmcD1mLCBlbnZpcm9uPWVudikKKyAgICAgICAgIyBpZiB3ZSdyZSBub3QgY2h1bmtpbmcgcHJvcGVybHksIHJlYWRsaW5lIGlzIG9ubHkgY2FsbGVkIHR3aWNlCisgICAgICAgICMgKGJ5IHJlYWRfYmluYXJ5KTsgaWYgd2UgYXJlIGNodW5raW5nIHByb3Blcmx5LCBpdCB3aWxsIGJlIGNhbGxlZCA1IHRpbWVzCisgICAgICAgICMgYXMgbG9uZyBhcyB0aGUgY2h1bmtzaXplIGlzIDEgPDwgMTYuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLm51bWNhbGxzID4gMikKKworICAgIGRlZiB0ZXN0X2ZpZWxkc3RvcmFnZV9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgICNUZXN0IGJhc2ljIEZpZWxkU3RvcmFnZSBtdWx0aXBhcnQgcGFyc2luZworICAgICAgICBlbnYgPSB7J1JFUVVFU1RfTUVUSE9EJzonUE9TVCcsICdDT05URU5UX1RZUEUnOidtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS03MjE4MzczNzMzNTA3MDU1MjY2ODgxNjQ2ODQnLCAnQ09OVEVOVF9MRU5HVEgnOic1NTgnfQorICAgICAgICBwb3N0ZGF0YSA9ICIiIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tNzIxODM3MzczMzUwNzA1NTI2Njg4MTY0Njg0CitDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImlkIgorCisxMjM0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTcyMTgzNzM3MzM1MDcwNTUyNjY4ODE2NDY4NAorQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJ0aXRsZSIKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTcyMTgzNzM3MzM1MDcwNTUyNjY4ODE2NDY4NAorQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJmaWxlIjsgZmlsZW5hbWU9InRlc3QudHh0IgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK1Rlc3RpbmcgMTIzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTcyMTgzNzM3MzM1MDcwNTUyNjY4ODE2NDY4NAorQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJzdWJtaXQiCisKKyBBZGRceDIwCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTcyMTgzNzM3MzM1MDcwNTUyNjY4ODE2NDY4NC0tCisiIiIKKyAgICAgICAgZnMgPSBjZ2kuRmllbGRTdG9yYWdlKGZwPVN0cmluZ0lPKHBvc3RkYXRhKSwgZW52aXJvbj1lbnYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGZzLmxpc3QpLCA0KQorICAgICAgICBleHBlY3QgPSBbeyduYW1lJzonaWQnLCAnZmlsZW5hbWUnOk5vbmUsICd2YWx1ZSc6JzEyMzQnfSwKKyAgICAgICAgICAgICAgICAgIHsnbmFtZSc6J3RpdGxlJywgJ2ZpbGVuYW1lJzpOb25lLCAndmFsdWUnOicnfSwKKyAgICAgICAgICAgICAgICAgIHsnbmFtZSc6J2ZpbGUnLCAnZmlsZW5hbWUnOid0ZXN0LnR4dCcsJ3ZhbHVlJzonVGVzdGluZyAxMjMuXG4nfSwKKyAgICAgICAgICAgICAgICAgIHsnbmFtZSc6J3N1Ym1pdCcsICdmaWxlbmFtZSc6Tm9uZSwgJ3ZhbHVlJzonIEFkZCAnfV0KKyAgICAgICAgZm9yIHggaW4gcmFuZ2UobGVuKGZzLmxpc3QpKToKKyAgICAgICAgICAgIGZvciBrLCBleHAgaW4gZXhwZWN0W3hdLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgZ290ID0gZ2V0YXR0cihmcy5saXN0W3hdLCBrKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBleHApCisKKyAgICBfcXNfcmVzdWx0ID0geworICAgICAgICAna2V5MSc6ICd2YWx1ZTEnLAorICAgICAgICAna2V5Mic6IFsndmFsdWUyeCcsICd2YWx1ZTJ5J10sCisgICAgICAgICdrZXkzJzogJ3ZhbHVlMycsCisgICAgICAgICdrZXk0JzogJ3ZhbHVlNCcKKyAgICB9CisgICAgZGVmIHRlc3RRU0FuZFVybEVuY29kZShzZWxmKToKKyAgICAgICAgZGF0YSA9ICJrZXkyPXZhbHVlMngma2V5Mz12YWx1ZTMma2V5ND12YWx1ZTQiCisgICAgICAgIGVudmlyb24gPSB7CisgICAgICAgICAgICAnQ09OVEVOVF9MRU5HVEgnOiAgIHN0cihsZW4oZGF0YSkpLAorICAgICAgICAgICAgJ0NPTlRFTlRfVFlQRSc6ICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywKKyAgICAgICAgICAgICdRVUVSWV9TVFJJTkcnOiAgICAgJ2tleTE9dmFsdWUxJmtleTI9dmFsdWUyeScsCisgICAgICAgICAgICAnUkVRVUVTVF9NRVRIT0QnOiAgICdQT1NUJywKKyAgICAgICAgfQorICAgICAgICB2ID0gZ2VuX3Jlc3VsdChkYXRhLCBlbnZpcm9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3FzX3Jlc3VsdCwgdikKKworICAgIGRlZiB0ZXN0UVNBbmRGb3JtRGF0YShzZWxmKToKKyAgICAgICAgZGF0YSA9ICIiIgorLS0tMTIzCitDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImtleTIiCisKK3ZhbHVlMnkKKy0tLTEyMworQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJrZXkzIgorCit2YWx1ZTMKKy0tLTEyMworQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJrZXk0IgorCit2YWx1ZTQKKy0tLTEyMy0tCisiIiIKKyAgICAgICAgZW52aXJvbiA9IHsKKyAgICAgICAgICAgICdDT05URU5UX0xFTkdUSCc6ICAgc3RyKGxlbihkYXRhKSksCisgICAgICAgICAgICAnQ09OVEVOVF9UWVBFJzogICAgICdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0tMTIzJywKKyAgICAgICAgICAgICdRVUVSWV9TVFJJTkcnOiAgICAgJ2tleTE9dmFsdWUxJmtleTI9dmFsdWUyeCcsCisgICAgICAgICAgICAnUkVRVUVTVF9NRVRIT0QnOiAgICdQT1NUJywKKyAgICAgICAgfQorICAgICAgICB2ID0gZ2VuX3Jlc3VsdChkYXRhLCBlbnZpcm9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3FzX3Jlc3VsdCwgdikKKworICAgIGRlZiB0ZXN0UVNBbmRGb3JtRGF0YUZpbGUoc2VsZik6CisgICAgICAgIGRhdGEgPSAiIiIKKy0tLTEyMworQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJrZXkyIgorCit2YWx1ZTJ5CistLS0xMjMKK0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0ia2V5MyIKKwordmFsdWUzCistLS0xMjMKK0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0ia2V5NCIKKwordmFsdWU0CistLS0xMjMKK0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0idXBsb2FkIjsgZmlsZW5hbWU9ImZha2UudHh0IgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK3RoaXMgaXMgdGhlIGNvbnRlbnQgb2YgdGhlIGZha2UgZmlsZQorCistLS0xMjMtLQorIiIiCisgICAgICAgIGVudmlyb24gPSB7CisgICAgICAgICAgICAnQ09OVEVOVF9MRU5HVEgnOiAgIHN0cihsZW4oZGF0YSkpLAorICAgICAgICAgICAgJ0NPTlRFTlRfVFlQRSc6ICAgICAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9LTEyMycsCisgICAgICAgICAgICAnUVVFUllfU1RSSU5HJzogICAgICdrZXkxPXZhbHVlMSZrZXkyPXZhbHVlMngnLAorICAgICAgICAgICAgJ1JFUVVFU1RfTUVUSE9EJzogICAnUE9TVCcsCisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fcXNfcmVzdWx0LmNvcHkoKQorICAgICAgICByZXN1bHQudXBkYXRlKHsKKyAgICAgICAgICAgICd1cGxvYWQnOiAndGhpcyBpcyB0aGUgY29udGVudCBvZiB0aGUgZmFrZSBmaWxlXG4nCisgICAgICAgIH0pCisgICAgICAgIHYgPSBnZW5fcmVzdWx0KGRhdGEsIGVudmlyb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCB2KQorCisgICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9wYXJzZV9xcyhzZWxmKToKKyAgICAgICAgIyB0aGlzIGZ1bmMgaXMgbW92ZWQgdG8gdXJscGFyc2UsIHRoaXMgaXMganVzdCBhIHNhbml0eSBjaGVjaworICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgnY2dpLnBhcnNlX3FzIGlzIGRlcHJlY2F0ZWQsIHVzZSB1cmxwYXJzZS4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJzZV9xcyBpbnN0ZWFkJywgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7J2EnOiBbJ0ExJ10sICdCJzogWydCMyddLCAnYic6IFsnQjInXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNnaS5wYXJzZV9xcygnYT1BMSZiPUIyJkI9QjMnKSkKKworICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfcGFyc2VfcXNsKHNlbGYpOgorICAgICAgICAjIHRoaXMgZnVuYyBpcyBtb3ZlZCB0byB1cmxwYXJzZSwgdGhpcyBpcyBqdXN0IGEgc2FuaXR5IGNoZWNrCisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCdjZ2kucGFyc2VfcXNsIGlzIGRlcHJlY2F0ZWQsIHVzZSB1cmxwYXJzZS4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJzZV9xc2wgaW5zdGVhZCcsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWygnYScsICdBMScpLCAoJ2InLCAnQjInKSwgKCdCJywgJ0IzJyldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZ2kucGFyc2VfcXNsKCdhPUExJmI9QjImQj1CMycpKQorCisgICAgZGVmIHRlc3RfcGFyc2VfaGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY2dpLnBhcnNlX2hlYWRlcigidGV4dC9wbGFpbiIpLAorICAgICAgICAgICAgKCJ0ZXh0L3BsYWluIiwge30pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY2dpLnBhcnNlX2hlYWRlcigidGV4dC92bmQuanVzdC5tYWRlLnRoaXMudXAgOyAiKSwKKyAgICAgICAgICAgICgidGV4dC92bmQuanVzdC5tYWRlLnRoaXMudXAiLCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjZ2kucGFyc2VfaGVhZGVyKCJ0ZXh0L3BsYWluO2NoYXJzZXQ9dXMtYXNjaWkiKSwKKyAgICAgICAgICAgICgidGV4dC9wbGFpbiIsIHsiY2hhcnNldCI6ICJ1cy1hc2NpaSJ9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNnaS5wYXJzZV9oZWFkZXIoJ3RleHQvcGxhaW4gOyBjaGFyc2V0PSJ1cy1hc2NpaSInKSwKKyAgICAgICAgICAgICgidGV4dC9wbGFpbiIsIHsiY2hhcnNldCI6ICJ1cy1hc2NpaSJ9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNnaS5wYXJzZV9oZWFkZXIoJ3RleHQvcGxhaW4gOyBjaGFyc2V0PSJ1cy1hc2NpaSI7IGFub3RoZXI9b3B0JyksCisgICAgICAgICAgICAoInRleHQvcGxhaW4iLCB7ImNoYXJzZXQiOiAidXMtYXNjaWkiLCAiYW5vdGhlciI6ICJvcHQifSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjZ2kucGFyc2VfaGVhZGVyKCdhdHRhY2htZW50OyBmaWxlbmFtZT0ic2lsbHkudHh0IicpLAorICAgICAgICAgICAgKCJhdHRhY2htZW50IiwgeyJmaWxlbmFtZSI6ICJzaWxseS50eHQifSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjZ2kucGFyc2VfaGVhZGVyKCdhdHRhY2htZW50OyBmaWxlbmFtZT0ic3RyYW5nZTtuYW1lIicpLAorICAgICAgICAgICAgKCJhdHRhY2htZW50IiwgeyJmaWxlbmFtZSI6ICJzdHJhbmdlO25hbWUifSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjZ2kucGFyc2VfaGVhZGVyKCdhdHRhY2htZW50OyBmaWxlbmFtZT0ic3RyYW5nZTtuYW1lIjtzaXplPTEyMzsnKSwKKyAgICAgICAgICAgICgiYXR0YWNobWVudCIsIHsiZmlsZW5hbWUiOiAic3RyYW5nZTtuYW1lIiwgInNpemUiOiAiMTIzIn0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY2dpLnBhcnNlX2hlYWRlcignZm9ybS1kYXRhOyBuYW1lPSJmaWxlcyI7IGZpbGVuYW1lPSJmb1xcIm87YmFyIicpLAorICAgICAgICAgICAgKCJmb3JtLWRhdGEiLCB7Im5hbWUiOiAiZmlsZXMiLCAiZmlsZW5hbWUiOiAnZm8ibztiYXInfSkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChDZ2lUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2dpLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NnaS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyZTdmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NnaS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2dpLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NnaS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcyZTdmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NnaS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2hhcm1hcGNvZGVjLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2hhcm1hcGNvZGVjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ODQwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jaGFybWFwY29kZWMucHkKQEAgLTAsMCArMSw1NiBAQAorIiIiIFB5dGhvbiBjaGFyYWN0ZXIgbWFwcGluZyBjb2RlYyB0ZXN0CisKK1RoaXMgdXNlcyB0aGUgdGVzdCBjb2RlYyBpbiB0ZXN0Y29kZWMucHkgYW5kIHRodXMgYWxzbyB0ZXN0cyB0aGUKK2VuY29kaW5ncyBwYWNrYWdlIGxvb2t1cCBzY2hlbWUuCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IDIwMDAgR3VpZG8gdmFuIFJvc3N1bS4KKworIiIiIyIKKworaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0LCB1bml0dGVzdAorCitpbXBvcnQgY29kZWNzCisKKyMgUmVnaXN0ZXIgYSBzZWFyY2ggZnVuY3Rpb24gd2hpY2gga25vd3MgYWJvdXQgb3VyIGNvZGVjCitkZWYgY29kZWNfc2VhcmNoX2Z1bmN0aW9uKGVuY29kaW5nKToKKyAgICBpZiBlbmNvZGluZyA9PSAndGVzdGNvZGVjJzoKKyAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0Y29kZWMKKyAgICAgICAgcmV0dXJuIHR1cGxlKHRlc3Rjb2RlYy5nZXRyZWdlbnRyeSgpKQorICAgIHJldHVybiBOb25lCisKK2NvZGVjcy5yZWdpc3Rlcihjb2RlY19zZWFyY2hfZnVuY3Rpb24pCisKKyMgdGVzdCBjb2RlYydzIG5hbWUgKHNlZSB0ZXN0L3Rlc3Rjb2RlYy5weSkKK2NvZGVjbmFtZSA9ICd0ZXN0Y29kZWMnCisKK2NsYXNzIENoYXJtYXBDb2RlY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yeChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCdhYmMnLCBjb2RlY25hbWUpLCB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgneGRlZicsIGNvZGVjbmFtZSksIHUnYWJjZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCdkZWZ4JywgY29kZWNuYW1lKSwgdSdkZWZhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJ2R4ZicsIGNvZGVjbmFtZSksIHUnZGFiY2YnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJ2R4ZngnLCBjb2RlY25hbWUpLCB1J2RhYmNmYWJjJykKKworICAgIGRlZiB0ZXN0X2VuY29kZXgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdhYmMnLmVuY29kZShjb2RlY25hbWUpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3hkZWYnLmVuY29kZShjb2RlY25hbWUpLCAnYWJjZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2RlZngnLmVuY29kZShjb2RlY25hbWUpLCAnZGVmYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2R4ZicuZW5jb2RlKGNvZGVjbmFtZSksICdkYWJjZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdkeGZ4Jy5lbmNvZGUoY29kZWNuYW1lKSwgJ2RhYmNmYWJjJykKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yeShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCd5ZGVmJywgY29kZWNuYW1lKSwgdSdkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJ2RlZnknLCBjb2RlY25hbWUpLCB1J2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnZHlmJywgY29kZWNuYW1lKSwgdSdkZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnZHlmeScsIGNvZGVjbmFtZSksIHUnZGYnKQorCisgICAgZGVmIHRlc3RfbWFwdG91bmRlZmluZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdW5pY29kZSwgJ2FiY1wwMDEnLCBjb2RlY25hbWUpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ2hhcm1hcENvZGVjVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2hhcm1hcGNvZGVjLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzYjMzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2hhcm1hcGNvZGVjLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzYjMzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2wucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MDEwMmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2wucHkKQEAgLTAsMCArMSw4MiBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiV2hpbXB5IHRlc3Qgc2NyaXB0IGZvciB0aGUgY2wgbW9kdWxlCisgICBSb2dlciBFLiBNYXNzZQorIiIiCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBpbXBvcnRfbW9kdWxlCisKK2NsID0gaW1wb3J0X21vZHVsZSgnY2wnKQorCitjbGF0dHJzID0gWydBRERFRF9BTEdPUklUSE1fRVJST1InLCAnQUxBVycsICdBTEdPUklUSE1fSUQnLAorJ0FMR09SSVRITV9WRVJTSU9OJywgJ0FVRElPJywgJ0FXQVJFX0VSUk9SJywgJ0FXQVJFX01QRUdfQVVESU8nLAorJ0FXQVJFX01VTFRJUkFURScsICdBV0NNUF9DT05TVF9RVUFMJywgJ0FXQ01QX0ZJWEVEX1JBVEUnLAorJ0FXQ01QX0lOREVQRU5ERU5UJywgJ0FXQ01QX0pPSU5UX1NURVJFTycsICdBV0NNUF9MT1NTTEVTUycsCisnQVdDTVBfTVBFR19MQVlFUl9JJywgJ0FXQ01QX01QRUdfTEFZRVJfSUknLCAnQVdDTVBfU1RFUkVPJywKKydBbGdvcml0aG0nLCAnQWxnb3JpdGhtTnVtYmVyJywgJ0FsZ29yaXRobVR5cGUnLCAnQXVkaW9Gb3JtYXROYW1lJywKKydCQURfQUxHT1JJVEhNX05BTUUnLCAnQkFEX0FMR09SSVRITV9UWVBFJywgJ0JBRF9CTE9DS19TSVpFJywKKydCQURfQk9BUkQnLCAnQkFEX0JVRkZFUklORycsICdCQURfQlVGRkVSTEVOR1RIX05FRycsCisnQkFEX0JVRkZFUkxFTkdUSF9PREQnLCAnQkFEX0JVRkZFUl9FWElTVFMnLCAnQkFEX0JVRkZFUl9IQU5ETEUnLAorJ0JBRF9CVUZGRVJfUE9JTlRFUicsICdCQURfQlVGRkVSX1FVRVJZX1NJWkUnLCAnQkFEX0JVRkZFUl9TSVpFJywKKydCQURfQlVGRkVSX1NJWkVfUE9JTlRFUicsICdCQURfQlVGRkVSX1RZUEUnLAorJ0JBRF9DT01QUkVTU0lPTl9TQ0hFTUUnLCAnQkFEX0NPTVBSRVNTT1JfSEFORExFJywKKydCQURfQ09NUFJFU1NPUl9IQU5ETEVfUE9JTlRFUicsICdCQURfRlJBTUVfU0laRScsCisnQkFEX0ZVTkNUSU9OQUxJVFknLCAnQkFEX0ZVTkNUSU9OX1BPSU5URVInLCAnQkFEX0hFQURFUl9TSVpFJywKKydCQURfSU5JVElBTF9WQUxVRScsICdCQURfSU5URVJOQUxfRk9STUFUJywgJ0JBRF9MSUNFTlNFJywKKydCQURfTUlOX0dUX01BWCcsICdCQURfTk9fQlVGRkVSU1BBQ0UnLCAnQkFEX05VTUJFUl9PRl9CTE9DS1MnLAorJ0JBRF9QQVJBTScsICdCQURfUEFSQU1fSURfUE9JTlRFUicsICdCQURfUEFSQU1fVFlQRScsICdCQURfUE9JTlRFUicsCisnQkFEX1BWQlVGRkVSJywgJ0JBRF9TQ0hFTUVfUE9JTlRFUicsICdCQURfU1RSRUFNX0hFQURFUicsCisnQkFEX1NUUklOR19QT0lOVEVSJywgJ0JBRF9URVhUX1NUUklOR19QVFInLCAnQkVTVF9GSVQnLAorJ0JJRElSRUNUSU9OQUwnLCAnQklUUkFURV9QT0xJQ1knLCAnQklUUkFURV9UQVJHRVQnLAorJ0JJVFNfUEVSX0NPTVBPTkVOVCcsICdCTEVORElORycsICdCTE9DS19TSVpFJywgJ0JPVFRPTV9VUCcsCisnQlVGRkVSX05PVF9DUkVBVEVEJywgJ0JVRl9EQVRBJywgJ0JVRl9GUkFNRScsICdCeXRlc1BlclBpeGVsJywKKydCeXRlc1BlclNhbXBsZScsICdDSEFOTkVMX1BPTElDWScsICdDSFJPTUFfVEhSRVNIT0xEJywgJ0NPREVDJywKKydDT01QT05FTlRTJywgJ0NPTVBSRVNTRURfQlVGRkVSX1NJWkUnLCAnQ09NUFJFU1NJT05fUkFUSU8nLAorJ0NPTVBSRVNTT1InLCAnQ09OVElOVU9VU19CTE9DSycsICdDT05USU5VT1VTX05PTkJMT0NLJywKKydDb21wcmVzc0ltYWdlJywgJ0RBVEEnLCAnREVDT01QUkVTU09SJywgJ0RlY29tcHJlc3NJbWFnZScsCisnRURHRV9USFJFU0hPTEQnLCAnRU5BQkxFX0lNQUdFSU5GTycsICdFTkRfT0ZfU0VRVUVOQ0UnLCAnRU5VTV9WQUxVRScsCisnRVhBQ1RfQ09NUFJFU1NJT05fUkFUSU8nLCAnRVhURVJOQUxfREVWSUNFJywgJ0ZMT0FUSU5HX0VOVU1fVkFMVUUnLAorJ0ZMT0FUSU5HX1JBTkdFX1ZBTFVFJywgJ0ZSQU1FJywgJ0ZSQU1FX0JVRkZFUl9TSVpFJywKKydGUkFNRV9CVUZGRVJfU0laRV9aRVJPJywgJ0ZSQU1FX1JBVEUnLCAnRlJBTUVfVFlQRScsICdHNzExX0FMQVcnLAorJ0c3MTFfVUxBVycsICdHUkFZU0NBTEUnLCAnR2V0QWxnb3JpdGhtTmFtZScsICdIRENDJywKKydIRENDX1NBTVBMRVNfUEVSX1RJTEUnLCAnSERDQ19USUxFX1RIUkVTSE9MRCcsICdIRUFERVJfU1RBUlRfQ09ERScsCisnSU1BR0VfSEVJR0hUJywgJ0lNQUdFX1dJRFRIJywgJ0lOVEVSTkFMX0ZPUk1BVCcsCisnSU5URVJOQUxfSU1BR0VfSEVJR0hUJywgJ0lOVEVSTkFMX0lNQUdFX1dJRFRIJywgJ0lOVFJBJywgJ0pQRUcnLAorJ0pQRUdfRVJST1InLCAnSlBFR19OVU1fUEFSQU1TJywgJ0pQRUdfUVVBTElUWV9GQUNUT1InLAorJ0pQRUdfUVVBTlRJWkFUSU9OX1RBQkxFUycsICdKUEVHX1NPRlRXQVJFJywgJ0pQRUdfU1RSRUFNX0hFQURFUlMnLAorJ0tFWUZSQU1FJywgJ0xBU1RfRlJBTUVfSU5ERVgnLCAnTEFZRVInLCAnTFVNQV9USFJFU0hPTEQnLAorJ01BWF9OVU1CRVJfT0ZfQVVESU9fQUxHT1JJVEhNUycsICdNQVhfTlVNQkVSX09GX09SSUdJTkFMX0ZPUk1BVFMnLAorJ01BWF9OVU1CRVJfT0ZfUEFSQU1TJywgJ01BWF9OVU1CRVJfT0ZfVklERU9fQUxHT1JJVEhNUycsICdNT05PJywKKydNUEVHX1ZJREVPJywgJ01WQzEnLCAnTVZDMicsICdNVkMyX0JMRU5ESU5HJywgJ01WQzJfQkxFTkRJTkdfT0ZGJywKKydNVkMyX0JMRU5ESU5HX09OJywgJ01WQzJfQ0hST01BX1RIUkVTSE9MRCcsICdNVkMyX0VER0VfVEhSRVNIT0xEJywKKydNVkMyX0VSUk9SJywgJ01WQzJfTFVNQV9USFJFU0hPTEQnLCAnTkVYVF9OT1RfQVZBSUxBQkxFJywKKydOT0lTRV9NQVJHSU4nLCAnTk9ORScsICdOVU1CRVJfT0ZfRlJBTUVTJywgJ05VTUJFUl9PRl9QQVJBTVMnLAorJ09SSUVOVEFUSU9OJywgJ09SSUdJTkFMX0ZPUk1BVCcsICdPcGVuQ29tcHJlc3NvcicsCisnT3BlbkRlY29tcHJlc3NvcicsICdQQVJBTV9PVVRfT0ZfUkFOR0UnLCAnUFJFRElDVEVEJywgJ1BSRVJPTEwnLAorJ1BhcmFtSUQnLCAnUGFyYW1OdW1iZXInLCAnUGFyYW1UeXBlJywgJ1FVQUxJVFlfRkFDVE9SJywKKydRVUFMSVRZX0xFVkVMJywgJ1F1ZXJ5QWxnb3JpdGhtcycsICdRdWVyeU1heEhlYWRlclNpemUnLAorJ1F1ZXJ5U2NoZW1lJywgJ1F1ZXJ5U2NoZW1lRnJvbU5hbWUnLCAnUkFOR0VfVkFMVUUnLCAnUkdCJywgJ1JHQjMzMicsCisnUkdCOCcsICdSR0JBJywgJ1JHQlgnLCAnUkxFJywgJ1JMRTI0JywgJ1JUUicsICdSVFIxJywKKydSVFJfUVVBTElUWV9MRVZFTCcsICdTQU1QTEVTX1BFUl9USUxFJywgJ1NDSEVNRV9CVVNZJywKKydTQ0hFTUVfTk9UX0FWQUlMQUJMRScsICdTUEVFRCcsICdTVEVSRU9fSU5URVJMRUFWRUQnLAorJ1NUUkVBTV9IRUFERVJTJywgJ1NldERlZmF1bHQnLCAnU2V0TWF4JywgJ1NldE1pbicsICdUSUxFX1RIUkVTSE9MRCcsCisnVE9QX0RPV04nLCAnVUxBVycsICdVTkNPTVBSRVNTRUQnLCAnVU5DT01QUkVTU0VEX0FVRElPJywKKydVTkNPTVBSRVNTRURfVklERU8nLCAnVU5LTk9XTl9TQ0hFTUUnLCAnVklERU8nLCAnVmlkZW9Gb3JtYXROYW1lJywKKydZJywgJ1lDYkNyJywgJ1lDYkNyNDIyJywgJ1lDYkNyNDIyREMnLCAnWUNiQ3I0MjJIQycsICdZVVYnLCAnWVVWNDIyJywKKydZVVY0MjJEQycsICdZVVY0MjJIQycsICdfX2RvY19fJywgJ19fbmFtZV9fJywgJ2N2dF90eXBlJywgJ2Vycm9yJ10KKworCisjIFRoaXMgaXMgYSB2ZXJ5IGlub2J0cnVzaXZlIHRlc3QgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGNsCisjIG1vZHVsZSBhbmQgYWxsIGl0cyBhdHRyaWJ1dGVzLgorCitkZWYgdGVzdF9tYWluKCk6CisgICAgIyB0b3VjaCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgYWwgd2l0aG91dCBkb2luZyBhbnl0aGluZworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdUb3VjaGluZyBjbCBtb2R1bGUgYXR0cmlidXRlcy4uLicKKyAgICBmb3IgYXR0ciBpbiBjbGF0dHJzOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ3RvdWNoaW5nOiAnLCBhdHRyCisgICAgICAgIGdldGF0dHIoY2wsIGF0dHIpCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1MTMxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1MTMxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbGFzcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NsYXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1Y2RmMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbGFzcy5weQpAQCAtMCwwICsxLDY0NiBAQAorIlRlc3QgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgUHl0aG9uIGNsYXNzZXMgaW1wbGVtZW50aW5nIG9wZXJhdG9ycy4iCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCit0ZXN0bWV0aHMgPSBbCisKKyMgQmluYXJ5IG9wZXJhdGlvbnMKKyAgICAiYWRkIiwKKyAgICAicmFkZCIsCisgICAgInN1YiIsCisgICAgInJzdWIiLAorICAgICJtdWwiLAorICAgICJybXVsIiwKKyAgICAiZGl2IiwKKyAgICAicmRpdiIsCisgICAgIm1vZCIsCisgICAgInJtb2QiLAorICAgICJkaXZtb2QiLAorICAgICJyZGl2bW9kIiwKKyAgICAicG93IiwKKyAgICAicnBvdyIsCisgICAgInJzaGlmdCIsCisgICAgInJyc2hpZnQiLAorICAgICJsc2hpZnQiLAorICAgICJybHNoaWZ0IiwKKyAgICAiYW5kIiwKKyAgICAicmFuZCIsCisgICAgIm9yIiwKKyAgICAicm9yIiwKKyAgICAieG9yIiwKKyAgICAicnhvciIsCisKKyMgTGlzdC9kaWN0IG9wZXJhdGlvbnMKKyAgICAiY29udGFpbnMiLAorICAgICJnZXRpdGVtIiwKKyAgICAiZ2V0c2xpY2UiLAorICAgICJzZXRpdGVtIiwKKyAgICAic2V0c2xpY2UiLAorICAgICJkZWxpdGVtIiwKKyAgICAiZGVsc2xpY2UiLAorCisjIFVuYXJ5IG9wZXJhdGlvbnMKKyAgICAibmVnIiwKKyAgICAicG9zIiwKKyAgICAiYWJzIiwKKworIyBnZW5lcmljIG9wZXJhdGlvbnMKKyAgICAiaW5pdCIsCisgICAgXQorCisjIFRoZXNlIG5lZWQgdG8gcmV0dXJuIHNvbWV0aGluZyBvdGhlciB0aGFuIE5vbmUKKyMgICAgImNvZXJjZSIsCisjICAgICJoYXNoIiwKKyMgICAgInN0ciIsCisjICAgICJyZXByIiwKKyMgICAgImludCIsCisjICAgICJsb25nIiwKKyMgICAgImZsb2F0IiwKKyMgICAgIm9jdCIsCisjICAgICJoZXgiLAorCisjIFRoZXNlIGFyZSBzZXBhcmF0ZSBiZWNhdXNlIHRoZXkgY2FuIGluZmx1ZW5jZSB0aGUgdGVzdCBvZiBvdGhlciBtZXRob2RzLgorIyAgICAiZ2V0YXR0ciIsCisjICAgICJzZXRhdHRyIiwKKyMgICAgImRlbGF0dHIiLAorCitjYWxsTHN0ID0gW10KK2RlZiB0cmFja0NhbGwoZik6CisgICAgZGVmIHRyYWNrKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGNhbGxMc3QuYXBwZW5kKChmLl9fbmFtZV9fLCBhcmdzKSkKKyAgICAgICAgcmV0dXJuIGYoKmFyZ3MsICoqa3dhcmdzKQorICAgIHJldHVybiB0cmFjaworCitjbGFzcyBBbGxUZXN0czoKKyAgICB0cmFja0NhbGwgPSB0cmFja0NhbGwKKworICAgIEB0cmFja0NhbGwKKyAgICBkZWYgX19jb2VyY2VfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiAoc2VsZiwpICsgYXJncworCisgICAgQHRyYWNrQ2FsbAorICAgIGRlZiBfX2hhc2hfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBoYXNoKGlkKHNlbGYpKQorCisgICAgQHRyYWNrQ2FsbAorICAgIGRlZiBfX3N0cl9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuICJBbGxUZXN0cyIKKworICAgIEB0cmFja0NhbGwKKyAgICBkZWYgX19yZXByX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gIkFsbFRlc3RzIgorCisgICAgQHRyYWNrQ2FsbAorICAgIGRlZiBfX2ludF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIDEKKworICAgIEB0cmFja0NhbGwKKyAgICBkZWYgX19mbG9hdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIDEuMAorCisgICAgQHRyYWNrQ2FsbAorICAgIGRlZiBfX2xvbmdfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiAxTAorCisgICAgQHRyYWNrQ2FsbAorICAgIGRlZiBfX29jdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuICcwMScKKworICAgIEB0cmFja0NhbGwKKyAgICBkZWYgX19oZXhfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiAnMHgxJworCisgICAgQHRyYWNrQ2FsbAorICAgIGRlZiBfX2NtcF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIDAKKworIyBTeW50aGVzaXplIGFsbCB0aGUgb3RoZXIgQWxsVGVzdHMgbWV0aG9kcyBmcm9tIHRoZSBuYW1lcyBpbiB0ZXN0bWV0aHMuCisKK21ldGhvZF90ZW1wbGF0ZSA9ICIiIlwKK0B0cmFja0NhbGwKK2RlZiBfXyUobWV0aG9kKXNfXyhzZWxmLCAqYXJncyk6CisgICAgcGFzcworIiIiCisKK2ZvciBtZXRob2QgaW4gdGVzdG1ldGhzOgorICAgIGV4ZWMgbWV0aG9kX3RlbXBsYXRlICUgbG9jYWxzKCkgaW4gQWxsVGVzdHMuX19kaWN0X18KKworZGVsIG1ldGhvZCwgbWV0aG9kX3RlbXBsYXRlCisKK2NsYXNzIENsYXNzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisKKyAgICBkZWYgYXNzZXJ0Q2FsbFN0YWNrKHNlbGYsIGV4cGVjdGVkX2NhbGxzKToKKyAgICAgICAgYWN0dWFsQ2FsbExpc3QgPSBjYWxsTHN0WzpdICAjIG5lZWQgdG8gY29weSBiZWNhdXNlIHRoZSBjb21wYXJpc29uIGJlbG93IHdpbGwgYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGRpdGlvbmFsIGNhbGxzIHRvIGNhbGxMc3QKKyAgICAgICAgaWYgZXhwZWN0ZWRfY2FsbHMgIT0gYWN0dWFsQ2FsbExpc3Q6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkIGNhbGwgbGlzdDpcbiAgJXNcbmRvZXMgbm90IG1hdGNoIGFjdHVhbCBjYWxsIGxpc3RcbiAgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0ZWRfY2FsbHMsIGFjdHVhbENhbGxMaXN0KSkKKworICAgIGRlZiB0ZXN0SW5pdChzZWxmKToKKyAgICAgICAgZm9vID0gQWxsVGVzdHMoKQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2luaXRfXyIsIChmb28sKSldKQorCisgICAgZGVmIHRlc3RCaW5hcnlPcHMoc2VsZik6CisgICAgICAgIHRlc3RtZSA9IEFsbFRlc3RzKCkKKyAgICAgICAgIyBCaW5hcnkgb3BlcmF0aW9ucworCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWUgKyAxCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19hZGRfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIDEgKyB0ZXN0bWUKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX3JhZGRfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZSAtIDEKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX3N1Yl9fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgMSAtIHRlc3RtZQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fcnN1Yl9fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lICogMQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fbXVsX18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICAxICogdGVzdG1lCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19ybXVsX18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGlmIDEvMiA9PSAwOgorICAgICAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgICAgICB0ZXN0bWUgLyAxCisgICAgICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fZGl2X18iLCAodGVzdG1lLCAxKSldKQorCisKKyAgICAgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICAgICAgMSAvIHRlc3RtZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX3JkaXZfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZSAlIDEKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX21vZF9fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgMSAlIHRlc3RtZQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fcm1vZF9fIiwgKHRlc3RtZSwgMSkpXSkKKworCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBkaXZtb2QodGVzdG1lLDEpCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19kaXZtb2RfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIGRpdm1vZCgxLCB0ZXN0bWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19yZGl2bW9kX18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWUgKiogMQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fcG93X18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICAxICoqIHRlc3RtZQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fcnBvd19fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lID4+IDEKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX3JzaGlmdF9fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgMSA+PiB0ZXN0bWUKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX3Jyc2hpZnRfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZSA8PCAxCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19sc2hpZnRfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIDEgPDwgdGVzdG1lCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19ybHNoaWZ0X18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWUgJiAxCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19hbmRfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIDEgJiB0ZXN0bWUKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX3JhbmRfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZSB8IDEKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX29yX18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICAxIHwgdGVzdG1lCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19yb3JfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZSBeIDEKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX3hvcl9fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgMSBeIHRlc3RtZQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fcnhvcl9fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgIGRlZiB0ZXN0TGlzdEFuZERpY3RPcHMoc2VsZik6CisgICAgICAgIHRlc3RtZSA9IEFsbFRlc3RzKCkKKworICAgICAgICAjIExpc3QvZGljdCBvcGVyYXRpb25zCisKKyAgICAgICAgY2xhc3MgRW1wdHk6IHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICAxIGluIEVtcHR5KCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnZmFpbGVkLCBzaG91bGQgaGF2ZSByYWlzZWQgVHlwZUVycm9yJykKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgMSBpbiB0ZXN0bWUKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19jb250YWluc19fJywgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lWzFdCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fZ2V0aXRlbV9fJywgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lWzFdID0gMQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX3NldGl0ZW1fXycsICh0ZXN0bWUsIDEsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIGRlbCB0ZXN0bWVbMV0KKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19kZWxpdGVtX18nLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWVbOjQyXQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2dldHNsaWNlX18nLCAodGVzdG1lLCAwLCA0MikpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lWzo0Ml0gPSAiVGhlIEFuc3dlciIKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19zZXRzbGljZV9fJywgKHRlc3RtZSwgMCwgNDIsICJUaGUgQW5zd2VyIikpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgZGVsIHRlc3RtZVs6NDJdCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fZGVsc2xpY2VfXycsICh0ZXN0bWUsIDAsIDQyKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWVbMjoxMDI0OjEwXQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2dldGl0ZW1fXycsICh0ZXN0bWUsIHNsaWNlKDIsIDEwMjQsIDEwKSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lWzI6MTAyNDoxMF0gPSAiQSBsb3QiCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fc2V0aXRlbV9fJywgKHRlc3RtZSwgc2xpY2UoMiwgMTAyNCwgMTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBsb3QiKSldKQorICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgZGVsIHRlc3RtZVsyOjEwMjQ6MTBdCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fZGVsaXRlbV9fJywgKHRlc3RtZSwgc2xpY2UoMiwgMTAyNCwgMTApKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWVbOjQyLCAuLi4sIDoyNDosIDI0LCAxMDBdCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fZ2V0aXRlbV9fJywgKHRlc3RtZSwgKHNsaWNlKE5vbmUsIDQyLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxsaXBzaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlKE5vbmUsIDI0LCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQsIDEwMCkpKV0pCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWVbOjQyLCAuLi4sIDoyNDosIDI0LCAxMDBdID0gIlN0cmFuZ2UiCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fc2V0aXRlbV9fJywgKHRlc3RtZSwgKHNsaWNlKE5vbmUsIDQyLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxsaXBzaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlKE5vbmUsIDI0LCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQsIDEwMCksICJTdHJhbmdlIikpXSkKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIGRlbCB0ZXN0bWVbOjQyLCAuLi4sIDoyNDosIDI0LCAxMDBdCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fZGVsaXRlbV9fJywgKHRlc3RtZSwgKHNsaWNlKE5vbmUsIDQyLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxsaXBzaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlKE5vbmUsIDI0LCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQsIDEwMCkpKV0pCisKKyAgICAgICAgIyBOb3cgcmVtb3ZlIHRoZSBzbGljZSBob29rcyB0byBzZWUgaWYgY29udmVydGluZyBub3JtYWwgc2xpY2VzIHRvCisgICAgICAgICMgIHNsaWNlIG9iamVjdCB3b3Jrcy4KKworICAgICAgICBnZXRzbGljZSA9IEFsbFRlc3RzLl9fZ2V0c2xpY2VfXworICAgICAgICBkZWwgQWxsVGVzdHMuX19nZXRzbGljZV9fCisgICAgICAgIHNldHNsaWNlID0gQWxsVGVzdHMuX19zZXRzbGljZV9fCisgICAgICAgIGRlbCBBbGxUZXN0cy5fX3NldHNsaWNlX18KKyAgICAgICAgZGVsc2xpY2UgPSBBbGxUZXN0cy5fX2RlbHNsaWNlX18KKyAgICAgICAgZGVsIEFsbFRlc3RzLl9fZGVsc2xpY2VfXworCisgICAgICAgICMgWFhYIHdoZW4gdXNpbmcgbmV3LXN0eWxlIGNsYXNzZXMgdGhlIHNsaWNlIHRlc3RtZVs6NDJdIHByb2R1Y2VzCisgICAgICAgICMgIHNsaWNlKE5vbmUsIDQyLCBOb25lKSBpbnN0ZWFkIG9mIHNsaWNlKDAsIDQyLCBOb25lKS4gcHkzayB3aWxsIGhhdmUKKyAgICAgICAgIyAgdG8gY2hhbmdlIHRoaXMgdGVzdC4KKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZVs6NDJdCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fZ2V0aXRlbV9fJywgKHRlc3RtZSwgc2xpY2UoMCwgNDIsIE5vbmUpKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWVbOjQyXSA9ICJUaGUgQW5zd2VyIgorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX3NldGl0ZW1fXycsICh0ZXN0bWUsIHNsaWNlKDAsIDQyLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIEFuc3dlciIpKV0pCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBkZWwgdGVzdG1lWzo0Ml0KKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19kZWxpdGVtX18nLCAodGVzdG1lLCBzbGljZSgwLCA0MiwgTm9uZSkpKV0pCisKKyAgICAgICAgIyBSZXN0b3JlIHRoZSBzbGljZSBtZXRob2RzLCBvciB0aGUgdGVzdHMgd2lsbCBmYWlsIHdpdGggcmVncnRlc3QgLVIuCisgICAgICAgIEFsbFRlc3RzLl9fZ2V0c2xpY2VfXyA9IGdldHNsaWNlCisgICAgICAgIEFsbFRlc3RzLl9fc2V0c2xpY2VfXyA9IHNldHNsaWNlCisgICAgICAgIEFsbFRlc3RzLl9fZGVsc2xpY2VfXyA9IGRlbHNsaWNlCisKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3REZWxJdGVtKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgb2sgPSBGYWxzZQorICAgICAgICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgc2VsZi5vayA9IFRydWUKKyAgICAgICAgYSA9IEEoKQorICAgICAgICAjIFN1YnRsZTogd2UgbmVlZCB0byBjYWxsIFB5U2VxdWVuY2VfU2V0SXRlbSwgbm90IFB5TWFwcGluZ19TZXRJdGVtLgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgc2VxdWVuY2VfZGVsaXRlbQorICAgICAgICBzZXF1ZW5jZV9kZWxpdGVtKGEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhLm9rKQorCisKKyAgICBkZWYgdGVzdFVuYXJ5T3BzKHNlbGYpOgorICAgICAgICB0ZXN0bWUgPSBBbGxUZXN0cygpCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIC10ZXN0bWUKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19uZWdfXycsICh0ZXN0bWUsKSldKQorICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgK3Rlc3RtZQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX3Bvc19fJywgKHRlc3RtZSwpKV0pCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBhYnModGVzdG1lKQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2Fic19fJywgKHRlc3RtZSwpKV0pCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBpbnQodGVzdG1lKQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2ludF9fJywgKHRlc3RtZSwpKV0pCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBsb25nKHRlc3RtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19sb25nX18nLCAodGVzdG1lLCkpXSkKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIGZsb2F0KHRlc3RtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19mbG9hdF9fJywgKHRlc3RtZSwpKV0pCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBvY3QodGVzdG1lKQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX29jdF9fJywgKHRlc3RtZSwpKV0pCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBoZXgodGVzdG1lKQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2hleF9fJywgKHRlc3RtZSwpKV0pCisKKworICAgIGRlZiB0ZXN0TWlzYyhzZWxmKToKKyAgICAgICAgdGVzdG1lID0gQWxsVGVzdHMoKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBoYXNoKHRlc3RtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19oYXNoX18nLCAodGVzdG1lLCkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgcmVwcih0ZXN0bWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fcmVwcl9fJywgKHRlc3RtZSwpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHN0cih0ZXN0bWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fc3RyX18nLCAodGVzdG1lLCkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lID09IDEKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCdfX2NtcF9fJywgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lIDwgMQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoJ19fY21wX18nLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWUgPiAxCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgnX19jbXBfXycsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIGV2YWwoJ3Rlc3RtZSA8PiAxJykgICMgWFhYIGtpbGwgdGhpcyBpbiBweTNrCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgnX19jbXBfXycsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZSAhPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgnX19jbXBfXycsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIDEgPT0gdGVzdG1lCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgnX19jbXBfXycsICgxLCB0ZXN0bWUpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIDEgPCB0ZXN0bWUKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCdfX2NtcF9fJywgKDEsIHRlc3RtZSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgMSA+IHRlc3RtZQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoJ19fY21wX18nLCAoMSwgdGVzdG1lKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBldmFsKCcxIDw+IHRlc3RtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgnX19jbXBfXycsICgxLCB0ZXN0bWUpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIDEgIT0gdGVzdG1lCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgnX19jbXBfXycsICgxLCB0ZXN0bWUpKV0pCisKKworICAgIGRlZiB0ZXN0R2V0U2V0QW5kRGVsKHNlbGYpOgorICAgICAgICAjIEludGVyZmVyaW5nIHRlc3RzCisgICAgICAgIGNsYXNzIEV4dHJhVGVzdHMoQWxsVGVzdHMpOgorICAgICAgICAgICAgQHRyYWNrQ2FsbAorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIlNvbWVWYWwiCisKKyAgICAgICAgICAgIEB0cmFja0NhbGwKKyAgICAgICAgICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBAdHJhY2tDYWxsCisgICAgICAgICAgICBkZWYgX19kZWxhdHRyX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0ZXN0bWUgPSBFeHRyYVRlc3RzKCkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lLnNwYW0KKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19nZXRhdHRyX18nLCAodGVzdG1lLCAic3BhbSIpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZS5lZ2dzID0gInNwYW0sIHNwYW0sIHNwYW0gYW5kIGhhbSIKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19zZXRhdHRyX18nLCAodGVzdG1lLCAiZWdncyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFtLCBzcGFtLCBzcGFtIGFuZCBoYW0iKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBkZWwgdGVzdG1lLmNhcmRpbmFsCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fZGVsYXR0cl9fJywgKHRlc3RtZSwgImNhcmRpbmFsIikpXSkKKworICAgIGRlZiB0ZXN0RGVsKHNlbGYpOgorICAgICAgICB4ID0gW10KKworICAgICAgICBjbGFzcyBEZWxUZXN0OgorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgeC5hcHBlbmQoImNyYWIgcGVvcGxlLCBjcmFiIHBlb3BsZSIpCisgICAgICAgIHRlc3RtZSA9IERlbFRlc3QoKQorICAgICAgICBkZWwgdGVzdG1lCisgICAgICAgIGltcG9ydCBnYworICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbImNyYWIgcGVvcGxlLCBjcmFiIHBlb3BsZSJdLCB4KQorCisgICAgZGVmIHRlc3RCYWRUeXBlUmV0dXJuZWQoc2VsZik6CisgICAgICAgICMgcmV0dXJuIHZhbHVlcyBvZiBzb21lIG1ldGhvZCBhcmUgdHlwZS1jaGVja2VkCisgICAgICAgIGNsYXNzIEJhZFR5cGVDbGFzczoKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBfX2Zsb2F0X18gPSBfX2ludF9fCisgICAgICAgICAgICBfX2xvbmdfXyA9IF9faW50X18KKyAgICAgICAgICAgIF9fc3RyX18gPSBfX2ludF9fCisgICAgICAgICAgICBfX3JlcHJfXyA9IF9faW50X18KKyAgICAgICAgICAgIF9fb2N0X18gPSBfX2ludF9fCisgICAgICAgICAgICBfX2hleF9fID0gX19pbnRfXworCisgICAgICAgIGZvciBmIGluIFtpbnQsIGZsb2F0LCBsb25nLCBzdHIsIHJlcHIsIG9jdCwgaGV4XToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgQmFkVHlwZUNsYXNzKCkpCisKKyAgICBkZWYgdGVzdE1peEludHNBbmRMb25ncyhzZWxmKToKKyAgICAgICAgIyBtaXhpbmcgdXAgaW50cyBhbmQgbG9uZ3MgaXMgb2theQorICAgICAgICBjbGFzcyBJbnRMb25nTWl4Q2xhc3M6CisgICAgICAgICAgICBAdHJhY2tDYWxsCisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDJMCisKKyAgICAgICAgICAgIEB0cmFja0NhbGwKKyAgICAgICAgICAgIGRlZiBfX2xvbmdfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNjQKKworICAgICAgICBtaXhJbnRBbmRMb25nID0gSW50TG9uZ01peENsYXNzKCkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgYXNfaW50ID0gaW50KG1peEludEFuZExvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhc19pbnQpLCBsb25nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzX2ludCwgNDJMKQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2ludF9fJywgKG1peEludEFuZExvbmcsKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBhc19sb25nID0gbG9uZyhtaXhJbnRBbmRMb25nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYXNfbG9uZyksIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXNfbG9uZywgNjQpCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fbG9uZ19fJywgKG1peEludEFuZExvbmcsKSldKQorCisgICAgZGVmIHRlc3RIYXNoU3R1ZmYoc2VsZik6CisgICAgICAgICMgVGVzdCBjb3JyZWN0IGVycm9ycyBmcm9tIGhhc2goKSBvbiBvYmplY3RzIHdpdGggY29tcGFyaXNvbnMgYnV0CisgICAgICAgICMgIG5vIF9faGFzaF9fCisKKyAgICAgICAgY2xhc3MgQzA6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaGFzaChDMCgpKSAjIFRoaXMgc2hvdWxkIHdvcms7IHRoZSBuZXh0IHR3byBzaG91bGQgcmFpc2UgVHlwZUVycm9yCisKKyAgICAgICAgY2xhc3MgQzE6CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6IHJldHVybiAwCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBDMSgpKQorCisgICAgICAgIGNsYXNzIEMyOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IHJldHVybiAxCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBDMigpKQorCisKKyAgICBkZWYgdGVzdFNGQnVnNTMyNjQ2KHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIFNGIGJ1ZyA1MzI2NDYKKworICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgcGFzcworICAgICAgICBBLl9fY2FsbF9fID0gQSgpCisgICAgICAgIGEgPSBBKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBhKCkgIyBUaGlzIHNob3VsZCBub3Qgc2VnZmF1bHQKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRmFpbGVkIHRvIHJhaXNlIFJ1bnRpbWVFcnJvciIpCisKKyAgICBkZWYgdGVzdEZvckV4Y2VwdGlvbnNSYWlzZWRJbkluc3RhbmNlR2V0YXR0cjIoc2VsZik6CisgICAgICAgICMgVGVzdHMgZm9yIGV4Y2VwdGlvbnMgcmFpc2VkIGluIGluc3RhbmNlX2dldGF0dHIyKCkuCisKKyAgICAgICAgZGVmIGJvb2goc2VsZik6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiYm9vaCIpCisKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGEgPSBwcm9wZXJ0eShib29oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBBKCkuYSAjIFJhaXNlZCBBdHRyaWJ1dGVFcnJvcjogQSBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICdhJworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIHg6CisgICAgICAgICAgICBpZiBzdHIoeCkgIT0gImJvb2giOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiYXR0cmlidXRlIGVycm9yIGZvciBBKCkuYSBnb3QgbWFza2VkOiAlcyIgJSB4KQorCisgICAgICAgIGNsYXNzIEU6CisgICAgICAgICAgICBfX2VxX18gPSBwcm9wZXJ0eShib29oKQorICAgICAgICBFKCkgPT0gRSgpICMgSW4gZGVidWcgbW9kZSwgY2F1c2VkIGEgQy1sZXZlbCBhc3NlcnQoKSB0byBmYWlsCisKKyAgICAgICAgY2xhc3MgSToKKyAgICAgICAgICAgIF9faW5pdF9fID0gcHJvcGVydHkoYm9vaCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBJbiBkZWJ1ZyBtb2RlLCBwcmludGVkIFhYWCB1bmRldGVjdGVkIGVycm9yIGFuZAorICAgICAgICAgICAgIyAgcmFpc2VzIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICAgICBJKCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCB4OgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJhdHRyaWJ1dGUgZXJyb3IgZm9yIEkuX19pbml0X18gZ290IG1hc2tlZCIpCisKKyAgICBkZWYgdGVzdEhhc2hDb21wYXJpc29uT2ZNZXRob2RzKHNlbGYpOgorICAgICAgICAjIFRlc3QgY29tcGFyaXNvbiBhbmQgaGFzaCBvZiBtZXRob2RzCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIGYoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIGcoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYueCA9PSBvdGhlci54CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYueAorICAgICAgICBjbGFzcyBCKEEpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGExID0gQSgxKQorICAgICAgICBhMiA9IEEoMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMS5mLCBhMS5mKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGExLmYsIGEyLmYpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYTEuZiwgYTEuZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMS5mLCBBKDEpLmYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChhMS5mKSwgaGFzaChhMS5mKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGExLmYpLCBoYXNoKEEoMSkuZikpCisKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChBLmYsIGExLmYpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoQS5mLCBBLmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQi5mLCBBLmYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChCLmYpLCBoYXNoKEEuZikpCisKKyAgICAgICAgIyB0aGUgZm9sbG93aW5nIHRyaWdnZXJzIGEgU3lzdGVtRXJyb3IgaW4gMi40CisgICAgICAgIGEgPSBBKGhhc2goQS5mLmltX2Z1bmMpXigtMSkpCisgICAgICAgIGhhc2goYS5mKQorCisgICAgZGVmIHRlc3RBdHRyU2xvdHMoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZvciBjIGluIEMsIEMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHlwZShjKS5fX2dldGF0dHJpYnV0ZV9fLCBjLCBbXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHlwZShjKS5fX3NldGF0dHJfXywgYywgW10sIFtdKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgiLitfXyhnZXR8c2V0fGRlbClzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgKCJjbGFzc2ljIGludCBkaXZpc2lvbiIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoIjw+IG5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDbGFzc1Rlc3RzKQorCitpZiBfX25hbWVfXz09J19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2xhc3MucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2xhc3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MjdhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbGFzcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2xhc3MucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2xhc3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MjdhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbGFzcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21hdGgucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWF0aC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjVjNGJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21hdGgucHkKQEAgLTAsMCArMSw0NzQgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorZnJvbSB0ZXN0LnRlc3RfbWF0aCBpbXBvcnQgcGFyc2VfdGVzdGZpbGUsIHRlc3RfZmlsZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgY21hdGgsIG1hdGgKK2Zyb20gY21hdGggaW1wb3J0IHBoYXNlLCBwb2xhciwgcmVjdCwgcGkKKworSU5GID0gZmxvYXQoJ2luZicpCitOQU4gPSBmbG9hdCgnbmFuJykKKworY29tcGxleF96ZXJvcyA9IFtjb21wbGV4KHgsIHkpIGZvciB4IGluIFswLjAsIC0wLjBdIGZvciB5IGluIFswLjAsIC0wLjBdXQorY29tcGxleF9pbmZpbml0aWVzID0gW2NvbXBsZXgoeCwgeSkgZm9yIHgsIHkgaW4gWworICAgICAgICAoSU5GLCAwLjApLCAgIyAxc3QgcXVhZHJhbnQKKyAgICAgICAgKElORiwgMi4zKSwKKyAgICAgICAgKElORiwgSU5GKSwKKyAgICAgICAgKDIuMywgSU5GKSwKKyAgICAgICAgKDAuMCwgSU5GKSwKKyAgICAgICAgKC0wLjAsIElORiksICMgMm5kIHF1YWRyYW50CisgICAgICAgICgtMi4zLCBJTkYpLAorICAgICAgICAoLUlORiwgSU5GKSwKKyAgICAgICAgKC1JTkYsIDIuMyksCisgICAgICAgICgtSU5GLCAwLjApLAorICAgICAgICAoLUlORiwgLTAuMCksICMgM3JkIHF1YWRyYW50CisgICAgICAgICgtSU5GLCAtMi4zKSwKKyAgICAgICAgKC1JTkYsIC1JTkYpLAorICAgICAgICAoLTIuMywgLUlORiksCisgICAgICAgICgtMC4wLCAtSU5GKSwKKyAgICAgICAgKDAuMCwgLUlORiksICMgNHRoIHF1YWRyYW50CisgICAgICAgICgyLjMsIC1JTkYpLAorICAgICAgICAoSU5GLCAtSU5GKSwKKyAgICAgICAgKElORiwgLTIuMyksCisgICAgICAgIChJTkYsIC0wLjApCisgICAgICAgIF1dCitjb21wbGV4X25hbnMgPSBbY29tcGxleCh4LCB5KSBmb3IgeCwgeSBpbiBbCisgICAgICAgIChOQU4sIC1JTkYpLAorICAgICAgICAoTkFOLCAtMi4zKSwKKyAgICAgICAgKE5BTiwgLTAuMCksCisgICAgICAgIChOQU4sIDAuMCksCisgICAgICAgIChOQU4sIDIuMyksCisgICAgICAgIChOQU4sIElORiksCisgICAgICAgICgtSU5GLCBOQU4pLAorICAgICAgICAoLTIuMywgTkFOKSwKKyAgICAgICAgKC0wLjAsIE5BTiksCisgICAgICAgICgwLjAsIE5BTiksCisgICAgICAgICgyLjMsIE5BTiksCisgICAgICAgIChJTkYsIE5BTikKKyAgICAgICAgXV0KKworY2xhc3MgQ01hdGhUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBsaXN0IG9mIGFsbCBmdW5jdGlvbnMgaW4gY21hdGgKKyAgICB0ZXN0X2Z1bmN0aW9ucyA9IFtnZXRhdHRyKGNtYXRoLCBmbmFtZSkgZm9yIGZuYW1lIGluIFsKKyAgICAgICAgICAgICdhY29zJywgJ2Fjb3NoJywgJ2FzaW4nLCAnYXNpbmgnLCAnYXRhbicsICdhdGFuaCcsCisgICAgICAgICAgICAnY29zJywgJ2Nvc2gnLCAnZXhwJywgJ2xvZycsICdsb2cxMCcsICdzaW4nLCAnc2luaCcsCisgICAgICAgICAgICAnc3FydCcsICd0YW4nLCAndGFuaCddXQorICAgICMgdGVzdCBmaXJzdCBhbmQgc2Vjb25kIGFyZ3VtZW50cyBpbmRlcGVuZGVudGx5IGZvciAyLWFyZ3VtZW50IGxvZworICAgIHRlc3RfZnVuY3Rpb25zLmFwcGVuZChsYW1iZGEgeCA6IGNtYXRoLmxvZyh4LCAxNzI5LiArIDBqKSkKKyAgICB0ZXN0X2Z1bmN0aW9ucy5hcHBlbmQobGFtYmRhIHggOiBjbWF0aC5sb2coMTQuLTI3aiwgeCkpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF92YWx1ZXMgPSBvcGVuKHRlc3RfZmlsZSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X3ZhbHVlcy5jbG9zZSgpCisKKyAgICBkZWYgckFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIsIHJlbF9lcnIgPSAyZS0xNSwgYWJzX2VyciA9IDVlLTMyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz1Ob25lKToKKyAgICAgICAgIiIiRmFpbCBpZiB0aGUgdHdvIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXJlIG5vdCBhbG1vc3QgZXF1YWwuCisKKyAgICAgICAgRGV0ZXJtaW5lIHdoZXRoZXIgZmxvYXRpbmctcG9pbnQgdmFsdWVzIGEgYW5kIGIgYXJlIGVxdWFsIHRvIHdpdGhpbgorICAgICAgICBhIChzbWFsbCkgcm91bmRpbmcgZXJyb3IuICBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHJlbF9lcnIgYW5kCisgICAgICAgIGFic19lcnIgYXJlIGNob3NlbiB0byBiZSBzdWl0YWJsZSBmb3IgcGxhdGZvcm1zIHdoZXJlIGEgZmxvYXQgaXMKKyAgICAgICAgcmVwcmVzZW50ZWQgYnkgYW4gSUVFRSA3NTQgZG91YmxlLiAgVGhleSBhbGxvdyBhbiBlcnJvciBvZiBiZXR3ZWVuCisgICAgICAgIDkgYW5kIDE5IHVscHMuCisgICAgICAgICIiIgorCisgICAgICAgICMgc3BlY2lhbCB2YWx1ZXMgdGVzdGluZworICAgICAgICBpZiBtYXRoLmlzbmFuKGEpOgorICAgICAgICAgICAgaWYgbWF0aC5pc25hbihiKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuZmFpbChtc2cgb3IgJ3shcn0gc2hvdWxkIGJlIG5hbicuZm9ybWF0KGIpKQorCisgICAgICAgIGlmIG1hdGguaXNpbmYoYSk6CisgICAgICAgICAgICBpZiBhID09IGI6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLmZhaWwobXNnIG9yICdmaW5pdGUgcmVzdWx0IHdoZXJlIGluZmluaXR5IGV4cGVjdGVkOiAnCisgICAgICAgICAgICAgICAgICAgICAgJ2V4cGVjdGVkIHshcn0sIGdvdCB7IXJ9Jy5mb3JtYXQoYSwgYikpCisKKyAgICAgICAgIyBpZiBib3RoIGEgYW5kIGIgYXJlIHplcm8sIGNoZWNrIHdoZXRoZXIgdGhleSBoYXZlIHRoZSBzYW1lIHNpZ24KKyAgICAgICAgIyAoaW4gdGhlb3J5IHRoZXJlIGFyZSBleGFtcGxlcyB3aGVyZSBpdCB3b3VsZCBiZSBsZWdpdGltYXRlIGZvciBhCisgICAgICAgICMgYW5kIGIgdG8gaGF2ZSBvcHBvc2l0ZSBzaWduczsgaW4gcHJhY3RpY2UgdGhlc2UgaGFyZGx5IGV2ZXIKKyAgICAgICAgIyBvY2N1cikuCisgICAgICAgIGlmIG5vdCBhIGFuZCBub3QgYjoKKyAgICAgICAgICAgIGlmIG1hdGguY29weXNpZ24oMS4sIGEpICE9IG1hdGguY29weXNpZ24oMS4sIGIpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbChtc2cgb3IgJ3plcm8gaGFzIHdyb25nIHNpZ246IGV4cGVjdGVkIHshcn0sICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dvdCB7IXJ9Jy5mb3JtYXQoYSwgYikpCisKKyAgICAgICAgIyBpZiBhLWIgb3ZlcmZsb3dzLCBvciBiIGlzIGluZmluaXRlLCByZXR1cm4gRmFsc2UuICBBZ2FpbiwgaW4KKyAgICAgICAgIyB0aGVvcnkgdGhlcmUgYXJlIGV4YW1wbGVzIHdoZXJlIGEgaXMgd2l0aGluIGEgZmV3IHVscHMgb2YgdGhlCisgICAgICAgICMgbWF4IHJlcHJlc2VudGFibGUgZmxvYXQsIGFuZCB0aGVuIGIgY291bGQgbGVnaXRpbWF0ZWx5IGJlCisgICAgICAgICMgaW5maW5pdGUuICBJbiBwcmFjdGljZSB0aGVzZSBleGFtcGxlcyBhcmUgcmFyZS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYWJzb2x1dGVfZXJyb3IgPSBhYnMoYi1hKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgdGVzdCBwYXNzZXMgaWYgZWl0aGVyIHRoZSBhYnNvbHV0ZSBlcnJvciBvciB0aGUgcmVsYXRpdmUKKyAgICAgICAgICAgICMgZXJyb3IgaXMgc3VmZmljaWVudGx5IHNtYWxsLiAgVGhlIGRlZmF1bHRzIGFtb3VudCB0byBhbgorICAgICAgICAgICAgIyBlcnJvciBvZiBiZXR3ZWVuIDkgdWxwcyBhbmQgMTkgdWxwcyBvbiBhbiBJRUVFLTc1NCBjb21wbGlhbnQKKyAgICAgICAgICAgICMgbWFjaGluZS4KKyAgICAgICAgICAgIGlmIGFic29sdXRlX2Vycm9yIDw9IG1heChhYnNfZXJyLCByZWxfZXJyICogYWJzKGEpKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5mYWlsKG1zZyBvcgorICAgICAgICAgICAgICAgICAgJ3shcn0gYW5kIHshcn0gYXJlIG5vdCBzdWZmaWNpZW50bHkgY2xvc2UnLmZvcm1hdChhLCBiKSkKKworICAgIGRlZiB0ZXN0X2NvbnN0YW50cyhzZWxmKToKKyAgICAgICAgZV9leHBlY3RlZCA9IDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYKKyAgICAgICAgcGlfZXhwZWN0ZWQgPSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY21hdGgucGksIHBpX2V4cGVjdGVkLCBwbGFjZXM9OSwKKyAgICAgICAgICAgIG1zZz0iY21hdGgucGkgaXMge307IHNob3VsZCBiZSB7fSIuZm9ybWF0KGNtYXRoLnBpLCBwaV9leHBlY3RlZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY21hdGguZSwgZV9leHBlY3RlZCwgcGxhY2VzPTksCisgICAgICAgICAgICBtc2c9ImNtYXRoLmUgaXMge307IHNob3VsZCBiZSB7fSIuZm9ybWF0KGNtYXRoLmUsIGVfZXhwZWN0ZWQpKQorCisgICAgZGVmIHRlc3RfdXNlcl9vYmplY3Qoc2VsZik6CisgICAgICAgICMgVGVzdCBhdXRvbWF0aWMgY2FsbGluZyBvZiBfX2NvbXBsZXhfXyBhbmQgX19mbG9hdF9fIGJ5IGNtYXRoCisgICAgICAgICMgZnVuY3Rpb25zCisKKyAgICAgICAgIyBzb21lIHJhbmRvbSB2YWx1ZXMgdG8gdXNlIGFzIHRlc3QgdmFsdWVzOyB3ZSBhdm9pZCB2YWx1ZXMKKyAgICAgICAgIyBmb3Igd2hpY2ggYW55IG9mIHRoZSBmdW5jdGlvbnMgaW4gY21hdGggaXMgdW5kZWZpbmVkCisgICAgICAgICMgKGkuZS4gMC4sIDEuLCAtMS4sIDFqLCAtMWopIG9yIHdvdWxkIGNhdXNlIG92ZXJmbG93CisgICAgICAgIGN4X2FyZyA9IDQuNDE5NDE0NDM5ICsgMS40OTcxMDAxMTNqCisgICAgICAgIGZsdF9hcmcgPSAtNi4xMzE2Nzc3MjUKKworICAgICAgICAjIGEgdmFyaWV0eSBvZiBub24tY29tcGxleCBudW1iZXJzLCB1c2VkIHRvIGNoZWNrIHRoYXQKKyAgICAgICAgIyBub24tY29tcGxleCByZXR1cm4gdmFsdWVzIGZyb20gX19jb21wbGV4X18gZ2l2ZSBhbiBlcnJvcgorICAgICAgICBub25fY29tcGxleGVzID0gWyJub3QgY29tcGxleCIsIDEsIDVMLCAyLiwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QoKSwgTm90SW1wbGVtZW50ZWRdCisKKyAgICAgICAgIyBOb3cgd2UgaW50cm9kdWNlIGEgdmFyaWV0eSBvZiBjbGFzc2VzIHdob3NlIGluc3RhbmNlcyBtaWdodAorICAgICAgICAjIGVuZCB1cCBiZWluZyBwYXNzZWQgdG8gdGhlIGNtYXRoIGZ1bmN0aW9ucworCisgICAgICAgICMgdXN1YWwgY2FzZTogbmV3LXN0eWxlIGNsYXNzIGltcGxlbWVudGluZyBfX2NvbXBsZXhfXworICAgICAgICBjbGFzcyBNeUNvbXBsZXgob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19jb21wbGV4X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKKworICAgICAgICAjIG9sZC1zdHlsZSBjbGFzcyBpbXBsZW1lbnRpbmcgX19jb21wbGV4X18KKyAgICAgICAgY2xhc3MgTXlDb21wbGV4T1M6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9fY29tcGxleF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCisKKyAgICAgICAgIyBjbGFzc2VzIGZvciB3aGljaCBfX2NvbXBsZXhfXyByYWlzZXMgYW4gZXhjZXB0aW9uCisgICAgICAgIGNsYXNzIFNvbWVFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgTXlDb21wbGV4RXhjZXB0aW9uKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19jb21wbGV4X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgU29tZUV4Y2VwdGlvbgorICAgICAgICBjbGFzcyBNeUNvbXBsZXhFeGNlcHRpb25PUzoKKyAgICAgICAgICAgIGRlZiBfX2NvbXBsZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBTb21lRXhjZXB0aW9uCisKKyAgICAgICAgIyBzb21lIGNsYXNzZXMgbm90IHByb3ZpZGluZyBfX2Zsb2F0X18gb3IgX19jb21wbGV4X18KKyAgICAgICAgY2xhc3MgTmVpdGhlckNvbXBsZXhOb3JGbG9hdChvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBOZWl0aGVyQ29tcGxleE5vckZsb2F0T1M6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIE15SW50KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKTogcmV0dXJuIDIKKyAgICAgICAgICAgIGRlZiBfX2xvbmdfXyhzZWxmKTogcmV0dXJuIDJMCisgICAgICAgICAgICBkZWYgX19pbmRleF9fKHNlbGYpOiByZXR1cm4gMgorICAgICAgICBjbGFzcyBNeUludE9TOgorICAgICAgICAgICAgZGVmIF9faW50X18oc2VsZik6IHJldHVybiAyCisgICAgICAgICAgICBkZWYgX19sb25nX18oc2VsZik6IHJldHVybiAyTAorICAgICAgICAgICAgZGVmIF9faW5kZXhfXyhzZWxmKTogcmV0dXJuIDIKKworICAgICAgICAjIG90aGVyIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBfX2Zsb2F0X18gYW5kIF9fY29tcGxleF9fCisgICAgICAgICMgdGhhdCBzaG91bGQgd29yaworICAgICAgICBjbGFzcyBGbG9hdEFuZENvbXBsZXgob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsdF9hcmcKKyAgICAgICAgICAgIGRlZiBfX2NvbXBsZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY3hfYXJnCisgICAgICAgIGNsYXNzIEZsb2F0QW5kQ29tcGxleE9TOgorICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmx0X2FyZworICAgICAgICAgICAgZGVmIF9fY29tcGxleF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBjeF9hcmcKKyAgICAgICAgY2xhc3MgSnVzdEZsb2F0KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBmbHRfYXJnCisgICAgICAgIGNsYXNzIEp1c3RGbG9hdE9TOgorICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmx0X2FyZworCisgICAgICAgIGZvciBmIGluIHNlbGYudGVzdF9mdW5jdGlvbnM6CisgICAgICAgICAgICAjIHVzdWFsIHVzYWdlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoTXlDb21wbGV4KGN4X2FyZykpLCBmKGN4X2FyZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoTXlDb21wbGV4T1MoY3hfYXJnKSksIGYoY3hfYXJnKSkKKyAgICAgICAgICAgICMgb3RoZXIgY29tYmluYXRpb25zIG9mIF9fZmxvYXRfXyBhbmQgX19jb21wbGV4X18KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihGbG9hdEFuZENvbXBsZXgoKSksIGYoY3hfYXJnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihGbG9hdEFuZENvbXBsZXhPUygpKSwgZihjeF9hcmcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKEp1c3RGbG9hdCgpKSwgZihmbHRfYXJnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihKdXN0RmxvYXRPUygpKSwgZihmbHRfYXJnKSkKKyAgICAgICAgICAgICMgVHlwZUVycm9yIHNob3VsZCBiZSByYWlzZWQgZm9yIGNsYXNzZXMgbm90IHByb3ZpZGluZworICAgICAgICAgICAgIyBlaXRoZXIgX19jb21wbGV4X18gb3IgX19mbG9hdF9fLCBldmVuIGlmIHRoZXkgcHJvdmlkZQorICAgICAgICAgICAgIyBfX2ludF9fLCBfX2xvbmdfXyBvciBfX2luZGV4X18uICBBbiBvbGQtc3R5bGUgY2xhc3MKKyAgICAgICAgICAgICMgY3VycmVudGx5IHJhaXNlcyBBdHRyaWJ1dGVFcnJvciBpbnN0ZWFkIG9mIGEgVHlwZUVycm9yOworICAgICAgICAgICAgIyB0aGlzIGNvdWxkIGJlIGNvbnNpZGVyZWQgYSBidWcuCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIE5laXRoZXJDb21wbGV4Tm9yRmxvYXQoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgTXlJbnQoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgZiwgTmVpdGhlckNvbXBsZXhOb3JGbG9hdE9TKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIGYsIE15SW50T1MoKSkKKyAgICAgICAgICAgICMgbm9uLWNvbXBsZXggcmV0dXJuIHZhbHVlIGZyb20gX19jb21wbGV4X18gLT4gVHlwZUVycm9yCisgICAgICAgICAgICBmb3IgYmFkX2NvbXBsZXggaW4gbm9uX2NvbXBsZXhlczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIE15Q29tcGxleChiYWRfY29tcGxleCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCBNeUNvbXBsZXhPUyhiYWRfY29tcGxleCkpCisgICAgICAgICAgICAjIGV4Y2VwdGlvbnMgaW4gX19jb21wbGV4X18gc2hvdWxkIGJlIHByb3BhZ2F0ZWQgY29ycmVjdGx5CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTb21lRXhjZXB0aW9uLCBmLCBNeUNvbXBsZXhFeGNlcHRpb24oKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFNvbWVFeGNlcHRpb24sIGYsIE15Q29tcGxleEV4Y2VwdGlvbk9TKCkpCisKKyAgICBkZWYgdGVzdF9pbnB1dF90eXBlKHNlbGYpOgorICAgICAgICAjIGludHMgYW5kIGxvbmdzIHNob3VsZCBiZSBhY2NlcHRhYmxlIGlucHV0cyB0byBhbGwgY21hdGgKKyAgICAgICAgIyBmdW5jdGlvbnMsIGJ5IHZpcnR1ZSBvZiBwcm92aWRpbmcgYSBfX2Zsb2F0X18gbWV0aG9kCisgICAgICAgIGZvciBmIGluIHNlbGYudGVzdF9mdW5jdGlvbnM6CisgICAgICAgICAgICBmb3IgYXJnIGluIFsyLCAyTCwgMi5dOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihhcmcpLCBmKGFyZy5fX2Zsb2F0X18oKSkpCisKKyAgICAgICAgIyBidXQgc3RyaW5ncyBzaG91bGQgZ2l2ZSBhIFR5cGVFcnJvcgorICAgICAgICBmb3IgZiBpbiBzZWxmLnRlc3RfZnVuY3Rpb25zOgorICAgICAgICAgICAgZm9yIGFyZyBpbiBbImEiLCAibG9uZ19zdHJpbmciLCAiMCIsICIxaiIsICIiXToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIGFyZykKKworICAgIGRlZiB0ZXN0X2NtYXRoX21hdGNoZXNfbWF0aChzZWxmKToKKyAgICAgICAgIyBjaGVjayB0aGF0IGNvcnJlc3BvbmRpbmcgY21hdGggYW5kIG1hdGggZnVuY3Rpb25zIGFyZSBlcXVhbAorICAgICAgICAjIGZvciBmbG9hdHMgaW4gdGhlIGFwcHJvcHJpYXRlIHJhbmdlCisKKyAgICAgICAgIyB0ZXN0X3ZhbHVlcyBpbiAoMCwgMSkKKyAgICAgICAgdGVzdF92YWx1ZXMgPSBbMC4wMSwgMC4xLCAwLjIsIDAuNSwgMC45LCAwLjk5XQorCisgICAgICAgICMgdGVzdF92YWx1ZXMgZm9yIGZ1bmN0aW9ucyBkZWZpbmVkIG9uIFstMS4sIDEuXQorICAgICAgICB1bml0X2ludGVydmFsID0gdGVzdF92YWx1ZXMgKyBbLXggZm9yIHggaW4gdGVzdF92YWx1ZXNdICsgXAorICAgICAgICAgICAgWzAuLCAxLiwgLTEuXQorCisgICAgICAgICMgdGVzdF92YWx1ZXMgZm9yIGxvZywgbG9nMTAsIHNxcnQKKyAgICAgICAgcG9zaXRpdmUgPSB0ZXN0X3ZhbHVlcyArIFsxLl0gKyBbMS4veCBmb3IgeCBpbiB0ZXN0X3ZhbHVlc10KKyAgICAgICAgbm9ubmVnYXRpdmUgPSBbMC5dICsgcG9zaXRpdmUKKworICAgICAgICAjIHRlc3RfdmFsdWVzIGZvciBmdW5jdGlvbnMgZGVmaW5lZCBvbiB0aGUgd2hvbGUgcmVhbCBsaW5lCisgICAgICAgIHJlYWxfbGluZSA9IFswLl0gKyBwb3NpdGl2ZSArIFsteCBmb3IgeCBpbiBwb3NpdGl2ZV0KKworICAgICAgICB0ZXN0X2Z1bmN0aW9ucyA9IHsKKyAgICAgICAgICAgICdhY29zJyA6IHVuaXRfaW50ZXJ2YWwsCisgICAgICAgICAgICAnYXNpbicgOiB1bml0X2ludGVydmFsLAorICAgICAgICAgICAgJ2F0YW4nIDogcmVhbF9saW5lLAorICAgICAgICAgICAgJ2NvcycgOiByZWFsX2xpbmUsCisgICAgICAgICAgICAnY29zaCcgOiByZWFsX2xpbmUsCisgICAgICAgICAgICAnZXhwJyA6IHJlYWxfbGluZSwKKyAgICAgICAgICAgICdsb2cnIDogcG9zaXRpdmUsCisgICAgICAgICAgICAnbG9nMTAnIDogcG9zaXRpdmUsCisgICAgICAgICAgICAnc2luJyA6IHJlYWxfbGluZSwKKyAgICAgICAgICAgICdzaW5oJyA6IHJlYWxfbGluZSwKKyAgICAgICAgICAgICdzcXJ0JyA6IG5vbm5lZ2F0aXZlLAorICAgICAgICAgICAgJ3RhbicgOiByZWFsX2xpbmUsCisgICAgICAgICAgICAndGFuaCcgOiByZWFsX2xpbmV9CisKKyAgICAgICAgZm9yIGZuLCB2YWx1ZXMgaW4gdGVzdF9mdW5jdGlvbnMuaXRlbXMoKToKKyAgICAgICAgICAgIGZsb2F0X2ZuID0gZ2V0YXR0cihtYXRoLCBmbikKKyAgICAgICAgICAgIGNvbXBsZXhfZm4gPSBnZXRhdHRyKGNtYXRoLCBmbikKKyAgICAgICAgICAgIGZvciB2IGluIHZhbHVlczoKKyAgICAgICAgICAgICAgICB6ID0gY29tcGxleF9mbih2KQorICAgICAgICAgICAgICAgIHNlbGYuckFzc2VydEFsbW9zdEVxdWFsKGZsb2F0X2ZuKHYpLCB6LnJlYWwpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLiwgei5pbWFnKQorCisgICAgICAgICMgdGVzdCB0d28tYXJndW1lbnQgdmVyc2lvbiBvZiBsb2cgd2l0aCB2YXJpb3VzIGJhc2VzCisgICAgICAgIGZvciBiYXNlIGluIFswLjUsIDIuLCAxMC5dOgorICAgICAgICAgICAgZm9yIHYgaW4gcG9zaXRpdmU6CisgICAgICAgICAgICAgICAgeiA9IGNtYXRoLmxvZyh2LCBiYXNlKQorICAgICAgICAgICAgICAgIHNlbGYuckFzc2VydEFsbW9zdEVxdWFsKG1hdGgubG9nKHYsIGJhc2UpLCB6LnJlYWwpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLiwgei5pbWFnKQorCisgICAgZGVmIHRlc3Rfc3BlY2lmaWNfdmFsdWVzKHNlbGYpOgorICAgICAgICBpZiBub3QgZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZGVmIHJlY3RfY29tcGxleCh6KToKKyAgICAgICAgICAgICIiIldyYXBwZWQgdmVyc2lvbiBvZiByZWN0IHRoYXQgYWNjZXB0cyBhIGNvbXBsZXggbnVtYmVyIGluc3RlYWQgb2YKKyAgICAgICAgICAgIHR3byBmbG9hdCBhcmd1bWVudHMuIiIiCisgICAgICAgICAgICByZXR1cm4gY21hdGgucmVjdCh6LnJlYWwsIHouaW1hZykKKworICAgICAgICBkZWYgcG9sYXJfY29tcGxleCh6KToKKyAgICAgICAgICAgICIiIldyYXBwZWQgdmVyc2lvbiBvZiBwb2xhciB0aGF0IHJldHVybnMgYSBjb21wbGV4IG51bWJlciBpbnN0ZWFkIG9mCisgICAgICAgICAgICB0d28gZmxvYXRzLiIiIgorICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXgoKnBvbGFyKHopKQorCisgICAgICAgIGZvciBpZCwgZm4sIGFyLCBhaSwgZXIsIGVpLCBmbGFncyBpbiBwYXJzZV90ZXN0ZmlsZSh0ZXN0X2ZpbGUpOgorICAgICAgICAgICAgYXJnID0gY29tcGxleChhciwgYWkpCisgICAgICAgICAgICBleHBlY3RlZCA9IGNvbXBsZXgoZXIsIGVpKQorICAgICAgICAgICAgaWYgZm4gPT0gJ3JlY3QnOgorICAgICAgICAgICAgICAgIGZ1bmN0aW9uID0gcmVjdF9jb21wbGV4CisgICAgICAgICAgICBlbGlmIGZuID09ICdwb2xhcic6CisgICAgICAgICAgICAgICAgZnVuY3Rpb24gPSBwb2xhcl9jb21wbGV4CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZ1bmN0aW9uID0gZ2V0YXR0cihjbWF0aCwgZm4pCisgICAgICAgICAgICBpZiAnZGl2aWRlLWJ5LXplcm8nIGluIGZsYWdzIG9yICdpbnZhbGlkJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGFjdHVhbCA9IGZ1bmN0aW9uKGFyZykKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ1ZhbHVlRXJyb3Igbm90IHJhaXNlZCBpbiB0ZXN0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3t9OiB7fShjb21wbGV4KHshcn0sIHshcn0pKScuZm9ybWF0KGlkLCBmbiwgYXIsIGFpKSkKKworICAgICAgICAgICAgaWYgJ292ZXJmbG93JyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGFjdHVhbCA9IGZ1bmN0aW9uKGFyZykKKyAgICAgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ092ZXJmbG93RXJyb3Igbm90IHJhaXNlZCBpbiB0ZXN0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3t9OiB7fShjb21wbGV4KHshcn0sIHshcn0pKScuZm9ybWF0KGlkLCBmbiwgYXIsIGFpKSkKKworICAgICAgICAgICAgYWN0dWFsID0gZnVuY3Rpb24oYXJnKQorCisgICAgICAgICAgICBpZiAnaWdub3JlLXJlYWwtc2lnbicgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgYWN0dWFsID0gY29tcGxleChhYnMoYWN0dWFsLnJlYWwpLCBhY3R1YWwuaW1hZykKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGNvbXBsZXgoYWJzKGV4cGVjdGVkLnJlYWwpLCBleHBlY3RlZC5pbWFnKQorICAgICAgICAgICAgaWYgJ2lnbm9yZS1pbWFnLXNpZ24nIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIGFjdHVhbCA9IGNvbXBsZXgoYWN0dWFsLnJlYWwsIGFicyhhY3R1YWwuaW1hZykpCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBjb21wbGV4KGV4cGVjdGVkLnJlYWwsIGFicyhleHBlY3RlZC5pbWFnKSkKKworICAgICAgICAgICAgIyBmb3IgdGhlIHJlYWwgcGFydCBvZiB0aGUgbG9nIGZ1bmN0aW9uLCB3ZSBhbGxvdyBhbgorICAgICAgICAgICAgIyBhYnNvbHV0ZSBlcnJvciBvZiB1cCB0byAyZS0xNS4KKyAgICAgICAgICAgIGlmIGZuIGluICgnbG9nJywgJ2xvZzEwJyk6CisgICAgICAgICAgICAgICAgcmVhbF9hYnNfZXJyID0gMmUtMTUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVhbF9hYnNfZXJyID0gNWUtMzIzCisKKyAgICAgICAgICAgIGVycm9yX21lc3NhZ2UgPSAoCisgICAgICAgICAgICAgICAgJ3t9OiB7fShjb21wbGV4KHshcn0sIHshcn0pKVxuJworICAgICAgICAgICAgICAgICdFeHBlY3RlZDogY29tcGxleCh7IXJ9LCB7IXJ9KVxuJworICAgICAgICAgICAgICAgICdSZWNlaXZlZDogY29tcGxleCh7IXJ9LCB7IXJ9KVxuJworICAgICAgICAgICAgICAgICdSZWNlaXZlZCB2YWx1ZSBpbnN1ZmZpY2llbnRseSBjbG9zZSB0byBleHBlY3RlZCB2YWx1ZS4nCisgICAgICAgICAgICAgICAgKS5mb3JtYXQoaWQsIGZuLCBhciwgYWksCisgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5yZWFsLCBleHBlY3RlZC5pbWFnLAorICAgICAgICAgICAgICAgICAgICAgYWN0dWFsLnJlYWwsIGFjdHVhbC5pbWFnKQorICAgICAgICAgICAgc2VsZi5yQXNzZXJ0QWxtb3N0RXF1YWwoZXhwZWN0ZWQucmVhbCwgYWN0dWFsLnJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzX2Vycj1yZWFsX2Fic19lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPWVycm9yX21lc3NhZ2UpCisgICAgICAgICAgICBzZWxmLnJBc3NlcnRBbG1vc3RFcXVhbChleHBlY3RlZC5pbWFnLCBhY3R1YWwuaW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9ZXJyb3JfbWVzc2FnZSkKKworICAgIGRlZiBhc3NlcnRDSVNFcXVhbChzZWxmLCBhLCBiKToKKyAgICAgICAgZXBzID0gMUUtNworICAgICAgICBpZiBhYnMoYVswXSAtIGJbMF0pID4gZXBzIG9yIGFicyhhWzFdIC0gYlsxXSkgPiBlcHM6CisgICAgICAgICAgICBzZWxmLmZhaWwoKGEgLGIpKQorCisgICAgZGVmIHRlc3RfcG9sYXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0Q0lTRXF1YWwocG9sYXIoMCksICgwLiwgMC4pKQorICAgICAgICBzZWxmLmFzc2VydENJU0VxdWFsKHBvbGFyKDEuKSwgKDEuLCAwLikpCisgICAgICAgIHNlbGYuYXNzZXJ0Q0lTRXF1YWwocG9sYXIoLTEuKSwgKDEuLCBwaSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Q0lTRXF1YWwocG9sYXIoMWopLCAoMS4sIHBpLzIpKQorICAgICAgICBzZWxmLmFzc2VydENJU0VxdWFsKHBvbGFyKC0xaiksICgxLiwgLXBpLzIpKQorCisgICAgZGVmIHRlc3RfcGhhc2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoMCksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKDEuKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoLTEuKSwgcGkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoLTEuKzFFLTMwMGopLCBwaSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZSgtMS4tMUUtMzAwaiksIC1waSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZSgxaiksIHBpLzIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoLTFqKSwgLXBpLzIpCisKKyAgICAgICAgIyB6ZXJvcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBoYXNlKGNvbXBsZXgoMC4wLCAwLjApKSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBoYXNlKGNvbXBsZXgoMC4wLCAtMC4wKSksIC0wLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGhhc2UoY29tcGxleCgtMC4wLCAwLjApKSwgcGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGhhc2UoY29tcGxleCgtMC4wLCAtMC4wKSksIC1waSkKKworICAgICAgICAjIGluZmluaXRpZXMKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZShjb21wbGV4KC1JTkYsIC0wLjApKSwgLXBpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKGNvbXBsZXgoLUlORiwgLTIuMykpLCAtcGkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoY29tcGxleCgtSU5GLCAtSU5GKSksIC0wLjc1KnBpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKGNvbXBsZXgoLTIuMywgLUlORikpLCAtcGkvMikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZShjb21wbGV4KC0wLjAsIC1JTkYpKSwgLXBpLzIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoY29tcGxleCgwLjAsIC1JTkYpKSwgLXBpLzIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoY29tcGxleCgyLjMsIC1JTkYpKSwgLXBpLzIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoY29tcGxleChJTkYsIC1JTkYpKSwgLXBpLzQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGhhc2UoY29tcGxleChJTkYsIC0yLjMpKSwgLTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaGFzZShjb21wbGV4KElORiwgLTAuMCkpLCAtMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBoYXNlKGNvbXBsZXgoSU5GLCAwLjApKSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBoYXNlKGNvbXBsZXgoSU5GLCAyLjMpKSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKGNvbXBsZXgoSU5GLCBJTkYpKSwgcGkvNCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZShjb21wbGV4KDIuMywgSU5GKSksIHBpLzIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoY29tcGxleCgwLjAsIElORikpLCBwaS8yKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKGNvbXBsZXgoLTAuMCwgSU5GKSksIHBpLzIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoY29tcGxleCgtMi4zLCBJTkYpKSwgcGkvMikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZShjb21wbGV4KC1JTkYsIElORikpLCAwLjc1KnBpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKGNvbXBsZXgoLUlORiwgMi4zKSksIHBpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKGNvbXBsZXgoLUlORiwgMC4wKSksIHBpKQorCisgICAgICAgICMgcmVhbCBvciBpbWFnaW5hcnkgcGFydCBOYU4KKyAgICAgICAgZm9yIHogaW4gY29tcGxleF9uYW5zOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4ocGhhc2UoeikpKQorCisgICAgZGVmIHRlc3RfYWJzKHNlbGYpOgorICAgICAgICAjIHplcm9zCisgICAgICAgIGZvciB6IGluIGNvbXBsZXhfemVyb3M6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyh6KSwgMC4wKQorCisgICAgICAgICMgaW5maW5pdGllcworICAgICAgICBmb3IgeiBpbiBjb21wbGV4X2luZmluaXRpZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyh6KSwgSU5GKQorCisgICAgICAgICMgcmVhbCBvciBpbWFnaW5hcnkgcGFydCBOYU4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoY29tcGxleChOQU4sIC1JTkYpKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihhYnMoY29tcGxleChOQU4sIC0yLjMpKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgLTAuMCkpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoTkFOLCAwLjApKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgMi4zKSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhjb21wbGV4KE5BTiwgSU5GKSksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoY29tcGxleCgtSU5GLCBOQU4pKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihhYnMoY29tcGxleCgtMi4zLCBOQU4pKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KC0wLjAsIE5BTikpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoMC4wLCBOQU4pKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KDIuMywgTkFOKSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhjb21wbGV4KElORiwgTkFOKSksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoTkFOLCBOQU4pKSkpCisKKyAgICAgICAgIyByZXN1bHQgb3ZlcmZsb3dzCisgICAgICAgIGlmIGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGFicywgY29tcGxleCgxLjRlMzA4LCAxLjRlMzA4KSkKKworICAgIGRlZiBhc3NlcnRDRXF1YWwoc2VsZiwgYSwgYik6CisgICAgICAgIGVwcyA9IDFFLTcKKyAgICAgICAgaWYgYWJzKGEucmVhbCAtIGJbMF0pID4gZXBzIG9yIGFicyhhLmltYWcgLSBiWzFdKSA+IGVwczoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgoYSAsYikpCisKKyAgICBkZWYgdGVzdF9yZWN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydENFcXVhbChyZWN0KDAsIDApLCAoMCwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Q0VxdWFsKHJlY3QoMSwgMCksICgxLiwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Q0VxdWFsKHJlY3QoMSwgLXBpKSwgKC0xLiwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Q0VxdWFsKHJlY3QoMSwgcGkvMiksICgwLCAxLikpCisgICAgICAgIHNlbGYuYXNzZXJ0Q0VxdWFsKHJlY3QoMSwgLXBpLzIpLCAoMCwgLTEuKSkKKworICAgIGRlZiB0ZXN0X2lzbmFuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNtYXRoLmlzbmFuKDEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNtYXRoLmlzbmFuKDFqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbWF0aC5pc25hbihJTkYpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNuYW4oTkFOKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKGNvbXBsZXgoTkFOLCAwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWF0aC5pc25hbihjb21wbGV4KDAsIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNuYW4oY29tcGxleChOQU4sIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNuYW4oY29tcGxleChOQU4sIElORikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNuYW4oY29tcGxleChJTkYsIE5BTikpKQorCisgICAgZGVmIHRlc3RfaXNpbmYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY21hdGguaXNpbmYoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY21hdGguaXNpbmYoMWopKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNtYXRoLmlzaW5mKE5BTikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWF0aC5pc2luZihJTkYpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoY29tcGxleChJTkYsIDApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzaW5mKGNvbXBsZXgoMCwgSU5GKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWF0aC5pc2luZihjb21wbGV4KElORiwgSU5GKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWF0aC5pc2luZihjb21wbGV4KE5BTiwgSU5GKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWF0aC5pc2luZihjb21wbGV4KElORiwgTkFOKSkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChDTWF0aFRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWF0aC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWF0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxMGFkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtYXRoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWF0aC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWF0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxMGFkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtYXRoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5MjU4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZC5weQpAQCAtMCwwICsxLDI0NiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiIKK1Rlc3Qgc2NyaXB0IGZvciB0aGUgJ2NtZCcgbW9kdWxlCitPcmlnaW5hbCBieSBNaWNoYWVsIFNjaG5laWRlcgorIiIiCisKKworaW1wb3J0IGNtZAoraW1wb3J0IHN5cworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCByZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgU3RyaW5nSU8KKworY2xhc3Mgc2FtcGxlY21kY2xhc3MoY21kLkNtZCk6CisgICAgIiIiCisgICAgSW5zdGFuY2UgdGhlIHNhbXBsZWNsYXNzOgorICAgID4+PiBteWNtZCA9IHNhbXBsZWNtZGNsYXNzKCkKKworICAgIFRlc3QgZm9yIHRoZSBmdW5jdGlvbiBwYXJzZWxpbmUoKToKKyAgICA+Pj4gbXljbWQucGFyc2VsaW5lKCIiKQorICAgIChOb25lLCBOb25lLCAnJykKKyAgICA+Pj4gbXljbWQucGFyc2VsaW5lKCI/IikKKyAgICAoJ2hlbHAnLCAnJywgJ2hlbHAgJykKKyAgICA+Pj4gbXljbWQucGFyc2VsaW5lKCI/aGVscCIpCisgICAgKCdoZWxwJywgJ2hlbHAnLCAnaGVscCBoZWxwJykKKyAgICA+Pj4gbXljbWQucGFyc2VsaW5lKCIhIikKKyAgICAoJ3NoZWxsJywgJycsICdzaGVsbCAnKQorICAgID4+PiBteWNtZC5wYXJzZWxpbmUoIiFjb21tYW5kIikKKyAgICAoJ3NoZWxsJywgJ2NvbW1hbmQnLCAnc2hlbGwgY29tbWFuZCcpCisgICAgPj4+IG15Y21kLnBhcnNlbGluZSgiZnVuYyIpCisgICAgKCdmdW5jJywgJycsICdmdW5jJykKKyAgICA+Pj4gbXljbWQucGFyc2VsaW5lKCJmdW5jIGFyZzEiKQorICAgICgnZnVuYycsICdhcmcxJywgJ2Z1bmMgYXJnMScpCisKKworICAgIFRlc3QgZm9yIHRoZSBmdW5jdGlvbiBvbmVjbWQoKToKKyAgICA+Pj4gbXljbWQub25lY21kKCIiKQorICAgID4+PiBteWNtZC5vbmVjbWQoImFkZCA0IDUiKQorICAgIDkKKyAgICA+Pj4gbXljbWQub25lY21kKCIiKQorICAgIDkKKyAgICA+Pj4gbXljbWQub25lY21kKCJ0ZXN0IikKKyAgICAqKiogVW5rbm93biBzeW50YXg6IHRlc3QKKworICAgIFRlc3QgZm9yIHRoZSBmdW5jdGlvbiBlbXB0eWxpbmUoKToKKyAgICA+Pj4gbXljbWQuZW1wdHlsaW5lKCkKKyAgICAqKiogVW5rbm93biBzeW50YXg6IHRlc3QKKworICAgIFRlc3QgZm9yIHRoZSBmdW5jdGlvbiBkZWZhdWx0KCk6CisgICAgPj4+IG15Y21kLmRlZmF1bHQoImRlZmF1bHQiKQorICAgICoqKiBVbmtub3duIHN5bnRheDogZGVmYXVsdAorCisgICAgVGVzdCBmb3IgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlZGVmYXVsdCgpOgorICAgID4+PiBteWNtZC5jb21wbGV0ZWRlZmF1bHQoKQorICAgIFRoaXMgaXMgdGhlIGNvbXBsZXRlZGVmYXVsdCBtZXRob2RlCisgICAgPj4+IG15Y21kLmNvbXBsZXRlbmFtZXMoImEiKQorICAgIFsnYWRkJ10KKworICAgIFRlc3QgZm9yIHRoZSBmdW5jdGlvbiBjb21wbGV0ZW5hbWVzKCk6CisgICAgPj4+IG15Y21kLmNvbXBsZXRlbmFtZXMoIjEyIikKKyAgICBbXQorICAgID4+PiBteWNtZC5jb21wbGV0ZW5hbWVzKCJoZWxwIikKKyAgICBbJ2hlbHAnXQorCisgICAgVGVzdCBmb3IgdGhlIGZ1bmN0aW9uIGNvbXBsZXRlX2hlbHAoKToKKyAgICA+Pj4gbXljbWQuY29tcGxldGVfaGVscCgiYSIpCisgICAgWydhZGQnXQorICAgID4+PiBteWNtZC5jb21wbGV0ZV9oZWxwKCJoZSIpCisgICAgWydoZWxwJ10KKyAgICA+Pj4gbXljbWQuY29tcGxldGVfaGVscCgiMTIiKQorICAgIFtdCisgICAgPj4+IHNvcnRlZChteWNtZC5jb21wbGV0ZV9oZWxwKCIiKSkKKyAgICBbJ2FkZCcsICdleGl0JywgJ2hlbHAnLCAnc2hlbGwnXQorCisgICAgVGVzdCBmb3IgdGhlIGZ1bmN0aW9uIGRvX2hlbHAoKToKKyAgICA+Pj4gbXljbWQuZG9faGVscCgidGVzdGV0IikKKyAgICAqKiogTm8gaGVscCBvbiB0ZXN0ZXQKKyAgICA+Pj4gbXljbWQuZG9faGVscCgiYWRkIikKKyAgICBoZWxwIHRleHQgZm9yIGFkZAorICAgID4+PiBteWNtZC5vbmVjbWQoImhlbHAgYWRkIikKKyAgICBoZWxwIHRleHQgZm9yIGFkZAorICAgID4+PiBteWNtZC5kb19oZWxwKCIiKQorICAgIDxCTEFOS0xJTkU+CisgICAgRG9jdW1lbnRlZCBjb21tYW5kcyAodHlwZSBoZWxwIDx0b3BpYz4pOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBhZGQgIGhlbHAKKyAgICA8QkxBTktMSU5FPgorICAgIFVuZG9jdW1lbnRlZCBjb21tYW5kczoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09CisgICAgZXhpdCAgc2hlbGwKKyAgICA8QkxBTktMSU5FPgorCisgICAgVGVzdCBmb3IgdGhlIGZ1bmN0aW9uIHByaW50X3RvcGljcygpOgorICAgID4+PiBteWNtZC5wcmludF90b3BpY3MoImhlYWRlciIsIFsiY29tbWFuZDEiLCAiY29tbWFuZDIiXSwgMiAsMTApCisgICAgaGVhZGVyCisgICAgPT09PT09CisgICAgY29tbWFuZDEKKyAgICBjb21tYW5kMgorICAgIDxCTEFOS0xJTkU+CisKKyAgICBUZXN0IGZvciB0aGUgZnVuY3Rpb24gY29sdW1uaXplKCk6CisgICAgPj4+IG15Y21kLmNvbHVtbml6ZShbc3RyKGkpIGZvciBpIGluIHhyYW5nZSgyMCldKQorICAgIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgIDEwICAxMSAgMTIgIDEzICAxNCAgMTUgIDE2ICAxNyAgMTggIDE5CisgICAgPj4+IG15Y21kLmNvbHVtbml6ZShbc3RyKGkpIGZvciBpIGluIHhyYW5nZSgyMCldLCAxMCkKKyAgICAwICA3ICAgMTQKKyAgICAxICA4ICAgMTUKKyAgICAyICA5ICAgMTYKKyAgICAzICAxMCAgMTcKKyAgICA0ICAxMSAgMTgKKyAgICA1ICAxMiAgMTkKKyAgICA2ICAxMworCisgICAgVGhpcyBpcyBhIGludGVyYWN0aXZlIHRlc3QsIHB1dCBzb21lIGNvbW1hbmRzIGluIHRoZSBjbWRxdWV1ZSBhdHRyaWJ1dGUKKyAgICBhbmQgbGV0IGl0IGV4ZWN1dGUKKyAgICBUaGlzIHRlc3QgaW5jbHVkZXMgdGhlIHByZWxvb3AoKSwgcG9zdGxvb3AoKSwgZGVmYXVsdCgpLCBlbXB0eWxpbmUoKSwKKyAgICBwYXJzZWxpbmUoKSwgZG9faGVscCgpIGZ1bmN0aW9ucworICAgID4+PiBteWNtZC51c2VfcmF3aW5wdXQ9MAorICAgID4+PiBteWNtZC5jbWRxdWV1ZT1bIiIsICJhZGQiLCAiYWRkIDQgNSIsICJoZWxwIiwgImhlbHAgYWRkIiwiZXhpdCJdCisgICAgPj4+IG15Y21kLmNtZGxvb3AoKQorICAgIEhlbGxvIGZyb20gcHJlbG9vcAorICAgIGhlbHAgdGV4dCBmb3IgYWRkCisgICAgKioqIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cworICAgIDkKKyAgICA8QkxBTktMSU5FPgorICAgIERvY3VtZW50ZWQgY29tbWFuZHMgKHR5cGUgaGVscCA8dG9waWM+KToKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgYWRkICBoZWxwCisgICAgPEJMQU5LTElORT4KKyAgICBVbmRvY3VtZW50ZWQgY29tbWFuZHM6CisgICAgPT09PT09PT09PT09PT09PT09PT09PQorICAgIGV4aXQgIHNoZWxsCisgICAgPEJMQU5LTElORT4KKyAgICBoZWxwIHRleHQgZm9yIGFkZAorICAgIEhlbGxvIGZyb20gcG9zdGxvb3AKKyAgICAiIiIKKworICAgIGRlZiBwcmVsb29wKHNlbGYpOgorICAgICAgICBwcmludCAiSGVsbG8gZnJvbSBwcmVsb29wIgorCisgICAgZGVmIHBvc3Rsb29wKHNlbGYpOgorICAgICAgICBwcmludCAiSGVsbG8gZnJvbSBwb3N0bG9vcCIKKworICAgIGRlZiBjb21wbGV0ZWRlZmF1bHQoc2VsZiwgKmlnbm9yZWQpOgorICAgICAgICBwcmludCAiVGhpcyBpcyB0aGUgY29tcGxldGVkZWZhdWx0IG1ldGhvZGUiCisgICAgICAgIHJldHVybgorCisgICAgZGVmIGNvbXBsZXRlX2NvbW1hbmQoc2VsZik6CisgICAgICAgIHByaW50ICJjb21wbGV0ZSBjb21tYW5kIgorICAgICAgICByZXR1cm4KKworICAgIGRlZiBkb19zaGVsbChzZWxmLCBzKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGRvX2FkZChzZWxmLCBzKToKKyAgICAgICAgbCA9IHMuc3BsaXQoKQorICAgICAgICBpZiBsZW4obCkgIT0gMjoKKyAgICAgICAgICAgIHByaW50ICIqKiogaW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzIgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGwgPSBbaW50KGkpIGZvciBpIGluIGxdCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcHJpbnQgIioqKiBhcmd1bWVudHMgc2hvdWxkIGJlIG51bWJlcnMiCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcHJpbnQgbFswXStsWzFdCisKKyAgICBkZWYgaGVscF9hZGQoc2VsZik6CisgICAgICAgIHByaW50ICJoZWxwIHRleHQgZm9yIGFkZCIKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgZG9fZXhpdChzZWxmLCBhcmcpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIFRlc3RBbHRlcm5hdGVJbnB1dCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBjbGFzcyBzaW1wbGVjbWQoY21kLkNtZCk6CisKKyAgICAgICAgZGVmIGRvX3ByaW50KHNlbGYsIGFyZ3MpOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgYXJncworCisgICAgICAgIGRlZiBkb19FT0Yoc2VsZiwgYXJncyk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisKKyAgICBjbGFzcyBzaW1wbGVjbWQyKHNpbXBsZWNtZCk6CisKKyAgICAgICAgZGVmIGRvX0VPRihzZWxmLCBhcmdzKToKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKiogVW5rbm93biBzeW50YXg6IEVPRicKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKworICAgIGRlZiB0ZXN0X2ZpbGVfd2l0aF9taXNzaW5nX2ZpbmFsX25sKHNlbGYpOgorICAgICAgICBpbnB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCJwcmludCB0ZXN0XG5wcmludCB0ZXN0MiIpCisgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgY21kID0gc2VsZi5zaW1wbGVjbWQoc3RkaW49aW5wdXQsIHN0ZG91dD1vdXRwdXQpCisgICAgICAgIGNtZC51c2VfcmF3aW5wdXQgPSBGYWxzZQorICAgICAgICBjbWQuY21kbG9vcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0TXVsdGlMaW5lRXF1YWwob3V0cHV0LmdldHZhbHVlKCksCisgICAgICAgICAgICAoIihDbWQpIHRlc3RcbiIKKyAgICAgICAgICAgICAiKENtZCkgdGVzdDJcbiIKKyAgICAgICAgICAgICAiKENtZCkgIikpCisKKworICAgIGRlZiB0ZXN0X2lucHV0X3Jlc2V0X2F0X0VPRihzZWxmKToKKyAgICAgICAgaW5wdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygicHJpbnQgdGVzdFxucHJpbnQgdGVzdDIiKQorICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGNtZCA9IHNlbGYuc2ltcGxlY21kMihzdGRpbj1pbnB1dCwgc3Rkb3V0PW91dHB1dCkKKyAgICAgICAgY21kLnVzZV9yYXdpbnB1dCA9IEZhbHNlCisgICAgICAgIGNtZC5jbWRsb29wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRNdWx0aUxpbmVFcXVhbChvdXRwdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICgiKENtZCkgdGVzdFxuIgorICAgICAgICAgICAgICIoQ21kKSB0ZXN0MlxuIgorICAgICAgICAgICAgICIoQ21kKSAqKiogVW5rbm93biBzeW50YXg6IEVPRlxuIikpCisgICAgICAgIGlucHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oInByaW50IFxuXG4iKQorICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGNtZC5zdGRpbiA9IGlucHV0CisgICAgICAgIGNtZC5zdGRvdXQgPSBvdXRwdXQKKyAgICAgICAgY21kLmNtZGxvb3AoKQorICAgICAgICBzZWxmLmFzc2VydE11bHRpTGluZUVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgKCIoQ21kKSBcbiIKKyAgICAgICAgICAgICAiKENtZCkgXG4iCisgICAgICAgICAgICAgIihDbWQpICoqKiBVbmtub3duIHN5bnRheDogRU9GXG4iKSkKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2NtZAorICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X2NtZCwgdmVyYm9zZSkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RBbHRlcm5hdGVJbnB1dCkKKworZGVmIHRlc3RfY292ZXJhZ2UoY292ZXJkaXIpOgorICAgIHRyYWNlID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RyYWNlJykKKyAgICB0cmFjZXI9dHJhY2UuVHJhY2UoaWdub3JlZGlycz1bc3lzLnByZWZpeCwgc3lzLmV4ZWNfcHJlZml4LF0sCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZT0wLCBjb3VudD0xKQorICAgIHRyYWNlci5ydW4oJ3JlbG9hZChjbWQpO3Rlc3RfbWFpbigpJykKKyAgICByPXRyYWNlci5yZXN1bHRzKCkKKyAgICBwcmludCAiV3JpdGluZyBjb3ZlcmFnZSByZXN1bHRzLi4uIgorICAgIHIud3JpdGVfcmVzdWx0cyhzaG93X21pc3Npbmc9VHJ1ZSwgc3VtbWFyeT1UcnVlLCBjb3ZlcmRpcj1jb3ZlcmRpcikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBpZiAiLWMiIGluIHN5cy5hcmd2OgorICAgICAgICB0ZXN0X2NvdmVyYWdlKCcvdG1wL2NtZC5jb3ZlcicpCisgICAgZWxpZiAiLWkiIGluIHN5cy5hcmd2OgorICAgICAgICBzYW1wbGVjbWRjbGFzcygpLmNtZGxvb3AoKQorICAgIGVsc2U6CisgICAgICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWY2N2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWY2N2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZF9saW5lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZjI2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZS5weQpAQCAtMCwwICsxLDE0MyBAQAorIyBUZXN0cyBpbnZvY2F0aW9uIG9mIHRoZSBpbnRlcnByZXRlciB3aXRoIHZhcmlvdXMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworIyBBbGwgdGVzdHMgYXJlIGV4ZWN1dGVkIHdpdGggZW52aXJvbm1lbnQgdmFyaWFibGVzIGlnbm9yZWQKKyMgU2VlIHRlc3RfY21kX2xpbmVfc2NyaXB0LnB5IGZvciB0ZXN0aW5nIG9mIHNjcmlwdCBleGVjdXRpb24KKworaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0CitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCAoCisgICAgYXNzZXJ0X3B5dGhvbl9vaywgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlLCBzcGF3bl9weXRob24sIGtpbGxfcHl0aG9uLAorICAgIHB5dGhvbl9leGl0X2NvZGUKKykKKworCitjbGFzcyBDbWRMaW5lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHN0YXJ0X3B5dGhvbihzZWxmLCAqYXJncyk6CisgICAgICAgIHAgPSBzcGF3bl9weXRob24oKmFyZ3MpCisgICAgICAgIHJldHVybiBraWxsX3B5dGhvbihwKQorCisgICAgZGVmIGV4aXRfY29kZShzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBweXRob25fZXhpdF9jb2RlKCphcmdzKQorCisgICAgZGVmIHRlc3RfZGlyZWN0b3JpZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5leGl0X2NvZGUoJy4nKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmV4aXRfY29kZSgnPCAuJyksIDApCisKKyAgICBkZWYgdmVyaWZ5X3ZhbGlkX2ZsYWcoc2VsZiwgY21kX2xpbmUpOgorICAgICAgICBkYXRhID0gc2VsZi5zdGFydF9weXRob24oY21kX2xpbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhID09ICcnIG9yIGRhdGEuZW5kc3dpdGgoJ1xuJykpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ1RyYWNlYmFjaycsIGRhdGEpCisKKyAgICBkZWYgdGVzdF9vcHRpbWl6ZShzZWxmKToKKyAgICAgICAgc2VsZi52ZXJpZnlfdmFsaWRfZmxhZygnLU8nKQorICAgICAgICBzZWxmLnZlcmlmeV92YWxpZF9mbGFnKCctT08nKQorCisgICAgZGVmIHRlc3RfcShzZWxmKToKKyAgICAgICAgc2VsZi52ZXJpZnlfdmFsaWRfZmxhZygnLVFvbGQnKQorICAgICAgICBzZWxmLnZlcmlmeV92YWxpZF9mbGFnKCctUW5ldycpCisgICAgICAgIHNlbGYudmVyaWZ5X3ZhbGlkX2ZsYWcoJy1Rd2FybicpCisgICAgICAgIHNlbGYudmVyaWZ5X3ZhbGlkX2ZsYWcoJy1Rd2FybmFsbCcpCisKKyAgICBkZWYgdGVzdF9zaXRlX2ZsYWcoc2VsZik6CisgICAgICAgIHNlbGYudmVyaWZ5X3ZhbGlkX2ZsYWcoJy1TJykKKworICAgIGRlZiB0ZXN0X3VzYWdlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEluKCd1c2FnZScsIHNlbGYuc3RhcnRfcHl0aG9uKCctaCcpKQorCisgICAgZGVmIHRlc3RfdmVyc2lvbihzZWxmKToKKyAgICAgICAgdmVyc2lvbiA9ICdQeXRob24gJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuc3RhcnRfcHl0aG9uKCctVicpLnN0YXJ0c3dpdGgodmVyc2lvbikpCisKKyAgICBkZWYgdGVzdF9ydW5fbW9kdWxlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZXhwZWN0ZWQgb3BlcmF0aW9uIG9mIHRoZSAnLW0nIHN3aXRjaAorICAgICAgICAjIFN3aXRjaCBuZWVkcyBhbiBhcmd1bWVudAorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZXhpdF9jb2RlKCctbScpLCAwKQorICAgICAgICAjIENoZWNrIHdlIGdldCBhbiBlcnJvciBmb3IgYSBub25leGlzdGVudCBtb2R1bGUKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKKyAgICAgICAgICAgIHNlbGYuZXhpdF9jb2RlKCctbScsICdmbm9yZDQzNTIweHl6JyksCisgICAgICAgICAgICAwKQorICAgICAgICAjIENoZWNrIHRoZSBydW5weSBtb2R1bGUgYWxzbyBnaXZlcyBhbiBlcnJvciBmb3IKKyAgICAgICAgIyBhIG5vbmV4aXN0ZW50IG1vZHVsZQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAorICAgICAgICAgICAgc2VsZi5leGl0X2NvZGUoJy1tJywgJ3J1bnB5JywgJ2Zub3JkNDM1MjB4eXonKSwKKyAgICAgICAgICAgIDApCisgICAgICAgICMgQWxsIGdvb2QgaWYgbW9kdWxlIGlzIGxvY2F0ZWQgYW5kIHJ1biBzdWNjZXNzZnVsbHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYuZXhpdF9jb2RlKCctbScsICd0aW1laXQnLCAnLW4nLCAnMScpLAorICAgICAgICAgICAgMCkKKworICAgIGRlZiB0ZXN0X3J1bl9tb2R1bGVfYnVnMTc2NDQwNyhzZWxmKToKKyAgICAgICAgIyAtbSBhbmQgLWkgbmVlZCB0byBwbGF5IHdlbGwgdG9nZXRoZXIKKyAgICAgICAgIyBSdW5zIHRoZSB0aW1laXQgbW9kdWxlIGFuZCBjaGVja3MgdGhlIF9fbWFpbl9fCisgICAgICAgICMgbmFtZXNwYWNlIGhhcyBiZWVuIHBvcHVsYXRlZCBhcHByb3ByaWF0ZWx5CisgICAgICAgIHAgPSBzcGF3bl9weXRob24oJy1pJywgJy1tJywgJ3RpbWVpdCcsICctbicsICcxJykKKyAgICAgICAgcC5zdGRpbi53cml0ZSgnVGltZXJcbicpCisgICAgICAgIHAuc3RkaW4ud3JpdGUoJ2V4aXQoKVxuJykKKyAgICAgICAgZGF0YSA9IGtpbGxfcHl0aG9uKHApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhLnN0YXJ0c3dpdGgoJzEgbG9vcCcpKQorICAgICAgICBzZWxmLmFzc2VydEluKCdfX21haW5fXy5UaW1lcicsIGRhdGEpCisKKyAgICBkZWYgdGVzdF9ydW5fY29kZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGV4cGVjdGVkIG9wZXJhdGlvbiBvZiB0aGUgJy1jJyBzd2l0Y2gKKyAgICAgICAgIyBTd2l0Y2ggbmVlZHMgYW4gYXJndW1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmV4aXRfY29kZSgnLWMnKSwgMCkKKyAgICAgICAgIyBDaGVjayB3ZSBnZXQgYW4gZXJyb3IgZm9yIGFuIHVuY2F1Z2h0IGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAorICAgICAgICAgICAgc2VsZi5leGl0X2NvZGUoJy1jJywgJ3JhaXNlIEV4Y2VwdGlvbicpLAorICAgICAgICAgICAgMCkKKyAgICAgICAgIyBBbGwgZ29vZCBpZiBleGVjdXRpb24gaXMgc3VjY2Vzc2Z1bAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5leGl0X2NvZGUoJy1jJywgJ3Bhc3MnKSwKKyAgICAgICAgICAgIDApCisKKyAgICBkZWYgdGVzdF9oYXNoX3JhbmRvbWl6YXRpb24oc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgLVIgZW5hYmxlcyBoYXNoIHJhbmRvbWl6YXRpb246CisgICAgICAgIHNlbGYudmVyaWZ5X3ZhbGlkX2ZsYWcoJy1SJykKKyAgICAgICAgaGFzaGVzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMik6CisgICAgICAgICAgICBjb2RlID0gJ3ByaW50KGhhc2goInNwYW0iKSknCisgICAgICAgICAgICBkYXRhID0gc2VsZi5zdGFydF9weXRob24oJy1SJywgJy1jJywgY29kZSkKKyAgICAgICAgICAgIGhhc2hlcy5hcHBlbmQoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChoYXNoZXNbMF0sIGhhc2hlc1sxXSkKKworICAgICAgICAjIFZlcmlmeSB0aGF0IHN5cy5mbGFncyBjb250YWlucyBoYXNoX3JhbmRvbWl6YXRpb24KKyAgICAgICAgY29kZSA9ICdpbXBvcnQgc3lzOyBwcmludCBzeXMuZmxhZ3MnCisgICAgICAgIGRhdGEgPSBzZWxmLnN0YXJ0X3B5dGhvbignLVInLCAnLWMnLCBjb2RlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2hhc2hfcmFuZG9taXphdGlvbj0xJyBpbiBkYXRhKQorCisgICAgZGVmIHRlc3RfZGVsX19fbWFpbl9fKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNTAwMTogUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MoKSBkaWQgY3Jhc2ggYmVjYXVzZSBpdCBrZXB0IGEKKyAgICAgICAgIyBib3Jyb3dlZCByZWZlcmVuY2UgdG8gdGhlIGRpY3Qgb2YgX19tYWluX18gbW9kdWxlIGFuZCBsYXRlciBtb2RpZnkKKyAgICAgICAgIyB0aGUgZGljdCB3aGVyZWFzIHRoZSBtb2R1bGUgd2FzIGRlc3Ryb3llZAorICAgICAgICBmaWxlbmFtZSA9IHRlc3QudGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmFkZENsZWFudXAodGVzdC50ZXN0X3N1cHBvcnQudW5saW5rLCBmaWxlbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAidyIpIGFzIHNjcmlwdDoKKyAgICAgICAgICAgIHByaW50ID4+c2NyaXB0LCAiaW1wb3J0IHN5cyIKKyAgICAgICAgICAgIHByaW50ID4+c2NyaXB0LCAiZGVsIHN5cy5tb2R1bGVzWydfX21haW5fXyddIgorICAgICAgICBhc3NlcnRfcHl0aG9uX29rKGZpbGVuYW1lKQorCisgICAgZGVmIHRlc3RfdW5rbm93bl9vcHRpb25zKHNlbGYpOgorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoJy1FJywgJy16JykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1Vua25vd24gb3B0aW9uOiAteicsIGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuc3BsaXRsaW5lcygpLmNvdW50KGInVW5rbm93biBvcHRpb246IC16JyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBvdXQpCisgICAgICAgICMgQWRkICJ3aXRob3V0PSctRSciIHRvIHByZXZlbnQgX2Fzc2VydF9weXRob24gdG8gYXBwZW5kIC1FCisgICAgICAgICMgdG8gZW52X3ZhcnMgYW5kIGNoYW5nZSB0aGUgb3V0cHV0IG9mIHN0ZGVycgorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoJy16Jywgd2l0aG91dD0nLUUnKQorICAgICAgICBzZWxmLmFzc2VydEluKGInVW5rbm93biBvcHRpb246IC16JywgZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyci5zcGxpdGxpbmVzKCkuY291bnQoYidVbmtub3duIG9wdGlvbjogLXonKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJycsIG91dCkKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKCctYScsICcteicsIHdpdGhvdXQ9Jy1FJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1Vua25vd24gb3B0aW9uOiAtYScsIGVycikKKyAgICAgICAgIyBvbmx5IHRoZSBmaXJzdCB1bmtub3duIG9wdGlvbiBpcyByZXBvcnRlZAorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGInVW5rbm93biBvcHRpb246IC16JywgZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyci5zcGxpdGxpbmVzKCkuY291bnQoYidVbmtub3duIG9wdGlvbjogLWEnKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJycsIG91dCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENtZExpbmVUZXN0KQorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzMmQzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZF9saW5lLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzMmQzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZF9saW5lLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwNTIyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weQpAQCAtMCwwICsxLDIyOSBAQAorIyBUZXN0cyBjb21tYW5kIGxpbmUgZXhlY3V0aW9uIG9mIHNjcmlwdHMKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCAocnVuX3B5dGhvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9kaXIsIG1ha2Vfc2NyaXB0LCBjb21waWxlX3NjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0X3B5dGhvbl9mYWlsdXJlLCBtYWtlX3BrZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV96aXBfc2NyaXB0LCBtYWtlX3ppcF9wa2cpCisKK3ZlcmJvc2UgPSB0ZXN0LnRlc3Rfc3VwcG9ydC52ZXJib3NlCisKKworZXhhbXBsZV9hcmdzID0gWyd0ZXN0MScsICd0ZXN0MicsICd0ZXN0MyddCisKK3Rlc3Rfc291cmNlID0gIiIiXAorIyBTY3JpcHQgbWF5IGJlIHJ1biB3aXRoIG9wdGltaXNhdGlvbiBlbmFibGVkLCBzbyBkb24ndCByZWx5IG9uIGFzc2VydAorIyBzdGF0ZW1lbnRzIGJlaW5nIGV4ZWN1dGVkCitkZWYgYXNzZXJ0RXF1YWwobGhzLCByaHMpOgorICAgIGlmIGxocyAhPSByaHM6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCclciAhPSAlcicgJSAobGhzLCByaHMpKQorZGVmIGFzc2VydElkZW50aWNhbChsaHMsIHJocyk6CisgICAgaWYgbGhzIGlzIG5vdCByaHM6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCclciBpcyBub3QgJXInICUgKGxocywgcmhzKSkKKyMgQ2hlY2sgYmFzaWMgY29kZSBleGVjdXRpb24KK3Jlc3VsdCA9IFsnVG9wIGxldmVsIGFzc2lnbm1lbnQnXQorZGVmIGYoKToKKyAgICByZXN1bHQuYXBwZW5kKCdMb3dlciBsZXZlbCByZWZlcmVuY2UnKQorZigpCithc3NlcnRFcXVhbChyZXN1bHQsIFsnVG9wIGxldmVsIGFzc2lnbm1lbnQnLCAnTG93ZXIgbGV2ZWwgcmVmZXJlbmNlJ10pCisjIENoZWNrIHBvcHVsYXRpb24gb2YgbWFnaWMgdmFyaWFibGVzCithc3NlcnRFcXVhbChfX25hbWVfXywgJ19fbWFpbl9fJykKK3ByaW50ICdfX2ZpbGVfXz09JXInICUgX19maWxlX18KK3ByaW50ICdfX3BhY2thZ2VfXz09JXInICUgX19wYWNrYWdlX18KKyMgQ2hlY2sgdGhlIHN5cyBtb2R1bGUKK2ltcG9ydCBzeXMKK2Fzc2VydElkZW50aWNhbChnbG9iYWxzKCksIHN5cy5tb2R1bGVzW19fbmFtZV9fXS5fX2RpY3RfXykKK3ByaW50ICdzeXMuYXJndlswXT09JXInICUgc3lzLmFyZ3ZbMF0KKyIiIgorCitkZWYgX21ha2VfdGVzdF9zY3JpcHQoc2NyaXB0X2Rpciwgc2NyaXB0X2Jhc2VuYW1lLCBzb3VyY2U9dGVzdF9zb3VyY2UpOgorICAgIHJldHVybiBtYWtlX3NjcmlwdChzY3JpcHRfZGlyLCBzY3JpcHRfYmFzZW5hbWUsIHNvdXJjZSkKKworZGVmIF9tYWtlX3Rlc3RfemlwX3BrZyh6aXBfZGlyLCB6aXBfYmFzZW5hbWUsIHBrZ19uYW1lLCBzY3JpcHRfYmFzZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZT10ZXN0X3NvdXJjZSwgZGVwdGg9MSk6CisgICAgcmV0dXJuIG1ha2VfemlwX3BrZyh6aXBfZGlyLCB6aXBfYmFzZW5hbWUsIHBrZ19uYW1lLCBzY3JpcHRfYmFzZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsIGRlcHRoKQorCisjIFRoZXJlJ3Mgbm8gZWFzeSB3YXkgdG8gcGFzcyB0aGUgc2NyaXB0IGRpcmVjdG9yeSBpbiB0byBnZXQKKyMgLW0gdG8gd29yayAoYXZvaWRpbmcgdGhhdCBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgbWFraW5nCisjIGRpcmVjdG9yaWVzIGFuZCB6aXBmaWxlcyBleGVjdXRhYmxlISkKKyMgU28gd2UgZmFrZSBpdCBmb3IgdGVzdGluZyBwdXJwb3NlcyB3aXRoIGEgY3VzdG9tIGxhdW5jaCBzY3JpcHQKK2xhdW5jaF9zb3VyY2UgPSAiIiJcCitpbXBvcnQgc3lzLCBvcy5wYXRoLCBydW5weQorc3lzLnBhdGguaW5zZXJ0KDAsICVzKQorcnVucHkuX3J1bl9tb2R1bGVfYXNfbWFpbiglcikKKyIiIgorCitkZWYgX21ha2VfbGF1bmNoX3NjcmlwdChzY3JpcHRfZGlyLCBzY3JpcHRfYmFzZW5hbWUsIG1vZHVsZV9uYW1lLCBwYXRoPU5vbmUpOgorICAgIGlmIHBhdGggaXMgTm9uZToKKyAgICAgICAgcGF0aCA9ICJvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIgorICAgIGVsc2U6CisgICAgICAgIHBhdGggPSByZXByKHBhdGgpCisgICAgc291cmNlID0gbGF1bmNoX3NvdXJjZSAlIChwYXRoLCBtb2R1bGVfbmFtZSkKKyAgICByZXR1cm4gbWFrZV9zY3JpcHQoc2NyaXB0X2Rpciwgc2NyaXB0X2Jhc2VuYW1lLCBzb3VyY2UpCisKK2NsYXNzIENtZExpbmVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX2NoZWNrX3NjcmlwdChzZWxmLCBzY3JpcHRfbmFtZSwgZXhwZWN0ZWRfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9hcmd2MCwgZXhwZWN0ZWRfcGFja2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY21kX2xpbmVfc3dpdGNoZXMpOgorICAgICAgICBydW5fYXJncyA9IGNtZF9saW5lX3N3aXRjaGVzICsgKHNjcmlwdF9uYW1lLCkKKyAgICAgICAgZXhpdF9jb2RlLCBkYXRhID0gcnVuX3B5dGhvbigqcnVuX2FyZ3MpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnT3V0cHV0IGZyb20gdGVzdCBzY3JpcHQgJXI6JyAlIHNjcmlwdF9uYW1lCisgICAgICAgICAgICBwcmludCBkYXRhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhpdF9jb2RlLCAwKQorICAgICAgICBwcmludGVkX2ZpbGUgPSAnX19maWxlX189PSVyJyAlIGV4cGVjdGVkX2ZpbGUKKyAgICAgICAgcHJpbnRlZF9hcmd2MCA9ICdzeXMuYXJndlswXT09JXInICUgZXhwZWN0ZWRfYXJndjAKKyAgICAgICAgcHJpbnRlZF9wYWNrYWdlID0gJ19fcGFja2FnZV9fPT0lcicgJSBleHBlY3RlZF9wYWNrYWdlCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnRXhwZWN0ZWQgb3V0cHV0OicKKyAgICAgICAgICAgIHByaW50IHByaW50ZWRfZmlsZQorICAgICAgICAgICAgcHJpbnQgcHJpbnRlZF9wYWNrYWdlCisgICAgICAgICAgICBwcmludCBwcmludGVkX2FyZ3YwCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocHJpbnRlZF9maWxlLCBkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEluKHByaW50ZWRfcGFja2FnZSwgZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihwcmludGVkX2FyZ3YwLCBkYXRhKQorCisgICAgZGVmIF9jaGVja19pbXBvcnRfZXJyb3Ioc2VsZiwgc2NyaXB0X25hbWUsIGV4cGVjdGVkX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY21kX2xpbmVfc3dpdGNoZXMpOgorICAgICAgICBydW5fYXJncyA9IGNtZF9saW5lX3N3aXRjaGVzICsgKHNjcmlwdF9uYW1lLCkKKyAgICAgICAgZXhpdF9jb2RlLCBkYXRhID0gcnVuX3B5dGhvbigqcnVuX2FyZ3MpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnT3V0cHV0IGZyb20gdGVzdCBzY3JpcHQgJXI6JyAlIHNjcmlwdF9uYW1lCisgICAgICAgICAgICBwcmludCBkYXRhCisgICAgICAgICAgICBwcmludCAnRXhwZWN0ZWQgb3V0cHV0OiAlcicgJSBleHBlY3RlZF9tc2cKKyAgICAgICAgc2VsZi5hc3NlcnRJbihleHBlY3RlZF9tc2csIGRhdGEpCisKKyAgICBkZWYgdGVzdF9iYXNpY19zY3JpcHQoc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBfbWFrZV90ZXN0X3NjcmlwdChzY3JpcHRfZGlyLCAnc2NyaXB0JykKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NjcmlwdChzY3JpcHRfbmFtZSwgc2NyaXB0X25hbWUsIHNjcmlwdF9uYW1lLCBOb25lKQorCisgICAgZGVmIHRlc3Rfc2NyaXB0X2NvbXBpbGVkKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gX21ha2VfdGVzdF9zY3JpcHQoc2NyaXB0X2RpciwgJ3NjcmlwdCcpCisgICAgICAgICAgICBjb21waWxlZF9uYW1lID0gY29tcGlsZV9zY3JpcHQoc2NyaXB0X25hbWUpCisgICAgICAgICAgICBvcy5yZW1vdmUoc2NyaXB0X25hbWUpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQoY29tcGlsZWRfbmFtZSwgY29tcGlsZWRfbmFtZSwgY29tcGlsZWRfbmFtZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IF9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsICdfX21haW5fXycpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQoc2NyaXB0X2Rpciwgc2NyaXB0X25hbWUsIHNjcmlwdF9kaXIsICcnKQorCisgICAgZGVmIHRlc3RfZGlyZWN0b3J5X2NvbXBpbGVkKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gX21ha2VfdGVzdF9zY3JpcHQoc2NyaXB0X2RpciwgJ19fbWFpbl9fJykKKyAgICAgICAgICAgIGNvbXBpbGVkX25hbWUgPSBjb21waWxlX3NjcmlwdChzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIG9zLnJlbW92ZShzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NjcmlwdChzY3JpcHRfZGlyLCBjb21waWxlZF9uYW1lLCBzY3JpcHRfZGlyLCAnJykKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yeV9lcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBtc2cgPSAiY2FuJ3QgZmluZCAnX19tYWluX18nIG1vZHVsZSBpbiAlciIgJSBzY3JpcHRfZGlyCisgICAgICAgICAgICBzZWxmLl9jaGVja19pbXBvcnRfZXJyb3Ioc2NyaXB0X2RpciwgbXNnKQorCisgICAgZGVmIHRlc3RfemlwZmlsZShzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IF9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsICdfX21haW5fXycpCisgICAgICAgICAgICB6aXBfbmFtZSwgcnVuX25hbWUgPSBtYWtlX3ppcF9zY3JpcHQoc2NyaXB0X2RpciwgJ3Rlc3RfemlwJywgc2NyaXB0X25hbWUpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQoemlwX25hbWUsIHJ1bl9uYW1lLCB6aXBfbmFtZSwgJycpCisKKyAgICBkZWYgdGVzdF96aXBmaWxlX2NvbXBpbGVkKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gX21ha2VfdGVzdF9zY3JpcHQoc2NyaXB0X2RpciwgJ19fbWFpbl9fJykKKyAgICAgICAgICAgIGNvbXBpbGVkX25hbWUgPSBjb21waWxlX3NjcmlwdChzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIHppcF9uYW1lLCBydW5fbmFtZSA9IG1ha2VfemlwX3NjcmlwdChzY3JpcHRfZGlyLCAndGVzdF96aXAnLCBjb21waWxlZF9uYW1lKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2NyaXB0KHppcF9uYW1lLCBydW5fbmFtZSwgemlwX25hbWUsICcnKQorCisgICAgZGVmIHRlc3RfemlwZmlsZV9lcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IF9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsICdub3RfbWFpbicpCisgICAgICAgICAgICB6aXBfbmFtZSwgcnVuX25hbWUgPSBtYWtlX3ppcF9zY3JpcHQoc2NyaXB0X2RpciwgJ3Rlc3RfemlwJywgc2NyaXB0X25hbWUpCisgICAgICAgICAgICBtc2cgPSAiY2FuJ3QgZmluZCAnX19tYWluX18nIG1vZHVsZSBpbiAlciIgJSB6aXBfbmFtZQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfaW1wb3J0X2Vycm9yKHppcF9uYW1lLCBtc2cpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfaW5fcGFja2FnZShzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBwa2dfZGlyID0gb3MucGF0aC5qb2luKHNjcmlwdF9kaXIsICd0ZXN0X3BrZycpCisgICAgICAgICAgICBtYWtlX3BrZyhwa2dfZGlyKQorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBfbWFrZV90ZXN0X3NjcmlwdChwa2dfZGlyLCAnc2NyaXB0JykKKyAgICAgICAgICAgIGxhdW5jaF9uYW1lID0gX21ha2VfbGF1bmNoX3NjcmlwdChzY3JpcHRfZGlyLCAnbGF1bmNoJywgJ3Rlc3RfcGtnLnNjcmlwdCcpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQobGF1bmNoX25hbWUsIHNjcmlwdF9uYW1lLCBzY3JpcHRfbmFtZSwgJ3Rlc3RfcGtnJykKKworICAgIGRlZiB0ZXN0X21vZHVsZV9pbl9wYWNrYWdlX2luX3ppcGZpbGUoc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgemlwX25hbWUsIHJ1bl9uYW1lID0gX21ha2VfdGVzdF96aXBfcGtnKHNjcmlwdF9kaXIsICd0ZXN0X3ppcCcsICd0ZXN0X3BrZycsICdzY3JpcHQnKQorICAgICAgICAgICAgbGF1bmNoX25hbWUgPSBfbWFrZV9sYXVuY2hfc2NyaXB0KHNjcmlwdF9kaXIsICdsYXVuY2gnLCAndGVzdF9wa2cuc2NyaXB0JywgemlwX25hbWUpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQobGF1bmNoX25hbWUsIHJ1bl9uYW1lLCBydW5fbmFtZSwgJ3Rlc3RfcGtnJykKKworICAgIGRlZiB0ZXN0X21vZHVsZV9pbl9zdWJwYWNrYWdlX2luX3ppcGZpbGUoc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgemlwX25hbWUsIHJ1bl9uYW1lID0gX21ha2VfdGVzdF96aXBfcGtnKHNjcmlwdF9kaXIsICd0ZXN0X3ppcCcsICd0ZXN0X3BrZycsICdzY3JpcHQnLCBkZXB0aD0yKQorICAgICAgICAgICAgbGF1bmNoX25hbWUgPSBfbWFrZV9sYXVuY2hfc2NyaXB0KHNjcmlwdF9kaXIsICdsYXVuY2gnLCAndGVzdF9wa2cudGVzdF9wa2cuc2NyaXB0JywgemlwX25hbWUpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQobGF1bmNoX25hbWUsIHJ1bl9uYW1lLCBydW5fbmFtZSwgJ3Rlc3RfcGtnLnRlc3RfcGtnJykKKworICAgIGRlZiB0ZXN0X3BhY2thZ2Uoc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgcGtnX2RpciA9IG9zLnBhdGguam9pbihzY3JpcHRfZGlyLCAndGVzdF9wa2cnKQorICAgICAgICAgICAgbWFrZV9wa2cocGtnX2RpcikKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gX21ha2VfdGVzdF9zY3JpcHQocGtnX2RpciwgJ19fbWFpbl9fJykKKyAgICAgICAgICAgIGxhdW5jaF9uYW1lID0gX21ha2VfbGF1bmNoX3NjcmlwdChzY3JpcHRfZGlyLCAnbGF1bmNoJywgJ3Rlc3RfcGtnJykKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NjcmlwdChsYXVuY2hfbmFtZSwgc2NyaXB0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0X25hbWUsICd0ZXN0X3BrZycpCisKKyAgICBkZWYgdGVzdF9wYWNrYWdlX2NvbXBpbGVkKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIHBrZ19kaXIgPSBvcy5wYXRoLmpvaW4oc2NyaXB0X2RpciwgJ3Rlc3RfcGtnJykKKyAgICAgICAgICAgIG1ha2VfcGtnKHBrZ19kaXIpCisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IF9tYWtlX3Rlc3Rfc2NyaXB0KHBrZ19kaXIsICdfX21haW5fXycpCisgICAgICAgICAgICBjb21waWxlZF9uYW1lID0gY29tcGlsZV9zY3JpcHQoc2NyaXB0X25hbWUpCisgICAgICAgICAgICBvcy5yZW1vdmUoc2NyaXB0X25hbWUpCisgICAgICAgICAgICBsYXVuY2hfbmFtZSA9IF9tYWtlX2xhdW5jaF9zY3JpcHQoc2NyaXB0X2RpciwgJ2xhdW5jaCcsICd0ZXN0X3BrZycpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQobGF1bmNoX25hbWUsIGNvbXBpbGVkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRfbmFtZSwgJ3Rlc3RfcGtnJykKKworICAgIGRlZiB0ZXN0X3BhY2thZ2VfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgcGtnX2RpciA9IG9zLnBhdGguam9pbihzY3JpcHRfZGlyLCAndGVzdF9wa2cnKQorICAgICAgICAgICAgbWFrZV9wa2cocGtnX2RpcikKKyAgICAgICAgICAgIG1zZyA9ICgiJ3Rlc3RfcGtnJyBpcyBhIHBhY2thZ2UgYW5kIGNhbm5vdCAiCisgICAgICAgICAgICAgICAgICAgImJlIGRpcmVjdGx5IGV4ZWN1dGVkIikKKyAgICAgICAgICAgIGxhdW5jaF9uYW1lID0gX21ha2VfbGF1bmNoX3NjcmlwdChzY3JpcHRfZGlyLCAnbGF1bmNoJywgJ3Rlc3RfcGtnJykKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ltcG9ydF9lcnJvcihsYXVuY2hfbmFtZSwgbXNnKQorCisgICAgZGVmIHRlc3RfcGFja2FnZV9yZWN1cnNpb24oc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgcGtnX2RpciA9IG9zLnBhdGguam9pbihzY3JpcHRfZGlyLCAndGVzdF9wa2cnKQorICAgICAgICAgICAgbWFrZV9wa2cocGtnX2RpcikKKyAgICAgICAgICAgIG1haW5fZGlyID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdfX21haW5fXycpCisgICAgICAgICAgICBtYWtlX3BrZyhtYWluX2RpcikKKyAgICAgICAgICAgIG1zZyA9ICgiQ2Fubm90IHVzZSBwYWNrYWdlIGFzIF9fbWFpbl9fIG1vZHVsZTsgIgorICAgICAgICAgICAgICAgICAgICIndGVzdF9wa2cnIGlzIGEgcGFja2FnZSBhbmQgY2Fubm90ICIKKyAgICAgICAgICAgICAgICAgICAiYmUgZGlyZWN0bHkgZXhlY3V0ZWQiKQorICAgICAgICAgICAgbGF1bmNoX25hbWUgPSBfbWFrZV9sYXVuY2hfc2NyaXB0KHNjcmlwdF9kaXIsICdsYXVuY2gnLCAndGVzdF9wa2cnKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfaW1wb3J0X2Vycm9yKGxhdW5jaF9uYW1lLCBtc2cpCisKKyAgICBkZWYgdGVzdF9kYXNoX21fZXJyb3JfY29kZV9pc19vbmUoc2VsZik6CisgICAgICAgICMgSWYgYSBtb2R1bGUgaXMgaW52b2tlZCB3aXRoIHRoZSAtbSBjb21tYW5kIGxpbmUgZmxhZworICAgICAgICAjIGFuZCByZXN1bHRzIGluIGFuIGVycm9yIHRoYXQgdGhlIHJldHVybiBjb2RlIHRvIHRoZQorICAgICAgICAjIHNoZWxsIGlzICcxJworICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIHBrZ19kaXIgPSBvcy5wYXRoLmpvaW4oc2NyaXB0X2RpciwgJ3Rlc3RfcGtnJykKKyAgICAgICAgICAgIG1ha2VfcGtnKHBrZ19kaXIpCisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IF9tYWtlX3Rlc3Rfc2NyaXB0KHBrZ19kaXIsICdvdGhlcicsICJpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOiByYWlzZSBWYWx1ZUVycm9yIikKKyAgICAgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLW0nLCAndGVzdF9wa2cub3RoZXInLCAqZXhhbXBsZV9hcmdzKQorICAgICAgICAgICAgaWYgdmVyYm9zZSA+IDE6CisgICAgICAgICAgICAgICAgcHJpbnQob3V0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgMSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENtZExpbmVUZXN0KQorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTQyYmYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTQyYmYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2FkZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZS5weQpAQCAtMCwwICsxLDE0NyBAQAorIiIiVGhpcyBtb2R1bGUgaW5jbHVkZXMgdGVzdHMgb2YgdGhlIGNvZGUgb2JqZWN0IHJlcHJlc2VudGF0aW9uLgorCis+Pj4gZGVmIGYoeCk6CisuLi4gICAgIGRlZiBnKHkpOgorLi4uICAgICAgICAgcmV0dXJuIHggKyB5CisuLi4gICAgIHJldHVybiBnCisuLi4KKworPj4+IGR1bXAoZi5mdW5jX2NvZGUpCituYW1lOiBmCithcmdjb3VudDogMQorbmFtZXM6ICgpCit2YXJuYW1lczogKCd4JywgJ2cnKQorY2VsbHZhcnM6ICgneCcsKQorZnJlZXZhcnM6ICgpCitubG9jYWxzOiAyCitmbGFnczogMworY29uc3RzOiAoJ05vbmUnLCAnPGNvZGUgb2JqZWN0IGc+JykKKworPj4+IGR1bXAoZig0KS5mdW5jX2NvZGUpCituYW1lOiBnCithcmdjb3VudDogMQorbmFtZXM6ICgpCit2YXJuYW1lczogKCd5JywpCitjZWxsdmFyczogKCkKK2ZyZWV2YXJzOiAoJ3gnLCkKK25sb2NhbHM6IDEKK2ZsYWdzOiAxOQorY29uc3RzOiAoJ05vbmUnLCkKKworPj4+IGRlZiBoKHgsIHkpOgorLi4uICAgICBhID0geCArIHkKKy4uLiAgICAgYiA9IHggLSB5CisuLi4gICAgIGMgPSBhICogYgorLi4uICAgICByZXR1cm4gYworLi4uCis+Pj4gZHVtcChoLmZ1bmNfY29kZSkKK25hbWU6IGgKK2FyZ2NvdW50OiAyCituYW1lczogKCkKK3Zhcm5hbWVzOiAoJ3gnLCAneScsICdhJywgJ2InLCAnYycpCitjZWxsdmFyczogKCkKK2ZyZWV2YXJzOiAoKQorbmxvY2FsczogNQorZmxhZ3M6IDY3Citjb25zdHM6ICgnTm9uZScsKQorCis+Pj4gZGVmIGF0dHJzKG9iaik6CisuLi4gICAgIHByaW50IG9iai5hdHRyMQorLi4uICAgICBwcmludCBvYmouYXR0cjIKKy4uLiAgICAgcHJpbnQgb2JqLmF0dHIzCisKKz4+PiBkdW1wKGF0dHJzLmZ1bmNfY29kZSkKK25hbWU6IGF0dHJzCithcmdjb3VudDogMQorbmFtZXM6ICgnYXR0cjEnLCAnYXR0cjInLCAnYXR0cjMnKQordmFybmFtZXM6ICgnb2JqJywpCitjZWxsdmFyczogKCkKK2ZyZWV2YXJzOiAoKQorbmxvY2FsczogMQorZmxhZ3M6IDY3Citjb25zdHM6ICgnTm9uZScsKQorCis+Pj4gZGVmIG9wdGltaXplX2F3YXkoKToKKy4uLiAgICAgJ2RvYyBzdHJpbmcnCisuLi4gICAgICdub3QgYSBkb2NzdHJpbmcnCisuLi4gICAgIDUzCisuLi4gICAgIDUzTAorCis+Pj4gZHVtcChvcHRpbWl6ZV9hd2F5LmZ1bmNfY29kZSkKK25hbWU6IG9wdGltaXplX2F3YXkKK2FyZ2NvdW50OiAwCituYW1lczogKCkKK3Zhcm5hbWVzOiAoKQorY2VsbHZhcnM6ICgpCitmcmVldmFyczogKCkKK25sb2NhbHM6IDAKK2ZsYWdzOiA2NworY29uc3RzOiAoIidkb2Mgc3RyaW5nJyIsICdOb25lJykKKworIiIiCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdlYWtyZWYKK2ltcG9ydCBfdGVzdGNhcGkKKworCitkZWYgY29uc3RzKHQpOgorICAgICIiIllpZWxkIGEgZG9jdGVzdC1zYWZlIHNlcXVlbmNlIG9mIG9iamVjdCByZXBycy4iIiIKKyAgICBmb3IgZWx0IGluIHQ6CisgICAgICAgIHIgPSByZXByKGVsdCkKKyAgICAgICAgaWYgci5zdGFydHN3aXRoKCI8Y29kZSBvYmplY3QiKToKKyAgICAgICAgICAgIHlpZWxkICI8Y29kZSBvYmplY3QgJXM+IiAlIGVsdC5jb19uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB5aWVsZCByCisKK2RlZiBkdW1wKGNvKToKKyAgICAiIiJQcmludCBvdXQgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGEgY29kZSBvYmplY3QuIiIiCisgICAgZm9yIGF0dHIgaW4gWyJuYW1lIiwgImFyZ2NvdW50IiwgIm5hbWVzIiwgInZhcm5hbWVzIiwgImNlbGx2YXJzIiwKKyAgICAgICAgICAgICAgICAgImZyZWV2YXJzIiwgIm5sb2NhbHMiLCAiZmxhZ3MiXToKKyAgICAgICAgcHJpbnQgIiVzOiAlcyIgJSAoYXR0ciwgZ2V0YXR0cihjbywgImNvXyIgKyBhdHRyKSkKKyAgICBwcmludCAiY29uc3RzOiIsIHR1cGxlKGNvbnN0cyhjby5jb19jb25zdHMpKQorCisKK2NsYXNzIENvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X25ld2VtcHR5KHNlbGYpOgorICAgICAgICBjbyA9IF90ZXN0Y2FwaS5jb2RlX25ld2VtcHR5KCJmaWxlbmFtZSIsICJmdW5jbmFtZSIsIDE1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvLmNvX2ZpbGVuYW1lLCAiZmlsZW5hbWUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvLmNvX25hbWUsICJmdW5jbmFtZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28uY29fZmlyc3RsaW5lbm8sIDE1KQorCisKK2NsYXNzIENvZGVXZWFrUmVmVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgYSBjb2RlIG9iamVjdCBpbiBhIGNsZWFuIGVudmlyb25tZW50IHNvIHRoYXQgd2Uga25vdyB3ZSBoYXZlCisgICAgICAgICMgdGhlIG9ubHkgcmVmZXJlbmNlIHRvIGl0IGxlZnQuCisgICAgICAgIG5hbWVzcGFjZSA9IHt9CisgICAgICAgIGV4ZWMgImRlZiBmKCk6IHBhc3MiIGluIGdsb2JhbHMoKSwgbmFtZXNwYWNlCisgICAgICAgIGYgPSBuYW1lc3BhY2VbImYiXQorICAgICAgICBkZWwgbmFtZXNwYWNlCisKKyAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQorICAgICAgICBkZWYgY2FsbGJhY2soY29kZSk6CisgICAgICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUKKworICAgICAgICAjIGYgaXMgbm93IHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUgZnVuY3Rpb24sIGFuZCB0aHJvdWdoIGl0LCB0aGUgY29kZQorICAgICAgICAjIG9iamVjdC4gIFdoaWxlIHdlIGhvbGQgaXQsIGNoZWNrIHRoYXQgd2UgY2FuIGNyZWF0ZSBhIHdlYWtyZWYgYW5kCisgICAgICAgICMgZGVyZWYgaXQuICBUaGVuIGRlbGV0ZSBpdCwgYW5kIGNoZWNrIHRoYXQgdGhlIGNhbGxiYWNrIGdldHMgY2FsbGVkIGFuZAorICAgICAgICAjIHRoZSByZWZlcmVuY2UgZGllcy4KKyAgICAgICAgY29kZXJlZiA9IHdlYWtyZWYucmVmKGYuX19jb2RlX18sIGNhbGxiYWNrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYm9vbChjb2RlcmVmKCkpKQorICAgICAgICBkZWwgZgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGJvb2woY29kZXJlZigpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY2FsbGVkKQorCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fZG9jdGVzdCwgcnVuX3VuaXR0ZXN0CisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2NvZGUKKyAgICBydW5fZG9jdGVzdCh0ZXN0X2NvZGUsIHZlcmJvc2UpCisgICAgcnVuX3VuaXR0ZXN0KENvZGVUZXN0LCBDb2RlV2Vha1JlZlRlc3QpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDZjNjhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDZjNjhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWMyZGYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHkKQEAgLTAsMCArMSw4MDQgQEAKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydCwgdW5pdHRlc3QKK2ltcG9ydCBzeXMsIGNvZGVjcywgaHRtbGVudGl0eWRlZnMsIHVuaWNvZGVkYXRhCisKK2NsYXNzIFBvc1JldHVybjoKKyAgICAjIHRoaXMgY2FuIGJlIHVzZWQgZm9yIGNvbmZpZ3VyYWJsZSBjYWxsYmFja3MKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5wb3MgPSAwCisKKyAgICBkZWYgaGFuZGxlKHNlbGYsIGV4Yyk6CisgICAgICAgIG9sZHBvcyA9IHNlbGYucG9zCisgICAgICAgIHJlYWxwb3MgPSBvbGRwb3MKKyAgICAgICAgaWYgcmVhbHBvczwwOgorICAgICAgICAgICAgcmVhbHBvcyA9IGxlbihleGMub2JqZWN0KSArIHJlYWxwb3MKKyAgICAgICAgIyBpZiB3ZSBkb24ndCBhZHZhbmNlIHRoaXMgdGltZSwgdGVybWluYXRlIG9uIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgIyBvdGhlcndpc2Ugd2UnZCBnZXQgYW4gZW5kbGVzcyBsb29wCisgICAgICAgIGlmIHJlYWxwb3MgPD0gZXhjLnN0YXJ0OgorICAgICAgICAgICAgc2VsZi5wb3MgPSBsZW4oZXhjLm9iamVjdCkKKyAgICAgICAgcmV0dXJuICh1Ijw/PiIsIG9sZHBvcykKKworIyBBIFVuaWNvZGVFbmNvZGVFcnJvciBvYmplY3Qgd2l0aCBhIGJhZCBzdGFydCBhdHRyaWJ1dGUKK2NsYXNzIEJhZFN0YXJ0VW5pY29kZUVuY29kZUVycm9yKFVuaWNvZGVFbmNvZGVFcnJvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IuX19pbml0X18oc2VsZiwgImFzY2lpIiwgdSIiLCAwLCAxLCAiYmFkIikKKyAgICAgICAgc2VsZi5zdGFydCA9IFtdCisKKyMgQSBVbmljb2RlRW5jb2RlRXJyb3Igb2JqZWN0IHdpdGggYSBiYWQgb2JqZWN0IGF0dHJpYnV0ZQorY2xhc3MgQmFkT2JqZWN0VW5pY29kZUVuY29kZUVycm9yKFVuaWNvZGVFbmNvZGVFcnJvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IuX19pbml0X18oc2VsZiwgImFzY2lpIiwgdSIiLCAwLCAxLCAiYmFkIikKKyAgICAgICAgc2VsZi5vYmplY3QgPSBbXQorCisjIEEgVW5pY29kZURlY29kZUVycm9yIG9iamVjdCB3aXRob3V0IGFuIGVuZCBhdHRyaWJ1dGUKK2NsYXNzIE5vRW5kVW5pY29kZURlY29kZUVycm9yKFVuaWNvZGVEZWNvZGVFcnJvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBVbmljb2RlRGVjb2RlRXJyb3IuX19pbml0X18oc2VsZiwgImFzY2lpIiwgIiIsIDAsIDEsICJiYWQiKQorICAgICAgICBkZWwgc2VsZi5lbmQKKworIyBBIFVuaWNvZGVEZWNvZGVFcnJvciBvYmplY3Qgd2l0aCBhIGJhZCBvYmplY3QgYXR0cmlidXRlCitjbGFzcyBCYWRPYmplY3RVbmljb2RlRGVjb2RlRXJyb3IoVW5pY29kZURlY29kZUVycm9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFVuaWNvZGVEZWNvZGVFcnJvci5fX2luaXRfXyhzZWxmLCAiYXNjaWkiLCAiIiwgMCwgMSwgImJhZCIpCisgICAgICAgIHNlbGYub2JqZWN0ID0gW10KKworIyBBIFVuaWNvZGVUcmFuc2xhdGVFcnJvciBvYmplY3Qgd2l0aG91dCBhIHN0YXJ0IGF0dHJpYnV0ZQorY2xhc3MgTm9TdGFydFVuaWNvZGVUcmFuc2xhdGVFcnJvcihVbmljb2RlVHJhbnNsYXRlRXJyb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgVW5pY29kZVRyYW5zbGF0ZUVycm9yLl9faW5pdF9fKHNlbGYsIHUiIiwgMCwgMSwgImJhZCIpCisgICAgICAgIGRlbCBzZWxmLnN0YXJ0CisKKyMgQSBVbmljb2RlVHJhbnNsYXRlRXJyb3Igb2JqZWN0IHdpdGhvdXQgYW4gZW5kIGF0dHJpYnV0ZQorY2xhc3MgTm9FbmRVbmljb2RlVHJhbnNsYXRlRXJyb3IoVW5pY29kZVRyYW5zbGF0ZUVycm9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFVuaWNvZGVUcmFuc2xhdGVFcnJvci5fX2luaXRfXyhzZWxmLCAgdSIiLCAwLCAxLCAiYmFkIikKKyAgICAgICAgZGVsIHNlbGYuZW5kCisKKyMgQSBVbmljb2RlVHJhbnNsYXRlRXJyb3Igb2JqZWN0IHdpdGhvdXQgYW4gb2JqZWN0IGF0dHJpYnV0ZQorY2xhc3MgTm9PYmplY3RVbmljb2RlVHJhbnNsYXRlRXJyb3IoVW5pY29kZVRyYW5zbGF0ZUVycm9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFVuaWNvZGVUcmFuc2xhdGVFcnJvci5fX2luaXRfXyhzZWxmLCB1IiIsIDAsIDEsICJiYWQiKQorICAgICAgICBkZWwgc2VsZi5vYmplY3QKKworY2xhc3MgQ29kZWNDYWxsYmFja1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfeG1sY2hhcnJlZnJlcGxhY2Uoc2VsZik6CisgICAgICAgICMgcmVwbGFjZSB1bmVuY29kYWJsZSBjaGFyYWN0ZXJzIHdoaWNoIG51bWVyaWMgY2hhcmFjdGVyIGVudGl0aWVzLgorICAgICAgICAjIEZvciBhc2NpaSwgbGF0aW4tMSBhbmQgY2hhcm1hcHMgdGhpcyBpcyBjb21wbGV0ZWx5IGltcGxlbWVudGVkCisgICAgICAgICMgaW4gQyBhbmQgc2hvdWxkIGJlIHJlYXNvbmFibHkgZmFzdC4KKyAgICAgICAgcyA9IHUiXHUzMGI5XHUzMGQxXHUzMGUyIFx4ZTRuZCBlZ2dzIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcy5lbmNvZGUoImFzY2lpIiwgInhtbGNoYXJyZWZyZXBsYWNlIiksCisgICAgICAgICAgICAiJiMxMjQ3MzsmIzEyNDk3OyYjMTI1MTQ7ICYjMjI4O25kIGVnZ3MiCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHMuZW5jb2RlKCJsYXRpbi0xIiwgInhtbGNoYXJyZWZyZXBsYWNlIiksCisgICAgICAgICAgICAiJiMxMjQ3MzsmIzEyNDk3OyYjMTI1MTQ7IFx4ZTRuZCBlZ2dzIgorICAgICAgICApCisKKyAgICBkZWYgdGVzdF94bWxjaGFybmFtZXJlcGxhY2Uoc2VsZik6CisgICAgICAgICMgVGhpcyB0aW1lIHVzZSBhIG5hbWVkIGNoYXJhY3RlciBlbnRpdHkgZm9yIHVuZW5jb2RhYmxlCisgICAgICAgICMgY2hhcmFjdGVycywgaWYgb25lIGlzIGF2YWlsYWJsZS4KKworICAgICAgICBkZWYgeG1sY2hhcm5hbWVyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIFVuaWNvZGVFbmNvZGVFcnJvcik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJXIiICUgZXhjKQorICAgICAgICAgICAgbCA9IFtdCisgICAgICAgICAgICBmb3IgYyBpbiBleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuZW5kXToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGwuYXBwZW5kKHUiJiVzOyIgJSBodG1sZW50aXR5ZGVmcy5jb2RlcG9pbnQybmFtZVtvcmQoYyldKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgbC5hcHBlbmQodSImIyVkOyIgJSBvcmQoYykpCisgICAgICAgICAgICByZXR1cm4gKHUiIi5qb2luKGwpLCBleGMuZW5kKQorCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigKKyAgICAgICAgICAgICJ0ZXN0LnhtbGNoYXJuYW1lcmVwbGFjZSIsIHhtbGNoYXJuYW1lcmVwbGFjZSkKKworICAgICAgICBzaW4gPSB1Ilx4YWJcdTIxMWNceGJiID0gXHUyMzI5XHUxMjM0XHUyMGFjXHUyMzJhIgorICAgICAgICBzb3V0ID0gIiZsYXF1bzsmcmVhbDsmcmFxdW87ID0gJmxhbmc7JiM0NjYwOyZldXJvOyZyYW5nOyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaW4uZW5jb2RlKCJhc2NpaSIsICJ0ZXN0LnhtbGNoYXJuYW1lcmVwbGFjZSIpLCBzb3V0KQorICAgICAgICBzb3V0ID0gIlx4YWImcmVhbDtceGJiID0gJmxhbmc7JiM0NjYwOyZldXJvOyZyYW5nOyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaW4uZW5jb2RlKCJsYXRpbi0xIiwgInRlc3QueG1sY2hhcm5hbWVyZXBsYWNlIiksIHNvdXQpCisgICAgICAgIHNvdXQgPSAiXHhhYiZyZWFsO1x4YmIgPSAmbGFuZzsmIzQ2NjA7XHhhNCZyYW5nOyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaW4uZW5jb2RlKCJpc28tODg1OS0xNSIsICJ0ZXN0LnhtbGNoYXJuYW1lcmVwbGFjZSIpLCBzb3V0KQorCisgICAgZGVmIHRlc3RfdW5pbmFtZXJlcGxhY2Uoc2VsZik6CisgICAgICAgICMgV2UncmUgdXNpbmcgdGhlIG5hbWVzIGZyb20gdGhlIHVuaWNvZGUgZGF0YWJhc2UgdGhpcyB0aW1lLAorICAgICAgICAjIGFuZCB3ZSdyZSBkb2luZyAic3ludGF4IGhpZ2hsaWdodGluZyIgaGVyZSwgaS5lLiB3ZSBpbmNsdWRlCisgICAgICAgICMgdGhlIHJlcGxhY2VkIHRleHQgaW4gQU5TSSBlc2NhcGUgc2VxdWVuY2VzLiBGb3IgdGhpcyBpdCBpcworICAgICAgICAjIHVzZWZ1bCB0aGF0IHRoZSBlcnJvciBoYW5kbGVyIGlzIG5vdCBjYWxsZWQgZm9yIGV2ZXJ5IHNpbmdsZQorICAgICAgICAjIHVuZW5jb2RhYmxlIGNoYXJhY3RlciwgYnV0IGZvciBhIGNvbXBsZXRlIHNlcXVlbmNlIG9mCisgICAgICAgICMgdW5lbmNvZGFibGUgY2hhcmFjdGVycywgb3RoZXJ3aXNlIHdlIHdvdWxkIG91dHB1dCBtYW55CisgICAgICAgICMgdW5uZWNlc3NhcnkgZXNjYXBlIHNlcXVlbmNlcy4KKworICAgICAgICBkZWYgdW5pbmFtZXJlcGxhY2UoZXhjKToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4YywgVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImRvbid0IGtub3cgaG93IHRvIGhhbmRsZSAlciIgJSBleGMpCisgICAgICAgICAgICBsID0gW10KKyAgICAgICAgICAgIGZvciBjIGluIGV4Yy5vYmplY3RbZXhjLnN0YXJ0OmV4Yy5lbmRdOgorICAgICAgICAgICAgICAgIGwuYXBwZW5kKHVuaWNvZGVkYXRhLm5hbWUoYywgdSIweCV4IiAlIG9yZChjKSkpCisgICAgICAgICAgICByZXR1cm4gKHUiXDAzM1sxbSVzXDAzM1swbSIgJSB1IiwgIi5qb2luKGwpLCBleGMuZW5kKQorCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigKKyAgICAgICAgICAgICJ0ZXN0LnVuaW5hbWVyZXBsYWNlIiwgdW5pbmFtZXJlcGxhY2UpCisKKyAgICAgICAgc2luID0gdSJceGFjXHUxMjM0XHUyMGFjXHU4MDAwIgorICAgICAgICBzb3V0ID0gIlwwMzNbMW1OT1QgU0lHTiwgRVRISU9QSUMgU1lMTEFCTEUgU0VFLCBFVVJPIFNJR04sIENKSyBVTklGSUVEIElERU9HUkFQSC04MDAwXDAzM1swbSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaW4uZW5jb2RlKCJhc2NpaSIsICJ0ZXN0LnVuaW5hbWVyZXBsYWNlIiksIHNvdXQpCisKKyAgICAgICAgc291dCA9ICJceGFjXDAzM1sxbUVUSElPUElDIFNZTExBQkxFIFNFRSwgRVVSTyBTSUdOLCBDSksgVU5JRklFRCBJREVPR1JBUEgtODAwMFwwMzNbMG0iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2luLmVuY29kZSgibGF0aW4tMSIsICJ0ZXN0LnVuaW5hbWVyZXBsYWNlIiksIHNvdXQpCisKKyAgICAgICAgc291dCA9ICJceGFjXDAzM1sxbUVUSElPUElDIFNZTExBQkxFIFNFRVwwMzNbMG1ceGE0XDAzM1sxbUNKSyBVTklGSUVEIElERU9HUkFQSC04MDAwXDAzM1swbSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaW4uZW5jb2RlKCJpc28tODg1OS0xNSIsICJ0ZXN0LnVuaW5hbWVyZXBsYWNlIiksIHNvdXQpCisKKyAgICBkZWYgdGVzdF9iYWNrc2xhc2hlc2NhcGUoc2VsZik6CisgICAgICAgICMgRG9lcyB0aGUgc2FtZSBhcyB0aGUgInVuaWNvZGUtZXNjYXBlIiBlbmNvZGluZywgYnV0IHdpdGggZGlmZmVyZW50CisgICAgICAgICMgYmFzZSBlbmNvZGluZ3MuCisgICAgICAgIHNpbiA9IHUiYVx4YWNcdTEyMzRcdTIwYWNcdTgwMDAiCisgICAgICAgIGlmIHN5cy5tYXh1bmljb2RlID4gMHhmZmZmOgorICAgICAgICAgICAgc2luICs9IHVuaWNocihzeXMubWF4dW5pY29kZSkKKyAgICAgICAgc291dCA9ICJhXFx4YWNcXHUxMjM0XFx1MjBhY1xcdTgwMDAiCisgICAgICAgIGlmIHN5cy5tYXh1bmljb2RlID4gMHhmZmZmOgorICAgICAgICAgICAgc291dCArPSAiXFxVJTA4eCIgJSBzeXMubWF4dW5pY29kZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpbi5lbmNvZGUoImFzY2lpIiwgImJhY2tzbGFzaHJlcGxhY2UiKSwgc291dCkKKworICAgICAgICBzb3V0ID0gImFceGFjXFx1MTIzNFxcdTIwYWNcXHU4MDAwIgorICAgICAgICBpZiBzeXMubWF4dW5pY29kZSA+IDB4ZmZmZjoKKyAgICAgICAgICAgIHNvdXQgKz0gIlxcVSUwOHgiICUgc3lzLm1heHVuaWNvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaW4uZW5jb2RlKCJsYXRpbi0xIiwgImJhY2tzbGFzaHJlcGxhY2UiKSwgc291dCkKKworICAgICAgICBzb3V0ID0gImFceGFjXFx1MTIzNFx4YTRcXHU4MDAwIgorICAgICAgICBpZiBzeXMubWF4dW5pY29kZSA+IDB4ZmZmZjoKKyAgICAgICAgICAgIHNvdXQgKz0gIlxcVSUwOHgiICUgc3lzLm1heHVuaWNvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaW4uZW5jb2RlKCJpc28tODg1OS0xNSIsICJiYWNrc2xhc2hyZXBsYWNlIiksIHNvdXQpCisKKyAgICBkZWYgdGVzdF9kZWNvZGluZ19jYWxsYmFja3Moc2VsZik6CisgICAgICAgICMgVGhpcyBpcyBhIHRlc3QgZm9yIGEgZGVjb2RpbmcgY2FsbGJhY2sgaGFuZGxlcgorICAgICAgICAjIHRoYXQgYWxsb3dzIHRoZSBkZWNvZGluZyBvZiB0aGUgaW52YWxpZCBzZXF1ZW5jZQorICAgICAgICAjICJceGMwXHg4MCIgYW5kIHJldHVybnMgIlx4MDAiIGluc3RlYWQgb2YgcmFpc2luZyBhbiBlcnJvci4KKyAgICAgICAgIyBBbGwgb3RoZXIgaWxsZWdhbCBzZXF1ZW5jZXMgd2lsbCBiZSBoYW5kbGVkIHN0cmljdGx5LgorICAgICAgICBkZWYgcmVsYXhlZHV0ZjgoZXhjKToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4YywgVW5pY29kZURlY29kZUVycm9yKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImRvbid0IGtub3cgaG93IHRvIGhhbmRsZSAlciIgJSBleGMpCisgICAgICAgICAgICBpZiBleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuc3RhcnQrMl0gPT0gIlx4YzBceDgwIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKHUiXHgwMCIsIGV4Yy5zdGFydCsyKSAjIHJldHJ5IGFmdGVyIHR3byBieXRlcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBleGMKKworICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QucmVsYXhlZHV0ZjgiLCByZWxheGVkdXRmOCkKKworICAgICAgICAjIGFsbCB0aGUgIlx4YzBceDgwIiB3aWxsIGJlIGRlY29kZWQgdG8gIlx4MDAiCisgICAgICAgIHNpbiA9ICJhXHgwMGJceGMwXHg4MGNceGMzXHhiY1x4YzBceDgwXHhjMFx4ODAiCisgICAgICAgIHNvdXQgPSB1ImFceDAwYlx4MDBjXHhmY1x4MDBceDAwIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpbi5kZWNvZGUoInV0Zi04IiwgInRlc3QucmVsYXhlZHV0ZjgiKSwgc291dCkKKworICAgICAgICAjICJceGMwXHg4MSIgaXMgbm90IHZhbGlkIGFuZCBhIFVuaWNvZGVEZWNvZGVFcnJvciB3aWxsIGJlIHJhaXNlZAorICAgICAgICBzaW4gPSAiXHhjMFx4ODBceGMwXHg4MSIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBzaW4uZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidXRmLTgiLCAidGVzdC5yZWxheGVkdXRmOCIpCisKKyAgICBkZWYgdGVzdF9jaGFybWFwZW5jb2RlKHNlbGYpOgorICAgICAgICAjIEZvciBjaGFybWFwIGVuY29kaW5ncyB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nIHdpbGwgYmUKKyAgICAgICAgIyBtYXBwZWQgdGhyb3VnaCB0aGUgZW5jb2RpbmcgYWdhaW4uIFRoaXMgbWVhbnMsIHRoYXQKKyAgICAgICAgIyB0byBiZSBhYmxlIHRvIHVzZSBlLmcuIHRoZSAicmVwbGFjZSIgaGFuZGxlciwgdGhlCisgICAgICAgICMgY2hhcm1hcCBoYXMgdG8gaGF2ZSBhIG1hcHBpbmcgZm9yICI/Ii4KKyAgICAgICAgY2hhcm1hcCA9IGRpY3QoWyAob3JkKGMpLCAyKmMudXBwZXIoKSkgZm9yIGMgaW4gImFiY2RlZmdoIl0pCisgICAgICAgIHNpbiA9IHUiYWJjIgorICAgICAgICBzb3V0ID0gIkFBQkJDQyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MuY2hhcm1hcF9lbmNvZGUoc2luLCAic3RyaWN0IiwgY2hhcm1hcClbMF0sIHNvdXQpCisKKyAgICAgICAgc2luID0gdSJhYmNBIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGNvZGVjcy5jaGFybWFwX2VuY29kZSwgc2luLCAic3RyaWN0IiwgY2hhcm1hcCkKKworICAgICAgICBjaGFybWFwW29yZCgiPyIpXSA9ICJYWVoiCisgICAgICAgIHNpbiA9IHUiYWJjREVGIgorICAgICAgICBzb3V0ID0gIkFBQkJDQ1hZWlhZWlhZWiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MuY2hhcm1hcF9lbmNvZGUoc2luLCAicmVwbGFjZSIsIGNoYXJtYXApWzBdLCBzb3V0KQorCisgICAgICAgIGNoYXJtYXBbb3JkKCI/IildID0gdSJYWVoiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLmNoYXJtYXBfZW5jb2RlLCBzaW4sICJyZXBsYWNlIiwgY2hhcm1hcCkKKworICAgICAgICBjaGFybWFwW29yZCgiPyIpXSA9IHUiWFlaIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5jaGFybWFwX2VuY29kZSwgc2luLCAicmVwbGFjZSIsIGNoYXJtYXApCisKKyAgICBkZWYgdGVzdF9kZWNvZGV1bmljb2RlaW50ZXJuYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDBceDAwIi5kZWNvZGUsCisgICAgICAgICAgICAidW5pY29kZS1pbnRlcm5hbCIsCisgICAgICAgICkKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgPiAweGZmZmY6CisgICAgICAgICAgICBkZWYgaGFuZGxlcl91bmljb2RlaW50ZXJuYWwoZXhjKToKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIFVuaWNvZGVEZWNvZGVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICVyIiAlIGV4YykKKyAgICAgICAgICAgICAgICByZXR1cm4gKHUiXHgwMSIsIDEpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDBceDAwIi5kZWNvZGUoInVuaWNvZGUtaW50ZXJuYWwiLCAiaWdub3JlIiksCisgICAgICAgICAgICAgICAgdSJcdTAwMDAiCisgICAgICAgICAgICApCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDBceDAwIi5kZWNvZGUoInVuaWNvZGUtaW50ZXJuYWwiLCAicmVwbGFjZSIpLAorICAgICAgICAgICAgICAgIHUiXHUwMDAwXHVmZmZkIgorICAgICAgICAgICAgKQorCisgICAgICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuaHVpIiwgaGFuZGxlcl91bmljb2RlaW50ZXJuYWwpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDBceDAwIi5kZWNvZGUoInVuaWNvZGUtaW50ZXJuYWwiLCAidGVzdC5odWkiKSwKKyAgICAgICAgICAgICAgICB1Ilx1MDAwMFx1MDAwMVx1MDAwMCIKKyAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrcyhzZWxmKToKKyAgICAgICAgZGVmIGhhbmRsZXIxKGV4Yyk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIFVuaWNvZGVFbmNvZGVFcnJvcikgXAorICAgICAgICAgICAgICAgYW5kIG5vdCBpc2luc3RhbmNlKGV4YywgVW5pY29kZURlY29kZUVycm9yKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImRvbid0IGtub3cgaG93IHRvIGhhbmRsZSAlciIgJSBleGMpCisgICAgICAgICAgICBsID0gW3UiPCVkPiIgJSBvcmQoZXhjLm9iamVjdFtwb3NdKSBmb3IgcG9zIGluIHhyYW5nZShleGMuc3RhcnQsIGV4Yy5lbmQpXQorICAgICAgICAgICAgcmV0dXJuICh1Ilslc10iICUgdSIiLmpvaW4obCksIGV4Yy5lbmQpCisKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmhhbmRsZXIxIiwgaGFuZGxlcjEpCisKKyAgICAgICAgZGVmIGhhbmRsZXIyKGV4Yyk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIFVuaWNvZGVEZWNvZGVFcnJvcik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJXIiICUgZXhjKQorICAgICAgICAgICAgbCA9IFt1IjwlZD4iICUgb3JkKGV4Yy5vYmplY3RbcG9zXSkgZm9yIHBvcyBpbiB4cmFuZ2UoZXhjLnN0YXJ0LCBleGMuZW5kKV0KKyAgICAgICAgICAgIHJldHVybiAodSJbJXNdIiAlIHUiIi5qb2luKGwpLCBleGMuZW5kKzEpICMgc2tpcCBvbmUgY2hhcmFjdGVyCisKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmhhbmRsZXIyIiwgaGFuZGxlcjIpCisKKyAgICAgICAgcyA9ICJceDAwXHg4MVx4N2ZceDgwXHhmZiIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcy5kZWNvZGUoImFzY2lpIiwgInRlc3QuaGFuZGxlcjEiKSwKKyAgICAgICAgICAgIHUiXHgwMFs8MTI5Pl1ceDdmWzwxMjg+XVs8MjU1Pl0iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHMuZGVjb2RlKCJhc2NpaSIsICJ0ZXN0LmhhbmRsZXIyIiksCisgICAgICAgICAgICB1Ilx4MDBbPDEyOT5dWzwxMjg+XSIKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAiXFx1MzA0Mlx1M3h4eCIuZGVjb2RlKCJ1bmljb2RlLWVzY2FwZSIsICJ0ZXN0LmhhbmRsZXIxIiksCisgICAgICAgICAgICB1Ilx1MzA0Mls8OTI+PDExNz48NTE+XXh4eCIKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAiXFx1MzA0Mlx1M3h4Ii5kZWNvZGUoInVuaWNvZGUtZXNjYXBlIiwgInRlc3QuaGFuZGxlcjEiKSwKKyAgICAgICAgICAgIHUiXHUzMDQyWzw5Mj48MTE3Pjw1MT5deHgiCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJhYmMiLCAidGVzdC5oYW5kbGVyMSIsIHtvcmQoImEiKTogdSJ6In0pWzBdLAorICAgICAgICAgICAgdSJ6Wzw5OD5dWzw5OT5dIgorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHUiZ1x4ZmNceGRmcmsiLmVuY29kZSgiYXNjaWkiLCAidGVzdC5oYW5kbGVyMSIpLAorICAgICAgICAgICAgdSJnWzwyNTI+PDIyMz5dcmsiCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdSJnXHhmY1x4ZGYiLmVuY29kZSgiYXNjaWkiLCAidGVzdC5oYW5kbGVyMSIpLAorICAgICAgICAgICAgdSJnWzwyNTI+PDIyMz5dIgorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9sb25nc3RyaW5ncyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGxvbmcgc3RyaW5ncyB0byBjaGVjayBmb3IgbWVtb3J5IG92ZXJmbG93IHByb2JsZW1zCisgICAgICAgIGVycm9ycyA9IFsgInN0cmljdCIsICJpZ25vcmUiLCAicmVwbGFjZSIsICJ4bWxjaGFycmVmcmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgImJhY2tzbGFzaHJlcGxhY2UiXQorICAgICAgICAjIHJlZ2lzdGVyIHRoZSBoYW5kbGVycyB1bmRlciBkaWZmZXJlbnQgbmFtZXMsCisgICAgICAgICMgdG8gcHJldmVudCB0aGUgY29kZWMgZnJvbSByZWNvZ25pemluZyB0aGUgbmFtZQorICAgICAgICBmb3IgZXJyIGluIGVycm9yczoKKyAgICAgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC4iICsgZXJyLCBjb2RlY3MubG9va3VwX2Vycm9yKGVycikpCisgICAgICAgIGwgPSAxMDAwCisgICAgICAgIGVycm9ycyArPSBbICJ0ZXN0LiIgKyBlcnIgZm9yIGVyciBpbiBlcnJvcnMgXQorICAgICAgICBmb3IgdW5pIGluIFsgcypsIGZvciBzIGluICh1IngiLCB1Ilx1MzA0MiIsIHUiYVx4ZTQiKSBdOgorICAgICAgICAgICAgZm9yIGVuYyBpbiAoImFzY2lpIiwgImxhdGluLTEiLCAiaXNvLTg4NTktMSIsICJpc28tODg1OS0xNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAidXRmLTgiLCAidXRmLTciLCAidXRmLTE2IiwgInV0Zi0zMiIpOgorICAgICAgICAgICAgICAgIGZvciBlcnIgaW4gZXJyb3JzOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB1bmkuZW5jb2RlKGVuYywgZXJyKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGNoZWNrX2V4Y2VwdGlvbm9iamVjdGFyZ3Moc2VsZiwgZXhjdHlwZSwgYXJncywgbXNnKToKKyAgICAgICAgIyBUZXN0IFVuaWNvZGVFcnJvciBzdWJjbGFzc2VzOiBjb25zdHJ1Y3Rpb24sIGF0dHJpYnV0ZSBhc3NpZ25tZW50IGFuZCBfX3N0cl9fIGNvbnZlcnNpb24KKyAgICAgICAgIyBjaGVjayB3aXRoIG9uZSBtaXNzaW5nIGFyZ3VtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXhjdHlwZSwgKmFyZ3NbOi0xXSkKKyAgICAgICAgIyBjaGVjayB3aXRoIG9uZSBhcmd1bWVudCB0b28gbXVjaAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV4Y3R5cGUsICooYXJncyArIFsidG9vIG11Y2giXSkpCisgICAgICAgICMgY2hlY2sgd2l0aCBvbmUgYXJndW1lbnQgb2YgdGhlIHdyb25nIHR5cGUKKyAgICAgICAgd3JvbmdhcmdzID0gWyAic3BhbSIsIHUiZWdncyIsIDQyLCAxLjAsIE5vbmUgXQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGFyZ3MpKToKKyAgICAgICAgICAgIGZvciB3cm9uZ2FyZyBpbiB3cm9uZ2FyZ3M6CisgICAgICAgICAgICAgICAgaWYgdHlwZSh3cm9uZ2FyZykgaXMgdHlwZShhcmdzW2ldKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAjIGJ1aWxkIGFyZ3VtZW50IGFycmF5CisgICAgICAgICAgICAgICAgY2FsbGFyZ3MgPSBbXQorICAgICAgICAgICAgICAgIGZvciBqIGluIHhyYW5nZShsZW4oYXJncykpOgorICAgICAgICAgICAgICAgICAgICBpZiBpPT1qOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFyZ3MuYXBwZW5kKHdyb25nYXJnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGFyZ3MuYXBwZW5kKGFyZ3NbaV0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBleGN0eXBlLCAqY2FsbGFyZ3MpCisKKyAgICAgICAgIyBjaGVjayB3aXRoIHRoZSBjb3JyZWN0IG51bWJlciBhbmQgdHlwZSBvZiBhcmd1bWVudHMKKyAgICAgICAgZXhjID0gZXhjdHlwZSgqYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZXhjKSwgbXNnKQorCisgICAgZGVmIHRlc3RfdW5pY29kZWVuY29kZWVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2V4Y2VwdGlvbm9iamVjdGFyZ3MoCisgICAgICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IsCisgICAgICAgICAgICBbImFzY2lpIiwgdSJnXHhmY3JrIiwgMSwgMiwgIm91Y2giXSwKKyAgICAgICAgICAgICInYXNjaWknIGNvZGVjIGNhbid0IGVuY29kZSBjaGFyYWN0ZXIgdSdcXHhmYycgaW4gcG9zaXRpb24gMTogb3VjaCIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrX2V4Y2VwdGlvbm9iamVjdGFyZ3MoCisgICAgICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IsCisgICAgICAgICAgICBbImFzY2lpIiwgdSJnXHhmY3JrIiwgMSwgNCwgIm91Y2giXSwKKyAgICAgICAgICAgICInYXNjaWknIGNvZGVjIGNhbid0IGVuY29kZSBjaGFyYWN0ZXJzIGluIHBvc2l0aW9uIDEtMzogb3VjaCIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrX2V4Y2VwdGlvbm9iamVjdGFyZ3MoCisgICAgICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IsCisgICAgICAgICAgICBbImFzY2lpIiwgdSJceGZjeCIsIDAsIDEsICJvdWNoIl0sCisgICAgICAgICAgICAiJ2FzY2lpJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVyIHUnXFx4ZmMnIGluIHBvc2l0aW9uIDA6IG91Y2giCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja19leGNlcHRpb25vYmplY3RhcmdzKAorICAgICAgICAgICAgVW5pY29kZUVuY29kZUVycm9yLAorICAgICAgICAgICAgWyJhc2NpaSIsIHUiXHUwMTAweCIsIDAsIDEsICJvdWNoIl0sCisgICAgICAgICAgICAiJ2FzY2lpJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVyIHUnXFx1MDEwMCcgaW4gcG9zaXRpb24gMDogb3VjaCIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrX2V4Y2VwdGlvbm9iamVjdGFyZ3MoCisgICAgICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IsCisgICAgICAgICAgICBbImFzY2lpIiwgdSJcdWZmZmZ4IiwgMCwgMSwgIm91Y2giXSwKKyAgICAgICAgICAgICInYXNjaWknIGNvZGVjIGNhbid0IGVuY29kZSBjaGFyYWN0ZXIgdSdcXHVmZmZmJyBpbiBwb3NpdGlvbiAwOiBvdWNoIgorICAgICAgICApCisgICAgICAgIGlmIHN5cy5tYXh1bmljb2RlID4gMHhmZmZmOgorICAgICAgICAgICAgc2VsZi5jaGVja19leGNlcHRpb25vYmplY3RhcmdzKAorICAgICAgICAgICAgICAgIFVuaWNvZGVFbmNvZGVFcnJvciwKKyAgICAgICAgICAgICAgICBbImFzY2lpIiwgdSJcVTAwMDEwMDAweCIsIDAsIDEsICJvdWNoIl0sCisgICAgICAgICAgICAgICAgIidhc2NpaScgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlciB1J1xcVTAwMDEwMDAwJyBpbiBwb3NpdGlvbiAwOiBvdWNoIgorICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RfdW5pY29kZWRlY29kZWVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2V4Y2VwdGlvbm9iamVjdGFyZ3MoCisgICAgICAgICAgICBVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICBbImFzY2lpIiwgImdceGZjcmsiLCAxLCAyLCAib3VjaCJdLAorICAgICAgICAgICAgIidhc2NpaScgY29kZWMgY2FuJ3QgZGVjb2RlIGJ5dGUgMHhmYyBpbiBwb3NpdGlvbiAxOiBvdWNoIgorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tfZXhjZXB0aW9ub2JqZWN0YXJncygKKyAgICAgICAgICAgIFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgIFsiYXNjaWkiLCAiZ1x4ZmNyayIsIDEsIDMsICJvdWNoIl0sCisgICAgICAgICAgICAiJ2FzY2lpJyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZXMgaW4gcG9zaXRpb24gMS0yOiBvdWNoIgorICAgICAgICApCisKKyAgICBkZWYgdGVzdF91bmljb2RldHJhbnNsYXRlZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfZXhjZXB0aW9ub2JqZWN0YXJncygKKyAgICAgICAgICAgIFVuaWNvZGVUcmFuc2xhdGVFcnJvciwKKyAgICAgICAgICAgIFt1ImdceGZjcmsiLCAxLCAyLCAib3VjaCJdLAorICAgICAgICAgICAgImNhbid0IHRyYW5zbGF0ZSBjaGFyYWN0ZXIgdSdcXHhmYycgaW4gcG9zaXRpb24gMTogb3VjaCIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrX2V4Y2VwdGlvbm9iamVjdGFyZ3MoCisgICAgICAgICAgICBVbmljb2RlVHJhbnNsYXRlRXJyb3IsCisgICAgICAgICAgICBbdSJnXHUwMTAwcmsiLCAxLCAyLCAib3VjaCJdLAorICAgICAgICAgICAgImNhbid0IHRyYW5zbGF0ZSBjaGFyYWN0ZXIgdSdcXHUwMTAwJyBpbiBwb3NpdGlvbiAxOiBvdWNoIgorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tfZXhjZXB0aW9ub2JqZWN0YXJncygKKyAgICAgICAgICAgIFVuaWNvZGVUcmFuc2xhdGVFcnJvciwKKyAgICAgICAgICAgIFt1ImdcdWZmZmZyayIsIDEsIDIsICJvdWNoIl0sCisgICAgICAgICAgICAiY2FuJ3QgdHJhbnNsYXRlIGNoYXJhY3RlciB1J1xcdWZmZmYnIGluIHBvc2l0aW9uIDE6IG91Y2giCisgICAgICAgICkKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgPiAweGZmZmY6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2V4Y2VwdGlvbm9iamVjdGFyZ3MoCisgICAgICAgICAgICAgICAgVW5pY29kZVRyYW5zbGF0ZUVycm9yLAorICAgICAgICAgICAgICAgIFt1ImdcVTAwMDEwMDAwcmsiLCAxLCAyLCAib3VjaCJdLAorICAgICAgICAgICAgICAgICJjYW4ndCB0cmFuc2xhdGUgY2hhcmFjdGVyIHUnXFxVMDAwMTAwMDAnIGluIHBvc2l0aW9uIDE6IG91Y2giCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tfZXhjZXB0aW9ub2JqZWN0YXJncygKKyAgICAgICAgICAgIFVuaWNvZGVUcmFuc2xhdGVFcnJvciwKKyAgICAgICAgICAgIFt1ImdceGZjcmsiLCAxLCAzLCAib3VjaCJdLAorICAgICAgICAgICAgImNhbid0IHRyYW5zbGF0ZSBjaGFyYWN0ZXJzIGluIHBvc2l0aW9uIDEtMjogb3VjaCIKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYmFkYW5kZ29vZHN0cmljdGV4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgICMgInN0cmljdCIgY29tcGxhaW5zIGFib3V0IGEgbm9uLWV4Y2VwdGlvbiBwYXNzZWQgaW4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgICBjb2RlY3Muc3RyaWN0X2Vycm9ycywKKyAgICAgICAgICAgIDQyCisgICAgICAgICkKKyAgICAgICAgIyAic3RyaWN0IiBjb21wbGFpbnMgYWJvdXQgdGhlIHdyb25nIGV4Y2VwdGlvbiB0eXBlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgRXhjZXB0aW9uLAorICAgICAgICAgICAgY29kZWNzLnN0cmljdF9lcnJvcnMsCisgICAgICAgICAgICBFeGNlcHRpb24oIm91Y2giKQorICAgICAgICApCisKKyAgICAgICAgIyBJZiB0aGUgY29ycmVjdCBleGNlcHRpb24gaXMgcGFzc2VkIGluLCAic3RyaWN0IiByYWlzZXMgaXQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IsCisgICAgICAgICAgICBjb2RlY3Muc3RyaWN0X2Vycm9ycywKKyAgICAgICAgICAgIFVuaWNvZGVFbmNvZGVFcnJvcigiYXNjaWkiLCB1Ilx1MzA0MiIsIDAsIDEsICJvdWNoIikKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYmFkYW5kZ29vZGlnbm9yZWV4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgICMgImlnbm9yZSIgY29tcGxhaW5zIGFib3V0IGEgbm9uLWV4Y2VwdGlvbiBwYXNzZWQgaW4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgIFR5cGVFcnJvciwKKyAgICAgICAgICAgY29kZWNzLmlnbm9yZV9lcnJvcnMsCisgICAgICAgICAgIDQyCisgICAgICAgICkKKyAgICAgICAgIyAiaWdub3JlIiBjb21wbGFpbnMgYWJvdXQgdGhlIHdyb25nIGV4Y2VwdGlvbiB0eXBlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgIGNvZGVjcy5pZ25vcmVfZXJyb3JzLAorICAgICAgICAgICBVbmljb2RlRXJyb3IoIm91Y2giKQorICAgICAgICApCisgICAgICAgICMgSWYgdGhlIGNvcnJlY3QgZXhjZXB0aW9uIGlzIHBhc3NlZCBpbiwgImlnbm9yZSIgcmV0dXJucyBhbiBlbXB0eSByZXBsYWNlbWVudAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmlnbm9yZV9lcnJvcnMoVW5pY29kZUVuY29kZUVycm9yKCJhc2NpaSIsIHUiXHUzMDQyIiwgMCwgMSwgIm91Y2giKSksCisgICAgICAgICAgICAodSIiLCAxKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuaWdub3JlX2Vycm9ycyhVbmljb2RlRGVjb2RlRXJyb3IoImFzY2lpIiwgIlx4ZmYiLCAwLCAxLCAib3VjaCIpKSwKKyAgICAgICAgICAgICh1IiIsIDEpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5pZ25vcmVfZXJyb3JzKFVuaWNvZGVUcmFuc2xhdGVFcnJvcih1Ilx1MzA0MiIsIDAsIDEsICJvdWNoIikpLAorICAgICAgICAgICAgKHUiIiwgMSkKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYmFkYW5kZ29vZHJlcGxhY2VleGNlcHRpb25zKHNlbGYpOgorICAgICAgICAjICJyZXBsYWNlIiBjb21wbGFpbnMgYWJvdXQgYSBub24tZXhjZXB0aW9uIHBhc3NlZCBpbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICBjb2RlY3MucmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgIDQyCisgICAgICAgICkKKyAgICAgICAgIyAicmVwbGFjZSIgY29tcGxhaW5zIGFib3V0IHRoZSB3cm9uZyBleGNlcHRpb24gdHlwZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICBjb2RlY3MucmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgIFVuaWNvZGVFcnJvcigib3VjaCIpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgICBjb2RlY3MucmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgICBCYWRPYmplY3RVbmljb2RlRW5jb2RlRXJyb3IoKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLnJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICAgQmFkT2JqZWN0VW5pY29kZURlY29kZUVycm9yKCkKKyAgICAgICAgKQorICAgICAgICAjIFdpdGggdGhlIGNvcnJlY3QgZXhjZXB0aW9uLCAicmVwbGFjZSIgcmV0dXJucyBhbiAiPyIgb3IgdSJcdWZmZmQiIHJlcGxhY2VtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MucmVwbGFjZV9lcnJvcnMoVW5pY29kZUVuY29kZUVycm9yKCJhc2NpaSIsIHUiXHUzMDQyIiwgMCwgMSwgIm91Y2giKSksCisgICAgICAgICAgICAodSI/IiwgMSkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLnJlcGxhY2VfZXJyb3JzKFVuaWNvZGVEZWNvZGVFcnJvcigiYXNjaWkiLCAiXHhmZiIsIDAsIDEsICJvdWNoIikpLAorICAgICAgICAgICAgKHUiXHVmZmZkIiwgMSkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLnJlcGxhY2VfZXJyb3JzKFVuaWNvZGVUcmFuc2xhdGVFcnJvcih1Ilx1MzA0MiIsIDAsIDEsICJvdWNoIikpLAorICAgICAgICAgICAgKHUiXHVmZmZkIiwgMSkKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYmFkYW5kZ29vZHhtbGNoYXJyZWZyZXBsYWNlZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgIyAieG1sY2hhcnJlZnJlcGxhY2UiIGNvbXBsYWlucyBhYm91dCBhIG5vbi1leGNlcHRpb24gcGFzc2VkIGluCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgIGNvZGVjcy54bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgIDQyCisgICAgICAgICkKKyAgICAgICAgIyAieG1sY2hhcnJlZnJlcGxhY2UiIGNvbXBsYWlucyBhYm91dCB0aGUgd3JvbmcgZXhjZXB0aW9uIHR5cGVzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgIGNvZGVjcy54bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgIFVuaWNvZGVFcnJvcigib3VjaCIpCisgICAgICAgICkKKyAgICAgICAgIyAieG1sY2hhcnJlZnJlcGxhY2UiIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGVuY29kaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLnhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycywKKyAgICAgICAgICAgIFVuaWNvZGVEZWNvZGVFcnJvcigiYXNjaWkiLCAiXHhmZiIsIDAsIDEsICJvdWNoIikKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFR5cGVFcnJvciwKKyAgICAgICAgICAgIGNvZGVjcy54bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgICBVbmljb2RlVHJhbnNsYXRlRXJyb3IodSJcdTMwNDIiLCAwLCAxLCAib3VjaCIpCisgICAgICAgICkKKyAgICAgICAgIyBVc2UgdGhlIGNvcnJlY3QgZXhjZXB0aW9uCisgICAgICAgIGNzID0gKDAsIDEsIDksIDEwLCA5OSwgMTAwLCA5OTksIDEwMDAsIDk5OTksIDEwMDAwLCAweDMwNDIpCisgICAgICAgIHMgPSAiIi5qb2luKHVuaWNocihjKSBmb3IgYyBpbiBjcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy54bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMoCisgICAgICAgICAgICAgICAgVW5pY29kZUVuY29kZUVycm9yKCJhc2NpaSIsIHMsIDAsIGxlbihzKSwgIm91Y2giKQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICh1IiIuam9pbih1IiYjJWQ7IiAlIG9yZChjKSBmb3IgYyBpbiBzKSwgbGVuKHMpKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9iYWRhbmRnb29kYmFja3NsYXNocmVwbGFjZWV4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgICMgImJhY2tzbGFzaHJlcGxhY2UiIGNvbXBsYWlucyBhYm91dCBhIG5vbi1leGNlcHRpb24gcGFzc2VkIGluCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgIGNvZGVjcy5iYWNrc2xhc2hyZXBsYWNlX2Vycm9ycywKKyAgICAgICAgICAgNDIKKyAgICAgICAgKQorICAgICAgICAjICJiYWNrc2xhc2hyZXBsYWNlIiBjb21wbGFpbnMgYWJvdXQgdGhlIHdyb25nIGV4Y2VwdGlvbiB0eXBlcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICBjb2RlY3MuYmFja3NsYXNocmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgIFVuaWNvZGVFcnJvcigib3VjaCIpCisgICAgICAgICkKKyAgICAgICAgIyAiYmFja3NsYXNocmVwbGFjZSIgY2FuIG9ubHkgYmUgdXNlZCBmb3IgZW5jb2RpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgICBjb2RlY3MuYmFja3NsYXNocmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgICBVbmljb2RlRGVjb2RlRXJyb3IoImFzY2lpIiwgIlx4ZmYiLCAwLCAxLCAib3VjaCIpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgICBjb2RlY3MuYmFja3NsYXNocmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgICBVbmljb2RlVHJhbnNsYXRlRXJyb3IodSJcdTMwNDIiLCAwLCAxLCAib3VjaCIpCisgICAgICAgICkKKyAgICAgICAgIyBVc2UgdGhlIGNvcnJlY3QgZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuYmFja3NsYXNocmVwbGFjZV9lcnJvcnMoVW5pY29kZUVuY29kZUVycm9yKCJhc2NpaSIsIHUiXHUzMDQyIiwgMCwgMSwgIm91Y2giKSksCisgICAgICAgICAgICAodSJcXHUzMDQyIiwgMSkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmJhY2tzbGFzaHJlcGxhY2VfZXJyb3JzKFVuaWNvZGVFbmNvZGVFcnJvcigiYXNjaWkiLCB1Ilx4MDAiLCAwLCAxLCAib3VjaCIpKSwKKyAgICAgICAgICAgICh1IlxceDAwIiwgMSkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmJhY2tzbGFzaHJlcGxhY2VfZXJyb3JzKFVuaWNvZGVFbmNvZGVFcnJvcigiYXNjaWkiLCB1Ilx4ZmYiLCAwLCAxLCAib3VjaCIpKSwKKyAgICAgICAgICAgICh1IlxceGZmIiwgMSkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmJhY2tzbGFzaHJlcGxhY2VfZXJyb3JzKFVuaWNvZGVFbmNvZGVFcnJvcigiYXNjaWkiLCB1Ilx1MDEwMCIsIDAsIDEsICJvdWNoIikpLAorICAgICAgICAgICAgKHUiXFx1MDEwMCIsIDEpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5iYWNrc2xhc2hyZXBsYWNlX2Vycm9ycyhVbmljb2RlRW5jb2RlRXJyb3IoImFzY2lpIiwgdSJcdWZmZmYiLCAwLCAxLCAib3VjaCIpKSwKKyAgICAgICAgICAgICh1IlxcdWZmZmYiLCAxKQorICAgICAgICApCisgICAgICAgIGlmIHN5cy5tYXh1bmljb2RlPjB4ZmZmZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgY29kZWNzLmJhY2tzbGFzaHJlcGxhY2VfZXJyb3JzKFVuaWNvZGVFbmNvZGVFcnJvcigiYXNjaWkiLCB1IlxVMDAwMTAwMDAiLCAwLCAxLCAib3VjaCIpKSwKKyAgICAgICAgICAgICAgICAodSJcXFUwMDAxMDAwMCIsIDEpCisgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIGNvZGVjcy5iYWNrc2xhc2hyZXBsYWNlX2Vycm9ycyhVbmljb2RlRW5jb2RlRXJyb3IoImFzY2lpIiwgdSJcVTAwMTBmZmZmIiwgMCwgMSwgIm91Y2giKSksCisgICAgICAgICAgICAgICAgKHUiXFxVMDAxMGZmZmYiLCAxKQorICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYmFkaGFuZGxlcnJlc3VsdHMoc2VsZik6CisgICAgICAgIHJlc3VsdHMgPSAoIDQyLCB1ImZvbyIsICgxLDIsMyksICh1ImZvbyIsIDEsIDMpLCAodSJmb28iLCBOb25lKSwgKHUiZm9vIiwpLCAoImZvbyIsIDEsIDMpLCAoImZvbyIsIE5vbmUpLCAoImZvbyIsKSApCisgICAgICAgIGVuY3MgPSAoImFzY2lpIiwgImxhdGluLTEiLCAiaXNvLTg4NTktMSIsICJpc28tODg1OS0xNSIpCisKKyAgICAgICAgZm9yIHJlcyBpbiByZXN1bHRzOgorICAgICAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmJhZGhhbmRsZXIiLCBsYW1iZGEgeDogcmVzKQorICAgICAgICAgICAgZm9yIGVuYyBpbiBlbmNzOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIHUiXHUzMDQyIi5lbmNvZGUsCisgICAgICAgICAgICAgICAgICAgIGVuYywKKyAgICAgICAgICAgICAgICAgICAgInRlc3QuYmFkaGFuZGxlciIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBmb3IgKGVuYywgYnl0ZXMpIGluICgKKyAgICAgICAgICAgICAgICAoImFzY2lpIiwgIlx4ZmYiKSwKKyAgICAgICAgICAgICAgICAoInV0Zi04IiwgIlx4ZmYiKSwKKyAgICAgICAgICAgICAgICAoInV0Zi03IiwgIit4LSIpLAorICAgICAgICAgICAgICAgICgidW5pY29kZS1pbnRlcm5hbCIsICJceDAwIiksCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzLmRlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgZW5jLAorICAgICAgICAgICAgICAgICAgICAidGVzdC5iYWRoYW5kbGVyIgorICAgICAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2xvb2t1cChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3Muc3RyaWN0X2Vycm9ycywgY29kZWNzLmxvb2t1cF9lcnJvcigic3RyaWN0IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZWNzLmlnbm9yZV9lcnJvcnMsIGNvZGVjcy5sb29rdXBfZXJyb3IoImlnbm9yZSIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjcy5zdHJpY3RfZXJyb3JzLCBjb2RlY3MubG9va3VwX2Vycm9yKCJzdHJpY3QiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy54bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgICBjb2RlY3MubG9va3VwX2Vycm9yKCJ4bWxjaGFycmVmcmVwbGFjZSIpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5iYWNrc2xhc2hyZXBsYWNlX2Vycm9ycywKKyAgICAgICAgICAgIGNvZGVjcy5sb29rdXBfZXJyb3IoImJhY2tzbGFzaHJlcGxhY2UiKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF91bmVuY29kYWJsZXJlcGxhY2VtZW50KHNlbGYpOgorICAgICAgICBkZWYgdW5lbmNyZXBsKGV4Yyk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4YywgVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKHUiXHU0MjQyIiwgZXhjLmVuZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJXIiICUgZXhjKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QudW5lbmNyZXBsaGFuZGxlciIsIHVuZW5jcmVwbCkKKyAgICAgICAgZm9yIGVuYyBpbiAoImFzY2lpIiwgImlzby04ODU5LTEiLCAiaXNvLTg4NTktMTUiKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgIFVuaWNvZGVFbmNvZGVFcnJvciwKKyAgICAgICAgICAgICAgICB1Ilx1NDI0MiIuZW5jb2RlLAorICAgICAgICAgICAgICAgIGVuYywKKyAgICAgICAgICAgICAgICAidGVzdC51bmVuY3JlcGxoYW5kbGVyIgorICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYmFkcmVnaXN0ZXJjYWxsKHNlbGYpOgorICAgICAgICAjIGVuaGFuY2UgY292ZXJhZ2Ugb2Y6CisgICAgICAgICMgTW9kdWxlcy9fY29kZWNzbW9kdWxlLmM6OnJlZ2lzdGVyX2Vycm9yKCkKKyAgICAgICAgIyBQeXRob24vY29kZWNzLmM6OlB5Q29kZWNfUmVnaXN0ZXJFcnJvcigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLnJlZ2lzdGVyX2Vycm9yLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MucmVnaXN0ZXJfZXJyb3IsICJ0ZXN0LmR1bW15IiwgNDIpCisKKyAgICBkZWYgdGVzdF9iYWRsb29rdXBjYWxsKHNlbGYpOgorICAgICAgICAjIGVuaGFuY2UgY292ZXJhZ2Ugb2Y6CisgICAgICAgICMgTW9kdWxlcy9fY29kZWNzbW9kdWxlLmM6Omxvb2t1cF9lcnJvcigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLmxvb2t1cF9lcnJvcikKKworICAgIGRlZiB0ZXN0X3Vua25vd25oYW5kbGVyKHNlbGYpOgorICAgICAgICAjIGVuaGFuY2UgY292ZXJhZ2Ugb2Y6CisgICAgICAgICMgTW9kdWxlcy9fY29kZWNzbW9kdWxlLmM6Omxvb2t1cF9lcnJvcigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKExvb2t1cEVycm9yLCBjb2RlY3MubG9va3VwX2Vycm9yLCAidGVzdC51bmtub3duIikKKworICAgIGRlZiB0ZXN0X3htbGNoYXJyZWZ2YWx1ZXMoc2VsZik6CisgICAgICAgICMgZW5oYW5jZSBjb3ZlcmFnZSBvZjoKKyAgICAgICAgIyBQeXRob24vY29kZWNzLmM6OlB5Q29kZWNfWE1MQ2hhclJlZlJlcGxhY2VFcnJvcnMoKQorICAgICAgICAjIGFuZCBpbmxpbmUgaW1wbGVtZW50YXRpb25zCisgICAgICAgIHYgPSAoMSwgNSwgMTAsIDUwLCAxMDAsIDUwMCwgMTAwMCwgNTAwMCwgMTAwMDAsIDUwMDAwKQorICAgICAgICBpZiBzeXMubWF4dW5pY29kZT49MTAwMDAwOgorICAgICAgICAgICAgdiArPSAoMTAwMDAwLCA1MDAwMDAsIDEwMDAwMDApCisgICAgICAgIHMgPSB1IiIuam9pbihbdW5pY2hyKHgpIGZvciB4IGluIHZdKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QueG1sY2hhcnJlZnJlcGxhY2UiLCBjb2RlY3MueG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzKQorICAgICAgICBmb3IgZW5jIGluICgiYXNjaWkiLCAiaXNvLTg4NTktMTUiKToKKyAgICAgICAgICAgIGZvciBlcnIgaW4gKCJ4bWxjaGFycmVmcmVwbGFjZSIsICJ0ZXN0LnhtbGNoYXJyZWZyZXBsYWNlIik6CisgICAgICAgICAgICAgICAgcy5lbmNvZGUoZW5jLCBlcnIpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVoZWxwZXIoc2VsZik6CisgICAgICAgICMgZW5oYW5jZSBjb3ZlcmFnZSBvZjoKKyAgICAgICAgIyBPYmplY3RzL3VuaWNvZGVvYmplY3QuYzo6dW5pY29kZV9kZWNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoKQorICAgICAgICAjIGFuZCBjYWxsZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKExvb2t1cEVycm9yLCAiXHhmZiIuZGVjb2RlLCAiYXNjaWkiLCAidGVzdC51bmtub3duIikKKworICAgICAgICBkZWYgYmFkZGVjb2RlcmV0dXJuMShleGMpOgorICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5iYWRkZWNvZGVyZXR1cm4xIiwgYmFkZGVjb2RlcmV0dXJuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCAiXHhmZiIuZGVjb2RlLCAiYXNjaWkiLCAidGVzdC5iYWRkZWNvZGVyZXR1cm4xIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCAiXFwiLmRlY29kZSwgInVuaWNvZGUtZXNjYXBlIiwgInRlc3QuYmFkZGVjb2RlcmV0dXJuMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgIlxceDAiLmRlY29kZSwgInVuaWNvZGUtZXNjYXBlIiwgInRlc3QuYmFkZGVjb2RlcmV0dXJuMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgIlxceDB5Ii5kZWNvZGUsICJ1bmljb2RlLWVzY2FwZSIsICJ0ZXN0LmJhZGRlY29kZXJldHVybjEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsICJcXFVmZmZmZWVlZSIuZGVjb2RlLCAidW5pY29kZS1lc2NhcGUiLCAidGVzdC5iYWRkZWNvZGVyZXR1cm4xIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCAiXFx1eXl5eSIuZGVjb2RlLCAicmF3LXVuaWNvZGUtZXNjYXBlIiwgInRlc3QuYmFkZGVjb2RlcmV0dXJuMSIpCisKKyAgICAgICAgZGVmIGJhZGRlY29kZXJldHVybjIoZXhjKToKKyAgICAgICAgICAgIHJldHVybiAodSI/IiwgTm9uZSkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmJhZGRlY29kZXJldHVybjIiLCBiYWRkZWNvZGVyZXR1cm4yKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsICJceGZmIi5kZWNvZGUsICJhc2NpaSIsICJ0ZXN0LmJhZGRlY29kZXJldHVybjIiKQorCisgICAgICAgIGhhbmRsZXIgPSBQb3NSZXR1cm4oKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QucG9zcmV0dXJuIiwgaGFuZGxlci5oYW5kbGUpCisKKyAgICAgICAgIyBWYWxpZCBuZWdhdGl2ZSBwb3NpdGlvbgorICAgICAgICBoYW5kbGVyLnBvcyA9IC0xCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIlx4ZmYwIi5kZWNvZGUoImFzY2lpIiwgInRlc3QucG9zcmV0dXJuIiksIHUiPD8+MCIpCisKKyAgICAgICAgIyBWYWxpZCBuZWdhdGl2ZSBwb3NpdGlvbgorICAgICAgICBoYW5kbGVyLnBvcyA9IC0yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIlx4ZmYwIi5kZWNvZGUoImFzY2lpIiwgInRlc3QucG9zcmV0dXJuIiksIHUiPD8+PD8+IikKKworICAgICAgICAjIE5lZ2F0aXZlIHBvc2l0aW9uIG91dCBvZiBib3VuZHMKKyAgICAgICAgaGFuZGxlci5wb3MgPSAtMworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCAiXHhmZjAiLmRlY29kZSwgImFzY2lpIiwgInRlc3QucG9zcmV0dXJuIikKKworICAgICAgICAjIFZhbGlkIHBvc2l0aXZlIHBvc2l0aW9uCisgICAgICAgIGhhbmRsZXIucG9zID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJceGZmMCIuZGVjb2RlKCJhc2NpaSIsICJ0ZXN0LnBvc3JldHVybiIpLCB1Ijw/PjAiKQorCisgICAgICAgICMgTGFyZ2VzdCB2YWxpZCBwb3NpdGl2ZSBwb3NpdGlvbiAob25lIGJleW9uZCBlbmQgb2YgaW5wdXQpCisgICAgICAgIGhhbmRsZXIucG9zID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJceGZmMCIuZGVjb2RlKCJhc2NpaSIsICJ0ZXN0LnBvc3JldHVybiIpLCB1Ijw/PiIpCisKKyAgICAgICAgIyBJbnZhbGlkIHBvc2l0aXZlIHBvc2l0aW9uCisgICAgICAgIGhhbmRsZXIucG9zID0gMworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCAiXHhmZjAiLmRlY29kZSwgImFzY2lpIiwgInRlc3QucG9zcmV0dXJuIikKKworICAgICAgICAjIFJlc3RhcnQgYXQgdGhlICIwIgorICAgICAgICBoYW5kbGVyLnBvcyA9IDYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXFx1eXl5eTAiLmRlY29kZSgicmF3LXVuaWNvZGUtZXNjYXBlIiwgInRlc3QucG9zcmV0dXJuIiksIHUiPD8+MCIpCisKKyAgICAgICAgY2xhc3MgRChkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBjb2RlY3MuY2hhcm1hcF9kZWNvZGUsICJceGZmIiwgInN0cmljdCIsIHsweGZmOiBOb25lfSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHhmZiIsICJzdHJpY3QiLCBEKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHhmZiIsICJzdHJpY3QiLCB7MHhmZjogMHgxMTAwMDB9KQorCisgICAgZGVmIHRlc3RfZW5jb2RlaGVscGVyKHNlbGYpOgorICAgICAgICAjIGVuaGFuY2UgY292ZXJhZ2Ugb2Y6CisgICAgICAgICMgT2JqZWN0cy91bmljb2Rlb2JqZWN0LmM6OnVuaWNvZGVfZW5jb2RlX2NhbGxfZXJyb3JoYW5kbGVyKCkKKyAgICAgICAgIyBhbmQgY2FsbGVycworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhMb29rdXBFcnJvciwgdSJceGZmIi5lbmNvZGUsICJhc2NpaSIsICJ0ZXN0LnVua25vd24iKQorCisgICAgICAgIGRlZiBiYWRlbmNvZGVyZXR1cm4xKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gNDIKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmJhZGVuY29kZXJldHVybjEiLCBiYWRlbmNvZGVyZXR1cm4xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUiXHhmZiIuZW5jb2RlLCAiYXNjaWkiLCAidGVzdC5iYWRlbmNvZGVyZXR1cm4xIikKKworICAgICAgICBkZWYgYmFkZW5jb2RlcmV0dXJuMihleGMpOgorICAgICAgICAgICAgcmV0dXJuICh1Ij8iLCBOb25lKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuYmFkZW5jb2RlcmV0dXJuMiIsIGJhZGVuY29kZXJldHVybjIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdSJceGZmIi5lbmNvZGUsICJhc2NpaSIsICJ0ZXN0LmJhZGVuY29kZXJldHVybjIiKQorCisgICAgICAgIGhhbmRsZXIgPSBQb3NSZXR1cm4oKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QucG9zcmV0dXJuIiwgaGFuZGxlci5oYW5kbGUpCisKKyAgICAgICAgIyBWYWxpZCBuZWdhdGl2ZSBwb3NpdGlvbgorICAgICAgICBoYW5kbGVyLnBvcyA9IC0xCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJceGZmMCIuZW5jb2RlKCJhc2NpaSIsICJ0ZXN0LnBvc3JldHVybiIpLCAiPD8+MCIpCisKKyAgICAgICAgIyBWYWxpZCBuZWdhdGl2ZSBwb3NpdGlvbgorICAgICAgICBoYW5kbGVyLnBvcyA9IC0yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJceGZmMCIuZW5jb2RlKCJhc2NpaSIsICJ0ZXN0LnBvc3JldHVybiIpLCAiPD8+PD8+IikKKworICAgICAgICAjIE5lZ2F0aXZlIHBvc2l0aW9uIG91dCBvZiBib3VuZHMKKyAgICAgICAgaGFuZGxlci5wb3MgPSAtMworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB1Ilx4ZmYwIi5lbmNvZGUsICJhc2NpaSIsICJ0ZXN0LnBvc3JldHVybiIpCisKKyAgICAgICAgIyBWYWxpZCBwb3NpdGl2ZSBwb3NpdGlvbgorICAgICAgICBoYW5kbGVyLnBvcyA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Ilx4ZmYwIi5lbmNvZGUoImFzY2lpIiwgInRlc3QucG9zcmV0dXJuIiksICI8Pz4wIikKKworICAgICAgICAjIExhcmdlc3QgdmFsaWQgcG9zaXRpdmUgcG9zaXRpb24gKG9uZSBiZXlvbmQgZW5kIG9mIGlucHV0CisgICAgICAgIGhhbmRsZXIucG9zID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiXHhmZjAiLmVuY29kZSgiYXNjaWkiLCAidGVzdC5wb3NyZXR1cm4iKSwgIjw/PiIpCisKKyAgICAgICAgIyBJbnZhbGlkIHBvc2l0aXZlIHBvc2l0aW9uCisgICAgICAgIGhhbmRsZXIucG9zID0gMworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB1Ilx4ZmYwIi5lbmNvZGUsICJhc2NpaSIsICJ0ZXN0LnBvc3JldHVybiIpCisKKyAgICAgICAgaGFuZGxlci5wb3MgPSAwCisKKyAgICAgICAgY2xhc3MgRChkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgZm9yIGVyciBpbiAoInN0cmljdCIsICJyZXBsYWNlIiwgInhtbGNoYXJyZWZyZXBsYWNlIiwgImJhY2tzbGFzaHJlcGxhY2UiLCAidGVzdC5wb3NyZXR1cm4iKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgY29kZWNzLmNoYXJtYXBfZW5jb2RlLCB1Ilx4ZmYiLCBlcnIsIHsweGZmOiBOb25lfSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvZGVjcy5jaGFybWFwX2VuY29kZSwgdSJceGZmIiwgZXJyLCBEKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5jaGFybWFwX2VuY29kZSwgdSJceGZmIiwgZXJyLCB7MHhmZjogMzAwfSkKKworICAgIGRlZiB0ZXN0X3RyYW5zbGF0ZWhlbHBlcihzZWxmKToKKyAgICAgICAgIyBlbmhhbmNlIGNvdmVyYWdlIG9mOgorICAgICAgICAjIE9iamVjdHMvdW5pY29kZW9iamVjdC5jOjp1bmljb2RlX2VuY29kZV9jYWxsX2Vycm9yaGFuZGxlcigpCisgICAgICAgICMgYW5kIGNhbGxlcnMKKyAgICAgICAgIyAoVW5mb3J0dW5hdGVseSB0aGUgZXJyb3JzIGFyZ3VtZW50IGlzIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlCisgICAgICAgICMgZnJvbSBQeXRob24sIHNvIHdlIGNhbid0IHRlc3QgdGhhdCBtdWNoKQorICAgICAgICBjbGFzcyBEKGRpY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1Ilx4ZmYiLnRyYW5zbGF0ZSwgRCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUiXHhmZiIudHJhbnNsYXRlLCB7MHhmZjogc3lzLm1heHVuaWNvZGUrMX0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdSJceGZmIi50cmFuc2xhdGUsIHsweGZmOiAoKX0pCisKKyAgICBkZWYgdGVzdF9idWc4Mjg3Mzcoc2VsZik6CisgICAgICAgIGNoYXJtYXAgPSB7CisgICAgICAgICAgICBvcmQoIiYiKTogdSImYW1wOyIsCisgICAgICAgICAgICBvcmQoIjwiKTogdSImbHQ7IiwKKyAgICAgICAgICAgIG9yZCgiPiIpOiB1IiZndDsiLAorICAgICAgICAgICAgb3JkKCciJyk6IHUiJnF1b3Q7IiwKKyAgICAgICAgfQorCisgICAgICAgIGZvciBuIGluICgxLCAxMCwgMTAwLCAxMDAwKToKKyAgICAgICAgICAgIHRleHQgPSB1J2FiYzxkZWY+Z2hpJypuCisgICAgICAgICAgICB0ZXh0LnRyYW5zbGF0ZShjaGFybWFwKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENvZGVjQ2FsbGJhY2tUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxMDNlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxMDNlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNWU4ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weQpAQCAtMCwwICsxLDg2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weQorIyAgIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBQUkMgZW5jb2RpbmdzLgorIworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBUZXN0X0dCMjMxMih0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdnYjIzMTInCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2diMjMxMicpCisgICAgY29kZWN0ZXN0cyA9ICgKKyAgICAgICAgIyBpbnZhbGlkIGJ5dGVzCisgICAgICAgICgiYWJjXHg4MVx4ODFceGMxXHhjNCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHhjOCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHg4MVx4ODFceGMxXHhjNCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdTgwNGEiKSwKKyAgICAgICAgKCJhYmNceDgxXHg4MVx4YzFceGM0XHhjOCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdTgwNGFcdWZmZmQiKSwKKyAgICAgICAgKCJhYmNceDgxXHg4MVx4YzFceGM0IiwgImlnbm9yZSIsICB1ImFiY1x1ODA0YSIpLAorICAgICAgICAoIlx4YzFceDY0IiwgInN0cmljdCIsIE5vbmUpLAorICAgICkKKworY2xhc3MgVGVzdF9HQksodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnZ2JrJworICAgIHRzdHJpbmcgPSB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQubG9hZF90ZXN0c3RyaW5nKCdnYmsnKQorICAgIGNvZGVjdGVzdHMgPSAoCisgICAgICAgICMgaW52YWxpZCBieXRlcworICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICAgICAoImFiY1x4YzgiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4MDRhIiksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNFx4YzgiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4MDRhXHVmZmZkIiksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJpZ25vcmUiLCAgdSJhYmNcdTgwNGEiKSwKKyAgICAgICAgKCJceDgzXHgzNFx4ODNceDMxIiwgInN0cmljdCIsIE5vbmUpLAorICAgICAgICAodSJcdTMwZmIiLCAic3RyaWN0IiwgTm9uZSksCisgICAgKQorCitjbGFzcyBUZXN0X0dCMTgwMzAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnZ2IxODAzMCcKKyAgICB0c3RyaW5nID0gdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LmxvYWRfdGVzdHN0cmluZygnZ2IxODAzMCcpCisgICAgY29kZWN0ZXN0cyA9ICgKKyAgICAgICAgIyBpbnZhbGlkIGJ5dGVzCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHhjOCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdTgwNGEiKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0XHhjOCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdTgwNGFcdWZmZmQiKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgImlnbm9yZSIsICB1ImFiY1x1ODA0YSIpLAorICAgICAgICAoImFiY1x4ODRceDM5XHg4NFx4MzlceGMxXHhjNCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdTgwNGEiKSwKKyAgICAgICAgKHUiXHUzMGZiIiwgInN0cmljdCIsICJceDgxOVx4YTc5IiksCisgICAgKQorICAgIGhhc19pc28xMDY0NiA9IFRydWUKKworY2xhc3MgVGVzdF9IWih0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdoeicKKyAgICB0c3RyaW5nID0gdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LmxvYWRfdGVzdHN0cmluZygnaHonKQorICAgIGNvZGVjdGVzdHMgPSAoCisgICAgICAgICMgdGVzdCAnflxuJyAoMyBsaW5lcykKKyAgICAgICAgKGInVGhpcyBzZW50ZW5jZSBpcyBpbiBBU0NJSS5cbicKKyAgICAgICAgIGInVGhlIG5leHQgc2VudGVuY2UgaXMgaW4gR0Iufns8Okt5MjtTeyMsfn1+XG4nCisgICAgICAgICBiJ357TnBKKWw2SEshI359QnllLlxuJywKKyAgICAgICAgICdzdHJpY3QnLAorICAgICAgICAgdSdUaGlzIHNlbnRlbmNlIGlzIGluIEFTQ0lJLlxuJworICAgICAgICAgdSdUaGUgbmV4dCBzZW50ZW5jZSBpcyBpbiBHQi4nCisgICAgICAgICB1J1x1NWRmMVx1NjI0MFx1NGUwZFx1NmIzMlx1ZmYwY1x1NTJmZlx1NjViZFx1NjViY1x1NGViYVx1MzAwMicKKyAgICAgICAgIHUnQnllLlxuJyksCisgICAgICAgICMgdGVzdCAnflxuJyAoNCBsaW5lcykKKyAgICAgICAgKGInVGhpcyBzZW50ZW5jZSBpcyBpbiBBU0NJSS5cbicKKyAgICAgICAgIGInVGhlIG5leHQgc2VudGVuY2UgaXMgaW4gR0IuflxuJworICAgICAgICAgYid+ezw6S3kyO1N7IyxOcEopbDZISyEjfn1+XG4nCisgICAgICAgICBiJ0J5ZS5cbicsCisgICAgICAgICAnc3RyaWN0JywKKyAgICAgICAgIHUnVGhpcyBzZW50ZW5jZSBpcyBpbiBBU0NJSS5cbicKKyAgICAgICAgIHUnVGhlIG5leHQgc2VudGVuY2UgaXMgaW4gR0IuJworICAgICAgICAgdSdcdTVkZjFcdTYyNDBcdTRlMGRcdTZiMzJcdWZmMGNcdTUyZmZcdTY1YmRcdTY1YmNcdTRlYmFcdTMwMDInCisgICAgICAgICB1J0J5ZS5cbicpLAorICAgICAgICAjIGludmFsaWQgYnl0ZXMKKyAgICAgICAgKGInYWJ+Y2QnLCAncmVwbGFjZScsIHUnYWJcdUZGRkRkJyksCisgICAgICAgIChiJ2FiXHhmZmNkJywgJ3JlcGxhY2UnLCB1J2FiXHVGRkZEY2QnKSwKKyAgICAgICAgKGInYWJ+e1x4ODFceDgxXHg0MVx4NDR+fWNkJywgJ3JlcGxhY2UnLCB1J2FiXHVGRkZEXHVGRkZEXHU4MDRBY2QnKSwKKyAgICApCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiNjM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiNjM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2NuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19oay5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzI2MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19oay5weQpAQCAtMCwwICsxLDI3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgdGVzdF9jb2RlY2VuY29kaW5nc19oay5weQorIyAgIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBIb25nS29uZyBlbmNvZGluZ3MuCisjCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFRlc3RfQmlnNUhLU0NTKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2JpZzVoa3NjcycKKyAgICB0c3RyaW5nID0gdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LmxvYWRfdGVzdHN0cmluZygnYmlnNWhrc2NzJykKKyAgICBjb2RlY3Rlc3RzID0gKAorICAgICAgICAjIGludmFsaWQgYnl0ZXMKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceGM4IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1OGIxMCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzRceGM4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1OGIxMFx1ZmZmZCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAiaWdub3JlIiwgIHUiYWJjXHU4YjEwIiksCisgICAgKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzU2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19oay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MzU2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19oay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaXNvMjAyMi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxZDJhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHkKQEAgLTAsMCArMSw0NiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBJU08gMjAyMiBlbmNvZGluZ3MuCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK0NPTU1PTl9DT0RFQ19URVNUUyA9ICgKKyAgICAgICAgIyBpbnZhbGlkIGJ5dGVzCisgICAgICAgIChiJ2FiXHhGRmNkJywgJ3JlcGxhY2UnLCB1J2FiXHVGRkZEY2QnKSwKKyAgICAgICAgKGInYWJceDFCZGVmJywgJ3JlcGxhY2UnLCB1J2FiXHgxQmRlZicpLAorICAgICAgICAoYidhYlx4MUIkZGVmJywgJ3JlcGxhY2UnLCB1J2FiXHVGRkZEJyksCisgICAgKQorCitjbGFzcyBUZXN0X0lTTzIwMjJfSlAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnaXNvMjAyMl9qcCcKKyAgICB0c3RyaW5nID0gdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LmxvYWRfdGVzdHN0cmluZygnaXNvMjAyMl9qcCcpCisgICAgY29kZWN0ZXN0cyA9IENPTU1PTl9DT0RFQ19URVNUUyArICgKKyAgICAgICAgKGInYWJceDFCTmRlZicsICdyZXBsYWNlJywgdSdhYlx4MUJOZGVmJyksCisgICAgKQorCitjbGFzcyBUZXN0X0lTTzIwMjJfSlAyKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2lzbzIwMjJfanBfMicKKyAgICB0c3RyaW5nID0gdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LmxvYWRfdGVzdHN0cmluZygnaXNvMjAyMl9qcCcpCisgICAgY29kZWN0ZXN0cyA9IENPTU1PTl9DT0RFQ19URVNUUyArICgKKyAgICAgICAgKGInYWJceDFCTmRlZicsICdyZXBsYWNlJywgdSdhYmRlZicpLAorICAgICkKKworY2xhc3MgVGVzdF9JU08yMDIyX0tSKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2lzbzIwMjJfa3InCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2lzbzIwMjJfa3InKQorICAgIGNvZGVjdGVzdHMgPSBDT01NT05fQ09ERUNfVEVTVFMgKyAoCisgICAgICAgIChiJ2FiXHgxQk5kZWYnLCAncmVwbGFjZScsIHUnYWJceDFCTmRlZicpLAorICAgICkKKworICAgICMgaXNvMjAyMl9rci50eHQgY2Fubm90IGJlIHVzZWQgdG8gdGVzdCAiY2h1bmsgY29kaW5nIjogdGhlIGVzY2FwZQorICAgICMgc2VxdWVuY2UgaXMgb25seSB3cml0dGVuIG9uIHRoZSBmaXJzdCBsaW5lCisgICAgZGVmIHRlc3RfY2h1bmtjb2Rpbmcoc2VsZik6CisgICAgICAgIHBhc3MKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaXNvMjAyMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkMjNmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaXNvMjAyMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZkMjNmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4MWY0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5CkBAIC0wLDAgKzEsMTA1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weQorIyAgIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBKYXBhbmVzZSBlbmNvZGluZ3MuCisjCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFRlc3RfQ1A5MzIodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnY3A5MzInCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ3NoaWZ0X2ppcycpCisgICAgY29kZWN0ZXN0cyA9ICgKKyAgICAgICAgIyBpbnZhbGlkIGJ5dGVzCisgICAgICAgICgiYWJjXHg4MVx4MDBceDgxXHgwMFx4ODJceDg0IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceGY4IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceDgxXHgwMFx4ODJceDg0IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1ZmY0NCIpLAorICAgICAgICAoImFiY1x4ODFceDAwXHg4Mlx4ODRceDg4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1ZmY0NFx1ZmZmZCIpLAorICAgICAgICAoImFiY1x4ODFceDAwXHg4Mlx4ODQiLCAiaWdub3JlIiwgIHUiYWJjXHVmZjQ0IiksCisgICAgICAgICMgc2ppcyB2cyBjcDkzMgorICAgICAgICAoIlxcXHg3ZSIsICJyZXBsYWNlIiwgdSJcXFx4N2UiKSwKKyAgICAgICAgKCJceDgxXHg1Zlx4ODFceDYxXHg4MVx4N2MiLCAicmVwbGFjZSIsIHUiXHVmZjNjXHUyMjI1XHVmZjBkIiksCisgICAgKQorCitjbGFzcyBUZXN0X0VVQ19KSVNYMDIxMyh0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnZXVjX2ppc3gwMjEzJworICAgIHRzdHJpbmcgPSB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQubG9hZF90ZXN0c3RyaW5nKCdldWNfamlzeDAyMTMnKQorICAgIGNvZGVjdGVzdHMgPSAoCisgICAgICAgICMgaW52YWxpZCBieXRlcworICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICAgICAoImFiY1x4YzgiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU3OTU2IiksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNFx4YzgiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU3OTU2XHVmZmZkIiksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJpZ25vcmUiLCAgdSJhYmNcdTc5NTYiKSwKKyAgICAgICAgKCJhYmNceDhmXHg4M1x4ODMiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkIiksCisgICAgICAgICgiXHhjMVx4NjQiLCAic3RyaWN0IiwgTm9uZSksCisgICAgICAgICgiXHhhMVx4YzAiLCAic3RyaWN0IiwgdSJcdWZmM2MiKSwKKyAgICApCisgICAgeG1sY2hhcm5hbWV0ZXN0ID0gKAorICAgICAgICB1Ilx4YWJcdTIxMWNceGJiID0gXHUyMzI5XHUxMjM0XHUyMzJhIiwKKyAgICAgICAgIlx4YTlceGE4JnJlYWw7XHhhOVx4YjIgPSAmbGFuZzsmIzQ2NjA7JnJhbmc7IgorICAgICkKKworZXVjanBfY29tbW9udGVzdHMgPSAoCisgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAoImFiY1x4YzgiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdTc5NTYiKSwKKyAgICAoImFiY1x4ODBceDgwXHhjMVx4YzRceGM4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1Nzk1Nlx1ZmZmZCIpLAorICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJpZ25vcmUiLCAgdSJhYmNcdTc5NTYiKSwKKyAgICAoImFiY1x4OGZceDgzXHg4MyIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmQiKSwKKyAgICAoIlx4YzFceDY0IiwgInN0cmljdCIsIE5vbmUpLAorKQorCitjbGFzcyBUZXN0X0VVQ19KUF9DT01QQVQodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdldWNfanAnCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2V1Y19qcCcpCisgICAgY29kZWN0ZXN0cyA9IGV1Y2pwX2NvbW1vbnRlc3RzICsgKAorICAgICAgICAoIlx4YTFceGMwXFwiLCAic3RyaWN0IiwgdSJcdWZmM2NcXCIpLAorICAgICAgICAodSJceGE1IiwgInN0cmljdCIsICJceDVjIiksCisgICAgICAgICh1Ilx1MjAzZSIsICJzdHJpY3QiLCAiXHg3ZSIpLAorICAgICkKKworc2hpZnRqaXNfY29tbW9uZW5jdGVzdHMgPSAoCisgICAgKCJhYmNceDgwXHg4MFx4ODJceDg0IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAoImFiY1x4ZjgiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICgiYWJjXHg4MFx4ODBceDgyXHg4NCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdWZmNDQiKSwKKyAgICAoImFiY1x4ODBceDgwXHg4Mlx4ODRceDg4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1ZmY0NFx1ZmZmZCIpLAorICAgICgiYWJjXHg4MFx4ODBceDgyXHg4NGRlZiIsICJpZ25vcmUiLCAgdSJhYmNcdWZmNDRkZWYiKSwKKykKKworY2xhc3MgVGVzdF9TSklTX0NPTVBBVCh0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdzaGlmdF9qaXMnCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ3NoaWZ0X2ppcycpCisgICAgY29kZWN0ZXN0cyA9IHNoaWZ0amlzX2NvbW1vbmVuY3Rlc3RzICsgKAorICAgICAgICAoIlxcXHg3ZSIsICJzdHJpY3QiLCB1IlxcXHg3ZSIpLAorICAgICAgICAoIlx4ODFceDVmXHg4MVx4NjFceDgxXHg3YyIsICJzdHJpY3QiLCB1Ilx1ZmYzY1x1MjAxNlx1MjIxMiIpLAorICAgICkKKworY2xhc3MgVGVzdF9TSklTWDAyMTModGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnc2hpZnRfamlzeDAyMTMnCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ3NoaWZ0X2ppc3gwMjEzJykKKyAgICBjb2RlY3Rlc3RzID0gKAorICAgICAgICAjIGludmFsaWQgYnl0ZXMKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4ODJceDg0IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceGY4IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4ODJceDg0IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1ZmY0NCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHg4Mlx4ODRceDg4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1ZmY0NFx1ZmZmZCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHg4Mlx4ODRkZWYiLCAiaWdub3JlIiwgIHUiYWJjXHVmZjQ0ZGVmIiksCisgICAgICAgICMgc2ppcyB2cyBjcDkzMgorICAgICAgICAoIlxcXHg3ZSIsICJyZXBsYWNlIiwgdSJceGE1XHUyMDNlIiksCisgICAgICAgICgiXHg4MVx4NWZceDgxXHg2MVx4ODFceDdjIiwgInJlcGxhY2UiLCB1Ilx4NWNcdTIwMTZcdTIyMTIiKSwKKyAgICApCisgICAgeG1sY2hhcm5hbWV0ZXN0ID0gKAorICAgICAgICB1Ilx4YWJcdTIxMWNceGJiID0gXHUyMzI5XHUxMjM0XHUyMzJhIiwKKyAgICAgICAgIlx4ODVHJnJlYWw7XHg4NVEgPSAmbGFuZzsmIzQ2NjA7JnJhbmc7IgorICAgICkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjMyNGFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjMyNGFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfanAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4NjZhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5CkBAIC0wLDAgKzEsNjkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyB0ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5CisjICAgQ29kZWMgZW5jb2RpbmcgdGVzdHMgZm9yIFJPSyBlbmNvZGluZ3MuCisjCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFRlc3RfQ1A5NDkodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnY3A5NDknCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2NwOTQ5JykKKyAgICBjb2RlY3Rlc3RzID0gKAorICAgICAgICAjIGludmFsaWQgYnl0ZXMKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceGM4IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1Yzg5NCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzRceGM4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1Yzg5NFx1ZmZmZCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAiaWdub3JlIiwgIHUiYWJjXHVjODk0IiksCisgICAgKQorCitjbGFzcyBUZXN0X0VVQ0tSKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2V1Y19rcicKKyAgICB0c3RyaW5nID0gdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LmxvYWRfdGVzdHN0cmluZygnZXVjX2tyJykKKyAgICBjb2RlY3Rlc3RzID0gKAorICAgICAgICAjIGludmFsaWQgYnl0ZXMKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceGM4IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1Yzg5NCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzRceGM4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1Yzg5NFx1ZmZmZCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAiaWdub3JlIiwgIHUiYWJjXHVjODk0IiksCisKKyAgICAgICAgIyBjb21wb3NlZCBtYWtlLXVwIHNlcXVlbmNlIGVycm9ycworICAgICAgICAoIlx4YTRceGQ0IiwgInN0cmljdCIsIE5vbmUpLAorICAgICAgICAoIlx4YTRceGQ0XHhhNCIsICJzdHJpY3QiLCBOb25lKSwKKyAgICAgICAgKCJceGE0XHhkNFx4YTRceGI2IiwgInN0cmljdCIsIE5vbmUpLAorICAgICAgICAoIlx4YTRceGQ0XHhhNFx4YjZceGE0IiwgInN0cmljdCIsIE5vbmUpLAorICAgICAgICAoIlx4YTRceGQ0XHhhNFx4YjZceGE0XHhkMCIsICJzdHJpY3QiLCBOb25lKSwKKyAgICAgICAgKCJceGE0XHhkNFx4YTRceGI2XHhhNFx4ZDBceGE0IiwgInN0cmljdCIsIE5vbmUpLAorICAgICAgICAoIlx4YTRceGQ0XHhhNFx4YjZceGE0XHhkMFx4YTRceGQ0IiwgInN0cmljdCIsIHUiXHVjNGQ0IiksCisgICAgICAgICgiXHhhNFx4ZDRceGE0XHhiNlx4YTRceGQwXHhhNFx4ZDR4IiwgInN0cmljdCIsIHUiXHVjNGQ0eCIpLAorICAgICAgICAoImFceGE0XHhkNFx4YTRceGI2XHhhNCIsICJyZXBsYWNlIiwgdSJhXHVmZmZkIiksCisgICAgICAgICgiXHhhNFx4ZDRceGEzXHhiNlx4YTRceGQwXHhhNFx4ZDQiLCAic3RyaWN0IiwgTm9uZSksCisgICAgICAgICgiXHhhNFx4ZDRceGE0XHhiNlx4YTNceGQwXHhhNFx4ZDQiLCAic3RyaWN0IiwgTm9uZSksCisgICAgICAgICgiXHhhNFx4ZDRceGE0XHhiNlx4YTRceGQwXHhhM1x4ZDQiLCAic3RyaWN0IiwgTm9uZSksCisgICAgICAgICgiXHhhNFx4ZDRceGE0XHhmZlx4YTRceGQwXHhhNFx4ZDQiLCAicmVwbGFjZSIsIHUiXHVmZmZkIiksCisgICAgICAgICgiXHhhNFx4ZDRceGE0XHhiNlx4YTRceGZmXHhhNFx4ZDQiLCAicmVwbGFjZSIsIHUiXHVmZmZkIiksCisgICAgICAgICgiXHhhNFx4ZDRceGE0XHhiNlx4YTRceGQwXHhhNFx4ZmYiLCAicmVwbGFjZSIsIHUiXHVmZmZkIiksCisgICAgICAgICgiXHhjMVx4YzQiLCAic3RyaWN0IiwgdSJcdWM4OTQiKSwKKyAgICApCisKK2NsYXNzIFRlc3RfSk9IQUIodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnam9oYWInCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2pvaGFiJykKKyAgICBjb2RlY3Rlc3RzID0gKAorICAgICAgICAjIGludmFsaWQgYnl0ZXMKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceGM4IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1Y2QyNyIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzRceGM4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1Y2QyN1x1ZmZmZCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAiaWdub3JlIiwgIHUiYWJjXHVjZDI3IiksCisgICAgKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZjljNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19rci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZjljNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19rci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODNkMDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHkKQEAgLTAsMCArMSwyNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIHRlc3RfY29kZWNlbmNvZGluZ3NfdHcucHkKKyMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgUk9DIGVuY29kaW5ncy4KKyMKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgVGVzdF9CaWc1KHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2JpZzUnCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2JpZzUnKQorICAgIGNvZGVjdGVzdHMgPSAoCisgICAgICAgICMgaW52YWxpZCBieXRlcworICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICAgICAoImFiY1x4YzgiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4YjEwIiksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNFx4YzgiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4YjEwXHVmZmZkIiksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJpZ25vcmUiLCAgdSJhYmNcdThiMTAiKSwKKyAgICApCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3ZmExZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3ZmExZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0ZmM1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weQpAQCAtMCwwICsxLDMzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgdGVzdF9jb2RlY21hcHNfY24ucHkKKyMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBQUkMgZW5jb2RpbmdzCisjCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFRlc3RHQjIzMTJNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2diMjMxMicKKyAgICBtYXBmaWxldXJsID0gJ2h0dHA6Ly9wZW9wbGUuZnJlZWJzZC5vcmcvfnBlcmt5L2kxOG4vRVVDLUNOLlRYVCcKKworY2xhc3MgVGVzdEdCS01hcCh0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2VfTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnZ2JrJworICAgIG1hcGZpbGV1cmwgPSAnaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy8nIFwKKyAgICAgICAgICAgICAgICAgJ01JQ1NGVC9XSU5ET1dTL0NQOTM2LlRYVCcKKworY2xhc3MgVGVzdEdCMTgwMzBNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnZ2IxODAzMCcKKyAgICBtYXBmaWxldXJsID0gJ2h0dHA6Ly9zb3VyY2UuaWN1LXByb2plY3Qub3JnL3JlcG9zL2ljdS9kYXRhLycgXAorICAgICAgICAgICAgICAgICAndHJ1bmsvY2hhcnNldC9kYXRhL3htbC9nYi0xODAzMC0yMDAwLnhtbCcKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2NuLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwNjc4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2NuLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwNjc4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2hrLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2hrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MmFiN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfaGsucHkKQEAgLTAsMCArMSwyMSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIHRlc3RfY29kZWNtYXBzX2hrLnB5CisjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgSG9uZ0tvbmcgZW5jb2RpbmdzCisjCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFRlc3RCaWc1SEtTQ1NNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdiaWc1aGtzY3MnCisgICAgbWFwZmlsZXVybCA9ICdodHRwOi8vcGVvcGxlLmZyZWVic2Qub3JnL35wZXJreS9pMThuL0JJRzVIS1NDUy0yMDA0LlRYVCcKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBbJ3VybGZldGNoJ10KKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2hrLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExYWYwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2hrLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjExYWYwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjZhOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfanAucHkKQEAgLTAsMCArMSw2NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIHRlc3RfY29kZWNtYXBzX2pwLnB5CisjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgSmFwYW5lc2UgZW5jb2RpbmdzCisjCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFRlc3RDUDkzMk1hcCh0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2VfTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnY3A5MzInCisgICAgbWFwZmlsZXVybCA9ICdodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC8nIFwKKyAgICAgICAgICAgICAgICAgJ1dJTkRPV1MvQ1A5MzIuVFhUJworICAgIHN1cG1hcHMgPSBbCisgICAgICAgICgnXHg4MCcsIHUnXHUwMDgwJyksCisgICAgICAgICgnXHhhMCcsIHUnXHVmOGYwJyksCisgICAgICAgICgnXHhmZCcsIHUnXHVmOGYxJyksCisgICAgICAgICgnXHhmZScsIHUnXHVmOGYyJyksCisgICAgICAgICgnXHhmZicsIHUnXHVmOGYzJyksCisgICAgXQorICAgIGZvciBpIGluIHJhbmdlKDB4YTEsIDB4ZTApOgorICAgICAgICBzdXBtYXBzLmFwcGVuZCgoY2hyKGkpLCB1bmljaHIoaSsweGZlYzApKSkKKworCitjbGFzcyBUZXN0RVVDSlBDT01QQVRNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2V1Y19qcCcKKyAgICBtYXBmaWxlbmFtZSA9ICdFVUMtSlAuVFhUJworICAgIG1hcGZpbGV1cmwgPSAnaHR0cDovL3Blb3BsZS5mcmVlYnNkLm9yZy9+cGVya3kvaTE4bi9FVUMtSlAuVFhUJworCisKK2NsYXNzIFRlc3RTSklTQ09NUEFUTWFwKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZV9NYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ3NoaWZ0X2ppcycKKyAgICBtYXBmaWxlbmFtZSA9ICdTSElGVEpJUy5UWFQnCisgICAgbWFwZmlsZXVybCA9ICdodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9PQlNPTEVURScgXAorICAgICAgICAgICAgICAgICAnL0VBU1RBU0lBL0pJUy9TSElGVEpJUy5UWFQnCisgICAgcGFzc19lbmN0ZXN0ID0gWworICAgICAgICAoJ1x4ODFfJywgdSdcXCcpLAorICAgIF0KKyAgICBwYXNzX2RlY3Rlc3QgPSBbCisgICAgICAgICgnXFwnLCB1J1x4YTUnKSwKKyAgICAgICAgKCd+JywgdSdcdTIwM2UnKSwKKyAgICAgICAgKCdceDgxXycsIHUnXFwnKSwKKyAgICBdCisKK2NsYXNzIFRlc3RFVUNKSVNYMDIxM01hcCh0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2VfTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnZXVjX2ppc3gwMjEzJworICAgIG1hcGZpbGVuYW1lID0gJ0VVQy1KSVNYMDIxMy5UWFQnCisgICAgbWFwZmlsZXVybCA9ICdodHRwOi8vcGVvcGxlLmZyZWVic2Qub3JnL35wZXJreS9pMThuL0VVQy1KSVNYMDIxMy5UWFQnCisKKworY2xhc3MgVGVzdFNKSVNYMDIxM01hcCh0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2VfTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ3NoaWZ0X2ppc3gwMjEzJworICAgIG1hcGZpbGVuYW1lID0gJ1NISUZUX0pJU1gwMjEzLlRYVCcKKyAgICBtYXBmaWxldXJsID0gJ2h0dHA6Ly9wZW9wbGUuZnJlZWJzZC5vcmcvfnBlcmt5L2kxOG4vU0hJRlRfSklTWDAyMTMuVFhUJworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfanAucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2M4NWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfanAucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2M4NWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljNjEyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19rci5weQpAQCAtMCwwICsxLDQ0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgdGVzdF9jb2RlY21hcHNfa3IucHkKKyMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBST0sgZW5jb2RpbmdzCisjCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFRlc3RDUDk0OU1hcCh0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2VfTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnY3A5NDknCisgICAgbWFwZmlsZXVybCA9ICdodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVCcgXAorICAgICAgICAgICAgICAgICAnL1dJTkRPV1MvQ1A5NDkuVFhUJworCisKK2NsYXNzIFRlc3RFVUNLUk1hcCh0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2VfTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnZXVjX2tyJworICAgIG1hcGZpbGV1cmwgPSAnaHR0cDovL3Blb3BsZS5mcmVlYnNkLm9yZy9+cGVya3kvaTE4bi9FVUMtS1IuVFhUJworCisgICAgIyBBNEQ0IEhBTkdVTCBGSUxMRVIgaW5kaWNhdGVzIHRoZSBiZWdpbiBvZiA4LWJ5dGVzIG1ha2UtdXAgc2VxdWVuY2UuCisgICAgcGFzc19lbmN0ZXN0ID0gWygnXHhhNFx4ZDQnLCB1J1x1MzE2NCcpXQorICAgIHBhc3NfZGVjdGVzdCA9IFsoJ1x4YTRceGQ0JywgdSdcdTMxNjQnKV0KKworCitjbGFzcyBUZXN0Sk9IQUJNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2pvaGFiJworICAgIG1hcGZpbGV1cmwgPSAnaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvT0JTT0xFVEUvRUFTVEFTSUEvJyBcCisgICAgICAgICAgICAgICAgICdLU0MvSk9IQUIuVFhUJworICAgICMgS1MgWCAxMDAxIHN0YW5kYXJkIGFzc2lnbmVkIDB4NWMgYXMgV09OIFNJR04uCisgICAgIyBidXQsIGluIGVhcmx5IDkwcyB0aGF0IGlzIHRoZSBvbmx5IGVyYSB1c2VkIGpvaGFiIHdpZGVseSwKKyAgICAjIHRoZSBtb3N0IHNvZnR3YXJlcyBpbXBsZW1lbnRzIGl0IGFzIFJFVkVSU0UgU09MSURVUy4KKyAgICAjIFNvLCB3ZSBpZ25vcmUgdGhlIHN0YW5kYXJkIGhlcmUuCisgICAgcGFzc19lbmN0ZXN0ID0gWygnXFwnLCB1J1x1MjBhOScpXQorICAgIHBhc3NfZGVjdGVzdCA9IFsoJ1xcJywgdSdcdTIwYTknKV0KKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19rci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZTcxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19rci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZTcxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc190dy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc190dy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDNhZTIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX3R3LnB5CkBAIC0wLDAgKzEsMzEgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyB0ZXN0X2NvZGVjbWFwc190dy5weQorIyAgIENvZGVjIG1hcHBpbmcgdGVzdHMgZm9yIFJPQyBlbmNvZGluZ3MKKyMKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgVGVzdEJJRzVNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnYmlnNScKKyAgICBtYXBmaWxldXJsID0gJ2h0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL09CU09MRVRFLycgXAorICAgICAgICAgICAgICAgICAnRUFTVEFTSUEvT1RIRVIvQklHNS5UWFQnCisKK2NsYXNzIFRlc3RDUDk1ME1hcCh0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2VfTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnY3A5NTAnCisgICAgbWFwZmlsZXVybCA9ICdodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC8nIFwKKyAgICAgICAgICAgICAgICAgJ1dJTkRPV1MvQ1A5NTAuVFhUJworICAgIHBhc3NfZW5jdGVzdCA9IFsKKyAgICAgICAgKCdceGEyXHhjYycsIHUnXHU1MzQxJyksCisgICAgICAgICgnXHhhMlx4Y2UnLCB1J1x1NTM0NScpLAorICAgIF0KKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc190dy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzcyODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc190dy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzcyODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2NmODE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNzLnB5CkBAIC0wLDAgKzEsMjAxOCBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGNvZGVjcworaW1wb3J0IGxvY2FsZQoraW1wb3J0IHN5cywgU3RyaW5nSU8sIF90ZXN0Y2FwaQorCitkZWYgY29kaW5nX2NoZWNrZXIoc2VsZiwgY29kZXIpOgorICAgIGRlZiBjaGVjayhpbnB1dCwgZXhwZWN0KToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlcihpbnB1dCksIChleHBlY3QsIGxlbihpbnB1dCkpKQorICAgIHJldHVybiBjaGVjaworCitjbGFzcyBRdWV1ZShvYmplY3QpOgorICAgICIiIgorICAgIHF1ZXVlOiB3cml0ZSBieXRlcyBhdCBvbmUgZW5kLCByZWFkIGJ5dGVzIGZyb20gdGhlIG90aGVyIGVuZAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fYnVmZmVyID0gIiIKKworICAgIGRlZiB3cml0ZShzZWxmLCBjaGFycyk6CisgICAgICAgIHNlbGYuX2J1ZmZlciArPSBjaGFycworCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT0tMSk6CisgICAgICAgIGlmIHNpemU8MDoKKyAgICAgICAgICAgIHMgPSBzZWxmLl9idWZmZXIKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlciA9ICIiCisgICAgICAgICAgICByZXR1cm4gcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9IHNlbGYuX2J1ZmZlcls6c2l6ZV0KKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlciA9IHNlbGYuX2J1ZmZlcltzaXplOl0KKyAgICAgICAgICAgIHJldHVybiBzCisKK2NsYXNzIFJlYWRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgY2hlY2tfcGFydGlhbChzZWxmLCBpbnB1dCwgcGFydGlhbHJlc3VsdHMpOgorICAgICAgICAjIGdldCBhIFN0cmVhbVJlYWRlciBmb3IgdGhlIGVuY29kaW5nIGFuZCBmZWVkIHRoZSBieXRlc3RyaW5nIHZlcnNpb24KKyAgICAgICAgIyBvZiBpbnB1dCB0byB0aGUgcmVhZGVyIGJ5dGUgYnkgYnl0ZS4gUmVhZCBldmVyeXRoaW5nIGF2YWlsYWJsZSBmcm9tCisgICAgICAgICMgdGhlIFN0cmVhbVJlYWRlciBhbmQgY2hlY2sgdGhhdCB0aGUgcmVzdWx0cyBlcXVhbCB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgIyBlbnRyaWVzIGZyb20gcGFydGlhbHJlc3VsdHMuCisgICAgICAgIHEgPSBRdWV1ZSgpCisgICAgICAgIHIgPSBjb2RlY3MuZ2V0cmVhZGVyKHNlbGYuZW5jb2RpbmcpKHEpCisgICAgICAgIHJlc3VsdCA9IHUiIgorICAgICAgICBmb3IgKGMsIHBhcnRpYWxyZXN1bHQpIGluIHppcChpbnB1dC5lbmNvZGUoc2VsZi5lbmNvZGluZyksIHBhcnRpYWxyZXN1bHRzKToKKyAgICAgICAgICAgIHEud3JpdGUoYykKKyAgICAgICAgICAgIHJlc3VsdCArPSByLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHBhcnRpYWxyZXN1bHQpCisgICAgICAgICMgY2hlY2sgdGhhdCB0aGVyZSdzIG5vdGhpbmcgbGVmdCBpbiB0aGUgYnVmZmVycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIucmVhZCgpLCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5ieXRlYnVmZmVyLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmNoYXJidWZmZXIsIHUiIikKKworICAgICAgICAjIGRvIHRoZSBjaGVjayBhZ2FpbiwgdGhpcyB0aW1lIHVzaW5nIGEgaW5jcmVtZW50YWwgZGVjb2RlcgorICAgICAgICBkID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcihzZWxmLmVuY29kaW5nKSgpCisgICAgICAgIHJlc3VsdCA9IHUiIgorICAgICAgICBmb3IgKGMsIHBhcnRpYWxyZXN1bHQpIGluIHppcChpbnB1dC5lbmNvZGUoc2VsZi5lbmNvZGluZyksIHBhcnRpYWxyZXN1bHRzKToKKyAgICAgICAgICAgIHJlc3VsdCArPSBkLmRlY29kZShjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHBhcnRpYWxyZXN1bHQpCisgICAgICAgICMgY2hlY2sgdGhhdCB0aGVyZSdzIG5vdGhpbmcgbGVmdCBpbiB0aGUgYnVmZmVycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZGVjb2RlKCIiLCBUcnVlKSwgdSIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYnVmZmVyLCAiIikKKworICAgICAgICAjIENoZWNrIHdoZXRoZXIgdGhlIHJlc2V0IG1ldGhvZCB3b3JrcyBwcm9wZXJseQorICAgICAgICBkLnJlc2V0KCkKKyAgICAgICAgcmVzdWx0ID0gdSIiCisgICAgICAgIGZvciAoYywgcGFydGlhbHJlc3VsdCkgaW4gemlwKGlucHV0LmVuY29kZShzZWxmLmVuY29kaW5nKSwgcGFydGlhbHJlc3VsdHMpOgorICAgICAgICAgICAgcmVzdWx0ICs9IGQuZGVjb2RlKGMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgcGFydGlhbHJlc3VsdCkKKyAgICAgICAgIyBjaGVjayB0aGF0IHRoZXJlJ3Mgbm90aGluZyBsZWZ0IGluIHRoZSBidWZmZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5kZWNvZGUoIiIsIFRydWUpLCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5idWZmZXIsICIiKQorCisgICAgICAgICMgY2hlY2sgaXRlcmRlY29kZSgpCisgICAgICAgIGVuY29kZWQgPSBpbnB1dC5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGlucHV0LAorICAgICAgICAgICAgdSIiLmpvaW4oY29kZWNzLml0ZXJkZWNvZGUoZW5jb2RlZCwgc2VsZi5lbmNvZGluZykpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYpOgorICAgICAgICBkZWYgZ2V0cmVhZGVyKGlucHV0KToKKyAgICAgICAgICAgIHN0cmVhbSA9IFN0cmluZ0lPLlN0cmluZ0lPKGlucHV0LmVuY29kZShzZWxmLmVuY29kaW5nKSkKKyAgICAgICAgICAgIHJldHVybiBjb2RlY3MuZ2V0cmVhZGVyKHNlbGYuZW5jb2RpbmcpKHN0cmVhbSkKKworICAgICAgICBkZWYgcmVhZGFsbGxpbmVzKGlucHV0LCBrZWVwZW5kcz1UcnVlLCBzaXplPU5vbmUpOgorICAgICAgICAgICAgcmVhZGVyID0gZ2V0cmVhZGVyKGlucHV0KQorICAgICAgICAgICAgbGluZXMgPSBbXQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gcmVhZGVyLnJlYWRsaW5lKHNpemU9c2l6ZSwga2VlcGVuZHM9a2VlcGVuZHMpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICByZXR1cm4gInwiLmpvaW4obGluZXMpCisKKyAgICAgICAgcyA9IHUiZm9vXG5iYXJcclxuYmF6XHJzcGFtXHUyMDI4ZWdncyIKKyAgICAgICAgc2V4cGVjdGVkID0gdSJmb29cbnxiYXJcclxufGJhelxyfHNwYW1cdTIwMjh8ZWdncyIKKyAgICAgICAgc2V4cGVjdGVkbm9lbmRzID0gdSJmb298YmFyfGJhenxzcGFtfGVnZ3MiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGFsbGxpbmVzKHMsIFRydWUpLCBzZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGFsbGxpbmVzKHMsIEZhbHNlKSwgc2V4cGVjdGVkbm9lbmRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRhbGxsaW5lcyhzLCBUcnVlLCAxMCksIHNleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkYWxsbGluZXMocywgRmFsc2UsIDEwKSwgc2V4cGVjdGVkbm9lbmRzKQorCisgICAgICAgICMgVGVzdCBsb25nIGxpbmVzIChtdWx0aXBsZSBjYWxscyB0byByZWFkKCkgaW4gcmVhZGxpbmUoKSkKKyAgICAgICAgdncgPSBbXQorICAgICAgICB2d28gPSBbXQorICAgICAgICBmb3IgKGksIGxpbmVlbmQpIGluIGVudW1lcmF0ZSh1IlxuIFxyXG4gXHIgXHUyMDI4Ii5zcGxpdCgpKToKKyAgICAgICAgICAgIHZ3LmFwcGVuZCgoaSoyMDApKnUiXDMwNDIiICsgbGluZWVuZCkKKyAgICAgICAgICAgIHZ3by5hcHBlbmQoKGkqMjAwKSp1IlwzMDQyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkYWxsbGluZXMoIiIuam9pbih2dyksIFRydWUpLCAiIi5qb2luKHZ3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkYWxsbGluZXMoIiIuam9pbih2dyksIEZhbHNlKSwiIi5qb2luKHZ3bykpCisKKyAgICAgICAgIyBUZXN0IGxpbmVzIHdoZXJlIHRoZSBmaXJzdCByZWFkIG1pZ2h0IGVuZCB3aXRoIFxyLCBzbyB0aGUKKyAgICAgICAgIyByZWFkZXIgaGFzIHRvIGxvb2sgYWhlYWQgd2hldGhlciB0aGlzIGlzIGEgbG9uZSBcciBvciBhIFxyXG4KKyAgICAgICAgZm9yIHNpemUgaW4geHJhbmdlKDgwKToKKyAgICAgICAgICAgIGZvciBsaW5lZW5kIGluIHUiXG4gXHJcbiBcciBcdTIwMjgiLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgcyA9IDEwKihzaXplKnUiYSIgKyBsaW5lZW5kICsgdSJ4eHhcbiIpCisgICAgICAgICAgICAgICAgcmVhZGVyID0gZ2V0cmVhZGVyKHMpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkbGluZShrZWVwZW5kcz1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUqdSJhIiArIGxpbmVlbmQsCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBnZXRyZWFkZXIocykKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTApOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyLnJlYWRsaW5lKGtlZXBlbmRzPUZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUqdSJhIiwKKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYnVnMTE3NTM5NihzZWxmKToKKyAgICAgICAgcyA9IFsKKyAgICAgICAgICAgICc8JSEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG4nLAorICAgICAgICAgICAgJyAgICBCTE9HIGluZGV4IHBhZ2U6IHNob3cgcmVjZW50IGFydGljbGVzLFxyXG4nLAorICAgICAgICAgICAgJyAgICB0b2RheVwncyBhcnRpY2xlcywgb3IgYXJ0aWNsZXMgb2YgYSBzcGVjaWZpYyBkYXRlLlxyXG4nLAorICAgICAgICAgICAgJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0lPlxyXG4nLAorICAgICAgICAgICAgJzwlQGlucHV0ZW5jb2Rpbmc9IklTTy04ODU5LTEiJT5cclxuJywKKyAgICAgICAgICAgICc8JUBwYWdldGVtcGxhdGU9VEVNUExBVEUueSU+XHJcbicsCisgICAgICAgICAgICAnPCVAaW1wb3J0PWltcG9ydCBmcm9nLnV0aWwsIGZyb2clPlxyXG4nLAorICAgICAgICAgICAgJzwlQGltcG9ydD1pbXBvcnQgZnJvZy5vYmplY3RzJT5cclxuJywKKyAgICAgICAgICAgICc8JUBpbXBvcnQ9ZnJvbSBmcm9nLnN0b3JhZ2VlcnJvcnMgaW1wb3J0IFN0b3JhZ2VFcnJvciU+XHJcbicsCisgICAgICAgICAgICAnPCVcclxuJywKKyAgICAgICAgICAgICdcclxuJywKKyAgICAgICAgICAgICdpbXBvcnQgbG9nZ2luZ1xyXG4nLAorICAgICAgICAgICAgJ2xvZz1sb2dnaW5nLmdldExvZ2dlcigiU25ha2VsZXRzLmxvZ2dlciIpXHJcbicsCisgICAgICAgICAgICAnXHJcbicsCisgICAgICAgICAgICAnXHJcbicsCisgICAgICAgICAgICAndXNlcj1zZWxmLlNlc3Npb25DdHgudXNlclxyXG4nLAorICAgICAgICAgICAgJ3N0b3JhZ2VFbmdpbmU9c2VsZi5TZXNzaW9uQ3R4LnN0b3JhZ2VFbmdpbmVcclxuJywKKyAgICAgICAgICAgICdcclxuJywKKyAgICAgICAgICAgICdcclxuJywKKyAgICAgICAgICAgICdkZWYgcmVhZEFydGljbGVzRnJvbURhdGUoZGF0ZSwgY291bnQ9Tm9uZSk6XHJcbicsCisgICAgICAgICAgICAnICAgIGVudHJ5aWRzPXN0b3JhZ2VFbmdpbmUubGlzdEJsb2dFbnRyaWVzKGRhdGUpXHJcbicsCisgICAgICAgICAgICAnICAgIGVudHJ5aWRzLnJldmVyc2UoKSAjIGRlc2NlbmRpbmdcclxuJywKKyAgICAgICAgICAgICcgICAgaWYgY291bnQ6XHJcbicsCisgICAgICAgICAgICAnICAgICAgICBlbnRyeWlkcz1lbnRyeWlkc1s6Y291bnRdXHJcbicsCisgICAgICAgICAgICAnICAgIHRyeTpcclxuJywKKyAgICAgICAgICAgICcgICAgICAgIHJldHVybiBbIGZyb2cub2JqZWN0cy5CbG9nRW50cnkubG9hZChzdG9yYWdlRW5naW5lLCBkYXRlLCBJZCkgZm9yIElkIGluIGVudHJ5aWRzIF1cclxuJywKKyAgICAgICAgICAgICcgICAgZXhjZXB0IFN0b3JhZ2VFcnJvcix4OlxyXG4nLAorICAgICAgICAgICAgJyAgICAgICAgbG9nLmVycm9yKCJFcnJvciBsb2FkaW5nIGFydGljbGVzOiAiK3N0cih4KSlcclxuJywKKyAgICAgICAgICAgICcgICAgICAgIHNlbGYuYWJvcnQoImNhbm5vdCBsb2FkIGFydGljbGVzIilcclxuJywKKyAgICAgICAgICAgICdcclxuJywKKyAgICAgICAgICAgICdzaG93ZGF0ZT1Ob25lXHJcbicsCisgICAgICAgICAgICAnXHJcbicsCisgICAgICAgICAgICAnYXJnPXNlbGYuUmVxdWVzdC5nZXRBcmcoKVxyXG4nLAorICAgICAgICAgICAgJ2lmIGFyZz09InRvZGF5IjpcclxuJywKKyAgICAgICAgICAgICcgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tIFRPREFZXCdTIEFSVElDTEVTXHJcbicsCisgICAgICAgICAgICAnICAgIHNlbGYud3JpdGUoIjxoMj5Ub2RheVwncyBhcnRpY2xlczwvaDI+IilcclxuJywKKyAgICAgICAgICAgICcgICAgc2hvd2RhdGUgPSBmcm9nLnV0aWwuaXNvZGF0ZXN0cigpIFxyXG4nLAorICAgICAgICAgICAgJyAgICBlbnRyaWVzID0gcmVhZEFydGljbGVzRnJvbURhdGUoc2hvd2RhdGUpXHJcbicsCisgICAgICAgICAgICAnZWxpZiBhcmc9PSJhY3RpdmUiOlxyXG4nLAorICAgICAgICAgICAgJyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0gQUNUSVZFIEFSVElDTEVTIHJlZGlyZWN0XHJcbicsCisgICAgICAgICAgICAnICAgIHNlbGYuWXJlZGlyZWN0KCJhY3RpdmUueSIpXHJcbicsCisgICAgICAgICAgICAnZWxpZiBhcmc9PSJsb2dpbiI6XHJcbicsCisgICAgICAgICAgICAnICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLSBMT0dJTiBQQUdFIHJlZGlyZWN0XHJcbicsCisgICAgICAgICAgICAnICAgIHNlbGYuWXJlZGlyZWN0KCJsb2dpbi55IilcclxuJywKKyAgICAgICAgICAgICdlbGlmIGFyZz09ImRhdGUiOlxyXG4nLAorICAgICAgICAgICAgJyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0gQVJUSUNMRVMgT0YgQSBTUEVDSUZJQyBEQVRFXHJcbicsCisgICAgICAgICAgICAnICAgIHNob3dkYXRlID0gc2VsZi5SZXF1ZXN0LmdldFBhcmFtZXRlcigiZGF0ZSIpXHJcbicsCisgICAgICAgICAgICAnICAgIHNlbGYud3JpdGUoIjxoMj5BcnRpY2xlcyB3cml0dGVuIG9uICVzPC9oMj4iJSBmcm9nLnV0aWwubWVkaXVtZGF0ZXN0cihzaG93ZGF0ZSkpXHJcbicsCisgICAgICAgICAgICAnICAgIGVudHJpZXMgPSByZWFkQXJ0aWNsZXNGcm9tRGF0ZShzaG93ZGF0ZSlcclxuJywKKyAgICAgICAgICAgICdlbHNlOlxyXG4nLAorICAgICAgICAgICAgJyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0gUkVDRU5UIEFSVElDTEVTXHJcbicsCisgICAgICAgICAgICAnICAgIHNlbGYud3JpdGUoIjxoMj5SZWNlbnQgYXJ0aWNsZXM8L2gyPiIpXHJcbicsCisgICAgICAgICAgICAnICAgIGRhdGVzPXN0b3JhZ2VFbmdpbmUubGlzdEJsb2dFbnRyeURhdGVzKClcclxuJywKKyAgICAgICAgICAgICcgICAgaWYgZGF0ZXM6XHJcbicsCisgICAgICAgICAgICAnICAgICAgICBlbnRyaWVzPVtdXHJcbicsCisgICAgICAgICAgICAnICAgICAgICBTSE9XQU1PVU5UPTEwXHJcbicsCisgICAgICAgICAgICAnICAgICAgICBmb3Igc2hvd2RhdGUgaW4gZGF0ZXM6XHJcbicsCisgICAgICAgICAgICAnICAgICAgICAgICAgZW50cmllcy5leHRlbmQoIHJlYWRBcnRpY2xlc0Zyb21EYXRlKHNob3dkYXRlLCBTSE9XQU1PVU5ULWxlbihlbnRyaWVzKSkgKVxyXG4nLAorICAgICAgICAgICAgJyAgICAgICAgICAgIGlmIGxlbihlbnRyaWVzKT49U0hPV0FNT1VOVDpcclxuJywKKyAgICAgICAgICAgICcgICAgICAgICAgICAgICAgYnJlYWtcclxuJywKKyAgICAgICAgICAgICcgICAgICAgICAgICAgICAgXHJcbicsCisgICAgICAgIF0KKyAgICAgICAgc3RyZWFtID0gU3RyaW5nSU8uU3RyaW5nSU8oIiIuam9pbihzKS5lbmNvZGUoc2VsZi5lbmNvZGluZykpCisgICAgICAgIHJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoc2VsZi5lbmNvZGluZykoc3RyZWFtKQorICAgICAgICBmb3IgKGksIGxpbmUpIGluIGVudW1lcmF0ZShyZWFkZXIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBzW2ldKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVxdWV1ZShzZWxmKToKKyAgICAgICAgcSA9IFF1ZXVlKCkKKyAgICAgICAgd3JpdGVyID0gY29kZWNzLmdldHdyaXRlcihzZWxmLmVuY29kaW5nKShxKQorICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKHNlbGYuZW5jb2RpbmcpKHEpCisKKyAgICAgICAgIyBObyBsaW5lZW5kcworICAgICAgICB3cml0ZXIud3JpdGUodSJmb29cciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKGtlZXBlbmRzPUZhbHNlKSwgdSJmb28iKQorICAgICAgICB3cml0ZXIud3JpdGUodSJcbmJhclxyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoa2VlcGVuZHM9RmFsc2UpLCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKGtlZXBlbmRzPUZhbHNlKSwgdSJiYXIiKQorICAgICAgICB3cml0ZXIud3JpdGUodSJiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZShrZWVwZW5kcz1GYWxzZSksIHUiYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoa2VlcGVuZHM9RmFsc2UpLCB1IiIpCisKKyAgICAgICAgIyBMaW5lZW5kcworICAgICAgICB3cml0ZXIud3JpdGUodSJmb29cciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKGtlZXBlbmRzPVRydWUpLCB1ImZvb1xyIikKKyAgICAgICAgd3JpdGVyLndyaXRlKHUiXG5iYXJcciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKGtlZXBlbmRzPVRydWUpLCB1IlxuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoa2VlcGVuZHM9VHJ1ZSksIHUiYmFyXHIiKQorICAgICAgICB3cml0ZXIud3JpdGUodSJiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZShrZWVwZW5kcz1UcnVlKSwgdSJiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZShrZWVwZW5kcz1UcnVlKSwgdSIiKQorICAgICAgICB3cml0ZXIud3JpdGUodSJmb29cclxuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoa2VlcGVuZHM9VHJ1ZSksIHUiZm9vXHJcbiIpCisKKyAgICBkZWYgdGVzdF9idWcxMDk4OTkwX2Eoc2VsZik6CisgICAgICAgIHMxID0gdSJ4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4IHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXlcclxuIgorICAgICAgICBzMiA9IHUib2ZmZW5kaW5nIGxpbmU6IGxhZGZqIGFza2xkZmoga2xhc2RqIGZza2xhIGRmemFza2RqIGZhc2tsZmogbGFza2QgZmphc2tsZnp6enphYSV3aGVyZWlzdGhpcyEhIVxyXG4iCisgICAgICAgIHMzID0gdSJuZXh0IGxpbmUuXHJcbiIKKworICAgICAgICBzID0gKHMxK3MyK3MzKS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgc3RyZWFtID0gU3RyaW5nSU8uU3RyaW5nSU8ocykKKyAgICAgICAgcmVhZGVyID0gY29kZWNzLmdldHJlYWRlcihzZWxmLmVuY29kaW5nKShzdHJlYW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKCksIHMxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZSgpLCBzMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoKSwgczMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKCksIHUiIikKKworICAgIGRlZiB0ZXN0X2J1ZzEwOTg5OTBfYihzZWxmKToKKyAgICAgICAgczEgPSB1ImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYVxyXG4iCisgICAgICAgIHMyID0gdSJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJcclxuIgorICAgICAgICBzMyA9IHUic3RpbGxva2F5OmJiYmJ4eFxyXG4iCisgICAgICAgIHM0ID0gdSJicm9rZW4hISEhYmFkYmFkXHJcbiIKKyAgICAgICAgczUgPSB1ImFnYWlub2theS5cclxuIgorCisgICAgICAgIHMgPSAoczErczIrczMrczQrczUpLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICBzdHJlYW0gPSBTdHJpbmdJTy5TdHJpbmdJTyhzKQorICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKHNlbGYuZW5jb2RpbmcpKHN0cmVhbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoKSwgczEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKCksIHMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZSgpLCBzMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoKSwgczQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKCksIHM1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZSgpLCB1IiIpCisKK2NsYXNzIFVURjMyVGVzdChSZWFkVGVzdCk6CisgICAgZW5jb2RpbmcgPSAidXRmLTMyIgorCisgICAgc3BhbWxlID0gKCdceGZmXHhmZVx4MDBceDAwJworICAgICAgICAgICAgICAnc1x4MDBceDAwXHgwMHBceDAwXHgwMFx4MDBhXHgwMFx4MDBceDAwbVx4MDBceDAwXHgwMCcKKyAgICAgICAgICAgICAgJ3NceDAwXHgwMFx4MDBwXHgwMFx4MDBceDAwYVx4MDBceDAwXHgwMG1ceDAwXHgwMFx4MDAnKQorICAgIHNwYW1iZSA9ICgnXHgwMFx4MDBceGZlXHhmZicKKyAgICAgICAgICAgICAgJ1x4MDBceDAwXHgwMHNceDAwXHgwMFx4MDBwXHgwMFx4MDBceDAwYVx4MDBceDAwXHgwMG0nCisgICAgICAgICAgICAgICdceDAwXHgwMFx4MDBzXHgwMFx4MDBceDAwcFx4MDBceDAwXHgwMGFceDAwXHgwMFx4MDBtJykKKworICAgIGRlZiB0ZXN0X29ubHlfb25lX2JvbShzZWxmKToKKyAgICAgICAgXyxfLHJlYWRlcix3cml0ZXIgPSBjb2RlY3MubG9va3VwKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICMgZW5jb2RlIHNvbWUgc3RyZWFtCisgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGYgPSB3cml0ZXIocykKKyAgICAgICAgZi53cml0ZSh1InNwYW0iKQorICAgICAgICBmLndyaXRlKHUic3BhbSIpCisgICAgICAgIGQgPSBzLmdldHZhbHVlKCkKKyAgICAgICAgIyBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGV4YWN0bHkgb25lIEJPTSBpbiBpdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZCA9PSBzZWxmLnNwYW1sZSBvciBkID09IHNlbGYuc3BhbWJlKQorICAgICAgICAjIHRyeSB0byByZWFkIGl0IGJhY2sKKyAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKGQpCisgICAgICAgIGYgPSByZWFkZXIocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgdSJzcGFtc3BhbSIpCisKKyAgICBkZWYgdGVzdF9iYWRib20oc2VsZik6CisgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTyg0KiJceGZmIikKKyAgICAgICAgZiA9IGNvZGVjcy5nZXRyZWFkZXIoc2VsZi5lbmNvZGluZykocykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBmLnJlYWQpCisKKyAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKDgqIlx4ZmYiKQorICAgICAgICBmID0gY29kZWNzLmdldHJlYWRlcihzZWxmLmVuY29kaW5nKShzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGYucmVhZCkKKworICAgIGRlZiB0ZXN0X3BhcnRpYWwoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcGFydGlhbCgKKyAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICB1IiIsICMgZmlyc3QgYnl0ZSBvZiBCT00gcmVhZAorICAgICAgICAgICAgICAgIHUiIiwgIyBzZWNvbmQgYnl0ZSBvZiBCT00gcmVhZAorICAgICAgICAgICAgICAgIHUiIiwgIyB0aGlyZCBieXRlIG9mIEJPTSByZWFkCisgICAgICAgICAgICAgICAgdSIiLCAjIGZvdXJ0aCBieXRlIG9mIEJPTSByZWFkID0+IGJ5dGVvcmRlciBrbm93bgorICAgICAgICAgICAgICAgIHUiIiwKKyAgICAgICAgICAgICAgICB1IiIsCisgICAgICAgICAgICAgICAgdSIiLAorICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZlxVMDAwMTAwMDAiLAorICAgICAgICAgICAgXQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9oYW5kbGVycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgodSdcdWZmZmQnLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2RlY29kZSgnXHgwMScsICdyZXBsYWNlJywgVHJ1ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHUnJywgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLnV0Zl8zMl9kZWNvZGUoJ1x4MDEnLCAnaWdub3JlJywgVHJ1ZSkpCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgY29kZWNzLnV0Zl8zMl9kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmIiwgInN0cmljdCIsIFRydWUpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTg5NDEoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzg5NDE6IGluc3VmZmljaWVudCByZXN1bHQgYWxsb2NhdGlvbiB3aGVuIGRlY29kaW5nIGludG8KKyAgICAgICAgIyBzdXJyb2dhdGUgcGFpcnMgb24gVUNTLTIgYnVpbGRzLgorICAgICAgICBlbmNvZGVkX2xlID0gJ1x4ZmZceGZlXHgwMFx4MDAnICsgJ1x4MDBceDAwXHgwMVx4MDAnICogMTAyNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDAwMCcgKiAxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy51dGZfMzJfZGVjb2RlKGVuY29kZWRfbGUpWzBdKQorICAgICAgICBlbmNvZGVkX2JlID0gJ1x4MDBceDAwXHhmZVx4ZmYnICsgJ1x4MDBceDAxXHgwMFx4MDAnICogMTAyNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDAwMCcgKiAxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy51dGZfMzJfZGVjb2RlKGVuY29kZWRfYmUpWzBdKQorCitjbGFzcyBVVEYzMkxFVGVzdChSZWFkVGVzdCk6CisgICAgZW5jb2RpbmcgPSAidXRmLTMyLWxlIgorCisgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKAorICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZlxVMDAwMTAwMDAiLAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIHUiIiwKKyAgICAgICAgICAgICAgICB1IiIsCisgICAgICAgICAgICAgICAgdSIiLAorICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZlxVMDAwMTAwMDAiLAorICAgICAgICAgICAgXQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJcVTAwMDEwMjAzIi5lbmNvZGUoc2VsZi5lbmNvZGluZyksICJceDAzXHgwMlx4MDFceDAwIikKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBjb2RlY3MudXRmXzMyX2xlX2RlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmYiLCAic3RyaWN0IiwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2lzc3VlODk0MShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjODk0MTogaW5zdWZmaWNpZW50IHJlc3VsdCBhbGxvY2F0aW9uIHdoZW4gZGVjb2RpbmcgaW50bworICAgICAgICAjIHN1cnJvZ2F0ZSBwYWlycyBvbiBVQ1MtMiBidWlsZHMuCisgICAgICAgIGVuY29kZWQgPSAnXHgwMFx4MDBceDAxXHgwMCcgKiAxMDI0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwMDAwJyAqIDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLnV0Zl8zMl9sZV9kZWNvZGUoZW5jb2RlZClbMF0pCisKK2NsYXNzIFVURjMyQkVUZXN0KFJlYWRUZXN0KToKKyAgICBlbmNvZGluZyA9ICJ1dGYtMzItYmUiCisKKyAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCisgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmXFUwMDAxMDAwMCIsCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgdSIiLAorICAgICAgICAgICAgICAgIHUiIiwKKyAgICAgICAgICAgICAgICB1IiIsCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmXFUwMDAxMDAwMCIsCisgICAgICAgICAgICBdCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IlxVMDAwMTAyMDMiLmVuY29kZShzZWxmLmVuY29kaW5nKSwgIlx4MDBceDAxXHgwMlx4MDMiKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGNvZGVjcy51dGZfMzJfYmVfZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZiIsICJzdHJpY3QiLCBUcnVlKQorCisgICAgZGVmIHRlc3RfaXNzdWU4OTQxKHNlbGYpOgorICAgICAgICAjIElzc3VlICM4OTQxOiBpbnN1ZmZpY2llbnQgcmVzdWx0IGFsbG9jYXRpb24gd2hlbiBkZWNvZGluZyBpbnRvCisgICAgICAgICMgc3Vycm9nYXRlIHBhaXJzIG9uIFVDUy0yIGJ1aWxkcy4KKyAgICAgICAgZW5jb2RlZCA9ICdceDAwXHgwMVx4MDBceDAwJyAqIDEwMjQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTAwMDAnICogMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2JlX2RlY29kZShlbmNvZGVkKVswXSkKKworCitjbGFzcyBVVEYxNlRlc3QoUmVhZFRlc3QpOgorICAgIGVuY29kaW5nID0gInV0Zi0xNiIKKworICAgIHNwYW1sZSA9ICdceGZmXHhmZXNceDAwcFx4MDBhXHgwMG1ceDAwc1x4MDBwXHgwMGFceDAwbVx4MDAnCisgICAgc3BhbWJlID0gJ1x4ZmVceGZmXHgwMHNceDAwcFx4MDBhXHgwMG1ceDAwc1x4MDBwXHgwMGFceDAwbScKKworICAgIGRlZiB0ZXN0X29ubHlfb25lX2JvbShzZWxmKToKKyAgICAgICAgXyxfLHJlYWRlcix3cml0ZXIgPSBjb2RlY3MubG9va3VwKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICMgZW5jb2RlIHNvbWUgc3RyZWFtCisgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGYgPSB3cml0ZXIocykKKyAgICAgICAgZi53cml0ZSh1InNwYW0iKQorICAgICAgICBmLndyaXRlKHUic3BhbSIpCisgICAgICAgIGQgPSBzLmdldHZhbHVlKCkKKyAgICAgICAgIyBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGV4YWN0bHkgb25lIEJPTSBpbiBpdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZCA9PSBzZWxmLnNwYW1sZSBvciBkID09IHNlbGYuc3BhbWJlKQorICAgICAgICAjIHRyeSB0byByZWFkIGl0IGJhY2sKKyAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKGQpCisgICAgICAgIGYgPSByZWFkZXIocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgdSJzcGFtc3BhbSIpCisKKyAgICBkZWYgdGVzdF9iYWRib20oc2VsZik6CisgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygiXHhmZlx4ZmYiKQorICAgICAgICBmID0gY29kZWNzLmdldHJlYWRlcihzZWxmLmVuY29kaW5nKShzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGYucmVhZCkKKworICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oIlx4ZmZceGZmXHhmZlx4ZmYiKQorICAgICAgICBmID0gY29kZWNzLmdldHJlYWRlcihzZWxmLmVuY29kaW5nKShzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGYucmVhZCkKKworICAgIGRlZiB0ZXN0X3BhcnRpYWwoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcGFydGlhbCgKKyAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICB1IiIsICMgZmlyc3QgYnl0ZSBvZiBCT00gcmVhZAorICAgICAgICAgICAgICAgIHUiIiwgIyBzZWNvbmQgYnl0ZSBvZiBCT00gcmVhZCA9PiBieXRlb3JkZXIga25vd24KKyAgICAgICAgICAgICAgICB1IiIsCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfaGFuZGxlcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHUnXHVmZmZkJywgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLnV0Zl8xNl9kZWNvZGUoJ1x4MDEnLCAncmVwbGFjZScsIFRydWUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh1JycsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy51dGZfMTZfZGVjb2RlKCdceDAxJywgJ2lnbm9yZScsIFRydWUpKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGNvZGVjcy51dGZfMTZfZGVjb2RlLCAiXHhmZiIsICJzdHJpY3QiLCBUcnVlKQorCisgICAgZGVmIHRlc3RfYnVnNjkxMjkxKHNlbGYpOgorICAgICAgICAjIEZpbGVzIGFyZSBhbHdheXMgb3BlbmVkIGluIGJpbmFyeSBtb2RlLCBldmVuIGlmIG5vIGJpbmFyeSBtb2RlIHdhcworICAgICAgICAjIHNwZWNpZmllZC4gIFRoaXMgbWVhbnMgdGhhdCBubyBhdXRvbWF0aWMgY29udmVyc2lvbiBvZiAnXG4nIGlzIGRvbmUKKyAgICAgICAgIyBvbiByZWFkaW5nIGFuZCB3cml0aW5nLgorICAgICAgICBzMSA9IHUnSGVsbG9cclxud29ybGRcclxuJworCisgICAgICAgIHMgPSBzMS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3Rfc3VwcG9ydC51bmxpbmssIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAnd2InKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKHMpCisgICAgICAgIHdpdGggY29kZWNzLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ1UnLCBlbmNvZGluZz1zZWxmLmVuY29kaW5nKSBhcyByZWFkZXI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkKCksIHMxKQorCitjbGFzcyBVVEYxNkxFVGVzdChSZWFkVGVzdCk6CisgICAgZW5jb2RpbmcgPSAidXRmLTE2LWxlIgorCisgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKAorICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZlxVMDAwMTAwMDAiLAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIHUiIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZlxVMDAwMTAwMDAiLAorICAgICAgICAgICAgXQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgICAgKGInXHhmZicsIHUnXHVmZmZkJyksCisgICAgICAgICAgICAoYidBXHgwMFonLCB1J0FcdWZmZmQnKSwKKyAgICAgICAgICAgIChiJ0FceDAwQlx4MDBDXHgwMERceDAwWicsIHUnQUJDRFx1ZmZmZCcpLAorICAgICAgICAgICAgKGInXHgwMFx4ZDgnLCB1J1x1ZmZmZCcpLAorICAgICAgICAgICAgKGInXHgwMFx4ZDhBJywgdSdcdWZmZmQnKSwKKyAgICAgICAgICAgIChiJ1x4MDBceGQ4QVx4MDAnLCB1J1x1ZmZmZEEnKSwKKyAgICAgICAgICAgIChiJ1x4MDBceGRjQVx4MDAnLCB1J1x1ZmZmZEEnKSwKKyAgICAgICAgXQorICAgICAgICBmb3IgcmF3LCBleHBlY3RlZCBpbiB0ZXN0czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgY29kZWNzLnV0Zl8xNl9sZV9kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXcsICdzdHJpY3QnLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXcuZGVjb2RlKCd1dGYtMTZsZScsICdyZXBsYWNlJyksIGV4cGVjdGVkKQorCitjbGFzcyBVVEYxNkJFVGVzdChSZWFkVGVzdCk6CisgICAgZW5jb2RpbmcgPSAidXRmLTE2LWJlIgorCisgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKAorICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZlxVMDAwMTAwMDAiLAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIHUiIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZlxVMDAwMTAwMDAiLAorICAgICAgICAgICAgXQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgICAgKGInXHhmZicsIHUnXHVmZmZkJyksCisgICAgICAgICAgICAoYidceDAwQVx4ZmYnLCB1J0FcdWZmZmQnKSwKKyAgICAgICAgICAgIChiJ1x4MDBBXHgwMEJceDAwQ1x4MDBEWicsIHUnQUJDRFx1ZmZmZCcpLAorICAgICAgICAgICAgKGInXHhkOFx4MDAnLCB1J1x1ZmZmZCcpLAorICAgICAgICAgICAgKGInXHhkOFx4MDBceGRjJywgdSdcdWZmZmQnKSwKKyAgICAgICAgICAgIChiJ1x4ZDhceDAwXHgwMEEnLCB1J1x1ZmZmZEEnKSwKKyAgICAgICAgICAgIChiJ1x4ZGNceDAwXHgwMEEnLCB1J1x1ZmZmZEEnKSwKKyAgICAgICAgXQorICAgICAgICBmb3IgcmF3LCBleHBlY3RlZCBpbiB0ZXN0czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgY29kZWNzLnV0Zl8xNl9iZV9kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXcsICdzdHJpY3QnLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXcuZGVjb2RlKCd1dGYtMTZiZScsICdyZXBsYWNlJyksIGV4cGVjdGVkKQorCitjbGFzcyBVVEY4VGVzdChSZWFkVGVzdCk6CisgICAgZW5jb2RpbmcgPSAidXRmLTgiCisKKyAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCisgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmXHUwODAwXHVmZmZmXFUwMDAxMDAwMCIsCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmZcVTAwMDEwMDAwIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCitjbGFzcyBVVEY3VGVzdChSZWFkVGVzdCk6CisgICAgZW5jb2RpbmcgPSAidXRmLTciCisKKyAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCisgICAgICAgICAgICB1ImErLWIiLAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIHUiYSIsCisgICAgICAgICAgICAgICAgdSJhIiwKKyAgICAgICAgICAgICAgICB1ImErIiwKKyAgICAgICAgICAgICAgICB1ImErLSIsCisgICAgICAgICAgICAgICAgdSJhKy1iIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCitjbGFzcyBVVEYxNkV4VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgY29kZWNzLnV0Zl8xNl9leF9kZWNvZGUsICJceGZmIiwgInN0cmljdCIsIDAsIFRydWUpCisKKyAgICBkZWYgdGVzdF9iYWRfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MudXRmXzE2X2V4X2RlY29kZSkKKworY2xhc3MgUmVhZEJ1ZmZlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYXJyYXkoc2VsZik6CisgICAgICAgIGltcG9ydCBhcnJheQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLnJlYWRidWZmZXJfZW5jb2RlKGFycmF5LmFycmF5KCJjIiwgInNwYW0iKSksCisgICAgICAgICAgICAoInNwYW0iLCA0KQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MucmVhZGJ1ZmZlcl9lbmNvZGUoIiIpLCAoIiIsIDApKQorCisgICAgZGVmIHRlc3RfYmFkX2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLnJlYWRidWZmZXJfZW5jb2RlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5yZWFkYnVmZmVyX2VuY29kZSwgNDIpCisKK2NsYXNzIENoYXJCdWZmZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MuY2hhcmJ1ZmZlcl9lbmNvZGUoInNwYW0iKSwgKCJzcGFtIiwgNCkpCisKKyAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MuY2hhcmJ1ZmZlcl9lbmNvZGUoIiIpLCAoIiIsIDApKQorCisgICAgZGVmIHRlc3RfYmFkX2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLmNoYXJidWZmZXJfZW5jb2RlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5jaGFyYnVmZmVyX2VuY29kZSwgNDIpCisKK2NsYXNzIFVURjhTaWdUZXN0KFJlYWRUZXN0KToKKyAgICBlbmNvZGluZyA9ICJ1dGYtOC1zaWciCisKKyAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCisgICAgICAgICAgICB1Ilx1ZmVmZlx4MDBceGZmXHUwN2ZmXHUwODAwXHVmZmZmXFUwMDAxMDAwMCIsCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgdSIiLAorICAgICAgICAgICAgICAgIHUiIiwKKyAgICAgICAgICAgICAgICB1IiIsICMgRmlyc3QgQk9NIGhhcyBiZWVuIHJlYWQgYW5kIHNraXBwZWQKKyAgICAgICAgICAgICAgICB1IiIsCisgICAgICAgICAgICAgICAgdSIiLAorICAgICAgICAgICAgICAgIHUiXHVmZWZmIiwgIyBTZWNvbmQgQk9NIGhhcyBiZWVuIHJlYWQgYW5kIGVtaXR0ZWQKKyAgICAgICAgICAgICAgICB1Ilx1ZmVmZlx4MDAiLCAjICJceDAwIiByZWFkIGFuZCBlbWl0dGVkCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwIiwgIyBGaXJzdCBieXRlIG9mIGVuY29kZWQgdSJceGZmIiByZWFkCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZiIsICMgU2Vjb25kIGJ5dGUgb2YgZW5jb2RlZCB1Ilx4ZmYiIHJlYWQKKyAgICAgICAgICAgICAgICB1Ilx1ZmVmZlx4MDBceGZmIiwgIyBGaXJzdCBieXRlIG9mIGVuY29kZWQgdSJcdTA3ZmYiIHJlYWQKKyAgICAgICAgICAgICAgICB1Ilx1ZmVmZlx4MDBceGZmXHUwN2ZmIiwgIyBTZWNvbmQgYnl0ZSBvZiBlbmNvZGVkIHUiXHUwN2ZmIiByZWFkCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZiIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZiIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMCIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMCIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMCIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZlxVMDAwMTAwMDAiLAorICAgICAgICAgICAgXQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9idWcxNjAxNTAxKHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyAjMTYwMTUwMTogY2hlY2sgdGhhdCB0aGUgY29kZWMgd29ya3Mgd2l0aCBhIGJ1ZmZlcgorICAgICAgICB1bmljb2RlKCJceGVmXHhiYlx4YmYiLCAidXRmLTgtc2lnIikKKworICAgIGRlZiB0ZXN0X2JvbShzZWxmKToKKyAgICAgICAgZCA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoInV0Zi04LXNpZyIpKCkKKyAgICAgICAgcyA9IHUic3BhbSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmRlY29kZShzLmVuY29kZSgidXRmLTgtc2lnIikpLCBzKQorCisgICAgZGVmIHRlc3Rfc3RyZWFtX2JvbShzZWxmKToKKyAgICAgICAgdW5pc3RyaW5nID0gdSJBQkNcdTAwQTFcdTIyMDBYWVoiCisgICAgICAgIGJ5dGVzdHJpbmcgPSBjb2RlY3MuQk9NX1VURjggKyAiQUJDXHhDMlx4QTFceEUyXHg4OFx4ODBYWVoiCisKKyAgICAgICAgcmVhZGVyID0gY29kZWNzLmdldHJlYWRlcigidXRmLTgtc2lnIikKKyAgICAgICAgZm9yIHNpemVoaW50IGluIFtOb25lXSArIHJhbmdlKDEsIDExKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFs2NCwgMTI4LCAyNTYsIDUxMiwgMTAyNF06CisgICAgICAgICAgICBpc3RyZWFtID0gcmVhZGVyKFN0cmluZ0lPLlN0cmluZ0lPKGJ5dGVzdHJpbmcpKQorICAgICAgICAgICAgb3N0cmVhbSA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgaWYgc2l6ZWhpbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpc3RyZWFtLnJlYWQoc2l6ZWhpbnQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGlzdHJlYW0ucmVhZCgpCisKKyAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKGRhdGEpCisKKyAgICAgICAgICAgIGdvdCA9IG9zdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIHVuaXN0cmluZykKKworICAgIGRlZiB0ZXN0X3N0cmVhbV9iYXJlKHNlbGYpOgorICAgICAgICB1bmlzdHJpbmcgPSB1IkFCQ1x1MDBBMVx1MjIwMFhZWiIKKyAgICAgICAgYnl0ZXN0cmluZyA9ICJBQkNceEMyXHhBMVx4RTJceDg4XHg4MFhZWiIKKworICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCJ1dGYtOC1zaWciKQorICAgICAgICBmb3Igc2l6ZWhpbnQgaW4gW05vbmVdICsgcmFuZ2UoMSwgMTEpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWzY0LCAxMjgsIDI1NiwgNTEyLCAxMDI0XToKKyAgICAgICAgICAgIGlzdHJlYW0gPSByZWFkZXIoU3RyaW5nSU8uU3RyaW5nSU8oYnl0ZXN0cmluZykpCisgICAgICAgICAgICBvc3RyZWFtID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBpZiBzaXplaGludCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGlzdHJlYW0ucmVhZChzaXplaGludCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gaXN0cmVhbS5yZWFkKCkKKworICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG9zdHJlYW0ud3JpdGUoZGF0YSkKKworICAgICAgICAgICAgZ290ID0gb3N0cmVhbS5nZXR2YWx1ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgdW5pc3RyaW5nKQorCitjbGFzcyBFc2NhcGVEZWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MuZXNjYXBlX2RlY29kZSgiIiksICgiIiwgMCkpCisKKyAgICBkZWYgdGVzdF9yYXcoc2VsZik6CisgICAgICAgIGRlY29kZSA9IGNvZGVjcy5lc2NhcGVfZGVjb2RlCisgICAgICAgIGZvciBiIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBiID0gY2hyKGIpCisgICAgICAgICAgICBpZiBiICE9ICdcXCc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoYiArICcwJyksIChiICsgJzAnLCAyKSkKKworICAgIGRlZiB0ZXN0X2VzY2FwZShzZWxmKToKKyAgICAgICAgZGVjb2RlID0gY29kZWNzLmVzY2FwZV9kZWNvZGUKKyAgICAgICAgY2hlY2sgPSBjb2RpbmdfY2hlY2tlcihzZWxmLCBkZWNvZGUpCisgICAgICAgIGNoZWNrKGIiW1xcXG5dIiwgYiJbXSIpCisgICAgICAgIGNoZWNrKGJyJ1tcIl0nLCBiJ1siXScpCisgICAgICAgIGNoZWNrKGJyIltcJ10iLCBiIlsnXSIpCisgICAgICAgIGNoZWNrKGJyIltcXF0iLCBiciJbXF0iKQorICAgICAgICBjaGVjayhiciJbXGFdIiwgYiJbXHgwN10iKQorICAgICAgICBjaGVjayhiciJbXGJdIiwgYiJbXHgwOF0iKQorICAgICAgICBjaGVjayhiciJbXHRdIiwgYiJbXHgwOV0iKQorICAgICAgICBjaGVjayhiciJbXG5dIiwgYiJbXHgwYV0iKQorICAgICAgICBjaGVjayhiciJbXHZdIiwgYiJbXHgwYl0iKQorICAgICAgICBjaGVjayhiciJbXGZdIiwgYiJbXHgwY10iKQorICAgICAgICBjaGVjayhiciJbXHJdIiwgYiJbXHgwZF0iKQorICAgICAgICBjaGVjayhiciJbXDddIiwgYiJbXHgwN10iKQorICAgICAgICBjaGVjayhiciJbXDhdIiwgYnIiW1w4XSIpCisgICAgICAgIGNoZWNrKGJyIltcNzhdIiwgYiJbXHgwNzhdIikKKyAgICAgICAgY2hlY2soYnIiW1w0MV0iLCBiIlshXSIpCisgICAgICAgIGNoZWNrKGJyIltcNDE4XSIsIGIiWyE4XSIpCisgICAgICAgIGNoZWNrKGJyIltcMTAxXSIsIGIiW0FdIikKKyAgICAgICAgY2hlY2soYnIiW1wxMDEwXSIsIGIiW0EwXSIpCisgICAgICAgIGNoZWNrKGJyIltcNTAxXSIsIGIiW0FdIikKKyAgICAgICAgY2hlY2soYnIiW1x4NDFdIiwgYiJbQV0iKQorICAgICAgICBjaGVjayhiciJbXFg0MV0iLCBiciJbXFg0MV0iKQorICAgICAgICBjaGVjayhiciJbXHg0MTBdIiwgYiJbQTBdIikKKyAgICAgICAgZm9yIGIgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgIGIgPSBjaHIoYikKKyAgICAgICAgICAgIGlmIGIgbm90IGluICdcbiJcJ1xcYWJ0bnZmcjAxMjM0NTY3eCc6CisgICAgICAgICAgICAgICAgY2hlY2soJ1xcJyArIGIsICdcXCcgKyBiKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBkZWNvZGUgPSBjb2RlY3MuZXNjYXBlX2RlY29kZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkZWNvZGUsIGJyIlx4IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZGVjb2RlLCBiciJbXHhdIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoYnIiW1x4XVx4IiwgImlnbm9yZSIpLCAoYiJbXSIsIDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShiciJbXHhdXHgiLCAicmVwbGFjZSIpLCAoYiJbP10/IiwgNikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGRlY29kZSwgYnIiXHgwIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZGVjb2RlLCBiciJbXHgwXSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGJyIltceDBdXHgwIiwgImlnbm9yZSIpLCAoYiJbXSIsIDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShiciJbXHgwXVx4MCIsICJyZXBsYWNlIiksIChiIls/XT8iLCA4KSkKKworY2xhc3MgUmVjb2RpbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9yZWNvZGluZyhzZWxmKToKKyAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgZjIgPSBjb2RlY3MuRW5jb2RlZEZpbGUoZiwgInVuaWNvZGVfaW50ZXJuYWwiLCAidXRmLTgiKQorICAgICAgICBmMi53cml0ZSh1ImEiKQorICAgICAgICBmMi5jbG9zZSgpCisgICAgICAgICMgUHl0aG9uIHVzZWQgdG8gY3Jhc2ggb24gdGhpcyBhdCBleGl0IGJlY2F1c2Ugb2YgYSByZWZjb3VudAorICAgICAgICAjIGJ1ZyBpbiBfY29kZWNzbW9kdWxlLmMKKworIyBGcm9tIFJGQyAzNDkyCitwdW55Y29kZV90ZXN0Y2FzZXMgPSBbCisgICAgIyBBIEFyYWJpYyAoRWd5cHRpYW4pOgorICAgICh1Ilx1MDY0NFx1MDY0QVx1MDY0N1x1MDY0NVx1MDYyN1x1MDYyOFx1MDYyQVx1MDY0M1x1MDY0NCIKKyAgICAgdSJcdTA2NDVcdTA2NDhcdTA2MzRcdTA2MzlcdTA2MzFcdTA2MjhcdTA2NEFcdTA2MUYiLAorICAgICAiZWdicGRhajZidTRieGZnZWhmdnd4biIpLAorICAgICMgQiBDaGluZXNlIChzaW1wbGlmaWVkKToKKyAgICAodSJcdTRFRDZcdTRFRUNcdTRFM0FcdTRFQzBcdTRFNDhcdTRFMERcdThCRjRcdTRFMkRcdTY1ODciLAorICAgICAiaWhxd2NyYjRjdjhhOGRxZzA1NnBxanllIiksCisgICAgIyBDIENoaW5lc2UgKHRyYWRpdGlvbmFsKToKKyAgICAodSJcdTRFRDZcdTUwMTFcdTcyMzJcdTRFQzBcdTlFQkRcdTRFMERcdThBQUFcdTRFMkRcdTY1ODciLAorICAgICAiaWhxd2N0dnpjOTFmNjU5ZHJzczN4OGJvMHliIiksCisgICAgIyBEIEN6ZWNoOiBQcm88Y2Nhcm9uPnByb3N0PGVjYXJvbj5uZW1sdXY8aWFjdXRlPjxjY2Fyb24+ZXNreQorICAgICh1Ilx1MDA1MFx1MDA3Mlx1MDA2Rlx1MDEwRFx1MDA3MFx1MDA3Mlx1MDA2Rlx1MDA3M1x1MDA3NCIKKyAgICAgdSJcdTAxMUJcdTAwNkVcdTAwNjVcdTAwNkRcdTAwNkNcdTAwNzVcdTAwNzZcdTAwRURcdTAxMEQiCisgICAgIHUiXHUwMDY1XHUwMDczXHUwMDZCXHUwMDc5IiwKKyAgICAgIlByb3Byb3N0bmVtbHV2ZXNreS11eWIyNGRtYTQxYSIpLAorICAgICMgRSBIZWJyZXc6CisgICAgKHUiXHUwNURDXHUwNURFXHUwNUQ0XHUwNUQ0XHUwNUREXHUwNUU0XHUwNUU5XHUwNUQ1XHUwNUQ4IgorICAgICB1Ilx1MDVEQ1x1MDVEMFx1MDVERVx1MDVEM1x1MDVEMVx1MDVFOFx1MDVEOVx1MDVERFx1MDVFMiIKKyAgICAgdSJcdTA1RDFcdTA1RThcdTA1RDlcdTA1RUEiLAorICAgICAiNGRiY2FnZGFoeW1ieGVraGVoNmUwYTdmZWkwYiIpLAorICAgICMgRiBIaW5kaSAoRGV2YW5hZ2FyaSk6CisgICAgKHUiXHUwOTJGXHUwOTM5XHUwOTMyXHUwOTRCXHUwOTE3XHUwOTM5XHUwOTNGXHUwOTI4XHUwOTREIgorICAgIHUiXHUwOTI2XHUwOTQwXHUwOTE1XHUwOTREXHUwOTJGXHUwOTRCXHUwOTAyXHUwOTI4XHUwOTM5IgorICAgIHUiXHUwOTQwXHUwOTAyXHUwOTJDXHUwOTRCXHUwOTMyXHUwOTM4XHUwOTE1XHUwOTI0XHUwOTQ3IgorICAgIHUiXHUwOTM5XHUwOTQ4XHUwOTAyIiwKKyAgICAiaTFiYWE3ZWNpOWdscmQ5YjJhZTFiajBoZmNnZzZpeWFmOG8wYTFkaWcwY2QiKSwKKworICAgICMoRykgSmFwYW5lc2UgKGthbmppIGFuZCBoaXJhZ2FuYSk6CisgICAgKHUiXHUzMDZBXHUzMDVDXHUzMDdGXHUzMDkzXHUzMDZBXHU2NUU1XHU2NzJDXHU4QTlFXHUzMDkyIgorICAgIHUiXHU4QTcxXHUzMDU3XHUzMDY2XHUzMDRGXHUzMDhDXHUzMDZBXHUzMDQ0XHUzMDZFXHUzMDRCIiwKKyAgICAgIm44am9rNWF5NWR6YWJkNWJ5bTlmMGNtNTY4NXJyamV0cjZwZHhhIiksCisKKyAgICAjIChIKSBLb3JlYW4gKEhhbmd1bCBzeWxsYWJsZXMpOgorICAgICh1Ilx1QzEzOFx1QUNDNFx1Qzc1OFx1QkFBOFx1QjRFMFx1QzBBQ1x1Qjc4Q1x1QjRFNFx1Qzc3NCIKKyAgICAgdSJcdUQ1NUNcdUFENkRcdUM1QjRcdUI5N0NcdUM3NzRcdUQ1NzRcdUQ1NUNcdUIyRTRcdUJBNzQiCisgICAgIHUiXHVDNUJDXHVCOUM4XHVCMDk4XHVDODhCXHVDNzQ0XHVBRTRDIiwKKyAgICAgIjk4OWFvbXN2aTVlODNkYjFkMmEzNTVjdjFlMHZhazFkd3J2OTNkNXhiaDE1YTBkdDMwYTVqIgorICAgICAicHNkODc5Y2NtNmZlYTk4YyIpLAorCisgICAgIyAoSSkgUnVzc2lhbiAoQ3lyaWxsaWMpOgorICAgICh1Ilx1MDQzRlx1MDQzRVx1MDQ0N1x1MDQzNVx1MDQzQ1x1MDQ0M1x1MDQzNlx1MDQzNVx1MDQzRSIKKyAgICAgdSJcdTA0M0RcdTA0MzhcdTA0M0RcdTA0MzVcdTA0MzNcdTA0M0VcdTA0MzJcdTA0M0VcdTA0NDAiCisgICAgIHUiXHUwNDRGXHUwNDQyXHUwNDNGXHUwNDNFXHUwNDQwXHUwNDQzXHUwNDQxXHUwNDQxXHUwNDNBIgorICAgICB1Ilx1MDQzOCIsCisgICAgICJiMWFiZmFhZXBkcm5uYmdlZmJhRG90Y3dhdG1xMmc0bCIpLAorCisgICAgIyAoSikgU3BhbmlzaDogUG9ycXU8ZWFjdXRlPm5vcHVlZGVuc2ltcGxlbWVudGVoYWJsYXJlbkVzcGE8bnRpbGRlPm9sCisgICAgKHUiXHUwMDUwXHUwMDZGXHUwMDcyXHUwMDcxXHUwMDc1XHUwMEU5XHUwMDZFXHUwMDZGXHUwMDcwIgorICAgICB1Ilx1MDA3NVx1MDA2NVx1MDA2NFx1MDA2NVx1MDA2RVx1MDA3M1x1MDA2OVx1MDA2RFx1MDA3MCIKKyAgICAgdSJcdTAwNkNcdTAwNjVcdTAwNkRcdTAwNjVcdTAwNkVcdTAwNzRcdTAwNjVcdTAwNjhcdTAwNjEiCisgICAgIHUiXHUwMDYyXHUwMDZDXHUwMDYxXHUwMDcyXHUwMDY1XHUwMDZFXHUwMDQ1XHUwMDczXHUwMDcwIgorICAgICB1Ilx1MDA2MVx1MDBGMVx1MDA2Rlx1MDA2QyIsCisgICAgICJQb3JxdW5vcHVlZGVuc2ltcGxlbWVudGVoYWJsYXJlbkVzcGFvbC1mbWQ1NmEiKSwKKworICAgICMgKEspIFZpZXRuYW1lc2U6CisgICAgIyAgVDxhZG90YmVsb3c+aXNhb2g8b2RvdGJlbG93PmtoPG9jaXJjPm5ndGg8ZWNpcmNob29rYWJvdmU+Y2hcCisgICAgIyAgIDxpaG9va2Fib3ZlPm48b2FjdXRlPml0aTxlY2lyY2FjdXRlPm5nVmk8ZWNpcmNkb3RiZWxvdz50CisgICAgKHUiXHUwMDU0XHUxRUExXHUwMDY5XHUwMDczXHUwMDYxXHUwMDZGXHUwMDY4XHUxRUNEXHUwMDZCIgorICAgICB1Ilx1MDA2OFx1MDBGNFx1MDA2RVx1MDA2N1x1MDA3NFx1MDA2OFx1MUVDM1x1MDA2M1x1MDA2OCIKKyAgICAgdSJcdTFFQzlcdTAwNkVcdTAwRjNcdTAwNjlcdTAwNzRcdTAwNjlcdTFFQkZcdTAwNkVcdTAwNjciCisgICAgIHUiXHUwMDU2XHUwMDY5XHUxRUM3XHUwMDc0IiwKKyAgICAgIlRpc2FvaGtobmd0aGNobml0aW5nVml0LWtqY3I4MjY4cXl4YWZkMmYxYjlnIiksCisKKyAgICAjKEwpIDM8bmVuPkI8Z3VtaT48a2lucGFjaGk+PHNlbnNlaT4KKyAgICAodSJcdTAwMzNcdTVFNzRcdTAwNDJcdTdENDRcdTkxRDFcdTUxNkJcdTUxNDhcdTc1MUYiLAorICAgICAiM0Itd3c0YzVlMTgwZTU3NWE2NWxzeTJiIiksCisKKyAgICAjIChNKSA8YW11cm8+PG5hbWllPi13aXRoLVNVUEVSLU1PTktFWVMKKyAgICAodSJcdTVCODlcdTVCQTRcdTU5NDhcdTdGOEVcdTYwNzVcdTAwMkRcdTAwNzdcdTAwNjlcdTAwNzQiCisgICAgIHUiXHUwMDY4XHUwMDJEXHUwMDUzXHUwMDU1XHUwMDUwXHUwMDQ1XHUwMDUyXHUwMDJEXHUwMDREIgorICAgICB1Ilx1MDA0Rlx1MDA0RVx1MDA0Qlx1MDA0NVx1MDA1OVx1MDA1MyIsCisgICAgICItd2l0aC1TVVBFUi1NT05LRVlTLXBjNThhZzgwYThxYWkwMGc3bjluIiksCisKKyAgICAjIChOKSBIZWxsby1Bbm90aGVyLVdheS08c29yZXpvcmU+PG5vPjxiYXNobz4KKyAgICAodSJcdTAwNDhcdTAwNjVcdTAwNkNcdTAwNkNcdTAwNkZcdTAwMkRcdTAwNDFcdTAwNkVcdTAwNkYiCisgICAgIHUiXHUwMDc0XHUwMDY4XHUwMDY1XHUwMDcyXHUwMDJEXHUwMDU3XHUwMDYxXHUwMDc5XHUwMDJEIgorICAgICB1Ilx1MzA1RFx1MzA4Q1x1MzA1RVx1MzA4Q1x1MzA2RVx1NTgzNFx1NjI0MCIsCisgICAgICJIZWxsby1Bbm90aGVyLVdheS0tZmM0cXVhMDVhdXdiMzY3NHZmcjBiIiksCisKKyAgICAjIChPKSA8aGl0b3RzdT48eWFuZT48bm8+PHNoaXRhPjIKKyAgICAodSJcdTMwNzJcdTMwNjhcdTMwNjRcdTVDNEJcdTY4MzlcdTMwNkVcdTRFMEJcdTAwMzIiLAorICAgICAiMi11OXRsenI5NzU2YnQzdWMwdiIpLAorCisgICAgIyAoUCkgTWFqaTxkZT5Lb2k8c3VydT41PGJ5b3U+PG1hZT4KKyAgICAodSJcdTAwNERcdTAwNjFcdTAwNkFcdTAwNjlcdTMwNjdcdTAwNEJcdTAwNkZcdTAwNjlcdTMwNTkiCisgICAgIHUiXHUzMDhCXHUwMDM1XHU3OUQyXHU1MjREIiwKKyAgICAgIk1hamlLb2k1LTc4M2d1ZTZxejA3NWF6bTVlIiksCisKKyAgICAgIyAoUSkgPHBhZmlpPmRlPHJ1bmJhPgorICAgICh1Ilx1MzBEMVx1MzBENVx1MzBBM1x1MzBGQ1x1MDA2NFx1MDA2NVx1MzBFQlx1MzBGM1x1MzBEMCIsCisgICAgICJkZS1qZzRhdmhieTFub2MwZCIpLAorCisgICAgIyAoUikgPHNvbm8+PHN1cGlpZG8+PGRlPgorICAgICh1Ilx1MzA1RFx1MzA2RVx1MzBCOVx1MzBENFx1MzBGQ1x1MzBDOVx1MzA2NyIsCisgICAgICJkOWp1YXU0MWF3Y3pjenAiKSwKKworICAgICMgKFMpIC0+ICQxLjAwIDwtCisgICAgKHUiXHUwMDJEXHUwMDNFXHUwMDIwXHUwMDI0XHUwMDMxXHUwMDJFXHUwMDMwXHUwMDMwXHUwMDIwIgorICAgICB1Ilx1MDAzQ1x1MDAyRCIsCisgICAgICItPiAkMS4wMCA8LS0iKQorICAgIF0KKworZm9yIGkgaW4gcHVueWNvZGVfdGVzdGNhc2VzOgorICAgIGlmIGxlbihpKSE9MjoKKyAgICAgICAgcHJpbnQgcmVwcihpKQorCitjbGFzcyBQdW55Y29kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgZm9yIHVuaSwgcHVueSBpbiBwdW55Y29kZV90ZXN0Y2FzZXM6CisgICAgICAgICAgICAjIE5lZWQgdG8gY29udmVydCBib3RoIHN0cmluZ3MgdG8gbG93ZXIgY2FzZSwgc2luY2UKKyAgICAgICAgICAgICMgc29tZSBvZiB0aGUgZXh0ZW5kZWQgZW5jb2RpbmdzIHVzZSB1cHBlciBjYXNlLCBidXQgb3VyCisgICAgICAgICAgICAjIGNvZGUgcHJvZHVjZXMgb25seSBsb3dlciBjYXNlLiBDb252ZXJ0aW5nIGp1c3QgcHVueSB0bworICAgICAgICAgICAgIyBsb3dlciBpcyBhbHNvIGluc3VmZmljaWVudCwgc2luY2Ugc29tZSBvZiB0aGUgaW5wdXQgY2hhcmFjdGVycworICAgICAgICAgICAgIyBhcmUgdXBwZXIgY2FzZS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pLmVuY29kZSgicHVueWNvZGUiKS5sb3dlcigpLCBwdW55Lmxvd2VyKCkpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGZvciB1bmksIHB1bnkgaW4gcHVueWNvZGVfdGVzdGNhc2VzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmksIHB1bnkuZGVjb2RlKCJwdW55Y29kZSIpKQorCitjbGFzcyBVbmljb2RlSW50ZXJuYWxUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9idWcxMjUxMzAwKHNlbGYpOgorICAgICAgICAjIERlY29kaW5nIHdpdGggdW5pY29kZV9pbnRlcm5hbCB1c2VkIHRvIG5vdCBjb3JyZWN0bHkgaGFuZGxlICJjb2RlCisgICAgICAgICMgcG9pbnRzIiBhYm92ZSAweDEwZmZmZiBvbiBVQ1MtNCBidWlsZHMuCisgICAgICAgIGlmIHN5cy5tYXh1bmljb2RlID4gMHhmZmZmOgorICAgICAgICAgICAgb2sgPSBbCisgICAgICAgICAgICAgICAgKCJceDAwXHgxMFx4ZmZceGZmIiwgdSJcVTAwMTBmZmZmIiksCisgICAgICAgICAgICAgICAgKCJceDAwXHgwMFx4MDFceDAxIiwgdSJcVTAwMDAwMTAxIiksCisgICAgICAgICAgICAgICAgKCIiLCB1IiIpLAorICAgICAgICAgICAgXQorICAgICAgICAgICAgbm90X29rID0gWworICAgICAgICAgICAgICAgICJceDdmXHhmZlx4ZmZceGZmIiwKKyAgICAgICAgICAgICAgICAiXHg4MFx4MDBceDAwXHgwMCIsCisgICAgICAgICAgICAgICAgIlx4ODFceDAwXHgwMFx4MDAiLAorICAgICAgICAgICAgICAgICJceDAwIiwKKyAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAwXHgwMFx4MDAiLAorICAgICAgICAgICAgXQorICAgICAgICAgICAgZm9yIGludGVybmFsLCB1bmkgaW4gb2s6CisgICAgICAgICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgPSAiIi5qb2luKHJldmVyc2VkKGludGVybmFsKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaSwgaW50ZXJuYWwuZGVjb2RlKCJ1bmljb2RlX2ludGVybmFsIikpCisgICAgICAgICAgICBmb3IgaW50ZXJuYWwgaW4gbm90X29rOgorICAgICAgICAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICAgICAgICAgIGludGVybmFsID0gIiIuam9pbihyZXZlcnNlZChpbnRlcm5hbCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBpbnRlcm5hbC5kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICJ1bmljb2RlX2ludGVybmFsIikKKworICAgIGRlZiB0ZXN0X2RlY29kZV9lcnJvcl9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICBpZiBzeXMubWF4dW5pY29kZSA+IDB4ZmZmZjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAiXHgwMFx4MDBceDAwXHgwMFx4MDBceDExXHgxMVx4MDAiLmRlY29kZSgidW5pY29kZV9pbnRlcm5hbCIpCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yLCBleDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ1bmljb2RlX2ludGVybmFsIiwgZXguZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXHgwMFx4MDBceDAwXHgwMFx4MDBceDExXHgxMVx4MDAiLCBleC5vYmplY3QpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBleC5zdGFydCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDgsIGV4LmVuZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCkKKworICAgIGRlZiB0ZXN0X2RlY29kZV9jYWxsYmFjayhzZWxmKToKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgPiAweGZmZmY6CisgICAgICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoIlVuaWNvZGVJbnRlcm5hbFRlc3QiLCBjb2RlY3MuaWdub3JlX2Vycm9ycykKKyAgICAgICAgICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0ZGVjb2RlcigidW5pY29kZV9pbnRlcm5hbCIpCisgICAgICAgICAgICBhYiA9IHUiYWIiLmVuY29kZSgidW5pY29kZV9pbnRlcm5hbCIpCisgICAgICAgICAgICBpZ25vcmVkID0gZGVjb2RlcigiJXNceDIyXHgyMlx4MjJceDIyJXMiICUgKGFiWzo0XSwgYWJbNDpdKSwKKyAgICAgICAgICAgICAgICAiVW5pY29kZUludGVybmFsVGVzdCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh1ImFiIiwgMTIpLCBpZ25vcmVkKQorCisgICAgZGVmIHRlc3RfZW5jb2RlX2xlbmd0aChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAzNzM5CisgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0ZW5jb2RlcigidW5pY29kZV9pbnRlcm5hbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlcih1ImEiKVsxXSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyKHUiXHhlOVx1MDE0MiIpWzFdLCAyKQorCisgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0ZW5jb2Rlcigic3RyaW5nLWVzY2FwZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2RlcihyJ1x4MDAnKVsxXSwgNCkKKworIyBGcm9tIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpZG4vZHJhZnQtam9zZWZzc29uLWlkbi10ZXN0LXZlY3RvcnMuaHRtbAorbmFtZXByZXBfdGVzdHMgPSBbCisgICAgIyAzLjEgTWFwIHRvIG5vdGhpbmcuCisgICAgKCdmb29ceGMyXHhhZFx4Y2RceDhmXHhlMVx4YTBceDg2XHhlMVx4YTBceDhiYmFyJworICAgICAnXHhlMlx4ODBceDhiXHhlMlx4ODFceGEwYmF6XHhlZlx4YjhceDgwXHhlZlx4YjhceDg4XHhlZicKKyAgICAgJ1x4YjhceDhmXHhlZlx4YmJceGJmJywKKyAgICAgJ2Zvb2JhcmJheicpLAorICAgICMgMy4yIENhc2UgZm9sZGluZyBBU0NJSSBVKzAwNDMgVSswMDQxIFUrMDA0NiBVKzAwNDUuCisgICAgKCdDQUZFJywKKyAgICAgJ2NhZmUnKSwKKyAgICAjIDMuMyBDYXNlIGZvbGRpbmcgOGJpdCBVKzAwREYgKGdlcm1hbiBzaGFycCBzKS4KKyAgICAjIFRoZSBvcmlnaW5hbCB0ZXN0IGNhc2UgaXMgYm9ndXM7IGl0IHNheXMgXHhjM1x4ZGYKKyAgICAoJ1x4YzNceDlmJywKKyAgICAgJ3NzJyksCisgICAgIyAzLjQgQ2FzZSBmb2xkaW5nIFUrMDEzMCAodHVya2lzaCBjYXBpdGFsIEkgd2l0aCBkb3QpLgorICAgICgnXHhjNFx4YjAnLAorICAgICAnaVx4Y2NceDg3JyksCisgICAgIyAzLjUgQ2FzZSBmb2xkaW5nIG11bHRpYnl0ZSBVKzAxNDMgVSswMzdBLgorICAgICgnXHhjNVx4ODNceGNkXHhiYScsCisgICAgICdceGM1XHg4NCBceGNlXHhiOScpLAorICAgICMgMy42IENhc2UgZm9sZGluZyBVKzIxMjEgVSszM0M2IFUrMUQ3QkIuCisgICAgIyBYWFg6IHNraXAgdGhpcyBhcyBpdCBmYWlscyBpbiBVQ1MtMiBtb2RlCisgICAgIygnXHhlMlx4ODRceGExXHhlM1x4OGZceDg2XHhmMFx4OWRceDllXHhiYicsCisgICAgIyAndGVsY1x4ZTJceDg4XHg5NWtnXHhjZlx4ODMnKSwKKyAgICAoTm9uZSwgTm9uZSksCisgICAgIyAzLjcgTm9ybWFsaXphdGlvbiBvZiBVKzAwNmEgVSswMzBjIFUrMDBBMCBVKzAwQUEuCisgICAgKCdqXHhjY1x4OGNceGMyXHhhMFx4YzJceGFhJywKKyAgICAgJ1x4YzdceGIwIGEnKSwKKyAgICAjIDMuOCBDYXNlIGZvbGRpbmcgVSsxRkI3IGFuZCBub3JtYWxpemF0aW9uLgorICAgICgnXHhlMVx4YmVceGI3JywKKyAgICAgJ1x4ZTFceGJlXHhiNlx4Y2VceGI5JyksCisgICAgIyAzLjkgU2VsZi1yZXZlcnRpbmcgY2FzZSBmb2xkaW5nIFUrMDFGMCBhbmQgbm9ybWFsaXphdGlvbi4KKyAgICAjIFRoZSBvcmlnaW5hbCB0ZXN0IGNhc2UgaXMgYm9ndXMsIGl0IHNheXMgYFx4YzdceGYwJworICAgICgnXHhjN1x4YjAnLAorICAgICAnXHhjN1x4YjAnKSwKKyAgICAjIDMuMTAgU2VsZi1yZXZlcnRpbmcgY2FzZSBmb2xkaW5nIFUrMDM5MCBhbmQgbm9ybWFsaXphdGlvbi4KKyAgICAoJ1x4Y2VceDkwJywKKyAgICAgJ1x4Y2VceDkwJyksCisgICAgIyAzLjExIFNlbGYtcmV2ZXJ0aW5nIGNhc2UgZm9sZGluZyBVKzAzQjAgYW5kIG5vcm1hbGl6YXRpb24uCisgICAgKCdceGNlXHhiMCcsCisgICAgICdceGNlXHhiMCcpLAorICAgICMgMy4xMiBTZWxmLXJldmVydGluZyBjYXNlIGZvbGRpbmcgVSsxRTk2IGFuZCBub3JtYWxpemF0aW9uLgorICAgICgnXHhlMVx4YmFceDk2JywKKyAgICAgJ1x4ZTFceGJhXHg5NicpLAorICAgICMgMy4xMyBTZWxmLXJldmVydGluZyBjYXNlIGZvbGRpbmcgVSsxRjU2IGFuZCBub3JtYWxpemF0aW9uLgorICAgICgnXHhlMVx4YmRceDk2JywKKyAgICAgJ1x4ZTFceGJkXHg5NicpLAorICAgICMgMy4xNCBBU0NJSSBzcGFjZSBjaGFyYWN0ZXIgVSswMDIwLgorICAgICgnICcsCisgICAgICcgJyksCisgICAgIyAzLjE1IE5vbi1BU0NJSSA4Yml0IHNwYWNlIGNoYXJhY3RlciBVKzAwQTAuCisgICAgKCdceGMyXHhhMCcsCisgICAgICcgJyksCisgICAgIyAzLjE2IE5vbi1BU0NJSSBtdWx0aWJ5dGUgc3BhY2UgY2hhcmFjdGVyIFUrMTY4MC4KKyAgICAoJ1x4ZTFceDlhXHg4MCcsCisgICAgIE5vbmUpLAorICAgICMgMy4xNyBOb24tQVNDSUkgbXVsdGlieXRlIHNwYWNlIGNoYXJhY3RlciBVKzIwMDAuCisgICAgKCdceGUyXHg4MFx4ODAnLAorICAgICAnICcpLAorICAgICMgMy4xOCBaZXJvIFdpZHRoIFNwYWNlIFUrMjAwYi4KKyAgICAoJ1x4ZTJceDgwXHg4YicsCisgICAgICcnKSwKKyAgICAjIDMuMTkgTm9uLUFTQ0lJIG11bHRpYnl0ZSBzcGFjZSBjaGFyYWN0ZXIgVSszMDAwLgorICAgICgnXHhlM1x4ODBceDgwJywKKyAgICAgJyAnKSwKKyAgICAjIDMuMjAgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJzIFUrMDAxMCBVKzAwN0YuCisgICAgKCdceDEwXHg3ZicsCisgICAgICdceDEwXHg3ZicpLAorICAgICMgMy4yMSBOb24tQVNDSUkgOGJpdCBjb250cm9sIGNoYXJhY3RlciBVKzAwODUuCisgICAgKCdceGMyXHg4NScsCisgICAgIE5vbmUpLAorICAgICMgMy4yMiBOb24tQVNDSUkgbXVsdGlieXRlIGNvbnRyb2wgY2hhcmFjdGVyIFUrMTgwRS4KKyAgICAoJ1x4ZTFceGEwXHg4ZScsCisgICAgIE5vbmUpLAorICAgICMgMy4yMyBaZXJvIFdpZHRoIE5vLUJyZWFrIFNwYWNlIFUrRkVGRi4KKyAgICAoJ1x4ZWZceGJiXHhiZicsCisgICAgICcnKSwKKyAgICAjIDMuMjQgTm9uLUFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVyIFUrMUQxNzUuCisgICAgKCdceGYwXHg5ZFx4ODVceGI1JywKKyAgICAgTm9uZSksCisgICAgIyAzLjI1IFBsYW5lIDAgcHJpdmF0ZSB1c2UgY2hhcmFjdGVyIFUrRjEyMy4KKyAgICAoJ1x4ZWZceDg0XHhhMycsCisgICAgIE5vbmUpLAorICAgICMgMy4yNiBQbGFuZSAxNSBwcml2YXRlIHVzZSBjaGFyYWN0ZXIgVStGMTIzNC4KKyAgICAoJ1x4ZjNceGIxXHg4OFx4YjQnLAorICAgICBOb25lKSwKKyAgICAjIDMuMjcgUGxhbmUgMTYgcHJpdmF0ZSB1c2UgY2hhcmFjdGVyIFUrMTBGMjM0LgorICAgICgnXHhmNFx4OGZceDg4XHhiNCcsCisgICAgIE5vbmUpLAorICAgICMgMy4yOCBOb24tY2hhcmFjdGVyIGNvZGUgcG9pbnQgVSs4RkZGRS4KKyAgICAoJ1x4ZjJceDhmXHhiZlx4YmUnLAorICAgICBOb25lKSwKKyAgICAjIDMuMjkgTm9uLWNoYXJhY3RlciBjb2RlIHBvaW50IFUrMTBGRkZGLgorICAgICgnXHhmNFx4OGZceGJmXHhiZicsCisgICAgIE5vbmUpLAorICAgICMgMy4zMCBTdXJyb2dhdGUgY29kZSBVK0RGNDIuCisgICAgKCdceGVkXHhiZFx4ODInLAorICAgICBOb25lKSwKKyAgICAjIDMuMzEgTm9uLXBsYWluIHRleHQgY2hhcmFjdGVyIFUrRkZGRC4KKyAgICAoJ1x4ZWZceGJmXHhiZCcsCisgICAgIE5vbmUpLAorICAgICMgMy4zMiBJZGVvZ3JhcGhpYyBkZXNjcmlwdGlvbiBjaGFyYWN0ZXIgVSsyRkY1LgorICAgICgnXHhlMlx4YmZceGI1JywKKyAgICAgTm9uZSksCisgICAgIyAzLjMzIERpc3BsYXkgcHJvcGVydHkgY2hhcmFjdGVyIFUrMDM0MS4KKyAgICAoJ1x4Y2RceDgxJywKKyAgICAgJ1x4Y2NceDgxJyksCisgICAgIyAzLjM0IExlZnQtdG8tcmlnaHQgbWFyayBVKzIwMEUuCisgICAgKCdceGUyXHg4MFx4OGUnLAorICAgICBOb25lKSwKKyAgICAjIDMuMzUgRGVwcmVjYXRlZCBVKzIwMkEuCisgICAgKCdceGUyXHg4MFx4YWEnLAorICAgICBOb25lKSwKKyAgICAjIDMuMzYgTGFuZ3VhZ2UgdGFnZ2luZyBjaGFyYWN0ZXIgVStFMDAwMS4KKyAgICAoJ1x4ZjNceGEwXHg4MFx4ODEnLAorICAgICBOb25lKSwKKyAgICAjIDMuMzcgTGFuZ3VhZ2UgdGFnZ2luZyBjaGFyYWN0ZXIgVStFMDA0Mi4KKyAgICAoJ1x4ZjNceGEwXHg4MVx4ODInLAorICAgICBOb25lKSwKKyAgICAjIDMuMzggQmlkaTogUmFuZEFMQ2F0IGNoYXJhY3RlciBVKzA1QkUgYW5kIExDYXQgY2hhcmFjdGVycy4KKyAgICAoJ2Zvb1x4ZDZceGJlYmFyJywKKyAgICAgTm9uZSksCisgICAgIyAzLjM5IEJpZGk6IFJhbmRBTENhdCBjaGFyYWN0ZXIgVStGRDUwIGFuZCBMQ2F0IGNoYXJhY3RlcnMuCisgICAgKCdmb29ceGVmXHhiNVx4OTBiYXInLAorICAgICBOb25lKSwKKyAgICAjIDMuNDAgQmlkaTogUmFuZEFMQ2F0IGNoYXJhY3RlciBVK0ZCMzggYW5kIExDYXQgY2hhcmFjdGVycy4KKyAgICAoJ2Zvb1x4ZWZceGI5XHhiNmJhcicsCisgICAgICdmb28gXHhkOVx4OGViYXInKSwKKyAgICAjIDMuNDEgQmlkaTogUmFuZEFMQ2F0IHdpdGhvdXQgdHJhaWxpbmcgUmFuZEFMQ2F0IFUrMDYyNyBVKzAwMzEuCisgICAgKCdceGQ4XHhhNzEnLAorICAgICBOb25lKSwKKyAgICAjIDMuNDIgQmlkaTogUmFuZEFMQ2F0IGNoYXJhY3RlciBVKzA2MjcgVSswMDMxIFUrMDYyOC4KKyAgICAoJ1x4ZDhceGE3MVx4ZDhceGE4JywKKyAgICAgJ1x4ZDhceGE3MVx4ZDhceGE4JyksCisgICAgIyAzLjQzIFVuYXNzaWduZWQgY29kZSBwb2ludCBVK0UwMDAyLgorICAgICMgU2tpcCB0aGlzIHRlc3QgYXMgd2UgYWxsb3cgdW5hc3NpZ25lZAorICAgICMoJ1x4ZjNceGEwXHg4MFx4ODInLAorICAgICMgTm9uZSksCisgICAgKE5vbmUsIE5vbmUpLAorICAgICMgMy40NCBMYXJnZXIgdGVzdCAoc2hyaW5raW5nKS4KKyAgICAjIE9yaWdpbmFsIHRlc3QgY2FzZSByZWFkcyBceGMzXHhkZgorICAgICgnWFx4YzJceGFkXHhjM1x4OWZceGM0XHhiMFx4ZTJceDg0XHhhMWpceGNjXHg4Y1x4YzJceGEwXHhjMicKKyAgICAgJ1x4YWFceGNlXHhiMFx4ZTJceDgwXHg4MCcsCisgICAgICd4c3NpXHhjY1x4ODd0ZWxceGM3XHhiMCBhXHhjZVx4YjAgJyksCisgICAgIyAzLjQ1IExhcmdlciB0ZXN0IChleHBhbmRpbmcpLgorICAgICMgT3JpZ2luYWwgdGVzdCBjYXNlIHJlYWRzIFx4YzNceDlmCisgICAgKCdYXHhjM1x4OWZceGUzXHg4Y1x4OTZceGM0XHhiMFx4ZTJceDg0XHhhMVx4ZTJceDkyXHg5Zlx4ZTNceDhjJworICAgICAnXHg4MCcsCisgICAgICd4c3NceGUzXHg4Mlx4YWRceGUzXHg4M1x4YWRceGUzXHg4M1x4YTFceGUzXHg4M1x4YmNceGUzJworICAgICAnXHg4M1x4ODhceGUzXHg4M1x4YWJpXHhjY1x4ODd0ZWxceDI4ZFx4MjlceGUzXHg4MicKKyAgICAgJ1x4YTJceGUzXHg4M1x4OTFceGUzXHg4M1x4YmNceGUzXHg4M1x4ODgnKQorICAgIF0KKworCitjbGFzcyBOYW1lcHJlcFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X25hbWVwcmVwKHNlbGYpOgorICAgICAgICBmcm9tIGVuY29kaW5ncy5pZG5hIGltcG9ydCBuYW1lcHJlcAorICAgICAgICBmb3IgcG9zLCAob3JpZywgcHJlcHBlZCkgaW4gZW51bWVyYXRlKG5hbWVwcmVwX3Rlc3RzKToKKyAgICAgICAgICAgIGlmIG9yaWcgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIFNraXBwZWQKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBUaGUgVW5pY29kZSBzdHJpbmdzIGFyZSBnaXZlbiBpbiBVVEYtOAorICAgICAgICAgICAgb3JpZyA9IHVuaWNvZGUob3JpZywgInV0Zi04IikKKyAgICAgICAgICAgIGlmIHByZXBwZWQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIElucHV0IGNvbnRhaW5zIHByb2hpYml0ZWQgY2hhcmFjdGVycworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgbmFtZXByZXAsIG9yaWcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByZXBwZWQgPSB1bmljb2RlKHByZXBwZWQsICJ1dGYtOCIpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVwcmVwKG9yaWcpLCBwcmVwcGVkKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgdGVzdF9zdXBwb3J0LlRlc3RGYWlsZWQoIlRlc3QgMy4lZDogJXMiICUgKHBvcysxLCBzdHIoZSkpKQorCitjbGFzcyBJRE5BQ29kZWNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9idWlsdGluX2RlY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCJweXRob24ub3JnIiwgImlkbmEiKSwgdSJweXRob24ub3JnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCJweXRob24ub3JnLiIsICJpZG5hIiksIHUicHl0aG9uLm9yZy4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoInhuLS1weXRobi1tdWEub3JnIiwgImlkbmEiKSwgdSJweXRoXHhmNm4ub3JnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCJ4bi0tcHl0aG4tbXVhLm9yZy4iLCAiaWRuYSIpLCB1InB5dGhceGY2bi5vcmcuIikKKworICAgIGRlZiB0ZXN0X2J1aWx0aW5fZW5jb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUicHl0aG9uLm9yZyIuZW5jb2RlKCJpZG5hIiksICJweXRob24ub3JnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgicHl0aG9uLm9yZy4iLmVuY29kZSgiaWRuYSIpLCAicHl0aG9uLm9yZy4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUicHl0aFx4ZjZuLm9yZyIuZW5jb2RlKCJpZG5hIiksICJ4bi0tcHl0aG4tbXVhLm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJweXRoXHhmNm4ub3JnLiIuZW5jb2RlKCJpZG5hIiksICJ4bi0tcHl0aG4tbXVhLm9yZy4iKQorCisgICAgZGVmIHRlc3Rfc3RyZWFtKHNlbGYpOgorICAgICAgICBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgciA9IGNvZGVjcy5nZXRyZWFkZXIoImlkbmEiKShTdHJpbmdJTy5TdHJpbmdJTygiYWJjIikpCisgICAgICAgIHIucmVhZCgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIucmVhZCgpLCB1IiIpCisKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRhbF9kZWNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKCJweXRob24ub3JnIiwgImlkbmEiKSksCisgICAgICAgICAgICB1InB5dGhvbi5vcmciCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJkZWNvZGUoInB5dGhvbi5vcmcuIiwgImlkbmEiKSksCisgICAgICAgICAgICB1InB5dGhvbi5vcmcuIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKCJ4bi0tcHl0aG4tbXVhLm9yZy4iLCAiaWRuYSIpKSwKKyAgICAgICAgICAgIHUicHl0aFx4ZjZuLm9yZy4iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJkZWNvZGUoInhuLS1weXRobi1tdWEub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgdSJweXRoXHhmNm4ub3JnLiIKKyAgICAgICAgKQorCisgICAgICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKCJpZG5hIikoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCJ4bi0teGFtIiwgKSwgdSIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCJwbGUtOXRhLm8iLCApLCB1Ilx4ZTR4YW1wbGUuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSh1InJnIiksIHUiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSh1IiIsIFRydWUpLCB1Im9yZyIpCisKKyAgICAgICAgZGVjb2Rlci5yZXNldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoInhuLS14YW0iLCApLCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoInBsZS05dGEubyIsICksIHUiXHhlNHhhbXBsZS4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCJyZy4iKSwgdSJvcmcuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgiIiwgVHJ1ZSksIHUiIikKKworICAgIGRlZiB0ZXN0X2luY3JlbWVudGFsX2VuY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJlbmNvZGUodSJweXRob24ub3JnIiwgImlkbmEiKSksCisgICAgICAgICAgICAicHl0aG9uLm9yZyIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgIiIuam9pbihjb2RlY3MuaXRlcmVuY29kZSh1InB5dGhvbi5vcmcuIiwgImlkbmEiKSksCisgICAgICAgICAgICAicHl0aG9uLm9yZy4iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJlbmNvZGUodSJweXRoXHhmNm4ub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgInhuLS1weXRobi1tdWEub3JnLiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgIiIuam9pbihjb2RlY3MuaXRlcmVuY29kZSh1InB5dGhceGY2bi5vcmcuIiwgImlkbmEiKSksCisgICAgICAgICAgICAieG4tLXB5dGhuLW11YS5vcmcuIgorICAgICAgICApCisKKyAgICAgICAgZW5jb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGVuY29kZXIoImlkbmEiKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSJceGU0eCIpLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1ImFtcGxlLm9yZyIpLCAieG4tLXhhbXBsZS05dGEuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1IiIsIFRydWUpLCAib3JnIikKKworICAgICAgICBlbmNvZGVyLnJlc2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1Ilx4ZTR4IiksICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUiYW1wbGUub3JnLiIpLCAieG4tLXhhbXBsZS05dGEub3JnLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKSwgIiIpCisKK2NsYXNzIENvZGVjc01vZHVsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjcy5kZWNvZGUoJ1x4ZTRceGY2XHhmYycsICdsYXRpbi0xJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHUnXHhlNFx4ZjZceGZjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MuZGVjb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjcy5kZWNvZGUoJ2FiYycpLCB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgY29kZWNzLmRlY29kZSwgJ1x4ZmYnLCAnYXNjaWknKQorCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjcy5lbmNvZGUodSdceGU0XHhmNlx4ZmMnLCAnbGF0aW4tMScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnXHhlNFx4ZjZceGZjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MuZW5jb2RlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhMb29rdXBFcnJvciwgY29kZWNzLmVuY29kZSwgImZvbyIsICJfX3NwYW1fXyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZWNzLmVuY29kZSh1J2FiYycpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBjb2RlY3MuZW5jb2RlLCB1J1x4ZmZmZicsICdhc2NpaScpCisKKyAgICBkZWYgdGVzdF9yZWdpc3RlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MucmVnaXN0ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLnJlZ2lzdGVyLCA0MikKKworICAgIGRlZiB0ZXN0X2xvb2t1cChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MubG9va3VwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhMb29rdXBFcnJvciwgY29kZWNzLmxvb2t1cCwgIl9fc3BhbV9fIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTG9va3VwRXJyb3IsIGNvZGVjcy5sb29rdXAsICIgIikKKworICAgIGRlZiB0ZXN0X2dldGVuY29kZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLmdldGVuY29kZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKExvb2t1cEVycm9yLCBjb2RlY3MuZ2V0ZW5jb2RlciwgIl9fc3BhbV9fIikKKworICAgIGRlZiB0ZXN0X2dldGRlY29kZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLmdldGRlY29kZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKExvb2t1cEVycm9yLCBjb2RlY3MuZ2V0ZGVjb2RlciwgIl9fc3BhbV9fIikKKworICAgIGRlZiB0ZXN0X2dldHJlYWRlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MuZ2V0cmVhZGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhMb29rdXBFcnJvciwgY29kZWNzLmdldHJlYWRlciwgIl9fc3BhbV9fIikKKworICAgIGRlZiB0ZXN0X2dldHdyaXRlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MuZ2V0d3JpdGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhMb29rdXBFcnJvciwgY29kZWNzLmdldHdyaXRlciwgIl9fc3BhbV9fIikKKworICAgIGRlZiB0ZXN0X2xvb2t1cF9pc3N1ZTE4MTMoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE4MTM6IHVuZGVyIFR1cmtpc2ggbG9jYWxlcywgbG9va3VwIG9mIHNvbWUgY29kZWNzIGZhaWxlZAorICAgICAgICAjIGJlY2F1c2UgJ0knIGlzIGxvd2VyY2FzZWQgYXMgYSBkb3RsZXNzICJpIgorICAgICAgICBvbGRsb2NhbGUgPSBsb2NhbGUuZ2V0bG9jYWxlKGxvY2FsZS5MQ19DVFlQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGxvY2FsZS5zZXRsb2NhbGUsIGxvY2FsZS5MQ19DVFlQRSwgb2xkbG9jYWxlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19DVFlQRSwgJ3RyX1RSJykKKyAgICAgICAgZXhjZXB0IGxvY2FsZS5FcnJvcjoKKyAgICAgICAgICAgICMgVW5zdXBwb3J0ZWQgbG9jYWxlIG9uIHRoaXMgc3lzdGVtCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCd0ZXN0IG5lZWRzIFR1cmtpc2ggbG9jYWxlJykKKyAgICAgICAgYyA9IGNvZGVjcy5sb29rdXAoJ0FTQ0lJJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm5hbWUsICdhc2NpaScpCisKK2NsYXNzIFN0cmVhbVJlYWRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBTdHJpbmdJTy5TdHJpbmdJTygnXHhlZFx4OTVceDljXG5ceGVhXHhiOFx4ODAnKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5yZWFkZXIoc2VsZi5zdHJlYW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZXMoKSwgW3UnXHVkNTVjXG4nLCB1J1x1YWUwMCddKQorCitjbGFzcyBFbmNvZGVkRmlsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygnXHhlZFx4OTVceDljXG5ceGVhXHhiOFx4ODAnKQorICAgICAgICBlZiA9IGNvZGVjcy5FbmNvZGVkRmlsZShmLCAndXRmLTE2LWxlJywgJ3V0Zi04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlZi5yZWFkKCksICdcXFx4ZDVcblx4MDBceDAwXHhhZScpCisKKyAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgZWYgPSBjb2RlY3MuRW5jb2RlZEZpbGUoZiwgJ3V0Zi04JywgJ2xhdGluMScpCisgICAgICAgIGVmLndyaXRlKCdceGMzXHhiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXR2YWx1ZSgpLCAnXHhmYycpCisKK2NsYXNzIFN0cjJTdHJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgIHNpbiA9ICJceDgwIi5lbmNvZGUoImJhc2U2NF9jb2RlYyIpCisgICAgICAgIHJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoImJhc2U2NF9jb2RlYyIpKFN0cmluZ0lPLlN0cmluZ0lPKHNpbikpCisgICAgICAgIHNvdXQgPSByZWFkZXIucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc291dCwgIlx4ODAiKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc291dCwgc3RyKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmUoc2VsZik6CisgICAgICAgIHNpbiA9ICJceDgwIi5lbmNvZGUoImJhc2U2NF9jb2RlYyIpCisgICAgICAgIHJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoImJhc2U2NF9jb2RlYyIpKFN0cmluZ0lPLlN0cmluZ0lPKHNpbikpCisgICAgICAgIHNvdXQgPSByZWFkZXIucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXQsICJceDgwIikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNvdXQsIHN0cikKKworYWxsX3VuaWNvZGVfZW5jb2RpbmdzID0gWworICAgICJhc2NpaSIsCisgICAgImJhc2U2NF9jb2RlYyIsCisgICAgImJpZzUiLAorICAgICJiaWc1aGtzY3MiLAorICAgICJjaGFybWFwIiwKKyAgICAiY3AwMzciLAorICAgICJjcDEwMDYiLAorICAgICJjcDEwMjYiLAorICAgICJjcDExNDAiLAorICAgICJjcDEyNTAiLAorICAgICJjcDEyNTEiLAorICAgICJjcDEyNTIiLAorICAgICJjcDEyNTMiLAorICAgICJjcDEyNTQiLAorICAgICJjcDEyNTUiLAorICAgICJjcDEyNTYiLAorICAgICJjcDEyNTciLAorICAgICJjcDEyNTgiLAorICAgICJjcDQyNCIsCisgICAgImNwNDM3IiwKKyAgICAiY3A1MDAiLAorICAgICJjcDcyMCIsCisgICAgImNwNzM3IiwKKyAgICAiY3A3NzUiLAorICAgICJjcDg1MCIsCisgICAgImNwODUyIiwKKyAgICAiY3A4NTUiLAorICAgICJjcDg1NiIsCisgICAgImNwODU3IiwKKyAgICAiY3A4NTgiLAorICAgICJjcDg2MCIsCisgICAgImNwODYxIiwKKyAgICAiY3A4NjIiLAorICAgICJjcDg2MyIsCisgICAgImNwODY0IiwKKyAgICAiY3A4NjUiLAorICAgICJjcDg2NiIsCisgICAgImNwODY5IiwKKyAgICAiY3A4NzQiLAorICAgICJjcDg3NSIsCisgICAgImNwOTMyIiwKKyAgICAiY3A5NDkiLAorICAgICJjcDk1MCIsCisgICAgImV1Y19qaXNfMjAwNCIsCisgICAgImV1Y19qaXN4MDIxMyIsCisgICAgImV1Y19qcCIsCisgICAgImV1Y19rciIsCisgICAgImdiMTgwMzAiLAorICAgICJnYjIzMTIiLAorICAgICJnYmsiLAorICAgICJoZXhfY29kZWMiLAorICAgICJocF9yb21hbjgiLAorICAgICJoeiIsCisgICAgImlkbmEiLAorICAgICJpc28yMDIyX2pwIiwKKyAgICAiaXNvMjAyMl9qcF8xIiwKKyAgICAiaXNvMjAyMl9qcF8yIiwKKyAgICAiaXNvMjAyMl9qcF8yMDA0IiwKKyAgICAiaXNvMjAyMl9qcF8zIiwKKyAgICAiaXNvMjAyMl9qcF9leHQiLAorICAgICJpc28yMDIyX2tyIiwKKyAgICAiaXNvODg1OV8xIiwKKyAgICAiaXNvODg1OV8xMCIsCisgICAgImlzbzg4NTlfMTEiLAorICAgICJpc284ODU5XzEzIiwKKyAgICAiaXNvODg1OV8xNCIsCisgICAgImlzbzg4NTlfMTUiLAorICAgICJpc284ODU5XzE2IiwKKyAgICAiaXNvODg1OV8yIiwKKyAgICAiaXNvODg1OV8zIiwKKyAgICAiaXNvODg1OV80IiwKKyAgICAiaXNvODg1OV81IiwKKyAgICAiaXNvODg1OV82IiwKKyAgICAiaXNvODg1OV83IiwKKyAgICAiaXNvODg1OV84IiwKKyAgICAiaXNvODg1OV85IiwKKyAgICAiam9oYWIiLAorICAgICJrb2k4X3IiLAorICAgICJrb2k4X3UiLAorICAgICJsYXRpbl8xIiwKKyAgICAibWFjX2N5cmlsbGljIiwKKyAgICAibWFjX2dyZWVrIiwKKyAgICAibWFjX2ljZWxhbmQiLAorICAgICJtYWNfbGF0aW4yIiwKKyAgICAibWFjX3JvbWFuIiwKKyAgICAibWFjX3R1cmtpc2giLAorICAgICJwYWxtb3MiLAorICAgICJwdGNwMTU0IiwKKyAgICAicHVueWNvZGUiLAorICAgICJyYXdfdW5pY29kZV9lc2NhcGUiLAorICAgICJyb3RfMTMiLAorICAgICJzaGlmdF9qaXMiLAorICAgICJzaGlmdF9qaXNfMjAwNCIsCisgICAgInNoaWZ0X2ppc3gwMjEzIiwKKyAgICAidGlzXzYyMCIsCisgICAgInVuaWNvZGVfZXNjYXBlIiwKKyAgICAidW5pY29kZV9pbnRlcm5hbCIsCisgICAgInV0Zl8xNiIsCisgICAgInV0Zl8xNl9iZSIsCisgICAgInV0Zl8xNl9sZSIsCisgICAgInV0Zl83IiwKKyAgICAidXRmXzgiLAorXQorCitpZiBoYXNhdHRyKGNvZGVjcywgIm1iY3NfZW5jb2RlIik6CisgICAgYWxsX3VuaWNvZGVfZW5jb2RpbmdzLmFwcGVuZCgibWJjcyIpCisKKyMgVGhlIGZvbGxvd2luZyBlbmNvZGluZ3Mgd29yayBvbmx5IHdpdGggc3RyLCBub3QgdW5pY29kZQorYWxsX3N0cmluZ19lbmNvZGluZ3MgPSBbCisgICAgInF1b3ByaV9jb2RlYyIsCisgICAgInN0cmluZ19lc2NhcGUiLAorICAgICJ1dV9jb2RlYyIsCitdCisKKyMgVGhlIGZvbGxvd2luZyBlbmNvZGluZyBpcyBub3QgdGVzdGVkLCBiZWNhdXNlIGl0J3Mgbm90IHN1cHBvc2VkCisjIHRvIHdvcms6CisjICAgICJ1bmRlZmluZWQiCisKKyMgVGhlIGZvbGxvd2luZyBlbmNvZGluZ3MgZG9uJ3Qgd29yayBpbiBzdGF0ZWZ1bCBtb2RlCiticm9rZW5fdW5pY29kZV93aXRoX3N0cmVhbXMgPSBbCisgICAgImJhc2U2NF9jb2RlYyIsCisgICAgImhleF9jb2RlYyIsCisgICAgInB1bnljb2RlIiwKKyAgICAidW5pY29kZV9pbnRlcm5hbCIKK10KK2Jyb2tlbl9pbmNyZW1lbnRhbF9jb2RlcnMgPSBicm9rZW5fdW5pY29kZV93aXRoX3N0cmVhbXNbOl0KKworIyBUaGUgZm9sbG93aW5nIGVuY29kaW5ncyBvbmx5IHN1cHBvcnQgInN0cmljdCIgbW9kZQorb25seV9zdHJpY3RfbW9kZSA9IFsKKyAgICAiaWRuYSIsCisgICAgInpsaWJfY29kZWMiLAorICAgICJiejJfY29kZWMiLAorXQorCit0cnk6CisgICAgaW1wb3J0IGJ6MgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgYWxsX3VuaWNvZGVfZW5jb2RpbmdzLmFwcGVuZCgiYnoyX2NvZGVjIikKKyAgICBicm9rZW5fdW5pY29kZV93aXRoX3N0cmVhbXMuYXBwZW5kKCJiejJfY29kZWMiKQorCit0cnk6CisgICAgaW1wb3J0IHpsaWIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGFsbF91bmljb2RlX2VuY29kaW5ncy5hcHBlbmQoInpsaWJfY29kZWMiKQorICAgIGJyb2tlbl91bmljb2RlX3dpdGhfc3RyZWFtcy5hcHBlbmQoInpsaWJfY29kZWMiKQorCitjbGFzcyBCYXNpY1VuaWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CisgICAgICAgIHMgPSB1ImFiYzEyMyIgIyBhbGwgY29kZWNzIHNob3VsZCBiZSBhYmxlIHRvIGVuY29kZSB0aGVzZQorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gYWxsX3VuaWNvZGVfZW5jb2RpbmdzOgorICAgICAgICAgICAgbmFtZSA9IGNvZGVjcy5sb29rdXAoZW5jb2RpbmcpLm5hbWUKKyAgICAgICAgICAgIGlmIGVuY29kaW5nLmVuZHN3aXRoKCJfY29kZWMiKToKKyAgICAgICAgICAgICAgICBuYW1lICs9ICJfY29kZWMiCisgICAgICAgICAgICBlbGlmIGVuY29kaW5nID09ICJsYXRpbl8xIjoKKyAgICAgICAgICAgICAgICBuYW1lID0gImxhdGluXzEiCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kaW5nLnJlcGxhY2UoIl8iLCAiLSIpLCBuYW1lLnJlcGxhY2UoIl8iLCAiLSIpKQorICAgICAgICAgICAgKGJ5dGVzLCBzaXplKSA9IGNvZGVjcy5nZXRlbmNvZGVyKGVuY29kaW5nKShzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplLCBsZW4ocyksICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChzaXplLCBsZW4ocyksIGVuY29kaW5nKSkKKyAgICAgICAgICAgIChjaGFycywgc2l6ZSkgPSBjb2RlY3MuZ2V0ZGVjb2RlcihlbmNvZGluZykoYnl0ZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoYXJzLCBzLCAiJXIgIT0gJXIgKGVuY29kaW5nPSVyKSIgJSAoY2hhcnMsIHMsIGVuY29kaW5nKSkKKworICAgICAgICAgICAgaWYgZW5jb2Rpbmcgbm90IGluIGJyb2tlbl91bmljb2RlX3dpdGhfc3RyZWFtczoKKyAgICAgICAgICAgICAgICAjIGNoZWNrIHN0cmVhbSByZWFkZXIvd3JpdGVyCisgICAgICAgICAgICAgICAgcSA9IFF1ZXVlKCkKKyAgICAgICAgICAgICAgICB3cml0ZXIgPSBjb2RlY3MuZ2V0d3JpdGVyKGVuY29kaW5nKShxKQorICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgPSAiIgorICAgICAgICAgICAgICAgIGZvciBjIGluIHM6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShjKQorICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ICs9IHEucmVhZCgpCisgICAgICAgICAgICAgICAgcSA9IFF1ZXVlKCkKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKGVuY29kaW5nKShxKQorICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgPSB1IiIKKyAgICAgICAgICAgICAgICBmb3IgYyBpbiBlbmNvZGVkcmVzdWx0OgorICAgICAgICAgICAgICAgICAgICBxLndyaXRlKGMpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gcmVhZGVyLnJlYWQoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGRlY29kZWRyZXN1bHQsIHMsIGVuY29kaW5nKSkKKworICAgICAgICAgICAgaWYgZW5jb2Rpbmcgbm90IGluIGJyb2tlbl9pbmNyZW1lbnRhbF9jb2RlcnM6CisgICAgICAgICAgICAgICAgIyBjaGVjayBpbmNyZW1lbnRhbCBkZWNvZGVyL2VuY29kZXIgKGZldGNoZWQgdmlhIHRoZSBQeXRob24KKyAgICAgICAgICAgICAgICAjIGFuZCBDIEFQSSkgYW5kIGl0ZXJlbmNvZGUoKS9pdGVyZGVjb2RlKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKGVuY29kaW5nKSgpCisgICAgICAgICAgICAgICAgICAgIGNlbmNvZGVyID0gX3Rlc3RjYXBpLmNvZGVjX2luY3JlbWVudGFsZW5jb2RlcihlbmNvZGluZykKKyAgICAgICAgICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6ICMgbm8gSW5jcmVtZW50YWxFbmNvZGVyCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGluY3JlbWVudGFsIGRlY29kZXIvZW5jb2RlcgorICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ID0gIiIKKyAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgKz0gZW5jb2Rlci5lbmNvZGUoYykKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBlbmNvZGVyLmVuY29kZSh1IiIsIFRydWUpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKGVuY29kaW5nKSgpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgPSB1IiIKKyAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gZW5jb2RlZHJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gZGVjb2Rlci5kZWNvZGUoYykKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCArPSBkZWNvZGVyLmRlY29kZSgiIiwgVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVkcmVzdWx0LCBzLCAiJXIgIT0gJXIgKGVuY29kaW5nPSVyKSIgJSAoZGVjb2RlZHJlc3VsdCwgcywgZW5jb2RpbmcpKQorCisgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgQyBBUEkKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCA9ICIiCisgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIHM6CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ICs9IGNlbmNvZGVyLmVuY29kZShjKQorICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ICs9IGNlbmNvZGVyLmVuY29kZSh1IiIsIFRydWUpCisgICAgICAgICAgICAgICAgICAgIGNkZWNvZGVyID0gX3Rlc3RjYXBpLmNvZGVjX2luY3JlbWVudGFsZGVjb2RlcihlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCA9IHUiIgorICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBlbmNvZGVkcmVzdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCArPSBjZGVjb2Rlci5kZWNvZGUoYykKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCArPSBjZGVjb2Rlci5kZWNvZGUoIiIsIFRydWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGRlY29kZWRyZXN1bHQsIHMsIGVuY29kaW5nKSkKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGl0ZXJlbmNvZGUoKS9pdGVyZGVjb2RlKCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdSIiLmpvaW4oY29kZWNzLml0ZXJkZWNvZGUoY29kZWNzLml0ZXJlbmNvZGUocywgZW5jb2RpbmcpLCBlbmNvZGluZykpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzLCAiJXIgIT0gJXIgKGVuY29kaW5nPSVyKSIgJSAocmVzdWx0LCBzLCBlbmNvZGluZykpCisKKyAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpdGVyZW5jb2RlKCkvaXRlcmRlY29kZSgpIHdpdGggZW1wdHkgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHUiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKGNvZGVjcy5pdGVyZW5jb2RlKHUiIiwgZW5jb2RpbmcpLCBlbmNvZGluZykpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCB1IiIpCisKKyAgICAgICAgICAgICAgICBpZiBlbmNvZGluZyBub3QgaW4gb25seV9zdHJpY3RfbW9kZToKKyAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpbmNyZW1lbnRhbCBkZWNvZGVyL2VuY29kZXIgd2l0aCBlcnJvcnMgYXJndW1lbnQKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGVuY29kZXIoZW5jb2RpbmcpKCJpZ25vcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgY2VuY29kZXIgPSBfdGVzdGNhcGkuY29kZWNfaW5jcmVtZW50YWxlbmNvZGVyKGVuY29kaW5nLCAiaWdub3JlIikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOiAjIG5vIEluY3JlbWVudGFsRW5jb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCA9ICIiLmpvaW4oZW5jb2Rlci5lbmNvZGUoYykgZm9yIGMgaW4gcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKGVuY29kaW5nKSgiaWdub3JlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgPSB1IiIuam9pbihkZWNvZGVyLmRlY29kZShjKSBmb3IgYyBpbiBlbmNvZGVkcmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVkcmVzdWx0LCBzLCAiJXIgIT0gJXIgKGVuY29kaW5nPSVyKSIgJSAoZGVjb2RlZHJlc3VsdCwgcywgZW5jb2RpbmcpKQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ID0gIiIuam9pbihjZW5jb2Rlci5lbmNvZGUoYykgZm9yIGMgaW4gcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNkZWNvZGVyID0gX3Rlc3RjYXBpLmNvZGVjX2luY3JlbWVudGFsZGVjb2RlcihlbmNvZGluZywgImlnbm9yZSIpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ID0gdSIiLmpvaW4oY2RlY29kZXIuZGVjb2RlKGMpIGZvciBjIGluIGVuY29kZWRyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCisKKyAgICBkZWYgdGVzdF9zZWVrKHNlbGYpOgorICAgICAgICAjIGFsbCBjb2RlY3Mgc2hvdWxkIGJlIGFibGUgdG8gZW5jb2RlIHRoZXNlCisgICAgICAgIHMgPSB1IiVzXG4lc1xuIiAlICgxMDAqdSJhYmMxMjMiLCAxMDAqdSJkZWY0NTYiKQorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gYWxsX3VuaWNvZGVfZW5jb2RpbmdzOgorICAgICAgICAgICAgaWYgZW5jb2RpbmcgPT0gImlkbmEiOiAjIEZJWE1FOiBTZWUgU0YgYnVnICMxMTYzMTc4CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGVuY29kaW5nIGluIGJyb2tlbl91bmljb2RlX3dpdGhfc3RyZWFtczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcmVhZGVyID0gY29kZWNzLmdldHJlYWRlcihlbmNvZGluZykoU3RyaW5nSU8uU3RyaW5nSU8ocy5lbmNvZGUoZW5jb2RpbmcpKSkKKyAgICAgICAgICAgIGZvciB0IGluIHhyYW5nZSg1KToKKyAgICAgICAgICAgICAgICAjIFRlc3QgdGhhdCBjYWxsaW5nIHNlZWsgcmVzZXRzIHRoZSBpbnRlcm5hbCBjb2RlYyBzdGF0ZSBhbmQgYnVmZmVycworICAgICAgICAgICAgICAgIHJlYWRlci5zZWVrKDAsIDApCisgICAgICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWzpsZW4obGluZSldLCBsaW5lKQorCisgICAgZGVmIHRlc3RfYmFkX2RlY29kZV9hcmdzKHNlbGYpOgorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gYWxsX3VuaWNvZGVfZW5jb2RpbmdzOgorICAgICAgICAgICAgZGVjb2RlciA9IGNvZGVjcy5nZXRkZWNvZGVyKGVuY29kaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkZWNvZGVyKQorICAgICAgICAgICAgaWYgZW5jb2Rpbmcgbm90IGluICgiaWRuYSIsICJwdW55Y29kZSIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGVjb2RlciwgNDIpCisKKyAgICBkZWYgdGVzdF9iYWRfZW5jb2RlX2FyZ3Moc2VsZik6CisgICAgICAgIGZvciBlbmNvZGluZyBpbiBhbGxfdW5pY29kZV9lbmNvZGluZ3M6CisgICAgICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGVuY29kZXIoZW5jb2RpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGVuY29kZXIpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZ19tYXBfdHlwZV9pbml0aWFsaXplZChzZWxmKToKKyAgICAgICAgZnJvbSBlbmNvZGluZ3MgaW1wb3J0IGNwMTE0MAorICAgICAgICAjIFRoaXMgdXNlZCB0byBjcmFzaCwgd2UgYXJlIG9ubHkgdmVyaWZ5aW5nIHRoZXJlJ3Mgbm8gY3Jhc2guCisgICAgICAgIHRhYmxlX3R5cGUgPSB0eXBlKGNwMTE0MC5lbmNvZGluZ190YWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWJsZV90eXBlLCB0YWJsZV90eXBlKQorCitjbGFzcyBCYXNpY1N0clRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgcyA9ICJhYmMxMjMiCisgICAgICAgIGZvciBlbmNvZGluZyBpbiBhbGxfc3RyaW5nX2VuY29kaW5nczoKKyAgICAgICAgICAgIChieXRlcywgc2l6ZSkgPSBjb2RlY3MuZ2V0ZW5jb2RlcihlbmNvZGluZykocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZSwgbGVuKHMpKQorICAgICAgICAgICAgKGNoYXJzLCBzaXplKSA9IGNvZGVjcy5nZXRkZWNvZGVyKGVuY29kaW5nKShieXRlcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2hhcnMsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChjaGFycywgcywgZW5jb2RpbmcpKQorCitjbGFzcyBDaGFybWFwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZGVjb2RlX3dpdGhfc3RyaW5nX21hcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsIHUiYWJjIiksCisgICAgICAgICAgICAodSJhYmMiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCBiIlx4MDBceDAxXHgwMiIsICJzdHJpY3QiLCB1ImFiIgorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsIHUiYWJcdWZmZmUiCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAicmVwbGFjZSIsIHUiYWIiKSwKKyAgICAgICAgICAgICh1ImFiXHVmZmZkIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJyZXBsYWNlIiwgdSJhYlx1ZmZmZSIpLAorICAgICAgICAgICAgKHUiYWJcdWZmZmQiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgImlnbm9yZSIsIHUiYWIiKSwKKyAgICAgICAgICAgICh1ImFiIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJpZ25vcmUiLCB1ImFiXHVmZmZlIiksCisgICAgICAgICAgICAodSJhYiIsIDMpCisgICAgICAgICkKKworICAgICAgICBhbGxieXRlcyA9ICIiLmpvaW4oY2hyKGkpIGZvciBpIGluIHhyYW5nZSgyNTYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKGFsbGJ5dGVzLCAiaWdub3JlIiwgdSIiKSwKKyAgICAgICAgICAgICh1IiIsIGxlbihhbGxieXRlcykpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2RlY29kZV93aXRoX2ludDJzdHJfbWFwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogdSdhJywgMTogdSdiJywgMjogdSdjJ30pLAorICAgICAgICAgICAgKHUiYWJjIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJzdHJpY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J0FhJywgMTogdSdCYicsIDI6IHUnQ2MnfSksCisgICAgICAgICAgICAodSJBYUJiQ2MiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnXFUwMDEwRkZGRicsIDE6IHUnYicsIDI6IHUnYyd9KSwKKyAgICAgICAgICAgICh1IlxVMDAxMEZGRkZiYyIsIDMpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogdSdhJywgMTogdSdiJywgMjogdScnfSksCisgICAgICAgICAgICAodSJhYiIsIDMpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUsICJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYid9CisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUsICJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYicsIDI6IE5vbmV9CisgICAgICAgICkKKworICAgICAgICAjIElzc3VlICMxNDg1MAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUsICJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYicsIDI6IHUnXHVmZmZlJ30KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJyZXBsYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogdSdhJywgMTogdSdiJ30pLAorICAgICAgICAgICAgKHUiYWJcdWZmZmQiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInJlcGxhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J2EnLCAxOiB1J2InLCAyOiBOb25lfSksCisgICAgICAgICAgICAodSJhYlx1ZmZmZCIsIDMpCisgICAgICAgICkKKworICAgICAgICAjIElzc3VlICMxNDg1MAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAicmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYicsIDI6IHUnXHVmZmZlJ30pLAorICAgICAgICAgICAgKHUiYWJcdWZmZmQiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgImlnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYid9KSwKKyAgICAgICAgICAgICh1ImFiIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJpZ25vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J2EnLCAxOiB1J2InLCAyOiBOb25lfSksCisgICAgICAgICAgICAodSJhYiIsIDMpCisgICAgICAgICkKKworICAgICAgICAjIElzc3VlICMxNDg1MAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAiaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogdSdhJywgMTogdSdiJywgMjogdSdcdWZmZmUnfSksCisgICAgICAgICAgICAodSJhYiIsIDMpCisgICAgICAgICkKKworICAgICAgICBhbGxieXRlcyA9ICIiLmpvaW4oY2hyKGkpIGZvciBpIGluIHhyYW5nZSgyNTYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKGFsbGJ5dGVzLCAiaWdub3JlIiwge30pLAorICAgICAgICAgICAgKHUiIiwgbGVuKGFsbGJ5dGVzKSkKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfZGVjb2RlX3dpdGhfaW50MmludF9tYXAoc2VsZik6CisgICAgICAgIGEgPSBvcmQodSdhJykKKyAgICAgICAgYiA9IG9yZCh1J2InKQorICAgICAgICBjID0gb3JkKHUnYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IGEsIDE6IGIsIDI6IGN9KSwKKyAgICAgICAgICAgICh1ImFiYyIsIDMpCisgICAgICAgICkKKworICAgICAgICAjIElzc3VlICMxNTM3OQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogMHgxMEZGRkYsIDE6IGIsIDI6IGN9KSwKKyAgICAgICAgICAgICh1IlxVMDAxMEZGRkZiYyIsIDMpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUsICJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IDB4MTEwMDAwLCAxOiBiLCAyOiBjfQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiBhLCAxOiBifSwKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSwgIlx4MDBceDAxXHgwMiIsICJzdHJpY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogYSwgMTogYiwgMjogMHhGRkZFfSwKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJyZXBsYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogYSwgMTogYn0pLAorICAgICAgICAgICAgKHUiYWJcdWZmZmQiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInJlcGxhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiBhLCAxOiBiLCAyOiAweEZGRkV9KSwKKyAgICAgICAgICAgICh1ImFiXHVmZmZkIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJpZ25vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiBhLCAxOiBifSksCisgICAgICAgICAgICAodSJhYiIsIDMpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAiaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogYSwgMTogYiwgMjogMHhGRkZFfSksCisgICAgICAgICAgICAodSJhYiIsIDMpCisgICAgICAgICkKKworCitjbGFzcyBXaXRoU3RtdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VuY29kZWRmaWxlKHNlbGYpOgorICAgICAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oIlx4YzNceGJjIikKKyAgICAgICAgd2l0aCBjb2RlY3MuRW5jb2RlZEZpbGUoZiwgImxhdGluLTEiLCAidXRmLTgiKSBhcyBlZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWYucmVhZCgpLCAiXHhmYyIpCisKKyAgICBkZWYgdGVzdF9zdHJlYW1yZWFkZXJ3cml0ZXIoc2VsZik6CisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygiXHhjM1x4YmMiKQorICAgICAgICBpbmZvID0gY29kZWNzLmxvb2t1cCgidXRmLTgiKQorICAgICAgICB3aXRoIGNvZGVjcy5TdHJlYW1SZWFkZXJXcml0ZXIoZiwgaW5mby5zdHJlYW1yZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnN0cmVhbXdyaXRlciwgJ3N0cmljdCcpIGFzIHNydzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3J3LnJlYWQoKSwgdSJceGZjIikKKworCitjbGFzcyBVbmljb2RlRXNjYXBlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZWNzLnVuaWNvZGVfZXNjYXBlX2VuY29kZSh1IiIpLCAoIiIsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjcy51bmljb2RlX2VzY2FwZV9kZWNvZGUoIiIpLCAodSIiLCAwKSkKKworICAgIGRlZiB0ZXN0X3Jhd19lbmNvZGUoc2VsZik6CisgICAgICAgIGVuY29kZSA9IGNvZGVjcy51bmljb2RlX2VzY2FwZV9lbmNvZGUKKyAgICAgICAgZm9yIGIgaW4gcmFuZ2UoMzIsIDEyNyk6CisgICAgICAgICAgICBpZiBiICE9IG9yZCgnXFwnKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZSh1bmljaHIoYikpLCAoY2hyKGIpLCAxKSkKKworICAgIGRlZiB0ZXN0X3Jhd19kZWNvZGUoc2VsZik6CisgICAgICAgIGRlY29kZSA9IGNvZGVjcy51bmljb2RlX2VzY2FwZV9kZWNvZGUKKyAgICAgICAgZm9yIGIgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgIGlmIGIgIT0gb3JkKCdcXCcpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGNocihiKSArICcwJyksICh1bmljaHIoYikgKyB1JzAnLCAyKSkKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9lbmNvZGUoc2VsZik6CisgICAgICAgIGVuY29kZSA9IGNvZGVjcy51bmljb2RlX2VzY2FwZV9lbmNvZGUKKyAgICAgICAgY2hlY2sgPSBjb2RpbmdfY2hlY2tlcihzZWxmLCBlbmNvZGUpCisgICAgICAgIGNoZWNrKHUnXHQnLCByJ1x0JykKKyAgICAgICAgY2hlY2sodSdcbicsIHInXG4nKQorICAgICAgICBjaGVjayh1J1xyJywgcidccicpCisgICAgICAgIGNoZWNrKHUnXFwnLCByJ1xcJykKKyAgICAgICAgZm9yIGIgaW4gcmFuZ2UoMzIpOgorICAgICAgICAgICAgaWYgY2hyKGIpIG5vdCBpbiAnXHRcblxyJzoKKyAgICAgICAgICAgICAgICBjaGVjayh1bmljaHIoYiksICdcXHglMDJ4JyAlIGIpCisgICAgICAgIGZvciBiIGluIHJhbmdlKDEyNywgMjU2KToKKyAgICAgICAgICAgIGNoZWNrKHVuaWNocihiKSwgJ1xceCUwMngnICUgYikKKyAgICAgICAgY2hlY2sodSdcdTIwYWMnLCByJ1x1MjBhYycpCisgICAgICAgIGNoZWNrKHUnXFUwMDAxZDEyMCcsIHInXFUwMDAxZDEyMCcpCisKKyAgICBkZWYgdGVzdF9lc2NhcGVfZGVjb2RlKHNlbGYpOgorICAgICAgICBkZWNvZGUgPSBjb2RlY3MudW5pY29kZV9lc2NhcGVfZGVjb2RlCisgICAgICAgIGNoZWNrID0gY29kaW5nX2NoZWNrZXIoc2VsZiwgZGVjb2RlKQorICAgICAgICBjaGVjaygiW1xcXG5dIiwgdSJbXSIpCisgICAgICAgIGNoZWNrKHInW1wiXScsIHUnWyJdJykKKyAgICAgICAgY2hlY2sociJbXCddIiwgdSJbJ10iKQorICAgICAgICBjaGVjayhyIltcXF0iLCB1ciJbXF0iKQorICAgICAgICBjaGVjayhyIltcYV0iLCB1IltceDA3XSIpCisgICAgICAgIGNoZWNrKHIiW1xiXSIsIHUiW1x4MDhdIikKKyAgICAgICAgY2hlY2sociJbXHRdIiwgdSJbXHgwOV0iKQorICAgICAgICBjaGVjayhyIltcbl0iLCB1IltceDBhXSIpCisgICAgICAgIGNoZWNrKHIiW1x2XSIsIHUiW1x4MGJdIikKKyAgICAgICAgY2hlY2sociJbXGZdIiwgdSJbXHgwY10iKQorICAgICAgICBjaGVjayhyIltccl0iLCB1IltceDBkXSIpCisgICAgICAgIGNoZWNrKHIiW1w3XSIsIHUiW1x4MDddIikKKyAgICAgICAgY2hlY2sociJbXDhdIiwgdXIiW1w4XSIpCisgICAgICAgIGNoZWNrKHIiW1w3OF0iLCB1IltceDA3OF0iKQorICAgICAgICBjaGVjayhyIltcNDFdIiwgdSJbIV0iKQorICAgICAgICBjaGVjayhyIltcNDE4XSIsIHUiWyE4XSIpCisgICAgICAgIGNoZWNrKHIiW1wxMDFdIiwgdSJbQV0iKQorICAgICAgICBjaGVjayhyIltcMTAxMF0iLCB1IltBMF0iKQorICAgICAgICBjaGVjayhyIltceDQxXSIsIHUiW0FdIikKKyAgICAgICAgY2hlY2sociJbXHg0MTBdIiwgdSJbQTBdIikKKyAgICAgICAgY2hlY2sociJcdTIwYWMiLCB1Ilx1MjBhYyIpCisgICAgICAgIGNoZWNrKHIiXFUwMDAxZDEyMCIsIHUiXFUwMDAxZDEyMCIpCisgICAgICAgIGZvciBiIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBpZiBjaHIoYikgbm90IGluICdcbiJcJ1xcYWJ0bnZmcjAxMjM0NTY3eHVVTic6CisgICAgICAgICAgICAgICAgY2hlY2soJ1xcJyArIGNocihiKSwgdSdcXCcgKyB1bmljaHIoYikpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVfZXJyb3JzKHNlbGYpOgorICAgICAgICBkZWNvZGUgPSBjb2RlY3MudW5pY29kZV9lc2NhcGVfZGVjb2RlCisgICAgICAgIGZvciBjLCBkIGluICgneCcsIDIpLCAoJ3UnLCA0KSwgKCdVJywgNCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFwiICsgYyArICIwIippKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbXFwiICsgYyArICIwIippICsgIl0iKQorICAgICAgICAgICAgICAgIGRhdGEgPSAiW1xcIiArIGMgKyAiMCIqaSArICJdXFwiICsgYyArICIwIippCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoZGF0YSwgImlnbm9yZSIpLCAodSJbXSIsIGxlbihkYXRhKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoZGF0YSwgInJlcGxhY2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1IltcdWZmZmRdXHVmZmZkIiwgbGVuKGRhdGEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkZWNvZGUsIHIiXFUwMDExMDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKHIiXFUwMDExMDAwMCIsICJpZ25vcmUiKSwgKHUiIiwgMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShyIlxVMDAxMTAwMDAiLCAicmVwbGFjZSIpLCAodSJcdWZmZmQiLCAxMCkpCisKKworY2xhc3MgUmF3VW5pY29kZUVzY2FwZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjcy5yYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlKHUiIiksICgiIiwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUoIiIpLCAodSIiLCAwKSkKKworICAgIGRlZiB0ZXN0X3Jhd19lbmNvZGUoc2VsZik6CisgICAgICAgIGVuY29kZSA9IGNvZGVjcy5yYXdfdW5pY29kZV9lc2NhcGVfZW5jb2RlCisgICAgICAgIGZvciBiIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZSh1bmljaHIoYikpLCAoY2hyKGIpLCAxKSkKKworICAgIGRlZiB0ZXN0X3Jhd19kZWNvZGUoc2VsZik6CisgICAgICAgIGRlY29kZSA9IGNvZGVjcy5yYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlCisgICAgICAgIGZvciBiIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShjaHIoYikgKyAnMCcpLCAodW5pY2hyKGIpICsgdScwJywgMikpCisKKyAgICBkZWYgdGVzdF9lc2NhcGVfZW5jb2RlKHNlbGYpOgorICAgICAgICBlbmNvZGUgPSBjb2RlY3MucmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZQorICAgICAgICBjaGVjayA9IGNvZGluZ19jaGVja2VyKHNlbGYsIGVuY29kZSkKKyAgICAgICAgZm9yIGIgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgIGlmIGNocihiKSBub3QgaW4gJ3VVJzoKKyAgICAgICAgICAgICAgICBjaGVjayh1J1xcJyArIHVuaWNocihiKSwgJ1xcJyArIGNocihiKSkKKyAgICAgICAgY2hlY2sodSdcdTIwYWMnLCByJ1x1MjBhYycpCisgICAgICAgIGNoZWNrKHUnXFUwMDAxZDEyMCcsIHInXFUwMDAxZDEyMCcpCisKKyAgICBkZWYgdGVzdF9lc2NhcGVfZGVjb2RlKHNlbGYpOgorICAgICAgICBkZWNvZGUgPSBjb2RlY3MucmF3X3VuaWNvZGVfZXNjYXBlX2RlY29kZQorICAgICAgICBjaGVjayA9IGNvZGluZ19jaGVja2VyKHNlbGYsIGRlY29kZSkKKyAgICAgICAgZm9yIGIgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgIGlmIGNocihiKSBub3QgaW4gJ3VVJzoKKyAgICAgICAgICAgICAgICBjaGVjaygnXFwnICsgY2hyKGIpLCB1J1xcJyArIHVuaWNocihiKSkKKyAgICAgICAgY2hlY2sociJcdTIwYWMiLCB1Ilx1MjBhYyIpCisgICAgICAgIGNoZWNrKHIiXFUwMDAxZDEyMCIsIHUiXFUwMDAxZDEyMCIpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVfZXJyb3JzKHNlbGYpOgorICAgICAgICBkZWNvZGUgPSBjb2RlY3MucmF3X3VuaWNvZGVfZXNjYXBlX2RlY29kZQorICAgICAgICBmb3IgYywgZCBpbiAoJ3UnLCA0KSwgKCdVJywgNCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFwiICsgYyArICIwIippKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbXFwiICsgYyArICIwIippICsgIl0iKQorICAgICAgICAgICAgICAgIGRhdGEgPSAiW1xcIiArIGMgKyAiMCIqaSArICJdXFwiICsgYyArICIwIippCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoZGF0YSwgImlnbm9yZSIpLCAodSJbXSIsIGxlbihkYXRhKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoZGF0YSwgInJlcGxhY2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1IltcdWZmZmRdXHVmZmZkIiwgbGVuKGRhdGEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkZWNvZGUsIHIiXFUwMDExMDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKHIiXFUwMDExMDAwMCIsICJpZ25vcmUiKSwgKHUiIiwgMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShyIlxVMDAxMTAwMDAiLCAicmVwbGFjZSIpLCAodSJcdWZmZmQiLCAxMCkpCisKKworY2xhc3MgQm9tVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc2VlazAoc2VsZik6CisgICAgICAgIGRhdGEgPSB1IjEyMzQ1Njc4OTAiCisgICAgICAgIHRlc3RzID0gKCJ1dGYtMTYiLAorICAgICAgICAgICAgICAgICAidXRmLTE2LWxlIiwKKyAgICAgICAgICAgICAgICAgInV0Zi0xNi1iZSIsCisgICAgICAgICAgICAgICAgICJ1dGYtMzIiLAorICAgICAgICAgICAgICAgICAidXRmLTMyLWxlIiwKKyAgICAgICAgICAgICAgICAgInV0Zi0zMi1iZSIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0X3N1cHBvcnQudW5saW5rLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gdGVzdHM6CisgICAgICAgICAgICAjIENoZWNrIGlmIHRoZSBCT00gaXMgd3JpdHRlbiBvbmx5IG9uY2UKKyAgICAgICAgICAgIHdpdGggY29kZWNzLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3crJywgZW5jb2Rpbmc9ZW5jb2RpbmcpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBkYXRhICogMikKKyAgICAgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBkYXRhICogMikKKworICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBCT00gaXMgd3JpdHRlbiBhZnRlciBhIHNlZWsoMCkKKyAgICAgICAgICAgIHdpdGggY29kZWNzLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3crJywgZW5jb2Rpbmc9ZW5jb2RpbmcpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZi50ZWxsKCksIDApCisgICAgICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGRhdGEpCisKKyAgICAgICAgICAgICMgKFN0cmVhbVdyaXRlcikgQ2hlY2sgdGhhdCB0aGUgQk9NIGlzIHdyaXR0ZW4gYWZ0ZXIgYSBzZWVrKDApCisgICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3KycsIGVuY29kaW5nPWVuY29kaW5nKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGVyLndyaXRlKGRhdGFbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmLndyaXRlci50ZWxsKCksIDApCisgICAgICAgICAgICAgICAgZi53cml0ZXIuc2VlaygwKQorICAgICAgICAgICAgICAgIGYud3JpdGVyLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgZGF0YSkKKworICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBCT00gaXMgbm90IHdyaXR0ZW4gYWZ0ZXIgYSBzZWVrKCkgYXQgYSBwb3NpdGlvbgorICAgICAgICAgICAgIyBkaWZmZXJlbnQgdGhhbiB0aGUgc3RhcnQKKyAgICAgICAgICAgIHdpdGggY29kZWNzLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3crJywgZW5jb2Rpbmc9ZW5jb2RpbmcpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIGYuc2VlayhmLnRlbGwoKSkKKyAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgZGF0YSAqIDIpCisKKyAgICAgICAgICAgICMgKFN0cmVhbVdyaXRlcikgQ2hlY2sgdGhhdCB0aGUgQk9NIGlzIG5vdCB3cml0dGVuIGFmdGVyIGEgc2VlaygpCisgICAgICAgICAgICAjIGF0IGEgcG9zaXRpb24gZGlmZmVyZW50IHRoYW4gdGhlIHN0YXJ0CisgICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3KycsIGVuY29kaW5nPWVuY29kaW5nKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGVyLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgZi53cml0ZXIuc2VlayhmLndyaXRlci50ZWxsKCkpCisgICAgICAgICAgICAgICAgZi53cml0ZXIud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBkYXRhICogMikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgVVRGMzJUZXN0LAorICAgICAgICBVVEYzMkxFVGVzdCwKKyAgICAgICAgVVRGMzJCRVRlc3QsCisgICAgICAgIFVURjE2VGVzdCwKKyAgICAgICAgVVRGMTZMRVRlc3QsCisgICAgICAgIFVURjE2QkVUZXN0LAorICAgICAgICBVVEY4VGVzdCwKKyAgICAgICAgVVRGOFNpZ1Rlc3QsCisgICAgICAgIFVURjdUZXN0LAorICAgICAgICBVVEYxNkV4VGVzdCwKKyAgICAgICAgUmVhZEJ1ZmZlclRlc3QsCisgICAgICAgIENoYXJCdWZmZXJUZXN0LAorICAgICAgICBFc2NhcGVEZWNvZGVUZXN0LAorICAgICAgICBSZWNvZGluZ1Rlc3QsCisgICAgICAgIFB1bnljb2RlVGVzdCwKKyAgICAgICAgVW5pY29kZUludGVybmFsVGVzdCwKKyAgICAgICAgTmFtZXByZXBUZXN0LAorICAgICAgICBJRE5BQ29kZWNUZXN0LAorICAgICAgICBDb2RlY3NNb2R1bGVUZXN0LAorICAgICAgICBTdHJlYW1SZWFkZXJUZXN0LAorICAgICAgICBFbmNvZGVkRmlsZVRlc3QsCisgICAgICAgIFN0cjJTdHJUZXN0LAorICAgICAgICBCYXNpY1VuaWNvZGVUZXN0LAorICAgICAgICBCYXNpY1N0clRlc3QsCisgICAgICAgIENoYXJtYXBUZXN0LAorICAgICAgICBXaXRoU3RtdFRlc3QsCisgICAgICAgIFVuaWNvZGVFc2NhcGVUZXN0LAorICAgICAgICBSYXdVbmljb2RlRXNjYXBlVGVzdCwKKyAgICAgICAgQm9tVGVzdCwKKyAgICApCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5MTE4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5MTE4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZW9wLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZW9wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwY2QzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2Rlb3AucHkKQEAgLTAsMCArMSwzMDQgQEAKKyIiIgorICAgVGVzdCBjYXNlcyBmb3IgY29kZW9wLnB5CisgICBOaWNrIE1hdGhld3NvbgorIiIiCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaXNfanl0aG9uCisKK2Zyb20gY29kZW9wIGltcG9ydCBjb21waWxlX2NvbW1hbmQsIFB5Q0ZfRE9OVF9JTVBMWV9ERURFTlQKKworaWYgaXNfanl0aG9uOgorICAgIGltcG9ydCBzeXMKKyAgICBpbXBvcnQgY1N0cmluZ0lPCisKKyAgICBkZWYgdW5pZnlfY2FsbGFibGVzKGQpOgorICAgICAgICBmb3Igbix2IGluIGQuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGNhbGxhYmxlKHYpOgorICAgICAgICAgICAgICAgIGRbbl0gPSBjYWxsYWJsZQorICAgICAgICByZXR1cm4gZAorCitjbGFzcyBDb2Rlb3BUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgYXNzZXJ0VmFsaWQoc2VsZiwgc3RyLCBzeW1ib2w9J3NpbmdsZScpOgorICAgICAgICAnJydzdWNjZWVkIGlmZiBzdHIgaXMgYSB2YWxpZCBwaWVjZSBvZiBjb2RlJycnCisgICAgICAgIGlmIGlzX2p5dGhvbjoKKyAgICAgICAgICAgIGNvZGUgPSBjb21waWxlX2NvbW1hbmQoc3RyLCAiPGlucHV0PiIsIHN5bWJvbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2RlKQorICAgICAgICAgICAgaWYgc3ltYm9sID09ICJzaW5nbGUiOgorICAgICAgICAgICAgICAgIGQsciA9IHt9LHt9CisgICAgICAgICAgICAgICAgc2F2ZWRfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZXhlYyBjb2RlIGluIGQKKyAgICAgICAgICAgICAgICAgICAgZXhlYyBjb21waWxlKHN0ciwiPGlucHV0PiIsInNpbmdsZSIpIGluIHIKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZWRfc3Rkb3V0CisgICAgICAgICAgICBlbGlmIHN5bWJvbCA9PSAnZXZhbCc6CisgICAgICAgICAgICAgICAgY3R4ID0geydhJzogMn0KKyAgICAgICAgICAgICAgICBkID0geyAndmFsdWUnOiBldmFsKGNvZGUsY3R4KSB9CisgICAgICAgICAgICAgICAgciA9IHsgJ3ZhbHVlJzogZXZhbChzdHIsY3R4KSB9CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWZ5X2NhbGxhYmxlcyhyKSx1bmlmeV9jYWxsYWJsZXMoZCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleHBlY3RlZCA9IGNvbXBpbGUoc3RyLCAiPGlucHV0PiIsIHN5bWJvbCwgUHlDRl9ET05UX0lNUExZX0RFREVOVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGlsZV9jb21tYW5kKHN0ciwgIjxpbnB1dD4iLCBzeW1ib2wpLCBleHBlY3RlZCkKKworICAgIGRlZiBhc3NlcnRJbmNvbXBsZXRlKHNlbGYsIHN0ciwgc3ltYm9sPSdzaW5nbGUnKToKKyAgICAgICAgJycnc3VjY2VlZCBpZmYgc3RyIGlzIHRoZSBzdGFydCBvZiBhIHZhbGlkIHBpZWNlIG9mIGNvZGUnJycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21waWxlX2NvbW1hbmQoc3RyLCBzeW1ib2w9c3ltYm9sKSwgTm9uZSkKKworICAgIGRlZiBhc3NlcnRJbnZhbGlkKHNlbGYsIHN0ciwgc3ltYm9sPSdzaW5nbGUnLCBpc19zeW50YXg9MSk6CisgICAgICAgICcnJ3N1Y2NlZWQgaWZmIHN0ciBpcyB0aGUgc3RhcnQgb2YgYW4gaW52YWxpZCBwaWVjZSBvZiBjb2RlJycnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbXBpbGVfY29tbWFuZChzdHIsc3ltYm9sPXN5bWJvbCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHJhaXNlZCBmb3IgaW52YWxpZCBjb2RlIikKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzX3N5bnRheCkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzX3N5bnRheCkKKworICAgIGRlZiB0ZXN0X3ZhbGlkKHNlbGYpOgorICAgICAgICBhdiA9IHNlbGYuYXNzZXJ0VmFsaWQKKworICAgICAgICAjIHNwZWNpYWwgY2FzZQorICAgICAgICBpZiBub3QgaXNfanl0aG9uOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21waWxlX2NvbW1hbmQoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlKCJwYXNzIiwgIjxpbnB1dD4iLCAnc2luZ2xlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNGX0RPTlRfSU1QTFlfREVERU5UKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGlsZV9jb21tYW5kKCJcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlKCJwYXNzIiwgIjxpbnB1dD4iLCAnc2luZ2xlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNGX0RPTlRfSU1QTFlfREVERU5UKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGF2KCIiKQorICAgICAgICAgICAgYXYoIlxuIikKKworICAgICAgICBhdigiYSA9IDEiKQorICAgICAgICBhdigiXG5hID0gMSIpCisgICAgICAgIGF2KCJhID0gMVxuIikKKyAgICAgICAgYXYoImEgPSAxXG5cbiIpCisgICAgICAgIGF2KCJcblxuYSA9IDFcblxuIikKKworICAgICAgICBhdigiZGVmIHgoKTpcbiAgcGFzc1xuIikKKyAgICAgICAgYXYoImlmIDE6XG4gcGFzc1xuIikKKworICAgICAgICBhdigiXG5cbmlmIDE6IHBhc3NcbiIpCisgICAgICAgIGF2KCJcblxuaWYgMTogcGFzc1xuXG4iKQorCisgICAgICAgIGF2KCJkZWYgeCgpOlxuXG4gcGFzc1xuIikKKyAgICAgICAgYXYoImRlZiB4KCk6XG4gIHBhc3NcbiAgXG4iKQorICAgICAgICBhdigiZGVmIHgoKTpcbiAgcGFzc1xuIFxuIikKKworICAgICAgICBhdigicGFzc1xuIikKKyAgICAgICAgYXYoIjMqKjNcbiIpCisKKyAgICAgICAgYXYoImlmIDk9PTM6XG4gICBwYXNzXG5lbHNlOlxuICAgcGFzc1xuIikKKyAgICAgICAgYXYoImlmIDE6XG4gcGFzc1xuIGlmIDE6XG4gIHBhc3NcbiBlbHNlOlxuICBwYXNzXG4iKQorCisgICAgICAgIGF2KCIjYVxuI2JcbmEgPSAzXG4iKQorICAgICAgICBhdigiI2FcblxuICAgXG5hPTNcbiIpCisgICAgICAgIGF2KCJhPTNcblxuIikKKyAgICAgICAgYXYoImEgPSA5KyBcXFxuMyIpCisKKyAgICAgICAgYXYoIjMqKjMiLCJldmFsIikKKyAgICAgICAgYXYoIihsYW1iZGEgejogXG4geioqMykiLCJldmFsIikKKworICAgICAgICBhdigiOSsgXFxcbjMiLCJldmFsIikKKyAgICAgICAgYXYoIjkrIFxcXG4zXG4iLCJldmFsIikKKworICAgICAgICBhdigiXG5cbmEqKjMiLCJldmFsIikKKyAgICAgICAgYXYoIlxuIFxuYSoqMyIsImV2YWwiKQorICAgICAgICBhdigiI2FcbiNiXG5hKiozIiwiZXZhbCIpCisKKyAgICAgICAgYXYoIlxuXG5hID0gMVxuXG4iKQorICAgICAgICBhdigiXG5cbmlmIDE6IGE9MVxuXG4iKQorCisgICAgICAgIGF2KCJpZiAxOlxuIHBhc3NcbiBpZiAxOlxuICBwYXNzXG4gZWxzZTpcbiAgcGFzc1xuIikKKyAgICAgICAgYXYoIiNhXG5cbiAgIFxuYT0zXG5cbiIpCisKKyAgICAgICAgYXYoIlxuXG5hKiozIiwiZXZhbCIpCisgICAgICAgIGF2KCJcbiBcbmEqKjMiLCJldmFsIikKKyAgICAgICAgYXYoIiNhXG4jYlxuYSoqMyIsImV2YWwiKQorCisgICAgICAgIGF2KCJkZWYgZigpOlxuIHRyeTogcGFzc1xuIGZpbmFsbHk6IFt4IGZvciB4IGluICgxLDIpXVxuIikKKyAgICAgICAgYXYoImRlZiBmKCk6XG4gcGFzc1xuI2Zvb1xuIikKKyAgICAgICAgYXYoIkBhLmIuY1xuZGVmIGYoKTpcbiBwYXNzXG4iKQorCisgICAgZGVmIHRlc3RfaW5jb21wbGV0ZShzZWxmKToKKyAgICAgICAgYWkgPSBzZWxmLmFzc2VydEluY29tcGxldGUKKworICAgICAgICBhaSgiKGEgKioiKQorICAgICAgICBhaSgiKGEsYiwiKQorICAgICAgICBhaSgiKGEsYiwoIikKKyAgICAgICAgYWkoIihhLGIsKCIpCisgICAgICAgIGFpKCJhID0gKCIpCisgICAgICAgIGFpKCJhID0geyIpCisgICAgICAgIGFpKCJiICsgeyIpCisKKyAgICAgICAgYWkoImlmIDk9PTM6XG4gICBwYXNzXG5lbHNlOiIpCisgICAgICAgIGFpKCJpZiA5PT0zOlxuICAgcGFzc1xuZWxzZTpcbiIpCisgICAgICAgIGFpKCJpZiA5PT0zOlxuICAgcGFzc1xuZWxzZTpcbiAgIHBhc3MiKQorICAgICAgICBhaSgiaWYgMToiKQorICAgICAgICBhaSgiaWYgMTpcbiIpCisgICAgICAgIGFpKCJpZiAxOlxuIHBhc3NcbiBpZiAxOlxuICBwYXNzXG4gZWxzZToiKQorICAgICAgICBhaSgiaWYgMTpcbiBwYXNzXG4gaWYgMTpcbiAgcGFzc1xuIGVsc2U6XG4iKQorICAgICAgICBhaSgiaWYgMTpcbiBwYXNzXG4gaWYgMTpcbiAgcGFzc1xuIGVsc2U6XG4gIHBhc3MiKQorCisgICAgICAgIGFpKCJkZWYgeCgpOiIpCisgICAgICAgIGFpKCJkZWYgeCgpOlxuIikKKyAgICAgICAgYWkoImRlZiB4KCk6XG5cbiIpCisKKyAgICAgICAgYWkoImRlZiB4KCk6XG4gIHBhc3MiKQorICAgICAgICBhaSgiZGVmIHgoKTpcbiAgcGFzc1xuICIpCisgICAgICAgIGFpKCJkZWYgeCgpOlxuICBwYXNzXG4gICIpCisgICAgICAgIGFpKCJcblxuZGVmIHgoKTpcbiAgcGFzcyIpCisKKyAgICAgICAgYWkoImEgPSA5KyBcXCIpCisgICAgICAgIGFpKCJhID0gJ2FcXCIpCisgICAgICAgIGFpKCJhID0gJycneHkiKQorCisgICAgICAgIGFpKCIiLCJldmFsIikKKyAgICAgICAgYWkoIlxuIiwiZXZhbCIpCisgICAgICAgIGFpKCIoIiwiZXZhbCIpCisgICAgICAgIGFpKCIoXG5cblxuIiwiZXZhbCIpCisgICAgICAgIGFpKCIoOSsiLCJldmFsIikKKyAgICAgICAgYWkoIjkrIFxcIiwiZXZhbCIpCisgICAgICAgIGFpKCJsYW1iZGEgejogXFwiLCJldmFsIikKKworICAgICAgICBhaSgiaWYgVHJ1ZTpcbiBpZiBUcnVlOlxuICBpZiBUcnVlOiAgIFxuIikKKworICAgICAgICBhaSgiQGEoIikKKyAgICAgICAgYWkoIkBhKGIiKQorICAgICAgICBhaSgiQGEoYiwiKQorICAgICAgICBhaSgiQGEoYixjIikKKyAgICAgICAgYWkoIkBhKGIsYywiKQorCisgICAgICAgIGFpKCJmcm9tIGEgaW1wb3J0ICgiKQorICAgICAgICBhaSgiZnJvbSBhIGltcG9ydCAoYiIpCisgICAgICAgIGFpKCJmcm9tIGEgaW1wb3J0IChiLCIpCisgICAgICAgIGFpKCJmcm9tIGEgaW1wb3J0IChiLGMiKQorICAgICAgICBhaSgiZnJvbSBhIGltcG9ydCAoYixjLCIpCisKKyAgICAgICAgYWkoIlsiKTsKKyAgICAgICAgYWkoIlthIik7CisgICAgICAgIGFpKCJbYSwiKTsKKyAgICAgICAgYWkoIlthLGIiKTsKKyAgICAgICAgYWkoIlthLGIsIik7CisKKyAgICAgICAgYWkoInsiKTsKKyAgICAgICAgYWkoInthIik7CisgICAgICAgIGFpKCJ7YToiKTsKKyAgICAgICAgYWkoInthOmIiKTsKKyAgICAgICAgYWkoInthOmIsIik7CisgICAgICAgIGFpKCJ7YTpiLGMiKTsKKyAgICAgICAgYWkoInthOmIsYzoiKTsKKyAgICAgICAgYWkoInthOmIsYzpkIik7CisgICAgICAgIGFpKCJ7YTpiLGM6ZCwiKTsKKworICAgICAgICBhaSgiYSgiKQorICAgICAgICBhaSgiYShiIikKKyAgICAgICAgYWkoImEoYiwiKQorICAgICAgICBhaSgiYShiLGMiKQorICAgICAgICBhaSgiYShiLGMsIikKKworICAgICAgICBhaSgiYVsiKQorICAgICAgICBhaSgiYVtiIikKKyAgICAgICAgYWkoImFbYiwiKQorICAgICAgICBhaSgiYVtiOiIpCisgICAgICAgIGFpKCJhW2I6YyIpCisgICAgICAgIGFpKCJhW2I6YzoiKQorICAgICAgICBhaSgiYVtiOmM6ZCIpCisKKyAgICAgICAgYWkoImRlZiBhKCIpCisgICAgICAgIGFpKCJkZWYgYShiIikKKyAgICAgICAgYWkoImRlZiBhKGIsIikKKyAgICAgICAgYWkoImRlZiBhKGIsYyIpCisgICAgICAgIGFpKCJkZWYgYShiLGMsIikKKworICAgICAgICBhaSgiKCIpCisgICAgICAgIGFpKCIoYSIpCisgICAgICAgIGFpKCIoYSwiKQorICAgICAgICBhaSgiKGEsYiIpCisgICAgICAgIGFpKCIoYSxiLCIpCisKKyAgICAgICAgYWkoImlmIGE6XG4gcGFzc1xuZWxpZiBiOiIpCisgICAgICAgIGFpKCJpZiBhOlxuIHBhc3NcbmVsaWYgYjpcbiBwYXNzXG5lbHNlOiIpCisKKyAgICAgICAgYWkoIndoaWxlIGE6IikKKyAgICAgICAgYWkoIndoaWxlIGE6XG4gcGFzc1xuZWxzZToiKQorCisgICAgICAgIGFpKCJmb3IgYSBpbiBiOiIpCisgICAgICAgIGFpKCJmb3IgYSBpbiBiOlxuIHBhc3NcbmVsc2U6IikKKworICAgICAgICBhaSgidHJ5OiIpCisgICAgICAgIGFpKCJ0cnk6XG4gcGFzc1xuZXhjZXB0OiIpCisgICAgICAgIGFpKCJ0cnk6XG4gcGFzc1xuZmluYWxseToiKQorICAgICAgICBhaSgidHJ5OlxuIHBhc3NcbmV4Y2VwdDpcbiBwYXNzXG5maW5hbGx5OiIpCisKKyAgICAgICAgYWkoIndpdGggYToiKQorICAgICAgICBhaSgid2l0aCBhIGFzIGI6IikKKworICAgICAgICBhaSgiY2xhc3MgYToiKQorICAgICAgICBhaSgiY2xhc3MgYSgiKQorICAgICAgICBhaSgiY2xhc3MgYShiIikKKyAgICAgICAgYWkoImNsYXNzIGEoYiwiKQorICAgICAgICBhaSgiY2xhc3MgYSgpOiIpCisKKyAgICAgICAgYWkoIlt4IGZvciIpCisgICAgICAgIGFpKCJbeCBmb3IgeCBpbiIpCisgICAgICAgIGFpKCJbeCBmb3IgeCBpbiAoIikKKworICAgICAgICBhaSgiKHggZm9yIikKKyAgICAgICAgYWkoIih4IGZvciB4IGluIikKKyAgICAgICAgYWkoIih4IGZvciB4IGluICgiKQorCisgICAgZGVmIHRlc3RfaW52YWxpZChzZWxmKToKKyAgICAgICAgYWkgPSBzZWxmLmFzc2VydEludmFsaWQKKyAgICAgICAgYWkoImEgYiIpCisKKyAgICAgICAgYWkoImEgQCIpCisgICAgICAgIGFpKCJhIGIgQCIpCisgICAgICAgIGFpKCJhICoqIEAiKQorCisgICAgICAgIGFpKCJhID0gIikKKyAgICAgICAgYWkoImEgPSA5ICsiKQorCisgICAgICAgIGFpKCJkZWYgeCgpOlxuXG5wYXNzXG4iKQorCisgICAgICAgIGFpKCJcblxuIGlmIDE6IHBhc3NcblxucGFzcyIpCisKKyAgICAgICAgYWkoImEgPSA5KyBcXFxuIikKKyAgICAgICAgYWkoImEgPSAnYVxcICIpCisgICAgICAgIGFpKCJhID0gJ2FcXFxuIikKKworICAgICAgICBhaSgiYSA9IDEiLCJldmFsIikKKyAgICAgICAgYWkoImEgPSAoIiwiZXZhbCIpCisgICAgICAgIGFpKCJdIiwiZXZhbCIpCisgICAgICAgIGFpKCIoKSkiLCJldmFsIikKKyAgICAgICAgYWkoIlt9IiwiZXZhbCIpCisgICAgICAgIGFpKCI5KyIsImV2YWwiKQorICAgICAgICBhaSgibGFtYmRhIHo6IiwiZXZhbCIpCisgICAgICAgIGFpKCJhIGIiLCJldmFsIikKKworICAgICAgICBhaSgicmV0dXJuIDIuMyIpCisgICAgICAgIGFpKCJpZiAoYSA9PSAxIGFuZCBiID0gMik6IHBhc3MiKQorCisgICAgICAgIGFpKCJkZWwgMSIpCisgICAgICAgIGFpKCJkZWwgKCkiKQorICAgICAgICBhaSgiZGVsICgxLCkiKQorICAgICAgICBhaSgiZGVsIFsxXSIpCisgICAgICAgIGFpKCJkZWwgJzEnIikKKworICAgICAgICBhaSgiW2kgZm9yIGkgaW4gcmFuZ2UoMTApXSA9ICgxLCAyLCAzKSIpCisKKyAgICBkZWYgdGVzdF9maWxlbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21waWxlX2NvbW1hbmQoImEgPSAxXG4iLCAiYWJjIikuY29fZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZSgiYSA9IDFcbiIsICJhYmMiLCAnc2luZ2xlJykuY29fZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoY29tcGlsZV9jb21tYW5kKCJhID0gMVxuIiwgImFiYyIpLmNvX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUoImEgPSAxXG4iLCAiZGVmIiwgJ3NpbmdsZScpLmNvX2ZpbGVuYW1lKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoQ29kZW9wVGVzdHMpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZW9wLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVvcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFiODM3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVvcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZW9wLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVvcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFiODM3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVvcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kaW5nLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNWRkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RpbmcucHkKQEAgLTAsMCArMSwzNyBAQAorCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQsIHVuaXR0ZXN0CitpbXBvcnQgb3MKKworY2xhc3MgQ29kaW5nVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYmFkX2NvZGluZyhzZWxmKToKKyAgICAgICAgbW9kdWxlX25hbWUgPSAnYmFkX2NvZGluZycKKyAgICAgICAgc2VsZi52ZXJpZnlfYmFkX21vZHVsZShtb2R1bGVfbmFtZSkKKworICAgIGRlZiB0ZXN0X2JhZF9jb2RpbmcyKHNlbGYpOgorICAgICAgICBtb2R1bGVfbmFtZSA9ICdiYWRfY29kaW5nMicKKyAgICAgICAgc2VsZi52ZXJpZnlfYmFkX21vZHVsZShtb2R1bGVfbmFtZSkKKworICAgIGRlZiB2ZXJpZnlfYmFkX21vZHVsZShzZWxmLCBtb2R1bGVfbmFtZSk6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBfX2ltcG9ydF9fLCAndGVzdC4nICsgbW9kdWxlX25hbWUpCisKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ocGF0aCwgbW9kdWxlX25hbWUgKyAnLnB5JykKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmcDoKKyAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGUsIHRleHQsIGZpbGVuYW1lLCAnZXhlYycpCisKKyAgICBkZWYgdGVzdF9lcnJvcl9mcm9tX3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTYyODkKKyAgICAgICAgaW5wdXQgPSB1IiMgY29kaW5nOiBhc2NpaVxuXE57U05PV01BTn0iLmVuY29kZSgndXRmLTgnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yKSBhcyBjOgorICAgICAgICAgICAgY29tcGlsZShpbnB1dCwgIjxzdHJpbmc+IiwgImV4ZWMiKQorICAgICAgICBleHBlY3RlZCA9ICInYXNjaWknIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4ZTIgaW4gcG9zaXRpb24gMTY6ICIgXAorICAgICAgICAgICAgICAgICAgICJvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoYy5leGNlcHRpb24uYXJnc1swXS5zdGFydHN3aXRoKGV4cGVjdGVkKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENvZGluZ1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGluZy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYWQ4YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGluZy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYWQ4YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZXJjaW9uLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29lcmNpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1NWM0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZXJjaW9uLnB5CkBAIC0wLDAgKzEsMzQ4IEBACitpbXBvcnQgY29weQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIFRlc3RGYWlsZWQsIGNoZWNrX3dhcm5pbmdzCisKKworIyBGYWtlIGEgbnVtYmVyIHRoYXQgaW1wbGVtZW50cyBudW1lcmljIG1ldGhvZHMgdGhyb3VnaCBfX2NvZXJjZV9fCitjbGFzcyBDb2VyY2VOdW1iZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuYXJnID0gYXJnCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPENvZXJjZU51bWJlciAlcz4nICUgcmVwcihzZWxmLmFyZykKKworICAgIGRlZiBfX2NvZXJjZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgQ29lcmNlTnVtYmVyKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFyZywgb3RoZXIuYXJnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKHNlbGYuYXJnLCBvdGhlcikKKworIyBOZXctc3R5bGUgY2xhc3MgdmVyc2lvbiBvZiBDb2VyY2VOdW1iZXIKK2NsYXNzIENvZXJjZVRvKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuYXJnID0gYXJnCisgICAgZGVmIF9fY29lcmNlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBDb2VyY2VUbyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hcmcsIG90aGVyLmFyZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXJnLCBvdGhlcgorCisKKyMgRmFrZSBhIG51bWJlciB0aGF0IGltcGxlbWVudHMgbnVtZXJpYyBvcHMgdGhyb3VnaCBtZXRob2RzLgorY2xhc3MgTWV0aG9kTnVtYmVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLGFyZyk6CisgICAgICAgIHNlbGYuYXJnID0gYXJnCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPE1ldGhvZE51bWJlciAlcz4nICUgcmVwcihzZWxmLmFyZykKKworICAgIGRlZiBfX2FkZF9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5hcmcgKyBvdGhlcgorCisgICAgZGVmIF9fcmFkZF9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gb3RoZXIgKyBzZWxmLmFyZworCisgICAgZGVmIF9fc3ViX18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmFyZyAtIG90aGVyCisKKyAgICBkZWYgX19yc3ViX18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBvdGhlciAtIHNlbGYuYXJnCisKKyAgICBkZWYgX19tdWxfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXJnICogb3RoZXIKKworICAgIGRlZiBfX3JtdWxfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIG90aGVyICogc2VsZi5hcmcKKworICAgIGRlZiBfX2Rpdl9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5hcmcgLyBvdGhlcgorCisgICAgZGVmIF9fcmRpdl9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gb3RoZXIgLyBzZWxmLmFyZworCisgICAgZGVmIF9fdHJ1ZWRpdl9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5hcmcgLyBvdGhlcgorCisgICAgZGVmIF9fcnRydWVkaXZfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIG90aGVyIC8gc2VsZi5hcmcKKworICAgIGRlZiBfX2Zsb29yZGl2X18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmFyZyAvLyBvdGhlcgorCisgICAgZGVmIF9fcmZsb29yZGl2X18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBvdGhlciAvLyBzZWxmLmFyZworCisgICAgZGVmIF9fcG93X18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmFyZyAqKiBvdGhlcgorCisgICAgZGVmIF9fcnBvd19fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gb3RoZXIgKiogc2VsZi5hcmcKKworICAgIGRlZiBfX21vZF9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5hcmcgJSBvdGhlcgorCisgICAgZGVmIF9fcm1vZF9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gb3RoZXIgJSBzZWxmLmFyZworCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gY21wKHNlbGYuYXJnLCBvdGhlcikKKworCitjYW5kaWRhdGVzID0gWzIsIDJMLCA0LjAsIDIrMGosIFsxXSwgKDIsKSwgTm9uZSwKKyAgICAgICAgICAgICAgTWV0aG9kTnVtYmVyKDIpLCBDb2VyY2VOdW1iZXIoMildCisKK2luZml4X2Jpbm9wcyA9IFsgJysnLCAnLScsICcqJywgJyoqJywgJyUnLCAnLy8nLCAnLycgXQorCitURSA9IFR5cGVFcnJvcgorIyBiID0gYm90aCBub3JtYWwgYW5kIGF1Z21lbnRlZCBnaXZlIHNhbWUgcmVzdWx0IGxpc3QKKyMgcyA9IHNpbmdsZSByZXN1bHQgbGlzdHMgZm9yIG5vcm1hbCBhbmQgYXVnbWVudGVkCisjIGUgPSBlcXVhbHMgb3RoZXIgcmVzdWx0cworIyByZXN1bHQgbGlzdHM6IFsnKycsICctJywgJyonLCAnKionLCAnJScsICcvLycsICgnY2xhc3NpYyAvJywgJ25ldyAvJyldCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi10dXBsZSBpZiByZXN1bHRzIGRpZmZlcgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIG9ubHkgb25lIHZhbHVlCitpbmZpeF9yZXN1bHRzID0geworICAgICMgMgorICAgICgwLDApOiAoJ2InLCBbNCwgMCwgNCwgNCwgMCwgMSwgKDEsIDEuMCldKSwKKyAgICAoMCwxKTogKCdlJywgKDAsMCkpLAorICAgICgwLDIpOiAoJ2InLCBbNi4wLCAtMi4wLCA4LjAsIDE2LjAsIDIuMCwgMC4wLCAwLjVdKSwKKyAgICAoMCwzKTogKCdiJywgWzQrMGosIDArMGosIDQrMGosIDQrMGosIDArMGosIDErMGosIDErMGpdKSwKKyAgICAoMCw0KTogKCdiJywgW1RFLCBURSwgWzEsIDFdLCBURSwgVEUsIFRFLCBURV0pLAorICAgICgwLDUpOiAoJ2InLCBbVEUsIFRFLCAoMiwgMiksIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDAsNik6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICgwLDcpOiAoJ2UnLCAoMCwwKSksCisgICAgKDAsOCk6ICgnZScsICgwLDApKSwKKworICAgICMgMkwKKyAgICAoMSwwKTogKCdlJywgKDAsMCkpLAorICAgICgxLDEpOiAoJ2UnLCAoMCwxKSksCisgICAgKDEsMik6ICgnZScsICgwLDIpKSwKKyAgICAoMSwzKTogKCdlJywgKDAsMykpLAorICAgICgxLDQpOiAoJ2UnLCAoMCw0KSksCisgICAgKDEsNSk6ICgnZScsICgwLDUpKSwKKyAgICAoMSw2KTogKCdlJywgKDAsNikpLAorICAgICgxLDcpOiAoJ2UnLCAoMCw3KSksCisgICAgKDEsOCk6ICgnZScsICgwLDgpKSwKKworICAgICMgNC4wCisgICAgKDIsMCk6ICgnYicsIFs2LjAsIDIuMCwgOC4wLCAxNi4wLCAwLjAsIDIuMCwgMi4wXSksCisgICAgKDIsMSk6ICgnZScsICgyLDApKSwKKyAgICAoMiwyKTogKCdiJywgWzguMCwgMC4wLCAxNi4wLCAyNTYuMCwgMC4wLCAxLjAsIDEuMF0pLAorICAgICgyLDMpOiAoJ2InLCBbNiswaiwgMiswaiwgOCswaiwgMTYrMGosIDArMGosIDIrMGosIDIrMGpdKSwKKyAgICAoMiw0KTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDIsNSk6ICgnZScsICgyLDQpKSwKKyAgICAoMiw2KTogKCdlJywgKDIsNCkpLAorICAgICgyLDcpOiAoJ2UnLCAoMiwwKSksCisgICAgKDIsOCk6ICgnZScsICgyLDApKSwKKworICAgICMgKDIrMGopCisgICAgKDMsMCk6ICgnYicsIFs0KzBqLCAwKzBqLCA0KzBqLCA0KzBqLCAwKzBqLCAxKzBqLCAxKzBqXSksCisgICAgKDMsMSk6ICgnZScsICgzLDApKSwKKyAgICAoMywyKTogKCdiJywgWzYrMGosIC0yKzBqLCA4KzBqLCAxNiswaiwgMiswaiwgMCswaiwgMC41KzBqXSksCisgICAgKDMsMyk6ICgnYicsIFs0KzBqLCAwKzBqLCA0KzBqLCA0KzBqLCAwKzBqLCAxKzBqLCAxKzBqXSksCisgICAgKDMsNCk6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICgzLDUpOiAoJ2UnLCAoMyw0KSksCisgICAgKDMsNik6ICgnZScsICgzLDQpKSwKKyAgICAoMyw3KTogKCdlJywgKDMsMCkpLAorICAgICgzLDgpOiAoJ2UnLCAoMywwKSksCisKKyAgICAjIFsxXQorICAgICg0LDApOiAoJ2InLCBbVEUsIFRFLCBbMSwgMV0sIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsMSk6ICgnZScsICg0LDApKSwKKyAgICAoNCwyKTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsMyk6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg0LDQpOiAoJ2InLCBbWzEsIDFdLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsNSk6ICgncycsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0sIFtbMSwgMl0sIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNCw2KTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsNyk6ICgnZScsICg0LDApKSwKKyAgICAoNCw4KTogKCdlJywgKDQsMCkpLAorCisgICAgIyAoMiwpCisgICAgKDUsMCk6ICgnYicsIFtURSwgVEUsICgyLCAyKSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNSwxKTogKCdlJywgKDUsMCkpLAorICAgICg1LDIpOiAoJ2InLCBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNSwzKTogKCdlJywgKDUsMikpLAorICAgICg1LDQpOiAoJ2UnLCAoNSwyKSksCisgICAgKDUsNSk6ICgnYicsIFsoMiwgMiksIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNSw2KTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDUsNyk6ICgnZScsICg1LDApKSwKKyAgICAoNSw4KTogKCdlJywgKDUsMCkpLAorCisgICAgIyBOb25lCisgICAgKDYsMCk6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg2LDEpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsMik6ICgnZScsICg2LDApKSwKKyAgICAoNiwzKTogKCdlJywgKDYsMCkpLAorICAgICg2LDQpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsNSk6ICgnZScsICg2LDApKSwKKyAgICAoNiw2KTogKCdlJywgKDYsMCkpLAorICAgICg2LDcpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsOCk6ICgnZScsICg2LDApKSwKKworICAgICMgTWV0aG9kTnVtYmVyKDIpCisgICAgKDcsMCk6ICgnZScsICgwLDApKSwKKyAgICAoNywxKTogKCdlJywgKDAsMSkpLAorICAgICg3LDIpOiAoJ2UnLCAoMCwyKSksCisgICAgKDcsMyk6ICgnZScsICgwLDMpKSwKKyAgICAoNyw0KTogKCdlJywgKDAsNCkpLAorICAgICg3LDUpOiAoJ2UnLCAoMCw1KSksCisgICAgKDcsNik6ICgnZScsICgwLDYpKSwKKyAgICAoNyw3KTogKCdlJywgKDAsNykpLAorICAgICg3LDgpOiAoJ2UnLCAoMCw4KSksCisKKyAgICAjIENvZXJjZU51bWJlcigyKQorICAgICg4LDApOiAoJ2UnLCAoMCwwKSksCisgICAgKDgsMSk6ICgnZScsICgwLDEpKSwKKyAgICAoOCwyKTogKCdlJywgKDAsMikpLAorICAgICg4LDMpOiAoJ2UnLCAoMCwzKSksCisgICAgKDgsNCk6ICgnZScsICgwLDQpKSwKKyAgICAoOCw1KTogKCdlJywgKDAsNSkpLAorICAgICg4LDYpOiAoJ2UnLCAoMCw2KSksCisgICAgKDgsNyk6ICgnZScsICgwLDcpKSwKKyAgICAoOCw4KTogKCdlJywgKDAsOCkpLAorfQorCitkZWYgcHJvY2Vzc19pbmZpeF9yZXN1bHRzKCk6CisgICAgZm9yIGtleSBpbiBzb3J0ZWQoaW5maXhfcmVzdWx0cyk6CisgICAgICAgIHZhbCA9IGluZml4X3Jlc3VsdHNba2V5XQorICAgICAgICBpZiB2YWxbMF0gPT0gJ2UnOgorICAgICAgICAgICAgaW5maXhfcmVzdWx0c1trZXldID0gaW5maXhfcmVzdWx0c1t2YWxbMV1dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB2YWxbMF0gPT0gJ3MnOgorICAgICAgICAgICAgICAgIHJlcyA9ICh2YWxbMV0sIHZhbFsyXSkKKyAgICAgICAgICAgIGVsaWYgdmFsWzBdID09ICdiJzoKKyAgICAgICAgICAgICAgICByZXMgPSAodmFsWzFdLCB2YWxbMV0pCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlc1tpXVs2XSwgdHVwbGUpOgorICAgICAgICAgICAgICAgICAgICBpZiAxLzIgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdGVzdGluZyB3aXRoIGNsYXNzaWMgKGZsb29yKSBkaXZpc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2ldWzZdID0gcmVzW2ldWzZdWzBdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3Rpbmcgd2l0aCAtUW5ldworICAgICAgICAgICAgICAgICAgICAgICAgcmVzW2ldWzZdID0gcmVzW2ldWzZdWzFdCisgICAgICAgICAgICBpbmZpeF9yZXN1bHRzW2tleV0gPSByZXMKKworCit3aXRoIGNoZWNrX3dhcm5pbmdzKCgiY2xhc3NpYyAoaW50fGxvbmcpIGRpdmlzaW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgcXVpZXQ9VHJ1ZSk6CisgICAgcHJvY2Vzc19pbmZpeF9yZXN1bHRzKCkKKyAgICAjIG5vdyBpbmZpeF9yZXN1bHRzIGhhcyB0d28gbGlzdHMgb2YgcmVzdWx0cyBmb3IgZXZlcnkgcGFpcmluZy4KKworcHJlZml4X2Jpbm9wcyA9IFsgJ2Rpdm1vZCcgXQorcHJlZml4X3Jlc3VsdHMgPSBbCisgICAgWygxLDApLCAoMUwsMEwpLCAoMC4wLDIuMCksICgoMSswaiksMGopLCBURSwgVEUsIFRFLCBURSwgKDEsMCldLAorICAgIFsoMUwsMEwpLCAoMUwsMEwpLCAoMC4wLDIuMCksICgoMSswaiksMGopLCBURSwgVEUsIFRFLCBURSwgKDFMLDBMKV0sCisgICAgWygyLjAsMC4wKSwgKDIuMCwwLjApLCAoMS4wLDAuMCksICgoMiswaiksMGopLCBURSwgVEUsIFRFLCBURSwgKDIuMCwwLjApXSwKKyAgICBbKCgxKzBqKSwwaiksICgoMSswaiksMGopLCAoMGosKDIrMGopKSwgKCgxKzBqKSwwaiksIFRFLCBURSwgVEUsIFRFLCAoKDErMGopLDBqKV0sCisgICAgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdLAorICAgIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSwKKyAgICBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0sCisgICAgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdLAorICAgIFsoMSwwKSwgKDFMLDBMKSwgKDAuMCwyLjApLCAoKDErMGopLDBqKSwgVEUsIFRFLCBURSwgVEUsICgxLDApXQorXQorCitkZWYgZm9ybWF0X2Zsb2F0KHZhbHVlKToKKyAgICBpZiBhYnModmFsdWUpIDwgMC4wMToKKyAgICAgICAgcmV0dXJuICcwLjAnCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICclLjFmJyAlIHZhbHVlCisKKyMgYXZvaWQgdGVzdGluZyBwbGF0Zm9ybSBmcCBxdWlya3MKK2RlZiBmb3JtYXRfcmVzdWx0KHZhbHVlKToKKyAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBjb21wbGV4KToKKyAgICAgICAgcmV0dXJuICcoJXMgKyAlc2opJyAlIChmb3JtYXRfZmxvYXQodmFsdWUucmVhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X2Zsb2F0KHZhbHVlLmltYWcpKQorICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZmxvYXQpOgorICAgICAgICByZXR1cm4gZm9ybWF0X2Zsb2F0KHZhbHVlKQorICAgIHJldHVybiBzdHIodmFsdWUpCisKK2NsYXNzIENvZXJjaW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfaW5maXhfYmlub3BzKHNlbGYpOgorICAgICAgICBmb3IgaWEsIGEgaW4gZW51bWVyYXRlKGNhbmRpZGF0ZXMpOgorICAgICAgICAgICAgZm9yIGliLCBiIGluIGVudW1lcmF0ZShjYW5kaWRhdGVzKToKKyAgICAgICAgICAgICAgICByZXN1bHRzID0gaW5maXhfcmVzdWx0c1soaWEsIGliKV0KKyAgICAgICAgICAgICAgICBmb3Igb3AsIHJlcywgaXJlcyBpbiB6aXAoaW5maXhfYmlub3BzLCByZXN1bHRzWzBdLCByZXN1bHRzWzFdKToKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzIGlzIFRFOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EgJXMgYicgJSBvcCwgeydhJzogYSwgJ2InOiBifSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0X3Jlc3VsdChyZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfcmVzdWx0KGV2YWwoJ2EgJXMgYicgJSBvcCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMgJXMgJXMgPT0gJXMgZmFpbGVkJyAlIChhLCBvcCwgYiwgcmVzKSkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgeiA9IGNvcHkuY29weShhKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgY29weS5FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHogPSBhICMgYXNzdW1lIGl0IGhhcyBubyBpbnBsYWNlIG9wcworICAgICAgICAgICAgICAgICAgICBpZiBpcmVzIGlzIFRFOgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMgJ3ogJXM9IGInICUgb3AKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlR5cGVFcnJvciBub3QgcmFpc2VkIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMoJ3ogJXM9IGInICUgb3ApCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlyZXMsIHopCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfYmlub3BzKHNlbGYpOgorICAgICAgICBmb3IgaWEsIGEgaW4gZW51bWVyYXRlKGNhbmRpZGF0ZXMpOgorICAgICAgICAgICAgZm9yIGliLCBiIGluIGVudW1lcmF0ZShjYW5kaWRhdGVzKToKKyAgICAgICAgICAgICAgICBmb3Igb3AgaW4gcHJlZml4X2Jpbm9wczoKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gcHJlZml4X3Jlc3VsdHNbaWFdW2liXQorICAgICAgICAgICAgICAgICAgICBpZiByZXMgaXMgVEU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMoYSwgYiknICUgb3AsIHsnYSc6IGEsICdiJzogYn0pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdF9yZXN1bHQocmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3Jlc3VsdChldmFsKCclcyhhLCBiKScgJSBvcCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMoJXMsICVzKSA9PSAlcyBmYWlsZWQnICUgKG9wLCBhLCBiLCByZXMpKQorCisgICAgZGVmIHRlc3RfY21wdHlwZXMoc2VsZik6CisgICAgICAgICMgQnVpbHQtaW4gdHBfY29tcGFyZSBzbG90cyBleHBlY3QgdGhlaXIgYXJndW1lbnRzIHRvIGhhdmUgdGhlCisgICAgICAgICMgc2FtZSB0eXBlLCBidXQgYSB1c2VyLWRlZmluZWQgX19jb2VyY2VfXyBkb2Vzbid0IGhhdmUgdG8gb2JleS4KKyAgICAgICAgIyBTRiAjOTgwMzUyCisgICAgICAgIGV2aWxfY29lcmNlciA9IENvZXJjZVRvKDQyKQorICAgICAgICAjIE1ha2Ugc3VyZSB0aGVzZSBkb24ndCBjcmFzaCBhbnkgbW9yZQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGNtcCh1J2Zpc2gnLCBldmlsX2NvZXJjZXIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGNtcChzbGljZSgxKSwgZXZpbF9jb2VyY2VyKSwgMCkKKyAgICAgICAgIyAuLi5idXQgdGhhdCB0aGlzIHN0aWxsIHdvcmtzCisgICAgICAgIGNsYXNzIFdhY2t5Q29tcGFyZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvdGhlciA9PSA0MiwgJ2V4cGVjdGVkIGV2aWxfY29lcmNlciwgZ290ICVyJyAlIG90aGVyKQorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgIyBJbnZhbGlkIGNtcCBtYWtlcyB0aGlzIHVuaGFzaGFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoV2Fja3lDb21wYXJlcigpLCBldmlsX2NvZXJjZXIpLCAwKQorICAgICAgICAjIC4uLmFuZCBjbGFzc2ljIGNsYXNzZXMgdG9vLCBzaW5jZSB0aGF0IGNvZGUgcGF0aCBpcyBhIGxpdHRsZSBkaWZmZXJlbnQKKyAgICAgICAgY2xhc3MgQ2xhc3NpY1dhY2t5Q29tcGFyZXI6CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3RoZXIgPT0gNDIsICdleHBlY3RlZCBldmlsX2NvZXJjZXIsIGdvdCAlcicgJSBvdGhlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChDbGFzc2ljV2Fja3lDb21wYXJlcigpLCBldmlsX2NvZXJjZXIpLCAwKQorCisgICAgZGVmIHRlc3RfaW5maW5pdGVfcmVjX2NsYXNzaWNfY2xhc3NlcyhzZWxmKToKKyAgICAgICAgIyBpZiBfX2NvZXJjZV9fKCkgcmV0dXJucyBpdHMgYXJndW1lbnRzIHJldmVyc2VkIGl0IGNhdXNlcyBhbiBpbmZpbml0ZQorICAgICAgICAjIHJlY3Vyc2lvbiBmb3IgY2xhc3NpYyBjbGFzc2VzLgorICAgICAgICBjbGFzcyBUZXN0ZXI6CisgICAgICAgICAgICBkZWYgX19jb2VyY2VfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyLCBzZWxmCisKKyAgICAgICAgZXhjID0gVGVzdEZhaWxlZCgiX19jb2VyY2VfXygpIHJldHVybmluZyBpdHMgYXJndW1lbnRzIHJldmVyc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIHJhaXNlIFJ1bnRpbWVFcnJvciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFRlc3RlcigpICsgMQorICAgICAgICBleGNlcHQgKFJ1bnRpbWVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByYWlzZSBleGMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIGV4YworCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCBjaGVja193YXJuaW5ncygoImNvbXBsZXggZGl2bW9kLi4sIC8vIGFuZCAlIGFyZSBkZXByZWNhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjbGFzc2ljIChpbnR8bG9uZykgZGl2aXNpb24iLCBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQ9VHJ1ZSk6CisgICAgICAgIHJ1bl91bml0dGVzdChDb2VyY2lvblRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZXJjaW9uLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZXJjaW9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzk2NTJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29lcmNpb24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZXJjaW9uLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZXJjaW9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzk2NTJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29lcmNpb24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkZWIzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5CkBAIC0wLDAgKzEsMTA0MiBAQAorCitpbXBvcnQgdW5pdHRlc3QsIGRvY3Rlc3QsIG9wZXJhdG9yCitpbXBvcnQgaW5zcGVjdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUsIENvdW50ZXIsIE9yZGVyZWREaWN0Citmcm9tIHRlc3QgaW1wb3J0IG1hcHBpbmdfdGVzdHMKK2ltcG9ydCBwaWNrbGUsIGNQaWNrbGUsIGNvcHkKK2Zyb20gcmFuZG9tIGltcG9ydCByYW5kcmFuZ2UsIHNodWZmbGUKK2ltcG9ydCBrZXl3b3JkCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBTZXQsIE11dGFibGVTZXQKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IE1hcHBpbmcsIE11dGFibGVNYXBwaW5nCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBTZXF1ZW5jZSwgTXV0YWJsZVNlcXVlbmNlCisKK1Rlc3ROVCA9IG5hbWVkdHVwbGUoJ1Rlc3ROVCcsICd4IHkgeicpICAgICMgdHlwZSB1c2VkIGZvciBwaWNrbGUgdGVzdHMKKworY2xhc3MgVGVzdE5hbWVkVHVwbGUodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZmFjdG9yeShzZWxmKToKKyAgICAgICAgUG9pbnQgPSBuYW1lZHR1cGxlKCdQb2ludCcsICd4IHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBvaW50Ll9fbmFtZV9fLCAnUG9pbnQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBvaW50Ll9fc2xvdHNfXywgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUG9pbnQuX19tb2R1bGVfXywgX19uYW1lX18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUG9pbnQuX19nZXRpdGVtX18sIHR1cGxlLl9fZ2V0aXRlbV9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBvaW50Ll9maWVsZHMsICgneCcsICd5JykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbmFtZWR0dXBsZSwgJ2FiYyUnLCAnZWZnIGdoaScpICAgICAgICMgdHlwZSBoYXMgbm9uLWFscGhhIGNoYXIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbmFtZWR0dXBsZSwgJ2NsYXNzJywgJ2VmZyBnaGknKSAgICAgICMgdHlwZSBoYXMga2V5d29yZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBuYW1lZHR1cGxlLCAnOWFiYycsICdlZmcgZ2hpJykgICAgICAgIyB0eXBlIHN0YXJ0cyB3aXRoIGRpZ2l0CisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbmFtZWR0dXBsZSwgJ2FiYycsICdlZmcgZyVoaScpICAgICAgICMgZmllbGQgd2l0aCBub24tYWxwaGEgY2hhcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBuYW1lZHR1cGxlLCAnYWJjJywgJ2FiYyBjbGFzcycpICAgICAgIyBmaWVsZCBoYXMga2V5d29yZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBuYW1lZHR1cGxlLCAnYWJjJywgJzhlZmcgOWdoaScpICAgICAgIyBmaWVsZCBzdGFydHMgd2l0aCBkaWdpdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBuYW1lZHR1cGxlLCAnYWJjJywgJ19lZmcgZ2hpJykgICAgICAgIyBmaWVsZCB3aXRoIGxlYWRpbmcgdW5kZXJzY29yZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBuYW1lZHR1cGxlLCAnYWJjJywgJ2VmZyBlZmcgZ2hpJykgICAgIyBkdXBsaWNhdGUgZmllbGQKKworICAgICAgICBuYW1lZHR1cGxlKCdQb2ludDAnLCAneDEgeTInKSAgICMgVmVyaWZ5IHRoYXQgbnVtYmVycyBhcmUgYWxsb3dlZCBpbiBuYW1lcworICAgICAgICBuYW1lZHR1cGxlKCdfJywgJ2EgYiBjJykgICAgICAgICMgVGVzdCBsZWFkaW5nIHVuZGVyc2NvcmVzIGluIGEgdHlwZW5hbWUKKworICAgICAgICBudCA9IG5hbWVkdHVwbGUoJ250JywgdSd0aGUgcXVpY2sgYnJvd24gZm94JykgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdW5pY29kZSBpbnB1dAorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJ1JyIsIHJlcHIobnQuX2ZpZWxkcykpCisgICAgICAgIG50ID0gbmFtZWR0dXBsZSgnbnQnLCAodSd0aGUnLCB1J3F1aWNrJykpICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB1bmljb2RlIGlucHV0CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oInUnIiwgcmVwcihudC5fZmllbGRzKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFBvaW50Ll9tYWtlLCBbMTFdKSAgICAgICAgICAgICAgICAgICAgICMgY2F0Y2ggdG9vIGZldyBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgUG9pbnQuX21ha2UsIFsxMSwgMjIsIDMzXSkgICAgICAgICAgICAgIyBjYXRjaCB0b28gbWFueSBhcmdzCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF9mYWN0b3J5X2RvY19hdHRyKHNlbGYpOgorICAgICAgICBQb2ludCA9IG5hbWVkdHVwbGUoJ1BvaW50JywgJ3ggeScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUG9pbnQuX19kb2NfXywgJ1BvaW50KHgsIHkpJykKKworICAgIGRlZiB0ZXN0X25hbWVfZml4ZXIoc2VsZik6CisgICAgICAgIGZvciBzcGVjLCByZW5hbWVkIGluIFsKKyAgICAgICAgICAgIFsoJ2VmZycsICdnJWhpJyksICAoJ2VmZycsICdfMScpXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpZWxkIHdpdGggbm9uLWFscGhhIGNoYXIKKyAgICAgICAgICAgIFsoJ2FiYycsICdjbGFzcycpLCAoJ2FiYycsICdfMScpXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpZWxkIGhhcyBrZXl3b3JkCisgICAgICAgICAgICBbKCc4ZWZnJywgJzlnaGknKSwgKCdfMCcsICdfMScpXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmaWVsZCBzdGFydHMgd2l0aCBkaWdpdAorICAgICAgICAgICAgWygnYWJjJywgJ19lZmcnKSwgKCdhYmMnLCAnXzEnKV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmllbGQgd2l0aCBsZWFkaW5nIHVuZGVyc2NvcmUKKyAgICAgICAgICAgIFsoJ2FiYycsICdlZmcnLCAnZWZnJywgJ2doaScpLCAoJ2FiYycsICdlZmcnLCAnXzInLCAnZ2hpJyldLCAgICAjIGR1cGxpY2F0ZSBmaWVsZAorICAgICAgICAgICAgWygnYWJjJywgJycsICd4JyksICgnYWJjJywgJ18xJywgJ3gnKV0sICAgICAgICAgICAgICAgICAgICAgICAgICMgZmllbGRuYW1lIGlzIGEgc3BhY2UKKyAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZWR0dXBsZSgnTlQnLCBzcGVjLCByZW5hbWU9VHJ1ZSkuX2ZpZWxkcywgcmVuYW1lZCkKKworICAgIGRlZiB0ZXN0X2luc3RhbmNlKHNlbGYpOgorICAgICAgICBQb2ludCA9IG5hbWVkdHVwbGUoJ1BvaW50JywgJ3ggeScpCisgICAgICAgIHAgPSBQb2ludCgxMSwgMjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgUG9pbnQoeD0xMSwgeT0yMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgUG9pbnQoMTEsIHk9MjIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIFBvaW50KHk9MjIsIHg9MTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIFBvaW50KCooMTEsIDIyKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgUG9pbnQoKipkaWN0KHg9MTEsIHk9MjIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBQb2ludCwgMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRvbyBmZXcgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFBvaW50LCAxLCAyLCAzKSAgICAgICAgICAgICAgICAgICAgICAgICMgdG9vIG1hbnkgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICdQb2ludChYWFg9MSwgeT0yKScsIGxvY2FscygpKSAgICMgd3Jvbmcga2V5d29yZCBhcmd1bWVudAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICdQb2ludCh4PTEpJywgbG9jYWxzKCkpICAgICAgICAgICMgbWlzc2luZyBrZXl3b3JkIGFyZ3VtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihwKSwgJ1BvaW50KHg9MTEsIHk9MjIpJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignX19kaWN0X18nLCBkaXIocCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB2ZXJpZnkgaW5zdGFuY2UgaGFzIG5vIGRpY3QKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignX193ZWFrcmVmX18nLCBkaXIocCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgUG9pbnQuX21ha2UoWzExLCAyMl0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IF9tYWtlIGNsYXNzbWV0aG9kCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5fZmllbGRzLCAoJ3gnLCAneScpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IF9maWVsZHMgYXR0cmlidXRlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5fcmVwbGFjZSh4PTEpLCAoMSwgMjIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IF9yZXBsYWNlIG1ldGhvZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuX2FzZGljdCgpLCBkaWN0KHg9MTEsIHk9MjIpKSAgICAgICAgICAgICAgICAgICAgICMgdGVzdCBfYXNkaWN0IG1ldGhvZAorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAuX3JlcGxhY2UoeD0xLCBlcnJvcj0yKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2ZhaWwoJ0RpZCBub3QgZGV0ZWN0IGFuIGluY29ycmVjdCBmaWVsZG5hbWUnKQorCisgICAgICAgICMgdmVyaWZ5IHRoYXQgZmllbGQgc3RyaW5nIGNhbiBoYXZlIGNvbW1hcworICAgICAgICBQb2ludCA9IG5hbWVkdHVwbGUoJ1BvaW50JywgJ3gsIHknKQorICAgICAgICBwID0gUG9pbnQoeD0xMSwgeT0yMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHApLCAnUG9pbnQoeD0xMSwgeT0yMiknKQorCisgICAgICAgICMgdmVyaWZ5IHRoYXQgZmllbGRzcGVjIGNhbiBiZSBhIG5vbi1zdHJpbmcgc2VxdWVuY2UKKyAgICAgICAgUG9pbnQgPSBuYW1lZHR1cGxlKCdQb2ludCcsICgneCcsICd5JykpCisgICAgICAgIHAgPSBQb2ludCh4PTExLCB5PTIyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIocCksICdQb2ludCh4PTExLCB5PTIyKScpCisKKyAgICBkZWYgdGVzdF90dXBsZW5lc3Moc2VsZik6CisgICAgICAgIFBvaW50ID0gbmFtZWR0dXBsZSgnUG9pbnQnLCAneCB5JykKKyAgICAgICAgcCA9IFBvaW50KDExLCAyMikKKworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocCwgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgKDExLCAyMikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtYXRjaGVzIGEgcmVhbCB0dXBsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKHApLCAoMTEsIDIyKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29lcmNhYmxlIHRvIGEgcmVhbCB0dXBsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocCksIFsxMSwgMjJdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29lcmNhYmxlIHRvIGEgbGlzdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heChwKSwgMjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaXRlcmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoKnApLCAyMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0YXItYWJsZQorICAgICAgICB4LCB5ID0gcAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsICh4LCB5KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdW5wYWNrcyBsaWtlIGEgdHVwbGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgocFswXSwgcFsxXSksICgxMSwgMjIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluZGV4YWJsZSBsaWtlIGEgdHVwbGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcC5fX2dldGl0ZW1fXywgMykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAueCwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnksIHkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBldmFsLCAncC56JywgbG9jYWxzKCkpCisKKyAgICBkZWYgdGVzdF9vZGRfc2l6ZXMoc2VsZik6CisgICAgICAgIFplcm8gPSBuYW1lZHR1cGxlKCdaZXJvJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWmVybygpLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChaZXJvLl9tYWtlKFtdKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihaZXJvKCkpLCAnWmVybygpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChaZXJvKCkuX2FzZGljdCgpLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChaZXJvKCkuX2ZpZWxkcywgKCkpCisKKyAgICAgICAgRG90ID0gbmFtZWR0dXBsZSgnRG90JywgJ2QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERvdCgxKSwgKDEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEb3QuX21ha2UoWzFdKSwgKDEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEb3QoMSkuZCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKERvdCgxKSksICdEb3QoZD0xKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRG90KDEpLl9hc2RpY3QoKSwgeydkJzoxfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEb3QoMSkuX3JlcGxhY2UoZD05OTkpLCAoOTk5LCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRG90KDEpLl9maWVsZHMsICgnZCcsKSkKKworICAgICAgICBuID0gNTAwMAorICAgICAgICBpbXBvcnQgc3RyaW5nLCByYW5kb20KKyAgICAgICAgbmFtZXMgPSBsaXN0KHNldCgnJy5qb2luKFtyYW5kb20uY2hvaWNlKHN0cmluZy5hc2NpaV9sZXR0ZXJzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKDEwKV0pIGZvciBpIGluIHJhbmdlKG4pKSkKKyAgICAgICAgbiA9IGxlbihuYW1lcykKKyAgICAgICAgQmlnID0gbmFtZWR0dXBsZSgnQmlnJywgbmFtZXMpCisgICAgICAgIGIgPSBCaWcoKnJhbmdlKG4pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIHR1cGxlKHJhbmdlKG4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChCaWcuX21ha2UocmFuZ2UobikpLCB0dXBsZShyYW5nZShuKSkpCisgICAgICAgIGZvciBwb3MsIG5hbWUgaW4gZW51bWVyYXRlKG5hbWVzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihiLCBuYW1lKSwgcG9zKQorICAgICAgICByZXByKGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtYWtlIHN1cmUgcmVwcigpIGRvZXNuJ3QgYmxvdy11cAorICAgICAgICBkID0gYi5fYXNkaWN0KCkKKyAgICAgICAgZF9leHBlY3RlZCA9IGRpY3QoemlwKG5hbWVzLCByYW5nZShuKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZF9leHBlY3RlZCkKKyAgICAgICAgYjIgPSBiLl9yZXBsYWNlKCoqZGljdChbKG5hbWVzWzFdLCA5OTkpLChuYW1lc1stNV0sIDQyKV0pKQorICAgICAgICBiMl9leHBlY3RlZCA9IHJhbmdlKG4pCisgICAgICAgIGIyX2V4cGVjdGVkWzFdID0gOTk5CisgICAgICAgIGIyX2V4cGVjdGVkWy01XSA9IDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYjIsIHR1cGxlKGIyX2V4cGVjdGVkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLl9maWVsZHMsIHR1cGxlKG5hbWVzKSkKKworICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKKyAgICAgICAgcCA9IFRlc3ROVCh4PTEwLCB5PTIwLCB6PTMwKQorICAgICAgICBmb3IgbW9kdWxlIGluIHBpY2tsZSwgY1BpY2tsZToKKyAgICAgICAgICAgIGxvYWRzID0gZ2V0YXR0cihtb2R1bGUsICdsb2FkcycpCisgICAgICAgICAgICBkdW1wcyA9IGdldGF0dHIobW9kdWxlLCAnZHVtcHMnKQorICAgICAgICAgICAgZm9yIHByb3RvY29sIGluIC0xLCAwLCAxLCAyOgorICAgICAgICAgICAgICAgIHEgPSBsb2FkcyhkdW1wcyhwLCBwcm90b2NvbCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLCBxKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5fZmllbGRzLCBxLl9maWVsZHMpCisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBwID0gVGVzdE5UKHg9MTAsIHk9MjAsIHo9MzApCisgICAgICAgIGZvciBjb3BpZXIgaW4gY29weS5jb3B5LCBjb3B5LmRlZXBjb3B5OgorICAgICAgICAgICAgcSA9IGNvcGllcihwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLCBxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLl9maWVsZHMsIHEuX2ZpZWxkcykKKworICAgIGRlZiB0ZXN0X25hbWVfY29uZmxpY3RzKHNlbGYpOgorICAgICAgICAjIFNvbWUgbmFtZXMgbGlrZSAic2VsZiIsICJjbHMiLCAidHVwbGUiLCAiaXRlbWdldHRlciIsIGFuZCAicHJvcGVydHkiCisgICAgICAgICMgZmFpbGVkIHdoZW4gdXNlZCBhcyBmaWVsZCBuYW1lcy4gIFRlc3QgdG8gbWFrZSBzdXJlIHRoZXNlIG5vdyB3b3JrLgorICAgICAgICBUID0gbmFtZWR0dXBsZSgnVCcsICdpdGVtZ2V0dGVyIHByb3BlcnR5IHNlbGYgY2xzIHR1cGxlJykKKyAgICAgICAgdCA9IFQoMSwgMiwgMywgNCwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoMSwyLDMsNCw1KSkKKyAgICAgICAgbmV3dCA9IHQuX3JlcGxhY2UoaXRlbWdldHRlcj0xMCwgcHJvcGVydHk9MjAsIHNlbGY9MzAsIGNscz00MCwgdHVwbGU9NTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3dCwgKDEwLDIwLDMwLDQwLDUwKSkKKworICAgICAgICAjIEJyb2FkZXIgdGVzdCBvZiBhbGwgaW50ZXJlc3RpbmcgbmFtZXMgaW4gYSB0ZW1wbGF0ZQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jYXB0dXJlZF9zdGRvdXQoKSBhcyB0ZW1wbGF0ZToKKyAgICAgICAgICAgIFQgPSBuYW1lZHR1cGxlKCdUJywgJ3gnLCB2ZXJib3NlPVRydWUpCisgICAgICAgIHdvcmRzID0gc2V0KHJlLmZpbmRhbGwoJ1tBLVphLXpdKycsIHRlbXBsYXRlLmdldHZhbHVlKCkpKQorICAgICAgICB3b3JkcyAtPSBzZXQoa2V5d29yZC5rd2xpc3QpCisgICAgICAgIFQgPSBuYW1lZHR1cGxlKCdUJywgd29yZHMpCisgICAgICAgICMgdGVzdCBfX25ld19fCisgICAgICAgIHZhbHVlcyA9IHR1cGxlKHJhbmdlKGxlbih3b3JkcykpKQorICAgICAgICB0ID0gVCgqdmFsdWVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHZhbHVlcykKKyAgICAgICAgdCA9IFQoKipkaWN0KHppcChULl9maWVsZHMsIHZhbHVlcykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHZhbHVlcykKKyAgICAgICAgIyB0ZXN0IF9tYWtlCisgICAgICAgIHQgPSBULl9tYWtlKHZhbHVlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCB2YWx1ZXMpCisgICAgICAgICMgZXhlcmNpc2UgX19yZXByX18KKyAgICAgICAgcmVwcih0KQorICAgICAgICAjIHRlc3QgX2FzZGljdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuX2FzZGljdCgpLCBkaWN0KHppcChULl9maWVsZHMsIHZhbHVlcykpKQorICAgICAgICAjIHRlc3QgX3JlcGxhY2UKKyAgICAgICAgdCA9IFQuX21ha2UodmFsdWVzKQorICAgICAgICBuZXd2YWx1ZXMgPSB0dXBsZSh2KjEwIGZvciB2IGluIHZhbHVlcykKKyAgICAgICAgbmV3dCA9IHQuX3JlcGxhY2UoKipkaWN0KHppcChULl9maWVsZHMsIG5ld3ZhbHVlcykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld3QsIG5ld3ZhbHVlcykKKyAgICAgICAgIyB0ZXN0IF9maWVsZHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChULl9maWVsZHMsIHR1cGxlKHdvcmRzKSkKKyAgICAgICAgIyB0ZXN0IF9fZ2V0bmV3YXJnc19fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5fX2dldG5ld2FyZ3NfXygpLCB2YWx1ZXMpCisKK2NsYXNzIEFCQ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB2YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKHNlbGYsIGFiYywgKm5hbWVzKToKKyAgICAgICAgbWV0aG9kc3R1YnMgPSBkaWN0LmZyb21rZXlzKG5hbWVzLCBsYW1iZGEgcywgKmFyZ3M6IDApCisKKyAgICAgICAgIyBldmVyeXRoaW5nIHNob3VsZCB3b3JrIHdpbGwgYWxsIHJlcXVpcmVkIG1ldGhvZHMgYXJlIHByZXNlbnQKKyAgICAgICAgQyA9IHR5cGUoJ0MnLCAoYWJjLCksIG1ldGhvZHN0dWJzKQorICAgICAgICBDKCkKKworICAgICAgICAjIGluc3RhbnRpYXRpb24gc2hvdWxkIGZhaWwgaWYgYSByZXF1aXJlZCBtZXRob2QgaXMgbWlzc2luZworICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIHN0dWJzID0gbWV0aG9kc3R1YnMuY29weSgpCisgICAgICAgICAgICBkZWwgc3R1YnNbbmFtZV0KKyAgICAgICAgICAgIEMgPSB0eXBlKCdDJywgKGFiYywpLCBzdHVicykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgQywgbmFtZSkKKworICAgIGRlZiB2YWxpZGF0ZV9pc2luc3RhbmNlKHNlbGYsIGFiYywgbmFtZSk6CisgICAgICAgIHN0dWIgPSBsYW1iZGEgcywgKmFyZ3M6IDAKKworICAgICAgICAjIG5ldy1zdHlsZSBjbGFzcworICAgICAgICBDID0gdHlwZSgnQycsIChvYmplY3QsKSwge25hbWU6IHN0dWJ9KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoQygpLCBhYmMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMsIGFiYykpCisgICAgICAgICMgb2xkLXN0eWxlIGNsYXNzCisgICAgICAgIGNsYXNzIEM6IHBhc3MKKyAgICAgICAgc2V0YXR0cihDLCBuYW1lLCBzdHViKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoQygpLCBhYmMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMsIGFiYykpCisKKyAgICAgICAgIyBuZXctc3R5bGUgY2xhc3MKKyAgICAgICAgQyA9IHR5cGUoJ0MnLCAob2JqZWN0LCksIHsnX19oYXNoX18nOiBOb25lfSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKEMoKSwgYWJjKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQywgYWJjKSkKKyAgICAgICAgIyBvbGQtc3R5bGUgY2xhc3MKKyAgICAgICAgY2xhc3MgQzogcGFzcworICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoQygpLCBhYmMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDLCBhYmMpKQorCisgICAgZGVmIHZhbGlkYXRlX2NvbXBhcmlzb24oc2VsZiwgaW5zdGFuY2UpOgorICAgICAgICBvcHMgPSBbJ2x0JywgJ2d0JywgJ2xlJywgJ2dlJywgJ25lJywgJ29yJywgJ2FuZCcsICd4b3InLCAnc3ViJ10KKyAgICAgICAgb3BlcmF0b3JzID0ge30KKyAgICAgICAgZm9yIG9wIGluIG9wczoKKyAgICAgICAgICAgIG5hbWUgPSAnX18nICsgb3AgKyAnX18nCisgICAgICAgICAgICBvcGVyYXRvcnNbbmFtZV0gPSBnZXRhdHRyKG9wZXJhdG9yLCBuYW1lKQorCisgICAgICAgIGNsYXNzIE90aGVyOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYucmlnaHRfc2lkZSA9IEZhbHNlCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBzZWxmLnJpZ2h0X3NpZGUgPSBUcnVlCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIF9fbHRfXyA9IF9fZXFfXworICAgICAgICAgICAgX19ndF9fID0gX19lcV9fCisgICAgICAgICAgICBfX2xlX18gPSBfX2VxX18KKyAgICAgICAgICAgIF9fZ2VfXyA9IF9fZXFfXworICAgICAgICAgICAgX19uZV9fID0gX19lcV9fCisgICAgICAgICAgICBfX3Jvcl9fID0gX19lcV9fCisgICAgICAgICAgICBfX3JhbmRfXyA9IF9fZXFfXworICAgICAgICAgICAgX19yeG9yX18gPSBfX2VxX18KKyAgICAgICAgICAgIF9fcnN1Yl9fID0gX19lcV9fCisKKyAgICAgICAgZm9yIG5hbWUsIG9wIGluIG9wZXJhdG9ycy5pdGVtcygpOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoaW5zdGFuY2UsIG5hbWUpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBvdGhlciA9IE90aGVyKCkKKyAgICAgICAgICAgIG9wKGluc3RhbmNlLCBvdGhlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvdGhlci5yaWdodF9zaWRlLCdSaWdodCBzaWRlIG5vdCBjYWxsZWQgZm9yICVzLiVzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHR5cGUoaW5zdGFuY2UpLCBuYW1lKSkKKworY2xhc3MgVGVzdE9uZVRyaWNrUG9ueUFCQ3MoQUJDVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfSGFzaGFibGUoc2VsZik6CisgICAgICAgICMgQ2hlY2sgc29tZSBub24taGFzaGFibGVzCisgICAgICAgIG5vbl9zYW1wbGVzID0gW2xpc3QoKSwgc2V0KCksIGRpY3QoKV0KKyAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoeCwgSGFzaGFibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgSGFzaGFibGUpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAjIENoZWNrIHNvbWUgaGFzaGFibGVzCisgICAgICAgIHNhbXBsZXMgPSBbTm9uZSwKKyAgICAgICAgICAgICAgICAgICBpbnQoKSwgZmxvYXQoKSwgY29tcGxleCgpLAorICAgICAgICAgICAgICAgICAgIHN0cigpLAorICAgICAgICAgICAgICAgICAgIHR1cGxlKCksIGZyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgIGludCwgbGlzdCwgb2JqZWN0LCB0eXBlLAorICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4LCBIYXNoYWJsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHR5cGUoeCksIEhhc2hhYmxlKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBIYXNoYWJsZSkKKyAgICAgICAgIyBDaGVjayBkaXJlY3Qgc3ViY2xhc3NpbmcKKyAgICAgICAgY2xhc3MgSChIYXNoYWJsZSk6CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKEgsIHNlbGYpLl9faGFzaF9fKCkKKyAgICAgICAgICAgIF9fZXFfXyA9IEhhc2hhYmxlLl9fZXFfXyAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChIKCkpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoaW50LCBIKSkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKEhhc2hhYmxlLCAnX19oYXNoX18nKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2lzaW5zdGFuY2UoSGFzaGFibGUsICdfX2hhc2hfXycpCisKKyAgICBkZWYgdGVzdF9JdGVyYWJsZShzZWxmKToKKyAgICAgICAgIyBDaGVjayBzb21lIG5vbi1pdGVyYWJsZXMKKyAgICAgICAgbm9uX3NhbXBsZXMgPSBbTm9uZSwgNDIsIDMuMTQsIDFqXQorICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZSh4LCBJdGVyYWJsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyh0eXBlKHgpLCBJdGVyYWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICMgQ2hlY2sgc29tZSBpdGVyYWJsZXMKKyAgICAgICAgc2FtcGxlcyA9IFtzdHIoKSwKKyAgICAgICAgICAgICAgICAgICB0dXBsZSgpLCBsaXN0KCksIHNldCgpLCBmcm96ZW5zZXQoKSwgZGljdCgpLAorICAgICAgICAgICAgICAgICAgIGRpY3QoKS5rZXlzKCksIGRpY3QoKS5pdGVtcygpLCBkaWN0KCkudmFsdWVzKCksCisgICAgICAgICAgICAgICAgICAgKGxhbWJkYTogKHlpZWxkKSkoKSwKKyAgICAgICAgICAgICAgICAgICAoeCBmb3IgeCBpbiBbXSksCisgICAgICAgICAgICAgICAgICAgXQorICAgICAgICBmb3IgeCBpbiBzYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHgsIEl0ZXJhYmxlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3ModHlwZSh4KSwgSXRlcmFibGUpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAjIENoZWNrIGRpcmVjdCBzdWJjbGFzc2luZworICAgICAgICBjbGFzcyBJKEl0ZXJhYmxlKToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoSSwgc2VsZikuX19pdGVyX18oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoSSgpKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhzdHIsIEkpKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoSXRlcmFibGUsICdfX2l0ZXJfXycpCisgICAgICAgIHNlbGYudmFsaWRhdGVfaXNpbnN0YW5jZShJdGVyYWJsZSwgJ19faXRlcl9fJykKKworICAgIGRlZiB0ZXN0X0l0ZXJhdG9yKHNlbGYpOgorICAgICAgICBub25fc2FtcGxlcyA9IFtOb25lLCA0MiwgMy4xNCwgMWosICIiLmVuY29kZSgnYXNjaWknKSwgIiIsICgpLCBbXSwKKyAgICAgICAgICAgIHt9LCBzZXQoKV0KKyAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoeCwgSXRlcmF0b3IpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgSXRlcmF0b3IpLCByZXByKHR5cGUoeCkpKQorICAgICAgICBzYW1wbGVzID0gW2l0ZXIoc3RyKCkpLAorICAgICAgICAgICAgICAgICAgIGl0ZXIodHVwbGUoKSksIGl0ZXIobGlzdCgpKSwgaXRlcihkaWN0KCkpLAorICAgICAgICAgICAgICAgICAgIGl0ZXIoc2V0KCkpLCBpdGVyKGZyb3plbnNldCgpKSwKKyAgICAgICAgICAgICAgICAgICBpdGVyKGRpY3QoKS5rZXlzKCkpLCBpdGVyKGRpY3QoKS5pdGVtcygpKSwKKyAgICAgICAgICAgICAgICAgICBpdGVyKGRpY3QoKS52YWx1ZXMoKSksCisgICAgICAgICAgICAgICAgICAgKGxhbWJkYTogKHlpZWxkKSkoKSwKKyAgICAgICAgICAgICAgICAgICAoeCBmb3IgeCBpbiBbXSksCisgICAgICAgICAgICAgICAgICAgXQorICAgICAgICBmb3IgeCBpbiBzYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHgsIEl0ZXJhdG9yKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3ModHlwZSh4KSwgSXRlcmF0b3IpLCByZXByKHR5cGUoeCkpKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoSXRlcmF0b3IsICduZXh0JywgJ19faXRlcl9fJykKKworICAgICAgICAjIElzc3VlIDEwNTY1CisgICAgICAgIGNsYXNzIE5leHRPbmx5OgorICAgICAgICAgICAgZGVmIF9fbmV4dF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHlpZWxkIDEKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShOZXh0T25seSgpLCBJdGVyYXRvcikKKyAgICAgICAgY2xhc3MgTmV4dE9ubHlOZXcob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX25leHRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoTmV4dE9ubHlOZXcoKSwgSXRlcmF0b3IpCisKKyAgICBkZWYgdGVzdF9TaXplZChzZWxmKToKKyAgICAgICAgbm9uX3NhbXBsZXMgPSBbTm9uZSwgNDIsIDMuMTQsIDFqLAorICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhOiAoeWllbGQpKSgpLAorICAgICAgICAgICAgICAgICAgICAgICAoeCBmb3IgeCBpbiBbXSksCisgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoeCwgU2l6ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgU2l6ZWQpLCByZXByKHR5cGUoeCkpKQorICAgICAgICBzYW1wbGVzID0gW3N0cigpLAorICAgICAgICAgICAgICAgICAgIHR1cGxlKCksIGxpc3QoKSwgc2V0KCksIGZyb3plbnNldCgpLCBkaWN0KCksCisgICAgICAgICAgICAgICAgICAgZGljdCgpLmtleXMoKSwgZGljdCgpLml0ZW1zKCksIGRpY3QoKS52YWx1ZXMoKSwKKyAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIGZvciB4IGluIHNhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeCwgU2l6ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyh0eXBlKHgpLCBTaXplZCksIHJlcHIodHlwZSh4KSkpCisgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhTaXplZCwgJ19fbGVuX18nKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2lzaW5zdGFuY2UoU2l6ZWQsICdfX2xlbl9fJykKKworICAgIGRlZiB0ZXN0X0NvbnRhaW5lcihzZWxmKToKKyAgICAgICAgbm9uX3NhbXBsZXMgPSBbTm9uZSwgNDIsIDMuMTQsIDFqLAorICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhOiAoeWllbGQpKSgpLAorICAgICAgICAgICAgICAgICAgICAgICAoeCBmb3IgeCBpbiBbXSksCisgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoeCwgQ29udGFpbmVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIENvbnRhaW5lciksIHJlcHIodHlwZSh4KSkpCisgICAgICAgIHNhbXBsZXMgPSBbc3RyKCksCisgICAgICAgICAgICAgICAgICAgdHVwbGUoKSwgbGlzdCgpLCBzZXQoKSwgZnJvemVuc2V0KCksIGRpY3QoKSwKKyAgICAgICAgICAgICAgICAgICBkaWN0KCkua2V5cygpLCBkaWN0KCkuaXRlbXMoKSwKKyAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIGZvciB4IGluIHNhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeCwgQ29udGFpbmVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3ModHlwZSh4KSwgQ29udGFpbmVyKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKENvbnRhaW5lciwgJ19fY29udGFpbnNfXycpCisgICAgICAgIHNlbGYudmFsaWRhdGVfaXNpbnN0YW5jZShDb250YWluZXIsICdfX2NvbnRhaW5zX18nKQorCisgICAgZGVmIHRlc3RfQ2FsbGFibGUoc2VsZik6CisgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxaiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiIsICIiLmVuY29kZSgnYXNjaWknKSwgKCksIFtdLCB7fSwgc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGE6ICh5aWVsZCkpKCksCisgICAgICAgICAgICAgICAgICAgICAgICh4IGZvciB4IGluIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZSh4LCBDYWxsYWJsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyh0eXBlKHgpLCBDYWxsYWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgIHNhbXBsZXMgPSBbbGFtYmRhOiBOb25lLAorICAgICAgICAgICAgICAgICAgIHR5cGUsIGludCwgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgIGxlbiwKKyAgICAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZCwgW10uYXBwZW5kLAorICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4LCBDYWxsYWJsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHR5cGUoeCksIENhbGxhYmxlKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKENhbGxhYmxlLCAnX19jYWxsX18nKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2lzaW5zdGFuY2UoQ2FsbGFibGUsICdfX2NhbGxfXycpCisKKyAgICBkZWYgdGVzdF9kaXJlY3Rfc3ViY2xhc3Npbmcoc2VsZik6CisgICAgICAgIGZvciBCIGluIEhhc2hhYmxlLCBJdGVyYWJsZSwgSXRlcmF0b3IsIFNpemVkLCBDb250YWluZXIsIENhbGxhYmxlOgorICAgICAgICAgICAgY2xhc3MgQyhCKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDLCBCKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhpbnQsIEMpKQorCisgICAgZGVmIHRlc3RfcmVnaXN0cmF0aW9uKHNlbGYpOgorICAgICAgICBmb3IgQiBpbiBIYXNoYWJsZSwgSXRlcmFibGUsIEl0ZXJhdG9yLCBTaXplZCwgQ29udGFpbmVyLCBDYWxsYWJsZToKKyAgICAgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IHR5cGUKKyAgICAgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgICMgTWFrZSBzdXJlIGl0IGlzbid0IGhhc2hhYmxlIGJ5IGRlZmF1bHQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDLCBCKSwgQi5fX25hbWVfXykKKyAgICAgICAgICAgIEIucmVnaXN0ZXIoQykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMsIEIpKQorCitjbGFzcyBXaXRoU2V0KE11dGFibGVTZXQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0PSgpKToKKyAgICAgICAgc2VsZi5kYXRhID0gc2V0KGl0KQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5kYXRhKQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaXRlcihzZWxmLmRhdGEpCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgorICAgICAgICByZXR1cm4gaXRlbSBpbiBzZWxmLmRhdGEKKworICAgIGRlZiBhZGQoc2VsZiwgaXRlbSk6CisgICAgICAgIHNlbGYuZGF0YS5hZGQoaXRlbSkKKworICAgIGRlZiBkaXNjYXJkKHNlbGYsIGl0ZW0pOgorICAgICAgICBzZWxmLmRhdGEuZGlzY2FyZChpdGVtKQorCitjbGFzcyBUZXN0Q29sbGVjdGlvbkFCQ3MoQUJDVGVzdENhc2UpOgorCisgICAgIyBYWFggRm9yIG5vdywgd2Ugb25seSB0ZXN0IHNvbWUgdmlydHVhbCBpbmhlcml0YW5jZSBwcm9wZXJ0aWVzLgorICAgICMgV2Ugc2hvdWxkIGFsc28gdGVzdCB0aGUgcHJvcGVyIGJlaGF2aW9yIG9mIHRoZSBjb2xsZWN0aW9uIEFCQ3MKKyAgICAjIGFzIHJlYWwgYmFzZSBjbGFzc2VzIG9yIG1peC1pbiBjbGFzc2VzLgorCisgICAgZGVmIHRlc3RfU2V0KHNlbGYpOgorICAgICAgICBmb3Igc2FtcGxlIGluIFtzZXQsIGZyb3plbnNldF06CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2FtcGxlKCksIFNldCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNhbXBsZSwgU2V0KSkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKFNldCwgJ19fY29udGFpbnNfXycsICdfX2l0ZXJfXycsICdfX2xlbl9fJykKKyAgICAgICAgY2xhc3MgTXlTZXQoU2V0KToKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBpdGVyKFtdKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2NvbXBhcmlzb24oTXlTZXQoKSkKKworICAgIGRlZiB0ZXN0X2hhc2hfU2V0KHNlbGYpOgorICAgICAgICBjbGFzcyBPbmVUd29UaHJlZVNldChTZXQpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuY29udGVudHMgPSBbMSwgMiwgM10KKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHggaW4gc2VsZi5jb250ZW50cworICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmLmNvbnRlbnRzKQorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYuY29udGVudHMpCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2goKQorICAgICAgICBhLCBiID0gT25lVHdvVGhyZWVTZXQoKSwgT25lVHdvVGhyZWVTZXQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzaChhKSA9PSBoYXNoKGIpKQorCisgICAgZGVmIHRlc3RfTXV0YWJsZVNldChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNldCgpLCBNdXRhYmxlU2V0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzZXQsIE11dGFibGVTZXQpKQorICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoZnJvemVuc2V0KCksIE11dGFibGVTZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhmcm96ZW5zZXQsIE11dGFibGVTZXQpKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoTXV0YWJsZVNldCwgJ19fY29udGFpbnNfXycsICdfX2l0ZXJfXycsICdfX2xlbl9fJywKKyAgICAgICAgICAgICdhZGQnLCAnZGlzY2FyZCcpCisKKyAgICBkZWYgdGVzdF9pc3N1ZV81NjQ3KHNlbGYpOgorICAgICAgICAjIE11dGFibGVTZXQuX19pYW5kX18gbXV0YXRlZCB0aGUgc2V0IGR1cmluZyBpdGVyYXRpb24KKyAgICAgICAgcyA9IFdpdGhTZXQoJ2FiY2QnKQorICAgICAgICBzICY9IFdpdGhTZXQoJ2NkZWYnKSAgICAgICAgICAgICMgVGhpcyB1c2VkIHRvIGZhaWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQocyksIHNldCgnY2QnKSkKKworICAgIGRlZiB0ZXN0X2lzc3VlXzQ5MjAoc2VsZik6CisgICAgICAgICMgTXV0YWJsZVNldC5wb3AoKSBtZXRob2QgZGlkIG5vdCB3b3JrCisgICAgICAgIGNsYXNzIE15U2V0KGNvbGxlY3Rpb25zLk11dGFibGVTZXQpOgorICAgICAgICAgICAgX19zbG90c19fPVsnX19zJ10KKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLGl0ZW1zPU5vbmUpOgorICAgICAgICAgICAgICAgIGlmIGl0ZW1zIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGl0ZW1zPVtdCisgICAgICAgICAgICAgICAgc2VsZi5fX3M9c2V0KGl0ZW1zKQorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLHYpOgorICAgICAgICAgICAgICAgIHJldHVybiB2IGluIHNlbGYuX19zCisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fX3MpCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuX19zKQorICAgICAgICAgICAgZGVmIGFkZChzZWxmLHYpOgorICAgICAgICAgICAgICAgIHJlc3VsdD12IG5vdCBpbiBzZWxmLl9fcworICAgICAgICAgICAgICAgIHNlbGYuX19zLmFkZCh2KQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgICAgIGRlZiBkaXNjYXJkKHNlbGYsdik6CisgICAgICAgICAgICAgICAgcmVzdWx0PXYgaW4gc2VsZi5fX3MKKyAgICAgICAgICAgICAgICBzZWxmLl9fcy5kaXNjYXJkKHYpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiTXlTZXQoJXMpIiAlIHJlcHIobGlzdChzZWxmKSkKKyAgICAgICAgcyA9IE15U2V0KFs1LDQzLDIsMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5wb3AoKSwgMSkKKworICAgIGRlZiB0ZXN0X2lzc3VlODc1MChzZWxmKToKKyAgICAgICAgZW1wdHkgPSBXaXRoU2V0KCkKKyAgICAgICAgZnVsbCA9IFdpdGhTZXQocmFuZ2UoMTApKQorICAgICAgICBzID0gV2l0aFNldChmdWxsKQorICAgICAgICBzIC09IHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBlbXB0eSkKKyAgICAgICAgcyA9IFdpdGhTZXQoZnVsbCkKKyAgICAgICAgcyBePSBzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgZW1wdHkpCisgICAgICAgIHMgPSBXaXRoU2V0KGZ1bGwpCisgICAgICAgIHMgJj0gcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIGZ1bGwpCisgICAgICAgIHMgfD0gcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIGZ1bGwpCisKKyAgICBkZWYgdGVzdF9NYXBwaW5nKHNlbGYpOgorICAgICAgICBmb3Igc2FtcGxlIGluIFtkaWN0XToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzYW1wbGUoKSwgTWFwcGluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNhbXBsZSwgTWFwcGluZykpCisgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhNYXBwaW5nLCAnX19jb250YWluc19fJywgJ19faXRlcl9fJywgJ19fbGVuX18nLAorICAgICAgICAgICAgJ19fZ2V0aXRlbV9fJykKKyAgICAgICAgY2xhc3MgTXlNYXBwaW5nKGNvbGxlY3Rpb25zLk1hcHBpbmcpOgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIoKCkpCisgICAgICAgIHNlbGYudmFsaWRhdGVfY29tcGFyaXNvbihNeU1hcHBpbmcoKSkKKworICAgIGRlZiB0ZXN0X011dGFibGVNYXBwaW5nKHNlbGYpOgorICAgICAgICBmb3Igc2FtcGxlIGluIFtkaWN0XToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzYW1wbGUoKSwgTXV0YWJsZU1hcHBpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzYW1wbGUsIE11dGFibGVNYXBwaW5nKSkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKE11dGFibGVNYXBwaW5nLCAnX19jb250YWluc19fJywgJ19faXRlcl9fJywgJ19fbGVuX18nLAorICAgICAgICAgICAgJ19fZ2V0aXRlbV9fJywgJ19fc2V0aXRlbV9fJywgJ19fZGVsaXRlbV9fJykKKworICAgIGRlZiB0ZXN0X1NlcXVlbmNlKHNlbGYpOgorICAgICAgICBmb3Igc2FtcGxlIGluIFt0dXBsZSwgbGlzdCwgc3RyXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzYW1wbGUoKSwgU2VxdWVuY2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzYW1wbGUsIFNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoYmFzZXN0cmluZywgU2VxdWVuY2UpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocmFuZ2UoMTApLCBTZXF1ZW5jZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoeHJhbmdlLCBTZXF1ZW5jZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHN0ciwgU2VxdWVuY2UpKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoU2VxdWVuY2UsICdfX2NvbnRhaW5zX18nLCAnX19pdGVyX18nLCAnX19sZW5fXycsCisgICAgICAgICAgICAnX19nZXRpdGVtX18nKQorCisgICAgZGVmIHRlc3RfTXV0YWJsZVNlcXVlbmNlKHNlbGYpOgorICAgICAgICBmb3Igc2FtcGxlIGluIFt0dXBsZSwgc3RyXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShzYW1wbGUoKSwgTXV0YWJsZVNlcXVlbmNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHNhbXBsZSwgTXV0YWJsZVNlcXVlbmNlKSkKKyAgICAgICAgZm9yIHNhbXBsZSBpbiBbbGlzdF06CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2FtcGxlKCksIE11dGFibGVTZXF1ZW5jZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNhbXBsZSwgTXV0YWJsZVNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGJhc2VzdHJpbmcsIE11dGFibGVTZXF1ZW5jZSkpCisgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhNdXRhYmxlU2VxdWVuY2UsICdfX2NvbnRhaW5zX18nLCAnX19pdGVyX18nLAorICAgICAgICAgICAgJ19fbGVuX18nLCAnX19nZXRpdGVtX18nLCAnX19zZXRpdGVtX18nLCAnX19kZWxpdGVtX18nLCAnaW5zZXJ0JykKKworY2xhc3MgVGVzdENvdW50ZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgorICAgICAgICBjID0gQ291bnRlcignYWJjYWJhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBDb3VudGVyKHsnYSc6MyAsICdiJzogMiwgJ2MnOiAxfSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgQ291bnRlcihhPTMsIGI9MiwgYz0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGMsIGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShjLCBNYXBwaW5nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDb3VudGVyLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQ291bnRlciwgTWFwcGluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShjLnZhbHVlcygpKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoYy52YWx1ZXMoKSksIFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoYy5rZXlzKCkpLCBbJ2EnLCAnYicsICdjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGMpLCBbJ2EnLCAnYicsICdjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGMuaXRlbXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygnYScsIDMpLCAoJ2InLCAyKSwgKCdjJywgMSldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNbJ2InXSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjWyd6J10sIDApCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5oYXNfa2V5KCdjJyksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuaGFzX2tleSgneicpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLl9fY29udGFpbnNfXygnYycpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuX19jb250YWluc19fKCd6JyksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZ2V0KCdiJywgMTApLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZ2V0KCd6JywgMTApLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBkaWN0KGE9MywgYj0yLCBjPTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYyksICJDb3VudGVyKHsnYSc6IDMsICdiJzogMiwgJ2MnOiAxfSkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubW9zdF9jb21tb24oKSwgWygnYScsIDMpLCAoJ2InLCAyKSwgKCdjJywgMSldKQorICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5tb3N0X2NvbW1vbihpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygnYScsIDMpLCAoJ2InLCAyKSwgKCdjJywgMSldWzppXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5qb2luKHNvcnRlZChjLmVsZW1lbnRzKCkpKSwgJ2FhYWJiYycpCisgICAgICAgIGNbJ2EnXSArPSAxICAgICAgICAgIyBpbmNyZW1lbnQgYW4gZXhpc3RpbmcgdmFsdWUKKyAgICAgICAgY1snYiddIC09IDIgICAgICAgICAjIHN1YiBleGlzdGluZyB2YWx1ZSB0byB6ZXJvCisgICAgICAgIGRlbCBjWydjJ10gICAgICAgICAgIyByZW1vdmUgYW4gZW50cnkKKyAgICAgICAgZGVsIGNbJ2MnXSAgICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IGRlbCBkb2Vzbid0IHJhaXNlIEtleUVycm9yCisgICAgICAgIGNbJ2QnXSAtPSAyICAgICAgICAgIyBzdWIgZnJvbSBhIG1pc3NpbmcgdmFsdWUKKyAgICAgICAgY1snZSddID0gLTUgICAgICAgICAjIGRpcmVjdGx5IGFzc2lnbiBhIG1pc3NpbmcgdmFsdWUKKyAgICAgICAgY1snZiddICs9IDQgICAgICAgICAjIGFkZCB0byBhIG1pc3NpbmcgdmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBkaWN0KGE9NCwgYj0wLCBkPS0yLCBlPS01LCBmPTQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmpvaW4oc29ydGVkKGMuZWxlbWVudHMoKSkpLCAnYWFhYWZmZmYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucG9wKCdmJyksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2YnLCBjKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIGVsZW0sIGNudCA9IGMucG9waXRlbSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGVsZW0sIGMpCisgICAgICAgIGMuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIHt9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYyksICdDb3VudGVyKCknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBDb3VudGVyLmZyb21rZXlzLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBjKQorICAgICAgICBjLnVwZGF0ZShkaWN0KGE9NSwgYj0zKSkKKyAgICAgICAgYy51cGRhdGUoYz0xKQorICAgICAgICBjLnVwZGF0ZShDb3VudGVyKCdhJyAqIDUwICsgJ2InICogMzApKQorICAgICAgICBjLnVwZGF0ZSgpICAgICAgICAgICMgdGVzdCBjYXNlIHdpdGggbm8gYXJncworICAgICAgICBjLl9faW5pdF9fKCdhJyAqIDUwMCArICdiJyAqIDMwMCkKKyAgICAgICAgYy5fX2luaXRfXygnY2RjJykKKyAgICAgICAgYy5fX2luaXRfXygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgZGljdChhPTU1NSwgYj0zMzMsIGM9MywgZD0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnNldGRlZmF1bHQoJ2QnLCA1KSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjWydkJ10sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zZXRkZWZhdWx0KCdlJywgNSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY1snZSddLCA1KQorCisgICAgZGVmIHRlc3RfY29weWluZyhzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGNvdW50ZXJzIGFyZSBjb3B5YWJsZSwgZGVlcGNvcHlhYmxlLCBwaWNrbGFibGUsIGFuZAorICAgICAgICAjaGF2ZSBhIHJlcHIvZXZhbCByb3VuZC10cmlwCisgICAgICAgIHdvcmRzID0gQ291bnRlcignd2hpY2ggd2l0Y2ggaGFkIHdoaWNoIHdpdGNoZXMgd3Jpc3Qgd2F0Y2gnLnNwbGl0KCkpCisgICAgICAgIHVwZGF0ZV90ZXN0ID0gQ291bnRlcigpCisgICAgICAgIHVwZGF0ZV90ZXN0LnVwZGF0ZSh3b3JkcykKKyAgICAgICAgZm9yIGksIGR1cCBpbiBlbnVtZXJhdGUoWworICAgICAgICAgICAgICAgICAgICB3b3Jkcy5jb3B5KCksCisgICAgICAgICAgICAgICAgICAgIGNvcHkuY29weSh3b3JkcyksCisgICAgICAgICAgICAgICAgICAgIGNvcHkuZGVlcGNvcHkod29yZHMpLAorICAgICAgICAgICAgICAgICAgICBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKHdvcmRzLCAwKSksCisgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMod29yZHMsIDEpKSwKKyAgICAgICAgICAgICAgICAgICAgcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyh3b3JkcywgMikpLAorICAgICAgICAgICAgICAgICAgICBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKHdvcmRzLCAtMSkpLAorICAgICAgICAgICAgICAgICAgICBjUGlja2xlLmxvYWRzKGNQaWNrbGUuZHVtcHMod29yZHMsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgY1BpY2tsZS5sb2FkcyhjUGlja2xlLmR1bXBzKHdvcmRzLCAxKSksCisgICAgICAgICAgICAgICAgICAgIGNQaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyh3b3JkcywgMikpLAorICAgICAgICAgICAgICAgICAgICBjUGlja2xlLmxvYWRzKGNQaWNrbGUuZHVtcHMod29yZHMsIC0xKSksCisgICAgICAgICAgICAgICAgICAgIGV2YWwocmVwcih3b3JkcykpLAorICAgICAgICAgICAgICAgICAgICB1cGRhdGVfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgQ291bnRlcih3b3JkcyksCisgICAgICAgICAgICAgICAgICAgIF0pOgorICAgICAgICAgICAgbXNnID0gKGksIGR1cCwgd29yZHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZHVwIGlzIG5vdCB3b3JkcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHVwLCB3b3JkcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGR1cCksIGxlbih3b3JkcykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZHVwKSwgdHlwZSh3b3JkcykpCisKKyAgICBkZWYgdGVzdF9jb3B5X3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBNeUNvdW50ZXIoQ291bnRlcik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGMgPSBNeUNvdW50ZXIoJ3NsYXJ0aWJhcnRmYXN0JykKKyAgICAgICAgZCA9IGMuY29weSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIGxlbihjKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGQpLCB0eXBlKGMpKQorCisgICAgZGVmIHRlc3RfY29udmVyc2lvbnMoc2VsZik6CisgICAgICAgICMgQ29udmVydCB0bzogc2V0LCBsaXN0LCBkaWN0CisgICAgICAgIHMgPSAnc2hlIHNlbGxzIHNlYSBzaGVsbHMgYnkgdGhlIHNlYSBzaG9yZScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoQ291bnRlcihzKS5lbGVtZW50cygpKSwgc29ydGVkKHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChDb3VudGVyKHMpKSwgc29ydGVkKHNldChzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdChDb3VudGVyKHMpKSwgZGljdChDb3VudGVyKHMpLml0ZW1zKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChDb3VudGVyKHMpKSwgc2V0KHMpKQorCisgICAgZGVmIHRlc3RfaW52YXJpYW50X2Zvcl90aGVfaW5fb3BlcmF0b3Ioc2VsZik6CisgICAgICAgIGMgPSBDb3VudGVyKGE9MTAsIGI9LTIsIGM9MCkKKyAgICAgICAgZm9yIGVsZW0gaW4gYzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIGluIGMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVsZW0sIGMpCisKKyAgICBkZWYgdGVzdF9tdWx0aXNldF9vcGVyYXRpb25zKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IGFkZGluZyBhIHplcm8gY291bnRlciB3aWxsIHN0cmlwIHplcm9zIGFuZCBuZWdhdGl2ZXMKKyAgICAgICAgYyA9IENvdW50ZXIoYT0xMCwgYj0tMiwgYz0wKSArIENvdW50ZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3QoYyksIGRpY3QoYT0xMCkpCisKKyAgICAgICAgZWxlbWVudHMgPSAnYWJjZCcKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICAjIHRlc3QgcmFuZG9tIHBhaXJzIG9mIG11bHRpc2V0cworICAgICAgICAgICAgcCA9IENvdW50ZXIoZGljdCgoZWxlbSwgcmFuZHJhbmdlKC0yLDQpKSBmb3IgZWxlbSBpbiBlbGVtZW50cykpCisgICAgICAgICAgICBwLnVwZGF0ZShlPTEsIGY9LTEsIGc9MCkKKyAgICAgICAgICAgIHEgPSBDb3VudGVyKGRpY3QoKGVsZW0sIHJhbmRyYW5nZSgtMiw0KSkgZm9yIGVsZW0gaW4gZWxlbWVudHMpKQorICAgICAgICAgICAgcS51cGRhdGUoaD0xLCBpPS0xLCBqPTApCisgICAgICAgICAgICBmb3IgY291bnRlcm9wLCBudW1iZXJvcCBpbiBbCisgICAgICAgICAgICAgICAgKENvdW50ZXIuX19hZGRfXywgbGFtYmRhIHgsIHk6IG1heCgwLCB4K3kpKSwKKyAgICAgICAgICAgICAgICAoQ291bnRlci5fX3N1Yl9fLCBsYW1iZGEgeCwgeTogbWF4KDAsIHgteSkpLAorICAgICAgICAgICAgICAgIChDb3VudGVyLl9fb3JfXywgbGFtYmRhIHgsIHk6IG1heCgwLHgseSkpLAorICAgICAgICAgICAgICAgIChDb3VudGVyLl9fYW5kX18sIGxhbWJkYSB4LCB5OiBtYXgoMCwgbWluKHgseSkpKSwKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gY291bnRlcm9wKHAsIHEpCisgICAgICAgICAgICAgICAgZm9yIHggaW4gZWxlbWVudHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtYmVyb3AocFt4XSwgcVt4XSksIHJlc3VsdFt4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY291bnRlcm9wLCB4LCBwLCBxKSkKKyAgICAgICAgICAgICAgICAjIHZlcmlmeSB0aGF0IHJlc3VsdHMgZXhjbHVkZSBub24tcG9zaXRpdmUgY291bnRzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHg+MCBmb3IgeCBpbiByZXN1bHQudmFsdWVzKCkpCisKKyAgICAgICAgZWxlbWVudHMgPSAnYWJjZGVmJworICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDApOgorICAgICAgICAgICAgIyB2ZXJpZnkgdGhhdCByYW5kb20gbXVsdGlzZXRzIHdpdGggbm8gcmVwZWF0cyBhcmUgZXhhY3RseSBsaWtlIHNldHMKKyAgICAgICAgICAgIHAgPSBDb3VudGVyKGRpY3QoKGVsZW0sIHJhbmRyYW5nZSgwLCAyKSkgZm9yIGVsZW0gaW4gZWxlbWVudHMpKQorICAgICAgICAgICAgcSA9IENvdW50ZXIoZGljdCgoZWxlbSwgcmFuZHJhbmdlKDAsIDIpKSBmb3IgZWxlbSBpbiBlbGVtZW50cykpCisgICAgICAgICAgICBmb3IgY291bnRlcm9wLCBzZXRvcCBpbiBbCisgICAgICAgICAgICAgICAgKENvdW50ZXIuX19zdWJfXywgc2V0Ll9fc3ViX18pLAorICAgICAgICAgICAgICAgIChDb3VudGVyLl9fb3JfXywgc2V0Ll9fb3JfXyksCisgICAgICAgICAgICAgICAgKENvdW50ZXIuX19hbmRfXywgc2V0Ll9fYW5kX18pLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgICAgICBjb3VudGVyX3Jlc3VsdCA9IGNvdW50ZXJvcChwLCBxKQorICAgICAgICAgICAgICAgIHNldF9yZXN1bHQgPSBzZXRvcChzZXQocC5lbGVtZW50cygpKSwgc2V0KHEuZWxlbWVudHMoKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudGVyX3Jlc3VsdCwgZGljdC5mcm9ta2V5cyhzZXRfcmVzdWx0LCAxKSkKKworICAgIGRlZiB0ZXN0X3N1YnRyYWN0KHNlbGYpOgorICAgICAgICBjID0gQ291bnRlcihhPS01LCBiPTAsIGM9NSwgZD0xMCwgZT0xNSxnPTQwKQorICAgICAgICBjLnN1YnRyYWN0KGE9MSwgYj0yLCBjPS0zLCBkPTEwLCBlPTIwLCBmPTMwLCBoPS01MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBDb3VudGVyKGE9LTYsIGI9LTIsIGM9OCwgZD0wLCBlPS01LCBmPS0zMCwgZz00MCwgaD01MCkpCisgICAgICAgIGMgPSBDb3VudGVyKGE9LTUsIGI9MCwgYz01LCBkPTEwLCBlPTE1LGc9NDApCisgICAgICAgIGMuc3VidHJhY3QoQ291bnRlcihhPTEsIGI9MiwgYz0tMywgZD0xMCwgZT0yMCwgZj0zMCwgaD0tNTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIENvdW50ZXIoYT0tNiwgYj0tMiwgYz04LCBkPTAsIGU9LTUsIGY9LTMwLCBnPTQwLCBoPTUwKSkKKyAgICAgICAgYyA9IENvdW50ZXIoJ2FhYWJiY2QnKQorICAgICAgICBjLnN1YnRyYWN0KCdhYWFhYmJjY2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIENvdW50ZXIoYT0tMSwgYj0wLCBjPS0xLCBkPTEsIGU9LTEpKQorCitjbGFzcyBUZXN0T3JkZXJlZERpY3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgT3JkZXJlZERpY3QoWygnYScsIDEpLCAoJ2InLCAyKV0sIE5vbmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0b28gbWFueSBhcmdzCisgICAgICAgIHBhaXJzID0gWygnYScsIDEpLCAoJ2InLCAyKSwgKCdjJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoT3JkZXJlZERpY3QoZGljdChwYWlycykpLml0ZW1zKCkpLCBwYWlycykgICAgICAgICAgICMgZGljdCBpbnB1dAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChPcmRlcmVkRGljdCgqKmRpY3QocGFpcnMpKS5pdGVtcygpKSwgcGFpcnMpICAgICAgICAgIyBrd2RzIGlucHV0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChPcmRlcmVkRGljdChwYWlycykuaXRlbXMoKSksIHBhaXJzKSAgICAgICAgICAgICAgICAgICAjIHBhaXJzIGlucHV0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChPcmRlcmVkRGljdChbKCdhJywgMSksICgnYicsIDIpLCAoJ2MnLCA5KSwgKCdkJywgNCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYz0zLCBlPTUpLml0ZW1zKCkpLCBwYWlycykgICAgICAgICAgICAgICAgIyBtaXhlZCBpbnB1dAorCisgICAgICAgICMgbWFrZSBzdXJlIG5vIHBvc2l0aW9uYWwgYXJncyBjb25mbGljdCB3aXRoIHBvc3NpYmxlIGt3ZGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldGFyZ3NwZWMoT3JkZXJlZERpY3QuX19kaWN0X19bJ19faW5pdF9fJ10pLmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgWydzZWxmJ10pCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBkaXJlY3QgY2FsbHMgdG8gX19pbml0X18gZG8gbm90IGNsZWFyIHByZXZpb3VzIGNvbnRlbnRzCisgICAgICAgIGQgPSBPcmRlcmVkRGljdChbKCdhJywgMSksICgnYicsIDIpLCAoJ2MnLCAzKSwgKCdkJywgNDQpLCAoJ2UnLCA1NSldKQorICAgICAgICBkLl9faW5pdF9fKFsoJ2UnLCA1KSwgKCdmJywgNildLCBnPTcsIGQ9NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQuaXRlbXMoKSksCisgICAgICAgICAgICBbKCdhJywgMSksICgnYicsIDIpLCAoJ2MnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KSwgKCdnJywgNyldKQorCisgICAgZGVmIHRlc3RfdXBkYXRlKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBPcmRlcmVkRGljdCgpLnVwZGF0ZShbKCdhJywgMSksICgnYicsIDIpXSwgTm9uZSkgICAgICAgICAgICAgICAgICAgICAgICAjIHRvbyBtYW55IGFyZ3MKKyAgICAgICAgcGFpcnMgPSBbKCdhJywgMSksICgnYicsIDIpLCAoJ2MnLCAzKSwgKCdkJywgNCksICgnZScsIDUpXQorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KCkKKyAgICAgICAgb2QudXBkYXRlKGRpY3QocGFpcnMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChvZC5pdGVtcygpKSwgcGFpcnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkaWN0IGlucHV0CisgICAgICAgIG9kID0gT3JkZXJlZERpY3QoKQorICAgICAgICBvZC51cGRhdGUoKipkaWN0KHBhaXJzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQob2QuaXRlbXMoKSksIHBhaXJzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMga3dkcyBpbnB1dAorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KCkKKyAgICAgICAgb2QudXBkYXRlKHBhaXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qob2QuaXRlbXMoKSksIHBhaXJzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwYWlycyBpbnB1dAorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KCkKKyAgICAgICAgb2QudXBkYXRlKFsoJ2EnLCAxKSwgKCdiJywgMiksICgnYycsIDkpLCAoJ2QnLCA0KV0sIGM9MywgZT01KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qob2QuaXRlbXMoKSksIHBhaXJzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtaXhlZCBpbnB1dAorCisgICAgICAgICMgSXNzdWUgOTEzNzogTmFtZWQgYXJndW1lbnQgY2FsbGVkICdvdGhlcicgb3IgJ3NlbGYnCisgICAgICAgICMgc2hvdWxkbid0IGJlIHRyZWF0ZWQgc3BlY2lhbGx5LgorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KCkKKyAgICAgICAgb2QudXBkYXRlKHNlbGY9MjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChvZC5pdGVtcygpKSwgWygnc2VsZicsIDIzKV0pCisgICAgICAgIG9kID0gT3JkZXJlZERpY3QoKQorICAgICAgICBvZC51cGRhdGUob3RoZXI9e30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChvZC5pdGVtcygpKSwgWygnb3RoZXInLCB7fSldKQorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KCkKKyAgICAgICAgb2QudXBkYXRlKHJlZD01LCBibHVlPTYsIG90aGVyPTcsIHNlbGY9OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQobGlzdChvZC5pdGVtcygpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygnYmx1ZScsIDYpLCAoJ290aGVyJywgNyksICgncmVkJywgNSksICgnc2VsZicsIDgpXSkKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGRpcmVjdCBjYWxscyB0byB1cGRhdGUgZG8gbm90IGNsZWFyIHByZXZpb3VzIGNvbnRlbnRzCisgICAgICAgICMgYWRkIHRoYXQgdXBkYXRlcyBpdGVtcyBhcmUgbm90IG1vdmVkIHRvIHRoZSBlbmQKKyAgICAgICAgZCA9IE9yZGVyZWREaWN0KFsoJ2EnLCAxKSwgKCdiJywgMiksICgnYycsIDMpLCAoJ2QnLCA0NCksICgnZScsIDU1KV0pCisgICAgICAgIGQudXBkYXRlKFsoJ2UnLCA1KSwgKCdmJywgNildLCBnPTcsIGQ9NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQuaXRlbXMoKSksCisgICAgICAgICAgICBbKCdhJywgMSksICgnYicsIDIpLCAoJ2MnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KSwgKCdnJywgNyldKQorCisgICAgZGVmIHRlc3RfYWJjKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoT3JkZXJlZERpY3QoKSwgTXV0YWJsZU1hcHBpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKE9yZGVyZWREaWN0LCBNdXRhYmxlTWFwcGluZykpCisKKyAgICBkZWYgdGVzdF9jbGVhcihzZWxmKToKKyAgICAgICAgcGFpcnMgPSBbKCdjJywgMSksICgnYicsIDIpLCAoJ2EnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KV0KKyAgICAgICAgc2h1ZmZsZShwYWlycykKKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdChwYWlycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob2QpLCBsZW4ocGFpcnMpKQorICAgICAgICBvZC5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9kKSwgMCkKKworICAgIGRlZiB0ZXN0X2RlbGl0ZW0oc2VsZik6CisgICAgICAgIHBhaXJzID0gWygnYycsIDEpLCAoJ2InLCAyKSwgKCdhJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNildCisgICAgICAgIG9kID0gT3JkZXJlZERpY3QocGFpcnMpCisgICAgICAgIGRlbCBvZFsnYSddCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2EnLCBvZCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICAgICAgICBkZWwgb2RbJ2EnXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qob2QuaXRlbXMoKSksIHBhaXJzWzoyXSArIHBhaXJzWzM6XSkKKworICAgIGRlZiB0ZXN0X3NldGl0ZW0oc2VsZik6CisgICAgICAgIG9kID0gT3JkZXJlZERpY3QoWygnZCcsIDEpLCAoJ2InLCAyKSwgKCdjJywgMyksICgnYScsIDQpLCAoJ2UnLCA1KV0pCisgICAgICAgIG9kWydjJ10gPSAxMCAgICAgICAgICAgIyBleGlzdGluZyBlbGVtZW50CisgICAgICAgIG9kWydmJ10gPSAyMCAgICAgICAgICAgIyBuZXcgZWxlbWVudAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qob2QuaXRlbXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygnZCcsIDEpLCAoJ2InLCAyKSwgKCdjJywgMTApLCAoJ2EnLCA0KSwgKCdlJywgNSksICgnZicsIDIwKV0pCisKKyAgICBkZWYgdGVzdF9pdGVyYXRvcnMoc2VsZik6CisgICAgICAgIHBhaXJzID0gWygnYycsIDEpLCAoJ2InLCAyKSwgKCdhJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNildCisgICAgICAgIHNodWZmbGUocGFpcnMpCisgICAgICAgIG9kID0gT3JkZXJlZERpY3QocGFpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChvZCksIFt0WzBdIGZvciB0IGluIHBhaXJzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZC5rZXlzKClbOl0sIFt0WzBdIGZvciB0IGluIHBhaXJzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZC52YWx1ZXMoKVs6XSwgW3RbMV0gZm9yIHQgaW4gcGFpcnNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kLml0ZW1zKClbOl0sIHBhaXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qob2QuaXRlcmtleXMoKSksIFt0WzBdIGZvciB0IGluIHBhaXJzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG9kLml0ZXJ2YWx1ZXMoKSksIFt0WzFdIGZvciB0IGluIHBhaXJzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG9kLml0ZXJpdGVtcygpKSwgcGFpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChyZXZlcnNlZChvZCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFt0WzBdIGZvciB0IGluIHJldmVyc2VkKHBhaXJzKV0pCisKKyAgICBkZWYgdGVzdF9wb3BpdGVtKHNlbGYpOgorICAgICAgICBwYWlycyA9IFsoJ2MnLCAxKSwgKCdiJywgMiksICgnYScsIDMpLCAoJ2QnLCA0KSwgKCdlJywgNSksICgnZicsIDYpXQorICAgICAgICBzaHVmZmxlKHBhaXJzKQorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KHBhaXJzKQorICAgICAgICB3aGlsZSBwYWlyczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2QucG9waXRlbSgpLCBwYWlycy5wb3AoKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICAgICAgICBvZC5wb3BpdGVtKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob2QpLCAwKQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICBwYWlycyA9IFsoJ2MnLCAxKSwgKCdiJywgMiksICgnYScsIDMpLCAoJ2QnLCA0KSwgKCdlJywgNSksICgnZicsIDYpXQorICAgICAgICBzaHVmZmxlKHBhaXJzKQorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KHBhaXJzKQorICAgICAgICBzaHVmZmxlKHBhaXJzKQorICAgICAgICB3aGlsZSBwYWlyczoKKyAgICAgICAgICAgIGssIHYgPSBwYWlycy5wb3AoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZC5wb3AoayksIHYpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgICAgICAgb2QucG9wKCd4eXonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvZCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2QucG9wKGssIDEyMzQ1KSwgMTIzNDUpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgcG9wIHN0aWxsIHdvcmtzIHdoZW4gX19taXNzaW5nX18gaXMgZGVmaW5lZAorICAgICAgICBjbGFzcyBNaXNzaW5nKE9yZGVyZWREaWN0KToKKyAgICAgICAgICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIG0gPSBNaXNzaW5nKGE9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnBvcCgnYicsIDUpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucG9wKCdhJywgNiksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5wb3AoJ2EnLCA2KSwgNikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICAgICAgICBtLnBvcCgnYScpCisKKyAgICBkZWYgdGVzdF9lcXVhbGl0eShzZWxmKToKKyAgICAgICAgcGFpcnMgPSBbKCdjJywgMSksICgnYicsIDIpLCAoJ2EnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KV0KKyAgICAgICAgc2h1ZmZsZShwYWlycykKKyAgICAgICAgb2QxID0gT3JkZXJlZERpY3QocGFpcnMpCisgICAgICAgIG9kMiA9IE9yZGVyZWREaWN0KHBhaXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kMSwgb2QyKSAgICAgICAgICAjIHNhbWUgb3JkZXIgaW1wbGllcyBlcXVhbGl0eQorICAgICAgICBwYWlycyA9IHBhaXJzWzI6XSArIHBhaXJzWzoyXQorICAgICAgICBvZDIgPSBPcmRlcmVkRGljdChwYWlycykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvZDEsIG9kMikgICAgICAgIyBkaWZmZXJlbnQgb3JkZXIgaW1wbGllcyBpbmVxdWFsaXR5CisgICAgICAgICMgY29tcGFyaXNvbiB0byByZWd1bGFyIGRpY3QgaXMgbm90IG9yZGVyIHNlbnNpdGl2ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kMSwgZGljdChvZDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3Qob2QyKSwgb2QxKQorICAgICAgICAjIGRpZmZlcmVudCBsZW5ndGggaW1wbGllZCBpbmVxdWFsaXR5CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwob2QxLCBPcmRlcmVkRGljdChwYWlyc1s6LTFdKSkKKworICAgIGRlZiB0ZXN0X2NvcHlpbmcoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBvcmRlcmVkIGRpY3RzIGFyZSBjb3B5YWJsZSwgZGVlcGNvcHlhYmxlLCBwaWNrbGFibGUsCisgICAgICAgICMgYW5kIGhhdmUgYSByZXByL2V2YWwgcm91bmQtdHJpcAorICAgICAgICBwYWlycyA9IFsoJ2MnLCAxKSwgKCdiJywgMiksICgnYScsIDMpLCAoJ2QnLCA0KSwgKCdlJywgNSksICgnZicsIDYpXQorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KHBhaXJzKQorICAgICAgICB1cGRhdGVfdGVzdCA9IE9yZGVyZWREaWN0KCkKKyAgICAgICAgdXBkYXRlX3Rlc3QudXBkYXRlKG9kKQorICAgICAgICBmb3IgaSwgZHVwIGluIGVudW1lcmF0ZShbCisgICAgICAgICAgICAgICAgICAgIG9kLmNvcHkoKSwKKyAgICAgICAgICAgICAgICAgICAgY29weS5jb3B5KG9kKSwKKyAgICAgICAgICAgICAgICAgICAgY29weS5kZWVwY29weShvZCksCisgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMob2QsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhvZCwgMSkpLAorICAgICAgICAgICAgICAgICAgICBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKG9kLCAyKSksCisgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMob2QsIC0xKSksCisgICAgICAgICAgICAgICAgICAgIGV2YWwocmVwcihvZCkpLAorICAgICAgICAgICAgICAgICAgICB1cGRhdGVfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgT3JkZXJlZERpY3Qob2QpLAorICAgICAgICAgICAgICAgICAgICBdKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdXAgaXMgbm90IG9kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdXAsIG9kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGR1cC5pdGVtcygpKSwgbGlzdChvZC5pdGVtcygpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGR1cCksIGxlbihvZCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZHVwKSwgdHlwZShvZCkpCisKKyAgICBkZWYgdGVzdF95YW1sX2xpbmthZ2Uoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgX19yZWR1Y2VfXyBpcyBzZXR1cCBpbiBhIHdheSB0aGF0IHN1cHBvcnRzIFB5WUFNTCdzIGR1bXAoKSBmZWF0dXJlLgorICAgICAgICAjIEluIHlhbWwsIGxpc3RzIGFyZSBuYXRpdmUgYnV0IHR1cGxlcyBhcmUgbm90LgorICAgICAgICBwYWlycyA9IFsoJ2MnLCAxKSwgKCdiJywgMiksICgnYScsIDMpLCAoJ2QnLCA0KSwgKCdlJywgNSksICgnZicsIDYpXQorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KHBhaXJzKQorICAgICAgICAjIHlhbWwuZHVtcChvZCkgLS0+CisgICAgICAgICMgJyEhcHl0aG9uL29iamVjdC9hcHBseTpfX21haW5fXy5PcmRlcmVkRGljdFxuLSAtIFthLCAxXVxuICAtIFtiLCAyXVxuJworICAgICAgICBzZWxmLmFzc2VydFRydWUoYWxsKHR5cGUocGFpcik9PWxpc3QgZm9yIHBhaXIgaW4gb2QuX19yZWR1Y2VfXygpWzFdKSkKKworICAgIGRlZiB0ZXN0X3JlZHVjZV9ub3RfdG9vX2ZhdChzZWxmKToKKyAgICAgICAgIyBkbyBub3Qgc2F2ZSBpbnN0YW5jZSBkaWN0aW9uYXJ5IGlmIG5vdCBuZWVkZWQKKyAgICAgICAgcGFpcnMgPSBbKCdjJywgMSksICgnYicsIDIpLCAoJ2EnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KV0KKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdChwYWlycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob2QuX19yZWR1Y2VfXygpKSwgMikKKyAgICAgICAgb2QueCA9IDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9kLl9fcmVkdWNlX18oKSksIDMpCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KFsoJ2MnLCAxKSwgKCdiJywgMiksICgnYScsIDMpLCAoJ2QnLCA0KSwgKCdlJywgNSksICgnZicsIDYpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKG9kKSwKKyAgICAgICAgICAgICJPcmRlcmVkRGljdChbKCdjJywgMSksICgnYicsIDIpLCAoJ2EnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KV0pIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHJlcHIob2QpKSwgb2QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihPcmRlcmVkRGljdCgpKSwgIk9yZGVyZWREaWN0KCkiKQorCisgICAgZGVmIHRlc3RfcmVwcl9yZWN1cnNpdmUoc2VsZik6CisgICAgICAgICMgU2VlIGlzc3VlICM5ODI2CisgICAgICAgIG9kID0gT3JkZXJlZERpY3QuZnJvbWtleXMoJ2FiYycpCisgICAgICAgIG9kWyd4J10gPSBvZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIob2QpLAorICAgICAgICAgICAgIk9yZGVyZWREaWN0KFsoJ2EnLCBOb25lKSwgKCdiJywgTm9uZSksICgnYycsIE5vbmUpLCAoJ3gnLCAuLi4pXSkiKQorCisgICAgZGVmIHRlc3Rfc2V0ZGVmYXVsdChzZWxmKToKKyAgICAgICAgcGFpcnMgPSBbKCdjJywgMSksICgnYicsIDIpLCAoJ2EnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KV0KKyAgICAgICAgc2h1ZmZsZShwYWlycykKKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdChwYWlycykKKyAgICAgICAgcGFpcl9vcmRlciA9IGxpc3Qob2QuaXRlbXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZC5zZXRkZWZhdWx0KCdhJywgMTApLCAzKQorICAgICAgICAjIG1ha2Ugc3VyZSBvcmRlciBkaWRuJ3QgY2hhbmdlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChvZC5pdGVtcygpKSwgcGFpcl9vcmRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZC5zZXRkZWZhdWx0KCd4JywgMTApLCAxMCkKKyAgICAgICAgIyBtYWtlIHN1cmUgJ3gnIGlzIGFkZGVkIHRvIHRoZSBlbmQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG9kLml0ZW1zKCkpWy0xXSwgKCd4JywgMTApKQorCisgICAgICAgICMgbWFrZSBzdXJlIHNldGRlZmF1bHQgc3RpbGwgd29ya3Mgd2hlbiBfX21pc3NpbmdfXyBpcyBkZWZpbmVkCisgICAgICAgIGNsYXNzIE1pc3NpbmcoT3JkZXJlZERpY3QpOgorICAgICAgICAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNaXNzaW5nKCkuc2V0ZGVmYXVsdCg1LCA5KSwgOSkKKworICAgIGRlZiB0ZXN0X3JlaW5zZXJ0KHNlbGYpOgorICAgICAgICAjIEdpdmVuIGluc2VydCBhLCBpbnNlcnQgYiwgZGVsZXRlIGEsIHJlLWluc2VydCBhLAorICAgICAgICAjIHZlcmlmeSB0aGF0IGEgaXMgbm93IGxhdGVyIHRoYW4gYi4KKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdCgpCisgICAgICAgIG9kWydhJ10gPSAxCisgICAgICAgIG9kWydiJ10gPSAyCisgICAgICAgIGRlbCBvZFsnYSddCisgICAgICAgIG9kWydhJ10gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChvZC5pdGVtcygpKSwgWygnYicsIDIpLCAoJ2EnLCAxKV0pCisKKyAgICBkZWYgdGVzdF92aWV3cyhzZWxmKToKKyAgICAgICAgcyA9ICd0aGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIGEgbGF6eSBkb2cgeWVzdGVyZGF5IGJlZm9yZSBkYXduJy5zcGxpdCgpCisgICAgICAgIG9kID0gT3JkZXJlZERpY3QuZnJvbWtleXMocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG9kLnZpZXdrZXlzKCkpLCAgcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG9kLnZpZXd2YWx1ZXMoKSksICBbTm9uZSBmb3IgayBpbiBzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG9kLnZpZXdpdGVtcygpKSwgIFsoaywgTm9uZSkgZm9yIGsgaW4gc10pCisKKyAgICBkZWYgdGVzdF9vdmVycmlkZV91cGRhdGUoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdXBkYXRlKCkgd2l0aG91dCBicmVha2luZyBfX2luaXRfXygpCisgICAgICAgIGNsYXNzIE15T0QoT3JkZXJlZERpY3QpOgorICAgICAgICAgICAgZGVmIHVwZGF0ZShzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oKQorICAgICAgICBpdGVtcyA9IFsoJ2EnLCAxKSwgKCdjJywgMyksICgnYicsIDIpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoTXlPRChpdGVtcykuaXRlbXMoKSksIGl0ZW1zKQorCitjbGFzcyBHZW5lcmFsTWFwcGluZ1Rlc3RzKG1hcHBpbmdfdGVzdHMuQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sKToKKyAgICB0eXBlMnRlc3QgPSBPcmRlcmVkRGljdAorCisgICAgZGVmIHRlc3RfcG9waXRlbShzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5wb3BpdGVtKQorCitjbGFzcyBNeU9yZGVyZWREaWN0KE9yZGVyZWREaWN0KToKKyAgICBwYXNzCisKK2NsYXNzIFN1YmNsYXNzTWFwcGluZ1Rlc3RzKG1hcHBpbmdfdGVzdHMuQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sKToKKyAgICB0eXBlMnRlc3QgPSBNeU9yZGVyZWREaWN0CisKKyAgICBkZWYgdGVzdF9wb3BpdGVtKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBkLnBvcGl0ZW0pCisKK2ltcG9ydCBjb2xsZWN0aW9ucworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgTmFtZWRUdXBsZURvY3MgPSBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZShtb2R1bGU9Y29sbGVjdGlvbnMpCisgICAgdGVzdF9jbGFzc2VzID0gW1Rlc3ROYW1lZFR1cGxlLCBOYW1lZFR1cGxlRG9jcywgVGVzdE9uZVRyaWNrUG9ueUFCQ3MsCisgICAgICAgICAgICAgICAgICAgIFRlc3RDb2xsZWN0aW9uQUJDcywgVGVzdENvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgIFRlc3RPcmRlcmVkRGljdCwgR2VuZXJhbE1hcHBpbmdUZXN0cywgU3ViY2xhc3NNYXBwaW5nVGVzdHNdCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdChjb2xsZWN0aW9ucywgdmVyYm9zZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZmQ0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZmQ0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29sb3JzeXMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2xvcnN5cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNkODg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29sb3JzeXMucHkKQEAgLTAsMCArMSw3NiBAQAoraW1wb3J0IHVuaXR0ZXN0LCB0ZXN0LnRlc3Rfc3VwcG9ydAoraW1wb3J0IGNvbG9yc3lzCisKK2RlZiBmcmFuZ2Uoc3RhcnQsIHN0b3AsIHN0ZXApOgorICAgIHdoaWxlIHN0YXJ0IDw9IHN0b3A6CisgICAgICAgIHlpZWxkIHN0YXJ0CisgICAgICAgIHN0YXJ0ICs9IHN0ZXAKKworY2xhc3MgQ29sb3JzeXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBhc3NlcnRUcmlwbGVFcXVhbChzZWxmLCB0cjEsIHRyMik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRyMSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRyMiksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwodHIxWzBdLCB0cjJbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwodHIxWzFdLCB0cjJbMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwodHIxWzJdLCB0cjJbMl0pCisKKyAgICBkZWYgdGVzdF9oc3Zfcm91bmR0cmlwKHNlbGYpOgorICAgICAgICBmb3IgciBpbiBmcmFuZ2UoMC4wLCAxLjAsIDAuMik6CisgICAgICAgICAgICBmb3IgZyBpbiBmcmFuZ2UoMC4wLCAxLjAsIDAuMik6CisgICAgICAgICAgICAgICAgZm9yIGIgaW4gZnJhbmdlKDAuMCwgMS4wLCAwLjIpOgorICAgICAgICAgICAgICAgICAgICByZ2IgPSAociwgZywgYikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcmlwbGVFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc3lzLmhzdl90b19yZ2IoKmNvbG9yc3lzLnJnYl90b19oc3YoKnJnYikpCisgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2hzdl92YWx1ZXMoc2VsZik6CisgICAgICAgIHZhbHVlcyA9IFsKKyAgICAgICAgICAgICMgcmdiLCBoc3YKKyAgICAgICAgICAgICgoMC4wLCAwLjAsIDAuMCksICggIDAgICwgMC4wLCAwLjApKSwgIyBibGFjaworICAgICAgICAgICAgKCgwLjAsIDAuMCwgMS4wKSwgKDQuLzYuLCAxLjAsIDEuMCkpLCAjIGJsdWUKKyAgICAgICAgICAgICgoMC4wLCAxLjAsIDAuMCksICgyLi82LiwgMS4wLCAxLjApKSwgIyBncmVlbgorICAgICAgICAgICAgKCgwLjAsIDEuMCwgMS4wKSwgKDMuLzYuLCAxLjAsIDEuMCkpLCAjIGN5YW4KKyAgICAgICAgICAgICgoMS4wLCAwLjAsIDAuMCksICggIDAgICwgMS4wLCAxLjApKSwgIyByZWQKKyAgICAgICAgICAgICgoMS4wLCAwLjAsIDEuMCksICg1Li82LiwgMS4wLCAxLjApKSwgIyBwdXJwbGUKKyAgICAgICAgICAgICgoMS4wLCAxLjAsIDAuMCksICgxLi82LiwgMS4wLCAxLjApKSwgIyB5ZWxsb3cKKyAgICAgICAgICAgICgoMS4wLCAxLjAsIDEuMCksICggIDAgICwgMC4wLCAxLjApKSwgIyB3aGl0ZQorICAgICAgICAgICAgKCgwLjUsIDAuNSwgMC41KSwgKCAgMCAgLCAwLjAsIDAuNSkpLCAjIGdyZXkKKyAgICAgICAgXQorICAgICAgICBmb3IgKHJnYiwgaHN2KSBpbiB2YWx1ZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRyaXBsZUVxdWFsKGhzdiwgY29sb3JzeXMucmdiX3RvX2hzdigqcmdiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJpcGxlRXF1YWwocmdiLCBjb2xvcnN5cy5oc3ZfdG9fcmdiKCpoc3YpKQorCisgICAgZGVmIHRlc3RfaGxzX3JvdW5kdHJpcChzZWxmKToKKyAgICAgICAgZm9yIHIgaW4gZnJhbmdlKDAuMCwgMS4wLCAwLjIpOgorICAgICAgICAgICAgZm9yIGcgaW4gZnJhbmdlKDAuMCwgMS4wLCAwLjIpOgorICAgICAgICAgICAgICAgIGZvciBiIGluIGZyYW5nZSgwLjAsIDEuMCwgMC4yKToKKyAgICAgICAgICAgICAgICAgICAgcmdiID0gKHIsIGcsIGIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJpcGxlRXF1YWwoCisgICAgICAgICAgICAgICAgICAgICAgICByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnN5cy5obHNfdG9fcmdiKCpjb2xvcnN5cy5yZ2JfdG9faGxzKCpyZ2IpKQorICAgICAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9obHNfdmFsdWVzKHNlbGYpOgorICAgICAgICB2YWx1ZXMgPSBbCisgICAgICAgICAgICAjIHJnYiwgaGxzCisgICAgICAgICAgICAoKDAuMCwgMC4wLCAwLjApLCAoICAwICAsIDAuMCwgMC4wKSksICMgYmxhY2sKKyAgICAgICAgICAgICgoMC4wLCAwLjAsIDEuMCksICg0Li82LiwgMC41LCAxLjApKSwgIyBibHVlCisgICAgICAgICAgICAoKDAuMCwgMS4wLCAwLjApLCAoMi4vNi4sIDAuNSwgMS4wKSksICMgZ3JlZW4KKyAgICAgICAgICAgICgoMC4wLCAxLjAsIDEuMCksICgzLi82LiwgMC41LCAxLjApKSwgIyBjeWFuCisgICAgICAgICAgICAoKDEuMCwgMC4wLCAwLjApLCAoICAwICAsIDAuNSwgMS4wKSksICMgcmVkCisgICAgICAgICAgICAoKDEuMCwgMC4wLCAxLjApLCAoNS4vNi4sIDAuNSwgMS4wKSksICMgcHVycGxlCisgICAgICAgICAgICAoKDEuMCwgMS4wLCAwLjApLCAoMS4vNi4sIDAuNSwgMS4wKSksICMgeWVsbG93CisgICAgICAgICAgICAoKDEuMCwgMS4wLCAxLjApLCAoICAwICAsIDEuMCwgMC4wKSksICMgd2hpdGUKKyAgICAgICAgICAgICgoMC41LCAwLjUsIDAuNSksICggIDAgICwgMC41LCAwLjApKSwgIyBncmV5CisgICAgICAgIF0KKyAgICAgICAgZm9yIChyZ2IsIGhscykgaW4gdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcmlwbGVFcXVhbChobHMsIGNvbG9yc3lzLnJnYl90b19obHMoKnJnYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRyaXBsZUVxdWFsKHJnYiwgY29sb3JzeXMuaGxzX3RvX3JnYigqaGxzKSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDb2xvcnN5c1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbG9yc3lzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbG9yc3lzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzgzYjBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29sb3JzeXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbG9yc3lzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbG9yc3lzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzgzYjBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29sb3JzeXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbW1hbmRzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tbWFuZHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY2YjE4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbW1hbmRzLnB5CkBAIC0wLDAgKzEsNzQgQEAKKycnJworICAgVGVzdHMgZm9yIGNvbW1hbmRzIG1vZHVsZQorICAgTmljayBNYXRoZXdzb24KKycnJworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MsIHRlbXBmaWxlLCByZQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIHJlYXBfY2hpbGRyZW4sIGltcG9ydF9tb2R1bGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3dhcm5pbmdzCisKKyMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKK2NvbW1hbmRzID0gaW1wb3J0X21vZHVsZSgnY29tbWFuZHMnLCBkZXByZWNhdGVkPVRydWUpCisKKyMgVGhlIG1vZHVsZSBzYXlzOgorIyAgICJOQiBUaGlzIG9ubHkgd29ya3MgKGFuZCBpcyBvbmx5IHJlbGV2YW50KSBmb3IgVU5JWC4iCisjCisjIEFjdHVhbGx5LCBnZXRvdXRwdXQgc2hvdWxkIHdvcmsgb24gYW55IHBsYXRmb3JtIHdpdGggYW4gb3MucG9wZW4sIGJ1dAorIyBJJ2xsIHRha2UgdGhlIGNvbW1lbnQgYXMgZ2l2ZW4sIGFuZCBza2lwIHRoaXMgc3VpdGUuCisKK2lmIG9zLm5hbWUgIT0gJ3Bvc2l4JzoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgnTm90IHBvc2l4OyBza2lwcGluZyB0ZXN0X2NvbW1hbmRzJykKKworCitjbGFzcyBDb21tYW5kVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZ2V0b3V0cHV0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbW1hbmRzLmdldG91dHB1dCgnZWNobyB4eXp6eScpLCAneHl6enknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbW1hbmRzLmdldHN0YXR1c291dHB1dCgnZWNobyB4eXp6eScpLCAoMCwgJ3h5enp5JykpCisKKyAgICAgICAgIyB3ZSB1c2UgbWtkdGVtcCBpbiB0aGUgbmV4dCBsaW5lIHRvIGNyZWF0ZSBhbiBlbXB0eSBkaXJlY3RvcnkKKyAgICAgICAgIyB1bmRlciBvdXIgZXhjbHVzaXZlIGNvbnRyb2w7IGZyb20gdGhhdCwgd2UgY2FuIGludmVudCBhIHBhdGhuYW1lCisgICAgICAgICMgdGhhdCB3ZSBfa25vd18gd29uJ3QgZXhpc3QuICBUaGlzIGlzIGd1YXJhbnRlZWQgdG8gZmFpbC4KKyAgICAgICAgZGlyID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyLCAiZm9vIikKKworICAgICAgICAgICAgc3RhdHVzLCBvdXRwdXQgPSBjb21tYW5kcy5nZXRzdGF0dXNvdXRwdXQoJ2NhdCAnICsgbmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc3RhdHVzLCAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgZGlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG9zLnJtZGlyKGRpcikKKworICAgIGRlZiB0ZXN0X2dldHN0YXR1cyhzZWxmKToKKyAgICAgICAgIyBUaGlzIHBhdHRlcm4gc2hvdWxkIG1hdGNoICdscyAtbGQgLy4nIG9uIGFueSBwb3NpeAorICAgICAgICAjIHN5c3RlbSwgaG93ZXZlciBwZXJ2ZXJzZWx5IGNvbmZpZ3VyZWQuICBFdmVuIG9uIHN5c3RlbXMKKyAgICAgICAgIyAoZS5nLiwgQ3lnd2luKSB3aGVyZSB1c2VyIGFuZCBncm91cCBuYW1lcyBjYW4gaGF2ZSBzcGFjZXM6CisgICAgICAgICMgICAgIGRyd3hyLXhyLXggICAxNSBBZG1pbmlzdCBEb21haW4gVSAgICAgNDA5NiBBdWcgMTIgMTI6NTAgLworICAgICAgICAjICAgICBkcnd4ci14ci14ICAgMTUgSm9lIFVzZXIgTXkgR3JvdXAgICAgIDQwOTYgQXVnIDEyIDEyOjUwIC8KKyAgICAgICAgIyBOb3RlIHRoYXQgdGhlIGZpcnN0IGNhc2UgYWJvdmUgaGFzIGEgc3BhY2UgaW4gdGhlIGdyb3VwIG5hbWUKKyAgICAgICAgIyB3aGlsZSB0aGUgc2Vjb25kIG9uZSBoYXMgYSBzcGFjZSBpbiBib3RoIG5hbWVzLgorICAgICAgICAjIFNwZWNpYWwgYXR0cmlidXRlcyBzdXBwb3J0ZWQ6CisgICAgICAgICMgICArID0gaGFzIEFDTHMKKyAgICAgICAgIyAgIEAgPSBoYXMgTWFjIE9TIFggZXh0ZW5kZWQgYXR0cmlidXRlcworICAgICAgICAjICAgLiA9IGhhcyBhIFNFTGludXggc2VjdXJpdHkgY29udGV4dAorICAgICAgICBwYXQgPSByJycnZC4uLi4uLi4uLiAgICMgSXQgaXMgYSBkaXJlY3RvcnkuCisgICAgICAgICAgICAgICAgICBbLitAXT8gICAgICAgIyBJdCBtYXkgaGF2ZSBzcGVjaWFsIGF0dHJpYnV0ZXMuCisgICAgICAgICAgICAgICAgICBccytcZCsgICAgICAgIyBJdCBoYXMgc29tZSBudW1iZXIgb2YgbGlua3MuCisgICAgICAgICAgICAgICAgICBbXi9dKiAgICAgICAgIyBTa2lwIHVzZXIsIGdyb3VwLCBzaXplLCBhbmQgZGF0ZS4KKyAgICAgICAgICAgICAgICAgIC9cLiAgICAgICAgICAjIGFuZCBlbmQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KKyAgICAgICAgICAgICAgICcnJworCisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCIuKmNvbW1hbmRzLmdldHN0YXR1cy4uIGlzIGRlcHJlY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChwYXQsIGNvbW1hbmRzLmdldHN0YXR1cygiLy4iKSwgcmUuVkVSQk9TRSkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChDb21tYW5kVGVzdHMpCisgICAgcmVhcF9jaGlsZHJlbigpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tbWFuZHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tbWFuZHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMzM3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21tYW5kcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tbWFuZHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tbWFuZHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMzM3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21tYW5kcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGFyZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBhcmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkYTgwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBhcmUucHkKQEAgLTAsMCArMSw1OCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBFbXB0eToKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPEVtcHR5PicKKworY2xhc3MgQ29lcmNlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLmFyZyA9IGFyZworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJzxDb2VyY2UgJXM+JyAlIHNlbGYuYXJnCisKKyAgICBkZWYgX19jb2VyY2VfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIENvZXJjZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hcmcsIG90aGVyLmFyZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXJnLCBvdGhlcgorCitjbGFzcyBDbXA6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsYXJnKToKKyAgICAgICAgc2VsZi5hcmcgPSBhcmcKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8Q21wICVzPicgJSBzZWxmLmFyZworCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gY21wKHNlbGYuYXJnLCBvdGhlcikKKworY2xhc3MgQ29tcGFyaXNvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHNldDEgPSBbMiwgMi4wLCAyTCwgMiswaiwgQ29lcmNlKDIpLCBDbXAoMi4wKV0KKyAgICBzZXQyID0gW1sxXSwgKDMsKSwgTm9uZSwgRW1wdHkoKV0KKyAgICBjYW5kaWRhdGVzID0gc2V0MSArIHNldDIKKworICAgIGRlZiB0ZXN0X2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBmb3IgYSBpbiBzZWxmLmNhbmRpZGF0ZXM6CisgICAgICAgICAgICBmb3IgYiBpbiBzZWxmLmNhbmRpZGF0ZXM6CisgICAgICAgICAgICAgICAgaWYgKChhIGluIHNlbGYuc2V0MSkgYW5kIChiIGluIHNlbGYuc2V0MSkpIG9yIGEgaXMgYjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYSwgYikKKworICAgIGRlZiB0ZXN0X2lkX2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICAjIEVuc3VyZSBkZWZhdWx0IGNvbXBhcmlzb24gY29tcGFyZXMgaWQoKSBvZiBhcmdzCisgICAgICAgIEwgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBMLmluc2VydChsZW4oTCkvLzIsIEVtcHR5KCkpCisgICAgICAgIGZvciBhIGluIEw6CisgICAgICAgICAgICBmb3IgYiBpbiBMOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGEsIGIpLCBjbXAoaWQoYSksIGlkKGIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhPSVyLCBiPSVyJyAlIChhLCBiKSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ29tcGFyaXNvblRlc3QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBhcmUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGFyZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxN2E2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBhcmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBhcmUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGFyZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxN2E2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBhcmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBpbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiY2I0MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlLnB5CkBAIC0wLDAgKzEsNTI2IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBfYXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHRleHR3cmFwCisKK2NsYXNzIFRlc3RTcGVjaWZpY3ModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfbm9fZW5kaW5nX25ld2xpbmUoc2VsZik6CisgICAgICAgIGNvbXBpbGUoImhpIiwgIjx0ZXN0PiIsICJleGVjIikKKyAgICAgICAgY29tcGlsZSgiaGlcciIsICI8dGVzdD4iLCAiZXhlYyIpCisKKyAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKKyAgICAgICAgY29tcGlsZSgiIiwgIjx0ZXN0PiIsICJleGVjIikKKworICAgIGRlZiB0ZXN0X290aGVyX25ld2xpbmVzKHNlbGYpOgorICAgICAgICBjb21waWxlKCJcclxuIiwgIjx0ZXN0PiIsICJleGVjIikKKyAgICAgICAgY29tcGlsZSgiXHIiLCAiPHRlc3Q+IiwgImV4ZWMiKQorICAgICAgICBjb21waWxlKCJoaVxyXG5zdHVmZlxyXG5kZWYgZigpOlxuICAgIHBhc3NcciIsICI8dGVzdD4iLCAiZXhlYyIpCisgICAgICAgIGNvbXBpbGUoInRoaXNfaXNccnJlYWxseV9vbGRfbWFjXHJkZWYgZigpOlxuICAgIHBhc3MiLCAiPHRlc3Q+IiwgImV4ZWMiKQorCisgICAgZGVmIHRlc3RfZGVidWdfYXNzaWdubWVudChzZWxmKToKKyAgICAgICAgIyBjYXRjaCBhc3NpZ25tZW50cyB0byBfX2RlYnVnX18KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGUsICdfX2RlYnVnX18gPSAxJywgJz8nLCAnc2luZ2xlJykKKyAgICAgICAgaW1wb3J0IF9fYnVpbHRpbl9fCisgICAgICAgIHByZXYgPSBfX2J1aWx0aW5fXy5fX2RlYnVnX18KKyAgICAgICAgc2V0YXR0cihfX2J1aWx0aW5fXywgJ19fZGVidWdfXycsICdzdXJlJykKKyAgICAgICAgc2V0YXR0cihfX2J1aWx0aW5fXywgJ19fZGVidWdfXycsIHByZXYpCisKKyAgICBkZWYgdGVzdF9hcmd1bWVudF9oYW5kbGluZyhzZWxmKToKKyAgICAgICAgIyBkZXRlY3QgZHVwbGljYXRlIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAnbGFtYmRhIGEsYTowJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICdsYW1iZGEgYSxhPTE6MCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAnbGFtYmRhIGE9MSxhPTE6MCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgJ2RlZiBmKGEsIGEpOiBwYXNzJworICAgICAgICAgICAgc2VsZi5mYWlsKCJkdXBsaWNhdGUgYXJndW1lbnRzIikKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjICdkZWYgZihhID0gMCwgYSA9IDEpOiBwYXNzJworICAgICAgICAgICAgc2VsZi5mYWlsKCJkdXBsaWNhdGUga2V5d29yZCBhcmd1bWVudHMiKQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgJ2RlZiBmKGEpOiBnbG9iYWwgYTsgYSA9IDEnCisgICAgICAgICAgICBzZWxmLmZhaWwoInZhcmlhYmxlIGlzIGdsb2JhbCBhbmQgbG9jYWwiKQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9zeW50YXhfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlLCAiMSsqMyIsICJmaWxlbmFtZSIsICJleGVjIikKKworICAgIGRlZiB0ZXN0X25vbmVfa2V5d29yZF9hcmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlLCAiZihOb25lPTEpIiwgIjxzdHJpbmc+IiwgImV4ZWMiKQorCisgICAgZGVmIHRlc3RfZHVwbGljYXRlX2dsb2JhbF9sb2NhbChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYyAnZGVmIGYoYSk6IGdsb2JhbCBhOyBhID0gMScKKyAgICAgICAgICAgIHNlbGYuZmFpbCgidmFyaWFibGUgaXMgZ2xvYmFsIGFuZCBsb2NhbCIpCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2V4ZWNfZnVuY3Rpb25hbF9zdHlsZShzZWxmKToKKyAgICAgICAgIyBFeGVjJ2luZyBhIHR1cGxlIG9mIGxlbmd0aCAyIHdvcmtzLgorICAgICAgICBnID0geydiJzogMn0KKyAgICAgICAgZXhlYygiYSA9IGIgKyAxIiwgZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnWydhJ10sIDMpCisKKyAgICAgICAgIyBBcyBkb2VzIGV4ZWMnaW5nIGEgdHVwbGUgb2YgbGVuZ3RoIDMuCisgICAgICAgIGwgPSB7J2InOiAzfQorICAgICAgICBnID0geydiJzogNSwgJ2MnOiA3fQorICAgICAgICBleGVjKCJhID0gYiArIGMiLCBnLCBsKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdhJywgZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWydhJ10sIDEwKQorCisgICAgICAgICMgVHVwbGVzIG5vdCBvZiBsZW5ndGggMiBvciAzIGFyZSBpbnZhbGlkLgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBleGVjKCJhID0gYiArIDEiLCkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBleGVjKCJhID0gYiArIDEiLCB7fSwge30sIHt9KQorCisgICAgICAgICMgQ2FuJ3QgbWl4IGFuZCBtYXRjaCB0aGUgdHdvIGNhbGxpbmcgZm9ybXMuCisgICAgICAgIGcgPSB7J2EnOiAzLCAnYic6IDR9CisgICAgICAgIGwgPSB7fQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBleGVjKCJhID0gYiArIDEiLCBnKSBpbiBnCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIGV4ZWMoImEgPSBiICsgMSIsIGcsIGwpIGluIGcsIGwKKworICAgIGRlZiB0ZXN0X2V4ZWNfd2l0aF9nZW5lcmFsX21hcHBpbmdfZm9yX2xvY2FscyhzZWxmKToKKworICAgICAgICBjbGFzcyBNOgorICAgICAgICAgICAgIlRlc3QgbWFwcGluZyBpbnRlcmZhY2UgdmVyc3VzIHBvc3NpYmxlIGNhbGxzIGZyb20gZXZhbCgpLiIKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIGlmIGtleSA9PSAnYSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yCisgICAgICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHRzID0gKGtleSwgdmFsdWUpCisgICAgICAgICAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdCgneHl6JykKKworICAgICAgICBtID0gTSgpCisgICAgICAgIGcgPSBnbG9iYWxzKCkKKyAgICAgICAgZXhlYyAneiA9IGEnIGluIGcsIG0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJlc3VsdHMsICgneicsIDEyKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYyAneiA9IGInIGluIGcsIG0KKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnRGlkIG5vdCBkZXRlY3QgYSBLZXlFcnJvcicpCisgICAgICAgIGV4ZWMgJ3ogPSBkaXIoKScgaW4gZywgbQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmVzdWx0cywgKCd6JywgbGlzdCgneHl6JykpKQorICAgICAgICBleGVjICd6ID0gZ2xvYmFscygpJyBpbiBnLCBtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZXN1bHRzLCAoJ3onLCBnKSkKKyAgICAgICAgZXhlYyAneiA9IGxvY2FscygpJyBpbiBnLCBtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZXN1bHRzLCAoJ3onLCBtKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYyAneiA9IGInIGluIG0KKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnRGlkIG5vdCB2YWxpZGF0ZSBnbG9iYWxzIGFzIGEgcmVhbCBkaWN0JykKKworICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgIk5vbi1tYXBwaW5nIgorICAgICAgICAgICAgcGFzcworICAgICAgICBtID0gQSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgJ3ogPSBhJyBpbiBnLCBtCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ0RpZCBub3QgdmFsaWRhdGUgbG9jYWxzIGFzIGEgbWFwcGluZycpCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBkaWN0IHN1YmNsYXNzZXMgd29yayBhcyB3ZWxsCisgICAgICAgIGNsYXNzIEQoZGljdCk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2EnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTIKKyAgICAgICAgICAgICAgICByZXR1cm4gZGljdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCisgICAgICAgIGQgPSBEKCkKKyAgICAgICAgZXhlYyAneiA9IGEnIGluIGcsIGQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWyd6J10sIDEyKQorCisgICAgZGVmIHRlc3RfZXh0ZW5kZWRfYXJnKHNlbGYpOgorICAgICAgICBsb25nZXhwciA9ICd4ID0geCBvciAnICsgJy14JyAqIDI1MDAKKyAgICAgICAgY29kZSA9ICcnJworZGVmIGYoeCk6CisgICAgJXMKKyAgICAlcworICAgICVzCisgICAgJXMKKyAgICAlcworICAgICVzCisgICAgJXMKKyAgICAlcworICAgICVzCisgICAgJXMKKyAgICAjIHRoZSBleHByZXNzaW9ucyBhYm92ZSBoYXZlIG5vIGVmZmVjdCwgeCA9PSBhcmd1bWVudAorICAgIHdoaWxlIHg6CisgICAgICAgIHggLT0gMQorICAgICAgICAjIEVYVEVOREVEX0FSRy9KVU1QX0FCU09MVVRFIGhlcmUKKyAgICByZXR1cm4geAorJycnICUgKChsb25nZXhwciwpKjEwKQorICAgICAgICBleGVjIGNvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKDUpLCAwKQorCisgICAgZGVmIHRlc3RfY29tcGxleF9hcmdzKHNlbGYpOgorCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAgICAgKCJ0dXBsZSBwYXJhbWV0ZXIgdW5wYWNraW5nIGhhcyBiZWVuIHJlbW92ZWQiLCBTeW50YXhXYXJuaW5nKSk6CisgICAgICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgnJycKKyAgICAgICAgZGVmIGNvbXBfYXJncygoYSwgYikpOgorICAgICAgICAgICAgcmV0dXJuIGEsYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBfYXJncygoMSwgMikpLCAoMSwgMikpCisKKyAgICAgICAgZGVmIGNvbXBfYXJncygoYSwgYik9KDMsIDQpKToKKyAgICAgICAgICAgIHJldHVybiBhLCBiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcF9hcmdzKCgxLCAyKSksICgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wX2FyZ3MoKSwgKDMsIDQpKQorCisgICAgICAgIGRlZiBjb21wX2FyZ3MoYSwgKGIsIGMpKToKKyAgICAgICAgICAgIHJldHVybiBhLCBiLCBjCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcF9hcmdzKDEsICgyLCAzKSksICgxLCAyLCAzKSkKKworICAgICAgICBkZWYgY29tcF9hcmdzKGE9MiwgKGIsIGMpPSgzLCA0KSk6CisgICAgICAgICAgICByZXR1cm4gYSwgYiwgYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBfYXJncygxLCAoMiwgMykpLCAoMSwgMiwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcF9hcmdzKCksICgyLCAzLCA0KSkKKyAgICAgICAgJycnKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRfb3JkZXIoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgJ2RlZiBmKGE9MSwgKGIsIGMpKTogcGFzcycKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm9uLWRlZmF1bHQgYXJncyBhZnRlciBkZWZhdWx0IikKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfZmxvYXRfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgICMgdGVzdGluZyBiYWQgZmxvYXQgbGl0ZXJhbHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICIyZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiMi4wZSsiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgIjFlLSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiMy00ZS8yMSIpCisKKyAgICBkZWYgdGVzdF9pbmRlbnRhdGlvbihzZWxmKToKKyAgICAgICAgIyB0ZXN0aW5nIGNvbXBpbGUoKSBvZiBpbmRlbnRlZCBibG9jayB3L28gdHJhaWxpbmcgbmV3bGluZSIKKyAgICAgICAgcyA9ICIiIgoraWYgMToKKyAgICBpZiAyOgorICAgICAgICBwYXNzIiIiCisgICAgICAgIGNvbXBpbGUocywgIjxzdHJpbmc+IiwgImV4ZWMiKQorCisgICAgIyBUaGlzIHRlc3QgaXMgcHJvYmFibHkgc3BlY2lmaWMgdG8gQ1B5dGhvbiBhbmQgbWF5IG5vdCBnZW5lcmFsaXplCisgICAgIyB0byBvdGhlciBpbXBsZW1lbnRhdGlvbnMuICBXZSBhcmUgdHJ5aW5nIHRvIGVuc3VyZSB0aGF0IHdoZW4KKyAgICAjIHRoZSBmaXJzdCBsaW5lIG9mIGNvZGUgc3RhcnRzIGFmdGVyIDI1NiwgY29ycmVjdCBsaW5lIG51bWJlcnMKKyAgICAjIGluIHRyYWNlYmFja3MgYXJlIHN0aWxsIHByb2R1Y2VkLgorICAgIGRlZiB0ZXN0X2xlYWRpbmdfbmV3bGluZXMoc2VsZik6CisgICAgICAgIHMyNTYgPSAiIi5qb2luKFsiXG4iXSAqIDI1NiArIFsic3BhbSJdKQorICAgICAgICBjbyA9IGNvbXBpbGUoczI1NiwgJ2ZuJywgJ2V4ZWMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvLmNvX2ZpcnN0bGluZW5vLCAyNTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28uY29fbG5vdGFiLCAnJykKKworICAgIGRlZiB0ZXN0X2xpdGVyYWxzX3dpdGhfbGVhZGluZ196ZXJvZXMoc2VsZik6CisgICAgICAgIGZvciBhcmcgaW4gWyIwNzc3ODciLCAiMHhqIiwgIjB4LiIsICIwZSIsICAiMDkwMDAwMDAwMDAwMDAwIiwKKyAgICAgICAgICAgICAgICAgICAgIjA4MDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDkiLCAiMDAwMDAwMDAwMDAwMDA4IiwKKyAgICAgICAgICAgICAgICAgICAgIjBiNDIiLCAiMEJBRENBRkUiLCAiMG8xMjM0NTY3ODkiLCAiMGIxLjEiLCAiMG80LjIiLAorICAgICAgICAgICAgICAgICAgICAiMGIxMDFqMiIsICIwbzE1M2oyIiwgIjBiMTAwZTEiLCAiMG83NzdlMSIsICIwbzgiLCAiMG83OCJdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsIGFyZykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjA3NzciKSwgNTExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjA3NzdMIiksIDUxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwMDA3NzciKSwgNTExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjB4ZmYiKSwgMjU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjB4ZmZMIiksIDI1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwWGZGIiksIDI1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwNzc3LiIpLCA3NzcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDc3Ny4wIiksIDc3NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3NzdlMCIpLCA3NzcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDc3N2UxIiksIDc3NzApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMGUwIiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDAwMEUtMDEyIiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDkuNSIpLCA5LjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDc3N2oiKSwgNzc3aikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwMGoiKSwgMGopCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDAuMCIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjBlMyIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjA5MDAwMDAwMDAwMDAwMC4iKSwgOTAwMDAwMDAwMDAwMDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjA5MDAwMDAwMDAwMDAwMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiksIDkwMDAwMDAwMDAwMDAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwOTAwMDAwMDAwMDAwMDBlMCIpLCA5MDAwMDAwMDAwMDAwMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDkwMDAwMDAwMDAwMDAwZS0wIiksIDkwMDAwMDAwMDAwMDAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwOTAwMDAwMDAwMDAwMDBqIiksIDkwMDAwMDAwMDAwMDAwaikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwMDAwMDAwMDAwMDAwMDciKSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwMDAwMDAwMDAwMDAwMDguIiksIDguKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjAwMDAwMDAwMDAwMDAwOS4iKSwgOS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMGIxMDEwMTAiKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiLTBiMDAwMDAwMDAwMDEwIiksIC0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjBvNzc3IiksIDUxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCItMG8wMDAwMDEwIiksIC04KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjAyMDAwMDAwMDAwMC4wIiksIDIwMDAwMDAwMDAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDM3Nzc3Nzc3Nzc3ZTAiKSwgMzc3Nzc3Nzc3NzcuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wKQorCisgICAgZGVmIHRlc3RfdW5hcnlfbWludXMoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRyZWF0bWVudCBvZiB1bmFyeSBtaW51cyBvbiBuZWdhdGl2ZSBudW1iZXJzIFNGIGJ1ZyAjNjYwNDU1CisgICAgICAgIGlmIHN5cy5tYXhpbnQgPT0gMjE0NzQ4MzY0NzoKKyAgICAgICAgICAgICMgMzItYml0IG1hY2hpbmUKKyAgICAgICAgICAgIGFsbF9vbmVfYml0cyA9ICcweGZmZmZmZmZmJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGFsbF9vbmVfYml0cyksIDQyOTQ5NjcyOTVMKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCItIiArIGFsbF9vbmVfYml0cyksIC00Mjk0OTY3Mjk1TCkKKyAgICAgICAgZWxpZiBzeXMubWF4aW50ID09IDkyMjMzNzIwMzY4NTQ3NzU4MDc6CisgICAgICAgICAgICAjIDY0LWJpdCBtYWNoaW5lCisgICAgICAgICAgICBhbGxfb25lX2JpdHMgPSAnMHhmZmZmZmZmZmZmZmZmZmZmJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGFsbF9vbmVfYml0cyksIDE4NDQ2NzQ0MDczNzA5NTUxNjE1TCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiLSIgKyBhbGxfb25lX2JpdHMpLCAtMTg0NDY3NDQwNzM3MDk1NTE2MTVMKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJIb3cgbWFueSBiaXRzICpkb2VzKiB0aGlzIG1hY2hpbmUgaGF2ZT8/PyIpCisgICAgICAgICMgVmVyaWZ5IHRyZWF0bWVudCBvZiBjb25zdGFudCBmb2xkaW5nIG9uIC0oc3lzLm1heGludCsxKQorICAgICAgICAjIGkuZS4gLTIxNDc0ODM2NDggb24gMzIgYml0IHBsYXRmb3Jtcy4gIFNob3VsZCByZXR1cm4gaW50LCBub3QgbG9uZy4KKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGV2YWwoIiVzIiAlICgtc3lzLm1heGludCAtIDEpKSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZXZhbCgiJXMiICUgKC1zeXMubWF4aW50IC0gMikpLCBsb25nKQorCisgICAgaWYgc3lzLm1heGludCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3OgorICAgICAgICBkZWYgdGVzdF8zMl82M19iaXRfdmFsdWVzKHNlbGYpOgorICAgICAgICAgICAgYSA9ICs0Mjk0OTY3Mjk2ICAjIDEgPDwgMzIKKyAgICAgICAgICAgIGIgPSAtNDI5NDk2NzI5NiAgIyAxIDw8IDMyCisgICAgICAgICAgICBjID0gKzI4MTQ3NDk3NjcxMDY1NiAgIyAxIDw8IDQ4CisgICAgICAgICAgICBkID0gLTI4MTQ3NDk3NjcxMDY1NiAgIyAxIDw8IDQ4CisgICAgICAgICAgICBlID0gKzQ2MTE2ODYwMTg0MjczODc5MDQgICMgMSA8PCA2MgorICAgICAgICAgICAgZiA9IC00NjExNjg2MDE4NDI3Mzg3OTA0ICAjIDEgPDwgNjIKKyAgICAgICAgICAgIGcgPSArOTIyMzM3MjAzNjg1NDc3NTgwNyAgIyAxIDw8IDYzIC0gMQorICAgICAgICAgICAgaCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3ICAjIDEgPDwgNjMgLSAxCisKKyAgICAgICAgICAgIGZvciB2YXJpYWJsZSBpbiBzZWxmLnRlc3RfMzJfNjNfYml0X3ZhbHVlcy5mdW5jX2NvZGUuY29fY29uc3RzOgorICAgICAgICAgICAgICAgIGlmIHZhcmlhYmxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmFyaWFibGUsIGludCkKKworICAgIGRlZiB0ZXN0X3NlcXVlbmNlX3VucGFja2luZ19lcnJvcihzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgc2VxdWVuY2UgcGFja2luZy91bnBhY2tpbmcgd2l0aCAib3IiLiAgU0YgYnVnICM3NTc4MTgKKyAgICAgICAgaSxqID0gKDEsIC0xKSBvciAoLTEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqLCAtMSkKKworICAgIGRlZiB0ZXN0X25vbmVfYXNzaWdubWVudChzZWxmKToKKyAgICAgICAgc3RtdHMgPSBbCisgICAgICAgICAgICAnTm9uZSA9IDAnLAorICAgICAgICAgICAgJ05vbmUgKz0gMCcsCisgICAgICAgICAgICAnX19idWlsdGluc19fLk5vbmUgPSAwJywKKyAgICAgICAgICAgICdkZWYgTm9uZSgpOiBwYXNzJywKKyAgICAgICAgICAgICdjbGFzcyBOb25lOiBwYXNzJywKKyAgICAgICAgICAgICcoYSwgTm9uZSkgPSAwLCAwJywKKyAgICAgICAgICAgICdmb3IgTm9uZSBpbiByYW5nZSgxMCk6IHBhc3MnLAorICAgICAgICAgICAgJ2RlZiBmKE5vbmUpOiBwYXNzJywKKyAgICAgICAgICAgICdpbXBvcnQgTm9uZScsCisgICAgICAgICAgICAnaW1wb3J0IHggYXMgTm9uZScsCisgICAgICAgICAgICAnZnJvbSB4IGltcG9ydCBOb25lJywKKyAgICAgICAgICAgICdmcm9tIHggaW1wb3J0IHkgYXMgTm9uZScKKyAgICAgICAgXQorICAgICAgICBmb3Igc3RtdCBpbiBzdG10czoKKyAgICAgICAgICAgIHN0bXQgKz0gIlxuIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGUsIHN0bXQsICd0bXAnLCAnc2luZ2xlJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlLCBzdG10LCAndG1wJywgJ2V4ZWMnKQorICAgICAgICAjIFRoaXMgaXMgb2suCisgICAgICAgIGNvbXBpbGUoImZyb20gTm9uZSBpbXBvcnQgeCIsICJ0bXAiLCAiZXhlYyIpCisgICAgICAgIGNvbXBpbGUoImZyb20geCBpbXBvcnQgTm9uZSBhcyB5IiwgInRtcCIsICJleGVjIikKKyAgICAgICAgY29tcGlsZSgiaW1wb3J0IE5vbmUgYXMgeCIsICJ0bXAiLCAiZXhlYyIpCisKKyAgICBkZWYgdGVzdF9pbXBvcnQoc2VsZik6CisgICAgICAgIHN1Y2NlZWQgPSBbCisgICAgICAgICAgICAnaW1wb3J0IHN5cycsCisgICAgICAgICAgICAnaW1wb3J0IG9zLCBzeXMnLAorICAgICAgICAgICAgJ2ltcG9ydCBvcyBhcyBiYXInLAorICAgICAgICAgICAgJ2ltcG9ydCBvcy5wYXRoIGFzIGJhcicsCisgICAgICAgICAgICAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzLCBnZW5lcmF0b3JzJywKKyAgICAgICAgICAgICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IChuZXN0ZWRfc2NvcGVzLFxuZ2VuZXJhdG9ycyknLAorICAgICAgICAgICAgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgKG5lc3RlZF9zY29wZXMsXG5nZW5lcmF0b3JzLCknLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCBzdGRpbiwgc3RkZXJyLCBzdGRvdXQnLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCAoc3RkaW4sIHN0ZGVycixcbnN0ZG91dCknLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCAoc3RkaW4sIHN0ZGVycixcbnN0ZG91dCwpJywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgKHN0ZGluXG4sIHN0ZGVyciwgc3Rkb3V0KScsCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0IChzdGRpblxuLCBzdGRlcnIsIHN0ZG91dCwpJywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgc3RkaW4gYXMgc2ksIHN0ZG91dCBhcyBzbywgc3RkZXJyIGFzIHNlJywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgKHN0ZGluIGFzIHNpLCBzdGRvdXQgYXMgc28sIHN0ZGVyciBhcyBzZSknLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCAoc3RkaW4gYXMgc2ksIHN0ZG91dCBhcyBzbywgc3RkZXJyIGFzIHNlLCknLAorICAgICAgICAgICAgXQorICAgICAgICBmYWlsID0gWworICAgICAgICAgICAgJ2ltcG9ydCAob3MsIHN5cyknLAorICAgICAgICAgICAgJ2ltcG9ydCAob3MpLCAoc3lzKScsCisgICAgICAgICAgICAnaW1wb3J0ICgob3MpLCAoc3lzKSknLAorICAgICAgICAgICAgJ2ltcG9ydCAoc3lzJywKKyAgICAgICAgICAgICdpbXBvcnQgc3lzKScsCisgICAgICAgICAgICAnaW1wb3J0IChvcywpJywKKyAgICAgICAgICAgICdpbXBvcnQgb3MgQXMgYmFyJywKKyAgICAgICAgICAgICdpbXBvcnQgb3MucGF0aCBhIGJhcicsCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0IHN0ZGluIEFzIHN0ZG91dCcsCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0IHN0ZGluIGEgc3Rkb3V0JywKKyAgICAgICAgICAgICdmcm9tIChzeXMpIGltcG9ydCBzdGRpbicsCisgICAgICAgICAgICAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAobmVzdGVkX3Njb3BlcycsCisgICAgICAgICAgICAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzKScsCisgICAgICAgICAgICAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzLFxuZ2VuZXJhdG9ycycsCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0IChzdGRpbicsCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0IHN0ZGluKScsCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0IHN0ZGluLCBzdGRvdXQsXG5zdGRlcnInLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCBzdGRpbiBzaScsCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0IHN0ZGluLCcKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgKCopJywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgKHN0ZGluLCwgc3Rkb3V0LCBzdGRlcnIpJywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgKHN0ZGluLCBzdGRvdXQpLCcsCisgICAgICAgICAgICBdCisgICAgICAgIGZvciBzdG10IGluIHN1Y2NlZWQ6CisgICAgICAgICAgICBjb21waWxlKHN0bXQsICd0bXAnLCAnZXhlYycpCisgICAgICAgIGZvciBzdG10IGluIGZhaWw6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZSwgc3RtdCwgJ3RtcCcsICdleGVjJykKKworICAgIGRlZiB0ZXN0X2Zvcl9kaXN0aW5jdF9jb2RlX29iamVjdHMoc2VsZik6CisgICAgICAgICMgU0YgYnVnIDEwNDg4NzAKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGYxID0gbGFtYmRhIHg9MTogeAorICAgICAgICAgICAgZjIgPSBsYW1iZGEgeD0yOiB4CisgICAgICAgICAgICByZXR1cm4gZjEsIGYyCisgICAgICAgIGYxLCBmMiA9IGYoKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGYxLmZ1bmNfY29kZSksIGlkKGYyLmZ1bmNfY29kZSkpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfZG9jKHNlbGYpOgorICAgICAgICBsID0gbGFtYmRhOiAiZm9vIgorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShsLl9fZG9jX18pCisKKyAgICBkZWYgdGVzdF91bmljb2RlX2VuY29kaW5nKHNlbGYpOgorICAgICAgICBjb2RlID0gdSIjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLVxucGFzc1xuIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZSwgY29kZSwgInRtcCIsICJleGVjIikKKworICAgIGRlZiB0ZXN0X3N1YnNjcmlwdHMoc2VsZik6CisgICAgICAgICMgU0YgYnVnIDE0NDg4MDQKKyAgICAgICAgIyBDbGFzcyB0byBtYWtlIHRlc3Rpbmcgc3Vic2NyaXB0IHJlc3VsdHMgZWFzeQorICAgICAgICBjbGFzcyBzdHJfbWFwKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0ge30KKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRhdGFbc3RyKGtleSldCisgICAgICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5kYXRhW3N0cihrZXkpXSA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5kYXRhW3N0cihrZXkpXQorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdHIoa2V5KSBpbiBzZWxmLmRhdGEKKyAgICAgICAgZCA9IHN0cl9tYXAoKQorICAgICAgICAjIEluZGV4CisgICAgICAgIGRbMV0gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxXSwgMSkKKyAgICAgICAgZFsxXSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxXSwgMikKKyAgICAgICAgZGVsIGRbMV0KKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigxLCBkKQorICAgICAgICAjIFR1cGxlIG9mIGluZGljZXMKKyAgICAgICAgZFsxLCAxXSA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzEsIDFdLCAxKQorICAgICAgICBkWzEsIDFdICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzEsIDFdLCAyKQorICAgICAgICBkZWwgZFsxLCAxXQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCgxLCAxKSwgZCkKKyAgICAgICAgIyBTaW1wbGUgc2xpY2UKKyAgICAgICAgZFsxOjJdID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMToyXSwgMSkKKyAgICAgICAgZFsxOjJdICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzE6Ml0sIDIpCisgICAgICAgIGRlbCBkWzE6Ml0KKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihzbGljZSgxLCAyKSwgZCkKKyAgICAgICAgIyBUdXBsZSBvZiBzaW1wbGUgc2xpY2VzCisgICAgICAgIGRbMToyLCAxOjJdID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMToyLCAxOjJdLCAxKQorICAgICAgICBkWzE6MiwgMToyXSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxOjIsIDE6Ml0sIDIpCisgICAgICAgIGRlbCBkWzE6MiwgMToyXQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKChzbGljZSgxLCAyKSwgc2xpY2UoMSwgMikpLCBkKQorICAgICAgICAjIEV4dGVuZGVkIHNsaWNlCisgICAgICAgIGRbMToyOjNdID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMToyOjNdLCAxKQorICAgICAgICBkWzE6MjozXSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxOjI6M10sIDIpCisgICAgICAgIGRlbCBkWzE6MjozXQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHNsaWNlKDEsIDIsIDMpLCBkKQorICAgICAgICAjIFR1cGxlIG9mIGV4dGVuZGVkIHNsaWNlcworICAgICAgICBkWzE6MjozLCAxOjI6M10gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxOjI6MywgMToyOjNdLCAxKQorICAgICAgICBkWzE6MjozLCAxOjI6M10gKz0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMToyOjMsIDE6MjozXSwgMikKKyAgICAgICAgZGVsIGRbMToyOjMsIDE6MjozXQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKChzbGljZSgxLCAyLCAzKSwgc2xpY2UoMSwgMiwgMykpLCBkKQorICAgICAgICAjIEVsbGlwc2lzCisgICAgICAgIGRbLi4uXSA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWy4uLl0sIDEpCisgICAgICAgIGRbLi4uXSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsuLi5dLCAyKQorICAgICAgICBkZWwgZFsuLi5dCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oRWxsaXBzaXMsIGQpCisgICAgICAgICMgVHVwbGUgb2YgRWxsaXBzZXMKKyAgICAgICAgZFsuLi4sIC4uLl0gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsuLi4sIC4uLl0sIDEpCisgICAgICAgIGRbLi4uLCAuLi5dICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWy4uLiwgLi4uXSwgMikKKyAgICAgICAgZGVsIGRbLi4uLCAuLi5dCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oKEVsbGlwc2lzLCBFbGxpcHNpcyksIGQpCisKKyAgICBkZWYgdGVzdF9tYW5nbGluZyhzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAgICAgX19tYW5nbGVkID0gMQorICAgICAgICAgICAgICAgIF9fbm90X21hbmdsZWRfXyA9IDIKKyAgICAgICAgICAgICAgICBpbXBvcnQgX19tYW5nbGVkX21vZAorICAgICAgICAgICAgICAgIGltcG9ydCBfX3BhY2thZ2VfXy5tb2R1bGUKKworICAgICAgICBzZWxmLmFzc2VydEluKCJfQV9fbWFuZ2xlZCIsIEEuZi5mdW5jX2NvZGUuY29fdmFybmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIl9fbm90X21hbmdsZWRfXyIsIEEuZi5mdW5jX2NvZGUuY29fdmFybmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIl9BX19tYW5nbGVkX21vZCIsIEEuZi5mdW5jX2NvZGUuY29fdmFybmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIl9fcGFja2FnZV9fIiwgQS5mLmZ1bmNfY29kZS5jb192YXJuYW1lcykKKworICAgIGRlZiB0ZXN0X2NvbXBpbGVfYXN0KHNlbGYpOgorICAgICAgICBmbmFtZSA9IF9fZmlsZV9fCisgICAgICAgIGlmIGZuYW1lLmxvd2VyKCkuZW5kc3dpdGgoKCdweWMnLCAncHlvJykpOgorICAgICAgICAgICAgZm5hbWUgPSBmbmFtZVs6LTFdCisgICAgICAgIHdpdGggb3BlbihmbmFtZSwgJ3InKSBhcyBmOgorICAgICAgICAgICAgZmNvbnRlbnRzID0gZi5yZWFkKCkKKyAgICAgICAgc2FtcGxlX2NvZGUgPSBbCisgICAgICAgICAgICBbJzxhc3NpZ24+JywgJ3ggPSA1J10sCisgICAgICAgICAgICBbJzxwcmludDE+JywgJ3ByaW50IDEnXSwKKyAgICAgICAgICAgIFsnPHByaW50dj4nLCAncHJpbnQgdiddLAorICAgICAgICAgICAgWyc8cHJpbnRUcnVlPicsICdwcmludCBUcnVlJ10sCisgICAgICAgICAgICBbJzxwcmludExpc3Q+JywgJ3ByaW50IFtdJ10sCisgICAgICAgICAgICBbJzxpZmJsb2NrPicsICIiImlmIFRydWU6XG4gICAgcGFzc1xuIiIiXSwKKyAgICAgICAgICAgIFsnPGZvcmJsb2NrPicsICIiImZvciBuIGluIFsxLCAyLCAzXTpcbiAgICBwcmludCBuXG4iIiJdLAorICAgICAgICAgICAgWyc8ZGVmZnVuYz4nLCAiIiJkZWYgZm9vKCk6XG4gICAgcGFzc1xuZm9vKClcbiIiIl0sCisgICAgICAgICAgICBbZm5hbWUsIGZjb250ZW50c10sCisgICAgICAgIF0KKworICAgICAgICBmb3IgZm5hbWUsIGNvZGUgaW4gc2FtcGxlX2NvZGU6CisgICAgICAgICAgICBjbzEgPSBjb21waWxlKGNvZGUsICclczEnICUgZm5hbWUsICdleGVjJykKKyAgICAgICAgICAgIGFzdCA9IGNvbXBpbGUoY29kZSwgJyVzMicgJSBmbmFtZSwgJ2V4ZWMnLCBfYXN0LlB5Q0ZfT05MWV9BU1QpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShhc3QpID09IF9hc3QuTW9kdWxlKQorICAgICAgICAgICAgY28yID0gY29tcGlsZShhc3QsICclczMnICUgZm5hbWUsICdleGVjJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28xLCBjbzIpCisgICAgICAgICAgICAjIHRoZSBjb2RlIG9iamVjdCdzIGZpbGVuYW1lIGNvbWVzIGZyb20gdGhlIHNlY29uZCBjb21waWxhdGlvbiBzdGVwCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvMi5jb19maWxlbmFtZSwgJyVzMycgJSBmbmFtZSkKKworICAgICAgICAjIHJhaXNlIGV4Y2VwdGlvbiB3aGVuIG5vZGUgdHlwZSBkb2Vzbid0IG1hdGNoIHdpdGggY29tcGlsZSBtb2RlCisgICAgICAgIGNvMSA9IGNvbXBpbGUoJ3ByaW50IDEnLCAnPHN0cmluZz4nLCAnZXhlYycsIF9hc3QuUHlDRl9PTkxZX0FTVCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21waWxlLCBjbzEsICc8YXN0PicsICdldmFsJykKKworICAgICAgICAjIHJhaXNlIGV4Y2VwdGlvbiB3aGVuIG5vZGUgdHlwZSBpcyBubyBzdGFydCBub2RlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGlsZSwgX2FzdC5JZigpLCAnPGFzdD4nLCAnZXhlYycpCisKKyAgICAgICAgIyByYWlzZSBleGNlcHRpb24gd2hlbiBub2RlIGhhcyBpbnZhbGlkIGNoaWxkcmVuCisgICAgICAgIGFzdCA9IF9hc3QuTW9kdWxlKCkKKyAgICAgICAgYXN0LmJvZHkgPSBbX2FzdC5Cb29sT3AoKV0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21waWxlLCBhc3QsICc8YXN0PicsICdleGVjJykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0U3BlY2lmaWNzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOTRlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOTRlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmY2OTg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weQpAQCAtMCwwICsxLDgwIEBACitpbXBvcnQgY29tcGlsZWFsbAoraW1wb3J0IGltcAoraW1wb3J0IG9zCitpbXBvcnQgcHlfY29tcGlsZQoraW1wb3J0IHNodXRpbAoraW1wb3J0IHN0cnVjdAoraW1wb3J0IHRlbXBmaWxlCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgQ29tcGlsZWFsbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kaXJlY3RvcnkgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi5zb3VyY2VfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmRpcmVjdG9yeSwgJ190ZXN0LnB5JykKKyAgICAgICAgc2VsZi5iY19wYXRoID0gc2VsZi5zb3VyY2VfcGF0aCArICgnYycgaWYgX19kZWJ1Z19fIGVsc2UgJ28nKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5zb3VyY2VfcGF0aCwgJ3cnKSBhcyBmaWxlOgorICAgICAgICAgICAgZmlsZS53cml0ZSgneCA9IDEyM1xuJykKKyAgICAgICAgc2VsZi5zb3VyY2VfcGF0aDIgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJlY3RvcnksICdfdGVzdDIucHknKQorICAgICAgICBzZWxmLmJjX3BhdGgyID0gc2VsZi5zb3VyY2VfcGF0aDIgKyAoJ2MnIGlmIF9fZGVidWdfXyBlbHNlICdvJykKKyAgICAgICAgc2h1dGlsLmNvcHlmaWxlKHNlbGYuc291cmNlX3BhdGgsIHNlbGYuc291cmNlX3BhdGgyKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuZGlyZWN0b3J5KQorCisgICAgZGVmIGRhdGEoc2VsZik6CisgICAgICAgIHdpdGggb3BlbihzZWxmLmJjX3BhdGgsICdyYicpIGFzIGZpbGU6CisgICAgICAgICAgICBkYXRhID0gZmlsZS5yZWFkKDgpCisgICAgICAgIG10aW1lID0gaW50KG9zLnN0YXQoc2VsZi5zb3VyY2VfcGF0aCkuc3RfbXRpbWUpCisgICAgICAgIGNvbXBhcmUgPSBzdHJ1Y3QucGFjaygnPDRzbCcsIGltcC5nZXRfbWFnaWMoKSwgbXRpbWUpCisgICAgICAgIHJldHVybiBkYXRhLCBjb21wYXJlCisKKyAgICBkZWYgcmVjcmVhdGlvbl9jaGVjayhzZWxmLCBtZXRhZGF0YSk6CisgICAgICAgICIiIkNoZWNrIHRoYXQgY29tcGlsZWFsbCByZWNyZWF0ZXMgYnl0ZWNvZGUgd2hlbiB0aGUgbmV3IG1ldGFkYXRhIGlzCisgICAgICAgIHVzZWQuIiIiCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAnc3RhdCcpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHB5X2NvbXBpbGUuY29tcGlsZShzZWxmLnNvdXJjZV9wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCpzZWxmLmRhdGEoKSkKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuYmNfcGF0aCwgJ3JiJykgYXMgZmlsZToKKyAgICAgICAgICAgIGJjID0gZmlsZS5yZWFkKClbbGVuKG1ldGFkYXRhKTpdCisgICAgICAgIHdpdGggb3BlbihzZWxmLmJjX3BhdGgsICd3YicpIGFzIGZpbGU6CisgICAgICAgICAgICBmaWxlLndyaXRlKG1ldGFkYXRhKQorICAgICAgICAgICAgZmlsZS53cml0ZShiYykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgqc2VsZi5kYXRhKCkpCisgICAgICAgIGNvbXBpbGVhbGwuY29tcGlsZV9kaXIoc2VsZi5kaXJlY3RvcnksIGZvcmNlPUZhbHNlLCBxdWlldD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKnNlbGYuZGF0YSgpKQorCisgICAgZGVmIHRlc3RfbXRpbWUoc2VsZik6CisgICAgICAgICMgVGVzdCBhIGNoYW5nZSBpbiBtdGltZSBsZWFkcyB0byBhIG5ldyAucHljLgorICAgICAgICBzZWxmLnJlY3JlYXRpb25fY2hlY2soc3RydWN0LnBhY2soJzw0c2wnLCBpbXAuZ2V0X21hZ2ljKCksIDEpKQorCisgICAgZGVmIHRlc3RfbWFnaWNfbnVtYmVyKHNlbGYpOgorICAgICAgICAjIFRlc3QgYSBjaGFuZ2UgaW4gbXRpbWUgbGVhZHMgdG8gYSBuZXcgLnB5Yy4KKyAgICAgICAgc2VsZi5yZWNyZWF0aW9uX2NoZWNrKGInXDBcMFwwXDAnKQorCisgICAgZGVmIHRlc3RfY29tcGlsZV9maWxlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGNvbXBpbGluZyBhIHNpbmdsZSBmaWxlLCBhbmQgY29tcGxldGUgZGlyZWN0b3J5CisgICAgICAgIGZvciBmbiBpbiAoc2VsZi5iY19wYXRoLCBzZWxmLmJjX3BhdGgyKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZm4pCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBjb21waWxlYWxsLmNvbXBpbGVfZmlsZShzZWxmLnNvdXJjZV9wYXRoLCBmb3JjZT1GYWxzZSwgcXVpZXQ9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKHNlbGYuYmNfcGF0aCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBvcy5wYXRoLmlzZmlsZShzZWxmLmJjX3BhdGgyKSkKKyAgICAgICAgb3MudW5saW5rKHNlbGYuYmNfcGF0aCkKKyAgICAgICAgY29tcGlsZWFsbC5jb21waWxlX2RpcihzZWxmLmRpcmVjdG9yeSwgZm9yY2U9RmFsc2UsIHF1aWV0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShzZWxmLmJjX3BhdGgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvcy5wYXRoLmlzZmlsZShzZWxmLmJjX3BhdGgyKSkKKyAgICAgICAgb3MudW5saW5rKHNlbGYuYmNfcGF0aCkKKyAgICAgICAgb3MudW5saW5rKHNlbGYuYmNfcGF0aDIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENvbXBpbGVhbGxUZXN0cykKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzAwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMzAwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBpbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1OTg4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlci5weQpAQCAtMCwwICsxLDMxNyBAQAoraW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0Citjb21waWxlciA9IHRlc3QudGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2NvbXBpbGVyJywgZGVwcmVjYXRlZD1UcnVlKQorZnJvbSBjb21waWxlci5hc3QgaW1wb3J0IGZsYXR0ZW4KK2ltcG9ydCBvcywgc3lzLCB0aW1lLCB1bml0dGVzdAorZnJvbSByYW5kb20gaW1wb3J0IHJhbmRvbQorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworIyBIb3cgbXVjaCB0aW1lIGluIHNlY29uZHMgY2FuIHBhc3MgYmVmb3JlIHdlIHByaW50IGEgJ1N0aWxsIHdvcmtpbmcnIG1lc3NhZ2UuCitfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwgPSA1ICogNjAKKworY2xhc3MgVHJpdmlhbENvbnRleHQob2JqZWN0KToKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pOgorICAgICAgICBwYXNzCisKK2NsYXNzIENvbXBpbGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdENvbXBpbGVMaWJyYXJ5KHNlbGYpOgorICAgICAgICAjIEEgc2ltcGxlIGJ1dCBsYXJnZSB0ZXN0LiAgQ29tcGlsZSBhbGwgdGhlIGNvZGUgaW4gdGhlCisgICAgICAgICMgc3RhbmRhcmQgbGlicmFyeSBhbmQgaXRzIHRlc3Qgc3VpdGUuICBUaGlzIGRvZXNuJ3QgdmVyaWZ5CisgICAgICAgICMgdGhhdCBhbnkgb2YgdGhlIGNvZGUgaXMgY29ycmVjdCwgbWVyZWx5IHRoZSBjb21waWxlciBpcyBhYmxlCisgICAgICAgICMgdG8gZ2VuZXJhdGUgc29tZSBraW5kIG9mIGNvZGUgZm9yIGl0LgorCisgICAgICAgIG5leHRfdGltZSA9IHRpbWUudGltZSgpICsgX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMCisgICAgICAgICMgd2FybmluZzogaWYgJ29zJyBvciAndGVzdF9zdXBwb3J0JyBhcmUgbW92ZWQgaW4gc29tZSBvdGhlciBkaXIsCisgICAgICAgICMgdGhleSBzaG91bGQgYmUgY2hhbmdlZCBoZXJlLgorICAgICAgICBsaWJkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MuX19maWxlX18pCisgICAgICAgIHRlc3RkaXIgPSBvcy5wYXRoLmRpcm5hbWUodGVzdC50ZXN0X3N1cHBvcnQuX19maWxlX18pCisKKyAgICAgICAgZm9yIGRpciBpbiBbdGVzdGRpcl06CisgICAgICAgICAgICBmb3IgYmFzZW5hbWUgaW4gInRlc3Rfb3MucHkiLDoKKyAgICAgICAgICAgICAgICAjIFByaW50IHN0aWxsIHdvcmtpbmcgbWVzc2FnZSBzaW5jZSB0aGlzIHRlc3QgY2FuIGJlIHJlYWxseSBzbG93CisgICAgICAgICAgICAgICAgaWYgbmV4dF90aW1lIDw9IHRpbWUudGltZSgpOgorICAgICAgICAgICAgICAgICAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAorICAgICAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5fX3N0ZG91dF9fLCBcCisgICAgICAgICAgICAgICAgICAgICAgICcgIHRlc3RDb21waWxlTGlicmFyeSBzdGlsbCB3b3JraW5nLCBiZSBwYXRpZW50Li4uJworICAgICAgICAgICAgICAgICAgICBzeXMuX19zdGRvdXRfXy5mbHVzaCgpCisKKyAgICAgICAgICAgICAgICBpZiBub3QgYmFzZW5hbWUuZW5kc3dpdGgoIi5weSIpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBURVNUX0FMTCBhbmQgcmFuZG9tKCkgPCAwLjk4OgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyLCBiYXNlbmFtZSkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0LnRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiY29tcGlsaW5nIiwgcGF0aAorICAgICAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgsICJVIikKKyAgICAgICAgICAgICAgICBidWYgPSBmLnJlYWQoKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGlmICJiYWRzeW50YXgiIGluIGJhc2VuYW1lIG9yICJiYWRfY29kaW5nIiBpbiBiYXNlbmFtZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGVyLmNvbXBpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYmFzZW5hbWUsICJleGVjIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlci5jb21waWxlKGJ1ZiwgYmFzZW5hbWUsICJleGVjIikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBsaXN0KGUuYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCJpbiBmaWxlICVzXSIgJSBiYXNlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICNhcmdzWzBdICs9ICJbaW4gZmlsZSAlc10iICUgYmFzZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuYXJncyA9IHR1cGxlKGFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIHRlc3ROZXdDbGFzc1N5bnRheChzZWxmKToKKyAgICAgICAgY29tcGlsZXIuY29tcGlsZSgiY2xhc3MgZm9vKCk6cGFzc1xuXG4iLCI8c3RyaW5nPiIsImV4ZWMiKQorCisgICAgZGVmIHRlc3RZaWVsZEV4cHIoc2VsZik6CisgICAgICAgIGNvbXBpbGVyLmNvbXBpbGUoImRlZiBnKCk6IHlpZWxkXG5cbiIsICI8c3RyaW5nPiIsICJleGVjIikKKworICAgIGRlZiB0ZXN0S2V5d29yZEFmdGVyU3RhcmFyZ3Moc2VsZik6CisgICAgICAgIGRlZiBmKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhcmdzLCBrd2FyZ3MpLCAoKDIsMyksIHsneCc6IDEsICd5JzogNH0pKQorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnZih4PTEsICooMiwgMyksIHk9NCknLCAnPHN0cmluZz4nLCAnZXhlYycpCisgICAgICAgIGV4ZWMgYyBpbiB7J2YnOiBmfQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlci5wYXJzZSwgImZvbyhhPTEsIGIpIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGVyLnBhcnNlLCAiZm9vKDEsICphcmdzLCAzKSIpCisKKyAgICBkZWYgdGVzdFRyeUV4Y2VwdEZpbmFsbHkoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGV4Y2VwdCBhbmQgZmluYWxseSBjbGF1c2VzIGluIG9uZSB0cnkgc3RtdCBhcmUgcmVjb2duaXplZAorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgidHJ5OlxuIDEvLzBcbmV4Y2VwdDpcbiBlID0gMVxuZmluYWxseTpcbiBmID0gMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3RyaW5nPiIsICJleGVjIikKKyAgICAgICAgZGN0ID0ge30KKyAgICAgICAgZXhlYyBjIGluIGRjdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjdC5nZXQoJ2UnKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkY3QuZ2V0KCdmJyksIDEpCisKKyAgICBkZWYgdGVzdERlZmF1bHRBcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZXIucGFyc2UsICJkZWYgZm9vKGE9MSwgYik6IHBhc3MiKQorCisgICAgZGVmIHRlc3REb2NzdHJpbmdzKHNlbGYpOgorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnImRvYyInLCAnPHN0cmluZz4nLCAnZXhlYycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ19fZG9jX18nLCBjLmNvX25hbWVzKQorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnZGVmIGYoKTpcbiAiZG9jIicsICc8c3RyaW5nPicsICdleGVjJykKKyAgICAgICAgZyA9IHt9CisgICAgICAgIGV4ZWMgYyBpbiBnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ1snZiddLl9fZG9jX18sICJkb2MiKQorCisgICAgZGVmIHRlc3RMaW5lTm8oc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGFsbCBub2RlcyBleGNlcHQgTW9kdWxlIGhhdmUgYSBjb3JyZWN0IGxpbmVubyBhdHRyaWJ1dGUuCisgICAgICAgIGZpbGVuYW1lID0gX19maWxlX18KKyAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoKCIucHljIiwgIi5weW8iKSk6CisgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotMV0KKyAgICAgICAgdHJlZSA9IGNvbXBpbGVyLnBhcnNlRmlsZShmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5jaGVja19saW5lbm8odHJlZSkKKworICAgIGRlZiBjaGVja19saW5lbm8oc2VsZiwgbm9kZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2xpbmVubyhub2RlKQorICAgICAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3I6CisgICAgICAgICAgICBwcmludCBub2RlLl9fY2xhc3NfXywgbm9kZS5saW5lbm8KKyAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgX2NoZWNrX2xpbmVubyhzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm90IG5vZGUuX19jbGFzc19fIGluIE5PTElORU5POgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG5vZGUubGluZW5vLCBpbnQsCisgICAgICAgICAgICAgICAgImxpbmVubz0lcyBvbiAlcyIgJSAobm9kZS5saW5lbm8sIG5vZGUuX19jbGFzc19fKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub2RlLmxpbmVubyA+IDAsCisgICAgICAgICAgICAgICAgImxpbmVubz0lcyBvbiAlcyIgJSAobm9kZS5saW5lbm8sIG5vZGUuX19jbGFzc19fKSkKKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuZ2V0Q2hpbGROb2RlcygpOgorICAgICAgICAgICAgc2VsZi5jaGVja19saW5lbm8oY2hpbGQpCisKKyAgICBkZWYgdGVzdEZsYXR0ZW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhdHRlbihbMSwgWzJdXSksIFsxLCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbGF0dGVuKCgxLCAoMiwpKSksIFsxLCAyXSkKKworICAgIGRlZiB0ZXN0TmVzdGVkU2NvcGUoc2VsZik6CisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCdkZWYgZygpOlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGEgPSAxXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgZGVmIGYoKTogcmV0dXJuIGEgKyAyXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgcmV0dXJuIGYoKVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzdWx0ID0gZygpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdHJpbmc+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4ZWMnKQorICAgICAgICBkY3QgPSB7fQorICAgICAgICBleGVjIGMgaW4gZGN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGN0LmdldCgncmVzdWx0JyksIDMpCisKKyAgICBkZWYgdGVzdEdlbkV4cChzZWxmKToKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ2xpc3QoKGksaikgZm9yIGkgaW4gcmFuZ2UoMykgaWYgaSA8IDMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgIGZvciBqIGluIHJhbmdlKDQpIGlmIGogPiAyKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3RyaW5nPicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmFsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGMpLCBbKDAsIDMpLCAoMSwgMyksICgyLCAzKV0pCisKKyAgICBkZWYgdGVzdFNldExpdGVyYWwoc2VsZik6CisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCd7MSwgMiwgM30nLCAnPHN0cmluZz4nLCAnZXZhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChjKSwgezEsMiwzfSkKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ3sxLCAyLCAzLH0nLCAnPHN0cmluZz4nLCAnZXZhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChjKSwgezEsMiwzfSkKKworICAgIGRlZiB0ZXN0RGljdExpdGVyYWwoc2VsZik6CisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCd7MToyLCAyOjMsIDM6NH0nLCAnPHN0cmluZz4nLCAnZXZhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChjKSwgezE6MiwgMjozLCAzOjR9KQorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnezE6MiwgMjozLCAzOjQsfScsICc8c3RyaW5nPicsICdldmFsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGMpLCB7MToyLCAyOjMsIDM6NH0pCisKKyAgICBkZWYgdGVzdFNldENvbXAoc2VsZik6CisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCd7eCBmb3IgeCBpbiByYW5nZSgxLCA0KX0nLCAnPHN0cmluZz4nLCAnZXZhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChjKSwgezEsIDIsIDN9KQorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgne3ggKiB5IGZvciB4IGluIHJhbmdlKDMpIGlmIHggIT0gMCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICBmb3IgeSBpbiByYW5nZSg0KSBpZiB5ICE9IDB9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdHJpbmc+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2YWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYyksIHsxLCAyLCAzLCA0LCA2fSkKKworICAgIGRlZiB0ZXN0RGljdENvbXAoc2VsZik6CisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCd7eDp4KzEgZm9yIHggaW4gcmFuZ2UoMSwgNCl9JywgJzxzdHJpbmc+JywgJ2V2YWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYyksIHsxOjIsIDI6MywgMzo0fSkKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ3soeCwgeSkgOiB5IGZvciB4IGluIHJhbmdlKDIpIGlmIHggIT0gMCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgIGZvciB5IGluIHJhbmdlKDMpIGlmIHkgIT0gMH0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHN0cmluZz4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChjKSwgeygxLCAyKTogMiwgKDEsIDEpOiAxfSkKKworICAgIGRlZiB0ZXN0V2l0aChzZWxmKToKKyAgICAgICAgIyBTRiBidWcgMTYzODI0MworICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudFxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVmIGYoKTpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICB3aXRoIFRyaXZpYWxDb250ZXh0KCk6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHJldHVybiAxXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN1bHQgPSBmKCknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHN0cmluZz4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhlYycgKQorICAgICAgICBkY3QgPSB7J1RyaXZpYWxDb250ZXh0JzogVHJpdmlhbENvbnRleHR9CisgICAgICAgIGV4ZWMgYyBpbiBkY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkY3QuZ2V0KCdyZXN1bHQnKSwgMSkKKworICAgIGRlZiB0ZXN0V2l0aEFzcyhzZWxmKToKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZiBmKCk6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgd2l0aCBUcml2aWFsQ29udGV4dCgpIGFzIHRjOlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICByZXR1cm4gMVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzdWx0ID0gZigpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdHJpbmc+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4ZWMnICkKKyAgICAgICAgZGN0ID0geydUcml2aWFsQ29udGV4dCc6IFRyaXZpYWxDb250ZXh0fQorICAgICAgICBleGVjIGMgaW4gZGN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGN0LmdldCgncmVzdWx0JyksIDEpCisKKyAgICBkZWYgdGVzdFdpdGhNdWx0KHNlbGYpOgorICAgICAgICBldmVudHMgPSBbXQorICAgICAgICBjbGFzcyBDdHg6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbik6CisgICAgICAgICAgICAgICAgc2VsZi5uID0gbgorICAgICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKHNlbGYubikKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudFxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVmIGYoKTpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICB3aXRoIEN0eCgxKSBhcyB0YywgQ3R4KDIpIGFzIHRjMjpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcmV0dXJuIDFcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCA9IGYoKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3RyaW5nPicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleGVjJyApCisgICAgICAgIGRjdCA9IHsnQ3R4JzogQ3R4fQorICAgICAgICBleGVjIGMgaW4gZGN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGN0LmdldCgncmVzdWx0JyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBbMSwgMl0pCisKKyAgICBkZWYgdGVzdEdsb2JhbChzZWxmKToKKyAgICAgICAgY29kZSA9IGNvbXBpbGVyLmNvbXBpbGUoJ2dsb2JhbCB4XG54PTEnLCAnPHN0cmluZz4nLCAnZXhlYycpCisgICAgICAgIGQxID0geydfX2J1aWx0aW5zX18nOiB7fX0KKyAgICAgICAgZDIgPSB7fQorICAgICAgICBleGVjIGNvZGUgaW4gZDEsIGQyCisgICAgICAgICMgeCBzaG91bGQgYmUgaW4gdGhlIGdsb2JhbHMgZGljdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLmdldCgneCcpLCAxKQorCisgICAgZGVmIHRlc3RQcmludEZ1bmN0aW9uKHNlbGYpOgorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvblxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJpbnQoImEiLCAiYiIsIHNlcD0iKioiLCBlbmQ9IisrIiwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGU9b3V0cHV0KScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3RyaW5nPicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleGVjJyApCisgICAgICAgIGRjdCA9IHsnb3V0cHV0JzogU3RyaW5nSU8oKX0KKyAgICAgICAgZXhlYyBjIGluIGRjdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjdFsnb3V0cHV0J10uZ2V0dmFsdWUoKSwgJ2EqKmIrKycpCisKKyAgICBkZWYgX3Rlc3RFcnJFbmMoc2VsZiwgc3JjLCB0ZXh0LCBvZmZzZXQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb21waWxlKHNyYywgIiIsICJleGVjIikKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm9mZnNldCwgb2Zmc2V0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLnRleHQsIHRleHQpCisKKyAgICBkZWYgdGVzdFNvdXJjZUNvZGVFbmNvZGluZ3NFcnJvcihzZWxmKToKKyAgICAgICAgIyBUZXN0IFN5bnRheEVycm9yIHdpdGggZW5jb2RpbmcgZGVmaW5pdGlvbgorICAgICAgICBzamlzID0gInByaW50ICdceDgzXHg3MFx4ODNceDQzXHg4M1x4NWNceDgzXHg5MycsICdcbiIKKyAgICAgICAgYXNjaWkgPSAicHJpbnQgJzEyMzQ1Njc4JywgJ1xuIgorICAgICAgICBlbmNkZWYgPSAiIyEgLSotIGNvZGluZzogU2hpZnRKSVMgLSotXG4iCisKKyAgICAgICAgIyBhc2NpaSBzb3VyY2Ugd2l0aG91dCBlbmNkZWYKKyAgICAgICAgc2VsZi5fdGVzdEVyckVuYyhhc2NpaSwgYXNjaWksIDE5KQorCisgICAgICAgICMgYXNjaWkgc291cmNlIHdpdGggZW5jZGVmCisgICAgICAgIHNlbGYuX3Rlc3RFcnJFbmMoZW5jZGVmK2FzY2lpLCBhc2NpaSwgMTkpCisKKyAgICAgICAgIyBub24tYXNjaWkgc291cmNlIHdpdGggZW5jZGVmCisgICAgICAgIHNlbGYuX3Rlc3RFcnJFbmMoZW5jZGVmK3NqaXMsIHNqaXMsIDE5KQorCisgICAgICAgICMgU2hpZnRKSVMgc291cmNlIHdpdGhvdXQgZW5jZGVmCisgICAgICAgIHNlbGYuX3Rlc3RFcnJFbmMoc2ppcywgc2ppcywgMTkpCisKKworTk9MSU5FTk8gPSAoY29tcGlsZXIuYXN0Lk1vZHVsZSwgY29tcGlsZXIuYXN0LlN0bXQsIGNvbXBpbGVyLmFzdC5EaXNjYXJkKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGNvZGUgYmVsb3cgaXMganVzdCB1c2VkIHRvIHRyaWdnZXIgc29tZSBwb3NzaWJsZSBlcnJvcnMsIGZvciB0aGUgYmVuZWZpdCBvZgorIyB0ZXN0TGluZU5vCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIFRvdG86CisgICAgIiIiZG9jc3RyaW5nIiIiCisgICAgcGFzcworCithLCBiID0gMiwgMworW2MsIGRdID0gNSwgNgorbCA9IFsoeCwgeSkgZm9yIHgsIHkgaW4gemlwKHJhbmdlKDUpLCByYW5nZSg1LDEwKSldCitsWzBdCitsWzM6NF0KK2QgPSB7J2EnOiAyfQorZCA9IHt9CitkID0ge3g6IHkgZm9yIHgsIHkgaW4gemlwKHJhbmdlKDUpLCByYW5nZSg1LDEwKSl9CitzID0ge3ggZm9yIHggaW4gcmFuZ2UoMTApfQorcyA9IHsxfQordCA9ICgpCit0ID0gKDEsIDIpCitsID0gW10KK2wgPSBbMSwgMl0KK2lmIGw6CisgICAgcGFzcworZWxzZToKKyAgICBhLCBiID0gYiwgYQorCit0cnk6CisgICAgcHJpbnQgeW8KK2V4Y2VwdDoKKyAgICB5byA9IDMKK2Vsc2U6CisgICAgeW8gKz0gMworCit0cnk6CisgICAgYSArPSBiCitmaW5hbGx5OgorICAgIGIgPSAwCisKK2Zyb20gbWF0aCBpbXBvcnQgKgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBnbG9iYWwgVEVTVF9BTEwKKyAgICBURVNUX0FMTCA9IHRlc3QudGVzdF9zdXBwb3J0LmlzX3Jlc291cmNlX2VuYWJsZWQoImNwdSIpCisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENvbXBpbGVyVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkODU1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkODU1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGxleC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllODY3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXgucHkKQEAgLTAsMCArMSw2NTEgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworZnJvbSByYW5kb20gaW1wb3J0IHJhbmRvbQorZnJvbSBtYXRoIGltcG9ydCBhdGFuMiwgaXNuYW4sIGNvcHlzaWduCisKK0lORiA9IGZsb2F0KCJpbmYiKQorTkFOID0gZmxvYXQoIm5hbiIpCisjIFRoZXNlIHRlc3RzIGVuc3VyZSB0aGF0IGNvbXBsZXggbWF0aCBkb2VzIHRoZSByaWdodCB0aGluZworCitjbGFzcyBDb21wbGV4VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgYXNzZXJ0QWxtb3N0RXF1YWwoc2VsZiwgYSwgYik6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoYSwgY29tcGxleCk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGIsIGNvbXBsZXgpOgorICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLmFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGEucmVhbCwgYi5yZWFsKQorICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLmFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGEuaW1hZywgYi5pbWFnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5hc3NlcnRBbG1vc3RFcXVhbChzZWxmLCBhLnJlYWwsIGIpCisgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UuYXNzZXJ0QWxtb3N0RXF1YWwoc2VsZiwgYS5pbWFnLCAwLikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYiwgY29tcGxleCk6CisgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UuYXNzZXJ0QWxtb3N0RXF1YWwoc2VsZiwgYSwgYi5yZWFsKQorICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLmFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIDAuLCBiLmltYWcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLmFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIpCisKKyAgICBkZWYgYXNzZXJ0Q2xvc2VBYnMoc2VsZiwgeCwgeSwgZXBzPTFlLTkpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZmYgZmxvYXRzIHggYW5kIHkgImFyZSBjbG9zZVwiIiIiCisgICAgICAgICMgcHV0IHRoZSBvbmUgd2l0aCBsYXJnZXIgbWFnbml0dWRlIHNlY29uZAorICAgICAgICBpZiBhYnMoeCkgPiBhYnMoeSk6CisgICAgICAgICAgICB4LCB5ID0geSwgeAorICAgICAgICBpZiB5ID09IDA6CisgICAgICAgICAgICByZXR1cm4gYWJzKHgpIDwgZXBzCisgICAgICAgIGlmIHggPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBhYnMoeSkgPCBlcHMKKyAgICAgICAgIyBjaGVjayB0aGF0IHJlbGF0aXZlIGRpZmZlcmVuY2UgPCBlcHMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFicygoeC15KS95KSA8IGVwcykKKworICAgIGRlZiBhc3NlcnRGbG9hdHNBcmVJZGVudGljYWwoc2VsZiwgeCwgeSk6CisgICAgICAgICIiImFzc2VydCB0aGF0IGZsb2F0cyB4IGFuZCB5IGFyZSBpZGVudGljYWwsIGluIHRoZSBzZW5zZSB0aGF0OgorICAgICAgICAoMSkgYm90aCB4IGFuZCB5IGFyZSBuYW5zLCBvcgorICAgICAgICAoMikgYm90aCB4IGFuZCB5IGFyZSBpbmZpbml0aWVzLCB3aXRoIHRoZSBzYW1lIHNpZ24sIG9yCisgICAgICAgICgzKSBib3RoIHggYW5kIHkgYXJlIHplcm9zLCB3aXRoIHRoZSBzYW1lIHNpZ24sIG9yCisgICAgICAgICg0KSB4IGFuZCB5IGFyZSBib3RoIGZpbml0ZSBhbmQgbm9uemVybywgYW5kIHggPT0geQorCisgICAgICAgICIiIgorICAgICAgICBtc2cgPSAnZmxvYXRzIHshcn0gYW5kIHshcn0gYXJlIG5vdCBpZGVudGljYWwnCisKKyAgICAgICAgaWYgaXNuYW4oeCkgb3IgaXNuYW4oeSk6CisgICAgICAgICAgICBpZiBpc25hbih4KSBhbmQgaXNuYW4oeSk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgeCA9PSB5OgorICAgICAgICAgICAgaWYgeCAhPSAwLjA6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAjIGJvdGggemVybzsgY2hlY2sgdGhhdCBzaWducyBtYXRjaAorICAgICAgICAgICAgZWxpZiBjb3B5c2lnbigxLjAsIHgpID09IGNvcHlzaWduKDEuMCwgeSk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1zZyArPSAnOiB6ZXJvcyBoYXZlIGRpZmZlcmVudCBzaWducycKKyAgICAgICAgc2VsZi5mYWlsKG1zZy5mb3JtYXQoeCwgeSkpCisKKyAgICBkZWYgYXNzZXJ0Q2xvc2Uoc2VsZiwgeCwgeSwgZXBzPTFlLTkpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZmYgY29tcGxleGVzIHggYW5kIHkgImFyZSBjbG9zZVwiIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0Q2xvc2VBYnMoeC5yZWFsLCB5LnJlYWwsIGVwcykKKyAgICAgICAgc2VsZi5hc3NlcnRDbG9zZUFicyh4LmltYWcsIHkuaW1hZywgZXBzKQorCisgICAgZGVmIGNoZWNrX2RpdihzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiQ29tcHV0ZSBjb21wbGV4IHo9eCp5LCBhbmQgY2hlY2sgdGhhdCB6L3g9PXkgYW5kIHoveT09eC4iIiIKKyAgICAgICAgeiA9IHggKiB5CisgICAgICAgIGlmIHggIT0gMDoKKyAgICAgICAgICAgIHEgPSB6IC8geAorICAgICAgICAgICAgc2VsZi5hc3NlcnRDbG9zZShxLCB5KQorICAgICAgICAgICAgcSA9IHouX19kaXZfXyh4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRDbG9zZShxLCB5KQorICAgICAgICAgICAgcSA9IHouX190cnVlZGl2X18oeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Q2xvc2UocSwgeSkKKyAgICAgICAgaWYgeSAhPSAwOgorICAgICAgICAgICAgcSA9IHogLyB5CisgICAgICAgICAgICBzZWxmLmFzc2VydENsb3NlKHEsIHgpCisgICAgICAgICAgICBxID0gei5fX2Rpdl9fKHkpCisgICAgICAgICAgICBzZWxmLmFzc2VydENsb3NlKHEsIHgpCisgICAgICAgICAgICBxID0gei5fX3RydWVkaXZfXyh5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRDbG9zZShxLCB4KQorCisgICAgZGVmIHRlc3RfZGl2KHNlbGYpOgorICAgICAgICBzaW1wbGVfcmVhbCA9IFtmbG9hdChpKSBmb3IgaSBpbiB4cmFuZ2UoLTUsIDYpXQorICAgICAgICBzaW1wbGVfY29tcGxleCA9IFtjb21wbGV4KHgsIHkpIGZvciB4IGluIHNpbXBsZV9yZWFsIGZvciB5IGluIHNpbXBsZV9yZWFsXQorICAgICAgICBmb3IgeCBpbiBzaW1wbGVfY29tcGxleDoKKyAgICAgICAgICAgIGZvciB5IGluIHNpbXBsZV9jb21wbGV4OgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfZGl2KHgsIHkpCisKKyAgICAgICAgIyBBIG5haXZlIGNvbXBsZXggZGl2aXNpb24gYWxnb3JpdGhtIChzdWNoIGFzIGluIDIuMCkgaXMgdmVyeSBwcm9uZSB0bworICAgICAgICAjIG5vbnNlbnNlIGVycm9ycyBmb3IgdGhlc2UgKG92ZXJmbG93cyBhbmQgdW5kZXJmbG93cykuCisgICAgICAgIHNlbGYuY2hlY2tfZGl2KGNvbXBsZXgoMWUyMDAsIDFlMjAwKSwgMSswaikKKyAgICAgICAgc2VsZi5jaGVja19kaXYoY29tcGxleCgxZS0yMDAsIDFlLTIwMCksIDErMGopCisKKyAgICAgICAgIyBKdXN0IGZvciBmdW4uCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgc2VsZi5jaGVja19kaXYoY29tcGxleChyYW5kb20oKSwgcmFuZG9tKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxleChyYW5kb20oKSwgcmFuZG9tKCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBjb21wbGV4Ll9fZGl2X18sIDErMWosIDArMGopCisgICAgICAgICMgRklYTUU6IFRoZSBmb2xsb3dpbmcgY3VycmVudGx5IGNyYXNoZXMgb24gQWxwaGEKKyAgICAgICAgIyBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBwb3csIDFlMjAwKzFqLCAxZTIwMCsxaikKKworICAgIGRlZiB0ZXN0X3RydWVkaXYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleC5fX3RydWVkaXZfXygyKzBqLCAxKzFqKSwgMS0xaikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGNvbXBsZXguX190cnVlZGl2X18sIDErMWosIDArMGopCisKKyAgICBkZWYgdGVzdF9mbG9vcmRpdihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4Ll9fZmxvb3JkaXZfXygzKzBqLCAxLjUrMGopLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgY29tcGxleC5fX2Zsb29yZGl2X18sIDMrMGosIDArMGopCisKKyAgICBkZWYgdGVzdF9jb2VyY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGNvbXBsZXguX19jb2VyY2VfXywgMSsxaiwgMUw8PDEwMDAwKQorCisgICAgZGVmIHRlc3Rfbm9faW1wbGljaXRfY29lcmNlKHNlbGYpOgorICAgICAgICAjIFB5dGhvbiAyLjcgcmVtb3ZlZCBpbXBsaWNpdCBjb2VyY2lvbiBmcm9tIHRoZSBjb21wbGV4IHR5cGUKKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fY29lcmNlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgX19oYXNoX18gPSBOb25lCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisKKyAgICAgICAgYSA9IEEoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYSArIDIuMGopCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIDwgMi4waikKKworICAgIGRlZiB0ZXN0X3JpY2hjb21wYXJlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXguX19lcV9fKDErMWosIDFMPDwxMDAwMCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXguX19sdF9fKDErMWosIE5vbmUpLCBOb3RJbXBsZW1lbnRlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjb21wbGV4Ll9fZXFfXygxKzFqLCAxKzFqKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjb21wbGV4Ll9fZXFfXygxKzFqLCAyKzJqKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoY29tcGxleC5fX25lX18oMSsxaiwgMSsxaiksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKGNvbXBsZXguX19uZV9fKDErMWosIDIrMmopLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBsZXguX19sdF9fLCAxKzFqLCAyKzJqKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBsZXguX19sZV9fLCAxKzFqLCAyKzJqKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBsZXguX19ndF9fLCAxKzFqLCAyKzJqKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBsZXguX19nZV9fLCAxKzFqLCAyKzJqKQorCisgICAgZGVmIHRlc3RfcmljaGNvbXBhcmVfYm91bmRhcmllcyhzZWxmKToKKyAgICAgICAgZGVmIGNoZWNrKG4sIGRlbHRhcywgaXNfZXF1YWwsIGltYWcgPSAwLjApOgorICAgICAgICAgICAgZm9yIGRlbHRhIGluIGRlbHRhczoKKyAgICAgICAgICAgICAgICBpID0gbiArIGRlbHRhCisgICAgICAgICAgICAgICAgeiA9IGNvbXBsZXgoaSwgaW1hZykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKGNvbXBsZXguX19lcV9fKHosIGkpLCBpc19lcXVhbChkZWx0YSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjb21wbGV4Ll9fbmVfXyh6LCBpKSwgbm90IGlzX2VxdWFsKGRlbHRhKSkKKyAgICAgICAgIyBGb3IgSUVFRS03NTQgZG91YmxlcyB0aGUgZm9sbG93aW5nIHNob3VsZCBob2xkOgorICAgICAgICAjICAgIHggaW4gWzIgKiogKDUyICsgaSksIDIgKiogKDUzICsgaSArIDEpXSAtPiB4IG1vZCAyICoqIGkgPT0gMAorICAgICAgICAjIHdoZXJlIHRoZSBpbnRlcnZhbCBpcyByZXByZXNlbnRhYmxlLCBvZiBjb3Vyc2UuCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIDEwKToKKyAgICAgICAgICAgIHBvdyA9IDUyICsgaQorICAgICAgICAgICAgbXVsdCA9IDIgKiogaQorICAgICAgICAgICAgY2hlY2soMiAqKiBwb3csIHJhbmdlKDEsIDEwMSksIGxhbWJkYSBkZWx0YTogZGVsdGEgJSBtdWx0ID09IDApCisgICAgICAgICAgICBjaGVjaygyICoqIHBvdywgcmFuZ2UoMSwgMTAxKSwgbGFtYmRhIGRlbHRhOiBGYWxzZSwgZmxvYXQoaSkpCisgICAgICAgIGNoZWNrKDIgKiogNTMsIHJhbmdlKC0xMDAsIDApLCBsYW1iZGEgZGVsdGE6IFRydWUpCisKKyAgICBkZWYgdGVzdF9tb2Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCAoMSsxaikuX19tb2RfXywgMCswaikKKworICAgICAgICBhID0gMy4zMys0LjQzagorICAgICAgICB0cnk6CisgICAgICAgICAgICBhICUgMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm1vZHVsbyBwYXJhbWEgY2FuJ3QgYmUgMCIpCisKKyAgICBkZWYgdGVzdF9kaXZtb2Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBkaXZtb2QsIDErMWosIDArMGopCisKKyAgICBkZWYgdGVzdF9wb3coc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocG93KDErMWosIDArMGopLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocG93KDArMGosIDIrMGopLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBwb3csIDArMGosIDFqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBvdygxaiwgLTEpLCAxLzFqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBvdygxaiwgMjAwKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG93LCAxKzFqLCAxKzFqLCAxKzFqKQorCisgICAgICAgIGEgPSAzLjMzKzQuNDNqCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAqKiAwaiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICoqIDAuKzAuaiwgMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDNqICoqIDBqLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDNqICoqIDAsIDEpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgMGogKiogYQorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBmYWlsIDAuMCB0byBuZWdhdGl2ZSBvciBjb21wbGV4IHBvd2VyIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICAwaiAqKiAoMy0yaikKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgZmFpbCAwLjAgdG8gbmVnYXRpdmUgb3IgY29tcGxleCBwb3dlciIpCisKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIGlzIHVzZWQgdG8gZXhlcmNpc2UgY2VydGFpbiBjb2RlIHBhdGhzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAqKiAxMDUsIGEgKiogMTA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKiogLTEwNSwgYSAqKiAtMTA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKiogLTMwLCBhICoqIC0zMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAuMGogKiogMCwgMSkKKworICAgICAgICBiID0gNS4xKzIuM2oKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG93LCBhLCBiLCAwKQorCisgICAgZGVmIHRlc3RfYm9vbGNvbnRleHQoc2VsZik6CisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbXBsZXgocmFuZG9tKCkgKyAxZS02LCByYW5kb20oKSArIDFlLTYpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvbXBsZXgoMC4wLCAwLjApKQorCisgICAgZGVmIHRlc3RfY29uanVnYXRlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydENsb3NlKGNvbXBsZXgoNS4zLCA5LjgpLmNvbmp1Z2F0ZSgpLCA1LjMtOS44aikKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBjbGFzcyBPUzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6IHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9fY29tcGxleF9fKHNlbGYpOiByZXR1cm4gc2VsZi52YWx1ZQorICAgICAgICBjbGFzcyBOUyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKTogc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19jb21wbGV4X18oc2VsZik6IHJldHVybiBzZWxmLnZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxleChPUygxKzEwaikpLCAxKzEwaikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV4KE5TKDErMTBqKSksIDErMTBqKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBsZXgsIE9TKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBsZXgsIE5TKE5vbmUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgiMSsxMGoiKSwgMSsxMGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgxMCksIDEwKzBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMTAuMCksIDEwKzBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMTBMKSwgMTArMGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgxMCswaiksIDEwKzBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMSwxMCksIDErMTBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMSwxMEwpLCAxKzEwaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDEsMTAuMCksIDErMTBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMUwsMTApLCAxKzEwaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDFMLDEwTCksIDErMTBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMUwsMTAuMCksIDErMTBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMS4wLDEwKSwgMSsxMGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgxLjAsMTBMKSwgMSsxMGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgxLjAsMTAuMCksIDErMTBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMy4xNCswaiksIDMuMTQrMGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgzLjE0KSwgMy4xNCswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDMxNCksIDMxNC4wKzBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMzE0TCksIDMxNC4wKzBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMy4xNCswaiwgMGopLCAzLjE0KzBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMy4xNCwgMC4wKSwgMy4xNCswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDMxNCwgMCksIDMxNC4wKzBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMzE0TCwgMEwpLCAzMTQuMCswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDBqLCAzLjE0aiksIC0zLjE0KzBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMC4wLCAzLjE0aiksIC0zLjE0KzBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMGosIDMuMTQpLCAzLjE0aikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDAuMCwgMy4xNCksIDMuMTRqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoIjEiKSwgMSswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCIxaiIpLCAxaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCksICAwKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoIi0xIiksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoIisxIiksICsxKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoIigxKzJqKSIpLCAxKzJqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoIigxLjMrMi4yaikiKSwgMS4zKzIuMmopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgiMy4xNCsxSiIpLCAzLjE0KzFqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoIiAoICszLjE0LTZKICkiKSwgMy4xNC02aikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCIgKCArMy4xNC1KICkiKSwgMy4xNC0xaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCIgKCArMy4xNCtqICkiKSwgMy4xNCsxaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCJKIiksIDFqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoIiggaiApIiksIDFqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoIitKIiksIDFqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoIiggLWopIiksIC0xaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCcxZS01MDAnKSwgMC4wICsgMC4waikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCctMWUtNTAwaicpLCAwLjAgLSAwLjBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoJy0xZS01MDArMWUtNTAwaicpLCAtMC4wICsgMC4waikKKworICAgICAgICBjbGFzcyBjb21wbGV4Mihjb21wbGV4KTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoY29tcGxleDIoMSsxaikpLCAxKzFqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgocmVhbD0xNywgaW1hZz0yMyksIDE3KzIzaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KHJlYWw9MTcrMjNqKSwgMTcrMjNqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgocmVhbD0xNysyM2osIGltYWc9MjMpLCAxNys0NmopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleChyZWFsPTErMmosIGltYWc9Mys0aiksIC0zKzVqKQorCisgICAgICAgICMgY2hlY2sgdGhhdCB0aGUgc2lnbiBvZiBhIHplcm8gaW4gdGhlIHJlYWwgb3IgaW1hZ2luYXJ5IHBhcnQKKyAgICAgICAgIyBpcyBwcmVzZXJ2ZWQgd2hlbiBjb25zdHJ1Y3RpbmcgZnJvbSB0d28gZmxvYXRzLiAgKFRoZXNlIGNoZWNrcworICAgICAgICAjIGFyZSBoYXJtbGVzcyBvbiBzeXN0ZW1zIHdpdGhvdXQgc3VwcG9ydCBmb3Igc2lnbmVkIHplcm9zLikKKyAgICAgICAgZGVmIHNwbGl0X3plcm9zKHgpOgorICAgICAgICAgICAgIiIiRnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBkaWZmZXJlbnQgcmVzdWx0cyBmb3IgMC4gYW5kIC0wLiIiIgorICAgICAgICAgICAgcmV0dXJuIGF0YW4yKHgsIC0xLikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0X3plcm9zKGNvbXBsZXgoMS4sIDAuKS5pbWFnKSwgc3BsaXRfemVyb3MoMC4pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0X3plcm9zKGNvbXBsZXgoMS4sIC0wLikuaW1hZyksIHNwbGl0X3plcm9zKC0wLikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRfemVyb3MoY29tcGxleCgwLiwgMS4pLnJlYWwpLCBzcGxpdF96ZXJvcygwLikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRfemVyb3MoY29tcGxleCgtMC4sIDEuKS5yZWFsKSwgc3BsaXRfemVyb3MoLTAuKSkKKworICAgICAgICBjID0gMy4xNCArIDFqCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21wbGV4KGMpIGlzIGMpCisgICAgICAgIGRlbCBjCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4LCAiMSIsICIxIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4LCAxLCAiMSIpCisKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxleCh1bmljb2RlKCIgIDMuMTQrSiAgIikpLCAzLjE0KzFqKQorCisgICAgICAgICMgU0YgYnVnIDU0Mzg0MDogIGNvbXBsZXgoc3RyaW5nKSBhY2NlcHRzIHN0cmluZ3Mgd2l0aCBcMAorICAgICAgICAjIEZpeGVkIGluIDIuMy4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgJzErMWpcMGonKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW50LCA1KzNqKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxvbmcsIDUrM2opCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmxvYXQsIDUrM2opCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBsZXgsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICJcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICIzXDA5IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4LCAiMSIsICIyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4LCAiMSIsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBsZXgsIDEsICIyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgIjErIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgIjErMWorMWoiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21wbGV4LCAiLS0iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21wbGV4LCAiKDErMmoiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21wbGV4LCAiMSsyaikiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21wbGV4LCAiMSsoMmopIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgIigxKzJqKTEyMyIpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21wbGV4LCB1bmljb2RlKCJ4IikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICIxaisyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgIjFlMWVqIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgIjFlKysxZWoiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21wbGV4LCAiKTErMmooIikKKyAgICAgICAgIyB0aGUgZm9sbG93aW5nIHRocmVlIGFyZSBhY2NlcHRlZCBieSBQeXRob24gMi42CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICIxLi4xaiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICIxLjExLjFqIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgIjFlMS4xaiIpCisKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICAgICAgICAgICMgY2hlY2sgdGhhdCBjb21wbGV4IGFjY2VwdHMgbG9uZyB1bmljb2RlIHN0cmluZ3MKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShjb21wbGV4KHVuaWNvZGUoIjEiKjUwMCkpKSwgY29tcGxleCkKKworICAgICAgICBjbGFzcyBFdmlsRXhjKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgZXZpbGNvbXBsZXg6CisgICAgICAgICAgICBkZWYgX19jb21wbGV4X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgRXZpbEV4YworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV2aWxFeGMsIGNvbXBsZXgsIGV2aWxjb21wbGV4KCkpCisKKyAgICAgICAgY2xhc3MgZmxvYXQyOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKKworICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoZmxvYXQyKDQyLikpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KHJlYWw9ZmxvYXQyKDE3LiksIGltYWc9ZmxvYXQyKDIzLikpLCAxNysyM2opCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGxleCwgZmxvYXQyKE5vbmUpKQorCisgICAgICAgIGNsYXNzIGNvbXBsZXgwKGNvbXBsZXgpOgorICAgICAgICAgICAgIiIiVGVzdCB1c2FnZSBvZiBfX2NvbXBsZXhfXygpIHdoZW4gaW5oZXJpdGluZyBmcm9tICdjb21wbGV4JyIiIgorICAgICAgICAgICAgZGVmIF9fY29tcGxleF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MmoKKworICAgICAgICBjbGFzcyBjb21wbGV4MShjb21wbGV4KToKKyAgICAgICAgICAgICIiIlRlc3QgdXNhZ2Ugb2YgX19jb21wbGV4X18oKSB3aXRoIGEgX19uZXdfXygpIG1ldGhvZCIiIgorICAgICAgICAgICAgZGVmIF9fbmV3X18oc2VsZiwgdmFsdWU9MGopOgorICAgICAgICAgICAgICAgIHJldHVybiBjb21wbGV4Ll9fbmV3X18oc2VsZiwgMip2YWx1ZSkKKyAgICAgICAgICAgIGRlZiBfX2NvbXBsZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGNsYXNzIGNvbXBsZXgyKGNvbXBsZXgpOgorICAgICAgICAgICAgIiIiTWFrZSBzdXJlIHRoYXQgX19jb21wbGV4X18oKSBjYWxscyBmYWlsIGlmIGFueXRoaW5nIG90aGVyIHRoYW4gYQorICAgICAgICAgICAgY29tcGxleCBpcyByZXR1cm5lZCIiIgorICAgICAgICAgICAgZGVmIF9fY29tcGxleF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KGNvbXBsZXgwKDFqKSksIDQyaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KGNvbXBsZXgxKDFqKSksIDJqKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBsZXgsIGNvbXBsZXgyKDFqKSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyB4Y29tcGxleChjb21wbGV4KToKKyAgICAgICAgICAgIGRlZiBfX2FkZF9fKHNlbGYsb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiB4Y29tcGxleChjb21wbGV4KHNlbGYpICsgb3RoZXIpCisgICAgICAgICAgICBfX3JhZGRfXyA9IF9fYWRkX18KKworICAgICAgICAgICAgZGVmIF9fc3ViX18oc2VsZixvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHhjb21wbGV4KGNvbXBsZXgoc2VsZikgKyBvdGhlcikKKyAgICAgICAgICAgIF9fcnN1Yl9fID0gX19zdWJfXworCisgICAgICAgICAgICBkZWYgX19tdWxfXyhzZWxmLG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4geGNvbXBsZXgoY29tcGxleChzZWxmKSAqIG90aGVyKQorICAgICAgICAgICAgX19ybXVsX18gPSBfX211bF9fCisKKyAgICAgICAgICAgIGRlZiBfX2Rpdl9fKHNlbGYsb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiB4Y29tcGxleChjb21wbGV4KHNlbGYpIC8gb3RoZXIpCisKKyAgICAgICAgICAgIGRlZiBfX3JkaXZfXyhzZWxmLG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4geGNvbXBsZXgob3RoZXIgLyBjb21wbGV4KHNlbGYpKQorCisgICAgICAgICAgICBfX3RydWVkaXZfXyA9IF9fZGl2X18KKyAgICAgICAgICAgIF9fcnRydWVkaXZfXyA9IF9fcmRpdl9fCisKKyAgICAgICAgICAgIGRlZiBfX2Zsb29yZGl2X18oc2VsZixvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHhjb21wbGV4KGNvbXBsZXgoc2VsZikgLy8gb3RoZXIpCisKKyAgICAgICAgICAgIGRlZiBfX3JmbG9vcmRpdl9fKHNlbGYsb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiB4Y29tcGxleChvdGhlciAvLyBjb21wbGV4KHNlbGYpKQorCisgICAgICAgICAgICBkZWYgX19wb3dfXyhzZWxmLG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4geGNvbXBsZXgoY29tcGxleChzZWxmKSAqKiBvdGhlcikKKworICAgICAgICAgICAgZGVmIF9fcnBvd19fKHNlbGYsb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiB4Y29tcGxleChvdGhlciAqKiBjb21wbGV4KHNlbGYpICkKKworICAgICAgICAgICAgZGVmIF9fbW9kX18oc2VsZixvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHhjb21wbGV4KGNvbXBsZXgoc2VsZikgJSBvdGhlcikKKworICAgICAgICAgICAgZGVmIF9fcm1vZF9fKHNlbGYsb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiB4Y29tcGxleChvdGhlciAlIGNvbXBsZXgoc2VsZikpCisKKyAgICAgICAgaW5maXhfYmlub3BzID0gKCcrJywgJy0nLCAnKicsICcqKicsICclJywgJy8vJywgJy8nKQorICAgICAgICB4Y29tcGxleF92YWx1ZXMgPSAoeGNvbXBsZXgoMSksIHhjb21wbGV4KDEyMy4wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjb21wbGV4KC0xMCsyaiksIHhjb21wbGV4KDMrMTg3aiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y29tcGxleCgzLTc4aikpCisgICAgICAgIHRlc3RfdmFsdWVzID0gKDEsIDEyMy4wLCAxMC0xOWosIHhjb21wbGV4KDErMmopLAorICAgICAgICAgICAgICAgICAgICAgICB4Y29tcGxleCgxKzg3aiksIHhjb21wbGV4KDEwKzkwaikpCisKKyAgICAgICAgZm9yIG9wIGluIGluZml4X2Jpbm9wczoKKyAgICAgICAgICAgIGZvciB4IGluIHhjb21wbGV4X3ZhbHVlczoKKyAgICAgICAgICAgICAgICBmb3IgeSBpbiB0ZXN0X3ZhbHVlczoKKyAgICAgICAgICAgICAgICAgICAgYSA9ICd4ICVzIHknICUgb3AKKyAgICAgICAgICAgICAgICAgICAgYiA9ICd5ICVzIHgnICUgb3AKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoZXZhbChhKSkgaXMgdHlwZShldmFsKGIpKSBpcyB4Y29tcGxleCkKKworICAgIGRlZiB0ZXN0X2hhc2goc2VsZik6CisgICAgICAgIGZvciB4IGluIHhyYW5nZSgtMzAsIDMwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh4KSwgaGFzaChjb21wbGV4KHgsIDApKSkKKyAgICAgICAgICAgIHggLz0gMy4wICAgICMgbm93IGNoZWNrIGFnYWluc3QgZmxvYXRpbmcgcG9pbnQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh4KSwgaGFzaChjb21wbGV4KHgsIDAuKSkpCisKKyAgICBkZWYgdGVzdF9hYnMoc2VsZik6CisgICAgICAgIG51bXMgPSBbY29tcGxleCh4LzMuLCB5LzcuKSBmb3IgeCBpbiB4cmFuZ2UoLTksOSkgZm9yIHkgaW4geHJhbmdlKC05LDkpXQorICAgICAgICBmb3IgbnVtIGluIG51bXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKChudW0ucmVhbCoqMiArIG51bS5pbWFnKioyKSAgKiogMC41LCBhYnMobnVtKSkKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcigxKzZqKSwgJygxKzZqKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcigxLTZqKSwgJygxLTZqKScpCisKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZXByKC0oMSswaikpLCAnKC0xKy0waiknKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMS02aixjb21wbGV4KHJlcHIoMS02aikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDErNmosY29tcGxleChyZXByKDErNmopKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtNmosY29tcGxleChyZXByKC02aikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDZqLGNvbXBsZXgocmVwcig2aikpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjb21wbGV4KDEuLCBJTkYpKSwgIigxK2luZmopIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNvbXBsZXgoMS4sIC1JTkYpKSwgIigxLWluZmopIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNvbXBsZXgoSU5GLCAxKSksICIoaW5mKzFqKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjb21wbGV4KC1JTkYsIElORikpLCAiKC1pbmYraW5maikiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY29tcGxleChOQU4sIDEpKSwgIihuYW4rMWopIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNvbXBsZXgoMSwgTkFOKSksICIoMStuYW5qKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjb21wbGV4KE5BTiwgTkFOKSksICIobmFuK25hbmopIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY29tcGxleCgwLCBJTkYpKSwgImluZmoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY29tcGxleCgwLCAtSU5GKSksICItaW5maiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjb21wbGV4KDAsIE5BTikpLCAibmFuaiIpCisKKyAgICBkZWYgdGVzdF9uZWcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgxKzZqKSwgLTEtNmopCisKKyAgICBkZWYgdGVzdF9maWxlKHNlbGYpOgorICAgICAgICBhID0gMy4zMys0LjQzagorICAgICAgICBiID0gNS4xKzIuM2oKKworICAgICAgICBmbyA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm8gPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgICAgICBwcmludCA+PmZvLCBhLCBiCisgICAgICAgICAgICBmby5jbG9zZSgpCisgICAgICAgICAgICBmbyA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm8ucmVhZCgpLCAiJXMgJXNcbiIgJSAoYSwgYikpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiAoZm8gaXMgbm90IE5vbmUpIGFuZCAobm90IGZvLmNsb3NlZCk6CisgICAgICAgICAgICAgICAgZm8uY2xvc2UoKQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfZ2V0bmV3YXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMSsyaikuX19nZXRuZXdhcmdzX18oKSwgKDEuMCwgMi4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMS0yaikuX19nZXRuZXdhcmdzX18oKSwgKDEuMCwgLTIuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDJqKS5fX2dldG5ld2FyZ3NfXygpLCAoMC4wLCAyLjApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtMGopLl9fZ2V0bmV3YXJnc19fKCksICgwLjAsIC0wLjApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXgoMCwgSU5GKS5fX2dldG5ld2FyZ3NfXygpLCAoMC4wLCBJTkYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXgoSU5GLCAwKS5fX2dldG5ld2FyZ3NfXygpLCAoSU5GLCAwLjApKQorCisgICAgaWYgZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpOgorICAgICAgICBkZWYgdGVzdF9wbHVzX21pbnVzXzBqKHNlbGYpOgorICAgICAgICAgICAgIyB0ZXN0IHRoYXQgLTBqIGFuZCAwaiBsaXRlcmFscyBhcmUgbm90IGlkZW50aWZpZWQKKyAgICAgICAgICAgIHoxLCB6MiA9IDBqLCAtMGoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXRhbjIoejEuaW1hZywgLTEuKSwgYXRhbjIoMC4sIC0xLikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0YW4yKHoyLmltYWcsIC0xLiksIGF0YW4yKC0wLiwgLTEuKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCByZXF1aXJlcyBJRUVFIDc1NCBkb3VibGVzIikKKyAgICBkZWYgdGVzdF9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV4KCIxZTUwMCIpLCBjb21wbGV4KElORiwgMC4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV4KCItMWU1MDBqIiksIGNvbXBsZXgoMC4wLCAtSU5GKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV4KCItMWU1MDArMS44ZTMwOGoiKSwgY29tcGxleCgtSU5GLCBJTkYpKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IHJlcXVpcmVzIElFRUUgNzU0IGRvdWJsZXMiKQorICAgIGRlZiB0ZXN0X3JlcHJfcm91bmR0cmlwKHNlbGYpOgorICAgICAgICB2YWxzID0gWzAuMCwgMWUtNTAwLCAxZS0zMTUsIDFlLTIwMCwgMC4wMTIzLCAzLjE0MTUsIDFlNTAsIElORiwgTkFOXQorICAgICAgICB2YWxzICs9IFstdiBmb3IgdiBpbiB2YWxzXQorCisgICAgICAgICMgY29tcGxleChyZXByKHopKSBzaG91bGQgcmVjb3ZlciB6IGV4YWN0bHksIGV2ZW4gZm9yIGNvbXBsZXgKKyAgICAgICAgIyBudW1iZXJzIGludm9sdmluZyBhbiBpbmZpbml0eSwgbmFuLCBvciBuZWdhdGl2ZSB6ZXJvCisgICAgICAgIGZvciB4IGluIHZhbHM6CisgICAgICAgICAgICBmb3IgeSBpbiB2YWxzOgorICAgICAgICAgICAgICAgIHogPSBjb21wbGV4KHgsIHkpCisgICAgICAgICAgICAgICAgcm91bmR0cmlwID0gY29tcGxleChyZXByKHopKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmxvYXRzQXJlSWRlbnRpY2FsKHoucmVhbCwgcm91bmR0cmlwLnJlYWwpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGbG9hdHNBcmVJZGVudGljYWwoei5pbWFnLCByb3VuZHRyaXAuaW1hZykKKworICAgICAgICAjIGlmIHdlIHByZWRlZmluZSBzb21lIGNvbnN0YW50cywgdGhlbiBldmFsKHJlcHIoeikpIHNob3VsZAorICAgICAgICAjIGFsc28gd29yaywgZXhjZXB0IHRoYXQgaXQgbWlnaHQgY2hhbmdlIHRoZSBzaWduIG9mIHplcm9zCisgICAgICAgIGluZiwgbmFuID0gZmxvYXQoJ2luZicpLCBmbG9hdCgnbmFuJykKKyAgICAgICAgaW5maiwgbmFuaiA9IGNvbXBsZXgoMC4wLCBpbmYpLCBjb21wbGV4KDAuMCwgbmFuKQorICAgICAgICBmb3IgeCBpbiB2YWxzOgorICAgICAgICAgICAgZm9yIHkgaW4gdmFsczoKKyAgICAgICAgICAgICAgICB6ID0gY29tcGxleCh4LCB5KQorICAgICAgICAgICAgICAgIHJvdW5kdHJpcCA9IGV2YWwocmVwcih6KSkKKyAgICAgICAgICAgICAgICAjIGFkZGluZyAwLjAgaGFzIG5vIGVmZmVjdCBiZXNpZGUgY2hhbmdpbmcgLTAuMCB0byAwLjAKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZsb2F0c0FyZUlkZW50aWNhbCgwLjAgKyB6LnJlYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wICsgcm91bmR0cmlwLnJlYWwpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGbG9hdHNBcmVJZGVudGljYWwoMC4wICsgei5pbWFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCArIHJvdW5kdHJpcC5pbWFnKQorCisgICAgZGVmIHRlc3RfZm9ybWF0KHNlbGYpOgorICAgICAgICAjIGVtcHR5IGZvcm1hdCBzdHJpbmcgaXMgc2FtZSBhcyBzdHIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxKzNqLCAnJyksIHN0cigxKzNqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41KzMuNWosICcnKSwgc3RyKDEuNSszLjVqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoM2osICcnKSwgc3RyKDNqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMy4yaiwgJycpLCBzdHIoMy4yaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDMrMGosICcnKSwgc3RyKDMrMGopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgzLjIrMGosICcnKSwgc3RyKDMuMiswaikpCisKKyAgICAgICAgIyBlbXB0eSBwcmVzZW50YXRpb24gdHlwZSBzaG91bGQgc3RpbGwgYmUgYW5hbG9nb3VzIHRvIHN0ciwKKyAgICAgICAgIyBldmVuIHdoZW4gZm9ybWF0IHN0cmluZyBpcyBub25lbXB0eSAoaXNzdWUgIzU5MjApLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgzLjIrMGosICctJyksIHN0cigzLjIrMGopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgzLjIrMGosICc8JyksIHN0cigzLjIrMGopKQorICAgICAgICB6ID0gNC83LiAtIDEwMGovNy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeiwgJycpLCBzdHIoeikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHosICctJyksIHN0cih6KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeiwgJzwnKSwgc3RyKHopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh6LCAnMTAnKSwgc3RyKHopKQorICAgICAgICB6ID0gY29tcGxleCgwLjAsIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeiwgJycpLCBzdHIoeikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHosICctJyksIHN0cih6KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeiwgJzwnKSwgc3RyKHopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh6LCAnMicpLCBzdHIoeikpCisgICAgICAgIHogPSBjb21wbGV4KC0wLjAsIDIuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeiwgJycpLCBzdHIoeikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHosICctJyksIHN0cih6KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeiwgJzwnKSwgc3RyKHopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh6LCAnMycpLCBzdHIoeikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMSszaiwgJ2cnKSwgJzErM2onKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgzaiwgJ2cnKSwgJzArM2onKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrMy41aiwgJ2cnKSwgJzEuNSszLjVqJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrMy41aiwgJytnJyksICcrMS41KzMuNWonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUtMy41aiwgJytnJyksICcrMS41LTMuNWonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUtMy41aiwgJy1nJyksICcxLjUtMy41aicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDEuNSszLjVqLCAnIGcnKSwgJyAxLjUrMy41aicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDEuNS0zLjVqLCAnIGcnKSwgJyAxLjUtMy41aicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KC0xLjUrMy41aiwgJyBnJyksICctMS41KzMuNWonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgtMS41LTMuNWosICcgZycpLCAnLTEuNS0zLjVqJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgtMS41LTMuNWUtMjBqLCAnZycpLCAnLTEuNS0zLjVlLTIwaicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KC0xLjUtMy41aiwgJ2YnKSwgJy0xLjUwMDAwMC0zLjUwMDAwMGonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgtMS41LTMuNWosICdGJyksICctMS41MDAwMDAtMy41MDAwMDBqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoLTEuNS0zLjVqLCAnZScpLCAnLTEuNTAwMDAwZSswMC0zLjUwMDAwMGUrMDBqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoLTEuNS0zLjVqLCAnLjJlJyksICctMS41MGUrMDAtMy41MGUrMDBqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoLTEuNS0zLjVqLCAnLjJFJyksICctMS41MEUrMDAtMy41MEUrMDBqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoLTEuNWUxMC0zLjVlNWosICcuMkcnKSwgJy0xLjVFKzEwLTMuNUUrMDVqJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrM2osICc8MjBnJyksICAnMS41KzNqICAgICAgICAgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrM2osICcqPDIwZycpLCAnMS41KzNqKioqKioqKioqKioqKionKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrM2osICc+MjBnJyksICAnICAgICAgICAgICAgICAxLjUrM2onKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrM2osICdeMjBnJyksICAnICAgICAgIDEuNSszaiAgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrM2osICc8MjAnKSwgICAnKDEuNSszaikgICAgICAgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrM2osICc+MjAnKSwgICAnICAgICAgICAgICAgKDEuNSszaiknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrM2osICdeMjAnKSwgICAnICAgICAgKDEuNSszaikgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjEyMy0zLjEyM2osICdeMjAuMicpLCAnICAgICAoMS4xLTMuMWopICAgICAnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDEuNSszaiwgJzIwLjJmJyksICcgICAgICAgICAgMS41MCszLjAwaicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDEuNSszaiwgJz4yMC4yZicpLCAnICAgICAgICAgIDEuNTArMy4wMGonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrM2osICc8MjAuMmYnKSwgJzEuNTArMy4wMGogICAgICAgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41ZTIwKzNqLCAnPDIwLjJmJyksICcxNTAwMDAwMDAwMDAwMDAwMDAwMDAuMDArMy4wMGonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjVlMjArM2osICc+NDAuMmYnKSwgJyAgICAgICAgICAxNTAwMDAwMDAwMDAwMDAwMDAwMDAuMDArMy4wMGonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjVlMjArM2osICdeNDAsLjJmJyksICcgIDE1MCwwMDAsMDAwLDAwMCwwMDAsMDAwLDAwMC4wMCszLjAwaiAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41ZTIxKzNqLCAnXjQwLC4yZicpLCAnIDEsNTAwLDAwMCwwMDAsMDAwLDAwMCwwMDAsMDAwLjAwKzMuMDBqICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDEuNWUyMSszMDAwaiwgJywuMmYnKSwgJzEsNTAwLDAwMCwwMDAsMDAwLDAwMCwwMDAsMDAwLjAwKzMsMDAwLjAwaicpCisKKyAgICAgICAgIyBhbHRlcm5hdGUgaXMgaW52YWxpZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAoMS41KzAuNWopLl9fZm9ybWF0X18sICcjZicpCisKKyAgICAgICAgIyB6ZXJvIHBhZGRpbmcgaXMgaW52YWxpZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAoMS41KzAuNWopLl9fZm9ybWF0X18sICcwMTBmJykKKworICAgICAgICAjICc9JyBhbGlnbm1lbnQgaXMgaW52YWxpZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAoMS41KzNqKS5fX2Zvcm1hdF9fLCAnPTIwJykKKworICAgICAgICAjIGludGVnZXIgcHJlc2VudGF0aW9uIHR5cGVzIGFyZSBhbiBlcnJvcgorICAgICAgICBmb3IgdCBpbiAnYmNkb3hYJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICgxLjUrMC41aikuX19mb3JtYXRfXywgdCkKKworICAgICAgICAjIG1ha2Ugc3VyZSBldmVyeXRoaW5nIHdvcmtzIGluICcnLmZvcm1hdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyp7MDouM2Z9KicuZm9ybWF0KDMuMTQxNTkrMi43MTgyOGopLCAnKjMuMTQyKzIuNzE4aionKQorCisgICAgICAgICMgaXNzdWUgMzM4MjogJ2YnIGFuZCAnRicgd2l0aCBpbmYncyBhbmQgbmFuJ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Zn0nLmZvcm1hdChJTkYrMGopLCAnaW5mKzAuMDAwMDAwaicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOkZ9Jy5mb3JtYXQoSU5GKzBqKSwgJ0lORiswLjAwMDAwMGonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpmfScuZm9ybWF0KC1JTkYrMGopLCAnLWluZiswLjAwMDAwMGonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpGfScuZm9ybWF0KC1JTkYrMGopLCAnLUlORiswLjAwMDAwMGonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpmfScuZm9ybWF0KGNvbXBsZXgoSU5GLCBJTkYpKSwgJ2luZitpbmZqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Rn0nLmZvcm1hdChjb21wbGV4KElORiwgSU5GKSksICdJTkYrSU5GaicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOmZ9Jy5mb3JtYXQoY29tcGxleChJTkYsIC1JTkYpKSwgJ2luZi1pbmZqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Rn0nLmZvcm1hdChjb21wbGV4KElORiwgLUlORikpLCAnSU5GLUlORmonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpmfScuZm9ybWF0KGNvbXBsZXgoLUlORiwgSU5GKSksICctaW5mK2luZmonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpGfScuZm9ybWF0KGNvbXBsZXgoLUlORiwgSU5GKSksICctSU5GK0lORmonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpmfScuZm9ybWF0KGNvbXBsZXgoLUlORiwgLUlORikpLCAnLWluZi1pbmZqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Rn0nLmZvcm1hdChjb21wbGV4KC1JTkYsIC1JTkYpKSwgJy1JTkYtSU5GaicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Zn0nLmZvcm1hdChjb21wbGV4KE5BTiwgMCkpLCAnbmFuKzAuMDAwMDAwaicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOkZ9Jy5mb3JtYXQoY29tcGxleChOQU4sIDApKSwgJ05BTiswLjAwMDAwMGonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpmfScuZm9ybWF0KGNvbXBsZXgoTkFOLCBOQU4pKSwgJ25hbituYW5qJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Rn0nLmZvcm1hdChjb21wbGV4KE5BTiwgTkFOKSksICdOQU4rTkFOaicpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygoImNvbXBsZXggZGl2bW9kLi4sIC8vIGFuZCAlIGFyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXByZWNhdGVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ29tcGxleFRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGxleC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzMzZkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGxleC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzMzZkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzZjYmVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGxleF9hcmdzLnB5CkBAIC0wLDAgKzEsMTE4IEBACisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB0ZXh0d3JhcAorCitjbGFzcyBDb21wbGV4QXJnc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBjaGVjayhzZWxmLCBmdW5jLCBleHBlY3RlZCwgKmFyZ3MpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoKmFyZ3MpLCBleHBlY3RlZCkKKworICAgICMgVGhlc2UgZnVuY3Rpb25zIGFyZSB0ZXN0ZWQgYmVsb3cgYXMgbGFtYmRhcyB0b28uICBJZiB5b3UgYWRkIGEKKyAgICAjIGZ1bmN0aW9uIHRlc3QsIGFsc28gYWRkIGEgc2ltaWxhciBsYW1iZGEgdGVzdC4KKworICAgICMgRnVuY3Rpb25zIGFyZSB3cmFwcGVkIGluICJleGVjIiBzdGF0ZW1lbnRzIGluIG9yZGVyIHRvCisgICAgIyBzaWxlbmNlIFB5M2sgd2FybmluZ3MuCisKKyAgICBkZWYgdGVzdF9mdW5jX3BhcmVuc19ub191bnBhY2tpbmcoc2VsZik6CisgICAgICAgIGV4ZWMgdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICBkZWYgZigoKCgoeCkpKSkpOiByZXR1cm4geAorICAgICAgICBzZWxmLmNoZWNrKGYsIDEsIDEpCisgICAgICAgICMgSW5uZXIgcGFyZW5zIGFyZSBlbGlkZWQsIHNhbWUgYXM6IGYoeCwpCisgICAgICAgIGRlZiBmKCgoeCkpLCk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMiwgMikKKyAgICAgICAgIiIiKQorCisgICAgZGVmIHRlc3RfZnVuY18xKHNlbGYpOgorICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgZGVmIGYoKCgoKHgpLCkpKSk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMywgKDMsKSkKKyAgICAgICAgZGVmIGYoKCgoKHgpKSwpKSk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgNCwgKDQsKSkKKyAgICAgICAgZGVmIGYoKCgoKHgpKSksKSk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgNSwgKDUsKSkKKyAgICAgICAgZGVmIGYoKCh4KSwpKTogcmV0dXJuIHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCA2LCAoNiwpKQorICAgICAgICAiIiIpCisKKyAgICBkZWYgdGVzdF9mdW5jXzIoc2VsZik6CisgICAgICAgIGV4ZWMgdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICBkZWYgZigoKCgoeCkpLCksKSk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMiwgKCgyLCksKSkKKyAgICAgICAgIiIiKQorCisgICAgZGVmIHRlc3RfZnVuY18zKHNlbGYpOgorICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgZGVmIGYoKCgoKCh4KSksKSwpLCkpOiByZXR1cm4geAorICAgICAgICBzZWxmLmNoZWNrKGYsIDMsICgoKDMsKSwpLCkpCisgICAgICAgICIiIikKKworICAgIGRlZiB0ZXN0X2Z1bmNfY29tcGxleChzZWxmKToKKyAgICAgICAgZXhlYyB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgIGRlZiBmKCgoKCgoeCkpLCksKSwpLCBhLCBiLCBjKTogcmV0dXJuIHgsIGEsIGIsIGMKKyAgICAgICAgc2VsZi5jaGVjayhmLCAoMywgOSwgOCwgNyksICgoKDMsKSwpLCksIDksIDgsIDcpCisKKyAgICAgICAgZGVmIGYoKCgoKCgoeCkpLCkpLCksKSwgYSwgYiwgYyk6IHJldHVybiB4LCBhLCBiLCBjCisgICAgICAgIHNlbGYuY2hlY2soZiwgKDMsIDksIDgsIDcpLCAoKCgzLCksKSwpLCA5LCA4LCA3KQorCisgICAgICAgIGRlZiBmKGEsIGIsIGMsICgoKCgoKHgpKSwpKSwpLCkpOiByZXR1cm4gYSwgYiwgYywgeAorICAgICAgICBzZWxmLmNoZWNrKGYsICg5LCA4LCA3LCAzKSwgOSwgOCwgNywgKCgoMywpLCksKSkKKyAgICAgICAgIiIiKQorCisgICAgIyBEdXBsaWNhdGUgdGhlIHRlc3RzIGFib3ZlLCBidXQgZm9yIGxhbWJkYS4gIElmIHlvdSBhZGQgYSBsYW1iZGEgdGVzdCwKKyAgICAjIGFsc28gYWRkIGEgc2ltaWxhciBmdW5jdGlvbiB0ZXN0IGFib3ZlLgorCisgICAgZGVmIHRlc3RfbGFtYmRhX3BhcmVuc19ub191bnBhY2tpbmcoc2VsZik6CisgICAgICAgIGV4ZWMgdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICBmID0gbGFtYmRhICgoKCgoeCkpKSkpOiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMSwgMSkKKyAgICAgICAgIyBJbm5lciBwYXJlbnMgYXJlIGVsaWRlZCwgc2FtZSBhczogZih4LCkKKyAgICAgICAgZiA9IGxhbWJkYSAoKHgpKSw6IHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCAyLCAyKQorICAgICAgICAiIiIpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfMShzZWxmKToKKyAgICAgICAgZXhlYyB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgIGYgPSBsYW1iZGEgKCgoKCh4KSwpKSkpOiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMywgKDMsKSkKKyAgICAgICAgZiA9IGxhbWJkYSAoKCgoKHgpKSwpKSk6IHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCA0LCAoNCwpKQorICAgICAgICBmID0gbGFtYmRhICgoKCgoeCkpKSwpKTogeAorICAgICAgICBzZWxmLmNoZWNrKGYsIDUsICg1LCkpCisgICAgICAgIGYgPSBsYW1iZGEgKCgoeCksKSk6IHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCA2LCAoNiwpKQorICAgICAgICAiIiIpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfMihzZWxmKToKKyAgICAgICAgZXhlYyB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgIGYgPSBsYW1iZGEgKCgoKCh4KSksKSwpKTogeAorICAgICAgICBzZWxmLmNoZWNrKGYsIDIsICgoMiwpLCkpCisgICAgICAgICIiIikKKworICAgIGRlZiB0ZXN0X2xhbWJkYV8zKHNlbGYpOgorICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgZiA9IGxhbWJkYSAoKCgoKCh4KSksKSwpLCkpOiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMywgKCgoMywpLCksKSkKKyAgICAgICAgIiIiKQorCisgICAgZGVmIHRlc3RfbGFtYmRhX2NvbXBsZXgoc2VsZik6CisgICAgICAgIGV4ZWMgdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICBmID0gbGFtYmRhICgoKCgoeCkpLCksKSwpLCBhLCBiLCBjOiAoeCwgYSwgYiwgYykKKyAgICAgICAgc2VsZi5jaGVjayhmLCAoMywgOSwgOCwgNyksICgoKDMsKSwpLCksIDksIDgsIDcpCisKKyAgICAgICAgZiA9IGxhbWJkYSAoKCgoKCh4KSksKSksKSwpLCBhLCBiLCBjOiAoeCwgYSwgYiwgYykKKyAgICAgICAgc2VsZi5jaGVjayhmLCAoMywgOSwgOCwgNyksICgoKDMsKSwpLCksIDksIDgsIDcpCisKKyAgICAgICAgZiA9IGxhbWJkYSBhLCBiLCBjLCAoKCgoKCh4KSksKSksKSwpOiAoYSwgYiwgYywgeCkKKyAgICAgICAgc2VsZi5jaGVjayhmLCAoOSwgOCwgNywgMyksIDksIDgsIDcsICgoKDMsKSwpLCkpCisgICAgICAgICIiIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgidHVwbGUgcGFyYW1ldGVyIHVucGFja2luZyBoYXMgYmVlbiByZW1vdmVkIiwgU3ludGF4V2FybmluZyksCisgICAgICAgICAgICAoInBhcmVudGhlc2l6ZWQgYXJndW1lbnQgbmFtZXMgYXJlIGludmFsaWQiLCBTeW50YXhXYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ29tcGxleEFyZ3NUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGxleF9hcmdzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjMzM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGxleF9hcmdzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjMzM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29udGFpbnMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250YWlucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTM4MDgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29udGFpbnMucHkKQEAgLTAsMCArMSwxMTEgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGhhdmVfdW5pY29kZSwgcnVuX3VuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBiYXNlX3NldDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWwpOgorICAgICAgICBzZWxmLmVsID0gZWwKKworY2xhc3Mgc2V0KGJhc2Vfc2V0KToKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGVsKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZWwgPT0gZWwKKworY2xhc3Mgc2VxKGJhc2Vfc2V0KToKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbik6CisgICAgICAgIHJldHVybiBbc2VsZi5lbF1bbl0KKworCitjbGFzcyBUZXN0Q29udGFpbnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NvbW1vbl90ZXN0cyhzZWxmKToKKyAgICAgICAgYSA9IGJhc2Vfc2V0KDEpCisgICAgICAgIGIgPSBzZXQoMSkKKyAgICAgICAgYyA9IHNlcSgxKQorICAgICAgICBzZWxmLmFzc2VydEluKDEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMCwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigxLCBjKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDAsIGMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAxIGluIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAxIG5vdCBpbiBhKQorCisgICAgICAgICMgdGVzdCBjaGFyIGluIHN0cmluZworICAgICAgICBzZWxmLmFzc2VydEluKCdjJywgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2QnLCAnYWJjJykKKworICAgICAgICBzZWxmLmFzc2VydEluKCcnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignJywgJ2FiYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IE5vbmUgaW4gJ2FiYycpCisKKyAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgIGRlZiB0ZXN0X2NoYXJfaW5fdW5pY29kZShzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2MnLCB1bmljb2RlKCdhYmMnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2QnLCB1bmljb2RlKCdhYmMnKSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignJywgdW5pY29kZSgnJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHVuaWNvZGUoJycpLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4odW5pY29kZSgnJyksIHVuaWNvZGUoJycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignJywgdW5pY29kZSgnYWJjJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHVuaWNvZGUoJycpLCAnYWJjJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4odW5pY29kZSgnJyksIHVuaWNvZGUoJ2FiYycpKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogTm9uZSBpbiB1bmljb2RlKCdhYmMnKSkKKworICAgICAgICAgICAgIyB0ZXN0IFVuaWNvZGUgY2hhciBpbiBVbmljb2RlCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHVuaWNvZGUoJ2MnKSwgdW5pY29kZSgnYWJjJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKHVuaWNvZGUoJ2QnKSwgdW5pY29kZSgnYWJjJykpCisKKyAgICAgICAgICAgICMgdGVzdCBVbmljb2RlIGNoYXIgaW4gc3RyaW5nCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHVuaWNvZGUoJ2MnKSwgJ2FiYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKHVuaWNvZGUoJ2QnKSwgJ2FiYycpCisKKyAgICBkZWYgdGVzdF9idWlsdGluX3NlcXVlbmNlX3R5cGVzKHNlbGYpOgorICAgICAgICAjIGEgY29sbGVjdGlvbiBvZiB0ZXN0cyBvbiBidWlsdGluIHNlcXVlbmNlIHR5cGVzCisgICAgICAgIGEgPSByYW5nZSgxMCkKKyAgICAgICAgZm9yIGkgaW4gYToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigxNiwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihhLCBhKQorCisgICAgICAgIGEgPSB0dXBsZShhKQorICAgICAgICBmb3IgaSBpbiBhOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihpLCBhKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDE2LCBhKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGEsIGEpCisKKyAgICAgICAgY2xhc3MgRGV2aWFudDE6CisgICAgICAgICAgICAiIiJCZWhhdmVzIHN0cmFuZ2VseSB3aGVuIGNvbXBhcmVkCisKKyAgICAgICAgICAgIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbnRhaW5zIGNvZGUKKyAgICAgICAgICAgIHdvcmtzIHdoZW4gdGhlIGxpc3QgaXMgbW9kaWZpZWQgZHVyaW5nIHRoZSBjaGVjay4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgYUxpc3QgPSByYW5nZSgxNSkKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBpZiBvdGhlciA9PSAxMjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hTGlzdC5yZW1vdmUoMTIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYUxpc3QucmVtb3ZlKDEzKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFMaXN0LnJlbW92ZSgxNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oRGV2aWFudDEoKSwgRGV2aWFudDEuYUxpc3QpCisKKyAgICAgICAgY2xhc3MgRGV2aWFudDI6CisgICAgICAgICAgICAiIiJCZWhhdmVzIHN0cmFuZ2VseSB3aGVuIGNvbXBhcmVkCisKKyAgICAgICAgICAgIFRoaXMgY2xhc3MgcmFpc2VzIGFuIGV4Y2VwdGlvbiBkdXJpbmcgY29tcGFyaXNvbi4gIFRoYXQgaW4KKyAgICAgICAgICAgIHR1cm4gY2F1c2VzIHRoZSBjb21wYXJpc29uIHRvIGZhaWwgd2l0aCBhIFR5cGVFcnJvci4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIGlmIG90aGVyID09IDQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgImdvdGNoYSIKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKERldmlhbnQyKCksIGEpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUZXN0Q29udGFpbnMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbnRhaW5zLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbnRhaW5zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOThiNzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29udGFpbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbnRhaW5zLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbnRhaW5zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOThiNzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29udGFpbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOGM5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CkBAIC0wLDAgKzEsMzI2IEBACisiIiJVbml0IHRlc3RzIGZvciBjb250ZXh0bGliLnB5LCBhbmQgb3RoZXIgY29udGV4dCBtYW5hZ2Vycy4iIiIKKworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgKiAgIyBUZXN0cyBfX2FsbF9fCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCisKKworY2xhc3MgQ29udGV4dE1hbmFnZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jb250ZXh0bWFuYWdlcl9wbGFpbihzZWxmKToKKyAgICAgICAgc3RhdGUgPSBbXQorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIHdvb2hvbygpOgorICAgICAgICAgICAgc3RhdGUuYXBwZW5kKDEpCisgICAgICAgICAgICB5aWVsZCA0MgorICAgICAgICAgICAgc3RhdGUuYXBwZW5kKDk5OSkKKyAgICAgICAgd2l0aCB3b29ob28oKSBhcyB4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgWzFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCA0MikKKyAgICAgICAgICAgIHN0YXRlLmFwcGVuZCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRlLCBbMSwgNDIsIDk5OV0pCisKKyAgICBkZWYgdGVzdF9jb250ZXh0bWFuYWdlcl9maW5hbGx5KHNlbGYpOgorICAgICAgICBzdGF0ZSA9IFtdCisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgd29vaG9vKCk6CisgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoMSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB5aWVsZCA0MgorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoOTk5KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAgICAgICAgIHdpdGggd29vaG9vKCkgYXMgeDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRlLCBbMV0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCA0MikKKyAgICAgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoeCkKKyAgICAgICAgICAgICAgICByYWlzZSBaZXJvRGl2aXNpb25FcnJvcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIFsxLCA0MiwgOTk5XSkKKworICAgIGRlZiB0ZXN0X2NvbnRleHRtYW5hZ2VyX25vX3JlcmFpc2Uoc2VsZik6CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgd2hlZSgpOgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgY3R4ID0gd2hlZSgpCisgICAgICAgIGN0eC5fX2VudGVyX18oKQorICAgICAgICAjIENhbGxpbmcgX19leGl0X18gc2hvdWxkIG5vdCByZXN1bHQgaW4gYW4gZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY3R4Ll9fZXhpdF9fKFR5cGVFcnJvciwgVHlwZUVycm9yKCJmb28iKSwgTm9uZSkpCisKKyAgICBkZWYgdGVzdF9jb250ZXh0bWFuYWdlcl90cmFwX3lpZWxkX2FmdGVyX3Rocm93KHNlbGYpOgorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIHdob28oKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB5aWVsZAorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHlpZWxkCisgICAgICAgIGN0eCA9IHdob28oKQorICAgICAgICBjdHguX19lbnRlcl9fKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBSdW50aW1lRXJyb3IsIGN0eC5fX2V4aXRfXywgVHlwZUVycm9yLCBUeXBlRXJyb3IoImZvbyIpLCBOb25lCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2NvbnRleHRtYW5hZ2VyX2V4Y2VwdChzZWxmKToKKyAgICAgICAgc3RhdGUgPSBbXQorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIHdvb2hvbygpOgorICAgICAgICAgICAgc3RhdGUuYXBwZW5kKDEpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQgNDIKKyAgICAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvciwgZToKKyAgICAgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoZS5hcmdzWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIFsxLCA0MiwgOTk5XSkKKyAgICAgICAgd2l0aCB3b29ob28oKSBhcyB4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgWzFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCA0MikKKyAgICAgICAgICAgIHN0YXRlLmFwcGVuZCh4KQorICAgICAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IoOTk5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRlLCBbMSwgNDIsIDk5OV0pCisKKyAgICBkZWYgX2NyZWF0ZV9jb250ZXh0bWFuYWdlcl9hdHRyaWJzKHNlbGYpOgorICAgICAgICBkZWYgYXR0cmlicygqKmt3KToKKyAgICAgICAgICAgIGRlZiBkZWNvcmF0ZShmdW5jKToKKyAgICAgICAgICAgICAgICBmb3Igayx2IGluIGt3Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoZnVuYyxrLHYpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMKKyAgICAgICAgICAgIHJldHVybiBkZWNvcmF0ZQorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgQGF0dHJpYnMoZm9vPSdiYXInKQorICAgICAgICBkZWYgYmF6KHNwYW0pOgorICAgICAgICAgICAgIiIiV2hlZSEiIiIKKyAgICAgICAgcmV0dXJuIGJhegorCisgICAgZGVmIHRlc3RfY29udGV4dG1hbmFnZXJfYXR0cmlicyhzZWxmKToKKyAgICAgICAgYmF6ID0gc2VsZi5fY3JlYXRlX2NvbnRleHRtYW5hZ2VyX2F0dHJpYnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhei5fX25hbWVfXywnYmF6JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXouZm9vLCAnYmFyJykKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0X2NvbnRleHRtYW5hZ2VyX2RvY19hdHRyaWIoc2VsZik6CisgICAgICAgIGJheiA9IHNlbGYuX2NyZWF0ZV9jb250ZXh0bWFuYWdlcl9hdHRyaWJzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXouX19kb2NfXywgIldoZWUhIikKKworY2xhc3MgTmVzdGVkVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBYWFggVGhpcyBuZWVkcyBtb3JlIHdvcmsKKworICAgIGRlZiB0ZXN0X25lc3RlZChzZWxmKToKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBhKCk6CisgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgYigpOgorICAgICAgICAgICAgeWllbGQgMgorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIGMoKToKKyAgICAgICAgICAgIHlpZWxkIDMKKyAgICAgICAgd2l0aCBuZXN0ZWQoYSgpLCBiKCksIGMoKSkgYXMgKHgsIHksIHopOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6LCAzKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX2NsZWFudXAoc2VsZik6CisgICAgICAgIHN0YXRlID0gW10KKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBhKCk6CisgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoMSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB5aWVsZCAyCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHN0YXRlLmFwcGVuZCgzKQorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIGIoKToKKyAgICAgICAgICAgIHN0YXRlLmFwcGVuZCg0KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHlpZWxkIDUKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3RhdGUuYXBwZW5kKDYpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgd2l0aCBuZXN0ZWQoYSgpLCBiKCkpIGFzICh4LCB5KToKKyAgICAgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoeCkKKyAgICAgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoeSkKKyAgICAgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgWzEsIDQsIDIsIDUsIDYsIDNdKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX3JpZ2h0X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBhKCk6CisgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgIGNsYXNzIGIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDIKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICB3aXRoIG5lc3RlZChhKCksIGIoKSkgYXMgKHgsIHkpOgorICAgICAgICAgICAgICAgIDEgLy8gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4LCB5KSwgKDEsIDIpKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX2Jfc3dhbGxvd3Moc2VsZik6CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgYSgpOgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBiKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIFN3YWxsb3cgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBuZXN0ZWQoYSgpLCBiKCkpOgorICAgICAgICAgICAgICAgIDEgLy8gMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCBzd2FsbG93IFplcm9EaXZpc2lvbkVycm9yIikKKworICAgIGRlZiB0ZXN0X25lc3RlZF9icmVhayhzZWxmKToKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBhKCk6CisgICAgICAgICAgICB5aWVsZAorICAgICAgICBzdGF0ZSA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHN0YXRlICs9IDEKKyAgICAgICAgICAgIHdpdGggbmVzdGVkKGEoKSwgYSgpKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc3RhdGUgKz0gMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgMSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF9jb250aW51ZShzZWxmKToKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBhKCk6CisgICAgICAgICAgICB5aWVsZAorICAgICAgICBzdGF0ZSA9IDAKKyAgICAgICAgd2hpbGUgc3RhdGUgPCAzOgorICAgICAgICAgICAgc3RhdGUgKz0gMQorICAgICAgICAgICAgd2l0aCBuZXN0ZWQoYSgpLCBhKCkpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzdGF0ZSArPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRlLCAzKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX3JldHVybihzZWxmKToKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBhKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlZiBmb28oKToKKyAgICAgICAgICAgIHdpdGggbmVzdGVkKGEoKSwgYSgpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgcmV0dXJuIDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vKCksIDEpCisKK2NsYXNzIENsb3NpbmdUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIFhYWCBUaGlzIG5lZWRzIG1vcmUgd29yaworCisgICAgZGVmIHRlc3RfY2xvc2luZyhzZWxmKToKKyAgICAgICAgc3RhdGUgPSBbXQorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgICAgIHN0YXRlLmFwcGVuZCgxKQorICAgICAgICB4ID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIFtdKQorICAgICAgICB3aXRoIGNsb3NpbmcoeCkgYXMgeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgWzFdKQorCisgICAgZGVmIHRlc3RfY2xvc2luZ19lcnJvcihzZWxmKToKKyAgICAgICAgc3RhdGUgPSBbXQorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgICAgIHN0YXRlLmFwcGVuZCgxKQorICAgICAgICB4ID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIFtdKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAgICAgICAgIHdpdGggY2xvc2luZyh4KSBhcyB5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgWzFdKQorCitjbGFzcyBGaWxlQ29udGV4dFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0V2l0aE9wZW4oc2VsZik6CisgICAgICAgIHRmbiA9IHRlbXBmaWxlLm1rdGVtcCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBOb25lCisgICAgICAgICAgICB3aXRoIG9wZW4odGZuLCAidyIpIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLmNsb3NlZCkKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJCb29oXG4iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuY2xvc2VkKQorICAgICAgICAgICAgZiA9IE5vbmUKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgICAgIHdpdGggb3Blbih0Zm4sICJyIikgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLmNsb3NlZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgIkJvb2hcbiIpCisgICAgICAgICAgICAgICAgICAgIDEgLy8gMAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuY2xvc2VkKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0Zm4pCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCitjbGFzcyBMb2NrQ29udGV4dFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBib2lsZXJQbGF0ZShzZWxmLCBsb2NrLCBsb2NrZWQpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxvY2tlZCgpKQorICAgICAgICB3aXRoIGxvY2s6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobG9ja2VkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9ja2VkKCkpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgd2l0aCBsb2NrOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2NrZWQoKSkKKyAgICAgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsb2NrZWQoKSkKKworICAgIGRlZiB0ZXN0V2l0aExvY2soc2VsZik6CisgICAgICAgIGxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIHNlbGYuYm9pbGVyUGxhdGUobG9jaywgbG9jay5sb2NrZWQpCisKKyAgICBkZWYgdGVzdFdpdGhSTG9jayhzZWxmKToKKyAgICAgICAgbG9jayA9IHRocmVhZGluZy5STG9jaygpCisgICAgICAgIHNlbGYuYm9pbGVyUGxhdGUobG9jaywgbG9jay5faXNfb3duZWQpCisKKyAgICBkZWYgdGVzdFdpdGhDb25kaXRpb24oc2VsZik6CisgICAgICAgIGxvY2sgPSB0aHJlYWRpbmcuQ29uZGl0aW9uKCkKKyAgICAgICAgZGVmIGxvY2tlZCgpOgorICAgICAgICAgICAgcmV0dXJuIGxvY2suX2lzX293bmVkKCkKKyAgICAgICAgc2VsZi5ib2lsZXJQbGF0ZShsb2NrLCBsb2NrZWQpCisKKyAgICBkZWYgdGVzdFdpdGhTZW1hcGhvcmUoc2VsZik6CisgICAgICAgIGxvY2sgPSB0aHJlYWRpbmcuU2VtYXBob3JlKCkKKyAgICAgICAgZGVmIGxvY2tlZCgpOgorICAgICAgICAgICAgaWYgbG9jay5hY3F1aXJlKEZhbHNlKToKKyAgICAgICAgICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBzZWxmLmJvaWxlclBsYXRlKGxvY2ssIGxvY2tlZCkKKworICAgIGRlZiB0ZXN0V2l0aEJvdW5kZWRTZW1hcGhvcmUoc2VsZik6CisgICAgICAgIGxvY2sgPSB0aHJlYWRpbmcuQm91bmRlZFNlbWFwaG9yZSgpCisgICAgICAgIGRlZiBsb2NrZWQoKToKKyAgICAgICAgICAgIGlmIGxvY2suYWNxdWlyZShGYWxzZSk6CisgICAgICAgICAgICAgICAgbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgc2VsZi5ib2lsZXJQbGF0ZShsb2NrLCBsb2NrZWQpCisKKyMgVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSB0aGUgdGVzdCBhY3R1YWxseSBydW4gdW5kZXIgcmVncnRlc3QucHkhCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCJXaXRoLXN0YXRlbWVudHMgbm93IGRpcmVjdGx5IHN1cHBvcnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUgY29udGV4dCBtYW5hZ2VycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbnRleHRsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTA1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbnRleHRsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTA1MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb29raWUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb29raWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2MTMzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nvb2tpZS5weQpAQCAtMCwwICsxLDk5IEBACisjIFNpbXBsZSB0ZXN0IHN1aXRlIGZvciBDb29raWUucHkKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBydW5fZG9jdGVzdCwgY2hlY2tfd2FybmluZ3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IENvb2tpZQorCisKK2NsYXNzIENvb2tpZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIEN1cnJlbnRseSB0aGlzIG9ubHkgdGVzdHMgU2ltcGxlQ29va2llCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIGNhc2VzID0gWworICAgICAgICAgICAgeyAnZGF0YSc6ICdjaGlwcz1haG95OyB2aWVubmE9ZmluZ2VyJywKKyAgICAgICAgICAgICAgJ2RpY3QnOiB7J2NoaXBzJzonYWhveScsICd2aWVubmEnOidmaW5nZXInfSwKKyAgICAgICAgICAgICAgJ3JlcHInOiAiPFNpbXBsZUNvb2tpZTogY2hpcHM9J2Fob3knIHZpZW5uYT0nZmluZ2VyJz4iLAorICAgICAgICAgICAgICAnb3V0cHV0JzogJ1NldC1Db29raWU6IGNoaXBzPWFob3lcblNldC1Db29raWU6IHZpZW5uYT1maW5nZXInLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgeyAnZGF0YSc6ICdrZWVibGVyPSJFPW1jMjsgTD1cXCJMb3Zlc1xcIjsgZnVkZ2U9XFwwMTI7IicsCisgICAgICAgICAgICAgICdkaWN0JzogeydrZWVibGVyJyA6ICdFPW1jMjsgTD0iTG92ZXMiOyBmdWRnZT1cMDEyOyd9LAorICAgICAgICAgICAgICAncmVwcic6ICcnJzxTaW1wbGVDb29raWU6IGtlZWJsZXI9J0U9bWMyOyBMPSJMb3ZlcyI7IGZ1ZGdlPVxcbjsnPicnJywKKyAgICAgICAgICAgICAgJ291dHB1dCc6ICdTZXQtQ29va2llOiBrZWVibGVyPSJFPW1jMjsgTD1cXCJMb3Zlc1xcIjsgZnVkZ2U9XFwwMTI7IicsCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAjIENoZWNrIGlsbGVnYWwgY29va2llcyB0aGF0IGhhdmUgYW4gJz0nIGNoYXIgaW4gYW4gdW5xdW90ZWQgdmFsdWUKKyAgICAgICAgICAgIHsgJ2RhdGEnOiAna2VlYmxlcj1FPW1jMicsCisgICAgICAgICAgICAgICdkaWN0JzogeydrZWVibGVyJyA6ICdFPW1jMid9LAorICAgICAgICAgICAgICAncmVwcic6ICI8U2ltcGxlQ29va2llOiBrZWVibGVyPSdFPW1jMic+IiwKKyAgICAgICAgICAgICAgJ291dHB1dCc6ICdTZXQtQ29va2llOiBrZWVibGVyPUU9bWMyJywKKyAgICAgICAgICAgIH0KKyAgICAgICAgXQorCisgICAgICAgIGZvciBjYXNlIGluIGNhc2VzOgorICAgICAgICAgICAgQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQorICAgICAgICAgICAgQy5sb2FkKGNhc2VbJ2RhdGEnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihDKSwgY2FzZVsncmVwciddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLm91dHB1dChzZXA9J1xuJyksIGNhc2VbJ291dHB1dCddKQorICAgICAgICAgICAgZm9yIGssIHYgaW4gc29ydGVkKGNhc2VbJ2RpY3QnXS5pdGVyaXRlbXMoKSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDW2tdLnZhbHVlLCB2KQorCisgICAgZGVmIHRlc3RfbG9hZChzZWxmKToKKyAgICAgICAgQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQorICAgICAgICBDLmxvYWQoJ0N1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0xOyBQYXRoPS9hY21lJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENbJ0N1c3RvbWVyJ10udmFsdWUsICdXSUxFX0VfQ09ZT1RFJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddWyd2ZXJzaW9uJ10sICcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddWydwYXRoJ10sICcvYWNtZScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLm91dHB1dChbJ3BhdGgnXSksCisgICAgICAgICAgICAnU2V0LUNvb2tpZTogQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBQYXRoPS9hY21lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmpzX291dHB1dCgpLCByIiIiCisgICAgICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgICAgPCEtLSBiZWdpbiBoaWRpbmcKKyAgICAgICAgZG9jdW1lbnQuY29va2llID0gIkN1c3RvbWVyPVwiV0lMRV9FX0NPWU9URVwiOyBQYXRoPS9hY21lOyBWZXJzaW9uPTEiOworICAgICAgICAvLyBlbmQgaGlkaW5nIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgICAgIiIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuanNfb3V0cHV0KFsncGF0aCddKSwgciIiIgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgIDwhLS0gYmVnaW4gaGlkaW5nCisgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9ICJDdXN0b21lcj1cIldJTEVfRV9DT1lPVEVcIjsgUGF0aD0vYWNtZSI7CisgICAgICAgIC8vIGVuZCBoaWRpbmcgLS0+CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgICAiIiIpCisKKyAgICAgICAgIyBsb2FkaW5nICdleHBpcmVzJworICAgICAgICBDID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCisgICAgICAgIEMubG9hZCgnQ3VzdG9tZXI9IlciOyBleHBpcmVzPVdlZCwgMDEgSmFuIDIwMTAgMDA6MDA6MDAgR01UJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddWydleHBpcmVzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1dlZCwgMDEgSmFuIDIwMTAgMDA6MDA6MDAgR01UJykKKyAgICAgICAgQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQorICAgICAgICBDLmxvYWQoJ0N1c3RvbWVyPSJXIjsgZXhwaXJlcz1XZWQsIDAxIEphbiA5OCAwMDowMDowMCBHTVQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENbJ0N1c3RvbWVyJ11bJ2V4cGlyZXMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnV2VkLCAwMSBKYW4gOTggMDA6MDA6MDAgR01UJykKKworICAgIGRlZiB0ZXN0X2V4dGVuZGVkX2VuY29kZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA5ODI0OiBzb21lIGJyb3dzZXJzIGRvbid0IGZvbGxvdyB0aGUgc3RhbmRhcmQ7IHdlIG5vdworICAgICAgICAjIGVuY29kZSAsIGFuZCA7IHRvIGtlZXAgdGhlbSBmcm9tIHRyaXBwaW5nIHVwLgorICAgICAgICBDID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCisgICAgICAgIENbJ3ZhbCddID0gInNvbWUsZnVua3k7c3R1ZmYiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5vdXRwdXQoWyd2YWwnXSksCisgICAgICAgICAgICAnU2V0LUNvb2tpZTogdmFsPSJzb21lXFwwNTRmdW5reVxcMDczc3R1ZmYiJykKKworICAgIGRlZiB0ZXN0X3F1b3RlZF9tZXRhKHNlbGYpOgorICAgICAgICAjIFRyeSBjb29raWUgd2l0aCBxdW90ZWQgbWV0YS1kYXRhCisgICAgICAgIEMgPSBDb29raWUuU2ltcGxlQ29va2llKCkKKyAgICAgICAgQy5sb2FkKCdDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENbJ0N1c3RvbWVyJ10udmFsdWUsICdXSUxFX0VfQ09ZT1RFJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddWyd2ZXJzaW9uJ10sICcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddWydwYXRoJ10sICcvYWNtZScpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoQ29va2llVGVzdHMpCisgICAgaWYgQ29va2llLl9fZG9jX18gaXMgbm90IE5vbmU6CisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCcuK0Nvb2tpZSBjbGFzcyBpcyBpbnNlY3VyZTsgZG8gbm90IHVzZSBpdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgcnVuX2RvY3Rlc3QoQ29va2llKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb29raWUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29va2llLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjU2MzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29va2llLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb29raWUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29va2llLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjU2MzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29va2llLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb29raWVsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb29raWVsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwYWQzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weQpAQCAtMCwwICsxLDE3NjIgQEAKKyMgLSotIGNvZGluZzogbGF0aW4tMSAtKi0KKyIiIlRlc3RzIGZvciBjb29raWVsaWIucHkuIiIiCisKK2ltcG9ydCBjb29raWVsaWIKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgdGltZQorCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZQorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK2NsYXNzIERhdGVUaW1lVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdGltZTJpc296KHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgdGltZTJpc296CisKKyAgICAgICAgYmFzZSA9IDEwMTkyMjcwMDAKKyAgICAgICAgZGF5ID0gMjQqMzYwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUyaXNveihiYXNlKSwgIjIwMDItMDQtMTkgMTQ6MzY6NDBaIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lMmlzb3ooYmFzZStkYXkpLCAiMjAwMi0wNC0yMCAxNDozNjo0MFoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUyaXNveihiYXNlKzIqZGF5KSwgIjIwMDItMDQtMjEgMTQ6MzY6NDBaIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lMmlzb3ooYmFzZSszKmRheSksICIyMDAyLTA0LTIyIDE0OjM2OjQwWiIpCisKKyAgICAgICAgYXogPSB0aW1lMmlzb3ooKQorICAgICAgICBieiA9IHRpbWUyaXNveig1MDAwMDApCisgICAgICAgIGZvciB0ZXh0IGluIChheiwgYnopOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLnNlYXJjaChyIl5cZHs0fS1cZFxkLVxkXGQgXGRcZDpcZFxkOlxkXGRaJCIsIHRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgdGltZTJpc296IGZvcm1hdDogJXMgJXMiICUgKGF6LCBieikpCisKKyAgICBkZWYgdGVzdF9odHRwMnRpbWUoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBodHRwMnRpbWUKKworICAgICAgICBkZWYgcGFyc2VfZGF0ZSh0ZXh0KToKKyAgICAgICAgICAgIHJldHVybiB0aW1lLmdtdGltZShodHRwMnRpbWUodGV4dCkpWzo2XQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VfZGF0ZSgiMDEgSmFuIDIwMDEiKSwgKDIwMDEsIDEsIDEsIDAsIDAsIDAuMCkpCisKKyAgICAgICAgIyB0aGlzIHRlc3Qgd2lsbCBicmVhayBhcm91bmQgeWVhciAyMDcwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VfZGF0ZSgiMDMtRmViLTIwIiksICgyMDIwLCAyLCAzLCAwLCAwLCAwLjApKQorCisgICAgICAgICMgdGhpcyB0ZXN0IHdpbGwgYnJlYWsgYXJvdW5kIHllYXIgMjA0OAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlX2RhdGUoIjAzLUZlYi05OCIpLCAoMTk5OCwgMiwgMywgMCwgMCwgMC4wKSkKKworICAgIGRlZiB0ZXN0X2h0dHAydGltZV9mb3JtYXRzKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgaHR0cDJ0aW1lLCB0aW1lMmlzb3oKKworICAgICAgICAjIHRlc3QgaHR0cDJ0aW1lIGZvciBzdXBwb3J0ZWQgZGF0ZXMuICBUZXN0IGNhc2VzIHdpdGggMiBkaWdpdCB5ZWFyCisgICAgICAgICMgd2lsbCBwcm9iYWJseSBicmVhayBpbiB5ZWFyIDIwNDQuCisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgJ1RodSwgMDMgRmViIDE5OTQgMDA6MDA6MDAgR01UJywgICMgcHJvcG9zZWQgbmV3IEhUVFAgZm9ybWF0CisgICAgICAgICAnVGh1cnNkYXksIDAzLUZlYi05NCAwMDowMDowMCBHTVQnLCAgIyBvbGQgcmZjODUwIEhUVFAgZm9ybWF0CisgICAgICAgICAnVGh1cnNkYXksIDAzLUZlYi0xOTk0IDAwOjAwOjAwIEdNVCcsICAjIGJyb2tlbiByZmM4NTAgSFRUUCBmb3JtYXQKKworICAgICAgICAgJzAzIEZlYiAxOTk0IDAwOjAwOjAwIEdNVCcsICAjIEhUVFAgZm9ybWF0IChubyB3ZWVrZGF5KQorICAgICAgICAgJzAzLUZlYi05NCAwMDowMDowMCBHTVQnLCAgIyBvbGQgcmZjODUwIChubyB3ZWVrZGF5KQorICAgICAgICAgJzAzLUZlYi0xOTk0IDAwOjAwOjAwIEdNVCcsICAjIGJyb2tlbiByZmM4NTAgKG5vIHdlZWtkYXkpCisgICAgICAgICAnMDMtRmViLTE5OTQgMDA6MDAgR01UJywgICMgYnJva2VuIHJmYzg1MCAobm8gd2Vla2RheSwgbm8gc2Vjb25kcykKKyAgICAgICAgICcwMy1GZWItMTk5NCAwMDowMCcsICAjIGJyb2tlbiByZmM4NTAgKG5vIHdlZWtkYXksIG5vIHNlY29uZHMsIG5vIHR6KQorCisgICAgICAgICAnMDMtRmViLTk0JywgICMgb2xkIHJmYzg1MCBIVFRQIGZvcm1hdCAobm8gd2Vla2RheSwgbm8gdGltZSkKKyAgICAgICAgICcwMy1GZWItMTk5NCcsICAjIGJyb2tlbiByZmM4NTAgSFRUUCBmb3JtYXQgKG5vIHdlZWtkYXksIG5vIHRpbWUpCisgICAgICAgICAnMDMgRmViIDE5OTQnLCAgIyBwcm9wb3NlZCBuZXcgSFRUUCBmb3JtYXQgKG5vIHdlZWtkYXksIG5vIHRpbWUpCisKKyAgICAgICAgICMgQSBmZXcgdGVzdHMgd2l0aCBleHRyYSBzcGFjZSBhdCB2YXJpb3VzIHBsYWNlcworICAgICAgICAgJyAgMDMgICBGZWIgICAxOTk0ICAwOjAwICAnLAorICAgICAgICAgJyAgMDMtRmViLTE5OTQgICcsCisgICAgICAgIF0KKworICAgICAgICB0ZXN0X3QgPSA3NjAyMzM2MDAgICMgYXNzdW1lIGJyb2tlbiBQT1NJWCBjb3VudGluZyBvZiBzZWNvbmRzCisgICAgICAgIHJlc3VsdCA9IHRpbWUyaXNveih0ZXN0X3QpCisgICAgICAgIGV4cGVjdGVkID0gIjE5OTQtMDItMDMgMDA6MDA6MDBaIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzICA9PiAgJyVzJyAoJXMpIiAlICh0ZXN0X3QsIHJlc3VsdCwgZXhwZWN0ZWQpKQorCisgICAgICAgIGZvciBzIGluIHRlc3RzOgorICAgICAgICAgICAgdCA9IGh0dHAydGltZShzKQorICAgICAgICAgICAgdDIgPSBodHRwMnRpbWUocy5sb3dlcigpKQorICAgICAgICAgICAgdDMgPSBodHRwMnRpbWUocy51cHBlcigpKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodCA9PSB0MiA9PSB0MyA9PSB0ZXN0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgID0+ICAlcywgJXMsICVzICglcykiICUgKHMsIHQsIHQyLCB0MywgdGVzdF90KSkKKworICAgIGRlZiB0ZXN0X2h0dHAydGltZV9nYXJiYWdlKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgaHR0cDJ0aW1lCisKKyAgICAgICAgZm9yIHRlc3QgaW4gWworICAgICAgICAgICAgJycsCisgICAgICAgICAgICAnR2FyYmFnZScsCisgICAgICAgICAgICAnTWFuZGFnIDE2LiBTZXB0ZW1iZXIgMTk5NicsCisgICAgICAgICAgICAnMDEtMDAtMTk4MCcsCisgICAgICAgICAgICAnMDEtMTMtMTk4MCcsCisgICAgICAgICAgICAnMDAtMDEtMTk4MCcsCisgICAgICAgICAgICAnMzItMDEtMTk4MCcsCisgICAgICAgICAgICAnMDEtMDEtMTk4MCAyNTowMDowMCcsCisgICAgICAgICAgICAnMDEtMDEtMTk4MCAwMDo2MTowMCcsCisgICAgICAgICAgICAnMDEtMDEtMTk4MCAwMDowMDo2MicsCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGh0dHAydGltZSh0ZXN0KSBpcyBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwMnRpbWUoJXMpIGlzIG5vdCBOb25lXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAydGltZSh0ZXN0KSAlcyIgJSAodGVzdCwgaHR0cDJ0aW1lKHRlc3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgICkKKworCitjbGFzcyBIZWFkZXJUZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9wYXJzZV9uc19oZWFkZXJzX2V4cGlyZXMoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBwYXJzZV9uc19oZWFkZXJzCisKKyAgICAgICAgIyBxdW90ZXMgc2hvdWxkIGJlIHN0cmlwcGVkCisgICAgICAgIGV4cGVjdGVkID0gW1soJ2ZvbycsICdiYXInKSwgKCdleHBpcmVzJywgMjIwOTA2OTQxMkwpLCAoJ3ZlcnNpb24nLCAnMCcpXV0KKyAgICAgICAgZm9yIGhkciBpbiBbCisgICAgICAgICAgICAnZm9vPWJhcjsgZXhwaXJlcz0wMSBKYW4gMjA0MCAyMjoyMzozMiBHTVQnLAorICAgICAgICAgICAgJ2Zvbz1iYXI7IGV4cGlyZXM9IjAxIEphbiAyMDQwIDIyOjIzOjMyIEdNVCInLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VfbnNfaGVhZGVycyhbaGRyXSksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfcGFyc2VfbnNfaGVhZGVyc192ZXJzaW9uKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcGFyc2VfbnNfaGVhZGVycworCisgICAgICAgICMgcXVvdGVzIHNob3VsZCBiZSBzdHJpcHBlZAorICAgICAgICBleHBlY3RlZCA9IFtbKCdmb28nLCAnYmFyJyksICgndmVyc2lvbicsICcxJyldXQorICAgICAgICBmb3IgaGRyIGluIFsKKyAgICAgICAgICAgICdmb289YmFyOyB2ZXJzaW9uPSIxIicsCisgICAgICAgICAgICAnZm9vPWJhcjsgVmVyc2lvbj0iMSInLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VfbnNfaGVhZGVycyhbaGRyXSksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfcGFyc2VfbnNfaGVhZGVyc19zcGVjaWFsX25hbWVzKHNlbGYpOgorICAgICAgICAjIG5hbWVzIHN1Y2ggYXMgJ2V4cGlyZXMnIGFyZSBub3Qgc3BlY2lhbCBpbiBmaXJzdCBuYW1lPXZhbHVlIHBhaXIKKyAgICAgICAgIyBvZiBTZXQtQ29va2llOiBoZWFkZXIKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHBhcnNlX25zX2hlYWRlcnMKKworICAgICAgICAjIENvb2tpZSB3aXRoIG5hbWUgJ2V4cGlyZXMnCisgICAgICAgIGhkciA9ICdleHBpcmVzPTAxIEphbiAyMDQwIDIyOjIzOjMyIEdNVCcKKyAgICAgICAgZXhwZWN0ZWQgPSBbWygiZXhwaXJlcyIsICIwMSBKYW4gMjA0MCAyMjoyMzozMiBHTVQiKSwgKCJ2ZXJzaW9uIiwgIjAiKV1dCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VfbnNfaGVhZGVycyhbaGRyXSksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3Rfam9pbl9oZWFkZXJfd29yZHMoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBqb2luX2hlYWRlcl93b3JkcworCisgICAgICAgIGpvaW5lZCA9IGpvaW5faGVhZGVyX3dvcmRzKFtbKCJmb28iLCBOb25lKSwgKCJiYXIiLCAiYmF6IildXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqb2luZWQsICJmb287IGJhcj1iYXoiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoam9pbl9oZWFkZXJfd29yZHMoW1tdXSksICIiKQorCisgICAgZGVmIHRlc3Rfc3BsaXRfaGVhZGVyX3dvcmRzKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgc3BsaXRfaGVhZGVyX3dvcmRzCisKKyAgICAgICAgdGVzdHMgPSBbCisgICAgICAgICAgICAoImZvbyIsIFtbKCJmb28iLCBOb25lKV1dKSwKKyAgICAgICAgICAgICgiZm9vPWJhciIsIFtbKCJmb28iLCAiYmFyIildXSksCisgICAgICAgICAgICAoIiAgIGZvbyAgICIsIFtbKCJmb28iLCBOb25lKV1dKSwKKyAgICAgICAgICAgICgiICAgZm9vPSAgICIsIFtbKCJmb28iLCAiIildXSksCisgICAgICAgICAgICAoIiAgIGZvbz0iLCBbWygiZm9vIiwgIiIpXV0pLAorICAgICAgICAgICAgKCIgICBmb289ICAgOyAiLCBbWygiZm9vIiwgIiIpXV0pLAorICAgICAgICAgICAgKCIgICBmb289ICAgOyBiYXI9IGJheiAiLCBbWygiZm9vIiwgIiIpLCAoImJhciIsICJiYXoiKV1dKSwKKyAgICAgICAgICAgICgiZm9vPWJhciBiYXI9YmF6IiwgW1soImZvbyIsICJiYXIiKSwgKCJiYXIiLCAiYmF6IildXSksCisgICAgICAgICAgICAjIGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBpZiB0aGlzIG5leHQgZmFpbHMsIGJ1dCBpdCB3b3JrcyBBVE0KKyAgICAgICAgICAgICgiZm9vPSBiYXI9YmF6IiwgW1soImZvbyIsICJiYXI9YmF6IildXSksCisgICAgICAgICAgICAoImZvbz1iYXI7YmFyPWJheiIsIFtbKCJmb28iLCAiYmFyIiksICgiYmFyIiwgImJheiIpXV0pLAorICAgICAgICAgICAgKCdmb28gYmFyIGJheicsIFtbKCJmb28iLCBOb25lKSwgKCJiYXIiLCBOb25lKSwgKCJiYXoiLCBOb25lKV1dKSwKKyAgICAgICAgICAgICgiYSwgYiwgYyIsIFtbKCJhIiwgTm9uZSldLCBbKCJiIiwgTm9uZSldLCBbKCJjIiwgTm9uZSldXSksCisgICAgICAgICAgICAocidmb287IGJhcj1iYXosIHNwYW09LCBmb289IlwsXDtcIiIsIGJhcj0gJywKKyAgICAgICAgICAgICBbWygiZm9vIiwgTm9uZSksICgiYmFyIiwgImJheiIpXSwKKyAgICAgICAgICAgICAgWygic3BhbSIsICIiKV0sIFsoImZvbyIsICcsOyInKV0sIFsoImJhciIsICIiKV1dKSwKKyAgICAgICAgICAgIF0KKworICAgICAgICBmb3IgYXJnLCBleHBlY3QgaW4gdGVzdHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3BsaXRfaGVhZGVyX3dvcmRzKFthcmddKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2ssIFN0cmluZ0lPCisgICAgICAgICAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKE5vbmUsIGYpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIihlcnJvciAtLSB0cmFjZWJhY2sgZm9sbG93cylcblxuJXMiICUgZi5nZXR2YWx1ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgIGV4cGVjdCwgIiIiCitXaGVuIHBhcnNpbmc6ICclcycKK0V4cGVjdGVkOiAgICAgJyVzJworR290OiAgICAgICAgICAnJXMnCisiIiIgJSAoYXJnLCBleHBlY3QsIHJlc3VsdCkpCisKKyAgICBkZWYgdGVzdF9yb3VuZHRyaXAoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBzcGxpdF9oZWFkZXJfd29yZHMsIGpvaW5faGVhZGVyX3dvcmRzCisKKyAgICAgICAgdGVzdHMgPSBbCisgICAgICAgICAgICAoImZvbyIsICJmb28iKSwKKyAgICAgICAgICAgICgiZm9vPWJhciIsICJmb289YmFyIiksCisgICAgICAgICAgICAoIiAgIGZvbyAgICIsICJmb28iKSwKKyAgICAgICAgICAgICgiZm9vPSIsICdmb289IiInKSwKKyAgICAgICAgICAgICgiZm9vPWJhciBiYXI9YmF6IiwgImZvbz1iYXI7IGJhcj1iYXoiKSwKKyAgICAgICAgICAgICgiZm9vPWJhcjtiYXI9YmF6IiwgImZvbz1iYXI7IGJhcj1iYXoiKSwKKyAgICAgICAgICAgICgnZm9vIGJhciBiYXonLCAiZm9vOyBiYXI7IGJheiIpLAorICAgICAgICAgICAgKHInZm9vPSJcIiIgYmFyPSJcXCInLCByJ2Zvbz0iXCIiOyBiYXI9IlxcIicpLAorICAgICAgICAgICAgKCdmb28sLCxiYXInLCAnZm9vLCBiYXInKSwKKyAgICAgICAgICAgICgnZm9vPWJhcixiYXI9YmF6JywgJ2Zvbz1iYXIsIGJhcj1iYXonKSwKKworICAgICAgICAgICAgKCd0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMScsCisgICAgICAgICAgICAgJ3RleHQvaHRtbDsgY2hhcnNldD0iaXNvLTg4NTktMSInKSwKKworICAgICAgICAgICAgKCdmb289ImJhciI7IHBvcnQ9IjgwLDgxIjsgZGlzY2FyZCwgYmFyPWJheicsCisgICAgICAgICAgICAgJ2Zvbz1iYXI7IHBvcnQ9IjgwLDgxIjsgZGlzY2FyZCwgYmFyPWJheicpLAorCisgICAgICAgICAgICAocidCYXNpYyByZWFsbT0iXCJmb29cXFxcYmFyXCIiJywKKyAgICAgICAgICAgICByJ0Jhc2ljOyByZWFsbT0iXCJmb29cXFxcYmFyXCIiJykKKyAgICAgICAgICAgIF0KKworICAgICAgICBmb3IgYXJnLCBleHBlY3QgaW4gdGVzdHM6CisgICAgICAgICAgICBpbnB1dCA9IHNwbGl0X2hlYWRlcl93b3JkcyhbYXJnXSkKKyAgICAgICAgICAgIHJlcyA9IGpvaW5faGVhZGVyX3dvcmRzKGlucHV0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIGV4cGVjdCwgIiIiCitXaGVuIHBhcnNpbmc6ICclcycKK0V4cGVjdGVkOiAgICAgJyVzJworR290OiAgICAgICAgICAnJXMnCitJbnB1dCB3YXM6ICAgICclcycKKyIiIiAlIChhcmcsIGV4cGVjdCwgcmVzLCBpbnB1dCkpCisKKworY2xhc3MgRmFrZVJlc3BvbnNlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZWFkZXJzPVtdLCB1cmw9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBoZWFkZXJzOiBsaXN0IG9mIFJGQzgyMi1zdHlsZSAnS2V5OiB2YWx1ZScgc3RyaW5ncworICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IG1pbWV0b29scywgU3RyaW5nSU8KKyAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCJcbiIuam9pbihoZWFkZXJzKSkKKyAgICAgICAgc2VsZi5faGVhZGVycyA9IG1pbWV0b29scy5NZXNzYWdlKGYpCisgICAgICAgIHNlbGYuX3VybCA9IHVybAorICAgIGRlZiBpbmZvKHNlbGYpOiByZXR1cm4gc2VsZi5faGVhZGVycworCitkZWYgaW50ZXJhY3RfMjk2NShjb29raWVqYXIsIHVybCwgKnNldF9jb29raWVfaGRycyk6CisgICAgcmV0dXJuIF9pbnRlcmFjdChjb29raWVqYXIsIHVybCwgc2V0X2Nvb2tpZV9oZHJzLCAiU2V0LUNvb2tpZTIiKQorCitkZWYgaW50ZXJhY3RfbmV0c2NhcGUoY29va2llamFyLCB1cmwsICpzZXRfY29va2llX2hkcnMpOgorICAgIHJldHVybiBfaW50ZXJhY3QoY29va2llamFyLCB1cmwsIHNldF9jb29raWVfaGRycywgIlNldC1Db29raWUiKQorCitkZWYgX2ludGVyYWN0KGNvb2tpZWphciwgdXJsLCBzZXRfY29va2llX2hkcnMsIGhkcl9uYW1lKToKKyAgICAiIiJQZXJmb3JtIGEgc2luZ2xlIHJlcXVlc3QgLyByZXNwb25zZSBjeWNsZSwgcmV0dXJuaW5nIENvb2tpZTogaGVhZGVyLiIiIgorICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorICAgIHJlcSA9IFJlcXVlc3QodXJsKQorICAgIGNvb2tpZWphci5hZGRfY29va2llX2hlYWRlcihyZXEpCisgICAgY29va2llX2hkciA9IHJlcS5nZXRfaGVhZGVyKCJDb29raWUiLCAiIikKKyAgICBoZWFkZXJzID0gW10KKyAgICBmb3IgaGRyIGluIHNldF9jb29raWVfaGRyczoKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoIiVzOiAlcyIgJSAoaGRyX25hbWUsIGhkcikpCisgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsIHVybCkKKyAgICBjb29raWVqYXIuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorICAgIHJldHVybiBjb29raWVfaGRyCisKKworY2xhc3MgRmlsZUNvb2tpZUphclRlc3RzKFRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9sd3BfdmFsdWVsZXNzX2Nvb2tpZShzZWxmKToKKyAgICAgICAgIyBjb29raWVzIHdpdGggbm8gdmFsdWUgc2hvdWxkIGJlIHNhdmVkIGFuZCBsb2FkZWQgY29uc2lzdGVudGx5CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBMV1BDb29raWVKYXIKKyAgICAgICAgZmlsZW5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIGMgPSBMV1BDb29raWVKYXIoKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnYm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJib28iXS52YWx1ZSwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYy5zYXZlKGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQorICAgICAgICAgICAgYyA9IExXUENvb2tpZUphcigpCisgICAgICAgICAgICBjLmxvYWQoZmlsZW5hbWUsIGlnbm9yZV9kaXNjYXJkPVRydWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6IG9zLnVubGluayhmaWxlbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiYm9vIl0udmFsdWUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9iYWRfbWFnaWMoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBMV1BDb29raWVKYXIsIE1vemlsbGFDb29raWVKYXIsIExvYWRFcnJvcgorICAgICAgICAjIElPRXJyb3JzIChlZy4gZmlsZSBkb2Vzbid0IGV4aXN0KSBhcmUgYWxsb3dlZCB0byBwcm9wYWdhdGUKKyAgICAgICAgZmlsZW5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIGZvciBjb29raWVqYXJfY2xhc3MgaW4gTFdQQ29va2llSmFyLCBNb3ppbGxhQ29va2llSmFyOgorICAgICAgICAgICAgYyA9IGNvb2tpZWphcl9jbGFzcygpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYy5sb2FkKGZpbGVuYW1lPSJmb3IgdGhpcyB0ZXN0IHRvIHdvcmssIGEgZmlsZSB3aXRoIHRoaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZW5hbWUgc2hvdWxkIG5vdCBleGlzdCIpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgZXhjOgorICAgICAgICAgICAgICAgICMgZXhhY3RseSBJT0Vycm9yLCBub3QgTG9hZEVycm9yCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGMuX19jbGFzc19fLCBJT0Vycm9yKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIElPRXJyb3IgZm9yIGludmFsaWQgZmlsZW5hbWUiKQorICAgICAgICAjIEludmFsaWQgY29udGVudHMgb2YgY29va2llcyBmaWxlIChlZy4gYmFkIG1hZ2ljIHN0cmluZykKKyAgICAgICAgIyBjYXVzZXMgYSBMb2FkRXJyb3IuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAidyIpCisgICAgICAgICAgICBmLndyaXRlKCJvb3BzXG4iKQorICAgICAgICAgICAgZm9yIGNvb2tpZWphcl9jbGFzcyBpbiBMV1BDb29raWVKYXIsIE1vemlsbGFDb29raWVKYXI6CisgICAgICAgICAgICAgICAgYyA9IGNvb2tpZWphcl9jbGFzcygpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTG9hZEVycm9yLCBjLmxvYWQsIGZpbGVuYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OiBvcy51bmxpbmsoZmlsZW5hbWUpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjogcGFzcworCitjbGFzcyBDb29raWVUZXN0cyhUZXN0Q2FzZSk6CisgICAgIyBYWFgKKyAgICAjIEdldCByaWQgb2Ygc3RyaW5nIGNvbXBhcmlzb25zIHdoZXJlIG5vdCBhY3R1YWxseSB0ZXN0aW5nIHN0ciAvIHJlcHIuCisgICAgIyAuY2xlYXIoKSBldGMuCisgICAgIyBJUCBhZGRyZXNzZXMgbGlrZSA1MCAoc2luZ2xlIG51bWJlciwgbm8gZG90KSBhbmQgZG9tYWluLW1hdGNoaW5nCisgICAgIyAgZnVuY3Rpb25zIChhbmQgaXNfSEROKT8gIFNlZSBkcmFmdCBSRkMgMjk2NSBlcnJhdGEuCisgICAgIyBTdHJpY3RuZXNzIHN3aXRjaGVzCisgICAgIyBpc190aGlyZF9wYXJ0eSgpCisgICAgIyB1bnZlcmlmaWFiaWxpdHkgLyB0aGlyZC1wYXJ0eSBibG9ja2luZworICAgICMgTmV0c2NhcGUgY29va2llcyB3b3JrIHRoZSBzYW1lIGFzIFJGQyAyOTY1IHdpdGggcmVnYXJkIHRvIHBvcnQuCisgICAgIyBTZXQtQ29va2llIHdpdGggbmVnYXRpdmUgbWF4IGFnZS4KKyAgICAjIElmIHR1cm4gUkZDIDI5NjUgaGFuZGxpbmcgb2ZmLCBTZXQtQ29va2llMiBjb29raWVzIHNob3VsZCBub3QgY2xvYmJlcgorICAgICMgIFNldC1Db29raWUgY29va2llcy4KKyAgICAjIENvb2tpZTIgc2hvdWxkIGJlIHNlbnQgaWYgKmFueSogY29va2llcyBhcmUgbm90IFYxIChpZS4gVjAgT1IgVjIgZXRjLikuCisgICAgIyBDb29raWVzIChWMSBhbmQgVjApIHdpdGggbm8gZXhwaXJ5IGRhdGUgc2hvdWxkIGJlIHNldCB0byBiZSBkaXNjYXJkZWQuCisgICAgIyBSRkMgMjk2NSBRdW90aW5nOgorICAgICMgIFNob3VsZCBhY2NlcHQgdW5xdW90ZWQgY29va2llLWF0dHJpYnV0ZSB2YWx1ZXM/ICBjaGVjayBlcnJhdGEgZHJhZnQuCisgICAgIyAgIFdoaWNoIGFyZSByZXF1aXJlZCBvbiB0aGUgd2F5IGluIGFuZCBvdXQ/CisgICAgIyAgU2hvdWxkIGFsd2F5cyByZXR1cm4gcXVvdGVkIGNvb2tpZS1hdHRyaWJ1dGUgdmFsdWVzPworICAgICMgUHJvcGVyIHRlc3Rpbmcgb2Ygd2hlbiBSRkMgMjk2NSBjbG9iYmVycyBOZXRzY2FwZSAod2FpdGluZyBmb3IgZXJyYXRhKS4KKyAgICAjIFBhdGgtbWF0Y2ggb24gcmV0dXJuIChzYW1lIGZvciBWMCBhbmQgVjEpLgorICAgICMgUkZDIDI5NjUgYWNjZXB0YW5jZSBhbmQgcmV0dXJuaW5nIHJ1bGVzCisgICAgIyAgU2V0LUNvb2tpZTIgd2l0aG91dCB2ZXJzaW9uIGF0dHJpYnV0ZSBpcyByZWplY3RlZC4KKworICAgICMgTmV0c2NhcGUgcGVjdWxpYXJpdGllcyBsaXN0IGZyb20gUm9uYWxkIFRzY2hhbGFyLgorICAgICMgVGhlIGZpcnN0IHR3byBzdGlsbCBuZWVkIHRlc3RzLCB0aGUgcmVzdCBhcmUgY292ZXJlZC4KKyMjIC0gUXVvdGluZzogb25seSBxdW90ZXMgYXJvdW5kIHRoZSBleHBpcmVzIHZhbHVlIGFyZSByZWNvZ25pemVkIGFzIHN1Y2gKKyMjICAgKGFuZCB5ZXMsIHNvbWUgZm9sa3MgcXVvdGUgdGhlIGV4cGlyZXMgdmFsdWUpOyBxdW90ZXMgYXJvdW5kIGFueSBvdGhlcgorIyMgICB2YWx1ZSBhcmUgdHJlYXRlZCBhcyBwYXJ0IG9mIHRoZSB2YWx1ZS4KKyMjIC0gV2hpdGUgc3BhY2U6IHdoaXRlIHNwYWNlIGFyb3VuZCBuYW1lcyBhbmQgdmFsdWVzIGlzIGlnbm9yZWQKKyMjIC0gRGVmYXVsdCBwYXRoOiBpZiBubyBwYXRoIHBhcmFtZXRlciBpcyBnaXZlbiwgdGhlIHBhdGggZGVmYXVsdHMgdG8gdGhlCisjIyAgIHBhdGggaW4gdGhlIHJlcXVlc3QtdXJpIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgdGhlIGxhc3QgJy8nLiBOb3RlCisjIyAgIHRoYXQgdGhpcyBpcyBlbnRpcmVseSBkaWZmZXJlbnQgZnJvbSB3aGF0IHRoZSBzcGVjIHNheXMuCisjIyAtIENvbW1hcyBhbmQgb3RoZXIgZGVsaW1pdGVyczogTmV0c2NhcGUganVzdCBwYXJzZXMgdW50aWwgdGhlIG5leHQgJzsnLgorIyMgICBUaGlzIG1lYW5zIGl0IHdpbGwgYWxsb3cgY29tbWFzIGV0YyBpbnNpZGUgdmFsdWVzIChhbmQgeWVzLCBib3RoCisjIyAgIGNvbW1hcyBhbmQgZXF1YWxzIGFyZSBjb21tb25seSBhcHBlYXIgaW4gdGhlIGNvb2tpZSB2YWx1ZSkuIFRoaXMgYWxzbworIyMgICBtZWFucyB0aGF0IGlmIHlvdSBmb2xkIG11bHRpcGxlIFNldC1Db29raWUgaGVhZGVyIGZpZWxkcyBpbnRvIG9uZSwKKyMjICAgY29tbWEtc2VwYXJhdGVkIGxpc3QsIGl0J2xsIGJlIGEgaGVhZGFjaGUgdG8gcGFyc2UgKGF0IGxlYXN0IG15IGhlYWQKKyMjICAgc3RhcnRzIGh1cnRpbmcgZXZlcnl0aW1lIEkgdGhpbmsgb2YgdGhhdCBjb2RlKS4KKyMjIC0gRXhwaXJlczogWW91J2xsIGdldCBhbGwgc29ydHMgb2YgZGF0ZSBmb3JtYXRzIGluIHRoZSBleHBpcmVzLAorIyMgICBpbmNsdWRpbmcgZW10cHkgZXhwaXJlcyBhdHRyaWJ1dGVzICgiZXhwaXJlcz0iKS4gQmUgYXMgZmxleGlibGUgYXMgeW91CisjIyAgIGNhbiwgYW5kIGNlcnRhaW5seSBkb24ndCBleHBlY3QgdGhlIHdlZWtkYXkgdG8gYmUgdGhlcmU7IGlmIHlvdSBjYW4ndAorIyMgICBwYXJzZSBpdCwganVzdCBpZ25vcmUgaXQgYW5kIHByZXRlbmQgaXQncyBhIHNlc3Npb24gY29va2llLgorIyMgLSBEb21haW4tbWF0Y2hpbmc6IE5ldHNjYXBlIHVzZXMgdGhlIDItZG90IHJ1bGUgZm9yIF9hbGxfIGRvbWFpbnMsIG5vdAorIyMgICBqdXN0IHRoZSA3IHNwZWNpYWwgVExEJ3MgbGlzdGVkIGluIHRoZWlyIHNwZWMuIEFuZCBmb2xrcyByZWx5IG9uCisjIyAgIHRoYXQuLi4KKworICAgIGRlZiB0ZXN0X2RvbWFpbl9yZXR1cm5fb2soc2VsZik6CisgICAgICAgICMgdGVzdCBvcHRpbWl6YXRpb246IC5kb21haW5fcmV0dXJuX29rKCkgc2hvdWxkIGZpbHRlciBvdXQgbW9zdAorICAgICAgICAjIGRvbWFpbnMgaW4gdGhlIENvb2tpZUphciBiZWZvcmUgd2UgdHJ5IHRvIGFjY2VzcyB0aGVtIChiZWNhdXNlIHRoYXQKKyAgICAgICAgIyBtYXkgcmVxdWlyZSBkaXNrIGFjY2VzcyAtLSBpbiBwYXJ0aWN1bGFyLCB3aXRoIE1TSUVDb29raWVKYXIpCisgICAgICAgICMgVGhpcyBpcyBvbmx5IGEgcm91Z2ggY2hlY2sgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHNvIGl0J3Mgbm90IHRvbworICAgICAgICAjIGNyaXRpY2FsIGFzIGxvbmcgYXMgaXQncyBzdWZmaWNpZW50bHkgbGliZXJhbC4KKyAgICAgICAgaW1wb3J0IGNvb2tpZWxpYiwgdXJsbGliMgorICAgICAgICBwb2wgPSBjb29raWVsaWIuRGVmYXVsdENvb2tpZVBvbGljeSgpCisgICAgICAgIGZvciB1cmwsIGRvbWFpbiwgb2sgaW4gWworICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgImJsYWguY29tIiwgRmFsc2UpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgInJodWJhcmIuYmxhaC5jb20iLCBGYWxzZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAicmh1YmFyYi5mb28uYmFyLmNvbSIsIEZhbHNlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICIuZm9vLmJhci5jb20iLCBUcnVlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICJmb28uYmFyLmNvbSIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgIi5iYXIuY29tIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAiY29tIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uY29tLyIsICJyaHViYXJiLmZvby5jb20iLCBGYWxzZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uY29tLyIsICIuZm9vLmNvbSIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmNvbS8iLCAiZm9vLmNvbSIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmNvbS8iLCAiY29tIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28vIiwgInJodWJhcmIuZm9vIiwgRmFsc2UpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLyIsICIuZm9vIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28vIiwgImZvbyIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLyIsICJmb28ubG9jYWwiLCBUcnVlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby8iLCAiLmxvY2FsIiwgVHJ1ZSksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgcmVxdWVzdCA9IHVybGxpYjIuUmVxdWVzdCh1cmwpCisgICAgICAgICAgICByID0gcG9sLmRvbWFpbl9yZXR1cm5fb2soZG9tYWluLCByZXF1ZXN0KQorICAgICAgICAgICAgaWYgb2s6IHNlbGYuYXNzZXJ0VHJ1ZShyKQorICAgICAgICAgICAgZWxzZTogc2VsZi5hc3NlcnRUcnVlKG5vdCByKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ192YWx1ZShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IE1vemlsbGFDb29raWVKYXIsIGx3cF9jb29raWVfc3RyCisKKyAgICAgICAgIyBtaXNzaW5nID0gc2lnbiBpbiBDb29raWU6IGhlYWRlciBpcyByZWdhcmRlZCBieSBNb3ppbGxhIGFzIGEgbWlzc2luZworICAgICAgICAjIG5hbWUsIGFuZCBieSBjb29raWVsaWIgYXMgYSBtaXNzaW5nIHZhbHVlCisgICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBjID0gTW96aWxsYUNvb2tpZUphcihmaWxlbmFtZSkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2VnZ3MnKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnInNwYW0iOyBwYXRoPS9mb28vJykKKyAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZWdncyJdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb29raWUudmFsdWUgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb29raWUubmFtZSwgImVnZ3MiKQorICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsnL2Zvby8nXVsnInNwYW0iJ10KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvb2tpZS52YWx1ZSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvb2tpZS5uYW1lLCAnInNwYW0iJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsd3BfY29va2llX3N0cihjb29raWUpLCAoCisgICAgICAgICAgICByJyJzcGFtIjsgcGF0aD0iL2Zvby8iOyBkb21haW49Ind3dy5hY21lLmNvbSI7ICcKKyAgICAgICAgICAgICdwYXRoX3NwZWM7IGRpc2NhcmQ7IHZlcnNpb249MCcpKQorICAgICAgICBvbGRfc3RyID0gcmVwcihjKQorICAgICAgICBjLnNhdmUoaWdub3JlX2V4cGlyZXM9VHJ1ZSwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYyA9IE1vemlsbGFDb29raWVKYXIoZmlsZW5hbWUpCisgICAgICAgICAgICBjLnJldmVydChpZ25vcmVfZXhwaXJlcz1UcnVlLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKGMuZmlsZW5hbWUpCisgICAgICAgICMgY29va2llcyB1bmNoYW5nZWQgYXBhcnQgZnJvbSBsb3N0IGluZm8gcmUuIHdoZXRoZXIgcGF0aCB3YXMgc3BlY2lmaWVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICByZXByKGMpLAorICAgICAgICAgICAgcmUuc3ViKCJwYXRoX3NwZWNpZmllZD0lcyIgJSBUcnVlLCAicGF0aF9zcGVjaWZpZWQ9JXMiICUgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgb2xkX3N0cikKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJyJzcGFtIjsgZWdncycpCisKKyAgICBkZWYgdGVzdF9yZmMyMTA5X2hhbmRsaW5nKHNlbGYpOgorICAgICAgICAjIFJGQyAyMTA5IGNvb2tpZXMgYXJlIGhhbmRsZWQgYXMgUkZDIDI5NjUgb3IgTmV0c2NhcGUgY29va2llcywKKyAgICAgICAgIyBkZXBlbmRlbnQgb24gcG9saWN5IHNldHRpbmdzCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBmb3IgcmZjMjEwOV9hc19uZXRzY2FwZSwgcmZjMjk2NSwgdmVyc2lvbiBpbiBbCisgICAgICAgICAgICAjIGRlZmF1bHQgYWNjb3JkaW5nIHRvIHJmYzI5NjUgaWYgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkCisgICAgICAgICAgICAoTm9uZSwgRmFsc2UsIDApLAorICAgICAgICAgICAgKE5vbmUsIFRydWUsIDEpLAorICAgICAgICAgICAgIyBleHBsaWNpdCByZmMyMTA5X2FzX25ldHNjYXBlCisgICAgICAgICAgICAoRmFsc2UsIEZhbHNlLCBOb25lKSwgICMgdmVyc2lvbiBOb25lIGhlcmUgbWVhbnMgbm8gY29va2llIHN0b3JlZAorICAgICAgICAgICAgKEZhbHNlLCBUcnVlLCAxKSwKKyAgICAgICAgICAgIChUcnVlLCBGYWxzZSwgMCksCisgICAgICAgICAgICAoVHJ1ZSwgVHJ1ZSwgMCksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgcG9saWN5ID0gRGVmYXVsdENvb2tpZVBvbGljeSgKKyAgICAgICAgICAgICAgICByZmMyMTA5X2FzX25ldHNjYXBlPXJmYzIxMDlfYXNfbmV0c2NhcGUsCisgICAgICAgICAgICAgICAgcmZjMjk2NT1yZmMyOTY1KQorICAgICAgICAgICAgYyA9IENvb2tpZUphcihwb2xpY3kpCisgICAgICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iLCAibmk9bmk7IFZlcnNpb249MSIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmV4YW1wbGUuY29tIl1bIi8iXVsibmkiXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2ZXJzaW9uIGlzIE5vbmUpICAjIGRpZG4ndCBleHBlY3QgYSBzdG9yZWQgY29va2llCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29va2llLnZlcnNpb24sIHZlcnNpb24pCisgICAgICAgICAgICAgICAgIyAyOTY1IGNvb2tpZXMgYXJlIHVuYWZmZWN0ZWQKKyAgICAgICAgICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vPWJhcjsgVmVyc2lvbj0xIikKKyAgICAgICAgICAgICAgICBpZiByZmMyOTY1OgorICAgICAgICAgICAgICAgICAgICBjb29raWUyOTY1ID0gYy5fY29va2llc1sid3d3LmV4YW1wbGUuY29tIl1bIi8iXVsiZm9vIl0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb29raWUyOTY1LnZlcnNpb24sIDEpCisKKyAgICBkZWYgdGVzdF9uc19wYXJzZXIoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERFRkFVTFRfSFRUUF9QT1JUCisKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzcGFtPWVnZ3M7IERvTWFpbj0uYWNtZS5jb207IHBvcnQ7IGJsQXJnaD0iZmVlcCInKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnbmk9bmk7IHBvcnQ9ODAsODA4MCcpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tOjgwLyIsICduaW5pPW5pJykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb206ODAvIiwgJ2Zvbz1iYXI7IGV4cGlyZXM9JykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb206ODAvIiwgJ3NwYW09ZWdnczsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwaXJlcz0iRm9vIEJhciAyNSAzMzoyMjoxMSAzMDIyIicpCisKKyAgICAgICAgY29va2llID0gYy5fY29va2llc1siLmFjbWUuY29tIl1bIi8iXVsic3BhbSJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29va2llLmRvbWFpbiwgIi5hY21lLmNvbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb29raWUuZG9tYWluX3NwZWNpZmllZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb29raWUucG9ydCwgREVGQVVMVF9IVFRQX1BPUlQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29va2llLnBvcnRfc3BlY2lmaWVkKQorICAgICAgICAjIGNhc2UgaXMgcHJlc2VydmVkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb29raWUuaGFzX25vbnN0YW5kYXJkX2F0dHIoImJsQXJnaCIpIGFuZAorICAgICAgICAgICAgICAgICAgICAgbm90IGNvb2tpZS5oYXNfbm9uc3RhbmRhcmRfYXR0cigiYmxhcmdoIikpCisKKyAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsibmkiXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvb2tpZS5kb21haW4sICJ3d3cuYWNtZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvb2tpZS5kb21haW5fc3BlY2lmaWVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvb2tpZS5wb3J0LCAiODAsODA4MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb29raWUucG9ydF9zcGVjaWZpZWQpCisKKyAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsibmluaSJdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb29raWUucG9ydCBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvb2tpZS5wb3J0X3NwZWNpZmllZCkKKworICAgICAgICAjIGludmFsaWQgZXhwaXJlcyBzaG91bGQgbm90IGNhdXNlIGNvb2tpZSB0byBiZSBkcm9wcGVkCisgICAgICAgIGZvbyA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbyJdCisgICAgICAgIHNwYW0gPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJmb28iXQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9vLmV4cGlyZXMgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNwYW0uZXhwaXJlcyBpcyBOb25lKQorCisgICAgZGVmIHRlc3RfbnNfcGFyc2VyX3NwZWNpYWxfbmFtZXMoc2VsZik6CisgICAgICAgICMgbmFtZXMgc3VjaCBhcyAnZXhwaXJlcycgYXJlIG5vdCBzcGVjaWFsIGluIGZpcnN0IG5hbWU9dmFsdWUgcGFpcgorICAgICAgICAjIG9mIFNldC1Db29raWU6IGhlYWRlcgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCisKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdleHBpcmVzPWVnZ3MnKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAndmVyc2lvbj1lZ2dzOyBzcGFtPWVnZ3MnKQorCisgICAgICAgIGNvb2tpZXMgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZXhwaXJlcycgaW4gY29va2llcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCd2ZXJzaW9uJyBpbiBjb29raWVzKQorCisgICAgZGVmIHRlc3RfZXhwaXJlcyhzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHRpbWUybmV0c2NhcGUsIENvb2tpZUphcgorCisgICAgICAgICMgaWYgZXhwaXJlcyBpcyBpbiBmdXR1cmUsIGtlZXAgY29va2llLi4uCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBmdXR1cmUgPSB0aW1lMm5ldHNjYXBlKHRpbWUudGltZSgpKzM2MDApCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdzcGFtPSJiYXIiOyBleHBpcmVzPSVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisgICAgICAgIG5vdyA9IHRpbWUybmV0c2NhcGUodGltZS50aW1lKCktMSkKKyAgICAgICAgIyAuLi4gYW5kIGlmIGluIHBhc3Qgb3IgcHJlc2VudCwgZGlzY2FyZCBpdAorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnZm9vPSJlZ2dzIjsgZXhwaXJlcz0lcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICBub3cpCisgICAgICAgIGggPSBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdzcGFtPSJiYXIiJyBpbiBoIGFuZCAiZm9vIiBub3QgaW4gaCkKKworICAgICAgICAjIG1heC1hZ2UgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGV4cGlyZXMsIGFuZCB6ZXJvIG1heC1hZ2UgaXMgcmVxdWVzdCB0bworICAgICAgICAjIGRlbGV0ZSBib3RoIG5ldyBjb29raWUgYW5kIGFueSBvbGQgbWF0Y2hpbmcgY29va2llCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdlZ2dzPSJiYXIiOyBleHBpcmVzPSVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZSkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2Jhcj0iYmFyIjsgZXhwaXJlcz0lcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICBmdXR1cmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAzKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnZWdncz0iYmFyIjsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwaXJlcz0lczsgbWF4LWFnZT0wJyAlIGZ1dHVyZSkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2Jhcj0iYmFyIjsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnbWF4LWFnZT0wOyBleHBpcmVzPSVzJyAlIGZ1dHVyZSkKKyAgICAgICAgaCA9IGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAxKQorCisgICAgICAgICMgdGVzdCBleHBpcnkgYXQgZW5kIG9mIHNlc3Npb24gZm9yIGNvb2tpZXMgd2l0aCBubyBleHBpcmVzIGF0dHJpYnV0ZQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5yaHViYXJiLm5ldC8iLCAnd2h1bT0iZml6eiInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMikKKyAgICAgICAgYy5jbGVhcl9zZXNzaW9uX2Nvb2tpZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignc3BhbT0iYmFyIicsIGgpCisKKyAgICAgICAgIyBYWFggUkZDIDI5NjUgZXhwaXJ5IHJ1bGVzIChzb21lIGFwcGx5IHRvIFYwIHRvbykKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfcGF0aChzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgICMgUkZDIDI5NjUKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ3NwYW09ImJhciI7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiLyIsIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgiLCAnZWdncz0iYmFyIjsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydEluKCIvIiwgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC9yaHViYXJiIiwKKyAgICAgICAgICAgICAgICAgICAgICAnZWdncz0iYmFyIjsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydEluKCIvYmxhaC8iLCBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoL3JodWJhcmIvIiwKKyAgICAgICAgICAgICAgICAgICAgICAnZWdncz0iYmFyIjsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydEluKCIvYmxhaC9yaHViYXJiLyIsIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgICAgICMgTmV0c2NhcGUKKworICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ3NwYW09ImJhciInKQorICAgICAgICBzZWxmLmFzc2VydEluKCIvIiwgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgiLCAnZWdncz0iYmFyIicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIi8iLCBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKKworICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC9yaHViYXJiIiwgJ2VnZ3M9ImJhciInKQorICAgICAgICBzZWxmLmFzc2VydEluKCIvYmxhaCIsIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoL3JodWJhcmIvIiwgJ2VnZ3M9ImJhciInKQorICAgICAgICBzZWxmLmFzc2VydEluKCIvYmxhaC9yaHViYXJiIiwgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3BhdGhfd2l0aF9xdWVyeShzZWxmKToKKyAgICAgICAgY2ogPSBjb29raWVsaWIuQ29va2llSmFyKCkKKyAgICAgICAgdXJpID0gImh0dHA6Ly9leGFtcGxlLmNvbS8/c3BhbS9lZ2dzIgorICAgICAgICB2YWx1ZSA9ICdlZ2dzPSJiYXIiJworICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjaiwgdXJpLCB2YWx1ZSkKKyAgICAgICAgIyBkZWZhdWx0IHBhdGggZG9lcyBub3QgaW5jbHVkZSBxdWVyeSwgc28gaXMgIi8iLCBub3QgIi8/c3BhbSIKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiLyIsIGNqLl9jb29raWVzWyJleGFtcGxlLmNvbSJdKQorICAgICAgICAjIGNvb2tpZSBpcyBzZW50IGJhY2sgdG8gdGhlIHNhbWUgVVJJCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJhY3RfbmV0c2NhcGUoY2osIHVyaSksIHZhbHVlKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX3BhdGgoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBlc2NhcGVfcGF0aAorICAgICAgICBjYXNlcyA9IFsKKyAgICAgICAgICAgICMgcXVvdGVkIHNhZmUKKyAgICAgICAgICAgICgiL2ZvbyUyZi9iYXIiLCAiL2ZvbyUyRi9iYXIiKSwKKyAgICAgICAgICAgICgiL2ZvbyUyRi9iYXIiLCAiL2ZvbyUyRi9iYXIiKSwKKyAgICAgICAgICAgICMgcXVvdGVkICUKKyAgICAgICAgICAgICgiL2ZvbyUlL2JhciIsICIvZm9vJSUvYmFyIiksCisgICAgICAgICAgICAjIHF1b3RlZCB1bnNhZmUKKyAgICAgICAgICAgICgiL2ZvJTE5by9iYXIiLCAiL2ZvJTE5by9iYXIiKSwKKyAgICAgICAgICAgICgiL2ZvJTdkby9iYXIiLCAiL2ZvJTdEby9iYXIiKSwKKyAgICAgICAgICAgICMgdW5xdW90ZWQgc2FmZQorICAgICAgICAgICAgKCIvZm9vL2JhciYiLCAiL2Zvby9iYXImIiksCisgICAgICAgICAgICAoIi9mb28vL2JhciIsICIvZm9vLy9iYXIiKSwKKyAgICAgICAgICAgICgiXDE3Ni9mb28vYmFyIiwgIlwxNzYvZm9vL2JhciIpLAorICAgICAgICAgICAgIyB1bnF1b3RlZCB1bnNhZmUKKyAgICAgICAgICAgICgiL2Zvb1wwMzEvYmFyIiwgIi9mb28lMTkvYmFyIiksCisgICAgICAgICAgICAoIi9cMTc1Zm9vL2JhciIsICIvJTdEZm9vL2JhciIpLAorICAgICAgICAgICAgIyB1bmljb2RlCisgICAgICAgICAgICAodSIvZm9vL2Jhclx1YWJjZCIsICIvZm9vL2JhciVFQSVBRiU4RCIpLCAgIyBVVEYtOCBlbmNvZGVkCisgICAgICAgICAgICBdCisgICAgICAgIGZvciBhcmcsIHJlc3VsdCBpbiBjYXNlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXNjYXBlX3BhdGgoYXJnKSwgcmVzdWx0KQorCisgICAgZGVmIHRlc3RfcmVxdWVzdF9wYXRoKHNlbGYpOgorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlcXVlc3RfcGF0aAorICAgICAgICAjIHdpdGggcGFyYW1ldGVycworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3JoZXVtL3JoYXBvbnRpY3VtOyIKKyAgICAgICAgICAgICAgICAgICAgICAiZm9vPWJhcjtzaW5nPXNvbmc/YXBwbGVzPXBlYXJzJnNwYW09ZWdncyNuaSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxdWVzdF9wYXRoKHJlcSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIi9yaGV1bS9yaGFwb250aWN1bTtmb289YmFyO3Npbmc9c29uZyIpCisgICAgICAgICMgd2l0aG91dCBwYXJhbWV0ZXJzCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vcmhldW0vcmhhcG9udGljdW0/IgorICAgICAgICAgICAgICAgICAgICAgICJhcHBsZXM9cGVhcnMmc3BhbT1lZ2dzI25pIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXF1ZXN0X3BhdGgocmVxKSwgIi9yaGV1bS9yaGFwb250aWN1bSIpCisgICAgICAgICMgbWlzc2luZyBmaW5hbCBzbGFzaAorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXF1ZXN0X3BhdGgocmVxKSwgIi8iKQorCisgICAgZGVmIHRlc3RfcmVxdWVzdF9wb3J0KHNlbGYpOgorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlcXVlc3RfcG9ydCwgREVGQVVMVF9IVFRQX1BPUlQKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbToxMjM0LyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAid3d3LmFjbWUuY29tOjQzMjEifSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXF1ZXN0X3BvcnQocmVxKSwgIjEyMzQiKQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAid3d3LmFjbWUuY29tOjQzMjEifSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXF1ZXN0X3BvcnQocmVxKSwgREVGQVVMVF9IVFRQX1BPUlQpCisKKyAgICBkZWYgdGVzdF9yZXF1ZXN0X2hvc3Qoc2VsZik6CisgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcmVxdWVzdF9ob3N0CisgICAgICAgICMgdGhpcyByZXF1ZXN0IGlzIGlsbGVnYWwgKFJGQzI2MTYsIDE0LjIuMykKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovLzEuMS4xLjEvIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJ3d3cuYWNtZS5jb206ODAifSkKKyAgICAgICAgIyBsaWJ3d3ctcGVybCB3YW50cyB0aGlzIHJlc3BvbnNlLCBidXQgdGhhdCBzZWVtcyB3cm9uZyAoUkZDIDI2MTYsCisgICAgICAgICMgc2VjdGlvbiA1LjIsIHBvaW50IDEuLCBhbmQgUkZDIDI5NjUgc2VjdGlvbiAxLCBwYXJhZ3JhcGggMykKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwocmVxdWVzdF9ob3N0KHJlcSksICJ3d3cuYWNtZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcXVlc3RfaG9zdChyZXEpLCAiMS4xLjEuMSIpCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJpcnJlbGV2YW50LmNvbSJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcXVlc3RfaG9zdChyZXEpLCAid3d3LmFjbWUuY29tIikKKyAgICAgICAgIyBub3QgYWN0dWFsbHkgc3VyZSB0aGlzIG9uZSBpcyB2YWxpZCBSZXF1ZXN0IG9iamVjdCwgc28gbWF5YmUgc2hvdWxkCisgICAgICAgICMgcmVtb3ZlIHRlc3QgZm9yIG5vIGhvc3QgaW4gdXJsIGluIHJlcXVlc3RfaG9zdCBmdW5jdGlvbj8KKyAgICAgICAgcmVxID0gUmVxdWVzdCgiL3Jlc291cmNlLmh0bWwiLAorICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbSJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcXVlc3RfaG9zdChyZXEpLCAid3d3LmFjbWUuY29tIikKKyAgICAgICAgIyBwb3J0IHNob3VsZG4ndCBiZSBpbiByZXF1ZXN0LWhvc3QKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbToyMzQ1L3Jlc291cmNlLmh0bWwiLAorICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo1NDMyIn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxdWVzdF9ob3N0KHJlcSksICJ3d3cuYWNtZS5jb20iKQorCisgICAgZGVmIHRlc3RfaXNfSEROKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgaXNfSEROCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc19IRE4oImZvby5iYXIuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc19IRE4oIjFmb28yLjNiYXI0LjVjb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIjE5Mi4xNjguMS4xIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNfSEROKCIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIi4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIi5mb28uYmFyLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzX0hETigiLi5mb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oImZvby4iKSkKKworICAgIGRlZiB0ZXN0X3JlYWNoKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcmVhY2gKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFjaCgid3d3LmFjbWUuY29tIiksICIuYWNtZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWNoKCJhY21lLmNvbSIpLCAiYWNtZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWNoKCJhY21lLmxvY2FsIiksICIubG9jYWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWNoKCIubG9jYWwiKSwgIi5sb2NhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhY2goIi5jb20iKSwgIi5jb20iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWNoKCIuIiksICIuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFjaCgiIiksICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWNoKCIxOTIuMTY4LjAuMSIpLCAiMTkyLjE2OC4wLjEiKQorCisgICAgZGVmIHRlc3RfZG9tYWluX21hdGNoKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgZG9tYWluX21hdGNoLCB1c2VyX2RvbWFpbl9tYXRjaAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIxOTIuMTY4LjEuMSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGRvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiLjE2OC4xLjEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRvbWFpbl9tYXRjaCgieC55LmNvbSIsICJ4LlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goIngueS5jb20iLCAiLlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goImEuYi5jLmNvbSIsICIuYy5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkb21haW5fbWF0Y2goIi5jLmNvbSIsICJhLmIuYy5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRvbWFpbl9tYXRjaCgiZXhhbXBsZS5sb2NhbCIsICIubG9jYWwiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkb21haW5fbWF0Y2goImJsYWguYmxhaCIsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkb21haW5fbWF0Y2goIiIsICIucmh1YmFyYi5yaHViYXJiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goIiIsICIiKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goImFjbWUuY29tIiwgImFjbWUuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goImFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goInJodWJhcmIuYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2RvbWFpbl9tYXRjaCgid3d3LnJodWJhcmIuYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJ4LlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuWS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goInkuY29tIiwgIlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIi55LmNvbSIsICJZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goIi55LmNvbSIsICIuWS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJjb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJtIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLm0iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiMTkyLjE2OC4xLjEiKSkKKyAgICAgICAgIyBub3QgYm90aCBIRE5zLCBzbyBtdXN0IHN0cmluZy1jb21wYXJlIGVxdWFsIHRvIG1hdGNoCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4xNjguMS4xIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4iKSkKKyAgICAgICAgIyBlbXB0eSBzdHJpbmcgaXMgYSBzcGVjaWFsIGNhc2UKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiIikpCisKKyAgICBkZWYgdGVzdF93cm9uZ19kb21haW4oc2VsZik6CisgICAgICAgICMgQ29va2llcyB3aG9zZSBlZmZlY3RpdmUgcmVxdWVzdC1ob3N0IG5hbWUgZG9lcyBub3QgZG9tYWluLW1hdGNoIHRoZQorICAgICAgICAjIGRvbWFpbiBhcmUgcmVqZWN0ZWQuCisKKyAgICAgICAgIyBYWFggZmFyIGZyb20gY29tcGxldGUKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgorICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5uYXN0eS5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICAnZm9vPWJhcjsgZG9tYWluPWZyaWVuZGx5Lm9yZzsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMCkKKworICAgIGRlZiB0ZXN0X3N0cmljdF9kb21haW4oc2VsZik6CisgICAgICAgICMgQ29va2llcyB3aG9zZSBkb21haW4gaXMgYSBjb3VudHJ5LWNvZGUgdGxkIGxpa2UgLmNvLnVrIHNob3VsZAorICAgICAgICAjIG5vdCBiZSBzZXQgaWYgQ29va2llUG9saWN5LnN0cmljdF9kb21haW4gaXMgdHJ1ZS4KKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIGNwID0gRGVmYXVsdENvb2tpZVBvbGljeShzdHJpY3RfZG9tYWluPVRydWUpCisgICAgICAgIGNqID0gQ29va2llSmFyKHBvbGljeT1jcCkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoY2osICJodHRwOi8vZXhhbXBsZS5jby51ay8iLCAnbm89cHJvYmxlbW8nKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjaiwgImh0dHA6Ly9leGFtcGxlLmNvLnVrLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdva2V5PWRva2V5OyBEb21haW49LmV4YW1wbGUuY28udWsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjaiksIDIpCisgICAgICAgIGZvciBwc2V1ZG9fdGxkIGluIFsiLmNvLnVrIiwgIi5vcmcuemEiLCAiLnR4LnVzIiwgIi5uYW1lLnVzIl06CisgICAgICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjaiwgImh0dHA6Ly9leGFtcGxlLiVzLyIgJSBwc2V1ZG9fdGxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW09ZWdnczsgRG9tYWluPS5jby51aycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjaiksIDIpCisKKyAgICBkZWYgdGVzdF90d29fY29tcG9uZW50X2RvbWFpbl9ucyhzZWxmKToKKyAgICAgICAgIyBOZXRzY2FwZTogLnd3dy5iYXIuY29tLCB3d3cuYmFyLmNvbSwgLmJhci5jb20sIGJhci5jb20sIG5vIGRvbWFpbgorICAgICAgICAjIHNob3VsZCBhbGwgZ2V0IGFjY2VwdGVkLCBhcyBzaG91bGQgLmFjbWUuY29tLCBhY21lLmNvbSBhbmQgbm8gZG9tYWluCisgICAgICAgICMgZm9yIDItY29tcG9uZW50IGRvbWFpbnMgbGlrZSBhY21lLmNvbS4KKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorCisgICAgICAgICMgdHdvLWNvbXBvbmVudCBWMCBkb21haW4gaXMgT0sKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28ubmV0LyIsICducz1iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLl9jb29raWVzWyJmb28ubmV0Il1bIi8iXVsibnMiXS52YWx1ZSwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28ubmV0LyIpLCAibnM9YmFyIikKKyAgICAgICAgIyAqd2lsbCogYmUgcmV0dXJuZWQgdG8gYW55IG90aGVyIGRvbWFpbiAodW5saWtlIFJGQyAyOTY1KS4uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmZvby5uZXQvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5zPWJhciIpCisgICAgICAgICMgLi4udW5sZXNzIHJlcXVlc3RlZCBvdGhlcndpc2UKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeSgKKyAgICAgICAgICAgIHN0cmljdF9uc19kb21haW49RGVmYXVsdENvb2tpZVBvbGljeS5Eb21haW5TdHJpY3ROb25Eb21haW4pCisgICAgICAgIGMuc2V0X3BvbGljeShwb2wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuZm9vLm5ldC8iKSwgIiIpCisKKyAgICAgICAgIyB1bmxpa2UgUkZDIDI5NjUsIGV2ZW4gZXhwbGljaXQgdHdvLWNvbXBvbmVudCBkb21haW4gaXMgT0ssCisgICAgICAgICMgYmVjYXVzZSAuZm9vLm5ldCBtYXRjaGVzIGZvby5uZXQKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28ubmV0L2Zvby8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnc3BhbTE9ZWdnczsgZG9tYWluPWZvby5uZXQnKQorICAgICAgICAjIGV2ZW4gaWYgc3RhcnRzIHdpdGggYSBkb3QgLS0gaW4gTlMgcnVsZXMsIC5mb28ubmV0IG1hdGNoZXMgZm9vLm5ldCEKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28ubmV0L2Zvby9iYXIvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW0yPWVnZ3M7IGRvbWFpbj0uZm9vLm5ldCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuX2Nvb2tpZXNbIi5mb28ubmV0Il1bIi9mb28iXVsic3BhbTEiXS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZWdncyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5fY29va2llc1siLmZvby5uZXQiXVsiL2Zvby9iYXIiXVsic3BhbTIiXS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZWdncyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28ubmV0L2Zvby9iYXIvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInNwYW0yPWVnZ3M7IHNwYW0xPWVnZ3M7IG5zPWJhciIpCisKKyAgICAgICAgIyB0b3AtbGV2ZWwgZG9tYWluIGlzIHRvbyBnZW5lcmFsCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC8iLCAnbmluaT0ibmkiOyBkb21haW49Lm5ldCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAzKQorCisjIyAgICAgICAgICMgTmV0c2NhcGUgcHJvdG9jb2wgZG9lc24ndCBhbGxvdyBub24tc3BlY2lhbCB0b3AgbGV2ZWwgZG9tYWlucyAoc3VjaAorIyMgICAgICAgICAjIGFzIGNvLnVrKSBpbiB0aGUgZG9tYWluIGF0dHJpYnV0ZSB1bmxlc3MgdGhlcmUgYXJlIGF0IGxlYXN0IHRocmVlCisjIyAgICAgICAgICMgZG90cyBpbiBpdC4KKyAgICAgICAgIyBPaCB5ZXMgaXQgZG9lcyEgIFJlYWwgaW1wbGVtZW50YXRpb25zIGRvbid0IGNoZWNrIHRoaXMsIGFuZCByZWFsCisgICAgICAgICMgY29va2llcyAob2YgY291cnNlKSByZWx5IG9uIHRoYXQgYmVoYXZpb3VyLgorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2Zvby5jby51ayIsICduYXN0eT10cmljazsgZG9tYWluPS5jby51aycpCisjIyAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgNCkKKworICAgIGRlZiB0ZXN0X3R3b19jb21wb25lbnRfZG9tYWluX3JmYzI5NjUoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisKKyAgICAgICAgIyB0d28tY29tcG9uZW50IFYxIGRvbWFpbiBpcyBPSworICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC8iLCAnZm9vPWJhcjsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLl9jb29raWVzWyJmb28ubmV0Il1bIi8iXVsiZm9vIl0udmFsdWUsICJiYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28ubmV0LyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICIkVmVyc2lvbj0xOyBmb289YmFyIikKKyAgICAgICAgIyB3b24ndCBiZSByZXR1cm5lZCB0byBhbnkgb3RoZXIgZG9tYWluIChiZWNhdXNlIGRvbWFpbiB3YXMgaW1wbGllZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmZvby5uZXQvIiksICIiKQorCisgICAgICAgICMgdW5sZXNzIGRvbWFpbiBpcyBnaXZlbiBleHBsaWNpdGx5LCBiZWNhdXNlIHRoZW4gaXQgbXVzdCBiZQorICAgICAgICAjIHJld3JpdHRlbiB0byBzdGFydCB3aXRoIGEgZG90OiBmb28ubmV0IC0tPiAuZm9vLm5ldCwgd2hpY2ggZG9lcworICAgICAgICAjIG5vdCBkb21haW4tbWF0Y2ggZm9vLm5ldAorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC9mb28iLAorICAgICAgICAgICAgICAgICAgICAgICdzcGFtPWVnZ3M7IGRvbWFpbj1mb28ubmV0OyBwYXRoPS9mb287IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5uZXQvZm9vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiRWZXJzaW9uPTE7IGZvbz1iYXIiKQorCisgICAgICAgICMgZXhwbGljaXQgZm9vLm5ldCBmcm9tIHRocmVlLWNvbXBvbmVudCBkb21haW4gd3d3LmZvby5uZXQgKmRvZXMqIGdldAorICAgICAgICAjIHNldCwgYmVjYXVzZSAuZm9vLm5ldCBkb21haW4tbWF0Y2hlcyAuZm9vLm5ldAorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmZvby5uZXQvZm9vLyIsCisgICAgICAgICAgICAgICAgICAgICAgJ3NwYW09ZWdnczsgZG9tYWluPWZvby5uZXQ7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLl9jb29raWVzWyIuZm9vLm5ldCJdWyIvZm9vLyJdWyJzcGFtIl0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgImVnZ3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC9mb28vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiRWZXJzaW9uPTE7IGZvbz1iYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuZm9vLm5ldC9mb28vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJyRWZXJzaW9uPTE7IHNwYW09ZWdnczsgJERvbWFpbj0iZm9vLm5ldCInKQorCisgICAgICAgICMgdG9wLWxldmVsIGRvbWFpbiBpcyB0b28gZ2VuZXJhbAorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC8iLAorICAgICAgICAgICAgICAgICAgICAgICduaT0ibmkiOyBkb21haW49Ii5uZXQiOyBWZXJzaW9uPSIxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAyKQorCisgICAgICAgICMgUkZDIDI5NjUgZG9lc24ndCByZXF1aXJlIGJsb2NraW5nIHRoaXMKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5jby51ay8iLAorICAgICAgICAgICAgICAgICAgICAgICduYXN0eT10cmljazsgZG9tYWluPS5jby51azsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMykKKworICAgIGRlZiB0ZXN0X2RvbWFpbl9hbGxvdyhzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbGljeT1EZWZhdWx0Q29va2llUG9saWN5KAorICAgICAgICAgICAgYmxvY2tlZF9kb21haW5zPVsiYWNtZS5jb20iXSwKKyAgICAgICAgICAgIGFsbG93ZWRfZG9tYWlucz1bInd3dy5hY21lLmNvbSJdKSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vYWNtZS5jb20vIikKKyAgICAgICAgaGVhZGVycyA9IFsiU2V0LUNvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URTsgcGF0aD0vIl0KKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vYWNtZS5jb20vIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAwKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmNveW90ZS5jb20vIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmNveW90ZS5jb20vIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAxKQorCisgICAgICAgICMgc2V0IGEgY29va2llIHdpdGggbm9uLWFsbG93ZWQgZG9tYWluLi4uCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuY295b3RlLmNvbS8iKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuY295b3RlLmNvbS8iKQorICAgICAgICBjb29raWVzID0gYy5tYWtlX2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgIGMuc2V0X2Nvb2tpZShjb29raWVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMikKKyAgICAgICAgIyAuLi4gYW5kIGNoZWNrIGlzIGRvZXNuJ3QgZ2V0IHJldHVybmVkCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKKworICAgIGRlZiB0ZXN0X2RvbWFpbl9ibG9jayhzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKworICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KAorICAgICAgICAgICAgcmZjMjk2NT1UcnVlLCBibG9ja2VkX2RvbWFpbnM9WyIuYWNtZS5jb20iXSkKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2xpY3k9cG9sKQorICAgICAgICBoZWFkZXJzID0gWyJTZXQtQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBwYXRoPS8iXQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMCkKKworICAgICAgICBwID0gcG9sLnNldF9ibG9ja2VkX2RvbWFpbnMoWyJhY21lLmNvbSJdKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisKKyAgICAgICAgYy5jbGVhcigpCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cucm9hZHJ1bm5lci5uZXQvIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LnJvYWRydW5uZXIubmV0LyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5yb2FkcnVubmVyLm5ldC8iKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChyZXEuaGFzX2hlYWRlcigiQ29va2llIikgYW5kCisgICAgICAgICAgICAgICAgICAgICAgcmVxLmhhc19oZWFkZXIoIkNvb2tpZTIiKSkpCisKKyAgICAgICAgYy5jbGVhcigpCisgICAgICAgIHBvbC5zZXRfYmxvY2tlZF9kb21haW5zKFsiLmFjbWUuY29tIl0pCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKKworICAgICAgICAjIHNldCBhIGNvb2tpZSB3aXRoIGJsb2NrZWQgZG9tYWluLi4uCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGNvb2tpZXMgPSBjLm1ha2VfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgYy5zZXRfY29va2llKGNvb2tpZXNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAyKQorICAgICAgICAjIC4uLiBhbmQgY2hlY2sgaXMgZG9lc24ndCBnZXQgcmV0dXJuZWQKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQorCisgICAgZGVmIHRlc3Rfc2VjdXJlKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgZm9yIG5zIGluIFRydWUsIEZhbHNlOgorICAgICAgICAgICAgZm9yIHdoaXRlc3BhY2UgaW4gIiAiLCAiIjoKKyAgICAgICAgICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgICAgICAgICBpZiBuczoKKyAgICAgICAgICAgICAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PUZhbHNlKQorICAgICAgICAgICAgICAgICAgICBpbnQgPSBpbnRlcmFjdF9uZXRzY2FwZQorICAgICAgICAgICAgICAgICAgICB2cyA9ICIiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCisgICAgICAgICAgICAgICAgICAgIGludCA9IGludGVyYWN0XzI5NjUKKyAgICAgICAgICAgICAgICAgICAgdnMgPSAiOyBWZXJzaW9uPTEiCisgICAgICAgICAgICAgICAgYy5zZXRfcG9saWN5KHBvbCkKKyAgICAgICAgICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5hY21lLmNvbS8iCisgICAgICAgICAgICAgICAgaW50KGMsIHVybCwgImZvbzE9YmFyJXMlcyIgJSAodnMsIHdoaXRlc3BhY2UpKQorICAgICAgICAgICAgICAgIGludChjLCB1cmwsICJmb28yPWJhciVzOyBzZWN1cmUlcyIgJSAgKHZzLCB3aGl0ZXNwYWNlKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgIG5vdCBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJmb28xIl0uc2VjdXJlLAorICAgICAgICAgICAgICAgICAgICAibm9uLXNlY3VyZSBjb29raWUgcmVnaXN0ZXJlZCBzZWN1cmUiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vMiJdLnNlY3VyZSwKKyAgICAgICAgICAgICAgICAgICAgInNlY3VyZSBjb29raWUgcmVnaXN0ZXJlZCBub24tc2VjdXJlIikKKworICAgIGRlZiB0ZXN0X3F1b3RlX2Nvb2tpZV92YWx1ZShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorICAgICAgICBjID0gQ29va2llSmFyKHBvbGljeT1EZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgcidmb289XGIiYSJyOyBWZXJzaW9uPTEnKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgsIHInJFZlcnNpb249MTsgZm9vPVxcYlwiYVwicicpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2ZpbmFsX3NsYXNoKHNlbGYpOgorICAgICAgICAjIE1pc3Npbmcgc2xhc2ggZnJvbSByZXF1ZXN0IFVSTCdzIGFic19wYXRoIHNob3VsZCBiZSBhc3N1bWVkIHByZXNlbnQuCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LmFjbWUuY29tIgorICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJmb289YmFyOyBWZXJzaW9uPTEiKQorICAgICAgICByZXEgPSBSZXF1ZXN0KHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQorCisgICAgZGVmIHRlc3RfZG9tYWluX21pcnJvcihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJzcGFtPWVnZ3M7IFZlcnNpb249MSIpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiRG9tYWluIiwgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYWJzZW50IGRvbWFpbiByZXR1cm5lZCB3aXRoIGRvbWFpbiBwcmVzZW50IikKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IERvbWFpbj0uYmFyLmNvbScpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignJERvbWFpbj0iLmJhci5jb20iJywgaCwgImRvbWFpbiBub3QgcmV0dXJuZWQiKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKKyAgICAgICAgIyBub3RlIG1pc3NpbmcgaW5pdGlhbCBkb3QgaW4gRG9tYWluCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IERvbWFpbj1iYXIuY29tJykKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQorICAgICAgICBzZWxmLmFzc2VydEluKCckRG9tYWluPSJiYXIuY29tIicsIGgsICJkb21haW4gbm90IHJldHVybmVkIikKKworICAgIGRlZiB0ZXN0X3BhdGhfbWlycm9yKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgInNwYW09ZWdnczsgVmVyc2lvbj0xIikKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJQYXRoIiwgaCwgImFic2VudCBwYXRoIHJldHVybmVkIHdpdGggcGF0aCBwcmVzZW50IikKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IFBhdGg9LycpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignJFBhdGg9Ii8iJywgaCwgInBhdGggbm90IHJldHVybmVkIikKKworICAgIGRlZiB0ZXN0X3BvcnRfbWlycm9yKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgInNwYW09ZWdnczsgVmVyc2lvbj0xIikKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJQb3J0IiwgaCwgImFic2VudCBwb3J0IHJldHVybmVkIHdpdGggcG9ydCBwcmVzZW50IikKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAic3BhbT1lZ2dzOyBWZXJzaW9uPTE7IFBvcnQiKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2goIlwkUG9ydChbXj1dfCQpIiwgaCksCisgICAgICAgICAgICAgICAgICAgICAicG9ydCB3aXRoIG5vIHZhbHVlIG5vdCByZXR1cm5lZCB3aXRoIG5vIHZhbHVlIikKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IFBvcnQ9IjgwIicpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignJFBvcnQ9IjgwIicsIGgsCisgICAgICAgICAgICAgICAgICAgICAgInBvcnQgd2l0aCBzaW5nbGUgdmFsdWUgbm90IHJldHVybmVkIHdpdGggc2luZ2xlIHZhbHVlIikKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IFBvcnQ9IjgwLDgwODAiJykKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQorICAgICAgICBzZWxmLmFzc2VydEluKCckUG9ydD0iODAsODA4MCInLCBoLAorICAgICAgICAgICAgICAgICAgICAgICJwb3J0IHdpdGggbXVsdGlwbGUgdmFsdWVzIG5vdCByZXR1cm5lZCB3aXRoIG11bHRpcGxlICIKKyAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzIikKKworICAgIGRlZiB0ZXN0X25vX3JldHVybl9jb21tZW50KHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyAnCisgICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnQ9ImRvZXMgYW55Ym9keSByZWFkIHRoZXNlPyI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAnQ29tbWVudFVSTD0iaHR0cDovL2Zvby5iYXIubmV0L2NvbW1lbnQuaHRtbCInKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICJDb21tZW50IiBub3QgaW4gaCwKKyAgICAgICAgICAgICJDb21tZW50IG9yIENvbW1lbnRVUkwgY29va2llLWF0dHJpYnV0ZXMgcmV0dXJuZWQgdG8gc2VydmVyIikKKworICAgIGRlZiB0ZXN0X0Nvb2tpZV9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgQ29va2llLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgY3MgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICAjIGFkZCBzb21lIHJhbmRvbSBjb29raWVzCisgICAgICAgIGludGVyYWN0XzI5NjUoY3MsICJodHRwOi8vYmxhaC5zcGFtLm9yZy8iLCAnZm9vPWVnZ3M7IFZlcnNpb249MTsgJworICAgICAgICAgICAgICAgICAgICAgICdDb21tZW50PSJkb2VzIGFueWJvZHkgcmVhZCB0aGVzZT8iOyAnCisgICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnRVUkw9Imh0dHA6Ly9mb28uYmFyLm5ldC9jb21tZW50Lmh0bWwiJykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoY3MsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvIiwgInNwYW09YmFyOyBzZWN1cmUiKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGNzLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoLyIsCisgICAgICAgICAgICAgICAgICAgICAgImZvbz1iYXI7IHNlY3VyZTsgVmVyc2lvbj0xIikKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjcywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC8iLAorICAgICAgICAgICAgICAgICAgICAgICJmb289YmFyOyBwYXRoPS87IFZlcnNpb249MSIpCisgICAgICAgIGludGVyYWN0XzI5NjUoY3MsICJodHRwOi8vd3d3LnNvbC5ubyIsCisgICAgICAgICAgICAgICAgICAgICAgcidiYW5nPXdhbGxvcDsgdmVyc2lvbj0xOyBkb21haW49Ii5zb2wubm8iOyAnCisgICAgICAgICAgICAgICAgICAgICAgcidwb3J0PSI5MCwxMDAsIDgwLDgwODAiOyAnCisgICAgICAgICAgICAgICAgICAgICAgcidtYXgtYWdlPTEwMDsgQ29tbWVudCA9ICJKdXN0IGtpZGRpbmchIChcInxcXFxcKSAiJykKKworICAgICAgICB2ZXJzaW9ucyA9IFsxLCAxLCAxLCAwLCAxXQorICAgICAgICBuYW1lcyA9IFsiYmFuZyIsICJmb28iLCAiZm9vIiwgInNwYW0iLCAiZm9vIl0KKyAgICAgICAgZG9tYWlucyA9IFsiLnNvbC5ubyIsICJibGFoLnNwYW0ub3JnIiwgInd3dy5hY21lLmNvbSIsCisgICAgICAgICAgICAgICAgICAgInd3dy5hY21lLmNvbSIsICJ3d3cuYWNtZS5jb20iXQorICAgICAgICBwYXRocyA9IFsiLyIsICIvIiwgIi8iLCAiL2JsYWgiLCAiL2JsYWgvIl0KKworICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICBmb3IgYyBpbiBjczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYywgQ29va2llKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy52ZXJzaW9uLCB2ZXJzaW9uc1tpXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubmFtZSwgbmFtZXNbaV0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmRvbWFpbiwgZG9tYWluc1tpXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucGF0aCwgcGF0aHNbaV0pCisgICAgICAgICAgICAgICAgaSA9IGkgKyAxCisKKyAgICBkZWYgdGVzdF9wYXJzZV9uc19oZWFkZXJzKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcGFyc2VfbnNfaGVhZGVycworCisgICAgICAgICMgbWlzc2luZyBkb21haW4gdmFsdWUgKGludmFsaWQgY29va2llKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcGFyc2VfbnNfaGVhZGVycyhbImZvbz1iYXI7IHBhdGg9LzsgZG9tYWluIl0pLAorICAgICAgICAgICAgW1soImZvbyIsICJiYXIiKSwKKyAgICAgICAgICAgICAgKCJwYXRoIiwgIi8iKSwgKCJkb21haW4iLCBOb25lKSwgKCJ2ZXJzaW9uIiwgIjAiKV1dCisgICAgICAgICAgICApCisgICAgICAgICMgaW52YWxpZCBleHBpcmVzIHZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBwYXJzZV9uc19oZWFkZXJzKFsiZm9vPWJhcjsgZXhwaXJlcz1Gb28gQmFyIDEyIDMzOjIyOjExIDIwMDAiXSksCisgICAgICAgICAgICBbWygiZm9vIiwgImJhciIpLCAoImV4cGlyZXMiLCBOb25lKSwgKCJ2ZXJzaW9uIiwgIjAiKV1dCisgICAgICAgICAgICApCisgICAgICAgICMgbWlzc2luZyBjb29raWUgdmFsdWUgKHZhbGlkIGNvb2tpZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHBhcnNlX25zX2hlYWRlcnMoWyJmb28iXSksCisgICAgICAgICAgICBbWygiZm9vIiwgTm9uZSksICgidmVyc2lvbiIsICIwIildXQorICAgICAgICAgICAgKQorICAgICAgICAjIHNob3VsZG4ndCBhZGQgdmVyc2lvbiBpZiBoZWFkZXIgaXMgZW1wdHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZV9uc19oZWFkZXJzKFsiIl0pLCBbXSkKKworICAgIGRlZiB0ZXN0X2JhZF9jb29raWVfaGVhZGVyKHNlbGYpOgorCisgICAgICAgIGRlZiBjb29raWVqYXJfZnJvbV9jb29raWVfaGVhZGVycyhoZWFkZXJzKToKKyAgICAgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIKKyAgICAgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorICAgICAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCisgICAgICAgICAgICByID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCisgICAgICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyLCByZXEpCisgICAgICAgICAgICByZXR1cm4gYworCisgICAgICAgICMgbm9uZSBvZiB0aGVzZSBiYWQgaGVhZGVycyBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uIHRvIGJlIHJhaXNlZAorICAgICAgICBmb3IgaGVhZGVycyBpbiBbCisgICAgICAgICAgICBbIlNldC1Db29raWU6ICJdLCAgIyBhY3R1YWxseSwgbm90aGluZyB3cm9uZyB3aXRoIHRoaXMKKyAgICAgICAgICAgIFsiU2V0LUNvb2tpZTI6ICJdLCAgIyBkaXR0bworICAgICAgICAgICAgIyBtaXNzaW5nIGRvbWFpbiB2YWx1ZQorICAgICAgICAgICAgWyJTZXQtQ29va2llMjogYT1mb287IHBhdGg9LzsgVmVyc2lvbj0xOyBkb21haW4iXSwKKyAgICAgICAgICAgICMgYmFkIG1heC1hZ2UKKyAgICAgICAgICAgIFsiU2V0LUNvb2tpZTogYj1mb287IG1heC1hZ2U9b29wcyJdLAorICAgICAgICAgICAgIyBiYWQgdmVyc2lvbgorICAgICAgICAgICAgWyJTZXQtQ29va2llOiBiPWZvbzsgdmVyc2lvbj1zcGFtIl0sCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgYyA9IGNvb2tpZWphcl9mcm9tX2Nvb2tpZV9oZWFkZXJzKGhlYWRlcnMpCisgICAgICAgICAgICAjIHRoZXNlIGJhZCBjb29raWVzIHNob3VsZG4ndCBiZSBzZXQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAwKQorCisgICAgICAgICMgY29va2llIHdpdGggaW52YWxpZCBleHBpcmVzIGlzIHRyZWF0ZWQgYXMgc2Vzc2lvbiBjb29raWUKKyAgICAgICAgaGVhZGVycyA9IFsiU2V0LUNvb2tpZTogYz1mb287IGV4cGlyZXM9Rm9vIEJhciAxMiAzMzoyMjoxMSAyMDAwIl0KKyAgICAgICAgYyA9IGNvb2tpZWphcl9mcm9tX2Nvb2tpZV9oZWFkZXJzKGhlYWRlcnMpCisgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5leGFtcGxlLmNvbSJdWyIvIl1bImMiXQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLmV4cGlyZXMgaXMgTm9uZSkKKworCitjbGFzcyBMV1BDb29raWVUZXN0cyhUZXN0Q2FzZSk6CisgICAgIyBUZXN0cyB0YWtlbiBmcm9tIGxpYnd3dy1wZXJsLCB3aXRoIGEgZmV3IG1vZGlmaWNhdGlvbnMgYW5kIGFkZGl0aW9ucy4KKworICAgIGRlZiB0ZXN0X25ldHNjYXBlX2V4YW1wbGVfMShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKworICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAjIEZpcnN0IHdlIGNoZWNrIHRoYXQgaXQgd29ya3MgZm9yIHRoZSBvcmlnaW5hbCBleGFtcGxlIGF0CisgICAgICAgICMgaHR0cDovL3d3dy5uZXRzY2FwZS5jb20vbmV3c3JlZi9zdGQvY29va2llX3NwZWMuaHRtbAorCisgICAgICAgICMgQ2xpZW50IHJlcXVlc3RzIGEgZG9jdW1lbnQsIGFuZCByZWNlaXZlcyBpbiB0aGUgcmVzcG9uc2U6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBTZXQtQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBwYXRoPS87IGV4cGlyZXM9V2VkbmVzZGF5LCAwOS1Ob3YtOTkgMjM6MTI6NDAgR01UCisgICAgICAgICMKKyAgICAgICAgIyBXaGVuIGNsaWVudCByZXF1ZXN0cyBhIFVSTCBpbiBwYXRoICIvIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBDb29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEUKKyAgICAgICAgIworICAgICAgICAjIENsaWVudCByZXF1ZXN0cyBhIGRvY3VtZW50LCBhbmQgcmVjZWl2ZXMgaW4gdGhlIHJlc3BvbnNlOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDE7IHBhdGg9LworICAgICAgICAjCisgICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiLyIgb24gdGhpcyBzZXJ2ZXIsIGl0IHNlbmRzOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMQorICAgICAgICAjCisgICAgICAgICMgQ2xpZW50IHJlY2VpdmVzOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgU2V0LUNvb2tpZTogU0hJUFBJTkc9RkVERVg7IHBhdGg9L2ZvCisgICAgICAgICMKKyAgICAgICAgIyBXaGVuIGNsaWVudCByZXF1ZXN0cyBhIFVSTCBpbiBwYXRoICIvIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBDb29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxCisgICAgICAgICMKKyAgICAgICAgIyBXaGVuIGNsaWVudCByZXF1ZXN0cyBhIFVSTCBpbiBwYXRoICIvZm9vIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBDb29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxOyBTSElQUElORz1GRURFWAorICAgICAgICAjCisgICAgICAgICMgVGhlIGxhc3QgQ29va2llIGlzIGJ1Z2d5LCBiZWNhdXNlIGJvdGggc3BlY2lmaWNhdGlvbnMgc2F5IHRoYXQgdGhlCisgICAgICAgICMgbW9zdCBzcGVjaWZpYyBjb29raWUgbXVzdCBiZSBzZW50IGZpcnN0LiAgU0hJUFBJTkc9RkVERVggaXMgdGhlCisgICAgICAgICMgbW9zdCBzcGVjaWZpYyBhbmQgc2hvdWxkIHRodXMgYmUgZmlyc3QuCisKKyAgICAgICAgeWVhcl9wbHVzX29uZSA9IHRpbWUubG9jYWx0aW1lKClbMF0gKyAxCisKKyAgICAgICAgaGVhZGVycyA9IFtdCisKKyAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjUgPSBUcnVlKSkKKworICAgICAgICAjcmVxID0gUmVxdWVzdCgiaHR0cDovLzEuMS4xLjEvIiwKKyAgICAgICAgIyAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAid3d3LmFjbWUuY29tOjgwIn0pCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb206ODAvIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJ3d3cuYWNtZS5jb206ODAifSkKKworICAgICAgICBoZWFkZXJzLmFwcGVuZCgKKyAgICAgICAgICAgICJTZXQtQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBwYXRoPS8gOyAiCisgICAgICAgICAgICAiZXhwaXJlcz1XZWRuZXNkYXksIDA5LU5vdi0lZCAyMzoxMjo0MCBHTVQiICUgeWVhcl9wbHVzX29uZSkKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hlYWRlcigiQ29va2llIiksICJDVVNUT01FUj1XSUxFX0VfQ09ZT1RFIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hlYWRlcigiQ29va2llMiIpLCAnJFZlcnNpb249IjEiJykKKworICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDE7IHBhdGg9LyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tL2Zvby9iYXIiKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKworICAgICAgICBoID0gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiwgaCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiQ1VTVE9NRVI9V0lMRV9FX0NPWU9URSIsIGgpCisKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWU6IFNISVBQSU5HPUZFREVYOyBwYXRoPS9mb28nKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorCisgICAgICAgIGggPSByZXEuZ2V0X2hlYWRlcigiQ29va2llIikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEiLCBoKQorICAgICAgICBzZWxmLmFzc2VydEluKCJDVVNUT01FUj1XSUxFX0VfQ09ZT1RFIiwgaCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiU0hJUFBJTkc9RkVERVgiLCBoKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vLyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorCisgICAgICAgIGggPSByZXEuZ2V0X2hlYWRlcigiQ29va2llIikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEiLCBoKQorICAgICAgICBzZWxmLmFzc2VydEluKCJDVVNUT01FUj1XSUxFX0VfQ09ZT1RFIiwgaCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGguc3RhcnRzd2l0aCgiU0hJUFBJTkc9RkVERVg7IikpCisKKyAgICBkZWYgdGVzdF9uZXRzY2FwZV9leGFtcGxlXzIoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgIyBTZWNvbmQgRXhhbXBsZSB0cmFuc2FjdGlvbiBzZXF1ZW5jZToKKyAgICAgICAgIworICAgICAgICAjIEFzc3VtZSBhbGwgbWFwcGluZ3MgZnJvbSBhYm92ZSBoYXZlIGJlZW4gY2xlYXJlZC4KKyAgICAgICAgIworICAgICAgICAjIENsaWVudCByZWNlaXZlczoKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxOyBwYXRoPS8KKyAgICAgICAgIworICAgICAgICAjIFdoZW4gY2xpZW50IHJlcXVlc3RzIGEgVVJMIGluIHBhdGggIi8iIG9uIHRoaXMgc2VydmVyLCBpdCBzZW5kczoKKyAgICAgICAgIworICAgICAgICAjICAgICAgIENvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEKKyAgICAgICAgIworICAgICAgICAjIENsaWVudCByZWNlaXZlczoKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJJRElOR19ST0NLRVRfMDAyMzsgcGF0aD0vYW1tbworICAgICAgICAjCisgICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiL2FtbW8iIG9uIHRoaXMgc2VydmVyLCBpdCBzZW5kczoKKyAgICAgICAgIworICAgICAgICAjICAgICAgIENvb2tpZTogUEFSVF9OVU1CRVI9UklESU5HX1JPQ0tFVF8wMDIzOyBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMQorICAgICAgICAjCisgICAgICAgICMgICAgICAgTk9URTogVGhlcmUgYXJlIHR3byBuYW1lL3ZhbHVlIHBhaXJzIG5hbWVkICJQQVJUX05VTUJFUiIgZHVlIHRvCisgICAgICAgICMgICAgICAgdGhlIGluaGVyaXRhbmNlIG9mIHRoZSAiLyIgbWFwcGluZyBpbiBhZGRpdGlvbiB0byB0aGUgIi9hbW1vIiBtYXBwaW5nLgorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBoZWFkZXJzID0gW10KKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMTsgcGF0aD0vIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIikKKworICAgICAgICBoZWFkZXJzLmFwcGVuZCgKKyAgICAgICAgICAgICJTZXQtQ29va2llOiBQQVJUX05VTUJFUj1SSURJTkdfUk9DS0VUXzAwMjM7IHBhdGg9L2FtbW8iKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS9hbW1vIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLnNlYXJjaChyIlBBUlRfTlVNQkVSPVJJRElOR19ST0NLRVRfMDAyMztccyoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEuZ2V0X2hlYWRlcigiQ29va2llIikpKQorCisgICAgZGVmIHRlc3RfaWV0Zl9leGFtcGxlXzEoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKyAgICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgIyBUaGVuIHdlIHRlc3Qgd2l0aCB0aGUgZXhhbXBsZXMgZnJvbSBkcmFmdC1pZXRmLWh0dHAtc3RhdGUtbWFuLW1lYy0wMy50eHQKKyAgICAgICAgIworICAgICAgICAjIDUuICBFWEFNUExFUworCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorCisgICAgICAgICMKKyAgICAgICAgIyA1LjEgIEV4YW1wbGUgMQorICAgICAgICAjCisgICAgICAgICMgTW9zdCBkZXRhaWwgb2YgcmVxdWVzdCBhbmQgcmVzcG9uc2UgaGVhZGVycyBoYXMgYmVlbiBvbWl0dGVkLiAgQXNzdW1lCisgICAgICAgICMgdGhlIHVzZXIgYWdlbnQgaGFzIG5vIHN0b3JlZCBjb29raWVzLgorICAgICAgICAjCisgICAgICAgICMgICAxLiAgVXNlciBBZ2VudCAtPiBTZXJ2ZXIKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFBPU1QgL2FjbWUvbG9naW4gSFRUUC8xLjEKKyAgICAgICAgIyAgICAgICBbZm9ybSBkYXRhXQorICAgICAgICAjCisgICAgICAgICMgICAgICAgVXNlciBpZGVudGlmaWVzIHNlbGYgdmlhIGEgZm9ybS4KKyAgICAgICAgIworICAgICAgICAjICAgMi4gIFNlcnZlciAtPiBVc2VyIEFnZW50CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBIVFRQLzEuMSAyMDAgT0sKKyAgICAgICAgIyAgICAgICBTZXQtQ29va2llMjogQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBDb29raWUgcmVmbGVjdHMgdXNlcidzIGlkZW50aXR5LgorCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoCisgICAgICAgICAgICBjLCAnaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL2xvZ2luJywKKyAgICAgICAgICAgICdDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvb2tpZSkKKworICAgICAgICAjCisgICAgICAgICMgICAzLiAgVXNlciBBZ2VudCAtPiBTZXJ2ZXIKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFBPU1QgL2FjbWUvcGlja2l0ZW0gSFRUUC8xLjEKKyAgICAgICAgIyAgICAgICBDb29raWU6ICRWZXJzaW9uPSIxIjsgQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyAkUGF0aD0iL2FjbWUiCisgICAgICAgICMgICAgICAgW2Zvcm0gZGF0YV0KKyAgICAgICAgIworICAgICAgICAjICAgICAgIFVzZXIgc2VsZWN0cyBhbiBpdGVtIGZvciBgYHNob3BwaW5nIGJhc2tldC4nJworICAgICAgICAjCisgICAgICAgICMgICA0LiAgU2VydmVyIC0+IFVzZXIgQWdlbnQKKyAgICAgICAgIworICAgICAgICAjICAgICAgIEhUVFAvMS4xIDIwMCBPSworICAgICAgICAjICAgICAgIFNldC1Db29raWUyOiBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsKKyAgICAgICAgIyAgICAgICAgICAgICAgIFBhdGg9Ii9hY21lIgorICAgICAgICAjCisgICAgICAgICMgICAgICAgU2hvcHBpbmcgYmFza2V0IGNvbnRhaW5zIGFuIGl0ZW0uCisKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAnaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL3BpY2tpdGVtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJyk7CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2goCisgICAgICAgICAgICByJ15cJFZlcnNpb249Ij8xIj87IEN1c3RvbWVyPSI/V0lMRV9FX0NPWU9URSI/OyBcJFBhdGg9Ii9hY21lIiQnLAorICAgICAgICAgICAgY29va2llKSkKKworICAgICAgICAjCisgICAgICAgICMgICA1LiAgVXNlciBBZ2VudCAtPiBTZXJ2ZXIKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFBPU1QgL2FjbWUvc2hpcHBpbmcgSFRUUC8xLjEKKyAgICAgICAgIyAgICAgICBDb29raWU6ICRWZXJzaW9uPSIxIjsKKyAgICAgICAgIyAgICAgICAgICAgICAgIEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgJFBhdGg9Ii9hY21lIjsKKyAgICAgICAgIyAgICAgICAgICAgICAgIFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICRQYXRoPSIvYWNtZSIKKyAgICAgICAgIyAgICAgICBbZm9ybSBkYXRhXQorICAgICAgICAjCisgICAgICAgICMgICAgICAgVXNlciBzZWxlY3RzIHNoaXBwaW5nIG1ldGhvZCBmcm9tIGZvcm0uCisgICAgICAgICMKKyAgICAgICAgIyAgIDYuICBTZXJ2ZXIgLT4gVXNlciBBZ2VudAorICAgICAgICAjCisgICAgICAgICMgICAgICAgSFRUUC8xLjEgMjAwIE9LCisgICAgICAgICMgICAgICAgU2V0LUNvb2tpZTI6IFNoaXBwaW5nPSJGZWRFeCI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSIKKyAgICAgICAgIworICAgICAgICAjICAgICAgIE5ldyBjb29raWUgcmVmbGVjdHMgc2hpcHBpbmcgbWV0aG9kLgorCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9zaGlwcGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NoaXBwaW5nPSJGZWRFeCI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2gocideXCRWZXJzaW9uPSI/MSI/OycsIGNvb2tpZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2gocidQYXJ0X051bWJlcj0iP1JvY2tldF9MYXVuY2hlcl8wMDAxIj87JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdccypcJFBhdGg9IlwvYWNtZSInLCBjb29raWUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKHInQ3VzdG9tZXI9Ij9XSUxFX0VfQ09ZT1RFIj87XHMqXCRQYXRoPSJcL2FjbWUiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWUpKQorCisgICAgICAgICMKKyAgICAgICAgIyAgIDcuICBVc2VyIEFnZW50IC0+IFNlcnZlcgorICAgICAgICAjCisgICAgICAgICMgICAgICAgUE9TVCAvYWNtZS9wcm9jZXNzIEhUVFAvMS4xCisgICAgICAgICMgICAgICAgQ29va2llOiAkVmVyc2lvbj0iMSI7CisgICAgICAgICMgICAgICAgICAgICAgICBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7ICRQYXRoPSIvYWNtZSI7CisgICAgICAgICMgICAgICAgICAgICAgICBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyAkUGF0aD0iL2FjbWUiOworICAgICAgICAjICAgICAgICAgICAgICAgU2hpcHBpbmc9IkZlZEV4IjsgJFBhdGg9Ii9hY21lIgorICAgICAgICAjICAgICAgIFtmb3JtIGRhdGFdCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBVc2VyIGNob29zZXMgdG8gcHJvY2VzcyBvcmRlci4KKyAgICAgICAgIworICAgICAgICAjICAgOC4gIFNlcnZlciAtPiBVc2VyIEFnZW50CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBIVFRQLzEuMSAyMDAgT0sKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgorCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9wcm9jZXNzIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgcmUuc2VhcmNoKHInU2hpcHBpbmc9Ij9GZWRFeCI/O1xzKlwkUGF0aD0iXC9hY21lIicsIGNvb2tpZSkgYW5kCisgICAgICAgICAgICAiV0lMRV9FX0NPWU9URSIgaW4gY29va2llKQorCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgdXNlciBhZ2VudCBtYWtlcyBhIHNlcmllcyBvZiByZXF1ZXN0cyBvbiB0aGUgb3JpZ2luIHNlcnZlciwgYWZ0ZXIKKyAgICAgICAgIyBlYWNoIG9mIHdoaWNoIGl0IHJlY2VpdmVzIGEgbmV3IGNvb2tpZS4gIEFsbCB0aGUgY29va2llcyBoYXZlIHRoZSBzYW1lCisgICAgICAgICMgUGF0aCBhdHRyaWJ1dGUgYW5kIChkZWZhdWx0KSBkb21haW4uICBCZWNhdXNlIHRoZSByZXF1ZXN0IFVSTHMgYWxsIGhhdmUKKyAgICAgICAgIyAvYWNtZSBhcyBhIHByZWZpeCwgYW5kIHRoYXQgbWF0Y2hlcyB0aGUgUGF0aCBhdHRyaWJ1dGUsIGVhY2ggcmVxdWVzdAorICAgICAgICAjIGNvbnRhaW5zIGFsbCB0aGUgY29va2llcyByZWNlaXZlZCBzbyBmYXIuCisKKyAgICBkZWYgdGVzdF9pZXRmX2V4YW1wbGVfMihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgICMgNS4yICBFeGFtcGxlIDIKKyAgICAgICAgIworICAgICAgICAjIFRoaXMgZXhhbXBsZSBpbGx1c3RyYXRlcyB0aGUgZWZmZWN0IG9mIHRoZSBQYXRoIGF0dHJpYnV0ZS4gIEFsbCBkZXRhaWwKKyAgICAgICAgIyBvZiByZXF1ZXN0IGFuZCByZXNwb25zZSBoZWFkZXJzIGhhcyBiZWVuIG9taXR0ZWQuICBBc3N1bWUgdGhlIHVzZXIgYWdlbnQKKyAgICAgICAgIyBoYXMgbm8gc3RvcmVkIGNvb2tpZXMuCisKKyAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisKKyAgICAgICAgIyBJbWFnaW5lIHRoZSB1c2VyIGFnZW50IGhhcyByZWNlaXZlZCwgaW4gcmVzcG9uc2UgdG8gZWFybGllciByZXF1ZXN0cywKKyAgICAgICAgIyB0aGUgcmVzcG9uc2UgaGVhZGVycworICAgICAgICAjCisgICAgICAgICMgU2V0LUNvb2tpZTI6IFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOworICAgICAgICAjICAgICAgICAgUGF0aD0iL2FjbWUiCisgICAgICAgICMKKyAgICAgICAgIyBhbmQKKyAgICAgICAgIworICAgICAgICAjIFNldC1Db29raWUyOiBQYXJ0X051bWJlcj0iUmlkaW5nX1JvY2tldF8wMDIzIjsgVmVyc2lvbj0iMSI7CisgICAgICAgICMgICAgICAgICBQYXRoPSIvYWNtZS9hbW1vIgorCisgICAgICAgIGludGVyYWN0XzI5NjUoCisgICAgICAgICAgICBjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL2FtbW8vc3BlY2lmaWMiLAorICAgICAgICAgICAgJ1BhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInLAorICAgICAgICAgICAgJ1BhcnRfTnVtYmVyPSJSaWRpbmdfUm9ja2V0XzAwMjMiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUvYW1tbyInKQorCisgICAgICAgICMgQSBzdWJzZXF1ZW50IHJlcXVlc3QgYnkgdGhlIHVzZXIgYWdlbnQgdG8gdGhlIChzYW1lKSBzZXJ2ZXIgZm9yIFVSTHMgb2YKKyAgICAgICAgIyB0aGUgZm9ybSAvYWNtZS9hbW1vLy4uLiAgd291bGQgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHJlcXVlc3QgaGVhZGVyOgorICAgICAgICAjCisgICAgICAgICMgQ29va2llOiAkVmVyc2lvbj0iMSI7CisgICAgICAgICMgICAgICAgICBQYXJ0X051bWJlcj0iUmlkaW5nX1JvY2tldF8wMDIzIjsgJFBhdGg9Ii9hY21lL2FtbW8iOworICAgICAgICAjICAgICAgICAgUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgJFBhdGg9Ii9hY21lIgorICAgICAgICAjCisgICAgICAgICMgTm90ZSB0aGF0IHRoZSBOQU1FPVZBTFVFIHBhaXIgZm9yIHRoZSBjb29raWUgd2l0aCB0aGUgbW9yZSBzcGVjaWZpYyBQYXRoCisgICAgICAgICMgYXR0cmlidXRlLCAvYWNtZS9hbW1vLCBjb21lcyBiZWZvcmUgdGhlIG9uZSB3aXRoIHRoZSBsZXNzIHNwZWNpZmljIFBhdGgKKyAgICAgICAgIyBhdHRyaWJ1dGUsIC9hY21lLiAgRnVydGhlciBub3RlIHRoYXQgdGhlIHNhbWUgY29va2llIG5hbWUgYXBwZWFycyBtb3JlCisgICAgICAgICMgdGhhbiBvbmNlLgorCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9hbW1vLy4uLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHJlLnNlYXJjaChyIlJpZGluZ19Sb2NrZXRfMDAyMy4qUm9ja2V0X0xhdW5jaGVyXzAwMDEiLCBjb29raWUpKQorCisgICAgICAgICMgQSBzdWJzZXF1ZW50IHJlcXVlc3QgYnkgdGhlIHVzZXIgYWdlbnQgdG8gdGhlIChzYW1lKSBzZXJ2ZXIgZm9yIGEgVVJMIG9mCisgICAgICAgICMgdGhlIGZvcm0gL2FjbWUvcGFydHMvIHdvdWxkIGluY2x1ZGUgdGhlIGZvbGxvd2luZyByZXF1ZXN0IGhlYWRlcjoKKyAgICAgICAgIworICAgICAgICAjIENvb2tpZTogJFZlcnNpb249IjEiOyBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyAkUGF0aD0iL2FjbWUiCisgICAgICAgICMKKyAgICAgICAgIyBIZXJlLCB0aGUgc2Vjb25kIGNvb2tpZSdzIFBhdGggYXR0cmlidXRlIC9hY21lL2FtbW8gaXMgbm90IGEgcHJlZml4IG9mCisgICAgICAgICMgdGhlIHJlcXVlc3QgVVJMLCAvYWNtZS9wYXJ0cy8sIHNvIHRoZSBjb29raWUgZG9lcyBub3QgZ2V0IGZvcndhcmRlZCB0bworICAgICAgICAjIHRoZSBzZXJ2ZXIuCisKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL3BhcnRzLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlJvY2tldF9MYXVuY2hlcl8wMDAxIiwgY29va2llKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJSaWRpbmdfUm9ja2V0XzAwMjMiLCBjb29raWUpCisKKyAgICBkZWYgdGVzdF9yZWplY3Rpb24oc2VsZik6CisgICAgICAgICMgVGVzdCByZWplY3Rpb24gb2YgU2V0LUNvb2tpZTIgcmVzcG9uc2VzIGJhc2VkIG9uIGRvbWFpbiwgcGF0aCwgcG9ydC4KKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IERlZmF1bHRDb29raWVQb2xpY3ksIExXUENvb2tpZUphcgorCisgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQorCisgICAgICAgIGMgPSBMV1BDb29raWVKYXIocG9saWN5PXBvbCkKKworICAgICAgICBtYXhfYWdlID0gIm1heC1hZ2U9MzYwMCIKKworICAgICAgICAjIGlsbGVnYWwgZG9tYWluIChubyBlbWJlZGRlZCBkb3RzKQorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vPWJhcjsgZG9tYWluPSIuY29tIjsgdmVyc2lvbj0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjKQorCisgICAgICAgICMgbGVnYWwgZG9tYWluCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwaW5nPXBvbmc7IGRvbWFpbj0iYWNtZS5jb20iOyB2ZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKKworICAgICAgICAjIGlsbGVnYWwgZG9tYWluIChob3N0IHByZWZpeCAid3d3LmEiIGNvbnRhaW5zIGEgZG90KQorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmEuYWNtZS5jb20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGl6PWJhbmc7IGRvbWFpbj0iYWNtZS5jb20iOyB2ZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKKworICAgICAgICAjIGxlZ2FsIGRvbWFpbgorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmEuYWNtZS5jb20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3b3c9Zmx1dHRlcjsgZG9tYWluPSIuYS5hY21lLmNvbSI7IHZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAyKQorCisgICAgICAgICMgY2FuJ3QgcGFydGlhbGx5IG1hdGNoIGFuIElQLWFkZHJlc3MKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovLzEyNS4xMjUuMTI1LjEyNSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3p6eno9cGluZzsgZG9tYWluPSIxMjUuMTI1LjEyNSI7IHZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAyKQorCisgICAgICAgICMgaWxsZWdhbCBwYXRoIChtdXN0IGJlIHByZWZpeCBvZiByZXF1ZXN0IHBhdGgpCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmxhaD1yaHViYXJiOyBkb21haW49Ii5zb2wubm8iOyBwYXRoPSIvZm9vIjsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMikKKworICAgICAgICAjIGxlZ2FsIHBhdGgKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8vZm9vL2JhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jpbmc9Ym9uZzsgZG9tYWluPSIuc29sLm5vIjsgcGF0aD0iL2ZvbyI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbj0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDMpCisKKyAgICAgICAgIyBpbGxlZ2FsIHBvcnQgKHJlcXVlc3QtcG9ydCBub3QgaW4gbGlzdCkKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGl6PWZmZnQ7IGRvbWFpbj0iLnNvbC5ubyI7IHBvcnQ9IjkwLDEwMCI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbj0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDMpCisKKyAgICAgICAgIyBsZWdhbCBwb3J0CisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoCisgICAgICAgICAgICBjLCAiaHR0cDovL3d3dy5zb2wubm8iLAorICAgICAgICAgICAgcidiYW5nPXdhbGxvcDsgdmVyc2lvbj0xOyBkb21haW49Ii5zb2wubm8iOyAnCisgICAgICAgICAgICByJ3BvcnQ9IjkwLDEwMCwgODAsODA4MCI7ICcKKyAgICAgICAgICAgIHInbWF4LWFnZT0xMDA7IENvbW1lbnQgPSAiSnVzdCBraWRkaW5nISAoXCJ8XFxcXCkgIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCA0KQorCisgICAgICAgICMgcG9ydCBhdHRyaWJ1dGUgd2l0aG91dCBhbnkgdmFsdWUgKGN1cnJlbnQgcG9ydCkKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb285PWJhcjsgdmVyc2lvbj0xOyBkb21haW49Ii5zb2wubm8iOyBwb3J0OyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heC1hZ2U9MTAwOycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCA1KQorCisgICAgICAgICMgZW5jb2RlZCBwYXRoCisgICAgICAgICMgTFdQIGhhcyB0aGlzIHRlc3QsIGJ1dCB1bmVzY2FwaW5nIGFsbG93ZWQgcGF0aCBjaGFyYWN0ZXJzIHNlZW1zCisgICAgICAgICMgbGlrZSBhIGJhZCBpZGVhLCBzbyBJIHRoaW5rIHRoaXMgc2hvdWxkIGZhaWw6CisjIyAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vL2Zvby8iLAorIyMgICAgICAgICAgICAgICAgICAgICAgICAgICByJ2Zvbzg9YmFyOyB2ZXJzaW9uPTE7IHBhdGg9Ii8lNjZvbyInKQorICAgICAgICAjIGJ1dCB0aGlzIGlzIE9LLCBiZWNhdXNlICc8JyBpcyBub3QgYW4gYWxsb3dlZCBIVFRQIFVSTCBwYXRoCisgICAgICAgICMgY2hhcmFjdGVyOgorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LnNvbC5uby88b28vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ2Zvbzg9YmFyOyB2ZXJzaW9uPTE7IHBhdGg9Ii8lM2NvbyInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgNikKKworICAgICAgICAjIHNhdmUgYW5kIHJlc3RvcmUKKyAgICAgICAgZmlsZW5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYy5zYXZlKGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQorICAgICAgICAgICAgb2xkID0gcmVwcihjKQorCisgICAgICAgICAgICBjID0gTFdQQ29va2llSmFyKHBvbGljeT1wb2wpCisgICAgICAgICAgICBjLmxvYWQoZmlsZW5hbWUsIGlnbm9yZV9kaXNjYXJkPVRydWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6IG9zLnVubGluayhmaWxlbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOiBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvbGQsIHJlcHIoYykpCisKKyAgICBkZWYgdGVzdF91cmxfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgICMgVHJ5IHNvbWUgVVJMIGVuY29kaW5ncyBvZiB0aGUgUEFUSHMuCisgICAgICAgICMgKHRoZSBiZWhhdmlvdXIgaGVyZSBoYXMgY2hhbmdlZCBmcm9tIGxpYnd3dy1wZXJsKQorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vJTJmJTI1LyUzYyUzYyUwQW5ldyVFNS8lRTUiLAorICAgICAgICAgICAgICAgICAgICAgICJmb28gID0gICBiYXI7IHZlcnNpb24gICAgPSAgIDEiKQorCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoCisgICAgICAgICAgICBjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28lMmYlMjUvPDwlMGFuZXflL+b45SIsCisgICAgICAgICAgICAnYmFyPWJhejsgcGF0aD0iL2Zvby8iOyB2ZXJzaW9uPTEnKTsKKyAgICAgICAgdmVyc2lvbl9yZSA9IHJlLmNvbXBpbGUocideXCR2ZXJzaW9uPVwiPzFcIj8nLCByZS5JKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZvbz1iYXIiIGluIGNvb2tpZSBhbmQgdmVyc2lvbl9yZS5zZWFyY2goY29va2llKSkKKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KAorICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vLyUyNS88PCUwYW5ld+Uv5vjlIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjb29raWUpCisKKyAgICAgICAgIyB1bmljb2RlIFVSTCBkb2Vzbid0IHJhaXNlIGV4Y2VwdGlvbgorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsIHUiaHR0cDovL3d3dy5hY21lLmNvbS9ceGZjIikKKworICAgIGRlZiB0ZXN0X21vemlsbGEoc2VsZik6CisgICAgICAgICMgU2F2ZSAvIGxvYWQgTW96aWxsYS9OZXRzY2FwZSBjb29raWUgZmlsZSBmb3JtYXQuCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBNb3ppbGxhQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgeWVhcl9wbHVzX29uZSA9IHRpbWUubG9jYWx0aW1lKClbMF0gKyAxCisKKyAgICAgICAgZmlsZW5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisKKyAgICAgICAgYyA9IE1vemlsbGFDb29raWVKYXIoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeT1EZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICAiZm9vMT1iYXI7IG1heC1hZ2U9MTAwOyBWZXJzaW9uPTEiKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgJ2ZvbzI9YmFyOyBwb3J0PSI4MCI7IG1heC1hZ2U9MTAwOyBEaXNjYXJkOyBWZXJzaW9uPTEnKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICJmb28zPWJhcjsgc2VjdXJlOyBWZXJzaW9uPTEiKQorCisgICAgICAgIGV4cGlyZXMgPSAiZXhwaXJlcz0wOS1Ob3YtJWQgMjM6MTI6NDAgR01UIiAlICh5ZWFyX3BsdXNfb25lLCkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuZm9vLmNvbS8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vYT1iYXI7ICVzIiAlIGV4cGlyZXMpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmZvby5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2I9YmFyOyBEb21haW49LmZvby5jb207ICVzIiAlIGV4cGlyZXMpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmZvby5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2M9YmFyOyBEb21haW49d3d3LmZvby5jb207ICVzIiAlIGV4cGlyZXMpCisKKyAgICAgICAgZGVmIHNhdmVfYW5kX3Jlc3RvcmUoY2osIGlnbm9yZV9kaXNjYXJkKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjai5zYXZlKGlnbm9yZV9kaXNjYXJkPWlnbm9yZV9kaXNjYXJkKQorICAgICAgICAgICAgICAgIG5ld19jID0gTW96aWxsYUNvb2tpZUphcihmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICAgICAgICAgIG5ld19jLmxvYWQoaWdub3JlX2Rpc2NhcmQ9aWdub3JlX2Rpc2NhcmQpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRyeTogb3MudW5saW5rKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOiBwYXNzCisgICAgICAgICAgICByZXR1cm4gbmV3X2MKKworICAgICAgICBuZXdfYyA9IHNhdmVfYW5kX3Jlc3RvcmUoYywgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmV3X2MpLCA2KSAgIyBub25lIGRpc2NhcmRlZAorICAgICAgICBzZWxmLmFzc2VydEluKCJuYW1lPSdmb28xJywgdmFsdWU9J2JhciciLCByZXByKG5ld19jKSkKKworICAgICAgICBuZXdfYyA9IHNhdmVfYW5kX3Jlc3RvcmUoYywgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5ld19jKSwgNCkgICMgMiBvZiB0aGVtIGRpc2NhcmRlZCBvbiBzYXZlCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm5hbWU9J2ZvbzEnLCB2YWx1ZT0nYmFyJyIsIHJlcHIobmV3X2MpKQorCisgICAgZGVmIHRlc3RfbmV0c2NhcGVfbWlzYyhzZWxmKToKKyAgICAgICAgIyBTb21lIGFkZGl0aW9uYWwgTmV0c2NhcGUgY29va2llcyB0ZXN0cy4KKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKworICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgaGVhZGVycyA9IFtdCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9mb28uYmFyLmFjbWUuY29tL2ZvbyIpCisKKyAgICAgICAgIyBOZXRzY2FwZSBhbGxvd3MgYSBob3N0IHBhcnQgdGhhdCBjb250YWlucyBkb3RzCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBDdXN0b21lcj1XSUxFX0VfQ09ZT1RFOyBkb21haW49LmFjbWUuY29tIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tL2ZvbyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorCisgICAgICAgICMgYW5kIHRoYXQgdGhlIGRvbWFpbiBpcyB0aGUgc2FtZSBhcyB0aGUgaG9zdCB3aXRob3V0IGFkZGluZyBhIGxlYWRpbmcKKyAgICAgICAgIyBkb3QgdG8gdGhlIGRvbWFpbi4gIFNob3VsZCBub3QgcXVvdGUgZXZlbiBpZiBzdHJhbmdlIGNoYXJzIGFyZSB1c2VkCisgICAgICAgICMgaW4gdGhlIGNvb2tpZSB2YWx1ZS4KKyAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IFBBUlRfTlVNQkVSPTMsNDsgZG9tYWluPWZvby5iYXIuYWNtZS5jb20iKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2Zvby5iYXIuYWNtZS5jb20vZm9vIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICJQQVJUX05VTUJFUj0zLDQiIGluIHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKSBhbmQKKyAgICAgICAgICAgICJDdXN0b21lcj1XSUxFX0VfQ09ZT1RFIiBpbiByZXEuZ2V0X2hlYWRlcigiQ29va2llIikpCisKKyAgICBkZWYgdGVzdF9pbnRyYW5ldF9kb21haW5zXzI5NjUoc2VsZik6CisgICAgICAgICMgVGVzdCBoYW5kbGluZyBvZiBsb2NhbCBpbnRyYW5ldCBob3N0bmFtZXMgd2l0aG91dCBhIGRvdC4KKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZXhhbXBsZS8iLAorICAgICAgICAgICAgICAgICAgICAgICJmb28xPWJhcjsgUE9SVDsgRGlzY2FyZDsgVmVyc2lvbj0xOyIpCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9leGFtcGxlLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbzI9YmFyOyBkb21haW49Ii5sb2NhbCI7IFZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oImZvbzE9YmFyIiwgY29va2llKQorCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9leGFtcGxlLyIsICdmb28zPWJhcjsgVmVyc2lvbj0xJykKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2V4YW1wbGUvIikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiZm9vMj1iYXIiLCBjb29raWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAzKQorCisgICAgZGVmIHRlc3RfaW50cmFuZXRfZG9tYWluc19ucyhzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1ID0gRmFsc2UpKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2V4YW1wbGUvIiwgImZvbzE9YmFyIikKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9leGFtcGxlLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb28yPWJhcjsgZG9tYWluPS5sb2NhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEluKCJmb28xPWJhciIsIGNvb2tpZSkKKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2V4YW1wbGUvIikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiZm9vMj1iYXIiLCBjb29raWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAyKQorCisgICAgZGVmIHRlc3RfZW1wdHlfcGF0aChzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKworICAgICAgICAjIFRlc3QgZm9yIGVtcHR5IHBhdGgKKyAgICAgICAgIyBCcm9rZW4gd2ViLXNlcnZlciBPUklPTi8xLjMuMzggcmV0dXJucyB0byB0aGUgY2xpZW50IHJlc3BvbnNlIGxpa2UKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFNldC1Db29raWU6IEpTRVNTSU9OSUQ9QUJDREVSQU5ET00xMjM7IFBhdGg9CisgICAgICAgICMKKyAgICAgICAgIyBpZS4gd2l0aCBQYXRoIHNldCB0byBub3RoaW5nLgorICAgICAgICAjIEluIHRoaXMgY2FzZSwgZXh0cmFjdF9jb29raWVzKCkgbXVzdCBzZXQgY29va2llIHRvIC8gKHJvb3QpCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1ID0gVHJ1ZSkpCisgICAgICAgIGhlYWRlcnMgPSBbXQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYW50cy5jb20vIikKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IEpTRVNTSU9OSUQ9QUJDREVSQU5ET00xMjM7IFBhdGg9IikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFudHMuY29tLyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYW50cy5jb20vIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hlYWRlcigiQ29va2llIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIkpTRVNTSU9OSUQ9QUJDREVSQU5ET00xMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaGVhZGVyKCJDb29raWUyIiksICckVmVyc2lvbj0iMSInKQorCisgICAgICAgICMgbWlzc2luZyBwYXRoIGluIHRoZSByZXF1ZXN0IFVSSQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFudHMuY29tOjgwODAiKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSlNFU1NJT05JRD1BQkNERVJBTkRPTTEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9oZWFkZXIoIkNvb2tpZTIiKSwgJyRWZXJzaW9uPSIxIicpCisKKyAgICBkZWYgdGVzdF9zZXNzaW9uX2Nvb2tpZXMoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgeWVhcl9wbHVzX29uZSA9IHRpbWUubG9jYWx0aW1lKClbMF0gKyAxCisKKyAgICAgICAgIyBDaGVjayBzZXNzaW9uIGNvb2tpZXMgYXJlIGRlbGV0ZWQgcHJvcGVybHkgYnkKKyAgICAgICAgIyBDb29raWVKYXIuY2xlYXJfc2Vzc2lvbl9jb29raWVzIG1ldGhvZAorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoJ2h0dHA6Ly93d3cucGVybG1laXN0ZXIuY29tL3NjcmlwdHMnKQorICAgICAgICBoZWFkZXJzID0gW10KKyAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IHMxPXNlc3Npb247UGF0aD0vc2NyaXB0cyIpCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBwMT1wZXJtOyBEb21haW49LnBlcmxtZWlzdGVyLmNvbTsiCisgICAgICAgICAgICAgICAgICAgICAgICJQYXRoPS87ZXhwaXJlcz1GcmksIDAyLUZlYi0lZCAyMzoyNDoyMCBHTVQiICUKKyAgICAgICAgICAgICAgICAgICAgICAgeWVhcl9wbHVzX29uZSkKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IHAyPXBlcm07UGF0aD0vO2V4cGlyZXM9RnJpLCAiCisgICAgICAgICAgICAgICAgICAgICAgICIwMi1GZWItJWQgMjM6MjQ6MjAgR01UIiAlIHllYXJfcGx1c19vbmUpCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBzMj1zZXNzaW9uO1BhdGg9L3NjcmlwdHM7IgorICAgICAgICAgICAgICAgICAgICAgICAiRG9tYWluPS5wZXJsbWVpc3Rlci5jb20iKQorICAgICAgICBoZWFkZXJzLmFwcGVuZCgnU2V0LUNvb2tpZTI6IHMzPXNlc3Npb247VmVyc2lvbj0xO0Rpc2NhcmQ7UGF0aD0iLyInKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgJ2h0dHA6Ly93d3cucGVybG1laXN0ZXIuY29tL3NjcmlwdHMnKQorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgIyBIb3cgbWFueSBzZXNzaW9uL3Blcm1hbmVudCBjb29raWVzIGRvIHdlIGhhdmU/CisgICAgICAgIGNvdW50ZXIgPSB7InNlc3Npb25fYWZ0ZXIiOiAwLAorICAgICAgICAgICAgICAgICAgICJwZXJtX2FmdGVyIjogMCwKKyAgICAgICAgICAgICAgICAgICAic2Vzc2lvbl9iZWZvcmUiOiAwLAorICAgICAgICAgICAgICAgICAgICJwZXJtX2JlZm9yZSI6IDB9CisgICAgICAgIGZvciBjb29raWUgaW4gYzoKKyAgICAgICAgICAgIGtleSA9ICIlc19iZWZvcmUiICUgY29va2llLnZhbHVlCisgICAgICAgICAgICBjb3VudGVyW2tleV0gPSBjb3VudGVyW2tleV0gKyAxCisgICAgICAgIGMuY2xlYXJfc2Vzc2lvbl9jb29raWVzKCkKKyAgICAgICAgIyBIb3cgbWFueSBub3c/CisgICAgICAgIGZvciBjb29raWUgaW4gYzoKKyAgICAgICAgICAgIGtleSA9ICIlc19hZnRlciIgJSBjb29raWUudmFsdWUKKyAgICAgICAgICAgIGNvdW50ZXJba2V5XSA9IGNvdW50ZXJba2V5XSArIDEKKworICAgICAgICBzZWxmLmFzc2VydFRydWUobm90ICgKKyAgICAgICAgICAgICMgYSBwZXJtYW5lbnQgY29va2llIGdvdCBsb3N0IGFjY2lkZW50YWxseQorICAgICAgICAgICAgY291bnRlclsicGVybV9hZnRlciJdICE9IGNvdW50ZXJbInBlcm1fYmVmb3JlIl0gb3IKKyAgICAgICAgICAgICMgYSBzZXNzaW9uIGNvb2tpZSBoYXNuJ3QgYmVlbiBjbGVhcmVkCisgICAgICAgICAgICBjb3VudGVyWyJzZXNzaW9uX2FmdGVyIl0gIT0gMCBvcgorICAgICAgICAgICAgIyB3ZSBkaWRuJ3QgaGF2ZSBzZXNzaW9uIGNvb2tpZXMgaW4gdGhlIGZpcnN0IHBsYWNlCisgICAgICAgICAgICBjb3VudGVyWyJzZXNzaW9uX2JlZm9yZSJdID09IDApKQorCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBEYXRlVGltZVRlc3RzLAorICAgICAgICBIZWFkZXJUZXN0cywKKyAgICAgICAgQ29va2llVGVzdHMsCisgICAgICAgIEZpbGVDb29raWVKYXJUZXN0cywKKyAgICAgICAgTFdQQ29va2llVGVzdHMsCisgICAgICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29va2llbGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxZTFlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29va2llbGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQxZTFlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29weS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI2NGYxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHkucHkKQEAgLTAsMCArMSw3MTIgQEAKKyIiIlVuaXQgdGVzdHMgZm9yIHRoZSBjb3B5IG1vZHVsZS4iIiIKKworaW1wb3J0IGNvcHkKK2ltcG9ydCBjb3B5X3JlZworaW1wb3J0IHdlYWtyZWYKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBUZXN0Q29weSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIEF0dGVtcHQgZnVsbCBsaW5lIGNvdmVyYWdlIG9mIGNvcHkucHkgZnJvbSB0b3AgdG8gYm90dG9tCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29weS5FcnJvciBpcyBjb3B5LmVycm9yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhjb3B5LkVycm9yLCBFeGNlcHRpb24pKQorCisgICAgIyBUaGUgY29weSgpIG1ldGhvZAorCisgICAgZGVmIHRlc3RfY29weV9iYXNpYyhzZWxmKToKKyAgICAgICAgeCA9IDQyCisgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorCisgICAgZGVmIHRlc3RfY29weV9jb3B5KHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworICAgICAgICAgICAgZGVmIF9fY29weV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBDKHNlbGYuZm9vKQorICAgICAgICB4ID0gQyg0MikKKyAgICAgICAgeSA9IGNvcHkuY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuX19jbGFzc19fLCB4Ll9fY2xhc3NfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmZvbywgeC5mb28pCisKKyAgICBkZWYgdGVzdF9jb3B5X3JlZ2lzdHJ5KHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIGZvbyk6CisgICAgICAgICAgICAgICAgb2JqID0gb2JqZWN0Ll9fbmV3X18oY2xzKQorICAgICAgICAgICAgICAgIG9iai5mb28gPSBmb28KKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqCisgICAgICAgIGRlZiBwaWNrbGVfQyhvYmopOgorICAgICAgICAgICAgcmV0dXJuIChDLCAob2JqLmZvbywpKQorICAgICAgICB4ID0gQyg0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb3B5LmNvcHksIHgpCisgICAgICAgIGNvcHlfcmVnLnBpY2tsZShDLCBwaWNrbGVfQywgQykKKyAgICAgICAgeSA9IGNvcHkuY29weSh4KQorCisgICAgZGVmIHRlc3RfY29weV9yZWR1Y2VfZXgoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3JlZHVjZV9leF9fKHNlbGYsIHByb3RvKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkLCAic2hvdWxkbid0IGNhbGwgdGhpcyIKKyAgICAgICAgeCA9IEMoKQorICAgICAgICB5ID0gY29weS5jb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIHgpCisKKyAgICBkZWYgdGVzdF9jb3B5X3JlZHVjZShzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgeSA9IGNvcHkuY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyB4KQorCisgICAgZGVmIHRlc3RfY29weV9jYW50KHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoIl9fcmVkdWNlIik6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBuYW1lCisgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY29weS5FcnJvciwgY29weS5jb3B5LCB4KQorCisgICAgIyBUeXBlLXNwZWNpZmljIF9jb3B5X3h4eCgpIG1ldGhvZHMKKworICAgIGRlZiB0ZXN0X2NvcHlfYXRvbWljKHNlbGYpOgorICAgICAgICBjbGFzcyBDbGFzc2ljOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBOZXdTdHlsZShvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0ZXN0cyA9IFtOb25lLCA0MiwgMkwqKjEwMCwgMy4xNCwgVHJ1ZSwgRmFsc2UsIDFqLAorICAgICAgICAgICAgICAgICAiaGVsbG8iLCB1ImhlbGxvXHUxMjM0IiwgZi5mdW5jX2NvZGUsCisgICAgICAgICAgICAgICAgIE5ld1N0eWxlLCB4cmFuZ2UoMTApLCBDbGFzc2ljLCBtYXhdCisgICAgICAgIGZvciB4IGluIHRlc3RzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvcHkuY29weSh4KSBpcyB4LCByZXByKHgpKQorCisgICAgZGVmIHRlc3RfY29weV9saXN0KHNlbGYpOgorICAgICAgICB4ID0gWzEsIDIsIDNdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weS5jb3B5KHgpLCB4KQorCisgICAgZGVmIHRlc3RfY29weV90dXBsZShzZWxmKToKKyAgICAgICAgeCA9ICgxLCAyLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuY29weSh4KSwgeCkKKworICAgIGRlZiB0ZXN0X2NvcHlfZGljdChzZWxmKToKKyAgICAgICAgeCA9IHsiZm9vIjogMSwgImJhciI6IDJ9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weS5jb3B5KHgpLCB4KQorCisgICAgZGVmIHRlc3RfY29weV9pbnN0X3ZhbmlsbGEoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5mb28sIG90aGVyLmZvbykKKyAgICAgICAgeCA9IEMoNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weS5jb3B5KHgpLCB4KQorCisgICAgZGVmIHRlc3RfY29weV9pbnN0X2NvcHkoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworICAgICAgICAgICAgZGVmIF9fY29weV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBDKHNlbGYuZm9vKQorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5mb28sIG90aGVyLmZvbykKKyAgICAgICAgeCA9IEMoNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weS5jb3B5KHgpLCB4KQorCisgICAgZGVmIHRlc3RfY29weV9pbnN0X2dldGluaXRhcmdzKHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbyk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIGRlZiBfX2dldGluaXRhcmdzX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLmZvbywpCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmZvbywgb3RoZXIuZm9vKQorICAgICAgICB4ID0gQyg0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3B5LmNvcHkoeCksIHgpCisKKyAgICBkZWYgdGVzdF9jb3B5X2luc3RfZ2V0c3RhdGUoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworICAgICAgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4geyJmb28iOiBzZWxmLmZvb30KKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZm9vLCBvdGhlci5mb28pCisgICAgICAgIHggPSBDKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuY29weSh4KSwgeCkKKworICAgIGRlZiB0ZXN0X2NvcHlfaW5zdF9zZXRzdGF0ZShzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IHN0YXRlWyJmb28iXQorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5mb28sIG90aGVyLmZvbykKKyAgICAgICAgeCA9IEMoNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weS5jb3B5KHgpLCB4KQorCisgICAgZGVmIHRlc3RfY29weV9pbnN0X2dldHN0YXRlX3NldHN0YXRlKHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbyk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZm9vCisgICAgICAgICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IHN0YXRlCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmZvbywgb3RoZXIuZm9vKQorICAgICAgICB4ID0gQyg0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3B5LmNvcHkoeCksIHgpCisKKyAgICAjIFRoZSBkZWVwY29weSgpIG1ldGhvZAorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfYmFzaWMoc2VsZik6CisgICAgICAgIHggPSA0MgorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9tZW1vKHNlbGYpOgorICAgICAgICAjIFRlc3RzIG9mIHJlZmxleGl2ZSBvYmplY3RzIGFyZSB1bmRlciB0eXBlLXNwZWNpZmljIHNlY3Rpb25zIGJlbG93LgorICAgICAgICAjIFRoaXMgdGVzdHMgb25seSByZXBldGl0aW9ucyBvZiBvYmplY3RzLgorICAgICAgICB4ID0gW10KKyAgICAgICAgeCA9IFt4LCB4XQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeVswXSBpcyBub3QgeFswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHlbMF0gaXMgeVsxXSkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2lzc3ViY2xhc3Moc2VsZik6CisgICAgICAgICMgWFhYIE5vdGU6IHRoZXJlJ3Mgbm8gd2F5IHRvIHRlc3QgdGhlIFR5cGVFcnJvciBjb21pbmcgb3V0IG9mCisgICAgICAgICMgaXNzdWJjbGFzcygpIC0tIHRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gYW4gZXh0ZW5zaW9uCisgICAgICAgICMgbW9kdWxlIGRlZmluZXMgYSAidHlwZSIgdGhhdCBkb2Vzbid0IGZvcm1hbGx5IGluaGVyaXQgZnJvbQorICAgICAgICAjIHR5cGUuCisgICAgICAgIGNsYXNzIE1ldGEodHlwZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gTWV0YQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuZGVlcGNvcHkoQyksIEMpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9kZWVwY29weShzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbyk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbz1Ob25lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gQyhzZWxmLmZvbykKKyAgICAgICAgeCA9IEMoNDIpCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fX2NsYXNzX18sIHguX19jbGFzc19fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuZm9vLCB4LmZvbykKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3JlZ2lzdHJ5KHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIGZvbyk6CisgICAgICAgICAgICAgICAgb2JqID0gb2JqZWN0Ll9fbmV3X18oY2xzKQorICAgICAgICAgICAgICAgIG9iai5mb28gPSBmb28KKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqCisgICAgICAgIGRlZiBwaWNrbGVfQyhvYmopOgorICAgICAgICAgICAgcmV0dXJuIChDLCAob2JqLmZvbywpKQorICAgICAgICB4ID0gQyg0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb3B5LmRlZXBjb3B5LCB4KQorICAgICAgICBjb3B5X3JlZy5waWNrbGUoQywgcGlja2xlX0MsIEMpCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9yZWR1Y2VfZXgoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3JlZHVjZV9leF9fKHNlbGYsIHByb3RvKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkLCAic2hvdWxkbid0IGNhbGwgdGhpcyIKKyAgICAgICAgeCA9IEMoKQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyB4KQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfcmVkdWNlKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgeCA9IEMoKQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyB4KQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfY2FudChzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCJfX3JlZHVjZSIpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgbmFtZQorICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKQorICAgICAgICB4ID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNvcHkuRXJyb3IsIGNvcHkuZGVlcGNvcHksIHgpCisKKyAgICAjIFR5cGUtc3BlY2lmaWMgX2RlZXBjb3B5X3h4eCgpIG1ldGhvZHMKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2F0b21pYyhzZWxmKToKKyAgICAgICAgY2xhc3MgQ2xhc3NpYzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgTmV3U3R5bGUob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdGVzdHMgPSBbTm9uZSwgNDIsIDJMKioxMDAsIDMuMTQsIFRydWUsIEZhbHNlLCAxaiwKKyAgICAgICAgICAgICAgICAgImhlbGxvIiwgdSJoZWxsb1x1MTIzNCIsIGYuZnVuY19jb2RlLAorICAgICAgICAgICAgICAgICBOZXdTdHlsZSwgeHJhbmdlKDEwKSwgQ2xhc3NpYywgbWF4XQorICAgICAgICBmb3IgeCBpbiB0ZXN0czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb3B5LmRlZXBjb3B5KHgpIGlzIHgsIHJlcHIoeCkpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9saXN0KHNlbGYpOgorICAgICAgICB4ID0gW1sxLCAyXSwgM10KKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyBub3QgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbMF0gaXMgbm90IHlbMF0pCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9yZWZsZXhpdmVfbGlzdChzZWxmKToKKyAgICAgICAgeCA9IFtdCisgICAgICAgIHguYXBwZW5kKHgpCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY21wLCB5LCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHlbMF0gaXMgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oeSksIDEpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV90dXBsZShzZWxmKToKKyAgICAgICAgeCA9IChbMSwgMl0sIDMpCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIG5vdCB5WzBdKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfcmVmbGV4aXZlX3R1cGxlKHNlbGYpOgorICAgICAgICB4ID0gKFtdLCkKKyAgICAgICAgeFswXS5hcHBlbmQoeCkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjbXAsIHksIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeVswXSBpcyBub3QgeFswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHlbMF1bMF0gaXMgeSkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2RpY3Qoc2VsZik6CisgICAgICAgIHggPSB7ImZvbyI6IFsxLCAyXSwgImJhciI6IDN9CisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WyJmb28iXSBpcyBub3QgeVsiZm9vIl0pCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9yZWZsZXhpdmVfZGljdChzZWxmKToKKyAgICAgICAgeCA9IHt9CisgICAgICAgIHhbJ2ZvbyddID0geAorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGNtcCwgeSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5Wydmb28nXSBpcyB5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih5KSwgMSkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2tlZXBhbGl2ZShzZWxmKToKKyAgICAgICAgbWVtbyA9IHt9CisgICAgICAgIHggPSA0MgorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4LCBtZW1vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWVtb1tpZCh4KV0gaXMgeCkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2luc3RfdmFuaWxsYShzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmZvbywgb3RoZXIuZm9vKQorICAgICAgICB4ID0gQyhbNDJdKQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5LmZvbyBpcyBub3QgeC5mb28pCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9pbnN0X2RlZXBjb3B5KHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbyk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEMoY29weS5kZWVwY29weShzZWxmLmZvbywgbWVtbykpCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmZvbywgb3RoZXIuZm9vKQorICAgICAgICB4ID0gQyhbNDJdKQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgbm90IHguZm9vKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfaW5zdF9nZXRpbml0YXJncyhzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICBkZWYgX19nZXRpbml0YXJnc19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoc2VsZi5mb28sKQorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5mb28sIG90aGVyLmZvbykKKyAgICAgICAgeCA9IEMoWzQyXSkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIG5vdCB4LmZvbykKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2luc3RfZ2V0c3RhdGUoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworICAgICAgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4geyJmb28iOiBzZWxmLmZvb30KKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZm9vLCBvdGhlci5mb28pCisgICAgICAgIHggPSBDKFs0Ml0pCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5LmZvbyBpcyBub3QgeC5mb28pCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9pbnN0X3NldHN0YXRlKHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbyk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gc3RhdGVbImZvbyJdCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmZvbywgb3RoZXIuZm9vKQorICAgICAgICB4ID0gQyhbNDJdKQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgbm90IHguZm9vKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfaW5zdF9nZXRzdGF0ZV9zZXRzdGF0ZShzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZvbworICAgICAgICAgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBzdGF0ZQorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5mb28sIG90aGVyLmZvbykKKyAgICAgICAgeCA9IEMoWzQyXSkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIG5vdCB4LmZvbykKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3JlZmxleGl2ZV9pbnN0KHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgcGFzcworICAgICAgICB4ID0gQygpCisgICAgICAgIHguZm9vID0geAorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIHkpCisKKyAgICAjIF9yZWNvbnN0cnVjdCgpCisKKyAgICBkZWYgdGVzdF9yZWNvbnN0cnVjdF9zdHJpbmcoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICB4ID0gQygpCisgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgeCkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgeCkKKworICAgIGRlZiB0ZXN0X3JlY29uc3RydWN0X25vc3RhdGUoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoQywgKCkpCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgeC5mb28gPSA0MgorICAgICAgICB5ID0gY29weS5jb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5Ll9fY2xhc3NfXyBpcyB4Ll9fY2xhc3NfXykKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuX19jbGFzc19fIGlzIHguX19jbGFzc19fKQorCisgICAgZGVmIHRlc3RfcmVjb25zdHJ1Y3Rfc3RhdGUoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoQywgKCksIHNlbGYuX19kaWN0X18pCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLl9fZGljdF9fLCBvdGhlci5fX2RpY3RfXykKKyAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgeC5mb28gPSBbNDJdCisgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5LmZvbyBpcyBub3QgeC5mb28pCisKKyAgICBkZWYgdGVzdF9yZWNvbnN0cnVjdF9zdGF0ZV9zZXRzdGF0ZShzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChDLCAoKSwgc2VsZi5fX2RpY3RfXykKKyAgICAgICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKHN0YXRlKQorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5fX2RpY3RfXywgb3RoZXIuX19kaWN0X18pCisgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICB4ID0gQygpCisgICAgICAgIHguZm9vID0gWzQyXQorICAgICAgICB5ID0gY29weS5jb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgbm90IHguZm9vKQorCisgICAgZGVmIHRlc3RfcmVjb25zdHJ1Y3RfcmVmbGV4aXZlKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgeC5mb28gPSB4CisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgeSkKKworICAgICMgQWRkaXRpb25zIGZvciBQeXRob24gMi4zIGFuZCBwaWNrbGUgcHJvdG9jb2wgMgorCisgICAgZGVmIHRlc3RfcmVkdWNlXzR0dXBsZShzZWxmKToKKyAgICAgICAgY2xhc3MgQyhsaXN0KToKKyAgICAgICAgICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoQywgKCksIHNlbGYuX19kaWN0X18sIGl0ZXIoc2VsZikpCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChjbXAobGlzdChzZWxmKSwgbGlzdChvdGhlcikpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICBjbXAoc2VsZi5fX2RpY3RfXywgb3RoZXIuX19kaWN0X18pKQorICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKyAgICAgICAgeCA9IEMoW1sxLCAyXSwgM10pCisgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyBub3QgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbMF0gaXMgeVswXSkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyBub3QgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbMF0gaXMgbm90IHlbMF0pCisKKyAgICBkZWYgdGVzdF9yZWR1Y2VfNXR1cGxlKHNlbGYpOgorICAgICAgICBjbGFzcyBDKGRpY3QpOgorICAgICAgICAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChDLCAoKSwgc2VsZi5fX2RpY3RfXywgTm9uZSwgc2VsZi5pdGVyaXRlbXMoKSkKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKGNtcChkaWN0KHNlbGYpLCBsaXN0KGRpY3QpKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgY21wKHNlbGYuX19kaWN0X18sIG90aGVyLl9fZGljdF9fKSkKKyAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgIHggPSBDKFsoImZvbyIsIFsxLCAyXSksICgiYmFyIiwgMyldKQorICAgICAgICB5ID0gY29weS5jb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WyJmb28iXSBpcyB5WyJmb28iXSkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyBub3QgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbImZvbyJdIGlzIG5vdCB5WyJmb28iXSkKKworICAgIGRlZiB0ZXN0X2NvcHlfc2xvdHMoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiZm9vIl0KKyAgICAgICAgeCA9IEMoKQorICAgICAgICB4LmZvbyA9IFs0Ml0KKyAgICAgICAgeSA9IGNvcHkuY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5mb28gaXMgeS5mb28pCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9zbG90cyhzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWyJmb28iXQorICAgICAgICB4ID0gQygpCisgICAgICAgIHguZm9vID0gWzQyXQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZm9vLCB5LmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguZm9vIGlzIG5vdCB5LmZvbykKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2RpY3Rfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEMoZGljdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZD1Ob25lKToKKyAgICAgICAgICAgICAgICBpZiBub3QgZDoKKyAgICAgICAgICAgICAgICAgICAgZCA9IHt9CisgICAgICAgICAgICAgICAgc2VsZi5fa2V5cyA9IGxpc3QoZC5rZXlzKCkpCisgICAgICAgICAgICAgICAgZGljdC5fX2luaXRfXyhzZWxmLCBkKQorICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgaXRlbSk6CisgICAgICAgICAgICAgICAgZGljdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIGl0ZW0pCisgICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmLl9rZXlzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9rZXlzLmFwcGVuZChrZXkpCisgICAgICAgIHggPSBDKGQ9eydmb28nOjB9KQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fa2V5cywgeS5fa2V5cykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHhbJ2JhciddID0gMQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHgsIHkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoeC5fa2V5cywgeS5fa2V5cykKKworICAgIGRlZiB0ZXN0X2NvcHlfbGlzdF9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgQyhsaXN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgeCA9IEMoW1sxLCAyXSwgM10pCisgICAgICAgIHguZm9vID0gWzQsIDVdCisgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHgpLCBsaXN0KHkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZm9vLCB5LmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbMF0gaXMgeVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguZm9vIGlzIHkuZm9vKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfbGlzdF9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgQyhsaXN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgeCA9IEMoW1sxLCAyXSwgM10pCisgICAgICAgIHguZm9vID0gWzQsIDVdCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4KSwgbGlzdCh5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZvbywgeS5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIG5vdCB5WzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5mb28gaXMgbm90IHkuZm9vKQorCisgICAgZGVmIHRlc3RfY29weV90dXBsZV9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgQyh0dXBsZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHggPSBDKFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZSh4KSwgKDEsIDIsIDMpKQorICAgICAgICB5ID0gY29weS5jb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoeSksICgxLCAyLCAzKSkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3R1cGxlX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBDKHR1cGxlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgeCA9IEMoW1sxLCAyXSwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoeCksIChbMSwgMl0sIDMpKQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKHkpLCAoWzEsIDJdLCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIG5vdCB5WzBdKQorCisgICAgZGVmIHRlc3RfZ2V0c3RhdGVfZXhjKHNlbGYpOgorICAgICAgICBjbGFzcyBFdmlsU3RhdGUob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImFpbid0IGdvdCBubyBzdGlja2luJyBzdGF0ZSIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29weS5jb3B5LCBFdmlsU3RhdGUoKSkKKworICAgIGRlZiB0ZXN0X2NvcHlfZnVuY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weS5jb3B5KGdsb2JhbF9mb28pLCBnbG9iYWxfZm9vKQorICAgICAgICBkZWYgZm9vKHgsIHkpOiByZXR1cm4geCt5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weS5jb3B5KGZvbyksIGZvbykKKyAgICAgICAgYmFyID0gbGFtYmRhOiBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weS5jb3B5KGJhciksIGJhcikKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuZGVlcGNvcHkoZ2xvYmFsX2ZvbyksIGdsb2JhbF9mb28pCisgICAgICAgIGRlZiBmb28oeCwgeSk6IHJldHVybiB4K3kKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3B5LmRlZXBjb3B5KGZvbyksIGZvbykKKyAgICAgICAgYmFyID0gbGFtYmRhOiBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weS5kZWVwY29weShiYXIpLCBiYXIpCisKKyAgICBkZWYgX2NoZWNrX3dlYWtyZWYoc2VsZiwgX2NvcHkpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG9iaiA9IEMoKQorICAgICAgICB4ID0gd2Vha3JlZi5yZWYob2JqKQorICAgICAgICB5ID0gX2NvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgeCkKKyAgICAgICAgZGVsIG9iagorICAgICAgICB5ID0gX2NvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgeCkKKworICAgIGRlZiB0ZXN0X2NvcHlfd2Vha3JlZihzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfd2Vha3JlZihjb3B5LmNvcHkpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV93ZWFrcmVmKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja193ZWFrcmVmKGNvcHkuZGVlcGNvcHkpCisKKyAgICBkZWYgX2NoZWNrX2NvcHlfd2Vha2RpY3Qoc2VsZiwgX2RpY3R0eXBlKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBhLCBiLCBjLCBkID0gW0MoKSBmb3IgaSBpbiB4cmFuZ2UoNCldCisgICAgICAgIHUgPSBfZGljdHR5cGUoKQorICAgICAgICB1W2FdID0gYgorICAgICAgICB1W2NdID0gZAorICAgICAgICB2ID0gY29weS5jb3B5KHUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodiBpcyB1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIHUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodlthXSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2W2NdLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2KSwgMikKKyAgICAgICAgZGVsIGMsIGQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odiksIDEpCisgICAgICAgIHgsIHkgPSBDKCksIEMoKQorICAgICAgICAjIFRoZSB1bmRlcmx5aW5nIGNvbnRhaW5lcnMgYXJlIGRlY291cGxlZAorICAgICAgICB2W3hdID0geQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHgsIHUpCisKKyAgICBkZWYgdGVzdF9jb3B5X3dlYWtrZXlkaWN0KHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19jb3B5X3dlYWtkaWN0KHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkpCisKKyAgICBkZWYgdGVzdF9jb3B5X3dlYWt2YWx1ZWRpY3Qoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX2NvcHlfd2Vha2RpY3Qod2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfd2Vha2tleWRpY3Qoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBzZWxmLmkgPSBpCisgICAgICAgIGEsIGIsIGMsIGQgPSBbQyhpKSBmb3IgaSBpbiB4cmFuZ2UoNCldCisgICAgICAgIHUgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKKyAgICAgICAgdVthXSA9IGIKKyAgICAgICAgdVtjXSA9IGQKKyAgICAgICAgIyBLZXlzIGFyZW4ndCBjb3BpZWQsIHZhbHVlcyBhcmUKKyAgICAgICAgdiA9IGNvcHkuZGVlcGNvcHkodSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh2LCB1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2KSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh2W2FdIGlzIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodltjXSBpcyBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZbYV0uaSwgYi5pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZbY10uaSwgZC5pKQorICAgICAgICBkZWwgYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2KSwgMSkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3dlYWt2YWx1ZWRpY3Qoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBzZWxmLmkgPSBpCisgICAgICAgIGEsIGIsIGMsIGQgPSBbQyhpKSBmb3IgaSBpbiB4cmFuZ2UoNCldCisgICAgICAgIHUgPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkoKQorICAgICAgICB1W2FdID0gYgorICAgICAgICB1W2NdID0gZAorICAgICAgICAjIEtleXMgYXJlIGNvcGllZCwgdmFsdWVzIGFyZW4ndAorICAgICAgICB2ID0gY29weS5kZWVwY29weSh1KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHYsIHUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHYpLCAyKQorICAgICAgICAoeCwgeSksICh6LCB0KSA9IHNvcnRlZCh2Lml0ZW1zKCksIGtleT1sYW1iZGEgcGFpcjogcGFpclswXS5pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHggaXMgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmksIGEuaSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh6IGlzIGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoei5pLCBjLmkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0IGlzIGQpCisgICAgICAgIGRlbCB4LCB5LCB6LCB0CisgICAgICAgIGRlbCBkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHYpLCAxKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfYm91bmRfbWV0aG9kKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBtKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZiA9IEZvbygpCisgICAgICAgIGYuYiA9IGYubQorICAgICAgICBnID0gY29weS5kZWVwY29weShmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGcubSwgZy5iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZy5iLmltX3NlbGYgaXMgZykKKyAgICAgICAgZy5iKCkKKworCitkZWYgZ2xvYmFsX2Zvbyh4LCB5KTogcmV0dXJuIHgreQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0Q29weSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29weS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb3B5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQwMDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29weS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29weS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb3B5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQwMDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29weS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29weV9yZWcucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb3B5X3JlZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2RiOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29weV9yZWcucHkKQEAgLTAsMCArMSwxMjEgQEAKK2ltcG9ydCBjb3B5X3JlZworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCBFeHRlbnNpb25TYXZlcgorCitjbGFzcyBDOgorICAgIHBhc3MKKworCitjbGFzcyBXaXRob3V0U2xvdHMob2JqZWN0KToKKyAgICBwYXNzCisKK2NsYXNzIFdpdGhXZWFrcmVmKG9iamVjdCk6CisgICAgX19zbG90c19fID0gKCdfX3dlYWtyZWZfXycsKQorCitjbGFzcyBXaXRoUHJpdmF0ZShvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9ICgnX19zcGFtJywpCisKK2NsYXNzIFdpdGhTaW5nbGVTdHJpbmcob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAnc3BhbScKKworY2xhc3MgV2l0aEluaGVyaXRlZChXaXRoU2luZ2xlU3RyaW5nKToKKyAgICBfX3Nsb3RzX18gPSAoJ2VnZ3MnLCkKKworCitjbGFzcyBDb3B5UmVnVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY2xhc3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29weV9yZWcucGlja2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDLCBOb25lLCBOb25lKQorCisgICAgZGVmIHRlc3Rfbm9uY2FsbGFibGVfcmVkdWNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvcHlfcmVnLnBpY2tsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSgxKSwgIm5vdCBhIGNhbGxhYmxlIikKKworICAgIGRlZiB0ZXN0X25vbmNhbGxhYmxlX2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvcHlfcmVnLnBpY2tsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSgxKSwgaW50LCAibm90IGEgY2FsbGFibGUiKQorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgaW1wb3J0IGNvcHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBjb3B5LmNvcHkoVHJ1ZSkpCisKKyAgICBkZWYgdGVzdF9leHRlbnNpb25fcmVnaXN0cnkoc2VsZik6CisgICAgICAgIG1vZCwgZnVuYywgY29kZSA9ICdqdW5rMSAnLCAnIGp1bmsyJywgMHhhYmNkCisgICAgICAgIGUgPSBFeHRlbnNpb25TYXZlcihjb2RlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFNob3VsZG4ndCBiZSBpbiByZWdpc3RyeSBub3cuCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb3B5X3JlZy5yZW1vdmVfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLCBmdW5jLCBjb2RlKQorICAgICAgICAgICAgY29weV9yZWcuYWRkX2V4dGVuc2lvbihtb2QsIGZ1bmMsIGNvZGUpCisgICAgICAgICAgICAjIFNob3VsZCBiZSBpbiB0aGUgcmVnaXN0cnkuCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY29weV9yZWcuX2V4dGVuc2lvbl9yZWdpc3RyeVttb2QsIGZ1bmNdID09IGNvZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY29weV9yZWcuX2ludmVydGVkX3JlZ2lzdHJ5W2NvZGVdID09IChtb2QsIGZ1bmMpKQorICAgICAgICAgICAgIyBTaG91bGRuJ3QgYmUgaW4gdGhlIGNhY2hlLgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihjb2RlLCBjb3B5X3JlZy5fZXh0ZW5zaW9uX2NhY2hlKQorICAgICAgICAgICAgIyBSZWR1bmRhbnQgcmVnaXN0cmF0aW9uIHNob3VsZCBiZSBPSy4KKyAgICAgICAgICAgIGNvcHlfcmVnLmFkZF9leHRlbnNpb24obW9kLCBmdW5jLCBjb2RlKSAgIyBzaG91bGRuJ3QgYmxvdyB1cAorICAgICAgICAgICAgIyBDb25mbGljdGluZyBjb2RlLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29weV9yZWcuYWRkX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZCwgZnVuYywgY29kZSArIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb3B5X3JlZy5yZW1vdmVfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLCBmdW5jLCBjb2RlICsgMSkKKyAgICAgICAgICAgICMgQ29uZmxpY3RpbmcgbW9kdWxlIG5hbWUuCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb3B5X3JlZy5hZGRfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kWzE6XSwgZnVuYywgY29kZSApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb3B5X3JlZy5yZW1vdmVfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kWzE6XSwgZnVuYywgY29kZSApCisgICAgICAgICAgICAjIENvbmZsaWN0aW5nIGZ1bmN0aW9uIG5hbWUuCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb3B5X3JlZy5hZGRfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLCBmdW5jWzE6XSwgY29kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvcHlfcmVnLnJlbW92ZV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QsIGZ1bmNbMTpdLCBjb2RlKQorICAgICAgICAgICAgIyBDYW4ndCByZW1vdmUgb25lIHRoYXQgaXNuJ3QgcmVnaXN0ZXJlZCBhdCBhbGwuCisgICAgICAgICAgICBpZiBjb2RlICsgMSBub3QgaW4gY29weV9yZWcuX2ludmVydGVkX3JlZ2lzdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvcHlfcmVnLnJlbW92ZV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kWzE6XSwgZnVuY1sxOl0sIGNvZGUgKyAxKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBlLnJlc3RvcmUoKQorCisgICAgICAgICMgU2hvdWxkbid0IGJlIHRoZXJlIGFueW1vcmUuCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oKG1vZCwgZnVuYyksIGNvcHlfcmVnLl9leHRlbnNpb25fcmVnaXN0cnkpCisgICAgICAgICMgVGhlIGNvZGUgKm1heSogYmUgaW4gY29weV9yZWcuX2V4dGVuc2lvbl9yZWdpc3RyeSwgdGhvdWdoLCBpZgorICAgICAgICAjIHdlIGhhcHBlbmVkIHRvIHBpY2sgb24gYSByZWdpc3RlcmVkIGNvZGUuICBTbyBkb24ndCBjaGVjayBmb3IKKyAgICAgICAgIyB0aGF0LgorCisgICAgICAgICMgQ2hlY2sgdmFsaWQgY29kZXMgYXQgdGhlIGxpbWl0cy4KKyAgICAgICAgZm9yIGNvZGUgaW4gMSwgMHg3ZmZmZmZmZjoKKyAgICAgICAgICAgIGUgPSBFeHRlbnNpb25TYXZlcihjb2RlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvcHlfcmVnLmFkZF9leHRlbnNpb24obW9kLCBmdW5jLCBjb2RlKQorICAgICAgICAgICAgICAgIGNvcHlfcmVnLnJlbW92ZV9leHRlbnNpb24obW9kLCBmdW5jLCBjb2RlKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBlLnJlc3RvcmUoKQorCisgICAgICAgICMgRW5zdXJlIGludmFsaWQgY29kZXMgYmxvdyB1cC4KKyAgICAgICAgZm9yIGNvZGUgaW4gLTEsIDAsIDB4ODAwMDAwMDBMOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29weV9yZWcuYWRkX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZCwgZnVuYywgY29kZSkKKworICAgIGRlZiB0ZXN0X3Nsb3RuYW1lcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3B5X3JlZy5fc2xvdG5hbWVzKFdpdGhvdXRTbG90cyksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHlfcmVnLl9zbG90bmFtZXMoV2l0aFdlYWtyZWYpLCBbXSkKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ19XaXRoUHJpdmF0ZV9fc3BhbSddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weV9yZWcuX3Nsb3RuYW1lcyhXaXRoUHJpdmF0ZSksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHlfcmVnLl9zbG90bmFtZXMoV2l0aFNpbmdsZVN0cmluZyksIFsnc3BhbSddKQorICAgICAgICBleHBlY3RlZCA9IFsnZWdncycsICdzcGFtJ10KKyAgICAgICAgZXhwZWN0ZWQuc29ydCgpCisgICAgICAgIHJlc3VsdCA9IGNvcHlfcmVnLl9zbG90bmFtZXMoV2l0aEluaGVyaXRlZCkKKyAgICAgICAgcmVzdWx0LnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ29weVJlZ1Rlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHlfcmVnLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHlfcmVnLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGM2ODczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29weV9yZWcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHlfcmVnLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHlfcmVnLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGM2ODczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29weV9yZWcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NwaWNrbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcGlja2xlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzcwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcGlja2xlLnB5CkBAIC0wLDAgKzEsMjM3IEBACitpbXBvcnQgY1BpY2tsZQoraW1wb3J0IGNTdHJpbmdJTworaW1wb3J0IGlvCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC5waWNrbGV0ZXN0ZXIgaW1wb3J0IChBYnN0cmFjdFBpY2tsZVRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGlja2xlTW9kdWxlVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQaWNrbGVyVW5waWNrbGVyT2JqZWN0VGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnbWVtUGlja2xlVGVzdHMpCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBjU3RyaW5nSU9NaXhpbjoKKyAgICBvdXRwdXQgPSBpbnB1dCA9IGNTdHJpbmdJTy5TdHJpbmdJTworCisgICAgZGVmIGNsb3NlKHNlbGYsIGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIEJ5dGVzSU9NaXhpbjoKKyAgICBvdXRwdXQgPSBpbnB1dCA9IGlvLkJ5dGVzSU8KKworICAgIGRlZiBjbG9zZShzZWxmLCBmKToKKyAgICAgICAgcGFzcworCitjbGFzcyBGaWxlSU9NaXhpbjoKKworICAgIGRlZiBvdXRwdXQoc2VsZik6CisgICAgICAgIHJldHVybiBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3YisnKQorCisgICAgZGVmIGlucHV0KHNlbGYsIGRhdGEpOgorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAnd2IrJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgZik6CisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKworY2xhc3MgY1BpY2tsZVRlc3RzKEFic3RyYWN0UGlja2xlVGVzdHMsIEFic3RyYWN0UGlja2xlTW9kdWxlVGVzdHMpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmR1bXBzID0gY1BpY2tsZS5kdW1wcworICAgICAgICBzZWxmLmxvYWRzID0gY1BpY2tsZS5sb2FkcworCisgICAgZXJyb3IgPSBjUGlja2xlLkJhZFBpY2tsZUdldAorICAgIG1vZHVsZSA9IGNQaWNrbGUKKworY2xhc3MgY1BpY2tsZVBpY2tsZXJUZXN0cyhBYnN0cmFjdFBpY2tsZVRlc3RzKToKKworICAgIGRlZiBkdW1wcyhzZWxmLCBhcmcsIHByb3RvPTApOgorICAgICAgICBmID0gc2VsZi5vdXRwdXQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0gY1BpY2tsZS5QaWNrbGVyKGYsIHByb3RvKQorICAgICAgICAgICAgcC5kdW1wKGFyZykKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNsb3NlKGYpCisKKyAgICBkZWYgbG9hZHMoc2VsZiwgYnVmKToKKyAgICAgICAgZiA9IHNlbGYuaW5wdXQoYnVmKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0gY1BpY2tsZS5VbnBpY2tsZXIoZikKKyAgICAgICAgICAgIHJldHVybiBwLmxvYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jbG9zZShmKQorCisgICAgZXJyb3IgPSBjUGlja2xlLkJhZFBpY2tsZUdldAorCitjbGFzcyBjU3RyaW5nSU9DUGlja2xlclRlc3RzKGNTdHJpbmdJT01peGluLCBjUGlja2xlUGlja2xlclRlc3RzKToKKyAgICBwYXNzCisKK2NsYXNzIEJ5dGVzSU9DUGlja2xlclRlc3RzKEJ5dGVzSU9NaXhpbiwgY1BpY2tsZVBpY2tsZXJUZXN0cyk6CisgICAgcGFzcworCitjbGFzcyBGaWxlSU9DUGlja2xlclRlc3RzKEZpbGVJT01peGluLCBjUGlja2xlUGlja2xlclRlc3RzKToKKyAgICBwYXNzCisKKworY2xhc3MgY1BpY2tsZUxpc3RQaWNrbGVyVGVzdHMoQWJzdHJhY3RQaWNrbGVUZXN0cyk6CisKKyAgICBkZWYgZHVtcHMoc2VsZiwgYXJnLCBwcm90bz0wKToKKyAgICAgICAgcCA9IGNQaWNrbGUuUGlja2xlcihwcm90bykKKyAgICAgICAgcC5kdW1wKGFyZykKKyAgICAgICAgcmV0dXJuIHAuZ2V0dmFsdWUoKQorCisgICAgZGVmIGxvYWRzKHNlbGYsICphcmdzKToKKyAgICAgICAgZiA9IHNlbGYuaW5wdXQoYXJnc1swXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IGNQaWNrbGUuVW5waWNrbGVyKGYpCisgICAgICAgICAgICByZXR1cm4gcC5sb2FkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoZikKKworICAgIGVycm9yID0gY1BpY2tsZS5CYWRQaWNrbGVHZXQKKworY2xhc3MgY1N0cmluZ0lPQ1BpY2tsZXJMaXN0VGVzdHMoY1N0cmluZ0lPTWl4aW4sIGNQaWNrbGVMaXN0UGlja2xlclRlc3RzKToKKyAgICBwYXNzCisKK2NsYXNzIEJ5dGVzSU9DUGlja2xlckxpc3RUZXN0cyhCeXRlc0lPTWl4aW4sIGNQaWNrbGVMaXN0UGlja2xlclRlc3RzKToKKyAgICBwYXNzCisKK2NsYXNzIEZpbGVJT0NQaWNrbGVyTGlzdFRlc3RzKEZpbGVJT01peGluLCBjUGlja2xlTGlzdFBpY2tsZXJUZXN0cyk6CisgICAgcGFzcworCisKK2NsYXNzIGNQaWNrbGVGYXN0UGlja2xlclRlc3RzKEFic3RyYWN0UGlja2xlVGVzdHMpOgorCisgICAgZGVmIGR1bXBzKHNlbGYsIGFyZywgcHJvdG89MCk6CisgICAgICAgIGYgPSBzZWxmLm91dHB1dCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSBjUGlja2xlLlBpY2tsZXIoZiwgcHJvdG8pCisgICAgICAgICAgICBwLmZhc3QgPSAxCisgICAgICAgICAgICBwLmR1bXAoYXJnKQorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICByZXR1cm4gZi5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoZikKKworICAgIGRlZiBsb2FkcyhzZWxmLCAqYXJncyk6CisgICAgICAgIGYgPSBzZWxmLmlucHV0KGFyZ3NbMF0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSBjUGlja2xlLlVucGlja2xlcihmKQorICAgICAgICAgICAgcmV0dXJuIHAubG9hZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNsb3NlKGYpCisKKyAgICBlcnJvciA9IGNQaWNrbGUuQmFkUGlja2xlR2V0CisKKyAgICBkZWYgdGVzdF9yZWN1cnNpdmVfbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQaWNrbGVUZXN0cy50ZXN0X3JlY3Vyc2l2ZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKQorCisgICAgZGVmIHRlc3RfcmVjdXJzaXZlX3R1cGxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBpY2tsZVRlc3RzLnRlc3RfcmVjdXJzaXZlX3R1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKQorCisgICAgZGVmIHRlc3RfcmVjdXJzaXZlX2luc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGlja2xlVGVzdHMudGVzdF9yZWN1cnNpdmVfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZikKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV9kaWN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBpY2tsZVRlc3RzLnRlc3RfcmVjdXJzaXZlX2RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCisKKyAgICBkZWYgdGVzdF9yZWN1cnNpdmVfbXVsdGkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGlja2xlVGVzdHMudGVzdF9yZWN1cnNpdmVfbXVsdGksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCisKKyAgICBkZWYgdGVzdF9ub25yZWN1cnNpdmVfZGVlcChzZWxmKToKKyAgICAgICAgIyBJZiBpdCdzIG5vdCBjeWNsaWMsIGl0IHNob3VsZCBwaWNrbGUgT0sgZXZlbiBpZiB0aGUgbmVzdGluZworICAgICAgICAjIGRlcHRoIGV4Y2VlZHMgUFlfQ1BJQ0tMRV9GQVNUX0xJTUlULiAgVGhhdCBoYXBwZW5zIHRvIGJlCisgICAgICAgICMgNTAgdG9kYXkuICBKYWNrIEphbnNlbiByZXBvcnRlZCBzdGFjayBvdmVyZmxvdyBvbiBNYWMgT1MgOQorICAgICAgICAjIGF0IDY0LgorICAgICAgICBhID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNjApOgorICAgICAgICAgICAgYSA9IFthXQorICAgICAgICBiID0gc2VsZi5sb2FkcyhzZWxmLmR1bXBzKGEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisKK2NsYXNzIGNTdHJpbmdJT0NQaWNrbGVyRmFzdFRlc3RzKGNTdHJpbmdJT01peGluLCBjUGlja2xlRmFzdFBpY2tsZXJUZXN0cyk6CisgICAgcGFzcworCitjbGFzcyBCeXRlc0lPQ1BpY2tsZXJGYXN0VGVzdHMoQnl0ZXNJT01peGluLCBjUGlja2xlRmFzdFBpY2tsZXJUZXN0cyk6CisgICAgcGFzcworCitjbGFzcyBGaWxlSU9DUGlja2xlckZhc3RUZXN0cyhGaWxlSU9NaXhpbiwgY1BpY2tsZUZhc3RQaWNrbGVyVGVzdHMpOgorICAgIHBhc3MKKworCitjbGFzcyBjUGlja2xlUGlja2xlclVucGlja2xlck9iamVjdFRlc3RzKEFic3RyYWN0UGlja2xlclVucGlja2xlck9iamVjdFRlc3RzKToKKworICAgIHBpY2tsZXJfY2xhc3MgPSBjUGlja2xlLlBpY2tsZXIKKyAgICB1bnBpY2tsZXJfY2xhc3MgPSBjUGlja2xlLlVucGlja2xlcgorCitjbGFzcyBjUGlja2xlQmlnbWVtUGlja2xlVGVzdHMoQmlnbWVtUGlja2xlVGVzdHMpOgorCisgICAgZGVmIGR1bXBzKHNlbGYsIGFyZywgcHJvdG89MCwgZmFzdD0wKToKKyAgICAgICAgIyBJZ25vcmUgZmFzdAorICAgICAgICByZXR1cm4gY1BpY2tsZS5kdW1wcyhhcmcsIHByb3RvKQorCisgICAgZGVmIGxvYWRzKHNlbGYsIGJ1Zik6CisgICAgICAgICMgSWdub3JlIGZhc3QKKyAgICAgICAgcmV0dXJuIGNQaWNrbGUubG9hZHMoYnVmKQorCisKK2NsYXNzIE5vZGUob2JqZWN0KToKKyAgICBwYXNzCisKK2NsYXNzIGNQaWNrbGVEZWVwUmVjdXJzaXZlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9pc3N1ZTI3MDIoc2VsZik6CisgICAgICAgICMgVGhpcyBzaG91bGQgcmFpc2UgYSBSZWN1cnNpb25MaW1pdCBidXQgaW4gc29tZQorICAgICAgICAjIHBsYXRmb3JtcyAoRnJlZUJTRCwgd2luMzIpIHNvbWV0aW1lcyByYWlzZXMgS2V5RXJyb3IgaW5zdGVhZCwKKyAgICAgICAgIyBvciBqdXN0IHNpbGVudGx5IHRlcm1pbmF0ZXMgdGhlIGludGVycHJldGVyICg9Y3Jhc2hlcykuCisgICAgICAgIG5vZGVzID0gW05vZGUoKSBmb3IgaSBpbiByYW5nZSg1MDApXQorICAgICAgICBmb3IgbiBpbiBub2RlczoKKyAgICAgICAgICAgIG4uY29ubmVjdGlvbnMgPSBsaXN0KG5vZGVzKQorICAgICAgICAgICAgbi5jb25uZWN0aW9ucy5yZW1vdmUobikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKEF0dHJpYnV0ZUVycm9yLCBSdW50aW1lRXJyb3IpLCBjUGlja2xlLmR1bXBzLCBuKQorCisgICAgZGVmIHRlc3RfaXNzdWUzMTc5KHNlbGYpOgorICAgICAgICAjIFNhZmUgdGVzdCwgYmVjYXVzZSBJIGJyb2tlIHRoaXMgY2FzZSB3aGVuIGZpeGluZyB0aGUKKyAgICAgICAgIyBiZWhhdmlvdXIgZm9yIHRoZSBwcmV2aW91cyB0ZXN0LgorICAgICAgICByZXM9W10KKyAgICAgICAgZm9yIHggaW4gcmFuZ2UoMSwyMDAwKToKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoZGljdChkb2M9eCwgc2ltaWxhcj1bXSkpCisgICAgICAgIGNQaWNrbGUuZHVtcHMocmVzKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBjUGlja2xlVGVzdHMsCisgICAgICAgIGNTdHJpbmdJT0NQaWNrbGVyVGVzdHMsCisgICAgICAgIEJ5dGVzSU9DUGlja2xlclRlc3RzLAorICAgICAgICBGaWxlSU9DUGlja2xlclRlc3RzLAorICAgICAgICBjU3RyaW5nSU9DUGlja2xlckxpc3RUZXN0cywKKyAgICAgICAgQnl0ZXNJT0NQaWNrbGVyTGlzdFRlc3RzLAorICAgICAgICBGaWxlSU9DUGlja2xlckxpc3RUZXN0cywKKyAgICAgICAgY1N0cmluZ0lPQ1BpY2tsZXJGYXN0VGVzdHMsCisgICAgICAgIEJ5dGVzSU9DUGlja2xlckZhc3RUZXN0cywKKyAgICAgICAgRmlsZUlPQ1BpY2tsZXJGYXN0VGVzdHMsCisgICAgICAgIGNQaWNrbGVEZWVwUmVjdXJzaXZlLAorICAgICAgICBjUGlja2xlUGlja2xlclVucGlja2xlck9iamVjdFRlc3RzLAorICAgICAgICBjUGlja2xlQmlnbWVtUGlja2xlVGVzdHMsCisgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcGlja2xlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NwaWNrbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjlhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcGlja2xlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcGlja2xlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NwaWNrbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjlhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcGlja2xlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcHJvZmlsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nwcm9maWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmM2ZlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcHJvZmlsZS5weQpAQCAtMCwwICsxLDEyNyBAQAorIiIiVGVzdCBzdWl0ZSBmb3IgdGhlIGNQcm9maWxlIG1vZHVsZS4iIiIKKworaW1wb3J0IHN5cworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBURVNURk4sIHVubGluaworCisjIHJpcCBvZmYgYWxsIGludGVyZXN0aW5nIHN0dWZmIGZyb20gdGVzdF9wcm9maWxlCitpbXBvcnQgY1Byb2ZpbGUKK2Zyb20gdGVzdC50ZXN0X3Byb2ZpbGUgaW1wb3J0IFByb2ZpbGVUZXN0LCByZWdlbmVyYXRlX2V4cGVjdGVkX291dHB1dAorCitjbGFzcyBDUHJvZmlsZVRlc3QoUHJvZmlsZVRlc3QpOgorICAgIHByb2ZpbGVyY2xhc3MgPSBjUHJvZmlsZS5Qcm9maWxlCisgICAgZXhwZWN0ZWRfbGlzdF9zb3J0X291dHB1dCA9ICJ7bWV0aG9kICdzb3J0JyBvZiAnbGlzdCcgb2JqZWN0c30iCisKKyAgICAjIElzc3VlIDM4OTUuCisgICAgZGVmIHRlc3RfYmFkX2NvdW50ZXJfZHVyaW5nX2RlYWxsb2Moc2VsZik6CisgICAgICAgIGltcG9ydCBfbHNwcm9mCisgICAgICAgICMgTXVzdCB1c2UgYSBmaWxlIGFzIFN0cmluZ0lPIGRvZXNuJ3QgdHJpZ2dlciB0aGUgYnVnLgorICAgICAgICBzeXMuc3RkZXJyID0gb3BlbihURVNURk4sICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2JqID0gX2xzcHJvZi5Qcm9maWxlcihsYW1iZGE6IGludCkKKyAgICAgICAgICAgIG9iai5lbmFibGUoKQorICAgICAgICAgICAgb2JqID0gX2xzcHJvZi5Qcm9maWxlcigxKQorICAgICAgICAgICAgb2JqLmRpc2FibGUoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHN5cy5fX3N0ZGVycl9fCisgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoQ1Byb2ZpbGVUZXN0KQorCitkZWYgbWFpbigpOgorICAgIGlmICctcicgbm90IGluIHN5cy5hcmd2OgorICAgICAgICB0ZXN0X21haW4oKQorICAgIGVsc2U6CisgICAgICAgIHJlZ2VuZXJhdGVfZXhwZWN0ZWRfb3V0cHV0KF9fZmlsZV9fLCBDUHJvZmlsZVRlc3QpCisKKworIyBEb24ndCByZW1vdmUgdGhpcyBjb21tZW50LiBFdmVyeXRoaW5nIGJlbG93IGl0IGlzIGF1dG8tZ2VuZXJhdGVkLgorIy0tY3V0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0NQcm9maWxlVGVzdC5leHBlY3RlZF9vdXRwdXRbJ3ByaW50X3N0YXRzJ10gPSAiIiJcCisgICAgICAgICAxMjYgZnVuY3Rpb24gY2FsbHMgKDEwNiBwcmltaXRpdmUgY2FsbHMpIGluIDEuMDAwIHNlY29uZHMKKworICAgT3JkZXJlZCBieTogc3RhbmRhcmQgbmFtZQorCisgICBuY2FsbHMgIHRvdHRpbWUgIHBlcmNhbGwgIGN1bXRpbWUgIHBlcmNhbGwgZmlsZW5hbWU6bGluZW5vKGZ1bmN0aW9uKQorICAgICAgICAxICAgIDAuMDAwICAgIDAuMDAwICAgIDEuMDAwICAgIDEuMDAwIDxzdHJpbmc+OjEoPG1vZHVsZT4pCisgICAgICAgMjggICAgMC4wMjggICAgMC4wMDEgICAgMC4wMjggICAgMC4wMDEgcHJvZmlsZWUucHk6MTEwKF9fZ2V0YXR0cl9fKQorICAgICAgICAxICAgIDAuMjcwICAgIDAuMjcwICAgIDEuMDAwICAgIDEuMDAwIHByb2ZpbGVlLnB5OjI1KHRlc3RmdW5jKQorICAgICAyMy8zICAgIDAuMTUwICAgIDAuMDA3ICAgIDAuMTcwICAgIDAuMDU3IHByb2ZpbGVlLnB5OjM1KGZhY3RvcmlhbCkKKyAgICAgICAyMCAgICAwLjAyMCAgICAwLjAwMSAgICAwLjAyMCAgICAwLjAwMSBwcm9maWxlZS5weTo0OChtdWwpCisgICAgICAgIDIgICAgMC4wNDAgICAgMC4wMjAgICAgMC42MDAgICAgMC4zMDAgcHJvZmlsZWUucHk6NTUoaGVscGVyKQorICAgICAgICA0ICAgIDAuMTE2ICAgIDAuMDI5ICAgIDAuMTIwICAgIDAuMDMwIHByb2ZpbGVlLnB5OjczKGhlbHBlcjEpCisgICAgICAgIDIgICAgMC4wMDAgICAgMC4wMDAgICAgMC4xNDAgICAgMC4wNzAgcHJvZmlsZWUucHk6ODQoaGVscGVyMl9pbmRpcmVjdCkKKyAgICAgICAgOCAgICAwLjMxMiAgICAwLjAzOSAgICAwLjQwMCAgICAwLjA1MCBwcm9maWxlZS5weTo4OChoZWxwZXIyKQorICAgICAgICA4ICAgIDAuMDY0ICAgIDAuMDA4ICAgIDAuMDgwICAgIDAuMDEwIHByb2ZpbGVlLnB5Ojk4KHN1YmhlbHBlcikKKyAgICAgICAxMiAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAxMiAgICAwLjAwMSB7aGFzYXR0cn0KKyAgICAgICAgNCAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCB7bWV0aG9kICdhcHBlbmQnIG9mICdsaXN0JyBvYmplY3RzfQorICAgICAgICAxICAgIDAuMDAwICAgIDAuMDAwICAgIDAuMDAwICAgIDAuMDAwIHttZXRob2QgJ2Rpc2FibGUnIG9mICdfbHNwcm9mLlByb2ZpbGVyJyBvYmplY3RzfQorICAgICAgICA4ICAgIDAuMDAwICAgIDAuMDAwICAgIDAuMDAwICAgIDAuMDAwIHtyYW5nZX0KKyAgICAgICAgNCAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCB7c3lzLmV4Y19pbmZvfQorCisKKyIiIgorQ1Byb2ZpbGVUZXN0LmV4cGVjdGVkX291dHB1dFsncHJpbnRfY2FsbGVycyddID0gIiIiXAorICAgT3JkZXJlZCBieTogc3RhbmRhcmQgbmFtZQorCitGdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBjYWxsZWQgYnkuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jYWxscyAgdG90dGltZSAgY3VtdGltZQorPHN0cmluZz46MSg8bW9kdWxlPikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LQorcHJvZmlsZWUucHk6MTEwKF9fZ2V0YXR0cl9fKSAgICAgICAgICAgICAgICAgICAgICA8LSAgICAgIDE2ICAgIDAuMDE2ICAgIDAuMDE2ICBwcm9maWxlZS5weTo5OChzdWJoZWxwZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIgICAgMC4wMTIgICAgMC4wMTIgIHtoYXNhdHRyfQorcHJvZmlsZWUucHk6MjUodGVzdGZ1bmMpICAgICAgICAgICAgICAgICAgICAgICAgICA8LSAgICAgICAxICAgIDAuMjcwICAgIDEuMDAwICA8c3RyaW5nPjoxKDxtb2R1bGU+KQorcHJvZmlsZWUucHk6MzUoZmFjdG9yaWFsKSAgICAgICAgICAgICAgICAgICAgICAgICA8LSAgICAgICAxICAgIDAuMDE0ICAgIDAuMTMwICBwcm9maWxlZS5weToyNSh0ZXN0ZnVuYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAvMyAgICAwLjEzMCAgICAwLjE0NyAgcHJvZmlsZWUucHk6MzUoZmFjdG9yaWFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgIDAuMDA2ICAgIDAuMDQwICBwcm9maWxlZS5weTo4NChoZWxwZXIyX2luZGlyZWN0KQorcHJvZmlsZWUucHk6NDgobXVsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LSAgICAgIDIwICAgIDAuMDIwICAgIDAuMDIwICBwcm9maWxlZS5weTozNShmYWN0b3JpYWwpCitwcm9maWxlZS5weTo1NShoZWxwZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtICAgICAgIDIgICAgMC4wNDAgICAgMC42MDAgIHByb2ZpbGVlLnB5OjI1KHRlc3RmdW5jKQorcHJvZmlsZWUucHk6NzMoaGVscGVyMSkgICAgICAgICAgICAgICAgICAgICAgICAgICA8LSAgICAgICA0ICAgIDAuMTE2ICAgIDAuMTIwICBwcm9maWxlZS5weTo1NShoZWxwZXIpCitwcm9maWxlZS5weTo4NChoZWxwZXIyX2luZGlyZWN0KSAgICAgICAgICAgICAgICAgIDwtICAgICAgIDIgICAgMC4wMDAgICAgMC4xNDAgIHByb2ZpbGVlLnB5OjU1KGhlbHBlcikKK3Byb2ZpbGVlLnB5Ojg4KGhlbHBlcjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0gICAgICAgNiAgICAwLjIzNCAgICAwLjMwMCAgcHJvZmlsZWUucHk6NTUoaGVscGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgIDAuMDc4ICAgIDAuMTAwICBwcm9maWxlZS5weTo4NChoZWxwZXIyX2luZGlyZWN0KQorcHJvZmlsZWUucHk6OTgoc3ViaGVscGVyKSAgICAgICAgICAgICAgICAgICAgICAgICA8LSAgICAgICA4ICAgIDAuMDY0ICAgIDAuMDgwICBwcm9maWxlZS5weTo4OChoZWxwZXIyKQore2hhc2F0dHJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LSAgICAgICA0ICAgIDAuMDAwICAgIDAuMDA0ICBwcm9maWxlZS5weTo3MyhoZWxwZXIxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAgIDAuMDAwICAgIDAuMDA4ICBwcm9maWxlZS5weTo4OChoZWxwZXIyKQore21ldGhvZCAnYXBwZW5kJyBvZiAnbGlzdCcgb2JqZWN0c30gICAgICAgICAgICAgICA8LSAgICAgICA0ICAgIDAuMDAwICAgIDAuMDAwICBwcm9maWxlZS5weTo3MyhoZWxwZXIxKQore21ldGhvZCAnZGlzYWJsZScgb2YgJ19sc3Byb2YuUHJvZmlsZXInIG9iamVjdHN9ICA8LQore3JhbmdlfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LSAgICAgICA4ICAgIDAuMDAwICAgIDAuMDAwICBwcm9maWxlZS5weTo5OChzdWJoZWxwZXIpCit7c3lzLmV4Y19pbmZvfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtICAgICAgIDQgICAgMC4wMDAgICAgMC4wMDAgIHByb2ZpbGVlLnB5OjczKGhlbHBlcjEpCisKKworIiIiCitDUHJvZmlsZVRlc3QuZXhwZWN0ZWRfb3V0cHV0WydwcmludF9jYWxsZWVzJ10gPSAiIiJcCisgICBPcmRlcmVkIGJ5OiBzdGFuZGFyZCBuYW1lCisKK0Z1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2FsbHMgIHRvdHRpbWUgIGN1bXRpbWUKKzxzdHJpbmc+OjEoPG1vZHVsZT4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gICAgICAgMSAgICAwLjI3MCAgICAxLjAwMCAgcHJvZmlsZWUucHk6MjUodGVzdGZ1bmMpCitwcm9maWxlZS5weToxMTAoX19nZXRhdHRyX18pICAgICAgICAgICAgICAgICAgICAgIC0+Citwcm9maWxlZS5weToyNSh0ZXN0ZnVuYykgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAgICAgIDEgICAgMC4wMTQgICAgMC4xMzAgIHByb2ZpbGVlLnB5OjM1KGZhY3RvcmlhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAwLjA0MCAgICAwLjYwMCAgcHJvZmlsZWUucHk6NTUoaGVscGVyKQorcHJvZmlsZWUucHk6MzUoZmFjdG9yaWFsKSAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgICAyMC8zICAgIDAuMTMwICAgIDAuMTQ3ICBwcm9maWxlZS5weTozNShmYWN0b3JpYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAgICAgMC4wMjAgICAgMC4wMjAgIHByb2ZpbGVlLnB5OjQ4KG11bCkKK3Byb2ZpbGVlLnB5OjQ4KG11bCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4KK3Byb2ZpbGVlLnB5OjU1KGhlbHBlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gICAgICAgNCAgICAwLjExNiAgICAwLjEyMCAgcHJvZmlsZWUucHk6NzMoaGVscGVyMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAwLjAwMCAgICAwLjE0MCAgcHJvZmlsZWUucHk6ODQoaGVscGVyMl9pbmRpcmVjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiAgICAwLjIzNCAgICAwLjMwMCAgcHJvZmlsZWUucHk6ODgoaGVscGVyMikKK3Byb2ZpbGVlLnB5OjczKGhlbHBlcjEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gICAgICAgNCAgICAwLjAwMCAgICAwLjAwNCAge2hhc2F0dHJ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgMC4wMDAgICAgMC4wMDAgIHttZXRob2QgJ2FwcGVuZCcgb2YgJ2xpc3QnIG9iamVjdHN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgMC4wMDAgICAgMC4wMDAgIHtzeXMuZXhjX2luZm99Citwcm9maWxlZS5weTo4NChoZWxwZXIyX2luZGlyZWN0KSAgICAgICAgICAgICAgICAgIC0+ICAgICAgIDIgICAgMC4wMDYgICAgMC4wNDAgIHByb2ZpbGVlLnB5OjM1KGZhY3RvcmlhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAwLjA3OCAgICAwLjEwMCAgcHJvZmlsZWUucHk6ODgoaGVscGVyMikKK3Byb2ZpbGVlLnB5Ojg4KGhlbHBlcjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gICAgICAgOCAgICAwLjA2NCAgICAwLjA4MCAgcHJvZmlsZWUucHk6OTgoc3ViaGVscGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAgIDAuMDAwICAgIDAuMDA4ICB7aGFzYXR0cn0KK3Byb2ZpbGVlLnB5Ojk4KHN1YmhlbHBlcikgICAgICAgICAgICAgICAgICAgICAgICAgLT4gICAgICAxNiAgICAwLjAxNiAgICAwLjAxNiAgcHJvZmlsZWUucHk6MTEwKF9fZ2V0YXR0cl9fKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAgIDAuMDAwICAgIDAuMDAwICB7cmFuZ2V9Cit7aGFzYXR0cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAgICAgMTIgICAgMC4wMTIgICAgMC4wMTIgIHByb2ZpbGVlLnB5OjExMChfX2dldGF0dHJfXykKK3ttZXRob2QgJ2FwcGVuZCcgb2YgJ2xpc3QnIG9iamVjdHN9ICAgICAgICAgICAgICAgLT4KK3ttZXRob2QgJ2Rpc2FibGUnIG9mICdfbHNwcm9mLlByb2ZpbGVyJyBvYmplY3RzfSAgLT4KK3tyYW5nZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4KK3tzeXMuZXhjX2luZm99ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4KKworCisiIiIKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nwcm9maWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nwcm9maWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGZkZmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3Byb2ZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nwcm9maWxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nwcm9maWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGZkZmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3Byb2ZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NyeXB0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3J5cHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiMjAwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NyeXB0LnB5CkBAIC0wLDAgKzEsMTcgQEAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKKworY3J5cHQgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnY3J5cHQnKQorCitjbGFzcyBDcnlwdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NyeXB0KHNlbGYpOgorICAgICAgICBjID0gY3J5cHQuY3J5cHQoJ215cGFzc3dvcmQnLCAnYWInKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdUZXN0IGVuY3J5cHRpb246ICcsIGMKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ3J5cHRUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3J5cHQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3J5cHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NmNiOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcnlwdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3J5cHQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3J5cHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NmNiOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcnlwdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3N2LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3N2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzY2E1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jc3YucHkKQEAgLTAsMCArMSwxMDc2IEBACisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCisjIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGNzdiBwYWNrYWdlIHVuaXQgdGVzdHMKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBjc3YKK2ltcG9ydCBnYworaW1wb3J0IGlvCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBUZXN0X0Nzdih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdCB0aGUgdW5kZXJseWluZyBDIGNzdiBwYXJzZXIgaW4gd2F5cyB0aGF0IGFyZSBub3QgYXBwcm9wcmlhdGUKKyAgICBmcm9tIHRoZSBoaWdoIGxldmVsIGludGVyZmFjZS4gRnVydGhlciB0ZXN0cyBvZiB0aGlzIG5hdHVyZSBhcmUgZG9uZQorICAgIGluIFRlc3REaWFsZWN0UmVnaXN0cnkuCisgICAgIiIiCisgICAgZGVmIF90ZXN0X2FyZ192YWxpZChzZWxmLCBjdG9yLCBhcmcpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsIGJhZF9hdHRyID0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsIGRlbGltaXRlciA9IDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBkZWxpbWl0ZXIgPSAnWFgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIGN0b3IsIGFyZywgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBkZWxpbWl0ZXI9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsIGRlbGltaXRlcj0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgcXVvdGVjaGFyPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBsaW5ldGVybWluYXRvcj1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgbGluZXRlcm1pbmF0b3I9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsIHF1b3Rpbmc9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rpbmc9Y3N2LlFVT1RFX0FMTCwgcXVvdGVjaGFyPScnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfQUxMLCBxdW90ZWNoYXI9Tm9uZSkKKworICAgIGRlZiB0ZXN0X3JlYWRlcl9hcmdfdmFsaWQoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfYXJnX3ZhbGlkKGNzdi5yZWFkZXIsIFtdKQorCisgICAgZGVmIHRlc3Rfd3JpdGVyX2FyZ192YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9hcmdfdmFsaWQoY3N2LndyaXRlciwgU3RyaW5nSU8oKSkKKworICAgIGRlZiBfdGVzdF9kZWZhdWx0X2F0dHJzKHNlbGYsIGN0b3IsICphcmdzKToKKyAgICAgICAgb2JqID0gY3RvcigqYXJncykKKyAgICAgICAgIyBDaGVjayBkZWZhdWx0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmRlbGltaXRlciwgJywnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmRvdWJsZXF1b3RlLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmVzY2FwZWNoYXIsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QubGluZXRlcm1pbmF0b3IsICJcclxuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5xdW90ZWNoYXIsICciJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5xdW90aW5nLCBjc3YuUVVPVEVfTUlOSU1BTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5zdHJpY3QsIEZhbHNlKQorICAgICAgICAjIFRyeSBkZWxldGluZyBvciBjaGFuZ2luZyBhdHRyaWJ1dGVzICh0aGV5IGFyZSByZWFkLW9ubHkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGVsYXR0ciwgb2JqLmRpYWxlY3QsICdkZWxpbWl0ZXInKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIG9iai5kaWFsZWN0LCAnZGVsaW1pdGVyJywgJzonKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZGVsYXR0ciwgb2JqLmRpYWxlY3QsICdxdW90aW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIG9iai5kaWFsZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAncXVvdGluZycsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9yZWFkZXJfYXR0cnMoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZGVmYXVsdF9hdHRycyhjc3YucmVhZGVyLCBbXSkKKworICAgIGRlZiB0ZXN0X3dyaXRlcl9hdHRycyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9kZWZhdWx0X2F0dHJzKGNzdi53cml0ZXIsIFN0cmluZ0lPKCkpCisKKyAgICBkZWYgX3Rlc3Rfa3dfYXR0cnMoc2VsZiwgY3RvciwgKmFyZ3MpOgorICAgICAgICAjIE5vdyB0cnkgd2l0aCBhbHRlcm5hdGUgb3B0aW9ucworICAgICAgICBrd2FyZ3MgPSBkaWN0KGRlbGltaXRlcj0nOicsIGRvdWJsZXF1b3RlPUZhbHNlLCBlc2NhcGVjaGFyPSdcXCcsCisgICAgICAgICAgICAgICAgICAgICAgbGluZXRlcm1pbmF0b3I9J1xyJywgcXVvdGVjaGFyPScqJywKKyAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nPWNzdi5RVU9URV9OT05FLCBza2lwaW5pdGlhbHNwYWNlPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0PVRydWUpCisgICAgICAgIG9iaiA9IGN0b3IoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmRlbGltaXRlciwgJzonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmRvdWJsZXF1b3RlLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5lc2NhcGVjaGFyLCAnXFwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmxpbmV0ZXJtaW5hdG9yLCAiXHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnF1b3RlY2hhciwgJyonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnF1b3RpbmcsIGNzdi5RVU9URV9OT05FKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnNraXBpbml0aWFsc3BhY2UsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc3RyaWN0LCBUcnVlKQorCisgICAgZGVmIHRlc3RfcmVhZGVyX2t3X2F0dHJzKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2t3X2F0dHJzKGNzdi5yZWFkZXIsIFtdKQorCisgICAgZGVmIHRlc3Rfd3JpdGVyX2t3X2F0dHJzKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2t3X2F0dHJzKGNzdi53cml0ZXIsIFN0cmluZ0lPKCkpCisKKyAgICBkZWYgX3Rlc3RfZGlhbGVjdF9hdHRycyhzZWxmLCBjdG9yLCAqYXJncyk6CisgICAgICAgICMgTm93IHRyeSB3aXRoIGRpYWxlY3QtZGVyaXZlZCBvcHRpb25zCisgICAgICAgIGNsYXNzIGRpYWxlY3Q6CisgICAgICAgICAgICBkZWxpbWl0ZXI9Jy0nCisgICAgICAgICAgICBkb3VibGVxdW90ZT1GYWxzZQorICAgICAgICAgICAgZXNjYXBlY2hhcj0nXicKKyAgICAgICAgICAgIGxpbmV0ZXJtaW5hdG9yPSckJworICAgICAgICAgICAgcXVvdGVjaGFyPScjJworICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfQUxMCisgICAgICAgICAgICBza2lwaW5pdGlhbHNwYWNlPVRydWUKKyAgICAgICAgICAgIHN0cmljdD1GYWxzZQorICAgICAgICBhcmdzID0gYXJncyArIChkaWFsZWN0LCkKKyAgICAgICAgb2JqID0gY3RvcigqYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kZWxpbWl0ZXIsICctJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kb3VibGVxdW90ZSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QuZXNjYXBlY2hhciwgJ14nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmxpbmV0ZXJtaW5hdG9yLCAiJCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QucXVvdGVjaGFyLCAnIycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QucXVvdGluZywgY3N2LlFVT1RFX0FMTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnN0cmljdCwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9yZWFkZXJfZGlhbGVjdF9hdHRycyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9kaWFsZWN0X2F0dHJzKGNzdi5yZWFkZXIsIFtdKQorCisgICAgZGVmIHRlc3Rfd3JpdGVyX2RpYWxlY3RfYXR0cnMoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZGlhbGVjdF9hdHRycyhjc3Yud3JpdGVyLCBTdHJpbmdJTygpKQorCisKKyAgICBkZWYgX3dyaXRlX3Rlc3Qoc2VsZiwgZmllbGRzLCBleHBlY3QsICoqa3dhcmdzKToKKyAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgKiprd2FyZ3MpCisgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coZmllbGRzKQorICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3QgKyB3cml0ZXIuZGlhbGVjdC5saW5ldGVybWluYXRvcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICBkZWYgdGVzdF93cml0ZV9hcmdfdmFsaWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fd3JpdGVfdGVzdCwgTm9uZSwgJycpCisgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoKCksICcnKQorICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFtOb25lXSwgJyIiJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl93cml0ZV90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9uZV0sIE5vbmUsIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9ORSkKKyAgICAgICAgIyBDaGVjayB0aGF0IGV4Y2VwdGlvbnMgYXJlIHBhc3NlZCB1cCB0aGUgY2hhaW4KKyAgICAgICAgY2xhc3MgQmFkTGlzdDoKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAxMDsKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBpZiBpID4gMjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBzZWxmLl93cml0ZV90ZXN0LCBCYWRMaXN0KCksICcnKQorICAgICAgICBjbGFzcyBCYWRJdGVtOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBzZWxmLl93cml0ZV90ZXN0LCBbQmFkSXRlbSgpXSwgJycpCisKKyAgICBkZWYgdGVzdF93cml0ZV9iaWdmaWVsZChzZWxmKToKKyAgICAgICAgIyBUaGlzIGV4ZXJjaXNlcyB0aGUgYnVmZmVyIHJlYWxsb2MgZnVuY3Rpb25hbGl0eQorICAgICAgICBiaWdzdHJpbmcgPSAnWCcgKiA1MDAwMAorICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFtiaWdzdHJpbmcsYmlnc3RyaW5nXSwgJyVzLCVzJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYmlnc3RyaW5nLCBiaWdzdHJpbmcpKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfcXVvdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJ2EnLDEsJ3AscSddLCAnYSwxLCJwLHEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZV90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLDEsJ3AscSddLCAnYSwxLHAscScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9ORSkKKyAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJ2EnLDEsJ3AscSddLCAnYSwxLCJwLHEiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX01JTklNQUwpCisgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLHEnXSwgJyJhIiwxLCJwLHEiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTk5VTUVSSUMpCisgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLHEnXSwgJyJhIiwiMSIsInAscSInLAorICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfQUxMKQorICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYVxuYicsMV0sICciYVxuYiIsIjEiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX0FMTCkKKworICAgIGRlZiB0ZXN0X3dyaXRlX2VzY2FwZShzZWxmKToKKyAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJ2EnLDEsJ3AscSddLCAnYSwxLCJwLHEiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywxLCdwLCJxIiddLCAnYSwxLCJwLFxcInFcXCIiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj1Ob25lLCBkb3VibGVxdW90ZT1GYWxzZSkKKyAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJ2EnLDEsJ3AsInEiJ10sICdhLDEsInAsXFwicVxcIiInLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWNoYXI9J1xcJywgZG91YmxlcXVvdGUgPSBGYWxzZSkKKyAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJyInXSwgJyIiIiInLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWNoYXI9J1xcJywgcXVvdGluZyA9IGNzdi5RVU9URV9NSU5JTUFMKQorICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnIiddLCAnXFwiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIHF1b3RpbmcgPSBjc3YuUVVPVEVfTUlOSU1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVxdW90ZSA9IEZhbHNlKQorICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnIiddLCAnXFwiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9ORSkKKyAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJ2EnLDEsJ3AscSddLCAnYSwxLHBcXCxxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9ORSkKKworICAgIGRlZiB0ZXN0X3dyaXRlcm93cyhzZWxmKToKKyAgICAgICAgY2xhc3MgQnJva2VuRmlsZToKKyAgICAgICAgICAgIGRlZiB3cml0ZShzZWxmLCBidWYpOgorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IKKyAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihCcm9rZW5GaWxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHdyaXRlci53cml0ZXJvd3MsIFtbJ2EnXV0pCisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmopCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHdyaXRlci53cml0ZXJvd3MsIE5vbmUpCisgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3dzKFtbJ2EnLCdiJ10sWydjJywnZCddXSkKKyAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgImEsYlxyXG5jLGRcclxuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICBkZWYgdGVzdF93cml0ZV9mbG9hdChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxMzU3MzogbG9zcyBvZiBwcmVjaXNpb24gYmVjYXVzZSBjc3Yud3JpdGVyCisgICAgICAgICMgdXNlcyBzdHIoKSBmb3IgZmxvYXRzIGluc3RlYWQgb2YgcmVwcigpCisgICAgICAgIG9yaWdfcm93ID0gWzEuMjM0NTY3ODkwMTIzLCAxLjAvNy4wLCAnYWJjJ10KKyAgICAgICAgZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgYyA9IGNzdi53cml0ZXIoZiwgcXVvdGluZz1jc3YuUVVPVEVfTk9OTlVNRVJJQykKKyAgICAgICAgYy53cml0ZXJvdyhvcmlnX3JvdykKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIGMgPSBjc3YucmVhZGVyKGYsIHF1b3Rpbmc9Y3N2LlFVT1RFX05PTk5VTUVSSUMpCisgICAgICAgIG5ld19yb3cgPSBuZXh0KGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZ19yb3csIG5ld19yb3cpCisKKyAgICBkZWYgX3JlYWRfdGVzdChzZWxmLCBpbnB1dCwgZXhwZWN0LCAqKmt3YXJncyk6CisgICAgICAgIHJlYWRlciA9IGNzdi5yZWFkZXIoaW5wdXQsICoqa3dhcmdzKQorICAgICAgICByZXN1bHQgPSBsaXN0KHJlYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdCkKKworICAgIGRlZiB0ZXN0X3JlYWRfb2RkaW5wdXRzKHNlbGYpOgorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoW10sIFtdKQorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWycnXSwgW1tdXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsnImFiImMnXSwgTm9uZSwgc3RyaWN0ID0gMSkKKyAgICAgICAgIyBjYW5ub3QgaGFuZGxlIG51bGwgYnl0ZXMgZm9yIHRoZSBtb21lbnQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsnYWJcMGMnXSwgTm9uZSwgc3RyaWN0ID0gMSkKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnImFiImMnXSwgW1snYWJjJ11dLCBkb3VibGVxdW90ZSA9IDApCisKKyAgICBkZWYgdGVzdF9yZWFkX2VvbChzZWxmKToKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSxiJ10sIFtbJ2EnLCdiJ11dKQorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLGJcbiddLCBbWydhJywnYiddXSkKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSxiXHJcbiddLCBbWydhJywnYiddXSkKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSxiXHInXSwgW1snYScsJ2InXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LCBbJ2EsYlxyYyxkJ10sIFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwgWydhLGJcbmMsZCddLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsIFsnYSxiXHJcbmMsZCddLCBbXSkKKworICAgIGRlZiB0ZXN0X3JlYWRfZW9mKHNlbGYpOgorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLCInXSwgW1snYScsICcnXV0pCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJyJhJ10sIFtbJ2EnXV0pCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ14nXSwgW1snXG4nXV0sIGVzY2FwZWNoYXI9J14nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwgWydhLCInXSwgW10sIHN0cmljdD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwgWyciYSddLCBbXSwgc3RyaWN0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJ14nXSwgW10sIGVzY2FwZWNoYXI9J14nLCBzdHJpY3Q9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3JlYWRfZXNjYXBlKHNlbGYpOgorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLFxcYixjJ10sIFtbJ2EnLCAnYicsICdjJ11dLCBlc2NhcGVjaGFyPSdcXCcpCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYlxcLGMnXSwgW1snYScsICdiLGMnXV0sIGVzY2FwZWNoYXI9J1xcJykKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSwiYlxcLGMiJ10sIFtbJ2EnLCAnYixjJ11dLCBlc2NhcGVjaGFyPSdcXCcpCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsImIsXFxjIiddLCBbWydhJywgJ2IsYyddXSwgZXNjYXBlY2hhcj0nXFwnKQorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLCJiLGNcXCIiJ10sIFtbJ2EnLCAnYixjIiddXSwgZXNjYXBlY2hhcj0nXFwnKQorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLCJiLGMiXFwnXSwgW1snYScsICdiLGNcXCddXSwgZXNjYXBlY2hhcj0nXFwnKQorCisgICAgZGVmIHRlc3RfcmVhZF9xdW90aW5nKHNlbGYpOgorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWycxLCIsMywiLDUnXSwgW1snMScsICcsMywnLCAnNSddXSkKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnMSwiLDMsIiw1J10sIFtbJzEnLCAnIicsICczJywgJyInLCAnNSddXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlY2hhcj1Ob25lLCBlc2NhcGVjaGFyPSdcXCcpCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJzEsIiwzLCIsNSddLCBbWycxJywgJyInLCAnMycsICciJywgJzUnXV0sCisgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nPWNzdi5RVU9URV9OT05FLCBlc2NhcGVjaGFyPSdcXCcpCisgICAgICAgICMgd2lsbCB0aGlzIGZhaWwgd2hlcmUgbG9jYWxlIHVzZXMgY29tbWEgZm9yIGRlY2ltYWxzPworICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWycsMywiNSIsNy4zLCA5J10sIFtbJycsIDMsICc1JywgNy4zLCA5XV0sCisgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nPWNzdi5RVU9URV9OT05OVU1FUklDKQorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWyciYVxuYiIsIDcnXSwgW1snYVxuYicsICcgNyddXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5fcmVhZF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2FiYywzJ10sIFtbXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rpbmc9Y3N2LlFVT1RFX05PTk5VTUVSSUMpCisKKyAgICBkZWYgdGVzdF9yZWFkX2JpZ2ZpZWxkKHNlbGYpOgorICAgICAgICAjIFRoaXMgZXhlcmNpc2VzIHRoZSBidWZmZXIgcmVhbGxvYyBmdW5jdGlvbmFsaXR5IGFuZCBmaWVsZCBzaXplCisgICAgICAgICMgbGltaXRzLgorICAgICAgICBsaW1pdCA9IGNzdi5maWVsZF9zaXplX2xpbWl0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2l6ZSA9IDUwMDAwCisgICAgICAgICAgICBiaWdzdHJpbmcgPSAnWCcgKiBzaXplCisgICAgICAgICAgICBiaWdsaW5lID0gJyVzLCVzJyAlIChiaWdzdHJpbmcsIGJpZ3N0cmluZykKKyAgICAgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbYmlnbGluZV0sIFtbYmlnc3RyaW5nLCBiaWdzdHJpbmddXSkKKyAgICAgICAgICAgIGNzdi5maWVsZF9zaXplX2xpbWl0KHNpemUpCisgICAgICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoW2JpZ2xpbmVdLCBbW2JpZ3N0cmluZywgYmlnc3RyaW5nXV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzdi5maWVsZF9zaXplX2xpbWl0KCksIHNpemUpCisgICAgICAgICAgICBjc3YuZmllbGRfc2l6ZV9saW1pdChzaXplLTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwgW2JpZ2xpbmVdLCBbXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LmZpZWxkX3NpemVfbGltaXQsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5maWVsZF9zaXplX2xpbWl0LCAxLCBOb25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgY3N2LmZpZWxkX3NpemVfbGltaXQobGltaXQpCisKKyAgICBkZWYgdGVzdF9yZWFkX2xpbmVudW0oc2VsZik6CisgICAgICAgIGZvciByIGluIChjc3YucmVhZGVyKFsnbGluZSwxJywgJ2xpbmUsMicsICdsaW5lLDMnXSksCisgICAgICAgICAgICAgICAgICBjc3YuRGljdFJlYWRlcihbJ2xpbmUsMScsICdsaW5lLDInLCAnbGluZSwzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPVsnYScsICdiJywgJ2MnXSkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmxpbmVfbnVtLCAwKQorICAgICAgICAgICAgci5uZXh0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5saW5lX251bSwgMSkKKyAgICAgICAgICAgIHIubmV4dCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubGluZV9udW0sIDIpCisgICAgICAgICAgICByLm5leHQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmxpbmVfbnVtLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgci5uZXh0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmxpbmVfbnVtLCAzKQorCisgICAgZGVmIHRlc3Rfcm91bmR0cmlwX3F1b3RlZWRfbmV3bGluZXMoc2VsZik6CisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmopCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHdyaXRlci53cml0ZXJvd3MsIE5vbmUpCisgICAgICAgICAgICByb3dzID0gW1snYVxuYicsJ2InXSxbJ2MnLCd4XHJcbmQnXV0KKyAgICAgICAgICAgIHdyaXRlci53cml0ZXJvd3Mocm93cykKKyAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgZm9yIGksIHJvdyBpbiBlbnVtZXJhdGUoY3N2LnJlYWRlcihmaWxlb2JqKSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3csIHJvd3NbaV0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCitjbGFzcyBUZXN0RGlhbGVjdFJlZ2lzdHJ5KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9yZWdpc3RyeV9iYWRhcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5saXN0X2RpYWxlY3RzLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5nZXRfZGlhbGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBjc3YuZ2V0X2RpYWxlY3QsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgY3N2LmdldF9kaWFsZWN0LCAibm9uZXN1Y2giKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi51bnJlZ2lzdGVyX2RpYWxlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgY3N2LnVucmVnaXN0ZXJfZGlhbGVjdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBjc3YudW5yZWdpc3Rlcl9kaWFsZWN0LCAibm9uZXN1Y2giKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWdpc3Rlcl9kaWFsZWN0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWdpc3Rlcl9kaWFsZWN0LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWdpc3Rlcl9kaWFsZWN0LCAibm9uZXN1Y2giLCAwLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWdpc3Rlcl9kaWFsZWN0LCAibm9uZXN1Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICBiYWRhcmd1bWVudD1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWdpc3Rlcl9kaWFsZWN0LCAibm9uZXN1Y2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlZ2lzdGVyX2RpYWxlY3QsIFtdKQorCisgICAgZGVmIHRlc3RfcmVnaXN0cnkoc2VsZik6CisgICAgICAgIGNsYXNzIG15ZXhjZWx0c3YoY3N2LmV4Y2VsKToKKyAgICAgICAgICAgIGRlbGltaXRlciA9ICJcdCIKKyAgICAgICAgbmFtZSA9ICJteWV4Y2VsdHN2IgorICAgICAgICBleHBlY3RlZF9kaWFsZWN0cyA9IGNzdi5saXN0X2RpYWxlY3RzKCkgKyBbbmFtZV0KKyAgICAgICAgZXhwZWN0ZWRfZGlhbGVjdHMuc29ydCgpCisgICAgICAgIGNzdi5yZWdpc3Rlcl9kaWFsZWN0KG5hbWUsIG15ZXhjZWx0c3YpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChjc3YudW5yZWdpc3Rlcl9kaWFsZWN0LCBuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzdi5nZXRfZGlhbGVjdChuYW1lKS5kZWxpbWl0ZXIsICdcdCcpCisgICAgICAgIGdvdF9kaWFsZWN0cyA9IHNvcnRlZChjc3YubGlzdF9kaWFsZWN0cygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2RpYWxlY3RzLCBnb3RfZGlhbGVjdHMpCisKKyAgICBkZWYgdGVzdF9yZWdpc3Rlcl9rd2FyZ3Moc2VsZik6CisgICAgICAgIG5hbWUgPSAnZmVkY2JhJworICAgICAgICBjc3YucmVnaXN0ZXJfZGlhbGVjdChuYW1lLCBkZWxpbWl0ZXI9JzsnKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoY3N2LnVucmVnaXN0ZXJfZGlhbGVjdCwgbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjc3YuZ2V0X2RpYWxlY3QobmFtZSkuZGVsaW1pdGVyLCAnOycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW1snWCcsICdZJywgJ1onXV0sIGxpc3QoY3N2LnJlYWRlcihbJ1g7WTtaJ10sIG5hbWUpKSkKKworICAgIGRlZiB0ZXN0X2luY29tcGxldGVfZGlhbGVjdChzZWxmKToKKyAgICAgICAgY2xhc3MgbXlleGNlbHRzdihjc3YuRGlhbGVjdCk6CisgICAgICAgICAgICBkZWxpbWl0ZXIgPSAiXHQiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlleGNlbHRzdikKKworICAgIGRlZiB0ZXN0X3NwYWNlX2RpYWxlY3Qoc2VsZik6CisgICAgICAgIGNsYXNzIHNwYWNlKGNzdi5leGNlbCk6CisgICAgICAgICAgICBkZWxpbWl0ZXIgPSAiICIKKyAgICAgICAgICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9ORQorICAgICAgICAgICAgZXNjYXBlY2hhciA9ICJcXCIKKworICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiYWJjIGRlZlxuYzFjY2NjYzEgYmVuemVuZVxuIikKKyAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgcmRyID0gY3N2LnJlYWRlcihmaWxlb2JqLCBkaWFsZWN0PXNwYWNlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJkci5uZXh0KCksIFsiYWJjIiwgImRlZiJdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZHIubmV4dCgpLCBbImMxY2NjY2MxIiwgImJlbnplbmUiXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICBkZWYgdGVzdF9kaWFsZWN0X2FwcGx5KHNlbGYpOgorICAgICAgICBjbGFzcyB0ZXN0QShjc3YuZXhjZWwpOgorICAgICAgICAgICAgZGVsaW1pdGVyID0gIlx0IgorICAgICAgICBjbGFzcyB0ZXN0Qihjc3YuZXhjZWwpOgorICAgICAgICAgICAgZGVsaW1pdGVyID0gIjoiCisgICAgICAgIGNsYXNzIHRlc3RDKGNzdi5leGNlbCk6CisgICAgICAgICAgICBkZWxpbWl0ZXIgPSAifCIKKworICAgICAgICBjc3YucmVnaXN0ZXJfZGlhbGVjdCgndGVzdEMnLCB0ZXN0QykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaikKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coWzEsMiwzXSkKKyAgICAgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMSwyLDNcclxuIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICAgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosIHRlc3RBKQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQorICAgICAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksICIxXHQyXHQzXHJcbiIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCBkaWFsZWN0PXRlc3RCKCkpCisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KFsxLDIsM10pCisgICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgIjE6MjozXHJcbiIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCBkaWFsZWN0PSd0ZXN0QycpCisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KFsxLDIsM10pCisgICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgIjF8MnwzXHJcbiIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCBkaWFsZWN0PXRlc3RBLCBkZWxpbWl0ZXI9JzsnKQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQorICAgICAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksICIxOzI7M1xyXG4iKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgY3N2LnVucmVnaXN0ZXJfZGlhbGVjdCgndGVzdEMnKQorCisgICAgZGVmIHRlc3RfYmFkX2RpYWxlY3Qoc2VsZik6CisgICAgICAgICMgVW5rbm93biBwYXJhbWV0ZXIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgYmFkX2F0dHIgPSAwKQorICAgICAgICAjIEJhZCB2YWx1ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgZGVsaW1pdGVyID0gTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgcXVvdGluZyA9IC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWFkZXIsIFtdLCBxdW90aW5nID0gMTAwKQorCitjbGFzcyBUZXN0Q3N2QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHJlYWRlckFzc2VydEVxdWFsKHNlbGYsIGlucHV0LCBleHBlY3RlZF9yZXN1bHQpOgorICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZW9iai53cml0ZShpbnB1dCkKKyAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgcmVhZGVyID0gY3N2LnJlYWRlcihmaWxlb2JqLCBkaWFsZWN0ID0gc2VsZi5kaWFsZWN0KQorICAgICAgICAgICAgZmllbGRzID0gbGlzdChyZWFkZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpZWxkcywgZXhwZWN0ZWRfcmVzdWx0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgIGRlZiB3cml0ZXJBc3NlcnRFcXVhbChzZWxmLCBpbnB1dCwgZXhwZWN0ZWRfcmVzdWx0KToKKyAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdCA9IHNlbGYuZGlhbGVjdCkKKyAgICAgICAgICAgIHdyaXRlci53cml0ZXJvd3MoaW5wdXQpCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksIGV4cGVjdGVkX3Jlc3VsdCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKK2NsYXNzIFRlc3REaWFsZWN0RXhjZWwoVGVzdENzdkJhc2UpOgorICAgIGRpYWxlY3QgPSAnZXhjZWwnCisKKyAgICBkZWYgdGVzdF9zaW5nbGUoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJ2FiYycsIFtbJ2FiYyddXSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnMSwyLDMsNCw1JywgW1snMScsJzInLCczJywnNCcsJzUnXV0pCisKKyAgICBkZWYgdGVzdF9ibGFua2xpbmUoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJycsIFtdKQorCisgICAgZGVmIHRlc3RfZW1wdHlfZmllbGRzKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcsJywgW1snJywgJyddXSkKKworICAgIGRlZiB0ZXN0X3NpbmdsZXF1b3RlZChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnIiInLCBbWycnXV0pCisKKyAgICBkZWYgdGVzdF9zaW5nbGVxdW90ZWRfbGVmdF9lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnIiIsJywgW1snJywnJ11dKQorCisgICAgZGVmIHRlc3Rfc2luZ2xlcXVvdGVkX3JpZ2h0X2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcsIiInLCBbWycnLCcnXV0pCisKKyAgICBkZWYgdGVzdF9zaW5nbGVfcXVvdGVkX3F1b3RlKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCciIiIiJywgW1snIiddXSkKKworICAgIGRlZiB0ZXN0X3F1b3RlZF9xdW90ZXMoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyIiIiIiIicsIFtbJyIiJ11dKQorCisgICAgZGVmIHRlc3RfaW5saW5lX3F1b3RlKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCdhIiJiJywgW1snYSIiYiddXSkKKworICAgIGRlZiB0ZXN0X2lubGluZV9xdW90ZXMoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJ2EiYiJjJywgW1snYSJiImMnXV0pCisKKyAgICBkZWYgdGVzdF9xdW90ZXNfYW5kX21vcmUoc2VsZik6CisgICAgICAgICMgRXhjZWwgd291bGQgbmV2ZXIgd3JpdGUgYSBmaWVsZCBjb250YWluaW5nICciYSJiJywgYnV0IHdoZW4KKyAgICAgICAgIyByZWFkaW5nIG9uZSwgaXQgd2lsbCByZXR1cm4gJ2FiJy4KKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnImEiYicsIFtbJ2FiJ11dKQorCisgICAgZGVmIHRlc3RfbG9uZV9xdW90ZShzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnYSJiJywgW1snYSJiJ11dKQorCisgICAgZGVmIHRlc3RfcXVvdGVfYW5kX3F1b3RlKHNlbGYpOgorICAgICAgICAjIEV4Y2VsIHdvdWxkIG5ldmVyIHdyaXRlIGEgZmllbGQgY29udGFpbmluZyAnImEiICJiIicsIGJ1dCB3aGVuCisgICAgICAgICMgcmVhZGluZyBvbmUsIGl0IHdpbGwgcmV0dXJuICdhICJiIicuCisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyJhIiAiYiInLCBbWydhICJiIiddXSkKKworICAgIGRlZiB0ZXN0X3NwYWNlX2FuZF9xdW90ZShzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnICJhIicsIFtbJyAiYSInXV0pCisKKyAgICBkZWYgdGVzdF9xdW90ZWQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJzEsMiwzLCJJIHRoaW5rLCB0aGVyZWZvcmUgSSBhbSIsNSw2JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWycxJywgJzInLCAnMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSSB0aGluaywgdGhlcmVmb3JlIEkgYW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzUnLCAnNiddXSkKKworICAgIGRlZiB0ZXN0X3F1b3RlZF9xdW90ZShzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnMSwyLDMsIiIiSSBzZWUsIiIgc2FpZCB0aGUgYmxpbmQgbWFuIiwiYXMgaGUgcGlja2VkIHVwIGhpcyBoYW1tZXIgYW5kIHNhdyInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbJzEnLCAnMicsICczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciSSBzZWUsIiBzYWlkIHRoZSBibGluZCBtYW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzIGhlIHBpY2tlZCB1cCBoaXMgaGFtbWVyIGFuZCBzYXcnXV0pCisKKyAgICBkZWYgdGVzdF9xdW90ZWRfbmwoc2VsZik6CisgICAgICAgIGlucHV0ID0gJycnXAorMSwyLDMsIiIiSSBzZWUsIiIKK3NhaWQgdGhlIGJsaW5kIG1hbiIsImFzIGhlIHBpY2tlZCB1cCBoaXMKK2hhbW1lciBhbmQgc2F3IgorOSw4LDcsNicnJworICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbJzEnLCAnMicsICczJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyJJIHNlZSwiXG5zYWlkIHRoZSBibGluZCBtYW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXMgaGUgcGlja2VkIHVwIGhpc1xuaGFtbWVyIGFuZCBzYXcnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyc5JywnOCcsJzcnLCc2J11dKQorCisgICAgZGVmIHRlc3RfZHViaW91c19xdW90ZShzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnMTIsMTIsMSIsJywgW1snMTInLCAnMTInLCAnMSInLCAnJ11dKQorCisgICAgZGVmIHRlc3RfbnVsbChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbXSwgJycpCisKKyAgICBkZWYgdGVzdF9zaW5nbGVfd3JpdGVyKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlckFzc2VydEVxdWFsKFtbJ2FiYyddXSwgJ2FiY1xyXG4nKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX3dyaXRlcihzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWzEsIDIsICdhYmMnLCAzLCA0XV0sICcxLDIsYWJjLDMsNFxyXG4nKQorCisgICAgZGVmIHRlc3RfcXVvdGVzKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlckFzc2VydEVxdWFsKFtbMSwgMiwgJ2EiYmMiJywgMywgNF1dLCAnMSwyLCJhIiJiYyIiIiwzLDRcclxuJykKKworICAgIGRlZiB0ZXN0X3F1b3RlX2ZpZWxkc2VwKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlckFzc2VydEVxdWFsKFtbJ2FiYyxkZWYnXV0sICciYWJjLGRlZiJcclxuJykKKworICAgIGRlZiB0ZXN0X25ld2xpbmVzKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlckFzc2VydEVxdWFsKFtbMSwgMiwgJ2FcbmJjJywgMywgNF1dLCAnMSwyLCJhXG5iYyIsMyw0XHJcbicpCisKK2NsYXNzIEVzY2FwZWRFeGNlbChjc3YuZXhjZWwpOgorICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9ORQorICAgIGVzY2FwZWNoYXIgPSAnXFwnCisKK2NsYXNzIFRlc3RFc2NhcGVkRXhjZWwoVGVzdENzdkJhc2UpOgorICAgIGRpYWxlY3QgPSBFc2NhcGVkRXhjZWwoKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2ZpZWxkc2VwKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlckFzc2VydEVxdWFsKFtbJ2FiYyxkZWYnXV0sICdhYmNcXCxkZWZcclxuJykKKworICAgIGRlZiB0ZXN0X3JlYWRfZXNjYXBlX2ZpZWxkc2VwKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCdhYmNcXCxkZWZcclxuJywgW1snYWJjLGRlZiddXSkKKworY2xhc3MgUXVvdGVkRXNjYXBlZEV4Y2VsKGNzdi5leGNlbCk6CisgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05OVU1FUklDCisgICAgZXNjYXBlY2hhciA9ICdcXCcKKworY2xhc3MgVGVzdFF1b3RlZEVzY2FwZWRFeGNlbChUZXN0Q3N2QmFzZSk6CisgICAgZGlhbGVjdCA9IFF1b3RlZEVzY2FwZWRFeGNlbCgpCisKKyAgICBkZWYgdGVzdF93cml0ZV9lc2NhcGVfZmllbGRzZXAoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1snYWJjLGRlZiddXSwgJyJhYmMsZGVmIlxyXG4nKQorCisgICAgZGVmIHRlc3RfcmVhZF9lc2NhcGVfZmllbGRzZXAoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyJhYmNcXCxkZWYiXHJcbicsIFtbJ2FiYyxkZWYnXV0pCisKK2NsYXNzIFRlc3REaWN0RmllbGRzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIyMgImxvbmciIG1lYW5zIHRoZSByb3cgaXMgbG9uZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBmaWVsZG5hbWVzCisgICAgIyMjICJzaG9ydCIgbWVhbnMgdGhlcmUgYXJlIGZld2VyIGVsZW1lbnRzIGluIHRoZSByb3cgdGhhbiBmaWVsZG5hbWVzCisgICAgZGVmIHRlc3Rfd3JpdGVfc2ltcGxlX2RpY3Qoc2VsZik6CisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBpby5vcGVuKGZkLCAndytiJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3JpdGVyID0gY3N2LkRpY3RXcml0ZXIoZmlsZW9iaiwgZmllbGRuYW1lcyA9IFsiZjEiLCAiZjIiLCAiZjMiXSkKKyAgICAgICAgICAgIHdyaXRlci53cml0ZWhlYWRlcigpCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkbGluZSgpLCAiZjEsZjIsZjNcclxuIikKKyAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyh7ImYxIjogMTAsICJmMyI6ICJhYmMifSkKKyAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgZmlsZW9iai5yZWFkbGluZSgpICMgaGVhZGVyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMTAsLGFiY1xyXG4iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgIGRlZiB0ZXN0X3dyaXRlX25vX2ZpZWxkcyhzZWxmKToKKyAgICAgICAgZmlsZW9iaiA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YuRGljdFdyaXRlciwgZmlsZW9iaikKKworICAgIGRlZiB0ZXN0X3JlYWRfZGljdF9maWVsZHMoc2VsZik6CisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlb2JqLndyaXRlKCIxLDIsYWJjXHJcbiIpCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPVsiZjEiLCAiZjIiLCAiZjMiXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyJmMSI6ICcxJywgImYyIjogJzInLCAiZjMiOiAnYWJjJ30pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgZGVmIHRlc3RfcmVhZF9kaWN0X25vX2ZpZWxkbmFtZXMoc2VsZik6CisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlb2JqLndyaXRlKCJmMSxmMixmM1xyXG4xLDIsYWJjXHJcbiIpCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmopCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5maWVsZG5hbWVzLCBbImYxIiwgImYyIiwgImYzIl0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiZjEiOiAnMScsICJmMiI6ICcyJywgImYzIjogJ2FiYyd9KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgICMgVHdvIHRlc3QgY2FzZXMgdG8gbWFrZSBzdXJlIGV4aXN0aW5nIHdheXMgb2YgaW1wbGljaXRseSBzZXR0aW5nCisgICAgIyBmaWVsZG5hbWVzIGNvbnRpbnVlIHRvIHdvcmsuICBCb3RoIGFyaXNlIGZyb20gZGlzY3Vzc2lvbiBpbiBpc3N1ZTM0MzYuCisgICAgZGVmIHRlc3RfcmVhZF9kaWN0X2ZpZWxkbmFtZXNfZnJvbV9maWxlKHNlbGYpOgorICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiZjEsZjIsZjNcclxuMSwyLGFiY1xyXG4iKQorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmLCBmaWVsZG5hbWVzPWNzdi5yZWFkZXIoZikubmV4dCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIuZmllbGRuYW1lcywgWyJmMSIsICJmMiIsICJmMyJdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7ImYxIjogJzEnLCAiZjIiOiAnMicsICJmMyI6ICdhYmMnfSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICBkZWYgdGVzdF9yZWFkX2RpY3RfZmllbGRuYW1lc19jaGFpbihzZWxmKToKKyAgICAgICAgaW1wb3J0IGl0ZXJ0b29scworICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiZjEsZjIsZjNcclxuMSwyLGFiY1xyXG4iKQorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmKQorICAgICAgICAgICAgZmlyc3QgPSBuZXh0KHJlYWRlcikKKyAgICAgICAgICAgIGZvciByb3cgaW4gaXRlcnRvb2xzLmNoYWluKFtmaXJzdF0sIHJlYWRlcik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIuZmllbGRuYW1lcywgWyJmMSIsICJmMiIsICJmMyJdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93LCB7ImYxIjogJzEnLCAiZjIiOiAnMicsICJmMyI6ICdhYmMnfSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICBkZWYgdGVzdF9yZWFkX2xvbmcoc2VsZik6CisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlb2JqLndyaXRlKCIxLDIsYWJjLDQsNSw2XHJcbiIpCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPVsiZjEiLCAiZjIiXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyJmMSI6ICcxJywgImYyIjogJzInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZTogWyJhYmMiLCAiNCIsICI1IiwgIjYiXX0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgZGVmIHRlc3RfcmVhZF9sb25nX3dpdGhfcmVzdChzZWxmKToKKyAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoIjEsMixhYmMsNCw1LDZcclxuIikKKyAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoZmlsZW9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkbmFtZXM9WyJmMSIsICJmMiJdLCByZXN0a2V5PSJfcmVzdCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiZjEiOiAnMScsICJmMiI6ICcyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfcmVzdCI6IFsiYWJjIiwgIjQiLCAiNSIsICI2Il19KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgIGRlZiB0ZXN0X3JlYWRfbG9uZ193aXRoX3Jlc3Rfbm9fZmllbGRuYW1lcyhzZWxmKToKKyAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoImYxLGYyXHJcbjEsMixhYmMsNCw1LDZcclxuIikKKyAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoZmlsZW9iaiwgcmVzdGtleT0iX3Jlc3QiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIuZmllbGRuYW1lcywgWyJmMSIsICJmMiJdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7ImYxIjogJzEnLCAiZjIiOiAnMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3Jlc3QiOiBbImFiYyIsICI0IiwgIjUiLCAiNiJdfSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICBkZWYgdGVzdF9yZWFkX3Nob3J0KHNlbGYpOgorICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiMSwyLGFiYyw0LDUsNlxyXG4xLDIsYWJjXHJcbiIpCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPSIxIDIgMyA0IDUgNiIuc3BsaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3R2YWw9IkRFRkFVTFQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7IjEiOiAnMScsICIyIjogJzInLCAiMyI6ICdhYmMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQiOiAnNCcsICI1IjogJzUnLCAiNiI6ICc2J30pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiMSI6ICcxJywgIjIiOiAnMicsICIzIjogJ2FiYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNCI6ICdERUZBVUxUJywgIjUiOiAnREVGQVVMVCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNiI6ICdERUZBVUxUJ30pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgZGVmIHRlc3RfcmVhZF9tdWx0aShzZWxmKToKKyAgICAgICAgc2FtcGxlID0gWworICAgICAgICAgICAgJzIxNDc0ODM2NDgsNDMuMGUxMiwxNyxhYmMsZGVmXHJcbicsCisgICAgICAgICAgICAnMTQ3NDgzNjQ4LDQzLjBlMiwxNyxhYmMsZGVmXHJcbicsCisgICAgICAgICAgICAnNDc0ODM2NDgsNDMuMCwxNzAsYWJjLGRlZlxyXG4nCisgICAgICAgICAgICBdCisKKyAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPSJpMSBmbG9hdCBpMiBzMSBzMiIuc3BsaXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7ImkxIjogJzIxNDc0ODM2NDgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQiOiAnNDMuMGUxMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpMiI6ICcxNycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzMSI6ICdhYmMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiczIiOiAnZGVmJ30pCisKKyAgICBkZWYgdGVzdF9yZWFkX3dpdGhfYmxhbmtzKHNlbGYpOgorICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihbIjEsMixhYmMsNCw1LDZcclxuIiwiXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSwyLGFiYyw0LDUsNlxyXG4iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz0iMSAyIDMgNCA1IDYiLnNwbGl0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyIxIjogJzEnLCAiMiI6ICcyJywgIjMiOiAnYWJjJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQiOiAnNCcsICI1IjogJzUnLCAiNiI6ICc2J30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyIxIjogJzEnLCAiMiI6ICcyJywgIjMiOiAnYWJjJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQiOiAnNCcsICI1IjogJzUnLCAiNiI6ICc2J30pCisKKyAgICBkZWYgdGVzdF9yZWFkX3NlbWlfc2VwKHNlbGYpOgorICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihbIjE7MjthYmM7NDs1OzZcclxuIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkbmFtZXM9IjEgMiAzIDQgNSA2Ii5zcGxpdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXI9JzsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiMSI6ICcxJywgIjIiOiAnMicsICIzIjogJ2FiYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IjogJzQnLCAiNSI6ICc1JywgIjYiOiAnNid9KQorCitjbGFzcyBUZXN0QXJyYXlXcml0ZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2ludF93cml0ZShzZWxmKToKKyAgICAgICAgaW1wb3J0IGFycmF5CisgICAgICAgIGNvbnRlbnRzID0gWygyMC1pKSBmb3IgaSBpbiByYW5nZSgyMCldCisgICAgICAgIGEgPSBhcnJheS5hcnJheSgnaScsIGNvbnRlbnRzKQorCisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosIGRpYWxlY3Q9ImV4Y2VsIikKKyAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhhKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSAiLCIuam9pbihbc3RyKGkpIGZvciBpIGluIGFdKSsiXHJcbiIKKyAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgZXhwZWN0ZWQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgZGVmIHRlc3RfZG91YmxlX3dyaXRlKHNlbGYpOgorICAgICAgICBpbXBvcnQgYXJyYXkKKyAgICAgICAgY29udGVudHMgPSBbKDIwLWkpKjAuMSBmb3IgaSBpbiByYW5nZSgyMCldCisgICAgICAgIGEgPSBhcnJheS5hcnJheSgnZCcsIGNvbnRlbnRzKQorICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCBkaWFsZWN0PSJleGNlbCIpCisgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coYSkKKyAgICAgICAgICAgIGV4cGVjdGVkID0gIiwiLmpvaW4oW3JlcHIoaSkgZm9yIGkgaW4gYV0pKyJcclxuIgorICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICBkZWYgdGVzdF9mbG9hdF93cml0ZShzZWxmKToKKyAgICAgICAgaW1wb3J0IGFycmF5CisgICAgICAgIGNvbnRlbnRzID0gWygyMC1pKSowLjEgZm9yIGkgaW4gcmFuZ2UoMjApXQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ2YnLCBjb250ZW50cykKKyAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD0iZXhjZWwiKQorICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KGEpCisgICAgICAgICAgICBleHBlY3RlZCA9ICIsIi5qb2luKFtyZXByKGkpIGZvciBpIGluIGFdKSsiXHJcbiIKKyAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgZXhwZWN0ZWQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgZGVmIHRlc3RfY2hhcl93cml0ZShzZWxmKToKKyAgICAgICAgaW1wb3J0IGFycmF5LCBzdHJpbmcKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KCdjJywgc3RyaW5nLmxldHRlcnMpCisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosIGRpYWxlY3Q9ImV4Y2VsIikKKyAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhhKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSAiLCIuam9pbihhKSsiXHJcbiIKKyAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgZXhwZWN0ZWQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCitjbGFzcyBUZXN0RGlhbGVjdFZhbGlkaXR5KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9xdW90aW5nKHNlbGYpOgorICAgICAgICBjbGFzcyBteWRpYWxlY3QoY3N2LkRpYWxlY3QpOgorICAgICAgICAgICAgZGVsaW1pdGVyID0gIjsiCisgICAgICAgICAgICBlc2NhcGVjaGFyID0gJ1xcJworICAgICAgICAgICAgZG91YmxlcXVvdGUgPSBGYWxzZQorICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZSA9IFRydWUKKyAgICAgICAgICAgIGxpbmV0ZXJtaW5hdG9yID0gJ1xyXG4nCisgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUKKyAgICAgICAgZCA9IG15ZGlhbGVjdCgpCisKKyAgICAgICAgbXlkaWFsZWN0LnF1b3RpbmcgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQorCisgICAgICAgIG15ZGlhbGVjdC5kb3VibGVxdW90ZSA9IFRydWUKKyAgICAgICAgbXlkaWFsZWN0LnF1b3RpbmcgPSBjc3YuUVVPVEVfQUxMCisgICAgICAgIG15ZGlhbGVjdC5xdW90ZWNoYXIgPSAnIicKKyAgICAgICAgZCA9IG15ZGlhbGVjdCgpCisKKyAgICAgICAgbXlkaWFsZWN0LnF1b3RlY2hhciA9ICInJyIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBteWRpYWxlY3QpCisKKyAgICAgICAgbXlkaWFsZWN0LnF1b3RlY2hhciA9IDQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBteWRpYWxlY3QpCisKKyAgICBkZWYgdGVzdF9kZWxpbWl0ZXIoc2VsZik6CisgICAgICAgIGNsYXNzIG15ZGlhbGVjdChjc3YuRGlhbGVjdCk6CisgICAgICAgICAgICBkZWxpbWl0ZXIgPSAiOyIKKyAgICAgICAgICAgIGVzY2FwZWNoYXIgPSAnXFwnCisgICAgICAgICAgICBkb3VibGVxdW90ZSA9IEZhbHNlCisgICAgICAgICAgICBza2lwaW5pdGlhbHNwYWNlID0gVHJ1ZQorICAgICAgICAgICAgbGluZXRlcm1pbmF0b3IgPSAnXHJcbicKKyAgICAgICAgICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9ORQorICAgICAgICBkID0gbXlkaWFsZWN0KCkKKworICAgICAgICBteWRpYWxlY3QuZGVsaW1pdGVyID0gIjo6OiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBteWRpYWxlY3QpCisKKyAgICAgICAgbXlkaWFsZWN0LmRlbGltaXRlciA9IDQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBteWRpYWxlY3QpCisKKyAgICBkZWYgdGVzdF9saW5ldGVybWluYXRvcihzZWxmKToKKyAgICAgICAgY2xhc3MgbXlkaWFsZWN0KGNzdi5EaWFsZWN0KToKKyAgICAgICAgICAgIGRlbGltaXRlciA9ICI7IgorICAgICAgICAgICAgZXNjYXBlY2hhciA9ICdcXCcKKyAgICAgICAgICAgIGRvdWJsZXF1b3RlID0gRmFsc2UKKyAgICAgICAgICAgIHNraXBpbml0aWFsc3BhY2UgPSBUcnVlCisgICAgICAgICAgICBsaW5ldGVybWluYXRvciA9ICdcclxuJworICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FCisgICAgICAgIGQgPSBteWRpYWxlY3QoKQorCisgICAgICAgIG15ZGlhbGVjdC5saW5ldGVybWluYXRvciA9ICI6OjoiCisgICAgICAgIGQgPSBteWRpYWxlY3QoKQorCisgICAgICAgIG15ZGlhbGVjdC5saW5ldGVybWluYXRvciA9IDQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBteWRpYWxlY3QpCisKKworY2xhc3MgVGVzdFNuaWZmZXIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHNhbXBsZTEgPSAiIiJcCitIYXJyeSdzLCBBcmxpbmd0b24gSGVpZ2h0cywgSUwsIDIvMS8wMywgS2ltaSBIYXllcworU2hhcmsgQ2l0eSwgR2xlbmRhbGUgSGVpZ2h0cywgSUwsIDEyLzI4LzAyLCBQcmV6ZW5jZQorVG9tbXkncyBQbGFjZSwgQmx1ZSBJc2xhbmQsIElMLCAxMi8yOC8wMiwgQmx1ZSBTdW5kYXkvV2hpdGUgQ3JvdworU3RvbmVjdXR0ZXJzIFNlYWZvb2QgYW5kIENob3AgSG91c2UsIExlbW9udCwgSUwsIDEyLzE5LzAyLCBXZWVrIEJhY2sKKyIiIgorICAgIHNhbXBsZTIgPSAiIiJcCisnSGFycnknJ3MnOidBcmxpbmd0b24gSGVpZ2h0cyc6J0lMJzonMi8xLzAzJzonS2ltaSBIYXllcycKKydTaGFyayBDaXR5JzonR2xlbmRhbGUgSGVpZ2h0cyc6J0lMJzonMTIvMjgvMDInOidQcmV6ZW5jZScKKydUb21teScncyBQbGFjZSc6J0JsdWUgSXNsYW5kJzonSUwnOicxMi8yOC8wMic6J0JsdWUgU3VuZGF5L1doaXRlIENyb3cnCisnU3RvbmVjdXR0ZXJzICcnU2VhZm9vZCcnIGFuZCBDaG9wIEhvdXNlJzonTGVtb250JzonSUwnOicxMi8xOS8wMic6J1dlZWsgQmFjaycKKyIiIgorICAgIGhlYWRlciA9ICcnJ1wKKyJ2ZW51ZSIsImNpdHkiLCJzdGF0ZSIsImRhdGUiLCJwZXJmb3JtZXJzIgorJycnCisgICAgc2FtcGxlMyA9ICcnJ1wKKzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzCiswNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMworMDUvMDUvMDM/MDUvMDUvMDM/MDUvMDUvMDM/MDUvMDUvMDM/MDUvMDUvMDM/MDUvMDUvMDMKKycnJworCisgICAgc2FtcGxlNCA9ICcnJ1wKKzIxNDc0ODM2NDg7NDMuMGUxMjsxNzthYmM7ZGVmCisxNDc0ODM2NDg7NDMuMGUyOzE3O2FiYztkZWYKKzQ3NDgzNjQ4OzQzLjA7MTcwO2FiYztkZWYKKycnJworCisgICAgc2FtcGxlNSA9ICJhYWFcdGJiYlxyXG5BQUFcdFxyXG5CQkJcdFxyXG4iCisgICAgc2FtcGxlNiA9ICJhfGJ8Y1xyXG5kfGV8ZlxyXG4iCisgICAgc2FtcGxlNyA9ICInYSd8J2InfCdjJ1xyXG4nZCd8ZXxmXHJcbiIKKworICAgIGRlZiB0ZXN0X2hhc19oZWFkZXIoc2VsZik6CisgICAgICAgIHNuaWZmZXIgPSBjc3YuU25pZmZlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc25pZmZlci5oYXNfaGVhZGVyKHNlbGYuc2FtcGxlMSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuaWZmZXIuaGFzX2hlYWRlcihzZWxmLmhlYWRlcitzZWxmLnNhbXBsZTEpLCBUcnVlKQorCisgICAgZGVmIHRlc3Rfc25pZmYoc2VsZik6CisgICAgICAgIHNuaWZmZXIgPSBjc3YuU25pZmZlcigpCisgICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgIiwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QucXVvdGVjaGFyLCAnIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlLCBUcnVlKQorCisgICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgIjoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QucXVvdGVjaGFyLCAiJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2RlbGltaXRlcnMoc2VsZik6CisgICAgICAgIHNuaWZmZXIgPSBjc3YuU25pZmZlcigpCisgICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlMykKKyAgICAgICAgIyBnaXZlbiB0aGF0IGFsbCB0aHJlZSBsaW5lcyBpbiBzYW1wbGUzIGFyZSBlcXVhbCwKKyAgICAgICAgIyBJIHRoaW5rIHRoYXQgYW55IGNoYXJhY3RlciBjb3VsZCBoYXZlIGJlZW4gJ2d1ZXNzZWQnIGFzIHRoZQorICAgICAgICAjIGRlbGltaXRlciwgZGVwZW5kaW5nIG9uIGRpY3Rpb25hcnkgb3JkZXIKKyAgICAgICAgc2VsZi5hc3NlcnRJbihkaWFsZWN0LmRlbGltaXRlciwgc2VsZi5zYW1wbGUzKQorICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTMsIGRlbGltaXRlcnM9Ij8sIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgIj8iKQorICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTMsIGRlbGltaXRlcnM9Ii8sIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgIi8iKQorICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICI7IikKKyAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAiXHQiKQorICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICJ8IikKKyAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGU3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAifCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5xdW90ZWNoYXIsICInIikKKworICAgIGRlZiB0ZXN0X2RvdWJsZXF1b3RlKHNlbGYpOgorICAgICAgICBzbmlmZmVyID0gY3N2LlNuaWZmZXIoKQorICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLmhlYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkaWFsZWN0LmRvdWJsZXF1b3RlKQorICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWFsZWN0LmRvdWJsZXF1b3RlKQorCitpZiBub3QgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6IHByaW50ICIqKiogc2tpcHBpbmcgbGVha2FnZSB0ZXN0cyAqKioiCitlbHNlOgorICAgIGNsYXNzIE5VTDoKKyAgICAgICAgZGVmIHdyaXRlKHMsICphcmdzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd3JpdGVsaW5lcyA9IHdyaXRlCisKKyAgICBjbGFzcyBUZXN0TGVha3ModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBkZWYgdGVzdF9jcmVhdGVfcmVhZChzZWxmKToKKyAgICAgICAgICAgIGRlbHRhID0gMAorICAgICAgICAgICAgbGFzdHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwKToKKyAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmdhcmJhZ2UsIFtdKQorICAgICAgICAgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICAgICAgICAgIGNzdi5yZWFkZXIoWyJhLGIsY1xyXG4iXSkKKyAgICAgICAgICAgICAgICBjc3YucmVhZGVyKFsiYSxiLGNcclxuIl0pCisgICAgICAgICAgICAgICAgY3N2LnJlYWRlcihbImEsYixjXHJcbiJdKQorICAgICAgICAgICAgICAgIGRlbHRhID0gcmMtbGFzdHJjCisgICAgICAgICAgICAgICAgbGFzdHJjID0gcmMKKyAgICAgICAgICAgICMgaWYgY3N2LnJlYWRlcigpIGxlYWtzLCBsYXN0IGRlbHRhIHNob3VsZCBiZSAzIG9yIG1vcmUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVsdGEgPCAzLCBUcnVlKQorCisgICAgICAgIGRlZiB0ZXN0X2NyZWF0ZV93cml0ZShzZWxmKToKKyAgICAgICAgICAgIGRlbHRhID0gMAorICAgICAgICAgICAgbGFzdHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICAgICAgcyA9IE5VTCgpCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjApOgorICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pCisgICAgICAgICAgICAgICAgcmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgICAgICAgICAgY3N2LndyaXRlcihzKQorICAgICAgICAgICAgICAgIGNzdi53cml0ZXIocykKKyAgICAgICAgICAgICAgICBjc3Yud3JpdGVyKHMpCisgICAgICAgICAgICAgICAgZGVsdGEgPSByYy1sYXN0cmMKKyAgICAgICAgICAgICAgICBsYXN0cmMgPSByYworICAgICAgICAgICAgIyBpZiBjc3Yud3JpdGVyKCkgbGVha3MsIGxhc3QgZGVsdGEgc2hvdWxkIGJlIDMgb3IgbW9yZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWx0YSA8IDMsIFRydWUpCisKKyAgICAgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKKyAgICAgICAgICAgIGRlbHRhID0gMAorICAgICAgICAgICAgcm93cyA9IFsiYSxiLGNcclxuIl0qNQorICAgICAgICAgICAgbGFzdHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwKToKKyAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmdhcmJhZ2UsIFtdKQorICAgICAgICAgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICAgICAgICAgIHJkciA9IGNzdi5yZWFkZXIocm93cykKKyAgICAgICAgICAgICAgICBmb3Igcm93IGluIHJkcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGRlbHRhID0gcmMtbGFzdHJjCisgICAgICAgICAgICAgICAgbGFzdHJjID0gcmMKKyAgICAgICAgICAgICMgaWYgcmVhZGVyIGxlYWtzIGR1cmluZyByZWFkLCBkZWx0YSBzaG91bGQgYmUgNSBvciBtb3JlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlbHRhIDwgNSwgVHJ1ZSkKKworICAgICAgICBkZWYgdGVzdF93cml0ZShzZWxmKToKKyAgICAgICAgICAgIGRlbHRhID0gMAorICAgICAgICAgICAgcm93cyA9IFtbMSwyLDNdXSo1CisgICAgICAgICAgICBzID0gTlVMKCkKKyAgICAgICAgICAgIGxhc3RyYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMCk6CisgICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5nYXJiYWdlLCBbXSkKKyAgICAgICAgICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKHMpCisgICAgICAgICAgICAgICAgZm9yIHJvdyBpbiByb3dzOgorICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3cocm93KQorICAgICAgICAgICAgICAgIGRlbHRhID0gcmMtbGFzdHJjCisgICAgICAgICAgICAgICAgbGFzdHJjID0gcmMKKyAgICAgICAgICAgICMgaWYgd3JpdGVyIGxlYWtzIGR1cmluZyB3cml0ZSwgbGFzdCBkZWx0YSBzaG91bGQgYmUgNSBvciBtb3JlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlbHRhIDwgNSwgVHJ1ZSkKKworIyBjb21tZW50ZWQgb3V0IGZvciBub3cgLSBjc3YgbW9kdWxlIGRvZXNuJ3QgeWV0IHN1cHBvcnQgVW5pY29kZQorIyMgY2xhc3MgVGVzdFVuaWNvZGUodW5pdHRlc3QuVGVzdENhc2UpOgorIyMgICAgIGRlZiB0ZXN0X3VuaWNvZGVfcmVhZChzZWxmKToKKyMjICAgICAgICAgaW1wb3J0IGNvZGVjcworIyMgICAgICAgICBmID0gY29kZWNzLkVuY29kZWRGaWxlKFN0cmluZ0lPKCJNYXJ0aW4gdm9uIEz2d2lzLCIKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFyYyBBbmRy6SBMZW1idXJnLCIKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR3VpZG8gdmFuIFJvc3N1bSwiCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyYW7nb2lzIFBpbmFyZFxyXG4iKSwKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2VuY29kaW5nPSdpc28tODg1OS0xJykKKyMjICAgICAgICAgcmVhZGVyID0gY3N2LnJlYWRlcihmKQorIyMgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmVhZGVyKSwgW1t1Ik1hcnRpbiB2b24gTPZ3aXMiLAorIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ik1hcmMgQW5kcukgTGVtYnVyZyIsCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUiR3VpZG8gdmFuIFJvc3N1bSIsCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUiRnJhbudvaXMgUGluYXJkbiJdXSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIG1vZCA9IHN5cy5tb2R1bGVzW19fbmFtZV9fXQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgICpbZ2V0YXR0cihtb2QsIG5hbWUpIGZvciBuYW1lIGluIGRpcihtb2QpIGlmIG5hbWUuc3RhcnRzd2l0aCgnVGVzdCcpXQorICAgICkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3N2LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nzdi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5M2FiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nzdi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3N2LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nzdi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5M2FiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nzdi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3R5cGVzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3R5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZjI4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdHlwZXMucHkKQEAgLTAsMCArMSwxNSBAQAoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZQorI1NraXAgdGVzdHMgaWYgX2N0eXBlcyBtb2R1bGUgZG9lcyBub3QgZXhpc3QKK2ltcG9ydF9tb2R1bGUoJ19jdHlwZXMnKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBpbXBvcnQgY3R5cGVzLnRlc3QKKyAgICBza2lwcGVkLCB0ZXN0Y2FzZXMgPSBjdHlwZXMudGVzdC5nZXRfdGVzdHMoY3R5cGVzLnRlc3QsICJ0ZXN0XyoucHkiLCB2ZXJib3NpdHk9MCkKKyAgICBzdWl0ZXMgPSBbdW5pdHRlc3QubWFrZVN1aXRlKHQpIGZvciB0IGluIHRlc3RjYXNlc10KKyAgICBydW5fdW5pdHRlc3QodW5pdHRlc3QuVGVzdFN1aXRlKHN1aXRlcykpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2N0eXBlcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdHlwZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzgwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdHlwZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2N0eXBlcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdHlwZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMzgwMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdHlwZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2N1cnNlcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2N1cnNlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzNlY2MwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3Vyc2VzLnB5CkBAIC0wLDAgKzEsMjk1IEBACisjCisjIFRlc3Qgc2NyaXB0IGZvciB0aGUgY3Vyc2VzIG1vZHVsZQorIworIyBUaGlzIHNjcmlwdCBkb2Vzbid0IGFjdHVhbGx5IGRpc3BsYXkgYW55dGhpbmcgdmVyeSBjb2hlcmVudC4gYnV0IGl0CisjIGRvZXMgY2FsbCBldmVyeSBtZXRob2QgYW5kIGZ1bmN0aW9uLgorIworIyBGdW5jdGlvbnMgbm90IHRlc3RlZDoge2RlZixyZXNldH1fe3NoZWxsLHByb2d9X21vZGUsIGdldGNoKCksIGdldHN0cigpLAorIyBpbml0X2NvbG9yKCkKKyMgT25seSBjYWxsZWQsIG5vdCB0ZXN0ZWQ6IGdldG1vdXNlKCksIHVuZ2V0bW91c2UoKQorIworCitpbXBvcnQgc3lzLCB0ZW1wZmlsZSwgb3MKKworIyBPcHRpb25hbGx5IHRlc3QgY3Vyc2VzIG1vZHVsZS4gIFRoaXMgY3VycmVudGx5IHJlcXVpcmVzIHRoYXQgdGhlCisjICdjdXJzZXMnIHJlc291cmNlIGJlIGdpdmVuIG9uIHRoZSByZWdydGVzdCBjb21tYW5kIGxpbmUgdXNpbmcgdGhlIC11CisjIG9wdGlvbi4gIElmIG5vdCBhdmFpbGFibGUsIG5vdGhpbmcgYWZ0ZXIgdGhpcyBsaW5lIHdpbGwgYmUgZXhlY3V0ZWQuCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMsIGltcG9ydF9tb2R1bGUKK3JlcXVpcmVzKCdjdXJzZXMnKQorY3Vyc2VzID0gaW1wb3J0X21vZHVsZSgnY3Vyc2VzJykKK2N1cnNlcy5wYW5lbCA9IGltcG9ydF9tb2R1bGUoJ2N1cnNlcy5wYW5lbCcpCisKKworIyBYWFg6IGlmIG5ld3Rlcm0gd2FzIHN1cHBvcnRlZCB3ZSBjb3VsZCB1c2UgaXQgaW5zdGVhZCBvZiBpbml0c2NyIGFuZCBub3QgZXhpdAordGVybSA9IG9zLmVudmlyb24uZ2V0KCdURVJNJykKK2lmIG5vdCB0ZXJtIG9yIHRlcm0gPT0gJ3Vua25vd24nOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0LCAiJFRFUk09JXIsIGNhbGxpbmcgaW5pdHNjcigpIG1heSBjYXVzZSBleGl0IiAlIHRlcm0KKworaWYgc3lzLnBsYXRmb3JtID09ICJjeWd3aW4iOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJjeWd3aW4ncyBjdXJzZXMgbW9zdGx5IGp1c3QgaGFuZ3MiKQorCitkZWYgd2luZG93X2Z1bmNzKHN0ZHNjcik6CisgICAgIlRlc3QgdGhlIG1ldGhvZHMgb2Ygd2luZG93cyIKKyAgICB3aW4gPSBjdXJzZXMubmV3d2luKDEwLDEwKQorICAgIHdpbiA9IGN1cnNlcy5uZXd3aW4oNSw1LCA1LDUpCisgICAgd2luMiA9IGN1cnNlcy5uZXd3aW4oMTUsMTUsIDUsNSkKKworICAgIGZvciBtZXRoIGluIFtzdGRzY3IuYWRkY2gsIHN0ZHNjci5hZGRzdHJdOgorICAgICAgICBmb3IgYXJncyBpbiBbKCdhJyksICgnYScsIGN1cnNlcy5BX0JPTEQpLAorICAgICAgICAgICAgICAgICAgICAgKDQsNCwgJ2EnKSwgKDUsNSwgJ2EnLCBjdXJzZXMuQV9CT0xEKV06CisgICAgICAgICAgICBtZXRoKCphcmdzKQorCisgICAgZm9yIG1ldGggaW4gW3N0ZHNjci5ib3gsIHN0ZHNjci5jbGVhciwgc3Rkc2NyLmNscnRvYm90LAorICAgICAgICAgICAgICAgICBzdGRzY3IuY2xydG9lb2wsIHN0ZHNjci5jdXJzeW5jdXAsIHN0ZHNjci5kZWxjaCwKKyAgICAgICAgICAgICAgICAgc3Rkc2NyLmRlbGV0ZWxuLCBzdGRzY3IuZXJhc2UsIHN0ZHNjci5nZXRiZWd5eCwKKyAgICAgICAgICAgICAgICAgc3Rkc2NyLmdldGJrZ2QsIHN0ZHNjci5nZXRrZXksIHN0ZHNjci5nZXRtYXh5eCwKKyAgICAgICAgICAgICAgICAgc3Rkc2NyLmdldHBhcnl4LCBzdGRzY3IuZ2V0eXgsIHN0ZHNjci5pbmNoLAorICAgICAgICAgICAgICAgICBzdGRzY3IuaW5zZXJ0bG4sIHN0ZHNjci5pbnN0ciwgc3Rkc2NyLmlzX3dpbnRvdWNoZWQsCisgICAgICAgICAgICAgICAgIHdpbi5ub3V0cmVmcmVzaCwgc3Rkc2NyLnJlZHJhd3dpbiwgc3Rkc2NyLnJlZnJlc2gsCisgICAgICAgICAgICAgICAgIHN0ZHNjci5zdGFuZG91dCwgc3Rkc2NyLnN0YW5kZW5kLCBzdGRzY3Iuc3luY2Rvd24sCisgICAgICAgICAgICAgICAgIHN0ZHNjci5zeW5jdXAsIHN0ZHNjci50b3VjaHdpbiwgc3Rkc2NyLnVudG91Y2h3aW5dOgorICAgICAgICBtZXRoKCkKKworICAgIHN0ZHNjci5hZGRuc3RyKCcxMjM0JywgMykKKyAgICBzdGRzY3IuYWRkbnN0cignMTIzNCcsIDMsIGN1cnNlcy5BX0JPTEQpCisgICAgc3Rkc2NyLmFkZG5zdHIoNCw0LCAnMTIzNCcsIDMpCisgICAgc3Rkc2NyLmFkZG5zdHIoNSw1LCAnMTIzNCcsIDMsIGN1cnNlcy5BX0JPTEQpCisKKyAgICBzdGRzY3IuYXR0cm9uKGN1cnNlcy5BX0JPTEQpCisgICAgc3Rkc2NyLmF0dHJvZmYoY3Vyc2VzLkFfQk9MRCkKKyAgICBzdGRzY3IuYXR0cnNldChjdXJzZXMuQV9CT0xEKQorICAgIHN0ZHNjci5ia2dkKCcgJykKKyAgICBzdGRzY3IuYmtnZCgnICcsIGN1cnNlcy5BX1JFVkVSU0UpCisgICAgc3Rkc2NyLmJrZ2RzZXQoJyAnKQorICAgIHN0ZHNjci5ia2dkc2V0KCcgJywgY3Vyc2VzLkFfUkVWRVJTRSkKKworICAgIHdpbi5ib3JkZXIoNjUsIDY2LCA2NywgNjgsCisgICAgICAgICAgICAgICA2OSwgNzAsIDcxLCA3MikKKyAgICB3aW4uYm9yZGVyKCd8JywgJyEnLCAnLScsICdfJywKKyAgICAgICAgICAgICAgICcrJywgJ1xcJywgJyMnLCAnLycpCisgICAgdHJ5OgorICAgICAgICB3aW4uYm9yZGVyKDY1LCA2NiwgNjcsIDY4LAorICAgICAgICAgICAgICAgICAgIDY5LCBbXSwgNzEsIDcyKQorICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJFeHBlY3RlZCB3aW4uYm9yZGVyKCkgdG8gcmFpc2UgVHlwZUVycm9yIgorCisgICAgc3Rkc2NyLmNsZWFyb2soMSkKKworICAgIHdpbjQgPSBzdGRzY3IuZGVyd2luKDIsMikKKyAgICB3aW40ID0gc3Rkc2NyLmRlcndpbigxLDEsIDUsNSkKKyAgICB3aW40Lm12ZGVyd2luKDksOSkKKworICAgIHN0ZHNjci5lY2hvY2hhcignYScpCisgICAgc3Rkc2NyLmVjaG9jaGFyKCdhJywgY3Vyc2VzLkFfQk9MRCkKKyAgICBzdGRzY3IuaGxpbmUoJy0nLCA1KQorICAgIHN0ZHNjci5obGluZSgnLScsIDUsIGN1cnNlcy5BX0JPTEQpCisgICAgc3Rkc2NyLmhsaW5lKDEsMSwnLScsIDUpCisgICAgc3Rkc2NyLmhsaW5lKDEsMSwnLScsIDUsIGN1cnNlcy5BX0JPTEQpCisKKyAgICBzdGRzY3IuaWRjb2soMSkKKyAgICBzdGRzY3IuaWRsb2soMSkKKyAgICBzdGRzY3IuaW1tZWRvaygxKQorICAgIHN0ZHNjci5pbnNjaCgnYycpCisgICAgc3Rkc2NyLmluc2RlbGxuKDEpCisgICAgc3Rkc2NyLmluc25zdHIoJ2FiYycsIDMpCisgICAgc3Rkc2NyLmluc25zdHIoJ2FiYycsIDMsIGN1cnNlcy5BX0JPTEQpCisgICAgc3Rkc2NyLmluc25zdHIoNSwgNSwgJ2FiYycsIDMpCisgICAgc3Rkc2NyLmluc25zdHIoNSwgNSwgJ2FiYycsIDMsIGN1cnNlcy5BX0JPTEQpCisKKyAgICBzdGRzY3IuaW5zc3RyKCdkZWYnKQorICAgIHN0ZHNjci5pbnNzdHIoJ2RlZicsIGN1cnNlcy5BX0JPTEQpCisgICAgc3Rkc2NyLmluc3N0cig1LCA1LCAnZGVmJykKKyAgICBzdGRzY3IuaW5zc3RyKDUsIDUsICdkZWYnLCBjdXJzZXMuQV9CT0xEKQorICAgIHN0ZHNjci5pc19saW5ldG91Y2hlZCgwKQorICAgIHN0ZHNjci5rZXlwYWQoMSkKKyAgICBzdGRzY3IubGVhdmVvaygxKQorICAgIHN0ZHNjci5tb3ZlKDMsMykKKyAgICB3aW4ubXZ3aW4oMiwyKQorICAgIHN0ZHNjci5ub2RlbGF5KDEpCisgICAgc3Rkc2NyLm5vdGltZW91dCgxKQorICAgIHdpbjIub3ZlcmxheSh3aW4pCisgICAgd2luMi5vdmVyd3JpdGUod2luKQorICAgIHdpbjIub3ZlcmxheSh3aW4sIDEsIDIsIDMsIDMsIDIsIDEpCisgICAgd2luMi5vdmVyd3JpdGUod2luLCAxLCAyLCAzLCAzLCAyLCAxKQorICAgIHN0ZHNjci5yZWRyYXdsbigxLDIpCisKKyAgICBzdGRzY3Iuc2Nyb2xsb2soMSkKKyAgICBzdGRzY3Iuc2Nyb2xsKCkKKyAgICBzdGRzY3Iuc2Nyb2xsKDIpCisgICAgc3Rkc2NyLnNjcm9sbCgtMykKKworICAgIHN0ZHNjci5tb3ZlKDEyLCAyKQorICAgIHN0ZHNjci5zZXRzY3JyZWcoMTAsMTUpCisgICAgd2luMyA9IHN0ZHNjci5zdWJ3aW4oMTAsMTApCisgICAgd2luMyA9IHN0ZHNjci5zdWJ3aW4oMTAsMTAsIDUsNSkKKyAgICBzdGRzY3Iuc3luY29rKDEpCisgICAgc3Rkc2NyLnRpbWVvdXQoNSkKKyAgICBzdGRzY3IudG91Y2hsaW5lKDUsNSkKKyAgICBzdGRzY3IudG91Y2hsaW5lKDUsNSwwKQorICAgIHN0ZHNjci52bGluZSgnYScsIDMpCisgICAgc3Rkc2NyLnZsaW5lKCdhJywgMywgY3Vyc2VzLkFfU1RBTkRPVVQpCisgICAgc3Rkc2NyLmNoZ2F0KDUsIDIsIDMsIGN1cnNlcy5BX0JMSU5LKQorICAgIHN0ZHNjci5jaGdhdCgzLCBjdXJzZXMuQV9CT0xEKQorICAgIHN0ZHNjci5jaGdhdCg1LCA4LCBjdXJzZXMuQV9VTkRFUkxJTkUpCisgICAgc3Rkc2NyLmNoZ2F0KGN1cnNlcy5BX0JMSU5LKQorICAgIHN0ZHNjci5yZWZyZXNoKCkKKworICAgIHN0ZHNjci52bGluZSgxLDEsICdhJywgMykKKyAgICBzdGRzY3IudmxpbmUoMSwxLCAnYScsIDMsIGN1cnNlcy5BX1NUQU5ET1VUKQorCisgICAgaWYgaGFzYXR0cihjdXJzZXMsICdyZXNpemUnKToKKyAgICAgICAgc3Rkc2NyLnJlc2l6ZSgpCisgICAgaWYgaGFzYXR0cihjdXJzZXMsICdlbmNsb3NlJyk6CisgICAgICAgIHN0ZHNjci5lbmNsb3NlKCkKKworCitkZWYgbW9kdWxlX2Z1bmNzKHN0ZHNjcik6CisgICAgIlRlc3QgbW9kdWxlLWxldmVsIGZ1bmN0aW9ucyIKKworICAgIGZvciBmdW5jIGluIFtjdXJzZXMuYmF1ZHJhdGUsIGN1cnNlcy5iZWVwLCBjdXJzZXMuY2FuX2NoYW5nZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgY3Vyc2VzLmNicmVhaywgY3Vyc2VzLmRlZl9wcm9nX21vZGUsIGN1cnNlcy5kb3VwZGF0ZSwKKyAgICAgICAgICAgICAgICAgY3Vyc2VzLmZpbHRlciwgY3Vyc2VzLmZsYXNoLCBjdXJzZXMuZmx1c2hpbnAsCisgICAgICAgICAgICAgICAgIGN1cnNlcy5oYXNfY29sb3JzLCBjdXJzZXMuaGFzX2ljLCBjdXJzZXMuaGFzX2lsLAorICAgICAgICAgICAgICAgICBjdXJzZXMuaXNlbmR3aW4sIGN1cnNlcy5raWxsY2hhciwgY3Vyc2VzLmxvbmduYW1lLAorICAgICAgICAgICAgICAgICBjdXJzZXMubm9jYnJlYWssIGN1cnNlcy5ub2VjaG8sIGN1cnNlcy5ub25sLAorICAgICAgICAgICAgICAgICBjdXJzZXMubm9xaWZsdXNoLCBjdXJzZXMubm9yYXcsCisgICAgICAgICAgICAgICAgIGN1cnNlcy5yZXNldF9wcm9nX21vZGUsIGN1cnNlcy50ZXJtYXR0cnMsCisgICAgICAgICAgICAgICAgIGN1cnNlcy50ZXJtbmFtZSwgY3Vyc2VzLmVyYXNlY2hhciwgY3Vyc2VzLmdldHN5eF06CisgICAgICAgIGZ1bmMoKQorCisgICAgIyBGdW5jdGlvbnMgdGhhdCBhY3R1YWxseSBuZWVkIGFyZ3VtZW50cworICAgIGlmIGN1cnNlcy50aWdldHN0cigiY25vcm0iKToKKyAgICAgICAgY3Vyc2VzLmN1cnNfc2V0KDEpCisgICAgY3Vyc2VzLmRlbGF5X291dHB1dCgxKQorICAgIGN1cnNlcy5lY2hvKCkgOyBjdXJzZXMuZWNobygxKQorCisgICAgZnggPSB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCkKKyAgICAjIGNmIHRlbXBmaWxlLnB5IFRlbXBvcmFyeUZpbGUgdnMgTmFtZWRUZW1wb3JhcnlGaWxlCisgICAgaWYgb3MubmFtZSAhPSAncG9zaXgnIG9yIG9zLnN5cy5wbGF0Zm9ybSA9PSAnY3lnd2luJzoKKyAgICAgICAgZiA9IGZ4LmZpbGUKKyAgICBlbHNlOgorICAgICAgICBmID0gZngKKyAgICBzdGRzY3IucHV0d2luKGYpCisgICAgZi5zZWVrKDApCisgICAgY3Vyc2VzLmdldHdpbihmKQorICAgIGZ4LmNsb3NlKCkKKworICAgIGN1cnNlcy5oYWxmZGVsYXkoMSkKKyAgICBjdXJzZXMuaW50cmZsdXNoKDEpCisgICAgY3Vyc2VzLm1ldGEoMSkKKyAgICBjdXJzZXMubmFwbXMoMTAwKQorICAgIGN1cnNlcy5uZXdwYWQoNTAsNTApCisgICAgd2luID0gY3Vyc2VzLm5ld3dpbig1LDUpCisgICAgd2luID0gY3Vyc2VzLm5ld3dpbig1LDUsIDEsMSkKKyAgICBjdXJzZXMubmwoKSA7IGN1cnNlcy5ubCgxKQorICAgIGN1cnNlcy5wdXRwKCdhYmMnKQorICAgIGN1cnNlcy5xaWZsdXNoKCkKKyAgICBjdXJzZXMucmF3KCkgOyBjdXJzZXMucmF3KDEpCisgICAgY3Vyc2VzLnNldHN5eCg1LDUpCisgICAgY3Vyc2VzLnRpZ2V0ZmxhZygnaGMnKQorICAgIGN1cnNlcy50aWdldG51bSgnY28nKQorICAgIGN1cnNlcy50aWdldHN0cignY3InKQorICAgIGN1cnNlcy50cGFybSgnY3InKQorICAgIGN1cnNlcy50eXBlYWhlYWQoc3lzLl9fc3RkaW5fXy5maWxlbm8oKSkKKyAgICBjdXJzZXMudW5jdHJsKCdhJykKKyAgICBjdXJzZXMudW5nZXRjaCgnYScpCisgICAgY3Vyc2VzLnVzZV9lbnYoMSkKKworICAgICMgRnVuY3Rpb25zIG9ubHkgYXZhaWxhYmxlIG9uIGEgZmV3IHBsYXRmb3JtcworICAgIGlmIGN1cnNlcy5oYXNfY29sb3JzKCk6CisgICAgICAgIGN1cnNlcy5zdGFydF9jb2xvcigpCisgICAgICAgIGN1cnNlcy5pbml0X3BhaXIoMiwgMSwxKQorICAgICAgICBjdXJzZXMuY29sb3JfY29udGVudCgxKQorICAgICAgICBjdXJzZXMuY29sb3JfcGFpcigyKQorICAgICAgICBjdXJzZXMucGFpcl9jb250ZW50KGN1cnNlcy5DT0xPUl9QQUlSUyAtIDEpCisgICAgICAgIGN1cnNlcy5wYWlyX251bWJlcigwKQorCisgICAgICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAndXNlX2RlZmF1bHRfY29sb3JzJyk6CisgICAgICAgICAgICBjdXJzZXMudXNlX2RlZmF1bHRfY29sb3JzKCkKKworICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAna2V5bmFtZScpOgorICAgICAgICBjdXJzZXMua2V5bmFtZSgxMykKKworICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAnaGFzX2tleScpOgorICAgICAgICBjdXJzZXMuaGFzX2tleSgxMykKKworICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAnZ2V0bW91c2UnKToKKyAgICAgICAgKGF2YWlsbWFzaywgb2xkbWFzaykgPSBjdXJzZXMubW91c2VtYXNrKGN1cnNlcy5CVVRUT04xX1BSRVNTRUQpCisgICAgICAgICMgYXZhaWxtYXNrIGluZGljYXRlcyB0aGF0IG1vdXNlIHN0dWZmIG5vdCBhdmFpbGFibGUuCisgICAgICAgIGlmIGF2YWlsbWFzayAhPSAwOgorICAgICAgICAgICAgY3Vyc2VzLm1vdXNlaW50ZXJ2YWwoMTApCisgICAgICAgICAgICAjIGp1c3QgdmVyaWZ5IHRoZXNlIGRvbid0IGNhdXNlIGVycm9ycworICAgICAgICAgICAgY3Vyc2VzLnVuZ2V0bW91c2UoMCwgMCwgMCwgMCwgY3Vyc2VzLkJVVFRPTjFfUFJFU1NFRCkKKyAgICAgICAgICAgIG0gPSBjdXJzZXMuZ2V0bW91c2UoKQorCisgICAgaWYgaGFzYXR0cihjdXJzZXMsICdpc190ZXJtX3Jlc2l6ZWQnKToKKyAgICAgICAgY3Vyc2VzLmlzX3Rlcm1fcmVzaXplZCgqc3Rkc2NyLmdldG1heHl4KCkpCisgICAgaWYgaGFzYXR0cihjdXJzZXMsICdyZXNpemV0ZXJtJyk6CisgICAgICAgIGN1cnNlcy5yZXNpemV0ZXJtKCpzdGRzY3IuZ2V0bWF4eXgoKSkKKyAgICBpZiBoYXNhdHRyKGN1cnNlcywgJ3Jlc2l6ZV90ZXJtJyk6CisgICAgICAgIGN1cnNlcy5yZXNpemVfdGVybSgqc3Rkc2NyLmdldG1heHl4KCkpCisKK2RlZiB1bml0X3Rlc3RzKCk6CisgICAgZnJvbSBjdXJzZXMgaW1wb3J0IGFzY2lpCisgICAgZm9yIGNoLCBleHBlY3RlZCBpbiBbKCdhJywgJ2EnKSwgKCdBJywgJ0EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJzsnLCAnOycpLCAoJyAnLCAnICcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnXHg3ZicsICdePycpLCAoJ1xuJywgJ15KJyksICgnXDAnLCAnXkAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAjIE1ldGEtYml0IGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ1x4OGEnLCAnIV5KJyksICgnXHhjMScsICchQScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF06CisgICAgICAgIGlmIGFzY2lpLnVuY3RybChjaCkgIT0gZXhwZWN0ZWQ6CisgICAgICAgICAgICBwcmludCAnY3Vyc2VzLnVuY3RybCBmYWlscyBvbiBjaGFyYWN0ZXInLCByZXByKGNoKQorCisKK2RlZiB0ZXN0X3VzZXJwdHJfd2l0aG91dF9zZXQoc3Rkc2NyKToKKyAgICB3ID0gY3Vyc2VzLm5ld3dpbigxMCwgMTApCisgICAgcCA9IGN1cnNlcy5wYW5lbC5uZXdfcGFuZWwodykKKyAgICAjIHRyeSB0byBhY2Nlc3MgdXNlcnB0cigpIGJlZm9yZSBjYWxsaW5nIHNldF91c2VycHRyKCkgLS0gc2VnZmF1bHRzCisgICAgdHJ5OgorICAgICAgICBwLnVzZXJwdHIoKQorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICd1c2VycHRyIHNob3VsZCBmYWlsIHNpbmNlIG5vdCBzZXQnCisgICAgZXhjZXB0IGN1cnNlcy5wYW5lbC5lcnJvcjoKKyAgICAgICAgcGFzcworCitkZWYgdGVzdF9yZXNpemVfdGVybShzdGRzY3IpOgorICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAncmVzaXpldGVybScpOgorICAgICAgICBsaW5lcywgY29scyA9IGN1cnNlcy5MSU5FUywgY3Vyc2VzLkNPTFMKKyAgICAgICAgY3Vyc2VzLnJlc2l6ZXRlcm0obGluZXMgLSAxLCBjb2xzICsgMSkKKworICAgICAgICBpZiBjdXJzZXMuTElORVMgIT0gbGluZXMgLSAxIG9yIGN1cnNlcy5DT0xTICE9IGNvbHMgKyAxOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiRXhwZWN0ZWQgcmVzaXpldGVybSB0byB1cGRhdGUgTElORVMgYW5kIENPTFMiCisKK2RlZiB0ZXN0X2lzc3VlNjI0MyhzdGRzY3IpOgorICAgIGN1cnNlcy51bmdldGNoKDEwMjUpCisgICAgc3Rkc2NyLmdldGtleSgpCisKK2RlZiBtYWluKHN0ZHNjcik6CisgICAgY3Vyc2VzLnNhdmV0dHkoKQorICAgIHRyeToKKyAgICAgICAgbW9kdWxlX2Z1bmNzKHN0ZHNjcikKKyAgICAgICAgd2luZG93X2Z1bmNzKHN0ZHNjcikKKyAgICAgICAgdGVzdF91c2VycHRyX3dpdGhvdXRfc2V0KHN0ZHNjcikKKyAgICAgICAgdGVzdF9yZXNpemVfdGVybShzdGRzY3IpCisgICAgICAgIHRlc3RfaXNzdWU2MjQzKHN0ZHNjcikKKyAgICBmaW5hbGx5OgorICAgICAgICBjdXJzZXMucmVzZXR0eSgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgY3Vyc2VzLndyYXBwZXIobWFpbikKKyAgICB1bml0X3Rlc3RzKCkKK2Vsc2U6CisgICAgaWYgbm90IHN5cy5fX3N0ZG91dF9fLmlzYXR0eSgpOgorICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgic3lzLl9fc3Rkb3V0X18gaXMgbm90IGEgdHR5IikKKyAgICAjIHRlc3Rpbmcgc2V0dXB0ZXJtKCkgaW5zaWRlIGluaXRzY3IvZW5kd2luCisgICAgIyBjYXVzZXMgdGVybWluYWwgYnJlYWthZ2UKKyAgICBjdXJzZXMuc2V0dXB0ZXJtKGZkPXN5cy5fX3N0ZG91dF9fLmZpbGVubygpKQorICAgIHRyeToKKyAgICAgICAgc3Rkc2NyID0gY3Vyc2VzLmluaXRzY3IoKQorICAgICAgICBtYWluKHN0ZHNjcikKKyAgICBmaW5hbGx5OgorICAgICAgICBjdXJzZXMuZW5kd2luKCkKKyAgICB1bml0X3Rlc3RzKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2N1cnNlcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdXJzZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjdlYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdXJzZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2N1cnNlcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdXJzZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMjdlYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdXJzZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RhdGV0aW1lLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0NmQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CkBAIC0wLDAgKzEsMzM2NyBAQAorIiIiVGVzdCBkYXRlL3RpbWUgdHlwZS4KKworU2VlIGh0dHA6Ly93d3cuem9wZS5vcmcvTWVtYmVycy9mZHJha2UvRGF0ZVRpbWVXaWtpL1Rlc3RDYXNlcworIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitpbXBvcnQgc3lzCitpbXBvcnQgcGlja2xlCitpbXBvcnQgY1BpY2tsZQoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IE1JTllFQVIsIE1BWFlFQVIKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IHRpbWVkZWx0YQorZnJvbSBkYXRldGltZSBpbXBvcnQgdHppbmZvCitmcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lCitmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRlLCBkYXRldGltZQorCitwaWNrbGVfY2hvaWNlcyA9IFsocGlja2xlciwgdW5waWNrbGVyLCBwcm90bykKKyAgICAgICAgICAgICAgICAgIGZvciBwaWNrbGVyIGluIHBpY2tsZSwgY1BpY2tsZQorICAgICAgICAgICAgICAgICAgZm9yIHVucGlja2xlciBpbiBwaWNrbGUsIGNQaWNrbGUKKyAgICAgICAgICAgICAgICAgIGZvciBwcm90byBpbiByYW5nZSgzKV0KK2Fzc2VydCBsZW4ocGlja2xlX2Nob2ljZXMpID09IDIqMiozCisKKyMgQW4gYXJiaXRyYXJ5IGNvbGxlY3Rpb24gb2Ygb2JqZWN0cyBvZiBub24tZGF0ZXRpbWUgdHlwZXMsIGZvciB0ZXN0aW5nCisjIG1peGVkLXR5cGUgY29tcGFyaXNvbnMuCitPVEhFUlNUVUZGID0gKDEwLCAxMEwsIDM0LjUsICJhYmMiLCB7fSwgW10sICgpKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIG1vZHVsZSB0ZXN0cworCitjbGFzcyBUZXN0TW9kdWxlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NvbnN0YW50cyhzZWxmKToKKyAgICAgICAgaW1wb3J0IGRhdGV0aW1lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0ZXRpbWUuTUlOWUVBUiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRldGltZS5NQVhZRUFSLCA5OTk5KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB0emluZm8gdGVzdHMKKworY2xhc3MgRml4ZWRPZmZzZXQodHppbmZvKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb2Zmc2V0LCBuYW1lLCBkc3RvZmZzZXQ9NDIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG9mZnNldCwgaW50KToKKyAgICAgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YShtaW51dGVzPW9mZnNldCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShkc3RvZmZzZXQsIGludCk6CisgICAgICAgICAgICBkc3RvZmZzZXQgPSB0aW1lZGVsdGEobWludXRlcz1kc3RvZmZzZXQpCisgICAgICAgIHNlbGYuX19vZmZzZXQgPSBvZmZzZXQKKyAgICAgICAgc2VsZi5fX25hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuX19kc3RvZmZzZXQgPSBkc3RvZmZzZXQKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fbmFtZS5sb3dlcigpCisgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6CisgICAgICAgIHJldHVybiBzZWxmLl9fb2Zmc2V0CisgICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6CisgICAgICAgIHJldHVybiBzZWxmLl9fbmFtZQorICAgIGRlZiBkc3Qoc2VsZiwgZHQpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2RzdG9mZnNldAorCitjbGFzcyBQaWNrbGFibGVGaXhlZE9mZnNldChGaXhlZE9mZnNldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9mZnNldD1Ob25lLCBuYW1lPU5vbmUsIGRzdG9mZnNldD1Ob25lKToKKyAgICAgICAgRml4ZWRPZmZzZXQuX19pbml0X18oc2VsZiwgb2Zmc2V0LCBuYW1lLCBkc3RvZmZzZXQpCisKK2NsYXNzIFRlc3RUWkluZm8odW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfbm9uX2Fic3RyYWN0bmVzcyhzZWxmKToKKyAgICAgICAgIyBJbiBvcmRlciB0byBhbGxvdyBzdWJjbGFzc2VzIHRvIGdldCBwaWNrbGVkLCB0aGUgQyBpbXBsZW1lbnRhdGlvbgorICAgICAgICAjIHdhc24ndCBhYmxlIHRvIGdldCBhd2F5IHdpdGggaGF2aW5nIF9faW5pdF9fIHJhaXNlCisgICAgICAgICMgTm90SW1wbGVtZW50ZWRFcnJvci4KKyAgICAgICAgdXNlbGVzcyA9IHR6aW5mbygpCisgICAgICAgIGR0ID0gZGF0ZXRpbWUubWF4CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIHVzZWxlc3MudHpuYW1lLCBkdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgdXNlbGVzcy51dGNvZmZzZXQsIGR0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCB1c2VsZXNzLmRzdCwgZHQpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc19tdXN0X292ZXJyaWRlKHNlbGYpOgorICAgICAgICBjbGFzcyBOb3RFbm91Z2godHppbmZvKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIG5hbWUpOgorICAgICAgICAgICAgICAgIHNlbGYuX19vZmZzZXQgPSBvZmZzZXQKKyAgICAgICAgICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoTm90RW5vdWdoLCB0emluZm8pKQorICAgICAgICBuZSA9IE5vdEVub3VnaCgzLCAiTm90QnlBTG9uZ1Nob3QiKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobmUsIHR6aW5mbykKKworICAgICAgICBkdCA9IGRhdGV0aW1lLm5vdygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG5lLnR6bmFtZSwgZHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG5lLnV0Y29mZnNldCwgZHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG5lLmRzdCwgZHQpCisKKyAgICBkZWYgdGVzdF9ub3JtYWwoc2VsZik6CisgICAgICAgIGZvID0gRml4ZWRPZmZzZXQoMywgIlRocmVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZvLCB0emluZm8pCisgICAgICAgIGZvciBkdCBpbiBkYXRldGltZS5ub3coKSwgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm8udXRjb2Zmc2V0KGR0KSwgdGltZWRlbHRhKG1pbnV0ZXM9MykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvLnR6bmFtZShkdCksICJUaHJlZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvLmRzdChkdCksIHRpbWVkZWx0YShtaW51dGVzPTQyKSkKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nX2Jhc2Uoc2VsZik6CisgICAgICAgICMgVGhlcmUncyBubyBwb2ludCB0byBwaWNrbGluZyB0emluZm8gb2JqZWN0cyBvbiB0aGVpciBvd24gKHRoZXkKKyAgICAgICAgIyBjYXJyeSBubyBkYXRhKSwgYnV0IHRoZXkgbmVlZCB0byBiZSBwaWNrbGFibGUgYW55d2F5IGVsc2UKKyAgICAgICAgIyBjb25jcmV0ZSBzdWJjbGFzc2VzIGNhbid0IGJlIHBpY2tsZWQuCisgICAgICAgIG9yaWcgPSB0emluZm8uX19uZXdfXyh0emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKG9yaWcpIGlzIHR6aW5mbykKKyAgICAgICAgZm9yIHBpY2tsZXIsIHVucGlja2xlciwgcHJvdG8gaW4gcGlja2xlX2Nob2ljZXM6CisgICAgICAgICAgICBncmVlbiA9IHBpY2tsZXIuZHVtcHMob3JpZywgcHJvdG8pCisgICAgICAgICAgICBkZXJpdmVkID0gdW5waWNrbGVyLmxvYWRzKGdyZWVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoZGVyaXZlZCkgaXMgdHppbmZvKQorCisgICAgZGVmIHRlc3RfcGlja2xpbmdfc3ViY2xhc3Moc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHdlIGNhbiBwaWNrbGUvdW5waWNrbGUgYW4gaW5zdGFuY2Ugb2YgYSBzdWJjbGFzcy4KKyAgICAgICAgb2Zmc2V0ID0gdGltZWRlbHRhKG1pbnV0ZXM9LTMwMCkKKyAgICAgICAgb3JpZyA9IFBpY2tsYWJsZUZpeGVkT2Zmc2V0KG9mZnNldCwgJ2Nvb2tpZScpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShvcmlnLCB0emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKG9yaWcpIGlzIFBpY2tsYWJsZUZpeGVkT2Zmc2V0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWcudXRjb2Zmc2V0KE5vbmUpLCBvZmZzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZy50em5hbWUoTm9uZSksICdjb29raWUnKQorICAgICAgICBmb3IgcGlja2xlciwgdW5waWNrbGVyLCBwcm90byBpbiBwaWNrbGVfY2hvaWNlczoKKyAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKKyAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZGVyaXZlZCwgdHppbmZvKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoZGVyaXZlZCkgaXMgUGlja2xhYmxlRml4ZWRPZmZzZXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudXRjb2Zmc2V0KE5vbmUpLCBvZmZzZXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudHpuYW1lKE5vbmUpLCAnY29va2llJykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQmFzZSBjbGFzZSBmb3IgdGVzdGluZyBhIHBhcnRpY3VsYXIgYXNwZWN0IG9mIHRpbWVkZWx0YSwgdGltZSwgZGF0ZSBhbmQKKyMgZGF0ZXRpbWUgY29tcGFyaXNvbnMuCisKK2NsYXNzIEhhcm1sZXNzTWl4ZWRDb21wYXJpc29uOgorICAgICMgVGVzdCB0aGF0IF9fZXFfXyBhbmQgX19uZV9fIGRvbid0IGNvbXBsYWluIGZvciBtaXhlZC10eXBlIGNvbXBhcmlzb25zLgorCisgICAgIyBTdWJjbGFzc2VzIG11c3QgZGVmaW5lICd0aGVjbGFzcycsIGFuZCB0aGVjbGFzcygxLCAxLCAxKSBtdXN0IGJlIGEKKyAgICAjIGxlZ2l0IGNvbnN0cnVjdG9yLgorCisgICAgZGVmIHRlc3RfaGFybWxlc3NfbWl4ZWRfY29tcGFyaXNvbihzZWxmKToKKyAgICAgICAgbWUgPSBzZWxmLnRoZWNsYXNzKDEsIDEsIDEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtZSA9PSAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1lICE9ICgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCgpID09IG1lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCkgIT0gbWUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbihtZSwgWzEsIDIwTCwgW10sIG1lXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihbXSwgW21lLCAxLCAyMEwsIFtdXSkKKworICAgIGRlZiB0ZXN0X2hhcm1mdWxfbWl4ZWRfY29tcGFyaXNvbihzZWxmKToKKyAgICAgICAgbWUgPSBzZWxmLnRoZWNsYXNzKDEsIDEsIDEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG1lIDwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBtZSA8PSAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG1lID4gKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBtZSA+PSAoKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogKCkgPCBtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6ICgpIDw9IG1lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogKCkgPiBtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6ICgpID49IG1lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCAoKSwgbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCBtZSwgKCkpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHRpbWVkZWx0YSB0ZXN0cworCitjbGFzcyBUZXN0VGltZURlbHRhKEhhcm1sZXNzTWl4ZWRDb21wYXJpc29uLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICB0aGVjbGFzcyA9IHRpbWVkZWx0YQorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB0ZCA9IHRpbWVkZWx0YQorCisgICAgICAgICMgQ2hlY2sga2V5d29yZCBhcmdzIHRvIGNvbnN0cnVjdG9yCisgICAgICAgIGVxKHRkKCksIHRkKHdlZWtzPTAsIGRheXM9MCwgaG91cnM9MCwgbWludXRlcz0wLCBzZWNvbmRzPTAsCisgICAgICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcz0wLCBtaWNyb3NlY29uZHM9MCkpCisgICAgICAgIGVxKHRkKDEpLCB0ZChkYXlzPTEpKQorICAgICAgICBlcSh0ZCgwLCAxKSwgdGQoc2Vjb25kcz0xKSkKKyAgICAgICAgZXEodGQoMCwgMCwgMSksIHRkKG1pY3Jvc2Vjb25kcz0xKSkKKyAgICAgICAgZXEodGQod2Vla3M9MSksIHRkKGRheXM9NykpCisgICAgICAgIGVxKHRkKGRheXM9MSksIHRkKGhvdXJzPTI0KSkKKyAgICAgICAgZXEodGQoaG91cnM9MSksIHRkKG1pbnV0ZXM9NjApKQorICAgICAgICBlcSh0ZChtaW51dGVzPTEpLCB0ZChzZWNvbmRzPTYwKSkKKyAgICAgICAgZXEodGQoc2Vjb25kcz0xKSwgdGQobWlsbGlzZWNvbmRzPTEwMDApKQorICAgICAgICBlcSh0ZChtaWxsaXNlY29uZHM9MSksIHRkKG1pY3Jvc2Vjb25kcz0xMDAwKSkKKworICAgICAgICAjIENoZWNrIGZsb2F0IGFyZ3MgdG8gY29uc3RydWN0b3IKKyAgICAgICAgZXEodGQod2Vla3M9MS4wLzcpLCB0ZChkYXlzPTEpKQorICAgICAgICBlcSh0ZChkYXlzPTEuMC8yNCksIHRkKGhvdXJzPTEpKQorICAgICAgICBlcSh0ZChob3Vycz0xLjAvNjApLCB0ZChtaW51dGVzPTEpKQorICAgICAgICBlcSh0ZChtaW51dGVzPTEuMC82MCksIHRkKHNlY29uZHM9MSkpCisgICAgICAgIGVxKHRkKHNlY29uZHM9MC4wMDEpLCB0ZChtaWxsaXNlY29uZHM9MSkpCisgICAgICAgIGVxKHRkKG1pbGxpc2Vjb25kcz0wLjAwMSksIHRkKG1pY3Jvc2Vjb25kcz0xKSkKKworICAgIGRlZiB0ZXN0X2NvbXB1dGF0aW9ucyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHRkID0gdGltZWRlbHRhCisKKyAgICAgICAgYSA9IHRkKDcpICMgT25lIHdlZWsKKyAgICAgICAgYiA9IHRkKDAsIDYwKSAjIE9uZSBtaW51dGUKKyAgICAgICAgYyA9IHRkKDAsIDAsIDEwMDApICMgT25lIG1pbGxpc2Vjb25kCisgICAgICAgIGVxKGErYitjLCB0ZCg3LCA2MCwgMTAwMCkpCisgICAgICAgIGVxKGEtYiwgdGQoNiwgMjQqMzYwMCAtIDYwKSkKKyAgICAgICAgZXEoLWEsIHRkKC03KSkKKyAgICAgICAgZXEoK2EsIHRkKDcpKQorICAgICAgICBlcSgtYiwgdGQoLTEsIDI0KjM2MDAgLSA2MCkpCisgICAgICAgIGVxKC1jLCB0ZCgtMSwgMjQqMzYwMCAtIDEsIDk5OTAwMCkpCisgICAgICAgIGVxKGFicyhhKSwgYSkKKyAgICAgICAgZXEoYWJzKC1hKSwgYSkKKyAgICAgICAgZXEodGQoNiwgMjQqMzYwMCksIGEpCisgICAgICAgIGVxKHRkKDAsIDAsIDYwKjEwMDAwMDApLCBiKQorICAgICAgICBlcShhKjEwLCB0ZCg3MCkpCisgICAgICAgIGVxKGEqMTAsIDEwKmEpCisgICAgICAgIGVxKGEqMTBMLCAxMCphKQorICAgICAgICBlcShiKjEwLCB0ZCgwLCA2MDApKQorICAgICAgICBlcSgxMCpiLCB0ZCgwLCA2MDApKQorICAgICAgICBlcShiKjEwTCwgdGQoMCwgNjAwKSkKKyAgICAgICAgZXEoYyoxMCwgdGQoMCwgMCwgMTAwMDApKQorICAgICAgICBlcSgxMCpjLCB0ZCgwLCAwLCAxMDAwMCkpCisgICAgICAgIGVxKGMqMTBMLCB0ZCgwLCAwLCAxMDAwMCkpCisgICAgICAgIGVxKGEqLTEsIC1hKQorICAgICAgICBlcShiKi0yLCAtYi1iKQorICAgICAgICBlcShjKi0yLCAtYystYykKKyAgICAgICAgZXEoYiooNjAqMjQpLCAoYio2MCkqMjQpCisgICAgICAgIGVxKGIqKDYwKjI0KSwgKDYwKmIpKjI0KQorICAgICAgICBlcShjKjEwMDAsIHRkKDAsIDEpKQorICAgICAgICBlcSgxMDAwKmMsIHRkKDAsIDEpKQorICAgICAgICBlcShhLy83LCB0ZCgxKSkKKyAgICAgICAgZXEoYi8vMTAsIHRkKDAsIDYpKQorICAgICAgICBlcShjLy8xMDAwLCB0ZCgwLCAwLCAxKSkKKyAgICAgICAgZXEoYS8vMTAsIHRkKDAsIDcqMjQqMzYwKSkKKyAgICAgICAgZXEoYS8vMzYwMDAwMCwgdGQoMCwgMCwgNyoyNCoxMDAwKSkKKworICAgICAgICAjIElzc3VlICMxMTU3NgorICAgICAgICBlcSh0ZCg5OTk5OTk5OTksIDg2Mzk5LCA5OTk5OTkpIC0gdGQoOTk5OTk5OTk5LCA4NjM5OSwgOTk5OTk4KSwKKyAgICAgICAgICAgdGQoMCwgMCwgMSkpCisgICAgICAgIGVxKHRkKDk5OTk5OTk5OSwgMSwgMSkgLSB0ZCg5OTk5OTk5OTksIDEsIDApLAorICAgICAgICAgICB0ZCgwLCAwLCAxKSkKKworCisgICAgZGVmIHRlc3RfZGlzYWxsb3dlZF9jb21wdXRhdGlvbnMoc2VsZik6CisgICAgICAgIGEgPSB0aW1lZGVsdGEoNDIpCisKKyAgICAgICAgIyBBZGQvc3ViIGludHMsIGxvbmdzLCBmbG9hdHMgc2hvdWxkIGJlIGlsbGVnYWwKKyAgICAgICAgZm9yIGkgaW4gMSwgMUwsIDEuMDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhK2kpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYS1pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGkrYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBpLWEpCisKKyAgICAgICAgIyBNdWwvZGl2IGJ5IGZsb2F0IGlzbid0IHN1cHBvcnRlZC4KKyAgICAgICAgeCA9IDIuMworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYSp4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogeCphKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYS94KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogeC9hKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYSAvLyB4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogeCAvLyBhKQorCisgICAgICAgICMgRGl2aXNpb24gb2YgaW50IGJ5IHRpbWVkZWx0YSBkb2Vzbid0IG1ha2Ugc2Vuc2UuCisgICAgICAgICMgRGl2aXNpb24gYnkgemVybyBkb2Vzbid0IG1ha2Ugc2Vuc2UuCisgICAgICAgIGZvciB6ZXJvIGluIDAsIDBMOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHplcm8gLy8gYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsYW1iZGE6IGEgLy8gemVybykKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIGRheXMsIHNlY29uZHMsIHVzID0gMSwgNywgMzEKKyAgICAgICAgdGQgPSB0aW1lZGVsdGEoZGF5cywgc2Vjb25kcywgdXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGQuZGF5cywgZGF5cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZC5zZWNvbmRzLCBzZWNvbmRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRkLm1pY3Jvc2Vjb25kcywgdXMpCisKKyAgICBkZWYgdGVzdF90b3RhbF9zZWNvbmRzKHNlbGYpOgorICAgICAgICB0ZCA9IHRpbWVkZWx0YShkYXlzPTM2NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZC50b3RhbF9zZWNvbmRzKCksIDMxNTM2MDAwLjApCisgICAgICAgIGZvciB0b3RhbF9zZWNvbmRzIGluIFsxMjM0NTYuNzg5MDEyLCAtMTIzNDU2Ljc4OTAxMiwgMC4xMjM0NTYsIDAsIDFlNl06CisgICAgICAgICAgICB0ZCA9IHRpbWVkZWx0YShzZWNvbmRzPXRvdGFsX3NlY29uZHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRkLnRvdGFsX3NlY29uZHMoKSwgdG90YWxfc2Vjb25kcykKKyAgICAgICAgIyBJc3N1ZTg2NDQ6IFRlc3QgdGhhdCB0ZC50b3RhbF9zZWNvbmRzKCkgaGFzIHRoZSBzYW1lCisgICAgICAgICMgYWNjdXJhY3kgYXMgdGQgLyB0aW1lZGVsdGEoc2Vjb25kcz0xKS4KKyAgICAgICAgZm9yIG1zIGluIFstMSwgLTIsIC0xMjNdOgorICAgICAgICAgICAgdGQgPSB0aW1lZGVsdGEobWljcm9zZWNvbmRzPW1zKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZC50b3RhbF9zZWNvbmRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoMjQqMzYwMCp0ZC5kYXlzICsgdGQuc2Vjb25kcykqMTAqKjYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdGQubWljcm9zZWNvbmRzKS8xMCoqNikKKworICAgIGRlZiB0ZXN0X2NhcnJpZXMoc2VsZik6CisgICAgICAgIHQxID0gdGltZWRlbHRhKGRheXM9MTAwLAorICAgICAgICAgICAgICAgICAgICAgICB3ZWVrcz0tNywKKyAgICAgICAgICAgICAgICAgICAgICAgaG91cnM9LTI0KigxMDAtNDkpLAorICAgICAgICAgICAgICAgICAgICAgICBtaW51dGVzPS0zLAorICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzPTEyLAorICAgICAgICAgICAgICAgICAgICAgICBtaWNyb3NlY29uZHM9KDMqNjAgLSAxMikgKiAxZTYgKyAxKQorICAgICAgICB0MiA9IHRpbWVkZWx0YShtaWNyb3NlY29uZHM9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisKKyAgICBkZWYgdGVzdF9oYXNoX2VxdWFsaXR5KHNlbGYpOgorICAgICAgICB0MSA9IHRpbWVkZWx0YShkYXlzPTEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgd2Vla3M9LTcsCisgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzPS0yNCooMTAwLTQ5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWludXRlcz0tMywKKyAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcz0xMiwKKyAgICAgICAgICAgICAgICAgICAgICAgbWljcm9zZWNvbmRzPSgzKjYwIC0gMTIpICogMTAwMDAwMCkKKyAgICAgICAgdDIgPSB0aW1lZGVsdGEoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godDEpLCBoYXNoKHQyKSkKKworICAgICAgICB0MSArPSB0aW1lZGVsdGEod2Vla3M9NykKKyAgICAgICAgdDIgKz0gdGltZWRlbHRhKGRheXM9Nyo3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHQxKSwgaGFzaCh0MikpCisKKyAgICAgICAgZCA9IHt0MTogMX0KKyAgICAgICAgZFt0Ml0gPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbdDFdLCAyKQorCisgICAgZGVmIHRlc3RfcGlja2xpbmcoc2VsZik6CisgICAgICAgIGFyZ3MgPSAxMiwgMzQsIDU2CisgICAgICAgIG9yaWcgPSB0aW1lZGVsdGEoKmFyZ3MpCisgICAgICAgIGZvciBwaWNrbGVyLCB1bnBpY2tsZXIsIHByb3RvIGluIHBpY2tsZV9jaG9pY2VzOgorICAgICAgICAgICAgZ3JlZW4gPSBwaWNrbGVyLmR1bXBzKG9yaWcsIHByb3RvKQorICAgICAgICAgICAgZGVyaXZlZCA9IHVucGlja2xlci5sb2FkcyhncmVlbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZywgZGVyaXZlZCkKKworICAgIGRlZiB0ZXN0X2NvbXBhcmUoc2VsZik6CisgICAgICAgIHQxID0gdGltZWRlbHRhKDIsIDMsIDQpCisgICAgICAgIHQyID0gdGltZWRlbHRhKDIsIDMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA9PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDw9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPj0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgIT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+IHQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAwKQorCisgICAgICAgIGZvciBhcmdzIGluICgzLCAzLCAzKSwgKDIsIDQsIDQpLCAoMiwgMywgNSk6CisgICAgICAgICAgICB0MiA9IHRpbWVkZWx0YSgqYXJncykgICAjIHRoaXMgaXMgbGFyZ2VyIHRoYW4gdDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID4gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPj0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgIT0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgIT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID09IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA9PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPCB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPj0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDw9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgLTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAxKQorCisgICAgICAgIGZvciBiYWRhcmcgaW4gT1RIRVJTVFVGRjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEgPT0gYmFkYXJnLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEgIT0gYmFkYXJnLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYWRhcmcgPT0gdDEsIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYWRhcmcgIT0gdDEsIFRydWUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB0MSA8PSBiYWRhcmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogdDEgPCBiYWRhcmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogdDEgPiBiYWRhcmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogdDEgPj0gYmFkYXJnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGJhZGFyZyA8PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBiYWRhcmcgPCB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBiYWRhcmcgPiB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBiYWRhcmcgPj0gdDEpCisKKyAgICBkZWYgdGVzdF9zdHIoc2VsZik6CisgICAgICAgIHRkID0gdGltZWRlbHRhCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIGVxKHN0cih0ZCgxKSksICIxIGRheSwgMDowMDowMCIpCisgICAgICAgIGVxKHN0cih0ZCgtMSkpLCAiLTEgZGF5LCAwOjAwOjAwIikKKyAgICAgICAgZXEoc3RyKHRkKDIpKSwgIjIgZGF5cywgMDowMDowMCIpCisgICAgICAgIGVxKHN0cih0ZCgtMikpLCAiLTIgZGF5cywgMDowMDowMCIpCisKKyAgICAgICAgZXEoc3RyKHRkKGhvdXJzPTEyLCBtaW51dGVzPTU4LCBzZWNvbmRzPTU5KSksICIxMjo1ODo1OSIpCisgICAgICAgIGVxKHN0cih0ZChob3Vycz0yLCBtaW51dGVzPTMsIHNlY29uZHM9NCkpLCAiMjowMzowNCIpCisgICAgICAgIGVxKHN0cih0ZCh3ZWVrcz0tMzAsIGhvdXJzPTIzLCBtaW51dGVzPTEyLCBzZWNvbmRzPTM0KSksCisgICAgICAgICAgICItMjEwIGRheXMsIDIzOjEyOjM0IikKKworICAgICAgICBlcShzdHIodGQobWlsbGlzZWNvbmRzPTEpKSwgIjA6MDA6MDAuMDAxMDAwIikKKyAgICAgICAgZXEoc3RyKHRkKG1pY3Jvc2Vjb25kcz0zKSksICIwOjAwOjAwLjAwMDAwMyIpCisKKyAgICAgICAgZXEoc3RyKHRkKGRheXM9OTk5OTk5OTk5LCBob3Vycz0yMywgbWludXRlcz01OSwgc2Vjb25kcz01OSwKKyAgICAgICAgICAgICAgICAgICBtaWNyb3NlY29uZHM9OTk5OTk5KSksCisgICAgICAgICAgICI5OTk5OTk5OTkgZGF5cywgMjM6NTk6NTkuOTk5OTk5IikKKworICAgIGRlZiB0ZXN0X3JvdW5kdHJpcChzZWxmKToKKyAgICAgICAgZm9yIHRkIGluICh0aW1lZGVsdGEoZGF5cz05OTk5OTk5OTksIGhvdXJzPTIzLCBtaW51dGVzPTU5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzPTU5LCBtaWNyb3NlY29uZHM9OTk5OTk5KSwKKyAgICAgICAgICAgICAgICAgICB0aW1lZGVsdGEoZGF5cz0tOTk5OTk5OTk5KSwKKyAgICAgICAgICAgICAgICAgICB0aW1lZGVsdGEoZGF5cz0xLCBzZWNvbmRzPTIsIG1pY3Jvc2Vjb25kcz0zKSk6CisKKyAgICAgICAgICAgICMgVmVyaWZ5IHRkIC0+IHN0cmluZyAtPiB0ZCBpZGVudGl0eS4KKyAgICAgICAgICAgIHMgPSByZXByKHRkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgnZGF0ZXRpbWUuJykpCisgICAgICAgICAgICBzID0gc1s5Ol0KKyAgICAgICAgICAgIHRkMiA9IGV2YWwocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGQsIHRkMikKKworICAgICAgICAgICAgIyBWZXJpZnkgaWRlbnRpdHkgdmlhIHJlY29uc3RydWN0aW5nIGZyb20gcGllY2VzLgorICAgICAgICAgICAgdGQyID0gdGltZWRlbHRhKHRkLmRheXMsIHRkLnNlY29uZHMsIHRkLm1pY3Jvc2Vjb25kcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGQsIHRkMikKKworICAgIGRlZiB0ZXN0X3Jlc29sdXRpb25faW5mbyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHRpbWVkZWx0YS5taW4sIHRpbWVkZWx0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHRpbWVkZWx0YS5tYXgsIHRpbWVkZWx0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHRpbWVkZWx0YS5yZXNvbHV0aW9uLCB0aW1lZGVsdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEubWF4ID4gdGltZWRlbHRhLm1pbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lZGVsdGEubWluLCB0aW1lZGVsdGEoLTk5OTk5OTk5OSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZWRlbHRhLm1heCwgdGltZWRlbHRhKDk5OTk5OTk5OSwgMjQqMzYwMC0xLCAxZTYtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZWRlbHRhLnJlc29sdXRpb24sIHRpbWVkZWx0YSgwLCAwLCAxKSkKKworICAgIGRlZiB0ZXN0X292ZXJmbG93KHNlbGYpOgorICAgICAgICB0aW55ID0gdGltZWRlbHRhLnJlc29sdXRpb24KKworICAgICAgICB0ZCA9IHRpbWVkZWx0YS5taW4gKyB0aW55CisgICAgICAgIHRkIC09IHRpbnkgICMgbm8gcHJvYmxlbQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB0ZC5fX3N1Yl9fLCB0aW55KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB0ZC5fX2FkZF9fLCAtdGlueSkKKworICAgICAgICB0ZCA9IHRpbWVkZWx0YS5tYXggLSB0aW55CisgICAgICAgIHRkICs9IHRpbnkgICMgbm8gcHJvYmxlbQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB0ZC5fX2FkZF9fLCB0aW55KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB0ZC5fX3N1Yl9fLCAtdGlueSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBsYW1iZGE6IC10aW1lZGVsdGEubWF4KQorCisgICAgZGVmIHRlc3RfbWljcm9zZWNvbmRfcm91bmRpbmcoc2VsZik6CisgICAgICAgIHRkID0gdGltZWRlbHRhCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgICMgU2luZ2xlLWZpZWxkIHJvdW5kaW5nLgorICAgICAgICBlcSh0ZChtaWxsaXNlY29uZHM9MC40LzEwMDApLCB0ZCgwKSkgICAgIyByb3VuZHMgdG8gMAorICAgICAgICBlcSh0ZChtaWxsaXNlY29uZHM9LTAuNC8xMDAwKSwgdGQoMCkpICAgICMgcm91bmRzIHRvIDAKKyAgICAgICAgZXEodGQobWlsbGlzZWNvbmRzPTAuNi8xMDAwKSwgdGQobWljcm9zZWNvbmRzPTEpKQorICAgICAgICBlcSh0ZChtaWxsaXNlY29uZHM9LTAuNi8xMDAwKSwgdGQobWljcm9zZWNvbmRzPS0xKSkKKworICAgICAgICAjIFJvdW5kaW5nIGR1ZSB0byBjb250cmlidXRpb25zIGZyb20gbW9yZSB0aGFuIG9uZSBmaWVsZC4KKyAgICAgICAgdXNfcGVyX2hvdXIgPSAzNjAwZTYKKyAgICAgICAgdXNfcGVyX2RheSA9IHVzX3Blcl9ob3VyICogMjQKKyAgICAgICAgZXEodGQoZGF5cz0uNC91c19wZXJfZGF5KSwgdGQoMCkpCisgICAgICAgIGVxKHRkKGhvdXJzPS4yL3VzX3Blcl9ob3VyKSwgdGQoMCkpCisgICAgICAgIGVxKHRkKGRheXM9LjQvdXNfcGVyX2RheSwgaG91cnM9LjIvdXNfcGVyX2hvdXIpLCB0ZChtaWNyb3NlY29uZHM9MSkpCisKKyAgICAgICAgZXEodGQoZGF5cz0tLjQvdXNfcGVyX2RheSksIHRkKDApKQorICAgICAgICBlcSh0ZChob3Vycz0tLjIvdXNfcGVyX2hvdXIpLCB0ZCgwKSkKKyAgICAgICAgZXEodGQoZGF5cz0tLjQvdXNfcGVyX2RheSwgaG91cnM9LS4yL3VzX3Blcl9ob3VyKSwgdGQobWljcm9zZWNvbmRzPS0xKSkKKworICAgIGRlZiB0ZXN0X21hc3NpdmVfbm9ybWFsaXphdGlvbihzZWxmKToKKyAgICAgICAgdGQgPSB0aW1lZGVsdGEobWljcm9zZWNvbmRzPS0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh0ZC5kYXlzLCB0ZC5zZWNvbmRzLCB0ZC5taWNyb3NlY29uZHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgtMSwgMjQqMzYwMC0xLCA5OTk5OTkpKQorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWVkZWx0YSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWVkZWx0YSgwLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWVkZWx0YSgwLCAwLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWVkZWx0YShtaWNyb3NlY29uZHM9MSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdGltZWRlbHRhKDApKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfdGltZWRlbHRhKHNlbGYpOgorCisgICAgICAgIGNsYXNzIFQodGltZWRlbHRhKToKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiBmcm9tX3RkKHRkKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVCh0ZC5kYXlzLCB0ZC5zZWNvbmRzLCB0ZC5taWNyb3NlY29uZHMpCisKKyAgICAgICAgICAgIGRlZiBhc19ob3VycyhzZWxmKToKKyAgICAgICAgICAgICAgICBzdW0gPSAoc2VsZi5kYXlzICogMjQgKworICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlY29uZHMgLyAzNjAwLjAgKworICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1pY3Jvc2Vjb25kcyAvIDM2MDBlNikKKyAgICAgICAgICAgICAgICByZXR1cm4gcm91bmQoc3VtKQorCisgICAgICAgIHQxID0gVChkYXlzPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHQxKSBpcyBUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLmFzX2hvdXJzKCksIDI0KQorCisgICAgICAgIHQyID0gVChkYXlzPS0xLCBzZWNvbmRzPS0zNjAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0MikgaXMgVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi5hc19ob3VycygpLCAtMjUpCisKKyAgICAgICAgdDMgPSB0MSArIHQyCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHQzKSBpcyB0aW1lZGVsdGEpCisgICAgICAgIHQ0ID0gVC5mcm9tX3RkKHQzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0NCkgaXMgVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My5kYXlzLCB0NC5kYXlzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLnNlY29uZHMsIHQ0LnNlY29uZHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMubWljcm9zZWNvbmRzLCB0NC5taWNyb3NlY29uZHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQzKSwgc3RyKHQ0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0NC5hc19ob3VycygpLCAtMSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZGF0ZSB0ZXN0cworCitjbGFzcyBUZXN0RGF0ZU9ubHkodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGVzdHMgaGVyZSB3b24ndCBwYXNzIGlmIGFsc28gcnVuIG9uIGRhdGV0aW1lIG9iamVjdHMsIHNvIGRvbid0CisgICAgIyBzdWJjbGFzcyB0aGlzIHRvIHRlc3QgZGF0ZXRpbWVzIHRvby4KKworICAgIGRlZiB0ZXN0X2RlbHRhX25vbl9kYXlzX2lnbm9yZWQoc2VsZik6CisgICAgICAgIGR0ID0gZGF0ZSgyMDAwLCAxLCAyKQorICAgICAgICBkZWx0YSA9IHRpbWVkZWx0YShkYXlzPTEsIGhvdXJzPTIsIG1pbnV0ZXM9Mywgc2Vjb25kcz00LAorICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb3NlY29uZHM9NSkKKyAgICAgICAgZGF5cyA9IHRpbWVkZWx0YShkZWx0YS5kYXlzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRheXMsIHRpbWVkZWx0YSgxKSkKKworICAgICAgICBkdDIgPSBkdCArIGRlbHRhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLCBkdCArIGRheXMpCisKKyAgICAgICAgZHQyID0gZGVsdGEgKyBkdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MiwgZHQgKyBkYXlzKQorCisgICAgICAgIGR0MiA9IGR0IC0gZGVsdGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIsIGR0IC0gZGF5cykKKworICAgICAgICBkZWx0YSA9IC1kZWx0YQorICAgICAgICBkYXlzID0gdGltZWRlbHRhKGRlbHRhLmRheXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF5cywgdGltZWRlbHRhKC0yKSkKKworICAgICAgICBkdDIgPSBkdCArIGRlbHRhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLCBkdCArIGRheXMpCisKKyAgICAgICAgZHQyID0gZGVsdGEgKyBkdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MiwgZHQgKyBkYXlzKQorCisgICAgICAgIGR0MiA9IGR0IC0gZGVsdGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIsIGR0IC0gZGF5cykKKworY2xhc3MgU3ViY2xhc3NEYXRlKGRhdGUpOgorICAgIHN1Yl92YXIgPSAxCisKK2NsYXNzIFRlc3REYXRlKEhhcm1sZXNzTWl4ZWRDb21wYXJpc29uLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUZXN0cyBoZXJlIHNob3VsZCBwYXNzIGZvciBib3RoIGRhdGVzIGFuZCBkYXRldGltZXMsIGV4Y2VwdCBmb3IgYQorICAgICMgZmV3IHRlc3RzIHRoYXQgVGVzdERhdGVUaW1lIG92ZXJyaWRlcy4KKworICAgIHRoZWNsYXNzID0gZGF0ZQorCisgICAgZGVmIHRlc3RfYmFzaWNfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQueWVhciwgMjAwMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5tb250aCwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5kYXksIDEpCisKKyAgICBkZWYgdGVzdF9yb3VuZHRyaXAoc2VsZik6CisgICAgICAgIGZvciBkdCBpbiAoc2VsZi50aGVjbGFzcygxLCAyLCAzKSwKKyAgICAgICAgICAgICAgICAgICBzZWxmLnRoZWNsYXNzLnRvZGF5KCkpOgorICAgICAgICAgICAgIyBWZXJpZnkgZHQgLT4gc3RyaW5nIC0+IGRhdGUgaWRlbnRpdHkuCisgICAgICAgICAgICBzID0gcmVwcihkdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoJ2RhdGV0aW1lLicpKQorICAgICAgICAgICAgcyA9IHNbOTpdCisgICAgICAgICAgICBkdDIgPSBldmFsKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LCBkdDIpCisKKyAgICAgICAgICAgICMgVmVyaWZ5IGlkZW50aXR5IHZpYSByZWNvbnN0cnVjdGluZyBmcm9tIHBpZWNlcy4KKyAgICAgICAgICAgIGR0MiA9IHNlbGYudGhlY2xhc3MoZHQueWVhciwgZHQubW9udGgsIGR0LmRheSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQsIGR0MikKKworICAgIGRlZiB0ZXN0X29yZGluYWxfY29udmVyc2lvbnMoc2VsZik6CisgICAgICAgICMgQ2hlY2sgc29tZSBmaXhlZCB2YWx1ZXMuCisgICAgICAgIGZvciB5LCBtLCBkLCBuIGluIFsoMSwgMSwgMSwgMSksICAgICAgIyBjYWxlbmRhciBvcmlnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAxMiwgMzEsIDM2NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgMSwgMSwgMzY2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmlyc3QgZXhhbXBsZSBmcm9tICJDYWxlbmRyaWNhbCBDYWxjdWxhdGlvbnMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTk0NSwgMTEsIDEyLCA3MTAzNDcpXToKKyAgICAgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKHksIG0sIGQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4sIGQudG9vcmRpbmFsKCkpCisgICAgICAgICAgICBmcm9tb3JkID0gc2VsZi50aGVjbGFzcy5mcm9tb3JkaW5hbChuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBmcm9tb3JkKQorICAgICAgICAgICAgaWYgaGFzYXR0cihmcm9tb3JkLCAiaG91ciIpOgorICAgICAgICAgICAgIyBpZiB3ZSdyZSBjaGVja2luZyBzb21ldGhpbmcgZmFuY2llciB0aGFuIGEgZGF0ZSwgdmVyaWZ5CisgICAgICAgICAgICAjIHRoZSBleHRyYSBmaWVsZHMgaGF2ZSBiZWVuIHplcm9lZCBvdXQKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyb21vcmQuaG91ciwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyb21vcmQubWludXRlLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnJvbW9yZC5zZWNvbmQsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcm9tb3JkLm1pY3Jvc2Vjb25kLCAwKQorCisgICAgICAgICMgQ2hlY2sgZmlyc3QgYW5kIGxhc3QgZGF5cyBvZiB5ZWFyIHNwb3R0aWx5IGFjcm9zcyB0aGUgd2hvbGUKKyAgICAgICAgIyByYW5nZSBvZiB5ZWFycyBzdXBwb3J0ZWQuCisgICAgICAgIGZvciB5ZWFyIGluIHhyYW5nZShNSU5ZRUFSLCBNQVhZRUFSKzEsIDcpOgorICAgICAgICAgICAgIyBWZXJpZnkgKHllYXIsIDEsIDEpIC0+IG9yZGluYWwgLT4geSwgbSwgZCBpcyBpZGVudGl0eS4KKyAgICAgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKHllYXIsIDEsIDEpCisgICAgICAgICAgICBuID0gZC50b29yZGluYWwoKQorICAgICAgICAgICAgZDIgPSBzZWxmLnRoZWNsYXNzLmZyb21vcmRpbmFsKG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGQyKQorICAgICAgICAgICAgIyBWZXJpZnkgdGhhdCBtb3ZpbmcgYmFjayBhIGRheSBnZXRzIHRvIHRoZSBlbmQgb2YgeWVhci0xLgorICAgICAgICAgICAgaWYgeWVhciA+IDE6CisgICAgICAgICAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MuZnJvbW9yZGluYWwobi0xKQorICAgICAgICAgICAgICAgIGQyID0gc2VsZi50aGVjbGFzcyh5ZWFyLTEsIDEyLCAzMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGQyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIudG9vcmRpbmFsKCksIG4tMSkKKworICAgICAgICAjIFRlc3QgZXZlcnkgZGF5IGluIGEgbGVhcC15ZWFyIGFuZCBhIG5vbi1sZWFwIHllYXIuCisgICAgICAgIGRpbSA9IFszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXQorICAgICAgICBmb3IgeWVhciwgaXNsZWFwIGluICgyMDAwLCBUcnVlKSwgKDIwMDIsIEZhbHNlKToKKyAgICAgICAgICAgIG4gPSBzZWxmLnRoZWNsYXNzKHllYXIsIDEsIDEpLnRvb3JkaW5hbCgpCisgICAgICAgICAgICBmb3IgbW9udGgsIG1heGRheSBpbiB6aXAocmFuZ2UoMSwgMTMpLCBkaW0pOgorICAgICAgICAgICAgICAgIGlmIG1vbnRoID09IDIgYW5kIGlzbGVhcDoKKyAgICAgICAgICAgICAgICAgICAgbWF4ZGF5ICs9IDEKKyAgICAgICAgICAgICAgICBmb3IgZGF5IGluIHJhbmdlKDEsIG1heGRheSsxKToKKyAgICAgICAgICAgICAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoeWVhciwgbW9udGgsIGRheSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnRvb3JkaW5hbCgpLCBuKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHNlbGYudGhlY2xhc3MuZnJvbW9yZGluYWwobikpCisgICAgICAgICAgICAgICAgICAgIG4gKz0gMQorCisgICAgZGVmIHRlc3RfZXh0cmVtZV9vcmRpbmFscyhzZWxmKToKKyAgICAgICAgYSA9IHNlbGYudGhlY2xhc3MubWluCisgICAgICAgIGEgPSBzZWxmLnRoZWNsYXNzKGEueWVhciwgYS5tb250aCwgYS5kYXkpICAjIGdldCByaWQgb2YgdGltZSBwYXJ0cworICAgICAgICBhb3JkID0gYS50b29yZGluYWwoKQorICAgICAgICBiID0gYS5mcm9tb3JkaW5hbChhb3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBhLmZyb21vcmRpbmFsKGFvcmQgLSAxKSkKKworICAgICAgICBiID0gYSArIHRpbWVkZWx0YShkYXlzPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi50b29yZGluYWwoKSwgYW9yZCArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgc2VsZi50aGVjbGFzcy5mcm9tb3JkaW5hbChhb3JkICsgMSkpCisKKyAgICAgICAgYSA9IHNlbGYudGhlY2xhc3MubWF4CisgICAgICAgIGEgPSBzZWxmLnRoZWNsYXNzKGEueWVhciwgYS5tb250aCwgYS5kYXkpICAjIGdldCByaWQgb2YgdGltZSBwYXJ0cworICAgICAgICBhb3JkID0gYS50b29yZGluYWwoKQorICAgICAgICBiID0gYS5mcm9tb3JkaW5hbChhb3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBhLmZyb21vcmRpbmFsKGFvcmQgKyAxKSkKKworICAgICAgICBiID0gYSAtIHRpbWVkZWx0YShkYXlzPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi50b29yZGluYWwoKSwgYW9yZCAtIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgc2VsZi50aGVjbGFzcy5mcm9tb3JkaW5hbChhb3JkIC0gMSkpCisKKyAgICBkZWYgdGVzdF9iYWRfY29uc3RydWN0b3JfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICAjIGJhZCB5ZWFycworICAgICAgICBzZWxmLnRoZWNsYXNzKE1JTllFQVIsIDEsIDEpICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLnRoZWNsYXNzKE1BWFlFQVIsIDEsIDEpICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCBNSU5ZRUFSLTEsIDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIE1BWFlFQVIrMSwgMSwgMSkKKyAgICAgICAgIyBiYWQgbW9udGhzCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwMCwgMSwgMSkgICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcygyMDAwLCAxMiwgMSkgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAwLCAwLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAwLCAxMywgMSkKKyAgICAgICAgIyBiYWQgZGF5cworICAgICAgICBzZWxmLnRoZWNsYXNzKDIwMDAsIDIsIDI5KSAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwNCwgMiwgMjkpICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcygyNDAwLCAyLCAyOSkgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAwLCAyLCAzMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMSwgMiwgMjkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIxMDAsIDIsIDI5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAxOTAwLCAyLCAyOSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMSwgMzIpCisKKyAgICBkZWYgdGVzdF9oYXNoX2VxdWFsaXR5KHNlbGYpOgorICAgICAgICBkID0gc2VsZi50aGVjbGFzcygyMDAwLCAxMiwgMzEpCisgICAgICAgICMgc2FtZSB0aGluZworICAgICAgICBlID0gc2VsZi50aGVjbGFzcygyMDAwLCAxMiwgMzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGQpLCBoYXNoKGUpKQorCisgICAgICAgIGRpYyA9IHtkOiAxfQorICAgICAgICBkaWNbZV0gPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpYyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljW2RdLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY1tlXSwgMikKKworICAgICAgICBkID0gc2VsZi50aGVjbGFzcygyMDAxLCAgMSwgIDEpCisgICAgICAgICMgc2FtZSB0aGluZworICAgICAgICBlID0gc2VsZi50aGVjbGFzcygyMDAxLCAgMSwgIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGQpLCBoYXNoKGUpKQorCisgICAgICAgIGRpYyA9IHtkOiAxfQorICAgICAgICBkaWNbZV0gPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpYyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljW2RdLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY1tlXSwgMikKKworICAgIGRlZiB0ZXN0X2NvbXB1dGF0aW9ucyhzZWxmKToKKyAgICAgICAgYSA9IHNlbGYudGhlY2xhc3MoMjAwMiwgMSwgMzEpCisgICAgICAgIGIgPSBzZWxmLnRoZWNsYXNzKDE5NTYsIDEsIDMxKQorCisgICAgICAgIGRpZmYgPSBhLWIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWZmLmRheXMsIDQ2KjM2NSArIGxlbihyYW5nZSgxOTU2LCAyMDAyLCA0KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlmZi5zZWNvbmRzLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpZmYubWljcm9zZWNvbmRzLCAwKQorCisgICAgICAgIGRheSA9IHRpbWVkZWx0YSgxKQorICAgICAgICB3ZWVrID0gdGltZWRlbHRhKDcpCisgICAgICAgIGEgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSArIGRheSwgc2VsZi50aGVjbGFzcygyMDAyLCAzLCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXkgKyBhLCBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSBkYXksIHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLWRheSArIGEsIHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSArIHdlZWssIHNlbGYudGhlY2xhc3MoMjAwMiwgMywgOSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIHdlZWssIHNlbGYudGhlY2xhc3MoMjAwMiwgMiwgMjMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKyA1Mip3ZWVrLCBzZWxmLnRoZWNsYXNzKDIwMDMsIDMsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSA1Mip3ZWVrLCBzZWxmLnRoZWNsYXNzKDIwMDEsIDMsIDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhICsgd2VlaykgLSBhLCB3ZWVrKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhICsgZGF5KSAtIGEsIGRheSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSAtIHdlZWspIC0gYSwgLXdlZWspCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEgLSBkYXkpIC0gYSwgLWRheSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gKGEgKyB3ZWVrKSwgLXdlZWspCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIChhICsgZGF5KSwgLWRheSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gKGEgLSB3ZWVrKSwgd2VlaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gKGEgLSBkYXkpLCBkYXkpCisKKyAgICAgICAgIyBBZGQvc3ViIGludHMsIGxvbmdzLCBmbG9hdHMgc2hvdWxkIGJlIGlsbGVnYWwKKyAgICAgICAgZm9yIGkgaW4gMSwgMUwsIDEuMDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhK2kpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYS1pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGkrYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBpLWEpCisKKyAgICAgICAgIyBkZWx0YSAtIGRhdGUgaXMgc2Vuc2VsZXNzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogZGF5IC0gYSkKKyAgICAgICAgIyBtaXhpbmcgZGF0ZSBhbmQgKGRlbHRhIG9yIGRhdGUpIHZpYSAqIG9yIC8vIGlzIHNlbnNlbGVzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogZGF5ICogYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEgKiBkYXkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBkYXkgLy8gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEgLy8gZGF5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYSAqIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhIC8vIGEpCisgICAgICAgICMgZGF0ZSArIGRhdGUgaXMgc2Vuc2VsZXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhICsgYSkKKworICAgIGRlZiB0ZXN0X292ZXJmbG93KHNlbGYpOgorICAgICAgICB0aW55ID0gc2VsZi50aGVjbGFzcy5yZXNvbHV0aW9uCisKKyAgICAgICAgZm9yIGRlbHRhIGluIFt0aW55LCB0aW1lZGVsdGEoMSksIHRpbWVkZWx0YSgyKV06CisgICAgICAgICAgICBkdCA9IHNlbGYudGhlY2xhc3MubWluICsgZGVsdGEKKyAgICAgICAgICAgIGR0IC09IGRlbHRhICAjIG5vIHByb2JsZW0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGR0Ll9fc3ViX18sIGRlbHRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZHQuX19hZGRfXywgLWRlbHRhKQorCisgICAgICAgICAgICBkdCA9IHNlbGYudGhlY2xhc3MubWF4IC0gZGVsdGEKKyAgICAgICAgICAgIGR0ICs9IGRlbHRhICAjIG5vIHByb2JsZW0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGR0Ll9fYWRkX18sIGRlbHRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZHQuX19zdWJfXywgLWRlbHRhKQorCisgICAgZGVmIHRlc3RfZnJvbXRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgaW1wb3J0IHRpbWUKKworICAgICAgICAjIFRyeSBhbiBhcmJpdHJhcnkgZml4ZWQgdmFsdWUuCisgICAgICAgIHllYXIsIG1vbnRoLCBkYXkgPSAxOTk5LCA5LCAxOQorICAgICAgICB0cyA9IHRpbWUubWt0aW1lKCh5ZWFyLCBtb250aCwgZGF5LCAwLCAwLCAwLCAwLCAwLCAtMSkpCisgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAodHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC55ZWFyLCB5ZWFyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQubW9udGgsIG1vbnRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZGF5LCBkYXkpCisKKyAgICBkZWYgdGVzdF9pbnNhbmVfZnJvbXRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBwbGF0Zm9ybSBtYXBzIHRpbWVfdCB0byBkb3VibGUsCisgICAgICAgICMgYW5kIHRoYXQgdGhpcyB0ZXN0IHdpbGwgZmFpbCB0aGVyZS4gIFRoaXMgdGVzdCBzaG91bGQKKyAgICAgICAgIyBleGVtcHQgc3VjaCBwbGF0Zm9ybXMgKHByb3ZpZGVkIHRoZXkgcmV0dXJuIHJlYXNvbmFibGUKKyAgICAgICAgIyByZXN1bHRzISkuCisgICAgICAgIGZvciBpbnNhbmUgaW4gLTFlMjAwLCAxZTIwMDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MuZnJvbXRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2FuZSkKKworICAgIGRlZiB0ZXN0X3RvZGF5KHNlbGYpOgorICAgICAgICBpbXBvcnQgdGltZQorCisgICAgICAgICMgV2UgY2xhaW0gdGhhdCB0b2RheSgpIGlzIGxpa2UgZnJvbXRpbWVzdGFtcCh0aW1lLnRpbWUoKSksIHNvCisgICAgICAgICMgcHJvdmUgaXQuCisgICAgICAgIGZvciBkdW1teSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIHRvZGF5ID0gc2VsZi50aGVjbGFzcy50b2RheSgpCisgICAgICAgICAgICB0cyA9IHRpbWUudGltZSgpCisgICAgICAgICAgICB0b2RheWFnYWluID0gc2VsZi50aGVjbGFzcy5mcm9tdGltZXN0YW1wKHRzKQorICAgICAgICAgICAgaWYgdG9kYXkgPT0gdG9kYXlhZ2FpbjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIyBUaGVyZSBhcmUgc2V2ZXJhbCBsZWdpdCByZWFzb25zIHRoYXQgY291bGQgZmFpbDoKKyAgICAgICAgICAgICMgMS4gSXQgcmVjZW50bHkgYmVjYW1lIG1pZG5pZ2h0LCBiZXR3ZWVuIHRoZSB0b2RheSgpIGFuZCB0aGUKKyAgICAgICAgICAgICMgICAgdGltZSgpIGNhbGxzLgorICAgICAgICAgICAgIyAyLiBUaGUgcGxhdGZvcm0gdGltZSgpIGhhcyBzdWNoIGZpbmUgcmVzb2x1dGlvbiB0aGF0IHdlJ2xsCisgICAgICAgICAgICAjICAgIG5ldmVyIGdldCB0aGUgc2FtZSB2YWx1ZSB0d2ljZS4KKyAgICAgICAgICAgICMgMy4gVGhlIHBsYXRmb3JtIHRpbWUoKSBoYXMgcG9vciByZXNvbHV0aW9uLCBhbmQgd2UganVzdAorICAgICAgICAgICAgIyAgICBoYXBwZW5lZCB0byBjYWxsIHRvZGF5KCkgcmlnaHQgYmVmb3JlIGEgcmVzb2x1dGlvbiBxdWFudHVtCisgICAgICAgICAgICAjICAgIGJvdW5kYXJ5LgorICAgICAgICAgICAgIyA0LiBUaGUgc3lzdGVtIGNsb2NrIGdvdCBmaWRkbGVkIGJldHdlZW4gY2FsbHMuCisgICAgICAgICAgICAjIEluIGFueSBjYXNlLCB3YWl0IGEgbGl0dGxlIHdoaWxlIGFuZCB0cnkgYWdhaW4uCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgICAgICAjIEl0IHdvcmtlZCBvciBpdCBkaWRuJ3QuICBJZiBpdCBkaWRuJ3QsIGFzc3VtZSBpdCdzIHJlYXNvbiAjMiwgYW5kCisgICAgICAgICMgbGV0IHRoZSB0ZXN0IHBhc3MgaWYgdGhleSdyZSB3aXRoaW4gaGFsZiBhIHNlY29uZCBvZiBlYWNoIG90aGVyLgorICAgICAgICBzZWxmLmFzc2VydFRydWUodG9kYXkgPT0gdG9kYXlhZ2FpbiBvcgorICAgICAgICAgICAgICAgICAgICAgICAgYWJzKHRvZGF5YWdhaW4gLSB0b2RheSkgPCB0aW1lZGVsdGEoc2Vjb25kcz0wLjUpKQorCisgICAgZGVmIHRlc3Rfd2Vla2RheShzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNyk6CisgICAgICAgICAgICAjIE1hcmNoIDQsIDIwMDIgaXMgYSBNb25kYXkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGVjbGFzcygyMDAyLCAzLCA0K2kpLndlZWtkYXkoKSwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGVjbGFzcygyMDAyLCAzLCA0K2kpLmlzb3dlZWtkYXkoKSwgaSsxKQorICAgICAgICAgICAgIyBKYW51YXJ5IDIsIDE5NTYgaXMgYSBNb25kYXkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGVjbGFzcygxOTU2LCAxLCAyK2kpLndlZWtkYXkoKSwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGVjbGFzcygxOTU2LCAxLCAyK2kpLmlzb3dlZWtkYXkoKSwgaSsxKQorCisgICAgZGVmIHRlc3RfaXNvY2FsZW5kYXIoc2VsZik6CisgICAgICAgICMgQ2hlY2sgZXhhbXBsZXMgZnJvbQorICAgICAgICAjIGh0dHA6Ly93d3cucGh5cy51dS5ubC9+dmdlbnQvY2FsZW5kYXIvaXNvY2FsZW5kYXIuaHRtCisgICAgICAgIGZvciBpIGluIHJhbmdlKDcpOgorICAgICAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMjAwMywgMTIsIDIyK2kpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaXNvY2FsZW5kYXIoKSwgKDIwMDMsIDUyLCBpKzEpKQorICAgICAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMjAwMywgMTIsIDI5KSArIHRpbWVkZWx0YShpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmlzb2NhbGVuZGFyKCksICgyMDA0LCAxLCBpKzEpKQorICAgICAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMjAwNCwgMSwgNStpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmlzb2NhbGVuZGFyKCksICgyMDA0LCAyLCBpKzEpKQorICAgICAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMjAwOSwgMTIsIDIxK2kpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaXNvY2FsZW5kYXIoKSwgKDIwMDksIDUyLCBpKzEpKQorICAgICAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMjAwOSwgMTIsIDI4KSArIHRpbWVkZWx0YShpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmlzb2NhbGVuZGFyKCksICgyMDA5LCA1MywgaSsxKSkKKyAgICAgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKDIwMTAsIDEsIDQraSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pc29jYWxlbmRhcigpLCAoMjAxMCwgMSwgaSsxKSkKKworICAgIGRlZiB0ZXN0X2lzb19sb25nX3llYXJzKHNlbGYpOgorICAgICAgICAjIENhbGN1bGF0ZSBsb25nIElTTyB5ZWFycyBhbmQgY29tcGFyZSB0byB0YWJsZSBmcm9tCisgICAgICAgICMgaHR0cDovL3d3dy5waHlzLnV1Lm5sL352Z2VudC9jYWxlbmRhci9pc29jYWxlbmRhci5odG0KKyAgICAgICAgSVNPX0xPTkdfWUVBUlNfVEFCTEUgPSAiIiIKKyAgICAgICAgICAgICAgNCAgIDMyICAgNjAgICA4OAorICAgICAgICAgICAgICA5ICAgMzcgICA2NSAgIDkzCisgICAgICAgICAgICAgMTUgICA0MyAgIDcxICAgOTkKKyAgICAgICAgICAgICAyMCAgIDQ4ICAgNzYKKyAgICAgICAgICAgICAyNiAgIDU0ICAgODIKKworICAgICAgICAgICAgMTA1ICAxMzMgIDE2MSAgMTg5CisgICAgICAgICAgICAxMTEgIDEzOSAgMTY3ICAxOTUKKyAgICAgICAgICAgIDExNiAgMTQ0ICAxNzIKKyAgICAgICAgICAgIDEyMiAgMTUwICAxNzgKKyAgICAgICAgICAgIDEyOCAgMTU2ICAxODQKKworICAgICAgICAgICAgMjAxICAyMjkgIDI1NyAgMjg1CisgICAgICAgICAgICAyMDcgIDIzNSAgMjYzICAyOTEKKyAgICAgICAgICAgIDIxMiAgMjQwICAyNjggIDI5NgorICAgICAgICAgICAgMjE4ICAyNDYgIDI3NAorICAgICAgICAgICAgMjI0ICAyNTIgIDI4MAorCisgICAgICAgICAgICAzMDMgIDMzMSAgMzU5ICAzODcKKyAgICAgICAgICAgIDMwOCAgMzM2ICAzNjQgIDM5MgorICAgICAgICAgICAgMzE0ICAzNDIgIDM3MCAgMzk4CisgICAgICAgICAgICAzMjAgIDM0OCAgMzc2CisgICAgICAgICAgICAzMjUgIDM1MyAgMzgxCisgICAgICAgICIiIgorICAgICAgICBpc29fbG9uZ195ZWFycyA9IG1hcChpbnQsIElTT19MT05HX1lFQVJTX1RBQkxFLnNwbGl0KCkpCisgICAgICAgIGlzb19sb25nX3llYXJzLnNvcnQoKQorICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNDAwKToKKyAgICAgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKDIwMDAraSwgMTIsIDMxKQorICAgICAgICAgICAgZDEgPSBzZWxmLnRoZWNsYXNzKDE2MDAraSwgMTIsIDMxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmlzb2NhbGVuZGFyKClbMTpdLCBkMS5pc29jYWxlbmRhcigpWzE6XSkKKyAgICAgICAgICAgIGlmIGQuaXNvY2FsZW5kYXIoKVsxXSA9PSA1MzoKKyAgICAgICAgICAgICAgICBMLmFwcGVuZChpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwsIGlzb19sb25nX3llYXJzKQorCisgICAgZGVmIHRlc3RfaXNvZm9ybWF0KHNlbGYpOgorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyLCAzLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICIwMDAyLTAzLTAyIikKKworICAgIGRlZiB0ZXN0X2N0aW1lKHNlbGYpOgorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyMDAyLCAzLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuY3RpbWUoKSwgIlNhdCBNYXIgIDIgMDA6MDA6MDAgMjAwMiIpCisKKyAgICBkZWYgdGVzdF9zdHJmdGltZShzZWxmKToKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMjAwNSwgMywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKCJtOiVtIGQ6JWQgeToleSIpLCAibTowMyBkOjAyIHk6MDUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc3RyZnRpbWUoIiIpLCAiIikgIyBTRiBidWcgIzc2MTMzNworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc3RyZnRpbWUoJ3gnKjEwMDApLCAneCcqMTAwMCkgIyBTRiBidWcgIzE1NTY3ODQKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuc3RyZnRpbWUpICMgbmVlZHMgYW4gYXJnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdC5zdHJmdGltZSwgIm9uZSIsICJ0d28iKSAjIHRvbyBtYW55IGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LnN0cmZ0aW1lLCA0MikgIyBhcmcgd3JvbmcgdHlwZQorCisgICAgICAgICMgdGVzdCB0aGF0IHVuaWNvZGUgaW5wdXQgaXMgYWxsb3dlZCAoaXNzdWUgMjc4MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKHUiJW0iKSwgIjAzIikKKworICAgICAgICAjIEEgbmFpdmUgb2JqZWN0IHJlcGxhY2VzICV6IGFuZCAlWiB3LyBlbXB0eSBzdHJpbmdzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc3RyZnRpbWUoIicleicgJyVaJyIpLCAiJycgJyciKQorCisgICAgICAgICNtYWtlIHN1cmUgdGhhdCBpbnZhbGlkIGZvcm1hdCBzcGVjaWZpZXJzIGFyZSBoYW5kbGVkIGNvcnJlY3RseQorICAgICAgICAjc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5zdHJmdGltZSwgIiVlIikKKyAgICAgICAgI3NlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuc3RyZnRpbWUsICIlIikKKyAgICAgICAgI3NlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuc3RyZnRpbWUsICIlIyIpCisKKyAgICAgICAgI29oIHdlbGwsIHNvbWUgc3lzdGVtcyBqdXN0IGlnbm9yZSB0aG9zZSBpbnZhbGlkIG9uZXMuCisgICAgICAgICNhdCBsZWFzdCwgZXhjZXJjaXNlIHRoZW0gdG8gbWFrZSBzdXJlIHRoYXQgbm8gY3Jhc2hlcworICAgICAgICAjYXJlIGdlbmVyYXRlZAorICAgICAgICBmb3IgZiBpbiBbIiVlIiwgIiUiLCAiJSMiXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0LnN0cmZ0aW1lKGYpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgI2NoZWNrIHRoYXQgdGhpcyBzdGFuZGFyZCBleHRlbnNpb24gd29ya3MKKyAgICAgICAgdC5zdHJmdGltZSgiJWYiKQorCisKKyAgICBkZWYgdGVzdF9mb3JtYXQoc2VsZik6CisgICAgICAgIGR0ID0gc2VsZi50aGVjbGFzcygyMDA3LCA5LCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5fX2Zvcm1hdF9fKCcnKSwgc3RyKGR0KSkKKworICAgICAgICAjIGNoZWNrIHRoYXQgYSBkZXJpdmVkIGNsYXNzJ3MgX19zdHJfXygpIGdldHMgY2FsbGVkCisgICAgICAgIGNsYXNzIEEoc2VsZi50aGVjbGFzcyk6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ0EnCisgICAgICAgIGEgPSBBKDIwMDcsIDksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19mb3JtYXRfXygnJyksICdBJykKKworICAgICAgICAjIGNoZWNrIHRoYXQgYSBkZXJpdmVkIGNsYXNzJ3Mgc3RyZnRpbWUgZ2V0cyBjYWxsZWQKKyAgICAgICAgY2xhc3MgQihzZWxmLnRoZWNsYXNzKToKKyAgICAgICAgICAgIGRlZiBzdHJmdGltZShzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuICdCJworICAgICAgICBiID0gQigyMDA3LCA5LCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLl9fZm9ybWF0X18oJycpLCBzdHIoZHQpKQorCisgICAgICAgIGZvciBmbXQgaW4gWyJtOiVtIGQ6JWQgeToleSIsCisgICAgICAgICAgICAgICAgICAgICJtOiVtIGQ6JWQgeToleSBIOiVIIE06JU0gUzolUyIsCisgICAgICAgICAgICAgICAgICAgICIleiAlWiIsCisgICAgICAgICAgICAgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Ll9fZm9ybWF0X18oZm10KSwgZHQuc3RyZnRpbWUoZm10KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2Zvcm1hdF9fKGZtdCksIGR0LnN0cmZ0aW1lKGZtdCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuX19mb3JtYXRfXyhmbXQpLCAnQicpCisKKyAgICBkZWYgdGVzdF9yZXNvbHV0aW9uX2luZm8oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLnRoZWNsYXNzLm1pbiwgc2VsZi50aGVjbGFzcykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYudGhlY2xhc3MubWF4LCBzZWxmLnRoZWNsYXNzKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi50aGVjbGFzcy5yZXNvbHV0aW9uLCB0aW1lZGVsdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRoZWNsYXNzLm1heCA+IHNlbGYudGhlY2xhc3MubWluKQorCisgICAgZGVmIHRlc3RfZXh0cmVtZV90aW1lZGVsdGEoc2VsZik6CisgICAgICAgIGJpZyA9IHNlbGYudGhlY2xhc3MubWF4IC0gc2VsZi50aGVjbGFzcy5taW4KKyAgICAgICAgIyAzNjUyMDU4IGRheXMsIDIzIGhvdXJzLCA1OSBtaW51dGVzLCA1OSBzZWNvbmRzLCA5OTk5OTkgbWljcm9zZWNvbmRzCisgICAgICAgIG4gPSAoYmlnLmRheXMqMjQqMzYwMCArIGJpZy5zZWNvbmRzKSoxMDAwMDAwICsgYmlnLm1pY3Jvc2Vjb25kcworICAgICAgICAjIG4gPT0gMzE1NTM3ODk3NTk5OTk5OTk5IH49IDIqKjU4LjEzCisgICAgICAgIGp1c3Rhc2JpZyA9IHRpbWVkZWx0YSgwLCAwLCBuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpZywganVzdGFzYmlnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhlY2xhc3MubWluICsgYmlnLCBzZWxmLnRoZWNsYXNzLm1heCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZWNsYXNzLm1heCAtIGJpZywgc2VsZi50aGVjbGFzcy5taW4pCisKKyAgICBkZWYgdGVzdF90aW1ldHVwbGUoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDcpOgorICAgICAgICAgICAgIyBKYW51YXJ5IDIsIDE5NTYgaXMgYSBNb25kYXkgKDApCisgICAgICAgICAgICBkID0gc2VsZi50aGVjbGFzcygxOTU2LCAxLCAyK2kpCisgICAgICAgICAgICB0ID0gZC50aW1ldHVwbGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoMTk1NiwgMSwgMitpLCAwLCAwLCAwLCBpLCAyK2ksIC0xKSkKKyAgICAgICAgICAgICMgRmVicnVhcnkgMSwgMTk1NiBpcyBhIFdlZG5lc2RheSAoMikKKyAgICAgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKDE5NTYsIDIsIDEraSkKKyAgICAgICAgICAgIHQgPSBkLnRpbWV0dXBsZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsICgxOTU2LCAyLCAxK2ksIDAsIDAsIDAsICgyK2kpJTcsIDMyK2ksIC0xKSkKKyAgICAgICAgICAgICMgTWFyY2ggMSwgMTk1NiBpcyBhIFRodXJzZGF5ICgzKSwgYW5kIGlzIHRoZSAzMSsyOSsxID0gNjFzdCBkYXkKKyAgICAgICAgICAgICMgb2YgdGhlIHllYXIuCisgICAgICAgICAgICBkID0gc2VsZi50aGVjbGFzcygxOTU2LCAzLCAxK2kpCisgICAgICAgICAgICB0ID0gZC50aW1ldHVwbGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoMTk1NiwgMywgMStpLCAwLCAwLCAwLCAoMytpKSU3LCA2MStpLCAtMSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1feWVhciwgMTk1NikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50bV9tb24sIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1fbWRheSwgMStpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX2hvdXIsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1fbWluLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX3NlYywgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50bV93ZGF5LCAoMytpKSU3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX3lkYXksIDYxK2kpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1faXNkc3QsIC0xKQorCisgICAgZGVmIHRlc3RfcGlja2xpbmcoc2VsZik6CisgICAgICAgIGFyZ3MgPSA2LCA3LCAyMworICAgICAgICBvcmlnID0gc2VsZi50aGVjbGFzcygqYXJncykKKyAgICAgICAgZm9yIHBpY2tsZXIsIHVucGlja2xlciwgcHJvdG8gaW4gcGlja2xlX2Nob2ljZXM6CisgICAgICAgICAgICBncmVlbiA9IHBpY2tsZXIuZHVtcHMob3JpZywgcHJvdG8pCisgICAgICAgICAgICBkZXJpdmVkID0gdW5waWNrbGVyLmxvYWRzKGdyZWVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnLCBkZXJpdmVkKQorCisgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmKToKKyAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKDIsIDMsIDQpCisgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygyLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID49IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxICE9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxIDwgdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMCkKKworICAgICAgICBmb3IgYXJncyBpbiAoMywgMywgMyksICgyLCA0LCA0KSwgKDIsIDMsIDUpOgorICAgICAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzKCphcmdzKSAgICMgdGhpcyBpcyBsYXJnZXIgdGhhbiB0MQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPiB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA+PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSAhPSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiAhPSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPT0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyID09IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPD0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAtMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDEpCisKKyAgICAgICAgZm9yIGJhZGFyZyBpbiBPVEhFUlNUVUZGOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSA9PSBiYWRhcmcsIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSAhPSBiYWRhcmcsIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhZGFyZyA9PSB0MSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhZGFyZyAhPSB0MSwgVHJ1ZSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxIDwgYmFkYXJnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxID4gYmFkYXJnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxID49IGJhZGFyZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBiYWRhcmcgPD0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYmFkYXJnIDwgdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYmFkYXJnID4gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYmFkYXJnID49IHQxKQorCisgICAgZGVmIHRlc3RfbWl4ZWRfY29tcGFyZShzZWxmKToKKyAgICAgICAgb3VyID0gc2VsZi50aGVjbGFzcygyMDAwLCA0LCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgb3VyLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgMSwgb3VyKQorCisgICAgICAgIGNsYXNzIEFub3RoZXJEYXRlVGltZUNsYXNzKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgIyBSZXR1cm4gImVxdWFsIiBzbyBjYWxsaW5nIHRoaXMgY2FuJ3QgYmUgY29uZnVzZWQgd2l0aAorICAgICAgICAgICAgICAgICMgY29tcGFyZS1ieS1hZGRyZXNzICh3aGljaCBuZXZlciBzYXlzICJlcXVhbCIgZm9yIGRpc3RpbmN0CisgICAgICAgICAgICAgICAgIyBvYmplY3RzKS4KKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKworICAgICAgICAjIFRoaXMgc3RpbGwgZXJyb3JzLCBiZWNhdXNlIGRhdGUgYW5kIGRhdGV0aW1lIGNvbXBhcmlzb24gcmFpc2UKKyAgICAgICAgIyBUeXBlRXJyb3IgaW5zdGVhZCBvZiBOb3RJbXBsZW1lbnRlZCB3aGVuIHRoZXkgZG9uJ3Qga25vdyB3aGF0IHRvCisgICAgICAgICMgZG8sIGluIG9yZGVyIHRvIHN0b3AgY29tcGFyaXNvbiBmcm9tIGZhbGxpbmcgYmFjayB0byB0aGUgZGVmYXVsdAorICAgICAgICAjIGNvbXBhcmUtYnktYWRkcmVzcy4KKyAgICAgICAgdGhlaXIgPSBBbm90aGVyRGF0ZVRpbWVDbGFzcygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCBvdXIsIHRoZWlyKQorICAgICAgICAjIE9vcHM6ICBUaGUgbmV4dCBzdGFiIHJhaXNlcyBUeXBlRXJyb3IgaW4gdGhlIEMgaW1wbGVtZW50YXRpb24sCisgICAgICAgICMgYnV0IG5vdCBpbiB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIGRhdGV0aW1lLiAgVGhlIGRpZmZlcmVuY2UKKyAgICAgICAgIyBpcyBkdWUgdG8gdGhhdCB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIGRlZmluZXMgX19jbXBfXyBidXQKKyAgICAgICAgIyB0aGUgQyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVzIHRwX3JpY2hjb21wYXJlLiAgVGhpcyBpcyBtb3JlIHBhaW4KKyAgICAgICAgIyB0byBmaXggdGhhbiBpdCdzIHdvcnRoLCBzbyBjb21tZW50aW5nIG91dCB0aGUgdGVzdC4KKyAgICAgICAgIyBzZWxmLmFzc2VydEVxdWFsKGNtcCh0aGVpciwgb3VyKSwgMCkKKworICAgICAgICAjIEJ1dCBkYXRlIGFuZCBkYXRldGltZSBjb21wYXJpc29uIHJldHVybiBOb3RJbXBsZW1lbnRlZCBpbnN0ZWFkIGlmIHRoZQorICAgICAgICAjIG90aGVyIG9iamVjdCBoYXMgYSB0aW1ldHVwbGUgYXR0ci4gIFRoaXMgZ2l2ZXMgdGhlIG90aGVyIG9iamVjdCBhCisgICAgICAgICMgY2hhbmNlIHRvIGRvIHRoZSBjb21wYXJpc29uLgorICAgICAgICBjbGFzcyBDb21wYXJhYmxlKEFub3RoZXJEYXRlVGltZUNsYXNzKToKKyAgICAgICAgICAgIGRlZiB0aW1ldHVwbGUoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICgpCisKKyAgICAgICAgdGhlaXIgPSBDb21wYXJhYmxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAob3VyLCB0aGVpciksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHRoZWlyLCBvdXIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3VyID09IHRoZWlyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGhlaXIgPT0gb3VyKQorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgIyBBbGwgZGF0ZXMgYXJlIGNvbnNpZGVyZWQgdHJ1ZS4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudGhlY2xhc3MubWluKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50aGVjbGFzcy5tYXgpCisKKyAgICBkZWYgdGVzdF9zdHJmdGltZV9vdXRfb2ZfcmFuZ2Uoc2VsZik6CisgICAgICAgICMgRm9yIG5hc3R5IHRlY2huaWNhbCByZWFzb25zLCB3ZSBjYW4ndCBoYW5kbGUgeWVhcnMgYmVmb3JlIDE5MDAuCisgICAgICAgIGNscyA9IHNlbGYudGhlY2xhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbHMoMTkwMCwgMSwgMSkuc3RyZnRpbWUoIiVZIiksICIxOTAwIikKKyAgICAgICAgZm9yIHkgaW4gMSwgNDksIDUxLCA5OSwgMTAwLCAxMDAwLCAxODk5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2xzKHksIDEsIDEpLnN0cmZ0aW1lLCAiJVkiKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworICAgICAgICBhcmdzID0gWzEsIDIsIDNdCisgICAgICAgIGJhc2UgPSBjbHMoKmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgYmFzZS5yZXBsYWNlKCkpCisKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIG5hbWUsIG5ld3ZhbCBpbiAoKCJ5ZWFyIiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibW9udGgiLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJkYXkiLCA0KSk6CisgICAgICAgICAgICBuZXdhcmdzID0gYXJnc1s6XQorICAgICAgICAgICAgbmV3YXJnc1tpXSA9IG5ld3ZhbAorICAgICAgICAgICAgZXhwZWN0ZWQgPSBjbHMoKm5ld2FyZ3MpCisgICAgICAgICAgICBnb3QgPSBiYXNlLnJlcGxhY2UoKip7bmFtZTogbmV3dmFsfSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKyAgICAgICAgICAgIGkgKz0gMQorCisgICAgICAgICMgT3V0IG9mIGJvdW5kcy4KKyAgICAgICAgYmFzZSA9IGNscygyMDAwLCAyLCAyOSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYmFzZS5yZXBsYWNlLCB5ZWFyPTIwMDEpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc19kYXRlKHNlbGYpOgorCisgICAgICAgIGNsYXNzIEMoc2VsZi50aGVjbGFzcyk6CisgICAgICAgICAgICB0aGVBbnN3ZXIgPSA0MgorCisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzLCAqKmt3cyk6CisgICAgICAgICAgICAgICAgdGVtcCA9IGt3cy5jb3B5KCkKKyAgICAgICAgICAgICAgICBleHRyYSA9IHRlbXAucG9wKCdleHRyYScpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi50aGVjbGFzcy5fX25ld19fKGNscywgKmFyZ3MsICoqdGVtcCkKKyAgICAgICAgICAgICAgICByZXN1bHQuZXh0cmEgPSBleHRyYQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICAgICAgICAgZGVmIG5ld21ldGgoc2VsZiwgc3RhcnQpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdGFydCArIHNlbGYueWVhciArIHNlbGYubW9udGgKKworICAgICAgICBhcmdzID0gMjAwMywgNCwgMTQKKworICAgICAgICBkdDEgPSBzZWxmLnRoZWNsYXNzKCphcmdzKQorICAgICAgICBkdDIgPSBDKCphcmdzLCAqKnsnZXh0cmEnOiA3fSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi5fX2NsYXNzX18sIEMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLnRoZUFuc3dlciwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLmV4dHJhLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MS50b29yZGluYWwoKSwgZHQyLnRvb3JkaW5hbCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi5uZXdtZXRoKC03KSwgZHQxLnllYXIgKyBkdDEubW9udGggLSA3KQorCisgICAgZGVmIHRlc3RfcGlja2xpbmdfc3ViY2xhc3NfZGF0ZShzZWxmKToKKworICAgICAgICBhcmdzID0gNiwgNywgMjMKKyAgICAgICAgb3JpZyA9IFN1YmNsYXNzRGF0ZSgqYXJncykKKyAgICAgICAgZm9yIHBpY2tsZXIsIHVucGlja2xlciwgcHJvdG8gaW4gcGlja2xlX2Nob2ljZXM6CisgICAgICAgICAgICBncmVlbiA9IHBpY2tsZXIuZHVtcHMob3JpZywgcHJvdG8pCisgICAgICAgICAgICBkZXJpdmVkID0gdW5waWNrbGVyLmxvYWRzKGdyZWVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnLCBkZXJpdmVkKQorCisgICAgZGVmIHRlc3RfYmFja2Rvb3JfcmVzaXN0YW5jZShzZWxmKToKKyAgICAgICAgIyBGb3IgZmFzdCB1bnBpY2tsaW5nLCB0aGUgY29uc3RydWN0b3IgYWNjZXB0cyBhIHBpY2tsZSBzdHJpbmcuCisgICAgICAgICMgVGhpcyBpcyBhIGxvdy1vdmVyaGVhZCBiYWNrZG9vci4gIEEgdXNlciBjYW4gKGJ5IGludGVudCBvcgorICAgICAgICAjIG1pc3Rha2UpIHBhc3MgYSBzdHJpbmcgZGlyZWN0bHksIHdoaWNoIChpZiBpdCdzIHRoZSByaWdodCBsZW5ndGgpCisgICAgICAgICMgd2lsbCBnZXQgdHJlYXRlZCBsaWtlIGEgcGlja2xlLCBhbmQgYnlwYXNzIHRoZSBub3JtYWwgc2FuaXR5CisgICAgICAgICMgY2hlY2tzIGluIHRoZSBjb25zdHJ1Y3Rvci4gIFRoaXMgY2FuIGNyZWF0ZSBpbnNhbmUgb2JqZWN0cy4KKyAgICAgICAgIyBUaGUgY29uc3RydWN0b3IgZG9lc24ndCB3YW50IHRvIGJ1cm4gdGhlIHRpbWUgdG8gdmFsaWRhdGUgYWxsCisgICAgICAgICMgZmllbGRzLCBidXQgZG9lcyBjaGVjayB0aGUgbW9udGggZmllbGQuICBUaGlzIHN0b3BzLCBlLmcuLAorICAgICAgICAjIGRhdGV0aW1lLmRhdGV0aW1lKCcxOTk1LTAzLTI1JykgZnJvbSB5aWVsZGluZyBhbiBpbnNhbmUgb2JqZWN0LgorICAgICAgICBiYXNlID0gJzE5OTUtMDMtMjUnCisgICAgICAgIGlmIG5vdCBpc3N1YmNsYXNzKHNlbGYudGhlY2xhc3MsIGRhdGV0aW1lKToKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlWzo0XQorICAgICAgICBmb3IgbW9udGhfYnl0ZSBpbiAnOScsIGNocigwKSwgY2hyKDEzKSwgJ1x4ZmYnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnRoZWNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlWzoyXSArIG1vbnRoX2J5dGUgKyBiYXNlWzM6XSkKKyAgICAgICAgZm9yIG9yZF9ieXRlIGluIHJhbmdlKDEsIDEzKToKKyAgICAgICAgICAgICMgVGhpcyBzaG91bGRuJ3QgYmxvdyB1cCBiZWNhdXNlIG9mIHRoZSBtb250aCBieXRlIGFsb25lLiAgSWYKKyAgICAgICAgICAgICMgdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZXMgdG8gZG8gbW9yZS1jYXJlZnVsIGNoZWNraW5nLCBpdCBtYXkKKyAgICAgICAgICAgICMgYmxvdyB1cCBiZWNhdXNlIG90aGVyIGZpZWxkcyBhcmUgaW5zYW5lLgorICAgICAgICAgICAgc2VsZi50aGVjbGFzcyhiYXNlWzoyXSArIGNocihvcmRfYnl0ZSkgKyBiYXNlWzM6XSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZGF0ZXRpbWUgdGVzdHMKKworY2xhc3MgU3ViY2xhc3NEYXRldGltZShkYXRldGltZSk6CisgICAgc3ViX3ZhciA9IDEKKworY2xhc3MgVGVzdERhdGVUaW1lKFRlc3REYXRlKToKKworICAgIHRoZWNsYXNzID0gZGF0ZXRpbWUKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIGR0ID0gc2VsZi50aGVjbGFzcygyMDAyLCAzLCAxLCAxMiwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC55ZWFyLCAyMDAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Lm1vbnRoLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LmRheSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5ob3VyLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5taW51dGUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuc2Vjb25kLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Lm1pY3Jvc2Vjb25kLCAwKQorCisgICAgZGVmIHRlc3RfYmFzaWNfYXR0cmlidXRlc19ub256ZXJvKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBhbGwgYXR0cmlidXRlcyBhcmUgbm9uLXplcm8gc28gYnVncyBpbgorICAgICAgICAjIGJpdC1zaGlmdGluZyBhY2Nlc3Mgc2hvdyB1cC4KKyAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDEsIDEyLCA1OSwgNTksIDgwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQueWVhciwgMjAwMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5tb250aCwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5kYXksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuaG91ciwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQubWludXRlLCA1OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5zZWNvbmQsIDU5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Lm1pY3Jvc2Vjb25kLCA4MDAwKQorCisgICAgZGVmIHRlc3Rfcm91bmR0cmlwKHNlbGYpOgorICAgICAgICBmb3IgZHQgaW4gKHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCwgNSwgNiwgNyksCisgICAgICAgICAgICAgICAgICAgc2VsZi50aGVjbGFzcy5ub3coKSk6CisgICAgICAgICAgICAjIFZlcmlmeSBkdCAtPiBzdHJpbmcgLT4gZGF0ZXRpbWUgaWRlbnRpdHkuCisgICAgICAgICAgICBzID0gcmVwcihkdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoJ2RhdGV0aW1lLicpKQorICAgICAgICAgICAgcyA9IHNbOTpdCisgICAgICAgICAgICBkdDIgPSBldmFsKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LCBkdDIpCisKKyAgICAgICAgICAgICMgVmVyaWZ5IGlkZW50aXR5IHZpYSByZWNvbnN0cnVjdGluZyBmcm9tIHBpZWNlcy4KKyAgICAgICAgICAgIGR0MiA9IHNlbGYudGhlY2xhc3MoZHQueWVhciwgZHQubW9udGgsIGR0LmRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHQuaG91ciwgZHQubWludXRlLCBkdC5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0Lm1pY3Jvc2Vjb25kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgZHQyKQorCisgICAgZGVmIHRlc3RfaXNvZm9ybWF0KHNlbGYpOgorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyLCAzLCAyLCA0LCA1LCAxLCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgICAgIjAwMDItMDMtMDJUMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnVCcpLCAiMDAwMi0wMy0wMlQwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCcgJyksICIwMDAyLTAzLTAyIDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJ1x4MDAnKSwgIjAwMDItMDMtMDJceDAwMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgIyBzdHIgaXMgSVNPIGZvcm1hdCB3aXRoIHRoZSBzZXBhcmF0b3IgZm9yY2VkIHRvIGEgYmxhbmsuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCAiMDAwMi0wMy0wMiAwNDowNTowMS4wMDAxMjMiKQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIsIDMsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgICAgIjAwMDItMDMtMDJUMDA6MDA6MDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCdUJyksICIwMDAyLTAzLTAyVDAwOjAwOjAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnICcpLCAiMDAwMi0wMy0wMiAwMDowMDowMCIpCisgICAgICAgICMgc3RyIGlzIElTTyBmb3JtYXQgd2l0aCB0aGUgc2VwYXJhdG9yIGZvcmNlZCB0byBhIGJsYW5rLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0KSwgIjAwMDItMDMtMDIgMDA6MDA6MDAiKQorCisgICAgZGVmIHRlc3RfZm9ybWF0KHNlbGYpOgorICAgICAgICBkdCA9IHNlbGYudGhlY2xhc3MoMjAwNywgOSwgMTAsIDQsIDUsIDEsIDEyMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5fX2Zvcm1hdF9fKCcnKSwgc3RyKGR0KSkKKworICAgICAgICAjIGNoZWNrIHRoYXQgYSBkZXJpdmVkIGNsYXNzJ3MgX19zdHJfXygpIGdldHMgY2FsbGVkCisgICAgICAgIGNsYXNzIEEoc2VsZi50aGVjbGFzcyk6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ0EnCisgICAgICAgIGEgPSBBKDIwMDcsIDksIDEwLCA0LCA1LCAxLCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2Zvcm1hdF9fKCcnKSwgJ0EnKQorCisgICAgICAgICMgY2hlY2sgdGhhdCBhIGRlcml2ZWQgY2xhc3MncyBzdHJmdGltZSBnZXRzIGNhbGxlZAorICAgICAgICBjbGFzcyBCKHNlbGYudGhlY2xhc3MpOgorICAgICAgICAgICAgZGVmIHN0cmZ0aW1lKHNlbGYsIGZvcm1hdF9zcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ0InCisgICAgICAgIGIgPSBCKDIwMDcsIDksIDEwLCA0LCA1LCAxLCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5fX2Zvcm1hdF9fKCcnKSwgc3RyKGR0KSkKKworICAgICAgICBmb3IgZm10IGluIFsibTolbSBkOiVkIHk6JXkiLAorICAgICAgICAgICAgICAgICAgICAibTolbSBkOiVkIHk6JXkgSDolSCBNOiVNIFM6JVMiLAorICAgICAgICAgICAgICAgICAgICAiJXogJVoiLAorICAgICAgICAgICAgICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5fX2Zvcm1hdF9fKGZtdCksIGR0LnN0cmZ0aW1lKGZtdCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19mb3JtYXRfXyhmbXQpLCBkdC5zdHJmdGltZShmbXQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLl9fZm9ybWF0X18oZm10KSwgJ0InKQorCisgICAgZGVmIHRlc3RfbW9yZV9jdGltZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZpZWxkcyB0aGF0IFRlc3REYXRlIGRvZXNuJ3QgdG91Y2guCisgICAgICAgIGltcG9ydCB0aW1lCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMiwgMTgsIDMsIDUsIDEyMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmN0aW1lKCksICJTYXQgTWFyICAyIDE4OjAzOjA1IDIwMDIiKQorICAgICAgICAjIE9vcHMhICBUaGUgbmV4dCBsaW5lIGZhaWxzIG9uIFdpbjJLIHVuZGVyIE1TVkMgNiwgc28gaXQncyBjb21tZW50ZWQKKyAgICAgICAgIyBvdXQuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHQuY3RpbWUoKSBwcm9kdWNlcyAiIDIiIGZvciB0aGUgZGF5LAorICAgICAgICAjIGJ1dCBwbGF0Zm9ybSBjdGltZSgpIHByb2R1Y2VzICIwMiIgZm9yIHRoZSBkYXkuICBBY2NvcmRpbmcgdG8KKyAgICAgICAgIyBDOTksIHQuY3RpbWUoKSBpcyBjb3JyZWN0IGhlcmUuCisgICAgICAgICMgc2VsZi5hc3NlcnRFcXVhbCh0LmN0aW1lKCksIHRpbWUuY3RpbWUodGltZS5ta3RpbWUodC50aW1ldHVwbGUoKSkpKQorCisgICAgICAgICMgU28gdGVzdCBhIGNhc2Ugd2hlcmUgdGhhdCBkaWZmZXJlbmNlIGRvZXNuJ3QgbWF0dGVyLgorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyMDAyLCAzLCAyMiwgMTgsIDMsIDUsIDEyMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmN0aW1lKCksIHRpbWUuY3RpbWUodGltZS5ta3RpbWUodC50aW1ldHVwbGUoKSkpKQorCisgICAgZGVmIHRlc3RfdHpfaW5kZXBlbmRlbnRfY29tcGFyaW5nKHNlbGYpOgorICAgICAgICBkdDEgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDEsIDksIDAsIDApCisgICAgICAgIGR0MiA9IHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMSwgMTAsIDAsIDApCisgICAgICAgIGR0MyA9IHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMSwgOSwgMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDEsIGR0MykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGR0MiA+IGR0MykKKworICAgICAgICAjIE1ha2Ugc3VyZSBjb21wYXJpc29uIGRvZXNuJ3QgZm9yZ2V0IG1pY3Jvc2Vjb25kcywgYW5kIGlzbid0IGRvbmUKKyAgICAgICAgIyB2aWEgY29tcGFyaW5nIGEgZmxvYXQgdGltZXN0YW1wIChhbiBJRUVFIGRvdWJsZSBkb2Vzbid0IGhhdmUgZW5vdWdoCisgICAgICAgICMgcHJlY2lzaW9uIHRvIHNwYW4gbWljcm9zZWNvbmQgcmVzb2x1dGlvbiBhY3Jvc3MgeWVhcnMgMSB0aHJ1IDk5OTksCisgICAgICAgICMgc28gY29tcGFyaW5nIHZpYSB0aW1lc3RhbXAgbmVjZXNzYXJpbHkgY2FsbHMgc29tZSBkaXN0aW5jdCB2YWx1ZXMKKyAgICAgICAgIyBlcXVhbCkuCisgICAgICAgIGR0MSA9IHNlbGYudGhlY2xhc3MoTUFYWUVBUiwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTk5OTgpCisgICAgICAgIHVzID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKQorICAgICAgICBkdDIgPSBkdDEgKyB1cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MiAtIGR0MSwgdXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdDEgPCBkdDIpCisKKyAgICBkZWYgdGVzdF9zdHJmdGltZV93aXRoX2JhZF90em5hbWVfcmVwbGFjZShzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgb2sgaWYgdHppbmZvLnR6bmFtZSgpLnJlcGxhY2UoKSByZXR1cm5zIGEgbm9uLXN0cmluZworICAgICAgICBjbGFzcyBNeVR6SW5mbyhGaXhlZE9mZnNldCk6CisgICAgICAgICAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KToKKyAgICAgICAgICAgICAgICBjbGFzcyBNeVN0cihzdHIpOgorICAgICAgICAgICAgICAgICAgICBkZWYgcmVwbGFjZShzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIHJldHVybiBNeVN0cignbmFtZScpCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIwMDUsIDMsIDIsIDAsIDAsIDAsIDAsIE15VHpJbmZvKDMsICduYW1lJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdC5zdHJmdGltZSwgJyVaJykKKworICAgIGRlZiB0ZXN0X2JhZF9jb25zdHJ1Y3Rvcl9hcmd1bWVudHMoc2VsZik6CisgICAgICAgICMgYmFkIHllYXJzCisgICAgICAgIHNlbGYudGhlY2xhc3MoTUlOWUVBUiwgMSwgMSkgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYudGhlY2xhc3MoTUFYWUVBUiwgMSwgMSkgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIE1JTllFQVItMSwgMSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgTUFYWUVBUisxLCAxLCAxKQorICAgICAgICAjIGJhZCBtb250aHMKKyAgICAgICAgc2VsZi50aGVjbGFzcygyMDAwLCAxLCAxKSAgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLnRoZWNsYXNzKDIwMDAsIDEyLCAxKSAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIwMDAsIDAsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIwMDAsIDEzLCAxKQorICAgICAgICAjIGJhZCBkYXlzCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwMCwgMiwgMjkpICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcygyMDA0LCAyLCAyOSkgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLnRoZWNsYXNzKDI0MDAsIDIsIDI5KSAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIwMDAsIDIsIDMwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAxLCAyLCAyOSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjEwMCwgMiwgMjkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDE5MDAsIDIsIDI5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAwLCAxLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAwLCAxLCAzMikKKyAgICAgICAgIyBiYWQgaG91cnMKKyAgICAgICAgc2VsZi50aGVjbGFzcygyMDAwLCAxLCAzMSwgMCkgICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcygyMDAwLCAxLCAzMSwgMjMpICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMSwgMzEsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAwLCAxLCAzMSwgMjQpCisgICAgICAgICMgYmFkIG1pbnV0ZXMKKyAgICAgICAgc2VsZi50aGVjbGFzcygyMDAwLCAxLCAzMSwgMjMsIDApICAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwMCwgMSwgMzEsIDIzLCA1OSkgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAwLCAxLCAzMSwgMjMsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAwLCAxLCAzMSwgMjMsIDYwKQorICAgICAgICAjIGJhZCBzZWNvbmRzCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwMCwgMSwgMzEsIDIzLCA1OSwgMCkgICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcygyMDAwLCAxLCAzMSwgMjMsIDU5LCA1OSkgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAwLCAxLCAzMSwgMjMsIDU5LCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMSwgMzEsIDIzLCA1OSwgNjApCisgICAgICAgICMgYmFkIG1pY3Jvc2Vjb25kcworICAgICAgICBzZWxmLnRoZWNsYXNzKDIwMDAsIDEsIDMxLCAyMywgNTksIDU5LCAwKSAgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLnRoZWNsYXNzKDIwMDAsIDEsIDMxLCAyMywgNTksIDU5LCA5OTk5OTkpICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMCwgMSwgMzEsIDIzLCA1OSwgNTksIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAwLCAxLCAzMSwgMjMsIDU5LCA1OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMCkKKworICAgIGRlZiB0ZXN0X2hhc2hfZXF1YWxpdHkoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKDIwMDAsIDEyLCAzMSwgMjMsIDMwLCAxNykKKyAgICAgICAgZSA9IHNlbGYudGhlY2xhc3MoMjAwMCwgMTIsIDMxLCAyMywgMzAsIDE3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChkKSwgaGFzaChlKSkKKworICAgICAgICBkaWMgPSB7ZDogMX0KKyAgICAgICAgZGljW2VdID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaWMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY1tkXSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWNbZV0sIDIpCisKKyAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMjAwMSwgIDEsICAxLCAgMCwgIDUsIDE3KQorICAgICAgICBlID0gc2VsZi50aGVjbGFzcygyMDAxLCAgMSwgIDEsICAwLCAgNSwgMTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGQpLCBoYXNoKGUpKQorCisgICAgICAgIGRpYyA9IHtkOiAxfQorICAgICAgICBkaWNbZV0gPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpYyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljW2RdLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY1tlXSwgMikKKworICAgIGRlZiB0ZXN0X2NvbXB1dGF0aW9ucyhzZWxmKToKKyAgICAgICAgYSA9IHNlbGYudGhlY2xhc3MoMjAwMiwgMSwgMzEpCisgICAgICAgIGIgPSBzZWxmLnRoZWNsYXNzKDE5NTYsIDEsIDMxKQorICAgICAgICBkaWZmID0gYS1iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlmZi5kYXlzLCA0NiozNjUgKyBsZW4ocmFuZ2UoMTk1NiwgMjAwMiwgNCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpZmYuc2Vjb25kcywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWZmLm1pY3Jvc2Vjb25kcywgMCkKKyAgICAgICAgYSA9IHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMiwgMTcsIDYpCisgICAgICAgIG1pbGxpc2VjID0gdGltZWRlbHRhKDAsIDAsIDEwMDApCisgICAgICAgIGhvdXIgPSB0aW1lZGVsdGEoMCwgMzYwMCkKKyAgICAgICAgZGF5ID0gdGltZWRlbHRhKDEpCisgICAgICAgIHdlZWsgPSB0aW1lZGVsdGEoNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICsgaG91ciwgc2VsZi50aGVjbGFzcygyMDAyLCAzLCAyLCAxOCwgNikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG91ciArIGEsIHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMiwgMTgsIDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKyAxMCpob3VyLCBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDMsIDMsIDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSBob3VyLCBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDIsIDE2LCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtaG91ciArIGEsIHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMiwgMTYsIDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSBob3VyLCBhICsgLWhvdXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIDIwKmhvdXIsIHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMSwgMjEsIDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKyBkYXksIHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMywgMTcsIDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSBkYXksIHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMSwgMTcsIDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKyB3ZWVrLCBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDksIDE3LCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gd2Vlaywgc2VsZi50aGVjbGFzcygyMDAyLCAyLCAyMywgMTcsIDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKyA1Mip3ZWVrLCBzZWxmLnRoZWNsYXNzKDIwMDMsIDMsIDEsIDE3LCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gNTIqd2Vlaywgc2VsZi50aGVjbGFzcygyMDAxLCAzLCAzLCAxNywgNikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEgKyB3ZWVrKSAtIGEsIHdlZWspCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEgKyBkYXkpIC0gYSwgZGF5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhICsgaG91cikgLSBhLCBob3VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhICsgbWlsbGlzZWMpIC0gYSwgbWlsbGlzZWMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEgLSB3ZWVrKSAtIGEsIC13ZWVrKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhIC0gZGF5KSAtIGEsIC1kYXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEgLSBob3VyKSAtIGEsIC1ob3VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhIC0gbWlsbGlzZWMpIC0gYSwgLW1pbGxpc2VjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSAoYSArIHdlZWspLCAtd2VlaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gKGEgKyBkYXkpLCAtZGF5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSAoYSArIGhvdXIpLCAtaG91cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gKGEgKyBtaWxsaXNlYyksIC1taWxsaXNlYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gKGEgLSB3ZWVrKSwgd2VlaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gKGEgLSBkYXkpLCBkYXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIChhIC0gaG91ciksIGhvdXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIChhIC0gbWlsbGlzZWMpLCBtaWxsaXNlYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICsgKHdlZWsgKyBkYXkgKyBob3VyICsgbWlsbGlzZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMTAsIDE4LCA2LCAwLCAxMDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICsgKHdlZWsgKyBkYXkgKyBob3VyICsgbWlsbGlzZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgoKGEgKyB3ZWVrKSArIGRheSkgKyBob3VyKSArIG1pbGxpc2VjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSAod2VlayArIGRheSArIGhvdXIgKyBtaWxsaXNlYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aGVjbGFzcygyMDAyLCAyLCAyMiwgMTYsIDUsIDU5LCA5OTkwMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSAod2VlayArIGRheSArIGhvdXIgKyBtaWxsaXNlYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgoYSAtIHdlZWspIC0gZGF5KSAtIGhvdXIpIC0gbWlsbGlzZWMpCisgICAgICAgICMgQWRkL3N1YiBpbnRzLCBsb25ncywgZmxvYXRzIHNob3VsZCBiZSBpbGxlZ2FsCisgICAgICAgIGZvciBpIGluIDEsIDFMLCAxLjA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYStpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEtaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBpK2EpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogaS1hKQorCisgICAgICAgICMgZGVsdGEgLSBkYXRldGltZSBpcyBzZW5zZWxlc3MuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBkYXkgLSBhKQorICAgICAgICAjIG1peGluZyBkYXRldGltZSBhbmQgKGRlbHRhIG9yIGRhdGV0aW1lKSB2aWEgKiBvciAvLyBpcyBzZW5zZWxlc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGRheSAqIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhICogZGF5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogZGF5IC8vIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhIC8vIGRheSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEgKiBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYSAvLyBhKQorICAgICAgICAjIGRhdGV0aW1lICsgZGF0ZXRpbWUgaXMgc2Vuc2VsZXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhICsgYSkKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgorICAgICAgICBhcmdzID0gNiwgNywgMjMsIDIwLCA1OSwgMSwgNjQqKjIKKyAgICAgICAgb3JpZyA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCisgICAgICAgIGZvciBwaWNrbGVyLCB1bnBpY2tsZXIsIHByb3RvIGluIHBpY2tsZV9jaG9pY2VzOgorICAgICAgICAgICAgZ3JlZW4gPSBwaWNrbGVyLmR1bXBzKG9yaWcsIHByb3RvKQorICAgICAgICAgICAgZGVyaXZlZCA9IHVucGlja2xlci5sb2FkcyhncmVlbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZywgZGVyaXZlZCkKKworICAgIGRlZiB0ZXN0X21vcmVfcGlja2xpbmcoc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnRoZWNsYXNzKDIwMDMsIDIsIDcsIDE2LCA0OCwgMzcsIDQ0NDExNikKKyAgICAgICAgcyA9IHBpY2tsZS5kdW1wcyhhKQorICAgICAgICBiID0gcGlja2xlLmxvYWRzKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi55ZWFyLCAyMDAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIubW9udGgsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5kYXksIDcpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZ19zdWJjbGFzc19kYXRldGltZShzZWxmKToKKyAgICAgICAgYXJncyA9IDYsIDcsIDIzLCAyMCwgNTksIDEsIDY0KioyCisgICAgICAgIG9yaWcgPSBTdWJjbGFzc0RhdGV0aW1lKCphcmdzKQorICAgICAgICBmb3IgcGlja2xlciwgdW5waWNrbGVyLCBwcm90byBpbiBwaWNrbGVfY2hvaWNlczoKKyAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKKyAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWcsIGRlcml2ZWQpCisKKyAgICBkZWYgdGVzdF9tb3JlX2NvbXBhcmUoc2VsZik6CisgICAgICAgICMgVGhlIHRlc3RfY29tcGFyZSgpIGluaGVyaXRlZCBmcm9tIFRlc3REYXRlIGNvdmVycyB0aGUgZXJyb3IgY2FzZXMuCisgICAgICAgICMgV2UganVzdCB3YW50IHRvIHRlc3QgbGV4aWNvZ3JhcGhpYyBvcmRlcmluZyBvbiB0aGUgbWVtYmVycyBkYXRldGltZQorICAgICAgICAjIGhhcyB0aGF0IGRhdGUgbGFja3MuCisgICAgICAgIGFyZ3MgPSBbMjAwMCwgMTEsIDI5LCAyMCwgNTgsIDE2LCA5OTk5OThdCisgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygqYXJncykKKyAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzKCphcmdzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID49IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxICE9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxIDwgdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMCkKKworICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYXJncykpOgorICAgICAgICAgICAgbmV3YXJncyA9IGFyZ3NbOl0KKyAgICAgICAgICAgIG5ld2FyZ3NbaV0gPSBhcmdzW2ldICsgMQorICAgICAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzKCpuZXdhcmdzKSAgICMgdGhpcyBpcyBsYXJnZXIgdGhhbiB0MQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPiB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA+PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSAhPSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiAhPSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPT0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyID09IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPD0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAtMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDEpCisKKworICAgICMgQSBoZWxwZXIgZm9yIHRpbWVzdGFtcCBjb25zdHJ1Y3RvciB0ZXN0cy4KKyAgICBkZWYgdmVyaWZ5X2ZpZWxkX2VxdWFsaXR5KHNlbGYsIGV4cGVjdGVkLCBnb3QpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLnRtX3llYXIsIGdvdC55ZWFyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLnRtX21vbiwgZ290Lm1vbnRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLnRtX21kYXksIGdvdC5kYXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQudG1faG91ciwgZ290LmhvdXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQudG1fbWluLCBnb3QubWludXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLnRtX3NlYywgZ290LnNlY29uZCkKKworICAgIGRlZiB0ZXN0X2Zyb210aW1lc3RhbXAoc2VsZik6CisgICAgICAgIGltcG9ydCB0aW1lCisKKyAgICAgICAgdHMgPSB0aW1lLnRpbWUoKQorICAgICAgICBleHBlY3RlZCA9IHRpbWUubG9jYWx0aW1lKHRzKQorICAgICAgICBnb3QgPSBzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAodHMpCisgICAgICAgIHNlbGYudmVyaWZ5X2ZpZWxkX2VxdWFsaXR5KGV4cGVjdGVkLCBnb3QpCisKKyAgICBkZWYgdGVzdF91dGNmcm9tdGltZXN0YW1wKHNlbGYpOgorICAgICAgICBpbXBvcnQgdGltZQorCisgICAgICAgIHRzID0gdGltZS50aW1lKCkKKyAgICAgICAgZXhwZWN0ZWQgPSB0aW1lLmdtdGltZSh0cykKKyAgICAgICAgZ290ID0gc2VsZi50aGVjbGFzcy51dGNmcm9tdGltZXN0YW1wKHRzKQorICAgICAgICBzZWxmLnZlcmlmeV9maWVsZF9lcXVhbGl0eShleHBlY3RlZCwgZ290KQorCisgICAgZGVmIHRlc3RfbWljcm9zZWNvbmRfcm91bmRpbmcoc2VsZik6CisgICAgICAgICMgVGVzdCB3aGV0aGVyIGZyb210aW1lc3RhbXAgInJvdW5kcyB1cCIgZmxvYXRzIHRoYXQgYXJlIGxlc3MKKyAgICAgICAgIyB0aGFuIG9uZSBtaWNyb3NlY29uZCBzbWFsbGVyIHRoYW4gYW4gaW50ZWdlci4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAoMC45OTk5OTk5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAoMSkpCisKKyAgICBkZWYgdGVzdF9pbnNhbmVfZnJvbXRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBwbGF0Zm9ybSBtYXBzIHRpbWVfdCB0byBkb3VibGUsCisgICAgICAgICMgYW5kIHRoYXQgdGhpcyB0ZXN0IHdpbGwgZmFpbCB0aGVyZS4gIFRoaXMgdGVzdCBzaG91bGQKKyAgICAgICAgIyBleGVtcHQgc3VjaCBwbGF0Zm9ybXMgKHByb3ZpZGVkIHRoZXkgcmV0dXJuIHJlYXNvbmFibGUKKyAgICAgICAgIyByZXN1bHRzISkuCisgICAgICAgIGZvciBpbnNhbmUgaW4gLTFlMjAwLCAxZTIwMDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MuZnJvbXRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2FuZSkKKworICAgIGRlZiB0ZXN0X2luc2FuZV91dGNmcm9tdGltZXN0YW1wKHNlbGYpOgorICAgICAgICAjIEl0J3MgcG9zc2libGUgdGhhdCBzb21lIHBsYXRmb3JtIG1hcHMgdGltZV90IHRvIGRvdWJsZSwKKyAgICAgICAgIyBhbmQgdGhhdCB0aGlzIHRlc3Qgd2lsbCBmYWlsIHRoZXJlLiAgVGhpcyB0ZXN0IHNob3VsZAorICAgICAgICAjIGV4ZW1wdCBzdWNoIHBsYXRmb3JtcyAocHJvdmlkZWQgdGhleSByZXR1cm4gcmVhc29uYWJsZQorICAgICAgICAjIHJlc3VsdHMhKS4KKyAgICAgICAgZm9yIGluc2FuZSBpbiAtMWUyMDAsIDFlMjAwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcy51dGNmcm9tdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zYW5lKQorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW5kb3dzIGRvZXNuJ3QgYWNjZXB0IG5lZ2F0aXZlIHRpbWVzdGFtcHMiKQorICAgIGRlZiB0ZXN0X25lZ2F0aXZlX2Zsb2F0X2Zyb210aW1lc3RhbXAoc2VsZik6CisgICAgICAgICMgVGhlIHJlc3VsdCBpcyB0ei1kZXBlbmRlbnQ7IGF0IGxlYXN0IHRlc3QgdGhhdCB0aGlzIGRvZXNuJ3QKKyAgICAgICAgIyBmYWlsIChsaWtlIGl0IGRpZCBiZWZvcmUgYnVnIDE2NDY3Mjggd2FzIGZpeGVkKS4KKyAgICAgICAgc2VsZi50aGVjbGFzcy5mcm9tdGltZXN0YW1wKC0xLjA1KQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbmRvd3MgZG9lc24ndCBhY2NlcHQgbmVnYXRpdmUgdGltZXN0YW1wcyIpCisgICAgZGVmIHRlc3RfbmVnYXRpdmVfZmxvYXRfdXRjZnJvbXRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MudXRjZnJvbXRpbWVzdGFtcCgtMS4wNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBzZWxmLnRoZWNsYXNzKDE5NjksIDEyLCAzMSwgMjMsIDU5LCA1OCwgOTUwMDAwKSkKKworICAgIGRlZiB0ZXN0X3V0Y25vdyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHRpbWUKKworICAgICAgICAjIENhbGwgaXQgYSBzdWNjZXNzIGlmIHV0Y25vdygpIGFuZCB1dGNmcm9tdGltZXN0YW1wKCkgYXJlIHdpdGhpbgorICAgICAgICAjIGEgc2Vjb25kIG9mIGVhY2ggb3RoZXIuCisgICAgICAgIHRvbGVyYW5jZSA9IHRpbWVkZWx0YShzZWNvbmRzPTEpCisgICAgICAgIGZvciBkdW1teSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIGZyb21fbm93ID0gc2VsZi50aGVjbGFzcy51dGNub3coKQorICAgICAgICAgICAgZnJvbV90aW1lc3RhbXAgPSBzZWxmLnRoZWNsYXNzLnV0Y2Zyb210aW1lc3RhbXAodGltZS50aW1lKCkpCisgICAgICAgICAgICBpZiBhYnMoZnJvbV90aW1lc3RhbXAgLSBmcm9tX25vdykgPD0gdG9sZXJhbmNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAjIEVsc2UgdHJ5IGFnYWluIGEgZmV3IHRpbWVzLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWJzKGZyb21fdGltZXN0YW1wIC0gZnJvbV9ub3cpIDw9IHRvbGVyYW5jZSkKKworICAgIGRlZiB0ZXN0X3N0cnB0aW1lKHNlbGYpOgorICAgICAgICBpbXBvcnQgX3N0cnB0aW1lCisKKyAgICAgICAgc3RyaW5nID0gJzIwMDQtMTItMDEgMTM6MDI6NDcuMTk3JworICAgICAgICBmb3JtYXQgPSAnJVktJW0tJWQgJUg6JU06JVMuJWYnCisgICAgICAgIHJlc3VsdCwgZnJhYyA9IF9zdHJwdGltZS5fc3RycHRpbWUoc3RyaW5nLCBmb3JtYXQpCisgICAgICAgIGV4cGVjdGVkID0gc2VsZi50aGVjbGFzcygqKHJlc3VsdFswOjZdKyhmcmFjLCkpKQorICAgICAgICBnb3QgPSBzZWxmLnRoZWNsYXNzLnN0cnB0aW1lKHN0cmluZywgZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisKKyAgICBkZWYgdGVzdF9tb3JlX3RpbWV0dXBsZShzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3RzIGZpZWxkcyBiZXlvbmQgdGhvc2UgdGVzdGVkIGJ5IHRoZSBUZXN0RGF0ZS50ZXN0X3RpbWV0dXBsZS4KKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMjAwNCwgMTIsIDMxLCA2LCAyMiwgMzMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50aW1ldHVwbGUoKSwgKDIwMDQsIDEyLCAzMSwgNiwgMjIsIDMzLCA0LCAzNjYsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRpbWV0dXBsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICh0LnllYXIsIHQubW9udGgsIHQuZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB0LmhvdXIsIHQubWludXRlLCB0LnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdC53ZWVrZGF5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHQudG9vcmRpbmFsKCkgLSBkYXRlKHQueWVhciwgMSwgMSkudG9vcmRpbmFsKCkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAtMSkpCisgICAgICAgIHR0ID0gdC50aW1ldHVwbGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0LnRtX3llYXIsIHQueWVhcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dC50bV9tb24sIHQubW9udGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHQudG1fbWRheSwgdC5kYXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHQudG1faG91ciwgdC5ob3VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0LnRtX21pbiwgdC5taW51dGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHQudG1fc2VjLCB0LnNlY29uZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dC50bV93ZGF5LCB0LndlZWtkYXkoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dC50bV95ZGF5LCB0LnRvb3JkaW5hbCgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlKHQueWVhciwgMSwgMSkudG9vcmRpbmFsKCkgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0LnRtX2lzZHN0LCAtMSkKKworICAgIGRlZiB0ZXN0X21vcmVfc3RyZnRpbWUoc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0cyBmaWVsZHMgYmV5b25kIHRob3NlIHRlc3RlZCBieSB0aGUgVGVzdERhdGUudGVzdF9zdHJmdGltZS4KKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMjAwNCwgMTIsIDMxLCA2LCAyMiwgMzMsIDQ3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc3RyZnRpbWUoIiVtICVkICV5ICVmICVTICVNICVIICVqIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTIgMzEgMDQgMDAwMDQ3IDMzIDIyIDA2IDM2NiIpCisKKyAgICBkZWYgdGVzdF9leHRyYWN0KHNlbGYpOgorICAgICAgICBkdCA9IHNlbGYudGhlY2xhc3MoMjAwMiwgMywgNCwgMTgsIDQ1LCAzLCAxMjM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LmRhdGUoKSwgZGF0ZSgyMDAyLCAzLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC50aW1lKCksIHRpbWUoMTgsIDQ1LCAzLCAxMjM0KSkKKworICAgIGRlZiB0ZXN0X2NvbWJpbmUoc2VsZik6CisgICAgICAgIGQgPSBkYXRlKDIwMDIsIDMsIDQpCisgICAgICAgIHQgPSB0aW1lKDE4LCA0NSwgMywgMTIzNCkKKyAgICAgICAgZXhwZWN0ZWQgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDQsIDE4LCA0NSwgMywgMTIzNCkKKyAgICAgICAgY29tYmluZSA9IHNlbGYudGhlY2xhc3MuY29tYmluZQorICAgICAgICBkdCA9IGNvbWJpbmUoZCwgdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgZHQgPSBjb21iaW5lKHRpbWU9dCwgZGF0ZT1kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LCBleHBlY3RlZCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGR0LmRhdGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBkdC50aW1lKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQsIGNvbWJpbmUoZHQuZGF0ZSgpLCBkdC50aW1lKCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tYmluZSkgIyBuZWVkIGFuIGFyZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsIGQpICMgbmVlZCB0d28gYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsIHQsIGQpICMgYXJncyByZXZlcnNlZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsIGQsIHQsIDEpICMgdG9vIG1hbnkgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUsICJkYXRlIiwgInRpbWUiKSAjIHdyb25nIHR5cGVzCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYpOgorICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCisgICAgICAgIGFyZ3MgPSBbMSwgMiwgMywgNCwgNSwgNiwgN10KKyAgICAgICAgYmFzZSA9IGNscygqYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLCBiYXNlLnJlcGxhY2UoKSkKKworICAgICAgICBpID0gMAorICAgICAgICBmb3IgbmFtZSwgbmV3dmFsIGluICgoInllYXIiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtb250aCIsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImRheSIsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImhvdXIiLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtaW51dGUiLCA2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJzZWNvbmQiLCA3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtaWNyb3NlY29uZCIsIDgpKToKKyAgICAgICAgICAgIG5ld2FyZ3MgPSBhcmdzWzpdCisgICAgICAgICAgICBuZXdhcmdzW2ldID0gbmV3dmFsCisgICAgICAgICAgICBleHBlY3RlZCA9IGNscygqbmV3YXJncykKKyAgICAgICAgICAgIGdvdCA9IGJhc2UucmVwbGFjZSgqKntuYW1lOiBuZXd2YWx9KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorICAgICAgICAgICAgaSArPSAxCisKKyAgICAgICAgIyBPdXQgb2YgYm91bmRzLgorICAgICAgICBiYXNlID0gY2xzKDIwMDAsIDIsIDI5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiYXNlLnJlcGxhY2UsIHllYXI9MjAwMSkKKworICAgIGRlZiB0ZXN0X2FzdGltZXpvbmUoc2VsZik6CisgICAgICAgICMgUHJldHR5IGJvcmluZyEgIFRoZSBUWiB0ZXN0IGlzIG1vcmUgaW50ZXJlc3RpbmcgaGVyZS4gIGFzdGltZXpvbmUoKQorICAgICAgICAjIHNpbXBseSBjYW4ndCBiZSBhcHBsaWVkIHRvIGEgbmFpdmUgb2JqZWN0LgorICAgICAgICBkdCA9IHNlbGYudGhlY2xhc3Mubm93KCkKKyAgICAgICAgZiA9IEZpeGVkT2Zmc2V0KDQ0LCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkdC5hc3RpbWV6b25lKSAjIG5vdCBlbm91Z2ggYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGR0LmFzdGltZXpvbmUsIGYsIGYpICMgdG9vIG1hbnkgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGR0LmFzdGltZXpvbmUsIGR0KSAjIGFyZyB3cm9uZyB0eXBlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGR0LmFzdGltZXpvbmUsIGYpICMgbmFpdmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZHQuYXN0aW1lem9uZSwgdHo9ZikgICMgbmFpdmUKKworICAgICAgICBjbGFzcyBCb2d1cyh0emluZm8pOgorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6IHJldHVybiBOb25lCisgICAgICAgICAgICBkZWYgZHN0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YSgwKQorICAgICAgICBib2cgPSBCb2d1cygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGR0LmFzdGltZXpvbmUsIGJvZykgICAjIG5haXZlCisKKyAgICAgICAgY2xhc3MgQWxzb0JvZ3VzKHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YSgwKQorICAgICAgICAgICAgZGVmIGRzdChzZWxmLCBkdCk6IHJldHVybiBOb25lCisgICAgICAgIGFsc29ib2cgPSBBbHNvQm9ndXMoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkdC5hc3RpbWV6b25lLCBhbHNvYm9nKSAjIGFsc28gbmFpdmUKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX2RhdGV0aW1lKHNlbGYpOgorCisgICAgICAgIGNsYXNzIEMoc2VsZi50aGVjbGFzcyk6CisgICAgICAgICAgICB0aGVBbnN3ZXIgPSA0MgorCisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzLCAqKmt3cyk6CisgICAgICAgICAgICAgICAgdGVtcCA9IGt3cy5jb3B5KCkKKyAgICAgICAgICAgICAgICBleHRyYSA9IHRlbXAucG9wKCdleHRyYScpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi50aGVjbGFzcy5fX25ld19fKGNscywgKmFyZ3MsICoqdGVtcCkKKyAgICAgICAgICAgICAgICByZXN1bHQuZXh0cmEgPSBleHRyYQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICAgICAgICAgZGVmIG5ld21ldGgoc2VsZiwgc3RhcnQpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdGFydCArIHNlbGYueWVhciArIHNlbGYubW9udGggKyBzZWxmLnNlY29uZAorCisgICAgICAgIGFyZ3MgPSAyMDAzLCA0LCAxNCwgMTIsIDEzLCA0MQorCisgICAgICAgIGR0MSA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCisgICAgICAgIGR0MiA9IEMoKmFyZ3MsICoqeydleHRyYSc6IDd9KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLl9fY2xhc3NfXywgQykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIudGhlQW5zd2VyLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIuZXh0cmEsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQxLnRvb3JkaW5hbCgpLCBkdDIudG9vcmRpbmFsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLm5ld21ldGgoLTcpLCBkdDEueWVhciArIGR0MS5tb250aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdDEuc2Vjb25kIC0gNykKKworY2xhc3MgU3ViY2xhc3NUaW1lKHRpbWUpOgorICAgIHN1Yl92YXIgPSAxCisKK2NsYXNzIFRlc3RUaW1lKEhhcm1sZXNzTWl4ZWRDb21wYXJpc29uLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICB0aGVjbGFzcyA9IHRpbWUKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDEyLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaG91ciwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5taW51dGUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5zZWNvbmQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5taWNyb3NlY29uZCwgMCkKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2F0dHJpYnV0ZXNfbm9uemVybyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgYWxsIGF0dHJpYnV0ZXMgYXJlIG5vbi16ZXJvIHNvIGJ1Z3MgaW4KKyAgICAgICAgIyBiaXQtc2hpZnRpbmcgYWNjZXNzIHNob3cgdXAuCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDEyLCA1OSwgNTksIDgwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5ob3VyLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm1pbnV0ZSwgNTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5zZWNvbmQsIDU5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubWljcm9zZWNvbmQsIDgwMDApCisKKyAgICBkZWYgdGVzdF9yb3VuZHRyaXAoc2VsZik6CisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDEsIDIsIDMsIDQpCisKKyAgICAgICAgIyBWZXJpZnkgdCAtPiBzdHJpbmcgLT4gdGltZSBpZGVudGl0eS4KKyAgICAgICAgcyA9IHJlcHIodCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgnZGF0ZXRpbWUuJykpCisgICAgICAgIHMgPSBzWzk6XQorICAgICAgICB0MiA9IGV2YWwocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCB0MikKKworICAgICAgICAjIFZlcmlmeSBpZGVudGl0eSB2aWEgcmVjb25zdHJ1Y3RpbmcgZnJvbSBwaWVjZXMuCisgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcyh0LmhvdXIsIHQubWludXRlLCB0LnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHQubWljcm9zZWNvbmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdDIpCisKKyAgICBkZWYgdGVzdF9jb21wYXJpbmcoc2VsZik6CisgICAgICAgIGFyZ3MgPSBbMSwgMiwgMywgNF0KKyAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKCphcmdzKQorICAgICAgICB0MiA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA9PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDw9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPj0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgIT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+IHQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAwKQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihhcmdzKSk6CisgICAgICAgICAgICBuZXdhcmdzID0gYXJnc1s6XQorICAgICAgICAgICAgbmV3YXJnc1tpXSA9IGFyZ3NbaV0gKyAxCisgICAgICAgICAgICB0MiA9IHNlbGYudGhlY2xhc3MoKm5ld2FyZ3MpICAgIyB0aGlzIGlzIGxhcmdlciB0aGFuIHQxCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA+IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDw9IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID49IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxICE9IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyICE9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA9PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDwgdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID49IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIC0xKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMSkKKworICAgICAgICBmb3IgYmFkYXJnIGluIE9USEVSU1RVRkY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxID09IGJhZGFyZywgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxICE9IGJhZGFyZywgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFkYXJnID09IHQxLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFkYXJnICE9IHQxLCBUcnVlKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogdDEgPD0gYmFkYXJnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxIDwgYmFkYXJnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxID4gYmFkYXJnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxID49IGJhZGFyZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBiYWRhcmcgPD0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYmFkYXJnIDwgdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYmFkYXJnID4gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYmFkYXJnID49IHQxKQorCisgICAgZGVmIHRlc3RfYmFkX2NvbnN0cnVjdG9yX2FyZ3VtZW50cyhzZWxmKToKKyAgICAgICAgIyBiYWQgaG91cnMKKyAgICAgICAgc2VsZi50aGVjbGFzcygwLCAwKSAgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLnRoZWNsYXNzKDIzLCAwKSAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIC0xLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyNCwgMCkKKyAgICAgICAgIyBiYWQgbWludXRlcworICAgICAgICBzZWxmLnRoZWNsYXNzKDIzLCAwKSAgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLnRoZWNsYXNzKDIzLCA1OSkgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMywgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIzLCA2MCkKKyAgICAgICAgIyBiYWQgc2Vjb25kcworICAgICAgICBzZWxmLnRoZWNsYXNzKDIzLCA1OSwgMCkgICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcygyMywgNTksIDU5KSAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIzLCA1OSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIzLCA1OSwgNjApCisgICAgICAgICMgYmFkIG1pY3Jvc2Vjb25kcworICAgICAgICBzZWxmLnRoZWNsYXNzKDIzLCA1OSwgNTksIDApICAgICAgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLnRoZWNsYXNzKDIzLCA1OSwgNTksIDk5OTk5OSkgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMywgNTksIDU5LCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjMsIDU5LCA1OSwgMTAwMDAwMCkKKworICAgIGRlZiB0ZXN0X2hhc2hfZXF1YWxpdHkoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKDIzLCAzMCwgMTcpCisgICAgICAgIGUgPSBzZWxmLnRoZWNsYXNzKDIzLCAzMCwgMTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGQpLCBoYXNoKGUpKQorCisgICAgICAgIGRpYyA9IHtkOiAxfQorICAgICAgICBkaWNbZV0gPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpYyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljW2RdLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY1tlXSwgMikKKworICAgICAgICBkID0gc2VsZi50aGVjbGFzcygwLCAgNSwgMTcpCisgICAgICAgIGUgPSBzZWxmLnRoZWNsYXNzKDAsICA1LCAxNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goZCksIGhhc2goZSkpCisKKyAgICAgICAgZGljID0ge2Q6IDF9CisgICAgICAgIGRpY1tlXSA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGljKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWNbZF0sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljW2VdLCAyKQorCisgICAgZGVmIHRlc3RfaXNvZm9ybWF0KHNlbGYpOgorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyg0LCA1LCAxLCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgIjA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgc3RyKHQpKQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCAiMDA6MDA6MDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksIHN0cih0KSkKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhtaWNyb3NlY29uZD0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICIwMDowMDowMC4wMDAwMDEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksIHN0cih0KSkKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhtaWNyb3NlY29uZD0xMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCAiMDA6MDA6MDAuMDAwMDEwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCBzdHIodCkpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MobWljcm9zZWNvbmQ9MTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICIwMDowMDowMC4wMDAxMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksIHN0cih0KSkKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhtaWNyb3NlY29uZD0xMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICIwMDowMDowMC4wMDEwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksIHN0cih0KSkKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhtaWNyb3NlY29uZD0xMDAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCAiMDA6MDA6MDAuMDEwMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCBzdHIodCkpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MobWljcm9zZWNvbmQ9MTAwMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICIwMDowMDowMC4xMDAwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksIHN0cih0KSkKKworICAgIGRlZiB0ZXN0XzE2NTM3MzYoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IGl0IGRvZXNuJ3QgYWNjZXB0IGV4dHJhIGtleXdvcmQgYXJndW1lbnRzCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKHNlY29uZD0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuaXNvZm9ybWF0LCBmb289MykKKworICAgIGRlZiB0ZXN0X3N0cmZ0aW1lKHNlbGYpOgorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxLCAyLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc3RyZnRpbWUoJyVIICVNICVTICVmJyksICIwMSAwMiAwMyAwMDAwMDQiKQorICAgICAgICAjIEEgbmFpdmUgb2JqZWN0IHJlcGxhY2VzICV6IGFuZCAlWiB3aXRoIGVtcHR5IHN0cmluZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5zdHJmdGltZSgiJyV6JyAnJVonIiksICInJyAnJyIpCisKKyAgICBkZWYgdGVzdF9mb3JtYXQoc2VsZik6CisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDEsIDIsIDMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5fX2Zvcm1hdF9fKCcnKSwgc3RyKHQpKQorCisgICAgICAgICMgY2hlY2sgdGhhdCBhIGRlcml2ZWQgY2xhc3MncyBfX3N0cl9fKCkgZ2V0cyBjYWxsZWQKKyAgICAgICAgY2xhc3MgQShzZWxmLnRoZWNsYXNzKToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAnQScKKyAgICAgICAgYSA9IEEoMSwgMiwgMywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZm9ybWF0X18oJycpLCAnQScpCisKKyAgICAgICAgIyBjaGVjayB0aGF0IGEgZGVyaXZlZCBjbGFzcydzIHN0cmZ0aW1lIGdldHMgY2FsbGVkCisgICAgICAgIGNsYXNzIEIoc2VsZi50aGVjbGFzcyk6CisgICAgICAgICAgICBkZWYgc3RyZnRpbWUoc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiAnQicKKyAgICAgICAgYiA9IEIoMSwgMiwgMywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLl9fZm9ybWF0X18oJycpLCBzdHIodCkpCisKKyAgICAgICAgZm9yIGZtdCBpbiBbJyVIICVNICVTJywKKyAgICAgICAgICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5fX2Zvcm1hdF9fKGZtdCksIHQuc3RyZnRpbWUoZm10KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2Zvcm1hdF9fKGZtdCksIHQuc3RyZnRpbWUoZm10KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5fX2Zvcm1hdF9fKGZtdCksICdCJykKKworICAgIGRlZiB0ZXN0X3N0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoc2VsZi50aGVjbGFzcygxLCAyLCAzLCA0KSksICIwMTowMjowMy4wMDAwMDQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihzZWxmLnRoZWNsYXNzKDEwLCAyLCAzLCA0MDAwKSksICIxMDowMjowMy4wMDQwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihzZWxmLnRoZWNsYXNzKDAsIDIsIDMsIDQwMDAwMCkpLCAiMDA6MDI6MDMuNDAwMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoc2VsZi50aGVjbGFzcygxMiwgMiwgMywgMCkpLCAiMTI6MDI6MDMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihzZWxmLnRoZWNsYXNzKDIzLCAxNSwgMCwgMCkpLCAiMjM6MTU6MDAiKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgbmFtZSA9ICdkYXRldGltZS4nICsgc2VsZi50aGVjbGFzcy5fX25hbWVfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoc2VsZi50aGVjbGFzcygxLCAyLCAzLCA0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKDEsIDIsIDMsIDQpIiAlIG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzZWxmLnRoZWNsYXNzKDEwLCAyLCAzLCA0MDAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKDEwLCAyLCAzLCA0MDAwKSIgJSBuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoc2VsZi50aGVjbGFzcygwLCAyLCAzLCA0MDAwMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoMCwgMiwgMywgNDAwMDAwKSIgJSBuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoc2VsZi50aGVjbGFzcygxMiwgMiwgMywgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlcygxMiwgMiwgMykiICUgbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHNlbGYudGhlY2xhc3MoMjMsIDE1LCAwLCAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKDIzLCAxNSkiICUgbmFtZSkKKworICAgIGRlZiB0ZXN0X3Jlc29sdXRpb25faW5mbyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYudGhlY2xhc3MubWluLCBzZWxmLnRoZWNsYXNzKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi50aGVjbGFzcy5tYXgsIHNlbGYudGhlY2xhc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLnRoZWNsYXNzLnJlc29sdXRpb24sIHRpbWVkZWx0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudGhlY2xhc3MubWF4ID4gc2VsZi50aGVjbGFzcy5taW4pCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgYXJncyA9IDIwLCA1OSwgMTYsIDY0KioyCisgICAgICAgIG9yaWcgPSBzZWxmLnRoZWNsYXNzKCphcmdzKQorICAgICAgICBmb3IgcGlja2xlciwgdW5waWNrbGVyLCBwcm90byBpbiBwaWNrbGVfY2hvaWNlczoKKyAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKKyAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWcsIGRlcml2ZWQpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZ19zdWJjbGFzc190aW1lKHNlbGYpOgorICAgICAgICBhcmdzID0gMjAsIDU5LCAxNiwgNjQqKjIKKyAgICAgICAgb3JpZyA9IFN1YmNsYXNzVGltZSgqYXJncykKKyAgICAgICAgZm9yIHBpY2tsZXIsIHVucGlja2xlciwgcHJvdG8gaW4gcGlja2xlX2Nob2ljZXM6CisgICAgICAgICAgICBncmVlbiA9IHBpY2tsZXIuZHVtcHMob3JpZywgcHJvdG8pCisgICAgICAgICAgICBkZXJpdmVkID0gdW5waWNrbGVyLmxvYWRzKGdyZWVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnLCBkZXJpdmVkKQorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzKDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzKDAsIDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzKDAsIDAsIDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzKDAsIDAsIDAsIDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNscygwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjbHMoKSkKKworICAgIGRlZiB0ZXN0X3JlcGxhY2Uoc2VsZik6CisgICAgICAgIGNscyA9IHNlbGYudGhlY2xhc3MKKyAgICAgICAgYXJncyA9IFsxLCAyLCAzLCA0XQorICAgICAgICBiYXNlID0gY2xzKCphcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2UsIGJhc2UucmVwbGFjZSgpKQorCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBuYW1lLCBuZXd2YWwgaW4gKCgiaG91ciIsIDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm1pbnV0ZSIsIDYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInNlY29uZCIsIDcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm1pY3Jvc2Vjb25kIiwgOCkpOgorICAgICAgICAgICAgbmV3YXJncyA9IGFyZ3NbOl0KKyAgICAgICAgICAgIG5ld2FyZ3NbaV0gPSBuZXd2YWwKKyAgICAgICAgICAgIGV4cGVjdGVkID0gY2xzKCpuZXdhcmdzKQorICAgICAgICAgICAgZ290ID0gYmFzZS5yZXBsYWNlKCoqe25hbWU6IG5ld3ZhbH0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisgICAgICAgICAgICBpICs9IDEKKworICAgICAgICAjIE91dCBvZiBib3VuZHMuCisgICAgICAgIGJhc2UgPSBjbHMoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYmFzZS5yZXBsYWNlLCBob3VyPTI0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiYXNlLnJlcGxhY2UsIG1pbnV0ZT0tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYmFzZS5yZXBsYWNlLCBzZWNvbmQ9MTAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiYXNlLnJlcGxhY2UsIG1pY3Jvc2Vjb25kPTEwMDAwMDApCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc190aW1lKHNlbGYpOgorCisgICAgICAgIGNsYXNzIEMoc2VsZi50aGVjbGFzcyk6CisgICAgICAgICAgICB0aGVBbnN3ZXIgPSA0MgorCisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzLCAqKmt3cyk6CisgICAgICAgICAgICAgICAgdGVtcCA9IGt3cy5jb3B5KCkKKyAgICAgICAgICAgICAgICBleHRyYSA9IHRlbXAucG9wKCdleHRyYScpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi50aGVjbGFzcy5fX25ld19fKGNscywgKmFyZ3MsICoqdGVtcCkKKyAgICAgICAgICAgICAgICByZXN1bHQuZXh0cmEgPSBleHRyYQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICAgICAgICAgZGVmIG5ld21ldGgoc2VsZiwgc3RhcnQpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdGFydCArIHNlbGYuaG91ciArIHNlbGYuc2Vjb25kCisKKyAgICAgICAgYXJncyA9IDQsIDUsIDYKKworICAgICAgICBkdDEgPSBzZWxmLnRoZWNsYXNzKCphcmdzKQorICAgICAgICBkdDIgPSBDKCphcmdzLCAqKnsnZXh0cmEnOiA3fSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi5fX2NsYXNzX18sIEMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLnRoZUFuc3dlciwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLmV4dHJhLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MS5pc29mb3JtYXQoKSwgZHQyLmlzb2Zvcm1hdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi5uZXdtZXRoKC03KSwgZHQxLmhvdXIgKyBkdDEuc2Vjb25kIC0gNykKKworICAgIGRlZiB0ZXN0X2JhY2tkb29yX3Jlc2lzdGFuY2Uoc2VsZik6CisgICAgICAgICMgc2VlIFRlc3REYXRlLnRlc3RfYmFja2Rvb3JfcmVzaXN0YW5jZSgpLgorICAgICAgICBiYXNlID0gJzI6NTkuMCcKKyAgICAgICAgZm9yIGhvdXJfYnl0ZSBpbiAnICcsICc5JywgY2hyKDI0KSwgJ1x4ZmYnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnRoZWNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyX2J5dGUgKyBiYXNlWzE6XSkKKworIyBBIG1peGluIGZvciBjbGFzc2VzIHdpdGggYSB0emluZm89IGFyZ3VtZW50LiAgU3ViY2xhc3NlcyBtdXN0IGRlZmluZQorIyB0aGVjbGFzcyBhcyBhIGNsYXNzIGF0cmlidXRlLCBhbmQgdGhlY2xhc3MoMSwgMSwgMSwgdHppbmZvPXdoYXRldmVyKQorIyBtdXN0IGJlIGxlZ2l0ICh3aGljaCBpcyB0cnVlIGZvciB0aW1lIGFuZCBkYXRldGltZSkuCitjbGFzcyBUWkluZm9CYXNlOgorCisgICAgZGVmIHRlc3RfYXJndW1lbnRfcGFzc2luZyhzZWxmKToKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworICAgICAgICAjIEEgZGF0ZXRpbWUgcGFzc2VzIGl0c2VsZiBvbiwgYSB0aW1lIHBhc3NlcyBOb25lLgorICAgICAgICBjbGFzcyBpbnRyb3NwZWN0aXZlKHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KTogICAgcmV0dXJuIGR0IGFuZCAicmVhbCIgb3IgIm5vbmUiCisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhKG1pbnV0ZXMgPSBkdCBhbmQgNDIgb3IgLTQyKQorICAgICAgICAgICAgZHN0ID0gdXRjb2Zmc2V0CisKKyAgICAgICAgb2JqID0gY2xzKDEsIDIsIDMsIHR6aW5mbz1pbnRyb3NwZWN0aXZlKCkpCisKKyAgICAgICAgZXhwZWN0ZWQgPSBjbHMgaXMgdGltZSBhbmQgIm5vbmUiIG9yICJyZWFsIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai50em5hbWUoKSwgZXhwZWN0ZWQpCisKKyAgICAgICAgZXhwZWN0ZWQgPSB0aW1lZGVsdGEobWludXRlcz0oY2xzIGlzIHRpbWUgYW5kIC00MiBvciA0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLnV0Y29mZnNldCgpLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZHN0KCksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfYmFkX3R6aW5mb19jbGFzc2VzKHNlbGYpOgorICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2xzLCAxLCAxLCAxLCB0emluZm89MTIpCisKKyAgICAgICAgY2xhc3MgTmljZVRyeShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTogcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNscywgMSwgMSwgMSwgdHppbmZvPU5pY2VUcnkpCisKKyAgICAgICAgY2xhc3MgQmV0dGVyVHJ5KHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiBwYXNzCisgICAgICAgIGIgPSBCZXR0ZXJUcnkoKQorICAgICAgICB0ID0gY2xzKDEsIDEsIDEsIHR6aW5mbz1iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodC50emluZm8gaXMgYikKKworICAgIGRlZiB0ZXN0X3V0Y19vZmZzZXRfb3V0X29mX2JvdW5kcyhzZWxmKToKKyAgICAgICAgY2xhc3MgRWRneSh0emluZm8pOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9mZnNldCk6CisgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXQgPSB0aW1lZGVsdGEobWludXRlcz1vZmZzZXQpCisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5vZmZzZXQKKworICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCisgICAgICAgIGZvciBvZmZzZXQsIGxlZ2l0IGluICgoLTE0NDAsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTQzOSwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTQzOSwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTQ0MCwgRmFsc2UpKToKKyAgICAgICAgICAgIGlmIGNscyBpcyB0aW1lOgorICAgICAgICAgICAgICAgIHQgPSBjbHMoMSwgMiwgMywgdHppbmZvPUVkZ3kob2Zmc2V0KSkKKyAgICAgICAgICAgIGVsaWYgY2xzIGlzIGRhdGV0aW1lOgorICAgICAgICAgICAgICAgIHQgPSBjbHMoNiwgNiwgNiwgMSwgMiwgMywgdHppbmZvPUVkZ3kob2Zmc2V0KSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNzZXJ0IDAsICJpbXBvc3NpYmxlIgorICAgICAgICAgICAgaWYgbGVnaXQ6CisgICAgICAgICAgICAgICAgYW9mcyA9IGFicyhvZmZzZXQpCisgICAgICAgICAgICAgICAgaCwgbSA9IGRpdm1vZChhb2ZzLCA2MCkKKyAgICAgICAgICAgICAgICB0YWcgPSAiJWMlMDJkOiUwMmQiICUgKG9mZnNldCA8IDAgYW5kICctJyBvciAnKycsIGgsIG0pCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0LCBkYXRldGltZSk6CisgICAgICAgICAgICAgICAgICAgIHQgPSB0LnRpbWV0eigpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodCksICIwMTowMjowMyIgKyB0YWcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0ciwgdCkKKworICAgIGRlZiB0ZXN0X3R6aW5mb19jbGFzc2VzKHNlbGYpOgorICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCisgICAgICAgIGNsYXNzIEMxKHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTogcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGRlZiBkc3Qoc2VsZiwgZHQpOiByZXR1cm4gTm9uZQorICAgICAgICAgICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6IHJldHVybiBOb25lCisgICAgICAgIGZvciB0IGluIChjbHMoMSwgMSwgMSksCisgICAgICAgICAgICAgICAgICBjbHMoMSwgMSwgMSwgdHppbmZvPU5vbmUpLAorICAgICAgICAgICAgICAgICAgY2xzKDEsIDEsIDEsIHR6aW5mbz1DMSgpKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodC51dGNvZmZzZXQoKSBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQuZHN0KCkgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0LnR6bmFtZSgpIGlzIE5vbmUpCisKKyAgICAgICAgY2xhc3MgQzModHppbmZvKToKKyAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiByZXR1cm4gdGltZWRlbHRhKG1pbnV0ZXM9LTE0MzkpCisgICAgICAgICAgICBkZWYgZHN0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YShtaW51dGVzPTE0MzkpCisgICAgICAgICAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KTogcmV0dXJuICJhbmFtZSIKKyAgICAgICAgdCA9IGNscygxLCAxLCAxLCB0emluZm89QzMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz0tMTQzOSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5kc3QoKSwgdGltZWRlbHRhKG1pbnV0ZXM9MTQzOSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50em5hbWUoKSwgImFuYW1lIikKKworICAgICAgICAjIFdyb25nIHR5cGVzLgorICAgICAgICBjbGFzcyBDNCh0emluZm8pOgorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6IHJldHVybiAiYW5hbWUiCisgICAgICAgICAgICBkZWYgZHN0KHNlbGYsIGR0KTogcmV0dXJuIDcKKyAgICAgICAgICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOiByZXR1cm4gMAorICAgICAgICB0ID0gY2xzKDEsIDEsIDEsIHR6aW5mbz1DNCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQudXRjb2Zmc2V0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuZHN0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQudHpuYW1lKQorCisgICAgICAgICMgT2Zmc2V0IG91dCBvZiByYW5nZS4KKyAgICAgICAgY2xhc3MgQzYodHppbmZvKToKKyAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiByZXR1cm4gdGltZWRlbHRhKGhvdXJzPS0yNCkKKyAgICAgICAgICAgIGRlZiBkc3Qoc2VsZiwgZHQpOiByZXR1cm4gdGltZWRlbHRhKGhvdXJzPTI0KQorICAgICAgICB0ID0gY2xzKDEsIDEsIDEsIHR6aW5mbz1DNigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnV0Y29mZnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5kc3QpCisKKyAgICAgICAgIyBOb3QgYSB3aG9sZSBudW1iZXIgb2YgbWludXRlcy4KKyAgICAgICAgY2xhc3MgQzcodHppbmZvKToKKyAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiByZXR1cm4gdGltZWRlbHRhKHNlY29uZHM9NjEpCisgICAgICAgICAgICBkZWYgZHN0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YShtaWNyb3NlY29uZHM9LTgxKQorICAgICAgICB0ID0gY2xzKDEsIDEsIDEsIHR6aW5mbz1DNygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnV0Y29mZnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5kc3QpCisKKyAgICBkZWYgdGVzdF9hd2FyZV9jb21wYXJlKHNlbGYpOgorICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCisKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB1dGNvZmZzZXQoKSBnZXRzIGlnbm9yZWQgaWYgdGhlIGNvbXBhcmFuZHMgaGF2ZQorICAgICAgICAjIHRoZSBzYW1lIHR6aW5mbyBtZW1iZXIuCisgICAgICAgIGNsYXNzIE9wZXJhbmREZXBlbmRlbnRPZmZzZXQodHppbmZvKToKKyAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgdCk6CisgICAgICAgICAgICAgICAgaWYgdC5taW51dGUgPCAxMDoKKyAgICAgICAgICAgICAgICAgICAgIyBkMCBhbmQgZDEgZXF1YWwgYWZ0ZXIgYWRqdXN0bWVudAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhKG1pbnV0ZXM9dC5taW51dGUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBkMiBvZmYgaW4gdGhlIHdlZWRzCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEobWludXRlcz01OSkKKworICAgICAgICBiYXNlID0gY2xzKDgsIDksIDEwLCB0emluZm89T3BlcmFuZERlcGVuZGVudE9mZnNldCgpKQorICAgICAgICBkMCA9IGJhc2UucmVwbGFjZShtaW51dGU9MykKKyAgICAgICAgZDEgPSBiYXNlLnJlcGxhY2UobWludXRlPTkpCisgICAgICAgIGQyID0gYmFzZS5yZXBsYWNlKG1pbnV0ZT0xMSkKKyAgICAgICAgZm9yIHggaW4gZDAsIGQxLCBkMjoKKyAgICAgICAgICAgIGZvciB5IGluIGQwLCBkMSwgZDI6CisgICAgICAgICAgICAgICAgZ290ID0gY21wKHgsIHkpCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBjbXAoeC5taW51dGUsIHkubWludXRlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBleHBlY3RlZCkKKworICAgICAgICAjIEhvd2V2ZXIsIGlmIHRoZXkncmUgZGlmZmVyZW50IG1lbWJlcnMsIHVjdG9mZnNldCBpcyBub3QgaWdub3JlZC4KKyAgICAgICAgIyBOb3RlIHRoYXQgYSB0aW1lIGNhbid0IGFjdHVhbGx5IGhhdmUgYW4gb3BlcmFuZC1kZXBlZGVudCBvZmZzZXQsCisgICAgICAgICMgdGhvdWdoIChhbmQgdGltZS51dGNvZmZzZXQoKSBwYXNzZXMgTm9uZSB0byB0emluZm8udXRjb2Zmc2V0KCkpLAorICAgICAgICAjIHNvIHNraXAgdGhpcyB0ZXN0IGZvciB0aW1lLgorICAgICAgICBpZiBjbHMgaXMgbm90IHRpbWU6CisgICAgICAgICAgICBkMCA9IGJhc2UucmVwbGFjZShtaW51dGU9MywgdHppbmZvPU9wZXJhbmREZXBlbmRlbnRPZmZzZXQoKSkKKyAgICAgICAgICAgIGQxID0gYmFzZS5yZXBsYWNlKG1pbnV0ZT05LCB0emluZm89T3BlcmFuZERlcGVuZGVudE9mZnNldCgpKQorICAgICAgICAgICAgZDIgPSBiYXNlLnJlcGxhY2UobWludXRlPTExLCB0emluZm89T3BlcmFuZERlcGVuZGVudE9mZnNldCgpKQorICAgICAgICAgICAgZm9yIHggaW4gZDAsIGQxLCBkMjoKKyAgICAgICAgICAgICAgICBmb3IgeSBpbiBkMCwgZDEsIGQyOgorICAgICAgICAgICAgICAgICAgICBnb3QgPSBjbXAoeCwgeSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHggaXMgZDAgb3IgeCBpcyBkMSkgYW5kICh5IGlzIGQwIG9yIHkgaXMgZDEpOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSAwCisgICAgICAgICAgICAgICAgICAgIGVsaWYgeCBpcyB5IGlzIGQyOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSAwCisgICAgICAgICAgICAgICAgICAgIGVsaWYgeCBpcyBkMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gLTEKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCB5IGlzIGQyCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IDEKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQorCisKKyMgVGVzdGluZyB0aW1lIG9iamVjdHMgd2l0aCBhIG5vbi1Ob25lIHR6aW5mby4KK2NsYXNzIFRlc3RUaW1lVFooVGVzdFRpbWUsIFRaSW5mb0Jhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICB0aGVjbGFzcyA9IHRpbWUKKworICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOgorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5ob3VyLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubWludXRlLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc2Vjb25kLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubWljcm9zZWNvbmQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0LnR6aW5mbyBpcyBOb25lKQorCisgICAgZGVmIHRlc3Rfem9uZXMoc2VsZik6CisgICAgICAgIGVzdCA9IEZpeGVkT2Zmc2V0KC0zMDAsICJFU1QiLCAxKQorICAgICAgICB1dGMgPSBGaXhlZE9mZnNldCgwLCAiVVRDIiwgLTIpCisgICAgICAgIG1ldCA9IEZpeGVkT2Zmc2V0KDYwLCAiTUVUIiwgMykKKyAgICAgICAgdDEgPSB0aW1lKCA3LCA0NywgdHppbmZvPWVzdCkKKyAgICAgICAgdDIgPSB0aW1lKDEyLCA0NywgdHppbmZvPXV0YykKKyAgICAgICAgdDMgPSB0aW1lKDEzLCA0NywgdHppbmZvPW1ldCkKKyAgICAgICAgdDQgPSB0aW1lKG1pY3Jvc2Vjb25kPTQwKQorICAgICAgICB0NSA9IHRpbWUobWljcm9zZWNvbmQ9NDAsIHR6aW5mbz11dGMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS50emluZm8sIGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi50emluZm8sIHV0YykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My50emluZm8sIG1ldCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQ0LnR6aW5mbyBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQ1LnR6aW5mbywgdXRjKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPS0zMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz0wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9NjApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDQudXRjb2Zmc2V0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0MS51dGNvZmZzZXQsICJubyBhcmdzIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLnR6bmFtZSgpLCAiRVNUIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi50em5hbWUoKSwgIlVUQyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMudHpuYW1lKCksICJNRVQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDQudHpuYW1lKCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0MS50em5hbWUsICJubyBhcmdzIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLmRzdCgpLCB0aW1lZGVsdGEobWludXRlcz0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi5kc3QoKSwgdGltZWRlbHRhKG1pbnV0ZXM9LTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLmRzdCgpLCB0aW1lZGVsdGEobWludXRlcz0zKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQ0LmRzdCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdDEuZHN0LCAibm8gYXJncyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHQxKSwgaGFzaCh0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh0MSksIGhhc2godDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godDIpLCBoYXNoKHQzKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIsIHQzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogdDQgPT0gdDUpICMgbWl4ZWQgdHotYXdhcmUgJiBuYWl2ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogdDQgPCB0NSkgIyBtaXhlZCB0ei1hd2FyZSAmIG5haXZlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB0NSA8IHQ0KSAjIG1peGVkIHR6LWF3YXJlICYgbmFpdmUKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0MSksICIwNzo0NzowMC0wNTowMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQyKSwgIjEyOjQ3OjAwKzAwOjAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodDMpLCAiMTM6NDc6MDArMDE6MDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0NCksICIwMDowMDowMC4wMDAwNDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0NSksICIwMDowMDowMC4wMDAwNDArMDA6MDAiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEuaXNvZm9ybWF0KCksICIwNzo0NzowMC0wNTowMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIuaXNvZm9ybWF0KCksICIxMjo0NzowMCswMDowMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMuaXNvZm9ybWF0KCksICIxMzo0NzowMCswMTowMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDQuaXNvZm9ybWF0KCksICIwMDowMDowMC4wMDAwNDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQ1Lmlzb2Zvcm1hdCgpLCAiMDA6MDA6MDAuMDAwMDQwKzAwOjAwIikKKworICAgICAgICBkID0gJ2RhdGV0aW1lLnRpbWUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih0MSksIGQgKyAiKDcsIDQ3LCB0emluZm89ZXN0KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih0MiksIGQgKyAiKDEyLCA0NywgdHppbmZvPXV0YykiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodDMpLCBkICsgIigxMywgNDcsIHR6aW5mbz1tZXQpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHQ0KSwgZCArICIoMCwgMCwgMCwgNDApIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHQ1KSwgZCArICIoMCwgMCwgMCwgNDAsIHR6aW5mbz11dGMpIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLnN0cmZ0aW1lKCIlSDolTTolUyAlJVo9JVogJSV6PSV6IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjA3OjQ3OjAwICVaPUVTVCAlej0tMDUwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIuc3RyZnRpbWUoIiVIOiVNOiVTICVaICV6IiksICIxMjo0NzowMCBVVEMgKzAwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLnN0cmZ0aW1lKCIlSDolTTolUyAlWiAleiIpLCAiMTM6NDc6MDAgTUVUICswMTAwIikKKworICAgICAgICB5dWNrID0gRml4ZWRPZmZzZXQoLTE0MzksICIleiAlWiAlJXolJVoiKQorICAgICAgICB0MSA9IHRpbWUoMjMsIDU5LCB0emluZm89eXVjaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS5zdHJmdGltZSgiJUg6JU0gJSVaPSclWicgJSV6PScleiciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjM6NTkgJVo9JyV6ICVaICUleiUlWicgJXo9Jy0yMzU5JyIpCisKKyAgICAgICAgIyBDaGVjayB0aGF0IGFuIGludmFsaWQgdHpuYW1lIHJlc3VsdCByYWlzZXMgYW4gZXhjZXB0aW9uLgorICAgICAgICBjbGFzcyBCYWR0em5hbWUodHppbmZvKToKKyAgICAgICAgICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOiByZXR1cm4gNDIKKyAgICAgICAgdCA9IHRpbWUoMiwgMywgNCwgdHppbmZvPUJhZHR6bmFtZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc3RyZnRpbWUoIiVIOiVNOiVTIiksICIwMjowMzowNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdC5zdHJmdGltZSwgIiVaIikKKworICAgIGRlZiB0ZXN0X2hhc2hfZWRnZV9jYXNlcyhzZWxmKToKKyAgICAgICAgIyBPZmZzZXRzIHRoYXQgb3ZlcmZsb3cgYSBiYXNpYyB0aW1lLgorICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoMCwgMSwgMiwgMywgdHppbmZvPUZpeGVkT2Zmc2V0KDE0MzksICIiKSkKKyAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzKDAsIDAsIDIsIDMsIHR6aW5mbz1GaXhlZE9mZnNldCgxNDM4LCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh0MSksIGhhc2godDIpKQorCisgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygyMywgNTgsIDYsIDEwMCwgdHppbmZvPUZpeGVkT2Zmc2V0KC0xMDAwLCAiIikpCisgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygyMywgNDgsIDYsIDEwMCwgdHppbmZvPUZpeGVkT2Zmc2V0KC0xMDEwLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh0MSksIGhhc2godDIpKQorCisgICAgZGVmIHRlc3RfcGlja2xpbmcoc2VsZik6CisgICAgICAgICMgVHJ5IG9uZSB3aXRob3V0IGEgdHppbmZvLgorICAgICAgICBhcmdzID0gMjAsIDU5LCAxNiwgNjQqKjIKKyAgICAgICAgb3JpZyA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCisgICAgICAgIGZvciBwaWNrbGVyLCB1bnBpY2tsZXIsIHByb3RvIGluIHBpY2tsZV9jaG9pY2VzOgorICAgICAgICAgICAgZ3JlZW4gPSBwaWNrbGVyLmR1bXBzKG9yaWcsIHByb3RvKQorICAgICAgICAgICAgZGVyaXZlZCA9IHVucGlja2xlci5sb2FkcyhncmVlbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZywgZGVyaXZlZCkKKworICAgICAgICAjIFRyeSBvbmUgd2l0aCBhIHR6aW5mby4KKyAgICAgICAgdGluZm8gPSBQaWNrbGFibGVGaXhlZE9mZnNldCgtMzAwLCAnY29va2llJykKKyAgICAgICAgb3JpZyA9IHNlbGYudGhlY2xhc3MoNSwgNiwgNywgdHppbmZvPXRpbmZvKQorICAgICAgICBmb3IgcGlja2xlciwgdW5waWNrbGVyLCBwcm90byBpbiBwaWNrbGVfY2hvaWNlczoKKyAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKKyAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWcsIGRlcml2ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZGVyaXZlZC50emluZm8sIFBpY2tsYWJsZUZpeGVkT2Zmc2V0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXJpdmVkLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz0tMzAwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVyaXZlZC50em5hbWUoKSwgJ2Nvb2tpZScpCisKKyAgICBkZWYgdGVzdF9tb3JlX2Jvb2woc2VsZik6CisgICAgICAgICMgVGVzdCBjYXNlcyB3aXRoIG5vbi1Ob25lIHR6aW5mby4KKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworCisgICAgICAgIHQgPSBjbHMoMCwgdHppbmZvPUZpeGVkT2Zmc2V0KC0zMDAsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQpCisKKyAgICAgICAgdCA9IGNscyg1LCB0emluZm89Rml4ZWRPZmZzZXQoLTMwMCwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodCkKKworICAgICAgICB0ID0gY2xzKDUsIHR6aW5mbz1GaXhlZE9mZnNldCgzMDAsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0KQorCisgICAgICAgIHQgPSBjbHMoMjMsIDU5LCB0emluZm89Rml4ZWRPZmZzZXQoMjMqNjAgKyA1OSwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQpCisKKyAgICAgICAgIyBNb3N0bHkgZW5zdXJpbmcgdGhpcyBkb2Vzbid0IG92ZXJmbG93IGludGVybmFsbHkuCisgICAgICAgIHQgPSBjbHMoMCwgdHppbmZvPUZpeGVkT2Zmc2V0KDIzKjYwICsgNTksICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQpCisKKyAgICAgICAgIyBCdXQgdGhpcyBzaG91bGQgeWllbGQgYSB2YWx1ZSBlcnJvciAtLSB0aGUgdXRjb2Zmc2V0IGlzIGJvZ3VzLgorICAgICAgICB0ID0gY2xzKDAsIHR6aW5mbz1GaXhlZE9mZnNldCgyNCo2MCwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IGJvb2wodCkpCisKKyAgICAgICAgIyBMaWtld2lzZS4KKyAgICAgICAgdCA9IGNscygwLCB0emluZm89Rml4ZWRPZmZzZXQoLTI0KjYwLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogYm9vbCh0KSkKKworICAgIGRlZiB0ZXN0X3JlcGxhY2Uoc2VsZik6CisgICAgICAgIGNscyA9IHNlbGYudGhlY2xhc3MKKyAgICAgICAgejEwMCA9IEZpeGVkT2Zmc2V0KDEwMCwgIisxMDAiKQorICAgICAgICB6bTIwMCA9IEZpeGVkT2Zmc2V0KHRpbWVkZWx0YShtaW51dGVzPS0yMDApLCAiLTIwMCIpCisgICAgICAgIGFyZ3MgPSBbMSwgMiwgMywgNCwgejEwMF0KKyAgICAgICAgYmFzZSA9IGNscygqYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLCBiYXNlLnJlcGxhY2UoKSkKKworICAgICAgICBpID0gMAorICAgICAgICBmb3IgbmFtZSwgbmV3dmFsIGluICgoImhvdXIiLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtaW51dGUiLCA2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJzZWNvbmQiLCA3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtaWNyb3NlY29uZCIsIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInR6aW5mbyIsIHptMjAwKSk6CisgICAgICAgICAgICBuZXdhcmdzID0gYXJnc1s6XQorICAgICAgICAgICAgbmV3YXJnc1tpXSA9IG5ld3ZhbAorICAgICAgICAgICAgZXhwZWN0ZWQgPSBjbHMoKm5ld2FyZ3MpCisgICAgICAgICAgICBnb3QgPSBiYXNlLnJlcGxhY2UoKip7bmFtZTogbmV3dmFsfSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKyAgICAgICAgICAgIGkgKz0gMQorCisgICAgICAgICMgRW5zdXJlIHdlIGNhbiBnZXQgcmlkIG9mIGEgdHppbmZvLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2UudHpuYW1lKCksICIrMTAwIikKKyAgICAgICAgYmFzZTIgPSBiYXNlLnJlcGxhY2UodHppbmZvPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlMi50emluZm8gaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJhc2UyLnR6bmFtZSgpIGlzIE5vbmUpCisKKyAgICAgICAgIyBFbnN1cmUgd2UgY2FuIGFkZCBvbmUuCisgICAgICAgIGJhc2UzID0gYmFzZTIucmVwbGFjZSh0emluZm89ejEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLCBiYXNlMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJhc2UudHppbmZvIGlzIGJhc2UzLnR6aW5mbykKKworICAgICAgICAjIE91dCBvZiBib3VuZHMuCisgICAgICAgIGJhc2UgPSBjbHMoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYmFzZS5yZXBsYWNlLCBob3VyPTI0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiYXNlLnJlcGxhY2UsIG1pbnV0ZT0tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYmFzZS5yZXBsYWNlLCBzZWNvbmQ9MTAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiYXNlLnJlcGxhY2UsIG1pY3Jvc2Vjb25kPTEwMDAwMDApCisKKyAgICBkZWYgdGVzdF9taXhlZF9jb21wYXJlKHNlbGYpOgorICAgICAgICB0MSA9IHRpbWUoMSwgMiwgMykKKyAgICAgICAgdDIgPSB0aW1lKDEsIDIsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQorICAgICAgICB0MiA9IHQyLnJlcGxhY2UodHppbmZvPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQorICAgICAgICB0MiA9IHQyLnJlcGxhY2UodHppbmZvPUZpeGVkT2Zmc2V0KE5vbmUsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisgICAgICAgIHQyID0gdDIucmVwbGFjZSh0emluZm89Rml4ZWRPZmZzZXQoMCwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogdDEgPT0gdDIpCisKKyAgICAgICAgIyBJbiB0aW1lIHcvIGlkZW50aWNhbCB0emluZm8gb2JqZWN0cywgdXRjb2Zmc2V0IGlzIGlnbm9yZWQuCisgICAgICAgIGNsYXNzIFZhcmllcyh0emluZm8pOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ID0gdGltZWRlbHRhKG1pbnV0ZXM9MjIpCisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIHQpOgorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IHRpbWVkZWx0YShtaW51dGVzPTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYub2Zmc2V0CisKKyAgICAgICAgdiA9IFZhcmllcygpCisgICAgICAgIHQxID0gdDIucmVwbGFjZSh0emluZm89dikKKyAgICAgICAgdDIgPSB0Mi5yZXBsYWNlKHR6aW5mbz12KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz0yMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPTI0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisKKyAgICAgICAgIyBCdXQgaWYgdGhleSdyZSBub3QgaWRlbnRpY2FsLCBpdCBpc24ndCBpZ25vcmVkLgorICAgICAgICB0MiA9IHQyLnJlcGxhY2UodHppbmZvPVZhcmllcygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikgICMgdDEncyBvZmZzZXQgY291bnRlciBzdGlsbCBnb2luZyB1cAorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfdGltZXR6KHNlbGYpOgorCisgICAgICAgIGNsYXNzIEMoc2VsZi50aGVjbGFzcyk6CisgICAgICAgICAgICB0aGVBbnN3ZXIgPSA0MgorCisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzLCAqKmt3cyk6CisgICAgICAgICAgICAgICAgdGVtcCA9IGt3cy5jb3B5KCkKKyAgICAgICAgICAgICAgICBleHRyYSA9IHRlbXAucG9wKCdleHRyYScpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi50aGVjbGFzcy5fX25ld19fKGNscywgKmFyZ3MsICoqdGVtcCkKKyAgICAgICAgICAgICAgICByZXN1bHQuZXh0cmEgPSBleHRyYQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICAgICAgICAgZGVmIG5ld21ldGgoc2VsZiwgc3RhcnQpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdGFydCArIHNlbGYuaG91ciArIHNlbGYuc2Vjb25kCisKKyAgICAgICAgYXJncyA9IDQsIDUsIDYsIDUwMCwgRml4ZWRPZmZzZXQoLTMwMCwgIkVTVCIsIDEpCisKKyAgICAgICAgZHQxID0gc2VsZi50aGVjbGFzcygqYXJncykKKyAgICAgICAgZHQyID0gQygqYXJncywgKip7J2V4dHJhJzogN30pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIuX19jbGFzc19fLCBDKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi50aGVBbnN3ZXIsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi5leHRyYSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDEudXRjb2Zmc2V0KCksIGR0Mi51dGNvZmZzZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIubmV3bWV0aCgtNyksIGR0MS5ob3VyICsgZHQxLnNlY29uZCAtIDcpCisKKworIyBUZXN0aW5nIGRhdGV0aW1lIG9iamVjdHMgd2l0aCBhIG5vbi1Ob25lIHR6aW5mby4KKworY2xhc3MgVGVzdERhdGVUaW1lVFooVGVzdERhdGVUaW1lLCBUWkluZm9CYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgdGhlY2xhc3MgPSBkYXRldGltZQorCisgICAgZGVmIHRlc3RfdHJpdmlhbChzZWxmKToKKyAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzKDEsIDIsIDMsIDQsIDUsIDYsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQueWVhciwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5tb250aCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5kYXksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuaG91ciwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5taW51dGUsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuc2Vjb25kLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Lm1pY3Jvc2Vjb25kLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LnR6aW5mbywgTm9uZSkKKworICAgIGRlZiB0ZXN0X2V2ZW5fbW9yZV9jb21wYXJlKHNlbGYpOgorICAgICAgICAjIFRoZSB0ZXN0X2NvbXBhcmUoKSBhbmQgdGVzdF9tb3JlX2NvbXBhcmUoKSBpbmhlcml0ZWQgZnJvbSBUZXN0RGF0ZQorICAgICAgICAjIGFuZCBUZXN0RGF0ZVRpbWUgY292ZXJlZCBub24tdHppbmZvIGNhc2VzLgorCisgICAgICAgICMgU21hbGxlc3QgcG9zc2libGUgYWZ0ZXIgVVRDIGFkanVzdG1lbnQuCisgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygxLCAxLCAxLCB0emluZm89Rml4ZWRPZmZzZXQoMTQzOSwgIiIpKQorICAgICAgICAjIExhcmdlc3QgcG9zc2libGUgYWZ0ZXIgVVRDIGFkanVzdG1lbnQuCisgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcyhNQVhZRUFSLCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTk5OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbz1GaXhlZE9mZnNldCgtMTQzOSwgIiIpKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRob3NlIGNvbXBhcmUgY29ycmVjdGx5LCBhbmQgdy9vIG92ZXJmbG93LgorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxICE9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPiB0MSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPT0gdDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA9PSB0MikKKworICAgICAgICAjIEVxdWFsIGFmZXIgYWRqdXN0bWVudC4KKyAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKDEsIDEyLCAzMSwgMjMsIDU5LCB0emluZm89Rml4ZWRPZmZzZXQoMSwgIiIpKQorICAgICAgICB0MiA9IHNlbGYudGhlY2xhc3MoMiwgMSwgMSwgMywgMTMsIHR6aW5mbz1GaXhlZE9mZnNldCgzKjYwKzEzKzIsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisKKyAgICAgICAgIyBDaGFuZ2UgdDEgbm90IHRvIHN1YnRyYWN0IGEgbWludXRlLCBhbmQgdDEgc2hvdWxkIGJlIGxhcmdlci4KKyAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKDEsIDEyLCAzMSwgMjMsIDU5LCB0emluZm89Rml4ZWRPZmZzZXQoMCwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPiB0MikKKworICAgICAgICAjIENoYW5nZSB0MSB0byBzdWJ0cmFjdCAyIG1pbnV0ZXMsIGFuZCB0MSBzaG91bGQgYmUgc21hbGxlci4KKyAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKDEsIDEyLCAzMSwgMjMsIDU5LCB0emluZm89Rml4ZWRPZmZzZXQoMiwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikKKworICAgICAgICAjIEJhY2sgdG8gdGhlIG9yaWdpbmFsIHQxLCBidXQgbWFrZSBzZWNvbmRzIHJlc29sdmUgaXQuCisgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygxLCAxMiwgMzEsIDIzLCA1OSwgdHppbmZvPUZpeGVkT2Zmc2V0KDEsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZD0xKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPiB0MikKKworICAgICAgICAjIExpa2V3aXNlLCBidXQgbWFrZSBtaWNyb3NlY29uZHMgcmVzb2x2ZSBpdC4KKyAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKDEsIDEyLCAzMSwgMjMsIDU5LCB0emluZm89Rml4ZWRPZmZzZXQoMSwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9zZWNvbmQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID4gdDIpCisKKyAgICAgICAgIyBNYWtlIHQyIG5haXZlIGFuZCBpdCBzaG91bGQgZmFpbC4KKyAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzLm1pbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogdDEgPT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIsIHQyKQorCisgICAgICAgICMgSXQncyBhbHNvIG5haXZlIGlmIGl0IGhhcyB0emluZm8gYnV0IHR6aW5mby51dGNvZmZzZXQoKSBpcyBOb25lLgorICAgICAgICBjbGFzcyBOYWl2ZSh0emluZm8pOgorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6IHJldHVybiBOb25lCisgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcyg1LCA2LCA3LCB0emluZm89TmFpdmUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxID09IHQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLCB0MikKKworICAgICAgICAjIE9UT0gsIGl0J3MgT0sgdG8gY29tcGFyZSB0d28gb2YgdGhlc2UgbWl4aW5nIHRoZSB0d28gd2F5cyBvZiBiZWluZworICAgICAgICAjIG5haXZlLgorICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoNSwgNiwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisKKyAgICAgICAgIyBUcnkgYSBib2d1cyB1Y3RvZmZzZXQuCisgICAgICAgIGNsYXNzIEJvZ3VzKHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhKG1pbnV0ZXM9MTQ0MCkgIyBvdXQgb2YgYm91bmRzCisgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygyLCAyLCAyLCB0emluZm89Qm9ndXMoKSkKKyAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzKDIsIDIsIDIsIHR6aW5mbz1GaXhlZE9mZnNldCgwLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogdDEgPT0gdDIpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgIyBUcnkgb25lIHdpdGhvdXQgYSB0emluZm8uCisgICAgICAgIGFyZ3MgPSA2LCA3LCAyMywgMjAsIDU5LCAxLCA2NCoqMgorICAgICAgICBvcmlnID0gc2VsZi50aGVjbGFzcygqYXJncykKKyAgICAgICAgZm9yIHBpY2tsZXIsIHVucGlja2xlciwgcHJvdG8gaW4gcGlja2xlX2Nob2ljZXM6CisgICAgICAgICAgICBncmVlbiA9IHBpY2tsZXIuZHVtcHMob3JpZywgcHJvdG8pCisgICAgICAgICAgICBkZXJpdmVkID0gdW5waWNrbGVyLmxvYWRzKGdyZWVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnLCBkZXJpdmVkKQorCisgICAgICAgICMgVHJ5IG9uZSB3aXRoIGEgdHppbmZvLgorICAgICAgICB0aW5mbyA9IFBpY2tsYWJsZUZpeGVkT2Zmc2V0KC0zMDAsICdjb29raWUnKQorICAgICAgICBvcmlnID0gc2VsZi50aGVjbGFzcygqYXJncywgKip7J3R6aW5mbyc6IHRpbmZvfSkKKyAgICAgICAgZGVyaXZlZCA9IHNlbGYudGhlY2xhc3MoMSwgMSwgMSwgdHppbmZvPUZpeGVkT2Zmc2V0KDAsICIiLCAwKSkKKyAgICAgICAgZm9yIHBpY2tsZXIsIHVucGlja2xlciwgcHJvdG8gaW4gcGlja2xlX2Nob2ljZXM6CisgICAgICAgICAgICBncmVlbiA9IHBpY2tsZXIuZHVtcHMob3JpZywgcHJvdG8pCisgICAgICAgICAgICBkZXJpdmVkID0gdW5waWNrbGVyLmxvYWRzKGdyZWVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnLCBkZXJpdmVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGRlcml2ZWQudHppbmZvLCBQaWNrbGFibGVGaXhlZE9mZnNldCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVyaXZlZC51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9LTMwMCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudHpuYW1lKCksICdjb29raWUnKQorCisgICAgZGVmIHRlc3RfZXh0cmVtZV9oYXNoZXMoc2VsZik6CisgICAgICAgICMgSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGhhc2ggdGhlc2UgdmlhIHN1YnRyYWN0aW5nIHRoZSBvZmZzZXQKKyAgICAgICAgIyB0aGVuIGhhc2hpbmcgYSBkYXRldGltZSBvYmplY3QsIE92ZXJmbG93RXJyb3IgcmVzdWx0cy4gIFRoZQorICAgICAgICAjIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiB1c2VkIHRvIGJsb3cgdXAgaGVyZS4KKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMSwgMSwgMSwgdHppbmZvPUZpeGVkT2Zmc2V0KDE0MzksICIiKSkKKyAgICAgICAgaGFzaCh0KQorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhNQVhZRUFSLCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTk5OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvPUZpeGVkT2Zmc2V0KC0xNDM5LCAiIikpCisgICAgICAgIGhhc2godCkKKworICAgICAgICAjIE9UT0gsIGFuIE9PQiBvZmZzZXQgc2hvdWxkIGJsb3cgdXAuCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDUsIDUsIDUsIHR6aW5mbz1GaXhlZE9mZnNldCgtMTQ0MCwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBoYXNoLCB0KQorCisgICAgZGVmIHRlc3Rfem9uZXMoc2VsZik6CisgICAgICAgIGVzdCA9IEZpeGVkT2Zmc2V0KC0zMDAsICJFU1QiKQorICAgICAgICB1dGMgPSBGaXhlZE9mZnNldCgwLCAiVVRDIikKKyAgICAgICAgbWV0ID0gRml4ZWRPZmZzZXQoNjAsICJNRVQiKQorICAgICAgICB0MSA9IGRhdGV0aW1lKDIwMDIsIDMsIDE5LCAgNywgNDcsIHR6aW5mbz1lc3QpCisgICAgICAgIHQyID0gZGF0ZXRpbWUoMjAwMiwgMywgMTksIDEyLCA0NywgdHppbmZvPXV0YykKKyAgICAgICAgdDMgPSBkYXRldGltZSgyMDAyLCAzLCAxOSwgMTMsIDQ3LCB0emluZm89bWV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLnR6aW5mbywgZXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLnR6aW5mbywgdXRjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLnR6aW5mbywgbWV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz0tMzAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPTYwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS50em5hbWUoKSwgIkVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIudHpuYW1lKCksICJVVEMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLnR6bmFtZSgpLCAiTUVUIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHQxKSwgaGFzaCh0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh0MSksIGhhc2godDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godDIpLCBoYXNoKHQzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLCB0MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodDEpLCAiMjAwMi0wMy0xOSAwNzo0NzowMC0wNTowMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQyKSwgIjIwMDItMDMtMTkgMTI6NDc6MDArMDA6MDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0MyksICIyMDAyLTAzLTE5IDEzOjQ3OjAwKzAxOjAwIikKKyAgICAgICAgZCA9ICdkYXRldGltZS5kYXRldGltZSgyMDAyLCAzLCAxOSwgJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodDEpLCBkICsgIjcsIDQ3LCB0emluZm89ZXN0KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih0MiksIGQgKyAiMTIsIDQ3LCB0emluZm89dXRjKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih0MyksIGQgKyAiMTMsIDQ3LCB0emluZm89bWV0KSIpCisKKyAgICBkZWYgdGVzdF9jb21iaW5lKHNlbGYpOgorICAgICAgICBtZXQgPSBGaXhlZE9mZnNldCg2MCwgIk1FVCIpCisgICAgICAgIGQgPSBkYXRlKDIwMDIsIDMsIDQpCisgICAgICAgIHR6ID0gdGltZSgxOCwgNDUsIDMsIDEyMzQsIHR6aW5mbz1tZXQpCisgICAgICAgIGR0ID0gZGF0ZXRpbWUuY29tYmluZShkLCB0eikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgZGF0ZXRpbWUoMjAwMiwgMywgNCwgMTgsIDQ1LCAzLCAxMjM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbz1tZXQpKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdChzZWxmKToKKyAgICAgICAgbWV0ID0gRml4ZWRPZmZzZXQoNjAsICJNRVQiKQorICAgICAgICBkdCA9IHNlbGYudGhlY2xhc3MoMjAwMiwgMywgNCwgMTgsIDQ1LCAzLCAxMjM0LCB0emluZm89bWV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LmRhdGUoKSwgZGF0ZSgyMDAyLCAzLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC50aW1lKCksIHRpbWUoMTgsIDQ1LCAzLCAxMjM0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC50aW1ldHooKSwgdGltZSgxOCwgNDUsIDMsIDEyMzQsIHR6aW5mbz1tZXQpKQorCisgICAgZGVmIHRlc3RfdHpfYXdhcmVfYXJpdGhtZXRpYyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHJhbmRvbQorCisgICAgICAgIG5vdyA9IHNlbGYudGhlY2xhc3Mubm93KCkKKyAgICAgICAgdHo1NSA9IEZpeGVkT2Zmc2V0KC0zMzAsICJ3ZXN0IDU6MzAiKQorICAgICAgICB0aW1lYXdhcmUgPSBub3cudGltZSgpLnJlcGxhY2UodHppbmZvPXR6NTUpCisgICAgICAgIG5vd2F3YXJlID0gc2VsZi50aGVjbGFzcy5jb21iaW5lKG5vdy5kYXRlKCksIHRpbWVhd2FyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vd2F3YXJlLnR6aW5mbyBpcyB0ejU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vd2F3YXJlLnRpbWV0eigpLCB0aW1lYXdhcmUpCisKKyAgICAgICAgIyBDYW4ndCBtaXggYXdhcmUgYW5kIG5vbi1hd2FyZS4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG5vdyAtIG5vd2F3YXJlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogbm93YXdhcmUgLSBub3cpCisKKyAgICAgICAgIyBBbmQgYWRkaW5nIGRhdGV0aW1lJ3MgZG9lc24ndCBtYWtlIHNlbnNlLCBhd2FyZSBvciBub3QuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBub3cgKyBub3dhd2FyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG5vd2F3YXJlICsgbm93KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogbm93YXdhcmUgKyBub3dhd2FyZSkKKworICAgICAgICAjIFN1YnRyYWN0aW5nIHNob3VsZCB5aWVsZCAwLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vdyAtIG5vdywgdGltZWRlbHRhKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vd2F3YXJlIC0gbm93YXdhcmUsIHRpbWVkZWx0YSgwKSkKKworICAgICAgICAjIEFkZGluZyBhIGRlbHRhIHNob3VsZCBwcmVzZXJ2ZSB0emluZm8uCisgICAgICAgIGRlbHRhID0gdGltZWRlbHRhKHdlZWtzPTEsIG1pbnV0ZXM9MTIsIG1pY3Jvc2Vjb25kcz01Njc4KQorICAgICAgICBub3dhd2FyZXBsdXMgPSBub3dhd2FyZSArIGRlbHRhCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3dhd2FyZS50emluZm8gaXMgdHo1NSkKKyAgICAgICAgbm93YXdhcmVwbHVzMiA9IGRlbHRhICsgbm93YXdhcmUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vd2F3YXJlcGx1czIudHppbmZvIGlzIHR6NTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm93YXdhcmVwbHVzLCBub3dhd2FyZXBsdXMyKQorCisgICAgICAgICMgdGhhdCAtIGRlbHRhIHNob3VsZCBiZSB3aGF0IHdlIHN0YXJ0ZWQgd2l0aCwgYW5kIHRoYXQgLSB3aGF0IHdlCisgICAgICAgICMgc3RhcnRlZCB3aXRoIHNob3VsZCBiZSBkZWx0YS4KKyAgICAgICAgZGlmZiA9IG5vd2F3YXJlcGx1cyAtIGRlbHRhCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWZmLnR6aW5mbyBpcyB0ejU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vd2F3YXJlLCBkaWZmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogZGVsdGEgLSBub3dhd2FyZXBsdXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm93YXdhcmVwbHVzIC0gbm93YXdhcmUsIGRlbHRhKQorCisgICAgICAgICMgTWFrZSB1cCBhIHJhbmRvbSB0aW1lem9uZS4KKyAgICAgICAgdHpyID0gRml4ZWRPZmZzZXQocmFuZG9tLnJhbmRyYW5nZSgtMTQzOSwgMTQ0MCksICJyYW5kb210aW1lem9uZSIpCisgICAgICAgICMgQXR0YWNoIGl0IHRvIG5vd2F3YXJlcGx1cy4KKyAgICAgICAgbm93YXdhcmVwbHVzID0gbm93YXdhcmVwbHVzLnJlcGxhY2UodHppbmZvPXR6cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vd2F3YXJlcGx1cy50emluZm8gaXMgdHpyKQorICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlmZmVyZW5jZSB0YWtlcyB0aGUgdGltZXpvbmUgYWRqdXN0bWVudHMgaW50byBhY2NvdW50LgorICAgICAgICBnb3QgPSBub3dhd2FyZSAtIG5vd2F3YXJlcGx1cworICAgICAgICAjIEV4cGVjdGVkOiAgKG5vd2F3YXJlIGJhc2UgLSBub3dhd2FyZSBvZmZzZXQpIC0KKyAgICAgICAgIyAgICAgICAgICAgIChub3dhd2FyZXBsdXMgYmFzZSAtIG5vd2F3YXJlcGx1cyBvZmZzZXQpID0KKyAgICAgICAgIyAgICAgICAgICAgIChub3dhd2FyZSBiYXNlIC0gbm93YXdhcmVwbHVzIGJhc2UpICsKKyAgICAgICAgIyAgICAgICAgICAgIChub3dhd2FyZXBsdXMgb2Zmc2V0IC0gbm93YXdhcmUgb2Zmc2V0KSA9CisgICAgICAgICMgICAgICAgICAgICAtZGVsdGEgKyBub3dhd2FyZXBsdXMgb2Zmc2V0IC0gbm93YXdhcmUgb2Zmc2V0CisgICAgICAgIGV4cGVjdGVkID0gbm93YXdhcmVwbHVzLnV0Y29mZnNldCgpIC0gbm93YXdhcmUudXRjb2Zmc2V0KCkgLSBkZWx0YQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgIyBUcnkgbWF4IHBvc3NpYmxlIGRpZmZlcmVuY2UuCisgICAgICAgIG1pbiA9IHNlbGYudGhlY2xhc3MoMSwgMSwgMSwgdHppbmZvPUZpeGVkT2Zmc2V0KDE0MzksICJtaW4iKSkKKyAgICAgICAgbWF4ID0gc2VsZi50aGVjbGFzcyhNQVhZRUFSLCAxMiwgMzEsIDIzLCA1OSwgNTksIDk5OTk5OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm89Rml4ZWRPZmZzZXQoLTE0MzksICJtYXgiKSkKKyAgICAgICAgbWF4ZGlmZiA9IG1heCAtIG1pbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heGRpZmYsIHNlbGYudGhlY2xhc3MubWF4IC0gc2VsZi50aGVjbGFzcy5taW4gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVkZWx0YShtaW51dGVzPTIqMTQzOSkpCisKKyAgICBkZWYgdGVzdF90emluZm9fbm93KHNlbGYpOgorICAgICAgICBtZXRoID0gc2VsZi50aGVjbGFzcy5ub3cKKyAgICAgICAgIyBFbnN1cmUgaXQgZG9lc24ndCByZXF1aXJlIHR6aW5mbyAoaS5lLiwgdGhhdCB0aGlzIGRvZXNuJ3QgYmxvdyB1cCkuCisgICAgICAgIGJhc2UgPSBtZXRoKCkKKyAgICAgICAgIyBUcnkgd2l0aCBhbmQgd2l0aG91dCBuYW1pbmcgdGhlIGtleXdvcmQuCisgICAgICAgIG9mZjQyID0gRml4ZWRPZmZzZXQoNDIsICI0MiIpCisgICAgICAgIGFub3RoZXIgPSBtZXRoKG9mZjQyKQorICAgICAgICBhZ2FpbiA9IG1ldGgodHo9b2ZmNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbm90aGVyLnR6aW5mbyBpcyBhZ2Fpbi50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW5vdGhlci51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9NDIpKQorICAgICAgICAjIEJhZCBhcmd1bWVudCB3aXRoIGFuZCB3L28gbmFtaW5nIHRoZSBrZXl3b3JkLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIDE2KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIHR6aW5mbz0xNikKKyAgICAgICAgIyBCYWQga2V5d29yZCBuYW1lLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIHRpbmZvPW9mZjQyKQorICAgICAgICAjIFRvbyBtYW55IGFyZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgb2ZmNDIsIG9mZjQyKQorCisgICAgICAgICMgV2UgZG9uJ3Qga25vdyB3aGljaCB0aW1lIHpvbmUgd2UncmUgaW4sIGFuZCBkb24ndCBoYXZlIGEgdHppbmZvCisgICAgICAgICMgY2xhc3MgdG8gcmVwcmVzZW50IGl0LCBzbyBzZWVpbmcgd2hldGhlciBhIHR6IGFyZ3VtZW50IGFjdHVhbGx5CisgICAgICAgICMgZG9lcyBhIGNvbnZlcnNpb24gaXMgdHJpY2t5LgorICAgICAgICB3ZWlyZHR6ID0gRml4ZWRPZmZzZXQodGltZWRlbHRhKGhvdXJzPTE1LCBtaW51dGVzPTU4KSwgIndlaXJkdHoiLCAwKQorICAgICAgICB1dGMgPSBGaXhlZE9mZnNldCgwLCAidXRjIiwgMCkKKyAgICAgICAgZm9yIGR1bW15IGluIHJhbmdlKDMpOgorICAgICAgICAgICAgbm93ID0gZGF0ZXRpbWUubm93KHdlaXJkdHopCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm93LnR6aW5mbyBpcyB3ZWlyZHR6KQorICAgICAgICAgICAgdXRjbm93ID0gZGF0ZXRpbWUudXRjbm93KCkucmVwbGFjZSh0emluZm89dXRjKQorICAgICAgICAgICAgbm93MiA9IHV0Y25vdy5hc3RpbWV6b25lKHdlaXJkdHopCisgICAgICAgICAgICBpZiBhYnMobm93IC0gbm93MikgPCB0aW1lZGVsdGEoc2Vjb25kcz0zMCk6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICMgRWxzZSB0aGUgY29kZSBpcyBicm9rZW4sIG9yIG1vcmUgdGhhbiAzMCBzZWNvbmRzIHBhc3NlZCBiZXR3ZWVuCisgICAgICAgICAgICAjIGNhbGxzOyBhc3N1bWluZyB0aGUgbGF0dGVyLCBqdXN0IHRyeSBhZ2Fpbi4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVGhyZWUgc3RyaWtlcyBhbmQgd2UncmUgb3V0LgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ1dGNub3coKSwgbm93KHR6KSwgb3IgYXN0aW1lem9uZSgpIG1heSBiZSBicm9rZW4iKQorCisgICAgZGVmIHRlc3RfdHppbmZvX2Zyb210aW1lc3RhbXAoc2VsZik6CisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIG1ldGggPSBzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAKKyAgICAgICAgdHMgPSB0aW1lLnRpbWUoKQorICAgICAgICAjIEVuc3VyZSBpdCBkb2Vzbid0IHJlcXVpcmUgdHppbmZvIChpLmUuLCB0aGF0IHRoaXMgZG9lc24ndCBibG93IHVwKS4KKyAgICAgICAgYmFzZSA9IG1ldGgodHMpCisgICAgICAgICMgVHJ5IHdpdGggYW5kIHdpdGhvdXQgbmFtaW5nIHRoZSBrZXl3b3JkLgorICAgICAgICBvZmY0MiA9IEZpeGVkT2Zmc2V0KDQyLCAiNDIiKQorICAgICAgICBhbm90aGVyID0gbWV0aCh0cywgb2ZmNDIpCisgICAgICAgIGFnYWluID0gbWV0aCh0cywgdHo9b2ZmNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbm90aGVyLnR6aW5mbyBpcyBhZ2Fpbi50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW5vdGhlci51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9NDIpKQorICAgICAgICAjIEJhZCBhcmd1bWVudCB3aXRoIGFuZCB3L28gbmFtaW5nIHRoZSBrZXl3b3JkLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIHRzLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZXRoLCB0cywgdHppbmZvPTE2KQorICAgICAgICAjIEJhZCBrZXl3b3JkIG5hbWUuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgdHMsIHRpbmZvPW9mZjQyKQorICAgICAgICAjIFRvbyBtYW55IGFyZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgdHMsIG9mZjQyLCBvZmY0MikKKyAgICAgICAgIyBUb28gZmV3IGFyZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCkKKworICAgICAgICAjIFRyeSB0byBtYWtlIHN1cmUgdHo9IGFjdHVhbGx5IGRvZXMgc29tZSBjb252ZXJzaW9uLgorICAgICAgICB0aW1lc3RhbXAgPSAxMDAwMDAwMDAwCisgICAgICAgIHV0Y2RhdGV0aW1lID0gZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcCh0aW1lc3RhbXApCisgICAgICAgICMgSW4gUE9TSVggKGVwb2NoIDE5NzApLCB0aGF0J3MgMjAwMS0wOS0wOSAwMTo0Njo0MCBVVEMsIGdpdmUgb3IgdGFrZS4KKyAgICAgICAgIyBCdXQgb24gc29tZSBmbGF2b3Igb2YgTWFjLCBpdCdzIG5vd2hlcmUgbmVhciB0aGF0LiAgU28gd2UgY2FuJ3QgaGF2ZQorICAgICAgICAjIGFueSBpZGVhIGhlcmUgd2hhdCB0aW1lIHRoYXQgYWN0dWFsbHkgaXMsIHdlIGNhbiBvbmx5IHRlc3QgdGhhdAorICAgICAgICAjIHJlbGF0aXZlIGNoYW5nZXMgbWF0Y2guCisgICAgICAgIHV0Y29mZnNldCA9IHRpbWVkZWx0YShob3Vycz0tMTUsIG1pbnV0ZXM9MzkpICMgYXJiaXRyYXJ5LCBidXQgbm90IHplcm8KKyAgICAgICAgdHogPSBGaXhlZE9mZnNldCh1dGNvZmZzZXQsICJ0eiIsIDApCisgICAgICAgIGV4cGVjdGVkID0gdXRjZGF0ZXRpbWUgKyB1dGNvZmZzZXQKKyAgICAgICAgZ290ID0gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcCh0aW1lc3RhbXAsIHR6KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QucmVwbGFjZSh0emluZm89Tm9uZSkpCisKKyAgICBkZWYgdGVzdF90emluZm9fdXRjbm93KHNlbGYpOgorICAgICAgICBtZXRoID0gc2VsZi50aGVjbGFzcy51dGNub3cKKyAgICAgICAgIyBFbnN1cmUgaXQgZG9lc24ndCByZXF1aXJlIHR6aW5mbyAoaS5lLiwgdGhhdCB0aGlzIGRvZXNuJ3QgYmxvdyB1cCkuCisgICAgICAgIGJhc2UgPSBtZXRoKCkKKyAgICAgICAgIyBUcnkgd2l0aCBhbmQgd2l0aG91dCBuYW1pbmcgdGhlIGtleXdvcmQ7IGZvciB3aGF0ZXZlciByZWFzb24sCisgICAgICAgICMgdXRjbm93KCkgZG9lc24ndCBhY2NlcHQgYSB0emluZm8gYXJndW1lbnQuCisgICAgICAgIG9mZjQyID0gRml4ZWRPZmZzZXQoNDIsICI0MiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgb2ZmNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgdHppbmZvPW9mZjQyKQorCisgICAgZGVmIHRlc3RfdHppbmZvX3V0Y2Zyb210aW1lc3RhbXAoc2VsZik6CisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIG1ldGggPSBzZWxmLnRoZWNsYXNzLnV0Y2Zyb210aW1lc3RhbXAKKyAgICAgICAgdHMgPSB0aW1lLnRpbWUoKQorICAgICAgICAjIEVuc3VyZSBpdCBkb2Vzbid0IHJlcXVpcmUgdHppbmZvIChpLmUuLCB0aGF0IHRoaXMgZG9lc24ndCBibG93IHVwKS4KKyAgICAgICAgYmFzZSA9IG1ldGgodHMpCisgICAgICAgICMgVHJ5IHdpdGggYW5kIHdpdGhvdXQgbmFtaW5nIHRoZSBrZXl3b3JkOyBmb3Igd2hhdGV2ZXIgcmVhc29uLAorICAgICAgICAjIHV0Y2Zyb210aW1lc3RhbXAoKSBkb2Vzbid0IGFjY2VwdCBhIHR6aW5mbyBhcmd1bWVudC4KKyAgICAgICAgb2ZmNDIgPSBGaXhlZE9mZnNldCg0MiwgIjQyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZXRoLCB0cywgb2ZmNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgdHMsIHR6aW5mbz1vZmY0MikKKworICAgIGRlZiB0ZXN0X3R6aW5mb190aW1ldHVwbGUoc2VsZik6CisgICAgICAgICMgVGVzdERhdGVUaW1lIHRlc3RlZCBtb3N0IG9mIHRoaXMuICBkYXRldGltZSBhZGRzIGEgdHdpc3QgdG8gdGhlCisgICAgICAgICMgRFNUIGZsYWcuCisgICAgICAgIGNsYXNzIERTVCh0emluZm8pOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRzdHZhbHVlKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRzdHZhbHVlLCBpbnQpOgorICAgICAgICAgICAgICAgICAgICBkc3R2YWx1ZSA9IHRpbWVkZWx0YShtaW51dGVzPWRzdHZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuZHN0dmFsdWUgPSBkc3R2YWx1ZQorICAgICAgICAgICAgZGVmIGRzdChzZWxmLCBkdCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZHN0dmFsdWUKKworICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCisgICAgICAgIGZvciBkc3R2YWx1ZSwgZmxhZyBpbiAoLTMzLCAxKSwgKDMzLCAxKSwgKDAsIDApLCAoTm9uZSwgLTEpOgorICAgICAgICAgICAgZCA9IGNscygxLCAxLCAxLCAxMCwgMjAsIDMwLCA0MCwgdHppbmZvPURTVChkc3R2YWx1ZSkpCisgICAgICAgICAgICB0ID0gZC50aW1ldHVwbGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB0LnRtX3llYXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHQudG1fbW9uKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB0LnRtX21kYXkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEwLCB0LnRtX2hvdXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIwLCB0LnRtX21pbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzAsIHQudG1fc2VjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0LnRtX3dkYXkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHQudG1feWRheSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhZywgdC50bV9pc2RzdCkKKworICAgICAgICAjIGRzdCgpIHJldHVybnMgd3JvbmcgdHlwZS4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbHMoMSwgMSwgMSwgdHppbmZvPURTVCgieCIpKS50aW1ldHVwbGUpCisKKyAgICAgICAgIyBkc3QoKSBhdCB0aGUgZWRnZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbHMoMSwxLDEsIHR6aW5mbz1EU1QoMTQzOSkpLnRpbWV0dXBsZSgpLnRtX2lzZHN0LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNscygxLDEsMSwgdHppbmZvPURTVCgtMTQzOSkpLnRpbWV0dXBsZSgpLnRtX2lzZHN0LCAxKQorCisgICAgICAgICMgZHN0KCkgb3V0IG9mIHJhbmdlLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjbHMoMSwxLDEsIHR6aW5mbz1EU1QoMTQ0MCkpLnRpbWV0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2xzKDEsMSwxLCB0emluZm89RFNUKC0xNDQwKSkudGltZXR1cGxlKQorCisgICAgZGVmIHRlc3RfdXRjdGltZXR1cGxlKHNlbGYpOgorICAgICAgICBjbGFzcyBEU1QodHppbmZvKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkc3R2YWx1ZSk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkc3R2YWx1ZSwgaW50KToKKyAgICAgICAgICAgICAgICAgICAgZHN0dmFsdWUgPSB0aW1lZGVsdGEobWludXRlcz1kc3R2YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmRzdHZhbHVlID0gZHN0dmFsdWUKKyAgICAgICAgICAgIGRlZiBkc3Qoc2VsZiwgZHQpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRzdHZhbHVlCisKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworICAgICAgICAjIFRoaXMgY2FuJ3Qgd29yazogIERTVCBkaWRuJ3QgaW1wbGVtZW50IHV0Y29mZnNldC4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzKDEsIDEsIDEsIHR6aW5mbz1EU1QoMCkpLnV0Y29mZnNldCkKKworICAgICAgICBjbGFzcyBVT0ZTKERTVCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdW9mcywgZG9mcz1Ob25lKToKKyAgICAgICAgICAgICAgICBEU1QuX19pbml0X18oc2VsZiwgZG9mcykKKyAgICAgICAgICAgICAgICBzZWxmLnVvZnMgPSB0aW1lZGVsdGEobWludXRlcz11b2ZzKQorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudW9mcworCisgICAgICAgICMgRW5zdXJlIHRtX2lzZHN0IGlzIDAgcmVnYXJkbGVzcyBvZiB3aGF0IGRzdCgpIHNheXM6ICBEU1QgaXMgbmV2ZXIKKyAgICAgICAgIyBpbiBlZmZlY3QgZm9yIGEgVVRDIHRpbWUuCisgICAgICAgIGZvciBkc3R2YWx1ZSBpbiAtMzMsIDMzLCAwLCBOb25lOgorICAgICAgICAgICAgZCA9IGNscygxLCAyLCAzLCAxMCwgMjAsIDMwLCA0MCwgdHppbmZvPVVPRlMoLTUzLCBkc3R2YWx1ZSkpCisgICAgICAgICAgICB0ID0gZC51dGN0aW1ldHVwbGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnllYXIsIHQudG1feWVhcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5tb250aCwgdC50bV9tb24pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZGF5LCB0LnRtX21kYXkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDExLCB0LnRtX2hvdXIpICMgMjBtbSArIDUzbW0gPSAxaG4gKyAxM21tCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEzLCB0LnRtX21pbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5zZWNvbmQsIHQudG1fc2VjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLndlZWtkYXkoKSwgdC50bV93ZGF5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnRvb3JkaW5hbCgpIC0gZGF0ZSgxLCAxLCAxKS50b29yZGluYWwoKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQudG1feWRheSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdC50bV9pc2RzdCkKKworICAgICAgICAjIEF0IHRoZSBlZGdlcywgVVRDIGFkanVzdG1lbnQgY2FuIG5vcm1hbGl6ZSBpbnRvIHllYXJzIG91dC1vZi1yYW5nZQorICAgICAgICAjIGZvciBhIGRhdGV0aW1lIG9iamVjdC4gIEVuc3VyZSB0aGF0IGEgY29ycmVjdCB0aW1ldHVwbGUgaXMKKyAgICAgICAgIyBjcmVhdGVkIGFueXdheS4KKyAgICAgICAgdGlueSA9IGNscyhNSU5ZRUFSLCAxLCAxLCAwLCAwLCAzNywgdHppbmZvPVVPRlMoMTQzOSkpCisgICAgICAgICMgVGhhdCBnb2VzIGJhY2sgMSBtaW51dGUgbGVzcyB0aGFuIGEgZnVsbCBkYXkuCisgICAgICAgIHQgPSB0aW55LnV0Y3RpbWV0dXBsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50bV95ZWFyLCBNSU5ZRUFSLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50bV9tb24sIDEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1fbWRheSwgMzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50bV9ob3VyLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1fbWluLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1fc2VjLCAzNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX3lkYXksIDM2NikgICAgIyAieWVhciAwIiBpcyBhIGxlYXAgeWVhcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1faXNkc3QsIDApCisKKyAgICAgICAgaHVnZSA9IGNscyhNQVhZRUFSLCAxMiwgMzEsIDIzLCA1OSwgMzcsIDk5OTk5OSwgdHppbmZvPVVPRlMoLTE0MzkpKQorICAgICAgICAjIFRoYXQgZ29lcyBmb3J3YXJkIDEgbWludXRlIGxlc3MgdGhhbiBhIGZ1bGwgZGF5LgorICAgICAgICB0ID0gaHVnZS51dGN0aW1ldHVwbGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1feWVhciwgTUFYWUVBUisxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1fbW9uLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1fbWRheSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX2hvdXIsIDIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1fbWluLCA1OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX3NlYywgMzcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50bV95ZGF5LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1faXNkc3QsIDApCisKKyAgICBkZWYgdGVzdF90emluZm9faXNvZm9ybWF0KHNlbGYpOgorICAgICAgICB6ZXJvID0gRml4ZWRPZmZzZXQoMCwgIiswMDowMCIpCisgICAgICAgIHBsdXMgPSBGaXhlZE9mZnNldCgyMjAsICIrMDM6NDAiKQorICAgICAgICBtaW51cyA9IEZpeGVkT2Zmc2V0KC0yMzEsICItMDM6NTEiKQorICAgICAgICB1bmtub3duID0gRml4ZWRPZmZzZXQoTm9uZSwgIiIpCisKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworICAgICAgICBkYXRlc3RyID0gJzAwMDEtMDItMDMnCisgICAgICAgIGZvciBvZnMgaW4gTm9uZSwgemVybywgcGx1cywgbWludXMsIHVua25vd246CisgICAgICAgICAgICBmb3IgdXMgaW4gMCwgOTg3MDAxOgorICAgICAgICAgICAgICAgIGQgPSBjbHMoMSwgMiwgMywgNCwgNSwgNTksIHVzLCB0emluZm89b2ZzKQorICAgICAgICAgICAgICAgIHRpbWVzdHIgPSAnMDQ6MDU6NTknICsgKHVzIGFuZCAnLjk4NzAwMScgb3IgJycpCisgICAgICAgICAgICAgICAgb2Zzc3RyID0gb2ZzIGlzIG5vdCBOb25lIGFuZCBkLnR6bmFtZSgpIG9yICcnCisgICAgICAgICAgICAgICAgdGFpbHN0ciA9IHRpbWVzdHIgKyBvZnNzdHIKKyAgICAgICAgICAgICAgICBpc28gPSBkLmlzb2Zvcm1hdCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc28sIGRhdGVzdHIgKyAnVCcgKyB0YWlsc3RyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNvLCBkLmlzb2Zvcm1hdCgnVCcpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pc29mb3JtYXQoJ2snKSwgZGF0ZXN0ciArICdrJyArIHRhaWxzdHIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZCksIGRhdGVzdHIgKyAnICcgKyB0YWlsc3RyKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworICAgICAgICB6MTAwID0gRml4ZWRPZmZzZXQoMTAwLCAiKzEwMCIpCisgICAgICAgIHptMjAwID0gRml4ZWRPZmZzZXQodGltZWRlbHRhKG1pbnV0ZXM9LTIwMCksICItMjAwIikKKyAgICAgICAgYXJncyA9IFsxLCAyLCAzLCA0LCA1LCA2LCA3LCB6MTAwXQorICAgICAgICBiYXNlID0gY2xzKCphcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2UsIGJhc2UucmVwbGFjZSgpKQorCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBuYW1lLCBuZXd2YWwgaW4gKCgieWVhciIsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm1vbnRoIiwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZGF5IiwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaG91ciIsIDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm1pbnV0ZSIsIDYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInNlY29uZCIsIDcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm1pY3Jvc2Vjb25kIiwgOCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgidHppbmZvIiwgem0yMDApKToKKyAgICAgICAgICAgIG5ld2FyZ3MgPSBhcmdzWzpdCisgICAgICAgICAgICBuZXdhcmdzW2ldID0gbmV3dmFsCisgICAgICAgICAgICBleHBlY3RlZCA9IGNscygqbmV3YXJncykKKyAgICAgICAgICAgIGdvdCA9IGJhc2UucmVwbGFjZSgqKntuYW1lOiBuZXd2YWx9KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorICAgICAgICAgICAgaSArPSAxCisKKyAgICAgICAgIyBFbnN1cmUgd2UgY2FuIGdldCByaWQgb2YgYSB0emluZm8uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS50em5hbWUoKSwgIisxMDAiKQorICAgICAgICBiYXNlMiA9IGJhc2UucmVwbGFjZSh0emluZm89Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJhc2UyLnR6aW5mbyBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFzZTIudHpuYW1lKCkgaXMgTm9uZSkKKworICAgICAgICAjIEVuc3VyZSB3ZSBjYW4gYWRkIG9uZS4KKyAgICAgICAgYmFzZTMgPSBiYXNlMi5yZXBsYWNlKHR6aW5mbz16MTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2UsIGJhc2UzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFzZS50emluZm8gaXMgYmFzZTMudHppbmZvKQorCisgICAgICAgICMgT3V0IG9mIGJvdW5kcy4KKyAgICAgICAgYmFzZSA9IGNscygyMDAwLCAyLCAyOSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYmFzZS5yZXBsYWNlLCB5ZWFyPTIwMDEpCisKKyAgICBkZWYgdGVzdF9tb3JlX2FzdGltZXpvbmUoc2VsZik6CisgICAgICAgICMgVGhlIGluaGVyaXRlZCB0ZXN0X2FzdGltZXpvbmUgY292ZXJlZCBzb21lIHRyaXZpYWwgYW5kIGVycm9yIGNhc2VzLgorICAgICAgICBmbm9uZSA9IEZpeGVkT2Zmc2V0KE5vbmUsICJOb25lIikKKyAgICAgICAgZjQ0bSA9IEZpeGVkT2Zmc2V0KDQ0LCAiNDQiKQorICAgICAgICBmbTVoID0gRml4ZWRPZmZzZXQoLXRpbWVkZWx0YShob3Vycz01KSwgIm0zMDAiKQorCisgICAgICAgIGR0ID0gc2VsZi50aGVjbGFzcy5ub3codHo9ZjQ0bSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGR0LnR6aW5mbyBpcyBmNDRtKQorICAgICAgICAjIFJlcGxhY2luZyB3aXRoIGRlZ2VuZXJhdGUgdHppbmZvIHJhaXNlcyBhbiBleGNlcHRpb24uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGR0LmFzdGltZXpvbmUsIGZub25lKQorICAgICAgICAjIERpdHRvIHdpdGggTm9uZSB0ei4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkdC5hc3RpbWV6b25lLCBOb25lKQorICAgICAgICAjIFJlcGxhY2luZyB3aXRoIHNhbWUgdHppbmZvIG1ha2VzIG5vIGNoYW5nZS4KKyAgICAgICAgeCA9IGR0LmFzdGltZXpvbmUoZHQudHppbmZvKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC50emluZm8gaXMgZjQ0bSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmRhdGUoKSwgZHQuZGF0ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgudGltZSgpLCBkdC50aW1lKCkpCisKKyAgICAgICAgIyBSZXBsYWNpbmcgd2l0aCBkaWZmZXJlbnQgdHppbmZvIGRvZXMgYWRqdXN0LgorICAgICAgICBnb3QgPSBkdC5hc3RpbWV6b25lKGZtNWgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnb3QudHppbmZvIGlzIGZtNWgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LnV0Y29mZnNldCgpLCB0aW1lZGVsdGEoaG91cnM9LTUpKQorICAgICAgICBleHBlY3RlZCA9IGR0IC0gZHQudXRjb2Zmc2V0KCkgICMgaW4gZWZmZWN0LCBjb252ZXJ0IHRvIFVUQworICAgICAgICBleHBlY3RlZCArPSBmbTVoLnV0Y29mZnNldChkdCkgICMgYW5kIGZyb20gdGhlcmUgdG8gbG9jYWwgdGltZQorICAgICAgICBleHBlY3RlZCA9IGV4cGVjdGVkLnJlcGxhY2UodHppbmZvPWZtNWgpICMgYW5kIGF0dGFjaCBuZXcgdHppbmZvCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LmRhdGUoKSwgZXhwZWN0ZWQuZGF0ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdC50aW1lKCksIGV4cGVjdGVkLnRpbWUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QudGltZXR6KCksIGV4cGVjdGVkLnRpbWV0eigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ290LnR6aW5mbyBpcyBleHBlY3RlZC50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2F3YXJlX3N1YnRyYWN0KHNlbGYpOgorICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCisKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB1dGNvZmZzZXQoKSBpcyBpZ25vcmVkIHdoZW4gdGhlIG9wZXJhbmRzIGhhdmUgdGhlCisgICAgICAgICMgc2FtZSB0emluZm8gbWVtYmVyLgorICAgICAgICBjbGFzcyBPcGVyYW5kRGVwZW5kZW50T2Zmc2V0KHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIHQpOgorICAgICAgICAgICAgICAgIGlmIHQubWludXRlIDwgMTA6CisgICAgICAgICAgICAgICAgICAgICMgZDAgYW5kIGQxIGVxdWFsIGFmdGVyIGFkanVzdG1lbnQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVkZWx0YShtaW51dGVzPXQubWludXRlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgZDIgb2ZmIGluIHRoZSB3ZWVkcworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhKG1pbnV0ZXM9NTkpCisKKyAgICAgICAgYmFzZSA9IGNscyg4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIHR6aW5mbz1PcGVyYW5kRGVwZW5kZW50T2Zmc2V0KCkpCisgICAgICAgIGQwID0gYmFzZS5yZXBsYWNlKG1pbnV0ZT0zKQorICAgICAgICBkMSA9IGJhc2UucmVwbGFjZShtaW51dGU9OSkKKyAgICAgICAgZDIgPSBiYXNlLnJlcGxhY2UobWludXRlPTExKQorICAgICAgICBmb3IgeCBpbiBkMCwgZDEsIGQyOgorICAgICAgICAgICAgZm9yIHkgaW4gZDAsIGQxLCBkMjoKKyAgICAgICAgICAgICAgICBnb3QgPSB4IC0geQorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGltZWRlbHRhKG1pbnV0ZXM9eC5taW51dGUgLSB5Lm1pbnV0ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgIyBPVE9ILCBpZiB0aGUgdHppbmZvIG1lbWJlcnMgYXJlIGRpc3RpbmN0LCB1dGNvZmZzZXRzIGFyZW4ndAorICAgICAgICAjIGlnbm9yZWQuCisgICAgICAgIGJhc2UgPSBjbHMoOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0KQorICAgICAgICBkMCA9IGJhc2UucmVwbGFjZShtaW51dGU9MywgdHppbmZvPU9wZXJhbmREZXBlbmRlbnRPZmZzZXQoKSkKKyAgICAgICAgZDEgPSBiYXNlLnJlcGxhY2UobWludXRlPTksIHR6aW5mbz1PcGVyYW5kRGVwZW5kZW50T2Zmc2V0KCkpCisgICAgICAgIGQyID0gYmFzZS5yZXBsYWNlKG1pbnV0ZT0xMSwgdHppbmZvPU9wZXJhbmREZXBlbmRlbnRPZmZzZXQoKSkKKyAgICAgICAgZm9yIHggaW4gZDAsIGQxLCBkMjoKKyAgICAgICAgICAgIGZvciB5IGluIGQwLCBkMSwgZDI6CisgICAgICAgICAgICAgICAgZ290ID0geCAtIHkKKyAgICAgICAgICAgICAgICBpZiAoeCBpcyBkMCBvciB4IGlzIGQxKSBhbmQgKHkgaXMgZDAgb3IgeSBpcyBkMSk6CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGltZWRlbHRhKDApCisgICAgICAgICAgICAgICAgZWxpZiB4IGlzIHkgaXMgZDI6CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdGltZWRlbHRhKDApCisgICAgICAgICAgICAgICAgZWxpZiB4IGlzIGQyOgorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHRpbWVkZWx0YShtaW51dGVzPSgxMS01OSktMCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgeSBpcyBkMgorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHRpbWVkZWx0YShtaW51dGVzPTAtKDExLTU5KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9taXhlZF9jb21wYXJlKHNlbGYpOgorICAgICAgICB0MSA9IGRhdGV0aW1lKDEsIDIsIDMsIDQsIDUsIDYsIDcpCisgICAgICAgIHQyID0gZGF0ZXRpbWUoMSwgMiwgMywgNCwgNSwgNiwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisgICAgICAgIHQyID0gdDIucmVwbGFjZSh0emluZm89Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisgICAgICAgIHQyID0gdDIucmVwbGFjZSh0emluZm89Rml4ZWRPZmZzZXQoTm9uZSwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLCB0MikKKyAgICAgICAgdDIgPSB0Mi5yZXBsYWNlKHR6aW5mbz1GaXhlZE9mZnNldCgwLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB0MSA9PSB0MikKKworICAgICAgICAjIEluIGRhdGV0aW1lIHcvIGlkZW50aWNhbCB0emluZm8gb2JqZWN0cywgdXRjb2Zmc2V0IGlzIGlnbm9yZWQuCisgICAgICAgIGNsYXNzIFZhcmllcyh0emluZm8pOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ID0gdGltZWRlbHRhKG1pbnV0ZXM9MjIpCisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIHQpOgorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IHRpbWVkZWx0YShtaW51dGVzPTEpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYub2Zmc2V0CisKKyAgICAgICAgdiA9IFZhcmllcygpCisgICAgICAgIHQxID0gdDIucmVwbGFjZSh0emluZm89dikKKyAgICAgICAgdDIgPSB0Mi5yZXBsYWNlKHR6aW5mbz12KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz0yMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPTI0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisKKyAgICAgICAgIyBCdXQgaWYgdGhleSdyZSBub3QgaWRlbnRpY2FsLCBpdCBpc24ndCBpZ25vcmVkLgorICAgICAgICB0MiA9IHQyLnJlcGxhY2UodHppbmZvPVZhcmllcygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikgICMgdDEncyBvZmZzZXQgY291bnRlciBzdGlsbCBnb2luZyB1cAorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfZGF0ZXRpbWV0eihzZWxmKToKKworICAgICAgICBjbGFzcyBDKHNlbGYudGhlY2xhc3MpOgorICAgICAgICAgICAgdGhlQW5zd2VyID0gNDIKKworICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCAqYXJncywgKiprd3MpOgorICAgICAgICAgICAgICAgIHRlbXAgPSBrd3MuY29weSgpCisgICAgICAgICAgICAgICAgZXh0cmEgPSB0ZW1wLnBvcCgnZXh0cmEnKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYudGhlY2xhc3MuX19uZXdfXyhjbHMsICphcmdzLCAqKnRlbXApCisgICAgICAgICAgICAgICAgcmVzdWx0LmV4dHJhID0gZXh0cmEKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgICAgIGRlZiBuZXdtZXRoKHNlbGYsIHN0YXJ0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBzZWxmLmhvdXIgKyBzZWxmLnllYXIKKworICAgICAgICBhcmdzID0gMjAwMiwgMTIsIDMxLCA0LCA1LCA2LCA1MDAsIEZpeGVkT2Zmc2V0KC0zMDAsICJFU1QiLCAxKQorCisgICAgICAgIGR0MSA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCisgICAgICAgIGR0MiA9IEMoKmFyZ3MsICoqeydleHRyYSc6IDd9KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLl9fY2xhc3NfXywgQykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIudGhlQW5zd2VyLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIuZXh0cmEsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQxLnV0Y29mZnNldCgpLCBkdDIudXRjb2Zmc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLm5ld21ldGgoLTcpLCBkdDEuaG91ciArIGR0MS55ZWFyIC0gNykKKworIyBQYWluIHRvIHNldCB1cCBEU1QtYXdhcmUgdHppbmZvIGNsYXNzZXMuCisKK2RlZiBmaXJzdF9zdW5kYXlfb25fb3JfYWZ0ZXIoZHQpOgorICAgIGRheXNfdG9fZ28gPSA2IC0gZHQud2Vla2RheSgpCisgICAgaWYgZGF5c190b19nbzoKKyAgICAgICAgZHQgKz0gdGltZWRlbHRhKGRheXNfdG9fZ28pCisgICAgcmV0dXJuIGR0CisKK1pFUk8gPSB0aW1lZGVsdGEoMCkKK0hPVVIgPSB0aW1lZGVsdGEoaG91cnM9MSkKK0RBWSA9IHRpbWVkZWx0YShkYXlzPTEpCisjIEluIHRoZSBVUywgRFNUIHN0YXJ0cyBhdCAyYW0gKHN0YW5kYXJkIHRpbWUpIG9uIHRoZSBmaXJzdCBTdW5kYXkgaW4gQXByaWwuCitEU1RTVEFSVCA9IGRhdGV0aW1lKDEsIDQsIDEsIDIpCisjIGFuZCBlbmRzIGF0IDJhbSAoRFNUIHRpbWU7IDFhbSBzdGFuZGFyZCB0aW1lKSBvbiB0aGUgbGFzdCBTdW5kYXkgb2YgT2N0LAorIyB3aGljaCBpcyB0aGUgZmlyc3QgU3VuZGF5IG9uIG9yIGFmdGVyIE9jdCAyNS4gIEJlY2F1c2Ugd2UgdmlldyAxOk1NIGFzCisjIGJlaW5nIHN0YW5kYXJkIHRpbWUgb24gdGhhdCBkYXksIHRoZXJlIGlzIG5vIHNwZWxsaW5nIGluIGxvY2FsIHRpbWUgb2YKKyMgdGhlIGxhc3QgaG91ciBvZiBEU1QgKHRoYXQncyAxOk1NIERTVCwgYnV0IDE6TU0gaXMgdGFrZW4gYXMgc3RhbmRhcmQgdGltZSkuCitEU1RFTkQgPSBkYXRldGltZSgxLCAxMCwgMjUsIDEpCisKK2NsYXNzIFVTVGltZVpvbmUodHppbmZvKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3VycywgcmVwcm5hbWUsIHN0ZG5hbWUsIGRzdG5hbWUpOgorICAgICAgICBzZWxmLnN0ZG9mZnNldCA9IHRpbWVkZWx0YShob3Vycz1ob3VycykKKyAgICAgICAgc2VsZi5yZXBybmFtZSA9IHJlcHJuYW1lCisgICAgICAgIHNlbGYuc3RkbmFtZSA9IHN0ZG5hbWUKKyAgICAgICAgc2VsZi5kc3RuYW1lID0gZHN0bmFtZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXBybmFtZQorCisgICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6CisgICAgICAgIGlmIHNlbGYuZHN0KGR0KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRzdG5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnN0ZG5hbWUKKworICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOgorICAgICAgICByZXR1cm4gc2VsZi5zdGRvZmZzZXQgKyBzZWxmLmRzdChkdCkKKworICAgIGRlZiBkc3Qoc2VsZiwgZHQpOgorICAgICAgICBpZiBkdCBpcyBOb25lIG9yIGR0LnR6aW5mbyBpcyBOb25lOgorICAgICAgICAgICAgIyBBbiBleGNlcHRpb24gaW5zdGVhZCBtYXkgYmUgc2Vuc2libGUgaGVyZSwgaW4gb25lIG9yIG1vcmUgb2YKKyAgICAgICAgICAgICMgdGhlIGNhc2VzLgorICAgICAgICAgICAgcmV0dXJuIFpFUk8KKyAgICAgICAgYXNzZXJ0IGR0LnR6aW5mbyBpcyBzZWxmCisKKyAgICAgICAgIyBGaW5kIGZpcnN0IFN1bmRheSBpbiBBcHJpbC4KKyAgICAgICAgc3RhcnQgPSBmaXJzdF9zdW5kYXlfb25fb3JfYWZ0ZXIoRFNUU1RBUlQucmVwbGFjZSh5ZWFyPWR0LnllYXIpKQorICAgICAgICBhc3NlcnQgc3RhcnQud2Vla2RheSgpID09IDYgYW5kIHN0YXJ0Lm1vbnRoID09IDQgYW5kIHN0YXJ0LmRheSA8PSA3CisKKyAgICAgICAgIyBGaW5kIGxhc3QgU3VuZGF5IGluIE9jdG9iZXIuCisgICAgICAgIGVuZCA9IGZpcnN0X3N1bmRheV9vbl9vcl9hZnRlcihEU1RFTkQucmVwbGFjZSh5ZWFyPWR0LnllYXIpKQorICAgICAgICBhc3NlcnQgZW5kLndlZWtkYXkoKSA9PSA2IGFuZCBlbmQubW9udGggPT0gMTAgYW5kIGVuZC5kYXkgPj0gMjUKKworICAgICAgICAjIENhbid0IGNvbXBhcmUgbmFpdmUgdG8gYXdhcmUgb2JqZWN0cywgc28gc3RyaXAgdGhlIHRpbWV6b25lIGZyb20KKyAgICAgICAgIyBkdCBmaXJzdC4KKyAgICAgICAgaWYgc3RhcnQgPD0gZHQucmVwbGFjZSh0emluZm89Tm9uZSkgPCBlbmQ6CisgICAgICAgICAgICByZXR1cm4gSE9VUgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFpFUk8KKworRWFzdGVybiAgPSBVU1RpbWVab25lKC01LCAiRWFzdGVybiIsICAiRVNUIiwgIkVEVCIpCitDZW50cmFsICA9IFVTVGltZVpvbmUoLTYsICJDZW50cmFsIiwgICJDU1QiLCAiQ0RUIikKK01vdW50YWluID0gVVNUaW1lWm9uZSgtNywgIk1vdW50YWluIiwgIk1TVCIsICJNRFQiKQorUGFjaWZpYyAgPSBVU1RpbWVab25lKC04LCAiUGFjaWZpYyIsICAiUFNUIiwgIlBEVCIpCit1dGNfcmVhbCA9IEZpeGVkT2Zmc2V0KDAsICJVVEMiLCAwKQorIyBGb3IgYmV0dGVyIHRlc3QgY292ZXJhZ2UsIHdlIHdhbnQgYW5vdGhlciBmbGF2b3Igb2YgVVRDIHRoYXQncyB3ZXN0IG9mCisjIHRoZSBFYXN0ZXJuIGFuZCBQYWNpZmljIHRpbWV6b25lcy4KK3V0Y19mYWtlID0gRml4ZWRPZmZzZXQoLTEyKjYwLCAiVVRDZmFrZSIsIDApCisKK2NsYXNzIFRlc3RUaW1lem9uZUNvbnZlcnNpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoZSBEU1Qgc3dpdGNoIHRpbWVzIGZvciAyMDAyLCBpbiBzdGQgdGltZS4KKyAgICBkc3RvbiA9IGRhdGV0aW1lKDIwMDIsIDQsIDcsIDIpCisgICAgZHN0b2ZmID0gZGF0ZXRpbWUoMjAwMiwgMTAsIDI3LCAxKQorCisgICAgdGhlY2xhc3MgPSBkYXRldGltZQorCisgICAgIyBDaGVjayBhIHRpbWUgdGhhdCdzIGluc2lkZSBEU1QuCisgICAgZGVmIGNoZWNraW5zaWRlKHNlbGYsIGR0LCB0eiwgdXRjLCBkc3RvbiwgZHN0b2ZmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5kc3QoKSwgSE9VUikKKworICAgICAgICAjIENvbnZlcnNpb24gdG8gb3VyIG93biB0aW1lem9uZSBpcyBhbHdheXMgYW4gaWRlbnRpdHkuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuYXN0aW1lem9uZSh0eiksIGR0KQorCisgICAgICAgIGFzdXRjID0gZHQuYXN0aW1lem9uZSh1dGMpCisgICAgICAgIHRoZXJlX2FuZF9iYWNrID0gYXN1dGMuYXN0aW1lem9uZSh0eikKKworICAgICAgICAjIENvbnZlcnNpb24gdG8gVVRDIGFuZCBiYWNrIGlzbid0IGFsd2F5cyBhbiBpZGVudGl0eSBoZXJlLAorICAgICAgICAjIGJlY2F1c2UgdGhlcmUgYXJlIHJlZHVuZGFudCBzcGVsbGluZ3MgKGluIGxvY2FsIHRpbWUpIG9mCisgICAgICAgICMgVVRDIHRpbWUgd2hlbiBEU1QgYmVnaW5zOiAgdGhlIGNsb2NrIGp1bXBzIGZyb20gMTo1OTo1OQorICAgICAgICAjIHRvIDM6MDA6MDAsIGFuZCBhIGxvY2FsIHRpbWUgb2YgMjpNTTpTUyBkb2Vzbid0IHJlYWxseQorICAgICAgICAjIG1ha2Ugc2Vuc2UgdGhlbi4gIFRoZSBjbGFzc2VzIGFib3ZlIHRyZWF0IDI6TU06U1MgYXMKKyAgICAgICAgIyBkYXlsaWdodCB0aW1lIHRoZW4gKGl0J3MgImFmdGVyIDJhbSIpLCByZWFsbHkgYW4gYWxpYXMKKyAgICAgICAgIyBmb3IgMTpNTTpTUyBzdGFuZGFyZCB0aW1lLiAgVGhlIGxhdHRlciBmb3JtIGlzIHdoYXQKKyAgICAgICAgIyBjb252ZXJzaW9uIGJhY2sgZnJvbSBVVEMgcHJvZHVjZXMuCisgICAgICAgIGlmIGR0LmRhdGUoKSA9PSBkc3Rvbi5kYXRlKCkgYW5kIGR0LmhvdXIgPT0gMjoKKyAgICAgICAgICAgICMgV2UncmUgaW4gdGhlIHJlZHVuZGFudCBob3VyLCBhbmQgY29taW5nIGJhY2sgZnJvbQorICAgICAgICAgICAgIyBVVEMgZ2l2ZXMgdGhlIDE6TU06U1Mgc3RhbmRhcmQtdGltZSBzcGVsbGluZy4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhlcmVfYW5kX2JhY2sgKyBIT1VSLCBkdCkKKyAgICAgICAgICAgICMgQWx0aG91Z2ggZHVyaW5nIHdhcyBjb25zaWRlcmVkIHRvIGJlIGluIGRheWxpZ2h0CisgICAgICAgICAgICAjIHRpbWUsIHRoZXJlX2FuZF9iYWNrIGlzIG5vdC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhlcmVfYW5kX2JhY2suZHN0KCksIFpFUk8pCisgICAgICAgICAgICAjIFRoZXkncmUgdGhlIHNhbWUgdGltZXMgaW4gVVRDLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aGVyZV9hbmRfYmFjay5hc3RpbWV6b25lKHV0YyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0LmFzdGltZXpvbmUodXRjKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgV2UncmUgbm90IGluIHRoZSByZWR1bmRhbnQgaG91ci4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQsIHRoZXJlX2FuZF9iYWNrKQorCisgICAgICAgICMgQmVjYXVzZSB3ZSBoYXZlIGEgcmVkdW5kYW50IHNwZWxsaW5nIHdoZW4gRFNUIGJlZ2lucywgdGhlcmUgaXMKKyAgICAgICAgIyAodW5mb3J0dW5hdGVseSkgYW4gaG91ciB3aGVuIERTVCBlbmRzIHRoYXQgY2FuJ3QgYmUgc3BlbGxlZCBhdCBhbGwgaW4KKyAgICAgICAgIyBsb2NhbCB0aW1lLiAgV2hlbiBEU1QgZW5kcywgdGhlIGNsb2NrIGp1bXBzIGZyb20gMTo1OSBiYWNrIHRvIDE6MDAKKyAgICAgICAgIyBhZ2Fpbi4gIFRoZSBob3VyIDE6TU0gRFNUIGhhcyBubyBzcGVsbGluZyB0aGVuOiAgMTpNTSBpcyB0YWtlbiB0byBiZQorICAgICAgICAjIHN0YW5kYXJkIHRpbWUuICAxOk1NIERTVCA9PSAwOk1NIEVTVCwgYnV0IDA6TU0gaXMgdGFrZW4gdG8gYmUKKyAgICAgICAgIyBkYXlsaWdodCB0aW1lLiAgVGhlIGhvdXIgMTpNTSBkYXlsaWdodCA9PSAwOk1NIHN0YW5kYXJkIGNhbid0IGJlCisgICAgICAgICMgZXhwcmVzc2VkIGluIGxvY2FsIHRpbWUuICBOZXZlcnRoZWxlc3MsIHdlIHdhbnQgY29udmVyc2lvbiBiYWNrCisgICAgICAgICMgZnJvbSBVVEMgdG8gbWltaWMgdGhlIGxvY2FsIGNsb2NrJ3MgInJlcGVhdCBhbiBob3VyIiBiZWhhdmlvci4KKyAgICAgICAgbmV4dGhvdXJfdXRjID0gYXN1dGMgKyBIT1VSCisgICAgICAgIG5leHRob3VyX3R6ID0gbmV4dGhvdXJfdXRjLmFzdGltZXpvbmUodHopCisgICAgICAgIGlmIGR0LmRhdGUoKSA9PSBkc3RvZmYuZGF0ZSgpIGFuZCBkdC5ob3VyID09IDA6CisgICAgICAgICAgICAjIFdlJ3JlIGluIHRoZSBob3VyIGJlZm9yZSB0aGUgbGFzdCBEU1QgaG91ci4gIFRoZSBsYXN0IERTVCBob3VyCisgICAgICAgICAgICAjIGlzIGluZWZmYWJsZS4gIFdlIHdhbnQgdGhlIGNvbnZlcnNpb24gYmFjayB0byByZXBlYXQgMTpNTS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dGhvdXJfdHosIGR0LnJlcGxhY2UoaG91cj0xKSkKKyAgICAgICAgICAgIG5leHRob3VyX3V0YyArPSBIT1VSCisgICAgICAgICAgICBuZXh0aG91cl90eiA9IG5leHRob3VyX3V0Yy5hc3RpbWV6b25lKHR6KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0aG91cl90eiwgZHQucmVwbGFjZShob3VyPTEpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0aG91cl90eiAtIGR0LCBIT1VSKQorCisgICAgIyBDaGVjayBhIHRpbWUgdGhhdCdzIG91dHNpZGUgRFNULgorICAgIGRlZiBjaGVja291dHNpZGUoc2VsZiwgZHQsIHR6LCB1dGMpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LmRzdCgpLCBaRVJPKQorCisgICAgICAgICMgQ29udmVyc2lvbiB0byBvdXIgb3duIHRpbWV6b25lIGlzIGFsd2F5cyBhbiBpZGVudGl0eS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5hc3RpbWV6b25lKHR6KSwgZHQpCisKKyAgICAgICAgIyBDb252ZXJ0aW5nIHRvIFVUQyBhbmQgYmFjayBpcyBhbiBpZGVudGl0eSB0b28uCisgICAgICAgIGFzdXRjID0gZHQuYXN0aW1lem9uZSh1dGMpCisgICAgICAgIHRoZXJlX2FuZF9iYWNrID0gYXN1dGMuYXN0aW1lem9uZSh0eikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgdGhlcmVfYW5kX2JhY2spCisKKyAgICBkZWYgY29udmVydF9iZXR3ZWVuX3R6X2FuZF91dGMoc2VsZiwgdHosIHV0Yyk6CisgICAgICAgIGRzdG9uID0gc2VsZi5kc3Rvbi5yZXBsYWNlKHR6aW5mbz10eikKKyAgICAgICAgIyBCZWNhdXNlIDE6TU0gb24gdGhlIGRheSBEU1QgZW5kcyBpcyB0YWtlbiBhcyBiZWluZyBzdGFuZGFyZCB0aW1lLAorICAgICAgICAjIHRoZXJlIGlzIG5vIHNwZWxsaW5nIGluIHR6IGZvciB0aGUgbGFzdCBob3VyIG9mIGRheWxpZ2h0IHRpbWUuCisgICAgICAgICMgRm9yIHB1cnBvc2VzIG9mIHRoZSB0ZXN0LCB0aGUgbGFzdCBob3VyIG9mIERTVCBpcyAwOk1NLCB3aGljaCBpcworICAgICAgICAjIHRha2VuIGFzIGJlaW5nIGRheWxpZ2h0IHRpbWUgKGFuZCAxOk1NIGlzIHRha2VuIGFzIGJlaW5nIHN0YW5kYXJkCisgICAgICAgICMgdGltZSkuCisgICAgICAgIGRzdG9mZiA9IHNlbGYuZHN0b2ZmLnJlcGxhY2UodHppbmZvPXR6KQorICAgICAgICBmb3IgZGVsdGEgaW4gKHRpbWVkZWx0YSh3ZWVrcz0xMyksCisgICAgICAgICAgICAgICAgICAgICAgREFZLAorICAgICAgICAgICAgICAgICAgICAgIEhPVVIsCisgICAgICAgICAgICAgICAgICAgICAgdGltZWRlbHRhKG1pbnV0ZXM9MSksCisgICAgICAgICAgICAgICAgICAgICAgdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKSk6CisKKyAgICAgICAgICAgIHNlbGYuY2hlY2tpbnNpZGUoZHN0b24sIHR6LCB1dGMsIGRzdG9uLCBkc3RvZmYpCisgICAgICAgICAgICBmb3IgZHVyaW5nIGluIGRzdG9uICsgZGVsdGEsIGRzdG9mZiAtIGRlbHRhOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tpbnNpZGUoZHVyaW5nLCB0eiwgdXRjLCBkc3RvbiwgZHN0b2ZmKQorCisgICAgICAgICAgICBzZWxmLmNoZWNrb3V0c2lkZShkc3RvZmYsIHR6LCB1dGMpCisgICAgICAgICAgICBmb3Igb3V0c2lkZSBpbiBkc3RvbiAtIGRlbHRhLCBkc3RvZmYgKyBkZWx0YToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrb3V0c2lkZShvdXRzaWRlLCB0eiwgdXRjKQorCisgICAgZGVmIHRlc3RfZWFzeShzZWxmKToKKyAgICAgICAgIyBEZXNwaXRlIHRoZSBuYW1lIG9mIHRoaXMgdGVzdCwgdGhlIGVuZGNhc2VzIGFyZSBleGNydWNpYXRpbmcuCisgICAgICAgIHNlbGYuY29udmVydF9iZXR3ZWVuX3R6X2FuZF91dGMoRWFzdGVybiwgdXRjX3JlYWwpCisgICAgICAgIHNlbGYuY29udmVydF9iZXR3ZWVuX3R6X2FuZF91dGMoUGFjaWZpYywgdXRjX3JlYWwpCisgICAgICAgIHNlbGYuY29udmVydF9iZXR3ZWVuX3R6X2FuZF91dGMoRWFzdGVybiwgdXRjX2Zha2UpCisgICAgICAgIHNlbGYuY29udmVydF9iZXR3ZWVuX3R6X2FuZF91dGMoUGFjaWZpYywgdXRjX2Zha2UpCisgICAgICAgICMgVGhlIG5leHQgaXMgcmVhbGx5IGRhbmNpbmcgbmVhciB0aGUgZWRnZS4gIEl0IHdvcmtzIGJlY2F1c2UKKyAgICAgICAgIyBQYWNpZmljIGFuZCBFYXN0ZXJuIGFyZSBmYXIgZW5vdWdoIGFwYXJ0IHRoYXQgdGhlaXIgInByb2JsZW0KKyAgICAgICAgIyBob3VycyIgZG9uJ3Qgb3ZlcmxhcC4KKyAgICAgICAgc2VsZi5jb252ZXJ0X2JldHdlZW5fdHpfYW5kX3V0YyhFYXN0ZXJuLCBQYWNpZmljKQorICAgICAgICBzZWxmLmNvbnZlcnRfYmV0d2Vlbl90el9hbmRfdXRjKFBhY2lmaWMsIEVhc3Rlcm4pCisgICAgICAgICMgT1RPSCwgdGhlc2UgZmFpbCEgIERvbid0IGVuYWJsZSB0aGVtLiAgVGhlIGRpZmZpY3VsdHkgaXMgdGhhdAorICAgICAgICAjIHRoZSBlZGdlIGNhc2UgdGVzdHMgYXNzdW1lIHRoYXQgZXZlcnkgaG91ciBpcyByZXByZXNlbnRhYmxlIGluCisgICAgICAgICMgdGhlICJ1dGMiIGNsYXNzLiAgVGhpcyBpcyBhbHdheXMgdHJ1ZSBmb3IgYSBmaXhlZC1vZmZzZXQgdHppbmZvCisgICAgICAgICMgY2xhc3MgKGxrZSB1dGNfcmVhbCBhbmQgdXRjX2Zha2UpLCBidXQgbm90IGZvciBFYXN0ZXJuIG9yIENlbnRyYWwuCisgICAgICAgICMgRm9yIHRoZXNlIGFkamFjZW50IERTVC1hd2FyZSB0aW1lIHpvbmVzLCB0aGUgcmFuZ2Ugb2YgdGltZSBvZmZzZXRzCisgICAgICAgICMgdGVzdGVkIGVuZHMgdXAgY3JlYXRpbmcgaG91cnMgaW4gdGhlIG9uZSB0aGF0IGFyZW4ndCByZXByZXNlbnRhYmxlCisgICAgICAgICMgaW4gdGhlIG90aGVyLiAgRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2Ugd291bGQgc2VlIGZhaWx1cmVzIGluIHRoZQorICAgICAgICAjIEVhc3Rlcm4gdnMgUGFjaWZpYyB0ZXN0cyB0b28gaWYgd2UgYWRkZWQgMypIT1VSIHRvIHRoZSBsaXN0IG9mCisgICAgICAgICMgb2Zmc2V0IGRlbHRhcyBpbiBjb252ZXJ0X2JldHdlZW5fdHpfYW5kX3V0YygpLgorICAgICAgICAjCisgICAgICAgICMgc2VsZi5jb252ZXJ0X2JldHdlZW5fdHpfYW5kX3V0YyhFYXN0ZXJuLCBDZW50cmFsKSAgIyBjYW4ndCB3b3JrCisgICAgICAgICMgc2VsZi5jb252ZXJ0X2JldHdlZW5fdHpfYW5kX3V0YyhDZW50cmFsLCBFYXN0ZXJuKSAgIyBjYW4ndCB3b3JrCisKKyAgICBkZWYgdGVzdF90cmlja3koc2VsZik6CisgICAgICAgICMgMjI6MDAgb24gZGF5IGJlZm9yZSBkYXlsaWdodCBzdGFydHMuCisgICAgICAgIGZvdXJiYWNrID0gc2VsZi5kc3RvbiAtIHRpbWVkZWx0YShob3Vycz00KQorICAgICAgICBuaW5ld2VzdCA9IEZpeGVkT2Zmc2V0KC05KjYwLCAiLTA5MDAiLCAwKQorICAgICAgICBmb3VyYmFjayA9IGZvdXJiYWNrLnJlcGxhY2UodHppbmZvPW5pbmV3ZXN0KQorICAgICAgICAjIDIyOjAwLTA5MDAgaXMgNzowMCBVVEMgPT0gMjowMCBFU1QgPT0gMzowMCBEU1QuICBTaW5jZSBpdCdzICJhZnRlcgorICAgICAgICAjIDIiLCB3ZSBzaG91bGQgZ2V0IHRoZSAzIHNwZWxsaW5nLgorICAgICAgICAjIElmIHdlIHBsdWcgMjI6MDAgdGhlIGRheSBiZWZvcmUgaW50byBFYXN0ZXJuLCBpdCAibG9va3MgbGlrZSBzdGQKKyAgICAgICAgIyB0aW1lIiwgc28gaXRzIG9mZnNldCBpcyByZXR1cm5lZCBhcyAtNSwgYW5kIC01IC0gLTkgPSA0LiAgQWRkaW5nIDQKKyAgICAgICAgIyB0byAyMjowMCBsYW5kcyBvbiAyOjAwLCB3aGljaCBtYWtlcyBubyBzZW5zZSBpbiBsb2NhbCB0aW1lICh0aGUKKyAgICAgICAgIyBsb2NhbCBjbG9jayBqdW1wcyBmcm9tIDEgdG8gMykuICBUaGUgcG9pbnQgaGVyZSBpcyB0byBtYWtlIHN1cmUgd2UKKyAgICAgICAgIyBnZXQgdGhlIDMgc3BlbGxpbmcuCisgICAgICAgIGV4cGVjdGVkID0gc2VsZi5kc3Rvbi5yZXBsYWNlKGhvdXI9MykKKyAgICAgICAgZ290ID0gZm91cmJhY2suYXN0aW1lem9uZShFYXN0ZXJuKS5yZXBsYWNlKHR6aW5mbz1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisKKyAgICAgICAgIyBTaW1pbGFyLCBidXQgbWFwIHRvIDY6MDAgVVRDID09IDE6MDAgRVNUID09IDI6MDAgRFNULiAgSW4gdGhhdAorICAgICAgICAjIGNhc2Ugd2Ugd2FudCB0aGUgMTowMCBzcGVsbGluZy4KKyAgICAgICAgc2l4dXRjID0gc2VsZi5kc3Rvbi5yZXBsYWNlKGhvdXI9NiwgdHppbmZvPXV0Y19yZWFsKQorICAgICAgICAjIE5vdyA2OjAwICJsb29rcyBsaWtlIGRheWxpZ2h0Iiwgc28gdGhlIG9mZnNldCB3cnQgRWFzdGVybiBpcyAtNCwKKyAgICAgICAgIyBhbmQgYWRkaW5nIC00LTAgPT0gLTQgZ2l2ZXMgdGhlIDI6MDAgc3BlbGxpbmcuICBXZSB3YW50IHRoZSAxOjAwIEVTVAorICAgICAgICAjIHNwZWxsaW5nLgorICAgICAgICBleHBlY3RlZCA9IHNlbGYuZHN0b24ucmVwbGFjZShob3VyPTEpCisgICAgICAgIGdvdCA9IHNpeHV0Yy5hc3RpbWV6b25lKEVhc3Rlcm4pLnJlcGxhY2UodHppbmZvPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKworICAgICAgICAjIE5vdyBvbiB0aGUgZGF5IERTVCBlbmRzLCB3ZSB3YW50ICJyZXBlYXQgYW4gaG91ciIgYmVoYXZpb3IuCisgICAgICAgICMgIFVUQyAgNDpNTSAgNTpNTSAgNjpNTSAgNzpNTSAgY2hlY2tpbmcgdGhlc2UKKyAgICAgICAgIyAgRVNUIDIzOk1NICAwOk1NICAxOk1NICAyOk1NCisgICAgICAgICMgIEVEVCAgMDpNTSAgMTpNTSAgMjpNTSAgMzpNTQorICAgICAgICAjIHdhbGwgIDA6TU0gIDE6TU0gIDE6TU0gIDI6TU0gIGFnYWluc3QgdGhlc2UKKyAgICAgICAgZm9yIHV0YyBpbiB1dGNfcmVhbCwgdXRjX2Zha2U6CisgICAgICAgICAgICBmb3IgdHogaW4gRWFzdGVybiwgUGFjaWZpYzoKKyAgICAgICAgICAgICAgICBmaXJzdF9zdGRfaG91ciA9IHNlbGYuZHN0b2ZmIC0gdGltZWRlbHRhKGhvdXJzPTIpICMgMjM6TU0KKyAgICAgICAgICAgICAgICAjIENvbnZlcnQgdGhhdCB0byBVVEMuCisgICAgICAgICAgICAgICAgZmlyc3Rfc3RkX2hvdXIgLT0gdHoudXRjb2Zmc2V0KE5vbmUpCisgICAgICAgICAgICAgICAgIyBBZGp1c3QgZm9yIHBvc3NpYmx5IGZha2UgVVRDLgorICAgICAgICAgICAgICAgIGFzdXRjID0gZmlyc3Rfc3RkX2hvdXIgKyB1dGMudXRjb2Zmc2V0KE5vbmUpCisgICAgICAgICAgICAgICAgIyBGaXJzdCBVVEMgaG91ciB0byBjb252ZXJ0OyB0aGlzIGlzIDQ6MDAgd2hlbiB1dGM9dXRjX3JlYWwgJgorICAgICAgICAgICAgICAgICMgdHo9RWFzdGVybi4KKyAgICAgICAgICAgICAgICBhc3V0Y2Jhc2UgPSBhc3V0Yy5yZXBsYWNlKHR6aW5mbz11dGMpCisgICAgICAgICAgICAgICAgZm9yIHR6aG91ciBpbiAoMCwgMSwgMSwgMik6CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkYmFzZSA9IHNlbGYuZHN0b2ZmLnJlcGxhY2UoaG91cj10emhvdXIpCisgICAgICAgICAgICAgICAgICAgIGZvciBtaW51dGUgaW4gMCwgMzAsIDU5OgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZGJhc2UucmVwbGFjZShtaW51dGU9bWludXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgYXN1dGMgPSBhc3V0Y2Jhc2UucmVwbGFjZShtaW51dGU9bWludXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgYXN0eiA9IGFzdXRjLmFzdGltZXpvbmUodHopCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdHoucmVwbGFjZSh0emluZm89Tm9uZSksIGV4cGVjdGVkKQorICAgICAgICAgICAgICAgICAgICBhc3V0Y2Jhc2UgKz0gSE9VUgorCisKKyAgICBkZWYgdGVzdF9ib2d1c19kc3Qoc2VsZik6CisgICAgICAgIGNsYXNzIG9rKHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTogcmV0dXJuIEhPVVIKKyAgICAgICAgICAgIGRlZiBkc3Qoc2VsZiwgZHQpOiByZXR1cm4gSE9VUgorCisgICAgICAgIG5vdyA9IHNlbGYudGhlY2xhc3Mubm93KCkucmVwbGFjZSh0emluZm89dXRjX3JlYWwpCisgICAgICAgICMgRG9lc24ndCBibG93IHVwLgorICAgICAgICBub3cuYXN0aW1lem9uZShvaygpKQorCisgICAgICAgICMgRG9lcyBibG93IHVwLgorICAgICAgICBjbGFzcyBub3Rvayhvayk6CisgICAgICAgICAgICBkZWYgZHN0KHNlbGYsIGR0KTogcmV0dXJuIE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbm93LmFzdGltZXpvbmUsIG5vdG9rKCkpCisKKyAgICBkZWYgdGVzdF9mcm9tdXRjKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEVhc3Rlcm4uZnJvbXV0YykgICAjIG5vdCBlbm91Z2ggYXJncworICAgICAgICBub3cgPSBkYXRldGltZS51dGNub3coKS5yZXBsYWNlKHR6aW5mbz11dGNfcmVhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRWFzdGVybi5mcm9tdXRjLCBub3cpICMgd3JvbmcgdHppbmZvCisgICAgICAgIG5vdyA9IG5vdy5yZXBsYWNlKHR6aW5mbz1FYXN0ZXJuKSAgICMgaW5zZXJ0IGNvcnJlY3QgdHppbmZvCisgICAgICAgIGVub3cgPSBFYXN0ZXJuLmZyb211dGMobm93KSAgICAgICAgICMgZG9lc24ndCBibG93IHVwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5vdy50emluZm8sIEVhc3Rlcm4pICMgaGFzIHJpZ2h0IHR6aW5mbyBtZW1iZXIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBFYXN0ZXJuLmZyb211dGMsIG5vdywgbm93KSAjIHRvbyBtYW55IGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBFYXN0ZXJuLmZyb211dGMsIGRhdGUudG9kYXkoKSkgIyB3cm9uZyB0eXBlCisKKyAgICAgICAgIyBBbHdheXMgY29udmVydHMgVVRDIHRvIHN0YW5kYXJkIHRpbWUuCisgICAgICAgIGNsYXNzIEZhdXhVU1RpbWVab25lKFVTVGltZVpvbmUpOgorICAgICAgICAgICAgZGVmIGZyb211dGMoc2VsZiwgZHQpOgorICAgICAgICAgICAgICAgIHJldHVybiBkdCArIHNlbGYuc3Rkb2Zmc2V0CisgICAgICAgIEZFYXN0ZXJuICA9IEZhdXhVU1RpbWVab25lKC01LCAiRkVhc3Rlcm4iLCAgIkZFU1QiLCAiRkVEVCIpCisKKyAgICAgICAgIyAgVVRDICA0Ok1NICA1Ok1NICA2Ok1NICA3Ok1NICA4Ok1NICA5Ok1NCisgICAgICAgICMgIEVTVCAyMzpNTSAgMDpNTSAgMTpNTSAgMjpNTSAgMzpNTSAgNDpNTQorICAgICAgICAjICBFRFQgIDA6TU0gIDE6TU0gIDI6TU0gIDM6TU0gIDQ6TU0gIDU6TU0KKworICAgICAgICAjIENoZWNrIGFyb3VuZCBEU1Qgc3RhcnQuCisgICAgICAgIHN0YXJ0ID0gc2VsZi5kc3Rvbi5yZXBsYWNlKGhvdXI9NCwgdHppbmZvPUVhc3Rlcm4pCisgICAgICAgIGZzdGFydCA9IHN0YXJ0LnJlcGxhY2UodHppbmZvPUZFYXN0ZXJuKQorICAgICAgICBmb3Igd2FsbCBpbiAyMywgMCwgMSwgMywgNCwgNToKKyAgICAgICAgICAgIGV4cGVjdGVkID0gc3RhcnQucmVwbGFjZShob3VyPXdhbGwpCisgICAgICAgICAgICBpZiB3YWxsID09IDIzOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkIC09IHRpbWVkZWx0YShkYXlzPTEpCisgICAgICAgICAgICBnb3QgPSBFYXN0ZXJuLmZyb211dGMoc3RhcnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisKKyAgICAgICAgICAgIGV4cGVjdGVkID0gZnN0YXJ0ICsgRkVhc3Rlcm4uc3Rkb2Zmc2V0CisgICAgICAgICAgICBnb3QgPSBGRWFzdGVybi5mcm9tdXRjKGZzdGFydCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKworICAgICAgICAgICAgIyBFbnN1cmUgYXN0aW1lem9uZSgpIGNhbGxzIGZyb211dGMoKSB0b28uCisgICAgICAgICAgICBnb3QgPSBmc3RhcnQucmVwbGFjZSh0emluZm89dXRjX3JlYWwpLmFzdGltZXpvbmUoRkVhc3Rlcm4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisKKyAgICAgICAgICAgIHN0YXJ0ICs9IEhPVVIKKyAgICAgICAgICAgIGZzdGFydCArPSBIT1VSCisKKyAgICAgICAgIyBDaGVjayBhcm91bmQgRFNUIGVuZC4KKyAgICAgICAgc3RhcnQgPSBzZWxmLmRzdG9mZi5yZXBsYWNlKGhvdXI9NCwgdHppbmZvPUVhc3Rlcm4pCisgICAgICAgIGZzdGFydCA9IHN0YXJ0LnJlcGxhY2UodHppbmZvPUZFYXN0ZXJuKQorICAgICAgICBmb3Igd2FsbCBpbiAwLCAxLCAxLCAyLCAzLCA0OgorICAgICAgICAgICAgZXhwZWN0ZWQgPSBzdGFydC5yZXBsYWNlKGhvdXI9d2FsbCkKKyAgICAgICAgICAgIGdvdCA9IEVhc3Rlcm4uZnJvbXV0YyhzdGFydCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKworICAgICAgICAgICAgZXhwZWN0ZWQgPSBmc3RhcnQgKyBGRWFzdGVybi5zdGRvZmZzZXQKKyAgICAgICAgICAgIGdvdCA9IEZFYXN0ZXJuLmZyb211dGMoZnN0YXJ0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorCisgICAgICAgICAgICAjIEVuc3VyZSBhc3RpbWV6b25lKCkgY2FsbHMgZnJvbXV0YygpIHRvby4KKyAgICAgICAgICAgIGdvdCA9IGZzdGFydC5yZXBsYWNlKHR6aW5mbz11dGNfcmVhbCkuYXN0aW1lem9uZShGRWFzdGVybikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKworICAgICAgICAgICAgc3RhcnQgKz0gSE9VUgorICAgICAgICAgICAgZnN0YXJ0ICs9IEhPVVIKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBvZGRiYWxscworCitjbGFzcyBPZGRiYWxscyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9idWdfMTAyODMwNihzZWxmKToKKyAgICAgICAgIyBUcnlpbmcgdG8gY29tcGFyZSBhIGRhdGUgdG8gYSBkYXRldGltZSBzaG91bGQgYWN0IGxpa2UgYSBtaXhlZC0KKyAgICAgICAgIyB0eXBlIGNvbXBhcmlzb24sIGRlc3BpdGUgdGhhdCBkYXRldGltZSBpcyBhIHN1YmNsYXNzIG9mIGRhdGUuCisgICAgICAgIGFzX2RhdGUgPSBkYXRlLnRvZGF5KCkKKyAgICAgICAgYXNfZGF0ZXRpbWUgPSBkYXRldGltZS5jb21iaW5lKGFzX2RhdGUsIHRpbWUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFzX2RhdGUgIT0gYXNfZGF0ZXRpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhc19kYXRldGltZSAhPSBhc19kYXRlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGFzX2RhdGUgPT0gYXNfZGF0ZXRpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYXNfZGF0ZXRpbWUgPT0gYXNfZGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGFzX2RhdGUgPCBhc19kYXRldGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGFzX2RhdGV0aW1lIDwgYXNfZGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGFzX2RhdGUgPD0gYXNfZGF0ZXRpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhc19kYXRldGltZSA8PSBhc19kYXRlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYXNfZGF0ZSA+IGFzX2RhdGV0aW1lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYXNfZGF0ZXRpbWUgPiBhc19kYXRlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYXNfZGF0ZSA+PSBhc19kYXRldGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGFzX2RhdGV0aW1lID49IGFzX2RhdGUpCisKKyAgICAgICAgIyBOZXZlcnRoZWxzcywgY29tcGFyaXNvbiBzaG91bGQgd29yayB3aXRoIHRoZSBiYXNlLWNsYXNzIChkYXRlKQorICAgICAgICAjIHByb2plY3Rpb24gaWYgdXNlIG9mIGEgZGF0ZSBtZXRob2QgaXMgZm9yY2VkLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXNfZGF0ZS5fX2VxX18oYXNfZGF0ZXRpbWUpKQorICAgICAgICBkaWZmZXJlbnRfZGF5ID0gKGFzX2RhdGUuZGF5ICsgMSkgJSAyMCArIDEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBhc19kYXRlLl9fZXFfXyhhc19kYXRldGltZS5yZXBsYWNlKGRheT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50X2RheSkpKQorCisgICAgICAgICMgQW5kIGRhdGUgc2hvdWxkIGNvbXBhcmUgd2l0aCBvdGhlciBzdWJjbGFzc2VzIG9mIGRhdGUuICBJZiBhCisgICAgICAgICMgc3ViY2xhc3Mgd2FudHMgdG8gc3RvcCB0aGlzLCBpdCdzIHVwIHRvIHRoZSBzdWJjbGFzcyB0byBkbyBzby4KKyAgICAgICAgZGF0ZV9zYyA9IFN1YmNsYXNzRGF0ZShhc19kYXRlLnllYXIsIGFzX2RhdGUubW9udGgsIGFzX2RhdGUuZGF5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzX2RhdGUsIGRhdGVfc2MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0ZV9zYywgYXNfZGF0ZSkKKworICAgICAgICAjIERpdHRvIGZvciBkYXRldGltZXMuCisgICAgICAgIGRhdGV0aW1lX3NjID0gU3ViY2xhc3NEYXRldGltZShhc19kYXRldGltZS55ZWFyLCBhc19kYXRldGltZS5tb250aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzX2RhdGUuZGF5LCAwLCAwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzX2RhdGV0aW1lLCBkYXRldGltZV9zYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRldGltZV9zYywgYXNfZGF0ZXRpbWUpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYXRldGltZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYXRldGltZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjZWRjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RhdGV0aW1lLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYXRldGltZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYXRldGltZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlYjg0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RhdGV0aW1lLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYm0ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYm0ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiMGI1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RibS5weQpAQCAtMCwwICsxLDQyIEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CitkYm0gPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnZGJtJykKKworY2xhc3MgRGJtVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLmQgPSBkYm0ub3BlbihzZWxmLmZpbGVuYW1lLCAnYycpCisgICAgICAgIHNlbGYuZC5jbG9zZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciBzdWZmaXggaW4gWycnLCAnLnBhZycsICcuZGlyJywgJy5kYiddOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhzZWxmLmZpbGVuYW1lICsgc3VmZml4KQorCisgICAgZGVmIHRlc3Rfa2V5cyhzZWxmKToKKyAgICAgICAgc2VsZi5kID0gZGJtLm9wZW4oc2VsZi5maWxlbmFtZSwgJ2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZC5rZXlzKCksIFtdKQorICAgICAgICBhID0gWygnYScsICdiJyksICgnMTIzNDU2Nzg5MTAnLCAnMDE5MjM3NDEwOTgyMzQwOTEyODQwMTk4MjQyJyldCisgICAgICAgIGZvciBrLCB2IGluIGE6CisgICAgICAgICAgICBzZWxmLmRba10gPSB2CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHNlbGYuZC5rZXlzKCkpLCBzb3J0ZWQoayBmb3IgKGssIHYpIGluIGEpKQorICAgICAgICBmb3IgaywgdiBpbiBhOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihrLCBzZWxmLmQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZFtrXSwgdikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigneHh4Jywgc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLmRbJ3h4eCddKQorICAgICAgICBzZWxmLmQuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfbW9kZXMoc2VsZik6CisgICAgICAgIGZvciBtb2RlIGluIFsncicsICdydycsICd3JywgJ24nXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmQgPSBkYm0ub3BlbihzZWxmLmZpbGVuYW1lLCBtb2RlKQorICAgICAgICAgICAgICAgIHNlbGYuZC5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgZGJtLmVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KERibVRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYm0ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGJtLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTdlOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGJtLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYm0ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGJtLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTdlOGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGJtLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWNpbWFsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjaW1hbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTE4NGVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjaW1hbC5weQpAQCAtMCwwICsxLDIzNTEgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisjIFdyaXR0ZW4gYnkgRXJpYyBQcmljZSA8ZXByaWNlIGF0IHRqaHNzdC5lZHU+CisjICAgIGFuZCBGYWN1bmRvIEJhdGlzdGEgPGZhY3VuZG8gYXQgdGFuaXF1ZXRpbC5jb20uYXI+CisjICAgIGFuZCBSYXltb25kIEhldHRpbmdlciA8cHl0aG9uIGF0IHJjbi5jb20+CisjICAgIGFuZCBBYWh6IChhYWh6IGF0IHBvYm94LmNvbSkKKyMgICAgYW5kIFRpbSBQZXRlcnMKKworIiIiCitUaGVzZSBhcmUgdGhlIHRlc3QgY2FzZXMgZm9yIHRoZSBEZWNpbWFsIG1vZHVsZS4KKworVGhlcmUgYXJlIHR3byBncm91cHMgb2YgdGVzdHMsIEFyaXRobWV0aWMgYW5kIEJlaGF2aW91ci4gVGhlIGZvcm1lciB0ZXN0Cit0aGUgRGVjaW1hbCBhcml0aG1ldGljIHVzaW5nIHRoZSB0ZXN0cyBwcm92aWRlZCBieSBNaWtlIENvd2xpc2hhdy4gVGhlIGxhdHRlcgordGVzdCB0aGUgcHl0aG9uaWMgYmVoYXZpb3VyIGFjY29yZGluZyB0byBQRVAgMzI3LgorCitDb3dsaXNoYXcncyB0ZXN0cyBjYW4gYmUgZG93bmxvYWRlZCBmcm9tOgorCisgICB3d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsL2RlY3Rlc3QuemlwCisKK1RoaXMgdGVzdCBtb2R1bGUgY2FuIGJlIGNhbGxlZCBmcm9tIGNvbW1hbmQgbGluZSB3aXRoIG9uZSBwYXJhbWV0ZXIgKEFyaXRobWV0aWMKK29yIEJlaGF2aW91cikgdG8gdGVzdCBlYWNoIHBhcnQsIG9yIHdpdGhvdXQgcGFyYW1ldGVyIHRvIHRlc3QgYm90aCBwYXJ0cy4gSWYKK3lvdSdyZSB3b3JraW5nIHRocm91Z2ggSURMRSwgeW91IGNhbiBpbXBvcnQgdGhpcyB0ZXN0IG1vZHVsZSBhbmQgY2FsbCB0ZXN0X21haW4oKQord2l0aCB0aGUgY29ycmVzcG9uZGluZyBhcmd1bWVudC4KKyIiIgorCitpbXBvcnQgbWF0aAoraW1wb3J0IG9zLCBzeXMKK2ltcG9ydCBvcGVyYXRvcgoraW1wb3J0IHBpY2tsZSwgY29weQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGRlY2ltYWwgaW1wb3J0ICoKK2ltcG9ydCBudW1iZXJzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAocnVuX3VuaXR0ZXN0LCBydW5fZG9jdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZXNvdXJjZV9lbmFibGVkLCBjaGVja19weTNrX3dhcm5pbmdzKQoraW1wb3J0IHJhbmRvbQordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCisKKyMgVXNlZnVsIFRlc3QgQ29uc3RhbnQKK1NpZ25hbHMgPSB0dXBsZShnZXRjb250ZXh0KCkuZmxhZ3Mua2V5cygpKQorCisjIFNpZ25hbHMgb3JkZXJlZCB3aXRoIHJlc3BlY3QgdG8gcHJlY2VkZW5jZTogd2hlbiBhbiBvcGVyYXRpb24KKyMgcHJvZHVjZXMgbXVsdGlwbGUgc2lnbmFscywgc2lnbmFscyBvY2N1cnJpbmcgbGF0ZXIgaW4gdGhlIGxpc3QKKyMgc2hvdWxkIGJlIGhhbmRsZWQgYmVmb3JlIHRob3NlIG9jY3VycmluZyBlYXJsaWVyIGluIHRoZSBsaXN0LgorT3JkZXJlZFNpZ25hbHMgPSAoQ2xhbXBlZCwgUm91bmRlZCwgSW5leGFjdCwgU3Vibm9ybWFsLAorICAgICAgICAgICAgICAgICAgVW5kZXJmbG93LCBPdmVyZmxvdywgRGl2aXNpb25CeVplcm8sIEludmFsaWRPcGVyYXRpb24pCisKKyMgVGVzdHMgYXJlIGJ1aWx0IGFyb3VuZCB0aGVzZSBhc3N1bWVkIGNvbnRleHQgZGVmYXVsdHMuCisjIHRlc3RfbWFpbigpIHJlc3RvcmVzIHRoZSBvcmlnaW5hbCBjb250ZXh0LgorZGVmIGluaXQoKToKKyAgICBnbG9iYWwgT1JJR0lOQUxfQ09OVEVYVAorICAgIE9SSUdJTkFMX0NPTlRFWFQgPSBnZXRjb250ZXh0KCkuY29weSgpCisgICAgRGVmYXVsdFRlc3RDb250ZXh0ID0gQ29udGV4dCgKKyAgICAgICAgcHJlYyA9IDksCisgICAgICAgIHJvdW5kaW5nID0gUk9VTkRfSEFMRl9FVkVOLAorICAgICAgICB0cmFwcyA9IGRpY3QuZnJvbWtleXMoU2lnbmFscywgMCkKKyAgICAgICAgKQorICAgIHNldGNvbnRleHQoRGVmYXVsdFRlc3RDb250ZXh0KQorCisjIGRlY29yYXRvciBmb3Igc2tpcHBpbmcgdGVzdHMgb24gbm9uLUlFRUUgNzU0IHBsYXRmb3JtcworcmVxdWlyZXNfSUVFRV83NTQgPSB1bml0dGVzdC5za2lwVW5sZXNzKAorICAgIGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKSwKKyAgICAidGVzdCByZXF1aXJlcyBJRUVFIDc1NCBkb3VibGVzIikKKworVEVTVERBVEFESVIgPSAnZGVjaW1hbHRlc3RkYXRhJworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBmaWxlID0gc3lzLmFyZ3ZbMF0KK2Vsc2U6CisgICAgZmlsZSA9IF9fZmlsZV9fCit0ZXN0ZGlyID0gb3MucGF0aC5kaXJuYW1lKGZpbGUpIG9yIG9zLmN1cmRpcgorZGlyZWN0b3J5ID0gdGVzdGRpciArIG9zLnNlcCArIFRFU1REQVRBRElSICsgb3Muc2VwCisKK3NraXBfZXhwZWN0ZWQgPSBub3Qgb3MucGF0aC5pc2RpcihkaXJlY3RvcnkpCisKKyMgbGlzdCBvZiBpbmRpdmlkdWFsIC5kZWNUZXN0IHRlc3QgaWRzIHRoYXQgY29ycmVzcG9uZCB0byB0ZXN0cyB0aGF0CisjIHdlJ3JlIHNraXBwaW5nIGZvciBvbmUgcmVhc29uIG9yIGFub3RoZXIuCitza2lwcGVkX3Rlc3RfaWRzID0gc2V0KFsKKyAgICAjIFNraXAgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgc2NhbGViIHRlc3RzLgorICAgICdzY2J4MTY0JywKKyAgICAnc2NieDE2NScsCisKKyAgICAjIEZvciBzb21lIG9wZXJhdGlvbnMgKGN1cnJlbnRseSBleHAsIGxuLCBsb2cxMCwgcG93ZXIpLCB0aGUgZGVjTnVtYmVyCisgICAgIyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaW1wb3NlcyBhZGRpdGlvbmFsIHJlc3RyaWN0aW9ucyBvbiB0aGUgY29udGV4dAorICAgICMgYW5kIG9wZXJhbmRzLiAgVGhlc2UgcmVzdHJpY3Rpb25zIGFyZSBub3QgcGFydCBvZiB0aGUgc3BlY2lmaWNhdGlvbjsKKyAgICAjIGhvd2V2ZXIsIHRoZSBlZmZlY3Qgb2YgdGhlc2UgcmVzdHJpY3Rpb25zIGRvZXMgc2hvdyB1cCBpbiBzb21lIG9mIHRoZQorICAgICMgdGVzdGNhc2VzLiAgV2Ugc2tpcCB0ZXN0Y2FzZXMgdGhhdCB2aW9sYXRlIHRoZXNlIHJlc3RyaWN0aW9ucywgc2luY2UKKyAgICAjIERlY2ltYWwgYmVoYXZlcyBkaWZmZXJlbnRseSBmcm9tIGRlY051bWJlciBmb3IgdGhlc2UgdGVzdGNhc2VzIHNvIHRoZXNlCisgICAgIyB0ZXN0Y2FzZXMgd291bGQgb3RoZXJ3aXNlIGZhaWwuCisgICAgJ2V4cHg5MDEnLAorICAgICdleHB4OTAyJywKKyAgICAnZXhweDkwMycsCisgICAgJ2V4cHg5MDUnLAorICAgICdsbng5MDEnLAorICAgICdsbng5MDInLAorICAgICdsbng5MDMnLAorICAgICdsbng5MDUnLAorICAgICdsb2d4OTAxJywKKyAgICAnbG9neDkwMicsCisgICAgJ2xvZ3g5MDMnLAorICAgICdsb2d4OTA1JywKKyAgICAncG93eDExODMnLAorICAgICdwb3d4MTE4NCcsCisgICAgJ3Bvd3g0MDAxJywKKyAgICAncG93eDQwMDInLAorICAgICdwb3d4NDAwMycsCisgICAgJ3Bvd3g0MDA1JywKKyAgICAncG93eDQwMDgnLAorICAgICdwb3d4NDAxMCcsCisgICAgJ3Bvd3g0MDEyJywKKyAgICAncG93eDQwMTQnLAorICAgIF0pCisKKyMgTWFrZSBzdXJlIGl0IGFjdHVhbGx5IHJhaXNlcyBlcnJvcnMgd2hlbiBub3QgZXhwZWN0ZWQgYW5kIGNhdWdodCBpbiBmbGFncworIyBTbG93ZXIsIHNpbmNlIGl0IHJ1bnMgc29tZSB0aGluZ3Mgc2V2ZXJhbCB0aW1lcy4KK0VYVEVOREVERVJST1JURVNUID0gRmFsc2UKKworI01hcCB0aGUgdGVzdCBjYXNlcycgZXJyb3IgbmFtZXMgdG8gdGhlIGFjdHVhbCBlcnJvcnMKK0Vycm9yTmFtZXMgPSB7J2NsYW1wZWQnIDogQ2xhbXBlZCwKKyAgICAgICAgICAgICAgJ2NvbnZlcnNpb25fc3ludGF4JyA6IEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICdkaXZpc2lvbl9ieV96ZXJvJyA6IERpdmlzaW9uQnlaZXJvLAorICAgICAgICAgICAgICAnZGl2aXNpb25faW1wb3NzaWJsZScgOiBJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAnZGl2aXNpb25fdW5kZWZpbmVkJyA6IEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICdpbmV4YWN0JyA6IEluZXhhY3QsCisgICAgICAgICAgICAgICdpbnZhbGlkX2NvbnRleHQnIDogSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgJ2ludmFsaWRfb3BlcmF0aW9uJyA6IEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICdvdmVyZmxvdycgOiBPdmVyZmxvdywKKyAgICAgICAgICAgICAgJ3JvdW5kZWQnIDogUm91bmRlZCwKKyAgICAgICAgICAgICAgJ3N1Ym5vcm1hbCcgOiBTdWJub3JtYWwsCisgICAgICAgICAgICAgICd1bmRlcmZsb3cnIDogVW5kZXJmbG93fQorCisKK2RlZiBOb25mdW5jdGlvbigqYXJncyk6CisgICAgIiIiRG9lc24ndCBkbyBhbnl0aGluZy4iIiIKKyAgICByZXR1cm4gTm9uZQorCitSb3VuZGluZ0RpY3QgPSB7J2NlaWxpbmcnIDogUk9VTkRfQ0VJTElORywgI01hcHMgdGVzdC1jYXNlIG5hbWVzIHRvIHJvdW5kaW5ncy4KKyAgICAgICAgICAgICAgICAnZG93bicgOiBST1VORF9ET1dOLAorICAgICAgICAgICAgICAgICdmbG9vcicgOiBST1VORF9GTE9PUiwKKyAgICAgICAgICAgICAgICAnaGFsZl9kb3duJyA6IFJPVU5EX0hBTEZfRE9XTiwKKyAgICAgICAgICAgICAgICAnaGFsZl9ldmVuJyA6IFJPVU5EX0hBTEZfRVZFTiwKKyAgICAgICAgICAgICAgICAnaGFsZl91cCcgOiBST1VORF9IQUxGX1VQLAorICAgICAgICAgICAgICAgICd1cCcgOiBST1VORF9VUCwKKyAgICAgICAgICAgICAgICAnMDV1cCcgOiBST1VORF8wNVVQfQorCisjIE5hbWUgYWRhcHRlciB0byBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgRGVjaW1hbCBhbmQgQ29udGV4dAorIyBpbnRlcmZhY2Ugd2l0aG91dCBjaGFuZ2luZyB0aGUgdGVzdCBmaWxlcyBmcm9tIENvd2xpc2hhdworbmFtZUFkYXB0ZXIgPSB7J2FuZCc6J2xvZ2ljYWxfYW5kJywKKyAgICAgICAgICAgICAgICdhcHBseSc6J19hcHBseScsCisgICAgICAgICAgICAgICAnY2xhc3MnOidudW1iZXJfY2xhc3MnLAorICAgICAgICAgICAgICAgJ2NvbXBhcmVzaWcnOidjb21wYXJlX3NpZ25hbCcsCisgICAgICAgICAgICAgICAnY29tcGFyZXRvdGFsJzonY29tcGFyZV90b3RhbCcsCisgICAgICAgICAgICAgICAnY29tcGFyZXRvdG1hZyc6J2NvbXBhcmVfdG90YWxfbWFnJywKKyAgICAgICAgICAgICAgICdjb3B5JzonY29weV9kZWNpbWFsJywKKyAgICAgICAgICAgICAgICdjb3B5YWJzJzonY29weV9hYnMnLAorICAgICAgICAgICAgICAgJ2NvcHluZWdhdGUnOidjb3B5X25lZ2F0ZScsCisgICAgICAgICAgICAgICAnY29weXNpZ24nOidjb3B5X3NpZ24nLAorICAgICAgICAgICAgICAgJ2RpdmlkZWludCc6J2RpdmlkZV9pbnQnLAorICAgICAgICAgICAgICAgJ2ludmVydCc6J2xvZ2ljYWxfaW52ZXJ0JywKKyAgICAgICAgICAgICAgICdpc2Nhbm9uaWNhbCc6J2lzX2Nhbm9uaWNhbCcsCisgICAgICAgICAgICAgICAnaXNmaW5pdGUnOidpc19maW5pdGUnLAorICAgICAgICAgICAgICAgJ2lzaW5maW5pdGUnOidpc19pbmZpbml0ZScsCisgICAgICAgICAgICAgICAnaXNuYW4nOidpc19uYW4nLAorICAgICAgICAgICAgICAgJ2lzbm9ybWFsJzonaXNfbm9ybWFsJywKKyAgICAgICAgICAgICAgICdpc3FuYW4nOidpc19xbmFuJywKKyAgICAgICAgICAgICAgICdpc3NpZ25lZCc6J2lzX3NpZ25lZCcsCisgICAgICAgICAgICAgICAnaXNzbmFuJzonaXNfc25hbicsCisgICAgICAgICAgICAgICAnaXNzdWJub3JtYWwnOidpc19zdWJub3JtYWwnLAorICAgICAgICAgICAgICAgJ2lzemVybyc6J2lzX3plcm8nLAorICAgICAgICAgICAgICAgJ21heG1hZyc6J21heF9tYWcnLAorICAgICAgICAgICAgICAgJ21pbm1hZyc6J21pbl9tYWcnLAorICAgICAgICAgICAgICAgJ25leHRtaW51cyc6J25leHRfbWludXMnLAorICAgICAgICAgICAgICAgJ25leHRwbHVzJzonbmV4dF9wbHVzJywKKyAgICAgICAgICAgICAgICduZXh0dG93YXJkJzonbmV4dF90b3dhcmQnLAorICAgICAgICAgICAgICAgJ29yJzonbG9naWNhbF9vcicsCisgICAgICAgICAgICAgICAncmVkdWNlJzonbm9ybWFsaXplJywKKyAgICAgICAgICAgICAgICdyZW1haW5kZXJuZWFyJzoncmVtYWluZGVyX25lYXInLAorICAgICAgICAgICAgICAgJ3NhbWVxdWFudHVtJzonc2FtZV9xdWFudHVtJywKKyAgICAgICAgICAgICAgICdzcXVhcmVyb290Jzonc3FydCcsCisgICAgICAgICAgICAgICAndG9lbmcnOid0b19lbmdfc3RyaW5nJywKKyAgICAgICAgICAgICAgICd0b2ludGVncmFsJzondG9faW50ZWdyYWxfdmFsdWUnLAorICAgICAgICAgICAgICAgJ3RvaW50ZWdyYWx4JzondG9faW50ZWdyYWxfZXhhY3QnLAorICAgICAgICAgICAgICAgJ3Rvc2NpJzondG9fc2NpX3N0cmluZycsCisgICAgICAgICAgICAgICAneG9yJzonbG9naWNhbF94b3InLAorICAgICAgICAgICAgICB9CisKKyMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcmV0dXJuIFRydWUvRmFsc2UgcmF0aGVyIHRoYW4gYSBEZWNpbWFsIGluc3RhbmNlCisKK0xPR0lDQUxfRlVOQ1RJT05TID0gKAorICAgICdpc19jYW5vbmljYWwnLAorICAgICdpc19maW5pdGUnLAorICAgICdpc19pbmZpbml0ZScsCisgICAgJ2lzX25hbicsCisgICAgJ2lzX25vcm1hbCcsCisgICAgJ2lzX3FuYW4nLAorICAgICdpc19zaWduZWQnLAorICAgICdpc19zbmFuJywKKyAgICAnaXNfc3Vibm9ybWFsJywKKyAgICAnaXNfemVybycsCisgICAgJ3NhbWVfcXVhbnR1bScsCisgICAgKQorCitjbGFzcyBEZWNpbWFsVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiQ2xhc3Mgd2hpY2ggdGVzdHMgdGhlIERlY2ltYWwgY2xhc3MgYWdhaW5zdCB0aGUgdGVzdCBjYXNlcy4KKworICAgIENoYW5nZWQgZm9yIHVuaXR0ZXN0LgorICAgICIiIgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb250ZXh0ID0gQ29udGV4dCgpCisgICAgICAgIHNlbGYuaWdub3JlX2xpc3QgPSBbJyMnXQorICAgICAgICAjIEJhc2ljYWxseSwgYSAjIG1lYW5zIHJldHVybiBOYU4gSW52YWxpZE9wZXJhdGlvbi4KKyAgICAgICAgIyBEaWZmZXJlbnQgZnJvbSBhIHNOYU4gaW4gdHJpbQorCisgICAgICAgIHNlbGYuQ2hhbmdlRGljdCA9IHsncHJlY2lzaW9uJyA6IHNlbGYuY2hhbmdlX3ByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAncm91bmRpbmcnIDogc2VsZi5jaGFuZ2Vfcm91bmRpbmdfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICdtYXhleHBvbmVudCcgOiBzZWxmLmNoYW5nZV9tYXhfZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgJ21pbmV4cG9uZW50JyA6IHNlbGYuY2hhbmdlX21pbl9leHBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAnY2xhbXAnIDogc2VsZi5jaGFuZ2VfY2xhbXB9CisKKyAgICBkZWYgZXZhbF9maWxlKHNlbGYsIGZpbGUpOgorICAgICAgICBnbG9iYWwgc2tpcF9leHBlY3RlZAorICAgICAgICBpZiBza2lwX2V4cGVjdGVkOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aXRoIG9wZW4oZmlsZSkgYXMgZjoKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgnXHJcbicsICcnKS5yZXBsYWNlKCdcbicsICcnKQorICAgICAgICAgICAgICAgICNwcmludCBsaW5lCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0ID0gc2VsZi5ldmFsX2xpbmUobGluZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgRGVjaW1hbEV4Y2VwdGlvbiBhcyBleGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICNFeGNlcHRpb24gcmFpc2VkIHdoZXJlIHRoZXJlIHNob3VsZG4ndCBoYXZlIGJlZW4gb25lLgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ0V4Y2VwdGlvbiAiJytleGNlcHRpb24uX19jbGFzc19fLl9fbmFtZV9fICsgJyIgcmFpc2VkIG9uIGxpbmUgJytsaW5lKQorCisgICAgICAgIHJldHVybgorCisgICAgZGVmIGV2YWxfbGluZShzZWxmLCBzKToKKyAgICAgICAgaWYgcy5maW5kKCcgLT4gJykgPj0gMCBhbmQgc1s6Ml0gIT0gJy0tJyBhbmQgbm90IHMuc3RhcnRzd2l0aCgnICAtLScpOgorICAgICAgICAgICAgcyA9IChzLnNwbGl0KCctPicpWzBdICsgJy0+JyArCisgICAgICAgICAgICAgICAgIHMuc3BsaXQoJy0+JylbMV0uc3BsaXQoJy0tJylbMF0pLnN0cmlwKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHMgPSBzLnNwbGl0KCctLScpWzBdLnN0cmlwKCkKKworICAgICAgICBmb3IgaWdub3JlIGluIHNlbGYuaWdub3JlX2xpc3Q6CisgICAgICAgICAgICBpZiBzLmZpbmQoaWdub3JlKSA+PSAwOgorICAgICAgICAgICAgICAgICNwcmludCBzLnNwbGl0KClbMF0sICdOb3RJbXBsZW1lbnRlZC0tJywgaWdub3JlCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgJzonIGluIHM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5ldmFsX2RpcmVjdGl2ZShzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXZhbF9lcXVhdGlvbihzKQorCisgICAgZGVmIGV2YWxfZGlyZWN0aXZlKHNlbGYsIHMpOgorICAgICAgICBmdW5jdCwgdmFsdWUgPSBtYXAobGFtYmRhIHg6IHguc3RyaXAoKS5sb3dlcigpLCBzLnNwbGl0KCc6JykpCisgICAgICAgIGlmIGZ1bmN0ID09ICdyb3VuZGluZyc6CisgICAgICAgICAgICB2YWx1ZSA9IFJvdW5kaW5nRGljdFt2YWx1ZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGludCh2YWx1ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBmdW5jdCA9IHNlbGYuQ2hhbmdlRGljdC5nZXQoZnVuY3QsIE5vbmZ1bmN0aW9uKQorICAgICAgICBmdW5jdCh2YWx1ZSkKKworICAgIGRlZiBldmFsX2VxdWF0aW9uKHNlbGYsIHMpOgorICAgICAgICAjZ2xvYmFsIERFRkFVTFRfUFJFQ0lTSU9OCisgICAgICAgICNwcmludCBERUZBVUxUX1BSRUNJU0lPTgorCisgICAgICAgIGlmIG5vdCBURVNUX0FMTCBhbmQgcmFuZG9tLnJhbmRvbSgpIDwgMC45MDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFNpZGVzID0gcy5zcGxpdCgnLT4nKQorICAgICAgICAgICAgTCA9IFNpZGVzWzBdLnN0cmlwKCkuc3BsaXQoKQorICAgICAgICAgICAgaWQgPSBMWzBdCisgICAgICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgICAgICBwcmludCAiVGVzdCAiLCBpZCwKKyAgICAgICAgICAgIGZ1bmN0ID0gTFsxXS5sb3dlcigpCisgICAgICAgICAgICB2YWxzdGVtcCA9IExbMjpdCisgICAgICAgICAgICBMID0gU2lkZXNbMV0uc3RyaXAoKS5zcGxpdCgpCisgICAgICAgICAgICBhbnMgPSBMWzBdCisgICAgICAgICAgICBleGNlcHRpb25zID0gTFsxOl0KKyAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBJbmRleEVycm9yKToKKyAgICAgICAgICAgIHJhaXNlIEludmFsaWRPcGVyYXRpb24KKyAgICAgICAgZGVmIEZpeFF1b3Rlcyh2YWwpOgorICAgICAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoIicnIiwgJ1NpbmdsZVF1b3RlJykucmVwbGFjZSgnIiInLCAnRG91YmxlUXVvdGUnKQorICAgICAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoIiciLCAnJykucmVwbGFjZSgnIicsICcnKQorICAgICAgICAgICAgdmFsID0gdmFsLnJlcGxhY2UoJ1NpbmdsZVF1b3RlJywgIiciKS5yZXBsYWNlKCdEb3VibGVRdW90ZScsICciJykKKyAgICAgICAgICAgIHJldHVybiB2YWwKKworICAgICAgICBpZiBpZCBpbiBza2lwcGVkX3Rlc3RfaWRzOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm5hbWUgPSBuYW1lQWRhcHRlci5nZXQoZnVuY3QsIGZ1bmN0KQorICAgICAgICBpZiBmbmFtZSA9PSAncmVzY2FsZSc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZnVuY3QgPSBnZXRhdHRyKHNlbGYuY29udGV4dCwgZm5hbWUpCisgICAgICAgIHZhbHMgPSBbXQorICAgICAgICBjb25nbG9tZXJhdGUgPSAnJworICAgICAgICBxdW90ZSA9IDAKKyAgICAgICAgdGhlaXJleGNlcHRpb25zID0gW0Vycm9yTmFtZXNbeC5sb3dlcigpXSBmb3IgeCBpbiBleGNlcHRpb25zXQorCisgICAgICAgIGZvciBleGNlcHRpb24gaW4gU2lnbmFsczoKKyAgICAgICAgICAgIHNlbGYuY29udGV4dC50cmFwc1tleGNlcHRpb25dID0gMSAjQ2F0Y2ggdGhlc2UgYnVncy4uLgorICAgICAgICBmb3IgZXhjZXB0aW9uIGluIHRoZWlyZXhjZXB0aW9uczoKKyAgICAgICAgICAgIHNlbGYuY29udGV4dC50cmFwc1tleGNlcHRpb25dID0gMAorICAgICAgICBmb3IgaSwgdmFsIGluIGVudW1lcmF0ZSh2YWxzdGVtcCk6CisgICAgICAgICAgICBpZiB2YWwuY291bnQoIiciKSAlIDIgPT0gMToKKyAgICAgICAgICAgICAgICBxdW90ZSA9IDEgLSBxdW90ZQorICAgICAgICAgICAgaWYgcXVvdGU6CisgICAgICAgICAgICAgICAgY29uZ2xvbWVyYXRlID0gY29uZ2xvbWVyYXRlICsgJyAnICsgdmFsCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdmFsID0gY29uZ2xvbWVyYXRlICsgdmFsCisgICAgICAgICAgICAgICAgY29uZ2xvbWVyYXRlID0gJycKKyAgICAgICAgICAgIHYgPSBGaXhRdW90ZXModmFsKQorICAgICAgICAgICAgaWYgZm5hbWUgaW4gKCd0b19zY2lfc3RyaW5nJywgJ3RvX2VuZ19zdHJpbmcnKToKKyAgICAgICAgICAgICAgICBpZiBFWFRFTkRFREVSUk9SVEVTVDoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGVycm9yIGluIHRoZWlyZXhjZXB0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dC50cmFwc1tlcnJvcl0gPSAxCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Qoc2VsZi5jb250ZXh0LmNyZWF0ZV9kZWNpbWFsKHYpKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTaWduYWxzLCBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUmFpc2VkICVzIGluICVzIHdoZW4gJXMgZGlzYWJsZWQiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSwgcywgZXJyb3IpKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZCBub3QgcmFpc2UgJXMgaW4gJXMiICUgKGVycm9yLCBzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGV4dC50cmFwc1tlcnJvcl0gPSAwCisgICAgICAgICAgICAgICAgdiA9IHNlbGYuY29udGV4dC5jcmVhdGVfZGVjaW1hbCh2KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2ID0gRGVjaW1hbCh2LCBzZWxmLmNvbnRleHQpCisgICAgICAgICAgICB2YWxzLmFwcGVuZCh2KQorCisgICAgICAgIGFucyA9IEZpeFF1b3RlcyhhbnMpCisKKyAgICAgICAgaWYgRVhURU5ERURFUlJPUlRFU1QgYW5kIGZuYW1lIG5vdCBpbiAoJ3RvX3NjaV9zdHJpbmcnLCAndG9fZW5nX3N0cmluZycpOgorICAgICAgICAgICAgZm9yIGVycm9yIGluIHRoZWlyZXhjZXB0aW9uczoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQudHJhcHNbZXJyb3JdID0gMQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnVuY3QoKnZhbHMpCisgICAgICAgICAgICAgICAgZXhjZXB0IGVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZXhjZXB0IFNpZ25hbHMsIGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUmFpc2VkICVzIGluICVzIHdoZW4gJXMgZGlzYWJsZWQiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUsIHMsIGVycm9yKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZCBub3QgcmFpc2UgJXMgaW4gJXMiICUgKGVycm9yLCBzKSkKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQudHJhcHNbZXJyb3JdID0gMAorCisgICAgICAgICAgICAjIGFzIGFib3ZlLCBidXQgYWRkIHRyYXBzIGN1bXVsYXRpdmVseSwgdG8gY2hlY2sgcHJlY2VkZW5jZQorICAgICAgICAgICAgb3JkZXJlZF9lcnJvcnMgPSBbZSBmb3IgZSBpbiBPcmRlcmVkU2lnbmFscyBpZiBlIGluIHRoZWlyZXhjZXB0aW9uc10KKyAgICAgICAgICAgIGZvciBlcnJvciBpbiBvcmRlcmVkX2Vycm9yczoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQudHJhcHNbZXJyb3JdID0gMQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnVuY3QoKnZhbHMpCisgICAgICAgICAgICAgICAgZXhjZXB0IGVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZXhjZXB0IFNpZ25hbHMsIGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUmFpc2VkICVzIGluICVzOyBleHBlY3RlZCAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUoZSksIHMsIGVycm9yKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZCBub3QgcmFpc2UgJXMgaW4gJXMiICUgKGVycm9yLCBzKSkKKyAgICAgICAgICAgICMgcmVzZXQgdHJhcHMKKyAgICAgICAgICAgIGZvciBlcnJvciBpbiBvcmRlcmVkX2Vycm9yczoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQudHJhcHNbZXJyb3JdID0gMAorCisKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBwcmludCAiLS0iLCBzZWxmLmNvbnRleHQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gc3RyKGZ1bmN0KCp2YWxzKSkKKyAgICAgICAgICAgIGlmIGZuYW1lIGluIExPR0lDQUxfRlVOQ1RJT05TOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cihpbnQoZXZhbChyZXN1bHQpKSkgIyAnVHJ1ZScsICdGYWxzZScgLT4gJzEnLCAnMCcKKyAgICAgICAgZXhjZXB0IFNpZ25hbHMsIGVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJSYWlzZWQgJXMgaW4gJXMiICUgKGVycm9yLCBzKSkKKyAgICAgICAgZXhjZXB0OiAjQ2F0Y2ggYW55IGVycm9yIGxvbmcgZW5vdWdoIHRvIHN0YXRlIHRoZSB0ZXN0IGNhc2UuCisgICAgICAgICAgICBwcmludCAiRVJST1I6IiwgcworICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBteWV4Y2VwdGlvbnMgPSBzZWxmLmdldGV4Y2VwdGlvbnMoKQorICAgICAgICBzZWxmLmNvbnRleHQuY2xlYXJfZmxhZ3MoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBhbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ0luY29ycmVjdCBhbnN3ZXIgZm9yICcgKyBzICsgJyAtLSBnb3QgJyArIHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKG15ZXhjZXB0aW9ucywgdGhlaXJleGNlcHRpb25zLAorICAgICAgICAgICAgICAnSW5jb3JyZWN0IGZsYWdzIHNldCBpbiAnICsgcyArICcgLS0gZ290ICcgKyBzdHIobXlleGNlcHRpb25zKSkKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgZ2V0ZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtlIGZvciBlIGluIFNpZ25hbHMgaWYgc2VsZi5jb250ZXh0LmZsYWdzW2VdXQorCisgICAgZGVmIGNoYW5nZV9wcmVjaXNpb24oc2VsZiwgcHJlYyk6CisgICAgICAgIHNlbGYuY29udGV4dC5wcmVjID0gcHJlYworICAgIGRlZiBjaGFuZ2Vfcm91bmRpbmdfbWV0aG9kKHNlbGYsIHJvdW5kaW5nKToKKyAgICAgICAgc2VsZi5jb250ZXh0LnJvdW5kaW5nID0gcm91bmRpbmcKKyAgICBkZWYgY2hhbmdlX21pbl9leHBvbmVudChzZWxmLCBleHApOgorICAgICAgICBzZWxmLmNvbnRleHQuRW1pbiA9IGV4cAorICAgIGRlZiBjaGFuZ2VfbWF4X2V4cG9uZW50KHNlbGYsIGV4cCk6CisgICAgICAgIHNlbGYuY29udGV4dC5FbWF4ID0gZXhwCisgICAgZGVmIGNoYW5nZV9jbGFtcChzZWxmLCBjbGFtcCk6CisgICAgICAgIHNlbGYuY29udGV4dC5fY2xhbXAgPSBjbGFtcAorCisKKworIyBUaGUgZm9sbG93aW5nIGNsYXNzZXMgdGVzdCB0aGUgYmVoYXZpb3VyIG9mIERlY2ltYWwgYWNjb3JkaW5nIHRvIFBFUCAzMjcKKworY2xhc3MgRGVjaW1hbEV4cGxpY2l0Q29uc3RydWN0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgJycnVW5pdCB0ZXN0cyBmb3IgRXhwbGljaXQgQ29uc3RydWN0aW9uIGNhc2VzIG9mIERlY2ltYWwuJycnCisKKyAgICBkZWYgdGVzdF9leHBsaWNpdF9lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKCksIERlY2ltYWwoIjAiKSkKKworICAgIGRlZiB0ZXN0X2V4cGxpY2l0X2Zyb21fTm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBEZWNpbWFsLCBOb25lKQorCisgICAgZGVmIHRlc3RfZXhwbGljaXRfZnJvbV9pbnQoc2VsZik6CisKKyAgICAgICAgI3Bvc2l0aXZlCisgICAgICAgIGQgPSBEZWNpbWFsKDQ1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJzQ1JykKKworICAgICAgICAjdmVyeSBsYXJnZSBwb3NpdGl2ZQorICAgICAgICBkID0gRGVjaW1hbCg1MDAwMDAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGQpLCAnNTAwMDAwMTIzJykKKworICAgICAgICAjbmVnYXRpdmUKKyAgICAgICAgZCA9IERlY2ltYWwoLTQ1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJy00NScpCisKKyAgICAgICAgI3plcm8KKyAgICAgICAgZCA9IERlY2ltYWwoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZCksICcwJykKKworICAgIGRlZiB0ZXN0X2V4cGxpY2l0X2Zyb21fc3RyaW5nKHNlbGYpOgorCisgICAgICAgICNlbXB0eQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihEZWNpbWFsKCcnKSksICdOYU4nKQorCisgICAgICAgICNpbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRGVjaW1hbCgnNDUnKSksICc0NScpCisKKyAgICAgICAgI2Zsb2F0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwoJzQ1LjM0JykpLCAnNDUuMzQnKQorCisgICAgICAgICNlbmdpbmVlciBub3RhdGlvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihEZWNpbWFsKCc0NWUyJykpLCAnNC41RSszJykKKworICAgICAgICAjanVzdCBub3QgYSBudW1iZXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRGVjaW1hbCgndWdseScpKSwgJ05hTicpCisKKyAgICAgICAgI2xlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgcGVybWl0dGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwoJzEuM0U0IFxuJykpLCAnMS4zRSs0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRGVjaW1hbCgnICAtNy44OScpKSwgJy03Ljg5JykKKworICAgICAgICAjdW5pY29kZSBzdHJpbmdzIHNob3VsZCBiZSBwZXJtaXR0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRGVjaW1hbCh1JzBFLTAxNycpKSwgJzBFLTE3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRGVjaW1hbCh1JzQ1JykpLCAnNDUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihEZWNpbWFsKHUnLUluZicpKSwgJy1JbmZpbml0eScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwodSdOYU4xMjMnKSksICdOYU4xMjMnKQorCisgICAgZGVmIHRlc3RfZXhwbGljaXRfZnJvbV90dXBsZXMoc2VsZik6CisKKyAgICAgICAgI3plcm8KKyAgICAgICAgZCA9IERlY2ltYWwoICgwLCAoMCwpLCAwKSApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGQpLCAnMCcpCisKKyAgICAgICAgI2ludAorICAgICAgICBkID0gRGVjaW1hbCggKDEsICg0LCA1KSwgMCkgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJy00NScpCisKKyAgICAgICAgI2Zsb2F0CisgICAgICAgIGQgPSBEZWNpbWFsKCAoMCwgKDQsIDUsIDMsIDQpLCAtMikgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJzQ1LjM0JykKKworICAgICAgICAjd2VpcmQKKyAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoNCwgMywgNCwgOSwgMSwgMywgNSwgMywgNCksIC0yNSkgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJy00LjM0OTEzNTM0RS0xNycpCisKKyAgICAgICAgI3dyb25nIG51bWJlciBvZiBpdGVtcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBEZWNpbWFsLCAoMSwgKDQsIDMsIDQsIDksIDEpKSApCisKKyAgICAgICAgI2JhZCBzaWduCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIERlY2ltYWwsICg4LCAoNCwgMywgNCwgOSwgMSksIDIpICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRGVjaW1hbCwgKDAuLCAoNCwgMywgNCwgOSwgMSksIDIpICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRGVjaW1hbCwgKERlY2ltYWwoMSksICg0LCAzLCA0LCA5LCAxKSwgMikpCisKKyAgICAgICAgI2JhZCBleHAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRGVjaW1hbCwgKDEsICg0LCAzLCA0LCA5LCAxKSwgJ3dyb25nIScpICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRGVjaW1hbCwgKDEsICg0LCAzLCA0LCA5LCAxKSwgMC4pICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRGVjaW1hbCwgKDEsICg0LCAzLCA0LCA5LCAxKSwgJzEnKSApCisKKyAgICAgICAgI2JhZCBjb2VmZmljaWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRGVjaW1hbCwgKDEsICg0LCAzLCA0LCBOb25lLCAxKSwgMikgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBEZWNpbWFsLCAoMSwgKDQsIC0zLCA0LCA5LCAxKSwgMikgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBEZWNpbWFsLCAoMSwgKDQsIDEwLCA0LCA5LCAxKSwgMikgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBEZWNpbWFsLCAoMSwgKDQsIDMsIDQsICdhJywgMSksIDIpICkKKworICAgIGRlZiB0ZXN0X2V4cGxpY2l0X2Zyb21fYm9vbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhib29sKERlY2ltYWwoMCkpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhib29sKERlY2ltYWwoMSkpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoRmFsc2UpLCBEZWNpbWFsKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoVHJ1ZSksIERlY2ltYWwoMSkpCisKKyAgICBkZWYgdGVzdF9leHBsaWNpdF9mcm9tX0RlY2ltYWwoc2VsZik6CisKKyAgICAgICAgI3Bvc2l0aXZlCisgICAgICAgIGQgPSBEZWNpbWFsKDQ1KQorICAgICAgICBlID0gRGVjaW1hbChkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgJzQ1JykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCisKKyAgICAgICAgI3ZlcnkgbGFyZ2UgcG9zaXRpdmUKKyAgICAgICAgZCA9IERlY2ltYWwoNTAwMDAwMTIzKQorICAgICAgICBlID0gRGVjaW1hbChkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgJzUwMDAwMDEyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQorCisgICAgICAgICNuZWdhdGl2ZQorICAgICAgICBkID0gRGVjaW1hbCgtNDUpCisgICAgICAgIGUgPSBEZWNpbWFsKGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGUpLCAnLTQ1JykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCisKKyAgICAgICAgI3plcm8KKyAgICAgICAgZCA9IERlY2ltYWwoMCkKKyAgICAgICAgZSA9IERlY2ltYWwoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCisKKyAgICBAcmVxdWlyZXNfSUVFRV83NTQKKyAgICBkZWYgdGVzdF9leHBsaWNpdF9mcm9tX2Zsb2F0KHNlbGYpOgorICAgICAgICByID0gRGVjaW1hbCgwLjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyKSwgRGVjaW1hbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIociksCisgICAgICAgICAgICAgICAgJzAuMTAwMDAwMDAwMDAwMDAwMDA1NTUxMTE1MTIzMTI1NzgyNzAyMTE4MTU4MzQwNDU0MTAxNTYyNScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEZWNpbWFsKGZsb2F0KCduYW4nKSkuaXNfcW5hbigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRGVjaW1hbChmbG9hdCgnaW5mJykpLmlzX2luZmluaXRlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEZWNpbWFsKGZsb2F0KCctaW5mJykpLmlzX2luZmluaXRlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwoZmxvYXQoJ25hbicpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKERlY2ltYWwoJ05hTicpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRGVjaW1hbChmbG9hdCgnaW5mJykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoRGVjaW1hbCgnSW5maW5pdHknKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwoZmxvYXQoJy1pbmYnKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihEZWNpbWFsKCctSW5maW5pdHknKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwoZmxvYXQoJy0wLjAnKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihEZWNpbWFsKCctMCcpKSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjAwKToKKyAgICAgICAgICAgIHggPSByYW5kb20uZXhwb3ZhcmlhdGUoMC4wMSkgKiAocmFuZG9tLnJhbmRvbSgpICogMi4wIC0gMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBmbG9hdChEZWNpbWFsKHgpKSkgIyByb3VuZHRyaXAKKworICAgIGRlZiB0ZXN0X2V4cGxpY2l0X2NvbnRleHRfY3JlYXRlX2RlY2ltYWwoc2VsZik6CisKKyAgICAgICAgbmMgPSBjb3B5LmNvcHkoZ2V0Y29udGV4dCgpKQorICAgICAgICBuYy5wcmVjID0gMworCisgICAgICAgICMgZW1wdHkKKyAgICAgICAgZCA9IERlY2ltYWwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJzAnKQorICAgICAgICBkID0gbmMuY3JlYXRlX2RlY2ltYWwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJzAnKQorCisgICAgICAgICMgZnJvbSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbmMuY3JlYXRlX2RlY2ltYWwsIE5vbmUpCisKKyAgICAgICAgIyBmcm9tIGludAorICAgICAgICBkID0gbmMuY3JlYXRlX2RlY2ltYWwoNDU2KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZCwgRGVjaW1hbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYy5jcmVhdGVfZGVjaW1hbCg0NTY3OCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbmMuY3JlYXRlX2RlY2ltYWwoJzQ1N0UrMicpKQorCisgICAgICAgICMgZnJvbSBzdHJpbmcKKyAgICAgICAgZCA9IERlY2ltYWwoJzQ1Njc4OScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGQpLCAnNDU2Nzg5JykKKyAgICAgICAgZCA9IG5jLmNyZWF0ZV9kZWNpbWFsKCc0NTY3ODknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJzQuNTdFKzUnKQorICAgICAgICAjIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugc2hvdWxkIHJlc3VsdCBpbiBhIE5hTjsKKyAgICAgICAgIyBzcGFjZXMgYXJlIGFscmVhZHkgY2hlY2tlZCBpbiBDb3dsaXNoYXcncyB0ZXN0LXN1aXRlLCBzbworICAgICAgICAjIGhlcmUgd2UganVzdCBjaGVjayB0aGF0IGEgdHJhaWxpbmcgbmV3bGluZSByZXN1bHRzIGluIGEgTmFOCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG5jLmNyZWF0ZV9kZWNpbWFsKCczLjE0XG4nKSksICdOYU4nKQorCisgICAgICAgICMgZnJvbSB0dXBsZXMKKyAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoNCwgMywgNCwgOSwgMSwgMywgNSwgMywgNCksIC0yNSkgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJy00LjM0OTEzNTM0RS0xNycpCisgICAgICAgIGQgPSBuYy5jcmVhdGVfZGVjaW1hbCggKDEsICg0LCAzLCA0LCA5LCAxLCAzLCA1LCAzLCA0KSwgLTI1KSApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGQpLCAnLTQuMzVFLTE3JykKKworICAgICAgICAjIGZyb20gRGVjaW1hbAorICAgICAgICBwcmV2ZGVjID0gRGVjaW1hbCg1MDAwMDAxMjMpCisgICAgICAgIGQgPSBEZWNpbWFsKHByZXZkZWMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGQpLCAnNTAwMDAwMTIzJykKKyAgICAgICAgZCA9IG5jLmNyZWF0ZV9kZWNpbWFsKHByZXZkZWMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGQpLCAnNS4wMEUrOCcpCisKKyAgICBkZWYgdGVzdF91bmljb2RlX2RpZ2l0cyhzZWxmKToKKyAgICAgICAgdGVzdF92YWx1ZXMgPSB7CisgICAgICAgICAgICB1J1x1ZmYxMSc6ICcxJywKKyAgICAgICAgICAgIHUnXHUwNjYwLlx1MDY2MFx1MDY2M1x1MDY2N1x1MDY2MmUtXHUwNjYzJyA6ICcwLjAwMDAzNzInLAorICAgICAgICAgICAgdSctbmFuXHUwYzY4XHUwYzZhXHUwYzY2XHUwYzY2JyA6ICctTmFOMjQwMCcsCisgICAgICAgICAgICB9CisgICAgICAgIGZvciBpbnB1dCwgZXhwZWN0ZWQgaW4gdGVzdF92YWx1ZXMuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwoaW5wdXQpKSwgZXhwZWN0ZWQpCisKKworY2xhc3MgRGVjaW1hbEltcGxpY2l0Q29uc3RydWN0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgJycnVW5pdCB0ZXN0cyBmb3IgSW1wbGljaXQgQ29uc3RydWN0aW9uIGNhc2VzIG9mIERlY2ltYWwuJycnCisKKyAgICBkZWYgdGVzdF9pbXBsaWNpdF9mcm9tX05vbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCwgJ0RlY2ltYWwoNSkgKyBOb25lJywgZ2xvYmFscygpKQorCisgICAgZGVmIHRlc3RfaW1wbGljaXRfZnJvbV9pbnQoc2VsZik6CisgICAgICAgICNub3JtYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRGVjaW1hbCg1KSArIDQ1KSwgJzUwJykKKyAgICAgICAgI2V4Y2VlZGluZyBwcmVjaXNpb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDUpICsgMTIzNDU2Nzg5MDAwLCBEZWNpbWFsKDEyMzQ1Njc4OTAwMCkpCisKKyAgICBkZWYgdGVzdF9pbXBsaWNpdF9mcm9tX3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCAnRGVjaW1hbCg1KSArICIzIicsIGdsb2JhbHMoKSkKKworICAgIGRlZiB0ZXN0X2ltcGxpY2l0X2Zyb21fZmxvYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCwgJ0RlY2ltYWwoNSkgKyAyLjInLCBnbG9iYWxzKCkpCisKKyAgICBkZWYgdGVzdF9pbXBsaWNpdF9mcm9tX0RlY2ltYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCg1KSArIERlY2ltYWwoNDUpLCBEZWNpbWFsKDUwKSkKKworICAgIGRlZiB0ZXN0X3JvcChzZWxmKToKKyAgICAgICAgIyBBbGxvdyBvdGhlciBjbGFzc2VzIHRvIGJlIHRyYWluZWQgdG8gaW50ZXJhY3Qgd2l0aCBEZWNpbWFscworICAgICAgICBjbGFzcyBFOgorICAgICAgICAgICAgZGVmIF9fZGl2bW9kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAnZGl2bW9kICcgKyBzdHIob3RoZXIpCisgICAgICAgICAgICBkZWYgX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdHIob3RoZXIpICsgJyByZGl2bW9kJworICAgICAgICAgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdsdCAnICsgc3RyKG90aGVyKQorICAgICAgICAgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdndCAnICsgc3RyKG90aGVyKQorICAgICAgICAgICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdsZSAnICsgc3RyKG90aGVyKQorICAgICAgICAgICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdnZSAnICsgc3RyKG90aGVyKQorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdlcSAnICsgc3RyKG90aGVyKQorICAgICAgICAgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICduZSAnICsgc3RyKG90aGVyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKEUoKSwgRGVjaW1hbCgxMCkpLCAnZGl2bW9kIDEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXZtb2QoRGVjaW1hbCgxMCksIEUoKSksICcxMCByZGl2bW9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdEZWNpbWFsKDEwKSA8IEUoKScpLCAnZ3QgMTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ0RlY2ltYWwoMTApID4gRSgpJyksICdsdCAxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnRGVjaW1hbCgxMCkgPD0gRSgpJyksICdnZSAxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnRGVjaW1hbCgxMCkgPj0gRSgpJyksICdsZSAxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnRGVjaW1hbCgxMCkgPT0gRSgpJyksICdlcSAxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnRGVjaW1hbCgxMCkgIT0gRSgpJyksICduZSAxMCcpCisKKyAgICAgICAgIyBpbnNlcnQgb3BlcmF0b3IgbWV0aG9kcyBhbmQgdGhlbiBleGVyY2lzZSB0aGVtCisgICAgICAgIG9wbGlzdCA9IFsKKyAgICAgICAgICAgICgnKycsICdfX2FkZF9fJywgJ19fcmFkZF9fJyksCisgICAgICAgICAgICAoJy0nLCAnX19zdWJfXycsICdfX3JzdWJfXycpLAorICAgICAgICAgICAgKCcqJywgJ19fbXVsX18nLCAnX19ybXVsX18nKSwKKyAgICAgICAgICAgICgnJScsICdfX21vZF9fJywgJ19fcm1vZF9fJyksCisgICAgICAgICAgICAoJy8vJywgJ19fZmxvb3JkaXZfXycsICdfX3JmbG9vcmRpdl9fJyksCisgICAgICAgICAgICAoJyoqJywgJ19fcG93X18nLCAnX19ycG93X18nKQorICAgICAgICBdCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgaWYgMSAvIDIgPT0gMDoKKyAgICAgICAgICAgICAgICAjIHRlc3Rpbmcgd2l0aCBjbGFzc2ljIGRpdmlzaW9uLCBzbyBhZGQgX19kaXZfXworICAgICAgICAgICAgICAgIG9wbGlzdC5hcHBlbmQoKCcvJywgJ19fZGl2X18nLCAnX19yZGl2X18nKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyB0ZXN0aW5nIHdpdGggLVFuZXcsIHNvIGFkZCBfX3RydWVkaXZfXworICAgICAgICAgICAgICAgIG9wbGlzdC5hcHBlbmQoKCcvJywgJ19fdHJ1ZWRpdl9fJywgJ19fcnRydWVkaXZfXycpKQorCisgICAgICAgIGZvciBzeW0sIGxvcCwgcm9wIGluIG9wbGlzdDoKKyAgICAgICAgICAgIHNldGF0dHIoRSwgbG9wLCBsYW1iZGEgc2VsZiwgb3RoZXI6ICdzdHInICsgbG9wICsgc3RyKG90aGVyKSkKKyAgICAgICAgICAgIHNldGF0dHIoRSwgcm9wLCBsYW1iZGEgc2VsZiwgb3RoZXI6IHN0cihvdGhlcikgKyByb3AgKyAnc3RyJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnRSgpJyArIHN5bSArICdEZWNpbWFsKDEwKScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyJyArIGxvcCArICcxMCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ0RlY2ltYWwoMTApJyArIHN5bSArICdFKCknKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEwJyArIHJvcCArICdzdHInKQorCisKK2NsYXNzIERlY2ltYWxGb3JtYXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAnJydVbml0IHRlc3RzIGZvciB0aGUgZm9ybWF0IGZ1bmN0aW9uLicnJworICAgIGRlZiB0ZXN0X2Zvcm1hdHRpbmcoc2VsZik6CisgICAgICAgICMgdHJpcGxlcyBnaXZpbmcgYSBmb3JtYXQsIGEgRGVjaW1hbCwgYW5kIHRoZSBleHBlY3RlZCByZXN1bHQKKyAgICAgICAgdGVzdF92YWx1ZXMgPSBbCisgICAgICAgICAgICAoJ2UnLCAnMEUtMTUnLCAnMGUtMTUnKSwKKyAgICAgICAgICAgICgnZScsICcyLjNFLTE1JywgJzIuM2UtMTUnKSwKKyAgICAgICAgICAgICgnZScsICcyLjMwRSsyJywgJzIuMzBlKzInKSwgIyBwcmVzZXJ2ZSBzaWduaWZpY2FudCB6ZXJvcworICAgICAgICAgICAgKCdlJywgJzIuMzAwMDBFLTE1JywgJzIuMzAwMDBlLTE1JyksCisgICAgICAgICAgICAoJ2UnLCAnMS4yMzQ1Njc4OTEyMzQ1Njc4OWU0MCcsICcxLjIzNDU2Nzg5MTIzNDU2Nzg5ZSs0MCcpLAorICAgICAgICAgICAgKCdlJywgJzEuNScsICcxLjVlKzAnKSwKKyAgICAgICAgICAgICgnZScsICcwLjE1JywgJzEuNWUtMScpLAorICAgICAgICAgICAgKCdlJywgJzAuMDE1JywgJzEuNWUtMicpLAorICAgICAgICAgICAgKCdlJywgJzAuMDAwMDAwMDAwMDAxNScsICcxLjVlLTEyJyksCisgICAgICAgICAgICAoJ2UnLCAnMTUuMCcsICcxLjUwZSsxJyksCisgICAgICAgICAgICAoJ2UnLCAnLTE1JywgJy0xLjVlKzEnKSwKKyAgICAgICAgICAgICgnZScsICcwJywgJzBlKzAnKSwKKyAgICAgICAgICAgICgnZScsICcwRTEnLCAnMGUrMScpLAorICAgICAgICAgICAgKCdlJywgJzAuMCcsICcwZS0xJyksCisgICAgICAgICAgICAoJ2UnLCAnMC4wMCcsICcwZS0yJyksCisgICAgICAgICAgICAoJy42ZScsICcwRS0xNScsICcwLjAwMDAwMGUtOScpLAorICAgICAgICAgICAgKCcuNmUnLCAnMCcsICcwLjAwMDAwMGUrNicpLAorICAgICAgICAgICAgKCcuNmUnLCAnOS45OTk5OTknLCAnOS45OTk5OTllKzAnKSwKKyAgICAgICAgICAgICgnLjZlJywgJzkuOTk5OTk5OScsICcxLjAwMDAwMGUrMScpLAorICAgICAgICAgICAgKCcuNmUnLCAnLTEuMjNlNScsICctMS4yMzAwMDBlKzUnKSwKKyAgICAgICAgICAgICgnLjZlJywgJzEuMjM0NTY3ODllLTMnLCAnMS4yMzQ1NjhlLTMnKSwKKyAgICAgICAgICAgICgnZicsICcwJywgJzAnKSwKKyAgICAgICAgICAgICgnZicsICcwLjAnLCAnMC4wJyksCisgICAgICAgICAgICAoJ2YnLCAnMEUtMicsICcwLjAwJyksCisgICAgICAgICAgICAoJ2YnLCAnMC4wMEUtOCcsICcwLjAwMDAwMDAwMDAnKSwKKyAgICAgICAgICAgICgnZicsICcwRTEnLCAnMCcpLCAjIGxvc2VzIGV4cG9uZW50IGluZm9ybWF0aW9uCisgICAgICAgICAgICAoJ2YnLCAnMy4yRTEnLCAnMzInKSwKKyAgICAgICAgICAgICgnZicsICczLjJFMicsICczMjAnKSwKKyAgICAgICAgICAgICgnZicsICczLjIwRTInLCAnMzIwJyksCisgICAgICAgICAgICAoJ2YnLCAnMy4yMDBFMicsICczMjAuMCcpLAorICAgICAgICAgICAgKCdmJywgJzMuMkUtNicsICcwLjAwMDAwMzInKSwKKyAgICAgICAgICAgICgnLjZmJywgJzBFLTE1JywgJzAuMDAwMDAwJyksICMgYWxsIHplcm9zIHRyZWF0ZWQgZXF1YWxseQorICAgICAgICAgICAgKCcuNmYnLCAnMEUxJywgJzAuMDAwMDAwJyksCisgICAgICAgICAgICAoJy42ZicsICcwJywgJzAuMDAwMDAwJyksCisgICAgICAgICAgICAoJy4wZicsICcwJywgJzAnKSwgIyBubyBkZWNpbWFsIHBvaW50CisgICAgICAgICAgICAoJy4wZicsICcwZS0yJywgJzAnKSwKKyAgICAgICAgICAgICgnLjBmJywgJzMuMTQxNTkyNjUnLCAnMycpLAorICAgICAgICAgICAgKCcuMWYnLCAnMy4xNDE1OTI2NScsICczLjEnKSwKKyAgICAgICAgICAgICgnLjRmJywgJzMuMTQxNTkyNjUnLCAnMy4xNDE2JyksCisgICAgICAgICAgICAoJy42ZicsICczLjE0MTU5MjY1JywgJzMuMTQxNTkzJyksCisgICAgICAgICAgICAoJy43ZicsICczLjE0MTU5MjY1JywgJzMuMTQxNTkyNicpLCAjIHJvdW5kLWhhbGYtZXZlbiEKKyAgICAgICAgICAgICgnLjhmJywgJzMuMTQxNTkyNjUnLCAnMy4xNDE1OTI2NScpLAorICAgICAgICAgICAgKCcuOWYnLCAnMy4xNDE1OTI2NScsICczLjE0MTU5MjY1MCcpLAorCisgICAgICAgICAgICAoJ2cnLCAnMCcsICcwJyksCisgICAgICAgICAgICAoJ2cnLCAnMC4wJywgJzAuMCcpLAorICAgICAgICAgICAgKCdnJywgJzBFMScsICcwZSsxJyksCisgICAgICAgICAgICAoJ0cnLCAnMEUxJywgJzBFKzEnKSwKKyAgICAgICAgICAgICgnZycsICcwRS01JywgJzAuMDAwMDAnKSwKKyAgICAgICAgICAgICgnZycsICcwRS02JywgJzAuMDAwMDAwJyksCisgICAgICAgICAgICAoJ2cnLCAnMEUtNycsICcwZS03JyksCisgICAgICAgICAgICAoJ2cnLCAnLTBFMicsICctMGUrMicpLAorICAgICAgICAgICAgKCcuMGcnLCAnMy4xNDE1OTI2NScsICczJyksICAjIDAgc2lnIGZpZyAtPiAxIHNpZyBmaWcKKyAgICAgICAgICAgICgnLjFnJywgJzMuMTQxNTkyNjUnLCAnMycpLAorICAgICAgICAgICAgKCcuMmcnLCAnMy4xNDE1OTI2NScsICczLjEnKSwKKyAgICAgICAgICAgICgnLjVnJywgJzMuMTQxNTkyNjUnLCAnMy4xNDE2JyksCisgICAgICAgICAgICAoJy43ZycsICczLjE0MTU5MjY1JywgJzMuMTQxNTkzJyksCisgICAgICAgICAgICAoJy44ZycsICczLjE0MTU5MjY1JywgJzMuMTQxNTkyNicpLCAjIHJvdW5kLWhhbGYtZXZlbiEKKyAgICAgICAgICAgICgnLjlnJywgJzMuMTQxNTkyNjUnLCAnMy4xNDE1OTI2NScpLAorICAgICAgICAgICAgKCcuMTBnJywgJzMuMTQxNTkyNjUnLCAnMy4xNDE1OTI2NScpLCAjIGRvbid0IHBhZAorCisgICAgICAgICAgICAoJyUnLCAnMEUxJywgJzAlJyksCisgICAgICAgICAgICAoJyUnLCAnMEUwJywgJzAlJyksCisgICAgICAgICAgICAoJyUnLCAnMEUtMScsICcwJScpLAorICAgICAgICAgICAgKCclJywgJzBFLTInLCAnMCUnKSwKKyAgICAgICAgICAgICgnJScsICcwRS0zJywgJzAuMCUnKSwKKyAgICAgICAgICAgICgnJScsICcwRS00JywgJzAuMDAlJyksCisKKyAgICAgICAgICAgICgnLjMlJywgJzAnLCAnMC4wMDAlJyksICMgYWxsIHplcm9zIHRyZWF0ZWQgZXF1YWxseQorICAgICAgICAgICAgKCcuMyUnLCAnMEUxMCcsICcwLjAwMCUnKSwKKyAgICAgICAgICAgICgnLjMlJywgJzBFLTEwJywgJzAuMDAwJScpLAorICAgICAgICAgICAgKCcuMyUnLCAnMi4zNCcsICcyMzQuMDAwJScpLAorICAgICAgICAgICAgKCcuMyUnLCAnMS4yMzQ1NjcnLCAnMTIzLjQ1NyUnKSwKKyAgICAgICAgICAgICgnLjAlJywgJzEuMjMnLCAnMTIzJScpLAorCisgICAgICAgICAgICAoJ2UnLCAnTmFOJywgJ05hTicpLAorICAgICAgICAgICAgKCdmJywgJy1OYU4xMjMnLCAnLU5hTjEyMycpLAorICAgICAgICAgICAgKCcrZycsICdOYU40NTYnLCAnK05hTjQ1NicpLAorICAgICAgICAgICAgKCcuM2UnLCAnSW5mJywgJ0luZmluaXR5JyksCisgICAgICAgICAgICAoJy4xNmYnLCAnLUluZicsICctSW5maW5pdHknKSwKKyAgICAgICAgICAgICgnLjBnJywgJy1zTmFOJywgJy1zTmFOJyksCisKKyAgICAgICAgICAgICgnJywgJzEuMDAnLCAnMS4wMCcpLAorCisgICAgICAgICAgICAjIHRlc3QgYWxpZ25tZW50IGFuZCBwYWRkaW5nCisgICAgICAgICAgICAoJzYnLCAnMTIzJywgJyAgIDEyMycpLAorICAgICAgICAgICAgKCc8NicsICcxMjMnLCAnMTIzICAgJyksCisgICAgICAgICAgICAoJz42JywgJzEyMycsICcgICAxMjMnKSwKKyAgICAgICAgICAgICgnXjYnLCAnMTIzJywgJyAxMjMgICcpLAorICAgICAgICAgICAgKCc9KzYnLCAnMTIzJywgJysgIDEyMycpLAorICAgICAgICAgICAgKCcjPDEwJywgJ05hTicsICdOYU4jIyMjIyMjJyksCisgICAgICAgICAgICAoJyM8MTAnLCAnLTQuMycsICctNC4zIyMjIyMjJyksCisgICAgICAgICAgICAoJyM8KzEwJywgJzAuMDEzMCcsICcrMC4wMTMwIyMjJyksCisgICAgICAgICAgICAoJyM8IDEwJywgJzAuMDEzMCcsICcgMC4wMTMwIyMjJyksCisgICAgICAgICAgICAoJ0A+MTAnLCAnLUluZicsICdALUluZmluaXR5JyksCisgICAgICAgICAgICAoJyM+NScsICctSW5mJywgJy1JbmZpbml0eScpLAorICAgICAgICAgICAgKCc/XjUnLCAnMTIzJywgJz8xMjM/JyksCisgICAgICAgICAgICAoJyVeNicsICcxMjMnLCAnJTEyMyUlJyksCisgICAgICAgICAgICAoJyBeNicsICctNDUuNicsICctNDUuNiAnKSwKKyAgICAgICAgICAgICgnLz0xMCcsICctNDUuNicsICctLy8vLy80NS42JyksCisgICAgICAgICAgICAoJy89KzEwJywgJzQ1LjYnLCAnKy8vLy8vNDUuNicpLAorICAgICAgICAgICAgKCcvPSAxMCcsICc0NS42JywgJyAvLy8vLzQ1LjYnKSwKKworICAgICAgICAgICAgIyB0aG91c2FuZHMgc2VwYXJhdG9yCisgICAgICAgICAgICAoJywnLCAnMTIzNDU2NycsICcxLDIzNCw1NjcnKSwKKyAgICAgICAgICAgICgnLCcsICcxMjM0NTYnLCAnMTIzLDQ1NicpLAorICAgICAgICAgICAgKCcsJywgJzEyMzQ1JywgJzEyLDM0NScpLAorICAgICAgICAgICAgKCcsJywgJzEyMzQnLCAnMSwyMzQnKSwKKyAgICAgICAgICAgICgnLCcsICcxMjMnLCAnMTIzJyksCisgICAgICAgICAgICAoJywnLCAnMTInLCAnMTInKSwKKyAgICAgICAgICAgICgnLCcsICcxJywgJzEnKSwKKyAgICAgICAgICAgICgnLCcsICcwJywgJzAnKSwKKyAgICAgICAgICAgICgnLCcsICctMTIzNDU2NycsICctMSwyMzQsNTY3JyksCisgICAgICAgICAgICAoJywnLCAnLTEyMzQ1NicsICctMTIzLDQ1NicpLAorICAgICAgICAgICAgKCc3LCcsICcxMjM0NTYnLCAnMTIzLDQ1NicpLAorICAgICAgICAgICAgKCc4LCcsICcxMjM0NTYnLCAnIDEyMyw0NTYnKSwKKyAgICAgICAgICAgICgnMDgsJywgJzEyMzQ1NicsICcwLDEyMyw0NTYnKSwgIyBzcGVjaWFsIGNhc2U6IGV4dHJhIDAgbmVlZGVkCisgICAgICAgICAgICAoJyswOCwnLCAnMTIzNDU2JywgJysxMjMsNDU2JyksICMgYnV0IG5vdCBpZiB0aGVyZSdzIGEgc2lnbgorICAgICAgICAgICAgKCcgMDgsJywgJzEyMzQ1NicsICcgMTIzLDQ1NicpLAorICAgICAgICAgICAgKCcwOCwnLCAnLTEyMzQ1NicsICctMTIzLDQ1NicpLAorICAgICAgICAgICAgKCcrMDksJywgJzEyMzQ1NicsICcrMCwxMjMsNDU2JyksCisgICAgICAgICAgICAjIC4uLiB3aXRoIGZyYWN0aW9uYWwgcGFydC4uLgorICAgICAgICAgICAgKCcwNywnLCAnMTIzNC41NicsICcxLDIzNC41NicpLAorICAgICAgICAgICAgKCcwOCwnLCAnMTIzNC41NicsICcxLDIzNC41NicpLAorICAgICAgICAgICAgKCcwOSwnLCAnMTIzNC41NicsICcwMSwyMzQuNTYnKSwKKyAgICAgICAgICAgICgnMDEwLCcsICcxMjM0LjU2JywgJzAwMSwyMzQuNTYnKSwKKyAgICAgICAgICAgICgnMDExLCcsICcxMjM0LjU2JywgJzAsMDAxLDIzNC41NicpLAorICAgICAgICAgICAgKCcwMTIsJywgJzEyMzQuNTYnLCAnMCwwMDEsMjM0LjU2JyksCisgICAgICAgICAgICAoJzA4LC4xZicsICcxMjM0LjUnLCAnMDEsMjM0LjUnKSwKKyAgICAgICAgICAgICMgbm8gdGhvdXNhbmRzIHNlcGFyYXRvcnMgaW4gZnJhY3Rpb24gcGFydAorICAgICAgICAgICAgKCcsJywgJzEuMjM0NTY3ODknLCAnMS4yMzQ1Njc4OScpLAorICAgICAgICAgICAgKCcsJScsICcxMjMuNDU2Nzg5JywgJzEyLDM0NS42Nzg5JScpLAorICAgICAgICAgICAgKCcsZScsICcxMjM0NTYnLCAnMS4yMzQ1NmUrNScpLAorICAgICAgICAgICAgKCcsRScsICcxMjM0NTYnLCAnMS4yMzQ1NkUrNScpLAorCisgICAgICAgICAgICAjIGlzc3VlIDY4NTAKKyAgICAgICAgICAgICgnYT0tNy4wJywgJzAuMTIzNDUnLCAnYWFhYTAuMScpLAorICAgICAgICAgICAgXQorICAgICAgICBmb3IgZm10LCBkLCByZXN1bHQgaW4gdGVzdF92YWx1ZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdChEZWNpbWFsKGQpLCBmbXQpLCByZXN1bHQpCisKKyAgICBkZWYgdGVzdF9uX2Zvcm1hdChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBsb2NhbGUgaW1wb3J0IENIQVJfTUFYCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgU2V0IHVwIHNvbWUgbG9jYWxlY29udi1saWtlIGRpY3Rpb25hcmllcworICAgICAgICBlbl9VUyA9IHsKKyAgICAgICAgICAgICdkZWNpbWFsX3BvaW50JyA6ICcuJywKKyAgICAgICAgICAgICdncm91cGluZycgOiBbMywgMywgMF0sCisgICAgICAgICAgICAndGhvdXNhbmRzX3NlcCc6ICcsJworICAgICAgICAgICAgfQorCisgICAgICAgIGZyX0ZSID0geworICAgICAgICAgICAgJ2RlY2ltYWxfcG9pbnQnIDogJywnLAorICAgICAgICAgICAgJ2dyb3VwaW5nJyA6IFtDSEFSX01BWF0sCisgICAgICAgICAgICAndGhvdXNhbmRzX3NlcCcgOiAnJworICAgICAgICAgICAgfQorCisgICAgICAgIHJ1X1JVID0geworICAgICAgICAgICAgJ2RlY2ltYWxfcG9pbnQnIDogJywnLAorICAgICAgICAgICAgJ2dyb3VwaW5nJyA6IFszLCAzLCAwXSwKKyAgICAgICAgICAgICd0aG91c2FuZHNfc2VwJyA6ICcgJworICAgICAgICAgICAgfQorCisgICAgICAgIGNyYXp5ID0geworICAgICAgICAgICAgJ2RlY2ltYWxfcG9pbnQnIDogJyYnLAorICAgICAgICAgICAgJ2dyb3VwaW5nJyA6IFsxLCA0LCAyLCBDSEFSX01BWF0sCisgICAgICAgICAgICAndGhvdXNhbmRzX3NlcCcgOiAnLScKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIGRlZiBnZXRfZm10KHgsIGxvY2FsZSwgZm10PSduJyk6CisgICAgICAgICAgICByZXR1cm4gRGVjaW1hbC5fX2Zvcm1hdF9fKERlY2ltYWwoeCksIGZtdCwgX2xvY2FsZWNvbnY9bG9jYWxlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdChEZWNpbWFsKCcxMi43JyksIGVuX1VTKSwgJzEyLjcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoRGVjaW1hbCgnMTIuNycpLCBmcl9GUiksICcxMiw3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KERlY2ltYWwoJzEyLjcnKSwgcnVfUlUpLCAnMTIsNycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdChEZWNpbWFsKCcxMi43JyksIGNyYXp5KSwgJzEtMiY3JykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDU2Nzg5LCBlbl9VUyksICcxMjMsNDU2LDc4OScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NTY3ODksIGZyX0ZSKSwgJzEyMzQ1Njc4OScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NTY3ODksIHJ1X1JVKSwgJzEyMyA0NTYgNzg5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1Njc4OTAxMjMsIGNyYXp5KSwgJzEyMzQ1Ni03OC05MDEyLTMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NTY3ODksIGVuX1VTLCAnLjZuJyksICcxLjIzNDU3ZSs4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1Njc4OSwgZnJfRlIsICcuNm4nKSwgJzEsMjM0NTdlKzgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDU2Nzg5LCBydV9SVSwgJy42bicpLCAnMSwyMzQ1N2UrOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NTY3ODksIGNyYXp5LCAnLjZuJyksICcxJjIzNDU3ZSs4JykKKworICAgICAgICAjIHplcm8gcGFkZGluZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNCwgZnJfRlIsICcwM24nKSwgJzEyMzQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNCwgZnJfRlIsICcwNG4nKSwgJzEyMzQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNCwgZnJfRlIsICcwNW4nKSwgJzAxMjM0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQsIGZyX0ZSLCAnMDZuJyksICcwMDEyMzQnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NSwgZW5fVVMsICcwNW4nKSwgJzEyLDM0NScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NSwgZW5fVVMsICcwNm4nKSwgJzEyLDM0NScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NSwgZW5fVVMsICcwN24nKSwgJzAxMiwzNDUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDUsIGVuX1VTLCAnMDhuJyksICcwLDAxMiwzNDUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDUsIGVuX1VTLCAnMDluJyksICcwLDAxMiwzNDUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDUsIGVuX1VTLCAnMDEwbicpLCAnMDAsMDEyLDM0NScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1NiwgY3JhenksICcwNm4nKSwgJzEtMjM0NS02JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1NiwgY3JhenksICcwN24nKSwgJzEtMjM0NS02JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1NiwgY3JhenksICcwOG4nKSwgJzEtMjM0NS02JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1NiwgY3JhenksICcwOW4nKSwgJzAxLTIzNDUtNicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NTYsIGNyYXp5LCAnMDEwbicpLCAnMC0wMS0yMzQ1LTYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDU2LCBjcmF6eSwgJzAxMW4nKSwgJzAtMDEtMjM0NS02JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1NiwgY3JhenksICcwMTJuJyksICcwMC0wMS0yMzQ1LTYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDU2LCBjcmF6eSwgJzAxM24nKSwgJzAwMC0wMS0yMzQ1LTYnKQorCisKK2NsYXNzIERlY2ltYWxBcml0aG1ldGljT3BlcmF0b3JzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgJycnVW5pdCB0ZXN0cyBmb3IgYWxsIGFyaXRobWV0aWMgb3BlcmF0b3JzLCBiaW5hcnkgYW5kIHVuYXJ5LicnJworCisgICAgZGVmIHRlc3RfYWRkaXRpb24oc2VsZik6CisKKyAgICAgICAgZDEgPSBEZWNpbWFsKCctMTEuMScpCisgICAgICAgIGQyID0gRGVjaW1hbCgnMjIuMicpCisKKyAgICAgICAgI3R3byBEZWNpbWFscworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxK2QyLCBEZWNpbWFsKCcxMS4xJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIrZDEsIERlY2ltYWwoJzExLjEnKSkKKworICAgICAgICAjd2l0aCBvdGhlciB0eXBlLCBsZWZ0CisgICAgICAgIGMgPSBkMSArIDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBEZWNpbWFsKCctNi4xJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShjKSwgdHlwZShkMSkpCisKKyAgICAgICAgI3dpdGggb3RoZXIgdHlwZSwgcmlnaHQKKyAgICAgICAgYyA9IDUgKyBkMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIERlY2ltYWwoJy02LjEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGMpLCB0eXBlKGQxKSkKKworICAgICAgICAjaW5saW5lIHdpdGggZGVjaW1hbAorICAgICAgICBkMSArPSBkMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCBEZWNpbWFsKCcxMS4xJykpCisKKyAgICAgICAgI2lubGluZSB3aXRoIG90aGVyIHR5cGUKKyAgICAgICAgZDEgKz0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCBEZWNpbWFsKCcxNi4xJykpCisKKyAgICBkZWYgdGVzdF9zdWJ0cmFjdGlvbihzZWxmKToKKworICAgICAgICBkMSA9IERlY2ltYWwoJy0xMS4xJykKKyAgICAgICAgZDIgPSBEZWNpbWFsKCcyMi4yJykKKworICAgICAgICAjdHdvIERlY2ltYWxzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEtZDIsIERlY2ltYWwoJy0zMy4zJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDItZDEsIERlY2ltYWwoJzMzLjMnKSkKKworICAgICAgICAjd2l0aCBvdGhlciB0eXBlLCBsZWZ0CisgICAgICAgIGMgPSBkMSAtIDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBEZWNpbWFsKCctMTYuMScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYyksIHR5cGUoZDEpKQorCisgICAgICAgICN3aXRoIG90aGVyIHR5cGUsIHJpZ2h0CisgICAgICAgIGMgPSA1IC0gZDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBEZWNpbWFsKCcxNi4xJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShjKSwgdHlwZShkMSkpCisKKyAgICAgICAgI2lubGluZSB3aXRoIGRlY2ltYWwKKyAgICAgICAgZDEgLT0gZDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgRGVjaW1hbCgnLTMzLjMnKSkKKworICAgICAgICAjaW5saW5lIHdpdGggb3RoZXIgdHlwZQorICAgICAgICBkMSAtPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIERlY2ltYWwoJy0zOC4zJykpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsaWNhdGlvbihzZWxmKToKKworICAgICAgICBkMSA9IERlY2ltYWwoJy01JykKKyAgICAgICAgZDIgPSBEZWNpbWFsKCczJykKKworICAgICAgICAjdHdvIERlY2ltYWxzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEqZDIsIERlY2ltYWwoJy0xNScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyKmQxLCBEZWNpbWFsKCctMTUnKSkKKworICAgICAgICAjd2l0aCBvdGhlciB0eXBlLCBsZWZ0CisgICAgICAgIGMgPSBkMSAqIDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBEZWNpbWFsKCctMjUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGMpLCB0eXBlKGQxKSkKKworICAgICAgICAjd2l0aCBvdGhlciB0eXBlLCByaWdodAorICAgICAgICBjID0gNSAqIGQxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgRGVjaW1hbCgnLTI1JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShjKSwgdHlwZShkMSkpCisKKyAgICAgICAgI2lubGluZSB3aXRoIGRlY2ltYWwKKyAgICAgICAgZDEgKj0gZDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgRGVjaW1hbCgnLTE1JykpCisKKyAgICAgICAgI2lubGluZSB3aXRoIG90aGVyIHR5cGUKKyAgICAgICAgZDEgKj0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCBEZWNpbWFsKCctNzUnKSkKKworICAgIGRlZiB0ZXN0X2RpdmlzaW9uKHNlbGYpOgorCisgICAgICAgIGQxID0gRGVjaW1hbCgnLTUnKQorICAgICAgICBkMiA9IERlY2ltYWwoJzInKQorCisgICAgICAgICN0d28gRGVjaW1hbHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS9kMiwgRGVjaW1hbCgnLTIuNScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyL2QxLCBEZWNpbWFsKCctMC40JykpCisKKyAgICAgICAgI3dpdGggb3RoZXIgdHlwZSwgbGVmdAorICAgICAgICBjID0gZDEgLyA0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgRGVjaW1hbCgnLTEuMjUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGMpLCB0eXBlKGQxKSkKKworICAgICAgICAjd2l0aCBvdGhlciB0eXBlLCByaWdodAorICAgICAgICBjID0gNCAvIGQxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgRGVjaW1hbCgnLTAuOCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYyksIHR5cGUoZDEpKQorCisgICAgICAgICNpbmxpbmUgd2l0aCBkZWNpbWFsCisgICAgICAgIGQxIC89IGQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIERlY2ltYWwoJy0yLjUnKSkKKworICAgICAgICAjaW5saW5lIHdpdGggb3RoZXIgdHlwZQorICAgICAgICBkMSAvPSA0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIERlY2ltYWwoJy0wLjYyNScpKQorCisgICAgZGVmIHRlc3RfZmxvb3JfZGl2aXNpb24oc2VsZik6CisKKyAgICAgICAgZDEgPSBEZWNpbWFsKCc1JykKKyAgICAgICAgZDIgPSBEZWNpbWFsKCcyJykKKworICAgICAgICAjdHdvIERlY2ltYWxzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEvL2QyLCBEZWNpbWFsKCcyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIvL2QxLCBEZWNpbWFsKCcwJykpCisKKyAgICAgICAgI3dpdGggb3RoZXIgdHlwZSwgbGVmdAorICAgICAgICBjID0gZDEgLy8gNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIERlY2ltYWwoJzEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGMpLCB0eXBlKGQxKSkKKworICAgICAgICAjd2l0aCBvdGhlciB0eXBlLCByaWdodAorICAgICAgICBjID0gNyAvLyBkMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIERlY2ltYWwoJzEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGMpLCB0eXBlKGQxKSkKKworICAgICAgICAjaW5saW5lIHdpdGggZGVjaW1hbAorICAgICAgICBkMSAvLz0gZDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgRGVjaW1hbCgnMicpKQorCisgICAgICAgICNpbmxpbmUgd2l0aCBvdGhlciB0eXBlCisgICAgICAgIGQxIC8vPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIERlY2ltYWwoJzEnKSkKKworICAgIGRlZiB0ZXN0X3Bvd2VyaW5nKHNlbGYpOgorCisgICAgICAgIGQxID0gRGVjaW1hbCgnNScpCisgICAgICAgIGQyID0gRGVjaW1hbCgnMicpCisKKyAgICAgICAgI3R3byBEZWNpbWFscworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxKipkMiwgRGVjaW1hbCgnMjUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMioqZDEsIERlY2ltYWwoJzMyJykpCisKKyAgICAgICAgI3dpdGggb3RoZXIgdHlwZSwgbGVmdAorICAgICAgICBjID0gZDEgKiogNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIERlY2ltYWwoJzYyNScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYyksIHR5cGUoZDEpKQorCisgICAgICAgICN3aXRoIG90aGVyIHR5cGUsIHJpZ2h0CisgICAgICAgIGMgPSA3ICoqIGQxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgRGVjaW1hbCgnMTY4MDcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGMpLCB0eXBlKGQxKSkKKworICAgICAgICAjaW5saW5lIHdpdGggZGVjaW1hbAorICAgICAgICBkMSAqKj0gZDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgRGVjaW1hbCgnMjUnKSkKKworICAgICAgICAjaW5saW5lIHdpdGggb3RoZXIgdHlwZQorICAgICAgICBkMSAqKj0gNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCBEZWNpbWFsKCczOTA2MjUnKSkKKworICAgIGRlZiB0ZXN0X21vZHVsZShzZWxmKToKKworICAgICAgICBkMSA9IERlY2ltYWwoJzUnKQorICAgICAgICBkMiA9IERlY2ltYWwoJzInKQorCisgICAgICAgICN0d28gRGVjaW1hbHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSVkMiwgRGVjaW1hbCgnMScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyJWQxLCBEZWNpbWFsKCcyJykpCisKKyAgICAgICAgI3dpdGggb3RoZXIgdHlwZSwgbGVmdAorICAgICAgICBjID0gZDEgJSA0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgRGVjaW1hbCgnMScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYyksIHR5cGUoZDEpKQorCisgICAgICAgICN3aXRoIG90aGVyIHR5cGUsIHJpZ2h0CisgICAgICAgIGMgPSA3ICUgZDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBEZWNpbWFsKCcyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShjKSwgdHlwZShkMSkpCisKKyAgICAgICAgI2lubGluZSB3aXRoIGRlY2ltYWwKKyAgICAgICAgZDEgJT0gZDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgRGVjaW1hbCgnMScpKQorCisgICAgICAgICNpbmxpbmUgd2l0aCBvdGhlciB0eXBlCisgICAgICAgIGQxICU9IDQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgRGVjaW1hbCgnMScpKQorCisgICAgZGVmIHRlc3RfZmxvb3JfZGl2X21vZHVsZShzZWxmKToKKworICAgICAgICBkMSA9IERlY2ltYWwoJzUnKQorICAgICAgICBkMiA9IERlY2ltYWwoJzInKQorCisgICAgICAgICN0d28gRGVjaW1hbHMKKyAgICAgICAgKHAsIHEpID0gZGl2bW9kKGQxLCBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLCBEZWNpbWFsKCcyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocSwgRGVjaW1hbCgnMScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocCksIHR5cGUoZDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocSksIHR5cGUoZDEpKQorCisgICAgICAgICN3aXRoIG90aGVyIHR5cGUsIGxlZnQKKyAgICAgICAgKHAsIHEpID0gZGl2bW9kKGQxLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIERlY2ltYWwoJzEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLCBEZWNpbWFsKCcxJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShwKSwgdHlwZShkMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShxKSwgdHlwZShkMSkpCisKKyAgICAgICAgI3dpdGggb3RoZXIgdHlwZSwgcmlnaHQKKyAgICAgICAgKHAsIHEpID0gZGl2bW9kKDcsIGQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIERlY2ltYWwoJzEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLCBEZWNpbWFsKCcyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShwKSwgdHlwZShkMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShxKSwgdHlwZShkMSkpCisKKyAgICBkZWYgdGVzdF91bmFyeV9vcGVyYXRvcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoK0RlY2ltYWwoNDUpLCBEZWNpbWFsKCs0NSkpICAgICAgICAgICAjICArCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLURlY2ltYWwoNDUpLCBEZWNpbWFsKC00NSkpICAgICAgICAgICAjICAtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzKERlY2ltYWwoNDUpKSwgYWJzKERlY2ltYWwoLTQ1KSkpICAjIGFicworCisgICAgZGVmIHRlc3RfbmFuX2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICAjIGNvbXBhcmlzb25zIGludm9sdmluZyBzaWduYWxpbmcgbmFucyBzaWduYWwgSW52YWxpZE9wZXJhdGlvbgorCisgICAgICAgICMgb3JkZXIgY29tcGFyaXNvbnMgKDwsIDw9LCA+LCA+PSkgaW52b2x2aW5nIG9ubHkgcXVpZXQgbmFucworICAgICAgICAjIGFsc28gc2lnbmFsIEludmFsaWRPcGVyYXRpb24KKworICAgICAgICAjIGVxdWFsaXR5IGNvbXBhcmlzb25zICg9PSwgIT0pIGludm9sdmluZyBvbmx5IHF1aWV0IG5hbnMKKyAgICAgICAgIyBkb24ndCBzaWduYWwsIGJ1dCByZXR1cm4gRmFsc2Ugb3IgVHJ1ZSByZXNwZWN0aXZlbHkuCisKKyAgICAgICAgbiA9IERlY2ltYWwoJ05hTicpCisgICAgICAgIHMgPSBEZWNpbWFsKCdzTmFOJykKKyAgICAgICAgaSA9IERlY2ltYWwoJ0luZicpCisgICAgICAgIGYgPSBEZWNpbWFsKCcyJykKKworICAgICAgICBxbmFuX3BhaXJzID0gKG4sIG4pLCAobiwgaSksIChpLCBuKSwgKG4sIGYpLCAoZiwgbikKKyAgICAgICAgc25hbl9wYWlycyA9IChzLCBuKSwgKG4sIHMpLCAocywgaSksIChpLCBzKSwgKHMsIGYpLCAoZiwgcyksIChzLCBzKQorICAgICAgICBvcmRlcl9vcHMgPSBvcGVyYXRvci5sdCwgb3BlcmF0b3IubGUsIG9wZXJhdG9yLmd0LCBvcGVyYXRvci5nZQorICAgICAgICBlcXVhbGl0eV9vcHMgPSBvcGVyYXRvci5lcSwgb3BlcmF0b3IubmUKKworICAgICAgICAjIHJlc3VsdHMgd2hlbiBJbnZhbGlkT3BlcmF0aW9uIGlzIG5vdCB0cmFwcGVkCisgICAgICAgIGZvciB4LCB5IGluIHFuYW5fcGFpcnMgKyBzbmFuX3BhaXJzOgorICAgICAgICAgICAgZm9yIG9wIGluIG9yZGVyX29wcyArIGVxdWFsaXR5X29wczoKKyAgICAgICAgICAgICAgICBnb3QgPSBvcCh4LCB5KQorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gVHJ1ZSBpZiBvcCBpcyBvcGVyYXRvci5uZSBlbHNlIEZhbHNlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhleHBlY3RlZCwgZ290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHswIXJ9IGZvciBvcGVyYXRvci57MX0oezIhcn0sIHszIXJ9KTsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvdCB7NCFyfSIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIG9wLl9fbmFtZV9fLCB4LCB5LCBnb3QpKQorCisgICAgICAgICMgcmVwZWF0IHRoZSBhYm92ZSwgYnV0IHRoaXMgdGltZSB0cmFwIHRoZSBJbnZhbGlkT3BlcmF0aW9uCisgICAgICAgIHdpdGggbG9jYWxjb250ZXh0KCkgYXMgY3R4OgorICAgICAgICAgICAgY3R4LnRyYXBzW0ludmFsaWRPcGVyYXRpb25dID0gMQorCisgICAgICAgICAgICBmb3IgeCwgeSBpbiBxbmFuX3BhaXJzOgorICAgICAgICAgICAgICAgIGZvciBvcCBpbiBlcXVhbGl0eV9vcHM6CisgICAgICAgICAgICAgICAgICAgIGdvdCA9IG9wKHgsIHkpCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gVHJ1ZSBpZiBvcCBpcyBvcGVyYXRvci5uZSBlbHNlIEZhbHNlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZXhwZWN0ZWQsIGdvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgezAhcn0gZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BlcmF0b3IuezF9KHsyIXJ9LCB7MyFyfSk7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ290IHs0IXJ9Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQsIG9wLl9fbmFtZV9fLCB4LCB5LCBnb3QpKQorCisgICAgICAgICAgICBmb3IgeCwgeSBpbiBzbmFuX3BhaXJzOgorICAgICAgICAgICAgICAgIGZvciBvcCBpbiBlcXVhbGl0eV9vcHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEludmFsaWRPcGVyYXRpb24sIG9wZXJhdG9yLmVxLCB4LCB5KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbnZhbGlkT3BlcmF0aW9uLCBvcGVyYXRvci5uZSwgeCwgeSkKKworICAgICAgICAgICAgZm9yIHgsIHkgaW4gcW5hbl9wYWlycyArIHNuYW5fcGFpcnM6CisgICAgICAgICAgICAgICAgZm9yIG9wIGluIG9yZGVyX29wczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW52YWxpZE9wZXJhdGlvbiwgb3AsIHgsIHkpCisKKyAgICBkZWYgdGVzdF9jb3B5X3NpZ24oc2VsZik6CisgICAgICAgIGQgPSBEZWNpbWFsKDEpLmNvcHlfc2lnbihEZWNpbWFsKC0yKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoMSkuY29weV9zaWduKC0yKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBEZWNpbWFsKDEpLmNvcHlfc2lnbiwgJy0yJykKKworIyBUaGUgZm9sbG93aW5nIGFyZSB0d28gZnVuY3Rpb25zIHVzZWQgdG8gdGVzdCB0aHJlYWRpbmcgaW4gdGhlIG5leHQgY2xhc3MKKworZGVmIHRoZnVuYzEoY2xzKToKKyAgICBkMSA9IERlY2ltYWwoMSkKKyAgICBkMyA9IERlY2ltYWwoMykKKyAgICB0ZXN0MSA9IGQxL2QzCisgICAgY2xzLnN5bmNocm8ud2FpdCgpCisgICAgdGVzdDIgPSBkMS9kMworICAgIGNscy5maW5pc2gxLnNldCgpCisKKyAgICBjbHMuYXNzZXJ0RXF1YWwodGVzdDEsIERlY2ltYWwoJzAuMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMycpKQorICAgIGNscy5hc3NlcnRFcXVhbCh0ZXN0MiwgRGVjaW1hbCgnMC4zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzJykpCisgICAgcmV0dXJuCisKK2RlZiB0aGZ1bmMyKGNscyk6CisgICAgZDEgPSBEZWNpbWFsKDEpCisgICAgZDMgPSBEZWNpbWFsKDMpCisgICAgdGVzdDEgPSBkMS9kMworICAgIHRoaXNjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisgICAgdGhpc2NvbnRleHQucHJlYyA9IDE4CisgICAgdGVzdDIgPSBkMS9kMworICAgIGNscy5zeW5jaHJvLnNldCgpCisgICAgY2xzLmZpbmlzaDIuc2V0KCkKKworICAgIGNscy5hc3NlcnRFcXVhbCh0ZXN0MSwgRGVjaW1hbCgnMC4zMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzJykpCisgICAgY2xzLmFzc2VydEVxdWFsKHRlc3QyLCBEZWNpbWFsKCcwLjMzMzMzMzMzMzMzMzMzMzMzMycpKQorICAgIHJldHVybgorCisKK2NsYXNzIERlY2ltYWxVc2VPZkNvbnRleHRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAnJydVbml0IHRlc3RzIGZvciBVc2Ugb2YgQ29udGV4dCBjYXNlcyBpbiBEZWNpbWFsLicnJworCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgdGhyZWFkaW5nCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICB0aHJlYWRpbmcgPSBOb25lCisKKyAgICAjIFRha2UgY2FyZSBleGVjdXRpbmcgdGhpcyB0ZXN0IGZyb20gSURMRSwgdGhlcmUncyBhbiBpc3N1ZSBpbiB0aHJlYWRpbmcKKyAgICAjIHRoYXQgaGFuZ3MgSURMRSBhbmQgSSBjb3VsZG4ndCBmaW5kIGl0CisKKyAgICBkZWYgdGVzdF90aHJlYWRpbmcoc2VsZik6CisgICAgICAgICNUZXN0IHRoZSAidGhyZWFkaW5nIGlzb2xhdGlvbiIgb2YgYSBDb250ZXh0LgorCisgICAgICAgIHNlbGYuc3luY2hybyA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuZmluaXNoMSA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuZmluaXNoMiA9IHRocmVhZGluZy5FdmVudCgpCisKKyAgICAgICAgdGgxID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9dGhmdW5jMSwgYXJncz0oc2VsZiwpKQorICAgICAgICB0aDIgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD10aGZ1bmMyLCBhcmdzPShzZWxmLCkpCisKKyAgICAgICAgdGgxLnN0YXJ0KCkKKyAgICAgICAgdGgyLnN0YXJ0KCkKKworICAgICAgICBzZWxmLmZpbmlzaDEud2FpdCgpCisgICAgICAgIHNlbGYuZmluaXNoMi53YWl0KCkKKyAgICAgICAgcmV0dXJuCisKKyAgICBpZiB0aHJlYWRpbmcgaXMgTm9uZToKKyAgICAgICAgZGVsIHRlc3RfdGhyZWFkaW5nCisKKworY2xhc3MgRGVjaW1hbFVzYWJpbGl0eVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICcnJ1VuaXQgdGVzdHMgZm9yIFVzYWJpbGl0eSBjYXNlcyBvZiBEZWNpbWFsLicnJworCisgICAgZGVmIHRlc3RfY29tcGFyaXNvbl9vcGVyYXRvcnMoc2VsZik6CisKKyAgICAgICAgZGEgPSBEZWNpbWFsKCcyMy40MicpCisgICAgICAgIGRiID0gRGVjaW1hbCgnMjMuNDInKQorICAgICAgICBkYyA9IERlY2ltYWwoJzQ1JykKKworICAgICAgICAjdHdvIERlY2ltYWxzCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihkYywgZGEpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGRjLCBkYSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKGRhLCBkYykKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoZGEsIGRjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhLCBkYikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYSwgZGMpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKGRhLCBkYikKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoZGEsIGRiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkYyxkYSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGRhLGRjKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGRhLGRiKSwgMCkKKworICAgICAgICAjYSBEZWNpbWFsIGFuZCBhbiBpbnQKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGRjLCAyMykKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKDIzLCBkYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYywgNDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGRjLDIzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoMjMsZGMpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZGMsNDUpLCAwKQorCisgICAgICAgICNhIERlY2ltYWwgYW5kIHVuY29tcGFyYWJsZQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGRhLCAndWdseScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZGEsIDMyLjcpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZGEsIG9iamVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGRhLCBvYmplY3QpCisKKyAgICAgICAgIyBzb3J0YWJsZQorICAgICAgICBhID0gbWFwKERlY2ltYWwsIHhyYW5nZSgxMDApKQorICAgICAgICBiID0gIGFbOl0KKyAgICAgICAgcmFuZG9tLnNodWZmbGUoYSkKKyAgICAgICAgYS5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCisgICAgICAgICMgd2l0aCBOb25lCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShEZWNpbWFsKDEpIDwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEZWNpbWFsKDEpID4gTm9uZSkKKworICAgIGRlZiB0ZXN0X2RlY2ltYWxfZmxvYXRfY29tcGFyaXNvbihzZWxmKToKKyAgICAgICAgZGEgPSBEZWNpbWFsKCcwLjI1JykKKyAgICAgICAgZGIgPSBEZWNpbWFsKCczLjAnKQorICAgICAgICBzZWxmLmFzc2VydExlc3MoZGEsIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoZGEsIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGRiLCAwLjI1KQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChkYiwgMC4yNSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYSwgMS41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhLCAwLjI1KQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoMy4wLCBkYSkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoMy4wLCBkYSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKDAuMjUsIGRiKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgwLjI1LCBkYikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgwLjI1LCBkYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLjAsIGRiKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKDAuMSwgRGVjaW1hbCgnMC4xJykpCisKKyAgICBkZWYgdGVzdF9jb3B5X2FuZF9kZWVwY29weV9tZXRob2RzKHNlbGYpOgorICAgICAgICBkID0gRGVjaW1hbCgnNDMuMjQnKQorICAgICAgICBjID0gY29weS5jb3B5KGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoYyksIGlkKGQpKQorICAgICAgICBkYyA9IGNvcHkuZGVlcGNvcHkoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChkYyksIGlkKGQpKQorCisgICAgZGVmIHRlc3RfaGFzaF9tZXRob2Qoc2VsZik6CisgICAgICAgICNqdXN0IHRoYXQgaXQncyBoYXNoYWJsZQorICAgICAgICBoYXNoKERlY2ltYWwoMjMpKQorICAgICAgICBoYXNoKERlY2ltYWwoJ0luZmluaXR5JykpCisgICAgICAgIGhhc2goRGVjaW1hbCgnLUluZmluaXR5JykpCisgICAgICAgIGhhc2goRGVjaW1hbCgnbmFuMTIzJykpCisgICAgICAgIGhhc2goRGVjaW1hbCgnLU5hTicpKQorCisgICAgICAgIHRlc3RfdmFsdWVzID0gW0RlY2ltYWwoc2lnbiooMioqbSArIG4pKQorICAgICAgICAgICAgICAgICAgICAgICBmb3IgbSBpbiBbMCwgMTQsIDE1LCAxNiwgMTcsIDMwLCAzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyLCAzMywgNjIsIDYzLCA2NCwgNjUsIDY2XQorICAgICAgICAgICAgICAgICAgICAgICBmb3IgbiBpbiByYW5nZSgtMTAsIDEwKQorICAgICAgICAgICAgICAgICAgICAgICBmb3Igc2lnbiBpbiBbLTEsIDFdXQorICAgICAgICB0ZXN0X3ZhbHVlcy5leHRlbmQoWworICAgICAgICAgICAgICAgIERlY2ltYWwoIi0wIiksICMgemVyb3MKKyAgICAgICAgICAgICAgICBEZWNpbWFsKCIwLjAwIiksCisgICAgICAgICAgICAgICAgRGVjaW1hbCgiLTAuMDAwIiksCisgICAgICAgICAgICAgICAgRGVjaW1hbCgiMEUxMCIpLAorICAgICAgICAgICAgICAgIERlY2ltYWwoIi0wRTEyIiksCisgICAgICAgICAgICAgICAgRGVjaW1hbCgiMTAuMCIpLCAjIG5lZ2F0aXZlIGV4cG9uZW50CisgICAgICAgICAgICAgICAgRGVjaW1hbCgiLTIzLjAwMDAwIiksCisgICAgICAgICAgICAgICAgRGVjaW1hbCgiMTIzMEUxMDAiKSwgIyBwb3NpdGl2ZSBleHBvbmVudAorICAgICAgICAgICAgICAgIERlY2ltYWwoIi00LjU2NzhFNTAiKSwKKyAgICAgICAgICAgICAgICAjIGEgdmFsdWUgZm9yIHdoaWNoIGhhc2gobikgIT0gaGFzaChuICUgKDIqKjY0LTEpKQorICAgICAgICAgICAgICAgICMgaW4gUHl0aG9uIHByZS0yLjYKKyAgICAgICAgICAgICAgICBEZWNpbWFsKDIqKjY0ICsgMioqMzIgLSAxKSwKKyAgICAgICAgICAgICAgICAjIHNlbGVjdGlvbiBvZiB2YWx1ZXMgd2hpY2ggZmFpbCB3aXRoIHRoZSBvbGQgKGJlZm9yZQorICAgICAgICAgICAgICAgICMgdmVyc2lvbiAyLjYpIGxvbmcuX19oYXNoX18KKyAgICAgICAgICAgICAgICBEZWNpbWFsKCIxLjYzNEUxMDAiKSwKKyAgICAgICAgICAgICAgICBEZWNpbWFsKCI5MC42OTdFMTAwIiksCisgICAgICAgICAgICAgICAgRGVjaW1hbCgiMTg4LjgzRTEwMCIpLAorICAgICAgICAgICAgICAgIERlY2ltYWwoIjE2NTIuOUUxMDAiKSwKKyAgICAgICAgICAgICAgICBEZWNpbWFsKCI1NjUzMUUxMDAiKSwKKyAgICAgICAgICAgICAgICBdKQorCisgICAgICAgICMgY2hlY2sgdGhhdCBoYXNoKGQpID09IGhhc2goaW50KGQpKSBmb3IgaW50ZWdyYWwgdmFsdWVzCisgICAgICAgIGZvciB2YWx1ZSBpbiB0ZXN0X3ZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh2YWx1ZSksIGhhc2goaW50KHZhbHVlKSkpCisKKyAgICAgICAgI3RoZSBzYW1lIGhhc2ggdGhhdCB0byBhbiBpbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKERlY2ltYWwoMjMpKSwgaGFzaCgyMykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgRGVjaW1hbCgnc05hTicpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzaChEZWNpbWFsKCdJbmYnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNoKERlY2ltYWwoJy1JbmYnKSkpCisKKyAgICAgICAgIyBjaGVjayB0aGF0IHRoZSBoYXNoZXMgb2YgYSBEZWNpbWFsIGZsb2F0IG1hdGNoIHdoZW4gdGhleQorICAgICAgICAjIHJlcHJlc2VudCBleGFjdGx5IHRoZSBzYW1lIHZhbHVlcworICAgICAgICB0ZXN0X3N0cmluZ3MgPSBbJ2luZicsICctSW5mJywgJzAuMCcsICctLjBlMScsCisgICAgICAgICAgICAgICAgICAgICAgICAnMzQuMCcsICcyLjUnLCAnMTEyMzkwLjYyNScsICctMC41MTU2MjUnXQorICAgICAgICBmb3IgcyBpbiB0ZXN0X3N0cmluZ3M6CisgICAgICAgICAgICBmID0gZmxvYXQocykKKyAgICAgICAgICAgIGQgPSBEZWNpbWFsKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goZiksIGhhc2goZCkpCisKKyAgICAgICAgIyBjaGVjayB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgaGFzaCBkb2Vzbid0IGRlcGVuZCBvbiB0aGUKKyAgICAgICAgIyBjdXJyZW50IGNvbnRleHQgKGlzc3VlICMxNzU3KQorICAgICAgICBjID0gZ2V0Y29udGV4dCgpCisgICAgICAgIG9sZF9wcmVjaXNpb24gPSBjLnByZWMKKyAgICAgICAgeCA9IERlY2ltYWwoIjEyMzQ1Njc4OS4xIikKKworICAgICAgICBjLnByZWMgPSA2CisgICAgICAgIGgxID0gaGFzaCh4KQorICAgICAgICBjLnByZWMgPSAxMAorICAgICAgICBoMiA9IGhhc2goeCkKKyAgICAgICAgYy5wcmVjID0gMTYKKyAgICAgICAgaDMgPSBoYXNoKHgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoMSwgaDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaDEsIGgzKQorICAgICAgICBjLnByZWMgPSBvbGRfcHJlY2lzaW9uCisKKyAgICBkZWYgdGVzdF9taW5fYW5kX21heF9tZXRob2RzKHNlbGYpOgorCisgICAgICAgIGQxID0gRGVjaW1hbCgnMTUuMzInKQorICAgICAgICBkMiA9IERlY2ltYWwoJzI4LjUnKQorICAgICAgICBsMSA9IDE1CisgICAgICAgIGwyID0gMjgKKworICAgICAgICAjYmV0d2VlbiBEZWNpbWFscworICAgICAgICBzZWxmLmFzc2VydElzKG1pbihkMSxkMiksIGQxKQorICAgICAgICBzZWxmLmFzc2VydElzKG1pbihkMixkMSksIGQxKQorICAgICAgICBzZWxmLmFzc2VydElzKG1heChkMSxkMiksIGQyKQorICAgICAgICBzZWxmLmFzc2VydElzKG1heChkMixkMSksIGQyKQorCisgICAgICAgICNiZXR3ZWVuIERlY2ltYWwgYW5kIGxvbmcKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtaW4oZDEsbDIpLCBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtaW4obDIsZDEpLCBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtYXgobDEsZDIpLCBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtYXgoZDIsbDEpLCBkMikKKworICAgIGRlZiB0ZXN0X2FzX25vbnplcm8oc2VsZik6CisgICAgICAgICNhcyBmYWxzZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKERlY2ltYWwoMCkpCisgICAgICAgICNhcyB0cnVlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEZWNpbWFsKCcwLjM3MicpKQorCisgICAgZGVmIHRlc3RfdG9zdHJpbmdfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgI1Rlc3Qgc3RyIGFuZCByZXByIG1ldGhvZHMuCisKKyAgICAgICAgZCA9IERlY2ltYWwoJzE1LjMyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZCksICcxNS4zMicpICAgICAgICAgICAgICAgIyBzdHIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQpLCAiRGVjaW1hbCgnMTUuMzInKSIpICAgIyByZXByCisKKyAgICAgICAgIyByZXN1bHQgdHlwZSBvZiBzdHJpbmcgbWV0aG9kcyBzaG91bGQgYmUgc3RyLCBub3QgdW5pY29kZQorICAgICAgICB1bmljb2RlX2lucHV0cyA9IFt1JzEyMy40JywgdScwLjVFMicsIHUnSW5maW5pdHknLCB1J3NOYU4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1Jy0wLjBFMTAwJywgdSctTmFOMDAxJywgdSctSW5mJ10KKworICAgICAgICBmb3IgdSBpbiB1bmljb2RlX2lucHV0czoKKyAgICAgICAgICAgIGQgPSBEZWNpbWFsKHUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc3RyKGQpKSwgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlcHIoZCkpLCBzdHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZC50b19lbmdfc3RyaW5nKCkpLCBzdHIpCisKKyAgICBkZWYgdGVzdF90b251bV9tZXRob2RzKHNlbGYpOgorICAgICAgICAjVGVzdCBmbG9hdCwgaW50IGFuZCBsb25nIG1ldGhvZHMuCisKKyAgICAgICAgZDEgPSBEZWNpbWFsKCc2NicpCisgICAgICAgIGQyID0gRGVjaW1hbCgnMTUuMzInKQorCisgICAgICAgICNpbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZDEpLCA2NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZDIpLCAxNSkKKworICAgICAgICAjbG9uZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoZDEpLCA2NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKGQyKSwgMTUpCisKKyAgICAgICAgI2Zsb2F0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoZDEpLCA2NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChkMiksIDE1LjMyKQorCisgICAgZGVmIHRlc3RfbmFuX3RvX2Zsb2F0KHNlbGYpOgorICAgICAgICAjIFRlc3QgY29udmVyc2lvbnMgb2YgZGVjaW1hbCBOQU5zIHRvIGZsb2F0LgorICAgICAgICAjIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTU1NDQKKyAgICAgICAgZm9yIHMgaW4gKCduYW4nLCAnbmFuMTIzNCcsICctbmFuJywgJy1uYW4yNDY4Jyk6CisgICAgICAgICAgICBmID0gZmxvYXQoRGVjaW1hbChzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGYpKQorCisgICAgZGVmIHRlc3Rfc25hbl90b19mbG9hdChzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gKCdzbmFuJywgJy1zbmFuJywgJ3NuYW4xMzU3JywgJy1zbmFuMTIzNCcpOgorICAgICAgICAgICAgZCA9IERlY2ltYWwocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCBkKQorCisgICAgZGVmIHRlc3RfZXZhbF9yb3VuZF90cmlwKHNlbGYpOgorCisgICAgICAgICN3aXRoIHplcm8KKyAgICAgICAgZCA9IERlY2ltYWwoICgwLCAoMCwpLCAwKSApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZXZhbChyZXByKGQpKSkKKworICAgICAgICAjaW50CisgICAgICAgIGQgPSBEZWNpbWFsKCAoMSwgKDQsIDUpLCAwKSApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZXZhbChyZXByKGQpKSkKKworICAgICAgICAjZmxvYXQKKyAgICAgICAgZCA9IERlY2ltYWwoICgwLCAoNCwgNSwgMywgNCksIC0yKSApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZXZhbChyZXByKGQpKSkKKworICAgICAgICAjd2VpcmQKKyAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoNCwgMywgNCwgOSwgMSwgMywgNSwgMywgNCksIC0yNSkgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGV2YWwocmVwcihkKSkpCisKKyAgICBkZWYgdGVzdF9hc190dXBsZShzZWxmKToKKworICAgICAgICAjd2l0aCB6ZXJvCisgICAgICAgIGQgPSBEZWNpbWFsKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5hc190dXBsZSgpLCAoMCwgKDAsKSwgMCkgKQorCisgICAgICAgICNpbnQKKyAgICAgICAgZCA9IERlY2ltYWwoLTQ1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDEsICg0LCA1KSwgMCkgKQorCisgICAgICAgICNjb21wbGljYXRlZCBzdHJpbmcKKyAgICAgICAgZCA9IERlY2ltYWwoIi00LjM0OTEzNTM0RS0xNyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5hc190dXBsZSgpLCAoMSwgKDQsIDMsIDQsIDksIDEsIDMsIDUsIDMsIDQpLCAtMjUpICkKKworICAgICAgICAjaW5mCisgICAgICAgIGQgPSBEZWNpbWFsKCJJbmZpbml0eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5hc190dXBsZSgpLCAoMCwgKDAsKSwgJ0YnKSApCisKKyAgICAgICAgI2xlYWRpbmcgemVyb3MgaW4gY29lZmZpY2llbnQgc2hvdWxkIGJlIHN0cmlwcGVkCisgICAgICAgIGQgPSBEZWNpbWFsKCAoMCwgKDAsIDAsIDQsIDAsIDUsIDMsIDQpLCAtMikgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDAsICg0LCAwLCA1LCAzLCA0KSwgLTIpICkKKyAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoMCwgMCwgMCksIDM3KSApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5hc190dXBsZSgpLCAoMSwgKDAsKSwgMzcpKQorICAgICAgICBkID0gRGVjaW1hbCggKDEsICgpLCAzNykgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDEsICgwLCksIDM3KSkKKworICAgICAgICAjbGVhZGluZyB6ZXJvcyBpbiBOYU4gZGlhZ25vc3RpYyBpbmZvIHNob3VsZCBiZSBzdHJpcHBlZAorICAgICAgICBkID0gRGVjaW1hbCggKDAsICgwLCAwLCA0LCAwLCA1LCAzLCA0KSwgJ24nKSApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5hc190dXBsZSgpLCAoMCwgKDQsIDAsIDUsIDMsIDQpLCAnbicpICkKKyAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoMCwgMCwgMCksICdOJykgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDEsICgpLCAnTicpICkKKyAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoKSwgJ24nKSApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5hc190dXBsZSgpLCAoMSwgKCksICduJykgKQorCisgICAgICAgICNjb2VmZmljaWVudCBpbiBpbmZpbml0eSBzaG91bGQgYmUgaWdub3JlZAorICAgICAgICBkID0gRGVjaW1hbCggKDAsICg0LCA1LCAzLCA0KSwgJ0YnKSApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5hc190dXBsZSgpLCAoMCwgKDAsKSwgJ0YnKSkKKyAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoMCwgMiwgNywgMSksICdGJykgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDEsICgwLCksICdGJykpCisKKyAgICBkZWYgdGVzdF9pbW11dGFiaWxpdHlfb3BlcmF0aW9ucyhzZWxmKToKKyAgICAgICAgIyBEbyBvcGVyYXRpb25zIGFuZCBjaGVjayB0aGF0IGl0IGRpZG4ndCBjaGFuZ2UgY2hhbmdlIGludGVybmFsIG9iamVjdHMuCisKKyAgICAgICAgZDEgPSBEZWNpbWFsKCctMjVlNTUnKQorICAgICAgICBiMSA9IERlY2ltYWwoJy0yNWU1NScpCisgICAgICAgIGQyID0gRGVjaW1hbCgnMzNlKzMzJykKKyAgICAgICAgYjIgPSBEZWNpbWFsKCczM2UrMzMnKQorCisgICAgICAgIGRlZiBjaGVja1NhbWVEZWMob3BlcmF0aW9uLCB1c2VPdGhlcj1GYWxzZSk6CisgICAgICAgICAgICBpZiB1c2VPdGhlcjoKKyAgICAgICAgICAgICAgICBldmFsKCJkMS4iICsgb3BlcmF0aW9uICsgIihkMikiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEuX3NpZ24sIGIxLl9zaWduKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEuX2ludCwgYjEuX2ludCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLl9leHAsIGIxLl9leHApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5fc2lnbiwgYjIuX3NpZ24pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5faW50LCBiMi5faW50KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIuX2V4cCwgYjIuX2V4cCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXZhbCgiZDEuIiArIG9wZXJhdGlvbiArICIoKSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS5fc2lnbiwgYjEuX3NpZ24pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS5faW50LCBiMS5faW50KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEuX2V4cCwgYjEuX2V4cCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIERlY2ltYWwoZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEuX3NpZ24sIGIxLl9zaWduKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLl9pbnQsIGIxLl9pbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEuX2V4cCwgYjEuX2V4cCkKKworICAgICAgICBjaGVja1NhbWVEZWMoIl9fYWJzX18iKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fYWRkX18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fZGl2X18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fZGl2bW9kX18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fZXFfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19uZV9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX2xlX18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fbHRfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19nZV9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX2d0X18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fZmxvYXRfXyIpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19mbG9vcmRpdl9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX2hhc2hfXyIpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19pbnRfXyIpCisgICAgICAgIGNoZWNrU2FtZURlYygiX190cnVuY19fIikKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX2xvbmdfXyIpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19tb2RfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19tdWxfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19uZWdfXyIpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19ub256ZXJvX18iKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fcG9zX18iKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fcG93X18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fcmFkZF9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX3JkaXZfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19yZGl2bW9kX18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fcmVwcl9fIikKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX3JmbG9vcmRpdl9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX3Jtb2RfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19ybXVsX18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fcnBvd19fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX3JzdWJfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19zdHJfXyIpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19zdWJfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX190cnVlZGl2X18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoImFkanVzdGVkIikKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJhc190dXBsZSIpCisgICAgICAgIGNoZWNrU2FtZURlYygiY29tcGFyZSIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygibWF4IiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJtaW4iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIm5vcm1hbGl6ZSIpCisgICAgICAgIGNoZWNrU2FtZURlYygicXVhbnRpemUiLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoInJlbWFpbmRlcl9uZWFyIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJzYW1lX3F1YW50dW0iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoInNxcnQiKQorICAgICAgICBjaGVja1NhbWVEZWMoInRvX2VuZ19zdHJpbmciKQorICAgICAgICBjaGVja1NhbWVEZWMoInRvX2ludGVncmFsIikKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzaW5nKHNlbGYpOgorICAgICAgICAjIERpZmZlcmVudCBiZWhhdmlvdXJzIHdoZW4gc3ViY2xhc3NpbmcgRGVjaW1hbAorCisgICAgICAgIGNsYXNzIE15RGVjaW1hbChEZWNpbWFsKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkMSA9IE15RGVjaW1hbCgxKQorICAgICAgICBkMiA9IE15RGVjaW1hbCgyKQorICAgICAgICBkID0gZDEgKyBkMgorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoZCksIERlY2ltYWwpCisKKyAgICAgICAgZCA9IGQxLm1heChkMikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGQpLCBEZWNpbWFsKQorCisgICAgZGVmIHRlc3RfaW1wbGljaXRfY29udGV4dChzZWxmKToKKyAgICAgICAgIyBDaGVjayByZXN1bHRzIHdoZW4gY29udGV4dCBnaXZlbiBpbXBsaWNpdGx5LiAgKElzc3VlIDI0NzgpCisgICAgICAgIGMgPSBnZXRjb250ZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRGVjaW1hbCgwKS5zcXJ0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihjLnNxcnQoRGVjaW1hbCgwKSkpKQorCisgICAgZGVmIHRlc3RfY29udmVyc2lvbnNfZnJvbV9pbnQoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBtZXRob2RzIHRha2luZyBhIHNlY29uZCBEZWNpbWFsIGFyZ3VtZW50IHdpbGwKKyAgICAgICAgIyBhbHdheXMgYWNjZXB0IGFuIGludGVnZXIgaW4gcGxhY2Ugb2YgYSBEZWNpbWFsLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoNCkuY29tcGFyZSgzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKDQpLmNvbXBhcmUoRGVjaW1hbCgzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCg0KS5jb21wYXJlX3NpZ25hbCgzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKDQpLmNvbXBhcmVfc2lnbmFsKERlY2ltYWwoMykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoNCkuY29tcGFyZV90b3RhbCgzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKDQpLmNvbXBhcmVfdG90YWwoRGVjaW1hbCgzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCg0KS5jb21wYXJlX3RvdGFsX21hZygzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKDQpLmNvbXBhcmVfdG90YWxfbWFnKERlY2ltYWwoMykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoMTAxMDEpLmxvZ2ljYWxfYW5kKDEwMDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwoMTAxMDEpLmxvZ2ljYWxfYW5kKERlY2ltYWwoMTAwMSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoMTAxMDEpLmxvZ2ljYWxfb3IoMTAwMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCgxMDEwMSkubG9naWNhbF9vcihEZWNpbWFsKDEwMDEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDEwMTAxKS5sb2dpY2FsX3hvcigxMDAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKDEwMTAxKS5sb2dpY2FsX3hvcihEZWNpbWFsKDEwMDEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDU2NykubWF4KDEyMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCg1NjcpLm1heChEZWNpbWFsKDEyMykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoNTY3KS5tYXhfbWFnKDEyMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCg1NjcpLm1heF9tYWcoRGVjaW1hbCgxMjMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDU2NykubWluKDEyMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCg1NjcpLm1pbihEZWNpbWFsKDEyMykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoNTY3KS5taW5fbWFnKDEyMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCg1NjcpLm1pbl9tYWcoRGVjaW1hbCgxMjMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDU2NykubmV4dF90b3dhcmQoMTIzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKDU2NykubmV4dF90b3dhcmQoRGVjaW1hbCgxMjMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDEyMzQpLnF1YW50aXplKDEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCgxMjM0KS5xdWFudGl6ZShEZWNpbWFsKDEwMCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoNzY4KS5yZW1haW5kZXJfbmVhcigxMjM0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKDc2OCkucmVtYWluZGVyX25lYXIoRGVjaW1hbCgxMjM0KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCgxMjMpLnJvdGF0ZSgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKDEyMykucm90YXRlKERlY2ltYWwoMSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoMTIzNCkuc2FtZV9xdWFudHVtKDEwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwoMTIzNCkuc2FtZV9xdWFudHVtKERlY2ltYWwoMTAwMCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoJzkuMTIzJykuc2NhbGViKC0xMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwoJzkuMTIzJykuc2NhbGViKERlY2ltYWwoLTEwMCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoNDU2KS5zaGlmdCgtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCg0NTYpLnNoaWZ0KERlY2ltYWwoLTEpKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoLTEyKS5mbWEoRGVjaW1hbCg0NSksIDY3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKC0xMikuZm1hKERlY2ltYWwoNDUpLCBEZWNpbWFsKDY3KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCgtMTIpLmZtYSg0NSwgNjcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwoLTEyKS5mbWEoRGVjaW1hbCg0NSksIERlY2ltYWwoNjcpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKC0xMikuZm1hKDQ1LCBEZWNpbWFsKDY3KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCgtMTIpLmZtYShEZWNpbWFsKDQ1KSwgRGVjaW1hbCg2NykpKQorCisKK2NsYXNzIERlY2ltYWxQeXRob25BUEl0ZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hYmMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKERlY2ltYWwsIG51bWJlcnMuTnVtYmVyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKERlY2ltYWwsIG51bWJlcnMuUmVhbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShEZWNpbWFsKDApLCBudW1iZXJzLk51bWJlcikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKERlY2ltYWwoMCksIG51bWJlcnMuUmVhbCkKKworICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKKyAgICAgICAgZCA9IERlY2ltYWwoJy0zLjE0MTU5MDAwMCcpCisgICAgICAgIHAgPSBwaWNrbGUuZHVtcHMoZCkKKyAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGUpCisKKyAgICBkZWYgdGVzdF9pbnQoc2VsZik6CisgICAgICAgIGZvciB4IGluIHJhbmdlKC0yNTAsIDI1MCk6CisgICAgICAgICAgICBzID0gJyUwLjJmJyAlICh4IC8gMTAwLjApCisgICAgICAgICAgICAjIHNob3VsZCB3b3JrIHRoZSBzYW1lIGFzIGZvciBmbG9hdHMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KERlY2ltYWwocykpLCBpbnQoZmxvYXQocykpKQorICAgICAgICAgICAgIyBzaG91bGQgd29yayB0aGUgc2FtZSBhcyB0b19pbnRlZ3JhbCBpbiB0aGUgUk9VTkRfRE9XTiBtb2RlCisgICAgICAgICAgICBkID0gRGVjaW1hbChzKQorICAgICAgICAgICAgciA9IGQudG9faW50ZWdyYWwoUk9VTkRfRE9XTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbChpbnQoZCkpLCByKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgRGVjaW1hbCgnLW5hbicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsIERlY2ltYWwoJ3NuYW4nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgaW50LCBEZWNpbWFsKCdpbmYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgaW50LCBEZWNpbWFsKCctaW5mJykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9uZywgRGVjaW1hbCgnLW5hbicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsb25nLCBEZWNpbWFsKCdzbmFuJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGxvbmcsIERlY2ltYWwoJ2luZicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBsb25nLCBEZWNpbWFsKCctaW5mJykpCisKKyAgICBkZWYgdGVzdF90cnVuYyhzZWxmKToKKyAgICAgICAgZm9yIHggaW4gcmFuZ2UoLTI1MCwgMjUwKToKKyAgICAgICAgICAgIHMgPSAnJTAuMmYnICUgKHggLyAxMDAuMCkKKyAgICAgICAgICAgICMgc2hvdWxkIHdvcmsgdGhlIHNhbWUgYXMgZm9yIGZsb2F0cworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoRGVjaW1hbChzKSksIGludChmbG9hdChzKSkpCisgICAgICAgICAgICAjIHNob3VsZCB3b3JrIHRoZSBzYW1lIGFzIHRvX2ludGVncmFsIGluIHRoZSBST1VORF9ET1dOIG1vZGUKKyAgICAgICAgICAgIGQgPSBEZWNpbWFsKHMpCisgICAgICAgICAgICByID0gZC50b19pbnRlZ3JhbChST1VORF9ET1dOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKG1hdGgudHJ1bmMoZCkpLCByKQorCisgICAgZGVmIHRlc3RfZnJvbV9mbG9hdChzZWxmKToKKworICAgICAgICBjbGFzcyAgTXlEZWNpbWFsKERlY2ltYWwpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHIgPSBNeURlY2ltYWwuZnJvbV9mbG9hdCgwLjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyKSwgTXlEZWNpbWFsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihyKSwKKyAgICAgICAgICAgICAgICAnMC4xMDAwMDAwMDAwMDAwMDAwMDU1NTExMTUxMjMxMjU3ODI3MDIxMTgxNTgzNDA0NTQxMDE1NjI1JykKKyAgICAgICAgYmlnaW50ID0gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNeURlY2ltYWwuZnJvbV9mbG9hdChiaWdpbnQpLCBNeURlY2ltYWwoYmlnaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCduYW4nKSkuaXNfcW5hbigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoTXlEZWNpbWFsLmZyb21fZmxvYXQoZmxvYXQoJ2luZicpKS5pc19pbmZpbml0ZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoTXlEZWNpbWFsLmZyb21fZmxvYXQoZmxvYXQoJy1pbmYnKSkuaXNfaW5maW5pdGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoTXlEZWNpbWFsLmZyb21fZmxvYXQoZmxvYXQoJ25hbicpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKERlY2ltYWwoJ05hTicpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoTXlEZWNpbWFsLmZyb21fZmxvYXQoZmxvYXQoJ2luZicpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKERlY2ltYWwoJ0luZmluaXR5JykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihNeURlY2ltYWwuZnJvbV9mbG9hdChmbG9hdCgnLWluZicpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKERlY2ltYWwoJy1JbmZpbml0eScpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBNeURlY2ltYWwuZnJvbV9mbG9hdCwgJ2FiYycpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDIwMCk6CisgICAgICAgICAgICB4ID0gcmFuZG9tLmV4cG92YXJpYXRlKDAuMDEpICogKHJhbmRvbS5yYW5kb20oKSAqIDIuMCAtIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgZmxvYXQoTXlEZWNpbWFsLmZyb21fZmxvYXQoeCkpKSAjIHJvdW5kdHJpcAorCisgICAgZGVmIHRlc3RfY3JlYXRlX2RlY2ltYWxfZnJvbV9mbG9hdChzZWxmKToKKyAgICAgICAgY29udGV4dCA9IENvbnRleHQocHJlYz01LCByb3VuZGluZz1ST1VORF9ET1dOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29udGV4dC5jcmVhdGVfZGVjaW1hbF9mcm9tX2Zsb2F0KG1hdGgucGkpLAorICAgICAgICAgICAgRGVjaW1hbCgnMy4xNDE1JykKKyAgICAgICAgKQorICAgICAgICBjb250ZXh0ID0gQ29udGV4dChwcmVjPTUsIHJvdW5kaW5nPVJPVU5EX1VQKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29udGV4dC5jcmVhdGVfZGVjaW1hbF9mcm9tX2Zsb2F0KG1hdGgucGkpLAorICAgICAgICAgICAgRGVjaW1hbCgnMy4xNDE2JykKKyAgICAgICAgKQorICAgICAgICBjb250ZXh0ID0gQ29udGV4dChwcmVjPTUsIHRyYXBzPVtJbmV4YWN0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBJbmV4YWN0LAorICAgICAgICAgICAgY29udGV4dC5jcmVhdGVfZGVjaW1hbF9mcm9tX2Zsb2F0LAorICAgICAgICAgICAgbWF0aC5waQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjb250ZXh0LmNyZWF0ZV9kZWNpbWFsX2Zyb21fZmxvYXQoLTAuMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJEZWNpbWFsKCctMCcpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNvbnRleHQuY3JlYXRlX2RlY2ltYWxfZnJvbV9mbG9hdCgxLjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCgnMScpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNvbnRleHQuY3JlYXRlX2RlY2ltYWxfZnJvbV9mbG9hdCgxMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJEZWNpbWFsKCcxMCcpIikKKworY2xhc3MgQ29udGV4dEFQSXRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBlID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhjKSkKKyAgICAgICAgZm9yIGsgaW4gdmFycyhjKToKKyAgICAgICAgICAgIHYxID0gdmFycyhjKVtrXQorICAgICAgICAgICAgdjIgPSB2YXJzKGUpW2tdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYxLCB2MikKKworICAgIGRlZiB0ZXN0X2VxdWFsaXR5X3dpdGhfb3RoZXJfdHlwZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oRGVjaW1hbCgxMCksIFsnYScsIDEuMCwgRGVjaW1hbCgxMCksICgxLDIpLCB7fV0pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oRGVjaW1hbCgxMCksIFsnYScsIDEuMCwgKDEsMiksIHt9XSkKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgICMgQWxsIGNvcGllcyBzaG91bGQgYmUgZGVlcAorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGMpLCBpZChkKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChjLmZsYWdzKSwgaWQoZC5mbGFncykpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoYy50cmFwcyksIGlkKGQudHJhcHMpKQorCisgICAgZGVmIHRlc3RfYWJzKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmFicyhEZWNpbWFsKC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmFicygtMSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5hYnMsICctMScpCisKKyAgICBkZWYgdGVzdF9hZGQoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuYWRkKERlY2ltYWwoMSksIERlY2ltYWwoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5hZGQoMSwgMSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5hZGQoRGVjaW1hbCgxKSwgMSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5hZGQoMSwgRGVjaW1hbCgxKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5hZGQsICcxJywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmFkZCwgMSwgJzEnKQorCisgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5jb21wYXJlKERlY2ltYWwoMSksIERlY2ltYWwoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb21wYXJlKDEsIDEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29tcGFyZShEZWNpbWFsKDEpLCAxKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbXBhcmUoMSwgRGVjaW1hbCgxKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5jb21wYXJlLCAnMScsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5jb21wYXJlLCAxLCAnMScpCisKKyAgICBkZWYgdGVzdF9jb21wYXJlX3NpZ25hbChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5jb21wYXJlX3NpZ25hbChEZWNpbWFsKDEpLCBEZWNpbWFsKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29tcGFyZV9zaWduYWwoMSwgMSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb21wYXJlX3NpZ25hbChEZWNpbWFsKDEpLCAxKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbXBhcmVfc2lnbmFsKDEsIERlY2ltYWwoMSkpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuY29tcGFyZV9zaWduYWwsICcxJywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmNvbXBhcmVfc2lnbmFsLCAxLCAnMScpCisKKyAgICBkZWYgdGVzdF9jb21wYXJlX3RvdGFsKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmNvbXBhcmVfdG90YWwoRGVjaW1hbCgxKSwgRGVjaW1hbCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbXBhcmVfdG90YWwoMSwgMSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb21wYXJlX3RvdGFsKERlY2ltYWwoMSksIDEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29tcGFyZV90b3RhbCgxLCBEZWNpbWFsKDEpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmNvbXBhcmVfdG90YWwsICcxJywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmNvbXBhcmVfdG90YWwsIDEsICcxJykKKworICAgIGRlZiB0ZXN0X2NvbXBhcmVfdG90YWxfbWFnKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmNvbXBhcmVfdG90YWxfbWFnKERlY2ltYWwoMSksIERlY2ltYWwoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb21wYXJlX3RvdGFsX21hZygxLCAxKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbXBhcmVfdG90YWxfbWFnKERlY2ltYWwoMSksIDEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29tcGFyZV90b3RhbF9tYWcoMSwgRGVjaW1hbCgxKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5jb21wYXJlX3RvdGFsX21hZywgJzEnLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuY29tcGFyZV90b3RhbF9tYWcsIDEsICcxJykKKworICAgIGRlZiB0ZXN0X2NvcHlfYWJzKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmNvcHlfYWJzKERlY2ltYWwoLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29weV9hYnMoLTEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuY29weV9hYnMsICctMScpCisKKyAgICBkZWYgdGVzdF9jb3B5X2RlY2ltYWwoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuY29weV9kZWNpbWFsKERlY2ltYWwoLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29weV9kZWNpbWFsKC0xKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmNvcHlfZGVjaW1hbCwgJy0xJykKKworICAgIGRlZiB0ZXN0X2NvcHlfbmVnYXRlKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmNvcHlfbmVnYXRlKERlY2ltYWwoLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29weV9uZWdhdGUoLTEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuY29weV9uZWdhdGUsICctMScpCisKKyAgICBkZWYgdGVzdF9jb3B5X3NpZ24oc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuY29weV9zaWduKERlY2ltYWwoMSksIERlY2ltYWwoLTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29weV9zaWduKDEsIC0yKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvcHlfc2lnbihEZWNpbWFsKDEpLCAtMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb3B5X3NpZ24oMSwgRGVjaW1hbCgtMikpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuY29weV9zaWduLCAnMScsIC0yKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuY29weV9zaWduLCAxLCAnLTInKQorCisgICAgZGVmIHRlc3RfZGl2aWRlKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmRpdmlkZShEZWNpbWFsKDEpLCBEZWNpbWFsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZGl2aWRlKDEsIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZGl2aWRlKERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZGl2aWRlKDEsIERlY2ltYWwoMikpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuZGl2aWRlLCAnMScsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5kaXZpZGUsIDEsICcyJykKKworICAgIGRlZiB0ZXN0X2RpdmlkZV9pbnQoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuZGl2aWRlX2ludChEZWNpbWFsKDEpLCBEZWNpbWFsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZGl2aWRlX2ludCgxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmRpdmlkZV9pbnQoRGVjaW1hbCgxKSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5kaXZpZGVfaW50KDEsIERlY2ltYWwoMikpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuZGl2aWRlX2ludCwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuZGl2aWRlX2ludCwgMSwgJzInKQorCisgICAgZGVmIHRlc3RfZGl2bW9kKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmRpdm1vZChEZWNpbWFsKDEpLCBEZWNpbWFsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZGl2bW9kKDEsIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZGl2bW9kKERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZGl2bW9kKDEsIERlY2ltYWwoMikpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuZGl2bW9kLCAnMScsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5kaXZtb2QsIDEsICcyJykKKworICAgIGRlZiB0ZXN0X2V4cChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5leHAoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5leHAoMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuZXhwLCAnMTAnKQorCisgICAgZGVmIHRlc3RfZm1hKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmZtYShEZWNpbWFsKDIpLCBEZWNpbWFsKDMpLCBEZWNpbWFsKDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZm1hKDIsIDMsIDQpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZm1hKERlY2ltYWwoMiksIDMsIDQpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZm1hKDIsIERlY2ltYWwoMyksIDQpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZm1hKDIsIDMsIERlY2ltYWwoNCkpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZm1hKERlY2ltYWwoMiksIERlY2ltYWwoMyksIDQpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuZm1hLCAnMicsIDMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5mbWEsIDIsICczJywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmZtYSwgMiwgMywgJzQnKQorCisgICAgZGVmIHRlc3RfaXNfZmluaXRlKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmlzX2Zpbml0ZShEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmlzX2Zpbml0ZSgxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5pc19maW5pdGUsICcxMCcpCisKKyAgICBkZWYgdGVzdF9pc19pbmZpbml0ZShzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5pc19pbmZpbml0ZShEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmlzX2luZmluaXRlKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmlzX2luZmluaXRlLCAnMTAnKQorCisgICAgZGVmIHRlc3RfaXNfbmFuKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmlzX25hbihEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmlzX25hbigxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5pc19uYW4sICcxMCcpCisKKyAgICBkZWYgdGVzdF9pc19ub3JtYWwoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuaXNfbm9ybWFsKERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuaXNfbm9ybWFsKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmlzX25vcm1hbCwgJzEwJykKKworICAgIGRlZiB0ZXN0X2lzX3FuYW4oc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuaXNfcW5hbihEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmlzX3FuYW4oMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuaXNfcW5hbiwgJzEwJykKKworICAgIGRlZiB0ZXN0X2lzX3NpZ25lZChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5pc19zaWduZWQoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5pc19zaWduZWQoMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuaXNfc2lnbmVkLCAnMTAnKQorCisgICAgZGVmIHRlc3RfaXNfc25hbihzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5pc19zbmFuKERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuaXNfc25hbigxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5pc19zbmFuLCAnMTAnKQorCisgICAgZGVmIHRlc3RfaXNfc3Vibm9ybWFsKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmlzX3N1Ym5vcm1hbChEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmlzX3N1Ym5vcm1hbCgxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5pc19zdWJub3JtYWwsICcxMCcpCisKKyAgICBkZWYgdGVzdF9pc196ZXJvKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmlzX3plcm8oRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5pc196ZXJvKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmlzX3plcm8sICcxMCcpCisKKyAgICBkZWYgdGVzdF9sbihzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5sbihEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmxuKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmxuLCAnMTAnKQorCisgICAgZGVmIHRlc3RfbG9nMTAoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMubG9nMTAoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5sb2cxMCgxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5sb2cxMCwgJzEwJykKKworICAgIGRlZiB0ZXN0X2xvZ2Ioc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMubG9nYihEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmxvZ2IoMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubG9nYiwgJzEwJykKKworICAgIGRlZiB0ZXN0X2xvZ2ljYWxfYW5kKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmxvZ2ljYWxfYW5kKERlY2ltYWwoMSksIERlY2ltYWwoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5sb2dpY2FsX2FuZCgxLCAxKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmxvZ2ljYWxfYW5kKERlY2ltYWwoMSksIDEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubG9naWNhbF9hbmQoMSwgRGVjaW1hbCgxKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5sb2dpY2FsX2FuZCwgJzEnLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubG9naWNhbF9hbmQsIDEsICcxJykKKworICAgIGRlZiB0ZXN0X2xvZ2ljYWxfaW52ZXJ0KHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmxvZ2ljYWxfaW52ZXJ0KERlY2ltYWwoMTAwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5sb2dpY2FsX2ludmVydCgxMDAwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmxvZ2ljYWxfaW52ZXJ0LCAnMTAwMCcpCisKKyAgICBkZWYgdGVzdF9sb2dpY2FsX29yKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmxvZ2ljYWxfb3IoRGVjaW1hbCgxKSwgRGVjaW1hbCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmxvZ2ljYWxfb3IoMSwgMSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5sb2dpY2FsX29yKERlY2ltYWwoMSksIDEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubG9naWNhbF9vcigxLCBEZWNpbWFsKDEpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmxvZ2ljYWxfb3IsICcxJywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmxvZ2ljYWxfb3IsIDEsICcxJykKKworICAgIGRlZiB0ZXN0X2xvZ2ljYWxfeG9yKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmxvZ2ljYWxfeG9yKERlY2ltYWwoMSksIERlY2ltYWwoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5sb2dpY2FsX3hvcigxLCAxKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmxvZ2ljYWxfeG9yKERlY2ltYWwoMSksIDEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubG9naWNhbF94b3IoMSwgRGVjaW1hbCgxKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5sb2dpY2FsX3hvciwgJzEnLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubG9naWNhbF94b3IsIDEsICcxJykKKworICAgIGRlZiB0ZXN0X21heChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5tYXgoRGVjaW1hbCgxKSwgRGVjaW1hbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm1heCgxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm1heChEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm1heCgxLCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm1heCwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubWF4LCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9tYXhfbWFnKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLm1heF9tYWcoRGVjaW1hbCgxKSwgRGVjaW1hbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm1heF9tYWcoMSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5tYXhfbWFnKERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubWF4X21hZygxLCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm1heF9tYWcsICcxJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm1heF9tYWcsIDEsICcyJykKKworICAgIGRlZiB0ZXN0X21pbihzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5taW4oRGVjaW1hbCgxKSwgRGVjaW1hbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm1pbigxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm1pbihEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm1pbigxLCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm1pbiwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubWluLCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9taW5fbWFnKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLm1pbl9tYWcoRGVjaW1hbCgxKSwgRGVjaW1hbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm1pbl9tYWcoMSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5taW5fbWFnKERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubWluX21hZygxLCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm1pbl9tYWcsICcxJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm1pbl9tYWcsIDEsICcyJykKKworICAgIGRlZiB0ZXN0X21pbnVzKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLm1pbnVzKERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubWludXMoMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubWludXMsICcxMCcpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBseShzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5tdWx0aXBseShEZWNpbWFsKDEpLCBEZWNpbWFsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubXVsdGlwbHkoMSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5tdWx0aXBseShEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm11bHRpcGx5KDEsIERlY2ltYWwoMikpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubXVsdGlwbHksICcxJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm11bHRpcGx5LCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9uZXh0X21pbnVzKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLm5leHRfbWludXMoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5uZXh0X21pbnVzKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm5leHRfbWludXMsICcxMCcpCisKKyAgICBkZWYgdGVzdF9uZXh0X3BsdXMoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMubmV4dF9wbHVzKERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubmV4dF9wbHVzKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm5leHRfcGx1cywgJzEwJykKKworICAgIGRlZiB0ZXN0X25leHRfdG93YXJkKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLm5leHRfdG93YXJkKERlY2ltYWwoMSksIERlY2ltYWwoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5uZXh0X3Rvd2FyZCgxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm5leHRfdG93YXJkKERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubmV4dF90b3dhcmQoMSwgRGVjaW1hbCgyKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5uZXh0X3Rvd2FyZCwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubmV4dF90b3dhcmQsIDEsICcyJykKKworICAgIGRlZiB0ZXN0X25vcm1hbGl6ZShzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5ub3JtYWxpemUoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5ub3JtYWxpemUoMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubm9ybWFsaXplLCAnMTAnKQorCisgICAgZGVmIHRlc3RfbnVtYmVyX2NsYXNzKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5udW1iZXJfY2xhc3MoMTIzKSwgYy5udW1iZXJfY2xhc3MoRGVjaW1hbCgxMjMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm51bWJlcl9jbGFzcygwKSwgYy5udW1iZXJfY2xhc3MoRGVjaW1hbCgwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5udW1iZXJfY2xhc3MoLTQ1KSwgYy5udW1iZXJfY2xhc3MoRGVjaW1hbCgtNDUpKSkKKworICAgIGRlZiB0ZXN0X3Bvd2VyKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLnBvd2VyKERlY2ltYWwoMSksIERlY2ltYWwoNCksIERlY2ltYWwoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5wb3dlcigxLCA0LCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnBvd2VyKERlY2ltYWwoMSksIDQsIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucG93ZXIoMSwgRGVjaW1hbCg0KSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5wb3dlcigxLCA0LCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnBvd2VyKERlY2ltYWwoMSksIERlY2ltYWwoNCksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMucG93ZXIsICcxJywgNCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnBvd2VyLCAxLCAnNCcsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5wb3dlciwgMSwgNCwgJzInKQorCisgICAgZGVmIHRlc3RfcGx1cyhzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5wbHVzKERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucGx1cygxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5wbHVzLCAnMTAnKQorCisgICAgZGVmIHRlc3RfcXVhbnRpemUoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMucXVhbnRpemUoRGVjaW1hbCgxKSwgRGVjaW1hbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnF1YW50aXplKDEsIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucXVhbnRpemUoRGVjaW1hbCgxKSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5xdWFudGl6ZSgxLCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnF1YW50aXplLCAnMScsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5xdWFudGl6ZSwgMSwgJzInKQorCisgICAgZGVmIHRlc3RfcmVtYWluZGVyKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLnJlbWFpbmRlcihEZWNpbWFsKDEpLCBEZWNpbWFsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucmVtYWluZGVyKDEsIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucmVtYWluZGVyKERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucmVtYWluZGVyKDEsIERlY2ltYWwoMikpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMucmVtYWluZGVyLCAnMScsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5yZW1haW5kZXIsIDEsICcyJykKKworICAgIGRlZiB0ZXN0X3JlbWFpbmRlcl9uZWFyKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLnJlbWFpbmRlcl9uZWFyKERlY2ltYWwoMSksIERlY2ltYWwoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5yZW1haW5kZXJfbmVhcigxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnJlbWFpbmRlcl9uZWFyKERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucmVtYWluZGVyX25lYXIoMSwgRGVjaW1hbCgyKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5yZW1haW5kZXJfbmVhciwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMucmVtYWluZGVyX25lYXIsIDEsICcyJykKKworICAgIGRlZiB0ZXN0X3JvdGF0ZShzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5yb3RhdGUoRGVjaW1hbCgxKSwgRGVjaW1hbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnJvdGF0ZSgxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnJvdGF0ZShEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnJvdGF0ZSgxLCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnJvdGF0ZSwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMucm90YXRlLCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9zcXJ0KHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLnNxcnQoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zcXJ0KDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnNxcnQsICcxMCcpCisKKyAgICBkZWYgdGVzdF9zYW1lX3F1YW50dW0oc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuc2FtZV9xdWFudHVtKERlY2ltYWwoMSksIERlY2ltYWwoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zYW1lX3F1YW50dW0oMSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zYW1lX3F1YW50dW0oRGVjaW1hbCgxKSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zYW1lX3F1YW50dW0oMSwgRGVjaW1hbCgyKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5zYW1lX3F1YW50dW0sICcxJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnNhbWVfcXVhbnR1bSwgMSwgJzInKQorCisgICAgZGVmIHRlc3Rfc2NhbGViKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLnNjYWxlYihEZWNpbWFsKDEpLCBEZWNpbWFsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc2NhbGViKDEsIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc2NhbGViKERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc2NhbGViKDEsIERlY2ltYWwoMikpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuc2NhbGViLCAnMScsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5zY2FsZWIsIDEsICcyJykKKworICAgIGRlZiB0ZXN0X3NoaWZ0KHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLnNoaWZ0KERlY2ltYWwoMSksIERlY2ltYWwoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zaGlmdCgxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnNoaWZ0KERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc2hpZnQoMSwgRGVjaW1hbCgyKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5zaGlmdCwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuc2hpZnQsIDEsICcyJykKKworICAgIGRlZiB0ZXN0X3N1YnRyYWN0KHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLnN1YnRyYWN0KERlY2ltYWwoMSksIERlY2ltYWwoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zdWJ0cmFjdCgxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnN1YnRyYWN0KERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc3VidHJhY3QoMSwgRGVjaW1hbCgyKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5zdWJ0cmFjdCwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuc3VidHJhY3QsIDEsICcyJykKKworICAgIGRlZiB0ZXN0X3RvX2VuZ19zdHJpbmcoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMudG9fZW5nX3N0cmluZyhEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnRvX2VuZ19zdHJpbmcoMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMudG9fZW5nX3N0cmluZywgJzEwJykKKworICAgIGRlZiB0ZXN0X3RvX3NjaV9zdHJpbmcoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMudG9fc2NpX3N0cmluZyhEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnRvX3NjaV9zdHJpbmcoMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMudG9fc2NpX3N0cmluZywgJzEwJykKKworICAgIGRlZiB0ZXN0X3RvX2ludGVncmFsX2V4YWN0KHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLnRvX2ludGVncmFsX2V4YWN0KERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMudG9faW50ZWdyYWxfZXhhY3QoMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMudG9faW50ZWdyYWxfZXhhY3QsICcxMCcpCisKKyAgICBkZWYgdGVzdF90b19pbnRlZ3JhbF92YWx1ZShzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy50b19pbnRlZ3JhbF92YWx1ZShEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnRvX2ludGVncmFsX3ZhbHVlKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnRvX2ludGVncmFsX3ZhbHVlLCAnMTAnKQorCitjbGFzcyBXaXRoU3RhdGVtZW50VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBDYW4ndCBkbyB0aGVzZSBhcyBkb2NzdHJpbmdzIHVudGlsIFB5dGhvbiAyLjYKKyAgICAjIGFzIGRvY3Rlc3QgY2FuJ3QgaGFuZGxlIF9fZnV0dXJlX18gc3RhdGVtZW50cworCisgICAgZGVmIHRlc3RfbG9jYWxjb250ZXh0KHNlbGYpOgorICAgICAgICAjIFVzZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBpbiB0aGUgYmxvY2sKKyAgICAgICAgb3JpZ19jdHggPSBnZXRjb250ZXh0KCkKKyAgICAgICAgd2l0aCBsb2NhbGNvbnRleHQoKSBhcyBlbnRlcl9jdHg6CisgICAgICAgICAgICBzZXRfY3R4ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIGZpbmFsX2N0eCA9IGdldGNvbnRleHQoKQorICAgICAgICBzZWxmLmFzc2VydElzKG9yaWdfY3R4LCBmaW5hbF9jdHgsICdkaWQgbm90IHJlc3RvcmUgY29udGV4dCBjb3JyZWN0bHknKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KG9yaWdfY3R4LCBzZXRfY3R4LCAnZGlkIG5vdCBjb3B5IHRoZSBjb250ZXh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZXRfY3R4LCBlbnRlcl9jdHgsICdfX2VudGVyX18gcmV0dXJuZWQgd3JvbmcgY29udGV4dCcpCisKKyAgICBkZWYgdGVzdF9sb2NhbGNvbnRleHRhcmcoc2VsZik6CisgICAgICAgICMgVXNlIGEgY29weSBvZiB0aGUgc3VwcGxpZWQgY29udGV4dCBpbiB0aGUgYmxvY2sKKyAgICAgICAgb3JpZ19jdHggPSBnZXRjb250ZXh0KCkKKyAgICAgICAgbmV3X2N0eCA9IENvbnRleHQocHJlYz00MikKKyAgICAgICAgd2l0aCBsb2NhbGNvbnRleHQobmV3X2N0eCkgYXMgZW50ZXJfY3R4OgorICAgICAgICAgICAgc2V0X2N0eCA9IGdldGNvbnRleHQoKQorICAgICAgICBmaW5hbF9jdHggPSBnZXRjb250ZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcmlnX2N0eCwgZmluYWxfY3R4LCAnZGlkIG5vdCByZXN0b3JlIGNvbnRleHQgY29ycmVjdGx5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXRfY3R4LnByZWMsIG5ld19jdHgucHJlYywgJ2RpZCBub3Qgc2V0IGNvcnJlY3QgY29udGV4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QobmV3X2N0eCwgc2V0X2N0eCwgJ2RpZCBub3QgY29weSB0aGUgY29udGV4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2V0X2N0eCwgZW50ZXJfY3R4LCAnX19lbnRlcl9fIHJldHVybmVkIHdyb25nIGNvbnRleHQnKQorCitjbGFzcyBDb250ZXh0RmxhZ3ModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2ZsYWdzX2lycmVsZXZhbnQoc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCB0aGUgcmVzdWx0IChudW1lcmljIHJlc3VsdCArIGZsYWdzIHJhaXNlZCkgb2YgYW4KKyAgICAgICAgIyBhcml0aG1ldGljIG9wZXJhdGlvbiBkb2Vzbid0IGRlcGVuZCBvbiB0aGUgY3VycmVudCBmbGFncworCisgICAgICAgIGNvbnRleHQgPSBDb250ZXh0KHByZWM9OSwgRW1pbiA9IC05OTk5OTk5OTksIEVtYXggPSA5OTk5OTk5OTksCisgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nPVJPVU5EX0hBTEZfRVZFTiwgdHJhcHM9W10sIGZsYWdzPVtdKQorCisgICAgICAgICMgb3BlcmF0aW9ucyB0aGF0IHJhaXNlIHZhcmlvdXMgZmxhZ3MsIGluIHRoZSBmb3JtIChmdW5jdGlvbiwgYXJnbGlzdCkKKyAgICAgICAgb3BlcmF0aW9ucyA9IFsKKyAgICAgICAgICAgIChjb250ZXh0Ll9hcHBseSwgW0RlY2ltYWwoIjEwMEUtMTAwMDAwMDAwOSIpXSksCisgICAgICAgICAgICAoY29udGV4dC5zcXJ0LCBbRGVjaW1hbCgyKV0pLAorICAgICAgICAgICAgKGNvbnRleHQuYWRkLCBbRGVjaW1hbCgiMS4yMzQ1Njc4OSIpLCBEZWNpbWFsKCI5Ljg3NjU0MzIxIildKSwKKyAgICAgICAgICAgIChjb250ZXh0Lm11bHRpcGx5LCBbRGVjaW1hbCgiMS4yMzQ1Njc4OSIpLCBEZWNpbWFsKCI5Ljg3NjU0MzIxIildKSwKKyAgICAgICAgICAgIChjb250ZXh0LnN1YnRyYWN0LCBbRGVjaW1hbCgiMS4yMzQ1Njc4OSIpLCBEZWNpbWFsKCI5Ljg3NjU0MzIxIildKSwKKyAgICAgICAgICAgIF0KKworICAgICAgICAjIHRyeSB2YXJpb3VzIGZsYWdzIGluZGl2aWR1YWxseSwgdGhlbiBhIHdob2xlIGxvdCBhdCBvbmNlCisgICAgICAgIGZsYWdzZXRzID0gW1tJbmV4YWN0XSwgW1JvdW5kZWRdLCBbVW5kZXJmbG93XSwgW0NsYW1wZWRdLCBbU3Vibm9ybWFsXSwKKyAgICAgICAgICAgICAgICAgICAgW0luZXhhY3QsIFJvdW5kZWQsIFVuZGVyZmxvdywgQ2xhbXBlZCwgU3Vibm9ybWFsXV0KKworICAgICAgICBmb3IgZm4sIGFyZ3MgaW4gb3BlcmF0aW9uczoKKyAgICAgICAgICAgICMgZmluZCBhbnN3ZXIgYW5kIGZsYWdzIHJhaXNlZCB1c2luZyBhIGNsZWFuIGNvbnRleHQKKyAgICAgICAgICAgIGNvbnRleHQuY2xlYXJfZmxhZ3MoKQorICAgICAgICAgICAgYW5zID0gZm4oKmFyZ3MpCisgICAgICAgICAgICBmbGFncyA9IFtrIGZvciBrLCB2IGluIGNvbnRleHQuZmxhZ3MuaXRlbXMoKSBpZiB2XQorCisgICAgICAgICAgICBmb3IgZXh0cmFfZmxhZ3MgaW4gZmxhZ3NldHM6CisgICAgICAgICAgICAgICAgIyBzZXQgZmxhZ3MsIGJlZm9yZSBjYWxsaW5nIG9wZXJhdGlvbgorICAgICAgICAgICAgICAgIGNvbnRleHQuY2xlYXJfZmxhZ3MoKQorICAgICAgICAgICAgICAgIGZvciBmbGFnIGluIGV4dHJhX2ZsYWdzOgorICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihmbGFnKQorICAgICAgICAgICAgICAgIG5ld19hbnMgPSBmbigqYXJncykKKworICAgICAgICAgICAgICAgICMgZmxhZ3MgdGhhdCB3ZSBleHBlY3QgdG8gYmUgc2V0IGFmdGVyIHRoZSBvcGVyYXRpb24KKyAgICAgICAgICAgICAgICBleHBlY3RlZF9mbGFncyA9IGxpc3QoZmxhZ3MpCisgICAgICAgICAgICAgICAgZm9yIGZsYWcgaW4gZXh0cmFfZmxhZ3M6CisgICAgICAgICAgICAgICAgICAgIGlmIGZsYWcgbm90IGluIGV4cGVjdGVkX2ZsYWdzOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZmxhZ3MuYXBwZW5kKGZsYWcpCisKKyAgICAgICAgICAgICAgICAjIGZsYWdzIHdlIGFjdHVhbGx5IGdvdAorICAgICAgICAgICAgICAgIG5ld19mbGFncyA9IFtrIGZvciBrLHYgaW4gY29udGV4dC5mbGFncy5pdGVtcygpIGlmIHZdCisKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFucywgbmV3X2FucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVyYXRpb24gcHJvZHVjZXMgZGlmZmVyZW50IGFuc3dlcnMgZGVwZW5kaW5nIG9uIGZsYWdzIHNldDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXMsIGdvdCAlcy4iICUgKGFucywgbmV3X2FucykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKG5ld19mbGFncywgZXhwZWN0ZWRfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhdGlvbiByYWlzZXMgZGlmZmVyZW50IGZsYWdzIGRlcGVuZGluZyBvbiBmbGFncyBzZXQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcywgZ290ICVzIiAlIChleHBlY3RlZF9mbGFncywgbmV3X2ZsYWdzKSkKKworZGVmIHRlc3RfbWFpbihhcml0aD1GYWxzZSwgdmVyYm9zZT1Ob25lLCB0b2RvX3Rlc3RzPU5vbmUsIGRlYnVnPU5vbmUpOgorICAgICIiIiBFeGVjdXRlIHRoZSB0ZXN0cy4KKworICAgIFJ1bnMgYWxsIGFyaXRobWV0aWMgdGVzdHMgaWYgYXJpdGggaXMgVHJ1ZSBvciBpZiB0aGUgImRlY2ltYWwiIHJlc291cmNlCisgICAgaXMgZW5hYmxlZCBpbiByZWdydGVzdC5weQorICAgICIiIgorCisgICAgaW5pdCgpCisgICAgZ2xvYmFsIFRFU1RfQUxMLCBERUJVRworICAgIFRFU1RfQUxMID0gYXJpdGggb3IgaXNfcmVzb3VyY2VfZW5hYmxlZCgnZGVjaW1hbCcpCisgICAgREVCVUcgPSBkZWJ1ZworCisgICAgaWYgdG9kb190ZXN0cyBpcyBOb25lOgorICAgICAgICB0ZXN0X2NsYXNzZXMgPSBbCisgICAgICAgICAgICBEZWNpbWFsRXhwbGljaXRDb25zdHJ1Y3Rpb25UZXN0LAorICAgICAgICAgICAgRGVjaW1hbEltcGxpY2l0Q29uc3RydWN0aW9uVGVzdCwKKyAgICAgICAgICAgIERlY2ltYWxBcml0aG1ldGljT3BlcmF0b3JzVGVzdCwKKyAgICAgICAgICAgIERlY2ltYWxGb3JtYXRUZXN0LAorICAgICAgICAgICAgRGVjaW1hbFVzZU9mQ29udGV4dFRlc3QsCisgICAgICAgICAgICBEZWNpbWFsVXNhYmlsaXR5VGVzdCwKKyAgICAgICAgICAgIERlY2ltYWxQeXRob25BUEl0ZXN0cywKKyAgICAgICAgICAgIENvbnRleHRBUEl0ZXN0cywKKyAgICAgICAgICAgIERlY2ltYWxUZXN0LAorICAgICAgICAgICAgV2l0aFN0YXRlbWVudFRlc3QsCisgICAgICAgICAgICBDb250ZXh0RmxhZ3MKKyAgICAgICAgXQorICAgIGVsc2U6CisgICAgICAgIHRlc3RfY2xhc3NlcyA9IFtEZWNpbWFsVGVzdF0KKworICAgICMgRHluYW1pY2FsbHkgYnVpbGQgY3VzdG9tIHRlc3QgZGVmaW5pdGlvbiBmb3IgZWFjaCBmaWxlIGluIHRoZSB0ZXN0CisgICAgIyBkaXJlY3RvcnkgYW5kIGFkZCB0aGUgZGVmaW5pdGlvbnMgdG8gdGhlIERlY2ltYWxUZXN0IGNsYXNzLiAgVGhpcworICAgICMgcHJvY2VkdXJlIGluc3VyZXMgdGhhdCBuZXcgZmlsZXMgZG8gbm90IGdldCBza2lwcGVkLgorICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CisgICAgICAgIGlmICcuZGVjVGVzdCcgbm90IGluIGZpbGVuYW1lIG9yIGZpbGVuYW1lLnN0YXJ0c3dpdGgoIi4iKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGhlYWQsIHRhaWwgPSBmaWxlbmFtZS5zcGxpdCgnLicpCisgICAgICAgIGlmIHRvZG9fdGVzdHMgaXMgbm90IE5vbmUgYW5kIGhlYWQgbm90IGluIHRvZG9fdGVzdHM6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB0ZXN0ZXIgPSBsYW1iZGEgc2VsZiwgZj1maWxlbmFtZTogc2VsZi5ldmFsX2ZpbGUoZGlyZWN0b3J5ICsgZikKKyAgICAgICAgc2V0YXR0cihEZWNpbWFsVGVzdCwgJ3Rlc3RfJyArIGhlYWQsIHRlc3RlcikKKyAgICAgICAgZGVsIGZpbGVuYW1lLCBoZWFkLCB0YWlsLCB0ZXN0ZXIKKworCisgICAgdHJ5OgorICAgICAgICBydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKyAgICAgICAgaWYgdG9kb190ZXN0cyBpcyBOb25lOgorICAgICAgICAgICAgaW1wb3J0IGRlY2ltYWwgYXMgRGVjaW1hbE1vZHVsZQorICAgICAgICAgICAgcnVuX2RvY3Rlc3QoRGVjaW1hbE1vZHVsZSwgdmVyYm9zZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBzZXRjb250ZXh0KE9SSUdJTkFMX0NPTlRFWFQpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IG9wdHBhcnNlCisgICAgcCA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcigidGVzdF9kZWNpbWFsLnB5IFstLWRlYnVnXSBbey0tc2tpcCB8IHRlc3QxIFt0ZXN0MiBbLi4uXV19XSIpCisgICAgcC5hZGRfb3B0aW9uKCctLWRlYnVnJywgJy1kJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nc2hvd3MgdGhlIHRlc3QgbnVtYmVyIGFuZCBjb250ZXh0IGJlZm9yZSBlYWNoIHRlc3QnKQorICAgIHAuYWRkX29wdGlvbignLS1za2lwJywgICctcycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J3NraXAgb3ZlciA5MCUgb2YgdGhlIGFyaXRobWV0aWMgdGVzdHMnKQorICAgIChvcHQsIGFyZ3MpID0gcC5wYXJzZV9hcmdzKCkKKworICAgIGlmIG9wdC5za2lwOgorICAgICAgICB0ZXN0X21haW4oYXJpdGg9RmFsc2UsIHZlcmJvc2U9VHJ1ZSkKKyAgICBlbGlmIGFyZ3M6CisgICAgICAgIHRlc3RfbWFpbihhcml0aD1UcnVlLCB2ZXJib3NlPVRydWUsIHRvZG9fdGVzdHM9YXJncywgZGVidWc9b3B0LmRlYnVnKQorICAgIGVsc2U6CisgICAgICAgIHRlc3RfbWFpbihhcml0aD1UcnVlLCB2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWNpbWFsLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlY2ltYWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYWZmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWNpbWFsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWNpbWFsLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlY2ltYWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYWZmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWNpbWFsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWNvcmF0b3JzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjb3JhdG9ycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjJiYzMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjb3JhdG9ycy5weQpAQCAtMCwwICsxLDMwOSBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitkZWYgZnVuY2F0dHJzKCoqa3dkcyk6CisgICAgZGVmIGRlY29yYXRlKGZ1bmMpOgorICAgICAgICBmdW5jLl9fZGljdF9fLnVwZGF0ZShrd2RzKQorICAgICAgICByZXR1cm4gZnVuYworICAgIHJldHVybiBkZWNvcmF0ZQorCitjbGFzcyBNaXNjRGVjb3JhdG9ycyAob2JqZWN0KToKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGF1dGhvcihuYW1lKToKKyAgICAgICAgZGVmIGRlY29yYXRlKGZ1bmMpOgorICAgICAgICAgICAgZnVuYy5fX2RpY3RfX1snYXV0aG9yJ10gPSBuYW1lCisgICAgICAgICAgICByZXR1cm4gZnVuYworICAgICAgICByZXR1cm4gZGVjb3JhdGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBEYmNoZWNrRXJyb3IgKEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cHJzdHIsIGZ1bmMsIGFyZ3MsIGt3ZHMpOgorICAgICAgICAjIEEgcmVhbCB2ZXJzaW9uIG9mIHRoaXMgd291bGQgc2V0IGF0dHJpYnV0ZXMgaGVyZQorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgImRiY2hlY2sgJXIgZmFpbGVkIChmdW5jPSVzIGFyZ3M9JXMga3dkcz0lcykiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHByc3RyLCBmdW5jLCBhcmdzLCBrd2RzKSkKKworCitkZWYgZGJjaGVjayhleHByc3RyLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKToKKyAgICAiRGVjb3JhdG9yIHRvIGltcGxlbWVudCBkZWJ1Z2dpbmcgYXNzZXJ0aW9ucyIKKyAgICBkZWYgZGVjb3JhdGUoZnVuYyk6CisgICAgICAgIGV4cHIgPSBjb21waWxlKGV4cHJzdHIsICJkYmNoZWNrLSVzIiAlIGZ1bmMuZnVuY19uYW1lLCAiZXZhbCIpCisgICAgICAgIGRlZiBjaGVjaygqYXJncywgKiprd2RzKToKKyAgICAgICAgICAgIGlmIG5vdCBldmFsKGV4cHIsIGdsb2JhbHMsIGxvY2Fscyk6CisgICAgICAgICAgICAgICAgcmFpc2UgRGJjaGVja0Vycm9yKGV4cHJzdHIsIGZ1bmMsIGFyZ3MsIGt3ZHMpCisgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprd2RzKQorICAgICAgICByZXR1cm4gY2hlY2sKKyAgICByZXR1cm4gZGVjb3JhdGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgY291bnRjYWxscyhjb3VudHMpOgorICAgICJEZWNvcmF0b3IgdG8gY291bnQgY2FsbHMgdG8gYSBmdW5jdGlvbiIKKyAgICBkZWYgZGVjb3JhdGUoZnVuYyk6CisgICAgICAgIGZ1bmNfbmFtZSA9IGZ1bmMuZnVuY19uYW1lCisgICAgICAgIGNvdW50c1tmdW5jX25hbWVdID0gMAorICAgICAgICBkZWYgY2FsbCgqYXJncywgKiprd2RzKToKKyAgICAgICAgICAgIGNvdW50c1tmdW5jX25hbWVdICs9IDEKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3ZHMpCisgICAgICAgIGNhbGwuZnVuY19uYW1lID0gZnVuY19uYW1lCisgICAgICAgIHJldHVybiBjYWxsCisgICAgcmV0dXJuIGRlY29yYXRlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIG1lbW9pemUoZnVuYyk6CisgICAgc2F2ZWQgPSB7fQorICAgIGRlZiBjYWxsKCphcmdzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNhdmVkW2FyZ3NdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJlcyA9IGZ1bmMoKmFyZ3MpCisgICAgICAgICAgICBzYXZlZFthcmdzXSA9IHJlcworICAgICAgICAgICAgcmV0dXJuIHJlcworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgIyBVbmhhc2hhYmxlIGFyZ3VtZW50CisgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncykKKyAgICBjYWxsLmZ1bmNfbmFtZSA9IGZ1bmMuZnVuY19uYW1lCisgICAgcmV0dXJuIGNhbGwKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0RGVjb3JhdG9ycyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zaW5nbGUoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiBmb28oKTogcmV0dXJuIDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5mb28oKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQygpLmZvbygpLCA0MikKKworICAgIGRlZiB0ZXN0X3N0YXRpY21ldGhvZF9mdW5jdGlvbihzZWxmKToKKyAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICBkZWYgbm90YW1ldGhvZCh4KToKKyAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbm90YW1ldGhvZCwgMSkKKworICAgIGRlZiB0ZXN0X2RvdHRlZChzZWxmKToKKyAgICAgICAgZGVjb3JhdG9ycyA9IE1pc2NEZWNvcmF0b3JzKCkKKyAgICAgICAgQGRlY29yYXRvcnMuYXV0aG9yKCdDbGVlc2UnKQorICAgICAgICBkZWYgZm9vKCk6IHJldHVybiA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvbygpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uYXV0aG9yLCAnQ2xlZXNlJykKKworICAgIGRlZiB0ZXN0X2FyZ2Zvcm1zKHNlbGYpOgorICAgICAgICAjIEEgZmV3IHRlc3RzIG9mIGFyZ3VtZW50IHBhc3NpbmcsIGFzIHdlIHVzZSByZXN0cmljdGVkIGZvcm0KKyAgICAgICAgIyBvZiBleHByZXNzaW9ucyBmb3IgZGVjb3JhdG9ycy4KKworICAgICAgICBkZWYgbm90ZWFyZ3MoKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICAgICBkZWYgZGVjb3JhdGUoZnVuYyk6CisgICAgICAgICAgICAgICAgc2V0YXR0cihmdW5jLCAnZGJ2YWwnLCAoYXJncywga3dkcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMKKyAgICAgICAgICAgIHJldHVybiBkZWNvcmF0ZQorCisgICAgICAgIGFyZ3MgPSAoICdOb3cnLCAnaXMnLCAndGhlJywgJ3RpbWUnICkKKyAgICAgICAga3dkcyA9IGRpY3Qob25lPTEsIHR3bz0yKQorICAgICAgICBAbm90ZWFyZ3MoKmFyZ3MsICoqa3dkcykKKyAgICAgICAgZGVmIGYxKCk6IHJldHVybiA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYxKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYxLmRidmFsLCAoYXJncywga3dkcykpCisKKyAgICAgICAgQG5vdGVhcmdzKCd0ZXJyeScsICdnaWxsaWFtJywgZXJpYz0naWRsZScsIGpvaG49J2NsZWVzZScpCisgICAgICAgIGRlZiBmMigpOiByZXR1cm4gODQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMigpLCA4NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMi5kYnZhbCwgKCgndGVycnknLCAnZ2lsbGlhbScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QoZXJpYz0naWRsZScsIGpvaG49J2NsZWVzZScpKSkKKworICAgICAgICBAbm90ZWFyZ3MoMSwgMiwpCisgICAgICAgIGRlZiBmMygpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjMuZGJ2YWwsICgoMSwgMiksIHt9KSkKKworICAgIGRlZiB0ZXN0X2RiY2hlY2soc2VsZik6CisgICAgICAgIEBkYmNoZWNrKCdhcmdzWzFdIGlzIG5vdCBOb25lJykKKyAgICAgICAgZGVmIGYoYSwgYik6CisgICAgICAgICAgICByZXR1cm4gYSArIGIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKDEsIDIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEYmNoZWNrRXJyb3IsIGYsIDEsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9tZW1vaXplKHNlbGYpOgorICAgICAgICBjb3VudHMgPSB7fQorCisgICAgICAgIEBtZW1vaXplCisgICAgICAgIEBjb3VudGNhbGxzKGNvdW50cykKKyAgICAgICAgZGVmIGRvdWJsZSh4KToKKyAgICAgICAgICAgIHJldHVybiB4ICogMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvdWJsZS5mdW5jX25hbWUsICdkb3VibGUnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnRzLCBkaWN0KGRvdWJsZT0wKSkKKworICAgICAgICAjIE9ubHkgdGhlIGZpcnN0IGNhbGwgd2l0aCBhIGdpdmVuIGFyZ3VtZW50IGJ1bXBzIHRoZSBjYWxsIGNvdW50OgorICAgICAgICAjCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZG91YmxlKDIpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50c1snZG91YmxlJ10sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZG91YmxlKDIpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50c1snZG91YmxlJ10sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZG91YmxlKDMpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50c1snZG91YmxlJ10sIDIpCisKKyAgICAgICAgIyBVbmhhc2hhYmxlIGFyZ3VtZW50cyBkbyBub3QgZ2V0IG1lbW9pemVkOgorICAgICAgICAjCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZG91YmxlKFsxMF0pLCBbMTAsIDEwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudHNbJ2RvdWJsZSddLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvdWJsZShbMTBdKSwgWzEwLCAxMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnRzWydkb3VibGUnXSwgNCkKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHN5bnRheCByZXN0cmljdGlvbnMgLSB0aGVzZSBhcmUgYWxsIGNvbXBpbGUtdGltZSBlcnJvcnM6CisgICAgICAgICMKKyAgICAgICAgZm9yIGV4cHIgaW4gWyAiMSsyIiwgInhbM10iLCAiKDEsIDIpIiBdOgorICAgICAgICAgICAgIyBTYW5pdHkgY2hlY2s6IGlzIGV4cHIgaXMgYSB2YWxpZCBleHByZXNzaW9uIGJ5IGl0c2VsZj8KKyAgICAgICAgICAgIGNvbXBpbGUoZXhwciwgInRlc3RleHByIiwgImV4ZWMiKQorCisgICAgICAgICAgICBjb2Rlc3RyID0gIkAlc1xuZGVmIGYoKTogcGFzcyIgJSBleHByCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZSwgY29kZXN0ciwgInRlc3QiLCAiZXhlYyIpCisKKyAgICAgICAgIyBZb3UgY2FuJ3QgcHV0IG11bHRpcGxlIGRlY29yYXRvcnMgb24gYSBzaW5nbGUgbGluZToKKyAgICAgICAgIworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkBmMSBAZjJcbmRlZiBmKCk6IHBhc3MiLCAidGVzdCIsICJleGVjIikKKworICAgICAgICAjIFRlc3QgcnVudGltZSBlcnJvcnMKKworICAgICAgICBkZWYgdW5pbXAoZnVuYyk6CisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgICAgIGNvbnRleHQgPSBkaWN0KG51bGx2YWw9Tm9uZSwgdW5pbXA9dW5pbXApCisKKyAgICAgICAgZm9yIGV4cHIsIGV4YyBpbiBbICgidW5kZWYiLCBOYW1lRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJudWxsdmFsIiwgVHlwZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgibnVsbHZhbC5hdHRyIiwgQXR0cmlidXRlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ1bmltcCIsIE5vdEltcGxlbWVudGVkRXJyb3IpXToKKyAgICAgICAgICAgIGNvZGVzdHIgPSAiQCVzXG5kZWYgZigpOiBwYXNzXG5hc3NlcnQgZigpIGlzIE5vbmUiICUgZXhwcgorICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoY29kZXN0ciwgInRlc3QiLCAiZXhlYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhleGMsIGV2YWwsIGNvZGUsIGNvbnRleHQpCisKKyAgICBkZWYgdGVzdF9kb3VibGUoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIEBmdW5jYXR0cnMoYWJjPTEsIHh5ej0iaGFoYSIpCisgICAgICAgICAgICBAZnVuY2F0dHJzKGJvb2g9NDIpCisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOiByZXR1cm4gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDKCkuZm9vKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuZm9vLmFiYywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmZvby54eXosICJoYWhhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmZvby5ib29oLCA0MikKKworICAgIGRlZiB0ZXN0X29yZGVyKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluIHRoZSBwcm9wZXIgb3JkZXIgdG8gdGhlIGZ1bmN0aW9uCisgICAgICAgICMgdGhleSBhcmUgZGVjb3JhdGluZy4KKyAgICAgICAgZGVmIGNhbGxudW0obnVtKToKKyAgICAgICAgICAgICIiIkRlY29yYXRvciBmYWN0b3J5IHRoYXQgcmV0dXJucyBhIGRlY29yYXRvciB0aGF0IHJlcGxhY2VzIHRoZQorICAgICAgICAgICAgcGFzc2VkLWluIGZ1bmN0aW9uIHdpdGggb25lIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgb2YgJ251bSciIiIKKyAgICAgICAgICAgIGRlZiBkZWNvKGZ1bmMpOgorICAgICAgICAgICAgICAgIHJldHVybiBsYW1iZGE6IG51bQorICAgICAgICAgICAgcmV0dXJuIGRlY28KKyAgICAgICAgQGNhbGxudW0oMikKKyAgICAgICAgQGNhbGxudW0oMSkKKyAgICAgICAgZGVmIGZvbygpOiByZXR1cm4gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28oKSwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBwbGljYXRpb24gb3JkZXIgb2YgZGVjb3JhdG9ycyBpcyBpbmNvcnJlY3QiKQorCisgICAgZGVmIHRlc3RfZXZhbF9vcmRlcihzZWxmKToKKyAgICAgICAgIyBFdmFsdWF0aW5nIGEgZGVjb3JhdGVkIGZ1bmN0aW9uIGludm9sdmVzIGZvdXIgc3RlcHMgZm9yIGVhY2gKKyAgICAgICAgIyBkZWNvcmF0b3ItbWFrZXIgKHRoZSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBkZWNvcmF0b3IpOgorICAgICAgICAjCisgICAgICAgICMgICAgMTogRXZhbHVhdGUgdGhlIGRlY29yYXRvci1tYWtlciBuYW1lCisgICAgICAgICMgICAgMjogRXZhbHVhdGUgdGhlIGRlY29yYXRvci1tYWtlciBhcmd1bWVudHMgKGlmIGFueSkKKyAgICAgICAgIyAgICAzOiBDYWxsIHRoZSBkZWNvcmF0b3ItbWFrZXIgdG8gbWFrZSBhIGRlY29yYXRvcgorICAgICAgICAjICAgIDQ6IENhbGwgdGhlIGRlY29yYXRvcgorICAgICAgICAjCisgICAgICAgICMgV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZGVjb3JhdG9ycywgdGhlc2Ugc3RlcHMgc2hvdWxkIGJlCisgICAgICAgICMgcGVyZm9ybWVkIGluIHRoZSBhYm92ZSBvcmRlciBmb3IgZWFjaCBkZWNvcmF0b3IsIGJ1dCB3ZSBzaG91bGQKKyAgICAgICAgIyBpdGVyYXRlIHRocm91Z2ggdGhlIGRlY29yYXRvcnMgaW4gdGhlIHJldmVyc2Ugb2YgdGhlIG9yZGVyIHRoZXkKKyAgICAgICAgIyBhcHBlYXIgaW4gdGhlIHNvdXJjZS4KKworICAgICAgICBhY3Rpb25zID0gW10KKworICAgICAgICBkZWYgbWFrZV9kZWNvcmF0b3IodGFnKToKKyAgICAgICAgICAgIGFjdGlvbnMuYXBwZW5kKCdtYWtlZGVjJyArIHRhZykKKyAgICAgICAgICAgIGRlZiBkZWNvcmF0ZShmdW5jKToKKyAgICAgICAgICAgICAgICBhY3Rpb25zLmFwcGVuZCgnY2FsbGRlYycgKyB0YWcpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMKKyAgICAgICAgICAgIHJldHVybiBkZWNvcmF0ZQorCisgICAgICAgIGNsYXNzIE5hbWVMb29rdXBUcmFjZXIgKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggPSBpbmRleAorCisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgZm5hbWUpOgorICAgICAgICAgICAgICAgIGlmIGZuYW1lID09ICdtYWtlX2RlY29yYXRvcic6CisgICAgICAgICAgICAgICAgICAgIG9wbmFtZSwgcmVzID0gKCdldmFsbmFtZScsIG1ha2VfZGVjb3JhdG9yKQorICAgICAgICAgICAgICAgIGVsaWYgZm5hbWUgPT0gJ2FyZyc6CisgICAgICAgICAgICAgICAgICAgIG9wbmFtZSwgcmVzID0gKCdldmFsYXJncycsIHN0cihzZWxmLmluZGV4KSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgRmFsc2UsICJVbmtub3duIGF0dHJuYW1lICVzIiAlIGZuYW1lCisgICAgICAgICAgICAgICAgYWN0aW9ucy5hcHBlbmQoJyVzJWQnICUgKG9wbmFtZSwgc2VsZi5pbmRleCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcworCisgICAgICAgIGMxLCBjMiwgYzMgPSBtYXAoTmFtZUxvb2t1cFRyYWNlciwgWyAxLCAyLCAzIF0pCisKKyAgICAgICAgZXhwZWN0ZWRfYWN0aW9ucyA9IFsgJ2V2YWxuYW1lMScsICdldmFsYXJnczEnLCAnbWFrZWRlYzEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZhbG5hbWUyJywgJ2V2YWxhcmdzMicsICdtYWtlZGVjMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmFsbmFtZTMnLCAnZXZhbGFyZ3MzJywgJ21ha2VkZWMzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhbGxkZWMzJywgJ2NhbGxkZWMyJywgJ2NhbGxkZWMxJyBdCisKKyAgICAgICAgYWN0aW9ucyA9IFtdCisgICAgICAgIEBjMS5tYWtlX2RlY29yYXRvcihjMS5hcmcpCisgICAgICAgIEBjMi5tYWtlX2RlY29yYXRvcihjMi5hcmcpCisgICAgICAgIEBjMy5tYWtlX2RlY29yYXRvcihjMy5hcmcpCisgICAgICAgIGRlZiBmb28oKTogcmV0dXJuIDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vKCksIDQyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9ucywgZXhwZWN0ZWRfYWN0aW9ucykKKworICAgICAgICAjIFRlc3QgdGhlIGVxdWl2YWxlbmNlIGNsYWltIGluIGNoYXB0ZXIgNyBvZiB0aGUgcmVmZXJlbmNlIG1hbnVhbC4KKyAgICAgICAgIworICAgICAgICBhY3Rpb25zID0gW10KKyAgICAgICAgZGVmIGJhcigpOiByZXR1cm4gNDIKKyAgICAgICAgYmFyID0gYzEubWFrZV9kZWNvcmF0b3IoYzEuYXJnKShjMi5tYWtlX2RlY29yYXRvcihjMi5hcmcpKGMzLm1ha2VfZGVjb3JhdG9yKGMzLmFyZykoYmFyKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFyKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbnMsIGV4cGVjdGVkX2FjdGlvbnMpCisKK2NsYXNzIFRlc3RDbGFzc0RlY29yYXRvcnModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICBkZWYgcGxhaW4oeCk6CisgICAgICAgICAgICB4LmV4dHJhID0gJ0hlbGxvJworICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgQHBsYWluCisgICAgICAgIGNsYXNzIEMob2JqZWN0KTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuZXh0cmEsICdIZWxsbycpCisKKyAgICBkZWYgdGVzdF9kb3VibGUoc2VsZik6CisgICAgICAgIGRlZiB0ZW4oeCk6CisgICAgICAgICAgICB4LmV4dHJhID0gMTAKKyAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgIGRlZiBhZGRfZml2ZSh4KToKKyAgICAgICAgICAgIHguZXh0cmEgKz0gNQorICAgICAgICAgICAgcmV0dXJuIHgKKworICAgICAgICBAYWRkX2ZpdmUKKyAgICAgICAgQHRlbgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmV4dHJhLCAxNSkKKworICAgIGRlZiB0ZXN0X29yZGVyKHNlbGYpOgorICAgICAgICBkZWYgYXBwbGllZF9maXJzdCh4KToKKyAgICAgICAgICAgIHguZXh0cmEgPSAnZmlyc3QnCisgICAgICAgICAgICByZXR1cm4geAorICAgICAgICBkZWYgYXBwbGllZF9zZWNvbmQoeCk6CisgICAgICAgICAgICB4LmV4dHJhID0gJ3NlY29uZCcKKyAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgIEBhcHBsaWVkX3NlY29uZAorICAgICAgICBAYXBwbGllZF9maXJzdAorICAgICAgICBjbGFzcyBDKG9iamVjdCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmV4dHJhLCAnc2Vjb25kJykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdERlY29yYXRvcnMpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0Q2xhc3NEZWNvcmF0b3JzKQorCitpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjb3JhdG9ycy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWNvcmF0b3JzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWZmZDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjb3JhdG9ycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjb3JhdG9ycy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWNvcmF0b3JzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGQ3OTViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjb3JhdG9ycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWZhdWx0ZGljdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDc2MGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHkKQEAgLTAsMCArMSwxODEgQEAKKyIiIlVuaXQgdGVzdHMgZm9yIGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0LiIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBjb3B5CitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKKworZGVmIGZvb2JhcigpOgorICAgIHJldHVybiBsaXN0CisKK2NsYXNzIFRlc3REZWZhdWx0RGljdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgZDEgPSBkZWZhdWx0ZGljdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEuZGVmYXVsdF9mYWN0b3J5LCBOb25lKQorICAgICAgICBkMS5kZWZhdWx0X2ZhY3RvcnkgPSBsaXN0CisgICAgICAgIGQxWzEyXS5hcHBlbmQoNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIHsxMjogWzQyXX0pCisgICAgICAgIGQxWzEyXS5hcHBlbmQoMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIHsxMjogWzQyLCAyNF19KQorICAgICAgICBkMVsxM10KKyAgICAgICAgZDFbMTRdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIHsxMjogWzQyLCAyNF0sIDEzOiBbXSwgMTQ6IFtdfSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQxWzEyXSBpcyBub3QgZDFbMTNdIGlzIG5vdCBkMVsxNF0pCisgICAgICAgIGQyID0gZGVmYXVsdGRpY3QobGlzdCwgZm9vPTEsIGJhcj0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLmRlZmF1bHRfZmFjdG9yeSwgbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMiwgeyJmb28iOiAxLCAiYmFyIjogMn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDJbImZvbyJdLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyWyJiYXIiXSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMls0Ml0sIFtdKQorICAgICAgICBzZWxmLmFzc2VydEluKCJmb28iLCBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiZm9vIiwgZDIua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydEluKCJiYXIiLCBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiYmFyIiwgZDIua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydEluKDQyLCBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRJbig0MiwgZDIua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDEyLCBkMikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigxMiwgZDIua2V5cygpKQorICAgICAgICBkMi5kZWZhdWx0X2ZhY3RvcnkgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIuZGVmYXVsdF9mYWN0b3J5LCBOb25lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkMlsxNV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yLCBlcnI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyci5hcmdzLCAoMTUsKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZDJbMTVdIGRpZG4ndCByYWlzZSBLZXlFcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGVmYXVsdGRpY3QsIDEpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nKHNlbGYpOgorICAgICAgICBkMSA9IGRlZmF1bHRkaWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGQxLl9fbWlzc2luZ19fLCA0MikKKyAgICAgICAgZDEuZGVmYXVsdF9mYWN0b3J5ID0gbGlzdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLl9fbWlzc2luZ19fKDQyKSwgW10pCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBkMSA9IGRlZmF1bHRkaWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS5kZWZhdWx0X2ZhY3RvcnksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihkMSksICJkZWZhdWx0ZGljdChOb25lLCB7fSkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwocmVwcihkMSkpLCBkMSkKKyAgICAgICAgZDFbMTFdID0gNDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQxKSwgImRlZmF1bHRkaWN0KE5vbmUsIHsxMTogNDF9KSIpCisgICAgICAgIGQyID0gZGVmYXVsdGRpY3QoaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLmRlZmF1bHRfZmFjdG9yeSwgaW50KQorICAgICAgICBkMlsxMl0gPSA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZDIpLCAiZGVmYXVsdGRpY3QoPHR5cGUgJ2ludCc+LCB7MTI6IDQyfSkiKQorICAgICAgICBkZWYgZm9vKCk6IHJldHVybiA0MworICAgICAgICBkMyA9IGRlZmF1bHRkaWN0KGZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQzLmRlZmF1bHRfZmFjdG9yeSBpcyBmb28pCisgICAgICAgIGQzWzEzXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZDMpLCAiZGVmYXVsdGRpY3QoJXMsIHsxMzogNDN9KSIgJSByZXByKGZvbykpCisKKyAgICBkZWYgdGVzdF9wcmludChzZWxmKToKKyAgICAgICAgZDEgPSBkZWZhdWx0ZGljdCgpCisgICAgICAgIGRlZiBmb28oKTogcmV0dXJuIDQyCisgICAgICAgIGQyID0gZGVmYXVsdGRpY3QoZm9vLCB7MTogMn0pCisgICAgICAgICMgTk9URTogV2UgY2FuJ3QgdXNlIHRlbXBmaWxlLltOYW1lZF1UZW1wb3JhcnlGaWxlIHNpbmNlIHRoaXMKKyAgICAgICAgIyBjb2RlIG11c3QgZXhlcmNpc2UgdGhlIHRwX3ByaW50IEMgY29kZSwgd2hpY2ggb25seSBnZXRzCisgICAgICAgICMgaW52b2tlZCBmb3IgKnJlYWwqIGZpbGVzLgorICAgICAgICB0Zm4gPSB0ZW1wZmlsZS5ta3RlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3Blbih0Zm4sICJ3KyIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5mLCBkMQorICAgICAgICAgICAgICAgIHByaW50ID4+ZiwgZDIKKyAgICAgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmUoKSwgcmVwcihkMSkgKyAiXG4iKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZSgpLCByZXByKGQyKSArICJcbiIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MucmVtb3ZlKHRmbikKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIGQxID0gZGVmYXVsdGRpY3QoKQorICAgICAgICBkMiA9IGQxLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZDIpLCBkZWZhdWx0ZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5kZWZhdWx0X2ZhY3RvcnksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIsIHt9KQorICAgICAgICBkMS5kZWZhdWx0X2ZhY3RvcnkgPSBsaXN0CisgICAgICAgIGQzID0gZDEuY29weSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShkMyksIGRlZmF1bHRkaWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQzLmRlZmF1bHRfZmFjdG9yeSwgbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMywge30pCisgICAgICAgIGQxWzQyXQorICAgICAgICBkNCA9IGQxLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZDQpLCBkZWZhdWx0ZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkNC5kZWZhdWx0X2ZhY3RvcnksIGxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDQsIHs0MjogW119KQorICAgICAgICBkNFsxMl0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkNCwgezQyOiBbXSwgMTI6IFtdfSkKKworICAgICAgICAjIElzc3VlIDY2Mzc6IENvcHkgZmFpbHMgZm9yIGVtcHR5IGRlZmF1bHQgZGljdAorICAgICAgICBkID0gZGVmYXVsdGRpY3QoKQorICAgICAgICBkWydhJ10gPSA0MgorICAgICAgICBlID0gZC5jb3B5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlWydhJ10sIDQyKQorCisgICAgZGVmIHRlc3Rfc2hhbGxvd19jb3B5KHNlbGYpOgorICAgICAgICBkMSA9IGRlZmF1bHRkaWN0KGZvb2JhciwgezE6IDF9KQorICAgICAgICBkMiA9IGNvcHkuY29weShkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5kZWZhdWx0X2ZhY3RvcnksIGZvb2JhcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMiwgZDEpCisgICAgICAgIGQxLmRlZmF1bHRfZmFjdG9yeSA9IGxpc3QKKyAgICAgICAgZDIgPSBjb3B5LmNvcHkoZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIuZGVmYXVsdF9mYWN0b3J5LCBsaXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLCBkMSkKKworICAgIGRlZiB0ZXN0X2RlZXBfY29weShzZWxmKToKKyAgICAgICAgZDEgPSBkZWZhdWx0ZGljdChmb29iYXIsIHsxOiBbMV19KQorICAgICAgICBkMiA9IGNvcHkuZGVlcGNvcHkoZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIuZGVmYXVsdF9mYWN0b3J5LCBmb29iYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIsIGQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZDFbMV0gaXMgbm90IGQyWzFdKQorICAgICAgICBkMS5kZWZhdWx0X2ZhY3RvcnkgPSBsaXN0CisgICAgICAgIGQyID0gY29weS5kZWVwY29weShkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5kZWZhdWx0X2ZhY3RvcnksIGxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIsIGQxKQorCisgICAgZGVmIHRlc3Rfa2V5ZXJyb3Jfd2l0aG91dF9mYWN0b3J5KHNlbGYpOgorICAgICAgICBkMSA9IGRlZmF1bHRkaWN0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZDFbKDEsKV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yLCBlcnI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyci5hcmdzWzBdLCAoMSwpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBLZXlFcnJvciIpCisKKyAgICBkZWYgdGVzdF9yZWN1cnNpdmVfcmVwcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZTIwNDU6IHN0YWNrIG92ZXJmbG93IHdoZW4gZGVmYXVsdF9mYWN0b3J5IGlzIGEgYm91bmQgbWV0aG9kCisgICAgICAgIGNsYXNzIHN1YihkZWZhdWx0ZGljdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5kZWZhdWx0X2ZhY3RvcnkgPSBzZWxmLl9mYWN0b3J5CisgICAgICAgICAgICBkZWYgX2ZhY3Rvcnkoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIGQgPSBzdWIoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihkKS5zdGFydHN3aXRoKAorICAgICAgICAgICAgImRlZmF1bHRkaWN0KDxib3VuZCBtZXRob2Qgc3ViLl9mYWN0b3J5IG9mIGRlZmF1bHRkaWN0KC4uLiIpKQorCisgICAgICAgICMgTk9URTogcHJpbnRpbmcgYSBzdWJjbGFzcyBvZiBhIGJ1aWx0aW4gdHlwZSBkb2VzIG5vdCBjYWxsIGl0cworICAgICAgICAjIHRwX3ByaW50IHNsb3QuIFNvIHRoaXMgcGFydCBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSB0ZXN0IGFzIGFib3ZlLgorICAgICAgICB0Zm4gPSB0ZW1wZmlsZS5ta3RlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3Blbih0Zm4sICJ3KyIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5mLCBkCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MucmVtb3ZlKHRmbikKKworICAgIGRlZiB0ZXN0X2NhbGxhYmxlX2FyZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkZWZhdWx0ZGljdCwge30pCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3REZWZhdWx0RGljdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZWMyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWZhdWx0ZGljdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZWMyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWZhdWx0ZGljdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVxdWUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZXF1ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTVhMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVxdWUucHkKQEAgLTAsMCArMSw4MDMgQEAKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCBzZXFfdGVzdHMKK2ltcG9ydCBnYworaW1wb3J0IHdlYWtyZWYKK2ltcG9ydCBjb3B5CitpbXBvcnQgY1BpY2tsZSBhcyBwaWNrbGUKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzdHJ1Y3QKKworQklHID0gMTAwMDAwCisKK2RlZiBmYWlsKCk6CisgICAgcmFpc2UgU3ludGF4RXJyb3IKKyAgICB5aWVsZCAxCisKK2NsYXNzIEJhZENtcDoKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisKK2NsYXNzIE11dGF0ZUNtcDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVxdWUsIHJlc3VsdCk6CisgICAgICAgIHNlbGYuZGVxdWUgPSBkZXF1ZQorICAgICAgICBzZWxmLnJlc3VsdCA9IHJlc3VsdAorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBzZWxmLmRlcXVlLmNsZWFyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYucmVzdWx0CisKK2NsYXNzIFRlc3RCYXNpYyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSh4cmFuZ2UoLTUxMjUsIC01MDAwKSkKKyAgICAgICAgZC5fX2luaXRfXyh4cmFuZ2UoMjAwKSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwMCwgNDAwKToKKyAgICAgICAgICAgIGQuYXBwZW5kKGkpCisgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHhyYW5nZSgtMjAwLCAwKSk6CisgICAgICAgICAgICBkLmFwcGVuZGxlZnQoaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCByYW5nZSgtMjAwLCA0MDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgNjAwKQorCisgICAgICAgIGxlZnQgPSBbZC5wb3BsZWZ0KCkgZm9yIGkgaW4geHJhbmdlKDI1MCldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVmdCwgcmFuZ2UoLTIwMCwgNTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIHJhbmdlKDUwLCA0MDApKQorCisgICAgICAgIHJpZ2h0ID0gW2QucG9wKCkgZm9yIGkgaW4geHJhbmdlKDI1MCldCisgICAgICAgIHJpZ2h0LnJldmVyc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJpZ2h0LCByYW5nZSgxNTAsIDQwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgcmFuZ2UoNTAsIDE1MCkpCisKKyAgICBkZWYgdGVzdF9tYXhsZW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGRlcXVlLCAnYWJjJywgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGRlcXVlLCAnYWJjJywgLTIpCisgICAgICAgIGl0ID0gaXRlcihyYW5nZSgxMCkpCisgICAgICAgIGQgPSBkZXF1ZShpdCwgbWF4bGVuPTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpdCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZCksICdkZXF1ZShbNywgOCwgOV0sIG1heGxlbj0zKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgcmFuZ2UoNywgMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGRlcXVlKHJhbmdlKDEwKSwgMykpCisgICAgICAgIGQuYXBwZW5kKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIHJhbmdlKDgsIDExKSkKKyAgICAgICAgZC5hcHBlbmRsZWZ0KDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgcmFuZ2UoNywgMTApKQorICAgICAgICBkLmV4dGVuZChbMTAsIDExXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCByYW5nZSg5LCAxMikpCisgICAgICAgIGQuZXh0ZW5kbGVmdChbOCwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgcmFuZ2UoNywgMTApKQorICAgICAgICBkID0gZGVxdWUoeHJhbmdlKDIwMCksIG1heGxlbj0xMCkKKyAgICAgICAgZC5hcHBlbmQoZCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBmbyA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJpbnQgPj4gZm8sIGQsCisgICAgICAgICAgICBmby5jbG9zZSgpCisgICAgICAgICAgICBmbyA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm8ucmVhZCgpLCByZXByKGQpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm8uY2xvc2UoKQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgICAgIGQgPSBkZXF1ZShyYW5nZSgxMCksIG1heGxlbj1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZCksICdkZXF1ZShbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0pJykKKyAgICAgICAgZm8gPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50ID4+IGZvLCBkLAorICAgICAgICAgICAgZm8uY2xvc2UoKQorICAgICAgICAgICAgZm8gPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvLnJlYWQoKSwgcmVwcihkKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZvLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X21heGxlbl96ZXJvKHNlbGYpOgorICAgICAgICBpdCA9IGl0ZXIocmFuZ2UoMTAwKSkKKyAgICAgICAgZGVxdWUoaXQsIG1heGxlbj0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXQpLCBbXSkKKworICAgICAgICBpdCA9IGl0ZXIocmFuZ2UoMTAwKSkKKyAgICAgICAgZCA9IGRlcXVlKG1heGxlbj0wKQorICAgICAgICBkLmV4dGVuZChpdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0KSwgW10pCisKKyAgICAgICAgaXQgPSBpdGVyKHJhbmdlKDEwMCkpCisgICAgICAgIGQgPSBkZXF1ZShtYXhsZW49MCkKKyAgICAgICAgZC5leHRlbmRsZWZ0KGl0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXQpLCBbXSkKKworICAgIGRlZiB0ZXN0X21heGxlbl9hdHRyaWJ1dGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVxdWUoKS5tYXhsZW4sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVxdWUoJ2FiYycpLm1heGxlbiwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXF1ZSgnYWJjJywgbWF4bGVuPTQpLm1heGxlbiwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXF1ZSgnYWJjJywgbWF4bGVuPTIpLm1heGxlbiwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXF1ZSgnYWJjJywgbWF4bGVuPTApLm1heGxlbiwgMCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBkID0gZGVxdWUoJ2FiYycpCisgICAgICAgICAgICBkLm1heGxlbiA9IDEwCisKKyAgICBkZWYgdGVzdF9jb3VudChzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gKCcnLCAnYWJyYWNhZGFicmEnLCAnc2ltc2FsYWJpbScqNTAwKydhYmMnKToKKyAgICAgICAgICAgIHMgPSBsaXN0KHMpCisgICAgICAgICAgICBkID0gZGVxdWUocykKKyAgICAgICAgICAgIGZvciBsZXR0ZXIgaW4gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQobGV0dGVyKSwgZC5jb3VudChsZXR0ZXIpLCAocywgZCwgbGV0dGVyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmNvdW50KSAgICAgICAjIHRvbyBmZXcgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuY291bnQsIDEsIDIpICMgdG9vIG1hbnkgYXJncworICAgICAgICBjbGFzcyBCYWRDb21wYXJlOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmFpc2UgQXJpdGhtZXRpY0Vycm9yCisgICAgICAgIGQgPSBkZXF1ZShbMSwgMiwgQmFkQ29tcGFyZSgpLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJpdGhtZXRpY0Vycm9yLCBkLmNvdW50LCAyKQorICAgICAgICBkID0gZGVxdWUoWzEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcml0aG1ldGljRXJyb3IsIGQuY291bnQsIEJhZENvbXBhcmUoKSkKKyAgICAgICAgY2xhc3MgTXV0YXRpbmdDb21wYXJlOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgc2VsZi5kLnBvcCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgbSA9IE11dGF0aW5nQ29tcGFyZSgpCisgICAgICAgIGQgPSBkZXF1ZShbMSwgMiwgMywgbSwgNCwgNV0pCisgICAgICAgIG0uZCA9IGQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBkLmNvdW50LCAzKQorCisgICAgICAgICMgdGVzdCBpc3N1ZTExMDA0CisgICAgICAgICMgYmxvY2sgYWR2YW5jZSBmYWlsZWQgYWZ0ZXIgcm90YXRpb24gYWxpZ25lZCBlbGVtZW50cyBvbiByaWdodCBzaWRlIG9mIGJsb2NrCisgICAgICAgIGQgPSBkZXF1ZShbTm9uZV0qMTYpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihkKSk6CisgICAgICAgICAgICBkLnJvdGF0ZSgtMSkKKyAgICAgICAgZC5yb3RhdGUoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmNvdW50KDEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuY291bnQoTm9uZSksIDE2KQorCisgICAgZGVmIHRlc3RfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSgneGFiYycpOyBkLnBvcGxlZnQoKQorICAgICAgICBmb3IgZSBpbiBbZCwgZGVxdWUoJ2FiYycpLCBkZXF1ZSgnYWInKSwgZGVxdWUoKSwgbGlzdChkKV06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQ9PWUsIHR5cGUoZCk9PXR5cGUoZSkgYW5kIGxpc3QoZCk9PWxpc3QoZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQhPWUsIG5vdCh0eXBlKGQpPT10eXBlKGUpIGFuZCBsaXN0KGQpPT1saXN0KGUpKSkKKworICAgICAgICBhcmdzID0gbWFwKGRlcXVlLCAoJycsICdhJywgJ2InLCAnYWInLCAnYmEnLCAnYWJjJywgJ3hiYScsICd4YWJjJywgJ2NiYScpKQorICAgICAgICBmb3IgeCBpbiBhcmdzOgorICAgICAgICAgICAgZm9yIHkgaW4gYXJnczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHggPT0geSwgbGlzdCh4KSA9PSBsaXN0KHkpLCAoeCx5KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHggIT0geSwgbGlzdCh4KSAhPSBsaXN0KHkpLCAoeCx5KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHggPCAgeSwgbGlzdCh4KSA8ICBsaXN0KHkpLCAoeCx5KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHggPD0geSwgbGlzdCh4KSA8PSBsaXN0KHkpLCAoeCx5KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHggPiAgeSwgbGlzdCh4KSA+ICBsaXN0KHkpLCAoeCx5KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHggPj0geSwgbGlzdCh4KSA+PSBsaXN0KHkpLCAoeCx5KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh4LHkpLCBjbXAobGlzdCh4KSxsaXN0KHkpKSwgKHgseSkpCisKKyAgICBkZWYgdGVzdF9leHRlbmQoc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSgnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5leHRlbmQsIDEpCisgICAgICAgIGQuZXh0ZW5kKCdiY2QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGxpc3QoJ2FiY2QnKSkKKyAgICAgICAgZC5leHRlbmQoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KCdhYmNkYWJjZCcpKQorCisgICAgZGVmIHRlc3RfaWFkZChzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKCdhJykKKyAgICAgICAgZCArPSAnYmNkJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGxpc3QoJ2FiY2QnKSkKKyAgICAgICAgZCArPSBkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdCgnYWJjZGFiY2QnKSkKKworICAgIGRlZiB0ZXN0X2V4dGVuZGxlZnQoc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSgnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5leHRlbmRsZWZ0LCAxKQorICAgICAgICBkLmV4dGVuZGxlZnQoJ2JjZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChyZXZlcnNlZCgnYWJjZCcpKSkKKyAgICAgICAgZC5leHRlbmRsZWZ0KGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdCgnYWJjZGRjYmEnKSkKKyAgICAgICAgZCA9IGRlcXVlKCkKKyAgICAgICAgZC5leHRlbmRsZWZ0KHJhbmdlKDEwMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGxpc3QocmV2ZXJzZWQocmFuZ2UoMTAwMCkpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGQuZXh0ZW5kbGVmdCwgZmFpbCgpKQorCisgICAgZGVmIHRlc3RfZ2V0aXRlbShzZWxmKToKKyAgICAgICAgbiA9IDIwMAorICAgICAgICBkID0gZGVxdWUoeHJhbmdlKG4pKQorICAgICAgICBsID0gcmFuZ2UobikKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKG4pOgorICAgICAgICAgICAgZC5wb3BsZWZ0KCkKKyAgICAgICAgICAgIGwucG9wKDApCisgICAgICAgICAgICBpZiByYW5kb20ucmFuZG9tKCkgPCAwLjU6CisgICAgICAgICAgICAgICAgZC5hcHBlbmQoaSkKKyAgICAgICAgICAgICAgICBsLmFwcGVuZChpKQorICAgICAgICAgICAgZm9yIGogaW4geHJhbmdlKDEtbGVuKGwpLCBsZW4obCkpOgorICAgICAgICAgICAgICAgIGFzc2VydCBkW2pdID09IGxbal0KKworICAgICAgICBkID0gZGVxdWUoJ3N1cGVybWFuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzBdLCAncycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFstMV0sICduJykKKyAgICAgICAgZCA9IGRlcXVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZC5fX2dldGl0ZW1fXywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZC5fX2dldGl0ZW1fXywgLTEpCisKKyAgICBkZWYgdGVzdF9zZXRpdGVtKHNlbGYpOgorICAgICAgICBuID0gMjAwCisgICAgICAgIGQgPSBkZXF1ZSh4cmFuZ2UobikpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShuKToKKyAgICAgICAgICAgIGRbaV0gPSAxMCAqIGkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBbMTAqaSBmb3IgaSBpbiB4cmFuZ2UobildKQorICAgICAgICBsID0gbGlzdChkKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMS1uLCAwLCAtMSk6CisgICAgICAgICAgICBkW2ldID0gNyppCisgICAgICAgICAgICBsW2ldID0gNyppCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbCkKKworICAgIGRlZiB0ZXN0X2RlbGl0ZW0oc2VsZik6CisgICAgICAgIG4gPSA1MDAgICAgICAgICAjIE8obioqMikgdGVzdCwgZG9uJ3QgbWFrZSB0aGlzIHRvbyBiaWcKKyAgICAgICAgZCA9IGRlcXVlKHhyYW5nZShuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZC5fX2RlbGl0ZW1fXywgLW4tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZC5fX2RlbGl0ZW1fXywgbikKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKG4pOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIG4taSkKKyAgICAgICAgICAgIGogPSByYW5kb20ucmFuZHJhbmdlKC1sZW4oZCksIGxlbihkKSkKKyAgICAgICAgICAgIHZhbCA9IGRbal0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4odmFsLCBkKQorICAgICAgICAgICAgZGVsIGRbal0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4odmFsLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMCkKKworICAgIGRlZiB0ZXN0X3JldmVyc2Uoc2VsZik6CisgICAgICAgIG4gPSA1MDAgICAgICAgICAjIE8obioqMikgdGVzdCwgZG9uJ3QgbWFrZSB0aGlzIHRvbyBiaWcKKyAgICAgICAgZGF0YSA9IFtyYW5kb20ucmFuZG9tKCkgZm9yIGkgaW4gcmFuZ2UobildCisgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgZCA9IGRlcXVlKGRhdGFbOmldKQorICAgICAgICAgICAgciA9IGQucmV2ZXJzZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGxpc3QocmV2ZXJzZWQoZGF0YVs6aV0pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMociwgTm9uZSkKKyAgICAgICAgICAgIGQucmV2ZXJzZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGRhdGFbOmldKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQucmV2ZXJzZSwgMSkgICAgICAgICAgIyBBcml0eSBpcyB6ZXJvCisKKyAgICBkZWYgdGVzdF9yb3RhdGUoc2VsZik6CisgICAgICAgIHMgPSB0dXBsZSgnYWJjZGUnKQorICAgICAgICBuID0gbGVuKHMpCisKKyAgICAgICAgZCA9IGRlcXVlKHMpCisgICAgICAgIGQucm90YXRlKDEpICAgICAgICAgICAgICMgdmVyaWZ5IHJvdCgxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmpvaW4oZCksICdlYWJjZCcpCisKKyAgICAgICAgZCA9IGRlcXVlKHMpCisgICAgICAgIGQucm90YXRlKC0xKSAgICAgICAgICAgICMgdmVyaWZ5IHJvdCgtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5qb2luKGQpLCAnYmNkZWEnKQorICAgICAgICBkLnJvdGF0ZSgpICAgICAgICAgICAgICAjIGNoZWNrIGRlZmF1bHQgdG8gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKGQpLCBzKQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZShuKjMpOgorICAgICAgICAgICAgZCA9IGRlcXVlKHMpCisgICAgICAgICAgICBlID0gZGVxdWUoZCkKKyAgICAgICAgICAgIGQucm90YXRlKGkpICAgICAgICAgIyBjaGVjayB2cy4gcm90KDEpIG4gdGltZXMKKyAgICAgICAgICAgIGZvciBqIGluIHhyYW5nZShpKToKKyAgICAgICAgICAgICAgICBlLnJvdGF0ZSgxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShkKSwgdHVwbGUoZSkpCisgICAgICAgICAgICBkLnJvdGF0ZSgtaSkgICAgICAgICMgY2hlY2sgdGhhdCBpdCB3b3JrcyBpbiByZXZlcnNlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKGQpLCBzKQorICAgICAgICAgICAgZS5yb3RhdGUobi1pKSAgICAgICAjIGNoZWNrIHRoYXQgaXQgd3JhcHMgZm9yd2FyZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShlKSwgcykKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobiozKToKKyAgICAgICAgICAgIGQgPSBkZXF1ZShzKQorICAgICAgICAgICAgZSA9IGRlcXVlKGQpCisgICAgICAgICAgICBkLnJvdGF0ZSgtaSkKKyAgICAgICAgICAgIGZvciBqIGluIHhyYW5nZShpKToKKyAgICAgICAgICAgICAgICBlLnJvdGF0ZSgtMSkgICAgIyBjaGVjayB2cy4gcm90KC0xKSBuIHRpbWVzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKGQpLCB0dXBsZShlKSkKKyAgICAgICAgICAgIGQucm90YXRlKGkpICAgICAgICAgIyBjaGVjayB0aGF0IGl0IHdvcmtzIGluIHJldmVyc2UKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoZCksIHMpCisgICAgICAgICAgICBlLnJvdGF0ZShpLW4pICAgICAgICMgY2hlY2sgdGhhdCBpdCB3cmFwcyBiYWNrYXJvdW5kCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKGUpLCBzKQorCisgICAgICAgIGQgPSBkZXF1ZShzKQorICAgICAgICBlID0gZGVxdWUocykKKyAgICAgICAgZS5yb3RhdGUoQklHKzE3KSAgICAgICAgIyB2ZXJpZnkgb24gbG9uZyBzZXJpZXMgb2Ygcm90YXRlcworICAgICAgICBkciA9IGQucm90YXRlCisgICAgICAgIGZvciBpIGluIHhyYW5nZShCSUcrMTcpOgorICAgICAgICAgICAgZHIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKGQpLCB0dXBsZShlKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQucm90YXRlLCAneCcpICAgIyBXcm9uZyBhcmcgdHlwZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQucm90YXRlLCAxLCAxMCkgIyBUb28gbWFueSBhcmdzCisKKyAgICAgICAgZCA9IGRlcXVlKCkKKyAgICAgICAgZC5yb3RhdGUoKSAgICAgICAgICAgICAgIyByb3RhdGUgYW4gZW1wdHkgZGVxdWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkZXF1ZSgpKQorCisgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoJ2FiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDIpCisgICAgICAgIGQucG9wbGVmdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAxKQorICAgICAgICBkLnBvcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBkLnBvcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDApCisgICAgICAgIGQuYXBwZW5kKCdjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDEpCisgICAgICAgIGQuYXBwZW5kbGVmdCgnZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAyKQorICAgICAgICBkLmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDApCisKKyAgICBkZWYgdGVzdF91bmRlcmZsb3coc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGQucG9wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBkLnBvcGxlZnQpCisKKyAgICBkZWYgdGVzdF9jbGVhcihzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKHhyYW5nZSgxMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMTAwKQorICAgICAgICBkLmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgW10pCisgICAgICAgIGQuY2xlYXIoKSAgICAgICAgICAgICAgICMgY2xlYXIgYW4gZW10cHkgZGVxdWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBbXSkKKworICAgIGRlZiB0ZXN0X3JlbW92ZShzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKCdhYmNkZWZnaGNpaicpCisgICAgICAgIGQucmVtb3ZlKCdjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkZXF1ZSgnYWJkZWZnaGNpaicpKQorICAgICAgICBkLnJlbW92ZSgnYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZGVxdWUoJ2FiZGVmZ2hpaicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkLnJlbW92ZSwgJ2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGRlcXVlKCdhYmRlZmdoaWonKSkKKworICAgICAgICAjIEhhbmRsZSBjb21wYXJpc29uIGVycm9ycworICAgICAgICBkID0gZGVxdWUoWydhJywgJ2InLCBCYWRDbXAoKSwgJ2MnXSkKKyAgICAgICAgZSA9IGRlcXVlKGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgZC5yZW1vdmUsICdjJykKKyAgICAgICAgZm9yIHgsIHkgaW4gemlwKGQsIGUpOgorICAgICAgICAgICAgIyB2ZXJpZnkgdGhhdCBvcmlnaW5hbCBvcmRlciBhbmQgdmFsdWVzIGFyZSByZXRhaW5lZC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIHkpCisKKyAgICAgICAgIyBIYW5kbGUgZXZpbCBtdXRhdG9yCisgICAgICAgIGZvciBtYXRjaCBpbiAoVHJ1ZSwgRmFsc2UpOgorICAgICAgICAgICAgZCA9IGRlcXVlKFsnYWInXSkKKyAgICAgICAgICAgIGQuZXh0ZW5kKFtNdXRhdGVDbXAoZCwgbWF0Y2gpLCAnYyddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZC5yZW1vdmUsICdjJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZGVxdWUoKSkKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSh4cmFuZ2UoMjAwKSkKKyAgICAgICAgZSA9IGV2YWwocmVwcihkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQorICAgICAgICBkLmFwcGVuZChkKQorICAgICAgICBzZWxmLmFzc2VydEluKCcuLi4nLCByZXByKGQpKQorCisgICAgZGVmIHRlc3RfcHJpbnQoc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSh4cmFuZ2UoMjAwKSkKKyAgICAgICAgZC5hcHBlbmQoZCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBmbyA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJpbnQgPj4gZm8sIGQsCisgICAgICAgICAgICBmby5jbG9zZSgpCisgICAgICAgICAgICBmbyA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm8ucmVhZCgpLCByZXByKGQpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm8uY2xvc2UoKQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkZXF1ZSwgJ2FiYycsIDIsIDMpOworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlcXVlLCAxKTsKKworICAgIGRlZiB0ZXN0X2hhc2goc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgZGVxdWUoJ2FiYycpKQorCisgICAgZGVmIHRlc3RfbG9uZ19zdGVhZHlzdGF0ZV9xdWV1ZV9wb3BsZWZ0KHNlbGYpOgorICAgICAgICBmb3Igc2l6ZSBpbiAoMCwgMSwgMiwgMTAwLCAxMDAwKToKKyAgICAgICAgICAgIGQgPSBkZXF1ZSh4cmFuZ2Uoc2l6ZSkpCisgICAgICAgICAgICBhcHBlbmQsIHBvcCA9IGQuYXBwZW5kLCBkLnBvcGxlZnQKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShzaXplLCBCSUcpOgorICAgICAgICAgICAgICAgIGFwcGVuZChpKQorICAgICAgICAgICAgICAgIHggPSBwb3AoKQorICAgICAgICAgICAgICAgIGlmIHggIT0gaSAtIHNpemU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgaS1zaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCByYW5nZShCSUctc2l6ZSwgQklHKSkKKworICAgIGRlZiB0ZXN0X2xvbmdfc3RlYWR5c3RhdGVfcXVldWVfcG9wcmlnaHQoc2VsZik6CisgICAgICAgIGZvciBzaXplIGluICgwLCAxLCAyLCAxMDAsIDEwMDApOgorICAgICAgICAgICAgZCA9IGRlcXVlKHJldmVyc2VkKHhyYW5nZShzaXplKSkpCisgICAgICAgICAgICBhcHBlbmQsIHBvcCA9IGQuYXBwZW5kbGVmdCwgZC5wb3AKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShzaXplLCBCSUcpOgorICAgICAgICAgICAgICAgIGFwcGVuZChpKQorICAgICAgICAgICAgICAgIHggPSBwb3AoKQorICAgICAgICAgICAgICAgIGlmIHggIT0gaSAtIHNpemU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgaS1zaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJldmVyc2VkKGxpc3QoZCkpKSwgcmFuZ2UoQklHLXNpemUsIEJJRykpCisKKyAgICBkZWYgdGVzdF9iaWdfcXVldWVfcG9wbGVmdChzZWxmKToKKyAgICAgICAgcGFzcworICAgICAgICBkID0gZGVxdWUoKQorICAgICAgICBhcHBlbmQsIHBvcCA9IGQuYXBwZW5kLCBkLnBvcGxlZnQKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKEJJRyk6CisgICAgICAgICAgICBhcHBlbmQoaSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKEJJRyk6CisgICAgICAgICAgICB4ID0gcG9wKCkKKyAgICAgICAgICAgIGlmIHggIT0gaToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIGkpCisKKyAgICBkZWYgdGVzdF9iaWdfcXVldWVfcG9wcmlnaHQoc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSgpCisgICAgICAgIGFwcGVuZCwgcG9wID0gZC5hcHBlbmRsZWZ0LCBkLnBvcAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoQklHKToKKyAgICAgICAgICAgIGFwcGVuZChpKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoQklHKToKKyAgICAgICAgICAgIHggPSBwb3AoKQorICAgICAgICAgICAgaWYgeCAhPSBpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgaSkKKworICAgIGRlZiB0ZXN0X2JpZ19zdGFja19yaWdodChzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKCkKKyAgICAgICAgYXBwZW5kLCBwb3AgPSBkLmFwcGVuZCwgZC5wb3AKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKEJJRyk6CisgICAgICAgICAgICBhcHBlbmQoaSkKKyAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQoeHJhbmdlKEJJRykpOgorICAgICAgICAgICAgeCA9IHBvcCgpCisgICAgICAgICAgICBpZiB4ICE9IGk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMCkKKworICAgIGRlZiB0ZXN0X2JpZ19zdGFja19sZWZ0KHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoKQorICAgICAgICBhcHBlbmQsIHBvcCA9IGQuYXBwZW5kbGVmdCwgZC5wb3BsZWZ0CisgICAgICAgIGZvciBpIGluIHhyYW5nZShCSUcpOgorICAgICAgICAgICAgYXBwZW5kKGkpCisgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHhyYW5nZShCSUcpKToKKyAgICAgICAgICAgIHggPSBwb3AoKQorICAgICAgICAgICAgaWYgeCAhPSBpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDApCisKKyAgICBkZWYgdGVzdF9yb3VuZHRyaXBfaXRlcl9pbml0KHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoeHJhbmdlKDIwMCkpCisgICAgICAgIGUgPSBkZXF1ZShkKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQorCisgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoeHJhbmdlKDIwMCkpCisgICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICBzID0gcGlja2xlLmR1bXBzKGQsIGkpCisgICAgICAgICAgICBlID0gcGlja2xlLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKworIyMgICAgZGVmIHRlc3RfcGlja2xlX3JlY3Vyc2l2ZShzZWxmKToKKyMjICAgICAgICBkID0gZGVxdWUoJ2FiYycpCisjIyAgICAgICAgZC5hcHBlbmQoZCkKKyMjICAgICAgICBmb3IgaSBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgorIyMgICAgICAgICAgICBlID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhkLCBpKSkKKyMjICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCisjIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoZSksIGlkKGVbLTFdKSkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5KHNlbGYpOgorICAgICAgICBtdXQgPSBbMTBdCisgICAgICAgIGQgPSBkZXF1ZShbbXV0XSkKKyAgICAgICAgZSA9IGNvcHkuZGVlcGNvcHkoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQorICAgICAgICBtdXRbMF0gPSAxMQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgbXV0ID0gWzEwXQorICAgICAgICBkID0gZGVxdWUoW211dF0pCisgICAgICAgIGUgPSBjb3B5LmNvcHkoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQorICAgICAgICBtdXRbMF0gPSAxMQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQorCisgICAgZGVmIHRlc3RfcmV2ZXJzZWQoc2VsZik6CisgICAgICAgIGZvciBzIGluICgnYWJjZCcsIHhyYW5nZSgyMDAwKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmV2ZXJzZWQoZGVxdWUocykpKSwgbGlzdChyZXZlcnNlZChzKSkpCisKKyAgICBkZWYgdGVzdF9nY19kb2VzbnRfYmxvd3VwKHNlbGYpOgorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgIyBUaGlzIHVzZWQgdG8gYXNzZXJ0LWZhaWwgaW4gZGVxdWVfdHJhdmVyc2UoKSB1bmRlciBhIGRlYnVnCisgICAgICAgICMgYnVpbGQsIG9yIHJ1biB3aWxkIHdpdGggYSBOVUxMIHBvaW50ZXIgaW4gYSByZWxlYXNlIGJ1aWxkLgorICAgICAgICBkID0gZGVxdWUoKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgICAgIGQuYXBwZW5kKDEpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5lcl9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgIyBCdWcgIzM2ODA6IHRwX3RyYXZlcnNlIHdhcyBub3QgaW1wbGVtZW50ZWQgZm9yIGRlcXVlIGl0ZXJhdG9yIG9iamVjdHMKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmb3IgaSBpbiByYW5nZSgyKToKKyAgICAgICAgICAgIG9iaiA9IEMoKQorICAgICAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYob2JqKQorICAgICAgICAgICAgaWYgaSA9PSAwOgorICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IGRlcXVlKFtvYmosIDFdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb250YWluZXIgPSByZXZlcnNlZChkZXF1ZShbb2JqLCAxXSkpCisgICAgICAgICAgICBvYmoueCA9IGl0ZXIoY29udGFpbmVyKQorICAgICAgICAgICAgZGVsIG9iaiwgY29udGFpbmVyCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYoKSBpcyBOb25lLCAiQ3ljbGUgd2FzIG5vdCBjb2xsZWN0ZWQiKQorCisgICAgY2hlY2tfc2l6ZW9mID0gdGVzdF9zdXBwb3J0LmNoZWNrX3NpemVvZgorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9zaXplb2Yoc2VsZik6CisgICAgICAgIEJMT0NLTEVOID0gNjIKKyAgICAgICAgYmFzZXNpemUgPSB0ZXN0X3N1cHBvcnQuY2FsY29ianNpemUoJzJQNFBsUCcpCisgICAgICAgIGJsb2Nrc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZSgnMlAlZFAnICUgQkxPQ0tMRU4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqZWN0Ll9fc2l6ZW9mX18oZGVxdWUoKSksIGJhc2VzaXplKQorICAgICAgICBjaGVjayA9IHNlbGYuY2hlY2tfc2l6ZW9mCisgICAgICAgIGNoZWNrKGRlcXVlKCksIGJhc2VzaXplICsgYmxvY2tzaXplKQorICAgICAgICBjaGVjayhkZXF1ZSgnYScpLCBiYXNlc2l6ZSArIGJsb2Nrc2l6ZSkKKyAgICAgICAgY2hlY2soZGVxdWUoJ2EnICogKEJMT0NLTEVOIC8vIDIpKSwgYmFzZXNpemUgKyBibG9ja3NpemUpCisgICAgICAgIGNoZWNrKGRlcXVlKCdhJyAqIChCTE9DS0xFTiAvLyAyICsgMSkpLCBiYXNlc2l6ZSArIDIgKiBibG9ja3NpemUpCisgICAgICAgIGNoZWNrKGRlcXVlKCdhJyAqICg0MiAqIEJMT0NLTEVOKSksIGJhc2VzaXplICsgNDMgKiBibG9ja3NpemUpCisKK2NsYXNzIFRlc3RWYXJpb3VzSXRlcmF0b3JBcmdzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAoIjEyMyIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSkpOgorICAgICAgICAgICAgZm9yIGcgaW4gKHNlcV90ZXN0cy5TZXF1ZW5jZSwgc2VxX3Rlc3RzLkl0ZXJGdW5jLAorICAgICAgICAgICAgICAgICAgICAgIHNlcV90ZXN0cy5JdGVyR2VuLCBzZXFfdGVzdHMuSXRlckZ1bmNTdG9wLAorICAgICAgICAgICAgICAgICAgICAgIHNlcV90ZXN0cy5pdGVybXVsdGksIHNlcV90ZXN0cy5pdGVyZnVuYyk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGRlcXVlKGcocykpKSwgbGlzdChnKHMpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGVxdWUsIHNlcV90ZXN0cy5JdGVyTmV4dE9ubHkocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlcXVlLCBzZXFfdGVzdHMuSXRlck5vTmV4dChzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBkZXF1ZSwgc2VxX3Rlc3RzLkl0ZXJHZW5FeGMocykpCisKKyAgICBkZWYgdGVzdF9pdGVyX3dpdGhfYWx0ZXJlZF9kYXRhKHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoJ2FiY2RlZmcnKQorICAgICAgICBpdCA9IGl0ZXIoZCkKKyAgICAgICAgZC5wb3AoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGl0Lm5leHQpCisKKyAgICBkZWYgdGVzdF9ydW50aW1lX2Vycm9yX29uX2VtcHR5X2RlcXVlKHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoKQorICAgICAgICBpdCA9IGl0ZXIoZCkKKyAgICAgICAgZC5hcHBlbmQoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgaXQubmV4dCkKKworY2xhc3MgRGVxdWUoZGVxdWUpOgorICAgIHBhc3MKKworY2xhc3MgRGVxdWVXaXRoQmFkSXRlcihkZXF1ZSk6CisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IKKworY2xhc3MgVGVzdFN1YmNsYXNzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgZCA9IERlcXVlKHhyYW5nZSgyNSkpCisgICAgICAgIGQuX19pbml0X18oeHJhbmdlKDIwMCkpCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMDAsIDQwMCk6CisgICAgICAgICAgICBkLmFwcGVuZChpKQorICAgICAgICBmb3IgaSBpbiByZXZlcnNlZCh4cmFuZ2UoLTIwMCwgMCkpOgorICAgICAgICAgICAgZC5hcHBlbmRsZWZ0KGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgcmFuZ2UoLTIwMCwgNDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDYwMCkKKworICAgICAgICBsZWZ0ID0gW2QucG9wbGVmdCgpIGZvciBpIGluIHhyYW5nZSgyNTApXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlZnQsIHJhbmdlKC0yMDAsIDUwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCByYW5nZSg1MCwgNDAwKSkKKworICAgICAgICByaWdodCA9IFtkLnBvcCgpIGZvciBpIGluIHhyYW5nZSgyNTApXQorICAgICAgICByaWdodC5yZXZlcnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyaWdodCwgcmFuZ2UoMTUwLCA0MDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIHJhbmdlKDUwLCAxNTApKQorCisgICAgICAgIGQuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMCkKKworICAgIGRlZiB0ZXN0X2NvcHlfcGlja2xlKHNlbGYpOgorCisgICAgICAgIGQgPSBEZXF1ZSgnYWJjJykKKworICAgICAgICBlID0gZC5fX2NvcHlfXygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShkKSwgdHlwZShlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQorCisgICAgICAgIGUgPSBEZXF1ZShkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZCksIHR5cGUoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKworICAgICAgICBzID0gcGlja2xlLmR1bXBzKGQpCisgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShkKSwgdHlwZShlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQorCisgICAgICAgIGQgPSBEZXF1ZSgnYWJjZGUnLCBtYXhsZW49NCkKKworICAgICAgICBlID0gZC5fX2NvcHlfXygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShkKSwgdHlwZShlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQorCisgICAgICAgIGUgPSBEZXF1ZShkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZCksIHR5cGUoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKworICAgICAgICBzID0gcGlja2xlLmR1bXBzKGQpCisgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShkKSwgdHlwZShlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQorCisjIyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CisjIyAgICAgICAgZCA9IERlcXVlKCdhYmMnKQorIyMgICAgICAgIGQuYXBwZW5kKGQpCisjIworIyMgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGQpKQorIyMgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQorIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShkKSwgdHlwZShlKSkKKyMjICAgICAgICBkZCA9IGQucG9wKCkKKyMjICAgICAgICBlZSA9IGUucG9wKCkKKyMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGUpLCBpZChlZSkpCisjIyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBlKQorIyMKKyMjICAgICAgICBkLnggPSBkCisjIyAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCkpCisjIyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChlKSwgaWQoZS54KSkKKyMjCisjIyAgICAgICAgZCA9IERlcXVlV2l0aEJhZEl0ZXIoJ2FiYycpCisjIyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwaWNrbGUuZHVtcHMsIGQpCisKKyAgICBkZWYgdGVzdF93ZWFrcmVmKHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoJ2dhbGxhaGFkJykKKyAgICAgICAgcCA9IHdlYWtyZWYucHJveHkoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIocCksIHN0cihkKSkKKyAgICAgICAgZCA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUmVmZXJlbmNlRXJyb3IsIHN0ciwgcCkKKworICAgIGRlZiB0ZXN0X3N0cmFuZ2Vfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIFgoZGVxdWUpOgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBpdGVyKFtdKQorICAgICAgICBkMSA9IFgoWzEsMiwzXSkKKyAgICAgICAgZDIgPSBYKFs0LDUsNl0pCisgICAgICAgIGQxID09IGQyICAgIyBub3QgY2xlYXIgaWYgdGhpcyBpcyBzdXBwb3NlZCB0byBiZSBUcnVlIG9yIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICMgYnV0IGl0IHVzZWQgdG8gZ2l2ZSBhIFN5c3RlbUVycm9yCisKKworY2xhc3MgU3ViY2xhc3NXaXRoS3dhcmdzKGRlcXVlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmV3YXJnPTEpOgorICAgICAgICBkZXF1ZS5fX2luaXRfXyhzZWxmKQorCitjbGFzcyBUZXN0U3ViY2xhc3NXaXRoS3dhcmdzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9zdWJjbGFzc193aXRoX2t3YXJncyhzZWxmKToKKyAgICAgICAgIyBTRiBidWcgIzE0ODY2NjMgLS0gdGhpcyB1c2VkIHRvIGVycm9uZW91c2x5IHJhaXNlIGEgVHlwZUVycm9yCisgICAgICAgIFN1YmNsYXNzV2l0aEt3YXJncyhuZXdhcmc9MSkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitsaWJyZWZ0ZXN0ID0gIiIiCitFeGFtcGxlIGZyb20gdGhlIExpYnJhcnkgUmVmZXJlbmNlOiAgRG9jL2xpYi9saWJjb2xsZWN0aW9ucy50ZXgKKworPj4+IGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCis+Pj4gZCA9IGRlcXVlKCdnaGknKSAgICAgICAgICAgICAgICAgIyBtYWtlIGEgbmV3IGRlcXVlIHdpdGggdGhyZWUgaXRlbXMKKz4+PiBmb3IgZWxlbSBpbiBkOiAgICAgICAgICAgICAgICAgICAjIGl0ZXJhdGUgb3ZlciB0aGUgZGVxdWUncyBlbGVtZW50cworLi4uICAgICBwcmludCBlbGVtLnVwcGVyKCkKK0cKK0gKK0kKKz4+PiBkLmFwcGVuZCgnaicpICAgICAgICAgICAgICAgICAgICAjIGFkZCBhIG5ldyBlbnRyeSB0byB0aGUgcmlnaHQgc2lkZQorPj4+IGQuYXBwZW5kbGVmdCgnZicpICAgICAgICAgICAgICAgICMgYWRkIGEgbmV3IGVudHJ5IHRvIHRoZSBsZWZ0IHNpZGUKKz4+PiBkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNob3cgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXF1ZQorZGVxdWUoWydmJywgJ2cnLCAnaCcsICdpJywgJ2onXSkKKz4+PiBkLnBvcCgpICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJldHVybiBhbmQgcmVtb3ZlIHRoZSByaWdodG1vc3QgaXRlbQorJ2onCis+Pj4gZC5wb3BsZWZ0KCkgICAgICAgICAgICAgICAgICAgICAgIyByZXR1cm4gYW5kIHJlbW92ZSB0aGUgbGVmdG1vc3QgaXRlbQorJ2YnCis+Pj4gbGlzdChkKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgZGVxdWUKK1snZycsICdoJywgJ2knXQorPj4+IGRbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGVlayBhdCBsZWZ0bW9zdCBpdGVtCisnZycKKz4+PiBkWy0xXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBlZWsgYXQgcmlnaHRtb3N0IGl0ZW0KKydpJworPj4+IGxpc3QocmV2ZXJzZWQoZCkpICAgICAgICAgICAgICAgICMgbGlzdCB0aGUgY29udGVudHMgb2YgYSBkZXF1ZSBpbiByZXZlcnNlCitbJ2knLCAnaCcsICdnJ10KKz4+PiAnaCcgaW4gZCAgICAgICAgICAgICAgICAgICAgICAgICAjIHNlYXJjaCB0aGUgZGVxdWUKK1RydWUKKz4+PiBkLmV4dGVuZCgnamtsJykgICAgICAgICAgICAgICAgICAjIGFkZCBtdWx0aXBsZSBlbGVtZW50cyBhdCBvbmNlCis+Pj4gZAorZGVxdWUoWydnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCddKQorPj4+IGQucm90YXRlKDEpICAgICAgICAgICAgICAgICAgICAgICMgcmlnaHQgcm90YXRpb24KKz4+PiBkCitkZXF1ZShbJ2wnLCAnZycsICdoJywgJ2knLCAnaicsICdrJ10pCis+Pj4gZC5yb3RhdGUoLTEpICAgICAgICAgICAgICAgICAgICAgIyBsZWZ0IHJvdGF0aW9uCis+Pj4gZAorZGVxdWUoWydnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCddKQorPj4+IGRlcXVlKHJldmVyc2VkKGQpKSAgICAgICAgICAgICAgICMgbWFrZSBhIG5ldyBkZXF1ZSBpbiByZXZlcnNlIG9yZGVyCitkZXF1ZShbJ2wnLCAnaycsICdqJywgJ2knLCAnaCcsICdnJ10pCis+Pj4gZC5jbGVhcigpICAgICAgICAgICAgICAgICAgICAgICAgIyBlbXB0eSB0aGUgZGVxdWUKKz4+PiBkLnBvcCgpICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNhbm5vdCBwb3AgZnJvbSBhbiBlbXB0eSBkZXF1ZQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8cHlzaGVsbCM2PiIsIGxpbmUgMSwgaW4gLXRvcGxldmVsLQorICAgIGQucG9wKCkKK0luZGV4RXJyb3I6IHBvcCBmcm9tIGFuIGVtcHR5IGRlcXVlCisKKz4+PiBkLmV4dGVuZGxlZnQoJ2FiYycpICAgICAgICAgICAgICAjIGV4dGVuZGxlZnQoKSByZXZlcnNlcyB0aGUgaW5wdXQgb3JkZXIKKz4+PiBkCitkZXF1ZShbJ2MnLCAnYicsICdhJ10pCisKKworCis+Pj4gZGVmIGRlbGV0ZV9udGgoZCwgbik6CisuLi4gICAgIGQucm90YXRlKC1uKQorLi4uICAgICBkLnBvcGxlZnQoKQorLi4uICAgICBkLnJvdGF0ZShuKQorLi4uCis+Pj4gZCA9IGRlcXVlKCdhYmNkZWYnKQorPj4+IGRlbGV0ZV9udGgoZCwgMikgICAjIHJlbW92ZSB0aGUgZW50cnkgYXQgZFsyXQorPj4+IGQKK2RlcXVlKFsnYScsICdiJywgJ2QnLCAnZScsICdmJ10pCisKKworCis+Pj4gZGVmIHJvdW5kcm9iaW4oKml0ZXJhYmxlcyk6CisuLi4gICAgIHBlbmRpbmcgPSBkZXF1ZShpdGVyKGkpIGZvciBpIGluIGl0ZXJhYmxlcykKKy4uLiAgICAgd2hpbGUgcGVuZGluZzoKKy4uLiAgICAgICAgIHRhc2sgPSBwZW5kaW5nLnBvcGxlZnQoKQorLi4uICAgICAgICAgdHJ5OgorLi4uICAgICAgICAgICAgIHlpZWxkIHRhc2submV4dCgpCisuLi4gICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKy4uLiAgICAgICAgICAgICBjb250aW51ZQorLi4uICAgICAgICAgcGVuZGluZy5hcHBlbmQodGFzaykKKy4uLgorCis+Pj4gZm9yIHZhbHVlIGluIHJvdW5kcm9iaW4oJ2FiYycsICdkJywgJ2VmZ2gnKToKKy4uLiAgICAgcHJpbnQgdmFsdWUKKy4uLgorYQorZAorZQorYgorZgorYworZworaAorCisKKz4+PiBkZWYgbWFrZXRyZWUoaXRlcmFibGUpOgorLi4uICAgICBkID0gZGVxdWUoaXRlcmFibGUpCisuLi4gICAgIHdoaWxlIGxlbihkKSA+IDE6CisuLi4gICAgICAgICBwYWlyID0gW2QucG9wbGVmdCgpLCBkLnBvcGxlZnQoKV0KKy4uLiAgICAgICAgIGQuYXBwZW5kKHBhaXIpCisuLi4gICAgIHJldHVybiBsaXN0KGQpCisuLi4KKz4+PiBwcmludCBtYWtldHJlZSgnYWJjZGVmZ2gnKQorW1tbWydhJywgJ2InXSwgWydjJywgJ2QnXV0sIFtbJ2UnLCAnZiddLCBbJ2cnLCAnaCddXV1dCisKKyIiIgorCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworX190ZXN0X18gPSB7J2xpYnJlZnRlc3QnIDogbGlicmVmdGVzdH0KKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIGltcG9ydCBzeXMKKyAgICB0ZXN0X2NsYXNzZXMgPSAoCisgICAgICAgIFRlc3RCYXNpYywKKyAgICAgICAgVGVzdFZhcmlvdXNJdGVyYXRvckFyZ3MsCisgICAgICAgIFRlc3RTdWJjbGFzcywKKyAgICAgICAgVGVzdFN1YmNsYXNzV2l0aEt3YXJncywKKyAgICApCisKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisKKyAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgaW1wb3J0IGdjCisgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBwcmludCBjb3VudHMKKworICAgICMgZG9jdGVzdHMKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfZGVxdWUKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9kZXF1ZSwgdmVyYm9zZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVxdWUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVxdWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNDkzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZXF1ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVxdWUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVxdWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YTRiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZXF1ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3IucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZXNjci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzY2NGFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3IucHkKQEAgLTAsMCArMSw0NzI3IEBACitpbXBvcnQgX19idWlsdGluX18KK2ltcG9ydCBnYworaW1wb3J0IHN5cworaW1wb3J0IHR5cGVzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3ZWFrcmVmCisKK2Zyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKworY2xhc3MgT3BlcmF0b3JzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLmJpbm9wcyA9IHsKKyAgICAgICAgICAgICdhZGQnOiAnKycsCisgICAgICAgICAgICAnc3ViJzogJy0nLAorICAgICAgICAgICAgJ211bCc6ICcqJywKKyAgICAgICAgICAgICdkaXYnOiAnLycsCisgICAgICAgICAgICAnZGl2bW9kJzogJ2Rpdm1vZCcsCisgICAgICAgICAgICAncG93JzogJyoqJywKKyAgICAgICAgICAgICdsc2hpZnQnOiAnPDwnLAorICAgICAgICAgICAgJ3JzaGlmdCc6ICc+PicsCisgICAgICAgICAgICAnYW5kJzogJyYnLAorICAgICAgICAgICAgJ3hvcic6ICdeJywKKyAgICAgICAgICAgICdvcic6ICd8JywKKyAgICAgICAgICAgICdjbXAnOiAnY21wJywKKyAgICAgICAgICAgICdsdCc6ICc8JywKKyAgICAgICAgICAgICdsZSc6ICc8PScsCisgICAgICAgICAgICAnZXEnOiAnPT0nLAorICAgICAgICAgICAgJ25lJzogJyE9JywKKyAgICAgICAgICAgICdndCc6ICc+JywKKyAgICAgICAgICAgICdnZSc6ICc+PScsCisgICAgICAgIH0KKworICAgICAgICBmb3IgbmFtZSwgZXhwciBpbiBzZWxmLmJpbm9wcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgZXhwci5pc2xvd2VyKCk6CisgICAgICAgICAgICAgICAgZXhwciA9IGV4cHIgKyAiKGEsIGIpIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleHByID0gJ2EgJXMgYicgJSBleHByCisgICAgICAgICAgICBzZWxmLmJpbm9wc1tuYW1lXSA9IGV4cHIKKworICAgICAgICBzZWxmLnVub3BzID0geworICAgICAgICAgICAgJ3Bvcyc6ICcrJywKKyAgICAgICAgICAgICduZWcnOiAnLScsCisgICAgICAgICAgICAnYWJzJzogJ2FicycsCisgICAgICAgICAgICAnaW52ZXJ0JzogJ34nLAorICAgICAgICAgICAgJ2ludCc6ICdpbnQnLAorICAgICAgICAgICAgJ2xvbmcnOiAnbG9uZycsCisgICAgICAgICAgICAnZmxvYXQnOiAnZmxvYXQnLAorICAgICAgICAgICAgJ29jdCc6ICdvY3QnLAorICAgICAgICAgICAgJ2hleCc6ICdoZXgnLAorICAgICAgICB9CisKKyAgICAgICAgZm9yIG5hbWUsIGV4cHIgaW4gc2VsZi51bm9wcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgZXhwci5pc2xvd2VyKCk6CisgICAgICAgICAgICAgICAgZXhwciA9IGV4cHIgKyAiKGEpIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleHByID0gJyVzIGEnICUgZXhwcgorICAgICAgICAgICAgc2VsZi51bm9wc1tuYW1lXSA9IGV4cHIKKworICAgIGRlZiB1bm9wX3Rlc3Qoc2VsZiwgYSwgcmVzLCBleHByPSJsZW4oYSkiLCBtZXRoPSJfX2xlbl9fIik6CisgICAgICAgIGQgPSB7J2EnOiBhfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoZXhwciwgZCksIHJlcykKKyAgICAgICAgdCA9IHR5cGUoYSkKKyAgICAgICAgbSA9IGdldGF0dHIodCwgbWV0aCkKKworICAgICAgICAjIEZpbmQgbWV0aG9kIGluIHBhcmVudCBjbGFzcworICAgICAgICB3aGlsZSBtZXRoIG5vdCBpbiB0Ll9fZGljdF9fOgorICAgICAgICAgICAgdCA9IHQuX19iYXNlc19fWzBdCisgICAgICAgICMgaW4gc29tZSBpbXBsZW1lbnRhdGlvbnMgKGUuZy4gUHlQeSksICdtJyBjYW4gYmUgYSByZWd1bGFyIHVuYm91bmQKKyAgICAgICAgIyBtZXRob2Qgb2JqZWN0OyB0aGUgZ2V0YXR0cigpIGJlbG93IG9idGFpbnMgaXRzIHVuZGVybHlpbmcgZnVuY3Rpb24uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihtLCAnaW1fZnVuYycsIG0pLCB0Ll9fZGljdF9fW21ldGhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0oYSksIHJlcykKKyAgICAgICAgYm0gPSBnZXRhdHRyKGEsIG1ldGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm0oKSwgcmVzKQorCisgICAgZGVmIGJpbm9wX3Rlc3Qoc2VsZiwgYSwgYiwgcmVzLCBleHByPSJhK2IiLCBtZXRoPSJfX2FkZF9fIik6CisgICAgICAgIGQgPSB7J2EnOiBhLCAnYic6IGJ9CisKKyAgICAgICAgIyBYWFggSGFjayBzbyB0aGlzIHBhc3NlcyBiZWZvcmUgMi4zIHdoZW4gLVFuZXcgaXMgc3BlY2lmaWVkLgorICAgICAgICBpZiBtZXRoID09ICJfX2Rpdl9fIiBhbmQgMS8yID09IDAuNToKKyAgICAgICAgICAgIG1ldGggPSAiX190cnVlZGl2X18iCisKKyAgICAgICAgaWYgbWV0aCA9PSAnX19kaXZtb2RfXyc6IHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoZXhwciwgZCksIHJlcykKKyAgICAgICAgdCA9IHR5cGUoYSkKKyAgICAgICAgbSA9IGdldGF0dHIodCwgbWV0aCkKKyAgICAgICAgd2hpbGUgbWV0aCBub3QgaW4gdC5fX2RpY3RfXzoKKyAgICAgICAgICAgIHQgPSB0Ll9fYmFzZXNfX1swXQorICAgICAgICAjIGluIHNvbWUgaW1wbGVtZW50YXRpb25zIChlLmcuIFB5UHkpLCAnbScgY2FuIGJlIGEgcmVndWxhciB1bmJvdW5kCisgICAgICAgICMgbWV0aG9kIG9iamVjdDsgdGhlIGdldGF0dHIoKSBiZWxvdyBvYnRhaW5zIGl0cyB1bmRlcmx5aW5nIGZ1bmN0aW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIobSwgJ2ltX2Z1bmMnLCBtKSwgdC5fX2RpY3RfX1ttZXRoXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtKGEsIGIpLCByZXMpCisgICAgICAgIGJtID0gZ2V0YXR0cihhLCBtZXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJtKGIpLCByZXMpCisKKyAgICBkZWYgdGVybm9wX3Rlc3Qoc2VsZiwgYSwgYiwgYywgcmVzLCBleHByPSJhW2I6Y10iLCBtZXRoPSJfX2dldHNsaWNlX18iKToKKyAgICAgICAgZCA9IHsnYSc6IGEsICdiJzogYiwgJ2MnOiBjfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoZXhwciwgZCksIHJlcykKKyAgICAgICAgdCA9IHR5cGUoYSkKKyAgICAgICAgbSA9IGdldGF0dHIodCwgbWV0aCkKKyAgICAgICAgd2hpbGUgbWV0aCBub3QgaW4gdC5fX2RpY3RfXzoKKyAgICAgICAgICAgIHQgPSB0Ll9fYmFzZXNfX1swXQorICAgICAgICAjIGluIHNvbWUgaW1wbGVtZW50YXRpb25zIChlLmcuIFB5UHkpLCAnbScgY2FuIGJlIGEgcmVndWxhciB1bmJvdW5kCisgICAgICAgICMgbWV0aG9kIG9iamVjdDsgdGhlIGdldGF0dHIoKSBiZWxvdyBvYnRhaW5zIGl0cyB1bmRlcmx5aW5nIGZ1bmN0aW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIobSwgJ2ltX2Z1bmMnLCBtKSwgdC5fX2RpY3RfX1ttZXRoXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtKGEsIGIsIGMpLCByZXMpCisgICAgICAgIGJtID0gZ2V0YXR0cihhLCBtZXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJtKGIsIGMpLCByZXMpCisKKyAgICBkZWYgc2V0b3BfdGVzdChzZWxmLCBhLCBiLCByZXMsIHN0bXQ9ImErPWIiLCBtZXRoPSJfX2lhZGRfXyIpOgorICAgICAgICBkID0geydhJzogZGVlcGNvcHkoYSksICdiJzogYn0KKyAgICAgICAgZXhlYyBzdG10IGluIGQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydhJ10sIHJlcykKKyAgICAgICAgdCA9IHR5cGUoYSkKKyAgICAgICAgbSA9IGdldGF0dHIodCwgbWV0aCkKKyAgICAgICAgd2hpbGUgbWV0aCBub3QgaW4gdC5fX2RpY3RfXzoKKyAgICAgICAgICAgIHQgPSB0Ll9fYmFzZXNfX1swXQorICAgICAgICAjIGluIHNvbWUgaW1wbGVtZW50YXRpb25zIChlLmcuIFB5UHkpLCAnbScgY2FuIGJlIGEgcmVndWxhciB1bmJvdW5kCisgICAgICAgICMgbWV0aG9kIG9iamVjdDsgdGhlIGdldGF0dHIoKSBiZWxvdyBvYnRhaW5zIGl0cyB1bmRlcmx5aW5nIGZ1bmN0aW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIobSwgJ2ltX2Z1bmMnLCBtKSwgdC5fX2RpY3RfX1ttZXRoXSkKKyAgICAgICAgZFsnYSddID0gZGVlcGNvcHkoYSkKKyAgICAgICAgbShkWydhJ10sIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYSddLCByZXMpCisgICAgICAgIGRbJ2EnXSA9IGRlZXBjb3B5KGEpCisgICAgICAgIGJtID0gZ2V0YXR0cihkWydhJ10sIG1ldGgpCisgICAgICAgIGJtKGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYSddLCByZXMpCisKKyAgICBkZWYgc2V0Mm9wX3Rlc3Qoc2VsZiwgYSwgYiwgYywgcmVzLCBzdG10PSJhW2JdPWMiLCBtZXRoPSJfX3NldGl0ZW1fXyIpOgorICAgICAgICBkID0geydhJzogZGVlcGNvcHkoYSksICdiJzogYiwgJ2MnOiBjfQorICAgICAgICBleGVjIHN0bXQgaW4gZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2EnXSwgcmVzKQorICAgICAgICB0ID0gdHlwZShhKQorICAgICAgICBtID0gZ2V0YXR0cih0LCBtZXRoKQorICAgICAgICB3aGlsZSBtZXRoIG5vdCBpbiB0Ll9fZGljdF9fOgorICAgICAgICAgICAgdCA9IHQuX19iYXNlc19fWzBdCisgICAgICAgICMgaW4gc29tZSBpbXBsZW1lbnRhdGlvbnMgKGUuZy4gUHlQeSksICdtJyBjYW4gYmUgYSByZWd1bGFyIHVuYm91bmQKKyAgICAgICAgIyBtZXRob2Qgb2JqZWN0OyB0aGUgZ2V0YXR0cigpIGJlbG93IG9idGFpbnMgaXRzIHVuZGVybHlpbmcgZnVuY3Rpb24uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihtLCAnaW1fZnVuYycsIG0pLCB0Ll9fZGljdF9fW21ldGhdKQorICAgICAgICBkWydhJ10gPSBkZWVwY29weShhKQorICAgICAgICBtKGRbJ2EnXSwgYiwgYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydhJ10sIHJlcykKKyAgICAgICAgZFsnYSddID0gZGVlcGNvcHkoYSkKKyAgICAgICAgYm0gPSBnZXRhdHRyKGRbJ2EnXSwgbWV0aCkKKyAgICAgICAgYm0oYiwgYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydhJ10sIHJlcykKKworICAgIGRlZiBzZXQzb3BfdGVzdChzZWxmLCBhLCBiLCBjLCBkLCByZXMsIHN0bXQ9ImFbYjpjXT1kIiwgbWV0aD0iX19zZXRzbGljZV9fIik6CisgICAgICAgIGRpY3Rpb25hcnkgPSB7J2EnOiBkZWVwY29weShhKSwgJ2InOiBiLCAnYyc6IGMsICdkJzogZH0KKyAgICAgICAgZXhlYyBzdG10IGluIGRpY3Rpb25hcnkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0aW9uYXJ5WydhJ10sIHJlcykKKyAgICAgICAgdCA9IHR5cGUoYSkKKyAgICAgICAgd2hpbGUgbWV0aCBub3QgaW4gdC5fX2RpY3RfXzoKKyAgICAgICAgICAgIHQgPSB0Ll9fYmFzZXNfX1swXQorICAgICAgICBtID0gZ2V0YXR0cih0LCBtZXRoKQorICAgICAgICAjIGluIHNvbWUgaW1wbGVtZW50YXRpb25zIChlLmcuIFB5UHkpLCAnbScgY2FuIGJlIGEgcmVndWxhciB1bmJvdW5kCisgICAgICAgICMgbWV0aG9kIG9iamVjdDsgdGhlIGdldGF0dHIoKSBiZWxvdyBvYnRhaW5zIGl0cyB1bmRlcmx5aW5nIGZ1bmN0aW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIobSwgJ2ltX2Z1bmMnLCBtKSwgdC5fX2RpY3RfX1ttZXRoXSkKKyAgICAgICAgZGljdGlvbmFyeVsnYSddID0gZGVlcGNvcHkoYSkKKyAgICAgICAgbShkaWN0aW9uYXJ5WydhJ10sIGIsIGMsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdGlvbmFyeVsnYSddLCByZXMpCisgICAgICAgIGRpY3Rpb25hcnlbJ2EnXSA9IGRlZXBjb3B5KGEpCisgICAgICAgIGJtID0gZ2V0YXR0cihkaWN0aW9uYXJ5WydhJ10sIG1ldGgpCisgICAgICAgIGJtKGIsIGMsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdGlvbmFyeVsnYSddLCByZXMpCisKKyAgICBkZWYgdGVzdF9saXN0cyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGxpc3Qgb3BlcmF0aW9ucy4uLgorICAgICAgICAjIEFzc2VydHMgYXJlIHdpdGhpbiBpbmRpdmlkdWFsIHRlc3QgbWV0aG9kcworICAgICAgICBzZWxmLmJpbm9wX3Rlc3QoWzFdLCBbMl0sIFsxLDJdLCAiYStiIiwgIl9fYWRkX18iKQorICAgICAgICBzZWxmLmJpbm9wX3Rlc3QoWzEsMiwzXSwgMiwgMSwgImIgaW4gYSIsICJfX2NvbnRhaW5zX18iKQorICAgICAgICBzZWxmLmJpbm9wX3Rlc3QoWzEsMiwzXSwgNCwgMCwgImIgaW4gYSIsICJfX2NvbnRhaW5zX18iKQorICAgICAgICBzZWxmLmJpbm9wX3Rlc3QoWzEsMiwzXSwgMSwgMiwgImFbYl0iLCAiX19nZXRpdGVtX18iKQorICAgICAgICBzZWxmLnRlcm5vcF90ZXN0KFsxLDIsM10sIDAsIDIsIFsxLDJdLCAiYVtiOmNdIiwgIl9fZ2V0c2xpY2VfXyIpCisgICAgICAgIHNlbGYuc2V0b3BfdGVzdChbMV0sIFsyXSwgWzEsMl0sICJhKz1iIiwgIl9faWFkZF9fIikKKyAgICAgICAgc2VsZi5zZXRvcF90ZXN0KFsxLDJdLCAzLCBbMSwyLDEsMiwxLDJdLCAiYSo9YiIsICJfX2ltdWxfXyIpCisgICAgICAgIHNlbGYudW5vcF90ZXN0KFsxLDIsM10sIDMsICJsZW4oYSkiLCAiX19sZW5fXyIpCisgICAgICAgIHNlbGYuYmlub3BfdGVzdChbMSwyXSwgMywgWzEsMiwxLDIsMSwyXSwgImEqYiIsICJfX211bF9fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KFsxLDJdLCAzLCBbMSwyLDEsMiwxLDJdLCAiYiphIiwgIl9fcm11bF9fIikKKyAgICAgICAgc2VsZi5zZXQyb3BfdGVzdChbMSwyXSwgMSwgMywgWzEsM10sICJhW2JdPWMiLCAiX19zZXRpdGVtX18iKQorICAgICAgICBzZWxmLnNldDNvcF90ZXN0KFsxLDIsMyw0XSwgMSwgMywgWzUsNl0sIFsxLDUsNiw0XSwgImFbYjpjXT1kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX3NldHNsaWNlX18iKQorCisgICAgZGVmIHRlc3RfZGljdHMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBkaWN0IG9wZXJhdGlvbnMuLi4KKyAgICAgICAgaWYgaGFzYXR0cihkaWN0LCAnX19jbXBfXycpOiAgICMgUHlQeSBoYXMgb25seSByaWNoIGNvbXBhcmlzb24gb24gZGljdHMKKyAgICAgICAgICAgIHNlbGYuYmlub3BfdGVzdCh7MToyfSwgezI6MX0sIC0xLCAiY21wKGEsYikiLCAiX19jbXBfXyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmJpbm9wX3Rlc3QoezE6Mn0sIHsyOjF9LCBUcnVlLCAiYSA8IGIiLCAiX19sdF9fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHsxOjIsMzo0fSwgMSwgMSwgImIgaW4gYSIsICJfX2NvbnRhaW5zX18iKQorICAgICAgICBzZWxmLmJpbm9wX3Rlc3QoezE6MiwzOjR9LCAyLCAwLCAiYiBpbiBhIiwgIl9fY29udGFpbnNfXyIpCisgICAgICAgIHNlbGYuYmlub3BfdGVzdCh7MToyLDM6NH0sIDEsIDIsICJhW2JdIiwgIl9fZ2V0aXRlbV9fIikKKworICAgICAgICBkID0gezE6MiwgMzo0fQorICAgICAgICBsMSA9IFtdCisgICAgICAgIGZvciBpIGluIGQua2V5cygpOgorICAgICAgICAgICAgbDEuYXBwZW5kKGkpCisgICAgICAgIGwgPSBbXQorICAgICAgICBmb3IgaSBpbiBpdGVyKGQpOgorICAgICAgICAgICAgbC5hcHBlbmQoaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLCBsMSkKKyAgICAgICAgbCA9IFtdCisgICAgICAgIGZvciBpIGluIGQuX19pdGVyX18oKToKKyAgICAgICAgICAgIGwuYXBwZW5kKGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgbDEpCisgICAgICAgIGwgPSBbXQorICAgICAgICBmb3IgaSBpbiBkaWN0Ll9faXRlcl9fKGQpOgorICAgICAgICAgICAgbC5hcHBlbmQoaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLCBsMSkKKyAgICAgICAgZCA9IHsxOjIsIDM6NH0KKyAgICAgICAgc2VsZi51bm9wX3Rlc3QoZCwgMiwgImxlbihhKSIsICJfX2xlbl9fIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHJlcHIoZCksIHt9KSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGQuX19yZXByX18oKSwge30pLCBkKQorICAgICAgICBzZWxmLnNldDJvcF90ZXN0KHsxOjIsMzo0fSwgMiwgMywgezE6MiwyOjMsMzo0fSwgImFbYl09YyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19zZXRpdGVtX18iKQorCisgICAgIyBUZXN0cyBmb3IgdW5hcnkgYW5kIGJpbmFyeSBvcGVyYXRvcnMKKyAgICBkZWYgbnVtYmVyX29wZXJhdG9ycyhzZWxmLCBhLCBiLCBza2lwPVtdKToKKyAgICAgICAgZGljdCA9IHsnYSc6IGEsICdiJzogYn0KKworICAgICAgICBmb3IgbmFtZSwgZXhwciBpbiBzZWxmLmJpbm9wcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2tpcDoKKyAgICAgICAgICAgICAgICBuYW1lID0gIl9fJXNfXyIgJSBuYW1lCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihhLCBuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gZXZhbChleHByLCBkaWN0KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmJpbm9wX3Rlc3QoYSwgYiwgcmVzLCBleHByLCBuYW1lKQorCisgICAgICAgIGZvciBuYW1lLCBleHByIGluIHNlbGYudW5vcHMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNraXA6CisgICAgICAgICAgICAgICAgbmFtZSA9ICJfXyVzX18iICUgbmFtZQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoYSwgbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGV2YWwoZXhwciwgZGljdCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bm9wX3Rlc3QoYSwgcmVzLCBleHByLCBuYW1lKQorCisgICAgZGVmIHRlc3RfaW50cyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGludCBvcGVyYXRpb25zLi4uCisgICAgICAgIHNlbGYubnVtYmVyX29wZXJhdG9ycygxMDAsIDMpCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBjcmFzaGVzIGluIFB5dGhvbiAyLjIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMSkuX19ub256ZXJvX18oKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMCkuX19ub256ZXJvX18oKSwgMCkKKyAgICAgICAgIyBUaGlzIHJldHVybnMgJ05vdEltcGxlbWVudGVkJyBpbiBQeXRob24gMi4yCisgICAgICAgIGNsYXNzIEMoaW50KToKKyAgICAgICAgICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDKDVMKSwgNSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgQygpICsgIiIKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiTm90SW1wbGVtZW50ZWQgc2hvdWxkIGhhdmUgY2F1c2VkIFR5cGVFcnJvciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEMoc3lzLm1heGludCsxKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIE92ZXJmbG93RXJyb3IiKQorCisgICAgZGVmIHRlc3RfbG9uZ3Moc2VsZik6CisgICAgICAgICMgVGVzdGluZyBsb25nIG9wZXJhdGlvbnMuLi4KKyAgICAgICAgc2VsZi5udW1iZXJfb3BlcmF0b3JzKDEwMEwsIDNMKQorCisgICAgZGVmIHRlc3RfZmxvYXRzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgZmxvYXQgb3BlcmF0aW9ucy4uLgorICAgICAgICBzZWxmLm51bWJlcl9vcGVyYXRvcnMoMTAwLjAsIDMuMCkKKworICAgIGRlZiB0ZXN0X2NvbXBsZXhlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGNvbXBsZXggb3BlcmF0aW9ucy4uLgorICAgICAgICBzZWxmLm51bWJlcl9vcGVyYXRvcnMoMTAwLjBqLCAzLjBqLCBza2lwPVsnbHQnLCAnbGUnLCAnZ3QnLCAnZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW50JywgJ2xvbmcnLCAnZmxvYXQnXSkKKworICAgICAgICBjbGFzcyBOdW1iZXIoY29tcGxleCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbJ3ByZWMnXQorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjb21wbGV4Ll9fbmV3X18oY2xzLCAqYXJncykKKyAgICAgICAgICAgICAgICByZXN1bHQucHJlYyA9IGt3ZHMuZ2V0KCdwcmVjJywgMTIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHByZWMgPSBzZWxmLnByZWMKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmltYWcgPT0gMC4wOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiUuKmciICUgKHByZWMsIHNlbGYucmVhbCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnJlYWwgPT0gMC4wOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiUuKmdqIiAlIChwcmVjLCBzZWxmLmltYWcpCisgICAgICAgICAgICAgICAgcmV0dXJuICIoJS4qZyslLipnaikiICUgKHByZWMsIHNlbGYucmVhbCwgcHJlYywgc2VsZi5pbWFnKQorICAgICAgICAgICAgX19zdHJfXyA9IF9fcmVwcl9fCisKKyAgICAgICAgYSA9IE51bWJlcigzLjE0LCBwcmVjPTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhKSwgIjMuMTQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEucHJlYywgNikKKworICAgICAgICBhID0gTnVtYmVyKGEsIHByZWM9MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEpLCAiMy4xIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnByZWMsIDIpCisKKyAgICAgICAgYSA9IE51bWJlcigyMzQuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEpLCAiMjM0LjUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEucHJlYywgMTIpCisKKyAgICBAdGVzdF9zdXBwb3J0LmltcGxfZGV0YWlsKCJ0aGUgbW9kdWxlICd4eHN1YnR5cGUnIGlzIGludGVybmFsIikKKyAgICBkZWYgdGVzdF9zcGFtX2xpc3RzKHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgc3BhbWxpc3Qgb3BlcmF0aW9ucy4uLgorICAgICAgICBpbXBvcnQgY29weSwgeHhzdWJ0eXBlIGFzIHNwYW0KKworICAgICAgICBkZWYgc3BhbWxpc3QobCwgbWVtbz1Ob25lKToKKyAgICAgICAgICAgIGltcG9ydCB4eHN1YnR5cGUgYXMgc3BhbQorICAgICAgICAgICAgcmV0dXJuIHNwYW0uc3BhbWxpc3QobCkKKworICAgICAgICAjIFRoaXMgaXMgYW4gdWdseSBoYWNrOgorICAgICAgICBjb3B5Ll9kZWVwY29weV9kaXNwYXRjaFtzcGFtLnNwYW1saXN0XSA9IHNwYW1saXN0CisKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHNwYW1saXN0KFsxXSksIHNwYW1saXN0KFsyXSksIHNwYW1saXN0KFsxLDJdKSwgImErYiIsCisgICAgICAgICAgICAgICAgICAgICAgICJfX2FkZF9fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHNwYW1saXN0KFsxLDIsM10pLCAyLCAxLCAiYiBpbiBhIiwgIl9fY29udGFpbnNfXyIpCisgICAgICAgIHNlbGYuYmlub3BfdGVzdChzcGFtbGlzdChbMSwyLDNdKSwgNCwgMCwgImIgaW4gYSIsICJfX2NvbnRhaW5zX18iKQorICAgICAgICBzZWxmLmJpbm9wX3Rlc3Qoc3BhbWxpc3QoWzEsMiwzXSksIDEsIDIsICJhW2JdIiwgIl9fZ2V0aXRlbV9fIikKKyAgICAgICAgc2VsZi50ZXJub3BfdGVzdChzcGFtbGlzdChbMSwyLDNdKSwgMCwgMiwgc3BhbWxpc3QoWzEsMl0pLCAiYVtiOmNdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX2dldHNsaWNlX18iKQorICAgICAgICBzZWxmLnNldG9wX3Rlc3Qoc3BhbWxpc3QoWzFdKSwgc3BhbWxpc3QoWzJdKSwgc3BhbWxpc3QoWzEsMl0pLCAiYSs9YiIsCisgICAgICAgICAgICAgICAgICAgICAgICJfX2lhZGRfXyIpCisgICAgICAgIHNlbGYuc2V0b3BfdGVzdChzcGFtbGlzdChbMSwyXSksIDMsIHNwYW1saXN0KFsxLDIsMSwyLDEsMl0pLCAiYSo9YiIsCisgICAgICAgICAgICAgICAgICAgICAgICJfX2ltdWxfXyIpCisgICAgICAgIHNlbGYudW5vcF90ZXN0KHNwYW1saXN0KFsxLDIsM10pLCAzLCAibGVuKGEpIiwgIl9fbGVuX18iKQorICAgICAgICBzZWxmLmJpbm9wX3Rlc3Qoc3BhbWxpc3QoWzEsMl0pLCAzLCBzcGFtbGlzdChbMSwyLDEsMiwxLDJdKSwgImEqYiIsCisgICAgICAgICAgICAgICAgICAgICAgICJfX211bF9fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHNwYW1saXN0KFsxLDJdKSwgMywgc3BhbWxpc3QoWzEsMiwxLDIsMSwyXSksICJiKmEiLAorICAgICAgICAgICAgICAgICAgICAgICAiX19ybXVsX18iKQorICAgICAgICBzZWxmLnNldDJvcF90ZXN0KHNwYW1saXN0KFsxLDJdKSwgMSwgMywgc3BhbWxpc3QoWzEsM10pLCAiYVtiXT1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfX3NldGl0ZW1fXyIpCisgICAgICAgIHNlbGYuc2V0M29wX3Rlc3Qoc3BhbWxpc3QoWzEsMiwzLDRdKSwgMSwgMywgc3BhbWxpc3QoWzUsNl0pLAorICAgICAgICAgICAgICAgICAgIHNwYW1saXN0KFsxLDUsNiw0XSksICJhW2I6Y109ZCIsICJfX3NldHNsaWNlX18iKQorICAgICAgICAjIFRlc3Qgc3ViY2xhc3NpbmcKKyAgICAgICAgY2xhc3MgQyhzcGFtLnNwYW1saXN0KToKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6IHJldHVybiAxCisgICAgICAgIGEgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmZvbygpLCAxKQorICAgICAgICBhLmFwcGVuZCgxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgWzEwMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5nZXRzdGF0ZSgpLCAwKQorICAgICAgICBhLnNldHN0YXRlKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZ2V0c3RhdGUoKSwgNDIpCisKKyAgICBAdGVzdF9zdXBwb3J0LmltcGxfZGV0YWlsKCJ0aGUgbW9kdWxlICd4eHN1YnR5cGUnIGlzIGludGVybmFsIikKKyAgICBkZWYgdGVzdF9zcGFtX2RpY3RzKHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgc3BhbWRpY3Qgb3BlcmF0aW9ucy4uLgorICAgICAgICBpbXBvcnQgY29weSwgeHhzdWJ0eXBlIGFzIHNwYW0KKyAgICAgICAgZGVmIHNwYW1kaWN0KGQsIG1lbW89Tm9uZSk6CisgICAgICAgICAgICBpbXBvcnQgeHhzdWJ0eXBlIGFzIHNwYW0KKyAgICAgICAgICAgIHNkID0gc3BhbS5zcGFtZGljdCgpCisgICAgICAgICAgICBmb3IgaywgdiBpbiBkLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgc2Rba10gPSB2CisgICAgICAgICAgICByZXR1cm4gc2QKKyAgICAgICAgIyBUaGlzIGlzIGFuIHVnbHkgaGFjazoKKyAgICAgICAgY29weS5fZGVlcGNvcHlfZGlzcGF0Y2hbc3BhbS5zcGFtZGljdF0gPSBzcGFtZGljdAorCisgICAgICAgIHNlbGYuYmlub3BfdGVzdChzcGFtZGljdCh7MToyfSksIHNwYW1kaWN0KHsyOjF9KSwgLTEsICJjbXAoYSxiKSIsCisgICAgICAgICAgICAgICAgICAgICAgICJfX2NtcF9fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHNwYW1kaWN0KHsxOjIsMzo0fSksIDEsIDEsICJiIGluIGEiLCAiX19jb250YWluc19fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHNwYW1kaWN0KHsxOjIsMzo0fSksIDIsIDAsICJiIGluIGEiLCAiX19jb250YWluc19fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHNwYW1kaWN0KHsxOjIsMzo0fSksIDEsIDIsICJhW2JdIiwgIl9fZ2V0aXRlbV9fIikKKyAgICAgICAgZCA9IHNwYW1kaWN0KHsxOjIsMzo0fSkKKyAgICAgICAgbDEgPSBbXQorICAgICAgICBmb3IgaSBpbiBkLmtleXMoKToKKyAgICAgICAgICAgIGwxLmFwcGVuZChpKQorICAgICAgICBsID0gW10KKyAgICAgICAgZm9yIGkgaW4gaXRlcihkKToKKyAgICAgICAgICAgIGwuYXBwZW5kKGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgbDEpCisgICAgICAgIGwgPSBbXQorICAgICAgICBmb3IgaSBpbiBkLl9faXRlcl9fKCk6CisgICAgICAgICAgICBsLmFwcGVuZChpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwsIGwxKQorICAgICAgICBsID0gW10KKyAgICAgICAgZm9yIGkgaW4gdHlwZShzcGFtZGljdCh7fSkpLl9faXRlcl9fKGQpOgorICAgICAgICAgICAgbC5hcHBlbmQoaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLCBsMSkKKyAgICAgICAgc3RyYWlnaHRkID0gezE6MiwgMzo0fQorICAgICAgICBzcGFtZCA9IHNwYW1kaWN0KHN0cmFpZ2h0ZCkKKyAgICAgICAgc2VsZi51bm9wX3Rlc3Qoc3BhbWQsIDIsICJsZW4oYSkiLCAiX19sZW5fXyIpCisgICAgICAgIHNlbGYudW5vcF90ZXN0KHNwYW1kLCByZXByKHN0cmFpZ2h0ZCksICJyZXByKGEpIiwgIl9fcmVwcl9fIikKKyAgICAgICAgc2VsZi5zZXQyb3BfdGVzdChzcGFtZGljdCh7MToyLDM6NH0pLCAyLCAzLCBzcGFtZGljdCh7MToyLDI6MywzOjR9KSwKKyAgICAgICAgICAgICAgICAgICAiYVtiXT1jIiwgIl9fc2V0aXRlbV9fIikKKyAgICAgICAgIyBUZXN0IHN1YmNsYXNzaW5nCisgICAgICAgIGNsYXNzIEMoc3BhbS5zcGFtZGljdCk6CisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOiByZXR1cm4gMQorICAgICAgICBhID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pdGVtcygpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmZvbygpLCAxKQorICAgICAgICBhWydmb28nXSA9ICdiYXInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pdGVtcygpLCBbKCdmb28nLCAnYmFyJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZ2V0c3RhdGUoKSwgMCkKKyAgICAgICAgYS5zZXRzdGF0ZSgxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5nZXRzdGF0ZSgpLCAxMDApCisKK2NsYXNzIENsYXNzUHJvcGVydGllc0FuZE1ldGhvZHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfcHl0aG9uX2RpY3RzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgUHl0aG9uIHN1YmNsYXNzIG9mIGRpY3QuLi4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoZGljdCwgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh7fSwgZGljdCkKKyAgICAgICAgZCA9IGRpY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHt9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5fX2NsYXNzX18gaXMgZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQsIGRpY3QpCisgICAgICAgIGNsYXNzIEMoZGljdCk6CisgICAgICAgICAgICBzdGF0ZSA9IC0xCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZl9sb2NhbCwgKmEsICoqa3cpOgorICAgICAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGEpLCAxKQorICAgICAgICAgICAgICAgICAgICBzZWxmX2xvY2FsLnN0YXRlID0gYVswXQorICAgICAgICAgICAgICAgIGlmIGt3OgorICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBrdy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZl9sb2NhbFt2XSA9IGsKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmdldChrZXksIDApCisgICAgICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZl9sb2NhbCwga2V5LCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGtleSwgdHlwZSgwKSkKKyAgICAgICAgICAgICAgICBkaWN0Ll9fc2V0aXRlbV9fKHNlbGZfbG9jYWwsIGtleSwgdmFsdWUpCisgICAgICAgICAgICBkZWYgc2V0c3RhdGUoc2VsZiwgc3RhdGUpOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzdGF0ZQorICAgICAgICAgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnN0YXRlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMsIGRpY3QpKQorICAgICAgICBhMSA9IEMoMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYTEuc3RhdGUsIDEyKQorICAgICAgICBhMiA9IEMoZm9vPTEsIGJhcj0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEyWzFdID09ICdmb28nIGFuZCBhMlsyXSwgJ2JhcicpCisgICAgICAgIGEgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnN0YXRlLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmdldHN0YXRlKCksIC0xKQorICAgICAgICBhLnNldHN0YXRlKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5zdGF0ZSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmdldHN0YXRlKCksIDApCisgICAgICAgIGEuc2V0c3RhdGUoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5zdGF0ZSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5nZXRzdGF0ZSgpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzQyXSwgMCkKKyAgICAgICAgYVs0Ml0gPSAyNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbNDJdLCAyNCkKKyAgICAgICAgTiA9IDUwCisgICAgICAgIGZvciBpIGluIHJhbmdlKE4pOgorICAgICAgICAgICAgYVtpXSA9IEMoKQorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoTik6CisgICAgICAgICAgICAgICAgYVtpXVtqXSA9IGkqagorICAgICAgICBmb3IgaSBpbiByYW5nZShOKToKKyAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKE4pOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVtpXVtqXSwgaSpqKQorCisgICAgZGVmIHRlc3RfcHl0aG9uX2xpc3RzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgUHl0aG9uIHN1YmNsYXNzIG9mIGxpc3QuLi4KKyAgICAgICAgY2xhc3MgQyhsaXN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdC5fX2dldGl0ZW1fXyhzZWxmLCBpKSArIDEwMAorICAgICAgICAgICAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBpLCBqKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKGksIGopCisgICAgICAgIGEgPSBDKCkKKyAgICAgICAgYS5leHRlbmQoWzAsMSwyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzBdLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxXSwgMTAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMl0sIDEwMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzEwMDoyMDBdLCAoMTAwLDIwMCkpCisKKyAgICBkZWYgdGVzdF9tZXRhY2xhc3Moc2VsZik6CisgICAgICAgICMgVGVzdGluZyBfX21ldGFjbGFzc19fLi4uCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gdHlwZQorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuX19zdGF0ZSA9IDAKKyAgICAgICAgICAgIGRlZiBnZXRzdGF0ZShzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3N0YXRlCisgICAgICAgICAgICBkZWYgc2V0c3RhdGUoc2VsZiwgc3RhdGUpOgorICAgICAgICAgICAgICAgIHNlbGYuX19zdGF0ZSA9IHN0YXRlCisgICAgICAgIGEgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmdldHN0YXRlKCksIDApCisgICAgICAgIGEuc2V0c3RhdGUoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5nZXRzdGF0ZSgpLCAxMCkKKyAgICAgICAgY2xhc3MgRDoKKyAgICAgICAgICAgIGNsYXNzIF9fbWV0YWNsYXNzX18odHlwZSk6CisgICAgICAgICAgICAgICAgZGVmIG15c2VsZihjbHMpOiByZXR1cm4gY2xzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRC5teXNlbGYoKSwgRCkKKyAgICAgICAgZCA9IEQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuX19jbGFzc19fLCBEKQorICAgICAgICBjbGFzcyBNMSh0eXBlKToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgYmFzZXMsIGRpY3QpOgorICAgICAgICAgICAgICAgIGRpY3RbJ19fc3BhbV9fJ10gPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBkaWN0KQorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE0xCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5fX3NwYW1fXywgMSkKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuX19zcGFtX18sIDEpCisKKyAgICAgICAgY2xhc3MgX2luc3RhbmNlKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIE0yKG9iamVjdCk6CisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBkaWN0KToKKyAgICAgICAgICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKQorICAgICAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgICAgICAgICBzZWxmLmJhc2VzID0gYmFzZXMKKyAgICAgICAgICAgICAgICBzZWxmLmRpY3QgPSBkaWN0CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBpdCA9IF9pbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgIyBFYXJseSBiaW5kaW5nIG9mIG1ldGhvZHMKKyAgICAgICAgICAgICAgICBmb3Iga2V5IGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgICAgICAgICAgaWYga2V5LnN0YXJ0c3dpdGgoIl9fIik6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGl0LCBrZXksIHNlbGYuZGljdFtrZXldLl9fZ2V0X18oaXQsIHNlbGYpKQorICAgICAgICAgICAgICAgIHJldHVybiBpdAorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE0yCisgICAgICAgICAgICBkZWYgc3BhbShzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLm5hbWUsICdDJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmJhc2VzLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignc3BhbScsIEMuZGljdCkKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc3BhbSgpLCA0MikKKworICAgICAgICAjIE1vcmUgbWV0YWNsYXNzIGV4YW1wbGVzCisKKyAgICAgICAgY2xhc3MgYXV0b3N1cGVyKHR5cGUpOgorICAgICAgICAgICAgIyBBdXRvbWF0aWNhbGx5IGFkZCBfX3N1cGVyIHRvIHRoZSBjbGFzcworICAgICAgICAgICAgIyBUaGlzIHRyaWNrIG9ubHkgd29ya3MgZm9yIGR5bmFtaWMgY2xhc3NlcworICAgICAgICAgICAgZGVmIF9fbmV3X18obWV0YWNsYXNzLCBuYW1lLCBiYXNlcywgZGljdCk6CisgICAgICAgICAgICAgICAgY2xzID0gc3VwZXIoYXV0b3N1cGVyLCBtZXRhY2xhc3MpLl9fbmV3X18obWV0YWNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGJhc2VzLCBkaWN0KQorICAgICAgICAgICAgICAgICMgTmFtZSBtYW5nbGluZyBmb3IgX19zdXBlciByZW1vdmVzIGxlYWRpbmcgdW5kZXJzY29yZXMKKyAgICAgICAgICAgICAgICB3aGlsZSBuYW1lWzoxXSA9PSAiXyI6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzE6XQorICAgICAgICAgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiXyVzX19zdXBlciIgJSBuYW1lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICJfX3N1cGVyIgorICAgICAgICAgICAgICAgIHNldGF0dHIoY2xzLCBuYW1lLCBzdXBlcihjbHMpKQorICAgICAgICAgICAgICAgIHJldHVybiBjbHMKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBhdXRvc3VwZXIKKyAgICAgICAgICAgIGRlZiBtZXRoKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQSIKKyAgICAgICAgY2xhc3MgQihBKToKKyAgICAgICAgICAgIGRlZiBtZXRoKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQiIgKyBzZWxmLl9fc3VwZXIubWV0aCgpCisgICAgICAgIGNsYXNzIEMoQSk6CisgICAgICAgICAgICBkZWYgbWV0aChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkMiICsgc2VsZi5fX3N1cGVyLm1ldGgoKQorICAgICAgICBjbGFzcyBEKEMsIEIpOgorICAgICAgICAgICAgZGVmIG1ldGgoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJEIiArIHNlbGYuX19zdXBlci5tZXRoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEKCkubWV0aCgpLCAiRENCQSIpCisgICAgICAgIGNsYXNzIEUoQiwgQyk6CisgICAgICAgICAgICBkZWYgbWV0aChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkUiICsgc2VsZi5fX3N1cGVyLm1ldGgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUoKS5tZXRoKCksICJFQkNBIikKKworICAgICAgICBjbGFzcyBhdXRvcHJvcGVydHkodHlwZSk6CisgICAgICAgICAgICAjIEF1dG9tYXRpY2FsbHkgY3JlYXRlIHByb3BlcnR5IGF0dHJpYnV0ZXMgd2hlbiBtZXRob2RzCisgICAgICAgICAgICAjIG5hbWVkIF9nZXRfeCBhbmQvb3IgX3NldF94IGFyZSBmb3VuZAorICAgICAgICAgICAgZGVmIF9fbmV3X18obWV0YWNsYXNzLCBuYW1lLCBiYXNlcywgZGljdCk6CisgICAgICAgICAgICAgICAgaGl0cyA9IHt9CisgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsIGluIGRpY3QuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGtleS5zdGFydHN3aXRoKCJfZ2V0XyIpOgorICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5WzU6XQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0LCBzZXQgPSBoaXRzLmdldChrZXksIChOb25lLCBOb25lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldCA9IHZhbAorICAgICAgICAgICAgICAgICAgICAgICAgaGl0c1trZXldID0gZ2V0LCBzZXQKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBrZXkuc3RhcnRzd2l0aCgiX3NldF8iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleVs1Ol0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldCwgc2V0ID0gaGl0cy5nZXQoa2V5LCAoTm9uZSwgTm9uZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXQgPSB2YWwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpdHNba2V5XSA9IGdldCwgc2V0CisgICAgICAgICAgICAgICAgZm9yIGtleSwgKGdldCwgc2V0KSBpbiBoaXRzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBkaWN0W2tleV0gPSBwcm9wZXJ0eShnZXQsIHNldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoYXV0b3Byb3BlcnR5LCBtZXRhY2xhc3MpLl9fbmV3X18obWV0YWNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgYmFzZXMsIGRpY3QpCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYXV0b3Byb3BlcnR5CisgICAgICAgICAgICBkZWYgX2dldF94KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAtc2VsZi5fX3gKKyAgICAgICAgICAgIGRlZiBfc2V0X3goc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi5fX3ggPSAteAorICAgICAgICBhID0gQSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihhLCAieCIpKQorICAgICAgICBhLnggPSAxMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEueCwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fQV9feCwgLTEyKQorCisgICAgICAgIGNsYXNzIG11bHRpbWV0YWNsYXNzKGF1dG9wcm9wZXJ0eSwgYXV0b3N1cGVyKToKKyAgICAgICAgICAgICMgTWVyZ2Ugb2YgbXVsdGlwbGUgY29vcGVyYXRpbmcgbWV0YWNsYXNzZXMKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBtdWx0aW1ldGFjbGFzcworICAgICAgICAgICAgZGVmIF9nZXRfeChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkEiCisgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICBkZWYgX2dldF94KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQiIgKyBzZWxmLl9fc3VwZXIuX2dldF94KCkKKyAgICAgICAgY2xhc3MgQyhBKToKKyAgICAgICAgICAgIGRlZiBfZ2V0X3goc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDIiArIHNlbGYuX19zdXBlci5fZ2V0X3goKQorICAgICAgICBjbGFzcyBEKEMsIEIpOgorICAgICAgICAgICAgZGVmIF9nZXRfeChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkQiICsgc2VsZi5fX3N1cGVyLl9nZXRfeCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRCgpLngsICJEQ0JBIikKKworICAgICAgICAjIE1ha2Ugc3VyZSB0eXBlKHgpIGRvZXNuJ3QgY2FsbCB4Ll9fY2xhc3NfXy5fX2luaXRfXworICAgICAgICBjbGFzcyBUKHR5cGUpOgorICAgICAgICAgICAgY291bnRlciA9IDAKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgVC5jb3VudGVyICs9IDEKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBUCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVC5jb3VudGVyLCAxKQorICAgICAgICBhID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhKSwgQykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChULmNvdW50ZXIsIDEpCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOiBwYXNzCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgdHJ5OiBjKCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoImNhbGxpbmcgb2JqZWN0IHcvbyBjYWxsIG1ldGhvZCBzaG91bGQgcmFpc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgIlR5cGVFcnJvciIpCisKKyAgICAgICAgIyBUZXN0aW5nIGNvZGUgdG8gZmluZCBtb3N0IGRlcml2ZWQgYmFzZWNsYXNzCisgICAgICAgIGNsYXNzIEEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19uZXdfXygqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLl9fbmV3X18oKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIGNsYXNzIEIob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gQQorCisgICAgICAgICMgVGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3Mgb2YgRCBpcyBBIHJhdGhlciB0aGFuIHR5cGUuCisgICAgICAgIGNsYXNzIEQoQiwgQyk6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfc3ViY2xhc3NlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIFB5dGhvbiBzdWJjbGFzcyBvZiBtb2R1bGUuLi4KKyAgICAgICAgbG9nID0gW10KKyAgICAgICAgTVQgPSB0eXBlKHN5cykKKyAgICAgICAgY2xhc3MgTU0oTVQpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIE1ULl9faW5pdF9fKHNlbGYsIG5hbWUpCisgICAgICAgICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICBsb2cuYXBwZW5kKCgiZ2V0YXR0ciIsIG5hbWUpKQorICAgICAgICAgICAgICAgIHJldHVybiBNVC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpCisgICAgICAgICAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICAgICAgICAgIGxvZy5hcHBlbmQoKCJzZXRhdHRyIiwgbmFtZSwgdmFsdWUpKQorICAgICAgICAgICAgICAgIE1ULl9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKQorICAgICAgICAgICAgZGVmIF9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIGxvZy5hcHBlbmQoKCJkZWxhdHRyIiwgbmFtZSkpCisgICAgICAgICAgICAgICAgTVQuX19kZWxhdHRyX18oc2VsZiwgbmFtZSkKKyAgICAgICAgYSA9IE1NKCJhIikKKyAgICAgICAgYS5mb28gPSAxMgorICAgICAgICB4ID0gYS5mb28KKyAgICAgICAgZGVsIGEuZm9vCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nLCBbKCJzZXRhdHRyIiwgImZvbyIsIDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImdldGF0dHIiLCAiZm9vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJkZWxhdHRyIiwgImZvbyIpXSkKKworICAgICAgICAjIGh0dHA6Ly9weXRob24ub3JnL3NmLzExNzQ3MTIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgTW9kdWxlKHR5cGVzLk1vZHVsZVR5cGUsIHN0cik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJpbmhlcml0aW5nIGZyb20gTW9kdWxlVHlwZSBhbmQgc3RyIGF0IHRoZSBzYW1lIHRpbWUgIgorICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgZmFpbCIpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9pbmhlcml0ZW5jZShzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIG11bHRpcGxlIGluaGVyaXRhbmNlLi4uCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fc3RhdGUgPSAwCisgICAgICAgICAgICBkZWYgZ2V0c3RhdGUoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19zdGF0ZQorICAgICAgICAgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fc3RhdGUgPSBzdGF0ZQorICAgICAgICBhID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5nZXRzdGF0ZSgpLCAwKQorICAgICAgICBhLnNldHN0YXRlKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZ2V0c3RhdGUoKSwgMTApCisgICAgICAgIGNsYXNzIEQoZGljdCwgQyk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgdHlwZSh7fSkuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgICAgICBDLl9faW5pdF9fKHNlbGYpCisgICAgICAgIGQgPSBEKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmtleXMoKSwgW10pCisgICAgICAgIGRbImhlbGxvIl0gPSAid29ybGQiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pdGVtcygpLCBbKCJoZWxsbyIsICJ3b3JsZCIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWyJoZWxsbyJdLCAid29ybGQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0c3RhdGUoKSwgMCkKKyAgICAgICAgZC5zZXRzdGF0ZSgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldHN0YXRlKCksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuX19tcm9fXywgKEQsIGRpY3QsIEMsIG9iamVjdCkpCisKKyAgICAgICAgIyBTRiBidWcgIzQ0MjgzMworICAgICAgICBjbGFzcyBOb2RlKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50KHNlbGYuZm9vKCkpCisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiMjMiCisgICAgICAgIGNsYXNzIEZyYWcoTm9kZSwgbGlzdCk6CisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiNDIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9kZSgpLl9faW50X18oKSwgMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KE5vZGUoKSksIDIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZyYWcoKS5fX2ludF9fKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChGcmFnKCkpLCA0MikKKworICAgICAgICAjIE1JIG1peGluZyBjbGFzc2ljIGFuZCBuZXctc3R5bGUgY2xhc3Nlcy4KKworICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgeCA9IDEKKworICAgICAgICBjbGFzcyBCKEEpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEMoQSk6CisgICAgICAgICAgICB4ID0gMgorCisgICAgICAgIGNsYXNzIEQoQiwgQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRC54LCAxKQorCisgICAgICAgICMgQ2xhc3NpYyBNUk8gaXMgcHJlc2VydmVkIGZvciBhIGNsYXNzaWMgYmFzZSBjbGFzcy4KKyAgICAgICAgY2xhc3MgRShELCBvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUuX19tcm9fXywgKEUsIEQsIEIsIEEsIEMsIG9iamVjdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRS54LCAxKQorCisgICAgICAgICMgQnV0IHdpdGggYSBtaXggb2YgY2xhc3NpYyBiYXNlcywgdGhlaXIgTVJPcyBhcmUgY29tYmluZWQgdXNpbmcKKyAgICAgICAgIyBuZXctc3R5bGUgTVJPLgorICAgICAgICBjbGFzcyBGKEIsIEMsIG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRi5fX21yb19fLCAoRiwgQiwgQywgQSwgb2JqZWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGLngsIDIpCisKKyAgICAgICAgIyBUcnkgc29tZXRoaW5nIGVsc2UuCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgY21ldGhvZChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkMgYSIKKyAgICAgICAgICAgIGRlZiBhbGxfbWV0aG9kKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQyBiIgorCisgICAgICAgIGNsYXNzIE0xKEMsIG9iamVjdCk6CisgICAgICAgICAgICBkZWYgbTFtZXRob2Qoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNMSBhIgorICAgICAgICAgICAgZGVmIGFsbF9tZXRob2Qoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNMSBiIgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTTEuX19tcm9fXywgKE0xLCBDLCBvYmplY3QpKQorICAgICAgICBtID0gTTEoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uY21ldGhvZCgpLCAiQyBhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLm0xbWV0aG9kKCksICJNMSBhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmFsbF9tZXRob2QoKSwgIk0xIGIiKQorCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBkZWYgZG1ldGhvZChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkQgYSIKKyAgICAgICAgICAgIGRlZiBhbGxfbWV0aG9kKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiRCBiIgorCisgICAgICAgIGNsYXNzIE0yKEQsIG9iamVjdCk6CisgICAgICAgICAgICBkZWYgbTJtZXRob2Qoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNMiBhIgorICAgICAgICAgICAgZGVmIGFsbF9tZXRob2Qoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNMiBiIgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTTIuX19tcm9fXywgKE0yLCBELCBDLCBvYmplY3QpKQorICAgICAgICBtID0gTTIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uY21ldGhvZCgpLCAiQyBhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmRtZXRob2QoKSwgIkQgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5tMm1ldGhvZCgpLCAiTTIgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5hbGxfbWV0aG9kKCksICJNMiBiIikKKworICAgICAgICBjbGFzcyBNMyhNMSwgTTIsIG9iamVjdCk6CisgICAgICAgICAgICBkZWYgbTNtZXRob2Qoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNMyBhIgorICAgICAgICAgICAgZGVmIGFsbF9tZXRob2Qoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJNMyBiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE0zLl9fbXJvX18sIChNMywgTTEsIE0yLCBELCBDLCBvYmplY3QpKQorICAgICAgICBtID0gTTMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uY21ldGhvZCgpLCAiQyBhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmRtZXRob2QoKSwgIkQgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5tMW1ldGhvZCgpLCAiTTEgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5tMm1ldGhvZCgpLCAiTTIgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5tM21ldGhvZCgpLCAiTTMgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5hbGxfbWV0aG9kKCksICJNMyBiIikKKworICAgICAgICBjbGFzcyBDbGFzc2ljOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBOZXcoQ2xhc3NpYyk6CisgICAgICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IHR5cGUKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibmV3IGNsYXNzIHdpdGggb25seSBjbGFzc2ljIGJhc2VzIC0gc2hvdWxkbid0IGJlIikKKworICAgIGRlZiB0ZXN0X2RpYW1vbmRfaW5oZXJpdGVuY2Uoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBtdWx0aXBsZSBpbmhlcml0YW5jZSBzcGVjaWFsIGNhc2VzLi4uCisgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBzcGFtKHNlbGYpOiByZXR1cm4gIkEiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQSgpLnNwYW0oKSwgIkEiKQorICAgICAgICBjbGFzcyBCKEEpOgorICAgICAgICAgICAgZGVmIGJvbyhzZWxmKTogcmV0dXJuICJCIgorICAgICAgICAgICAgZGVmIHNwYW0oc2VsZik6IHJldHVybiAiQiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChCKCkuc3BhbSgpLCAiQiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQigpLmJvbygpLCAiQiIpCisgICAgICAgIGNsYXNzIEMoQSk6CisgICAgICAgICAgICBkZWYgYm9vKHNlbGYpOiByZXR1cm4gIkMiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQygpLnNwYW0oKSwgIkEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMoKS5ib28oKSwgIkMiKQorICAgICAgICBjbGFzcyBEKEIsIEMpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRCgpLnNwYW0oKSwgIkIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQoKS5ib28oKSwgIkIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuX19tcm9fXywgKEQsIEIsIEMsIEEsIG9iamVjdCkpCisgICAgICAgIGNsYXNzIEUoQywgQik6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChFKCkuc3BhbSgpLCAiQiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRSgpLmJvbygpLCAiQyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRS5fX21yb19fLCAoRSwgQywgQiwgQSwgb2JqZWN0KSkKKyAgICAgICAgIyBNUk8gb3JkZXIgZGlzYWdyZWVtZW50CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIEYoRCwgRSk6IHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgTVJPIG9yZGVyIGRpc2FncmVlbWVudCAoRikiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBHKEUsIEQpOiBwYXNzCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIE1STyBvcmRlciBkaXNhZ3JlZW1lbnQgKEcpIikKKworICAgICMgc2VlIHRocmVhZCBweXRob24tZGV2LzIwMDItT2N0b2Jlci8wMjkwMzUuaHRtbAorICAgIGRlZiB0ZXN0X2V4NV9mcm9tX2MzX3N3aXRjaChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGV4NSBmcm9tIEMzIHN3aXRjaCBkaXNjdXNzaW9uLi4uCisgICAgICAgIGNsYXNzIEEob2JqZWN0KTogcGFzcworICAgICAgICBjbGFzcyBCKG9iamVjdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOiBwYXNzCisgICAgICAgIGNsYXNzIFgoQSk6IHBhc3MKKyAgICAgICAgY2xhc3MgWShBKTogcGFzcworICAgICAgICBjbGFzcyBaKFgsQixZLEMpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWi5fX21yb19fLCAoWiwgWCwgQiwgWSwgQSwgQywgb2JqZWN0KSkKKworICAgICMgc2VlICJBIE1vbm90b25pYyBTdXBlcmNsYXNzIExpbmVhcml6YXRpb24gZm9yIER5bGFuIiwKKyAgICAjIGJ5IEtpbSBCYXJyZXR0IGV0IGFsLiAoT09QU0xBIDE5OTYpCisgICAgZGVmIHRlc3RfbW9ub3RvbmljaXR5KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgTVJPIG1vbm90b25pY2l0eS4uLgorICAgICAgICBjbGFzcyBCb2F0KG9iamVjdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgRGF5Qm9hdChCb2F0KTogcGFzcworICAgICAgICBjbGFzcyBXaGVlbEJvYXQoQm9hdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgRW5naW5lTGVzcyhEYXlCb2F0KTogcGFzcworICAgICAgICBjbGFzcyBTbWFsbE11bHRpaHVsbChEYXlCb2F0KTogcGFzcworICAgICAgICBjbGFzcyBQZWRhbFdoZWVsQm9hdChFbmdpbmVMZXNzLFdoZWVsQm9hdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgU21hbGxDYXRhbWFyYW4oU21hbGxNdWx0aWh1bGwpOiBwYXNzCisgICAgICAgIGNsYXNzIFBlZGFsbyhQZWRhbFdoZWVsQm9hdCxTbWFsbENhdGFtYXJhbik6IHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBlZGFsV2hlZWxCb2F0Ll9fbXJvX18sCisgICAgICAgICAgICAgIChQZWRhbFdoZWVsQm9hdCwgRW5naW5lTGVzcywgRGF5Qm9hdCwgV2hlZWxCb2F0LCBCb2F0LCBvYmplY3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNtYWxsQ2F0YW1hcmFuLl9fbXJvX18sCisgICAgICAgICAgICAgIChTbWFsbENhdGFtYXJhbiwgU21hbGxNdWx0aWh1bGwsIERheUJvYXQsIEJvYXQsIG9iamVjdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUGVkYWxvLl9fbXJvX18sCisgICAgICAgICAgICAgIChQZWRhbG8sIFBlZGFsV2hlZWxCb2F0LCBFbmdpbmVMZXNzLCBTbWFsbENhdGFtYXJhbiwKKyAgICAgICAgICAgICAgIFNtYWxsTXVsdGlodWxsLCBEYXlCb2F0LCBXaGVlbEJvYXQsIEJvYXQsIG9iamVjdCkpCisKKyAgICAjIHNlZSAiQSBNb25vdG9uaWMgU3VwZXJjbGFzcyBMaW5lYXJpemF0aW9uIGZvciBEeWxhbiIsCisgICAgIyBieSBLaW0gQmFycmV0dCBldCBhbC4gKE9PUFNMQSAxOTk2KQorICAgIGRlZiB0ZXN0X2NvbnNpc3RlbmN5X3dpdGhfZXBnKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgY29uc2lzdGVuY3kgd2l0aCBFUEcuLi4KKyAgICAgICAgY2xhc3MgUGFuZShvYmplY3QpOiBwYXNzCisgICAgICAgIGNsYXNzIFNjcm9sbGluZ01peGluKG9iamVjdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgRWRpdGluZ01peGluKG9iamVjdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgU2Nyb2xsYWJsZVBhbmUoUGFuZSxTY3JvbGxpbmdNaXhpbik6IHBhc3MKKyAgICAgICAgY2xhc3MgRWRpdGFibGVQYW5lKFBhbmUsRWRpdGluZ01peGluKTogcGFzcworICAgICAgICBjbGFzcyBFZGl0YWJsZVNjcm9sbGFibGVQYW5lKFNjcm9sbGFibGVQYW5lLEVkaXRhYmxlUGFuZSk6IHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEVkaXRhYmxlU2Nyb2xsYWJsZVBhbmUuX19tcm9fXywKKyAgICAgICAgICAgICAgKEVkaXRhYmxlU2Nyb2xsYWJsZVBhbmUsIFNjcm9sbGFibGVQYW5lLCBFZGl0YWJsZVBhbmUsIFBhbmUsCisgICAgICAgICAgICAgICAgU2Nyb2xsaW5nTWl4aW4sIEVkaXRpbmdNaXhpbiwgb2JqZWN0KSkKKworICAgIGRlZiB0ZXN0X21yb19kaXNhZ3JlZW1lbnQoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBlcnJvciBtZXNzYWdlcyBmb3IgTVJPIGRpc2FncmVlbWVudC4uLgorICAgICAgICBtcm9fZXJyX21zZyA9ICIiIkNhbm5vdCBjcmVhdGUgYSBjb25zaXN0ZW50IG1ldGhvZCByZXNvbHV0aW9uCitvcmRlciAoTVJPKSBmb3IgYmFzZXMgIiIiCisKKyAgICAgICAgZGVmIHJhaXNlcyhleGMsIGV4cGVjdGVkLCBjYWxsYWJsZSwgKmFyZ3MpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNhbGxhYmxlKCphcmdzKQorICAgICAgICAgICAgZXhjZXB0IGV4YywgbXNnOgorICAgICAgICAgICAgICAgICMgdGhlIGV4YWN0IG1zZyBpcyBnZW5lcmFsbHkgY29uc2lkZXJlZCBhbiBpbXBsIGRldGFpbAorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5jaGVja19pbXBsX2RldGFpbCgpOgorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3RyKG1zZykuc3RhcnRzd2l0aChleHBlY3RlZCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk1lc3NhZ2UgJXIsIGV4cGVjdGVkICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cihtc2cpLCBleHBlY3RlZCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRXhwZWN0ZWQgJXMiICUgZXhjKQorCisgICAgICAgIGNsYXNzIEEob2JqZWN0KTogcGFzcworICAgICAgICBjbGFzcyBCKEEpOiBwYXNzCisgICAgICAgIGNsYXNzIEMob2JqZWN0KTogcGFzcworCisgICAgICAgICMgVGVzdCBzb21lIHZlcnkgc2ltcGxlIGVycm9ycworICAgICAgICByYWlzZXMoVHlwZUVycm9yLCAiZHVwbGljYXRlIGJhc2UgY2xhc3MgQSIsCisgICAgICAgICAgICAgICB0eXBlLCAiWCIsIChBLCBBKSwge30pCisgICAgICAgIHJhaXNlcyhUeXBlRXJyb3IsIG1yb19lcnJfbXNnLAorICAgICAgICAgICAgICAgdHlwZSwgIlgiLCAoQSwgQiksIHt9KQorICAgICAgICByYWlzZXMoVHlwZUVycm9yLCBtcm9fZXJyX21zZywKKyAgICAgICAgICAgICAgIHR5cGUsICJYIiwgKEEsIEMsIEIpLCB7fSkKKyAgICAgICAgIyBUZXN0IGEgc2xpZ2h0bHkgbW9yZSBjb21wbGV4IGVycm9yCisgICAgICAgIGNsYXNzIEdyaWRMYXlvdXQob2JqZWN0KTogcGFzcworICAgICAgICBjbGFzcyBIb3Jpem9udGFsR3JpZChHcmlkTGF5b3V0KTogcGFzcworICAgICAgICBjbGFzcyBWZXJ0aWNhbEdyaWQoR3JpZExheW91dCk6IHBhc3MKKyAgICAgICAgY2xhc3MgSFZHcmlkKEhvcml6b250YWxHcmlkLCBWZXJ0aWNhbEdyaWQpOiBwYXNzCisgICAgICAgIGNsYXNzIFZIR3JpZChWZXJ0aWNhbEdyaWQsIEhvcml6b250YWxHcmlkKTogcGFzcworICAgICAgICByYWlzZXMoVHlwZUVycm9yLCBtcm9fZXJyX21zZywKKyAgICAgICAgICAgICAgIHR5cGUsICJDb25mdXNlZEdyaWQiLCAoSFZHcmlkLCBWSEdyaWQpLCB7fSkKKworICAgIGRlZiB0ZXN0X29iamVjdF9jbGFzcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIG9iamVjdCBjbGFzcy4uLgorICAgICAgICBhID0gb2JqZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fY2xhc3NfXywgb2JqZWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYSksIG9iamVjdCkKKyAgICAgICAgYiA9IG9iamVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJmb28iKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYS5mb28gPSAxMgorICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJvYmplY3QoKSBzaG91bGQgbm90IGFsbG93IHNldHRpbmcgYSBmb28gYXR0cmlidXRlIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKG9iamVjdCgpLCAiX19kaWN0X18iKSkKKworICAgICAgICBjbGFzcyBDZGljdChvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB4ID0gQ2RpY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX19kaWN0X18sIHt9KQorICAgICAgICB4LmZvbyA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZvbywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9fZGljdF9fLCB7J2Zvbyc6IDF9KQorCisgICAgZGVmIHRlc3Rfc2xvdHMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBfX3Nsb3RzX18uLi4KKyAgICAgICAgY2xhc3MgQzAob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFtdCisgICAgICAgIHggPSBDMCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih4LCAiX19kaWN0X18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICJmb28iKSkKKworICAgICAgICBjbGFzcyBDMShvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWydhJ10KKyAgICAgICAgeCA9IEMxKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICJfX2RpY3RfXyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoeCwgImEiKSkKKyAgICAgICAgeC5hID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgMSkKKyAgICAgICAgeC5hID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgTm9uZSkKKyAgICAgICAgZGVsIHguYQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoeCwgImEiKSkKKworICAgICAgICBjbGFzcyBDMyhvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWydhJywgJ2InLCAnYyddCisgICAgICAgIHggPSBDMygpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih4LCAiX19kaWN0X18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih4LCAnYicpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoeCwgJ2MnKSkKKyAgICAgICAgeC5hID0gMQorICAgICAgICB4LmIgPSAyCisgICAgICAgIHguYyA9IDMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5iLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYywgMykKKworICAgICAgICBjbGFzcyBDNChvYmplY3QpOgorICAgICAgICAgICAgIiIiVmFsaWRhdGUgbmFtZSBtYW5nbGluZyIiIgorICAgICAgICAgICAgX19zbG90c19fID0gWydfX2EnXQorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fYSA9IHZhbHVlCisgICAgICAgICAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fYQorICAgICAgICB4ID0gQzQoNSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICdfX2RpY3RfXycpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoeCwgJ19fYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZ2V0KCksIDUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHguX19hID0gNgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkRvdWJsZSB1bmRlcnNjb3JlZCBuYW1lcyBub3QgbWFuZ2xlZCIpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgc2xvdCBuYW1lcyBhcmUgcHJvcGVyIGlkZW50aWZpZXJzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbTm9uZV0KKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiW05vbmVdIHNsb3RzIG5vdCBjYXVnaHQiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICAgICAgX19zbG90c19fID0gWyJmb28gYmFyIl0KKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiWydmb28gYmFyJ10gc2xvdHMgbm90IGNhdWdodCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbImZvb1wwYmFyIl0KKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiWydmb29cXDBiYXInXSBzbG90cyBub3QgY2F1Z2h0IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiMSJdCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlsnMSddIHNsb3RzIG5vdCBjYXVnaHQiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICAgICAgX19zbG90c19fID0gWyIiXQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJbJyddIHNsb3RzIG5vdCBjYXVnaHQiKQorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbImEiLCAiYV9iIiwgIl9hIiwgIkEwMTIzNDU2Nzg5WiJdCisgICAgICAgICMgWFhYKG5ub3J3aXR6KTogd2FzIHRoZXJlIHN1cHBvc2VkIHRvIGJlIHNvbWV0aGluZyB0ZXN0ZWQKKyAgICAgICAgIyBmcm9tIHRoZSBjbGFzcyBhYm92ZT8KKworICAgICAgICAjIFRlc3QgYSBzaW5nbGUgc3RyaW5nIGlzIG5vdCBleHBhbmRlZCBhcyBhIHNlcXVlbmNlLgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSAiYWJjIgorICAgICAgICBjID0gQygpCisgICAgICAgIGMuYWJjID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuYWJjLCA1KQorCisgICAgICAgICMgVGVzdCB1bmljb2RlIHNsb3QgbmFtZXMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdW5pY29kZQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBUZXN0IGEgc2luZ2xlIHVuaWNvZGUgc3RyaW5nIGlzIG5vdCBleHBhbmRlZCBhcyBhIHNlcXVlbmNlLgorICAgICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgICAgIF9fc2xvdHNfXyA9IHVuaWNvZGUoImFiYyIpCisgICAgICAgICAgICBjID0gQygpCisgICAgICAgICAgICBjLmFiYyA9IDUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5hYmMsIDUpCisKKyAgICAgICAgICAgICMgX3VuaWNvZGVfdG9fc3RyaW5nIHVzZWQgdG8gbW9kaWZ5IHNsb3RzIGluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcworICAgICAgICAgICAgc2xvdHMgPSAodW5pY29kZSgiZm9vIiksIHVuaWNvZGUoImJhciIpKQorICAgICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgICAgIF9fc2xvdHNfXyA9IHNsb3RzCisgICAgICAgICAgICB4ID0gQygpCisgICAgICAgICAgICB4LmZvbyA9IDUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5mb28sIDUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc2xvdHNbMF0pLCB1bmljb2RlKQorICAgICAgICAgICAgIyB0aGlzIHVzZWQgdG8gbGVhayByZWZlcmVuY2VzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbdW5pY2hyKDEyOCldCisgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiW3VuaWNocigxMjgpXSBzbG90cyBub3QgY2F1Z2h0IikKKworICAgICAgICAjIFRlc3QgbGVha3MKKyAgICAgICAgY2xhc3MgQ291bnRlZChvYmplY3QpOgorICAgICAgICAgICAgY291bnRlciA9IDAgICAgIyBjb3VudHMgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgYWxpdmUKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBDb3VudGVkLmNvdW50ZXIgKz0gMQorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgQ291bnRlZC5jb3VudGVyIC09IDEKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWydhJywgJ2InLCAnYyddCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgeC5hID0gQ291bnRlZCgpCisgICAgICAgIHguYiA9IENvdW50ZWQoKQorICAgICAgICB4LmMgPSBDb3VudGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDb3VudGVkLmNvdW50ZXIsIDMpCisgICAgICAgIGRlbCB4CisgICAgICAgIHRlc3Rfc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDb3VudGVkLmNvdW50ZXIsIDApCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHggPSBEKCkKKyAgICAgICAgeC5hID0gQ291bnRlZCgpCisgICAgICAgIHgueiA9IENvdW50ZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENvdW50ZWQuY291bnRlciwgMikKKyAgICAgICAgZGVsIHgKKyAgICAgICAgdGVzdF9zdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENvdW50ZWQuY291bnRlciwgMCkKKyAgICAgICAgY2xhc3MgRShEKToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsnZSddCisgICAgICAgIHggPSBFKCkKKyAgICAgICAgeC5hID0gQ291bnRlZCgpCisgICAgICAgIHgueiA9IENvdW50ZWQoKQorICAgICAgICB4LmUgPSBDb3VudGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDb3VudGVkLmNvdW50ZXIsIDMpCisgICAgICAgIGRlbCB4CisgICAgICAgIHRlc3Rfc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDb3VudGVkLmNvdW50ZXIsIDApCisKKyAgICAgICAgIyBUZXN0IGN5Y2xpY2FsIGxlYWtzIFtTRiBidWcgNTE5NjIxXQorICAgICAgICBjbGFzcyBGKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbJ2EnLCAnYiddCisgICAgICAgIHMgPSBGKCkKKyAgICAgICAgcy5hID0gW0NvdW50ZWQoKSwgc10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDb3VudGVkLmNvdW50ZXIsIDEpCisgICAgICAgIHMgPSBOb25lCisgICAgICAgIHRlc3Rfc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDb3VudGVkLmNvdW50ZXIsIDApCisKKyAgICAgICAgIyBUZXN0IGxvb2t1cCBsZWFrcyBbU0YgYnVnIDU3MjU2N10KKyAgICAgICAgaWYgaGFzYXR0cihnYywgJ2dldF9vYmplY3RzJyk6CisgICAgICAgICAgICBjbGFzcyBHKG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgICAgICBnID0gRygpCisgICAgICAgICAgICBvcmlnX29iamVjdHMgPSBsZW4oZ2MuZ2V0X29iamVjdHMoKSkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMCk6CisgICAgICAgICAgICAgICAgZz09ZworICAgICAgICAgICAgbmV3X29iamVjdHMgPSBsZW4oZ2MuZ2V0X29iamVjdHMoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZ19vYmplY3RzLCBuZXdfb2JqZWN0cykKKworICAgICAgICBjbGFzcyBIKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbJ2EnLCAnYiddCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5hID0gMQorICAgICAgICAgICAgICAgIHNlbGYuYiA9IDIKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGZfKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGZfLmEsIDEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmXy5iLCAyKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jYXB0dXJlZF9vdXRwdXQoJ3N0ZGVycicpIGFzIHM6CisgICAgICAgICAgICBoID0gSCgpCisgICAgICAgICAgICBkZWwgaAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJycpCisKKyAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gImEiCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgZGVsIFgoKS5hCisKKyAgICBkZWYgdGVzdF9zbG90c19zcGVjaWFsKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgX19kaWN0X18gYW5kIF9fd2Vha3JlZl9fIGluIF9fc2xvdHNfXy4uLgorICAgICAgICBjbGFzcyBEKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbIl9fZGljdF9fIl0KKyAgICAgICAgYSA9IEQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiX19kaWN0X18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJfX3dlYWtyZWZfXyIpKQorICAgICAgICBhLmZvbyA9IDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2RpY3RfXywgeyJmb28iOiA0Mn0pCisKKyAgICAgICAgY2xhc3MgVyhvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWyJfX3dlYWtyZWZfXyJdCisgICAgICAgIGEgPSBXKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYSwgIl9fd2Vha3JlZl9fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhLCAiX19kaWN0X18iKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYS5mb28gPSA0MgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBiZSBhbGxvd2VkIHRvIHNldCBhLmZvbyIpCisKKyAgICAgICAgY2xhc3MgQzEoVywgRCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbXQorICAgICAgICBhID0gQzEoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiX19kaWN0X18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYSwgIl9fd2Vha3JlZl9fIikpCisgICAgICAgIGEuZm9vID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZGljdF9fLCB7ImZvbyI6IDQyfSkKKworICAgICAgICBjbGFzcyBDMihELCBXKToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFtdCisgICAgICAgIGEgPSBDMigpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGEsICJfX2RpY3RfXyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiX193ZWFrcmVmX18iKSkKKyAgICAgICAgYS5mb28gPSA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19kaWN0X18sIHsiZm9vIjogNDJ9KQorCisgICAgZGVmIHRlc3Rfc2xvdHNfZGVzY3JpcHRvcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZTIxMTU6IHNsb3QgZGVzY3JpcHRvcnMgZGlkIG5vdCBjb3JyZWN0bHkgY2hlY2sKKyAgICAgICAgIyB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0CisgICAgICAgIGltcG9ydCBhYmMKKyAgICAgICAgY2xhc3MgTXlBQkM6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9ICJhIgorCisgICAgICAgIGNsYXNzIFVucmVsYXRlZChvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBNeUFCQy5yZWdpc3RlcihVbnJlbGF0ZWQpCisKKyAgICAgICAgdSA9IFVucmVsYXRlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh1LCBNeUFCQykKKworICAgICAgICAjIFRoaXMgdXNlZCB0byBjcmFzaAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIE15QUJDLmEuX19zZXRfXywgdSwgMykKKworICAgIGRlZiB0ZXN0X21ldGFjbGFzc19jbXAoc2VsZik6CisgICAgICAgICMgU2VlIGJ1ZyA3NDkxLgorICAgICAgICBjbGFzcyBNKHR5cGUpOgorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gTQorICAgICAgICBzZWxmLmFzc2VydFRydWUoWCA8IE0pCisKKyAgICBkZWYgdGVzdF9keW5hbWljcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGNsYXNzIGF0dHJpYnV0ZSBwcm9wYWdhdGlvbi4uLgorICAgICAgICBjbGFzcyBEKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEUoRCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEYoRCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIEQuZm9vID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuZm9vLCAxKQorICAgICAgICAjIFRlc3QgdGhhdCBkeW5hbWljIGF0dHJpYnV0ZXMgYXJlIGluaGVyaXRlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUuZm9vLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYuZm9vLCAxKQorICAgICAgICAjIFRlc3QgZHluYW1pYyBpbnN0YW5jZXMKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBhID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhLCAiZm9vYmFyIikpCisgICAgICAgIEMuZm9vYmFyID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZm9vYmFyLCAyKQorICAgICAgICBDLm1ldGhvZCA9IGxhbWJkYSBzZWxmOiA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEubWV0aG9kKCksIDQyKQorICAgICAgICBDLl9fcmVwcl9fID0gbGFtYmRhIHNlbGY6ICJDKCkiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhKSwgIkMoKSIpCisgICAgICAgIEMuX19pbnRfXyA9IGxhbWJkYSBzZWxmOiAxMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoYSksIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmZvb2JhciwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJzcGFtIikpCisgICAgICAgIGRlZiBteWdldGF0dHIoc2VsZiwgbmFtZSk6CisgICAgICAgICAgICBpZiBuYW1lID09ICJzcGFtIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gInNwYW0iCisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcgorICAgICAgICBDLl9fZ2V0YXR0cl9fID0gbXlnZXRhdHRyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5zcGFtLCAic3BhbSIpCisgICAgICAgIGEubmV3ID0gMTIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm5ldywgMTIpCisgICAgICAgIGRlZiBteXNldGF0dHIoc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICAgICAgaWYgbmFtZSA9PSAic3BhbSI6CisgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpCisgICAgICAgIEMuX19zZXRhdHRyX18gPSBteXNldGF0dHIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYS5zcGFtID0gIm5vdCBzcGFtIgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIEF0dHJpYnV0ZUVycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnNwYW0sICJzcGFtIikKKyAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZCA9IEQoKQorICAgICAgICBkLmZvbyA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZvbywgMSkKKworICAgICAgICAjIFRlc3QgaGFuZGxpbmcgb2YgaW50KnNlcSBhbmQgc2VxKmludAorICAgICAgICBjbGFzcyBJKGludCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiKkkoMiksICJhYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSSgyKSoiYSIsICJhYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMipJKDMpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEkoMykqMiwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChJKDMpKkkoMiksIDYpCisKKyAgICAgICAgIyBUZXN0IGhhbmRsaW5nIG9mIGxvbmcqc2VxIGFuZCBzZXEqbG9uZworICAgICAgICBjbGFzcyBMKGxvbmcpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIipMKDJMKSwgImFhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMKDJMKSoiYSIsICJhYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMipMKDMpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwoMykqMiwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMKDMpKkwoMiksIDYpCisKKyAgICAgICAgIyBUZXN0IGNvbXBhcmlzb24gb2YgY2xhc3NlcyB3aXRoIGR5bmFtaWMgbWV0YWNsYXNzZXMKKyAgICAgICAgY2xhc3MgZHluYW1pY21ldGFjbGFzcyh0eXBlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3Mgc29tZWNsYXNzOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGR5bmFtaWNtZXRhY2xhc3MKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzb21lY2xhc3MsIG9iamVjdCkKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGVycm9ycy4uLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBDKGxpc3QsIGRpY3QpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiaW5oZXJpdGFuY2UgZnJvbSBib3RoIGxpc3QgYW5kIGRpY3Qgc2hvdWxkIGJlIGlsbGVnYWwiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIEMob2JqZWN0LCBOb25lKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImluaGVyaXRhbmNlIGZyb20gbm9uLXR5cGUgc2hvdWxkIGJlIGlsbGVnYWwiKQorICAgICAgICBjbGFzcyBDbGFzc2ljOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIEModHlwZShsZW4pKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImluaGVyaXRhbmNlIGZyb20gQ0Z1bmN0aW9uIHNob3VsZCBiZSBpbGxlZ2FsIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICAgICAgX19zbG90c19fID0gMQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJfX3Nsb3RzX18gPSAxIHNob3VsZCBiZSBpbGxlZ2FsIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICAgICAgX19zbG90c19fID0gWzFdCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIl9fc2xvdHNfXyA9IFsxXSBzaG91bGQgYmUgaWxsZWdhbCIpCisKKyAgICAgICAgY2xhc3MgTTEodHlwZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIE0yKHR5cGUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBBMShvYmplY3QpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE0xCisgICAgICAgIGNsYXNzIEEyKG9iamVjdCk6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gTTIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgQihBMSwgQTIpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZmluZGluZyB0aGUgbW9zdCBkZXJpdmVkIG1ldGFjbGFzcyBzaG91bGQgaGF2ZSBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfY2xhc3NtZXRob2RzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgY2xhc3MgbWV0aG9kcy4uLgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZm9vKCphKTogcmV0dXJuIGEKKyAgICAgICAgICAgIGdvbyA9IGNsYXNzbWV0aG9kKGZvbykKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuZ29vKDEpLCAoQywgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5nb28oMSksIChDLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmZvbygxKSwgKGMsIDEpKQorICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkID0gRCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRC5nb28oMSksIChELCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdvbygxKSwgKEQsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZm9vKDEpLCAoZCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRC5mb28oZCwgMSksIChkLCAxKSkKKyAgICAgICAgIyBUZXN0IGZvciBhIHNwZWNpZmljIGNyYXNoIChTRiBidWcgNTI4MTMyKQorICAgICAgICBkZWYgZihjbHMsIGFyZyk6IHJldHVybiAoY2xzLCBhcmcpCisgICAgICAgIGZmID0gY2xhc3NtZXRob2QoZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmZi5fX2dldF9fKDAsIGludCkoNDIpLCAoaW50LCA0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmYuX19nZXRfXygwKSg0MiksIChpbnQsIDQyKSkKKworICAgICAgICAjIFRlc3Qgc3VwZXIoKSB3aXRoIGNsYXNzbWV0aG9kcyAoU0YgYnVnIDUzNTQ0NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmdvby5pbV9zZWxmLCBDKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuZ29vLmltX3NlbGYsIEQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VwZXIoRCxEKS5nb28uaW1fc2VsZiwgRCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdXBlcihELGQpLmdvby5pbV9zZWxmLCBEKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1cGVyKEQsRCkuZ29vKCksIChELCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VwZXIoRCxkKS5nb28oKSwgKEQsKSkKKworICAgICAgICAjIFZlcmlmeSB0aGF0IGEgbm9uLWNhbGxhYmxlIHdpbGwgcmFpc2UKKyAgICAgICAgbWV0aCA9IGNsYXNzbWV0aG9kKDEpLl9fZ2V0X18oMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZXRoKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgY2xhc3NtZXRob2QoKSBkb2Vzbid0IGFsbG93IGtleXdvcmQgYXJncworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzc21ldGhvZChmLCBrdz0xKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJjbGFzc21ldGhvZCBzaG91bGRuJ3QgYWNjZXB0IGtleXdvcmQgYXJncyIpCisKKyAgICBAdGVzdF9zdXBwb3J0LmltcGxfZGV0YWlsKCJ0aGUgbW9kdWxlICd4eHN1YnR5cGUnIGlzIGludGVybmFsIikKKyAgICBkZWYgdGVzdF9jbGFzc21ldGhvZHNfaW5fYyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIEMtYmFzZWQgY2xhc3MgbWV0aG9kcy4uLgorICAgICAgICBpbXBvcnQgeHhzdWJ0eXBlIGFzIHNwYW0KKyAgICAgICAgYSA9ICgxLCAyLCAzKQorICAgICAgICBkID0geydhYmMnOiAxMjN9CisgICAgICAgIHgsIGExLCBkMSA9IHNwYW0uc3BhbWxpc3QuY2xhc3NtZXRoKCphLCAqKmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgc3BhbS5zcGFtbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkMSkKKyAgICAgICAgeCwgYTEsIGQxID0gc3BhbS5zcGFtbGlzdCgpLmNsYXNzbWV0aCgqYSwgKipkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHNwYW0uc3BhbWxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZDEpCisgICAgICAgIHNwYW1fY20gPSBzcGFtLnNwYW1saXN0Ll9fZGljdF9fWydjbGFzc21ldGgnXQorICAgICAgICB4MiwgYTIsIGQyID0gc3BhbV9jbShzcGFtLnNwYW1saXN0LCAqYSwgKipkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgyLCBzcGFtLnNwYW1saXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEyLCBhMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMiwgZDEpCisgICAgICAgIGNsYXNzIFN1YlNwYW0oc3BhbS5zcGFtbGlzdCk6IHBhc3MKKyAgICAgICAgeDIsIGEyLCBkMiA9IHNwYW1fY20oU3ViU3BhbSwgKmEsICoqZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4MiwgU3ViU3BhbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMiwgYTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIsIGQxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBzcGFtX2NtKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc3BhbV9jbShzcGFtLnNwYW1saXN0KCkpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNwYW1fY20obGlzdCkKKworICAgIGRlZiB0ZXN0X3N0YXRpY21ldGhvZHMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBzdGF0aWMgbWV0aG9kcy4uLgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZm9vKCphKTogcmV0dXJuIGEKKyAgICAgICAgICAgIGdvbyA9IHN0YXRpY21ldGhvZChmb28pCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmdvbygxKSwgKDEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmdvbygxKSwgKDEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmZvbygxKSwgKGMsIDEsKSkKKyAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZCA9IEQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuZ29vKDEpLCAoMSwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ29vKDEpLCAoMSwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZm9vKDEpLCAoZCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRC5mb28oZCwgMSksIChkLCAxKSkKKworICAgIEB0ZXN0X3N1cHBvcnQuaW1wbF9kZXRhaWwoInRoZSBtb2R1bGUgJ3h4c3VidHlwZScgaXMgaW50ZXJuYWwiKQorICAgIGRlZiB0ZXN0X3N0YXRpY21ldGhvZHNfaW5fYyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIEMtYmFzZWQgc3RhdGljIG1ldGhvZHMuLi4KKyAgICAgICAgaW1wb3J0IHh4c3VidHlwZSBhcyBzcGFtCisgICAgICAgIGEgPSAoMSwgMiwgMykKKyAgICAgICAgZCA9IHsiYWJjIjogMTIzfQorICAgICAgICB4LCBhMSwgZDEgPSBzcGFtLnNwYW1saXN0LnN0YXRpY21ldGgoKmEsICoqZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGQxKQorICAgICAgICB4LCBhMSwgZDIgPSBzcGFtLnNwYW1saXN0KCkuc3RhdGljbWV0aCgqYSwgKipkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZDEpCisKKyAgICBkZWYgdGVzdF9jbGFzc2ljKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgY2xhc3NpYyBjbGFzc2VzLi4uCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgZm9vKCphKTogcmV0dXJuIGEKKyAgICAgICAgICAgIGdvbyA9IGNsYXNzbWV0aG9kKGZvbykKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuZ29vKDEpLCAoQywgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5nb28oMSksIChDLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmZvbygxKSwgKGMsIDEpKQorICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkID0gRCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRC5nb28oMSksIChELCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdvbygxKSwgKEQsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZm9vKDEpLCAoZCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRC5mb28oZCwgMSksIChkLCAxKSkKKyAgICAgICAgY2xhc3MgRTogIyAqbm90KiBzdWJjbGFzc2luZyBmcm9tIEMKKyAgICAgICAgICAgIGZvbyA9IEMuZm9vCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRSgpLmZvbywgQy5mb28pICMgaS5lLiwgdW5ib3VuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihDLmZvby5fX2dldF9fKEMoKSkpLnN0YXJ0c3dpdGgoIjxib3VuZCBtZXRob2QgIikpCisKKyAgICBkZWYgdGVzdF9jb21wYXR0cihzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGNvbXB1dGVkIGF0dHJpYnV0ZXMuLi4KKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgY2xhc3MgY29tcHV0ZWRfYXR0cmlidXRlKG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGdldCwgc2V0PU5vbmUsIGRlbGV0ZT1Ob25lKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2dldCA9IGdldAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9fc2V0ID0gc2V0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX19kZWxldGUgPSBkZWxldGUKKyAgICAgICAgICAgICAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIHR5cGU9Tm9uZSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZ2V0KG9iaikKKyAgICAgICAgICAgICAgICBkZWYgX19zZXRfXyhzZWxmLCBvYmosIHZhbHVlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19zZXQob2JqLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBkZWYgX19kZWxldGVfXyhzZWxmLCBvYmopOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2RlbGV0ZShvYmopCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5fX3ggPSAwCisgICAgICAgICAgICBkZWYgX19nZXRfeChzZWxmKToKKyAgICAgICAgICAgICAgICB4ID0gc2VsZi5fX3gKKyAgICAgICAgICAgICAgICBzZWxmLl9feCA9IHgrMQorICAgICAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgICAgICBkZWYgX19zZXRfeChzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLl9feCA9IHgKKyAgICAgICAgICAgIGRlZiBfX2RlbGV0ZV94KHNlbGYpOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9feAorICAgICAgICAgICAgeCA9IGNvbXB1dGVkX2F0dHJpYnV0ZShfX2dldF94LCBfX3NldF94LCBfX2RlbGV0ZV94KQorICAgICAgICBhID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS54LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEueCwgMSkKKyAgICAgICAgYS54ID0gMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLngsIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEueCwgMTEpCisgICAgICAgIGRlbCBhLngKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNhdHRyKGEsICd4JyksIDApCisKKyAgICBkZWYgdGVzdF9uZXdzbG90cyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIF9fbmV3X18gc2xvdCBvdmVycmlkZS4uLgorICAgICAgICBjbGFzcyBDKGxpc3QpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzKToKKyAgICAgICAgICAgICAgICBzZWxmID0gbGlzdC5fX25ld19fKGNscykKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gc2VsZi5mb28gKyAyCisgICAgICAgIGEgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmZvbywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fY2xhc3NfXywgQykKKyAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYiA9IEQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZm9vLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuX19jbGFzc19fLCBEKQorCisgICAgZGVmIHRlc3RfYWx0bXJvKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgbXJvKCkgYW5kIG92ZXJyaWRpbmcgaXQuLi4KKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgZGVmIGYoc2VsZik6IHJldHVybiAiQSIKKyAgICAgICAgY2xhc3MgQihBKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgQyhBKToKKyAgICAgICAgICAgIGRlZiBmKHNlbGYpOiByZXR1cm4gIkMiCisgICAgICAgIGNsYXNzIEQoQiwgQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRC5tcm8oKSwgW0QsIEIsIEMsIEEsIG9iamVjdF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRC5fX21yb19fLCAoRCwgQiwgQywgQSwgb2JqZWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEKCkuZigpLCAiQyIpCisKKyAgICAgICAgY2xhc3MgUGVydmVyc2VNZXRhVHlwZSh0eXBlKToKKyAgICAgICAgICAgIGRlZiBtcm8oY2xzKToKKyAgICAgICAgICAgICAgICBMID0gdHlwZS5tcm8oY2xzKQorICAgICAgICAgICAgICAgIEwucmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEwKKyAgICAgICAgY2xhc3MgWChELEIsQyxBKToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBQZXJ2ZXJzZU1ldGFUeXBlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5fX21yb19fLCAob2JqZWN0LCBBLCBDLCBCLCBELCBYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYKCkuZigpLCAiQSIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgICAgIGNsYXNzIF9fbWV0YWNsYXNzX18odHlwZSk6CisgICAgICAgICAgICAgICAgICAgIGRlZiBtcm8oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3NlbGYsIGRpY3QsIG9iamVjdF0KKyAgICAgICAgICAgICMgSW4gQ1B5dGhvbiwgdGhlIGNsYXNzIGNyZWF0aW9uIGFib3ZlIGFscmVhZHkgcmFpc2VzCisgICAgICAgICAgICAjIFR5cGVFcnJvciwgYXMgYSBwcm90ZWN0aW9uIGFnYWluc3QgdGhlIGZhY3QgdGhhdAorICAgICAgICAgICAgIyBpbnN0YW5jZXMgb2YgWCB3b3VsZCBzZWdmYXVsdCBpdC4gIEluIG90aGVyIFB5dGhvbgorICAgICAgICAgICAgIyBpbXBsZW1lbnRhdGlvbnMgaXQgd291bGQgYmUgb2sgdG8gbGV0IHRoZSBjbGFzcyBYCisgICAgICAgICAgICAjIGJlIGNyZWF0ZWQsIGJ1dCBpbnN0ZWFkIGdldCBhIGNsZWFuIFR5cGVFcnJvciBvbiB0aGUKKyAgICAgICAgICAgICMgX19zZXRpdGVtX18gYmVsb3cuCisgICAgICAgICAgICB4ID0gb2JqZWN0Ll9fbmV3X18oWCkKKyAgICAgICAgICAgIHhbNV0gPSA2CisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImRldmlvdXMgbXJvKCkgcmV0dXJuIG5vdCBjYXVnaHQiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgICAgICBjbGFzcyBfX21ldGFjbGFzc19fKHR5cGUpOgorICAgICAgICAgICAgICAgICAgICBkZWYgbXJvKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsxXQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJub24tY2xhc3MgbXJvKCkgcmV0dXJuIG5vdCBjYXVnaHQiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgICAgICBjbGFzcyBfX21ldGFjbGFzc19fKHR5cGUpOgorICAgICAgICAgICAgICAgICAgICBkZWYgbXJvKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm9uLXNlcXVlbmNlIG1ybygpIHJldHVybiBub3QgY2F1Z2h0IikKKworICAgIGRlZiB0ZXN0X292ZXJsb2FkaW5nKHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgb3BlcmF0b3Igb3ZlcmxvYWRpbmcuLi4KKworICAgICAgICBjbGFzcyBCKG9iamVjdCk6CisgICAgICAgICAgICAiSW50ZXJtZWRpYXRlIGNsYXNzIGJlY2F1c2Ugb2JqZWN0IGRvZXNuJ3QgaGF2ZSBhIF9fc2V0YXR0cl9fIgorCisgICAgICAgIGNsYXNzIEMoQik6CisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAiZm9vIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgiZ2V0YXR0ciIsIG5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAiZm9vIjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRhdHRyID0gKG5hbWUsIHZhbHVlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCLl9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKQorICAgICAgICAgICAgZGVmIF9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gImZvbyI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVsYXR0ciA9IG5hbWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQi5fX2RlbGF0dHJfXyhzZWxmLCBuYW1lKQorCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJnZXRpdGVtIiwga2V5KQorICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0aXRlbSA9IChrZXksIHZhbHVlKQorICAgICAgICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgc2VsZi5kZWxpdGVtID0ga2V5CisKKyAgICAgICAgICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgaSwgaik6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiZ2V0c2xpY2UiLCBpLCBqKQorICAgICAgICAgICAgZGVmIF9fc2V0c2xpY2VfXyhzZWxmLCBpLCBqLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRzbGljZSA9IChpLCBqLCB2YWx1ZSkKKyAgICAgICAgICAgIGRlZiBfX2RlbHNsaWNlX18oc2VsZiwgaSwgaik6CisgICAgICAgICAgICAgICAgc2VsZi5kZWxzbGljZSA9IChpLCBqKQorCisgICAgICAgIGEgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmZvbywgKCJnZXRhdHRyIiwgImZvbyIpKQorICAgICAgICBhLmZvbyA9IDEyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5zZXRhdHRyLCAoImZvbyIsIDEyKSkKKyAgICAgICAgZGVsIGEuZm9vCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5kZWxhdHRyLCAiZm9vIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMTJdLCAoImdldGl0ZW0iLCAxMikpCisgICAgICAgIGFbMTJdID0gMjEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnNldGl0ZW0sICgxMiwgMjEpKQorICAgICAgICBkZWwgYVsxMl0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmRlbGl0ZW0sIDEyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVswOjEwXSwgKCJnZXRzbGljZSIsIDAsIDEwKSkKKyAgICAgICAgYVswOjEwXSA9ICJmb28iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5zZXRzbGljZSwgKDAsIDEwLCAiZm9vIikpCisgICAgICAgIGRlbCBhWzA6MTBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5kZWxzbGljZSwgKDAsIDEwKSkKKworICAgIGRlZiB0ZXN0X21ldGhvZHMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBtZXRob2RzLi4uCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLngKKyAgICAgICAgYzEgPSBDKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYzEuZm9vKCksIDEpCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBib28gPSBDLmZvbworICAgICAgICAgICAgZ29vID0gYzEuZm9vCisgICAgICAgIGQyID0gRCgyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLmZvbygpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLmJvbygpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLmdvbygpLCAxKQorICAgICAgICBjbGFzcyBFKG9iamVjdCk6CisgICAgICAgICAgICBmb28gPSBDLmZvbworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUoKS5mb28sIEMuZm9vKSAjIGkuZS4sIHVuYm91bmQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoQy5mb28uX19nZXRfXyhDKDEpKSkuc3RhcnRzd2l0aCgiPGJvdW5kIG1ldGhvZCAiKSkKKworICAgIGRlZiB0ZXN0X3NwZWNpYWxfbWV0aG9kX2xvb2t1cChzZWxmKToKKyAgICAgICAgIyBUaGUgbG9va3VwIG9mIHNwZWNpYWwgbWV0aG9kcyBieXBhc3NlcyBfX2dldGF0dHJfXyBhbmQKKyAgICAgICAgIyBfX2dldGF0dHJpYnV0ZV9fLCBidXQgdGhleSBzdGlsbCBjYW4gYmUgZGVzY3JpcHRvcnMuCisKKyAgICAgICAgZGVmIHJ1bl9jb250ZXh0KG1hbmFnZXIpOgorICAgICAgICAgICAgd2l0aCBtYW5hZ2VyOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIGlkZW4oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBkZWYgaGVsbG8oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gImhlbGxvIgorICAgICAgICBkZWYgZW1wdHlfc2VxKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIGRlZiB6ZXJvKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZGVmIGNvbXBsZXhfbnVtKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIDFqCisgICAgICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICBkZWYgcmV0dXJuX3RydWUoc2VsZiwgdGhpbmc9Tm9uZSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBkZWYgZG9faXNpbnN0YW5jZShvYmopOgorICAgICAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2UoaW50LCBvYmopCisgICAgICAgIGRlZiBkb19pc3N1YmNsYXNzKG9iaik6CisgICAgICAgICAgICByZXR1cm4gaXNzdWJjbGFzcyhpbnQsIG9iaikKKyAgICAgICAgZGVmIHN3YWxsb3coKmFyZ3MpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWYgZG9fZGljdF9taXNzaW5nKGNoZWNrZXIpOgorICAgICAgICAgICAgY2xhc3MgRGljdFN1YihjaGVja2VyLl9fY2xhc3NfXywgZGljdCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEaWN0U3ViKClbImhpIl0sIDQpCisgICAgICAgIGRlZiBzb21lX251bWJlcihzZWxmXywga2V5KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5LCAiaGkiKQorICAgICAgICAgICAgcmV0dXJuIDQKKyAgICAgICAgZGVmIGZvcm1hdF9pbXBsKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgcmV0dXJuICJoZWxsbyIKKworICAgICAgICAjIEl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBldmVyeSBzcGVjaWFsIG1ldGhvZCB0ZXN0ZWQgaGVyZSwgYnV0IEknbQorICAgICAgICAjIG9ubHkgbGlzdGluZyB0aGUgb25lcyBJIGNhbiByZW1lbWJlciBvdXRzaWRlIG9mIHR5cGVvYmplY3QuYywgc2luY2UgaXQKKyAgICAgICAgIyBkb2VzIGl0IHJpZ2h0LgorICAgICAgICBzcGVjaWFscyA9IFsKKyAgICAgICAgICAgICgiX191bmljb2RlX18iLCB1bmljb2RlLCBoZWxsbywgc2V0KCksIHt9KSwKKyAgICAgICAgICAgICgiX19yZXZlcnNlZF9fIiwgcmV2ZXJzZWQsIGVtcHR5X3NlcSwgc2V0KCksIHt9KSwKKyAgICAgICAgICAgICgiX19sZW5ndGhfaGludF9fIiwgbGlzdCwgemVybywgc2V0KCksCisgICAgICAgICAgICAgeyJfX2l0ZXJfXyIgOiBpZGVuLCAibmV4dCIgOiBzdG9wfSksCisgICAgICAgICAgICAoIl9fc2l6ZW9mX18iLCBzeXMuZ2V0c2l6ZW9mLCB6ZXJvLCBzZXQoKSwge30pLAorICAgICAgICAgICAgKCJfX2luc3RhbmNlY2hlY2tfXyIsIGRvX2lzaW5zdGFuY2UsIHJldHVybl90cnVlLCBzZXQoKSwge30pLAorICAgICAgICAgICAgKCJfX21pc3NpbmdfXyIsIGRvX2RpY3RfbWlzc2luZywgc29tZV9udW1iZXIsCisgICAgICAgICAgICAgc2V0KCgiX19jbGFzc19fIiwpKSwge30pLAorICAgICAgICAgICAgKCJfX3N1YmNsYXNzY2hlY2tfXyIsIGRvX2lzc3ViY2xhc3MsIHJldHVybl90cnVlLAorICAgICAgICAgICAgIHNldCgoIl9fYmFzZXNfXyIsKSksIHt9KSwKKyAgICAgICAgICAgICgiX19lbnRlcl9fIiwgcnVuX2NvbnRleHQsIGlkZW4sIHNldCgpLCB7Il9fZXhpdF9fIiA6IHN3YWxsb3d9KSwKKyAgICAgICAgICAgICgiX19leGl0X18iLCBydW5fY29udGV4dCwgc3dhbGxvdywgc2V0KCksIHsiX19lbnRlcl9fIiA6IGlkZW59KSwKKyAgICAgICAgICAgICgiX19jb21wbGV4X18iLCBjb21wbGV4LCBjb21wbGV4X251bSwgc2V0KCksIHt9KSwKKyAgICAgICAgICAgICgiX19mb3JtYXRfXyIsIGZvcm1hdCwgZm9ybWF0X2ltcGwsIHNldCgpLCB7fSksCisgICAgICAgICAgICAoIl9fZGlyX18iLCBkaXIsIGVtcHR5X3NlcSwgc2V0KCksIHt9KSwKKyAgICAgICAgICAgIF0KKworICAgICAgICBjbGFzcyBDaGVja2VyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0ciwgdGVzdD1zZWxmKToKKyAgICAgICAgICAgICAgICB0ZXN0LmZhaWwoIl9fZ2V0YXR0cl9fIGNhbGxlZCB3aXRoIHswfSIuZm9ybWF0KGF0dHIpKQorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgYXR0ciwgdGVzdD1zZWxmKToKKyAgICAgICAgICAgICAgICBpZiBhdHRyIG5vdCBpbiBvazoKKyAgICAgICAgICAgICAgICAgICAgdGVzdC5mYWlsKCJfX2dldGF0dHJpYnV0ZV9fIGNhbGxlZCB3aXRoIHswfSIuZm9ybWF0KGF0dHIpKQorICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBhdHRyKQorICAgICAgICBjbGFzcyBTcGVjaWFsRGVzY3Iob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbXBsKToKKyAgICAgICAgICAgICAgICBzZWxmLmltcGwgPSBpbXBsCisgICAgICAgICAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIG93bmVyKToKKyAgICAgICAgICAgICAgICByZWNvcmQuYXBwZW5kKDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW1wbC5fX2dldF9fKG9iaiwgb3duZXIpCisgICAgICAgIGNsYXNzIE15RXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEVyckRlc2NyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIG93bmVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBNeUV4Y2VwdGlvbgorCisgICAgICAgIGZvciBuYW1lLCBydW5uZXIsIG1ldGhfaW1wbCwgb2ssIGVudiBpbiBzcGVjaWFsczoKKyAgICAgICAgICAgIGNsYXNzIFgoQ2hlY2tlcik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZm9yIGF0dHIsIG9iaiBpbiBlbnYuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgc2V0YXR0cihYLCBhdHRyLCBvYmopCisgICAgICAgICAgICBzZXRhdHRyKFgsIG5hbWUsIG1ldGhfaW1wbCkKKyAgICAgICAgICAgIHJ1bm5lcihYKCkpCisKKyAgICAgICAgICAgIHJlY29yZCA9IFtdCisgICAgICAgICAgICBjbGFzcyBYKENoZWNrZXIpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZvciBhdHRyLCBvYmogaW4gZW52Lml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIHNldGF0dHIoWCwgYXR0ciwgb2JqKQorICAgICAgICAgICAgc2V0YXR0cihYLCBuYW1lLCBTcGVjaWFsRGVzY3IobWV0aF9pbXBsKSkKKyAgICAgICAgICAgIHJ1bm5lcihYKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY29yZCwgWzFdLCBuYW1lKQorCisgICAgICAgICAgICBjbGFzcyBYKENoZWNrZXIpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZvciBhdHRyLCBvYmogaW4gZW52Lml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIHNldGF0dHIoWCwgYXR0ciwgb2JqKQorICAgICAgICAgICAgc2V0YXR0cihYLCBuYW1lLCBFcnJEZXNjcigpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJ1bm5lcihYKCkpCisgICAgICAgICAgICBleGNlcHQgTXlFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInswIXJ9IGRpZG4ndCByYWlzZSIuZm9ybWF0KG5hbWUpKQorCisgICAgZGVmIHRlc3Rfc3BlY2lhbHMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBzcGVjaWFsIG9wZXJhdG9ycy4uLgorICAgICAgICAjIFRlc3Qgb3BlcmF0b3JzIGxpa2UgX19oYXNoX18gZm9yIHdoaWNoIGEgYnVpbHQtaW4gZGVmYXVsdCBleGlzdHMKKworICAgICAgICAjIFRlc3QgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIHN0YXRpYyBjbGFzc2VzCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBpZiAwIDw9IGkgPCAxMDogcmV0dXJuIGkKKyAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCisgICAgICAgIGMxID0gQygpCisgICAgICAgIGMyID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgbm90IGMxKSAjIFdoYXQ/CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoYzEpLCBpZChjMikpCisgICAgICAgIGhhc2goYzEpCisgICAgICAgIGhhc2goYzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGMxLCBjMiksIGNtcChpZChjMSksIGlkKGMyKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYzEsIGMxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYzEgIT0gYzIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYzEgIT0gYzEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYzEgPT0gYzIpCisgICAgICAgICMgTm90ZSB0aGF0IHRoZSBtb2R1bGUgbmFtZSBhcHBlYXJzIGluIHN0ci9yZXByLCBhbmQgdGhhdCB2YXJpZXMKKyAgICAgICAgIyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGlzIHRlc3QgaXMgcnVuIHN0YW5kYWxvbmUgb3IgZnJvbSBhIGZyYW1ld29yay4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihjMSkuZmluZCgnQyBvYmplY3QgYXQgJykgPj0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYzEpLCByZXByKGMxKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigtMSwgYzEpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaSwgYzEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMTAsIGMxKQorICAgICAgICAjIFRlc3QgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGR5bmFtaWMgY2xhc3NlcworICAgICAgICBjbGFzcyBEKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgMCA8PSBpIDwgMTA6IHJldHVybiBpCisgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorICAgICAgICBkMSA9IEQoKQorICAgICAgICBkMiA9IEQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG5vdCBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkMSksIGlkKGQyKSkKKyAgICAgICAgaGFzaChkMSkKKyAgICAgICAgaGFzaChkMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZDEsIGQyKSwgY21wKGlkKGQxKSwgaWQoZDIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZDEsIGQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGQxICE9IGQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGQxID09IGQyKQorICAgICAgICAjIE5vdGUgdGhhdCB0aGUgbW9kdWxlIG5hbWUgYXBwZWFycyBpbiBzdHIvcmVwciwgYW5kIHRoYXQgdmFyaWVzCisgICAgICAgICMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhpcyB0ZXN0IGlzIHJ1biBzdGFuZGFsb25lIG9yIGZyb20gYSBmcmFtZXdvcmsuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIoZDEpLmZpbmQoJ0Qgb2JqZWN0IGF0ICcpID49IDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGQxKSwgcmVwcihkMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oLTEsIGQxKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGksIGQxKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDEwLCBkMSkKKyAgICAgICAgIyBUZXN0IG92ZXJyaWRkZW4gYmVoYXZpb3IgZm9yIHN0YXRpYyBjbGFzc2VzCisgICAgICAgIGNsYXNzIFByb3h5KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBub3Qgbm90IHNlbGYueAorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBoYXNoKHNlbGYueCkKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnggPT0gb3RoZXIKKyAgICAgICAgICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnggIT0gb3RoZXIKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYueCwgb3RoZXIueCkKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiUHJveHk6JXMiICUgc2VsZi54CisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJQcm94eSglcikiICUgc2VsZi54CisgICAgICAgICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgaW4gc2VsZi54CisgICAgICAgIHAwID0gUHJveHkoMCkKKyAgICAgICAgcDEgPSBQcm94eSgxKQorICAgICAgICBwXzEgPSBQcm94eSgtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBub3QgcDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChwMCksIGhhc2goMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDAsIHAwKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHAwLCBwMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwMCAhPSBwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3QgcDAsIHAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChwMCwgcDEpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAocDAsIHAwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAocDAsIHBfMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHAwKSwgIlByb3h5OjAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIocDApLCAiUHJveHkoMCkiKQorICAgICAgICBwMTAgPSBQcm94eShyYW5nZSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oLTEsIHAxMCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihpLCBwMTApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMTAsIHAxMCkKKyAgICAgICAgIyBUZXN0IG92ZXJyaWRkZW4gYmVoYXZpb3IgZm9yIGR5bmFtaWMgY2xhc3NlcworICAgICAgICBjbGFzcyBEUHJveHkob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vdCBub3Qgc2VsZi54CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2goc2VsZi54KQorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYueCA9PSBvdGhlcgorICAgICAgICAgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYueCAhPSBvdGhlcgorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi54LCBvdGhlci54KQorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJEUHJveHk6JXMiICUgc2VsZi54CisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJEUHJveHkoJXIpIiAlIHNlbGYueAorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGluIHNlbGYueAorICAgICAgICBwMCA9IERQcm94eSgwKQorICAgICAgICBwMSA9IERQcm94eSgxKQorICAgICAgICBwXzEgPSBEUHJveHkoLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgbm90IHAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gocDApLCBoYXNoKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAwLCBwMCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwMCwgcDEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobm90IHAwLCBwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3QgcDAsIHAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChwMCwgcDEpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAocDAsIHAwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAocDAsIHBfMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHAwKSwgIkRQcm94eTowIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHAwKSwgIkRQcm94eSgwKSIpCisgICAgICAgIHAxMCA9IERQcm94eShyYW5nZSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oLTEsIHAxMCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihpLCBwMTApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMTAsIHAxMCkKKworICAgICAgICAjIFNhZmV0eSB0ZXN0IGZvciBfX2NtcF9fCisgICAgICAgIGRlZiB1bnNhZmVjbXAoYSwgYik6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihhLCAnX19jbXBfXycpOgorICAgICAgICAgICAgICAgIHJldHVybiAgICMgc29tZSB0eXBlcyBkb24ndCBoYXZlIGEgX19jbXBfXyBhbnkgbW9yZSAoc28gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IGRvZXNuJ3QgbWFrZSBzZW5zZSBhbnkgbW9yZSksIG9yIG1heWJlIHRoZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAjIG5ldmVyIGhhZCBhIF9fY21wX18gYXQgYWxsLCBlLmcuIGluIFB5UHkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhLl9fY2xhc3NfXy5fX2NtcF9fKGEsIGIpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYWxsb3cgJXMuX19jbXBfXyglciwgJXIpIiAlICgKKyAgICAgICAgICAgICAgICAgICAgYS5fX2NsYXNzX18sIGEsIGIpKQorCisgICAgICAgIHVuc2FmZWNtcCh1IjEyMyIsICIxMjMiKQorICAgICAgICB1bnNhZmVjbXAoIjEyMyIsIHUiMTIzIikKKyAgICAgICAgdW5zYWZlY21wKDEsIDEuMCkKKyAgICAgICAgdW5zYWZlY21wKDEuMCwgMSkKKyAgICAgICAgdW5zYWZlY21wKDEsIDFMKQorICAgICAgICB1bnNhZmVjbXAoMUwsIDEpCisKKyAgICBAdGVzdF9zdXBwb3J0LmltcGxfZGV0YWlsKCJjdXN0b20gbG9naWMgZm9yIHByaW50aW5nIHRvIHJlYWwgZmlsZSBvYmplY3RzIikKKyAgICBkZWYgdGVzdF9yZWN1cnNpb25zXzEoc2VsZik6CisgICAgICAgICMgVGVzdGluZyByZWN1cnNpb24gY2hlY2tzIC4uLgorICAgICAgICBjbGFzcyBMZXR0ZXIoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgbGV0dGVyKToKKyAgICAgICAgICAgICAgICBpZiBsZXR0ZXIgPT0gJ0VQUyc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIuX19uZXdfXyhjbHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5fX25ld19fKGNscywgbGV0dGVyKQorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRVBTJworICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICMgc3lzLnN0ZG91dCBuZWVkcyB0byBiZSB0aGUgb3JpZ2luYWwgdG8gdHJpZ2dlciB0aGUgcmVjdXJzaW9uIGJ1ZworICAgICAgICB0ZXN0X3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc3lzLnN0ZG91dCA9IHRlc3Rfc3VwcG9ydC5nZXRfb3JpZ2luYWxfc3Rkb3V0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBub3RoaW5nIHNob3VsZCBhY3R1YWxseSBiZSBwcmludGVkLCB0aGlzIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgICAgICAgIHByaW50IExldHRlcigndycpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGEgUnVudGltZUVycm9yIGZvciBwcmludCByZWN1cnNpb24iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHRlc3Rfc3Rkb3V0CisKKyAgICBkZWYgdGVzdF9yZWN1cnNpb25zXzIoc2VsZik6CisgICAgICAgICMgQnVnICMxMjAyNTMzLgorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIEEuX19tdWxfXyA9IHR5cGVzLk1ldGhvZFR5cGUobGFtYmRhIHNlbGYsIHg6IHNlbGYgKiB4LCBOb25lLCBBKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBBKCkqMgorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBhIFJ1bnRpbWVFcnJvciIpCisKKyAgICBkZWYgdGVzdF93ZWFrcmVmcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHdlYWsgcmVmZXJlbmNlcy4uLgorICAgICAgICBpbXBvcnQgd2Vha3JlZgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgciA9IHdlYWtyZWYucmVmKGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocigpLCBjKQorICAgICAgICBkZWwgYworICAgICAgICB0ZXN0X3N1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocigpLCBOb25lKQorICAgICAgICBkZWwgcgorICAgICAgICBjbGFzcyBOb1dlYWsob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsnZm9vJ10KKyAgICAgICAgbm8gPSBOb1dlYWsoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3ZWFrcmVmLnJlZihubykKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgbXNnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihtc2cpLmZpbmQoIndlYWsgcmVmZXJlbmNlIikgPj0gMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgid2Vha3JlZi5yZWYobm8pIHNob3VsZCBiZSBpbGxlZ2FsIikKKyAgICAgICAgY2xhc3MgV2VhayhvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWydmb28nLCAnX193ZWFrcmVmX18nXQorICAgICAgICB5ZXMgPSBXZWFrKCkKKyAgICAgICAgciA9IHdlYWtyZWYucmVmKHllcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyKCksIHllcykKKyAgICAgICAgZGVsIHllcworICAgICAgICB0ZXN0X3N1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocigpLCBOb25lKQorICAgICAgICBkZWwgcgorCisgICAgZGVmIHRlc3RfcHJvcGVydGllcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHByb3BlcnR5Li4uCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBnZXR4KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9feAorICAgICAgICAgICAgZGVmIHNldHgoc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYuX194ID0gdmFsdWUKKyAgICAgICAgICAgIGRlZiBkZWx4KHNlbGYpOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9feAorICAgICAgICAgICAgeCA9IHByb3BlcnR5KGdldHgsIHNldHgsIGRlbHgsIGRvYz0iSSdtIHRoZSB4IHByb3BlcnR5LiIpCisgICAgICAgIGEgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJ4IikpCisgICAgICAgIGEueCA9IDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fQ19feCwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS54LCA0MikKKyAgICAgICAgZGVsIGEueAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYSwgIngiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJfQ19feCIpKQorICAgICAgICBDLnguX19zZXRfXyhhLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy54Ll9fZ2V0X18oYSksIDEwMCkKKyAgICAgICAgQy54Ll9fZGVsZXRlX18oYSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJ4IikpCisKKyAgICAgICAgcmF3ID0gQy5fX2RpY3RfX1sneCddCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyYXcsIHByb3BlcnR5KQorCisgICAgICAgIGF0dHJzID0gZGlyKHJhdykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiX19kb2NfXyIsIGF0dHJzKQorICAgICAgICBzZWxmLmFzc2VydEluKCJmZ2V0IiwgYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oImZzZXQiLCBhdHRycykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiZmRlbCIsIGF0dHJzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3Ll9fZG9jX18sICJJJ20gdGhlIHggcHJvcGVydHkuIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJhdy5mZ2V0IGlzIEMuX19kaWN0X19bJ2dldHgnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJhdy5mc2V0IGlzIEMuX19kaWN0X19bJ3NldHgnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJhdy5mZGVsIGlzIEMuX19kaWN0X19bJ2RlbHgnXSkKKworICAgICAgICBmb3IgYXR0ciBpbiAiX19kb2NfXyIsICJmZ2V0IiwgImZzZXQiLCAiZmRlbCI6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2V0YXR0cihyYXcsIGF0dHIsIDQyKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIGlmIHN0cihtc2cpLmZpbmQoJ3JlYWRvbmx5JykgPCAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIndoZW4gc2V0dGluZyByZWFkb25seSBhdHRyICVyIG9uIGEgcHJvcGVydHksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ290IHVuZXhwZWN0ZWQgVHlwZUVycm9yIG1zZyAlciIgJSAoYXR0ciwgc3RyKG1zZykpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIFR5cGVFcnJvciBmcm9tIHRyeWluZyB0byBzZXQgcmVhZG9ubHkgJXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF0dHIgb24gYSBwcm9wZXJ0eSIgJSBhdHRyKQorCisgICAgICAgIGNsYXNzIEQob2JqZWN0KToKKyAgICAgICAgICAgIF9fZ2V0aXRlbV9fID0gcHJvcGVydHkobGFtYmRhIHM6IDEvMCkKKworICAgICAgICBkID0gRCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIGQ6CisgICAgICAgICAgICAgICAgc3RyKGkpCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgWmVyb0RpdmlzaW9uRXJyb3IgZnJvbSBiYWQgcHJvcGVydHkiKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RfcHJvcGVydGllc19kb2NfYXR0cmliKHNlbGYpOgorICAgICAgICBjbGFzcyBFKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZ2V0dGVyKHNlbGYpOgorICAgICAgICAgICAgICAgICJnZXR0ZXIgbWV0aG9kIgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBkZWYgc2V0dGVyKHNlbGZfLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgInNldHRlciBtZXRob2QiCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcHJvcCA9IHByb3BlcnR5KGdldHRlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvcC5fX2RvY19fLCAiZ2V0dGVyIG1ldGhvZCIpCisgICAgICAgICAgICBwcm9wMiA9IHByb3BlcnR5KGZzZXQ9c2V0dGVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9wMi5fX2RvY19fLCBOb25lKQorCisgICAgZGVmIHRlc3RfdGVzdGNhcGlfbm9fc2VnZmF1bHQoc2VsZik6CisgICAgICAgICMgdGhpcyBzZWdmYXVsdGVkIGluIDIuNWIyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBfdGVzdGNhcGkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgICAgIHAgPSBwcm9wZXJ0eShfdGVzdGNhcGkudGVzdF93aXRoX2RvY3N0cmluZykKKworICAgIGRlZiB0ZXN0X3Byb3BlcnRpZXNfcGx1cyhzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZm9vID0gcHJvcGVydHkoZG9jPSJoZWxsbyIpCisgICAgICAgICAgICBAZm9vLmdldHRlcgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZm9vCisgICAgICAgICAgICBAZm9vLnNldHRlcgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fZm9vID0gYWJzKHZhbHVlKQorICAgICAgICAgICAgQGZvby5kZWxldGVyCisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9mb28KKyAgICAgICAgYyA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuZm9vLl9fZG9jX18sICJoZWxsbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihjLCAiZm9vIikpCisgICAgICAgIGMuZm9vID0gLTQyCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGMsICdfZm9vJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5fZm9vLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmZvbywgNDIpCisgICAgICAgIGRlbCBjLmZvbworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYywgJ19mb28nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGMsICJmb28iKSkKKworICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgQEMuZm9vLmRlbGV0ZXIKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5fZm9vCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGQgPSBEKCkKKyAgICAgICAgZC5mb28gPSAyNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZm9vLCAyNCkKKyAgICAgICAgZGVsIGQuZm9vCisgICAgICAgIGRlbCBkLmZvbworCisgICAgICAgIGNsYXNzIEUob2JqZWN0KToKKyAgICAgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZm9vCisgICAgICAgICAgICBAZm9vLnNldHRlcgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgICAgICBAZm9vLnNldHRlcgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fZm9vID0gYWJzKHZhbHVlKQorICAgICAgICAgICAgQGZvby5kZWxldGVyCisgICAgICAgICAgICBkZWYgZm9vKHNlbGYsIHZhbHVlPU5vbmUpOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9mb28KKworICAgICAgICBlID0gRSgpCisgICAgICAgIGUuZm9vID0gLTQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5mb28sIDQyKQorICAgICAgICBkZWwgZS5mb28KKworICAgICAgICBjbGFzcyBGKEUpOgorICAgICAgICAgICAgQEUuZm9vLmRlbGV0ZXIKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2ZvbworICAgICAgICAgICAgQGZvby5zZXR0ZXIKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZvbyA9IG1heCgwLCB2YWx1ZSkKKyAgICAgICAgZiA9IEYoKQorICAgICAgICBmLmZvbyA9IC0xMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZm9vLCAwKQorICAgICAgICBkZWwgZi5mb28KKworICAgIGRlZiB0ZXN0X2RpY3RfY29uc3RydWN0b3JzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgZGljdCBjb25zdHJ1Y3RvciAuLi4KKyAgICAgICAgZCA9IGRpY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHt9KQorICAgICAgICBkID0gZGljdCh7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7fSkKKyAgICAgICAgZCA9IGRpY3QoezE6IDIsICdhJzogJ2InfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7MTogMiwgJ2EnOiAnYid9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGRpY3QoZC5pdGVtcygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkaWN0KGQuaXRlcml0ZW1zKCkpKQorICAgICAgICBkID0gZGljdCh7J29uZSc6MSwgJ3R3byc6Mn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZGljdChvbmU9MSwgdHdvPTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGRpY3QoKipkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkaWN0KHsib25lIjogMX0sIHR3bz0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkaWN0KFsoInR3byIsIDIpXSwgb25lPTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGRpY3QoWygib25lIiwgMTAwKSwgKCJ0d28iLCAyMDApXSwgKipkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkaWN0KCoqZCkpCisKKyAgICAgICAgZm9yIGJhZGFyZyBpbiAwLCAwTCwgMGosICIwIiwgWzBdLCAoMCwpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRpY3QoYmFkYXJnKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBpZiBiYWRhcmcgPT0gIjAiOgorICAgICAgICAgICAgICAgICAgICAjIEl0J3MgYSBzZXF1ZW5jZSwgYW5kIGl0cyBlbGVtZW50cyBhcmUgYWxzbyBzZXF1ZW5jZXMgKGdvdHRhCisgICAgICAgICAgICAgICAgICAgICMgbG92ZSBzdHJpbmdzIDx3aW5rPiksIGJ1dCB0aGV5IGFyZW4ndCBvZiBsZW5ndGggMiwgc28gdGhpcworICAgICAgICAgICAgICAgICAgICAjIG9uZSBzZWVtZWQgYmV0dGVyIGFzIGEgVmFsdWVFcnJvciB0aGFuIGEgVHlwZUVycm9yLgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBUeXBlRXJyb3IgZnJvbSBkaWN0KCVyKSIgJSBiYWRhcmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gVHlwZUVycm9yIGZyb20gZGljdCglcikiICUgYmFkYXJnKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRpY3Qoe30sIHt9KQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBUeXBlRXJyb3IgZnJvbSBkaWN0KHt9LCB7fSkiKQorCisgICAgICAgIGNsYXNzIE1hcHBpbmc6CisgICAgICAgICAgICAjIExhY2tzIGEgLmtleXMoKSBtZXRob2Q7IHdpbGwgYmUgYWRkZWQgbGF0ZXIuCisgICAgICAgICAgICBkaWN0ID0gezE6MiwgMzo0LCAnYSc6MWp9CisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGljdChNYXBwaW5nKCkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIFR5cGVFcnJvciBmcm9tIGRpY3QoaW5jb21wbGV0ZSBtYXBwaW5nKSIpCisKKyAgICAgICAgTWFwcGluZy5rZXlzID0gbGFtYmRhIHNlbGY6IHNlbGYuZGljdC5rZXlzKCkKKyAgICAgICAgTWFwcGluZy5fX2dldGl0ZW1fXyA9IGxhbWJkYSBzZWxmLCBpOiBzZWxmLmRpY3RbaV0KKyAgICAgICAgZCA9IGRpY3QoTWFwcGluZygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIE1hcHBpbmcuZGljdCkKKworICAgICAgICAjIEluaXQgZnJvbSBzZXF1ZW5jZSBvZiBpdGVyYWJsZSBvYmplY3RzLCBlYWNoIHByb2R1Y2luZyBhIDItc2VxdWVuY2UuCisgICAgICAgIGNsYXNzIEFkZHJlc3NCb29rRW50cnk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZmlyc3QsIGxhc3QpOgorICAgICAgICAgICAgICAgIHNlbGYuZmlyc3QgPSBmaXJzdAorICAgICAgICAgICAgICAgIHNlbGYubGFzdCA9IGxhc3QKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihbc2VsZi5maXJzdCwgc2VsZi5sYXN0XSkKKworICAgICAgICBkID0gZGljdChbQWRkcmVzc0Jvb2tFbnRyeSgnVGltJywgJ1dhcnNhdycpLAorICAgICAgICAgICAgICAgICAgQWRkcmVzc0Jvb2tFbnRyeSgnQmFycnknLCAnUGV0ZXJzJyksCisgICAgICAgICAgICAgICAgICBBZGRyZXNzQm9va0VudHJ5KCdUaW0nLCAnUGV0ZXJzJyksCisgICAgICAgICAgICAgICAgICBBZGRyZXNzQm9va0VudHJ5KCdCYXJyeScsICdXYXJzYXcnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgeydCYXJyeSc6ICdXYXJzYXcnLCAnVGltJzogJ1BldGVycyd9KQorCisgICAgICAgIGQgPSBkaWN0KHppcChyYW5nZSg0KSwgcmFuZ2UoMSwgNSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGRpY3QoWyhpLCBpKzEpIGZvciBpIGluIHJhbmdlKDQpXSkpCisKKyAgICAgICAgIyBCYWQgc2VxdWVuY2UgbGVuZ3Rocy4KKyAgICAgICAgZm9yIGJhZCBpbiBbKCd0b29zaG9ydCcsKV0sIFsoJ3RvbycsICdsb25nJywgJ2J5IDEnKV06CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGljdChiYWQpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gVmFsdWVFcnJvciBmcm9tIGRpY3QoJXIpIiAlIGJhZCkKKworICAgIGRlZiB0ZXN0X2RpcihzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGRpcigpIC4uLgorICAgICAgICBqdW5rID0gMTIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIoKSwgWydqdW5rJywgJ3NlbGYnXSkKKyAgICAgICAgZGVsIGp1bmsKKworICAgICAgICAjIEp1c3QgbWFrZSBzdXJlIHRoZXNlIGRvbid0IGJsb3cgdXAhCisgICAgICAgIGZvciBhcmcgaW4gMiwgMkwsIDJqLCAyZTAsIFsyXSwgIjIiLCB1IjIiLCAoMiwpLCB7MjoyfSwgdHlwZSwgc2VsZi50ZXN0X2RpcjoKKyAgICAgICAgICAgIGRpcihhcmcpCisKKyAgICAgICAgIyBUcnkgY2xhc3NpYyBjbGFzc2VzLgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgQ2RhdGEgPSAxCisgICAgICAgICAgICBkZWYgQ21ldGhvZChzZWxmKTogcGFzcworCisgICAgICAgIGNzdHVmZiA9IFsnQ2RhdGEnLCAnQ21ldGhvZCcsICdfX2RvY19fJywgJ19fbW9kdWxlX18nXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihDKSwgY3N0dWZmKQorICAgICAgICBzZWxmLmFzc2VydEluKCdpbV9zZWxmJywgZGlyKEMuQ21ldGhvZCkpCisKKyAgICAgICAgYyA9IEMoKSAgIyBjLl9fZG9jX18gaXMgYW4gb2RkIHRoaW5nIHRvIHNlZSBoZXJlOyBkaXR0byBjLl9fbW9kdWxlX18uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKGMpLCBjc3R1ZmYpCisKKyAgICAgICAgYy5jZGF0YSA9IDIKKyAgICAgICAgYy5jbWV0aG9kID0gbGFtYmRhIHNlbGY6IDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIoYyksIGNzdHVmZiArIFsnY2RhdGEnLCAnY21ldGhvZCddKQorICAgICAgICBzZWxmLmFzc2VydEluKCdpbV9zZWxmJywgZGlyKGMuQ21ldGhvZCkpCisKKyAgICAgICAgY2xhc3MgQShDKToKKyAgICAgICAgICAgIEFkYXRhID0gMQorICAgICAgICAgICAgZGVmIEFtZXRob2Qoc2VsZik6IHBhc3MKKworICAgICAgICBhc3R1ZmYgPSBbJ0FkYXRhJywgJ0FtZXRob2QnXSArIGNzdHVmZgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihBKSwgYXN0dWZmKQorICAgICAgICBzZWxmLmFzc2VydEluKCdpbV9zZWxmJywgZGlyKEEuQW1ldGhvZCkpCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIoYSksIGFzdHVmZikKKyAgICAgICAgc2VsZi5hc3NlcnRJbignaW1fc2VsZicsIGRpcihhLkFtZXRob2QpKQorICAgICAgICBhLmFkYXRhID0gNDIKKyAgICAgICAgYS5hbWV0aG9kID0gbGFtYmRhIHNlbGY6IDMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIoYSksIGFzdHVmZiArIFsnYWRhdGEnLCAnYW1ldGhvZCddKQorCisgICAgICAgICMgVGhlIHNhbWUsIGJ1dCB3aXRoIG5ldy1zdHlsZSBjbGFzc2VzLiAgU2luY2UgdGhlc2UgaGF2ZSBvYmplY3QgYXMgYQorICAgICAgICAjIGJhc2UgY2xhc3MsIGEgbG90IG1vcmUgZ2V0cyBzdWNrZWQgaW4uCisgICAgICAgIGRlZiBpbnRlcmVzdGluZyhzdHJpbmdzKToKKyAgICAgICAgICAgIHJldHVybiBbcyBmb3IgcyBpbiBzdHJpbmdzIGlmIG5vdCBzLnN0YXJ0c3dpdGgoJ18nKV0KKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBDZGF0YSA9IDEKKyAgICAgICAgICAgIGRlZiBDbWV0aG9kKHNlbGYpOiBwYXNzCisKKyAgICAgICAgY3N0dWZmID0gWydDZGF0YScsICdDbWV0aG9kJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRlcmVzdGluZyhkaXIoQykpLCBjc3R1ZmYpCisKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyZXN0aW5nKGRpcihjKSksIGNzdHVmZikKKyAgICAgICAgc2VsZi5hc3NlcnRJbignaW1fc2VsZicsIGRpcihDLkNtZXRob2QpKQorCisgICAgICAgIGMuY2RhdGEgPSAyCisgICAgICAgIGMuY21ldGhvZCA9IGxhbWJkYSBzZWxmOiAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJlc3RpbmcoZGlyKGMpKSwgY3N0dWZmICsgWydjZGF0YScsICdjbWV0aG9kJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2ltX3NlbGYnLCBkaXIoYy5DbWV0aG9kKSkKKworICAgICAgICBjbGFzcyBBKEMpOgorICAgICAgICAgICAgQWRhdGEgPSAxCisgICAgICAgICAgICBkZWYgQW1ldGhvZChzZWxmKTogcGFzcworCisgICAgICAgIGFzdHVmZiA9IFsnQWRhdGEnLCAnQW1ldGhvZCddICsgY3N0dWZmCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJlc3RpbmcoZGlyKEEpKSwgYXN0dWZmKQorICAgICAgICBzZWxmLmFzc2VydEluKCdpbV9zZWxmJywgZGlyKEEuQW1ldGhvZCkpCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRlcmVzdGluZyhkaXIoYSkpLCBhc3R1ZmYpCisgICAgICAgIGEuYWRhdGEgPSA0MgorICAgICAgICBhLmFtZXRob2QgPSBsYW1iZGEgc2VsZjogMworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyZXN0aW5nKGRpcihhKSksIGFzdHVmZiArIFsnYWRhdGEnLCAnYW1ldGhvZCddKQorICAgICAgICBzZWxmLmFzc2VydEluKCdpbV9zZWxmJywgZGlyKGEuQW1ldGhvZCkpCisKKyAgICAgICAgIyBUcnkgYSBtb2R1bGUgc3ViY2xhc3MuCisgICAgICAgIGNsYXNzIE0odHlwZShzeXMpKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbWluc3RhbmNlID0gTSgibSIpCisgICAgICAgIG1pbnN0YW5jZS5iID0gMgorICAgICAgICBtaW5zdGFuY2UuYSA9IDEKKyAgICAgICAgbmFtZXMgPSBbeCBmb3IgeCBpbiBkaXIobWluc3RhbmNlKSBpZiB4IG5vdCBpbiBbIl9fbmFtZV9fIiwgIl9fZG9jX18iXV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lcywgWydhJywgJ2InXSkKKworICAgICAgICBjbGFzcyBNMihNKToKKyAgICAgICAgICAgIGRlZiBnZXRkaWN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiTm90IGEgZGljdCEiCisgICAgICAgICAgICBfX2RpY3RfXyA9IHByb3BlcnR5KGdldGRpY3QpCisKKyAgICAgICAgbTJpbnN0YW5jZSA9IE0yKCJtMiIpCisgICAgICAgIG0yaW5zdGFuY2UuYiA9IDIKKyAgICAgICAgbTJpbnN0YW5jZS5hID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0yaW5zdGFuY2UuX19kaWN0X18sICJOb3QgYSBkaWN0ISIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRpcihtMmluc3RhbmNlKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgVHdvIGVzc2VudGlhbGx5IGZlYXR1cmVsZXNzIG9iamVjdHMsIGp1c3QgaW5oZXJpdGluZyBzdHVmZiBmcm9tCisgICAgICAgICMgb2JqZWN0LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihOb3RJbXBsZW1lbnRlZCksIGRpcihFbGxpcHNpcykpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5jaGVja19pbXBsX2RldGFpbCgpOgorICAgICAgICAgICAgIyBOb25lIGRpZmZlcnMgaW4gUHlQeTogaXQgaGFzIGEgX19ub256ZXJvX18KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKE5vbmUpLCBkaXIoRWxsaXBzaXMpKQorCisgICAgICAgICMgTmFzdHkgdGVzdCBjYXNlIGZvciBwcm94aWVkIG9iamVjdHMKKyAgICAgICAgY2xhc3MgV3JhcHBlcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iaik6CisgICAgICAgICAgICAgICAgc2VsZi5fX29iaiA9IG9iagorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiV3JhcHBlciglcykiICUgcmVwcihzZWxmLl9fb2JqKQorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFdyYXBwZXIoc2VsZi5fX29ialtrZXldKQorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9fb2JqKQorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBXcmFwcGVyKGdldGF0dHIoc2VsZi5fX29iaiwgbmFtZSkpCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0Y2xhc3Moc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFdyYXBwZXIodHlwZShzZWxmKSkKKyAgICAgICAgICAgIF9fY2xhc3NfXyA9IHByb3BlcnR5KF9fZ2V0Y2xhc3MpCisKKyAgICAgICAgZGlyKEMoKSkgIyBUaGlzIHVzZWQgdG8gc2VnZmF1bHQKKworICAgIGRlZiB0ZXN0X3N1cGVycyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHN1cGVyLi4uCisKKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgZGVmIG1ldGgoc2VsZiwgYSk6CisgICAgICAgICAgICAgICAgcmV0dXJuICJBKCVyKSIgJSBhCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChBKCkubWV0aCgxKSwgIkEoMSkiKQorCisgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5fX3N1cGVyID0gc3VwZXIoQiwgc2VsZikKKyAgICAgICAgICAgIGRlZiBtZXRoKHNlbGYsIGEpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQiglcikiICUgYSArIHNlbGYuX19zdXBlci5tZXRoKGEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChCKCkubWV0aCgyKSwgIkIoMilBKDIpIikKKworICAgICAgICBjbGFzcyBDKEEpOgorICAgICAgICAgICAgZGVmIG1ldGgoc2VsZiwgYSk6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDKCVyKSIgJSBhICsgc2VsZi5fX3N1cGVyLm1ldGgoYSkKKyAgICAgICAgQy5fQ19fc3VwZXIgPSBzdXBlcihDKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQygpLm1ldGgoMyksICJDKDMpQSgzKSIpCisKKyAgICAgICAgY2xhc3MgRChDLCBCKToKKyAgICAgICAgICAgIGRlZiBtZXRoKHNlbGYsIGEpOgorICAgICAgICAgICAgICAgIHJldHVybiAiRCglcikiICUgYSArIHN1cGVyKEQsIHNlbGYpLm1ldGgoYSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQoKS5tZXRoKDQpLCAiRCg0KUMoNClCKDQpQSg0KSIpCisKKyAgICAgICAgIyBUZXN0IGZvciBzdWJjbGFzc2luZyBzdXBlcgorCisgICAgICAgIGNsYXNzIG15c3VwZXIoc3VwZXIpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIobXlzdXBlciwgc2VsZikuX19pbml0X18oKmFyZ3MpCisKKyAgICAgICAgY2xhc3MgRShEKToKKyAgICAgICAgICAgIGRlZiBtZXRoKHNlbGYsIGEpOgorICAgICAgICAgICAgICAgIHJldHVybiAiRSglcikiICUgYSArIG15c3VwZXIoRSwgc2VsZikubWV0aChhKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRSgpLm1ldGgoNSksICJFKDUpRCg1KUMoNSlCKDUpQSg1KSIpCisKKyAgICAgICAgY2xhc3MgRihFKToKKyAgICAgICAgICAgIGRlZiBtZXRoKHNlbGYsIGEpOgorICAgICAgICAgICAgICAgIHMgPSBzZWxmLl9fc3VwZXIgIyA9PSBteXN1cGVyKEYsIHNlbGYpCisgICAgICAgICAgICAgICAgcmV0dXJuICJGKCVyKVslc10iICUgKGEsIHMuX19jbGFzc19fLl9fbmFtZV9fKSArIHMubWV0aChhKQorICAgICAgICBGLl9GX19zdXBlciA9IG15c3VwZXIoRikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoKS5tZXRoKDYpLCAiRig2KVtteXN1cGVyXUUoNilEKDYpQyg2KUIoNilBKDYpIikKKworICAgICAgICAjIE1ha2Ugc3VyZSBjZXJ0YWluIGVycm9ycyBhcmUgcmFpc2VkCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3VwZXIoRCwgNDIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBhbGxvdyBzdXBlcihELCA0MikiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1cGVyKEQsIEMoKSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGFsbG93IHN1cGVyKEQsIEMoKSkiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1cGVyKEQpLl9fZ2V0X18oMTIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBhbGxvdyBzdXBlcihEKS5fX2dldF9fKDEyKSIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3VwZXIoRCkuX19nZXRfXyhDKCkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBhbGxvdyBzdXBlcihEKS5fX2dldF9fKEMoKSkiKQorCisgICAgICAgICMgTWFrZSBzdXJlIGRhdGEgZGVzY3JpcHRvcnMgY2FuIGJlIG92ZXJyaWRkZW4gYW5kIGFjY2Vzc2VkIHZpYSBzdXBlcgorICAgICAgICAjIChuZXcgZmVhdHVyZSBpbiBQeXRob24gMi4zKQorCisgICAgICAgIGNsYXNzIEREYmFzZShvYmplY3QpOgorICAgICAgICAgICAgZGVmIGdldHgoc2VsZik6IHJldHVybiA0MgorICAgICAgICAgICAgeCA9IHByb3BlcnR5KGdldHgpCisKKyAgICAgICAgY2xhc3MgRERzdWIoRERiYXNlKToKKyAgICAgICAgICAgIGRlZiBnZXR4KHNlbGYpOiByZXR1cm4gImhlbGxvIgorICAgICAgICAgICAgeCA9IHByb3BlcnR5KGdldHgpCisKKyAgICAgICAgZGQgPSBERHN1YigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGQueCwgImhlbGxvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdXBlcihERHN1YiwgZGQpLngsIDQyKQorCisgICAgICAgICMgRW5zdXJlIHRoYXQgc3VwZXIoKSBsb29rdXAgb2YgZGVzY3JpcHRvciBmcm9tIGNsYXNzbWV0aG9kCisgICAgICAgICMgd29ya3MgKFNGIElEIyA3NDM2MjcpCisKKyAgICAgICAgY2xhc3MgQmFzZShvYmplY3QpOgorICAgICAgICAgICAgYVByb3AgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogImZvbyIpCisKKyAgICAgICAgY2xhc3MgU3ViKEJhc2UpOgorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVzdChrbGFzcyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFN1YixrbGFzcykuYVByb3AKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFN1Yi50ZXN0KCksIEJhc2UuYVByb3ApCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBzdXBlcigpIGRvZXNuJ3QgYWxsb3cga2V5d29yZCBhcmdzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1cGVyKEJhc2UsIGt3PTEpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJzdXBlciBzaG91bGRuJ3QgYWNjZXB0IGtleXdvcmQgYXJncyIpCisKKyAgICBkZWYgdGVzdF9iYXNpY19pbmhlcml0YW5jZShzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGluaGVyaXRhbmNlIGZyb20gYmFzaWMgdHlwZXMuLi4KKworICAgICAgICBjbGFzcyBoZXhpbnQoaW50KToKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaGV4KHNlbGYpCisgICAgICAgICAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGhleGludChpbnQuX19hZGRfXyhzZWxmLCBvdGhlcikpCisgICAgICAgICAgICAjIChOb3RlIHRoYXQgb3ZlcnJpZGluZyBfX3JhZGRfXyBkb2Vzbid0IHdvcmssCisgICAgICAgICAgICAjIGJlY2F1c2UgdGhlIGludCB0eXBlIGdldHMgZmlyc3QgZGlicy4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihoZXhpbnQoNykgKyA5KSwgIjB4MTAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoaGV4aW50KDEwMDApICsgNyksICIweDNlZiIpCisgICAgICAgIGEgPSBoZXhpbnQoMTIzNDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgMTIzNDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGEpLCAxMjM0NSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludChhKS5fX2NsYXNzX18gaXMgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYSksIGhhc2goMTIzNDUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCthKS5fX2NsYXNzX18gaXMgaW50KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPj4gMCkuX19jbGFzc19fIGlzIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDw8IDApLl9fY2xhc3NfXyBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoaGV4aW50KDApIDw8IDEyKS5fX2NsYXNzX18gaXMgaW50KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGhleGludCgwKSA+PiAxMikuX19jbGFzc19fIGlzIGludCkKKworICAgICAgICBjbGFzcyBvY3Rsb25nKGxvbmcpOgorICAgICAgICAgICAgX19zbG90c19fID0gW10KKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHMgPSBvY3Qoc2VsZikKKyAgICAgICAgICAgICAgICBpZiBzWy0xXSA9PSAnTCc6CisgICAgICAgICAgICAgICAgICAgIHMgPSBzWzotMV0KKyAgICAgICAgICAgICAgICByZXR1cm4gcworICAgICAgICAgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzdXBlcihvY3Rsb25nLCBzZWxmKS5fX2FkZF9fKG90aGVyKSkKKyAgICAgICAgICAgIF9fcmFkZF9fID0gX19hZGRfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihvY3Rsb25nKDMpICsgNSksICIwMTAiKQorICAgICAgICAjIChOb3RlIHRoYXQgb3ZlcnJpZGluZyBfX3JhZGRfXyBoZXJlIG9ubHkgc2VlbXMgdG8gd29yaworICAgICAgICAjIGJlY2F1c2UgdGhlIGV4YW1wbGUgdXNlcyBhIHNob3J0IGludCBsZWZ0IGFyZ3VtZW50LikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoNSArIG9jdGxvbmcoMzAwMCkpLCAiMDU2NzUiKQorICAgICAgICBhID0gb2N0bG9uZygxMjM0NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCAxMjM0NUwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhhKSwgMTIzNDVMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYSksIGhhc2goMTIzNDVMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvbmcoYSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoK2EpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKC1hKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgtb2N0bG9uZygwKSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PiAwKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDw8IDApLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgLSAwKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICogMSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqKiAxKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIC8vIDEpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKDEgKiBhKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIHwgMCkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSBeIDApLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgJiAtMUwpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKG9jdGxvbmcoMCkgPDwgMTIpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKG9jdGxvbmcoMCkgPj4gMTIpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWJzKG9jdGxvbmcoMCkpLl9fY2xhc3NfXyBpcyBsb25nKQorCisgICAgICAgICMgQmVjYXVzZSBvY3Rsb25nIG92ZXJyaWRlcyBfX2FkZF9fLCB3ZSBjYW4ndCBjaGVjayB0aGUgYWJzZW5jZSBvZiArMAorICAgICAgICAjIG9wdGltaXphdGlvbnMgdXNpbmcgb2N0bG9uZy4KKyAgICAgICAgY2xhc3MgbG9uZ2Nsb25lKGxvbmcpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBhID0gbG9uZ2Nsb25lKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSArIDApLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKDAgKyBhKS5fX2NsYXNzX18gaXMgbG9uZykKKworICAgICAgICAjIENoZWNrIHRoYXQgbmVnYXRpdmUgY2xvbmVzIGRvbid0IHNlZ2ZhdWx0CisgICAgICAgIGEgPSBsb25nY2xvbmUoLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2RpY3RfXywge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhhKSwgLTEpICAjIHNlbGYuYXNzZXJ0VHJ1ZSBQeU51bWJlcl9Mb25nKCkgY29waWVzIHRoZSBzaWduIGJpdAorCisgICAgICAgIGNsYXNzIHByZWNmbG9hdChmbG9hdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbJ3ByZWMnXQorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlPTAuMCwgcHJlYz0xMik6CisgICAgICAgICAgICAgICAgc2VsZi5wcmVjID0gaW50KHByZWMpCisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICIlLipnIiAlIChzZWxmLnByZWMsIHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihwcmVjZmxvYXQoMS4xKSksICIxLjEiKQorICAgICAgICBhID0gcHJlY2Zsb2F0KDEyMzQ1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIDEyMzQ1LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoYSksIDEyMzQ1LjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmbG9hdChhKS5fX2NsYXNzX18gaXMgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChhKSwgaGFzaCgxMjM0NS4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgrYSkuX19jbGFzc19fIGlzIGZsb2F0KQorCisgICAgICAgIGNsYXNzIG1hZGNvbXBsZXgoY29tcGxleCk6CisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICIlLjE3Z2olKy4xN2ciICUgKHNlbGYuaW1hZywgc2VsZi5yZWFsKQorICAgICAgICBhID0gbWFkY29tcGxleCgtMywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEpLCAiNGotMyIpCisgICAgICAgIGJhc2UgPSBjb21wbGV4KC0zLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2UuX19jbGFzc19fLCBjb21wbGV4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxleChhKSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV4KGEpLl9fY2xhc3NfXywgY29tcGxleCkKKyAgICAgICAgYSA9IG1hZGNvbXBsZXgoYSkgICMganVzdCB0cnlpbmcgYW5vdGhlciBmb3JtIG9mIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYSksICI0ai0zIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXgoYSksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxleChhKS5fX2NsYXNzX18sIGNvbXBsZXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChhKSwgaGFzaChiYXNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoK2EpLl9fY2xhc3NfXywgY29tcGxleCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSArIDApLl9fY2xhc3NfXywgY29tcGxleCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICsgMCwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSAtIDApLl9fY2xhc3NfXywgY29tcGxleCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gMCwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSAqIDEpLl9fY2xhc3NfXywgY29tcGxleCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICogMSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSAvIDEpLl9fY2xhc3NfXywgY29tcGxleCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC8gMSwgYmFzZSkKKworICAgICAgICBjbGFzcyBtYWR0dXBsZSh0dXBsZSk6CisgICAgICAgICAgICBfcmV2ID0gTm9uZQorICAgICAgICAgICAgZGVmIHJldihzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9yZXYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZXYKKyAgICAgICAgICAgICAgICBMID0gbGlzdChzZWxmKQorICAgICAgICAgICAgICAgIEwucmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgc2VsZi5fcmV2ID0gc2VsZi5fX2NsYXNzX18oTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmV2CisgICAgICAgIGEgPSBtYWR0dXBsZSgoMSwyLDMsNCw1LDYsNyw4LDksMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgKDEsMiwzLDQsNSw2LDcsOCw5LDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEucmV2KCksIG1hZHR1cGxlKCgwLDksOCw3LDYsNSw0LDMsMiwxKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5yZXYoKS5yZXYoKSwgbWFkdHVwbGUoKDEsMiwzLDQsNSw2LDcsOCw5LDApKSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNTEyKToKKyAgICAgICAgICAgIHQgPSBtYWR0dXBsZShyYW5nZShpKSkKKyAgICAgICAgICAgIHUgPSB0LnJldigpCisgICAgICAgICAgICB2ID0gdS5yZXYoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCB0KQorICAgICAgICBhID0gbWFkdHVwbGUoKDEsMiwzLDQsNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoYSksICgxLDIsMyw0LDUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHVwbGUoYSkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYSksIGhhc2goKDEsMiwzLDQsNSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYVs6XS5fX2NsYXNzX18gaXMgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDEpLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICogMCkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKyAoKSkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBhID0gbWFkdHVwbGUoKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoYSksICgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHVwbGUoYSkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKyBhKS5fX2NsYXNzX18gaXMgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDApLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICogMSkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKiAyKS5fX2NsYXNzX18gaXMgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhWzpdLl9fY2xhc3NfXyBpcyB0dXBsZSkKKworICAgICAgICBjbGFzcyBtYWRzdHJpbmcoc3RyKToKKyAgICAgICAgICAgIF9yZXYgPSBOb25lCisgICAgICAgICAgICBkZWYgcmV2KHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3JldiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JldgorICAgICAgICAgICAgICAgIEwgPSBsaXN0KHNlbGYpCisgICAgICAgICAgICAgICAgTC5yZXZlcnNlKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9yZXYgPSBzZWxmLl9fY2xhc3NfXygiIi5qb2luKEwpKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZXYKKyAgICAgICAgcyA9IG1hZHN0cmluZygiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yZXYoKSwgbWFkc3RyaW5nKCJ6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYSIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmV2KCkucmV2KCksIG1hZHN0cmluZygiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgIHMgPSBtYWRzdHJpbmcoIiIuam9pbihtYXAoY2hyLCByYW5nZShpKSkpKQorICAgICAgICAgICAgdCA9IHMucmV2KCkKKyAgICAgICAgICAgIHUgPSB0LnJldigpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIHMpCisgICAgICAgIHMgPSBtYWRzdHJpbmcoIjEyMzQ1IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIocyksICIxMjM0NSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIocykuX19jbGFzc19fIGlzIHN0cikKKworICAgICAgICBiYXNlID0gIlx4MDAiICogNQorICAgICAgICBzID0gbWFkc3RyaW5nKGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIocyksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIocykuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHMpLCBoYXNoKGJhc2UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHtzOiAxfVtiYXNlXSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7YmFzZTogMX1bc10sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocyArICIiKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMgKyAiIiwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgiIiArIHMpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIiIgKyBzLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKHMgKiAwKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMgKiAwLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChzICogMSkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzICogMSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChzICogMikuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzICogMiwgYmFzZSArIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzWzpdLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1s6XSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNbMDowXS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbMDowXSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0cmlwKCkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN0cmlwKCksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmxzdHJpcCgpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5sc3RyaXAoKSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMucnN0cmlwKCkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJzdHJpcCgpLCBiYXNlKQorICAgICAgICBpZGVudGl0eXRhYiA9ICcnLmpvaW4oW2NocihpKSBmb3IgaSBpbiByYW5nZSgyNTYpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMudHJhbnNsYXRlKGlkZW50aXR5dGFiKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudHJhbnNsYXRlKGlkZW50aXR5dGFiKSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMudHJhbnNsYXRlKGlkZW50aXR5dGFiLCAieCIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy50cmFuc2xhdGUoaWRlbnRpdHl0YWIsICJ4IiksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy50cmFuc2xhdGUoaWRlbnRpdHl0YWIsICJceDAwIiksICIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5yZXBsYWNlKCJ4IiwgIngiKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmVwbGFjZSgieCIsICJ4IiksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmxqdXN0KGxlbihzKSkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmxqdXN0KGxlbihzKSksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnJqdXN0KGxlbihzKSkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJqdXN0KGxlbihzKSksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmNlbnRlcihsZW4ocykpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jZW50ZXIobGVuKHMpKSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMubG93ZXIoKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMubG93ZXIoKSwgYmFzZSkKKworICAgICAgICBjbGFzcyBtYWR1bmljb2RlKHVuaWNvZGUpOgorICAgICAgICAgICAgX3JldiA9IE5vbmUKKyAgICAgICAgICAgIGRlZiByZXYoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fcmV2IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmV2CisgICAgICAgICAgICAgICAgTCA9IGxpc3Qoc2VsZikKKyAgICAgICAgICAgICAgICBMLnJldmVyc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuX3JldiA9IHNlbGYuX19jbGFzc19fKHUiIi5qb2luKEwpKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZXYKKyAgICAgICAgdSA9IG1hZHVuaWNvZGUoIkFCQ0RFRiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgdSJBQkNERUYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUucmV2KCksIG1hZHVuaWNvZGUodSJGRURDQkEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LnJldigpLnJldigpLCBtYWR1bmljb2RlKHUiQUJDREVGIikpCisgICAgICAgIGJhc2UgPSB1IjEyMzQ1IgorICAgICAgICB1ID0gbWFkdW5pY29kZShiYXNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUodSksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bmljb2RlKHUpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godSksIGhhc2goYmFzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe3U6IDF9W2Jhc2VdLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHtiYXNlOiAxfVt1XSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUuc3RyaXAoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LnN0cmlwKCksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LmxzdHJpcCgpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUubHN0cmlwKCksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnJzdHJpcCgpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUucnN0cmlwKCksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnJlcGxhY2UodSJ4IiwgdSJ4IikuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5yZXBsYWNlKHUieCIsIHUieCIpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodS5yZXBsYWNlKHUieHkiLCB1Inh5IikuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5yZXBsYWNlKHUieHkiLCB1Inh5IiksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LmNlbnRlcihsZW4odSkpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuY2VudGVyKGxlbih1KSksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LmxqdXN0KGxlbih1KSkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5sanVzdChsZW4odSkpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodS5yanVzdChsZW4odSkpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUucmp1c3QobGVuKHUpKSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUubG93ZXIoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Lmxvd2VyKCksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnVwcGVyKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS51cHBlcigpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodS5jYXBpdGFsaXplKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5jYXBpdGFsaXplKCksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnRpdGxlKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS50aXRsZSgpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKHUgKyB1IiIpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUgKyB1IiIsIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgodSIiICsgdSkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIiICsgdSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCh1ICogMCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSAqIDAsIHUiIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCh1ICogMSkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSAqIDEsIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgodSAqIDIpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUgKiAyLCBiYXNlICsgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVbOl0uX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVs6XSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVbMDowXS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzA6MF0sIHUiIikKKworICAgICAgICBjbGFzcyBzdWJsaXN0KGxpc3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBhID0gc3VibGlzdChyYW5nZSg1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCByYW5nZSg1KSkKKyAgICAgICAgYS5hcHBlbmQoImhlbGxvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCByYW5nZSg1KSArIFsiaGVsbG8iXSkKKyAgICAgICAgYVs1XSA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCByYW5nZSg2KSkKKyAgICAgICAgYS5leHRlbmQocmFuZ2UoNiwgMjApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHJhbmdlKDIwKSkKKyAgICAgICAgYVstNTpdID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCByYW5nZSgxNSkpCisgICAgICAgIGRlbCBhWzEwOjE1XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgcmFuZ2UoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYSksIHJhbmdlKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzBdLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOV0sIDkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstMTBdLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTFdLCA5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjVdLCByYW5nZSg1KSkKKworICAgICAgICBjbGFzcyBDb3VudGVkSW5wdXQoZmlsZSk6CisgICAgICAgICAgICAiIiJDb3VudHMgbGluZXMgcmVhZCBieSBzZWxmLnJlYWRsaW5lKCkuCisKKyAgICAgICAgICAgIHNlbGYubGluZW5vIGlzIHRoZSAwLWJhc2VkIG9yZGluYWwgb2YgdGhlIGxhc3QgbGluZSByZWFkLCB1cCB0bworICAgICAgICAgICAgYSBtYXhpbXVtIG9mIG9uZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgZmlsZS4KKworICAgICAgICAgICAgc2VsZi5hdGVvZiBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBmaW5hbCAiIiBsaW5lIGhhcyBiZWVuIHJlYWQsCisgICAgICAgICAgICBhdCB3aGljaCBwb2ludCBzZWxmLmxpbmVubyBzdG9wcyBpbmNyZW1lbnRpbmcsIGFuZCBmdXJ0aGVyIGNhbGxzCisgICAgICAgICAgICB0byByZWFkbGluZSgpIGNvbnRpbnVlIHRvIHJldHVybiAiIi4KKyAgICAgICAgICAgICIiIgorCisgICAgICAgICAgICBsaW5lbm8gPSAwCisgICAgICAgICAgICBhdGVvZiA9IDAKKyAgICAgICAgICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmF0ZW9mOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgICAgICAgICBzID0gZmlsZS5yZWFkbGluZShzZWxmKQorICAgICAgICAgICAgICAgICMgTmV4dCBsaW5lIHdvcmtzIHRvby4KKyAgICAgICAgICAgICAgICAjIHMgPSBzdXBlcihDb3VudGVkSW5wdXQsIHNlbGYpLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyArPSAxCisgICAgICAgICAgICAgICAgaWYgcyA9PSAiIjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hdGVvZiA9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gcworCisgICAgICAgIGYgPSBmaWxlKG5hbWU9dGVzdF9zdXBwb3J0LlRFU1RGTiwgbW9kZT0ndycpCisgICAgICAgIGxpbmVzID0gWydhXG4nLCAnYlxuJywgJ2NcbiddCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGVsaW5lcyhsaW5lcykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZiA9IENvdW50ZWRJbnB1dCh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgZm9yIChpLCBleHBlY3RlZCkgaW4gemlwKHJhbmdlKDEsIDUpICsgWzRdLCBsaW5lcyArIDIgKiBbIiJdKToKKyAgICAgICAgICAgICAgICBnb3QgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmxpbmVubywgaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuYXRlb2YsIChpID4gbGVuKGxpbmVzKSkpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9rZXl3b3JkcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGtleXdvcmQgYXJncyB0byBiYXNpYyB0eXBlIGNvbnN0cnVjdG9ycyAuLi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoeD0xKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCh4PTIpLCAyLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyh4PTMpLCAzTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV4KGltYWc9NDIsIHJlYWw9NjY2KSwgY29tcGxleCg2NjYsIDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIob2JqZWN0PTUwMCksICc1MDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoc3RyaW5nPSdhYmMnLCBlcnJvcnM9J3N0cmljdCcpLCB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoc2VxdWVuY2U9cmFuZ2UoMykpLCAoMCwgMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzZXF1ZW5jZT0oMCwgMSwgMikpLCByYW5nZSgzKSkKKyAgICAgICAgIyBub3RlOiBhcyBvZiBQeXRob24gMi4zLCBkaWN0KCkgbm8gbG9uZ2VyIGhhcyBhbiAiaXRlbXMiIGtleXdvcmQgYXJnCisKKyAgICAgICAgZm9yIGNvbnN0cnVjdG9yIGluIChpbnQsIGZsb2F0LCBsb25nLCBjb21wbGV4LCBzdHIsIHVuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGUsIGxpc3QsIGZpbGUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKGJvZ3VzX2tleXdvcmRfYXJnPTEpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBUeXBlRXJyb3IgZnJvbSBib2d1cyBrZXl3b3JkIGFyZ3VtZW50IHRvICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgY29uc3RydWN0b3IpCisKKyAgICBkZWYgdGVzdF9zdHJfc3ViY2xhc3NfYXNfZGljdF9rZXkoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBhIHN0ciBzdWJjbGFzcyB1c2VkIGFzIGRpY3Qga2V5IC4uCisKKyAgICAgICAgY2xhc3MgY2lzdHIoc3RyKToKKyAgICAgICAgICAgICIiIlN1YmxjYXNzIG9mIHN0ciB0aGF0IGNvbXB1dGVzIF9fZXFfXyBjYXNlLWluc2Vuc2l0aXZlbHkuCisKKyAgICAgICAgICAgIEFsc28gY29tcHV0ZXMgYSBoYXNoIGNvZGUgb2YgdGhlIHN0cmluZyBpbiBjYW5vbmljYWwgZm9ybS4KKyAgICAgICAgICAgICIiIgorCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYuY2Fub25pY2FsID0gdmFsdWUubG93ZXIoKQorICAgICAgICAgICAgICAgIHNlbGYuaGFzaGNvZGUgPSBoYXNoKHNlbGYuY2Fub25pY2FsKQorCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgY2lzdHIpOgorICAgICAgICAgICAgICAgICAgICBvdGhlciA9IGNpc3RyKG90aGVyKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNhbm9uaWNhbCA9PSBvdGhlci5jYW5vbmljYWwKKworICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmhhc2hjb2RlCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaXN0cignQUJDJyksICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhQmMnLCBjaXN0cignQUJDJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNpc3RyKCdBQkMnKSksICdBQkMnKQorCisgICAgICAgIGQgPSB7Y2lzdHIoJ29uZScpOiAxLCBjaXN0cigndHdvJyk6IDIsIGNpc3RyKCd0SHJlZScpOiAzfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbY2lzdHIoJ29uZScpXSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkW2Npc3RyKCd0V28nKV0sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFtjaXN0cignVEhyRUUnKV0sIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oY2lzdHIoJ09OZScpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KGNpc3RyKCd0aHJFRScpKSwgMykKKworICAgIGRlZiB0ZXN0X2NsYXNzaWNfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBjbGFzc2ljIGNvbXBhcmlzb25zLi4uCisgICAgICAgIGNsYXNzIGNsYXNzaWM6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZm9yIGJhc2UgaW4gKGNsYXNzaWMsIGludCwgb2JqZWN0KToKKyAgICAgICAgICAgIGNsYXNzIEMoYmFzZSk6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IGludCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIEMpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLnZhbHVlLCBvdGhlci52YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgaW50KSBvciBpc2luc3RhbmNlKG90aGVyLCBsb25nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi52YWx1ZSwgb3RoZXIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisKKyAgICAgICAgICAgIGMxID0gQygxKQorICAgICAgICAgICAgYzIgPSBDKDIpCisgICAgICAgICAgICBjMyA9IEMoMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYzEsIDEpCisgICAgICAgICAgICBjID0gezE6IGMxLCAyOiBjMiwgMzogYzN9CisgICAgICAgICAgICBmb3IgeCBpbiAxLCAyLCAzOgorICAgICAgICAgICAgICAgIGZvciB5IGluIDEsIDIsIDM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbXAoY1t4XSwgY1t5XSkgPT0gY21wKHgsIHkpLCAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCisgICAgICAgICAgICAgICAgICAgIGZvciBvcCBpbiAiPCIsICI8PSIsICI9PSIsICIhPSIsICI+IiwgIj49IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldmFsKCJjW3hdICVzIGNbeV0iICUgb3ApID09IGV2YWwoInggJXMgeSIgJSBvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIng9JWQsIHk9JWQiICUgKHgsIHkpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY21wKGNbeF0sIHkpID09IGNtcCh4LCB5KSwgIng9JWQsIHk9JWQiICUgKHgsIHkpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY21wKHgsIGNbeV0pID09IGNtcCh4LCB5KSwgIng9JWQsIHk9JWQiICUgKHgsIHkpKQorCisgICAgZGVmIHRlc3RfcmljaF9jb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHJpY2ggY29tcGFyaXNvbnMuLi4KKyAgICAgICAgY2xhc3MgWihjb21wbGV4KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgeiA9IFooMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6LCAxKzBqKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDErMGosIHopCisgICAgICAgIGNsYXNzIFpaKGNvbXBsZXgpOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWJzKHNlbGYgLSBvdGhlcikgPD0gMWUtNgorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICB6eiA9IFpaKDEuMDAwMDAwMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6eiwgMSswaikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxKzBqLCB6eikKKworICAgICAgICBjbGFzcyBjbGFzc2ljOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmb3IgYmFzZSBpbiAoY2xhc3NpYywgaW50LCBvYmplY3QsIGxpc3QpOgorICAgICAgICAgICAgY2xhc3MgQyhiYXNlKToKKyAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnZhbHVlID0gaW50KHZhbHVlKQorICAgICAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGZfLCBvdGhlcik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGNhbGwgX19jbXBfXyIpCisgICAgICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKyAgICAgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgQyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA9PSBvdGhlci52YWx1ZQorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBpbnQpIG9yIGlzaW5zdGFuY2Uob3RoZXIsIGxvbmcpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPT0gb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgICAgICAgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIEMpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgIT0gb3RoZXIudmFsdWUKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgaW50KSBvciBpc2luc3RhbmNlKG90aGVyLCBsb25nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlICE9IG90aGVyCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICAgICAgICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBDKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlIDwgb3RoZXIudmFsdWUKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgaW50KSBvciBpc2luc3RhbmNlKG90aGVyLCBsb25nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlIDwgb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgICAgICAgICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIEMpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPD0gb3RoZXIudmFsdWUKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgaW50KSBvciBpc2luc3RhbmNlKG90aGVyLCBsb25nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlIDw9IG90aGVyCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICAgICAgICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBDKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlID4gb3RoZXIudmFsdWUKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgaW50KSBvciBpc2luc3RhbmNlKG90aGVyLCBsb25nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlID4gb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgICAgICAgICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIEMpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPj0gb3RoZXIudmFsdWUKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgaW50KSBvciBpc2luc3RhbmNlKG90aGVyLCBsb25nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlID49IG90aGVyCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICAgICAgYzEgPSBDKDEpCisgICAgICAgICAgICBjMiA9IEMoMikKKyAgICAgICAgICAgIGMzID0gQygzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjMSwgMSkKKyAgICAgICAgICAgIGMgPSB7MTogYzEsIDI6IGMyLCAzOiBjM30KKyAgICAgICAgICAgIGZvciB4IGluIDEsIDIsIDM6CisgICAgICAgICAgICAgICAgZm9yIHkgaW4gMSwgMiwgMzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIG9wIGluICI8IiwgIjw9IiwgIj09IiwgIiE9IiwgIj4iLCAiPj0iOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoImNbeF0gJXMgY1t5XSIgJSBvcCkgPT0gZXZhbCgieCAlcyB5IiAlIG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXZhbCgiY1t4XSAlcyB5IiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldmFsKCJ4ICVzIGNbeV0iICUgb3ApID09IGV2YWwoInggJXMgeSIgJSBvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIng9JWQsIHk9JWQiICUgKHgsIHkpKQorCisgICAgZGVmIHRlc3RfY29lcmNpb25zKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgY29lcmNpb25zLi4uCisgICAgICAgIGNsYXNzIEkoaW50KTogcGFzcworICAgICAgICBjb2VyY2UoSSgwKSwgMCkKKyAgICAgICAgY29lcmNlKDAsIEkoMCkpCisgICAgICAgIGNsYXNzIEwobG9uZyk6IHBhc3MKKyAgICAgICAgY29lcmNlKEwoMCksIDApCisgICAgICAgIGNvZXJjZShMKDApLCAwTCkKKyAgICAgICAgY29lcmNlKDAsIEwoMCkpCisgICAgICAgIGNvZXJjZSgwTCwgTCgwKSkKKyAgICAgICAgY2xhc3MgRihmbG9hdCk6IHBhc3MKKyAgICAgICAgY29lcmNlKEYoMCksIDApCisgICAgICAgIGNvZXJjZShGKDApLCAwTCkKKyAgICAgICAgY29lcmNlKEYoMCksIDAuKQorICAgICAgICBjb2VyY2UoMCwgRigwKSkKKyAgICAgICAgY29lcmNlKDBMLCBGKDApKQorICAgICAgICBjb2VyY2UoMC4sIEYoMCkpCisgICAgICAgIGNsYXNzIEMoY29tcGxleCk6IHBhc3MKKyAgICAgICAgY29lcmNlKEMoMCksIDApCisgICAgICAgIGNvZXJjZShDKDApLCAwTCkKKyAgICAgICAgY29lcmNlKEMoMCksIDAuKQorICAgICAgICBjb2VyY2UoQygwKSwgMGopCisgICAgICAgIGNvZXJjZSgwLCBDKDApKQorICAgICAgICBjb2VyY2UoMEwsIEMoMCkpCisgICAgICAgIGNvZXJjZSgwLiwgQygwKSkKKyAgICAgICAgY29lcmNlKDBqLCBDKDApKQorCisgICAgZGVmIHRlc3RfZGVzY3Jkb2Moc2VsZik6CisgICAgICAgICMgVGVzdGluZyBkZXNjcmlwdG9yIGRvYyBzdHJpbmdzLi4uCisgICAgICAgIGRlZiBjaGVjayhkZXNjciwgd2hhdCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlc2NyLl9fZG9jX18sIHdoYXQpCisgICAgICAgIGNoZWNrKGZpbGUuY2xvc2VkLCAiVHJ1ZSBpZiB0aGUgZmlsZSBpcyBjbG9zZWQiKSAjIGdldHNldCBkZXNjcmlwdG9yCisgICAgICAgIGNoZWNrKGZpbGUubmFtZSwgImZpbGUgbmFtZSIpICMgbWVtYmVyIGRlc2NyaXB0b3IKKworICAgIGRlZiB0ZXN0X2RvY19kZXNjcmlwdG9yKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgX19kb2NfXyBkZXNjcmlwdG9yLi4uCisgICAgICAgICMgU0YgYnVnIDU0Mjk4NAorICAgICAgICBjbGFzcyBEb2NEZXNjcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqZWN0LCBvdHlwZSk6CisgICAgICAgICAgICAgICAgaWYgb2JqZWN0OgorICAgICAgICAgICAgICAgICAgICBvYmplY3QgPSBvYmplY3QuX19jbGFzc19fLl9fbmFtZV9fICsgJyBpbnN0YW5jZScKKyAgICAgICAgICAgICAgICBpZiBvdHlwZToKKyAgICAgICAgICAgICAgICAgICAgb3R5cGUgPSBvdHlwZS5fX25hbWVfXworICAgICAgICAgICAgICAgIHJldHVybiAnb2JqZWN0PSVzOyB0eXBlPSVzJyAlIChvYmplY3QsIG90eXBlKQorICAgICAgICBjbGFzcyBPbGRDbGFzczoKKyAgICAgICAgICAgIF9fZG9jX18gPSBEb2NEZXNjcigpCisgICAgICAgIGNsYXNzIE5ld0NsYXNzKG9iamVjdCk6CisgICAgICAgICAgICBfX2RvY19fID0gRG9jRGVzY3IoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE9sZENsYXNzLl9fZG9jX18sICdvYmplY3Q9Tm9uZTsgdHlwZT1PbGRDbGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoT2xkQ2xhc3MoKS5fX2RvY19fLCAnb2JqZWN0PU9sZENsYXNzIGluc3RhbmNlOyB0eXBlPU9sZENsYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOZXdDbGFzcy5fX2RvY19fLCAnb2JqZWN0PU5vbmU7IHR5cGU9TmV3Q2xhc3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5ld0NsYXNzKCkuX19kb2NfXywgJ29iamVjdD1OZXdDbGFzcyBpbnN0YW5jZTsgdHlwZT1OZXdDbGFzcycpCisKKyAgICBkZWYgdGVzdF9zZXRfY2xhc3Moc2VsZik6CisgICAgICAgICMgVGVzdGluZyBfX2NsYXNzX18gYXNzaWdubWVudC4uLgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgRChvYmplY3QpOiBwYXNzCisgICAgICAgIGNsYXNzIEUob2JqZWN0KTogcGFzcworICAgICAgICBjbGFzcyBGKEQsIEUpOiBwYXNzCisgICAgICAgIGZvciBjbHMgaW4gQywgRCwgRSwgRjoKKyAgICAgICAgICAgIGZvciBjbHMyIGluIEMsIEQsIEUsIEY6CisgICAgICAgICAgICAgICAgeCA9IGNscygpCisgICAgICAgICAgICAgICAgeC5fX2NsYXNzX18gPSBjbHMyCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguX19jbGFzc19fIGlzIGNsczIpCisgICAgICAgICAgICAgICAgeC5fX2NsYXNzX18gPSBjbHMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5fX2NsYXNzX18gaXMgY2xzKQorICAgICAgICBkZWYgY2FudCh4LCBDKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4Ll9fY2xhc3NfXyA9IEMKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBhbGxvdyAlci5fX2NsYXNzX18gPSAlciIgJSAoeCwgQykpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVsYXR0cih4LCAiX19jbGFzc19fIikKKyAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBhbGxvdyBkZWwgJXIuX19jbGFzc19fIiAlIHgpCisgICAgICAgIGNhbnQoQygpLCBsaXN0KQorICAgICAgICBjYW50KGxpc3QoKSwgQykKKyAgICAgICAgY2FudChDKCksIDEpCisgICAgICAgIGNhbnQoQygpLCBvYmplY3QpCisgICAgICAgIGNhbnQob2JqZWN0KCksIGxpc3QpCisgICAgICAgIGNhbnQobGlzdCgpLCBvYmplY3QpCisgICAgICAgIGNsYXNzIEludChpbnQpOiBfX3Nsb3RzX18gPSBbXQorICAgICAgICBjYW50KDIsIEludCkKKyAgICAgICAgY2FudChJbnQoKSwgaW50KQorICAgICAgICBjYW50KFRydWUsIGludCkKKyAgICAgICAgY2FudCgyLCBib29sKQorICAgICAgICBvID0gb2JqZWN0KCkKKyAgICAgICAgY2FudChvLCB0eXBlKDEpKQorICAgICAgICBjYW50KG8sIHR5cGUoTm9uZSkpCisgICAgICAgIGRlbCBvCisgICAgICAgIGNsYXNzIEcob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiYSIsICJiIl0KKyAgICAgICAgY2xhc3MgSChvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWyJiIiwgImEiXQorICAgICAgICB0cnk6CisgICAgICAgICAgICB1bmljb2RlCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBjbGFzcyBJKG9iamVjdCk6CisgICAgICAgICAgICAgICAgX19zbG90c19fID0gWyJhIiwgImIiXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2xhc3MgSShvYmplY3QpOgorICAgICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFt1bmljb2RlKCJhIiksIHVuaWNvZGUoImIiKV0KKyAgICAgICAgY2xhc3MgSihvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWyJjIiwgImIiXQorICAgICAgICBjbGFzcyBLKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbImEiLCAiYiIsICJkIl0KKyAgICAgICAgY2xhc3MgTChIKToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiZSJdCisgICAgICAgIGNsYXNzIE0oSSk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbImUiXQorICAgICAgICBjbGFzcyBOKEopOgorICAgICAgICAgICAgX19zbG90c19fID0gWyJfX3dlYWtyZWZfXyJdCisgICAgICAgIGNsYXNzIFAoSik6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbIl9fZGljdF9fIl0KKyAgICAgICAgY2xhc3MgUShKKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgUihKKToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiX19kaWN0X18iLCAiX193ZWFrcmVmX18iXQorCisgICAgICAgIGZvciBjbHMsIGNsczIgaW4gKChHLCBIKSwgKEcsIEkpLCAoSSwgSCksIChRLCBSKSwgKFIsIFEpKToKKyAgICAgICAgICAgIHggPSBjbHMoKQorICAgICAgICAgICAgeC5hID0gMQorICAgICAgICAgICAgeC5fX2NsYXNzX18gPSBjbHMyCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5fX2NsYXNzX18gaXMgY2xzMiwKKyAgICAgICAgICAgICAgICAgICAiYXNzaWduaW5nICVyIGFzIF9fY2xhc3NfXyBmb3IgJXIgc2lsZW50bHkgZmFpbGVkIiAlIChjbHMyLCB4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5hLCAxKQorICAgICAgICAgICAgeC5fX2NsYXNzX18gPSBjbHMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4Ll9fY2xhc3NfXyBpcyBjbHMsCisgICAgICAgICAgICAgICAgICAgImFzc2lnbmluZyAlciBhcyBfX2NsYXNzX18gZm9yICVyIHNpbGVudGx5IGZhaWxlZCIgJSAoY2xzLCB4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5hLCAxKQorICAgICAgICBmb3IgY2xzIGluIEcsIEosIEssIEwsIE0sIE4sIFAsIFIsIGxpc3QsIEludDoKKyAgICAgICAgICAgIGZvciBjbHMyIGluIEcsIEosIEssIEwsIE0sIE4sIFAsIFIsIGxpc3QsIEludDoKKyAgICAgICAgICAgICAgICBpZiBjbHMgaXMgY2xzMjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBjYW50KGNscygpLCBjbHMyKQorCisgICAgICAgICMgSXNzdWU1MjgzOiB3aGVuIF9fY2xhc3NfXyBjaGFuZ2VzIGluIF9fZGVsX18sIHRoZSB3cm9uZworICAgICAgICAjIHR5cGUgZ2V0cyBERUNSRUYnZC4KKyAgICAgICAgY2xhc3MgTyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXyA9IE8KKyAgICAgICAgbCA9IFtBKCkgZm9yIHggaW4gcmFuZ2UoMTAwKV0KKyAgICAgICAgZGVsIGwKKworICAgIGRlZiB0ZXN0X3NldF9kaWN0KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgX19kaWN0X18gYXNzaWdubWVudC4uLgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6IHBhc3MKKyAgICAgICAgYSA9IEMoKQorICAgICAgICBhLl9fZGljdF9fID0geydiJzogMX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmIsIDEpCisgICAgICAgIGRlZiBjYW50KHgsIGRpY3QpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHguX19kaWN0X18gPSBkaWN0CisgICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYWxsb3cgJXIuX19kaWN0X18gPSAlciIgJSAoeCwgZGljdCkpCisgICAgICAgIGNhbnQoYSwgTm9uZSkKKyAgICAgICAgY2FudChhLCBbXSkKKyAgICAgICAgY2FudChhLCAxKQorICAgICAgICBkZWwgYS5fX2RpY3RfXyAjIERlbGV0aW5nIF9fZGljdF9fIGlzIGFsbG93ZWQKKworICAgICAgICBjbGFzcyBCYXNlKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlZiB2ZXJpZnlfZGljdF9yZWFkb25seSh4KToKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgeCBoYXMgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyBpbmhlcml0aW5nIGZyb20gQmFzZS4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgY2FudCh4LCB7fSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZWwgeC5fX2RpY3RfXworICAgICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGFsbG93IGRlbCAlci5fX2RpY3RfXyIgJSB4KQorICAgICAgICAgICAgZGljdF9kZXNjciA9IEJhc2UuX19kaWN0X19bIl9fZGljdF9fIl0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkaWN0X2Rlc2NyLl9fc2V0X18oeCwge30pCisgICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJkaWN0X2Rlc2NyIGFsbG93ZWQgYWNjZXNzIHRvICVyJ3MgZGljdCIgJSB4KQorCisgICAgICAgICMgQ2xhc3NlcyBkb24ndCBhbGxvdyBfX2RpY3RfXyBhc3NpZ25tZW50IGFuZCBoYXZlIHJlYWRvbmx5IGRpY3RzCisgICAgICAgIGNsYXNzIE1ldGExKHR5cGUsIEJhc2UpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBNZXRhMihCYXNlLCB0eXBlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgRChvYmplY3QpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE1ldGExCisgICAgICAgIGNsYXNzIEUob2JqZWN0KToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhMgorICAgICAgICBmb3IgY2xzIGluIEMsIEQsIEU6CisgICAgICAgICAgICB2ZXJpZnlfZGljdF9yZWFkb25seShjbHMpCisgICAgICAgICAgICBjbGFzc19kaWN0ID0gY2xzLl9fZGljdF9fCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xhc3NfZGljdFsic3BhbSJdID0gImVnZ3MiCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlcidzIF9fZGljdF9fIGNhbiBiZSBtb2RpZmllZCIgJSBjbHMpCisKKyAgICAgICAgIyBNb2R1bGVzIGFsc28gZGlzYWxsb3cgX19kaWN0X18gYXNzaWdubWVudAorICAgICAgICBjbGFzcyBNb2R1bGUxKHR5cGVzLk1vZHVsZVR5cGUsIEJhc2UpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBNb2R1bGUyKEJhc2UsIHR5cGVzLk1vZHVsZVR5cGUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmb3IgTW9kdWxlVHlwZSBpbiBNb2R1bGUxLCBNb2R1bGUyOgorICAgICAgICAgICAgbW9kID0gTW9kdWxlVHlwZSgic3BhbSIpCisgICAgICAgICAgICB2ZXJpZnlfZGljdF9yZWFkb25seShtb2QpCisgICAgICAgICAgICBtb2QuX19kaWN0X19bInNwYW0iXSA9ICJlZ2dzIgorCisgICAgICAgICMgRXhjZXB0aW9uJ3MgX19kaWN0X18gY2FuIGJlIHJlcGxhY2VkLCBidXQgbm90IGRlbGV0ZWQKKyAgICAgICAgIyAoYXQgbGVhc3Qgbm90IGFueSBtb3JlIHRoYW4gcmVndWxhciBleGNlcHRpb24ncyBfX2RpY3RfXyBjYW4KKyAgICAgICAgIyBiZSBkZWxldGVkOyBvbiBDUHl0aG9uIGl0IGlzIG5vdCB0aGUgY2FzZSwgd2hlcmVhcyBvbiBQeVB5IHRoZXkKKyAgICAgICAgIyBjYW4sIGp1c3QgbGlrZSBhbnkgb3RoZXIgbmV3LXN0eWxlIGluc3RhbmNlJ3MgX19kaWN0X18uKQorICAgICAgICBkZWYgY2FuX2RlbGV0ZV9kaWN0KGUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlbCBlLl9fZGljdF9fCisgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBjbGFzcyBFeGNlcHRpb24xKEV4Y2VwdGlvbiwgQmFzZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEV4Y2VwdGlvbjIoQmFzZSwgRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZm9yIEV4Y2VwdGlvblR5cGUgaW4gRXhjZXB0aW9uLCBFeGNlcHRpb24xLCBFeGNlcHRpb24yOgorICAgICAgICAgICAgZSA9IEV4Y2VwdGlvblR5cGUoKQorICAgICAgICAgICAgZS5fX2RpY3RfXyA9IHsiYSI6IDF9CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FuX2RlbGV0ZV9kaWN0KGUpLCBjYW5fZGVsZXRlX2RpY3QoVmFsdWVFcnJvcigpKSkKKworICAgIGRlZiB0ZXN0X3BpY2tsZXMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBwaWNrbGluZyBhbmQgY29weWluZyBuZXctc3R5bGUgY2xhc3NlcyBhbmQgb2JqZWN0cy4uLgorICAgICAgICBpbXBvcnQgcGlja2xlLCBjUGlja2xlCisKKyAgICAgICAgZGVmIHNvcnRlZGl0ZW1zKGQpOgorICAgICAgICAgICAgTCA9IGQuaXRlbXMoKQorICAgICAgICAgICAgTC5zb3J0KCkKKyAgICAgICAgICAgIHJldHVybiBMCisKKyAgICAgICAgZ2xvYmFsIEMKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGEsIGIpOgorICAgICAgICAgICAgICAgIHN1cGVyKEMsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgICAgICAgICBzZWxmLmEgPSBhCisgICAgICAgICAgICAgICAgc2VsZi5iID0gYgorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQyglciwgJXIpIiAlIChzZWxmLmEsIHNlbGYuYikKKworICAgICAgICBnbG9iYWwgQzEKKyAgICAgICAgY2xhc3MgQzEobGlzdCk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIGEsIGIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlcihDMSwgY2xzKS5fX25ld19fKGNscykKKyAgICAgICAgICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYuYSwgc2VsZi5iKQorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGEsIGIpOgorICAgICAgICAgICAgICAgIHNlbGYuYSA9IGEKKyAgICAgICAgICAgICAgICBzZWxmLmIgPSBiCisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDMSglciwgJXIpPCVyPiIgJSAoc2VsZi5hLCBzZWxmLmIsIGxpc3Qoc2VsZikpCisKKyAgICAgICAgZ2xvYmFsIEMyCisgICAgICAgIGNsYXNzIEMyKGludCk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIGEsIGIsIHZhbD0wKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoQzIsIGNscykuX19uZXdfXyhjbHMsIHZhbCkKKyAgICAgICAgICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYuYSwgc2VsZi5iLCBpbnQoc2VsZikpCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYSwgYiwgdmFsPTApOgorICAgICAgICAgICAgICAgIHNlbGYuYSA9IGEKKyAgICAgICAgICAgICAgICBzZWxmLmIgPSBiCisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDMiglciwgJXIpPCVyPiIgJSAoc2VsZi5hLCBzZWxmLmIsIGludChzZWxmKSkKKworICAgICAgICBnbG9iYWwgQzMKKyAgICAgICAgY2xhc3MgQzMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZvbworICAgICAgICAgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisKKyAgICAgICAgZ2xvYmFsIEM0Y2xhc3NpYywgQzQKKyAgICAgICAgY2xhc3MgQzRjbGFzc2ljOiAjIGNsYXNzaWMKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgQzQoQzRjbGFzc2ljLCBvYmplY3QpOiAjIG1peGVkIGluaGVyaXRhbmNlCisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZm9yIHAgaW4gcGlja2xlLCBjUGlja2xlOgorICAgICAgICAgICAgZm9yIGJpbiBpbiAwLCAxOgorICAgICAgICAgICAgICAgIGZvciBjbHMgaW4gQywgQzEsIEMyOgorICAgICAgICAgICAgICAgICAgICBzID0gcC5kdW1wcyhjbHMsIGJpbikKKyAgICAgICAgICAgICAgICAgICAgY2xzMiA9IHAubG9hZHMocykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNsczIgaXMgY2xzKQorCisgICAgICAgICAgICAgICAgYSA9IEMxKDEsIDIpOyBhLmFwcGVuZCg0Mik7IGEuYXBwZW5kKDI0KQorICAgICAgICAgICAgICAgIGIgPSBDMigiaGVsbG8iLCAid29ybGQiLCA0MikKKyAgICAgICAgICAgICAgICBzID0gcC5kdW1wcygoYSwgYiksIGJpbikKKyAgICAgICAgICAgICAgICB4LCB5ID0gcC5sb2FkcyhzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fX2NsYXNzX18sIGEuX19jbGFzc19fKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkaXRlbXMoeC5fX2RpY3RfXyksIHNvcnRlZGl0ZW1zKGEuX19kaWN0X18pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fX2NsYXNzX18sIGIuX19jbGFzc19fKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkaXRlbXMoeS5fX2RpY3RfXyksIHNvcnRlZGl0ZW1zKGIuX19kaWN0X18pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih4KSwgcmVwcihhKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoeSksIHJlcHIoYikpCisgICAgICAgICAgICAgICAgIyBUZXN0IGZvciBfX2dldHN0YXRlX18gYW5kIF9fc2V0c3RhdGVfXyBvbiBuZXcgc3R5bGUgY2xhc3MKKyAgICAgICAgICAgICAgICB1ID0gQzMoNDIpCisgICAgICAgICAgICAgICAgcyA9IHAuZHVtcHModSwgYmluKQorICAgICAgICAgICAgICAgIHYgPSBwLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Ll9fY2xhc3NfXywgdi5fX2NsYXNzX18pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmZvbywgdi5mb28pCisgICAgICAgICAgICAgICAgIyBUZXN0IGZvciBwaWNrbGFiaWxpdHkgb2YgaHlicmlkIGNsYXNzCisgICAgICAgICAgICAgICAgdSA9IEM0KCkKKyAgICAgICAgICAgICAgICB1LmZvbyA9IDQyCisgICAgICAgICAgICAgICAgcyA9IHAuZHVtcHModSwgYmluKQorICAgICAgICAgICAgICAgIHYgPSBwLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Ll9fY2xhc3NfXywgdi5fX2NsYXNzX18pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmZvbywgdi5mb28pCisKKyAgICAgICAgIyBUZXN0aW5nIGNvcHkuZGVlcGNvcHkoKQorICAgICAgICBpbXBvcnQgY29weQorICAgICAgICBmb3IgY2xzIGluIEMsIEMxLCBDMjoKKyAgICAgICAgICAgIGNsczIgPSBjb3B5LmRlZXBjb3B5KGNscykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbHMyIGlzIGNscykKKworICAgICAgICBhID0gQzEoMSwgMik7IGEuYXBwZW5kKDQyKTsgYS5hcHBlbmQoMjQpCisgICAgICAgIGIgPSBDMigiaGVsbG8iLCAid29ybGQiLCA0MikKKyAgICAgICAgeCwgeSA9IGNvcHkuZGVlcGNvcHkoKGEsIGIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX19jbGFzc19fLCBhLl9fY2xhc3NfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWRpdGVtcyh4Ll9fZGljdF9fKSwgc29ydGVkaXRlbXMoYS5fX2RpY3RfXykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fX2NsYXNzX18sIGIuX19jbGFzc19fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZGl0ZW1zKHkuX19kaWN0X18pLCBzb3J0ZWRpdGVtcyhiLl9fZGljdF9fKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHgpLCByZXByKGEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoeSksIHJlcHIoYikpCisKKyAgICBkZWYgdGVzdF9waWNrbGVfc2xvdHMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBwaWNrbGluZyBvZiBjbGFzc2VzIHdpdGggX19zbG90c19fIC4uLgorICAgICAgICBpbXBvcnQgcGlja2xlLCBjUGlja2xlCisgICAgICAgICMgUGlja2xpbmcgb2YgY2xhc3NlcyB3aXRoIF9fc2xvdHNfXyBidXQgd2l0aG91dCBfX2dldHN0YXRlX18gc2hvdWxkIGZhaWwKKyAgICAgICAgZ2xvYmFsIEIsIEMsIEQsIEUKKyAgICAgICAgY2xhc3MgQihvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmb3IgYmFzZSBpbiBbb2JqZWN0LCBCXToKKyAgICAgICAgICAgIGNsYXNzIEMoYmFzZSk6CisgICAgICAgICAgICAgICAgX19zbG90c19fID0gWydhJ10KKyAgICAgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wcyhDKCkpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgZmFpbDogcGlja2xlIEMgaW5zdGFuY2UgLSAlcyIgJSBiYXNlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNQaWNrbGUuZHVtcHMoQygpKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGZhaWw6IGNQaWNrbGUgQyBpbnN0YW5jZSAtICVzIiAlIGJhc2UpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGlja2xlLmR1bXBzKEMoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBmYWlsOiBwaWNrbGUgRCBpbnN0YW5jZSAtICVzIiAlIGJhc2UpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY1BpY2tsZS5kdW1wcyhEKCkpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgZmFpbDogY1BpY2tsZSBEIGluc3RhbmNlIC0gJXMiICUgYmFzZSkKKyAgICAgICAgICAgICMgR2l2ZSBDIGEgbmljZSBnZW5lcmljIF9fZ2V0c3RhdGVfXyBhbmQgX19zZXRzdGF0ZV9fCisgICAgICAgICAgICBjbGFzcyBDKGJhc2UpOgorICAgICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsnYSddCisgICAgICAgICAgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHNlbGYuX19kaWN0X18uY29weSgpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSB7fQorICAgICAgICAgICAgICAgICAgICBmb3IgY2xzIGluIHNlbGYuX19jbGFzc19fLl9fbXJvX186CisgICAgICAgICAgICAgICAgICAgICAgICBmb3Igc24gaW4gY2xzLl9fZGljdF9fLmdldCgnX19zbG90c19fJywgKCkpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFtzbl0gPSBnZXRhdHRyKHNlbGYsIHNuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZAorICAgICAgICAgICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgZCk6CisgICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIGQuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgaywgdikKKyAgICAgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBOb3cgaXQgc2hvdWxkIHdvcmsKKyAgICAgICAgICAgIHggPSBDKCkKKyAgICAgICAgICAgIHkgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNhdHRyKHksICdhJyksIDApCisgICAgICAgICAgICB5ID0gY1BpY2tsZS5sb2FkcyhjUGlja2xlLmR1bXBzKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNhdHRyKHksICdhJyksIDApCisgICAgICAgICAgICB4LmEgPSA0MgorICAgICAgICAgICAgeSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuYSwgNDIpCisgICAgICAgICAgICB5ID0gY1BpY2tsZS5sb2FkcyhjUGlja2xlLmR1bXBzKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmEsIDQyKQorICAgICAgICAgICAgeCA9IEQoKQorICAgICAgICAgICAgeC5hID0gNDIKKyAgICAgICAgICAgIHguYiA9IDEwMAorICAgICAgICAgICAgeSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuYSArIHkuYiwgMTQyKQorICAgICAgICAgICAgeSA9IGNQaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyh4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5hICsgeS5iLCAxNDIpCisgICAgICAgICAgICAjIEEgc3ViY2xhc3MgdGhhdCBhZGRzIGEgc2xvdCBzaG91bGQgYWxzbyB3b3JrCisgICAgICAgICAgICBjbGFzcyBFKEMpOgorICAgICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsnYiddCisgICAgICAgICAgICB4ID0gRSgpCisgICAgICAgICAgICB4LmEgPSA0MgorICAgICAgICAgICAgeC5iID0gImZvbyIKKyAgICAgICAgICAgIHkgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmEsIHguYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5iLCB4LmIpCisgICAgICAgICAgICB5ID0gY1BpY2tsZS5sb2FkcyhjUGlja2xlLmR1bXBzKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmEsIHguYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5iLCB4LmIpCisKKyAgICBkZWYgdGVzdF9iaW5hcnlfb3BlcmF0b3Jfb3ZlcnJpZGUoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBvdmVycmlkZXMgb2YgYmluYXJ5IG9wZXJhdGlvbnMuLi4KKyAgICAgICAgY2xhc3MgSShpbnQpOgorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiSSglcikiICUgaW50KHNlbGYpCisgICAgICAgICAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIEkoaW50KHNlbGYpICsgaW50KG90aGVyKSkKKyAgICAgICAgICAgIF9fcmFkZF9fID0gX19hZGRfXworICAgICAgICAgICAgZGVmIF9fcG93X18oc2VsZiwgb3RoZXIsIG1vZD1Ob25lKToKKyAgICAgICAgICAgICAgICBpZiBtb2QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEkocG93KGludChzZWxmKSwgaW50KG90aGVyKSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEkocG93KGludChzZWxmKSwgaW50KG90aGVyKSwgaW50KG1vZCkpKQorICAgICAgICAgICAgZGVmIF9fcnBvd19fKHNlbGYsIG90aGVyLCBtb2Q9Tm9uZSk6CisgICAgICAgICAgICAgICAgaWYgbW9kIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJKHBvdyhpbnQob3RoZXIpLCBpbnQoc2VsZiksIG1vZCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEkocG93KGludChvdGhlciksIGludChzZWxmKSwgaW50KG1vZCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihJKDEpICsgSSgyKSksICJJKDMpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKEkoMSkgKyAyKSwgIkkoMykiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoMSArIEkoMikpLCAiSSgzKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihJKDIpICoqIEkoMykpLCAiSSg4KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcigyICoqIEkoMykpLCAiSSg4KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihJKDIpICoqIDMpLCAiSSg4KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihwb3coSSgyKSwgSSgzKSwgSSg1KSkpLCAiSSgzKSIpCisgICAgICAgIGNsYXNzIFMoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmxvd2VyKCkgPT0gb3RoZXIubG93ZXIoKQorICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3Byb3BhZ2F0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgcHJvcGFnYXRpb24gb2Ygc2xvdCBmdW5jdGlvbnMgdG8gc3ViY2xhc3Nlcy4uLgorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEMoQSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEQoQiwgQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGQgPSBEKCkKKyAgICAgICAgb3JpZ19oYXNoID0gaGFzaChkKSAjIHJlbGF0ZWQgdG8gaWQoZCkgaW4gcGxhdGZvcm0tZGVwZW5kZW50IHdheXMKKyAgICAgICAgQS5fX2hhc2hfXyA9IGxhbWJkYSBzZWxmOiA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goZCksIDQyKQorICAgICAgICBDLl9faGFzaF9fID0gbGFtYmRhIHNlbGY6IDMxNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goZCksIDMxNCkKKyAgICAgICAgQi5fX2hhc2hfXyA9IGxhbWJkYSBzZWxmOiAxNDQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGQpLCAxNDQpCisgICAgICAgIEQuX19oYXNoX18gPSBsYW1iZGEgc2VsZjogMTAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChkKSwgMTAwKQorICAgICAgICBELl9faGFzaF9fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIGQpCisgICAgICAgIGRlbCBELl9faGFzaF9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChkKSwgMTQ0KQorICAgICAgICBCLl9faGFzaF9fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIGQpCisgICAgICAgIGRlbCBCLl9faGFzaF9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChkKSwgMzE0KQorICAgICAgICBDLl9faGFzaF9fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIGQpCisgICAgICAgIGRlbCBDLl9faGFzaF9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChkKSwgNDIpCisgICAgICAgIEEuX19oYXNoX18gPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgZCkKKyAgICAgICAgZGVsIEEuX19oYXNoX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGQpLCBvcmlnX2hhc2gpCisgICAgICAgIGQuZm9vID0gNDIKKyAgICAgICAgZC5iYXIgPSA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZm9vLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmJhciwgNDIpCisgICAgICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgaWYgbmFtZSA9PSAiZm9vIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gMjQKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKQorICAgICAgICBBLl9fZ2V0YXR0cmlidXRlX18gPSBfX2dldGF0dHJpYnV0ZV9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mb28sIDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYmFyLCA0MikKKyAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgaWYgbmFtZSBpbiAoInNwYW0iLCAiZm9vIiwgImJhciIpOgorICAgICAgICAgICAgICAgIHJldHVybiAiaGVsbG8iCisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgbmFtZQorICAgICAgICBCLl9fZ2V0YXR0cl9fID0gX19nZXRhdHRyX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnNwYW0sICJoZWxsbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mb28sIDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYmFyLCA0MikKKyAgICAgICAgZGVsIEEuX19nZXRhdHRyaWJ1dGVfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZm9vLCA0MikKKyAgICAgICAgZGVsIGQuZm9vCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mb28sICJoZWxsbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5iYXIsIDQyKQorICAgICAgICBkZWwgQi5fX2dldGF0dHJfXworICAgICAgICB0cnk6CisgICAgICAgICAgICBkLmZvbworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImQuZm9vIHNob3VsZCBiZSB1bmRlZmluZWQgbm93IikKKworICAgICAgICAjIFRlc3QgYSBuYXN0eSBidWcgaW4gcmVjdXJzZV9kb3duX3N1YmNsYXNzZXMoKQorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlbCBCCisgICAgICAgIHRlc3Rfc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgQS5fX3NldGl0ZW1fXyA9IGxhbWJkYSAqYTogTm9uZSAjIGNyYXNoCisKKyAgICBkZWYgdGVzdF9idWZmZXJfaW5oZXJpdGFuY2Uoc2VsZik6CisgICAgICAgICMgVGVzdGluZyB0aGF0IGJ1ZmZlciBpbnRlcmZhY2UgaXMgaW5oZXJpdGVkIC4uLgorCisgICAgICAgIGltcG9ydCBiaW5hc2NpaQorICAgICAgICAjIFNGIGJ1ZyBbIzQ3MDA0MF0gUGFyc2VUdXBsZSB0IyB2cyBzdWJjbGFzc2VzLgorCisgICAgICAgIGNsYXNzIE15U3RyKHN0cik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGJhc2UgPSAnYWJjJworICAgICAgICBtID0gTXlTdHIoYmFzZSkKKyAgICAgICAgIyBiMmFfaGV4IHVzZXMgdGhlIGJ1ZmZlciBpbnRlcmZhY2UgdG8gZ2V0IGl0cyBhcmd1bWVudCdzIHZhbHVlLCB2aWEKKyAgICAgICAgIyBQeUFyZ19QYXJzZVR1cGxlICd0IycgY29kZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfaGV4KG0pLCBiaW5hc2NpaS5iMmFfaGV4KGJhc2UpKQorCisgICAgICAgICMgSXQncyBub3QgY2xlYXIgdGhhdCB1bmljb2RlIHdpbGwgY29udGludWUgdG8gc3VwcG9ydCB0aGUgY2hhcmFjdGVyCisgICAgICAgICMgYnVmZmVyIGludGVyZmFjZSwgYW5kIHRoaXMgdGVzdCB3aWxsIGZhaWwgaWYgdGhhdCdzIHRha2VuIGF3YXkuCisgICAgICAgIGNsYXNzIE15VW5pKHVuaWNvZGUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBiYXNlID0gdSdhYmMnCisgICAgICAgIG0gPSBNeVVuaShiYXNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmIyYV9oZXgobSksIGJpbmFzY2lpLmIyYV9oZXgoYmFzZSkpCisKKyAgICAgICAgY2xhc3MgTXlJbnQoaW50KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbSA9IE15SW50KDQyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBiaW5hc2NpaS5iMmFfaGV4KG0pCisgICAgICAgICAgICBzZWxmLmZhaWwoJ3N1YmNsYXNzIG9mIGludCBzaG91bGQgbm90IGhhdmUgYSBidWZmZXIgaW50ZXJmYWNlJykKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3N0cl9vZl9zdHJfc3ViY2xhc3Moc2VsZik6CisgICAgICAgICMgVGVzdGluZyBfX3N0cl9fIGRlZmluZWQgaW4gc3ViY2xhc3Mgb2Ygc3RyIC4uLgorICAgICAgICBpbXBvcnQgYmluYXNjaWkKKyAgICAgICAgaW1wb3J0IGNTdHJpbmdJTworCisgICAgICAgIGNsYXNzIG9jdGV0c3RyaW5nKHN0cik6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gYmluYXNjaWkuYjJhX2hleChzZWxmKQorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmICsgIiByZXByIgorCisgICAgICAgIG8gPSBvY3RldHN0cmluZygnQScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShvKSwgb2N0ZXRzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzdHIobykpLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXByKG8pKSwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yZChvKSwgMHg0MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobyksICc0MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihvKSwgJ0EgcmVwcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5fX3N0cl9fKCksICc0MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5fX3JlcHJfXygpLCAnQSByZXByJykKKworICAgICAgICBjYXB0dXJlID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgIyBDYWxsaW5nIHN0cigpIG9yIG5vdCBleGVyY2lzZXMgZGlmZmVyZW50IGludGVybmFsIHBhdGhzLgorICAgICAgICBwcmludCA+PiBjYXB0dXJlLCBvCisgICAgICAgIHByaW50ID4+IGNhcHR1cmUsIHN0cihvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhcHR1cmUuZ2V0dmFsdWUoKSwgJzQxXG40MVxuJykKKyAgICAgICAgY2FwdHVyZS5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3VtZW50cyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGtleXdvcmQgYXJndW1lbnRzIHRvIF9faW5pdF9fLCBfX2NhbGxfXy4uLgorICAgICAgICBkZWYgZihhKTogcmV0dXJuIGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLl9fY2FsbF9fKGE9NDIpLCA0MikKKyAgICAgICAgYSA9IFtdCisgICAgICAgIGxpc3QuX19pbml0X18oYSwgc2VxdWVuY2U9WzAsIDEsIDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFswLCAxLCAyXSkKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV9jYWxsKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgcmVjdXJzaXZlIF9fY2FsbF9fKCkgYnkgc2V0dGluZyB0byBpbnN0YW5jZSBvZiBjbGFzcy4uLgorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgQS5fX2NhbGxfXyA9IEEoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBBKCkoKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJSZWN1cnNpb24gbGltaXQgc2hvdWxkIGhhdmUgYmVlbiByZWFjaGVkIGZvciBfX2NhbGxfXygpIikKKworICAgIGRlZiB0ZXN0X2RlbGV0ZV9ob29rKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgX19kZWxfXyBob29rLi4uCisgICAgICAgIGxvZyA9IFtdCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGxvZy5hcHBlbmQoMSkKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZywgW10pCisgICAgICAgIGRlbCBjCisgICAgICAgIHRlc3Rfc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2csIFsxXSkKKworICAgICAgICBjbGFzcyBEKG9iamVjdCk6IHBhc3MKKyAgICAgICAgZCA9IEQoKQorICAgICAgICB0cnk6IGRlbCBkWzBdCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCJpbnZhbGlkIGRlbCgpIGRpZG4ndCByYWlzZSBUeXBlRXJyb3IiKQorCisgICAgZGVmIHRlc3RfaGFzaF9pbmhlcml0YW5jZShzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGhhc2ggb2YgbXV0YWJsZSBzdWJjbGFzc2VzLi4uCisKKyAgICAgICAgY2xhc3MgbXlkaWN0KGRpY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkID0gbXlkaWN0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaGFzaChkKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJoYXNoKCkgb2YgZGljdCBzdWJjbGFzcyBzaG91bGQgZmFpbCIpCisKKyAgICAgICAgY2xhc3MgbXlsaXN0KGxpc3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkID0gbXlsaXN0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaGFzaChkKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJoYXNoKCkgb2YgbGlzdCBzdWJjbGFzcyBzaG91bGQgZmFpbCIpCisKKyAgICBkZWYgdGVzdF9zdHJfb3BlcmF0aW9ucyhzZWxmKToKKyAgICAgICAgdHJ5OiAnYScgKyA1CisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCInJyArIDUgZG9lc24ndCByYWlzZSBUeXBlRXJyb3IiKQorCisgICAgICAgIHRyeTogJycuc3BsaXQoJycpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiJycuc3BsaXQoJycpIGRvZXNuJ3QgcmFpc2UgVmFsdWVFcnJvciIpCisKKyAgICAgICAgdHJ5OiAnJy5qb2luKFswXSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIicnLmpvaW4oWzBdKSBkb2Vzbid0IHJhaXNlIFR5cGVFcnJvciIpCisKKyAgICAgICAgdHJ5OiAnJy5yaW5kZXgoJzUnKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIicnLnJpbmRleCgnNScpIGRvZXNuJ3QgcmFpc2UgVmFsdWVFcnJvciIpCisKKyAgICAgICAgdHJ5OiAnJShuKXMnICUgTm9uZQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiJyUobilzJyAlIE5vbmUgZG9lc24ndCByYWlzZSBUeXBlRXJyb3IiKQorCisgICAgICAgIHRyeTogJyUobicgJSB7fQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIiclKG4nICUge30gJycgZG9lc24ndCByYWlzZSBWYWx1ZUVycm9yIikKKworICAgICAgICB0cnk6ICclKnMnICUgKCdhYmMnKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiJyUqcycgJSAoJ2FiYycpIGRvZXNuJ3QgcmFpc2UgVHlwZUVycm9yIikKKworICAgICAgICB0cnk6ICclKi4qcycgJSAoJ2FiYycsIDUpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCInJSouKnMnICUgKCdhYmMnLCA1KSBkb2Vzbid0IHJhaXNlIFR5cGVFcnJvciIpCisKKyAgICAgICAgdHJ5OiAnJXMnICUgKDEsIDIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCInJXMnICUgKDEsIDIpIGRvZXNuJ3QgcmFpc2UgVHlwZUVycm9yIikKKworICAgICAgICB0cnk6ICclJyAlIE5vbmUKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCInJScgJSBOb25lIGRvZXNuJ3QgcmFpc2UgVmFsdWVFcnJvciIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnNTM0MjUzJy5pc2RpZ2l0KCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzUzNDI1M3gnLmlzZGlnaXQoKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJWMnICUgNSwgJ1x4MDUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclYycgJSAnNScsICc1JykKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3JlY3Vyc2l2ZShzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGRlZXBjb3B5IG9mIHJlY3Vyc2l2ZSBvYmplY3RzLi4uCisgICAgICAgIGNsYXNzIE5vZGU6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGEgPSBOb2RlKCkKKyAgICAgICAgYiA9IE5vZGUoKQorICAgICAgICBhLmIgPSBiCisgICAgICAgIGIuYSA9IGEKKyAgICAgICAgeiA9IGRlZXBjb3B5KGEpICMgVGhpcyBibGV3IHVwIGJlZm9yZQorCisgICAgZGVmIHRlc3RfdW5pbnRpYWxpemVkX21vZHVsZXMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyB1bmluaXRpYWxpemVkIG1vZHVsZSBvYmplY3RzLi4uCisgICAgICAgIGZyb20gdHlwZXMgaW1wb3J0IE1vZHVsZVR5cGUgYXMgTQorICAgICAgICBtID0gTS5fX25ld19fKE0pCisgICAgICAgIHN0cihtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2F0dHIobSwgIl9fbmFtZV9fIiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzYXR0cihtLCAiX19maWxlX18iKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNhdHRyKG0sICJmb28iKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtLl9fZGljdF9fKSAgICMgTm9uZSBvciB7fSBhcmUgYm90aCByZWFzb25hYmxlIGFuc3dlcnMKKyAgICAgICAgbS5mb28gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5fX2RpY3RfXywgeyJmb28iOiAxfSkKKworICAgIGRlZiB0ZXN0X2Z1bm55X25ldyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIF9fbmV3X18gcmV0dXJuaW5nIHNvbWV0aGluZyB1bmV4cGVjdGVkLi4uCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgYXJnKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgc3RyKTogcmV0dXJuIFsxLCAyLCAzXQorICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShhcmcsIGludCk6IHJldHVybiBvYmplY3QuX19uZXdfXyhEKQorICAgICAgICAgICAgICAgIGVsc2U6IHJldHVybiBvYmplY3QuX19uZXdfXyhjbHMpCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYXJnKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGFyZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMoIjEiKSwgWzEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQoIjEiKSwgWzEsIDIsIDNdKQorICAgICAgICBkID0gRChOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZm9vLCBOb25lKQorICAgICAgICBkID0gQygxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzaW5zdGFuY2UoZCwgRCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mb28sIDEpCisgICAgICAgIGQgPSBEKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNpbnN0YW5jZShkLCBEKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZvbywgMSkKKworICAgIGRlZiB0ZXN0X2ltdWxfYnVnKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgZm9yIF9faW11bF9fIHByb2JsZW1zLi4uCisgICAgICAgICMgU0YgYnVnIDU0NDY0NworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbXVsX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAoc2VsZiwgb3RoZXIpCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgeSA9IHgKKyAgICAgICAgeSAqPSAxLjAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCAoeCwgMS4wKSkKKyAgICAgICAgeSA9IHgKKyAgICAgICAgeSAqPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgKHgsIDIpKQorICAgICAgICB5ID0geAorICAgICAgICB5ICo9IDNMCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgKHgsIDNMKSkKKyAgICAgICAgeSA9IHgKKyAgICAgICAgeSAqPSAxTDw8MTAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgKHgsIDFMPDwxMDApKQorICAgICAgICB5ID0geAorICAgICAgICB5ICo9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCAoeCwgTm9uZSkpCisgICAgICAgIHkgPSB4CisgICAgICAgIHkgKj0gImZvbyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCAoeCwgImZvbyIpKQorCisgICAgZGVmIHRlc3RfY29weV9zZXRzdGF0ZShzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHRoYXQgY29weS4qY29weSgpIGNvcnJlY3RseSB1c2VzIF9fc2V0c3RhdGVfXy4uLgorICAgICAgICBpbXBvcnQgY29weQorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vPU5vbmUpOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICAgICAgc2VsZi5fX2ZvbyA9IGZvbworICAgICAgICAgICAgZGVmIHNldGZvbyhzZWxmLCBmb289Tm9uZSk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIGRlZiBnZXRmb28oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19mb28KKyAgICAgICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmZvb10KKyAgICAgICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZl8sIGxzdCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obHN0KSwgMSkKKyAgICAgICAgICAgICAgICBzZWxmXy5fX2ZvbyA9IHNlbGZfLmZvbyA9IGxzdFswXQorICAgICAgICBhID0gQyg0MikKKyAgICAgICAgYS5zZXRmb28oMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5mb28sIDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZ2V0Zm9vKCksIDQyKQorICAgICAgICBiID0gY29weS5jb3B5KGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5mb28sIDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ2V0Zm9vKCksIDI0KQorICAgICAgICBiID0gY29weS5kZWVwY29weShhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZm9vLCAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmdldGZvbygpLCAyNCkKKworICAgIGRlZiB0ZXN0X3NsaWNlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGNhc2VzIHdpdGggc2xpY2VzIGFuZCBvdmVycmlkZGVuIF9fZ2V0aXRlbV9fIC4uLgorCisgICAgICAgICMgU3RyaW5ncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJoZWxsbyJbOjRdLCAiaGVsbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImhlbGxvIltzbGljZSg0KV0sICJoZWxsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIuX19nZXRpdGVtX18oImhlbGxvIiwgc2xpY2UoNCkpLCAiaGVsbCIpCisgICAgICAgIGNsYXNzIFMoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyLl9fZ2V0aXRlbV9fKHNlbGYsIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUygiaGVsbG8iKVs6NF0sICJoZWxsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTKCJoZWxsbyIpW3NsaWNlKDQpXSwgImhlbGwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFMoImhlbGxvIikuX19nZXRpdGVtX18oc2xpY2UoNCkpLCAiaGVsbCIpCisgICAgICAgICMgVHVwbGVzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEsMiwzKVs6Ml0sICgxLDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxLDIsMylbc2xpY2UoMildLCAoMSwyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZS5fX2dldGl0ZW1fXygoMSwyLDMpLCBzbGljZSgyKSksICgxLDIpKQorICAgICAgICBjbGFzcyBUKHR1cGxlKToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICByZXR1cm4gdHVwbGUuX19nZXRpdGVtX18oc2VsZiwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUKCgxLDIsMykpWzoyXSwgKDEsMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVCgoMSwyLDMpKVtzbGljZSgyKV0sICgxLDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFQoKDEsMiwzKSkuX19nZXRpdGVtX18oc2xpY2UoMikpLCAoMSwyKSkKKyAgICAgICAgIyBMaXN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsxLDIsM11bOjJdLCBbMSwyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbMSwyLDNdW3NsaWNlKDIpXSwgWzEsMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdC5fX2dldGl0ZW1fXyhbMSwyLDNdLCBzbGljZSgyKSksIFsxLDJdKQorICAgICAgICBjbGFzcyBMKGxpc3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHJldHVybiBsaXN0Ll9fZ2V0aXRlbV9fKHNlbGYsIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTChbMSwyLDNdKVs6Ml0sIFsxLDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwoWzEsMiwzXSlbc2xpY2UoMildLCBbMSwyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMKFsxLDIsM10pLl9fZ2V0aXRlbV9fKHNsaWNlKDIpKSwgWzEsMl0pCisgICAgICAgICMgTm93IGRvIGxpc3RzIGFuZCBfX3NldGl0ZW1fXworICAgICAgICBhID0gTChbMSwyLDNdKQorICAgICAgICBhW3NsaWNlKDEsIDMpXSA9IFszLDJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgWzEsMywyXSkKKyAgICAgICAgYVtzbGljZSgwLCAyLCAxKV0gPSBbMywxXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFszLDEsMl0pCisgICAgICAgIGEuX19zZXRpdGVtX18oc2xpY2UoMSwgMyksIFsyLDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFszLDIsMV0pCisgICAgICAgIGEuX19zZXRpdGVtX18oc2xpY2UoMCwgMiwgMSksIFsyLDNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFsyLDMsMV0pCisKKyAgICBkZWYgdGVzdF9zdWJ0eXBlX3Jlc3VycmVjdGlvbihzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHJlc3VycmVjdGlvbiBvZiBuZXctc3R5bGUgaW5zdGFuY2UuLi4KKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBjb250YWluZXIgPSBbXQorCisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAjIHJlc3VycmVjdCB0aGUgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICBDLmNvbnRhaW5lci5hcHBlbmQoc2VsZikKKworICAgICAgICBjID0gQygpCisgICAgICAgIGMuYXR0ciA9IDQyCisKKyAgICAgICAgIyBUaGUgbW9zdCBpbnRlcmVzdGluZyB0aGluZyBoZXJlIGlzIHdoZXRoZXIgdGhpcyBibG93cyB1cCwgZHVlIHRvCisgICAgICAgICMgZmxhd2VkIEdDIHRyYWNraW5nIGxvZ2ljIGluIHR5cGVvYmplY3QuYydzIGNhbGxfZmluYWxpemVyKCkgKGEgMi4yLjEKKyAgICAgICAgIyBidWcpLgorICAgICAgICBkZWwgYworCisgICAgICAgICMgSWYgdGhhdCBkaWRuJ3QgYmxvdyB1cCwgaXQncyBhbHNvIGludGVyZXN0aW5nIHRvIHNlZSB3aGV0aGVyIGNsZWFyaW5nCisgICAgICAgICMgdGhlIGxhc3QgY29udGFpbmVyIHNsb3Qgd29ya3M6IHRoYXQgd2lsbCBhdHRlbXB0IHRvIGRlbGV0ZSBjIGFnYWluLAorICAgICAgICAjIHdoaWNoIHdpbGwgY2F1c2UgYyB0byBnZXQgYXBwZW5kZWQgYmFjayB0byB0aGUgY29udGFpbmVyIGFnYWluCisgICAgICAgICMgImR1cmluZyIgdGhlIGRlbC4gIChPbiBub24tQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbnMsIGhvd2V2ZXIsIF9fZGVsX18KKyAgICAgICAgIyBpcyB0eXBpY2FsbHkgbm90IGNhbGxlZCBhZ2Fpbi4pCisgICAgICAgIHRlc3Rfc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oQy5jb250YWluZXIpLCAxKQorICAgICAgICBkZWwgQy5jb250YWluZXJbLTFdCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5jaGVja19pbXBsX2RldGFpbCgpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oQy5jb250YWluZXIpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmNvbnRhaW5lclstMV0uYXR0ciwgNDIpCisKKyAgICAgICAgIyBNYWtlIGMgbW9ydGFsIGFnYWluLCBzbyB0aGF0IHRoZSB0ZXN0IGZyYW1ld29yayB3aXRoIC1sIGRvZXNuJ3QgcmVwb3J0CisgICAgICAgICMgaXQgYXMgYSBsZWFrLgorICAgICAgICBkZWwgQy5fX2RlbF9fCisKKyAgICBkZWYgdGVzdF9zbG90c190cmFzaChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHNsb3QgdHJhc2guLi4KKyAgICAgICAgIyBEZWFsbG9jYXRpbmcgZGVlcGx5IG5lc3RlZCBzbG90dGVkIHRyYXNoIGNhdXNlZCBzdGFjayBvdmVyZmxvd3MKKyAgICAgICAgY2xhc3MgdHJhc2gob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsneCddCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICBvID0gTm9uZQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNTAwMDApOgorICAgICAgICAgICAgbyA9IHRyYXNoKG8pCisgICAgICAgIGRlbCBvCisKKyAgICBkZWYgdGVzdF9zbG90c19tdWx0aXBsZV9pbmhlcml0YW5jZShzZWxmKToKKyAgICAgICAgIyBTRiBidWcgNTc1MjI5LCBtdWx0aXBsZSBpbmhlcml0YW5jZSB3LyBzbG90cyBkdW1wcyBjb3JlCisgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXz0oKQorICAgICAgICBjbGFzcyBCKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEMoQSxCKSA6CisgICAgICAgICAgICBfX3Nsb3RzX189KCkKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LmNoZWNrX2ltcGxfZGV0YWlsKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuX19iYXNpY3NpemVfXywgQi5fX2Jhc2ljc2l6ZV9fKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihDLCAnX19kaWN0X18nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoQywgJ19fd2Vha3JlZl9fJykpCisgICAgICAgIEMoKS54ID0gMgorCisgICAgZGVmIHRlc3Rfcm11bChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGNvcnJlY3QgaW52b2NhdGlvbiBvZiBfX3JtdWxfXy4uLgorICAgICAgICAjIFNGIHBhdGNoIDU5MjY0NgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19tdWxfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJtdWwiCisgICAgICAgICAgICBkZWYgX19ybXVsX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAicm11bCIKKyAgICAgICAgYSA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEqMiwgIm11bCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSoyLjIsICJtdWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIqYSwgInJtdWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIuMiphLCAicm11bCIpCisKKyAgICBkZWYgdGVzdF9pcG93KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgY29ycmVjdCBpbnZvY2F0aW9uIG9mIF9faXBvd19fLi4uCisgICAgICAgICMgW1NGIGJ1ZyA2MjAxNzldCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2lwb3dfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBhID0gQygpCisgICAgICAgIGEgKio9IDIKKworICAgIGRlZiB0ZXN0X211dGFibGVfYmFzZXMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBtdXRhYmxlIGJhc2VzLi4uCisKKyAgICAgICAgIyBzdHVmZiB0aGF0IHNob3VsZCB3b3JrOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEMyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgICAgICAgICBpZiBhdHRyID09ICdhJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoQzIsIHNlbGYpLl9fZ2V0YXR0cmlidXRlX18oYXR0cikKKyAgICAgICAgICAgIGRlZiBtZXRoKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEUoRCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGQgPSBEKCkKKyAgICAgICAgZSA9IEUoKQorICAgICAgICBELl9fYmFzZXNfXyA9IChDLCkKKyAgICAgICAgRC5fX2Jhc2VzX18gPSAoQzIsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQubWV0aCgpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUubWV0aCgpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQzIuX19zdWJjbGFzc2VzX18oKSwgW0RdKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBELl9fYmFzZXNfXworICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYmUgYWJsZSB0byBkZWxldGUgLl9fYmFzZXNfXyIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgRC5fX2Jhc2VzX18gPSAoKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBtc2c6CisgICAgICAgICAgICBpZiBzdHIobXNnKSA9PSAiYSBuZXctc3R5bGUgY2xhc3MgY2FuJ3QgaGF2ZSBvbmx5IGNsYXNzaWMgYmFzZXMiOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXJyb3IgbWVzc2FnZSBmb3IgLl9fYmFzZXNfXyA9ICgpIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGJlIGFibGUgdG8gc2V0IC5fX2Jhc2VzX18gdG8gKCkiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEQuX19iYXNlc19fID0gKEQsKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBhY3R1YWxseSwgd2UnbGwgaGF2ZSBjcmFzaGVkIGJ5IGhlcmUuLi4KKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGJlIGFibGUgdG8gY3JlYXRlIGluaGVyaXRhbmNlIGN5Y2xlcyIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgRC5fX2Jhc2VzX18gPSAoQywgQykKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGlkbid0IGRldGVjdCByZXBlYXRlZCBiYXNlIGNsYXNzZXMiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEQuX19iYXNlc19fID0gKEUsKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYmUgYWJsZSB0byBjcmVhdGUgaW5oZXJpdGFuY2UgY3ljbGVzIikKKworICAgICAgICAjIGxldCdzIHRocm93IGEgY2xhc3NpYyBjbGFzcyBpbnRvIHRoZSBtaXg6CisgICAgICAgIGNsYXNzIENsYXNzaWM6CisgICAgICAgICAgICBkZWYgbWV0aDIoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDMKKworICAgICAgICBELl9fYmFzZXNfXyA9IChDLCBDbGFzc2ljKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5tZXRoMigpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUubWV0aDIoKSwgMykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZC5hCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiYXR0cmlidXRlIHNob3VsZCBoYXZlIHZhbmlzaGVkIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBELl9fYmFzZXNfXyA9IChDbGFzc2ljLCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibmV3LXN0eWxlIGNsYXNzIG11c3QgaGF2ZSBhIG5ldy1zdHlsZSBiYXNlIikKKworICAgIGRlZiB0ZXN0X2J1aWx0aW5fYmFzZXMoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGFsbCB0aGUgYnVpbHRpbiB0eXBlcyBjYW4gaGF2ZSB0aGVpciBiYXNlIHF1ZXJpZWQgd2l0aG91dAorICAgICAgICAjIHNlZ2ZhdWx0aW5nLiBTZWUgaXNzdWUgIzU3ODcuCisgICAgICAgIGJ1aWx0aW5fdHlwZXMgPSBbdHAgZm9yIHRwIGluIF9fYnVpbHRpbl9fLl9fZGljdF9fLml0ZXJ2YWx1ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodHAsIHR5cGUpXQorICAgICAgICBmb3IgdHAgaW4gYnVpbHRpbl90eXBlczoKKyAgICAgICAgICAgIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHRwLCAiX19iYXNlc19fIikKKyAgICAgICAgICAgIGlmIHRwIGlzIG5vdCBvYmplY3Q6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odHAuX19iYXNlc19fKSwgMSwgdHApCisKKyAgICAgICAgY2xhc3MgTChsaXN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBMLl9fYmFzZXNfXyA9IChkaWN0LCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IHR1cm4gbGlzdCBzdWJjbGFzcyBpbnRvIGRpY3Qgc3ViY2xhc3MiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpc3QuX19iYXNlc19fID0gKGRpY3QsKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYmUgYWJsZSB0byBhc3NpZ24gdG8gbGlzdC5fX2Jhc2VzX18iKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEQuX19iYXNlc19fID0gKEMsIGxpc3QpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnQgMCwgImJlc3RfYmFzZSBjYWxjdWxhdGlvbiBmb3VuZCB3YW50aW5nIgorCisKKyAgICBkZWYgdGVzdF9tdXRhYmxlX2Jhc2VzX3dpdGhfZmFpbGluZ19tcm8oc2VsZik6CisgICAgICAgICMgVGVzdGluZyBtdXRhYmxlIGJhc2VzIHdpdGggZmFpbGluZyBtcm8uLi4KKyAgICAgICAgY2xhc3MgV29ya09uY2UodHlwZSk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhzZWxmLCBuYW1lLCBiYXNlcywgbnMpOgorICAgICAgICAgICAgICAgIHNlbGYuZmxhZyA9IDAKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoV29ya09uY2UsIHNlbGYpLl9fbmV3X18oV29ya09uY2UsIG5hbWUsIGJhc2VzLCBucykKKyAgICAgICAgICAgIGRlZiBtcm8oc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5mbGFnID4gMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiYm96byIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZsYWcgKz0gMQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5tcm8oc2VsZikKKworICAgICAgICBjbGFzcyBXb3JrQWx3YXlzKHR5cGUpOgorICAgICAgICAgICAgZGVmIG1ybyhzZWxmKToKKyAgICAgICAgICAgICAgICAjIHRoaXMgaXMgaGVyZSB0byBtYWtlIHN1cmUgdGhhdCAubXJvKClzIGFyZW4ndCBjYWxsZWQKKyAgICAgICAgICAgICAgICAjIHdpdGggYW4gZXhjZXB0aW9uIHNldCAod2hpY2ggd2FzIHBvc3NpYmxlIGF0IG9uZSBwb2ludCkuCisgICAgICAgICAgICAgICAgIyBBbiBlcnJvciBtZXNzYWdlIHdpbGwgYmUgcHJpbnRlZCBpbiBhIGRlYnVnIGJ1aWxkLgorICAgICAgICAgICAgICAgICMgV2hhdCdzIGEgZ29vZCB3YXkgdG8gdGVzdCBmb3IgdGhpcz8KKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5tcm8oc2VsZikKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgQzIob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEUoRCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgRihEKToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBXb3JrT25jZQorCisgICAgICAgIGNsYXNzIEcoRCk6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gV29ya0Fsd2F5cworCisgICAgICAgICMgSW1tZWRpYXRlIHN1YmNsYXNzZXMgaGF2ZSB0aGVpciBtcm8ncyBhZGp1c3RlZCBpbiBhbHBoYWJldGljYWwKKyAgICAgICAgIyBvcmRlciwgc28gRSdzIHdpbGwgZ2V0IGFkanVzdGVkIGJlZm9yZSBhZGp1c3RpbmcgRidzIGZhaWxzLiAgV2UKKyAgICAgICAgIyBjaGVjayBoZXJlIHRoYXQgRSdzIGdldHMgcmVzdG9yZWQuCisKKyAgICAgICAgRV9tcm9fYmVmb3JlID0gRS5fX21yb19fCisgICAgICAgIERfbXJvX2JlZm9yZSA9IEQuX19tcm9fXworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEQuX19iYXNlc19fID0gKEMyLCkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRS5fX21yb19fLCBFX21yb19iZWZvcmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuX19tcm9fXywgRF9tcm9fYmVmb3JlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleGNlcHRpb24gbm90IHByb3BhZ2F0ZWQiKQorCisgICAgZGVmIHRlc3RfbXV0YWJsZV9iYXNlc19jYXRjaF9tcm9fY29uZmxpY3Qoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBtdXRhYmxlIGJhc2VzIGNhdGNoIG1ybyBjb25mbGljdC4uLgorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgQihvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEMoQSwgQik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgRChBLCBCKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBFKEMsIEQpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEMuX19iYXNlc19fID0gKEIsIEEpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImRpZG4ndCBjYXRjaCBNUk8gY29uZmxpY3QiKQorCisgICAgZGVmIHRlc3RfbXV0YWJsZV9uYW1lcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIG11dGFibGUgbmFtZXMuLi4KKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgQy5fX21vZHVsZV9fIGNvdWxkIGJlICd0ZXN0X2Rlc2NyJyBvciAnX19tYWluX18nCisgICAgICAgIG1vZCA9IEMuX19tb2R1bGVfXworCisgICAgICAgIEMuX19uYW1lX18gPSAnRCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoQy5fX21vZHVsZV9fLCBDLl9fbmFtZV9fKSwgKG1vZCwgJ0QnKSkKKworICAgICAgICBDLl9fbmFtZV9fID0gJ0QuRScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoQy5fX21vZHVsZV9fLCBDLl9fbmFtZV9fKSwgKG1vZCwgJ0QuRScpKQorCisgICAgZGVmIHRlc3RfZXZpbF90eXBlX25hbWUoc2VsZik6CisgICAgICAgICMgQSBiYWRseSBwbGFjZWQgUHlfREVDUkVGIGluIHR5cGVfc2V0X25hbWUgbGVkIHRvIGFyYml0cmFyeSBjb2RlCisgICAgICAgICMgZXhlY3V0aW9uIHdoaWxlIHRoZSB0eXBlIHN0cnVjdHVyZSB3YXMgbm90IGluIGEgc2FuZSBzdGF0ZSwgYW5kIGEKKyAgICAgICAgIyBwb3NzaWJsZSBzZWdtZW50YXRpb24gZmF1bHQgYXMgYSByZXN1bHQuICBTZWUgYnVnICMxNjQ0Ny4KKyAgICAgICAgY2xhc3MgTmFzdHkoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIEMuX19uYW1lX18gPSAib3RoZXIiCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIEMuX19uYW1lX18gPSBOYXN0eSgiYWJjIikKKyAgICAgICAgQy5fX25hbWVfXyA9ICJub3JtYWwiCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc19yaWdodF9vcChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGNvcnJlY3QgZGlzcGF0Y2ggb2Ygc3ViY2xhc3Mgb3ZlcmxvYWRpbmcgX19yPG9wPl9fLi4uCisKKyAgICAgICAgIyBUaGlzIGNvZGUgdGVzdHMgdmFyaW91cyBjYXNlcyB3aGVyZSByaWdodC1kaXNwYXRjaCBvZiBhIHN1YmNsYXNzCisgICAgICAgICMgc2hvdWxkIGJlIHByZWZlcnJlZCBvdmVyIGxlZnQtZGlzcGF0Y2ggb2YgYSBiYXNlIGNsYXNzLgorCisgICAgICAgICMgQ2FzZSAxOiBzdWJjbGFzcyBvZiBpbnQ7IHRoaXMgdGVzdHMgY29kZSBpbiBhYnN0cmFjdC5jOjpiaW5hcnlfb3AxKCkKKworICAgICAgICBjbGFzcyBCKGludCk6CisgICAgICAgICAgICBkZWYgX19mbG9vcmRpdl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkIuX19mbG9vcmRpdl9fIgorICAgICAgICAgICAgZGVmIF9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQi5fX3JmbG9vcmRpdl9fIgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQigxKSAvLyAxLCAiQi5fX2Zsb29yZGl2X18iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEgLy8gQigxKSwgIkIuX19yZmxvb3JkaXZfXyIpCisKKyAgICAgICAgIyBDYXNlIDI6IHN1YmNsYXNzIG9mIG9iamVjdDsgdGhpcyBpcyBqdXN0IHRoZSBiYXNlbGluZSBmb3IgY2FzZSAzCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDLl9fZmxvb3JkaXZfXyIKKyAgICAgICAgICAgIGRlZiBfX3JmbG9vcmRpdl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkMuX19yZmxvb3JkaXZfXyIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMoKSAvLyAxLCAiQy5fX2Zsb29yZGl2X18iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEgLy8gQygpLCAiQy5fX3JmbG9vcmRpdl9fIikKKworICAgICAgICAjIENhc2UgMzogc3ViY2xhc3Mgb2YgbmV3LXN0eWxlIGNsYXNzOyBoZXJlIGl0IGdldHMgaW50ZXJlc3RpbmcKKworICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgZGVmIF9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJELl9fZmxvb3JkaXZfXyIKKyAgICAgICAgICAgIGRlZiBfX3JmbG9vcmRpdl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkQuX19yZmxvb3JkaXZfXyIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQoKSAvLyBDKCksICJELl9fZmxvb3JkaXZfXyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQygpIC8vIEQoKSwgIkQuX19yZmxvb3JkaXZfXyIpCisKKyAgICAgICAgIyBDYXNlIDQ6IHRoaXMgZGlkbid0IHdvcmsgcmlnaHQgaW4gMi4yLjIgYW5kIDIuM2ExCisKKyAgICAgICAgY2xhc3MgRShDKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUuX19yZmxvb3JkaXZfXywgQy5fX3JmbG9vcmRpdl9fKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRSgpIC8vIDEsICJDLl9fZmxvb3JkaXZfXyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSAvLyBFKCksICJDLl9fcmZsb29yZGl2X18iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUoKSAvLyBDKCksICJDLl9fZmxvb3JkaXZfXyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQygpIC8vIEUoKSwgIkMuX19mbG9vcmRpdl9fIikgIyBUaGlzIG9uZSB3b3VsZCBmYWlsCisKKyAgICBAdGVzdF9zdXBwb3J0LmltcGxfZGV0YWlsKCJ0ZXN0aW5nIGFuIGludGVybmFsIGtpbmQgb2YgbWV0aG9kIG9iamVjdCIpCisgICAgZGVmIHRlc3RfbWV0aF9jbGFzc19nZXQoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBfX2dldF9fIG1ldGhvZCBvZiBNRVRIX0NMQVNTIEMgbWV0aG9kcy4uLgorICAgICAgICAjIEZ1bGwgY292ZXJhZ2Ugb2YgZGVzY3JvYmplY3QuYzo6Y2xhc3NtZXRob2RfZ2V0KCkKKworICAgICAgICAjIEJhc2VsaW5lCisgICAgICAgIGFyZyA9IFsxLCAyLCAzXQorICAgICAgICByZXMgPSB7MTogTm9uZSwgMjogTm9uZSwgMzogTm9uZX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0LmZyb21rZXlzKGFyZyksIHJlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7fS5mcm9ta2V5cyhhcmcpLCByZXMpCisKKyAgICAgICAgIyBOb3cgZ2V0IHRoZSBkZXNjcmlwdG9yCisgICAgICAgIGRlc2NyID0gZGljdC5fX2RpY3RfX1siZnJvbWtleXMiXQorCisgICAgICAgICMgTW9yZSBiYXNlbGluZSB1c2luZyB0aGUgZGVzY3JpcHRvciBkaXJlY3RseQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlc2NyLl9fZ2V0X18oTm9uZSwgZGljdCkoYXJnKSwgcmVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlc2NyLl9fZ2V0X18oe30pKGFyZyksIHJlcykKKworICAgICAgICAjIE5vdyBjaGVjayB2YXJpb3VzIGVycm9yIGNhc2VzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlc2NyLl9fZ2V0X18oTm9uZSwgTm9uZSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGhhdmUgYWxsb3dlZCBkZXNjci5fX2dldF9fKE5vbmUsIE5vbmUpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVzY3IuX19nZXRfXyg0MikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGhhdmUgYWxsb3dlZCBkZXNjci5fX2dldF9fKDQyKSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlc2NyLl9fZ2V0X18oTm9uZSwgNDIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBoYXZlIGFsbG93ZWQgZGVzY3IuX19nZXRfXyhOb25lLCA0MikiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZXNjci5fX2dldF9fKE5vbmUsIGludCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGhhdmUgYWxsb3dlZCBkZXNjci5fX2dldF9fKE5vbmUsIGludCkiKQorCisgICAgZGVmIHRlc3RfaXNpbnN0X2lzY2xhc3Moc2VsZik6CisgICAgICAgICMgVGVzdGluZyBwcm94eSBpc2luc3RhbmNlKCkgYW5kIGlzY2xhc3MoKS4uLgorICAgICAgICBjbGFzcyBQcm94eShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iaik6CisgICAgICAgICAgICAgICAgc2VsZi5fX29iaiA9IG9iagorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCJfUHJveHlfXyIpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9fb2JqLCBuYW1lKQorICAgICAgICAjIFRlc3Qgd2l0aCBhIGNsYXNzaWMgY2xhc3MKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYSA9IEMoKQorICAgICAgICBwYSA9IFByb3h5KGEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShhLCBDKSAgIyBCYXNlbGluZQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocGEsIEMpICMgVGVzdAorICAgICAgICAjIFRlc3Qgd2l0aCBhIGNsYXNzaWMgc3ViY2xhc3MKKyAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYSA9IEQoKQorICAgICAgICBwYSA9IFByb3h5KGEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShhLCBDKSAgIyBCYXNlbGluZQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocGEsIEMpICMgVGVzdAorICAgICAgICAjIFRlc3Qgd2l0aCBhIG5ldy1zdHlsZSBjbGFzcworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGEgPSBDKCkKKyAgICAgICAgcGEgPSBQcm94eShhKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYSwgQykgICMgQmFzZWxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBhLCBDKSAjIFRlc3QKKyAgICAgICAgIyBUZXN0IHdpdGggYSBuZXctc3R5bGUgc3ViY2xhc3MKKyAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYSA9IEQoKQorICAgICAgICBwYSA9IFByb3h5KGEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShhLCBDKSAgIyBCYXNlbGluZQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocGEsIEMpICMgVGVzdAorCisgICAgZGVmIHRlc3RfcHJveHlfc3VwZXIoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBzdXBlcigpIGZvciBhIHByb3h5IG9iamVjdC4uLgorICAgICAgICBjbGFzcyBQcm94eShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iaik6CisgICAgICAgICAgICAgICAgc2VsZi5fX29iaiA9IG9iagorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCJfUHJveHlfXyIpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9fb2JqLCBuYW1lKQorCisgICAgICAgIGNsYXNzIEIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQi5mIgorCisgICAgICAgIGNsYXNzIEMoQik6CisgICAgICAgICAgICBkZWYgZihzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoQywgc2VsZikuZigpICsgIi0+Qy5mIgorCisgICAgICAgIG9iaiA9IEMoKQorICAgICAgICBwID0gUHJveHkob2JqKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuX19kaWN0X19bImYiXShwKSwgIkIuZi0+Qy5mIikKKworICAgIGRlZiB0ZXN0X2NhcmxvdmVycmUoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBwcm9oaWJpdGlvbiBvZiBDYXJsbyBWZXJyZSdzIGhhY2suLi4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2JqZWN0Ll9fc2V0YXR0cl9fKHN0ciwgImZvbyIsIDQyKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJDYXJsbyBWZXJyZSBfX3NldGF0dHJfXyBzdWNjZWVkZWQhIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2JqZWN0Ll9fZGVsYXR0cl9fKHN0ciwgImxvd2VyIikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQ2FybG8gVmVycmUgX19kZWxhdHRyX18gc3VjY2VlZGVkISIpCisKKyAgICBkZWYgdGVzdF93ZWFrcmVmX3NlZ2ZhdWx0KHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgd2Vha3JlZiBzZWdmYXVsdC4uLgorICAgICAgICAjIFNGIDc0MjkxMQorICAgICAgICBpbXBvcnQgd2Vha3JlZgorCisgICAgICAgIGNsYXNzIFByb3Zva2VyOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlZmVycmVudCk6CisgICAgICAgICAgICAgICAgc2VsZi5yZWYgPSB3ZWFrcmVmLnJlZihyZWZlcnJlbnQpCisKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHggPSBzZWxmLnJlZigpCisKKyAgICAgICAgY2xhc3MgT29wcyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIG8gPSBPb3BzKCkKKyAgICAgICAgby53aGF0ZXZlciA9IFByb3Zva2VyKG8pCisgICAgICAgIGRlbCBvCisKKyAgICBkZWYgdGVzdF93cmFwcGVyX3NlZ2ZhdWx0KHNlbGYpOgorICAgICAgICAjIFNGIDkyNzI0ODogZGVlcGx5IG5lc3RlZCB3cmFwcGVycyBjb3VsZCBjYXVzZSBzdGFjayBvdmVyZmxvdworICAgICAgICBmID0gbGFtYmRhOk5vbmUKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMDAwMDApOgorICAgICAgICAgICAgZiA9IGYuX19jYWxsX18KKyAgICAgICAgZiA9IE5vbmUKKworICAgIGRlZiB0ZXN0X2ZpbGVfZmF1bHQoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBzeXMuc3Rkb3V0IGlzIGNoYW5nZWQgaW4gZ2V0YXR0ci4uLgorICAgICAgICB0ZXN0X3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgY2xhc3MgU3Rkb3V0R3VhcmQ6CisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJQcmVtYXR1cmUgYWNjZXNzIHRvIHN5cy5zdGRvdXQuJXMiICUgYXR0cikKKyAgICAgICAgc3lzLnN0ZG91dCA9IFN0ZG91dEd1YXJkKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJpbnQgIk9vcHMhIgorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHRlc3Rfc3Rkb3V0CisKKyAgICBkZWYgdGVzdF92aWNpb3VzX2Rlc2NyaXB0b3Jfbm9uc2Vuc2Uoc2VsZik6CisgICAgICAgICMgVGVzdGluZyB2aWNpb3VzX2Rlc2NyaXB0b3Jfbm9uc2Vuc2UuLi4KKworICAgICAgICAjIEEgcG90ZW50aWFsIHNlZ2ZhdWx0IHNwb3R0ZWQgYnkgVGhvbWFzIFdvdXRlcnMgaW4gbWFpbCB0bworICAgICAgICAjIHB5dGhvbi1kZXYgMjAwMy0wNC0xNywgdHVybmVkIGludG8gYW4gZXhhbXBsZSAmIGZpeGVkIGJ5IE1pY2hhZWwKKyAgICAgICAgIyBIdWRzb24ganVzdCBsZXNzIHRoYW4gZm91ciBtb250aHMgbGF0ZXIuLi4KKworICAgICAgICBjbGFzcyBFdmlsKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2goJ2F0dHInKQorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgZGVsIEMuYXR0cgorICAgICAgICAgICAgICAgIHJldHVybiAwCisKKyAgICAgICAgY2xhc3MgRGVzY3Iob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iLCB0eXBlPU5vbmUpOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgYXR0ciA9IERlc2NyKCkKKworICAgICAgICBjID0gQygpCisgICAgICAgIGMuX19kaWN0X19bRXZpbCgpXSA9IDAKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuYXR0ciwgMSkKKyAgICAgICAgIyB0aGlzIG1ha2VzIGEgY3Jhc2ggbW9yZSBsaWtlbHk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNhdHRyKGMsICdhdHRyJyksIEZhbHNlKQorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgIyBTRiAxMTU1OTM4CisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAxMAorICAgICAgICB0cnk6CisgICAgICAgICAgICBGb28oKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJkaWQgbm90IHRlc3QgX19pbml0X18oKSBmb3IgTm9uZSByZXR1cm4iKQorCisgICAgZGVmIHRlc3RfbWV0aG9kX3dyYXBwZXIoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBtZXRob2Qtd3JhcHBlciBvYmplY3RzLi4uCisgICAgICAgICMgPHR5cGUgJ21ldGhvZC13cmFwcGVyJz4gZGlkIG5vdCBzdXBwb3J0IGFueSByZWZsZWN0aW9uIGJlZm9yZSAyLjUKKworICAgICAgICBsID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLl9fYWRkX18sIGwuX19hZGRfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLl9fYWRkX18sIFtdLl9fYWRkX18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsLl9fYWRkX18gIT0gWzVdLl9fYWRkX18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsLl9fYWRkX18gIT0gbC5fX211bF9fKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fLl9fbmFtZV9fID09ICdfX2FkZF9fJykKKyAgICAgICAgaWYgaGFzYXR0cihsLl9fYWRkX18sICdfX3NlbGZfXycpOgorICAgICAgICAgICAgIyBDUHl0aG9uCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fLl9fc2VsZl9fIGlzIGwpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fLl9fb2JqY2xhc3NfXyBpcyBsaXN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBQeXRob24gaW1wbGVtZW50YXRpb25zIHdoZXJlIFtdLl9fYWRkX18gaXMgYSBub3JtYWwgYm91bmQgbWV0aG9kCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fLmltX3NlbGYgaXMgbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsLl9fYWRkX18uaW1fY2xhc3MgaXMgbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLl9fYWRkX18uX19kb2NfXywgbGlzdC5fX2FkZF9fLl9fZG9jX18pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhhc2gobC5fX2FkZF9fKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBUeXBlRXJyb3IgZnJvbSBoYXNoKFtdLl9fYWRkX18pIikKKworICAgICAgICB0ID0gKCkKKyAgICAgICAgdCArPSAoNywpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5fX2FkZF9fLCAoNywpLl9fYWRkX18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh0Ll9fYWRkX18pLCBoYXNoKCg3LCkuX19hZGRfXykpCisKKyAgICBkZWYgdGVzdF9ub3RfaW1wbGVtZW50ZWQoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBOb3RJbXBsZW1lbnRlZC4uLgorICAgICAgICAjIGFsbCBiaW5hcnkgbWV0aG9kcyBzaG91bGQgYmUgYWJsZSB0byByZXR1cm4gYSBOb3RJbXBsZW1lbnRlZAorICAgICAgICBpbXBvcnQgb3BlcmF0b3IKKworICAgICAgICBkZWYgc3BlY2lhbG1ldGhvZChzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgICAgICBkZWYgY2hlY2soZXhwciwgeCwgeSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXhlYyBleHByIGluIHsneCc6IHgsICd5JzogeSwgJ29wZXJhdG9yJzogb3BlcmF0b3J9CisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBUeXBlRXJyb3IgZnJvbSAlciIgJSAoZXhwciwpKQorCisgICAgICAgIE4xID0gc3lzLm1heGludCArIDFMICAgICMgbWlnaHQgdHJpZ2dlciBPdmVyZmxvd0Vycm9ycyBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVHlwZUVycm9ycworICAgICAgICBOMiA9IHN5cy5tYXhpbnQgICAgICAgICAjIGlmIHNpemVvZihpbnQpIDwgc2l6ZW9mKGxvbmcpLCBtaWdodCB0cmlnZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBWYWx1ZUVycm9ycyBpbnN0ZWFkIG9mIFR5cGVFcnJvcnMKKyAgICAgICAgZm9yIG1ldGFjbGFzcyBpbiBbdHlwZSwgdHlwZXMuQ2xhc3NUeXBlXToKKyAgICAgICAgICAgIGZvciBuYW1lLCBleHByLCBpZXhwciBpbiBbCisgICAgICAgICAgICAgICAgICAgICgnX19hZGRfXycsICAgICAgJ3ggKyB5JywgICAgICAgICAgICAgICAgICAgJ3ggKz0geScpLAorICAgICAgICAgICAgICAgICAgICAoJ19fc3ViX18nLCAgICAgICd4IC0geScsICAgICAgICAgICAgICAgICAgICd4IC09IHknKSwKKyAgICAgICAgICAgICAgICAgICAgKCdfX211bF9fJywgICAgICAneCAqIHknLCAgICAgICAgICAgICAgICAgICAneCAqPSB5JyksCisgICAgICAgICAgICAgICAgICAgICgnX190cnVlZGl2X18nLCAgJ29wZXJhdG9yLnRydWVkaXYoeCwgeSknLCAgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICgnX19mbG9vcmRpdl9fJywgJ29wZXJhdG9yLmZsb29yZGl2KHgsIHkpJywgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICgnX19kaXZfXycsICAgICAgJ3ggLyB5JywgICAgICAgICAgICAgICAgICAgJ3ggLz0geScpLAorICAgICAgICAgICAgICAgICAgICAoJ19fbW9kX18nLCAgICAgICd4ICUgeScsICAgICAgICAgICAgICAgICAgICd4ICU9IHknKSwKKyAgICAgICAgICAgICAgICAgICAgKCdfX2Rpdm1vZF9fJywgICAnZGl2bW9kKHgsIHkpJywgICAgICAgICAgICBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgKCdfX3Bvd19fJywgICAgICAneCAqKiB5JywgICAgICAgICAgICAgICAgICAneCAqKj0geScpLAorICAgICAgICAgICAgICAgICAgICAoJ19fbHNoaWZ0X18nLCAgICd4IDw8IHknLCAgICAgICAgICAgICAgICAgICd4IDw8PSB5JyksCisgICAgICAgICAgICAgICAgICAgICgnX19yc2hpZnRfXycsICAgJ3ggPj4geScsICAgICAgICAgICAgICAgICAgJ3ggPj49IHknKSwKKyAgICAgICAgICAgICAgICAgICAgKCdfX2FuZF9fJywgICAgICAneCAmIHknLCAgICAgICAgICAgICAgICAgICAneCAmPSB5JyksCisgICAgICAgICAgICAgICAgICAgICgnX19vcl9fJywgICAgICAgJ3ggfCB5JywgICAgICAgICAgICAgICAgICAgJ3ggfD0geScpLAorICAgICAgICAgICAgICAgICAgICAoJ19feG9yX18nLCAgICAgICd4IF4geScsICAgICAgICAgICAgICAgICAgICd4IF49IHknKSwKKyAgICAgICAgICAgICAgICAgICAgKCdfX2NvZXJjZV9fJywgICAnY29lcmNlKHgsIHkpJywgICAgICAgICAgICBOb25lKV06CisgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAnX19jb2VyY2VfXyc6CisgICAgICAgICAgICAgICAgICAgIHJuYW1lID0gbmFtZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJuYW1lID0gJ19fcicgKyBuYW1lWzI6XQorICAgICAgICAgICAgICAgIEEgPSBtZXRhY2xhc3MoJ0EnLCAoKSwge25hbWU6IHNwZWNpYWxtZXRob2R9KQorICAgICAgICAgICAgICAgIEIgPSBtZXRhY2xhc3MoJ0InLCAoKSwge3JuYW1lOiBzcGVjaWFsbWV0aG9kfSkKKyAgICAgICAgICAgICAgICBhID0gQSgpCisgICAgICAgICAgICAgICAgYiA9IEIoKQorICAgICAgICAgICAgICAgIGNoZWNrKGV4cHIsIGEsIGEpCisgICAgICAgICAgICAgICAgY2hlY2soZXhwciwgYSwgYikKKyAgICAgICAgICAgICAgICBjaGVjayhleHByLCBiLCBhKQorICAgICAgICAgICAgICAgIGNoZWNrKGV4cHIsIGIsIGIpCisgICAgICAgICAgICAgICAgY2hlY2soZXhwciwgYSwgTjEpCisgICAgICAgICAgICAgICAgY2hlY2soZXhwciwgYSwgTjIpCisgICAgICAgICAgICAgICAgY2hlY2soZXhwciwgTjEsIGIpCisgICAgICAgICAgICAgICAgY2hlY2soZXhwciwgTjIsIGIpCisgICAgICAgICAgICAgICAgaWYgaWV4cHI6CisgICAgICAgICAgICAgICAgICAgIGNoZWNrKGlleHByLCBhLCBhKQorICAgICAgICAgICAgICAgICAgICBjaGVjayhpZXhwciwgYSwgYikKKyAgICAgICAgICAgICAgICAgICAgY2hlY2soaWV4cHIsIGIsIGEpCisgICAgICAgICAgICAgICAgICAgIGNoZWNrKGlleHByLCBiLCBiKQorICAgICAgICAgICAgICAgICAgICBjaGVjayhpZXhwciwgYSwgTjEpCisgICAgICAgICAgICAgICAgICAgIGNoZWNrKGlleHByLCBhLCBOMikKKyAgICAgICAgICAgICAgICAgICAgaW5hbWUgPSAnX19pJyArIG5hbWVbMjpdCisgICAgICAgICAgICAgICAgICAgIEMgPSBtZXRhY2xhc3MoJ0MnLCAoKSwge2luYW1lOiBzcGVjaWFsbWV0aG9kfSkKKyAgICAgICAgICAgICAgICAgICAgYyA9IEMoKQorICAgICAgICAgICAgICAgICAgICBjaGVjayhpZXhwciwgYywgYSkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2soaWV4cHIsIGMsIGIpCisgICAgICAgICAgICAgICAgICAgIGNoZWNrKGlleHByLCBjLCBOMSkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2soaWV4cHIsIGMsIE4yKQorCisgICAgZGVmIHRlc3RfYXNzaWduX3NsaWNlKHNlbGYpOgorICAgICAgICAjIGNldmFsLmMncyBhc3NpZ25fc2xpY2UgdXNlZCB0byBjaGVjayBmb3IKKyAgICAgICAgIyB0cC0+dHBfYXNfc2VxdWVuY2UtPnNxX3NsaWNlIGluc3RlYWQgb2YKKyAgICAgICAgIyB0cC0+dHBfYXNfc2VxdWVuY2UtPnNxX2Fzc19zbGljZQorCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgc3RhcnQsIHN0b3AsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKworICAgICAgICBjID0gQygpCisgICAgICAgIGNbMToyXSA9IDMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnZhbHVlLCAzKQorCisgICAgZGVmIHRlc3Rfc2V0X2FuZF9ub19nZXQoc2VsZik6CisgICAgICAgICMgU2VlCisgICAgICAgICMgaHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWRldi8yMDEwLUphbnVhcnkvMDk1NjM3Lmh0bWwKKyAgICAgICAgY2xhc3MgRGVzY3Iob2JqZWN0KToKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgICAgICAgICAgZGVmIF9fc2V0X18oc2VsZiwgb2JqLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgb2JqLl9fZGljdF9fW3NlbGYubmFtZV0gPSB2YWx1ZQorICAgICAgICBkZXNjciA9IERlc2NyKCJhIikKKworICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICBhID0gZGVzY3IKKworICAgICAgICB4ID0gWCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeC5hLCBkZXNjcikKKyAgICAgICAgeC5hID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmEsIDQyKQorCisgICAgICAgICMgQWxzbyBjaGVjayB0eXBlX2dldGF0dHJvIGZvciBjb3JyZWN0bmVzcy4KKyAgICAgICAgY2xhc3MgTWV0YSh0eXBlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE1ldGEKKyAgICAgICAgWC5hID0gNDIKKyAgICAgICAgTWV0YS5hID0gRGVzY3IoImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYSwgNDIpCisKKyAgICBkZWYgdGVzdF9nZXRhdHRyX2hvb2tzKHNlbGYpOgorICAgICAgICAjIGlzc3VlIDQyMzAKKworICAgICAgICBjbGFzcyBEZXNjcmlwdG9yKG9iamVjdCk6CisgICAgICAgICAgICBjb3VudGVyID0gMAorICAgICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCBvYmp0eXBlPU5vbmUpOgorICAgICAgICAgICAgICAgIGRlZiBnZXR0ZXIobmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY291bnRlciArPSAxCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldHRlcgorCisgICAgICAgIGRlc2NyID0gRGVzY3JpcHRvcigpCisgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgIF9fZ2V0YXR0cmlidXRlX18gPSBkZXNjcgorICAgICAgICBjbGFzcyBCKG9iamVjdCk6CisgICAgICAgICAgICBfX2dldGF0dHJfXyA9IGRlc2NyCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIF9fZ2V0YXR0cmlidXRlX18gPSBkZXNjcgorICAgICAgICAgICAgX19nZXRhdHRyX18gPSBkZXNjcgorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBnZXRhdHRyLCBBKCksICJhdHRyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXNjci5jb3VudGVyLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZ2V0YXR0ciwgQigpLCAiYXR0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVzY3IuY291bnRlciwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGdldGF0dHIsIEMoKSwgImF0dHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlc2NyLmNvdW50ZXIsIDQpCisKKyAgICAgICAgY2xhc3MgRXZpbEdldGF0dHJpYnV0ZShvYmplY3QpOgorICAgICAgICAgICAgIyBUaGlzIHVzZWQgdG8gc2VnZmF1bHQKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihuYW1lKQorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgZGVsIEV2aWxHZXRhdHRyaWJ1dGUuX19nZXRhdHRyX18KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZ2V0YXR0ciwgRXZpbEdldGF0dHJpYnV0ZSgpLCAiYXR0ciIpCisKKyAgICBkZWYgdGVzdF90eXBlX19fZ2V0YXR0cmlidXRlX18oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHlwZS5fX2dldGF0dHJpYnV0ZV9fLCBsaXN0LCB0eXBlKQorCisgICAgZGVmIHRlc3RfYWJzdHJhY3RtZXRob2RzKHNlbGYpOgorICAgICAgICAjIHR5cGUgcHJldGVuZHMgbm90IHRvIGhhdmUgX19hYnN0cmFjdG1ldGhvZHNfXy4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGdldGF0dHIsIHR5cGUsICJfX2Fic3RyYWN0bWV0aG9kc19fIikKKyAgICAgICAgY2xhc3MgbWV0YSh0eXBlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGdldGF0dHIsIG1ldGEsICJfX2Fic3RyYWN0bWV0aG9kc19fIikKKyAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIGRlbCBYLl9fYWJzdHJhY3RtZXRob2RzX18KKworICAgIGRlZiB0ZXN0X3Byb3h5X2NhbGwoc2VsZik6CisgICAgICAgIGNsYXNzIEZha2VTdHIob2JqZWN0KToKKyAgICAgICAgICAgIF9fY2xhc3NfXyA9IHN0cgorCisgICAgICAgIGZha2Vfc3RyID0gRmFrZVN0cigpCisgICAgICAgICMgaXNpbnN0YW5jZSgpIHJlYWRzIF9fY2xhc3NfXyBvbiBuZXcgc3R5bGUgY2xhc3NlcworICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShmYWtlX3N0ciwgc3RyKSkKKworICAgICAgICAjIGNhbGwgYSBtZXRob2QgZGVzY3JpcHRvcgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBzdHIuc3BsaXQoZmFrZV9zdHIpCisKKyAgICAgICAgIyBjYWxsIGEgc2xvdCB3cmFwcGVyIGRlc2NyaXB0b3IKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc3RyLl9fYWRkX18oZmFrZV9zdHIsICJhYmMiKQorCisgICAgZGVmIHRlc3RfcmVwcl9hc19zdHIoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzExNjAzOiBjcmFzaCBvciBpbmZpbml0ZSBsb29wIHdoZW4gcmViaW5kaW5nIF9fc3RyX18gYXMKKyAgICAgICAgIyBfX3JlcHJfXy4KKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIEZvby5fX3JlcHJfXyA9IEZvby5fX3N0cl9fCisgICAgICAgIGZvbyA9IEZvbygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc3RyLCBmb28pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgcmVwciwgZm9vKQorCisgICAgZGVmIHRlc3RfbWl4aW5nX3Nsb3Rfd3JhcHBlcnMoc2VsZik6CisgICAgICAgIGNsYXNzIFgoZGljdCk6CisgICAgICAgICAgICBfX3NldGF0dHJfXyA9IGRpY3QuX19zZXRpdGVtX18KKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4LnkgPSA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbInkiXSwgNDIpCisKKyAgICBkZWYgdGVzdF9jeWNsZV90aHJvdWdoX2RpY3Qoc2VsZik6CisgICAgICAgICMgU2VlIGJ1ZyAjMTQ2OTYyOQorICAgICAgICBjbGFzcyBYKGRpY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGRpY3QuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLl9fZGljdF9fID0gc2VsZgorICAgICAgICB4ID0gWCgpCisgICAgICAgIHguYXR0ciA9IDQyCisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoeCkKKyAgICAgICAgZGVsIHgKKyAgICAgICAgdGVzdF9zdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZSh3cigpKQorICAgICAgICBmb3IgbyBpbiBnYy5nZXRfb2JqZWN0cygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdCh0eXBlKG8pLCBYKQorCitjbGFzcyBEaWN0UHJveHlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgbWV0aChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuQyA9IEMKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2RpY3RfcHJveHkoeycsIHJlcHIodmFycyhzZWxmLkMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiJ21ldGgnOiIsIHJlcHIodmFycyhzZWxmLkMpKSkKKworICAgIGRlZiB0ZXN0X2l0ZXJfa2V5cyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGRpY3QtcHJveHkgaXRlcmtleXMuLi4KKyAgICAgICAga2V5cyA9IFsga2V5IGZvciBrZXkgaW4gc2VsZi5DLl9fZGljdF9fLml0ZXJrZXlzKCkgXQorICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsIFsnX19kaWN0X18nLCAnX19kb2NfXycsICdfX21vZHVsZV9fJywKKyAgICAgICAgICAgICdfX3dlYWtyZWZfXycsICdtZXRoJ10pCisKKyAgICBkZWYgdGVzdF9pdGVyX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGRpY3QtcHJveHkgaXRlcnZhbHVlcy4uLgorICAgICAgICB2YWx1ZXMgPSBbIHZhbHVlcyBmb3IgdmFsdWVzIGluIHNlbGYuQy5fX2RpY3RfXy5pdGVydmFsdWVzKCkgXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCA1KQorCisgICAgZGVmIHRlc3RfaXRlcl9pdGVtcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGRpY3QtcHJveHkgaXRlcml0ZW1zLi4uCisgICAgICAgIGtleXMgPSBbIGtleSBmb3IgKGtleSwgdmFsdWUpIGluIHNlbGYuQy5fX2RpY3RfXy5pdGVyaXRlbXMoKSBdCisgICAgICAgIGtleXMuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5cywgWydfX2RpY3RfXycsICdfX2RvY19fJywgJ19fbW9kdWxlX18nLAorICAgICAgICAgICAgJ19fd2Vha3JlZl9fJywgJ21ldGgnXSkKKworICAgIGRlZiB0ZXN0X2RpY3RfdHlwZV93aXRoX21ldGFjbGFzcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHR5cGUgb2YgX19kaWN0X18gd2hlbiBfX21ldGFjbGFzc19fIHNldC4uLgorICAgICAgICBjbGFzcyBCKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIE0odHlwZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICAjIEluIDIuM2ExLCBDLl9fZGljdF9fIHdhcyBhIHJlYWwgZGljdCByYXRoZXIgdGhhbiBhIGRpY3QgcHJveHkKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShDLl9fZGljdF9fKSwgdHlwZShCLl9fZGljdF9fKSkKKworCitjbGFzcyBQVHlwZXNMb25nSW5pdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGhpcyBpcyBpbiBpdHMgb3duIFRlc3RDYXNlIHNvIHRoYXQgaXQgY2FuIGJlIHJ1biBiZWZvcmUgYW55IG90aGVyIHRlc3RzLgorICAgIGRlZiB0ZXN0X3B5dHlwZV9sb25nX3JlYWR5KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgU0YgYnVnIDU1MTQxMiAuLi4KKworICAgICAgICAjIFRoaXMgZHVtcHMgY29yZSB3aGVuIFNGIGJ1ZyA1NTE0MTIgaXNuJ3QgZml4ZWQgLS0KKyAgICAgICAgIyBidXQgb25seSB3aGVuIHRlc3RfZGVzY3IucHkgaXMgcnVuIHNlcGFyYXRlbHkuCisgICAgICAgICMgKFRoYXQgY2FuJ3QgYmUgaGVscGVkIC0tIGFzIHNvb24gYXMgUHlUeXBlX1JlYWR5KCkKKyAgICAgICAgIyBpcyBjYWxsZWQgZm9yIFB5TG9uZ19UeXBlLCB0aGUgYnVnIGlzIGdvbmUuKQorICAgICAgICBjbGFzcyBVc2VyTG9uZyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fcG93X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcG93KDBMLCBVc2VyTG9uZygpLCAwTCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgQW5vdGhlciBzZWdmYXVsdCBvbmx5IHdoZW4gcnVuIGVhcmx5CisgICAgICAgICMgKGJlZm9yZSBQeVR5cGVfUmVhZHkodHVwbGUpIGlzIGNhbGxlZCkKKyAgICAgICAgdHlwZS5tcm8odHVwbGUpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGRlcHJlY2F0aW9ucyA9IFsocidjb21wbGV4IGRpdm1vZFwoXCksIC8vIGFuZCAlIGFyZSBkZXByZWNhdGVkJCcsCisgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpXQorICAgIGlmIHN5cy5weTNrd2FybmluZzoKKyAgICAgICAgZGVwcmVjYXRpb25zICs9IFsKKyAgICAgICAgICAgICgiY2xhc3NpYyAoaW50fGxvbmcpIGRpdmlzaW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICgiY29lcmNlLi4gbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoIi4rX18oZ2V0fHNldHxkZWwpc2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKV0KKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygqZGVwcmVjYXRpb25zKToKKyAgICAgICAgIyBSdW4gYWxsIGxvY2FsIHRlc3QgY2FzZXMsIHdpdGggUFR5cGVzTG9uZ0luaXRUZXN0IGZpcnN0LgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFBUeXBlc0xvbmdJbml0VGVzdCwgT3BlcmF0b3JzVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1Byb3BlcnRpZXNBbmRNZXRob2RzLCBEaWN0UHJveHlUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3IucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MjgxYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZXNjci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3IucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZmExMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZXNjci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3J0dXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZXNjcnR1dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2ZmMGM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3J0dXQucHkKQEAgLTAsMCArMSw0OTcgQEAKKyMgVGhpcyBjb250YWlucyBtb3N0IG9mIHRoZSBleGVjdXRhYmxlIGV4YW1wbGVzIGZyb20gR3VpZG8ncyBkZXNjcgorIyB0dXRvcmlhbCwgb25jZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5weXRob24ub3JnLzIuMi9kZXNjcmludHJvLmh0bWwKKyMKKyMgQSBmZXcgZXhhbXBsZXMgbGVmdCBpbXBsaWNpdCBpbiB0aGUgd3JpdGV1cCB3ZXJlIGZsZXNoZWQgb3V0LCBhIGZldyB3ZXJlCisjIHNraXBwZWQgZHVlIHRvIGxhY2sgb2YgaW50ZXJlc3QgKGUuZy4sIGZha2luZyBzdXBlcigpIGJ5IGhhbmQgaXNuJ3QKKyMgb2YgbXVjaCBpbnRlcmVzdCBhbnltb3JlKSwgYW5kIGEgZmV3IHdlcmUgZmlkZGxlZCB0byBtYWtlIHRoZSBvdXRwdXQKKyMgZGV0ZXJtaW5pc3RpYy4KKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgc29ydGRpY3QKK2ltcG9ydCBwcHJpbnQKKworY2xhc3MgZGVmYXVsdGRpY3QoZGljdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgIGRpY3QuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5kZWZhdWx0ID0gZGVmYXVsdAorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBkaWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVmYXVsdAorCisgICAgZGVmIGdldChzZWxmLCBrZXksICphcmdzKToKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICBhcmdzID0gKHNlbGYuZGVmYXVsdCwpCisgICAgICAgIHJldHVybiBkaWN0LmdldChzZWxmLCBrZXksICphcmdzKQorCisgICAgZGVmIG1lcmdlKHNlbGYsIG90aGVyKToKKyAgICAgICAgZm9yIGtleSBpbiBvdGhlcjoKKyAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSBvdGhlcltrZXldCisKK3Rlc3RfMSA9ICIiIgorCitIZXJlJ3MgdGhlIG5ldyB0eXBlIGF0IHdvcms6CisKKyAgICA+Pj4gcHJpbnQgZGVmYXVsdGRpY3QgICAgICAgICAgICAgICAjIHNob3cgb3VyIHR5cGUKKyAgICA8Y2xhc3MgJ3Rlc3QudGVzdF9kZXNjcnR1dC5kZWZhdWx0ZGljdCc+CisgICAgPj4+IHByaW50IHR5cGUoZGVmYXVsdGRpY3QpICAgICAgICAgIyBpdHMgbWV0YXR5cGUKKyAgICA8dHlwZSAndHlwZSc+CisgICAgPj4+IGEgPSBkZWZhdWx0ZGljdChkZWZhdWx0PTAuMCkgICAgIyBjcmVhdGUgYW4gaW5zdGFuY2UKKyAgICA+Pj4gcHJpbnQgYSAgICAgICAgICAgICAgICAgICAgICAgICAjIHNob3cgdGhlIGluc3RhbmNlCisgICAge30KKyAgICA+Pj4gcHJpbnQgdHlwZShhKSAgICAgICAgICAgICAgICAgICAjIHNob3cgaXRzIHR5cGUKKyAgICA8Y2xhc3MgJ3Rlc3QudGVzdF9kZXNjcnR1dC5kZWZhdWx0ZGljdCc+CisgICAgPj4+IHByaW50IGEuX19jbGFzc19fICAgICAgICAgICAgICAgIyBzaG93IGl0cyBjbGFzcworICAgIDxjbGFzcyAndGVzdC50ZXN0X2Rlc2NydHV0LmRlZmF1bHRkaWN0Jz4KKyAgICA+Pj4gcHJpbnQgdHlwZShhKSBpcyBhLl9fY2xhc3NfXyAgICAjIGl0cyB0eXBlIGlzIGl0cyBjbGFzcworICAgIFRydWUKKyAgICA+Pj4gYVsxXSA9IDMuMjUgICAgICAgICAgICAgICAgICAgICAjIG1vZGlmeSB0aGUgaW5zdGFuY2UKKyAgICA+Pj4gcHJpbnQgYSAgICAgICAgICAgICAgICAgICAgICAgICAjIHNob3cgdGhlIG5ldyB2YWx1ZQorICAgIHsxOiAzLjI1fQorICAgID4+PiBwcmludCBhWzFdICAgICAgICAgICAgICAgICAgICAgICMgc2hvdyB0aGUgbmV3IGl0ZW0KKyAgICAzLjI1CisgICAgPj4+IHByaW50IGFbMF0gICAgICAgICAgICAgICAgICAgICAgIyBhIG5vbi1leGlzdGVudCBpdGVtCisgICAgMC4wCisgICAgPj4+IGEubWVyZ2UoezE6MTAwLCAyOjIwMH0pICAgICAgICAgIyB1c2UgYSBkaWN0IG1ldGhvZAorICAgID4+PiBwcmludCBzb3J0ZGljdChhKSAgICAgICAgICAgICAgICMgc2hvdyB0aGUgcmVzdWx0CisgICAgezE6IDMuMjUsIDI6IDIwMH0KKyAgICA+Pj4KKworV2UgY2FuIGFsc28gdXNlIHRoZSBuZXcgdHlwZSBpbiBjb250ZXh0cyB3aGVyZSBjbGFzc2ljIG9ubHkgYWxsb3dzICJyZWFsIgorZGljdGlvbmFyaWVzLCBzdWNoIGFzIHRoZSBsb2NhbHMvZ2xvYmFscyBkaWN0aW9uYXJpZXMgZm9yIHRoZSBleGVjCitzdGF0ZW1lbnQgb3IgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGV2YWwoKToKKworICAgID4+PiBkZWYgc29ydGVkKHNlcSk6CisgICAgLi4uICAgICBzZXEuc29ydChrZXk9c3RyKQorICAgIC4uLiAgICAgcmV0dXJuIHNlcQorICAgID4+PiBwcmludCBzb3J0ZWQoYS5rZXlzKCkpCisgICAgWzEsIDJdCisgICAgPj4+IGV4ZWMgInggPSAzOyBwcmludCB4IiBpbiBhCisgICAgMworICAgID4+PiBwcmludCBzb3J0ZWQoYS5rZXlzKCkpCisgICAgWzEsIDIsICdfX2J1aWx0aW5zX18nLCAneCddCisgICAgPj4+IHByaW50IGFbJ3gnXQorICAgIDMKKyAgICA+Pj4KKworTm93IEknbGwgc2hvdyB0aGF0IGRlZmF1bHRkaWN0IGluc3RhbmNlcyBoYXZlIGR5bmFtaWMgaW5zdGFuY2UgdmFyaWFibGVzLAoranVzdCBsaWtlIGNsYXNzaWMgY2xhc3NlczoKKworICAgID4+PiBhLmRlZmF1bHQgPSAtMQorICAgID4+PiBwcmludCBhWyJub3dheSJdCisgICAgLTEKKyAgICA+Pj4gYS5kZWZhdWx0ID0gLTEwMDAKKyAgICA+Pj4gcHJpbnQgYVsibm93YXkiXQorICAgIC0xMDAwCisgICAgPj4+ICdkZWZhdWx0JyBpbiBkaXIoYSkKKyAgICBUcnVlCisgICAgPj4+IGEueDEgPSAxMDAKKyAgICA+Pj4gYS54MiA9IDIwMAorICAgID4+PiBwcmludCBhLngxCisgICAgMTAwCisgICAgPj4+IGQgPSBkaXIoYSkKKyAgICA+Pj4gJ2RlZmF1bHQnIGluIGQgYW5kICd4MScgaW4gZCBhbmQgJ3gyJyBpbiBkCisgICAgVHJ1ZQorICAgID4+PiBwcmludCBzb3J0ZGljdChhLl9fZGljdF9fKQorICAgIHsnZGVmYXVsdCc6IC0xMDAwLCAneDEnOiAxMDAsICd4Mic6IDIwMH0KKyAgICA+Pj4KKyIiIgorCitjbGFzcyBkZWZhdWx0ZGljdDIoZGljdCk6CisgICAgX19zbG90c19fID0gWydkZWZhdWx0J10KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICBkaWN0Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuZGVmYXVsdCA9IGRlZmF1bHQKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZGljdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlZmF1bHQKKworICAgIGRlZiBnZXQoc2VsZiwga2V5LCAqYXJncyk6CisgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgYXJncyA9IChzZWxmLmRlZmF1bHQsKQorICAgICAgICByZXR1cm4gZGljdC5nZXQoc2VsZiwga2V5LCAqYXJncykKKworICAgIGRlZiBtZXJnZShzZWxmLCBvdGhlcik6CisgICAgICAgIGZvciBrZXkgaW4gb3RoZXI6CisgICAgICAgICAgICBpZiBrZXkgbm90IGluIHNlbGY6CisgICAgICAgICAgICAgICAgc2VsZltrZXldID0gb3RoZXJba2V5XQorCit0ZXN0XzIgPSAiIiIKKworVGhlIF9fc2xvdHNfXyBkZWNsYXJhdGlvbiB0YWtlcyBhIGxpc3Qgb2YgaW5zdGFuY2UgdmFyaWFibGVzLCBhbmQgcmVzZXJ2ZXMKK3NwYWNlIGZvciBleGFjdGx5IHRoZXNlIGluIHRoZSBpbnN0YW5jZS4gV2hlbiBfX3Nsb3RzX18gaXMgdXNlZCwgb3RoZXIKK2luc3RhbmNlIHZhcmlhYmxlcyBjYW5ub3QgYmUgYXNzaWduZWQgdG86CisKKyAgICA+Pj4gYSA9IGRlZmF1bHRkaWN0MihkZWZhdWx0PTAuMCkKKyAgICA+Pj4gYVsxXQorICAgIDAuMAorICAgID4+PiBhLmRlZmF1bHQgPSAtMQorICAgID4+PiBhWzFdCisgICAgLTEKKyAgICA+Pj4gYS54MSA9IDEKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CisgICAgQXR0cmlidXRlRXJyb3I6ICdkZWZhdWx0ZGljdDInIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICd4MScKKyAgICA+Pj4KKworIiIiCisKK3Rlc3RfMyA9ICIiIgorCitJbnRyb3NwZWN0aW5nIGluc3RhbmNlcyBvZiBidWlsdC1pbiB0eXBlcworCitGb3IgaW5zdGFuY2Ugb2YgYnVpbHQtaW4gdHlwZXMsIHguX19jbGFzc19fIGlzIG5vdyB0aGUgc2FtZSBhcyB0eXBlKHgpOgorCisgICAgPj4+IHR5cGUoW10pCisgICAgPHR5cGUgJ2xpc3QnPgorICAgID4+PiBbXS5fX2NsYXNzX18KKyAgICA8dHlwZSAnbGlzdCc+CisgICAgPj4+IGxpc3QKKyAgICA8dHlwZSAnbGlzdCc+CisgICAgPj4+IGlzaW5zdGFuY2UoW10sIGxpc3QpCisgICAgVHJ1ZQorICAgID4+PiBpc2luc3RhbmNlKFtdLCBkaWN0KQorICAgIEZhbHNlCisgICAgPj4+IGlzaW5zdGFuY2UoW10sIG9iamVjdCkKKyAgICBUcnVlCisgICAgPj4+CisKK1VuZGVyIHRoZSBuZXcgcHJvcG9zYWwsIHRoZSBfX21ldGhvZHNfXyBhdHRyaWJ1dGUgbm8gbG9uZ2VyIGV4aXN0czoKKworICAgID4+PiBbXS5fX21ldGhvZHNfXworICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KKyAgICBBdHRyaWJ1dGVFcnJvcjogJ2xpc3QnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdfX21ldGhvZHNfXycKKyAgICA+Pj4KKworSW5zdGVhZCwgeW91IGNhbiBnZXQgdGhlIHNhbWUgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGlzdCB0eXBlOgorCisgICAgPj4+IHBwcmludC5wcHJpbnQoZGlyKGxpc3QpKSAgICAjIGxpa2UgbGlzdC5fX2RpY3RfXy5rZXlzKCksIGJ1dCBzb3J0ZWQKKyAgICBbJ19fYWRkX18nLAorICAgICAnX19jbGFzc19fJywKKyAgICAgJ19fY29udGFpbnNfXycsCisgICAgICdfX2RlbGF0dHJfXycsCisgICAgICdfX2RlbGl0ZW1fXycsCisgICAgICdfX2RlbHNsaWNlX18nLAorICAgICAnX19kb2NfXycsCisgICAgICdfX2VxX18nLAorICAgICAnX19mb3JtYXRfXycsCisgICAgICdfX2dlX18nLAorICAgICAnX19nZXRhdHRyaWJ1dGVfXycsCisgICAgICdfX2dldGl0ZW1fXycsCisgICAgICdfX2dldHNsaWNlX18nLAorICAgICAnX19ndF9fJywKKyAgICAgJ19faGFzaF9fJywKKyAgICAgJ19faWFkZF9fJywKKyAgICAgJ19faW11bF9fJywKKyAgICAgJ19faW5pdF9fJywKKyAgICAgJ19faXRlcl9fJywKKyAgICAgJ19fbGVfXycsCisgICAgICdfX2xlbl9fJywKKyAgICAgJ19fbHRfXycsCisgICAgICdfX211bF9fJywKKyAgICAgJ19fbmVfXycsCisgICAgICdfX25ld19fJywKKyAgICAgJ19fcmVkdWNlX18nLAorICAgICAnX19yZWR1Y2VfZXhfXycsCisgICAgICdfX3JlcHJfXycsCisgICAgICdfX3JldmVyc2VkX18nLAorICAgICAnX19ybXVsX18nLAorICAgICAnX19zZXRhdHRyX18nLAorICAgICAnX19zZXRpdGVtX18nLAorICAgICAnX19zZXRzbGljZV9fJywKKyAgICAgJ19fc2l6ZW9mX18nLAorICAgICAnX19zdHJfXycsCisgICAgICdfX3N1YmNsYXNzaG9va19fJywKKyAgICAgJ2FwcGVuZCcsCisgICAgICdjb3VudCcsCisgICAgICdleHRlbmQnLAorICAgICAnaW5kZXgnLAorICAgICAnaW5zZXJ0JywKKyAgICAgJ3BvcCcsCisgICAgICdyZW1vdmUnLAorICAgICAncmV2ZXJzZScsCisgICAgICdzb3J0J10KKworVGhlIG5ldyBpbnRyb3NwZWN0aW9uIEFQSSBnaXZlcyBtb3JlIGluZm9ybWF0aW9uIHRoYW4gdGhlIG9sZCBvbmU6ICBpbgorYWRkaXRpb24gdG8gdGhlIHJlZ3VsYXIgbWV0aG9kcywgaXQgYWxzbyBzaG93cyB0aGUgbWV0aG9kcyB0aGF0IGFyZQorbm9ybWFsbHkgaW52b2tlZCB0aHJvdWdoIHNwZWNpYWwgbm90YXRpb25zLCBlLmcuIF9faWFkZF9fICgrPSksIF9fbGVuX18KKyhsZW4pLCBfX25lX18gKCE9KS4gWW91IGNhbiBpbnZva2UgYW55IG1ldGhvZCBmcm9tIHRoaXMgbGlzdCBkaXJlY3RseToKKworICAgID4+PiBhID0gWyd0aWMnLCAndGFjJ10KKyAgICA+Pj4gbGlzdC5fX2xlbl9fKGEpICAgICAgICAgICMgc2FtZSBhcyBsZW4oYSkKKyAgICAyCisgICAgPj4+IGEuX19sZW5fXygpICAgICAgICAgICAgICAjIGRpdHRvCisgICAgMgorICAgID4+PiBsaXN0LmFwcGVuZChhLCAndG9lJykgICAgIyBzYW1lIGFzIGEuYXBwZW5kKCd0b2UnKQorICAgID4+PiBhCisgICAgWyd0aWMnLCAndGFjJywgJ3RvZSddCisgICAgPj4+CisKK1RoaXMgaXMganVzdCBsaWtlIGl0IGlzIGZvciB1c2VyLWRlZmluZWQgY2xhc3Nlcy4KKyIiIgorCit0ZXN0XzQgPSAiIiIKKworU3RhdGljIG1ldGhvZHMgYW5kIGNsYXNzIG1ldGhvZHMKKworVGhlIG5ldyBpbnRyb3NwZWN0aW9uIEFQSSBtYWtlcyBpdCBwb3NzaWJsZSB0byBhZGQgc3RhdGljIG1ldGhvZHMgYW5kIGNsYXNzCittZXRob2RzLiBTdGF0aWMgbWV0aG9kcyBhcmUgZWFzeSB0byBkZXNjcmliZTogdGhleSBiZWhhdmUgcHJldHR5IG11Y2ggbGlrZQorc3RhdGljIG1ldGhvZHMgaW4gQysrIG9yIEphdmEuIEhlcmUncyBhbiBleGFtcGxlOgorCisgICAgPj4+IGNsYXNzIEM6CisgICAgLi4uCisgICAgLi4uICAgICBAc3RhdGljbWV0aG9kCisgICAgLi4uICAgICBkZWYgZm9vKHgsIHkpOgorICAgIC4uLiAgICAgICAgIHByaW50ICJzdGF0aWNtZXRob2QiLCB4LCB5CisKKyAgICA+Pj4gQy5mb28oMSwgMikKKyAgICBzdGF0aWNtZXRob2QgMSAyCisgICAgPj4+IGMgPSBDKCkKKyAgICA+Pj4gYy5mb28oMSwgMikKKyAgICBzdGF0aWNtZXRob2QgMSAyCisKK0NsYXNzIG1ldGhvZHMgdXNlIGEgc2ltaWxhciBwYXR0ZXJuIHRvIGRlY2xhcmUgbWV0aG9kcyB0aGF0IHJlY2VpdmUgYW4KK2ltcGxpY2l0IGZpcnN0IGFyZ3VtZW50IHRoYXQgaXMgdGhlICpjbGFzcyogZm9yIHdoaWNoIHRoZXkgYXJlIGludm9rZWQuCisKKyAgICA+Pj4gY2xhc3MgQzoKKyAgICAuLi4gICAgIEBjbGFzc21ldGhvZAorICAgIC4uLiAgICAgZGVmIGZvbyhjbHMsIHkpOgorICAgIC4uLiAgICAgICAgIHByaW50ICJjbGFzc21ldGhvZCIsIGNscywgeQorCisgICAgPj4+IEMuZm9vKDEpCisgICAgY2xhc3NtZXRob2QgdGVzdC50ZXN0X2Rlc2NydHV0LkMgMQorICAgID4+PiBjID0gQygpCisgICAgPj4+IGMuZm9vKDEpCisgICAgY2xhc3NtZXRob2QgdGVzdC50ZXN0X2Rlc2NydHV0LkMgMQorCisgICAgPj4+IGNsYXNzIEQoQyk6CisgICAgLi4uICAgICBwYXNzCisKKyAgICA+Pj4gRC5mb28oMSkKKyAgICBjbGFzc21ldGhvZCB0ZXN0LnRlc3RfZGVzY3J0dXQuRCAxCisgICAgPj4+IGQgPSBEKCkKKyAgICA+Pj4gZC5mb28oMSkKKyAgICBjbGFzc21ldGhvZCB0ZXN0LnRlc3RfZGVzY3J0dXQuRCAxCisKK1RoaXMgcHJpbnRzICJjbGFzc21ldGhvZCBfX21haW5fXy5EIDEiIGJvdGggdGltZXM7IGluIG90aGVyIHdvcmRzLCB0aGUKK2NsYXNzIHBhc3NlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQgb2YgZm9vKCkgaXMgdGhlIGNsYXNzIGludm9sdmVkIGluIHRoZQorY2FsbCwgbm90IHRoZSBjbGFzcyBpbnZvbHZlZCBpbiB0aGUgZGVmaW5pdGlvbiBvZiBmb28oKS4KKworQnV0IG5vdGljZSB0aGlzOgorCisgICAgPj4+IGNsYXNzIEUoQyk6CisgICAgLi4uICAgICBAY2xhc3NtZXRob2QKKyAgICAuLi4gICAgIGRlZiBmb28oY2xzLCB5KTogIyBvdmVycmlkZSBDLmZvbworICAgIC4uLiAgICAgICAgIHByaW50ICJFLmZvbygpIGNhbGxlZCIKKyAgICAuLi4gICAgICAgICBDLmZvbyh5KQorCisgICAgPj4+IEUuZm9vKDEpCisgICAgRS5mb28oKSBjYWxsZWQKKyAgICBjbGFzc21ldGhvZCB0ZXN0LnRlc3RfZGVzY3J0dXQuQyAxCisgICAgPj4+IGUgPSBFKCkKKyAgICA+Pj4gZS5mb28oMSkKKyAgICBFLmZvbygpIGNhbGxlZAorICAgIGNsYXNzbWV0aG9kIHRlc3QudGVzdF9kZXNjcnR1dC5DIDEKKworSW4gdGhpcyBleGFtcGxlLCB0aGUgY2FsbCB0byBDLmZvbygpIGZyb20gRS5mb28oKSB3aWxsIHNlZSBjbGFzcyBDIGFzIGl0cworZmlyc3QgYXJndW1lbnQsIG5vdCBjbGFzcyBFLiBUaGlzIGlzIHRvIGJlIGV4cGVjdGVkLCBzaW5jZSB0aGUgY2FsbAorc3BlY2lmaWVzIHRoZSBjbGFzcyBDLiBCdXQgaXQgc3RyZXNzZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVzZSBjbGFzcworbWV0aG9kcyBhbmQgbWV0aG9kcyBkZWZpbmVkIGluIG1ldGFjbGFzc2VzICh3aGVyZSBhbiB1cGNhbGwgdG8gYSBtZXRhbWV0aG9kCit3b3VsZCBwYXNzIHRoZSB0YXJnZXQgY2xhc3MgYXMgYW4gZXhwbGljaXQgZmlyc3QgYXJndW1lbnQpLgorIiIiCisKK3Rlc3RfNSA9ICIiIgorCitBdHRyaWJ1dGVzIGRlZmluZWQgYnkgZ2V0L3NldCBtZXRob2RzCisKKworICAgID4+PiBjbGFzcyBwcm9wZXJ0eShvYmplY3QpOgorICAgIC4uLgorICAgIC4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGdldCwgc2V0PU5vbmUpOgorICAgIC4uLiAgICAgICAgIHNlbGYuX19nZXQgPSBnZXQKKyAgICAuLi4gICAgICAgICBzZWxmLl9fc2V0ID0gc2V0CisgICAgLi4uCisgICAgLi4uICAgICBkZWYgX19nZXRfXyhzZWxmLCBpbnN0LCB0eXBlPU5vbmUpOgorICAgIC4uLiAgICAgICAgIHJldHVybiBzZWxmLl9fZ2V0KGluc3QpCisgICAgLi4uCisgICAgLi4uICAgICBkZWYgX19zZXRfXyhzZWxmLCBpbnN0LCB2YWx1ZSk6CisgICAgLi4uICAgICAgICAgaWYgc2VsZi5fX3NldCBpcyBOb25lOgorICAgIC4uLiAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgInRoaXMgYXR0cmlidXRlIGlzIHJlYWQtb25seSIKKyAgICAuLi4gICAgICAgICByZXR1cm4gc2VsZi5fX3NldChpbnN0LCB2YWx1ZSkKKworTm93IGxldCdzIGRlZmluZSBhIGNsYXNzIHdpdGggYW4gYXR0cmlidXRlIHggZGVmaW5lZCBieSBhIHBhaXIgb2YgbWV0aG9kcywKK2dldHgoKSBhbmQgc2V0eCgpOgorCisgICAgPj4+IGNsYXNzIEMob2JqZWN0KToKKyAgICAuLi4KKyAgICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAuLi4gICAgICAgICBzZWxmLl9feCA9IDAKKyAgICAuLi4KKyAgICAuLi4gICAgIGRlZiBnZXR4KHNlbGYpOgorICAgIC4uLiAgICAgICAgIHJldHVybiBzZWxmLl9feAorICAgIC4uLgorICAgIC4uLiAgICAgZGVmIHNldHgoc2VsZiwgeCk6CisgICAgLi4uICAgICAgICAgaWYgeCA8IDA6IHggPSAwCisgICAgLi4uICAgICAgICAgc2VsZi5fX3ggPSB4CisgICAgLi4uCisgICAgLi4uICAgICB4ID0gcHJvcGVydHkoZ2V0eCwgc2V0eCkKKworSGVyZSdzIGEgc21hbGwgZGVtb25zdHJhdGlvbjoKKworICAgID4+PiBhID0gQygpCisgICAgPj4+IGEueCA9IDEwCisgICAgPj4+IHByaW50IGEueAorICAgIDEwCisgICAgPj4+IGEueCA9IC0xMAorICAgID4+PiBwcmludCBhLngKKyAgICAwCisgICAgPj4+CisKK0htbSAtLSBwcm9wZXJ0eSBpcyBidWlsdGluIG5vdywgc28gbGV0J3MgdHJ5IGl0IHRoYXQgd2F5IHRvby4KKworICAgID4+PiBkZWwgcHJvcGVydHkgICMgdW5tYXNrIHRoZSBidWlsdGluCisgICAgPj4+IHByb3BlcnR5CisgICAgPHR5cGUgJ3Byb3BlcnR5Jz4KKworICAgID4+PiBjbGFzcyBDKG9iamVjdCk6CisgICAgLi4uICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgLi4uICAgICAgICAgc2VsZi5fX3ggPSAwCisgICAgLi4uICAgICBkZWYgZ2V0eChzZWxmKToKKyAgICAuLi4gICAgICAgICByZXR1cm4gc2VsZi5fX3gKKyAgICAuLi4gICAgIGRlZiBzZXR4KHNlbGYsIHgpOgorICAgIC4uLiAgICAgICAgIGlmIHggPCAwOiB4ID0gMAorICAgIC4uLiAgICAgICAgIHNlbGYuX194ID0geAorICAgIC4uLiAgICAgeCA9IHByb3BlcnR5KGdldHgsIHNldHgpCisKKworICAgID4+PiBhID0gQygpCisgICAgPj4+IGEueCA9IDEwCisgICAgPj4+IHByaW50IGEueAorICAgIDEwCisgICAgPj4+IGEueCA9IC0xMAorICAgID4+PiBwcmludCBhLngKKyAgICAwCisgICAgPj4+CisiIiIKKwordGVzdF82ID0gIiIiCisKK01ldGhvZCByZXNvbHV0aW9uIG9yZGVyCisKK1RoaXMgZXhhbXBsZSBpcyBpbXBsaWNpdCBpbiB0aGUgd3JpdGV1cC4KKworPj4+IGNsYXNzIEE6ICAgICMgY2xhc3NpYyBjbGFzcworLi4uICAgICBkZWYgc2F2ZShzZWxmKToKKy4uLiAgICAgICAgIHByaW50ICJjYWxsZWQgQS5zYXZlKCkiCis+Pj4gY2xhc3MgQihBKToKKy4uLiAgICAgcGFzcworPj4+IGNsYXNzIEMoQSk6CisuLi4gICAgIGRlZiBzYXZlKHNlbGYpOgorLi4uICAgICAgICAgcHJpbnQgImNhbGxlZCBDLnNhdmUoKSIKKz4+PiBjbGFzcyBEKEIsIEMpOgorLi4uICAgICBwYXNzCisKKz4+PiBEKCkuc2F2ZSgpCitjYWxsZWQgQS5zYXZlKCkKKworPj4+IGNsYXNzIEEob2JqZWN0KTogICMgbmV3IGNsYXNzCisuLi4gICAgIGRlZiBzYXZlKHNlbGYpOgorLi4uICAgICAgICAgcHJpbnQgImNhbGxlZCBBLnNhdmUoKSIKKz4+PiBjbGFzcyBCKEEpOgorLi4uICAgICBwYXNzCis+Pj4gY2xhc3MgQyhBKToKKy4uLiAgICAgZGVmIHNhdmUoc2VsZik6CisuLi4gICAgICAgICBwcmludCAiY2FsbGVkIEMuc2F2ZSgpIgorPj4+IGNsYXNzIEQoQiwgQyk6CisuLi4gICAgIHBhc3MKKworPj4+IEQoKS5zYXZlKCkKK2NhbGxlZCBDLnNhdmUoKQorIiIiCisKK2NsYXNzIEEob2JqZWN0KToKKyAgICBkZWYgbShzZWxmKToKKyAgICAgICAgcmV0dXJuICJBIgorCitjbGFzcyBCKEEpOgorICAgIGRlZiBtKHNlbGYpOgorICAgICAgICByZXR1cm4gIkIiICsgc3VwZXIoQiwgc2VsZikubSgpCisKK2NsYXNzIEMoQSk6CisgICAgZGVmIG0oc2VsZik6CisgICAgICAgIHJldHVybiAiQyIgKyBzdXBlcihDLCBzZWxmKS5tKCkKKworY2xhc3MgRChDLCBCKToKKyAgICBkZWYgbShzZWxmKToKKyAgICAgICAgcmV0dXJuICJEIiArIHN1cGVyKEQsIHNlbGYpLm0oKQorCisKK3Rlc3RfNyA9ICIiIgorCitDb29wZXJhdGl2ZSBtZXRob2RzIGFuZCAic3VwZXIiCisKKz4+PiBwcmludCBEKCkubSgpICMgIkRDQkEiCitEQ0JBCisiIiIKKwordGVzdF84ID0gIiIiCisKK0JhY2t3YXJkcyBpbmNvbXBhdGliaWxpdGllcworCis+Pj4gY2xhc3MgQToKKy4uLiAgICAgZGVmIGZvbyhzZWxmKToKKy4uLiAgICAgICAgIHByaW50ICJjYWxsZWQgQS5mb28oKSIKKworPj4+IGNsYXNzIEIoQSk6CisuLi4gICAgIHBhc3MKKworPj4+IGNsYXNzIEMoQSk6CisuLi4gICAgIGRlZiBmb28oc2VsZik6CisuLi4gICAgICAgICBCLmZvbyhzZWxmKQorCis+Pj4gQygpLmZvbygpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgLi4uCitUeXBlRXJyb3I6IHVuYm91bmQgbWV0aG9kIGZvbygpIG11c3QgYmUgY2FsbGVkIHdpdGggQiBpbnN0YW5jZSBhcyBmaXJzdCBhcmd1bWVudCAoZ290IEMgaW5zdGFuY2UgaW5zdGVhZCkKKworPj4+IGNsYXNzIEMoQSk6CisuLi4gICAgIGRlZiBmb28oc2VsZik6CisuLi4gICAgICAgICBBLmZvbyhzZWxmKQorPj4+IEMoKS5mb28oKQorY2FsbGVkIEEuZm9vKCkKKyIiIgorCitfX3Rlc3RfXyA9IHsidHV0MSI6IHRlc3RfMSwKKyAgICAgICAgICAgICJ0dXQyIjogdGVzdF8yLAorICAgICAgICAgICAgInR1dDMiOiB0ZXN0XzMsCisgICAgICAgICAgICAidHV0NCI6IHRlc3RfNCwKKyAgICAgICAgICAgICJ0dXQ1IjogdGVzdF81LAorICAgICAgICAgICAgInR1dDYiOiB0ZXN0XzYsCisgICAgICAgICAgICAidHV0NyI6IHRlc3RfNywKKyAgICAgICAgICAgICJ0dXQ4IjogdGVzdF84fQorCisjIE1hZ2ljIHRlc3QgbmFtZSB0aGF0IHJlZ3J0ZXN0LnB5IGludm9rZXMgKmFmdGVyKiBpbXBvcnRpbmcgdGhpcyBtb2R1bGUuCisjIFRoaXMgd29ybXMgYXJvdW5kIGEgYm9vdHN0cmFwIHByb2JsZW0uCisjIE5vdGUgdGhhdCBkb2N0ZXN0IGFuZCByZWdydGVzdCBib3RoIGxvb2sgaW4gc3lzLmFyZ3YgZm9yIGEgIi12IiBhcmd1bWVudCwKKyMgc28gdGhpcyB3b3JrcyBhcyBleHBlY3RlZCBpbiBib3RoIHdheXMgb2YgcnVubmluZyByZWdydGVzdC4KK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICAjIE9ic2N1cmU6ICBpbXBvcnQgdGhpcyBtb2R1bGUgYXMgdGVzdC50ZXN0X2Rlc2NydHV0IGluc3RlYWQgb2YgYXMKKyAgICAjIHBsYWluIHRlc3RfZGVzY3J0dXQgYmVjYXVzZSB0aGUgbmFtZSBvZiB0aGlzIG1vZHVsZSB3b3JrcyBpdHMgd2F5CisgICAgIyBpbnRvIHRoZSBkb2N0ZXN0IGV4YW1wbGVzLCBhbmQgdW5sZXNzIHRoZSBmdWxsIHRlc3QudGVzdF9kZXNjcnR1dAorICAgICMgYnVzaW5lc3MgaXMgdXNlZCB0aGUgbmFtZSBjYW4gY2hhbmdlIGRlcGVuZGluZyBvbiBob3cgdGhlIHRlc3QgaXMKKyAgICAjIGludm9rZWQuCisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQsIHRlc3RfZGVzY3J0dXQKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9kZXNjcnR1dCwgdmVyYm9zZSkKKworIyBUaGlzIHBhcnQgaXNuJ3QgbmVlZGVkIGZvciByZWdydGVzdCwgYnV0IGZvciBydW5uaW5nIHRoZSB0ZXN0IGRpcmVjdGx5LgoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oMSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NydHV0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NydHV0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGIyN2E1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3J0dXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NydHV0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NydHV0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGIyN2E1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3J0dXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NDBmNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0LnB5CkBAIC0wLDAgKzEsNzA0IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2ltcG9ydCBVc2VyRGljdCwgcmFuZG9tLCBzdHJpbmcKK2ltcG9ydCBnYywgd2Vha3JlZgorCisKK2NsYXNzIERpY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgIyBjYWxsaW5nIGJ1aWx0LWluIHR5cGVzIHdpdGhvdXQgYXJndW1lbnQgbXVzdCByZXR1cm4gZW1wdHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0KCksIHt9KQorICAgICAgICBzZWxmLmFzc2VydElzTm90KGRpY3QoKSwge30pCisKKyAgICBkZWYgdGVzdF9saXRlcmFsX2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICAjIGNoZWNrIGxpdGVyYWwgY29uc3RydWN0b3IgZm9yIGRpZmZlcmVudCBzaXplZCBkaWN0cworICAgICAgICAjICh0byBleGVyY2lzZSB0aGUgQlVJTERfTUFQIG9wYXJnKS4KKyAgICAgICAgZm9yIG4gaW4gKDAsIDEsIDYsIDI1NiwgNDAwKToKKyAgICAgICAgICAgIGl0ZW1zID0gWygnJy5qb2luKHJhbmRvbS5zYW1wbGUoc3RyaW5nLmxldHRlcnMsIDgpKSwgaSkKKyAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG4pXQorICAgICAgICAgICAgcmFuZG9tLnNodWZmbGUoaXRlbXMpCisgICAgICAgICAgICBmb3JtYXR0ZWRfaXRlbXMgPSAoJ3shcn06IHs6ZH0nLmZvcm1hdChrLCB2KSBmb3IgaywgdiBpbiBpdGVtcykKKyAgICAgICAgICAgIGRpY3RsaXRlcmFsID0gJ3snICsgJywgJy5qb2luKGZvcm1hdHRlZF9pdGVtcykgKyAnfScKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChkaWN0bGl0ZXJhbCksIGRpY3QoaXRlbXMpKQorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhub3Qge30sIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh7MTogMn0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYm9vbCh7fSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKGJvb2woezE6IDJ9KSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2tleXMoc2VsZik6CisgICAgICAgIGQgPSB7fQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQua2V5cygpLCBbXSkKKyAgICAgICAgZCA9IHsnYSc6IDEsICdiJzogMn0KKyAgICAgICAgayA9IGQua2V5cygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmhhc19rZXkoJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaGFzX2tleSgnYicpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5rZXlzLCBOb25lKQorCisgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgorICAgICAgICBkID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnZhbHVlcygpLCBbXSkKKyAgICAgICAgZCA9IHsxOjJ9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC52YWx1ZXMoKSwgWzJdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC52YWx1ZXMsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9pdGVtcyhzZWxmKToKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pdGVtcygpLCBbXSkKKworICAgICAgICBkID0gezE6Mn0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLml0ZW1zKCksIFsoMSwgMildKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5pdGVtcywgTm9uZSkKKworICAgIGRlZiB0ZXN0X2hhc19rZXkoc2VsZik6CisgICAgICAgIGQgPSB7fQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGQuaGFzX2tleSgnYScpKQorICAgICAgICBkID0geydhJzogMSwgJ2InOiAyfQorICAgICAgICBrID0gZC5rZXlzKCkKKyAgICAgICAgay5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBbJ2EnLCAnYiddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5oYXNfa2V5KQorCisgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CisgICAgICAgIGQgPSB7fQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdhJywgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgnYScgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBub3QgaW4gZCkKKyAgICAgICAgZCA9IHsnYSc6IDEsICdiJzogMn0KKyAgICAgICAgc2VsZi5hc3NlcnRJbignYScsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2InLCBkKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdjJywgZCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuX19jb250YWluc19fKQorCisgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgorICAgICAgICBkID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDApCisgICAgICAgIGQgPSB7J2EnOiAxLCAnYic6IDJ9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAyKQorCisgICAgZGVmIHRlc3RfZ2V0aXRlbShzZWxmKToKKyAgICAgICAgZCA9IHsnYSc6IDEsICdiJzogMn0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydhJ10sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYiddLCAyKQorICAgICAgICBkWydjJ10gPSAzCisgICAgICAgIGRbJ2EnXSA9IDQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydjJ10sIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYSddLCA0KQorICAgICAgICBkZWwgZFsnYiddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgeydhJzogNCwgJ2MnOiAzfSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuX19nZXRpdGVtX18pCisKKyAgICAgICAgY2xhc3MgQmFkRXEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDI0CisKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGRbQmFkRXEoKV0gPSA0MgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5fX2dldGl0ZW1fXywgMjMpCisKKyAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKKworICAgICAgICBjbGFzcyBCYWRIYXNoKG9iamVjdCk6CisgICAgICAgICAgICBmYWlsID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmZhaWw6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisKKyAgICAgICAgeCA9IEJhZEhhc2goKQorICAgICAgICBkW3hdID0gNDIKKyAgICAgICAgeC5mYWlsID0gVHJ1ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGQuX19nZXRpdGVtX18sIHgpCisKKyAgICBkZWYgdGVzdF9jbGVhcihzZWxmKToKKyAgICAgICAgZCA9IHsxOjEsIDI6MiwgMzozfQorICAgICAgICBkLmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7fSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuY2xlYXIsIE5vbmUpCisKKyAgICBkZWYgdGVzdF91cGRhdGUoc2VsZik6CisgICAgICAgIGQgPSB7fQorICAgICAgICBkLnVwZGF0ZSh7MToxMDB9KQorICAgICAgICBkLnVwZGF0ZSh7MjoyMH0pCisgICAgICAgIGQudXBkYXRlKHsxOjEsIDI6MiwgMzozfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7MToxLCAyOjIsIDM6M30pCisKKyAgICAgICAgZC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHsxOjEsIDI6MiwgMzozfSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciksIGQudXBkYXRlLCBOb25lKQorCisgICAgICAgIGNsYXNzIFNpbXBsZVVzZXJEaWN0OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZCA9IHsxOjEsIDI6MiwgMzozfQorICAgICAgICAgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZC5rZXlzKCkKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kW2ldCisgICAgICAgIGQuY2xlYXIoKQorICAgICAgICBkLnVwZGF0ZShTaW1wbGVVc2VyRGljdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHsxOjEsIDI6MiwgMzozfSkKKworICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKTogcGFzcworCisgICAgICAgIGQuY2xlYXIoKQorICAgICAgICBjbGFzcyBGYWlsaW5nVXNlckRpY3Q6CisgICAgICAgICAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBkLnVwZGF0ZSwgRmFpbGluZ1VzZXJEaWN0KCkpCisKKyAgICAgICAgY2xhc3MgRmFpbGluZ1VzZXJEaWN0OgorICAgICAgICAgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICAgICAgICAgY2xhc3MgQm9nb25JdGVyOgorICAgICAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmkgPSAxCisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5pOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaSA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2EnCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGMKKyAgICAgICAgICAgICAgICByZXR1cm4gQm9nb25JdGVyKCkKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiBrZXkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBkLnVwZGF0ZSwgRmFpbGluZ1VzZXJEaWN0KCkpCisKKyAgICAgICAgY2xhc3MgRmFpbGluZ1VzZXJEaWN0OgorICAgICAgICAgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICAgICAgICAgY2xhc3MgQm9nb25JdGVyOgorICAgICAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmkgPSBvcmQoJ2EnKQorICAgICAgICAgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuaSA8PSBvcmQoJ3onKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydG4gPSBjaHIoc2VsZi5pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ0bgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIHJldHVybiBCb2dvbkl0ZXIoKQorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgZC51cGRhdGUsIEZhaWxpbmdVc2VyRGljdCgpKQorCisgICAgICAgIGNsYXNzIGJhZHNlcShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Yywge30udXBkYXRlLCBiYWRzZXEoKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB7fS51cGRhdGUsIFsoMSwgMiwgMyldKQorCisgICAgZGVmIHRlc3RfZnJvbWtleXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdC5mcm9ta2V5cygnYWJjJyksIHsnYSc6Tm9uZSwgJ2InOk5vbmUsICdjJzpOb25lfSkKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoZC5mcm9ta2V5cygnYWJjJyksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mcm9ta2V5cygnYWJjJyksIHsnYSc6Tm9uZSwgJ2InOk5vbmUsICdjJzpOb25lfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZyb21rZXlzKCg0LDUpLDApLCB7NDowLCA1OjB9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZnJvbWtleXMoW10pLCB7fSkKKyAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgIHlpZWxkIDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZyb21rZXlzKGcoKSksIHsxOk5vbmV9KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9LmZyb21rZXlzLCAzKQorICAgICAgICBjbGFzcyBkaWN0bGlrZShkaWN0KTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3RsaWtlLmZyb21rZXlzKCdhJyksIHsnYSc6Tm9uZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdGxpa2UoKS5mcm9ta2V5cygnYScpLCB7J2EnOk5vbmV9KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZGljdGxpa2UuZnJvbWtleXMoJ2EnKSwgZGljdGxpa2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkaWN0bGlrZSgpLmZyb21rZXlzKCdhJyksIGRpY3RsaWtlKQorICAgICAgICBjbGFzcyBteWRpY3QoZGljdCk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMpOgorICAgICAgICAgICAgICAgIHJldHVybiBVc2VyRGljdC5Vc2VyRGljdCgpCisgICAgICAgIHVkID0gbXlkaWN0LmZyb21rZXlzKCdhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodWQsIHsnYSc6Tm9uZSwgJ2InOk5vbmV9KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodWQsIFVzZXJEaWN0LlVzZXJEaWN0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRpY3QuZnJvbWtleXMpCisKKyAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKKworICAgICAgICBjbGFzcyBiYWRkaWN0MShkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgYmFkZGljdDEuZnJvbWtleXMsIFsxXSkKKworICAgICAgICBjbGFzcyBCYWRTZXEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjKCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGRpY3QuZnJvbWtleXMsIEJhZFNlcSgpKQorCisgICAgICAgIGNsYXNzIGJhZGRpY3QyKGRpY3QpOgorICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBiYWRkaWN0Mi5mcm9ta2V5cywgWzFdKQorCisgICAgICAgICMgdGVzdCBmYXN0IHBhdGggZm9yIGRpY3Rpb25hcnkgaW5wdXRzCisgICAgICAgIGQgPSBkaWN0KHppcChyYW5nZSg2KSwgcmFuZ2UoNikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3QuZnJvbWtleXMoZCwgMCksIGRpY3QoemlwKHJhbmdlKDYpLCBbMF0qNikpKQorCisgICAgICAgIGNsYXNzIGJhZGRpY3QzKGRpY3QpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZAorICAgICAgICBkID0ge2kgOiBpIGZvciBpIGluIHJhbmdlKDEwKX0KKyAgICAgICAgcmVzID0gZC5jb3B5KCkKKyAgICAgICAgcmVzLnVwZGF0ZShhPU5vbmUsIGI9Tm9uZSwgYz1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhZGRpY3QzLmZyb21rZXlzKHsiYSIsICJiIiwgImMifSksIHJlcykKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIGQgPSB7MToxLCAyOjIsIDM6M30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmNvcHkoKSwgezE6MSwgMjoyLCAzOjN9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHt9LmNvcHkoKSwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5jb3B5LCBOb25lKQorCisgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgorICAgICAgICBkID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRJcyhkLmdldCgnYycpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdjJywgMyksIDMpCisgICAgICAgIGQgPSB7J2EnOiAxLCAnYic6IDJ9CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZC5nZXQoJ2MnKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYycsIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdhJyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2EnLCAzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmdldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmdldCwgTm9uZSwgTm9uZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3NldGRlZmF1bHQoc2VsZik6CisgICAgICAgICMgZGljdC5zZXRkZWZhdWx0KCkKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZC5zZXRkZWZhdWx0KCdrZXkwJyksIE5vbmUpCisgICAgICAgIGQuc2V0ZGVmYXVsdCgna2V5MCcsIFtdKQorICAgICAgICBzZWxmLmFzc2VydElzKGQuc2V0ZGVmYXVsdCgna2V5MCcpLCBOb25lKQorICAgICAgICBkLnNldGRlZmF1bHQoJ2tleScsIFtdKS5hcHBlbmQoMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydrZXknXVswXSwgMykKKyAgICAgICAgZC5zZXRkZWZhdWx0KCdrZXknLCBbXSkuYXBwZW5kKDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRbJ2tleSddKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLnNldGRlZmF1bHQpCisKKyAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKKworICAgICAgICBjbGFzcyBCYWRIYXNoKG9iamVjdCk6CisgICAgICAgICAgICBmYWlsID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmZhaWw6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisKKyAgICAgICAgeCA9IEJhZEhhc2goKQorICAgICAgICBkW3hdID0gNDIKKyAgICAgICAgeC5mYWlsID0gVHJ1ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGQuc2V0ZGVmYXVsdCwgeCwgW10pCisKKyAgICBkZWYgdGVzdF9zZXRkZWZhdWx0X2F0b21pYyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTM1MjE6IHNldGRlZmF1bHQoKSBjYWxscyBfX2hhc2hfXyBhbmQgX19lcV9fIG9ubHkgb25jZS4KKyAgICAgICAgY2xhc3MgSGFzaGVkKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5oYXNoX2NvdW50ID0gMAorICAgICAgICAgICAgICAgIHNlbGYuZXFfY291bnQgPSAwCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5oYXNoX2NvdW50ICs9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHNlbGYuZXFfY291bnQgKz0gMQorICAgICAgICAgICAgICAgIHJldHVybiBpZChzZWxmKSA9PSBpZChvdGhlcikKKyAgICAgICAgaGFzaGVkMSA9IEhhc2hlZCgpCisgICAgICAgIHkgPSB7aGFzaGVkMTogNX0KKyAgICAgICAgaGFzaGVkMiA9IEhhc2hlZCgpCisgICAgICAgIHkuc2V0ZGVmYXVsdChoYXNoZWQyLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoZWQxLmhhc2hfY291bnQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaGVkMi5oYXNoX2NvdW50LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2hlZDEuZXFfY291bnQgKyBoYXNoZWQyLmVxX2NvdW50LCAxKQorCisgICAgZGVmIHRlc3RfcG9waXRlbShzZWxmKToKKyAgICAgICAgIyBkaWN0LnBvcGl0ZW0oKQorICAgICAgICBmb3IgY29weW1vZGUgaW4gLTEsICsxOgorICAgICAgICAgICAgIyAtMTogYiBoYXMgc2FtZSBzdHJ1Y3R1cmUgYXMgYQorICAgICAgICAgICAgIyArMTogYiBpcyBhLmNvcHkoKQorICAgICAgICAgICAgZm9yIGxvZzJzaXplIGluIHJhbmdlKDEyKToKKyAgICAgICAgICAgICAgICBzaXplID0gMioqbG9nMnNpemUKKyAgICAgICAgICAgICAgICBhID0ge30KKyAgICAgICAgICAgICAgICBiID0ge30KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzaXplKToKKyAgICAgICAgICAgICAgICAgICAgYVtyZXByKGkpXSA9IGkKKyAgICAgICAgICAgICAgICAgICAgaWYgY29weW1vZGUgPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgYltyZXByKGkpXSA9IGkKKyAgICAgICAgICAgICAgICBpZiBjb3B5bW9kZSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGIgPSBhLmNvcHkoKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgICAgICBrYSwgdmEgPSB0YSA9IGEucG9waXRlbSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmEsIGludChrYSkpCisgICAgICAgICAgICAgICAgICAgIGtiLCB2YiA9IHRiID0gYi5wb3BpdGVtKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YiwgaW50KGtiKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjb3B5bW9kZSA8IDAgYW5kIHRhICE9IHRiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIpCisKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBkLnBvcGl0ZW0pCisKKyAgICBkZWYgdGVzdF9wb3Aoc2VsZik6CisgICAgICAgICMgVGVzdHMgZm9yIHBvcCB3aXRoIHNwZWNpZmllZCBrZXkKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGssIHYgPSAnYWJjJywgJ2RlZicKKyAgICAgICAgZFtrXSA9IHYKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGQucG9wLCAnZ2hpJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucG9wKGspLCB2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5wb3AsIGspCisKKyAgICAgICAgIyB2ZXJpZnkgbG9uZ3MvaW50cyBnZXQgc2FtZSB2YWx1ZSB3aGVuIGtleSA+IDMyIGJpdHMKKyAgICAgICAgIyAoZm9yIDY0LWJpdCBhcmNocykuICBTZWUgU0YgYnVnICM2ODk2NTkuCisgICAgICAgIHggPSA0NTAzNTk5NjI3MzcwNDk2TAorICAgICAgICB5ID0gNDUwMzU5OTYyNzM3MDQ5NgorICAgICAgICBoID0ge3g6ICdhbnl0aGluZycsIHk6ICdzb21ldGhpbmcgZWxzZSd9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaFt4XSwgaFt5XSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucG9wKGssIHYpLCB2KQorICAgICAgICBkW2tdID0gdgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucG9wKGssIDEpLCB2KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5wb3ApCisKKyAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKKworICAgICAgICBjbGFzcyBCYWRIYXNoKG9iamVjdCk6CisgICAgICAgICAgICBmYWlsID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmZhaWw6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisKKyAgICAgICAgeCA9IEJhZEhhc2goKQorICAgICAgICBkW3hdID0gNDIKKyAgICAgICAgeC5mYWlsID0gVHJ1ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGQucG9wLCB4KQorCisgICAgZGVmIHRlc3RfbXV0YXRpbmdpdGVyYXRpb24oc2VsZik6CisgICAgICAgICMgY2hhbmdpbmcgZGljdCBzaXplIGR1cmluZyBpdGVyYXRpb24KKyAgICAgICAgZCA9IHt9CisgICAgICAgIGRbMV0gPSAxCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgIGZvciBpIGluIGQ6CisgICAgICAgICAgICAgICAgZFtpKzFdID0gMQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihkKSwgJ3t9JykKKyAgICAgICAgZFsxXSA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQpLCAnezE6IDJ9JykKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGRbMV0gPSBkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihkKSwgJ3sxOiB7Li4ufX0nKQorCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOiBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkUmVwcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisKKyAgICAgICAgZCA9IHsxOiBCYWRSZXByKCl9CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgcmVwciwgZCkKKworICAgIGRlZiB0ZXN0X2xlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHt9IDwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoezE6IDJ9IDwgezFMOiAyTH0pCisKKyAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKKworICAgICAgICBjbGFzcyBCYWRDbXAob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisKKyAgICAgICAgZDEgPSB7QmFkQ21wKCk6IDF9CisgICAgICAgIGQyID0gezE6IDF9CisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhFeGMpOgorICAgICAgICAgICAgZDEgPCBkMgorCisgICAgZGVmIHRlc3RfbWlzc2luZyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgZGljdCBkb2Vzbid0IGhhdmUgYSBfX21pc3NpbmdfXyBtZXRob2QKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGRpY3QsICJfX21pc3NpbmdfXyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoe30sICJfX21pc3NpbmdfXyIpKQorICAgICAgICAjIFRlc3Qgc2V2ZXJhbCBjYXNlczoKKyAgICAgICAgIyAoRCkgc3ViY2xhc3MgZGVmaW5lcyBfX21pc3NpbmdfXyBtZXRob2QgcmV0dXJuaW5nIGEgdmFsdWUKKyAgICAgICAgIyAoRSkgc3ViY2xhc3MgZGVmaW5lcyBfX21pc3NpbmdfXyBtZXRob2QgcmFpc2luZyBSdW50aW1lRXJyb3IKKyAgICAgICAgIyAoRikgc3ViY2xhc3Mgc2V0cyBfX21pc3NpbmdfXyBpbnN0YW5jZSB2YXJpYWJsZSAobm8gZWZmZWN0KQorICAgICAgICAjIChHKSBzdWJjbGFzcyBkb2Vzbid0IGRlZmluZSBfX21pc3NpbmdfXyBhdCBhIGFsbAorICAgICAgICBjbGFzcyBEKGRpY3QpOgorICAgICAgICAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgIGQgPSBEKHsxOiAyLCAzOiA0fSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzFdLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbM10sIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMiwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigyLCBkLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzJdLCA0MikKKworICAgICAgICBjbGFzcyBFKGRpY3QpOgorICAgICAgICAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKGtleSkKKyAgICAgICAgZSA9IEUoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcikgYXMgYzoKKyAgICAgICAgICAgIGVbNDJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5leGNlcHRpb24uYXJncywgKDQyLCkpCisKKyAgICAgICAgY2xhc3MgRihkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAjIEFuIGluc3RhbmNlIHZhcmlhYmxlIF9fbWlzc2luZ19fIHNob3VsZCBoYXZlIG5vIGVmZmVjdAorICAgICAgICAgICAgICAgIHNlbGYuX19taXNzaW5nX18gPSBsYW1iZGEga2V5OiBOb25lCisgICAgICAgIGYgPSBGKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcikgYXMgYzoKKyAgICAgICAgICAgIGZbNDJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5leGNlcHRpb24uYXJncywgKDQyLCkpCisKKyAgICAgICAgY2xhc3MgRyhkaWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZyA9IEcoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKSBhcyBjOgorICAgICAgICAgICAgZ1s0Ml0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmV4Y2VwdGlvbi5hcmdzLCAoNDIsKSkKKworICAgIGRlZiB0ZXN0X3R1cGxlX2tleWVycm9yKHNlbGYpOgorICAgICAgICAjIFNGICMxNTc2NjU3CisgICAgICAgIGQgPSB7fQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKSBhcyBjOgorICAgICAgICAgICAgZFsoMSwpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZXhjZXB0aW9uLmFyZ3MsICgoMSwpLCkpCisKKyAgICBkZWYgdGVzdF9iYWRfa2V5KHNlbGYpOgorICAgICAgICAjIERpY3Rpb25hcnkgbG9va3VwcyBzaG91bGQgZmFpbCBpZiBfX2NtcF9fKCkgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgY2xhc3MgQ3VzdG9tRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkRGljdEtleToKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzaChzZWxmLl9fY2xhc3NfXykKKworICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ3VzdG9tRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyCisKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHgxID0gQmFkRGljdEtleSgpCisgICAgICAgIHgyID0gQmFkRGljdEtleSgpCisgICAgICAgIGRbeDFdID0gMQorICAgICAgICBmb3Igc3RtdCBpbiBbJ2RbeDJdID0gMicsCisgICAgICAgICAgICAgICAgICAgICAneiA9IGRbeDJdJywKKyAgICAgICAgICAgICAgICAgICAgICd4MiBpbiBkJywKKyAgICAgICAgICAgICAgICAgICAgICdkLmhhc19rZXkoeDIpJywKKyAgICAgICAgICAgICAgICAgICAgICdkLmdldCh4MiknLAorICAgICAgICAgICAgICAgICAgICAgJ2Quc2V0ZGVmYXVsdCh4MiwgNDIpJywKKyAgICAgICAgICAgICAgICAgICAgICdkLnBvcCh4MiknLAorICAgICAgICAgICAgICAgICAgICAgJ2QudXBkYXRlKHt4MjogMn0pJ106CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEN1c3RvbUV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgZXhlYyBzdG10IGluIGxvY2FscygpCisKKyAgICBkZWYgdGVzdF9yZXNpemUxKHNlbGYpOgorICAgICAgICAjIERpY3QgcmVzaXppbmcgYnVnLCBmb3VuZCBieSBKYWNrIEphbnNlbiBpbiAyLjIgQ1ZTIGRldmVsb3BtZW50LgorICAgICAgICAjIFRoaXMgdmVyc2lvbiBnb3QgYW4gYXNzZXJ0IGZhaWx1cmUgaW4gZGVidWcgYnVpbGQsIGluZmluaXRlIGxvb3AgaW4KKyAgICAgICAgIyByZWxlYXNlIGJ1aWxkLiAgVW5mb3J0dW5hdGVseSwgcHJvdm9raW5nIHRoaXMga2luZCBvZiBzdHVmZiByZXF1aXJlcworICAgICAgICAjIGEgbWl4IG9mIGluc2VydHMgYW5kIGRlbGV0ZXMgaGl0dGluZyBleGFjdGx5IHRoZSByaWdodCBoYXNoIGNvZGVzIGluCisgICAgICAgICMgZXhhY3RseSB0aGUgcmlnaHQgb3JkZXIsIGFuZCBJIGNhbid0IHRoaW5rIG9mIGEgcmFuZG9taXplZCBhcHByb2FjaAorICAgICAgICAjIHRoYXQgd291bGQgYmUgKmxpa2VseSogdG8gaGl0IGEgZmFpbGluZyBjYXNlIGluIHJlYXNvbmFibGUgdGltZS4KKworICAgICAgICBkID0ge30KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICBkW2ldID0gaQorICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgIGRlbCBkW2ldCisgICAgICAgIGZvciBpIGluIHJhbmdlKDUsIDkpOiAgIyBpPT04IHdhcyB0aGUgcHJvYmxlbQorICAgICAgICAgICAgZFtpXSA9IGkKKworICAgIGRlZiB0ZXN0X3Jlc2l6ZTIoc2VsZik6CisgICAgICAgICMgQW5vdGhlciBkaWN0IHJlc2l6aW5nIGJ1ZyAoU0YgYnVnICMxNDU2MjA5KS4KKyAgICAgICAgIyBUaGlzIGNhdXNlZCBTZWdtZW50YXRpb24gZmF1bHRzIG9yIElsbGVnYWwgaW5zdHJ1Y3Rpb25zLgorCisgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNQorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgaWYgcmVzaXppbmc6CisgICAgICAgICAgICAgICAgICAgIGQuY2xlYXIoKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBkID0ge30KKyAgICAgICAgcmVzaXppbmcgPSBGYWxzZQorICAgICAgICBkW1goKV0gPSAxCisgICAgICAgIGRbWCgpXSA9IDIKKyAgICAgICAgZFtYKCldID0gMworICAgICAgICBkW1goKV0gPSA0CisgICAgICAgIGRbWCgpXSA9IDUKKyAgICAgICAgIyBub3cgdHJpZ2dlciBhIHJlc2l6ZQorICAgICAgICByZXNpemluZyA9IFRydWUKKyAgICAgICAgZFs5XSA9IDYKKworICAgIGRlZiB0ZXN0X2VtcHR5X3ByZXNpemVkX2RpY3RfaW5fZnJlZWxpc3Qoc2VsZik6CisgICAgICAgICMgQnVnICMzNTM3OiBpZiBhbiBlbXB0eSBidXQgcHJlc2l6ZWQgZGljdCB3aXRoIGEgc2l6ZSBsYXJnZXIKKyAgICAgICAgIyB0aGFuIDcgd2FzIGluIHRoZSBmcmVlbGlzdCwgaXQgdHJpZ2dlcmVkIGFuIGFzc2VydGlvbiBmYWlsdXJlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgZCA9IHsnYSc6IDEgLy8gMCwgJ2InOiBOb25lLCAnYyc6IE5vbmUsICdkJzogTm9uZSwgJ2UnOiBOb25lLAorICAgICAgICAgICAgICAgICAnZic6IE5vbmUsICdnJzogTm9uZSwgJ2gnOiBOb25lfQorICAgICAgICBkID0ge30KKworICAgIGRlZiB0ZXN0X2NvbnRhaW5lcl9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgIyBCdWcgIzM2ODA6IHRwX3RyYXZlcnNlIHdhcyBub3QgaW1wbGVtZW50ZWQgZm9yIGRpY3RpdGVyIG9iamVjdHMKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBpdGVyYXRvcnMgPSAoZGljdC5pdGVyaXRlbXMsIGRpY3QuaXRlcnZhbHVlcywgZGljdC5pdGVya2V5cykKKyAgICAgICAgZm9yIGkgaW4gaXRlcmF0b3JzOgorICAgICAgICAgICAgb2JqID0gQygpCisgICAgICAgICAgICByZWYgPSB3ZWFrcmVmLnJlZihvYmopCisgICAgICAgICAgICBjb250YWluZXIgPSB7b2JqOiAxfQorICAgICAgICAgICAgb2JqLnggPSBpKGNvbnRhaW5lcikKKyAgICAgICAgICAgIGRlbCBvYmosIGNvbnRhaW5lcgorICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHJlZigpLCBOb25lLCAiQ3ljbGUgd2FzIG5vdCBjb2xsZWN0ZWQiKQorCisgICAgZGVmIF9ub3RfdHJhY2tlZChzZWxmLCB0KToKKyAgICAgICAgIyBOZXN0ZWQgY29udGFpbmVycyBjYW4gdGFrZSBzZXZlcmFsIGNvbGxlY3Rpb25zIHRvIHVudHJhY2sKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdjLmlzX3RyYWNrZWQodCksIHQpCisKKyAgICBkZWYgX3RyYWNrZWQoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnYy5pc190cmFja2VkKHQpLCB0KQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnYy5pc190cmFja2VkKHQpLCB0KQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF90cmFja19saXRlcmFscyhzZWxmKToKKyAgICAgICAgIyBUZXN0IEdDLW9wdGltaXphdGlvbiBvZiBkaWN0IGxpdGVyYWxzCisgICAgICAgIHgsIHksIHosIHcgPSAxLjUsICJhIiwgKDEsIE5vbmUpLCBbXQorCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKHt9KQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZCh7eDooKSwgeTp4LCB6OjF9KQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZCh7MTogImEiLCAiYiI6IDJ9KQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZCh7MTogMiwgKE5vbmUsIFRydWUsIEZhbHNlLCAoKSk6IGludH0pCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKHsxOiBvYmplY3QoKX0pCisKKyAgICAgICAgIyBEaWN0cyB3aXRoIG11dGFibGUgZWxlbWVudHMgYXJlIGFsd2F5cyB0cmFja2VkLCBldmVuIGlmIHRob3NlCisgICAgICAgICMgZWxlbWVudHMgYXJlIG5vdCB0cmFja2VkIHJpZ2h0IG5vdy4KKyAgICAgICAgc2VsZi5fdHJhY2tlZCh7MTogW119KQorICAgICAgICBzZWxmLl90cmFja2VkKHsxOiAoW10sKX0pCisgICAgICAgIHNlbGYuX3RyYWNrZWQoezE6IHt9fSkKKyAgICAgICAgc2VsZi5fdHJhY2tlZCh7MTogc2V0KCl9KQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF90cmFja19keW5hbWljKHNlbGYpOgorICAgICAgICAjIFRlc3QgR0Mtb3B0aW1pemF0aW9uIG9mIGR5bmFtaWNhbGx5LWNyZWF0ZWQgZGljdHMKKyAgICAgICAgY2xhc3MgTXlPYmplY3Qob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgeCwgeSwgeiwgdywgbyA9IDEuNSwgImEiLCAoMSwgb2JqZWN0KCkpLCBbXSwgTXlPYmplY3QoKQorCisgICAgICAgIGQgPSBkaWN0KCkKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoZCkKKyAgICAgICAgZFsxXSA9ICJhIgorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZChkKQorICAgICAgICBkW3ldID0gMgorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZChkKQorICAgICAgICBkW3pdID0gMworICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZChkKQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZChkLmNvcHkoKSkKKyAgICAgICAgZFs0XSA9IHcKKyAgICAgICAgc2VsZi5fdHJhY2tlZChkKQorICAgICAgICBzZWxmLl90cmFja2VkKGQuY29weSgpKQorICAgICAgICBkWzRdID0gTm9uZQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZChkKQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZChkLmNvcHkoKSkKKworICAgICAgICAjIGRkIGlzbid0IHRyYWNrZWQgcmlnaHQgbm93LCBidXQgaXQgbWF5IG11dGF0ZSBhbmQgdGhlcmVmb3JlIGQKKyAgICAgICAgIyB3aGljaCBjb250YWlucyBpdCBtdXN0IGJlIHRyYWNrZWQuCisgICAgICAgIGQgPSBkaWN0KCkKKyAgICAgICAgZGQgPSBkaWN0KCkKKyAgICAgICAgZFsxXSA9IGRkCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKGRkKQorICAgICAgICBzZWxmLl90cmFja2VkKGQpCisgICAgICAgIGRkWzFdID0gZAorICAgICAgICBzZWxmLl90cmFja2VkKGRkKQorCisgICAgICAgIGQgPSBkaWN0LmZyb21rZXlzKFt4LCB5LCB6XSkKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoZCkKKyAgICAgICAgZGQgPSBkaWN0KCkKKyAgICAgICAgZGQudXBkYXRlKGQpCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKGRkKQorICAgICAgICBkID0gZGljdC5mcm9ta2V5cyhbeCwgeSwgeiwgb10pCisgICAgICAgIHNlbGYuX3RyYWNrZWQoZCkKKyAgICAgICAgZGQgPSBkaWN0KCkKKyAgICAgICAgZGQudXBkYXRlKGQpCisgICAgICAgIHNlbGYuX3RyYWNrZWQoZGQpCisKKyAgICAgICAgZCA9IGRpY3QoeD14LCB5PXksIHo9eikKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoZCkKKyAgICAgICAgZCA9IGRpY3QoeD14LCB5PXksIHo9eiwgdz13KQorICAgICAgICBzZWxmLl90cmFja2VkKGQpCisgICAgICAgIGQgPSBkaWN0KCkKKyAgICAgICAgZC51cGRhdGUoeD14LCB5PXksIHo9eikKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoZCkKKyAgICAgICAgZC51cGRhdGUodz13KQorICAgICAgICBzZWxmLl90cmFja2VkKGQpCisKKyAgICAgICAgZCA9IGRpY3QoWyh4LCB5KSwgKHosIDEpXSkKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoZCkKKyAgICAgICAgZCA9IGRpY3QoWyh4LCB5KSwgKHosIHcpXSkKKyAgICAgICAgc2VsZi5fdHJhY2tlZChkKQorICAgICAgICBkID0gZGljdCgpCisgICAgICAgIGQudXBkYXRlKFsoeCwgeSksICh6LCAxKV0pCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKGQpCisgICAgICAgIGQudXBkYXRlKFsoeCwgeSksICh6LCB3KV0pCisgICAgICAgIHNlbGYuX3RyYWNrZWQoZCkKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfdHJhY2tfc3VidHlwZXMoc2VsZik6CisgICAgICAgICMgRGljdCBzdWJ0eXBlcyBhcmUgYWx3YXlzIHRyYWNrZWQKKyAgICAgICAgY2xhc3MgTXlEaWN0KGRpY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLl90cmFja2VkKE15RGljdCgpKQorCisKK2Zyb20gdGVzdCBpbXBvcnQgbWFwcGluZ190ZXN0cworCitjbGFzcyBHZW5lcmFsTWFwcGluZ1Rlc3RzKG1hcHBpbmdfdGVzdHMuQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sKToKKyAgICB0eXBlMnRlc3QgPSBkaWN0CisKK2NsYXNzIERpY3QoZGljdCk6CisgICAgcGFzcworCitjbGFzcyBTdWJjbGFzc01hcHBpbmdUZXN0cyhtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CisgICAgdHlwZTJ0ZXN0ID0gRGljdAorCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgKCdkaWN0KC5oYXNfa2V5Li58IGluZXF1YWxpdHkgY29tcGFyaXNvbnMpIG5vdCBzdXBwb3J0ZWQgaW4gMy54JywKKyAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICAgICAgRGljdFRlc3QsCisgICAgICAgICAgICBHZW5lcmFsTWFwcGluZ1Rlc3RzLAorICAgICAgICAgICAgU3ViY2xhc3NNYXBwaW5nVGVzdHMsCisgICAgICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzRiNDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzRiNDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0Y2JiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0Y29tcHMucHkKQEAgLTAsMCArMSw5MSBAQAoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0IGFzIHN1cHBvcnQKKworIyBGb3Igc2NvcGUgdGVzdGluZy4KK2cgPSAiR2xvYmFsIHZhcmlhYmxlIgorCisKK2NsYXNzIERpY3RDb21wcmVoZW5zaW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gezA6IDEwLCAxOiAxMSwgMjogMTIsIDM6IDEzLCA0OiAxNCwgNTogMTUsIDY6IDE2LCA3OiAxNywKKyAgICAgICAgICAgICAgICAgICAgODogMTgsIDk6IDE5fQorICAgICAgICBhY3R1YWwgPSB7azogayArIDEwIGZvciBrIGluIHJhbmdlKDEwKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorCisgICAgICAgIGV4cGVjdGVkID0gezA6IDAsIDE6IDEsIDI6IDIsIDM6IDMsIDQ6IDQsIDU6IDUsIDY6IDYsIDc6IDcsIDg6IDgsIDk6IDl9CisgICAgICAgIGFjdHVhbCA9IHtrOiB2IGZvciBrIGluIHJhbmdlKDEwKSBmb3IgdiBpbiByYW5nZSgxMCkgaWYgayA9PSB2fQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9zY29wZV9pc29sYXRpb24oc2VsZik6CisgICAgICAgIGsgPSAiTG9jYWwgVmFyaWFibGUiCisKKyAgICAgICAgZXhwZWN0ZWQgPSB7MDogTm9uZSwgMTogTm9uZSwgMjogTm9uZSwgMzogTm9uZSwgNDogTm9uZSwgNTogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgNjogTm9uZSwgNzogTm9uZSwgODogTm9uZSwgOTogTm9uZX0KKyAgICAgICAgYWN0dWFsID0ge2s6IE5vbmUgZm9yIGsgaW4gcmFuZ2UoMTApfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgIkxvY2FsIFZhcmlhYmxlIikKKworICAgICAgICBleHBlY3RlZCA9IHs5OiAxLCAxODogMiwgMTk6IDIsIDI3OiAzLCAyODogMywgMjk6IDMsIDM2OiA0LCAzNzogNCwKKyAgICAgICAgICAgICAgICAgICAgMzg6IDQsIDM5OiA0LCA0NTogNSwgNDY6IDUsIDQ3OiA1LCA0ODogNSwgNDk6IDUsIDU0OiA2LAorICAgICAgICAgICAgICAgICAgICA1NTogNiwgNTY6IDYsIDU3OiA2LCA1ODogNiwgNTk6IDYsIDYzOiA3LCA2NDogNywgNjU6IDcsCisgICAgICAgICAgICAgICAgICAgIDY2OiA3LCA2NzogNywgNjg6IDcsIDY5OiA3LCA3MjogOCwgNzM6IDgsIDc0OiA4LCA3NTogOCwKKyAgICAgICAgICAgICAgICAgICAgNzY6IDgsIDc3OiA4LCA3ODogOCwgNzk6IDgsIDgxOiA5LCA4MjogOSwgODM6IDksIDg0OiA5LAorICAgICAgICAgICAgICAgICAgICA4NTogOSwgODY6IDksIDg3OiA5LCA4ODogOSwgODk6IDl9CisgICAgICAgIGFjdHVhbCA9IHtrOiB2IGZvciB2IGluIHJhbmdlKDEwKSBmb3IgayBpbiByYW5nZSh2ICogOSwgdiAqIDEwKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCAiTG9jYWwgVmFyaWFibGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9zY29wZV9pc29sYXRpb25fZnJvbV9nbG9iYWwoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gezA6IE5vbmUsIDE6IE5vbmUsIDI6IE5vbmUsIDM6IE5vbmUsIDQ6IE5vbmUsIDU6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIDY6IE5vbmUsIDc6IE5vbmUsIDg6IE5vbmUsIDk6IE5vbmV9CisgICAgICAgIGFjdHVhbCA9IHtnOiBOb25lIGZvciBnIGluIHJhbmdlKDEwKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGcsICJHbG9iYWwgdmFyaWFibGUiKQorCisgICAgICAgIGV4cGVjdGVkID0gezk6IDEsIDE4OiAyLCAxOTogMiwgMjc6IDMsIDI4OiAzLCAyOTogMywgMzY6IDQsIDM3OiA0LAorICAgICAgICAgICAgICAgICAgICAzODogNCwgMzk6IDQsIDQ1OiA1LCA0NjogNSwgNDc6IDUsIDQ4OiA1LCA0OTogNSwgNTQ6IDYsCisgICAgICAgICAgICAgICAgICAgIDU1OiA2LCA1NjogNiwgNTc6IDYsIDU4OiA2LCA1OTogNiwgNjM6IDcsIDY0OiA3LCA2NTogNywKKyAgICAgICAgICAgICAgICAgICAgNjY6IDcsIDY3OiA3LCA2ODogNywgNjk6IDcsIDcyOiA4LCA3MzogOCwgNzQ6IDgsIDc1OiA4LAorICAgICAgICAgICAgICAgICAgICA3NjogOCwgNzc6IDgsIDc4OiA4LCA3OTogOCwgODE6IDksIDgyOiA5LCA4MzogOSwgODQ6IDksCisgICAgICAgICAgICAgICAgICAgIDg1OiA5LCA4NjogOSwgODc6IDksIDg4OiA5LCA4OTogOX0KKyAgICAgICAgYWN0dWFsID0ge2c6IHYgZm9yIHYgaW4gcmFuZ2UoMTApIGZvciBnIGluIHJhbmdlKHYgKiA5LCB2ICogMTApfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGcsICJHbG9iYWwgdmFyaWFibGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9nbG9iYWxfdmlzaWJpbGl0eShzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSB7MDogJ0dsb2JhbCB2YXJpYWJsZScsIDE6ICdHbG9iYWwgdmFyaWFibGUnLAorICAgICAgICAgICAgICAgICAgICAyOiAnR2xvYmFsIHZhcmlhYmxlJywgMzogJ0dsb2JhbCB2YXJpYWJsZScsCisgICAgICAgICAgICAgICAgICAgIDQ6ICdHbG9iYWwgdmFyaWFibGUnLCA1OiAnR2xvYmFsIHZhcmlhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgNjogJ0dsb2JhbCB2YXJpYWJsZScsIDc6ICdHbG9iYWwgdmFyaWFibGUnLAorICAgICAgICAgICAgICAgICAgICA4OiAnR2xvYmFsIHZhcmlhYmxlJywgOTogJ0dsb2JhbCB2YXJpYWJsZSd9CisgICAgICAgIGFjdHVhbCA9IHtrOiBnIGZvciBrIGluIHJhbmdlKDEwKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfbG9jYWxfdmlzaWJpbGl0eShzZWxmKToKKyAgICAgICAgdiA9ICJMb2NhbCB2YXJpYWJsZSIKKyAgICAgICAgZXhwZWN0ZWQgPSB7MDogJ0xvY2FsIHZhcmlhYmxlJywgMTogJ0xvY2FsIHZhcmlhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgMjogJ0xvY2FsIHZhcmlhYmxlJywgMzogJ0xvY2FsIHZhcmlhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgNDogJ0xvY2FsIHZhcmlhYmxlJywgNTogJ0xvY2FsIHZhcmlhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgNjogJ0xvY2FsIHZhcmlhYmxlJywgNzogJ0xvY2FsIHZhcmlhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgODogJ0xvY2FsIHZhcmlhYmxlJywgOTogJ0xvY2FsIHZhcmlhYmxlJ30KKyAgICAgICAgYWN0dWFsID0ge2s6IHYgZm9yIGsgaW4gcmFuZ2UoMTApfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgIkxvY2FsIHZhcmlhYmxlIikKKworICAgIGRlZiB0ZXN0X2lsbGVnYWxfYXNzaWdubWVudChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChTeW50YXhFcnJvciwgImNhbid0IGFzc2lnbiIpOgorICAgICAgICAgICAgY29tcGlsZSgie3g6IHkgZm9yIHksIHggaW4gKCgxLCAyKSwgKDMsIDQpKX0gPSA1IiwgIjx0ZXN0PiIsCisgICAgICAgICAgICAgICAgICAgICJleGVjIikKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFN5bnRheEVycm9yLCAiY2FuJ3QgYXNzaWduIik6CisgICAgICAgICAgICBjb21waWxlKCJ7eDogeSBmb3IgeSwgeCBpbiAoKDEsIDIpLCAoMywgNCkpfSArPSA1IiwgIjx0ZXN0PiIsCisgICAgICAgICAgICAgICAgICAgICJleGVjIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3Rjb21wcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0Y29tcHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDlkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0Y29tcHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3Rjb21wcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0Y29tcHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDlkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0Y29tcHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3R2aWV3cy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3R2aWV3cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTAzNjc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5CkBAIC0wLDAgKzEsMTU0IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIERpY3RTZXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yc19ub3RfY2FsbGFibGUoc2VsZik6CisgICAgICAgIGt0ID0gdHlwZSh7fS52aWV3a2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGt0LCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBrdCkKKyAgICAgICAgaXQgPSB0eXBlKHt9LnZpZXdpdGVtcygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGl0LCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpdCkKKyAgICAgICAgdnQgPSB0eXBlKHt9LnZpZXd2YWx1ZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB2dCwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdnQpCisKKyAgICBkZWYgdGVzdF9kaWN0X2tleXMoc2VsZik6CisgICAgICAgIGQgPSB7MTogMTAsICJhIjogIkFCQyJ9CisgICAgICAgIGtleXMgPSBkLnZpZXdrZXlzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oa2V5cyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGtleXMpLCBzZXQoWzEsICJhIl0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsIHNldChbMSwgImEiXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoa2V5cywgc2V0KFsxLCAiYSIsICJiIl0pKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGtleXMsIHNldChbMSwgImIiXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoa2V5cywgc2V0KFsxXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoa2V5cywgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oMSwga2V5cykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiYSIsIGtleXMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMTAsIGtleXMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIloiLCBrZXlzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQudmlld2tleXMoKSwgZC52aWV3a2V5cygpKQorICAgICAgICBlID0gezE6IDExLCAiYSI6ICJkZWYifQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQudmlld2tleXMoKSwgZS52aWV3a2V5cygpKQorICAgICAgICBkZWwgZVsiYSJdCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZC52aWV3a2V5cygpLCBlLnZpZXdrZXlzKCkpCisKKyAgICBkZWYgdGVzdF9kaWN0X2l0ZW1zKHNlbGYpOgorICAgICAgICBkID0gezE6IDEwLCAiYSI6ICJBQkMifQorICAgICAgICBpdGVtcyA9IGQudmlld2l0ZW1zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXRlbXMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChpdGVtcyksIHNldChbKDEsIDEwKSwgKCJhIiwgIkFCQyIpXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIHNldChbKDEsIDEwKSwgKCJhIiwgIkFCQyIpXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaXRlbXMsIHNldChbKDEsIDEwKSwgKCJhIiwgIkFCQyIpLCAianVuayJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpdGVtcywgc2V0KFsoMSwgMTApLCAoImEiLCAiZGVmIildKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpdGVtcywgc2V0KFsoMSwgMTApXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaXRlbXMsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEluKCgxLCAxMCksIGl0ZW1zKQorICAgICAgICBzZWxmLmFzc2VydEluKCgiYSIsICJBQkMiKSwgaXRlbXMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oKDEsIDExKSwgaXRlbXMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMSwgaXRlbXMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oKCksIGl0ZW1zKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCgxLCksIGl0ZW1zKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCgxLCAyLCAzKSwgaXRlbXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC52aWV3aXRlbXMoKSwgZC52aWV3aXRlbXMoKSkKKyAgICAgICAgZSA9IGQuY29weSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC52aWV3aXRlbXMoKSwgZS52aWV3aXRlbXMoKSkKKyAgICAgICAgZVsiYSJdID0gImRlZiIKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkLnZpZXdpdGVtcygpLCBlLnZpZXdpdGVtcygpKQorCisgICAgZGVmIHRlc3RfZGljdF9taXhlZF9rZXlzX2l0ZW1zKHNlbGYpOgorICAgICAgICBkID0geygxLCAxKTogMTEsICgyLCAyKTogMjJ9CisgICAgICAgIGUgPSB7MTogMSwgMjogMn0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnZpZXdrZXlzKCksIGUudmlld2l0ZW1zKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZC52aWV3aXRlbXMoKSwgZS52aWV3a2V5cygpKQorCisgICAgZGVmIHRlc3RfZGljdF92YWx1ZXMoc2VsZik6CisgICAgICAgIGQgPSB7MTogMTAsICJhIjogIkFCQyJ9CisgICAgICAgIHZhbHVlcyA9IGQudmlld3ZhbHVlcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHZhbHVlcyksIHNldChbMTAsICJBQkMiXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlcyksIDIpCisKKyAgICBkZWYgdGVzdF9kaWN0X3JlcHIoc2VsZik6CisgICAgICAgIGQgPSB7MTogMTAsICJhIjogIkFCQyJ9CisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyZXByKGQpLCBzdHIpCisgICAgICAgIHIgPSByZXByKGQudmlld2l0ZW1zKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyID09ICJkaWN0X2l0ZW1zKFsoJ2EnLCAnQUJDJyksICgxLCAxMCldKSIgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPT0gImRpY3RfaXRlbXMoWygxLCAxMCksICgnYScsICdBQkMnKV0pIikKKyAgICAgICAgciA9IHJlcHIoZC52aWV3a2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uociwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUociA9PSAiZGljdF9rZXlzKFsnYScsIDFdKSIgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPT0gImRpY3Rfa2V5cyhbMSwgJ2EnXSkiKQorICAgICAgICByID0gcmVwcihkLnZpZXd2YWx1ZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHIsIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIgPT0gImRpY3RfdmFsdWVzKFsnQUJDJywgMTBdKSIgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPT0gImRpY3RfdmFsdWVzKFsxMCwgJ0FCQyddKSIpCisKKyAgICBkZWYgdGVzdF9rZXlzX3NldF9vcGVyYXRpb25zKHNlbGYpOgorICAgICAgICBkMSA9IHsnYSc6IDEsICdiJzogMn0KKyAgICAgICAgZDIgPSB7J2InOiAzLCAnYyc6IDJ9CisgICAgICAgIGQzID0geydkJzogNCwgJ2UnOiA1fQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgJiBkMS52aWV3a2V5cygpLCB7J2EnLCAnYid9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgJiBkMi52aWV3a2V5cygpLCB7J2InfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpICYgZDMudmlld2tleXMoKSwgc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSAmIHNldChkMS52aWV3a2V5cygpKSwgeydhJywgJ2InfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpICYgc2V0KGQyLnZpZXdrZXlzKCkpLCB7J2InfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpICYgc2V0KGQzLnZpZXdrZXlzKCkpLCBzZXQoKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgfCBkMS52aWV3a2V5cygpLCB7J2EnLCAnYid9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgfCBkMi52aWV3a2V5cygpLCB7J2EnLCAnYicsICdjJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSB8IGQzLnZpZXdrZXlzKCksIHsnYScsICdiJywgJ2QnLCAnZSd9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgfCBzZXQoZDEudmlld2tleXMoKSksIHsnYScsICdiJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSB8IHNldChkMi52aWV3a2V5cygpKSwgeydhJywgJ2InLCAnYyd9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgfCBzZXQoZDMudmlld2tleXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgeydhJywgJ2InLCAnZCcsICdlJ30pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpIF4gZDEudmlld2tleXMoKSwgc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSBeIGQyLnZpZXdrZXlzKCksIHsnYScsICdjJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSBeIGQzLnZpZXdrZXlzKCksIHsnYScsICdiJywgJ2QnLCAnZSd9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgXiBzZXQoZDEudmlld2tleXMoKSksIHNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgXiBzZXQoZDIudmlld2tleXMoKSksIHsnYScsICdjJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSBeIHNldChkMy52aWV3a2V5cygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnLCAnYicsICdkJywgJ2UnfSkKKworICAgIGRlZiB0ZXN0X2l0ZW1zX3NldF9vcGVyYXRpb25zKHNlbGYpOgorICAgICAgICBkMSA9IHsnYSc6IDEsICdiJzogMn0KKyAgICAgICAgZDIgPSB7J2EnOiAyLCAnYic6IDJ9CisgICAgICAgIGQzID0geydkJzogNCwgJ2UnOiA1fQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZDEudmlld2l0ZW1zKCkgJiBkMS52aWV3aXRlbXMoKSwgeygnYScsIDEpLCAoJ2InLCAyKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2l0ZW1zKCkgJiBkMi52aWV3aXRlbXMoKSwgeygnYicsIDIpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSAmIGQzLnZpZXdpdGVtcygpLCBzZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSAmIHNldChkMS52aWV3aXRlbXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgeygnYScsIDEpLCAoJ2InLCAyKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2l0ZW1zKCkgJiBzZXQoZDIudmlld2l0ZW1zKCkpLCB7KCdiJywgMil9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdpdGVtcygpICYgc2V0KGQzLnZpZXdpdGVtcygpKSwgc2V0KCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSB8IGQxLnZpZXdpdGVtcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsoJ2EnLCAxKSwgKCdiJywgMil9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdpdGVtcygpIHwgZDIudmlld2l0ZW1zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgeygnYScsIDEpLCAoJ2EnLCAyKSwgKCdiJywgMil9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdpdGVtcygpIHwgZDMudmlld2l0ZW1zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgeygnYScsIDEpLCAoJ2InLCAyKSwgKCdkJywgNCksICgnZScsIDUpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSB8IHNldChkMS52aWV3aXRlbXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgeygnYScsIDEpLCAoJ2InLCAyKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2l0ZW1zKCkgfCBzZXQoZDIudmlld2l0ZW1zKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsoJ2EnLCAxKSwgKCdhJywgMiksICgnYicsIDIpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSB8IHNldChkMy52aWV3aXRlbXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgeygnYScsIDEpLCAoJ2InLCAyKSwgKCdkJywgNCksICgnZScsIDUpfSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdpdGVtcygpIF4gZDEudmlld2l0ZW1zKCksIHNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdpdGVtcygpIF4gZDIudmlld2l0ZW1zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgeygnYScsIDEpLCAoJ2EnLCAyKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2l0ZW1zKCkgXiBkMy52aWV3aXRlbXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7KCdhJywgMSksICgnYicsIDIpLCAoJ2QnLCA0KSwgKCdlJywgNSl9KQorCisKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChEaWN0U2V0VGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3R2aWV3cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwNjIzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3R2aWV3cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdHZpZXdzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3R2aWV3cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwNjIzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3R2aWV3cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlmZmxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpZmZsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwYmY5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpZmZsaWIucHkKQEAgLTAsMCArMSwyNzIgQEAKK2ltcG9ydCBkaWZmbGliCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGZpbmRmaWxlCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBkb2N0ZXN0CitpbXBvcnQgc3lzCisKKworY2xhc3MgVGVzdFdpdGhBc2NpaSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfb25lX2luc2VydChzZWxmKToKKyAgICAgICAgc20gPSBkaWZmbGliLlNlcXVlbmNlTWF0Y2hlcihOb25lLCAnYicgKiAxMDAsICdhJyArICdiJyAqIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChzbS5yYXRpbygpLCAwLjk5NSwgcGxhY2VzPTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzbS5nZXRfb3Bjb2RlcygpKSwKKyAgICAgICAgICAgIFsgICAoJ2luc2VydCcsIDAsIDAsIDAsIDEpLAorICAgICAgICAgICAgICAgICgnZXF1YWwnLCAwLCAxMDAsIDEsIDEwMSldKQorICAgICAgICBzbSA9IGRpZmZsaWIuU2VxdWVuY2VNYXRjaGVyKE5vbmUsICdiJyAqIDEwMCwgJ2InICogNTAgKyAnYScgKyAnYicgKiA1MCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChzbS5yYXRpbygpLCAwLjk5NSwgcGxhY2VzPTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzbS5nZXRfb3Bjb2RlcygpKSwKKyAgICAgICAgICAgIFsgICAoJ2VxdWFsJywgMCwgNTAsIDAsIDUwKSwKKyAgICAgICAgICAgICAgICAoJ2luc2VydCcsIDUwLCA1MCwgNTAsIDUxKSwKKyAgICAgICAgICAgICAgICAoJ2VxdWFsJywgNTAsIDEwMCwgNTEsIDEwMSldKQorCisgICAgZGVmIHRlc3Rfb25lX2RlbGV0ZShzZWxmKToKKyAgICAgICAgc20gPSBkaWZmbGliLlNlcXVlbmNlTWF0Y2hlcihOb25lLCAnYScgKiA0MCArICdjJyArICdiJyAqIDQwLCAnYScgKiA0MCArICdiJyAqIDQwKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHNtLnJhdGlvKCksIDAuOTk0LCBwbGFjZXM9MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHNtLmdldF9vcGNvZGVzKCkpLAorICAgICAgICAgICAgWyAgICgnZXF1YWwnLCAwLCA0MCwgMCwgNDApLAorICAgICAgICAgICAgICAgICgnZGVsZXRlJywgNDAsIDQxLCA0MCwgNDApLAorICAgICAgICAgICAgICAgICgnZXF1YWwnLCA0MSwgODEsIDQwLCA4MCldKQorCisKK2NsYXNzIFRlc3RBdXRvanVuayh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIHRoZSBhdXRvanVuayBwYXJhbWV0ZXIgYWRkZWQgaW4gMi43IiIiCisgICAgZGVmIHRlc3Rfb25lX2luc2VydF9ob21vZ2Vub3VzX3NlcXVlbmNlKHNlbGYpOgorICAgICAgICAjIEJ5IGRlZmF1bHQgYXV0b2p1bms9VHJ1ZSBhbmQgdGhlIGhldXJpc3RpYyBraWNrcyBpbiBmb3IgYSBzZXF1ZW5jZQorICAgICAgICAjIG9mIGxlbmd0aCAyMDArCisgICAgICAgIHNlcTEgPSAnYicgKiAyMDAKKyAgICAgICAgc2VxMiA9ICdhJyArICdiJyAqIDIwMAorCisgICAgICAgIHNtID0gZGlmZmxpYi5TZXF1ZW5jZU1hdGNoZXIoTm9uZSwgc2VxMSwgc2VxMikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChzbS5yYXRpbygpLCAwLCBwbGFjZXM9MykKKworICAgICAgICAjIE5vdyB0dXJuIHRoZSBoZXVyaXN0aWMgb2ZmCisgICAgICAgIHNtID0gZGlmZmxpYi5TZXF1ZW5jZU1hdGNoZXIoTm9uZSwgc2VxMSwgc2VxMiwgYXV0b2p1bms9RmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoc20ucmF0aW8oKSwgMC45OTc1LCBwbGFjZXM9MykKKworCitjbGFzcyBUZXN0U0ZidWdzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9yYXRpb19mb3JfbnVsbF9zZXFuKHNlbGYpOgorICAgICAgICAjIENoZWNrIGNsZWFyaW5nIG9mIFNGIGJ1ZyA3NjMwMjMKKyAgICAgICAgcyA9IGRpZmZsaWIuU2VxdWVuY2VNYXRjaGVyKE5vbmUsIFtdLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJhdGlvKCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5xdWlja19yYXRpbygpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmVhbF9xdWlja19yYXRpbygpLCAxKQorCisgICAgZGVmIHRlc3RfY29tcGFyaW5nX2VtcHR5X2xpc3RzKHNlbGYpOgorICAgICAgICAjIENoZWNrIGZpeCBmb3IgYnVnICM5Nzk3OTQKKyAgICAgICAgZ3JvdXBfZ2VuID0gZGlmZmxpYi5TZXF1ZW5jZU1hdGNoZXIoTm9uZSwgW10sIFtdKS5nZXRfZ3JvdXBlZF9vcGNvZGVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgZ3JvdXBfZ2VuLm5leHQpCisgICAgICAgIGRpZmZfZ2VuID0gZGlmZmxpYi51bmlmaWVkX2RpZmYoW10sIFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBkaWZmX2dlbi5uZXh0KQorCisgICAgZGVmIHRlc3RfYWRkZWRfdGFiX2hpbnQoc2VsZik6CisgICAgICAgICMgQ2hlY2sgZml4IGZvciBidWcgIzE0ODg5NDMKKyAgICAgICAgZGlmZiA9IGxpc3QoZGlmZmxpYi5EaWZmZXIoKS5jb21wYXJlKFsiXHRJIGFtIGEgYnVnZ3kiXSxbIlx0XHRJIGFtIGEgYnVnIl0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCItIFx0SSBhbSBhIGJ1Z2d5IiwgZGlmZlswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiPyAgICAgICAgICAgIC0tXG4iLCBkaWZmWzFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIrIFx0XHRJIGFtIGEgYnVnIiwgZGlmZlsyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiPyArXG4iLCBkaWZmWzNdKQorCitwYXRjaDkxNDU3NV9mcm9tMSA9ICIiIgorICAgMS4gQmVhdXRpZnVsIGlzIGJlVFRlciB0aGFuIHVnbHkuCisgICAyLiBFeHBsaWNpdCBpcyBiZXR0ZXIgdGhhbiBpbXBsaWNpdC4KKyAgIDMuIFNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LgorICAgNC4gQ29tcGxleCBpcyBiZXR0ZXIgdGhhbiBjb21wbGljYXRlZC4KKyIiIgorCitwYXRjaDkxNDU3NV90bzEgPSAiIiIKKyAgIDEuIEJlYXV0aWZ1bCBpcyBiZXR0ZXIgdGhhbiB1Z2x5LgorICAgMy4gICBTaW1wbGUgaXMgYmV0dGVyIHRoYW4gY29tcGxleC4KKyAgIDQuIENvbXBsaWNhdGVkIGlzIGJldHRlciB0aGFuIGNvbXBsZXguCisgICA1LiBGbGF0IGlzIGJldHRlciB0aGFuIG5lc3RlZC4KKyIiIgorCitwYXRjaDkxNDU3NV9mcm9tMiA9ICIiIgorXHRcdExpbmUgMTogcHJlY2VlZGVkIGJ5IGZyb206W3R0XSB0bzpbc3Nzc10KKyAgXHRcdExpbmUgMjogcHJlY2VlZGVkIGJ5IGZyb206W3NzdHRdIHRvOltzc3NzdF0KKyAgXHQgXHRMaW5lIDM6IHByZWNlZWRlZCBieSBmcm9tOltzc3RzdF0gdG86W3Nzc3Nzc10KK0xpbmUgNDogIFx0aGFzIGZyb206W3NzdF0gdG86W3Nzc10gYWZ0ZXIgOgorTGluZSA1OiBoYXMgZnJvbTpbdF0gdG86W3NzXSBhdCBlbmRcdAorIiIiCisKK3BhdGNoOTE0NTc1X3RvMiA9ICIiIgorICAgIExpbmUgMTogcHJlY2VlZGVkIGJ5IGZyb206W3R0XSB0bzpbc3Nzc10KKyAgICBcdExpbmUgMjogcHJlY2VlZGVkIGJ5IGZyb206W3NzdHRdIHRvOltzc3NzdF0KKyAgICAgIExpbmUgMzogcHJlY2VlZGVkIGJ5IGZyb206W3NzdHN0XSB0bzpbc3Nzc3NzXQorTGluZSA0OiAgIGhhcyBmcm9tOltzc3RdIHRvOltzc3NdIGFmdGVyIDoKK0xpbmUgNTogaGFzIGZyb206W3RdIHRvOltzc10gYXQgZW5kCisiIiIKKworcGF0Y2g5MTQ1NzVfZnJvbTMgPSAiIiJsaW5lIDAKKzEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2ODkwMTIzNDUKK2xpbmUgMQorbGluZSAyCitsaW5lIDMKK2xpbmUgNCAgIGNoYW5nZWQKK2xpbmUgNSAgIGNoYW5nZWQKK2xpbmUgNiAgIGNoYW5nZWQKK2xpbmUgNworbGluZSA4ICBzdWJ0cmFjdGVkCitsaW5lIDkKKzEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2ODkwMTIzNDUKK3Nob3J0IGxpbmUKK2p1c3QgZml0cyBpbiEhCitqdXN0IGZpdHMgaW4gdHdvIGxpbmVzIHl1cCEhCit0aGUgZW5kIiIiCisKK3BhdGNoOTE0NTc1X3RvMyA9ICIiImxpbmUgMAorMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY4OTAxMjM0NQorbGluZSAxCitsaW5lIDIgICAgYWRkZWQKK2xpbmUgMworbGluZSA0ICAgY2hhbkdFZAorbGluZSA1YSAgY2hhbkdlZAorbGluZSA2YSAgY2hhbmdFZAorbGluZSA3CitsaW5lIDgKK2xpbmUgOQorMTIzNDU2Nzg5MAorYW5vdGhlciBsb25nIGxpbmUgdGhhdCBuZWVkcyB0byBiZSB3cmFwcGVkCitqdXN0IGZpdFMgaW4hIQoranVzdCBmaXRzIGluIHR3byBsaW5lUyB5dXAhIQordGhlIGVuZCIiIgorCitjbGFzcyBUZXN0U0ZwYXRjaGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2h0bWxfZGlmZihzZWxmKToKKyAgICAgICAgIyBDaGVjayBTRiBwYXRjaCA5MTQ1NzUgZm9yIGdlbmVyYXRpbmcgSFRNTCBkaWZmZXJlbmNlcworICAgICAgICBmMWEgPSAoKHBhdGNoOTE0NTc1X2Zyb20xICsgJzEyM1xuJyoxMCkqMykKKyAgICAgICAgdDFhID0gKHBhdGNoOTE0NTc1X3RvMSArICcxMjNcbicqMTApKjMKKyAgICAgICAgZjFiID0gJzQ1NlxuJyoxMCArIGYxYQorICAgICAgICB0MWIgPSAnNDU2XG4nKjEwICsgdDFhCisgICAgICAgIGYxYSA9IGYxYS5zcGxpdGxpbmVzKCkKKyAgICAgICAgdDFhID0gdDFhLnNwbGl0bGluZXMoKQorICAgICAgICBmMWIgPSBmMWIuc3BsaXRsaW5lcygpCisgICAgICAgIHQxYiA9IHQxYi5zcGxpdGxpbmVzKCkKKyAgICAgICAgZjIgPSBwYXRjaDkxNDU3NV9mcm9tMi5zcGxpdGxpbmVzKCkKKyAgICAgICAgdDIgPSBwYXRjaDkxNDU3NV90bzIuc3BsaXRsaW5lcygpCisgICAgICAgIGYzID0gcGF0Y2g5MTQ1NzVfZnJvbTMKKyAgICAgICAgdDMgPSBwYXRjaDkxNDU3NV90bzMKKyAgICAgICAgaSA9IGRpZmZsaWIuSHRtbERpZmYoKQorICAgICAgICBqID0gZGlmZmxpYi5IdG1sRGlmZih0YWJzaXplPTIpCisgICAgICAgIGsgPSBkaWZmbGliLkh0bWxEaWZmKHdyYXBjb2x1bW49MTQpCisKKyAgICAgICAgZnVsbCA9IGkubWFrZV9maWxlKGYxYSx0MWEsJ2Zyb20nLCd0bycsY29udGV4dD1GYWxzZSxudW1saW5lcz01KQorICAgICAgICB0YWJsZXMgPSAnXG4nLmpvaW4oCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgJzxoMj5Db250ZXh0IChmaXJzdCBkaWZmIHdpdGhpbiBudW1saW5lcz01KGRlZmF1bHQpKTwvaDI+JywKKyAgICAgICAgICAgICBpLm1ha2VfdGFibGUoZjFhLHQxYSwnZnJvbScsJ3RvJyxjb250ZXh0PVRydWUpLAorICAgICAgICAgICAgICc8aDI+Q29udGV4dCAoZmlyc3QgZGlmZiBhZnRlciBudW1saW5lcz01KGRlZmF1bHQpKTwvaDI+JywKKyAgICAgICAgICAgICBpLm1ha2VfdGFibGUoZjFiLHQxYiwnZnJvbScsJ3RvJyxjb250ZXh0PVRydWUpLAorICAgICAgICAgICAgICc8aDI+Q29udGV4dCAobnVtbGluZXM9Nik8L2gyPicsCisgICAgICAgICAgICAgaS5tYWtlX3RhYmxlKGYxYSx0MWEsJ2Zyb20nLCd0bycsY29udGV4dD1UcnVlLG51bWxpbmVzPTYpLAorICAgICAgICAgICAgICc8aDI+Q29udGV4dCAobnVtbGluZXM9MCk8L2gyPicsCisgICAgICAgICAgICAgaS5tYWtlX3RhYmxlKGYxYSx0MWEsJ2Zyb20nLCd0bycsY29udGV4dD1UcnVlLG51bWxpbmVzPTApLAorICAgICAgICAgICAgICc8aDI+U2FtZSBDb250ZXh0PC9oMj4nLAorICAgICAgICAgICAgIGkubWFrZV90YWJsZShmMWEsZjFhLCdmcm9tJywndG8nLGNvbnRleHQ9VHJ1ZSksCisgICAgICAgICAgICAgJzxoMj5TYW1lIEZ1bGw8L2gyPicsCisgICAgICAgICAgICAgaS5tYWtlX3RhYmxlKGYxYSxmMWEsJ2Zyb20nLCd0bycsY29udGV4dD1GYWxzZSksCisgICAgICAgICAgICAgJzxoMj5FbXB0eSBDb250ZXh0PC9oMj4nLAorICAgICAgICAgICAgIGkubWFrZV90YWJsZShbXSxbXSwnZnJvbScsJ3RvJyxjb250ZXh0PVRydWUpLAorICAgICAgICAgICAgICc8aDI+RW1wdHkgRnVsbDwvaDI+JywKKyAgICAgICAgICAgICBpLm1ha2VfdGFibGUoW10sW10sJ2Zyb20nLCd0bycsY29udGV4dD1GYWxzZSksCisgICAgICAgICAgICAgJzxoMj50YWJzaXplPTI8L2gyPicsCisgICAgICAgICAgICAgai5tYWtlX3RhYmxlKGYyLHQyKSwKKyAgICAgICAgICAgICAnPGgyPnRhYnNpemU9ZGVmYXVsdDwvaDI+JywKKyAgICAgICAgICAgICBpLm1ha2VfdGFibGUoZjIsdDIpLAorICAgICAgICAgICAgICc8aDI+Q29udGV4dCAod3JhcGNvbHVtbj0xNCxudW1saW5lcz0wKTwvaDI+JywKKyAgICAgICAgICAgICBrLm1ha2VfdGFibGUoZjMuc3BsaXRsaW5lcygpLHQzLnNwbGl0bGluZXMoKSxjb250ZXh0PVRydWUsbnVtbGluZXM9MCksCisgICAgICAgICAgICAgJzxoMj53cmFwY29sdW1uPTE0LHNwbGl0bGluZXMoKTwvaDI+JywKKyAgICAgICAgICAgICBrLm1ha2VfdGFibGUoZjMuc3BsaXRsaW5lcygpLHQzLnNwbGl0bGluZXMoKSksCisgICAgICAgICAgICAgJzxoMj53cmFwY29sdW1uPTE0LHNwbGl0bGluZXMoVHJ1ZSk8L2gyPicsCisgICAgICAgICAgICAgay5tYWtlX3RhYmxlKGYzLnNwbGl0bGluZXMoVHJ1ZSksdDMuc3BsaXRsaW5lcyhUcnVlKSksCisgICAgICAgICAgICAgXSkKKyAgICAgICAgYWN0dWFsID0gZnVsbC5yZXBsYWNlKCc8L2JvZHk+JywnXG4lc1xuPC9ib2R5PicgJSB0YWJsZXMpCisKKyAgICAgICAgIyB0ZW1wb3JhcmlseSB1bmNvbW1lbnQgbmV4dCB0d28gbGluZXMgdG8gYmFzZWxpbmUgdGhpcyB0ZXN0CisgICAgICAgICN3aXRoIG9wZW4oJ3Rlc3RfZGlmZmxpYl9leHBlY3QuaHRtbCcsJ3cnKSBhcyBmcDoKKyAgICAgICAgIyAgICBmcC53cml0ZShhY3R1YWwpCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbmRmaWxlKCd0ZXN0X2RpZmZsaWJfZXhwZWN0Lmh0bWwnKSkgYXMgZnA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZnAucmVhZCgpKQorCisgICAgZGVmIHRlc3RfcmVjdXJzaW9uX2xpbWl0KHNlbGYpOgorICAgICAgICAjIENoZWNrIGlmIHRoZSBwcm9ibGVtIGRlc2NyaWJlZCBpbiBwYXRjaCAjMTQxMzcxMSBleGlzdHMuCisgICAgICAgIGxpbWl0ID0gc3lzLmdldHJlY3Vyc2lvbmxpbWl0KCkKKyAgICAgICAgb2xkID0gWyhpJTIgYW5kICJLOiVkIiBvciAiVjpBOiVkIikgJSBpIGZvciBpIGluIHJhbmdlKGxpbWl0KjIpXQorICAgICAgICBuZXcgPSBbKGklMiBhbmQgIks6JWQiIG9yICJWOkI6JWQiKSAlIGkgZm9yIGkgaW4gcmFuZ2UobGltaXQqMildCisgICAgICAgIGRpZmZsaWIuU2VxdWVuY2VNYXRjaGVyKE5vbmUsIG9sZCwgbmV3KS5nZXRfb3Bjb2RlcygpCisKKworY2xhc3MgVGVzdE91dHB1dEZvcm1hdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfdGFiX2RlbGltaXRlcihzZWxmKToKKyAgICAgICAgYXJncyA9IFsnb25lJywgJ3R3bycsICdPcmlnaW5hbCcsICdDdXJyZW50JywKKyAgICAgICAgICAgICcyMDA1LTAxLTI2IDIzOjMwOjUwJywgJzIwMTAtMDQtMDIgMTA6MjA6NTInXQorICAgICAgICB1ZCA9IGRpZmZsaWIudW5pZmllZF9kaWZmKCphcmdzLCBsaW5ldGVybT0nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHVkKVswOjJdLCBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tIE9yaWdpbmFsXHQyMDA1LTAxLTI2IDIzOjMwOjUwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIrKysgQ3VycmVudFx0MjAxMC0wNC0wMiAxMDoyMDo1MiJdKQorICAgICAgICBjZCA9IGRpZmZsaWIuY29udGV4dF9kaWZmKCphcmdzLCBsaW5ldGVybT0nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNkKVswOjJdLCBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiKioqIE9yaWdpbmFsXHQyMDA1LTAxLTI2IDIzOjMwOjUwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICItLS0gQ3VycmVudFx0MjAxMC0wNC0wMiAxMDoyMDo1MiJdKQorCisgICAgZGVmIHRlc3Rfbm9fdHJhaWxpbmdfdGFiX29uX2VtcHR5X2ZpbGVkYXRlKHNlbGYpOgorICAgICAgICBhcmdzID0gWydvbmUnLCAndHdvJywgJ09yaWdpbmFsJywgJ0N1cnJlbnQnXQorICAgICAgICB1ZCA9IGRpZmZsaWIudW5pZmllZF9kaWZmKCphcmdzLCBsaW5ldGVybT0nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHVkKVswOjJdLCBbIi0tLSBPcmlnaW5hbCIsICIrKysgQ3VycmVudCJdKQorCisgICAgICAgIGNkID0gZGlmZmxpYi5jb250ZXh0X2RpZmYoKmFyZ3MsIGxpbmV0ZXJtPScnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY2QpWzA6Ml0sIFsiKioqIE9yaWdpbmFsIiwgIi0tLSBDdXJyZW50Il0pCisKKyAgICBkZWYgdGVzdF9yYW5nZV9mb3JtYXRfdW5pZmllZChzZWxmKToKKyAgICAgICAgIyBQZXIgdGhlIGRpZmYgc3BlYyBhdCBodHRwOi8vd3d3LnVuaXgub3JnL3NpbmdsZV91bml4X3NwZWNpZmljYXRpb24vCisgICAgICAgIHNwZWMgPSAnJydcCisgICAgICAgICAgIEVhY2ggPHJhbmdlPiBmaWVsZCBzaGFsbCBiZSBvZiB0aGUgZm9ybToKKyAgICAgICAgICAgICAlMWQiLCA8YmVnaW5uaW5nIGxpbmUgbnVtYmVyPiAgaWYgdGhlIHJhbmdlIGNvbnRhaW5zIGV4YWN0bHkgb25lIGxpbmUsCisgICAgICAgICAgIGFuZDoKKyAgICAgICAgICAgICIlMWQsJTFkIiwgPGJlZ2lubmluZyBsaW5lIG51bWJlcj4sIDxudW1iZXIgb2YgbGluZXM+IG90aGVyd2lzZS4KKyAgICAgICAgICAgSWYgYSByYW5nZSBpcyBlbXB0eSwgaXRzIGJlZ2lubmluZyBsaW5lIG51bWJlciBzaGFsbCBiZSB0aGUgbnVtYmVyIG9mCisgICAgICAgICAgIHRoZSBsaW5lIGp1c3QgYmVmb3JlIHRoZSByYW5nZSwgb3IgMCBpZiB0aGUgZW1wdHkgcmFuZ2Ugc3RhcnRzIHRoZSBmaWxlLgorICAgICAgICAnJycKKyAgICAgICAgZm10ID0gZGlmZmxpYi5fZm9ybWF0X3JhbmdlX3VuaWZpZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQoMywzKSwgJzMsMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10KDMsNCksICc0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQoMyw1KSwgJzQsMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10KDMsNiksICc0LDMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdCgwLDApLCAnMCwwJykKKworICAgIGRlZiB0ZXN0X3JhbmdlX2Zvcm1hdF9jb250ZXh0KHNlbGYpOgorICAgICAgICAjIFBlciB0aGUgZGlmZiBzcGVjIGF0IGh0dHA6Ly93d3cudW5peC5vcmcvc2luZ2xlX3VuaXhfc3BlY2lmaWNhdGlvbi8KKyAgICAgICAgc3BlYyA9ICcnJ1wKKyAgICAgICAgICAgVGhlIHJhbmdlIG9mIGxpbmVzIGluIGZpbGUxIHNoYWxsIGJlIHdyaXR0ZW4gaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQKKyAgICAgICAgICAgaWYgdGhlIHJhbmdlIGNvbnRhaW5zIHR3byBvciBtb3JlIGxpbmVzOgorICAgICAgICAgICAgICAgIioqKiAlZCwlZCAqKioqXG4iLCA8YmVnaW5uaW5nIGxpbmUgbnVtYmVyPiwgPGVuZGluZyBsaW5lIG51bWJlcj4KKyAgICAgICAgICAgYW5kIHRoZSBmb2xsb3dpbmcgZm9ybWF0IG90aGVyd2lzZToKKyAgICAgICAgICAgICAgICIqKiogJWQgKioqKlxuIiwgPGVuZGluZyBsaW5lIG51bWJlcj4KKyAgICAgICAgICAgVGhlIGVuZGluZyBsaW5lIG51bWJlciBvZiBhbiBlbXB0eSByYW5nZSBzaGFsbCBiZSB0aGUgbnVtYmVyIG9mIHRoZSBwcmVjZWRpbmcgbGluZSwKKyAgICAgICAgICAgb3IgMCBpZiB0aGUgcmFuZ2UgaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLgorCisgICAgICAgICAgIE5leHQsIHRoZSByYW5nZSBvZiBsaW5lcyBpbiBmaWxlMiBzaGFsbCBiZSB3cml0dGVuIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0CisgICAgICAgICAgIGlmIHRoZSByYW5nZSBjb250YWlucyB0d28gb3IgbW9yZSBsaW5lczoKKyAgICAgICAgICAgICAgICItLS0gJWQsJWQgLS0tLVxuIiwgPGJlZ2lubmluZyBsaW5lIG51bWJlcj4sIDxlbmRpbmcgbGluZSBudW1iZXI+CisgICAgICAgICAgIGFuZCB0aGUgZm9sbG93aW5nIGZvcm1hdCBvdGhlcndpc2U6CisgICAgICAgICAgICAgICAiLS0tICVkIC0tLS1cbiIsIDxlbmRpbmcgbGluZSBudW1iZXI+CisgICAgICAgICcnJworICAgICAgICBmbXQgPSBkaWZmbGliLl9mb3JtYXRfcmFuZ2VfY29udGV4dAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdCgzLDMpLCAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10KDMsNCksICc0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQoMyw1KSwgJzQsNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10KDMsNiksICc0LDYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdCgwLDApLCAnMCcpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGRpZmZsaWIuSHRtbERpZmYuX2RlZmF1bHRfcHJlZml4ID0gMAorICAgIERvY3Rlc3RzID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoZGlmZmxpYikKKyAgICBydW5fdW5pdHRlc3QoCisgICAgICAgIFRlc3RXaXRoQXNjaWksIFRlc3RBdXRvanVuaywgVGVzdFNGcGF0Y2hlcywgVGVzdFNGYnVncywKKyAgICAgICAgVGVzdE91dHB1dEZvcm1hdCwgRG9jdGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpZmZsaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlmZmxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5NTQyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpZmZsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpZmZsaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlmZmxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5NTQyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpZmZsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpZmZsaWJfZXhwZWN0Lmh0bWwgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWZmbGliX2V4cGVjdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYjZkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWZmbGliX2V4cGVjdC5odG1sCkBAIC0wLDAgKzEsNTI2IEBACisKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCisgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorCis8aHRtbD4KKworPGhlYWQ+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIgorICAgICAgICAgIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgorICAgIDx0aXRsZT48L3RpdGxlPgorICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgICAgICAgIHRhYmxlLmRpZmYge2ZvbnQtZmFtaWx5OkNvdXJpZXI7IGJvcmRlcjptZWRpdW07fQorICAgICAgICAuZGlmZl9oZWFkZXIge2JhY2tncm91bmQtY29sb3I6I2UwZTBlMH0KKyAgICAgICAgdGQuZGlmZl9oZWFkZXIge3RleHQtYWxpZ246cmlnaHR9CisgICAgICAgIC5kaWZmX25leHQge2JhY2tncm91bmQtY29sb3I6I2MwYzBjMH0KKyAgICAgICAgLmRpZmZfYWRkIHtiYWNrZ3JvdW5kLWNvbG9yOiNhYWZmYWF9CisgICAgICAgIC5kaWZmX2NoZyB7YmFja2dyb3VuZC1jb2xvcjojZmZmZjc3fQorICAgICAgICAuZGlmZl9zdWIge2JhY2tncm91bmQtY29sb3I6I2ZmYWFhYX0KKyAgICA8L3N0eWxlPgorPC9oZWFkPgorCis8Ym9keT4KKyAgICAKKyAgICA8dGFibGUgY2xhc3M9ImRpZmYiIGlkPSJkaWZmbGliX2NoZ190bzBfX3RvcCIKKyAgICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBydWxlcz0iZ3JvdXBzIiA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDx0aGVhZD48dHI+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+ZnJvbTwvdGg+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+dG88L3RoPjwvdHI+PC90aGVhZD4KKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8wX18wIj48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8wX18wIj5mPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMF9fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzBfXzEiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMF9fMSI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnR0PC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0Ljwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuPHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsaWNhdGVkJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzUuJm5ic3A7RmxhdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO25lc3RlZC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF82Ij42PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF82Ij42PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfNyI+NzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfNyI+NzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzgiPjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzgiPjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF85Ij45PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF85Ij45PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8xMCI+MTA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8xMSI+MTE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzExIj4xMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzBfXzEiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzEyIj4xMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMTIiPjEyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8xMyI+MTM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8xNCI+MTQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzE0Ij4xNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMTUiPjE1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMTYiPjE2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8xNiI+MTY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8wX18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzE3Ij4xNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMF9fMiI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMTciPjE3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+dHQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzE4Ij4xODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzIuJm5ic3A7RXhwbGljaXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtpbXBsaWNpdC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8xOSI+MTk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8xOCI+MTg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMjAiPjIwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8xOSI+MTk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsaWNhdGVkJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMjAiPjIwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NS4mbmJzcDtGbGF0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7bmVzdGVkLjwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzIxIj4yMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMjEiPjIxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMjIiPjIyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8yMiI+MjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8yMyI+MjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzIzIj4yMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzI0Ij4yNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMjQiPjI0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMjUiPjI1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8yNSI+MjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8yNiI+MjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzI2Ij4yNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzBfXzIiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzI3Ij4yNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMjciPjI3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMjgiPjI4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8yOCI+Mjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8yOSI+Mjk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzI5Ij4yOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzMwIj4zMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMzAiPjMwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMzEiPjMxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8zMSI+MzE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8wX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMzIiPjMyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+VFQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8wX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzMyIj4zMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnR0PC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8zMyI+MzM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMzQiPjM0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMzMiPjMzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuPHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzM1Ij4zNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMzQiPjM0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGljYXRlZCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzM1Ij4zNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzUuJm5ic3A7RmxhdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO25lc3RlZC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8zNiI+MzY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzM2Ij4zNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzM3Ij4zNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMzciPjM3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMzgiPjM4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8zOCI+Mzg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8zOSI+Mzk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzM5Ij4zOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzQwIj40MDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfNDAiPjQwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfNDEiPjQxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF80MSI+NDE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF80MiI+NDI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzQyIj40MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzQzIj40MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfNDMiPjQzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfNDQiPjQ0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF80NCI+NDQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF80NSI+NDU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzQ1Ij40NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKyAgICA8dGFibGUgY2xhc3M9ImRpZmYiIHN1bW1hcnk9IkxlZ2VuZHMiPgorICAgICAgICA8dHI+IDx0aCBjb2xzcGFuPSIyIj4gTGVnZW5kcyA8L3RoPiA8L3RyPgorICAgICAgICA8dHI+IDx0ZD4gPHRhYmxlIGJvcmRlcj0iIiBzdW1tYXJ5PSJDb2xvcnMiPgorICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGg+IENvbG9ycyA8L3RoPiA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDtBZGRlZCZuYnNwOzwvdGQ+PC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX2NoZyI+Q2hhbmdlZDwvdGQ+IDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9zdWIiPkRlbGV0ZWQ8L3RkPiA8L3RyPgorICAgICAgICAgICAgICAgICAgPC90YWJsZT48L3RkPgorICAgICAgICAgICAgIDx0ZD4gPHRhYmxlIGJvcmRlcj0iIiBzdW1tYXJ5PSJMaW5rcyI+CisgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0aCBjb2xzcGFuPSIyIj4gTGlua3MgPC90aD4gPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPihmKWlyc3QgY2hhbmdlPC90ZD4gPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPihuKWV4dCBjaGFuZ2U8L3RkPiA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+KHQpb3A8L3RkPiA8L3RyPgorICAgICAgICAgICAgICAgICAgPC90YWJsZT48L3RkPiA8L3RyPgorICAgIDwvdGFibGU+CisKKzxoMj5Db250ZXh0IChmaXJzdCBkaWZmIHdpdGhpbiBudW1saW5lcz01KGRlZmF1bHQpKTwvaDI+CisKKyAgICA8dGFibGUgY2xhc3M9ImRpZmYiIGlkPSJkaWZmbGliX2NoZ190bzFfX3RvcCIKKyAgICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBydWxlcz0iZ3JvdXBzIiA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDx0aGVhZD48dHI+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+ZnJvbTwvdGg+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+dG88L3RoPjwvdHI+PC90aGVhZD4KKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8xX18wIj48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xX18wIj5mPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMV9fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzFfXzEiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMV9fMSI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnR0PC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0Ljwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuPHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsaWNhdGVkJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzUuJm5ic3A7RmxhdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO25lc3RlZC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV82Ij42PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV82Ij42PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfNyI+NzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfNyI+NzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzgiPjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzgiPjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV85Ij45PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV85Ij45PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8xMCI+MTA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PiAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMV9fMSI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMTIiPjEyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8xMiI+MTI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8xMyI+MTM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzEzIj4xMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzE0Ij4xNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMTUiPjE1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8xNSI+MTU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8xNiI+MTY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzE2Ij4xNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzFfXzIiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMTciPjE3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+VFQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xX18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8xNyI+MTc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj50dDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMTgiPjE4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0Ljwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzE5Ij4xOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzE4Ij4xODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8yMCI+MjA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzE5Ij4xOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxpY2F0ZWQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4Ljwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8yMCI+MjA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs1LiZuYnNwO0ZsYXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtuZXN0ZWQuPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMjEiPjIxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8yMSI+MjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8yMiI+MjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzIyIj4yMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzIzIj4yMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMjMiPjIzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMjQiPjI0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8yNCI+MjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8yNSI+MjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzI1Ij4yNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+ICAgICAgICAKKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8xX18yIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8yNyI+Mjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzI3Ij4yNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzI4Ij4yODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMjgiPjI4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMjkiPjI5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8yOSI+Mjk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8zMCI+MzA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzMwIj4zMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzMxIj4zMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMzEiPjMxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMV9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzMyIj4zMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMV9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8zMiI+MzI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj50dDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMzMiPjMzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0Ljwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzM0Ij4zNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzMzIj4zMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8zNSI+MzU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzM0Ij4zNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxpY2F0ZWQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4Ljwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8zNSI+MzU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs1LiZuYnNwO0ZsYXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtuZXN0ZWQuPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMzYiPjM2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8zNiI+MzY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8zNyI+Mzc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzM3Ij4zNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzM4Ij4zODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMzgiPjM4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMzkiPjM5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8zOSI+Mzk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV80MCI+NDA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzQwIj40MDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKzxoMj5Db250ZXh0IChmaXJzdCBkaWZmIGFmdGVyIG51bWxpbmVzPTUoZGVmYXVsdCkpPC9oMj4KKworICAgIDx0YWJsZSBjbGFzcz0iZGlmZiIgaWQ9ImRpZmZsaWJfY2hnX3RvMl9fdG9wIgorICAgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHJ1bGVzPSJncm91cHMiID4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPHRoZWFkPjx0cj48dGggY2xhc3M9ImRpZmZfbmV4dCI+PGJyIC8+PC90aD48dGggY29sc3Bhbj0iMiIgY2xhc3M9ImRpZmZfaGVhZGVyIj5mcm9tPC90aD48dGggY2xhc3M9ImRpZmZfbmV4dCI+PGJyIC8+PC90aD48dGggY29sc3Bhbj0iMiIgY2xhc3M9ImRpZmZfaGVhZGVyIj50bzwvdGg+PC90cj48L3RoZWFkPgorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzJfXzAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+NDU2PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+NDU2PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl84Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjQ1NjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl84Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjQ1NjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj40NTY8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj40NTY8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzEwIj4xMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj40NTY8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjQ1NjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMTEiPjExPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8xMSI+MTE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8yX18xIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzEyIj4xMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMl9fMSI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMTIiPjEyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+dHQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzEzIj4xMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzIuJm5ic3A7RXhwbGljaXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtpbXBsaWNpdC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8xNCI+MTQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8xMyI+MTM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMTUiPjE1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8xNCI+MTQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsaWNhdGVkJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMTUiPjE1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NS4mbmJzcDtGbGF0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7bmVzdGVkLjwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzE2Ij4xNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMTYiPjE2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMTciPjE3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8xNyI+MTc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8xOCI+MTg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzE4Ij4xODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzE5Ij4xOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMTkiPjE5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMjAiPjIwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8yMCI+MjA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PiAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMl9fMSI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMjIiPjIyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8yMiI+MjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8yMyI+MjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzIzIj4yMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzI0Ij4yNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMjQiPjI0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMjUiPjI1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8yNSI+MjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8yNiI+MjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzI2Ij4yNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzJfXzIiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMjciPjI3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+VFQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8yX18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8yNyI+Mjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj50dDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMjgiPjI4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0Ljwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzI5Ij4yOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzI4Ij4yODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8zMCI+MzA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzI5Ij4yOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxpY2F0ZWQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4Ljwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8zMCI+MzA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs1LiZuYnNwO0ZsYXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtuZXN0ZWQuPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMzEiPjMxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8zMSI+MzE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8zMiI+MzI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzMyIj4zMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzMzIj4zMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMzMiPjMzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMzQiPjM0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8zNCI+MzQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8zNSI+MzU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzM1Ij4zNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+ICAgICAgICAKKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8yX18yIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8zNyI+Mzc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzM3Ij4zNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzM4Ij4zODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMzgiPjM4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMzkiPjM5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8zOSI+Mzk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl80MCI+NDA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzQwIj40MDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzQxIj40MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfNDEiPjQxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMl9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzQyIj40MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMl9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl80MiI+NDI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj50dDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfNDMiPjQzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0Ljwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzQ0Ij40NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzQzIj40MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl80NSI+NDU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzQ0Ij40NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxpY2F0ZWQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4Ljwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl80NSI+NDU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs1LiZuYnNwO0ZsYXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtuZXN0ZWQuPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfNDYiPjQ2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl80NiI+NDY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl80NyI+NDc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzQ3Ij40NzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzQ4Ij40ODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfNDgiPjQ4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfNDkiPjQ5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl80OSI+NDk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl81MCI+NTA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzUwIj41MDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKzxoMj5Db250ZXh0IChudW1saW5lcz02KTwvaDI+CisKKyAgICA8dGFibGUgY2xhc3M9ImRpZmYiIGlkPSJkaWZmbGliX2NoZ190bzNfX3RvcCIKKyAgICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBydWxlcz0iZ3JvdXBzIiA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDx0aGVhZD48dHI+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+ZnJvbTwvdGg+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+dG88L3RoPjwvdHI+PC90aGVhZD4KKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8zX18wIj48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8zX18wIj5mPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvM19fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzNfXzEiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvM19fMSI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnR0PC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0Ljwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuPHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsaWNhdGVkJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzUuJm5ic3A7RmxhdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO25lc3RlZC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM182Ij42PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM182Ij42PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfNyI+NzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfNyI+NzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzgiPjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzgiPjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM185Ij45PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM185Ij45PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18xMCI+MTA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8zX18xIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18xMSI+MTE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzExIj4xMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzEyIj4xMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMTIiPjEyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18xMyI+MTM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18xNCI+MTQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzE0Ij4xNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMTUiPjE1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMTYiPjE2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18xNiI+MTY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8zX18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzE3Ij4xNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvM19fMiI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMTciPjE3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+dHQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzE4Ij4xODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzIuJm5ic3A7RXhwbGljaXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtpbXBsaWNpdC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18xOSI+MTk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18xOCI+MTg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMjAiPjIwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18xOSI+MTk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsaWNhdGVkJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMjAiPjIwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NS4mbmJzcDtGbGF0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7bmVzdGVkLjwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzIxIj4yMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMjEiPjIxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMjIiPjIyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18yMiI+MjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18yMyI+MjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzIzIj4yMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzI0Ij4yNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMjQiPjI0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMjUiPjI1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18yNSI+MjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8zX18yIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18yNiI+MjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzI2Ij4yNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzI3Ij4yNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMjciPjI3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMjgiPjI4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18yOCI+Mjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18yOSI+Mjk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzI5Ij4yOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzMwIj4zMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMzAiPjMwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMzEiPjMxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18zMSI+MzE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8zX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMzIiPjMyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+VFQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8zX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzMyIj4zMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnR0PC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18zMyI+MzM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMzQiPjM0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMzMiPjMzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuPHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzM1Ij4zNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMzQiPjM0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGljYXRlZCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzM1Ij4zNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzUuJm5ic3A7RmxhdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO25lc3RlZC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18zNiI+MzY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzM2Ij4zNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzM3Ij4zNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMzciPjM3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMzgiPjM4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18zOCI+Mzg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18zOSI+Mzk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzM5Ij4zOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzQwIj40MDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfNDAiPjQwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfNDEiPjQxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM180MSI+NDE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGFibGU+Cis8aDI+Q29udGV4dCAobnVtbGluZXM9MCk8L2gyPgorCisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBpZD0iZGlmZmxpYl9jaGdfdG80X190b3AiCisgICAgICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgcnVsZXM9Imdyb3VwcyIgPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8dGhlYWQ+PHRyPjx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPjx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPmZyb208L3RoPjx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPjx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPnRvPC90aD48L3RyPjwvdGhlYWQ+CisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvNF9fMCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvNF9fMSI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNF8yIj4yPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+VFQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG80X18xIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNF8yIj4yPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+dHQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb200XzMiPjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTRfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG80XzMiPjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTRfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzRfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxpY2F0ZWQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4Ljwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNF81Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NS4mbmJzcDtGbGF0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7bmVzdGVkLjwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+ICAgICAgICAKKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG80X18xIj48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG80X18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb200XzE3Ij4xNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvNF9fMiI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzRfMTciPjE3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+dHQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb200XzE4Ij4xODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzIuJm5ic3A7RXhwbGljaXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtpbXBsaWNpdC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNF8xOSI+MTk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNF8xOCI+MTg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTRfMjAiPjIwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNF8xOSI+MTk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsaWNhdGVkJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzRfMjAiPjIwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NS4mbmJzcDtGbGF0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7bmVzdGVkLjwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+ICAgICAgICAKKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG80X18yIj48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG80X190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTRfMzIiPjMyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+VFQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG80X190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG80XzMyIj4zMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnR0PC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNF8zMyI+MzM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTRfMzQiPjM0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzRfMzMiPjMzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuPHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb200XzM1Ij4zNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzRfMzQiPjM0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGljYXRlZCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG80XzM1Ij4zNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzUuJm5ic3A7RmxhdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO25lc3RlZC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGFibGU+Cis8aDI+U2FtZSBDb250ZXh0PC9oMj4KKworICAgIDx0YWJsZSBjbGFzcz0iZGlmZiIgaWQ9ImRpZmZsaWJfY2hnX3RvNV9fdG9wIgorICAgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHJ1bGVzPSJncm91cHMiID4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPHRoZWFkPjx0cj48dGggY2xhc3M9ImRpZmZfbmV4dCI+PGJyIC8+PC90aD48dGggY29sc3Bhbj0iMiIgY2xhc3M9ImRpZmZfaGVhZGVyIj5mcm9tPC90aD48dGggY2xhc3M9ImRpZmZfbmV4dCI+PGJyIC8+PC90aD48dGggY29sc3Bhbj0iMiIgY2xhc3M9ImRpZmZfaGVhZGVyIj50bzwvdGg+PC90cj48L3RoZWFkPgorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzVfX3RvcCI+dDwvYT48L3RkPjx0ZD48L3RkPjx0ZD4mbmJzcDtObyBEaWZmZXJlbmNlcyBGb3VuZCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzVfX3RvcCI+dDwvYT48L3RkPjx0ZD48L3RkPjx0ZD4mbmJzcDtObyBEaWZmZXJlbmNlcyBGb3VuZCZuYnNwOzwvdGQ+PC90cj4KKyAgICAgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorPGgyPlNhbWUgRnVsbDwvaDI+CisKKyAgICA8dGFibGUgY2xhc3M9ImRpZmYiIGlkPSJkaWZmbGliX2NoZ190bzZfX3RvcCIKKyAgICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBydWxlcz0iZ3JvdXBzIiA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDx0aGVhZD48dHI+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+ZnJvbTwvdGg+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+dG88L3RoPjwvdHI+PC90aGVhZD4KKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG82X190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG82X190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8yIj4yPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZVRUZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmVUVGVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzIuJm5ic3A7RXhwbGljaXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtpbXBsaWNpdC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl81Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl81Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl84Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl84Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzEwIj4xMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMTEiPjExPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8xMSI+MTE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8xMiI+MTI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzEyIj4xMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzEzIj4xMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8xNCI+MTQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8xNSI+MTU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzE2Ij4xNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMTYiPjE2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMTciPjE3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZVRUZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMTciPjE3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZVRUZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzE4Ij4xODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzE4Ij4xODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8xOSI+MTk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8xOSI+MTk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMjAiPjIwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8yMCI+MjA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8yMSI+MjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzIxIj4yMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzIyIj4yMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMjIiPjIyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMjMiPjIzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8yMyI+MjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8yNCI+MjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzI0Ij4yNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzI1Ij4yNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMjUiPjI1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMjYiPjI2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8yNiI+MjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8yNyI+Mjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzI3Ij4yNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzI4Ij4yODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMjgiPjI4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMjkiPjI5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8yOSI+Mjk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8zMCI+MzA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzMwIj4zMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzMxIj4zMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMzEiPjMxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMzIiPjMyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZVRUZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMzIiPjMyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZVRUZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzMzIj4zMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzMzIj4zMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8zNCI+MzQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8zNCI+MzQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMzUiPjM1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8zNSI+MzU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8zNiI+MzY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzM2Ij4zNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzM3Ij4zNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMzciPjM3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMzgiPjM4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8zOCI+Mzg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8zOSI+Mzk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzM5Ij4zOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzQwIj40MDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfNDAiPjQwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfNDEiPjQxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl80MSI+NDE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl80MiI+NDI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzQyIj40MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzQzIj40MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfNDMiPjQzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfNDQiPjQ0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl80NCI+NDQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl80NSI+NDU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzQ1Ij40NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKzxoMj5FbXB0eSBDb250ZXh0PC9oMj4KKworICAgIDx0YWJsZSBjbGFzcz0iZGlmZiIgaWQ9ImRpZmZsaWJfY2hnX3RvN19fdG9wIgorICAgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHJ1bGVzPSJncm91cHMiID4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPHRoZWFkPjx0cj48dGggY2xhc3M9ImRpZmZfbmV4dCI+PGJyIC8+PC90aD48dGggY29sc3Bhbj0iMiIgY2xhc3M9ImRpZmZfaGVhZGVyIj5mcm9tPC90aD48dGggY2xhc3M9ImRpZmZfbmV4dCI+PGJyIC8+PC90aD48dGggY29sc3Bhbj0iMiIgY2xhc3M9ImRpZmZfaGVhZGVyIj50bzwvdGg+PC90cj48L3RoZWFkPgorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzdfX3RvcCI+dDwvYT48L3RkPjx0ZD48L3RkPjx0ZD4mbmJzcDtObyBEaWZmZXJlbmNlcyBGb3VuZCZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzdfX3RvcCI+dDwvYT48L3RkPjx0ZD48L3RkPjx0ZD4mbmJzcDtObyBEaWZmZXJlbmNlcyBGb3VuZCZuYnNwOzwvdGQ+PC90cj4KKyAgICAgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorPGgyPkVtcHR5IEZ1bGw8L2gyPgorCisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBpZD0iZGlmZmxpYl9jaGdfdG84X190b3AiCisgICAgICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgcnVsZXM9Imdyb3VwcyIgPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8dGhlYWQ+PHRyPjx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPjx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPmZyb208L3RoPjx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPjx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPnRvPC90aD48L3RyPjwvdGhlYWQ+CisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvOF9fdG9wIj50PC9hPjwvdGQ+PHRkPjwvdGQ+PHRkPiZuYnNwO0VtcHR5IEZpbGUmbmJzcDs8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG84X190b3AiPnQ8L2E+PC90ZD48dGQ+PC90ZD48dGQ+Jm5ic3A7RW1wdHkgRmlsZSZuYnNwOzwvdGQ+PC90cj4KKyAgICAgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorPGgyPnRhYnNpemU9MjwvaDI+CisKKyAgICA8dGFibGUgY2xhc3M9ImRpZmYiIGlkPSJkaWZmbGliX2NoZ190bzlfX3RvcCIKKyAgICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBydWxlcz0iZ3JvdXBzIiA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIAorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzlfXzAiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzlfXzAiPmY8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTlfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG85X18wIj5mPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV8xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvOV9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb205XzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzE6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOlt0dF0mbmJzcDt0bzpbc3Nzc108L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG85X190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG85XzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzE6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOlt0dF0mbmJzcDt0bzpbc3Nzc108L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb205XzMiPjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7Jm5ic3A7TGluZSZuYnNwOzI6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3R0XSZuYnNwO3RvOltzc3NzdF08L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzlfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDsmbmJzcDtMaW5lJm5ic3A7MjombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHRdJm5ic3A7dG86W3Nzc3N0XTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTlfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MzombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHN0XSZuYnNwO3RvOltzc3Nzc3NdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG85XzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzM6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3RzdF0mbmJzcDt0bzpbc3Nzc3NzXTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTlfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5MaW5lJm5ic3A7NDombmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOzwvc3Bhbj5oYXMmbmJzcDtmcm9tOltzc3RdJm5ic3A7dG86W3Nzc10mbmJzcDthZnRlciZuYnNwOzo8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzlfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5MaW5lJm5ic3A7NDombmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOzwvc3Bhbj5oYXMmbmJzcDtmcm9tOltzc3RdJm5ic3A7dG86W3Nzc10mbmJzcDthZnRlciZuYnNwOzo8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb205XzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzU6Jm5ic3A7aGFzJm5ic3A7ZnJvbTpbdF0mbmJzcDt0bzpbc3NdJm5ic3A7YXQmbmJzcDtlbmQ8c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOzwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzlfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5MaW5lJm5ic3A7NTombmJzcDtoYXMmbmJzcDtmcm9tOlt0XSZuYnNwO3RvOltzc10mbmJzcDthdCZuYnNwO2VuZDwvdGQ+PC90cj4KKyAgICAgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorPGgyPnRhYnNpemU9ZGVmYXVsdDwvaDI+CisKKyAgICA8dGFibGUgY2xhc3M9ImRpZmYiIGlkPSJkaWZmbGliX2NoZ190bzEwX190b3AiCisgICAgICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgcnVsZXM9Imdyb3VwcyIgPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICAKKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8xMF9fMCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTBfXzAiPmY8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTBfXzAiPmY8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF8xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTBfX3RvcCI+dDwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTBfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MTombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3R0XSZuYnNwO3RvOltzc3NzXTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEwX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF8yIj4yPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDsxOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbdHRdJm5ic3A7dG86W3Nzc3NdPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTBfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtMaW5lJm5ic3A7MjombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHRdJm5ic3A7dG86W3Nzc3N0XTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTBfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtMaW5lJm5ic3A7MjombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHRdJm5ic3A7dG86W3Nzc3N0XTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzM6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3RzdF0mbmJzcDt0bzpbc3Nzc3NzXTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTBfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MzombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3NzdHN0XSZuYnNwO3RvOltzc3Nzc3NdPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTBfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5MaW5lJm5ic3A7NDombmJzcDsmbmJzcDs8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5oYXMmbmJzcDtmcm9tOltzc3RdJm5ic3A7dG86W3Nzc10mbmJzcDthZnRlciZuYnNwOzo8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEwXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzQ6Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDs8L3NwYW4+aGFzJm5ic3A7ZnJvbTpbc3N0XSZuYnNwO3RvOltzc3NdJm5ic3A7YWZ0ZXImbmJzcDs6PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTBfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5MaW5lJm5ic3A7NTombmJzcDtoYXMmbmJzcDtmcm9tOlt0XSZuYnNwO3RvOltzc10mbmJzcDthdCZuYnNwO2VuZDxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTBfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5MaW5lJm5ic3A7NTombmJzcDtoYXMmbmJzcDtmcm9tOlt0XSZuYnNwO3RvOltzc10mbmJzcDthdCZuYnNwO2VuZDwvdGQ+PC90cj4KKyAgICAgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorPGgyPkNvbnRleHQgKHdyYXBjb2x1bW49MTQsbnVtbGluZXM9MCk8L2gyPgorCisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBpZD0iZGlmZmxpYl9jaGdfdG8xMV9fdG9wIgorICAgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHJ1bGVzPSJncm91cHMiID4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMTFfXzAiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzExX18xIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMV80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+bGluZSZuYnNwOzI8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTFfXzEiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMV80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+bGluZSZuYnNwOzImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDthZGRlPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+ZDwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+ICAgICAgICAKKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8xMV9fMSI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTFfXzIiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTExXzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzQmbmJzcDsmbmJzcDsmbmJzcDtjaGFuPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5nPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzExX18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTFfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NCZuYnNwOyZuYnNwOyZuYnNwO2NoYW48c3BhbiBjbGFzcz0iZGlmZl9jaGciPkc8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5lPC9zcGFuPmQ8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5FPC9zcGFuPmQ8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMV83Ij43PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs1PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDs8L3NwYW4+Jm5ic3A7Jm5ic3A7Y2hhbjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Zzwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzExXzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPmE8L3NwYW4+Jm5ic3A7Jm5ic3A7Y2hhbjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Rzwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9jaGciPjwvc3Bhbj5lZDwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9jaGciPjwvc3Bhbj5lZDwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTExXzgiPjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzY8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOzwvc3Bhbj4mbmJzcDsmbmJzcDtjaGFuZzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTFfOCI+ODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+YTwvc3Bhbj4mbmJzcDsmbmJzcDtjaGFuZzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+ZTwvc3Bhbj5kPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+RTwvc3Bhbj5kPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PiAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMTFfXzIiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzExX18zIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMV8xMCI+MTA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj5saW5lJm5ic3A7OCZuYnNwOyZuYnNwO3N1YnRyYTwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMV9fMyI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzExXzEwIj4xMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPmxpbmUmbmJzcDs4PC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Y3RlZDwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDs8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+ICAgICAgICAKKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8xMV9fMyI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTFfX3RvcCI+dDwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTFfMTIiPjEyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+MTIzNDU2Nzg5MDEyMzQ8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTFfX3RvcCI+dDwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzExXzEyIj4xMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPjEyMzQ1Njc4OTA8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj41Njc4OTAxMjM0NTY4OTwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDs8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPjAxMjM0NTwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDs8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMV8xMyI+MTM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj5zaG9ydCZuYnNwO2xpbmU8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMV8xMyI+MTM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj5hbm90aGVyJm5ic3A7bG9uZyZuYnNwO2w8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj5pbmUmbmJzcDt0aGF0Jm5ic3A7bmVlZHM8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDt0byZuYnNwO2JlJm5ic3A7d3JhcHBlZDwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMV8xNCI+MTQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+anVzdCZuYnNwO2ZpdDxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+czwvc3Bhbj4mbmJzcDtpbiEhPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMV8xNCI+MTQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+anVzdCZuYnNwO2ZpdDxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Uzwvc3Bhbj4mbmJzcDtpbiEhPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTFfMTUiPjE1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmp1c3QmbmJzcDtmaXRzJm5ic3A7aW4mbmJzcDt0PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMV8xNSI+MTU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+anVzdCZuYnNwO2ZpdHMmbmJzcDtpbiZuYnNwO3Q8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj53byZuYnNwO2xpbmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnM8L3NwYW4+Jm5ic3A7eXVwISE8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+d28mbmJzcDtsaW5lPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5TPC9zcGFuPiZuYnNwO3l1cCEhPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGFibGU+Cis8aDI+d3JhcGNvbHVtbj0xNCxzcGxpdGxpbmVzKCk8L2gyPgorCisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBpZD0iZGlmZmxpYl9jaGdfdG8xMl9fdG9wIgorICAgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHJ1bGVzPSJncm91cHMiID4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMTJfXzAiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEyX18wIj5mPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMl8xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDswPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTJfXzAiPmY8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMl8xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDswPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTJfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM0NTY3ODkwMTIzNDwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM0NTY3ODkwMTIzNDwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjU2Nzg5MDEyMzQ1Njg5PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjU2Nzg5MDEyMzQ1Njg5PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8xMl9fMSI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjAxMjM0NTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4wMTIzNDU8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMl8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDsxPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMl8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDsxPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMl9fMSI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTJfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPmxpbmUmbmJzcDsyPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEyX18xIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPmxpbmUmbmJzcDsyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7YWRkZTwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPmQ8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTJfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7MzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7MzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTJfXzIiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEyXzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzQmbmJzcDsmbmJzcDsmbmJzcDtjaGFuPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5nPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEyX18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NCZuYnNwOyZuYnNwOyZuYnNwO2NoYW48c3BhbiBjbGFzcz0iZGlmZl9jaGciPkc8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5lPC9zcGFuPmQ8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5FPC9zcGFuPmQ8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzEyX18yIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTJfNyI+NzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwO2NoYW48c3BhbiBjbGFzcz0iZGlmZl9jaGciPmc8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMl83Ij43PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs1PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5hPC9zcGFuPiZuYnNwOyZuYnNwO2NoYW48c3BhbiBjbGFzcz0iZGlmZl9jaGciPkc8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj48L3NwYW4+ZWQ8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj48L3NwYW4+ZWQ8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMl84Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs2PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDs8L3NwYW4+Jm5ic3A7Jm5ic3A7Y2hhbmc8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEyXzgiPjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzY8c3BhbiBjbGFzcz0iZGlmZl9jaGciPmE8L3NwYW4+Jm5ic3A7Jm5ic3A7Y2hhbmc8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzEyX18zIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5lPC9zcGFuPmQ8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5FPC9zcGFuPmQ8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMl85Ij45PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs3PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMl85Ij45PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs3PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMl9fMyI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTJfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+bGluZSZuYnNwOzgmbmJzcDsmbmJzcDtzdWJ0cmE8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTJfXzMiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMl8xMCI+MTA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj5saW5lJm5ic3A7ODwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPmN0ZWQ8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTJfMTEiPjExPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs5PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMl8xMSI+MTE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzk8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEyX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEyXzEyIj4xMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPjEyMzQ1Njc4OTAxMjM0PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEyX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMl8xMiI+MTI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4xMjM0NTY3ODkwPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+NTY3ODkwMTIzNDU2ODk8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4wMTIzNDU8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTJfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+c2hvcnQmbmJzcDtsaW5lPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+YW5vdGhlciZuYnNwO2xvbmcmbmJzcDtsPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+aW5lJm5ic3A7dGhhdCZuYnNwO25lZWRzPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7dG8mbmJzcDtiZSZuYnNwO3dyYXBwZWQ8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTJfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmp1c3QmbmJzcDtmaXQ8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnM8L3NwYW4+Jm5ic3A7aW4hITwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmp1c3QmbmJzcDtmaXQ8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlM8L3NwYW4+Jm5ic3A7aW4hITwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEyXzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5qdXN0Jm5ic3A7Zml0cyZuYnNwO2luJm5ic3A7dDwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfMTUiPjE1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmp1c3QmbmJzcDtmaXRzJm5ic3A7aW4mbmJzcDt0PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+d28mbmJzcDtsaW5lPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5zPC9zcGFuPiZuYnNwO3l1cCEhPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPndvJm5ic3A7bGluZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Uzwvc3Bhbj4mbmJzcDt5dXAhITwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEyXzE2Ij4xNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj50aGUmbmJzcDtlbmQ8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEyXzE2Ij4xNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj50aGUmbmJzcDtlbmQ8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKzxoMj53cmFwY29sdW1uPTE0LHNwbGl0bGluZXMoVHJ1ZSk8L2gyPgorCisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBpZD0iZGlmZmxpYl9jaGdfdG8xM19fdG9wIgorICAgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHJ1bGVzPSJncm91cHMiID4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMTNfXzAiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEzX18wIj5mPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xM18xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDswPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTNfXzAiPmY8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xM18xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDswPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTNfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM0NTY3ODkwMTIzNDwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM0NTY3ODkwMTIzNDwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjU2Nzg5MDEyMzQ1Njg5PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjU2Nzg5MDEyMzQ1Njg5PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8xM19fMSI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjAxMjM0NTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4wMTIzNDU8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xM18zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDsxPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xM18zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDsxPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xM19fMSI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTNfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPmxpbmUmbmJzcDsyPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEzX18xIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPmxpbmUmbmJzcDsyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7YWRkZTwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPmQ8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTNfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7MzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7MzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTNfXzIiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEzXzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzQmbmJzcDsmbmJzcDsmbmJzcDtjaGFuPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5nPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEzX18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NCZuYnNwOyZuYnNwOyZuYnNwO2NoYW48c3BhbiBjbGFzcz0iZGlmZl9jaGciPkc8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5lPC9zcGFuPmQ8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5FPC9zcGFuPmQ8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzEzX18yIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTNfNyI+NzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwO2NoYW48c3BhbiBjbGFzcz0iZGlmZl9jaGciPmc8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xM183Ij43PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs1PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5hPC9zcGFuPiZuYnNwOyZuYnNwO2NoYW48c3BhbiBjbGFzcz0iZGlmZl9jaGciPkc8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj48L3NwYW4+ZWQ8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj48L3NwYW4+ZWQ8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xM184Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs2PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDs8L3NwYW4+Jm5ic3A7Jm5ic3A7Y2hhbmc8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEzXzgiPjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzY8c3BhbiBjbGFzcz0iZGlmZl9jaGciPmE8L3NwYW4+Jm5ic3A7Jm5ic3A7Y2hhbmc8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzEzX18zIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5lPC9zcGFuPmQ8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5FPC9zcGFuPmQ8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xM185Ij45PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs3PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xM185Ij45PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs3PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xM19fMyI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTNfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+bGluZSZuYnNwOzgmbmJzcDsmbmJzcDtzdWJ0cmE8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTNfXzMiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xM18xMCI+MTA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj5saW5lJm5ic3A7ODwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPmN0ZWQ8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTNfMTEiPjExPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs5PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xM18xMSI+MTE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzk8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEzX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEzXzEyIj4xMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPjEyMzQ1Njc4OTAxMjM0PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEzX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xM18xMiI+MTI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4xMjM0NTY3ODkwPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+NTY3ODkwMTIzNDU2ODk8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4wMTIzNDU8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTNfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+c2hvcnQmbmJzcDtsaW5lPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+YW5vdGhlciZuYnNwO2xvbmcmbmJzcDtsPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+aW5lJm5ic3A7dGhhdCZuYnNwO25lZWRzPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7dG8mbmJzcDtiZSZuYnNwO3dyYXBwZWQ8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTNfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmp1c3QmbmJzcDtmaXQ8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnM8L3NwYW4+Jm5ic3A7aW4hITwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmp1c3QmbmJzcDtmaXQ8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlM8L3NwYW4+Jm5ic3A7aW4hITwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEzXzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5qdXN0Jm5ic3A7Zml0cyZuYnNwO2luJm5ic3A7dDwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfMTUiPjE1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmp1c3QmbmJzcDtmaXRzJm5ic3A7aW4mbmJzcDt0PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+d28mbmJzcDtsaW5lPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5zPC9zcGFuPiZuYnNwO3l1cCEhPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPndvJm5ic3A7bGluZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Uzwvc3Bhbj4mbmJzcDt5dXAhITwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEzXzE2Ij4xNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj50aGUmbmJzcDtlbmQ8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEzXzE2Ij4xNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj50aGUmbmJzcDtlbmQ8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKzwvYm9keT4KKworPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpcmNhY2hlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlyY2FjaGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhZDMxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpcmNhY2hlLnB5CkBAIC0wLDAgKzEsNzcgQEAKKyIiIgorICBUZXN0IGNhc2VzIGZvciB0aGUgZGlyY2FjaGUgbW9kdWxlCisgIE5pY2sgTWF0aGV3c29uCisiIiIKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUKK2RpcmNhY2hlID0gaW1wb3J0X21vZHVsZSgnZGlyY2FjaGUnLCBkZXByZWNhdGVkPVRydWUpCitpbXBvcnQgb3MsIHRpbWUsIHN5cywgdGVtcGZpbGUKKworCitjbGFzcyBEaXJjYWNoZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGVtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmb3IgZm5hbWUgaW4gb3MubGlzdGRpcihzZWxmLnRlbXBkaXIpOgorICAgICAgICAgICAgc2VsZi5kZWxUZW1wKGZuYW1lKQorICAgICAgICBvcy5ybWRpcihzZWxmLnRlbXBkaXIpCisKKyAgICBkZWYgd3JpdGVUZW1wKHNlbGYsIGZuYW1lKToKKyAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYudGVtcGRpciwgZm5hbWUpLCAndycpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIG1rZGlyVGVtcChzZWxmLCBmbmFtZSk6CisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihzZWxmLnRlbXBkaXIsIGZuYW1lKSkKKworICAgIGRlZiBkZWxUZW1wKHNlbGYsIGZuYW1lKToKKyAgICAgICAgZm5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZW1wZGlyLCBmbmFtZSkKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmbmFtZSk6CisgICAgICAgICAgICBvcy5ybWRpcihmbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9zLnVubGluayhmbmFtZSkKKworICAgIGRlZiB0ZXN0X2xpc3RkaXIoc2VsZik6CisgICAgICAgICMjIFNVQ0NFU1NGVUwgQ0FTRVMKKyAgICAgICAgZW50cmllcyA9IGRpcmNhY2hlLmxpc3RkaXIoc2VsZi50ZW1wZGlyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJpZXMsIFtdKQorCisgICAgICAgICMgQ2hlY2sgdGhhdCBjYWNoZSBpcyBhY3R1YWxseSBjYWNoaW5nLCBub3QganVzdCBwYXNzaW5nIHRocm91Z2guCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaXJjYWNoZS5saXN0ZGlyKHNlbGYudGVtcGRpcikgaXMgZW50cmllcykKKworICAgICAgICAjIERpcmVjdG9yaWVzIGFyZW4ndCAiZmlsZXMiIG9uIFdpbmRvd3MsIGFuZCBkaXJlY3RvcnkgbXRpbWUgaGFzCisgICAgICAgICMgbm90aGluZyB0byBkbyB3aXRoIHdoZW4gZmlsZXMgdW5kZXIgYSBkaXJlY3RvcnkgZ2V0IGNyZWF0ZWQuCisgICAgICAgICMgVGhhdCBpcywgdGhpcyB0ZXN0IGNhbid0IHBvc3NpYmx5IHdvcmsgdW5kZXIgV2luZG93cyAtLSBkaXJjYWNoZQorICAgICAgICAjIGlzIG9ubHkgZ29vZCBmb3IgY2FwdHVyaW5nIGEgb25lLXNob3Qgc25hcHNob3QgdGhlcmUuCisKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzozXSBub3QgaW4gKCd3aW4nLCAnb3MyJyk6CisgICAgICAgICAgICAjIFNhZGx5LCBkaXJjYWNoZSBoYXMgdGhlIHNhbWUgZ3JhbnVsYXJpdHkgYXMgc3RhdC5tdGltZSwgYW5kIHNvCisgICAgICAgICAgICAjIGNhbid0IG5vdGljZSBhbnkgY2hhbmdlcyB0aGF0IG9jY3VycmVkIHdpdGhpbiAxIHNlYyBvZiB0aGUgbGFzdAorICAgICAgICAgICAgIyB0aW1lIGl0IGV4YW1pbmVkIGEgZGlyZWN0b3J5LgorICAgICAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICAgICAgc2VsZi53cml0ZVRlbXAoInRlc3QxIikKKyAgICAgICAgICAgIGVudHJpZXMgPSBkaXJjYWNoZS5saXN0ZGlyKHNlbGYudGVtcGRpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW50cmllcywgWyd0ZXN0MSddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpcmNhY2hlLmxpc3RkaXIoc2VsZi50ZW1wZGlyKSBpcyBlbnRyaWVzKQorCisgICAgICAgICMjIFVOU1VDQ0VTU0ZVTCBDQVNFUworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBkaXJjYWNoZS5saXN0ZGlyLCBzZWxmLnRlbXBkaXIrIl9ub25leGlzdGVudCIpCisKKyAgICBkZWYgdGVzdF9hbm5vdGF0ZShzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZVRlbXAoInRlc3QyIikKKyAgICAgICAgc2VsZi5ta2RpclRlbXAoIkEiKQorICAgICAgICBsc3QgPSBbJ0EnLCAndGVzdDInLCAndGVzdF9ub25leGlzdGVudCddCisgICAgICAgIGRpcmNhY2hlLmFubm90YXRlKHNlbGYudGVtcGRpciwgbHN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgWydBLycsICd0ZXN0MicsICd0ZXN0X25vbmV4aXN0ZW50J10pCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRyeToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KERpcmNhY2hlVGVzdHMpCisgICAgZmluYWxseToKKyAgICAgICAgZGlyY2FjaGUucmVzZXQoKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpcmNhY2hlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpcmNhY2hlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWJmYzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlyY2FjaGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpcmNhY2hlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpcmNhY2hlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWJmYzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlyY2FjaGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rpcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rpcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2U0Yjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlzLnB5CkBAIC0wLDAgKzEsMTUxIEBACisjIE1pbmltYWwgdGVzdHMgZm9yIGRpcyBtb2R1bGUKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBkaXMKK2ltcG9ydCBTdHJpbmdJTworCisKK2RlZiBfZihhKToKKyAgICBwcmludCBhCisgICAgcmV0dXJuIDEKKworZGlzX2YgPSAiIiJcCisgJS00ZCAgICAgICAgIDAgTE9BRF9GQVNUICAgICAgICAgICAgICAgIDAgKGEpCisgICAgICAgICAgICAgIDMgUFJJTlRfSVRFTQorICAgICAgICAgICAgICA0IFBSSU5UX05FV0xJTkUKKworICUtNGQgICAgICAgICA1IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQorICAgICAgICAgICAgICA4IFJFVFVSTl9WQUxVRQorIiIiJShfZi5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8gKyAxLAorICAgICBfZi5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8gKyAyKQorCisKK2RlZiBidWc3MDg5MDEoKToKKyAgICBmb3IgcmVzIGluIHJhbmdlKDEsCisgICAgICAgICAgICAgICAgICAgICAxMCk6CisgICAgICAgIHBhc3MKKworZGlzX2J1ZzcwODkwMSA9ICIiIlwKKyAlLTRkICAgICAgICAgMCBTRVRVUF9MT09QICAgICAgICAgICAgICAyMyAodG8gMjYpCisgICAgICAgICAgICAgIDMgTE9BRF9HTE9CQUwgICAgICAgICAgICAgIDAgKHJhbmdlKQorICAgICAgICAgICAgICA2IExPQURfQ09OU1QgICAgICAgICAgICAgICAxICgxKQorCisgJS00ZCAgICAgICAgIDkgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDIgKDEwKQorICAgICAgICAgICAgIDEyIENBTExfRlVOQ1RJT04gICAgICAgICAgICAyCisgICAgICAgICAgICAgMTUgR0VUX0lURVIKKyAgICAgICAgPj4gICAxNiBGT1JfSVRFUiAgICAgICAgICAgICAgICAgNiAodG8gMjUpCisgICAgICAgICAgICAgMTkgU1RPUkVfRkFTVCAgICAgICAgICAgICAgIDAgKHJlcykKKworICUtNGQgICAgICAgIDIyIEpVTVBfQUJTT0xVVEUgICAgICAgICAgIDE2CisgICAgICAgID4+ICAgMjUgUE9QX0JMT0NLCisgICAgICAgID4+ICAgMjYgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgMjkgUkVUVVJOX1ZBTFVFCisiIiIlKGJ1ZzcwODkwMS5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8gKyAxLAorICAgICBidWc3MDg5MDEuZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5vICsgMiwKKyAgICAgYnVnNzA4OTAxLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubyArIDMpCisKKworZGVmIGJ1ZzEzMzM5ODIoeD1bXSk6CisgICAgYXNzZXJ0IDAsIChbcyBmb3IgcyBpbiB4XSArCisgICAgICAgICAgICAgIDEpCisgICAgcGFzcworCitkaXNfYnVnMTMzMzk4MiA9ICIiIlwKKyAlLTRkICAgICAgICAgMCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMCkKKyAgICAgICAgICAgICAgMyBQT1BfSlVNUF9JRl9UUlVFICAgICAgICA0MQorICAgICAgICAgICAgICA2IExPQURfR0xPQkFMICAgICAgICAgICAgICAwIChBc3NlcnRpb25FcnJvcikKKyAgICAgICAgICAgICAgOSBCVUlMRF9MSVNUICAgICAgICAgICAgICAgMAorICAgICAgICAgICAgIDEyIExPQURfRkFTVCAgICAgICAgICAgICAgICAwICh4KQorICAgICAgICAgICAgIDE1IEdFVF9JVEVSCisgICAgICAgID4+ICAgMTYgRk9SX0lURVIgICAgICAgICAgICAgICAgMTIgKHRvIDMxKQorICAgICAgICAgICAgIDE5IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAxIChzKQorICAgICAgICAgICAgIDIyIExPQURfRkFTVCAgICAgICAgICAgICAgICAxIChzKQorICAgICAgICAgICAgIDI1IExJU1RfQVBQRU5EICAgICAgICAgICAgICAyCisgICAgICAgICAgICAgMjggSlVNUF9BQlNPTFVURSAgICAgICAgICAgMTYKKworICUtNGQgICA+PiAgIDMxIExPQURfQ09OU1QgICAgICAgICAgICAgICAyICgxKQorICAgICAgICAgICAgIDM0IEJJTkFSWV9BREQKKyAgICAgICAgICAgICAzNSBDQUxMX0ZVTkNUSU9OICAgICAgICAgICAgMQorICAgICAgICAgICAgIDM4IFJBSVNFX1ZBUkFSR1MgICAgICAgICAgICAxCisKKyAlLTRkICAgPj4gICA0MSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKKyAgICAgICAgICAgICA0NCBSRVRVUk5fVkFMVUUKKyIiIiUoYnVnMTMzMzk4Mi5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8gKyAxLAorICAgICBidWcxMzMzOTgyLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubyArIDIsCisgICAgIGJ1ZzEzMzM5ODIuZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5vICsgMykKKworX0JJR19MSU5FTk9fRk9STUFUID0gIiIiXAorJTNkICAgICAgICAgICAwIExPQURfR0xPQkFMICAgICAgICAgICAgICAwIChzcGFtKQorICAgICAgICAgICAgICAzIFBPUF9UT1AKKyAgICAgICAgICAgICAgNCBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMCAoTm9uZSkKKyAgICAgICAgICAgICAgNyBSRVRVUk5fVkFMVUUKKyIiIgorCitjbGFzcyBEaXNUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGRvX2Rpc2Fzc2VtYmx5X3Rlc3Qoc2VsZiwgZnVuYywgZXhwZWN0ZWQpOgorICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBzYXZlX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc3lzLnN0ZG91dCA9IHMKKyAgICAgICAgZGlzLmRpcyhmdW5jKQorICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKKyAgICAgICAgZ290ID0gcy5nZXR2YWx1ZSgpCisgICAgICAgICMgVHJpbSB0cmFpbGluZyBibGFua3MgKGlmIGFueSkuCisgICAgICAgIGxpbmVzID0gZ290LnNwbGl0KCdcbicpCisgICAgICAgIGxpbmVzID0gW2xpbmUucnN0cmlwKCkgZm9yIGxpbmUgaW4gbGluZXNdCisgICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWQuc3BsaXQoIlxuIikKKyAgICAgICAgaW1wb3J0IGRpZmZsaWIKKyAgICAgICAgaWYgZXhwZWN0ZWQgIT0gbGluZXM6CisgICAgICAgICAgICBzZWxmLmZhaWwoCisgICAgICAgICAgICAgICAgImV2ZW50cyBkaWQgbm90IG1hdGNoIGV4cGVjdGF0aW9uOlxuIiArCisgICAgICAgICAgICAgICAgIlxuIi5qb2luKGRpZmZsaWIubmRpZmYoZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMpKSkKKworICAgIGRlZiB0ZXN0X29wbWFwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcy5vcG1hcFsiU1RPUF9DT0RFIl0sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oZGlzLm9wbWFwWyJMT0FEX0NPTlNUIl0sIGRpcy5oYXNjb25zdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihkaXMub3BtYXBbIlNUT1JFX05BTUUiXSwgZGlzLmhhc25hbWUpCisKKyAgICBkZWYgdGVzdF9vcG5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzLm9wbmFtZVtkaXMub3BtYXBbIkxPQURfRkFTVCJdXSwgIkxPQURfRkFTVCIpCisKKyAgICBkZWYgdGVzdF9ib3VuZGFyaWVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcy5vcG1hcFsiRVhURU5ERURfQVJHIl0sIGRpcy5FWFRFTkRFRF9BUkcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzLm9wbWFwWyJTVE9SRV9OQU1FIl0sIGRpcy5IQVZFX0FSR1VNRU5UKQorCisgICAgZGVmIHRlc3RfZGlzKHNlbGYpOgorICAgICAgICBzZWxmLmRvX2Rpc2Fzc2VtYmx5X3Rlc3QoX2YsIGRpc19mKQorCisgICAgZGVmIHRlc3RfYnVnXzcwODkwMShzZWxmKToKKyAgICAgICAgc2VsZi5kb19kaXNhc3NlbWJseV90ZXN0KGJ1ZzcwODkwMSwgZGlzX2J1ZzcwODkwMSkKKworICAgIGRlZiB0ZXN0X2J1Z18xMzMzOTgyKHNlbGYpOgorICAgICAgICAjIFRoaXMgb25lIGlzIGNoZWNraW5nIGJ5dGVjb2RlcyBnZW5lcmF0ZWQgZm9yIGFuIGBhc3NlcnRgIHN0YXRlbWVudCwKKyAgICAgICAgIyBzbyBmYWlscyBpZiB0aGUgdGVzdHMgYXJlIHJ1biB3aXRoIC1PLiAgU2tpcCB0aGlzIHRlc3QgdGhlbi4KKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgc2VsZi5kb19kaXNhc3NlbWJseV90ZXN0KGJ1ZzEzMzM5ODIsIGRpc19idWcxMzMzOTgyKQorCisgICAgZGVmIHRlc3RfYmlnX2xpbmVub3Moc2VsZik6CisgICAgICAgIGRlZiBmdW5jKGNvdW50KToKKyAgICAgICAgICAgIG5hbWVzcGFjZSA9IHt9CisgICAgICAgICAgICBmdW5jID0gImRlZiBmb28oKTpcbiAiICsgIiIuam9pbihbIlxuICJdICogY291bnQgKyBbInNwYW1cbiJdKQorICAgICAgICAgICAgZXhlYyBmdW5jIGluIG5hbWVzcGFjZQorICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVsnZm9vJ10KKworICAgICAgICAjIFRlc3QgYWxsIHNtYWxsIHJhbmdlcworICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMSwgMzAwKToKKyAgICAgICAgICAgIGV4cGVjdGVkID0gX0JJR19MSU5FTk9fRk9STUFUICUgKGkgKyAyKQorICAgICAgICAgICAgc2VsZi5kb19kaXNhc3NlbWJseV90ZXN0KGZ1bmMoaSksIGV4cGVjdGVkKQorCisgICAgICAgICMgVGVzdCBzb21lIGxhcmdlciByYW5nZXMgdG9vCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgzMDAsIDUwMDAsIDEwKToKKyAgICAgICAgICAgIGV4cGVjdGVkID0gX0JJR19MSU5FTk9fRk9STUFUICUgKGkgKyAyKQorICAgICAgICAgICAgc2VsZi5kb19kaXNhc3NlbWJseV90ZXN0KGZ1bmMoaSksIGV4cGVjdGVkKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KERpc1Rlc3RzKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rpcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmM5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rpcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NjY2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rpc3R1dGlscy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rpc3R1dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWNiYmI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlzdHV0aWxzLnB5CkBAIC0wLDAgKzEsMTggQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuCisKK1RoZSB0ZXN0cyBmb3IgZGlzdHV0aWxzIGFyZSBkZWZpbmVkIGluIHRoZSBkaXN0dXRpbHMudGVzdHMgcGFja2FnZTsKK3RoZSB0ZXN0X3N1aXRlKCkgZnVuY3Rpb24gdGhlcmUgcmV0dXJucyBhIHRlc3Qgc3VpdGUgdGhhdCdzIHJlYWR5IHRvCitiZSBydW4uCisiIiIKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBkaXN0dXRpbHMudGVzdHMKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChkaXN0dXRpbHMudGVzdHMudGVzdF9zdWl0ZSgpKQorICAgIHRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXN0dXRpbHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlzdHV0aWxzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjQ5NjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlzdHV0aWxzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXN0dXRpbHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlzdHV0aWxzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjQ5NjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlzdHV0aWxzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYwNjlhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kbC5weQpAQCAtMCwwICsxLDM5IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJUZXN0IGRsbW9kdWxlLmMKKyAgIFJvZ2VyIEUuIE1hc3NlICByZXZpc2VkIHN0cmF0ZWd5IGJ5IEJhcnJ5IFdhcnNhdworIiIiCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIGltcG9ydF9tb2R1bGUKK2RsID0gaW1wb3J0X21vZHVsZSgnZGwnLCBkZXByZWNhdGVkPVRydWUpCisKK3NoYXJlZGxpYnMgPSBbCisgICAgKCcvdXNyL2xpYi9saWJjLnNvJywgJ2dldHBpZCcpLAorICAgICgnL2xpYi9saWJjLnNvLjYnLCAnZ2V0cGlkJyksCisgICAgKCcvdXNyL2Jpbi9jeWd3aW4xLmRsbCcsICdnZXRwaWQnKSwKKyAgICAoJy91c3IvbGliL2xpYmMuZHlsaWInLCAnZ2V0cGlkJyksCisgICAgXQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgZm9yIHMsIGZ1bmMgaW4gc2hhcmVkbGliczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAndHJ5aW5nIHRvIG9wZW46JywgcywKKyAgICAgICAgICAgIGwgPSBkbC5vcGVuKHMpCisgICAgICAgIGV4Y2VwdCBkbC5lcnJvciwgZXJyOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAnZmFpbGVkJywgcmVwcihzdHIoZXJyKSkKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3N1Y2NlZWRlZC4uLicsCisgICAgICAgICAgICBsLmNhbGwoZnVuYykKKyAgICAgICAgICAgIGwuY2xvc2UoKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAnd29ya2VkIScKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QsICdDb3VsZCBub3Qgb3BlbiBhbnkgc2hhcmVkIGxpYnJhcmllcycKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2YmE4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2YmE4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTA1N2M4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weQpAQCAtMCwwICsxLDI3MDEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisiIiIKK1Rlc3Qgc2NyaXB0IGZvciBkb2N0ZXN0LgorIiIiCisKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgZG9jdGVzdAorCisjIE5PVEU6IFRoZXJlIGFyZSBzb21lIGFkZGl0aW9uYWwgdGVzdHMgcmVsYXRpbmcgdG8gaW50ZXJhY3Rpb24gd2l0aAorIyAgICAgICB6aXBpbXBvcnQgaW4gdGhlIHRlc3RfemlwaW1wb3J0X3N1cHBvcnQgdGVzdCBtb2R1bGUuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIFNhbXBsZSBPYmplY3RzICh1c2VkIGJ5IHRlc3QgY2FzZXMpCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiBzYW1wbGVfZnVuYyh2KToKKyAgICAiIiIKKyAgICBCbGFoIGJsYWgKKworICAgID4+PiBwcmludCBzYW1wbGVfZnVuYygyMikKKyAgICA0NAorCisgICAgWWVlIGhhIQorICAgICIiIgorICAgIHJldHVybiB2K3YKKworY2xhc3MgU2FtcGxlQ2xhc3M6CisgICAgIiIiCisgICAgPj4+IHByaW50IDEKKyAgICAxCisKKyAgICA+Pj4gIyBjb21tZW50cyBnZXQgaWdub3JlZC4gIHNvIGFyZSBlbXB0eSBQUzEgYW5kIFBTMiBwcm9tcHRzOgorICAgID4+PgorICAgIC4uLgorCisgICAgTXVsdGlsaW5lIGV4YW1wbGU6CisgICAgPj4+IHNjID0gU2FtcGxlQ2xhc3MoMykKKyAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgIC4uLiAgICAgc2MgPSBzYy5kb3VibGUoKQorICAgIC4uLiAgICAgcHJpbnQgc2MuZ2V0KCksCisgICAgNiAxMiAyNCA0OCA5NiAxOTIgMzg0IDc2OCAxNTM2IDMwNzIKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsKToKKyAgICAgICAgIiIiCisgICAgICAgID4+PiBwcmludCBTYW1wbGVDbGFzcygxMikuZ2V0KCkKKyAgICAgICAgMTIKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgZG91YmxlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgPj4+IHByaW50IFNhbXBsZUNsYXNzKDEyKS5kb3VibGUoKS5nZXQoKQorICAgICAgICAyNAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFNhbXBsZUNsYXNzKHNlbGYudmFsICsgc2VsZi52YWwpCisKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgPj4+IHByaW50IFNhbXBsZUNsYXNzKC01KS5nZXQoKQorICAgICAgICAtNQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsCisKKyAgICBkZWYgYV9zdGF0aWNtZXRob2Qodik6CisgICAgICAgICIiIgorICAgICAgICA+Pj4gcHJpbnQgU2FtcGxlQ2xhc3MuYV9zdGF0aWNtZXRob2QoMTApCisgICAgICAgIDExCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gdisxCisgICAgYV9zdGF0aWNtZXRob2QgPSBzdGF0aWNtZXRob2QoYV9zdGF0aWNtZXRob2QpCisKKyAgICBkZWYgYV9jbGFzc21ldGhvZChjbHMsIHYpOgorICAgICAgICAiIiIKKyAgICAgICAgPj4+IHByaW50IFNhbXBsZUNsYXNzLmFfY2xhc3NtZXRob2QoMTApCisgICAgICAgIDEyCisgICAgICAgID4+PiBwcmludCBTYW1wbGVDbGFzcygwKS5hX2NsYXNzbWV0aG9kKDEwKQorICAgICAgICAxMgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHYrMgorICAgIGFfY2xhc3NtZXRob2QgPSBjbGFzc21ldGhvZChhX2NsYXNzbWV0aG9kKQorCisgICAgYV9wcm9wZXJ0eSA9IHByb3BlcnR5KGdldCwgZG9jPSIiIgorICAgICAgICA+Pj4gcHJpbnQgU2FtcGxlQ2xhc3MoMjIpLmFfcHJvcGVydHkKKyAgICAgICAgMjIKKyAgICAgICAgIiIiKQorCisgICAgY2xhc3MgTmVzdGVkQ2xhc3M6CisgICAgICAgICIiIgorICAgICAgICA+Pj4geCA9IFNhbXBsZUNsYXNzLk5lc3RlZENsYXNzKDUpCisgICAgICAgID4+PiB5ID0geC5zcXVhcmUoKQorICAgICAgICA+Pj4gcHJpbnQgeS5nZXQoKQorICAgICAgICAyNQorICAgICAgICAiIiIKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbD0wKToKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgPj4+IHByaW50IFNhbXBsZUNsYXNzLk5lc3RlZENsYXNzKCkuZ2V0KCkKKyAgICAgICAgICAgIDAKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgc2VsZi52YWwgPSB2YWwKKyAgICAgICAgZGVmIHNxdWFyZShzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcyhzZWxmLnZhbCpzZWxmLnZhbCkKKyAgICAgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbAorCitjbGFzcyBTYW1wbGVOZXdTdHlsZUNsYXNzKG9iamVjdCk6CisgICAgciIiIgorICAgID4+PiBwcmludCAnMVxuMlxuMycKKyAgICAxCisgICAgMgorICAgIDMKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsKToKKyAgICAgICAgIiIiCisgICAgICAgID4+PiBwcmludCBTYW1wbGVOZXdTdHlsZUNsYXNzKDEyKS5nZXQoKQorICAgICAgICAxMgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiBkb3VibGUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICA+Pj4gcHJpbnQgU2FtcGxlTmV3U3R5bGVDbGFzcygxMikuZG91YmxlKCkuZ2V0KCkKKyAgICAgICAgMjQKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBTYW1wbGVOZXdTdHlsZUNsYXNzKHNlbGYudmFsICsgc2VsZi52YWwpCisKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgPj4+IHByaW50IFNhbXBsZU5ld1N0eWxlQ2xhc3MoLTUpLmdldCgpCisgICAgICAgIC01CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi52YWwKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgRmFrZSBzdGRpbiAoZm9yIHRlc3RpbmcgaW50ZXJhY3RpdmUgZGVidWdnaW5nKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBfRmFrZUlucHV0OgorICAgICIiIgorICAgIEEgZmFrZSBpbnB1dCBzdHJlYW0gZm9yIHBkYidzIGludGVyYWN0aXZlIGRlYnVnZ2VyLiAgV2hlbmV2ZXIgYQorICAgIGxpbmUgaXMgcmVhZCwgcHJpbnQgaXQgKHRvIHNpbXVsYXRlIHRoZSB1c2VyIHR5cGluZyBpdCksIGFuZCB0aGVuCisgICAgcmV0dXJuIGl0LiAgVGhlIHNldCBvZiBsaW5lcyB0byByZXR1cm4gaXMgc3BlY2lmaWVkIGluIHRoZQorICAgIGNvbnN0cnVjdG9yOyB0aGV5IHNob3VsZCBub3QgaGF2ZSB0cmFpbGluZyBuZXdsaW5lcy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGluZXMpOgorICAgICAgICBzZWxmLmxpbmVzID0gbGluZXMKKworICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAgICAgbGluZSA9IHNlbGYubGluZXMucG9wKDApCisgICAgICAgIHByaW50IGxpbmUKKyAgICAgICAgcmV0dXJuIGxpbmUrJ1xuJworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBUZXN0IENhc2VzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiB0ZXN0X0V4YW1wbGUoKTogciIiIgorVW5pdCB0ZXN0cyBmb3IgdGhlIGBFeGFtcGxlYCBjbGFzcy4KKworRXhhbXBsZSBpcyBhIHNpbXBsZSBjb250YWluZXIgY2xhc3MgdGhhdCBob2xkczoKKyAgLSBgc291cmNlYDogQSBzb3VyY2Ugc3RyaW5nLgorICAtIGB3YW50YDogQW4gZXhwZWN0ZWQgb3V0cHV0IHN0cmluZy4KKyAgLSBgZXhjX21zZ2A6IEFuIGV4cGVjdGVkIGV4Y2VwdGlvbiBtZXNzYWdlIHN0cmluZyAob3IgTm9uZSBpZiBubworICAgIGV4Y2VwdGlvbiBpcyBleHBlY3RlZCkuCisgIC0gYGxpbmVub2A6IEEgbGluZSBudW1iZXIgKHdpdGhpbiB0aGUgZG9jc3RyaW5nKS4KKyAgLSBgaW5kZW50YDogVGhlIGV4YW1wbGUncyBpbmRlbnRhdGlvbiBpbiB0aGUgaW5wdXQgc3RyaW5nLgorICAtIGBvcHRpb25zYDogQW4gb3B0aW9uIGRpY3Rpb25hcnksIG1hcHBpbmcgb3B0aW9uIGZsYWdzIHRvIFRydWUgb3IKKyAgICBGYWxzZS4KKworVGhlc2UgYXR0cmlidXRlcyBhcmUgc2V0IGJ5IHRoZSBjb25zdHJ1Y3Rvci4gIGBzb3VyY2VgIGFuZCBgd2FudGAgYXJlCityZXF1aXJlZDsgdGhlIG90aGVyIGF0dHJpYnV0ZXMgYWxsIGhhdmUgZGVmYXVsdCB2YWx1ZXM6CisKKyAgICA+Pj4gZXhhbXBsZSA9IGRvY3Rlc3QuRXhhbXBsZSgncHJpbnQgMScsICcxXG4nKQorICAgID4+PiAoZXhhbXBsZS5zb3VyY2UsIGV4YW1wbGUud2FudCwgZXhhbXBsZS5leGNfbXNnLAorICAgIC4uLiAgZXhhbXBsZS5saW5lbm8sIGV4YW1wbGUuaW5kZW50LCBleGFtcGxlLm9wdGlvbnMpCisgICAgKCdwcmludCAxXG4nLCAnMVxuJywgTm9uZSwgMCwgMCwge30pCisKK1RoZSBmaXJzdCB0aHJlZSBhdHRyaWJ1dGVzIChgc291cmNlYCwgYHdhbnRgLCBhbmQgYGV4Y19tc2dgKSBtYXkgYmUKK3NwZWNpZmllZCBwb3NpdGlvbmFsbHk7IHRoZSByZW1haW5pbmcgYXJndW1lbnRzIHNob3VsZCBiZSBzcGVjaWZpZWQgYXMKK2tleXdvcmQgYXJndW1lbnRzOgorCisgICAgPj4+IGV4Y19tc2cgPSAnSW5kZXhFcnJvcjogcG9wIGZyb20gYW4gZW1wdHkgbGlzdCcKKyAgICA+Pj4gZXhhbXBsZSA9IGRvY3Rlc3QuRXhhbXBsZSgnW10ucG9wKCknLCAnJywgZXhjX21zZywKKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89NSwgaW5kZW50PTQsCisgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz17ZG9jdGVzdC5FTExJUFNJUzogVHJ1ZX0pCisgICAgPj4+IChleGFtcGxlLnNvdXJjZSwgZXhhbXBsZS53YW50LCBleGFtcGxlLmV4Y19tc2csCisgICAgLi4uICBleGFtcGxlLmxpbmVubywgZXhhbXBsZS5pbmRlbnQsIGV4YW1wbGUub3B0aW9ucykKKyAgICAoJ1tdLnBvcCgpXG4nLCAnJywgJ0luZGV4RXJyb3I6IHBvcCBmcm9tIGFuIGVtcHR5IGxpc3RcbicsIDUsIDQsIHs4OiBUcnVlfSkKKworVGhlIGNvbnN0cnVjdG9yIG5vcm1hbGl6ZXMgdGhlIGBzb3VyY2VgIHN0cmluZyB0byBlbmQgaW4gYSBuZXdsaW5lOgorCisgICAgU291cmNlIHNwYW5zIGEgc2luZ2xlIGxpbmU6IG5vIHRlcm1pbmF0aW5nIG5ld2xpbmUuCisgICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDEnLCAnMVxuJykKKyAgICA+Pj4gZS5zb3VyY2UsIGUud2FudAorICAgICgncHJpbnQgMVxuJywgJzFcbicpCisKKyAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgncHJpbnQgMVxuJywgJzFcbicpCisgICAgPj4+IGUuc291cmNlLCBlLndhbnQKKyAgICAoJ3ByaW50IDFcbicsICcxXG4nKQorCisgICAgU291cmNlIHNwYW5zIG11bHRpcGxlIGxpbmVzOiByZXF1aXJlIHRlcm1pbmF0aW5nIG5ld2xpbmUuCisgICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDE7XG5wcmludCAyXG4nLCAnMVxuMlxuJykKKyAgICA+Pj4gZS5zb3VyY2UsIGUud2FudAorICAgICgncHJpbnQgMTtcbnByaW50IDJcbicsICcxXG4yXG4nKQorCisgICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDE7XG5wcmludCAyJywgJzFcbjJcbicpCisgICAgPj4+IGUuc291cmNlLCBlLndhbnQKKyAgICAoJ3ByaW50IDE7XG5wcmludCAyXG4nLCAnMVxuMlxuJykKKworICAgIEVtcHR5IHNvdXJjZSBzdHJpbmcgKHdoaWNoIHNob3VsZCBuZXZlciBhcHBlYXIgaW4gcmVhbCBleGFtcGxlcykKKyAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgnJywgJycpCisgICAgPj4+IGUuc291cmNlLCBlLndhbnQKKyAgICAoJ1xuJywgJycpCisKK1RoZSBjb25zdHJ1Y3RvciBub3JtYWxpemVzIHRoZSBgd2FudGAgc3RyaW5nIHRvIGVuZCBpbiBhIG5ld2xpbmUsCit1bmxlc3MgaXQncyB0aGUgZW1wdHkgc3RyaW5nOgorCisgICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDEnLCAnMVxuJykKKyAgICA+Pj4gZS5zb3VyY2UsIGUud2FudAorICAgICgncHJpbnQgMVxuJywgJzFcbicpCisKKyAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgncHJpbnQgMScsICcxJykKKyAgICA+Pj4gZS5zb3VyY2UsIGUud2FudAorICAgICgncHJpbnQgMVxuJywgJzFcbicpCisKKyAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgncHJpbnQnLCAnJykKKyAgICA+Pj4gZS5zb3VyY2UsIGUud2FudAorICAgICgncHJpbnRcbicsICcnKQorCitUaGUgY29uc3RydWN0b3Igbm9ybWFsaXplcyB0aGUgYGV4Y19tc2dgIHN0cmluZyB0byBlbmQgaW4gYSBuZXdsaW5lLAordW5sZXNzIGl0J3MgYE5vbmVgOgorCisgICAgTWVzc2FnZSBzcGFucyBvbmUgbGluZQorICAgID4+PiBleGNfbXNnID0gJ0luZGV4RXJyb3I6IHBvcCBmcm9tIGFuIGVtcHR5IGxpc3QnCisgICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ1tdLnBvcCgpJywgJycsIGV4Y19tc2cpCisgICAgPj4+IGUuZXhjX21zZworICAgICdJbmRleEVycm9yOiBwb3AgZnJvbSBhbiBlbXB0eSBsaXN0XG4nCisKKyAgICA+Pj4gZXhjX21zZyA9ICdJbmRleEVycm9yOiBwb3AgZnJvbSBhbiBlbXB0eSBsaXN0XG4nCisgICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ1tdLnBvcCgpJywgJycsIGV4Y19tc2cpCisgICAgPj4+IGUuZXhjX21zZworICAgICdJbmRleEVycm9yOiBwb3AgZnJvbSBhbiBlbXB0eSBsaXN0XG4nCisKKyAgICBNZXNzYWdlIHNwYW5zIG11bHRpcGxlIGxpbmVzCisgICAgPj4+IGV4Y19tc2cgPSAnVmFsdWVFcnJvcjogMVxuICAyJworICAgID4+PiBlID0gZG9jdGVzdC5FeGFtcGxlKCdyYWlzZSBWYWx1ZUVycm9yKCIxXG4gIDIiKScsICcnLCBleGNfbXNnKQorICAgID4+PiBlLmV4Y19tc2cKKyAgICAnVmFsdWVFcnJvcjogMVxuICAyXG4nCisKKyAgICA+Pj4gZXhjX21zZyA9ICdWYWx1ZUVycm9yOiAxXG4gIDJcbicKKyAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgncmFpc2UgVmFsdWVFcnJvcigiMVxuICAyIiknLCAnJywgZXhjX21zZykKKyAgICA+Pj4gZS5leGNfbXNnCisgICAgJ1ZhbHVlRXJyb3I6IDFcbiAgMlxuJworCisgICAgRW1wdHkgKGJ1dCBub24tTm9uZSkgZXhjZXB0aW9uIG1lc3NhZ2UgKHdoaWNoIHNob3VsZCBuZXZlciBhcHBlYXIKKyAgICBpbiByZWFsIGV4YW1wbGVzKQorICAgID4+PiBleGNfbXNnID0gJycKKyAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgncmFpc2UgWCgpJywgJycsIGV4Y19tc2cpCisgICAgPj4+IGUuZXhjX21zZworICAgICdcbicKKworQ29tcGFyZSBgRXhhbXBsZWA6CisgICAgPj4+IGV4YW1wbGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDEnLCAnMVxuJykKKyAgICA+Pj4gc2FtZV9leGFtcGxlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCAxJywgJzFcbicpCisgICAgPj4+IG90aGVyX2V4YW1wbGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDQyJywgJzQyXG4nKQorICAgID4+PiBleGFtcGxlID09IHNhbWVfZXhhbXBsZQorICAgIFRydWUKKyAgICA+Pj4gZXhhbXBsZSAhPSBzYW1lX2V4YW1wbGUKKyAgICBGYWxzZQorICAgID4+PiBoYXNoKGV4YW1wbGUpID09IGhhc2goc2FtZV9leGFtcGxlKQorICAgIFRydWUKKyAgICA+Pj4gZXhhbXBsZSA9PSBvdGhlcl9leGFtcGxlCisgICAgRmFsc2UKKyAgICA+Pj4gZXhhbXBsZSAhPSBvdGhlcl9leGFtcGxlCisgICAgVHJ1ZQorIiIiCisKK2RlZiB0ZXN0X0RvY1Rlc3QoKTogciIiIgorVW5pdCB0ZXN0cyBmb3IgdGhlIGBEb2NUZXN0YCBjbGFzcy4KKworRG9jVGVzdCBpcyBhIGNvbGxlY3Rpb24gb2YgZXhhbXBsZXMsIGV4dHJhY3RlZCBmcm9tIGEgZG9jc3RyaW5nLCBhbG9uZword2l0aCBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0aGUgZG9jc3RyaW5nIGNvbWVzIGZyb20gKGEgbmFtZSwKK2ZpbGVuYW1lLCBhbmQgbGluZSBudW1iZXIpLiAgVGhlIGRvY3N0cmluZyBpcyBwYXJzZWQgYnkgdGhlIGBEb2NUZXN0YAorY29uc3RydWN0b3I6CisKKyAgICA+Pj4gZG9jc3RyaW5nID0gJycnCisgICAgLi4uICAgICA+Pj4gcHJpbnQgMTIKKyAgICAuLi4gICAgIDEyCisgICAgLi4uCisgICAgLi4uIE5vbi1leGFtcGxlIHRleHQuCisgICAgLi4uCisgICAgLi4uICAgICA+Pj4gcHJpbnQgJ2Fub3RoZXJcZXhhbXBsZScKKyAgICAuLi4gICAgIGFub3RoZXIKKyAgICAuLi4gICAgIGV4YW1wbGUKKyAgICAuLi4gJycnCisgICAgPj4+IGdsb2JzID0ge30gIyBnbG9iYWxzIHRvIHJ1biB0aGUgdGVzdCBpbi4KKyAgICA+Pj4gcGFyc2VyID0gZG9jdGVzdC5Eb2NUZXN0UGFyc2VyKCkKKyAgICA+Pj4gdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2NzdHJpbmcsIGdsb2JzLCAnc29tZV90ZXN0JywKKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAnc29tZV9maWxlJywgMjApCisgICAgPj4+IHByaW50IHRlc3QKKyAgICA8RG9jVGVzdCBzb21lX3Rlc3QgZnJvbSBzb21lX2ZpbGU6MjAgKDIgZXhhbXBsZXMpPgorICAgID4+PiBsZW4odGVzdC5leGFtcGxlcykKKyAgICAyCisgICAgPj4+IGUxLCBlMiA9IHRlc3QuZXhhbXBsZXMKKyAgICA+Pj4gKGUxLnNvdXJjZSwgZTEud2FudCwgZTEubGluZW5vKQorICAgICgncHJpbnQgMTJcbicsICcxMlxuJywgMSkKKyAgICA+Pj4gKGUyLnNvdXJjZSwgZTIud2FudCwgZTIubGluZW5vKQorICAgICgicHJpbnQgJ2Fub3RoZXJcXGV4YW1wbGUnXG4iLCAnYW5vdGhlclxuZXhhbXBsZVxuJywgNikKKworU291cmNlIGluZm9ybWF0aW9uIChuYW1lLCBmaWxlbmFtZSwgYW5kIGxpbmUgbnVtYmVyKSBpcyBhdmFpbGFibGUgYXMKK2F0dHJpYnV0ZXMgb24gdGhlIGRvY3Rlc3Qgb2JqZWN0OgorCisgICAgPj4+ICh0ZXN0Lm5hbWUsIHRlc3QuZmlsZW5hbWUsIHRlc3QubGluZW5vKQorICAgICgnc29tZV90ZXN0JywgJ3NvbWVfZmlsZScsIDIwKQorCitUaGUgbGluZSBudW1iZXIgb2YgYW4gZXhhbXBsZSB3aXRoaW4gaXRzIGNvbnRhaW5pbmcgZmlsZSBpcyBmb3VuZCBieQorYWRkaW5nIHRoZSBsaW5lIG51bWJlciBvZiB0aGUgZXhhbXBsZSBhbmQgdGhlIGxpbmUgbnVtYmVyIG9mIGl0cworY29udGFpbmluZyB0ZXN0OgorCisgICAgPj4+IHRlc3QubGluZW5vICsgZTEubGluZW5vCisgICAgMjEKKyAgICA+Pj4gdGVzdC5saW5lbm8gKyBlMi5saW5lbm8KKyAgICAyNgorCitJZiB0aGUgZG9jc3RyaW5nIGNvbnRhaW5zIGluY29uc2lzdGFudCBsZWFkaW5nIHdoaXRlc3BhY2UgaW4gdGhlCitleHBlY3RlZCBvdXRwdXQgb2YgYW4gZXhhbXBsZSwgdGhlbiBgRG9jVGVzdGAgd2lsbCByYWlzZSBhIFZhbHVlRXJyb3I6CisKKyAgICA+Pj4gZG9jc3RyaW5nID0gcicnJworICAgIC4uLiAgICAgICA+Pj4gcHJpbnQgJ2JhZFxuaW5kZW50YXRpb24nCisgICAgLi4uICAgICAgIGJhZAorICAgIC4uLiAgICAgaW5kZW50YXRpb24KKyAgICAuLi4gICAgICcnJworICAgID4+PiBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jc3RyaW5nLCBnbG9icywgJ3NvbWVfdGVzdCcsICdmaWxlbmFtZScsIDApCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFZhbHVlRXJyb3I6IGxpbmUgNCBvZiB0aGUgZG9jc3RyaW5nIGZvciBzb21lX3Rlc3QgaGFzIGluY29uc2lzdGVudCBsZWFkaW5nIHdoaXRlc3BhY2U6ICdpbmRlbnRhdGlvbicKKworSWYgdGhlIGRvY3N0cmluZyBjb250YWlucyBpbmNvbnNpc3RlbnQgbGVhZGluZyB3aGl0ZXNwYWNlIG9uCitjb250aW51YXRpb24gbGluZXMsIHRoZW4gYERvY1Rlc3RgIHdpbGwgcmFpc2UgYSBWYWx1ZUVycm9yOgorCisgICAgPj4+IGRvY3N0cmluZyA9IHInJycKKyAgICAuLi4gICAgICAgPj4+IHByaW50ICgnYmFkIGluZGVudGF0aW9uJywKKyAgICAuLi4gICAgIC4uLiAgICAgICAgICAyKQorICAgIC4uLiAgICAgICAoJ2JhZCcsICdpbmRlbnRhdGlvbicpCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gcGFyc2VyLmdldF9kb2N0ZXN0KGRvY3N0cmluZywgZ2xvYnMsICdzb21lX3Rlc3QnLCAnZmlsZW5hbWUnLCAwKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBWYWx1ZUVycm9yOiBsaW5lIDIgb2YgdGhlIGRvY3N0cmluZyBmb3Igc29tZV90ZXN0IGhhcyBpbmNvbnNpc3RlbnQgbGVhZGluZyB3aGl0ZXNwYWNlOiAnLi4uICAgICAgICAgIDIpJworCitJZiB0aGVyZSdzIG5vIGJsYW5rIHNwYWNlIGFmdGVyIGEgUFMxIHByb21wdCAoJz4+PicpLCB0aGVuIGBEb2NUZXN0YAord2lsbCByYWlzZSBhIFZhbHVlRXJyb3I6CisKKyAgICA+Pj4gZG9jc3RyaW5nID0gJz4+PnByaW50IDFcbjEnCisgICAgPj4+IHBhcnNlci5nZXRfZG9jdGVzdChkb2NzdHJpbmcsIGdsb2JzLCAnc29tZV90ZXN0JywgJ2ZpbGVuYW1lJywgMCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgVmFsdWVFcnJvcjogbGluZSAxIG9mIHRoZSBkb2NzdHJpbmcgZm9yIHNvbWVfdGVzdCBsYWNrcyBibGFuayBhZnRlciA+Pj46ICc+Pj5wcmludCAxJworCitJZiB0aGVyZSdzIG5vIGJsYW5rIHNwYWNlIGFmdGVyIGEgUFMyIHByb21wdCAoJy4uLicpLCB0aGVuIGBEb2NUZXN0YAord2lsbCByYWlzZSBhIFZhbHVlRXJyb3I6CisKKyAgICA+Pj4gZG9jc3RyaW5nID0gJz4+PiBpZiAxOlxuLi4ucHJpbnQgMVxuMScKKyAgICA+Pj4gcGFyc2VyLmdldF9kb2N0ZXN0KGRvY3N0cmluZywgZ2xvYnMsICdzb21lX3Rlc3QnLCAnZmlsZW5hbWUnLCAwKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBWYWx1ZUVycm9yOiBsaW5lIDIgb2YgdGhlIGRvY3N0cmluZyBmb3Igc29tZV90ZXN0IGxhY2tzIGJsYW5rIGFmdGVyIC4uLjogJy4uLnByaW50IDEnCisKK0NvbXBhcmUgYERvY1Rlc3RgOgorCisgICAgPj4+IGRvY3N0cmluZyA9ICcnJworICAgIC4uLiAgICAgPj4+IHByaW50IDEyCisgICAgLi4uICAgICAxMgorICAgIC4uLiAnJycKKyAgICA+Pj4gdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2NzdHJpbmcsIGdsb2JzLCAnc29tZV90ZXN0JywKKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAnc29tZV90ZXN0JywgMjApCisgICAgPj4+IHNhbWVfdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2NzdHJpbmcsIGdsb2JzLCAnc29tZV90ZXN0JywKKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb21lX3Rlc3QnLCAyMCkKKyAgICA+Pj4gdGVzdCA9PSBzYW1lX3Rlc3QKKyAgICBUcnVlCisgICAgPj4+IHRlc3QgIT0gc2FtZV90ZXN0CisgICAgRmFsc2UKKyAgICA+Pj4gaGFzaCh0ZXN0KSA9PSBoYXNoKHNhbWVfdGVzdCkKKyAgICBUcnVlCisgICAgPj4+IGRvY3N0cmluZyA9ICcnJworICAgIC4uLiAgICAgPj4+IHByaW50IDQyCisgICAgLi4uICAgICA0MgorICAgIC4uLiAnJycKKyAgICA+Pj4gb3RoZXJfdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2NzdHJpbmcsIGdsb2JzLCAnb3RoZXJfdGVzdCcsCisgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ290aGVyX2ZpbGUnLCAxMCkKKyAgICA+Pj4gdGVzdCA9PSBvdGhlcl90ZXN0CisgICAgRmFsc2UKKyAgICA+Pj4gdGVzdCAhPSBvdGhlcl90ZXN0CisgICAgVHJ1ZQorCitDb21wYXJlIGBEb2NUZXN0Q2FzZWA6CisKKyAgICA+Pj4gRG9jVGVzdENhc2UgPSBkb2N0ZXN0LkRvY1Rlc3RDYXNlCisgICAgPj4+IHRlc3RfY2FzZSA9IERvY1Rlc3RDYXNlKHRlc3QpCisgICAgPj4+IHNhbWVfdGVzdF9jYXNlID0gRG9jVGVzdENhc2Uoc2FtZV90ZXN0KQorICAgID4+PiBvdGhlcl90ZXN0X2Nhc2UgPSBEb2NUZXN0Q2FzZShvdGhlcl90ZXN0KQorICAgID4+PiB0ZXN0X2Nhc2UgPT0gc2FtZV90ZXN0X2Nhc2UKKyAgICBUcnVlCisgICAgPj4+IHRlc3RfY2FzZSAhPSBzYW1lX3Rlc3RfY2FzZQorICAgIEZhbHNlCisgICAgPj4+IGhhc2godGVzdF9jYXNlKSA9PSBoYXNoKHNhbWVfdGVzdF9jYXNlKQorICAgIFRydWUKKyAgICA+Pj4gdGVzdCA9PSBvdGhlcl90ZXN0X2Nhc2UKKyAgICBGYWxzZQorICAgID4+PiB0ZXN0ICE9IG90aGVyX3Rlc3RfY2FzZQorICAgIFRydWUKKworIiIiCisKK2RlZiB0ZXN0X0RvY1Rlc3RGaW5kZXIoKTogciIiIgorVW5pdCB0ZXN0cyBmb3IgdGhlIGBEb2NUZXN0RmluZGVyYCBjbGFzcy4KKworRG9jVGVzdEZpbmRlciBpcyB1c2VkIHRvIGV4dHJhY3QgRG9jVGVzdHMgZnJvbSBhbiBvYmplY3QncyBkb2NzdHJpbmcKK2FuZCB0aGUgZG9jc3RyaW5ncyBvZiBpdHMgY29udGFpbmVkIG9iamVjdHMuICBJdCBjYW4gYmUgdXNlZCB3aXRoCittb2R1bGVzLCBmdW5jdGlvbnMsIGNsYXNzZXMsIG1ldGhvZHMsIHN0YXRpY21ldGhvZHMsIGNsYXNzbWV0aG9kcywgYW5kCitwcm9wZXJ0aWVzLgorCitGaW5kaW5nIFRlc3RzIGluIEZ1bmN0aW9ucworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK0ZvciBhIGZ1bmN0aW9uIHdob3NlIGRvY3N0cmluZyBjb250YWlucyBleGFtcGxlcywgRG9jVGVzdEZpbmRlci5maW5kKCkKK3dpbGwgcmV0dXJuIGEgc2luZ2xlIHRlc3QgKGZvciB0aGF0IGZ1bmN0aW9uJ3MgZG9jc3RyaW5nKToKKworICAgID4+PiBmaW5kZXIgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKQorCitXZSdsbCBzaW11bGF0ZSBhIF9fZmlsZV9fIGF0dHIgdGhhdCBlbmRzIGluIHB5YzoKKworICAgID4+PiBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKKyAgICA+Pj4gb2xkID0gdGVzdC50ZXN0X2RvY3Rlc3QuX19maWxlX18KKyAgICA+Pj4gdGVzdC50ZXN0X2RvY3Rlc3QuX19maWxlX18gPSAndGVzdF9kb2N0ZXN0LnB5YycKKworICAgID4+PiB0ZXN0cyA9IGZpbmRlci5maW5kKHNhbXBsZV9mdW5jKQorCisgICAgPj4+IHByaW50IHRlc3RzICAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgIFs8RG9jVGVzdCBzYW1wbGVfZnVuYyBmcm9tIC4uLjoxNyAoMSBleGFtcGxlKT5dCisKK1RoZSBleGFjdCBuYW1lIGRlcGVuZHMgb24gaG93IHRlc3RfZG9jdGVzdCB3YXMgaW52b2tlZCwgc28gYWxsb3cgZm9yCitsZWFkaW5nIHBhdGggY29tcG9uZW50cy4KKworICAgID4+PiB0ZXN0c1swXS5maWxlbmFtZSAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICcuLi50ZXN0X2RvY3Rlc3QucHknCisKKyAgICA+Pj4gdGVzdC50ZXN0X2RvY3Rlc3QuX19maWxlX18gPSBvbGQKKworCisgICAgPj4+IGUgPSB0ZXN0c1swXS5leGFtcGxlc1swXQorICAgID4+PiAoZS5zb3VyY2UsIGUud2FudCwgZS5saW5lbm8pCisgICAgKCdwcmludCBzYW1wbGVfZnVuYygyMilcbicsICc0NFxuJywgMykKKworQnkgZGVmYXVsdCwgdGVzdHMgYXJlIGNyZWF0ZWQgZm9yIG9iamVjdHMgd2l0aCBubyBkb2NzdHJpbmc6CisKKyAgICA+Pj4gZGVmIG5vX2RvY3N0cmluZyh2KToKKyAgICAuLi4gICAgIHBhc3MKKyAgICA+Pj4gZmluZGVyLmZpbmQobm9fZG9jc3RyaW5nKQorICAgIFtdCisKK0hvd2V2ZXIsIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgZXhjbHVkZV9lbXB0eWAgdG8gdGhlIERvY1Rlc3RGaW5kZXIKK2NvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIHRvIGV4Y2x1ZGUgdGVzdHMgZm9yIG9iamVjdHMgd2l0aCBlbXB0eQorZG9jc3RyaW5nczoKKworICAgID4+PiBkZWYgbm9fZG9jc3RyaW5nKHYpOgorICAgIC4uLiAgICAgcGFzcworICAgID4+PiBleGNsX2VtcHR5X2ZpbmRlciA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcihleGNsdWRlX2VtcHR5PVRydWUpCisgICAgPj4+IGV4Y2xfZW1wdHlfZmluZGVyLmZpbmQobm9fZG9jc3RyaW5nKQorICAgIFtdCisKK0lmIHRoZSBmdW5jdGlvbiBoYXMgYSBkb2NzdHJpbmcgd2l0aCBubyBleGFtcGxlcywgdGhlbiBhIHRlc3Qgd2l0aCBubworZXhhbXBsZXMgaXMgcmV0dXJuZWQuICAoVGhpcyBsZXRzIGBEb2NUZXN0UnVubmVyYCBjb2xsZWN0IHN0YXRpc3RpY3MKK2Fib3V0IHdoaWNoIGZ1bmN0aW9ucyBoYXZlIG5vIHRlc3RzIC0tIGJ1dCBpcyB0aGF0IHVzZWZ1bD8gIEFuZCBzaG91bGQKK2FuIGVtcHR5IHRlc3QgYWxzbyBiZSBjcmVhdGVkIHdoZW4gdGhlcmUncyBubyBkb2NzdHJpbmc/KQorCisgICAgPj4+IGRlZiBub19leGFtcGxlcyh2KToKKyAgICAuLi4gICAgICcnJyBubyBkb2N0ZXN0IGV4YW1wbGVzICcnJworICAgID4+PiBmaW5kZXIuZmluZChub19leGFtcGxlcykgIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICBbPERvY1Rlc3Qgbm9fZXhhbXBsZXMgZnJvbSAuLi46MSAobm8gZXhhbXBsZXMpPl0KKworRmluZGluZyBUZXN0cyBpbiBDbGFzc2VzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK0ZvciBhIGNsYXNzLCBEb2NUZXN0RmluZGVyIHdpbGwgY3JlYXRlIGEgdGVzdCBmb3IgdGhlIGNsYXNzJ3MKK2RvY3N0cmluZywgYW5kIHdpbGwgcmVjdXJzaXZlbHkgZXhwbG9yZSBpdHMgY29udGVudHMsIGluY2x1ZGluZworbWV0aG9kcywgY2xhc3NtZXRob2RzLCBzdGF0aWNtZXRob2RzLCBwcm9wZXJ0aWVzLCBhbmQgbmVzdGVkIGNsYXNzZXMuCisKKyAgICA+Pj4gZmluZGVyID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkKKyAgICA+Pj4gdGVzdHMgPSBmaW5kZXIuZmluZChTYW1wbGVDbGFzcykKKyAgICA+Pj4gZm9yIHQgaW4gdGVzdHM6CisgICAgLi4uICAgICBwcmludCAnJTJzICAlcycgJSAobGVuKHQuZXhhbXBsZXMpLCB0Lm5hbWUpCisgICAgIDMgIFNhbXBsZUNsYXNzCisgICAgIDMgIFNhbXBsZUNsYXNzLk5lc3RlZENsYXNzCisgICAgIDEgIFNhbXBsZUNsYXNzLk5lc3RlZENsYXNzLl9faW5pdF9fCisgICAgIDEgIFNhbXBsZUNsYXNzLl9faW5pdF9fCisgICAgIDIgIFNhbXBsZUNsYXNzLmFfY2xhc3NtZXRob2QKKyAgICAgMSAgU2FtcGxlQ2xhc3MuYV9wcm9wZXJ0eQorICAgICAxICBTYW1wbGVDbGFzcy5hX3N0YXRpY21ldGhvZAorICAgICAxICBTYW1wbGVDbGFzcy5kb3VibGUKKyAgICAgMSAgU2FtcGxlQ2xhc3MuZ2V0CisKK05ldy1zdHlsZSBjbGFzc2VzIGFyZSBhbHNvIHN1cHBvcnRlZDoKKworICAgID4+PiB0ZXN0cyA9IGZpbmRlci5maW5kKFNhbXBsZU5ld1N0eWxlQ2xhc3MpCisgICAgPj4+IGZvciB0IGluIHRlc3RzOgorICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQorICAgICAxICBTYW1wbGVOZXdTdHlsZUNsYXNzCisgICAgIDEgIFNhbXBsZU5ld1N0eWxlQ2xhc3MuX19pbml0X18KKyAgICAgMSAgU2FtcGxlTmV3U3R5bGVDbGFzcy5kb3VibGUKKyAgICAgMSAgU2FtcGxlTmV3U3R5bGVDbGFzcy5nZXQKKworRmluZGluZyBUZXN0cyBpbiBNb2R1bGVzCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK0ZvciBhIG1vZHVsZSwgRG9jVGVzdEZpbmRlciB3aWxsIGNyZWF0ZSBhIHRlc3QgZm9yIHRoZSBjbGFzcydzCitkb2NzdHJpbmcsIGFuZCB3aWxsIHJlY3Vyc2l2ZWx5IGV4cGxvcmUgaXRzIGNvbnRlbnRzLCBpbmNsdWRpbmcKK2Z1bmN0aW9ucywgY2xhc3NlcywgYW5kIHRoZSBgX190ZXN0X19gIGRpY3Rpb25hcnksIGlmIGl0IGV4aXN0czoKKworICAgID4+PiAjIEEgbW9kdWxlCisgICAgPj4+IGltcG9ydCB0eXBlcworICAgID4+PiBtID0gdHlwZXMuTW9kdWxlVHlwZSgnc29tZV9tb2R1bGUnKQorICAgID4+PiBkZWYgdHJpcGxlKHZhbCk6CisgICAgLi4uICAgICAnJycKKyAgICAuLi4gICAgID4+PiBwcmludCB0cmlwbGUoMTEpCisgICAgLi4uICAgICAzMworICAgIC4uLiAgICAgJycnCisgICAgLi4uICAgICByZXR1cm4gdmFsKjMKKyAgICA+Pj4gbS5fX2RpY3RfXy51cGRhdGUoeworICAgIC4uLiAgICAgJ3NhbXBsZV9mdW5jJzogc2FtcGxlX2Z1bmMsCisgICAgLi4uICAgICAnU2FtcGxlQ2xhc3MnOiBTYW1wbGVDbGFzcywKKyAgICAuLi4gICAgICdfX2RvY19fJzogJycnCisgICAgLi4uICAgICAgICAgTW9kdWxlIGRvY3N0cmluZy4KKyAgICAuLi4gICAgICAgICAgICAgPj4+IHByaW50ICdtb2R1bGUnCisgICAgLi4uICAgICAgICAgICAgIG1vZHVsZQorICAgIC4uLiAgICAgICAgICcnJywKKyAgICAuLi4gICAgICdfX3Rlc3RfXyc6IHsKKyAgICAuLi4gICAgICAgICAnZCc6ICc+Pj4gcHJpbnQgNlxuNlxuPj4+IHByaW50IDdcbjdcbicsCisgICAgLi4uICAgICAgICAgJ2MnOiB0cmlwbGV9fSkKKworICAgID4+PiBmaW5kZXIgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKQorICAgID4+PiAjIFVzZSBtb2R1bGU9dGVzdC50ZXN0X2RvY3Rlc3QsIHRvIHByZXZlbnQgZG9jdGVzdCBmcm9tCisgICAgPj4+ICMgaWdub3JpbmcgdGhlIG9iamVjdHMgc2luY2UgdGhleSB3ZXJlbid0IGRlZmluZWQgaW4gbS4KKyAgICA+Pj4gaW1wb3J0IHRlc3QudGVzdF9kb2N0ZXN0CisgICAgPj4+IHRlc3RzID0gZmluZGVyLmZpbmQobSwgbW9kdWxlPXRlc3QudGVzdF9kb2N0ZXN0KQorICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKKyAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKKyAgICAgMSAgc29tZV9tb2R1bGUKKyAgICAgMyAgc29tZV9tb2R1bGUuU2FtcGxlQ2xhc3MKKyAgICAgMyAgc29tZV9tb2R1bGUuU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3MKKyAgICAgMSAgc29tZV9tb2R1bGUuU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3MuX19pbml0X18KKyAgICAgMSAgc29tZV9tb2R1bGUuU2FtcGxlQ2xhc3MuX19pbml0X18KKyAgICAgMiAgc29tZV9tb2R1bGUuU2FtcGxlQ2xhc3MuYV9jbGFzc21ldGhvZAorICAgICAxICBzb21lX21vZHVsZS5TYW1wbGVDbGFzcy5hX3Byb3BlcnR5CisgICAgIDEgIHNvbWVfbW9kdWxlLlNhbXBsZUNsYXNzLmFfc3RhdGljbWV0aG9kCisgICAgIDEgIHNvbWVfbW9kdWxlLlNhbXBsZUNsYXNzLmRvdWJsZQorICAgICAxICBzb21lX21vZHVsZS5TYW1wbGVDbGFzcy5nZXQKKyAgICAgMSAgc29tZV9tb2R1bGUuX190ZXN0X18uYworICAgICAyICBzb21lX21vZHVsZS5fX3Rlc3RfXy5kCisgICAgIDEgIHNvbWVfbW9kdWxlLnNhbXBsZV9mdW5jCisKK0R1cGxpY2F0ZSBSZW1vdmFsCit+fn5+fn5+fn5+fn5+fn5+fgorSWYgYSBzaW5nbGUgb2JqZWN0IGlzIGxpc3RlZCB0d2ljZSAodW5kZXIgZGlmZmVyZW50IG5hbWVzKSwgdGhlbiB0ZXN0cword2lsbCBvbmx5IGJlIGdlbmVyYXRlZCBmb3IgaXQgb25jZToKKworICAgID4+PiBmcm9tIHRlc3QgaW1wb3J0IGRvY3Rlc3RfYWxpYXNlcworICAgID4+PiBhc3NlcnQgZG9jdGVzdF9hbGlhc2VzLlR3b05hbWVzLmYKKyAgICA+Pj4gYXNzZXJ0IGRvY3Rlc3RfYWxpYXNlcy5Ud29OYW1lcy5nCisgICAgPj4+IHRlc3RzID0gZXhjbF9lbXB0eV9maW5kZXIuZmluZChkb2N0ZXN0X2FsaWFzZXMpCisgICAgPj4+IHByaW50IGxlbih0ZXN0cykKKyAgICAyCisgICAgPj4+IHByaW50IHRlc3RzWzBdLm5hbWUKKyAgICB0ZXN0LmRvY3Rlc3RfYWxpYXNlcy5Ud29OYW1lcworCisgICAgVHdvTmFtZXMuZiBhbmQgVHdvTmFtZXMuZyBhcmUgYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0LgorICAgIFdlIGNhbid0IGd1ZXNzIHdoaWNoIHdpbGwgYmUgZm91bmQgaW4gZG9jdGVzdCdzIHRyYXZlcnNhbCBvZgorICAgIFR3b05hbWVzLl9fZGljdF9fIGZpcnN0LCBzbyB3ZSBoYXZlIHRvIGFsbG93IGZvciBlaXRoZXIuCisKKyAgICA+Pj4gdGVzdHNbMV0ubmFtZS5zcGxpdCgnLicpWy0xXSBpbiBbJ2YnLCAnZyddCisgICAgVHJ1ZQorCitFbXB0eSBUZXN0cworfn5+fn5+fn5+fn4KK0J5IGRlZmF1bHQsIGFuIG9iamVjdCB3aXRoIG5vIGRvY3Rlc3RzIGRvZXNuJ3QgY3JlYXRlIGFueSB0ZXN0czoKKworICAgID4+PiB0ZXN0cyA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoU2FtcGxlQ2xhc3MpCisgICAgPj4+IGZvciB0IGluIHRlc3RzOgorICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQorICAgICAzICBTYW1wbGVDbGFzcworICAgICAzICBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcworICAgICAxICBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcy5fX2luaXRfXworICAgICAxICBTYW1wbGVDbGFzcy5fX2luaXRfXworICAgICAyICBTYW1wbGVDbGFzcy5hX2NsYXNzbWV0aG9kCisgICAgIDEgIFNhbXBsZUNsYXNzLmFfcHJvcGVydHkKKyAgICAgMSAgU2FtcGxlQ2xhc3MuYV9zdGF0aWNtZXRob2QKKyAgICAgMSAgU2FtcGxlQ2xhc3MuZG91YmxlCisgICAgIDEgIFNhbXBsZUNsYXNzLmdldAorCitCeSBkZWZhdWx0LCB0aGF0IGV4Y2x1ZGVkIG9iamVjdHMgd2l0aCBubyBkb2N0ZXN0cy4gIGV4Y2x1ZGVfZW1wdHk9RmFsc2UKK3RlbGxzIGl0IHRvIGluY2x1ZGUgKGVtcHR5KSB0ZXN0cyBmb3Igb2JqZWN0cyB3aXRoIG5vIGRvY3Rlc3RzLiAgVGhpcyBmZWF0dXJlCitpcyByZWFsbHkgdG8gc3VwcG9ydCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGluIHdoYXQgZG9jdGVzdC5tYXN0ZXIuc3VtbWFyaXplKCkKK2Rpc3BsYXlzLgorCisgICAgPj4+IHRlc3RzID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKGV4Y2x1ZGVfZW1wdHk9RmFsc2UpLmZpbmQoU2FtcGxlQ2xhc3MpCisgICAgPj4+IGZvciB0IGluIHRlc3RzOgorICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQorICAgICAzICBTYW1wbGVDbGFzcworICAgICAzICBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcworICAgICAxICBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcy5fX2luaXRfXworICAgICAwICBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcy5nZXQKKyAgICAgMCAgU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3Muc3F1YXJlCisgICAgIDEgIFNhbXBsZUNsYXNzLl9faW5pdF9fCisgICAgIDIgIFNhbXBsZUNsYXNzLmFfY2xhc3NtZXRob2QKKyAgICAgMSAgU2FtcGxlQ2xhc3MuYV9wcm9wZXJ0eQorICAgICAxICBTYW1wbGVDbGFzcy5hX3N0YXRpY21ldGhvZAorICAgICAxICBTYW1wbGVDbGFzcy5kb3VibGUKKyAgICAgMSAgU2FtcGxlQ2xhc3MuZ2V0CisKK1R1cm5pbmcgb2ZmIFJlY3Vyc2lvbgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+CitEb2NUZXN0RmluZGVyIGNhbiBiZSB0b2xkIG5vdCB0byBsb29rIGZvciB0ZXN0cyBpbiBjb250YWluZWQgb2JqZWN0cwordXNpbmcgdGhlIGByZWN1cnNlYCBmbGFnOgorCisgICAgPj4+IHRlc3RzID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKHJlY3Vyc2U9RmFsc2UpLmZpbmQoU2FtcGxlQ2xhc3MpCisgICAgPj4+IGZvciB0IGluIHRlc3RzOgorICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQorICAgICAzICBTYW1wbGVDbGFzcworCitMaW5lIG51bWJlcnMKK35+fn5+fn5+fn5+fgorRG9jVGVzdEZpbmRlciBmaW5kcyB0aGUgbGluZSBudW1iZXIgb2YgZWFjaCBleGFtcGxlOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgJycnCisgICAgLi4uICAgICA+Pj4geCA9IDEyCisgICAgLi4uCisgICAgLi4uICAgICBzb21lIHRleHQKKyAgICAuLi4KKyAgICAuLi4gICAgID4+PiAjIGV4YW1wbGVzIGFyZSBub3QgY3JlYXRlZCBmb3IgY29tbWVudHMgJiBiYXJlIHByb21wdHMuCisgICAgLi4uICAgICA+Pj4KKyAgICAuLi4gICAgIC4uLgorICAgIC4uLgorICAgIC4uLiAgICAgPj4+IGZvciB4IGluIHJhbmdlKDEwKToKKyAgICAuLi4gICAgIC4uLiAgICAgcHJpbnQgeCwKKyAgICAuLi4gICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkKKyAgICAuLi4gICAgID4+PiB4Ly8yCisgICAgLi4uICAgICA2CisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gW2UubGluZW5vIGZvciBlIGluIHRlc3QuZXhhbXBsZXNdCisgICAgWzEsIDksIDEyXQorIiIiCisKK2RlZiB0ZXN0X0RvY1Rlc3RQYXJzZXIoKTogciIiIgorVW5pdCB0ZXN0cyBmb3IgdGhlIGBEb2NUZXN0UGFyc2VyYCBjbGFzcy4KKworRG9jVGVzdFBhcnNlciBpcyB1c2VkIHRvIHBhcnNlIGRvY3N0cmluZ3MgY29udGFpbmluZyBkb2N0ZXN0IGV4YW1wbGVzLgorCitUaGUgYHBhcnNlYCBtZXRob2QgZGl2aWRlcyBhIGRvY3N0cmluZyBpbnRvIGV4YW1wbGVzIGFuZCBpbnRlcnZlbmluZwordGV4dDoKKworICAgID4+PiBzID0gJycnCisgICAgLi4uICAgICA+Pj4geCwgeSA9IDIsIDMgICMgbm8gb3V0cHV0IGV4cGVjdGVkCisgICAgLi4uICAgICA+Pj4gaWYgMToKKyAgICAuLi4gICAgIC4uLiAgICAgcHJpbnQgeAorICAgIC4uLiAgICAgLi4uICAgICBwcmludCB5CisgICAgLi4uICAgICAyCisgICAgLi4uICAgICAzCisgICAgLi4uCisgICAgLi4uICAgICBTb21lIHRleHQuCisgICAgLi4uICAgICA+Pj4geCt5CisgICAgLi4uICAgICA1CisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gcGFyc2VyID0gZG9jdGVzdC5Eb2NUZXN0UGFyc2VyKCkKKyAgICA+Pj4gZm9yIHBpZWNlIGluIHBhcnNlci5wYXJzZShzKToKKyAgICAuLi4gICAgIGlmIGlzaW5zdGFuY2UocGllY2UsIGRvY3Rlc3QuRXhhbXBsZSk6CisgICAgLi4uICAgICAgICAgcHJpbnQgJ0V4YW1wbGU6JywgKHBpZWNlLnNvdXJjZSwgcGllY2Uud2FudCwgcGllY2UubGluZW5vKQorICAgIC4uLiAgICAgZWxzZToKKyAgICAuLi4gICAgICAgICBwcmludCAnICAgVGV4dDonLCBgcGllY2VgCisgICAgICAgVGV4dDogJ1xuJworICAgIEV4YW1wbGU6ICgneCwgeSA9IDIsIDMgICMgbm8gb3V0cHV0IGV4cGVjdGVkXG4nLCAnJywgMSkKKyAgICAgICBUZXh0OiAnJworICAgIEV4YW1wbGU6ICgnaWYgMTpcbiAgICBwcmludCB4XG4gICAgcHJpbnQgeVxuJywgJzJcbjNcbicsIDIpCisgICAgICAgVGV4dDogJ1xuU29tZSB0ZXh0LlxuJworICAgIEV4YW1wbGU6ICgneCt5XG4nLCAnNVxuJywgOSkKKyAgICAgICBUZXh0OiAnJworCitUaGUgYGdldF9leGFtcGxlc2AgbWV0aG9kIHJldHVybnMganVzdCB0aGUgZXhhbXBsZXM6CisKKyAgICA+Pj4gZm9yIHBpZWNlIGluIHBhcnNlci5nZXRfZXhhbXBsZXMocyk6CisgICAgLi4uICAgICBwcmludCAocGllY2Uuc291cmNlLCBwaWVjZS53YW50LCBwaWVjZS5saW5lbm8pCisgICAgKCd4LCB5ID0gMiwgMyAgIyBubyBvdXRwdXQgZXhwZWN0ZWRcbicsICcnLCAxKQorICAgICgnaWYgMTpcbiAgICBwcmludCB4XG4gICAgcHJpbnQgeVxuJywgJzJcbjNcbicsIDIpCisgICAgKCd4K3lcbicsICc1XG4nLCA5KQorCitUaGUgYGdldF9kb2N0ZXN0YCBtZXRob2QgY3JlYXRlcyBhIFRlc3QgZnJvbSB0aGUgZXhhbXBsZXMsIGFsb25nIHdpdGggdGhlCitnaXZlbiBhcmd1bWVudHM6CisKKyAgICA+Pj4gdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChzLCB7fSwgJ25hbWUnLCAnZmlsZW5hbWUnLCBsaW5lbm89NSkKKyAgICA+Pj4gKHRlc3QubmFtZSwgdGVzdC5maWxlbmFtZSwgdGVzdC5saW5lbm8pCisgICAgKCduYW1lJywgJ2ZpbGVuYW1lJywgNSkKKyAgICA+Pj4gZm9yIHBpZWNlIGluIHRlc3QuZXhhbXBsZXM6CisgICAgLi4uICAgICBwcmludCAocGllY2Uuc291cmNlLCBwaWVjZS53YW50LCBwaWVjZS5saW5lbm8pCisgICAgKCd4LCB5ID0gMiwgMyAgIyBubyBvdXRwdXQgZXhwZWN0ZWRcbicsICcnLCAxKQorICAgICgnaWYgMTpcbiAgICBwcmludCB4XG4gICAgcHJpbnQgeVxuJywgJzJcbjNcbicsIDIpCisgICAgKCd4K3lcbicsICc1XG4nLCA5KQorIiIiCisKK2NsYXNzIHRlc3RfRG9jVGVzdFJ1bm5lcjoKKyAgICBkZWYgYmFzaWNzKCk6IHIiIiIKK1VuaXQgdGVzdHMgZm9yIHRoZSBgRG9jVGVzdFJ1bm5lcmAgY2xhc3MuCisKK0RvY1Rlc3RSdW5uZXIgaXMgdXNlZCB0byBydW4gRG9jVGVzdCB0ZXN0IGNhc2VzLCBhbmQgdG8gYWNjdW11bGF0ZQorc3RhdGlzdGljcy4gIEhlcmUncyBhIHNpbXBsZSBEb2NUZXN0IGNhc2Ugd2UgY2FuIHVzZToKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgICcnJworICAgIC4uLiAgICAgPj4+IHggPSAxMgorICAgIC4uLiAgICAgPj4+IHByaW50IHgKKyAgICAuLi4gICAgIDEyCisgICAgLi4uICAgICA+Pj4geC8vMgorICAgIC4uLiAgICAgNgorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisKK1RoZSBtYWluIERvY1Rlc3RSdW5uZXIgaW50ZXJmYWNlIGlzIHRoZSBgcnVuYCBtZXRob2QsIHdoaWNoIHJ1bnMgYQorZ2l2ZW4gRG9jVGVzdCBjYXNlIGluIGEgZ2l2ZW4gbmFtZXNwYWNlIChnbG9icykuICBJdCByZXR1cm5zIGEgdHVwbGUKK2AoZix0KWAsIHdoZXJlIGBmYCBpcyB0aGUgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cyBhbmQgYHRgIGlzIHRoZSBudW1iZXIKK29mIHRyaWVkIHRlc3RzLgorCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTMpCisKK0lmIGFueSBleGFtcGxlIHByb2R1Y2VzIGluY29ycmVjdCBvdXRwdXQsIHRoZW4gdGhlIHRlc3QgcnVubmVyIHJlcG9ydHMKK3RoZSBmYWlsdXJlIGFuZCBwcm9jZWVkcyB0byB0aGUgbmV4dCBleGFtcGxlOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgJycnCisgICAgLi4uICAgICA+Pj4geCA9IDEyCisgICAgLi4uICAgICA+Pj4gcHJpbnQgeAorICAgIC4uLiAgICAgMTQKKyAgICAuLi4gICAgID4+PiB4Ly8yCisgICAgLi4uICAgICA2CisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9VHJ1ZSkucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgVHJ5aW5nOgorICAgICAgICB4ID0gMTIKKyAgICBFeHBlY3Rpbmcgbm90aGluZworICAgIG9rCisgICAgVHJ5aW5nOgorICAgICAgICBwcmludCB4CisgICAgRXhwZWN0aW5nOgorICAgICAgICAxNAorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSA0LCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHByaW50IHgKKyAgICBFeHBlY3RlZDoKKyAgICAgICAgMTQKKyAgICBHb3Q6CisgICAgICAgIDEyCisgICAgVHJ5aW5nOgorICAgICAgICB4Ly8yCisgICAgRXhwZWN0aW5nOgorICAgICAgICA2CisgICAgb2sKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTMpCisiIiIKKyAgICBkZWYgdmVyYm9zZV9mbGFnKCk6IHIiIiIKK1RoZSBgdmVyYm9zZWAgZmxhZyBtYWtlcyB0aGUgdGVzdCBydW5uZXIgZ2VuZXJhdGUgbW9yZSBkZXRhaWxlZAorb3V0cHV0OgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgJycnCisgICAgLi4uICAgICA+Pj4geCA9IDEyCisgICAgLi4uICAgICA+Pj4gcHJpbnQgeAorICAgIC4uLiAgICAgMTIKKyAgICAuLi4gICAgID4+PiB4Ly8yCisgICAgLi4uICAgICA2CisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKworICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1UcnVlKS5ydW4odGVzdCkKKyAgICBUcnlpbmc6CisgICAgICAgIHggPSAxMgorICAgIEV4cGVjdGluZyBub3RoaW5nCisgICAgb2sKKyAgICBUcnlpbmc6CisgICAgICAgIHByaW50IHgKKyAgICBFeHBlY3Rpbmc6CisgICAgICAgIDEyCisgICAgb2sKKyAgICBUcnlpbmc6CisgICAgICAgIHgvLzIKKyAgICBFeHBlY3Rpbmc6CisgICAgICAgIDYKKyAgICBvaworICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MykKKworSWYgdGhlIGB2ZXJib3NlYCBmbGFnIGlzIHVuc3BlY2lmaWVkLCB0aGVuIHRoZSBvdXRwdXQgd2lsbCBiZSB2ZXJib3NlCitpZmYgYC12YCBhcHBlYXJzIGluIHN5cy5hcmd2OgorCisgICAgPj4+ICMgU2F2ZSB0aGUgcmVhbCBzeXMuYXJndiBsaXN0LgorICAgID4+PiBvbGRfYXJndiA9IHN5cy5hcmd2CisKKyAgICA+Pj4gIyBJZiAtdiBkb2VzIG5vdCBhcHBlYXIgaW4gc3lzLmFyZ3YsIHRoZW4gb3V0cHV0IGlzbid0IHZlcmJvc2UuCisgICAgPj4+IHN5cy5hcmd2ID0gWyd0ZXN0J10KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKCkucnVuKHRlc3QpCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0zKQorCisgICAgPj4+ICMgSWYgLXYgZG9lcyBhcHBlYXIgaW4gc3lzLmFyZ3YsIHRoZW4gb3V0cHV0IGlzIHZlcmJvc2UuCisgICAgPj4+IHN5cy5hcmd2ID0gWyd0ZXN0JywgJy12J10KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKCkucnVuKHRlc3QpCisgICAgVHJ5aW5nOgorICAgICAgICB4ID0gMTIKKyAgICBFeHBlY3Rpbmcgbm90aGluZworICAgIG9rCisgICAgVHJ5aW5nOgorICAgICAgICBwcmludCB4CisgICAgRXhwZWN0aW5nOgorICAgICAgICAxMgorICAgIG9rCisgICAgVHJ5aW5nOgorICAgICAgICB4Ly8yCisgICAgRXhwZWN0aW5nOgorICAgICAgICA2CisgICAgb2sKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTMpCisKKyAgICA+Pj4gIyBSZXN0b3JlIHN5cy5hcmd2CisgICAgPj4+IHN5cy5hcmd2ID0gb2xkX2FyZ3YKKworSW4gdGhlIHJlbWFpbmluZyBleGFtcGxlcywgdGhlIHRlc3QgcnVubmVyJ3MgdmVyYm9zaXR5IHdpbGwgYmUKK2V4cGxpY2l0bHkgc2V0LCB0byBlbnN1cmUgdGhhdCB0aGUgdGVzdCBiZWhhdmlvciBpcyBjb25zaXN0ZW50LgorICAgICIiIgorICAgIGRlZiBleGNlcHRpb25zKCk6IHIiIiIKK1Rlc3RzIG9mIGBEb2NUZXN0UnVubmVyYCdzIGV4Y2VwdGlvbiBoYW5kbGluZy4KKworQW4gZXhwZWN0ZWQgZXhjZXB0aW9uIGlzIHNwZWNpZmllZCB3aXRoIGEgdHJhY2ViYWNrIG1lc3NhZ2UuICBUaGUKK2xpbmVzIGJldHdlZW4gdGhlIGZpcnN0IGxpbmUgYW5kIHRoZSB0eXBlL3ZhbHVlIG1heSBiZSBvbWl0dGVkIG9yCityZXBsYWNlZCB3aXRoIGFueSBvdGhlciBzdHJpbmc6CisKKyAgICA+Pj4gZGVmIGYoeCk6CisgICAgLi4uICAgICAnJycKKyAgICAuLi4gICAgID4+PiB4ID0gMTIKKyAgICAuLi4gICAgID4+PiBwcmludCB4Ly8wCisgICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uICAgICBaZXJvRGl2aXNpb25FcnJvcjogaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybworICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCisKK0FuIGV4YW1wbGUgbWF5IG5vdCBnZW5lcmF0ZSBvdXRwdXQgYmVmb3JlIGl0IHJhaXNlcyBhbiBleGNlcHRpb247IGlmCitpdCBkb2VzLCB0aGVuIHRoZSB0cmFjZWJhY2sgbWVzc2FnZSB3aWxsIG5vdCBiZSByZWNvZ25pemVkIGFzCitzaWduYWxpbmcgYW4gZXhwZWN0ZWQgZXhjZXB0aW9uLCBzbyB0aGUgZXhhbXBsZSB3aWxsIGJlIHJlcG9ydGVkIGFzIGFuCit1bmV4cGVjdGVkIGV4Y2VwdGlvbjoKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgICcnJworICAgIC4uLiAgICAgPj4+IHggPSAxMgorICAgIC4uLiAgICAgPj4+IHByaW50ICdwcmUtZXhjZXB0aW9uIG91dHB1dCcsIHgvLzAKKyAgICAuLi4gICAgIHByZS1leGNlcHRpb24gb3V0cHV0CisgICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uICAgICBaZXJvRGl2aXNpb25FcnJvcjogaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybworICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgNCwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCAncHJlLWV4Y2VwdGlvbiBvdXRwdXQnLCB4Ly8wCisgICAgRXhjZXB0aW9uIHJhaXNlZDoKKyAgICAgICAgLi4uCisgICAgICAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0yKQorCitFeGNlcHRpb24gbWVzc2FnZXMgbWF5IGNvbnRhaW4gbmV3bGluZXM6CisKKyAgICA+Pj4gZGVmIGYoeCk6CisgICAgLi4uICAgICByJycnCisgICAgLi4uICAgICA+Pj4gcmFpc2UgVmFsdWVFcnJvciwgJ211bHRpXG5saW5lXG5tZXNzYWdlJworICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLiAgICAgVmFsdWVFcnJvcjogbXVsdGkKKyAgICAuLi4gICAgIGxpbmUKKyAgICAuLi4gICAgIG1lc3NhZ2UKKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0xKQorCitJZiBhbiBleGNlcHRpb24gaXMgZXhwZWN0ZWQsIGJ1dCBhbiBleGNlcHRpb24gd2l0aCB0aGUgd3JvbmcgdHlwZSBvcgorbWVzc2FnZSBpcyByYWlzZWQsIHRoZW4gaXQgaXMgcmVwb3J0ZWQgYXMgYSBmYWlsdXJlOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgcicnJworICAgIC4uLiAgICAgPj4+IHJhaXNlIFZhbHVlRXJyb3IsICdtZXNzYWdlJworICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLiAgICAgVmFsdWVFcnJvcjogd3JvbmcgbWVzc2FnZQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMywgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnbWVzc2FnZScKKyAgICBFeHBlY3RlZDoKKyAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgICBWYWx1ZUVycm9yOiB3cm9uZyBtZXNzYWdlCisgICAgR290OgorICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgIC4uLgorICAgICAgICBWYWx1ZUVycm9yOiBtZXNzYWdlCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0xKQorCitIb3dldmVyLCBJR05PUkVfRVhDRVBUSU9OX0RFVEFJTCBjYW4gYmUgdXNlZCB0byBhbGxvdyBhIG1pc21hdGNoIGluIHRoZQorZGV0YWlsOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgcicnJworICAgIC4uLiAgICAgPj4+IHJhaXNlIFZhbHVlRXJyb3IsICdtZXNzYWdlJyAjZG9jdGVzdDogK0lHTk9SRV9FWENFUFRJT05fREVUQUlMCisgICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uICAgICBWYWx1ZUVycm9yOiB3cm9uZyBtZXNzYWdlCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKKworSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwgYWxzbyBpZ25vcmVzIGRpZmZlcmVuY2UgaW4gZXhjZXB0aW9uIGZvcm1hdHRpbmcKK2JldHdlZW4gUHl0aG9uIHZlcnNpb25zLiBGb3IgZXhhbXBsZSwgaW4gUHl0aG9uIDMueCwgdGhlIG1vZHVsZSBwYXRoIG9mCit0aGUgZXhjZXB0aW9uIGlzIGluIHRoZSBvdXRwdXQsIGJ1dCB0aGlzIHdpbGwgZmFpbCB1bmRlciBQeXRob24gMjoKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgIHInJycKKyAgICAuLi4gICAgID4+PiBmcm9tIGh0dHBsaWIgaW1wb3J0IEhUVFBFeGNlcHRpb24KKyAgICAuLi4gICAgID4+PiByYWlzZSBIVFRQRXhjZXB0aW9uKCdtZXNzYWdlJykKKyAgICAuLi4gICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4gICAgIGh0dHBsaWIuSFRUUEV4Y2VwdGlvbjogbWVzc2FnZQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgNCwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKCdtZXNzYWdlJykKKyAgICBFeHBlY3RlZDoKKyAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgICBodHRwbGliLkhUVFBFeGNlcHRpb246IG1lc3NhZ2UKKyAgICBHb3Q6CisgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgLi4uCisgICAgICAgIEhUVFBFeGNlcHRpb246IG1lc3NhZ2UKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCisKK0J1dCBpbiBQeXRob24gMiB0aGUgbW9kdWxlIHBhdGggaXMgbm90IGluY2x1ZGVkLCBhbiB0aGVyZWZvcmUgYSB0ZXN0IG11c3QgbG9vaworbGlrZSB0aGUgZm9sbG93aW5nIHRlc3QgdG8gc3VjY2VlZCBpbiBQeXRob24gMi4gQnV0IHRoYXQgdGVzdCB3aWxsIGZhaWwgdW5kZXIKK1B5dGhvbiAzLgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgcicnJworICAgIC4uLiAgICAgPj4+IGZyb20gaHR0cGxpYiBpbXBvcnQgSFRUUEV4Y2VwdGlvbgorICAgIC4uLiAgICAgPj4+IHJhaXNlIEhUVFBFeGNlcHRpb24oJ21lc3NhZ2UnKQorICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLiAgICAgSFRUUEV4Y2VwdGlvbjogbWVzc2FnZQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCisKK0hvd2V2ZXIsIHdpdGggSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwsIHRoZSBtb2R1bGUgbmFtZSBvZiB0aGUgZXhjZXB0aW9uCisoaWYgYW55KSB3aWxsIGJlIGlnbm9yZWQ6CisKKyAgICA+Pj4gZGVmIGYoeCk6CisgICAgLi4uICAgICByJycnCisgICAgLi4uICAgICA+Pj4gZnJvbSBodHRwbGliIGltcG9ydCBIVFRQRXhjZXB0aW9uCisgICAgLi4uICAgICA+Pj4gcmFpc2UgSFRUUEV4Y2VwdGlvbignbWVzc2FnZScpICNkb2N0ZXN0OiArSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKKyAgICAuLi4gICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4gICAgIEhUVFBFeGNlcHRpb246IG1lc3NhZ2UKKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQorCitUaGUgbW9kdWxlIHBhdGggd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQsIHNvIHR3byBkaWZmZXJlbnQgbW9kdWxlIHBhdGhzIHdpbGwKK3N0aWxsIHBhc3MgaWYgSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwgaXMgZ2l2ZW4uIFRoaXMgaXMgaW50ZW50aW9uYWwsIHNvIGl0IGNhbgorYmUgdXNlZCB3aGVuIGV4Y2VwdGlvbnMgaGF2ZSBjaGFuZ2VkIG1vZHVsZS4KKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgIHInJycKKyAgICAuLi4gICAgID4+PiBmcm9tIGh0dHBsaWIgaW1wb3J0IEhUVFBFeGNlcHRpb24KKyAgICAuLi4gICAgID4+PiByYWlzZSBIVFRQRXhjZXB0aW9uKCdtZXNzYWdlJykgI2RvY3Rlc3Q6ICtJR05PUkVfRVhDRVBUSU9OX0RFVEFJTAorICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLiAgICAgZm9vLmJhci5IVFRQRXhjZXB0aW9uOiBtZXNzYWdlCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKKworQnV0IElHTk9SRV9FWENFUFRJT05fREVUQUlMIGRvZXMgbm90IGFsbG93IGEgbWlzbWF0Y2ggaW4gdGhlIGV4Y2VwdGlvbiB0eXBlOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgcicnJworICAgIC4uLiAgICAgPj4+IHJhaXNlIFZhbHVlRXJyb3IsICdtZXNzYWdlJyAjZG9jdGVzdDogK0lHTk9SRV9FWENFUFRJT05fREVUQUlMCisgICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uICAgICBUeXBlRXJyb3I6IHdyb25nIHR5cGUKKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDMsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ21lc3NhZ2UnICNkb2N0ZXN0OiArSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKKyAgICBFeHBlY3RlZDoKKyAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgICBUeXBlRXJyb3I6IHdyb25nIHR5cGUKKyAgICBHb3Q6CisgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgLi4uCisgICAgICAgIFZhbHVlRXJyb3I6IG1lc3NhZ2UKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTEpCisKK0lmIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgYnV0IG5vdCBleHBlY3RlZCwgdGhlbiBpdCBpcyByZXBvcnRlZCBhcyBhbgordW5leHBlY3RlZCBleGNlcHRpb246CisKKyAgICA+Pj4gZGVmIGYoeCk6CisgICAgLi4uICAgICByJycnCisgICAgLi4uICAgICA+Pj4gMS8vMAorICAgIC4uLiAgICAgMAorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMywgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICAxLy8wCisgICAgRXhjZXB0aW9uIHJhaXNlZDoKKyAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgICAuLi4KKyAgICAgICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8KKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTEpCisiIiIKKyAgICBkZWYgZGlzcGxheWhvb2soKTogciIiIgorVGVzdCB0aGF0IGNoYW5naW5nIHN5cy5kaXNwbGF5aG9vayBkb2Vzbid0IG1hdHRlciBmb3IgZG9jdGVzdC4KKworICAgID4+PiBpbXBvcnQgc3lzCisgICAgPj4+IG9yaWdfZGlzcGxheWhvb2sgPSBzeXMuZGlzcGxheWhvb2sKKyAgICA+Pj4gZGVmIG15X2Rpc3BsYXlob29rKHgpOgorICAgIC4uLiAgICAgcHJpbnQoJ2hpIScpCisgICAgPj4+IHN5cy5kaXNwbGF5aG9vayA9IG15X2Rpc3BsYXlob29rCisgICAgPj4+IGRlZiBmKCk6CisgICAgLi4uICAgICAnJycKKyAgICAuLi4gICAgID4+PiAzCisgICAgLi4uICAgICAzCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gciA9IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICA+Pj4gcG9zdF9kaXNwbGF5aG9vayA9IHN5cy5kaXNwbGF5aG9vaworCisgICAgV2UgbmVlZCB0byByZXN0b3JlIHN5cy5kaXNwbGF5aG9vayBub3csIHNvIHRoYXQgd2UnbGwgYmUgYWJsZSB0byB0ZXN0CisgICAgcmVzdWx0cy4KKworICAgID4+PiBzeXMuZGlzcGxheWhvb2sgPSBvcmlnX2Rpc3BsYXlob29rCisKKyAgICBPaywgbm93IHdlIGNhbiBjaGVjayB0aGF0IGV2ZXJ5dGhpbmcgaXMgb2suCisKKyAgICA+Pj4gcgorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKKyAgICA+Pj4gcG9zdF9kaXNwbGF5aG9vayBpcyBteV9kaXNwbGF5aG9vaworICAgIFRydWUKKyIiIgorICAgIGRlZiBvcHRpb25mbGFncygpOiByIiIiCitUZXN0cyBvZiBgRG9jVGVzdFJ1bm5lcmAncyBvcHRpb24gZmxhZyBoYW5kbGluZy4KKworU2V2ZXJhbCBvcHRpb24gZmxhZ3MgY2FuIGJlIHVzZWQgdG8gY3VzdG9taXplIHRoZSBiZWhhdmlvciBvZiB0aGUgdGVzdAorcnVubmVyLiAgVGhlc2UgYXJlIGRlZmluZWQgYXMgbW9kdWxlIGNvbnN0YW50cyBpbiBkb2N0ZXN0LCBhbmQgcGFzc2VkCit0byB0aGUgRG9jVGVzdFJ1bm5lciBjb25zdHJ1Y3RvciAobXVsdGlwbGUgY29uc3RhbnRzIHNob3VsZCBiZSBPUmVkCit0b2dldGhlcikuCisKK1RoZSBET05UX0FDQ0VQVF9UUlVFX0ZPUl8xIGZsYWcgZGlzYWJsZXMgbWF0Y2hlcyBiZXR3ZWVuIFRydWUvRmFsc2UKK2FuZCAxLzA6CisKKyAgICA+Pj4gZGVmIGYoeCk6CisgICAgLi4uICAgICAnPj4+IFRydWVcbjFcbicKKworICAgID4+PiAjIFdpdGhvdXQgdGhlIGZsYWc6CisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTEpCisKKyAgICA+Pj4gIyBXaXRoIHRoZSBmbGFnOgorICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBmbGFncyA9IGRvY3Rlc3QuRE9OVF9BQ0NFUFRfVFJVRV9GT1JfMQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSwgb3B0aW9uZmxhZ3M9ZmxhZ3MpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSAyLCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIFRydWUKKyAgICBFeHBlY3RlZDoKKyAgICAgICAgMQorICAgIEdvdDoKKyAgICAgICAgVHJ1ZQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MSkKKworVGhlIERPTlRfQUNDRVBUX0JMQU5LTElORSBmbGFnIGRpc2FibGVzIHRoZSBtYXRjaCBiZXR3ZWVuIGJsYW5rIGxpbmVzCithbmQgdGhlICc8QkxBTktMSU5FPicgbWFya2VyOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgJz4+PiBwcmludCAiYVxcblxcbmIiXG5hXG48QkxBTktMSU5FPlxuYlxuJworCisgICAgPj4+ICMgV2l0aG91dCB0aGUgZmxhZzoKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKKworICAgID4+PiAjIFdpdGggdGhlIGZsYWc6CisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGZsYWdzID0gZG9jdGVzdC5ET05UX0FDQ0VQVF9CTEFOS0xJTkUKKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UsIG9wdGlvbmZsYWdzPWZsYWdzKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMiwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCAiYVxuXG5iIgorICAgIEV4cGVjdGVkOgorICAgICAgICBhCisgICAgICAgIDxCTEFOS0xJTkU+CisgICAgICAgIGIKKyAgICBHb3Q6CisgICAgICAgIGEKKyAgICA8QkxBTktMSU5FPgorICAgICAgICBiCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0xKQorCitUaGUgTk9STUFMSVpFX1dISVRFU1BBQ0UgZmxhZyBjYXVzZXMgYWxsIHNlcXVlbmNlcyBvZiB3aGl0ZXNwYWNlIHRvIGJlCit0cmVhdGVkIGFzIGVxdWFsOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgJz4+PiBwcmludCAxLCAyLCAzXG4gIDEgICAyXG4gMycKKworICAgID4+PiAjIFdpdGhvdXQgdGhlIGZsYWc6CisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMiwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCAxLCAyLCAzCisgICAgRXhwZWN0ZWQ6CisgICAgICAgICAgMSAgIDIKKyAgICAgICAgIDMKKyAgICBHb3Q6CisgICAgICAgIDEgMiAzCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0xKQorCisgICAgPj4+ICMgV2l0aCB0aGUgZmxhZzoKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZmxhZ3MgPSBkb2N0ZXN0Lk5PUk1BTElaRV9XSElURVNQQUNFCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlLCBvcHRpb25mbGFncz1mbGFncykucnVuKHRlc3QpCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0xKQorCisgICAgQW4gZXhhbXBsZSBmcm9tIHRoZSBkb2NzOgorICAgID4+PiBwcmludCByYW5nZSgyMCkgI2RvY3Rlc3Q6ICtOT1JNQUxJWkVfV0hJVEVTUEFDRQorICAgIFswLCAgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwKKyAgICAxMCwgIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTldCisKK1RoZSBFTExJUFNJUyBmbGFnIGNhdXNlcyBlbGxpcHNpcyBtYXJrZXIgKCIuLi4iKSBpbiB0aGUgZXhwZWN0ZWQKK291dHB1dCB0byBtYXRjaCBhbnkgc3Vic3RyaW5nIGluIHRoZSBhY3R1YWwgb3V0cHV0OgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgJz4+PiBwcmludCByYW5nZSgxNSlcblswLCAxLCAyLCAuLi4sIDE0XVxuJworCisgICAgPj4+ICMgV2l0aG91dCB0aGUgZmxhZzoKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSAyLCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHByaW50IHJhbmdlKDE1KQorICAgIEV4cGVjdGVkOgorICAgICAgICBbMCwgMSwgMiwgLi4uLCAxNF0KKyAgICBHb3Q6CisgICAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTRdCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0xKQorCisgICAgPj4+ICMgV2l0aCB0aGUgZmxhZzoKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZmxhZ3MgPSBkb2N0ZXN0LkVMTElQU0lTCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlLCBvcHRpb25mbGFncz1mbGFncykucnVuKHRlc3QpCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0xKQorCisgICAgLi4uIGFsc28gbWF0Y2hlcyBub3RoaW5nOgorCisgICAgPj4+IGZvciBpIGluIHJhbmdlKDEwMCk6CisgICAgLi4uICAgICBwcmludCBpKioyLCAjZG9jdGVzdDogK0VMTElQU0lTCisgICAgMCAxLi4uNC4uLjkgMTYgLi4uIDM2IDQ5IDY0IC4uLiA5ODAxCisKKyAgICAuLi4gY2FuIGJlIHN1cnByaXNpbmc7IGUuZy4sIHRoaXMgdGVzdCBwYXNzZXM6CisKKyAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoMjEpOiAjZG9jdGVzdDogK0VMTElQU0lTCisgICAgLi4uICAgICBwcmludCBpLAorICAgIDAgMSAyIC4uLjEuLi4yLi4uMAorCisgICAgRXhhbXBsZXMgZnJvbSB0aGUgZG9jczoKKworICAgID4+PiBwcmludCByYW5nZSgyMCkgIyBkb2N0ZXN0OitFTExJUFNJUworICAgIFswLCAxLCAuLi4sIDE4LCAxOV0KKworICAgID4+PiBwcmludCByYW5nZSgyMCkgIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAuLi4gICAgICAgICAgICAgICAgICMgZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFCisgICAgWzAsICAgIDEsIC4uLiwgICAxOCwgICAgMTldCisKK1RoZSBTS0lQIGZsYWcgY2F1c2VzIGFuIGV4YW1wbGUgdG8gYmUgc2tpcHBlZCBlbnRpcmVseS4gIEkuZS4sIHRoZQorZXhhbXBsZSBpcyBub3QgcnVuLiAgSXQgY2FuIGJlIHVzZWZ1bCBpbiBjb250ZXh0cyB3aGVyZSBkb2N0ZXN0CitleGFtcGxlcyBzZXJ2ZSBhcyBib3RoIGRvY3VtZW50YXRpb24gYW5kIHRlc3QgY2FzZXMsIGFuZCBhbiBleGFtcGxlCitzaG91bGQgYmUgaW5jbHVkZWQgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMsIGJ1dCBzaG91bGQgbm90IGJlCitjaGVja2VkIChlLmcuLCBiZWNhdXNlIGl0cyBvdXRwdXQgaXMgcmFuZG9tLCBvciBkZXBlbmRzIG9uIHJlc291cmNlcword2hpY2ggd291bGQgYmUgdW5hdmFpbGFibGUuKSAgVGhlIFNLSVAgZmxhZyBjYW4gYWxzbyBiZSB1c2VkIGZvcgorJ2NvbW1lbnRpbmcgb3V0JyBicm9rZW4gZXhhbXBsZXMuCisKKyAgICA+Pj4gaW1wb3J0IHVuYXZhaWxhYmxlX3Jlc291cmNlICAgICAgICAgICAjIGRvY3Rlc3Q6ICtTS0lQCisgICAgPj4+IHVuYXZhaWxhYmxlX3Jlc291cmNlLmRvX3NvbWV0aGluZygpICAgIyBkb2N0ZXN0OiArU0tJUAorICAgID4+PiB1bmF2YWlsYWJsZV9yZXNvdXJjZS5ibG93X3VwKCkgICAgICAgICMgZG9jdGVzdDogK1NLSVAKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgIC4uLgorICAgIFVuY2hlY2tlZEJsb3dVcEVycm9yOiAgTm9ib2R5IGNoZWNrcyBtZS4KKworICAgID4+PiBpbXBvcnQgcmFuZG9tCisgICAgPj4+IHByaW50IHJhbmRvbS5yYW5kb20oKSAjIGRvY3Rlc3Q6ICtTS0lQCisgICAgMC43MjEyMTY5MjM4ODkKKworVGhlIFJFUE9SVF9VRElGRiBmbGFnIGNhdXNlcyBmYWlsdXJlcyB0aGF0IGludm9sdmUgbXVsdGktbGluZSBleHBlY3RlZAorYW5kIGFjdHVhbCBvdXRwdXRzIHRvIGJlIGRpc3BsYXllZCB1c2luZyBhIHVuaWZpZWQgZGlmZjoKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgIHInJycKKyAgICAuLi4gICAgID4+PiBwcmludCAnXG4nLmpvaW4oJ2FiY2RlZmcnKQorICAgIC4uLiAgICAgYQorICAgIC4uLiAgICAgQgorICAgIC4uLiAgICAgYworICAgIC4uLiAgICAgZAorICAgIC4uLiAgICAgZgorICAgIC4uLiAgICAgZworICAgIC4uLiAgICAgaAorICAgIC4uLiAgICAgJycnCisKKyAgICA+Pj4gIyBXaXRob3V0IHRoZSBmbGFnOgorICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDMsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcHJpbnQgJ1xuJy5qb2luKCdhYmNkZWZnJykKKyAgICBFeHBlY3RlZDoKKyAgICAgICAgYQorICAgICAgICBCCisgICAgICAgIGMKKyAgICAgICAgZAorICAgICAgICBmCisgICAgICAgIGcKKyAgICAgICAgaAorICAgIEdvdDoKKyAgICAgICAgYQorICAgICAgICBiCisgICAgICAgIGMKKyAgICAgICAgZAorICAgICAgICBlCisgICAgICAgIGYKKyAgICAgICAgZworICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MSkKKworICAgID4+PiAjIFdpdGggdGhlIGZsYWc6CisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGZsYWdzID0gZG9jdGVzdC5SRVBPUlRfVURJRkYKKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UsIG9wdGlvbmZsYWdzPWZsYWdzKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMywgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCAnXG4nLmpvaW4oJ2FiY2RlZmcnKQorICAgIERpZmZlcmVuY2VzICh1bmlmaWVkIGRpZmYgd2l0aCAtZXhwZWN0ZWQgK2FjdHVhbCk6CisgICAgICAgIEBAIC0xLDcgKzEsNyBAQAorICAgICAgICAgYQorICAgICAgICAtQgorICAgICAgICArYgorICAgICAgICAgYworICAgICAgICAgZAorICAgICAgICArZQorICAgICAgICAgZgorICAgICAgICAgZworICAgICAgICAtaAorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MSkKKworVGhlIFJFUE9SVF9DRElGRiBmbGFnIGNhdXNlcyBmYWlsdXJlcyB0aGF0IGludm9sdmUgbXVsdGktbGluZSBleHBlY3RlZAorYW5kIGFjdHVhbCBvdXRwdXRzIHRvIGJlIGRpc3BsYXllZCB1c2luZyBhIGNvbnRleHQgZGlmZjoKKworICAgID4+PiAjIFJldXNlIGYoKSBmcm9tIHRoZSBSRVBPUlRfVURJRkYgZXhhbXBsZSwgYWJvdmUuCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGZsYWdzID0gZG9jdGVzdC5SRVBPUlRfQ0RJRkYKKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UsIG9wdGlvbmZsYWdzPWZsYWdzKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMywgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCAnXG4nLmpvaW4oJ2FiY2RlZmcnKQorICAgIERpZmZlcmVuY2VzIChjb250ZXh0IGRpZmYgd2l0aCBleHBlY3RlZCBmb2xsb3dlZCBieSBhY3R1YWwpOgorICAgICAgICAqKioqKioqKioqKioqKioKKyAgICAgICAgKioqIDEsNyAqKioqCisgICAgICAgICAgYQorICAgICAgICAhIEIKKyAgICAgICAgICBjCisgICAgICAgICAgZAorICAgICAgICAgIGYKKyAgICAgICAgICBnCisgICAgICAgIC0gaAorICAgICAgICAtLS0gMSw3IC0tLS0KKyAgICAgICAgICBhCisgICAgICAgICEgYgorICAgICAgICAgIGMKKyAgICAgICAgICBkCisgICAgICAgICsgZQorICAgICAgICAgIGYKKyAgICAgICAgICBnCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0xKQorCisKK1RoZSBSRVBPUlRfTkRJRkYgZmxhZyBjYXVzZXMgZmFpbHVyZXMgdG8gdXNlIHRoZSBkaWZmbGliLkRpZmZlciBhbGdvcml0aG0KK3VzZWQgYnkgdGhlIHBvcHVsYXIgbmRpZmYucHkgdXRpbGl0eS4gIFRoaXMgZG9lcyBpbnRyYWxpbmUgZGlmZmVyZW5jZQorbWFya2luZywgYXMgd2VsbCBhcyBpbnRlcmxpbmUgZGlmZmVyZW5jZXMuCisKKyAgICA+Pj4gZGVmIGYoeCk6CisgICAgLi4uICAgICByJycnCisgICAgLi4uICAgICA+Pj4gcHJpbnQgImEgYiAgYyBkIGUgZiBnIGggaSAgIGogayBsIG0iCisgICAgLi4uICAgICBhIGIgYyBkIGUgZiBnIGggaSBqIGsgMSBtCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZmxhZ3MgPSBkb2N0ZXN0LlJFUE9SVF9ORElGRgorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSwgb3B0aW9uZmxhZ3M9ZmxhZ3MpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSAzLCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHByaW50ICJhIGIgIGMgZCBlIGYgZyBoIGkgICBqIGsgbCBtIgorICAgIERpZmZlcmVuY2VzIChuZGlmZiB3aXRoIC1leHBlY3RlZCArYWN0dWFsKToKKyAgICAgICAgLSBhIGIgYyBkIGUgZiBnIGggaSBqIGsgMSBtCisgICAgICAgID8gICAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgKyBhIGIgIGMgZCBlIGYgZyBoIGkgICBqIGsgbCBtCisgICAgICAgID8gICAgICsgICAgICAgICAgICAgICsrICAgIF4KKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTEpCisKK1RoZSBSRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFIHN1cHByZXNzZXMgcmVzdWx0IG91dHB1dCBhZnRlciB0aGUgZmlyc3QKK2ZhaWxpbmcgZXhhbXBsZToKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgIHInJycKKyAgICAuLi4gICAgID4+PiBwcmludCAxICMgZmlyc3Qgc3VjY2VzcworICAgIC4uLiAgICAgMQorICAgIC4uLiAgICAgPj4+IHByaW50IDIgIyBmaXJzdCBmYWlsdXJlCisgICAgLi4uICAgICAyMDAKKyAgICAuLi4gICAgID4+PiBwcmludCAzICMgc2Vjb25kIGZhaWx1cmUKKyAgICAuLi4gICAgIDMwMAorICAgIC4uLiAgICAgPj4+IHByaW50IDQgIyBzZWNvbmQgc3VjY2VzcworICAgIC4uLiAgICAgNAorICAgIC4uLiAgICAgPj4+IHByaW50IDUgIyB0aGlyZCBmYWlsdXJlCisgICAgLi4uICAgICA1MDAKKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBmbGFncyA9IGRvY3Rlc3QuUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSwgb3B0aW9uZmxhZ3M9ZmxhZ3MpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSA1LCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHByaW50IDIgIyBmaXJzdCBmYWlsdXJlCisgICAgRXhwZWN0ZWQ6CisgICAgICAgIDIwMAorICAgIEdvdDoKKyAgICAgICAgMgorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0zLCBhdHRlbXB0ZWQ9NSkKKworSG93ZXZlciwgb3V0cHV0IGZyb20gYHJlcG9ydF9zdGFydGAgaXMgbm90IHN1cHByZXNzZWQ6CisKKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9VHJ1ZSwgb3B0aW9uZmxhZ3M9ZmxhZ3MpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgIFRyeWluZzoKKyAgICAgICAgcHJpbnQgMSAjIGZpcnN0IHN1Y2Nlc3MKKyAgICBFeHBlY3Rpbmc6CisgICAgICAgIDEKKyAgICBvaworICAgIFRyeWluZzoKKyAgICAgICAgcHJpbnQgMiAjIGZpcnN0IGZhaWx1cmUKKyAgICBFeHBlY3Rpbmc6CisgICAgICAgIDIwMAorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSA1LCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHByaW50IDIgIyBmaXJzdCBmYWlsdXJlCisgICAgRXhwZWN0ZWQ6CisgICAgICAgIDIwMAorICAgIEdvdDoKKyAgICAgICAgMgorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0zLCBhdHRlbXB0ZWQ9NSkKKworRm9yIHRoZSBwdXJwb3NlcyBvZiBSRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFLCB1bmV4cGVjdGVkIGV4Y2VwdGlvbnMKK2NvdW50IGFzIGZhaWx1cmVzOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgcicnJworICAgIC4uLiAgICAgPj4+IHByaW50IDEgIyBmaXJzdCBzdWNjZXNzCisgICAgLi4uICAgICAxCisgICAgLi4uICAgICA+Pj4gcmFpc2UgVmFsdWVFcnJvcigyKSAjIGZpcnN0IGZhaWx1cmUKKyAgICAuLi4gICAgIDIwMAorICAgIC4uLiAgICAgPj4+IHByaW50IDMgIyBzZWNvbmQgZmFpbHVyZQorICAgIC4uLiAgICAgMzAwCisgICAgLi4uICAgICA+Pj4gcHJpbnQgNCAjIHNlY29uZCBzdWNjZXNzCisgICAgLi4uICAgICA0CisgICAgLi4uICAgICA+Pj4gcHJpbnQgNSAjIHRoaXJkIGZhaWx1cmUKKyAgICAuLi4gICAgIDUwMAorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGZsYWdzID0gZG9jdGVzdC5SRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlLCBvcHRpb25mbGFncz1mbGFncykucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDUsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigyKSAjIGZpcnN0IGZhaWx1cmUKKyAgICBFeGNlcHRpb24gcmFpc2VkOgorICAgICAgICAuLi4KKyAgICAgICAgVmFsdWVFcnJvcjogMgorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0zLCBhdHRlbXB0ZWQ9NSkKKworTmV3IG9wdGlvbiBmbGFncyBjYW4gYWxzbyBiZSByZWdpc3RlcmVkLCB2aWEgcmVnaXN0ZXJfb3B0aW9uZmxhZygpLiAgSGVyZQord2UgcmVhY2ggaW50byBkb2N0ZXN0J3MgaW50ZXJuYWxzIGEgYml0LgorCisgICAgPj4+IHVubGlrZWx5ID0gIlVOTElLRUxZX09QVElPTl9OQU1FIgorICAgID4+PiB1bmxpa2VseSBpbiBkb2N0ZXN0Lk9QVElPTkZMQUdTX0JZX05BTUUKKyAgICBGYWxzZQorICAgID4+PiBuZXdfZmxhZ192YWx1ZSA9IGRvY3Rlc3QucmVnaXN0ZXJfb3B0aW9uZmxhZyh1bmxpa2VseSkKKyAgICA+Pj4gdW5saWtlbHkgaW4gZG9jdGVzdC5PUFRJT05GTEFHU19CWV9OQU1FCisgICAgVHJ1ZQorCitCZWZvcmUgMi40LjQvMi41LCByZWdpc3RlcmluZyBhIG5hbWUgbW9yZSB0aGFuIG9uY2UgZXJyb25lb3VzbHkgY3JlYXRlZAorbW9yZSB0aGFuIG9uZSBmbGFnIHZhbHVlLiAgSGVyZSB3ZSB2ZXJpZnkgdGhhdCdzIGZpeGVkOgorCisgICAgPj4+IHJlZHVuZGFudF9mbGFnX3ZhbHVlID0gZG9jdGVzdC5yZWdpc3Rlcl9vcHRpb25mbGFnKHVubGlrZWx5KQorICAgID4+PiByZWR1bmRhbnRfZmxhZ192YWx1ZSA9PSBuZXdfZmxhZ192YWx1ZQorICAgIFRydWUKKworQ2xlYW4gdXAuCisgICAgPj4+IGRlbCBkb2N0ZXN0Lk9QVElPTkZMQUdTX0JZX05BTUVbdW5saWtlbHldCisKKyAgICAiIiIKKworICAgIGRlZiBvcHRpb25fZGlyZWN0aXZlcygpOiByIiIiCitUZXN0cyBvZiBgRG9jVGVzdFJ1bm5lcmAncyBvcHRpb24gZGlyZWN0aXZlIG1lY2hhbmlzbS4KKworT3B0aW9uIGRpcmVjdGl2ZXMgY2FuIGJlIHVzZWQgdG8gdHVybiBvcHRpb24gZmxhZ3Mgb24gb3Igb2ZmIGZvciBhCitzaW5nbGUgZXhhbXBsZS4gIFRvIHR1cm4gYW4gb3B0aW9uIG9uIGZvciBhbiBleGFtcGxlLCBmb2xsb3cgdGhhdAorZXhhbXBsZSB3aXRoIGEgY29tbWVudCBvZiB0aGUgZm9ybSBgYCMgZG9jdGVzdDogK09QVElPTmBgOgorCisgICAgPj4+IGRlZiBmKHgpOiByJycnCisgICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgc2hvdWxkIGZhaWw6IG5vIGVsbGlwc2lzCisgICAgLi4uICAgICBbMCwgMSwgLi4uLCA5XQorICAgIC4uLgorICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKSAgICAgICAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgIC4uLiAgICAgWzAsIDEsIC4uLiwgOV0KKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDIsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcHJpbnQgcmFuZ2UoMTApICAgICAgICMgc2hvdWxkIGZhaWw6IG5vIGVsbGlwc2lzCisgICAgRXhwZWN0ZWQ6CisgICAgICAgIFswLCAxLCAuLi4sIDldCisgICAgR290OgorICAgICAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCisKK1RvIHR1cm4gYW4gb3B0aW9uIG9mZiBmb3IgYW4gZXhhbXBsZSwgZm9sbG93IHRoYXQgZXhhbXBsZSB3aXRoIGEKK2NvbW1lbnQgb2YgdGhlIGZvcm0gYGAjIGRvY3Rlc3Q6IC1PUFRJT05gYDoKKworICAgID4+PiBkZWYgZih4KTogcicnJworICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKQorICAgIC4uLiAgICAgWzAsIDEsIC4uLiwgOV0KKyAgICAuLi4KKyAgICAuLi4gICAgID4+PiAjIHNob3VsZCBmYWlsOiBubyBlbGxpcHNpcworICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKSAgICAgICAjIGRvY3Rlc3Q6IC1FTExJUFNJUworICAgIC4uLiAgICAgWzAsIDEsIC4uLiwgOV0KKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSwKKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmZsYWdzPWRvY3Rlc3QuRUxMSVBTSVMpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSA2LCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHByaW50IHJhbmdlKDEwKSAgICAgICAjIGRvY3Rlc3Q6IC1FTExJUFNJUworICAgIEV4cGVjdGVkOgorICAgICAgICBbMCwgMSwgLi4uLCA5XQorICAgIEdvdDoKKyAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0yKQorCitPcHRpb24gZGlyZWN0aXZlcyBhZmZlY3Qgb25seSB0aGUgZXhhbXBsZSB0aGF0IHRoZXkgYXBwZWFyIHdpdGg7IHRoZXkKK2RvIG5vdCBjaGFuZ2UgdGhlIG9wdGlvbnMgZm9yIHN1cnJvdW5kaW5nIGV4YW1wbGVzOgorCisgICAgPj4+IGRlZiBmKHgpOiByJycnCisgICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIGZhaWw6IG5vIGVsbGlwc2lzCisgICAgLi4uICAgICBbMCwgMSwgLi4uLCA5XQorICAgIC4uLgorICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKSAgICAgICAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgIC4uLiAgICAgWzAsIDEsIC4uLiwgOV0KKyAgICAuLi4KKyAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgZmFpbDogbm8gZWxsaXBzaXMKKyAgICAuLi4gICAgIFswLCAxLCAuLi4sIDldCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSAyLCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHByaW50IHJhbmdlKDEwKSAgICAgICAjIFNob3VsZCBmYWlsOiBubyBlbGxpcHNpcworICAgIEV4cGVjdGVkOgorICAgICAgICBbMCwgMSwgLi4uLCA5XQorICAgIEdvdDoKKyAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDgsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIGZhaWw6IG5vIGVsbGlwc2lzCisgICAgRXhwZWN0ZWQ6CisgICAgICAgIFswLCAxLCAuLi4sIDldCisgICAgR290OgorICAgICAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MiwgYXR0ZW1wdGVkPTMpCisKK011bHRpcGxlIG9wdGlvbnMgbWF5IGJlIG1vZGlmaWVkIGJ5IGEgc2luZ2xlIG9wdGlvbiBkaXJlY3RpdmUuICBUaGV5CittYXkgYmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UsIGNvbW1hcywgb3IgYm90aDoKKworICAgID4+PiBkZWYgZih4KTogcicnJworICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKSAgICAgICAjIFNob3VsZCBmYWlsCisgICAgLi4uICAgICBbMCwgMSwgIC4uLiwgICA5XQorICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKSAgICAgICAjIFNob3VsZCBzdWNjZWVkCisgICAgLi4uICAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMgK05PUk1BTElaRV9XSElURVNQQUNFCisgICAgLi4uICAgICBbMCwgMSwgIC4uLiwgICA5XQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMiwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgZmFpbAorICAgIEV4cGVjdGVkOgorICAgICAgICBbMCwgMSwgIC4uLiwgICA5XQorICAgIEdvdDoKKyAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0yKQorCisgICAgPj4+IGRlZiBmKHgpOiByJycnCisgICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIGZhaWwKKyAgICAuLi4gICAgIFswLCAxLCAgLi4uLCAgIDldCisgICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIHN1Y2NlZWQKKyAgICAuLi4gICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUywrTk9STUFMSVpFX1dISVRFU1BBQ0UKKyAgICAuLi4gICAgIFswLCAxLCAgLi4uLCAgIDldCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSAyLCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHByaW50IHJhbmdlKDEwKSAgICAgICAjIFNob3VsZCBmYWlsCisgICAgRXhwZWN0ZWQ6CisgICAgICAgIFswLCAxLCAgLi4uLCAgIDldCisgICAgR290OgorICAgICAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCisKKyAgICA+Pj4gZGVmIGYoeCk6IHInJycKKyAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgZmFpbAorICAgIC4uLiAgICAgWzAsIDEsICAuLi4sICAgOV0KKyAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgc3VjY2VlZAorICAgIC4uLiAgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTLCArTk9STUFMSVpFX1dISVRFU1BBQ0UKKyAgICAuLi4gICAgIFswLCAxLCAgLi4uLCAgIDldCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSAyLCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHByaW50IHJhbmdlKDEwKSAgICAgICAjIFNob3VsZCBmYWlsCisgICAgRXhwZWN0ZWQ6CisgICAgICAgIFswLCAxLCAgLi4uLCAgIDldCisgICAgR290OgorICAgICAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCisKK1RoZSBvcHRpb24gZGlyZWN0aXZlIG1heSBiZSBwdXQgb24gdGhlIGxpbmUgZm9sbG93aW5nIHRoZSBzb3VyY2UsIGFzCitsb25nIGFzIGEgY29udGludWF0aW9uIHByb21wdCBpcyB1c2VkOgorCisgICAgPj4+IGRlZiBmKHgpOiByJycnCisgICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApCisgICAgLi4uICAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAuLi4gICAgIFswLCAxLCAuLi4sIDldCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKKworRm9yIGV4YW1wbGVzIHdpdGggbXVsdGktbGluZSBzb3VyY2UsIHRoZSBvcHRpb24gZGlyZWN0aXZlIG1heSBhcHBlYXIKK2F0IHRoZSBlbmQgb2YgYW55IGxpbmU6CisKKyAgICA+Pj4gZGVmIGYoeCk6IHInJycKKyAgICAuLi4gICAgID4+PiBmb3IgeCBpbiByYW5nZSgxMCk6ICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgLi4uICAgICAuLi4gICAgIHByaW50IHgsCisgICAgLi4uICAgICAwIDEgMiAuLi4gOQorICAgIC4uLgorICAgIC4uLiAgICAgPj4+IGZvciB4IGluIHJhbmdlKDEwKToKKyAgICAuLi4gICAgIC4uLiAgICAgcHJpbnQgeCwgICAgICAgICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgLi4uICAgICAwIDEgMiAuLi4gOQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCisKK0lmIG1vcmUgdGhhbiBvbmUgbGluZSBvZiBhbiBleGFtcGxlIHdpdGggbXVsdGktbGluZSBzb3VyY2UgaGFzIGFuCitvcHRpb24gZGlyZWN0aXZlLCB0aGVuIHRoZXkgYXJlIGNvbWJpbmVkOgorCisgICAgPj4+IGRlZiBmKHgpOiByJycnCisgICAgLi4uICAgICBTaG91bGQgZmFpbCAob3B0aW9uIGRpcmVjdGl2ZSBub3Qgb24gdGhlIGxhc3QgbGluZSk6CisgICAgLi4uICAgICAgICAgPj4+IGZvciB4IGluIHJhbmdlKDEwKTogIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAuLi4gICAgICAgICAuLi4gICAgIHByaW50IHgsICAgICAgICAjIGRvY3Rlc3Q6ICtOT1JNQUxJWkVfV0hJVEVTUEFDRQorICAgIC4uLiAgICAgICAgIDAgIDEgICAgMi4uLjkKKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0xKQorCitJdCBpcyBhbiBlcnJvciB0byBoYXZlIGEgY29tbWVudCBvZiB0aGUgZm9ybSBgYCMgZG9jdGVzdDpgYCB0aGF0IGlzCisqbm90KiBmb2xsb3dlZCBieSB3b3JkcyBvZiB0aGUgZm9ybSBgYCtPUFRJT05gYCBvciBgYC1PUFRJT05gYCwgd2hlcmUKK2BgT1BUSU9OYGAgaXMgYW4gb3B0aW9uIHRoYXQgaGFzIGJlZW4gcmVnaXN0ZXJlZCB3aXRoCitgcmVnaXN0ZXJfb3B0aW9uYDoKKworICAgID4+PiAjIEVycm9yOiBPcHRpb24gbm90IHJlZ2lzdGVyZWQKKyAgICA+Pj4gcyA9ICc+Pj4gcHJpbnQgMTIgICAjZG9jdGVzdDogK0JBRE9QVElPTicKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdFBhcnNlcigpLmdldF9kb2N0ZXN0KHMsIHt9LCAncycsICdzLnB5JywgMCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgVmFsdWVFcnJvcjogbGluZSAxIG9mIHRoZSBkb2N0ZXN0IGZvciBzIGhhcyBhbiBpbnZhbGlkIG9wdGlvbjogJytCQURPUFRJT04nCisKKyAgICA+Pj4gIyBFcnJvcjogTm8gKyBvciAtIHByZWZpeAorICAgID4+PiBzID0gJz4+PiBwcmludCAxMiAgICNkb2N0ZXN0OiBFTExJUFNJUycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdFBhcnNlcigpLmdldF9kb2N0ZXN0KHMsIHt9LCAncycsICdzLnB5JywgMCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgVmFsdWVFcnJvcjogbGluZSAxIG9mIHRoZSBkb2N0ZXN0IGZvciBzIGhhcyBhbiBpbnZhbGlkIG9wdGlvbjogJ0VMTElQU0lTJworCitJdCBpcyBhbiBlcnJvciB0byB1c2UgYW4gb3B0aW9uIGRpcmVjdGl2ZSBvbiBhIGxpbmUgdGhhdCBjb250YWlucyBubworc291cmNlOgorCisgICAgPj4+IHMgPSAnPj4+ICMgZG9jdGVzdDogK0VMTElQU0lTJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0UGFyc2VyKCkuZ2V0X2RvY3Rlc3Qocywge30sICdzJywgJ3MucHknLCAwKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBWYWx1ZUVycm9yOiBsaW5lIDAgb2YgdGhlIGRvY3Rlc3QgZm9yIHMgaGFzIGFuIG9wdGlvbiBkaXJlY3RpdmUgb24gYSBsaW5lIHdpdGggbm8gZXhhbXBsZTogJyMgZG9jdGVzdDogK0VMTElQU0lTJworCisgICAgIiIiCisKKyAgICBkZWYgdGVzdF91bmljb2RlX291dHB1dChzZWxmKTogciIiIgorCitDaGVjayB0aGF0IHVuaWNvZGUgb3V0cHV0IHdvcmtzOgorCisgICAgPj4+IHUnXHhlOScKKyAgICB1J1x4ZTknCisKK0lmIHdlIHJldHVybiB1bmljb2RlLCBTcG9vZk91dCdzIGJ1ZiB2YXJpYWJsZSBiZWNvbWVzIGF1dG9tYWdpY2FsbHkKK2NvbnZlcnRlZCB0byB1bmljb2RlLiBUaGlzIG1lYW5zIGFsbCBzdWJzZXF1ZW50IG91dHB1dCBiZWNvbWVzIGNvbnZlcnRlZAordG8gdW5pY29kZSwgYW5kIGlmIHRoZSBvdXRwdXQgY29udGFpbnMgbm9uLWFzY2lpIGNoYXJhY3RlcnMgdGhhdCBmYWlsZWQuCitJdCB1c2VkIHRvIGJlIHRoYXQgdGhpcyBzdGF0ZSBjaGFuZ2UgY2FycmllZCBvbiBiZXR3ZWVuIHRlc3RzLCBtZWFuaW5nCit0ZXN0cyB3b3VsZCBmYWlsIGlmIHVuaWNvZGUgaGFzIGJlZW4gb3V0cHV0IHByZXZpb3VzbHkgaW4gdGhlIHRlc3RydW4uCitUaGlzIHRlc3QgdGVzdHMgdGhhdCB0aGlzIGlzIG5vIGxvbmdlciBzbzoKKworICAgID4+PiBwcmludCB1J2FiYycKKyAgICBhYmMKKworQW5kIHRoZW4gcmV0dXJuIGEgc3RyaW5nIHdpdGggbm9uLWFzY2lpIGNoYXJhY3RlcnM6CisKKyAgICA+Pj4gcHJpbnQgdSdceGU5Jy5lbmNvZGUoJ3V0Zi04JykKKyAgICDDqQorCisgICAgIiIiCisKKworZGVmIHRlc3RfdGVzdHNvdXJjZSgpOiByIiIiCitVbml0IHRlc3RzIGZvciBgdGVzdHNvdXJjZSgpYC4KKworVGhlIHRlc3Rzb3VyY2UoKSBmdW5jdGlvbiB0YWtlcyBhIG1vZHVsZSBhbmQgYSBuYW1lLCBmaW5kcyB0aGUgKGZpcnN0KQordGVzdCB3aXRoIHRoYXQgbmFtZSBpbiB0aGF0IG1vZHVsZSwgYW5kIGNvbnZlcnRzIGl0IHRvIGEgc2NyaXB0LiBUaGUKK2V4YW1wbGUgY29kZSBpcyBjb252ZXJ0ZWQgdG8gcmVndWxhciBQeXRob24gY29kZS4gIFRoZSBzdXJyb3VuZGluZword29yZHMgYW5kIGV4cGVjdGVkIG91dHB1dCBhcmUgY29udmVydGVkIHRvIGNvbW1lbnRzOgorCisgICAgPj4+IGltcG9ydCB0ZXN0LnRlc3RfZG9jdGVzdAorICAgID4+PiBuYW1lID0gJ3Rlc3QudGVzdF9kb2N0ZXN0LnNhbXBsZV9mdW5jJworICAgID4+PiBwcmludCBkb2N0ZXN0LnRlc3Rzb3VyY2UodGVzdC50ZXN0X2RvY3Rlc3QsIG5hbWUpCisgICAgIyBCbGFoIGJsYWgKKyAgICAjCisgICAgcHJpbnQgc2FtcGxlX2Z1bmMoMjIpCisgICAgIyBFeHBlY3RlZDoKKyAgICAjIyA0NAorICAgICMKKyAgICAjIFllZSBoYSEKKyAgICA8QkxBTktMSU5FPgorCisgICAgPj4+IG5hbWUgPSAndGVzdC50ZXN0X2RvY3Rlc3QuU2FtcGxlTmV3U3R5bGVDbGFzcycKKyAgICA+Pj4gcHJpbnQgZG9jdGVzdC50ZXN0c291cmNlKHRlc3QudGVzdF9kb2N0ZXN0LCBuYW1lKQorICAgIHByaW50ICcxXG4yXG4zJworICAgICMgRXhwZWN0ZWQ6CisgICAgIyMgMQorICAgICMjIDIKKyAgICAjIyAzCisgICAgPEJMQU5LTElORT4KKworICAgID4+PiBuYW1lID0gJ3Rlc3QudGVzdF9kb2N0ZXN0LlNhbXBsZUNsYXNzLmFfY2xhc3NtZXRob2QnCisgICAgPj4+IHByaW50IGRvY3Rlc3QudGVzdHNvdXJjZSh0ZXN0LnRlc3RfZG9jdGVzdCwgbmFtZSkKKyAgICBwcmludCBTYW1wbGVDbGFzcy5hX2NsYXNzbWV0aG9kKDEwKQorICAgICMgRXhwZWN0ZWQ6CisgICAgIyMgMTIKKyAgICBwcmludCBTYW1wbGVDbGFzcygwKS5hX2NsYXNzbWV0aG9kKDEwKQorICAgICMgRXhwZWN0ZWQ6CisgICAgIyMgMTIKKyAgICA8QkxBTktMSU5FPgorIiIiCisKK2RlZiB0ZXN0X2RlYnVnKCk6IHIiIiIKKworQ3JlYXRlIGEgZG9jc3RyaW5nIHRoYXQgd2Ugd2FudCB0byBkZWJ1ZzoKKworICAgID4+PiBzID0gJycnCisgICAgLi4uICAgICA+Pj4geCA9IDEyCisgICAgLi4uICAgICA+Pj4gcHJpbnQgeAorICAgIC4uLiAgICAgMTIKKyAgICAuLi4gICAgICcnJworCitDcmVhdGUgc29tZSBmYWtlIHN0ZGluIGlucHV0LCB0byBmZWVkIHRvIHRoZSBkZWJ1Z2dlcjoKKworICAgID4+PiBpbXBvcnQgdGVtcGZpbGUKKyAgICA+Pj4gcmVhbF9zdGRpbiA9IHN5cy5zdGRpbgorICAgID4+PiBzeXMuc3RkaW4gPSBfRmFrZUlucHV0KFsnbmV4dCcsICdwcmludCB4JywgJ2NvbnRpbnVlJ10pCisKK1J1biB0aGUgZGVidWdnZXIgb24gdGhlIGRvY3N0cmluZywgYW5kIHRoZW4gcmVzdG9yZSBzeXMuc3RkaW4uCisKKyAgICA+Pj4gdHJ5OiBkb2N0ZXN0LmRlYnVnX3NyYyhzKQorICAgIC4uLiBmaW5hbGx5OiBzeXMuc3RkaW4gPSByZWFsX3N0ZGluCisgICAgPiA8c3RyaW5nPigxKTxtb2R1bGU+KCkKKyAgICAoUGRiKSBuZXh0CisgICAgMTIKKyAgICAtLVJldHVybi0tCisgICAgPiA8c3RyaW5nPigxKTxtb2R1bGU+KCktPk5vbmUKKyAgICAoUGRiKSBwcmludCB4CisgICAgMTIKKyAgICAoUGRiKSBjb250aW51ZQorCisiIiIKKworZGVmIHRlc3RfcGRiX3NldF90cmFjZSgpOgorICAgICIiIlVzaW5nIHBkYi5zZXRfdHJhY2UgZnJvbSBhIGRvY3Rlc3QuCisKKyAgICBZb3UgY2FuIHVzZSBwZGIuc2V0X3RyYWNlIGZyb20gYSBkb2N0ZXN0LiAgVG8gZG8gc28sIHlvdSBtdXN0CisgICAgcmV0cmlldmUgdGhlIHNldF90cmFjZSBmdW5jdGlvbiBmcm9tIHRoZSBwZGIgbW9kdWxlIGF0IHRoZSB0aW1lCisgICAgeW91IHVzZSBpdC4gIFRoZSBkb2N0ZXN0IG1vZHVsZSBjaGFuZ2VzIHN5cy5zdGRvdXQgc28gdGhhdCBpdCBjYW4KKyAgICBjYXB0dXJlIHByb2dyYW0gb3V0cHV0LiAgSXQgYWxzbyB0ZW1wb3JhcmlseSByZXBsYWNlcyBwZGIuc2V0X3RyYWNlCisgICAgd2l0aCBhIHZlcnNpb24gdGhhdCByZXN0b3JlcyBzdGRvdXQuICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgeW91IHRvCisgICAgc2VlIGRlYnVnZ2VyIG91dHB1dC4KKworICAgICAgPj4+IGRvYyA9ICcnJworICAgICAgLi4uID4+PiB4ID0gNDIKKyAgICAgIC4uLiA+Pj4gcmFpc2UgRXhjZXB0aW9uKCdjbMOpJykKKyAgICAgIC4uLiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4gRXhjZXB0aW9uOiBjbMOpCisgICAgICAuLi4gPj4+IGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQorICAgICAgLi4uICcnJworICAgICAgPj4+IHBhcnNlciA9IGRvY3Rlc3QuRG9jVGVzdFBhcnNlcigpCisgICAgICA+Pj4gdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2MsIHt9LCAiZm9vLWLDpHJAYmF6IiwgImZvby1iw6RyQGJhei5weSIsIDApCisgICAgICA+Pj4gcnVubmVyID0gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpCisKKyAgICBUbyBkZW1vbnN0cmF0ZSB0aGlzLCB3ZSdsbCBjcmVhdGUgYSBmYWtlIHN0YW5kYXJkIGlucHV0IHRoYXQKKyAgICBjYXB0dXJlcyBvdXIgZGVidWdnZXIgaW5wdXQ6CisKKyAgICAgID4+PiBpbXBvcnQgdGVtcGZpbGUKKyAgICAgID4+PiByZWFsX3N0ZGluID0gc3lzLnN0ZGluCisgICAgICA+Pj4gc3lzLnN0ZGluID0gX0Zha2VJbnB1dChbCisgICAgICAuLi4gICAgJ3ByaW50IHgnLCAgIyBwcmludCBkYXRhIGRlZmluZWQgYnkgdGhlIGV4YW1wbGUKKyAgICAgIC4uLiAgICAnY29udGludWUnLCAjIHN0b3AgZGVidWdnaW5nCisgICAgICAuLi4gICAgJyddKQorCisgICAgICA+Pj4gdHJ5OiBydW5uZXIucnVuKHRlc3QpCisgICAgICAuLi4gZmluYWxseTogc3lzLnN0ZGluID0gcmVhbF9zdGRpbgorICAgICAgLS1SZXR1cm4tLQorICAgICAgPiA8ZG9jdGVzdCBmb28tYsOkckBiYXpbMl0+KDEpPG1vZHVsZT4oKS0+Tm9uZQorICAgICAgLT4gaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCisgICAgICAoUGRiKSBwcmludCB4CisgICAgICA0MgorICAgICAgKFBkYikgY29udGludWUKKyAgICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MykKKworICAgICAgWW91IGNhbiBhbHNvIHB1dCBwZGIuc2V0X3RyYWNlIGluIGEgZnVuY3Rpb24gY2FsbGVkIGZyb20gYSB0ZXN0OgorCisgICAgICA+Pj4gZGVmIGNhbGxzX3NldF90cmFjZSgpOgorICAgICAgLi4uICAgIHk9MgorICAgICAgLi4uICAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQorCisgICAgICA+Pj4gZG9jID0gJycnCisgICAgICAuLi4gPj4+IHg9MQorICAgICAgLi4uID4+PiBjYWxsc19zZXRfdHJhY2UoKQorICAgICAgLi4uICcnJworICAgICAgPj4+IHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jLCBnbG9iYWxzKCksICJmb28tYsOkckBiYXoiLCAiZm9vLWLDpHJAYmF6LnB5IiwgMCkKKyAgICAgID4+PiByZWFsX3N0ZGluID0gc3lzLnN0ZGluCisgICAgICA+Pj4gc3lzLnN0ZGluID0gX0Zha2VJbnB1dChbCisgICAgICAuLi4gICAgJ3ByaW50IHknLCAgIyBwcmludCBkYXRhIGRlZmluZWQgaW4gdGhlIGZ1bmN0aW9uCisgICAgICAuLi4gICAgJ3VwJywgICAgICAgIyBvdXQgb2YgZnVuY3Rpb24KKyAgICAgIC4uLiAgICAncHJpbnQgeCcsICAjIHByaW50IGRhdGEgZGVmaW5lZCBieSB0aGUgZXhhbXBsZQorICAgICAgLi4uICAgICdjb250aW51ZScsICMgc3RvcCBkZWJ1Z2dpbmcKKyAgICAgIC4uLiAgICAnJ10pCisKKyAgICAgID4+PiB0cnk6CisgICAgICAuLi4gICAgIHJ1bm5lci5ydW4odGVzdCkKKyAgICAgIC4uLiBmaW5hbGx5OgorICAgICAgLi4uICAgICBzeXMuc3RkaW4gPSByZWFsX3N0ZGluCisgICAgICAtLVJldHVybi0tCisgICAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZVs4XT4oMyljYWxsc19zZXRfdHJhY2UoKS0+Tm9uZQorICAgICAgLT4gaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCisgICAgICAoUGRiKSBwcmludCB5CisgICAgICAyCisgICAgICAoUGRiKSB1cAorICAgICAgPiA8ZG9jdGVzdCBmb28tYsOkckBiYXpbMV0+KDEpPG1vZHVsZT4oKQorICAgICAgLT4gY2FsbHNfc2V0X3RyYWNlKCkKKyAgICAgIChQZGIpIHByaW50IHgKKyAgICAgIDEKKyAgICAgIChQZGIpIGNvbnRpbnVlCisgICAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCisKKyAgICBEdXJpbmcgaW50ZXJhY3RpdmUgZGVidWdnaW5nLCBzb3VyY2UgY29kZSBpcyBzaG93biwgZXZlbiBmb3IKKyAgICBkb2N0ZXN0IGV4YW1wbGVzOgorCisgICAgICA+Pj4gZG9jID0gJycnCisgICAgICAuLi4gPj4+IGRlZiBmKHgpOgorICAgICAgLi4uIC4uLiAgICAgZyh4KjIpCisgICAgICAuLi4gPj4+IGRlZiBnKHgpOgorICAgICAgLi4uIC4uLiAgICAgcHJpbnQgeCszCisgICAgICAuLi4gLi4uICAgICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKKyAgICAgIC4uLiA+Pj4gZigzKQorICAgICAgLi4uICcnJworICAgICAgPj4+IHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jLCBnbG9iYWxzKCksICJmb28tYsOkckBiYXoiLCAiZm9vLWLDpHJAYmF6LnB5IiwgMCkKKyAgICAgID4+PiByZWFsX3N0ZGluID0gc3lzLnN0ZGluCisgICAgICA+Pj4gc3lzLnN0ZGluID0gX0Zha2VJbnB1dChbCisgICAgICAuLi4gICAgJ2xpc3QnLCAgICAgIyBsaXN0IHNvdXJjZSBmcm9tIGV4YW1wbGUgMgorICAgICAgLi4uICAgICduZXh0JywgICAgICMgcmV0dXJuIGZyb20gZygpCisgICAgICAuLi4gICAgJ2xpc3QnLCAgICAgIyBsaXN0IHNvdXJjZSBmcm9tIGV4YW1wbGUgMQorICAgICAgLi4uICAgICduZXh0JywgICAgICMgcmV0dXJuIGZyb20gZigpCisgICAgICAuLi4gICAgJ2xpc3QnLCAgICAgIyBsaXN0IHNvdXJjZSBmcm9tIGV4YW1wbGUgMworICAgICAgLi4uICAgICdjb250aW51ZScsICMgc3RvcCBkZWJ1Z2dpbmcKKyAgICAgIC4uLiAgICAnJ10pCisgICAgICA+Pj4gdHJ5OiBydW5uZXIucnVuKHRlc3QpCisgICAgICAuLi4gZmluYWxseTogc3lzLnN0ZGluID0gcmVhbF9zdGRpbgorICAgICAgLi4uICMgZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFCisgICAgICAtLVJldHVybi0tCisgICAgICA+IDxkb2N0ZXN0IGZvby1iw6RyQGJhelsxXT4oMylnKCktPk5vbmUKKyAgICAgIC0+IGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQorICAgICAgKFBkYikgbGlzdAorICAgICAgICAxICAgICBkZWYgZyh4KToKKyAgICAgICAgMiAgICAgICAgIHByaW50IHgrMworICAgICAgICAzICAtPiAgICAgaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCisgICAgICBbRU9GXQorICAgICAgKFBkYikgbmV4dAorICAgICAgLS1SZXR1cm4tLQorICAgICAgPiA8ZG9jdGVzdCBmb28tYsOkckBiYXpbMF0+KDIpZigpLT5Ob25lCisgICAgICAtPiBnKHgqMikKKyAgICAgIChQZGIpIGxpc3QKKyAgICAgICAgMSAgICAgZGVmIGYoeCk6CisgICAgICAgIDIgIC0+ICAgICBnKHgqMikKKyAgICAgIFtFT0ZdCisgICAgICAoUGRiKSBuZXh0CisgICAgICAtLVJldHVybi0tCisgICAgICA+IDxkb2N0ZXN0IGZvby1iw6RyQGJhelsyXT4oMSk8bW9kdWxlPigpLT5Ob25lCisgICAgICAtPiBmKDMpCisgICAgICAoUGRiKSBsaXN0CisgICAgICAgIDEgIC0+IGYoMykKKyAgICAgIFtFT0ZdCisgICAgICAoUGRiKSBjb250aW51ZQorICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgRmlsZSAiZm9vLWLDpHJAYmF6LnB5IiwgbGluZSA3LCBpbiBmb28tYsOkckBiYXoKKyAgICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICAgIGYoMykKKyAgICAgIEV4cGVjdGVkIG5vdGhpbmcKKyAgICAgIEdvdDoKKyAgICAgICAgICA5CisgICAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTMpCisgICAgICAiIiIKKworZGVmIHRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWQoKToKKyAgICAiIiJUaGlzIGlsbHVzdHJhdGVzIG1vcmUtZGVtYW5kaW5nIHVzZSBvZiBzZXRfdHJhY2Ugd2l0aCBuZXN0ZWQgZnVuY3Rpb25zLgorCisgICAgPj4+IGNsYXNzIEMob2JqZWN0KToKKyAgICAuLi4gICAgIGRlZiBjYWxsc19zZXRfdHJhY2Uoc2VsZik6CisgICAgLi4uICAgICAgICAgeSA9IDEKKyAgICAuLi4gICAgICAgICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKKyAgICAuLi4gICAgICAgICBzZWxmLmYxKCkKKyAgICAuLi4gICAgICAgICB5ID0gMgorICAgIC4uLiAgICAgZGVmIGYxKHNlbGYpOgorICAgIC4uLiAgICAgICAgIHggPSAxCisgICAgLi4uICAgICAgICAgc2VsZi5mMigpCisgICAgLi4uICAgICAgICAgeCA9IDIKKyAgICAuLi4gICAgIGRlZiBmMihzZWxmKToKKyAgICAuLi4gICAgICAgICB6ID0gMQorICAgIC4uLiAgICAgICAgIHogPSAyCisKKyAgICA+Pj4gY2FsbHNfc2V0X3RyYWNlID0gQygpLmNhbGxzX3NldF90cmFjZQorCisgICAgPj4+IGRvYyA9ICcnJworICAgIC4uLiA+Pj4gYSA9IDEKKyAgICAuLi4gPj4+IGNhbGxzX3NldF90cmFjZSgpCisgICAgLi4uICcnJworICAgID4+PiBwYXJzZXIgPSBkb2N0ZXN0LkRvY1Rlc3RQYXJzZXIoKQorICAgID4+PiBydW5uZXIgPSBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkKKyAgICA+Pj4gdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2MsIGdsb2JhbHMoKSwgImZvby1iw6RyQGJheiIsICJmb28tYsOkckBiYXoucHkiLCAwKQorICAgID4+PiByZWFsX3N0ZGluID0gc3lzLnN0ZGluCisgICAgPj4+IHN5cy5zdGRpbiA9IF9GYWtlSW5wdXQoWworICAgIC4uLiAgICAncHJpbnQgeScsICAjIHByaW50IGRhdGEgZGVmaW5lZCBpbiB0aGUgZnVuY3Rpb24KKyAgICAuLi4gICAgJ3N0ZXAnLCAnc3RlcCcsICdzdGVwJywgJ3N0ZXAnLCAnc3RlcCcsICdzdGVwJywgJ3ByaW50IHonLAorICAgIC4uLiAgICAndXAnLCAncHJpbnQgeCcsCisgICAgLi4uICAgICd1cCcsICdwcmludCB5JywKKyAgICAuLi4gICAgJ3VwJywgJ3ByaW50IGZvbycsCisgICAgLi4uICAgICdjb250aW51ZScsICMgc3RvcCBkZWJ1Z2dpbmcKKyAgICAuLi4gICAgJyddKQorCisgICAgPj4+IHRyeToKKyAgICAuLi4gICAgIHJ1bm5lci5ydW4odGVzdCkKKyAgICAuLi4gZmluYWxseToKKyAgICAuLi4gICAgIHN5cy5zdGRpbiA9IHJlYWxfc3RkaW4KKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWRbMF0+KDUpY2FsbHNfc2V0X3RyYWNlKCkKKyAgICAtPiBzZWxmLmYxKCkKKyAgICAoUGRiKSBwcmludCB5CisgICAgMQorICAgIChQZGIpIHN0ZXAKKyAgICAtLUNhbGwtLQorICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X2RvY3Rlc3QudGVzdF9wZGJfc2V0X3RyYWNlX25lc3RlZFswXT4oNylmMSgpCisgICAgLT4gZGVmIGYxKHNlbGYpOgorICAgIChQZGIpIHN0ZXAKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWRbMF0+KDgpZjEoKQorICAgIC0+IHggPSAxCisgICAgKFBkYikgc3RlcAorICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X2RvY3Rlc3QudGVzdF9wZGJfc2V0X3RyYWNlX25lc3RlZFswXT4oOSlmMSgpCisgICAgLT4gc2VsZi5mMigpCisgICAgKFBkYikgc3RlcAorICAgIC0tQ2FsbC0tCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkWzBdPigxMSlmMigpCisgICAgLT4gZGVmIGYyKHNlbGYpOgorICAgIChQZGIpIHN0ZXAKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWRbMF0+KDEyKWYyKCkKKyAgICAtPiB6ID0gMQorICAgIChQZGIpIHN0ZXAKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWRbMF0+KDEzKWYyKCkKKyAgICAtPiB6ID0gMgorICAgIChQZGIpIHByaW50IHoKKyAgICAxCisgICAgKFBkYikgdXAKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWRbMF0+KDkpZjEoKQorICAgIC0+IHNlbGYuZjIoKQorICAgIChQZGIpIHByaW50IHgKKyAgICAxCisgICAgKFBkYikgdXAKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWRbMF0+KDUpY2FsbHNfc2V0X3RyYWNlKCkKKyAgICAtPiBzZWxmLmYxKCkKKyAgICAoUGRiKSBwcmludCB5CisgICAgMQorICAgIChQZGIpIHVwCisgICAgPiA8ZG9jdGVzdCBmb28tYsOkckBiYXpbMV0+KDEpPG1vZHVsZT4oKQorICAgIC0+IGNhbGxzX3NldF90cmFjZSgpCisgICAgKFBkYikgcHJpbnQgZm9vCisgICAgKioqIE5hbWVFcnJvcjogbmFtZSAnZm9vJyBpcyBub3QgZGVmaW5lZAorICAgIChQZGIpIGNvbnRpbnVlCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQorIiIiCisKK2RlZiB0ZXN0X0RvY1Rlc3RTdWl0ZSgpOgorICAgICIiIkRvY1Rlc3RTdWl0ZSBjcmVhdGVzIGEgdW5pdHRlc3QgdGVzdCBzdWl0ZSBmcm9tIGEgZG9jdGVzdC4KKworICAgICAgIFdlIGNyZWF0ZSBhIFN1aXRlIGJ5IHByb3ZpZGluZyBhIG1vZHVsZS4gIEEgbW9kdWxlIGNhbiBiZSBwcm92aWRlZAorICAgICAgIGJ5IHBhc3NpbmcgYSBtb2R1bGUgb2JqZWN0OgorCisgICAgICAgICA+Pj4gaW1wb3J0IHVuaXR0ZXN0CisgICAgICAgICA+Pj4gaW1wb3J0IHRlc3Quc2FtcGxlX2RvY3Rlc3QKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKHRlc3Quc2FtcGxlX2RvY3Rlc3QpCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49OSBlcnJvcnM9MCBmYWlsdXJlcz00PgorCisgICAgICAgV2UgY2FuIGFsc28gc3VwcGx5IHRoZSBtb2R1bGUgYnkgbmFtZToKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoJ3Rlc3Quc2FtcGxlX2RvY3Rlc3QnKQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTkgZXJyb3JzPTAgZmFpbHVyZXM9ND4KKworICAgICAgIFRoZSBtb2R1bGUgbmVlZCBub3QgY29udGFpbiBhbnkgZG9jdGVzdCBleGFtcGxlczoKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoJ3Rlc3Quc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMnKQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTAgZXJyb3JzPTAgZmFpbHVyZXM9MD4KKworICAgICAgIEhvd2V2ZXIsIGlmIERvY1Rlc3RTdWl0ZSBmaW5kcyBubyBkb2NzdHJpbmdzLCBpdCByYWlzZXMgYW4gZXJyb3I6CisKKyAgICAgICAgID4+PiB0cnk6CisgICAgICAgICAuLi4gICAgIGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0X25vX2RvY3N0cmluZ3MnKQorICAgICAgICAgLi4uIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CisgICAgICAgICAuLi4gICAgIGVycm9yID0gZQorCisgICAgICAgICA+Pj4gcHJpbnQoZXJyb3IuYXJnc1sxXSkKKyAgICAgICAgIGhhcyBubyBkb2NzdHJpbmdzCisKKyAgICAgICBZb3UgY2FuIHByZXZlbnQgdGhpcyBlcnJvciBieSBwYXNzaW5nIGEgRG9jVGVzdEZpbmRlciBpbnN0YW5jZSB3aXRoCisgICAgICAgdGhlIGBleGNsdWRlX2VtcHR5YCBrZXl3b3JkIGFyZ3VtZW50IHNldCB0byBGYWxzZToKKworICAgICAgICAgPj4+IGZpbmRlciA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcihleGNsdWRlX2VtcHR5PUZhbHNlKQorICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoJ3Rlc3Quc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jc3RyaW5ncycsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2ZpbmRlcj1maW5kZXIpCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MCBlcnJvcnM9MCBmYWlsdXJlcz0wPgorCisgICAgICAgV2UgY2FuIHVzZSB0aGUgY3VycmVudCBtb2R1bGU6CisKKyAgICAgICAgID4+PiBzdWl0ZSA9IHRlc3Quc2FtcGxlX2RvY3Rlc3QudGVzdF9zdWl0ZSgpCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49OSBlcnJvcnM9MCBmYWlsdXJlcz00PgorCisgICAgICAgV2UgY2FuIHN1cHBseSBnbG9iYWwgdmFyaWFibGVzLiAgSWYgd2UgcGFzcyBnbG9icywgdGhleSB3aWxsIGJlCisgICAgICAgdXNlZCBpbnN0ZWFkIG9mIHRoZSBtb2R1bGUgZ2xvYmFscy4gIEhlcmUgd2UnbGwgcGFzcyBhbiBlbXB0eQorICAgICAgIGdsb2JhbHMsIHRyaWdnZXJpbmcgYW4gZXh0cmEgZXJyb3I6CisKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0JywgZ2xvYnM9e30pCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49OSBlcnJvcnM9MCBmYWlsdXJlcz01PgorCisgICAgICAgQWx0ZXJuYXRpdmVseSwgd2UgY2FuIHByb3ZpZGUgZXh0cmEgZ2xvYmFscy4gIEhlcmUgd2UnbGwgbWFrZSBhbgorICAgICAgIGVycm9yIGdvIGF3YXkgYnkgcHJvdmlkaW5nIGFuIGV4dHJhIGdsb2JhbCB2YXJpYWJsZToKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoJ3Rlc3Quc2FtcGxlX2RvY3Rlc3QnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFnbG9icz17J3knOiAxfSkKKyAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj05IGVycm9ycz0wIGZhaWx1cmVzPTM+CisKKyAgICAgICBZb3UgY2FuIHBhc3Mgb3B0aW9uIGZsYWdzLiAgSGVyZSB3ZSdsbCBjYXVzZSBhbiBleHRyYSBlcnJvcgorICAgICAgIGJ5IGRpc2FibGluZyB0aGUgYmxhbmstbGluZSBmZWF0dXJlOgorCisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZSgndGVzdC5zYW1wbGVfZG9jdGVzdCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgb3B0aW9uZmxhZ3M9ZG9jdGVzdC5ET05UX0FDQ0VQVF9CTEFOS0xJTkUpCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49OSBlcnJvcnM9MCBmYWlsdXJlcz01PgorCisgICAgICAgWW91IGNhbiBzdXBwbHkgc2V0VXAgYW5kIHRlYXJEb3duIGZ1bmN0aW9uczoKKworICAgICAgICAgPj4+IGRlZiBzZXRVcCh0KToKKyAgICAgICAgIC4uLiAgICAgaW1wb3J0IHRlc3QudGVzdF9kb2N0ZXN0CisgICAgICAgICAuLi4gICAgIHRlc3QudGVzdF9kb2N0ZXN0LnNpbGx5U2V0dXAgPSBUcnVlCisKKyAgICAgICAgID4+PiBkZWYgdGVhckRvd24odCk6CisgICAgICAgICAuLi4gICAgIGltcG9ydCB0ZXN0LnRlc3RfZG9jdGVzdAorICAgICAgICAgLi4uICAgICBkZWwgdGVzdC50ZXN0X2RvY3Rlc3Quc2lsbHlTZXR1cAorCisgICAgICAgSGVyZSwgd2UgaW5zdGFsbGVkIGEgc2lsbHkgdmFyaWFibGUgdGhhdCB0aGUgdGVzdCBleHBlY3RzOgorCisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZSgndGVzdC5zYW1wbGVfZG9jdGVzdCcsCisgICAgICAgICAuLi4gICAgICBzZXRVcD1zZXRVcCwgdGVhckRvd249dGVhckRvd24pCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49OSBlcnJvcnM9MCBmYWlsdXJlcz0zPgorCisgICAgICAgQnV0IHRoZSB0ZWFyRG93biByZXN0b3JlcyBzYW5pdHk6CisKKyAgICAgICAgID4+PiBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKKyAgICAgICAgID4+PiB0ZXN0LnRlc3RfZG9jdGVzdC5zaWxseVNldHVwCisgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgICAuLi4KKyAgICAgICAgIEF0dHJpYnV0ZUVycm9yOiAnbW9kdWxlJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc2lsbHlTZXR1cCcKKworICAgICAgIFRoZSBzZXRVcCBhbmQgdGVhckRvd24gZnVudGlvbnMgYXJlIHBhc3NlZCB0ZXN0IG9iamVjdHMuIEhlcmUKKyAgICAgICB3ZSdsbCB1c2UgdGhlIHNldFVwIGZ1bmN0aW9uIHRvIHN1cHBseSB0aGUgbWlzc2luZyB2YXJpYWJsZSB5OgorCisgICAgICAgICA+Pj4gZGVmIHNldFVwKHRlc3QpOgorICAgICAgICAgLi4uICAgICB0ZXN0Lmdsb2JzWyd5J10gPSAxCisKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0Jywgc2V0VXA9c2V0VXApCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49OSBlcnJvcnM9MCBmYWlsdXJlcz0zPgorCisgICAgICAgSGVyZSwgd2UgZGlkbid0IG5lZWQgdG8gdXNlIGEgdGVhckRvd24gZnVuY3Rpb24gYmVjYXVzZSB3ZQorICAgICAgIG1vZGlmaWVkIHRoZSB0ZXN0IGdsb2JhbHMsIHdoaWNoIGFyZSBhIGNvcHkgb2YgdGhlCisgICAgICAgc2FtcGxlX2RvY3Rlc3QgbW9kdWxlIGRpY3Rpb25hcnkuICBUaGUgdGVzdCBnbG9iYWxzIGFyZQorICAgICAgIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBmb3IgdXMgYWZ0ZXIgYSB0ZXN0LgorICAgICAgICIiIgorCitkZWYgdGVzdF9Eb2NGaWxlU3VpdGUoKToKKyAgICAiIiJXZSBjYW4gdGVzdCB0ZXN0cyBmb3VuZCBpbiB0ZXh0IGZpbGVzIHVzaW5nIGEgRG9jRmlsZVN1aXRlLgorCisgICAgICAgV2UgY3JlYXRlIGEgc3VpdGUgYnkgcHJvdmlkaW5nIHRoZSBuYW1lcyBvZiBvbmUgb3IgbW9yZSB0ZXh0CisgICAgICAgZmlsZXMgdGhhdCBpbmNsdWRlIGV4YW1wbGVzOgorCisgICAgICAgICA+Pj4gaW1wb3J0IHVuaXR0ZXN0CisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdF9kb2N0ZXN0Mi50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDQudHh0JykKKyAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0zIGVycm9ycz0wIGZhaWx1cmVzPTM+CisKKyAgICAgICBUaGUgdGVzdCBmaWxlcyBhcmUgbG9va2VkIGZvciBpbiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlCisgICAgICAgY2FsbGluZyBtb2R1bGUuICBBIHBhY2thZ2Uga2V5d29yZCBhcmd1bWVudCBjYW4gYmUgcHJvdmlkZWQgdG8KKyAgICAgICBzcGVjaWZ5IGEgZGlmZmVyZW50IHJlbGF0aXZlIGxvY2F0aW9uLgorCisgICAgICAgICA+Pj4gaW1wb3J0IHVuaXR0ZXN0CisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdF9kb2N0ZXN0Mi50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDQudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2U9J3Rlc3QnKQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTMgZXJyb3JzPTAgZmFpbHVyZXM9Mz4KKworICAgICAgIFN1cHBvcnQgZm9yIHVzaW5nIGEgcGFja2FnZSdzIF9fbG9hZGVyX18uZ2V0X2RhdGEoKSBpcyBhbHNvCisgICAgICAgcHJvdmlkZWQuCisKKyAgICAgICAgID4+PiBpbXBvcnQgdW5pdHRlc3QsIHBrZ3V0aWwsIHRlc3QKKyAgICAgICAgID4+PiBhZGRlZF9sb2FkZXIgPSBGYWxzZQorICAgICAgICAgPj4+IGlmIG5vdCBoYXNhdHRyKHRlc3QsICdfX2xvYWRlcl9fJyk6CisgICAgICAgICAuLi4gICAgIHRlc3QuX19sb2FkZXJfXyA9IHBrZ3V0aWwuZ2V0X2xvYWRlcih0ZXN0KQorICAgICAgICAgLi4uICAgICBhZGRlZF9sb2FkZXIgPSBUcnVlCisgICAgICAgICA+Pj4gdHJ5OgorICAgICAgICAgLi4uICAgICBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKCd0ZXN0X2RvY3Rlc3QudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdF9kb2N0ZXN0Mi50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3Q0LnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZT0ndGVzdCcpCisgICAgICAgICAuLi4gICAgIHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICAuLi4gZmluYWxseToKKyAgICAgICAgIC4uLiAgICAgaWYgYWRkZWRfbG9hZGVyOgorICAgICAgICAgLi4uICAgICAgICAgZGVsIHRlc3QuX19sb2FkZXJfXworICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0zIGVycm9ycz0wIGZhaWx1cmVzPTM+CisKKyAgICAgICAnLycgc2hvdWxkIGJlIHVzZWQgYXMgYSBwYXRoIHNlcGFyYXRvci4gIEl0IHdpbGwgYmUgY29udmVydGVkCisgICAgICAgdG8gYSBuYXRpdmUgc2VwYXJhdG9yIGF0IHJ1biB0aW1lOgorCisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgnLi4vdGVzdC90ZXN0X2RvY3Rlc3QudHh0JykKKyAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0xIGVycm9ycz0wIGZhaWx1cmVzPTE+CisKKyAgICAgICBJZiBEb2NGaWxlU3VpdGUgaXMgdXNlZCBmcm9tIGFuIGludGVyYWN0aXZlIHNlc3Npb24sIHRoZW4gZmlsZXMKKyAgICAgICBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBvZiBzeXMuYXJndlswXToKKworICAgICAgICAgPj4+IGltcG9ydCB0eXBlcywgb3MucGF0aCwgdGVzdC50ZXN0X2RvY3Rlc3QKKyAgICAgICAgID4+PiBzYXZlX2FyZ3YgPSBzeXMuYXJndgorICAgICAgICAgPj4+IHN5cy5hcmd2ID0gW3Rlc3QudGVzdF9kb2N0ZXN0Ll9fZmlsZV9fXQorICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJ3Rlc3RfZG9jdGVzdC50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZT10eXBlcy5Nb2R1bGVUeXBlKCdfX21haW5fXycpKQorICAgICAgICAgPj4+IHN5cy5hcmd2ID0gc2F2ZV9hcmd2CisKKyAgICAgICBCeSBzZXR0aW5nIGBtb2R1bGVfcmVsYXRpdmU9RmFsc2VgLCBvcy1zcGVjaWZpYyBwYXRocyBtYXkgYmUKKyAgICAgICB1c2VkIChpbmNsdWRpbmcgYWJzb2x1dGUgcGF0aHMgYW5kIHBhdGhzIHJlbGF0aXZlIHRvIHRoZQorICAgICAgIHdvcmtpbmcgZGlyZWN0b3J5KToKKworICAgICAgICAgPj4+ICMgR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSB0ZXN0IHBhY2thZ2UuCisgICAgICAgICA+Pj4gdGVzdF9kb2N0ZXN0X3BhdGggPSBvcy5wYXRoLmFic3BhdGgodGVzdC50ZXN0X2RvY3Rlc3QuX19maWxlX18pCisgICAgICAgICA+Pj4gdGVzdF9wa2dfcGF0aCA9IG9zLnBhdGguc3BsaXQodGVzdF9kb2N0ZXN0X3BhdGgpWzBdCisKKyAgICAgICAgID4+PiAjIFVzZSBpdCB0byBmaW5kIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRlc3RfZG9jdGVzdC50eHQuCisgICAgICAgICA+Pj4gdGVzdF9maWxlID0gb3MucGF0aC5qb2luKHRlc3RfcGtnX3BhdGgsICd0ZXN0X2RvY3Rlc3QudHh0JykKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUodGVzdF9maWxlLCBtb2R1bGVfcmVsYXRpdmU9RmFsc2UpCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MSBlcnJvcnM9MCBmYWlsdXJlcz0xPgorCisgICAgICAgSXQgaXMgYW4gZXJyb3IgdG8gc3BlY2lmeSBgcGFja2FnZWAgd2hlbiBgbW9kdWxlX3JlbGF0aXZlPUZhbHNlYDoKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUodGVzdF9maWxlLCBtb2R1bGVfcmVsYXRpdmU9RmFsc2UsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlPSd0ZXN0JykKKyAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgIFZhbHVlRXJyb3I6IFBhY2thZ2UgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBtb2R1bGUtcmVsYXRpdmUgcGF0aHMuCisKKyAgICAgICBZb3UgY2FuIHNwZWNpZnkgaW5pdGlhbCBnbG9iYWwgdmFyaWFibGVzOgorCisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdF9kb2N0ZXN0Mi50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDQudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JzPXsnZmF2b3JpdGVfY29sb3InOiAnYmx1ZSd9KQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTMgZXJyb3JzPTAgZmFpbHVyZXM9Mj4KKworICAgICAgIEluIHRoaXMgY2FzZSwgd2Ugc3VwcGxpZWQgYSBtaXNzaW5nIGZhdm9yaXRlIGNvbG9yLiBZb3UgY2FuCisgICAgICAgcHJvdmlkZSBkb2N0ZXN0IG9wdGlvbnM6CisKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKCd0ZXN0X2RvY3Rlc3QudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3QyLnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdF9kb2N0ZXN0NC50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmZsYWdzPWRvY3Rlc3QuRE9OVF9BQ0NFUFRfQkxBTktMSU5FLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYnM9eydmYXZvcml0ZV9jb2xvcic6ICdibHVlJ30pCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MyBlcnJvcnM9MCBmYWlsdXJlcz0zPgorCisgICAgICAgQW5kLCB5b3UgY2FuIHByb3ZpZGUgc2V0VXAgYW5kIHRlYXJEb3duIGZ1bmN0aW9uczoKKworICAgICAgICAgPj4+IGRlZiBzZXRVcCh0KToKKyAgICAgICAgIC4uLiAgICAgaW1wb3J0IHRlc3QudGVzdF9kb2N0ZXN0CisgICAgICAgICAuLi4gICAgIHRlc3QudGVzdF9kb2N0ZXN0LnNpbGx5U2V0dXAgPSBUcnVlCisKKyAgICAgICAgID4+PiBkZWYgdGVhckRvd24odCk6CisgICAgICAgICAuLi4gICAgIGltcG9ydCB0ZXN0LnRlc3RfZG9jdGVzdAorICAgICAgICAgLi4uICAgICBkZWwgdGVzdC50ZXN0X2RvY3Rlc3Quc2lsbHlTZXR1cAorCisgICAgICAgSGVyZSwgd2UgaW5zdGFsbGVkIGEgc2lsbHkgdmFyaWFibGUgdGhhdCB0aGUgdGVzdCBleHBlY3RzOgorCisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdF9kb2N0ZXN0Mi50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDQudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFVwPXNldFVwLCB0ZWFyRG93bj10ZWFyRG93bikKKyAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0zIGVycm9ycz0wIGZhaWx1cmVzPTI+CisKKyAgICAgICBCdXQgdGhlIHRlYXJEb3duIHJlc3RvcmVzIHNhbml0eToKKworICAgICAgICAgPj4+IGltcG9ydCB0ZXN0LnRlc3RfZG9jdGVzdAorICAgICAgICAgPj4+IHRlc3QudGVzdF9kb2N0ZXN0LnNpbGx5U2V0dXAKKyAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgIC4uLgorICAgICAgICAgQXR0cmlidXRlRXJyb3I6ICdtb2R1bGUnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzaWxseVNldHVwJworCisgICAgICAgVGhlIHNldFVwIGFuZCB0ZWFyRG93biBmdW50aW9ucyBhcmUgcGFzc2VkIHRlc3Qgb2JqZWN0cy4KKyAgICAgICBIZXJlLCB3ZSdsbCB1c2UgYSBzZXRVcCBmdW5jdGlvbiB0byBzZXQgdGhlIGZhdm9yaXRlIGNvbG9yIGluCisgICAgICAgdGVzdF9kb2N0ZXN0LnR4dDoKKworICAgICAgICAgPj4+IGRlZiBzZXRVcCh0ZXN0KToKKyAgICAgICAgIC4uLiAgICAgdGVzdC5nbG9ic1snZmF2b3JpdGVfY29sb3InXSA9ICdibHVlJworCisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsIHNldFVwPXNldFVwKQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTEgZXJyb3JzPTAgZmFpbHVyZXM9MD4KKworICAgICAgIEhlcmUsIHdlIGRpZG4ndCBuZWVkIHRvIHVzZSBhIHRlYXJEb3duIGZ1bmN0aW9uIGJlY2F1c2Ugd2UKKyAgICAgICBtb2RpZmllZCB0aGUgdGVzdCBnbG9iYWxzLiAgVGhlIHRlc3QgZ2xvYmFscyBhcmUKKyAgICAgICBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgZm9yIHVzIGFmdGVyIGEgdGVzdC4KKworICAgICAgIFRlc3RzIGluIGEgZmlsZSBydW4gdXNpbmcgYERvY0ZpbGVTdWl0ZWAgY2FuIGFsc28gYWNjZXNzIHRoZQorICAgICAgIGBfX2ZpbGVfX2AgZ2xvYmFsLCB3aGljaCBpcyBzZXQgdG8gdGhlIG5hbWUgb2YgdGhlIGZpbGUKKyAgICAgICBjb250YWluaW5nIHRoZSB0ZXN0czoKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJ3Rlc3RfZG9jdGVzdDMudHh0JykKKyAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0xIGVycm9ycz0wIGZhaWx1cmVzPTA+CisKKyAgICAgICBJZiB0aGUgdGVzdHMgY29udGFpbiBub24tQVNDSUkgY2hhcmFjdGVycywgd2UgaGF2ZSB0byBzcGVjaWZ5IHdoaWNoCisgICAgICAgZW5jb2RpbmcgdGhlIGZpbGUgaXMgZW5jb2RlZCB3aXRoLiBXZSBkbyBzbyBieSB1c2luZyB0aGUgYGVuY29kaW5nYAorICAgICAgIHBhcmFtZXRlcjoKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJ3Rlc3RfZG9jdGVzdC50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDIudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3Q0LnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz0ndXRmLTgnKQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTMgZXJyb3JzPTAgZmFpbHVyZXM9Mj4KKworICAgICAgICIiIgorCitkZWYgdGVzdF90cmFpbGluZ19zcGFjZV9pbl90ZXN0KCk6CisgICAgIiIiCisgICAgVHJhaWxpbmcgc3BhY2VzIGluIGV4cGVjdGVkIG91dHB1dCBhcmUgc2lnbmlmaWNhbnQ6CisKKyAgICAgID4+PiB4LCB5ID0gJ2ZvbycsICcnCisgICAgICA+Pj4gcHJpbnQgeCwgeQorICAgICAgZm9vIFxuCisgICAgIiIiCisKKworZGVmIHRlc3RfdW5pdHRlc3RfcmVwb3J0ZmxhZ3MoKToKKyAgICAiIiJEZWZhdWx0IHVuaXR0ZXN0IHJlcG9ydGluZyBmbGFncyBjYW4gYmUgc2V0IHRvIGNvbnRyb2wgcmVwb3J0aW5nCisKKyAgICBIZXJlLCB3ZSdsbCBzZXQgdGhlIFJFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUgb3B0aW9uIHNvIHdlIHNlZQorICAgIG9ubHkgdGhlIGZpcnN0IGZhaWx1cmUgb2YgZWFjaCB0ZXN0LiAgRmlyc3QsIHdlJ2xsIGxvb2sgYXQgdGhlCisgICAgb3V0cHV0IHdpdGhvdXQgdGhlIGZsYWcuICBUaGUgZmlsZSB0ZXN0X2RvY3Rlc3QudHh0IGZpbGUgaGFzIHR3bworICAgIHRlc3RzLiBUaGV5IGJvdGggZmFpbCBpZiBibGFuayBsaW5lcyBhcmUgZGlzYWJsZWQ6CisKKyAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKCd0ZXN0X2RvY3Rlc3QudHh0JywKKyAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uZmxhZ3M9ZG9jdGVzdC5ET05UX0FDQ0VQVF9CTEFOS0xJTkUpCisgICAgICA+Pj4gaW1wb3J0IHVuaXR0ZXN0CisgICAgICA+Pj4gcmVzdWx0ID0gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgID4+PiBwcmludCByZXN1bHQuZmFpbHVyZXNbMF1bMV0gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAgIFRyYWNlYmFjayAuLi4KKyAgICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICAgIGZhdm9yaXRlX2NvbG9yCisgICAgICAuLi4KKyAgICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICAgIGlmIDE6CisgICAgICAuLi4KKworICAgIE5vdGUgdGhhdCB3ZSBzZWUgYm90aCBmYWlsdXJlcyBkaXNwbGF5ZWQuCisKKyAgICAgID4+PiBvbGQgPSBkb2N0ZXN0LnNldF91bml0dGVzdF9yZXBvcnRmbGFncygKKyAgICAgIC4uLiAgICBkb2N0ZXN0LlJFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUpCisKKyAgICBOb3csIHdoZW4gd2UgcnVuIHRoZSB0ZXN0OgorCisgICAgICA+Pj4gcmVzdWx0ID0gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgID4+PiBwcmludCByZXN1bHQuZmFpbHVyZXNbMF1bMV0gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAgIFRyYWNlYmFjayAuLi4KKyAgICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICAgIGZhdm9yaXRlX2NvbG9yCisgICAgICBFeGNlcHRpb24gcmFpc2VkOgorICAgICAgICAgIC4uLgorICAgICAgICAgIE5hbWVFcnJvcjogbmFtZSAnZmF2b3JpdGVfY29sb3InIGlzIG5vdCBkZWZpbmVkCisgICAgICA8QkxBTktMSU5FPgorICAgICAgPEJMQU5LTElORT4KKworICAgIFdlIGdldCBvbmx5IHRoZSBmaXJzdCBmYWlsdXJlLgorCisgICAgSWYgd2UgZ2l2ZSBhbnkgcmVwb3J0aW5nIG9wdGlvbnMgd2hlbiB3ZSBzZXQgdXAgdGhlIHRlc3RzLAorICAgIGhvd2V2ZXI6CisKKyAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKCd0ZXN0X2RvY3Rlc3QudHh0JywKKyAgICAgIC4uLiAgICAgb3B0aW9uZmxhZ3M9ZG9jdGVzdC5ET05UX0FDQ0VQVF9CTEFOS0xJTkUgfCBkb2N0ZXN0LlJFUE9SVF9ORElGRikKKworICAgIFRoZW4gdGhlIGRlZmF1bHQgZXBvcnRpbmcgb3B0aW9ucyBhcmUgaWdub3JlZDoKKworICAgICAgPj4+IHJlc3VsdCA9IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICA+Pj4gcHJpbnQgcmVzdWx0LmZhaWx1cmVzWzBdWzFdICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgICBUcmFjZWJhY2sgLi4uCisgICAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgICBmYXZvcml0ZV9jb2xvcgorICAgICAgLi4uCisgICAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgICBpZiAxOgorICAgICAgICAgICAgIHByaW50ICdhJworICAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICAgcHJpbnQgJ2InCisgICAgICBEaWZmZXJlbmNlcyAobmRpZmYgd2l0aCAtZXhwZWN0ZWQgK2FjdHVhbCk6CisgICAgICAgICAgICBhCisgICAgICAgICAgLSA8QkxBTktMSU5FPgorICAgICAgICAgICsKKyAgICAgICAgICAgIGIKKyAgICAgIDxCTEFOS0xJTkU+CisgICAgICA8QkxBTktMSU5FPgorCisKKyAgICBUZXN0IHJ1bm5lcnMgY2FuIHJlc3RvcmUgdGhlIGZvcm1hdHRpbmcgZmxhZ3MgYWZ0ZXIgdGhleSBydW46CisKKyAgICAgID4+PiBpZ25vcmVkID0gZG9jdGVzdC5zZXRfdW5pdHRlc3RfcmVwb3J0ZmxhZ3Mob2xkKQorCisgICAgIiIiCisKK2RlZiB0ZXN0X3Rlc3RmaWxlKCk6IHIiIiIKK1Rlc3RzIGZvciB0aGUgYHRlc3RmaWxlKClgIGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbiBydW5zIGFsbCB0aGUKK2RvY3Rlc3QgZXhhbXBsZXMgaW4gYSBnaXZlbiBmaWxlLiAgSW4gaXRzIHNpbXBsZSBpbnZva2F0aW9uLCBpdCBpcworY2FsbGVkIHdpdGggdGhlIG5hbWUgb2YgYSBmaWxlLCB3aGljaCBpcyB0YWtlbiB0byBiZSByZWxhdGl2ZSB0byB0aGUKK2NhbGxpbmcgbW9kdWxlLiAgVGhlIHJldHVybiB2YWx1ZSBpcyAoI2ZhaWx1cmVzLCAjdGVzdHMpLgorCitXZSBkb24ndCB3YW50IGAtdmAgaW4gc3lzLmFyZ3YgZm9yIHRoZXNlIHRlc3RzLgorCisgICAgPj4+IHNhdmVfYXJndiA9IHN5cy5hcmd2CisgICAgPj4+IGlmICctdicgaW4gc3lzLmFyZ3Y6CisgICAgLi4uICAgICBzeXMuYXJndiA9IFthcmcgZm9yIGFyZyBpbiBzYXZlX2FyZ3YgaWYgYXJnICE9ICctdiddCisKKworICAgID4+PiBkb2N0ZXN0LnRlc3RmaWxlKCd0ZXN0X2RvY3Rlc3QudHh0JykgIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAiLi4uIiwgbGluZSA2LCBpbiB0ZXN0X2RvY3Rlc3QudHh0CisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIGZhdm9yaXRlX2NvbG9yCisgICAgRXhjZXB0aW9uIHJhaXNlZDoKKyAgICAgICAgLi4uCisgICAgICAgIE5hbWVFcnJvcjogbmFtZSAnZmF2b3JpdGVfY29sb3InIGlzIG5vdCBkZWZpbmVkCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDEgaXRlbXMgaGFkIGZhaWx1cmVzOgorICAgICAgIDEgb2YgICAyIGluIHRlc3RfZG9jdGVzdC50eHQKKyAgICAqKipUZXN0IEZhaWxlZCoqKiAxIGZhaWx1cmVzLgorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MikKKyAgICA+Pj4gZG9jdGVzdC5tYXN0ZXIgPSBOb25lICAjIFJlc2V0IG1hc3Rlci4KKworKE5vdGU6IHdlJ2xsIGJlIGNsZWFyaW5nIGRvY3Rlc3QubWFzdGVyIGFmdGVyIGVhY2ggY2FsbCB0bworYGRvY3Rlc3QudGVzdGZpbGVgLCB0byBzdXBwcmVzcyB3YXJuaW5ncyBhYm91dCBtdWx0aXBsZSB0ZXN0cyB3aXRoIHRoZQorc2FtZSBuYW1lLikKKworR2xvYmFscyBtYXkgYmUgc3BlY2lmaWVkIHdpdGggdGhlIGBnbG9ic2AgYW5kIGBleHRyYWdsb2JzYCBwYXJhbWV0ZXJzOgorCisgICAgPj4+IGdsb2JzID0geydmYXZvcml0ZV9jb2xvcic6ICdibHVlJ30KKyAgICA+Pj4gZG9jdGVzdC50ZXN0ZmlsZSgndGVzdF9kb2N0ZXN0LnR4dCcsIGdsb2JzPWdsb2JzKQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKKyAgICA+Pj4gZG9jdGVzdC5tYXN0ZXIgPSBOb25lICAjIFJlc2V0IG1hc3Rlci4KKworICAgID4+PiBleHRyYWdsb2JzID0geydmYXZvcml0ZV9jb2xvcic6ICdyZWQnfQorICAgID4+PiBkb2N0ZXN0LnRlc3RmaWxlKCd0ZXN0X2RvY3Rlc3QudHh0JywgZ2xvYnM9Z2xvYnMsCisgICAgLi4uICAgICAgICAgICAgICAgICAgZXh0cmFnbG9icz1leHRyYWdsb2JzKSAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlICIuLi4iLCBsaW5lIDYsIGluIHRlc3RfZG9jdGVzdC50eHQKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgZmF2b3JpdGVfY29sb3IKKyAgICBFeHBlY3RlZDoKKyAgICAgICAgJ2JsdWUnCisgICAgR290OgorICAgICAgICAncmVkJworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAxIGl0ZW1zIGhhZCBmYWlsdXJlczoKKyAgICAgICAxIG9mICAgMiBpbiB0ZXN0X2RvY3Rlc3QudHh0CisgICAgKioqVGVzdCBGYWlsZWQqKiogMSBmYWlsdXJlcy4KKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCisgICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCisKK1RoZSBmaWxlIG1heSBiZSBtYWRlIHJlbGF0aXZlIHRvIGEgZ2l2ZW4gbW9kdWxlIG9yIHBhY2thZ2UsIHVzaW5nIHRoZQorb3B0aW9uYWwgYG1vZHVsZV9yZWxhdGl2ZWAgcGFyYW1ldGVyOgorCisgICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdC50eHQnLCBnbG9icz1nbG9icywKKyAgICAuLi4gICAgICAgICAgICAgICAgICBtb2R1bGVfcmVsYXRpdmU9J3Rlc3QnKQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKKyAgICA+Pj4gZG9jdGVzdC5tYXN0ZXIgPSBOb25lICAjIFJlc2V0IG1hc3Rlci4KKworVmVyYm9zaXR5IGNhbiBiZSBpbmNyZWFzZWQgd2l0aCB0aGUgb3B0aW9uYWwgYHZlcmJvc2VgIHBhcmFtZXRlcjoKKworICAgID4+PiBkb2N0ZXN0LnRlc3RmaWxlKCd0ZXN0X2RvY3Rlc3QudHh0JywgZ2xvYnM9Z2xvYnMsIHZlcmJvc2U9VHJ1ZSkKKyAgICBUcnlpbmc6CisgICAgICAgIGZhdm9yaXRlX2NvbG9yCisgICAgRXhwZWN0aW5nOgorICAgICAgICAnYmx1ZScKKyAgICBvaworICAgIFRyeWluZzoKKyAgICAgICAgaWYgMToKKyAgICAgICAgICAgcHJpbnQgJ2EnCisgICAgICAgICAgIHByaW50CisgICAgICAgICAgIHByaW50ICdiJworICAgIEV4cGVjdGluZzoKKyAgICAgICAgYQorICAgICAgICA8QkxBTktMSU5FPgorICAgICAgICBiCisgICAgb2sKKyAgICAxIGl0ZW1zIHBhc3NlZCBhbGwgdGVzdHM6CisgICAgICAgMiB0ZXN0cyBpbiB0ZXN0X2RvY3Rlc3QudHh0CisgICAgMiB0ZXN0cyBpbiAxIGl0ZW1zLgorICAgIDIgcGFzc2VkIGFuZCAwIGZhaWxlZC4KKyAgICBUZXN0IHBhc3NlZC4KKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCisgICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCisKK1RoZSBuYW1lIG9mIHRoZSB0ZXN0IG1heSBiZSBzcGVjaWZpZWQgd2l0aCB0aGUgb3B0aW9uYWwgYG5hbWVgCitwYXJhbWV0ZXI6CisKKyAgICA+Pj4gZG9jdGVzdC50ZXN0ZmlsZSgndGVzdF9kb2N0ZXN0LnR4dCcsIG5hbWU9J25ld25hbWUnKQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlICIuLi4iLCBsaW5lIDYsIGluIG5ld25hbWUKKyAgICAuLi4KKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCisgICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCisKK1RoZSBzdW1tYXJ5IHJlcG9ydCBtYXkgYmUgc3VwcHJlc3NlZCB3aXRoIHRoZSBvcHRpb25hbCBgcmVwb3J0YAorcGFyYW1ldGVyOgorCisgICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdC50eHQnLCByZXBvcnQ9RmFsc2UpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgIi4uLiIsIGxpbmUgNiwgaW4gdGVzdF9kb2N0ZXN0LnR4dAorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBmYXZvcml0ZV9jb2xvcgorICAgIEV4Y2VwdGlvbiByYWlzZWQ6CisgICAgICAgIC4uLgorICAgICAgICBOYW1lRXJyb3I6IG5hbWUgJ2Zhdm9yaXRlX2NvbG9yJyBpcyBub3QgZGVmaW5lZAorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MikKKyAgICA+Pj4gZG9jdGVzdC5tYXN0ZXIgPSBOb25lICAjIFJlc2V0IG1hc3Rlci4KKworVGhlIG9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnQgYHJhaXNlX29uX2Vycm9yYCBjYW4gYmUgdXNlZCB0byByYWlzZSBhbgorZXhjZXB0aW9uIG9uIHRoZSBmaXJzdCBlcnJvciAod2hpY2ggbWF5IGJlIHVzZWZ1bCBmb3IgcG9zdG1vcnRlbQorZGVidWdnaW5nKToKKworICAgID4+PiBkb2N0ZXN0LnRlc3RmaWxlKCd0ZXN0X2RvY3Rlc3QudHh0JywgcmFpc2Vfb25fZXJyb3I9VHJ1ZSkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgVW5leHBlY3RlZEV4Y2VwdGlvbjogLi4uCisgICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCisKK0lmIHRoZSB0ZXN0cyBjb250YWluIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCB0aGUgdGVzdHMgbWlnaHQgZmFpbCwgc2luY2UKK2l0J3MgdW5rbm93biB3aGljaCBlbmNvZGluZyBpcyB1c2VkLiBUaGUgZW5jb2RpbmcgY2FuIGJlIHNwZWNpZmllZAordXNpbmcgdGhlIG9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnQgYGVuY29kaW5nYDoKKworICAgID4+PiBkb2N0ZXN0LnRlc3RmaWxlKCd0ZXN0X2RvY3Rlc3Q0LnR4dCcpICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgIi4uLiIsIGxpbmUgNywgaW4gdGVzdF9kb2N0ZXN0NC50eHQKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgdScuLi4nCisgICAgRXhwZWN0ZWQ6CisgICAgICAgIHUnZlx4ZjZceGY2JworICAgIEdvdDoKKyAgICAgICAgdSdmXHhjM1x4YjZceGMzXHhiNicKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLi4uCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIDEgaXRlbXMgaGFkIGZhaWx1cmVzOgorICAgICAgIDIgb2YgICA0IGluIHRlc3RfZG9jdGVzdDQudHh0CisgICAgKioqVGVzdCBGYWlsZWQqKiogMiBmYWlsdXJlcy4KKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MiwgYXR0ZW1wdGVkPTQpCisgICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCisKKyAgICA+Pj4gZG9jdGVzdC50ZXN0ZmlsZSgndGVzdF9kb2N0ZXN0NC50eHQnLCBlbmNvZGluZz0ndXRmLTgnKQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9NCkKKyAgICA+Pj4gZG9jdGVzdC5tYXN0ZXIgPSBOb25lICAjIFJlc2V0IG1hc3Rlci4KKworU3dpdGNoIHRoZSBtb2R1bGUgZW5jb2RpbmcgdG8gJ3V0Zi04JyB0byB0ZXN0IHRoZSB2ZXJib3NlIG91dHB1dCB3aXRob3V0Citib3RoZXJpbmcgd2l0aCB0aGUgY3VycmVudCBzeXMuc3Rkb3V0IGVuY29kaW5nLgorCisgICAgPj4+IGRvY3Rlc3QuX2VuY29kaW5nLCBzYXZlZF9lbmNvZGluZyA9ICd1dGYtOCcsIGRvY3Rlc3QuX2VuY29kaW5nCisgICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdDQudHh0JywgZW5jb2Rpbmc9J3V0Zi04JywgdmVyYm9zZT1UcnVlKQorICAgIFRyeWluZzoKKyAgICAgICAgdSdmw7bDticKKyAgICBFeHBlY3Rpbmc6CisgICAgICAgIHUnZlx4ZjZceGY2JworICAgIG9rCisgICAgVHJ5aW5nOgorICAgICAgICB1J2LEhXInCisgICAgRXhwZWN0aW5nOgorICAgICAgICB1J2JcdTAxMDVyJworICAgIG9rCisgICAgVHJ5aW5nOgorICAgICAgICAnZsO2w7YnCisgICAgRXhwZWN0aW5nOgorICAgICAgICAnZlx4YzNceGI2XHhjM1x4YjYnCisgICAgb2sKKyAgICBUcnlpbmc6CisgICAgICAgICdixIVyJworICAgIEV4cGVjdGluZzoKKyAgICAgICAgJ2JceGM0XHg4NXInCisgICAgb2sKKyAgICAxIGl0ZW1zIHBhc3NlZCBhbGwgdGVzdHM6CisgICAgICAgNCB0ZXN0cyBpbiB0ZXN0X2RvY3Rlc3Q0LnR4dAorICAgIDQgdGVzdHMgaW4gMSBpdGVtcy4KKyAgICA0IHBhc3NlZCBhbmQgMCBmYWlsZWQuCisgICAgVGVzdCBwYXNzZWQuCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD00KQorICAgID4+PiBkb2N0ZXN0Ll9lbmNvZGluZyA9IHNhdmVkX2VuY29kaW5nCisgICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCisgICAgPj4+IHN5cy5hcmd2ID0gc2F2ZV9hcmd2CisiIiIKKworIyBvbGRfdGVzdDEsIC4uLiB1c2VkIHRvIGxpdmUgaW4gZG9jdGVzdC5weSwgYnV0IGNsdXR0ZXJlZCBpdC4gIE5vdGUKKyMgdGhhdCB0aGVzZSB1c2UgdGhlIGRlcHJlY2F0ZWQgZG9jdGVzdC5UZXN0ZXIsIHNvIHNob3VsZCBnbyBhd2F5IChvcgorIyBiZSByZXdyaXR0ZW4pIHNvbWVkYXkuCisKK2RlZiBvbGRfdGVzdDEoKTogciIiIgorPj4+IGZyb20gZG9jdGVzdCBpbXBvcnQgVGVzdGVyCis+Pj4gdCA9IFRlc3RlcihnbG9icz17J3gnOiA0Mn0sIHZlcmJvc2U9MCkKKz4+PiB0LnJ1bnN0cmluZyhyJycnCisuLi4gICAgICA+Pj4geCA9IHggKiAyCisuLi4gICAgICA+Pj4gcHJpbnQgeAorLi4uICAgICAgNDIKKy4uLiAnJycsICdYWVonKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTGluZSAzLCBpbiBYWVoKK0ZhaWxlZCBleGFtcGxlOgorICAgIHByaW50IHgKK0V4cGVjdGVkOgorICAgIDQyCitHb3Q6CisgICAgODQKK1Rlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MikKKz4+PiB0LnJ1bnN0cmluZygiPj4+IHggPSB4ICogMlxuPj4+IHByaW50IHhcbjg0XG4iLCAnZXhhbXBsZTInKQorVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQorPj4+IHQuc3VtbWFyaXplKCkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzEgaXRlbXMgaGFkIGZhaWx1cmVzOgorICAgMSBvZiAgIDIgaW4gWFlaCisqKipUZXN0IEZhaWxlZCoqKiAxIGZhaWx1cmVzLgorVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD00KQorPj4+IHQuc3VtbWFyaXplKHZlcmJvc2U9MSkKKzEgaXRlbXMgcGFzc2VkIGFsbCB0ZXN0czoKKyAgIDIgdGVzdHMgaW4gZXhhbXBsZTIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzEgaXRlbXMgaGFkIGZhaWx1cmVzOgorICAgMSBvZiAgIDIgaW4gWFlaCis0IHRlc3RzIGluIDIgaXRlbXMuCiszIHBhc3NlZCBhbmQgMSBmYWlsZWQuCisqKipUZXN0IEZhaWxlZCoqKiAxIGZhaWx1cmVzLgorVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD00KQorIiIiCisKK2RlZiBvbGRfdGVzdDIoKTogciIiIgorICAgICAgICA+Pj4gZnJvbSBkb2N0ZXN0IGltcG9ydCBUZXN0ZXIKKyAgICAgICAgPj4+IHQgPSBUZXN0ZXIoZ2xvYnM9e30sIHZlcmJvc2U9MSkKKyAgICAgICAgPj4+IHRlc3QgPSByJycnCisgICAgICAgIC4uLiAgICAjIGp1c3QgYW4gZXhhbXBsZQorICAgICAgICAuLi4gICAgPj4+IHggPSAxICsgMgorICAgICAgICAuLi4gICAgPj4+IHgKKyAgICAgICAgLi4uICAgIDMKKyAgICAgICAgLi4uICcnJworICAgICAgICA+Pj4gdC5ydW5zdHJpbmcodGVzdCwgIkV4YW1wbGUiKQorICAgICAgICBSdW5uaW5nIHN0cmluZyBFeGFtcGxlCisgICAgICAgIFRyeWluZzoKKyAgICAgICAgICAgIHggPSAxICsgMgorICAgICAgICBFeHBlY3Rpbmcgbm90aGluZworICAgICAgICBvaworICAgICAgICBUcnlpbmc6CisgICAgICAgICAgICB4CisgICAgICAgIEV4cGVjdGluZzoKKyAgICAgICAgICAgIDMKKyAgICAgICAgb2sKKyAgICAgICAgMCBvZiAyIGV4YW1wbGVzIGZhaWxlZCBpbiBzdHJpbmcgRXhhbXBsZQorICAgICAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCisiIiIKKworZGVmIG9sZF90ZXN0MygpOiByIiIiCisgICAgICAgID4+PiBmcm9tIGRvY3Rlc3QgaW1wb3J0IFRlc3RlcgorICAgICAgICA+Pj4gdCA9IFRlc3RlcihnbG9icz17fSwgdmVyYm9zZT0wKQorICAgICAgICA+Pj4gZGVmIF9mKCk6CisgICAgICAgIC4uLiAgICAgJycnVHJpdmlhbCBkb2NzdHJpbmcgZXhhbXBsZS4KKyAgICAgICAgLi4uICAgICA+Pj4gYXNzZXJ0IDIgPT0gMgorICAgICAgICAuLi4gICAgICcnJworICAgICAgICAuLi4gICAgIHJldHVybiAzMgorICAgICAgICAuLi4KKyAgICAgICAgPj4+IHQucnVuZG9jKF9mKSAgIyBleHBlY3QgMCBmYWlsdXJlcyBpbiAxIGV4YW1wbGUKKyAgICAgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0xKQorIiIiCisKK2RlZiBvbGRfdGVzdDQoKTogIiIiCisgICAgICAgID4+PiBpbXBvcnQgdHlwZXMKKyAgICAgICAgPj4+IG0xID0gdHlwZXMuTW9kdWxlVHlwZSgnX20xJykKKyAgICAgICAgPj4+IG0yID0gdHlwZXMuTW9kdWxlVHlwZSgnX20yJykKKyAgICAgICAgPj4+IHRlc3RfZGF0YSA9IFwiIiIKKyAgICAgICAgLi4uIGRlZiBfZigpOgorICAgICAgICAuLi4gICAgICcnJz4+PiBhc3NlcnQgMSA9PSAxCisgICAgICAgIC4uLiAgICAgJycnCisgICAgICAgIC4uLiBkZWYgZygpOgorICAgICAgICAuLi4gICAgJycnPj4+IGFzc2VydCAyICE9IDEKKyAgICAgICAgLi4uICAgICcnJworICAgICAgICAuLi4gY2xhc3MgSDoKKyAgICAgICAgLi4uICAgICcnJz4+PiBhc3NlcnQgMiA+IDEKKyAgICAgICAgLi4uICAgICcnJworICAgICAgICAuLi4gICAgZGVmIGJhcihzZWxmKToKKyAgICAgICAgLi4uICAgICAgICAnJyc+Pj4gYXNzZXJ0IDEgPCAyCisgICAgICAgIC4uLiAgICAgICAgJycnCisgICAgICAgIC4uLiBcIiIiCisgICAgICAgID4+PiBleGVjIHRlc3RfZGF0YSBpbiBtMS5fX2RpY3RfXworICAgICAgICA+Pj4gZXhlYyB0ZXN0X2RhdGEgaW4gbTIuX19kaWN0X18KKyAgICAgICAgPj4+IG0xLl9fZGljdF9fLnVwZGF0ZSh7ImYyIjogbTIuX2YsICJnMiI6IG0yLmcsICJoMiI6IG0yLkh9KQorCisgICAgICAgIFRlc3RzIHRoYXQgb2JqZWN0cyBvdXRzaWRlIG0xIGFyZSBleGNsdWRlZDoKKworICAgICAgICA+Pj4gZnJvbSBkb2N0ZXN0IGltcG9ydCBUZXN0ZXIKKyAgICAgICAgPj4+IHQgPSBUZXN0ZXIoZ2xvYnM9e30sIHZlcmJvc2U9MCkKKyAgICAgICAgPj4+IHQucnVuZGljdChtMS5fX2RpY3RfXywgInJ1bmRpY3RfdGVzdCIsIG0xKSAgIyBmMiBhbmQgZzIgYW5kIGgyIHNraXBwZWQKKyAgICAgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD00KQorCisgICAgICAgIE9uY2UgbW9yZSwgbm90IGV4Y2x1ZGluZyBzdHVmZiBvdXRzaWRlIG0xOgorCisgICAgICAgID4+PiB0ID0gVGVzdGVyKGdsb2JzPXt9LCB2ZXJib3NlPTApCisgICAgICAgID4+PiB0LnJ1bmRpY3QobTEuX19kaWN0X18sICJydW5kaWN0X3Rlc3RfcHZ0IikgICMgTm9uZSBhcmUgc2tpcHBlZC4KKyAgICAgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD04KQorCisgICAgICAgIFRoZSBleGNsdXNpb24gb2Ygb2JqZWN0cyBmcm9tIG91dHNpZGUgdGhlIGRlc2lnbmF0ZWQgbW9kdWxlIGlzCisgICAgICAgIG1lYW50IHRvIGJlIGludm9rZWQgYXV0b21hZ2ljYWxseSBieSB0ZXN0bW9kLgorCisgICAgICAgID4+PiBkb2N0ZXN0LnRlc3Rtb2QobTEsIHZlcmJvc2U9RmFsc2UpCisgICAgICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9NCkKKyIiIgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBNYWluCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICAjIENoZWNrIHRoZSBkb2N0ZXN0IGNhc2VzIGluIGRvY3Rlc3QgaXRzZWxmOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdChkb2N0ZXN0LCB2ZXJib3NpdHk9VHJ1ZSkKKworICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9kb2N0ZXN0CisKKyAgICAjIElnbm9yZSBhbGwgd2FybmluZ3MgYWJvdXQgdGhlIHVzZSBvZiBjbGFzcyBUZXN0ZXIgaW4gdGhpcyBtb2R1bGUuCisgICAgZGVwcmVjYXRpb25zID0gW10KKyAgICBpZiBfX2RlYnVnX186CisgICAgICAgIGRlcHJlY2F0aW9ucy5hcHBlbmQoKCJjbGFzcyBUZXN0ZXIgaXMgZGVwcmVjYXRlZCIsIERlcHJlY2F0aW9uV2FybmluZykpCisgICAgaWYgc3lzLnB5M2t3YXJuaW5nOgorICAgICAgICBkZXByZWNhdGlvbnMgKz0gWygiYmFja3F1b3RlIG5vdCBzdXBwb3J0ZWQiLCBTeW50YXhXYXJuaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoImV4ZWNmaWxlLi4gbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZyldCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKmRlcHJlY2F0aW9ucyk6CisgICAgICAgICMgQ2hlY2sgdGhlIGRvY3Rlc3QgY2FzZXMgZGVmaW5lZCBoZXJlOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9kb2N0ZXN0LCB2ZXJib3NpdHk9VHJ1ZSkKKworaW1wb3J0IHN5cworZGVmIHRlc3RfY292ZXJhZ2UoY292ZXJkaXIpOgorICAgIHRyYWNlID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RyYWNlJykKKyAgICB0cmFjZXIgPSB0cmFjZS5UcmFjZShpZ25vcmVkaXJzPVtzeXMucHJlZml4LCBzeXMuZXhlY19wcmVmaXgsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZT0wLCBjb3VudD0xKQorICAgIHRyYWNlci5ydW4oJ3JlbG9hZChkb2N0ZXN0KTsgdGVzdF9tYWluKCknKQorICAgIHIgPSB0cmFjZXIucmVzdWx0cygpCisgICAgcHJpbnQgJ1dyaXRpbmcgY292ZXJhZ2UgcmVzdWx0cy4uLicKKyAgICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIHN1bW1hcnk9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgY292ZXJkaXI9Y292ZXJkaXIpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaWYgJy1jJyBpbiBzeXMuYXJndjoKKyAgICAgICAgdGVzdF9jb3ZlcmFnZSgnL3RtcC9kb2N0ZXN0LmNvdmVyJykKKyAgICBlbHNlOgorICAgICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWFhMWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTY4YTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGU4NTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC50eHQKQEAgLTAsMCArMSwxNyBAQAorVGhpcyBpcyBhIHNhbXBsZSBkb2N0ZXN0IGluIGEgdGV4dCBmaWxlLgorCitJbiB0aGlzIGV4YW1wbGUsIHdlJ2xsIHJlbHkgb24gYSBnbG9iYWwgdmFyaWFibGUgYmVpbmcgc2V0IGZvciB1cworYWxyZWFkeToKKworICA+Pj4gZmF2b3JpdGVfY29sb3IKKyAgJ2JsdWUnCisKK1dlIGNhbiBtYWtlIHRoaXMgZmFpbCBieSBkaXNhYmxpbmcgdGhlIGJsYW5rLWxpbmUgZmVhdHVyZS4KKworICA+Pj4gaWYgMToKKyAgLi4uICAgIHByaW50ICdhJworICAuLi4gICAgcHJpbnQKKyAgLi4uICAgIHByaW50ICdiJworICBhCisgIDxCTEFOS0xJTkU+CisgIGIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdDIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwNDNiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QyLnB5CkBAIC0wLDAgKzEsMTI0IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQordSIiIkEgbW9kdWxlIHRvIHRlc3Qgd2hldGhlciBkb2N0ZXN0IHJlY29nbml6ZXMgc29tZSAyLjIgZmVhdHVyZXMsCitsaWtlIHN0YXRpYyBhbmQgY2xhc3MgbWV0aG9kcy4KKworPj4+IHByaW50ICd5dXAnICAjIDEKK3l1cAorCitXZSBpbmNsdWRlIHNvbWUgKHJhbmRvbSkgZW5jb2RlZCAodXRmLTgpIHRleHQgaW4gdGhlIHRleHQgc3Vycm91bmRpbmcKK3RoZSBleGFtcGxlLiAgSXQgc2hvdWxkIGJlIGlnbm9yZWQ6CisKK9CJ0IrQiNCB0IIKKworIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2lmIHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJDYW5ub3QgdGVzdCBkb2NzdHJpbmdzIHdpdGggLU8yIikKKworY2xhc3MgQyhvYmplY3QpOgorICAgIHUiIiJDbGFzcyBDLgorCisgICAgPj4+IHByaW50IEMoKSAgIyAyCisgICAgNDIKKworCisgICAgV2UgaW5jbHVkZSBzb21lIChyYW5kb20pIGVuY29kZWQgKHV0Zi04KSB0ZXh0IGluIHRoZSB0ZXh0IHN1cnJvdW5kaW5nCisgICAgdGhlIGV4YW1wbGUuICBJdCBzaG91bGQgYmUgaWdub3JlZDoKKworICAgICAgICDQidCK0IjQgdCCCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIiIiQy5fX2luaXRfXy4KKworICAgICAgICA+Pj4gcHJpbnQgQygpICMgMworICAgICAgICA0MgorICAgICAgICAiIiIKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgPj4+IHByaW50IEMoKSAjIDQKKyAgICAgICAgNDIKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAiNDIiCisKKyAgICBjbGFzcyBEKG9iamVjdCk6CisgICAgICAgICIiIkEgbmVzdGVkIEQgY2xhc3MuCisKKyAgICAgICAgPj4+IHByaW50ICJJbiBEISIgICAjIDUKKyAgICAgICAgSW4gRCEKKyAgICAgICAgIiIiCisKKyAgICAgICAgZGVmIG5lc3RlZChzZWxmKToKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgPj4+IHByaW50IDMgIyA2CisgICAgICAgICAgICAzCisgICAgICAgICAgICAiIiIKKworICAgIGRlZiBnZXR4KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgPj4+IGMgPSBDKCkgICAgIyA3CisgICAgICAgID4+PiBjLnggPSAxMiAgICMgOAorICAgICAgICA+Pj4gcHJpbnQgYy54ICAjIDkKKyAgICAgICAgLTEyCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gLXNlbGYuX3gKKworICAgIGRlZiBzZXR4KHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIiCisgICAgICAgID4+PiBjID0gQygpICAgICAjIDEwCisgICAgICAgID4+PiBjLnggPSAxMiAgICAjIDExCisgICAgICAgID4+PiBwcmludCBjLnggICAjIDEyCisgICAgICAgIC0xMgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5feCA9IHZhbHVlCisKKyAgICB4ID0gcHJvcGVydHkoZ2V0eCwgc2V0eCwgZG9jPSIiIlwKKyAgICAgICAgPj4+IGMgPSBDKCkgICAgIyAxMworICAgICAgICA+Pj4gYy54ID0gMTIgICAjIDE0CisgICAgICAgID4+PiBwcmludCBjLnggICMgMTUKKyAgICAgICAgLTEyCisgICAgICAgICIiIikKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgc3RhdG0oKToKKyAgICAgICAgIiIiCisgICAgICAgIEEgc3RhdGljIG1ldGhvZC4KKworICAgICAgICA+Pj4gcHJpbnQgQy5zdGF0bSgpICAgICMgMTYKKyAgICAgICAgNjY2CisgICAgICAgID4+PiBwcmludCBDKCkuc3RhdG0oKSAgIyAxNworICAgICAgICA2NjYKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiA2NjYKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBjbHNtKGNscywgdmFsKToKKyAgICAgICAgIiIiCisgICAgICAgIEEgY2xhc3MgbWV0aG9kLgorCisgICAgICAgID4+PiBwcmludCBDLmNsc20oMjIpICAgICMgMTgKKyAgICAgICAgMjIKKyAgICAgICAgPj4+IHByaW50IEMoKS5jbHNtKDIzKSAgIyAxOQorICAgICAgICAyMworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHZhbAorCitkZWYgdGVzdF9tYWluKCk6CisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2RvY3Rlc3QyCisgICAgRVhQRUNURUQgPSAxOQorICAgIGYsIHQgPSB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9kb2N0ZXN0MikKKyAgICBpZiB0ICE9IEVYUEVDVEVEOgorICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCgiZXhwZWN0ZWQgJWQgdGVzdHMgdG8gcnVuLCBub3QgJWQiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEVYUEVDVEVELCB0KSkKKworIyBQb2xsdXRlIHRoZSBuYW1lc3BhY2Ugd2l0aCBhIGJ1bmNoIG9mIGltcG9ydGVkIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcywKKyMgdG8gbWFrZSBzdXJlIHRoZXkgZG9uJ3QgZ2V0IHRlc3RlZC4KK2Zyb20gZG9jdGVzdCBpbXBvcnQgKgorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0Mi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0Mi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdhOTRlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0Mi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0Mi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdhOTRlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0Mi50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0Mi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxNDg1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QyLnR4dApAQCAtMCwwICsxLDE0IEBACitUaGlzIGlzIGEgc2FtcGxlIGRvY3Rlc3QgaW4gYSB0ZXh0IGZpbGUuCisKK0luIHRoaXMgZXhhbXBsZSwgd2UnbGwgcmVseSBvbiBzb21lIHNpbGx5IHNldHVwOgorCisgID4+PiBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKKyAgPj4+IHRlc3QudGVzdF9kb2N0ZXN0LnNpbGx5U2V0dXAKKyAgVHJ1ZQorCitUaGlzIHRlc3QgYWxzbyBoYXMgc29tZSAocmFuZG9tKSBlbmNvZGVkICh1dGYtOCkgdW5pY29kZSB0ZXh0OgorCisgIMOvwrvCv8OQwonDkMKKw5DCiMOQwoHDkMKCCisKK1RoaXMgZG9lc24ndCBjYXVzZSBhIHByb2JsZW0gaW4gdGhlIHRlY3Qgc3Vycm91bmRpbmcgdGhlIGV4YW1wbGVzLCBidXQKK3dlIGluY2x1ZGUgaXQgaGVyZSAoaW4gdGhpcyB0ZXN0IHRleHQgZmlsZSkgdG8gbWFrZSBzdXJlLiA6KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdDMudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdDMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YTk2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0My50eHQKQEAgLTAsMCArMSw1IEBACisKK0hlcmUgd2UgY2hlY2sgdGhhdCBgX19maWxlX19gIGlzIHByb3ZpZGVkOgorCisgID4+PiB0eXBlKF9fZmlsZV9fKQorICA8dHlwZSAnc3RyJz4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3Q0LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3Q0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjE5ZDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdDQudHh0CkBAIC0wLDAgKzEsMTcgQEAKK1RoaXMgaXMgYSBzYW1wbGUgZG9jdGVzdCBpbiBhIHRleHQgZmlsZSB0aGF0IGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgorVGhpcyBmaWxlIGlzIGVuY29kZWQgdXNpbmcgVVRGLTguCisKK0luIG9yZGVyIHRvIGdldCB0aGlzIHRlc3QgdG8gcGFzcywgd2UgaGF2ZSB0byBtYW51YWxseSBzcGVjaWZ5IHRoZQorZW5jb2RpbmcuCisKKyAgPj4+IHUnZsO2w7YnCisgIHUnZlx4ZjZceGY2JworCisgID4+PiB1J2LEhXInCisgIHUnYlx1MDEwNXInCisKKyAgPj4+ICdmw7bDticKKyAgJ2ZceGMzXHhiNlx4YzNceGI2JworCisgID4+PiAnYsSFcicKKyAgJ2JceGM0XHg4NXInCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N4bWxycGMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N4bWxycGMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkMTgwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3htbHJwYy5weQpAQCAtMCwwICsxLDIwMSBAQAorZnJvbSBEb2NYTUxSUENTZXJ2ZXIgaW1wb3J0IERvY1hNTFJQQ1NlcnZlcgoraW1wb3J0IGh0dHBsaWIKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Cit0aHJlYWRpbmcgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykKK2ltcG9ydCB0aW1lCitpbXBvcnQgc29ja2V0CitpbXBvcnQgdW5pdHRlc3QKKworUE9SVCA9IE5vbmUKKworZGVmIG1ha2VfcmVxdWVzdF9hbmRfc2tpcElmKGNvbmRpdGlvbiwgcmVhc29uKToKKyAgICAjIElmIHdlIHNraXAgdGhlIHRlc3QsIHdlIGhhdmUgdG8gbWFrZSBhIHJlcXVlc3QgYmVjYXVzZSB0aGUKKyAgICAjIHRoZSBzZXJ2ZXIgY3JlYXRlZCBpbiBzZXRVcCBibG9ja3MgZXhwZWN0aW5nIG9uZSB0byBjb21lIGluLgorICAgIGlmIG5vdCBjb25kaXRpb246CisgICAgICAgIHJldHVybiBsYW1iZGEgZnVuYzogZnVuYworICAgIGRlZiBkZWNvcmF0b3IoZnVuYyk6CisgICAgICAgIGRlZiBtYWtlX3JlcXVlc3RfYW5kX3NraXAoc2VsZik6CisgICAgICAgICAgICBzZWxmLmNsaWVudC5yZXF1ZXN0KCJHRVQiLCAiLyIpCisgICAgICAgICAgICBzZWxmLmNsaWVudC5nZXRyZXNwb25zZSgpCisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdChyZWFzb24pCisgICAgICAgIHJldHVybiBtYWtlX3JlcXVlc3RfYW5kX3NraXAKKyAgICByZXR1cm4gZGVjb3JhdG9yCisKKworZGVmIHNlcnZlcihldnQsIG51bXJlcXVlc3RzKToKKyAgICBzZXJ2ID0gRG9jWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgMCksIGxvZ1JlcXVlc3RzPUZhbHNlKQorCisgICAgdHJ5OgorICAgICAgICBnbG9iYWwgUE9SVAorICAgICAgICBQT1JUID0gc2Vydi5zb2NrZXQuZ2V0c29ja25hbWUoKVsxXQorCisgICAgICAgICMgQWRkIHNvbWUgZG9jdW1lbnRhdGlvbgorICAgICAgICBzZXJ2LnNldF9zZXJ2ZXJfdGl0bGUoIkRvY1hNTFJQQ1NlcnZlciBUZXN0IERvY3VtZW50YXRpb24iKQorICAgICAgICBzZXJ2LnNldF9zZXJ2ZXJfbmFtZSgiRG9jWE1MUlBDU2VydmVyIFRlc3QgRG9jcyIpCisgICAgICAgIHNlcnYuc2V0X3NlcnZlcl9kb2N1bWVudGF0aW9uKAorICAgICAgICAgICAgIlRoaXMgaXMgYW4gWE1MLVJQQyBzZXJ2ZXIncyBkb2N1bWVudGF0aW9uLCBidXQgdGhlIHNlcnZlciAiCisgICAgICAgICAgICAiY2FuIGJlIHVzZWQgYnkgUE9TVGluZyB0byAvUlBDMi4gVHJ5IHNlbGYuYWRkLCB0b28uIikKKworICAgICAgICAjIENyZWF0ZSBhbmQgcmVnaXN0ZXIgY2xhc3NlcyBhbmQgZnVuY3Rpb25zCisgICAgICAgIGNsYXNzIFRlc3RDbGFzcyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIHRlc3RfbWV0aG9kKHNlbGYsIGFyZyk6CisgICAgICAgICAgICAgICAgIiIiVGVzdCBtZXRob2QncyBkb2NzLiBUaGlzIG1ldGhvZCB0cnVseSBkb2VzIHZlcnkgbGl0dGxlLiIiIgorICAgICAgICAgICAgICAgIHNlbGYuYXJnID0gYXJnCisKKyAgICAgICAgc2Vydi5yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2Z1bmN0aW9ucygpCisgICAgICAgIHNlcnYucmVnaXN0ZXJfaW5zdGFuY2UoVGVzdENsYXNzKCkpCisKKyAgICAgICAgZGVmIGFkZCh4LCB5KToKKyAgICAgICAgICAgICIiIkFkZCB0d28gaW5zdGFuY2VzIHRvZ2V0aGVyLiBUaGlzIGZvbGxvd3MgUEVQMDA4LCBidXQgaGFzIG5vdGhpbmcKKyAgICAgICAgICAgIHRvIGRvIHdpdGggUkZDMTk1Mi4gQ2FzZSBzaG91bGQgbWF0dGVyOiBwRXAwMDggYW5kIHJGQzE5NTIuICBUaGluZ3MKKyAgICAgICAgICAgIHRoYXQgc3RhcnQgd2l0aCBodHRwIGFuZCBmdHAgc2hvdWxkIGJlIGF1dG8tbGlua2VkLCB0b286CisgICAgICAgICAgICBodHRwOi8vZ29vZ2xlLmNvbS4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIHggKyB5CisKKyAgICAgICAgc2Vydi5yZWdpc3Rlcl9mdW5jdGlvbihhZGQpCisgICAgICAgIHNlcnYucmVnaXN0ZXJfZnVuY3Rpb24obGFtYmRhIHgsIHk6IHgteSkKKworICAgICAgICB3aGlsZSBudW1yZXF1ZXN0cyA+IDA6CisgICAgICAgICAgICBzZXJ2LmhhbmRsZV9yZXF1ZXN0KCkKKyAgICAgICAgICAgIG51bXJlcXVlc3RzIC09IDEKKyAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQ6CisgICAgICAgIHBhc3MKKyAgICBmaW5hbGx5OgorICAgICAgICBzZXJ2LnNlcnZlcl9jbG9zZSgpCisgICAgICAgIFBPUlQgPSBOb25lCisgICAgICAgIGV2dC5zZXQoKQorCitjbGFzcyBEb2NYTUxSUENIVFRQR0VUU2VydmVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3RocmVhZHMgPSB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKyAgICAgICAgIyBFbmFibGUgc2VydmVyIGZlZWRiYWNrCisgICAgICAgIERvY1hNTFJQQ1NlcnZlci5fc2VuZF90cmFjZWJhY2tfaGVhZGVyID0gVHJ1ZQorCisgICAgICAgIHNlbGYuZXZ0ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VydmVyLCBhcmdzPShzZWxmLmV2dCwgMSkpLnN0YXJ0KCkKKworICAgICAgICAjIHdhaXQgZm9yIHBvcnQgdG8gYmUgYXNzaWduZWQKKyAgICAgICAgbiA9IDEwMDAKKyAgICAgICAgd2hpbGUgbiA+IDAgYW5kIFBPUlQgaXMgTm9uZToKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMDEpCisgICAgICAgICAgICBuIC09IDEKKworICAgICAgICBzZWxmLmNsaWVudCA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oImxvY2FsaG9zdDolZCIgJSBQT1JUKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5ldnQud2FpdCgpCisKKyAgICAgICAgIyBEaXNhYmxlIHNlcnZlciBmZWVkYmFjaworICAgICAgICBEb2NYTUxSUENTZXJ2ZXIuX3NlbmRfdHJhY2ViYWNrX2hlYWRlciA9IEZhbHNlCisgICAgICAgIHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqc2VsZi5fdGhyZWFkcykKKworICAgIGRlZiB0ZXN0X3ZhbGlkX2dldF9yZXNwb25zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQucmVxdWVzdCgiR0VUIiwgIi8iKQorICAgICAgICByZXNwb25zZSA9IHNlbGYuY2xpZW50LmdldHJlc3BvbnNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnN0YXR1cywgMjAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLmdldGhlYWRlcigiQ29udGVudC10eXBlIiksICJ0ZXh0L2h0bWwiKQorCisgICAgICAgICMgU2VydmVyIHJhaXNlcyBhbiBleGNlcHRpb24gaWYgd2UgZG9uJ3Qgc3RhcnQgdG8gcmVhZCB0aGUgZGF0YQorICAgICAgICByZXNwb25zZS5yZWFkKCkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfZ2V0X3Jlc3BvbnNlKHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC5yZXF1ZXN0KCJHRVQiLCAiL3NwYW0iKQorICAgICAgICByZXNwb25zZSA9IHNlbGYuY2xpZW50LmdldHJlc3BvbnNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnN0YXR1cywgNDA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLmdldGhlYWRlcigiQ29udGVudC10eXBlIiksICJ0ZXh0L3BsYWluIikKKworICAgICAgICByZXNwb25zZS5yZWFkKCkKKworICAgIGRlZiB0ZXN0X2xhbWJkYShzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IGxhbWJkYSBmdW5jdGlvbmFsaXR5IHN0YXlzIHRoZSBzYW1lLiAgVGhlIG91dHB1dCBwcm9kdWNlZAorICAgICAgICBjdXJyZW50bHkgaXMsIEkgc3VzcGVjdCBpbnZhbGlkIGJlY2F1c2Ugb2YgdGhlIHVuZW5jb2RlZCBicmFja2V0cyBpbiB0aGUKKyAgICAgICAgSFRNTCwgIjxsYW1iZGE+Ii4KKworICAgICAgICBUaGUgc3VidHJhY3Rpb24gbGFtYmRhIG1ldGhvZCBpcyB0ZXN0ZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNsaWVudC5yZXF1ZXN0KCJHRVQiLCAiLyIpCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5jbGllbnQuZ2V0cmVzcG9uc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJzxkbD48ZHQ+PGEgbmFtZT0iLSZsdDtsYW1iZGEmZ3Q7Ij48c3Ryb25nPicKKyAgICAgICAgICAgICAgICAgICAgICAnJmx0O2xhbWJkYSZndDs8L3N0cm9uZz48L2E+KHgsIHkpPC9kdD48L2RsPicsCisgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVhZCgpKQorCisgICAgQG1ha2VfcmVxdWVzdF9hbmRfc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF9hdXRvbGlua2luZyhzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGF0IHRoZSBzZXJ2ZXIgY29ycmVjdGx5IGF1dG9tYXRpY2FsbHkgd3JhcHMgcmVmZXJlbmNlcyB0bworICAgICAgICBQRVBTIGFuZCBSRkNzIHdpdGggbGlua3MsIGFuZCB0aGF0IGl0IGxpbmtpZmllcyB0ZXh0IHN0YXJ0aW5nIHdpdGgKKyAgICAgICAgaHR0cCBvciBmdHAgcHJvdG9jb2wgcHJlZml4ZXMuCisKKyAgICAgICAgVGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSAiYWRkIiBtZXRob2QgY29udGFpbnMgdGhlIHRlc3QgbWF0ZXJpYWwuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNsaWVudC5yZXF1ZXN0KCJHRVQiLCAiLyIpCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5jbGllbnQuZ2V0cmVzcG9uc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oCisgICAgICAgICAgICAoJzxkbD48ZHQ+PGEgbmFtZT0iLWFkZCI+PHN0cm9uZz5hZGQ8L3N0cm9uZz48L2E+KHgsIHkpPC9kdD48ZGQ+JworICAgICAgICAgICAgICc8dHQ+QWRkJm5ic3A7dHdvJm5ic3A7aW5zdGFuY2VzJm5ic3A7dG9nZXRoZXIuJm5ic3A7VGhpcyZuYnNwOycKKyAgICAgICAgICAgICAnZm9sbG93cyZuYnNwOzxhIGhyZWY9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDAwOC8iPicKKyAgICAgICAgICAgICAnUEVQMDA4PC9hPiwmbmJzcDtidXQmbmJzcDtoYXMmbmJzcDtub3RoaW5nPGJyPlxudG8mbmJzcDtkbyZuYnNwOycKKyAgICAgICAgICAgICAnd2l0aCZuYnNwOzxhIGhyZWY9Imh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzE5NTIudHh0Ij4nCisgICAgICAgICAgICAgJ1JGQzE5NTI8L2E+LiZuYnNwO0Nhc2UmbmJzcDtzaG91bGQmbmJzcDttYXR0ZXI6Jm5ic3A7cEVwMDA4Jm5ic3A7JworICAgICAgICAgICAgICdhbmQmbmJzcDtyRkMxOTUyLiZuYnNwOyZuYnNwO1RoaW5nczxicj5cbnRoYXQmbmJzcDtzdGFydCZuYnNwOycKKyAgICAgICAgICAgICAnd2l0aCZuYnNwO2h0dHAmbmJzcDthbmQmbmJzcDtmdHAmbmJzcDtzaG91bGQmbmJzcDtiZSZuYnNwOycKKyAgICAgICAgICAgICAnYXV0by1saW5rZWQsJm5ic3A7dG9vOjxicj5cbjxhIGhyZWY9Imh0dHA6Ly9nb29nbGUuY29tIj4nCisgICAgICAgICAgICAgJ2h0dHA6Ly9nb29nbGUuY29tPC9hPi48L3R0PjwvZGQ+PC9kbD4nKSwgcmVzcG9uc2UucmVhZCgpKQorCisgICAgQG1ha2VfcmVxdWVzdF9hbmRfc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF9zeXN0ZW1fbWV0aG9kcyhzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGUgcHJlY2Vuc2Ugb2YgdGhyZWUgY29uc2VjdXRpdmUgc3lzdGVtLiogbWV0aG9kcy4KKworICAgICAgICBUaGlzIGFsc28gdGVzdHMgdGhlaXIgdXNlIG9mIHBhcmFtZXRlciB0eXBlIHJlY29nbml0aW9uIGFuZCB0aGUKKyAgICAgICAgc3lzdGVtcyByZWxhdGVkIHRvIHRoYXQgcHJvY2Vzcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2xpZW50LnJlcXVlc3QoIkdFVCIsICIvIikKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5nZXRyZXNwb25zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbigKKyAgICAgICAgICAgICgnPGRsPjxkdD48YSBuYW1lPSItc3lzdGVtLmxpc3RNZXRob2RzIj48c3Ryb25nPnN5c3RlbS5saXN0TWV0aG9kcycKKyAgICAgICAgICAgICAnPC9zdHJvbmc+PC9hPigpPC9kdD48ZGQ+PHR0PjxhIGhyZWY9IiMtc3lzdGVtLmxpc3RNZXRob2RzIj5zeXN0ZW0nCisgICAgICAgICAgICAgJy5saXN0TWV0aG9kczwvYT4oKSZuYnNwOz0mZ3Q7Jm5ic3A7W1wnYWRkXCcsJm5ic3A7XCdzdWJ0cmFjdFwnLCcKKyAgICAgICAgICAgICAnJm5ic3A7XCdtdWx0aXBsZVwnXTxicj5cbiZuYnNwOzxicj5cblJldHVybnMmbmJzcDthJm5ic3A7bGlzdCcKKyAgICAgICAgICAgICAnJm5ic3A7b2YmbmJzcDt0aGUmbmJzcDttZXRob2RzJm5ic3A7c3VwcG9ydGVkJm5ic3A7YnkmbmJzcDt0aGUnCisgICAgICAgICAgICAgJyZuYnNwO3NlcnZlci48L3R0PjwvZGQ+PC9kbD5cbiA8ZGw+PGR0PjxhIG5hbWU9Ii1zeXN0ZW0ubWV0aG9kSGVscCI+JworICAgICAgICAgICAgICc8c3Ryb25nPnN5c3RlbS5tZXRob2RIZWxwPC9zdHJvbmc+PC9hPihtZXRob2RfbmFtZSk8L2R0PjxkZD48dHQ+JworICAgICAgICAgICAgICc8YSBocmVmPSIjLXN5c3RlbS5tZXRob2RIZWxwIj5zeXN0ZW0ubWV0aG9kSGVscDwvYT4oXCdhZGRcJykmbmJzcDsnCisgICAgICAgICAgICAgJz0mZ3Q7Jm5ic3A7IkFkZHMmbmJzcDt0d28mbmJzcDtpbnRlZ2VycyZuYnNwO3RvZ2V0aGVyIjxicj5cbiZuYnNwOycKKyAgICAgICAgICAgICAnPGJyPlxuUmV0dXJucyZuYnNwO2EmbmJzcDtzdHJpbmcmbmJzcDtjb250YWluaW5nJm5ic3A7ZG9jdW1lbnRhdGlvbicKKyAgICAgICAgICAgICAnJm5ic3A7Zm9yJm5ic3A7dGhlJm5ic3A7c3BlY2lmaWVkJm5ic3A7bWV0aG9kLjwvdHQ+PC9kZD48L2RsPlxuICcKKyAgICAgICAgICAgICAnPGRsPjxkdD48YSBuYW1lPSItc3lzdGVtLm1ldGhvZFNpZ25hdHVyZSI+PHN0cm9uZz5zeXN0ZW0uJworICAgICAgICAgICAgICdtZXRob2RTaWduYXR1cmU8L3N0cm9uZz48L2E+KG1ldGhvZF9uYW1lKTwvZHQ+PGRkPjx0dD48YSBocmVmPSIjLScKKyAgICAgICAgICAgICAnc3lzdGVtLm1ldGhvZFNpZ25hdHVyZSI+c3lzdGVtLm1ldGhvZFNpZ25hdHVyZTwvYT4oXCdhZGRcJykmbmJzcDsnCisgICAgICAgICAgICAgJz0mZ3Q7Jm5ic3A7W2RvdWJsZSwmbmJzcDtpbnQsJm5ic3A7aW50XTxicj5cbiZuYnNwOzxicj5cblJldHVybnMnCisgICAgICAgICAgICAgJyZuYnNwO2EmbmJzcDtsaXN0Jm5ic3A7ZGVzY3JpYmluZyZuYnNwO3RoZSZuYnNwO3NpZ25hdHVyZSZuYnNwO29mJworICAgICAgICAgICAgICcmbmJzcDt0aGUmbmJzcDttZXRob2QuJm5ic3A7SW4mbmJzcDt0aGU8YnI+XG5hYm92ZSZuYnNwO2V4YW1wbGUsJworICAgICAgICAgICAgICcmbmJzcDt0aGUmbmJzcDthZGQmbmJzcDttZXRob2QmbmJzcDt0YWtlcyZuYnNwO3R3byZuYnNwO2ludGVnZXJzJworICAgICAgICAgICAgICcmbmJzcDthcyZuYnNwO2FyZ3VtZW50czxicj5cbmFuZCZuYnNwO3JldHVybnMmbmJzcDthJm5ic3A7ZG91YmxlJworICAgICAgICAgICAgICcmbmJzcDtyZXN1bHQuPGJyPlxuJm5ic3A7PGJyPlxuVGhpcyZuYnNwO3NlcnZlciZuYnNwO2RvZXMmbmJzcDsnCisgICAgICAgICAgICAgJ05PVCZuYnNwO3N1cHBvcnQmbmJzcDtzeXN0ZW0ubWV0aG9kU2lnbmF0dXJlLjwvdHQ+PC9kZD48L2RsPicpLAorICAgICAgICAgICAgcmVzcG9uc2UucmVhZCgpKQorCisgICAgZGVmIHRlc3RfYXV0b2xpbmtfZG90dGVkX21ldGhvZHMoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBzZWxmZG90IHZhbHVlcyBhcmUgbWFkZSBzdHJvbmcgYXV0b21hdGljYWxseSBpbiB0aGUKKyAgICAgICAgZG9jdW1lbnRhdGlvbi4iIiIKKyAgICAgICAgc2VsZi5jbGllbnQucmVxdWVzdCgiR0VUIiwgIi8iKQorICAgICAgICByZXNwb25zZSA9IHNlbGYuY2xpZW50LmdldHJlc3BvbnNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEluKCIiIlRyeSZuYnNwO3NlbGYuPHN0cm9uZz5hZGQ8L3N0cm9uZz4sJm5ic3A7dG9vLiIiIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZWFkKCkpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KERvY1hNTFJQQ0hUVFBHRVRTZXJ2ZXIpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3htbHJwYy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N4bWxycGMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZTIzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N4bWxycGMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3htbHJwYy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N4bWxycGMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZTIzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N4bWxycGMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bWJkYm0ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1iZGJtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MWZhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1iZGJtLnB5CkBAIC0wLDAgKzEsMTc5IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJUZXN0IHNjcmlwdCBmb3IgdGhlIGR1bWJkYm0gbW9kdWxlCisgICBPcmlnaW5hbCBieSBSb2dlciBFLiBNYXNzZQorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgZHVtYmRibQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworX2ZuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorCitkZWYgX2RlbGV0ZV9maWxlcygpOgorICAgIGZvciBleHQgaW4gWyIuZGlyIiwgIi5kYXQiLCAiLmJhayJdOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51bmxpbmsoX2ZuYW1lICsgZXh0KQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgRHVtYkRCTVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBfZGljdCA9IHsnMCc6ICcnLAorICAgICAgICAgICAgICdhJzogJ1B5dGhvbjonLAorICAgICAgICAgICAgICdiJzogJ1Byb2dyYW1taW5nJywKKyAgICAgICAgICAgICAnYyc6ICd0aGUnLAorICAgICAgICAgICAgICdkJzogJ3dheScsCisgICAgICAgICAgICAgJ2YnOiAnR3VpZG8nLAorICAgICAgICAgICAgICdnJzogJ2ludGVuZGVkJworICAgICAgICAgICAgIH0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYsICphcmdzKQorCisgICAgZGVmIHRlc3RfZHVtYmRibV9jcmVhdGlvbihzZWxmKToKKyAgICAgICAgZiA9IGR1bWJkYm0ub3BlbihfZm5hbWUsICdjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmtleXMoKSwgW10pCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fZGljdDoKKyAgICAgICAgICAgIGZba2V5XSA9IHNlbGYuX2RpY3Rba2V5XQorICAgICAgICBzZWxmLnJlYWRfaGVscGVyKGYpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZHVtYmRibV9jcmVhdGlvbl9tb2RlKHNlbGYpOgorICAgICAgICAjIE9uIHBsYXRmb3JtcyB3aXRob3V0IGNobW9kLCBkb24ndCBkbyBhbnl0aGluZy4KKyAgICAgICAgaWYgbm90IChoYXNhdHRyKG9zLCAnY2htb2QnKSBhbmQgaGFzYXR0cihvcywgJ3VtYXNrJykpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2xkX3VtYXNrID0gb3MudW1hc2soMDAwMikKKyAgICAgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lLCAnYycsIDA2MzcpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVtYXNrKG9sZF91bWFzaykKKworICAgICAgICBleHBlY3RlZF9tb2RlID0gMDYzNQorICAgICAgICBpZiBvcy5uYW1lICE9ICdwb3NpeCc6CisgICAgICAgICAgICAjIFdpbmRvd3Mgb25seSBzdXBwb3J0cyBzZXR0aW5nIHRoZSByZWFkLW9ubHkgYXR0cmlidXRlLgorICAgICAgICAgICAgIyBUaGlzIHNob3VsZG4ndCBmYWlsLCBidXQgZG9lc24ndCB3b3JrIGxpa2UgVW5peCBlaXRoZXIuCisgICAgICAgICAgICBleHBlY3RlZF9tb2RlID0gMDY2NgorCisgICAgICAgIGltcG9ydCBzdGF0CisgICAgICAgIHN0ID0gb3Muc3RhdChfZm5hbWUgKyAnLmRhdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdC5TX0lNT0RFKHN0LnN0X21vZGUpLCBleHBlY3RlZF9tb2RlKQorICAgICAgICBzdCA9IG9zLnN0YXQoX2ZuYW1lICsgJy5kaXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXQuU19JTU9ERShzdC5zdF9tb2RlKSwgZXhwZWN0ZWRfbW9kZSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlX3R3aWNlKHNlbGYpOgorICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSkKKyAgICAgICAgZlsnYSddID0gJ2InCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZlsnYSddLCAnYicpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2R1bWJkYm1fbW9kaWZpY2F0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmluaXRfZGIoKQorICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgJ3cnKQorICAgICAgICBzZWxmLl9kaWN0WydnJ10gPSBmWydnJ10gPSAiaW5kZW50ZWQiCisgICAgICAgIHNlbGYucmVhZF9oZWxwZXIoZikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9kdW1iZGJtX3JlYWQoc2VsZik6CisgICAgICAgIHNlbGYuaW5pdF9kYigpCisgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lLCAncicpCisgICAgICAgIHNlbGYucmVhZF9oZWxwZXIoZikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9kdW1iZGJtX2tleXMoc2VsZik6CisgICAgICAgIHNlbGYuaW5pdF9kYigpCisgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lKQorICAgICAgICBrZXlzID0gc2VsZi5rZXlzX2hlbHBlcihmKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3dyaXRlX3dyaXRlX3JlYWQoc2VsZik6CisgICAgICAgICMgdGVzdCBmb3IgYnVnICM0ODI0NjAKKyAgICAgICAgZiA9IGR1bWJkYm0ub3BlbihfZm5hbWUpCisgICAgICAgIGZbJzEnXSA9ICdoZWxsbycKKyAgICAgICAgZlsnMSddID0gJ2hlbGxvMicKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZbJzEnXSwgJ2hlbGxvMicpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfbGluZV9lbmRpbmdzKHNlbGYpOgorICAgICAgICAjIHRlc3QgZm9yIGJ1ZyAjMTE3Mjc2MzogZHVtYmRibSB3b3VsZCBkaWUgaWYgdGhlIGxpbmUgZW5kaW5ncworICAgICAgICAjIHdlcmVuJ3Qgd2hhdCB3YXMgZXhwZWN0ZWQuCisgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lKQorICAgICAgICBmWycxJ10gPSAnaGVsbG8nCisgICAgICAgIGZbJzInXSA9ICdoZWxsbzInCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICMgTWFuZ2xlIHRoZSBmaWxlIGJ5IGFkZGluZyBcciBiZWZvcmUgZWFjaCBuZXdsaW5lCisgICAgICAgIGRhdGEgPSBvcGVuKF9mbmFtZSArICcuZGlyJykucmVhZCgpCisgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoJ1xuJywgJ1xyXG4nKQorICAgICAgICBvcGVuKF9mbmFtZSArICcuZGlyJywgJ3diJykud3JpdGUoZGF0YSkKKworICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmWycxJ10sICdoZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZlsnMiddLCAnaGVsbG8yJykKKworCisgICAgZGVmIHJlYWRfaGVscGVyKHNlbGYsIGYpOgorICAgICAgICBrZXlzID0gc2VsZi5rZXlzX2hlbHBlcihmKQorICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2RpY3Q6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RpY3Rba2V5XSwgZltrZXldKQorCisgICAgZGVmIGluaXRfZGIoc2VsZik6CisgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lLCAndycpCisgICAgICAgIGZvciBrIGluIHNlbGYuX2RpY3Q6CisgICAgICAgICAgICBmW2tdID0gc2VsZi5fZGljdFtrXQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBrZXlzX2hlbHBlcihzZWxmLCBmKToKKyAgICAgICAga2V5cyA9IGYua2V5cygpCisgICAgICAgIGtleXMuc29ydCgpCisgICAgICAgIGRrZXlzID0gc2VsZi5fZGljdC5rZXlzKCkKKyAgICAgICAgZGtleXMuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5cywgZGtleXMpCisgICAgICAgIHJldHVybiBrZXlzCisKKyAgICAjIFBlcmZvcm0gcmFuZG9taXplZCBvcGVyYXRpb25zLiAgVGhpcyBkb2Vzbid0IG1ha2UgYXNzdW1wdGlvbnMgYWJvdXQKKyAgICAjIHdoYXQgKm1pZ2h0KiBmYWlsLgorICAgIGRlZiB0ZXN0X3JhbmRvbShzZWxmKToKKyAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICBkID0ge30gICMgbWlycm9yIHRoZSBkYXRhYmFzZQorICAgICAgICBmb3IgZHVtbXkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSkKKyAgICAgICAgICAgIGZvciBkdW1teSBpbiByYW5nZSgxMDApOgorICAgICAgICAgICAgICAgIGsgPSByYW5kb20uY2hvaWNlKCdhYmNkZWZnaGlqa2xtJykKKyAgICAgICAgICAgICAgICBpZiByYW5kb20ucmFuZG9tKCkgPCAwLjI6CisgICAgICAgICAgICAgICAgICAgIGlmIGsgaW4gZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBkW2tdCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgZltrXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHYgPSByYW5kb20uY2hvaWNlKCdhYmMnKSAqIHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDApCisgICAgICAgICAgICAgICAgICAgIGRba10gPSB2CisgICAgICAgICAgICAgICAgICAgIGZba10gPSB2CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZltrXSwgdikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSkKKyAgICAgICAgICAgIGV4cGVjdGVkID0gZC5pdGVtcygpCisgICAgICAgICAgICBleHBlY3RlZC5zb3J0KCkKKyAgICAgICAgICAgIGdvdCA9IGYuaXRlbXMoKQorICAgICAgICAgICAgZ290LnNvcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIF9kZWxldGVfZmlsZXMoKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBfZGVsZXRlX2ZpbGVzKCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRyeToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChEdW1iREJNVGVzdENhc2UpCisgICAgZmluYWxseToKKyAgICAgICAgX2RlbGV0ZV9maWxlcygpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bWJkYm0ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtYmRibS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhYjhhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bWJkYm0ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bWJkYm0ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtYmRibS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhYjhhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bWJkYm0ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWJkZDNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtbXlfdGhyZWFkLnB5CkBAIC0wLDAgKzEsMTgyIEBACisiIiJHZW5lcmljIHRocmVhZCB0ZXN0cy4KKworTWVhbnQgdG8gYmUgdXNlZCBieSBkdW1teV90aHJlYWQgYW5kIHRocmVhZC4gIFRvIGFsbG93IGZvciBkaWZmZXJlbnQgbW9kdWxlcwordG8gYmUgdXNlZCwgdGVzdF9tYWluKCkgY2FuIGJlIGNhbGxlZCB3aXRoIHRoZSBtb2R1bGUgdG8gdXNlIGFzIHRoZSB0aHJlYWQKK2ltcGxlbWVudGF0aW9uIGFzIGl0cyBzb2xlIGFyZ3VtZW50LgorCisiIiIKK2ltcG9ydCBkdW1teV90aHJlYWQgYXMgX3RocmVhZAoraW1wb3J0IHRpbWUKK2ltcG9ydCBRdWV1ZQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitERUxBWSA9IDAgIyBTZXQgPiAwIHdoZW4gdGVzdGluZyBhIG1vZHVsZSBvdGhlciB0aGFuIGR1bW15X3RocmVhZCwgc3VjaCBhcworICAgICAgICAgICMgdGhlICd0aHJlYWQnIG1vZHVsZS4KKworY2xhc3MgTG9ja1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGxvY2sgb2JqZWN0cy4iIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgYSBsb2NrCisgICAgICAgIHNlbGYubG9jayA9IF90aHJlYWQuYWxsb2NhdGVfbG9jaygpCisKKyAgICBkZWYgdGVzdF9pbml0bG9jayhzZWxmKToKKyAgICAgICAgI01ha2Ugc3VyZSBsb2NrcyBzdGFydCBsb2NrZWQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmxvY2subG9ja2VkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAiTG9jayBvYmplY3QgaXMgbm90IGluaXRpYWxpemVkIHVubG9ja2VkLiIpCisKKyAgICBkZWYgdGVzdF9yZWxlYXNlKHNlbGYpOgorICAgICAgICAjIFRlc3Qgc2VsZi5sb2NrLnJlbGVhc2UoKQorICAgICAgICBzZWxmLmxvY2suYWNxdWlyZSgpCisgICAgICAgIHNlbGYubG9jay5yZWxlYXNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmxvY2subG9ja2VkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAiTG9jayBvYmplY3QgZGlkIG5vdCByZWxlYXNlIHByb3Blcmx5LiIpCisKKyAgICBkZWYgdGVzdF9pbXByb3Blcl9yZWxlYXNlKHNlbGYpOgorICAgICAgICAjTWFrZSBzdXJlIHJlbGVhc2Ugb2YgYW4gdW5sb2NrZWQgdGhyZWFkIHJhaXNlcyBfdGhyZWFkLmVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKF90aHJlYWQuZXJyb3IsIHNlbGYubG9jay5yZWxlYXNlKQorCisgICAgZGVmIHRlc3RfY29uZF9hY3F1aXJlX3N1Y2Nlc3Moc2VsZik6CisgICAgICAgICNNYWtlIHN1cmUgdGhlIGNvbmRpdGlvbmFsIGFjcXVpcmluZyBvZiB0aGUgbG9jayB3b3Jrcy4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubG9jay5hY3F1aXJlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmRpdGlvbmFsIGFjcXVpcmluZyBvZiB0aGUgbG9jayBmYWlsZWQuIikKKworICAgIGRlZiB0ZXN0X2NvbmRfYWNxdWlyZV9mYWlsKHNlbGYpOgorICAgICAgICAjVGVzdCBhY3F1aXJpbmcgbG9ja2VkIGxvY2sgcmV0dXJucyBGYWxzZQorICAgICAgICBzZWxmLmxvY2suYWNxdWlyZSgwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYubG9jay5hY3F1aXJlKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmRpdGlvbmFsIGFjcXVpcmluZyBvZiBhIGxvY2tlZCBsb2NrIGluY29ycmVjdGx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3VjY2VlZGVkLiIpCisKKyAgICBkZWYgdGVzdF91bmNvbmRfYWNxdWlyZV9zdWNjZXNzKHNlbGYpOgorICAgICAgICAjTWFrZSBzdXJlIHVuY29uZGl0aW9uYWwgYWNxdWlyaW5nIG9mIGEgbG9jayB3b3Jrcy4KKyAgICAgICAgc2VsZi5sb2NrLmFjcXVpcmUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5sb2NrLmxvY2tlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuY29uZGlvbmFsIGxvY2tpbmcgZmFpbGVkLiIpCisKKyAgICBkZWYgdGVzdF91bmNvbmRfYWNxdWlyZV9yZXR1cm5fdmFsKHNlbGYpOgorICAgICAgICAjTWFrZSBzdXJlIHRoYXQgYW4gdW5jb25kaXRpb25hbCBsb2NraW5nIHJldHVybnMgVHJ1ZS4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubG9jay5hY3F1aXJlKDEpIGlzIFRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAiVW5jb25kaXRpb25hbCBsb2NraW5nIGRpZCBub3QgcmV0dXJuIFRydWUuIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubG9jay5hY3F1aXJlKCkgaXMgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3VuY29uZF9hY3F1aXJlX2Jsb2NraW5nKHNlbGYpOgorICAgICAgICAjTWFrZSBzdXJlIHRoYXQgdW5jb25kaXRpb25hbCBhY3F1aXJpbmcgb2YgYSBsb2NrZWQgbG9jayBibG9ja3MuCisgICAgICAgIGRlZiBkZWxheV91bmxvY2sodG9fdW5sb2NrLCBkZWxheSk6CisgICAgICAgICAgICAiIiJIb2xkIG9uIHRvIGxvY2sgZm9yIGEgc2V0IGFtb3VudCBvZiB0aW1lIGJlZm9yZSB1bmxvY2tpbmcuIiIiCisgICAgICAgICAgICB0aW1lLnNsZWVwKGRlbGF5KQorICAgICAgICAgICAgdG9fdW5sb2NrLnJlbGVhc2UoKQorCisgICAgICAgIHNlbGYubG9jay5hY3F1aXJlKCkKKyAgICAgICAgc3RhcnRfdGltZSA9IGludCh0aW1lLnRpbWUoKSkKKyAgICAgICAgX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkKGRlbGF5X3VubG9jaywoc2VsZi5sb2NrLCBERUxBWSkpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICIqKiogV2FpdGluZyBmb3IgdGhyZWFkIHRvIHJlbGVhc2UgdGhlIGxvY2sgIlwKKyAgICAgICAgICAgICIoYXBwcm94LiAlcyBzZWMuKSAqKioiICUgREVMQVkKKyAgICAgICAgc2VsZi5sb2NrLmFjcXVpcmUoKQorICAgICAgICBlbmRfdGltZSA9IGludCh0aW1lLnRpbWUoKSkKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiZG9uZSIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChlbmRfdGltZSAtIHN0YXJ0X3RpbWUpID49IERFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgIkJsb2NraW5nIGJ5IHVuY29uZGl0aW9uYWwgYWNxdWlyaW5nIGZhaWxlZC4iKQorCitjbGFzcyBNaXNjVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIk1pc2NlbGxhbmVvdXMgdGVzdHMuIiIiCisKKyAgICBkZWYgdGVzdF9leGl0KHNlbGYpOgorICAgICAgICAjTWFrZSBzdXJlIF90aHJlYWQuZXhpdCgpIHJhaXNlcyBTeXN0ZW1FeGl0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQsIF90aHJlYWQuZXhpdCkKKworICAgIGRlZiB0ZXN0X2lkZW50KHNlbGYpOgorICAgICAgICAjVGVzdCBzYW5pdHkgb2YgX3RocmVhZC5nZXRfaWRlbnQoKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoX3RocmVhZC5nZXRfaWRlbnQoKSwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl90aHJlYWQuZ2V0X2lkZW50KCkgcmV0dXJuZWQgYSBub24taW50ZWdlciIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfdGhyZWFkLmdldF9pZGVudCgpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiX3RocmVhZC5nZXRfaWRlbnQoKSByZXR1cm5lZCAwIikKKworICAgIGRlZiB0ZXN0X0xvY2tUeXBlKHNlbGYpOgorICAgICAgICAjTWFrZSBzdXJlIF90aHJlYWQuTG9ja1R5cGUgaXMgdGhlIHNhbWUgdHlwZSBhcyBfdGhyZWFkLmFsbG9jYXRlX2xvY2tlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKF90aHJlYWQuYWxsb2NhdGVfbG9jaygpLCBfdGhyZWFkLkxvY2tUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl90aHJlYWQuTG9ja1R5cGUgaXMgbm90IGFuIGluc3RhbmNlIG9mIHdoYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIHJldHVybmVkIGJ5IF90aHJlYWQuYWxsb2NhdGVfbG9jaygpIikKKworICAgIGRlZiB0ZXN0X2ludGVycnVwdF9tYWluKHNlbGYpOgorICAgICAgICAjQ2FsbGluZyBzdGFydF9uZXdfdGhyZWFkIHdpdGggYSBmdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIGludGVycnVwdF9tYWluCisgICAgICAgICMgc2hvdWxkIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0IHVwb24gY29tcGxldGlvbi4KKyAgICAgICAgZGVmIGNhbGxfaW50ZXJydXB0KCk6CisgICAgICAgICAgICBfdGhyZWFkLmludGVycnVwdF9tYWluKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5Ym9hcmRJbnRlcnJ1cHQsIF90aHJlYWQuc3RhcnRfbmV3X3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfaW50ZXJydXB0LCB0dXBsZSgpKQorCisgICAgZGVmIHRlc3RfaW50ZXJydXB0X2luX21haW4oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgaWYgaW50ZXJydXB0X21haW4gaXMgY2FsbGVkIGluIG1haW4gdGhyZWF0IHRoYXQKKyAgICAgICAgIyBLZXlib2FyZEludGVycnVwdCBpcyByYWlzZWQgaW5zdGFudGx5LgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlib2FyZEludGVycnVwdCwgX3RocmVhZC5pbnRlcnJ1cHRfbWFpbikKKworY2xhc3MgVGhyZWFkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhyZWFkIGNyZWF0aW9uLiIiIgorCisgICAgZGVmIHRlc3RfYXJnX3Bhc3Npbmcoc2VsZik6CisgICAgICAgICNNYWtlIHN1cmUgdGhhdCBwYXJhbWV0ZXIgcGFzc2luZyB3b3Jrcy4KKyAgICAgICAgZGVmIGFyZ190ZXN0ZXIocXVldWUsIGFyZzE9RmFsc2UsIGFyZzI9RmFsc2UpOgorICAgICAgICAgICAgIiIiVXNlIHRvIHRlc3QgX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkKCkgcGFzc2VzIGFyZ3MgcHJvcGVybHkuIiIiCisgICAgICAgICAgICBxdWV1ZS5wdXQoKGFyZzEsIGFyZzIpKQorCisgICAgICAgIHRlc3RpbmdfcXVldWUgPSBRdWV1ZS5RdWV1ZSgxKQorICAgICAgICBfdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoYXJnX3Rlc3RlciwgKHRlc3RpbmdfcXVldWUsIFRydWUsIFRydWUpKQorICAgICAgICByZXN1bHQgPSB0ZXN0aW5nX3F1ZXVlLmdldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHRbMF0gYW5kIHJlc3VsdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBwYXNzaW5nIGZvciB0aHJlYWQgY3JlYXRpb24gdXNpbmcgdHVwbGUgZmFpbGVkIikKKyAgICAgICAgX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkKGFyZ190ZXN0ZXIsIHR1cGxlKCksIHsncXVldWUnOnRlc3RpbmdfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyZzEnOlRydWUsICdhcmcyJzpUcnVlfSkKKyAgICAgICAgcmVzdWx0ID0gdGVzdGluZ19xdWV1ZS5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0WzBdIGFuZCByZXN1bHRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgcGFzc2luZyBmb3IgdGhyZWFkIGNyZWF0aW9uIHVzaW5nIGt3YXJncyBmYWlsZWQiKQorICAgICAgICBfdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoYXJnX3Rlc3RlciwgKHRlc3RpbmdfcXVldWUsIFRydWUpLCB7J2FyZzInOlRydWV9KQorICAgICAgICByZXN1bHQgPSB0ZXN0aW5nX3F1ZXVlLmdldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHRbMF0gYW5kIHJlc3VsdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBwYXNzaW5nIGZvciB0aHJlYWQgY3JlYXRpb24gdXNpbmcgYm90aCB0dXBsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIGt3YXJncyBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfbXVsdGlfY3JlYXRpb24oc2VsZik6CisgICAgICAgICNNYWtlIHN1cmUgbXVsdGlwbGUgdGhyZWFkcyBjYW4gYmUgY3JlYXRlZC4KKyAgICAgICAgZGVmIHF1ZXVlX21hcmsocXVldWUsIGRlbGF5KToKKyAgICAgICAgICAgICIiIldhaXQgZm9yIGBgZGVsYXlgYCBzZWNvbmRzIGFuZCB0aGVuIHB1dCBzb21ldGhpbmcgaW50byBgYHF1ZXVlYGAiIiIKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoZGVsYXkpCisgICAgICAgICAgICBxdWV1ZS5wdXQoX3RocmVhZC5nZXRfaWRlbnQoKSkKKworICAgICAgICB0aHJlYWRfY291bnQgPSA1CisgICAgICAgIHRlc3RpbmdfcXVldWUgPSBRdWV1ZS5RdWV1ZSh0aHJlYWRfY291bnQpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICIqKiogVGVzdGluZyBtdWx0aXBsZSB0aHJlYWQgY3JlYXRpb24gIlwKKyAgICAgICAgICAgICIod2lsbCB0YWtlIGFwcHJveC4gJXMgdG8gJXMgc2VjLikgKioqIiAlIChERUxBWSwgdGhyZWFkX2NvdW50KQorICAgICAgICBmb3IgY291bnQgaW4geHJhbmdlKHRocmVhZF9jb3VudCk6CisgICAgICAgICAgICBpZiBERUxBWToKKyAgICAgICAgICAgICAgICBsb2NhbF9kZWxheSA9IHJvdW5kKHJhbmRvbS5yYW5kb20oKSwgMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9jYWxfZGVsYXkgPSAwCisgICAgICAgICAgICBfdGhyZWFkLnN0YXJ0X25ld190aHJlYWQocXVldWVfbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVzdGluZ19xdWV1ZSwgbG9jYWxfZGVsYXkpKQorICAgICAgICB0aW1lLnNsZWVwKERFTEFZKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdkb25lJworICAgICAgICBzZWxmLmFzc2VydFRydWUodGVzdGluZ19xdWV1ZS5xc2l6ZSgpID09IHRocmVhZF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgYWxsICVzIHRocmVhZHMgZXhlY3V0ZWQgcHJvcGVybHkgYWZ0ZXIgJXMgc2VjLiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgKHRocmVhZF9jb3VudCwgREVMQVkpKQorCitkZWYgdGVzdF9tYWluKGltcG9ydGVkX21vZHVsZT1Ob25lKToKKyAgICBnbG9iYWwgX3RocmVhZCwgREVMQVkKKyAgICBpZiBpbXBvcnRlZF9tb2R1bGU6CisgICAgICAgIF90aHJlYWQgPSBpbXBvcnRlZF9tb2R1bGUKKyAgICAgICAgREVMQVkgPSAyCisgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICIqKiogVXNpbmcgJXMgYXMgX3RocmVhZCBtb2R1bGUgKioqIiAlIF90aHJlYWQKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KExvY2tUZXN0cywgTWlzY1Rlc3RzLCBUaHJlYWRUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtbXlfdGhyZWFkLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjNmM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtbXlfdGhyZWFkLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjNmM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtbXlfdGhyZWFkaW5nLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtbXlfdGhyZWFkaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNTlkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWRpbmcucHkKQEAgLTAsMCArMSw2MyBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGR1bW15X3RocmVhZGluZyBhcyBfdGhyZWFkaW5nCitpbXBvcnQgdGltZQorCitjbGFzcyBEdW1teVRocmVhZGluZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGNsYXNzIFRlc3RUaHJlYWQoX3RocmVhZGluZy5UaHJlYWQpOgorCisgICAgICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICAgICBnbG9iYWwgcnVubmluZworICAgICAgICAgICAgZ2xvYmFsIHNlbWEKKyAgICAgICAgICAgIGdsb2JhbCBtdXRleAorICAgICAgICAgICAgIyBVbmNvbW1lbnQgaWYgdGVzdGluZyBhbm90aGVyIG1vZHVsZSwgc3VjaCBhcyB0aGUgcmVhbCAndGhyZWFkaW5nJworICAgICAgICAgICAgIyBtb2R1bGUuCisgICAgICAgICAgICAjZGVsYXkgPSByYW5kb20ucmFuZG9tKCkgKiAyCisgICAgICAgICAgICBkZWxheSA9IDAKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICd0YXNrJywgc2VsZi5uYW1lLCAnd2lsbCBydW4gZm9yJywgZGVsYXksICdzZWMnCisgICAgICAgICAgICBzZW1hLmFjcXVpcmUoKQorICAgICAgICAgICAgbXV0ZXguYWNxdWlyZSgpCisgICAgICAgICAgICBydW5uaW5nICs9IDEKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IHJ1bm5pbmcsICd0YXNrcyBhcmUgcnVubmluZycKKyAgICAgICAgICAgIG11dGV4LnJlbGVhc2UoKQorICAgICAgICAgICAgdGltZS5zbGVlcChkZWxheSkKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICd0YXNrJywgc2VsZi5uYW1lLCAnZG9uZScKKyAgICAgICAgICAgIG11dGV4LmFjcXVpcmUoKQorICAgICAgICAgICAgcnVubmluZyAtPSAxCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICdpcyBmaW5pc2hlZC4nLCBydW5uaW5nLCAndGFza3MgYXJlIHJ1bm5pbmcnCisgICAgICAgICAgICBtdXRleC5yZWxlYXNlKCkKKyAgICAgICAgICAgIHNlbWEucmVsZWFzZSgpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubnVtdGFza3MgPSAxMAorICAgICAgICBnbG9iYWwgc2VtYQorICAgICAgICBzZW1hID0gX3RocmVhZGluZy5Cb3VuZGVkU2VtYXBob3JlKHZhbHVlPTMpCisgICAgICAgIGdsb2JhbCBtdXRleAorICAgICAgICBtdXRleCA9IF90aHJlYWRpbmcuUkxvY2soKQorICAgICAgICBnbG9iYWwgcnVubmluZworICAgICAgICBydW5uaW5nID0gMAorICAgICAgICBzZWxmLnRocmVhZHMgPSBbXQorCisgICAgZGVmIHRlc3RfdGFza3Moc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYubnVtdGFza3MpOgorICAgICAgICAgICAgdCA9IHNlbGYuVGVzdFRocmVhZChuYW1lPSI8dGhyZWFkICVkPiIlaSkKKyAgICAgICAgICAgIHNlbGYudGhyZWFkcy5hcHBlbmQodCkKKyAgICAgICAgICAgIHQuc3RhcnQoKQorCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ3dhaXRpbmcgZm9yIGFsbCB0YXNrcyB0byBjb21wbGV0ZScKKyAgICAgICAgZm9yIHQgaW4gc2VsZi50aHJlYWRzOgorICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnYWxsIHRhc2tzIGRvbmUnCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KER1bW15VGhyZWFkaW5nVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZGluZy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWRpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzkxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWRpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZGluZy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWRpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MzkxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWRpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2ZTBiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsLnB5CkBAIC0wLDAgKzEsMTQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZW1haWwgcGFja2FnZSB1bml0IHRlc3RzCisKKyMgVGhlIHNwZWNpZmljIHRlc3RzIG5vdyBsaXZlIGluIExpYi9lbWFpbC90ZXN0Citmcm9tIGVtYWlsLnRlc3QudGVzdF9lbWFpbCBpbXBvcnQgc3VpdGUKK2Zyb20gZW1haWwudGVzdC50ZXN0X2VtYWlsX3JlbmFtZWQgaW1wb3J0IHN1aXRlIGFzIHN1aXRlMgorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3Qoc3VpdGUoKSkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KHN1aXRlMigpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5MWFiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5MWFiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1MWY4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weQpAQCAtMCwwICsxLDE1IEBACisjIENvcHlyaWdodCAoQykgMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBlbWFpbCBwYWNrYWdlIHVuaXQgdGVzdHMgZm9yIChvcHRpb25hbCkgQXNpYW4gY29kZWNzCisKKyMgVGhlIHNwZWNpZmljIHRlc3RzIG5vdyBsaXZlIGluIExpYi9lbWFpbC90ZXN0Citmcm9tIGVtYWlsLnRlc3QgaW1wb3J0IHRlc3RfZW1haWxfY29kZWNzCitmcm9tIGVtYWlsLnRlc3QgaW1wb3J0IHRlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBzdWl0ZSA9IHRlc3RfZW1haWxfY29kZWNzLnN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHRlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQuc3VpdGUoKSkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KHN1aXRlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjFmZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjFmZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzgxNGRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQpAQCAtMCwwICsxLDEyIEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGVtYWlsIHBhY2thZ2UgdW5pdCB0ZXN0cworCisjIFRoZSBzcGVjaWZpYyB0ZXN0cyBub3cgbGl2ZSBpbiBMaWIvZW1haWwvdGVzdAorZnJvbSBlbWFpbC50ZXN0LnRlc3RfZW1haWxfcmVuYW1lZCBpbXBvcnQgc3VpdGUKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViYTRjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViYTRjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VudW1lcmF0ZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VudW1lcmF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjlmZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW51bWVyYXRlLnB5CkBAIC0wLDAgKzEsMjU1IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgRzoKKyAgICAnU2VxdWVuY2UgdXNpbmcgX19nZXRpdGVtX18nCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5zZXFuW2ldCisKK2NsYXNzIEk6CisgICAgJ1NlcXVlbmNlIHVzaW5nIGl0ZXJhdG9yIHByb3RvY29sJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmkgPj0gbGVuKHNlbGYuc2Vxbik6IHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgdiA9IHNlbGYuc2VxbltzZWxmLmldCisgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgIHJldHVybiB2CisKK2NsYXNzIElnOgorICAgICdTZXF1ZW5jZSB1c2luZyBpdGVyYXRvciBwcm90b2NvbCBkZWZpbmVkIHdpdGggYSBnZW5lcmF0b3InCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIGZvciB2YWwgaW4gc2VsZi5zZXFuOgorICAgICAgICAgICAgeWllbGQgdmFsCisKK2NsYXNzIFg6CisgICAgJ01pc3NpbmcgX19nZXRpdGVtX18gYW5kIF9faXRlcl9fJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaSA+PSBsZW4oc2VsZi5zZXFuKTogcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICB2ID0gc2VsZi5zZXFuW3NlbGYuaV0KKyAgICAgICAgc2VsZi5pICs9IDEKKyAgICAgICAgcmV0dXJuIHYKKworY2xhc3MgRToKKyAgICAnVGVzdCBwcm9wYWdhdGlvbiBvZiBleGNlcHRpb25zJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAzIC8vIDAKKworY2xhc3MgTjoKKyAgICAnSXRlcmF0b3IgbWlzc2luZyBuZXh0KCknCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKK2NsYXNzIEVudW1lcmF0ZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGVudW0gPSBlbnVtZXJhdGUKKyAgICBzZXEsIHJlcyA9ICdhYmMnLCBbKDAsJ2EnKSwgKDEsJ2InKSwgKDIsJ2MnKV0KKworICAgIGRlZiB0ZXN0X2Jhc2ljZnVuY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzZWxmLmVudW0oc2VsZi5zZXEpKSwgc2VsZi5lbnVtKQorICAgICAgICBlID0gc2VsZi5lbnVtKHNlbGYuc2VxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZXIoZSksIGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzZWxmLmVudW0oc2VsZi5zZXEpKSwgc2VsZi5yZXMpCisgICAgICAgIHNlbGYuZW51bS5fX2RvY19fCisKKyAgICBkZWYgdGVzdF9nZXRpdGVtc2VxbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHNlbGYuZW51bShHKHNlbGYuc2VxKSkpLCBzZWxmLnJlcykKKyAgICAgICAgZSA9IHNlbGYuZW51bShHKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgZS5uZXh0KQorCisgICAgZGVmIHRlc3RfaXRlcmF0b3JzZXFuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc2VsZi5lbnVtKEkoc2VsZi5zZXEpKSksIHNlbGYucmVzKQorICAgICAgICBlID0gc2VsZi5lbnVtKEkoJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBlLm5leHQpCisKKyAgICBkZWYgdGVzdF9pdGVyYXRvcmdlbmVyYXRvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHNlbGYuZW51bShJZyhzZWxmLnNlcSkpKSwgc2VsZi5yZXMpCisgICAgICAgIGUgPSBzZWxmLmVudW0oSWcoJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBlLm5leHQpCisKKyAgICBkZWYgdGVzdF9ub25pdGVyYWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmVudW0sIFgoc2VsZi5zZXEpKQorCisgICAgZGVmIHRlc3RfaWxsZm9ybWVkaXRlcmFibGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCwgc2VsZi5lbnVtKE4oc2VsZi5zZXEpKSkKKworICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbl9wcm9wYWdhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGxpc3QsIHNlbGYuZW51bShFKHNlbGYuc2VxKSkpCisKKyAgICBkZWYgdGVzdF9hcmd1bWVudGNoZWNrKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZW51bSkgIyBubyBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmVudW0sIDEpICMgd3JvbmcgdHlwZSAobm90IGl0ZXJhYmxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZW51bSwgJ2FiYycsICdhJykgIyB3cm9uZyB0eXBlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5lbnVtLCAnYWJjJywgMiwgMykgIyB0b28gbWFueSBhcmd1bWVudHMKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfdHVwbGVfcmV1c2Uoc2VsZik6CisgICAgICAgICMgVGVzdHMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIHdoZXJlIHR1cGxlIGlzIHJldXNlZAorICAgICAgICAjIHdoZW5ldmVyIG5vdGhpbmcgZWxzZSBob2xkcyBhIHJlZmVyZW5jZSB0byBpdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXQobWFwKGlkLCBsaXN0KGVudW1lcmF0ZShzZWxmLnNlcSkpKSkpLCBsZW4oc2VsZi5zZXEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXQobWFwKGlkLCBlbnVtZXJhdGUoc2VsZi5zZXEpKSkpLCBtaW4oMSxsZW4oc2VsZi5zZXEpKSkKKworY2xhc3MgTXlFbnVtKGVudW1lcmF0ZSk6CisgICAgcGFzcworCitjbGFzcyBTdWJjbGFzc1Rlc3RDYXNlKEVudW1lcmF0ZVRlc3RDYXNlKToKKworICAgIGVudW0gPSBNeUVudW0KKworY2xhc3MgVGVzdEVtcHR5KEVudW1lcmF0ZVRlc3RDYXNlKToKKworICAgIHNlcSwgcmVzID0gJycsIFtdCisKK2NsYXNzIFRlc3RCaWcoRW51bWVyYXRlVGVzdENhc2UpOgorCisgICAgc2VxID0gcmFuZ2UoMTAsMjAwMDAsMikKKyAgICByZXMgPSB6aXAocmFuZ2UoMjAwMDApLCBzZXEpCisKK2NsYXNzIFRlc3RSZXZlcnNlZCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgaSA8IDU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIoaSkKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNQorICAgICAgICBmb3IgZGF0YSBpbiAnYWJjJywgcmFuZ2UoNSksIHR1cGxlKGVudW1lcmF0ZSgnYWJjJykpLCBBKCksIHhyYW5nZSgxLDE3LDUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGRhdGEpWzo6LTFdLCBsaXN0KHJldmVyc2VkKGRhdGEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXZlcnNlZCwge30pCisgICAgICAgICMgZG9uJ3QgYWxsb3cga2V5d29yZCBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXZlcnNlZCwgW10sIGE9MSkKKworICAgIGRlZiB0ZXN0X2NsYXNzaWNfY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBbMiwgMV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJldmVyc2VkKEEoKSkpLCBbMiwgMV0pCisKKyAgICBkZWYgdGVzdF94cmFuZ2Vfb3B0aW1pemF0aW9uKHNlbGYpOgorICAgICAgICB4ID0geHJhbmdlKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXZlcnNlZCh4KSksIHR5cGUoaXRlcih4KSkpCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgIyBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgbm90IGFuIGludGVyZmFjZSByZXF1aXJlbWVudAorICAgICAgICBmcm9tIHRlc3QudGVzdF9pdGVybGVuIGltcG9ydCBsZW4KKyAgICAgICAgZm9yIHMgaW4gKCdoZWxsbycsIHR1cGxlKCdoZWxsbycpLCBsaXN0KCdoZWxsbycpLCB4cmFuZ2UoNSkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmV2ZXJzZWQocykpLCBsZW4ocykpCisgICAgICAgICAgICByID0gcmV2ZXJzZWQocykKKyAgICAgICAgICAgIGxpc3QocikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHIpLCAwKQorICAgICAgICBjbGFzcyBTZXFXaXRoV2VpcmRMZW46CisgICAgICAgICAgICBjYWxsZWQgPSBGYWxzZQorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuY2FsbGVkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEwCisgICAgICAgICAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4CisgICAgICAgIHIgPSByZXZlcnNlZChTZXFXaXRoV2VpcmRMZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGxlbiwgcikKKworCisgICAgZGVmIHRlc3RfZ2Moc2VsZik6CisgICAgICAgIGNsYXNzIFNlcToKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAxMAorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXgKKyAgICAgICAgcyA9IFNlcSgpCisgICAgICAgIHIgPSByZXZlcnNlZChzKQorICAgICAgICBzLnIgPSByCisKKyAgICBkZWYgdGVzdF9hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJldmVyc2VkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJldmVyc2VkLCBbXSwgJ2V4dHJhJykKKworICAgIGRlZiB0ZXN0X2J1ZzEyMjk0Mjkoc2VsZik6CisgICAgICAgICMgdGhpcyBidWcgd2FzIG5ldmVyIGluIHJldmVyc2VkLCBpdCB3YXMgaW4KKyAgICAgICAgIyBQeU9iamVjdF9DYWxsTWV0aG9kLCBhbmQgcmV2ZXJzZWRfbmV3IGNhbGxzIHRoYXQgc29tZXRpbWVzLgorICAgICAgICBpZiBub3QgaGFzYXR0cihzeXMsICJnZXRyZWZjb3VudCIpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHIgPSBmLl9fcmV2ZXJzZWRfXyA9IG9iamVjdCgpCisgICAgICAgIHJjID0gc3lzLmdldHJlZmNvdW50KHIpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXZlcnNlZChmKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgibm9uLWNhbGxhYmxlIF9fcmV2ZXJzZWRfXyBkaWRuJ3QgcmFpc2UhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgc3lzLmdldHJlZmNvdW50KHIpKQorCisgICAgZGVmIHRlc3Rfb2JqbWV0aG9kcyhzZWxmKToKKyAgICAgICAgIyBPYmplY3RzIG11c3QgaGF2ZSBfX2xlbl9fKCkgYW5kIF9fZ2V0aXRlbV9fKCkgaW1wbGVtZW50ZWQuCisgICAgICAgIGNsYXNzIE5vTGVuKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZik6IHJldHVybiAxCisgICAgICAgIG5sID0gTm9MZW4oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJldmVyc2VkLCBubCkKKworICAgICAgICBjbGFzcyBOb0dldEl0ZW0ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gMgorICAgICAgICBuZ2kgPSBOb0dldEl0ZW0oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJldmVyc2VkLCBuZ2kpCisKKworY2xhc3MgRW51bWVyYXRlU3RhcnRUZXN0Q2FzZShFbnVtZXJhdGVUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9iYXNpY2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICBlID0gc2VsZi5lbnVtKHNlbGYuc2VxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZXIoZSksIGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzZWxmLmVudW0oc2VsZi5zZXEpKSwgc2VsZi5yZXMpCisKKworY2xhc3MgVGVzdFN0YXJ0KEVudW1lcmF0ZVN0YXJ0VGVzdENhc2UpOgorCisgICAgZW51bSA9IGxhbWJkYSBzZWxmLCBpOiBlbnVtZXJhdGUoaSwgc3RhcnQ9MTEpCisgICAgc2VxLCByZXMgPSAnYWJjJywgWygxMSwgJ2EnKSwgKDEyLCAnYicpLCAoMTMsICdjJyldCisKKworY2xhc3MgVGVzdExvbmdTdGFydChFbnVtZXJhdGVTdGFydFRlc3RDYXNlKToKKworICAgIGVudW0gPSBsYW1iZGEgc2VsZiwgaTogZW51bWVyYXRlKGksIHN0YXJ0PXN5cy5tYXhpbnQrMSkKKyAgICBzZXEsIHJlcyA9ICdhYmMnLCBbKHN5cy5tYXhpbnQrMSwnYScpLCAoc3lzLm1heGludCsyLCdiJyksCisgICAgICAgICAgICAgICAgICAgICAgIChzeXMubWF4aW50KzMsJ2MnKV0KKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBwcmludCBjb3VudHMKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW51bWVyYXRlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VudW1lcmF0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxOWRmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VudW1lcmF0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW51bWVyYXRlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VudW1lcmF0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxOWRmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VudW1lcmF0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW9mLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW9mLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MzkxN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lb2YucHkKQEAgLTAsMCArMSwzMiBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIidGVzdCBzY3JpcHQgZm9yIGEgZmV3IG5ldyBpbnZhbGlkIHRva2VuIGNhdGNoZXMiIiIKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBFT0ZUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfRU9GQyhzZWxmKToKKyAgICAgICAgZXhwZWN0ID0gIkVPTCB3aGlsZSBzY2FubmluZyBzdHJpbmcgbGl0ZXJhbCAoPHN0cmluZz4sIGxpbmUgMSkiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV2YWwoIiIiJ3RoaXMgaXMgYSB0ZXN0XAorICAgICAgICAgICAgIiIiKQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG1zZyksIGV4cGVjdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkCisKKyAgICBkZWYgdGVzdF9FT0ZTKHNlbGYpOgorICAgICAgICBleHBlY3QgPSAoIkVPRiB3aGlsZSBzY2FubmluZyB0cmlwbGUtcXVvdGVkIHN0cmluZyBsaXRlcmFsICIKKyAgICAgICAgICAgICAgICAgICIoPHN0cmluZz4sIGxpbmUgMSkiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBldmFsKCIiIicnJ3RoaXMgaXMgYSB0ZXN0IiIiKQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG1zZyksIGV4cGVjdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEVPRlRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lb2YucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW9mLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWYzNTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW9mLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lb2YucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW9mLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWYzNTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW9mLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcG9sbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vwb2xsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmQ5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcG9sbC5weQpAQCAtMCwwICsxLDIyMiBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiBUd2lzdGVkIE1hdHJpeCBMYWJvcmF0b3JpZXMuCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworIyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyMgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworIyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisjIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworIyBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorIyBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisjIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorIyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorIyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisjIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyMgT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisjIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIiIiCitUZXN0cyBmb3IgZXBvbGwgd3JhcHBlci4KKyIiIgoraW1wb3J0IHNvY2tldAoraW1wb3J0IGVycm5vCitpbXBvcnQgdGltZQoraW1wb3J0IHNlbGVjdAoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpZiBub3QgaGFzYXR0cihzZWxlY3QsICJlcG9sbCIpOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJ0ZXN0IHdvcmtzIG9ubHkgb24gTGludXggMi42IikKKwordHJ5OgorICAgIHNlbGVjdC5lcG9sbCgpCitleGNlcHQgSU9FcnJvciwgZToKKyAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT1NZUzoKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoImtlcm5lbCBkb2Vzbid0IHN1cHBvcnQgZXBvbGwoKSIpCisgICAgcmFpc2UKKworY2xhc3MgVGVzdEVQb2xsKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXJTb2NrZXQgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgc2VsZi5zZXJ2ZXJTb2NrZXQuYmluZCgoJzEyNy4wLjAuMScsIDApKQorICAgICAgICBzZWxmLnNlcnZlclNvY2tldC5saXN0ZW4oMSkKKyAgICAgICAgc2VsZi5jb25uZWN0aW9ucyA9IFtzZWxmLnNlcnZlclNvY2tldF0KKworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmb3Igc2t0IGluIHNlbGYuY29ubmVjdGlvbnM6CisgICAgICAgICAgICBza3QuY2xvc2UoKQorCisgICAgZGVmIF9jb25uZWN0ZWRfcGFpcihzZWxmKToKKyAgICAgICAgY2xpZW50ID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIGNsaWVudC5zZXRibG9ja2luZyhGYWxzZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xpZW50LmNvbm5lY3QoKCcxMjcuMC4wLjEnLCBzZWxmLnNlcnZlclNvY2tldC5nZXRzb2NrbmFtZSgpWzFdKSkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCBlcnJuby5FSU5QUk9HUkVTUykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJDb25uZWN0IHNob3VsZCBoYXZlIHJhaXNlZCBFSU5QUk9HUkVTUyIpCisgICAgICAgIHNlcnZlciwgYWRkciA9IHNlbGYuc2VydmVyU29ja2V0LmFjY2VwdCgpCisKKyAgICAgICAgc2VsZi5jb25uZWN0aW9ucy5leHRlbmQoKGNsaWVudCwgc2VydmVyKSkKKyAgICAgICAgcmV0dXJuIGNsaWVudCwgc2VydmVyCisKKyAgICBkZWYgdGVzdF9jcmVhdGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVwID0gc2VsZWN0LmVwb2xsKDE2KQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKHN0cihlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVwLmZpbGVubygpID4gMCwgZXAuZmlsZW5vKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXAuY2xvc2VkKQorICAgICAgICBlcC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcC5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGVwLmZpbGVubykKKworICAgIGRlZiB0ZXN0X2JhZGNyZWF0ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxlY3QuZXBvbGwsIDEsIDIsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZWN0LmVwb2xsLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxlY3QuZXBvbGwsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZWN0LmVwb2xsLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxlY3QuZXBvbGwsIFsnZm9vJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZWN0LmVwb2xsLCB7fSkKKworICAgIGRlZiB0ZXN0X2FkZChzZWxmKToKKyAgICAgICAgc2VydmVyLCBjbGllbnQgPSBzZWxmLl9jb25uZWN0ZWRfcGFpcigpCisKKyAgICAgICAgZXAgPSBzZWxlY3QuZXBvbGwoMikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXAucmVnaXN0ZXIoc2VydmVyLmZpbGVubygpLCBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCkKKyAgICAgICAgICAgIGVwLnJlZ2lzdGVyKGNsaWVudC5maWxlbm8oKSwgc2VsZWN0LkVQT0xMSU4gfCBzZWxlY3QuRVBPTExPVVQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBlcC5jbG9zZSgpCisKKyAgICAgICAgIyBhZGRpbmcgYnkgb2JqZWN0IHcvIGZpbGVubyB3b3JrcywgdG9vLgorICAgICAgICBlcCA9IHNlbGVjdC5lcG9sbCgyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBlcC5yZWdpc3RlcihzZXJ2ZXIsIHNlbGVjdC5FUE9MTElOIHwgc2VsZWN0LkVQT0xMT1VUKQorICAgICAgICAgICAgZXAucmVnaXN0ZXIoY2xpZW50LCBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGVwLmNsb3NlKCkKKworICAgICAgICBlcCA9IHNlbGVjdC5lcG9sbCgyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFR5cGVFcnJvcjogYXJndW1lbnQgbXVzdCBiZSBhbiBpbnQsIG9yIGhhdmUgYSBmaWxlbm8oKSBtZXRob2QuCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGVwLnJlZ2lzdGVyLCBvYmplY3QoKSwKKyAgICAgICAgICAgICAgICBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXAucmVnaXN0ZXIsIE5vbmUsCisgICAgICAgICAgICAgICAgc2VsZWN0LkVQT0xMSU4gfCBzZWxlY3QuRVBPTExPVVQpCisgICAgICAgICAgICAjIFZhbHVlRXJyb3I6IGZpbGUgZGVzY3JpcHRvciBjYW5ub3QgYmUgYSBuZWdhdGl2ZSBpbnRlZ2VyICgtMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGVwLnJlZ2lzdGVyLCAtMSwKKyAgICAgICAgICAgICAgICBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCkKKyAgICAgICAgICAgICMgSU9FcnJvcjogW0Vycm5vIDldIEJhZCBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGVwLnJlZ2lzdGVyLCAxMDAwMCwKKyAgICAgICAgICAgICAgICBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCkKKyAgICAgICAgICAgICMgcmVnaXN0ZXJpbmcgdHdpY2UgYWxzbyByYWlzZXMgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICBlcC5yZWdpc3RlcihzZXJ2ZXIsIHNlbGVjdC5FUE9MTElOIHwgc2VsZWN0LkVQT0xMT1VUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZXAucmVnaXN0ZXIsIHNlcnZlciwKKyAgICAgICAgICAgICAgICBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGVwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2Zyb21mZChzZWxmKToKKyAgICAgICAgc2VydmVyLCBjbGllbnQgPSBzZWxmLl9jb25uZWN0ZWRfcGFpcigpCisKKyAgICAgICAgZXAgPSBzZWxlY3QuZXBvbGwoMikKKyAgICAgICAgZXAyID0gc2VsZWN0LmVwb2xsLmZyb21mZChlcC5maWxlbm8oKSkKKworICAgICAgICBlcDIucmVnaXN0ZXIoc2VydmVyLmZpbGVubygpLCBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCkKKyAgICAgICAgZXAyLnJlZ2lzdGVyKGNsaWVudC5maWxlbm8oKSwgc2VsZWN0LkVQT0xMSU4gfCBzZWxlY3QuRVBPTExPVVQpCisKKyAgICAgICAgZXZlbnRzID0gZXAucG9sbCgxLCA0KQorICAgICAgICBldmVudHMyID0gZXAyLnBvbGwoMC45LCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihldmVudHMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihldmVudHMyKSwgMikKKworICAgICAgICBlcC5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVwMi5wb2xsKDEsIDQpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sIGVycm5vLkVCQURGLCBlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJlcG9sbCBvbiBjbG9zZWQgZmQgZGlkbid0IHJhaXNlIEVCQURGIikKKworICAgIGRlZiB0ZXN0X2NvbnRyb2xfYW5kX3dhaXQoc2VsZik6CisgICAgICAgIGNsaWVudCwgc2VydmVyID0gc2VsZi5fY29ubmVjdGVkX3BhaXIoKQorCisgICAgICAgIGVwID0gc2VsZWN0LmVwb2xsKDE2KQorICAgICAgICBlcC5yZWdpc3RlcihzZXJ2ZXIuZmlsZW5vKCksCisgICAgICAgICAgICAgICAgICAgc2VsZWN0LkVQT0xMSU4gfCBzZWxlY3QuRVBPTExPVVQgfCBzZWxlY3QuRVBPTExFVCkKKyAgICAgICAgZXAucmVnaXN0ZXIoY2xpZW50LmZpbGVubygpLAorICAgICAgICAgICAgICAgICAgIHNlbGVjdC5FUE9MTElOIHwgc2VsZWN0LkVQT0xMT1VUIHwgc2VsZWN0LkVQT0xMRVQpCisKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgZXZlbnRzID0gZXAucG9sbCgxLCA0KQorICAgICAgICB0aGVuID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0aGVuIC0gbm93ID4gMC4xLCB0aGVuIC0gbm93KQorCisgICAgICAgIGV2ZW50cy5zb3J0KCkKKyAgICAgICAgZXhwZWN0ZWQgPSBbKGNsaWVudC5maWxlbm8oKSwgc2VsZWN0LkVQT0xMT1VUKSwKKyAgICAgICAgICAgICAgICAgICAgKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LkVQT0xMT1VUKV0KKyAgICAgICAgZXhwZWN0ZWQuc29ydCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHRoZW4gLSBub3cgPiAwLjAxLCB0aGVuIC0gbm93KQorCisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIGV2ZW50cyA9IGVwLnBvbGwodGltZW91dD0yLjEsIG1heGV2ZW50cz00KQorICAgICAgICB0aGVuID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShldmVudHMpCisKKyAgICAgICAgY2xpZW50LnNlbmQoIkhlbGxvISIpCisgICAgICAgIHNlcnZlci5zZW5kKCJ3b3JsZCEhISIpCisKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgZXZlbnRzID0gZXAucG9sbCgxLCA0KQorICAgICAgICB0aGVuID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0aGVuIC0gbm93ID4gMC4wMSkKKworICAgICAgICBldmVudHMuc29ydCgpCisgICAgICAgIGV4cGVjdGVkID0gWyhjbGllbnQuZmlsZW5vKCksIHNlbGVjdC5FUE9MTElOIHwgc2VsZWN0LkVQT0xMT1VUKSwKKyAgICAgICAgICAgICAgICAgICAgKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LkVQT0xMSU4gfCBzZWxlY3QuRVBPTExPVVQpXQorICAgICAgICBleHBlY3RlZC5zb3J0KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgZXhwZWN0ZWQpCisKKyAgICAgICAgZXAudW5yZWdpc3RlcihjbGllbnQuZmlsZW5vKCkpCisgICAgICAgIGVwLm1vZGlmeShzZXJ2ZXIuZmlsZW5vKCksIHNlbGVjdC5FUE9MTE9VVCkKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgZXZlbnRzID0gZXAucG9sbCgxLCA0KQorICAgICAgICB0aGVuID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0aGVuIC0gbm93ID4gMC4wMSkKKworICAgICAgICBleHBlY3RlZCA9IFsoc2VydmVyLmZpbGVubygpLCBzZWxlY3QuRVBPTExPVVQpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGVjdC5lcG9sbCwgLTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGVjdC5lcG9sbCgpLnJlZ2lzdGVyLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LkVQT0xMSU4pCisKKyAgICBkZWYgdGVzdF91bnJlZ2lzdGVyX2Nsb3NlZChzZWxmKToKKyAgICAgICAgc2VydmVyLCBjbGllbnQgPSBzZWxmLl9jb25uZWN0ZWRfcGFpcigpCisgICAgICAgIGZkID0gc2VydmVyLmZpbGVubygpCisgICAgICAgIGVwID0gc2VsZWN0LmVwb2xsKDE2KQorICAgICAgICBlcC5yZWdpc3RlcihzZXJ2ZXIpCisKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgZXZlbnRzID0gZXAucG9sbCgxLCA0KQorICAgICAgICB0aGVuID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0aGVuIC0gbm93ID4gMC4wMSkKKworICAgICAgICBzZXJ2ZXIuY2xvc2UoKQorICAgICAgICBlcC51bnJlZ2lzdGVyKGZkKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0RVBvbGwpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vwb2xsLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vwb2xsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjU5ZmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXBvbGwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vwb2xsLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vwb2xsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjU5ZmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXBvbGwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vycm5vLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXJybm8ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmI4OTE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vycm5vLnB5CkBAIC0wLDAgKzEsNDAgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIlRlc3QgdGhlIGVycm5vIG1vZHVsZQorICAgUm9nZXIgRS4gTWFzc2UKKyIiIgorCitpbXBvcnQgZXJybm8KK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKKworc3RkX2NfZXJyb3JzID0gZnJvemVuc2V0KFsnRURPTScsICdFUkFOR0UnXSkKKworY2xhc3MgRXJybm9BdHRyaWJ1dGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9mb3JfaW1wcm9wZXJfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgIyBObyB1bmV4cGVjdGVkIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIG9uIHRoZSBtb2R1bGUuCisgICAgICAgIGZvciBlcnJvcl9jb2RlIGluIHN0ZF9jX2Vycm9yczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGVycm5vLCBlcnJvcl9jb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJybm8gaXMgbWlzc2luZyAlcyIgJSBlcnJvcl9jb2RlKQorCisgICAgZGVmIHRlc3RfdXNpbmdfZXJyb3Jjb2RlKHNlbGYpOgorICAgICAgICAjIEV2ZXJ5IGtleSB2YWx1ZSBpbiBlcnJuby5lcnJvcmNvZGUgc2hvdWxkIGJlIG9uIHRoZSBtb2R1bGUuCisgICAgICAgIGZvciB2YWx1ZSBpbiBlcnJuby5lcnJvcmNvZGUuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZXJybm8sIHZhbHVlKSwgJ25vICVzIGF0dHIgaW4gZXJybm8nICUgdmFsdWUpCisKKworY2xhc3MgRXJyb3Jjb2RlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlc19pbl9lcnJvcmNvZGUoc2VsZik6CisgICAgICAgIGZvciBhdHRyaWJ1dGUgaW4gZXJybm8uX19kaWN0X18uaXRlcmtleXMoKToKKyAgICAgICAgICAgIGlmIGF0dHJpYnV0ZS5pc3VwcGVyKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihnZXRhdHRyKGVycm5vLCBhdHRyaWJ1dGUpLCBlcnJuby5lcnJvcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm8gJXMgYXR0ciBpbiBlcnJuby5lcnJvcmNvZGUnICUgYXR0cmlidXRlKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEVycm5vQXR0cmlidXRlVGVzdHMsIEVycm9yY29kZVRlc3RzKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vycm5vLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vycm5vLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWU0OTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXJybm8ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vycm5vLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vycm5vLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWU0OTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXJybm8ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbl92YXJpYXRpb25zLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXhjZXB0aW9uX3ZhcmlhdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlNzVlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbl92YXJpYXRpb25zLnB5CkBAIC0wLDAgKzEsMTgwIEBACisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIEV4Y2VwdGlvblRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF90cnlfZXhjZXB0X2Vsc2VfZmluYWxseShzZWxmKToKKyAgICAgICAgaGl0X2V4Y2VwdCA9IEZhbHNlCisgICAgICAgIGhpdF9lbHNlID0gRmFsc2UKKyAgICAgICAgaGl0X2ZpbmFsbHkgPSBGYWxzZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiwgJ255YWEhJworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBoaXRfZXhjZXB0ID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGl0X2Vsc2UgPSBUcnVlCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBoaXRfZmluYWxseSA9IFRydWUKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaGl0X2V4Y2VwdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9maW5hbGx5KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhpdF9lbHNlKQorCisgICAgZGVmIHRlc3RfdHJ5X2V4Y2VwdF9lbHNlX2ZpbmFsbHlfbm9fZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBoaXRfZXhjZXB0ID0gRmFsc2UKKyAgICAgICAgaGl0X2Vsc2UgPSBGYWxzZQorICAgICAgICBoaXRfZmluYWxseSA9IEZhbHNlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBoaXRfZXhjZXB0ID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGl0X2Vsc2UgPSBUcnVlCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBoaXRfZmluYWxseSA9IFRydWUKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhpdF9leGNlcHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoaXRfZmluYWxseSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9lbHNlKQorCisgICAgZGVmIHRlc3RfdHJ5X2V4Y2VwdF9maW5hbGx5KHNlbGYpOgorICAgICAgICBoaXRfZXhjZXB0ID0gRmFsc2UKKyAgICAgICAgaGl0X2ZpbmFsbHkgPSBGYWxzZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiwgJ3lhcnIhJworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBoaXRfZXhjZXB0ID0gVHJ1ZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaGl0X2ZpbmFsbHkgPSBUcnVlCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9leGNlcHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoaXRfZmluYWxseSkKKworICAgIGRlZiB0ZXN0X3RyeV9leGNlcHRfZmluYWxseV9ub19leGNlcHRpb24oc2VsZik6CisgICAgICAgIGhpdF9leGNlcHQgPSBGYWxzZQorICAgICAgICBoaXRfZmluYWxseSA9IEZhbHNlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBoaXRfZXhjZXB0ID0gVHJ1ZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaGl0X2ZpbmFsbHkgPSBUcnVlCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoaXRfZXhjZXB0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGl0X2ZpbmFsbHkpCisKKyAgICBkZWYgdGVzdF90cnlfZXhjZXB0KHNlbGYpOgorICAgICAgICBoaXRfZXhjZXB0ID0gRmFsc2UKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sICdhaG95IScKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaGl0X2V4Y2VwdCA9IFRydWUKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaGl0X2V4Y2VwdCkKKworICAgIGRlZiB0ZXN0X3RyeV9leGNlcHRfbm9fZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBoaXRfZXhjZXB0ID0gRmFsc2UKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGhpdF9leGNlcHQgPSBUcnVlCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoaXRfZXhjZXB0KQorCisgICAgZGVmIHRlc3RfdHJ5X2V4Y2VwdF9lbHNlKHNlbGYpOgorICAgICAgICBoaXRfZXhjZXB0ID0gRmFsc2UKKyAgICAgICAgaGl0X2Vsc2UgPSBGYWxzZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiwgJ2ZvbyEnCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGhpdF9leGNlcHQgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoaXRfZWxzZSA9IFRydWUKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhpdF9lbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGl0X2V4Y2VwdCkKKworICAgIGRlZiB0ZXN0X3RyeV9leGNlcHRfZWxzZV9ub19leGNlcHRpb24oc2VsZik6CisgICAgICAgIGhpdF9leGNlcHQgPSBGYWxzZQorICAgICAgICBoaXRfZWxzZSA9IEZhbHNlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBoaXRfZXhjZXB0ID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGl0X2Vsc2UgPSBUcnVlCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoaXRfZXhjZXB0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGl0X2Vsc2UpCisKKyAgICBkZWYgdGVzdF90cnlfZmluYWxseV9ub19leGNlcHRpb24oc2VsZik6CisgICAgICAgIGhpdF9maW5hbGx5ID0gRmFsc2UKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBoaXRfZmluYWxseSA9IFRydWUKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaGl0X2ZpbmFsbHkpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWQoc2VsZik6CisgICAgICAgIGhpdF9maW5hbGx5ID0gRmFsc2UKKyAgICAgICAgaGl0X2lubmVyX2V4Y2VwdCA9IEZhbHNlCisgICAgICAgIGhpdF9pbm5lcl9maW5hbGx5ID0gRmFsc2UKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLCAnaW5uZXIgZXhjZXB0aW9uJworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGhpdF9pbm5lcl9leGNlcHQgPSBUcnVlCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGhpdF9pbm5lcl9maW5hbGx5ID0gVHJ1ZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaGl0X2ZpbmFsbHkgPSBUcnVlCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9pbm5lcl9leGNlcHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoaXRfaW5uZXJfZmluYWxseSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9maW5hbGx5KQorCisgICAgZGVmIHRlc3RfbmVzdGVkX2Vsc2Uoc2VsZik6CisgICAgICAgIGhpdF9lbHNlID0gRmFsc2UKKyAgICAgICAgaGl0X2ZpbmFsbHkgPSBGYWxzZQorICAgICAgICBoaXRfZXhjZXB0ID0gRmFsc2UKKyAgICAgICAgaGl0X2lubmVyX2V4Y2VwdCA9IEZhbHNlCisgICAgICAgIGhpdF9pbm5lcl9lbHNlID0gRmFsc2UKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGhpdF9pbm5lcl9leGNlcHQgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGhpdF9pbm5lcl9lbHNlID0gVHJ1ZQorCisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sICdvdXRlciBleGNlcHRpb24nCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGhpdF9leGNlcHQgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoaXRfZWxzZSA9IFRydWUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGhpdF9maW5hbGx5ID0gVHJ1ZQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGl0X2lubmVyX2V4Y2VwdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9pbm5lcl9lbHNlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhpdF9lbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGl0X2ZpbmFsbHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoaXRfZXhjZXB0KQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEV4Y2VwdGlvblRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25fdmFyaWF0aW9ucy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25fdmFyaWF0aW9ucy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3MGYxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbl92YXJpYXRpb25zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25fdmFyaWF0aW9ucy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25fdmFyaWF0aW9ucy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3MGYxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbl92YXJpYXRpb25zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDg1Y2JhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQpAQCAtMCwwICsxLDY0NiBAQAorIyBQeXRob24gdGVzdCBzZXQgLS0gcGFydCA1LCBidWlsdC1pbiBleGNlcHRpb25zCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgcGlja2xlLCBjUGlja2xlCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IChURVNURk4sIHVubGluaywgcnVuX3VuaXR0ZXN0LCBjYXB0dXJlZF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfd2FybmluZ3MsIGNweXRob25fb25seSkKK2Zyb20gdGVzdC50ZXN0X3BlcDM1MiBpbXBvcnQgaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzCisKKyMgWFhYIFRoaXMgaXMgbm90IHJlYWxseSBlbm91Z2gsIGVhY2ggKm9wZXJhdGlvbiogc2hvdWxkIGJlIHRlc3RlZCEKKworY2xhc3MgRXhjZXB0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RSZWxvYWQoc2VsZik6CisgICAgICAgICMgUmVsb2FkaW5nIHRoZSBidWlsdC1pbiBleGNlcHRpb25zIG1vZHVsZSBmYWlsZWQgcHJpb3IgdG8gUHkyLjIsIHdoaWxlIGl0CisgICAgICAgICMgc2hvdWxkIGFjdCB0aGUgc2FtZSBhcyByZWxvYWRpbmcgYnVpbHQtaW4gc3lzLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGltcCBpbXBvcnQgcmVsb2FkCisgICAgICAgICAgICBpbXBvcnQgZXhjZXB0aW9ucworICAgICAgICAgICAgcmVsb2FkKGV4Y2VwdGlvbnMpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmVsb2FkaW5nIGV4Y2VwdGlvbnM6ICVzIiAlIGUpCisKKyAgICBkZWYgcmFpc2VfY2F0Y2goc2VsZiwgZXhjLCBleGNuYW1lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgZXhjLCAic3BhbSIKKyAgICAgICAgZXhjZXB0IGV4YywgZXJyOgorICAgICAgICAgICAgYnVmMSA9IHN0cihlcnIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIGV4Yygic3BhbSIpCisgICAgICAgIGV4Y2VwdCBleGMsIGVycjoKKyAgICAgICAgICAgIGJ1ZjIgPSBzdHIoZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZjEsIGJ1ZjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjLl9fbmFtZV9fLCBleGNuYW1lKQorCisgICAgZGVmIHRlc3RSYWlzaW5nKHNlbGYpOgorICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKEF0dHJpYnV0ZUVycm9yLCAiQXR0cmlidXRlRXJyb3IiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZ2V0YXR0ciwgc3lzLCAidW5kZWZpbmVkX2F0dHJpYnV0ZSIpCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChFT0ZFcnJvciwgIkVPRkVycm9yIikKKyAgICAgICAgZnAgPSBvcGVuKFRFU1RGTiwgJ3cnKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGZwID0gb3BlbihURVNURk4sICdyJykKKyAgICAgICAgc2F2ZXN0ZGluID0gc3lzLnN0ZGluCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMuc3RkaW4gPSBmcAorICAgICAgICAgICAgICAgIHggPSByYXdfaW5wdXQoKQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRpbiA9IHNhdmVzdGRpbgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAgICAgdW5saW5rKFRFU1RGTikKKworICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKElPRXJyb3IsICJJT0Vycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgb3BlbiwgJ3RoaXMgZmlsZSBkb2VzIG5vdCBleGlzdCcsICdyJykKKworICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKEltcG9ydEVycm9yLCAiSW1wb3J0RXJyb3IiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvciwgX19pbXBvcnRfXywgInVuZGVmaW5lZF9tb2R1bGUiKQorCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goSW5kZXhFcnJvciwgIkluZGV4RXJyb3IiKQorICAgICAgICB4ID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgeC5fX2dldGl0ZW1fXywgMTApCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChLZXlFcnJvciwgIktleUVycm9yIikKKyAgICAgICAgeCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCB4Ll9fZ2V0aXRlbV9fLCAna2V5JykKKworICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKEtleWJvYXJkSW50ZXJydXB0LCAiS2V5Ym9hcmRJbnRlcnJ1cHQiKQorCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goTWVtb3J5RXJyb3IsICJNZW1vcnlFcnJvciIpCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChOYW1lRXJyb3IsICJOYW1lRXJyb3IiKQorICAgICAgICB0cnk6IHggPSB1bmRlZmluZWRfdmFyaWFibGUKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjogcGFzcworCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goT3ZlcmZsb3dFcnJvciwgIk92ZXJmbG93RXJyb3IiKQorICAgICAgICB4ID0gMQorICAgICAgICBmb3IgZHVtbXkgaW4gcmFuZ2UoMTI4KToKKyAgICAgICAgICAgIHggKz0geCAgIyB0aGlzIHNpbXBseSBzaG91bGRuJ3QgYmxvdyB1cAorCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goUnVudGltZUVycm9yLCAiUnVudGltZUVycm9yIikKKworICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKFN5bnRheEVycm9yLCAiU3ludGF4RXJyb3IiKQorICAgICAgICB0cnk6IGV4ZWMgJy9cbicKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOiBwYXNzCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChJbmRlbnRhdGlvbkVycm9yLCAiSW5kZW50YXRpb25FcnJvciIpCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChUYWJFcnJvciwgIlRhYkVycm9yIikKKyAgICAgICAgIyBjYW4gb25seSBiZSB0ZXN0ZWQgdW5kZXIgLXR0LCBhbmQgaXMgdGhlIG9ubHkgdGVzdCBmb3IgLXR0CisgICAgICAgICN0cnk6IGNvbXBpbGUoInRyeTpcblx0MS8wXG4gICAgXHQxLzBcbmZpbmFsbHk6XG4gcGFzc1xuIiwgJzxzdHJpbmc+JywgJ2V4ZWMnKQorICAgICAgICAjZXhjZXB0IFRhYkVycm9yOiBwYXNzCisgICAgICAgICNlbHNlOiBzZWxmLmZhaWwoIlRhYkVycm9yIG5vdCByYWlzZWQiKQorCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goU3lzdGVtRXJyb3IsICJTeXN0ZW1FcnJvciIpCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChTeXN0ZW1FeGl0LCAiU3lzdGVtRXhpdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQsIHN5cy5leGl0LCAwKQorCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goVHlwZUVycm9yLCAiVHlwZUVycm9yIikKKyAgICAgICAgdHJ5OiBbXSArICgpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKworICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKFZhbHVlRXJyb3IsICJWYWx1ZUVycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2hyLCAxMDAwMCkKKworICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKFplcm9EaXZpc2lvbkVycm9yLCAiWmVyb0RpdmlzaW9uRXJyb3IiKQorICAgICAgICB0cnk6IHggPSAxIC8vIDAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChFeGNlcHRpb24sICJFeGNlcHRpb24iKQorICAgICAgICB0cnk6IHggPSAxIC8vIDAKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZTogcGFzcworCisgICAgZGVmIHRlc3RTeW50YXhFcnJvck1lc3NhZ2Uoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIHRoZSByaWdodCBleGNlcHRpb24gbWVzc2FnZSBpcyByYWlzZWQgZm9yIGVhY2ggb2YKKyAgICAgICAgIyB0aGVzZSBjb2RlIGZyYWdtZW50cworCisgICAgICAgIGRlZiBja21zZyhzcmMsIG1zZyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29tcGlsZShzcmMsICc8ZnJhZ21lbnQ+JywgJ2V4ZWMnKQorICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yLCBlOgorICAgICAgICAgICAgICAgIGlmIGUubXNnICE9IG1zZzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCAlcywgZ290ICVzIiAlIChtc2csIGUubXNnKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJmYWlsZWQgdG8gZ2V0IGV4cGVjdGVkIFN5bnRheEVycm9yIikKKworICAgICAgICBzID0gJycnd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlJycnCisKKyAgICAgICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgICAgICAgICBja21zZyhzLCAiJ2NvbnRpbnVlJyBub3Qgc3VwcG9ydGVkIGluc2lkZSAnZmluYWxseScgY2xhdXNlIikKKworICAgICAgICBzID0gJycnaWYgMToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcycnJworCisgICAgICAgIGNrbXNnKHMsICInY29udGludWUnIG5vdCBwcm9wZXJseSBpbiBsb29wIikKKyAgICAgICAgY2ttc2coImNvbnRpbnVlXG4iLCAiJ2NvbnRpbnVlJyBub3QgcHJvcGVybHkgaW4gbG9vcCIpCisKKyAgICBAY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RTZXR0aW5nRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAjIHRlc3QgdGhhdCBzZXR0aW5nIGFuIGV4Y2VwdGlvbiBhdCB0aGUgQyBsZXZlbCB3b3JrcyBldmVuIGlmIHRoZQorICAgICAgICAjIGV4Y2VwdGlvbiBvYmplY3QgY2FuJ3QgYmUgY29uc3RydWN0ZWQuCisKKyAgICAgICAgY2xhc3MgQmFkRXhjZXB0aW9uOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGZfKToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJjYW4ndCBpbnN0YW50aWF0ZSBCYWRFeGNlcHRpb24iCisKKyAgICAgICAgZGVmIHRlc3RfY2FwaTEoKToKKyAgICAgICAgICAgIGltcG9ydCBfdGVzdGNhcGkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfdGVzdGNhcGkucmFpc2VfZXhjZXB0aW9uKEJhZEV4Y2VwdGlvbiwgMSkKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBleGMsIGVyciwgdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgICAgIGNvID0gdGIudGJfZnJhbWUuZl9jb2RlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjby5jb19uYW1lLCAidGVzdF9jYXBpMSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvLmNvX2ZpbGVuYW1lLmVuZHN3aXRoKCd0ZXN0X2V4Y2VwdGlvbnMnK29zLmV4dHNlcCsncHknKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCBleGNlcHRpb24iKQorCisgICAgICAgIGRlZiB0ZXN0X2NhcGkyKCk6CisgICAgICAgICAgICBpbXBvcnQgX3Rlc3RjYXBpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX3Rlc3RjYXBpLnJhaXNlX2V4Y2VwdGlvbihCYWRFeGNlcHRpb24sIDApCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgZXhjLCBlcnIsIHRiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgICAgICBjbyA9IHRiLnRiX2ZyYW1lLmZfY29kZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28uY29fbmFtZSwgIl9faW5pdF9fIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY28uY29fZmlsZW5hbWUuZW5kc3dpdGgoJ3Rlc3RfZXhjZXB0aW9ucycrb3MuZXh0c2VwKydweScpKQorICAgICAgICAgICAgICAgIGNvMiA9IHRiLnRiX2ZyYW1lLmZfYmFjay5mX2NvZGUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvMi5jb19uYW1lLCAidGVzdF9jYXBpMiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKworICAgICAgICBpZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKKyAgICAgICAgICAgIHRlc3RfY2FwaTEoKQorICAgICAgICAgICAgdGVzdF9jYXBpMigpCisKKyAgICBkZWYgdGVzdF9XaW5kb3dzRXJyb3Ioc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFdpbmRvd3NFcnJvcgorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoV2luZG93c0Vycm9yKDEwMDEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMDAxIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbRXJyb3IgMTAwMV0gbWVzc2FnZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLmVycm5vLCAyMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoV2luZG93c0Vycm9yKDEwMDEsICJtZXNzYWdlIikud2luZXJyb3IsIDEwMDEpCisKKyAgICBAaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzCisgICAgZGVmIHRlc3RBdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICAjIHRlc3QgdGhhdCBleGNlcHRpb24gYXR0cmlidXRlcyBhcmUgaGFwcHkKKworICAgICAgICBleGNlcHRpb25MaXN0ID0gWworICAgICAgICAgICAgKEJhc2VFeGNlcHRpb24sICgpLCB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgpfSksCisgICAgICAgICAgICAoQmFzZUV4Y2VwdGlvbiwgKDEsICksIHsnbWVzc2FnZScgOiAxLCAnYXJncycgOiAoMSwpfSksCisgICAgICAgICAgICAoQmFzZUV4Y2VwdGlvbiwgKCdmb28nLCksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICdmb28nLCAnYXJncycgOiAoJ2ZvbycsKX0pLAorICAgICAgICAgICAgKEJhc2VFeGNlcHRpb24sICgnZm9vJywgMSksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2ZvbycsIDEpfSksCisgICAgICAgICAgICAoU3lzdGVtRXhpdCwgKCdmb28nLCksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICdmb28nLCAnYXJncycgOiAoJ2ZvbycsKSwgJ2NvZGUnIDogJ2Zvbyd9KSwKKyAgICAgICAgICAgIChJT0Vycm9yLCAoJ2ZvbycsKSwKKyAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJ2ZvbycsICdhcmdzJyA6ICgnZm9vJywpLCAnZmlsZW5hbWUnIDogTm9uZSwKKyAgICAgICAgICAgICAgICAgJ2Vycm5vJyA6IE5vbmUsICdzdHJlcnJvcicgOiBOb25lfSksCisgICAgICAgICAgICAoSU9FcnJvciwgKCdmb28nLCAnYmFyJyksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2ZvbycsICdiYXInKSwgJ2ZpbGVuYW1lJyA6IE5vbmUsCisgICAgICAgICAgICAgICAgICdlcnJubycgOiAnZm9vJywgJ3N0cmVycm9yJyA6ICdiYXInfSksCisgICAgICAgICAgICAoSU9FcnJvciwgKCdmb28nLCAnYmFyJywgJ2JheicpLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdmb28nLCAnYmFyJyksICdmaWxlbmFtZScgOiAnYmF6JywKKyAgICAgICAgICAgICAgICAgJ2Vycm5vJyA6ICdmb28nLCAnc3RyZXJyb3InIDogJ2Jhcid9KSwKKyAgICAgICAgICAgIChJT0Vycm9yLCAoJ2ZvbycsICdiYXInLCAnYmF6JywgJ3F1dXgnKSwKKyAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnZm9vJywgJ2JhcicsICdiYXonLCAncXV1eCcpfSksCisgICAgICAgICAgICAoRW52aXJvbm1lbnRFcnJvciwgKCdlcnJub1N0cicsICdzdHJFcnJvclN0cicsICdmaWxlbmFtZVN0cicpLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdlcnJub1N0cicsICdzdHJFcnJvclN0cicpLAorICAgICAgICAgICAgICAgICAnc3RyZXJyb3InIDogJ3N0ckVycm9yU3RyJywgJ2Vycm5vJyA6ICdlcnJub1N0cicsCisgICAgICAgICAgICAgICAgICdmaWxlbmFtZScgOiAnZmlsZW5hbWVTdHInfSksCisgICAgICAgICAgICAoRW52aXJvbm1lbnRFcnJvciwgKDEsICdzdHJFcnJvclN0cicsICdmaWxlbmFtZVN0cicpLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKDEsICdzdHJFcnJvclN0cicpLCAnZXJybm8nIDogMSwKKyAgICAgICAgICAgICAgICAgJ3N0cmVycm9yJyA6ICdzdHJFcnJvclN0cicsICdmaWxlbmFtZScgOiAnZmlsZW5hbWVTdHInfSksCisgICAgICAgICAgICAoU3ludGF4RXJyb3IsICgpLCB7J21lc3NhZ2UnIDogJycsICdtc2cnIDogTm9uZSwgJ3RleHQnIDogTm9uZSwKKyAgICAgICAgICAgICAgICAnZmlsZW5hbWUnIDogTm9uZSwgJ2xpbmVubycgOiBOb25lLCAnb2Zmc2V0JyA6IE5vbmUsCisgICAgICAgICAgICAgICAgJ3ByaW50X2ZpbGVfYW5kX2xpbmUnIDogTm9uZX0pLAorICAgICAgICAgICAgKFN5bnRheEVycm9yLCAoJ21zZ1N0cicsKSwKKyAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJ21zZ1N0cicsICdhcmdzJyA6ICgnbXNnU3RyJywpLCAndGV4dCcgOiBOb25lLAorICAgICAgICAgICAgICAgICAncHJpbnRfZmlsZV9hbmRfbGluZScgOiBOb25lLCAnbXNnJyA6ICdtc2dTdHInLAorICAgICAgICAgICAgICAgICAnZmlsZW5hbWUnIDogTm9uZSwgJ2xpbmVubycgOiBOb25lLCAnb2Zmc2V0JyA6IE5vbmV9KSwKKyAgICAgICAgICAgIChTeW50YXhFcnJvciwgKCdtc2dTdHInLCAoJ2ZpbGVuYW1lU3RyJywgJ2xpbmVub1N0cicsICdvZmZzZXRTdHInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHRTdHInKSksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnb2Zmc2V0JyA6ICdvZmZzZXRTdHInLCAndGV4dCcgOiAndGV4dFN0cicsCisgICAgICAgICAgICAgICAgICdhcmdzJyA6ICgnbXNnU3RyJywgKCdmaWxlbmFtZVN0cicsICdsaW5lbm9TdHInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2Zmc2V0U3RyJywgJ3RleHRTdHInKSksCisgICAgICAgICAgICAgICAgICdwcmludF9maWxlX2FuZF9saW5lJyA6IE5vbmUsICdtc2cnIDogJ21zZ1N0cicsCisgICAgICAgICAgICAgICAgICdmaWxlbmFtZScgOiAnZmlsZW5hbWVTdHInLCAnbGluZW5vJyA6ICdsaW5lbm9TdHInfSksCisgICAgICAgICAgICAoU3ludGF4RXJyb3IsICgnbXNnU3RyJywgJ2ZpbGVuYW1lU3RyJywgJ2xpbmVub1N0cicsICdvZmZzZXRTdHInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHRTdHInLCAncHJpbnRfZmlsZV9hbmRfbGluZVN0cicpLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ3RleHQnIDogTm9uZSwKKyAgICAgICAgICAgICAgICAgJ2FyZ3MnIDogKCdtc2dTdHInLCAnZmlsZW5hbWVTdHInLCAnbGluZW5vU3RyJywgJ29mZnNldFN0cicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dFN0cicsICdwcmludF9maWxlX2FuZF9saW5lU3RyJyksCisgICAgICAgICAgICAgICAgICdwcmludF9maWxlX2FuZF9saW5lJyA6IE5vbmUsICdtc2cnIDogJ21zZ1N0cicsCisgICAgICAgICAgICAgICAgICdmaWxlbmFtZScgOiBOb25lLCAnbGluZW5vJyA6IE5vbmUsICdvZmZzZXQnIDogTm9uZX0pLAorICAgICAgICAgICAgKFVuaWNvZGVFcnJvciwgKCksIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCksfSksCisgICAgICAgICAgICAoVW5pY29kZUVuY29kZUVycm9yLCAoJ2FzY2lpJywgdSdhJywgMCwgMSwgJ29yZGluYWwgbm90IGluIHJhbmdlJyksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2FzY2lpJywgdSdhJywgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JkaW5hbCBub3QgaW4gcmFuZ2UnKSwKKyAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJyA6ICdhc2NpaScsICdvYmplY3QnIDogdSdhJywKKyAgICAgICAgICAgICAgICAgJ3N0YXJ0JyA6IDAsICdyZWFzb24nIDogJ29yZGluYWwgbm90IGluIHJhbmdlJ30pLAorICAgICAgICAgICAgKFVuaWNvZGVEZWNvZGVFcnJvciwgKCdhc2NpaScsICdceGZmJywgMCwgMSwgJ29yZGluYWwgbm90IGluIHJhbmdlJyksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2FzY2lpJywgJ1x4ZmYnLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmRpbmFsIG5vdCBpbiByYW5nZScpLAorICAgICAgICAgICAgICAgICAnZW5jb2RpbmcnIDogJ2FzY2lpJywgJ29iamVjdCcgOiAnXHhmZicsCisgICAgICAgICAgICAgICAgICdzdGFydCcgOiAwLCAncmVhc29uJyA6ICdvcmRpbmFsIG5vdCBpbiByYW5nZSd9KSwKKyAgICAgICAgICAgIChVbmljb2RlVHJhbnNsYXRlRXJyb3IsICh1Ilx1MzA0MiIsIDAsIDEsICJvdWNoIiksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAodSdcdTMwNDInLCAwLCAxLCAnb3VjaCcpLAorICAgICAgICAgICAgICAgICAnb2JqZWN0JyA6IHUnXHUzMDQyJywgJ3JlYXNvbicgOiAnb3VjaCcsCisgICAgICAgICAgICAgICAgICdzdGFydCcgOiAwLCAnZW5kJyA6IDF9KSwKKyAgICAgICAgXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBleGNlcHRpb25MaXN0LmFwcGVuZCgKKyAgICAgICAgICAgICAgICAoV2luZG93c0Vycm9yLCAoMSwgJ3N0ckVycm9yU3RyJywgJ2ZpbGVuYW1lU3RyJyksCisgICAgICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKDEsICdzdHJFcnJvclN0cicpLAorICAgICAgICAgICAgICAgICAgICAgJ3N0cmVycm9yJyA6ICdzdHJFcnJvclN0cicsICd3aW5lcnJvcicgOiAxLAorICAgICAgICAgICAgICAgICAgICAgJ2Vycm5vJyA6IDIyLCAnZmlsZW5hbWUnIDogJ2ZpbGVuYW1lU3RyJ30pCisgICAgICAgICAgICApCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZm9yIGV4YywgYXJncywgZXhwZWN0ZWQgaW4gZXhjZXB0aW9uTGlzdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByYWlzZSBleGMoKmFyZ3MpCisgICAgICAgICAgICBleGNlcHQgQmFzZUV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICBpZiB0eXBlKGUpIGlzIG5vdCBleGM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgIyBWZXJpZnkgbW9kdWxlIG5hbWUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZSkuX19tb2R1bGVfXywgJ2V4Y2VwdGlvbnMnKQorICAgICAgICAgICAgICAgICMgVmVyaWZ5IG5vIHJlZiBsZWFrcyBpbiBFeGNfc3RyKCkKKyAgICAgICAgICAgICAgICBzID0gc3RyKGUpCisgICAgICAgICAgICAgICAgZm9yIGNoZWNrQXJnTmFtZSBpbiBleHBlY3RlZDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGdldGF0dHIoZSwgY2hlY2tBcmdOYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcihleHBlY3RlZFtjaGVja0FyZ05hbWVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhjZXB0aW9uICIlcyIsIGF0dHJpYnV0ZSAiJXMiJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXByKGUpLCBjaGVja0FyZ05hbWUpKQorCisgICAgICAgICAgICAgICAgIyB0ZXN0IGZvciBwaWNrbGluZyBzdXBwb3J0CisgICAgICAgICAgICAgICAgZm9yIHAgaW4gcGlja2xlLCBjUGlja2xlOgorICAgICAgICAgICAgICAgICAgICBmb3IgcHJvdG9jb2wgaW4gcmFuZ2UocC5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgPSBwLmxvYWRzKHAuZHVtcHMoZSwgcHJvdG9jb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNoZWNrQXJnTmFtZSBpbiBleHBlY3RlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3QgPSByZXByKGdldGF0dHIobmV3LCBjaGVja0FyZ05hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQgPSByZXByKGV4cGVjdGVkW2NoZWNrQXJnTmFtZV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIHdhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGlja2xlZCAiJXIiLCBhdHRyaWJ1dGUgIiVzIicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUsIGNoZWNrQXJnTmFtZSkpCisKKworICAgIGRlZiB0ZXN0RGVwcmVjYXRlZE1lc3NhZ2VBdHRyaWJ1dGUoc2VsZik6CisgICAgICAgICMgQWNjZXNzaW5nIEJhc2VFeGNlcHRpb24ubWVzc2FnZSBhbmQgcmVseWluZyBvbiBpdHMgdmFsdWUgc2V0IGJ5CisgICAgICAgICMgQmFzZUV4Y2VwdGlvbi5fX2luaXRfXyB0cmlnZ2VycyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcuCisgICAgICAgIGV4YyA9IEJhc2VFeGNlcHRpb24oImZvbyIpCisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCJCYXNlRXhjZXB0aW9uLm1lc3NhZ2UgaGFzIGJlZW4gZGVwcmVjYXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBvZiBQeXRob24gMi42IiwgRGVwcmVjYXRpb25XYXJuaW5nKSkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjLm1lc3NhZ2UsICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMSkKKworICAgIGRlZiB0ZXN0UmVndWxhck1lc3NhZ2VBdHRyaWJ1dGUoc2VsZik6CisgICAgICAgICMgQWNjZXNzaW5nIEJhc2VFeGNlcHRpb24ubWVzc2FnZSBhZnRlciBleHBsaWNpdGx5IHNldHRpbmcgYSB2YWx1ZQorICAgICAgICAjIGZvciBpdCBkb2VzIG5vdCB0cmlnZ2VyIGEgZGVwcmVjYXRpb24gd2FybmluZy4KKyAgICAgICAgZXhjID0gQmFzZUV4Y2VwdGlvbigiZm9vIikKKyAgICAgICAgZXhjLm1lc3NhZ2UgPSAiYmFyIgorICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKHF1aWV0PVRydWUpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5tZXNzYWdlLCAiYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDApCisgICAgICAgICMgRGVsZXRpbmcgdGhlIG1lc3NhZ2UgaXMgc3VwcG9ydGVkLCB0b28uCisgICAgICAgIGRlbCBleGMubWVzc2FnZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIGV4Yy5tZXNzYWdlCisKKyAgICBAaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzCisgICAgZGVmIHRlc3RQaWNrbGVNZXNzYWdlQXR0cmlidXRlKHNlbGYpOgorICAgICAgICAjIFBpY2tsaW5nIHdpdGggbWVzc2FnZSBhdHRyaWJ1dGUgbXVzdCB3b3JrLCBhcyB3ZWxsLgorICAgICAgICBlID0gRXhjZXB0aW9uKCJmb28iKQorICAgICAgICBmID0gRXhjZXB0aW9uKCJmb28iKQorICAgICAgICBmLm1lc3NhZ2UgPSAiYmFyIgorICAgICAgICBmb3IgcCBpbiBwaWNrbGUsIGNQaWNrbGU6CisgICAgICAgICAgICBlcCA9IHAubG9hZHMocC5kdW1wcyhlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAubWVzc2FnZSwgImZvbyIpCisgICAgICAgICAgICBmcCA9IHAubG9hZHMocC5kdW1wcyhmKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAubWVzc2FnZSwgImJhciIpCisKKyAgICBAaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzCisgICAgZGVmIHRlc3RTbGljaW5nKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB5b3UgY2FuIHNsaWNlIGFuIGV4Y2VwdGlvbiBkaXJlY3RseSBpbnN0ZWFkIG9mIHJlcXVpcmluZworICAgICAgICAjIGdvaW5nIHRocm91Z2ggdGhlICdhcmdzJyBhdHRyaWJ1dGUuCisgICAgICAgIGFyZ3MgPSAoMSwgMiwgMykKKyAgICAgICAgZXhjID0gQmFzZUV4Y2VwdGlvbigqYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGNbOl0sIGFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjLmFyZ3NbOl0sIGFyZ3MpCisKKyAgICBkZWYgdGVzdEtleXdvcmRBcmdzKHNlbGYpOgorICAgICAgICAjIHRlc3QgdGhhdCBidWlsdGluIGV4Y2VwdGlvbiBkb24ndCB0YWtlIGtleXdvcmQgYXJncywKKyAgICAgICAgIyBidXQgdXNlci1kZWZpbmVkIHN1YmNsYXNzZXMgY2FuIGlmIHRoZXkgd2FudAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEJhc2VFeGNlcHRpb24sIGE9MSkKKworICAgICAgICBjbGFzcyBEZXJpdmVkRXhjZXB0aW9uKEJhc2VFeGNlcHRpb24pOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZhbmN5X2FyZyk6CisgICAgICAgICAgICAgICAgQmFzZUV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmKQorICAgICAgICAgICAgICAgIHNlbGYuZmFuY3lfYXJnID0gZmFuY3lfYXJnCisKKyAgICAgICAgeCA9IERlcml2ZWRFeGNlcHRpb24oZmFuY3lfYXJnPTQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZmFuY3lfYXJnLCA0MikKKworICAgIGRlZiB0ZXN0SW5maW5pdGVSZWN1cnNpb24oc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICByZXR1cm4gZigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgZikKKworICAgICAgICBkZWYgZygpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBnKCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorCisgICAgICAgICMgVGhlIHRlc3QgcHJpbnRzIGFuIHVucmFpc2FibGUgcmVjdXJzaW9uIGVycm9yIHdoZW4KKyAgICAgICAgIyBkb2luZyAiZXhjZXB0IFZhbHVlRXJyb3IiLCB0aGlzIGlzIGJlY2F1c2Ugc3ViY2xhc3MKKyAgICAgICAgIyBjaGVja2luZyBoYXMgcmVjdXJzaW9uIGNoZWNraW5nIHRvby4KKyAgICAgICAgd2l0aCBjYXB0dXJlZF9vdXRwdXQoInN0ZGVyciIpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGcoKQorICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgS2V5RXJyb3IiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBLZXlFcnJvciIpCisKKyAgICBkZWYgdGVzdFVuaWNvZGVTdHJVc2FnZShzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgYm90aCBpbnN0YW5jZXMgYW5kIGNsYXNzZXMgaGF2ZSBhIHN0ciBhbmQgdW5pY29kZQorICAgICAgICAjIHJlcHJlc2VudGF0aW9uLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKEV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bmljb2RlKEV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIoRXhjZXB0aW9uKCdhJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZShFeGNlcHRpb24odSdhJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZShFeGNlcHRpb24odSdceGUxJykpKQorCisgICAgZGVmIHRlc3RVbmljb2RlQ2hhbmdlQXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgIyBTZWUgaXNzdWUgNzMwOS4gVGhpcyB3YXMgYSBjcmFzaGVyLgorCisgICAgICAgIHUgPSBVbmljb2RlRW5jb2RlRXJyb3IoJ2JheicsIHUneHh4eHgnLCAxLCA1LCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodSksICInYmF6JyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVycyBpbiBwb3NpdGlvbiAxLTQ6IGZvbyIpCisgICAgICAgIHUuZW5kID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1KSwgIidiYXonIGNvZGVjIGNhbid0IGVuY29kZSBjaGFyYWN0ZXIgdSdcXHg3OCcgaW4gcG9zaXRpb24gMTogZm9vIikKKyAgICAgICAgdS5lbmQgPSA1CisgICAgICAgIHUucmVhc29uID0gMHgzNDUzNDUzNDUzNDUzNDUzNDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodSksICInYmF6JyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVycyBpbiBwb3NpdGlvbiAxLTQ6IDk2NTIzMDk1MTQ0MzY4NTcyNDk5NyIpCisgICAgICAgIHUuZW5jb2RpbmcgPSA0MDAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHUpLCAiJzQwMDAnIGNvZGVjIGNhbid0IGVuY29kZSBjaGFyYWN0ZXJzIGluIHBvc2l0aW9uIDEtNDogOTY1MjMwOTUxNDQzNjg1NzI0OTk3IikKKyAgICAgICAgdS5zdGFydCA9IDEwMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodSksICInNDAwMCcgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlcnMgaW4gcG9zaXRpb24gMTAwMC00OiA5NjUyMzA5NTE0NDM2ODU3MjQ5OTciKQorCisgICAgICAgIHUgPSBVbmljb2RlRGVjb2RlRXJyb3IoJ2JheicsICd4eHh4eCcsIDEsIDUsICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1KSwgIidiYXonIGNvZGVjIGNhbid0IGRlY29kZSBieXRlcyBpbiBwb3NpdGlvbiAxLTQ6IGZvbyIpCisgICAgICAgIHUuZW5kID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1KSwgIidiYXonIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4NzggaW4gcG9zaXRpb24gMTogZm9vIikKKyAgICAgICAgdS5lbmQgPSA1CisgICAgICAgIHUucmVhc29uID0gMHgzNDUzNDUzNDUzNDUzNDUzNDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodSksICInYmF6JyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZXMgaW4gcG9zaXRpb24gMS00OiA5NjUyMzA5NTE0NDM2ODU3MjQ5OTciKQorICAgICAgICB1LmVuY29kaW5nID0gNDAwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1KSwgIic0MDAwJyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZXMgaW4gcG9zaXRpb24gMS00OiA5NjUyMzA5NTE0NDM2ODU3MjQ5OTciKQorICAgICAgICB1LnN0YXJ0ID0gMTAwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1KSwgIic0MDAwJyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZXMgaW4gcG9zaXRpb24gMTAwMC00OiA5NjUyMzA5NTE0NDM2ODU3MjQ5OTciKQorCisgICAgICAgIHUgPSBVbmljb2RlVHJhbnNsYXRlRXJyb3IodSd4eHh4JywgMSwgNSwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHUpLCAiY2FuJ3QgdHJhbnNsYXRlIGNoYXJhY3RlcnMgaW4gcG9zaXRpb24gMS00OiBmb28iKQorICAgICAgICB1LmVuZCA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodSksICJjYW4ndCB0cmFuc2xhdGUgY2hhcmFjdGVyIHUnXFx4NzgnIGluIHBvc2l0aW9uIDE6IGZvbyIpCisgICAgICAgIHUuZW5kID0gNQorICAgICAgICB1LnJlYXNvbiA9IDB4MzQ1MzQ1MzQ1MzQ1MzQ1MzQ1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHUpLCAiY2FuJ3QgdHJhbnNsYXRlIGNoYXJhY3RlcnMgaW4gcG9zaXRpb24gMS00OiA5NjUyMzA5NTE0NDM2ODU3MjQ5OTciKQorICAgICAgICB1LnN0YXJ0ID0gMTAwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1KSwgImNhbid0IHRyYW5zbGF0ZSBjaGFyYWN0ZXJzIGluIHBvc2l0aW9uIDEwMDAtNDogOTY1MjMwOTUxNDQzNjg1NzI0OTk3IikKKworICAgIGRlZiB0ZXN0X2JhZGlzaW5zdGFuY2Uoc2VsZik6CisgICAgICAgICMgQnVnICMyNTQyOiBpZiBpc3N1YmNsYXNzKGUsIE15RXhjZXB0aW9uKSByYWlzZXMgYW4gZXhjZXB0aW9uLAorICAgICAgICAjIGl0IHNob3VsZCBiZSBpZ25vcmVkCisgICAgICAgIGNsYXNzIE1ldGEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19zdWJjbGFzc2NoZWNrX18oY2xzLCBzdWJjbGFzcyk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigpCisKKyAgICAgICAgY2xhc3MgTXlFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhCisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9vdXRwdXQoInN0ZGVyciIpIGFzIHN0ZGVycjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcigpCisgICAgICAgICAgICBleGNlcHQgTXlFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleGNlcHRpb24gc2hvdWxkIG5vdCBiZSBhIE15RXhjZXB0aW9uIikKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgS2V5RXJyb3IiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBLZXlFcnJvciIpCisKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9vdXRwdXQoInN0ZGVyciIpIGFzIHN0ZGVycjoKKyAgICAgICAgICAgIGRlZiBnKCk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZygpCisgICAgICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBlLCB2LCB0YiA9IGcoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGUgaXMgUnVudGltZUVycm9yLCBlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigibWF4aW11bSByZWN1cnNpb24gZGVwdGggZXhjZWVkZWQiLCBzdHIodikpCisKKyAgICBkZWYgdGVzdF9uZXdfcmV0dXJuc19pbnZhbGlkX2luc3RhbmNlKHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAjMTE2MjcuCisgICAgICAgIGNsYXNzIE15RXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0KCkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICByYWlzZSBNeUV4Y2VwdGlvbgorCisgICAgZGVmIHRlc3RfYXNzZXJ0X3dpdGhfdHVwbGVfYXJnKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBhc3NlcnQgRmFsc2UsICgzLCkKKyAgICAgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yIGFzIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIigzLCkiKQorCisgICAgZGVmIHRlc3RfYmFkX2V4Y2VwdGlvbl9jbGVhcmluZyhzZWxmKToKKyAgICAgICAgIyBTZWUgaXNzdWUgMTY0NDU6IHVzZSBvZiBQeV9YREVDUkVGIGluc3RlYWQgb2YgUHlfQ0xFQVIgaW4KKyAgICAgICAgIyBCYXNlRXhjZXB0aW9uX3NldF9tZXNzYWdlIGdhdmUgYSBwb3NzaWJsZSB3YXkgdG8gc2VnZmF1bHQgdGhlCisgICAgICAgICMgaW50ZXJwcmV0ZXIuCisgICAgICAgIGNsYXNzIE5hc3R5KHN0cik6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhtZXNzYWdlKToKKyAgICAgICAgICAgICAgICBkZWwgZS5tZXNzYWdlCisKKyAgICAgICAgZSA9IFZhbHVlRXJyb3IoTmFzdHkoIm1zZyIpKQorICAgICAgICBlLmFyZ3MgPSAoKQorICAgICAgICBkZWwgZS5tZXNzYWdlCisKKworIyBIZWxwZXIgY2xhc3MgdXNlZCBieSBUZXN0U2FtZVN0ckFuZFVuaWNvZGVNc2cKK2NsYXNzIEV4Y1dpdGhPdmVycmlkZGVuU3RyKEV4Y2VwdGlvbik6CisgICAgIiIiU3ViY2xhc3Mgb2YgRXhjZXB0aW9uIHRoYXQgYWNjZXB0cyBhIGtleXdvcmQgJ21zZycgYXJnIHRoYXQgaXMKKyAgICByZXR1cm5lZCBieSBfX3N0cl9fLiAnbXNnJyB3b24ndCBiZSBpbmNsdWRlZCBpbiBzZWxmLmFyZ3MiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5tc2cgPSBrd2FyZ3MucG9wKCdtc2cnKSAjIG1zZyBzaG91bGQgYWx3YXlzIGJlIHByZXNlbnQKKyAgICAgICAgc3VwZXIoRXhjV2l0aE92ZXJyaWRkZW5TdHIsIHNlbGYpLl9faW5pdF9fKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubXNnCisKKworY2xhc3MgVGVzdFNhbWVTdHJBbmRVbmljb2RlTXNnKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJ1bmljb2RlKGVycikgc2hvdWxkIHJldHVybiB0aGUgc2FtZSBtZXNzYWdlIG9mIHN0cihlcnIpLiBTZWUgIzYxMDgiIiIKKworICAgIGRlZiBjaGVja19zYW1lX21zZyhzZWxmLCBleGMsIG1zZyk6CisgICAgICAgICIiIkhlbHBlciBmdW5jdGlvbiB0aGF0IGNoZWNrcyBpZiBzdHIoZXhjKSA9PSB1bmljb2RlKGV4YykgPT0gbXNnIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGV4YyksIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZXhjKSwgdW5pY29kZShleGMpKQorCisgICAgZGVmIHRlc3RfYnVpbHRpbl9leGNlcHRpb25zKHNlbGYpOgorICAgICAgICAiIiJDaGVjayBzYW1lIG1zZyBmb3IgYnVpbHQtaW4gZXhjZXB0aW9ucyIiIgorICAgICAgICAjIFRoZXNlIGV4Y2VwdGlvbnMgaW1wbGVtZW50IGEgX19zdHJfXyBtZXRob2QgdGhhdCB1c2VzIHRoZSBhcmdzCisgICAgICAgICMgdG8gY3JlYXRlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuIHVuaWNvZGUoZSkgc2hvdWxkIHJldHVybiB0aGUgc2FtZQorICAgICAgICAjIG1lc3NhZ2UuCisgICAgICAgIGV4Y2VwdGlvbnMgPSBbCisgICAgICAgICAgICBTeW50YXhFcnJvcignaW52YWxpZCBzeW50YXgnLCAoJzxzdHJpbmc+JywgMSwgMywgJzIrKjMnKSksCisgICAgICAgICAgICBJT0Vycm9yKDIsICdObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JyksCisgICAgICAgICAgICBLZXlFcnJvcignYm90aCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBxdW90ZXMnKSwKKyAgICAgICAgICAgIFVuaWNvZGVEZWNvZGVFcnJvcignYXNjaWknLCAnXHhjM1x4YTAnLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpJyksCisgICAgICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IoJ2FzY2lpJywgdSdcdTEyMzQnLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpJykKKyAgICAgICAgXQorICAgICAgICBmb3IgZXhjZXB0aW9uIGluIGV4Y2VwdGlvbnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihleGNlcHRpb24pLCB1bmljb2RlKGV4Y2VwdGlvbikpCisKKyAgICBkZWYgdGVzdF8wX2FyZ3Moc2VsZik6CisgICAgICAgICIiIkNoZWNrIHNhbWUgbXNnIGZvciBFeGNlcHRpb24gd2l0aCAwIGFyZ3MiIiIKKyAgICAgICAgIyBzdHIoKSBhbmQgdW5pY29kZSgpIG9uIGFuIEV4Y2VwdGlvbiB3aXRoIG5vIGFyZ3Mgc2hvdWxkIHJldHVybiBhbgorICAgICAgICAjIGVtcHR5IHN0cmluZworICAgICAgICBzZWxmLmNoZWNrX3NhbWVfbXNnKEV4Y2VwdGlvbigpLCAnJykKKworICAgIGRlZiB0ZXN0XzBfYXJnc193aXRoX292ZXJyaWRkZW5fX19zdHJfXyhzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgc2FtZSBtc2cgZm9yIGV4Y2VwdGlvbnMgd2l0aCAwIGFyZ3MgYW5kIG92ZXJyaWRkZW4gX19zdHJfXyIiIgorICAgICAgICAjIHN0cigpIGFuZCB1bmljb2RlKCkgb24gYW4gZXhjZXB0aW9uIHdpdGggb3ZlcnJpZGRlbiBfX3N0cl9fIHRoYXQKKyAgICAgICAgIyByZXR1cm5zIGFuIGFzY2lpLW9ubHkgc3RyaW5nIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgc3RyaW5nCisgICAgICAgIGZvciBtc2cgaW4gKCdmb28nLCB1J2ZvbycpOgorICAgICAgICAgICAgc2VsZi5jaGVja19zYW1lX21zZyhFeGNXaXRoT3ZlcnJpZGRlblN0cihtc2c9bXNnKSwgbXNnKQorCisgICAgICAgICMgaWYgX19zdHJfXyByZXR1cm5zIGEgbm9uLWFzY2lpIHVuaWNvZGUgc3RyaW5nIHN0cigpIHNob3VsZCBmYWlsCisgICAgICAgICMgYnV0IHVuaWNvZGUoKSBzaG91bGQgcmV0dXJuIHRoZSB1bmljb2RlIHN0cmluZworICAgICAgICBlID0gRXhjV2l0aE92ZXJyaWRkZW5TdHIobXNnPXUnZlx4ZjZceGY2JykgIyBubyBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgc3RyLCBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoZSksIHUnZlx4ZjZceGY2JykKKworICAgIGRlZiB0ZXN0XzFfYXJnKHNlbGYpOgorICAgICAgICAiIiJDaGVjayBzYW1lIG1zZyBmb3IgRXhjZXB0aW9ucyB3aXRoIDEgYXJnIiIiCisgICAgICAgIGZvciBhcmcgaW4gKCdmb28nLCB1J2ZvbycpOgorICAgICAgICAgICAgc2VsZi5jaGVja19zYW1lX21zZyhFeGNlcHRpb24oYXJnKSwgYXJnKQorCisgICAgICAgICMgaWYgX19zdHJfXyBpcyBub3Qgb3ZlcnJpZGRlbiBhbmQgc2VsZi5hcmdzWzBdIGlzIGEgbm9uLWFzY2lpIHVuaWNvZGUKKyAgICAgICAgIyBzdHJpbmcsIHN0cigpIHNob3VsZCB0cnkgdG8gcmV0dXJuIHN0cihzZWxmLmFyZ3NbMF0pIGFuZCBmYWlsLgorICAgICAgICAjIHVuaWNvZGUoKSBzaG91bGQgcmV0dXJuIHVuaWNvZGUoc2VsZi5hcmdzWzBdKSBhbmQgc3VjY2VlZC4KKyAgICAgICAgZSA9IEV4Y2VwdGlvbih1J2ZceGY2XHhmNicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgc3RyLCBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoZSksIHUnZlx4ZjZceGY2JykKKworICAgIGRlZiB0ZXN0XzFfYXJnX3dpdGhfb3ZlcnJpZGRlbl9fX3N0cl9fKHNlbGYpOgorICAgICAgICAiIiJDaGVjayBzYW1lIG1zZyBmb3IgZXhjZXB0aW9ucyB3aXRoIG92ZXJyaWRkZW4gX19zdHJfXyBhbmQgMSBhcmciIiIKKyAgICAgICAgIyB3aGVuIF9fc3RyX18gaXMgb3ZlcnJpZGRlbiBhbmQgX191bmljb2RlX18gaXMgbm90IGltcGxlbWVudGVkCisgICAgICAgICMgdW5pY29kZShlKSByZXR1cm5zIHRoZSBzYW1lIGFzIHVuaWNvZGUoZS5fX3N0cl9fKCkpLgorICAgICAgICBmb3IgbXNnIGluICgnZm9vJywgdSdmb28nKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfc2FtZV9tc2coRXhjV2l0aE92ZXJyaWRkZW5TdHIoJ2FyZycsIG1zZz1tc2cpLCBtc2cpCisKKyAgICAgICAgIyBpZiBfX3N0cl9fIHJldHVybnMgYSBub24tYXNjaWkgdW5pY29kZSBzdHJpbmcsIHN0cigpIHNob3VsZCBmYWlsCisgICAgICAgICMgYnV0IHVuaWNvZGUoKSBzaG91bGQgc3VjY2VlZC4KKyAgICAgICAgZSA9IEV4Y1dpdGhPdmVycmlkZGVuU3RyKCdhcmcnLCBtc2c9dSdmXHhmNlx4ZjYnKSAjIDEgYXJnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgc3RyLCBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoZSksIHUnZlx4ZjZceGY2JykKKworICAgIGRlZiB0ZXN0X21hbnlfYXJncyhzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgc2FtZSBtc2cgZm9yIEV4Y2VwdGlvbnMgd2l0aCBtYW55IGFyZ3MiIiIKKyAgICAgICAgYXJnc2xpc3QgPSBbCisgICAgICAgICAgICAoMywgJ2ZvbycpLAorICAgICAgICAgICAgKDEsIHUnZm9vJywgJ2JhcicpLAorICAgICAgICAgICAgKDQsIHUnZlx4ZjZceGY2JywgdSdiYXInLCAnYmF6JykKKyAgICAgICAgXQorICAgICAgICAjIGJvdGggc3RyKCkgYW5kIHVuaWNvZGUoKSBzaG91bGQgcmV0dXJuIGEgcmVwcigpIG9mIHRoZSBhcmdzCisgICAgICAgIGZvciBhcmdzIGluIGFyZ3NsaXN0OgorICAgICAgICAgICAgc2VsZi5jaGVja19zYW1lX21zZyhFeGNlcHRpb24oKmFyZ3MpLCByZXByKGFyZ3MpKQorCisgICAgZGVmIHRlc3RfbWFueV9hcmdzX3dpdGhfb3ZlcnJpZGRlbl9fX3N0cl9fKHNlbGYpOgorICAgICAgICAiIiJDaGVjayBzYW1lIG1zZyBmb3IgZXhjZXB0aW9ucyB3aXRoIG92ZXJyaWRkZW4gX19zdHJfXyBhbmQgbWFueSBhcmdzIiIiCisgICAgICAgICMgaWYgX19zdHJfXyByZXR1cm5zIGFuIGFzY2lpIHN0cmluZyAvIGFzY2lpIHVuaWNvZGUgc3RyaW5nCisgICAgICAgICMgYm90aCBzdHIoKSBhbmQgdW5pY29kZSgpIHNob3VsZCBzdWNjZWVkCisgICAgICAgIGZvciBtc2cgaW4gKCdmb28nLCB1J2ZvbycpOgorICAgICAgICAgICAgZSA9IEV4Y1dpdGhPdmVycmlkZGVuU3RyKCdhcmcxJywgdSdhcmcyJywgdSdmXHhmNlx4ZjYnLCBtc2c9bXNnKQorICAgICAgICAgICAgc2VsZi5jaGVja19zYW1lX21zZyhlLCBtc2cpCisKKyAgICAgICAgIyBpZiBfX3N0cl9fIHJldHVybnMgYSBub24tYXNjaWkgdW5pY29kZSBzdHJpbmcsIHN0cigpIHNob3VsZCBmYWlsCisgICAgICAgICMgYnV0IHVuaWNvZGUoKSBzaG91bGQgc3VjY2VlZAorICAgICAgICBlID0gRXhjV2l0aE92ZXJyaWRkZW5TdHIoJ2FyZzEnLCB1J2ZceGY2XHhmNicsIHUnYXJnMycsICMgMyBhcmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9dSdmXHhmNlx4ZjYnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIHN0ciwgZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKGUpLCB1J2ZceGY2XHhmNicpCisKKyAgICBAY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfZXhjZXB0aW9uX3dpdGhfZG9jKHNlbGYpOgorICAgICAgICBpbXBvcnQgX3Rlc3RjYXBpCisgICAgICAgIGRvYzIgPSAiVGhpcyBpcyBhIHRlc3QgZG9jc3RyaW5nLiIKKyAgICAgICAgZG9jNCA9ICJUaGlzIGlzIGFub3RoZXIgdGVzdCBkb2NzdHJpbmcuIgorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUVycm9yLCBfdGVzdGNhcGkubWFrZV9leGNlcHRpb25fd2l0aF9kb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvcjEiKQorCisgICAgICAgICMgdGVzdCBiYXNpYyB1c2FnZSBvZiBQeUVycl9OZXdFeGNlcHRpb24KKyAgICAgICAgZXJyb3IxID0gX3Rlc3RjYXBpLm1ha2VfZXhjZXB0aW9uX3dpdGhfZG9jKCJfdGVzdGNhcGkuZXJyb3IxIikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGVycm9yMSksIHR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGVycm9yMSwgRXhjZXB0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoZXJyb3IxLl9fZG9jX18pCisKKyAgICAgICAgIyB0ZXN0IHdpdGggZ2l2ZW4gZG9jc3RyaW5nCisgICAgICAgIGVycm9yMiA9IF90ZXN0Y2FwaS5tYWtlX2V4Y2VwdGlvbl93aXRoX2RvYygiX3Rlc3RjYXBpLmVycm9yMiIsIGRvYzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyb3IyLl9fZG9jX18sIGRvYzIpCisKKyAgICAgICAgIyB0ZXN0IHdpdGggZXhwbGljaXQgYmFzZSAod2l0aG91dCBkb2NzdHJpbmcpCisgICAgICAgIGVycm9yMyA9IF90ZXN0Y2FwaS5tYWtlX2V4Y2VwdGlvbl93aXRoX2RvYygiX3Rlc3RjYXBpLmVycm9yMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlPWVycm9yMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoZXJyb3IzLCBlcnJvcjIpKQorCisgICAgICAgICMgdGVzdCB3aXRoIGV4cGxpY2l0IGJhc2UgdHVwbGUKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlcnJvcjQgPSBfdGVzdGNhcGkubWFrZV9leGNlcHRpb25fd2l0aF9kb2MoIl90ZXN0Y2FwaS5lcnJvcjQiLCBkb2M0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yMywgQykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGVycm9yNCwgZXJyb3IzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoZXJyb3I0LCBDKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJvcjQuX19kb2NfXywgZG9jNCkKKworICAgICAgICAjIHRlc3Qgd2l0aCBleHBsaWNpdCBkaWN0aW9uYXJ5CisgICAgICAgIGVycm9yNSA9IF90ZXN0Y2FwaS5tYWtlX2V4Y2VwdGlvbl93aXRoX2RvYygiX3Rlc3RjYXBpLmVycm9yNSIsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I0LCB7J2EnOiAxfSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoZXJyb3I1LCBlcnJvcjQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVycm9yNS5hLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVycm9yNS5fX2RvY19fLCAiIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEV4Y2VwdGlvblRlc3RzLCBUZXN0U2FtZVN0ckFuZFVuaWNvZGVNc2cpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNiZWVkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4ZGVjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4dGNhbGwucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leHRjYWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZTA5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leHRjYWxsLnB5CkBAIC0wLDAgKzEsMzE5IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorCisiIiJEb2N0ZXN0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbHMuCisKK1dlJ3JlIGdvaW5nIHRoZSB1c2UgdGhlc2UgdHlwZXMgZm9yIGV4dHJhIHRlc3RpbmcKKworICAgID4+PiBmcm9tIFVzZXJMaXN0IGltcG9ydCBVc2VyTGlzdAorICAgID4+PiBmcm9tIFVzZXJEaWN0IGltcG9ydCBVc2VyRGljdAorCitXZSdyZSBkZWZpbmluZyBmb3VyIGhlbHBlciBmdW5jdGlvbnMKKworICAgID4+PiBkZWYgZShhLGIpOgorICAgIC4uLiAgICAgcHJpbnQgYSwgYgorCisgICAgPj4+IGRlZiBmKCphLCAqKmspOgorICAgIC4uLiAgICAgcHJpbnQgYSwgdGVzdF9zdXBwb3J0LnNvcnRkaWN0KGspCisKKyAgICA+Pj4gZGVmIGcoeCwgKnksICoqeik6CisgICAgLi4uICAgICBwcmludCB4LCB5LCB0ZXN0X3N1cHBvcnQuc29ydGRpY3QoeikKKworICAgID4+PiBkZWYgaChqPTEsIGE9MiwgaD0zKToKKyAgICAuLi4gICAgIHByaW50IGosIGEsIGgKKworQXJndW1lbnQgbGlzdCBleGFtcGxlcworCisgICAgPj4+IGYoKQorICAgICgpIHt9CisgICAgPj4+IGYoMSkKKyAgICAoMSwpIHt9CisgICAgPj4+IGYoMSwgMikKKyAgICAoMSwgMikge30KKyAgICA+Pj4gZigxLCAyLCAzKQorICAgICgxLCAyLCAzKSB7fQorICAgID4+PiBmKDEsIDIsIDMsICooNCwgNSkpCisgICAgKDEsIDIsIDMsIDQsIDUpIHt9CisgICAgPj4+IGYoMSwgMiwgMywgKls0LCA1XSkKKyAgICAoMSwgMiwgMywgNCwgNSkge30KKyAgICA+Pj4gZigxLCAyLCAzLCAqVXNlckxpc3QoWzQsIDVdKSkKKyAgICAoMSwgMiwgMywgNCwgNSkge30KKworSGVyZSB3ZSBhZGQga2V5d29yZCBhcmd1bWVudHMKKworICAgID4+PiBmKDEsIDIsIDMsICoqeydhJzo0LCAnYic6NX0pCisgICAgKDEsIDIsIDMpIHsnYSc6IDQsICdiJzogNX0KKyAgICA+Pj4gZigxLCAyLCAzLCAqWzQsIDVdLCAqKnsnYSc6NiwgJ2InOjd9KQorICAgICgxLCAyLCAzLCA0LCA1KSB7J2EnOiA2LCAnYic6IDd9CisgICAgPj4+IGYoMSwgMiwgMywgeD00LCB5PTUsICooNiwgNyksICoqeydhJzo4LCAnYic6IDl9KQorICAgICgxLCAyLCAzLCA2LCA3KSB7J2EnOiA4LCAnYic6IDksICd4JzogNCwgJ3knOiA1fQorCisgICAgPj4+IGYoMSwgMiwgMywgKipVc2VyRGljdChhPTQsIGI9NSkpCisgICAgKDEsIDIsIDMpIHsnYSc6IDQsICdiJzogNX0KKyAgICA+Pj4gZigxLCAyLCAzLCAqKDQsIDUpLCAqKlVzZXJEaWN0KGE9NiwgYj03KSkKKyAgICAoMSwgMiwgMywgNCwgNSkgeydhJzogNiwgJ2InOiA3fQorICAgID4+PiBmKDEsIDIsIDMsIHg9NCwgeT01LCAqKDYsIDcpLCAqKlVzZXJEaWN0KGE9OCwgYj05KSkKKyAgICAoMSwgMiwgMywgNiwgNykgeydhJzogOCwgJ2InOiA5LCAneCc6IDQsICd5JzogNX0KKworRXhhbXBsZXMgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cyAoVHlwZUVycm9ycykuIFdlJ3JlIGFsc28gdGVzdGluZyB0aGUgZnVuY3Rpb24KK25hbWVzIGluIHRoZSBleGNlcHRpb24gbWVzc2FnZXMuCisKK1ZlcmlmeSBjbGVhcmluZyBvZiBTRiBidWcgIzczMzY2NworCisgICAgPj4+IGUoYz00KQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogZSgpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJ2MnCisKKyAgICA+Pj4gZygpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiBnKCkgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudCAoMCBnaXZlbikKKworICAgID4+PiBnKCooKSkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IGcoKSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50ICgwIGdpdmVuKQorCisgICAgPj4+IGcoKigpLCAqKnt9KQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogZygpIHRha2VzIGF0IGxlYXN0IDEgYXJndW1lbnQgKDAgZ2l2ZW4pCisKKyAgICA+Pj4gZygxKQorICAgIDEgKCkge30KKyAgICA+Pj4gZygxLCAyKQorICAgIDEgKDIsKSB7fQorICAgID4+PiBnKDEsIDIsIDMpCisgICAgMSAoMiwgMykge30KKyAgICA+Pj4gZygxLCAyLCAzLCAqKDQsIDUpKQorICAgIDEgKDIsIDMsIDQsIDUpIHt9CisKKyAgICA+Pj4gY2xhc3MgTm90aGluZzogcGFzcworICAgIC4uLgorICAgID4+PiBnKCpOb3RoaW5nKCkpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiBnKCkgYXJndW1lbnQgYWZ0ZXIgKiBtdXN0IGJlIGEgc2VxdWVuY2UsIG5vdCBpbnN0YW5jZQorCisgICAgPj4+IGNsYXNzIE5vdGhpbmc6CisgICAgLi4uICAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIDUKKyAgICAuLi4KKworICAgID4+PiBnKCpOb3RoaW5nKCkpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiBnKCkgYXJndW1lbnQgYWZ0ZXIgKiBtdXN0IGJlIGEgc2VxdWVuY2UsIG5vdCBpbnN0YW5jZQorCisgICAgPj4+IGNsYXNzIE5vdGhpbmcoKToKKyAgICAuLi4gICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gNQorICAgIC4uLiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgIC4uLiAgICAgICAgIGlmIGk8MzogcmV0dXJuIGkKKyAgICAuLi4gICAgICAgICBlbHNlOiByYWlzZSBJbmRleEVycm9yKGkpCisgICAgLi4uCisKKyAgICA+Pj4gZygqTm90aGluZygpKQorICAgIDAgKDEsIDIpIHt9CisKKyAgICA+Pj4gY2xhc3MgTm90aGluZzoKKyAgICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmKTogc2VsZi5jID0gMAorICAgIC4uLiAgICAgZGVmIF9faXRlcl9fKHNlbGYpOiByZXR1cm4gc2VsZgorICAgIC4uLiAgICAgZGVmIG5leHQoc2VsZik6CisgICAgLi4uICAgICAgICAgaWYgc2VsZi5jID09IDQ6CisgICAgLi4uICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAuLi4gICAgICAgICBjID0gc2VsZi5jCisgICAgLi4uICAgICAgICAgc2VsZi5jICs9IDEKKyAgICAuLi4gICAgICAgICByZXR1cm4gYworICAgIC4uLgorCisgICAgPj4+IGcoKk5vdGhpbmcoKSkKKyAgICAwICgxLCAyLCAzKSB7fQorCitNYWtlIHN1cmUgdGhhdCB0aGUgZnVuY3Rpb24gZG9lc24ndCBzdG9tcCB0aGUgZGljdGlvbmFyeQorCisgICAgPj4+IGQgPSB7J2EnOiAxLCAnYic6IDIsICdjJzogM30KKyAgICA+Pj4gZDIgPSBkLmNvcHkoKQorICAgID4+PiBnKDEsIGQ9NCwgKipkKQorICAgIDEgKCkgeydhJzogMSwgJ2InOiAyLCAnYyc6IDMsICdkJzogNH0KKyAgICA+Pj4gZCA9PSBkMgorICAgIFRydWUKKworV2hhdCBhYm91dCB3aWxsZnVsIG1pc2NvbmR1Y3Q/CisKKyAgICA+Pj4gZGVmIHNhYm90ZXVyKCoqa3cpOgorICAgIC4uLiAgICAga3dbJ3gnXSA9ICdtJworICAgIC4uLiAgICAgcmV0dXJuIGt3CisKKyAgICA+Pj4gZCA9IHt9CisgICAgPj4+IGt3ID0gc2Fib3RldXIoYT0xLCAqKmQpCisgICAgPj4+IGQKKyAgICB7fQorCisKKyAgICA+Pj4gZygxLCAyLCAzLCAqKnsneCc6IDQsICd5JzogNX0pCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiBnKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmd1bWVudCAneCcKKworICAgID4+PiBmKCoqezE6Mn0pCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiBmKCkga2V5d29yZHMgbXVzdCBiZSBzdHJpbmdzCisKKyAgICA+Pj4gaCgqKnsnZSc6IDJ9KQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogaCgpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJ2UnCisKKyAgICA+Pj4gaCgqaCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IGgoKSBhcmd1bWVudCBhZnRlciAqIG11c3QgYmUgYSBzZXF1ZW5jZSwgbm90IGZ1bmN0aW9uCisKKyAgICA+Pj4gZGlyKCpoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogZGlyKCkgYXJndW1lbnQgYWZ0ZXIgKiBtdXN0IGJlIGEgc2VxdWVuY2UsIG5vdCBmdW5jdGlvbgorCisgICAgPj4+IE5vbmUoKmgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiBOb25lVHlwZSBvYmplY3QgYXJndW1lbnQgYWZ0ZXIgKiBtdXN0IGJlIGEgc2VxdWVuY2UsIFwKK25vdCBmdW5jdGlvbgorCisgICAgPj4+IGgoKipoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogaCgpIGFyZ3VtZW50IGFmdGVyICoqIG11c3QgYmUgYSBtYXBwaW5nLCBub3QgZnVuY3Rpb24KKworICAgID4+PiBkaXIoKipoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogZGlyKCkgYXJndW1lbnQgYWZ0ZXIgKiogbXVzdCBiZSBhIG1hcHBpbmcsIG5vdCBmdW5jdGlvbgorCisgICAgPj4+IE5vbmUoKipoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogTm9uZVR5cGUgb2JqZWN0IGFyZ3VtZW50IGFmdGVyICoqIG11c3QgYmUgYSBtYXBwaW5nLCBcCitub3QgZnVuY3Rpb24KKworICAgID4+PiBkaXIoYj0xLCAqKnsnYic6IDF9KQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogZGlyKCkgZ290IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmd1bWVudCAnYicKKworQW5vdGhlciBoZWxwZXIgZnVuY3Rpb24KKworICAgID4+PiBkZWYgZjIoKmEsICoqYik6CisgICAgLi4uICAgICByZXR1cm4gYSwgYgorCisKKyAgICA+Pj4gZCA9IHt9CisgICAgPj4+IGZvciBpIGluIHhyYW5nZSg1MTIpOgorICAgIC4uLiAgICAga2V5ID0gJ2slZCcgJSBpCisgICAgLi4uICAgICBkW2tleV0gPSBpCisgICAgPj4+IGEsIGIgPSBmMigxLCAqKDIsMyksICoqZCkKKyAgICA+Pj4gbGVuKGEpLCBsZW4oYiksIGIgPT0gZAorICAgICgzLCA1MTIsIFRydWUpCisKKyAgICA+Pj4gY2xhc3MgRm9vOgorICAgIC4uLiAgICAgZGVmIG1ldGhvZChzZWxmLCBhcmcxLCBhcmcyKToKKyAgICAuLi4gICAgICAgICByZXR1cm4gYXJnMSthcmcyCisKKyAgICA+Pj4geCA9IEZvbygpCisgICAgPj4+IEZvby5tZXRob2QoKih4LCAxLCAyKSkKKyAgICAzCisgICAgPj4+IEZvby5tZXRob2QoeCwgKigxLCAyKSkKKyAgICAzCisgICAgPj4+IEZvby5tZXRob2QoKigxLCAyLCAzKSkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IHVuYm91bmQgbWV0aG9kIG1ldGhvZCgpIG11c3QgYmUgY2FsbGVkIHdpdGggRm9vIGluc3RhbmNlIGFzIFwKK2ZpcnN0IGFyZ3VtZW50IChnb3QgaW50IGluc3RhbmNlIGluc3RlYWQpCisKKyAgICA+Pj4gRm9vLm1ldGhvZCgxLCAqWzIsIDNdKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogdW5ib3VuZCBtZXRob2QgbWV0aG9kKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBGb28gaW5zdGFuY2UgYXMgXAorZmlyc3QgYXJndW1lbnQgKGdvdCBpbnQgaW5zdGFuY2UgaW5zdGVhZCkKKworQSBQeUNGdW5jdGlvbiB0aGF0IHRha2VzIG9ubHkgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHNob3VsZCBhbGxvdyBhbgorZW1wdHkga2V5d29yZCBkaWN0aW9uYXJ5IHRvIHBhc3Mgd2l0aG91dCBhIGNvbXBsYWludCwgYnV0IHJhaXNlIGEKK1R5cGVFcnJvciBpZiB0ZSBkaWN0aW9uYXJ5IGlzIG5vdCBlbXB0eQorCisgICAgPj4+IHRyeToKKyAgICAuLi4gICAgIHNpbGVuY2UgPSBpZCgxLCAqe30pCisgICAgLi4uICAgICBUcnVlCisgICAgLi4uIGV4Y2VwdDoKKyAgICAuLi4gICAgIEZhbHNlCisgICAgVHJ1ZQorCisgICAgPj4+IGlkKDEsICoqeydmb28nOiAxfSkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IGlkKCkgdGFrZXMgbm8ga2V5d29yZCBhcmd1bWVudHMKKworQSBjb3JuZXIgY2FzZSBvZiBrZXl3b3JkIGRpY3Rpb25hcnkgaXRlbXMgYmVpbmcgZGVsZXRlZCBkdXJpbmcKK3RoZSBmdW5jdGlvbiBjYWxsIHNldHVwLiBTZWUgPGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyMDE2Pi4KKworICAgID4+PiBjbGFzcyBOYW1lKHN0cik6CisgICAgLi4uICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAuLi4gICAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICAgICBkZWwgeFtzZWxmXQorICAgIC4uLiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAuLi4gICAgICAgICAgICAgIHBhc3MKKyAgICAuLi4gICAgICAgICByZXR1cm4gc3RyLl9fZXFfXyhzZWxmLCBvdGhlcikKKyAgICAuLi4gICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAuLi4gICAgICAgICByZXR1cm4gc3RyLl9faGFzaF9fKHNlbGYpCisKKyAgICA+Pj4geCA9IHtOYW1lKCJhIik6MSwgTmFtZSgiYiIpOjJ9CisgICAgPj4+IGRlZiBmKGEsIGIpOgorICAgIC4uLiAgICAgcHJpbnQgYSxiCisgICAgPj4+IGYoKip4KQorICAgIDEgMgorCitBIG9ic2N1cmUgbWVzc2FnZToKKworICAgID4+PiBkZWYgZihhLCBiKToKKyAgICAuLi4gICAgcGFzcworICAgID4+PiBmKGI9MSkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IGYoKSB0YWtlcyBleGFjdGx5IDIgYXJndW1lbnRzICgxIGdpdmVuKQorCitUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgaW4gaW5jbHVkZXMga2V5d29yZHM6CisKKyAgICA+Pj4gZGVmIGYoYSk6CisgICAgLi4uICAgIHBhc3MKKyAgICA+Pj4gZig2LCBhPTQsICooMSwgMiwgMykpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiBmKCkgdGFrZXMgZXhhY3RseSAxIGFyZ3VtZW50ICg1IGdpdmVuKQorIiIiCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitjbGFzcyBFeHRDYWxsVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF91bmljb2RlX2tleXdvcmRzKHNlbGYpOgorICAgICAgICBkZWYgZihhKToKKyAgICAgICAgICAgIHJldHVybiBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZigqKnt1J2EnOiA0fSksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgKip7dSdzdMO2cmVuJzogNH0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgKip7dSdzb21lTG9uZ1N0cmluZyc6Mn0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYoYT00LCAqKnt1J2EnOiA0fSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZHVwbGljYXRlIGFyZ3VtZW50cyBkaWRuJ3QgcmFpc2UiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3Qoc3lzLm1vZHVsZXNbX19uYW1lX19dLCBUcnVlKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoRXh0Q2FsbFRlc3QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4dGNhbGwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXh0Y2FsbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmMDIzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4dGNhbGwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4dGNhbGwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXh0Y2FsbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmMDIzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4dGNhbGwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZjbnRsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmNudGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzNWY2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZjbnRsLnB5CkBAIC0wLDAgKzEsMTI1IEBACisiIiJUZXN0IHByb2dyYW0gZm9yIHRoZSBmY250bCBDIG1vZHVsZS4KKworT1MvMitFTVggZG9lc24ndCBzdXBwb3J0IHRoZSBmaWxlIGxvY2tpbmcgb3BlcmF0aW9ucy4KKworIiIiCitpbXBvcnQgb3MKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBfdGVzdGNhcGkKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgKHZlcmJvc2UsIFRFU1RGTiwgdW5saW5rLCBydW5fdW5pdHRlc3QsCisgICAgaW1wb3J0X21vZHVsZSkKKworIyBTa2lwIHRlc3QgaWYgbm8gZm5jdGwgbW9kdWxlLgorZmNudGwgPSBpbXBvcnRfbW9kdWxlKCdmY250bCcpCisKKworIyBUT0RPIC0gV3JpdGUgdGVzdHMgZm9yIGZsb2NrKCkgYW5kIGxvY2tmKCkuCisKK2RlZiBnZXRfbG9ja2RhdGEoKToKKyAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnYXRoZW9zJyk6CisgICAgICAgIHN0YXJ0X2xlbiA9ICJxcSIKKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5PX0xBUkdFRklMRQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBzdGFydF9sZW4gPSAibGwiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGFydF9sZW4gPSAicXEiCisKKyAgICBpZiAoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoKCduZXRic2QnLCAnZnJlZWJzZCcsICdvcGVuYnNkJywgJ2JzZG9zJykpCisgICAgICAgIG9yIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyk6CisgICAgICAgIGlmIHN0cnVjdC5jYWxjc2l6ZSgnbCcpID09IDg6CisgICAgICAgICAgICBvZmZfdCA9ICdsJworICAgICAgICAgICAgcGlkX3QgPSAnaScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9mZl90ID0gJ2x4eHh4JworICAgICAgICAgICAgcGlkX3QgPSAnbCcKKyAgICAgICAgbG9ja2RhdGEgPSBzdHJ1Y3QucGFjayhvZmZfdCArIG9mZl90ICsgcGlkX3QgKyAnaGgnLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjbnRsLkZfV1JMQ0ssIDApCisgICAgZWxpZiBzeXMucGxhdGZvcm0gaW4gWydhaXgzJywgJ2FpeDQnLCAnaHAtdXhCJywgJ3VuaXh3YXJlNyddOgorICAgICAgICBsb2NrZGF0YSA9IHN0cnVjdC5wYWNrKCdoaGxsbGlpJywgZmNudGwuRl9XUkxDSywgMCwgMCwgMCwgMCwgMCwgMCkKKyAgICBlbGlmIHN5cy5wbGF0Zm9ybSBpbiBbJ29zMmVteCddOgorICAgICAgICBsb2NrZGF0YSA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgICBsb2NrZGF0YSA9IHN0cnVjdC5wYWNrKCdoaCcrc3RhcnRfbGVuKydoaCcsIGZjbnRsLkZfV1JMQ0ssIDAsIDAsIDAsIDAsIDApCisgICAgaWYgbG9ja2RhdGE6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnc3RydWN0LnBhY2s6ICcsIHJlcHIobG9ja2RhdGEpCisgICAgcmV0dXJuIGxvY2tkYXRhCisKK2xvY2tkYXRhID0gZ2V0X2xvY2tkYXRhKCkKKworCitjbGFzcyBUZXN0RmNudGwodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmYgPSBOb25lCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuZiBhbmQgbm90IHNlbGYuZi5jbG9zZWQ6CisgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICB1bmxpbmsoVEVTVEZOKQorCisgICAgZGVmIHRlc3RfZmNudGxfZmlsZW5vKHNlbGYpOgorICAgICAgICAjIHRoZSBleGFtcGxlIGZyb20gdGhlIGxpYnJhcnkgZG9jcworICAgICAgICBzZWxmLmYgPSBvcGVuKFRFU1RGTiwgJ3cnKQorICAgICAgICBydiA9IGZjbnRsLmZjbnRsKHNlbGYuZi5maWxlbm8oKSwgZmNudGwuRl9TRVRGTCwgb3MuT19OT05CTE9DSykKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdTdGF0dXMgZnJvbSBmY250bCB3aXRoIE9fTk9OQkxPQ0s6ICcsIHJ2CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBub3QgaW4gWydvczJlbXgnXToKKyAgICAgICAgICAgIHJ2ID0gZmNudGwuZmNudGwoc2VsZi5mLmZpbGVubygpLCBmY250bC5GX1NFVExLVywgbG9ja2RhdGEpCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICdTdHJpbmcgZnJvbSBmY250bCB3aXRoIEZfU0VUTEtXOiAnLCByZXByKHJ2KQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZmNudGxfZmlsZV9kZXNjcmlwdG9yKHNlbGYpOgorICAgICAgICAjIGFnYWluLCBidXQgcGFzcyB0aGUgZmlsZSByYXRoZXIgdGhhbiBudW1lcmljIGRlc2NyaXB0b3IKKyAgICAgICAgc2VsZi5mID0gb3BlbihURVNURk4sICd3JykKKyAgICAgICAgcnYgPSBmY250bC5mY250bChzZWxmLmYsIGZjbnRsLkZfU0VURkwsIG9zLk9fTk9OQkxPQ0spCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBub3QgaW4gWydvczJlbXgnXToKKyAgICAgICAgICAgIHJ2ID0gZmNudGwuZmNudGwoc2VsZi5mLCBmY250bC5GX1NFVExLVywgbG9ja2RhdGEpCisgICAgICAgIHNlbGYuZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9mY250bF9iYWRfZmlsZShzZWxmKToKKyAgICAgICAgY2xhc3MgRjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbik6CisgICAgICAgICAgICAgICAgc2VsZi5mbiA9IGZuCisgICAgICAgICAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZjbnRsLmZjbnRsLCAtMSwgZmNudGwuRl9TRVRGTCwgb3MuT19OT05CTE9DSykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmNudGwuZmNudGwsIEYoLTEpLCBmY250bC5GX1NFVEZMLCBvcy5PX05PTkJMT0NLKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZjbnRsLmZjbnRsLCAnc3BhbScsIGZjbnRsLkZfU0VURkwsIG9zLk9fTk9OQkxPQ0spCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmNudGwuZmNudGwsIEYoJ3NwYW0nKSwgZmNudGwuRl9TRVRGTCwgb3MuT19OT05CTE9DSykKKyAgICAgICAgIyBJc3N1ZSAxNTk4OQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmY250bC5mY250bCwgX3Rlc3RjYXBpLklOVF9NQVggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNudGwuRl9TRVRGTCwgb3MuT19OT05CTE9DSykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmNudGwuZmNudGwsIEYoX3Rlc3RjYXBpLklOVF9NQVggKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjbnRsLkZfU0VURkwsIG9zLk9fTk9OQkxPQ0spCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZjbnRsLmZjbnRsLCBfdGVzdGNhcGkuSU5UX01JTiAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY250bC5GX1NFVEZMLCBvcy5PX05PTkJMT0NLKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmY250bC5mY250bCwgRihfdGVzdGNhcGkuSU5UX01JTiAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNudGwuRl9TRVRGTCwgb3MuT19OT05CTE9DSykKKworICAgIGRlZiB0ZXN0X2ZjbnRsXzY0X2JpdChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTMwOTM1MjogZmNudGwgc2hvdWxkbid0IGZhaWwgd2hlbiB0aGUgdGhpcmQgYXJnIGZpdHMgaW4gYQorICAgICAgICAjIEMgJ2xvbmcnIGJ1dCBub3QgaW4gYSBDICdpbnQnLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbWQgPSBmY250bC5GX05PVElGWQorICAgICAgICAgICAgIyBUaGlzIGZsYWcgaXMgbGFyZ2VyIHRoYW4gMioqMzEgaW4gNjQtYml0IGJ1aWxkcworICAgICAgICAgICAgZmxhZ3MgPSBmY250bC5ETl9NVUxUSVNIT1QKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiRl9OT1RJRlkgb3IgRE5fTVVMVElTSE9UIHVuYXZhaWxhYmxlIikKKyAgICAgICAgZmQgPSBvcy5vcGVuKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoVEVTVEZOKSksIG9zLk9fUkRPTkxZKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmY250bC5mY250bChmZCwgY21kLCBmbGFncykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdEZjbnRsKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mY250bC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mY250bC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjNjkzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZjbnRsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mY250bC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mY250bC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjNjkzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZjbnRsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmZhNGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZS5weQpAQCAtMCwwICsxLDM0NyBAQAorIyBOT1RFOiB0aGlzIGZpbGUgdGVzdHMgdGhlIG5ldyBgaW9gIGxpYnJhcnkgYmFja3BvcnRlZCBmcm9tIFB5dGhvbiAzLnguCisjIFNpbWlsYXIgdGVzdHMgZm9yIHRoZSBidWlsdGluIGZpbGUgb2JqZWN0IGNhbiBiZSBmb3VuZCBpbiB0ZXN0X2ZpbGUyay5weS4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKK2Zyb20gd2Vha3JlZiBpbXBvcnQgcHJveHkKKworaW1wb3J0IGlvCitpbXBvcnQgX3B5aW8gYXMgcHlpbworCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdAorZnJvbSBVc2VyTGlzdCBpbXBvcnQgVXNlckxpc3QKKworY2xhc3MgQXV0b0ZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBmaWxlIHRlc3RzIGZvciB3aGljaCBhIHRlc3QgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmYgPSBzZWxmLm9wZW4oVEVTVEZOLCAnd2InKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmY6CisgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBvcy5yZW1vdmUoVEVTVEZOKQorCisgICAgZGVmIHRlc3RXZWFrUmVmcyhzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgd2VhayByZWZlcmVuY2VzCisgICAgICAgIHAgPSBwcm94eShzZWxmLmYpCisgICAgICAgIHAud3JpdGUoYid0ZXN0c3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYudGVsbCgpLCBwLnRlbGwoKSkKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSZWZlcmVuY2VFcnJvciwgZ2V0YXR0ciwgcCwgJ3RlbGwnKQorCisgICAgZGVmIHRlc3RBdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSBleHBlY3RlZCBhdHRyaWJ1dGVzIGV4aXN0CisgICAgICAgIGYgPSBzZWxmLmYKKyAgICAgICAgZi5uYW1lICAgICAjIG1lcmVseSBzaG91bGRuJ3QgYmxvdyB1cAorICAgICAgICBmLm1vZGUgICAgICMgZGl0dG8KKyAgICAgICAgZi5jbG9zZWQgICAjIGRpdHRvCisKKyAgICBkZWYgdGVzdFJlYWRpbnRvKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSByZWFkaW50bworICAgICAgICBzZWxmLmYud3JpdGUoYicxMicpCisgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgIGEgPSBhcnJheSgnYicsIGIneCcqMTApCisgICAgICAgIHNlbGYuZiA9IHNlbGYub3BlbihURVNURk4sICdyYicpCisgICAgICAgIG4gPSBzZWxmLmYucmVhZGludG8oYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJzEyJywgYS50b3N0cmluZygpWzpuXSkKKworICAgIGRlZiB0ZXN0UmVhZGludG9fdGV4dChzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgcmVhZGludG8gcmVmdXNlcyB0ZXh0IGZpbGVzCisgICAgICAgIGEgPSBhcnJheSgnYicsIGIneCcqMTApCisgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgIHNlbGYuZiA9IHNlbGYub3BlbihURVNURk4sICdyJykKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLmYsICJyZWFkaW50byIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmYucmVhZGludG8sIGEpCisKKyAgICBkZWYgdGVzdFdyaXRlbGluZXNVc2VyTGlzdChzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgd3JpdGVsaW5lcyB3aXRoIGluc3RhbmNlIHNlcXVlbmNlCisgICAgICAgIGwgPSBVc2VyTGlzdChbYicxJywgYicyJ10pCisgICAgICAgIHNlbGYuZi53cml0ZWxpbmVzKGwpCisgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgIHNlbGYuZiA9IHNlbGYub3BlbihURVNURk4sICdyYicpCisgICAgICAgIGJ1ZiA9IHNlbGYuZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGInMTInKQorCisgICAgZGVmIHRlc3RXcml0ZWxpbmVzSW50ZWdlcnMoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHdyaXRlbGluZXMgd2l0aCBpbnRlZ2VycworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZi53cml0ZWxpbmVzLCBbMSwgMiwgM10pCisKKyAgICBkZWYgdGVzdFdyaXRlbGluZXNJbnRlZ2Vyc1VzZXJMaXN0KHNlbGYpOgorICAgICAgICAjIHZlcmlmeSB3cml0ZWxpbmVzIHdpdGggaW50ZWdlcnMgaW4gVXNlckxpc3QKKyAgICAgICAgbCA9IFVzZXJMaXN0KFsxLDIsM10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mLndyaXRlbGluZXMsIGwpCisKKyAgICBkZWYgdGVzdFdyaXRlbGluZXNOb25TdHJpbmcoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHdyaXRlbGluZXMgd2l0aCBub24tc3RyaW5nIG9iamVjdAorICAgICAgICBjbGFzcyBOb25TdHJpbmc6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmYud3JpdGVsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW05vblN0cmluZygpLCBOb25TdHJpbmcoKV0pCisKKyAgICBkZWYgdGVzdEVycm9ycyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYuZgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYubmFtZSwgVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuaXNhdHR5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZi5jbG9zZWQpCisKKyAgICAgICAgaWYgaGFzYXR0cihmLCAicmVhZGludG8iKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChJT0Vycm9yLCBUeXBlRXJyb3IpLCBmLnJlYWRpbnRvLCAiIikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmNsb3NlZCkKKworICAgIGRlZiB0ZXN0TWV0aG9kcyhzZWxmKToKKyAgICAgICAgbWV0aG9kcyA9IFsoJ2ZpbGVubycsICgpKSwKKyAgICAgICAgICAgICAgICAgICAoJ2ZsdXNoJywgKCkpLAorICAgICAgICAgICAgICAgICAgICgnaXNhdHR5JywgKCkpLAorICAgICAgICAgICAgICAgICAgICgnbmV4dCcsICgpKSwKKyAgICAgICAgICAgICAgICAgICAoJ3JlYWQnLCAoKSksCisgICAgICAgICAgICAgICAgICAgKCd3cml0ZScsIChiIiIsKSksCisgICAgICAgICAgICAgICAgICAgKCdyZWFkbGluZScsICgpKSwKKyAgICAgICAgICAgICAgICAgICAoJ3JlYWRsaW5lcycsICgpKSwKKyAgICAgICAgICAgICAgICAgICAoJ3NlZWsnLCAoMCwpKSwKKyAgICAgICAgICAgICAgICAgICAoJ3RlbGwnLCAoKSksCisgICAgICAgICAgICAgICAgICAgKCd3cml0ZScsIChiIiIsKSksCisgICAgICAgICAgICAgICAgICAgKCd3cml0ZWxpbmVzJywgKFtdLCkpLAorICAgICAgICAgICAgICAgICAgICgnX19pdGVyX18nLCAoKSksCisgICAgICAgICAgICAgICAgICAgXQorICAgICAgICBpZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2F0aGVvcycpOgorICAgICAgICAgICAgbWV0aG9kcy5hcHBlbmQoKCd0cnVuY2F0ZScsICgpKSkKKworICAgICAgICAjIF9fZXhpdF9fIHNob3VsZCBjbG9zZSB0aGUgZmlsZQorICAgICAgICBzZWxmLmYuX19leGl0X18oTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZi5jbG9zZWQpCisKKyAgICAgICAgZm9yIG1ldGhvZG5hbWUsIGFyZ3MgaW4gbWV0aG9kczoKKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZi5mLCBtZXRob2RuYW1lKQorICAgICAgICAgICAgIyBzaG91bGQgcmFpc2Ugb24gY2xvc2VkIGZpbGUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1ldGhvZCwgKmFyZ3MpCisKKyAgICAgICAgIyBmaWxlIGlzIGNsb3NlZCwgX19leGl0X18gc2hvdWxkbid0IGRvIGFueXRoaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLl9fZXhpdF9fKE5vbmUsIE5vbmUsIE5vbmUpLCBOb25lKQorICAgICAgICAjIGl0IG11c3QgYWxzbyByZXR1cm4gTm9uZSBpZiBhbiBleGNlcHRpb24gd2FzIGdpdmVuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIDEgLy8gMAorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5fX2V4aXRfXygqc3lzLmV4Y19pbmZvKCkpLCBOb25lKQorCisgICAgZGVmIHRlc3RSZWFkV2hlbldyaXRpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHNlbGYuZi5yZWFkKQorCitjbGFzcyBDQXV0b0ZpbGVUZXN0cyhBdXRvRmlsZVRlc3RzKToKKyAgICBvcGVuID0gaW8ub3BlbgorCitjbGFzcyBQeUF1dG9GaWxlVGVzdHMoQXV0b0ZpbGVUZXN0cyk6CisgICAgb3BlbiA9IHN0YXRpY21ldGhvZChweWlvLm9wZW4pCisKKworY2xhc3MgT3RoZXJGaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RNb2RlU3RyaW5ncyhzZWxmKToKKyAgICAgICAgIyBjaGVjayBpbnZhbGlkIG1vZGUgc3RyaW5ncworICAgICAgICBmb3IgbW9kZSBpbiAoIiIsICJhVSIsICJ3VSsiKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gc2VsZi5vcGVuKFRFU1RGTiwgbW9kZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCclciBpcyBhbiBpbnZhbGlkIGZpbGUgbW9kZScgJSBtb2RlKQorCisgICAgZGVmIHRlc3RTdGRpbihzZWxmKToKKyAgICAgICAgIyBUaGlzIGNhdXNlcyB0aGUgaW50ZXJwcmV0ZXIgdG8gZXhpdCBvbiBPU0YxIHY1LjEuCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnb3NmMVY1JzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChJT0Vycm9yLCBWYWx1ZUVycm9yKSwgc3lzLnN0ZGluLnNlZWssIC0xKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQoKAorICAgICAgICAgICAgICAgICcgIFNraXBwaW5nIHN5cy5zdGRpbi5zZWVrKC0xKSwgaXQgbWF5IGNyYXNoIHRoZSBpbnRlcnByZXRlci4nCisgICAgICAgICAgICAgICAgJyBUZXN0IG1hbnVhbGx5LicpLCBmaWxlPXN5cy5fX3N0ZG91dF9fKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoSU9FcnJvciwgVmFsdWVFcnJvciksIHN5cy5zdGRpbi50cnVuY2F0ZSkKKworICAgIGRlZiB0ZXN0QmFkTW9kZUFyZ3VtZW50KHNlbGYpOgorICAgICAgICAjIHZlcmlmeSB0aGF0IHdlIGdldCBhIHNlbnNpYmxlIGVycm9yIG1lc3NhZ2UgZm9yIGJhZCBtb2RlIGFyZ3VtZW50CisgICAgICAgIGJhZF9tb2RlID0gInF3ZXJ0eSIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IHNlbGYub3BlbihURVNURk4sIGJhZF9tb2RlKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBtc2c6CisgICAgICAgICAgICBpZiBtc2cuYXJnc1swXSAhPSAwOgorICAgICAgICAgICAgICAgIHMgPSBzdHIobXNnKQorICAgICAgICAgICAgICAgIGlmIFRFU1RGTiBpbiBzIG9yIGJhZF9tb2RlIG5vdCBpbiBzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImJhZCBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIG1vZGU6ICVzIiAlIHMpCisgICAgICAgICAgICAjIGlmIG1zZy5hcmdzWzBdID09IDAsIHdlJ3JlIHByb2JhYmx5IG9uIFdpbmRvd3Mgd2hlcmUgdGhlcmUgbWF5IGJlCisgICAgICAgICAgICAjIG5vIG9idmlvdXMgd2F5IHRvIGRpc2NvdmVyIHdoeSBvcGVuKCkgZmFpbGVkLgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIGVycm9yIGZvciBpbnZhbGlkIG1vZGU6ICVzIiAlIGJhZF9tb2RlKQorCisgICAgZGVmIHRlc3RTZXRCdWZmZXJTaXplKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgYnVmZmVyIHNpemUgZG9lc24ndCBjYXVzZQorICAgICAgICAjIG1pc2JlaGF2aW91ciBlc3BlY2lhbGx5IHdpdGggcmVwZWF0ZWQgY2xvc2UoKSBjYWxscworICAgICAgICBmb3IgcyBpbiAoLTEsIDAsIDEsIDUxMik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IHNlbGYub3BlbihURVNURk4sICd3YicsIHMpCisgICAgICAgICAgICAgICAgZi53cml0ZShzdHIocykuZW5jb2RlKCJhc2NpaSIpKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGYgPSBzZWxmLm9wZW4oVEVTVEZOLCAncmInLCBzKQorICAgICAgICAgICAgICAgIGQgPSBpbnQoZi5yZWFkKCkuZGVjb2RlKCJhc2NpaSIpKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgbXNnOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnZXJyb3Igc2V0dGluZyBidWZmZXIgc2l6ZSAlZDogJXMnICUgKHMsIHN0cihtc2cpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgcykKKworICAgIGRlZiB0ZXN0VHJ1bmNhdGVPbldpbmRvd3Moc2VsZik6CisgICAgICAgICMgU0YgYnVnIDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvODAxNjMxPgorICAgICAgICAjICJmaWxlLnRydW5jYXRlIGZhdWx0IG9uIHdpbmRvd3MiCisKKyAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKyAgICAgICAgZiA9IHNlbGYub3BlbihURVNURk4sICd3YicpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZShiJzEyMzQ1Njc4OTAxJykgICAjIDExIGJ5dGVzCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgZiA9IHNlbGYub3BlbihURVNURk4sJ3JiKycpCisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKDUpCisgICAgICAgICAgICBpZiBkYXRhICE9IGInMTIzNDUnOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUmVhZCBvbiBmaWxlIG9wZW5lZCBmb3IgdXBkYXRlIGZhaWxlZCAlciIgJSBkYXRhKQorICAgICAgICAgICAgaWYgZi50ZWxsKCkgIT0gNToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkZpbGUgcG9zIGFmdGVyIHJlYWQgd3JvbmcgJWQiICUgZi50ZWxsKCkpCisKKyAgICAgICAgICAgIGYudHJ1bmNhdGUoKQorICAgICAgICAgICAgaWYgZi50ZWxsKCkgIT0gNToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkZpbGUgcG9zIGFmdGVyIGZ0cnVuY2F0ZSB3cm9uZyAlZCIgJSBmLnRlbGwoKSkKKworICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzaXplID0gb3MucGF0aC5nZXRzaXplKFRFU1RGTikKKyAgICAgICAgICAgIGlmIHNpemUgIT0gNToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkZpbGUgc2l6ZSBhZnRlciBmdHJ1bmNhdGUgd3JvbmcgJWQiICUgc2l6ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKworICAgIGRlZiB0ZXN0SXRlcmF0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhlIGNvbXBsZXggaW50ZXJhY3Rpb24gd2hlbiBtaXhpbmcgZmlsZS1pdGVyYXRpb24gYW5kIHRoZQorICAgICAgICAjIHZhcmlvdXMgcmVhZCogbWV0aG9kcy4KKyAgICAgICAgZGF0YW9mZnNldCA9IDE2Mzg0CisgICAgICAgIGZpbGxlciA9IGIiaGFtXG4iCisgICAgICAgIGFzc2VydCBub3QgZGF0YW9mZnNldCAlIGxlbihmaWxsZXIpLCBcCisgICAgICAgICAgICAiZGF0YW9mZnNldCBtdXN0IGJlIG11bHRpcGxlIG9mIGxlbihmaWxsZXIpIgorICAgICAgICBuY2h1bmtzID0gZGF0YW9mZnNldCAvLyBsZW4oZmlsbGVyKQorICAgICAgICB0ZXN0bGluZXMgPSBbCisgICAgICAgICAgICBiInNwYW0sIHNwYW0gYW5kIGVnZ3NcbiIsCisgICAgICAgICAgICBiImVnZ3MsIHNwYW0sIGhhbSBhbmQgc3BhbVxuIiwKKyAgICAgICAgICAgIGIic2F1c3NhZ2VzLCBzcGFtLCBzcGFtIGFuZCBlZ2dzXG4iLAorICAgICAgICAgICAgYiJzcGFtLCBoYW0sIHNwYW0gYW5kIGVnZ3NcbiIsCisgICAgICAgICAgICBiInNwYW0sIHNwYW0sIHNwYW0sIHNwYW0sIHNwYW0sIGhhbSwgc3BhbVxuIiwKKyAgICAgICAgICAgIGIid29uZGVyZnVsIHNwYWFhYWFhbS5cbiIKKyAgICAgICAgXQorICAgICAgICBtZXRob2RzID0gWygicmVhZGxpbmUiLCAoKSksICgicmVhZCIsICgpKSwgKCJyZWFkbGluZXMiLCAoKSksCisgICAgICAgICAgICAgICAgICAgKCJyZWFkaW50byIsIChhcnJheSgiYiIsIGIiICIqMTAwKSwpKV0KKworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFByZXBhcmUgdGhlIHRlc3RmaWxlCisgICAgICAgICAgICBiYWcgPSBzZWxmLm9wZW4oVEVTVEZOLCAid2IiKQorICAgICAgICAgICAgYmFnLndyaXRlKGZpbGxlciAqIG5jaHVua3MpCisgICAgICAgICAgICBiYWcud3JpdGVsaW5lcyh0ZXN0bGluZXMpCisgICAgICAgICAgICBiYWcuY2xvc2UoKQorICAgICAgICAgICAgIyBUZXN0IGZvciBhcHByb3ByaWF0ZSBlcnJvcnMgbWl4aW5nIHJlYWQqIGFuZCBpdGVyYXRpb24KKyAgICAgICAgICAgIGZvciBtZXRob2RuYW1lLCBhcmdzIGluIG1ldGhvZHM6CisgICAgICAgICAgICAgICAgZiA9IHNlbGYub3BlbihURVNURk4sICdyYicpCisgICAgICAgICAgICAgICAgaWYgbmV4dChmKSAhPSBmaWxsZXI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCwgIkJyb2tlbiB0ZXN0ZmlsZSIKKyAgICAgICAgICAgICAgICBtZXRoID0gZ2V0YXR0cihmLCBtZXRob2RuYW1lKQorICAgICAgICAgICAgICAgIG1ldGgoKmFyZ3MpICAjIFRoaXMgc2ltcGx5IHNob3VsZG4ndCBmYWlsCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgICMgVGVzdCB0byBzZWUgaWYgaGFybWxlc3MgKGJ5IGFjY2lkZW50KSBtaXhpbmcgb2YgcmVhZCogYW5kCisgICAgICAgICAgICAjIGl0ZXJhdGlvbiBzdGlsbCB3b3Jrcy4gVGhpcyBkZXBlbmRzIG9uIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbAorICAgICAgICAgICAgIyBpdGVyYXRpb24gYnVmZmVyIChjdXJyZW50bHkgODE5MiwpIGJ1dCB3ZSBjYW4gdGVzdCBpdCBpbiBhCisgICAgICAgICAgICAjIGZsZXhpYmxlIG1hbm5lci4gIEVhY2ggbGluZSBpbiB0aGUgYmFnIG8nIGhhbSBpcyA0IGJ5dGVzCisgICAgICAgICAgICAjICgiaCIsICJhIiwgIm0iLCAiXG4iKSwgc28gNDA5NiBsaW5lcyBvZiB0aGF0IHNob3VsZCBnZXQgdXMKKyAgICAgICAgICAgICMgZXhhY3RseSBvbiB0aGUgYnVmZmVyIGJvdW5kYXJ5IGZvciBhbnkgcG93ZXItb2YtMiBidWZmZXJzaXplCisgICAgICAgICAgICAjIGJldHdlZW4gNCBhbmQgMTYzODQgKGluY2x1c2l2ZSkuCisgICAgICAgICAgICBmID0gc2VsZi5vcGVuKFRFU1RGTiwgJ3JiJykKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG5jaHVua3MpOgorICAgICAgICAgICAgICAgIG5leHQoZikKKyAgICAgICAgICAgIHRlc3RsaW5lID0gdGVzdGxpbmVzLnBvcCgwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZGxpbmUoKSBhZnRlciBuZXh0KCkgd2l0aCBzdXBwb3NlZGx5IGVtcHR5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhdGlvbi1idWZmZXIgZmFpbGVkIGFueXdheSIpCisgICAgICAgICAgICBpZiBsaW5lICE9IHRlc3RsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZGxpbmUoKSBhZnRlciBuZXh0KCkgd2l0aCBlbXB0eSBidWZmZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkLiBHb3QgJXIsIGV4cGVjdGVkICVyIiAlIChsaW5lLCB0ZXN0bGluZSkpCisgICAgICAgICAgICB0ZXN0bGluZSA9IHRlc3RsaW5lcy5wb3AoMCkKKyAgICAgICAgICAgIGJ1ZiA9IGFycmF5KCJiIiwgYiJceDAwIiAqIGxlbih0ZXN0bGluZSkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZi5yZWFkaW50byhidWYpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlYWRpbnRvKCkgYWZ0ZXIgbmV4dCgpIHdpdGggc3VwcG9zZWRseSBlbXB0eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVyYXRpb24tYnVmZmVyIGZhaWxlZCBhbnl3YXkiKQorICAgICAgICAgICAgbGluZSA9IGJ1Zi50b3N0cmluZygpCisgICAgICAgICAgICBpZiBsaW5lICE9IHRlc3RsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZGludG8oKSBhZnRlciBuZXh0KCkgd2l0aCBlbXB0eSBidWZmZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkLiBHb3QgJXIsIGV4cGVjdGVkICVyIiAlIChsaW5lLCB0ZXN0bGluZSkpCisKKyAgICAgICAgICAgIHRlc3RsaW5lID0gdGVzdGxpbmVzLnBvcCgwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxpbmUgPSBmLnJlYWQobGVuKHRlc3RsaW5lKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZCgpIGFmdGVyIG5leHQoKSB3aXRoIHN1cHBvc2VkbHkgZW1wdHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcmF0aW9uLWJ1ZmZlciBmYWlsZWQgYW55d2F5IikKKyAgICAgICAgICAgIGlmIGxpbmUgIT0gdGVzdGxpbmU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWFkKCkgYWZ0ZXIgbmV4dCgpIHdpdGggZW1wdHkgYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZC4gR290ICVyLCBleHBlY3RlZCAlciIgJSAobGluZSwgdGVzdGxpbmUpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWFkbGluZXMoKSBhZnRlciBuZXh0KCkgd2l0aCBzdXBwb3NlZGx5IGVtcHR5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhdGlvbi1idWZmZXIgZmFpbGVkIGFueXdheSIpCisgICAgICAgICAgICBpZiBsaW5lcyAhPSB0ZXN0bGluZXM6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWFkbGluZXMoKSBhZnRlciBuZXh0KCkgd2l0aCBlbXB0eSBidWZmZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkLiBHb3QgJXIsIGV4cGVjdGVkICVyIiAlIChsaW5lLCB0ZXN0bGluZSkpCisgICAgICAgICAgICAjIFJlYWRpbmcgYWZ0ZXIgaXRlcmF0aW9uIGhpdCBFT0Ygc2hvdWxkbid0IGh1cnQgZWl0aGVyCisgICAgICAgICAgICBmID0gc2VsZi5vcGVuKFRFU1RGTiwgJ3JiJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgZi5yZWFkaW50byhidWYpCisgICAgICAgICAgICAgICAgICAgIGYucmVhZCgpCisgICAgICAgICAgICAgICAgICAgIGYucmVhZGxpbmVzKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWFkKiBmYWlsZWQgYWZ0ZXIgbmV4dCgpIGNvbnN1bWVkIGZpbGUiKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKK2NsYXNzIENPdGhlckZpbGVUZXN0cyhPdGhlckZpbGVUZXN0cyk6CisgICAgb3BlbiA9IGlvLm9wZW4KKworY2xhc3MgUHlPdGhlckZpbGVUZXN0cyhPdGhlckZpbGVUZXN0cyk6CisgICAgb3BlbiA9IHN0YXRpY21ldGhvZChweWlvLm9wZW4pCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgICMgSGlzdG9yaWNhbGx5LCB0aGVzZSB0ZXN0cyBoYXZlIGJlZW4gc2xvcHB5IGFib3V0IHJlbW92aW5nIFRFU1RGTi4KKyAgICAjIFNvIGdldCByaWQgb2YgaXQgbm8gbWF0dGVyIHdoYXQuCisgICAgdHJ5OgorICAgICAgICBydW5fdW5pdHRlc3QoQ0F1dG9GaWxlVGVzdHMsIFB5QXV0b0ZpbGVUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgIENPdGhlckZpbGVUZXN0cywgUHlPdGhlckZpbGVUZXN0cykKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhURVNURk4pOgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzIzOGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWZiNzBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZTJrLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZTJrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNjMzYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlMmsucHkKQEAgLTAsMCArMSw4MzIgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgc2VsZWN0CitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRpbWUKK2Zyb20gYXJyYXkgaW1wb3J0IGFycmF5Citmcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5Cit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0Citmcm9tIFVzZXJMaXN0IGltcG9ydCBVc2VyTGlzdAorCitjbGFzcyBBdXRvRmlsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIGZpbGUgdGVzdHMgZm9yIHdoaWNoIGEgdGVzdCBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZiA9IG9wZW4oVEVTVEZOLCAnd2InKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmY6CisgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBvcy5yZW1vdmUoVEVTVEZOKQorCisgICAgZGVmIHRlc3RXZWFrUmVmcyhzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgd2VhayByZWZlcmVuY2VzCisgICAgICAgIHAgPSBwcm94eShzZWxmLmYpCisgICAgICAgIHAud3JpdGUoJ3Rlc3RzdHJpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi50ZWxsKCksIHAudGVsbCgpKQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBzZWxmLmYgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJlZmVyZW5jZUVycm9yLCBnZXRhdHRyLCBwLCAndGVsbCcpCisKKyAgICBkZWYgdGVzdEF0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IGV4cGVjdGVkIGF0dHJpYnV0ZXMgZXhpc3QKKyAgICAgICAgZiA9IHNlbGYuZgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzb2Z0c3BhY2UgPSBmLnNvZnRzcGFjZQorICAgICAgICBmLm5hbWUgICAgICMgbWVyZWx5IHNob3VsZG4ndCBibG93IHVwCisgICAgICAgIGYubW9kZSAgICAgIyBkaXR0bworICAgICAgICBmLmNsb3NlZCAgICMgZGl0dG8KKworICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAjIHZlcmlmeSBzb2Z0c3BhY2UgaXMgd3JpdGFibGUKKyAgICAgICAgICAgIGYuc29mdHNwYWNlID0gc29mdHNwYWNlICAgICMgbWVyZWx5IHNob3VsZG4ndCBibG93IHVwCisKKyAgICAgICAgIyB2ZXJpZnkgdGhlIG90aGVycyBhcmVuJ3QKKyAgICAgICAgZm9yIGF0dHIgaW4gJ25hbWUnLCAnbW9kZScsICdjbG9zZWQnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpLCBzZXRhdHRyLCBmLCBhdHRyLCAnb29wcycpCisKKyAgICBkZWYgdGVzdFJlYWRpbnRvKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSByZWFkaW50bworICAgICAgICBzZWxmLmYud3JpdGUoJzEyJykKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgYSA9IGFycmF5KCdjJywgJ3gnKjEwKQorICAgICAgICBzZWxmLmYgPSBvcGVuKFRFU1RGTiwgJ3JiJykKKyAgICAgICAgbiA9IHNlbGYuZi5yZWFkaW50byhhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxMicsIGEudG9zdHJpbmcoKVs6bl0pCisKKyAgICBkZWYgdGVzdFdyaXRlbGluZXNVc2VyTGlzdChzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgd3JpdGVsaW5lcyB3aXRoIGluc3RhbmNlIHNlcXVlbmNlCisgICAgICAgIGwgPSBVc2VyTGlzdChbJzEnLCAnMiddKQorICAgICAgICBzZWxmLmYud3JpdGVsaW5lcyhsKQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBzZWxmLmYgPSBvcGVuKFRFU1RGTiwgJ3JiJykKKyAgICAgICAgYnVmID0gc2VsZi5mLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZiwgJzEyJykKKworICAgIGRlZiB0ZXN0V3JpdGVsaW5lc0ludGVnZXJzKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSB3cml0ZWxpbmVzIHdpdGggaW50ZWdlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmYud3JpdGVsaW5lcywgWzEsIDIsIDNdKQorCisgICAgZGVmIHRlc3RXcml0ZWxpbmVzSW50ZWdlcnNVc2VyTGlzdChzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgd3JpdGVsaW5lcyB3aXRoIGludGVnZXJzIGluIFVzZXJMaXN0CisgICAgICAgIGwgPSBVc2VyTGlzdChbMSwyLDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZi53cml0ZWxpbmVzLCBsKQorCisgICAgZGVmIHRlc3RXcml0ZWxpbmVzTm9uU3RyaW5nKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSB3cml0ZWxpbmVzIHdpdGggbm9uLXN0cmluZyBvYmplY3QKKyAgICAgICAgY2xhc3MgTm9uU3RyaW5nOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mLndyaXRlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb25TdHJpbmcoKSwgTm9uU3RyaW5nKCldKQorCisgICAgZGVmIHRlc3RSZXByKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSByZXByIHdvcmtzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKHNlbGYuZikuc3RhcnRzd2l0aCgiPG9wZW4gZmlsZSAnIiArIFRFU1RGTikpCisgICAgICAgICMgc2VlIGlzc3VlICMxNDE2MQorICAgICAgICAjIFdpbmRvd3MgZG9lc24ndCBsaWtlIFxyXG5cdCIgaW4gdGhlIGZpbGUgbmFtZSwgYnV0ICcgaXMgb2sKKyAgICAgICAgZm5hbWUgPSAneHhccnh4XG54eFwneHgieHgnIGlmIHN5cy5wbGF0Zm9ybSAhPSAid2luMzIiIGVsc2UgInh4J3h4IgorICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICd3JykgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5yZW1vdmUsIGZuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoZikuc3RhcnRzd2l0aCgKKyAgICAgICAgICAgICAgICAgICAgIjxvcGVuIGZpbGUgJXIsIG1vZGUgJ3cnIGF0IiAlIGZuYW1lKSkKKworICAgIGRlZiB0ZXN0RXJyb3JzKHNlbGYpOgorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBzZWxmLmYgPSBvcGVuKFRFU1RGTiwgJ3JiJykKKyAgICAgICAgZiA9IHNlbGYuZgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYubmFtZSwgVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuaXNhdHR5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZi5jbG9zZWQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLnJlYWRpbnRvLCAiIikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmNsb3NlZCkKKworICAgIGRlZiB0ZXN0TWV0aG9kcyhzZWxmKToKKyAgICAgICAgbWV0aG9kcyA9IFsnZmlsZW5vJywgJ2ZsdXNoJywgJ2lzYXR0eScsICduZXh0JywgJ3JlYWQnLCAncmVhZGludG8nLAorICAgICAgICAgICAgICAgICAgICdyZWFkbGluZScsICdyZWFkbGluZXMnLCAnc2VlaycsICd0ZWxsJywgJ3RydW5jYXRlJywKKyAgICAgICAgICAgICAgICAgICAnd3JpdGUnLCAnX19pdGVyX18nXQorICAgICAgICBkZXByZWNhdGVkX21ldGhvZHMgPSBbJ3hyZWFkbGluZXMnXQorICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnYXRoZW9zJyk6CisgICAgICAgICAgICBtZXRob2RzLnJlbW92ZSgndHJ1bmNhdGUnKQorCisgICAgICAgICMgX19leGl0X18gc2hvdWxkIGNsb3NlIHRoZSBmaWxlCisgICAgICAgIHNlbGYuZi5fX2V4aXRfXyhOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5mLmNsb3NlZCkKKworICAgICAgICBmb3IgbWV0aG9kbmFtZSBpbiBtZXRob2RzOgorICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLmYsIG1ldGhvZG5hbWUpCisgICAgICAgICAgICAjIHNob3VsZCByYWlzZSBvbiBjbG9zZWQgZmlsZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWV0aG9kKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBmb3IgbWV0aG9kbmFtZSBpbiBkZXByZWNhdGVkX21ldGhvZHM6CisgICAgICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLmYsIG1ldGhvZG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWV0aG9kKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmYud3JpdGVsaW5lcywgW10pCisKKyAgICAgICAgIyBmaWxlIGlzIGNsb3NlZCwgX19leGl0X18gc2hvdWxkbid0IGRvIGFueXRoaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLl9fZXhpdF9fKE5vbmUsIE5vbmUsIE5vbmUpLCBOb25lKQorICAgICAgICAjIGl0IG11c3QgYWxzbyByZXR1cm4gTm9uZSBpZiBhbiBleGNlcHRpb24gd2FzIGdpdmVuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIDEgLy8gMAorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5fX2V4aXRfXygqc3lzLmV4Y19pbmZvKCkpLCBOb25lKQorCisgICAgZGVmIHRlc3RSZWFkV2hlbldyaXRpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHNlbGYuZi5yZWFkKQorCisgICAgZGVmIHRlc3ROYXN0eVdyaXRlbGluZXNHZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIGRlZiBuYXN0eSgpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICAgICAgaWYgaSA9PSAzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHlpZWxkIHN0cihpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmYud3JpdGVsaW5lcywgbmFzdHkoKSkKKworICAgIGRlZiB0ZXN0SXNzdWU1Njc3KHNlbGYpOgorICAgICAgICAjIFJlbWFyazogRG8gbm90IHBlcmZvcm0gbW9yZSB0aGFuIG9uZSB0ZXN0IHBlciBvcGVuIGZpbGUsCisgICAgICAgICMgc2luY2UgdGhhdCBkb2VzIE5PVCBjYXRjaCB0aGUgcmVhZGxpbmUgZXJyb3Igb24gV2luZG93cy4KKyAgICAgICAgZGF0YSA9ICd4eHgnCisgICAgICAgIGZvciBtb2RlIGluIFsndycsICd3YicsICdhJywgJ2FiJ106CisgICAgICAgICAgICBmb3IgYXR0ciBpbiBbJ3JlYWQnLCAncmVhZGxpbmUnLCAncmVhZGxpbmVzJ106CisgICAgICAgICAgICAgICAgc2VsZi5mID0gb3BlbihURVNURk4sIG1vZGUpCisgICAgICAgICAgICAgICAgc2VsZi5mLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZ2V0YXR0cihzZWxmLmYsIGF0dHIpKQorICAgICAgICAgICAgICAgIHNlbGYuZi5jbG9zZSgpCisKKyAgICAgICAgICAgIHNlbGYuZiA9IG9wZW4oVEVTVEZOLCBtb2RlKQorICAgICAgICAgICAgc2VsZi5mLndyaXRlKGRhdGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBsYW1iZGE6IFtsaW5lIGZvciBsaW5lIGluIHNlbGYuZl0pCisgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorCisgICAgICAgICAgICBzZWxmLmYgPSBvcGVuKFRFU1RGTiwgbW9kZSkKKyAgICAgICAgICAgIHNlbGYuZi53cml0ZShkYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgc2VsZi5mLnJlYWRpbnRvLCBieXRlYXJyYXkobGVuKGRhdGEpKSkKKyAgICAgICAgICAgIHNlbGYuZi5jbG9zZSgpCisKKyAgICAgICAgZm9yIG1vZGUgaW4gWydyJywgJ3JiJywgJ1UnLCAnVWInLCAnVXInLCAnclUnLCAncmJVJywgJ3JVYiddOgorICAgICAgICAgICAgc2VsZi5mID0gb3BlbihURVNURk4sIG1vZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBzZWxmLmYud3JpdGUsIGRhdGEpCisgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorCisgICAgICAgICAgICBzZWxmLmYgPSBvcGVuKFRFU1RGTiwgbW9kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHNlbGYuZi53cml0ZWxpbmVzLCBbZGF0YSwgZGF0YV0pCisgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorCisgICAgICAgICAgICBzZWxmLmYgPSBvcGVuKFRFU1RGTiwgbW9kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHNlbGYuZi50cnVuY2F0ZSkKKyAgICAgICAgICAgIHNlbGYuZi5jbG9zZSgpCisKK2NsYXNzIE90aGVyRmlsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0T3BlbkRpcihzZWxmKToKKyAgICAgICAgdGhpc19kaXIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpcgorICAgICAgICBmb3IgbW9kZSBpbiAoTm9uZSwgInciKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBtb2RlOgorICAgICAgICAgICAgICAgICAgICBmID0gb3Blbih0aGlzX2RpciwgbW9kZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmID0gb3Blbih0aGlzX2RpcikKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmZpbGVuYW1lLCB0aGlzX2RpcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJvcGVuaW5nIGEgZGlyZWN0b3J5IGRpZG4ndCByYWlzZSBhbiBJT0Vycm9yIikKKworICAgIGRlZiB0ZXN0TW9kZVN0cmluZ3Moc2VsZik6CisgICAgICAgICMgY2hlY2sgaW52YWxpZCBtb2RlIHN0cmluZ3MKKyAgICAgICAgZm9yIG1vZGUgaW4gKCIiLCAiYVUiLCAid1UrIik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCBtb2RlKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJyVyIGlzIGFuIGludmFsaWQgZmlsZSBtb2RlJyAlIG1vZGUpCisKKyAgICAgICAgIyBTb21lIGludmFsaWQgbW9kZXMgZmFpbCBvbiBXaW5kb3dzLCBidXQgcGFzcyBvbiBVbml4CisgICAgICAgICMgSXNzdWUzOTY1OiBhdm9pZCBhIGNyYXNoIG9uIFdpbmRvd3Mgd2hlbiBmaWxlbmFtZSBpcyB1bmljb2RlCisgICAgICAgIGZvciBuYW1lIGluIChURVNURk4sIHVuaWNvZGUoVEVTVEZOKSwgdW5pY29kZShURVNURk4gKyAnXHQnKSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4obmFtZSwgInJyIikKKyAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0U3RkaW4oc2VsZik6CisgICAgICAgICMgVGhpcyBjYXVzZXMgdGhlIGludGVycHJldGVyIHRvIGV4aXQgb24gT1NGMSB2NS4xLgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ29zZjFWNSc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBzeXMuc3RkaW4uc2VlaywgLTEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCA+PnN5cy5fX3N0ZG91dF9fLCAoCisgICAgICAgICAgICAgICAgJyAgU2tpcHBpbmcgc3lzLnN0ZGluLnNlZWsoLTEpLCBpdCBtYXkgY3Jhc2ggdGhlIGludGVycHJldGVyLicKKyAgICAgICAgICAgICAgICAnIFRlc3QgbWFudWFsbHkuJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgc3lzLnN0ZGluLnRydW5jYXRlKQorCisgICAgZGVmIHRlc3RVbmljb2RlT3BlbihzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgcmVwciB3b3JrcyBmb3IgdW5pY29kZSB0b28KKyAgICAgICAgZiA9IG9wZW4odW5pY29kZShURVNURk4pLCAidyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGYpLnN0YXJ0c3dpdGgoIjxvcGVuIGZpbGUgdSciICsgVEVTVEZOKSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIG9zLnVubGluayhURVNURk4pCisKKyAgICBkZWYgdGVzdEJhZE1vZGVBcmd1bWVudChzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgdGhhdCB3ZSBnZXQgYSBzZW5zaWJsZSBlcnJvciBtZXNzYWdlIGZvciBiYWQgbW9kZSBhcmd1bWVudAorICAgICAgICBiYWRfbW9kZSA9ICJxd2VydHkiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgYmFkX21vZGUpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBtc2c6CisgICAgICAgICAgICBpZiBtc2cuYXJnc1swXSAhPSAwOgorICAgICAgICAgICAgICAgIHMgPSBzdHIobXNnKQorICAgICAgICAgICAgICAgIGlmIFRFU1RGTiBpbiBzIG9yIGJhZF9tb2RlIG5vdCBpbiBzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImJhZCBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIG1vZGU6ICVzIiAlIHMpCisgICAgICAgICAgICAjIGlmIG1zZy5hcmdzWzBdID09IDAsIHdlJ3JlIHByb2JhYmx5IG9uIFdpbmRvd3Mgd2hlcmUgdGhlcmUgbWF5CisgICAgICAgICAgICAjIGJlIG5vIG9idmlvdXMgd2F5IHRvIGRpc2NvdmVyIHdoeSBvcGVuKCkgZmFpbGVkLgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIGVycm9yIGZvciBpbnZhbGlkIG1vZGU6ICVzIiAlIGJhZF9tb2RlKQorCisgICAgZGVmIHRlc3RTZXRCdWZmZXJTaXplKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IGV4cGxpY2l0bHkgc2V0dGluZyB0aGUgYnVmZmVyIHNpemUgZG9lc24ndCBjYXVzZQorICAgICAgICAjIG1pc2JlaGF2aW91ciBlc3BlY2lhbGx5IHdpdGggcmVwZWF0ZWQgY2xvc2UoKSBjYWxscworICAgICAgICBmb3IgcyBpbiAoLTEsIDAsIDEsIDUxMik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAndycsIHMpCisgICAgICAgICAgICAgICAgZi53cml0ZShzdHIocykpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAncicsIHMpCisgICAgICAgICAgICAgICAgZCA9IGludChmLnJlYWQoKSkKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdlcnJvciBzZXR0aW5nIGJ1ZmZlciBzaXplICVkOiAlcycgJSAocywgc3RyKG1zZykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBzKQorCisgICAgZGVmIHRlc3RUcnVuY2F0ZU9uV2luZG93cyhzZWxmKToKKyAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKworICAgICAgICBkZWYgYnVnODAxNjMxKCk6CisgICAgICAgICAgICAjIFNGIGJ1ZyA8aHR0cDovL3d3dy5weXRob24ub3JnL3NmLzgwMTYzMT4KKyAgICAgICAgICAgICMgImZpbGUudHJ1bmNhdGUgZmF1bHQgb24gd2luZG93cyIKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3diJykKKyAgICAgICAgICAgIGYud3JpdGUoJzEyMzQ1Njc4OTAxJykgICAjIDExIGJ5dGVzCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCdyYisnKQorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCg1KQorICAgICAgICAgICAgaWYgZGF0YSAhPSAnMTIzNDUnOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUmVhZCBvbiBmaWxlIG9wZW5lZCBmb3IgdXBkYXRlIGZhaWxlZCAlciIgJSBkYXRhKQorICAgICAgICAgICAgaWYgZi50ZWxsKCkgIT0gNToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkZpbGUgcG9zIGFmdGVyIHJlYWQgd3JvbmcgJWQiICUgZi50ZWxsKCkpCisKKyAgICAgICAgICAgIGYudHJ1bmNhdGUoKQorICAgICAgICAgICAgaWYgZi50ZWxsKCkgIT0gNToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkZpbGUgcG9zIGFmdGVyIGZ0cnVuY2F0ZSB3cm9uZyAlZCIgJSBmLnRlbGwoKSkKKworICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzaXplID0gb3MucGF0aC5nZXRzaXplKFRFU1RGTikKKyAgICAgICAgICAgIGlmIHNpemUgIT0gNToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkZpbGUgc2l6ZSBhZnRlciBmdHJ1bmNhdGUgd3JvbmcgJWQiICUgc2l6ZSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBidWc4MDE2MzEoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKworICAgIGRlZiB0ZXN0SXRlcmF0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhlIGNvbXBsZXggaW50ZXJhY3Rpb24gd2hlbiBtaXhpbmcgZmlsZS1pdGVyYXRpb24gYW5kIHRoZQorICAgICAgICAjIHZhcmlvdXMgcmVhZCogbWV0aG9kcy4gT3N0ZW5zaWJseSwgdGhlIG1peHR1cmUgY291bGQganVzdCBiZSB0ZXN0ZWQKKyAgICAgICAgIyB0byB3b3JrIHdoZW4gaXQgc2hvdWxkIHdvcmsgYWNjb3JkaW5nIHRvIHRoZSBQeXRob24gbGFuZ3VhZ2UsCisgICAgICAgICMgaW5zdGVhZCBvZiBmYWlsIHdoZW4gaXQgc2hvdWxkIGZhaWwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IENQeXRob24KKyAgICAgICAgIyBpbXBsZW1lbnRhdGlvbi4gIFBlb3BsZSBkb24ndCBhbHdheXMgcHJvZ3JhbSBQeXRob24gdGhlIHdheSB0aGV5CisgICAgICAgICMgc2hvdWxkLCB0aG91Z2gsIGFuZCB0aGUgaW1wbGVtZW5hdGlvbiBtaWdodCBjaGFuZ2UgaW4gc3VidGxlIHdheXMsCisgICAgICAgICMgc28gd2UgZXhwbGljaXRseSB0ZXN0IGZvciBlcnJvcnMsIHRvbzsgdGhlIHRlc3Qgd2lsbCBqdXN0IGhhdmUgdG8KKyAgICAgICAgIyBiZSB1cGRhdGVkIHdoZW4gdGhlIGltcGxlbWVudGF0aW9uIGNoYW5nZXMuCisgICAgICAgIGRhdGFvZmZzZXQgPSAxNjM4NAorICAgICAgICBmaWxsZXIgPSAiaGFtXG4iCisgICAgICAgIGFzc2VydCBub3QgZGF0YW9mZnNldCAlIGxlbihmaWxsZXIpLCBcCisgICAgICAgICAgICAiZGF0YW9mZnNldCBtdXN0IGJlIG11bHRpcGxlIG9mIGxlbihmaWxsZXIpIgorICAgICAgICBuY2h1bmtzID0gZGF0YW9mZnNldCAvLyBsZW4oZmlsbGVyKQorICAgICAgICB0ZXN0bGluZXMgPSBbCisgICAgICAgICAgICAic3BhbSwgc3BhbSBhbmQgZWdnc1xuIiwKKyAgICAgICAgICAgICJlZ2dzLCBzcGFtLCBoYW0gYW5kIHNwYW1cbiIsCisgICAgICAgICAgICAic2F1c3NhZ2VzLCBzcGFtLCBzcGFtIGFuZCBlZ2dzXG4iLAorICAgICAgICAgICAgInNwYW0sIGhhbSwgc3BhbSBhbmQgZWdnc1xuIiwKKyAgICAgICAgICAgICJzcGFtLCBzcGFtLCBzcGFtLCBzcGFtLCBzcGFtLCBoYW0sIHNwYW1cbiIsCisgICAgICAgICAgICAid29uZGVyZnVsIHNwYWFhYWFhbS5cbiIKKyAgICAgICAgXQorICAgICAgICBtZXRob2RzID0gWygicmVhZGxpbmUiLCAoKSksICgicmVhZCIsICgpKSwgKCJyZWFkbGluZXMiLCAoKSksCisgICAgICAgICAgICAgICAgICAgKCJyZWFkaW50byIsIChhcnJheSgiYyIsICIgIioxMDApLCkpXQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgUHJlcGFyZSB0aGUgdGVzdGZpbGUKKyAgICAgICAgICAgIGJhZyA9IG9wZW4oVEVTVEZOLCAidyIpCisgICAgICAgICAgICBiYWcud3JpdGUoZmlsbGVyICogbmNodW5rcykKKyAgICAgICAgICAgIGJhZy53cml0ZWxpbmVzKHRlc3RsaW5lcykKKyAgICAgICAgICAgIGJhZy5jbG9zZSgpCisgICAgICAgICAgICAjIFRlc3QgZm9yIGFwcHJvcHJpYXRlIGVycm9ycyBtaXhpbmcgcmVhZCogYW5kIGl0ZXJhdGlvbgorICAgICAgICAgICAgZm9yIG1ldGhvZG5hbWUsIGFyZ3MgaW4gbWV0aG9kczoKKyAgICAgICAgICAgICAgICBmID0gb3BlbihURVNURk4pCisgICAgICAgICAgICAgICAgaWYgZi5uZXh0KCkgIT0gZmlsbGVyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwsICJCcm9rZW4gdGVzdGZpbGUiCisgICAgICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIoZiwgbWV0aG9kbmFtZSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG1ldGgoKmFyZ3MpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzJXIgYWZ0ZXIgbmV4dCgpIGRpZG4ndCByYWlzZSBWYWx1ZUVycm9yIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1ldGhvZG5hbWUsIGFyZ3MpKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICAjIFRlc3QgdG8gc2VlIGlmIGhhcm1sZXNzIChieSBhY2NpZGVudCkgbWl4aW5nIG9mIHJlYWQqIGFuZAorICAgICAgICAgICAgIyBpdGVyYXRpb24gc3RpbGwgd29ya3MuIFRoaXMgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwKKyAgICAgICAgICAgICMgaXRlcmF0aW9uIGJ1ZmZlciAoY3VycmVudGx5IDgxOTIsKSBidXQgd2UgY2FuIHRlc3QgaXQgaW4gYQorICAgICAgICAgICAgIyBmbGV4aWJsZSBtYW5uZXIuICBFYWNoIGxpbmUgaW4gdGhlIGJhZyBvJyBoYW0gaXMgNCBieXRlcworICAgICAgICAgICAgIyAoImgiLCAiYSIsICJtIiwgIlxuIiksIHNvIDQwOTYgbGluZXMgb2YgdGhhdCBzaG91bGQgZ2V0IHVzCisgICAgICAgICAgICAjIGV4YWN0bHkgb24gdGhlIGJ1ZmZlciBib3VuZGFyeSBmb3IgYW55IHBvd2VyLW9mLTIgYnVmZmVyc2l6ZQorICAgICAgICAgICAgIyBiZXR3ZWVuIDQgYW5kIDE2Mzg0IChpbmNsdXNpdmUpLgorICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobmNodW5rcyk6CisgICAgICAgICAgICAgICAgZi5uZXh0KCkKKyAgICAgICAgICAgIHRlc3RsaW5lID0gdGVzdGxpbmVzLnBvcCgwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZGxpbmUoKSBhZnRlciBuZXh0KCkgd2l0aCBzdXBwb3NlZGx5IGVtcHR5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhdGlvbi1idWZmZXIgZmFpbGVkIGFueXdheSIpCisgICAgICAgICAgICBpZiBsaW5lICE9IHRlc3RsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZGxpbmUoKSBhZnRlciBuZXh0KCkgd2l0aCBlbXB0eSBidWZmZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkLiBHb3QgJXIsIGV4cGVjdGVkICVyIiAlIChsaW5lLCB0ZXN0bGluZSkpCisgICAgICAgICAgICB0ZXN0bGluZSA9IHRlc3RsaW5lcy5wb3AoMCkKKyAgICAgICAgICAgIGJ1ZiA9IGFycmF5KCJjIiwgIlx4MDAiICogbGVuKHRlc3RsaW5lKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmLnJlYWRpbnRvKGJ1ZikKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZGludG8oKSBhZnRlciBuZXh0KCkgd2l0aCBzdXBwb3NlZGx5IGVtcHR5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhdGlvbi1idWZmZXIgZmFpbGVkIGFueXdheSIpCisgICAgICAgICAgICBsaW5lID0gYnVmLnRvc3RyaW5nKCkKKyAgICAgICAgICAgIGlmIGxpbmUgIT0gdGVzdGxpbmU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWFkaW50bygpIGFmdGVyIG5leHQoKSB3aXRoIGVtcHR5IGJ1ZmZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQuIEdvdCAlciwgZXhwZWN0ZWQgJXIiICUgKGxpbmUsIHRlc3RsaW5lKSkKKworICAgICAgICAgICAgdGVzdGxpbmUgPSB0ZXN0bGluZXMucG9wKDApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGluZSA9IGYucmVhZChsZW4odGVzdGxpbmUpKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWFkKCkgYWZ0ZXIgbmV4dCgpIHdpdGggc3VwcG9zZWRseSBlbXB0eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVyYXRpb24tYnVmZmVyIGZhaWxlZCBhbnl3YXkiKQorICAgICAgICAgICAgaWYgbGluZSAhPSB0ZXN0bGluZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlYWQoKSBhZnRlciBuZXh0KCkgd2l0aCBlbXB0eSBidWZmZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkLiBHb3QgJXIsIGV4cGVjdGVkICVyIiAlIChsaW5lLCB0ZXN0bGluZSkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlYWRsaW5lcygpIGFmdGVyIG5leHQoKSB3aXRoIHN1cHBvc2VkbHkgZW1wdHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcmF0aW9uLWJ1ZmZlciBmYWlsZWQgYW55d2F5IikKKyAgICAgICAgICAgIGlmIGxpbmVzICE9IHRlc3RsaW5lczoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlYWRsaW5lcygpIGFmdGVyIG5leHQoKSB3aXRoIGVtcHR5IGJ1ZmZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQuIEdvdCAlciwgZXhwZWN0ZWQgJXIiICUgKGxpbmUsIHRlc3RsaW5lKSkKKyAgICAgICAgICAgICMgUmVhZGluZyBhZnRlciBpdGVyYXRpb24gaGl0IEVPRiBzaG91bGRuJ3QgaHVydCBlaXRoZXIKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgZi5yZWFkaW50byhidWYpCisgICAgICAgICAgICAgICAgICAgIGYucmVhZCgpCisgICAgICAgICAgICAgICAgICAgIGYucmVhZGxpbmVzKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWFkKiBmYWlsZWQgYWZ0ZXIgbmV4dCgpIGNvbnN1bWVkIGZpbGUiKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKK2NsYXNzIEZpbGVTdWJjbGFzc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0RXhpdChzZWxmKToKKyAgICAgICAgIyB0ZXN0IHRoYXQgZXhpdGluZyB3aXRoIGNvbnRleHQgY2FsbHMgc3ViY2xhc3MnIGNsb3NlCisgICAgICAgIGNsYXNzIEMoZmlsZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuc3ViY2xhc3NfY2xvc2VkID0gRmFsc2UKKyAgICAgICAgICAgICAgICBmaWxlLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgICAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuc3ViY2xhc3NfY2xvc2VkID0gVHJ1ZQorICAgICAgICAgICAgICAgIGZpbGUuY2xvc2Uoc2VsZikKKworICAgICAgICB3aXRoIEMoVEVTVEZOLCAndycpIGFzIGY6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLnN1YmNsYXNzX2Nsb3NlZCkKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgRmlsZVRocmVhZGluZ1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoZXNlIHRlc3RzIGNoZWNrIHRoZSBhYmlsaXR5IHRvIGNhbGwgdmFyaW91cyBtZXRob2RzIG9mIGZpbGUgb2JqZWN0cworICAgICMgKGluY2x1ZGluZyBjbG9zZSgpKSBjb25jdXJyZW50bHkgd2l0aG91dCBjcmFzaGluZyB0aGUgUHl0aG9uIGludGVycHJldGVyLgorICAgICMgU2VlICM4MTU2NDYsICM1OTU2MDEKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fdGhyZWFkcyA9IHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQorICAgICAgICBzZWxmLmYgPSBOb25lCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBURVNURk4KKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZW5hbWUsICJ3IikgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoIlxuIi5qb2luKCIwMTIzNDU2Nzg5IikpCisgICAgICAgIHNlbGYuX2NvdW50X2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIHNlbGYuY2xvc2VfY291bnQgPSAwCisgICAgICAgIHNlbGYuY2xvc2Vfc3VjY2Vzc19jb3VudCA9IDAKKyAgICAgICAgc2VsZi51c2VfYnVmZmVyaW5nID0gRmFsc2UKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5mOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgKEVudmlyb25tZW50RXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX2NsZWFudXAoKnNlbGYuX3RocmVhZHMpCisKKyAgICBkZWYgX2NyZWF0ZV9maWxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnVzZV9idWZmZXJpbmc6CisgICAgICAgICAgICBzZWxmLmYgPSBvcGVuKHNlbGYuZmlsZW5hbWUsICJ3KyIsIGJ1ZmZlcmluZz0xMDI0KjE2KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mID0gb3BlbihzZWxmLmZpbGVuYW1lLCAidysiKQorCisgICAgZGVmIF9jbG9zZV9maWxlKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuX2NvdW50X2xvY2s6CisgICAgICAgICAgICBzZWxmLmNsb3NlX2NvdW50ICs9IDEKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgd2l0aCBzZWxmLl9jb3VudF9sb2NrOgorICAgICAgICAgICAgc2VsZi5jbG9zZV9zdWNjZXNzX2NvdW50ICs9IDEKKworICAgIGRlZiBfY2xvc2VfYW5kX3Jlb3Blbl9maWxlKHNlbGYpOgorICAgICAgICBzZWxmLl9jbG9zZV9maWxlKCkKKyAgICAgICAgIyBpZiBjbG9zZSByYWlzZXMgYW4gZXhjZXB0aW9uIHRoYXRzIGZpbmUsIHNlbGYuZiByZW1haW5zIHZhbGlkIHNvCisgICAgICAgICMgd2UgZG9uJ3QgbmVlZCB0byByZW9wZW4uCisgICAgICAgIHNlbGYuX2NyZWF0ZV9maWxlKCkKKworICAgIGRlZiBfcnVuX3dvcmtlcnMoc2VsZiwgZnVuYywgbmJfd29ya2VycywgZHVyYXRpb249MC4yKToKKyAgICAgICAgd2l0aCBzZWxmLl9jb3VudF9sb2NrOgorICAgICAgICAgICAgc2VsZi5jbG9zZV9jb3VudCA9IDAKKyAgICAgICAgICAgIHNlbGYuY2xvc2Vfc3VjY2Vzc19jb3VudCA9IDAKKyAgICAgICAgc2VsZi5kb19jb250aW51ZSA9IFRydWUKKyAgICAgICAgdGhyZWFkcyA9IFtdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG5iX3dvcmtlcnMpOgorICAgICAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1mdW5jKQorICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgICAgIHRocmVhZHMuYXBwZW5kKHQpCisgICAgICAgICAgICBmb3IgXyBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKGR1cmF0aW9uLzEwMCkKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuX2NvdW50X2xvY2s6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuY2xvc2VfY291bnQtc2VsZi5jbG9zZV9zdWNjZXNzX2NvdW50ID4gbmJfd29ya2VycysxOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ1EnLAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoZHVyYXRpb24pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmRvX2NvbnRpbnVlID0gRmFsc2UKKyAgICAgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICAgICAgdC5qb2luKCkKKworICAgIGRlZiBfdGVzdF9jbG9zZV9vcGVuX2lvKHNlbGYsIGlvX2Z1bmMsIG5iX3dvcmtlcnM9NSk6CisgICAgICAgIGRlZiB3b3JrZXIoKToKKyAgICAgICAgICAgIHNlbGYuX2NyZWF0ZV9maWxlKCkKKyAgICAgICAgICAgIGZ1bmNzID0gaXRlcnRvb2xzLmN5Y2xlKCgKKyAgICAgICAgICAgICAgICBsYW1iZGE6IGlvX2Z1bmMoKSwKKyAgICAgICAgICAgICAgICBsYW1iZGE6IHNlbGYuX2Nsb3NlX2FuZF9yZW9wZW5fZmlsZSgpLAorICAgICAgICAgICAgKSkKKyAgICAgICAgICAgIGZvciBmIGluIGZ1bmNzOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRvX2NvbnRpbnVlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZigpCisgICAgICAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLl9ydW5fd29ya2Vycyh3b3JrZXIsIG5iX3dvcmtlcnMpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgIyBVc2VmdWwgdmVyYm9zZSBzdGF0aXN0aWNzIHdoZW4gdHVuaW5nIHRoaXMgdGVzdCB0byB0YWtlCisgICAgICAgICAgICAjIGxlc3MgdGltZSB0byBydW4gYnV0IHN0aWxsIGVuc3VyaW5nIHRoYXQgaXRzIHN0aWxsIHVzZWZ1bC4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgdGhlIHBlcmNlbnQgb2YgY2xvc2UgY2FsbHMgdGhhdCByYWlzZWQgYW4gZXJyb3IKKyAgICAgICAgICAgIHBlcmNlbnQgPSAxMDAuIC0gMTAwLipzZWxmLmNsb3NlX3N1Y2Nlc3NfY291bnQvc2VsZi5jbG9zZV9jb3VudAorICAgICAgICAgICAgcHJpbnQgc2VsZi5jbG9zZV9jb3VudCwgKCclLjRmICcgJSBwZXJjZW50KSwKKworICAgIGRlZiB0ZXN0X2Nsb3NlX29wZW4oc2VsZik6CisgICAgICAgIGRlZiBpb19mdW5jKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2Vfb3Blbl9pbyhpb19mdW5jKQorCisgICAgZGVmIHRlc3RfY2xvc2Vfb3Blbl9mbHVzaChzZWxmKToKKyAgICAgICAgZGVmIGlvX2Z1bmMoKToKKyAgICAgICAgICAgIHNlbGYuZi5mbHVzaCgpCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2Vfb3Blbl9pbyhpb19mdW5jKQorCisgICAgZGVmIHRlc3RfY2xvc2Vfb3Blbl9pdGVyKHNlbGYpOgorICAgICAgICBkZWYgaW9fZnVuYygpOgorICAgICAgICAgICAgbGlzdChpdGVyKHNlbGYuZikpCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2Vfb3Blbl9pbyhpb19mdW5jKQorCisgICAgZGVmIHRlc3RfY2xvc2Vfb3Blbl9pc2F0dHkoc2VsZik6CisgICAgICAgIGRlZiBpb19mdW5jKCk6CisgICAgICAgICAgICBzZWxmLmYuaXNhdHR5KCkKKyAgICAgICAgc2VsZi5fdGVzdF9jbG9zZV9vcGVuX2lvKGlvX2Z1bmMpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9vcGVuX3ByaW50KHNlbGYpOgorICAgICAgICBkZWYgaW9fZnVuYygpOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5mLCAnJworICAgICAgICBzZWxmLl90ZXN0X2Nsb3NlX29wZW5faW8oaW9fZnVuYykKKworICAgIGRlZiB0ZXN0X2Nsb3NlX29wZW5fcHJpbnRfYnVmZmVyZWQoc2VsZik6CisgICAgICAgIHNlbGYudXNlX2J1ZmZlcmluZyA9IFRydWUKKyAgICAgICAgZGVmIGlvX2Z1bmMoKToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuZiwgJycKKyAgICAgICAgc2VsZi5fdGVzdF9jbG9zZV9vcGVuX2lvKGlvX2Z1bmMpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9vcGVuX3JlYWQoc2VsZik6CisgICAgICAgIGRlZiBpb19mdW5jKCk6CisgICAgICAgICAgICBzZWxmLmYucmVhZCgwKQorICAgICAgICBzZWxmLl90ZXN0X2Nsb3NlX29wZW5faW8oaW9fZnVuYykKKworICAgIGRlZiB0ZXN0X2Nsb3NlX29wZW5fcmVhZGludG8oc2VsZik6CisgICAgICAgIGRlZiBpb19mdW5jKCk6CisgICAgICAgICAgICBhID0gYXJyYXkoJ2MnLCAneHh4eHgnKQorICAgICAgICAgICAgc2VsZi5mLnJlYWRpbnRvKGEpCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2Vfb3Blbl9pbyhpb19mdW5jKQorCisgICAgZGVmIHRlc3RfY2xvc2Vfb3Blbl9yZWFkbGluZShzZWxmKToKKyAgICAgICAgZGVmIGlvX2Z1bmMoKToKKyAgICAgICAgICAgIHNlbGYuZi5yZWFkbGluZSgpCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2Vfb3Blbl9pbyhpb19mdW5jKQorCisgICAgZGVmIHRlc3RfY2xvc2Vfb3Blbl9yZWFkbGluZXMoc2VsZik6CisgICAgICAgIGRlZiBpb19mdW5jKCk6CisgICAgICAgICAgICBzZWxmLmYucmVhZGxpbmVzKCkKKyAgICAgICAgc2VsZi5fdGVzdF9jbG9zZV9vcGVuX2lvKGlvX2Z1bmMpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9vcGVuX3NlZWsoc2VsZik6CisgICAgICAgIGRlZiBpb19mdW5jKCk6CisgICAgICAgICAgICBzZWxmLmYuc2VlaygwLCAwKQorICAgICAgICBzZWxmLl90ZXN0X2Nsb3NlX29wZW5faW8oaW9fZnVuYykKKworICAgIGRlZiB0ZXN0X2Nsb3NlX29wZW5fdGVsbChzZWxmKToKKyAgICAgICAgZGVmIGlvX2Z1bmMoKToKKyAgICAgICAgICAgIHNlbGYuZi50ZWxsKCkKKyAgICAgICAgc2VsZi5fdGVzdF9jbG9zZV9vcGVuX2lvKGlvX2Z1bmMpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9vcGVuX3RydW5jYXRlKHNlbGYpOgorICAgICAgICBkZWYgaW9fZnVuYygpOgorICAgICAgICAgICAgc2VsZi5mLnRydW5jYXRlKCkKKyAgICAgICAgc2VsZi5fdGVzdF9jbG9zZV9vcGVuX2lvKGlvX2Z1bmMpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9vcGVuX3dyaXRlKHNlbGYpOgorICAgICAgICBkZWYgaW9fZnVuYygpOgorICAgICAgICAgICAgc2VsZi5mLndyaXRlKCcnKQorICAgICAgICBzZWxmLl90ZXN0X2Nsb3NlX29wZW5faW8oaW9fZnVuYykKKworICAgIGRlZiB0ZXN0X2Nsb3NlX29wZW5fd3JpdGVsaW5lcyhzZWxmKToKKyAgICAgICAgZGVmIGlvX2Z1bmMoKToKKyAgICAgICAgICAgIHNlbGYuZi53cml0ZWxpbmVzKCcnKQorICAgICAgICBzZWxmLl90ZXN0X2Nsb3NlX29wZW5faW8oaW9fZnVuYykKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lID09ICdwb3NpeCcsICd0ZXN0IHJlcXVpcmVzIGEgcG9zaXggc3lzdGVtLicpCitjbGFzcyBUZXN0RmlsZVNpZ25hbEVJTlRSKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX3Rlc3RfcmVhZGluZyhzZWxmLCBkYXRhX3RvX3dyaXRlLCByZWFkX2FuZF92ZXJpZnlfY29kZSwgbWV0aG9kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPUZhbHNlKToKKyAgICAgICAgIiIiR2VuZXJpYyBidWZmZXJlZCByZWFkIG1ldGhvZCB0ZXN0IGhhcm5lc3MgdG8gdmVyaWZ5IEVJTlRSIGJlaGF2aW9yLgorCisgICAgICAgIEFsc28gdmFsaWRhdGVzIHRoYXQgUHl0aG9uIHNpZ25hbCBoYW5kbGVycyBhcmUgcnVuIGR1cmluZyB0aGUgcmVhZC4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgZGF0YV90b193cml0ZTogU3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBjaGlsZCBwcm9jZXNzIGZvciByZWFkaW5nCisgICAgICAgICAgICAgICAgYmVmb3JlIHNlbmRpbmcgaXQgYSBzaWduYWwsIGNvbmZpcm1pbmcgdGhlIHNpZ25hbCB3YXMgaGFuZGxlZCwKKyAgICAgICAgICAgICAgICB3cml0aW5nIGEgZmluYWwgbmV3bGluZSBjaGFyIGFuZCBjbG9zaW5nIHRoZSBpbmZpbGUgcGlwZS4KKyAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlOiBTaW5nbGUgImxpbmUiIG9mIGNvZGUgdG8gcmVhZCBmcm9tIGEgZmlsZQorICAgICAgICAgICAgICAgIG9iamVjdCBuYW1lZCAnaW5maWxlJyBhbmQgdmFsaWRhdGUgdGhlIHJlc3VsdC4gIFRoaXMgd2lsbCBiZQorICAgICAgICAgICAgICAgIGV4ZWN1dGVkIGFzIHBhcnQgb2YgYSBweXRob24gc3VicHJvY2VzcyBmZWQgZGF0YV90b193cml0ZS4KKyAgICAgICAgICAgIG1ldGhvZF9uYW1lOiBUaGUgbmFtZSBvZiB0aGUgcmVhZCBtZXRob2QgYmVpbmcgdGVzdGVkLCBmb3IgdXNlIGluCisgICAgICAgICAgICAgICAgYW4gZXJyb3IgbWVzc2FnZSBvbiBmYWlsdXJlLgorICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzOiBJZiBUcnVlLCBpbmZpbGUgd2lsbCBiZSBvcGVuZWQgaW4gdW5pdmVyc2FsCisgICAgICAgICAgICAgICAgbmV3bGluZSBtb2RlIGluIHRoZSBjaGlsZCBwcm9jZXNzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgdW5pdmVyc2FsX25ld2xpbmVzOgorICAgICAgICAgICAgIyBUZXN0IHRoZSBcclxuIC0+IFxuIGNvbnZlcnNpb24gd2hpbGUgd2UncmUgYXQgaXQuCisgICAgICAgICAgICBkYXRhX3RvX3dyaXRlID0gZGF0YV90b193cml0ZS5yZXBsYWNlKCdcbicsICdcclxuJykKKyAgICAgICAgICAgIGluZmlsZV9zZXR1cF9jb2RlID0gJ2luZmlsZSA9IG9zLmZkb3BlbihzeXMuc3RkaW4uZmlsZW5vKCksICJyVSIpJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5maWxlX3NldHVwX2NvZGUgPSAnaW5maWxlID0gc3lzLnN0ZGluJworICAgICAgICAjIFRvdGFsIHBpcGUgSU8gaW4gdGhpcyBmdW5jdGlvbiBpcyBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gcG9zaXggT1MKKyAgICAgICAgIyBwaXBlIGJ1ZmZlciBzaXplIG9mIDUxMiBieXRlcy4gIE5vIHdyaXRlciBzaG91bGQgYmxvY2suCisgICAgICAgIGFzc2VydCBsZW4oZGF0YV90b193cml0ZSkgPCA1MTIsICdkYXRhX3RvX3dyaXRlIG11c3QgZml0IGluIHBpcGUgYnVmLicKKworICAgICAgICBjaGlsZF9jb2RlID0gKAorICAgICAgICAgICAgICdpbXBvcnQgb3MsIHNpZ25hbCwgc3lzIDsnCisgICAgICAgICAgICAgJ3NpZ25hbC5zaWduYWwoJworICAgICAgICAgICAgICAgICAgICAgJ3NpZ25hbC5TSUdJTlQsIGxhbWJkYSBzLCBmOiBzeXMuc3RkZXJyLndyaXRlKCIkXFxuIikpIDsnCisgICAgICAgICAgICAgKyBpbmZpbGVfc2V0dXBfY29kZSArICcgOycgKworICAgICAgICAgICAgICdhc3NlcnQgaXNpbnN0YW5jZShpbmZpbGUsIGZpbGUpIDsnCisgICAgICAgICAgICAgJ3N5cy5zdGRlcnIud3JpdGUoIkdvLlxcbiIpIDsnCisgICAgICAgICAgICAgKyByZWFkX2FuZF92ZXJpZnlfY29kZSkKKyAgICAgICAgcmVhZGVyX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKAorICAgICAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgY2hpbGRfY29kZV0sCisgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgICMgV2FpdCBmb3IgdGhlIHNpZ25hbCBoYW5kbGVyIHRvIGJlIGluc3RhbGxlZC4KKyAgICAgICAgZ28gPSByZWFkZXJfcHJvY2Vzcy5zdGRlcnIucmVhZCg0KQorICAgICAgICBpZiBnbyAhPSAnR28uXG4nOgorICAgICAgICAgICAgcmVhZGVyX3Byb2Nlc3Mua2lsbCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoJ0Vycm9yIGZyb20gJXMgcHJvY2VzcyB3aGlsZSBhd2FpdGluZyAiR28iOlxuJXMnICUgKAorICAgICAgICAgICAgICAgICAgICBtZXRob2RfbmFtZSwgZ28rcmVhZGVyX3Byb2Nlc3Muc3RkZXJyLnJlYWQoKSkpCisgICAgICAgIHJlYWRlcl9wcm9jZXNzLnN0ZGluLndyaXRlKGRhdGFfdG9fd3JpdGUpCisgICAgICAgIHNpZ25hbHNfc2VudCA9IDAKKyAgICAgICAgcmxpc3QgPSBbXQorICAgICAgICAjIFdlIGRvbid0IGtub3cgd2hlbiB0aGUgcmVhZF9hbmRfdmVyaWZ5X2NvZGUgaW4gb3VyIGNoaWxkIGlzIGFjdHVhbGx5CisgICAgICAgICMgZXhlY3V0aW5nIHdpdGhpbiB0aGUgcmVhZCBzeXN0ZW0gY2FsbCB3ZSB3YW50IHRvIGludGVycnVwdC4gIFRoaXMKKyAgICAgICAgIyBsb29wIHdhaXRzIGZvciBhIGJpdCBiZWZvcmUgc2VuZGluZyB0aGUgZmlyc3Qgc2lnbmFsIHRvIGluY3JlYXNlCisgICAgICAgICMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhhdC4gIEltcGxlbWVudGF0aW9ucyB3aXRob3V0IGNvcnJlY3QgRUlOVFIKKyAgICAgICAgIyBhbmQgc2lnbmFsIGhhbmRsaW5nIHVzdWFsbHkgZmFpbCB0aGlzIHRlc3QuCisgICAgICAgIHdoaWxlIG5vdCBybGlzdDoKKyAgICAgICAgICAgIHJsaXN0LCBfLCBfID0gc2VsZWN0LnNlbGVjdChbcmVhZGVyX3Byb2Nlc3Muc3RkZXJyXSwgKCksICgpLCAwLjA1KQorICAgICAgICAgICAgcmVhZGVyX3Byb2Nlc3Muc2VuZF9zaWduYWwoc2lnbmFsLlNJR0lOVCkKKyAgICAgICAgICAgICMgR2l2ZSB0aGUgc3VicHJvY2VzcyB0aW1lIHRvIGhhbmRsZSBpdCBiZWZvcmUgd2UgbG9vcCBhcm91bmQgYW5kCisgICAgICAgICAgICAjIHNlbmQgYW5vdGhlciBvbmUuICBPbiBPU1ggdGhlIHNlY29uZCBzaWduYWwgaGFwcGVuaW5nIGNsb3NlIHRvCisgICAgICAgICAgICAjIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaXJzdCB3YXMgY2F1c2luZyB0aGUgc3VicHJvY2VzcyB0byBjcmFzaAorICAgICAgICAgICAgIyB2aWEgdGhlIE9TJ3MgZGVmYXVsdCBTSUdJTlQgaGFuZGxlci4KKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICAgICAgc2lnbmFsc19zZW50ICs9IDEKKyAgICAgICAgICAgIGlmIHNpZ25hbHNfc2VudCA+IDIwMDoKKyAgICAgICAgICAgICAgICByZWFkZXJfcHJvY2Vzcy5raWxsKCkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImZhaWxlZCB0byBoYW5kbGUgc2lnbmFsIGR1cmluZyAlcy4iICUgbWV0aG9kX25hbWUpCisgICAgICAgICMgVGhpcyBhc3N1bWVzIGFueXRoaW5nIHVuZXhwZWN0ZWQgdGhhdCB3cml0ZXMgdG8gc3RkZXJyIHdpbGwgYWxzbworICAgICAgICAjIHdyaXRlIGEgbmV3bGluZS4gIFRoYXQgaXMgdHJ1ZSBvZiB0aGUgdHJhY2ViYWNrIHByaW50aW5nIGNvZGUuCisgICAgICAgIHNpZ25hbF9saW5lID0gcmVhZGVyX3Byb2Nlc3Muc3RkZXJyLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgc2lnbmFsX2xpbmUgIT0gJyRcbic6CisgICAgICAgICAgICByZWFkZXJfcHJvY2Vzcy5raWxsKCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnRXJyb3IgZnJvbSAlcyBwcm9jZXNzIHdoaWxlIGF3YWl0aW5nIHNpZ25hbDpcbiVzJyAlICgKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kX25hbWUsIHNpZ25hbF9saW5lK3JlYWRlcl9wcm9jZXNzLnN0ZGVyci5yZWFkKCkpKQorICAgICAgICAjIFdlIGFwcGVuZCBhIG5ld2xpbmUgdG8gb3VyIGlucHV0IHNvIHRoYXQgYSByZWFkbGluZSBjYWxsIGNhbgorICAgICAgICAjIGVuZCBvbiBpdHMgb3duIGJlZm9yZSB0aGUgRU9GIGlzIHNlZW4uCisgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcmVhZGVyX3Byb2Nlc3MuY29tbXVuaWNhdGUoaW5wdXQ9J1xuJykKKyAgICAgICAgaWYgcmVhZGVyX3Byb2Nlc3MucmV0dXJuY29kZSAhPSAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCclcygpIHByb2Nlc3MgZXhpdGVkIHJjPSVkLlxuU1RET1VUOlxuJXNcblNUREVSUjpcbiVzJyAlICgKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kX25hbWUsIHJlYWRlcl9wcm9jZXNzLnJldHVybmNvZGUsIHN0ZG91dCwgc3RkZXJyKSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYsIHVuaXZlcnNhbF9uZXdsaW5lcz1GYWxzZSk6CisgICAgICAgICIiImZpbGUucmVhZGxpbmUgbXVzdCBoYW5kbGUgc2lnbmFscyBhbmQgbm90IGxvc2UgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9J2hlbGxvLCB3b3JsZCEnLAorICAgICAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlPSgKKyAgICAgICAgICAgICAgICAgICAgICAgICdsaW5lID0gaW5maWxlLnJlYWRsaW5lKCkgOycKKyAgICAgICAgICAgICAgICAgICAgICAgICdleHBlY3RlZF9saW5lID0gImhlbGxvLCB3b3JsZCFcXG4iIDsnCisgICAgICAgICAgICAgICAgICAgICAgICAnYXNzZXJ0IGxpbmUgPT0gZXhwZWN0ZWRfbGluZSwgKCcKKyAgICAgICAgICAgICAgICAgICAgICAgICcicmVhZCAlciBleHBlY3RlZCAlciIgJSAobGluZSwgZXhwZWN0ZWRfbGluZSkpJworICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgbWV0aG9kX25hbWU9J3JlYWRsaW5lJywKKyAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9dW5pdmVyc2FsX25ld2xpbmVzKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVfd2l0aF91bml2ZXJzYWxfbmV3bGluZXMoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF9yZWFkbGluZSh1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lcyhzZWxmLCB1bml2ZXJzYWxfbmV3bGluZXM9RmFsc2UpOgorICAgICAgICAiIiJmaWxlLnJlYWRsaW5lcyBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT0naGVsbG9cbndvcmxkIScsCisgICAgICAgICAgICAgICAgcmVhZF9hbmRfdmVyaWZ5X2NvZGU9KAorICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmVzID0gaW5maWxlLnJlYWRsaW5lcygpIDsnCisgICAgICAgICAgICAgICAgICAgICAgICAnZXhwZWN0ZWRfbGluZXMgPSBbImhlbGxvXFxuIiwgIndvcmxkIVxcbiJdIDsnCisgICAgICAgICAgICAgICAgICAgICAgICAnYXNzZXJ0IGxpbmVzID09IGV4cGVjdGVkX2xpbmVzLCAoJworICAgICAgICAgICAgICAgICAgICAgICAgJyJyZWFkbGluZXMgcmV0dXJuZWQgd3JvbmcgZGF0YS5cXG4iICcKKyAgICAgICAgICAgICAgICAgICAgICAgICciZ290IGxpbmVzICVyXFxuZXhwZWN0ZWQgICVyIiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnJSAobGluZXMsIGV4cGVjdGVkX2xpbmVzKSknCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICBtZXRob2RfbmFtZT0ncmVhZGxpbmVzJywKKyAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9dW5pdmVyc2FsX25ld2xpbmVzKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzX3dpdGhfdW5pdmVyc2FsX25ld2xpbmVzKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3RfcmVhZGxpbmVzKHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKQorCisgICAgZGVmIHRlc3RfcmVhZGFsbChzZWxmKToKKyAgICAgICAgIiIiVW5ib3VuZGVkIGZpbGUucmVhZCgpIG11c3QgaGFuZGxlIHNpZ25hbHMgYW5kIG5vdCBsb3NlIGRhdGEuIiIiCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGluZygKKyAgICAgICAgICAgICAgICBkYXRhX3RvX3dyaXRlPSdoZWxsbywgd29ybGQhYWJjZGVmZ2hpamtsbScsCisgICAgICAgICAgICAgICAgcmVhZF9hbmRfdmVyaWZ5X2NvZGU9KAorICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEgPSBpbmZpbGUucmVhZCgpIDsnCisgICAgICAgICAgICAgICAgICAgICAgICAnZXhwZWN0ZWRfZGF0YSA9ICJoZWxsbywgd29ybGQhYWJjZGVmZ2hpamtsbVxcbiI7JworICAgICAgICAgICAgICAgICAgICAgICAgJ2Fzc2VydCBkYXRhID09IGV4cGVjdGVkX2RhdGEsICgnCisgICAgICAgICAgICAgICAgICAgICAgICAnInJlYWQgJXIgZXhwZWN0ZWQgJXIiICUgKGRhdGEsIGV4cGVjdGVkX2RhdGEpKScKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIG1ldGhvZF9uYW1lPSd1bmJvdW5kZWQgcmVhZCcpCisKKyAgICBkZWYgdGVzdF9yZWFkaW50byhzZWxmKToKKyAgICAgICAgIiIiZmlsZS5yZWFkaW50byBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT0naGVsbG8sIHdvcmxkIScsCisgICAgICAgICAgICAgICAgcmVhZF9hbmRfdmVyaWZ5X2NvZGU9KAorICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEgPSBieXRlYXJyYXkoNTApIDsnCisgICAgICAgICAgICAgICAgICAgICAgICAnbnVtX3JlYWQgPSBpbmZpbGUucmVhZGludG8oZGF0YSkgOycKKyAgICAgICAgICAgICAgICAgICAgICAgICdleHBlY3RlZF9kYXRhID0gImhlbGxvLCB3b3JsZCFcXG4iOycKKyAgICAgICAgICAgICAgICAgICAgICAgICdhc3NlcnQgZGF0YVs6bnVtX3JlYWRdID09IGV4cGVjdGVkX2RhdGEsICgnCisgICAgICAgICAgICAgICAgICAgICAgICAnInJlYWQgJXIgZXhwZWN0ZWQgJXIiICUgKGRhdGEsIGV4cGVjdGVkX2RhdGEpKScKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIG1ldGhvZF9uYW1lPSdyZWFkaW50bycpCisKKworY2xhc3MgU3Rkb3V0VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbW92ZV9zdGRvdXRfb25fd3JpdGUoc2VsZik6CisgICAgICAgICMgSXNzdWUgMzI0Mjogc3lzLnN0ZG91dCBjYW4gYmUgcmVwbGFjZWQgKGFuZCBmcmVlZCkgZHVyaW5nIGEKKyAgICAgICAgIyBwcmludCBzdGF0ZW1lbnQ7IHByZXZlbnQgYSBzZWdmYXVsdCBpbiB0aGlzIGNhc2UKKyAgICAgICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisKKyAgICAgICAgY2xhc3MgRmlsZToKKyAgICAgICAgICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgICAgICAgICBpZiAnXG4nIGluIGRhdGE6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlX3N0ZG91dAorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBGaWxlKCkKKyAgICAgICAgICAgIHByaW50ICJzb21lIHRleHQiCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKKworICAgIGRlZiB0ZXN0X2RlbF9zdGRvdXRfYmVmb3JlX3ByaW50KHNlbGYpOgorICAgICAgICAjIElzc3VlIDQ1OTc6ICdwcmludCcgd2l0aCBubyBhcmd1bWVudCB3YXNuJ3QgcmVwb3J0aW5nIHdoZW4KKyAgICAgICAgIyBzeXMuc3Rkb3V0IHdhcyBkZWxldGVkLgorICAgICAgICBzYXZlX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgZGVsIHN5cy5zdGRvdXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICJsb3N0IHN5cy5zdGRvdXQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCBSdW50aW1lRXJyb3IiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CisKKyAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOgorICAgICAgICBpbXBvcnQgc3VicHJvY2VzcworCisgICAgICAgIGRlZiBnZXRfbWVzc2FnZShlbmNvZGluZywgKmNvZGUpOgorICAgICAgICAgICAgY29kZSA9ICdcbicuam9pbihjb2RlKQorICAgICAgICAgICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgICAgIGVudlsnUFlUSE9OSU9FTkNPRElORyddID0gZW5jb2RpbmcKKyAgICAgICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgY29kZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBlbnY9ZW52KQorICAgICAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvY2Vzcy5yZXR1cm5jb2RlLCAwKQorICAgICAgICAgICAgcmV0dXJuIHN0ZG91dAorCisgICAgICAgIGRlZiBjaGVja19tZXNzYWdlKHRleHQsIGVuY29kaW5nLCBleHBlY3RlZCk6CisgICAgICAgICAgICBzdGRvdXQgPSBnZXRfbWVzc2FnZShlbmNvZGluZywKKyAgICAgICAgICAgICAgICAiaW1wb3J0IHN5cyIsCisgICAgICAgICAgICAgICAgInN5cy5zdGRvdXQud3JpdGUoJXIpIiAlIHRleHQsCisgICAgICAgICAgICAgICAgInN5cy5zdGRvdXQuZmx1c2goKSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dCwgZXhwZWN0ZWQpCisKKyAgICAgICAgIyB0ZXN0IHRoZSBlbmNvZGluZworICAgICAgICBjaGVja19tZXNzYWdlKHUnMTVcdTIwYWMnLCAiaXNvLTg4NTktMTUiLCAiMTVceGE0IikKKyAgICAgICAgY2hlY2tfbWVzc2FnZSh1JzE1XHUyMGFjJywgInV0Zi04IiwgJzE1XHhlMlx4ODJceGFjJykKKyAgICAgICAgY2hlY2tfbWVzc2FnZSh1JzE1XHUyMGFjJywgInV0Zi0xNi1sZSIsICcxXHgwMDVceDAwXHhhY1x4MjAnKQorCisgICAgICAgICMgdGVzdCB0aGUgZXJyb3IgaGFuZGxlcgorICAgICAgICBjaGVja19tZXNzYWdlKHUnMTVcdTIwYWMnLCAiaXNvLTg4NTktMTppZ25vcmUiLCAiMTUiKQorICAgICAgICBjaGVja19tZXNzYWdlKHUnMTVcdTIwYWMnLCAiaXNvLTg4NTktMTpyZXBsYWNlIiwgIjE1PyIpCisgICAgICAgIGNoZWNrX21lc3NhZ2UodScxNVx1MjBhYycsICJpc28tODg1OS0xOmJhY2tzbGFzaHJlcGxhY2UiLCAiMTVcXHUyMGFjIikKKworICAgICAgICAjIHRlc3QgdGhlIGJ1ZmZlciBBUEkKKyAgICAgICAgZm9yIG9ianR5cGUgaW4gKCdidWZmZXInLCAnYnl0ZWFycmF5Jyk6CisgICAgICAgICAgICBzdGRvdXQgPSBnZXRfbWVzc2FnZSgnYXNjaWknLAorICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzJywKKyAgICAgICAgICAgICAgICByJ3N5cy5zdGRvdXQud3JpdGUoJXMoIlx4ZTkiKSknICUgb2JqdHlwZSwKKyAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC5mbHVzaCgpJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LCAiXHhlOSIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgICMgSGlzdG9yaWNhbGx5LCB0aGVzZSB0ZXN0cyBoYXZlIGJlZW4gc2xvcHB5IGFib3V0IHJlbW92aW5nIFRFU1RGTi4KKyAgICAjIFNvIGdldCByaWQgb2YgaXQgbm8gbWF0dGVyIHdoYXQuCisgICAgdHJ5OgorICAgICAgICBydW5fdW5pdHRlc3QoQXV0b0ZpbGVUZXN0cywgT3RoZXJGaWxlVGVzdHMsIEZpbGVTdWJjbGFzc1Rlc3RzLAorICAgICAgICAgICAgRmlsZVRocmVhZGluZ1Rlc3RzLCBUZXN0RmlsZVNpZ25hbEVJTlRSLCBTdGRvdXRUZXN0cykKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhURVNURk4pOgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZTJrLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUyay5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1NjgzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUyay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZTJrLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUyay5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjMWM2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUyay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZV9laW50ci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVfZWludHIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiZmYzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVfZWludHIucHkKQEAgLTAsMCArMSwyMzkgQEAKKyMgV3JpdHRlbiB0byB0ZXN0IGludGVycnVwdGVkIHN5c3RlbSBjYWxscyBpbnRlcmZlcmluZyB3aXRoIG91ciBtYW55IGJ1ZmZlcmVkCisjIElPIGltcGxlbWVudGF0aW9ucy4gIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMjI2OAorIworIyBUaGlzIHRlc3RzIHRoZSAnX2lvJyBtb2R1bGUuICBTaW1pbGFyIHRlc3RzIGZvciBQeXRob24gMi54J3Mgb2xkZXIKKyMgZGVmYXVsdCBmaWxlIEkvTyBpbXBsZW1lbnRhdGlvbiBleGlzdCB3aXRoaW4gdGVzdF9maWxlMmsucHkuCisjCisjIEl0IHdhcyBzdWdnZXN0ZWQgdGhhdCB0aGlzIGNvZGUgY291bGQgYmUgbWVyZ2VkIGludG8gdGVzdF9pbyBhbmQgdGhlIHRlc3RzCisjIG1hZGUgdG8gd29yayB1c2luZyB0aGUgc2FtZSBtZXRob2QgYXMgdGhlIGV4aXN0aW5nIHNpZ25hbCB0ZXN0cyBpbiB0ZXN0X2lvLgorIyBJIHdhcyB1bmFibGUgdG8gZ2V0IHNpbmdsZSBwcm9jZXNzIHRlc3RzIHVzaW5nIGFsYXJtIG9yIHNldGl0aW1lciB0aGF0IHdheQorIyB0byByZXByb2R1Y2UgdGhlIEVJTlRSIHByb2JsZW1zLiAgVGhpcyBwcm9jZXNzIGJhc2VkIHRlc3Qgc3VpdGUgcmVwcm9kdWNlcworIyB0aGUgcHJvYmxlbXMgcHJpb3IgdG8gdGhlIGlzc3VlMTIyNjggcGF0Y2ggcmVsaWFibHkgb24gTGludXggYW5kIE9TWC4KKyMgIC0gZ3JlZ29yeS5wLnNtaXRoCisKK2ltcG9ydCBvcworaW1wb3J0IHNlbGVjdAoraW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAoraW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorCisjIFRlc3QgaW1wb3J0IGFsbCBvZiB0aGUgdGhpbmdzIHdlJ3JlIGFib3V0IHRvIHRyeSB0ZXN0aW5nIHVwIGZyb250LgorZnJvbSBfaW8gaW1wb3J0IEZpbGVJTworCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gJ3Bvc2l4JywgJ3Rlc3RzIHJlcXVpcmVzIGEgcG9zaXggc3lzdGVtLicpCitjbGFzcyBUZXN0RmlsZUlPU2lnbmFsSW50ZXJydXB0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3Byb2Nlc3MgPSBOb25lCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3Byb2Nlc3MgYW5kIHNlbGYuX3Byb2Nlc3MucG9sbCgpIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fcHJvY2Vzcy5raWxsKCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfZ2VuZXJhdGVfaW5maWxlX3NldHVwX2NvZGUoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdGhlIGluZmlsZSA9IC4uLiBsaW5lIG9mIGNvZGUgZm9yIHRoZSByZWFkZXIgcHJvY2Vzcy4KKworICAgICAgICBzdWJjbGFzc2VzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdG8gdGVzdCBkaWZmZXJlbnQgSU8gb2JqZWN0cy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAoJ2ltcG9ydCBfaW8gOycKKyAgICAgICAgICAgICAgICAnaW5maWxlID0gX2lvLkZpbGVJTyhzeXMuc3RkaW4uZmlsZW5vKCksICJyYiIpJykKKworICAgIGRlZiBmYWlsX3dpdGhfcHJvY2Vzc19pbmZvKHNlbGYsIHdoeSwgc3Rkb3V0PWInJywgc3RkZXJyPWInJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tdW5pY2F0ZT1UcnVlKToKKyAgICAgICAgIiIiQSBjb21tb24gd2F5IHRvIGNsZWFudXAgYW5kIGZhaWwgd2l0aCB1c2VmdWwgZGVidWcgb3V0cHV0LgorCisgICAgICAgIEtpbGxzIHRoZSBwcm9jZXNzIGlmIGl0IGlzIHN0aWxsIHJ1bm5pbmcsIGNvbGxlY3RzIHJlbWFpbmluZyBvdXRwdXQKKyAgICAgICAgYW5kIGZhaWxzIHRoZSB0ZXN0IHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmNsdWRpbmcgdGhlIG91dHB1dC4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgd2h5OiBUZXh0IHRvIGdvIGFmdGVyICJFcnJvciBmcm9tIElPIHByb2Nlc3MiIGluIHRoZSBtZXNzYWdlLgorICAgICAgICAgICAgc3Rkb3V0LCBzdGRlcnI6IHN0YW5kYXJkIG91dHB1dCBhbmQgZXJyb3IgZnJvbSB0aGUgcHJvY2VzcyBzbworICAgICAgICAgICAgICAgIGZhciB0byBpbmNsdWRlIGluIHRoZSBlcnJvciBtZXNzYWdlLgorICAgICAgICAgICAgY29tbXVuaWNhdGU6IGJvb2wsIHdoZW4gVHJ1ZSB3ZSBjYWxsIGNvbW11bmljYXRlKCkgb24gdGhlIHByb2Nlc3MKKyAgICAgICAgICAgICAgICBhZnRlciBraWxsaW5nIGl0IHRvIGdhdGhlciBhZGRpdGlvbmFsIG91dHB1dC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX3Byb2Nlc3MucG9sbCgpIGlzIE5vbmU6CisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkgICMgZ2l2ZSBpdCB0aW1lIHRvIGZpbmlzaCBwcmludGluZyB0aGUgZXJyb3IuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fcHJvY2Vzcy50ZXJtaW5hdGUoKSAgIyBFbnN1cmUgaXQgZGllcy4KKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgY29tbXVuaWNhdGU6CisgICAgICAgICAgICBzdGRvdXRfZW5kLCBzdGRlcnJfZW5kID0gc2VsZi5fcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgICAgICAgICBzdGRvdXQgKz0gc3Rkb3V0X2VuZAorICAgICAgICAgICAgc3RkZXJyICs9IHN0ZGVycl9lbmQKKyAgICAgICAgc2VsZi5mYWlsKCdFcnJvciBmcm9tIElPIHByb2Nlc3MgJXM6XG5TVERPVVQ6XG4lc1NUREVSUjpcbiVzXG4nICUKKyAgICAgICAgICAgICAgICAgICh3aHksIHN0ZG91dC5kZWNvZGUoKSwgc3RkZXJyLmRlY29kZSgpKSkKKworICAgIGRlZiBfdGVzdF9yZWFkaW5nKHNlbGYsIGRhdGFfdG9fd3JpdGUsIHJlYWRfYW5kX3ZlcmlmeV9jb2RlKToKKyAgICAgICAgIiIiR2VuZXJpYyBidWZmZXJlZCByZWFkIG1ldGhvZCB0ZXN0IGhhcm5lc3MgdG8gdmFsaWRhdGUgRUlOVFIgYmVoYXZpb3IuCisKKyAgICAgICAgQWxzbyB2YWxpZGF0ZXMgdGhhdCBQeXRob24gc2lnbmFsIGhhbmRsZXJzIGFyZSBydW4gZHVyaW5nIHRoZSByZWFkLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBkYXRhX3RvX3dyaXRlOiBTdHJpbmcgdG8gd3JpdGUgdG8gdGhlIGNoaWxkIHByb2Nlc3MgZm9yIHJlYWRpbmcKKyAgICAgICAgICAgICAgICBiZWZvcmUgc2VuZGluZyBpdCBhIHNpZ25hbCwgY29uZmlybWluZyB0aGUgc2lnbmFsIHdhcyBoYW5kbGVkLAorICAgICAgICAgICAgICAgIHdyaXRpbmcgYSBmaW5hbCBuZXdsaW5lIGFuZCBjbG9zaW5nIHRoZSBpbmZpbGUgcGlwZS4KKyAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlOiBTaW5nbGUgImxpbmUiIG9mIGNvZGUgdG8gcmVhZCBmcm9tIGEgZmlsZQorICAgICAgICAgICAgICAgIG9iamVjdCBuYW1lZCAnaW5maWxlJyBhbmQgdmFsaWRhdGUgdGhlIHJlc3VsdC4gIFRoaXMgd2lsbCBiZQorICAgICAgICAgICAgICAgIGV4ZWN1dGVkIGFzIHBhcnQgb2YgYSBweXRob24gc3VicHJvY2VzcyBmZWQgZGF0YV90b193cml0ZS4KKyAgICAgICAgIiIiCisgICAgICAgIGluZmlsZV9zZXR1cF9jb2RlID0gc2VsZi5fZ2VuZXJhdGVfaW5maWxlX3NldHVwX2NvZGUoKQorICAgICAgICAjIFRvdGFsIHBpcGUgSU8gaW4gdGhpcyBmdW5jdGlvbiBpcyBzbWFsbGVyIHRoYW4gdGhlIG1pbmltdW0gcG9zaXggT1MKKyAgICAgICAgIyBwaXBlIGJ1ZmZlciBzaXplIG9mIDUxMiBieXRlcy4gIE5vIHdyaXRlciBzaG91bGQgYmxvY2suCisgICAgICAgIGFzc2VydCBsZW4oZGF0YV90b193cml0ZSkgPCA1MTIsICdkYXRhX3RvX3dyaXRlIG11c3QgZml0IGluIHBpcGUgYnVmLicKKworICAgICAgICAjIFN0YXJ0IGEgc3VicHJvY2VzcyB0byBjYWxsIG91ciByZWFkIG1ldGhvZCB3aGlsZSBoYW5kbGluZyBhIHNpZ25hbC4KKyAgICAgICAgc2VsZi5fcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oCisgICAgICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnLXUnLCAnLWMnLAorICAgICAgICAgICAgICAgICAnaW1wb3J0IGlvLCBzaWduYWwsIHN5cyA7JworICAgICAgICAgICAgICAgICAnc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhbWJkYSBzLCBmOiBzeXMuc3RkZXJyLndyaXRlKCIkXFxuIikpIDsnCisgICAgICAgICAgICAgICAgICsgaW5maWxlX3NldHVwX2NvZGUgKyAnIDsnICsKKyAgICAgICAgICAgICAgICAgJ3N5cy5zdGRlcnIud3JpdGUoIldvcm0gU2lnbiFcXG4iKSA7JworICAgICAgICAgICAgICAgICArIHJlYWRfYW5kX3ZlcmlmeV9jb2RlICsgJyA7JyArCisgICAgICAgICAgICAgICAgICdpbmZpbGUuY2xvc2UoKScKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorCisgICAgICAgICMgV2FpdCBmb3IgdGhlIHNpZ25hbCBoYW5kbGVyIHRvIGJlIGluc3RhbGxlZC4KKyAgICAgICAgd29ybV9zaWduID0gc2VsZi5fcHJvY2Vzcy5zdGRlcnIucmVhZChsZW4oYidXb3JtIFNpZ24hXG4nKSkKKyAgICAgICAgaWYgd29ybV9zaWduICE9IGInV29ybSBTaWduIVxuJzogICMgU2VlIGFsc28sIER1bmUgYnkgRnJhbmsgSGVyYmVydC4KKyAgICAgICAgICAgIHNlbGYuZmFpbF93aXRoX3Byb2Nlc3NfaW5mbygnd2hpbGUgYXdhaXRpbmcgYSBzaWduJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9d29ybV9zaWduKQorICAgICAgICBzZWxmLl9wcm9jZXNzLnN0ZGluLndyaXRlKGRhdGFfdG9fd3JpdGUpCisKKyAgICAgICAgc2lnbmFsc19zZW50ID0gMAorICAgICAgICBybGlzdCA9IFtdCisgICAgICAgICMgV2UgZG9uJ3Qga25vdyB3aGVuIHRoZSByZWFkX2FuZF92ZXJpZnlfY29kZSBpbiBvdXIgY2hpbGQgaXMgYWN0dWFsbHkKKyAgICAgICAgIyBleGVjdXRpbmcgd2l0aGluIHRoZSByZWFkIHN5c3RlbSBjYWxsIHdlIHdhbnQgdG8gaW50ZXJydXB0LiAgVGhpcworICAgICAgICAjIGxvb3Agd2FpdHMgZm9yIGEgYml0IGJlZm9yZSBzZW5kaW5nIHRoZSBmaXJzdCBzaWduYWwgdG8gaW5jcmVhc2UKKyAgICAgICAgIyB0aGUgbGlrZWxpaG9vZCBvZiB0aGF0LiAgSW1wbGVtZW50YXRpb25zIHdpdGhvdXQgY29ycmVjdCBFSU5UUgorICAgICAgICAjIGFuZCBzaWduYWwgaGFuZGxpbmcgdXN1YWxseSBmYWlsIHRoaXMgdGVzdC4KKyAgICAgICAgd2hpbGUgbm90IHJsaXN0OgorICAgICAgICAgICAgcmxpc3QsIF8sIF8gPSBzZWxlY3Quc2VsZWN0KFtzZWxmLl9wcm9jZXNzLnN0ZGVycl0sICgpLCAoKSwgMC4wNSkKKyAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3Muc2VuZF9zaWduYWwoc2lnbmFsLlNJR0lOVCkKKyAgICAgICAgICAgIHNpZ25hbHNfc2VudCArPSAxCisgICAgICAgICAgICBpZiBzaWduYWxzX3NlbnQgPiAyMDA6CisgICAgICAgICAgICAgICAgc2VsZi5fcHJvY2Vzcy5raWxsKCkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ3JlYWRlciBwcm9jZXNzIGZhaWxlZCB0byBoYW5kbGUgb3VyIHNpZ25hbHMuJykKKyAgICAgICAgIyBUaGlzIGFzc3VtZXMgYW55dGhpbmcgdW5leHBlY3RlZCB0aGF0IHdyaXRlcyB0byBzdGRlcnIgd2lsbCBhbHNvCisgICAgICAgICMgd3JpdGUgYSBuZXdsaW5lLiAgVGhhdCBpcyB0cnVlIG9mIHRoZSB0cmFjZWJhY2sgcHJpbnRpbmcgY29kZS4KKyAgICAgICAgc2lnbmFsX2xpbmUgPSBzZWxmLl9wcm9jZXNzLnN0ZGVyci5yZWFkbGluZSgpCisgICAgICAgIGlmIHNpZ25hbF9saW5lICE9IGInJFxuJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbF93aXRoX3Byb2Nlc3NfaW5mbygnd2hpbGUgYXdhaXRpbmcgc2lnbmFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c2lnbmFsX2xpbmUpCisKKyAgICAgICAgIyBXZSBhcHBlbmQgYSBuZXdsaW5lIHRvIG91ciBpbnB1dCBzbyB0aGF0IGEgcmVhZGxpbmUgY2FsbCBjYW4KKyAgICAgICAgIyBlbmQgb24gaXRzIG93biBiZWZvcmUgdGhlIEVPRiBpcyBzZWVuIGFuZCBzbyB0aGF0IHdlJ3JlIHRlc3RpbmcKKyAgICAgICAgIyB0aGUgcmVhZCBjYWxsIHRoYXQgd2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsIGJlZm9yZSB0aGUgZW5kIG9mCisgICAgICAgICMgdGhlIGRhdGEgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQuCisgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gc2VsZi5fcHJvY2Vzcy5jb21tdW5pY2F0ZShpbnB1dD1iJ1xuJykKKyAgICAgICAgaWYgc2VsZi5fcHJvY2Vzcy5yZXR1cm5jb2RlOgorICAgICAgICAgICAgc2VsZi5mYWlsX3dpdGhfcHJvY2Vzc19pbmZvKAorICAgICAgICAgICAgICAgICAgICAnZXhpdGVkIHJjPSVkJyAlIHNlbGYuX3Byb2Nlc3MucmV0dXJuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgc3Rkb3V0LCBzdGRlcnIsIGNvbW11bmljYXRlPUZhbHNlKQorICAgICAgICAjIFBBU1MhCisKKyAgICAjIFN0cmluZyBmb3JtYXQgZm9yIHRoZSByZWFkX2FuZF92ZXJpZnlfY29kZSB1c2VkIGJ5IHJlYWQgbWV0aG9kcy4KKyAgICBfUkVBRElOR19DT0RFX1RFTVBMQVRFID0gKAorICAgICAgICAgICAgJ2dvdCA9IGluZmlsZS57cmVhZF9tZXRob2RfbmFtZX0oKSA7JworICAgICAgICAgICAgJ2V4cGVjdGVkID0ge2V4cGVjdGVkIXJ9IDsnCisgICAgICAgICAgICAnYXNzZXJ0IGdvdCA9PSBleHBlY3RlZCwgKCcKKyAgICAgICAgICAgICAgICAgICAgJyJ7cmVhZF9tZXRob2RfbmFtZX0gcmV0dXJuZWQgd3JvbmcgZGF0YS5cXG4iJworICAgICAgICAgICAgICAgICAgICAnImdvdCBkYXRhICVyXFxuZXhwZWN0ZWQgJXIiICUgKGdvdCwgZXhwZWN0ZWQpKScKKyAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYpOgorICAgICAgICAiIiJyZWFkbGluZSgpIG11c3QgaGFuZGxlIHNpZ25hbHMgYW5kIG5vdCBsb3NlIGRhdGEuIiIiCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGluZygKKyAgICAgICAgICAgICAgICBkYXRhX3RvX3dyaXRlPWInaGVsbG8sIHdvcmxkIScsCisgICAgICAgICAgICAgICAgcmVhZF9hbmRfdmVyaWZ5X2NvZGU9c2VsZi5fUkVBRElOR19DT0RFX1RFTVBMQVRFLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfbWV0aG9kX25hbWU9J3JlYWRsaW5lJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPWInaGVsbG8sIHdvcmxkIVxuJykpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6CisgICAgICAgICIiInJlYWRsaW5lcygpIG11c3QgaGFuZGxlIHNpZ25hbHMgYW5kIG5vdCBsb3NlIGRhdGEuIiIiCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGluZygKKyAgICAgICAgICAgICAgICBkYXRhX3RvX3dyaXRlPWInaGVsbG9cbndvcmxkIScsCisgICAgICAgICAgICAgICAgcmVhZF9hbmRfdmVyaWZ5X2NvZGU9c2VsZi5fUkVBRElOR19DT0RFX1RFTVBMQVRFLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfbWV0aG9kX25hbWU9J3JlYWRsaW5lcycsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1bYidoZWxsb1xuJywgYid3b3JsZCFcbiddKSkKKworICAgIGRlZiB0ZXN0X3JlYWRhbGwoc2VsZik6CisgICAgICAgICIiInJlYWRhbGwoKSBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT1iJ2hlbGxvXG53b3JsZCEnLAorICAgICAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlPXNlbGYuX1JFQURJTkdfQ09ERV9URU1QTEFURS5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX21ldGhvZF9uYW1lPSdyZWFkYWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPWInaGVsbG9cbndvcmxkIVxuJykpCisgICAgICAgICMgcmVhZCgpIGlzIHRoZSBzYW1lIHRoaW5nIGFzIHJlYWRhbGwoKS4KKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9YidoZWxsb1xud29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT1zZWxmLl9SRUFESU5HX0NPREVfVEVNUExBVEUuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9tZXRob2RfbmFtZT0ncmVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1iJ2hlbGxvXG53b3JsZCFcbicpKQorCisKK2NsYXNzIFRlc3RCdWZmZXJlZElPU2lnbmFsSW50ZXJydXB0KFRlc3RGaWxlSU9TaWduYWxJbnRlcnJ1cHQpOgorICAgIGRlZiBfZ2VuZXJhdGVfaW5maWxlX3NldHVwX2NvZGUoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdGhlIGluZmlsZSA9IC4uLiBsaW5lIG9mIGNvZGUgdG8gbWFrZSBhIEJ1ZmZlcmVkUmVhZGVyLiIiIgorICAgICAgICByZXR1cm4gKCdpbmZpbGUgPSBpby5vcGVuKHN5cy5zdGRpbi5maWxlbm8oKSwgInJiIikgOycKKyAgICAgICAgICAgICAgICAnaW1wb3J0IF9pbyA7YXNzZXJ0IGlzaW5zdGFuY2UoaW5maWxlLCBfaW8uQnVmZmVyZWRSZWFkZXIpJykKKworICAgIGRlZiB0ZXN0X3JlYWRhbGwoc2VsZik6CisgICAgICAgICIiIkJ1ZmZlcmVkUmVhZGVyLnJlYWQoKSBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT1iJ2hlbGxvXG53b3JsZCEnLAorICAgICAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlPXNlbGYuX1JFQURJTkdfQ09ERV9URU1QTEFURS5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX21ldGhvZF9uYW1lPSdyZWFkJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPWInaGVsbG9cbndvcmxkIVxuJykpCisKKworY2xhc3MgVGVzdFRleHRJT1NpZ25hbEludGVycnVwdChUZXN0RmlsZUlPU2lnbmFsSW50ZXJydXB0KToKKyAgICBkZWYgX2dlbmVyYXRlX2luZmlsZV9zZXR1cF9jb2RlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBpbmZpbGUgPSAuLi4gbGluZSBvZiBjb2RlIHRvIG1ha2UgYSBUZXh0SU9XcmFwcGVyLiIiIgorICAgICAgICByZXR1cm4gKCdpbmZpbGUgPSBpby5vcGVuKHN5cy5zdGRpbi5maWxlbm8oKSwgInJ0IiwgbmV3bGluZT1Ob25lKSA7JworICAgICAgICAgICAgICAgICdpbXBvcnQgX2lvIDthc3NlcnQgaXNpbnN0YW5jZShpbmZpbGUsIF9pby5UZXh0SU9XcmFwcGVyKScpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKKyAgICAgICAgIiIicmVhZGxpbmUoKSBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT1iJ2hlbGxvLCB3b3JsZCEnLAorICAgICAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlPXNlbGYuX1JFQURJTkdfQ09ERV9URU1QTEFURS5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX21ldGhvZF9uYW1lPSdyZWFkbGluZScsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD0naGVsbG8sIHdvcmxkIVxuJykpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6CisgICAgICAgICIiInJlYWRsaW5lcygpIG11c3QgaGFuZGxlIHNpZ25hbHMgYW5kIG5vdCBsb3NlIGRhdGEuIiIiCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGluZygKKyAgICAgICAgICAgICAgICBkYXRhX3RvX3dyaXRlPWInaGVsbG9cclxud29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT1zZWxmLl9SRUFESU5HX0NPREVfVEVNUExBVEUuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9tZXRob2RfbmFtZT0ncmVhZGxpbmVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPVsnaGVsbG9cbicsICd3b3JsZCFcbiddKSkKKworICAgIGRlZiB0ZXN0X3JlYWRhbGwoc2VsZik6CisgICAgICAgICIiInJlYWQoKSBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT1iJ2hlbGxvXG53b3JsZCEnLAorICAgICAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlPXNlbGYuX1JFQURJTkdfQ09ERV9URU1QTEFURS5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX21ldGhvZF9uYW1lPSdyZWFkJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkPSJoZWxsb1xud29ybGQhXG4iKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9jYXNlcyA9IFsKKyAgICAgICAgICAgIHRjIGZvciB0YyBpbiBnbG9iYWxzKCkudmFsdWVzKCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodGMsIHR5cGUpIGFuZCBpc3N1YmNsYXNzKHRjLCB1bml0dGVzdC5UZXN0Q2FzZSldCisgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0X2Nhc2VzKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVfZWludHIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZV9laW50ci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiMWQyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVfZWludHIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVfZWludHIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZV9laW50ci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczZWU4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVfZWludHIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVjbXAucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlY21wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MzllZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlY21wLnB5CkBAIC0wLDAgKzEsMTM0IEBACisKK2ltcG9ydCBvcywgZmlsZWNtcCwgc2h1dGlsLCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBGaWxlQ29tcGFyZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5uYW1lX3NhbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgJy1zYW1lJworICAgICAgICBzZWxmLm5hbWVfZGlmZiA9IHRlc3Rfc3VwcG9ydC5URVNURk4gKyAnLWRpZmYnCisgICAgICAgIGRhdGEgPSAnQ29udGVudHMgb2YgZmlsZSBnbyBoZXJlLlxuJworICAgICAgICBmb3IgbmFtZSBpbiBbc2VsZi5uYW1lLCBzZWxmLm5hbWVfc2FtZSwgc2VsZi5uYW1lX2RpZmZdOgorICAgICAgICAgICAgb3V0cHV0ID0gb3BlbihuYW1lLCAndycpCisgICAgICAgICAgICBvdXRwdXQud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpCisKKyAgICAgICAgb3V0cHV0ID0gb3BlbihzZWxmLm5hbWVfZGlmZiwgJ2ErJykKKyAgICAgICAgb3V0cHV0LndyaXRlKCdBbiBleHRyYSBsaW5lLlxuJykKKyAgICAgICAgb3V0cHV0LmNsb3NlKCkKKyAgICAgICAgc2VsZi5kaXIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgb3MudW5saW5rKHNlbGYubmFtZSkKKyAgICAgICAgb3MudW5saW5rKHNlbGYubmFtZV9zYW1lKQorICAgICAgICBvcy51bmxpbmsoc2VsZi5uYW1lX2RpZmYpCisKKyAgICBkZWYgdGVzdF9tYXRjaGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wKHNlbGYubmFtZSwgc2VsZi5uYW1lX3NhbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBmaWxlIHRvIGl0c2VsZiBmYWlscyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYubmFtZV9zYW1lLCBzaGFsbG93PUZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb21wYXJpbmcgZmlsZSB0byBpdHNlbGYgZmFpbHMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZWNtcC5jbXAoc2VsZi5uYW1lLCBzZWxmLm5hbWUsIHNoYWxsb3c9RmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBmaWxlIHRvIGlkZW50aWNhbCBmaWxlIGZhaWxzIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wKHNlbGYubmFtZSwgc2VsZi5uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb21wYXJpbmcgZmlsZSB0byBpZGVudGljYWwgZmlsZSBmYWlscyIpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmlsZWNtcC5jbXAoc2VsZi5uYW1lLCBzZWxmLm5hbWVfZGlmZiksCisgICAgICAgICAgICAgICAgICAgICJNaXNtYXRjaGVkIGZpbGVzIGNvbXBhcmUgYXMgZXF1YWwiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpbGVjbXAuY21wKHNlbGYubmFtZSwgc2VsZi5kaXIpLAorICAgICAgICAgICAgICAgICAgICAiRmlsZSBhbmQgZGlyZWN0b3J5IGNvbXBhcmUgYXMgZXF1YWwiKQorCitjbGFzcyBEaXJDb21wYXJlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgdG1wZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisgICAgICAgIHNlbGYuZGlyID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2RpcicpCisgICAgICAgIHNlbGYuZGlyX3NhbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnZGlyLXNhbWUnKQorICAgICAgICBzZWxmLmRpcl9kaWZmID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2Rpci1kaWZmJykKKyAgICAgICAgc2VsZi5jYXNlaW5zZW5zaXRpdmUgPSBvcy5wYXRoLm5vcm1jYXNlKCdBJykgPT0gb3MucGF0aC5ub3JtY2FzZSgnYScpCisgICAgICAgIGRhdGEgPSAnQ29udGVudHMgb2YgZmlsZSBnbyBoZXJlLlxuJworICAgICAgICBmb3IgZGlyIGluIFtzZWxmLmRpciwgc2VsZi5kaXJfc2FtZSwgc2VsZi5kaXJfZGlmZl06CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKGRpciwgVHJ1ZSkKKyAgICAgICAgICAgIG9zLm1rZGlyKGRpcikKKyAgICAgICAgICAgIGlmIHNlbGYuY2FzZWluc2Vuc2l0aXZlIGFuZCBkaXIgaXMgc2VsZi5kaXJfc2FtZToKKyAgICAgICAgICAgICAgICBmbiA9ICdGaUxlJyAgICAgIyBWZXJpZnkgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZuID0gJ2ZpbGUnCisgICAgICAgICAgICBvdXRwdXQgPSBvcGVuKG9zLnBhdGguam9pbihkaXIsIGZuKSwgJ3cnKQorICAgICAgICAgICAgb3V0cHV0LndyaXRlKGRhdGEpCisgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKQorCisgICAgICAgIG91dHB1dCA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuZGlyX2RpZmYsICdmaWxlMicpLCAndycpCisgICAgICAgIG91dHB1dC53cml0ZSgnQW4gZXh0cmEgZmlsZS5cbicpCisgICAgICAgIG91dHB1dC5jbG9zZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5kaXIpCisgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5kaXJfc2FtZSkKKyAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLmRpcl9kaWZmKQorCisgICAgZGVmIHRlc3RfY21wZmlsZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpciwgWydmaWxlJ10pID09CisgICAgICAgICAgICAgICAgICAgICAgICAoWydmaWxlJ10sIFtdLCBbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIGRpcmVjdG9yeSB0byBpdHNlbGYgZmFpbHMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZWNtcC5jbXBmaWxlcyhzZWxmLmRpciwgc2VsZi5kaXJfc2FtZSwgWydmaWxlJ10pID09CisgICAgICAgICAgICAgICAgICAgICAgICAoWydmaWxlJ10sIFtdLCBbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIGRpcmVjdG9yeSB0byBzYW1lIGZhaWxzIikKKworICAgICAgICAjIFRyeSBpdCB3aXRoIHNoYWxsb3c9RmFsc2UKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wZmlsZXMoc2VsZi5kaXIsIHNlbGYuZGlyLCBbJ2ZpbGUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhbGxvdz1GYWxzZSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIChbJ2ZpbGUnXSwgW10sIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb21wYXJpbmcgZGlyZWN0b3J5IHRvIGl0c2VsZiBmYWlscyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpcl9zYW1lLCBbJ2ZpbGUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhbGxvdz1GYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIGRpcmVjdG9yeSB0byBzYW1lIGZhaWxzIikKKworICAgICAgICAjIEFkZCBkaWZmZXJlbnQgZmlsZTIKKyAgICAgICAgb3V0cHV0ID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5kaXIsICdmaWxlMicpLCAndycpCisgICAgICAgIG91dHB1dC53cml0ZSgnRGlmZmVyZW50IGNvbnRlbnRzLlxuJykKKyAgICAgICAgb3V0cHV0LmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpbGVjbXAuY21wZmlsZXMoc2VsZi5kaXIsIHNlbGYuZGlyX3NhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydmaWxlJywgJ2ZpbGUyJ10pID09CisgICAgICAgICAgICAgICAgICAgIChbJ2ZpbGUnXSwgWydmaWxlMiddLCBbXSksCisgICAgICAgICAgICAgICAgICAgICJDb21wYXJpbmcgbWlzbWF0Y2hlZCBkaXJlY3RvcmllcyBmYWlscyIpCisKKworICAgIGRlZiB0ZXN0X2RpcmNtcChzZWxmKToKKyAgICAgICAgIyBDaGVjayBhdHRyaWJ1dGVzIGZvciBjb21wYXJpc29uIG9mIHR3byBpZGVudGljYWwgZGlyZWN0b3JpZXMKKyAgICAgICAgZCA9IGZpbGVjbXAuZGlyY21wKHNlbGYuZGlyLCBzZWxmLmRpcl9zYW1lKQorICAgICAgICBpZiBzZWxmLmNhc2VpbnNlbnNpdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2QubGVmdF9saXN0LCBkLnJpZ2h0X2xpc3RdLFtbJ2ZpbGUnXSwgWydGaUxlJ11dKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbZC5sZWZ0X2xpc3QsIGQucmlnaHRfbGlzdF0sW1snZmlsZSddLCBbJ2ZpbGUnXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmNvbW1vbiA9PSBbJ2ZpbGUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQubGVmdF9vbmx5ID09IGQucmlnaHRfb25seSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuc2FtZV9maWxlcyA9PSBbJ2ZpbGUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZGlmZl9maWxlcyA9PSBbXSkKKworICAgICAgICAjIENoZWNrIGF0dHJpYnV0ZXMgZm9yIGNvbXBhcmlzb24gb2YgdHdvIGRpZmZlcmVudCBkaXJlY3RvcmllcworICAgICAgICBkID0gZmlsZWNtcC5kaXJjbXAoc2VsZi5kaXIsIHNlbGYuZGlyX2RpZmYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmxlZnRfbGlzdCA9PSBbJ2ZpbGUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQucmlnaHRfbGlzdCA9PSBbJ2ZpbGUnLCAnZmlsZTInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuY29tbW9uID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5sZWZ0X29ubHkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLnJpZ2h0X29ubHkgPT0gWydmaWxlMiddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5zYW1lX2ZpbGVzID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5kaWZmX2ZpbGVzID09IFtdKQorCisgICAgICAgICMgQWRkIGRpZmZlcmVudCBmaWxlMgorICAgICAgICBvdXRwdXQgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLmRpciwgJ2ZpbGUyJyksICd3JykKKyAgICAgICAgb3V0cHV0LndyaXRlKCdEaWZmZXJlbnQgY29udGVudHMuXG4nKQorICAgICAgICBvdXRwdXQuY2xvc2UoKQorICAgICAgICBkID0gZmlsZWNtcC5kaXJjbXAoc2VsZi5kaXIsIHNlbGYuZGlyX2RpZmYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLnNhbWVfZmlsZXMgPT0gWydmaWxlJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmRpZmZfZmlsZXMgPT0gWydmaWxlMiddKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEZpbGVDb21wYXJlVGVzdENhc2UsIERpckNvbXBhcmVUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWNtcC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlY21wLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGRkYWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWNtcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWNtcC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlY21wLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGRkYWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWNtcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YWVkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlaW5wdXQucHkKQEAgLTAsMCArMSwyMjUgQEAKKycnJworVGVzdHMgZm9yIGZpbGVpbnB1dCBtb2R1bGUuCitOaWNrIE1hdGhld3NvbgorJycnCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgVEVTVEZOLCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHVubGluayBhcyBzYWZlX3VubGluaworaW1wb3J0IHN5cywgcmUKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIGZpbGVpbnB1dCBpbXBvcnQgRmlsZUlucHV0LCBob29rX2VuY29kZWQKKworIyBUaGUgZmlsZWlucHV0IG1vZHVsZSBoYXMgMiBpbnRlcmZhY2VzOiB0aGUgRmlsZUlucHV0IGNsYXNzIHdoaWNoIGRvZXMKKyMgYWxsIHRoZSB3b3JrLCBhbmQgYSBmZXcgZnVuY3Rpb25zIChpbnB1dCwgZXRjLikgdGhhdCB1c2UgYSBnbG9iYWwgX3N0YXRlCisjIHZhcmlhYmxlLiAgV2Ugb25seSB0ZXN0IHRoZSBGaWxlSW5wdXQgY2xhc3MsIHNpbmNlIHRoZSBvdGhlciBmdW5jdGlvbnMKKyMgb25seSBwcm92aWRlIGEgdGhpbiBmYWNhZGUgb3ZlciBGaWxlSW5wdXQuCisKKyMgV3JpdGUgbGluZXMgKGEgbGlzdCBvZiBsaW5lcykgdG8gdGVtcCBmaWxlIG51bWJlciBpLCBhbmQgcmV0dXJuIHRoZQorIyB0ZW1wIGZpbGUncyBuYW1lLgorZGVmIHdyaXRlVG1wKGksIGxpbmVzLCBtb2RlPSd3Jyk6ICAjIG9wZW5pbmcgaW4gdGV4dCBtb2RlIGlzIHRoZSBkZWZhdWx0CisgICAgbmFtZSA9IFRFU1RGTiArIHN0cihpKQorICAgIGYgPSBvcGVuKG5hbWUsIG1vZGUpCisgICAgZi53cml0ZWxpbmVzKGxpbmVzKQorICAgIGYuY2xvc2UoKQorICAgIHJldHVybiBuYW1lCisKK2RlZiByZW1vdmVfdGVtcGZpbGVzKCpuYW1lcyk6CisgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgIHNhZmVfdW5saW5rKG5hbWUpCisKK2NsYXNzIEJ1ZmZlclNpemVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2J1ZmZlcl9zaXplcyhzZWxmKToKKyAgICAgICAgIyBGaXJzdCwgcnVuIHRoZSB0ZXN0cyB3aXRoIGRlZmF1bHQgYW5kIHRlZW55IGJ1ZmZlciBzaXplLgorICAgICAgICBmb3Igcm91bmQsIGJzIGluICgwLCAwKSwgKDEsIDMwKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0MSA9IHdyaXRlVG1wKDEsIFsiTGluZSAlcyBvZiBmaWxlIDFcbiIgJSAoaSsxKSBmb3IgaSBpbiByYW5nZSgxNSldKQorICAgICAgICAgICAgICAgIHQyID0gd3JpdGVUbXAoMiwgWyJMaW5lICVzIG9mIGZpbGUgMlxuIiAlIChpKzEpIGZvciBpIGluIHJhbmdlKDEwKV0pCisgICAgICAgICAgICAgICAgdDMgPSB3cml0ZVRtcCgzLCBbIkxpbmUgJXMgb2YgZmlsZSAzXG4iICUgKGkrMSkgZm9yIGkgaW4gcmFuZ2UoNSldKQorICAgICAgICAgICAgICAgIHQ0ID0gd3JpdGVUbXAoNCwgWyJMaW5lICVzIG9mIGZpbGUgNFxuIiAlIChpKzEpIGZvciBpIGluIHJhbmdlKDEpXSkKKyAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplX3Rlc3QodDEsIHQyLCB0MywgdDQsIGJzLCByb3VuZCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcmVtb3ZlX3RlbXBmaWxlcyh0MSwgdDIsIHQzLCB0NCkKKworICAgIGRlZiBidWZmZXJfc2l6ZV90ZXN0KHNlbGYsIHQxLCB0MiwgdDMsIHQ0LCBicz0wLCByb3VuZD0wKToKKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZShyJ0xJTkUgKFxkKykgT0YgRklMRSAoXGQrKScpCisKKyAgICAgICAgc3RhcnQgPSAxICsgcm91bmQqNgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJyVzLiBTaW1wbGUgaXRlcmF0aW9uIChicz0lcyknICUgKHN0YXJ0KzAsIGJzKQorICAgICAgICBmaSA9IEZpbGVJbnB1dChmaWxlcz0odDEsIHQyLCB0MywgdDQpLCBidWZzaXplPWJzKQorICAgICAgICBsaW5lcyA9IGxpc3QoZmkpCisgICAgICAgIGZpLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGluZXMpLCAzMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lc1s0XSwgJ0xpbmUgNSBvZiBmaWxlIDFcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXNbMzBdLCAnTGluZSAxIG9mIGZpbGUgNFxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaS5saW5lbm8oKSwgMzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5hbWUoKSwgdDQpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICclcy4gU3RhdHVzIHZhcmlhYmxlcyAoYnM9JXMpJyAlIChzdGFydCsxLCBicykKKyAgICAgICAgZmkgPSBGaWxlSW5wdXQoZmlsZXM9KHQxLCB0MiwgdDMsIHQ0KSwgYnVmc2l6ZT1icykKKyAgICAgICAgcyA9ICJ4IgorICAgICAgICB3aGlsZSBzIGFuZCBzICE9ICdMaW5lIDYgb2YgZmlsZSAyXG4nOgorICAgICAgICAgICAgcyA9IGZpLnJlYWRsaW5lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaS5maWxlbmFtZSgpLCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaS5saW5lbm8oKSwgMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZWxpbmVubygpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpLmlzZmlyc3RsaW5lKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmkuaXNzdGRpbigpKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnJXMuIE5leHRmaWxlIChicz0lcyknICUgKHN0YXJ0KzIsIGJzKQorICAgICAgICBmaS5uZXh0ZmlsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkucmVhZGxpbmUoKSwgJ0xpbmUgMSBvZiBmaWxlIDNcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDIyKQorICAgICAgICBmaS5jbG9zZSgpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICclcy4gU3RkaW4gKGJzPSVzKScgJSAoc3RhcnQrMywgYnMpCisgICAgICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPSh0MSwgdDIsIHQzLCB0NCwgJy0nKSwgYnVmc2l6ZT1icykKKyAgICAgICAgc2F2ZXN0ZGluID0gc3lzLnN0ZGluCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5zdGRpbiA9IFN0cmluZ0lPKCJMaW5lIDEgb2Ygc3RkaW5cbkxpbmUgMiBvZiBzdGRpblxuIikKKyAgICAgICAgICAgIGxpbmVzID0gbGlzdChmaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmVzKSwgMzMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzWzMyXSwgJ0xpbmUgMiBvZiBzdGRpblxuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5hbWUoKSwgJzxzdGRpbj4nKQorICAgICAgICAgICAgZmkubmV4dGZpbGUoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZGluID0gc2F2ZXN0ZGluCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICclcy4gQm91bmRhcnkgY29uZGl0aW9ucyAoYnM9JXMpJyAlIChzdGFydCs0LCBicykKKyAgICAgICAgZmkgPSBGaWxlSW5wdXQoZmlsZXM9KHQxLCB0MiwgdDMsIHQ0KSwgYnVmc2l6ZT1icykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaS5saW5lbm8oKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaS5maWxlbmFtZSgpLCBOb25lKQorICAgICAgICBmaS5uZXh0ZmlsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5hbWUoKSwgTm9uZSkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJyVzLiBJbnBsYWNlIChicz0lcyknICUgKHN0YXJ0KzUsIGJzKQorICAgICAgICBzYXZlc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaSA9IEZpbGVJbnB1dChmaWxlcz0odDEsIHQyLCB0MywgdDQpLCBpbnBsYWNlPTEsIGJ1ZnNpemU9YnMpCisgICAgICAgICAgICBmb3IgbGluZSBpbiBmaToKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdLnVwcGVyKCkKKyAgICAgICAgICAgICAgICBwcmludCBsaW5lCisgICAgICAgICAgICBmaS5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZXN0ZG91dAorCisgICAgICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPSh0MSwgdDIsIHQzLCB0NCksIGJ1ZnNpemU9YnMpCisgICAgICAgIGZvciBsaW5lIGluIGZpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lWy0xXSwgJ1xuJykKKyAgICAgICAgICAgIG0gPSBwYXQubWF0Y2gobGluZVs6LTFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChtLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQobS5ncm91cCgxKSksIGZpLmZpbGVsaW5lbm8oKSkKKyAgICAgICAgZmkuY2xvc2UoKQorCitjbGFzcyBGaWxlSW5wdXRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfemVyb19ieXRlX2ZpbGVzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0MSA9IHdyaXRlVG1wKDEsIFsiIl0pCisgICAgICAgICAgICB0MiA9IHdyaXRlVG1wKDIsIFsiIl0pCisgICAgICAgICAgICB0MyA9IHdyaXRlVG1wKDMsIFsiVGhlIG9ubHkgbGluZSB0aGVyZSBpcy5cbiJdKQorICAgICAgICAgICAgdDQgPSB3cml0ZVRtcCg0LCBbIiJdKQorICAgICAgICAgICAgZmkgPSBGaWxlSW5wdXQoZmlsZXM9KHQxLCB0MiwgdDMsIHQ0KSkKKworICAgICAgICAgICAgbGluZSA9IGZpLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgJ1RoZSBvbmx5IGxpbmUgdGhlcmUgaXMuXG4nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaS5saW5lbm8oKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZWxpbmVubygpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaS5maWxlbmFtZSgpLCB0MykKKworICAgICAgICAgICAgbGluZSA9IGZpLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVsaW5lbm8oKSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5hbWUoKSwgdDQpCisgICAgICAgICAgICBmaS5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICByZW1vdmVfdGVtcGZpbGVzKHQxLCB0MiwgdDMsIHQ0KQorCisgICAgZGVmIHRlc3RfZmlsZXNfdGhhdF9kb250X2VuZF93aXRoX25ld2xpbmUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHQxID0gd3JpdGVUbXAoMSwgWyJBXG5CXG5DIl0pCisgICAgICAgICAgICB0MiA9IHdyaXRlVG1wKDIsIFsiRFxuRVxuRiJdKQorICAgICAgICAgICAgZmkgPSBGaWxlSW5wdXQoZmlsZXM9KHQxLCB0MikpCisgICAgICAgICAgICBsaW5lcyA9IGxpc3QoZmkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBbIkFcbiIsICJCXG4iLCAiQyIsICJEXG4iLCAiRVxuIiwgIkYiXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZWxpbmVubygpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaS5saW5lbm8oKSwgNikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHJlbW92ZV90ZW1wZmlsZXModDEsIHQyKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9maWxlbmFtZXMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHQxID0gd3JpdGVUbXAoMSwgWyJBXG5CIl0pCisgICAgICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9ICdhc2NpaScKKyAgICAgICAgICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPXVuaWNvZGUodDEsIGVuY29kaW5nKSkKKyAgICAgICAgICAgIGxpbmVzID0gbGlzdChmaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMsIFsiQVxuIiwgIkIiXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHJlbW92ZV90ZW1wZmlsZXModDEpCisKKyAgICBkZWYgdGVzdF9maWxlbm8oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHQxID0gd3JpdGVUbXAoMSwgWyJBXG5CIl0pCisgICAgICAgICAgICB0MiA9IHdyaXRlVG1wKDIsIFsiQ1xuRCJdKQorICAgICAgICAgICAgZmkgPSBGaWxlSW5wdXQoZmlsZXM9KHQxLCB0MikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVubygpLCAtMSkKKyAgICAgICAgICAgIGxpbmUgPSBmaS5uZXh0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZmkuZmlsZW5vKCksIC0xKQorICAgICAgICAgICAgZmkubmV4dGZpbGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaS5maWxlbm8oKSwgLTEpCisgICAgICAgICAgICBsaW5lID0gbGlzdChmaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5vKCksIC0xKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcmVtb3ZlX3RlbXBmaWxlcyh0MSwgdDIpCisKKyAgICBkZWYgdGVzdF9vcGVuaW5nX21vZGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgaW52YWxpZCBtb2RlLCBzaG91bGQgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICAgICAgZmkgPSBGaWxlSW5wdXQobW9kZT0idyIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkZpbGVJbnB1dCBzaG91bGQgcmVqZWN0IGludmFsaWQgbW9kZSBhcmd1bWVudCIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHRyeSBvcGVuaW5nIGluIHVuaXZlcnNhbCBuZXdsaW5lIG1vZGUKKyAgICAgICAgICAgIHQxID0gd3JpdGVUbXAoMSwgWyJBXG5CXHJcbkNcckQiXSwgbW9kZT0id2IiKQorICAgICAgICAgICAgZmkgPSBGaWxlSW5wdXQoZmlsZXM9dDEsIG1vZGU9IlUiKQorICAgICAgICAgICAgbGluZXMgPSBsaXN0KGZpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lcywgWyJBXG4iLCAiQlxuIiwgIkNcbiIsICJEIl0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICByZW1vdmVfdGVtcGZpbGVzKHQxKQorCisgICAgZGVmIHRlc3RfZmlsZV9vcGVuaW5nX2hvb2soc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgY2Fubm90IHVzZSBvcGVuaG9vayBhbmQgaW5wbGFjZSBtb2RlCisgICAgICAgICAgICBmaSA9IEZpbGVJbnB1dChpbnBsYWNlPTEsIG9wZW5ob29rPWxhbWJkYSBmLG06IE5vbmUpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkZpbGVJbnB1dCBzaG91bGQgcmFpc2UgaWYgYm90aCBpbnBsYWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBvcGVuaG9vayBhcmd1bWVudHMgYXJlIGdpdmVuIikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpID0gRmlsZUlucHV0KG9wZW5ob29rPTEpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkZpbGVJbnB1dCBzaG91bGQgY2hlY2sgb3Blbmhvb2sgZm9yIGJlaW5nIGNhbGxhYmxlIikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHQxID0gd3JpdGVUbXAoMSwgWyJBXG5CIl0sIG1vZGU9IndiIikKKyAgICAgICAgICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPXQxLCBvcGVuaG9vaz1ob29rX2VuY29kZWQoInJvdDEzIikpCisgICAgICAgICAgICBsaW5lcyA9IGxpc3QoZmkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBbIk5cbiIsICJPIl0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICByZW1vdmVfdGVtcGZpbGVzKHQxKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEJ1ZmZlclNpemVzVGVzdHMsIEZpbGVJbnB1dFRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlaW5wdXQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmMwMGMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlaW5wdXQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmMwMGMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlaW8ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlaW8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc0Y2VjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVpby5weQpAQCAtMCwwICsxLDQ3OSBAQAorIyBBZGFwdGVkIGZyb20gdGVzdF9maWxlLnB5IGJ5IERhbmllbCBTdHV0emJhY2gKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IGVycm5vCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gYXJyYXkgaW1wb3J0IGFycmF5Citmcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5Citmcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKK2Zyb20gVXNlckxpc3QgaW1wb3J0IFVzZXJMaXN0CitpbXBvcnQgX3Rlc3RjYXBpCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgY2hlY2tfd2FybmluZ3MsIHJ1bl91bml0dGVzdCwgbWFrZV9iYWRfZmQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHB5M2tfYnl0ZXMgYXMgYnl0ZXMKK2Zyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCBydW5fcHl0aG9uCisKK2Zyb20gX2lvIGltcG9ydCBGaWxlSU8gYXMgX0ZpbGVJTworCitjbGFzcyBBdXRvRmlsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIGZpbGUgdGVzdHMgZm9yIHdoaWNoIGEgdGVzdCBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZiA9IF9GaWxlSU8oVEVTVEZOLCAndycpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuZjoKKyAgICAgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgIG9zLnJlbW92ZShURVNURk4pCisKKyAgICBkZWYgdGVzdFdlYWtSZWZzKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSB3ZWFrIHJlZmVyZW5jZXMKKyAgICAgICAgcCA9IHByb3h5KHNlbGYuZikKKyAgICAgICAgcC53cml0ZShieXRlcyhyYW5nZSgxMCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi50ZWxsKCksIHAudGVsbCgpKQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBzZWxmLmYgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJlZmVyZW5jZUVycm9yLCBnZXRhdHRyLCBwLCAndGVsbCcpCisKKyAgICBkZWYgdGVzdFNlZWtUZWxsKHNlbGYpOgorICAgICAgICBzZWxmLmYud3JpdGUoYnl0ZXMocmFuZ2UoMjApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYudGVsbCgpLCAyMCkKKyAgICAgICAgc2VsZi5mLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYudGVsbCgpLCAwKQorICAgICAgICBzZWxmLmYuc2VlaygxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYudGVsbCgpLCAxMCkKKyAgICAgICAgc2VsZi5mLnNlZWsoNSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYudGVsbCgpLCAxNSkKKyAgICAgICAgc2VsZi5mLnNlZWsoLTUsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLnRlbGwoKSwgMTApCisgICAgICAgIHNlbGYuZi5zZWVrKC01LCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi50ZWxsKCksIDE1KQorCisgICAgZGVmIHRlc3RBdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSBleHBlY3RlZCBhdHRyaWJ1dGVzIGV4aXN0CisgICAgICAgIGYgPSBzZWxmLmYKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYubW9kZSwgIndiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmNsb3NlZCwgRmFsc2UpCisKKyAgICAgICAgIyB2ZXJpZnkgdGhlIGF0dHJpYnV0ZXMgYXJlIHJlYWRvbmx5CisgICAgICAgIGZvciBhdHRyIGluICdtb2RlJywgJ2Nsb3NlZCc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyLCBmLCBhdHRyLCAnb29wcycpCisKKyAgICBkZWYgdGVzdFJlYWRpbnRvKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSByZWFkaW50bworICAgICAgICBzZWxmLmYud3JpdGUoYiJceDAxXHgwMiIpCisgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgIGEgPSBhcnJheShiJ2InLCBiJ3gnKjEwKQorICAgICAgICBzZWxmLmYgPSBfRmlsZUlPKFRFU1RGTiwgJ3InKQorICAgICAgICBuID0gc2VsZi5mLnJlYWRpbnRvKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJyYXkoYidiJywgWzEsIDJdKSwgYVs6bl0pCisKKyAgICBkZWYgdGVzdFdyaXRlbGluZXNMaXN0KHNlbGYpOgorICAgICAgICBsID0gW2InMTIzJywgYic0NTYnXQorICAgICAgICBzZWxmLmYud3JpdGVsaW5lcyhsKQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBzZWxmLmYgPSBfRmlsZUlPKFRFU1RGTiwgJ3JiJykKKyAgICAgICAgYnVmID0gc2VsZi5mLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZiwgYicxMjM0NTYnKQorCisgICAgZGVmIHRlc3RXcml0ZWxpbmVzVXNlckxpc3Qoc2VsZik6CisgICAgICAgIGwgPSBVc2VyTGlzdChbYicxMjMnLCBiJzQ1NiddKQorICAgICAgICBzZWxmLmYud3JpdGVsaW5lcyhsKQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBzZWxmLmYgPSBfRmlsZUlPKFRFU1RGTiwgJ3JiJykKKyAgICAgICAgYnVmID0gc2VsZi5mLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZiwgYicxMjM0NTYnKQorCisgICAgZGVmIHRlc3RXcml0ZWxpbmVzRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mLndyaXRlbGluZXMsIFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmYud3JpdGVsaW5lcywgTm9uZSkKKworICAgIGRlZiB0ZXN0X25vbmVfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5mLndyaXRlKGIiaGlcbmJ5ZVxuYWJjIikKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mID0gX0ZpbGVJTyhURVNURk4sICdyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYucmVhZChOb25lKSwgYiJoaVxuYnllXG5hYmMiKQorICAgICAgICBzZWxmLmYuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5yZWFkbGluZShOb25lKSwgYiJoaVxuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYucmVhZGxpbmVzKE5vbmUpLCBbYiJieWVcbiIsIGIiYWJjIl0pCisKKyAgICBkZWYgdGVzdFJlcHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzZWxmLmYpLCAiPF9pby5GaWxlSU8gbmFtZT0lciBtb2RlPSclcyc+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5mLm5hbWUsIHNlbGYuZi5tb2RlKSkKKyAgICAgICAgZGVsIHNlbGYuZi5uYW1lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzZWxmLmYpLCAiPF9pby5GaWxlSU8gZmQ9JXIgbW9kZT0nJXMnPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlbGYuZi5maWxlbm8oKSwgc2VsZi5mLm1vZGUpKQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoc2VsZi5mKSwgIjxfaW8uRmlsZUlPIFtjbG9zZWRdPiIpCisKKyAgICBkZWYgdGVzdEVycm9ycyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYuZgorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuaXNhdHR5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZi5jbG9zZWQpCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKGYubmFtZSwgVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLnJlYWQsIDEwKSAjIE9wZW4gZm9yIHJlYWRpbmcKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmNsb3NlZCkKKyAgICAgICAgZiA9IF9GaWxlSU8oVEVTVEZOLCAncicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZi5yZWFkaW50bywgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZi5jbG9zZWQpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCisKKyAgICBkZWYgdGVzdE1ldGhvZHMoc2VsZik6CisgICAgICAgIG1ldGhvZHMgPSBbJ2ZpbGVubycsICdpc2F0dHknLCAncmVhZCcsICdyZWFkaW50bycsCisgICAgICAgICAgICAgICAgICAgJ3NlZWsnLCAndGVsbCcsICd0cnVuY2F0ZScsICd3cml0ZScsICdzZWVrYWJsZScsCisgICAgICAgICAgICAgICAgICAgJ3JlYWRhYmxlJywgJ3dyaXRhYmxlJ10KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2F0aGVvcycpOgorICAgICAgICAgICAgbWV0aG9kcy5yZW1vdmUoJ3RydW5jYXRlJykKKworICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5mLmNsb3NlZCkKKworICAgICAgICBmb3IgbWV0aG9kbmFtZSBpbiBtZXRob2RzOgorICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLmYsIG1ldGhvZG5hbWUpCisgICAgICAgICAgICAjIHNob3VsZCByYWlzZSBvbiBjbG9zZWQgZmlsZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWV0aG9kKQorCisgICAgZGVmIHRlc3RPcGVuZGlyKHNlbGYpOgorICAgICAgICAjIElzc3VlIDM3MDM6IG9wZW5pbmcgYSBkaXJlY3Rvcnkgc2hvdWxkIGZpbGwgdGhlIGVycm5vCisgICAgICAgICMgV2luZG93cyBhbHdheXMgcmV0dXJucyAiW0Vycm5vIDEzXTogUGVybWlzc2lvbiBkZW5pZWQKKyAgICAgICAgIyBVbml4IGNhbGxzIGRpcmNoZWNrKCkgYW5kIHJldHVybnMgIltFcnJubyAyMV06IElzIGEgZGlyZWN0b3J5IgorICAgICAgICB0cnk6CisgICAgICAgICAgICBfRmlsZUlPKCcuJywgJ3InKQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChlLmVycm5vLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmZpbGVuYW1lLCAiLiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBJT0Vycm9yIikKKworICAgIEB1bml0dGVzdC5za2lwSWYob3MubmFtZSA9PSAnbnQnLCAidGVzdCBvbmx5IHdvcmtzIG9uIGEgUE9TSVgtbGlrZSBzeXN0ZW0iKQorICAgIGRlZiB0ZXN0T3BlbkRpckZEKHNlbGYpOgorICAgICAgICBmZCA9IG9zLm9wZW4oJy4nLCBvcy5PX1JET05MWSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yKSBhcyBjbToKKyAgICAgICAgICAgIF9GaWxlSU8oZmQsICdyJykKKyAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FSVNESVIpCisKKyAgICAjQSBzZXQgb2YgZnVuY3Rpb25zIHRlc3RpbmcgdGhhdCB3ZSBnZXQgZXhwZWN0ZWQgYmVoYXZpb3VyIGlmIHNvbWVvbmUgaGFzCisgICAgI21hbnVhbGx5IGNsb3NlZCB0aGUgaW50ZXJuYWwgZmlsZSBkZXNjcmlwdG9yLiAgRmlyc3QsIGEgZGVjb3JhdG9yOgorICAgIGRlZiBDbG9zZWRGRChmdW5jKToKKyAgICAgICAgQHdyYXBzKGZ1bmMpCisgICAgICAgIGRlZiB3cmFwcGVyKHNlbGYpOgorICAgICAgICAgICAgI2ZvcmNpYmx5IGNsb3NlIHRoZSBmZCBiZWZvcmUgaW52b2tpbmcgdGhlIHByb2JsZW0gZnVuY3Rpb24KKyAgICAgICAgICAgIGYgPSBzZWxmLmYKKyAgICAgICAgICAgIG9zLmNsb3NlKGYuZmlsZW5vKCkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnVuYyhzZWxmLCBmKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIHdyYXBwZXIKKworICAgIGRlZiBDbG9zZWRGRFJhaXNlcyhmdW5jKToKKyAgICAgICAgQHdyYXBzKGZ1bmMpCisgICAgICAgIGRlZiB3cmFwcGVyKHNlbGYpOgorICAgICAgICAgICAgI2ZvcmNpYmx5IGNsb3NlIHRoZSBmZCBiZWZvcmUgaW52b2tpbmcgdGhlIHByb2JsZW0gZnVuY3Rpb24KKyAgICAgICAgICAgIGYgPSBzZWxmLmYKKyAgICAgICAgICAgIG9zLmNsb3NlKGYuZmlsZW5vKCkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnVuYyhzZWxmLCBmKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZXJybm8sIGVycm5vLkVCQURGKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBJT0Vycm9yIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiB3cmFwcGVyCisKKyAgICBAQ2xvc2VkRkRSYWlzZXMKKyAgICBkZWYgdGVzdEVycm5vT25DbG9zZShzZWxmLCBmKToKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBAQ2xvc2VkRkRSYWlzZXMKKyAgICBkZWYgdGVzdEVycm5vT25DbG9zZWRXcml0ZShzZWxmLCBmKToKKyAgICAgICAgZi53cml0ZSgnYScpCisKKyAgICBAQ2xvc2VkRkRSYWlzZXMKKyAgICBkZWYgdGVzdEVycm5vT25DbG9zZWRTZWVrKHNlbGYsIGYpOgorICAgICAgICBmLnNlZWsoMCkKKworICAgIEBDbG9zZWRGRFJhaXNlcworICAgIGRlZiB0ZXN0RXJybm9PbkNsb3NlZFRlbGwoc2VsZiwgZik6CisgICAgICAgIGYudGVsbCgpCisKKyAgICBAQ2xvc2VkRkRSYWlzZXMKKyAgICBkZWYgdGVzdEVycm5vT25DbG9zZWRUcnVuY2F0ZShzZWxmLCBmKToKKyAgICAgICAgZi50cnVuY2F0ZSgwKQorCisgICAgQENsb3NlZEZECisgICAgZGVmIHRlc3RFcnJub09uQ2xvc2VkU2Vla2FibGUoc2VsZiwgZik6CisgICAgICAgIGYuc2Vla2FibGUoKQorCisgICAgQENsb3NlZEZECisgICAgZGVmIHRlc3RFcnJub09uQ2xvc2VkUmVhZGFibGUoc2VsZiwgZik6CisgICAgICAgIGYucmVhZGFibGUoKQorCisgICAgQENsb3NlZEZECisgICAgZGVmIHRlc3RFcnJub09uQ2xvc2VkV3JpdGFibGUoc2VsZiwgZik6CisgICAgICAgIGYud3JpdGFibGUoKQorCisgICAgQENsb3NlZEZECisgICAgZGVmIHRlc3RFcnJub09uQ2xvc2VkRmlsZW5vKHNlbGYsIGYpOgorICAgICAgICBmLmZpbGVubygpCisKKyAgICBAQ2xvc2VkRkQKKyAgICBkZWYgdGVzdEVycm5vT25DbG9zZWRJc2F0dHkoc2VsZiwgZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5pc2F0dHkoKSwgRmFsc2UpCisKKyAgICBkZWYgUmVvcGVuRm9yUmVhZChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuZiA9IF9GaWxlSU8oVEVTVEZOLCAncicpCisgICAgICAgIG9zLmNsb3NlKHNlbGYuZi5maWxlbm8oKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZgorCisgICAgQENsb3NlZEZEUmFpc2VzCisgICAgZGVmIHRlc3RFcnJub09uQ2xvc2VkUmVhZChzZWxmLCBmKToKKyAgICAgICAgZiA9IHNlbGYuUmVvcGVuRm9yUmVhZCgpCisgICAgICAgIGYucmVhZCgxKQorCisgICAgQENsb3NlZEZEUmFpc2VzCisgICAgZGVmIHRlc3RFcnJub09uQ2xvc2VkUmVhZGFsbChzZWxmLCBmKToKKyAgICAgICAgZiA9IHNlbGYuUmVvcGVuRm9yUmVhZCgpCisgICAgICAgIGYucmVhZGFsbCgpCisKKyAgICBAQ2xvc2VkRkRSYWlzZXMKKyAgICBkZWYgdGVzdEVycm5vT25DbG9zZWRSZWFkaW50byhzZWxmLCBmKToKKyAgICAgICAgZiA9IHNlbGYuUmVvcGVuRm9yUmVhZCgpCisgICAgICAgIGEgPSBhcnJheShiJ2InLCBiJ3gnKjEwKQorICAgICAgICBmLnJlYWRpbnRvKGEpCisKK2NsYXNzIE90aGVyRmlsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0QWJsZXMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBfRmlsZUlPKFRFU1RGTiwgInciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRhYmxlKCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRhYmxlKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2Vla2FibGUoKSwgVHJ1ZSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBmID0gX0ZpbGVJTyhURVNURk4sICJyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkYWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRhYmxlKCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWthYmxlKCksIFRydWUpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgZiA9IF9GaWxlSU8oVEVTVEZOLCAiYSsiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRhYmxlKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGFibGUoKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrYWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmlzYXR0eSgpLCBGYWxzZSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gIndpbjMyIjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGYgPSBfRmlsZUlPKCIvZGV2L3R0eSIsICJhIikKKyAgICAgICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyBXaGVuIHJ1biBpbiBhIGNyb24gam9iIHRoZXJlIGp1c3QgYXJlbid0IGFueQorICAgICAgICAgICAgICAgICAgICAjIHR0eXMsIHNvIHNraXAgdGhlIHRlc3QuICBUaGlzIGFsc28gaGFuZGxlcyBvdGhlcgorICAgICAgICAgICAgICAgICAgICAjIE9TJ2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCAvZGV2L3R0eS4KKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkYWJsZSgpLCBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRhYmxlKCksIFRydWUpCisgICAgICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAiZGFyd2luIiBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgICAnYnNkJyBub3QgaW4gc3lzLnBsYXRmb3JtIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnc3Vub3MnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgU29tZWhvdyAvZGV2L3R0eSBhcHBlYXJzIHNlZWthYmxlIG9uIHNvbWUgQlNEcworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWthYmxlKCksIEZhbHNlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuaXNhdHR5KCksIFRydWUpCisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKworICAgIGRlZiB0ZXN0TW9kZVN0cmluZ3Moc2VsZik6CisgICAgICAgICMgY2hlY2sgaW52YWxpZCBtb2RlIHN0cmluZ3MKKyAgICAgICAgZm9yIG1vZGUgaW4gKCIiLCAiYVUiLCAid1UrIiwgInJ3IiwgInJ0Iik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IF9GaWxlSU8oVEVTVEZOLCBtb2RlKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJyVyIGlzIGFuIGludmFsaWQgZmlsZSBtb2RlJyAlIG1vZGUpCisKKyAgICBkZWYgdGVzdFVuaWNvZGVPcGVuKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSByZXByIHdvcmtzIGZvciB1bmljb2RlIHRvbworICAgICAgICBmID0gX0ZpbGVJTyhzdHIoVEVTVEZOKSwgInciKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKworICAgIGRlZiB0ZXN0Qnl0ZXNPcGVuKHNlbGYpOgorICAgICAgICAjIE9wZW5pbmcgYSBieXRlcyBmaWxlbmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmbiA9IFRFU1RGTi5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgICAgICMgU2tpcCB0ZXN0CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZiA9IF9GaWxlSU8oZm4sICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZShiImFiYyIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHdpdGggb3BlbihURVNURk4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiJhYmMiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKworICAgIGRlZiB0ZXN0SW52YWxpZEZkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBfRmlsZUlPLCAtMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIF9GaWxlSU8sIG1ha2VfYmFkX2ZkKCkpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgaW1wb3J0IG1zdmNydAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgbXN2Y3J0LmdldF9vc2ZoYW5kbGUsIG1ha2VfYmFkX2ZkKCkpCisgICAgICAgICMgSXNzdWUgMTU5ODkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBfRmlsZUlPLCBfdGVzdGNhcGkuSU5UX01BWCArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgX0ZpbGVJTywgX3Rlc3RjYXBpLklOVF9NSU4gLSAxKQorCisgICAgZGVmIHRlc3RCYWRNb2RlQXJndW1lbnQoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHRoYXQgd2UgZ2V0IGEgc2Vuc2libGUgZXJyb3IgbWVzc2FnZSBmb3IgYmFkIG1vZGUgYXJndW1lbnQKKyAgICAgICAgYmFkX21vZGUgPSAicXdlcnR5IgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gX0ZpbGVJTyhURVNURk4sIGJhZF9tb2RlKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBtc2c6CisgICAgICAgICAgICBpZiBtc2cuYXJnc1swXSAhPSAwOgorICAgICAgICAgICAgICAgIHMgPSBzdHIobXNnKQorICAgICAgICAgICAgICAgIGlmIFRFU1RGTiBpbiBzIG9yIGJhZF9tb2RlIG5vdCBpbiBzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImJhZCBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIG1vZGU6ICVzIiAlIHMpCisgICAgICAgICAgICAjIGlmIG1zZy5hcmdzWzBdID09IDAsIHdlJ3JlIHByb2JhYmx5IG9uIFdpbmRvd3Mgd2hlcmUgdGhlcmUgbWF5IGJlCisgICAgICAgICAgICAjIG5vIG9idmlvdXMgd2F5IHRvIGRpc2NvdmVyIHdoeSBvcGVuKCkgZmFpbGVkLgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIGVycm9yIGZvciBpbnZhbGlkIG1vZGU6ICVzIiAlIGJhZF9tb2RlKQorCisgICAgZGVmIHRlc3RUcnVuY2F0ZShzZWxmKToKKyAgICAgICAgZiA9IF9GaWxlSU8oVEVTVEZOLCAndycpCisgICAgICAgIGYud3JpdGUoYnl0ZXMoYnl0ZWFycmF5KHJhbmdlKDEwKSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCAxMCkKKyAgICAgICAgZi50cnVuY2F0ZSg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWsoMCwgb3MuU0VFS19FTkQpLCA1KQorICAgICAgICBmLnRydW5jYXRlKDE1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlaygwLCBvcy5TRUVLX0VORCksIDE1KQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VHJ1bmNhdGVPbldpbmRvd3Moc2VsZik6CisgICAgICAgIGRlZiBidWc4MDE2MzEoKToKKyAgICAgICAgICAgICMgU0YgYnVnIDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvODAxNjMxPgorICAgICAgICAgICAgIyAiZmlsZS50cnVuY2F0ZSBmYXVsdCBvbiB3aW5kb3dzIgorICAgICAgICAgICAgZiA9IF9GaWxlSU8oVEVTVEZOLCAndycpCisgICAgICAgICAgICBmLndyaXRlKGJ5dGVzKHJhbmdlKDExKSkpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgZiA9IF9GaWxlSU8oVEVTVEZOLCdyKycpCisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKDUpCisgICAgICAgICAgICBpZiBkYXRhICE9IGJ5dGVzKHJhbmdlKDUpKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlJlYWQgb24gZmlsZSBvcGVuZWQgZm9yIHVwZGF0ZSBmYWlsZWQgJXIiICUgZGF0YSkKKyAgICAgICAgICAgIGlmIGYudGVsbCgpICE9IDU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJGaWxlIHBvcyBhZnRlciByZWFkIHdyb25nICVkIiAlIGYudGVsbCgpKQorCisgICAgICAgICAgICBmLnRydW5jYXRlKCkKKyAgICAgICAgICAgIGlmIGYudGVsbCgpICE9IDU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJGaWxlIHBvcyBhZnRlciBmdHJ1bmNhdGUgd3JvbmcgJWQiICUgZi50ZWxsKCkpCisKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2l6ZSA9IG9zLnBhdGguZ2V0c2l6ZShURVNURk4pCisgICAgICAgICAgICBpZiBzaXplICE9IDU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJGaWxlIHNpemUgYWZ0ZXIgZnRydW5jYXRlIHdyb25nICVkIiAlIHNpemUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnVnODAxNjMxKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKKyAgICBkZWYgdGVzdEFwcGVuZChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAnd2InKQorICAgICAgICAgICAgZi53cml0ZShiJ3NwYW0nKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICdhYicpCisgICAgICAgICAgICBmLndyaXRlKGInZWdncycpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3JiJykKKyAgICAgICAgICAgIGQgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGInc3BhbWVnZ3MnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RJbnZhbGlkSW5pdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBfRmlsZUlPLCAiMSIsIDAsIDApCisKKyAgICBkZWYgdGVzdFdhcm5pbmdzKHNlbGYpOgorICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKHF1aWV0PVRydWUpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcud2FybmluZ3MsIFtdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBfRmlsZUlPLCBbXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwody53YXJuaW5ncywgW10pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBfRmlsZUlPLCAiL3NvbWUvaW52YWxpZC9uYW1lIiwgInJ0IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwody53YXJuaW5ncywgW10pCisKKyAgICBkZWYgdGVzdF9zdXJyb2dhdGVzKHNlbGYpOgorICAgICAgICAjIElzc3VlICM4NDM4OiB0cnkgdG8gb3BlbiBhIGZpbGVuYW1lIGNvbnRhaW5pbmcgc3Vycm9nYXRlcy4KKyAgICAgICAgIyBJdCBzaG91bGQgZWl0aGVyIGZhaWwgYmVjYXVzZSB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0IG9yIHRoZSBmaWxlbmFtZQorICAgICAgICAjIGNhbid0IGJlIHJlcHJlc2VudGVkIHVzaW5nIHRoZSBmaWxlc3lzdGVtIGVuY29kaW5nLCBidXQgbm90IGJlY2F1c2UKKyAgICAgICAgIyBvZiBhIExvb2t1cEVycm9yIGZvciB0aGUgZXJyb3IgaGFuZGxlciAic3Vycm9nYXRlZXNjYXBlIi4KKyAgICAgICAgZmlsZW5hbWUgPSB1J1x1ZGM4MC50eHQnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggX0ZpbGVJTyhmaWxlbmFtZSk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgKFVuaWNvZGVFbmNvZGVFcnJvciwgSU9FcnJvcik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgU3Bhd24gYSBzZXBhcmF0ZSBQeXRob24gcHJvY2VzcyB3aXRoIGEgZGlmZmVyZW50ICJmaWxlIHN5c3RlbQorICAgICAgICAjIGRlZmF1bHQgZW5jb2RpbmciLCB0byBleGVyY2lzZSB0aGlzIGZ1cnRoZXIuCisgICAgICAgIGVudiA9IGRpY3Qob3MuZW52aXJvbikKKyAgICAgICAgZW52W2InTENfQ1RZUEUnXSA9IGInQycKKyAgICAgICAgXywgb3V0ID0gcnVuX3B5dGhvbignLWMnLCAnaW1wb3J0IF9pbzsgX2lvLkZpbGVJTyglciknICUgZmlsZW5hbWUsIGVudj1lbnYpCisgICAgICAgIGlmICgnVW5pY29kZUVuY29kZUVycm9yJyBub3QgaW4gb3V0IGFuZCBub3QKKyAgICAgICAgICAgICAgICAoICgnSU9FcnJvcjogW0Vycm5vIDJdIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnknIGluIG91dCkgb3IKKyAgICAgICAgICAgICAgICAgICgnSU9FcnJvcjogW0Vycm5vIDIyXSBJbnZhbGlkIGFyZ3VtZW50JyBpbiBvdXQpICkgKToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnQmFkIG91dHB1dDogJXInICUgb3V0KQorCisgICAgZGVmIHRlc3RVbmNsb3NlZEZET25FeGNlcHRpb24oc2VsZik6CisgICAgICAgIGNsYXNzIE15RXhjZXB0aW9uKEV4Y2VwdGlvbik6IHBhc3MKKyAgICAgICAgY2xhc3MgTXlGaWxlSU8oX0ZpbGVJTyk6CisgICAgICAgICAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gIm5hbWUiOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBNeUV4Y2VwdGlvbigiYmxvY2tlZCBzZXR0aW5nIG5hbWUiKQorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlcihNeUZpbGVJTywgc2VsZikuX19zZXRhdHRyX18obmFtZSwgdmFsdWUpCisgICAgICAgIGZkID0gb3Mub3BlbihfX2ZpbGVfXywgb3MuT19SRE9OTFkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE15RXhjZXB0aW9uLCBNeUZpbGVJTywgZmQpCisgICAgICAgIG9zLmNsb3NlKGZkKSAgIyBzaG91bGQgbm90IHJhaXNlIE9TRXJyb3IoRUJBREYpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICAjIEhpc3RvcmljYWxseSwgdGhlc2UgdGVzdHMgaGF2ZSBiZWVuIHNsb3BweSBhYm91dCByZW1vdmluZyBURVNURk4uCisgICAgIyBTbyBnZXQgcmlkIG9mIGl0IG5vIG1hdHRlciB3aGF0LgorICAgIHRyeToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KEF1dG9GaWxlVGVzdHMsIE90aGVyRmlsZVRlc3RzKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKFRFU1RGTik6CisgICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlaW8ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlvLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzdmYmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlvLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlaW8ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlvLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzdmYmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlvLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mbG9hdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zsb2F0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNDYzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mbG9hdC5weQpAQCAtMCwwICsxLDE0MDIgQEAKKworaW1wb3J0IHVuaXR0ZXN0LCBzdHJ1Y3QKK2ltcG9ydCBvcworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBtYXRoCitmcm9tIG1hdGggaW1wb3J0IGlzaW5mLCBpc25hbiwgY29weXNpZ24sIGxkZXhwCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBmcmFjdGlvbnMKK2ltcG9ydCBzeXMKKworSU5GID0gZmxvYXQoImluZiIpCitOQU4gPSBmbG9hdCgibmFuIikKKworaGF2ZV9nZXRmb3JtYXQgPSBoYXNhdHRyKGZsb2F0LCAiX19nZXRmb3JtYXRfXyIpCityZXF1aXJlc19nZXRmb3JtYXQgPSB1bml0dGVzdC5za2lwVW5sZXNzKGhhdmVfZ2V0Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZXMgX19nZXRmb3JtYXRfXyIpCityZXF1aXJlc19zZXRmb3JtYXQgPSB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoZmxvYXQsICJfX3NldGZvcm1hdF9fIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlcyBfX3NldGZvcm1hdF9fIikKKyMgZGVjb3JhdG9yIGZvciBza2lwcGluZyB0ZXN0cyBvbiBub24tSUVFRSA3NTQgcGxhdGZvcm1zCityZXF1aXJlc19JRUVFXzc1NCA9IHVuaXR0ZXN0LnNraXBVbmxlc3MoaGF2ZV9nZXRmb3JtYXQgYW5kCisgICAgZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpLAorICAgICJ0ZXN0IHJlcXVpcmVzIElFRUUgNzU0IGRvdWJsZXMiKQorCisjbG9jYXRlIGZpbGUgd2l0aCBmbG9hdCBmb3JtYXQgdGVzdCB2YWx1ZXMKK3Rlc3RfZGlyID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSBvciBvcy5jdXJkaXIKK2Zvcm1hdF90ZXN0ZmlsZSA9IG9zLnBhdGguam9pbih0ZXN0X2RpciwgJ2Zvcm1hdGZsb2F0X3Rlc3RjYXNlcy50eHQnKQorCitjbGFzcyBHZW5lcmFsRmxvYXRDYXNlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9mbG9hdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgzLjE0KSwgMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgzMTQpLCAzMTQuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgzMTRMKSwgMzE0LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiAgMy4xNCAgIiksIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICAweDMuMSAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIgIC0weDMucC0xICAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIiAgKzB4My5wLTEgICIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiKyszLjE0IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIrLTMuMTQiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIi0rMy4xNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiLS0zLjE0IikKKyAgICAgICAgIyBjaGVjayB0aGF0IHdlIGRvbid0IGFjY2VwdCBhbHRlcm5hdGUgZXhwb25lbnQgbWFya2VycworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIi0xLjdkMjkiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIjNELTE0IikKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQodW5pY29kZSgiICAzLjE0ICAiKSksIDMuMTQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KHVuaWNvZGUoIiAgXHUwNjYzLlx1MDY2MVx1MDY2NCAgIiwncmF3LXVuaWNvZGUtZXNjYXBlJykpLCAzLjE0KQorCisgICAgICAgICMgZXh0cmEgbG9uZyBzdHJpbmdzIHNob3VsZCBubyBsb25nZXIgYmUgYSBwcm9ibGVtCisgICAgICAgICMgKGluIDIuNiwgbG9uZyB1bmljb2RlIGlucHV0cyB0byBmbG9hdCByYWlzZWQgVmFsdWVFcnJvcikKKyAgICAgICAgZmxvYXQoJy4nICsgJzEnKjEwMDApCisgICAgICAgIGZsb2F0KHVuaWNvZGUoJy4nICsgJzEnKjEwMDApKQorCisgICAgZGVmIGNoZWNrX2NvbnZlcnNpb25fdG9faW50KHNlbGYsIHgpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGludCh4KSBoYXMgdGhlIGNvcnJlY3QgdmFsdWUgYW5kIHR5cGUsIGZvciBhIGZsb2F0IHguIiIiCisgICAgICAgIG4gPSBpbnQoeCkKKyAgICAgICAgaWYgeCA+PSAwLjA6CisgICAgICAgICAgICAjIHggPj0gMCBhbmQgbiA9IGludCh4KSAgPT0+ICBuIDw9IHggPCBuICsgMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobiwgeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyh4LCBuICsgMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgeCA8IDAgYW5kIG4gPSBpbnQoeCkgID09PiAgbiA+PSB4ID4gbiAtIDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKG4sIHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoeCwgbiAtIDEpCisKKyAgICAgICAgIyBSZXN1bHQgc2hvdWxkIGJlIGFuIGludCBpZiB3aXRoaW4gcmFuZ2UsIGVsc2UgYSBsb25nLgorICAgICAgICBpZiAtc3lzLm1heGludC0xIDw9IG4gPD0gc3lzLm1heGludDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShuKSwgaW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKG4pLCBsb25nKQorCisgICAgICAgICMgRG91YmxlIGNoZWNrLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoaW50KG4pKSwgdHlwZShuKSkKKworICAgIGRlZiB0ZXN0X2NvbnZlcnNpb25fdG9faW50KHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgZmxvYXRzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgYW4gaW50IGNvbnZlcnQgdG8gdHlwZQorICAgICAgICAjIGludCwgbm90IGxvbmcuICAoaXNzdWUgIzExMTQ0LikKKyAgICAgICAgYm91bmRhcnkgPSBmbG9hdChzeXMubWF4aW50ICsgMSkKKyAgICAgICAgZXBzaWxvbiA9IDIqKi1zeXMuZmxvYXRfaW5mby5tYW50X2RpZyAqIGJvdW5kYXJ5CisKKyAgICAgICAgIyBUaGVzZSAyIGZsb2F0cyBhcmUgZWl0aGVyIHNpZGUgb2YgdGhlIHBvc2l0aXZlIGludC9sb25nIGJvdW5kYXJ5IG9uCisgICAgICAgICMgYm90aCAzMi1iaXQgYW5kIDY0LWJpdCBzeXN0ZW1zLgorICAgICAgICBzZWxmLmNoZWNrX2NvbnZlcnNpb25fdG9faW50KGJvdW5kYXJ5IC0gZXBzaWxvbikKKyAgICAgICAgc2VsZi5jaGVja19jb252ZXJzaW9uX3RvX2ludChib3VuZGFyeSkKKworICAgICAgICAjIFRoZXNlIGZsb2F0cyBhcmUgZWl0aGVyIHNpZGUgb2YgdGhlIG5lZ2F0aXZlIGxvbmcvaW50IGJvdW5kYXJ5IG9uCisgICAgICAgICMgNjQtYml0IHN5c3RlbXMuLi4KKyAgICAgICAgc2VsZi5jaGVja19jb252ZXJzaW9uX3RvX2ludCgtYm91bmRhcnkgLSAyKmVwc2lsb24pCisgICAgICAgIHNlbGYuY2hlY2tfY29udmVyc2lvbl90b19pbnQoLWJvdW5kYXJ5KQorCisgICAgICAgICMgLi4uIGFuZCB0aGVzZSBvbmVzIGFyZSBlaXRoZXIgc2lkZSBvZiB0aGUgbmVnYXRpdmUgbG9uZy9pbnQKKyAgICAgICAgIyBib3VuZGFyeSBvbiAzMi1iaXQgc3lzdGVtcy4KKyAgICAgICAgc2VsZi5jaGVja19jb252ZXJzaW9uX3RvX2ludCgtYm91bmRhcnkgLSAxLjApCisgICAgICAgIHNlbGYuY2hlY2tfY29udmVyc2lvbl90b19pbnQoLWJvdW5kYXJ5IC0gMS4wICsgMiplcHNpbG9uKQorCisgICAgQHRlc3Rfc3VwcG9ydC5ydW5fd2l0aF9sb2NhbGUoJ0xDX05VTUVSSUMnLCAnZnJfRlInLCAnZGVfREUnKQorICAgIGRlZiB0ZXN0X2Zsb2F0X3dpdGhfY29tbWEoc2VsZik6CisgICAgICAgICMgc2V0IGxvY2FsZSB0byBzb21ldGhpbmcgdGhhdCBkb2Vzbid0IHVzZSAnLicgZm9yIHRoZSBkZWNpbWFsIHBvaW50CisgICAgICAgICMgZmxvYXQgbXVzdCBub3QgYWNjZXB0IHRoZSBsb2NhbGUgc3BlY2lmaWMgZGVjaW1hbCBwb2ludCBidXQKKyAgICAgICAgIyBpdCBzdGlsbCBoYXMgdG8gYWNjZXB0IHRoZSBub3JtYWwgcHl0aG9uIHN5bnRheAorICAgICAgICBpbXBvcnQgbG9jYWxlCisgICAgICAgIGlmIG5vdCBsb2NhbGUubG9jYWxlY29udigpWydkZWNpbWFsX3BvaW50J10gPT0gJywnOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiICAzLjE0ICAiKSwgMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiKzMuMTQgICIpLCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCItMy4xNCAgIiksIC0zLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIuMTQgICIpLCAuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIjMuICAiKSwgMy4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIzLmUzICAiKSwgMzAwMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIzLjJlMyAgIiksIDMyMDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiMi41ZS0xICAiKSwgMC4yNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiNWUtMSIpLCAwLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICAzLDE0ICAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIiAgKzMsMTQgICIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICAtMywxNCAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIgIDB4My4xICAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIiAgLTB4My5wLTEgICIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICArMHgzLnAtMSAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiICAyNS5lLTEgICIpLCAyLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9zdXBwb3J0LmZjbXAoZmxvYXQoIiAgLjI1ZS0xICAiKSwgLjAyNSksIDApCisKKyAgICBkZWYgdGVzdF9mbG9hdGNvbnZlcnNpb24oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgY2FsbHMgdG8gX19mbG9hdF9fKCkgd29yayBwcm9wZXJseQorICAgICAgICBjbGFzcyBGb28wOgorICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIuCisKKyAgICAgICAgY2xhc3MgRm9vMShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIuCisKKyAgICAgICAgY2xhc3MgRm9vMihmbG9hdCk6CisgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0Mi4KKworICAgICAgICBjbGFzcyBGb28zKGZsb2F0KToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgdmFsdWU9MC4pOgorICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdC5fX25ld19fKGNscywgMip2YWx1ZSkKKworICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGNsYXNzIEZvbzQoZmxvYXQpOgorICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIKKworICAgICAgICAjIElzc3VlIDU3NTk6IF9fZmxvYXRfXyBub3QgY2FsbGVkIG9uIHN0ciBzdWJjbGFzc2VzICh0aG91Z2ggaXQgaXMgb24KKyAgICAgICAgIyB1bmljb2RlIHN1YmNsYXNzZXMpLgorICAgICAgICBjbGFzcyBGb29TdHIoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHN0cihzZWxmKSkgKyAxCisKKyAgICAgICAgY2xhc3MgRm9vVW5pY29kZSh1bmljb2RlKToKKyAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHVuaWNvZGUoc2VsZikpICsgMQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZmxvYXQoRm9vMCgpKSwgNDIuKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEZvbzEoKSksIDQyLikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChGb28yKCkpLCA0Mi4pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZmxvYXQoRm9vMygyMSkpLCA0Mi4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmxvYXQsIEZvbzQoNDIpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEZvb1VuaWNvZGUoJzgnKSksIDkuKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEZvb1N0cignOCcpKSwgOS4pCisKKyAgICBkZWYgdGVzdF9pc19pbnRlZ2VyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCgxLjEpLmlzX2ludGVnZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgxLikuaXNfaW50ZWdlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZsb2F0KCJuYW4iKS5pc19pbnRlZ2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmxvYXQoImluZiIpLmlzX2ludGVnZXIoKSkKKworICAgIGRlZiB0ZXN0X2Zsb2F0YXNyYXRpbyhzZWxmKToKKyAgICAgICAgZm9yIGYsIHJhdGlvIGluIFsKKyAgICAgICAgICAgICAgICAoMC44NzUsICg3LCA4KSksCisgICAgICAgICAgICAgICAgKC0wLjg3NSwgKC03LCA4KSksCisgICAgICAgICAgICAgICAgKDAuMCwgKDAsIDEpKSwKKyAgICAgICAgICAgICAgICAoMTEuNSwgKDIzLCAyKSksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmFzX2ludGVnZXJfcmF0aW8oKSwgcmF0aW8pCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMDApOgorICAgICAgICAgICAgZiA9IHJhbmRvbS5yYW5kb20oKQorICAgICAgICAgICAgZiAqPSAxMCAqKiByYW5kb20ucmFuZGludCgtMTAwLCAxMDApCisgICAgICAgICAgICBuLCBkID0gZi5hc19pbnRlZ2VyX3JhdGlvKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQobikuX190cnVlZGl2X18oZCksIGYpCisKKyAgICAgICAgUiA9IGZyYWN0aW9ucy5GcmFjdGlvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFIoMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgUigqZmxvYXQoMC4wKS5hc19pbnRlZ2VyX3JhdGlvKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFIoNSwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgUigqZmxvYXQoMi41KS5hc19pbnRlZ2VyX3JhdGlvKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFIoMSwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgUigqZmxvYXQoMC41KS5hc19pbnRlZ2VyX3JhdGlvKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFIoNDcyODc3OTYwODczOTAyMSwgMjI1MTc5OTgxMzY4NTI0OCksCisgICAgICAgICAgICAgICAgICAgICAgICAgUigqZmxvYXQoMi4xKS5hc19pbnRlZ2VyX3JhdGlvKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFIoLTQ3Mjg3Nzk2MDg3MzkwMjEsIDIyNTE3OTk4MTM2ODUyNDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFIoKmZsb2F0KC0yLjEpLmFzX2ludGVnZXJfcmF0aW8oKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUigtMjEwMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgUigqZmxvYXQoLTIxMDAuMCkuYXNfaW50ZWdlcl9yYXRpbygpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmbG9hdCgnaW5mJykuYXNfaW50ZWdlcl9yYXRpbykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZmxvYXQoJy1pbmYnKS5hc19pbnRlZ2VyX3JhdGlvKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCgnbmFuJykuYXNfaW50ZWdlcl9yYXRpbykKKworICAgIGRlZiBhc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihzZWxmLCBhLCBiKToKKyAgICAgICAgIyBmYWlsIHVubGVzcyBhID09IGIgYW5kIGEgYW5kIGIgaGF2ZSB0aGUgc2FtZSBzaWduIGJpdDsKKyAgICAgICAgIyB0aGUgb25seSBkaWZmZXJlbmNlIGZyb20gYXNzZXJ0RXF1YWwgaXMgdGhhdCB0aGlzIHRlc3QKKyAgICAgICAgIyBkaXN0aW5ndWlzaGVzIC0wLjAgYW5kIDAuMC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSwgY29weXNpZ24oMS4wLCBhKSksIChiLCBjb3B5c2lnbigxLjAsIGIpKSkKKworICAgIEByZXF1aXJlc19JRUVFXzc1NAorICAgIGRlZiB0ZXN0X2Zsb2F0X21vZChzZWxmKToKKyAgICAgICAgIyBDaGVjayBiZWhhdmlvdXIgb2YgJSBvcGVyYXRvciBmb3IgSUVFRSA3NTQgc3BlY2lhbCBjYXNlcy4KKyAgICAgICAgIyBJbiBwYXJ0aWN1bGFyLCBjaGVjayBzaWducyBvZiB6ZXJvcy4KKyAgICAgICAgbW9kID0gb3BlcmF0b3IubW9kCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihtb2QoLTEuMCwgMS4wKSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKG1vZCgtMWUtMTAwLCAxLjApLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24obW9kKC0wLjAsIDEuMCksIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihtb2QoMC4wLCAxLjApLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24obW9kKDFlLTEwMCwgMS4wKSwgMWUtMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKG1vZCgxLjAsIDEuMCksIDAuMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKG1vZCgtMS4wLCAtMS4wKSwgLTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihtb2QoLTFlLTEwMCwgLTEuMCksIC0xZS0xMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24obW9kKC0wLjAsIC0xLjApLCAtMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKG1vZCgwLjAsIC0xLjApLCAtMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKG1vZCgxZS0xMDAsIC0xLjApLCAtMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKG1vZCgxLjAsIC0xLjApLCAtMC4wKQorCisgICAgQHJlcXVpcmVzX0lFRUVfNzU0CisgICAgZGVmIHRlc3RfZmxvYXRfcG93KHNlbGYpOgorICAgICAgICAjIHRlc3QgYnVpbHRpbiBwb3cgYW5kICoqIG9wZXJhdG9yIGZvciBJRUVFIDc1NCBzcGVjaWFsIGNhc2VzLgorICAgICAgICAjIFNwZWNpYWwgY2FzZXMgdGFrZW4gZnJvbSBzZWN0aW9uIEYuOS40LjQgb2YgdGhlIEM5OSBzcGVjaWZpY2F0aW9uCisKKyAgICAgICAgZm9yIHBvd19vcCBpbiBwb3csIG9wZXJhdG9yLnBvdzoKKyAgICAgICAgICAgICMgeCoqTkFOIGlzIE5BTiBmb3IgYW55IHggZXhjZXB0IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihwb3dfb3AoLUlORiwgTkFOKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4ocG93X29wKC0yLjAsIE5BTikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcCgtMS4wLCBOQU4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihwb3dfb3AoLTAuNSwgTkFOKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4ocG93X29wKC0wLjAsIE5BTikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcCgwLjAsIE5BTikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcCgwLjUsIE5BTikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcCgyLjAsIE5BTikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcChJTkYsIE5BTikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcChOQU4sIE5BTikpKQorCisgICAgICAgICAgICAjIE5BTioqeSBpcyBOQU4gZm9yIGFueSB5IGV4Y2VwdCArLTAKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihwb3dfb3AoTkFOLCAtSU5GKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4ocG93X29wKE5BTiwgLTIuMCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcChOQU4sIC0xLjApKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihwb3dfb3AoTkFOLCAtMC41KSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4ocG93X29wKE5BTiwgMC41KSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4ocG93X29wKE5BTiwgMS4wKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4ocG93X29wKE5BTiwgMi4wKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4ocG93X29wKE5BTiwgSU5GKSkpCisKKyAgICAgICAgICAgICMgKCstMCkqKnkgcmFpc2VzIFplcm9EaXZpc2lvbkVycm9yIGZvciB5IGEgbmVnYXRpdmUgb2RkIGludGVnZXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBwb3dfb3AsIC0wLjAsIC0xLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgcG93X29wLCAwLjAsIC0xLjApCisKKyAgICAgICAgICAgICMgKCstMCkqKnkgcmFpc2VzIFplcm9EaXZpc2lvbkVycm9yIGZvciB5IGZpbml0ZSBhbmQgbmVnYXRpdmUKKyAgICAgICAgICAgICMgYnV0IG5vdCBhbiBvZGQgaW50ZWdlcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIHBvd19vcCwgLTAuMCwgLTIuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBwb3dfb3AsIC0wLjAsIC0wLjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgcG93X29wLCAwLjAsIC0yLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgcG93X29wLCAwLjAsIC0wLjUpCisKKyAgICAgICAgICAgICMgKCstMCkqKnkgaXMgKy0wIGZvciB5IGEgcG9zaXRpdmUgb2RkIGludGVnZXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0wLjAsIDEuMCksIC0wLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgwLjAsIDEuMCksIDAuMCkKKworICAgICAgICAgICAgIyAoKy0wKSoqeSBpcyAwIGZvciB5IGZpbml0ZSBhbmQgcG9zaXRpdmUgYnV0IG5vdCBhbiBvZGQgaW50ZWdlcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTAuMCwgMC41KSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTAuMCwgMi4wKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMC4wLCAwLjUpLCAwLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgwLjAsIDIuMCksIDAuMCkKKworICAgICAgICAgICAgIyAoLTEpKiorLWluZiBpcyAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMS4wLCAtSU5GKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTEuMCwgSU5GKSwgMS4wKQorCisgICAgICAgICAgICAjIDEqKnkgaXMgMSBmb3IgYW55IHksIGV2ZW4gaWYgeSBpcyBhbiBpbmZpbml0eSBvciBuYW4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDEuMCwgLUlORiksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDEuMCwgLTIuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDEuMCwgLTEuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDEuMCwgLTAuNSksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDEuMCwgLTAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDEuMCwgMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMS4wLCAwLjUpLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgxLjAsIDEuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDEuMCwgMi4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMS4wLCBJTkYpLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgxLjAsIE5BTiksIDEuMCkKKworICAgICAgICAgICAgIyB4KiorLTAgaXMgMSBmb3IgYW55IHgsIGV2ZW4gaWYgeCBpcyBhIHplcm8sIGluZmluaXR5LCBvciBuYW4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC1JTkYsIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0yLjAsIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0xLjAsIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0wLjUsIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0wLjAsIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDAuMCwgMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMC41LCAwLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgxLjAsIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDIuMCwgMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoSU5GLCAwLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcChOQU4sIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC1JTkYsIC0wLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMi4wLCAtMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTEuMCwgLTAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0wLjUsIC0wLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMC4wLCAtMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMC4wLCAtMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMC41LCAtMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMS4wLCAtMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMi4wLCAtMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoSU5GLCAtMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoTkFOLCAtMC4wKSwgMS4wKQorCisgICAgICAgICAgICAjIHgqKnkgcmFpc2VzIFZhbHVlRXJyb3IgZm9yIGZpbml0ZSBuZWdhdGl2ZSB4IGFuZCBub24taW50ZWdyYWwgeQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG93X29wLCAtMi4wLCAtMC41KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG93X29wLCAtMi4wLCAwLjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwb3dfb3AsIC0xLjAsIC0wLjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwb3dfb3AsIC0xLjAsIDAuNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvd19vcCwgLTAuNSwgLTAuNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvd19vcCwgLTAuNSwgMC41KQorCisgICAgICAgICAgICAjIHgqKi1JTkYgaXMgSU5GIGZvciBhYnMoeCkgPCAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMC41LCAtSU5GKSwgSU5GKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTAuMCwgLUlORiksIElORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDAuMCwgLUlORiksIElORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDAuNSwgLUlORiksIElORikKKworICAgICAgICAgICAgIyB4KiotSU5GIGlzIDAgZm9yIGFicyh4KSA+IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC1JTkYsIC1JTkYpLCAwLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMi4wLCAtSU5GKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMi4wLCAtSU5GKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoSU5GLCAtSU5GKSwgMC4wKQorCisgICAgICAgICAgICAjIHgqKklORiBpcyAwIGZvciBhYnMoeCkgPCAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMC41LCBJTkYpLCAwLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMC4wLCBJTkYpLCAwLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgwLjAsIElORiksIDAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDAuNSwgSU5GKSwgMC4wKQorCisgICAgICAgICAgICAjIHgqKklORiBpcyBJTkYgZm9yIGFicyh4KSA+IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC1JTkYsIElORiksIElORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0yLjAsIElORiksIElORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDIuMCwgSU5GKSwgSU5GKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoSU5GLCBJTkYpLCBJTkYpCisKKyAgICAgICAgICAgICMgKC1JTkYpKip5IGlzIC0wLjAgZm9yIHkgYSBuZWdhdGl2ZSBvZGQgaW50ZWdlcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLUlORiwgLTEuMCksIC0wLjApCisKKyAgICAgICAgICAgICMgKC1JTkYpKip5IGlzIDAuMCBmb3IgeSBuZWdhdGl2ZSBidXQgbm90IGFuIG9kZCBpbnRlZ2VyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtSU5GLCAtMC41KSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLUlORiwgLTIuMCksIDAuMCkKKworICAgICAgICAgICAgIyAoLUlORikqKnkgaXMgLUlORiBmb3IgeSBhIHBvc2l0aXZlIG9kZCBpbnRlZ2VyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtSU5GLCAxLjApLCAtSU5GKQorCisgICAgICAgICAgICAjICgtSU5GKSoqeSBpcyBJTkYgZm9yIHkgcG9zaXRpdmUgYnV0IG5vdCBhbiBvZGQgaW50ZWdlcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLUlORiwgMC41KSwgSU5GKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLUlORiwgMi4wKSwgSU5GKQorCisgICAgICAgICAgICAjIElORioqeSBpcyBJTkYgZm9yIHkgcG9zaXRpdmUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKElORiwgMC41KSwgSU5GKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoSU5GLCAxLjApLCBJTkYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcChJTkYsIDIuMCksIElORikKKworICAgICAgICAgICAgIyBJTkYqKnkgaXMgMC4wIGZvciB5IG5lZ2F0aXZlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcChJTkYsIC0yLjApLCAwLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcChJTkYsIC0xLjApLCAwLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcChJTkYsIC0wLjUpLCAwLjApCisKKyAgICAgICAgICAgICMgYmFzaWMgY2hlY2tzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBzcGVjaWFsIGNhc2VzIGFib3ZlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMi4wLCAtMi4wKSwgMC4yNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0yLjAsIC0xLjApLCAtMC41KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTIuMCwgLTAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0yLjAsIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0yLjAsIDEuMCksIC0yLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMi4wLCAyLjApLCA0LjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMS4wLCAtMi4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTEuMCwgLTEuMCksIC0xLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMS4wLCAtMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTEuMCwgMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTEuMCwgMS4wKSwgLTEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0xLjAsIDIuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDIuMCwgLTIuMCksIDAuMjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgyLjAsIC0xLjApLCAwLjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgyLjAsIC0wLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgyLjAsIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDIuMCwgMS4wKSwgMi4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMi4wLCAyLjApLCA0LjApCisKKyAgICAgICAgICAgICMgMSAqKiBsYXJnZSBhbmQgLTEgKiogbGFyZ2U7IHNvbWUgbGlibXMgYXBwYXJlbnRseQorICAgICAgICAgICAgIyBoYXZlIHByb2JsZW1zIHdpdGggdGhlc2UKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDEuMCwgLTFlMTAwKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMS4wLCAxZTEwMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0xLjAsIC0xZTEwMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0xLjAsIDFlMTAwKSwgMS4wKQorCisgICAgICAgICAgICAjIGNoZWNrIHNpZ24gZm9yIHJlc3VsdHMgdGhhdCB1bmRlcmZsb3cgdG8gMAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTIuMCwgLTIwMDAuMCksIDAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvd19vcCwgLTIuMCwgLTIwMDAuNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0yLjAsIC0yMDAxLjApLCAtMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMi4wLCAtMjAwMC4wKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMi4wLCAtMjAwMC41KSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMi4wLCAtMjAwMS4wKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTAuNSwgMjAwMC4wKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG93X29wLCAtMC41LCAyMDAwLjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMC41LCAyMDAxLjApLCAtMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMC41LCAyMDAwLjApLCAwLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgwLjUsIDIwMDAuNSksIDAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDAuNSwgMjAwMS4wKSwgMC4wKQorCisgICAgICAgICAgICAjIGNoZWNrIHdlIGRvbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBmb3Igc3Vibm9ybWFsIHJlc3VsdHMsCisgICAgICAgICAgICAjIGFuZCB2YWxpZGF0ZSBzaWducy4gIFRlc3RzIGN1cnJlbnRseSBkaXNhYmxlZCwgc2luY2UKKyAgICAgICAgICAgICMgdGhleSBmYWlsIG9uIHN5c3RlbXMgd2hlcmUgYSBzdWJub3JtYWwgcmVzdWx0IGZyb20gcG93CisgICAgICAgICAgICAjIGlzIGZsdXNoZWQgdG8gemVybyAoZS5nLiBEZWJpYW4vaWE2NC4pCisgICAgICAgICAgICAjc2VsZi5hc3NlcnRUcnVlKDAuMCA8IHBvd19vcCgwLjUsIDEwNDgpIDwgMWUtMzE1KQorICAgICAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZSgwLjAgPCBwb3dfb3AoLTAuNSwgMTA0OCkgPCAxZS0zMTUpCisgICAgICAgICAgICAjc2VsZi5hc3NlcnRUcnVlKDAuMCA8IHBvd19vcCgwLjUsIDEwNDcpIDwgMWUtMzE1KQorICAgICAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZSgwLjAgPiBwb3dfb3AoLTAuNSwgMTA0NykgPiAtMWUtMzE1KQorICAgICAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZSgwLjAgPCBwb3dfb3AoMi4wLCAtMTA0OCkgPCAxZS0zMTUpCisgICAgICAgICAgICAjc2VsZi5hc3NlcnRUcnVlKDAuMCA8IHBvd19vcCgtMi4wLCAtMTA0OCkgPCAxZS0zMTUpCisgICAgICAgICAgICAjc2VsZi5hc3NlcnRUcnVlKDAuMCA8IHBvd19vcCgyLjAsIC0xMDQ3KSA8IDFlLTMxNSkKKyAgICAgICAgICAgICNzZWxmLmFzc2VydFRydWUoMC4wID4gcG93X29wKC0yLjAsIC0xMDQ3KSA+IC0xZS0zMTUpCisKKworQHJlcXVpcmVzX3NldGZvcm1hdAorY2xhc3MgRm9ybWF0RnVuY3Rpb25zVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNhdmVfZm9ybWF0cyA9IHsnZG91YmxlJzpmbG9hdC5fX2dldGZvcm1hdF9fKCdkb3VibGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zsb2F0JzpmbG9hdC5fX2dldGZvcm1hdF9fKCdmbG9hdCcpfQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmbG9hdC5fX3NldGZvcm1hdF9fKCdkb3VibGUnLCBzZWxmLnNhdmVfZm9ybWF0c1snZG91YmxlJ10pCisgICAgICAgIGZsb2F0Ll9fc2V0Zm9ybWF0X18oJ2Zsb2F0Jywgc2VsZi5zYXZlX2Zvcm1hdHNbJ2Zsb2F0J10pCisKKyAgICBkZWYgdGVzdF9nZXRmb3JtYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oZmxvYXQuX19nZXRmb3JtYXRfXygnZG91YmxlJyksCisgICAgICAgICAgICAgICAgICAgICAgWyd1bmtub3duJywgJ0lFRUUsIGJpZy1lbmRpYW4nLCAnSUVFRSwgbGl0dGxlLWVuZGlhbiddKQorICAgICAgICBzZWxmLmFzc2VydEluKGZsb2F0Ll9fZ2V0Zm9ybWF0X18oJ2Zsb2F0JyksCisgICAgICAgICAgICAgICAgICAgICAgWyd1bmtub3duJywgJ0lFRUUsIGJpZy1lbmRpYW4nLCAnSUVFRSwgbGl0dGxlLWVuZGlhbiddKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdC5fX2dldGZvcm1hdF9fLCAnY2hpY2tlbicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmxvYXQuX19nZXRmb3JtYXRfXywgMSkKKworICAgIGRlZiB0ZXN0X3NldGZvcm1hdChzZWxmKToKKyAgICAgICAgZm9yIHQgaW4gJ2RvdWJsZScsICdmbG9hdCc6CisgICAgICAgICAgICBmbG9hdC5fX3NldGZvcm1hdF9fKHQsICd1bmtub3duJykKKyAgICAgICAgICAgIGlmIHNlbGYuc2F2ZV9mb3JtYXRzW3RdID09ICdJRUVFLCBiaWctZW5kaWFuJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdC5fX3NldGZvcm1hdF9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsICdJRUVFLCBsaXR0bGUtZW5kaWFuJykKKyAgICAgICAgICAgIGVsaWYgc2VsZi5zYXZlX2Zvcm1hdHNbdF0gPT0gJ0lFRUUsIGxpdHRsZS1lbmRpYW4nOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0Ll9fc2V0Zm9ybWF0X18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwgJ0lFRUUsIGJpZy1lbmRpYW4nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdC5fX3NldGZvcm1hdF9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsICdJRUVFLCBiaWctZW5kaWFuJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdC5fX3NldGZvcm1hdF9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsICdJRUVFLCBsaXR0bGUtZW5kaWFuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0Ll9fc2V0Zm9ybWF0X18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LCAnY2hpY2tlbicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0Ll9fc2V0Zm9ybWF0X18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICdjaGlja2VuJywgJ3Vua25vd24nKQorCitCRV9ET1VCTEVfSU5GID0gJ1x4N2ZceGYwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJworTEVfRE9VQkxFX0lORiA9ICcnLmpvaW4ocmV2ZXJzZWQoQkVfRE9VQkxFX0lORikpCitCRV9ET1VCTEVfTkFOID0gJ1x4N2ZceGY4XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJworTEVfRE9VQkxFX05BTiA9ICcnLmpvaW4ocmV2ZXJzZWQoQkVfRE9VQkxFX05BTikpCisKK0JFX0ZMT0FUX0lORiA9ICdceDdmXHg4MFx4MDBceDAwJworTEVfRkxPQVRfSU5GID0gJycuam9pbihyZXZlcnNlZChCRV9GTE9BVF9JTkYpKQorQkVfRkxPQVRfTkFOID0gJ1x4N2ZceGMwXHgwMFx4MDAnCitMRV9GTE9BVF9OQU4gPSAnJy5qb2luKHJldmVyc2VkKEJFX0ZMT0FUX05BTikpCisKKyMgb24gbm9uLUlFRUUgcGxhdGZvcm1zLCBhdHRlbXB0aW5nIHRvIHVucGFjayBhIGJpdCBwYXR0ZXJuCisjIHJlcHJlc2VudGluZyBhbiBpbmZpbml0eSBvciBhIE5hTiBzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uLgorCitAcmVxdWlyZXNfc2V0Zm9ybWF0CitjbGFzcyBVbmtub3duRm9ybWF0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zYXZlX2Zvcm1hdHMgPSB7J2RvdWJsZSc6ZmxvYXQuX19nZXRmb3JtYXRfXygnZG91YmxlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmbG9hdCc6ZmxvYXQuX19nZXRmb3JtYXRfXygnZmxvYXQnKX0KKyAgICAgICAgZmxvYXQuX19zZXRmb3JtYXRfXygnZG91YmxlJywgJ3Vua25vd24nKQorICAgICAgICBmbG9hdC5fX3NldGZvcm1hdF9fKCdmbG9hdCcsICd1bmtub3duJykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZmxvYXQuX19zZXRmb3JtYXRfXygnZG91YmxlJywgc2VsZi5zYXZlX2Zvcm1hdHNbJ2RvdWJsZSddKQorICAgICAgICBmbG9hdC5fX3NldGZvcm1hdF9fKCdmbG9hdCcsIHNlbGYuc2F2ZV9mb3JtYXRzWydmbG9hdCddKQorCisgICAgZGVmIHRlc3RfZG91YmxlX3NwZWNpYWxzX2RvbnRfdW5wYWNrKHNlbGYpOgorICAgICAgICBmb3IgZm10LCBkYXRhIGluIFsoJz5kJywgQkVfRE9VQkxFX0lORiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnPmQnLCBCRV9ET1VCTEVfTkFOKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCc8ZCcsIExFX0RPVUJMRV9JTkYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJzxkJywgTEVfRE9VQkxFX05BTildOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3RydWN0LnVucGFjaywgZm10LCBkYXRhKQorCisgICAgZGVmIHRlc3RfZmxvYXRfc3BlY2lhbHNfZG9udF91bnBhY2soc2VsZik6CisgICAgICAgIGZvciBmbXQsIGRhdGEgaW4gWygnPmYnLCBCRV9GTE9BVF9JTkYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJz5mJywgQkVfRkxPQVRfTkFOKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCc8ZicsIExFX0ZMT0FUX0lORiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnPGYnLCBMRV9GTE9BVF9OQU4pXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cnVjdC51bnBhY2ssIGZtdCwgZGF0YSkKKworCisjIG9uIGFuIElFRUUgcGxhdGZvcm0sIGFsbCB3ZSBndWFyYW50ZWUgaXMgdGhhdCBiaXQgcGF0dGVybnMKKyMgcmVwcmVzZW50aW5nIGluZmluaXRpZXMgb3IgTmFOcyBkbyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uOyBhbGwgZWxzZQorIyBpcyBhY2NpZGVudCAodG9kYXkpLgorIyBsZXQncyBhbHNvIHRyeSB0byBndWFyYW50ZWUgdGhhdCAtMC4wIGFuZCAwLjAgZG9uJ3QgZ2V0IGNvbmZ1c2VkLgorCitjbGFzcyBJRUVFRm9ybWF0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQHJlcXVpcmVzX0lFRUVfNzU0CisgICAgZGVmIHRlc3RfZG91YmxlX3NwZWNpYWxzX2RvX3VucGFjayhzZWxmKToKKyAgICAgICAgZm9yIGZtdCwgZGF0YSBpbiBbKCc+ZCcsIEJFX0RPVUJMRV9JTkYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJz5kJywgQkVfRE9VQkxFX05BTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnPGQnLCBMRV9ET1VCTEVfSU5GKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCc8ZCcsIExFX0RPVUJMRV9OQU4pXToKKyAgICAgICAgICAgIHN0cnVjdC51bnBhY2soZm10LCBkYXRhKQorCisgICAgQHJlcXVpcmVzX0lFRUVfNzU0CisgICAgZGVmIHRlc3RfZmxvYXRfc3BlY2lhbHNfZG9fdW5wYWNrKHNlbGYpOgorICAgICAgICBmb3IgZm10LCBkYXRhIGluIFsoJz5mJywgQkVfRkxPQVRfSU5GKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCc+ZicsIEJFX0ZMT0FUX05BTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnPGYnLCBMRV9GTE9BVF9JTkYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJzxmJywgTEVfRkxPQVRfTkFOKV06CisgICAgICAgICAgICBzdHJ1Y3QudW5wYWNrKGZtdCwgZGF0YSkKKworICAgIEByZXF1aXJlc19JRUVFXzc1NAorICAgIGRlZiB0ZXN0X25lZ2F0aXZlX3plcm8oc2VsZik6CisgICAgICAgIGRlZiBwb3NfcG9zKCk6CisgICAgICAgICAgICByZXR1cm4gMC4wLCBtYXRoLmF0YW4yKDAuMCwgLTEpCisgICAgICAgIGRlZiBwb3NfbmVnKCk6CisgICAgICAgICAgICByZXR1cm4gMC4wLCBtYXRoLmF0YW4yKC0wLjAsIC0xKQorICAgICAgICBkZWYgbmVnX3BvcygpOgorICAgICAgICAgICAgcmV0dXJuIC0wLjAsIG1hdGguYXRhbjIoMC4wLCAtMSkKKyAgICAgICAgZGVmIG5lZ19uZWcoKToKKyAgICAgICAgICAgIHJldHVybiAtMC4wLCBtYXRoLmF0YW4yKC0wLjAsIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc19wb3MoKSwgbmVnX3BvcygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc19uZWcoKSwgbmVnX25lZygpKQorCisgICAgQHJlcXVpcmVzX0lFRUVfNzU0CisgICAgZGVmIHRlc3RfdW5kZXJmbG93X3NpZ24oc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCAtMWUtMTAwMCBnaXZlcyAtMC4wLCBub3QgMC4wCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hdGFuMigtMWUtMTAwMCwgLTEpLCBtYXRoLmF0YW4yKC0wLjAsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmF0YW4yKGZsb2F0KCctMWUtMTAwMCcpLCAtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbWF0aC5hdGFuMigtMC4wLCAtMSkpCisKKyAgICBkZWYgdGVzdF9mb3JtYXQoc2VsZik6CisgICAgICAgICMgdGhlc2Ugc2hvdWxkIGJlIHJld3JpdHRlbiB0byB1c2UgYm90aCBmb3JtYXQoeCwgc3BlYykgYW5kCisgICAgICAgICMgeC5fX2Zvcm1hdF9fKHNwZWMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMC4wLCAnZicpLCAnMC4wMDAwMDAnKQorCisgICAgICAgICMgdGhlIGRlZmF1bHQgaXMgJ2cnLCBleGNlcHQgZm9yIGVtcHR5IGZvcm1hdCBzcGVjCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDAuMCwgJycpLCAnMC4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMC4wMSwgJycpLCAnMC4wMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDAuMDEsICdnJyksICcwLjAxJykKKworICAgICAgICAjIGVtcHR5IHByZXNlbnRhdGlvbiB0eXBlIHNob3VsZCBmb3JtYXQgaW4gdGhlIHNhbWUgd2F5IGFzIHN0cgorICAgICAgICAjIChpc3N1ZSA1OTIwKQorICAgICAgICB4ID0gMTAwLzcuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHgsICcnKSwgc3RyKHgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh4LCAnLScpLCBzdHIoeCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHgsICc+JyksIHN0cih4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeCwgJzInKSwgc3RyKHgpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDEuMCwgJ2YnKSwgJzEuMDAwMDAwJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgtMS4wLCAnZicpLCAnLTEuMDAwMDAwJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCggMS4wLCAnIGYnKSwgJyAxLjAwMDAwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KC0xLjAsICcgZicpLCAnLTEuMDAwMDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoIDEuMCwgJytmJyksICcrMS4wMDAwMDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgtMS4wLCAnK2YnKSwgJy0xLjAwMDAwMCcpCisKKyAgICAgICAgIyAlIGZvcm1hdHRpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoLTEuMCwgJyUnKSwgJy0xMDAuMDAwMDAwJScpCisKKyAgICAgICAgIyBjb252ZXJzaW9uIHRvIHN0cmluZyBzaG91bGQgZmFpbAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIDMuMCwgInMiKQorCisgICAgICAgICMgb3RoZXIgZm9ybWF0IHNwZWNpZmllcnMgc2hvdWxkbid0IHdvcmsgb24gZmxvYXRzLAorICAgICAgICAjICBpbiBwYXJ0aWN1bGFyIGludCBzcGVjaWZpZXJzCisgICAgICAgIGZvciBmb3JtYXRfc3BlYyBpbiAoW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJ2EnKSwgb3JkKCd6JykrMSldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnQScpLCBvcmQoJ1onKSsxKV0pOgorICAgICAgICAgICAgaWYgbm90IGZvcm1hdF9zcGVjIGluICdlRWZGZ0duJSc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAwLjAsIGZvcm1hdF9zcGVjKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgMS4wLCBmb3JtYXRfc3BlYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIC0xLjAsIGZvcm1hdF9zcGVjKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgMWUxMDAsIGZvcm1hdF9zcGVjKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgLTFlMTAwLCBmb3JtYXRfc3BlYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIDFlLTEwMCwgZm9ybWF0X3NwZWMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAtMWUtMTAwLCBmb3JtYXRfc3BlYykKKworICAgICAgICAjIGlzc3VlIDMzODI6ICdmJyBhbmQgJ0YnIHdpdGggaW5mJ3MgYW5kIG5hbidzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOmZ9Jy5mb3JtYXQoSU5GKSwgJ2luZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOkZ9Jy5mb3JtYXQoSU5GKSwgJ0lORicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOmZ9Jy5mb3JtYXQoLUlORiksICctaW5mJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Rn0nLmZvcm1hdCgtSU5GKSwgJy1JTkYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpmfScuZm9ybWF0KE5BTiksICduYW4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpGfScuZm9ybWF0KE5BTiksICdOQU4nKQorCisgICAgQHJlcXVpcmVzX0lFRUVfNzU0CisgICAgZGVmIHRlc3RfZm9ybWF0X3Rlc3RmaWxlKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4oZm9ybWF0X3Rlc3RmaWxlKSBhcyB0ZXN0ZmlsZToKKyAgICAgICAgICAgIGZvciBsaW5lIGluIG9wZW4oZm9ybWF0X3Rlc3RmaWxlKToKKyAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJy0tJyk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgbGhzLCByaHMgPSBtYXAoc3RyLnN0cmlwLCBsaW5lLnNwbGl0KCctPicpKQorICAgICAgICAgICAgICAgIGZtdCwgYXJnID0gbGhzLnNwbGl0KCkKKyAgICAgICAgICAgICAgICBhcmcgPSBmbG9hdChhcmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQgJSBhcmcsIHJocykKKyAgICAgICAgICAgICAgICBpZiBub3QgbWF0aC5pc25hbihhcmcpIGFuZCBjb3B5c2lnbigxLjAsIGFyZykgPiAwLjA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10ICUgLWFyZywgJy0nICsgcmhzKQorCisgICAgZGVmIHRlc3RfaXNzdWU1ODY0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxMjMuNDU2LCAnLjQnKSwgJzEyMy41JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMTIzNC41NiwgJy40JyksICcxLjIzNWUrMDMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxMjM0NS42LCAnLjQnKSwgJzEuMjM1ZSswNCcpCisKK2NsYXNzIFJlcHJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgZmxvYXRzX2ZpbGUgPSBvcGVuKG9zLnBhdGguam9pbihvcy5wYXRoLnNwbGl0KF9fZmlsZV9fKVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdmbG9hdGluZ19wb2ludHMudHh0JykpCisgICAgICAgIGZvciBsaW5lIGluIGZsb2F0c19maWxlOgorICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgaWYgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKCcjJyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHYgPSBldmFsKGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIGV2YWwocmVwcih2KSkpCisgICAgICAgIGZsb2F0c19maWxlLmNsb3NlKCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGdldGF0dHIoc3lzLCAnZmxvYXRfcmVwcl9zdHlsZScsICcnKSA9PSAnc2hvcnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWVzIG9ubHkgd2hlbiB1c2luZyBzaG9ydCBmbG9hdCByZXByIHN0eWxlIikKKyAgICBkZWYgdGVzdF9zaG9ydF9yZXByKHNlbGYpOgorICAgICAgICAjIHRlc3Qgc2hvcnQgZmxvYXQgcmVwciBpbnRyb2R1Y2VkIGluIFB5dGhvbiAzLjEuICBPbmUgYXNwZWN0CisgICAgICAgICMgb2YgdGhpcyByZXByIGlzIHRoYXQgd2UgZ2V0IHNvbWUgZGVncmVlIG9mIHN0ciAtPiBmbG9hdCAtPgorICAgICAgICAjIHN0ciByb3VuZHRyaXBwaW5nLiAgSW4gcGFydGljdWxhciwgZm9yIGFueSBudW1lcmljIHN0cmluZworICAgICAgICAjIGNvbnRhaW5pbmcgMTUgb3IgZmV3ZXIgc2lnbmlmaWNhbnQgZGlnaXRzLCB0aG9zZSBleGFjdCBzYW1lCisgICAgICAgICMgZGlnaXRzIChtb2R1bG8gdHJhaWxpbmcgemVyb3MpIHNob3VsZCBhcHBlYXIgaW4gdGhlIG91dHB1dC4KKyAgICAgICAgIyBObyBtb3JlIHJlcHIoMC4wMykgLT4gIjAuMDI5OTk5OTk5OTk5OTk5OTk5IiEKKworICAgICAgICB0ZXN0X3N0cmluZ3MgPSBbCisgICAgICAgICAgICAjIG91dHB1dCBhbHdheXMgaW5jbHVkZXMgKmVpdGhlciogYSBkZWNpbWFsIHBvaW50IGFuZCBhdAorICAgICAgICAgICAgIyBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgdGhhdCBwb2ludCwgb3IgYW4gZXhwb25lbnQuCisgICAgICAgICAgICAnMC4wJywKKyAgICAgICAgICAgICcxLjAnLAorICAgICAgICAgICAgJzAuMDEnLAorICAgICAgICAgICAgJzAuMDInLAorICAgICAgICAgICAgJzAuMDMnLAorICAgICAgICAgICAgJzAuMDQnLAorICAgICAgICAgICAgJzAuMDUnLAorICAgICAgICAgICAgJzEuMjM0NTY3ODknLAorICAgICAgICAgICAgJzEwLjAnLAorICAgICAgICAgICAgJzEwMC4wJywKKyAgICAgICAgICAgICMgdmFsdWVzID49IDFlMTYgZ2V0IGFuIGV4cG9uZW50Li4uCisgICAgICAgICAgICAnMTAwMDAwMDAwMDAwMDAwMC4wJywKKyAgICAgICAgICAgICc5OTk5OTk5OTk5OTk5OTkwLjAnLAorICAgICAgICAgICAgJzFlKzE2JywKKyAgICAgICAgICAgICcxZSsxNycsCisgICAgICAgICAgICAjIC4uLiBhbmQgc28gZG8gdmFsdWVzIDwgMWUtNAorICAgICAgICAgICAgJzAuMDAxJywKKyAgICAgICAgICAgICcwLjAwMTAwMScsCisgICAgICAgICAgICAnMC4wMDAxMDAwMDAwMDAwMDAwMScsCisgICAgICAgICAgICAnMC4wMDAxJywKKyAgICAgICAgICAgICc5Ljk5OTk5OTk5OTk5OWUtMDUnLAorICAgICAgICAgICAgJzFlLTA1JywKKyAgICAgICAgICAgICMgdmFsdWVzIGRlc2lnbmVkIHRvIHByb3Zva2UgZmFpbHVyZSBpZiB0aGUgRlBVIHJvdW5kaW5nCisgICAgICAgICAgICAjIHByZWNpc2lvbiBpc24ndCBzZXQgY29ycmVjdGx5CisgICAgICAgICAgICAnOC43MjI5Mzc3MTExMDM2MWUrMjUnLAorICAgICAgICAgICAgJzcuNDcwMDUzMDczNDIzMTNlKzI2JywKKyAgICAgICAgICAgICcyLjg2NDM4MDAwNDM5Njk4ZSsyOCcsCisgICAgICAgICAgICAnOC44OTE0MjkwNTI0NjE3OWUrMjgnLAorICAgICAgICAgICAgJzMuMDg1NzgwODcwNzkyMzJlKzM1JywKKyAgICAgICAgICAgIF0KKworICAgICAgICBmb3IgcyBpbiB0ZXN0X3N0cmluZ3M6CisgICAgICAgICAgICBuZWdzID0gJy0nK3MKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgcmVwcihmbG9hdChzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5lZ3MsIHJlcHIoZmxvYXQobmVncykpKQorCisKK0ByZXF1aXJlc19JRUVFXzc1NAorY2xhc3MgUm91bmRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc2Vjb25kX2FyZ3VtZW50X3R5cGUoc2VsZik6CisgICAgICAgICMgYW55IHR5cGUgd2l0aCBhbiBfX2luZGV4X18gbWV0aG9kIHNob3VsZCBiZSBwZXJtaXR0ZWQgYXMKKyAgICAgICAgIyBhIHNlY29uZCBhcmd1bWVudAorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKDEyLjM0LCBUcnVlKSwgMTIuMykKKworICAgICAgICBjbGFzcyBNeUluZGV4KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbmRleF9fKHNlbGYpOiByZXR1cm4gNAorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKC0wLjEyMzQ1NiwgTXlJbmRleCgpKSwgLTAuMTIzNSkKKyAgICAgICAgIyBidXQgZmxvYXRzIHNob3VsZCBiZSBpbGxlZ2FsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcm91bmQsIDMuMTQxNTksIDIuMCkKKworICAgIGRlZiB0ZXN0X2luZl9uYW4oc2VsZik6CisgICAgICAgICMgcm91bmRpbmcgYW4gaW5maW5pdHkgb3IgbmFuIHJldHVybnMgdGhlIHNhbWUgbnVtYmVyOworICAgICAgICAjIChpbiBweTNrLCByb3VuZGluZyBhbiBpbmZpbml0eSBvciBuYW4gcmFpc2VzIGFuIGVycm9yLAorICAgICAgICAjICBzaW5jZSB0aGUgcmVzdWx0IGNhbid0IGJlIHJlcHJlc2VudGVkIGFzIGEgbG9uZykuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC1JTkYpLCAtSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihyb3VuZChOQU4pKSkKKyAgICAgICAgZm9yIG4gaW4gcmFuZ2UoLTUsIDUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZChJTkYsIG4pLCBJTkYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC1JTkYsIG4pLCAtSU5GKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4ocm91bmQoTkFOLCBuKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByb3VuZCwgSU5GLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcm91bmQsIC1JTkYsIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByb3VuZCwgTkFOLCAiY2VjaSBuJ2VzdCBwYXMgdW4gaW50ZWdlciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcm91bmQsIC0wLjAsIDFqKQorCisgICAgZGVmIHRlc3RfbGFyZ2VfbihzZWxmKToKKyAgICAgICAgZm9yIG4gaW4gWzMyNCwgMzI1LCA0MDAsIDIqKjMxLTEsIDIqKjMxLCAyKiozMiwgMioqMTAwXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMTIzLjQ1NiwgbiksIDEyMy40NTYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC0xMjMuNDU2LCBuKSwgLTEyMy40NTYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDFlMzAwLCBuKSwgMWUzMDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDFlLTMyMCwgbiksIDFlLTMyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxZTE1MCwgMzAwKSwgMWUxNTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMWUzMDAsIDMwNyksIDFlMzAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC0zLjE0MTUsIDMwOCksIC0zLjE0MTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMWUxNTAsIDMwOSksIDFlMTUwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDEuNGUtMzE1LCAzMTUpLCAxZS0zMTUpCisKKyAgICBkZWYgdGVzdF9zbWFsbF9uKHNlbGYpOgorICAgICAgICBmb3IgbiBpbiBbLTMwOCwgLTMwOSwgLTQwMCwgMS0yKiozMSwgLTIqKjMxLCAtMioqMzEtMSwgLTIqKjEwMF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDEyMy40NTYsIG4pLCAwLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC0xMjMuNDU2LCBuKSwgLTAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMWUzMDAsIG4pLCAwLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDFlLTMyMCwgbiksIDAuMCkKKworICAgIGRlZiB0ZXN0X292ZXJmbG93KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCByb3VuZCwgMS42ZTMwOCwgLTMwOCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcm91bmQsIC0xLjdlMzA4LCAtMzA4KQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZ2V0YXR0cihzeXMsICdmbG9hdF9yZXByX3N0eWxlJywgJycpID09ICdzaG9ydCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgYXBwbGllcyBvbmx5IHdoZW4gdXNpbmcgc2hvcnQgZmxvYXQgcmVwciBzdHlsZSIpCisgICAgZGVmIHRlc3RfcHJldmlvdXNfcm91bmRfYnVncyhzZWxmKToKKyAgICAgICAgIyBwYXJ0aWN1bGFyIGNhc2VzIHRoYXQgaGF2ZSBvY2N1cnJlZCBpbiBidWcgcmVwb3J0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDU2Mjk0OTk1MzQyMTMxMi41LCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgNTYyOTQ5OTUzNDIxMzEyLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNTYyOTQ5OTUzNDIxMzEuNSwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgNTYyOTQ5OTUzNDIxMzEuNSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGdldGF0dHIoc3lzLCAnZmxvYXRfcmVwcl9zdHlsZScsICcnKSA9PSAnc2hvcnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IGFwcGxpZXMgb25seSB3aGVuIHVzaW5nIHNob3J0IGZsb2F0IHJlcHIgc3R5bGUiKQorICAgIGRlZiB0ZXN0X2hhbGZ3YXlfY2FzZXMoc2VsZik6CisgICAgICAgICMgSGFsZndheSBjYXNlcyBuZWVkIHNwZWNpYWwgYXR0ZW50aW9uLCBzaW5jZSB0aGUgY3VycmVudAorICAgICAgICAjIGltcGxlbWVudGF0aW9uIGhhcyB0byBkZWFsIHdpdGggdGhlbSBzcGVjaWFsbHkuICBOb3RlIHRoYXQKKyAgICAgICAgIyAyLnggcm91bmRzIGhhbGZ3YXkgdmFsdWVzIHVwIChpLmUuLCBhd2F5IGZyb20gemVybykgd2hpbGUKKyAgICAgICAgIyAzLnggZG9lcyByb3VuZC1oYWxmLXRvLWV2ZW4uCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoMC4xMjUsIDIpLCAwLjEzKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKDAuMzc1LCAyKSwgMC4zOCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgwLjYyNSwgMiksIDAuNjMpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoMC44NzUsIDIpLCAwLjg4KQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKC0wLjEyNSwgMiksIC0wLjEzKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKC0wLjM3NSwgMiksIC0wLjM4KQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKC0wLjYyNSwgMiksIC0wLjYzKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKC0wLjg3NSwgMiksIC0wLjg4KQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoMC4yNSwgMSksIDAuMykKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgwLjc1LCAxKSwgMC44KQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKC0wLjI1LCAxKSwgLTAuMykKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgtMC43NSwgMSksIC0wLjgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtNi41LCAwKSwgLTcuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtNS41LCAwKSwgLTYuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtMS41LCAwKSwgLTIuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtMC41LCAwKSwgLTEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgwLjUsIDApLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMS41LCAwKSwgMi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDIuNSwgMCksIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgzLjUsIDApLCA0LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNC41LCAwKSwgNS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDUuNSwgMCksIDYuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg2LjUsIDApLCA3LjApCisKKyAgICAgICAgIyBzYW1lIGJ1dCB3aXRob3V0IGFuIGV4cGxpY2l0IHNlY29uZCBhcmd1bWVudDsgaW4gMy54IHRoZXNlCisgICAgICAgICMgd2lsbCBnaXZlIGludGVnZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTYuNSksIC03LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTUuNSksIC02LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTEuNSksIC0yLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTAuNSksIC0xLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMC41KSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDEuNSksIDIuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgyLjUpLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMy41KSwgNC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDQuNSksIDUuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg1LjUpLCA2LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNi41KSwgNy4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTI1LjAsIC0xKSwgLTMwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTE1LjAsIC0xKSwgLTIwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTUuMCwgLTEpLCAtMTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg1LjAsIC0xKSwgMTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxNS4wLCAtMSksIDIwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMjUuMCwgLTEpLCAzMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDM1LjAsIC0xKSwgNDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg0NS4wLCAtMSksIDUwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNTUuMCwgLTEpLCA2MC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDY1LjAsIC0xKSwgNzAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg3NS4wLCAtMSksIDgwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoODUuMCwgLTEpLCA5MC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDk1LjAsIC0xKSwgMTAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMTIzMjUuMCwgLTEpLCAxMjMzMC4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMzUwLjAsIC0yKSwgNDAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNDUwLjAsIC0yKSwgNTAwLjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgwLjVlMjEsIC0yMSksIDFlMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoMS41ZTIxLCAtMjEpLCAyZTIxKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKDIuNWUyMSwgLTIxKSwgM2UyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCg1LjVlMjEsIC0yMSksIDZlMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoOC41ZTIxLCAtMjEpLCA5ZTIxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoLTEuNWUyMiwgLTIyKSwgLTJlMjIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoLTAuNWUyMiwgLTIyKSwgLTFlMjIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoMC41ZTIyLCAtMjIpLCAxZTIyKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKDEuNWUyMiwgLTIyKSwgMmUyMikKKworCisgICAgQHJlcXVpcmVzX0lFRUVfNzU0CisgICAgZGVmIHRlc3RfZm9ybWF0X3NwZWNpYWxzKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9ybWF0dGluZyBvZiBuYW5zIGFuZCBpbmZzLgorCisgICAgICAgIGRlZiB0ZXN0KGZtdCwgdmFsdWUsIGV4cGVjdGVkKToKKyAgICAgICAgICAgICMgVGVzdCB3aXRoIGJvdGggJSBhbmQgZm9ybWF0KCkuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdCAlIHZhbHVlLCBleHBlY3RlZCwgZm10KQorICAgICAgICAgICAgaWYgbm90ICcjJyBpbiBmbXQ6CisgICAgICAgICAgICAgICAgIyBVbnRpbCBpc3N1ZSA3MDk0IGlzIGltcGxlbWVudGVkLCBmb3JtYXQoKSBmb3IgZmxvYXRzIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAjICBzdXBwb3J0ICcjJyBmb3JtYXR0aW5nCisgICAgICAgICAgICAgICAgZm10ID0gZm10WzE6XSAjIHN0cmlwIG9mZiB0aGUgJQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHZhbHVlLCBmbXQpLCBleHBlY3RlZCwgZm10KQorCisgICAgICAgIGZvciBmbXQgaW4gWyclZScsICclZicsICclZycsICclLjBlJywgJyUuNmYnLCAnJS4yMGcnLAorICAgICAgICAgICAgICAgICAgICAnJSNlJywgJyUjZicsICclI2cnLCAnJSMuMjBlJywgJyUjLjE1ZicsICclIy4zZyddOgorICAgICAgICAgICAgcGZtdCA9ICclKycgKyBmbXRbMTpdCisgICAgICAgICAgICBzZm10ID0gJyUgJyArIGZtdFsxOl0KKyAgICAgICAgICAgIHRlc3QoZm10LCBJTkYsICdpbmYnKQorICAgICAgICAgICAgdGVzdChmbXQsIC1JTkYsICctaW5mJykKKyAgICAgICAgICAgIHRlc3QoZm10LCBOQU4sICduYW4nKQorICAgICAgICAgICAgdGVzdChmbXQsIC1OQU4sICduYW4nKQorICAgICAgICAgICAgIyBXaGVuIGFza2luZyBmb3IgYSBzaWduLCBpdCdzIGFsd2F5cyBwcm92aWRlZC4gbmFucyBhcmUKKyAgICAgICAgICAgICMgIGFsd2F5cyBwb3NpdGl2ZS4KKyAgICAgICAgICAgIHRlc3QocGZtdCwgSU5GLCAnK2luZicpCisgICAgICAgICAgICB0ZXN0KHBmbXQsIC1JTkYsICctaW5mJykKKyAgICAgICAgICAgIHRlc3QocGZtdCwgTkFOLCAnK25hbicpCisgICAgICAgICAgICB0ZXN0KHBmbXQsIC1OQU4sICcrbmFuJykKKyAgICAgICAgICAgICMgV2hlbiB1c2luZyAnICcgZm9yIGEgc2lnbiBjb2RlLCBvbmx5IGluZnMgY2FuIGJlIG5lZ2F0aXZlLgorICAgICAgICAgICAgIyAgT3RoZXJzIGhhdmUgYSBzcGFjZS4KKyAgICAgICAgICAgIHRlc3Qoc2ZtdCwgSU5GLCAnIGluZicpCisgICAgICAgICAgICB0ZXN0KHNmbXQsIC1JTkYsICctaW5mJykKKyAgICAgICAgICAgIHRlc3Qoc2ZtdCwgTkFOLCAnIG5hbicpCisgICAgICAgICAgICB0ZXN0KHNmbXQsIC1OQU4sICcgbmFuJykKKworCisjIEJlZ2lubmluZyB3aXRoIFB5dGhvbiAyLjYgZmxvYXQgaGFzIGNyb3NzIHBsYXRmb3JtIGNvbXBhdGlibGUKKyMgd2F5cyB0byBjcmVhdGUgYW5kIHJlcHJlc2VudCBpbmYgYW5kIG5hbgorY2xhc3MgSW5mTmFuVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfaW5mX2Zyb21fc3RyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYoZmxvYXQoImluZiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKGZsb2F0KCIraW5mIikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYoZmxvYXQoIi1pbmYiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihmbG9hdCgiaW5maW5pdHkiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihmbG9hdCgiK2luZmluaXR5IikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYoZmxvYXQoIi1pbmZpbml0eSIpKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoImluZiIpKSwgImluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiK2luZiIpKSwgImluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiLWluZiIpKSwgIi1pbmYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoImluZmluaXR5IikpLCAiaW5mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCIraW5maW5pdHkiKSksICJpbmYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoIi1pbmZpbml0eSIpKSwgIi1pbmYiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiSU5GIikpLCAiaW5mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCIrSW5mIikpLCAiaW5mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCItaU5GIikpLCAiLWluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiSW5maW5pdHkiKSksICJpbmYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoIitpTmZJbkl0WSIpKSwgImluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiLUlORklOSVRZIikpLCAiLWluZiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZmxvYXQoImluZiIpKSwgImluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGZsb2F0KCIraW5mIikpLCAiaW5mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZmxvYXQoIi1pbmYiKSksICItaW5mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZmxvYXQoImluZmluaXR5IikpLCAiaW5mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZmxvYXQoIitpbmZpbml0eSIpKSwgImluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGZsb2F0KCItaW5maW5pdHkiKSksICItaW5mIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgImluZm8iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIitpbmZvIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICItaW5mbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiaW4iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIitpbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiLWluIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICJpbmZpbml0IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIrSW5maW4iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIi1JTkZJIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICJpbmZpbml0eXMiKQorCisgICAgZGVmIHRlc3RfaW5mX2FzX3N0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKDFlMzAwICogMWUzMDApLCAiaW5mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKC0xZTMwMCAqIDFlMzAwKSwgIi1pbmYiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKDFlMzAwICogMWUzMDApLCAiaW5mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoLTFlMzAwICogMWUzMDApLCAiLWluZiIpCisKKyAgICBkZWYgdGVzdF9uYW5fZnJvbV9zdHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihmbG9hdCgibmFuIikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZmxvYXQoIituYW4iKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihmbG9hdCgiLW5hbiIpKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoIm5hbiIpKSwgIm5hbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiK25hbiIpKSwgIm5hbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiLW5hbiIpKSwgIm5hbiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCJOQU4iKSksICJuYW4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoIitOQW4iKSksICJuYW4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoIi1OYU4iKSksICJuYW4iKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGZsb2F0KCJuYW4iKSksICJuYW4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihmbG9hdCgiK25hbiIpKSwgIm5hbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGZsb2F0KCItbmFuIikpLCAibmFuIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIm5hbmEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIituYW5hIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICItbmFuYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAibmEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIituYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiLW5hIikKKworICAgIGRlZiB0ZXN0X25hbl9hc19zdHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcigxZTMwMCAqIDFlMzAwICogMCksICJuYW4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoLTFlMzAwICogMWUzMDAgKiAwKSwgIm5hbiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoMWUzMDAgKiAxZTMwMCAqIDApLCAibmFuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoLTFlMzAwICogMWUzMDAgKiAwKSwgIm5hbiIpCisKKyAgICBkZWYgbm90ZXN0X2Zsb2F0X25hbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKE5BTi5pc19uYW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShJTkYuaXNfbmFuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoKDAuKS5pc19uYW4oKSkKKworICAgIGRlZiBub3Rlc3RfZmxvYXRfaW5mKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoSU5GLmlzX2luZigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKE5BTi5pc19pbmYoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgoMC4pLmlzX2luZigpKQorCisgICAgZGVmIHRlc3RfaGFzaF9pbmYoc2VsZik6CisgICAgICAgICMgdGhlIGFjdHVhbCB2YWx1ZXMgaGVyZSBzaG91bGQgYmUgcmVnYXJkZWQgYXMgYW4KKyAgICAgICAgIyBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIGJ1dCB0aGV5IG5lZWQgdG8gYmUKKyAgICAgICAgIyBpZGVudGljYWwgdG8gdGhvc2UgdXNlZCBpbiB0aGUgRGVjaW1hbCBtb2R1bGUuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChmbG9hdCgnaW5mJykpLCAzMTQxNTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChmbG9hdCgnLWluZicpKSwgLTI3MTgyOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGZsb2F0KCduYW4nKSksIDApCisKKworZnJvbUhleCA9IGZsb2F0LmZyb21oZXgKK3RvSGV4ID0gZmxvYXQuaGV4CitjbGFzcyBIZXhGbG9hdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBNQVggPSBmcm9tSGV4KCcweC5mZmZmZmZmZmZmZmZmOHArMTAyNCcpICAjIG1heCBub3JtYWwKKyAgICBNSU4gPSBmcm9tSGV4KCcweDFwLTEwMjInKSAgICAgICAgICAgICAgICAjIG1pbiBub3JtYWwKKyAgICBUSU5ZID0gZnJvbUhleCgnMHgwLjAwMDAwMDAwMDAwMDFwLTEwMjInKSAjIG1pbiBzdWJub3JtYWwKKyAgICBFUFMgPSBmcm9tSGV4KCcweDAuMDAwMDAwMDAwMDAwMXAwJykgIyBkaWZmIGJldHdlZW4gMS4wIGFuZCBuZXh0IGZsb2F0IHVwCisKKyAgICBkZWYgaWRlbnRpY2FsKHNlbGYsIHgsIHkpOgorICAgICAgICAjIGNoZWNrIHRoYXQgZmxvYXRzIHggYW5kIHkgYXJlIGlkZW50aWNhbCwgb3IgdGhhdCBib3RoCisgICAgICAgICMgYXJlIE5hTnMKKyAgICAgICAgaWYgaXNuYW4oeCkgb3IgaXNuYW4oeSk6CisgICAgICAgICAgICBpZiBpc25hbih4KSA9PSBpc25hbih5KToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxpZiB4ID09IHkgYW5kICh4ICE9IDAuMCBvciBjb3B5c2lnbigxLjAsIHgpID09IGNvcHlzaWduKDEuMCwgeSkpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZmFpbCgnJXIgbm90IGlkZW50aWNhbCB0byAlcicgJSAoeCwgeSkpCisKKyAgICBkZWYgdGVzdF9lbmRzKHNlbGYpOgorICAgICAgICBzZWxmLmlkZW50aWNhbChzZWxmLk1JTiwgbGRleHAoMS4wLCAtMTAyMikpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKHNlbGYuVElOWSwgbGRleHAoMS4wLCAtMTA3NCkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKHNlbGYuRVBTLCBsZGV4cCgxLjAsIC01MikpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKHNlbGYuTUFYLCAyLioobGRleHAoMS4wLCAxMDIzKSAtIGxkZXhwKDEuMCwgOTcwKSkpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2lucHV0cyhzZWxmKToKKyAgICAgICAgaW52YWxpZF9pbnB1dHMgPSBbCisgICAgICAgICAgICAnaW5maScsICAgIyBtaXNzcGVsdCBpbmZpbml0aWVzIGFuZCBuYW5zCisgICAgICAgICAgICAnLUluZmluaXQnLAorICAgICAgICAgICAgJysraW5mJywKKyAgICAgICAgICAgICctK0luZicsCisgICAgICAgICAgICAnLS1uYW4nLAorICAgICAgICAgICAgJystTmFOJywKKyAgICAgICAgICAgICdzbmFuJywKKyAgICAgICAgICAgICdOYU5zJywKKyAgICAgICAgICAgICdubmEnLAorICAgICAgICAgICAgJ2FuJywKKyAgICAgICAgICAgICduZicsCisgICAgICAgICAgICAnbmZpbml0eScsCisgICAgICAgICAgICAnaW5pdHknLAorICAgICAgICAgICAgJ2lpbml0eScsCisgICAgICAgICAgICAnMHhuYW4nLAorICAgICAgICAgICAgJycsCisgICAgICAgICAgICAnICcsCisgICAgICAgICAgICAneDEuMHAwJywKKyAgICAgICAgICAgICcweFgxLjBwMCcsCisgICAgICAgICAgICAnKyAweDEuMHAwJywgIyBpbnRlcm5hbCB3aGl0ZXNwYWNlCisgICAgICAgICAgICAnLSAweDEuMHAwJywKKyAgICAgICAgICAgICcwIHgxLjBwMCcsCisgICAgICAgICAgICAnMHggMS4wcDAnLAorICAgICAgICAgICAgJzB4MSAyLjBwMCcsCisgICAgICAgICAgICAnKzB4MSAuMHAwJywKKyAgICAgICAgICAgICcweDEuIDBwMCcsCisgICAgICAgICAgICAnLTB4MS4wIDFwMCcsCisgICAgICAgICAgICAnLTB4MS4wIHAwJywKKyAgICAgICAgICAgICcrMHgxLjBwICswJywKKyAgICAgICAgICAgICcweDEuMHAgLTAnLAorICAgICAgICAgICAgJzB4MS4wcCAwJywKKyAgICAgICAgICAgICcrMHgxLjBwKyAwJywKKyAgICAgICAgICAgICctMHgxLjBwLSAwJywKKyAgICAgICAgICAgICcrKzB4MS4wcC0wJywgIyBkb3VibGUgc2lnbnMKKyAgICAgICAgICAgICctLTB4MS4wcDAnLAorICAgICAgICAgICAgJystMHgxLjBwKzAnLAorICAgICAgICAgICAgJy0rMHgxLjBwMCcsCisgICAgICAgICAgICAnMHgxLjBwKyswJywKKyAgICAgICAgICAgICcrMHgxLjBwKy0wJywKKyAgICAgICAgICAgICctMHgxLjBwLSswJywKKyAgICAgICAgICAgICcweDEuMHAtLTAnLAorICAgICAgICAgICAgJzB4MS4wLnAwJywKKyAgICAgICAgICAgICcweC5wMCcsICMgbm8gaGV4IGRpZ2l0cyBiZWZvcmUgb3IgYWZ0ZXIgcG9pbnQKKyAgICAgICAgICAgICcweDEscDAnLCAjIHdyb25nIGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyCisgICAgICAgICAgICAnMHgxcGEnLAorICAgICAgICAgICAgdScweDFwXHVmZjEwJywgICMgZnVsbHdpZHRoIFVuaWNvZGUgZGlnaXRzCisgICAgICAgICAgICB1J1x1ZmYxMHgxcDAnLAorICAgICAgICAgICAgdScweFx1ZmYxMXAwJywKKyAgICAgICAgICAgIHUnMHgxLlx1ZmYxMHAwJywKKyAgICAgICAgICAgICcweDFwMCBcbiAweDJwMCcsCisgICAgICAgICAgICAnMHgxcDBcMCAweDFwMCcsICAjIGVtYmVkZGVkIG51bGwgYnl0ZSBpcyBub3QgZW5kIG9mIHN0cmluZworICAgICAgICAgICAgXQorICAgICAgICBmb3IgeCBpbiBpbnZhbGlkX2lucHV0czoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmcm9tSGV4KHgpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnRXhwZWN0ZWQgZmxvYXQuZnJvbWhleCglcikgdG8gcmFpc2UgVmFsdWVFcnJvcjsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnZ290ICVyIGluc3RlYWQnICUgKHgsIHJlc3VsdCkpCisKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgIHZhbHVlX3BhaXJzID0gWworICAgICAgICAgICAgKCdpbmYnLCBJTkYpLAorICAgICAgICAgICAgKCctSW5maW5pdHknLCAtSU5GKSwKKyAgICAgICAgICAgICgnbmFuJywgTkFOKSwKKyAgICAgICAgICAgICgnMS4wJywgMS4wKSwKKyAgICAgICAgICAgICgnLTB4LjInLCAtMC4xMjUpLAorICAgICAgICAgICAgKCctMC4wJywgLTAuMCkKKyAgICAgICAgICAgIF0KKyAgICAgICAgd2hpdGVzcGFjZSA9IFsKKyAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJyAnLAorICAgICAgICAgICAgJ1x0JywKKyAgICAgICAgICAgICdcbicsCisgICAgICAgICAgICAnXG4gXHQnLAorICAgICAgICAgICAgJ1xmJywKKyAgICAgICAgICAgICdcdicsCisgICAgICAgICAgICAnXHInCisgICAgICAgICAgICBdCisgICAgICAgIGZvciBpbnAsIGV4cGVjdGVkIGluIHZhbHVlX3BhaXJzOgorICAgICAgICAgICAgZm9yIGxlYWQgaW4gd2hpdGVzcGFjZToKKyAgICAgICAgICAgICAgICBmb3IgdHJhaWwgaW4gd2hpdGVzcGFjZToKKyAgICAgICAgICAgICAgICAgICAgZ290ID0gZnJvbUhleChsZWFkICsgaW5wICsgdHJhaWwpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaWRlbnRpY2FsKGdvdCwgZXhwZWN0ZWQpCisKKworICAgIGRlZiB0ZXN0X2Zyb21faGV4KHNlbGYpOgorICAgICAgICBNSU4gPSBzZWxmLk1JTjsKKyAgICAgICAgTUFYID0gc2VsZi5NQVg7CisgICAgICAgIFRJTlkgPSBzZWxmLlRJTlk7CisgICAgICAgIEVQUyA9IHNlbGYuRVBTOworCisgICAgICAgICMgdHdvIHNwZWxsaW5ncyBvZiBpbmZpbml0eSwgd2l0aCBvcHRpb25hbCBzaWduczsgY2FzZS1pbnNlbnNpdGl2ZQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCdpbmYnKSwgSU5GKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcrSW5mJyksIElORikKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLUlORicpLCAtSU5GKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCdpTmYnKSwgSU5GKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCdJbmZpbml0eScpLCBJTkYpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJytJTkZJTklUWScpLCBJTkYpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy1pbmZpbml0eScpLCAtSU5GKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctaU5GaU5pdFknKSwgLUlORikKKworICAgICAgICAjIG5hbnMgd2l0aCBvcHRpb25hbCBzaWduOyBjYXNlIGluc2Vuc2l0aXZlCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJ25hbicpLCBOQU4pCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJytOYU4nKSwgTkFOKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctTmFOJyksIE5BTikKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLW5BTicpLCBOQU4pCisKKyAgICAgICAgIyB2YXJpYXRpb25zIGluIGlucHV0IGZvcm1hdAorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcxJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnKzEnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcxLicpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzEuMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzEuMHAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMDEnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwMS4nKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcrMHgxLjAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDFwMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMXAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxUDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDFQMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS5wMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wcDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweC4xcDQnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweC4xcDA0JyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHguMXAwMDQnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDFwKzAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDFQLTAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcrMHgxcDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAxcDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDFwMDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KHUnMHgxcDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcgMHgxcDAgJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnXG4gMHgxcDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDFwMCBcdCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4YXAwJyksIDEwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4QXAwJyksIDEwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4YVAwJyksIDEwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4QVAwJyksIDEwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4YmVwMCcpLCAxOTAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHhCZXAwJyksIDE5MC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweGJFcDAnKSwgMTkwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYQkUwUC00JyksIDE5MC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweEJFcDAnKSwgMTkwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4Qi5FcDQnKSwgMTkwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4LkJFcDgnKSwgMTkwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4LjBCRXAxMicpLCAxOTAuMCkKKworICAgICAgICAjIG1vdmluZyB0aGUgcG9pbnQgYXJvdW5kCisgICAgICAgIHBpID0gZnJvbUhleCgnMHgxLjkyMWZiNTQ0NDJkMThwMScpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4LjAwNjQ4N2VkNTExMGI0NnAxMScpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHguMDBjOTBmZGFhMjIxNjhjcDEwJyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweC4wMTkyMWZiNTQ0NDJkMThwOScpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHguMDMyNDNmNmE4ODg1YTNwOCcpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHguMDY0ODdlZDUxMTBiNDZwNycpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHguMGM5MGZkYWEyMjE2OGNwNicpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHguMTkyMWZiNTQ0NDJkMThwNScpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHguMzI0M2Y2YTg4ODVhM3A0JyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweC42NDg3ZWQ1MTEwYjQ2cDMnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4LmM5MGZkYWEyMjE2OGNwMicpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjkyMWZiNTQ0NDJkMThwMScpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgzLjI0M2Y2YTg4ODVhM3AwJyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDYuNDg3ZWQ1MTEwYjQ2cC0xJyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweGMuOTBmZGFhMjIxNjhjcC0yJyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDE5LjIxZmI1NDQ0MmQxOHAtMycpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgzMi40M2Y2YTg4ODVhM3AtNCcpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHg2NC44N2VkNTExMGI0NnAtNScpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHhjOS4wZmRhYTIyMTY4Y3AtNicpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxOTIuMWZiNTQ0NDJkMThwLTcnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MzI0LjNmNmE4ODg1YTNwLTgnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4NjQ4LjdlZDUxMTBiNDZwLTknKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4YzkwLmZkYWEyMjE2OGNwLTEwJyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDE5MjEuZmI1NDQ0MmQxOHAtMTEnKSwgcGkpCisgICAgICAgICMgLi4uCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MTkyMWZiNTQ0NDJkMS44cC00NycpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgzMjQzZjZhODg4NWEzcC00OCcpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHg2NDg3ZWQ1MTEwYjQ2cC00OScpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHhjOTBmZGFhMjIxNjhjcC01MCcpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxOTIxZmI1NDQ0MmQxOHAtNTEnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MzI0M2Y2YTg4ODVhMzBwLTUyJyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDY0ODdlZDUxMTBiNDYwcC01MycpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHhjOTBmZGFhMjIxNjhjMHAtNTQnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MTkyMWZiNTQ0NDJkMTgwcC01NScpLCBwaSkKKworCisgICAgICAgICMgcmVzdWx0cyB0aGF0IHNob3VsZCBvdmVyZmxvdy4uLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmcm9tSGV4LCAnLTB4MXAxMDI0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJzB4MXArMTAyNScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICcrMFgxcDEwMzAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmcm9tSGV4LCAnLTB4MXArMTEwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICcwWDFwMTIzNDU2Nzg5MTIzNDU2Nzg5JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJyswWC44cCsxMDI1JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJysweDAuOHAxMDI1JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJy0weDAuNHAxMDI2JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJzBYMnArMTAyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICcweDIucDEwMjMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmcm9tSGV4LCAnLTB4Mi4wcCsxMDIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJyswWDRwKzEwMjInKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmcm9tSGV4LCAnMHgxLmZmZmZmZmZmZmZmZmZmcCsxMDIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJy0wWDEuZmZmZmZmZmZmZmZmZjlwMTAyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICcwWDEuZmZmZmZmZmZmZmZmZjhwMTAyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICcrMHgzLmZmZmZmZmZmZmZmZmZwMTAyMicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICcweDNmZmZmZmZmZmZmZmZmcCs5NzAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmcm9tSGV4LCAnMHgxMDAwMDAwMDAwMDAwMDAwMHA5NjAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmcm9tSGV4LCAnLTBYZmZmZmZmZmZmZmZmZmZmZnA5NjAnKQorCisgICAgICAgICMgLi4uYW5kIHRob3NlIHRoYXQgcm91bmQgdG8gKy1tYXggZmxvYXQKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnKzB4MS5mZmZmZmZmZmZmZmZmcCsxMDIzJyksIE1BWCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTBYMS5mZmZmZmZmZmZmZmZmN3AxMDIzJyksIC1NQVgpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMS5mZmZmZmZmZmZmZmZmN2ZmZmZmZmZmZmZmZmZwMTAyMycpLCBNQVgpCisKKyAgICAgICAgIyB6ZXJvcworICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDBwMCcpLCAwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MHAxMDAwJyksIDAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTB4MHAxMDIzJyksIC0wLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMHAxMDI0JyksIDAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTB4MHAxMDI1JyksIC0wLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMHAyMDAwJyksIDAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwcDEyMzQ1Njc4OTEyMzQ1Njc4OScpLCAwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0wWDBwLTAnKSwgLTAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTBYMHAtMTAwMCcpLCAtMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDBwLTEwMjMnKSwgMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMFgwcC0xMDI0JyksIC0wLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0weDBwLTEwMjUnKSwgLTAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTB4MHAtMTA3MicpLCAtMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDBwLTEwNzMnKSwgMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMHgwcC0xMDc0JyksIC0wLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MHAtMTA3NScpLCAwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMHAtMTA3NicpLCAwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0wWDBwLTIwMDAnKSwgLTAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTB4MHAtMTIzNDU2Nzg5MTIzNDU2Nzg5JyksIC0wLjApCisKKyAgICAgICAgIyB2YWx1ZXMgdGhhdCBzaG91bGQgdW5kZXJmbG93IHRvIDAKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxcC0xMDc1JyksIDAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTBYMXAtMTA3NScpLCAtMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMHgxcC0xMjM0NTY3ODkxMjM0NTY3ODknKSwgLTAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDAwMDAxcC0xMDc1JyksIFRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0weDEuMXAtMTA3NScpLCAtVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLmZmZmZmZmZmZmZmZmZmZmZmcC0xMDc1JyksIFRJTlkpCisKKyAgICAgICAgIyBjaGVjayByb3VuZC1oYWxmLWV2ZW4gaXMgd29ya2luZyBjb3JyZWN0bHkgbmVhciAwIC4uLgorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDFwLTEwNzYnKSwgMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDJwLTEwNzYnKSwgMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDNwLTEwNzYnKSwgVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHg0cC0xMDc2JyksIFRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYNXAtMTA3NicpLCBUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDZwLTEwNzYnKSwgMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDdwLTEwNzYnKSwgMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDhwLTEwNzYnKSwgMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDlwLTEwNzYnKSwgMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweGFwLTEwNzYnKSwgMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWGJwLTEwNzYnKSwgMypUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweGNwLTEwNzYnKSwgMypUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWGRwLTEwNzYnKSwgMypUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWGVwLTEwNzYnKSwgNCpUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweGZwLTEwNzYnKSwgNCpUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEwcC0xMDc2JyksIDQqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTB4MXAtMTA3NicpLCAtMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMFgycC0xMDc2JyksIC0wLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0weDNwLTEwNzYnKSwgLVRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0wWDRwLTEwNzYnKSwgLVRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0weDVwLTEwNzYnKSwgLVRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0weDZwLTEwNzYnKSwgLTIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTBYN3AtMTA3NicpLCAtMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMFg4cC0xMDc2JyksIC0yKlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0wWDlwLTEwNzYnKSwgLTIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTBYYXAtMTA3NicpLCAtMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMHhicC0xMDc2JyksIC0zKlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0weGNwLTEwNzYnKSwgLTMqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTBYZHAtMTA3NicpLCAtMypUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMHhlcC0xMDc2JyksIC00KlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0wWGZwLTEwNzYnKSwgLTQqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTBYMTBwLTEwNzYnKSwgLTQqVElOWSkKKworICAgICAgICAjIC4uLiBhbmQgbmVhciBNSU4gLi4uCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZkNnAtMTAyMicpLCBNSU4tMypUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZDhwLTEwMjInKSwgTUlOLTIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmRhcC0xMDIyJyksIE1JTi0yKlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZkY3AtMTAyMicpLCBNSU4tMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZGVwLTEwMjInKSwgTUlOLTIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmUwcC0xMDIyJyksIE1JTi0yKlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZlMnAtMTAyMicpLCBNSU4tMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZTRwLTEwMjInKSwgTUlOLTIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmU2cC0xMDIyJyksIE1JTi0yKlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZlOHAtMTAyMicpLCBNSU4tMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZWFwLTEwMjInKSwgTUlOLVRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZlY3AtMTAyMicpLCBNSU4tVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmVlcC0xMDIyJyksIE1JTi1USU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZjBwLTEwMjInKSwgTUlOLVRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZmMnAtMTAyMicpLCBNSU4tVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmY0cC0xMDIyJyksIE1JTi1USU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZjZwLTEwMjInKSwgTUlOLVRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZmOHAtMTAyMicpLCBNSU4pCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZmYXAtMTAyMicpLCBNSU4pCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZmY3AtMTAyMicpLCBNSU4pCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZmZXAtMTAyMicpLCBNSU4pCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAwMHAtMTAyMicpLCBNSU4pCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAwMnAtMTAyMicpLCBNSU4pCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAwNHAtMTAyMicpLCBNSU4pCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAwNnAtMTAyMicpLCBNSU4pCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAwOHAtMTAyMicpLCBNSU4pCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAwYXAtMTAyMicpLCBNSU4rVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDBjcC0xMDIyJyksIE1JTitUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMGVwLTEwMjInKSwgTUlOK1RJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAxMHAtMTAyMicpLCBNSU4rVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDEycC0xMDIyJyksIE1JTitUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMTRwLTEwMjInKSwgTUlOK1RJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAxNnAtMTAyMicpLCBNSU4rVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDE4cC0xMDIyJyksIE1JTisyKlRJTlkpCisKKyAgICAgICAgIyAuLi4gYW5kIG5lYXIgMS4wLgorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZjBwMCcpLCAxLjAtRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZjFwMCcpLCAxLjAtRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDAuZmZmZmZmZmZmZmZmZjJwMCcpLCAxLjAtRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZjNwMCcpLCAxLjAtRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDAuZmZmZmZmZmZmZmZmZjRwMCcpLCAxLjAtRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDAuZmZmZmZmZmZmZmZmZjVwMCcpLCAxLjAtRVBTLzIpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMC5mZmZmZmZmZmZmZmZmNnAwJyksIDEuMC1FUFMvMikKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmY3cDAnKSwgMS4wLUVQUy8yKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZjhwMCcpLCAxLjAtRVBTLzIpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMC5mZmZmZmZmZmZmZmZmOXAwJyksIDEuMC1FUFMvMikKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgwLmZmZmZmZmZmZmZmZmZhcDAnKSwgMS4wLUVQUy8yKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZmJwMCcpLCAxLjAtRVBTLzIpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMC5mZmZmZmZmZmZmZmZmY3AwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmZkcDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDAuZmZmZmZmZmZmZmZmZmVwMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZmZnAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDAwcDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuMDAwMDAwMDAwMDAwMDFwMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAwMnAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDAzcDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMDRwMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMS4wMDAwMDAwMDAwMDAwNXAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDA2cDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuMDAwMDAwMDAwMDAwMDdwMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAwN2ZmZmZmZmZmZmZmZmZmZmZmZmZmcDAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMDhwMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAwODAwMDAwMDAwMDAwMDAwMDAwMXAwJyksCisgICAgICAgICAgICAgICAgICAgICAgIDErRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuMDAwMDAwMDAwMDAwMDlwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMGFwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMGJwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuMDAwMDAwMDAwMDAwMGNwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMGRwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMGVwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuMDAwMDAwMDAwMDAwMGZwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMTBwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuMDAwMDAwMDAwMDAwMTFwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMTJwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuMDAwMDAwMDAwMDAwMTNwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuMDAwMDAwMDAwMDAwMTRwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMTVwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMTZwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuMDAwMDAwMDAwMDAwMTdwMCcpLCAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMTdmZmZmZmZmZmZmZmZmZmZmZmZmZnAwJyksCisgICAgICAgICAgICAgICAgICAgICAgIDEuMCtFUFMpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAxOHAwJyksIDEuMCsyKkVQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDE4MDAwMDAwMDAwMDAwMDAwMDAxcDAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgMS4wKzIqRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMTlwMCcpLCAxLjArMipFUFMpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMS4wMDAwMDAwMDAwMDAxYXAwJyksIDEuMCsyKkVQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDFicDAnKSwgMS4wKzIqRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMWNwMCcpLCAxLjArMipFUFMpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAxZHAwJyksIDEuMCsyKkVQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDFlcDAnKSwgMS4wKzIqRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuMDAwMDAwMDAwMDAwMWZwMCcpLCAxLjArMipFUFMpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAyMHAwJyksIDEuMCsyKkVQUykKKworICAgIGRlZiB0ZXN0X3JvdW5kdHJpcChzZWxmKToKKyAgICAgICAgZGVmIHJvdW5kdHJpcCh4KToKKyAgICAgICAgICAgIHJldHVybiBmcm9tSGV4KHRvSGV4KHgpKQorCisgICAgICAgIGZvciB4IGluIFtOQU4sIElORiwgc2VsZi5NQVgsIHNlbGYuTUlOLCBzZWxmLk1JTi1zZWxmLlRJTlksIHNlbGYuVElOWSwgMC4wXToKKyAgICAgICAgICAgIHNlbGYuaWRlbnRpY2FsKHgsIHJvdW5kdHJpcCh4KSkKKyAgICAgICAgICAgIHNlbGYuaWRlbnRpY2FsKC14LCByb3VuZHRyaXAoLXgpKQorCisgICAgICAgICMgZnJvbUhleCh0b0hleCh4KSkgc2hvdWxkIGV4YWN0bHkgcmVjb3ZlciB4LCBmb3IgYW55IG5vbi1OYU4gZmxvYXQgeC4KKyAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwMDApOgorICAgICAgICAgICAgZSA9IHJhbmRvbS5yYW5kcmFuZ2UoLTEyMDAsIDEyMDApCisgICAgICAgICAgICBtID0gcmFuZG9tLnJhbmRvbSgpCisgICAgICAgICAgICBzID0gcmFuZG9tLmNob2ljZShbMS4wLCAtMS4wXSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4ID0gcypsZGV4cChtLCBlKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmlkZW50aWNhbCh4LCBmcm9tSGV4KHRvSGV4KHgpKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgR2VuZXJhbEZsb2F0Q2FzZXMsCisgICAgICAgIEZvcm1hdEZ1bmN0aW9uc1Rlc3RDYXNlLAorICAgICAgICBVbmtub3duRm9ybWF0VGVzdENhc2UsCisgICAgICAgIElFRUVGb3JtYXRUZXN0Q2FzZSwKKyAgICAgICAgUmVwclRlc3RDYXNlLAorICAgICAgICBSb3VuZFRlc3RDYXNlLAorICAgICAgICBJbmZOYW5UZXN0LAorICAgICAgICBIZXhGbG9hdFRlc3RDYXNlLAorICAgICAgICApCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zsb2F0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zsb2F0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWY4MmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmxvYXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zsb2F0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zsb2F0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWY4MmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmxvYXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZubWF0Y2gucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mbm1hdGNoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZWM1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mbm1hdGNoLnB5CkBAIC0wLDAgKzEsNzIgQEAKKyIiIlRlc3QgY2FzZXMgZm9yIHRoZSBmbm1hdGNoIG1vZHVsZS4iIiIKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGZubWF0Y2ggaW1wb3J0IGZubWF0Y2gsIGZubWF0Y2hjYXNlLCBfTUFYQ0FDSEUsIF9jYWNoZQorZnJvbSBmbm1hdGNoIGltcG9ydCBmbm1hdGNoLCBmbm1hdGNoY2FzZSwgX01BWENBQ0hFLCBfY2FjaGUsIF9wdXJnZQorCisKK2NsYXNzIEZubWF0Y2hUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIF9wdXJnZSgpCisKKyAgICBkZWYgY2hlY2tfbWF0Y2goc2VsZiwgZmlsZW5hbWUsIHBhdHRlcm4sIHNob3VsZF9tYXRjaD0xLCBmbj1mbm1hdGNoKToKKyAgICAgICAgaWYgc2hvdWxkX21hdGNoOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZuKGZpbGVuYW1lLCBwYXR0ZXJuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXIgdG8gbWF0Y2ggcGF0dGVybiAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAlIChmaWxlbmFtZSwgcGF0dGVybikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZuKGZpbGVuYW1lLCBwYXR0ZXJuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXIgbm90IHRvIG1hdGNoIHBhdHRlcm4gJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZmlsZW5hbWUsIHBhdHRlcm4pKQorCisgICAgZGVmIHRlc3RfZm5tYXRjaChzZWxmKToKKyAgICAgICAgY2hlY2sgPSBzZWxmLmNoZWNrX21hdGNoCisgICAgICAgIGNoZWNrKCdhYmMnLCAnYWJjJykKKyAgICAgICAgY2hlY2soJ2FiYycsICc/Kj8nKQorICAgICAgICBjaGVjaygnYWJjJywgJz8/PyonKQorICAgICAgICBjaGVjaygnYWJjJywgJyo/Pz8nKQorICAgICAgICBjaGVjaygnYWJjJywgJz8/PycpCisgICAgICAgIGNoZWNrKCdhYmMnLCAnKicpCisgICAgICAgIGNoZWNrKCdhYmMnLCAnYWJbY2RdJykKKyAgICAgICAgY2hlY2soJ2FiYycsICdhYlshZGVdJykKKyAgICAgICAgY2hlY2soJ2FiYycsICdhYltkZV0nLCAwKQorICAgICAgICBjaGVjaygnYScsICc/PycsIDApCisgICAgICAgIGNoZWNrKCdhJywgJ2InLCAwKQorCisgICAgICAgICMgdGhlc2UgdGVzdCB0aGF0ICdcJyBpcyBoYW5kbGVkIGNvcnJlY3RseSBpbiBjaGFyYWN0ZXIgc2V0czsKKyAgICAgICAgIyBzZWUgU0YgYnVnICM0MDk2NTEKKyAgICAgICAgY2hlY2soJ1xcJywgcidbXF0nKQorICAgICAgICBjaGVjaygnYScsIHInWyFcXScpCisgICAgICAgIGNoZWNrKCdcXCcsIHInWyFcXScsIDApCisKKyAgICAgICAgIyB0ZXN0IHRoYXQgZmlsZW5hbWVzIHdpdGggbmV3bGluZXMgaW4gdGhlbSBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCisgICAgICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTY2NjUKKyAgICAgICAgY2hlY2soJ2Zvb1xuYmFyJywgJ2ZvbyonKQorICAgICAgICBjaGVjaygnZm9vXG5iYXJcbicsICdmb28qJykKKyAgICAgICAgY2hlY2soJ1xuZm9vJywgJ2ZvbyonLCBGYWxzZSkKKyAgICAgICAgY2hlY2soJ1xuJywgJyonKQorCisgICAgZGVmIHRlc3RfZm5tYXRjaGNhc2Uoc2VsZik6CisgICAgICAgIGNoZWNrID0gc2VsZi5jaGVja19tYXRjaAorICAgICAgICBjaGVjaygnQWJDJywgJ2FiYycsIDAsIGZubWF0Y2hjYXNlKQorICAgICAgICBjaGVjaygnYWJjJywgJ0FiQycsIDAsIGZubWF0Y2hjYXNlKQorCisgICAgZGVmIHRlc3RfY2FjaGVfY2xlYXJpbmcoc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCBjYWNoZXMgZG8gbm90IGdyb3cgdG9vIGxhcmdlCisgICAgICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTc4NDYKKworICAgICAgICAjIHN0cmluZyBwYXR0ZXJuIGNhY2hlCisgICAgICAgIGZvciBpIGluIHJhbmdlKF9NQVhDQUNIRSArIDEpOgorICAgICAgICAgICAgZm5tYXRjaCgnZm9vJywgJz8nICogaSkKKworICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChsZW4oX2NhY2hlKSwgX01BWENBQ0hFKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChGbm1hdGNoVGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm5tYXRjaC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mbm1hdGNoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQ0OGZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm5tYXRjaC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm5tYXRjaC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mbm1hdGNoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQ0OGZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm5tYXRjaC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm9yazEucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JrMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTMwNjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm9yazEucHkKQEAgLTAsMCArMSw3MSBAQAorIiIiVGhpcyB0ZXN0IGNoZWNrcyBmb3IgY29ycmVjdCBmb3JrKCkgYmVoYXZpb3IuCisiIiIKKworaW1wb3J0IGltcAoraW1wb3J0IG9zCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQorCitmcm9tIHRlc3QuZm9ya193YWl0IGltcG9ydCBGb3JrV2FpdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCByZWFwX2NoaWxkcmVuLCBnZXRfYXR0cmlidXRlLCBpbXBvcnRfbW9kdWxlCit0aHJlYWRpbmcgPSBpbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQorCisjU2tpcCB0ZXN0IGlmIGZvcmsgZG9lcyBub3QgZXhpc3QuCitnZXRfYXR0cmlidXRlKG9zLCAnZm9yaycpCisKKworY2xhc3MgRm9ya1Rlc3QoRm9ya1dhaXQpOgorICAgIGRlZiB3YWl0X2ltcGwoc2VsZiwgY3BpZCk6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgICMgd2FpdHBpZCgpIHNob3VsZG4ndCBoYW5nLCBidXQgc29tZSBvZiB0aGUgYnVpbGRib3RzIHNlZW0gdG8gaGFuZworICAgICAgICAgICAgIyBpbiB0aGUgZm9ya2luZyB0ZXN0cy4gIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBmaXggdGhlIHByb2JsZW0uCisgICAgICAgICAgICBzcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKGNwaWQsIG9zLldOT0hBTkcpCisgICAgICAgICAgICBpZiBzcGlkID09IGNwaWQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMS4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BpZCwgY3BpZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0dXMsIDAsICJjYXVzZSA9ICVkLCBleGl0ID0gJWQiICUgKHN0YXR1cyYweGZmLCBzdGF0dXM+PjgpKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2xvY2tfZm9yayhzZWxmKToKKyAgICAgICAgaW1wb3J0X3N0YXJ0ZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBmYWtlX21vZHVsZV9uYW1lID0gImZha2UgdGVzdCBtb2R1bGUiCisgICAgICAgIHBhcnRpYWxfbW9kdWxlID0gInBhcnRpYWwiCisgICAgICAgIGNvbXBsZXRlX21vZHVsZSA9ICJjb21wbGV0ZSIKKyAgICAgICAgZGVmIGltcG9ydGVyKCk6CisgICAgICAgICAgICBpbXAuYWNxdWlyZV9sb2NrKCkKKyAgICAgICAgICAgIHN5cy5tb2R1bGVzW2Zha2VfbW9kdWxlX25hbWVdID0gcGFydGlhbF9tb2R1bGUKKyAgICAgICAgICAgIGltcG9ydF9zdGFydGVkLnNldCgpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDEpICMgR2l2ZSB0aGUgb3RoZXIgdGhyZWFkIHRpbWUgdG8gdHJ5IGFuZCBhY3F1aXJlLgorICAgICAgICAgICAgc3lzLm1vZHVsZXNbZmFrZV9tb2R1bGVfbmFtZV0gPSBjb21wbGV0ZV9tb2R1bGUKKyAgICAgICAgICAgIGltcC5yZWxlYXNlX2xvY2soKQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9aW1wb3J0ZXIpCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICBpbXBvcnRfc3RhcnRlZC53YWl0KCkKKyAgICAgICAgcGlkID0gb3MuZm9yaygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBwaWQ6CisgICAgICAgICAgICAgICAgbSA9IF9faW1wb3J0X18oZmFrZV9tb2R1bGVfbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBtID09IGNvbXBsZXRlX21vZHVsZToKKyAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoMCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvcy5fZXhpdCgxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0LmpvaW4oKQorICAgICAgICAgICAgICAgICMgRXhpdGNvZGUgMSBtZWFucyB0aGUgY2hpbGQgZ290IGEgcGFydGlhbCBtb2R1bGUgKGJhZC4pIE5vCisgICAgICAgICAgICAgICAgIyBleGl0Y29kZSAoYnV0IGEgaGFuZywgd2hpY2ggbWFuaWZlc3RzIGFzICdnb3QgcGlkIDAnKQorICAgICAgICAgICAgICAgICMgbWVhbnMgdGhlIGNoaWxkIGRlYWRsb2NrZWQgKGFsc28gYmFkLikKKyAgICAgICAgICAgICAgICBzZWxmLndhaXRfaW1wbChwaWQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdLSUxMKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEZvcmtUZXN0KQorICAgIHJlYXBfY2hpbGRyZW4oKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JrMS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JrMS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjNzAwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZvcmsxLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JrMS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JrMS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjNzAwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZvcmsxLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JtYXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JtYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzMGVmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zvcm1hdC5weQpAQCAtMCwwICsxLDMwNyBAQAoraW1wb3J0IHN5cworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgaGF2ZV91bmljb2RlLCBUZXN0RmFpbGVkCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQgYXMgdGVzdF9zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKKworbWF4c2l6ZSA9IHRlc3Rfc3VwcG9ydC5NQVhfUHlfc3NpemVfdAorCisjIHRlc3Qgc3RyaW5nIGZvcm1hdHRpbmcgb3BlcmF0b3IgKEkgYW0gbm90IHN1cmUgaWYgdGhpcyBpcyBiZWluZyB0ZXN0ZWQKKyMgZWxzZXdoZXJlIGJ1dCwgc3VyZWx5LCBzb21lIG9mIHRoZSBnaXZlbiBjYXNlcyBhcmUgKm5vdCogdGVzdGVkIGJlY2F1c2UKKyMgdGhleSBjcmFzaCBweXRob24pCisjIHRlc3Qgb24gdW5pY29kZSBzdHJpbmdzIGFzIHdlbGwKKworZGVmIHRlc3Rmb3JtYXQoZm9ybWF0c3RyLCBhcmdzLCBvdXRwdXQ9Tm9uZSwgbGltaXQ9Tm9uZSwgb3ZlcmZsb3dvaz1GYWxzZSk6CisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgaWYgb3V0cHV0OgorICAgICAgICAgICAgcHJpbnQgIiVzICUlICVzID0/ICVzIC4uLiIgJVwKKyAgICAgICAgICAgICAgICAocmVwcihmb3JtYXRzdHIpLCByZXByKGFyZ3MpLCByZXByKG91dHB1dCkpLAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgIiVzICUlICVzIHdvcmtzPyAuLi4iICUgKHJlcHIoZm9ybWF0c3RyKSwgcmVwcihhcmdzKSksCisgICAgdHJ5OgorICAgICAgICByZXN1bHQgPSBmb3JtYXRzdHIgJSBhcmdzCisgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgIGlmIG5vdCBvdmVyZmxvd29rOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdvdmVyZmxvdyAodGhpcyBpcyBmaW5lKScKKyAgICBlbHNlOgorICAgICAgICBpZiBvdXRwdXQgYW5kIGxpbWl0IGlzIE5vbmUgYW5kIHJlc3VsdCAhPSBvdXRwdXQ6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICdubycKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCIlciAlJSAlciA9PSAlciAhPSAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9ybWF0c3RyLCBhcmdzLCByZXN1bHQsIG91dHB1dCkpCisgICAgICAgICMgd2hlbiAnbGltaXQnIGlzIHNwZWNpZmllZCwgaXQgZGV0ZXJtaW5lcyBob3cgbWFueSBjaGFyYWN0ZXJzCisgICAgICAgICMgbXVzdCBtYXRjaCBleGFjdGx5OyBsZW5ndGhzIG11c3QgYWx3YXlzIG1hdGNoLgorICAgICAgICAjIGV4OiBsaW1pdD01LCAnMTIzNDU2NzgnIG1hdGNoZXMgJzEyMzQ1X19fJworICAgICAgICAjIChtYWlubHkgZm9yIGZsb2F0aW5nIHBvaW50IGZvcm1hdCB0ZXN0cyBmb3Igd2hpY2ggYW4gZXhhY3QgbWF0Y2gKKyAgICAgICAgIyBjYW4ndCBiZSBndWFyYW50ZWVkIGR1ZSB0byByb3VuZGluZyBhbmQgcmVwcmVzZW50YXRpb24gZXJyb3JzKQorICAgICAgICBlbGlmIG91dHB1dCBhbmQgbGltaXQgaXMgbm90IE5vbmUgYW5kICgKKyAgICAgICAgICAgICAgICBsZW4ocmVzdWx0KSE9bGVuKG91dHB1dCkgb3IgcmVzdWx0WzpsaW1pdF0hPW91dHB1dFs6bGltaXRdKToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ25vJworICAgICAgICAgICAgcHJpbnQgIiVzICUlICVzID09ICVzICE9ICVzIiAlIFwKKyAgICAgICAgICAgICAgICAgIChyZXByKGZvcm1hdHN0ciksIHJlcHIoYXJncyksIHJlcHIocmVzdWx0KSwgcmVwcihvdXRwdXQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAneWVzJworCisKK2RlZiB0ZXN0Ym90aChmb3JtYXRzdHIsICphcmdzLCAqKmt3YXJncyk6CisgICAgdGVzdGZvcm1hdChmb3JtYXRzdHIsICphcmdzLCAqKmt3YXJncykKKyAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgIHRlc3Rmb3JtYXQodW5pY29kZShmb3JtYXRzdHIpLCAqYXJncywgKiprd2FyZ3MpCisKKworY2xhc3MgRm9ybWF0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZm9ybWF0KHNlbGYpOgorICAgICAgICB0ZXN0Ym90aCgiJS4xZCIsICgxLCksICIxIikKKyAgICAgICAgdGVzdGJvdGgoIiUuKmQiLCAoc3lzLm1heGludCwxKSwgb3ZlcmZsb3dvaz1UcnVlKSAgIyBleHBlY3Qgb3ZlcmZsb3cKKyAgICAgICAgdGVzdGJvdGgoIiUuMTAwZCIsICgxLCksICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcKKyAgICAgICAgICAgICAgICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcKKyAgICAgICAgICAgICAgICAgJzAwMDAwMDAxJywgb3ZlcmZsb3dvaz1UcnVlKQorICAgICAgICB0ZXN0Ym90aCgiJSMuMTE3eCIsICgxLCksICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJworICAgICAgICAgICAgICAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJworICAgICAgICAgICAgICAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScsCisgICAgICAgICAgICAgICAgIG92ZXJmbG93b2s9VHJ1ZSkKKyAgICAgICAgdGVzdGJvdGgoIiUjLjExOHgiLCAoMSwpLCAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcKKyAgICAgICAgICAgICAgICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcKKyAgICAgICAgICAgICAgICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJywKKyAgICAgICAgICAgICAgICAgb3ZlcmZsb3dvaz1UcnVlKQorCisgICAgICAgIHRlc3Rib3RoKCIlZiIsICgxLjAsKSwgIjEuMDAwMDAwIikKKyAgICAgICAgIyB0aGVzZSBhcmUgdHJ5aW5nIHRvIHRlc3QgdGhlIGxpbWl0cyBvZiB0aGUgaW50ZXJuYWwgbWFnaWMtbnVtYmVyLWxlbmd0aAorICAgICAgICAjIGZvcm1hdHRpbmcgYnVmZmVyLCBpZiB0aGF0IG51bWJlciBjaGFuZ2VzIHRoZW4gdGhlc2UgdGVzdHMgYXJlIGxlc3MKKyAgICAgICAgIyBlZmZlY3RpdmUKKyAgICAgICAgdGVzdGJvdGgoIiUjLipnIiwgKDEwOSwgLTEuZSs0OS8zLikpCisgICAgICAgIHRlc3Rib3RoKCIlIy4qZyIsICgxMTAsIC0xLmUrNDkvMy4pKQorICAgICAgICB0ZXN0Ym90aCgiJSMuKmciLCAoMTEwLCAtMS5lKzEwMC8zLikpCisKKyAgICAgICAgIyB0ZXN0IHNvbWUgcmlkaWN1bG91c2x5IGxhcmdlIHByZWNpc2lvbiwgZXhwZWN0IG92ZXJmbG93CisgICAgICAgIHRlc3Rib3RoKCclMTIuKmYnLCAoMTIzNDU2LCAxLjApKQorCisgICAgICAgICMgY2hlY2sgZm9yIGludGVybmFsIG92ZXJmbG93IHZhbGlkYXRpb24gb24gbGVuZ3RoIG9mIHByZWNpc2lvbgorICAgICAgICAjIHRoZXNlIHRlc3RzIHNob3VsZCBubyBsb25nZXIgY2F1c2Ugb3ZlcmZsb3cgaW4gUHl0aG9uCisgICAgICAgICMgMi43LzMuMSBhbmQgbGF0ZXIuCisgICAgICAgIHRlc3Rib3RoKCIlIy4qZyIsICgxMTAsIC0xLmUrMTAwLzMuKSkKKyAgICAgICAgdGVzdGJvdGgoIiUjLipHIiwgKDExMCwgLTEuZSsxMDAvMy4pKQorICAgICAgICB0ZXN0Ym90aCgiJSMuKmYiLCAoMTEwLCAtMS5lKzEwMC8zLikpCisgICAgICAgIHRlc3Rib3RoKCIlIy4qRiIsICgxMTAsIC0xLmUrMTAwLzMuKSkKKworICAgICAgICAjIEZvcm1hdHRpbmcgb2YgbG9uZyBpbnRlZ2Vycy4gT3ZlcmZsb3cgaXMgbm90IG9rCisgICAgICAgIHRlc3Rib3RoKCIleCIsIDEwTCwgImEiKQorICAgICAgICB0ZXN0Ym90aCgiJXgiLCAxMDAwMDAwMDAwMDBMLCAiMTc0ODc2ZTgwMCIpCisgICAgICAgIHRlc3Rib3RoKCIlbyIsIDEwTCwgIjEyIikKKyAgICAgICAgdGVzdGJvdGgoIiVvIiwgMTAwMDAwMDAwMDAwTCwgIjEzNTEwMzU1NjQwMDAiKQorICAgICAgICB0ZXN0Ym90aCgiJWQiLCAxMEwsICIxMCIpCisgICAgICAgIHRlc3Rib3RoKCIlZCIsIDEwMDAwMDAwMDAwMEwsICIxMDAwMDAwMDAwMDAiKQorCisgICAgICAgIGJpZyA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MEwKKyAgICAgICAgdGVzdGJvdGgoIiVkIiwgYmlnLCAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiVkIiwgLWJpZywgIi0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiKQorICAgICAgICB0ZXN0Ym90aCgiJTVkIiwgLWJpZywgIi0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiKQorICAgICAgICB0ZXN0Ym90aCgiJTMxZCIsIC1iaWcsICItMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiUzMmQiLCAtYmlnLCAiIC0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiKQorICAgICAgICB0ZXN0Ym90aCgiJS0zMmQiLCAtYmlnLCAiLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCAiKQorICAgICAgICB0ZXN0Ym90aCgiJTAzMmQiLCAtYmlnLCAiLTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiKQorICAgICAgICB0ZXN0Ym90aCgiJS0wMzJkIiwgLWJpZywgIi0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAgIikKKyAgICAgICAgdGVzdGJvdGgoIiUwMzRkIiwgLWJpZywgIi0wMDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiKQorICAgICAgICB0ZXN0Ym90aCgiJTAzNGQiLCBiaWcsICIwMDAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiUwKzM0ZCIsIGJpZywgIiswMDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiKQorICAgICAgICB0ZXN0Ym90aCgiJSszNGQiLCBiaWcsICIgICArMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiUzNGQiLCBiaWcsICIgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiUuMmQiLCBiaWcsICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiKQorICAgICAgICB0ZXN0Ym90aCgiJS4zMGQiLCBiaWcsICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiKQorICAgICAgICB0ZXN0Ym90aCgiJS4zMWQiLCBiaWcsICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiUzMi4zMWQiLCBiaWcsICIgMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIpCisgICAgICAgIHRlc3Rib3RoKCIlZCIsIGZsb2F0KGJpZyksICIxMjM0NTZfX19fX19fX19fX19fX19fX19fX19fX18iLCA2KQorCisgICAgICAgIGJpZyA9IDB4MTIzNDU2Nzg5MGFiY2RlZjEyMzQ1TCAgIyAyMSBoZXggZGlnaXRzCisgICAgICAgIHRlc3Rib3RoKCIleCIsIGJpZywgIjEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIleCIsIC1iaWcsICItMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiU1eCIsIC1iaWcsICItMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiUyMngiLCAtYmlnLCAiLTEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlMjN4IiwgLWJpZywgIiAtMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiUtMjN4IiwgLWJpZywgIi0xMjM0NTY3ODkwYWJjZGVmMTIzNDUgIikKKyAgICAgICAgdGVzdGJvdGgoIiUwMjN4IiwgLWJpZywgIi0wMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiUtMDIzeCIsIC1iaWcsICItMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1ICIpCisgICAgICAgIHRlc3Rib3RoKCIlMDI1eCIsIC1iaWcsICItMDAwMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiUwMjV4IiwgYmlnLCAiMDAwMDEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlMCsyNXgiLCBiaWcsICIrMDAwMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiUrMjV4IiwgYmlnLCAiICAgKzEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlMjV4IiwgYmlnLCAiICAgIDEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlLjJ4IiwgYmlnLCAiMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiUuMjF4IiwgYmlnLCAiMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiUuMjJ4IiwgYmlnLCAiMDEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlMjMuMjJ4IiwgYmlnLCAiIDAxMjM0NTY3ODkwYWJjZGVmMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJS0yMy4yMngiLCBiaWcsICIwMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1ICIpCisgICAgICAgIHRlc3Rib3RoKCIlWCIsIGJpZywgIjEyMzQ1Njc4OTBBQkNERUYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlI1giLCBiaWcsICIwWDEyMzQ1Njc4OTBBQkNERUYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlI3giLCBiaWcsICIweDEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlI3giLCAtYmlnLCAiLTB4MTIzNDU2Nzg5MGFiY2RlZjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiUjLjIzeCIsIC1iaWcsICItMHgwMDEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlIysuMjN4IiwgYmlnLCAiKzB4MDAxMjM0NTY3ODkwYWJjZGVmMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJSMgLjIzeCIsIGJpZywgIiAweDAwMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiUjKy4yM1giLCBiaWcsICIrMFgwMDEyMzQ1Njc4OTBBQkNERUYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlIy0rLjIzWCIsIGJpZywgIiswWDAwMTIzNDU2Nzg5MEFCQ0RFRjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiUjLSsyNi4yM1giLCBiaWcsICIrMFgwMDEyMzQ1Njc4OTBBQkNERUYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlIy0rMjcuMjNYIiwgYmlnLCAiKzBYMDAxMjM0NTY3ODkwQUJDREVGMTIzNDUgIikKKyAgICAgICAgdGVzdGJvdGgoIiUjKzI3LjIzWCIsIGJpZywgIiArMFgwMDEyMzQ1Njc4OTBBQkNERUYxMjM0NSIpCisgICAgICAgICMgbmV4dCBvbmUgZ2V0cyB0d28gbGVhZGluZyB6ZXJvZXMgZnJvbSBwcmVjaXNpb24sIGFuZCBhbm90aGVyIGZyb20gdGhlCisgICAgICAgICMgMCBmbGFnIGFuZCB0aGUgd2lkdGgKKyAgICAgICAgdGVzdGJvdGgoIiUjKzAyNy4yM1giLCBiaWcsICIrMFgwMDAxMjM0NTY3ODkwQUJDREVGMTIzNDUiKQorICAgICAgICAjIHNhbWUsIGV4Y2VwdCBubyAwIGZsYWcKKyAgICAgICAgdGVzdGJvdGgoIiUjKzI3LjIzWCIsIGJpZywgIiArMFgwMDEyMzQ1Njc4OTBBQkNERUYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIleCIsIGZsb2F0KGJpZyksICIxMjM0NTZfX19fX19fX19fX19fX18iLCA2KQorCisgICAgICAgIGJpZyA9IDAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MEwgICMgMzIgb2N0YWwgZGlnaXRzCisgICAgICAgIHRlc3Rib3RoKCIlbyIsIGJpZywgIjEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiVvIiwgLWJpZywgIi0xMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlNW8iLCAtYmlnLCAiLTEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUzM28iLCAtYmlnLCAiLTEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUzNG8iLCAtYmlnLCAiIC0xMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlLTM0byIsIC1iaWcsICItMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAgIikKKyAgICAgICAgdGVzdGJvdGgoIiUwMzRvIiwgLWJpZywgIi0wMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICB0ZXN0Ym90aCgiJS0wMzRvIiwgLWJpZywgIi0xMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCAiKQorICAgICAgICB0ZXN0Ym90aCgiJTAzNm8iLCAtYmlnLCAiLTAwMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUwMzZvIiwgYmlnLCAiMDAwMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUwKzM2byIsIGJpZywgIiswMDAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlKzM2byIsIGJpZywgIiAgICsxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlMzZvIiwgYmlnLCAiICAgIDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUuMm8iLCBiaWcsICIxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlLjMybyIsIGJpZywgIjEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUuMzNvIiwgYmlnLCAiMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUzNC4zM28iLCBiaWcsICIgMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUtMzQuMzNvIiwgYmlnLCAiMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwICIpCisgICAgICAgIHRlc3Rib3RoKCIlbyIsIGJpZywgIjEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUjbyIsIGJpZywgIjAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlI28iLCAtYmlnLCAiLTAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlIy4zNG8iLCAtYmlnLCAiLTAwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICB0ZXN0Ym90aCgiJSMrLjM0byIsIGJpZywgIiswMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUjIC4zNG8iLCBiaWcsICIgMDAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlIysuMzRvIiwgYmlnLCAiKzAwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICB0ZXN0Ym90aCgiJSMtKy4zNG8iLCBiaWcsICIrMDAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlIy0rMzcuMzRvIiwgYmlnLCAiKzAwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAgICIpCisgICAgICAgIHRlc3Rib3RoKCIlIyszNy4zNG8iLCBiaWcsICIgICswMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgIyBuZXh0IG9uZSBnZXRzIG9uZSBsZWFkaW5nIHplcm8gZnJvbSBwcmVjaXNpb24KKyAgICAgICAgdGVzdGJvdGgoIiUuMzNvIiwgYmlnLCAiMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgIyBiYXNlIG1hcmtlciBzaG91bGRuJ3QgY2hhbmdlIHRoYXQsIHNpbmNlICIwIiBpcyByZWR1bmRhbnQKKyAgICAgICAgdGVzdGJvdGgoIiUjLjMzbyIsIGJpZywgIjAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgICMgYnV0IHJlZHVjZSBwcmVjaXNpb24sIGFuZCBiYXNlIG1hcmtlciBzaG91bGQgYWRkIGEgemVybworICAgICAgICB0ZXN0Ym90aCgiJSMuMzJvIiwgYmlnLCAiMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgIyBvbmUgbGVhZGluZyB6ZXJvIGZyb20gcHJlY2lzaW9uLCBhbmQgYW5vdGhlciBmcm9tICIwIiBmbGFnICYgd2lkdGgKKyAgICAgICAgdGVzdGJvdGgoIiUwMzQuMzNvIiwgYmlnLCAiMDAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgICMgYmFzZSBtYXJrZXIgc2hvdWxkbid0IGNoYW5nZSB0aGF0CisgICAgICAgIHRlc3Rib3RoKCIlMCMzNC4zM28iLCBiaWcsICIwMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiVvIiwgZmxvYXQoYmlnKSwgIjEyMzQ1Nl9fX19fX19fX19fX19fX19fX19fX19fX19fIiwgNikKKworICAgICAgICAjIFNvbWUgc21hbGwgaW50cywgaW4gYm90aCBQeXRob24gaW50IGFuZCBsb25nIGZsYXZvcnMpLgorICAgICAgICB0ZXN0Ym90aCgiJWQiLCA0MiwgIjQyIikKKyAgICAgICAgdGVzdGJvdGgoIiVkIiwgLTQyLCAiLTQyIikKKyAgICAgICAgdGVzdGJvdGgoIiVkIiwgNDJMLCAiNDIiKQorICAgICAgICB0ZXN0Ym90aCgiJWQiLCAtNDJMLCAiLTQyIikKKyAgICAgICAgdGVzdGJvdGgoIiVkIiwgNDIuMCwgIjQyIikKKyAgICAgICAgdGVzdGJvdGgoIiUjeCIsIDEsICIweDEiKQorICAgICAgICB0ZXN0Ym90aCgiJSN4IiwgMUwsICIweDEiKQorICAgICAgICB0ZXN0Ym90aCgiJSNYIiwgMSwgIjBYMSIpCisgICAgICAgIHRlc3Rib3RoKCIlI1giLCAxTCwgIjBYMSIpCisgICAgICAgIHRlc3Rib3RoKCIlI3giLCAxLjAsICIweDEiKQorICAgICAgICB0ZXN0Ym90aCgiJSNvIiwgMSwgIjAxIikKKyAgICAgICAgdGVzdGJvdGgoIiUjbyIsIDFMLCAiMDEiKQorICAgICAgICB0ZXN0Ym90aCgiJSNvIiwgMCwgIjAiKQorICAgICAgICB0ZXN0Ym90aCgiJSNvIiwgMEwsICIwIikKKyAgICAgICAgdGVzdGJvdGgoIiVvIiwgMCwgIjAiKQorICAgICAgICB0ZXN0Ym90aCgiJW8iLCAwTCwgIjAiKQorICAgICAgICB0ZXN0Ym90aCgiJWQiLCAwLCAiMCIpCisgICAgICAgIHRlc3Rib3RoKCIlZCIsIDBMLCAiMCIpCisgICAgICAgIHRlc3Rib3RoKCIlI3giLCAwLCAiMHgwIikKKyAgICAgICAgdGVzdGJvdGgoIiUjeCIsIDBMLCAiMHgwIikKKyAgICAgICAgdGVzdGJvdGgoIiUjWCIsIDAsICIwWDAiKQorICAgICAgICB0ZXN0Ym90aCgiJSNYIiwgMEwsICIwWDAiKQorCisgICAgICAgIHRlc3Rib3RoKCIleCIsIDB4NDIsICI0MiIpCisgICAgICAgIHRlc3Rib3RoKCIleCIsIC0weDQyLCAiLTQyIikKKyAgICAgICAgdGVzdGJvdGgoIiV4IiwgMHg0MkwsICI0MiIpCisgICAgICAgIHRlc3Rib3RoKCIleCIsIC0weDQyTCwgIi00MiIpCisgICAgICAgIHRlc3Rib3RoKCIleCIsIGZsb2F0KDB4NDIpLCAiNDIiKQorCisgICAgICAgIHRlc3Rib3RoKCIlbyIsIDA0MiwgIjQyIikKKyAgICAgICAgdGVzdGJvdGgoIiVvIiwgLTA0MiwgIi00MiIpCisgICAgICAgIHRlc3Rib3RoKCIlbyIsIDA0MkwsICI0MiIpCisgICAgICAgIHRlc3Rib3RoKCIlbyIsIC0wNDJMLCAiLTQyIikKKyAgICAgICAgdGVzdGJvdGgoIiVvIiwgZmxvYXQoMDQyKSwgIjQyIikKKworICAgICAgICAjIGFsdGVybmF0ZSBmbG9hdCBmb3JtYXR0aW5nCisgICAgICAgIHRlc3Rmb3JtYXQoJyVnJywgMS4xLCAnMS4xJykKKyAgICAgICAgdGVzdGZvcm1hdCgnJSNnJywgMS4xLCAnMS4xMDAwMCcpCisKKyAgICAgICAgIyBSZWdyZXNzaW9uIHRlc3QgZm9yIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNTUxNi4KKyAgICAgICAgY2xhc3MgSW50RmFpbHMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQKKyAgICAgICAgICAgIGRlZiBfX2xvbmdfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIGZzdCA9IEludEZhaWxzKCkKKyAgICAgICAgdGVzdGZvcm1hdCgiJXgiLCBmc3QsICcwJykKKworICAgICAgICAjIFRlc3QgZXhjZXB0aW9uIGZvciB1bmtub3duIGZvcm1hdCBjaGFyYWN0ZXJzCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnVGVzdGluZyBleGNlcHRpb25zJworCisgICAgICAgIGRlZiB0ZXN0X2V4Yyhmb3JtYXRzdHIsIGFyZ3MsIGV4Y2VwdGlvbiwgZXhjbXNnKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ZXN0Zm9ybWF0KGZvcm1hdHN0ciwgYXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBleGNlcHRpb24sIGV4YzoKKyAgICAgICAgICAgICAgICBpZiBzdHIoZXhjKSA9PSBleGNtc2c6CisgICAgICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAieWVzIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICdubycKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ1VuZXhwZWN0ZWQgJywgZXhjZXB0aW9uLCAnOicsIHJlcHIoc3RyKGV4YykpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgJ25vJworICAgICAgICAgICAgICAgIHByaW50ICdVbmV4cGVjdGVkIGV4Y2VwdGlvbicKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAnZGlkIG5vdCBnZXQgZXhwZWN0ZWQgZXhjZXB0aW9uOiAlcycgJSBleGNtc2cKKworICAgICAgICB0ZXN0X2V4YygnYWJjICVhJywgMSwgVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGZvcm1hdCBjaGFyYWN0ZXIgJ2EnICgweDYxKSBhdCBpbmRleCA1IikKKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgdGVzdF9leGModW5pY29kZSgnYWJjICVcdTMwMDAnLCdyYXctdW5pY29kZS1lc2NhcGUnKSwgMSwgVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyICc/JyAoMHgzMDAwKSBhdCBpbmRleCA1IikKKworICAgICAgICB0ZXN0X2V4YygnJWQnLCAnMScsIFR5cGVFcnJvciwgIiVkIGZvcm1hdDogYSBudW1iZXIgaXMgcmVxdWlyZWQsIG5vdCBzdHIiKQorICAgICAgICB0ZXN0X2V4YygnJWcnLCAnMScsIFR5cGVFcnJvciwgImZsb2F0IGFyZ3VtZW50IHJlcXVpcmVkLCBub3Qgc3RyIikKKyAgICAgICAgdGVzdF9leGMoJ25vIGZvcm1hdCcsICcxJywgVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAibm90IGFsbCBhcmd1bWVudHMgY29udmVydGVkIGR1cmluZyBzdHJpbmcgZm9ybWF0dGluZyIpCisgICAgICAgIHRlc3RfZXhjKCdubyBmb3JtYXQnLCB1JzEnLCBUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJub3QgYWxsIGFyZ3VtZW50cyBjb252ZXJ0ZWQgZHVyaW5nIHN0cmluZyBmb3JtYXR0aW5nIikKKyAgICAgICAgdGVzdF9leGModSdubyBmb3JtYXQnLCAnMScsIFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgc3RyaW5nIGZvcm1hdHRpbmciKQorICAgICAgICB0ZXN0X2V4Yyh1J25vIGZvcm1hdCcsIHUnMScsIFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgc3RyaW5nIGZvcm1hdHRpbmciKQorCisgICAgICAgIGNsYXNzIEZvb2Jhcihsb25nKToKKyAgICAgICAgICAgIGRlZiBfX29jdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICMgUmV0dXJuaW5nIGEgbm9uLXN0cmluZyBzaG91bGQgbm90IGJsb3cgdXAuCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYgKyAxCisKKyAgICAgICAgdGVzdF9leGMoJyVvJywgRm9vYmFyKCksIFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwgbG9uZyBmb3VuZCIpCisKKyAgICAgICAgaWYgbWF4c2l6ZSA9PSAyKiozMS0xOgorICAgICAgICAgICAgIyBjcmFzaGVzIDIuMi4xIGFuZCBlYXJsaWVyOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICIlKmQiJShtYXhzaXplLCAtMTI3KQorICAgICAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgJyIlKmQiJShtYXhzaXplLCAtMTI3KSBzaG91bGQgZmFpbCcKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoRm9ybWF0VGVzdCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm9ybWF0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zvcm1hdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkNzdjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zvcm1hdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm9ybWF0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zvcm1hdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlkNzdjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zvcm1hdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnBmb3JtYXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mcGZvcm1hdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmRlM2IwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnBmb3JtYXQucHkKQEAgLTAsMCArMSw3NiBAQAorJycnCisgICBUZXN0cyBmb3IgZnBmb3JtYXQgbW9kdWxlCisgICBOaWNrIE1hdGhld3NvbgorJycnCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUKK2ltcG9ydCB1bml0dGVzdAorZnBmb3JtYXQgPSBpbXBvcnRfbW9kdWxlKCdmcGZvcm1hdCcsIGRlcHJlY2F0ZWQ9VHJ1ZSkKK2ZpeCwgc2NpLCBOb3RBTnVtYmVyID0gZnBmb3JtYXQuZml4LCBmcGZvcm1hdC5zY2ksIGZwZm9ybWF0Lk5vdEFOdW1iZXIKKworU3RyaW5nVHlwZSA9IHR5cGUoJycpCisKKyMgVGVzdCB0aGUgb2xkIGFuZCBvYnNvbGVzY2VudCBmcGZvcm1hdCBtb2R1bGUuCisjCisjIChJdCdzIG9ic29sZXNjZW50IGJlY2F1c2UgZml4KG4sZCkgPT0gIiUuKmYiJShkLG4pIGFuZAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjaShuLGQpID09ICIlLiplIiUoZCxuKQorIyAgZm9yIGFsbCByZWFzb25hYmxlIG51bWVyaWMgbiBhbmQgZCwgZXhjZXB0IHRoYXQgc2NpIGdpdmVzIDMgZXhwb25lbnQKKyMgIGRpZ2l0cyBpbnN0ZWFkIG9mIDIuCisjCisjIERpZmZlcmVuY2VzIG9ubHkgb2NjdXIgZm9yIHVucmVhc29uYWJsZSBuIGFuZCBkLiAgICA8LjIgd2luaz4pCisKK2NsYXNzIEZwZm9ybWF0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2tGaXgoc2VsZiwgbiwgZGlnaXRzKToKKyAgICAgICAgcmVzdWx0ID0gZml4KG4sIGRpZ2l0cykKKyAgICAgICAgaWYgaXNpbnN0YW5jZShuLCBTdHJpbmdUeXBlKToKKyAgICAgICAgICAgIG4gPSByZXByKG4pCisgICAgICAgIGV4cGVjdGVkID0gIiUuKmYiICUgKGRpZ2l0cywgZmxvYXQobikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorCisgICAgZGVmIGNoZWNrU2NpKHNlbGYsIG4sIGRpZ2l0cyk6CisgICAgICAgIHJlc3VsdCA9IHNjaShuLCBkaWdpdHMpCisgICAgICAgIGlmIGlzaW5zdGFuY2UobiwgU3RyaW5nVHlwZSk6CisgICAgICAgICAgICBuID0gcmVwcihuKQorICAgICAgICBleHBlY3RlZCA9ICIlLiplIiAlIChkaWdpdHMsIGZsb2F0KG4pKQorICAgICAgICAjIGFkZCB0aGUgZXh0cmEgMCBpZiBuZWVkZWQKKyAgICAgICAgbnVtLCBleHAgPSBleHBlY3RlZC5zcGxpdCgiZSIpCisgICAgICAgIGlmIGxlbihleHApIDwgNDoKKyAgICAgICAgICAgIGV4cCA9IGV4cFswXSArICIwIiArIGV4cFsxOl0KKyAgICAgICAgZXhwZWN0ZWQgPSAiJXNlJXMiICUgKG51bSwgZXhwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2Nhc2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeCgxMDAuMC8zLCAzKSwgJzMzLjMzMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2NpKDEwMC4wLzMsIDMpLCAnMy4zMzNlKzAwMScpCisKKyAgICBkZWYgdGVzdF9yZWFzb25hYmxlX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgZm9yIGQgaW4gcmFuZ2UoNyk6CisgICAgICAgICAgICBmb3IgdmFsIGluICgxMDAwLjAvMywgMTAwMCwgMTAwMC4wLCAuMDAyLCAxLjAvMywgMWUxMCk6CisgICAgICAgICAgICAgICAgZm9yIHJlYWxWYWwgaW4gKHZhbCwgMS4wL3ZhbCwgLXZhbCwgLTEuMC92YWwpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrRml4KHJlYWxWYWwsIGQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tTY2kocmVhbFZhbCwgZCkKKworICAgIGRlZiB0ZXN0X2ZhaWxpbmdfdmFsdWVzKHNlbGYpOgorICAgICAgICAjIE5vdyBmb3IgJ3VucmVhc29uYWJsZSBuIGFuZCBkJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeCgxLjAsIDEwMDApLCAnMS4nKygnMCcqMTAwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2NpKCIxIisoJzAnKjEwMDApLCAwKSwgJzFlKzEwMDAnKQorCisgICAgICAgICMgVGhpcyBiZWhhdmlvciBpcyBpbmNvbnNpc3RlbnQuICBzY2kgcmFpc2VzIGFuIGV4Y2VwdGlvbjsgZml4IGRvZXNuJ3QuCisgICAgICAgIHlhY2h0ID0gIlRocm9hdHdvYmJsZXIgTWFuZ3JvdmUiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZml4KHlhY2h0LCAxMCksIHlhY2h0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzY2koeWFjaHQsIDEwKQorICAgICAgICBleGNlcHQgTm90QU51bWJlcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIG9uIG5vbi1udW1lcmljIHNjaSIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChGcGZvcm1hdFRlc3QpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnBmb3JtYXQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnBmb3JtYXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGZlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mcGZvcm1hdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnBmb3JtYXQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnBmb3JtYXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGZlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mcGZvcm1hdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMDliYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mcmFjdGlvbnMucHkKQEAgLTAsMCArMSw2MDUgQEAKKyIiIlRlc3RzIGZvciBMaWIvZnJhY3Rpb25zLnB5LiIiIgorCitmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAoraW1wb3J0IG1hdGgKK2ltcG9ydCBudW1iZXJzCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBmcmFjdGlvbnMKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjb3B5IGltcG9ydCBjb3B5LCBkZWVwY29weQorZnJvbSBjUGlja2xlIGltcG9ydCBkdW1wcywgbG9hZHMKK0YgPSBmcmFjdGlvbnMuRnJhY3Rpb24KK2djZCA9IGZyYWN0aW9ucy5nY2QKKworIyBkZWNvcmF0b3IgZm9yIHNraXBwaW5nIHRlc3RzIG9uIG5vbi1JRUVFIDc1NCBwbGF0Zm9ybXMKK3JlcXVpcmVzX0lFRUVfNzU0ID0gdW5pdHRlc3Quc2tpcFVubGVzcygKKyAgICBmbG9hdC5fX2dldGZvcm1hdF9fKCJkb3VibGUiKS5zdGFydHN3aXRoKCJJRUVFIiksCisgICAgInRlc3QgcmVxdWlyZXMgSUVFRSA3NTQgZG91YmxlcyIpCisKK2NsYXNzIER1bW15RmxvYXQob2JqZWN0KToKKyAgICAiIiJEdW1teSBmbG9hdCBjbGFzcyBmb3IgdGVzdGluZyBjb21wYXJpc29ucyB3aXRoIEZyYWN0aW9ucyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiRHVtbXlGbG9hdCBjYW4gb25seSBiZSBpbml0aWFsaXplZCBmcm9tIGZsb2F0IikKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisKKyAgICBkZWYgX3JpY2hjbXAoc2VsZiwgb3RoZXIsIG9wKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgbnVtYmVycy5SYXRpb25hbCk6CisgICAgICAgICAgICByZXR1cm4gb3AoRi5mcm9tX2Zsb2F0KHNlbGYudmFsdWUpLCBvdGhlcikKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBEdW1teUZsb2F0KToKKyAgICAgICAgICAgIHJldHVybiBvcChzZWxmLnZhbHVlLCBvdGhlci52YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IHJldHVybiBzZWxmLl9yaWNoY21wKG90aGVyLCBvcGVyYXRvci5lcSkKKyAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTogcmV0dXJuIHNlbGYuX3JpY2hjbXAob3RoZXIsIG9wZXJhdG9yLmxlKQorICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOiByZXR1cm4gc2VsZi5fcmljaGNtcChvdGhlciwgb3BlcmF0b3IubHQpCisgICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6IHJldHVybiBzZWxmLl9yaWNoY21wKG90aGVyLCBvcGVyYXRvci5nZSkKKyAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKTogcmV0dXJuIHNlbGYuX3JpY2hjbXAob3RoZXIsIG9wZXJhdG9yLmd0KQorCisgICAgIyBzaG91bGRuJ3QgYmUgY2FsbGluZyBfX2Zsb2F0X18gYXQgYWxsIHdoZW4gZG9pbmcgY29tcGFyaXNvbnMKKyAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICBhc3NlcnQgRmFsc2UsICJfX2Zsb2F0X18gc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wYXJpc29ucyIKKworICAgICMgc2FtZSBnb2VzIGZvciBzdWJ0cmFjdGlvbgorICAgIGRlZiBfX3N1Yl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgYXNzZXJ0IEZhbHNlLCAiX19zdWJfXyBzaG91bGQgbm90IGJlIGludm9rZWQgZm9yIGNvbXBhcmlzb25zIgorICAgIF9fcnN1Yl9fID0gX19zdWJfXworCisgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgIF9faGFzaF9fID0gTm9uZQorCisKK2NsYXNzIER1bW15UmF0aW9uYWwob2JqZWN0KToKKyAgICAiIiJUZXN0IGNvbXBhcmlzb24gb2YgRnJhY3Rpb24gd2l0aCBhIG5haXZlIHJhdGlvbmFsIGltcGxlbWVudGF0aW9uLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG51bSwgZGVuKToKKyAgICAgICAgZyA9IGdjZChudW0sIGRlbikKKyAgICAgICAgc2VsZi5udW0gPSBudW0gLy8gZworICAgICAgICBzZWxmLmRlbiA9IGRlbiAvLyBnCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgZnJhY3Rpb25zLkZyYWN0aW9uKToKKyAgICAgICAgICAgIHJldHVybiAoc2VsZi5udW0gPT0gb3RoZXIuX251bWVyYXRvciBhbmQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kZW4gPT0gb3RoZXIuX2Rlbm9taW5hdG9yKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuKHNlbGYubnVtICogb3RoZXIuX2Rlbm9taW5hdG9yIDwgc2VsZi5kZW4gKiBvdGhlci5fbnVtZXJhdG9yKQorCisgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybihzZWxmLm51bSAqIG90aGVyLl9kZW5vbWluYXRvciA+IHNlbGYuZGVuICogb3RoZXIuX251bWVyYXRvcikKKworICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4oc2VsZi5udW0gKiBvdGhlci5fZGVub21pbmF0b3IgPD0gc2VsZi5kZW4gKiBvdGhlci5fbnVtZXJhdG9yKQorCisgICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybihzZWxmLm51bSAqIG90aGVyLl9kZW5vbWluYXRvciA+PSBzZWxmLmRlbiAqIG90aGVyLl9udW1lcmF0b3IpCisKKyAgICAjIHRoaXMgY2xhc3MgaXMgZm9yIHRlc3RpbmcgY29tcGFyaXNvbnM7IGNvbnZlcnNpb24gdG8gZmxvYXQKKyAgICAjIHNob3VsZCBuZXZlciBiZSB1c2VkIGZvciBhIGNvbXBhcmlzb24sIHNpbmNlIGl0IGxvc2VzIGFjY3VyYWN5CisgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgYXNzZXJ0IEZhbHNlLCAiX19mbG9hdF9fIHNob3VsZCBub3QgYmUgaW52b2tlZCIKKworICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKyAgICBfX2hhc2hfXyA9IE5vbmUKKworCitjbGFzcyBEdW1teUZyYWN0aW9uKGZyYWN0aW9ucy5GcmFjdGlvbik6CisgICAgIiIiRHVtbXkgRnJhY3Rpb24gc3ViY2xhc3MgZm9yIGNvcHkgYW5kIGRlZXBjb3B5IHRlc3RpbmcuIiIiCisKK2NsYXNzIEdjZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RNaXNjKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdjZCgwLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBnY2QoMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIGdjZCgtMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgZ2NkKDAsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCBnY2QoMCwgLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGdjZCg3LCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgZ2NkKDcsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBnY2QoLTIzLCAxNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIsIGdjZCgxMjAsIDg0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMTIsIGdjZCg4NCwgLTEyMCkpCisKKworZGVmIF9jb21wb25lbnRzKHIpOgorICAgIHJldHVybiAoci5udW1lcmF0b3IsIHIuZGVub21pbmF0b3IpCisKKworY2xhc3MgRnJhY3Rpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBhc3NlcnRUeXBlZEVxdWFscyhzZWxmLCBleHBlY3RlZCwgYWN0dWFsKToKKyAgICAgICAgIiIiQXNzZXJ0cyB0aGF0IGJvdGggdGhlIHR5cGVzIGFuZCB2YWx1ZXMgYXJlIHRoZSBzYW1lLiIiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZXhwZWN0ZWQpLCB0eXBlKGFjdHVhbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkKKworICAgIGRlZiBhc3NlcnRSYWlzZXNNZXNzYWdlKHNlbGYsIGV4Y190eXBlLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiJBc3NlcnRzIHRoYXQgY2FsbGFibGUoKmFyZ3MsICoqa3dhcmdzKSByYWlzZXMgZXhjX3R5cGUobWVzc2FnZSkuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNhbGxhYmxlKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgZXhjZXB0IGV4Y190eXBlLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBzdHIoZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIiVzIG5vdCByYWlzZWQiICUgZXhjX3R5cGUuX19uYW1lX18pCisKKyAgICBkZWYgdGVzdEluaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAsIDEpLCBfY29tcG9uZW50cyhGKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg3LCAxKSwgX2NvbXBvbmVudHMoRig3KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDcsIDMpLCBfY29tcG9uZW50cyhGKEYoNywgMykpKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtMSwgMSksIF9jb21wb25lbnRzKEYoLTEsIDEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTEsIDEpLCBfY29tcG9uZW50cyhGKDEsIC0xKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEsIDEpLCBfY29tcG9uZW50cyhGKC0yLCAtMikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxLCAyKSwgX2NvbXBvbmVudHMoRig1LCAxMCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg3LCAxNSksIF9jb21wb25lbnRzKEYoNywgMTUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMTAqKjIzLCAxKSwgX2NvbXBvbmVudHMoRigxMCoqMjMpKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgzLCA3NyksIF9jb21wb25lbnRzKEYoRigzLCA3KSwgMTEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTksIDUpLCBfY29tcG9uZW50cyhGKDIsIEYoLTEwLCA5KSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgyNDg2LCAyNDg1KSwgX2NvbXBvbmVudHMoRihGKDIyLCA3KSwgRigzNTUsIDExMykpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoWmVyb0RpdmlzaW9uRXJyb3IsICJGcmFjdGlvbigxMiwgMCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRiwgMTIsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgMS41ICsgM2opCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLCAiMy8yIiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLCAzLCAwaikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLCAzLCAxaikKKworICAgIEByZXF1aXJlc19JRUVFXzc1NAorICAgIGRlZiB0ZXN0SW5pdEZyb21GbG9hdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSwgMiksIF9jb21wb25lbnRzKEYoMi41KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAsIDEpLCBfY29tcG9uZW50cyhGKC0wLjApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMzYwMjg3OTcwMTg5NjM5NywgMzYwMjg3OTcwMTg5NjM5NjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnRzKEYoMC4xKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgZmxvYXQoJ25hbicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEYsIGZsb2F0KCdpbmYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLCBmbG9hdCgnLWluZicpKQorCisgICAgZGVmIHRlc3RJbml0RnJvbURlY2ltYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDExLCAxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudHMoRihEZWNpbWFsKCcxLjEnKSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg3LCAyMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnRzKEYoRGVjaW1hbCgnMy41ZS0yJykpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudHMoRihEZWNpbWFsKCcuMDAwZTIwJykpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLCBEZWNpbWFsKCduYW4nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLCBEZWNpbWFsKCdzbmFuJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgRGVjaW1hbCgnaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgRGVjaW1hbCgnLWluZicpKQorCisgICAgZGVmIHRlc3RGcm9tU3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg1LCAxKSwgX2NvbXBvbmVudHMoRigiNSIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMywgMiksIF9jb21wb25lbnRzKEYoIjMvMiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMywgMiksIF9jb21wb25lbnRzKEYoIiBcbiAgKzMvMiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTMsIDIpLCBfY29tcG9uZW50cyhGKCItMy8yICAiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEzLCAyKSwgX2NvbXBvbmVudHMoRigiICAgIDAxMy8wMiBcbiAgIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxMywgMiksIF9jb21wb25lbnRzKEYodSIgICAgMDEzLzAyIFxuICAiKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMTYsIDUpLCBfY29tcG9uZW50cyhGKCIgMy4yICIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTE2LCA1KSwgX2NvbXBvbmVudHMoRih1IiAtMy4yICIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTMsIDEpLCBfY29tcG9uZW50cyhGKHUiIC0zLiAiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDMsIDUpLCBfY29tcG9uZW50cyhGKHUiIC42ICIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMSwgMzEyNSksIF9jb21wb25lbnRzKEYoIjMyLmUtNSIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMTAwMDAwMCwgMSksIF9jb21wb25lbnRzKEYoIjFFKzA2IikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtMTIzMDAsIDEpLCBfY29tcG9uZW50cyhGKCItMS4yM2U0IikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwLCAxKSwgX2NvbXBvbmVudHMoRigiIC4wZSswXHQiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAsIDEpLCBfY29tcG9uZW50cyhGKCItMC4wMDBlMCIpKSkKKworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgIFplcm9EaXZpc2lvbkVycm9yLCAiRnJhY3Rpb24oMywgMCkiLAorICAgICAgICAgICAgRiwgIjMvMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJJbnZhbGlkIGxpdGVyYWwgZm9yIEZyYWN0aW9uOiAnMy8nIiwKKyAgICAgICAgICAgIEYsICIzLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJJbnZhbGlkIGxpdGVyYWwgZm9yIEZyYWN0aW9uOiAnLzInIiwKKyAgICAgICAgICAgIEYsICIvMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJJbnZhbGlkIGxpdGVyYWwgZm9yIEZyYWN0aW9uOiAnMyAvMiciLAorICAgICAgICAgICAgRiwgIjMgLzIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICAjIERlbm9taW5hdG9ycyBkb24ndCBuZWVkIGEgc2lnbi4KKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJJbnZhbGlkIGxpdGVyYWwgZm9yIEZyYWN0aW9uOiAnMy8rMiciLAorICAgICAgICAgICAgRiwgIjMvKzIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICAjIEltaXRhdGUgZmxvYXQncyBwYXJzaW5nLgorICAgICAgICAgICAgVmFsdWVFcnJvciwgIkludmFsaWQgbGl0ZXJhbCBmb3IgRnJhY3Rpb246ICcrIDMvMiciLAorICAgICAgICAgICAgRiwgIisgMy8yIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgIyBBdm9pZCB0cmVhdGluZyAnLicgYXMgYSByZWdleCBzcGVjaWFsIGNoYXJhY3Rlci4KKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJJbnZhbGlkIGxpdGVyYWwgZm9yIEZyYWN0aW9uOiAnM2EyJyIsCisgICAgICAgICAgICBGLCAiM2EyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgIyBEb24ndCBhY2NlcHQgY29tYmluYXRpb25zIG9mIGRlY2ltYWxzIGFuZCBmcmFjdGlvbnMuCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiSW52YWxpZCBsaXRlcmFsIGZvciBGcmFjdGlvbjogJzMvNy4yJyIsCisgICAgICAgICAgICBGLCAiMy83LjIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICAjIERvbid0IGFjY2VwdCBjb21iaW5hdGlvbnMgb2YgZGVjaW1hbHMgYW5kIGZyYWN0aW9ucy4KKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJJbnZhbGlkIGxpdGVyYWwgZm9yIEZyYWN0aW9uOiAnMy4yLzcnIiwKKyAgICAgICAgICAgIEYsICIzLjIvNyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgICMgQWxsb3cgMy4gYW5kIC4zLCBidXQgbm90IC4KKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJJbnZhbGlkIGxpdGVyYWwgZm9yIEZyYWN0aW9uOiAnLiciLAorICAgICAgICAgICAgRiwgIi4iKQorCisgICAgZGVmIHRlc3RJbW11dGFibGUoc2VsZik6CisgICAgICAgIHIgPSBGKDcsIDMpCisgICAgICAgIHIuX19pbml0X18oMiwgMTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDcsIDMpLCBfY29tcG9uZW50cyhyKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgciwgJ251bWVyYXRvcicsIDEyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgciwgJ2Rlbm9taW5hdG9yJywgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNywgMyksIF9jb21wb25lbnRzKHIpKQorCisgICAgICAgICMgQnV0IGlmIHlvdSBfcmVhbGx5XyBuZWVkIHRvOgorICAgICAgICByLl9udW1lcmF0b3IgPSA0CisgICAgICAgIHIuX2Rlbm9taW5hdG9yID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg0LCAyKSwgX2NvbXBvbmVudHMocikpCisgICAgICAgICMgV2hpY2ggYnJlYWtzIHNvbWUgaW1wb3J0YW50IG9wZXJhdGlvbnM6CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoRig0LCAyKSwgcikKKworICAgIGRlZiB0ZXN0RnJvbUZsb2F0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEYuZnJvbV9mbG9hdCwgMys0aikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMTAsIDEpLCBfY29tcG9uZW50cyhGLmZyb21fZmxvYXQoMTApKSkKKyAgICAgICAgYmlnaW50ID0gMTIzNDU2Nzg5MDEyMzQ1Njc4OQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChiaWdpbnQsIDEpLCBfY29tcG9uZW50cyhGLmZyb21fZmxvYXQoYmlnaW50KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAsIDEpLCBfY29tcG9uZW50cyhGLmZyb21fZmxvYXQoLTAuMCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxMCwgMSksIF9jb21wb25lbnRzKEYuZnJvbV9mbG9hdCgxMC4wKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC01LCAyKSwgX2NvbXBvbmVudHMoRi5mcm9tX2Zsb2F0KC0yLjUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoOTk5OTk5OTk5OTk5OTk5OTE2MTEzOTIsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnRzKEYuZnJvbV9mbG9hdCgxZTIzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoMTAqKjIzKSwgZmxvYXQoRi5mcm9tX2Zsb2F0KDFlMjMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMzYwMjg3OTcwMTg5NjM5NywgMTEyNTg5OTkwNjg0MjYyNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudHMoRi5mcm9tX2Zsb2F0KDMuMikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMuMiwgZmxvYXQoRi5mcm9tX2Zsb2F0KDMuMikpKQorCisgICAgICAgIGluZiA9IDFlMTAwMAorICAgICAgICBuYW4gPSBpbmYgLSBpbmYKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgVHlwZUVycm9yLCAiQ2Fubm90IGNvbnZlcnQgaW5mIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBGLmZyb21fZmxvYXQsIGluZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgVHlwZUVycm9yLCAiQ2Fubm90IGNvbnZlcnQgLWluZiB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgRi5mcm9tX2Zsb2F0LCAtaW5mKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICBUeXBlRXJyb3IsICJDYW5ub3QgY29udmVydCBuYW4gdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIEYuZnJvbV9mbG9hdCwgbmFuKQorCisgICAgZGVmIHRlc3RGcm9tRGVjaW1hbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLmZyb21fZGVjaW1hbCwgMys0aikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGKDEwLCAxKSwgRi5mcm9tX2RlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoMCksIEYuZnJvbV9kZWNpbWFsKERlY2ltYWwoIi0wIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoNSwgMTApLCBGLmZyb21fZGVjaW1hbChEZWNpbWFsKCIwLjUiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRig1LCAxMDAwKSwgRi5mcm9tX2RlY2ltYWwoRGVjaW1hbCgiNWUtMyIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGKDUwMDApLCBGLmZyb21fZGVjaW1hbChEZWNpbWFsKCI1ZTMiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSAtIEYoMSwgMTAqKjMwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGLmZyb21fZGVjaW1hbChEZWNpbWFsKCIwLiIgKyAiOSIgKiAzMCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgIFR5cGVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IEluZmluaXR5IHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBGLmZyb21fZGVjaW1hbCwgRGVjaW1hbCgiaW5mIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgIFR5cGVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IC1JbmZpbml0eSB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgRi5mcm9tX2RlY2ltYWwsIERlY2ltYWwoIi1pbmYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgVHlwZUVycm9yLCAiQ2Fubm90IGNvbnZlcnQgTmFOIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBGLmZyb21fZGVjaW1hbCwgRGVjaW1hbCgibmFuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgIFR5cGVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IHNOYU4gdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIEYuZnJvbV9kZWNpbWFsLCBEZWNpbWFsKCJzbmFuIikpCisKKyAgICBkZWYgdGVzdExpbWl0RGVub21pbmF0b3Ioc2VsZik6CisgICAgICAgIHJwaSA9IEYoJzMuMTQxNTkyNjUzNTg5NzkzMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnBpLmxpbWl0X2Rlbm9taW5hdG9yKDEwMDAwKSwgRigzNTUsIDExMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLXJwaS5saW1pdF9kZW5vbWluYXRvcigxMDAwMCksIEYoLTM1NSwgMTEzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChycGkubGltaXRfZGVub21pbmF0b3IoMTEzKSwgRigzNTUsIDExMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnBpLmxpbWl0X2Rlbm9taW5hdG9yKDExMiksIEYoMzMzLCAxMDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoMjAxLCAyMDApLmxpbWl0X2Rlbm9taW5hdG9yKDEwMCksIEYoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRigyMDEsIDIwMCkubGltaXRfZGVub21pbmF0b3IoMTAxKSwgRigxMDIsIDEwMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRigwKS5saW1pdF9kZW5vbWluYXRvcigxMDAwMCksIEYoMCkpCisgICAgICAgIGZvciBpIGluICgwLCAtMSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICAgICAgVmFsdWVFcnJvciwgIm1heF9kZW5vbWluYXRvciBzaG91bGQgYmUgYXQgbGVhc3QgMSIsCisgICAgICAgICAgICAgICAgRigxKS5saW1pdF9kZW5vbWluYXRvciwgaSkKKworICAgIGRlZiB0ZXN0Q29udmVyc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoLTEsIG1hdGgudHJ1bmMoRigtMTEsIDEwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoLTEsIGludChGKC0xMSwgMTApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygxLCBtYXRoLnRydW5jKEYoMTEsIDEwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGJvb2woRigwLCAxKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgYm9vbChGKDMsIDIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjEsIGZsb2F0KEYoMSwgMTApKSkKKworICAgICAgICAjIENoZWNrIHRoYXQgX19mbG9hdF9fIGlzbid0IGltcGxlbWVudGVkIGJ5IGNvbnZlcnRpbmcgdGhlCisgICAgICAgICMgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciB0byBmbG9hdCBiZWZvcmUgZGl2aWRpbmcuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZsb2F0LCBsb25nKCcyJyo0MDArJzcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgyLjAvMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQoRihsb25nKCcyJyo0MDArJzcnKSwgbG9uZygnMycqNDAwKycxJykpKSkKKworICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDAuMSswaiwgY29tcGxleChGKDEsMTApKSkKKworCisgICAgZGVmIHRlc3RBcml0aG1ldGljKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoMSwgMiksIEYoMSwgMTApICsgRigyLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGKC0zLCAxMCksIEYoMSwgMTApIC0gRigyLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGKDEsIDI1KSwgRigxLCAxMCkgKiBGKDIsIDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoMSwgNCksIEYoMSwgMTApIC8gRigyLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygyLCBGKDksIDEwKSAvLyBGKDIsIDUpKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDEwKioyMywgRigxMCoqMjMsIDEpIC8vIEYoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRigyLCAzKSwgRigtNywgMykgJSBGKDMsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoOCwgMjcpLCBGKDIsIDMpICoqIEYoMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRigyNywgOCksIEYoMiwgMykgKiogRigtMykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMi4wLCBGKDQpICoqIEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRigxLCAxKSwgK0YoMSwgMSkpCisgICAgICAgICMgV2lsbCByZXR1cm4gMWogaW4gMy4wOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwb3csIEYoLTEpLCBGKDEsIDIpKQorCisgICAgZGVmIHRlc3RNaXhlZEFyaXRobWV0aWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoRigxMSwgMTApLCBGKDEsIDEwKSArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMS4xLCBGKDEsIDEwKSArIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygxLjEgKyAwaiwgRigxLCAxMCkgKyAoMS4wICsgMGopKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKEYoMTEsIDEwKSwgMSArIEYoMSwgMTApKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDEuMSwgMS4wICsgRigxLCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMS4xICsgMGosICgxLjAgKyAwaikgKyBGKDEsIDEwKSkKKworICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKEYoLTksIDEwKSwgRigxLCAxMCkgLSAxKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKC0wLjksIEYoMSwgMTApIC0gMS4wKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKC0wLjkgKyAwaiwgRigxLCAxMCkgLSAoMS4wICsgMGopKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKEYoOSwgMTApLCAxIC0gRigxLCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMC45LCAxLjAgLSBGKDEsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjkgKyAwaiwgKDEuMCArIDBqKSAtIEYoMSwgMTApKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoRigxLCAxMCksIEYoMSwgMTApICogMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjEsIEYoMSwgMTApICogMS4wKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDAuMSArIDBqLCBGKDEsIDEwKSAqICgxLjAgKyAwaikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoRigxLCAxMCksIDEgKiBGKDEsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjEsIDEuMCAqIEYoMSwgMTApKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDAuMSArIDBqLCAoMS4wICsgMGopICogRigxLCAxMCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscyhGKDEsIDEwKSwgRigxLCAxMCkgLyAxKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDAuMSwgRigxLCAxMCkgLyAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMC4xICsgMGosIEYoMSwgMTApIC8gKDEuMCArIDBqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscyhGKDEwLCAxKSwgMSAvIEYoMSwgMTApKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDEwLjAsIDEuMCAvIEYoMSwgMTApKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDEwLjAgKyAwaiwgKDEuMCArIDBqKSAvIEYoMSwgMTApKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMCwgRigxLCAxMCkgLy8gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjAsIEYoMSwgMTApIC8vIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygxMCwgMSAvLyBGKDEsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygxMCoqMjMsIDEwKioyMiAvLyBGKDEsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygxMC4wLCAxLjAgLy8gRigxLCAxMCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscyhGKDEsIDEwKSwgRigxLCAxMCkgJSAxKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDAuMSwgRigxLCAxMCkgJSAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoRigwLCAxKSwgMSAlIEYoMSwgMTApKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDAuMCwgMS4wICUgRigxLCAxMCkpCisKKyAgICAgICAgIyBObyBuZWVkIGZvciBkaXZtb2Qgc2luY2Ugd2UgZG9uJ3Qgb3ZlcnJpZGUgaXQuCisKKyAgICAgICAgIyAqKiBoYXMgbW9yZSBpbnRlcmVzdGluZyBjb252ZXJzaW9uIHJ1bGVzLgorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKEYoMTAwLCAxKSwgRigxLCAxMCkgKiogLTIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoRigxMDAsIDEpLCBGKDEwLCAxKSAqKiAyKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDAuMSwgRigxLCAxMCkgKiogMS4wKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDAuMSArIDBqLCBGKDEsIDEwKSAqKiAoMS4wICsgMGopKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDQgLCAyICoqIEYoMiwgMSkpCisgICAgICAgICMgV2lsbCByZXR1cm4gMWogaW4gMy4wOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwb3csICgtMSksIEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoRigxLCA0KSAsIDIgKiogRigtMiwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMi4wICwgNCAqKiBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDAuMjUsIDIuMCAqKiBGKC0yLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygxLjAgKyAwaiwgKDEuMCArIDBqKSAqKiBGKDEsIDEwKSkKKworICAgIGRlZiB0ZXN0TWl4aW5nV2l0aERlY2ltYWwoc2VsZik6CisgICAgICAgICMgRGVjaW1hbCByZWZ1c2VzIG1peGVkIGNvbXBhcmlzb25zLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgICAidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciArOiAnRnJhY3Rpb24nIGFuZCAnRGVjaW1hbCciLAorICAgICAgICAgICAgb3BlcmF0b3IuYWRkLCBGKDMsMTEpLCBEZWNpbWFsKCczLjE0MTU5MjYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgKzogJ0RlY2ltYWwnIGFuZCAnRnJhY3Rpb24nIiwKKyAgICAgICAgICAgIG9wZXJhdG9yLmFkZCwgRGVjaW1hbCgnMy4xNDE1OTI2JyksIEYoMywxMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoRig1LCAyKSwgRGVjaW1hbCgnMi41JykpCisKKyAgICBkZWYgdGVzdENvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSA8IEYoMiwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxLCAyKSA8IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDEsIDIpIDw9IEYoMiwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDEsIDIpIDw9IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigyLCAzKSA8PSBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSA9PSBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEYoMSwgMikgPT0gRigxLCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEsIDIpICE9IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDEsIDIpICE9IEYoMSwgMykpCisKKyAgICBkZWYgdGVzdENvbXBhcmlzb25zRHVtbXlSYXRpb25hbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEYoMSwgMikgPT0gRHVtbXlSYXRpb25hbCgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKER1bW15UmF0aW9uYWwoMSwgMikgPT0gRigxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEsIDIpID09IER1bW15UmF0aW9uYWwoMywgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRHVtbXlSYXRpb25hbCgzLCA0KSA9PSBGKDEsIDIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDEsIDIpIDwgRHVtbXlSYXRpb25hbCgzLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEsIDIpIDwgRHVtbXlSYXRpb25hbCgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEsIDIpIDwgRHVtbXlSYXRpb25hbCgxLCA3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEsIDIpID4gRHVtbXlSYXRpb25hbCgzLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEsIDIpID4gRHVtbXlSYXRpb25hbCgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEYoMSwgMikgPiBEdW1teVJhdGlvbmFsKDEsIDcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSA8PSBEdW1teVJhdGlvbmFsKDMsIDQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSA8PSBEdW1teVJhdGlvbmFsKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEYoMSwgMikgPD0gRHVtbXlSYXRpb25hbCgxLCA3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEsIDIpID49IER1bW15UmF0aW9uYWwoMywgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDEsIDIpID49IER1bW15UmF0aW9uYWwoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDEsIDIpID49IER1bW15UmF0aW9uYWwoMSwgNykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKER1bW15UmF0aW9uYWwoMSwgMikgPCBGKDMsIDQpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKER1bW15UmF0aW9uYWwoMSwgMikgPCBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKER1bW15UmF0aW9uYWwoMSwgMikgPCBGKDEsIDcpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKER1bW15UmF0aW9uYWwoMSwgMikgPiBGKDMsIDQpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKER1bW15UmF0aW9uYWwoMSwgMikgPiBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRHVtbXlSYXRpb25hbCgxLCAyKSA+IEYoMSwgNykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEdW1teVJhdGlvbmFsKDEsIDIpIDw9IEYoMywgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEdW1teVJhdGlvbmFsKDEsIDIpIDw9IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRHVtbXlSYXRpb25hbCgxLCAyKSA8PSBGKDEsIDcpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKER1bW15UmF0aW9uYWwoMSwgMikgPj0gRigzLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKER1bW15UmF0aW9uYWwoMSwgMikgPj0gRigxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKER1bW15UmF0aW9uYWwoMSwgMikgPj0gRigxLCA3KSkKKworICAgIGRlZiB0ZXN0Q29tcGFyaXNvbnNEdW1teUZsb2F0KHNlbGYpOgorICAgICAgICB4ID0gRHVtbXlGbG9hdCgxLi8zLikKKyAgICAgICAgeSA9IEYoMSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggIT0geSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggPCB5IG9yIHggPiB5KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHggPT0geSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh4IDw9IHkgYW5kIHggPj0geSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgIT0geCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgPCB4IG9yIHkgPiB4KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHkgPT0geCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh5IDw9IHggYW5kIHkgPj0geCkKKworICAgIGRlZiB0ZXN0TWl4ZWRMZXNzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoMiA8IEYoNSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoMiA8IEYoNCwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDUsIDIpIDwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDQsIDIpIDwgMikKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSA8IDAuNikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEsIDIpIDwgMC40KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMC40IDwgRigxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgwLjUgPCBGKDEsIDIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmxvYXQoJ2luZicpIDwgRigxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZsb2F0KCctaW5mJykgPCBGKDAsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmbG9hdCgnbmFuJykgPCBGKC0zLCA3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEYoMSwgMikgPCBmbG9hdCgnaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxNywgMTIpIDwgZmxvYXQoJy1pbmYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDE0NCwgLTg5KSA8IGZsb2F0KCduYW4nKSkKKworICAgIGRlZiB0ZXN0TWl4ZWRMZXNzRXF1YWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwLjUgPD0gRigxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgwLjYgPD0gRigxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEYoMSwgMikgPD0gMC41KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEYoMSwgMikgPD0gMC40KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMiA8PSBGKDQsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDIgPD0gRigzLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEYoNCwgMikgPD0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDUsIDIpIDw9IDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmbG9hdCgnaW5mJykgPD0gRigxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZsb2F0KCctaW5mJykgPD0gRigwLCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmxvYXQoJ25hbicpIDw9IEYoLTMsIDcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSA8PSBmbG9hdCgnaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxNywgMTIpIDw9IGZsb2F0KCctaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxNDQsIC04OSkgPD0gZmxvYXQoJ25hbicpKQorCisgICAgZGVmIHRlc3RCaWdGbG9hdENvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICAjIEJlY2F1c2UgMTAqKjIzIGNhbid0IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkgYXMgYSBmbG9hdDoKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEwKioyMykgPT0gZmxvYXQoMTAqKjIzKSkKKyAgICAgICAgIyBUaGUgZmlyc3QgdGVzdCBkZW1vbnN0cmF0ZXMgd2h5IHRoZXNlIGFyZSBpbXBvcnRhbnQuCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoMWUyMyA8IGZsb2F0KEYobWF0aC50cnVuYygxZTIzKSArIDEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDFlMjMgPCBGKG1hdGgudHJ1bmMoMWUyMykgKyAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgxZTIzIDw9IEYobWF0aC50cnVuYygxZTIzKSAtIDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMWUyMyA+IEYobWF0aC50cnVuYygxZTIzKSAtIDEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDFlMjMgPj0gRihtYXRoLnRydW5jKDFlMjMpICsgMSkpCisKKyAgICBkZWYgdGVzdEJpZ0NvbXBsZXhDb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEwKioyMykgPT0gY29tcGxleCgxMCoqMjMpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmd0LCBGKDEwKioyMyksIGNvbXBsZXgoMTAqKjIzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sZSwgRigxMCoqMjMpLCBjb21wbGV4KDEwKioyMykpCisKKyAgICAgICAgeCA9IEYoMywgOCkKKyAgICAgICAgeiA9IGNvbXBsZXgoMC4zNzUsIDAuMCkKKyAgICAgICAgdyA9IGNvbXBsZXgoMC4zNzUsIDAuMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggPT0geikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh4ICE9IHopCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoeCA9PSB3KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCAhPSB3KQorICAgICAgICBmb3Igb3AgaW4gb3BlcmF0b3IubHQsIG9wZXJhdG9yLmxlLCBvcGVyYXRvci5ndCwgb3BlcmF0b3IuZ2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wLCB4LCB6KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcCwgeiwgeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3AsIHgsIHcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wLCB3LCB4KQorCisgICAgZGVmIHRlc3RNaXhlZEVxdWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoMC41ID09IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoMC42ID09IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDEsIDIpID09IDAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEsIDIpID09IDAuNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIgPT0gRig0LCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgyID09IEYoMywgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDQsIDIpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRig1LCAyKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEYoNSwgMikgPT0gZmxvYXQoJ25hbicpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZsb2F0KCduYW4nKSA9PSBGKDMsIDcpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEYoNSwgMikgPT0gZmxvYXQoJ2luZicpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZsb2F0KCctaW5mJykgPT0gRigyLCA1KSkKKworICAgIGRlZiB0ZXN0U3RyaW5naWZpY2F0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJGcmFjdGlvbig3LCAzKSIsIHJlcHIoRig3LCAzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkZyYWN0aW9uKDYyODMxODUzMDcsIDIwMDAwMDAwMDApIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXByKEYoJzMuMTQxNTkyNjUzNScpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiRnJhY3Rpb24oLTEsIDEwMDAwMDAwMDAwMDAwMDAwMDAwMCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIoRigxLCAtMTAqKjIwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjcvMyIsIHN0cihGKDcsIDMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiNyIsIHN0cihGKDcsIDEpKSkKKworICAgIGRlZiB0ZXN0SGFzaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKDIuNSksIGhhc2goRig1LCAyKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCgxMCoqNTApLCBoYXNoKEYoMTAqKjUwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaGFzaChmbG9hdCgxMCoqMjMpKSwgaGFzaChGKDEwKioyMykpKQorCisgICAgZGVmIHRlc3RBcHByb3hpbWF0ZVBpKHNlbGYpOgorICAgICAgICAjIEFsZ29yaXRobSBib3Jyb3dlZCBmcm9tCisgICAgICAgICMgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWIvZGVjaW1hbC1yZWNpcGVzLmh0bWwKKyAgICAgICAgdGhyZWUgPSBGKDMpCisgICAgICAgIGxhc3RzLCB0LCBzLCBuLCBuYSwgZCwgZGEgPSAwLCB0aHJlZSwgMywgMSwgMCwgMCwgMjQKKyAgICAgICAgd2hpbGUgYWJzKHMgLSBsYXN0cykgPiBGKDEsIDEwKio5KToKKyAgICAgICAgICAgIGxhc3RzID0gcworICAgICAgICAgICAgbiwgbmEgPSBuK25hLCBuYSs4CisgICAgICAgICAgICBkLCBkYSA9IGQrZGEsIGRhKzMyCisgICAgICAgICAgICB0ID0gKHQgKiBuKSAvIGQKKyAgICAgICAgICAgIHMgKz0gdAorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKG1hdGgucGksIHMpCisKKyAgICBkZWYgdGVzdEFwcHJveGltYXRlQ29zMShzZWxmKToKKyAgICAgICAgIyBBbGdvcml0aG0gYm9ycm93ZWQgZnJvbQorICAgICAgICAjIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGliL2RlY2ltYWwtcmVjaXBlcy5odG1sCisgICAgICAgIHggPSBGKDEpCisgICAgICAgIGksIGxhc3RzLCBzLCBmYWN0LCBudW0sIHNpZ24gPSAwLCAwLCBGKDEpLCAxLCAxLCAxCisgICAgICAgIHdoaWxlIGFicyhzIC0gbGFzdHMpID4gRigxLCAxMCoqOSk6CisgICAgICAgICAgICBsYXN0cyA9IHMKKyAgICAgICAgICAgIGkgKz0gMgorICAgICAgICAgICAgZmFjdCAqPSBpICogKGktMSkKKyAgICAgICAgICAgIG51bSAqPSB4ICogeAorICAgICAgICAgICAgc2lnbiAqPSAtMQorICAgICAgICAgICAgcyArPSBudW0gLyBmYWN0ICogc2lnbgorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKG1hdGguY29zKDEpLCBzKQorCisgICAgZGVmIHRlc3RfY29weV9kZWVwY29weV9waWNrbGUoc2VsZik6CisgICAgICAgIHIgPSBGKDEzLCA3KQorICAgICAgICBkciA9IER1bW15RnJhY3Rpb24oMTMsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgbG9hZHMoZHVtcHMocikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKHIpLCBpZChjb3B5KHIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChyKSwgaWQoZGVlcGNvcHkocikpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGRyKSwgaWQoY29weShkcikpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGRyKSwgaWQoZGVlcGNvcHkoZHIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscyhkciwgY29weShkcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoZHIsIGRlZXBjb3B5KGRyKSkKKworICAgIGRlZiB0ZXN0X3Nsb3RzKHNlbGYpOgorICAgICAgICAjIElzc3VlIDQ5OTgKKyAgICAgICAgciA9IEYoMTMsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCByLCAnYScsIDEwKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEZyYWN0aW9uVGVzdCwgR2NkVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY1YWY4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYwYjAyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJvemVuLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJvemVuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MWY1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mcm96ZW4ucHkKQEAgLTAsMCArMSw0NyBAQAorIyBUZXN0IHRoZSBmcm96ZW4gbW9kdWxlIGRlZmluZWQgaW4gZnJvemVuLmMuCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGNhcHR1cmVkX3N0ZG91dCwgcnVuX3VuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKKworY2xhc3MgRnJvemVuVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2Zyb3plbihzZWxmKToKKworICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgX19oZWxsb19fCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIHg6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJpbXBvcnQgX19oZWxsb19fIGZhaWxlZDoiICsgc3RyKHgpKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IF9fcGhlbGxvX18KKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgeDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImltcG9ydCBfX3BoZWxsb19fIGZhaWxlZDoiICsgc3RyKHgpKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IF9fcGhlbGxvX18uc3BhbQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCB4OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiaW1wb3J0IF9fcGhlbGxvX18uc3BhbSBmYWlsZWQ6IiArIHN0cih4KSkKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBfX3BoZWxsb19fLmZvbworICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJpbXBvcnQgX19waGVsbG9fXy5mb28gc2hvdWxkIGhhdmUgZmFpbGVkIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdIZWxsbyB3b3JsZC4uLlxuSGVsbG8gd29ybGQuLi5cbkhlbGxvIHdvcmxkLi4uXG4nKQorCisgICAgICAgIGRlbCBzeXMubW9kdWxlc1snX19oZWxsb19fJ10KKyAgICAgICAgZGVsIHN5cy5tb2R1bGVzWydfX3BoZWxsb19fJ10KKyAgICAgICAgZGVsIHN5cy5tb2R1bGVzWydfX3BoZWxsb19fLnNwYW0nXQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoRnJvemVuVGVzdHMpCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mcm96ZW4ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJvemVuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTc3NGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJvemVuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mcm96ZW4ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJvemVuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTc3NGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJvemVuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdHBsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdHBsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgyZThhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z0cGxpYi5weQpAQCAtMCwwICsxLDc3OCBAQAorIiIiVGVzdCBzY3JpcHQgZm9yIGZ0cGxpYiBtb2R1bGUuIiIiCisKKyMgTW9kaWZpZWQgYnkgR2lhbXBhb2xvIFJvZG9sYScgdG8gdGVzdCBGVFAgY2xhc3MsIElQdjYgYW5kIFRMUworIyBlbnZpcm9ubWVudAorCitpbXBvcnQgZnRwbGliCitpbXBvcnQgYXN5bmNvcmUKK2ltcG9ydCBhc3luY2hhdAoraW1wb3J0IHNvY2tldAoraW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgZXJybm8KK2ltcG9ydCBvcwordHJ5OgorICAgIGltcG9ydCBzc2wKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBzc2wgPSBOb25lCisKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgSE9TVAordGhyZWFkaW5nID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RocmVhZGluZycpCisKKworIyB0aGUgZHVtbXkgZGF0YSByZXR1cm5lZCBieSBzZXJ2ZXIgb3ZlciB0aGUgZGF0YSBjaGFubmVsIHdoZW4KKyMgUkVUUiwgTElTVCBhbmQgTkxTVCBjb21tYW5kcyBhcmUgaXNzdWVkCitSRVRSX0RBVEEgPSAnYWJjZGUxMjM0NVxyXG4nICogMTAwMAorTElTVF9EQVRBID0gJ2Zvb1xyXG5iYXJcclxuJworTkxTVF9EQVRBID0gJ2Zvb1xyXG5iYXJcclxuJworCisKK2NsYXNzIER1bW15RFRQSGFuZGxlcihhc3luY2hhdC5hc3luY19jaGF0KToKKyAgICBkdHBfY29ubl9jbG9zZWQgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4sIGJhc2VjbGFzcyk6CisgICAgICAgIGFzeW5jaGF0LmFzeW5jX2NoYXQuX19pbml0X18oc2VsZiwgY29ubikKKyAgICAgICAgc2VsZi5iYXNlY2xhc3MgPSBiYXNlY2xhc3MKKyAgICAgICAgc2VsZi5iYXNlY2xhc3MubGFzdF9yZWNlaXZlZF9kYXRhID0gJycKKworICAgIGRlZiBoYW5kbGVfcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5iYXNlY2xhc3MubGFzdF9yZWNlaXZlZF9kYXRhICs9IHNlbGYucmVjdigxMDI0KQorCisgICAgZGVmIGhhbmRsZV9jbG9zZShzZWxmKToKKyAgICAgICAgIyBYWFg6IHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgbWFueSB0aW1lcyBpbiBhIHJvdyBmb3IgYSBzaW5nbGUKKyAgICAgICAgIyBjb25uZWN0aW9uLCBpbmNsdWRpbmcgaW4gY2xlYXItdGV4dCAobm9uLVRMUykgbW9kZS4KKyAgICAgICAgIyAoYmVoYXZpb3VyIHdpdG5lc3NlZCB3aXRoIHRlc3RfZGF0YV9jb25uZWN0aW9uKQorICAgICAgICBpZiBub3Qgc2VsZi5kdHBfY29ubl9jbG9zZWQ6CisgICAgICAgICAgICBzZWxmLmJhc2VjbGFzcy5wdXNoKCcyMjYgdHJhbnNmZXIgY29tcGxldGUnKQorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmR0cF9jb25uX2Nsb3NlZCA9IFRydWUKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHJhaXNlCisKKworY2xhc3MgRHVtbXlGVFBIYW5kbGVyKGFzeW5jaGF0LmFzeW5jX2NoYXQpOgorCisgICAgZHRwX2hhbmRsZXIgPSBEdW1teURUUEhhbmRsZXIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uKToKKyAgICAgICAgYXN5bmNoYXQuYXN5bmNfY2hhdC5fX2luaXRfXyhzZWxmLCBjb25uKQorICAgICAgICBzZWxmLnNldF90ZXJtaW5hdG9yKCJcclxuIikKKyAgICAgICAgc2VsZi5pbl9idWZmZXIgPSBbXQorICAgICAgICBzZWxmLmR0cCA9IE5vbmUKKyAgICAgICAgc2VsZi5sYXN0X3JlY2VpdmVkX2NtZCA9IE5vbmUKKyAgICAgICAgc2VsZi5sYXN0X3JlY2VpdmVkX2RhdGEgPSAnJworICAgICAgICBzZWxmLm5leHRfcmVzcG9uc2UgPSAnJworICAgICAgICBzZWxmLnJlc3QgPSBOb25lCisgICAgICAgIHNlbGYucHVzaCgnMjIwIHdlbGNvbWUnKQorCisgICAgZGVmIGNvbGxlY3RfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5pbl9idWZmZXIuYXBwZW5kKGRhdGEpCisKKyAgICBkZWYgZm91bmRfdGVybWluYXRvcihzZWxmKToKKyAgICAgICAgbGluZSA9ICcnLmpvaW4oc2VsZi5pbl9idWZmZXIpCisgICAgICAgIHNlbGYuaW5fYnVmZmVyID0gW10KKyAgICAgICAgaWYgc2VsZi5uZXh0X3Jlc3BvbnNlOgorICAgICAgICAgICAgc2VsZi5wdXNoKHNlbGYubmV4dF9yZXNwb25zZSkKKyAgICAgICAgICAgIHNlbGYubmV4dF9yZXNwb25zZSA9ICcnCisgICAgICAgIGNtZCA9IGxpbmUuc3BsaXQoJyAnKVswXS5sb3dlcigpCisgICAgICAgIHNlbGYubGFzdF9yZWNlaXZlZF9jbWQgPSBjbWQKKyAgICAgICAgc3BhY2UgPSBsaW5lLmZpbmQoJyAnKQorICAgICAgICBpZiBzcGFjZSAhPSAtMToKKyAgICAgICAgICAgIGFyZyA9IGxpbmVbc3BhY2UgKyAxOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZyA9ICIiCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2NtZF8nICsgY21kKToKKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZiwgJ2NtZF8nICsgY21kKQorICAgICAgICAgICAgbWV0aG9kKGFyZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTUwIGNvbW1hbmQgIiVzIiBub3QgdW5kZXJzdG9vZC4nICVjbWQpCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICByYWlzZQorCisgICAgZGVmIHB1c2goc2VsZiwgZGF0YSk6CisgICAgICAgIGFzeW5jaGF0LmFzeW5jX2NoYXQucHVzaChzZWxmLCBkYXRhICsgJ1xyXG4nKQorCisgICAgZGVmIGNtZF9wb3J0KHNlbGYsIGFyZyk6CisgICAgICAgIGFkZHIgPSBtYXAoaW50LCBhcmcuc3BsaXQoJywnKSkKKyAgICAgICAgaXAgPSAnJWQuJWQuJWQuJWQnICV0dXBsZShhZGRyWzo0XSkKKyAgICAgICAgcG9ydCA9IChhZGRyWzRdICogMjU2KSArIGFkZHJbNV0KKyAgICAgICAgcyA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoaXAsIHBvcnQpLCB0aW1lb3V0PTEwKQorICAgICAgICBzZWxmLmR0cCA9IHNlbGYuZHRwX2hhbmRsZXIocywgYmFzZWNsYXNzPXNlbGYpCisgICAgICAgIHNlbGYucHVzaCgnMjAwIGFjdGl2ZSBkYXRhIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQnKQorCisgICAgZGVmIGNtZF9wYXN2KHNlbGYsIGFyZyk6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgc29jay5iaW5kKChzZWxmLnNvY2tldC5nZXRzb2NrbmFtZSgpWzBdLCAwKSkKKyAgICAgICAgc29jay5saXN0ZW4oNSkKKyAgICAgICAgc29jay5zZXR0aW1lb3V0KDEwKQorICAgICAgICBpcCwgcG9ydCA9IHNvY2suZ2V0c29ja25hbWUoKVs6Ml0KKyAgICAgICAgaXAgPSBpcC5yZXBsYWNlKCcuJywgJywnKQorICAgICAgICBwMSwgcDIgPSBkaXZtb2QocG9ydCwgMjU2KQorICAgICAgICBzZWxmLnB1c2goJzIyNyBlbnRlcmluZyBwYXNzaXZlIG1vZGUgKCVzLCVkLCVkKScgJShpcCwgcDEsIHAyKSkKKyAgICAgICAgY29ubiwgYWRkciA9IHNvY2suYWNjZXB0KCkKKyAgICAgICAgc2VsZi5kdHAgPSBzZWxmLmR0cF9oYW5kbGVyKGNvbm4sIGJhc2VjbGFzcz1zZWxmKQorCisgICAgZGVmIGNtZF9lcHJ0KHNlbGYsIGFyZyk6CisgICAgICAgIGFmLCBpcCwgcG9ydCA9IGFyZy5zcGxpdChhcmdbMF0pWzE6LTFdCisgICAgICAgIHBvcnQgPSBpbnQocG9ydCkKKyAgICAgICAgcyA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoaXAsIHBvcnQpLCB0aW1lb3V0PTEwKQorICAgICAgICBzZWxmLmR0cCA9IHNlbGYuZHRwX2hhbmRsZXIocywgYmFzZWNsYXNzPXNlbGYpCisgICAgICAgIHNlbGYucHVzaCgnMjAwIGFjdGl2ZSBkYXRhIGNvbm5lY3Rpb24gZXN0YWJsaXNoZWQnKQorCisgICAgZGVmIGNtZF9lcHN2KHNlbGYsIGFyZyk6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUNikKKyAgICAgICAgc29jay5iaW5kKChzZWxmLnNvY2tldC5nZXRzb2NrbmFtZSgpWzBdLCAwKSkKKyAgICAgICAgc29jay5saXN0ZW4oNSkKKyAgICAgICAgc29jay5zZXR0aW1lb3V0KDEwKQorICAgICAgICBwb3J0ID0gc29jay5nZXRzb2NrbmFtZSgpWzFdCisgICAgICAgIHNlbGYucHVzaCgnMjI5IGVudGVyaW5nIGV4dGVuZGVkIHBhc3NpdmUgbW9kZSAofHx8JWR8KScgJXBvcnQpCisgICAgICAgIGNvbm4sIGFkZHIgPSBzb2NrLmFjY2VwdCgpCisgICAgICAgIHNlbGYuZHRwID0gc2VsZi5kdHBfaGFuZGxlcihjb25uLCBiYXNlY2xhc3M9c2VsZikKKworICAgIGRlZiBjbWRfZWNobyhzZWxmLCBhcmcpOgorICAgICAgICAjIHNlbmRzIGJhY2sgdGhlIHJlY2VpdmVkIHN0cmluZyAodXNlZCBieSB0aGUgdGVzdCBzdWl0ZSkKKyAgICAgICAgc2VsZi5wdXNoKGFyZykKKworICAgIGRlZiBjbWRfdXNlcihzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJzMzMSB1c2VybmFtZSBvaycpCisKKyAgICBkZWYgY21kX3Bhc3Moc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCcyMzAgcGFzc3dvcmQgb2snKQorCisgICAgZGVmIGNtZF9hY2N0KHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMjMwIGFjY3Qgb2snKQorCisgICAgZGVmIGNtZF9ybmZyKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMzUwIHJuZnIgb2snKQorCisgICAgZGVmIGNtZF9ybnRvKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMjUwIHJudG8gb2snKQorCisgICAgZGVmIGNtZF9kZWxlKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMjUwIGRlbGUgb2snKQorCisgICAgZGVmIGNtZF9jd2Qoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCcyNTAgY3dkIG9rJykKKworICAgIGRlZiBjbWRfc2l6ZShzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJzI1MCAxMDAwJykKKworICAgIGRlZiBjbWRfbWtkKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMjU3ICIlcyInICVhcmcpCisKKyAgICBkZWYgY21kX3JtZChzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJzI1MCBybWQgb2snKQorCisgICAgZGVmIGNtZF9wd2Qoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCcyNTcgInB3ZCBvayInKQorCisgICAgZGVmIGNtZF90eXBlKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMjAwIHR5cGUgb2snKQorCisgICAgZGVmIGNtZF9xdWl0KHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMjIxIHF1aXQgb2snKQorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBjbWRfc3RvcihzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJzEyNSBzdG9yIG9rJykKKworICAgIGRlZiBjbWRfcmVzdChzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnJlc3QgPSBhcmcKKyAgICAgICAgc2VsZi5wdXNoKCczNTAgcmVzdCBvaycpCisKKyAgICBkZWYgY21kX3JldHIoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCcxMjUgcmV0ciBvaycpCisgICAgICAgIGlmIHNlbGYucmVzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9mZnNldCA9IGludChzZWxmLnJlc3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvZmZzZXQgPSAwCisgICAgICAgIHNlbGYuZHRwLnB1c2goUkVUUl9EQVRBW29mZnNldDpdKQorICAgICAgICBzZWxmLmR0cC5jbG9zZV93aGVuX2RvbmUoKQorICAgICAgICBzZWxmLnJlc3QgPSBOb25lCisKKyAgICBkZWYgY21kX2xpc3Qoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCcxMjUgbGlzdCBvaycpCisgICAgICAgIHNlbGYuZHRwLnB1c2goTElTVF9EQVRBKQorICAgICAgICBzZWxmLmR0cC5jbG9zZV93aGVuX2RvbmUoKQorCisgICAgZGVmIGNtZF9ubHN0KHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMTI1IG5sc3Qgb2snKQorICAgICAgICBzZWxmLmR0cC5wdXNoKE5MU1RfREFUQSkKKyAgICAgICAgc2VsZi5kdHAuY2xvc2Vfd2hlbl9kb25lKCkKKworCitjbGFzcyBEdW1teUZUUFNlcnZlcihhc3luY29yZS5kaXNwYXRjaGVyLCB0aHJlYWRpbmcuVGhyZWFkKToKKworICAgIGhhbmRsZXIgPSBEdW1teUZUUEhhbmRsZXIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzLCBhZj1zb2NrZXQuQUZfSU5FVCk6CisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgYXN5bmNvcmUuZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZV9zb2NrZXQoYWYsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5iaW5kKGFkZHJlc3MpCisgICAgICAgIHNlbGYubGlzdGVuKDUpCisgICAgICAgIHNlbGYuYWN0aXZlID0gRmFsc2UKKyAgICAgICAgc2VsZi5hY3RpdmVfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKyAgICAgICAgc2VsZi5ob3N0LCBzZWxmLnBvcnQgPSBzZWxmLnNvY2tldC5nZXRzb2NrbmFtZSgpWzoyXQorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBhc3NlcnQgbm90IHNlbGYuYWN0aXZlCisgICAgICAgIHNlbGYuX19mbGFnID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5zdGFydChzZWxmKQorICAgICAgICBzZWxmLl9fZmxhZy53YWl0KCkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuYWN0aXZlID0gVHJ1ZQorICAgICAgICBzZWxmLl9fZmxhZy5zZXQoKQorICAgICAgICB3aGlsZSBzZWxmLmFjdGl2ZSBhbmQgYXN5bmNvcmUuc29ja2V0X21hcDoKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlX2xvY2suYWNxdWlyZSgpCisgICAgICAgICAgICBhc3luY29yZS5sb29wKHRpbWVvdXQ9MC4xLCBjb3VudD0xKQorICAgICAgICAgICAgc2VsZi5hY3RpdmVfbG9jay5yZWxlYXNlKCkKKyAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKGlnbm9yZV9hbGw9VHJ1ZSkKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5hY3RpdmUKKyAgICAgICAgc2VsZi5hY3RpdmUgPSBGYWxzZQorICAgICAgICBzZWxmLmpvaW4oKQorCisgICAgZGVmIGhhbmRsZV9hY2NlcHQoc2VsZik6CisgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLmFjY2VwdCgpCisgICAgICAgIHNlbGYuaGFuZGxlciA9IHNlbGYuaGFuZGxlcihjb25uKQorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBoYW5kbGVfY29ubmVjdChzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgaGFuZGxlX3JlYWQgPSBoYW5kbGVfY29ubmVjdAorCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgcmFpc2UKKworCitpZiBzc2wgaXMgbm90IE5vbmU6CisKKyAgICBDRVJURklMRSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAia2V5Y2VydC5wZW0iKQorCisgICAgY2xhc3MgU1NMQ29ubmVjdGlvbihvYmplY3QsIGFzeW5jb3JlLmRpc3BhdGNoZXIpOgorICAgICAgICAiIiJBbiBhc3luY29yZS5kaXNwYXRjaGVyIHN1YmNsYXNzIHN1cHBvcnRpbmcgVExTL1NTTC4iIiIKKworICAgICAgICBfc3NsX2FjY2VwdGluZyA9IEZhbHNlCisgICAgICAgIF9zc2xfY2xvc2luZyA9IEZhbHNlCisKKyAgICAgICAgZGVmIHNlY3VyZV9jb25uZWN0aW9uKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5zb2NrZXQgPSBzc2wud3JhcF9zb2NrZXQoc2VsZi5zb2NrZXQsIHN1cHByZXNzX3JhZ2dlZF9lb2ZzPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9Q0VSVEZJTEUsIHNlcnZlcl9zaWRlPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgICAgICBzZWxmLl9zc2xfYWNjZXB0aW5nID0gVHJ1ZQorCisgICAgICAgIGRlZiBfZG9fc3NsX2hhbmRzaGFrZShzZWxmKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2tldC5kb19oYW5kc2hha2UoKQorICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdIGluIChzc2wuU1NMX0VSUk9SX1dBTlRfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLlNTTF9FUlJPUl9XQU5UX1dSSVRFKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZWxpZiBlcnIuYXJnc1swXSA9PSBzc2wuU1NMX0VSUk9SX0VPRjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlX2Nsb3NlKCkKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdID09IGVycm5vLkVDT05OQUJPUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlX2Nsb3NlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fc3NsX2FjY2VwdGluZyA9IEZhbHNlCisKKyAgICAgICAgZGVmIF9kb19zc2xfc2h1dGRvd24oc2VsZik6CisgICAgICAgICAgICBzZWxmLl9zc2xfY2xvc2luZyA9IFRydWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2tldCA9IHNlbGYuc29ja2V0LnVud3JhcCgpCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgaWYgZXJyLmFyZ3NbMF0gaW4gKHNzbC5TU0xfRVJST1JfV0FOVF9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wuU1NMX0VSUk9SX1dBTlRfV1JJVEUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICAjIEFueSAic29ja2V0IGVycm9yIiBjb3JyZXNwb25kcyB0byBhIFNTTF9FUlJPUl9TWVNDQUxMIHJldHVybgorICAgICAgICAgICAgICAgICMgZnJvbSBPcGVuU1NMJ3MgU1NMX3NodXRkb3duKCksIGNvcnJlc3BvbmRpbmcgdG8gYQorICAgICAgICAgICAgICAgICMgY2xvc2VkIHNvY2tldCBjb25kaXRpb24uIFNlZSBhbHNvOgorICAgICAgICAgICAgICAgICMgaHR0cDovL3d3dy5tYWlsLWFyY2hpdmUuY29tL29wZW5zc2wtdXNlcnNAb3BlbnNzbC5vcmcvbXNnNjA3MTAuaHRtbAorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuX3NzbF9jbG9zaW5nID0gRmFsc2UKKyAgICAgICAgICAgIHN1cGVyKFNTTENvbm5lY3Rpb24sIHNlbGYpLmNsb3NlKCkKKworICAgICAgICBkZWYgaGFuZGxlX3JlYWRfZXZlbnQoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLl9zc2xfYWNjZXB0aW5nOgorICAgICAgICAgICAgICAgIHNlbGYuX2RvX3NzbF9oYW5kc2hha2UoKQorICAgICAgICAgICAgZWxpZiBzZWxmLl9zc2xfY2xvc2luZzoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb19zc2xfc2h1dGRvd24oKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdXBlcihTU0xDb25uZWN0aW9uLCBzZWxmKS5oYW5kbGVfcmVhZF9ldmVudCgpCisKKyAgICAgICAgZGVmIGhhbmRsZV93cml0ZV9ldmVudChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuX3NzbF9hY2NlcHRpbmc6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9fc3NsX2hhbmRzaGFrZSgpCisgICAgICAgICAgICBlbGlmIHNlbGYuX3NzbF9jbG9zaW5nOgorICAgICAgICAgICAgICAgIHNlbGYuX2RvX3NzbF9zaHV0ZG93bigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN1cGVyKFNTTENvbm5lY3Rpb24sIHNlbGYpLmhhbmRsZV93cml0ZV9ldmVudCgpCisKKyAgICAgICAgZGVmIHNlbmQoc2VsZiwgZGF0YSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFNTTENvbm5lY3Rpb24sIHNlbGYpLnNlbmQoZGF0YSkKKyAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBpZiBlcnIuYXJnc1swXSBpbiAoc3NsLlNTTF9FUlJPUl9FT0YsIHNzbC5TU0xfRVJST1JfWkVST19SRVRVUk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC5TU0xfRVJST1JfV0FOVF9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wuU1NMX0VSUk9SX1dBTlRfV1JJVEUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgZGVmIHJlY3Yoc2VsZiwgYnVmZmVyX3NpemUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlcihTU0xDb25uZWN0aW9uLCBzZWxmKS5yZWN2KGJ1ZmZlcl9zaXplKQorICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdIGluIChzc2wuU1NMX0VSUk9SX1dBTlRfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLlNTTF9FUlJPUl9XQU5UX1dSSVRFKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgICAgICAgICAgaWYgZXJyLmFyZ3NbMF0gaW4gKHNzbC5TU0xfRVJST1JfRU9GLCBzc2wuU1NMX0VSUk9SX1pFUk9fUkVUVVJOKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgICAgICByYWlzZQorCisgICAgICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKHNlbGYuc29ja2V0LCBzc2wuU1NMU29ja2V0KSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2tldC5fc3Nsb2JqIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgICAgICBzZWxmLl9kb19zc2xfc2h1dGRvd24oKQorCisKKyAgICBjbGFzcyBEdW1teVRMU19EVFBIYW5kbGVyKFNTTENvbm5lY3Rpb24sIER1bW15RFRQSGFuZGxlcik6CisgICAgICAgICIiIkEgRHVtbXlEVFBIYW5kbGVyIHN1YmNsYXNzIHN1cHBvcnRpbmcgVExTL1NTTC4iIiIKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubiwgYmFzZWNsYXNzKToKKyAgICAgICAgICAgIER1bW15RFRQSGFuZGxlci5fX2luaXRfXyhzZWxmLCBjb25uLCBiYXNlY2xhc3MpCisgICAgICAgICAgICBpZiBzZWxmLmJhc2VjbGFzcy5zZWN1cmVfZGF0YV9jaGFubmVsOgorICAgICAgICAgICAgICAgIHNlbGYuc2VjdXJlX2Nvbm5lY3Rpb24oKQorCisKKyAgICBjbGFzcyBEdW1teVRMU19GVFBIYW5kbGVyKFNTTENvbm5lY3Rpb24sIER1bW15RlRQSGFuZGxlcik6CisgICAgICAgICIiIkEgRHVtbXlGVFBIYW5kbGVyIHN1YmNsYXNzIHN1cHBvcnRpbmcgVExTL1NTTC4iIiIKKworICAgICAgICBkdHBfaGFuZGxlciA9IER1bW15VExTX0RUUEhhbmRsZXIKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubik6CisgICAgICAgICAgICBEdW1teUZUUEhhbmRsZXIuX19pbml0X18oc2VsZiwgY29ubikKKyAgICAgICAgICAgIHNlbGYuc2VjdXJlX2RhdGFfY2hhbm5lbCA9IEZhbHNlCisKKyAgICAgICAgZGVmIGNtZF9hdXRoKHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgIiIiU2V0IHVwIHNlY3VyZSBjb250cm9sIGNoYW5uZWwuIiIiCisgICAgICAgICAgICBzZWxmLnB1c2goJzIzNCBBVVRIIFRMUyBzdWNjZXNzZnVsJykKKyAgICAgICAgICAgIHNlbGYuc2VjdXJlX2Nvbm5lY3Rpb24oKQorCisgICAgICAgIGRlZiBjbWRfcGJzeihzZWxmLCBsaW5lKToKKyAgICAgICAgICAgICIiIk5lZ290aWF0ZSBzaXplIG9mIGJ1ZmZlciBmb3Igc2VjdXJlIGRhdGEgdHJhbnNmZXIuCisgICAgICAgICAgICBGb3IgVExTL1NTTCB0aGUgb25seSB2YWxpZCB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlciBpcyAnMCcuCisgICAgICAgICAgICBBbnkgb3RoZXIgdmFsdWUgaXMgYWNjZXB0ZWQgYnV0IGlnbm9yZWQuCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHNlbGYucHVzaCgnMjAwIFBCU1o9MCBzdWNjZXNzZnVsLicpCisKKyAgICAgICAgZGVmIGNtZF9wcm90KHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgIiIiU2V0dXAgdW4vc2VjdXJlIGRhdGEgY2hhbm5lbC4iIiIKKyAgICAgICAgICAgIGFyZyA9IGxpbmUudXBwZXIoKQorICAgICAgICAgICAgaWYgYXJnID09ICdDJzoKKyAgICAgICAgICAgICAgICBzZWxmLnB1c2goJzIwMCBQcm90ZWN0aW9uIHNldCB0byBDbGVhcicpCisgICAgICAgICAgICAgICAgc2VsZi5zZWN1cmVfZGF0YV9jaGFubmVsID0gRmFsc2UKKyAgICAgICAgICAgIGVsaWYgYXJnID09ICdQJzoKKyAgICAgICAgICAgICAgICBzZWxmLnB1c2goJzIwMCBQcm90ZWN0aW9uIHNldCB0byBQcml2YXRlJykKKyAgICAgICAgICAgICAgICBzZWxmLnNlY3VyZV9kYXRhX2NoYW5uZWwgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucHVzaCgiNTAyIFVucmVjb2duaXplZCBQUk9UIHR5cGUgKHVzZSBDIG9yIFApLiIpCisKKworICAgIGNsYXNzIER1bW15VExTX0ZUUFNlcnZlcihEdW1teUZUUFNlcnZlcik6CisgICAgICAgIGhhbmRsZXIgPSBEdW1teVRMU19GVFBIYW5kbGVyCisKKworY2xhc3MgVGVzdEZUUENsYXNzKFRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBEdW1teUZUUFNlcnZlcigoSE9TVCwgMCkpCisgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5jbGllbnQgPSBmdHBsaWIuRlRQKHRpbWVvdXQ9MTApCisgICAgICAgIHNlbGYuY2xpZW50LmNvbm5lY3Qoc2VsZi5zZXJ2ZXIuaG9zdCwgc2VsZi5zZXJ2ZXIucG9ydCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQuY2xvc2UoKQorICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworICAgIGRlZiB0ZXN0X2dldHdlbGNvbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQuZ2V0d2VsY29tZSgpLCAnMjIwIHdlbGNvbWUnKQorCisgICAgZGVmIHRlc3Rfc2FuaXRpemUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQuc2FuaXRpemUoJ2ZvbycpLCByZXByKCdmb28nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC5zYW5pdGl6ZSgncGFzcyAxMjM0NScpLCByZXByKCdwYXNzICoqKioqJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQuc2FuaXRpemUoJ1BBU1MgMTIzNDUnKSwgcmVwcignUEFTUyAqKioqKicpKQorCisgICAgZGVmIHRlc3RfZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZnRwbGliLmVycm9yX3RlbXAsIHNlbGYuY2xpZW50LnNlbmRjbWQsICdlY2hvIDQwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGZ0cGxpYi5lcnJvcl90ZW1wLCBzZWxmLmNsaWVudC5zZW5kY21kLCAnZWNobyA0OTknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhmdHBsaWIuZXJyb3JfcGVybSwgc2VsZi5jbGllbnQuc2VuZGNtZCwgJ2VjaG8gNTAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZnRwbGliLmVycm9yX3Blcm0sIHNlbGYuY2xpZW50LnNlbmRjbWQsICdlY2hvIDU5OScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGZ0cGxpYi5lcnJvcl9wcm90bywgc2VsZi5jbGllbnQuc2VuZGNtZCwgJ2VjaG8gOTk5JykKKworICAgIGRlZiB0ZXN0X2FsbF9lcnJvcnMoc2VsZik6CisgICAgICAgIGV4Y2VwdGlvbnMgPSAoZnRwbGliLmVycm9yX3JlcGx5LCBmdHBsaWIuZXJyb3JfdGVtcCwgZnRwbGliLmVycm9yX3Blcm0sCisgICAgICAgICAgICAgICAgICAgICAgZnRwbGliLmVycm9yX3Byb3RvLCBmdHBsaWIuRXJyb3IsIElPRXJyb3IsIEVPRkVycm9yKQorICAgICAgICBmb3IgeCBpbiBleGNlcHRpb25zOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhaXNlIHgoJ2V4Y2VwdGlvbiBub3QgaW5jbHVkZWQgaW4gYWxsX2Vycm9ycyBzZXQnKQorICAgICAgICAgICAgZXhjZXB0IGZ0cGxpYi5hbGxfZXJyb3JzOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3NldF9wYXN2KHNlbGYpOgorICAgICAgICAjIHBhc3NpdmUgbW9kZSBpcyBzdXBwb3NlZCB0byBiZSBlbmFibGVkIGJ5IGRlZmF1bHQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY2xpZW50LnBhc3NpdmVzZXJ2ZXIpCisgICAgICAgIHNlbGYuY2xpZW50LnNldF9wYXN2KFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmNsaWVudC5wYXNzaXZlc2VydmVyKQorICAgICAgICBzZWxmLmNsaWVudC5zZXRfcGFzdihGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmNsaWVudC5wYXNzaXZlc2VydmVyKQorCisgICAgZGVmIHRlc3Rfdm9pZGNtZChzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQudm9pZGNtZCgnZWNobyAyMDAnKQorICAgICAgICBzZWxmLmNsaWVudC52b2lkY21kKCdlY2hvIDI5OScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGZ0cGxpYi5lcnJvcl9yZXBseSwgc2VsZi5jbGllbnQudm9pZGNtZCwgJ2VjaG8gMTk5JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZnRwbGliLmVycm9yX3JlcGx5LCBzZWxmLmNsaWVudC52b2lkY21kLCAnZWNobyAzMDAnKQorCisgICAgZGVmIHRlc3RfbG9naW4oc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50LmxvZ2luKCkKKworICAgIGRlZiB0ZXN0X2FjY3Qoc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50LmFjY3QoJ3Bhc3N3ZCcpCisKKyAgICBkZWYgdGVzdF9yZW5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50LnJlbmFtZSgnYScsICdiJykKKyAgICAgICAgc2VsZi5zZXJ2ZXIuaGFuZGxlci5uZXh0X3Jlc3BvbnNlID0gJzIwMCcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZnRwbGliLmVycm9yX3JlcGx5LCBzZWxmLmNsaWVudC5yZW5hbWUsICdhJywgJ2InKQorCisgICAgZGVmIHRlc3RfZGVsZXRlKHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC5kZWxldGUoJ2ZvbycpCisgICAgICAgIHNlbGYuc2VydmVyLmhhbmRsZXIubmV4dF9yZXNwb25zZSA9ICcxOTknCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGZ0cGxpYi5lcnJvcl9yZXBseSwgc2VsZi5jbGllbnQuZGVsZXRlLCAnZm9vJykKKworICAgIGRlZiB0ZXN0X3NpemUoc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50LnNpemUoJ2ZvbycpCisKKyAgICBkZWYgdGVzdF9ta2Qoc2VsZik6CisgICAgICAgIGRpciA9IHNlbGYuY2xpZW50Lm1rZCgnL2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyLCAnL2ZvbycpCisKKyAgICBkZWYgdGVzdF9ybWQoc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50LnJtZCgnZm9vJykKKworICAgIGRlZiB0ZXN0X3B3ZChzZWxmKToKKyAgICAgICAgZGlyID0gc2VsZi5jbGllbnQucHdkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIsICdwd2Qgb2snKQorCisgICAgZGVmIHRlc3RfcXVpdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC5xdWl0KCksICcyMjEgcXVpdCBvaycpCisgICAgICAgICMgRW5zdXJlIHRoZSBjb25uZWN0aW9uIGdldHMgY2xvc2VkOyBzb2NrIGF0dHJpYnV0ZSBzaG91bGQgYmUgTm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnNvY2ssIE5vbmUpCisKKyAgICBkZWYgdGVzdF9yZXRyYmluYXJ5KHNlbGYpOgorICAgICAgICByZWNlaXZlZCA9IFtdCisgICAgICAgIHNlbGYuY2xpZW50LnJldHJiaW5hcnkoJ3JldHInLCByZWNlaXZlZC5hcHBlbmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuam9pbihyZWNlaXZlZCksIFJFVFJfREFUQSkKKworICAgIGRlZiB0ZXN0X3JldHJiaW5hcnlfcmVzdChzZWxmKToKKyAgICAgICAgZm9yIHJlc3QgaW4gKDAsIDEwLCAyMCk6CisgICAgICAgICAgICByZWNlaXZlZCA9IFtdCisgICAgICAgICAgICBzZWxmLmNsaWVudC5yZXRyYmluYXJ5KCdyZXRyJywgcmVjZWl2ZWQuYXBwZW5kLCByZXN0PXJlc3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmpvaW4ocmVjZWl2ZWQpLCBSRVRSX0RBVEFbcmVzdDpdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9J3Jlc3QgdGVzdCBjYXNlICVkICVkICVkJyAlIChyZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oJycuam9pbihyZWNlaXZlZCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oUkVUUl9EQVRBW3Jlc3Q6XSkpKQorCisgICAgZGVmIHRlc3RfcmV0cmxpbmVzKHNlbGYpOgorICAgICAgICByZWNlaXZlZCA9IFtdCisgICAgICAgIHNlbGYuY2xpZW50LnJldHJsaW5lcygncmV0cicsIHJlY2VpdmVkLmFwcGVuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5qb2luKHJlY2VpdmVkKSwgUkVUUl9EQVRBLnJlcGxhY2UoJ1xyXG4nLCAnJykpCisKKyAgICBkZWYgdGVzdF9zdG9yYmluYXJ5KHNlbGYpOgorICAgICAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oUkVUUl9EQVRBKQorICAgICAgICBzZWxmLmNsaWVudC5zdG9yYmluYXJ5KCdzdG9yJywgZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcnZlci5oYW5kbGVyLmxhc3RfcmVjZWl2ZWRfZGF0YSwgUkVUUl9EQVRBKQorICAgICAgICAjIHRlc3QgbmV3IGNhbGxiYWNrIGFyZworICAgICAgICBmbGFnID0gW10KKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHNlbGYuY2xpZW50LnN0b3JiaW5hcnkoJ3N0b3InLCBmLCBjYWxsYmFjaz1sYW1iZGEgeDogZmxhZy5hcHBlbmQoTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmbGFnKQorCisgICAgZGVmIHRlc3Rfc3RvcmJpbmFyeV9yZXN0KHNlbGYpOgorICAgICAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oUkVUUl9EQVRBKQorICAgICAgICBmb3IgciBpbiAoMzAsICczMCcpOgorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmNsaWVudC5zdG9yYmluYXJ5KCdzdG9yJywgZiwgcmVzdD1yKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcnZlci5oYW5kbGVyLnJlc3QsIHN0cihyKSkKKworICAgIGRlZiB0ZXN0X3N0b3JsaW5lcyhzZWxmKToKKyAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKFJFVFJfREFUQS5yZXBsYWNlKCdcclxuJywgJ1xuJykpCisgICAgICAgIHNlbGYuY2xpZW50LnN0b3JsaW5lcygnc3RvcicsIGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXJ2ZXIuaGFuZGxlci5sYXN0X3JlY2VpdmVkX2RhdGEsIFJFVFJfREFUQSkKKyAgICAgICAgIyB0ZXN0IG5ldyBjYWxsYmFjayBhcmcKKyAgICAgICAgZmxhZyA9IFtdCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBzZWxmLmNsaWVudC5zdG9ybGluZXMoJ3N0b3IgZm9vJywgZiwgY2FsbGJhY2s9bGFtYmRhIHg6IGZsYWcuYXBwZW5kKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmxhZykKKworICAgIGRlZiB0ZXN0X25sc3Qoc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50Lm5sc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50Lm5sc3QoKSwgTkxTVF9EQVRBLnNwbGl0KCdcclxuJylbOi0xXSkKKworICAgIGRlZiB0ZXN0X2RpcihzZWxmKToKKyAgICAgICAgbCA9IFtdCisgICAgICAgIHNlbGYuY2xpZW50LmRpcihsYW1iZGEgeDogbC5hcHBlbmQoeCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuam9pbihsKSwgTElTVF9EQVRBLnJlcGxhY2UoJ1xyXG4nLCAnJykpCisKKyAgICBkZWYgdGVzdF9tYWtlcG9ydChzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQubWFrZXBvcnQoKQorICAgICAgICAjIElQdjQgaXMgaW4gdXNlLCBqdXN0IG1ha2Ugc3VyZSBzZW5kX2VwcnQgaGFzIG5vdCBiZWVuIHVzZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcnZlci5oYW5kbGVyLmxhc3RfcmVjZWl2ZWRfY21kLCAncG9ydCcpCisKKyAgICBkZWYgdGVzdF9tYWtlcGFzdihzZWxmKToKKyAgICAgICAgaG9zdCwgcG9ydCA9IHNlbGYuY2xpZW50Lm1ha2VwYXN2KCkKKyAgICAgICAgY29ubiA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoaG9zdCwgcG9ydCksIDEwKQorICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgIyBJUHY0IGlzIGluIHVzZSwganVzdCBtYWtlIHN1cmUgc2VuZF9lcHN2IGhhcyBub3QgYmVlbiB1c2VkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXJ2ZXIuaGFuZGxlci5sYXN0X3JlY2VpdmVkX2NtZCwgJ3Bhc3YnKQorCisKK2NsYXNzIFRlc3RJUHY2RW52aXJvbm1lbnQoVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlciA9IER1bW15RlRQU2VydmVyKChIT1NULCAwKSwgYWY9c29ja2V0LkFGX0lORVQ2KQorICAgICAgICBzZWxmLnNlcnZlci5zdGFydCgpCisgICAgICAgIHNlbGYuY2xpZW50ID0gZnRwbGliLkZUUCgpCisgICAgICAgIHNlbGYuY2xpZW50LmNvbm5lY3Qoc2VsZi5zZXJ2ZXIuaG9zdCwgc2VsZi5zZXJ2ZXIucG9ydCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQuY2xvc2UoKQorICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworICAgIGRlZiB0ZXN0X2FmKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LmFmLCBzb2NrZXQuQUZfSU5FVDYpCisKKyAgICBkZWYgdGVzdF9tYWtlcG9ydChzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQubWFrZXBvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VydmVyLmhhbmRsZXIubGFzdF9yZWNlaXZlZF9jbWQsICdlcHJ0JykKKworICAgIGRlZiB0ZXN0X21ha2VwYXN2KHNlbGYpOgorICAgICAgICBob3N0LCBwb3J0ID0gc2VsZi5jbGllbnQubWFrZXBhc3YoKQorICAgICAgICBjb25uID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChob3N0LCBwb3J0KSwgMTApCisgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VydmVyLmhhbmRsZXIubGFzdF9yZWNlaXZlZF9jbWQsICdlcHN2JykKKworICAgIGRlZiB0ZXN0X3RyYW5zZmVyKHNlbGYpOgorICAgICAgICBkZWYgcmV0cigpOgorICAgICAgICAgICAgcmVjZWl2ZWQgPSBbXQorICAgICAgICAgICAgc2VsZi5jbGllbnQucmV0cmJpbmFyeSgncmV0cicsIHJlY2VpdmVkLmFwcGVuZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuam9pbihyZWNlaXZlZCksIFJFVFJfREFUQSkKKyAgICAgICAgc2VsZi5jbGllbnQuc2V0X3Bhc3YoVHJ1ZSkKKyAgICAgICAgcmV0cigpCisgICAgICAgIHNlbGYuY2xpZW50LnNldF9wYXN2KEZhbHNlKQorICAgICAgICByZXRyKCkKKworCitjbGFzcyBUZXN0VExTX0ZUUENsYXNzTWl4aW4oVGVzdEZUUENsYXNzKToKKyAgICAiIiJSZXBlYXQgVGVzdEZUUENsYXNzIHRlc3RzIHN0YXJ0aW5nIHRoZSBUTFMgbGF5ZXIgZm9yIGJvdGggY29udHJvbAorICAgIGFuZCBkYXRhIGNvbm5lY3Rpb25zIGZpcnN0LgorICAgICIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlciA9IER1bW15VExTX0ZUUFNlcnZlcigoSE9TVCwgMCkpCisgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5jbGllbnQgPSBmdHBsaWIuRlRQX1RMUyh0aW1lb3V0PTEwKQorICAgICAgICBzZWxmLmNsaWVudC5jb25uZWN0KHNlbGYuc2VydmVyLmhvc3QsIHNlbGYuc2VydmVyLnBvcnQpCisgICAgICAgICMgZW5hYmxlIFRMUworICAgICAgICBzZWxmLmNsaWVudC5hdXRoKCkKKyAgICAgICAgc2VsZi5jbGllbnQucHJvdF9wKCkKKworCitjbGFzcyBUZXN0VExTX0ZUUENsYXNzKFRlc3RDYXNlKToKKyAgICAiIiJTcGVjaWZpYyBUTFNfRlRQIGNsYXNzIHRlc3RzLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlciA9IER1bW15VExTX0ZUUFNlcnZlcigoSE9TVCwgMCkpCisgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5jbGllbnQgPSBmdHBsaWIuRlRQX1RMUyh0aW1lb3V0PTEwKQorICAgICAgICBzZWxmLmNsaWVudC5jb25uZWN0KHNlbGYuc2VydmVyLmhvc3QsIHNlbGYuc2VydmVyLnBvcnQpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50LmNsb3NlKCkKKyAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKyAgICBkZWYgdGVzdF9jb250cm9sX2Nvbm5lY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShzZWxmLmNsaWVudC5zb2NrLCBzc2wuU1NMU29ja2V0KQorICAgICAgICBzZWxmLmNsaWVudC5hdXRoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYuY2xpZW50LnNvY2ssIHNzbC5TU0xTb2NrZXQpCisKKyAgICBkZWYgdGVzdF9kYXRhX2Nvbm5lY3Rpb24oc2VsZik6CisgICAgICAgICMgY2xlYXIgdGV4dAorICAgICAgICBzb2NrID0gc2VsZi5jbGllbnQudHJhbnNmZXJjbWQoJ2xpc3QnKQorICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2Uoc29jaywgc3NsLlNTTFNvY2tldCkKKyAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQudm9pZHJlc3AoKSwgIjIyNiB0cmFuc2ZlciBjb21wbGV0ZSIpCisKKyAgICAgICAgIyBzZWN1cmVkLCBhZnRlciBQUk9UIFAKKyAgICAgICAgc2VsZi5jbGllbnQucHJvdF9wKCkKKyAgICAgICAgc29jayA9IHNlbGYuY2xpZW50LnRyYW5zZmVyY21kKCdsaXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNvY2ssIHNzbC5TU0xTb2NrZXQpCisgICAgICAgIHNvY2suY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnZvaWRyZXNwKCksICIyMjYgdHJhbnNmZXIgY29tcGxldGUiKQorCisgICAgICAgICMgUFJPVCBDIGlzIGlzc3VlZCwgdGhlIGNvbm5lY3Rpb24gbXVzdCBiZSBpbiBjbGVhcnRleHQgYWdhaW4KKyAgICAgICAgc2VsZi5jbGllbnQucHJvdF9jKCkKKyAgICAgICAgc29jayA9IHNlbGYuY2xpZW50LnRyYW5zZmVyY21kKCdsaXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHNvY2ssIHNzbC5TU0xTb2NrZXQpCisgICAgICAgIHNvY2suY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnZvaWRyZXNwKCksICIyMjYgdHJhbnNmZXIgY29tcGxldGUiKQorCisgICAgZGVmIHRlc3RfbG9naW4oc2VsZik6CisgICAgICAgICMgbG9naW4oKSBpcyBzdXBwb3NlZCB0byBpbXBsaWNpdGx5IHNlY3VyZSB0aGUgY29udHJvbCBjb25uZWN0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShzZWxmLmNsaWVudC5zb2NrLCBzc2wuU1NMU29ja2V0KQorICAgICAgICBzZWxmLmNsaWVudC5sb2dpbigpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLmNsaWVudC5zb2NrLCBzc2wuU1NMU29ja2V0KQorICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IEFVVEggVExTIGRvZXNuJ3QgZ2V0IGlzc3VlZCBhZ2FpbgorICAgICAgICBzZWxmLmNsaWVudC5sb2dpbigpCisKKyAgICBkZWYgdGVzdF9hdXRoX2lzc3VlZF90d2ljZShzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQuYXV0aCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuY2xpZW50LmF1dGgpCisKKyAgICBkZWYgdGVzdF9hdXRoX3NzbChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbGllbnQuc3NsX3ZlcnNpb24gPSBzc2wuUFJPVE9DT0xfU1NMdjMKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LmF1dGgoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5jbGllbnQuYXV0aCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnNzbF92ZXJzaW9uID0gc3NsLlBST1RPQ09MX1RMU3YxCisKKworY2xhc3MgVGVzdFRpbWVvdXRzKFRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDEwKQorICAgICAgICBzZWxmLnBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc29jaykKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5zZXJ2ZXIsIGFyZ3M9KHNlbGYuZXZ0LHNlbGYuc29jaykpLnN0YXJ0KCkKKyAgICAgICAgIyBXYWl0IGZvciB0aGUgc2VydmVyIHRvIGJlIHJlYWR5LgorICAgICAgICBzZWxmLmV2dC53YWl0KCkKKyAgICAgICAgc2VsZi5ldnQuY2xlYXIoKQorICAgICAgICBmdHBsaWIuRlRQLnBvcnQgPSBzZWxmLnBvcnQKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5ldnQud2FpdCgpCisKKyAgICBkZWYgc2VydmVyKHNlbGYsIGV2dCwgc2Vydik6CisgICAgICAgICMgVGhpcyBtZXRob2Qgc2V0cyB0aGUgZXZ0IDMgdGltZXM6CisgICAgICAgICMgIDEpIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgcmVhZHkgdG8gYmUgYWNjZXB0ZWQuCisgICAgICAgICMgIDIpIHdoZW4gaXQgaXMgc2FmZSBmb3IgdGhlIGNhbGxlciB0byBjbG9zZSB0aGUgY29ubmVjdGlvbgorICAgICAgICAjICAzKSB3aGVuIHdlIGhhdmUgY2xvc2VkIHRoZSBzb2NrZXQKKyAgICAgICAgc2Vydi5saXN0ZW4oNSkKKyAgICAgICAgIyAoMSkgU2lnbmFsIHRoZSBjYWxsZXIgdGhhdCB3ZSBhcmUgcmVhZHkgdG8gYWNjZXB0IHRoZSBjb25uZWN0aW9uLgorICAgICAgICBldnQuc2V0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29ubiwgYWRkciA9IHNlcnYuYWNjZXB0KCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29ubi5zZW5kKCIxIEhvbGEgbXVuZG9cbiIpCisgICAgICAgICAgICAjICgyKSBTaWduYWwgdGhlIGNhbGxlciB0aGF0IGl0IGlzIHNhZmUgdG8gY2xvc2UgdGhlIHNvY2tldC4KKyAgICAgICAgICAgIGV2dC5zZXQoKQorICAgICAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZXJ2LmNsb3NlKCkKKyAgICAgICAgICAgICMgKDMpIFNpZ25hbCB0aGUgY2FsbGVyIHRoYXQgd2UgYXJlIGRvbmUuCisgICAgICAgICAgICBldnQuc2V0KCkKKworICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CisgICAgICAgICMgZGVmYXVsdCAtLSB1c2UgZ2xvYmFsIHNvY2tldCB0aW1lb3V0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ0cCA9IGZ0cGxpYi5GVFAoImxvY2FsaG9zdCIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdHAuc29jay5nZXR0aW1lb3V0KCksIDMwKQorICAgICAgICBzZWxmLmV2dC53YWl0KCkKKyAgICAgICAgZnRwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dE5vbmUoc2VsZik6CisgICAgICAgICMgbm8gdGltZW91dCAtLSBkbyBub3QgdXNlIGdsb2JhbCBzb2NrZXQgdGltZW91dAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmdHAgPSBmdHBsaWIuRlRQKCJsb2NhbGhvc3QiLCB0aW1lb3V0PU5vbmUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZ0cC5zb2NrLmdldHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmV2dC53YWl0KCkKKyAgICAgICAgZnRwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dFZhbHVlKHNlbGYpOgorICAgICAgICAjIGEgdmFsdWUKKyAgICAgICAgZnRwID0gZnRwbGliLkZUUChIT1NULCB0aW1lb3V0PTMwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ0cC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorICAgICAgICBmdHAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RUaW1lb3V0Q29ubmVjdChzZWxmKToKKyAgICAgICAgZnRwID0gZnRwbGliLkZUUCgpCisgICAgICAgIGZ0cC5jb25uZWN0KEhPU1QsIHRpbWVvdXQ9MzApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnRwLnNvY2suZ2V0dGltZW91dCgpLCAzMCkKKyAgICAgICAgc2VsZi5ldnQud2FpdCgpCisgICAgICAgIGZ0cC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFRpbWVvdXREaWZmZXJlbnRPcmRlcihzZWxmKToKKyAgICAgICAgZnRwID0gZnRwbGliLkZUUCh0aW1lb3V0PTMwKQorICAgICAgICBmdHAuY29ubmVjdChIT1NUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ0cC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorICAgICAgICBmdHAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RUaW1lb3V0RGlyZWN0QWNjZXNzKHNlbGYpOgorICAgICAgICBmdHAgPSBmdHBsaWIuRlRQKCkKKyAgICAgICAgZnRwLnRpbWVvdXQgPSAzMAorICAgICAgICBmdHAuY29ubmVjdChIT1NUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ0cC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorICAgICAgICBmdHAuY2xvc2UoKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0cyA9IFtUZXN0RlRQQ2xhc3MsIFRlc3RUaW1lb3V0c10KKyAgICBpZiBzb2NrZXQuaGFzX2lwdjY6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIER1bW15RlRQU2VydmVyKChIT1NULCAwKSwgYWY9c29ja2V0LkFGX0lORVQ2KQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGVzdHMuYXBwZW5kKFRlc3RJUHY2RW52aXJvbm1lbnQpCisKKyAgICBpZiBzc2wgaXMgbm90IE5vbmU6CisgICAgICAgIHRlc3RzLmV4dGVuZChbVGVzdFRMU19GVFBDbGFzc01peGluLCBUZXN0VExTX0ZUUENsYXNzXSkKKworICAgIHRocmVhZF9pbmZvID0gdGVzdF9zdXBwb3J0LnRocmVhZGluZ19zZXR1cCgpCisgICAgdHJ5OgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKyAgICBmaW5hbGx5OgorICAgICAgICB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX2NsZWFudXAoKnRocmVhZF9pbmZvKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z0cGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdHBsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0OTUwNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdHBsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z0cGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdHBsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ODRlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdHBsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmNhdHRycy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmNhdHRycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjM5Y2EyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnVuY2F0dHJzLnB5CkBAIC0wLDAgKzEsMzUzIEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHR5cGVzCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgRnVuY0F0dHJzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBjbGFzcyBGOgorICAgICAgICAgICAgZGVmIGEoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBkZWYgYigpOgorICAgICAgICAgICAgcmV0dXJuIDMKKyAgICAgICAgc2VsZi5mID0gRgorICAgICAgICBzZWxmLmZpID0gRigpCisgICAgICAgIHNlbGYuYiA9IGIKKworICAgIGRlZiBjYW5ub3Rfc2V0X2F0dHIoc2VsZiwgb2JqLCBuYW1lLCB2YWx1ZSwgZXhjZXB0aW9ucyk6CisgICAgICAgICMgSGVscGVyIG1ldGhvZCBmb3Igb3RoZXIgdGVzdHMuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNldGF0dHIob2JqLCBuYW1lLCB2YWx1ZSkKKyAgICAgICAgZXhjZXB0IGV4Y2VwdGlvbnM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBiZSBhYmxlIHRvIHNldCAlcyB0byAlciIgJSAobmFtZSwgdmFsdWUpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWxhdHRyKG9iaiwgbmFtZSkKKyAgICAgICAgZXhjZXB0IGV4Y2VwdGlvbnM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBiZSBhYmxlIHRvIGRlbCAlcyIgJSBuYW1lKQorCisKK2NsYXNzIEZ1bmN0aW9uUHJvcGVydGllc1Rlc3QoRnVuY0F0dHJzVGVzdCk6CisgICAgIyBJbmNsdWRlIHRoZSBleHRlcm5hbCBzZXRVcCBtZXRob2QgdGhhdCBpcyBjb21tb24gdG8gYWxsIHRlc3RzCisgICAgZGVmIHRlc3RfbW9kdWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5fX21vZHVsZV9fLCBfX25hbWVfXykKKworICAgIGRlZiB0ZXN0X2Rpcl9pbmNsdWRlc19jb3JyZWN0X2F0dHJzKHNlbGYpOgorICAgICAgICBzZWxmLmIua25vd25fYXR0ciA9IDcKKyAgICAgICAgc2VsZi5hc3NlcnRJbigna25vd25fYXR0cicsIGRpcihzZWxmLmIpLAorICAgICAgICAgICAgICAgICAgICAgICAgInNldCBhdHRyaWJ1dGVzIG5vdCBpbiBkaXIgbGlzdGluZyBvZiBtZXRob2QiKQorICAgICAgICAjIFRlc3Qgb24gdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3Qgb2YgbWV0aG9kCisgICAgICAgIHNlbGYuZi5hLmltX2Z1bmMua25vd25fYXR0ciA9IDcKKyAgICAgICAgc2VsZi5hc3NlcnRJbigna25vd25fYXR0cicsIGRpcihzZWxmLmYuYSksCisgICAgICAgICAgICAgICAgICAgICAgICAic2V0IGF0dHJpYnV0ZSBvbiB1bmJvdW5kIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3Mgbm90IGluIGRpciIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2tub3duX2F0dHInLCBkaXIoc2VsZi5maS5hKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXQgYXR0cmlidXRlIG9uIHVuYm91bmQgbWV0aG9kIGltcGxlbWVudGF0aW9ucywgIgorICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZCBzaG93IHVwIGluIG5leHQgZGlyIikKKworICAgIGRlZiB0ZXN0X2R1cGxpY2F0ZV9mdW5jdGlvbl9lcXVhbGl0eShzZWxmKToKKyAgICAgICAgIyBCb2R5IG9mIGBkdXBsaWNhdGUnIGlzIHRoZSBleGFjdCBzYW1lIGFzIHNlbGYuYgorICAgICAgICBkZWYgZHVwbGljYXRlKCk6CisgICAgICAgICAgICAnbXkgZG9jc3RyaW5nJworICAgICAgICAgICAgcmV0dXJuIDMKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmIsIGR1cGxpY2F0ZSkKKworICAgIGRlZiB0ZXN0X2NvcHlpbmdfZnVuY19jb2RlKHNlbGYpOgorICAgICAgICBkZWYgdGVzdCgpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdCgpLCBOb25lKQorICAgICAgICB0ZXN0LmZ1bmNfY29kZSA9IHNlbGYuYi5mdW5jX2NvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0KCksIDMpICMgc2VsZi5iIGFsd2F5cyByZXR1cm5zIDMsIGFyYml0cmFyaWx5CisKKyAgICBkZWYgdGVzdF9mdW5jX2dsb2JhbHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5iLmZ1bmNfZ2xvYmFscywgZ2xvYmFscygpKQorICAgICAgICBzZWxmLmNhbm5vdF9zZXRfYXR0cihzZWxmLmIsICdmdW5jX2dsb2JhbHMnLCAyLCBUeXBlRXJyb3IpCisKKyAgICBkZWYgdGVzdF9mdW5jX2Nsb3N1cmUoc2VsZik6CisgICAgICAgIGEgPSAxMgorICAgICAgICBkZWYgZigpOiBwcmludCBhCisgICAgICAgIGMgPSBmLmZ1bmNfY2xvc3VyZQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYywgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAxKQorICAgICAgICAjIGRvbid0IGhhdmUgYSB0eXBlIG9iamVjdCBoYW5keQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNbMF0uX19jbGFzc19fLl9fbmFtZV9fLCAiY2VsbCIpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKGYsICJmdW5jX2Nsb3N1cmUiLCBjLCBUeXBlRXJyb3IpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9jZWxsKHNlbGYpOgorICAgICAgICBkZWYgZigpOiBwcmludCBhCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYuZnVuY19jbG9zdXJlWzBdLmNlbGxfY29udGVudHMKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBiZSBhYmxlIHRvIHJlYWQgYW4gZW1wdHkgY2VsbCIpCisgICAgICAgIGEgPSAxMgorCisgICAgZGVmIHRlc3RfZnVuY19uYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5fX25hbWVfXywgJ2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5mdW5jX25hbWUsICdiJykKKyAgICAgICAgc2VsZi5iLl9fbmFtZV9fID0gJ2MnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLl9fbmFtZV9fLCAnYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLmZ1bmNfbmFtZSwgJ2MnKQorICAgICAgICBzZWxmLmIuZnVuY19uYW1lID0gJ2QnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLl9fbmFtZV9fLCAnZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLmZ1bmNfbmFtZSwgJ2QnKQorICAgICAgICAjIF9fbmFtZV9fIGFuZCBmdW5jX25hbWUgbXVzdCBiZSBhIHN0cmluZworICAgICAgICBzZWxmLmNhbm5vdF9zZXRfYXR0cihzZWxmLmIsICdfX25hbWVfXycsIDcsIFR5cGVFcnJvcikKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5iLCAnZnVuY19uYW1lJywgNywgVHlwZUVycm9yKQorICAgICAgICAjIF9fbmFtZV9fIG11c3QgYmUgYXZhaWxhYmxlIHdoZW4gaW4gcmVzdHJpY3RlZCBtb2RlLiBFeGVjIHdpbGwgcmFpc2UKKyAgICAgICAgIyBBdHRyaWJ1dGVFcnJvciBpZiBfX25hbWVfXyBpcyBub3QgYXZhaWxhYmxlIG9uIGYuCisgICAgICAgIHMgPSAiIiJkZWYgZigpOiBwYXNzXG5mLl9fbmFtZV9fIiIiCisgICAgICAgIGV4ZWMgcyBpbiB7J19fYnVpbHRpbnNfXyc6IHt9fQorICAgICAgICAjIFRlc3Qgb24gbWV0aG9kcywgdG9vCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmEuX19uYW1lX18sICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpLmEuX19uYW1lX18sICdhJykKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5mLmEsICJfX25hbWVfXyIsICdhJywgQXR0cmlidXRlRXJyb3IpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuZmkuYSwgIl9fbmFtZV9fIiwgJ2EnLCBBdHRyaWJ1dGVFcnJvcikKKworICAgIGRlZiB0ZXN0X2Z1bmNfY29kZShzZWxmKToKKyAgICAgICAgbnVtX29uZSwgbnVtX3R3byA9IDcsIDgKKyAgICAgICAgZGVmIGEoKTogcGFzcworICAgICAgICBkZWYgYigpOiByZXR1cm4gMTIKKyAgICAgICAgZGVmIGMoKTogcmV0dXJuIG51bV9vbmUKKyAgICAgICAgZGVmIGQoKTogcmV0dXJuIG51bV90d28KKyAgICAgICAgZGVmIGUoKTogcmV0dXJuIG51bV9vbmUsIG51bV90d28KKyAgICAgICAgZm9yIGZ1bmMgaW4gW2EsIGIsIGMsIGQsIGVdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGZ1bmMuZnVuY19jb2RlKSwgdHlwZXMuQ29kZVR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYygpLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQoKSwgOCkKKyAgICAgICAgZC5mdW5jX2NvZGUgPSBjLmZ1bmNfY29kZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZnVuY19jb2RlLCBkLmZ1bmNfY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjKCksIDcpCisgICAgICAgICMgc2VsZi5hc3NlcnRFcXVhbChkKCksIDcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGIuZnVuY19jb2RlID0gYy5mdW5jX2NvZGUKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImZ1bmNfY29kZSB3aXRoIGRpZmZlcmVudCBudW1iZXJzIG9mIGZyZWUgdmFycyBzaG91bGQgIgorICAgICAgICAgICAgICAgICAgICAgICJub3QgYmUgcG9zc2libGUiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBlLmZ1bmNfY29kZSA9IGQuZnVuY19jb2RlCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJmdW5jX2NvZGUgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiBmcmVlIHZhcnMgc2hvdWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAibm90IGJlIHBvc3NpYmxlIikKKworICAgIGRlZiB0ZXN0X2JsYW5rX2Z1bmNfZGVmYXVsdHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLmZ1bmNfZGVmYXVsdHMsIE5vbmUpCisgICAgICAgIGRlbCBzZWxmLmIuZnVuY19kZWZhdWx0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5mdW5jX2RlZmF1bHRzLCBOb25lKQorCisgICAgZGVmIHRlc3RfZnVuY19kZWZhdWx0X2FyZ3Moc2VsZik6CisgICAgICAgIGRlZiBmaXJzdF9mdW5jKGEsIGIpOgorICAgICAgICAgICAgcmV0dXJuIGErYgorICAgICAgICBkZWYgc2Vjb25kX2Z1bmMoYT0xLCBiPTIpOgorICAgICAgICAgICAgcmV0dXJuIGErYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X2Z1bmMuZnVuY19kZWZhdWx0cywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWNvbmRfZnVuYy5mdW5jX2RlZmF1bHRzLCAoMSwgMikpCisgICAgICAgIGZpcnN0X2Z1bmMuZnVuY19kZWZhdWx0cyA9ICgxLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X2Z1bmMuZnVuY19kZWZhdWx0cywgKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X2Z1bmMoKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9mdW5jKDMpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X2Z1bmMoMywgNSksIDgpCisgICAgICAgIGRlbCBzZWNvbmRfZnVuYy5mdW5jX2RlZmF1bHRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vjb25kX2Z1bmMuZnVuY19kZWZhdWx0cywgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2Vjb25kX2Z1bmMoKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJmdW5jX2RlZmF1bHRzIGRvZXMgbm90IHVwZGF0ZTsgZGVsZXRpbmcgaXQgZG9lcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmUgcmVxdWlyZW1lbnQiKQorCisKK2NsYXNzIEluc3RhbmNlbWV0aG9kQXR0clRlc3QoRnVuY0F0dHJzVGVzdCk6CisgICAgZGVmIHRlc3RfaW1fY2xhc3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmEuaW1fY2xhc3MsIHNlbGYuZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpLmEuaW1fY2xhc3MsIHNlbGYuZikKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5mLmEsICJpbV9jbGFzcyIsIHNlbGYuZiwgVHlwZUVycm9yKQorICAgICAgICBzZWxmLmNhbm5vdF9zZXRfYXR0cihzZWxmLmZpLmEsICJpbV9jbGFzcyIsIHNlbGYuZiwgVHlwZUVycm9yKQorCisgICAgZGVmIHRlc3RfaW1fZnVuYyhzZWxmKToKKyAgICAgICAgc2VsZi5mLmIgPSBzZWxmLmIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYuYi5pbV9mdW5jLCBzZWxmLmIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maS5iLmltX2Z1bmMsIHNlbGYuYikKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5mLmIsICJpbV9mdW5jIiwgc2VsZi5iLCBUeXBlRXJyb3IpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuZmkuYiwgImltX2Z1bmMiLCBzZWxmLmIsIFR5cGVFcnJvcikKKworICAgIGRlZiB0ZXN0X2ltX3NlbGYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmEuaW1fc2VsZiwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpLmEuaW1fc2VsZiwgc2VsZi5maSkKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5mLmEsICJpbV9zZWxmIiwgTm9uZSwgVHlwZUVycm9yKQorICAgICAgICBzZWxmLmNhbm5vdF9zZXRfYXR0cihzZWxmLmZpLmEsICJpbV9zZWxmIiwgc2VsZi5maSwgVHlwZUVycm9yKQorCisgICAgZGVmIHRlc3RfaW1fZnVuY19ub25fbWV0aG9kKHNlbGYpOgorICAgICAgICAjIEJlaGF2aW9yIHNob3VsZCBiZSB0aGUgc2FtZSB3aGVuIGEgbWV0aG9kIGlzIGFkZGVkIHZpYSBhbiBhdHRyCisgICAgICAgICMgYXNzaWdubWVudAorICAgICAgICBzZWxmLmYuaWQgPSB0eXBlcy5NZXRob2RUeXBlKGlkLCBOb25lLCBzZWxmLmYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maS5pZCgpLCBpZChzZWxmLmZpKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpLmlkKCksIGlkKHNlbGYuZikpCisgICAgICAgICMgVGVzdCB1c2FnZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmYuaWQudW5rbm93bl9hdHRyCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgidXNpbmcgdW5rbm93biBhdHRyaWJ1dGVzIHNob3VsZCByYWlzZSBBdHRyaWJ1dGVFcnJvciIpCisgICAgICAgICMgVGVzdCBhc3NpZ25tZW50IGFuZCBkZWxldGlvbgorICAgICAgICBzZWxmLmNhbm5vdF9zZXRfYXR0cihzZWxmLmYuaWQsICd1bmtub3duX2F0dHInLCAyLCBBdHRyaWJ1dGVFcnJvcikKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5maS5pZCwgJ3Vua25vd25fYXR0cicsIDIsIEF0dHJpYnV0ZUVycm9yKQorCisgICAgZGVmIHRlc3RfaW1wbGljaXRfbWV0aG9kX3Byb3BlcnRpZXMoc2VsZik6CisgICAgICAgIHNlbGYuZi5hLmltX2Z1bmMua25vd25fYXR0ciA9IDcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYuYS5rbm93bl9hdHRyLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmkuYS5rbm93bl9hdHRyLCA3KQorCisKK2NsYXNzIEFyYml0cmFyeUZ1bmN0aW9uQXR0clRlc3QoRnVuY0F0dHJzVGVzdCk6CisgICAgZGVmIHRlc3Rfc2V0X2F0dHIoc2VsZik6CisgICAgICAgICMgc2V0dGluZyBhdHRyaWJ1dGVzIG9ubHkgd29ya3Mgb24gZnVuY3Rpb24gb2JqZWN0cworICAgICAgICBzZWxmLmIua25vd25fYXR0ciA9IDcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIua25vd25fYXR0ciwgNykKKyAgICAgICAgZm9yIGZ1bmMgaW4gW3NlbGYuZi5hLCBzZWxmLmZpLmFdOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZ1bmMua25vd25fYXR0ciA9IDcKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic2V0dGluZyBhdHRyaWJ1dGVzIG9uIG1ldGhvZHMgc2hvdWxkIHJhaXNlIGVycm9yIikKKworICAgIGRlZiB0ZXN0X2RlbGV0ZV91bmtub3duX2F0dHIoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBzZWxmLmIudW5rbm93bl9hdHRyCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGVsZXRpbmcgdW5rbm93biBhdHRyaWJ1dGUgc2hvdWxkIHJhaXNlIFR5cGVFcnJvciIpCisKKyAgICBkZWYgdGVzdF9zZXR0aW5nX2F0dHJzX2R1cGxpY2F0ZXMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZi5hLmtsYXNzID0gc2VsZi5mCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2V0dGluZyBhcmJpdHJhcnkgYXR0cmlidXRlIGluIHVuYm91bmQgZnVuY3Rpb24gIgorICAgICAgICAgICAgICAgICAgICAgICIgc2hvdWxkIHJhaXNlIEF0dHJpYnV0ZUVycm9yIikKKyAgICAgICAgc2VsZi5mLmEuaW1fZnVuYy5rbGFzcyA9IHNlbGYuZgorICAgICAgICBmb3IgbWV0aG9kIGluIFtzZWxmLmYuYSwgc2VsZi5maS5hLCBzZWxmLmZpLmEuaW1fZnVuY106CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1ldGhvZC5rbGFzcywgc2VsZi5mKQorCisgICAgZGVmIHRlc3RfdW5zZXRfYXR0cihzZWxmKToKKyAgICAgICAgZm9yIGZ1bmMgaW4gW3NlbGYuYiwgc2VsZi5mLmEsIHNlbGYuZmkuYV06CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnVuYy5ub25fZXhpc3RlbnRfYXR0cgorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1c2luZyB1bmtub3duIGF0dHJpYnV0ZXMgc2hvdWxkIHJhaXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkF0dHJpYnV0ZUVycm9yIikKKworCitjbGFzcyBGdW5jdGlvbkRpY3RzVGVzdChGdW5jQXR0cnNUZXN0KToKKyAgICBkZWYgdGVzdF9zZXR0aW5nX2RpY3RfdG9faW52YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5iLCAnX19kaWN0X18nLCBOb25lLCBUeXBlRXJyb3IpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuYiwgJ2Z1bmNfZGljdCcsIE5vbmUsIFR5cGVFcnJvcikKKyAgICAgICAgZnJvbSBVc2VyRGljdCBpbXBvcnQgVXNlckRpY3QKKyAgICAgICAgZCA9IFVzZXJEaWN0KHsna25vd25fYXR0cic6IDd9KQorICAgICAgICBzZWxmLmNhbm5vdF9zZXRfYXR0cihzZWxmLmYuYS5pbV9mdW5jLCAnX19kaWN0X18nLCBkLCBUeXBlRXJyb3IpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuZmkuYS5pbV9mdW5jLCAnX19kaWN0X18nLCBkLCBUeXBlRXJyb3IpCisKKyAgICBkZWYgdGVzdF9zZXR0aW5nX2RpY3RfdG9fdmFsaWQoc2VsZik6CisgICAgICAgIGQgPSB7J2tub3duX2F0dHInOiA3fQorICAgICAgICBzZWxmLmIuX19kaWN0X18gPSBkCisgICAgICAgICMgU2V0dGluZyBkaWN0IGlzIG9ubHkgcG9zc2libGUgb24gdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0cworICAgICAgICBzZWxmLmYuYS5pbV9mdW5jLl9fZGljdF9fID0gZAorICAgICAgICAjIFRlc3QgYXNzaWdubWVudAorICAgICAgICBzZWxmLmFzc2VydElzKGQsIHNlbGYuYi5fX2RpY3RfXykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhkLCBzZWxmLmIuZnVuY19kaWN0KQorICAgICAgICAjIC4uLiBhbmQgb24gYWxsIHRoZSBkaWZmZXJlbnQgd2F5cyBvZiByZWZlcmVuY2luZyB0aGUgbWV0aG9kJ3MgZnVuYworICAgICAgICBzZWxmLmFzc2VydElzKGQsIHNlbGYuZi5hLmltX2Z1bmMuX19kaWN0X18pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZCwgc2VsZi5mLmEuX19kaWN0X18pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZCwgc2VsZi5maS5hLmltX2Z1bmMuX19kaWN0X18pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZCwgc2VsZi5maS5hLl9fZGljdF9fKQorICAgICAgICAjIFRlc3QgdmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIua25vd25fYXR0ciwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIuX19kaWN0X19bJ2tub3duX2F0dHInXSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIuZnVuY19kaWN0Wydrbm93bl9hdHRyJ10sIDcpCisgICAgICAgICMgLi4uIGFuZCBhZ2Fpbiwgb24gYWxsIHRoZSBkaWZmZXJlbnQgbWV0aG9kJ3MgbmFtZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYuYS5pbV9mdW5jLmtub3duX2F0dHIsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmEua25vd25fYXR0ciwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpLmEuaW1fZnVuYy5rbm93bl9hdHRyLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmkuYS5rbm93bl9hdHRyLCA3KQorCisgICAgZGVmIHRlc3RfZGVsZXRlX2Z1bmNfZGljdChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHNlbGYuYi5fX2RpY3RfXworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJkZWxldGluZyBmdW5jdGlvbiBkaWN0aW9uYXJ5IHNob3VsZCByYWlzZSBUeXBlRXJyb3IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZi5iLmZ1bmNfZGljdAorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJkZWxldGluZyBmdW5jdGlvbiBkaWN0aW9uYXJ5IHNob3VsZCByYWlzZSBUeXBlRXJyb3IiKQorCisgICAgZGVmIHRlc3RfdW5hc3NpZ25lZF9kaWN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5fX2RpY3RfXywge30pCisKKyAgICBkZWYgdGVzdF9mdW5jX2FzX2RpY3Rfa2V5KHNlbGYpOgorICAgICAgICB2YWx1ZSA9ICJTb21lIHN0cmluZyIKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGRbc2VsZi5iXSA9IHZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFtzZWxmLmJdLCB2YWx1ZSkKKworCitjbGFzcyBGdW5jdGlvbkRvY3N0cmluZ1Rlc3QoRnVuY0F0dHJzVGVzdCk6CisgICAgZGVmIHRlc3Rfc2V0X2RvY3N0cmluZ19hdHRyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5fX2RvY19fLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5mdW5jX2RvYywgTm9uZSkKKyAgICAgICAgZG9jc3RyID0gIkEgdGVzdCBtZXRob2QgdGhhdCBkb2VzIG5vdGhpbmciCisgICAgICAgIHNlbGYuYi5fX2RvY19fID0gc2VsZi5mLmEuaW1fZnVuYy5fX2RvY19fID0gZG9jc3RyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLl9fZG9jX18sIGRvY3N0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIuZnVuY19kb2MsIGRvY3N0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYuYS5fX2RvY19fLCBkb2NzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maS5hLl9fZG9jX18sIGRvY3N0cikKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5mLmEsICJfX2RvY19fIiwgZG9jc3RyLCBBdHRyaWJ1dGVFcnJvcikKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5maS5hLCAiX19kb2NfXyIsIGRvY3N0ciwgQXR0cmlidXRlRXJyb3IpCisKKyAgICBkZWYgdGVzdF9kZWxldGVfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmIuX19kb2NfXyA9ICJUaGUgZG9jc3RyaW5nIgorICAgICAgICBkZWwgc2VsZi5iLl9fZG9jX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIuX19kb2NfXywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIuZnVuY19kb2MsIE5vbmUpCisgICAgICAgIHNlbGYuYi5mdW5jX2RvYyA9ICJUaGUgZG9jc3RyaW5nIgorICAgICAgICBkZWwgc2VsZi5iLmZ1bmNfZG9jCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLl9fZG9jX18sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLmZ1bmNfZG9jLCBOb25lKQorCisKK2NsYXNzIFN0YXRpY01ldGhvZEF0dHJzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZnVuY19hdHRyaWJ1dGUoc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgYyA9IGNsYXNzbWV0aG9kKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjLl9fZnVuY19fIGlzIGYpCisKKyAgICAgICAgcyA9IHN0YXRpY21ldGhvZChmKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5fX2Z1bmNfXyBpcyBmKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEZ1bmN0aW9uUHJvcGVydGllc1Rlc3QsIEluc3RhbmNlbWV0aG9kQXR0clRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmJpdHJhcnlGdW5jdGlvbkF0dHJUZXN0LCBGdW5jdGlvbkRpY3RzVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uRG9jc3RyaW5nVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRpY01ldGhvZEF0dHJzVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnVuY2F0dHJzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmNhdHRycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmZDAyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmNhdHRycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnVuY2F0dHJzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmNhdHRycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmZDAyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmNhdHRycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzI0M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKQEAgLTAsMCArMSw0OTcgQEAKK2ltcG9ydCBmdW5jdG9vbHMKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gd2Vha3JlZiBpbXBvcnQgcHJveHkKK2ltcG9ydCBwaWNrbGUKKworQHN0YXRpY21ldGhvZAorZGVmIFB5dGhvblBhcnRpYWwoZnVuYywgKmFyZ3MsICoqa2V5d29yZHMpOgorICAgICdQdXJlIFB5dGhvbiBhcHByb3hpbWF0aW9uIG9mIHBhcnRpYWwoKScKKyAgICBkZWYgbmV3ZnVuYygqZmFyZ3MsICoqZmtleXdvcmRzKToKKyAgICAgICAgbmV3a2V5d29yZHMgPSBrZXl3b3Jkcy5jb3B5KCkKKyAgICAgICAgbmV3a2V5d29yZHMudXBkYXRlKGZrZXl3b3JkcykKKyAgICAgICAgcmV0dXJuIGZ1bmMoKihhcmdzICsgZmFyZ3MpLCAqKm5ld2tleXdvcmRzKQorICAgIG5ld2Z1bmMuZnVuYyA9IGZ1bmMKKyAgICBuZXdmdW5jLmFyZ3MgPSBhcmdzCisgICAgbmV3ZnVuYy5rZXl3b3JkcyA9IGtleXdvcmRzCisgICAgcmV0dXJuIG5ld2Z1bmMKKworZGVmIGNhcHR1cmUoKmFyZ3MsICoqa3cpOgorICAgICIiImNhcHR1cmUgYWxsIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzIiIiCisgICAgcmV0dXJuIGFyZ3MsIGt3CisKK2RlZiBzaWduYXR1cmUocGFydCk6CisgICAgIiIiIHJldHVybiB0aGUgc2lnbmF0dXJlIG9mIGEgcGFydGlhbCBvYmplY3QgIiIiCisgICAgcmV0dXJuIChwYXJ0LmZ1bmMsIHBhcnQuYXJncywgcGFydC5rZXl3b3JkcywgcGFydC5fX2RpY3RfXykKKworY2xhc3MgVGVzdFBhcnRpYWwodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgdGhldHlwZSA9IGZ1bmN0b29scy5wYXJ0aWFsCisKKyAgICBkZWYgdGVzdF9iYXNpY19leGFtcGxlcyhzZWxmKToKKyAgICAgICAgcCA9IHNlbGYudGhldHlwZShjYXB0dXJlLCAxLCAyLCBhPTEwLCBiPTIwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAoMywgNCwgYj0zMCwgYz00MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgxLCAyLCAzLCA0KSwgZGljdChhPTEwLCBiPTMwLCBjPTQwKSkpCisgICAgICAgIHAgPSBzZWxmLnRoZXR5cGUobWFwLCBsYW1iZGEgeDogeCoxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwKFsxLDIsMyw0XSksIFsxMCwgMjAsIDMwLCA0MF0pCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICBwID0gc2VsZi50aGV0eXBlKGNhcHR1cmUsIDEsIDIsIGE9MTAsIGI9MjApCisgICAgICAgICMgYXR0cmlidXRlcyBzaG91bGQgYmUgcmVhZGFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmZ1bmMsIGNhcHR1cmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5hcmdzLCAoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5rZXl3b3JkcywgZGljdChhPTEwLCBiPTIwKSkKKyAgICAgICAgIyBhdHRyaWJ1dGVzIHNob3VsZCBub3QgYmUgd3JpdGFibGUKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi50aGV0eXBlLCB0eXBlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHAsICdmdW5jJywgbWFwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHAsICdhcmdzJywgKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHAsICdrZXl3b3JkcycsIGRpY3QoYT0xLCBiPTIpKQorCisgICAgICAgIHAgPSBzZWxmLnRoZXR5cGUoaGV4KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgcC5fX2RpY3RfXworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdwYXJ0aWFsIG9iamVjdCBhbGxvd2VkIF9fZGljdF9fIHRvIGJlIGRlbGV0ZWQnKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRfY2hlY2tpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50aGV0eXBlKSAgICAgIyBuZWVkIGF0IGxlYXN0IGEgZnVuYyBhcmcKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50aGV0eXBlKDIpKCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnRmlyc3QgYXJnIG5vdCBjaGVja2VkIGZvciBjYWxsYWJpbGl0eScpCisKKyAgICBkZWYgdGVzdF9wcm90ZWN0aW9uX29mX2NhbGxlcnNfZGljdF9hcmd1bWVudChzZWxmKToKKyAgICAgICAgIyBhIGNhbGxlcidzIGRpY3Rpb25hcnkgc2hvdWxkIG5vdCBiZSBhbHRlcmVkIGJ5IHBhcnRpYWwKKyAgICAgICAgZGVmIGZ1bmMoYT0xMCwgYj0yMCk6CisgICAgICAgICAgICByZXR1cm4gYQorICAgICAgICBkID0geydhJzozfQorICAgICAgICBwID0gc2VsZi50aGV0eXBlKGZ1bmMsIGE9NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwKCoqZCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgeydhJzozfSkKKyAgICAgICAgcChiPTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgeydhJzozfSkKKworICAgIGRlZiB0ZXN0X2FyZ19jb21iaW5hdGlvbnMoc2VsZik6CisgICAgICAgICMgZXhlcmNpc2Ugc3BlY2lhbCBjb2RlIHBhdGhzIGZvciB6ZXJvIGFyZ3MgaW4gZWl0aGVyIHBhcnRpYWwKKyAgICAgICAgIyBvYmplY3Qgb3IgdGhlIGNhbGxlcgorICAgICAgICBwID0gc2VsZi50aGV0eXBlKGNhcHR1cmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCgpLCAoKCksIHt9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwKDEsMiksICgoMSwyKSwge30pKQorICAgICAgICBwID0gc2VsZi50aGV0eXBlKGNhcHR1cmUsIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCgpLCAoKDEsMiksIHt9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwKDMsNCksICgoMSwyLDMsNCksIHt9KSkKKworICAgIGRlZiB0ZXN0X2t3X2NvbWJpbmF0aW9ucyhzZWxmKToKKyAgICAgICAgIyBleGVyY2lzZSBzcGVjaWFsIGNvZGUgcGF0aHMgZm9yIG5vIGtleXdvcmQgYXJncyBpbgorICAgICAgICAjIGVpdGhlciB0aGUgcGFydGlhbCBvYmplY3Qgb3IgdGhlIGNhbGxlcgorICAgICAgICBwID0gc2VsZi50aGV0eXBlKGNhcHR1cmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCgpLCAoKCksIHt9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwKGE9MSksICgoKSwgeydhJzoxfSkpCisgICAgICAgIHAgPSBzZWxmLnRoZXR5cGUoY2FwdHVyZSwgYT0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAoKSwgKCgpLCB7J2EnOjF9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwKGI9MiksICgoKSwgeydhJzoxLCAnYic6Mn0pKQorICAgICAgICAjIGtleXdvcmQgYXJncyBpbiB0aGUgY2FsbCBvdmVycmlkZSB0aG9zZSBpbiB0aGUgcGFydGlhbCBvYmplY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwKGE9MywgYj0yKSwgKCgpLCB7J2EnOjMsICdiJzoyfSkpCisKKyAgICBkZWYgdGVzdF9wb3NpdGlvbmFsKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhcmUgY2FwdHVyZWQgY29ycmVjdGx5CisgICAgICAgIGZvciBhcmdzIGluIFsoKSwgKDAsKSwgKDAsMSksICgwLDEsMiksICgwLDEsMiwzKV06CisgICAgICAgICAgICBwID0gc2VsZi50aGV0eXBlKGNhcHR1cmUsICphcmdzKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSBhcmdzICsgKCd4JywpCisgICAgICAgICAgICBnb3QsIGVtcHR5ID0gcCgneCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWQgPT0gZ290IGFuZCBlbXB0eSA9PSB7fSkKKworICAgIGRlZiB0ZXN0X2tleXdvcmQoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIGtleXdvcmQgYXJndW1lbnRzIGFyZSBjYXB0dXJlZCBjb3JyZWN0bHkKKyAgICAgICAgZm9yIGEgaW4gWydhJywgMCwgTm9uZSwgMy41XToKKyAgICAgICAgICAgIHAgPSBzZWxmLnRoZXR5cGUoY2FwdHVyZSwgYT1hKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSB7J2EnOmEsJ3gnOk5vbmV9CisgICAgICAgICAgICBlbXB0eSwgZ290ID0gcCh4PU5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWQgPT0gZ290IGFuZCBlbXB0eSA9PSAoKSkKKworICAgIGRlZiB0ZXN0X25vX3NpZGVfZWZmZWN0cyhzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIHNpZGUgZWZmZWN0cyB0aGF0IGFmZmVjdCBzdWJzZXF1ZW50IGNhbGxzCisgICAgICAgIHAgPSBzZWxmLnRoZXR5cGUoY2FwdHVyZSwgMCwgYT0xKQorICAgICAgICBhcmdzMSwga3cxID0gcCgxLCBiPTIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhcmdzMSA9PSAoMCwxKSBhbmQga3cxID09IHsnYSc6MSwnYic6Mn0pCisgICAgICAgIGFyZ3MyLCBrdzIgPSBwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFyZ3MyID09ICgwLCkgYW5kIGt3MiA9PSB7J2EnOjF9KQorCisgICAgZGVmIHRlc3RfZXJyb3JfcHJvcGFnYXRpb24oc2VsZik6CisgICAgICAgIGRlZiBmKHgsIHkpOgorICAgICAgICAgICAgeCAvLyB5CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBzZWxmLnRoZXR5cGUoZiwgMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBzZWxmLnRoZXR5cGUoZiwgMSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBzZWxmLnRoZXR5cGUoZiksIDEsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBzZWxmLnRoZXR5cGUoZiwgeT0wKSwgMSkKKworICAgIGRlZiB0ZXN0X3dlYWtyZWYoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLnRoZXR5cGUoaW50LCBiYXNlPTE2KQorICAgICAgICBwID0gcHJveHkoZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmZ1bmMsIHAuZnVuYykKKyAgICAgICAgZiA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUmVmZXJlbmNlRXJyb3IsIGdldGF0dHIsIHAsICdmdW5jJykKKworICAgIGRlZiB0ZXN0X3dpdGhfYm91bmRfYW5kX3VuYm91bmRfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgZGF0YSA9IG1hcChzdHIsIHJhbmdlKDEwKSkKKyAgICAgICAgam9pbiA9IHNlbGYudGhldHlwZShzdHIuam9pbiwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoam9pbihkYXRhKSwgJzAxMjM0NTY3ODknKQorICAgICAgICBqb2luID0gc2VsZi50aGV0eXBlKCcnLmpvaW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoam9pbihkYXRhKSwgJzAxMjM0NTY3ODknKQorCisgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgorICAgICAgICBmID0gc2VsZi50aGV0eXBlKHNpZ25hdHVyZSwgJ2FzZGYnLCBiYXI9VHJ1ZSkKKyAgICAgICAgZi5hZGRfc29tZXRoaW5nX3RvX19kaWN0X18gPSBUcnVlCisgICAgICAgIGZfY29weSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmF0dXJlKGYpLCBzaWduYXR1cmUoZl9jb3B5KSkKKworICAgICMgSXNzdWUgNjA4MzogUmVmZXJlbmNlIGNvdW50aW5nIGJ1ZworICAgIGRlZiB0ZXN0X3NldHN0YXRlX3JlZmNvdW50KHNlbGYpOgorICAgICAgICBjbGFzcyBCYWRTZXF1ZW5jZToKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICBpZiBrZXkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1heAorICAgICAgICAgICAgICAgIGVsaWYga2V5ID09IDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0dXBsZShyYW5nZSgxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICBlbGlmIGtleSBpbiAoMiwgMyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB7fQorICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKworICAgICAgICBmID0gc2VsZi50aGV0eXBlKG9iamVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXJyb3IsIGYuX19zZXRzdGF0ZV9fLCBCYWRTZXF1ZW5jZSgpKQorCitjbGFzcyBQYXJ0aWFsU3ViY2xhc3MoZnVuY3Rvb2xzLnBhcnRpYWwpOgorICAgIHBhc3MKKworY2xhc3MgVGVzdFBhcnRpYWxTdWJjbGFzcyhUZXN0UGFydGlhbCk6CisKKyAgICB0aGV0eXBlID0gUGFydGlhbFN1YmNsYXNzCisKK2NsYXNzIFRlc3RQeXRob25QYXJ0aWFsKFRlc3RQYXJ0aWFsKToKKworICAgIHRoZXR5cGUgPSBQeXRob25QYXJ0aWFsCisKKyAgICAjIHRoZSBweXRob24gdmVyc2lvbiBpc24ndCBwaWNrbGFibGUKKyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6IHBhc3MKKyAgICBkZWYgdGVzdF9zZXRzdGF0ZV9yZWZjb3VudChzZWxmKTogcGFzcworCitjbGFzcyBUZXN0VXBkYXRlV3JhcHBlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2tfd3JhcHBlcihzZWxmLCB3cmFwcGVyLCB3cmFwcGVkLAorICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkPWZ1bmN0b29scy5XUkFQUEVSX0FTU0lHTk1FTlRTLAorICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQ9ZnVuY3Rvb2xzLldSQVBQRVJfVVBEQVRFUyk6CisgICAgICAgICMgQ2hlY2sgYXR0cmlidXRlcyB3ZXJlIGFzc2lnbmVkCisgICAgICAgIGZvciBuYW1lIGluIGFzc2lnbmVkOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdldGF0dHIod3JhcHBlciwgbmFtZSkgaXMgZ2V0YXR0cih3cmFwcGVkLCBuYW1lKSkKKyAgICAgICAgIyBDaGVjayBhdHRyaWJ1dGVzIHdlcmUgdXBkYXRlZAorICAgICAgICBmb3IgbmFtZSBpbiB1cGRhdGVkOgorICAgICAgICAgICAgd3JhcHBlcl9hdHRyID0gZ2V0YXR0cih3cmFwcGVyLCBuYW1lKQorICAgICAgICAgICAgd3JhcHBlZF9hdHRyID0gZ2V0YXR0cih3cmFwcGVkLCBuYW1lKQorICAgICAgICAgICAgZm9yIGtleSBpbiB3cmFwcGVkX2F0dHI6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyYXBwZWRfYXR0cltrZXldIGlzIHdyYXBwZXJfYXR0cltrZXldKQorCisgICAgZGVmIF9kZWZhdWx0X3VwZGF0ZShzZWxmKToKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSB0ZXN0IiIiCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGYuYXR0ciA9ICdUaGlzIGlzIGFsc28gYSB0ZXN0JworICAgICAgICBkZWYgd3JhcHBlcigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmdW5jdG9vbHMudXBkYXRlX3dyYXBwZXIod3JhcHBlciwgZikKKyAgICAgICAgcmV0dXJuIHdyYXBwZXIsIGYKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfdXBkYXRlKHNlbGYpOgorICAgICAgICB3cmFwcGVyLCBmID0gc2VsZi5fZGVmYXVsdF91cGRhdGUoKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXBwZXIod3JhcHBlciwgZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fbmFtZV9fLCAnZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5hdHRyLCAnVGhpcyBpcyBhbHNvIGEgdGVzdCcpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3VwZGF0ZV9kb2Moc2VsZik6CisgICAgICAgIHdyYXBwZXIsIGYgPSBzZWxmLl9kZWZhdWx0X3VwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5fX2RvY19fLCAnVGhpcyBpcyBhIHRlc3QnKQorCisgICAgZGVmIHRlc3Rfbm9fdXBkYXRlKHNlbGYpOgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIHRlc3QiIiIKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZi5hdHRyID0gJ1RoaXMgaXMgYWxzbyBhIHRlc3QnCisgICAgICAgIGRlZiB3cmFwcGVyKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZ1bmN0b29scy51cGRhdGVfd3JhcHBlcih3cmFwcGVyLCBmLCAoKSwgKCkpCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcHBlcih3cmFwcGVyLCBmLCAoKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5fX25hbWVfXywgJ3dyYXBwZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19kb2NfXywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHdyYXBwZXIsICdhdHRyJykpCisKKyAgICBkZWYgdGVzdF9zZWxlY3RpdmVfdXBkYXRlKHNlbGYpOgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmLmF0dHIgPSAnVGhpcyBpcyBhIGRpZmZlcmVudCB0ZXN0JworICAgICAgICBmLmRpY3RfYXR0ciA9IGRpY3QoYT0xLCBiPTIsIGM9MykKKyAgICAgICAgZGVmIHdyYXBwZXIoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd3JhcHBlci5kaWN0X2F0dHIgPSB7fQorICAgICAgICBhc3NpZ24gPSAoJ2F0dHInLCkKKyAgICAgICAgdXBkYXRlID0gKCdkaWN0X2F0dHInLCkKKyAgICAgICAgZnVuY3Rvb2xzLnVwZGF0ZV93cmFwcGVyKHdyYXBwZXIsIGYsIGFzc2lnbiwgdXBkYXRlKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXBwZXIod3JhcHBlciwgZiwgYXNzaWduLCB1cGRhdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5fX25hbWVfXywgJ3dyYXBwZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19kb2NfXywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLmF0dHIsICdUaGlzIGlzIGEgZGlmZmVyZW50IHRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuZGljdF9hdHRyLCBmLmRpY3RfYXR0cikKKworICAgIEB0ZXN0X3N1cHBvcnQucmVxdWlyZXNfZG9jc3RyaW5ncworICAgIGRlZiB0ZXN0X2J1aWx0aW5fdXBkYXRlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTU3NjI0MQorICAgICAgICBkZWYgd3JhcHBlcigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmdW5jdG9vbHMudXBkYXRlX3dyYXBwZXIod3JhcHBlciwgbWF4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19uYW1lX18sICdtYXgnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod3JhcHBlci5fX2RvY19fLnN0YXJ0c3dpdGgoJ21heCgnKSkKKworY2xhc3MgVGVzdFdyYXBzKFRlc3RVcGRhdGVXcmFwcGVyKToKKworICAgIGRlZiBfZGVmYXVsdF91cGRhdGUoc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgdGVzdCIiIgorICAgICAgICAgICAgcGFzcworICAgICAgICBmLmF0dHIgPSAnVGhpcyBpcyBhbHNvIGEgdGVzdCcKKyAgICAgICAgQGZ1bmN0b29scy53cmFwcyhmKQorICAgICAgICBkZWYgd3JhcHBlcigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmNoZWNrX3dyYXBwZXIod3JhcHBlciwgZikKKyAgICAgICAgcmV0dXJuIHdyYXBwZXIKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfdXBkYXRlKHNlbGYpOgorICAgICAgICB3cmFwcGVyID0gc2VsZi5fZGVmYXVsdF91cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19uYW1lX18sICdmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLmF0dHIsICdUaGlzIGlzIGFsc28gYSB0ZXN0JykKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0X2RlZmF1bHRfdXBkYXRlX2RvYyhzZWxmKToKKyAgICAgICAgd3JhcHBlciA9IHNlbGYuX2RlZmF1bHRfdXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fZG9jX18sICdUaGlzIGlzIGEgdGVzdCcpCisKKyAgICBkZWYgdGVzdF9ub191cGRhdGUoc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgdGVzdCIiIgorICAgICAgICAgICAgcGFzcworICAgICAgICBmLmF0dHIgPSAnVGhpcyBpcyBhbHNvIGEgdGVzdCcKKyAgICAgICAgQGZ1bmN0b29scy53cmFwcyhmLCAoKSwgKCkpCisgICAgICAgIGRlZiB3cmFwcGVyKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcHBlcih3cmFwcGVyLCBmLCAoKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5fX25hbWVfXywgJ3dyYXBwZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19kb2NfXywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHdyYXBwZXIsICdhdHRyJykpCisKKyAgICBkZWYgdGVzdF9zZWxlY3RpdmVfdXBkYXRlKHNlbGYpOgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmLmF0dHIgPSAnVGhpcyBpcyBhIGRpZmZlcmVudCB0ZXN0JworICAgICAgICBmLmRpY3RfYXR0ciA9IGRpY3QoYT0xLCBiPTIsIGM9MykKKyAgICAgICAgZGVmIGFkZF9kaWN0X2F0dHIoZik6CisgICAgICAgICAgICBmLmRpY3RfYXR0ciA9IHt9CisgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICBhc3NpZ24gPSAoJ2F0dHInLCkKKyAgICAgICAgdXBkYXRlID0gKCdkaWN0X2F0dHInLCkKKyAgICAgICAgQGZ1bmN0b29scy53cmFwcyhmLCBhc3NpZ24sIHVwZGF0ZSkKKyAgICAgICAgQGFkZF9kaWN0X2F0dHIKKyAgICAgICAgZGVmIHdyYXBwZXIoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5jaGVja193cmFwcGVyKHdyYXBwZXIsIGYsIGFzc2lnbiwgdXBkYXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19uYW1lX18sICd3cmFwcGVyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fZG9jX18sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5hdHRyLCAnVGhpcyBpcyBhIGRpZmZlcmVudCB0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLmRpY3RfYXR0ciwgZi5kaWN0X2F0dHIpCisKKworY2xhc3MgVGVzdFJlZHVjZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9yZWR1Y2Uoc2VsZik6CisgICAgICAgIGNsYXNzIFNxdWFyZXM6CisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXgpOgorICAgICAgICAgICAgICAgIHNlbGYubWF4ID0gbWF4CisgICAgICAgICAgICAgICAgc2VsZi5zb2ZhciA9IFtdCisKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuc29mYXIpCisKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBpZiBub3QgMCA8PSBpIDwgc2VsZi5tYXg6IHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgICAgICAgICBuID0gbGVuKHNlbGYuc29mYXIpCisgICAgICAgICAgICAgICAgd2hpbGUgbiA8PSBpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNvZmFyLmFwcGVuZChuKm4pCisgICAgICAgICAgICAgICAgICAgIG4gKz0gMQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNvZmFyW2ldCisKKyAgICAgICAgcmVkdWNlID0gZnVuY3Rvb2xzLnJlZHVjZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShsYW1iZGEgeCwgeTogeCt5LCBbJ2EnLCAnYicsICdjJ10sICcnKSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICByZWR1Y2UobGFtYmRhIHgsIHk6IHgreSwgW1snYScsICdjJ10sIFtdLCBbJ2QnLCAndyddXSwgW10pLAorICAgICAgICAgICAgWydhJywnYycsJ2QnLCd3J10KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShsYW1iZGEgeCwgeTogeCp5LCByYW5nZSgyLDgpLCAxKSwgNTA0MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHJlZHVjZShsYW1iZGEgeCwgeTogeCp5LCByYW5nZSgyLDIxKSwgMUwpLAorICAgICAgICAgICAgMjQzMjkwMjAwODE3NjY0MDAwMEwKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShsYW1iZGEgeCwgeTogeCt5LCBTcXVhcmVzKDEwKSksIDI4NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UobGFtYmRhIHgsIHk6IHgreSwgU3F1YXJlcygxMCksIDApLCAyODUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGxhbWJkYSB4LCB5OiB4K3ksIFNxdWFyZXMoMCksIDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZHVjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWR1Y2UsIDQyLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWR1Y2UsIDQyLCA0MiwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKDQyLCAiMSIpLCAiMSIpICMgZnVuYyBpcyBuZXZlciBjYWxsZWQgd2l0aCBvbmUgaXRlbQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZSg0MiwgIiIsICIxIiksICIxIikgIyBmdW5jIGlzIG5ldmVyIGNhbGxlZCB3aXRoIG9uZSBpdGVtCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVkdWNlLCA0MiwgKDQyLCA0MikpCisKK2NsYXNzIFRlc3RDbXBUb0tleSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY21wX3RvX2tleShzZWxmKToKKyAgICAgICAgZGVmIG15Y21wKHgsIHkpOgorICAgICAgICAgICAgcmV0dXJuIHkgLSB4CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHJhbmdlKDUpLCBrZXk9ZnVuY3Rvb2xzLmNtcF90b19rZXkobXljbXApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbNCwgMywgMiwgMSwgMF0pCisKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYpOgorICAgICAgICBkZWYgbXljbXAoeCwgeSk6CisgICAgICAgICAgICByZXR1cm4geSAtIHgKKyAgICAgICAga2V5ID0gZnVuY3Rvb2xzLmNtcF90b19rZXkobXljbXApCisgICAgICAgIGsgPSBrZXkoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaChrKSkKKworY2xhc3MgVGVzdFRvdGFsT3JkZXJpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdG90YWxfb3JkZXJpbmdfbHQoc2VsZik6CisgICAgICAgIEBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA8IG90aGVyLnZhbHVlCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA9PSBvdGhlci52YWx1ZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgxKSA8IEEoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDIpID4gQSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMSkgPD0gQSgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPj0gQSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPD0gQSgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPj0gQSgyKSkKKworICAgIGRlZiB0ZXN0X3RvdGFsX29yZGVyaW5nX2xlKHNlbGYpOgorICAgICAgICBAZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPD0gb3RoZXIudmFsdWUKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlID09IG90aGVyLnZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDEpIDwgQSgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPiBBKDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgxKSA8PSBBKDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgyKSA+PSBBKDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgyKSA8PSBBKDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgyKSA+PSBBKDIpKQorCisgICAgZGVmIHRlc3RfdG90YWxfb3JkZXJpbmdfZ3Qoc2VsZik6CisgICAgICAgIEBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA+IG90aGVyLnZhbHVlCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA9PSBvdGhlci52YWx1ZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgxKSA8IEEoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDIpID4gQSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMSkgPD0gQSgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPj0gQSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPD0gQSgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPj0gQSgyKSkKKworICAgIGRlZiB0ZXN0X3RvdGFsX29yZGVyaW5nX2dlKHNlbGYpOgorICAgICAgICBAZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPj0gb3RoZXIudmFsdWUKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlID09IG90aGVyLnZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDEpIDwgQSgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPiBBKDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgxKSA8PSBBKDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgyKSA+PSBBKDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgyKSA8PSBBKDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgyKSA+PSBBKDIpKQorCisgICAgZGVmIHRlc3RfdG90YWxfb3JkZXJpbmdfbm9fb3ZlcndyaXRlKHNlbGYpOgorICAgICAgICAjIG5ldyBtZXRob2RzIHNob3VsZCBub3Qgb3ZlcndyaXRlIGV4aXN0aW5nCisgICAgICAgIEBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcKKyAgICAgICAgY2xhc3MgQShzdHIpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgiYSIpIDwgQSgiYiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgiYiIpID4gQSgiYSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgiYSIpIDw9IEEoImIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoImIiKSA+PSBBKCJhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKCJiIikgPD0gQSgiYiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgiYiIpID49IEEoImIiKSkKKworICAgIGRlZiB0ZXN0X25vX29wZXJhdGlvbnNfZGVmaW5lZChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIEBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfYnVnXzEwMDQyKHNlbGYpOgorICAgICAgICBAZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nCisgICAgICAgIGNsYXNzIFRlc3RUTzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBUZXN0VE8pOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA9PSBvdGhlci52YWx1ZQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVGVzdFRPKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPCBvdGhlci52YWx1ZQorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBUZXN0VE8oOCkgPD0gKCkKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3RfY2xhc3NlcyA9ICgKKyAgICAgICAgVGVzdFBhcnRpYWwsCisgICAgICAgIFRlc3RQYXJ0aWFsU3ViY2xhc3MsCisgICAgICAgIFRlc3RQeXRob25QYXJ0aWFsLAorICAgICAgICBUZXN0VXBkYXRlV3JhcHBlciwKKyAgICAgICAgVGVzdFRvdGFsT3JkZXJpbmcsCisgICAgICAgIFRlc3RXcmFwcywKKyAgICAgICAgVGVzdFJlZHVjZSwKKyAgICApCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorCisgICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCisgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgIGltcG9ydCBnYworICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcHJpbnQgY291bnRzCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmN0b29scy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jdG9vbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3Yzg3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jdG9vbHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmN0b29scy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jdG9vbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3Yzg3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jdG9vbHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGY5YzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlLnB5CkBAIC0wLDAgKzEsMTE5IEBACisjIFRlc3QgdmFyaW91cyBmbGF2b3JzIG9mIGxlZ2FsIGFuZCBpbGxlZ2FsIGZ1dHVyZSBzdGF0ZW1lbnRzCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCByZQorCityeCA9IHJlLmNvbXBpbGUoJ1woKFxTKykucHksIGxpbmUgKFxkKyknKQorCitkZWYgZ2V0X2Vycm9yX2xvY2F0aW9uKG1zZyk6CisgICAgbW8gPSByeC5zZWFyY2goc3RyKG1zZykpCisgICAgcmV0dXJuIG1vLmdyb3VwKDEsIDIpCisKK2NsYXNzIEZ1dHVyZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZnV0dXJlMShzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubG9hZCgndGVzdF9mdXR1cmUxJykKKyAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2Z1dHVyZTEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0X2Z1dHVyZTEucmVzdWx0LCA2KQorCisgICAgZGVmIHRlc3RfZnV0dXJlMihzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubG9hZCgndGVzdF9mdXR1cmUyJykKKyAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2Z1dHVyZTIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0X2Z1dHVyZTIucmVzdWx0LCA2KQorCisgICAgZGVmIHRlc3RfZnV0dXJlMyhzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubG9hZCgndGVzdF9mdXR1cmUzJykKKyAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2Z1dHVyZTMKKworICAgIGRlZiB0ZXN0X2JhZGZ1dHVyZTMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgYmFkc3ludGF4X2Z1dHVyZTMKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yLCBtc2c6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9lcnJvcl9sb2NhdGlvbihtc2cpLCAoImJhZHN5bnRheF9mdXR1cmUzIiwgJzMnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIGRpZG4ndCBvY2N1ciIpCisKKyAgICBkZWYgdGVzdF9iYWRmdXR1cmU0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRlc3QgaW1wb3J0IGJhZHN5bnRheF9mdXR1cmU0CisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgbXNnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZXJyb3JfbG9jYXRpb24obXNnKSwgKCJiYWRzeW50YXhfZnV0dXJlNCIsICczJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiBkaWRuJ3Qgb2NjdXIiKQorCisgICAgZGVmIHRlc3RfYmFkZnV0dXJlNShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCBiYWRzeW50YXhfZnV0dXJlNQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2Vycm9yX2xvY2F0aW9uKG1zZyksICgiYmFkc3ludGF4X2Z1dHVyZTUiLCAnNCcpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24gZGlkbid0IG9jY3VyIikKKworICAgIGRlZiB0ZXN0X2JhZGZ1dHVyZTYoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgYmFkc3ludGF4X2Z1dHVyZTYKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yLCBtc2c6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9lcnJvcl9sb2NhdGlvbihtc2cpLCAoImJhZHN5bnRheF9mdXR1cmU2IiwgJzMnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIGRpZG4ndCBvY2N1ciIpCisKKyAgICBkZWYgdGVzdF9iYWRmdXR1cmU3KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRlc3QgaW1wb3J0IGJhZHN5bnRheF9mdXR1cmU3CisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgbXNnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZXJyb3JfbG9jYXRpb24obXNnKSwgKCJiYWRzeW50YXhfZnV0dXJlNyIsICczJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiBkaWRuJ3Qgb2NjdXIiKQorCisgICAgZGVmIHRlc3RfYmFkZnV0dXJlOChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCBiYWRzeW50YXhfZnV0dXJlOAorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2Vycm9yX2xvY2F0aW9uKG1zZyksICgiYmFkc3ludGF4X2Z1dHVyZTgiLCAnMycpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24gZGlkbid0IG9jY3VyIikKKworICAgIGRlZiB0ZXN0X2JhZGZ1dHVyZTkoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgYmFkc3ludGF4X2Z1dHVyZTkKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yLCBtc2c6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9lcnJvcl9sb2NhdGlvbihtc2cpLCAoImJhZHN5bnRheF9mdXR1cmU5IiwgJzMnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIGRpZG4ndCBvY2N1ciIpCisKKyAgICBkZWYgdGVzdF9wYXJzZXJoYWNrKHNlbGYpOgorICAgICAgICAjIHRlc3QgdGhhdCB0aGUgcGFyc2VyLmM6OmZ1dHVyZV9oYWNrIGZ1bmN0aW9uIHdvcmtzIGFzIGV4cGVjdGVkCisgICAgICAgICMgTm90ZTogYWx0aG91Z2ggdGhpcyB0ZXN0IG11c3QgcGFzcywgaXQncyBub3QgdGVzdGluZyB0aGUgb3JpZ2luYWwKKyAgICAgICAgIyAgICAgICBidWcgYXMgb2YgMi42IHNpbmNlIHRoZSB3aXRoIHN0YXRlbWVudCBpcyBub3Qgb3B0aW9uYWwgYW5kCisgICAgICAgICMgICAgICAgdGhlIHBhcnNlciBoYWNrIGRpc2FibGVkLiBJZiBhIG5ldyBrZXl3b3JkIGlzIGludHJvZHVjZWQgaW4KKyAgICAgICAgIyAgICAgICAyLjYsIGNoYW5nZSB0aGlzIHRvIHJlZmVyIHRvIHRoZSBuZXcgZnV0dXJlIGltcG9ydC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYyAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbjsgcHJpbnQgMCIKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzeW50YXggZXJyb3IgZGlkbid0IG9jY3VyIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IChwcmludF9mdW5jdGlvbik7IHByaW50IDAiCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic3ludGF4IGVycm9yIGRpZG4ndCBvY2N1ciIpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9mZWF0dXJlcyhzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubG9hZCgidGVzdC50ZXN0X2Z1dHVyZTUiKQorICAgICAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfZnV0dXJlNQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9saXRlcmFsc19leGVjKHNlbGYpOgorICAgICAgICBzY29wZSA9IHt9CisgICAgICAgIGV4ZWMgImZyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFsczsgeCA9ICcnIiBpbiBzY29wZQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2NvcGVbIngiXSwgdW5pY29kZSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChGdXR1cmVUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmJmYzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmJmYzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUxLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdjMmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMS5weQpAQCAtMCwwICsxLDExIEBACisiIiJUaGlzIGlzIGEgdGVzdCIiIgorCisjIEltcG9ydCB0aGUgbmFtZSBuZXN0ZWRfc2NvcGVzIHR3aWNlIHRvIHRyaWdnZXIgU0YgYnVnICM0MDczOTQgKHJlZ3Jlc3Npb24pLgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzLCBuZXN0ZWRfc2NvcGVzCisKK2RlZiBmKHgpOgorICAgIGRlZiBnKHkpOgorICAgICAgICByZXR1cm4geCArIHkKKyAgICByZXR1cm4gZworCityZXN1bHQgPSBmKDIpKDQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUxLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NjI0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUxLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUxLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NjI0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUxLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWViNzMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMi5weQpAQCAtMCwwICsxLDEwIEBACisiIiJUaGlzIGlzIGEgdGVzdCIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXM7IGltcG9ydCBzdHJpbmcKKworZGVmIGYoeCk6CisgICAgZGVmIGcoeSk6CisgICAgICAgIHJldHVybiB4ICsgeQorICAgIHJldHVybiBnCisKK3Jlc3VsdCA9IGYoMikoNCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyZGM2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyZGM2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjM1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUzLnB5CkBAIC0wLDAgKzEsMzAgQEAKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK3ggPSAyCitkZWYgbmVzdGVyKCk6CisgICAgeCA9IDMKKyAgICBkZWYgaW5uZXIoKToKKyAgICAgICAgcmV0dXJuIHgKKyAgICByZXR1cm4gaW5uZXIoKQorCisKK2NsYXNzIFRlc3RGdXR1cmUodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZmxvb3JfZGl2X29wZXJhdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDcgLy8gMiwgMykKKworICAgIGRlZiB0ZXN0X3RydWVfZGl2X2FzX2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoNyAvIDIsIDMuNSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF9zY29wZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmVzdGVyKCksIDMpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RGdXR1cmUpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2NDQyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2NDQyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZjhhZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU0LnB5CkBAIC0wLDAgKzEsNDcgQEAKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIFRlc3RGdXR1cmUodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBhc3NlcnRUeXBlKHNlbGYsIG9iaiwgdHlwKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUob2JqKSBpcyB0eXAsCisgICAgICAgICAgICAidHlwZSglcikgaXMgJXIsIG5vdCAlciIgJSAob2JqLCB0eXBlKG9iaiksIHR5cCkpCisKKyAgICBkZWYgdGVzdF91bmljb2RlX3N0cmluZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZSgiIiwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKCcnLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUociIiLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUocicnLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUoIiIiICIiIiwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKCcnJyAnJycsIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZShyIiIiICIiIiwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKHInJycgJycnLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUodSIiLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUodScnLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUodXIiIiwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKHVyJycsIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZSh1IiIiICIiIiwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKHUnJycgJycnLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUodXIiIiIgIiIiLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUodXInJycgJycnLCB1bmljb2RlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZShiIiIsIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKGInJywgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUoYnIiIiwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUoYnInJywgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUoYiIiIiAiIiIsIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKGInJycgJycnLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZShiciIiIiAiIiIsIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKGJyJycnICcnJywgc3RyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZSgnJyAnJywgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKCcnIHUnJywgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKHUnJyAnJywgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKHUnJyB1JycsIHVuaWNvZGUpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RGdXR1cmUpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlNC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmZTJjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlNC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFmZTJjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODQwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU1LnB5CkBAIC0wLDAgKzEsMjEgQEAKKyMgQ2hlY2sgdGhhdCBtdWx0aXBsZSBmZWF0dXJlcyBjYW4gYmUgZW5hYmxlZC4KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscywgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIC4gaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK2NsYXNzIFRlc3RNdWx0aXBsZUZlYXR1cmVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSgiIiwgdW5pY29kZSkKKworICAgIGRlZiB0ZXN0X3ByaW50X2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jYXB0dXJlZF9vdXRwdXQoInN0ZGVyciIpIGFzIHM6CisgICAgICAgICAgICBwcmludCgiZm9vIiwgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgImZvb1xuIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0TXVsdGlwbGVGZWF0dXJlcykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlNS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjYjQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlNS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjYjQ1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZV9idWlsdGlucy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZV9idWlsdGlucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmMzNzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlX2J1aWx0aW5zLnB5CkBAIC0wLDAgKzEsMzggQEAKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydCwgdW5pdHRlc3QKKworIyB3ZSdyZSB0ZXN0aW5nIHRoZSBiZWhhdmlvciBvZiB0aGVzZSBmdXR1cmUgYnVpbHRpbnM6Citmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgaGV4LCBvY3QsIG1hcCwgemlwLCBmaWx0ZXIKKworY2xhc3MgQnVpbHRpblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2hleChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZXgoMCksICcweDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleCgxNiksICcweDEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZXgoMTZMKSwgJzB4MTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleCgtMTYpLCAnLTB4MTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleCgtMTZMKSwgJy0weDEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoZXgsIHt9KQorCisgICAgZGVmIHRlc3Rfb2N0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9jdCgwKSwgJzBvMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2N0KDEwMCksICcwbzE0NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2N0KDEwMEwpLCAnMG8xNDQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9jdCgtMTAwKSwgJy0wbzE0NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2N0KC0xMDBMKSwgJy0wbzE0NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb2N0LCAoKSkKKworICAgIGRlZiB0ZXN0X2l0ZXJ0b29scyhzZWxmKToKKyAgICAgICAgZnJvbSBpdGVydG9vbHMgaW1wb3J0IGltYXAsIGl6aXAsIGlmaWx0ZXIKKyAgICAgICAgIyBXZSB3aWxsIGFzc3VtZSB0aGF0IHRoZSBpdGVydG9vbHMgZnVuY3Rpb25zIHdvcmssIHNvIHByb3ZpZGVkCisgICAgICAgICMgdGhhdCB3ZSd2ZSBnb3QgaWRlbnRpY2FsIGNvcHBpZXMsIHdlIHdpbGwgd29yayEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAsIGltYXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwLCBpemlwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlciwgaWZpbHRlcikKKyAgICAgICAgIyBUZXN0aW5nIHRoYXQgZmlsdGVyKE5vbmUsIHN0dWZmKSByYWlzZXMgYSB3YXJuaW5nIGxpdmVzIGluCisgICAgICAgICMgdGVzdF9weTNrd2Fybi5weQorCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQnVpbHRpblRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZV9idWlsdGlucy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmVfYnVpbHRpbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNDdmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmVfYnVpbHRpbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZV9idWlsdGlucy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmVfYnVpbHRpbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNDdmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmVfYnVpbHRpbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2djLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4NzRjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2djLnB5CkBAIC0wLDAgKzEsNzA4IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHJ1bl91bml0dGVzdAoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCBnYworaW1wb3J0IHdlYWtyZWYKKwordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCisKKyMjIyBTdXBwb3J0IGNvZGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBCdWcgMTA1NTgyMCBoYXMgc2V2ZXJhbCB0ZXN0cyBvZiBsb25nc3RhbmRpbmcgYnVncyBpbnZvbHZpbmcgd2Vha3JlZnMgYW5kCisjIGN5Y2xpYyBnYy4KKworIyBBbiBpbnN0YW5jZSBvZiBDMTA1NTgyMCBoYXMgYSBzZWxmLWxvb3AsIHNvIGJlY29tZXMgY3ljbGljIHRyYXNoIHdoZW4KKyMgdW5yZWFjaGFibGUuCitjbGFzcyBDMTA1NTgyMChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpKToKKyAgICAgICAgc2VsZi5pID0gaQorICAgICAgICBzZWxmLmxvb3AgPSBzZWxmCisKK2NsYXNzIEdDX0RldGVjdG9yKG9iamVjdCk6CisgICAgIyBDcmVhdGUgYW4gaW5zdGFuY2UgSS4gIFRoZW4gZ2MgaGFzbid0IGhhcHBlbmVkIGFnYWluIHNvIGxvbmcgYXMKKyAgICAjIEkuZ2NfaGFwcGVuZWQgaXMgZmFsc2UuCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZ2NfaGFwcGVuZWQgPSBGYWxzZQorCisgICAgICAgIGRlZiBpdF9oYXBwZW5lZChpZ25vcmVkKToKKyAgICAgICAgICAgIHNlbGYuZ2NfaGFwcGVuZWQgPSBUcnVlCisKKyAgICAgICAgIyBDcmVhdGUgYSBwaWVjZSBvZiBjeWNsaWMgdHJhc2ggdGhhdCB0cmlnZ2VycyBpdF9oYXBwZW5lZCB3aGVuCisgICAgICAgICMgZ2MgY29sbGVjdHMgaXQuCisgICAgICAgIHNlbGYud3IgPSB3ZWFrcmVmLnJlZihDMTA1NTgyMCg2NjYpLCBpdF9oYXBwZW5lZCkKKworCisjIyMgVGVzdHMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgR0NUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbGlzdChzZWxmKToKKyAgICAgICAgbCA9IFtdCisgICAgICAgIGwuYXBwZW5kKGwpCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBkZWwgbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmNvbGxlY3QoKSwgMSkKKworICAgIGRlZiB0ZXN0X2RpY3Qoc2VsZik6CisgICAgICAgIGQgPSB7fQorICAgICAgICBkWzFdID0gZAorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZGVsIGQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5jb2xsZWN0KCksIDEpCisKKyAgICBkZWYgdGVzdF90dXBsZShzZWxmKToKKyAgICAgICAgIyBzaW5jZSB0dXBsZXMgYXJlIGltbXV0YWJsZSB3ZSBjbG9zZSB0aGUgbG9vcCB3aXRoIGEgbGlzdAorICAgICAgICBsID0gW10KKyAgICAgICAgdCA9IChsLCkKKyAgICAgICAgbC5hcHBlbmQodCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGRlbCB0CisgICAgICAgIGRlbCBsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuY29sbGVjdCgpLCAyKQorCisgICAgZGVmIHRlc3RfY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIEEuYSA9IEEKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGRlbCBBCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZ2MuY29sbGVjdCgpLCAwKQorCisgICAgZGVmIHRlc3RfbmV3c3R5bGVjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZGVsIEEKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChnYy5jb2xsZWN0KCksIDApCisKKyAgICBkZWYgdGVzdF9pbnN0YW5jZShzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYSA9IEEoKQorICAgICAgICBhLmEgPSBhCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBkZWwgYQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGdjLmNvbGxlY3QoKSwgMCkKKworICAgIGRlZiB0ZXN0X25ld2luc3RhbmNlKHNlbGYpOgorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgYS5hID0gYQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZGVsIGEKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChnYy5jb2xsZWN0KCksIDApCisgICAgICAgIGNsYXNzIEIobGlzdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEMoQiwgQSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGEgPSBDKCkKKyAgICAgICAgYS5hID0gYQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZGVsIGEKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChnYy5jb2xsZWN0KCksIDApCisgICAgICAgIGRlbCBCLCBDCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZ2MuY29sbGVjdCgpLCAwKQorICAgICAgICBBLmEgPSBBKCkKKyAgICAgICAgZGVsIEEKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChnYy5jb2xsZWN0KCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuY29sbGVjdCgpLCAwKQorCisgICAgZGVmIHRlc3RfbWV0aG9kKHNlbGYpOgorICAgICAgICAjIFRyaWNreTogc2VsZi5fX2luaXRfXyBpcyBhIGJvdW5kIG1ldGhvZCwgaXQgcmVmZXJlbmNlcyB0aGUgaW5zdGFuY2UuCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5pbml0ID0gc2VsZi5fX2luaXRfXworICAgICAgICBhID0gQSgpCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBkZWwgYQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGdjLmNvbGxlY3QoKSwgMCkKKworICAgIGRlZiB0ZXN0X2ZpbmFsaXplcihzZWxmKToKKyAgICAgICAgIyBBKCkgaXMgdW5jb2xsZWN0YWJsZSBpZiBpdCBpcyBwYXJ0IG9mIGEgY3ljbGUsIG1ha2Ugc3VyZSBpdCBzaG93cyB1cAorICAgICAgICAjIGluIGdjLmdhcmJhZ2UuCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKTogcGFzcworICAgICAgICBjbGFzcyBCOgorICAgICAgICAgICAgcGFzcworICAgICAgICBhID0gQSgpCisgICAgICAgIGEuYSA9IGEKKyAgICAgICAgaWRfYSA9IGlkKGEpCisgICAgICAgIGIgPSBCKCkKKyAgICAgICAgYi5iID0gYgorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZGVsIGEKKyAgICAgICAgZGVsIGIKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChnYy5jb2xsZWN0KCksIDApCisgICAgICAgIGZvciBvYmogaW4gZ2MuZ2FyYmFnZToKKyAgICAgICAgICAgIGlmIGlkKG9iaikgPT0gaWRfYToKKyAgICAgICAgICAgICAgICBkZWwgb2JqLmEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJkaWRuJ3QgZmluZCBvYmogaW4gZ2FyYmFnZSAoZmluYWxpemVyKSIpCisgICAgICAgIGdjLmdhcmJhZ2UucmVtb3ZlKG9iaikKKworICAgIGRlZiB0ZXN0X2ZpbmFsaXplcl9uZXdjbGFzcyhzZWxmKToKKyAgICAgICAgIyBBKCkgaXMgdW5jb2xsZWN0YWJsZSBpZiBpdCBpcyBwYXJ0IG9mIGEgY3ljbGUsIG1ha2Ugc3VyZSBpdCBzaG93cyB1cAorICAgICAgICAjIGluIGdjLmdhcmJhZ2UuCisgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOiBwYXNzCisgICAgICAgIGNsYXNzIEIob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYSA9IEEoKQorICAgICAgICBhLmEgPSBhCisgICAgICAgIGlkX2EgPSBpZChhKQorICAgICAgICBiID0gQigpCisgICAgICAgIGIuYiA9IGIKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGRlbCBhCisgICAgICAgIGRlbCBiCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZ2MuY29sbGVjdCgpLCAwKQorICAgICAgICBmb3Igb2JqIGluIGdjLmdhcmJhZ2U6CisgICAgICAgICAgICBpZiBpZChvYmopID09IGlkX2E6CisgICAgICAgICAgICAgICAgZGVsIG9iai5hCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGlkbid0IGZpbmQgb2JqIGluIGdhcmJhZ2UgKGZpbmFsaXplcikiKQorICAgICAgICBnYy5nYXJiYWdlLnJlbW92ZShvYmopCisKKyAgICBkZWYgdGVzdF9mdW5jdGlvbihzZWxmKToKKyAgICAgICAgIyBUcmlja3k6IGYgLT4gZCAtPiBmLCBjb2RlIHNob3VsZCBjYWxsIGQuY2xlYXIoKSBhZnRlciB0aGUgZXhlYyB0bworICAgICAgICAjIGJyZWFrIHRoZSBjeWNsZS4KKyAgICAgICAgZCA9IHt9CisgICAgICAgIGV4ZWMoImRlZiBmKCk6IHBhc3NcbiIpIGluIGQKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGRlbCBkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuY29sbGVjdCgpLCAyKQorCisgICAgZGVmIHRlc3RfZnJhbWUoc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuY29sbGVjdCgpLCAxKQorCisgICAgZGVmIHRlc3Rfc2F2ZWFsbChzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBjeWNsaWMgZ2FyYmFnZSBsaWtlIGxpc3RzIHNob3cgdXAgaW4gZ2MuZ2FyYmFnZSBpZiB0aGUKKyAgICAgICAgIyBTQVZFQUxMIG9wdGlvbiBpcyBlbmFibGVkLgorCisgICAgICAgICMgRmlyc3QgbWFrZSBzdXJlIHdlIGRvbid0IHNhdmUgYXdheSBvdGhlciBzdHVmZiB0aGF0IGp1c3QgaGFwcGVucyB0bworICAgICAgICAjIGJlIHdhaXRpbmcgZm9yIGNvbGxlY3Rpb24uCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAjIGlmIHRoaXMgZmFpbHMsIHNvbWVvbmUgZWxzZSBjcmVhdGVkIGltbW9ydGFsIHRyYXNoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pCisKKyAgICAgICAgTCA9IFtdCisgICAgICAgIEwuYXBwZW5kKEwpCisgICAgICAgIGlkX0wgPSBpZChMKQorCisgICAgICAgIGRlYnVnID0gZ2MuZ2V0X2RlYnVnKCkKKyAgICAgICAgZ2Muc2V0X2RlYnVnKGRlYnVnIHwgZ2MuREVCVUdfU0FWRUFMTCkKKyAgICAgICAgZGVsIEwKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGdjLnNldF9kZWJ1ZyhkZWJ1ZykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihnYy5nYXJiYWdlKSwgMSkKKyAgICAgICAgb2JqID0gZ2MuZ2FyYmFnZS5wb3AoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKG9iaiksIGlkX0wpCisKKyAgICBkZWYgdGVzdF9kZWwoc2VsZik6CisgICAgICAgICMgX19kZWxfXyBtZXRob2RzIGNhbiB0cmlnZ2VyIGNvbGxlY3Rpb24sIG1ha2UgdGhpcyB0byBoYXBwZW4KKyAgICAgICAgdGhyZXNob2xkcyA9IGdjLmdldF90aHJlc2hvbGQoKQorICAgICAgICBnYy5lbmFibGUoKQorICAgICAgICBnYy5zZXRfdGhyZXNob2xkKDEpCisKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGRpcihzZWxmKQorICAgICAgICBhID0gQSgpCisgICAgICAgIGRlbCBhCisKKyAgICAgICAgZ2MuZGlzYWJsZSgpCisgICAgICAgIGdjLnNldF90aHJlc2hvbGQoKnRocmVzaG9sZHMpCisKKyAgICBkZWYgdGVzdF9kZWxfbmV3Y2xhc3Moc2VsZik6CisgICAgICAgICMgX19kZWxfXyBtZXRob2RzIGNhbiB0cmlnZ2VyIGNvbGxlY3Rpb24sIG1ha2UgdGhpcyB0byBoYXBwZW4KKyAgICAgICAgdGhyZXNob2xkcyA9IGdjLmdldF90aHJlc2hvbGQoKQorICAgICAgICBnYy5lbmFibGUoKQorICAgICAgICBnYy5zZXRfdGhyZXNob2xkKDEpCisKKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgZGlyKHNlbGYpCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgZGVsIGEKKworICAgICAgICBnYy5kaXNhYmxlKCkKKyAgICAgICAgZ2Muc2V0X3RocmVzaG9sZCgqdGhyZXNob2xkcykKKworICAgICMgVGhlIGZvbGxvd2luZyB0d28gdGVzdHMgYXJlIGZyYWdpbGU6CisgICAgIyBUaGV5IHByZWNpc2VseSBjb3VudCB0aGUgbnVtYmVyIG9mIGFsbG9jYXRpb25zLAorICAgICMgd2hpY2ggaXMgaGlnaGx5IGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4KKyAgICAjIEZvciBleGFtcGxlOgorICAgICMgLSBkaXNwb3NlZCB0dXBsZXMgYXJlIG5vdCBmcmVlZCwgYnV0IHJldXNlZAorICAgICMgLSB0aGUgY2FsbCB0byBhc3NlcnRFcXVhbCBzb21laG93IGF2b2lkcyBidWlsZGluZyBpdHMgYXJncyB0dXBsZQorICAgIGRlZiB0ZXN0X2dldF9jb3VudChzZWxmKToKKyAgICAgICAgIyBBdm9pZCBmdXR1cmUgYWxsb2NhdGlvbiBvZiBtZXRob2Qgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFsID0gc2VsZi5fYmFzZUFzc2VydEVxdWFsCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBhc3NlcnRFcXVhbChnYy5nZXRfY291bnQoKSwgKDAsIDAsIDApKQorICAgICAgICBhID0gZGljdCgpCisgICAgICAgICMgc2luY2UgZ2MuY29sbGVjdCgpLCB3ZSBjcmVhdGVkIHR3byBvYmplY3RzOgorICAgICAgICAjIHRoZSBkaWN0LCBhbmQgdGhlIHR1cGxlIHJldHVybmVkIGJ5IGdldF9jb3VudCgpCisgICAgICAgIGFzc2VydEVxdWFsKGdjLmdldF9jb3VudCgpLCAoMiwgMCwgMCkpCisKKyAgICBkZWYgdGVzdF9jb2xsZWN0X2dlbmVyYXRpb25zKHNlbGYpOgorICAgICAgICAjIEF2b2lkIGZ1dHVyZSBhbGxvY2F0aW9uIG9mIG1ldGhvZCBvYmplY3QKKyAgICAgICAgYXNzZXJ0RXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBhID0gZGljdCgpCisgICAgICAgIGdjLmNvbGxlY3QoMCkKKyAgICAgICAgYXNzZXJ0RXF1YWwoZ2MuZ2V0X2NvdW50KCksICgwLCAxLCAwKSkKKyAgICAgICAgZ2MuY29sbGVjdCgxKQorICAgICAgICBhc3NlcnRFcXVhbChnYy5nZXRfY291bnQoKSwgKDAsIDAsIDEpKQorICAgICAgICBnYy5jb2xsZWN0KDIpCisgICAgICAgIGFzc2VydEVxdWFsKGdjLmdldF9jb3VudCgpLCAoMCwgMCwgMCkpCisKKyAgICBkZWYgdGVzdF90cmFzaGNhbihzZWxmKToKKyAgICAgICAgY2xhc3MgT3VjaDoKKyAgICAgICAgICAgIG4gPSAwCisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBPdWNoLm4gPSBPdWNoLm4gKyAxCisgICAgICAgICAgICAgICAgaWYgT3VjaC5uICUgMTcgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICAgICAgIyAidHJhc2hjYW4iIGlzIGEgaGFjayB0byBwcmV2ZW50IHN0YWNrIG92ZXJmbG93IHdoZW4gZGVhbGxvY2F0aW5nCisgICAgICAgICMgdmVyeSBkZWVwbHkgbmVzdGVkIHR1cGxlcyBldGMuICBJdCB3b3JrcyBpbiBwYXJ0IGJ5IGFidXNpbmcgdGhlCisgICAgICAgICMgdHlwZSBwb2ludGVyIGFuZCByZWZjb3VudCBmaWVsZHMsIGFuZCB0aGF0IGNhbiB5aWVsZCBob3JyaWJsZQorICAgICAgICAjIHByb2JsZW1zIHdoZW4gZ2MgdHJpZXMgdG8gdHJhdmVyc2UgdGhlIHN0cnVjdHVyZXMuCisgICAgICAgICMgSWYgdGhpcyB0ZXN0IGZhaWxzIChhcyBpdCBkb2VzIGluIDIuMCwgMi4xIGFuZCAyLjIpLCBpdCB3aWxsCisgICAgICAgICMgbW9zdCBsaWtlbHkgZGllIHZpYSBzZWdmYXVsdC4KKworICAgICAgICAjIE5vdGU6ICBJbiAyLjMgdGhlIHBvc3NpYmlsaXR5IGZvciBjb21waWxpbmcgd2l0aG91dCBjeWNsaWMgZ2Mgd2FzCisgICAgICAgICMgcmVtb3ZlZCwgYW5kIHRoYXQgaW4gdHVybiBhbGxvd3MgdGhlIHRyYXNoY2FuIG1lY2hhbmlzbSB0byB3b3JrCisgICAgICAgICMgdmlhIG11Y2ggc2ltcGxlciBtZWFucyAoZS5nLiwgaXQgbmV2ZXIgYWJ1c2VzIHRoZSB0eXBlIHBvaW50ZXIgb3IKKyAgICAgICAgIyByZWZjb3VudCBmaWVsZHMgYW55bW9yZSkuICBTaW5jZSBpdCdzIG11Y2ggbGVzcyBsaWtlbHkgdG8gY2F1c2UgYQorICAgICAgICAjIHByb2JsZW0gbm93LCB0aGUgdmFyaW91cyBjb25zdGFudHMgaW4gdGhpcyBleHBlbnNpdmUgKHdlIGZvcmNlIGEgbG90CisgICAgICAgICMgb2YgZnVsbCBjb2xsZWN0aW9ucykgdGVzdCBhcmUgY3V0IGJhY2sgZnJvbSB0aGUgMi4yIHZlcnNpb24uCisgICAgICAgIGdjLmVuYWJsZSgpCisgICAgICAgIE4gPSAxNTAKKyAgICAgICAgZm9yIGNvdW50IGluIHJhbmdlKDIpOgorICAgICAgICAgICAgdCA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShOKToKKyAgICAgICAgICAgICAgICB0ID0gW3QsIE91Y2goKV0KKyAgICAgICAgICAgIHUgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTik6CisgICAgICAgICAgICAgICAgdSA9IFt1LCBPdWNoKCldCisgICAgICAgICAgICB2ID0ge30KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKE4pOgorICAgICAgICAgICAgICAgIHYgPSB7MTogdiwgMjogT3VjaCgpfQorICAgICAgICBnYy5kaXNhYmxlKCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgInRlc3QgbWVhbmluZ2xlc3Mgb24gYnVpbGRzIHdpdGhvdXQgdGhyZWFkcyIpCisgICAgZGVmIHRlc3RfdHJhc2hjYW5fdGhyZWFkcyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTM5OTI6IHRyYXNoY2FuIG1lY2hhbmlzbSBzaG91bGQgYmUgdGhyZWFkLXNhZmUKKyAgICAgICAgTkVTVElORyA9IDYwCisgICAgICAgIE5fVEhSRUFEUyA9IDIKKworICAgICAgICBkZWYgc2xlZXBlcl9nZW4oKToKKyAgICAgICAgICAgICIiIkEgZ2VuZXJhdG9yIHRoYXQgcmVsZWFzZXMgdGhlIEdJTCB3aGVuIGNsb3NlZCBvciBkZWFsbG9jJ2VkLiIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHlpZWxkCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMDAwMDEpCisKKyAgICAgICAgY2xhc3MgQyhsaXN0KToKKyAgICAgICAgICAgICMgQXBwZW5kaW5nIHRvIGEgbGlzdCBpcyBhdG9taWMsIHdoaWNoIGF2b2lkcyB0aGUgdXNlIG9mIGEgbG9jay4KKyAgICAgICAgICAgIGluaXRzID0gW10KKyAgICAgICAgICAgIGRlbHMgPSBbXQorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFsaXN0KToKKyAgICAgICAgICAgICAgICBzZWxmWzpdID0gYWxpc3QKKyAgICAgICAgICAgICAgICBDLmluaXRzLmFwcGVuZChOb25lKQorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgIyBUaGlzIF9fZGVsX18gaXMgY2FsbGVkIGJ5IHN1YnR5cGVfZGVhbGxvYygpLgorICAgICAgICAgICAgICAgIEMuZGVscy5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgICAgICAjIGBnYCB3aWxsIHJlbGVhc2UgdGhlIEdJTCB3aGVuIGdhcmJhZ2UtY29sbGVjdGVkLiAgVGhpcworICAgICAgICAgICAgICAgICMgaGVscHMgYXNzZXJ0IHN1YnR5cGVfZGVhbGxvYydzIGJlaGF2aW91ciB3aGVuIHRocmVhZHMKKyAgICAgICAgICAgICAgICAjIHN3aXRjaCBpbiB0aGUgbWlkZGxlIG9mIGl0LgorICAgICAgICAgICAgICAgIGcgPSBzbGVlcGVyX2dlbigpCisgICAgICAgICAgICAgICAgbmV4dChnKQorICAgICAgICAgICAgICAgICMgTm93IHRoYXQgX19kZWxfXyBpcyBmaW5pc2hlZCwgc3VidHlwZV9kZWFsbG9jIHdpbGwgcHJvY2VlZAorICAgICAgICAgICAgICAgICMgdG8gY2FsbCBsaXN0X2RlYWxsb2MsIHdoaWNoIGFsc28gdXNlcyB0aGUgdHJhc2hjYW4gbWVjaGFuaXNtLgorCisgICAgICAgIGRlZiBtYWtlX25lc3RlZCgpOgorICAgICAgICAgICAgIiIiQ3JlYXRlIGEgc3VmZmljaWVudGx5IG5lc3RlZCBjb250YWluZXIgb2JqZWN0IHNvIHRoYXQgdGhlCisgICAgICAgICAgICB0cmFzaGNhbiBtZWNoYW5pc20gaXMgaW52b2tlZCB3aGVuIGRlYWxsb2NhdGluZyBpdC4iIiIKKyAgICAgICAgICAgIHggPSBDKFtdKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTkVTVElORyk6CisgICAgICAgICAgICAgICAgeCA9IFtDKFt4XSldCisgICAgICAgICAgICBkZWwgeAorCisgICAgICAgIGRlZiBydW5fdGhyZWFkKCk6CisgICAgICAgICAgICAiIiJFeGVyY2lzZSBtYWtlX25lc3RlZCgpIGluIGEgbG9vcC4iIiIKKyAgICAgICAgICAgIHdoaWxlIG5vdCBleGl0OgorICAgICAgICAgICAgICAgIG1ha2VfbmVzdGVkKCkKKworICAgICAgICBvbGRfY2hlY2tpbnRlcnZhbCA9IHN5cy5nZXRjaGVja2ludGVydmFsKCkKKyAgICAgICAgc3lzLnNldGNoZWNraW50ZXJ2YWwoMykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhpdCA9IEZhbHNlCisgICAgICAgICAgICB0aHJlYWRzID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKE5fVEhSRUFEUyk6CisgICAgICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1bl90aHJlYWQpCisgICAgICAgICAgICAgICAgdGhyZWFkcy5hcHBlbmQodCkKKyAgICAgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEuMCkKKyAgICAgICAgICAgIGV4aXQgPSBUcnVlCisgICAgICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc2V0Y2hlY2tpbnRlcnZhbChvbGRfY2hlY2tpbnRlcnZhbCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEMuaW5pdHMpLCBsZW4oQy5kZWxzKSkKKworICAgIGRlZiB0ZXN0X2Jvb20oc2VsZik6CisgICAgICAgIGNsYXNzIEJvb206CisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgc29tZWF0dHJpYnV0ZSk6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuYXR0cgorICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yCisKKyAgICAgICAgYSA9IEJvb20oKQorICAgICAgICBiID0gQm9vbSgpCisgICAgICAgIGEuYXR0ciA9IGIKKyAgICAgICAgYi5hdHRyID0gYQorCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBnYXJiYWdlbGVuID0gbGVuKGdjLmdhcmJhZ2UpCisgICAgICAgIGRlbCBhLCBiCisgICAgICAgICMgYTwtPmIgYXJlIGluIGEgdHJhc2ggY3ljbGUgbm93LiAgQ29sbGVjdGlvbiB3aWxsIGludm9rZQorICAgICAgICAjIEJvb20uX19nZXRhdHRyX18gKHRvIHNlZSB3aGV0aGVyIGEgYW5kIGIgaGF2ZSBfX2RlbF9fIG1ldGhvZHMpLCBhbmQKKyAgICAgICAgIyBfX2dldGF0dHJfXyBkZWxldGVzIHRoZSBpbnRlcm5hbCAiYXR0ciIgYXR0cmlidXRlcyBhcyBhIHNpZGUgZWZmZWN0LgorICAgICAgICAjIFRoYXQgY2F1c2VzIHRoZSB0cmFzaCBjeWNsZSB0byBnZXQgcmVjbGFpbWVkIHZpYSByZWZjb3VudHMgZmFsbGluZyB0bworICAgICAgICAjIDAsIHRodXMgbXV0YXRpbmcgdGhlIHRyYXNoIGdyYXBoIGFzIGEgc2lkZSBlZmZlY3Qgb2YgbWVyZWx5IGFza2luZworICAgICAgICAjIHdoZXRoZXIgX19kZWxfXyBleGlzdHMuICBUaGlzIHVzZWQgdG8gKGJlZm9yZSAyLjNiMSkgY3Jhc2ggUHl0aG9uLgorICAgICAgICAjIE5vdyBfX2dldGF0dHJfXyBpc24ndCBjYWxsZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuY29sbGVjdCgpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihnYy5nYXJiYWdlKSwgZ2FyYmFnZWxlbikKKworICAgIGRlZiB0ZXN0X2Jvb20yKHNlbGYpOgorICAgICAgICBjbGFzcyBCb29tMjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSAwCisKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBzb21lYXR0cmlidXRlKToKKyAgICAgICAgICAgICAgICBzZWxmLnggKz0gMQorICAgICAgICAgICAgICAgIGlmIHNlbGYueCA+IDE6CisgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLmF0dHIKKyAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcgorCisgICAgICAgIGEgPSBCb29tMigpCisgICAgICAgIGIgPSBCb29tMigpCisgICAgICAgIGEuYXR0ciA9IGIKKyAgICAgICAgYi5hdHRyID0gYQorCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBnYXJiYWdlbGVuID0gbGVuKGdjLmdhcmJhZ2UpCisgICAgICAgIGRlbCBhLCBiCisgICAgICAgICMgTXVjaCBsaWtlIHRlc3RfYm9vbSgpLCBleGNlcHQgdGhhdCBfX2dldGF0dHJfXyBkb2Vzbid0IGJyZWFrIHRoZQorICAgICAgICAjIGN5Y2xlIHVudGlsIHRoZSBzZWNvbmQgdGltZSBnYyBjaGVja3MgZm9yIF9fZGVsX18uICBBcyBvZiAyLjNiMSwKKyAgICAgICAgIyB0aGVyZSBpc24ndCBhIHNlY29uZCB0aW1lLCBzbyB0aGlzIHNpbXBseSBjbGVhbnMgdXAgdGhlIHRyYXNoIGN5Y2xlLgorICAgICAgICAjIFdlIGV4cGVjdCBhLCBiLCBhLl9fZGljdF9fIGFuZCBiLl9fZGljdF9fICg0IG9iamVjdHMpIHRvIGdldAorICAgICAgICAjIHJlY2xhaW1lZCB0aGlzIHdheS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5jb2xsZWN0KCksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdjLmdhcmJhZ2UpLCBnYXJiYWdlbGVuKQorCisgICAgZGVmIHRlc3RfYm9vbV9uZXcoc2VsZik6CisgICAgICAgICMgYm9vbV9fbmV3IGFuZCBib29tMl9uZXcgYXJlIGV4YWN0bHkgbGlrZSBib29tIGFuZCBib29tMiwgZXhjZXB0IHVzZQorICAgICAgICAjIG5ldy1zdHlsZSBjbGFzc2VzLgorCisgICAgICAgIGNsYXNzIEJvb21fTmV3KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgc29tZWF0dHJpYnV0ZSk6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuYXR0cgorICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yCisKKyAgICAgICAgYSA9IEJvb21fTmV3KCkKKyAgICAgICAgYiA9IEJvb21fTmV3KCkKKyAgICAgICAgYS5hdHRyID0gYgorICAgICAgICBiLmF0dHIgPSBhCisKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGdhcmJhZ2VsZW4gPSBsZW4oZ2MuZ2FyYmFnZSkKKyAgICAgICAgZGVsIGEsIGIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5jb2xsZWN0KCksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdjLmdhcmJhZ2UpLCBnYXJiYWdlbGVuKQorCisgICAgZGVmIHRlc3RfYm9vbTJfbmV3KHNlbGYpOgorICAgICAgICBjbGFzcyBCb29tMl9OZXcob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSAwCisKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBzb21lYXR0cmlidXRlKToKKyAgICAgICAgICAgICAgICBzZWxmLnggKz0gMQorICAgICAgICAgICAgICAgIGlmIHNlbGYueCA+IDE6CisgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLmF0dHIKKyAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcgorCisgICAgICAgIGEgPSBCb29tMl9OZXcoKQorICAgICAgICBiID0gQm9vbTJfTmV3KCkKKyAgICAgICAgYS5hdHRyID0gYgorICAgICAgICBiLmF0dHIgPSBhCisKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGdhcmJhZ2VsZW4gPSBsZW4oZ2MuZ2FyYmFnZSkKKyAgICAgICAgZGVsIGEsIGIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5jb2xsZWN0KCksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdjLmdhcmJhZ2UpLCBnYXJiYWdlbGVuKQorCisgICAgZGVmIHRlc3RfZ2V0X3JlZmVyZW50cyhzZWxmKToKKyAgICAgICAgYWxpc3QgPSBbMSwgMywgNV0KKyAgICAgICAgZ290ID0gZ2MuZ2V0X3JlZmVyZW50cyhhbGlzdCkKKyAgICAgICAgZ290LnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgYWxpc3QpCisKKyAgICAgICAgYXR1cGxlID0gdHVwbGUoYWxpc3QpCisgICAgICAgIGdvdCA9IGdjLmdldF9yZWZlcmVudHMoYXR1cGxlKQorICAgICAgICBnb3Quc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBhbGlzdCkKKworICAgICAgICBhZGljdCA9IHsxOiAzLCA1OiA3fQorICAgICAgICBleHBlY3RlZCA9IFsxLCAzLCA1LCA3XQorICAgICAgICBnb3QgPSBnYy5nZXRfcmVmZXJlbnRzKGFkaWN0KQorICAgICAgICBnb3Quc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBleHBlY3RlZCkKKworICAgICAgICBnb3QgPSBnYy5nZXRfcmVmZXJlbnRzKFsxLCAyXSwgezM6IDR9LCAoMCwgMCwgMCkpCisgICAgICAgIGdvdC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIFswLCAwXSArIHJhbmdlKDUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2V0X3JlZmVyZW50cygxLCAnYScsIDRqKSwgW10pCisKKyAgICBkZWYgdGVzdF9pc190cmFja2VkKHNlbGYpOgorICAgICAgICAjIEF0b21pYyBidWlsdC1pbiB0eXBlcyBhcmUgbm90IHRyYWNrZWQsIHVzZXItZGVmaW5lZCBvYmplY3RzIGFuZAorICAgICAgICAjIG11dGFibGUgY29udGFpbmVycyBhcmUuCisgICAgICAgICMgTk9URTogdHlwZXMgd2l0aCBzcGVjaWFsIG9wdGltaXphdGlvbnMgKGUuZy4gdHVwbGUpIGhhdmUgdGVzdHMKKyAgICAgICAgIyBpbiB0aGVpciBvd24gdGVzdCBmaWxlcyBpbnN0ZWFkLgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdjLmlzX3RyYWNrZWQoTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZ2MuaXNfdHJhY2tlZCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnYy5pc190cmFja2VkKDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZ2MuaXNfdHJhY2tlZCgxLjAgKyA1LjBqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnYy5pc190cmFja2VkKFRydWUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdjLmlzX3RyYWNrZWQoRmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdjLmlzX3RyYWNrZWQoImEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnYy5pc190cmFja2VkKHUiYSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdjLmlzX3RyYWNrZWQoYnl0ZWFycmF5KCJhIikpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdjLmlzX3RyYWNrZWQodHlwZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZ2MuaXNfdHJhY2tlZChpbnQpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdjLmlzX3RyYWNrZWQob2JqZWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnYy5pc190cmFja2VkKG9iamVjdCgpKSkKKworICAgICAgICBjbGFzcyBPbGRTdHlsZToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgTmV3U3R5bGUob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdjLmlzX3RyYWNrZWQoZ2MpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2MuaXNfdHJhY2tlZChPbGRTdHlsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnYy5pc190cmFja2VkKE9sZFN0eWxlKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2MuaXNfdHJhY2tlZChOZXdTdHlsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnYy5pc190cmFja2VkKE5ld1N0eWxlKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2MuaXNfdHJhY2tlZChbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnYy5pc190cmFja2VkKHNldCgpKSkKKworICAgIGRlZiB0ZXN0X2J1ZzEwNTU4MjBiKHNlbGYpOgorICAgICAgICAjIENvcnJlc3BvbmRzIHRvIHRlbXAyYi5weSBpbiB0aGUgYnVnIHJlcG9ydC4KKworICAgICAgICBvdWNoID0gW10KKyAgICAgICAgZGVmIGNhbGxiYWNrKGlnbm9yZWQpOgorICAgICAgICAgICAgb3VjaFs6XSA9IFt3cigpIGZvciB3ciBpbiBXUnNdCisKKyAgICAgICAgQ3MgPSBbQzEwNTU4MjAoaSkgZm9yIGkgaW4gcmFuZ2UoMildCisgICAgICAgIFdScyA9IFt3ZWFrcmVmLnJlZihjLCBjYWxsYmFjaykgZm9yIGMgaW4gQ3NdCisgICAgICAgIGMgPSBOb25lCisKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG91Y2gpLCAwKQorICAgICAgICAjIE1ha2UgdGhlIHR3byBpbnN0YW5jZXMgdHJhc2gsIGFuZCBjb2xsZWN0IGFnYWluLiAgVGhlIGJ1ZyB3YXMgdGhhdAorICAgICAgICAjIHRoZSBjYWxsYmFjayBtYXRlcmlhbGl6ZWQgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIGFuIGluc3RhbmNlLCBidXQgZ2MKKyAgICAgICAgIyBjbGVhcmVkIHRoZSBpbnN0YW5jZSdzIGRpY3QgYW55d2F5LgorICAgICAgICBDcyA9IE5vbmUKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG91Y2gpLCAyKSAgIyBlbHNlIHRoZSBjYWxsYmFja3MgZGlkbid0IHJ1bgorICAgICAgICBmb3IgeCBpbiBvdWNoOgorICAgICAgICAgICAgIyBJZiB0aGUgY2FsbGJhY2sgcmVzdXJyZWN0ZWQgb25lIG9mIHRoZXNlIGd1eXMsIHRoZSBpbnN0YW5jZQorICAgICAgICAgICAgIyB3b3VsZCBiZSBkYW1hZ2VkLCB3aXRoIGFuIGVtcHR5IF9fZGljdF9fLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBOb25lKQorCitjbGFzcyBHQ1RvZ2dsaW5nVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZ2MuZW5hYmxlKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZ2MuZGlzYWJsZSgpCisKKyAgICBkZWYgdGVzdF9idWcxMDU1ODIwYyhzZWxmKToKKyAgICAgICAgIyBDb3JyZXNwb25kcyB0byB0ZW1wMmMucHkgaW4gdGhlIGJ1ZyByZXBvcnQuICBUaGlzIGlzIHByZXR0eQorICAgICAgICAjIGVsYWJvcmF0ZS4KKworICAgICAgICBjMCA9IEMxMDU1ODIwKDApCisgICAgICAgICMgTW92ZSBjMCBpbnRvIGdlbmVyYXRpb24gMi4KKyAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICAgICAgYzEgPSBDMTA1NTgyMCgxKQorICAgICAgICBjMS5rZWVwX2MwX2FsaXZlID0gYzAKKyAgICAgICAgZGVsIGMwLmxvb3AgIyBub3cgb25seSBjMSBrZWVwcyBjMCBhbGl2ZQorCisgICAgICAgIGMyID0gQzEwNTU4MjAoMikKKyAgICAgICAgYzJ3ciA9IHdlYWtyZWYucmVmKGMyKSAjIG5vIGNhbGxiYWNrIQorCisgICAgICAgIG91Y2ggPSBbXQorICAgICAgICBkZWYgY2FsbGJhY2soaWdub3JlZCk6CisgICAgICAgICAgICBvdWNoWzpdID0gW2Myd3IoKV0KKworICAgICAgICAjIFRoZSBjYWxsYmFjayBnZXRzIGFzc29jaWF0ZWQgd2l0aCBhIHdyIG9uIGFuIG9iamVjdCBpbiBnZW5lcmF0aW9uIDIuCisgICAgICAgIGMwd3IgPSB3ZWFrcmVmLnJlZihjMCwgY2FsbGJhY2spCisKKyAgICAgICAgYzAgPSBjMSA9IGMyID0gTm9uZQorCisgICAgICAgICMgV2hhdCB3ZSd2ZSBzZXQgdXA6ICBjMCwgYzEsIGFuZCBjMiBhcmUgYWxsIHRyYXNoIG5vdy4gIGMwIGlzIGluCisgICAgICAgICMgZ2VuZXJhdGlvbiAyLiAgVGhlIG9ubHkgdGhpbmcga2VlcGluZyBpdCBhbGl2ZSBpcyB0aGF0IGMxIHBvaW50cyB0bworICAgICAgICAjIGl0LiBjMSBhbmQgYzIgYXJlIGluIGdlbmVyYXRpb24gMCwgYW5kIGFyZSBpbiBzZWxmLWxvb3BzLiAgVGhlcmUncyBhCisgICAgICAgICMgZ2xvYmFsIHdlYWtyZWYgdG8gYzIgKGMyd3IpLCBidXQgdGhhdCB3ZWFrcmVmIGhhcyBubyBjYWxsYmFjay4KKyAgICAgICAgIyBUaGVyZSdzIGFsc28gYSBnbG9iYWwgd2Vha3JlZiB0byBjMCAoYzB3ciksIGFuZCB0aGF0IGRvZXMgaGF2ZSBhCisgICAgICAgICMgY2FsbGJhY2ssIGFuZCB0aGF0IGNhbGxiYWNrIHJlZmVyZW5jZXMgYzIgdmlhIGMyd3IoKS4KKyAgICAgICAgIworICAgICAgICAjICAgICAgICAgICAgICAgYzAgaGFzIGEgd3Igd2l0aCBjYWxsYmFjaywgd2hpY2ggcmVmZXJlbmNlcyBjMndyCisgICAgICAgICMgICAgICAgICAgICAgICBeCisgICAgICAgICMgICAgICAgICAgICAgICB8CisgICAgICAgICMgICAgICAgICAgICAgICB8ICAgICBHZW5lcmF0aW9uIDIgYWJvdmUgZG90cworICAgICAgICAjLiAuIC4gLiAuIC4gLiAufC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuCisgICAgICAgICMgICAgICAgICAgICAgICB8ICAgICBHZW5lcmF0aW9uIDAgYmVsb3cgZG90cworICAgICAgICAjICAgICAgICAgICAgICAgfAorICAgICAgICAjICAgICAgICAgICAgICAgfAorICAgICAgICAjICAgICAgICAgICAgXi0+YzEgICBeLT5jMiBoYXMgYSB3ciBidXQgbm8gY2FsbGJhY2sKKyAgICAgICAgIyAgICAgICAgICAgIHwgIHwgICAgfCAgfAorICAgICAgICAjICAgICAgICAgICAgPC0tdiAgICA8LS12CisgICAgICAgICMKKyAgICAgICAgIyBTbyB0aGlzIGlzIHRoZSBuaWdodG1hcmU6ICB3aGVuIGdlbmVyYXRpb24gMCBnZXRzIGNvbGxlY3RlZCwgd2Ugc2VlCisgICAgICAgICMgdGhhdCBjMiBoYXMgYSBjYWxsYmFjay1mcmVlIHdlYWtyZWYsIGFuZCBjMSBkb2Vzbid0IGV2ZW4gaGF2ZSBhCisgICAgICAgICMgd2Vha3JlZi4gIENvbGxlY3RpbmcgZ2VuZXJhdGlvbiAwIGRvZXNuJ3Qgc2VlIGMwIGF0IGFsbCwgYW5kIGMwIGlzCisgICAgICAgICMgdGhlIG9ubHkgb2JqZWN0IHRoYXQgaGFzIGEgd2Vha3JlZiB3aXRoIGEgY2FsbGJhY2suICBnYyBjbGVhcnMgYzEKKyAgICAgICAgIyBhbmQgYzIuICBDbGVhcmluZyBjMSBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGRyb3BwaW5nIHRoZSByZWZjb3VudCBvbgorICAgICAgICAjIGMwIHRvIDAsIHNvIGMwIGdvZXMgYXdheSAoZGVzcGl0ZSB0aGF0IGl0J3MgaW4gYW4gb2xkZXIgZ2VuZXJhdGlvbikKKyAgICAgICAgIyBhbmQgYzAncyB3ciBjYWxsYmFjayB0cmlnZ2Vycy4gIFRoYXQgaW4gdHVybiBtYXRlcmlhbGl6ZXMgYSByZWZlcmVuY2UKKyAgICAgICAgIyB0byBjMiB2aWEgYzJ3cigpLCBidXQgYzIgZ2V0cyBjbGVhcmVkIGFueXdheSBieSBnYy4KKworICAgICAgICAjIFdlIHdhbnQgdG8gbGV0IGdjIGhhcHBlbiAibmF0dXJhbGx5IiwgdG8gcHJlc2VydmUgdGhlIGRpc3RpbmN0aW9uCisgICAgICAgICMgYmV0d2VlbiBnZW5lcmF0aW9ucy4KKyAgICAgICAganVuayA9IFtdCisgICAgICAgIGkgPSAwCisgICAgICAgIGRldGVjdG9yID0gR0NfRGV0ZWN0b3IoKQorICAgICAgICB3aGlsZSBub3QgZGV0ZWN0b3IuZ2NfaGFwcGVuZWQ6CisgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgIGlmIGkgPiAxMDAwMDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImdjIGRpZG4ndCBoYXBwZW4gYWZ0ZXIgMTAwMDAgaXRlcmF0aW9ucyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvdWNoKSwgMCkKKyAgICAgICAgICAgIGp1bmsuYXBwZW5kKFtdKSAgIyB0aGlzIHdpbGwgZXZlbnR1YWxseSB0cmlnZ2VyIGdjCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3VjaCksIDEpICAjIGVsc2UgdGhlIGNhbGxiYWNrIHdhc24ndCBpbnZva2VkCisgICAgICAgIGZvciB4IGluIG91Y2g6CisgICAgICAgICAgICAjIElmIHRoZSBjYWxsYmFjayByZXN1cnJlY3RlZCBjMiwgdGhlIGluc3RhbmNlIHdvdWxkIGJlIGRhbWFnZWQsCisgICAgICAgICAgICAjIHdpdGggYW4gZW1wdHkgX19kaWN0X18uCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9idWcxMDU1ODIwZChzZWxmKToKKyAgICAgICAgIyBDb3JyZXNwb25kcyB0byB0ZW1wMmQucHkgaW4gdGhlIGJ1ZyByZXBvcnQuICBUaGlzIGlzIHZlcnkgbXVjaCBsaWtlCisgICAgICAgICMgdGVzdF9idWcxMDU1ODIwYywgYnV0IHVzZXMgYSBfX2RlbF9fIG1ldGhvZCBpbnN0ZWFkIG9mIGEgd2Vha3JlZgorICAgICAgICAjIGNhbGxiYWNrIHRvIHNuZWFrIGluIGEgcmVzdXJyZWN0aW9uIG9mIGN5Y2xpYyB0cmFzaC4KKworICAgICAgICBvdWNoID0gW10KKyAgICAgICAgY2xhc3MgRChDMTA1NTgyMCk6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBvdWNoWzpdID0gW2Myd3IoKV0KKworICAgICAgICBkMCA9IEQoMCkKKyAgICAgICAgIyBNb3ZlIGFsbCB0aGUgYWJvdmUgaW50byBnZW5lcmF0aW9uIDIuCisgICAgICAgIGdjLmNvbGxlY3QoKQorCisgICAgICAgIGMxID0gQzEwNTU4MjAoMSkKKyAgICAgICAgYzEua2VlcF9kMF9hbGl2ZSA9IGQwCisgICAgICAgIGRlbCBkMC5sb29wICMgbm93IG9ubHkgYzEga2VlcHMgZDAgYWxpdmUKKworICAgICAgICBjMiA9IEMxMDU1ODIwKDIpCisgICAgICAgIGMyd3IgPSB3ZWFrcmVmLnJlZihjMikgIyBubyBjYWxsYmFjayEKKworICAgICAgICBkMCA9IGMxID0gYzIgPSBOb25lCisKKyAgICAgICAgIyBXaGF0IHdlJ3ZlIHNldCB1cDogIGQwLCBjMSwgYW5kIGMyIGFyZSBhbGwgdHJhc2ggbm93LiAgZDAgaXMgaW4KKyAgICAgICAgIyBnZW5lcmF0aW9uIDIuICBUaGUgb25seSB0aGluZyBrZWVwaW5nIGl0IGFsaXZlIGlzIHRoYXQgYzEgcG9pbnRzIHRvCisgICAgICAgICMgaXQuICBjMSBhbmQgYzIgYXJlIGluIGdlbmVyYXRpb24gMCwgYW5kIGFyZSBpbiBzZWxmLWxvb3BzLiAgVGhlcmUncworICAgICAgICAjIGEgZ2xvYmFsIHdlYWtyZWYgdG8gYzIgKGMyd3IpLCBidXQgdGhhdCB3ZWFrcmVmIGhhcyBubyBjYWxsYmFjay4KKyAgICAgICAgIyBUaGVyZSBhcmUgbm8gb3RoZXIgd2Vha3JlZnMuCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICAgICAgICAgIGQwIGhhcyBhIF9fZGVsX18gbWV0aG9kIHRoYXQgcmVmZXJlbmNlcyBjMndyCisgICAgICAgICMgICAgICAgICAgICAgICBeCisgICAgICAgICMgICAgICAgICAgICAgICB8CisgICAgICAgICMgICAgICAgICAgICAgICB8ICAgICBHZW5lcmF0aW9uIDIgYWJvdmUgZG90cworICAgICAgICAjLiAuIC4gLiAuIC4gLiAufC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuCisgICAgICAgICMgICAgICAgICAgICAgICB8ICAgICBHZW5lcmF0aW9uIDAgYmVsb3cgZG90cworICAgICAgICAjICAgICAgICAgICAgICAgfAorICAgICAgICAjICAgICAgICAgICAgICAgfAorICAgICAgICAjICAgICAgICAgICAgXi0+YzEgICBeLT5jMiBoYXMgYSB3ciBidXQgbm8gY2FsbGJhY2sKKyAgICAgICAgIyAgICAgICAgICAgIHwgIHwgICAgfCAgfAorICAgICAgICAjICAgICAgICAgICAgPC0tdiAgICA8LS12CisgICAgICAgICMKKyAgICAgICAgIyBTbyB0aGlzIGlzIHRoZSBuaWdodG1hcmU6ICB3aGVuIGdlbmVyYXRpb24gMCBnZXRzIGNvbGxlY3RlZCwgd2Ugc2VlCisgICAgICAgICMgdGhhdCBjMiBoYXMgYSBjYWxsYmFjay1mcmVlIHdlYWtyZWYsIGFuZCBjMSBkb2Vzbid0IGV2ZW4gaGF2ZSBhCisgICAgICAgICMgd2Vha3JlZi4gIENvbGxlY3RpbmcgZ2VuZXJhdGlvbiAwIGRvZXNuJ3Qgc2VlIGQwIGF0IGFsbC4gIGdjIGNsZWFycworICAgICAgICAjIGMxIGFuZCBjMi4gIENsZWFyaW5nIGMxIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgZHJvcHBpbmcgdGhlIHJlZmNvdW50CisgICAgICAgICMgb24gZDAgdG8gMCwgc28gZDAgZ29lcyBhd2F5IChkZXNwaXRlIHRoYXQgaXQncyBpbiBhbiBvbGRlcgorICAgICAgICAjIGdlbmVyYXRpb24pIGFuZCBkMCdzIF9fZGVsX18gdHJpZ2dlcnMuICBUaGF0IGluIHR1cm4gbWF0ZXJpYWxpemVzCisgICAgICAgICMgYSByZWZlcmVuY2UgdG8gYzIgdmlhIGMyd3IoKSwgYnV0IGMyIGdldHMgY2xlYXJlZCBhbnl3YXkgYnkgZ2MuCisKKyAgICAgICAgIyBXZSB3YW50IHRvIGxldCBnYyBoYXBwZW4gIm5hdHVyYWxseSIsIHRvIHByZXNlcnZlIHRoZSBkaXN0aW5jdGlvbgorICAgICAgICAjIGJldHdlZW4gZ2VuZXJhdGlvbnMuCisgICAgICAgIGRldGVjdG9yID0gR0NfRGV0ZWN0b3IoKQorICAgICAgICBqdW5rID0gW10KKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUgbm90IGRldGVjdG9yLmdjX2hhcHBlbmVkOgorICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBpZiBpID4gMTAwMDA6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJnYyBkaWRuJ3QgaGFwcGVuIGFmdGVyIDEwMDAwIGl0ZXJhdGlvbnMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3VjaCksIDApCisgICAgICAgICAgICBqdW5rLmFwcGVuZChbXSkgICMgdGhpcyB3aWxsIGV2ZW50dWFsbHkgdHJpZ2dlciBnYworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG91Y2gpLCAxKSAgIyBlbHNlIF9fZGVsX18gd2Fzbid0IGludm9rZWQKKyAgICAgICAgZm9yIHggaW4gb3VjaDoKKyAgICAgICAgICAgICMgSWYgX19kZWxfXyByZXN1cnJlY3RlZCBjMiwgdGhlIGluc3RhbmNlIHdvdWxkIGJlIGRhbWFnZWQsIHdpdGggYW4KKyAgICAgICAgICAgICMgZW1wdHkgX19kaWN0X18uCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIE5vbmUpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBlbmFibGVkID0gZ2MuaXNlbmFibGVkKCkKKyAgICBnYy5kaXNhYmxlKCkKKyAgICBhc3NlcnQgbm90IGdjLmlzZW5hYmxlZCgpCisgICAgZGVidWcgPSBnYy5nZXRfZGVidWcoKQorICAgIGdjLnNldF9kZWJ1ZyhkZWJ1ZyAmIH5nYy5ERUJVR19MRUFLKSAjIHRoaXMgdGVzdCBpcyBzdXBwb3NlZCB0byBsZWFrCisKKyAgICB0cnk6CisgICAgICAgIGdjLmNvbGxlY3QoKSAjIERlbGV0ZSAybmQgZ2VuZXJhdGlvbiBnYXJiYWdlCisgICAgICAgIHJ1bl91bml0dGVzdChHQ1Rlc3RzLCBHQ1RvZ2dsaW5nVGVzdHMpCisgICAgZmluYWxseToKKyAgICAgICAgZ2Muc2V0X2RlYnVnKGRlYnVnKQorICAgICAgICAjIHRlc3QgZ2MuZW5hYmxlKCkgZXZlbiBpZiBHQyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAicmVzdG9yaW5nIGF1dG9tYXRpYyBjb2xsZWN0aW9uIgorICAgICAgICAjIG1ha2Ugc3VyZSB0byBhbHdheXMgdGVzdCBnYy5lbmFibGUoKQorICAgICAgICBnYy5lbmFibGUoKQorICAgICAgICBhc3NlcnQgZ2MuaXNlbmFibGVkKCkKKyAgICAgICAgaWYgbm90IGVuYWJsZWQ6CisgICAgICAgICAgICBnYy5kaXNhYmxlKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2MucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTU4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2MucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODU1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2RiLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2RiLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDJiNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZGIucHkKQEAgLTAsMCArMSw3NjEgQEAKKyMgVmVyaWZ5IHRoYXQgZ2RiIGNhbiBwcmV0dHktcHJpbnQgdGhlIHZhcmlvdXMgUHlPYmplY3QqIHR5cGVzCisjCisjIFRoZSBjb2RlIGZvciB0ZXN0aW5nIGdkYiB3YXMgYWRhcHRlZCBmcm9tIHNpbWlsYXIgd29yayBpbiBVbmxhZGVuIFN3YWxsb3cncworIyBMaWIvdGVzdC90ZXN0X2ppdF9nZGIucHkKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXNjb25maWcKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBmaW5kZmlsZQorCit0cnk6CisgICAgZ2RiX3ZlcnNpb24sIF8gPSBzdWJwcm9jZXNzLlBvcGVuKFsiZ2RiIiwgIi0tdmVyc2lvbiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpCitleGNlcHQgT1NFcnJvcjoKKyAgICAjIFRoaXMgaXMgd2hhdCAibm8gZ2RiIiBsb29rcyBsaWtlLiAgVGhlcmUgbWF5LCBob3dldmVyLCBiZSBvdGhlcgorICAgICMgZXJyb3JzIHRoYXQgbWFuaWZlc3QgdGhpcyB3YXkgdG9vLgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJDb3VsZG4ndCBmaW5kIGdkYiBvbiB0aGUgcGF0aCIpCitnZGJfdmVyc2lvbl9udW1iZXIgPSByZS5zZWFyY2goIl5HTlUgZ2RiIFteXGRdKihcZCspXC4oXGQpIiwgZ2RiX3ZlcnNpb24pCitnZGJfbWFqb3JfdmVyc2lvbiA9IGludChnZGJfdmVyc2lvbl9udW1iZXIuZ3JvdXAoMSkpCitnZGJfbWlub3JfdmVyc2lvbiA9IGludChnZGJfdmVyc2lvbl9udW1iZXIuZ3JvdXAoMikpCitpZiBnZGJfbWFqb3JfdmVyc2lvbiA8IDc6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoImdkYiB2ZXJzaW9ucyBiZWZvcmUgNy4wIGRpZG4ndCBzdXBwb3J0IHB5dGhvbiBlbWJlZGRpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBTYXc6XG4iICsgZ2RiX3ZlcnNpb24pCisKKyMgTG9jYXRpb24gb2YgY3VzdG9tIGhvb2tzIGZpbGUgaW4gYSByZXBvc2l0b3J5IGNoZWNrb3V0LgorY2hlY2tvdXRfaG9va19wYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzeXMuZXhlY3V0YWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5dGhvbi1nZGIucHknKQorCitkZWYgcnVuX2dkYigqYXJncywgKiplbnZfdmFycyk6CisgICAgIiIiUnVucyBnZGIgaW4gLS1iYXRjaCBtb2RlIHdpdGggdGhlIGFkZGl0aW9uYWwgYXJndW1lbnRzIGdpdmVuIGJ5ICphcmdzLgorCisgICAgUmV0dXJucyBpdHMgKHN0ZG91dCwgc3RkZXJyKQorICAgICIiIgorICAgIGlmIGVudl92YXJzOgorICAgICAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBlbnYudXBkYXRlKGVudl92YXJzKQorICAgIGVsc2U6CisgICAgICAgIGVudiA9IE5vbmUKKyAgICBiYXNlX2NtZCA9ICgnZ2RiJywgJy0tYmF0Y2gnKQorICAgIGlmIChnZGJfbWFqb3JfdmVyc2lvbiwgZ2RiX21pbm9yX3ZlcnNpb24pID49ICg3LCA0KToKKyAgICAgICAgYmFzZV9jbWQgKz0gKCctaWV4JywgJ2FkZC1hdXRvLWxvYWQtc2FmZS1wYXRoICcgKyBjaGVja291dF9ob29rX3BhdGgpCisgICAgb3V0LCBlcnIgPSBzdWJwcm9jZXNzLlBvcGVuKGJhc2VfY21kICsgYXJncywKKyAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwgZW52PWVudiwKKyAgICAgICAgKS5jb21tdW5pY2F0ZSgpCisgICAgcmV0dXJuIG91dCwgZXJyCisKKyMgVmVyaWZ5IHRoYXQgImdkYiIgd2FzIGJ1aWx0IHdpdGggdGhlIGVtYmVkZGVkIHB5dGhvbiBzdXBwb3J0IGVuYWJsZWQ6CitnZGJweV92ZXJzaW9uLCBfID0gcnVuX2dkYigiLS1ldmFsLWNvbW1hbmQ9cHl0aG9uIGltcG9ydCBzeXM7IHByaW50IHN5cy52ZXJzaW9uX2luZm8iKQoraWYgbm90IGdkYnB5X3ZlcnNpb246CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoImdkYiBub3QgYnVpbHQgd2l0aCBlbWJlZGRlZCBweXRob24gc3VwcG9ydCIpCisKKyMgVmVyaWZ5IHRoYXQgImdkYiIgY2FuIGxvYWQgb3VyIGN1c3RvbSBob29rcy4gIEluIHRoZW9yeSB0aGlzIHNob3VsZCBuZXZlcgorIyBmYWlsLCBidXQgd2UgZG9uJ3QgaGFuZGxlIHRoZSBjYXNlIG9mIHRoZSBob29rcyBmaWxlIG5vdCBleGlzdGluZyBpZiB0aGUKKyMgdGVzdHMgYXJlIHJ1biBmcm9tIGFuIGluc3RhbGxlZCBQeXRob24gKHdlJ2xsIHByb2R1Y2UgZmFpbHVyZXMgaW4gdGhhdCBjYXNlKS4KK2NtZCA9IFsnLS1hcmdzJywgc3lzLmV4ZWN1dGFibGVdCitfLCBnZGJweV9lcnJvcnMgPSBydW5fZ2RiKCctLWFyZ3MnLCBzeXMuZXhlY3V0YWJsZSkKK2lmICJhdXRvLWxvYWRpbmcgaGFzIGJlZW4gZGVjbGluZWQiIGluIGdkYnB5X2Vycm9yczoKKyAgICBtc2cgPSAiZ2RiIHNlY3VyaXR5IHNldHRpbmdzIHByZXZlbnQgdXNlIG9mIGN1c3RvbSBob29rczogIgorCitkZWYgcHl0aG9uX2lzX29wdGltaXplZCgpOgorICAgIGNmbGFncyA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoKVsnUFlfQ0ZMQUdTJ10KKyAgICBmaW5hbF9vcHQgPSAiIgorICAgIGZvciBvcHQgaW4gY2ZsYWdzLnNwbGl0KCk6CisgICAgICAgIGlmIG9wdC5zdGFydHN3aXRoKCctTycpOgorICAgICAgICAgICAgZmluYWxfb3B0ID0gb3B0CisgICAgcmV0dXJuIChmaW5hbF9vcHQgYW5kIGZpbmFsX29wdCAhPSAnLU8wJykKKworZGVmIGdkYl9oYXNfZnJhbWVfc2VsZWN0KCk6CisgICAgIyBEb2VzIHRoaXMgYnVpbGQgb2YgZ2RiIGhhdmUgZ2RiLkZyYW1lLnNlbGVjdCA/CisgICAgc3Rkb3V0LCBfID0gcnVuX2dkYigiLS1ldmFsLWNvbW1hbmQ9cHl0aG9uIHByaW50KGRpcihnZGIuRnJhbWUpKSIpCisgICAgbSA9IHJlLm1hdGNoKHInLipcWyguKilcXS4qJywgc3Rkb3V0KQorICAgIGlmIG5vdCBtOgorICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiVW5hYmxlIHRvIHBhcnNlIG91dHB1dCBmcm9tIGdkYi5GcmFtZS5zZWxlY3QgdGVzdCIpCisgICAgZ2RiX2ZyYW1lX2RpciA9IG0uZ3JvdXAoMSkuc3BsaXQoJywgJykKKyAgICByZXR1cm4gIidzZWxlY3QnIiBpbiBnZGJfZnJhbWVfZGlyCisKK0hBU19QWVVQX1BZRE9XTiA9IGdkYl9oYXNfZnJhbWVfc2VsZWN0KCkKKworY2xhc3MgRGVidWdnZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJUZXN0IHRoYXQgdGhlIGRlYnVnZ2VyIGNhbiBkZWJ1ZyBQeXRob24uIiIiCisKKyAgICBkZWYgZ2V0X3N0YWNrX3RyYWNlKHNlbGYsIHNvdXJjZT1Ob25lLCBzY3JpcHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQ9J1B5T2JqZWN0X1ByaW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0X3NpdGU9RmFsc2UpOgorICAgICAgICAnJycKKyAgICAgICAgUnVuICdweXRob24gLWMgU09VUkNFJyB1bmRlciBnZGIgd2l0aCBhIGJyZWFrcG9pbnQuCisKKyAgICAgICAgU3VwcG9ydCBpbmplY3RpbmcgY29tbWFuZHMgYWZ0ZXIgdGhlIGJyZWFrcG9pbnQgaXMgcmVhY2hlZAorCisgICAgICAgIFJldHVybnMgdGhlIHN0ZG91dCBmcm9tIGdkYgorCisgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludDogaWYgcHJvdmlkZWQsIGEgbGlzdCBvZiBzdHJpbmdzOiBnZGIgY29tbWFuZHMKKyAgICAgICAgJycnCisgICAgICAgICMgV2UgdXNlICJzZXQgYnJlYWtwb2ludCBwZW5kaW5nIHllcyIgdG8gYXZvaWQgYmxvY2tpbmcgd2l0aCBhOgorICAgICAgICAjICAgRnVuY3Rpb24gImZvbyIgbm90IGRlZmluZWQuCisgICAgICAgICMgICBNYWtlIGJyZWFrcG9pbnQgcGVuZGluZyBvbiBmdXR1cmUgc2hhcmVkIGxpYnJhcnkgbG9hZD8gKHkgb3IgW25dKQorICAgICAgICAjIGVycm9yLCB3aGljaCB0eXBpY2FsbHkgaGFwcGVucyBweXRob24gaXMgZHluYW1pY2FsbHkgbGlua2VkICh0aGUKKyAgICAgICAgIyBicmVha3BvaW50cyBvZiBpbnRlcmVzdCBhcmUgdG8gYmUgZm91bmQgaW4gdGhlIHNoYXJlZCBsaWJyYXJ5KQorICAgICAgICAjIFdoZW4gdGhpcyBoYXBwZW5zLCB3ZSBzdGlsbCBnZXQ6CisgICAgICAgICMgICBGdW5jdGlvbiAiUHlPYmplY3RfUHJpbnQiIG5vdCBkZWZpbmVkLgorICAgICAgICAjIGVtaXR0ZWQgdG8gc3RkZXJyIGVhY2ggdGltZSwgYWxhcy4KKworICAgICAgICAjIEluaXRpYWxseSBJIGhhZCAiLS1ldmFsLWNvbW1hbmQ9Y29udGludWUiIGhlcmUsIGJ1dCByZW1vdmVkIGl0IHRvCisgICAgICAgICMgYXZvaWQgcmVwZWF0ZWQgcHJpbnQgYnJlYWtwb2ludHMgd2hlbiB0cmF2ZXJzaW5nIGhpZXJhcmNoaWNhbCBkYXRhCisgICAgICAgICMgc3RydWN0dXJlcworCisgICAgICAgICMgR2VuZXJhdGUgYSBsaXN0IG9mIGNvbW1hbmRzIGluIGdkYidzIGxhbmd1YWdlOgorICAgICAgICBjb21tYW5kcyA9IFsnc2V0IGJyZWFrcG9pbnQgcGVuZGluZyB5ZXMnLAorICAgICAgICAgICAgICAgICAgICAnYnJlYWsgJXMnICUgYnJlYWtwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgJ3J1biddCisgICAgICAgIGlmIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludDoKKyAgICAgICAgICAgIGNvbW1hbmRzICs9IGNtZHNfYWZ0ZXJfYnJlYWtwb2ludAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29tbWFuZHMgKz0gWydiYWNrdHJhY2UnXQorCisgICAgICAgICMgcHJpbnQgY29tbWFuZHMKKworICAgICAgICAjIFVzZSAiY29tbWFuZHMiIHRvIGdlbmVyYXRlIHRoZSBhcmd1bWVudHMgd2l0aCB3aGljaCB0byBpbnZva2UgImdkYiI6CisgICAgICAgIGFyZ3MgPSBbImdkYiIsICItLWJhdGNoIl0KKyAgICAgICAgYXJncyArPSBbJy0tZXZhbC1jb21tYW5kPSVzJyAlIGNtZCBmb3IgY21kIGluIGNvbW1hbmRzXQorICAgICAgICBhcmdzICs9IFsiLS1hcmdzIiwKKyAgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGVdCisKKyAgICAgICAgaWYgbm90IGltcG9ydF9zaXRlOgorICAgICAgICAgICAgIyAtUyBzdXBwcmVzc2VzIHRoZSBkZWZhdWx0ICdpbXBvcnQgc2l0ZScKKyAgICAgICAgICAgIGFyZ3MgKz0gWyItUyJdCisKKyAgICAgICAgaWYgc291cmNlOgorICAgICAgICAgICAgYXJncyArPSBbIi1jIiwgc291cmNlXQorICAgICAgICBlbGlmIHNjcmlwdDoKKyAgICAgICAgICAgIGFyZ3MgKz0gW3NjcmlwdF0KKworICAgICAgICAjIHByaW50IGFyZ3MKKyAgICAgICAgIyBwcmludCAnICcuam9pbihhcmdzKQorCisgICAgICAgICMgVXNlICJhcmdzIiB0byBpbnZva2UgZ2RiLCBjYXB0dXJpbmcgc3Rkb3V0LCBzdGRlcnI6CisgICAgICAgIG91dCwgZXJyID0gcnVuX2dkYigqYXJncywgUFlUSE9OSEFTSFNFRUQ9JzAnKQorCisgICAgICAgIGVycmxpbmVzID0gZXJyLnNwbGl0bGluZXMoKQorICAgICAgICB1bmV4cGVjdGVkX2VycmxpbmVzID0gW10KKworICAgICAgICAjIElnbm9yZSBzb21lIGJlbmlnbiBtZXNzYWdlcyBvbiBzdGRlcnIuCisgICAgICAgIGlnbm9yZV9wYXR0ZXJucyA9ICgKKyAgICAgICAgICAgICdGdW5jdGlvbiAiJXMiIG5vdCBkZWZpbmVkLicgJSBicmVha3BvaW50LAorICAgICAgICAgICAgIndhcm5pbmc6IG5vIGxvYWRhYmxlIHNlY3Rpb25zIGZvdW5kIGluIGFkZGVkIHN5bWJvbC1maWxlIgorICAgICAgICAgICAgIiBzeXN0ZW0tc3VwcGxpZWQgRFNPIiwKKyAgICAgICAgICAgICJ3YXJuaW5nOiBVbmFibGUgdG8gZmluZCBsaWJ0aHJlYWRfZGIgbWF0Y2hpbmciCisgICAgICAgICAgICAiIGluZmVyaW9yJ3MgdGhyZWFkIGxpYnJhcnksIHRocmVhZCBkZWJ1Z2dpbmcgd2lsbCIKKyAgICAgICAgICAgICIgbm90IGJlIGF2YWlsYWJsZS4iLAorICAgICAgICAgICAgIndhcm5pbmc6IENhbm5vdCBpbml0aWFsaXplIHRocmVhZCBkZWJ1Z2dpbmciCisgICAgICAgICAgICAiIGxpYnJhcnk6IERlYnVnZ2VyIHNlcnZpY2UgZmFpbGVkIiwKKyAgICAgICAgICAgICd3YXJuaW5nOiBDb3VsZCBub3QgbG9hZCBzaGFyZWQgbGlicmFyeSBzeW1ib2xzIGZvciAnCisgICAgICAgICAgICAnbGludXgtdmRzby5zbycsCisgICAgICAgICAgICAnd2FybmluZzogQ291bGQgbm90IGxvYWQgc2hhcmVkIGxpYnJhcnkgc3ltYm9scyBmb3IgJworICAgICAgICAgICAgJ2xpbnV4LWdhdGUuc28nLAorICAgICAgICAgICAgJ0RvIHlvdSBuZWVkICJzZXQgc29saWItc2VhcmNoLXBhdGgiIG9yICcKKyAgICAgICAgICAgICcic2V0IHN5c3Jvb3QiPycsCisgICAgICAgICAgICApCisgICAgICAgIGZvciBsaW5lIGluIGVycmxpbmVzOgorICAgICAgICAgICAgaWYgbm90IGxpbmUuc3RhcnRzd2l0aChpZ25vcmVfcGF0dGVybnMpOgorICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRfZXJybGluZXMuYXBwZW5kKGxpbmUpCisKKyAgICAgICAgIyBFbnN1cmUgbm8gdW5leHBlY3RlZCBlcnJvciBtZXNzYWdlczoKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmV4cGVjdGVkX2VycmxpbmVzLCBbXSkKKyAgICAgICAgcmV0dXJuIG91dAorCisgICAgZGVmIGdldF9nZGJfcmVwcihzZWxmLCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIGltcG9ydF9zaXRlPUZhbHNlKToKKyAgICAgICAgIyBHaXZlbiBhbiBpbnB1dCBweXRob24gc291cmNlIHJlcHJlc2VudGF0aW9uIG9mIGRhdGEsCisgICAgICAgICMgcnVuICJweXRob24gLWMncHJpbnQgREFUQSciIHVuZGVyIGdkYiB3aXRoIGEgYnJlYWtwb2ludCBvbgorICAgICAgICAjIFB5T2JqZWN0X1ByaW50IGFuZCBzY3JhcGUgb3V0IGdkYidzIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAib3AiCisgICAgICAgICMgcGFyYW1ldGVyLCBhbmQgdmVyaWZ5IHRoYXQgdGhlIGdkYiBkaXNwbGF5cyB0aGUgc2FtZSBzdHJpbmcKKyAgICAgICAgIworICAgICAgICAjIEZvciBhIG5lc3RlZCBzdHJ1Y3R1cmUsIHRoZSBmaXJzdCB0aW1lIHdlIGhpdCB0aGUgYnJlYWtwb2ludCB3aWxsCisgICAgICAgICMgZ2l2ZSB1cyB0aGUgdG9wLWxldmVsIHN0cnVjdHVyZQorICAgICAgICBnZGJfb3V0cHV0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc291cmNlLCBicmVha3BvaW50PSdQeU9iamVjdF9QcmludCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9Y21kc19hZnRlcl9icmVha3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0X3NpdGU9aW1wb3J0X3NpdGUpCisgICAgICAgICMgZ2RiIGNhbiBpbnNlcnQgYWRkaXRpb25hbCAnXG4nIGFuZCBzcGFjZSBjaGFyYWN0ZXJzIGluIHZhcmlvdXMgcGxhY2VzCisgICAgICAgICMgaW4gaXRzIG91dHB1dCwgZGVwZW5kaW5nIG9uIHRoZSB3aWR0aCBvZiB0aGUgdGVybWluYWwgaXQncyBjb25uZWN0ZWQKKyAgICAgICAgIyB0byAodXNpbmcgaXRzICJ3cmFwX2hlcmUiIGZ1bmN0aW9uKQorICAgICAgICBtID0gcmUubWF0Y2goJy4qIzBccytQeU9iamVjdF9QcmludFxzK1woXHMqb3BcPVxzKiguKj8pLFxzK2ZwPS4qXCkuKicsCisgICAgICAgICAgICAgICAgICAgICBnZGJfb3V0cHV0LCByZS5ET1RBTEwpCisgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdVbmV4cGVjdGVkIGdkYiBvdXRwdXQ6ICVyXG4lcycgJSAoZ2RiX291dHB1dCwgZ2RiX291dHB1dCkpCisgICAgICAgIHJldHVybiBtLmdyb3VwKDEpLCBnZGJfb3V0cHV0CisKKyAgICBkZWYgYXNzZXJ0RW5kc1dpdGgoc2VsZiwgYWN0dWFsLCBleHBfZW5kKToKKyAgICAgICAgJycnRW5zdXJlIHRoYXQgdGhlIGdpdmVuICJhY3R1YWwiIHN0cmluZyBlbmRzIHdpdGggImV4cF9lbmQiJycnCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhY3R1YWwuZW5kc3dpdGgoZXhwX2VuZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtc2c9JyVyIGRpZCBub3QgZW5kIHdpdGggJXInICUgKGFjdHVhbCwgZXhwX2VuZCkpCisKKyAgICBkZWYgYXNzZXJ0TXVsdGlsaW5lTWF0Y2hlcyhzZWxmLCBhY3R1YWwsIHBhdHRlcm4pOgorICAgICAgICBtID0gcmUubWF0Y2gocGF0dGVybiwgYWN0dWFsLCByZS5ET1RBTEwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLCBtc2c9JyVyIGRpZCBub3QgbWF0Y2ggJXInICUgKGFjdHVhbCwgcGF0dGVybikpCisKKyAgICBkZWYgZ2V0X3NhbXBsZV9zY3JpcHQoc2VsZik6CisgICAgICAgIHJldHVybiBmaW5kZmlsZSgnZ2RiX3NhbXBsZS5weScpCisKK2NsYXNzIFByZXR0eVByaW50VGVzdHMoRGVidWdnZXJUZXN0cyk6CisgICAgZGVmIHRlc3RfZ2V0dGluZ19iYWNrdHJhY2Uoc2VsZik6CisgICAgICAgIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9zdGFja190cmFjZSgncHJpbnQgNDInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1B5T2JqZWN0X1ByaW50JyBpbiBnZGJfb3V0cHV0KQorCisgICAgZGVmIGFzc2VydEdkYlJlcHIoc2VsZiwgdmFsLCBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9Tm9uZSk6CisgICAgICAgICMgRW5zdXJlIHRoYXQgZ2RiJ3MgcmVuZGVyaW5nIG9mIHRoZSB2YWx1ZSBpbiBhIGRlYnVnZ2VkIHByb2Nlc3MKKyAgICAgICAgIyBtYXRjaGVzIHJlcHIodmFsdWUpIGluIHRoaXMgcHJvY2VzczoKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcigncHJpbnQgJyArIHJlcHIodmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2RiX3JlcHIsIHJlcHIodmFsKSwgZ2RiX291dHB1dCkKKworICAgIGRlZiB0ZXN0X2ludChzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIHZhcmlvdXMgImludCIgdmFsdWVzJworICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcigwKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoLTcpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzeXMubWF4aW50KQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoLXN5cy5tYXhpbnQpCisKKyAgICBkZWYgdGVzdF9sb25nKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgdmFyaW91cyAibG9uZyIgdmFsdWVzJworICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoMEwpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcigxMDAwMDAwMDAwMDAwTCkKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKC0xTCkKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKC0xMDAwMDAwMDAwMDAwMDAwTCkKKworICAgIGRlZiB0ZXN0X3NpbmdsZXRvbnMoc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBUcnVlLCBGYWxzZSBhbmQgTm9uZScKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKE5vbmUpCisKKyAgICBkZWYgdGVzdF9kaWN0cyhzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIGRpY3Rpb25hcmllcycKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHt9KQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoeydmb28nOiAnYmFyJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcigieydmb28nOiAnYmFyJywgJ2RvdWdsYXMnOjQyfSIpCisKKyAgICBkZWYgdGVzdF9saXN0cyhzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIGxpc3RzJworICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihyYW5nZSg1KSkKKworICAgIGRlZiB0ZXN0X3N0cmluZ3Moc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBzdHJpbmdzJworICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoJycpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcignQW5kIG5vdyBmb3Igc29tZXRoaW5nIGhvcGVmdWxseSB0aGUgc2FtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcignc3RyaW5nIHdpdGggZW1iZWRkZWQgTlVMIGhlcmUgXDAgYW5kIHRoZW4gc29tZSBtb3JlIHRleHQnKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoJ3RoaXMgaXMgYnl0ZSAyNTU6XHhmZiBhbmQgYnl0ZSAxMjg6XHg4MCcpCisKKyAgICBkZWYgdGVzdF90dXBsZXMoc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiB0dXBsZXMnCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih0dXBsZSgpKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoKDEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKCgnZm9vJywgJ2JhcicsICdiYXonKSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGUoc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiB1bmljb2RlIHZhbHVlcycKKyAgICAgICAgIyBUZXN0IHRoZSBlbXB0eSB1bmljb2RlIHN0cmluZzoKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHUnJykKKworICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIodSdoZWxsbyB3b3JsZCcpCisKKyAgICAgICAgIyBUZXN0IHByaW50aW5nIGEgc2luZ2xlIGNoYXJhY3RlcjoKKyAgICAgICAgIyAgICBVKzI2MjAgU0tVTEwgQU5EIENST1NTQk9ORVMKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHUnXHUyNjIwJykKKworICAgICAgICAjIFRlc3QgcHJpbnRpbmcgYSBKYXBhbmVzZSB1bmljb2RlIHN0cmluZworICAgICAgICAjIChJIGJlbGlldmUgdGhpcyByZWFkcyAibW9qaWJha2UiLCB1c2luZyAzIGNoYXJhY3RlcnMgZnJvbSB0aGUgQ0pLCisgICAgICAgICMgVW5pZmllZCBJZGVvZ3JhcGhzIGFyZWEsIGZvbGxvd2VkIGJ5IFUrMzA1MSBISVJBR0FOQSBMRVRURVIgS0UpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih1J1x1NjU4N1x1NWI1N1x1NTMxNlx1MzA1MScpCisKKyAgICAgICAgIyBUZXN0IGEgY2hhcmFjdGVyIG91dHNpZGUgdGhlIEJNUDoKKyAgICAgICAgIyAgICBVKzFEMTIxIE1VU0lDQUwgU1lNQk9MIEMgQ0xFRgorICAgICAgICAjIFRoaXMgaXM6CisgICAgICAgICMgVVRGLTg6IDB4RjAgMHg5RCAweDg0IDB4QTEKKyAgICAgICAgIyBVVEYtMTY6IDB4RDgzNCAweEREMjEKKyAgICAgICAgIyBUaGlzIHdpbGwgb25seSB3b3JrIG9uIHdpZGUtdW5pY29kZSBidWlsZHM6CisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih1IlxVMDAwMUQxMjEiKQorCisgICAgZGVmIHRlc3Rfc2V0cyhzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIHNldHMnCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihzZXQoKSkKKyAgICAgICAgcmVwID0gc2VsZi5nZXRfZ2RiX3JlcHIoInByaW50IHNldChbJ2EnLCAnYiddKSIpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXAuc3RhcnRzd2l0aCgic2V0KFsiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcC5lbmRzd2l0aCgiXSkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHJlcCksIHsnYScsICdiJ30pCisgICAgICAgIHJlcCA9IHNlbGYuZ2V0X2dkYl9yZXByKCJwcmludCBzZXQoWzQsIDVdKSIpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXAuc3RhcnRzd2l0aCgic2V0KFsiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcC5lbmRzd2l0aCgiXSkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHJlcCksIHs0LCA1fSkKKworICAgICAgICAjIEVuc3VyZSB0aGF0IHdlIGhhbmRsZWQgc2V0cyBjb250YWluaW5nIHRoZSAiZHVtbXkiIGtleSB2YWx1ZSwKKyAgICAgICAgIyB3aGljaCBoYXBwZW5zIG9uIGRlbGV0aW9uOgorICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IHNlbGYuZ2V0X2dkYl9yZXByKCcnJ3MgPSBzZXQoWydhJywnYiddKQorcy5wb3AoKQorcHJpbnQgcycnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZGJfcmVwciwgInNldChbJ2InXSkiKQorCisgICAgZGVmIHRlc3RfZnJvemVuc2V0cyhzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIGZyb3plbnNldHMnCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihmcm96ZW5zZXQoKSkKKyAgICAgICAgcmVwID0gc2VsZi5nZXRfZ2RiX3JlcHIoInByaW50IGZyb3plbnNldChbJ2EnLCAnYiddKSIpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXAuc3RhcnRzd2l0aCgiZnJvemVuc2V0KFsiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcC5lbmRzd2l0aCgiXSkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHJlcCksIHsnYScsICdiJ30pCisgICAgICAgIHJlcCA9IHNlbGYuZ2V0X2dkYl9yZXByKCJwcmludCBmcm96ZW5zZXQoWzQsIDVdKSIpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXAuc3RhcnRzd2l0aCgiZnJvemVuc2V0KFsiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcC5lbmRzd2l0aCgiXSkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHJlcCksIHs0LCA1fSkKKworICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgICMgVGVzdCBhIFJ1bnRpbWVFcnJvcgorICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IHNlbGYuZ2V0X2dkYl9yZXByKCcnJwordHJ5OgorICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiSSBhbSBhbiBlcnJvciIpCitleGNlcHQgUnVudGltZUVycm9yLCBlOgorICAgIHByaW50IGUKKycnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZGJfcmVwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9ucy5SdW50aW1lRXJyb3IoJ0kgYW0gYW4gZXJyb3InLCkiKQorCisKKyAgICAgICAgIyBUZXN0IGRpdmlzaW9uIGJ5IHplcm86CisgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gc2VsZi5nZXRfZ2RiX3JlcHIoJycnCit0cnk6CisgICAgYSA9IDEgLyAwCitleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3IsIGU6CisgICAgcHJpbnQgZQorJycnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdkYl9yZXByLAorICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb25zLlplcm9EaXZpc2lvbkVycm9yKCdpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvJywpIikKKworICAgIGRlZiB0ZXN0X2NsYXNzaWNfY2xhc3Moc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBjbGFzc2ljIGNsYXNzIGluc3RhbmNlcycKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcignJycKK2NsYXNzIEZvbzoKKyAgICBwYXNzCitmb28gPSBGb28oKQorZm9vLmFuX2ludCA9IDQyCitwcmludCBmb28nJycpCisgICAgICAgIG0gPSByZS5tYXRjaChyJzxGb29cKGFuX2ludD00MlwpIGF0IHJlbW90ZSAweFswLTlhLWZdKz4nLCBnZGJfcmVwcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0sCisgICAgICAgICAgICAgICAgICAgICAgICBtc2c9J1VuZXhwZWN0ZWQgY2xhc3NpYy1jbGFzcyByZW5kZXJpbmcgJXInICUgZ2RiX3JlcHIpCisKKyAgICBkZWYgdGVzdF9tb2Rlcm5fY2xhc3Moc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBuZXctc3R5bGUgY2xhc3MgaW5zdGFuY2VzJworICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IHNlbGYuZ2V0X2dkYl9yZXByKCcnJworY2xhc3MgRm9vKG9iamVjdCk6CisgICAgcGFzcworZm9vID0gRm9vKCkKK2Zvby5hbl9pbnQgPSA0MgorcHJpbnQgZm9vJycnKQorICAgICAgICBtID0gcmUubWF0Y2gocic8Rm9vXChhbl9pbnQ9NDJcKSBhdCByZW1vdGUgMHhbMC05YS1mXSs+JywgZ2RiX3JlcHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdVbmV4cGVjdGVkIG5ldy1zdHlsZSBjbGFzcyByZW5kZXJpbmcgJXInICUgZ2RiX3JlcHIpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc2luZ19saXN0KHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgYW4gaW5zdGFuY2Ugb2YgYSBsaXN0IHN1YmNsYXNzJworICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IHNlbGYuZ2V0X2dkYl9yZXByKCcnJworY2xhc3MgRm9vKGxpc3QpOgorICAgIHBhc3MKK2ZvbyA9IEZvbygpCitmb28gKz0gWzEsIDIsIDNdCitmb28uYW5faW50ID0gNDIKK3ByaW50IGZvbycnJykKKyAgICAgICAgbSA9IHJlLm1hdGNoKHInPEZvb1woYW5faW50PTQyXCkgYXQgcmVtb3RlIDB4WzAtOWEtZl0rPicsIGdkYl9yZXByKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nVW5leHBlY3RlZCBuZXctc3R5bGUgY2xhc3MgcmVuZGVyaW5nICVyJyAlIGdkYl9yZXByKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NpbmdfdHVwbGUoc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBhbiBpbnN0YW5jZSBvZiBhIHR1cGxlIHN1YmNsYXNzJworICAgICAgICAjIFRoaXMgc2hvdWxkIGV4ZXJjaXNlIHRoZSBuZWdhdGl2ZSB0cF9kaWN0b2Zmc2V0IGNvZGUgaW4gdGhlCisgICAgICAgICMgbmV3LXN0eWxlIGNsYXNzIHN1cHBvcnQKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcignJycKK2NsYXNzIEZvbyh0dXBsZSk6CisgICAgcGFzcworZm9vID0gRm9vKCgxLCAyLCAzKSkKK2Zvby5hbl9pbnQgPSA0MgorcHJpbnQgZm9vJycnKQorICAgICAgICBtID0gcmUubWF0Y2gocic8Rm9vXChhbl9pbnQ9NDJcKSBhdCByZW1vdGUgMHhbMC05YS1mXSs+JywgZ2RiX3JlcHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdVbmV4cGVjdGVkIG5ldy1zdHlsZSBjbGFzcyByZW5kZXJpbmcgJXInICUgZ2RiX3JlcHIpCisKKyAgICBkZWYgYXNzZXJ0U2FuZShzZWxmLCBzb3VyY2UsIGNvcnJ1cHRpb24sIGV4cHZhbHVlPU5vbmUsIGV4cHR5cGU9Tm9uZSk6CisgICAgICAgICcnJ1J1biBQeXRob24gdW5kZXIgZ2RiLCBjb3JydXB0aW5nIHZhcmlhYmxlcyBpbiB0aGUgaW5mZXJpb3IgcHJvY2VzcworICAgICAgICBpbW1lZGlhdGVseSBiZWZvcmUgdGFraW5nIGEgYmFja3RyYWNlLgorCisgICAgICAgIFZlcmlmeSB0aGF0IHRoZSB2YXJpYWJsZSdzIHJlcHJlc2VudGF0aW9uIGlzIHRoZSBleHBlY3RlZCBmYWlsc2FmZQorICAgICAgICByZXByZXNlbnRhdGlvbicnJworICAgICAgICBpZiBjb3JydXB0aW9uOgorICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVtjb3JydXB0aW9uLCAnYmFja3RyYWNlJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ2JhY2t0cmFjZSddCisKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBcCisgICAgICAgICAgICBzZWxmLmdldF9nZGJfcmVwcihzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9Y21kc19hZnRlcl9icmVha3BvaW50KQorCisgICAgICAgIGlmIGV4cHZhbHVlOgorICAgICAgICAgICAgaWYgZ2RiX3JlcHIgPT0gcmVwcihleHB2YWx1ZSk6CisgICAgICAgICAgICAgICAgIyBnZGIgbWFuYWdlZCB0byBwcmludCB0aGUgdmFsdWUgaW4gc3BpdGUgb2YgdGhlIGNvcnJ1cHRpb247CisgICAgICAgICAgICAgICAgIyB0aGlzIGlzIGdvb2QgKHNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlODMzMCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBleHB0eXBlOgorICAgICAgICAgICAgcGF0dGVybiA9ICc8JyArIGV4cHR5cGUgKyAnIGF0IHJlbW90ZSAweFswLTlhLWZdKz4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE1hdGNoIGFueXRoaW5nIGZvciB0aGUgdHlwZSBuYW1lOyAweERFQURCRUVGIGNvdWxkIHBvaW50IHRvCisgICAgICAgICAgICAjIHNvbWV0aGluZyBhcmJpdHJhcnkgKHNlZSAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTgzMzApCisgICAgICAgICAgICBwYXR0ZXJuID0gJzwuKiBhdCByZW1vdGUgMHhbMC05YS1mXSs+JworCisgICAgICAgIG0gPSByZS5tYXRjaChwYXR0ZXJuLCBnZGJfcmVwcikKKyAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICBzZWxmLmZhaWwoJ1VuZXhwZWN0ZWQgZ2RiIHJlcHJlc2VudGF0aW9uOiAlclxuJXMnICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2RiX3JlcHIsIGdkYl9vdXRwdXQpKQorCisgICAgZGVmIHRlc3RfTlVMTF9wdHIoc2VsZik6CisgICAgICAgICdFbnN1cmUgdGhhdCBhIE5VTEwgUHlPYmplY3QqIGlzIGhhbmRsZWQgZ3JhY2VmdWxseScKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSAoCisgICAgICAgICAgICBzZWxmLmdldF9nZGJfcmVwcigncHJpbnQgNDInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVsnc2V0IHZhcmlhYmxlIG9wPTAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmFja3RyYWNlJ10pCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZGJfcmVwciwgJzB4MCcpCisKKyAgICBkZWYgdGVzdF9OVUxMX29iX3R5cGUoc2VsZik6CisgICAgICAgICdFbnN1cmUgdGhhdCBhIFB5T2JqZWN0KiB3aXRoIE5VTEwgb2JfdHlwZSBpcyBoYW5kbGVkIGdyYWNlZnVsbHknCisgICAgICAgIHNlbGYuYXNzZXJ0U2FuZSgncHJpbnQgNDInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3NldCBvcC0+b2JfdHlwZT0wJykKKworICAgIGRlZiB0ZXN0X2NvcnJ1cHRfb2JfdHlwZShzZWxmKToKKyAgICAgICAgJ0Vuc3VyZSB0aGF0IGEgUHlPYmplY3QqIHdpdGggYSBjb3JydXB0IG9iX3R5cGUgaXMgaGFuZGxlZCBncmFjZWZ1bGx5JworICAgICAgICBzZWxmLmFzc2VydFNhbmUoJ3ByaW50IDQyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzZXQgb3AtPm9iX3R5cGU9MHhERUFEQkVFRicsCisgICAgICAgICAgICAgICAgICAgICAgICBleHB2YWx1ZT00MikKKworICAgIGRlZiB0ZXN0X2NvcnJ1cHRfdHBfZmxhZ3Moc2VsZik6CisgICAgICAgICdFbnN1cmUgdGhhdCBhIFB5T2JqZWN0KiB3aXRoIGEgdHlwZSB3aXRoIGNvcnJ1cHQgdHBfZmxhZ3MgaXMgaGFuZGxlZCcKKyAgICAgICAgc2VsZi5hc3NlcnRTYW5lKCdwcmludCA0MicsCisgICAgICAgICAgICAgICAgICAgICAgICAnc2V0IG9wLT5vYl90eXBlLT50cF9mbGFncz0weDAnLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwdmFsdWU9NDIpCisKKyAgICBkZWYgdGVzdF9jb3JydXB0X3RwX25hbWUoc2VsZik6CisgICAgICAgICdFbnN1cmUgdGhhdCBhIFB5T2JqZWN0KiB3aXRoIGEgdHlwZSB3aXRoIGNvcnJ1cHQgdHBfbmFtZSBpcyBoYW5kbGVkJworICAgICAgICBzZWxmLmFzc2VydFNhbmUoJ3ByaW50IDQyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzZXQgb3AtPm9iX3R5cGUtPnRwX25hbWU9MHhERUFEQkVFRicsCisgICAgICAgICAgICAgICAgICAgICAgICBleHB2YWx1ZT00MikKKworICAgIGRlZiB0ZXN0X05VTExfaW5zdGFuY2VfZGljdChzZWxmKToKKyAgICAgICAgJ0Vuc3VyZSB0aGF0IGEgUHlJbnN0YW5jZU9iamVjdCB3aXRoIHdpdGggYSBOVUxMIGluX2RpY3QgaXMgaGFuZGxlZCcKKyAgICAgICAgc2VsZi5hc3NlcnRTYW5lKCcnJworY2xhc3MgRm9vOgorICAgIHBhc3MKK2ZvbyA9IEZvbygpCitmb28uYW5faW50ID0gNDIKK3ByaW50IGZvbycnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzZXQgKChQeUluc3RhbmNlT2JqZWN0KilvcCktPmluX2RpY3QgPSAwJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHR5cGU9J0ZvbycpCisKKyAgICBkZWYgdGVzdF9idWlsdGluc19oZWxwKHNlbGYpOgorICAgICAgICAnRW5zdXJlIHRoYXQgdGhlIG5ldy1zdHlsZSBjbGFzcyBfSGVscGVyIGluIHNpdGUucHkgY2FuIGJlIGhhbmRsZWQnCisgICAgICAgICMgKHRoaXMgd2FzIHRoZSBpc3N1ZSBjYXVzaW5nIHRyYWNlYmFja3MgaW4KKyAgICAgICAgIyAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTgwMzIjbXNnMTAwNTM3ICkKKworICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IHNlbGYuZ2V0X2dkYl9yZXByKCdwcmludCBfX2J1aWx0aW5zX18uaGVscCcsIGltcG9ydF9zaXRlPVRydWUpCisgICAgICAgIG0gPSByZS5tYXRjaChyJzxfSGVscGVyIGF0IHJlbW90ZSAweFswLTlhLWZdKz4nLCBnZGJfcmVwcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0sCisgICAgICAgICAgICAgICAgICAgICAgICBtc2c9J1VuZXhwZWN0ZWQgcmVuZGVyaW5nICVyJyAlIGdkYl9yZXByKQorCisgICAgZGVmIHRlc3Rfc2VsZnJlZmVyZW50aWFsX2xpc3Qoc2VsZik6CisgICAgICAgICcnJ0Vuc3VyZSB0aGF0IGEgcmVmZXJlbmNlIGxvb3AgaW52b2x2aW5nIGEgbGlzdCBkb2Vzbid0IGxlYWQgcHJveHl2YWwKKyAgICAgICAgaW50byBhbiBpbmZpbml0ZSBsb29wOicnJworICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IFwKKyAgICAgICAgICAgIHNlbGYuZ2V0X2dkYl9yZXByKCJhID0gWzMsIDQsIDVdIDsgYS5hcHBlbmQoYSkgOyBwcmludCBhIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdkYl9yZXByLCAnWzMsIDQsIDUsIFsuLi5dXScpCisKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBcCisgICAgICAgICAgICBzZWxmLmdldF9nZGJfcmVwcigiYSA9IFszLCA0LCA1XSA7IGIgPSBbYV0gOyBhLmFwcGVuZChiKSA7IHByaW50IGEiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2RiX3JlcHIsICdbMywgNCwgNSwgW1suLi5dXV0nKQorCisgICAgZGVmIHRlc3Rfc2VsZnJlZmVyZW50aWFsX2RpY3Qoc2VsZik6CisgICAgICAgICcnJ0Vuc3VyZSB0aGF0IGEgcmVmZXJlbmNlIGxvb3AgaW52b2x2aW5nIGEgZGljdCBkb2Vzbid0IGxlYWQgcHJveHl2YWwKKyAgICAgICAgaW50byBhbiBpbmZpbml0ZSBsb29wOicnJworICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IFwKKyAgICAgICAgICAgIHNlbGYuZ2V0X2dkYl9yZXByKCJhID0ge30gOyBiID0geydiYXInOmF9IDsgYVsnZm9vJ10gPSBiIDsgcHJpbnQgYSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZGJfcmVwciwgInsnZm9vJzogeydiYXInOiB7Li4ufX19IikKKworICAgIGRlZiB0ZXN0X3NlbGZyZWZlcmVudGlhbF9vbGRfc3R5bGVfaW5zdGFuY2Uoc2VsZik6CisgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gXAorICAgICAgICAgICAgc2VsZi5nZXRfZ2RiX3JlcHIoJycnCitjbGFzcyBGb286CisgICAgcGFzcworZm9vID0gRm9vKCkKK2Zvby5hbl9hdHRyID0gZm9vCitwcmludCBmb28nJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgnPEZvb1woYW5fYXR0cj08XC5cLlwuPlwpIGF0IHJlbW90ZSAweFswLTlhLWZdKz4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RiX3JlcHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgZ2RiIHJlcHJlc2VudGF0aW9uOiAlclxuJXMnICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZGJfcmVwciwgZ2RiX291dHB1dCkpCisKKyAgICBkZWYgdGVzdF9zZWxmcmVmZXJlbnRpYWxfbmV3X3N0eWxlX2luc3RhbmNlKHNlbGYpOgorICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IFwKKyAgICAgICAgICAgIHNlbGYuZ2V0X2dkYl9yZXByKCcnJworY2xhc3MgRm9vKG9iamVjdCk6CisgICAgcGFzcworZm9vID0gRm9vKCkKK2Zvby5hbl9hdHRyID0gZm9vCitwcmludCBmb28nJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgnPEZvb1woYW5fYXR0cj08XC5cLlwuPlwpIGF0IHJlbW90ZSAweFswLTlhLWZdKz4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RiX3JlcHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgZ2RiIHJlcHJlc2VudGF0aW9uOiAlclxuJXMnICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZGJfcmVwciwgZ2RiX291dHB1dCkpCisKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBcCisgICAgICAgICAgICBzZWxmLmdldF9nZGJfcmVwcignJycKK2NsYXNzIEZvbyhvYmplY3QpOgorICAgIHBhc3MKK2EgPSBGb28oKQorYiA9IEZvbygpCithLmFuX2F0dHIgPSBiCitiLmFuX2F0dHIgPSBhCitwcmludCBhJycnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goJzxGb29cKGFuX2F0dHI9PEZvb1woYW5fYXR0cj08XC5cLlwuPlwpIGF0IHJlbW90ZSAweFswLTlhLWZdKz5cKSBhdCByZW1vdGUgMHhbMC05YS1mXSs+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkYl9yZXByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIGdkYiByZXByZXNlbnRhdGlvbjogJXJcbiVzJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2RiX3JlcHIsIGdkYl9vdXRwdXQpKQorCisgICAgZGVmIHRlc3RfdHJ1bmNhdGlvbihzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSB0aGF0IHZlcnkgbG9uZyBvdXRwdXQgaXMgdHJ1bmNhdGVkJworICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IHNlbGYuZ2V0X2dkYl9yZXByKCdwcmludCByYW5nZSgxMDAwKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2RiX3JlcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICI0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA1MiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICI1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCA2NSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICI2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICI3OSwgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICI5MiwgOTMsIDk0LCA5NSwgOTYsIDk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIjEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIjE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksIDE2MCwgMTYxLCAxNjIsIDE2MywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMTc0LCAxNzUsIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIjE4NCwgMTg1LCAxODYsIDE4NywgMTg4LCAxODksIDE5MCwgMTkxLCAxOTIsIDE5MywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIxOTQsIDE5NSwgMTk2LCAxOTcsIDE5OCwgMTk5LCAyMDAsIDIwMSwgMjAyLCAyMDMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMjA0LCAyMDUsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEwLCAyMTEsIDIxMiwgMjEzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIjIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIyMjQsIDIyNSwgMjI2Li4uKHRydW5jYXRlZCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihnZGJfcmVwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNCArIGxlbignLi4uKHRydW5jYXRlZCknKSkKKworICAgIGRlZiB0ZXN0X2J1aWx0aW5fZnVuY3Rpb24oc2VsZik6CisgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gc2VsZi5nZXRfZ2RiX3JlcHIoJ3ByaW50IGxlbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2RiX3JlcHIsICc8YnVpbHQtaW4gZnVuY3Rpb24gbGVuPicpCisKKyAgICBkZWYgdGVzdF9idWlsdGluX21ldGhvZChzZWxmKToKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcignaW1wb3J0IHN5czsgcHJpbnQgc3lzLnN0ZG91dC5yZWFkbGluZXMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goJzxidWlsdC1pbiBtZXRob2QgcmVhZGxpbmVzIG9mIGZpbGUgb2JqZWN0IGF0IHJlbW90ZSAweFswLTlhLWZdKz4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2RiX3JlcHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgZ2RiIHJlcHJlc2VudGF0aW9uOiAlclxuJXMnICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZGJfcmVwciwgZ2RiX291dHB1dCkpCisKKyAgICBkZWYgdGVzdF9mcmFtZXMoc2VsZik6CisgICAgICAgIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9zdGFja190cmFjZSgnJycKK2RlZiBmb28oYSwgYiwgYyk6CisgICAgcGFzcworCitmb28oMywgNCwgNSkKK3ByaW50IGZvby5fX2NvZGVfXycnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQ9J1B5T2JqZWN0X1ByaW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3ByaW50IChQeUZyYW1lT2JqZWN0KikoKChQeUNvZGVPYmplY3QqKW9wKS0+Y29fem9tYmllZnJhbWUpJ10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHInLipccytcJDEgPVxzK0ZyYW1lIDB4WzAtOWEtZl0rLCBmb3IgZmlsZSA8c3RyaW5nPiwgbGluZSAzLCBpbiBmb28gXChcKVxzKy4qJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkYl9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5ET1RBTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1VuZXhwZWN0ZWQgZ2RiIHJlcHJlc2VudGF0aW9uOiAlclxuJXMnICUgKGdkYl9vdXRwdXQsIGdkYl9vdXRwdXQpKQorCitAdW5pdHRlc3Quc2tpcElmKHB5dGhvbl9pc19vcHRpbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgIlB5dGhvbiB3YXMgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb25zIikKK2NsYXNzIFB5TGlzdFRlc3RzKERlYnVnZ2VyVGVzdHMpOgorICAgIGRlZiBhc3NlcnRMaXN0aW5nKHNlbGYsIGV4cGVjdGVkLCBhY3R1YWwpOgorICAgICAgICBzZWxmLmFzc2VydEVuZHNXaXRoKGFjdHVhbCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9iYXNpY19jb21tYW5kKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoYXQgdGhlICJweS1saXN0IiBjb21tYW5kIHdvcmtzJworICAgICAgICBidCA9IHNlbGYuZ2V0X3N0YWNrX3RyYWNlKHNjcmlwdD1zZWxmLmdldF9zYW1wbGVfc2NyaXB0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVsncHktbGlzdCddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0TGlzdGluZygnICAgNSAgICBcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA2ICAgIGRlZiBiYXIoYSwgYiwgYyk6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgNyAgICAgICAgYmF6KGEsIGIsIGMpXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgOCAgICBcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICA5ICAgIGRlZiBiYXooKmFyZ3MpOlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJyA+MTAgICAgICAgIHByaW50KDQyKVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgMTEgICAgXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAxMiAgICBmb28oMSwgMiwgMylcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidCkKKworICAgIGRlZiB0ZXN0X29uZV9hYnNfYXJnKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoZSAicHktbGlzdCIgY29tbWFuZCB3aXRoIG9uZSBhYnNvbHV0ZSBhcmd1bWVudCcKKyAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LWxpc3QgOSddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0TGlzdGluZygnICAgOSAgICBkZWYgYmF6KCphcmdzKTpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICcgPjEwICAgICAgICBwcmludCg0MilcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICcgIDExICAgIFxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgMTIgICAgZm9vKDEsIDIsIDMpXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnQpCisKKyAgICBkZWYgdGVzdF90d29fYWJzX2FyZ3Moc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlICJweS1saXN0IiBjb21tYW5kIHdpdGggdHdvIGFic29sdXRlIGFyZ3VtZW50cycKKyAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LWxpc3QgMSwzJ10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRMaXN0aW5nKCcgICAxICAgICMgU2FtcGxlIHNjcmlwdCBmb3IgdXNlIGJ5IHRlc3RfZ2RiLnB5XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgMiAgICBcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAzICAgIGRlZiBmb28oYSwgYiwgYyk6XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnQpCisKK2NsYXNzIFN0YWNrTmF2aWdhdGlvblRlc3RzKERlYnVnZ2VyVGVzdHMpOgorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKEhBU19QWVVQX1BZRE9XTiwgInRlc3QgcmVxdWlyZXMgcHktdXAvcHktZG93biBjb21tYW5kcyIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihweXRob25faXNfb3B0aW1pemVkKCksCisgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIHdhcyBjb21waWxlZCB3aXRoIG9wdGltaXphdGlvbnMiKQorICAgIGRlZiB0ZXN0X3B5dXBfY29tbWFuZChzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSB0aGF0IHRoZSAicHktdXAiIGNvbW1hbmQgd29ya3MnCisgICAgICAgIGJ0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc2NyaXB0PXNlbGYuZ2V0X3NhbXBsZV9zY3JpcHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9WydweS11cCddKQorICAgICAgICBzZWxmLmFzc2VydE11bHRpbGluZU1hdGNoZXMoYnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJycnXi4qCisjWzAtOV0rIEZyYW1lIDB4WzAtOWEtZl0rLCBmb3IgZmlsZSAuKmdkYl9zYW1wbGUucHksIGxpbmUgNywgaW4gYmFyIFwoYT0xLCBiPTIsIGM9M1wpCisgICAgYmF6XChhLCBiLCBjXCkKKyQnJycpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhIQVNfUFlVUF9QWURPV04sICJ0ZXN0IHJlcXVpcmVzIHB5LXVwL3B5LWRvd24gY29tbWFuZHMiKQorICAgIGRlZiB0ZXN0X2Rvd25fYXRfYm90dG9tKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IGhhbmRsaW5nIG9mICJweS1kb3duIiBhdCB0aGUgYm90dG9tIG9mIHRoZSBzdGFjaycKKyAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LWRvd24nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFbmRzV2l0aChidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIGZpbmQgYSBuZXdlciBweXRob24gZnJhbWVcbicpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhIQVNfUFlVUF9QWURPV04sICJ0ZXN0IHJlcXVpcmVzIHB5LXVwL3B5LWRvd24gY29tbWFuZHMiKQorICAgIGRlZiB0ZXN0X3VwX2F0X3RvcChzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSBoYW5kbGluZyBvZiAicHktdXAiIGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrJworICAgICAgICBidCA9IHNlbGYuZ2V0X3N0YWNrX3RyYWNlKHNjcmlwdD1zZWxmLmdldF9zYW1wbGVfc2NyaXB0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVsncHktdXAnXSAqIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RW5kc1dpdGgoYnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBmaW5kIGFuIG9sZGVyIHB5dGhvbiBmcmFtZVxuJykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKEhBU19QWVVQX1BZRE9XTiwgInRlc3QgcmVxdWlyZXMgcHktdXAvcHktZG93biBjb21tYW5kcyIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihweXRob25faXNfb3B0aW1pemVkKCksCisgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIHdhcyBjb21waWxlZCB3aXRoIG9wdGltaXphdGlvbnMiKQorICAgIGRlZiB0ZXN0X3VwX3RoZW5fZG93bihzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSAicHktdXAiIGZvbGxvd2VkIGJ5ICJweS1kb3duIicKKyAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LXVwJywgJ3B5LWRvd24nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRNdWx0aWxpbmVNYXRjaGVzKGJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicnJ14uKgorI1swLTldKyBGcmFtZSAweFswLTlhLWZdKywgZm9yIGZpbGUgLipnZGJfc2FtcGxlLnB5LCBsaW5lIDcsIGluIGJhciBcKGE9MSwgYj0yLCBjPTNcKQorICAgIGJhelwoYSwgYiwgY1wpCisjWzAtOV0rIEZyYW1lIDB4WzAtOWEtZl0rLCBmb3IgZmlsZSAuKmdkYl9zYW1wbGUucHksIGxpbmUgMTAsIGluIGJheiBcKGFyZ3M9XCgxLCAyLCAzXClcKQorICAgIHByaW50XCg0MlwpCiskJycnKQorCitjbGFzcyBQeUJ0VGVzdHMoRGVidWdnZXJUZXN0cyk6CisgICAgQHVuaXR0ZXN0LnNraXBJZihweXRob25faXNfb3B0aW1pemVkKCksCisgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIHdhcyBjb21waWxlZCB3aXRoIG9wdGltaXphdGlvbnMiKQorICAgIGRlZiB0ZXN0X2Jhc2ljX2NvbW1hbmQoc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhhdCB0aGUgInB5LWJ0IiBjb21tYW5kIHdvcmtzJworICAgICAgICBidCA9IHNlbGYuZ2V0X3N0YWNrX3RyYWNlKHNjcmlwdD1zZWxmLmdldF9zYW1wbGVfc2NyaXB0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVsncHktYnQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRNdWx0aWxpbmVNYXRjaGVzKGJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicnJ14uKgorI1swLTldKyBGcmFtZSAweFswLTlhLWZdKywgZm9yIGZpbGUgLipnZGJfc2FtcGxlLnB5LCBsaW5lIDcsIGluIGJhciBcKGE9MSwgYj0yLCBjPTNcKQorICAgIGJhelwoYSwgYiwgY1wpCisjWzAtOV0rIEZyYW1lIDB4WzAtOWEtZl0rLCBmb3IgZmlsZSAuKmdkYl9zYW1wbGUucHksIGxpbmUgNCwgaW4gZm9vIFwoYT0xLCBiPTIsIGM9M1wpCisgICAgYmFyXChhLCBiLCBjXCkKKyNbMC05XSsgRnJhbWUgMHhbMC05YS1mXSssIGZvciBmaWxlIC4qZ2RiX3NhbXBsZS5weSwgbGluZSAxMiwgaW4gPG1vZHVsZT4gXChcKQorICAgIGZvb1woMSwgMiwgM1wpCisnJycpCisKK2NsYXNzIFB5UHJpbnRUZXN0cyhEZWJ1Z2dlclRlc3RzKToKKyAgICBAdW5pdHRlc3Quc2tpcElmKHB5dGhvbl9pc19vcHRpbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCisgICAgZGVmIHRlc3RfYmFzaWNfY29tbWFuZChzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSB0aGF0IHRoZSAicHktcHJpbnQiIGNvbW1hbmQgd29ya3MnCisgICAgICAgIGJ0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc2NyaXB0PXNlbGYuZ2V0X3NhbXBsZV9zY3JpcHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9WydweS1wcmludCBhcmdzJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0TXVsdGlsaW5lTWF0Y2hlcyhidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiLipcbmxvY2FsICdhcmdzJyA9IFwoMSwgMiwgM1wpXG4uKiIpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhIQVNfUFlVUF9QWURPV04sICJ0ZXN0IHJlcXVpcmVzIHB5LXVwL3B5LWRvd24gY29tbWFuZHMiKQorICAgIEB1bml0dGVzdC5za2lwSWYocHl0aG9uX2lzX29wdGltaXplZCgpLAorICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiB3YXMgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb25zIikKKyAgICBkZWYgdGVzdF9wcmludF9hZnRlcl91cChzZWxmKToKKyAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LXVwJywgJ3B5LXByaW50IGMnLCAncHktcHJpbnQgYicsICdweS1wcmludCBhJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0TXVsdGlsaW5lTWF0Y2hlcyhidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiLipcbmxvY2FsICdjJyA9IDNcbmxvY2FsICdiJyA9IDJcbmxvY2FsICdhJyA9IDFcbi4qIikKKworICAgIEB1bml0dGVzdC5za2lwSWYocHl0aG9uX2lzX29wdGltaXplZCgpLAorICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiB3YXMgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb25zIikKKyAgICBkZWYgdGVzdF9wcmludGluZ19nbG9iYWwoc2VsZik6CisgICAgICAgIGJ0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc2NyaXB0PXNlbGYuZ2V0X3NhbXBsZV9zY3JpcHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9WydweS1wcmludCBfX25hbWVfXyddKQorICAgICAgICBzZWxmLmFzc2VydE11bHRpbGluZU1hdGNoZXMoYnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIi4qXG5nbG9iYWwgJ19fbmFtZV9fJyA9ICdfX21haW5fXydcbi4qIikKKworICAgIEB1bml0dGVzdC5za2lwSWYocHl0aG9uX2lzX29wdGltaXplZCgpLAorICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiB3YXMgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb25zIikKKyAgICBkZWYgdGVzdF9wcmludGluZ19idWlsdGluKHNlbGYpOgorICAgICAgICBidCA9IHNlbGYuZ2V0X3N0YWNrX3RyYWNlKHNjcmlwdD1zZWxmLmdldF9zYW1wbGVfc2NyaXB0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVsncHktcHJpbnQgbGVuJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0TXVsdGlsaW5lTWF0Y2hlcyhidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiLipcbmJ1aWx0aW4gJ2xlbicgPSA8YnVpbHQtaW4gZnVuY3Rpb24gbGVuPlxuLioiKQorCitjbGFzcyBQeUxvY2Fsc1Rlc3RzKERlYnVnZ2VyVGVzdHMpOgorICAgIEB1bml0dGVzdC5za2lwSWYocHl0aG9uX2lzX29wdGltaXplZCgpLAorICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiB3YXMgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb25zIikKKyAgICBkZWYgdGVzdF9iYXNpY19jb21tYW5kKHNlbGYpOgorICAgICAgICBidCA9IHNlbGYuZ2V0X3N0YWNrX3RyYWNlKHNjcmlwdD1zZWxmLmdldF9zYW1wbGVfc2NyaXB0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVsncHktbG9jYWxzJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0TXVsdGlsaW5lTWF0Y2hlcyhidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiLipcbmFyZ3MgPSBcKDEsIDIsIDNcKVxuLioiKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFTX1BZVVBfUFlET1dOLCAidGVzdCByZXF1aXJlcyBweS11cC9weS1kb3duIGNvbW1hbmRzIikKKyAgICBAdW5pdHRlc3Quc2tpcElmKHB5dGhvbl9pc19vcHRpbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCisgICAgZGVmIHRlc3RfbG9jYWxzX2FmdGVyX3VwKHNlbGYpOgorICAgICAgICBidCA9IHNlbGYuZ2V0X3N0YWNrX3RyYWNlKHNjcmlwdD1zZWxmLmdldF9zYW1wbGVfc2NyaXB0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVsncHktdXAnLCAncHktbG9jYWxzJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0TXVsdGlsaW5lTWF0Y2hlcyhidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiLipcbmEgPSAxXG5iID0gMlxuYyA9IDNcbi4qIikKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChQcmV0dHlQcmludFRlc3RzLAorICAgICAgICAgICAgICAgICBQeUxpc3RUZXN0cywKKyAgICAgICAgICAgICAgICAgU3RhY2tOYXZpZ2F0aW9uVGVzdHMsCisgICAgICAgICAgICAgICAgIFB5QnRUZXN0cywKKyAgICAgICAgICAgICAgICAgUHlQcmludFRlc3RzLAorICAgICAgICAgICAgICAgICBQeUxvY2Fsc1Rlc3RzCisgICAgICAgICAgICAgICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2RiLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5Nzg0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2RiLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5Nzg0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2RibS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYm0ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxNjlhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYm0ucHkKQEAgLTAsMCArMSw4MiBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0LCB1bmxpbmssIGltcG9ydF9tb2R1bGUKK2dkYm0gPSBpbXBvcnRfbW9kdWxlKCdnZGJtJykKKworCitmaWxlbmFtZSA9IFRFU1RGTgorCitjbGFzcyBUZXN0R2RibSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZyA9IE5vbmUKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5nLmNsb3NlKCkKKyAgICAgICAgdW5saW5rKGZpbGVuYW1lKQorCisgICAgZGVmIHRlc3Rfa2V5X21ldGhvZHMoc2VsZik6CisgICAgICAgIHNlbGYuZyA9IGdkYm0ub3BlbihmaWxlbmFtZSwgJ2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZy5rZXlzKCksIFtdKQorICAgICAgICBzZWxmLmdbJ2EnXSA9ICdiJworICAgICAgICBzZWxmLmdbJzEyMzQ1Njc4OTEwJ10gPSAnMDE5MjM3NDEwOTgyMzQwOTEyODQwMTk4MjQyJworICAgICAgICBrZXlfc2V0ID0gc2V0KHNlbGYuZy5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5X3NldCwgZnJvemVuc2V0KFsnYScsICcxMjM0NTY3ODkxMCddKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZy5oYXNfa2V5KCdhJykpCisgICAgICAgIGtleSA9IHNlbGYuZy5maXJzdGtleSgpCisgICAgICAgIHdoaWxlIGtleToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oa2V5LCBrZXlfc2V0KQorICAgICAgICAgICAga2V5X3NldC5yZW1vdmUoa2V5KQorICAgICAgICAgICAga2V5ID0gc2VsZi5nLm5leHRrZXkoa2V5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLmdbJ3h4eCddKQorCisgICAgZGVmIHRlc3RfZXJyb3JfY29uZGl0aW9ucyhzZWxmKToKKyAgICAgICAgIyBUcnkgdG8gb3BlbiBhIG5vbi1leGlzdGVudCBkYXRhYmFzZS4KKyAgICAgICAgdW5saW5rKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhnZGJtLmVycm9yLCBnZGJtLm9wZW4sIGZpbGVuYW1lLCAncicpCisgICAgICAgICMgVHJ5IHRvIGFjY2VzcyBhIGNsb3NlZCBkYXRhYmFzZS4KKyAgICAgICAgc2VsZi5nID0gZ2RibS5vcGVuKGZpbGVuYW1lLCAnYycpCisgICAgICAgIHNlbGYuZy5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGdkYm0uZXJyb3IsIGxhbWJkYTogc2VsZi5nWydhJ10pCisgICAgICAgICMgdHJ5IHBhc3MgYW4gaW52YWxpZCBvcGVuIGZsYWcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZ2RibS5lcnJvciwgbGFtYmRhOiBnZGJtLm9wZW4oZmlsZW5hbWUsICdyeCcpLmNsb3NlKCkpCisKKyAgICBkZWYgdGVzdF9mbGFncyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoZSBmbGFnIHBhcmFtZXRlciBvcGVuKCkgYnkgdHJ5aW5nIGFsbCBzdXBwb3J0ZWQgZmxhZyBtb2Rlcy4KKyAgICAgICAgYWxsID0gc2V0KGdkYm0ub3Blbl9mbGFncykKKyAgICAgICAgIyBUZXN0IHN0YW5kYXJkIGZsYWdzIChwcmVzdW1hYmx5ICJjcnduIikuCisgICAgICAgIG1vZGVzID0gYWxsIC0gc2V0KCdmc3UnKQorICAgICAgICBmb3IgbW9kZSBpbiBzb3J0ZWQobW9kZXMpOgorICAgICAgICAgICAgc2VsZi5nID0gZ2RibS5vcGVuKGZpbGVuYW1lLCBtb2RlKQorICAgICAgICAgICAgc2VsZi5nLmNsb3NlKCkKKworICAgICAgICAjIFRlc3QgYWRkaXRpb25hbCBmbGFncyAocHJlc3VtYWJseSAiZnN1IikuCisgICAgICAgIGZsYWdzID0gYWxsIC0gc2V0KCdjcnduJykKKyAgICAgICAgZm9yIG1vZGUgaW4gbW9kZXM6CisgICAgICAgICAgICBmb3IgZmxhZyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBzZWxmLmcgPSBnZGJtLm9wZW4oZmlsZW5hbWUsIG1vZGUgKyBmbGFnKQorICAgICAgICAgICAgICAgIHNlbGYuZy5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9yZW9yZ2FuaXplKHNlbGYpOgorICAgICAgICBzZWxmLmcgPSBnZGJtLm9wZW4oZmlsZW5hbWUsICdjJykKKyAgICAgICAgc2l6ZTAgPSBvcy5wYXRoLmdldHNpemUoZmlsZW5hbWUpCisKKyAgICAgICAgc2VsZi5nWyd4J10gPSAneCcgKiAxMDAwMAorICAgICAgICBzaXplMSA9IG9zLnBhdGguZ2V0c2l6ZShmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNpemUwIDwgc2l6ZTEpCisKKyAgICAgICAgZGVsIHNlbGYuZ1sneCddCisgICAgICAgICMgJ3NpemUnIGlzIHN1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGV2ZW4gYWZ0ZXIgZGVsZXRpbmcgYW4gZW50cnkuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5nZXRzaXplKGZpbGVuYW1lKSwgc2l6ZTEpCisKKyAgICAgICAgc2VsZi5nLnJlb3JnYW5pemUoKQorICAgICAgICBzaXplMiA9IG9zLnBhdGguZ2V0c2l6ZShmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNpemUxID4gc2l6ZTIgPj0gc2l6ZTApCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUZXN0R2RibSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2RibS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZGJtLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ2NjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2RibS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2RibS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZGJtLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ2NjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2RibS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczOTlmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKQEAgLTAsMCArMSwxOTA3IEBACit0dXRvcmlhbF90ZXN0cyA9ICIiIgorTGV0J3MgdHJ5IGEgc2ltcGxlIGdlbmVyYXRvcjoKKworICAgID4+PiBkZWYgZigpOgorICAgIC4uLiAgICB5aWVsZCAxCisgICAgLi4uICAgIHlpZWxkIDIKKworICAgID4+PiBmb3IgaSBpbiBmKCk6CisgICAgLi4uICAgICBwcmludCBpCisgICAgMQorICAgIDIKKyAgICA+Pj4gZyA9IGYoKQorICAgID4+PiBnLm5leHQoKQorICAgIDEKKyAgICA+Pj4gZy5uZXh0KCkKKyAgICAyCisKKyJGYWxsaW5nIG9mZiB0aGUgZW5kIiBzdG9wcyB0aGUgZ2VuZXJhdG9yOgorCisgICAgPj4+IGcubmV4dCgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPworICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMiwgaW4gZworICAgIFN0b3BJdGVyYXRpb24KKworInJldHVybiIgYWxzbyBzdG9wcyB0aGUgZ2VuZXJhdG9yOgorCisgICAgPj4+IGRlZiBmKCk6CisgICAgLi4uICAgICB5aWVsZCAxCisgICAgLi4uICAgICByZXR1cm4KKyAgICAuLi4gICAgIHlpZWxkIDIgIyBuZXZlciByZWFjaGVkCisgICAgLi4uCisgICAgPj4+IGcgPSBmKCkKKyAgICA+Pj4gZy5uZXh0KCkKKyAgICAxCisgICAgPj4+IGcubmV4dCgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPworICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMywgaW4gZgorICAgIFN0b3BJdGVyYXRpb24KKyAgICA+Pj4gZy5uZXh0KCkgIyBvbmNlIHN0b3BwZWQsIGNhbid0IGJlIHJlc3VtZWQKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CisgICAgU3RvcEl0ZXJhdGlvbgorCisicmFpc2UgU3RvcEl0ZXJhdGlvbiIgc3RvcHMgdGhlIGdlbmVyYXRvciB0b286CisKKyAgICA+Pj4gZGVmIGYoKToKKyAgICAuLi4gICAgIHlpZWxkIDEKKyAgICAuLi4gICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAuLi4gICAgIHlpZWxkIDIgIyBuZXZlciByZWFjaGVkCisgICAgLi4uCisgICAgPj4+IGcgPSBmKCkKKyAgICA+Pj4gZy5uZXh0KCkKKyAgICAxCisgICAgPj4+IGcubmV4dCgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPworICAgIFN0b3BJdGVyYXRpb24KKyAgICA+Pj4gZy5uZXh0KCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CisgICAgU3RvcEl0ZXJhdGlvbgorCitIb3dldmVyLCB0aGV5IGFyZSBub3QgZXhhY3RseSBlcXVpdmFsZW50OgorCisgICAgPj4+IGRlZiBnMSgpOgorICAgIC4uLiAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgIHJldHVybgorICAgIC4uLiAgICAgZXhjZXB0OgorICAgIC4uLiAgICAgICAgIHlpZWxkIDEKKyAgICAuLi4KKyAgICA+Pj4gbGlzdChnMSgpKQorICAgIFtdCisKKyAgICA+Pj4gZGVmIGcyKCk6CisgICAgLi4uICAgICB0cnk6CisgICAgLi4uICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgIC4uLiAgICAgZXhjZXB0OgorICAgIC4uLiAgICAgICAgIHlpZWxkIDQyCisgICAgPj4+IHByaW50IGxpc3QoZzIoKSkKKyAgICBbNDJdCisKK1RoaXMgbWF5IGJlIHN1cnByaXNpbmcgYXQgZmlyc3Q6CisKKyAgICA+Pj4gZGVmIGczKCk6CisgICAgLi4uICAgICB0cnk6CisgICAgLi4uICAgICAgICAgcmV0dXJuCisgICAgLi4uICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgIHlpZWxkIDEKKyAgICAuLi4KKyAgICA+Pj4gbGlzdChnMygpKQorICAgIFsxXQorCitMZXQncyBjcmVhdGUgYW4gYWx0ZXJuYXRlIHJhbmdlKCkgZnVuY3Rpb24gaW1wbGVtZW50ZWQgYXMgYSBnZW5lcmF0b3I6CisKKyAgICA+Pj4gZGVmIHlyYW5nZShuKToKKyAgICAuLi4gICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgIC4uLiAgICAgICAgIHlpZWxkIGkKKyAgICAuLi4KKyAgICA+Pj4gbGlzdCh5cmFuZ2UoNSkpCisgICAgWzAsIDEsIDIsIDMsIDRdCisKK0dlbmVyYXRvcnMgYWx3YXlzIHJldHVybiB0byB0aGUgbW9zdCByZWNlbnQgY2FsbGVyOgorCisgICAgPj4+IGRlZiBjcmVhdG9yKCk6CisgICAgLi4uICAgICByID0geXJhbmdlKDUpCisgICAgLi4uICAgICBwcmludCAiY3JlYXRvciIsIHIubmV4dCgpCisgICAgLi4uICAgICByZXR1cm4gcgorICAgIC4uLgorICAgID4+PiBkZWYgY2FsbGVyKCk6CisgICAgLi4uICAgICByID0gY3JlYXRvcigpCisgICAgLi4uICAgICBmb3IgaSBpbiByOgorICAgIC4uLiAgICAgICAgICAgICBwcmludCAiY2FsbGVyIiwgaQorICAgIC4uLgorICAgID4+PiBjYWxsZXIoKQorICAgIGNyZWF0b3IgMAorICAgIGNhbGxlciAxCisgICAgY2FsbGVyIDIKKyAgICBjYWxsZXIgMworICAgIGNhbGxlciA0CisKK0dlbmVyYXRvcnMgY2FuIGNhbGwgb3RoZXIgZ2VuZXJhdG9yczoKKworICAgID4+PiBkZWYgenJhbmdlKG4pOgorICAgIC4uLiAgICAgZm9yIGkgaW4geXJhbmdlKG4pOgorICAgIC4uLiAgICAgICAgIHlpZWxkIGkKKyAgICAuLi4KKyAgICA+Pj4gbGlzdCh6cmFuZ2UoNSkpCisgICAgWzAsIDEsIDIsIDMsIDRdCisKKyIiIgorCisjIFRoZSBleGFtcGxlcyBmcm9tIFBFUCAyNTUuCisKK3BlcF90ZXN0cyA9ICIiIgorCitTcGVjaWZpY2F0aW9uOiAgWWllbGQKKworICAgIFJlc3RyaWN0aW9uOiAgQSBnZW5lcmF0b3IgY2Fubm90IGJlIHJlc3VtZWQgd2hpbGUgaXQgaXMgYWN0aXZlbHkKKyAgICBydW5uaW5nOgorCisgICAgPj4+IGRlZiBnKCk6CisgICAgLi4uICAgICBpID0gbWUubmV4dCgpCisgICAgLi4uICAgICB5aWVsZCBpCisgICAgPj4+IG1lID0gZygpCisgICAgPj4+IG1lLm5leHQoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgLi4uCisgICAgICBGaWxlICI8c3RyaW5nPiIsIGxpbmUgMiwgaW4gZworICAgIFZhbHVlRXJyb3I6IGdlbmVyYXRvciBhbHJlYWR5IGV4ZWN1dGluZworCitTcGVjaWZpY2F0aW9uOiBSZXR1cm4KKworICAgIE5vdGUgdGhhdCByZXR1cm4gaXNuJ3QgYWx3YXlzIGVxdWl2YWxlbnQgdG8gcmFpc2luZyBTdG9wSXRlcmF0aW9uOiAgdGhlCisgICAgZGlmZmVyZW5jZSBsaWVzIGluIGhvdyBlbmNsb3NpbmcgdHJ5L2V4Y2VwdCBjb25zdHJ1Y3RzIGFyZSB0cmVhdGVkLgorICAgIEZvciBleGFtcGxlLAorCisgICAgICAgID4+PiBkZWYgZjEoKToKKyAgICAgICAgLi4uICAgICB0cnk6CisgICAgICAgIC4uLiAgICAgICAgIHJldHVybgorICAgICAgICAuLi4gICAgIGV4Y2VwdDoKKyAgICAgICAgLi4uICAgICAgICB5aWVsZCAxCisgICAgICAgID4+PiBwcmludCBsaXN0KGYxKCkpCisgICAgICAgIFtdCisKKyAgICBiZWNhdXNlLCBhcyBpbiBhbnkgZnVuY3Rpb24sIHJldHVybiBzaW1wbHkgZXhpdHMsIGJ1dAorCisgICAgICAgID4+PiBkZWYgZjIoKToKKyAgICAgICAgLi4uICAgICB0cnk6CisgICAgICAgIC4uLiAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgLi4uICAgICBleGNlcHQ6CisgICAgICAgIC4uLiAgICAgICAgIHlpZWxkIDQyCisgICAgICAgID4+PiBwcmludCBsaXN0KGYyKCkpCisgICAgICAgIFs0Ml0KKworICAgIGJlY2F1c2UgU3RvcEl0ZXJhdGlvbiBpcyBjYXB0dXJlZCBieSBhIGJhcmUgImV4Y2VwdCIsIGFzIGlzIGFueQorICAgIGV4Y2VwdGlvbi4KKworU3BlY2lmaWNhdGlvbjogR2VuZXJhdG9ycyBhbmQgRXhjZXB0aW9uIFByb3BhZ2F0aW9uCisKKyAgICA+Pj4gZGVmIGYoKToKKyAgICAuLi4gICAgIHJldHVybiAxLy8wCisgICAgPj4+IGRlZiBnKCk6CisgICAgLi4uICAgICB5aWVsZCBmKCkgICMgdGhlIHplcm8gZGl2aXNpb24gZXhjZXB0aW9uIHByb3BhZ2F0ZXMKKyAgICAuLi4gICAgIHlpZWxkIDQyICAgIyBhbmQgd2UnbGwgbmV2ZXIgZ2V0IGhlcmUKKyAgICA+Pj4gayA9IGcoKQorICAgID4+PiBrLm5leHQoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDIsIGluIGcKKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDIsIGluIGYKKyAgICBaZXJvRGl2aXNpb25FcnJvcjogaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybworICAgID4+PiBrLm5leHQoKSAgIyBhbmQgdGhlIGdlbmVyYXRvciBjYW5ub3QgYmUgcmVzdW1lZAorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KKyAgICBTdG9wSXRlcmF0aW9uCisgICAgPj4+CisKK1NwZWNpZmljYXRpb246IFRyeS9FeGNlcHQvRmluYWxseQorCisgICAgPj4+IGRlZiBmKCk6CisgICAgLi4uICAgICB0cnk6CisgICAgLi4uICAgICAgICAgeWllbGQgMQorICAgIC4uLiAgICAgICAgIHRyeToKKyAgICAuLi4gICAgICAgICAgICAgeWllbGQgMgorICAgIC4uLiAgICAgICAgICAgICAxLy8wCisgICAgLi4uICAgICAgICAgICAgIHlpZWxkIDMgICMgbmV2ZXIgZ2V0IGhlcmUKKyAgICAuLi4gICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgLi4uICAgICAgICAgICAgIHlpZWxkIDQKKyAgICAuLi4gICAgICAgICAgICAgeWllbGQgNQorICAgIC4uLiAgICAgICAgICAgICByYWlzZQorICAgIC4uLiAgICAgICAgIGV4Y2VwdDoKKyAgICAuLi4gICAgICAgICAgICAgeWllbGQgNgorICAgIC4uLiAgICAgICAgIHlpZWxkIDcgICAgICMgdGhlICJyYWlzZSIgYWJvdmUgc3RvcHMgdGhpcworICAgIC4uLiAgICAgZXhjZXB0OgorICAgIC4uLiAgICAgICAgIHlpZWxkIDgKKyAgICAuLi4gICAgIHlpZWxkIDkKKyAgICAuLi4gICAgIHRyeToKKyAgICAuLi4gICAgICAgICB4ID0gMTIKKyAgICAuLi4gICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgeWllbGQgMTAKKyAgICAuLi4gICAgIHlpZWxkIDExCisgICAgPj4+IHByaW50IGxpc3QoZigpKQorICAgIFsxLCAyLCA0LCA1LCA4LCA5LCAxMCwgMTFdCisgICAgPj4+CisKK0d1aWRvJ3MgYmluYXJ5IHRyZWUgZXhhbXBsZS4KKworICAgID4+PiAjIEEgYmluYXJ5IHRyZWUgY2xhc3MuCisgICAgPj4+IGNsYXNzIFRyZWU6CisgICAgLi4uCisgICAgLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWwsIGxlZnQ9Tm9uZSwgcmlnaHQ9Tm9uZSk6CisgICAgLi4uICAgICAgICAgc2VsZi5sYWJlbCA9IGxhYmVsCisgICAgLi4uICAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdAorICAgIC4uLiAgICAgICAgIHNlbGYucmlnaHQgPSByaWdodAorICAgIC4uLgorICAgIC4uLiAgICAgZGVmIF9fcmVwcl9fKHNlbGYsIGxldmVsPTAsIGluZGVudD0iICAgICIpOgorICAgIC4uLiAgICAgICAgIHMgPSBsZXZlbCppbmRlbnQgKyByZXByKHNlbGYubGFiZWwpCisgICAgLi4uICAgICAgICAgaWYgc2VsZi5sZWZ0OgorICAgIC4uLiAgICAgICAgICAgICBzID0gcyArICJcXG4iICsgc2VsZi5sZWZ0Ll9fcmVwcl9fKGxldmVsKzEsIGluZGVudCkKKyAgICAuLi4gICAgICAgICBpZiBzZWxmLnJpZ2h0OgorICAgIC4uLiAgICAgICAgICAgICBzID0gcyArICJcXG4iICsgc2VsZi5yaWdodC5fX3JlcHJfXyhsZXZlbCsxLCBpbmRlbnQpCisgICAgLi4uICAgICAgICAgcmV0dXJuIHMKKyAgICAuLi4KKyAgICAuLi4gICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAuLi4gICAgICAgICByZXR1cm4gaW5vcmRlcihzZWxmKQorCisgICAgPj4+ICMgQ3JlYXRlIGEgVHJlZSBmcm9tIGEgbGlzdC4KKyAgICA+Pj4gZGVmIHRyZWUobGlzdCk6CisgICAgLi4uICAgICBuID0gbGVuKGxpc3QpCisgICAgLi4uICAgICBpZiBuID09IDA6CisgICAgLi4uICAgICAgICAgcmV0dXJuIFtdCisgICAgLi4uICAgICBpID0gbiAvLyAyCisgICAgLi4uICAgICByZXR1cm4gVHJlZShsaXN0W2ldLCB0cmVlKGxpc3RbOmldKSwgdHJlZShsaXN0W2krMTpdKSkKKworICAgID4+PiAjIFNob3cgaXQgb2ZmOiBjcmVhdGUgYSB0cmVlLgorICAgID4+PiB0ID0gdHJlZSgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKQorCisgICAgPj4+ICMgQSByZWN1cnNpdmUgZ2VuZXJhdG9yIHRoYXQgZ2VuZXJhdGVzIFRyZWUgbGFiZWxzIGluIGluLW9yZGVyLgorICAgID4+PiBkZWYgaW5vcmRlcih0KToKKyAgICAuLi4gICAgIGlmIHQ6CisgICAgLi4uICAgICAgICAgZm9yIHggaW4gaW5vcmRlcih0LmxlZnQpOgorICAgIC4uLiAgICAgICAgICAgICB5aWVsZCB4CisgICAgLi4uICAgICAgICAgeWllbGQgdC5sYWJlbAorICAgIC4uLiAgICAgICAgIGZvciB4IGluIGlub3JkZXIodC5yaWdodCk6CisgICAgLi4uICAgICAgICAgICAgIHlpZWxkIHgKKworICAgID4+PiAjIFNob3cgaXQgb2ZmOiBjcmVhdGUgYSB0cmVlLgorICAgID4+PiB0ID0gdHJlZSgiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiKQorICAgID4+PiAjIFByaW50IHRoZSBub2RlcyBvZiB0aGUgdHJlZSBpbiBpbi1vcmRlci4KKyAgICA+Pj4gZm9yIHggaW4gdDoKKyAgICAuLi4gICAgIHByaW50IHgsCisgICAgQSBCIEMgRCBFIEYgRyBIIEkgSiBLIEwgTSBOIE8gUCBRIFIgUyBUIFUgViBXIFggWSBaCisKKyAgICA+Pj4gIyBBIG5vbi1yZWN1cnNpdmUgZ2VuZXJhdG9yLgorICAgID4+PiBkZWYgaW5vcmRlcihub2RlKToKKyAgICAuLi4gICAgIHN0YWNrID0gW10KKyAgICAuLi4gICAgIHdoaWxlIG5vZGU6CisgICAgLi4uICAgICAgICAgd2hpbGUgbm9kZS5sZWZ0OgorICAgIC4uLiAgICAgICAgICAgICBzdGFjay5hcHBlbmQobm9kZSkKKyAgICAuLi4gICAgICAgICAgICAgbm9kZSA9IG5vZGUubGVmdAorICAgIC4uLiAgICAgICAgIHlpZWxkIG5vZGUubGFiZWwKKyAgICAuLi4gICAgICAgICB3aGlsZSBub3Qgbm9kZS5yaWdodDoKKyAgICAuLi4gICAgICAgICAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgICAgICAgICAgbm9kZSA9IHN0YWNrLnBvcCgpCisgICAgLi4uICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgIC4uLiAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgLi4uICAgICAgICAgICAgIHlpZWxkIG5vZGUubGFiZWwKKyAgICAuLi4gICAgICAgICBub2RlID0gbm9kZS5yaWdodAorCisgICAgPj4+ICMgRXhlcmNpc2UgdGhlIG5vbi1yZWN1cnNpdmUgZ2VuZXJhdG9yLgorICAgID4+PiBmb3IgeCBpbiB0OgorICAgIC4uLiAgICAgcHJpbnQgeCwKKyAgICBBIEIgQyBEIEUgRiBHIEggSSBKIEsgTCBNIE4gTyBQIFEgUiBTIFQgVSBWIFcgWCBZIFoKKworIiIiCisKKyMgRXhhbXBsZXMgZnJvbSBJdGVyYXRvci1MaXN0IGFuZCBQeXRob24tRGV2IGFuZCBjLmwucHkuCisKK2VtYWlsX3Rlc3RzID0gIiIiCisKK1RoZSBkaWZmZXJlbmNlIGJldHdlZW4geWllbGRpbmcgTm9uZSBhbmQgcmV0dXJuaW5nIGl0LgorCis+Pj4gZGVmIGcoKToKKy4uLiAgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisuLi4gICAgICAgICB5aWVsZCBOb25lCisuLi4gICAgIHlpZWxkIE5vbmUKKy4uLiAgICAgcmV0dXJuCis+Pj4gbGlzdChnKCkpCitbTm9uZSwgTm9uZSwgTm9uZSwgTm9uZV0KKworRW5zdXJlIHRoYXQgZXhwbGljaXRseSByYWlzaW5nIFN0b3BJdGVyYXRpb24gYWN0cyBsaWtlIGFueSBvdGhlciBleGNlcHRpb24KK2luIHRyeS9leGNlcHQsIG5vdCBsaWtlIGEgcmV0dXJuLgorCis+Pj4gZGVmIGcoKToKKy4uLiAgICAgeWllbGQgMQorLi4uICAgICB0cnk6CisuLi4gICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisuLi4gICAgIGV4Y2VwdDoKKy4uLiAgICAgICAgIHlpZWxkIDIKKy4uLiAgICAgeWllbGQgMworPj4+IGxpc3QoZygpKQorWzEsIDIsIDNdCisKK05leHQgb25lIHdhcyBwb3N0ZWQgdG8gYy5sLnB5LgorCis+Pj4gZGVmIGdjb21iKHgsIGspOgorLi4uICAgICAiR2VuZXJhdGUgYWxsIGNvbWJpbmF0aW9ucyBvZiBrIGVsZW1lbnRzIGZyb20gbGlzdCB4LiIKKy4uLgorLi4uICAgICBpZiBrID4gbGVuKHgpOgorLi4uICAgICAgICAgcmV0dXJuCisuLi4gICAgIGlmIGsgPT0gMDoKKy4uLiAgICAgICAgIHlpZWxkIFtdCisuLi4gICAgIGVsc2U6CisuLi4gICAgICAgICBmaXJzdCwgcmVzdCA9IHhbMF0sIHhbMTpdCisuLi4gICAgICAgICAjIEEgY29tYmluYXRpb24gZG9lcyBvciBkb2Vzbid0IGNvbnRhaW4gZmlyc3QuCisuLi4gICAgICAgICAjIElmIGl0IGRvZXMsIHRoZSByZW1haW5kZXIgaXMgYSBrLTEgY29tYiBvZiByZXN0LgorLi4uICAgICAgICAgZm9yIGMgaW4gZ2NvbWIocmVzdCwgay0xKToKKy4uLiAgICAgICAgICAgICBjLmluc2VydCgwLCBmaXJzdCkKKy4uLiAgICAgICAgICAgICB5aWVsZCBjCisuLi4gICAgICAgICAjIElmIGl0IGRvZXNuJ3QgY29udGFpbiBmaXJzdCwgaXQncyBhIGsgY29tYiBvZiByZXN0LgorLi4uICAgICAgICAgZm9yIGMgaW4gZ2NvbWIocmVzdCwgayk6CisuLi4gICAgICAgICAgICAgeWllbGQgYworCis+Pj4gc2VxID0gcmFuZ2UoMSwgNSkKKz4+PiBmb3IgayBpbiByYW5nZShsZW4oc2VxKSArIDIpOgorLi4uICAgICBwcmludCAiJWQtY29tYnMgb2YgJXM6IiAlIChrLCBzZXEpCisuLi4gICAgIGZvciBjIGluIGdjb21iKHNlcSwgayk6CisuLi4gICAgICAgICBwcmludCAiICAgIiwgYworMC1jb21icyBvZiBbMSwgMiwgMywgNF06CisgICAgW10KKzEtY29tYnMgb2YgWzEsIDIsIDMsIDRdOgorICAgIFsxXQorICAgIFsyXQorICAgIFszXQorICAgIFs0XQorMi1jb21icyBvZiBbMSwgMiwgMywgNF06CisgICAgWzEsIDJdCisgICAgWzEsIDNdCisgICAgWzEsIDRdCisgICAgWzIsIDNdCisgICAgWzIsIDRdCisgICAgWzMsIDRdCiszLWNvbWJzIG9mIFsxLCAyLCAzLCA0XToKKyAgICBbMSwgMiwgM10KKyAgICBbMSwgMiwgNF0KKyAgICBbMSwgMywgNF0KKyAgICBbMiwgMywgNF0KKzQtY29tYnMgb2YgWzEsIDIsIDMsIDRdOgorICAgIFsxLCAyLCAzLCA0XQorNS1jb21icyBvZiBbMSwgMiwgMywgNF06CisKK0Zyb20gdGhlIEl0ZXJhdG9ycyBsaXN0LCBhYm91dCB0aGUgdHlwZXMgb2YgdGhlc2UgdGhpbmdzLgorCis+Pj4gZGVmIGcoKToKKy4uLiAgICAgeWllbGQgMQorLi4uCis+Pj4gdHlwZShnKQorPHR5cGUgJ2Z1bmN0aW9uJz4KKz4+PiBpID0gZygpCis+Pj4gdHlwZShpKQorPHR5cGUgJ2dlbmVyYXRvcic+Cis+Pj4gW3MgZm9yIHMgaW4gZGlyKGkpIGlmIG5vdCBzLnN0YXJ0c3dpdGgoJ18nKV0KK1snY2xvc2UnLCAnZ2lfY29kZScsICdnaV9mcmFtZScsICdnaV9ydW5uaW5nJywgJ25leHQnLCAnc2VuZCcsICd0aHJvdyddCis+Pj4gZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgSEFWRV9ET0NTVFJJTkdTCis+Pj4gcHJpbnQoaS5uZXh0Ll9fZG9jX18gaWYgSEFWRV9ET0NTVFJJTkdTIGVsc2UgJ3gubmV4dCgpIC0+IHRoZSBuZXh0IHZhbHVlLCBvciByYWlzZSBTdG9wSXRlcmF0aW9uJykKK3gubmV4dCgpIC0+IHRoZSBuZXh0IHZhbHVlLCBvciByYWlzZSBTdG9wSXRlcmF0aW9uCis+Pj4gaXRlcihpKSBpcyBpCitUcnVlCis+Pj4gaW1wb3J0IHR5cGVzCis+Pj4gaXNpbnN0YW5jZShpLCB0eXBlcy5HZW5lcmF0b3JUeXBlKQorVHJ1ZQorCitBbmQgbW9yZSwgYWRkZWQgbGF0ZXIuCisKKz4+PiBpLmdpX3J1bm5pbmcKKzAKKz4+PiB0eXBlKGkuZ2lfZnJhbWUpCis8dHlwZSAnZnJhbWUnPgorPj4+IGkuZ2lfcnVubmluZyA9IDQyCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorVHlwZUVycm9yOiByZWFkb25seSBhdHRyaWJ1dGUKKz4+PiBkZWYgZygpOgorLi4uICAgICB5aWVsZCBtZS5naV9ydW5uaW5nCis+Pj4gbWUgPSBnKCkKKz4+PiBtZS5naV9ydW5uaW5nCiswCis+Pj4gbWUubmV4dCgpCisxCis+Pj4gbWUuZ2lfcnVubmluZworMAorCitBIGNsZXZlciB1bmlvbi1maW5kIGltcGxlbWVudGF0aW9uIGZyb20gYy5sLnB5LCBkdWUgdG8gRGF2aWQgRXBwc3RlaW4uCitTZW50OiBGcmlkYXksIEp1bmUgMjksIDIwMDEgMTI6MTYgUE0KK1RvOiBweXRob24tbGlzdEBweXRob24ub3JnCitTdWJqZWN0OiBSZTogUEVQIDI1NTogU2ltcGxlIEdlbmVyYXRvcnMKKworPj4+IGNsYXNzIGRpc2pvaW50U2V0OgorLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisuLi4gICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisuLi4gICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUKKy4uLiAgICAgICAgIHNlbGYuZ2VuZXJhdG9yID0gc2VsZi5nZW5lcmF0ZSgpCisuLi4KKy4uLiAgICAgZGVmIGdlbmVyYXRlKHNlbGYpOgorLi4uICAgICAgICAgd2hpbGUgbm90IHNlbGYucGFyZW50OgorLi4uICAgICAgICAgICAgIHlpZWxkIHNlbGYKKy4uLiAgICAgICAgIGZvciB4IGluIHNlbGYucGFyZW50LmdlbmVyYXRvcjoKKy4uLiAgICAgICAgICAgICB5aWVsZCB4CisuLi4KKy4uLiAgICAgZGVmIGZpbmQoc2VsZik6CisuLi4gICAgICAgICByZXR1cm4gc2VsZi5nZW5lcmF0b3IubmV4dCgpCisuLi4KKy4uLiAgICAgZGVmIHVuaW9uKHNlbGYsIHBhcmVudCk6CisuLi4gICAgICAgICBpZiBzZWxmLnBhcmVudDoKKy4uLiAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJTb3JyeSwgSSdtIG5vdCBhIHJvb3QhIikKKy4uLiAgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CisuLi4KKy4uLiAgICAgZGVmIF9fc3RyX18oc2VsZik6CisuLi4gICAgICAgICByZXR1cm4gc2VsZi5uYW1lCisKKz4+PiBuYW1lcyA9ICJBQkNERUZHSElKS0xNIgorPj4+IHNldHMgPSBbZGlzam9pbnRTZXQobmFtZSkgZm9yIG5hbWUgaW4gbmFtZXNdCis+Pj4gcm9vdHMgPSBzZXRzWzpdCisKKz4+PiBpbXBvcnQgcmFuZG9tCis+Pj4gZ2VuID0gcmFuZG9tLldpY2htYW5uSGlsbCg0MikKKz4+PiB3aGlsZSAxOgorLi4uICAgICBmb3IgcyBpbiBzZXRzOgorLi4uICAgICAgICAgcHJpbnQgIiVzLT4lcyIgJSAocywgcy5maW5kKCkpLAorLi4uICAgICBwcmludAorLi4uICAgICBpZiBsZW4ocm9vdHMpID4gMToKKy4uLiAgICAgICAgIHMxID0gZ2VuLmNob2ljZShyb290cykKKy4uLiAgICAgICAgIHJvb3RzLnJlbW92ZShzMSkKKy4uLiAgICAgICAgIHMyID0gZ2VuLmNob2ljZShyb290cykKKy4uLiAgICAgICAgIHMxLnVuaW9uKHMyKQorLi4uICAgICAgICAgcHJpbnQgIm1lcmdlZCIsIHMxLCAiaW50byIsIHMyCisuLi4gICAgIGVsc2U6CisuLi4gICAgICAgICBicmVhaworQS0+QSBCLT5CIEMtPkMgRC0+RCBFLT5FIEYtPkYgRy0+RyBILT5IIEktPkkgSi0+SiBLLT5LIEwtPkwgTS0+TQorbWVyZ2VkIEQgaW50byBHCitBLT5BIEItPkIgQy0+QyBELT5HIEUtPkUgRi0+RiBHLT5HIEgtPkggSS0+SSBKLT5KIEstPksgTC0+TCBNLT5NCittZXJnZWQgQyBpbnRvIEYKK0EtPkEgQi0+QiBDLT5GIEQtPkcgRS0+RSBGLT5GIEctPkcgSC0+SCBJLT5JIEotPkogSy0+SyBMLT5MIE0tPk0KK21lcmdlZCBMIGludG8gQQorQS0+QSBCLT5CIEMtPkYgRC0+RyBFLT5FIEYtPkYgRy0+RyBILT5IIEktPkkgSi0+SiBLLT5LIEwtPkEgTS0+TQorbWVyZ2VkIEggaW50byBFCitBLT5BIEItPkIgQy0+RiBELT5HIEUtPkUgRi0+RiBHLT5HIEgtPkUgSS0+SSBKLT5KIEstPksgTC0+QSBNLT5NCittZXJnZWQgQiBpbnRvIEUKK0EtPkEgQi0+RSBDLT5GIEQtPkcgRS0+RSBGLT5GIEctPkcgSC0+RSBJLT5JIEotPkogSy0+SyBMLT5BIE0tPk0KK21lcmdlZCBKIGludG8gRworQS0+QSBCLT5FIEMtPkYgRC0+RyBFLT5FIEYtPkYgRy0+RyBILT5FIEktPkkgSi0+RyBLLT5LIEwtPkEgTS0+TQorbWVyZ2VkIEUgaW50byBHCitBLT5BIEItPkcgQy0+RiBELT5HIEUtPkcgRi0+RiBHLT5HIEgtPkcgSS0+SSBKLT5HIEstPksgTC0+QSBNLT5NCittZXJnZWQgTSBpbnRvIEcKK0EtPkEgQi0+RyBDLT5GIEQtPkcgRS0+RyBGLT5GIEctPkcgSC0+RyBJLT5JIEotPkcgSy0+SyBMLT5BIE0tPkcKK21lcmdlZCBJIGludG8gSworQS0+QSBCLT5HIEMtPkYgRC0+RyBFLT5HIEYtPkYgRy0+RyBILT5HIEktPksgSi0+RyBLLT5LIEwtPkEgTS0+RworbWVyZ2VkIEsgaW50byBBCitBLT5BIEItPkcgQy0+RiBELT5HIEUtPkcgRi0+RiBHLT5HIEgtPkcgSS0+QSBKLT5HIEstPkEgTC0+QSBNLT5HCittZXJnZWQgRiBpbnRvIEEKK0EtPkEgQi0+RyBDLT5BIEQtPkcgRS0+RyBGLT5BIEctPkcgSC0+RyBJLT5BIEotPkcgSy0+QSBMLT5BIE0tPkcKK21lcmdlZCBBIGludG8gRworQS0+RyBCLT5HIEMtPkcgRC0+RyBFLT5HIEYtPkcgRy0+RyBILT5HIEktPkcgSi0+RyBLLT5HIEwtPkcgTS0+RworCisiIiIKKyMgRW1hY3MgdHVyZCAnCisKKyMgRnVuIHRlc3RzIChmb3Igc3VmZmljaWVudGx5IHdhcnBlZCBub3Rpb25zIG9mICJmdW4iKS4KKworZnVuX3Rlc3RzID0gIiIiCisKK0J1aWxkIHVwIHRvIGEgcmVjdXJzaXZlIFNpZXZlIG9mIEVyYXRvc3RoZW5lcyBnZW5lcmF0b3IuCisKKz4+PiBkZWYgZmlyc3RuKGcsIG4pOgorLi4uICAgICByZXR1cm4gW2cubmV4dCgpIGZvciBpIGluIHJhbmdlKG4pXQorCis+Pj4gZGVmIGludHNmcm9tKGkpOgorLi4uICAgICB3aGlsZSAxOgorLi4uICAgICAgICAgeWllbGQgaQorLi4uICAgICAgICAgaSArPSAxCisKKz4+PiBmaXJzdG4oaW50c2Zyb20oNSksIDcpCitbNSwgNiwgNywgOCwgOSwgMTAsIDExXQorCis+Pj4gZGVmIGV4Y2x1ZGVfbXVsdGlwbGVzKG4sIGludHMpOgorLi4uICAgICBmb3IgaSBpbiBpbnRzOgorLi4uICAgICAgICAgaWYgaSAlIG46CisuLi4gICAgICAgICAgICAgeWllbGQgaQorCis+Pj4gZmlyc3RuKGV4Y2x1ZGVfbXVsdGlwbGVzKDMsIGludHNmcm9tKDEpKSwgNikKK1sxLCAyLCA0LCA1LCA3LCA4XQorCis+Pj4gZGVmIHNpZXZlKGludHMpOgorLi4uICAgICBwcmltZSA9IGludHMubmV4dCgpCisuLi4gICAgIHlpZWxkIHByaW1lCisuLi4gICAgIG5vdF9kaXZpc2libGVfYnlfcHJpbWUgPSBleGNsdWRlX211bHRpcGxlcyhwcmltZSwgaW50cykKKy4uLiAgICAgZm9yIHAgaW4gc2lldmUobm90X2RpdmlzaWJsZV9ieV9wcmltZSk6CisuLi4gICAgICAgICB5aWVsZCBwCisKKz4+PiBwcmltZXMgPSBzaWV2ZShpbnRzZnJvbSgyKSkKKz4+PiBmaXJzdG4ocHJpbWVzLCAyMCkKK1syLCAzLCA1LCA3LCAxMSwgMTMsIDE3LCAxOSwgMjMsIDI5LCAzMSwgMzcsIDQxLCA0MywgNDcsIDUzLCA1OSwgNjEsIDY3LCA3MV0KKworCitBbm90aGVyIGZhbW91cyBwcm9ibGVtOiAgZ2VuZXJhdGUgYWxsIGludGVnZXJzIG9mIHRoZSBmb3JtCisgICAgMioqaSAqIDMqKmogICogNSoqaworaW4gaW5jcmVhc2luZyBvcmRlciwgd2hlcmUgaSxqLGsgPj0gMC4gIFRyaWNraWVyIHRoYW4gaXQgbWF5IGxvb2sgYXQgZmlyc3QhCitUcnkgd3JpdGluZyBpdCB3aXRob3V0IGdlbmVyYXRvcnMsIGFuZCBjb3JyZWN0bHksIGFuZCB3aXRob3V0IGdlbmVyYXRpbmcKKzMgaW50ZXJuYWwgcmVzdWx0cyBmb3IgZWFjaCByZXN1bHQgb3V0cHV0LgorCis+Pj4gZGVmIHRpbWVzKG4sIGcpOgorLi4uICAgICBmb3IgaSBpbiBnOgorLi4uICAgICAgICAgeWllbGQgbiAqIGkKKz4+PiBmaXJzdG4odGltZXMoMTAsIGludHNmcm9tKDEpKSwgMTApCitbMTAsIDIwLCAzMCwgNDAsIDUwLCA2MCwgNzAsIDgwLCA5MCwgMTAwXQorCis+Pj4gZGVmIG1lcmdlKGcsIGgpOgorLi4uICAgICBuZyA9IGcubmV4dCgpCisuLi4gICAgIG5oID0gaC5uZXh0KCkKKy4uLiAgICAgd2hpbGUgMToKKy4uLiAgICAgICAgIGlmIG5nIDwgbmg6CisuLi4gICAgICAgICAgICAgeWllbGQgbmcKKy4uLiAgICAgICAgICAgICBuZyA9IGcubmV4dCgpCisuLi4gICAgICAgICBlbGlmIG5nID4gbmg6CisuLi4gICAgICAgICAgICAgeWllbGQgbmgKKy4uLiAgICAgICAgICAgICBuaCA9IGgubmV4dCgpCisuLi4gICAgICAgICBlbHNlOgorLi4uICAgICAgICAgICAgIHlpZWxkIG5nCisuLi4gICAgICAgICAgICAgbmcgPSBnLm5leHQoKQorLi4uICAgICAgICAgICAgIG5oID0gaC5uZXh0KCkKKworVGhlIGZvbGxvd2luZyB3b3JrcywgYnV0IGlzIGRvaW5nIGEgd2hhbGUgb2YgYSBsb3Qgb2YgcmVkdW5kYW50IHdvcmsgLS0KK2l0J3Mgbm90IGNsZWFyIGhvdyB0byBnZXQgdGhlIGludGVybmFsIHVzZXMgb2YgbTIzNSB0byBzaGFyZSBhIHNpbmdsZQorZ2VuZXJhdG9yLiAgTm90ZSB0aGF0IG1lX3RpbWVzMiAoZXRjKSBlYWNoIG5lZWQgdG8gc2VlIGV2ZXJ5IGVsZW1lbnQgaW4gdGhlCityZXN1bHQgc2VxdWVuY2UuICBTbyB0aGlzIGlzIGFuIGV4YW1wbGUgd2hlcmUgbGF6eSBsaXN0cyBhcmUgbW9yZSBuYXR1cmFsCisoeW91IGNhbiBsb29rIGF0IHRoZSBoZWFkIG9mIGEgbGF6eSBsaXN0IGFueSBudW1iZXIgb2YgdGltZXMpLgorCis+Pj4gZGVmIG0yMzUoKToKKy4uLiAgICAgeWllbGQgMQorLi4uICAgICBtZV90aW1lczIgPSB0aW1lcygyLCBtMjM1KCkpCisuLi4gICAgIG1lX3RpbWVzMyA9IHRpbWVzKDMsIG0yMzUoKSkKKy4uLiAgICAgbWVfdGltZXM1ID0gdGltZXMoNSwgbTIzNSgpKQorLi4uICAgICBmb3IgaSBpbiBtZXJnZShtZXJnZShtZV90aW1lczIsCisuLi4gICAgICAgICAgICAgICAgICAgICAgICAgIG1lX3RpbWVzMyksCisuLi4gICAgICAgICAgICAgICAgICAgIG1lX3RpbWVzNSk6CisuLi4gICAgICAgICB5aWVsZCBpCisKK0Rvbid0IHByaW50ICJ0b28gbWFueSIgb2YgdGhlc2UgLS0gdGhlIGltcGxlbWVudGF0aW9uIGFib3ZlIGlzIGV4dHJlbWVseQoraW5lZmZpY2llbnQ6ICBlYWNoIGNhbGwgb2YgbTIzNSgpIGxlYWRzIHRvIDMgcmVjdXJzaXZlIGNhbGxzLCBhbmQgaW4KK3R1cm4gZWFjaCBvZiB0aG9zZSAzIG1vcmUsIGFuZCBzbyBvbiwgYW5kIHNvIG9uLCB1bnRpbCB3ZSd2ZSBkZXNjZW5kZWQKK2Vub3VnaCBsZXZlbHMgdG8gc2F0aXNmeSB0aGUgcHJpbnQgc3RtdHMuICBWZXJ5IG9kZDogIHdoZW4gSSBwcmludGVkIDUKK2xpbmVzIG9mIHJlc3VsdHMgYmVsb3csIHRoaXMgbWFuYWdlZCB0byBzY3JldyB1cCBXaW45OCdzIG1hbGxvYyBpbiAidGhlCit1c3VhbCIgd2F5LCBpLmUuIHRoZSBoZWFwIGdyZXcgb3ZlciA0TWIgc28gV2luOTggc3RhcnRlZCBmcmFnbWVudGluZworYWRkcmVzcyBzcGFjZSwgYW5kIGl0ICpsb29rZWQqIGxpa2UgYSB2ZXJ5IHNsb3cgbGVhay4KKworPj4+IHJlc3VsdCA9IG0yMzUoKQorPj4+IGZvciBpIGluIHJhbmdlKDMpOgorLi4uICAgICBwcmludCBmaXJzdG4ocmVzdWx0LCAxNSkKK1sxLCAyLCAzLCA0LCA1LCA2LCA4LCA5LCAxMCwgMTIsIDE1LCAxNiwgMTgsIDIwLCAyNF0KK1syNSwgMjcsIDMwLCAzMiwgMzYsIDQwLCA0NSwgNDgsIDUwLCA1NCwgNjAsIDY0LCA3MiwgNzUsIDgwXQorWzgxLCA5MCwgOTYsIDEwMCwgMTA4LCAxMjAsIDEyNSwgMTI4LCAxMzUsIDE0NCwgMTUwLCAxNjAsIDE2MiwgMTgwLCAxOTJdCisKK0hlaC4gIEhlcmUncyBvbmUgd2F5IHRvIGdldCBhIHNoYXJlZCBsaXN0LCBjb21wbGV0ZSB3aXRoIGFuIGV4Y3J1Y2lhdGluZworbmFtZXNwYWNlIHJlbmFtaW5nIHRyaWNrLiAgVGhlICpwcmV0dHkqIHBhcnQgaXMgdGhhdCB0aGUgdGltZXMoKSBhbmQgbWVyZ2UoKQorZnVuY3Rpb25zIGNhbiBiZSByZXVzZWQgYXMtaXMsIGJlY2F1c2UgdGhleSBvbmx5IGFzc3VtZSB0aGVpciBzdHJlYW0KK2FyZ3VtZW50cyBhcmUgaXRlcmFibGUgLS0gYSBMYXp5TGlzdCBpcyB0aGUgc2FtZSBhcyBhIGdlbmVyYXRvciB0byB0aW1lcygpLgorCis+Pj4gY2xhc3MgTGF6eUxpc3Q6CisuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnKToKKy4uLiAgICAgICAgIHNlbGYuc29mYXIgPSBbXQorLi4uICAgICAgICAgc2VsZi5mZXRjaCA9IGcubmV4dAorLi4uCisuLi4gICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKy4uLiAgICAgICAgIHNvZmFyLCBmZXRjaCA9IHNlbGYuc29mYXIsIHNlbGYuZmV0Y2gKKy4uLiAgICAgICAgIHdoaWxlIGkgPj0gbGVuKHNvZmFyKToKKy4uLiAgICAgICAgICAgICBzb2Zhci5hcHBlbmQoZmV0Y2goKSkKKy4uLiAgICAgICAgIHJldHVybiBzb2ZhcltpXQorCis+Pj4gZGVmIG0yMzUoKToKKy4uLiAgICAgeWllbGQgMQorLi4uICAgICAjIEdhY2s6ICBtMjM1IGJlbG93IGFjdHVhbGx5IHJlZmVycyB0byBhIExhenlMaXN0LgorLi4uICAgICBtZV90aW1lczIgPSB0aW1lcygyLCBtMjM1KQorLi4uICAgICBtZV90aW1lczMgPSB0aW1lcygzLCBtMjM1KQorLi4uICAgICBtZV90aW1lczUgPSB0aW1lcyg1LCBtMjM1KQorLi4uICAgICBmb3IgaSBpbiBtZXJnZShtZXJnZShtZV90aW1lczIsCisuLi4gICAgICAgICAgICAgICAgICAgICAgICAgIG1lX3RpbWVzMyksCisuLi4gICAgICAgICAgICAgICAgICAgIG1lX3RpbWVzNSk6CisuLi4gICAgICAgICB5aWVsZCBpCisKK1ByaW50IGFzIG1hbnkgb2YgdGhlc2UgYXMgeW91IGxpa2UgLS0gKnRoaXMqIGltcGxlbWVudGF0aW9uIGlzIG1lbW9yeS0KK2VmZmljaWVudC4KKworPj4+IG0yMzUgPSBMYXp5TGlzdChtMjM1KCkpCis+Pj4gZm9yIGkgaW4gcmFuZ2UoNSk6CisuLi4gICAgIHByaW50IFttMjM1W2pdIGZvciBqIGluIHJhbmdlKDE1KmksIDE1KihpKzEpKV0KK1sxLCAyLCAzLCA0LCA1LCA2LCA4LCA5LCAxMCwgMTIsIDE1LCAxNiwgMTgsIDIwLCAyNF0KK1syNSwgMjcsIDMwLCAzMiwgMzYsIDQwLCA0NSwgNDgsIDUwLCA1NCwgNjAsIDY0LCA3MiwgNzUsIDgwXQorWzgxLCA5MCwgOTYsIDEwMCwgMTA4LCAxMjAsIDEyNSwgMTI4LCAxMzUsIDE0NCwgMTUwLCAxNjAsIDE2MiwgMTgwLCAxOTJdCitbMjAwLCAyMTYsIDIyNSwgMjQwLCAyNDMsIDI1MCwgMjU2LCAyNzAsIDI4OCwgMzAwLCAzMjAsIDMyNCwgMzYwLCAzNzUsIDM4NF0KK1s0MDAsIDQwNSwgNDMyLCA0NTAsIDQ4MCwgNDg2LCA1MDAsIDUxMiwgNTQwLCA1NzYsIDYwMCwgNjI1LCA2NDAsIDY0OCwgNjc1XQorCitZZSBvbGRlIEZpYm9uYWNjaSBnZW5lcmF0b3IsIExhenlMaXN0IHN0eWxlLgorCis+Pj4gZGVmIGZpYmdlbihhLCBiKToKKy4uLgorLi4uICAgICBkZWYgc3VtKGcsIGgpOgorLi4uICAgICAgICAgd2hpbGUgMToKKy4uLiAgICAgICAgICAgICB5aWVsZCBnLm5leHQoKSArIGgubmV4dCgpCisuLi4KKy4uLiAgICAgZGVmIHRhaWwoZyk6CisuLi4gICAgICAgICBnLm5leHQoKSAgICAjIHRocm93IGZpcnN0IGF3YXkKKy4uLiAgICAgICAgIGZvciB4IGluIGc6CisuLi4gICAgICAgICAgICAgeWllbGQgeAorLi4uCisuLi4gICAgIHlpZWxkIGEKKy4uLiAgICAgeWllbGQgYgorLi4uICAgICBmb3IgcyBpbiBzdW0oaXRlcihmaWIpLAorLi4uICAgICAgICAgICAgICAgICAgdGFpbChpdGVyKGZpYikpKToKKy4uLiAgICAgICAgIHlpZWxkIHMKKworPj4+IGZpYiA9IExhenlMaXN0KGZpYmdlbigxLCAyKSkKKz4+PiBmaXJzdG4oaXRlcihmaWIpLCAxNykKK1sxLCAyLCAzLCA1LCA4LCAxMywgMjEsIDM0LCA1NSwgODksIDE0NCwgMjMzLCAzNzcsIDYxMCwgOTg3LCAxNTk3LCAyNTg0XQorCisKK1J1bm5pbmcgYWZ0ZXIgeW91ciB0YWlsIHdpdGggaXRlcnRvb2xzLnRlZSAobmV3IGluIHZlcnNpb24gMi40KQorCitUaGUgYWxnb3JpdGhtcyAibTIzNSIgKEhhbW1pbmcpIGFuZCBGaWJvbmFjY2kgcHJlc2VudGVkIGFib3ZlIGFyZSBib3RoCitleGFtcGxlcyBvZiBhIHdob2xlIGZhbWlseSBvZiBGUCAoZnVuY3Rpb25hbCBwcm9ncmFtbWluZykgYWxnb3JpdGhtcword2hlcmUgYSBmdW5jdGlvbiBwcm9kdWNlcyBhbmQgcmV0dXJucyBhIGxpc3Qgd2hpbGUgdGhlIHByb2R1Y3Rpb24gYWxnb3JpdGhtCitzdXBwb3NlIHRoZSBsaXN0IGFzIGFscmVhZHkgcHJvZHVjZWQgYnkgcmVjdXJzaXZlbHkgY2FsbGluZyBpdHNlbGYuCitGb3IgdGhlc2UgYWxnb3JpdGhtcyB0byB3b3JrLCB0aGV5IG11c3Q6CisKKy0gcHJvZHVjZSBhdCBsZWFzdCBhIGZpcnN0IGVsZW1lbnQgd2l0aG91dCBwcmVzdXBwb3NpbmcgdGhlIGV4aXN0ZW5jZSBvZgorICB0aGUgcmVzdCBvZiB0aGUgbGlzdAorLSBwcm9kdWNlIHRoZWlyIGVsZW1lbnRzIGluIGEgbGF6eSBtYW5uZXIKKworVG8gd29yayBlZmZpY2llbnRseSwgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCBtdXN0IG5vdCBiZSByZWNvbXB1dGVkIG92ZXIKK2FuZCBvdmVyIGFnYWluLiBUaGlzIGlzIGVuc3VyZWQgaW4gbW9zdCBGUCBsYW5ndWFnZXMgYXMgYSBidWlsdC1pbiBmZWF0dXJlLgorSW4gcHl0aG9uLCB3ZSBoYXZlIHRvIGV4cGxpY2l0bHkgbWFpbnRhaW4gYSBsaXN0IG9mIGFscmVhZHkgY29tcHV0ZWQgcmVzdWx0cworYW5kIGFiYW5kb24gZ2VudWluZSByZWN1cnNpdml0eS4KKworVGhpcyBpcyB3aGF0IGhhZCBiZWVuIGF0dGVtcHRlZCBhYm92ZSB3aXRoIHRoZSBMYXp5TGlzdCBjbGFzcy4gT25lIHByb2JsZW0KK3dpdGggdGhhdCBjbGFzcyBpcyB0aGF0IGl0IGtlZXBzIGEgbGlzdCBvZiBhbGwgb2YgdGhlIGdlbmVyYXRlZCByZXN1bHRzIGFuZAordGhlcmVmb3JlIGNvbnRpbnVhbGx5IGdyb3dzLiBUaGlzIHBhcnRpYWxseSBkZWZlYXRzIHRoZSBnb2FsIG9mIHRoZSBnZW5lcmF0b3IKK2NvbmNlcHQsIHZpei4gcHJvZHVjZSB0aGUgcmVzdWx0cyBvbmx5IGFzIG5lZWRlZCBpbnN0ZWFkIG9mIHByb2R1Y2luZyB0aGVtCithbGwgYW5kIHRoZXJlYnkgd2FzdGluZyBtZW1vcnkuCisKK1RoYW5rcyB0byBpdGVydG9vbHMudGVlLCBpdCBpcyBub3cgY2xlYXIgImhvdyB0byBnZXQgdGhlIGludGVybmFsIHVzZXMgb2YKK20yMzUgdG8gc2hhcmUgYSBzaW5nbGUgZ2VuZXJhdG9yIi4KKworPj4+IGZyb20gaXRlcnRvb2xzIGltcG9ydCB0ZWUKKz4+PiBkZWYgbTIzNSgpOgorLi4uICAgICBkZWYgX20yMzUoKToKKy4uLiAgICAgICAgIHlpZWxkIDEKKy4uLiAgICAgICAgIGZvciBuIGluIG1lcmdlKHRpbWVzKDIsIG0yKSwKKy4uLiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlKHRpbWVzKDMsIG0zKSwKKy4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzKDUsIG01KSkpOgorLi4uICAgICAgICAgICAgIHlpZWxkIG4KKy4uLiAgICAgbTEgPSBfbTIzNSgpCisuLi4gICAgIG0yLCBtMywgbTUsIG1SZXMgPSB0ZWUobTEsIDQpCisuLi4gICAgIHJldHVybiBtUmVzCisKKz4+PiBpdCA9IG0yMzUoKQorPj4+IGZvciBpIGluIHJhbmdlKDUpOgorLi4uICAgICBwcmludCBmaXJzdG4oaXQsIDE1KQorWzEsIDIsIDMsIDQsIDUsIDYsIDgsIDksIDEwLCAxMiwgMTUsIDE2LCAxOCwgMjAsIDI0XQorWzI1LCAyNywgMzAsIDMyLCAzNiwgNDAsIDQ1LCA0OCwgNTAsIDU0LCA2MCwgNjQsIDcyLCA3NSwgODBdCitbODEsIDkwLCA5NiwgMTAwLCAxMDgsIDEyMCwgMTI1LCAxMjgsIDEzNSwgMTQ0LCAxNTAsIDE2MCwgMTYyLCAxODAsIDE5Ml0KK1syMDAsIDIxNiwgMjI1LCAyNDAsIDI0MywgMjUwLCAyNTYsIDI3MCwgMjg4LCAzMDAsIDMyMCwgMzI0LCAzNjAsIDM3NSwgMzg0XQorWzQwMCwgNDA1LCA0MzIsIDQ1MCwgNDgwLCA0ODYsIDUwMCwgNTEyLCA1NDAsIDU3NiwgNjAwLCA2MjUsIDY0MCwgNjQ4LCA2NzVdCisKK1RoZSAidGVlIiBmdW5jdGlvbiBkb2VzIGp1c3Qgd2hhdCB3ZSB3YW50LiBJdCBpbnRlcm5hbGx5IGtlZXBzIGEgZ2VuZXJhdGVkCityZXN1bHQgZm9yIGFzIGxvbmcgYXMgaXQgaGFzIG5vdCBiZWVuICJjb25zdW1lZCIgZnJvbSBhbGwgb2YgdGhlIGR1cGxpY2F0ZWQKK2l0ZXJhdG9ycywgd2hlcmV1cG9uIGl0IGlzIGRlbGV0ZWQuIFlvdSBjYW4gdGhlcmVmb3JlIHByaW50IHRoZSBoYW1taW5nCitzZXF1ZW5jZSBkdXJpbmcgaG91cnMgd2l0aG91dCBpbmNyZWFzaW5nIG1lbW9yeSB1c2FnZSwgb3IgdmVyeSBsaXR0bGUuCisKK1RoZSBiZWF1dHkgb2YgaXQgaXMgdGhhdCByZWN1cnNpdmUgcnVubmluZy1hZnRlci10aGVpci10YWlsIEZQIGFsZ29yaXRobXMKK2FyZSBxdWl0ZSBzdHJhaWdodGZvcndhcmRseSBleHByZXNzZWQgd2l0aCB0aGlzIFB5dGhvbiBpZGlvbS4KKworWWUgb2xkZSBGaWJvbmFjY2kgZ2VuZXJhdG9yLCB0ZWUgc3R5bGUuCisKKz4+PiBkZWYgZmliKCk6CisuLi4KKy4uLiAgICAgZGVmIF9pc3VtKGcsIGgpOgorLi4uICAgICAgICAgd2hpbGUgMToKKy4uLiAgICAgICAgICAgICB5aWVsZCBnLm5leHQoKSArIGgubmV4dCgpCisuLi4KKy4uLiAgICAgZGVmIF9maWIoKToKKy4uLiAgICAgICAgIHlpZWxkIDEKKy4uLiAgICAgICAgIHlpZWxkIDIKKy4uLiAgICAgICAgIGZpYlRhaWwubmV4dCgpICMgdGhyb3cgZmlyc3QgYXdheQorLi4uICAgICAgICAgZm9yIHJlcyBpbiBfaXN1bShmaWJIZWFkLCBmaWJUYWlsKToKKy4uLiAgICAgICAgICAgICB5aWVsZCByZXMKKy4uLgorLi4uICAgICByZWFsZmliID0gX2ZpYigpCisuLi4gICAgIGZpYkhlYWQsIGZpYlRhaWwsIGZpYlJlcyA9IHRlZShyZWFsZmliLCAzKQorLi4uICAgICByZXR1cm4gZmliUmVzCisKKz4+PiBmaXJzdG4oZmliKCksIDE3KQorWzEsIDIsIDMsIDUsIDgsIDEzLCAyMSwgMzQsIDU1LCA4OSwgMTQ0LCAyMzMsIDM3NywgNjEwLCA5ODcsIDE1OTcsIDI1ODRdCisKKyIiIgorCisjIHN5bnRheF90ZXN0cyBtb3N0bHkgcHJvdm9rZXMgU3ludGF4RXJyb3JzLiAgQWxzbyBmaWRkbGluZyB3aXRoICNpZiAwCisjIGhhY2tlcnkuCisKK3N5bnRheF90ZXN0cyA9ICIiIgorCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgcmV0dXJuIDIyCisuLi4gICAgIHlpZWxkIDEKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4KK1N5bnRheEVycm9yOiAncmV0dXJuJyB3aXRoIGFyZ3VtZW50IGluc2lkZSBnZW5lcmF0b3IgKDxkb2N0ZXN0IHRlc3QudGVzdF9nZW5lcmF0b3JzLl9fdGVzdF9fLnN5bnRheFswXT4sIGxpbmUgMykKKworPj4+IGRlZiBmKCk6CisuLi4gICAgIHlpZWxkIDEKKy4uLiAgICAgcmV0dXJuIDIyCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uCitTeW50YXhFcnJvcjogJ3JldHVybicgd2l0aCBhcmd1bWVudCBpbnNpZGUgZ2VuZXJhdG9yICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5zeW50YXhbMV0+LCBsaW5lIDMpCisKKyJyZXR1cm4gTm9uZSIgaXMgbm90IHRoZSBzYW1lIGFzICJyZXR1cm4iIGluIGEgZ2VuZXJhdG9yOgorCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgeWllbGQgMQorLi4uICAgICByZXR1cm4gTm9uZQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAuLgorU3ludGF4RXJyb3I6ICdyZXR1cm4nIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvciAoPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmVyYXRvcnMuX190ZXN0X18uc3ludGF4WzJdPiwgbGluZSAzKQorCitUaGVzZSBhcmUgZmluZToKKworPj4+IGRlZiBmKCk6CisuLi4gICAgIHlpZWxkIDEKKy4uLiAgICAgcmV0dXJuCisKKz4+PiBkZWYgZigpOgorLi4uICAgICB0cnk6CisuLi4gICAgICAgICB5aWVsZCAxCisuLi4gICAgIGZpbmFsbHk6CisuLi4gICAgICAgICBwYXNzCisKKz4+PiBkZWYgZigpOgorLi4uICAgICB0cnk6CisuLi4gICAgICAgICB0cnk6CisuLi4gICAgICAgICAgICAgMS8vMAorLi4uICAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorLi4uICAgICAgICAgICAgIHlpZWxkIDY2NgorLi4uICAgICAgICAgZXhjZXB0OgorLi4uICAgICAgICAgICAgIHBhc3MKKy4uLiAgICAgZmluYWxseToKKy4uLiAgICAgICAgIHBhc3MKKworPj4+IGRlZiBmKCk6CisuLi4gICAgIHRyeToKKy4uLiAgICAgICAgIHRyeToKKy4uLiAgICAgICAgICAgICB5aWVsZCAxMgorLi4uICAgICAgICAgICAgIDEvLzAKKy4uLiAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKy4uLiAgICAgICAgICAgICB5aWVsZCA2NjYKKy4uLiAgICAgICAgIGV4Y2VwdDoKKy4uLiAgICAgICAgICAgICB0cnk6CisuLi4gICAgICAgICAgICAgICAgIHggPSAxMgorLi4uICAgICAgICAgICAgIGZpbmFsbHk6CisuLi4gICAgICAgICAgICAgICAgIHlpZWxkIDEyCisuLi4gICAgIGV4Y2VwdDoKKy4uLiAgICAgICAgIHJldHVybgorPj4+IGxpc3QoZigpKQorWzEyLCA2NjZdCisKKz4+PiBkZWYgZigpOgorLi4uICAgIHlpZWxkCis+Pj4gdHlwZShmKCkpCis8dHlwZSAnZ2VuZXJhdG9yJz4KKworCis+Pj4gZGVmIGYoKToKKy4uLiAgICBpZiAwOgorLi4uICAgICAgICB5aWVsZAorPj4+IHR5cGUoZigpKQorPHR5cGUgJ2dlbmVyYXRvcic+CisKKworPj4+IGRlZiBmKCk6CisuLi4gICAgIGlmIDA6CisuLi4gICAgICAgICB5aWVsZCAxCis+Pj4gdHlwZShmKCkpCis8dHlwZSAnZ2VuZXJhdG9yJz4KKworPj4+IGRlZiBmKCk6CisuLi4gICAgaWYgIiI6CisuLi4gICAgICAgIHlpZWxkIE5vbmUKKz4+PiB0eXBlKGYoKSkKKzx0eXBlICdnZW5lcmF0b3InPgorCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgcmV0dXJuCisuLi4gICAgIHRyeToKKy4uLiAgICAgICAgIGlmIHg9PTQ6CisuLi4gICAgICAgICAgICAgcGFzcworLi4uICAgICAgICAgZWxpZiAwOgorLi4uICAgICAgICAgICAgIHRyeToKKy4uLiAgICAgICAgICAgICAgICAgMS8vMAorLi4uICAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKy4uLiAgICAgICAgICAgICAgICAgcGFzcworLi4uICAgICAgICAgICAgIGVsc2U6CisuLi4gICAgICAgICAgICAgICAgIGlmIDA6CisuLi4gICAgICAgICAgICAgICAgICAgICB3aGlsZSAxMjoKKy4uLiAgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IDEKKy4uLiAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCAyICMgZG9uJ3QgYmxpbmsKKy4uLiAgICAgICAgICAgICAgICAgICAgICAgICBmKGEsIGIsIGMsIGQsIGUpCisuLi4gICAgICAgICBlbHNlOgorLi4uICAgICAgICAgICAgIHBhc3MKKy4uLiAgICAgZXhjZXB0OgorLi4uICAgICAgICAgeCA9IDEKKy4uLiAgICAgcmV0dXJuCis+Pj4gdHlwZShmKCkpCis8dHlwZSAnZ2VuZXJhdG9yJz4KKworPj4+IGRlZiBmKCk6CisuLi4gICAgIGlmIDA6CisuLi4gICAgICAgICBkZWYgZygpOgorLi4uICAgICAgICAgICAgIHlpZWxkIDEKKy4uLgorPj4+IHR5cGUoZigpKQorPHR5cGUgJ05vbmVUeXBlJz4KKworPj4+IGRlZiBmKCk6CisuLi4gICAgIGlmIDA6CisuLi4gICAgICAgICBjbGFzcyBDOgorLi4uICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKy4uLiAgICAgICAgICAgICAgICAgeWllbGQgMQorLi4uICAgICAgICAgICAgIGRlZiBmKHNlbGYpOgorLi4uICAgICAgICAgICAgICAgICB5aWVsZCAyCis+Pj4gdHlwZShmKCkpCis8dHlwZSAnTm9uZVR5cGUnPgorCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgaWYgMDoKKy4uLiAgICAgICAgIHJldHVybgorLi4uICAgICBpZiAwOgorLi4uICAgICAgICAgeWllbGQgMgorPj4+IHR5cGUoZigpKQorPHR5cGUgJ2dlbmVyYXRvcic+CisKKworPj4+IGRlZiBmKCk6CisuLi4gICAgIGlmIDA6CisuLi4gICAgICAgICBsYW1iZGEgeDogIHggICAgICAgICMgc2hvdWxkbid0IHRyaWdnZXIgaGVyZQorLi4uICAgICAgICAgcmV0dXJuICAgICAgICAgICAgICAjIG9yIGhlcmUKKy4uLiAgICAgICAgIGRlZiBmKGkpOgorLi4uICAgICAgICAgICAgIHJldHVybiAyKmkgICAgICAjIG9yIGhlcmUKKy4uLiAgICAgICAgIGlmIDA6CisuLi4gICAgICAgICAgICAgcmV0dXJuIDMgICAgICAgICMgYnV0ICp0aGlzKiBzdWNrcyAobGluZSA4KQorLi4uICAgICBpZiAwOgorLi4uICAgICAgICAgeWllbGQgMiAgICAgICAgICAgICAjIGJlY2F1c2UgaXQncyBhIGdlbmVyYXRvciAobGluZSAxMCkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKK1N5bnRheEVycm9yOiAncmV0dXJuJyB3aXRoIGFyZ3VtZW50IGluc2lkZSBnZW5lcmF0b3IgKDxkb2N0ZXN0IHRlc3QudGVzdF9nZW5lcmF0b3JzLl9fdGVzdF9fLnN5bnRheFsyNF0+LCBsaW5lIDEwKQorCitUaGlzIG9uZSBjYXVzZWQgYSBjcmFzaCAoc2VlIFNGIGJ1ZyA1Njc1MzgpOgorCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisuLi4gICAgICAgICB0cnk6CisuLi4gICAgICAgICAgICAgY29udGludWUKKy4uLiAgICAgICAgIGZpbmFsbHk6CisuLi4gICAgICAgICAgICAgeWllbGQgaQorLi4uCis+Pj4gZyA9IGYoKQorPj4+IHByaW50IGcubmV4dCgpCiswCis+Pj4gcHJpbnQgZy5uZXh0KCkKKzEKKz4+PiBwcmludCBnLm5leHQoKQorMgorPj4+IHByaW50IGcubmV4dCgpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CitTdG9wSXRlcmF0aW9uCisKKworVGVzdCB0aGUgZ2lfY29kZSBhdHRyaWJ1dGUKKworPj4+IGRlZiBmKCk6CisuLi4gICAgIHlpZWxkIDUKKy4uLgorPj4+IGcgPSBmKCkKKz4+PiBnLmdpX2NvZGUgaXMgZi5mdW5jX2NvZGUKK1RydWUKKz4+PiBnLm5leHQoKQorNQorPj4+IGcubmV4dCgpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CitTdG9wSXRlcmF0aW9uCis+Pj4gZy5naV9jb2RlIGlzIGYuZnVuY19jb2RlCitUcnVlCisKKworVGVzdCB0aGUgX19uYW1lX18gYXR0cmlidXRlIGFuZCB0aGUgcmVwcigpCisKKz4+PiBkZWYgZigpOgorLi4uICAgIHlpZWxkIDUKKy4uLgorPj4+IGcgPSBmKCkKKz4+PiBnLl9fbmFtZV9fCisnZicKKz4+PiByZXByKGcpICAjIGRvY3Rlc3Q6ICtFTExJUFNJUworJzxnZW5lcmF0b3Igb2JqZWN0IGYgYXQgLi4uPicKKworTGFtYmRhcyBzaG91bGRuJ3QgaGF2ZSB0aGVpciB1c3VhbCByZXR1cm4gYmVoYXZpb3IuCisKKz4+PiB4ID0gbGFtYmRhOiAoeWllbGQgMSkKKz4+PiBsaXN0KHgoKSkKK1sxXQorCis+Pj4geCA9IGxhbWJkYTogKCh5aWVsZCAxKSwgKHlpZWxkIDIpKQorPj4+IGxpc3QoeCgpKQorWzEsIDJdCisiIiIKKworIyBjb25qb2luIGlzIGEgc2ltcGxlIGJhY2t0cmFja2luZyBnZW5lcmF0b3IsIG5hbWVkIGluIGhvbm9yIG9mIEljb24ncworIyAiY29uanVuY3Rpb24iIGNvbnRyb2wgc3RydWN0dXJlLiAgUGFzcyBhIGxpc3Qgb2Ygbm8tYXJndW1lbnQgZnVuY3Rpb25zCisjIHRoYXQgcmV0dXJuIGl0ZXJhYmxlIG9iamVjdHMuICBFYXNpZXN0IHRvIGV4cGxhaW4gYnkgZXhhbXBsZTogIGFzc3VtZSB0aGUKKyMgZnVuY3Rpb24gbGlzdCBbeCwgeSwgel0gaXMgcGFzc2VkLiAgVGhlbiBjb25qb2luIGFjdHMgbGlrZToKKyMKKyMgZGVmIGcoKToKKyMgICAgIHZhbHVlcyA9IFtOb25lXSAqIDMKKyMgICAgIGZvciB2YWx1ZXNbMF0gaW4geCgpOgorIyAgICAgICAgIGZvciB2YWx1ZXNbMV0gaW4geSgpOgorIyAgICAgICAgICAgICBmb3IgdmFsdWVzWzJdIGluIHooKToKKyMgICAgICAgICAgICAgICAgIHlpZWxkIHZhbHVlcworIworIyBTbyBzb21lIDMtbGlzdHMgb2YgdmFsdWVzICptYXkqIGJlIGdlbmVyYXRlZCwgZWFjaCB0aW1lIHdlIHN1Y2Nlc3NmdWxseQorIyBnZXQgaW50byB0aGUgaW5uZXJtb3N0IGxvb3AuICBJZiBhbiBpdGVyYXRvciBmYWlscyAoaXMgZXhoYXVzdGVkKSBiZWZvcmUKKyMgdGhlbiwgaXQgImJhY2t0cmFja3MiIHRvIGdldCB0aGUgbmV4dCB2YWx1ZSBmcm9tIHRoZSBuZWFyZXN0IGVuY2xvc2luZworIyBpdGVyYXRvciAodGhlIG9uZSAidG8gdGhlIGxlZnQiKSwgYW5kIHN0YXJ0cyBhbGwgb3ZlciBhZ2FpbiBhdCB0aGUgbmV4dAorIyBzbG90IChwdW1wcyBhIGZyZXNoIGl0ZXJhdG9yKS4gIE9mIGNvdXJzZSB0aGlzIGlzIG1vc3QgdXNlZnVsIHdoZW4gdGhlCisjIGl0ZXJhdG9ycyBoYXZlIHNpZGUtZWZmZWN0cywgc28gdGhhdCB3aGljaCB2YWx1ZXMgKmNhbiogYmUgZ2VuZXJhdGVkIGF0CisjIGVhY2ggc2xvdCBkZXBlbmQgb24gdGhlIHZhbHVlcyBpdGVyYXRlZCBhdCBwcmV2aW91cyBzbG90cy4KKworZGVmIHNpbXBsZV9jb25qb2luKGdzKToKKworICAgIHZhbHVlcyA9IFtOb25lXSAqIGxlbihncykKKworICAgIGRlZiBnZW4oaSk6CisgICAgICAgIGlmIGkgPj0gbGVuKGdzKToKKyAgICAgICAgICAgIHlpZWxkIHZhbHVlcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIHZhbHVlc1tpXSBpbiBnc1tpXSgpOgorICAgICAgICAgICAgICAgIGZvciB4IGluIGdlbihpKzEpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCB4CisKKyAgICBmb3IgeCBpbiBnZW4oMCk6CisgICAgICAgIHlpZWxkIHgKKworIyBUaGF0IHdvcmtzIGZpbmUsIGJ1dCByZWN1cnNpbmcgYSBsZXZlbCBhbmQgY2hlY2tpbmcgaSBhZ2FpbnN0IGxlbihncykgZm9yCisjIGVhY2ggaXRlbSBwcm9kdWNlZCBpcyBpbmVmZmljaWVudC4gIEJ5IGRvaW5nIG1hbnVhbCBsb29wIHVucm9sbGluZyBhY3Jvc3MKKyMgZ2VuZXJhdG9yIGJvdW5kYXJpZXMsIGl0J3MgcG9zc2libGUgdG8gZWxpbWluYXRlIG1vc3Qgb2YgdGhhdCBvdmVyaGVhZC4KKyMgVGhpcyBpc24ndCB3b3J0aCB0aGUgYm90aGVyICppbiBnZW5lcmFsKiBmb3IgZ2VuZXJhdG9ycywgYnV0IGNvbmpvaW4oKSBpcworIyBhIGNvcmUgYnVpbGRpbmcgYmxvY2sgZm9yIHNvbWUgQ1BVLWludGVuc2l2ZSBnZW5lcmF0b3IgYXBwbGljYXRpb25zLgorCitkZWYgY29uam9pbihncyk6CisKKyAgICBuID0gbGVuKGdzKQorICAgIHZhbHVlcyA9IFtOb25lXSAqIG4KKworICAgICMgRG8gb25lIGxvb3AgbmVzdCBhdCB0aW1lIHJlY3Vyc2l2ZWx5LCB1bnRpbCB0aGUgIyBvZiBsb29wIG5lc3RzCisgICAgIyByZW1haW5pbmcgaXMgZGl2aXNpYmxlIGJ5IDMuCisKKyAgICBkZWYgZ2VuKGkpOgorICAgICAgICBpZiBpID49IG46CisgICAgICAgICAgICB5aWVsZCB2YWx1ZXMKKworICAgICAgICBlbGlmIChuLWkpICUgMzoKKyAgICAgICAgICAgIGlwMSA9IGkrMQorICAgICAgICAgICAgZm9yIHZhbHVlc1tpXSBpbiBnc1tpXSgpOgorICAgICAgICAgICAgICAgIGZvciB4IGluIGdlbihpcDEpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCB4CisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciB4IGluIF9nZW4zKGkpOgorICAgICAgICAgICAgICAgIHlpZWxkIHgKKworICAgICMgRG8gdGhyZWUgbG9vcCBuZXN0cyBhdCBhIHRpbWUsIHJlY3Vyc2luZyBvbmx5IGlmIGF0IGxlYXN0IHRocmVlIG1vcmUKKyAgICAjIHJlbWFpbi4gIERvbid0IGNhbGwgZGlyZWN0bHk6ICB0aGlzIGlzIGFuIGludGVybmFsIG9wdGltaXphdGlvbiBmb3IKKyAgICAjIGdlbidzIHVzZS4KKworICAgIGRlZiBfZ2VuMyhpKToKKyAgICAgICAgYXNzZXJ0IGkgPCBuIGFuZCAobi1pKSAlIDMgPT0gMAorICAgICAgICBpcDEsIGlwMiwgaXAzID0gaSsxLCBpKzIsIGkrMworICAgICAgICBnLCBnMSwgZzIgPSBnc1tpIDogaXAzXQorCisgICAgICAgIGlmIGlwMyA+PSBuOgorICAgICAgICAgICAgIyBUaGVzZSBhcmUgdGhlIGxhc3QgdGhyZWUsIHNvIHdlIGNhbiB5aWVsZCB2YWx1ZXMgZGlyZWN0bHkuCisgICAgICAgICAgICBmb3IgdmFsdWVzW2ldIGluIGcoKToKKyAgICAgICAgICAgICAgICBmb3IgdmFsdWVzW2lwMV0gaW4gZzEoKToKKyAgICAgICAgICAgICAgICAgICAgZm9yIHZhbHVlc1tpcDJdIGluIGcyKCk6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB2YWx1ZXMKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBBdCBsZWFzdCA2IGxvb3AgbmVzdHMgcmVtYWluOyBwZWVsIG9mZiAzIGFuZCByZWN1cnNlIGZvciB0aGUKKyAgICAgICAgICAgICMgcmVzdC4KKyAgICAgICAgICAgIGZvciB2YWx1ZXNbaV0gaW4gZygpOgorICAgICAgICAgICAgICAgIGZvciB2YWx1ZXNbaXAxXSBpbiBnMSgpOgorICAgICAgICAgICAgICAgICAgICBmb3IgdmFsdWVzW2lwMl0gaW4gZzIoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIF9nZW4zKGlwMyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgeAorCisgICAgZm9yIHggaW4gZ2VuKDApOgorICAgICAgICB5aWVsZCB4CisKKyMgQW5kIG9uZSBtb3JlIGFwcHJvYWNoOiAgRm9yIGJhY2t0cmFja2luZyBhcHBzIGxpa2UgdGhlIEtuaWdodCdzIFRvdXIKKyMgc29sdmVyIGJlbG93LCB0aGUgbnVtYmVyIG9mIGJhY2t0cmFja2luZyBsZXZlbHMgY2FuIGJlIGVub3Jtb3VzIChvbmUKKyMgbGV2ZWwgcGVyIHNxdWFyZSwgZm9yIHRoZSBLbmlnaHQncyBUb3VyLCBzbyB0aGF0IGUuZy4gYSAxMDB4MTAwIGJvYXJkCisjIG5lZWRzIDEwLDAwMCBsZXZlbHMpLiAgSW4gc3VjaCBjYXNlcyBQeXRob24gaXMgbGlrZWx5IHRvIHJ1biBvdXQgb2YKKyMgc3RhY2sgc3BhY2UgZHVlIHRvIHJlY3Vyc2lvbi4gIFNvIGhlcmUncyBhIHJlY3Vyc2lvbi1mcmVlIHZlcnNpb24gb2YKKyMgY29uam9pbiB0b28uCisjIE5PVEUgV0VMTDogIFRoaXMgYWxsb3dzIGxhcmdlIHByb2JsZW1zIHRvIGJlIHNvbHZlZCB3aXRoIG9ubHkgdHJpdmlhbAorIyBkZW1hbmRzIG9uIHN0YWNrIHNwYWNlLiAgV2l0aG91dCBleHBsaWNpdGx5IHJlc3VtYWJsZSBnZW5lcmF0b3JzLCB0aGlzIGlzCisjIG11Y2ggaGFyZGVyIHRvIGFjaGlldmUuICBPVE9ILCB0aGlzIGlzIG11Y2ggc2xvd2VyICh1cCB0byBhIGZhY3RvciBvZiAyKQorIyB0aGFuIHRoZSBmYW5jeSB1bnJvbGxlZCByZWN1cnNpdmUgY29uam9pbi4KKworZGVmIGZsYXRfY29uam9pbihncyk6ICAjIHJlbmFtZSB0byBjb25qb2luIHRvIHJ1biB0ZXN0cyB3aXRoIHRoaXMgaW5zdGVhZAorICAgIG4gPSBsZW4oZ3MpCisgICAgdmFsdWVzID0gW05vbmVdICogbgorICAgIGl0ZXJzICA9IFtOb25lXSAqIG4KKyAgICBfU3RvcEl0ZXJhdGlvbiA9IFN0b3BJdGVyYXRpb24gICMgbWFrZSBsb2NhbCBiZWNhdXNlIGNhdWdodCBhICpsb3QqCisgICAgaSA9IDAKKyAgICB3aGlsZSAxOgorICAgICAgICAjIERlc2NlbmQuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIGkgPCBuOgorICAgICAgICAgICAgICAgIGl0ID0gaXRlcnNbaV0gPSBnc1tpXSgpLm5leHQKKyAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBpdCgpCisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgIGV4Y2VwdCBfU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydCBpID09IG4KKyAgICAgICAgICAgIHlpZWxkIHZhbHVlcworCisgICAgICAgICMgQmFja3RyYWNrIHVudGlsIGFuIG9sZGVyIGl0ZXJhdG9yIGNhbiBiZSByZXN1bWVkLgorICAgICAgICBpIC09IDEKKyAgICAgICAgd2hpbGUgaSA+PSAwOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlc1tpXSA9IGl0ZXJzW2ldKCkKKyAgICAgICAgICAgICAgICAjIFN1Y2Nlc3MhICBTdGFydCBmcmVzaCBhdCBuZXh0IGxldmVsLgorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgX1N0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgIyBDb250aW51ZSBiYWNrdHJhY2tpbmcuCisgICAgICAgICAgICAgICAgaSAtPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnQgaSA8IDAKKyAgICAgICAgICAgIGJyZWFrCisKKyMgQSBjb25qb2luLWJhc2VkIE4tUXVlZW5zIHNvbHZlci4KKworY2xhc3MgUXVlZW5zOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuKToKKyAgICAgICAgc2VsZi5uID0gbgorICAgICAgICByYW5nZW4gPSByYW5nZShuKQorCisgICAgICAgICMgQXNzaWduIGEgdW5pcXVlIGludCB0byBlYWNoIGNvbHVtbiBhbmQgZGlhZ29uYWwuCisgICAgICAgICMgY29sdW1uczogIG4gb2YgdGhvc2UsIHJhbmdlKG4pLgorICAgICAgICAjIE5XLVNFIGRpYWdvbmFsczogMm4tMSBvZiB0aGVzZSwgaS1qIHVuaXF1ZSBhbmQgaW52YXJpYW50IGFsb25nCisgICAgICAgICMgZWFjaCwgc21hbGxlc3QgaS1qIGlzIDAtKG4tMSkgPSAxLW4sIHNvIGFkZCBuLTEgdG8gc2hpZnQgdG8gMC0KKyAgICAgICAgIyBiYXNlZC4KKyAgICAgICAgIyBORS1TVyBkaWFnb25hbHM6IDJuLTEgb2YgdGhlc2UsIGkraiB1bmlxdWUgYW5kIGludmFyaWFudCBhbG9uZworICAgICAgICAjIGVhY2gsIHNtYWxsZXN0IGkraiBpcyAwLCBsYXJnZXN0IGlzIDJuLTIuCisKKyAgICAgICAgIyBGb3IgZWFjaCBzcXVhcmUsIGNvbXB1dGUgYSBiaXQgdmVjdG9yIG9mIHRoZSBjb2x1bW5zIGFuZAorICAgICAgICAjIGRpYWdvbmFscyBpdCBjb3ZlcnMsIGFuZCBmb3IgZWFjaCByb3cgY29tcHV0ZSBhIGZ1bmN0aW9uIHRoYXQKKyAgICAgICAgIyBnZW5lcmF0ZXMgdGhlIHBvc3NpYmxpdGllcyBmb3IgdGhlIGNvbHVtbnMgaW4gdGhhdCByb3cuCisgICAgICAgIHNlbGYucm93Z2VuZXJhdG9ycyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlbjoKKyAgICAgICAgICAgIHJvd3VzZXMgPSBbKDFMIDw8IGopIHwgICAgICAgICAgICAgICAgICAjIGNvbHVtbiBvcmRpbmFsCisgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAobiArIGktaiArIG4tMSkpIHwgICAgIyBOVy1TRSBvcmRpbmFsCisgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAobiArIDIqbi0xICsgaStqKSkgICAgIyBORS1TVyBvcmRpbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2VuXQorCisgICAgICAgICAgICBkZWYgcm93Z2VuKHJvd3VzZXM9cm93dXNlcyk6CisgICAgICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2VuOgorICAgICAgICAgICAgICAgICAgICB1c2VzID0gcm93dXNlc1tqXQorICAgICAgICAgICAgICAgICAgICBpZiB1c2VzICYgc2VsZi51c2VkID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZWQgfD0gdXNlcworICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgagorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VkICY9IH51c2VzCisKKyAgICAgICAgICAgIHNlbGYucm93Z2VuZXJhdG9ycy5hcHBlbmQocm93Z2VuKQorCisgICAgIyBHZW5lcmF0ZSBzb2x1dGlvbnMuCisgICAgZGVmIHNvbHZlKHNlbGYpOgorICAgICAgICBzZWxmLnVzZWQgPSAwCisgICAgICAgIGZvciByb3cyY29sIGluIGNvbmpvaW4oc2VsZi5yb3dnZW5lcmF0b3JzKToKKyAgICAgICAgICAgIHlpZWxkIHJvdzJjb2wKKworICAgIGRlZiBwcmludHNvbHV0aW9uKHNlbGYsIHJvdzJjb2wpOgorICAgICAgICBuID0gc2VsZi5uCisgICAgICAgIGFzc2VydCBuID09IGxlbihyb3cyY29sKQorICAgICAgICBzZXAgPSAiKyIgKyAiLSsiICogbgorICAgICAgICBwcmludCBzZXAKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CisgICAgICAgICAgICBzcXVhcmVzID0gWyIgIiBmb3IgaiBpbiByYW5nZShuKV0KKyAgICAgICAgICAgIHNxdWFyZXNbcm93MmNvbFtpXV0gPSAiUSIKKyAgICAgICAgICAgIHByaW50ICJ8IiArICJ8Ii5qb2luKHNxdWFyZXMpICsgInwiCisgICAgICAgICAgICBwcmludCBzZXAKKworIyBBIGNvbmpvaW4tYmFzZWQgS25pZ2h0J3MgVG91ciBzb2x2ZXIuICBUaGlzIGlzIHByZXR0eSBzb3BoaXN0aWNhdGVkCisjIChlLmcuLCB3aGVuIHVzZWQgd2l0aCBmbGF0X2NvbmpvaW4gYWJvdmUsIGFuZCBwYXNzaW5nIGhhcmQ9MSB0byB0aGUKKyMgY29uc3RydWN0b3IsIGEgMjAweDIwMCBLbmlnaHQncyBUb3VyIHdhcyBmb3VuZCBxdWlja2x5IC0tIG5vdGUgdGhhdCB3ZSdyZQorIyBjcmVhdGluZyAxMHMgb2YgdGhvdXNhbmRzIG9mIGdlbmVyYXRvcnMgdGhlbiEpLCBhbmQgaXMgbGVuZ3RoeS4KKworY2xhc3MgS25pZ2h0czoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbSwgbiwgaGFyZD0wKToKKyAgICAgICAgc2VsZi5tLCBzZWxmLm4gPSBtLCBuCisKKyAgICAgICAgIyBzb2x2ZSgpIHdpbGwgc2V0IHVwIHN1Y2NzW2ldIHRvIGJlIGEgbGlzdCBvZiBzcXVhcmUgI2kncworICAgICAgICAjIHN1Y2Nlc3NvcnMuCisgICAgICAgIHN1Y2NzID0gc2VsZi5zdWNjcyA9IFtdCisKKyAgICAgICAgIyBSZW1vdmUgaTAgZnJvbSBlYWNoIG9mIGl0cyBzdWNjZXNzb3IncyBzdWNjZXNzb3IgbGlzdHMsIGkuZS4KKyAgICAgICAgIyBzdWNjZXNzb3JzIGNhbid0IGdvIGJhY2sgdG8gaTAgYWdhaW4uICBSZXR1cm4gMCBpZiB3ZSBjYW4KKyAgICAgICAgIyBkZXRlY3QgdGhpcyBtYWtlcyBhIHNvbHV0aW9uIGltcG9zc2libGUsIGVsc2UgcmV0dXJuIDEuCisKKyAgICAgICAgZGVmIHJlbW92ZV9mcm9tX3N1Y2Nlc3NvcnMoaTAsIGxlbj1sZW4pOgorICAgICAgICAgICAgIyBJZiB3ZSByZW1vdmUgYWxsIGV4aXRzIGZyb20gYSBmcmVlIHNxdWFyZSwgd2UncmUgZGVhZDoKKyAgICAgICAgICAgICMgZXZlbiBpZiB3ZSBtb3ZlIHRvIGl0IG5leHQsIHdlIGNhbid0IGxlYXZlIGl0IGFnYWluLgorICAgICAgICAgICAgIyBJZiB3ZSBjcmVhdGUgYSBzcXVhcmUgd2l0aCBvbmUgZXhpdCwgd2UgbXVzdCB2aXNpdCBpdCBuZXh0OworICAgICAgICAgICAgIyBlbHNlIHNvbWVib2R5IGVsc2Ugd2lsbCBoYXZlIHRvIHZpc2l0IGl0LCBhbmQgc2luY2UgdGhlcmUncworICAgICAgICAgICAgIyBvbmx5IG9uZSBhZGphY2VudCwgdGhlcmUgd29uJ3QgYmUgYSB3YXkgdG8gbGVhdmUgaXQgYWdhaW4uCisgICAgICAgICAgICAjIEZpbmVsbHksIGlmIHdlIGNyZWF0ZSBtb3JlIHRoYW4gb25lIGZyZWUgc3F1YXJlIHdpdGggYQorICAgICAgICAgICAgIyBzaW5nbGUgZXhpdCwgd2UgY2FuIG9ubHkgbW92ZSB0byBvbmUgb2YgdGhlbSBuZXh0LCBsZWF2aW5nCisgICAgICAgICAgICAjIHRoZSBvdGhlciBvbmUgYSBkZWFkIGVuZC4KKyAgICAgICAgICAgIG5lMCA9IG5lMSA9IDAKKyAgICAgICAgICAgIGZvciBpIGluIHN1Y2NzW2kwXToKKyAgICAgICAgICAgICAgICBzID0gc3VjY3NbaV0KKyAgICAgICAgICAgICAgICBzLnJlbW92ZShpMCkKKyAgICAgICAgICAgICAgICBlID0gbGVuKHMpCisgICAgICAgICAgICAgICAgaWYgZSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBuZTAgKz0gMQorICAgICAgICAgICAgICAgIGVsaWYgZSA9PSAxOgorICAgICAgICAgICAgICAgICAgICBuZTEgKz0gMQorICAgICAgICAgICAgcmV0dXJuIG5lMCA9PSAwIGFuZCBuZTEgPCAyCisKKyAgICAgICAgIyBQdXQgaTAgYmFjayBpbiBlYWNoIG9mIGl0cyBzdWNjZXNzb3IncyBzdWNjZXNzb3IgbGlzdHMuCisKKyAgICAgICAgZGVmIGFkZF90b19zdWNjZXNzb3JzKGkwKToKKyAgICAgICAgICAgIGZvciBpIGluIHN1Y2NzW2kwXToKKyAgICAgICAgICAgICAgICBzdWNjc1tpXS5hcHBlbmQoaTApCisKKyAgICAgICAgIyBHZW5lcmF0ZSB0aGUgZmlyc3QgbW92ZS4KKyAgICAgICAgZGVmIGZpcnN0KCk6CisgICAgICAgICAgICBpZiBtIDwgMSBvciBuIDwgMToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgIyBTaW5jZSB3ZSdyZSBsb29raW5nIGZvciBhIGN5Y2xlLCBpdCBkb2Vzbid0IG1hdHRlciB3aGVyZSB3ZQorICAgICAgICAgICAgIyBzdGFydC4gIFN0YXJ0aW5nIGluIGEgY29ybmVyIG1ha2VzIHRoZSAybmQgbW92ZSBlYXN5LgorICAgICAgICAgICAgY29ybmVyID0gc2VsZi5jb29yZHMyaW5kZXgoMCwgMCkKKyAgICAgICAgICAgIHJlbW92ZV9mcm9tX3N1Y2Nlc3NvcnMoY29ybmVyKQorICAgICAgICAgICAgc2VsZi5sYXN0aWogPSBjb3JuZXIKKyAgICAgICAgICAgIHlpZWxkIGNvcm5lcgorICAgICAgICAgICAgYWRkX3RvX3N1Y2Nlc3NvcnMoY29ybmVyKQorCisgICAgICAgICMgR2VuZXJhdGUgdGhlIHNlY29uZCBtb3Zlcy4KKyAgICAgICAgZGVmIHNlY29uZCgpOgorICAgICAgICAgICAgY29ybmVyID0gc2VsZi5jb29yZHMyaW5kZXgoMCwgMCkKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLmxhc3RpaiA9PSBjb3JuZXIgICMgaS5lLiwgd2Ugc3RhcnRlZCBpbiB0aGUgY29ybmVyCisgICAgICAgICAgICBpZiBtIDwgMyBvciBuIDwgMzoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGFzc2VydCBsZW4oc3VjY3NbY29ybmVyXSkgPT0gMgorICAgICAgICAgICAgYXNzZXJ0IHNlbGYuY29vcmRzMmluZGV4KDEsIDIpIGluIHN1Y2NzW2Nvcm5lcl0KKyAgICAgICAgICAgIGFzc2VydCBzZWxmLmNvb3JkczJpbmRleCgyLCAxKSBpbiBzdWNjc1tjb3JuZXJdCisgICAgICAgICAgICAjIE9ubHkgdHdvIGNob2ljZXMuICBXaGljaGV2ZXIgd2UgcGljaywgdGhlIG90aGVyIG11c3QgYmUgdGhlCisgICAgICAgICAgICAjIHNxdWFyZSBwaWNrZWQgb24gbW92ZSBtKm4sIGFzIGl0J3MgdGhlIG9ubHkgd2F5IHRvIGdldCBiYWNrCisgICAgICAgICAgICAjIHRvICgwLCAwKS4gIFNhdmUgaXRzIGluZGV4IGluIHNlbGYuZmluYWwgc28gdGhhdCBtb3ZlcyBiZWZvcmUKKyAgICAgICAgICAgICMgdGhlIGxhc3Qga25vdyBpdCBtdXN0IGJlIGtlcHQgZnJlZS4KKyAgICAgICAgICAgIGZvciBpLCBqIGluICgxLCAyKSwgKDIsIDEpOgorICAgICAgICAgICAgICAgIHRoaXMgID0gc2VsZi5jb29yZHMyaW5kZXgoaSwgaikKKyAgICAgICAgICAgICAgICBmaW5hbCA9IHNlbGYuY29vcmRzMmluZGV4KDMtaSwgMy1qKQorICAgICAgICAgICAgICAgIHNlbGYuZmluYWwgPSBmaW5hbAorCisgICAgICAgICAgICAgICAgcmVtb3ZlX2Zyb21fc3VjY2Vzc29ycyh0aGlzKQorICAgICAgICAgICAgICAgIHN1Y2NzW2ZpbmFsXS5hcHBlbmQoY29ybmVyKQorICAgICAgICAgICAgICAgIHNlbGYubGFzdGlqID0gdGhpcworICAgICAgICAgICAgICAgIHlpZWxkIHRoaXMKKyAgICAgICAgICAgICAgICBzdWNjc1tmaW5hbF0ucmVtb3ZlKGNvcm5lcikKKyAgICAgICAgICAgICAgICBhZGRfdG9fc3VjY2Vzc29ycyh0aGlzKQorCisgICAgICAgICMgR2VuZXJhdGUgbW92ZXMgMyB0aHJ1IG0qbi0xLgorICAgICAgICBkZWYgYWR2YW5jZShsZW49bGVuKToKKyAgICAgICAgICAgICMgSWYgc29tZSBzdWNjZXNzb3IgaGFzIG9ubHkgb25lIGV4aXQsIG11c3QgdGFrZSBpdC4KKyAgICAgICAgICAgICMgRWxzZSBmYXZvciBzdWNjZXNzb3JzIHdpdGggZmV3ZXIgZXhpdHMuCisgICAgICAgICAgICBjYW5kaWRhdGVzID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHN1Y2NzW3NlbGYubGFzdGlqXToKKyAgICAgICAgICAgICAgICBlID0gbGVuKHN1Y2NzW2ldKQorICAgICAgICAgICAgICAgIGFzc2VydCBlID4gMCwgImVsc2UgcmVtb3ZlX2Zyb21fc3VjY2Vzc29ycygpIHBydW5pbmcgZmxhd2VkIgorICAgICAgICAgICAgICAgIGlmIGUgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IFsoZSwgaSldCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hcHBlbmQoKGUsIGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLnNvcnQoKQorCisgICAgICAgICAgICBmb3IgZSwgaSBpbiBjYW5kaWRhdGVzOgorICAgICAgICAgICAgICAgIGlmIGkgIT0gc2VsZi5maW5hbDoKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVtb3ZlX2Zyb21fc3VjY2Vzc29ycyhpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGFzdGlqID0gaQorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgaQorICAgICAgICAgICAgICAgICAgICBhZGRfdG9fc3VjY2Vzc29ycyhpKQorCisgICAgICAgICMgR2VuZXJhdGUgbW92ZXMgMyB0aHJ1IG0qbi0xLiAgQWx0ZXJuYXRpdmUgdmVyc2lvbiB1c2luZyBhCisgICAgICAgICMgc3Ryb25nZXIgKGJ1dCBtb3JlIGV4cGVuc2l2ZSkgaGV1cmlzdGljIHRvIG9yZGVyIHN1Y2Nlc3NvcnMuCisgICAgICAgICMgU2luY2UgdGhlICMgb2YgYmFja3RyYWNraW5nIGxldmVscyBpcyBtKm4sIGEgcG9vciBtb3ZlIGVhcmx5IG9uCisgICAgICAgICMgY2FuIHRha2UgZW9ucyB0byB1bmRvLiAgU21hbGxlc3Qgc3F1YXJlIGJvYXJkIGZvciB3aGljaCB0aGlzCisgICAgICAgICMgbWF0dGVycyBhIGxvdCBpcyA1Mng1Mi4KKyAgICAgICAgZGVmIGFkdmFuY2VfaGFyZCh2bWlkPShtLTEpLzIuMCwgaG1pZD0obi0xKS8yLjAsIGxlbj1sZW4pOgorICAgICAgICAgICAgIyBJZiBzb21lIHN1Y2Nlc3NvciBoYXMgb25seSBvbmUgZXhpdCwgbXVzdCB0YWtlIGl0LgorICAgICAgICAgICAgIyBFbHNlIGZhdm9yIHN1Y2Nlc3NvcnMgd2l0aCBmZXdlciBleGl0cy4KKyAgICAgICAgICAgICMgQnJlYWsgdGllcyB2aWEgbWF4IGRpc3RhbmNlIGZyb20gYm9hcmQgY2VudGVycG9pbnQgKGZhdm9yCisgICAgICAgICAgICAjIGNvcm5lcnMgYW5kIGVkZ2VzIHdoZW5ldmVyIHBvc3NpYmxlKS4KKyAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gc3VjY3Nbc2VsZi5sYXN0aWpdOgorICAgICAgICAgICAgICAgIGUgPSBsZW4oc3VjY3NbaV0pCisgICAgICAgICAgICAgICAgYXNzZXJ0IGUgPiAwLCAiZWxzZSByZW1vdmVfZnJvbV9zdWNjZXNzb3JzKCkgcHJ1bmluZyBmbGF3ZWQiCisgICAgICAgICAgICAgICAgaWYgZSA9PSAxOgorICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzID0gWyhlLCAwLCBpKV0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpMSwgajEgPSBzZWxmLmluZGV4MmNvb3JkcyhpKQorICAgICAgICAgICAgICAgIGQgPSAoaTEgLSB2bWlkKSoqMiArIChqMSAtIGhtaWQpKioyCisgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hcHBlbmQoKGUsIC1kLCBpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5zb3J0KCkKKworICAgICAgICAgICAgZm9yIGUsIGQsIGkgaW4gY2FuZGlkYXRlczoKKyAgICAgICAgICAgICAgICBpZiBpICE9IHNlbGYuZmluYWw6CisgICAgICAgICAgICAgICAgICAgIGlmIHJlbW92ZV9mcm9tX3N1Y2Nlc3NvcnMoaSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhc3RpaiA9IGkKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGkKKyAgICAgICAgICAgICAgICAgICAgYWRkX3RvX3N1Y2Nlc3NvcnMoaSkKKworICAgICAgICAjIEdlbmVyYXRlIHRoZSBsYXN0IG1vdmUuCisgICAgICAgIGRlZiBsYXN0KCk6CisgICAgICAgICAgICBhc3NlcnQgc2VsZi5maW5hbCBpbiBzdWNjc1tzZWxmLmxhc3Rpal0KKyAgICAgICAgICAgIHlpZWxkIHNlbGYuZmluYWwKKworICAgICAgICBpZiBtKm4gPCA0OgorICAgICAgICAgICAgc2VsZi5zcXVhcmVnZW5lcmF0b3JzID0gW2ZpcnN0XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zcXVhcmVnZW5lcmF0b3JzID0gW2ZpcnN0LCBzZWNvbmRdICsgXAorICAgICAgICAgICAgICAgIFtoYXJkIGFuZCBhZHZhbmNlX2hhcmQgb3IgYWR2YW5jZV0gKiAobSpuIC0gMykgKyBcCisgICAgICAgICAgICAgICAgW2xhc3RdCisKKyAgICBkZWYgY29vcmRzMmluZGV4KHNlbGYsIGksIGopOgorICAgICAgICBhc3NlcnQgMCA8PSBpIDwgc2VsZi5tCisgICAgICAgIGFzc2VydCAwIDw9IGogPCBzZWxmLm4KKyAgICAgICAgcmV0dXJuIGkgKiBzZWxmLm4gKyBqCisKKyAgICBkZWYgaW5kZXgyY29vcmRzKHNlbGYsIGluZGV4KToKKyAgICAgICAgYXNzZXJ0IDAgPD0gaW5kZXggPCBzZWxmLm0gKiBzZWxmLm4KKyAgICAgICAgcmV0dXJuIGRpdm1vZChpbmRleCwgc2VsZi5uKQorCisgICAgZGVmIF9pbml0X2JvYXJkKHNlbGYpOgorICAgICAgICBzdWNjcyA9IHNlbGYuc3VjY3MKKyAgICAgICAgZGVsIHN1Y2NzWzpdCisgICAgICAgIG0sIG4gPSBzZWxmLm0sIHNlbGYubgorICAgICAgICBjMmkgPSBzZWxmLmNvb3JkczJpbmRleAorCisgICAgICAgIG9mZnNldHMgPSBbKCAxLCAgMiksICggMiwgIDEpLCAoIDIsIC0xKSwgKCAxLCAtMiksCisgICAgICAgICAgICAgICAgICAgKC0xLCAtMiksICgtMiwgLTEpLCAoLTIsICAxKSwgKC0xLCAgMildCisgICAgICAgIHJhbmdlbiA9IHJhbmdlKG4pCisgICAgICAgIGZvciBpIGluIHJhbmdlKG0pOgorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2VuOgorICAgICAgICAgICAgICAgIHMgPSBbYzJpKGkraW8sIGoram8pIGZvciBpbywgam8gaW4gb2Zmc2V0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIDAgPD0gaStpbyA8IG0gYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA8PSBqK2pvIDwgbl0KKyAgICAgICAgICAgICAgICBzdWNjcy5hcHBlbmQocykKKworICAgICMgR2VuZXJhdGUgc29sdXRpb25zLgorICAgIGRlZiBzb2x2ZShzZWxmKToKKyAgICAgICAgc2VsZi5faW5pdF9ib2FyZCgpCisgICAgICAgIGZvciB4IGluIGNvbmpvaW4oc2VsZi5zcXVhcmVnZW5lcmF0b3JzKToKKyAgICAgICAgICAgIHlpZWxkIHgKKworICAgIGRlZiBwcmludHNvbHV0aW9uKHNlbGYsIHgpOgorICAgICAgICBtLCBuID0gc2VsZi5tLCBzZWxmLm4KKyAgICAgICAgYXNzZXJ0IGxlbih4KSA9PSBtKm4KKyAgICAgICAgdyA9IGxlbihzdHIobSpuKSkKKyAgICAgICAgZm9ybWF0ID0gIiUiICsgc3RyKHcpICsgImQiCisKKyAgICAgICAgc3F1YXJlcyA9IFtbTm9uZV0gKiBuIGZvciBpIGluIHJhbmdlKG0pXQorICAgICAgICBrID0gMQorICAgICAgICBmb3IgaSBpbiB4OgorICAgICAgICAgICAgaTEsIGoxID0gc2VsZi5pbmRleDJjb29yZHMoaSkKKyAgICAgICAgICAgIHNxdWFyZXNbaTFdW2oxXSA9IGZvcm1hdCAlIGsKKyAgICAgICAgICAgIGsgKz0gMQorCisgICAgICAgIHNlcCA9ICIrIiArICgiLSIgKiB3ICsgIisiKSAqIG4KKyAgICAgICAgcHJpbnQgc2VwCisgICAgICAgIGZvciBpIGluIHJhbmdlKG0pOgorICAgICAgICAgICAgcm93ID0gc3F1YXJlc1tpXQorICAgICAgICAgICAgcHJpbnQgInwiICsgInwiLmpvaW4ocm93KSArICJ8IgorICAgICAgICAgICAgcHJpbnQgc2VwCisKK2NvbmpvaW5fdGVzdHMgPSAiIiIKKworR2VuZXJhdGUgdGhlIDMtYml0IGJpbmFyeSBudW1iZXJzIGluIG9yZGVyLiAgVGhpcyBpbGx1c3RyYXRlcyBkdW1iZXN0LQorcG9zc2libGUgdXNlIG9mIGNvbmpvaW4sIGp1c3QgdG8gZ2VuZXJhdGUgdGhlIGZ1bGwgY3Jvc3MtcHJvZHVjdC4KKworPj4+IGZvciBjIGluIGNvbmpvaW4oW2xhbWJkYTogaXRlcigoMCwgMSkpXSAqIDMpOgorLi4uICAgICBwcmludCBjCitbMCwgMCwgMF0KK1swLCAwLCAxXQorWzAsIDEsIDBdCitbMCwgMSwgMV0KK1sxLCAwLCAwXQorWzEsIDAsIDFdCitbMSwgMSwgMF0KK1sxLCAxLCAxXQorCitGb3IgZWZmaWNpZW5jeSBpbiB0eXBpY2FsIGJhY2t0cmFja2luZyBhcHBzLCBjb25qb2luKCkgeWllbGRzIHRoZSBzYW1lIGxpc3QKK29iamVjdCBlYWNoIHRpbWUuICBTbyBpZiB5b3Ugd2FudCB0byBzYXZlIGF3YXkgYSBmdWxsIGFjY291bnQgb2YgaXRzCitnZW5lcmF0ZWQgc2VxdWVuY2UsIHlvdSBuZWVkIHRvIGNvcHkgaXRzIHJlc3VsdHMuCisKKz4+PiBkZWYgZ2VuY29weShpdGVyYXRvcik6CisuLi4gICAgIGZvciB4IGluIGl0ZXJhdG9yOgorLi4uICAgICAgICAgeWllbGQgeFs6XQorCis+Pj4gZm9yIG4gaW4gcmFuZ2UoMTApOgorLi4uICAgICBhbGwgPSBsaXN0KGdlbmNvcHkoY29uam9pbihbbGFtYmRhOiBpdGVyKCgwLCAxKSldICogbikpKQorLi4uICAgICBwcmludCBuLCBsZW4oYWxsKSwgYWxsWzBdID09IFswXSAqIG4sIGFsbFstMV0gPT0gWzFdICogbgorMCAxIFRydWUgVHJ1ZQorMSAyIFRydWUgVHJ1ZQorMiA0IFRydWUgVHJ1ZQorMyA4IFRydWUgVHJ1ZQorNCAxNiBUcnVlIFRydWUKKzUgMzIgVHJ1ZSBUcnVlCis2IDY0IFRydWUgVHJ1ZQorNyAxMjggVHJ1ZSBUcnVlCis4IDI1NiBUcnVlIFRydWUKKzkgNTEyIFRydWUgVHJ1ZQorCitBbmQgcnVuIGFuIDgtcXVlZW5zIHNvbHZlci4KKworPj4+IHEgPSBRdWVlbnMoOCkKKz4+PiBMSU1JVCA9IDIKKz4+PiBjb3VudCA9IDAKKz4+PiBmb3Igcm93MmNvbCBpbiBxLnNvbHZlKCk6CisuLi4gICAgIGNvdW50ICs9IDEKKy4uLiAgICAgaWYgY291bnQgPD0gTElNSVQ6CisuLi4gICAgICAgICBwcmludCAiU29sdXRpb24iLCBjb3VudAorLi4uICAgICAgICAgcS5wcmludHNvbHV0aW9uKHJvdzJjb2wpCitTb2x1dGlvbiAxCisrLSstKy0rLSstKy0rLSstKworfFF8IHwgfCB8IHwgfCB8IHwKKystKy0rLSstKy0rLSstKy0rCit8IHwgfCB8IHxRfCB8IHwgfAorKy0rLSstKy0rLSstKy0rLSsKK3wgfCB8IHwgfCB8IHwgfFF8CisrLSstKy0rLSstKy0rLSstKworfCB8IHwgfCB8IHxRfCB8IHwKKystKy0rLSstKy0rLSstKy0rCit8IHwgfFF8IHwgfCB8IHwgfAorKy0rLSstKy0rLSstKy0rLSsKK3wgfCB8IHwgfCB8IHxRfCB8CisrLSstKy0rLSstKy0rLSstKworfCB8UXwgfCB8IHwgfCB8IHwKKystKy0rLSstKy0rLSstKy0rCit8IHwgfCB8UXwgfCB8IHwgfAorKy0rLSstKy0rLSstKy0rLSsKK1NvbHV0aW9uIDIKKystKy0rLSstKy0rLSstKy0rCit8UXwgfCB8IHwgfCB8IHwgfAorKy0rLSstKy0rLSstKy0rLSsKK3wgfCB8IHwgfCB8UXwgfCB8CisrLSstKy0rLSstKy0rLSstKworfCB8IHwgfCB8IHwgfCB8UXwKKystKy0rLSstKy0rLSstKy0rCit8IHwgfFF8IHwgfCB8IHwgfAorKy0rLSstKy0rLSstKy0rLSsKK3wgfCB8IHwgfCB8IHxRfCB8CisrLSstKy0rLSstKy0rLSstKworfCB8IHwgfFF8IHwgfCB8IHwKKystKy0rLSstKy0rLSstKy0rCit8IHxRfCB8IHwgfCB8IHwgfAorKy0rLSstKy0rLSstKy0rLSsKK3wgfCB8IHwgfFF8IHwgfCB8CisrLSstKy0rLSstKy0rLSstKworCis+Pj4gcHJpbnQgY291bnQsICJzb2x1dGlvbnMgaW4gYWxsLiIKKzkyIHNvbHV0aW9ucyBpbiBhbGwuCisKK0FuZCBydW4gYSBLbmlnaHQncyBUb3VyIG9uIGEgMTB4MTAgYm9hcmQuICBOb3RlIHRoYXQgdGhlcmUgYXJlIGFib3V0CisyMCwwMDAgc29sdXRpb25zIGV2ZW4gb24gYSA2eDYgYm9hcmQsIHNvIGRvbid0IGRhcmUgcnVuIHRoaXMgdG8gZXhoYXVzdGlvbi4KKworPj4+IGsgPSBLbmlnaHRzKDEwLCAxMCkKKz4+PiBMSU1JVCA9IDIKKz4+PiBjb3VudCA9IDAKKz4+PiBmb3IgeCBpbiBrLnNvbHZlKCk6CisuLi4gICAgIGNvdW50ICs9IDEKKy4uLiAgICAgaWYgY291bnQgPD0gTElNSVQ6CisuLi4gICAgICAgICBwcmludCAiU29sdXRpb24iLCBjb3VudAorLi4uICAgICAgICAgay5wcmludHNvbHV0aW9uKHgpCisuLi4gICAgIGVsc2U6CisuLi4gICAgICAgICBicmVhaworU29sdXRpb24gMQorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgIDF8IDU4fCAyN3wgMzR8ICAzfCA0MHwgMjl8IDEwfCAgNXwgIDh8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworfCAyNnwgMzV8ICAyfCA1N3wgMjh8IDMzfCAgNHwgIDd8IDMwfCAxMXwKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8IDU5fDEwMHwgNzN8IDM2fCA0MXwgNTZ8IDM5fCAzMnwgIDl8ICA2fAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgNzR8IDI1fCA2MHwgNTV8IDcyfCAzN3wgNDJ8IDQ5fCAxMnwgMzF8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworfCA2MXwgODZ8IDk5fCA3NnwgNjN8IDUyfCA0N3wgMzh8IDQzfCA1MHwKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8IDI0fCA3NXwgNjJ8IDg1fCA1NHwgNzF8IDY0fCA1MXwgNDh8IDEzfAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgODd8IDk4fCA5MXwgODB8IDc3fCA4NHwgNTN8IDQ2fCA2NXwgNDR8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworfCA5MHwgMjN8IDg4fCA5NXwgNzB8IDc5fCA2OHwgODN8IDE0fCAxN3wKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8IDk3fCA5MnwgMjF8IDc4fCA4MXwgOTR8IDE5fCAxNnwgNDV8IDY2fAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgMjJ8IDg5fCA5NnwgOTN8IDIwfCA2OXwgODJ8IDY3fCAxOHwgMTV8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworU29sdXRpb24gMgorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgIDF8IDU4fCAyN3wgMzR8ICAzfCA0MHwgMjl8IDEwfCAgNXwgIDh8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworfCAyNnwgMzV8ICAyfCA1N3wgMjh8IDMzfCAgNHwgIDd8IDMwfCAxMXwKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8IDU5fDEwMHwgNzN8IDM2fCA0MXwgNTZ8IDM5fCAzMnwgIDl8ICA2fAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgNzR8IDI1fCA2MHwgNTV8IDcyfCAzN3wgNDJ8IDQ5fCAxMnwgMzF8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworfCA2MXwgODZ8IDk5fCA3NnwgNjN8IDUyfCA0N3wgMzh8IDQzfCA1MHwKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8IDI0fCA3NXwgNjJ8IDg1fCA1NHwgNzF8IDY0fCA1MXwgNDh8IDEzfAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgODd8IDk4fCA4OXwgODB8IDc3fCA4NHwgNTN8IDQ2fCA2NXwgNDR8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworfCA5MHwgMjN8IDkyfCA5NXwgNzB8IDc5fCA2OHwgODN8IDE0fCAxN3wKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8IDk3fCA4OHwgMjF8IDc4fCA4MXwgOTR8IDE5fCAxNnwgNDV8IDY2fAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgMjJ8IDkxfCA5NnwgOTN8IDIwfCA2OXwgODJ8IDY3fCAxOHwgMTV8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworIiIiCisKK3dlYWtyZWZfdGVzdHMgPSAiIiJcCitHZW5lcmF0b3JzIGFyZSB3ZWFrbHkgcmVmZXJlbmNhYmxlOgorCis+Pj4gaW1wb3J0IHdlYWtyZWYKKz4+PiBkZWYgZ2VuKCk6CisuLi4gICAgIHlpZWxkICdmb28hJworLi4uCis+Pj4gd3IgPSB3ZWFrcmVmLnJlZihnZW4pCis+Pj4gd3IoKSBpcyBnZW4KK1RydWUKKz4+PiBwID0gd2Vha3JlZi5wcm94eShnZW4pCisKK0dlbmVyYXRvci1pdGVyYXRvcnMgYXJlIHdlYWtseSByZWZlcmVuY2FibGUgYXMgd2VsbDoKKworPj4+IGdpID0gZ2VuKCkKKz4+PiB3ciA9IHdlYWtyZWYucmVmKGdpKQorPj4+IHdyKCkgaXMgZ2kKK1RydWUKKz4+PiBwID0gd2Vha3JlZi5wcm94eShnaSkKKz4+PiBsaXN0KHApCitbJ2ZvbyEnXQorCisiIiIKKworY29yb3V0aW5lX3Rlc3RzID0gIiIiXAorU2VuZGluZyBhIHZhbHVlIGludG8gYSBzdGFydGVkIGdlbmVyYXRvcjoKKworPj4+IGRlZiBmKCk6CisuLi4gICAgIHByaW50ICh5aWVsZCAxKQorLi4uICAgICB5aWVsZCAyCis+Pj4gZyA9IGYoKQorPj4+IGcubmV4dCgpCisxCis+Pj4gZy5zZW5kKDQyKQorNDIKKzIKKworU2VuZGluZyBhIHZhbHVlIGludG8gYSBuZXcgZ2VuZXJhdG9yIHByb2R1Y2VzIGEgVHlwZUVycm9yOgorCis+Pj4gZigpLnNlbmQoImZvbyIpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisuLi4KK1R5cGVFcnJvcjogY2FuJ3Qgc2VuZCBub24tTm9uZSB2YWx1ZSB0byBhIGp1c3Qtc3RhcnRlZCBnZW5lcmF0b3IKKworCitZaWVsZCBieSBpdHNlbGYgeWllbGRzIE5vbmU6CisKKz4+PiBkZWYgZigpOiB5aWVsZAorPj4+IGxpc3QoZigpKQorW05vbmVdCisKKworCitBbiBvYnNjZW5lIGFidXNlIG9mIGEgeWllbGQgZXhwcmVzc2lvbiB3aXRoaW4gYSBnZW5lcmF0b3IgZXhwcmVzc2lvbjoKKworPj4+IGxpc3QoKHlpZWxkIDIxKSBmb3IgaSBpbiByYW5nZSg0KSkKK1syMSwgTm9uZSwgMjEsIE5vbmUsIDIxLCBOb25lLCAyMSwgTm9uZV0KKworQW5kIGEgbW9yZSBzYW5lLCBidXQgc3RpbGwgd2VpcmQgdXNhZ2U6CisKKz4+PiBkZWYgZigpOiBsaXN0KGkgZm9yIGkgaW4gWyh5aWVsZCAyNildKQorPj4+IHR5cGUoZigpKQorPHR5cGUgJ2dlbmVyYXRvcic+CisKKworQSB5aWVsZCBleHByZXNzaW9uIHdpdGggYXVnbWVudGVkIGFzc2lnbm1lbnQuCisKKz4+PiBkZWYgY29yb3V0aW5lKHNlcSk6CisuLi4gICAgIGNvdW50ID0gMAorLi4uICAgICB3aGlsZSBjb3VudCA8IDIwMDoKKy4uLiAgICAgICAgIGNvdW50ICs9IHlpZWxkCisuLi4gICAgICAgICBzZXEuYXBwZW5kKGNvdW50KQorPj4+IHNlcSA9IFtdCis+Pj4gYyA9IGNvcm91dGluZShzZXEpCis+Pj4gYy5uZXh0KCkKKz4+PiBwcmludCBzZXEKK1tdCis+Pj4gYy5zZW5kKDEwKQorPj4+IHByaW50IHNlcQorWzEwXQorPj4+IGMuc2VuZCgxMCkKKz4+PiBwcmludCBzZXEKK1sxMCwgMjBdCis+Pj4gYy5zZW5kKDEwKQorPj4+IHByaW50IHNlcQorWzEwLCAyMCwgMzBdCisKKworQ2hlY2sgc29tZSBzeW50YXggZXJyb3JzIGZvciB5aWVsZCBleHByZXNzaW9uczoKKworPj4+IGY9bGFtYmRhOiAoeWllbGQgMSksKHlpZWxkIDIpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMjFdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6ICd5aWVsZCcgb3V0c2lkZSBmdW5jdGlvbgorCis+Pj4gZGVmIGYoKTogcmV0dXJuIGxhbWJkYSB4PSh5aWVsZCk6IDEKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCitTeW50YXhFcnJvcjogJ3JldHVybicgd2l0aCBhcmd1bWVudCBpbnNpZGUgZ2VuZXJhdG9yICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMjJdPiwgbGluZSAxKQorCis+Pj4gZGVmIGYoKTogeCA9IHlpZWxkID0geQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAuLi4KKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmVyYXRvcnMuX190ZXN0X18uY29yb3V0aW5lWzIzXT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBhc3NpZ25tZW50IHRvIHlpZWxkIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlCisKKz4+PiBkZWYgZigpOiAoeWllbGQgYmFyKSA9IHkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9nZW5lcmF0b3JzLl9fdGVzdF9fLmNvcm91dGluZVsyNF0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIHlpZWxkIGV4cHJlc3Npb24KKworPj4+IGRlZiBmKCk6ICh5aWVsZCBiYXIpICs9IHkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9nZW5lcmF0b3JzLl9fdGVzdF9fLmNvcm91dGluZVsyNV0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIHlpZWxkIGV4cHJlc3Npb24KKworCitOb3cgY2hlY2sgc29tZSB0aHJvdygpIGNvbmRpdGlvbnM6CisKKz4+PiBkZWYgZigpOgorLi4uICAgICB3aGlsZSBUcnVlOgorLi4uICAgICAgICAgdHJ5OgorLi4uICAgICAgICAgICAgIHByaW50ICh5aWVsZCkKKy4uLiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHY6CisuLi4gICAgICAgICAgICAgcHJpbnQgImNhdWdodCBWYWx1ZUVycm9yICglcykiICUgKHYpLAorPj4+IGltcG9ydCBzeXMKKz4+PiBnID0gZigpCis+Pj4gZy5uZXh0KCkKKworPj4+IGcudGhyb3coVmFsdWVFcnJvcikgIyB0eXBlIG9ubHkKK2NhdWdodCBWYWx1ZUVycm9yICgpCisKKz4+PiBnLnRocm93KFZhbHVlRXJyb3IoInh5eiIpKSAgIyB2YWx1ZSBvbmx5CitjYXVnaHQgVmFsdWVFcnJvciAoeHl6KQorCis+Pj4gZy50aHJvdyhWYWx1ZUVycm9yLCBWYWx1ZUVycm9yKDEpKSAgICMgdmFsdWUrbWF0Y2hpbmcgdHlwZQorY2F1Z2h0IFZhbHVlRXJyb3IgKDEpCisKKz4+PiBnLnRocm93KFZhbHVlRXJyb3IsIFR5cGVFcnJvcigxKSkgICMgbWlzbWF0Y2hlZCB0eXBlLCByZXdyYXBwZWQKK2NhdWdodCBWYWx1ZUVycm9yICgxKQorCis+Pj4gZy50aHJvdyhWYWx1ZUVycm9yLCBWYWx1ZUVycm9yKDEpLCBOb25lKSAgICMgZXhwbGljaXQgTm9uZSB0cmFjZWJhY2sKK2NhdWdodCBWYWx1ZUVycm9yICgxKQorCis+Pj4gZy50aHJvdyhWYWx1ZUVycm9yKDEpLCAiZm9vIikgICAgICAgIyBiYWQgYXJncworVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAuLi4KK1R5cGVFcnJvcjogaW5zdGFuY2UgZXhjZXB0aW9uIG1heSBub3QgaGF2ZSBhIHNlcGFyYXRlIHZhbHVlCisKKz4+PiBnLnRocm93KFZhbHVlRXJyb3IsICJmb28iLCAyMykgICAgICAjIGJhZCBhcmdzCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorVHlwZUVycm9yOiB0aHJvdygpIHRoaXJkIGFyZ3VtZW50IG11c3QgYmUgYSB0cmFjZWJhY2sgb2JqZWN0CisKKz4+PiBkZWYgdGhyb3coZyxleGMpOgorLi4uICAgICB0cnk6CisuLi4gICAgICAgICByYWlzZSBleGMKKy4uLiAgICAgZXhjZXB0OgorLi4uICAgICAgICAgZy50aHJvdygqc3lzLmV4Y19pbmZvKCkpCis+Pj4gdGhyb3coZyxWYWx1ZUVycm9yKSAjIGRvIGl0IHdpdGggdHJhY2ViYWNrIGluY2x1ZGVkCitjYXVnaHQgVmFsdWVFcnJvciAoKQorCis+Pj4gZy5zZW5kKDEpCisxCisKKz4+PiB0aHJvdyhnLFR5cGVFcnJvcikgICMgdGVybWluYXRlIHRoZSBnZW5lcmF0b3IKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCitUeXBlRXJyb3IKKworPj4+IHByaW50IGcuZ2lfZnJhbWUKK05vbmUKKworPj4+IGcuc2VuZCgyKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAuLi4KK1N0b3BJdGVyYXRpb24KKworPj4+IGcudGhyb3coVmFsdWVFcnJvciw2KSAgICAgICAjIHRocm93IG9uIGNsb3NlZCBnZW5lcmF0b3IKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCitWYWx1ZUVycm9yOiA2CisKKz4+PiBmKCkudGhyb3coVmFsdWVFcnJvciw3KSAgICAgIyB0aHJvdyBvbiBqdXN0LW9wZW5lZCBnZW5lcmF0b3IKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCitWYWx1ZUVycm9yOiA3CisKKz4+PiBmKCkudGhyb3coImFiYyIpICAgICAjIHRocm93IG9uIGp1c3Qtb3BlbmVkIGdlbmVyYXRvcgorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAuLi4KK1R5cGVFcnJvcjogZXhjZXB0aW9ucyBtdXN0IGJlIGNsYXNzZXMsIG9yIGluc3RhbmNlcywgbm90IHN0cgorCitOb3cgbGV0J3MgdHJ5IGNsb3NpbmcgYSBnZW5lcmF0b3I6CisKKz4+PiBkZWYgZigpOgorLi4uICAgICB0cnk6IHlpZWxkCisuLi4gICAgIGV4Y2VwdCBHZW5lcmF0b3JFeGl0OgorLi4uICAgICAgICAgcHJpbnQgImV4aXRpbmciCisKKz4+PiBnID0gZigpCis+Pj4gZy5uZXh0KCkKKz4+PiBnLmNsb3NlKCkKK2V4aXRpbmcKKz4+PiBnLmNsb3NlKCkgICMgc2hvdWxkIGJlIG5vLW9wIG5vdworCis+Pj4gZigpLmNsb3NlKCkgICMgY2xvc2Ugb24ganVzdC1vcGVuZWQgZ2VuZXJhdG9yIHNob3VsZCBiZSBmaW5lCisKKz4+PiBkZWYgZigpOiB5aWVsZCAgICAgICMgYW4gZXZlbiBzaW1wbGVyIGdlbmVyYXRvcgorPj4+IGYoKS5jbG9zZSgpICAgICAgICAgIyBjbG9zZSBiZWZvcmUgb3BlbmluZworPj4+IGcgPSBmKCkKKz4+PiBnLm5leHQoKQorPj4+IGcuY2xvc2UoKSAgICAgICAgICAgIyBjbG9zZSBub3JtYWxseQorCitBbmQgZmluYWxpemF0aW9uOgorCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgdHJ5OiB5aWVsZAorLi4uICAgICBmaW5hbGx5OgorLi4uICAgICAgICAgcHJpbnQgImV4aXRpbmciCisKKz4+PiBnID0gZigpCis+Pj4gZy5uZXh0KCkKKz4+PiBkZWwgZworZXhpdGluZworCis+Pj4gY2xhc3MgY29udGV4dChvYmplY3QpOgorLi4uICAgIGRlZiBfX2VudGVyX18oc2VsZik6IHBhc3MKKy4uLiAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOiBwcmludCAnZXhpdGluZycKKz4+PiBkZWYgZigpOgorLi4uICAgICB3aXRoIGNvbnRleHQoKToKKy4uLiAgICAgICAgICB5aWVsZAorPj4+IGcgPSBmKCkKKz4+PiBnLm5leHQoKQorPj4+IGRlbCBnCitleGl0aW5nCisKKworR2VuZXJhdG9yRXhpdCBpcyBub3QgY2F1Z2h0IGJ5IGV4Y2VwdCBFeGNlcHRpb246CisKKz4+PiBkZWYgZigpOgorLi4uICAgICB0cnk6IHlpZWxkCisuLi4gICAgIGV4Y2VwdCBFeGNlcHRpb246IHByaW50ICdleGNlcHQnCisuLi4gICAgIGZpbmFsbHk6IHByaW50ICdmaW5hbGx5JworCis+Pj4gZyA9IGYoKQorPj4+IGcubmV4dCgpCis+Pj4gZGVsIGcKK2ZpbmFsbHkKKworCitOb3cgbGV0J3MgdHJ5IHNvbWUgaWxsLWJlaGF2ZWQgZ2VuZXJhdG9yczoKKworPj4+IGRlZiBmKCk6CisuLi4gICAgIHRyeTogeWllbGQKKy4uLiAgICAgZXhjZXB0IEdlbmVyYXRvckV4aXQ6CisuLi4gICAgICAgICB5aWVsZCAiZm9vISIKKz4+PiBnID0gZigpCis+Pj4gZy5uZXh0KCkKKz4+PiBnLmNsb3NlKCkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCitSdW50aW1lRXJyb3I6IGdlbmVyYXRvciBpZ25vcmVkIEdlbmVyYXRvckV4aXQKKz4+PiBnLmNsb3NlKCkKKworCitPdXIgaWxsLWJlaGF2ZWQgY29kZSBzaG91bGQgYmUgaW52b2tlZCBkdXJpbmcgR0M6CisKKz4+PiBpbXBvcnQgc3lzLCBTdHJpbmdJTworPj4+IG9sZCwgc3lzLnN0ZGVyciA9IHN5cy5zdGRlcnIsIFN0cmluZ0lPLlN0cmluZ0lPKCkKKz4+PiBnID0gZigpCis+Pj4gZy5uZXh0KCkKKz4+PiBkZWwgZworPj4+IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKS5zdGFydHN3aXRoKAorLi4uICAgICAiRXhjZXB0aW9uIFJ1bnRpbWVFcnJvcjogJ2dlbmVyYXRvciBpZ25vcmVkIEdlbmVyYXRvckV4aXQnIGluICIKKy4uLiApCitUcnVlCis+Pj4gc3lzLnN0ZGVyciA9IG9sZAorCisKK0FuZCBlcnJvcnMgdGhyb3duIGR1cmluZyBjbG9zaW5nIHNob3VsZCBwcm9wYWdhdGU6CisKKz4+PiBkZWYgZigpOgorLi4uICAgICB0cnk6IHlpZWxkCisuLi4gICAgIGV4Y2VwdCBHZW5lcmF0b3JFeGl0OgorLi4uICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJmaWUhIikKKz4+PiBnID0gZigpCis+Pj4gZy5uZXh0KCkKKz4+PiBnLmNsb3NlKCkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCitUeXBlRXJyb3I6IGZpZSEKKworCitFbnN1cmUgdGhhdCB2YXJpb3VzIHlpZWxkIGV4cHJlc3Npb24gY29uc3RydWN0cyBtYWtlIHRoZWlyCitlbmNsb3NpbmcgZnVuY3Rpb24gYSBnZW5lcmF0b3I6CisKKz4+PiBkZWYgZigpOiB4ICs9IHlpZWxkCis+Pj4gdHlwZShmKCkpCis8dHlwZSAnZ2VuZXJhdG9yJz4KKworPj4+IGRlZiBmKCk6IHggPSB5aWVsZAorPj4+IHR5cGUoZigpKQorPHR5cGUgJ2dlbmVyYXRvcic+CisKKz4+PiBkZWYgZigpOiBsYW1iZGEgeD0oeWllbGQpOiAxCis+Pj4gdHlwZShmKCkpCis8dHlwZSAnZ2VuZXJhdG9yJz4KKworPj4+IGRlZiBmKCk6IHg9KGkgZm9yIGkgaW4gKHlpZWxkKSBpZiAoeWllbGQpKQorPj4+IHR5cGUoZigpKQorPHR5cGUgJ2dlbmVyYXRvcic+CisKKz4+PiBkZWYgZihkKTogZFsoeWllbGQgImEiKV0gPSBkWyh5aWVsZCAiYiIpXSA9IDI3Cis+Pj4gZGF0YSA9IFsxLDJdCis+Pj4gZyA9IGYoZGF0YSkKKz4+PiB0eXBlKGcpCis8dHlwZSAnZ2VuZXJhdG9yJz4KKz4+PiBnLnNlbmQoTm9uZSkKKydhJworPj4+IGRhdGEKK1sxLCAyXQorPj4+IGcuc2VuZCgwKQorJ2InCis+Pj4gZGF0YQorWzI3LCAyXQorPj4+IHRyeTogZy5zZW5kKDEpCisuLi4gZXhjZXB0IFN0b3BJdGVyYXRpb246IHBhc3MKKz4+PiBkYXRhCitbMjcsIDI3XQorCisiIiIKKworcmVmbGVha3NfdGVzdHMgPSAiIiIKK1ByaW9yIHRvIGFkZGluZyBjeWNsZS1HQyBzdXBwb3J0IHRvIGl0ZXJ0b29scy50ZWUsIHRoaXMgY29kZSB3b3VsZCBsZWFrCityZWZlcmVuY2VzLiBXZSBhZGQgaXQgdG8gdGhlIHN0YW5kYXJkIHN1aXRlIHNvIHRoZSByb3V0aW5lIHJlZmxlYWstdGVzdHMKK3dvdWxkIHRyaWdnZXIgaWYgaXQgc3RhcnRzIGJlaW5nIHVuY2xlYW5hYmxlIGFnYWluLgorCis+Pj4gaW1wb3J0IGl0ZXJ0b29scworPj4+IGRlZiBsZWFrKCk6CisuLi4gICAgIGNsYXNzIGdlbjoKKy4uLiAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKy4uLiAgICAgICAgICAgICByZXR1cm4gc2VsZgorLi4uICAgICAgICAgZGVmIG5leHQoc2VsZik6CisuLi4gICAgICAgICAgICAgcmV0dXJuIHNlbGYuaXRlbQorLi4uICAgICBnID0gZ2VuKCkKKy4uLiAgICAgaGVhZCwgdGFpbCA9IGl0ZXJ0b29scy50ZWUoZykKKy4uLiAgICAgZy5pdGVtID0gaGVhZAorLi4uICAgICByZXR1cm4gaGVhZAorPj4+IGl0ID0gbGVhaygpCisKK01ha2Ugc3VyZSB0byBhbHNvIHRlc3QgdGhlIGludm9sdmVtZW50IG9mIHRoZSB0ZWUtaW50ZXJuYWwgdGVlZGF0YW9iamVjdCwKK3doaWNoIHN0b3JlcyByZXR1cm5lZCBpdGVtcy4KKworPj4+IGl0ZW0gPSBpdC5uZXh0KCkKKworCisKK1RoaXMgdGVzdCBsZWFrZWQgYXQgb25lIHBvaW50IGR1ZSB0byBnZW5lcmF0b3IgZmluYWxpemF0aW9uL2Rlc3RydWN0aW9uLgorSXQgd2FzIGNvcGllZCBmcm9tIExpYi90ZXN0L2xlYWtlcnMvdGVzdF9nZW5lcmF0b3JfY3ljbGUucHkgYmVmb3JlIHRoZSBmaWxlCit3YXMgcmVtb3ZlZC4KKworPj4+IGRlZiBsZWFrKCk6CisuLi4gICAgZGVmIGdlbigpOgorLi4uICAgICAgICB3aGlsZSBUcnVlOgorLi4uICAgICAgICAgICAgeWllbGQgZworLi4uICAgIGcgPSBnZW4oKQorCis+Pj4gbGVhaygpCisKKworCitUaGlzIHRlc3QgaXNuJ3QgcmVhbGx5IGdlbmVyYXRvciByZWxhdGVkLCBidXQgcmF0aGVyIGV4Y2VwdGlvbi1pbi1jbGVhbnVwCityZWxhdGVkLiBUaGUgY29yb3V0aW5lIHRlc3RzIChhYm92ZSkganVzdCBoYXBwZW4gdG8gY2F1c2UgYW4gZXhjZXB0aW9uIGluCit0aGUgZ2VuZXJhdG9yJ3MgX19kZWxfXyAodHBfZGVsKSBtZXRob2QuIFdlIGNhbiBhbHNvIHRlc3QgZm9yIHRoaXMKK2V4cGxpY2l0bHksIHdpdGhvdXQgZ2VuZXJhdG9ycy4gV2UgZG8gaGF2ZSB0byByZWRpcmVjdCBzdGRlcnIgdG8gYXZvaWQKK3ByaW50aW5nIHdhcm5pbmdzIGFuZCB0byBkb3VibGVjaGVjayB0aGF0IHdlIGFjdHVhbGx5IHRlc3RlZCB3aGF0IHdlIHdhbnRlZAordG8gdGVzdC4KKworPj4+IGltcG9ydCBzeXMsIFN0cmluZ0lPCis+Pj4gb2xkID0gc3lzLnN0ZGVycgorPj4+IHRyeToKKy4uLiAgICAgc3lzLnN0ZGVyciA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKy4uLiAgICAgY2xhc3MgTGVha2VyOgorLi4uICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisuLi4gICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisuLi4KKy4uLiAgICAgbCA9IExlYWtlcigpCisuLi4gICAgIGRlbCBsCisuLi4gICAgIGVyciA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKS5zdHJpcCgpCisuLi4gICAgIGVyci5zdGFydHN3aXRoKAorLi4uICAgICAgICAgIkV4Y2VwdGlvbiBSdW50aW1lRXJyb3I6IFJ1bnRpbWVFcnJvcigpIGluIDwiCisuLi4gICAgICkKKy4uLiAgICAgZXJyLmVuZHN3aXRoKCI+IGlnbm9yZWQiKQorLi4uICAgICBsZW4oZXJyLnNwbGl0bGluZXMoKSkKKy4uLiBmaW5hbGx5OgorLi4uICAgICBzeXMuc3RkZXJyID0gb2xkCitUcnVlCitUcnVlCisxCisKKworCitUaGVzZSByZWZsZWFrIHRlc3RzIHNob3VsZCBwZXJoYXBzIGJlIGluIGEgdGVzdGZpbGUgb2YgdGhlaXIgb3duLAordGVzdF9nZW5lcmF0b3JzIGp1c3QgaGFwcGVuZWQgdG8gYmUgdGhlIHRlc3QgdGhhdCBkcmV3IHRoZXNlIG91dC4KKworIiIiCisKK19fdGVzdF9fID0geyJ0dXQiOiAgICAgIHR1dG9yaWFsX3Rlc3RzLAorICAgICAgICAgICAgInBlcCI6ICAgICAgcGVwX3Rlc3RzLAorICAgICAgICAgICAgImVtYWlsIjogICAgZW1haWxfdGVzdHMsCisgICAgICAgICAgICAiZnVuIjogICAgICBmdW5fdGVzdHMsCisgICAgICAgICAgICAic3ludGF4IjogICBzeW50YXhfdGVzdHMsCisgICAgICAgICAgICAiY29uam9pbiI6ICBjb25qb2luX3Rlc3RzLAorICAgICAgICAgICAgIndlYWtyZWYiOiAgd2Vha3JlZl90ZXN0cywKKyAgICAgICAgICAgICJjb3JvdXRpbmUiOiAgY29yb3V0aW5lX3Rlc3RzLAorICAgICAgICAgICAgInJlZmxlYWtzIjogcmVmbGVha3NfdGVzdHMsCisgICAgICAgICAgICB9CisKKyMgTWFnaWMgdGVzdCBuYW1lIHRoYXQgcmVncnRlc3QucHkgaW52b2tlcyAqYWZ0ZXIqIGltcG9ydGluZyB0aGlzIG1vZHVsZS4KKyMgVGhpcyB3b3JtcyBhcm91bmQgYSBib290c3RyYXAgcHJvYmxlbS4KKyMgTm90ZSB0aGF0IGRvY3Rlc3QgYW5kIHJlZ3J0ZXN0IGJvdGggbG9vayBpbiBzeXMuYXJndiBmb3IgYSAiLXYiIGFyZ3VtZW50LAorIyBzbyB0aGlzIHdvcmtzIGFzIGV4cGVjdGVkIGluIGJvdGggd2F5cyBvZiBydW5uaW5nIHJlZ3J0ZXN0LgorZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCB0ZXN0X2dlbmVyYXRvcnMKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9nZW5lcmF0b3JzLCB2ZXJib3NlKQorCisjIFRoaXMgcGFydCBpc24ndCBuZWVkZWQgZm9yIHJlZ3J0ZXN0LCBidXQgZm9yIHJ1bm5pbmcgdGhlIHRlc3QgZGlyZWN0bHkuCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigxKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjM3NGFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWRmOTBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTc1YjU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkKQEAgLTAsMCArMSwyNTYgQEAKKyIiIgorVGVzdHMgY29tbW9uIHRvIGdlbmVyaWNwYXRoLCBtYWNwYXRoLCBudHBhdGggYW5kIHBvc2l4cGF0aAorIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBvcworaW1wb3J0IGdlbmVyaWNwYXRoCitpbXBvcnQgc3lzCisKKworZGVmIHNhZmVfcm1kaXIoZGlybmFtZSk6CisgICAgdHJ5OgorICAgICAgICBvcy5ybWRpcihkaXJuYW1lKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBwYXNzCisKKworY2xhc3MgR2VuZXJpY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGhlIHBhdGggbW9kdWxlIHRvIGJlIHRlc3RlZAorICAgIHBhdGhtb2R1bGUgPSBnZW5lcmljcGF0aAorICAgIGNvbW1vbl9hdHRyaWJ1dGVzID0gWydjb21tb25wcmVmaXgnLCAnZ2V0c2l6ZScsICdnZXRhdGltZScsICdnZXRjdGltZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2dldG10aW1lJywgJ2V4aXN0cycsICdpc2RpcicsICdpc2ZpbGUnXQorICAgIGF0dHJpYnV0ZXMgPSBbXQorCisgICAgZGVmIHRlc3Rfbm9fYXJndW1lbnQoc2VsZik6CisgICAgICAgIGZvciBhdHRyIGluIHNlbGYuY29tbW9uX2F0dHJpYnV0ZXMgKyBzZWxmLmF0dHJpYnV0ZXM6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICAgICAgZ2V0YXR0cihzZWxmLnBhdGhtb2R1bGUsIGF0dHIpKCkKKyAgICAgICAgICAgICAgICByYWlzZSBzZWxmLmZhaWwoInt9Lnt9KCkgZGlkIG5vdCByYWlzZSBhIFR5cGVFcnJvciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChzZWxmLnBhdGhtb2R1bGUuX19uYW1lX18sIGF0dHIpKQorCisgICAgZGVmIHRlc3RfY29tbW9ucHJlZml4KHNlbGYpOgorICAgICAgICBjb21tb25wcmVmaXggPSBzZWxmLnBhdGhtb2R1bGUuY29tbW9ucHJlZml4CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb21tb25wcmVmaXgoW10pLAorICAgICAgICAgICAgIiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29tbW9ucHJlZml4KFsiL2hvbWUvc3dlbnNvbi9zcGFtIiwgIi9ob21lL3N3ZW4vc3BhbSJdKSwKKyAgICAgICAgICAgICIvaG9tZS9zd2VuIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb21tb25wcmVmaXgoWyIvaG9tZS9zd2VuL3NwYW0iLCAiL2hvbWUvc3dlbi9lZ2dzIl0pLAorICAgICAgICAgICAgIi9ob21lL3N3ZW4vIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb21tb25wcmVmaXgoWyIvaG9tZS9zd2VuL3NwYW0iLCAiL2hvbWUvc3dlbi9zcGFtIl0pLAorICAgICAgICAgICAgIi9ob21lL3N3ZW4vc3BhbSIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29tbW9ucHJlZml4KFsiaG9tZTpzd2Vuc29uOnNwYW0iLCAiaG9tZTpzd2VuOnNwYW0iXSksCisgICAgICAgICAgICAiaG9tZTpzd2VuIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb21tb25wcmVmaXgoWyI6aG9tZTpzd2VuOnNwYW0iLCAiOmhvbWU6c3dlbjplZ2dzIl0pLAorICAgICAgICAgICAgIjpob21lOnN3ZW46IgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb21tb25wcmVmaXgoWyI6aG9tZTpzd2VuOnNwYW0iLCAiOmhvbWU6c3dlbjpzcGFtIl0pLAorICAgICAgICAgICAgIjpob21lOnN3ZW46c3BhbSIKKyAgICAgICAgKQorCisgICAgICAgIHRlc3RsaXN0ID0gWycnLCAnYWJjJywgJ1hiY2QnLCAnWGInLCAnWFknLCAnYWJjZCcsCisgICAgICAgICAgICAgICAgICAgICdhWGMnLCAnYWJkJywgJ2FiJywgJ2FYJywgJ2FiY1gnXQorICAgICAgICBmb3IgczEgaW4gdGVzdGxpc3Q6CisgICAgICAgICAgICBmb3IgczIgaW4gdGVzdGxpc3Q6CisgICAgICAgICAgICAgICAgcCA9IGNvbW1vbnByZWZpeChbczEsIHMyXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoczEuc3RhcnRzd2l0aChwKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoczIuc3RhcnRzd2l0aChwKSkKKyAgICAgICAgICAgICAgICBpZiBzMSAhPSBzMjoKKyAgICAgICAgICAgICAgICAgICAgbiA9IGxlbihwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHMxW246bisxXSwgczJbbjpuKzFdKQorCisgICAgZGVmIHRlc3RfZ2V0c2l6ZShzZWxmKToKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiZm9vIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhdGhtb2R1bGUuZ2V0c2l6ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgMykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlZDoKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X3RpbWUoc2VsZik6CisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJhYiIpCisgICAgICAgICAgICBmLndyaXRlKCJiYXIiKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKQorICAgICAgICAgICAgZCA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgImZvb2JhciIpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKAorICAgICAgICAgICAgICAgIHNlbGYucGF0aG1vZHVsZS5nZXRjdGltZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwKKyAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuZ2V0bXRpbWUodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgICkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlZDoKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2V4aXN0cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuZXhpc3RzKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiZm9vIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuZXhpc3RzKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBUcnVlKQorICAgICAgICAgICAgaWYgbm90IHNlbGYucGF0aG1vZHVsZSA9PSBnZW5lcmljcGF0aDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5sZXhpc3RzKHRlc3Rfc3VwcG9ydC5URVNURk4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9pc2RpcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNkaXIodGVzdF9zdXBwb3J0LlRFU1RGTiksIEZhbHNlKQorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJmb28iKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCisgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIG9zLm1rZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgVHJ1ZSkKKyAgICAgICAgICAgIG9zLnJtZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgc2FmZV9ybWRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfaXNmaWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiksIEZhbHNlKQorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJmb28iKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiksIFRydWUpCisgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIG9zLm1rZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYucGF0aG1vZHVsZS5pc2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiksIEZhbHNlKQorICAgICAgICAgICAgb3Mucm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBzYWZlX3JtZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKworIyBGb2xsb3dpbmcgVGVzdENhc2UgaXMgbm90IHN1cHBvc2VkIHRvIGJlIHJ1biBmcm9tIHRlc3RfZ2VuZXJpY3BhdGguCisjIEl0IGlzIGluaGVyaXRlZCBieSBvdGhlciB0ZXN0IG1vZHVsZXMgKG1hY3BhdGgsIG50cGF0aCwgcG9zaXhwYXRoKS4KKworY2xhc3MgQ29tbW9uVGVzdChHZW5lcmljVGVzdCk6CisgICAgIyBUaGUgcGF0aCBtb2R1bGUgdG8gYmUgdGVzdGVkCisgICAgcGF0aG1vZHVsZSA9IE5vbmUKKyAgICBjb21tb25fYXR0cmlidXRlcyA9IEdlbmVyaWNUZXN0LmNvbW1vbl9hdHRyaWJ1dGVzICsgWworICAgICAgICAjIFByb3BlcnRpZXMKKyAgICAgICAgJ2N1cmRpcicsICdwYXJkaXInLCAnZXh0c2VwJywgJ3NlcCcsCisgICAgICAgICdwYXRoc2VwJywgJ2RlZnBhdGgnLCAnYWx0c2VwJywgJ2Rldm51bGwnLAorICAgICAgICAjIE1ldGhvZHMKKyAgICAgICAgJ25vcm1jYXNlJywgJ3NwbGl0ZHJpdmUnLCAnZXhwYW5kdmFycycsICdub3JtcGF0aCcsICdhYnNwYXRoJywKKyAgICAgICAgJ2pvaW4nLCAnc3BsaXQnLCAnc3BsaXRleHQnLCAnaXNhYnMnLCAnYmFzZW5hbWUnLCAnZGlybmFtZScsCisgICAgICAgICdsZXhpc3RzJywgJ2lzbGluaycsICdpc21vdW50JywgJ2V4cGFuZHVzZXInLCAnbm9ybXBhdGgnLCAncmVhbHBhdGgnLAorICAgIF0KKworICAgIGRlZiB0ZXN0X25vcm1jYXNlKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgbm9ybWNhc2UoKSBpcyBpZGVtcG90ZW50CisgICAgICAgIHAgPSAiRm9PLy4vQmFSIgorICAgICAgICBwID0gc2VsZi5wYXRobW9kdWxlLm5vcm1jYXNlKHApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgc2VsZi5wYXRobW9kdWxlLm5vcm1jYXNlKHApKQorCisgICAgZGVmIHRlc3Rfc3BsaXRkcml2ZShzZWxmKToKKyAgICAgICAgIyBzcGxpdGRyaXZlIGZvciBub24tTlQgcGF0aHMKKyAgICAgICAgc3BsaXRkcml2ZSA9IHNlbGYucGF0aG1vZHVsZS5zcGxpdGRyaXZlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRkcml2ZSgiL2Zvby9iYXIiKSwgKCIiLCAiL2Zvby9iYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGRyaXZlKCJmb286YmFyIiksICgiIiwgImZvbzpiYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGRyaXZlKCI6Zm9vOmJhciIpLCAoIiIsICI6Zm9vOmJhciIpKQorCisgICAgZGVmIHRlc3RfZXhwYW5kdmFycyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wYXRobW9kdWxlLl9fbmFtZV9fID09ICdtYWNwYXRoJzoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ21hY3BhdGguZXhwYW5kdmFycyBpcyBhIHN0dWInKQorICAgICAgICBleHBhbmR2YXJzID0gc2VsZi5wYXRobW9kdWxlLmV4cGFuZHZhcnMKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudjoKKyAgICAgICAgICAgIGVudi5jbGVhcigpCisgICAgICAgICAgICBlbnZbImZvbyJdID0gImJhciIKKyAgICAgICAgICAgIGVudlsie2ZvbyJdID0gImJhejEiCisgICAgICAgICAgICBlbnZbIntmb299Il0gPSAiYmF6MiIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiZm9vIiksICJmb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmR2YXJzKCIkZm9vIGJhciIpLCAiYmFyIGJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGFuZHZhcnMoIiR7Zm9vfWJhciIpLCAiYmFyYmFyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiJFtmb29dYmFyIiksICIkW2Zvb11iYXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmR2YXJzKCIkYmFyIGJhciIpLCAiJGJhciBiYXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmR2YXJzKCIkP2JhciIpLCAiJD9iYXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmR2YXJzKCIke2Zvb31iYXIiKSwgImJhcmJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGFuZHZhcnMoIiRmb299YmFyIiksICJiYXJ9YmFyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiJHtmb28iKSwgIiR7Zm9vIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiJHt7Zm9vfX0iKSwgImJhejF9IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiJGZvbyRmb28iKSwgImJhcmJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGFuZHZhcnMoIiRiYXIkYmFyIiksICIkYmFyJGJhciIpCisKKyAgICBkZWYgdGVzdF9hYnNwYXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEluKCJmb28iLCBzZWxmLnBhdGhtb2R1bGUuYWJzcGF0aCgiZm9vIikpCisKKyAgICAgICAgIyBBYnNwYXRoIHJldHVybnMgYnl0ZXMgd2hlbiB0aGUgYXJnIGlzIGJ5dGVzCisgICAgICAgIGZvciBwYXRoIGluICgnJywgJ2ZvbycsICdmXHhmMlx4ZjInLCAnL2ZvbycsICdDOlxcJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5wYXRobW9kdWxlLmFic3BhdGgocGF0aCksIHN0cikKKworICAgIGRlZiB0ZXN0X3JlYWxwYXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEluKCJmb28iLCBzZWxmLnBhdGhtb2R1bGUucmVhbHBhdGgoImZvbyIpKQorCisgICAgZGVmIHRlc3Rfbm9ybXBhdGhfaXNzdWU1ODI3KHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBub3JtcGF0aCBwcmVzZXJ2ZXMgdW5pY29kZQorICAgICAgICBmb3IgcGF0aCBpbiAodScnLCB1Jy4nLCB1Jy8nLCB1J1xcJywgdScvLy9mb28vLi8vYmFyLy8nKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLnBhdGhtb2R1bGUubm9ybXBhdGgocGF0aCksIHVuaWNvZGUpCisKKyAgICBkZWYgdGVzdF9hYnNwYXRoX2lzc3VlMzQyNihzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGFic3BhdGggcmV0dXJucyB1bmljb2RlIHdoZW4gdGhlIGFyZyBpcyB1bmljb2RlCisgICAgICAgICMgd2l0aCBib3RoIEFTQ0lJIGFuZCBub24tQVNDSUkgY3dkcy4KKyAgICAgICAgYWJzcGF0aCA9IHNlbGYucGF0aG1vZHVsZS5hYnNwYXRoCisgICAgICAgIGZvciBwYXRoIGluICh1JycsIHUnZnV1JywgdSdmXHhmOVx4ZjknLCB1Jy9mdXUnLCB1J1U6XFwnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShhYnNwYXRoKHBhdGgpLCB1bmljb2RlKQorCisgICAgICAgIHVuaWN3ZCA9IHUnXHhlN3dceGYwJworICAgICAgICB0cnk6CisgICAgICAgICAgICBmc2VuY29kaW5nID0gdGVzdF9zdXBwb3J0LlRFU1RGTl9FTkNPRElORyBvciAiYXNjaWkiCisgICAgICAgICAgICB1bmljd2QuZW5jb2RlKGZzZW5jb2RpbmcpCisgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFVuaWNvZGVFbmNvZGVFcnJvcik6CisgICAgICAgICAgICAjIEZTIGVuY29kaW5nIGlzIHByb2JhYmx5IEFTQ0lJCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50ZW1wX2N3ZCh1bmljd2QpOgorICAgICAgICAgICAgICAgIGZvciBwYXRoIGluICh1JycsIHUnZnV1JywgdSdmXHhmOVx4ZjknLCB1Jy9mdXUnLCB1J1U6XFwnKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGFic3BhdGgocGF0aCksIHVuaWNvZGUpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJywKKyAgICAgICAgIk1hYyBPUyBYIGRlbmllcyB0aGUgY3JlYXRpb24gb2YgYSBkaXJlY3Rvcnkgd2l0aCBhbiBpbnZhbGlkIHV0ZjggbmFtZSIpCisgICAgZGVmIHRlc3Rfbm9uYXNjaWlfYWJzcGF0aChzZWxmKToKKyAgICAgICAgIyBUZXN0IG5vbi1BU0NJSSwgbm9uLVVURjggYnl0ZXMgaW4gdGhlIHBhdGguCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRlbXBfY3dkKCdceGU3d1x4ZjAnKToKKyAgICAgICAgICAgIHNlbGYudGVzdF9hYnNwYXRoKCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChHZW5lcmljVGVzdCkKKworCitpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODJlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ODJlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXhwcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmV4cHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1OTNhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmV4cHMucHkKQEAgLTAsMCArMSwyODMgQEAKK2RvY3Rlc3RzID0gIiIiCisKK1Rlc3Qgc2ltcGxlIGxvb3Agd2l0aCBjb25kaXRpb25hbAorCisgICAgPj4+IHN1bShpKmkgZm9yIGkgaW4gcmFuZ2UoMTAwKSBpZiBpJjEgPT0gMSkKKyAgICAxNjY2NTAKKworVGVzdCBzaW1wbGUgbmVzdGluZworCisgICAgPj4+IGxpc3QoKGksaikgZm9yIGkgaW4gcmFuZ2UoMykgZm9yIGogaW4gcmFuZ2UoNCkgKQorICAgIFsoMCwgMCksICgwLCAxKSwgKDAsIDIpLCAoMCwgMyksICgxLCAwKSwgKDEsIDEpLCAoMSwgMiksICgxLCAzKSwgKDIsIDApLCAoMiwgMSksICgyLCAyKSwgKDIsIDMpXQorCitUZXN0IG5lc3Rpbmcgd2l0aCB0aGUgaW5uZXIgZXhwcmVzc2lvbiBkZXBlbmRlbnQgb24gdGhlIG91dGVyCisKKyAgICA+Pj4gbGlzdCgoaSxqKSBmb3IgaSBpbiByYW5nZSg0KSBmb3IgaiBpbiByYW5nZShpKSApCisgICAgWygxLCAwKSwgKDIsIDApLCAoMiwgMSksICgzLCAwKSwgKDMsIDEpLCAoMywgMildCisKK01ha2Ugc3VyZSB0aGUgaW5kdWN0aW9uIHZhcmlhYmxlIGlzIG5vdCBleHBvc2VkCisKKyAgICA+Pj4gaSA9IDIwCisgICAgPj4+IHN1bShpKmkgZm9yIGkgaW4gcmFuZ2UoMTAwKSkKKyAgICAzMjgzNTAKKyAgICA+Pj4gaQorICAgIDIwCisKK1Rlc3QgZmlyc3QgY2xhc3MKKworICAgID4+PiBnID0gKGkqaSBmb3IgaSBpbiByYW5nZSg0KSkKKyAgICA+Pj4gdHlwZShnKQorICAgIDx0eXBlICdnZW5lcmF0b3InPgorICAgID4+PiBsaXN0KGcpCisgICAgWzAsIDEsIDQsIDldCisKK1Rlc3QgZGlyZWN0IGNhbGxzIHRvIG5leHQoKQorCisgICAgPj4+IGcgPSAoaSppIGZvciBpIGluIHJhbmdlKDMpKQorICAgID4+PiBnLm5leHQoKQorICAgIDAKKyAgICA+Pj4gZy5uZXh0KCkKKyAgICAxCisgICAgPj4+IGcubmV4dCgpCisgICAgNAorICAgID4+PiBnLm5leHQoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIEZpbGUgIjxweXNoZWxsIzIxPiIsIGxpbmUgMSwgaW4gLXRvcGxldmVsLQorICAgICAgICBnLm5leHQoKQorICAgIFN0b3BJdGVyYXRpb24KKworRG9lcyBpdCBzdGF5IHN0b3BwZWQ/CisKKyAgICA+Pj4gZy5uZXh0KCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICBGaWxlICI8cHlzaGVsbCMyMT4iLCBsaW5lIDEsIGluIC10b3BsZXZlbC0KKyAgICAgICAgZy5uZXh0KCkKKyAgICBTdG9wSXRlcmF0aW9uCisgICAgPj4+IGxpc3QoZykKKyAgICBbXQorCitUZXN0IHJ1bm5pbmcgZ2VuIHdoZW4gZGVmaW5pbmcgZnVuY3Rpb24gaXMgb3V0IG9mIHNjb3BlCisKKyAgICA+Pj4gZGVmIGYobik6CisgICAgLi4uICAgICByZXR1cm4gKGkqaSBmb3IgaSBpbiB4cmFuZ2UobikpCisgICAgPj4+IGxpc3QoZigxMCkpCisgICAgWzAsIDEsIDQsIDksIDE2LCAyNSwgMzYsIDQ5LCA2NCwgODFdCisKKyAgICA+Pj4gZGVmIGYobik6CisgICAgLi4uICAgICByZXR1cm4gKChpLGopIGZvciBpIGluIHhyYW5nZSgzKSBmb3IgaiBpbiB4cmFuZ2UobikpCisgICAgPj4+IGxpc3QoZig0KSkKKyAgICBbKDAsIDApLCAoMCwgMSksICgwLCAyKSwgKDAsIDMpLCAoMSwgMCksICgxLCAxKSwgKDEsIDIpLCAoMSwgMyksICgyLCAwKSwgKDIsIDEpLCAoMiwgMiksICgyLCAzKV0KKyAgICA+Pj4gZGVmIGYobik6CisgICAgLi4uICAgICByZXR1cm4gKChpLGopIGZvciBpIGluIHhyYW5nZSgzKSBmb3IgaiBpbiB4cmFuZ2UoNCkgaWYgaiBpbiB4cmFuZ2UobikpCisgICAgPj4+IGxpc3QoZig0KSkKKyAgICBbKDAsIDApLCAoMCwgMSksICgwLCAyKSwgKDAsIDMpLCAoMSwgMCksICgxLCAxKSwgKDEsIDIpLCAoMSwgMyksICgyLCAwKSwgKDIsIDEpLCAoMiwgMiksICgyLCAzKV0KKyAgICA+Pj4gbGlzdChmKDIpKQorICAgIFsoMCwgMCksICgwLCAxKSwgKDEsIDApLCAoMSwgMSksICgyLCAwKSwgKDIsIDEpXQorCitWZXJpZnkgdGhhdCBwYXJlbnRoZXNpcyBhcmUgcmVxdWlyZWQgaW4gYSBzdGF0ZW1lbnQKKworICAgID4+PiBkZWYgZihuKToKKyAgICAuLi4gICAgIHJldHVybiBpKmkgZm9yIGkgaW4geHJhbmdlKG4pCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgIC4uLgorICAgIFN5bnRheEVycm9yOiBpbnZhbGlkIHN5bnRheAorCitWZXJpZnkgdGhhdCBwYXJlbnRoZXNpcyBhcmUgcmVxdWlyZWQgd2hlbiB1c2VkIGFzIGEga2V5d29yZCBhcmd1bWVudCB2YWx1ZQorCisgICAgPj4+IGRpY3QoYSA9IGkgZm9yIGkgaW4geHJhbmdlKDEwKSkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgLi4uCisgICAgU3ludGF4RXJyb3I6IGludmFsaWQgc3ludGF4CisKK1ZlcmlmeSB0aGF0IHBhcmVudGhlc2lzIGFyZSByZXF1aXJlZCB3aGVuIHVzZWQgYXMgYSBrZXl3b3JkIGFyZ3VtZW50IHZhbHVlCisKKyAgICA+Pj4gZGljdChhID0gKGkgZm9yIGkgaW4geHJhbmdlKDEwKSkpICNkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICB7J2EnOiA8Z2VuZXJhdG9yIG9iamVjdCA8Z2VuZXhwcj4gYXQgLi4uPn0KKworVmVyaWZ5IGVhcmx5IGJpbmRpbmcgZm9yIHRoZSBvdXRlcm1vc3QgZm9yLWV4cHJlc3Npb24KKworICAgID4+PiB4PTEwCisgICAgPj4+IGcgPSAoaSppIGZvciBpIGluIHJhbmdlKHgpKQorICAgID4+PiB4ID0gNQorICAgID4+PiBsaXN0KGcpCisgICAgWzAsIDEsIDQsIDksIDE2LCAyNSwgMzYsIDQ5LCA2NCwgODFdCisKK1ZlcmlmeSB0aGF0IHRoZSBvdXRlcm1vc3QgZm9yLWV4cHJlc3Npb24gbWFrZXMgYW4gaW1tZWRpYXRlIGNoZWNrCitmb3IgaXRlcmFiaWxpdHkKKworICAgID4+PiAoaSBmb3IgaSBpbiA2KQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIEZpbGUgIjxweXNoZWxsIzQ+IiwgbGluZSAxLCBpbiAtdG9wbGV2ZWwtCisgICAgICAgIChpIGZvciBpIGluIDYpCisgICAgVHlwZUVycm9yOiAnaW50JyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlCisKK1ZlcmlmeSBsYXRlIGJpbmRpbmcgZm9yIHRoZSBvdXRlcm1vc3QgaWYtZXhwcmVzc2lvbgorCisgICAgPj4+IGluY2x1ZGUgPSAoMiw0LDYsOCkKKyAgICA+Pj4gZyA9IChpKmkgZm9yIGkgaW4gcmFuZ2UoMTApIGlmIGkgaW4gaW5jbHVkZSkKKyAgICA+Pj4gaW5jbHVkZSA9ICgxLDMsNSw3LDkpCisgICAgPj4+IGxpc3QoZykKKyAgICBbMSwgOSwgMjUsIDQ5LCA4MV0KKworVmVyaWZ5IGxhdGUgYmluZGluZyBmb3IgdGhlIGlubmVybW9zdCBmb3ItZXhwcmVzc2lvbgorCisgICAgPj4+IGcgPSAoKGksaikgZm9yIGkgaW4gcmFuZ2UoMykgZm9yIGogaW4gcmFuZ2UoeCkpCisgICAgPj4+IHggPSA0CisgICAgPj4+IGxpc3QoZykKKyAgICBbKDAsIDApLCAoMCwgMSksICgwLCAyKSwgKDAsIDMpLCAoMSwgMCksICgxLCAxKSwgKDEsIDIpLCAoMSwgMyksICgyLCAwKSwgKDIsIDEpLCAoMiwgMiksICgyLCAzKV0KKworVmVyaWZ5IHJlLXVzZSBvZiB0dXBsZXMgKGEgc2lkZSBiZW5lZml0IG9mIHVzaW5nIGdlbmV4cHMgb3ZlciBsaXN0Y29tcHMpCisKKyAgICA+Pj4gdHVwbGVpZHMgPSBtYXAoaWQsICgoaSxpKSBmb3IgaSBpbiB4cmFuZ2UoMTApKSkKKyAgICA+Pj4gaW50KG1heCh0dXBsZWlkcykgLSBtaW4odHVwbGVpZHMpKQorICAgIDAKKworVmVyaWZ5IHRoYXQgc3ludGF4IGVycm9yJ3MgYXJlIHJhaXNlZCBmb3IgZ2VuZXhwcyB1c2VkIGFzIGx2YWx1ZXMKKworICAgID4+PiAoeSBmb3IgeSBpbiAoMSwyKSkgPSAxMAorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAuLi4KKyAgICAgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9nZW5leHBzLl9fdGVzdF9fLmRvY3Rlc3RzWzQwXT4iLCBsaW5lIDEKKyAgICBTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGdlbmVyYXRvciBleHByZXNzaW9uCisKKyAgICA+Pj4gKHkgZm9yIHkgaW4gKDEsMikpICs9IDEwCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgIC4uLgorICAgICAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmV4cHMuX190ZXN0X18uZG9jdGVzdHNbNDFdPiIsIGxpbmUgMQorICAgIFN5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gZ2VuZXJhdG9yIGV4cHJlc3Npb24KKworCisjIyMjIyMjIyMjIyBUZXN0cyBib3Jyb3dlZCBmcm9tIG9yIGluc3BpcmVkIGJ5IHRlc3RfZ2VuZXJhdG9ycy5weSAjIyMjIyMjIyMjIyMKKworTWFrZSBhIGdlbmVyYXRvciB0aGF0IGFjdHMgbGlrZSByYW5nZSgpCisKKyAgICA+Pj4geXJhbmdlID0gbGFtYmRhIG46ICAoaSBmb3IgaSBpbiB4cmFuZ2UobikpCisgICAgPj4+IGxpc3QoeXJhbmdlKDEwKSkKKyAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KKworR2VuZXJhdG9ycyBhbHdheXMgcmV0dXJuIHRvIHRoZSBtb3N0IHJlY2VudCBjYWxsZXI6CisKKyAgICA+Pj4gZGVmIGNyZWF0b3IoKToKKyAgICAuLi4gICAgIHIgPSB5cmFuZ2UoNSkKKyAgICAuLi4gICAgIHByaW50ICJjcmVhdG9yIiwgci5uZXh0KCkKKyAgICAuLi4gICAgIHJldHVybiByCisgICAgPj4+IGRlZiBjYWxsZXIoKToKKyAgICAuLi4gICAgIHIgPSBjcmVhdG9yKCkKKyAgICAuLi4gICAgIGZvciBpIGluIHI6CisgICAgLi4uICAgICAgICAgICAgIHByaW50ICJjYWxsZXIiLCBpCisgICAgPj4+IGNhbGxlcigpCisgICAgY3JlYXRvciAwCisgICAgY2FsbGVyIDEKKyAgICBjYWxsZXIgMgorICAgIGNhbGxlciAzCisgICAgY2FsbGVyIDQKKworR2VuZXJhdG9ycyBjYW4gY2FsbCBvdGhlciBnZW5lcmF0b3JzOgorCisgICAgPj4+IGRlZiB6cmFuZ2Uobik6CisgICAgLi4uICAgICBmb3IgaSBpbiB5cmFuZ2Uobik6CisgICAgLi4uICAgICAgICAgeWllbGQgaQorICAgID4+PiBsaXN0KHpyYW5nZSg1KSkKKyAgICBbMCwgMSwgMiwgMywgNF0KKworCitWZXJpZnkgdGhhdCBhIGdlbiBleHAgY2Fubm90IGJlIHJlc3VtZWQgd2hpbGUgaXQgaXMgYWN0aXZlbHkgcnVubmluZzoKKworICAgID4+PiBnID0gKG1lLm5leHQoKSBmb3IgaSBpbiB4cmFuZ2UoMTApKQorICAgID4+PiBtZSA9IGcKKyAgICA+Pj4gbWUubmV4dCgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgRmlsZSAiPHB5c2hlbGwjMzA+IiwgbGluZSAxLCBpbiAtdG9wbGV2ZWwtCisgICAgICAgIG1lLm5leHQoKQorICAgICAgRmlsZSAiPHB5c2hlbGwjMjg+IiwgbGluZSAxLCBpbiA8Z2VuZXJhdG9yIGV4cHJlc3Npb24+CisgICAgICAgIGcgPSAobWUubmV4dCgpIGZvciBpIGluIHhyYW5nZSgxMCkpCisgICAgVmFsdWVFcnJvcjogZ2VuZXJhdG9yIGFscmVhZHkgZXhlY3V0aW5nCisKK1ZlcmlmeSBleGNlcHRpb24gcHJvcGFnYXRpb24KKworICAgID4+PiBnID0gKDEwIC8vIGkgZm9yIGkgaW4gKDUsIDAsIDIpKQorICAgID4+PiBnLm5leHQoKQorICAgIDIKKyAgICA+Pj4gZy5uZXh0KCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICBGaWxlICI8cHlzaGVsbCMzNz4iLCBsaW5lIDEsIGluIC10b3BsZXZlbC0KKyAgICAgICAgZy5uZXh0KCkKKyAgICAgIEZpbGUgIjxweXNoZWxsIzM1PiIsIGxpbmUgMSwgaW4gPGdlbmVyYXRvciBleHByZXNzaW9uPgorICAgICAgICBnID0gKDEwIC8vIGkgZm9yIGkgaW4gKDUsIDAsIDIpKQorICAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCisgICAgPj4+IGcubmV4dCgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgRmlsZSAiPHB5c2hlbGwjMzg+IiwgbGluZSAxLCBpbiAtdG9wbGV2ZWwtCisgICAgICAgIGcubmV4dCgpCisgICAgU3RvcEl0ZXJhdGlvbgorCitNYWtlIHN1cmUgdGhhdCBOb25lIGlzIGEgdmFsaWQgcmV0dXJuIHZhbHVlCisKKyAgICA+Pj4gbGlzdChOb25lIGZvciBpIGluIHhyYW5nZSgxMCkpCisgICAgW05vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmVdCisKK0NoZWNrIHRoYXQgZ2VuZXJhdG9yIGF0dHJpYnV0ZXMgYXJlIHByZXNlbnQKKworICAgID4+PiBnID0gKGkqaSBmb3IgaSBpbiByYW5nZSgzKSkKKyAgICA+Pj4gZXhwZWN0ZWQgPSBzZXQoWydnaV9mcmFtZScsICdnaV9ydW5uaW5nJywgJ25leHQnXSkKKyAgICA+Pj4gc2V0KGF0dHIgZm9yIGF0dHIgaW4gZGlyKGcpIGlmIG5vdCBhdHRyLnN0YXJ0c3dpdGgoJ19fJykpID49IGV4cGVjdGVkCisgICAgVHJ1ZQorCisgICAgPj4+IGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IEhBVkVfRE9DU1RSSU5HUworICAgID4+PiBwcmludChnLm5leHQuX19kb2NfXyBpZiBIQVZFX0RPQ1NUUklOR1MgZWxzZSAneC5uZXh0KCkgLT4gdGhlIG5leHQgdmFsdWUsIG9yIHJhaXNlIFN0b3BJdGVyYXRpb24nKQorICAgIHgubmV4dCgpIC0+IHRoZSBuZXh0IHZhbHVlLCBvciByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgPj4+IGltcG9ydCB0eXBlcworICAgID4+PiBpc2luc3RhbmNlKGcsIHR5cGVzLkdlbmVyYXRvclR5cGUpCisgICAgVHJ1ZQorCitDaGVjayB0aGUgX19pdGVyX18gc2xvdCBpcyBkZWZpbmVkIHRvIHJldHVybiBzZWxmCisKKyAgICA+Pj4gaXRlcihnKSBpcyBnCisgICAgVHJ1ZQorCitWZXJpZnkgdGhhdCB0aGUgcnVubmluZyBmbGFnIGlzIHNldCBwcm9wZXJseQorCisgICAgPj4+IGcgPSAobWUuZ2lfcnVubmluZyBmb3IgaSBpbiAoMCwxKSkKKyAgICA+Pj4gbWUgPSBnCisgICAgPj4+IG1lLmdpX3J1bm5pbmcKKyAgICAwCisgICAgPj4+IG1lLm5leHQoKQorICAgIDEKKyAgICA+Pj4gbWUuZ2lfcnVubmluZworICAgIDAKKworVmVyaWZ5IHRoYXQgZ2VuZXhwcyBhcmUgd2Vha2x5IHJlZmVyZW5jYWJsZQorCisgICAgPj4+IGltcG9ydCB3ZWFrcmVmCisgICAgPj4+IGcgPSAoaSppIGZvciBpIGluIHJhbmdlKDQpKQorICAgID4+PiB3ciA9IHdlYWtyZWYucmVmKGcpCisgICAgPj4+IHdyKCkgaXMgZworICAgIFRydWUKKyAgICA+Pj4gcCA9IHdlYWtyZWYucHJveHkoZykKKyAgICA+Pj4gbGlzdChwKQorICAgIFswLCAxLCA0LCA5XQorCisKKyIiIgorCisKK19fdGVzdF9fID0geydkb2N0ZXN0cycgOiBkb2N0ZXN0c30KKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIGltcG9ydCBzeXMKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9nZW5leHBzCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfZ2VuZXhwcywgdmVyYm9zZSkKKworICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfZ2VuZXhwcywgdmVyYm9zZSkKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBwcmludCBjb3VudHMKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXhwcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZW5leHBzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGUwM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXhwcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXhwcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZW5leHBzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGUwM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXhwcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0YXJncy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjNWFhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MucHkKQEAgLTAsMCArMSwzMSBAQAorIiIiCitUZXN0IHRoZSBpbnRlcm5hbCBnZXRhcmdzLmMgaW1wbGVtZW50YXRpb24KKworIFB5QXJnX1BhcnNlVHVwbGUoKSBpcyBkZWZpbmVkIGhlcmUuCisKK1RoZSB0ZXN0IGhlcmUgaXMgbm90IGludGVuZGVkIHRvIHRlc3QgYWxsIG9mIHRoZSBtb2R1bGUsIGp1c3QgdGhlCitzaW5nbGUgY2FzZSB0aGF0IGZhaWxlZCBiZXR3ZWVuIDIuMSBhbmQgMi4yYTIuCisiIiIKKworIyBtYXJzaGFsLmxvYWRzKCkgdXNlcyBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJzIzpsb2FkcyIpCisjIFRoZSBzIGNvZGUgd2lsbCBjYXVzZSBhIFVuaWNvZGUgY29udmVyc2lvbiB0byBvY2N1ci4gIFRoaXMgdGVzdAorIyB2ZXJpZnkgdGhhdCB0aGUgZXJyb3IgaXMgcHJvcGFnYXRlZCBwcm9wZXJseSBmcm9tIHRoZSBDIGNvZGUgYmFjayB0bworIyBQeXRob24uCisKK2ltcG9ydCBtYXJzaGFsCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIEdldEFyZ3NUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIElmIHRoZSBlbmNvZGluZyBzdWNjZWVkcyB1c2luZyB0aGUgY3VycmVudCBkZWZhdWx0IGVuY29kaW5nLAorICAgICMgdGhpcyB0ZXN0IHdpbGwgZmFpbCBiZWNhdXNlIGl0IGRvZXMgbm90IHRlc3QgdGhlIHJpZ2h0IHBhcnQgb2YgdGhlCisgICAgIyBQeUFyZ19QYXJzZVR1cGxlKCkgaW1wbGVtZW50YXRpb24uCisgICAgZGVmIHRlc3Rfd2l0aF9tYXJzaGFsKHNlbGYpOgorICAgICAgICBhcmcgPSB1bmljb2RlKHInXDIyMicsICd1bmljb2RlLWVzY2FwZScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgbWFyc2hhbC5sb2FkcywgYXJnKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChHZXRBcmdzVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0YXJncy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRhcmdzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzM1YWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0YXJncy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0YXJncy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRhcmdzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzM1YWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0YXJncy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0YXJnczIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRhcmdzMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDYyOTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKQEAgLTAsMCArMSwzMzUgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2tleXdvcmRzCitpbXBvcnQgd2FybmluZ3MKKworIiIiCis+IEhvdyBhYm91dCB0aGUgZm9sbG93aW5nIGNvdW50ZXJwcm9wb3NhbC4gVGhpcyBhbHNvIGNoYW5nZXMgc29tZSBvZgorPiB0aGUgb3RoZXIgZm9ybWF0IGNvZGVzIHRvIGJlIGEgbGl0dGxlIG1vcmUgcmVndWxhci4KKz4KKz4gQ29kZSBDIHR5cGUgUmFuZ2UgY2hlY2sKKz4KKz4gYiB1bnNpZ25lZCBjaGFyIDAuLlVDSEFSX01BWAorPiBoIHNpZ25lZCBzaG9ydCBTSFJUX01JTi4uU0hSVF9NQVgKKz4gQiB1bnNpZ25lZCBjaGFyIG5vbmUgKioKKz4gSCB1bnNpZ25lZCBzaG9ydCBub25lICoqCis+IGsgKiB1bnNpZ25lZCBsb25nIG5vbmUKKz4gSSAqIHVuc2lnbmVkIGludCAwLi5VSU5UX01BWAorCisKKz4gaSBpbnQgSU5UX01JTi4uSU5UX01BWAorPiBsIGxvbmcgTE9OR19NSU4uLkxPTkdfTUFYCisKKz4gSyAqIHVuc2lnbmVkIGxvbmcgbG9uZyBub25lCis+IEwgbG9uZyBsb25nIExMT05HX01JTi4uTExPTkdfTUFYCisKKz4gTm90ZXM6Cis+Cis+ICogTmV3IGZvcm1hdCBjb2Rlcy4KKz4KKz4gKiogQ2hhbmdlZCBmcm9tIHByZXZpb3VzICJyYW5nZS1hbmQtYS1oYWxmIiB0byAibm9uZSI7IHRoZQorPiByYW5nZS1hbmQtYS1oYWxmIGNoZWNraW5nIHdhc24ndCBwYXJ0aWN1bGFybHkgdXNlZnVsLgorCitQbHVzIGEgQyBBUEkgb3IgdHdvLCBlLmcuIFB5SW50X0FzTG9uZ01hc2soKSAtPgordW5zaWduZWQgbG9uZyBhbmQgUHlJbnRfQXNMb25nTG9uZ01hc2soKSAtPiB1bnNpZ25lZAorbG9uZyBsb25nIChpZiB0aGF0IGV4aXN0cykuCisiIiIKKworTEFSR0UgPSAweDdGRkZGRkZGCitWRVJZX0xBUkdFID0gMHhGRjAwMDAxMjEyMTIxMjEyMTIxMjEyNDJMCisKK2Zyb20gX3Rlc3RjYXBpIGltcG9ydCBVQ0hBUl9NQVgsIFVTSFJUX01BWCwgVUlOVF9NQVgsIFVMT05HX01BWCwgSU5UX01BWCwgXAorICAgICBJTlRfTUlOLCBMT05HX01JTiwgTE9OR19NQVgsIFBZX1NTSVpFX1RfTUlOLCBQWV9TU0laRV9UX01BWCwgXAorICAgICBTSFJUX01JTiwgU0hSVF9NQVgKKworIyBmYWtlLCB0aGV5IGFyZSBub3QgZGVmaW5lZCBpbiBQeXRob24ncyBoZWFkZXIgZmlsZXMKK0xMT05HX01BWCA9IDIqKjYzLTEKK0xMT05HX01JTiA9IC0yKio2MworVUxMT05HX01BWCA9IDIqKjY0LTEKKworY2xhc3MgTG9uZzoKKyAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDk5TAorCitjbGFzcyBJbnQ6CisgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgIHJldHVybiA5OQorCitjbGFzcyBVbnNpZ25lZF9UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYihzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfYgorICAgICAgICAjIGIgcmV0dXJucyAndW5zaWduZWQgY2hhcicsIGFuZCBkb2VzIHJhbmdlIGNoZWNraW5nICgwIC4uLiBVQ0hBUl9NQVgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19iLCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2IoTG9uZygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19iKEludCgpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2IsIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGFyZ3NfYigwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVQ0hBUl9NQVgsIGdldGFyZ3NfYihVQ0hBUl9NQVgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2IsIFVDSEFSX01BWCArIDEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19iKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19iKDQyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfYiwgVkVSWV9MQVJHRSkKKworICAgIGRlZiB0ZXN0X0Ioc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX0IKKyAgICAgICAgIyBCIHJldHVybnMgJ3Vuc2lnbmVkIGNoYXInLCBubyByYW5nZSBjaGVja2luZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfQiwgMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19CKExvbmcoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfQihJbnQoKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVQ0hBUl9NQVgsIGdldGFyZ3NfQigtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUNIQVJfTUFYLCBnZXRhcmdzX0IoLTFMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX0IoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUNIQVJfTUFYLCBnZXRhcmdzX0IoVUNIQVJfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX0IoVUNIQVJfTUFYKzEpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfQig0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfQig0MkwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVDSEFSX01BWCAmIFZFUllfTEFSR0UsIGdldGFyZ3NfQihWRVJZX0xBUkdFKSkKKworICAgIGRlZiB0ZXN0X0goc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX0gKKyAgICAgICAgIyBIIHJldHVybnMgJ3Vuc2lnbmVkIHNob3J0Jywgbm8gcmFuZ2UgY2hlY2tpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX0gsIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfSChMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX0goSW50KCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVVNIUlRfTUFYLCBnZXRhcmdzX0goLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGFyZ3NfSCgwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVU0hSVF9NQVgsIGdldGFyZ3NfSChVU0hSVF9NQVgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGFyZ3NfSChVU0hSVF9NQVgrMSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19IKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19IKDQyTCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChWRVJZX0xBUkdFICYgVVNIUlRfTUFYLCBnZXRhcmdzX0goVkVSWV9MQVJHRSkpCisKKyAgICBkZWYgdGVzdF9JKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19JCisgICAgICAgICMgSSByZXR1cm5zICd1bnNpZ25lZCBpbnQnLCBubyByYW5nZSBjaGVja2luZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfSSwgMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19JKExvbmcoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfSShJbnQoKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVSU5UX01BWCwgZ2V0YXJnc19JKC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX0koMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUlOVF9NQVgsIGdldGFyZ3NfSShVSU5UX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19JKFVJTlRfTUFYKzEpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfSSg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfSSg0MkwpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVkVSWV9MQVJHRSAmIFVJTlRfTUFYLCBnZXRhcmdzX0koVkVSWV9MQVJHRSkpCisKKyAgICBkZWYgdGVzdF9rKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19rCisgICAgICAgICMgayByZXR1cm5zICd1bnNpZ25lZCBsb25nJywgbm8gcmFuZ2UgY2hlY2tpbmcKKyAgICAgICAgIyBpdCBkb2VzIG5vdCBhY2NlcHQgZmxvYXQsIG9yIGluc3RhbmNlcyB3aXRoIF9faW50X18KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX2ssIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19rLCBMb25nKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19rLCBJbnQoKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVMT05HX01BWCwgZ2V0YXJnc19rKC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX2soMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUxPTkdfTUFYLCBnZXRhcmdzX2soVUxPTkdfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX2soVUxPTkdfTUFYKzEpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3Nfayg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3Nfayg0MkwpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVkVSWV9MQVJHRSAmIFVMT05HX01BWCwgZ2V0YXJnc19rKFZFUllfTEFSR0UpKQorCitjbGFzcyBTaWduZWRfVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2goc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2gKKyAgICAgICAgIyBoIHJldHVybnMgJ3Nob3J0JywgYW5kIGRvZXMgcmFuZ2UgY2hlY2tpbmcgKFNIUlRfTUlOIC4uLiBTSFJUX01BWCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX2gsIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfaChMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2goSW50KCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfaCwgU0hSVF9NSU4tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTSFJUX01JTiwgZ2V0YXJnc19oKFNIUlRfTUlOKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTSFJUX01BWCwgZ2V0YXJnc19oKFNIUlRfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19oLCBTSFJUX01BWCsxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfaCg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfaCg0MkwpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2gsIFZFUllfTEFSR0UpCisKKyAgICBkZWYgdGVzdF9pKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19pCisgICAgICAgICMgaSByZXR1cm5zICdpbnQnLCBhbmQgZG9lcyByYW5nZSBjaGVja2luZyAoSU5UX01JTiAuLi4gSU5UX01BWCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX2ksIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfaShMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2koSW50KCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfaSwgSU5UX01JTi0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKElOVF9NSU4sIGdldGFyZ3NfaShJTlRfTUlOKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChJTlRfTUFYLCBnZXRhcmdzX2koSU5UX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfaSwgSU5UX01BWCsxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfaSg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfaSg0MkwpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2ksIFZFUllfTEFSR0UpCisKKyAgICBkZWYgdGVzdF9sKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19sCisgICAgICAgICMgbCByZXR1cm5zICdsb25nJywgYW5kIGRvZXMgcmFuZ2UgY2hlY2tpbmcgKExPTkdfTUlOIC4uLiBMT05HX01BWCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX2wsIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfbChMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2woSW50KCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfbCwgTE9OR19NSU4tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMT05HX01JTiwgZ2V0YXJnc19sKExPTkdfTUlOKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMT05HX01BWCwgZ2V0YXJnc19sKExPTkdfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19sLCBMT05HX01BWCsxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfbCg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfbCg0MkwpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2wsIFZFUllfTEFSR0UpCisKKyAgICBkZWYgdGVzdF9uKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19uCisgICAgICAgICMgbiByZXR1cm5zICdQeV9zc2l6ZV90JywgYW5kIGRvZXMgcmFuZ2UgY2hlY2tpbmcKKyAgICAgICAgIyAoUFlfU1NJWkVfVF9NSU4gLi4uIFBZX1NTSVpFX1RfTUFYKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfbiwgMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19uKExvbmcoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfbihJbnQoKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19uLCBQWV9TU0laRV9UX01JTi0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBZX1NTSVpFX1RfTUlOLCBnZXRhcmdzX24oUFlfU1NJWkVfVF9NSU4pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBZX1NTSVpFX1RfTUFYLCBnZXRhcmdzX24oUFlfU1NJWkVfVF9NQVgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX24sIFBZX1NTSVpFX1RfTUFYKzEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19uKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19uKDQyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfbiwgVkVSWV9MQVJHRSkKKworCitjbGFzcyBMb25nTG9uZ19UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfTChzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfTAorICAgICAgICAjIEwgcmV0dXJucyAnbG9uZyBsb25nJywgYW5kIGRvZXMgcmFuZ2UgY2hlY2tpbmcgKExMT05HX01JTgorICAgICAgICAjIC4uLiBMTE9OR19NQVgpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKAorICAgICAgICAgICAgICAgICJpZ25vcmUiLAorICAgICAgICAgICAgICAgIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICBtZXNzYWdlPSIuKmludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCIsCisgICAgICAgICAgICAgICAgbW9kdWxlPV9fbmFtZV9fKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBnZXRhcmdzX0woMy4xNCkpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKAorICAgICAgICAgICAgICAgICJlcnJvciIsCisgICAgICAgICAgICAgICAgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U9Ii4qaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IGZsb2F0IiwKKyAgICAgICAgICAgICAgICBtb2R1bGU9InVuaXR0ZXN0IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERlcHJlY2F0aW9uV2FybmluZywgZ2V0YXJnc19MLCAzLjE0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19MLCAiSGVsbG8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX0woTG9uZygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19MKEludCgpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX0wsIExMT05HX01JTi0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExMT05HX01JTiwgZ2V0YXJnc19MKExMT05HX01JTikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTExPTkdfTUFYLCBnZXRhcmdzX0woTExPTkdfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19MLCBMTE9OR19NQVgrMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX0woNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX0woNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19MLCBWRVJZX0xBUkdFKQorCisgICAgZGVmIHRlc3RfSyhzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfSworICAgICAgICAjIEsgcmV0dXJuICd1bnNpZ25lZCBsb25nIGxvbmcnLCBubyByYW5nZSBjaGVja2luZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfSywgMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX0ssIExvbmcoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX0ssIEludCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVMTE9OR19NQVgsIGdldGFyZ3NfSyhVTExPTkdfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX0soMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19LKFVMTE9OR19NQVgrMSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19LKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19LKDQyTCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChWRVJZX0xBUkdFICYgVUxMT05HX01BWCwgZ2V0YXJnc19LKFZFUllfTEFSR0UpKQorCisKK2NsYXNzIFR1cGxlX1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF90dXBsZShzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfdHVwbGUKKworICAgICAgICByZXQgPSBnZXRhcmdzX3R1cGxlKDEsICgyLCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXQsICgxLDIsMykpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgaW52YWxpZCB0dXBsZSBhcmd1bWVudHMgYXJlIGhhbmRsZWQgY29ycmVjdGx5CisgICAgICAgIGNsYXNzIHNlcToKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbik6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfdHVwbGUsIDEsIHNlcSgpKQorCitjbGFzcyBLZXl3b3Jkc19UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcG9zaXRpb25hbF9hcmdzKHNlbGYpOgorICAgICAgICAjIHVzaW5nIGFsbCBwb3NpdGlvbmFsIGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGdldGFyZ3Nfa2V5d29yZHMoKDEsMiksIDMsICg0LCg1LDYpKSwgKDcsOCw5KSwgMTApLAorICAgICAgICAgICAgKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwKQorICAgICAgICAgICAgKQorICAgIGRlZiB0ZXN0X21peGVkX2FyZ3Moc2VsZik6CisgICAgICAgICMgcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBnZXRhcmdzX2tleXdvcmRzKCgxLDIpLCAzLCAoNCwoNSw2KSksIGFyZzQ9KDcsOCw5KSwgYXJnNT0xMCksCisgICAgICAgICAgICAoMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTApCisgICAgICAgICAgICApCisgICAgZGVmIHRlc3Rfa2V5d29yZF9hcmdzKHNlbGYpOgorICAgICAgICAjIGFsbCBrZXl3b3JkcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZ2V0YXJnc19rZXl3b3JkcyhhcmcxPSgxLDIpLCBhcmcyPTMsIGFyZzM9KDQsKDUsNikpLCBhcmc0PSg3LDgsOSksIGFyZzU9MTApLAorICAgICAgICAgICAgKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwKQorICAgICAgICAgICAgKQorICAgIGRlZiB0ZXN0X29wdGlvbmFsX2FyZ3Moc2VsZik6CisgICAgICAgICMgbWlzc2luZyBvcHRpb25hbCBrZXl3b3JkIGFyZ3MsIHNraXBwaW5nIHR1cGxlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZ2V0YXJnc19rZXl3b3JkcyhhcmcxPSgxLDIpLCBhcmcyPTMsIGFyZzU9MTApLAorICAgICAgICAgICAgKDEsIDIsIDMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEwKQorICAgICAgICAgICAgKQorICAgIGRlZiB0ZXN0X3JlcXVpcmVkX2FyZ3Moc2VsZik6CisgICAgICAgICMgcmVxdWlyZWQgYXJnIG1pc3NpbmcKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZ2V0YXJnc19rZXl3b3JkcyhhcmcxPSgxLDIpKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlcnI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlcnIpLCAiUmVxdWlyZWQgYXJndW1lbnQgJ2FyZzInIChwb3MgMikgbm90IGZvdW5kIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnVHlwZUVycm9yIHNob3VsZCBoYXZlIGJlZW4gcmFpc2VkJykKKyAgICBkZWYgdGVzdF90b29fbWFueV9hcmdzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBnZXRhcmdzX2tleXdvcmRzKCgxLDIpLDMsKDQsKDUsNikpLCg3LDgsOSksMTAsMTExKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlcnI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlcnIpLCAiZnVuY3Rpb24gdGFrZXMgYXQgbW9zdCA1IGFyZ3VtZW50cyAoNiBnaXZlbikiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdUeXBlRXJyb3Igc2hvdWxkIGhhdmUgYmVlbiByYWlzZWQnKQorICAgIGRlZiB0ZXN0X2ludmFsaWRfa2V5d29yZChzZWxmKToKKyAgICAgICAgIyBleHRyYW5lb3VzIGtleXdvcmQgYXJnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdldGFyZ3Nfa2V5d29yZHMoKDEsMiksMyxhcmc1PTEwLGFyZzY2Nj02NjYpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGVyciksICInYXJnNjY2JyBpcyBhbiBpbnZhbGlkIGtleXdvcmQgYXJndW1lbnQgZm9yIHRoaXMgZnVuY3Rpb24iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdUeXBlRXJyb3Igc2hvdWxkIGhhdmUgYmVlbiByYWlzZWQnKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdHMgPSBbU2lnbmVkX1Rlc3RDYXNlLCBVbnNpZ25lZF9UZXN0Q2FzZSwgVHVwbGVfVGVzdENhc2UsIEtleXdvcmRzX1Rlc3RDYXNlXQorICAgIHRyeToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfTCwgZ2V0YXJnc19LCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzICMgUFlfTE9OR19MT05HIG5vdCBhdmFpbGFibGUKKyAgICBlbHNlOgorICAgICAgICB0ZXN0cy5hcHBlbmQoTG9uZ0xvbmdfVGVzdENhc2UpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmI2OTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0YXJnczIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmI2OTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0YXJnczIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldG9wdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldG9wdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTI0Mjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0b3B0LnB5CkBAIC0wLDAgKzEsMTg3IEBACisjIHRlc3RfZ2V0b3B0LnB5CisjIERhdmlkIEdvb2RnZXIgPGRnb29kZ2VyQGJpZ2Zvb3QuY29tPiAyMDAwLTA4LTE5CisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHJ1bl9kb2N0ZXN0LCBydW5fdW5pdHRlc3QsIEVudmlyb25tZW50VmFyR3VhcmQKK2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgZ2V0b3B0CisKK3NlbnRpbmVsID0gb2JqZWN0KCkKKworY2xhc3MgR2V0b3B0VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5lbnYgPSBFbnZpcm9ubWVudFZhckd1YXJkKCkKKyAgICAgICAgaWYgIlBPU0lYTFlfQ09SUkVDVCIgaW4gc2VsZi5lbnY6CisgICAgICAgICAgICBkZWwgc2VsZi5lbnZbIlBPU0lYTFlfQ09SUkVDVCJdCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZW52Ll9fZXhpdF9fKCkKKyAgICAgICAgZGVsIHNlbGYuZW52CisKKyAgICBkZWYgYXNzZXJ0RXJyb3Ioc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZ2V0b3B0LkdldG9wdEVycm9yLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdF9zaG9ydF9oYXNfYXJnKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2V0b3B0LnNob3J0X2hhc19hcmcoJ2EnLCAnYTonKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnZXRvcHQuc2hvcnRfaGFzX2FyZygnYScsICdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXJyb3IoZ2V0b3B0LnNob3J0X2hhc19hcmcsICdhJywgJ2InKQorCisgICAgZGVmIHRlc3RfbG9uZ19oYXNfYXJncyhzZWxmKToKKyAgICAgICAgaGFzX2FyZywgb3B0aW9uID0gZ2V0b3B0LmxvbmdfaGFzX2FyZ3MoJ2FiYycsIFsnYWJjPSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzX2FyZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24sICdhYmMnKQorCisgICAgICAgIGhhc19hcmcsIG9wdGlvbiA9IGdldG9wdC5sb25nX2hhc19hcmdzKCdhYmMnLCBbJ2FiYyddKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc19hcmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0aW9uLCAnYWJjJykKKworICAgICAgICBoYXNfYXJnLCBvcHRpb24gPSBnZXRvcHQubG9uZ19oYXNfYXJncygnYWJjJywgWydhYmNkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzX2FyZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24sICdhYmNkJykKKworICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5sb25nX2hhc19hcmdzLCAnYWJjJywgWydkZWYnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcnJvcihnZXRvcHQubG9uZ19oYXNfYXJncywgJ2FiYycsIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5sb25nX2hhc19hcmdzLCAnYWJjJywgWydhYmNkJywnYWJjZGUnXSkKKworICAgIGRlZiB0ZXN0X2RvX3Nob3J0cyhzZWxmKToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5kb19zaG9ydHMoW10sICdhJywgJ2EnLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgW10pCisKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5kb19zaG9ydHMoW10sICdhMScsICdhOicsIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy1hJywgJzEnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgW10pCisKKyAgICAgICAgI29wdHMsIGFyZ3MgPSBnZXRvcHQuZG9fc2hvcnRzKFtdLCAnYT0xJywgJ2E6JywgW10pCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy1hJywgJzEnKV0pCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFtdKQorCisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZG9fc2hvcnRzKFtdLCAnYScsICdhOicsIFsnMSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy1hJywgJzEnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgW10pCisKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5kb19zaG9ydHMoW10sICdhJywgJ2E6JywgWycxJywgJzInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcxJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFsnMiddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXJyb3IoZ2V0b3B0LmRvX3Nob3J0cywgW10sICdhMScsICdhJywgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXJyb3IoZ2V0b3B0LmRvX3Nob3J0cywgW10sICdhJywgJ2E6JywgW10pCisKKyAgICBkZWYgdGVzdF9kb19sb25ncyhzZWxmKToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5kb19sb25ncyhbXSwgJ2FiYycsIFsnYWJjJ10sIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy0tYWJjJywgJycpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbXSkKKworICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmRvX2xvbmdzKFtdLCAnYWJjPTEnLCBbJ2FiYz0nXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0cywgWygnLS1hYmMnLCAnMScpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbXSkKKworICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmRvX2xvbmdzKFtdLCAnYWJjPTEnLCBbJ2FiY2Q9J10sIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy0tYWJjZCcsICcxJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFtdKQorCisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZG9fbG9uZ3MoW10sICdhYmMnLCBbJ2FiJywgJ2FiYycsICdhYmNkJ10sIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy0tYWJjJywgJycpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbXSkKKworICAgICAgICAjIE11Y2ggbGlrZSB0aGUgcHJlY2VkaW5nLCBleGNlcHQgd2l0aCBhIG5vbi1hbHBoYSBjaGFyYWN0ZXIgKCItIikgaW4KKyAgICAgICAgIyBvcHRpb24gbmFtZSB0aGF0IHByZWNlZGVzICI9IjsgZmFpbGVkIGluCisgICAgICAgICMgaHR0cDovL3B5dGhvbi5vcmcvc2YvMTI2ODYzCisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZG9fbG9uZ3MoW10sICdmb289NDInLCBbJ2Zvby1iYXInLCAnZm9vPScsXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0cywgWygnLS1mb28nLCAnNDInKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgW10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcnJvcihnZXRvcHQuZG9fbG9uZ3MsIFtdLCAnYWJjPTEnLCBbJ2FiYyddLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcnJvcihnZXRvcHQuZG9fbG9uZ3MsIFtdLCAnYWJjJywgWydhYmM9J10sIFtdKQorCisgICAgZGVmIHRlc3RfZ2V0b3B0KHNlbGYpOgorICAgICAgICAjIG5vdGU6IHRoZSBlbXB0eSBzdHJpbmcgYmV0d2VlbiAnLWEnIGFuZCAnLS1iZXRhJyBpcyBzaWduaWZpY2FudDoKKyAgICAgICAgIyBpdCBzaW11bGF0ZXMgYW4gZW1wdHkgc3RyaW5nIG9wdGlvbiBhcmd1bWVudCAoJy1hICIiJykgb24gdGhlCisgICAgICAgICMgY29tbWFuZCBsaW5lLgorICAgICAgICBjbWRsaW5lID0gWyctYScsICcxJywgJy1iJywgJy0tYWxwaGE9MicsICctLWJldGEnLCAnLWEnLCAnMycsICctYScsCisgICAgICAgICAgICAgICAgICAgJycsICctLWJldGEnLCAnYXJnMScsICdhcmcyJ10KKworICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChjbWRsaW5lLCAnYTpiJywgWydhbHBoYT0nLCAnYmV0YSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy1hJywgJzEnKSwgKCctYicsICcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCctLWFscGhhJywgJzInKSwgKCctLWJldGEnLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnLWEnLCAnMycpLCAoJy1hJywgJycpLCAoJy0tYmV0YScsICcnKV0pCisgICAgICAgICMgTm90ZSBhbWJpZ3VpdHkgb2YgKCctYicsICcnKSBhbmQgKCctYScsICcnKSBhYm92ZS4gVGhpcyBtdXN0IGJlCisgICAgICAgICMgYWNjb3VudGVkIGZvciBpbiB0aGUgY29kZSB0aGF0IGNhbGxzIGdldG9wdCgpLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFsnYXJnMScsICdhcmcyJ10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcnJvcihnZXRvcHQuZ2V0b3B0LCBjbWRsaW5lLCAnYTpiJywgWydhbHBoYScsICdiZXRhJ10pCisKKyAgICBkZWYgdGVzdF9nbnVfZ2V0b3B0KHNlbGYpOgorICAgICAgICAjIFRlc3QgaGFuZGxpbmcgb2YgR05VIHN0eWxlIHNjYW5uaW5nIG1vZGUuCisgICAgICAgIGNtZGxpbmUgPSBbJy1hJywgJ2FyZzEnLCAnLWInLCAnMScsICctLWFscGhhJywgJy0tYmV0YT0yJ10KKworICAgICAgICAjIEdOVSBzdHlsZQorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdudV9nZXRvcHQoY21kbGluZSwgJ2FiOicsIFsnYWxwaGEnLCAnYmV0YT0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbJ2FyZzEnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcnKSwgKCctYicsICcxJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnLS1hbHBoYScsICcnKSwgKCctLWJldGEnLCAnMicpXSkKKworICAgICAgICAjIHJlY29nbml6ZSAiLSIgYXMgYW4gYXJndW1lbnQKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nbnVfZ2V0b3B0KFsnLWEnLCAnLScsICctYicsICctJ10sICdhYjonLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbJy0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcnKSwgKCctYicsICctJyldKQorCisgICAgICAgICMgUG9zaXggc3R5bGUgdmlhICsKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nbnVfZ2V0b3B0KGNtZGxpbmUsICcrYWI6JywgWydhbHBoYScsICdiZXRhPSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy1hJywgJycpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbJ2FyZzEnLCAnLWInLCAnMScsICctLWFscGhhJywgJy0tYmV0YT0yJ10pCisKKyAgICAgICAgIyBQb3NpeCBzdHlsZSB2aWEgUE9TSVhMWV9DT1JSRUNUCisgICAgICAgIHNlbGYuZW52WyJQT1NJWExZX0NPUlJFQ1QiXSA9ICIxIgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdudV9nZXRvcHQoY21kbGluZSwgJ2FiOicsIFsnYWxwaGEnLCAnYmV0YT0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgWydhcmcxJywgJy1iJywgJzEnLCAnLS1hbHBoYScsICctLWJldGE9MiddKQorCisgICAgZGVmIHRlc3RfbGlicmVmX2V4YW1wbGVzKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgIEV4YW1wbGVzIGZyb20gdGhlIExpYnJhcnkgUmVmZXJlbmNlOiAgRG9jL2xpYi9saWJnZXRvcHQudGV4CisKKyAgICAgICAgQW4gZXhhbXBsZSB1c2luZyBvbmx5IFVuaXggc3R5bGUgb3B0aW9uczoKKworCisgICAgICAgID4+PiBpbXBvcnQgZ2V0b3B0CisgICAgICAgID4+PiBhcmdzID0gJy1hIC1iIC1jZm9vIC1kIGJhciBhMSBhMicuc3BsaXQoKQorICAgICAgICA+Pj4gYXJncworICAgICAgICBbJy1hJywgJy1iJywgJy1jZm9vJywgJy1kJywgJ2JhcicsICdhMScsICdhMiddCisgICAgICAgID4+PiBvcHRsaXN0LCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmdzLCAnYWJjOmQ6JykKKyAgICAgICAgPj4+IG9wdGxpc3QKKyAgICAgICAgWygnLWEnLCAnJyksICgnLWInLCAnJyksICgnLWMnLCAnZm9vJyksICgnLWQnLCAnYmFyJyldCisgICAgICAgID4+PiBhcmdzCisgICAgICAgIFsnYTEnLCAnYTInXQorCisgICAgICAgIFVzaW5nIGxvbmcgb3B0aW9uIG5hbWVzIGlzIGVxdWFsbHkgZWFzeToKKworCisgICAgICAgID4+PiBzID0gJy0tY29uZGl0aW9uPWZvbyAtLXRlc3RpbmcgLS1vdXRwdXQtZmlsZSBhYmMuZGVmIC14IGExIGEyJworICAgICAgICA+Pj4gYXJncyA9IHMuc3BsaXQoKQorICAgICAgICA+Pj4gYXJncworICAgICAgICBbJy0tY29uZGl0aW9uPWZvbycsICctLXRlc3RpbmcnLCAnLS1vdXRwdXQtZmlsZScsICdhYmMuZGVmJywgJy14JywgJ2ExJywgJ2EyJ10KKyAgICAgICAgPj4+IG9wdGxpc3QsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3MsICd4JywgWworICAgICAgICAuLi4gICAgICdjb25kaXRpb249JywgJ291dHB1dC1maWxlPScsICd0ZXN0aW5nJ10pCisgICAgICAgID4+PiBvcHRsaXN0CisgICAgICAgIFsoJy0tY29uZGl0aW9uJywgJ2ZvbycpLCAoJy0tdGVzdGluZycsICcnKSwgKCctLW91dHB1dC1maWxlJywgJ2FiYy5kZWYnKSwgKCcteCcsICcnKV0KKyAgICAgICAgPj4+IGFyZ3MKKyAgICAgICAgWydhMScsICdhMiddCisgICAgICAgICIiIgorCisgICAgICAgIGltcG9ydCB0eXBlcworICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgibGlicmVmdGVzdCIsIHMpCisgICAgICAgIHJ1bl9kb2N0ZXN0KG0sIHZlcmJvc2UpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTQ2Mjkoc2VsZik6CisgICAgICAgIGxvbmdvcHRzLCBzaG9ydG9wdHMgPSBnZXRvcHQuZ2V0b3B0KFsnLS1oZWxwPSddLCAnJywgWydoZWxwPSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmdvcHRzLCBbKCctLWhlbHAnLCAnJyldKQorICAgICAgICBsb25nb3B0cywgc2hvcnRvcHRzID0gZ2V0b3B0LmdldG9wdChbJy0taGVscD14J10sICcnLCBbJ2hlbHA9J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZ29wdHMsIFsoJy0taGVscCcsICd4JyldKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhnZXRvcHQuR2V0b3B0RXJyb3IsIGdldG9wdC5nZXRvcHQsIFsnLS1oZWxwPSddLCAnJywgWydoZWxwJ10pCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoR2V0b3B0VGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldG9wdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRvcHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYjBiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRvcHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldG9wdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRvcHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYjBiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRvcHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldHRleHQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXR0ZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMzY5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXR0ZXh0LnB5CkBAIC0wLDAgKzEsNDY3IEBACitpbXBvcnQgb3MKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBnZXR0ZXh0CitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCisjIFRPRE86CisjICAtIEFkZCBuZXcgdGVzdHMsIGZvciBleGFtcGxlIGZvciAiZGdldHRleHQiCisjICAtIFJlbW92ZSBkdW1teSB0ZXN0cywgZm9yIGV4YW1wbGUgdGVzdGluZyBmb3Igc2luZ2xlIGFuZCBkb3VibGUgcXVvdGVzCisjICAgIGhhcyBubyBzZW5zZSwgaXQgd291bGQgaGF2ZSBpZiB3ZSB3ZXJlIHRlc3RpbmcgYSBwYXJzZXIgKGkuZS4gcHlnZXR0ZXh0KQorIyAgLSBUZXN0cyBzaG91bGQgaGF2ZSBvbmx5IG9uZSBhc3NlcnQuCisKK0dOVV9NT19EQVRBID0gJycnXAorM2hJRWxRQUFBQUFHQUFBQUhBQUFBRXdBQUFBTEFBQUFmQUFBQUFBQUFBQ29BQUFBRlFBQUFLa0FBQUFqQUFBQXZ3QUFBS0VBQUFEagorQUFBQUJ3QUFBSVVCQUFBTEFBQUFqUUVBQUVVQkFBQ1pBUUFBRmdBQUFOOENBQUFlQUFBQTlnSUFBS0VBQUFBVkF3QUFCUUFBQUxjRAorQUFBSkFBQUF2UU1BQUFFQUFBQURBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBRUFBQUFCUUFBQUFZQUFBQUNBQUFBQUZKaAorZVcxdmJtUWdUSFY0ZFhKNUlGbGhZMmd0ZEFCVWFHVnlaU0JwY3lBbGN5Qm1hV3hsQUZSb1pYSmxJR0Z5WlNBbGN5Qm1hV3hsY3dCVQorYUdseklHMXZaSFZzWlNCd2NtOTJhV1JsY3lCcGJuUmxjbTVoZEdsdmJtRnNhWHBoZEdsdmJpQmhibVFnYkc5allXeHBlbUYwYVc5dQorQ25OMWNIQnZjblFnWm05eUlIbHZkWElnVUhsMGFHOXVJSEJ5YjJkeVlXMXpJR0o1SUhCeWIzWnBaR2x1WnlCaGJpQnBiblJsY21aaAorWTJVZ2RHOGdkR2hsSUVkT1ZRcG5aWFIwWlhoMElHMWxjM05oWjJVZ1kyRjBZV3h2WnlCc2FXSnlZWEo1TGdCdGRXeHNkWE5yQUc1MQorWkdkbElHNTFaR2RsQUZCeWIycGxZM1F0U1dRdFZtVnljMmx2YmpvZ01pNHdDbEJQTFZKbGRtbHphVzl1TFVSaGRHVTZJREl3TURBdAorTURndE1qa2dNVEk2TVRrdE1EUTZNREFLVEdGemRDMVVjbUZ1YzJ4aGRHOXlPaUJLTGlCRVlYWnBaQ0JKWXNPaHc3RmxlaUE4YWkxaworWVhacFpFQnViMjl6TG1aeVBncE1ZVzVuZFdGblpTMVVaV0Z0T2lCWVdDQThjSGwwYUc5dUxXUmxka0J3ZVhSb2IyNHViM0puUGdwTgorU1UxRkxWWmxjbk5wYjI0NklERXVNQXBEYjI1MFpXNTBMVlI1Y0dVNklIUmxlSFF2Y0d4aGFXNDdJR05vWVhKelpYUTlhWE52TFRnNAorTlRrdE1RcERiMjUwWlc1MExWUnlZVzV6Wm1WeUxVVnVZMjlrYVc1bk9pQnViMjVsQ2tkbGJtVnlZWFJsWkMxQ2VUb2djSGxuWlhSMAorWlhoMExuQjVJREV1TVFwUWJIVnlZV3d0Um05eWJYTTZJRzV3YkhWeVlXeHpQVEk3SUhCc2RYSmhiRDF1SVQweE93b0FWR2h5YjJGMAorZDI5aVlteGxjaUJOWVc1bmNtOTJaUUJJWVhrZ0pYTWdabWxqYUdWeWJ3QklZWGtnSlhNZ1ptbGphR1Z5YjNNQVIzVjJaaUI2WW5GbworZVhJZ1kyVmlhWFp4Y21ZZ2RtRm5jbVZoYm1kMlltRnVlWFp0Ym1kMlltRWdibUZ4SUhsaWNHNTVkbTF1WjNaaVlRcG1hR05qWW1WbgorSUhOaVpTQnNZbWhsSUVOc1ozVmlZU0JqWldKMFpXNTZaaUJ2YkNCalpXSnBkbkYyWVhRZ2JtRWdkbUZuY21WemJuQnlJR2RpSUdkMQorY2lCVVFVZ0tkSEpuWjNKclp5QjZjbVptYm5SeUlIQnVaMjU1WW5RZ2VYWnZaVzVsYkM0QVltRmpiMjRBZDJsdWF5QjNhVzVyQUE9PQorJycnCisKK1VNT19EQVRBID0gJycnXAorM2hJRWxRQUFBQUFDQUFBQUhBQUFBQ3dBQUFBRkFBQUFQQUFBQUFBQUFBQlFBQUFBQkFBQUFGRUFBQUFQQVFBQVZnQUFBQVFBQUFCbQorQVFBQUFRQUFBQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFZV0xEbmdCUWNtOXFaV04wTFVsa0xWWmxjbk5wYjI0NklESXVNQXBRVHkxUworWlhacGMybHZiaTFFWVhSbE9pQXlNREF6TFRBMExURXhJREV5T2pReUxUQTBNREFLVEdGemRDMVVjbUZ1YzJ4aGRHOXlPaUJDWVhKeQorZVNCQkxpQlhRWEp6WVhjZ1BHSmhjbko1UUhCNWRHaHZiaTV2Y21jK0NreGhibWQxWVdkbExWUmxZVzA2SUZoWUlEeHdlWFJvYjI0dAorWkdWMlFIQjVkR2h2Ymk1dmNtYytDazFKVFVVdFZtVnljMmx2YmpvZ01TNHdDa052Ym5SbGJuUXRWSGx3WlRvZ2RHVjRkQzl3YkdGcAorYmpzZ1kyaGhjbk5sZEQxMWRHWXRPQXBEYjI1MFpXNTBMVlJ5WVc1elptVnlMVVZ1WTI5a2FXNW5PaUEzWW1sMENrZGxibVZ5WVhSbAorWkMxQ2VUb2diV0Z1ZFdGc2JIa0tBTUtrZVhvQQorJycnCisKK01NT19EQVRBID0gJycnXAorM2hJRWxRQUFBQUFCQUFBQUhBQUFBQ1FBQUFBREFBQUFMQUFBQUFBQUFBQTRBQUFBZUFFQUFEa0FBQUFCQUFBQUFBQUFBQUFBQUFBQQorVUhKdmFtVmpkQzFKWkMxV1pYSnphVzl1T2lCT2J5QlFjbTlxWldOMElEQXVNQXBRVDFRdFEzSmxZWFJwYjI0dFJHRjBaVG9nVjJWaworSUVSbFl5QXhNU0F3TnpvME5Eb3hOU0F5TURBeUNsQlBMVkpsZG1semFXOXVMVVJoZEdVNklESXdNREl0TURndE1UUWdNREU2TVRnNgorTlRnck1EQTZNREFLVEdGemRDMVVjbUZ1YzJ4aGRHOXlPaUJLYjJodUlFUnZaU0E4YW1SdlpVQmxlR0Z0Y0d4bExtTnZiVDRLU21GdQorWlNCR2IyOWlZWElnUEdwbWIyOWlZWEpBWlhoaGJYQnNaUzVqYjIwK0NreGhibWQxWVdkbExWUmxZVzA2SUhoNElEeDRlRUJsZUdGdAorY0d4bExtTnZiVDRLVFVsTlJTMVdaWEp6YVc5dU9pQXhMakFLUTI5dWRHVnVkQzFVZVhCbE9pQjBaWGgwTDNCc1lXbHVPeUJqYUdGeQorYzJWMFBXbHpieTA0T0RVNUxURTFDa052Ym5SbGJuUXRWSEpoYm5ObVpYSXRSVzVqYjJScGJtYzZJSEYxYjNSbFpDMXdjbWx1ZEdGaQorYkdVS1IyVnVaWEpoZEdWa0xVSjVPaUJ3ZVdkbGRIUmxlSFF1Y0hrZ01TNHpDZ0E9CisnJycKKworTE9DQUxFRElSID0gb3MucGF0aC5qb2luKCd4eCcsICdMQ19NRVNTQUdFUycpCitNT0ZJTEUgPSBvcy5wYXRoLmpvaW4oTE9DQUxFRElSLCAnZ2V0dGV4dC5tbycpCitVTU9GSUxFID0gb3MucGF0aC5qb2luKExPQ0FMRURJUiwgJ3VnZXR0ZXh0Lm1vJykKK01NT0ZJTEUgPSBvcy5wYXRoLmpvaW4oTE9DQUxFRElSLCAnbWV0YWRhdGEubW8nKQorCisKK2NsYXNzIEdldHRleHRCYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihMT0NBTEVESVIpOgorICAgICAgICAgICAgb3MubWFrZWRpcnMoTE9DQUxFRElSKQorICAgICAgICB3aXRoIG9wZW4oTU9GSUxFLCAnd2InKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGJhc2U2NC5kZWNvZGVzdHJpbmcoR05VX01PX0RBVEEpKQorICAgICAgICB3aXRoIG9wZW4oVU1PRklMRSwgJ3diJykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZShiYXNlNjQuZGVjb2Rlc3RyaW5nKFVNT19EQVRBKSkKKyAgICAgICAgd2l0aCBvcGVuKE1NT0ZJTEUsICd3YicpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoYmFzZTY0LmRlY29kZXN0cmluZyhNTU9fREFUQSkpCisKKyAgICAgICAgc2VsZi5lbnYgPSB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpCisgICAgICAgIHNlbGYuZW52WydMQU5HVUFHRSddID0gJ3h4JworICAgICAgICBnZXR0ZXh0Ll90cmFuc2xhdGlvbnMuY2xlYXIoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmVudi5fX2V4aXRfXygpCisgICAgICAgIGRlbCBzZWxmLmVudgorICAgICAgICBzaHV0aWwucm10cmVlKG9zLnBhdGguc3BsaXQoTE9DQUxFRElSKVswXSkKKworCitjbGFzcyBHZXR0ZXh0VGVzdENhc2UxKEdldHRleHRCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBHZXR0ZXh0QmFzZVRlc3Quc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5sb2NhbGVkaXIgPSBvcy5jdXJkaXIKKyAgICAgICAgc2VsZi5tb2ZpbGUgPSBNT0ZJTEUKKyAgICAgICAgZ2V0dGV4dC5pbnN0YWxsKCdnZXR0ZXh0Jywgc2VsZi5sb2NhbGVkaXIpCisKKyAgICBkZWYgdGVzdF9zb21lX3RyYW5zbGF0aW9ucyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgdGVzdCBzb21lIHRyYW5zbGF0aW9ucworICAgICAgICBlcShfKCdhbGJhdHJvc3MnKSwgJ2FsYmF0cm9zcycpCisgICAgICAgIGVxKF8odSdtdWxsdXNrJyksICdiYWNvbicpCisgICAgICAgIGVxKF8ocidSYXltb25kIEx1eHVyeSBZYWNoLXQnKSwgJ1Rocm9hdHdvYmJsZXIgTWFuZ3JvdmUnKQorICAgICAgICBlcShfKHVyJ251ZGdlIG51ZGdlJyksICd3aW5rIHdpbmsnKQorCisgICAgZGVmIHRlc3RfZG91YmxlX3F1b3RlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgZG91YmxlIHF1b3RlcworICAgICAgICBlcShfKCJhbGJhdHJvc3MiKSwgJ2FsYmF0cm9zcycpCisgICAgICAgIGVxKF8odSJtdWxsdXNrIiksICdiYWNvbicpCisgICAgICAgIGVxKF8ociJSYXltb25kIEx1eHVyeSBZYWNoLXQiKSwgJ1Rocm9hdHdvYmJsZXIgTWFuZ3JvdmUnKQorICAgICAgICBlcShfKHVyIm51ZGdlIG51ZGdlIiksICd3aW5rIHdpbmsnKQorCisgICAgZGVmIHRlc3RfdHJpcGxlX3NpbmdsZV9xdW90ZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIHRyaXBsZSBzaW5nbGUgcXVvdGVzCisgICAgICAgIGVxKF8oJycnYWxiYXRyb3NzJycnKSwgJ2FsYmF0cm9zcycpCisgICAgICAgIGVxKF8odScnJ211bGx1c2snJycpLCAnYmFjb24nKQorICAgICAgICBlcShfKHInJydSYXltb25kIEx1eHVyeSBZYWNoLXQnJycpLCAnVGhyb2F0d29iYmxlciBNYW5ncm92ZScpCisgICAgICAgIGVxKF8odXInJydudWRnZSBudWRnZScnJyksICd3aW5rIHdpbmsnKQorCisgICAgZGVmIHRlc3RfdHJpcGxlX2RvdWJsZV9xdW90ZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIHRyaXBsZSBkb3VibGUgcXVvdGVzCisgICAgICAgIGVxKF8oIiIiYWxiYXRyb3NzIiIiKSwgJ2FsYmF0cm9zcycpCisgICAgICAgIGVxKF8odSIiIm11bGx1c2siIiIpLCAnYmFjb24nKQorICAgICAgICBlcShfKHIiIiJSYXltb25kIEx1eHVyeSBZYWNoLXQiIiIpLCAnVGhyb2F0d29iYmxlciBNYW5ncm92ZScpCisgICAgICAgIGVxKF8odXIiIiJudWRnZSBudWRnZSIiIiksICd3aW5rIHdpbmsnKQorCisgICAgZGVmIHRlc3RfbXVsdGlsaW5lX3N0cmluZ3Moc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIG11bHRpbGluZSBzdHJpbmdzCisgICAgICAgIGVxKF8oJycnVGhpcyBtb2R1bGUgcHJvdmlkZXMgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIGxvY2FsaXphdGlvbgorc3VwcG9ydCBmb3IgeW91ciBQeXRob24gcHJvZ3JhbXMgYnkgcHJvdmlkaW5nIGFuIGludGVyZmFjZSB0byB0aGUgR05VCitnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LicnJyksCisgICAgICAgICAgICcnJ0d1dmYgemJxaHlyIGNlYml2cXJmIHZhZ3JlYW5ndmJhbnl2bW5ndmJhIG5hcSB5YnBueXZtbmd2YmEKK2ZoY2NiZWcgc2JlIGxiaGUgQ2xndWJhIGNlYnRlbnpmIG9sIGNlYml2cXZhdCBuYSB2YWdyZXNucHIgZ2IgZ3VyIFRBSAordHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4nJycpCisKKyAgICBkZWYgdGVzdF90aGVfYWx0ZXJuYXRpdmVfaW50ZXJmYWNlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyB0ZXN0IHRoZSBhbHRlcm5hdGl2ZSBpbnRlcmZhY2UKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYubW9maWxlLCAncmInKSBhcyBmcDoKKyAgICAgICAgICAgIHQgPSBnZXR0ZXh0LkdOVVRyYW5zbGF0aW9ucyhmcCkKKyAgICAgICAgIyBJbnN0YWxsIHRoZSB0cmFuc2xhdGlvbiBvYmplY3QKKyAgICAgICAgdC5pbnN0YWxsKCkKKyAgICAgICAgZXEoXygnbnVkZ2UgbnVkZ2UnKSwgJ3dpbmsgd2luaycpCisgICAgICAgICMgVHJ5IHVuaWNvZGUgcmV0dXJuIHR5cGUKKyAgICAgICAgdC5pbnN0YWxsKHVuaWNvZGU9VHJ1ZSkKKyAgICAgICAgZXEoXygnbXVsbHVzaycpLCAnYmFjb24nKQorICAgICAgICAjIFRlc3QgaW5zdGFsbGF0aW9uIG9mIG90aGVyIG1ldGhvZHMKKyAgICAgICAgaW1wb3J0IF9fYnVpbHRpbl9fCisgICAgICAgIHQuaW5zdGFsbCh1bmljb2RlPVRydWUsIG5hbWVzPVsiZ2V0dGV4dCIsICJsZ2V0dGV4dCJdKQorICAgICAgICBlcShfLCB0LnVnZXR0ZXh0KQorICAgICAgICBlcShfX2J1aWx0aW5fXy5nZXR0ZXh0LCB0LnVnZXR0ZXh0KQorICAgICAgICBlcShsZ2V0dGV4dCwgdC5sZ2V0dGV4dCkKKyAgICAgICAgZGVsIF9fYnVpbHRpbl9fLmdldHRleHQKKyAgICAgICAgZGVsIF9fYnVpbHRpbl9fLmxnZXR0ZXh0CisKKworY2xhc3MgR2V0dGV4dFRlc3RDYXNlMihHZXR0ZXh0QmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgR2V0dGV4dEJhc2VUZXN0LnNldFVwKHNlbGYpCisgICAgICAgIHNlbGYubG9jYWxlZGlyID0gb3MuY3VyZGlyCisgICAgICAgICMgU2V0IHVwIHRoZSBiaW5kaW5ncworICAgICAgICBnZXR0ZXh0LmJpbmR0ZXh0ZG9tYWluKCdnZXR0ZXh0Jywgc2VsZi5sb2NhbGVkaXIpCisgICAgICAgIGdldHRleHQudGV4dGRvbWFpbignZ2V0dGV4dCcpCisgICAgICAgICMgRm9yIGNvbnZlbmllbmNlCisgICAgICAgIHNlbGYuXyA9IGdldHRleHQuZ2V0dGV4dAorCisgICAgZGVmIHRlc3RfYmluZHRleHRkb21haW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0dGV4dC5iaW5kdGV4dGRvbWFpbignZ2V0dGV4dCcpLCBzZWxmLmxvY2FsZWRpcikKKworICAgIGRlZiB0ZXN0X3RleHRkb21haW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0dGV4dC50ZXh0ZG9tYWluKCksICdnZXR0ZXh0JykKKworICAgIGRlZiB0ZXN0X3NvbWVfdHJhbnNsYXRpb25zKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyB0ZXN0IHNvbWUgdHJhbnNsYXRpb25zCisgICAgICAgIGVxKHNlbGYuXygnYWxiYXRyb3NzJyksICdhbGJhdHJvc3MnKQorICAgICAgICBlcShzZWxmLl8odSdtdWxsdXNrJyksICdiYWNvbicpCisgICAgICAgIGVxKHNlbGYuXyhyJ1JheW1vbmQgTHV4dXJ5IFlhY2gtdCcpLCAnVGhyb2F0d29iYmxlciBNYW5ncm92ZScpCisgICAgICAgIGVxKHNlbGYuXyh1cidudWRnZSBudWRnZScpLCAnd2luayB3aW5rJykKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9xdW90ZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIGRvdWJsZSBxdW90ZXMKKyAgICAgICAgZXEoc2VsZi5fKCJhbGJhdHJvc3MiKSwgJ2FsYmF0cm9zcycpCisgICAgICAgIGVxKHNlbGYuXyh1Im11bGx1c2siKSwgJ2JhY29uJykKKyAgICAgICAgZXEoc2VsZi5fKHIiUmF5bW9uZCBMdXh1cnkgWWFjaC10IiksICdUaHJvYXR3b2JibGVyIE1hbmdyb3ZlJykKKyAgICAgICAgZXEoc2VsZi5fKHVyIm51ZGdlIG51ZGdlIiksICd3aW5rIHdpbmsnKQorCisgICAgZGVmIHRlc3RfdHJpcGxlX3NpbmdsZV9xdW90ZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIHRyaXBsZSBzaW5nbGUgcXVvdGVzCisgICAgICAgIGVxKHNlbGYuXygnJydhbGJhdHJvc3MnJycpLCAnYWxiYXRyb3NzJykKKyAgICAgICAgZXEoc2VsZi5fKHUnJydtdWxsdXNrJycnKSwgJ2JhY29uJykKKyAgICAgICAgZXEoc2VsZi5fKHInJydSYXltb25kIEx1eHVyeSBZYWNoLXQnJycpLCAnVGhyb2F0d29iYmxlciBNYW5ncm92ZScpCisgICAgICAgIGVxKHNlbGYuXyh1cicnJ251ZGdlIG51ZGdlJycnKSwgJ3dpbmsgd2luaycpCisKKyAgICBkZWYgdGVzdF90cmlwbGVfZG91YmxlX3F1b3RlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgdHJpcGxlIGRvdWJsZSBxdW90ZXMKKyAgICAgICAgZXEoc2VsZi5fKCIiImFsYmF0cm9zcyIiIiksICdhbGJhdHJvc3MnKQorICAgICAgICBlcShzZWxmLl8odSIiIm11bGx1c2siIiIpLCAnYmFjb24nKQorICAgICAgICBlcShzZWxmLl8ociIiIlJheW1vbmQgTHV4dXJ5IFlhY2gtdCIiIiksICdUaHJvYXR3b2JibGVyIE1hbmdyb3ZlJykKKyAgICAgICAgZXEoc2VsZi5fKHVyIiIibnVkZ2UgbnVkZ2UiIiIpLCAnd2luayB3aW5rJykKKworICAgIGRlZiB0ZXN0X211bHRpbGluZV9zdHJpbmdzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBtdWx0aWxpbmUgc3RyaW5ncworICAgICAgICBlcShzZWxmLl8oJycnVGhpcyBtb2R1bGUgcHJvdmlkZXMgaW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIGxvY2FsaXphdGlvbgorc3VwcG9ydCBmb3IgeW91ciBQeXRob24gcHJvZ3JhbXMgYnkgcHJvdmlkaW5nIGFuIGludGVyZmFjZSB0byB0aGUgR05VCitnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LicnJyksCisgICAgICAgICAgICcnJ0d1dmYgemJxaHlyIGNlYml2cXJmIHZhZ3JlYW5ndmJhbnl2bW5ndmJhIG5hcSB5YnBueXZtbmd2YmEKK2ZoY2NiZWcgc2JlIGxiaGUgQ2xndWJhIGNlYnRlbnpmIG9sIGNlYml2cXZhdCBuYSB2YWdyZXNucHIgZ2IgZ3VyIFRBSAordHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4nJycpCisKKworY2xhc3MgUGx1cmFsRm9ybXNUZXN0Q2FzZShHZXR0ZXh0QmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgR2V0dGV4dEJhc2VUZXN0LnNldFVwKHNlbGYpCisgICAgICAgIHNlbGYubW9maWxlID0gTU9GSUxFCisKKyAgICBkZWYgdGVzdF9wbHVyYWxfZm9ybXMxKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgeCA9IGdldHRleHQubmdldHRleHQoJ1RoZXJlIGlzICVzIGZpbGUnLCAnVGhlcmUgYXJlICVzIGZpbGVzJywgMSkKKyAgICAgICAgZXEoeCwgJ0hheSAlcyBmaWNoZXJvJykKKyAgICAgICAgeCA9IGdldHRleHQubmdldHRleHQoJ1RoZXJlIGlzICVzIGZpbGUnLCAnVGhlcmUgYXJlICVzIGZpbGVzJywgMikKKyAgICAgICAgZXEoeCwgJ0hheSAlcyBmaWNoZXJvcycpCisKKyAgICBkZWYgdGVzdF9wbHVyYWxfZm9ybXMyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYubW9maWxlLCAncmInKSBhcyBmcDoKKyAgICAgICAgICAgIHQgPSBnZXR0ZXh0LkdOVVRyYW5zbGF0aW9ucyhmcCkKKyAgICAgICAgeCA9IHQubmdldHRleHQoJ1RoZXJlIGlzICVzIGZpbGUnLCAnVGhlcmUgYXJlICVzIGZpbGVzJywgMSkKKyAgICAgICAgZXEoeCwgJ0hheSAlcyBmaWNoZXJvJykKKyAgICAgICAgeCA9IHQubmdldHRleHQoJ1RoZXJlIGlzICVzIGZpbGUnLCAnVGhlcmUgYXJlICVzIGZpbGVzJywgMikKKyAgICAgICAgZXEoeCwgJ0hheSAlcyBmaWNoZXJvcycpCisKKyAgICBkZWYgdGVzdF9odShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGYgPSBnZXR0ZXh0LmMycHkoJzAnKQorICAgICAgICBzID0gJycuam9pbihbIHN0cihmKHgpKSBmb3IgeCBpbiByYW5nZSgyMDApIF0pCisgICAgICAgIGVxKHMsICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIpCisKKyAgICBkZWYgdGVzdF9kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGYgPSBnZXR0ZXh0LmMycHkoJ24gIT0gMScpCisgICAgICAgIHMgPSAnJy5qb2luKFsgc3RyKGYoeCkpIGZvciB4IGluIHJhbmdlKDIwMCkgXSkKKyAgICAgICAgZXEocywgIjEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIikKKworICAgIGRlZiB0ZXN0X2ZyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZiA9IGdldHRleHQuYzJweSgnbj4xJykKKyAgICAgICAgcyA9ICcnLmpvaW4oWyBzdHIoZih4KSkgZm9yIHggaW4gcmFuZ2UoMjAwKSBdKQorICAgICAgICBlcShzLCAiMDAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEiKQorCisgICAgZGVmIHRlc3RfZ2Qoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmID0gZ2V0dGV4dC5jMnB5KCduPT0xID8gMCA6IG49PTIgPyAxIDogMicpCisgICAgICAgIHMgPSAnJy5qb2luKFsgc3RyKGYoeCkpIGZvciB4IGluIHJhbmdlKDIwMCkgXSkKKyAgICAgICAgZXEocywgIjIwMTIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyIikKKworICAgIGRlZiB0ZXN0X2dkMihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgVGVzdHMgdGhlIGNvbWJpbmF0aW9uIG9mIHBhcmVudGhlc2VzIGFuZCAiPzoiCisgICAgICAgIGYgPSBnZXR0ZXh0LmMycHkoJ249PTEgPyAwIDogKG49PTIgPyAxIDogMiknKQorICAgICAgICBzID0gJycuam9pbihbIHN0cihmKHgpKSBmb3IgeCBpbiByYW5nZSgyMDApIF0pCisgICAgICAgIGVxKHMsICIyMDEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiIpCisKKyAgICBkZWYgdGVzdF9sdChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGYgPSBnZXR0ZXh0LmMycHkoJ24lMTA9PTEgJiYgbiUxMDAhPTExID8gMCA6IG4lMTA+PTIgJiYgKG4lMTAwPDEwIHx8IG4lMTAwPj0yMCkgPyAxIDogMicpCisgICAgICAgIHMgPSAnJy5qb2luKFsgc3RyKGYoeCkpIGZvciB4IGluIHJhbmdlKDIwMCkgXSkKKyAgICAgICAgZXEocywgIjIwMTExMTExMTEyMjIyMjIyMjIyMjAxMTExMTExMTIwMTExMTExMTEyMDExMTExMTExMjAxMTExMTExMTIwMTExMTExMTEyMDExMTExMTExMjAxMTExMTExMTIwMTExMTExMTEyMDExMTExMTExMjIyMjIyMjIyMjIwMTExMTExMTEyMDExMTExMTExMjAxMTExMTExMTIwMTExMTExMTEyMDExMTExMTExMjAxMTExMTExMTIwMTExMTExMTEyMDExMTExMTExIikKKworICAgIGRlZiB0ZXN0X3J1KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZiA9IGdldHRleHQuYzJweSgnbiUxMD09MSAmJiBuJTEwMCE9MTEgPyAwIDogbiUxMD49MiAmJiBuJTEwPD00ICYmIChuJTEwMDwxMCB8fCBuJTEwMD49MjApID8gMSA6IDInKQorICAgICAgICBzID0gJycuam9pbihbIHN0cihmKHgpKSBmb3IgeCBpbiByYW5nZSgyMDApIF0pCisgICAgICAgIGVxKHMsICIyMDExMTIyMjIyMjIyMjIyMjIyMjIwMTExMjIyMjIyMDExMTIyMjIyMjAxMTEyMjIyMjIwMTExMjIyMjIyMDExMTIyMjIyMjAxMTEyMjIyMjIwMTExMjIyMjIyMDExMTIyMjIyMjAxMTEyMjIyMjIyMjIyMjIyMjIyMDExMTIyMjIyMjAxMTEyMjIyMjIwMTExMjIyMjIyMDExMTIyMjIyMjAxMTEyMjIyMjIwMTExMjIyMjIyMDExMTIyMjIyMjAxMTEyMjIyMiIpCisKKyAgICBkZWYgdGVzdF9wbChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGYgPSBnZXR0ZXh0LmMycHkoJ249PTEgPyAwIDogbiUxMD49MiAmJiBuJTEwPD00ICYmIChuJTEwMDwxMCB8fCBuJTEwMD49MjApID8gMSA6IDInKQorICAgICAgICBzID0gJycuam9pbihbIHN0cihmKHgpKSBmb3IgeCBpbiByYW5nZSgyMDApIF0pCisgICAgICAgIGVxKHMsICIyMDExMTIyMjIyMjIyMjIyMjIyMjIyMTExMjIyMjIyMjExMTIyMjIyMjIxMTEyMjIyMjIyMTExMjIyMjIyMjExMTIyMjIyMjIxMTEyMjIyMjIyMTExMjIyMjIyMjExMTIyMjIyMjIxMTEyMjIyMjIyMjIyMjIyMjIyMjExMTIyMjIyMjIxMTEyMjIyMjIyMTExMjIyMjIyMjExMTIyMjIyMjIxMTEyMjIyMjIyMTExMjIyMjIyMjExMTIyMjIyMjIxMTEyMjIyMiIpCisKKyAgICBkZWYgdGVzdF9zbChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGYgPSBnZXR0ZXh0LmMycHkoJ24lMTAwPT0xID8gMCA6IG4lMTAwPT0yID8gMSA6IG4lMTAwPT0zIHx8IG4lMTAwPT00ID8gMiA6IDMnKQorICAgICAgICBzID0gJycuam9pbihbIHN0cihmKHgpKSBmb3IgeCBpbiByYW5nZSgyMDApIF0pCisgICAgICAgIGVxKHMsICIzMDEyMjMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzAxMjIzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMyIpCisKKyAgICBkZWYgdGVzdF9zZWN1cml0eShzZWxmKToKKyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyAgICAgICAgIyBUZXN0IGZvciBhIGRhbmdlcm91cyBleHByZXNzaW9uCisgICAgICAgIHJhaXNlcyhWYWx1ZUVycm9yLCBnZXR0ZXh0LmMycHksICJvcy5jaG1vZCgnL2V0Yy9wYXNzd2QnLDA3NzcpIikKKworCitjbGFzcyBVbmljb2RlVHJhbnNsYXRpb25zVGVzdChHZXR0ZXh0QmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgR2V0dGV4dEJhc2VUZXN0LnNldFVwKHNlbGYpCisgICAgICAgIHdpdGggb3BlbihVTU9GSUxFLCAncmInKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYudCA9IGdldHRleHQuR05VVHJhbnNsYXRpb25zKGZwKQorICAgICAgICBzZWxmLl8gPSBzZWxmLnQudWdldHRleHQKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfbXNnaWQoc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzZWxmLl8oJycpLCB1bmljb2RlKSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc2VsZi5fKHUnJyksIHVuaWNvZGUpKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9tc2dzdHIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShzZWxmLl8odSdhYlx4ZGUnKSwgdSdceGE0eXonKQorCisKK2NsYXNzIFdlaXJkTWV0YWRhdGFUZXN0KEdldHRleHRCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBHZXR0ZXh0QmFzZVRlc3Quc2V0VXAoc2VsZikKKyAgICAgICAgd2l0aCBvcGVuKE1NT0ZJTEUsICdyYicpIGFzIGZwOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYudCA9IGdldHRleHQuR05VVHJhbnNsYXRpb25zKGZwKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYudGVhckRvd24oKQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgdGVzdF93ZWlyZF9tZXRhZGF0YShzZWxmKToKKyAgICAgICAgaW5mbyA9IHNlbGYudC5pbmZvKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvWydsYXN0LXRyYW5zbGF0b3InXSwKKyAgICAgICAgICAgJ0pvaG4gRG9lIDxqZG9lQGV4YW1wbGUuY29tPlxuSmFuZSBGb29iYXIgPGpmb29iYXJAZXhhbXBsZS5jb20+JykKKworCitjbGFzcyBEdW1teUdOVVRyYW5zbGF0aW9ucyhnZXR0ZXh0LkdOVVRyYW5zbGF0aW9ucyk6CisgICAgZGVmIGZvbyhzZWxmKToKKyAgICAgICAgcmV0dXJuICdmb28nCisKKworY2xhc3MgR2V0dGV4dENhY2hlVGVzdENhc2UoR2V0dGV4dEJhc2VUZXN0KToKKyAgICBkZWYgdGVzdF9jYWNoZShzZWxmKToKKyAgICAgICAgc2VsZi5sb2NhbGVkaXIgPSBvcy5jdXJkaXIKKyAgICAgICAgc2VsZi5tb2ZpbGUgPSBNT0ZJTEUKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihnZXR0ZXh0Ll90cmFuc2xhdGlvbnMpLCAwKQorCisgICAgICAgIHQgPSBnZXR0ZXh0LnRyYW5zbGF0aW9uKCdnZXR0ZXh0Jywgc2VsZi5sb2NhbGVkaXIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ2V0dGV4dC5fdHJhbnNsYXRpb25zKSwgMSkKKworICAgICAgICB0ID0gZ2V0dGV4dC50cmFuc2xhdGlvbignZ2V0dGV4dCcsIHNlbGYubG9jYWxlZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc189RHVtbXlHTlVUcmFuc2xhdGlvbnMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ2V0dGV4dC5fdHJhbnNsYXRpb25zKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Ll9fY2xhc3NfXywgRHVtbXlHTlVUcmFuc2xhdGlvbnMpCisKKyAgICAgICAgIyBDYWxsaW5nIGl0IGFnYWluIGRvZXNuJ3QgYWRkIHRvIHRoZSBjYWNoZQorCisgICAgICAgIHQgPSBnZXR0ZXh0LnRyYW5zbGF0aW9uKCdnZXR0ZXh0Jywgc2VsZi5sb2NhbGVkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzXz1EdW1teUdOVVRyYW5zbGF0aW9ucykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihnZXR0ZXh0Ll90cmFuc2xhdGlvbnMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuX19jbGFzc19fLCBEdW1teUdOVVRyYW5zbGF0aW9ucykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQorCisKKyMgRm9yIHJlZmVyZW5jZSwgaGVyZSdzIHRoZSAucG8gZmlsZSB1c2VkIHRvIGNyZWF0ZWQgdGhlIEdOVV9NT19EQVRBIGFib3ZlLgorIworIyBUaGUgb3JpZ2luYWwgdmVyc2lvbiB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgc291cmNlcyB3aXRoCisjIHB5Z2V0dGV4dC4gTGF0ZXIgaXQgd2FzIG1hbnVhbGx5IG1vZGlmaWVkIHRvIGFkZCBwbHVyYWwgZm9ybXMgc3VwcG9ydC4KKworJycnCisjIER1bW15IHRyYW5zbGF0aW9uIGZvciB0aGUgUHl0aG9uIHRlc3RfZ2V0dGV4dC5weSBtb2R1bGUuCisjIENvcHlyaWdodCAoQykgMjAwMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBCYXJyeSBXYXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+LCAyMDAwLgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogMi4wXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwMy0wNC0xMSAxNDozMi0wNDAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYmFuZXogPGotZGF2aWRAbm9vcy5mcj5cbiIKKyJMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PWlzby04ODU5LTFcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisiR2VuZXJhdGVkLUJ5OiBweWdldHRleHQucHkgMS4xXG4iCisiUGx1cmFsLUZvcm1zOiBucGx1cmFscz0yOyBwbHVyYWw9biE9MTtcbiIKKworIzogdGVzdF9nZXR0ZXh0LnB5OjE5IHRlc3RfZ2V0dGV4dC5weToyNSB0ZXN0X2dldHRleHQucHk6MzEgdGVzdF9nZXR0ZXh0LnB5OjM3CisjOiB0ZXN0X2dldHRleHQucHk6NTEgdGVzdF9nZXR0ZXh0LnB5OjgwIHRlc3RfZ2V0dGV4dC5weTo4NiB0ZXN0X2dldHRleHQucHk6OTIKKyM6IHRlc3RfZ2V0dGV4dC5weTo5OAorbXNnaWQgIm51ZGdlIG51ZGdlIgorbXNnc3RyICJ3aW5rIHdpbmsiCisKKyM6IHRlc3RfZ2V0dGV4dC5weToxNiB0ZXN0X2dldHRleHQucHk6MjIgdGVzdF9nZXR0ZXh0LnB5OjI4IHRlc3RfZ2V0dGV4dC5weTozNAorIzogdGVzdF9nZXR0ZXh0LnB5Ojc3IHRlc3RfZ2V0dGV4dC5weTo4MyB0ZXN0X2dldHRleHQucHk6ODkgdGVzdF9nZXR0ZXh0LnB5Ojk1Cittc2dpZCAiYWxiYXRyb3NzIgorbXNnc3RyICIiCisKKyM6IHRlc3RfZ2V0dGV4dC5weToxOCB0ZXN0X2dldHRleHQucHk6MjQgdGVzdF9nZXR0ZXh0LnB5OjMwIHRlc3RfZ2V0dGV4dC5weTozNgorIzogdGVzdF9nZXR0ZXh0LnB5Ojc5IHRlc3RfZ2V0dGV4dC5weTo4NSB0ZXN0X2dldHRleHQucHk6OTEgdGVzdF9nZXR0ZXh0LnB5Ojk3Cittc2dpZCAiUmF5bW9uZCBMdXh1cnkgWWFjaC10IgorbXNnc3RyICJUaHJvYXR3b2JibGVyIE1hbmdyb3ZlIgorCisjOiB0ZXN0X2dldHRleHQucHk6MTcgdGVzdF9nZXR0ZXh0LnB5OjIzIHRlc3RfZ2V0dGV4dC5weToyOSB0ZXN0X2dldHRleHQucHk6MzUKKyM6IHRlc3RfZ2V0dGV4dC5weTo1NiB0ZXN0X2dldHRleHQucHk6NzggdGVzdF9nZXR0ZXh0LnB5Ojg0IHRlc3RfZ2V0dGV4dC5weTo5MAorIzogdGVzdF9nZXR0ZXh0LnB5Ojk2Cittc2dpZCAibXVsbHVzayIKK21zZ3N0ciAiYmFjb24iCisKKyM6IHRlc3RfZ2V0dGV4dC5weTo0MCB0ZXN0X2dldHRleHQucHk6MTAxCittc2dpZCAiIgorIlRoaXMgbW9kdWxlIHByb3ZpZGVzIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCBsb2NhbGl6YXRpb25cbiIKKyJzdXBwb3J0IGZvciB5b3VyIFB5dGhvbiBwcm9ncmFtcyBieSBwcm92aWRpbmcgYW4gaW50ZXJmYWNlIHRvIHRoZSBHTlVcbiIKKyJnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LiIKK21zZ3N0ciAiIgorIkd1dmYgemJxaHlyIGNlYml2cXJmIHZhZ3JlYW5ndmJhbnl2bW5ndmJhIG5hcSB5YnBueXZtbmd2YmFcbiIKKyJmaGNjYmVnIHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1ciBUQUhcbiIKKyJ0cmdncmtnIHpyZmZudHIgcG5nbnlidCB5dm9lbmVsLiIKKworIyBNYW51YWxseSBhZGRlZCwgYXMgbmVpdGhlciBweWdldHRleHQgbm9yIHhnZXR0ZXh0IHN1cHBvcnQgcGx1cmFsIGZvcm1zCisjIGluIFB5dGhvbi4KK21zZ2lkICJUaGVyZSBpcyAlcyBmaWxlIgorbXNnaWRfcGx1cmFsICJUaGVyZSBhcmUgJXMgZmlsZXMiCittc2dzdHJbMF0gIkhheSAlcyBmaWNoZXJvIgorbXNnc3RyWzFdICJIYXkgJXMgZmljaGVyb3MiCisnJycKKworIyBIZXJlJ3MgdGhlIHNlY29uZCBleGFtcGxlIHBvIGZpbGUgZXhhbXBsZSwgdXNlZCB0byBnZW5lcmF0ZSB0aGUgVU1PX0RBVEEKKyMgY29udGFpbmluZyB1dGYtOCBlbmNvZGVkIFVuaWNvZGUgc3RyaW5ncworCisnJycKKyMgRHVtbXkgdHJhbnNsYXRpb24gZm9yIHRoZSBQeXRob24gdGVzdF9nZXR0ZXh0LnB5IG1vZHVsZS4KKyMgQ29weXJpZ2h0IChDKSAyMDAxIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEJhcnJ5IFdhcnNhdyA8YmFycnlAcHl0aG9uLm9yZz4sIDIwMDAuCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiAyLjBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDAzLTA0LTExIDEyOjQyLTA0MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEJhcnJ5IEEuIFdBcnNhdyA8YmFycnlAcHl0aG9uLm9yZz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdFxuIgorIkdlbmVyYXRlZC1CeTogbWFudWFsbHlcbiIKKworIzogbm9maWxlOjAKK21zZ2lkICJhYlx4YzNceDllIgorbXNnc3RyICJceGMyXHhhNHl6IgorJycnCisKKyMgSGVyZSdzIHRoZSB0aGlyZCBleGFtcGxlIHBvIGZpbGUsIHVzZWQgdG8gZ2VuZXJhdGUgTU1PX0RBVEEKKworJycnCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBObyBQcm9qZWN0IDAuMFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiBXZWQgRGVjIDExIDA3OjQ0OjE1IDIwMDJcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDAyLTA4LTE0IDAxOjE4OjU4KzAwOjAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBKb2huIERvZSA8amRvZUBleGFtcGxlLmNvbT5cbiIKKyJKYW5lIEZvb2JhciA8amZvb2JhckBleGFtcGxlLmNvbT5cbiIKKyJMYW5ndWFnZS1UZWFtOiB4eCA8eHhAZXhhbXBsZS5jb20+XG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4NTktMTVcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlXG4iCisiR2VuZXJhdGVkLUJ5OiBweWdldHRleHQucHkgMS4zXG4iCisnJycKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldHRleHQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0dGV4dC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmMzk2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldHRleHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldHRleHQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0dGV4dC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmMzk2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldHRleHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2wucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzkyNjRlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsLnB5CkBAIC0wLDAgKzEsMTU1IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJWZXJ5IHNpbXBsZSB0ZXN0IHNjcmlwdCBmb3IgdGhlIFNHSSBnbCBsaWJyYXJ5IGV4dGVuc2lvbiBtb2R1bGUKKyAgICB0YWtlbiBtb3N0bHkgZnJvbSB0aGUgZG9jdW1lbnRhdGlvbi4KKyAgICBSb2dlciBFLiBNYXNzZQorIiIiCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIGltcG9ydF9tb2R1bGUKK2ltcG9ydCB0aW1lCitnbCA9IGltcG9ydF9tb2R1bGUoJ2dsJykKK0dMID0gaW1wb3J0X21vZHVsZSgnR0wnKQorCitnbGF0dHJzID0gWydSR0Jjb2xvcicsICdSR0JjdXJzb3InLCAnUkdCbW9kZScsICdSR0JyYW5nZScsICdSR0J3cml0ZW1hc2snLAorJ19fZG9jX18nLCAnX19uYW1lX18nLCAnYWRkdG9wdXAnLCAnYWx0Z2V0bWF0cml4JywgJ2FyYycsICdhcmNmJywKKydhcmNmaScsICdhcmNmcycsICdhcmNpJywgJ2FyY3MnLCAnYXR0YWNoY3Vyc29yJywgJ2JhY2tidWZmZXInLAorJ2JhY2tmYWNlJywgJ2Jib3gyJywgJ2Jib3gyaScsICdiYm94MnMnLCAnYmduY2xvc2VkbGluZScsICdiZ25saW5lJywKKydiZ25wb2ludCcsICdiZ25wb2x5Z29uJywgJ2JnbnN1cmZhY2UnLCAnYmdudG1lc2gnLCAnYmdudHJpbScsCisnYmxhbmtzY3JlZW4nLCAnYmxhbmt0aW1lJywgJ2JsZW5kZnVuY3Rpb24nLCAnYmxpbmsnLCAnYzNmJywgJ2MzaScsCisnYzNzJywgJ2M0ZicsICdjNGknLCAnYzRzJywgJ2NhbGxvYmonLCAnY2hhcnN0cicsICdjaHVua3NpemUnLCAnY2lyYycsCisnY2lyY2YnLCAnY2lyY2ZpJywgJ2NpcmNmcycsICdjaXJjaScsICdjaXJjcycsICdjbGVhcicsCisnY2xlYXJoaXRjb2RlJywgJ2Nsa29mZicsICdjbGtvbicsICdjbG9zZW9iaicsICdjbW9kZScsICdjbW92JywKKydjbW92MicsICdjbW92MmknLCAnY21vdjJzJywgJ2Ntb3ZpJywgJ2Ntb3ZzJywgJ2NvbG9yJywgJ2NvbG9yZicsCisnY29tcGFjdGlmeScsICdjb25jYXZlJywgJ2NwYWNrJywgJ2NydicsICdjcnZuJywgJ2N1cm9yaWdpbicsCisnY3Vyc29mZicsICdjdXJzb24nLCAnY3Vyc3R5cGUnLCAnY3VydmViYXNpcycsICdjdXJ2ZWl0JywKKydjdXJ2ZXByZWNpc2lvbicsICdjeWNsZW1hcCcsICdjemNsZWFyJywgJ2RlZmJhc2lzJywgJ2RlZmN1cnNvcicsCisnZGVmbGluZXN0eWxlJywgJ2RlbG9iaicsICdkZWx0YWcnLCAnZGVwdGhjdWUnLCAnZGV2cG9ydCcsICdkZ2xjbG9zZScsCisnZGdsb3BlbicsICdkaXRoZXInLCAnZG9wdXAnLCAnZG91YmxlYnVmZmVyJywgJ2RyYXcnLCAnZHJhdzInLAorJ2RyYXcyaScsICdkcmF3MnMnLCAnZHJhd2knLCAnZHJhd21vZGUnLCAnZHJhd3MnLCAnZWRpdG9iaicsCisnZW5kY2xvc2VkbGluZScsICdlbmRmdWxsc2NybicsICdlbmRsaW5lJywgJ2VuZHBpY2snLCAnZW5kcG9pbnQnLAorJ2VuZHBvbHlnb24nLCAnZW5kcHVwbW9kZScsICdlbmRzZWxlY3QnLCAnZW5kc3VyZmFjZScsICdlbmR0bWVzaCcsCisnZW5kdHJpbScsICdmaW5pc2gnLCAnZm9udCcsICdmb3JlZ3JvdW5kJywgJ2ZyZWVwdXAnLCAnZnJvbnRidWZmZXInLAorJ2Z1ZGdlJywgJ2Z1bGxzY3JuJywgJ2dSR0Jjb2xvcicsICdnUkdCbWFzaycsICdnYW1tYXJhbXAnLCAnZ2JlZ2luJywKKydnY29uZmlnJywgJ2dlbm9iaicsICdnZW50YWcnLCAnZ2V0YmFja2ZhY2UnLCAnZ2V0YnVmZmVyJywKKydnZXRidXR0b24nLCAnZ2V0Y21tb2RlJywgJ2dldGNvbG9yJywgJ2dldGNwb3MnLCAnZ2V0Y3Vyc29yJywKKydnZXRkY20nLCAnZ2V0ZGVwdGgnLCAnZ2V0ZGVzY2VuZGVyJywgJ2dldGRpc3BsYXltb2RlJywgJ2dldGRyYXdtb2RlJywKKydnZXRmb250JywgJ2dldGdkZXNjJywgJ2dldGdwb3MnLCAnZ2V0aGVpZ2h0JywgJ2dldGhpdGNvZGUnLAorJ2dldGxzYmFja3VwJywgJ2dldGxzcmVwZWF0JywgJ2dldGxzdHlsZScsICdnZXRsd2lkdGgnLCAnZ2V0bWFwJywKKydnZXRtYXRyaXgnLCAnZ2V0bWNvbG9yJywgJ2dldG1tb2RlJywgJ2dldG1vbml0b3InLAorJ2dldG51cmJzcHJvcGVydHknLCAnZ2V0b3Blbm9iaicsICdnZXRvcmlnaW4nLCAnZ2V0b3RoZXJtb25pdG9yJywKKydnZXRwYXR0ZXJuJywgJ2dldHBsYW5lcycsICdnZXRwb3J0JywgJ2dldHJlc2V0bHMnLCAnZ2V0c2NybWFzaycsCisnZ2V0c2hhZGUnLCAnZ2V0c2l6ZScsICdnZXRzbScsICdnZXR0cCcsICdnZXR2YWx1YXRvcicsICdnZXR2aWRlbycsCisnZ2V0dmlld3BvcnQnLCAnZ2V0d3JpdGVtYXNrJywgJ2dldHpidWZmZXInLCAnZ2V3cml0ZScsICdnZmx1c2gnLAorJ2dpbml0JywgJ2dsY29tcGF0JywgJ2dyZXNldCcsICdnc2VsZWN0JywgJ2dzeW5jJywgJ2d2ZXJzaW9uJywKKydpY29uc2l6ZScsICdpY29udGl0bGUnLCAnaW1ha2ViYWNrZ3JvdW5kJywgJ2luaXRuYW1lcycsICdpc21leCcsCisnaXNvYmonLCAnaXNxdWV1ZWQnLCAnaXN0YWcnLCAna2VlcGFzcGVjdCcsICdsUkdCcmFuZ2UnLCAnbGFtcG9mZicsCisnbGFtcG9uJywgJ2xpbmVzbW9vdGgnLCAnbGluZXdpZHRoJywgJ2xtYmluZCcsICdsbWNvbG9yJywgJ2xtZGVmJywKKydsb2FkbWF0cml4JywgJ2xvYWRuYW1lJywgJ2xvZ2ljb3AnLCAnbG9va2F0JywgJ2xyZWN0cmVhZCcsCisnbHJlY3R3cml0ZScsICdsc2JhY2t1cCcsICdsc2V0ZGVwdGgnLCAnbHNoYWRlcmFuZ2UnLCAnbHNyZXBlYXQnLAorJ21ha2VvYmonLCAnbWFrZXRhZycsICdtYXBjb2xvcicsICdtYXB3JywgJ21hcHcyJywgJ21heHNpemUnLAorJ21pbnNpemUnLCAnbW1vZGUnLCAnbW92ZScsICdtb3ZlMicsICdtb3ZlMmknLCAnbW92ZTJzJywgJ21vdmVpJywKKydtb3ZlcycsICdtdWx0aW1hcCcsICdtdWx0bWF0cml4JywgJ24zZicsICduZXdwdXAnLCAnbmV3dGFnJywKKydub2JvcmRlcicsICdub2lzZScsICdub3BvcnQnLCAnbm9ybWFsJywgJ251cmJzY3VydmUnLCAnbnVyYnNzdXJmYWNlJywKKydudmFycmF5JywgJ29iamRlbGV0ZScsICdvYmppbnNlcnQnLCAnb2JqcmVwbGFjZScsICdvbmVtYXAnLCAnb3J0aG8nLAorJ29ydGhvMicsICdvdmVybGF5JywgJ3BhY2tyZWN0JywgJ3BhZ2Vjb2xvcicsICdwYWdld3JpdGVtYXNrJywKKydwYXNzdGhyb3VnaCcsICdwYXRjaCcsICdwYXRjaGJhc2lzJywgJ3BhdGNoY3VydmVzJywgJ3BhdGNocHJlY2lzaW9uJywKKydwY2xvcycsICdwZHInLCAncGRyMicsICdwZHIyaScsICdwZHIycycsICdwZHJpJywgJ3BkcnMnLAorJ3BlcnNwZWN0aXZlJywgJ3BpY2snLCAncGlja3NpemUnLCAncGl4bW9kZScsICdwbXYnLCAncG12MicsICdwbXYyaScsCisncG12MnMnLCAncG12aScsICdwbXZzJywgJ3BudCcsICdwbnQyJywgJ3BudDJpJywgJ3BudDJzJywgJ3BudGknLAorJ3BudHMnLCAncG50c21vb3RoJywgJ3BvbGFydmlldycsICdwb2xmJywgJ3BvbGYyJywgJ3BvbGYyaScsICdwb2xmMnMnLAorJ3BvbGZpJywgJ3BvbGZzJywgJ3BvbHknLCAncG9seTInLCAncG9seTJpJywgJ3BvbHkycycsICdwb2x5aScsCisncG9seXMnLCAncG9wYXR0cmlidXRlcycsICdwb3BtYXRyaXgnLCAncG9wbmFtZScsICdwb3B2aWV3cG9ydCcsCisncHJlZnBvc2l0aW9uJywgJ3ByZWZzaXplJywgJ3B1cG1vZGUnLCAncHVzaGF0dHJpYnV0ZXMnLCAncHVzaG1hdHJpeCcsCisncHVzaG5hbWUnLCAncHVzaHZpZXdwb3J0JywgJ3B3bGN1cnZlJywgJ3FkZXZpY2UnLCAncWVudGVyJywgJ3FnZXRmZCcsCisncXJlYWQnLCAncXJlc2V0JywgJ3F0ZXN0JywgJ3JjcnYnLCAncmNydm4nLCAncmRyJywgJ3JkcjInLCAncmRyMmknLAorJ3JkcjJzJywgJ3JkcmknLCAncmRycycsICdyZWFkZGlzcGxheScsICdyZWFkc291cmNlJywgJ3JlY3QnLAorJ3JlY3Rjb3B5JywgJ3JlY3RmJywgJ3JlY3RmaScsICdyZWN0ZnMnLCAncmVjdGknLCAncmVjdHMnLCAncmVjdHpvb20nLAorJ3Jlc2V0bHMnLCAncmVzaGFwZXZpZXdwb3J0JywgJ3JpbmdiZWxsJywgJ3JtdicsICdybXYyJywgJ3JtdjJpJywKKydybXYycycsICdybXZpJywgJ3JtdnMnLCAncm90JywgJ3JvdGF0ZScsICdycGF0Y2gnLCAncnBkcicsICdycGRyMicsCisncnBkcjJpJywgJ3JwZHIycycsICdycGRyaScsICdycGRycycsICdycG12JywgJ3JwbXYyJywgJ3JwbXYyaScsCisncnBtdjJzJywgJ3JwbXZpJywgJ3JwbXZzJywgJ3Nib3gnLCAnc2JveGYnLCAnc2JveGZpJywgJ3Nib3hmcycsCisnc2JveGknLCAnc2JveHMnLCAnc2NhbGUnLCAnc2NyZWVuc3BhY2UnLCAnc2NybWFzaycsICdzZXRiZWxsJywKKydzZXRjdXJzb3InLCAnc2V0ZGVwdGgnLCAnc2V0bGluZXN0eWxlJywgJ3NldG1hcCcsICdzZXRtb25pdG9yJywKKydzZXRudXJic3Byb3BlcnR5JywgJ3NldHBhdHRlcm4nLCAnc2V0cHVwJywgJ3NldHNoYWRlJywgJ3NldHZhbHVhdG9yJywKKydzZXR2aWRlbycsICdzaGFkZW1vZGVsJywgJ3NoYWRlcmFuZ2UnLCAnc2luZ2xlYnVmZmVyJywgJ3Ntb290aGxpbmUnLAorJ3NwY2xvcycsICdzcGxmJywgJ3NwbGYyJywgJ3NwbGYyaScsICdzcGxmMnMnLCAnc3BsZmknLCAnc3BsZnMnLAorJ3N0ZXB1bml0JywgJ3N0cndpZHRoJywgJ3N1YnBpeGVsJywgJ3N3YXBidWZmZXJzJywgJ3N3YXBpbnRlcnZhbCcsCisnc3dhcHRtZXNoJywgJ3N3aW5vcGVuJywgJ3RleHRjb2xvcicsICd0ZXh0aW5pdCcsICd0ZXh0cG9ydCcsCisndGV4dHdyaXRlbWFzaycsICd0aWUnLCAndHBvZmYnLCAndHBvbicsICd0cmFuc2xhdGUnLCAndW5kZXJsYXknLAorJ3VucGFja3JlY3QnLCAndW5xZGV2aWNlJywgJ3YyZCcsICd2MmYnLCAndjJpJywgJ3YycycsICd2M2QnLCAndjNmJywKKyd2M2knLCAndjNzJywgJ3Y0ZCcsICd2NGYnLCAndjRpJywgJ3Y0cycsICd2YXJyYXknLCAndmlkZW9jbWQnLAorJ3ZpZXdwb3J0JywgJ3ZuYXJyYXknLCAnd2luYXR0YWNoJywgJ3dpbmNsb3NlJywgJ3dpbmNvbnN0cmFpbnRzJywKKyd3aW5kZXB0aCcsICd3aW5kb3cnLCAnd2luZ2V0JywgJ3dpbm1vdmUnLCAnd2lub3BlbicsICd3aW5wb3AnLAorJ3dpbnBvc2l0aW9uJywgJ3dpbnB1c2gnLCAnd2luc2V0JywgJ3dpbnRpdGxlJywgJ3dtcGFjaycsICd3cml0ZW1hc2snLAorJ3dyaXRlcGl4ZWxzJywgJ3hmcHQnLCAneGZwdDInLCAneGZwdDJpJywgJ3hmcHQycycsICd4ZnB0NCcsICd4ZnB0NGknLAorJ3hmcHQ0cycsICd4ZnB0aScsICd4ZnB0cycsICd6YnVmZmVyJywgJ3pjbGVhcicsICd6ZHJhdycsICd6ZnVuY3Rpb24nLAorJ3pzb3VyY2UnLCAnendyaXRlbWFzayddCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICAjIGluc3VyZSB0aGF0IHdlIGF0IGxlYXN0IGhhdmUgYW4gWCBkaXNwbGF5IGJlZm9yZSBjb250aW51aW5nLgorICAgIGltcG9ydCBvcworICAgIHRyeToKKyAgICAgICAgZGlzcGxheSA9IG9zLmVudmlyb25bJ0RJU1BMQVknXQorICAgIGV4Y2VwdDoKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QsICJObyAkRElTUExBWSAtLSBza2lwcGluZyBnbCB0ZXN0IgorCisgICAgIyB0b3VjaCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgZ2wgd2l0aG91dCBkb2luZyBhbnl0aGluZworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdUb3VjaGluZyBnbCBtb2R1bGUgYXR0cmlidXRlcy4uLicKKyAgICBmb3IgYXR0ciBpbiBnbGF0dHJzOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ3RvdWNoaW5nOiAnLCBhdHRyCisgICAgICAgIGdldGF0dHIoZ2wsIGF0dHIpCisKKyAgICAjIGNyZWF0ZSBhIHNtYWxsICdDcmlzc2Nyb3NzJyB3aW5kb3cKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnQ3JlYXRpbmcgYSBzbWFsbCAiQ3Jpc3NDcm9zcyIgd2luZG93Li4uJworICAgICAgICBwcmludCAnZm9yZWdyb3VuZCcKKyAgICBnbC5mb3JlZ3JvdW5kKCkKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAncHJlZnBvc2l0aW9uJworICAgIGdsLnByZWZwb3NpdGlvbig1MDAsIDkwMCwgNTAwLCA5MDApCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ3dpbm9wZW4gIkNyaXNzQ3Jvc3MiJworICAgIHcgPSBnbC53aW5vcGVuKCdDcmlzc0Nyb3NzJykKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnY2xlYXInCisgICAgZ2wuY2xlYXIoKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdvcnRobzInCisgICAgZ2wub3J0aG8yKDAuMCwgNDAwLjAsIDAuMCwgNDAwLjApCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2NvbG9yIFdISVRFJworICAgIGdsLmNvbG9yKEdMLldISVRFKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdjb2xvciBSRUQnCisgICAgZ2wuY29sb3IoR0wuUkVEKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdiZ25saW5lJworICAgIGdsLmJnbmxpbmUoKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICd2MmYnCisgICAgZ2wudjJmKDAuMCwgMC4wKQorICAgIGdsLnYyZig0MDAuMCwgNDAwLjApCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2VuZGxpbmUnCisgICAgZ2wuZW5kbGluZSgpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2JnbmxpbmUnCisgICAgZ2wuYmdubGluZSgpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ3YyaScKKyAgICBnbC52MmkoNDAwLCAwKQorICAgIGdsLnYyaSgwLCA0MDApCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2VuZGxpbmUnCisgICAgZ2wuZW5kbGluZSgpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ0Rpc3BsYXlpbmcgd2luZG93IGZvciAyIHNlY29uZHMuLi4nCisgICAgdGltZS5zbGVlcCgyKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICd3aW5jbG9zZScKKyAgICBnbC53aW5jbG9zZSh3KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTg5NTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2wucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTg5NTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2wucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsb2IucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNjBkMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iLnB5CkBAIC0wLDAgKzEsMTgxIEBACitpbXBvcnQgZ2xvYgoraW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBURVNURk4KKworCitkZWYgZnNkZWNvZGUocyk6CisgICAgcmV0dXJuIHVuaWNvZGUocywgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQorCisKK2NsYXNzIEdsb2JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgbm9ybShzZWxmLCAqcGFydHMpOgorICAgICAgICByZXR1cm4gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oc2VsZi50ZW1wZGlyLCAqcGFydHMpKQorCisgICAgZGVmIG1rdGVtcChzZWxmLCAqcGFydHMpOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYubm9ybSgqcGFydHMpCisgICAgICAgIGJhc2UsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYmFzZSk6CisgICAgICAgICAgICBvcy5tYWtlZGlycyhiYXNlKQorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3cnKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZW1wZGlyID0gVEVTVEZOICsgIl9kaXIiCisgICAgICAgIHNlbGYubWt0ZW1wKCdhJywgJ0QnKQorICAgICAgICBzZWxmLm1rdGVtcCgnYWFiJywgJ0YnKQorICAgICAgICBzZWxmLm1rdGVtcCgnLmFhJywgJ0cnKQorICAgICAgICBzZWxmLm1rdGVtcCgnLmJiJywgJ0gnKQorICAgICAgICBzZWxmLm1rdGVtcCgnYWFhJywgJ3p6ekYnKQorICAgICAgICBzZWxmLm1rdGVtcCgnWlpaJykKKyAgICAgICAgc2VsZi5ta3RlbXAoJ2EnLCAnYmNkJywgJ0VGJykKKyAgICAgICAgc2VsZi5ta3RlbXAoJ2EnLCAnYmNkJywgJ2VmZycsICdoYScpCisgICAgICAgIGlmIGhhc2F0dHIob3MsICdzeW1saW5rJyk6CisgICAgICAgICAgICBvcy5zeW1saW5rKHNlbGYubm9ybSgnYnJva2VuJyksIHNlbGYubm9ybSgnc3ltMScpKQorICAgICAgICAgICAgb3Muc3ltbGluaygnYnJva2VuJywgc2VsZi5ub3JtKCdzeW0yJykpCisgICAgICAgICAgICBvcy5zeW1saW5rKG9zLnBhdGguam9pbignYScsICdiY2QnKSwgc2VsZi5ub3JtKCdzeW0zJykpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi50ZW1wZGlyKQorCisgICAgZGVmIGdsb2Ioc2VsZiwgKnBhcnRzKToKKyAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAxOgorICAgICAgICAgICAgcGF0dGVybiA9IHBhcnRzWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXR0ZXJuID0gb3MucGF0aC5qb2luKCpwYXJ0cykKKyAgICAgICAgcCA9IG9zLnBhdGguam9pbihzZWxmLnRlbXBkaXIsIHBhdHRlcm4pCisgICAgICAgIHJlcyA9IGdsb2IuZ2xvYihwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZ2xvYi5pZ2xvYihwKSksIHJlcykKKyAgICAgICAgdXJlcyA9IFtmc2RlY29kZSh4KSBmb3IgeCBpbiByZXNdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2xvYi5nbG9iKGZzZGVjb2RlKHApKSwgdXJlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGdsb2IuaWdsb2IoZnNkZWNvZGUocCkpKSwgdXJlcykKKyAgICAgICAgcmV0dXJuIHJlcworCisgICAgZGVmIGFzc2VydFNlcXVlbmNlc0VxdWFsX25vb3JkZXIoc2VsZiwgbDEsIGwyKToKKyAgICAgICAgbDEgPSBsaXN0KGwxKQorICAgICAgICBsMiA9IGxpc3QobDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGwxKSwgc2V0KGwyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQobDEpLCBzb3J0ZWQobDIpKQorCisgICAgZGVmIHRlc3RfZ2xvYl9saXRlcmFsKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0U2VxdWVuY2VzRXF1YWxfbm9vcmRlcgorICAgICAgICBlcShzZWxmLmdsb2IoJ2EnKSwgW3NlbGYubm9ybSgnYScpXSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdhJywgJ0QnKSwgW3NlbGYubm9ybSgnYScsICdEJyldKQorICAgICAgICBlcShzZWxmLmdsb2IoJ2FhYicpLCBbc2VsZi5ub3JtKCdhYWInKV0pCisgICAgICAgIGVxKHNlbGYuZ2xvYignenltdXJneScpLCBbXSkKKworICAgICAgICByZXMgPSBnbG9iLmdsb2IoJyonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHt0eXBlKHIpIGZvciByIGluIHJlc30sIHtzdHJ9KQorICAgICAgICByZXMgPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKG9zLmN1cmRpciwgJyonKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7dHlwZShyKSBmb3IgciBpbiByZXN9LCB7c3RyfSkKKworICAgICAgICAjIHRlc3QgcmV0dXJuIHR5cGVzIGFyZSB1bmljb2RlLCBidXQgb25seSBpZiBvcy5saXN0ZGlyCisgICAgICAgICMgcmV0dXJucyB1bmljb2RlIGZpbGVuYW1lcworICAgICAgICB0bXAgPSBvcy5saXN0ZGlyKGZzZGVjb2RlKG9zLmN1cmRpcikpCisgICAgICAgIGlmIHt0eXBlKHgpIGZvciB4IGluIHRtcH0gPT0ge3VuaWNvZGV9OgorICAgICAgICAgICAgcmVzID0gZ2xvYi5nbG9iKHUnKicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHt0eXBlKHIpIGZvciByIGluIHJlc30sIHt1bmljb2RlfSkKKyAgICAgICAgICAgIHJlcyA9IGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oZnNkZWNvZGUob3MuY3VyZGlyKSwgdScqJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHt0eXBlKHIpIGZvciByIGluIHJlc30sIHt1bmljb2RlfSkKKworICAgIGRlZiB0ZXN0X2dsb2Jfb25lX2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydFNlcXVlbmNlc0VxdWFsX25vb3JkZXIKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdhKicpLCBtYXAoc2VsZi5ub3JtLCBbJ2EnLCAnYWFiJywgJ2FhYSddKSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCcqYScpLCBtYXAoc2VsZi5ub3JtLCBbJ2EnLCAnYWFhJ10pKQorICAgICAgICBlcShzZWxmLmdsb2IoJy4qJyksIG1hcChzZWxmLm5vcm0sIFsnLmFhJywgJy5iYiddKSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCc/YWEnKSwgbWFwKHNlbGYubm9ybSwgWydhYWEnXSkpCisgICAgICAgIGVxKHNlbGYuZ2xvYignYWE/JyksIG1hcChzZWxmLm5vcm0sIFsnYWFhJywgJ2FhYiddKSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdhYVthYl0nKSwgbWFwKHNlbGYubm9ybSwgWydhYWEnLCAnYWFiJ10pKQorICAgICAgICBlcShzZWxmLmdsb2IoJypxJyksIFtdKQorCisgICAgZGVmIHRlc3RfZ2xvYl9uZXN0ZWRfZGlyZWN0b3J5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0U2VxdWVuY2VzRXF1YWxfbm9vcmRlcgorICAgICAgICBpZiBvcy5wYXRoLm5vcm1jYXNlKCJhYkNEIikgPT0gImFiQ0QiOgorICAgICAgICAgICAgIyBjYXNlLXNlbnNpdGl2ZSBmaWxlc3lzdGVtCisgICAgICAgICAgICBlcShzZWxmLmdsb2IoJ2EnLCAnYmNkJywgJ0UqJyksIFtzZWxmLm5vcm0oJ2EnLCAnYmNkJywgJ0VGJyldKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBjYXNlIGluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0KKyAgICAgICAgICAgIGVxKHNlbGYuZ2xvYignYScsICdiY2QnLCAnRSonKSwgW3NlbGYubm9ybSgnYScsICdiY2QnLCAnRUYnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubm9ybSgnYScsICdiY2QnLCAnZWZnJyldKQorICAgICAgICBlcShzZWxmLmdsb2IoJ2EnLCAnYmNkJywgJypnJyksIFtzZWxmLm5vcm0oJ2EnLCAnYmNkJywgJ2VmZycpXSkKKworICAgIGRlZiB0ZXN0X2dsb2JfZGlyZWN0b3J5X25hbWVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0U2VxdWVuY2VzRXF1YWxfbm9vcmRlcgorICAgICAgICBlcShzZWxmLmdsb2IoJyonLCAnRCcpLCBbc2VsZi5ub3JtKCdhJywgJ0QnKV0pCisgICAgICAgIGVxKHNlbGYuZ2xvYignKicsICcqYScpLCBbXSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdhJywgJyonLCAnKicsICcqYScpLAorICAgICAgICAgICBbc2VsZi5ub3JtKCdhJywgJ2JjZCcsICdlZmcnLCAnaGEnKV0pCisgICAgICAgIGVxKHNlbGYuZ2xvYignP2E/JywgJypGJyksIFtzZWxmLm5vcm0oJ2FhYScsICd6enpGJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm0oJ2FhYicsICdGJyldKQorCisgICAgZGVmIHRlc3RfZ2xvYl9kaXJlY3Rvcnlfd2l0aF90cmFpbGluZ19zbGFzaChzZWxmKToKKyAgICAgICAgIyBQYXR0ZXJucyBlbmRpbmcgd2l0aCBhIHNsYXNoIHNob3VsZG4ndCBtYXRjaCBub24tZGlycworICAgICAgICByZXMgPSBnbG9iLmdsb2Ioc2VsZi5ub3JtKCdaKlonKSArIG9zLnNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFtdKQorICAgICAgICByZXMgPSBnbG9iLmdsb2Ioc2VsZi5ub3JtKCdaWlonKSArIG9zLnNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFtdKQorICAgICAgICAjIFdoZW4gdGhlcmUgaXMgYSB3aWxkY2FyZCBwYXR0ZXJuIHdoaWNoIGVuZHMgd2l0aCBvcy5zZXAsIGdsb2IoKQorICAgICAgICAjIGRvZXNuJ3QgYmxvdyB1cC4KKyAgICAgICAgcmVzID0gZ2xvYi5nbG9iKHNlbGYubm9ybSgnYWEqJykgKyBvcy5zZXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDIpCisgICAgICAgICMgZWl0aGVyIG9mIHRoZXNlIHJlc3VsdHMgaXMgcmVhc29uYWJsZQorICAgICAgICBzZWxmLmFzc2VydEluKHNldChyZXMpLCBbCisgICAgICAgICAgICAgICAgICAgICAge3NlbGYubm9ybSgnYWFhJyksIHNlbGYubm9ybSgnYWFiJyl9LAorICAgICAgICAgICAgICAgICAgICAgIHtzZWxmLm5vcm0oJ2FhYScpICsgb3Muc2VwLCBzZWxmLm5vcm0oJ2FhYicpICsgb3Muc2VwfSwKKyAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZ2xvYl91bmljb2RlX2RpcmVjdG9yeV93aXRoX3RyYWlsaW5nX3NsYXNoKHNlbGYpOgorICAgICAgICAjIFNhbWUgYXMgdGVzdF9nbG9iX2RpcmVjdG9yeV93aXRoX3RyYWlsaW5nX3NsYXNoLCBidXQgd2l0aCBhbgorICAgICAgICAjIHVuaWNvZGUgYXJndW1lbnQuCisgICAgICAgIHJlcyA9IGdsb2IuZ2xvYihmc2RlY29kZShzZWxmLm5vcm0oJ1oqWicpICsgb3Muc2VwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFtdKQorICAgICAgICByZXMgPSBnbG9iLmdsb2IoZnNkZWNvZGUoc2VsZi5ub3JtKCdaWlonKSArIG9zLnNlcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBbXSkKKyAgICAgICAgcmVzID0gZ2xvYi5nbG9iKGZzZGVjb2RlKHNlbGYubm9ybSgnYWEqJykgKyBvcy5zZXApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAyKQorICAgICAgICAjIGVpdGhlciBvZiB0aGVzZSByZXN1bHRzIGlzIHJlYXNvbmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzZXQocmVzKSwgWworICAgICAgICAgICAgICAgICAgICAgIHtmc2RlY29kZShzZWxmLm5vcm0oJ2FhYScpKSwgZnNkZWNvZGUoc2VsZi5ub3JtKCdhYWInKSl9LAorICAgICAgICAgICAgICAgICAgICAgIHtmc2RlY29kZShzZWxmLm5vcm0oJ2FhYScpICsgb3Muc2VwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZnNkZWNvZGUoc2VsZi5ub3JtKCdhYWInKSArIG9zLnNlcCl9LAorICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc3ltbGluaycpLCAiUmVxdWlyZXMgc3ltbGluayBzdXBwb3J0IikKKyAgICBkZWYgdGVzdF9nbG9iX3N5bWxpbmtzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0U2VxdWVuY2VzRXF1YWxfbm9vcmRlcgorICAgICAgICBlcShzZWxmLmdsb2IoJ3N5bTMnKSwgW3NlbGYubm9ybSgnc3ltMycpXSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdzeW0zJywgJyonKSwgW3NlbGYubm9ybSgnc3ltMycsICdFRicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3JtKCdzeW0zJywgJ2VmZycpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzZWxmLmdsb2IoJ3N5bTMnICsgb3Muc2VwKSwKKyAgICAgICAgICAgICAgICAgICAgICBbW3NlbGYubm9ybSgnc3ltMycpXSwgW3NlbGYubm9ybSgnc3ltMycpICsgb3Muc2VwXV0pCisgICAgICAgIGVxKHNlbGYuZ2xvYignKicsICcqRicpLAorICAgICAgICAgICBbc2VsZi5ub3JtKCdhYWEnLCAnenp6RicpLCBzZWxmLm5vcm0oJ2FhYicsICdGJyksCisgICAgICAgICAgICBzZWxmLm5vcm0oJ3N5bTMnLCAnRUYnKV0pCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc3ltbGluaycpLCAiUmVxdWlyZXMgc3ltbGluayBzdXBwb3J0IikKKyAgICBkZWYgdGVzdF9nbG9iX2Jyb2tlbl9zeW1saW5rcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydFNlcXVlbmNlc0VxdWFsX25vb3JkZXIKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdzeW0qJyksIFtzZWxmLm5vcm0oJ3N5bTEnKSwgc2VsZi5ub3JtKCdzeW0yJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3JtKCdzeW0zJyldKQorICAgICAgICBlcShzZWxmLmdsb2IoJ3N5bTEnKSwgW3NlbGYubm9ybSgnc3ltMScpXSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdzeW0yJyksIFtzZWxmLm5vcm0oJ3N5bTInKV0pCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbjMyIHNwZWNpZmljIHRlc3QiKQorICAgIGRlZiB0ZXN0X2dsb2JfbWFnaWNfaW5fZHJpdmUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRTZXF1ZW5jZXNFcXVhbF9ub29yZGVyCisgICAgICAgIGVxKGdsb2IuZ2xvYignKjonKSwgW10pCisgICAgICAgIGVxKGdsb2IuZ2xvYih1Jyo6JyksIFtdKQorICAgICAgICBlcShnbG9iLmdsb2IoJz86JyksIFtdKQorICAgICAgICBlcShnbG9iLmdsb2IodSc/OicpLCBbXSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEdsb2JUZXN0cykKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsb2IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNzZhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsb2IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNzZhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iYWwucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjYjE5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsb2JhbC5weQpAQCAtMCwwICsxLDUyIEBACisiIiJWZXJpZnkgdGhhdCB3YXJuaW5ncyBhcmUgaXNzdWVkIGZvciBnbG9iYWwgc3RhdGVtZW50cyBmb2xsb3dpbmcgdXNlLiIiIgorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNoZWNrX3N5bnRheF9lcnJvcgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKKworCitjbGFzcyBHbG9iYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdDEoc2VsZik6CisgICAgICAgIHByb2dfdGV4dF8xID0gIiIiXAorZGVmIHdyb25nMSgpOgorICAgIGEgPSAxCisgICAgYiA9IDIKKyAgICBnbG9iYWwgYQorICAgIGdsb2JhbCBiCisiIiIKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsIHByb2dfdGV4dF8xKQorCisgICAgZGVmIHRlc3QyKHNlbGYpOgorICAgICAgICBwcm9nX3RleHRfMiA9ICIiIlwKK2RlZiB3cm9uZzIoKToKKyAgICBwcmludCB4CisgICAgZ2xvYmFsIHgKKyIiIgorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgcHJvZ190ZXh0XzIpCisKKyAgICBkZWYgdGVzdDMoc2VsZik6CisgICAgICAgIHByb2dfdGV4dF8zID0gIiIiXAorZGVmIHdyb25nMygpOgorICAgIHByaW50IHgKKyAgICB4ID0gMgorICAgIGdsb2JhbCB4CisiIiIKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsIHByb2dfdGV4dF8zKQorCisgICAgZGVmIHRlc3Q0KHNlbGYpOgorICAgICAgICBwcm9nX3RleHRfNCA9ICIiIlwKK2dsb2JhbCB4Cit4ID0gMgorIiIiCisgICAgICAgICMgdGhpcyBzaG91bGQgd29yaworICAgICAgICBjb21waWxlKHByb2dfdGV4dF80LCAiPHRlc3Qgc3RyaW5nPiIsICJleGVjIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCBtb2R1bGU9Ijx0ZXN0IHN0cmluZz4iKQorICAgICAgICBydW5fdW5pdHRlc3QoR2xvYmFsVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsb2JhbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iYWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZGU4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iYWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsb2JhbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iYWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZGU4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iYWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dyYW1tYXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ncmFtbWFyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Y2MwODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ncmFtbWFyLnB5CkBAIC0wLDAgKzEsMTAyMSBAQAorIyBQeXRob24gdGVzdCBzZXQgLS0gcGFydCAxLCBncmFtbWFyLgorIyBUaGlzIGp1c3QgdGVzdHMgd2hldGhlciB0aGUgcGFyc2VyIGFjY2VwdHMgdGhlbSBhbGwuCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfc3ludGF4X2Vycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19weTNrX3dhcm5pbmdzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKKyMgdGVzdGluZyBpbXBvcnQgKgorZnJvbSBzeXMgaW1wb3J0ICoKKworCitjbGFzcyBUb2tlblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0QmFja3NsYXNoKHNlbGYpOgorICAgICAgICAjIEJhY2tzbGFzaCBtZWFucyBsaW5lIGNvbnRpbnVhdGlvbjoKKyAgICAgICAgeCA9IDEgXAorICAgICAgICArIDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCAyLCAnYmFja3NsYXNoIGZvciBsaW5lIGNvbnRpbnVhdGlvbicpCisKKyAgICAgICAgIyBCYWNrc2xhc2ggZG9lcyBub3QgbWVhbnMgY29udGludWF0aW9uIGluIGNvbW1lbnRzIDpcCisgICAgICAgIHggPSAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgMCwgJ2JhY2tzbGFzaCBlbmRpbmcgY29tbWVudCcpCisKKyAgICBkZWYgdGVzdFBsYWluSW50ZWdlcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHhmZiwgMjU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAzNzcsIDI1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyMTQ3NDgzNjQ3LCAwMTc3Nzc3Nzc3NzcpCisgICAgICAgICMgIjB4IiBpcyBub3QgYSB2YWxpZCBsaXRlcmFsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiMHgiKQorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgbWF4aW50CisgICAgICAgIGlmIG1heGludCA9PSAyMTQ3NDgzNjQ3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMjE0NzQ4MzY0Ny0xLCAtMDIwMDAwMDAwMDAwKQorICAgICAgICAgICAgIyBYWFggLTIxNDc0ODM2NDgKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwMzc3Nzc3Nzc3NzcgPiAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDB4ZmZmZmZmZmYgPiAwKQorICAgICAgICAgICAgZm9yIHMgaW4gJzIxNDc0ODM2NDgnLCAnMDQwMDAwMDAwMDAwJywgJzB4MTAwMDAwMDAwJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHggPSBldmFsKHMpCisgICAgICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiT3ZlcmZsb3dFcnJvciBvbiBodWdlIGludGVnZXIgbGl0ZXJhbCAlciIgJSBzKQorICAgICAgICBlbGlmIG1heGludCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtOTIyMzM3MjAzNjg1NDc3NTgwNy0xLCAtMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDApCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcgPiAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDB4ZmZmZmZmZmZmZmZmZmZmZiA+IDApCisgICAgICAgICAgICBmb3IgcyBpbiAnOTIyMzM3MjAzNjg1NDc3NTgwOCcsICcwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsIFwKKyAgICAgICAgICAgICAgICAgICAgICcweDEwMDAwMDAwMDAwMDAwMDAwJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHggPSBldmFsKHMpCisgICAgICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiT3ZlcmZsb3dFcnJvciBvbiBodWdlIGludGVnZXIgbGl0ZXJhbCAlciIgJSBzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdXZWlyZCBtYXhpbnQgdmFsdWUgJXInICUgbWF4aW50KQorCisgICAgZGVmIHRlc3RMb25nSW50ZWdlcnMoc2VsZik6CisgICAgICAgIHggPSAwTAorICAgICAgICB4ID0gMGwKKyAgICAgICAgeCA9IDB4ZmZmZmZmZmZmZmZmZmZmZkwKKyAgICAgICAgeCA9IDB4ZmZmZmZmZmZmZmZmZmZmZmwKKyAgICAgICAgeCA9IDA3Nzc3Nzc3Nzc3Nzc3Nzc3N0wKKyAgICAgICAgeCA9IDA3Nzc3Nzc3Nzc3Nzc3Nzc3N2wKKyAgICAgICAgeCA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MEwKKyAgICAgICAgeCA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MGwKKworICAgIGRlZiB0ZXN0RmxvYXRzKHNlbGYpOgorICAgICAgICB4ID0gMy4xNAorICAgICAgICB4ID0gMzE0LgorICAgICAgICB4ID0gMC4zMTQKKyAgICAgICAgIyBYWFggeCA9IDAwMC4zMTQKKyAgICAgICAgeCA9IC4zMTQKKyAgICAgICAgeCA9IDNlMTQKKyAgICAgICAgeCA9IDNFMTQKKyAgICAgICAgeCA9IDNlLTE0CisgICAgICAgIHggPSAzZSsxNAorICAgICAgICB4ID0gMy5lMTQKKyAgICAgICAgeCA9IC4zZTE0CisgICAgICAgIHggPSAzLjFlNAorCisgICAgZGVmIHRlc3RTdHJpbmdMaXRlcmFscyhzZWxmKToKKyAgICAgICAgeCA9ICcnOyB5ID0gIiI7IHNlbGYuYXNzZXJ0VHJ1ZShsZW4oeCkgPT0gMCBhbmQgeCA9PSB5KQorICAgICAgICB4ID0gJ1wnJzsgeSA9ICInIjsgc2VsZi5hc3NlcnRUcnVlKGxlbih4KSA9PSAxIGFuZCB4ID09IHkgYW5kIG9yZCh4KSA9PSAzOSkKKyAgICAgICAgeCA9ICciJzsgeSA9ICJcIiI7IHNlbGYuYXNzZXJ0VHJ1ZShsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzQpCisgICAgICAgIHggPSAiZG9lc24ndCBcInNocmlua1wiIGRvZXMgaXQiCisgICAgICAgIHkgPSAnZG9lc25cJ3QgInNocmluayIgZG9lcyBpdCcKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih4KSA9PSAyNCBhbmQgeCA9PSB5KQorICAgICAgICB4ID0gImRvZXMgXCJzaHJpbmtcIiBkb2Vzbid0IGl0IgorICAgICAgICB5ID0gJ2RvZXMgInNocmluayIgZG9lc25cJ3QgaXQnCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oeCkgPT0gMjQgYW5kIHggPT0geSkKKyAgICAgICAgeCA9ICIiIgorVGhlICJxdWljayIKK2Jyb3duIGZveAoranVtcHMgb3ZlcgordGhlICdsYXp5JyBkb2cuCisiIiIKKyAgICAgICAgeSA9ICdcblRoZSAicXVpY2siXG5icm93biBmb3hcbmp1bXBzIG92ZXJcbnRoZSBcJ2xhenlcJyBkb2cuXG4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgeSA9ICcnJworVGhlICJxdWljayIKK2Jyb3duIGZveAoranVtcHMgb3ZlcgordGhlICdsYXp5JyBkb2cuCisnJycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICB5ID0gIlxuXAorVGhlIFwicXVpY2tcIlxuXAorYnJvd24gZm94XG5cCitqdW1wcyBvdmVyXG5cCit0aGUgJ2xhenknIGRvZy5cblwKKyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICB5ID0gJ1xuXAorVGhlIFwicXVpY2tcIlxuXAorYnJvd24gZm94XG5cCitqdW1wcyBvdmVyXG5cCit0aGUgXCdsYXp5XCcgZG9nLlxuXAorJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHkpCisKKworY2xhc3MgR3JhbW1hclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICMgc2luZ2xlX2lucHV0OiBORVdMSU5FIHwgc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10IE5FV0xJTkUKKyAgICAjIFhYWCBjYW4ndCB0ZXN0IGluIGEgc2NyaXB0IC0tIHRoaXMgcnVsZSBpcyBvbmx5IHVzZWQgd2hlbiBpbnRlcmFjdGl2ZQorCisgICAgIyBmaWxlX2lucHV0OiAoTkVXTElORSB8IHN0bXQpKiBFTkRNQVJLRVIKKyAgICAjIEJlaW5nIHRlc3RlZCBhcyB0aGlzIHZlcnkgbW9tZW50IHRoaXMgdmVyeSBtb2R1bGUKKworICAgICMgZXhwcl9pbnB1dDogdGVzdGxpc3QgTkVXTElORQorICAgICMgWFhYIEhhcmQgdG8gdGVzdCAtLSB1c2VkIG9ubHkgaW4gY2FsbHMgdG8gaW5wdXQoKQorCisgICAgZGVmIHRlc3RFdmFsSW5wdXQoc2VsZik6CisgICAgICAgICMgdGVzdGxpc3QgRU5ETUFSS0VSCisgICAgICAgIHggPSBldmFsKCcxLCAwIG9yIDEnKQorCisgICAgZGVmIHRlc3RGdW5jZGVmKHNlbGYpOgorICAgICAgICAjIyMgJ2RlZicgTkFNRSBwYXJhbWV0ZXJzICc6JyBzdWl0ZQorICAgICAgICAjIyMgcGFyYW1ldGVyczogJygnIFt2YXJhcmdzbGlzdF0gJyknCisgICAgICAgICMjIyB2YXJhcmdzbGlzdDogKGZwZGVmIFsnPScgdGVzdF0gJywnKSogKCcqJyBOQU1FIFsnLCcgKCcqKid8JyonICcqJykgTkFNRV0KKyAgICAgICAgIyMjICAgICAgICAgICAgfCAoJyoqJ3wnKicgJyonKSBOQU1FKQorICAgICAgICAjIyMgICAgICAgICAgICB8IGZwZGVmIFsnPScgdGVzdF0gKCcsJyBmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10KKyAgICAgICAgIyMjIGZwZGVmOiBOQU1FIHwgJygnIGZwbGlzdCAnKScKKyAgICAgICAgIyMjIGZwbGlzdDogZnBkZWYgKCcsJyBmcGRlZikqIFsnLCddCisgICAgICAgICMjIyBhcmdsaXN0OiAoYXJndW1lbnQgJywnKSogKGFyZ3VtZW50IHwgKicgdGVzdCBbJywnICcqKicgdGVzdF0gfCAnKionIHRlc3QpCisgICAgICAgICMjIyBhcmd1bWVudDogW3Rlc3QgJz0nXSB0ZXN0ICAgIyBSZWFsbHkgW2tleXdvcmQgJz0nXSB0ZXN0CisgICAgICAgIGRlZiBmMSgpOiBwYXNzCisgICAgICAgIGYxKCkKKyAgICAgICAgZjEoKigpKQorICAgICAgICBmMSgqKCksICoqe30pCisgICAgICAgIGRlZiBmMihvbmVfYXJndW1lbnQpOiBwYXNzCisgICAgICAgIGRlZiBmMyh0d28sIGFyZ3VtZW50cyk6IHBhc3MKKyAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICBleGVjKCdkZWYgZjQodHdvLCAoY29tcG91bmQsIChhcmd1bWVudCwgbGlzdCkpKTogcGFzcycpCisgICAgICAgIGV4ZWMoJ2RlZiBmNSgoY29tcG91bmQsIGZpcnN0KSwgdHdvKTogcGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ29uZV9hcmd1bWVudCcsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMy5mdW5jX2NvZGUuY29fdmFybmFtZXMsICgndHdvJywgJ2FyZ3VtZW50cycpKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmNC5mdW5jX2NvZGUuY29fdmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAgKCd0d28nLCAnKGNvbXBvdW5kLCAoYXJndW1lbnQsIGxpc3QpKScsICdjb21wb3VuZCcsICdhcmd1bWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsaXN0JywpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmNS5mdW5jX2NvZGUuY29fdmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAgKCcoY29tcG91bmQsIGZpcnN0KScsICd0d28nLCAnY29tcG91bmQnLCAnZmlyc3QnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjQuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgKCd0d28nLCAnLjEnLCAnY29tcG91bmQnLCAnYXJndW1lbnQnLCAgJ2xpc3QnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjUuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgKCcuMCcsICd0d28nLCAnY29tcG91bmQnLCAnZmlyc3QnKSkKKyAgICAgICAgZGVmIGExKG9uZV9hcmcsKTogcGFzcworICAgICAgICBkZWYgYTIodHdvLCBhcmdzLCk6IHBhc3MKKyAgICAgICAgZGVmIHYwKCpyZXN0KTogcGFzcworICAgICAgICBkZWYgdjEoYSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGRlZiB2MihhLCBiLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICBleGVjKCdkZWYgdjMoYSwgKGIsIGMpLCAqcmVzdCk6IHJldHVybiBhLCBiLCBjLCByZXN0JykKKworICAgICAgICBmMSgpCisgICAgICAgIGYyKDEpCisgICAgICAgIGYyKDEsKQorICAgICAgICBmMygxLCAyKQorICAgICAgICBmMygxLCAyLCkKKyAgICAgICAgZjQoMSwgKDIsICgzLCA0KSkpCisgICAgICAgIHYwKCkKKyAgICAgICAgdjAoMSkKKyAgICAgICAgdjAoMSwpCisgICAgICAgIHYwKDEsMikKKyAgICAgICAgdjAoMSwyLDMsNCw1LDYsNyw4LDksMCkKKyAgICAgICAgdjEoMSkKKyAgICAgICAgdjEoMSwpCisgICAgICAgIHYxKDEsMikKKyAgICAgICAgdjEoMSwyLDMpCisgICAgICAgIHYxKDEsMiwzLDQsNSw2LDcsOCw5LDApCisgICAgICAgIHYyKDEsMikKKyAgICAgICAgdjIoMSwyLDMpCisgICAgICAgIHYyKDEsMiwzLDQpCisgICAgICAgIHYyKDEsMiwzLDQsNSw2LDcsOCw5LDApCisgICAgICAgIHYzKDEsKDIsMykpCisgICAgICAgIHYzKDEsKDIsMyksNCkKKyAgICAgICAgdjMoMSwoMiwzKSw0LDUsNiw3LDgsOSwwKQorCisgICAgICAgICMgY2V2YWwgdW5wYWNrcyB0aGUgZm9ybWFsIGFyZ3VtZW50cyBpbnRvIHRoZSBmaXJzdCBhcmdjb3VudCBuYW1lczsKKyAgICAgICAgIyB0aHVzLCB0aGUgbmFtZXMgbmVzdGVkIGluc2lkZSB0dXBsZXMgbXVzdCBhcHBlYXIgYWZ0ZXIgdGhlc2UgbmFtZXMuCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYzLmZ1bmNfY29kZS5jb192YXJuYW1lcywgKCdhJywgJyhiLCBjKScsICdyZXN0JywgJ2InLCAnYycpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2My5mdW5jX2NvZGUuY29fdmFybmFtZXMsICgnYScsICcuMScsICdyZXN0JywgJ2InLCAnYycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYzKDEsICgyLCAzKSwgNCksICgxLCAyLCAzLCAoNCwpKSkKKyAgICAgICAgZGVmIGQwMShhPTEpOiBwYXNzCisgICAgICAgIGQwMSgpCisgICAgICAgIGQwMSgxKQorICAgICAgICBkMDEoKigxLCkpCisgICAgICAgIGQwMSgqKnsnYSc6Mn0pCisgICAgICAgIGRlZiBkMTEoYSwgYj0xKTogcGFzcworICAgICAgICBkMTEoMSkKKyAgICAgICAgZDExKDEsIDIpCisgICAgICAgIGQxMSgxLCAqKnsnYic6Mn0pCisgICAgICAgIGRlZiBkMjEoYSwgYiwgYz0xKTogcGFzcworICAgICAgICBkMjEoMSwgMikKKyAgICAgICAgZDIxKDEsIDIsIDMpCisgICAgICAgIGQyMSgqKDEsIDIsIDMpKQorICAgICAgICBkMjEoMSwgKigyLCAzKSkKKyAgICAgICAgZDIxKDEsIDIsICooMywpKQorICAgICAgICBkMjEoMSwgMiwgKip7J2MnOjN9KQorICAgICAgICBkZWYgZDAyKGE9MSwgYj0yKTogcGFzcworICAgICAgICBkMDIoKQorICAgICAgICBkMDIoMSkKKyAgICAgICAgZDAyKDEsIDIpCisgICAgICAgIGQwMigqKDEsIDIpKQorICAgICAgICBkMDIoMSwgKigyLCkpCisgICAgICAgIGQwMigxLCAqKnsnYic6Mn0pCisgICAgICAgIGQwMigqKnsnYSc6IDEsICdiJzogMn0pCisgICAgICAgIGRlZiBkMTIoYSwgYj0xLCBjPTIpOiBwYXNzCisgICAgICAgIGQxMigxKQorICAgICAgICBkMTIoMSwgMikKKyAgICAgICAgZDEyKDEsIDIsIDMpCisgICAgICAgIGRlZiBkMjIoYSwgYiwgYz0xLCBkPTIpOiBwYXNzCisgICAgICAgIGQyMigxLCAyKQorICAgICAgICBkMjIoMSwgMiwgMykKKyAgICAgICAgZDIyKDEsIDIsIDMsIDQpCisgICAgICAgIGRlZiBkMDF2KGE9MSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQwMXYoKQorICAgICAgICBkMDF2KDEpCisgICAgICAgIGQwMXYoMSwgMikKKyAgICAgICAgZDAxdigqKDEsIDIsIDMsIDQpKQorICAgICAgICBkMDF2KCooMSwpKQorICAgICAgICBkMDF2KCoqeydhJzoyfSkKKyAgICAgICAgZGVmIGQxMXYoYSwgYj0xLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDExdigxKQorICAgICAgICBkMTF2KDEsIDIpCisgICAgICAgIGQxMXYoMSwgMiwgMykKKyAgICAgICAgZGVmIGQyMXYoYSwgYiwgYz0xLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDIxdigxLCAyKQorICAgICAgICBkMjF2KDEsIDIsIDMpCisgICAgICAgIGQyMXYoMSwgMiwgMywgNCkKKyAgICAgICAgZDIxdigqKDEsIDIsIDMsIDQpKQorICAgICAgICBkMjF2KDEsIDIsICoqeydjJzogM30pCisgICAgICAgIGRlZiBkMDJ2KGE9MSwgYj0yLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDAydigpCisgICAgICAgIGQwMnYoMSkKKyAgICAgICAgZDAydigxLCAyKQorICAgICAgICBkMDJ2KDEsIDIsIDMpCisgICAgICAgIGQwMnYoMSwgKigyLCAzLCA0KSkKKyAgICAgICAgZDAydigqKnsnYSc6IDEsICdiJzogMn0pCisgICAgICAgIGRlZiBkMTJ2KGEsIGI9MSwgYz0yLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDEydigxKQorICAgICAgICBkMTJ2KDEsIDIpCisgICAgICAgIGQxMnYoMSwgMiwgMykKKyAgICAgICAgZDEydigxLCAyLCAzLCA0KQorICAgICAgICBkMTJ2KCooMSwgMiwgMywgNCkpCisgICAgICAgIGQxMnYoMSwgMiwgKigzLCA0LCA1KSkKKyAgICAgICAgZDEydigxLCAqKDIsKSwgKip7J2MnOiAzfSkKKyAgICAgICAgZGVmIGQyMnYoYSwgYiwgYz0xLCBkPTIsICpyZXN0KTogcGFzcworICAgICAgICBkMjJ2KDEsIDIpCisgICAgICAgIGQyMnYoMSwgMiwgMykKKyAgICAgICAgZDIydigxLCAyLCAzLCA0KQorICAgICAgICBkMjJ2KDEsIDIsIDMsIDQsIDUpCisgICAgICAgIGQyMnYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDIydigxLCAyLCAqKDMsIDQsIDUpKQorICAgICAgICBkMjJ2KDEsICooMiwgMyksICoqeydkJzogNH0pCisgICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKyAgICAgICAgZXhlYygnZGVmIGQzMXYoKHgpKTogcGFzcycpCisgICAgICAgIGV4ZWMoJ2RlZiBkMzJ2KCh4LCkpOiBwYXNzJykKKyAgICAgICAgZDMxdigxKQorICAgICAgICBkMzJ2KCgxLCkpCisKKyAgICAgICAgIyBrZXl3b3JkIGFyZ3VtZW50cyBhZnRlciAqYXJnbGlzdAorICAgICAgICBkZWYgZigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIGFyZ3MsIGt3YXJncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoMSwgeD0yLCAqWzMsIDRdLCB5PTUpLCAoKDEsIDMsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsneCc6MiwgJ3knOjV9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICJmKDEsICooMiwzKSwgNCkiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgImYoMSwgeD0yLCAqKDMsNCksIHg9NSkiKQorCisgICAgICAgICMgQ2hlY2sgYXN0IGVycm9ycyBpbiAqYXJncyBhbmQgKmt3YXJncworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImYoKmcoMT0yKSkiKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImYoKipnKDE9MikpIikKKworICAgIGRlZiB0ZXN0TGFtYmRlZihzZWxmKToKKyAgICAgICAgIyMjIGxhbWJkZWY6ICdsYW1iZGEnIFt2YXJhcmdzbGlzdF0gJzonIHRlc3QKKyAgICAgICAgbDEgPSBsYW1iZGEgOiAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEoKSwgMCkKKyAgICAgICAgbDIgPSBsYW1iZGEgOiBhW2RdICMgWFhYIGp1c3QgdGVzdGluZyB0aGUgZXhwcmVzc2lvbgorICAgICAgICBsMyA9IGxhbWJkYSA6IFsyIDwgeCBmb3IgeCBpbiBbLTEsIDMsIDBMXV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMygpLCBbMCwgMSwgMF0pCisgICAgICAgIGw0ID0gbGFtYmRhIHggPSBsYW1iZGEgeSA9IGxhbWJkYSB6PTEgOiB6IDogeSgpIDogeCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDQoKSwgMSkKKyAgICAgICAgbDUgPSBsYW1iZGEgeCwgeSwgej0yOiB4ICsgeSArIHoKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsNSgxLCAyKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsNSgxLCAyLCAzKSwgNikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJsYW1iZGEgeDogeCA9IDIiKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImxhbWJkYSAoTm9uZSwpOiBOb25lIikKKworICAgICMjIyBzdG10OiBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQKKyAgICAjIFRlc3RlZCBiZWxvdworCisgICAgZGVmIHRlc3RTaW1wbGVTdG10KHNlbGYpOgorICAgICAgICAjIyMgc2ltcGxlX3N0bXQ6IHNtYWxsX3N0bXQgKCc7JyBzbWFsbF9zdG10KSogWyc7J10KKyAgICAgICAgeCA9IDE7IHBhc3M7IGRlbCB4CisgICAgICAgIGRlZiBmb28oKToKKyAgICAgICAgICAgICMgdmVyaWZ5IHN0YXRlbWVudHMgdGhhdCBlbmQgd2l0aCBzZW1pLWNvbG9ucworICAgICAgICAgICAgeCA9IDE7IHBhc3M7IGRlbCB4OworICAgICAgICBmb28oKQorCisgICAgIyMjIHNtYWxsX3N0bXQ6IGV4cHJfc3RtdCB8IHByaW50X3N0bXQgIHwgcGFzc19zdG10IHwgZGVsX3N0bXQgfCBmbG93X3N0bXQgfCBpbXBvcnRfc3RtdCB8IGdsb2JhbF9zdG10IHwgYWNjZXNzX3N0bXQgfCBleGVjX3N0bXQKKyAgICAjIFRlc3RlZCBiZWxvdworCisgICAgZGVmIHRlc3RFeHByU3RtdChzZWxmKToKKyAgICAgICAgIyAoZXhwcmxpc3QgJz0nKSogZXhwcmxpc3QKKyAgICAgICAgMQorICAgICAgICAxLCAyLCAzCisgICAgICAgIHggPSAxCisgICAgICAgIHggPSAxLCAyLCAzCisgICAgICAgIHggPSB5ID0geiA9IDEsIDIsIDMKKyAgICAgICAgeCwgeSwgeiA9IDEsIDIsIDMKKyAgICAgICAgYWJjID0gYSwgYiwgYyA9IHgsIHksIHogPSB4eXogPSAxLCAyLCAoMywgNCkKKworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgInggKyAxID0gMSIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiYSArIDEgPSBiICsgMiIpCisKKyAgICBkZWYgdGVzdFByaW50U3RtdChzZWxmKToKKyAgICAgICAgIyAncHJpbnQnICh0ZXN0ICcsJykqIFt0ZXN0XQorICAgICAgICBpbXBvcnQgU3RyaW5nSU8KKworICAgICAgICAjIENhbid0IHRlc3QgcHJpbnRpbmcgdG8gcmVhbCBzdGRvdXQgd2l0aG91dCBjb21wYXJpbmcgb3V0cHV0CisgICAgICAgICMgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBpbiB1bml0dGVzdC4KKyAgICAgICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHN5cy5zdGRvdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisKKyAgICAgICAgcHJpbnQgMSwgMiwgMworICAgICAgICBwcmludCAxLCAyLCAzLAorICAgICAgICBwcmludAorICAgICAgICBwcmludCAwIG9yIDEsIDAgb3IgMSwKKyAgICAgICAgcHJpbnQgMCBvciAxCisKKyAgICAgICAgIyAncHJpbnQnICc+PicgdGVzdCAnLCcKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dCwgMSwgMiwgMworICAgICAgICBwcmludCA+PiBzeXMuc3Rkb3V0LCAxLCAyLCAzLAorICAgICAgICBwcmludCA+PiBzeXMuc3Rkb3V0CisgICAgICAgIHByaW50ID4+IHN5cy5zdGRvdXQsIDAgb3IgMSwgMCBvciAxLAorICAgICAgICBwcmludCA+PiBzeXMuc3Rkb3V0LCAwIG9yIDEKKworICAgICAgICAjIHRlc3QgcHJpbnRpbmcgdG8gYW4gaW5zdGFuY2UKKyAgICAgICAgY2xhc3MgR3VscDoKKyAgICAgICAgICAgIGRlZiB3cml0ZShzZWxmLCBtc2cpOiBwYXNzCisKKyAgICAgICAgZ3VscCA9IEd1bHAoKQorICAgICAgICBwcmludCA+PiBndWxwLCAxLCAyLCAzCisgICAgICAgIHByaW50ID4+IGd1bHAsIDEsIDIsIDMsCisgICAgICAgIHByaW50ID4+IGd1bHAKKyAgICAgICAgcHJpbnQgPj4gZ3VscCwgMCBvciAxLCAwIG9yIDEsCisgICAgICAgIHByaW50ID4+IGd1bHAsIDAgb3IgMQorCisgICAgICAgICMgdGVzdCBwcmludCA+PiBOb25lCisgICAgICAgIGRlZiBkcml2ZXIoKToKKyAgICAgICAgICAgIG9sZHN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBHdWxwKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ZWxsbWUoR3VscCgpKQorICAgICAgICAgICAgICAgIHRlbGxtZSgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBvbGRzdGRvdXQKKworICAgICAgICAjIHdlIHNob3VsZCBzZWUgdGhpcyBvbmNlCisgICAgICAgIGRlZiB0ZWxsbWUoZmlsZT1zeXMuc3Rkb3V0KToKKyAgICAgICAgICAgIHByaW50ID4+IGZpbGUsICdoZWxsbyB3b3JsZCcKKworICAgICAgICBkcml2ZXIoKQorCisgICAgICAgICMgd2Ugc2hvdWxkIG5vdCBzZWUgdGhpcyBhdCBhbGwKKyAgICAgICAgZGVmIHRlbGxtZShmaWxlPU5vbmUpOgorICAgICAgICAgICAgcHJpbnQgPj4gZmlsZSwgJ2dvb2RieWUgdW5pdmVyc2UnCisKKyAgICAgICAgZHJpdmVyKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5zdGRvdXQuZ2V0dmFsdWUoKSwgJycnXAorMSAyIDMKKzEgMiAzCisxIDEgMQorMSAyIDMKKzEgMiAzCisxIDEgMQoraGVsbG8gd29ybGQKKycnJykKKyAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CisKKyAgICAgICAgIyBzeW50YXggZXJyb3JzCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAncHJpbnQgLCcpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAncHJpbnQgPj4geCwnKQorCisgICAgZGVmIHRlc3REZWxTdG10KHNlbGYpOgorICAgICAgICAjICdkZWwnIGV4cHJsaXN0CisgICAgICAgIGFiYyA9IFsxLDIsM10KKyAgICAgICAgeCwgeSwgeiA9IGFiYworICAgICAgICB4eXogPSB4LCB5LCB6CisKKyAgICAgICAgZGVsIGFiYworICAgICAgICBkZWwgeCwgeSwgKHosIHh5eikKKworICAgIGRlZiB0ZXN0UGFzc1N0bXQoc2VsZik6CisgICAgICAgICMgJ3Bhc3MnCisgICAgICAgIHBhc3MKKworICAgICMgZmxvd19zdG10OiBicmVha19zdG10IHwgY29udGludWVfc3RtdCB8IHJldHVybl9zdG10IHwgcmFpc2Vfc3RtdAorICAgICMgVGVzdGVkIGJlbG93CisKKyAgICBkZWYgdGVzdEJyZWFrU3RtdChzZWxmKToKKyAgICAgICAgIyAnYnJlYWsnCisgICAgICAgIHdoaWxlIDE6IGJyZWFrCisKKyAgICBkZWYgdGVzdENvbnRpbnVlU3RtdChzZWxmKToKKyAgICAgICAgIyAnY29udGludWUnCisgICAgICAgIGkgPSAxCisgICAgICAgIHdoaWxlIGk6IGkgPSAwOyBjb250aW51ZQorCisgICAgICAgIG1zZyA9ICIiCisgICAgICAgIHdoaWxlIG5vdCBtc2c6CisgICAgICAgICAgICBtc2cgPSAib2siCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBtc2cgPSAiY29udGludWUgZmFpbGVkIHRvIGNvbnRpbnVlIGluc2lkZSB0cnkiCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgbXNnID0gImNvbnRpbnVlIGluc2lkZSB0cnkgY2FsbGVkIGV4Y2VwdCBibG9jayIKKyAgICAgICAgaWYgbXNnICE9ICJvayI6CisgICAgICAgICAgICBzZWxmLmZhaWwobXNnKQorCisgICAgICAgIG1zZyA9ICIiCisgICAgICAgIHdoaWxlIG5vdCBtc2c6CisgICAgICAgICAgICBtc2cgPSAiZmluYWxseSBibG9jayBub3QgY2FsbGVkIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG1zZyA9ICJvayIKKyAgICAgICAgaWYgbXNnICE9ICJvayI6CisgICAgICAgICAgICBzZWxmLmZhaWwobXNnKQorCisgICAgZGVmIHRlc3RfYnJlYWtfY29udGludWVfbG9vcChzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3Qgd2FycmFudHMgYW4gZXhwbGFuYXRpb24uIEl0IGlzIGEgdGVzdCBzcGVjaWZpY2FsbHkgZm9yIFNGIGJ1Z3MKKyAgICAgICAgIyAjNDYzMzU5IGFuZCAjNDYyOTM3LiBUaGUgYnVnIGlzIHRoYXQgYSAnYnJlYWsnIHN0YXRlbWVudCBleGVjdXRlZCBvcgorICAgICAgICAjIGV4Y2VwdGlvbiByYWlzZWQgaW5zaWRlIGEgdHJ5L2V4Y2VwdCBpbnNpZGUgYSBsb29wLCAqYWZ0ZXIqIGEgY29udGludWUKKyAgICAgICAgIyBzdGF0ZW1lbnQgaGFzIGJlZW4gZXhlY3V0ZWQgaW4gdGhhdCBsb29wLCB3aWxsIGNhdXNlIHRoZSB3cm9uZyBudW1iZXIgb2YKKyAgICAgICAgIyBhcmd1bWVudHMgdG8gYmUgcG9wcGVkIG9mZiB0aGUgc3RhY2sgYW5kIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIHJlc2V0IHRvCisgICAgICAgICMgYSB2ZXJ5IHNtYWxsIG51bWJlciAodXN1YWxseSAwLikgQmVjYXVzZSBvZiB0aGlzLCB0aGUgZm9sbG93aW5nIHRlc3QKKyAgICAgICAgIyAqbXVzdCogd3JpdHRlbiBhcyBhIGZ1bmN0aW9uLCBhbmQgdGhlIHRyYWNraW5nIHZhcnMgKm11c3QqIGJlIGZ1bmN0aW9uCisgICAgICAgICMgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMuIE90aGVyd2lzZSwgdGhlIHRlc3Qgd2lsbCBsb29wIGFuZCBsb29wLgorCisgICAgICAgIGRlZiB0ZXN0X2lubmVyKGV4dHJhX2J1cm5pbmdfb2lsID0gMSwgY291bnQ9MCk6CisgICAgICAgICAgICBiaWdfaGlwcG8gPSAyCisgICAgICAgICAgICB3aGlsZSBiaWdfaGlwcG86CisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmFfYnVybmluZ19vaWwgYW5kIGJpZ19oaXBwbyA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfYnVybmluZ19vaWwgLT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgYmlnX2hpcHBvIC09IDEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBpZiBjb3VudCA+IDIgb3IgYmlnX2hpcHBvICE9IDE6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJjb250aW51ZSB0aGVuIGJyZWFrIGluIHRyeS9leGNlcHQgaW4gbG9vcCBicm9rZW4hIikKKyAgICAgICAgdGVzdF9pbm5lcigpCisKKyAgICBkZWYgdGVzdFJldHVybihzZWxmKToKKyAgICAgICAgIyAncmV0dXJuJyBbdGVzdGxpc3RdCisgICAgICAgIGRlZiBnMSgpOiByZXR1cm4KKyAgICAgICAgZGVmIGcyKCk6IHJldHVybiAxCisgICAgICAgIGcxKCkKKyAgICAgICAgeCA9IGcyKCkKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJjbGFzcyBmb286cmV0dXJuIDEiKQorCisgICAgZGVmIHRlc3RZaWVsZChzZWxmKToKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJjbGFzcyBmb286eWllbGQgMSIpCisKKyAgICBkZWYgdGVzdFJhaXNlKHNlbGYpOgorICAgICAgICAjICdyYWlzZScgdGVzdCBbJywnIHRlc3RdCisgICAgICAgIHRyeTogcmFpc2UgUnVudGltZUVycm9yLCAnanVzdCB0ZXN0aW5nJworICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOiBwYXNzCisgICAgICAgIHRyeTogcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OiBwYXNzCisKKyAgICBkZWYgdGVzdEltcG9ydChzZWxmKToKKyAgICAgICAgIyAnaW1wb3J0JyBkb3R0ZWRfYXNfbmFtZXMKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpbXBvcnQgdGltZSwgc3lzCisgICAgICAgICMgJ2Zyb20nIGRvdHRlZF9uYW1lICdpbXBvcnQnICgnKicgfCAnKCcgaW1wb3J0X2FzX25hbWVzICcpJyB8IGltcG9ydF9hc19uYW1lcykKKyAgICAgICAgZnJvbSB0aW1lIGltcG9ydCB0aW1lCisgICAgICAgIGZyb20gdGltZSBpbXBvcnQgKHRpbWUpCisgICAgICAgICMgbm90IHRlc3RhYmxlIGluc2lkZSBhIGZ1bmN0aW9uLCBidXQgYWxyZWFkeSBkb25lIGF0IHRvcCBvZiB0aGUgbW9kdWxlCisgICAgICAgICMgZnJvbSBzeXMgaW1wb3J0ICoKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IHBhdGgsIGFyZ3YKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IChwYXRoLCBhcmd2KQorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgKHBhdGgsIGFyZ3YsKQorCisgICAgZGVmIHRlc3RHbG9iYWwoc2VsZik6CisgICAgICAgICMgJ2dsb2JhbCcgTkFNRSAoJywnIE5BTUUpKgorICAgICAgICBnbG9iYWwgYQorICAgICAgICBnbG9iYWwgYSwgYgorICAgICAgICBnbG9iYWwgb25lLCB0d28sIHRocmVlLCBmb3VyLCBmaXZlLCBzaXgsIHNldmVuLCBlaWdodCwgbmluZSwgdGVuCisKKyAgICBkZWYgdGVzdEV4ZWMoc2VsZik6CisgICAgICAgICMgJ2V4ZWMnIGV4cHIgWydpbicgZXhwciBbJywnIGV4cHJdXQorICAgICAgICB6ID0gTm9uZQorICAgICAgICBkZWwgegorICAgICAgICBleGVjICd6PTErMVxuJworICAgICAgICBpZiB6ICE9IDI6IHNlbGYuZmFpbCgnZXhlYyBcJ3o9MSsxXCdcXG4nKQorICAgICAgICBkZWwgegorICAgICAgICBleGVjICd6PTErMScKKyAgICAgICAgaWYgeiAhPSAyOiBzZWxmLmZhaWwoJ2V4ZWMgXCd6PTErMVwnJykKKyAgICAgICAgeiA9IE5vbmUKKyAgICAgICAgZGVsIHoKKyAgICAgICAgaW1wb3J0IHR5cGVzCisgICAgICAgIGlmIGhhc2F0dHIodHlwZXMsICJVbmljb2RlVHlwZSIpOgorICAgICAgICAgICAgZXhlYyByIiIiaWYgMToKKyAgICAgICAgICAgIGV4ZWMgdSd6PTErMVxuJworICAgICAgICAgICAgaWYgeiAhPSAyOiBzZWxmLmZhaWwoJ2V4ZWMgdVwnej0xKzFcJ1xcbicpCisgICAgICAgICAgICBkZWwgegorICAgICAgICAgICAgZXhlYyB1J3o9MSsxJworICAgICAgICAgICAgaWYgeiAhPSAyOiBzZWxmLmZhaWwoJ2V4ZWMgdVwnej0xKzFcJycpIiIiCisgICAgICAgIGcgPSB7fQorICAgICAgICBleGVjICd6ID0gMScgaW4gZworICAgICAgICBpZiAnX19idWlsdGluc19fJyBpbiBnOiBkZWwgZ1snX19idWlsdGluc19fJ10KKyAgICAgICAgaWYgZyAhPSB7J3onOiAxfTogc2VsZi5mYWlsKCdleGVjIFwneiA9IDFcJyBpbiBnJykKKyAgICAgICAgZyA9IHt9CisgICAgICAgIGwgPSB7fQorCisgICAgICAgIGV4ZWMgJ2dsb2JhbCBhOyBhID0gMTsgYiA9IDInIGluIGcsIGwKKyAgICAgICAgaWYgJ19fYnVpbHRpbnNfXycgaW4gZzogZGVsIGdbJ19fYnVpbHRpbnNfXyddCisgICAgICAgIGlmICdfX2J1aWx0aW5zX18nIGluIGw6IGRlbCBsWydfX2J1aWx0aW5zX18nXQorICAgICAgICBpZiAoZywgbCkgIT0gKHsnYSc6MX0sIHsnYic6Mn0pOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdleGVjIC4uLiBpbiBnICglcyksIGwgKCVzKScgJShnLGwpKQorCisgICAgZGVmIHRlc3RBc3NlcnQoc2VsZik6CisgICAgICAgICMgYXNzZXJ0VHJ1ZXN0bXQ6ICdhc3NlcnQnIHRlc3QgWycsJyB0ZXN0XQorICAgICAgICBhc3NlcnQgMQorICAgICAgICBhc3NlcnQgMSwgMQorICAgICAgICBhc3NlcnQgbGFtYmRhIHg6eAorICAgICAgICBhc3NlcnQgMSwgbGFtYmRhIHg6eCsxCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXNzZXJ0IFRydWUKKyAgICAgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yIGFzIGU6CisgICAgICAgICAgICBzZWxmLmZhaWwoIidhc3NlcnQgVHJ1ZScgc2hvdWxkIG5vdCBoYXZlIHJhaXNlZCBhbiBBc3NlcnRpb25FcnJvciIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXNzZXJ0IFRydWUsICd0aGlzIHNob3VsZCBhbHdheXMgcGFzcycKKyAgICAgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yIGFzIGU6CisgICAgICAgICAgICBzZWxmLmZhaWwoIidhc3NlcnQgVHJ1ZSwgbXNnJyBzaG91bGQgbm90IGhhdmUgIgorICAgICAgICAgICAgICAgICAgICAgICJyYWlzZWQgYW4gQXNzZXJ0aW9uRXJyb3IiKQorCisgICAgIyB0aGVzZSB0ZXN0cyBmYWlsIGlmIHB5dGhvbiBpcyBydW4gd2l0aCAtTywgc28gY2hlY2sgX19kZWJ1Z19fCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoX19kZWJ1Z19fLCAiV29uJ3Qgd29yayBpZiBfX2RlYnVnX18gaXMgRmFsc2UiKQorICAgIGRlZiB0ZXN0QXNzZXJ0MihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXNzZXJ0IDAsICJtc2ciCisgICAgICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAibXNnIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQXNzZXJ0aW9uRXJyb3Igbm90IHJhaXNlZCBieSBhc3NlcnQgMCIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXNzZXJ0IEZhbHNlCisgICAgICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvciBhcyBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZS5hcmdzKSwgMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQXNzZXJ0aW9uRXJyb3Igbm90IHJhaXNlZCBieSAnYXNzZXJ0IEZhbHNlJyIpCisKKworICAgICMjIyBjb21wb3VuZF9zdG10OiBpZl9zdG10IHwgd2hpbGVfc3RtdCB8IGZvcl9zdG10IHwgdHJ5X3N0bXQgfCBmdW5jZGVmIHwgY2xhc3NkZWYKKyAgICAjIFRlc3RlZCBiZWxvdworCisgICAgZGVmIHRlc3RJZihzZWxmKToKKyAgICAgICAgIyAnaWYnIHRlc3QgJzonIHN1aXRlICgnZWxpZicgdGVzdCAnOicgc3VpdGUpKiBbJ2Vsc2UnICc6JyBzdWl0ZV0KKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICBpZiAxOiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKKyAgICAgICAgaWYgMDogcGFzcworICAgICAgICBlbGlmIDA6IHBhc3MKKyAgICAgICAgaWYgMDogcGFzcworICAgICAgICBlbGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGVsaWYgMDogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisKKyAgICBkZWYgdGVzdFdoaWxlKHNlbGYpOgorICAgICAgICAjICd3aGlsZScgdGVzdCAnOicgc3VpdGUgWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgIHdoaWxlIDA6IHBhc3MKKyAgICAgICAgd2hpbGUgMDogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisKKyAgICAgICAgIyBJc3N1ZTE5MjA6ICJ3aGlsZSAwIiBpcyBvcHRpbWl6ZWQgYXdheSwKKyAgICAgICAgIyBlbnN1cmUgdGhhdCB0aGUgImVsc2UiIGNsYXVzZSBpcyBzdGlsbCBwcmVzZW50LgorICAgICAgICB4ID0gMAorICAgICAgICB3aGlsZSAwOgorICAgICAgICAgICAgeCA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgMikKKworICAgIGRlZiB0ZXN0Rm9yKHNlbGYpOgorICAgICAgICAjICdmb3InIGV4cHJsaXN0ICdpbicgZXhwcmxpc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXQorICAgICAgICBmb3IgaSBpbiAxLCAyLCAzOiBwYXNzCisgICAgICAgIGZvciBpLCBqLCBrIGluICgpOiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKKyAgICAgICAgY2xhc3MgU3F1YXJlczoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXgpOgorICAgICAgICAgICAgICAgIHNlbGYubWF4ID0gbWF4CisgICAgICAgICAgICAgICAgc2VsZi5zb2ZhciA9IFtdCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIGxlbihzZWxmLnNvZmFyKQorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIGlmIG5vdCAwIDw9IGkgPCBzZWxmLm1heDogcmFpc2UgSW5kZXhFcnJvcgorICAgICAgICAgICAgICAgIG4gPSBsZW4oc2VsZi5zb2ZhcikKKyAgICAgICAgICAgICAgICB3aGlsZSBuIDw9IGk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc29mYXIuYXBwZW5kKG4qbikKKyAgICAgICAgICAgICAgICAgICAgbiA9IG4rMQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNvZmFyW2ldCisgICAgICAgIG4gPSAwCisgICAgICAgIGZvciB4IGluIFNxdWFyZXMoMTApOiBuID0gbit4CisgICAgICAgIGlmIG4gIT0gMjg1OgorICAgICAgICAgICAgc2VsZi5mYWlsKCdmb3Igb3ZlciBncm93aW5nIHNlcXVlbmNlJykKKworICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgeCwgaW4gWygxLCksICgyLCksICgzLCldOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWzEsIDIsIDNdKQorCisgICAgZGVmIHRlc3RUcnkoc2VsZik6CisgICAgICAgICMjIyB0cnlfc3RtdDogJ3RyeScgJzonIHN1aXRlIChleGNlcHRfY2xhdXNlICc6JyBzdWl0ZSkrIFsnZWxzZScgJzonIHN1aXRlXQorICAgICAgICAjIyMgICAgICAgICB8ICd0cnknICc6JyBzdWl0ZSAnZmluYWxseScgJzonIHN1aXRlCisgICAgICAgICMjIyBleGNlcHRfY2xhdXNlOiAnZXhjZXB0JyBbZXhwciBbKCdhcycgfCAnLCcpIGV4cHJdXQorICAgICAgICB0cnk6CisgICAgICAgICAgICAxLzAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6IDEvMAorICAgICAgICBleGNlcHQgRU9GRXJyb3I6IHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBtc2c6IHBhc3MKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvciwgbXNnOiBwYXNzCisgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisgICAgICAgIHRyeTogMS8wCisgICAgICAgIGV4Y2VwdCAoRU9GRXJyb3IsIFR5cGVFcnJvciwgWmVyb0RpdmlzaW9uRXJyb3IpOiBwYXNzCisgICAgICAgIHRyeTogMS8wCisgICAgICAgIGV4Y2VwdCAoRU9GRXJyb3IsIFR5cGVFcnJvciwgWmVyb0RpdmlzaW9uRXJyb3IpLCBtc2c6IHBhc3MKKyAgICAgICAgdHJ5OiBwYXNzCisgICAgICAgIGZpbmFsbHk6IHBhc3MKKworICAgIGRlZiB0ZXN0U3VpdGUoc2VsZik6CisgICAgICAgICMgc2ltcGxlX3N0bXQgfCBORVdMSU5FIElOREVOVCBORVdMSU5FKiAoc3RtdCBORVdMSU5FKikrIERFREVOVAorICAgICAgICBpZiAxOiBwYXNzCisgICAgICAgIGlmIDE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIDE6CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjCisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjCisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjCisKKyAgICBkZWYgdGVzdFRlc3Qoc2VsZik6CisgICAgICAgICMjIyBhbmRfdGVzdCAoJ29yJyBhbmRfdGVzdCkqCisgICAgICAgICMjIyBhbmRfdGVzdDogbm90X3Rlc3QgKCdhbmQnIG5vdF90ZXN0KSoKKyAgICAgICAgIyMjIG5vdF90ZXN0OiAnbm90JyBub3RfdGVzdCB8IGNvbXBhcmlzb24KKyAgICAgICAgaWYgbm90IDE6IHBhc3MKKyAgICAgICAgaWYgMSBhbmQgMTogcGFzcworICAgICAgICBpZiAxIG9yIDE6IHBhc3MKKyAgICAgICAgaWYgbm90IG5vdCBub3QgMTogcGFzcworICAgICAgICBpZiBub3QgMSBhbmQgMSBhbmQgMTogcGFzcworICAgICAgICBpZiAxIGFuZCAxIG9yIDEgYW5kIDEgYW5kIDEgb3Igbm90IDEgYW5kIDE6IHBhc3MKKworICAgIGRlZiB0ZXN0Q29tcGFyaXNvbihzZWxmKToKKyAgICAgICAgIyMjIGNvbXBhcmlzb246IGV4cHIgKGNvbXBfb3AgZXhwcikqCisgICAgICAgICMjIyBjb21wX29wOiAnPCd8Jz4nfCc9PSd8Jz49J3wnPD0nfCc8Pid8JyE9J3wnaW4nfCdub3QnICdpbid8J2lzJ3wnaXMnICdub3QnCisgICAgICAgIGlmIDE6IHBhc3MKKyAgICAgICAgeCA9ICgxID09IDEpCisgICAgICAgIGlmIDEgPT0gMTogcGFzcworICAgICAgICBpZiAxICE9IDE6IHBhc3MKKyAgICAgICAgaWYgMSA8IDE6IHBhc3MKKyAgICAgICAgaWYgMSA+IDE6IHBhc3MKKyAgICAgICAgaWYgMSA8PSAxOiBwYXNzCisgICAgICAgIGlmIDEgPj0gMTogcGFzcworICAgICAgICBpZiAxIGlzIDE6IHBhc3MKKyAgICAgICAgaWYgMSBpcyBub3QgMTogcGFzcworICAgICAgICBpZiAxIGluICgpOiBwYXNzCisgICAgICAgIGlmIDEgbm90IGluICgpOiBwYXNzCisgICAgICAgIGlmIDEgPCAxID4gMSA9PSAxID49IDEgPD0gMSAhPSAxIGluIDEgbm90IGluIDEgaXMgMSBpcyBub3QgMTogcGFzcworICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgIGlmIGV2YWwoJzEgPD4gMScpOiBwYXNzCisgICAgICAgIGlmIGV2YWwoJzEgPCAxID4gMSA9PSAxID49IDEgPD0gMSA8PiAxICE9IDEgaW4gMSBub3QgaW4gMSBpcyAxIGlzIG5vdCAxJyk6IHBhc3MKKworICAgIGRlZiB0ZXN0QmluYXJ5TWFza09wcyhzZWxmKToKKyAgICAgICAgeCA9IDEgJiAxCisgICAgICAgIHggPSAxIF4gMQorICAgICAgICB4ID0gMSB8IDEKKworICAgIGRlZiB0ZXN0U2hpZnRPcHMoc2VsZik6CisgICAgICAgIHggPSAxIDw8IDEKKyAgICAgICAgeCA9IDEgPj4gMQorICAgICAgICB4ID0gMSA8PCAxID4+IDEKKworICAgIGRlZiB0ZXN0QWRkaXRpdmVPcHMoc2VsZik6CisgICAgICAgIHggPSAxCisgICAgICAgIHggPSAxICsgMQorICAgICAgICB4ID0gMSAtIDEgLSAxCisgICAgICAgIHggPSAxIC0gMSArIDEgLSAxICsgMQorCisgICAgZGVmIHRlc3RNdWx0aXBsaWNhdGl2ZU9wcyhzZWxmKToKKyAgICAgICAgeCA9IDEgKiAxCisgICAgICAgIHggPSAxIC8gMQorICAgICAgICB4ID0gMSAlIDEKKyAgICAgICAgeCA9IDEgLyAxICogMSAlIDEKKworICAgIGRlZiB0ZXN0VW5hcnlPcHMoc2VsZik6CisgICAgICAgIHggPSArMQorICAgICAgICB4ID0gLTEKKyAgICAgICAgeCA9IH4xCisgICAgICAgIHggPSB+MSBeIDEgJiAxIHwgMSAmIDEgXiAtMQorICAgICAgICB4ID0gLTEqMS8xICsgMSoxIC0gLS0tMSoxCisKKyAgICBkZWYgdGVzdFNlbGVjdG9ycyhzZWxmKToKKyAgICAgICAgIyMjIHRyYWlsZXI6ICcoJyBbdGVzdGxpc3RdICcpJyB8ICdbJyBzdWJzY3JpcHQgJ10nIHwgJy4nIE5BTUUKKyAgICAgICAgIyMjIHN1YnNjcmlwdDogZXhwciB8IFtleHByXSAnOicgW2V4cHJdCisKKyAgICAgICAgaW1wb3J0IHN5cywgdGltZQorICAgICAgICBjID0gc3lzLnBhdGhbMF0KKyAgICAgICAgeCA9IHRpbWUudGltZSgpCisgICAgICAgIHggPSBzeXMubW9kdWxlc1sndGltZSddLnRpbWUoKQorICAgICAgICBhID0gJzAxMjM0JworICAgICAgICBjID0gYVswXQorICAgICAgICBjID0gYVstMV0KKyAgICAgICAgcyA9IGFbMDo1XQorICAgICAgICBzID0gYVs6NV0KKyAgICAgICAgcyA9IGFbMDpdCisgICAgICAgIHMgPSBhWzpdCisgICAgICAgIHMgPSBhWy01Ol0KKyAgICAgICAgcyA9IGFbOi0xXQorICAgICAgICBzID0gYVstNDotM10KKyAgICAgICAgIyBBIHJvdWdoIHRlc3Qgb2YgU0YgYnVnIDEzMzM5ODIuICBodHRwOi8vcHl0aG9uLm9yZy9zZi8xMzMzOTgyCisgICAgICAgICMgVGhlIHRlc3RpbmcgaGVyZSBpcyBmYWlybHkgaW5jb21wbGV0ZS4KKyAgICAgICAgIyBUZXN0IGNhc2VzIHNob3VsZCBpbmNsdWRlOiBjb21tYXMgd2l0aCAxIGFuZCAyIGNvbG9ucworICAgICAgICBkID0ge30KKyAgICAgICAgZFsxXSA9IDEKKyAgICAgICAgZFsxLF0gPSAyCisgICAgICAgIGRbMSwyXSA9IDMKKyAgICAgICAgZFsxLDIsM10gPSA0CisgICAgICAgIEwgPSBsaXN0KGQpCisgICAgICAgIEwuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKEwpLCAnWzEsICgxLCksICgxLCAyKSwgKDEsIDIsIDMpXScpCisKKyAgICBkZWYgdGVzdEF0b21zKHNlbGYpOgorICAgICAgICAjIyMgYXRvbTogJygnIFt0ZXN0bGlzdF0gJyknIHwgJ1snIFt0ZXN0bGlzdF0gJ10nIHwgJ3snIFtkaWN0bWFrZXJdICd9JyB8ICdgJyB0ZXN0bGlzdCAnYCcgfCBOQU1FIHwgTlVNQkVSIHwgU1RSSU5HCisgICAgICAgICMjIyBkaWN0b3JzZXRtYWtlcjogKHRlc3QgJzonIHRlc3QgKCcsJyB0ZXN0ICc6JyB0ZXN0KSogWycsJ10pIHwgKHRlc3QgKCcsJyB0ZXN0KSogWycsJ10pCisKKyAgICAgICAgeCA9ICgxKQorICAgICAgICB4ID0gKDEgb3IgMiBvciAzKQorICAgICAgICB4ID0gKDEgb3IgMiBvciAzLCAyLCAzKQorCisgICAgICAgIHggPSBbXQorICAgICAgICB4ID0gWzFdCisgICAgICAgIHggPSBbMSBvciAyIG9yIDNdCisgICAgICAgIHggPSBbMSBvciAyIG9yIDMsIDIsIDNdCisgICAgICAgIHggPSBbXQorCisgICAgICAgIHggPSB7fQorICAgICAgICB4ID0geydvbmUnOiAxfQorICAgICAgICB4ID0geydvbmUnOiAxLH0KKyAgICAgICAgeCA9IHsnb25lJyBvciAndHdvJzogMSBvciAyfQorICAgICAgICB4ID0geydvbmUnOiAxLCAndHdvJzogMn0KKyAgICAgICAgeCA9IHsnb25lJzogMSwgJ3R3byc6IDIsfQorICAgICAgICB4ID0geydvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMywgJ2ZvdXInOiA0LCAnZml2ZSc6IDUsICdzaXgnOiA2fQorCisgICAgICAgIHggPSB7J29uZSd9CisgICAgICAgIHggPSB7J29uZScsIDEsfQorICAgICAgICB4ID0geydvbmUnLCAndHdvJywgJ3RocmVlJ30KKyAgICAgICAgeCA9IHsyLCAzLCA0LH0KKworICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgIHggPSBldmFsKCdgeGAnKQorICAgICAgICB4ID0gZXZhbCgnYDEgb3IgMiBvciAzYCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnYDEsMmAnKSwgJygxLCAyKScpCisKKyAgICAgICAgeCA9IHgKKyAgICAgICAgeCA9ICd4JworICAgICAgICB4ID0gMTIzCisKKyAgICAjIyMgZXhwcmxpc3Q6IGV4cHIgKCcsJyBleHByKSogWycsJ10KKyAgICAjIyMgdGVzdGxpc3Q6IHRlc3QgKCcsJyB0ZXN0KSogWycsJ10KKyAgICAjIFRoZXNlIGhhdmUgYmVlbiBleGVyY2lzZWQgZW5vdWdoIGFib3ZlCisKKyAgICBkZWYgdGVzdENsYXNzZGVmKHNlbGYpOgorICAgICAgICAjICdjbGFzcycgTkFNRSBbJygnIFt0ZXN0bGlzdF0gJyknXSAnOicgc3VpdGUKKyAgICAgICAgY2xhc3MgQjogcGFzcworICAgICAgICBjbGFzcyBCMigpOiBwYXNzCisgICAgICAgIGNsYXNzIEMxKEIpOiBwYXNzCisgICAgICAgIGNsYXNzIEMyKEIpOiBwYXNzCisgICAgICAgIGNsYXNzIEQoQzEsIEMyLCBCKTogcGFzcworICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIG1ldGgxKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgbWV0aDIoc2VsZiwgYXJnKTogcGFzcworICAgICAgICAgICAgZGVmIG1ldGgzKHNlbGYsIGExLCBhMik6IHBhc3MKKyAgICAgICAgIyBkZWNvcmF0b3I6ICdAJyBkb3R0ZWRfbmFtZSBbICcoJyBbYXJnbGlzdF0gJyknIF0gTkVXTElORQorICAgICAgICAjIGRlY29yYXRvcnM6IGRlY29yYXRvcisKKyAgICAgICAgIyBkZWNvcmF0ZWQ6IGRlY29yYXRvcnMgKGNsYXNzZGVmIHwgZnVuY2RlZikKKyAgICAgICAgZGVmIGNsYXNzX2RlY29yYXRvcih4KToKKyAgICAgICAgICAgIHguZGVjb3JhdGVkID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgQGNsYXNzX2RlY29yYXRvcgorICAgICAgICBjbGFzcyBHOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEcuZGVjb3JhdGVkLCBUcnVlKQorCisgICAgZGVmIHRlc3REaWN0Y29tcHMoc2VsZik6CisgICAgICAgICMgZGljdG9yc2V0bWFrZXI6ICggKHRlc3QgJzonIHRlc3QgKGNvbXBfZm9yIHwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcsJyB0ZXN0ICc6JyB0ZXN0KSogWycsJ10pKSB8CisgICAgICAgICMgICAgICAgICAgICAgICAgICAgKHRlc3QgKGNvbXBfZm9yIHwgKCcsJyB0ZXN0KSogWycsJ10pKSApCisgICAgICAgIG51bXMgPSBbMSwgMiwgM10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7aTppKzEgZm9yIGkgaW4gbnVtc30sIHsxOiAyLCAyOiAzLCAzOiA0fSkKKworICAgIGRlZiB0ZXN0TGlzdGNvbXBzKHNlbGYpOgorICAgICAgICAjIGxpc3QgY29tcHJlaGVuc2lvbiB0ZXN0cworICAgICAgICBudW1zID0gWzEsIDIsIDMsIDQsIDVdCisgICAgICAgIHN0cnMgPSBbIkFwcGxlIiwgIkJhbmFuYSIsICJDb2NvbnV0Il0KKyAgICAgICAgc3BjcyA9IFsiICBBcHBsZSIsICIgQmFuYW5hICIsICJDb2NvICBudXQgICJdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbcy5zdHJpcCgpIGZvciBzIGluIHNwY3NdLCBbJ0FwcGxlJywgJ0JhbmFuYScsICdDb2NvICBudXQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbMyAqIHggZm9yIHggaW4gbnVtc10sIFszLCA2LCA5LCAxMiwgMTVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFt4IGZvciB4IGluIG51bXMgaWYgeCA+IDJdLCBbMywgNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhpLCBzKSBmb3IgaSBpbiBudW1zIGZvciBzIGluIHN0cnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMSwgJ0FwcGxlJyksICgxLCAnQmFuYW5hJyksICgxLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ0FwcGxlJyksICgyLCAnQmFuYW5hJyksICgyLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ0FwcGxlJyksICgzLCAnQmFuYW5hJyksICgzLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ0FwcGxlJyksICg0LCAnQmFuYW5hJyksICg0LCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoNSwgJ0FwcGxlJyksICg1LCAnQmFuYW5hJyksICg1LCAnQ29jb251dCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKGksIHMpIGZvciBpIGluIG51bXMgZm9yIHMgaW4gW2YgZm9yIGYgaW4gc3RycyBpZiAibiIgaW4gZl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMSwgJ0JhbmFuYScpLCAoMSwgJ0NvY29udXQnKSwgKDIsICdCYW5hbmEnKSwgKDIsICdDb2NvbnV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnQmFuYW5hJyksICgzLCAnQ29jb251dCcpLCAoNCwgJ0JhbmFuYScpLCAoNCwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdCYW5hbmEnKSwgKDUsICdDb2NvbnV0JyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsobGFtYmRhIGE6W2EqKmkgZm9yIGkgaW4gcmFuZ2UoYSsxKV0pKGopIGZvciBqIGluIHJhbmdlKDUpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbWzFdLCBbMSwgMV0sIFsxLCAyLCA0XSwgWzEsIDMsIDksIDI3XSwgWzEsIDQsIDE2LCA2NCwgMjU2XV0pCisKKyAgICAgICAgZGVmIHRlc3RfaW5fZnVuYyhsKToKKyAgICAgICAgICAgIHJldHVybiBbTm9uZSA8IHggPCAzIGZvciB4IGluIGwgaWYgeCA+IDJdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0X2luX2Z1bmMobnVtcyksIFtGYWxzZSwgRmFsc2UsIEZhbHNlXSkKKworICAgICAgICBkZWYgdGVzdF9uZXN0ZWRfZnJvbnQoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW1t5IGZvciB5IGluIFt4LCB4ICsgMV1dIGZvciB4IGluIFsxLDMsNV1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWzEsIDJdLCBbMywgNF0sIFs1LCA2XV0pCisKKyAgICAgICAgdGVzdF9uZXN0ZWRfZnJvbnQoKQorCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiW2ksIHMgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBzdHJzXSIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiW3ggaWYgeV0iKQorCisgICAgICAgIHN1cHBsaWVycyA9IFsKKyAgICAgICAgICAoMSwgIkJvZWluZyIpLAorICAgICAgICAgICgyLCAiRm9yZCIpLAorICAgICAgICAgICgzLCAiTWFjZG9uYWxkcyIpCisgICAgICAgIF0KKworICAgICAgICBwYXJ0cyA9IFsKKyAgICAgICAgICAoMTAsICJBaXJsaW5lciIpLAorICAgICAgICAgICgyMCwgIkVuZ2luZSIpLAorICAgICAgICAgICgzMCwgIkNoZWVzZWJ1cmdlciIpCisgICAgICAgIF0KKworICAgICAgICBzdXBwYXJ0ID0gWworICAgICAgICAgICgxLCAxMCksICgxLCAyMCksICgyLCAyMCksICgzLCAzMCkKKyAgICAgICAgXQorCisgICAgICAgIHggPSBbCisgICAgICAgICAgKHNuYW1lLCBwbmFtZSkKKyAgICAgICAgICAgIGZvciAoc25vLCBzbmFtZSkgaW4gc3VwcGxpZXJzCisgICAgICAgICAgICAgIGZvciAocG5vLCBwbmFtZSkgaW4gcGFydHMKKyAgICAgICAgICAgICAgICBmb3IgKHNwX3Nubywgc3BfcG5vKSBpbiBzdXBwYXJ0CisgICAgICAgICAgICAgICAgICBpZiBzbm8gPT0gc3Bfc25vIGFuZCBwbm8gPT0gc3BfcG5vCisgICAgICAgIF0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIFsoJ0JvZWluZycsICdBaXJsaW5lcicpLCAoJ0JvZWluZycsICdFbmdpbmUnKSwgKCdGb3JkJywgJ0VuZ2luZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ01hY2RvbmFsZHMnLCAnQ2hlZXNlYnVyZ2VyJyldKQorCisgICAgZGVmIHRlc3RHZW5leHBzKHNlbGYpOgorICAgICAgICAjIGdlbmVyYXRvciBleHByZXNzaW9uIHRlc3RzCisgICAgICAgIGcgPSAoW3ggZm9yIHggaW4gcmFuZ2UoMTApXSBmb3IgeCBpbiByYW5nZSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLm5leHQoKSwgW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZy5uZXh0KCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnc2hvdWxkIHByb2R1Y2UgU3RvcEl0ZXJhdGlvbiBleGNlcHRpb24nKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBhID0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBnID0gKGEgZm9yIGQgaW4gYSkKKyAgICAgICAgICAgIGcubmV4dCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoJ3Nob3VsZCBwcm9kdWNlIFR5cGVFcnJvcicpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCh4LCB5KSBmb3IgeCBpbiAnYWJjZCcgZm9yIHkgaW4gJ2FiY2QnKSwgWyh4LCB5KSBmb3IgeCBpbiAnYWJjZCcgZm9yIHkgaW4gJ2FiY2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCh4LCB5KSBmb3IgeCBpbiAnYWInIGZvciB5IGluICd4eScpLCBbKHgsIHkpIGZvciB4IGluICdhYicgZm9yIHkgaW4gJ3h5J10pCisKKyAgICAgICAgYSA9IFt4IGZvciB4IGluIHJhbmdlKDEwKV0KKyAgICAgICAgYiA9ICh4IGZvciB4IGluICh5IGZvciB5IGluIGEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShiKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHgqKjIgZm9yIHggaW4gcmFuZ2UoMTApKSwgc3VtKFt4KioyIGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4KnggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHglMiksIHN1bShbeCp4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4JTJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiByYW5nZSgxMCkpKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSkpKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluIFt5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSldKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSBpZiBUcnVlKSkgaWYgVHJ1ZSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkgaWYgVHJ1ZSkgaWYgRmFsc2UpIGlmIFRydWUpLCAwKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImZvbyh4IGZvciB4IGluIHJhbmdlKDEwKSwgMTAwKSIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZm9vKDEwMCwgeCBmb3IgeCBpbiByYW5nZSgxMCkpIikKKworICAgIGRlZiB0ZXN0Q29tcHJlaGVuc2lvblNwZWNpYWxzKHNlbGYpOgorICAgICAgICAjIHRlc3QgZm9yIG91dG1vc3QgaXRlcmFibGUgcHJlY29tcHV0YXRpb24KKyAgICAgICAgeCA9IDEwOyBnID0gKGkgZm9yIGkgaW4gcmFuZ2UoeCkpOyB4ID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaXN0KGcpKSwgMTApCisKKyAgICAgICAgIyBUaGlzIHNob3VsZCBob2xkLCBzaW5jZSB3ZSdyZSBvbmx5IHByZWNvbXB1dGluZyBvdXRtb3N0IGl0ZXJhYmxlLgorICAgICAgICB4ID0gMTA7IHQgPSBGYWxzZTsgZyA9ICgoaSxqKSBmb3IgaSBpbiByYW5nZSh4KSBpZiB0IGZvciBqIGluIHJhbmdlKHgpKQorICAgICAgICB4ID0gNTsgdCA9IFRydWU7CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhpLGopIGZvciBpIGluIHJhbmdlKDEwKSBmb3IgaiBpbiByYW5nZSg1KV0sIGxpc3QoZykpCisKKyAgICAgICAgIyBHcmFtbWFyIGFsbG93cyBtdWx0aXBsZSBhZGphY2VudCAnaWYncyBpbiBsaXN0Y29tcHMgYW5kIGdlbmV4cHMsCisgICAgICAgICMgZXZlbiB0aG91Z2ggaXQncyBzaWxseS4gTWFrZSBzdXJlIGl0IHdvcmtzIChpZmVsc2UgYnJva2UgdGhpcy4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyBdLCBbMSwgNSwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyksIFsxLCA1LCA3XSkKKworICAgICAgICAjIHZlcmlmeSB1bnBhY2tpbmcgc2luZ2xlIGVsZW1lbnQgdHVwbGVzIGluIGxpc3Rjb21wL2dlbmV4cC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbeCBmb3IgeCwgaW4gWyg0LCksICg1LCksICg2LCldXSwgWzQsIDUsIDZdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCBmb3IgeCwgaW4gWyg3LCksICg4LCksICg5LCldKSwgWzcsIDgsIDldKQorCisgICAgZGVmIHRlc3Rfd2l0aF9zdGF0ZW1lbnQoc2VsZik6CisgICAgICAgIGNsYXNzIG1hbmFnZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICgxLCAyKQorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzIHg6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzICh4LCB5KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCksIG1hbmFnZXIoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCkgYXMgeCwgbWFuYWdlcigpIGFzIHk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzIHgsIG1hbmFnZXIoKToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0SWZFbHNlRXhwcihzZWxmKToKKyAgICAgICAgIyBUZXN0IGlmZWxzZSBleHByZXNzaW9ucyBpbiB2YXJpb3VzIGNhc2VzCisgICAgICAgIGRlZiBfY2hlY2tldmFsKG1zZywgcmV0KToKKyAgICAgICAgICAgICJoZWxwZXIgdG8gY2hlY2sgdGhhdCBldmFsdWF0aW9uIG9mIGV4cHJlc3Npb25zIGlzIGRvbmUgY29ycmVjdGx5IgorICAgICAgICAgICAgcHJpbnQgeAorICAgICAgICAgICAgcmV0dXJuIHJldAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4KCkgZm9yIHggaW4gbGFtYmRhOiBUcnVlLCBsYW1iZGE6IEZhbHNlIGlmIHgoKSBdLCBbVHJ1ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4KCkgZm9yIHggaW4gKGxhbWJkYTogVHJ1ZSwgbGFtYmRhOiBGYWxzZSkgaWYgeCgpIF0sIFtUcnVlXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbIHgoRmFsc2UpIGZvciB4IGluIChsYW1iZGEgeDogRmFsc2UgaWYgeCBlbHNlIFRydWUsIGxhbWJkYSB4OiBUcnVlIGlmIHggZWxzZSBGYWxzZSkgaWYgeChGYWxzZSkgXSwgW1RydWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg1IGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayAxIiwgMCkpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChfY2hlY2tldmFsKCJjaGVjayAyIiwgMCkgaWYgMCBlbHNlIDUpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg1IGFuZCA2IGlmIDAgZWxzZSAxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoKDUgYW5kIDYpIGlmIDAgZWxzZSAxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSBhbmQgKDYgaWYgMSBlbHNlIDEpKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMCBvciBfY2hlY2tldmFsKCJjaGVjayAzIiwgMikgaWYgMCBlbHNlIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxIG9yIF9jaGVja2V2YWwoImNoZWNrIDQiLCAyKSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgNSIsIDMpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMCBvciA1IGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayA2IiwgMykpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChub3QgNSBpZiAxIGVsc2UgMSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChub3QgNSBpZiAwIGVsc2UgMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgKyAxIGlmIDEgZWxzZSAyKSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiAtIDEgaWYgMSBlbHNlIDIpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2ICogMiBpZiAxIGVsc2UgNCksIDEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2IC8gMiBpZiAxIGVsc2UgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgPCA0IGlmIDAgZWxzZSAyKSwgMikKKworICAgIGRlZiB0ZXN0X3BhcmVuX2V2YWx1YXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTYgLy8gKDQgLy8gMiksIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDE2IC8vIDQpIC8vIDIsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTYgLy8gNCAvLyAyLCAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRmFsc2UgaXMgKDIgaXMgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoKEZhbHNlIGlzIDIpIGlzIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRmFsc2UgaXMgMiBpcyAzKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoImJhY2txdW90ZSBub3Qgc3VwcG9ydGVkIiwgU3ludGF4V2FybmluZyksCisgICAgICAgICAgICAoInR1cGxlIHBhcmFtZXRlciB1bnBhY2tpbmcgaGFzIGJlZW4gcmVtb3ZlZCIsIFN5bnRheFdhcm5pbmcpLAorICAgICAgICAgICAgKCJwYXJlbnRoZXNpemVkIGFyZ3VtZW50IG5hbWVzIGFyZSBpbnZhbGlkIiwgU3ludGF4V2FybmluZyksCisgICAgICAgICAgICAoImNsYXNzaWMgaW50IGRpdmlzaW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICgiLisgbm90IHN1cHBvcnRlZCBpbiAzLngiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KFRva2VuVGVzdHMsIEdyYW1tYXJUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JhbW1hci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ncmFtbWFyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWEyMjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JhbW1hci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JhbW1hci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ncmFtbWFyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2Y1NWIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JhbW1hci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JwLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDJiYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ncnAucHkKQEAgLTAsMCArMSw5NyBAQAorIiIiVGVzdCBzY3JpcHQgZm9yIHRoZSBncnAgbW9kdWxlLiIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2dycCA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdncnAnKQorCitjbGFzcyBHcm91cERhdGFiYXNlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrX3ZhbHVlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgIyBjaGVjayB0aGF0IGEgZ3JwIHR1cGxlIGhhcyB0aGUgZW50cmllcyBhbmQKKyAgICAgICAgIyBhdHRyaWJ1dGVzIHByb21pc2VkIGJ5IHRoZSBkb2NzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZVswXSwgdmFsdWUuZ3JfbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZhbHVlLmdyX25hbWUsIGJhc2VzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbMV0sIHZhbHVlLmdyX3Bhc3N3ZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZhbHVlLmdyX3Bhc3N3ZCwgYmFzZXN0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZVsyXSwgdmFsdWUuZ3JfZ2lkKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmFsdWUuZ3JfZ2lkLCAobG9uZywgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZVszXSwgdmFsdWUuZ3JfbWVtKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmFsdWUuZ3JfbWVtLCBsaXN0KQorCisgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgorICAgICAgICBlbnRyaWVzID0gZ3JwLmdldGdyYWxsKCkKKworICAgICAgICBmb3IgZSBpbiBlbnRyaWVzOgorICAgICAgICAgICAgc2VsZi5jaGVja192YWx1ZShlKQorCisgICAgICAgIGlmIGxlbihlbnRyaWVzKSA+IDEwMDA6ICAjIEh1Z2UgZ3JvdXAgZmlsZSAoTklTPykgLS0gc2tpcCB0aGUgcmVzdAorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9yIGUgaW4gZW50cmllczoKKyAgICAgICAgICAgIGUyID0gZ3JwLmdldGdyZ2lkKGUuZ3JfZ2lkKQorICAgICAgICAgICAgc2VsZi5jaGVja192YWx1ZShlMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTIuZ3JfZ2lkLCBlLmdyX2dpZCkKKyAgICAgICAgICAgIG5hbWUgPSBlLmdyX25hbWUKKyAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnKycpIG9yIG5hbWUuc3RhcnRzd2l0aCgnLScpOgorICAgICAgICAgICAgICAgICMgTklTLXJlbGF0ZWQgZW50cnkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZTIgPSBncnAuZ2V0Z3JuYW0obmFtZSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdmFsdWUoZTIpCisgICAgICAgICAgICAjIFRoZXJlIGFyZSBpbnN0YW5jZXMgd2hlcmUgZ2V0Z3JhbGwoKSByZXR1cm5zIGdyb3VwIG5hbWVzIGluCisgICAgICAgICAgICAjIGxvd2VyY2FzZSB3aGlsZSBnZXRncmdpZCgpIHJldHVybnMgcHJvcGVyIGNhc2luZy4KKyAgICAgICAgICAgICMgRGlzY292ZXJlZCBvbiBVYnVudHUgNS4wNCAoY3VzdG9tKS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTIuZ3JfbmFtZS5sb3dlcigpLCBuYW1lLmxvd2VyKCkpCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ3JwLmdldGdyZ2lkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdycC5nZXRncm5hbSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBncnAuZ2V0Z3JhbGwsIDQyKQorCisgICAgICAgICMgdHJ5IHRvIGdldCBzb21lIGVycm9ycworICAgICAgICBieW5hbWVzID0ge30KKyAgICAgICAgYnlnaWRzID0ge30KKyAgICAgICAgZm9yIChuLCBwLCBnLCBtZW0pIGluIGdycC5nZXRncmFsbCgpOgorICAgICAgICAgICAgaWYgbm90IG4gb3IgbiA9PSAnKyc6CisgICAgICAgICAgICAgICAgY29udGludWUgIyBza2lwIE5JUyBlbnRyaWVzIGV0Yy4KKyAgICAgICAgICAgIGJ5bmFtZXNbbl0gPSBnCisgICAgICAgICAgICBieWdpZHNbZ10gPSBuCisKKyAgICAgICAgYWxsbmFtZXMgPSBieW5hbWVzLmtleXMoKQorICAgICAgICBuYW1laSA9IDAKKyAgICAgICAgZmFrZW5hbWUgPSBhbGxuYW1lc1tuYW1laV0KKyAgICAgICAgd2hpbGUgZmFrZW5hbWUgaW4gYnluYW1lczoKKyAgICAgICAgICAgIGNoYXJzID0gbGlzdChmYWtlbmFtZSkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY2hhcnMpKToKKyAgICAgICAgICAgICAgICBpZiBjaGFyc1tpXSA9PSAneic6CisgICAgICAgICAgICAgICAgICAgIGNoYXJzW2ldID0gJ0EnCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxpZiBjaGFyc1tpXSA9PSAnWic6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY2hhcnNbaV0gPSBjaHIob3JkKGNoYXJzW2ldKSArIDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWVpID0gbmFtZWkgKyAxCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmYWtlbmFtZSA9IGFsbG5hbWVzW25hbWVpXQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIHNob3VsZCBuZXZlciBoYXBwZW4uLi4gaWYgc28sIGp1c3QgZm9yZ2V0IGl0CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmYWtlbmFtZSA9ICcnLmpvaW4oY2hhcnMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGdycC5nZXRncm5hbSwgZmFrZW5hbWUpCisKKyAgICAgICAgIyBDaG9vc2UgYSBub24tZXhpc3RlbnQgZ2lkLgorICAgICAgICBmYWtlZ2lkID0gNDEyNworICAgICAgICB3aGlsZSBmYWtlZ2lkIGluIGJ5Z2lkczoKKyAgICAgICAgICAgIGZha2VnaWQgPSAoZmFrZWdpZCAqIDMpICUgMHgxMDAwMAorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBncnAuZ2V0Z3JnaWQsIGZha2VnaWQpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEdyb3VwRGF0YWJhc2VUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JwLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dycC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4MzgyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dycC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JwLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dycC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4MzgyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dycC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3ppcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2d6aXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgyYzU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2d6aXAucHkKQEAgLTAsMCArMSwzMDQgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgZ3ppcCBtb2R1bGUuCisiIiIKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IG9zCitpbXBvcnQgaW8KK2ltcG9ydCBzdHJ1Y3QKK2d6aXAgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnZ3ppcCcpCisKK2RhdGExID0gIiIiICBpbnQgbGVuZ3RoPURFRkFVTFRBTExPQywgZXJyID0gWl9PSzsKKyAgUHlPYmplY3QgKlJldFZhbDsKKyAgaW50IGZsdXNobW9kZSA9IFpfRklOSVNIOworICB1bnNpZ25lZCBsb25nIHN0YXJ0X3RvdGFsX291dDsKKworIiIiCisKK2RhdGEyID0gIiIiLyogemxpYm1vZHVsZS5jIC0tIGd6aXAtY29tcGF0aWJsZSBkYXRhIGNvbXByZXNzaW9uICovCisvKiBTZWUgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLworLyogU2VlIGh0dHA6Ly93d3cud2luaW1hZ2UuY29tL3pMaWJEbGwgZm9yIFdpbmRvd3MgKi8KKyIiIgorCisKK2NsYXNzIFRlc3RHemlwKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmaWxlbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhzZWxmLmZpbGVuYW1lKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYuZmlsZW5hbWUpCisKKworICAgIGRlZiB0ZXN0X3dyaXRlKHNlbGYpOgorICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSwgJ3diJykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoZGF0YTEgKiA1MCkKKworICAgICAgICAgICAgIyBUcnkgZmx1c2ggYW5kIGZpbGVuby4KKyAgICAgICAgICAgIGYuZmx1c2goKQorICAgICAgICAgICAgZi5maWxlbm8oKQorICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgJ2ZzeW5jJyk6CisgICAgICAgICAgICAgICAgb3MuZnN5bmMoZi5maWxlbm8oKSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICMgVGVzdCBtdWx0aXBsZSBjbG9zZSgpIGNhbGxzLgorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF93cml0ZSgpCisgICAgICAgICMgVHJ5IHJlYWRpbmcuCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAncicpIGFzIGY6CisgICAgICAgICAgICBkID0gZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkYXRhMSo1MCkKKworICAgIGRlZiB0ZXN0X3JlYWRfdW5pdmVyc2FsX25ld2xpbmVzKHNlbGYpOgorICAgICAgICAjIElzc3VlICM1MTQ4OiBSZWFkaW5nIGJyZWFrcyB3aGVuIG1vZGUgY29udGFpbnMgJ1UnLgorICAgICAgICBzZWxmLnRlc3Rfd3JpdGUoKQorICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSwgJ3JVJykgYXMgZjoKKyAgICAgICAgICAgIGQgPSBmLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGRhdGExKjUwKQorCisgICAgZGVmIHRlc3RfaW9fb25fY2xvc2VkX29iamVjdChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgSS9PIG9wZXJhdGlvbnMgb24gY2xvc2VkIEd6aXBGaWxlIG9iamVjdHMgcmFpc2UgYQorICAgICAgICAjIFZhbHVlRXJyb3IsIGp1c3QgbGlrZSB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbnMgb24gZmlsZSBvYmplY3RzLgorCisgICAgICAgICMgV3JpdGUgdG8gYSBmaWxlLCBvcGVuIGl0IGZvciByZWFkaW5nLCB0aGVuIGNsb3NlIGl0LgorICAgICAgICBzZWxmLnRlc3Rfd3JpdGUoKQorICAgICAgICBmID0gZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAncicpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgZi5yZWFkKDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIGYudGVsbCgpCisgICAgICAgICMgT3BlbiB0aGUgZmlsZSBmb3Igd3JpdGluZywgdGhlbiBjbG9zZSBpdC4KKyAgICAgICAgZiA9IGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSwgJ3cnKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIGYud3JpdGUoJycpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBmLmZsdXNoKCkKKworICAgIGRlZiB0ZXN0X2FwcGVuZChzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X3dyaXRlKCkKKyAgICAgICAgIyBBcHBlbmQgdG8gdGhlIHByZXZpb3VzIGZpbGUKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICdhYicpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGRhdGEyICogMTUpCisKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICdyYicpIGFzIGY6CisgICAgICAgICAgICBkID0gZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCAoZGF0YTEqNTApICsgKGRhdGEyKjE1KSkKKworICAgIGRlZiB0ZXN0X21hbnlfYXBwZW5kKHNlbGYpOgorICAgICAgICAjIEJ1ZyAjMTA3NDI2MSB3YXMgdHJpZ2dlcmVkIHdoZW4gcmVhZGluZyBhIGZpbGUgdGhhdCBjb250YWluZWQKKyAgICAgICAgIyBtYW55LCBtYW55IG1lbWJlcnMuICBDcmVhdGUgc3VjaCBhIGZpbGUgYW5kIHZlcmlmeSB0aGF0IHJlYWRpbmcgaXQKKyAgICAgICAgIyB3b3Jrcy4KKyAgICAgICAgd2l0aCBnemlwLm9wZW4oc2VsZi5maWxlbmFtZSwgJ3diJywgOSkgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoJ2EnKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCAyMDApOgorICAgICAgICAgICAgd2l0aCBnemlwLm9wZW4oc2VsZi5maWxlbmFtZSwgImFiIiwgOSkgYXMgZjogIyBhcHBlbmQKKyAgICAgICAgICAgICAgICBmLndyaXRlKCdhJykKKworICAgICAgICAjIFRyeSByZWFkaW5nIHRoZSBmaWxlCisgICAgICAgIHdpdGggZ3ppcC5vcGVuKHNlbGYuZmlsZW5hbWUsICJyYiIpIGFzIHpnZmlsZToKKyAgICAgICAgICAgIGNvbnRlbnRzID0gIiIKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgenR4dCA9IHpnZmlsZS5yZWFkKDgxOTIpCisgICAgICAgICAgICAgICAgY29udGVudHMgKz0genR4dAorICAgICAgICAgICAgICAgIGlmIG5vdCB6dHh0OiBicmVhaworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRzLCAnYScqMjAxKQorCisgICAgZGVmIHRlc3RfYnVmZmVyZWRfcmVhZGVyKHNlbGYpOgorICAgICAgICAjIElzc3VlICM3NDcxOiBhIEd6aXBGaWxlIGNhbiBiZSB3cmFwcGVkIGluIGEgQnVmZmVyZWRSZWFkZXIgZm9yCisgICAgICAgICMgcGVyZm9ybWFuY2UuCisgICAgICAgIHNlbGYudGVzdF93cml0ZSgpCisKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICdyYicpIGFzIGY6CisgICAgICAgICAgICB3aXRoIGlvLkJ1ZmZlcmVkUmVhZGVyKGYpIGFzIHI6CisgICAgICAgICAgICAgICAgbGluZXMgPSBbbGluZSBmb3IgbGluZSBpbiByXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMsIDUwICogZGF0YTEuc3BsaXRsaW5lcyhUcnVlKSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3Rfd3JpdGUoKQorICAgICAgICAjIFRyeSAucmVhZGxpbmUoKSB3aXRoIHZhcnlpbmcgbGluZSBsZW5ndGhzCisKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICdyYicpIGFzIGY6CisgICAgICAgICAgICBsaW5lX2xlbmd0aCA9IDAKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgTCA9IGYucmVhZGxpbmUobGluZV9sZW5ndGgpCisgICAgICAgICAgICAgICAgaWYgbm90IEwgYW5kIGxpbmVfbGVuZ3RoICE9IDA6IGJyZWFrCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihMKSA8PSBsaW5lX2xlbmd0aCkKKyAgICAgICAgICAgICAgICBsaW5lX2xlbmd0aCA9IChsaW5lX2xlbmd0aCArIDEpICUgNTAKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X3dyaXRlKCkKKyAgICAgICAgIyBUcnkgLnJlYWRsaW5lcygpCisKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICdyYicpIGFzIGY6CisgICAgICAgICAgICBMID0gZi5yZWFkbGluZXMoKQorCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAncmInKSBhcyBmOgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBMID0gZi5yZWFkbGluZXMoMTUwKQorICAgICAgICAgICAgICAgIGlmIEwgPT0gW106IGJyZWFrCisKKyAgICBkZWYgdGVzdF9zZWVrX3JlYWQoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF93cml0ZSgpCisgICAgICAgICMgVHJ5IHNlZWssIHJlYWQgdGVzdAorCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lKSBhcyBmOgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBvbGRwb3MgPSBmLnRlbGwoKQorICAgICAgICAgICAgICAgIGxpbmUxID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmUxOiBicmVhaworICAgICAgICAgICAgICAgIG5ld3BvcyA9IGYudGVsbCgpCisgICAgICAgICAgICAgICAgZi5zZWVrKG9sZHBvcykgICMgbmVnYXRpdmUgc2VlaworICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lMSk+MTA6CisgICAgICAgICAgICAgICAgICAgIGFtb3VudCA9IDEwCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYW1vdW50ID0gbGVuKGxpbmUxKQorICAgICAgICAgICAgICAgIGxpbmUyID0gZi5yZWFkKGFtb3VudCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUxWzphbW91bnRdLCBsaW5lMikKKyAgICAgICAgICAgICAgICBmLnNlZWsobmV3cG9zKSAgIyBwb3NpdGl2ZSBzZWVrCisKKyAgICBkZWYgdGVzdF9zZWVrX3doZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X3dyaXRlKCkKKyAgICAgICAgIyBUcnkgc2Vlayh3aGVuY2U9MSksIHJlYWQgdGVzdAorCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lKSBhcyBmOgorICAgICAgICAgICAgZi5yZWFkKDEwKQorICAgICAgICAgICAgZi5zZWVrKDEwLCB3aGVuY2U9MSkKKyAgICAgICAgICAgIHkgPSBmLnJlYWQoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgZGF0YTFbMjA6MzBdKQorCisgICAgZGVmIHRlc3Rfc2Vla193cml0ZShzZWxmKToKKyAgICAgICAgIyBUcnkgc2Vlaywgd3JpdGUgdGVzdAorICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZm9yIHBvcyBpbiByYW5nZSgwLCAyNTYsIDE2KToKKyAgICAgICAgICAgICAgICBmLnNlZWsocG9zKQorICAgICAgICAgICAgICAgIGYud3JpdGUoJ0daXG4nKQorCisgICAgZGVmIHRlc3RfbW9kZShzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X3dyaXRlKCkKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICdyJykgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5teWZpbGVvYmoubW9kZSwgJ3JiJykKKworICAgIGRlZiB0ZXN0XzE2NDc0ODQoc2VsZik6CisgICAgICAgIGZvciBtb2RlIGluICgnd2InLCAncmInKToKKyAgICAgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCBtb2RlKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGYsICJuYW1lIikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLm5hbWUsIHNlbGYuZmlsZW5hbWUpCisKKyAgICBkZWYgdGVzdF9tdGltZShzZWxmKToKKyAgICAgICAgbXRpbWUgPSAxMjM0NTY3ODkKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICd3JywgbXRpbWUgPSBtdGltZSkgYXMgZldyaXRlOgorICAgICAgICAgICAgZldyaXRlLndyaXRlKGRhdGExKQorICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSkgYXMgZlJlYWQ6CisgICAgICAgICAgICBkYXRhUmVhZCA9IGZSZWFkLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhUmVhZCwgZGF0YTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihmUmVhZCwgJ210aW1lJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZSZWFkLm10aW1lLCBtdGltZSkKKworICAgIGRlZiB0ZXN0X21ldGFkYXRhKHNlbGYpOgorICAgICAgICBtdGltZSA9IDEyMzQ1Njc4OQorCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAndycsIG10aW1lID0gbXRpbWUpIGFzIGZXcml0ZToKKyAgICAgICAgICAgIGZXcml0ZS53cml0ZShkYXRhMSkKKworICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlbmFtZSwgJ3JiJykgYXMgZlJlYWQ6CisgICAgICAgICAgICAjIHNlZSBSRkMgMTk1MjogaHR0cDovL3d3dy5mYXFzLm9yZy9yZmNzL3JmYzE5NTIuaHRtbAorCisgICAgICAgICAgICBpZEJ5dGVzID0gZlJlYWQucmVhZCgyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZEJ5dGVzLCAnXHgxZlx4OGInKSAjIGd6aXAgSUQKKworICAgICAgICAgICAgY21CeXRlID0gZlJlYWQucmVhZCgxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbUJ5dGUsICdceDA4JykgIyBkZWZsYXRlCisKKyAgICAgICAgICAgIGZsYWdzQnl0ZSA9IGZSZWFkLnJlYWQoMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhZ3NCeXRlLCAnXHgwOCcpICMgb25seSB0aGUgRk5BTUUgZmxhZyBpcyBzZXQKKworICAgICAgICAgICAgbXRpbWVCeXRlcyA9IGZSZWFkLnJlYWQoNCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXRpbWVCeXRlcywgc3RydWN0LnBhY2soJzxpJywgbXRpbWUpKSAjIGxpdHRsZS1lbmRpYW4KKworICAgICAgICAgICAgeGZsQnl0ZSA9IGZSZWFkLnJlYWQoMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeGZsQnl0ZSwgJ1x4MDInKSAjIG1heGltdW0gY29tcHJlc3Npb24KKworICAgICAgICAgICAgb3NCeXRlID0gZlJlYWQucmVhZCgxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvc0J5dGUsICdceGZmJykgIyBPUyAidW5rbm93biIgKE9TLWluZGVwZW5kZW50KQorCisgICAgICAgICAgICAjIFNpbmNlIHRoZSBGTkFNRSBmbGFnIGlzIHNldCwgdGhlIHplcm8tdGVybWluYXRlZCBmaWxlbmFtZSBmb2xsb3dzLgorICAgICAgICAgICAgIyBSRkMgMTk1MiBzcGVjaWZpZXMgdGhhdCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlLCBpZiBhbnkuCisgICAgICAgICAgICAjIEhvd2V2ZXIsIHRoZSBnemlwIG1vZHVsZSBkZWZhdWx0cyB0byBzdG9yaW5nIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICMgZmlsZSBpbiB0aGlzIGZpZWxkLgorICAgICAgICAgICAgZXhwZWN0ZWQgPSBzZWxmLmZpbGVuYW1lLmVuY29kZSgnTGF0aW4tMScpICsgJ1x4MDAnCisgICAgICAgICAgICBuYW1lQnl0ZXMgPSBmUmVhZC5yZWFkKGxlbihleHBlY3RlZCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVCeXRlcywgZXhwZWN0ZWQpCisKKyAgICAgICAgICAgICMgU2luY2Ugbm8gb3RoZXIgZmxhZ3Mgd2VyZSBzZXQsIHRoZSBoZWFkZXIgZW5kcyBoZXJlLgorICAgICAgICAgICAgIyBSYXRoZXIgdGhhbiBwcm9jZXNzIHRoZSBjb21wcmVzc2VkIGRhdGEsIGxldCdzIHNlZWsgdG8gdGhlIHRyYWlsZXIuCisgICAgICAgICAgICBmUmVhZC5zZWVrKG9zLnN0YXQoc2VsZi5maWxlbmFtZSkuc3Rfc2l6ZSAtIDgpCisKKyAgICAgICAgICAgIGNyYzMyQnl0ZXMgPSBmUmVhZC5yZWFkKDQpICMgQ1JDMzIgb2YgdW5jb21wcmVzc2VkIGRhdGEgW2RhdGExXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjcmMzMkJ5dGVzLCAnXHhhZlx4ZDdkXHg4MycpCisKKyAgICAgICAgICAgIGlzaXplQnl0ZXMgPSBmUmVhZC5yZWFkKDQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzaXplQnl0ZXMsIHN0cnVjdC5wYWNrKCc8aScsIGxlbihkYXRhMSkpKQorCisgICAgZGVmIHRlc3Rfd2l0aF9vcGVuKHNlbGYpOgorICAgICAgICAjIEd6aXBGaWxlIHN1cHBvcnRzIHRoZSBjb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2wKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGIieHh4IikKKyAgICAgICAgZiA9IGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSwgInJiIikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggZjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJfX2VudGVyX18gb24gYSBjbG9zZWQgZmlsZSBkaWRuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICJ3YiIpIGFzIGY6CisgICAgICAgICAgICAgICAgMSAvLyAwCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiMSAvLyAwIGRpZG4ndCByYWlzZSBhbiBleGNlcHRpb24iKQorCisgICAgZGVmIHRlc3RfemVyb19wYWRkZWRfZmlsZShzZWxmKToKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGRhdGExICogNTApCisKKyAgICAgICAgIyBQYWQgdGhlIGZpbGUgd2l0aCB6ZXJvZXMKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZW5hbWUsICJhYiIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCJceDAwIiAqIDUwKQorCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgZCA9IGYucmVhZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGRhdGExICogNTAsICJJbmNvcnJlY3QgZGF0YSBpbiBmaWxlIikKKworICAgIGRlZiB0ZXN0X2ZpbGVvYmpfZnJvbV9mZG9wZW4oc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEzNzgxOiBDcmVhdGluZyBhIEd6aXBGaWxlIHVzaW5nIGEgZmlsZW9iaiBmcm9tIG9zLmZkb3BlbigpCisgICAgICAgICMgc2hvdWxkIG5vdCBlbWJlZCB0aGUgZmFrZSBmaWxlbmFtZSAiPGZkb3Blbj4iIGluIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgICAgZmQgPSBvcy5vcGVuKHNlbGYuZmlsZW5hbWUsIG9zLk9fV1JPTkxZIHwgb3MuT19DUkVBVCkKKyAgICAgICAgd2l0aCBvcy5mZG9wZW4oZmQsICJ3YiIpIGFzIGY6CisgICAgICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoZmlsZW9iaj1mLCBtb2RlPSJ3IikgYXMgZzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGcubmFtZSwgIiIpCisKKyAgICBkZWYgdGVzdF9yZWFkX3dpdGhfZXh0cmEoc2VsZik6CisgICAgICAgICMgR3ppcCBkYXRhIHdpdGggYW4gZXh0cmEgZmllbGQKKyAgICAgICAgZ3pkYXRhID0gKGInXHgxZlx4OGJceDA4XHgwNFx4YjJceDE3Y1FceDAyXHhmZicKKyAgICAgICAgICAgICAgICAgIGInXHgwNVx4MDBFeHRyYScKKyAgICAgICAgICAgICAgICAgIGInXHgwYkktLlx4MDFceDAwMlx4ZDFNeFx4MDRceDAwXHgwMFx4MDAnKQorICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoZmlsZW9iaj1pby5CeXRlc0lPKGd6ZGF0YSkpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiJ1Rlc3QnKQorCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0R3ppcCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3ppcC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nemlwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGE3MTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3ppcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3ppcC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nemlwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGE3MTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3ppcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hhc2gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjN2RjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hhc2gucHkKQEAgLTAsMCArMSwyNDggQEAKKyMgdGVzdCB0aGUgaW52YXJpYW50IHRoYXQKKyMgICBpZmYgYT09YiB0aGVuIGhhc2goYSk9PWhhc2goYikKKyMKKyMgQWxzbyB0ZXN0IHRoYXQgaGFzaCBpbXBsZW1lbnRhdGlvbnMgYXJlIGluaGVyaXRlZCBhcyBleHBlY3RlZAorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3VicHJvY2VzcworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgSGFzaGFibGUKKworSVNfNjRCSVQgPSAoc3RydWN0LmNhbGNzaXplKCdsJykgPT0gOCkKKworCitjbGFzcyBIYXNoRXF1YWxpdHlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2FtZV9oYXNoKHNlbGYsICpvYmpsaXN0KToKKyAgICAgICAgIyBIYXNoIGVhY2ggb2JqZWN0IGdpdmVuIGFuZCBmYWlsIGlmCisgICAgICAgICMgdGhlIGhhc2ggdmFsdWVzIGFyZSBub3QgYWxsIHRoZSBzYW1lLgorICAgICAgICBoYXNoZWQgPSBtYXAoaGFzaCwgb2JqbGlzdCkKKyAgICAgICAgZm9yIGggaW4gaGFzaGVkWzE6XToKKyAgICAgICAgICAgIGlmIGggIT0gaGFzaGVkWzBdOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiaGFzaGVkIHZhbHVlcyBkaWZmZXI6ICVyIiAlIChvYmpsaXN0LCkpCisKKyAgICBkZWYgdGVzdF9udW1lcmljX2xpdGVyYWxzKHNlbGYpOgorICAgICAgICBzZWxmLnNhbWVfaGFzaCgxLCAxTCwgMS4wLCAxLjArMC4waikKKyAgICAgICAgc2VsZi5zYW1lX2hhc2goMCwgMEwsIDAuMCwgMC4wKzAuMGopCisgICAgICAgIHNlbGYuc2FtZV9oYXNoKC0xLCAtMUwsIC0xLjAsIC0xLjArMC4waikKKyAgICAgICAgc2VsZi5zYW1lX2hhc2goLTIsIC0yTCwgLTIuMCwgLTIuMCswLjBqKQorCisgICAgZGVmIHRlc3RfY29lcmNlZF9pbnRlZ2VycyhzZWxmKToKKyAgICAgICAgc2VsZi5zYW1lX2hhc2goaW50KDEpLCBsb25nKDEpLCBmbG9hdCgxKSwgY29tcGxleCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50KCcxJyksIGZsb2F0KCcxLjAnKSkKKyAgICAgICAgc2VsZi5zYW1lX2hhc2goaW50KC0yKiozMSksIGxvbmcoLTIqKjMxKSwgZmxvYXQoLTIqKjMxKSkKKyAgICAgICAgc2VsZi5zYW1lX2hhc2goaW50KDEtMioqMzEpLCBsb25nKDEtMioqMzEpLCBmbG9hdCgxLTIqKjMxKSkKKyAgICAgICAgc2VsZi5zYW1lX2hhc2goaW50KDIqKjMxLTEpLCBsb25nKDIqKjMxLTEpLCBmbG9hdCgyKiozMS0xKSkKKyAgICAgICAgIyBmb3IgNjQtYml0IHBsYXRmb3JtcworICAgICAgICBzZWxmLnNhbWVfaGFzaChpbnQoMioqMzEpLCBsb25nKDIqKjMxKSwgZmxvYXQoMioqMzEpKQorICAgICAgICBzZWxmLnNhbWVfaGFzaChpbnQoLTIqKjYzKSwgbG9uZygtMioqNjMpLCBmbG9hdCgtMioqNjMpKQorICAgICAgICBzZWxmLnNhbWVfaGFzaChpbnQoMS0yKio2MyksIGxvbmcoMS0yKio2MykpCisgICAgICAgIHNlbGYuc2FtZV9oYXNoKGludCgyKio2My0xKSwgbG9uZygyKio2My0xKSkKKyAgICAgICAgc2VsZi5zYW1lX2hhc2gobG9uZygyKio2MyksIGZsb2F0KDIqKjYzKSkKKworICAgIGRlZiB0ZXN0X2NvZXJjZWRfZmxvYXRzKHNlbGYpOgorICAgICAgICBzZWxmLnNhbWVfaGFzaChsb25nKDEuMjNlMzAwKSwgZmxvYXQoMS4yM2UzMDApKQorICAgICAgICBzZWxmLnNhbWVfaGFzaChmbG9hdCgwLjUpLCBjb21wbGV4KDAuNSwgMC4wKSkKKworCitfZGVmYXVsdF9oYXNoID0gb2JqZWN0Ll9faGFzaF9fCitjbGFzcyBEZWZhdWx0SGFzaChvYmplY3QpOiBwYXNzCisKK19GSVhFRF9IQVNIX1ZBTFVFID0gNDIKK2NsYXNzIEZpeGVkSGFzaChvYmplY3QpOgorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIF9GSVhFRF9IQVNIX1ZBTFVFCisKK2NsYXNzIE9ubHlFcXVhbGl0eShvYmplY3QpOgorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZiBpcyBvdGhlcgorICAgICMgVHJpY2sgdG8gc3VwcHJlc3MgUHkzayB3YXJuaW5nIGluIDIueAorICAgIF9faGFzaF9fID0gTm9uZQorZGVsIE9ubHlFcXVhbGl0eS5fX2hhc2hfXworCitjbGFzcyBPbmx5SW5lcXVhbGl0eShvYmplY3QpOgorICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZiBpcyBub3Qgb3RoZXIKKworY2xhc3MgT25seUNtcChvYmplY3QpOgorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIGNtcChpZChzZWxmKSwgaWQob3RoZXIpKQorICAgICMgVHJpY2sgdG8gc3VwcHJlc3MgUHkzayB3YXJuaW5nIGluIDIueAorICAgIF9faGFzaF9fID0gTm9uZQorZGVsIE9ubHlDbXAuX19oYXNoX18KKworY2xhc3MgSW5oZXJpdGVkSGFzaFdpdGhFcXVhbGl0eShGaXhlZEhhc2gsIE9ubHlFcXVhbGl0eSk6IHBhc3MKK2NsYXNzIEluaGVyaXRlZEhhc2hXaXRoSW5lcXVhbGl0eShGaXhlZEhhc2gsIE9ubHlJbmVxdWFsaXR5KTogcGFzcworY2xhc3MgSW5oZXJpdGVkSGFzaFdpdGhDbXAoRml4ZWRIYXNoLCBPbmx5Q21wKTogcGFzcworCitjbGFzcyBOb0hhc2gob2JqZWN0KToKKyAgICBfX2hhc2hfXyA9IE5vbmUKKworY2xhc3MgSGFzaEluaGVyaXRhbmNlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZmF1bHRfZXhwZWN0ZWQgPSBbb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0SGFzaCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgT25seUVxdWFsaXR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBPbmx5SW5lcXVhbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgT25seUNtcCgpLAorICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgZml4ZWRfZXhwZWN0ZWQgPSBbRml4ZWRIYXNoKCksCisgICAgICAgICAgICAgICAgICAgICAgSW5oZXJpdGVkSGFzaFdpdGhFcXVhbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICAgIEluaGVyaXRlZEhhc2hXaXRoSW5lcXVhbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICAgIEluaGVyaXRlZEhhc2hXaXRoQ21wKCksCisgICAgICAgICAgICAgICAgICAgICAgXQorICAgIGVycm9yX2V4cGVjdGVkID0gW05vSGFzaCgpXQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9oYXNoKHNlbGYpOgorICAgICAgICBmb3Igb2JqIGluIHNlbGYuZGVmYXVsdF9leHBlY3RlZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChvYmopLCBfZGVmYXVsdF9oYXNoKG9iaikpCisKKyAgICBkZWYgdGVzdF9maXhlZF9oYXNoKHNlbGYpOgorICAgICAgICBmb3Igb2JqIGluIHNlbGYuZml4ZWRfZXhwZWN0ZWQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gob2JqKSwgX0ZJWEVEX0hBU0hfVkFMVUUpCisKKyAgICBkZWYgdGVzdF9lcnJvcl9oYXNoKHNlbGYpOgorICAgICAgICBmb3Igb2JqIGluIHNlbGYuZXJyb3JfZXhwZWN0ZWQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIG9iaikKKworICAgIGRlZiB0ZXN0X2hhc2hhYmxlKHNlbGYpOgorICAgICAgICBvYmplY3RzID0gKHNlbGYuZGVmYXVsdF9leHBlY3RlZCArCisgICAgICAgICAgICAgICAgICAgc2VsZi5maXhlZF9leHBlY3RlZCkKKyAgICAgICAgZm9yIG9iaiBpbiBvYmplY3RzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG9iaiwgSGFzaGFibGUpCisKKyAgICBkZWYgdGVzdF9ub3RfaGFzaGFibGUoc2VsZik6CisgICAgICAgIGZvciBvYmogaW4gc2VsZi5lcnJvcl9leHBlY3RlZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShvYmosIEhhc2hhYmxlKQorCisKKyMgSXNzdWUgIzQ3MDE6IENoZWNrIHRoYXQgc29tZSBidWlsdGluIHR5cGVzIGFyZSBjb3JyZWN0bHkgaGFzaGFibGUKKyMgIChUaGlzIHRlc3Qgb25seSB1c2VkIHRvIGZhaWwgaW4gUHl0aG9uIDMuMCwgYnV0IGhhcyBiZWVuIGluY2x1ZGVkCisjICAgaW4gMi54IGFsb25nIHdpdGggdGhlIGxhenkgY2FsbCB0byBQeVR5cGVfUmVhZHkgaW4gUHlPYmplY3RfSGFzaCkKK2NsYXNzIERlZmF1bHRJdGVyU2VxKG9iamVjdCk6CisgICAgc2VxID0gcmFuZ2UoMTApCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5zZXEpCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VxW2luZGV4XQorCitjbGFzcyBIYXNoQnVpbHRpbnNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgaGFzaGVzX3RvX2NoZWNrID0gW3hyYW5nZSgxMCksCisgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0ZSh4cmFuZ2UoMTApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaXRlcihEZWZhdWx0SXRlclNlcSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaXRlcihsYW1iZGE6IDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiB0ZXN0X2hhc2hlcyhzZWxmKToKKyAgICAgICAgX2RlZmF1bHRfaGFzaCA9IG9iamVjdC5fX2hhc2hfXworICAgICAgICBmb3Igb2JqIGluIHNlbGYuaGFzaGVzX3RvX2NoZWNrOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKG9iaiksIF9kZWZhdWx0X2hhc2gob2JqKSkKKworY2xhc3MgSGFzaFJhbmRvbWl6YXRpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIEVhY2ggc3ViY2xhc3Mgc2hvdWxkIGRlZmluZSBhIGZpZWxkICJyZXByXyIsIGNvbnRhaW5pbmcgdGhlIHJlcHIoKSBvZgorICAgICMgYW4gb2JqZWN0IHRvIGJlIHRlc3RlZAorCisgICAgZGVmIGdldF9oYXNoX2NvbW1hbmQoc2VsZiwgcmVwcl8pOgorICAgICAgICByZXR1cm4gJ3ByaW50KGhhc2goJXMpKScgJSByZXByXworCisgICAgZGVmIGdldF9oYXNoKHNlbGYsIHJlcHJfLCBzZWVkPU5vbmUpOgorICAgICAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBpZiBzZWVkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZW52WydQWVRIT05IQVNIU0VFRCddID0gc3RyKHNlZWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnYucG9wKCdQWVRIT05IQVNIU0VFRCcsIE5vbmUpCisgICAgICAgIGNtZF9saW5lID0gW3N5cy5leGVjdXRhYmxlLCAnLWMnLCBzZWxmLmdldF9oYXNoX2NvbW1hbmQocmVwcl8pXQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWRfbGluZSwgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1lbnYpCisgICAgICAgIG91dCwgZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIG91dCA9IHRlc3Rfc3VwcG9ydC5zdHJpcF9weXRob25fc3RkZXJyKG91dCkKKyAgICAgICAgcmV0dXJuIGludChvdXQuc3RyaXAoKSkKKworICAgIGRlZiB0ZXN0X3JhbmRvbWl6ZWRfaGFzaChzZWxmKToKKyAgICAgICAgIyB0d28gcnVucyBzaG91bGQgcmV0dXJuIGRpZmZlcmVudCBoYXNoZXMKKyAgICAgICAgcnVuMSA9IHNlbGYuZ2V0X2hhc2goc2VsZi5yZXByXywgc2VlZD0ncmFuZG9tJykKKyAgICAgICAgcnVuMiA9IHNlbGYuZ2V0X2hhc2goc2VsZi5yZXByXywgc2VlZD0ncmFuZG9tJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChydW4xLCBydW4yKQorCitjbGFzcyBTdHJpbmdsaWtlSGFzaFJhbmRvbWl6YXRpb25UZXN0cyhIYXNoUmFuZG9taXphdGlvblRlc3RzKToKKyAgICBkZWYgdGVzdF9udWxsX2hhc2goc2VsZik6CisgICAgICAgICMgUFlUSE9OSEFTSFNFRUQ9MCBkaXNhYmxlcyB0aGUgcmFuZG9taXplZCBoYXNoCisgICAgICAgIGlmIElTXzY0QklUOgorICAgICAgICAgICAga25vd25faGFzaF9vZl9vYmogPSAxNDUzMDc5NzI5MTg4MDk4MjExCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBrbm93bl9oYXNoX29mX29iaiA9IC0xNjAwOTI1NTMzCisKKyAgICAgICAgIyBSYW5kb21pemF0aW9uIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQ6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfaGFzaChzZWxmLnJlcHJfKSwga25vd25faGFzaF9vZl9vYmopCisKKyAgICAgICAgIyBJdCBjYW4gYWxzbyBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIHRoZSBzZWVkIHRvIDA6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfaGFzaChzZWxmLnJlcHJfLCBzZWVkPTApLCBrbm93bl9oYXNoX29mX29iaikKKworICAgIGRlZiB0ZXN0X2ZpeGVkX2hhc2goc2VsZik6CisgICAgICAgICMgdGVzdCBhIGZpeGVkIHNlZWQgZm9yIHRoZSByYW5kb21pemVkIGhhc2gKKyAgICAgICAgIyBOb3RlIHRoYXQgYWxsIHR5cGVzIHNoYXJlIHRoZSBzYW1lIHZhbHVlczoKKyAgICAgICAgaWYgSVNfNjRCSVQ6CisgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgorICAgICAgICAgICAgICAgIGggPSAtNDQxMDkxMTUwMjMwMzg3ODUwOQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBoID0gLTM1NzAxNTA5Njk0Nzk5OTQxMzAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gJ2xpdHRsZSc6CisgICAgICAgICAgICAgICAgaCA9IC0yMDYwNzY3OTkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaCA9IC0xMDI0MDE0NDU3CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfaGFzaChzZWxmLnJlcHJfLCBzZWVkPTQyKSwgaCkKKworY2xhc3MgU3RySGFzaFJhbmRvbWl6YXRpb25UZXN0cyhTdHJpbmdsaWtlSGFzaFJhbmRvbWl6YXRpb25UZXN0cyk6CisgICAgcmVwcl8gPSByZXByKCdhYmMnKQorCisgICAgZGVmIHRlc3RfZW1wdHlfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goIiIpLCAwKQorCitjbGFzcyBVbmljb2RlSGFzaFJhbmRvbWl6YXRpb25UZXN0cyhTdHJpbmdsaWtlSGFzaFJhbmRvbWl6YXRpb25UZXN0cyk6CisgICAgcmVwcl8gPSByZXByKHUnYWJjJykKKworICAgIGRlZiB0ZXN0X2VtcHR5X3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHUiIiksIDApCisKK2NsYXNzIEJ1ZmZlckhhc2hSYW5kb21pemF0aW9uVGVzdHMoU3RyaW5nbGlrZUhhc2hSYW5kb21pemF0aW9uVGVzdHMpOgorICAgIHJlcHJfID0gJ2J1ZmZlcigiYWJjIiknCisKKyAgICBkZWYgdGVzdF9lbXB0eV9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChidWZmZXIoIiIpKSwgMCkKKworY2xhc3MgRGF0ZXRpbWVUZXN0cyhIYXNoUmFuZG9taXphdGlvblRlc3RzKToKKyAgICBkZWYgZ2V0X2hhc2hfY29tbWFuZChzZWxmLCByZXByXyk6CisgICAgICAgIHJldHVybiAnaW1wb3J0IGRhdGV0aW1lOyBwcmludChoYXNoKCVzKSknICUgcmVwcl8KKworY2xhc3MgRGF0ZXRpbWVEYXRlVGVzdHMoRGF0ZXRpbWVUZXN0cyk6CisgICAgcmVwcl8gPSByZXByKGRhdGV0aW1lLmRhdGUoMTA2NiwgMTAsIDE0KSkKKworY2xhc3MgRGF0ZXRpbWVEYXRldGltZVRlc3RzKERhdGV0aW1lVGVzdHMpOgorICAgIHJlcHJfID0gcmVwcihkYXRldGltZS5kYXRldGltZSgxLCAyLCAzLCA0LCA1LCA2LCA3KSkKKworY2xhc3MgRGF0ZXRpbWVUaW1lVGVzdHMoRGF0ZXRpbWVUZXN0cyk6CisgICAgcmVwcl8gPSByZXByKGRhdGV0aW1lLnRpbWUoMCkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoSGFzaEVxdWFsaXR5VGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNoSW5oZXJpdGFuY2VUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2hCdWlsdGluc1Rlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RySGFzaFJhbmRvbWl6YXRpb25UZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVIYXNoUmFuZG9taXphdGlvblRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySGFzaFJhbmRvbWl6YXRpb25UZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGV0aW1lRGF0ZVRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXRpbWVEYXRldGltZVRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZXRpbWVUaW1lVGVzdHMpCisKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oYXNoLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hhc2gucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzAyODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oYXNoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oYXNoLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hhc2gucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzAyODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oYXNoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oYXNobGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjM2NWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaGxpYi5weQpAQCAtMCwwICsxLDM5OSBAQAorIyBUZXN0IGhhc2hsaWIgbW9kdWxlCisjCisjICRJZCQKKyMKKyMgIENvcHlyaWdodCAoQykgMjAwNS0yMDEwICAgR3JlZ29yeSBQLiBTbWl0aCAoZ3JlZ0BrcnlwdG8ub3JnKQorIyAgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorIworCitpbXBvcnQgYXJyYXkKK2ltcG9ydCBoYXNobGliCitpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgc3lzCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgXzRHLCBwcmVjaXNpb25iaWdtZW10ZXN0CisKKyMgV2VyZSB3ZSBjb21waWxlZCAtLXdpdGgtcHlkZWJ1ZyBvciB3aXRoICNkZWZpbmUgUHlfREVCVUc/CitDT01QSUxFRF9XSVRIX1BZREVCVUcgPSBoYXNhdHRyKHN5cywgJ2dldHRvdGFscmVmY291bnQnKQorCisKK2RlZiBoZXhzdHIocyk6CisgICAgaW1wb3J0IHN0cmluZworICAgIGggPSBzdHJpbmcuaGV4ZGlnaXRzCisgICAgciA9ICcnCisgICAgZm9yIGMgaW4gczoKKyAgICAgICAgaSA9IG9yZChjKQorICAgICAgICByID0gciArIGhbKGkgPj4gNCkgJiAweEZdICsgaFtpICYgMHhGXQorICAgIHJldHVybiByCisKKworY2xhc3MgSGFzaExpYlRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBzdXBwb3J0ZWRfaGFzaF9uYW1lcyA9ICggJ21kNScsICdNRDUnLCAnc2hhMScsICdTSEExJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoYTIyNCcsICdTSEEyMjQnLCAnc2hhMjU2JywgJ1NIQTI1NicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGEzODQnLCAnU0hBMzg0JywgJ3NoYTUxMicsICdTSEE1MTInICkKKworICAgIF93YXJuX29uX2V4dGVuc2lvbl9pbXBvcnQgPSBDT01QSUxFRF9XSVRIX1BZREVCVUcKKworICAgIGRlZiBfY29uZGl0aW9uYWxfaW1wb3J0X21vZHVsZShzZWxmLCBtb2R1bGVfbmFtZSk6CisgICAgICAgICIiIkltcG9ydCBhIG1vZHVsZSBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIGl0IG9yIE5vbmUgb24gZmFpbHVyZS4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYygnaW1wb3J0ICcrbW9kdWxlX25hbWUpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgZXJyb3I6CisgICAgICAgICAgICBpZiBzZWxmLl93YXJuX29uX2V4dGVuc2lvbl9pbXBvcnQ6CisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybignRGlkIGEgQyBleHRlbnNpb24gZmFpbCB0byBjb21waWxlPyAlcycgJSBlcnJvcikKKyAgICAgICAgcmV0dXJuIGxvY2FscygpLmdldChtb2R1bGVfbmFtZSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBhbGdvcml0aG1zID0gc2V0KCkKKyAgICAgICAgZm9yIGFsZ29yaXRobSBpbiBzZWxmLnN1cHBvcnRlZF9oYXNoX25hbWVzOgorICAgICAgICAgICAgYWxnb3JpdGhtcy5hZGQoYWxnb3JpdGhtLmxvd2VyKCkpCisgICAgICAgIHNlbGYuY29uc3RydWN0b3JzX3RvX3Rlc3QgPSB7fQorICAgICAgICBmb3IgYWxnb3JpdGhtIGluIGFsZ29yaXRobXM6CisgICAgICAgICAgICBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0W2FsZ29yaXRobV0gPSBzZXQoKQorCisgICAgICAgICMgRm9yIGVhY2ggYWxnb3JpdGhtLCB0ZXN0IHRoZSBkaXJlY3QgY29uc3RydWN0b3IgYW5kIHRoZSB1c2UKKyAgICAgICAgIyBvZiBoYXNobGliLm5ldyBnaXZlbiB0aGUgYWxnb3JpdGhtIG5hbWUuCisgICAgICAgIGZvciBhbGdvcml0aG0sIGNvbnN0cnVjdG9ycyBpbiBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0Lml0ZW1zKCk6CisgICAgICAgICAgICBjb25zdHJ1Y3RvcnMuYWRkKGdldGF0dHIoaGFzaGxpYiwgYWxnb3JpdGhtKSkKKyAgICAgICAgICAgIGRlZiBfdGVzdF9hbGdvcml0aG1fdmlhX2hhc2hsaWJfbmV3KGRhdGE9Tm9uZSwgX2FsZz1hbGdvcml0aG0pOgorICAgICAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hsaWIubmV3KF9hbGcpCisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2hsaWIubmV3KF9hbGcsIGRhdGEpCisgICAgICAgICAgICBjb25zdHJ1Y3RvcnMuYWRkKF90ZXN0X2FsZ29yaXRobV92aWFfaGFzaGxpYl9uZXcpCisKKyAgICAgICAgX2hhc2hsaWIgPSBzZWxmLl9jb25kaXRpb25hbF9pbXBvcnRfbW9kdWxlKCdfaGFzaGxpYicpCisgICAgICAgIGlmIF9oYXNobGliOgorICAgICAgICAgICAgIyBUaGVzZSB0d28gYWxnb3JpdGhtcyBzaG91bGQgYWx3YXlzIGJlIHByZXNlbnQgd2hlbiB0aGlzIG1vZHVsZQorICAgICAgICAgICAgIyBpcyBjb21waWxlZC4gIElmIG5vdCwgc29tZXRoaW5nIHdhcyBjb21waWxlZCB3cm9uZy4KKyAgICAgICAgICAgIGFzc2VydCBoYXNhdHRyKF9oYXNobGliLCAnb3BlbnNzbF9tZDUnKQorICAgICAgICAgICAgYXNzZXJ0IGhhc2F0dHIoX2hhc2hsaWIsICdvcGVuc3NsX3NoYTEnKQorICAgICAgICAgICAgZm9yIGFsZ29yaXRobSwgY29uc3RydWN0b3JzIGluIHNlbGYuY29uc3RydWN0b3JzX3RvX3Rlc3QuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciA9IGdldGF0dHIoX2hhc2hsaWIsICdvcGVuc3NsXycrYWxnb3JpdGhtLCBOb25lKQorICAgICAgICAgICAgICAgIGlmIGNvbnN0cnVjdG9yOgorICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcnMuYWRkKGNvbnN0cnVjdG9yKQorCisgICAgICAgIF9tZDUgPSBzZWxmLl9jb25kaXRpb25hbF9pbXBvcnRfbW9kdWxlKCdfbWQ1JykKKyAgICAgICAgaWYgX21kNToKKyAgICAgICAgICAgIHNlbGYuY29uc3RydWN0b3JzX3RvX3Rlc3RbJ21kNSddLmFkZChfbWQ1Lm5ldykKKyAgICAgICAgX3NoYSA9IHNlbGYuX2NvbmRpdGlvbmFsX2ltcG9ydF9tb2R1bGUoJ19zaGEnKQorICAgICAgICBpZiBfc2hhOgorICAgICAgICAgICAgc2VsZi5jb25zdHJ1Y3RvcnNfdG9fdGVzdFsnc2hhMSddLmFkZChfc2hhLm5ldykKKyAgICAgICAgX3NoYTI1NiA9IHNlbGYuX2NvbmRpdGlvbmFsX2ltcG9ydF9tb2R1bGUoJ19zaGEyNTYnKQorICAgICAgICBpZiBfc2hhMjU2OgorICAgICAgICAgICAgc2VsZi5jb25zdHJ1Y3RvcnNfdG9fdGVzdFsnc2hhMjI0J10uYWRkKF9zaGEyNTYuc2hhMjI0KQorICAgICAgICAgICAgc2VsZi5jb25zdHJ1Y3RvcnNfdG9fdGVzdFsnc2hhMjU2J10uYWRkKF9zaGEyNTYuc2hhMjU2KQorICAgICAgICBfc2hhNTEyID0gc2VsZi5fY29uZGl0aW9uYWxfaW1wb3J0X21vZHVsZSgnX3NoYTUxMicpCisgICAgICAgIGlmIF9zaGE1MTI6CisgICAgICAgICAgICBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0WydzaGEzODQnXS5hZGQoX3NoYTUxMi5zaGEzODQpCisgICAgICAgICAgICBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0WydzaGE1MTInXS5hZGQoX3NoYTUxMi5zaGE1MTIpCisKKyAgICAgICAgc3VwZXIoSGFzaExpYlRlc3RDYXNlLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdF9oYXNoX2FycmF5KHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoImIiLCByYW5nZSgxMCkpCisgICAgICAgIGNvbnN0cnVjdG9ycyA9IHNlbGYuY29uc3RydWN0b3JzX3RvX3Rlc3QuaXRlcnZhbHVlcygpCisgICAgICAgIGZvciBjb25zIGluIGl0ZXJ0b29scy5jaGFpbi5mcm9tX2l0ZXJhYmxlKGNvbnN0cnVjdG9ycyk6CisgICAgICAgICAgICBjID0gY29ucyhhKQorICAgICAgICAgICAgYy5oZXhkaWdlc3QoKQorCisgICAgZGVmIHRlc3RfYWxnb3JpdGhtc19hdHRyaWJ1dGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaGxpYi5hbGdvcml0aG1zLAorICAgICAgICAgICAgdHVwbGUoW19hbGdvIGZvciBfYWxnbyBpbiBzZWxmLnN1cHBvcnRlZF9oYXNoX25hbWVzIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYWxnby5pc2xvd2VyKCldKSkKKworICAgIGRlZiB0ZXN0X3Vua25vd25faGFzaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaGFzaGxpYi5uZXcsICdzcGFtIHNwYW0gc3BhbSBzcGFtIHNwYW0nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2hsaWIubmV3LCAxKQorCisgICAgZGVmIHRlc3RfZ2V0X2J1aWx0aW5fY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIGdldF9idWlsdGluX2NvbnN0cnVjdG9yID0gaGFzaGxpYi5fX2RpY3RfX1sKKyAgICAgICAgICAgICAgICAnX19nZXRfYnVpbHRpbl9jb25zdHJ1Y3RvciddCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldF9idWlsdGluX2NvbnN0cnVjdG9yLCAndGVzdCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBfbWQ1CisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBUaGlzIGZvcmNlcyBhbiBJbXBvcnRFcnJvciBmb3IgImltcG9ydCBfbWQ1IiBzdGF0ZW1lbnRzCisgICAgICAgIHN5cy5tb2R1bGVzWydfbWQ1J10gPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldF9idWlsdGluX2NvbnN0cnVjdG9yLCAnbWQ1JykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmICdfbWQ1JyBpbiBsb2NhbHMoKToKKyAgICAgICAgICAgICAgICBzeXMubW9kdWxlc1snX21kNSddID0gX21kNQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbJ19tZDUnXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldF9idWlsdGluX2NvbnN0cnVjdG9yLCAzKQorCisgICAgZGVmIHRlc3RfaGV4ZGlnZXN0KHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLnN1cHBvcnRlZF9oYXNoX25hbWVzOgorICAgICAgICAgICAgaCA9IGhhc2hsaWIubmV3KG5hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGV4c3RyKGguZGlnZXN0KCkpID09IGguaGV4ZGlnZXN0KCkpCisKKyAgICBkZWYgdGVzdF9sYXJnZV91cGRhdGUoc2VsZik6CisgICAgICAgIGFhcyA9ICdhJyAqIDEyOAorICAgICAgICBiZWVzID0gJ2InICogMTI3CisgICAgICAgIGNlZXMgPSAnYycgKiAxMjYKKyAgICAgICAgYWJjcyA9IGFhcyArIGJlZXMgKyBjZWVzCisKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5zdXBwb3J0ZWRfaGFzaF9uYW1lczoKKyAgICAgICAgICAgIG0xID0gaGFzaGxpYi5uZXcobmFtZSkKKyAgICAgICAgICAgIG0xLnVwZGF0ZShhYXMpCisgICAgICAgICAgICBtMS51cGRhdGUoYmVlcykKKyAgICAgICAgICAgIG0xLnVwZGF0ZShjZWVzKQorCisgICAgICAgICAgICBtMiA9IGhhc2hsaWIubmV3KG5hbWUpCisgICAgICAgICAgICBtMi51cGRhdGUoYWJjcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEuZGlnZXN0KCksIG0yLmRpZ2VzdCgpLCBuYW1lKycgdXBkYXRlIHByb2JsZW0uJykKKworICAgICAgICAgICAgbTMgPSBoYXNobGliLm5ldyhuYW1lLCBhYmNzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMS5kaWdlc3QoKSwgbTMuZGlnZXN0KCksIG5hbWUrJyBuZXcgcHJvYmxlbS4nKQorCisgICAgZGVmIGNoZWNrKHNlbGYsIG5hbWUsIGRhdGEsIGRpZ2VzdCk6CisgICAgICAgIGNvbnN0cnVjdG9ycyA9IHNlbGYuY29uc3RydWN0b3JzX3RvX3Rlc3RbbmFtZV0KKyAgICAgICAgIyAyIGlzIGZvciBoYXNobGliLm5hbWUoLi4uKSBhbmQgaGFzaGxpYi5uZXcobmFtZSwgLi4uKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChsZW4oY29uc3RydWN0b3JzKSwgMikKKyAgICAgICAgZm9yIGhhc2hfb2JqZWN0X2NvbnN0cnVjdG9yIGluIGNvbnN0cnVjdG9yczoKKyAgICAgICAgICAgIGNvbXB1dGVkID0gaGFzaF9vYmplY3RfY29uc3RydWN0b3IoZGF0YSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkLCBkaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICJIYXNoIGFsZ29yaXRobSAlcyBjb25zdHJ1Y3RlZCB1c2luZyAlcyByZXR1cm5lZCBoZXhkaWdlc3QiCisgICAgICAgICAgICAgICAgICAgICIgJXIgZm9yICVkIGJ5dGUgaW5wdXQgZGF0YSB0aGF0IHNob3VsZCBoYXZlIGhhc2hlZCB0byAlci4iCisgICAgICAgICAgICAgICAgICAgICUgKG5hbWUsIGhhc2hfb2JqZWN0X2NvbnN0cnVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCwgbGVuKGRhdGEpLCBkaWdlc3QpKQorCisgICAgZGVmIGNoZWNrX3VwZGF0ZShzZWxmLCBuYW1lLCBkYXRhLCBkaWdlc3QpOgorICAgICAgICBjb25zdHJ1Y3RvcnMgPSBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0W25hbWVdCisgICAgICAgICMgMiBpcyBmb3IgaGFzaGxpYi5uYW1lKC4uLikgYW5kIGhhc2hsaWIubmV3KG5hbWUsIC4uLikKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobGVuKGNvbnN0cnVjdG9ycyksIDIpCisgICAgICAgIGZvciBoYXNoX29iamVjdF9jb25zdHJ1Y3RvciBpbiBjb25zdHJ1Y3RvcnM6CisgICAgICAgICAgICBoID0gaGFzaF9vYmplY3RfY29uc3RydWN0b3IoKQorICAgICAgICAgICAgaC51cGRhdGUoZGF0YSkKKyAgICAgICAgICAgIGNvbXB1dGVkID0gaC5oZXhkaWdlc3QoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQsIGRpZ2VzdCwKKyAgICAgICAgICAgICAgICAgICAgIkhhc2ggYWxnb3JpdGhtICVzIHVzaW5nICVzIHdoZW4gdXBkYXRlZCByZXR1cm5lZCBoZXhkaWdlc3QiCisgICAgICAgICAgICAgICAgICAgICIgJXIgZm9yICVkIGJ5dGUgaW5wdXQgZGF0YSB0aGF0IHNob3VsZCBoYXZlIGhhc2hlZCB0byAlci4iCisgICAgICAgICAgICAgICAgICAgICUgKG5hbWUsIGhhc2hfb2JqZWN0X2NvbnN0cnVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCwgbGVuKGRhdGEpLCBkaWdlc3QpKQorCisgICAgZGVmIGNoZWNrX3VuaWNvZGUoc2VsZiwgYWxnb3JpdGhtX25hbWUpOgorICAgICAgICAjIFVuaWNvZGUgb2JqZWN0cyBhcmUgbm90IGFsbG93ZWQgYXMgaW5wdXQuCisgICAgICAgIGV4cGVjdGVkID0gaGFzaGxpYi5uZXcoYWxnb3JpdGhtX25hbWUsIHN0cih1J3NwYW0nKSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgc2VsZi5jaGVjayhhbGdvcml0aG1fbmFtZSwgdSdzcGFtJywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOgorICAgICAgICAjIEluIHB5dGhvbiAyLnggdW5pY29kZSBpcyBhdXRvLWVuY29kZWQgdG8gdGhlIHN5c3RlbSBkZWZhdWx0IGVuY29kaW5nCisgICAgICAgICMgd2hlbiBwYXNzZWQgdG8gaGFzaGxpYiBmdW5jdGlvbnMuCisgICAgICAgIHNlbGYuY2hlY2tfdW5pY29kZSgnbWQ1JykKKyAgICAgICAgc2VsZi5jaGVja191bmljb2RlKCdzaGExJykKKyAgICAgICAgc2VsZi5jaGVja191bmljb2RlKCdzaGEyMjQnKQorICAgICAgICBzZWxmLmNoZWNrX3VuaWNvZGUoJ3NoYTI1NicpCisgICAgICAgIHNlbGYuY2hlY2tfdW5pY29kZSgnc2hhMzg0JykKKyAgICAgICAgc2VsZi5jaGVja191bmljb2RlKCdzaGE1MTInKQorCisgICAgZGVmIHRlc3RfY2FzZV9tZDVfMChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnbWQ1JywgJycsICdkNDFkOGNkOThmMDBiMjA0ZTk4MDA5OThlY2Y4NDI3ZScpCisKKyAgICBkZWYgdGVzdF9jYXNlX21kNV8xKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdtZDUnLCAnYWJjJywgJzkwMDE1MDk4M2NkMjRmYjBkNjk2M2Y3ZDI4ZTE3ZjcyJykKKworICAgIGRlZiB0ZXN0X2Nhc2VfbWQ1XzIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ21kNScsICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OScsCisgICAgICAgICAgICAgICAgICAgJ2QxNzRhYjk4ZDI3N2Q5ZjVhNTYxMWMyYzlmNDE5ZDlmJykKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHICsgNSwgbWVtdXNlPTEpCisgICAgZGVmIHRlc3RfY2FzZV9tZDVfaHVnZShzZWxmLCBzaXplKToKKyAgICAgICAgaWYgc2l6ZSA9PSBfNEcgKyA1OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2soJ21kNScsICdBJypzaXplLCAnYzlhZjJkZmYzNzQ2OGNlNWRmZWU4ZjJjZmMwYTljNmQnKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcyAjIDMyLWJpdCBhcmNoCisKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyArIDUsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X2Nhc2VfbWQ1X2h1Z2VfdXBkYXRlKHNlbGYsIHNpemUpOgorICAgICAgICBpZiBzaXplID09IF80RyArIDU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja191cGRhdGUoJ21kNScsICdBJypzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2M5YWYyZGZmMzc0NjhjZTVkZmVlOGYyY2ZjMGE5YzZkJykKKyAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MgIyAzMi1iaXQgYXJjaAorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgLSAxLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9jYXNlX21kNV91aW50bWF4KHNlbGYsIHNpemUpOgorICAgICAgICBpZiBzaXplID09IF80RyAtIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVjaygnbWQ1JywgJ0EnKnNpemUsICcyODEzOGQzMDZmZjFiODI4MWYxYTkwNjdlMWExYTJiMycpCisgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzICMgMzItYml0IGFyY2gKKworICAgICMgdXNlIHRoZSB0aHJlZSBleGFtcGxlcyBmcm9tIEZlZGVyYWwgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyBTdGFuZGFyZHMKKyAgICAjIFB1YmxpY2F0aW9uIDE4MC0xLCBTZWN1cmUgSGFzaCBTdGFuZGFyZCwgIDE5OTUgQXByaWwgMTcKKyAgICAjIGh0dHA6Ly93d3cuaXRsLm5pc3QuZ292L2Rpdjg5Ny9wdWJzL2ZpcDE4MC0xLmh0bQorCisgICAgZGVmIHRlc3RfY2FzZV9zaGExXzAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTEnLCAiIiwKKyAgICAgICAgICAgICAgICAgICAiZGEzOWEzZWU1ZTZiNGIwZDMyNTViZmVmOTU2MDE4OTBhZmQ4MDcwOSIpCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTFfMShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhMScsICJhYmMiLAorICAgICAgICAgICAgICAgICAgICJhOTk5M2UzNjQ3MDY4MTZhYmEzZTI1NzE3ODUwYzI2YzljZDBkODlkIikKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMV8yKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdzaGExJywgImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKKyAgICAgICAgICAgICAgICAgICAiODQ5ODNlNDQxYzNiZDI2ZWJhYWU0YWExZjk1MTI5ZTVlNTQ2NzBmMSIpCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTFfMyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhMScsICJhIiAqIDEwMDAwMDAsCisgICAgICAgICAgICAgICAgICAgIjM0YWE5NzNjZDRjNGRhYTRmNjFlZWIyYmRiYWQyNzMxNjUzNDAxNmYiKQorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgKyA1LCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTFfaHVnZShzZWxmLCBzaXplKToKKyAgICAgICAgaWYgc2l6ZSA9PSBfNEcgKyA1OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2soJ3NoYTEnLCAnQScqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICc4N2Q3NDVjNTBlNmIyODc5ZmZhMGZiMmM5MzBlOWZiZmUwZGM5YTViJykKKyAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MgIyAzMi1iaXQgYXJjaAorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgKyA1LCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTFfaHVnZV91cGRhdGUoc2VsZiwgc2l6ZSk6CisgICAgICAgIGlmIHNpemUgPT0gXzRHICsgNToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3VwZGF0ZSgnc2hhMScsICdBJypzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgJzg3ZDc0NWM1MGU2YjI4NzlmZmEwZmIyYzkzMGU5ZmJmZTBkYzlhNWInKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcyAjIDMyLWJpdCBhcmNoCisKKyAgICAjIHVzZSB0aGUgZXhhbXBsZXMgZnJvbSBGZWRlcmFsIEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgU3RhbmRhcmRzCisgICAgIyBQdWJsaWNhdGlvbiAxODAtMiwgU2VjdXJlIEhhc2ggU3RhbmRhcmQsICAyMDAyIEF1Z3VzdCAxCisgICAgIyBodHRwOi8vY3NyYy5uaXN0Lmdvdi9wdWJsaWNhdGlvbnMvZmlwcy9maXBzMTgwLTIvZmlwczE4MC0yLnBkZgorCisgICAgZGVmIHRlc3RfY2FzZV9zaGEyMjRfMChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhMjI0JywgIiIsCisgICAgICAgICAgImQxNGEwMjhjMmEzYTJiYzk0NzYxMDJiYjI4ODIzNGM0MTVhMmIwMWY4MjhlYTYyYWM1YjNlNDJmIikKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMjI0XzEoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTIyNCcsICJhYmMiLAorICAgICAgICAgICIyMzA5N2QyMjM0MDVkODIyODY0MmE0NzdiZGEyNTViMzJhYWRiY2U0YmRhMGIzZjdlMzZjOWRhNyIpCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTIyNF8yKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdzaGEyMjQnLAorICAgICAgICAgICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCisgICAgICAgICAgIjc1Mzg4YjE2NTEyNzc2Y2M1ZGJhNWRhMWZkODkwMTUwYjBjNjQ1NWNiNGY1OGIxOTUyNTIyNTI1IikKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMjI0XzMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTIyNCcsICJhIiAqIDEwMDAwMDAsCisgICAgICAgICAgIjIwNzk0NjU1OTgwYzkxZDhiYmI0YzFlYTk3NjE4YTRiZjAzZjQyNTgxOTQ4YjJlZTRlZTdhZDY3IikKKworCisgICAgZGVmIHRlc3RfY2FzZV9zaGEyNTZfMChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhMjU2JywgIiIsCisgICAgICAgICAgImUzYjBjNDQyOThmYzFjMTQ5YWZiZjRjODk5NmZiOTI0MjdhZTQxZTQ2NDliOTM0Y2E0OTU5OTFiNzg1MmI4NTUiKQorCisgICAgZGVmIHRlc3RfY2FzZV9zaGEyNTZfMShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhMjU2JywgImFiYyIsCisgICAgICAgICAgImJhNzgxNmJmOGYwMWNmZWE0MTQxNDBkZTVkYWUyMjIzYjAwMzYxYTM5NjE3N2E5Y2I0MTBmZjYxZjIwMDE1YWQiKQorCisgICAgZGVmIHRlc3RfY2FzZV9zaGEyNTZfMihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhMjU2JywKKyAgICAgICAgICAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLAorICAgICAgICAgICIyNDhkNmE2MWQyMDYzOGI4ZTVjMDI2OTMwYzNlNjAzOWEzM2NlNDU5NjRmZjIxNjdmNmVjZWRkNDE5ZGIwNmMxIikKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMjU2XzMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTI1NicsICJhIiAqIDEwMDAwMDAsCisgICAgICAgICAgImNkYzc2ZTVjOTkxNGZiOTI4MWExYzdlMjg0ZDczZTY3ZjE4MDlhNDhhNDk3MjAwZTA0NmQzOWNjYzcxMTJjZDAiKQorCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTM4NF8wKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdzaGEzODQnLCAiIiwKKyAgICAgICAgICAiMzhiMDYwYTc1MWFjOTYzODRjZDkzMjdlYjFiMWUzNmEyMWZkYjcxMTE0YmUwNzQzNGMwY2M3YmY2M2Y2ZTFkYSIrCisgICAgICAgICAgIjI3NGVkZWJmZTc2ZjY1ZmJkNTFhZDJmMTQ4OThiOTViIikKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMzg0XzEoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTM4NCcsICJhYmMiLAorICAgICAgICAgICJjYjAwNzUzZjQ1YTM1ZThiYjVhMDNkNjk5YWM2NTAwNzI3MmMzMmFiMGVkZWQxNjMxYThiNjA1YTQzZmY1YmVkIisKKyAgICAgICAgICAiODA4NjA3MmJhMWU3Y2MyMzU4YmFlY2ExMzRjODI1YTciKQorCisgICAgZGVmIHRlc3RfY2FzZV9zaGEzODRfMihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhMzg0JywKKyAgICAgICAgICAgICAgICAgICAiYWJjZGVmZ2hiY2RlZmdoaWNkZWZnaGlqZGVmZ2hpamtlZmdoaWprbGZnaGlqa2xtZ2hpamtsbW4iKworICAgICAgICAgICAgICAgICAgICJoaWprbG1ub2lqa2xtbm9wamtsbW5vcHFrbG1ub3Bxcmxtbm9wcXJzbW5vcHFyc3Rub3BxcnN0dSIsCisgICAgICAgICAgIjA5MzMwYzMzZjcxMTQ3ZTgzZDE5MmZjNzgyY2QxYjQ3NTMxMTFiMTczYjNiMDVkMjJmYTA4MDg2ZTNiMGY3MTIiKworICAgICAgICAgICJmY2M3YzcxYTU1N2UyZGI5NjZjM2U5ZmE5MTc0NjAzOSIpCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTM4NF8zKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdzaGEzODQnLCAiYSIgKiAxMDAwMDAwLAorICAgICAgICAgICI5ZDBlMTgwOTcxNjQ3NGNiMDg2ZTgzNGUzMTBhNGExY2VkMTQ5ZTljMDBmMjQ4NTI3OTcyY2VjNTcwNGMyYTViIisKKyAgICAgICAgICAiMDdiOGIzZGMzOGVjYzRlYmFlOTdkZGQ4N2YzZDg5ODUiKQorCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTUxMl8wKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdzaGE1MTInLCAiIiwKKyAgICAgICAgICAiY2Y4M2UxMzU3ZWVmYjhiZGYxNTQyODUwZDY2ZDgwMDdkNjIwZTQwNTBiNTcxNWRjODNmNGE5MjFkMzZjZTljZSIrCisgICAgICAgICAgIjQ3ZDBkMTNjNWQ4NWYyYjBmZjgzMThkMjg3N2VlYzJmNjNiOTMxYmQ0NzQxN2E4MWE1MzgzMjdhZjkyN2RhM2UiKQorCisgICAgZGVmIHRlc3RfY2FzZV9zaGE1MTJfMShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhNTEyJywgImFiYyIsCisgICAgICAgICAgImRkYWYzNWExOTM2MTdhYmFjYzQxNzM0OWFlMjA0MTMxMTJlNmZhNGU4OWE5N2VhMjBhOWVlZWU2NGI1NWQzOWEiKworICAgICAgICAgICIyMTkyOTkyYTI3NGZjMWE4MzZiYTNjMjNhM2ZlZWJiZDQ1NGQ0NDIzNjQzY2U4MGUyYTlhYzk0ZmE1NGNhNDlmIikKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhNTEyXzIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTUxMicsCisgICAgICAgICAgICAgICAgICAgImFiY2RlZmdoYmNkZWZnaGljZGVmZ2hpamRlZmdoaWprZWZnaGlqa2xmZ2hpamtsbWdoaWprbG1uIisKKyAgICAgICAgICAgICAgICAgICAiaGlqa2xtbm9pamtsbW5vcGprbG1ub3Bxa2xtbm9wcXJsbW5vcHFyc21ub3BxcnN0bm9wcXJzdHUiLAorICAgICAgICAgICI4ZTk1OWI3NWRhZTMxM2RhOGNmNGY3MjgxNGZjMTQzZjhmNzc3OWM2ZWI5ZjdmYTE3Mjk5YWVhZGI2ODg5MDE4IisKKyAgICAgICAgICAiNTAxZDI4OWU0OTAwZjdlNDMzMWI5OWRlYzRiNTQzM2FjN2QzMjllZWI2ZGQyNjU0NWU5NmU1NWI4NzRiZTkwOSIpCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTUxMl8zKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdzaGE1MTInLCAiYSIgKiAxMDAwMDAwLAorICAgICAgICAgICJlNzE4NDgzZDBjZTc2OTY0NGUyZTQyYzdiYzE1YjQ2MzhlMWY5OGIxM2IyMDQ0Mjg1NjMyYTgwM2FmYTk3M2ViIisKKyAgICAgICAgICAiZGUwZmYyNDQ4NzdlYTYwYTRjYjA0MzJjZTU3N2MzMWJlYjAwOWM1YzJjNDlhYTJlNGVhZGIyMTdhZDhjYzA5YiIpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIEB0ZXN0X3N1cHBvcnQucmVhcF90aHJlYWRzCisgICAgZGVmIHRlc3RfdGhyZWFkZWRfaGFzaGluZyhzZWxmKToKKyAgICAgICAgIyBVcGRhdGluZyB0aGUgc2FtZSBoYXNoIG9iamVjdCBmcm9tIHNldmVyYWwgdGhyZWFkcyBhdCBvbmNlCisgICAgICAgICMgdXNpbmcgZGF0YSBjaHVuayBzaXplcyBjb250YWluaW5nIHRoZSBzYW1lIGJ5dGUgc2VxdWVuY2VzLgorICAgICAgICAjCisgICAgICAgICMgSWYgdGhlIGludGVybmFsIGxvY2tzIGFyZSB3b3JraW5nIHRvIHByZXZlbnQgbXVsdGlwbGUKKyAgICAgICAgIyB1cGRhdGVzIG9uIHRoZSBzYW1lIG9iamVjdCBmcm9tIHJ1bm5pbmcgYXQgb25jZSwgdGhlIHJlc3VsdGluZworICAgICAgICAjIGhhc2ggd2lsbCBiZSB0aGUgc2FtZSBhcyBkb2luZyBpdCBzaW5nbGUgdGhyZWFkZWQgdXBmcm9udC4KKyAgICAgICAgaGFzaGVyID0gaGFzaGxpYi5zaGExKCkKKyAgICAgICAgbnVtX3RocmVhZHMgPSA1CisgICAgICAgIHNtYWxsZXN0X2RhdGEgPSAnc3dpbmVmbHUnCisgICAgICAgIGRhdGEgPSBzbWFsbGVzdF9kYXRhKjIwMDAwMAorICAgICAgICBleHBlY3RlZF9oYXNoID0gaGFzaGxpYi5zaGExKGRhdGEqbnVtX3RocmVhZHMpLmhleGRpZ2VzdCgpCisKKyAgICAgICAgZGVmIGhhc2hfaW5fY2h1bmtzKGNodW5rX3NpemUsIGV2ZW50KToKKyAgICAgICAgICAgIGluZGV4ID0gMAorICAgICAgICAgICAgd2hpbGUgaW5kZXggPCBsZW4oZGF0YSk6CisgICAgICAgICAgICAgICAgaGFzaGVyLnVwZGF0ZShkYXRhW2luZGV4OmluZGV4K2NodW5rX3NpemVdKQorICAgICAgICAgICAgICAgIGluZGV4ICs9IGNodW5rX3NpemUKKyAgICAgICAgICAgIGV2ZW50LnNldCgpCisKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgZm9yIHRocmVhZG51bSBpbiB4cmFuZ2UobnVtX3RocmVhZHMpOgorICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IGxlbihkYXRhKSAvLyAoMTAqKnRocmVhZG51bSkKKyAgICAgICAgICAgIGFzc2VydCBjaHVua19zaXplID4gMAorICAgICAgICAgICAgYXNzZXJ0IGNodW5rX3NpemUgJSBsZW4oc21hbGxlc3RfZGF0YSkgPT0gMAorICAgICAgICAgICAgZXZlbnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICAgICAgZXZlbnRzLmFwcGVuZChldmVudCkKKyAgICAgICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWhhc2hfaW5fY2h1bmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShjaHVua19zaXplLCBldmVudCkpLnN0YXJ0KCkKKworICAgICAgICBmb3IgZXZlbnQgaW4gZXZlbnRzOgorICAgICAgICAgICAgZXZlbnQud2FpdCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9oYXNoLCBoYXNoZXIuaGV4ZGlnZXN0KCkpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEhhc2hMaWJUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oYXNobGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDg4ZmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oYXNobGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTIwZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGVhcHEucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oZWFwcS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I4OGYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGVhcHEucHkKQEAgLTAsMCArMSw0MTkgQEAKKyIiIlVuaXR0ZXN0cyBmb3IgaGVhcHEuIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCByYW5kb20KKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlLCBza2lwVW5sZXNzCisKK3B5X2hlYXBxID0gdGVzdF9zdXBwb3J0LmltcG9ydF9mcmVzaF9tb2R1bGUoJ2hlYXBxJywgYmxvY2tlZD1bJ19oZWFwcSddKQorY19oZWFwcSA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfZnJlc2hfbW9kdWxlKCdoZWFwcScsIGZyZXNoPVsnX2hlYXBxJ10pCisKKyMgX2hlYXBxLm5sYXJnZXN0L25zbWFsbGVzdCBhcmUgc2F2ZWQgaW4gaGVhcHEuX25sYXJnZXN0L19zbWFsbGVzdCB3aGVuCisjIF9oZWFwcSBpcyBpbXBvcnRlZCwgc28gY2hlY2sgdGhlbSB0aGVyZQorZnVuY19uYW1lcyA9IFsnaGVhcGlmeScsICdoZWFwcG9wJywgJ2hlYXBwdXNoJywgJ2hlYXBwdXNocG9wJywKKyAgICAgICAgICAgICAgJ2hlYXByZXBsYWNlJywgJ19ubGFyZ2VzdCcsICdfbnNtYWxsZXN0J10KKworY2xhc3MgVGVzdE1vZHVsZXMoVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3B5X2Z1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgZm9yIGZuYW1lIGluIGZ1bmNfbmFtZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIocHlfaGVhcHEsIGZuYW1lKS5fX21vZHVsZV9fLCAnaGVhcHEnKQorCisgICAgQHNraXBVbmxlc3MoY19oZWFwcSwgJ3JlcXVpcmVzIF9oZWFwcScpCisgICAgZGVmIHRlc3RfY19mdW5jdGlvbnMoc2VsZik6CisgICAgICAgIGZvciBmbmFtZSBpbiBmdW5jX25hbWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKGNfaGVhcHEsIGZuYW1lKS5fX21vZHVsZV9fLCAnX2hlYXBxJykKKworCitjbGFzcyBUZXN0SGVhcChUZXN0Q2FzZSk6CisgICAgbW9kdWxlID0gTm9uZQorCisgICAgZGVmIHRlc3RfcHVzaF9wb3Aoc2VsZik6CisgICAgICAgICMgMSkgUHVzaCAyNTYgcmFuZG9tIG51bWJlcnMgYW5kIHBvcCB0aGVtIG9mZiwgdmVyaWZ5aW5nIGFsbCdzIE9LLgorICAgICAgICBoZWFwID0gW10KKyAgICAgICAgZGF0YSA9IFtdCisgICAgICAgIHNlbGYuY2hlY2tfaW52YXJpYW50KGhlYXApCisgICAgICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBpdGVtID0gcmFuZG9tLnJhbmRvbSgpCisgICAgICAgICAgICBkYXRhLmFwcGVuZChpdGVtKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUuaGVhcHB1c2goaGVhcCwgaXRlbSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfaW52YXJpYW50KGhlYXApCisgICAgICAgIHJlc3VsdHMgPSBbXQorICAgICAgICB3aGlsZSBoZWFwOgorICAgICAgICAgICAgaXRlbSA9IHNlbGYubW9kdWxlLmhlYXBwb3AoaGVhcCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfaW52YXJpYW50KGhlYXApCisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChpdGVtKQorICAgICAgICBkYXRhX3NvcnRlZCA9IGRhdGFbOl0KKyAgICAgICAgZGF0YV9zb3J0ZWQuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YV9zb3J0ZWQsIHJlc3VsdHMpCisgICAgICAgICMgMikgQ2hlY2sgdGhhdCB0aGUgaW52YXJpYW50IGhvbGRzIGZvciBhIHNvcnRlZCBhcnJheQorICAgICAgICBzZWxmLmNoZWNrX2ludmFyaWFudChyZXN1bHRzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tb2R1bGUuaGVhcHB1c2gsIFtdKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubW9kdWxlLmhlYXBwdXNoLCBOb25lLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1vZHVsZS5oZWFwcG9wLCBOb25lKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgY2hlY2tfaW52YXJpYW50KHNlbGYsIGhlYXApOgorICAgICAgICAjIENoZWNrIHRoZSBoZWFwIGludmFyaWFudC4KKyAgICAgICAgZm9yIHBvcywgaXRlbSBpbiBlbnVtZXJhdGUoaGVhcCk6CisgICAgICAgICAgICBpZiBwb3M6ICMgcG9zIDAgaGFzIG5vIHBhcmVudAorICAgICAgICAgICAgICAgIHBhcmVudHBvcyA9IChwb3MtMSkgPj4gMQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoZWFwW3BhcmVudHBvc10gPD0gaXRlbSkKKworICAgIGRlZiB0ZXN0X2hlYXBpZnkoc2VsZik6CisgICAgICAgIGZvciBzaXplIGluIHJhbmdlKDMwKToKKyAgICAgICAgICAgIGhlYXAgPSBbcmFuZG9tLnJhbmRvbSgpIGZvciBkdW1teSBpbiByYW5nZShzaXplKV0KKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmhlYXBpZnkoaGVhcCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfaW52YXJpYW50KGhlYXApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1vZHVsZS5oZWFwaWZ5LCBOb25lKQorCisgICAgZGVmIHRlc3RfbmFpdmVfbmJlc3Qoc2VsZik6CisgICAgICAgIGRhdGEgPSBbcmFuZG9tLnJhbmRyYW5nZSgyMDAwKSBmb3IgaSBpbiByYW5nZSgxMDAwKV0KKyAgICAgICAgaGVhcCA9IFtdCisgICAgICAgIGZvciBpdGVtIGluIGRhdGE6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5oZWFwcHVzaChoZWFwLCBpdGVtKQorICAgICAgICAgICAgaWYgbGVuKGhlYXApID4gMTA6CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuaGVhcHBvcChoZWFwKQorICAgICAgICBoZWFwLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYXAsIHNvcnRlZChkYXRhKVstMTA6XSkKKworICAgIGRlZiBoZWFwaXRlcihzZWxmLCBoZWFwKToKKyAgICAgICAgIyBBbiBpdGVyYXRvciByZXR1cm5pbmcgYSBoZWFwJ3MgZWxlbWVudHMsIHNtYWxsZXN0LWZpcnN0LgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHlpZWxkIHNlbGYubW9kdWxlLmhlYXBwb3AoaGVhcCkKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9uYmVzdChzZWxmKToKKyAgICAgICAgIyBMZXNzLW5haXZlICJOLWJlc3QiIGFsZ29yaXRobSwgbXVjaCBmYXN0ZXIgKGlmIGxlbihkYXRhKSBpcyBiaWcKKyAgICAgICAgIyBlbm91Z2ggPHdpbms+KSB0aGFuIHNvcnRpbmcgYWxsIG9mIGRhdGEuICBIb3dldmVyLCBpZiB3ZSBoYWQgYSBtYXgKKyAgICAgICAgIyBoZWFwIGluc3RlYWQgb2YgYSBtaW4gaGVhcCwgaXQgY291bGQgZ28gZmFzdGVyIHN0aWxsIHZpYQorICAgICAgICAjIGhlYXBpZnknaW5nIGFsbCBvZiBkYXRhIChsaW5lYXIgdGltZSksIHRoZW4gZG9pbmcgMTAgaGVhcHBvcHMKKyAgICAgICAgIyAoMTAgbG9nLXRpbWUgc3RlcHMpLgorICAgICAgICBkYXRhID0gW3JhbmRvbS5yYW5kcmFuZ2UoMjAwMCkgZm9yIGkgaW4gcmFuZ2UoMTAwMCldCisgICAgICAgIGhlYXAgPSBkYXRhWzoxMF0KKyAgICAgICAgc2VsZi5tb2R1bGUuaGVhcGlmeShoZWFwKQorICAgICAgICBmb3IgaXRlbSBpbiBkYXRhWzEwOl06CisgICAgICAgICAgICBpZiBpdGVtID4gaGVhcFswXTogICMgdGhpcyBnZXRzIHJhcmVyIHRoZSBsb25nZXIgd2UgcnVuCisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHNlbGYuaGVhcGl0ZXIoaGVhcCkpLCBzb3J0ZWQoZGF0YSlbLTEwOl0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1vZHVsZS5oZWFwcmVwbGFjZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1vZHVsZS5oZWFwcmVwbGFjZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgc2VsZi5tb2R1bGUuaGVhcHJlcGxhY2UsIFtdLCBOb25lKQorCisgICAgZGVmIHRlc3RfbmJlc3Rfd2l0aF9wdXNocG9wKHNlbGYpOgorICAgICAgICBkYXRhID0gW3JhbmRvbS5yYW5kcmFuZ2UoMjAwMCkgZm9yIGkgaW4gcmFuZ2UoMTAwMCldCisgICAgICAgIGhlYXAgPSBkYXRhWzoxMF0KKyAgICAgICAgc2VsZi5tb2R1bGUuaGVhcGlmeShoZWFwKQorICAgICAgICBmb3IgaXRlbSBpbiBkYXRhWzEwOl06CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5oZWFwcHVzaHBvcChoZWFwLCBpdGVtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc2VsZi5oZWFwaXRlcihoZWFwKSksIHNvcnRlZChkYXRhKVstMTA6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1vZHVsZS5oZWFwcHVzaHBvcChbXSwgJ3gnKSwgJ3gnKQorCisgICAgZGVmIHRlc3RfaGVhcHB1c2hwb3Aoc2VsZik6CisgICAgICAgIGggPSBbXQorICAgICAgICB4ID0gc2VsZi5tb2R1bGUuaGVhcHB1c2hwb3AoaCwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGgsIHgpLCAoW10sIDEwKSkKKworICAgICAgICBoID0gWzEwXQorICAgICAgICB4ID0gc2VsZi5tb2R1bGUuaGVhcHB1c2hwb3AoaCwgMTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaCwgeCksIChbMTBdLCAxMC4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGhbMF0pLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh4KSwgZmxvYXQpCisKKyAgICAgICAgaCA9IFsxMF07CisgICAgICAgIHggPSBzZWxmLm1vZHVsZS5oZWFwcHVzaHBvcChoLCA5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChoLCB4KSwgKFsxMF0sIDkpKQorCisgICAgICAgIGggPSBbMTBdOworICAgICAgICB4ID0gc2VsZi5tb2R1bGUuaGVhcHB1c2hwb3AoaCwgMTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGgsIHgpLCAoWzExXSwgMTApKQorCisgICAgZGVmIHRlc3RfaGVhcHNvcnQoc2VsZik6CisgICAgICAgICMgRXhlcmNpc2UgZXZlcnl0aGluZyB3aXRoIHJlcGVhdGVkIGhlYXBzb3J0IGNoZWNrcworICAgICAgICBmb3IgdHJpYWwgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBzaXplID0gcmFuZG9tLnJhbmRyYW5nZSg1MCkKKyAgICAgICAgICAgIGRhdGEgPSBbcmFuZG9tLnJhbmRyYW5nZSgyNSkgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSldCisgICAgICAgICAgICBpZiB0cmlhbCAmIDE6ICAgICAjIEhhbGYgb2YgdGhlIHRpbWUsIHVzZSBoZWFwaWZ5CisgICAgICAgICAgICAgICAgaGVhcCA9IGRhdGFbOl0KKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5oZWFwaWZ5KGhlYXApCisgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAjIFRoZSByZXN0IG9mIHRoZSB0aW1lLCB1c2UgaGVhcHB1c2gKKyAgICAgICAgICAgICAgICBoZWFwID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBkYXRhOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5oZWFwcHVzaChoZWFwLCBpdGVtKQorICAgICAgICAgICAgaGVhcF9zb3J0ZWQgPSBbc2VsZi5tb2R1bGUuaGVhcHBvcChoZWFwKSBmb3IgaSBpbiByYW5nZShzaXplKV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGVhcF9zb3J0ZWQsIHNvcnRlZChkYXRhKSkKKworICAgIGRlZiB0ZXN0X21lcmdlKHNlbGYpOgorICAgICAgICBpbnB1dHMgPSBbXQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UocmFuZG9tLnJhbmRyYW5nZSg1KSk6CisgICAgICAgICAgICByb3cgPSBzb3J0ZWQocmFuZG9tLnJhbmRyYW5nZSgxMDAwKSBmb3IgaiBpbiByYW5nZShyYW5kb20ucmFuZHJhbmdlKDEwKSkpCisgICAgICAgICAgICBpbnB1dHMuYXBwZW5kKHJvdykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoY2hhaW4oKmlucHV0cykpLCBsaXN0KHNlbGYubW9kdWxlLm1lcmdlKCppbnB1dHMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHNlbGYubW9kdWxlLm1lcmdlKCkpLCBbXSkKKworICAgIGRlZiB0ZXN0X21lcmdlX3N0YWJpbGl0eShzZWxmKToKKyAgICAgICAgY2xhc3MgSW50KGludCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlucHV0cyA9IFtbXSwgW10sIFtdLCBbXV0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjAwMDApOgorICAgICAgICAgICAgc3RyZWFtID0gcmFuZG9tLnJhbmRyYW5nZSg0KQorICAgICAgICAgICAgeCA9IHJhbmRvbS5yYW5kcmFuZ2UoNTAwKQorICAgICAgICAgICAgb2JqID0gSW50KHgpCisgICAgICAgICAgICBvYmoucGFpciA9ICh4LCBzdHJlYW0pCisgICAgICAgICAgICBpbnB1dHNbc3RyZWFtXS5hcHBlbmQob2JqKQorICAgICAgICBmb3Igc3RyZWFtIGluIGlucHV0czoKKyAgICAgICAgICAgIHN0cmVhbS5zb3J0KCkKKyAgICAgICAgcmVzdWx0ID0gW2kucGFpciBmb3IgaSBpbiBzZWxmLm1vZHVsZS5tZXJnZSgqaW5wdXRzKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNvcnRlZChyZXN1bHQpKQorCisgICAgZGVmIHRlc3RfbnNtYWxsZXN0KHNlbGYpOgorICAgICAgICBkYXRhID0gWyhyYW5kb20ucmFuZHJhbmdlKDIwMDApLCBpKSBmb3IgaSBpbiByYW5nZSgxMDAwKV0KKyAgICAgICAgZm9yIGYgaW4gKE5vbmUsIGxhbWJkYSB4OiAgeFswXSAqIDU0NyAlIDIwMDApOgorICAgICAgICAgICAgZm9yIG4gaW4gKDAsIDEsIDIsIDEwLCAxMDAsIDQwMCwgOTk5LCAxMDAwLCAxMTAwKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubW9kdWxlLm5zbWFsbGVzdChuLCBkYXRhKSwgc29ydGVkKGRhdGEpWzpuXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubW9kdWxlLm5zbWFsbGVzdChuLCBkYXRhLCBrZXk9ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWQoZGF0YSwga2V5PWYpWzpuXSkKKworICAgIGRlZiB0ZXN0X25sYXJnZXN0KHNlbGYpOgorICAgICAgICBkYXRhID0gWyhyYW5kb20ucmFuZHJhbmdlKDIwMDApLCBpKSBmb3IgaSBpbiByYW5nZSgxMDAwKV0KKyAgICAgICAgZm9yIGYgaW4gKE5vbmUsIGxhbWJkYSB4OiAgeFswXSAqIDU0NyAlIDIwMDApOgorICAgICAgICAgICAgZm9yIG4gaW4gKDAsIDEsIDIsIDEwLCAxMDAsIDQwMCwgOTk5LCAxMDAwLCAxMTAwKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubW9kdWxlLm5sYXJnZXN0KG4sIGRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkKGRhdGEsIHJldmVyc2U9VHJ1ZSlbOm5dKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5tb2R1bGUubmxhcmdlc3QobiwgZGF0YSwga2V5PWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkKGRhdGEsIGtleT1mLCByZXZlcnNlPVRydWUpWzpuXSkKKworICAgIGRlZiB0ZXN0X2NvbXBhcmlzb25fb3BlcmF0b3Ioc2VsZik6CisgICAgICAgICMgSXNzdWUgMzA1MTogTWFrZSBzdXJlIGhlYXBxIHdvcmtzIHdpdGggYm90aCBfX2x0X18gYW5kIF9fbGVfXworICAgICAgICBkZWYgaHNvcnQoZGF0YSwgY29tcCk6CisgICAgICAgICAgICBkYXRhID0gbWFwKGNvbXAsIGRhdGEpCisgICAgICAgICAgICBzZWxmLm1vZHVsZS5oZWFwaWZ5KGRhdGEpCisgICAgICAgICAgICByZXR1cm4gW3NlbGYubW9kdWxlLmhlYXBwb3AoZGF0YSkueCBmb3IgaSBpbiByYW5nZShsZW4oZGF0YSkpXQorICAgICAgICBjbGFzcyBMVDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi54ID4gb3RoZXIueAorICAgICAgICBjbGFzcyBMRToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi54ID49IG90aGVyLngKKyAgICAgICAgZGF0YSA9IFtyYW5kb20ucmFuZG9tKCkgZm9yIGkgaW4gcmFuZ2UoMTAwKV0KKyAgICAgICAgdGFyZ2V0ID0gc29ydGVkKGRhdGEsIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoc29ydChkYXRhLCBMVCksIHRhcmdldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoc29ydChkYXRhLCBMRSksIHRhcmdldCkKKworCitjbGFzcyBUZXN0SGVhcFB5dGhvbihUZXN0SGVhcCk6CisgICAgbW9kdWxlID0gcHlfaGVhcHEKKworCitAc2tpcFVubGVzcyhjX2hlYXBxLCAncmVxdWlyZXMgX2hlYXBxJykKK2NsYXNzIFRlc3RIZWFwQyhUZXN0SGVhcCk6CisgICAgbW9kdWxlID0gY19oZWFwcQorCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgTGVuT25seToKKyAgICAiRHVtbXkgc2VxdWVuY2UgY2xhc3MgZGVmaW5pbmcgX19sZW5fXyBidXQgbm90IF9fZ2V0aXRlbV9fLiIKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDEwCisKK2NsYXNzIEdldE9ubHk6CisgICAgIkR1bW15IHNlcXVlbmNlIGNsYXNzIGRlZmluaW5nIF9fZ2V0aXRlbV9fIGJ1dCBub3QgX19sZW5fXy4iCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5keCk6CisgICAgICAgIHJldHVybiAxMAorCitjbGFzcyBDbXBFcnI6CisgICAgIkR1bW15IGVsZW1lbnQgdGhhdCBhbHdheXMgcmFpc2VzIGFuIGVycm9yIGR1cmluZyBjb21wYXJpc29uIgorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IKKworZGVmIFIoc2Vxbik6CisgICAgJ1JlZ3VsYXIgZ2VuZXJhdG9yJworICAgIGZvciBpIGluIHNlcW46CisgICAgICAgIHlpZWxkIGkKKworY2xhc3MgRzoKKyAgICAnU2VxdWVuY2UgdXNpbmcgX19nZXRpdGVtX18nCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5zZXFuW2ldCisKK2NsYXNzIEk6CisgICAgJ1NlcXVlbmNlIHVzaW5nIGl0ZXJhdG9yIHByb3RvY29sJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmkgPj0gbGVuKHNlbGYuc2Vxbik6IHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgdiA9IHNlbGYuc2VxbltzZWxmLmldCisgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgIHJldHVybiB2CisKK2NsYXNzIElnOgorICAgICdTZXF1ZW5jZSB1c2luZyBpdGVyYXRvciBwcm90b2NvbCBkZWZpbmVkIHdpdGggYSBnZW5lcmF0b3InCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIGZvciB2YWwgaW4gc2VsZi5zZXFuOgorICAgICAgICAgICAgeWllbGQgdmFsCisKK2NsYXNzIFg6CisgICAgJ01pc3NpbmcgX19nZXRpdGVtX18gYW5kIF9faXRlcl9fJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaSA+PSBsZW4oc2VsZi5zZXFuKTogcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICB2ID0gc2VsZi5zZXFuW3NlbGYuaV0KKyAgICAgICAgc2VsZi5pICs9IDEKKyAgICAgICAgcmV0dXJuIHYKKworY2xhc3MgTjoKKyAgICAnSXRlcmF0b3IgbWlzc2luZyBuZXh0KCknCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKK2NsYXNzIEU6CisgICAgJ1Rlc3QgcHJvcGFnYXRpb24gb2YgZXhjZXB0aW9ucycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgMyAvLyAwCisKK2NsYXNzIFM6CisgICAgJ1Rlc3QgaW1tZWRpYXRlIHN0b3AnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBwYXNzCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbiwgaW1hcAorZGVmIEwoc2Vxbik6CisgICAgJ1Rlc3QgbXVsdGlwbGUgdGllcnMgb2YgaXRlcmF0b3JzJworICAgIHJldHVybiBjaGFpbihpbWFwKGxhbWJkYSB4OngsIFIoSWcoRyhzZXFuKSkpKSkKKworY2xhc3MgU2lkZUVmZmVjdExUOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgaGVhcCk6CisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBzZWxmLmhlYXAgPSBoZWFwCisKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgc2VsZi5oZWFwWzpdID0gW10KKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPCBvdGhlci52YWx1ZQorCisKK2NsYXNzIFRlc3RFcnJvckhhbmRsaW5nKFRlc3RDYXNlKToKKyAgICBtb2R1bGUgPSBOb25lCisKKyAgICBkZWYgdGVzdF9ub25fc2VxdWVuY2Uoc2VsZik6CisgICAgICAgIGZvciBmIGluIChzZWxmLm1vZHVsZS5oZWFwaWZ5LCBzZWxmLm1vZHVsZS5oZWFwcG9wKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgZiwgMTApCisgICAgICAgIGZvciBmIGluIChzZWxmLm1vZHVsZS5oZWFwcHVzaCwgc2VsZi5tb2R1bGUuaGVhcHJlcGxhY2UsCisgICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5ubGFyZ2VzdCwgc2VsZi5tb2R1bGUubnNtYWxsZXN0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgZiwgMTAsIDEwKQorCisgICAgZGVmIHRlc3RfbGVuX29ubHkoc2VsZik6CisgICAgICAgIGZvciBmIGluIChzZWxmLm1vZHVsZS5oZWFwaWZ5LCBzZWxmLm1vZHVsZS5oZWFwcG9wKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgZiwgTGVuT25seSgpKQorICAgICAgICBmb3IgZiBpbiAoc2VsZi5tb2R1bGUuaGVhcHB1c2gsIHNlbGYubW9kdWxlLmhlYXByZXBsYWNlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgZiwgTGVuT25seSgpLCAxMCkKKyAgICAgICAgZm9yIGYgaW4gKHNlbGYubW9kdWxlLm5sYXJnZXN0LCBzZWxmLm1vZHVsZS5uc21hbGxlc3QpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCAyLCBMZW5Pbmx5KCkpCisKKyAgICBkZWYgdGVzdF9nZXRfb25seShzZWxmKToKKyAgICAgICAgc2VxID0gW0NtcEVycigpLCBDbXBFcnIoKSwgQ21wRXJyKCldCisgICAgICAgIGZvciBmIGluIChzZWxmLm1vZHVsZS5oZWFwaWZ5LCBzZWxmLm1vZHVsZS5oZWFwcG9wKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBmLCBzZXEpCisgICAgICAgIGZvciBmIGluIChzZWxmLm1vZHVsZS5oZWFwcHVzaCwgc2VsZi5tb2R1bGUuaGVhcHJlcGxhY2UpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGYsIHNlcSwgMTApCisgICAgICAgIGZvciBmIGluIChzZWxmLm1vZHVsZS5ubGFyZ2VzdCwgc2VsZi5tb2R1bGUubnNtYWxsZXN0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBmLCAyLCBzZXEpCisKKyAgICBkZWYgdGVzdF9hcmdfcGFyc2luZyhzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKHNlbGYubW9kdWxlLmhlYXBpZnksIHNlbGYubW9kdWxlLmhlYXBwb3AsCisgICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5oZWFwcHVzaCwgc2VsZi5tb2R1bGUuaGVhcHJlcGxhY2UsCisgICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5ubGFyZ2VzdCwgc2VsZi5tb2R1bGUubnNtYWxsZXN0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgZiwgMTApCisKKyAgICBkZWYgdGVzdF9pdGVyYWJsZV9hcmdzKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoc2VsZi5tb2R1bGUubmxhcmdlc3QsIHNlbGYubW9kdWxlLm5zbWFsbGVzdCk6CisgICAgICAgICAgICBmb3IgcyBpbiAoIjEyMyIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSkpOgorICAgICAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgTCwgUik6CisgICAgICAgICAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjb21wYXJpbmcgdW5lcXVhbCB0eXBlcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSwgcXVpZXQ9VHJ1ZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoMiwgZyhzKSksIGYoMixzKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoMiwgUyhzKSksIFtdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgMiwgWChzKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIDIsIE4ocykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGYsIDIsIEUocykpCisKKyAgICAjIElzc3VlICMxNzI3ODogdGhlIGhlYXAgbWF5IGNoYW5nZSBzaXplIHdoaWxlIGl0J3MgYmVpbmcgd2Fsa2VkLgorCisgICAgZGVmIHRlc3RfaGVhcHB1c2hfbXV0YXRpbmdfaGVhcChzZWxmKToKKyAgICAgICAgaGVhcCA9IFtdCisgICAgICAgIGhlYXAuZXh0ZW5kKFNpZGVFZmZlY3RMVChpLCBoZWFwKSBmb3IgaSBpbiByYW5nZSgyMDApKQorICAgICAgICAjIFB5dGhvbiB2ZXJzaW9uIHJhaXNlcyBJbmRleEVycm9yLCBDIHZlcnNpb24gUnVudGltZUVycm9yCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoKEluZGV4RXJyb3IsIFJ1bnRpbWVFcnJvcikpOgorICAgICAgICAgICAgc2VsZi5tb2R1bGUuaGVhcHB1c2goaGVhcCwgU2lkZUVmZmVjdExUKDUsIGhlYXApKQorCisgICAgZGVmIHRlc3RfaGVhcHBvcF9tdXRhdGluZ19oZWFwKHNlbGYpOgorICAgICAgICBoZWFwID0gW10KKyAgICAgICAgaGVhcC5leHRlbmQoU2lkZUVmZmVjdExUKGksIGhlYXApIGZvciBpIGluIHJhbmdlKDIwMCkpCisgICAgICAgICMgUHl0aG9uIHZlcnNpb24gcmFpc2VzIEluZGV4RXJyb3IsIEMgdmVyc2lvbiBSdW50aW1lRXJyb3IKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcygoSW5kZXhFcnJvciwgUnVudGltZUVycm9yKSk6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5oZWFwcG9wKGhlYXApCisKKworY2xhc3MgVGVzdEVycm9ySGFuZGxpbmdQeXRob24oVGVzdEVycm9ySGFuZGxpbmcpOgorICAgIG1vZHVsZSA9IHB5X2hlYXBxCisKKworQHNraXBVbmxlc3MoY19oZWFwcSwgJ3JlcXVpcmVzIF9oZWFwcScpCitjbGFzcyBUZXN0RXJyb3JIYW5kbGluZ0MoVGVzdEVycm9ySGFuZGxpbmcpOgorICAgIG1vZHVsZSA9IGNfaGVhcHEKKworCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3RfY2xhc3NlcyA9IFtUZXN0TW9kdWxlcywgVGVzdEhlYXBQeXRob24sIFRlc3RIZWFwQywKKyAgICAgICAgICAgICAgICAgICAgVGVzdEVycm9ySGFuZGxpbmdQeXRob24sIFRlc3RFcnJvckhhbmRsaW5nQ10KKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisKKyAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgaW1wb3J0IGdjCisgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBwcmludCBjb3VudHMKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGVhcHEucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGVhcHEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNDBmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oZWFwcS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGVhcHEucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGVhcHEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNDBmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oZWFwcS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaG1hYy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2htYWMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QxNDhlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2htYWMucHkKQEAgLTAsMCArMSwzMTQgQEAKK2ltcG9ydCBobWFjCitpbXBvcnQgaGFzaGxpYgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIFRlc3RWZWN0b3JzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbWQ1X3ZlY3RvcnMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGUgSE1BQyBtb2R1bGUgYWdhaW5zdCB0ZXN0IHZlY3RvcnMgZnJvbSB0aGUgUkZDLgorCisgICAgICAgIGRlZiBtZDV0ZXN0KGtleSwgZGF0YSwgZGlnZXN0KToKKyAgICAgICAgICAgIGggPSBobWFjLkhNQUMoa2V5LCBkYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmhleGRpZ2VzdCgpLnVwcGVyKCksIGRpZ2VzdC51cHBlcigpKQorCisgICAgICAgIG1kNXRlc3QoY2hyKDB4MGIpICogMTYsCisgICAgICAgICAgICAgICAgIkhpIFRoZXJlIiwKKyAgICAgICAgICAgICAgICAiOTI5NDcyN0EzNjM4QkIxQzEzRjQ4RUY4MTU4QkZDOUQiKQorCisgICAgICAgIG1kNXRlc3QoIkplZmUiLAorICAgICAgICAgICAgICAgICJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IiwKKyAgICAgICAgICAgICAgICAiNzUwYzc4M2U2YWIwYjUwM2VhYTg2ZTMxMGE1ZGI3MzgiKQorCisgICAgICAgIG1kNXRlc3QoY2hyKDB4QUEpKjE2LAorICAgICAgICAgICAgICAgIGNocigweEREKSo1MCwKKyAgICAgICAgICAgICAgICAiNTZiZTM0NTIxZDE0NGM4OGRiYjhjNzMzZjBlOGIzZjYiKQorCisgICAgICAgIG1kNXRlc3QoIiIuam9pbihbY2hyKGkpIGZvciBpIGluIHJhbmdlKDEsIDI2KV0pLAorICAgICAgICAgICAgICAgIGNocigweENEKSAqIDUwLAorICAgICAgICAgICAgICAgICI2OTdlYWYwYWNhM2EzYWVhM2E3NTE2NDc0NmZmYWE3OSIpCisKKyAgICAgICAgbWQ1dGVzdChjaHIoMHgwQykgKiAxNiwKKyAgICAgICAgICAgICAgICAiVGVzdCBXaXRoIFRydW5jYXRpb24iLAorICAgICAgICAgICAgICAgICI1NjQ2MWVmMjM0MmVkYzAwZjliYWI5OTU2OTBlZmQ0YyIpCisKKyAgICAgICAgbWQ1dGVzdChjaHIoMHhBQSkgKiA4MCwKKyAgICAgICAgICAgICAgICAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKKyAgICAgICAgICAgICAgICAiNmIxYWI3ZmU0YmQ3YmY4ZjBiNjJlNmNlNjFiOWQwY2QiKQorCisgICAgICAgIG1kNXRlc3QoY2hyKDB4QUEpICogODAsCisgICAgICAgICAgICAgICAgKCJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5ICIKKyAgICAgICAgICAgICAgICAgImFuZCBMYXJnZXIgVGhhbiBPbmUgQmxvY2stU2l6ZSBEYXRhIiksCisgICAgICAgICAgICAgICAgIjZmNjMwZmFkNjdjZGEwZWUxZmIxZjU2MmRiM2FhNTNlIikKKworICAgIGRlZiB0ZXN0X3NoYV92ZWN0b3JzKHNlbGYpOgorICAgICAgICBkZWYgc2hhdGVzdChrZXksIGRhdGEsIGRpZ2VzdCk6CisgICAgICAgICAgICBoID0gaG1hYy5ITUFDKGtleSwgZGF0YSwgZGlnZXN0bW9kPWhhc2hsaWIuc2hhMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5oZXhkaWdlc3QoKS51cHBlcigpLCBkaWdlc3QudXBwZXIoKSkKKworICAgICAgICBzaGF0ZXN0KGNocigweDBiKSAqIDIwLAorICAgICAgICAgICAgICAgICJIaSBUaGVyZSIsCisgICAgICAgICAgICAgICAgImI2MTczMTg2NTUwNTcyNjRlMjhiYzBiNmZiMzc4YzhlZjE0NmJlMDAiKQorCisgICAgICAgIHNoYXRlc3QoIkplZmUiLAorICAgICAgICAgICAgICAgICJ3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/IiwKKyAgICAgICAgICAgICAgICAiZWZmY2RmNmFlNWViMmZhMmQyNzQxNmQ1ZjE4NGRmOWMyNTlhN2M3OSIpCisKKyAgICAgICAgc2hhdGVzdChjaHIoMHhBQSkqMjAsCisgICAgICAgICAgICAgICAgY2hyKDB4REQpKjUwLAorICAgICAgICAgICAgICAgICIxMjVkNzM0MmI5YWMxMWNkOTFhMzlhZjQ4YWExN2I0ZjYzZjE3NWQzIikKKworICAgICAgICBzaGF0ZXN0KCIiLmpvaW4oW2NocihpKSBmb3IgaSBpbiByYW5nZSgxLCAyNildKSwKKyAgICAgICAgICAgICAgICBjaHIoMHhDRCkgKiA1MCwKKyAgICAgICAgICAgICAgICAiNGM5MDA3ZjQwMjYyNTBjNmJjODQxNGY5YmY1MGM4NmMyZDcyMzVkYSIpCisKKyAgICAgICAgc2hhdGVzdChjaHIoMHgwQykgKiAyMCwKKyAgICAgICAgICAgICAgICAiVGVzdCBXaXRoIFRydW5jYXRpb24iLAorICAgICAgICAgICAgICAgICI0YzFhMDM0MjRiNTVlMDdmZTdmMjdiZTFkNThiYjkzMjRhOWE1YTA0IikKKworICAgICAgICBzaGF0ZXN0KGNocigweEFBKSAqIDgwLAorICAgICAgICAgICAgICAgICJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IC0gSGFzaCBLZXkgRmlyc3QiLAorICAgICAgICAgICAgICAgICJhYTRhZTVlMTUyNzJkMDBlOTU3MDU2MzdjZThhM2I1NWVkNDAyMTEyIikKKworICAgICAgICBzaGF0ZXN0KGNocigweEFBKSAqIDgwLAorICAgICAgICAgICAgICAgICgiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAiCisgICAgICAgICAgICAgICAgICJhbmQgTGFyZ2VyIFRoYW4gT25lIEJsb2NrLVNpemUgRGF0YSIpLAorICAgICAgICAgICAgICAgICJlOGU5OWQwZjQ1MjM3ZDc4NmQ2YmJhYTc5NjVjNzgwOGJiZmYxYTkxIikKKworICAgIGRlZiBfcmZjNDIzMV90ZXN0X2Nhc2VzKHNlbGYsIGhhc2hmdW5jKToKKyAgICAgICAgZGVmIGhtYWN0ZXN0KGtleSwgZGF0YSwgaGV4ZGlnZXN0cyk6CisgICAgICAgICAgICBoID0gaG1hYy5ITUFDKGtleSwgZGF0YSwgZGlnZXN0bW9kPWhhc2hmdW5jKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmhleGRpZ2VzdCgpLmxvd2VyKCksIGhleGRpZ2VzdHNbaGFzaGZ1bmNdKQorCisgICAgICAgICMgNC4yLiAgVGVzdCBDYXNlIDEKKyAgICAgICAgaG1hY3Rlc3Qoa2V5ID0gJ1x4MGInKjIwLAorICAgICAgICAgICAgICAgICBkYXRhID0gJ0hpIFRoZXJlJywKKyAgICAgICAgICAgICAgICAgaGV4ZGlnZXN0cyA9IHsKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTIyNDogJzg5NmZiMTEyOGFiYmRmMTk2ODMyMTA3Y2Q0OWRmMzNmJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNDdiNGIxMTY5OTEyYmE0ZjUzNjg0YjIyJywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTI1NjogJ2IwMzQ0YzYxZDhkYjM4NTM1Y2E4YWZjZWFmMGJmMTJiJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnODgxZGMyMDBjOTgzM2RhNzI2ZTkzNzZjMmUzMmNmZjcnLAorICAgICAgICAgICAgICAgICAgIGhhc2hsaWIuc2hhMzg0OiAnYWZkMDM5NDRkODQ4OTU2MjZiMDgyNWY0YWI0NjkwN2YnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxNWY5ZGFkYmU0MTAxZWM2ODJhYTAzNGM3Y2ViYzU5YycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhZWE5ZWE5MDc2ZWRlN2Y0YWYxNTJlOGIyZmE5Y2I2JywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTUxMjogJzg3YWE3Y2RlYTVlZjYxOWQ0ZmYwYjQyNDFhMWQ2Y2IwJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMjM3OWY0ZTJjZTRlYzI3ODdhZDBiMzA1NDVlMTdjZGUnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYWE4MzNiN2Q2YjhhNzAyMDM4YjI3NGVhZWEzZjRlNCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JlOWQ5MTRlZWI2MWYxNzAyZTY5NmMyMDNhMTI2ODU0JywKKyAgICAgICAgICAgICAgICAgfSkKKworICAgICAgICAjIDQuMy4gIFRlc3QgQ2FzZSAyCisgICAgICAgIGhtYWN0ZXN0KGtleSA9ICdKZWZlJywKKyAgICAgICAgICAgICAgICAgZGF0YSA9ICd3aGF0IGRvIHlhIHdhbnQgZm9yIG5vdGhpbmc/JywKKyAgICAgICAgICAgICAgICAgaGV4ZGlnZXN0cyA9IHsKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTIyNDogJ2EzMGUwMTA5OGJjNmRiYmY0NTY5MGYzYTdlOWU2ZDBmJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOGJiZWEyYTM5ZTYxNDgwMDhmZDA1ZTQ0JywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTI1NjogJzViZGNjMTQ2YmY2MDc1NGU2YTA0MjQyNjA4OTU3NWM3JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNWEwMDNmMDg5ZDI3Mzk4MzlkZWM1OGI5NjRlYzM4NDMnLAorICAgICAgICAgICAgICAgICAgIGhhc2hsaWIuc2hhMzg0OiAnYWY0NWQyZTM3NjQ4NDAzMTYxN2Y3OGQyYjU4YTZiMWInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc5YzdlZjQ2NGY1YTAxYjQ3ZTQyZWMzNzM2MzIyNDQ1ZScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzhlMjI0MGNhNWU2OWUyYzc4YjMyMzllY2ZhYjIxNjQ5JywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTUxMjogJzE2NGI3YTdiZmNmODE5ZTJlMzk1ZmJlNzNiNTZlMGEzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnODdiZDY0MjIyZTgzMWZkNjEwMjcwY2Q3ZWEyNTA1NTQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc5NzU4YmY3NWMwNWE5OTRhNmQwMzRmNjVmOGYwZTZmZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhZWFiMWEzNGQ0YTZiNGI2MzZlMDcwYTM4YmNlNzM3JywKKyAgICAgICAgICAgICAgICAgfSkKKworICAgICAgICAjIDQuNC4gIFRlc3QgQ2FzZSAzCisgICAgICAgIGhtYWN0ZXN0KGtleSA9ICdceGFhJyoyMCwKKyAgICAgICAgICAgICAgICAgZGF0YSA9ICdceGRkJyo1MCwKKyAgICAgICAgICAgICAgICAgaGV4ZGlnZXN0cyA9IHsKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTIyNDogJzdmYjNjYjM1ODhjNmMxZjZmZmE5Njk0ZDdkNmFkMjY0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOTM2NWIwYzFmNjVkNjlkMWVjODMzM2VhJywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTI1NjogJzc3M2VhOTFlMzY4MDBlNDY4NTRkYjhlYmQwOTE4MWE3JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMjk1OTA5OGIzZWY4YzEyMmQ5NjM1NTE0Y2VkNTY1ZmUnLAorICAgICAgICAgICAgICAgICAgIGhhc2hsaWIuc2hhMzg0OiAnODgwNjI2MDhkM2U2YWQ4YTBhYTJhY2UwMTRjOGE4NmYnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwYWE2MzVkOTQ3YWM5ZmViZTgzZWY0ZTU1OTY2MTQ0YicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzJhNWFiMzlkYzEzODE0Yjk0ZTNhYjZlMTAxYTM0ZjI3JywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTUxMjogJ2ZhNzNiMDA4OWQ1NmEyODRlZmIwZjA3NTZjODkwYmU5JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYjFiNWRiZGQ4ZWU4MWEzNjU1ZjgzZTMzYjIyNzlkMzknCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZjNlODQ4Mjc5YTcyMmM4MDZiNDg1YTQ3ZTY3YzgwNycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2I5NDZhMzM3YmVlODk0MjY3NDI3ODg1OWUxMzI5MmZiJywKKyAgICAgICAgICAgICAgICAgfSkKKworICAgICAgICAjIDQuNS4gIFRlc3QgQ2FzZSA0CisgICAgICAgIGhtYWN0ZXN0KGtleSA9ICcnLmpvaW4oW2Nocih4KSBmb3IgeCBpbiB4cmFuZ2UoMHgwMSwgMHgxOSsxKV0pLAorICAgICAgICAgICAgICAgICBkYXRhID0gJ1x4Y2QnKjUwLAorICAgICAgICAgICAgICAgICBoZXhkaWdlc3RzID0geworICAgICAgICAgICAgICAgICAgIGhhc2hsaWIuc2hhMjI0OiAnNmMxMTUwNjg3NDAxM2NhYzZhMmFiYzFiYjM4MjYyN2MnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlYzZhOTBkODZlZmMwMTJkZTdhZmVjNWEnLAorICAgICAgICAgICAgICAgICAgIGhhc2hsaWIuc2hhMjU2OiAnODI1NThhMzg5YTQ0M2MwZWE0Y2M4MTk4OTlmMjA4M2EnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc4NWYwZmFhM2U1NzhmODA3N2EyZTNmZjQ2NzI5NjY1YicsCisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGEzODQ6ICczZThhNjliNzc4M2MyNTg1MTkzM2FiNjI5MGFmNmNhNycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzdhOTk4MTQ4MDg1MDAwOWNjNTU3N2M2ZTFmNTczYjRlJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNjgwMWRkMjNjNGE3ZDY3OWNjZjhhMzg2YzY3NGNmZmInLAorICAgICAgICAgICAgICAgICAgIGhhc2hsaWIuc2hhNTEyOiAnYjBiYTQ2NTYzNzQ1OGM2OTkwZTVhOGM1ZjYxZDRhZjcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlNTc2ZDk3ZmY5NGI4NzJkZTc2ZjgwNTAzNjFlZTNkYicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2E5MWNhNWMxMWFhMjVlYjRkNjc5Mjc1Y2M1Nzg4MDYzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYTVmMTk3NDExMjBjNGYyZGUyYWRlYmViMTBhMjk4ZGQnLAorICAgICAgICAgICAgICAgICB9KQorCisgICAgICAgICMgNC43LiAgVGVzdCBDYXNlIDYKKyAgICAgICAgaG1hY3Rlc3Qoa2V5ID0gJ1x4YWEnKjEzMSwKKyAgICAgICAgICAgICAgICAgZGF0YSA9ICdUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpeicKKyAgICAgICAgICAgICAgICAgICAgICAgICdlIEtleSAtIEhhc2ggS2V5IEZpcnN0JywKKyAgICAgICAgICAgICAgICAgaGV4ZGlnZXN0cyA9IHsKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTIyNDogJzk1ZTlhMGRiOTYyMDk1YWRhZWJlOWIyZDZmMGRiY2UyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZDQ5OWYxMTJmMmQyYjcyNzNmYTY4NzBlJywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTI1NjogJzYwZTQzMTU5MWVlMGI2N2YwZDhhMjZhYWNiZjViNzdmJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOGUwYmM2MjEzNzI4YzUxNDA1NDYwNDBmMGVlMzdmNTQnLAorICAgICAgICAgICAgICAgICAgIGhhc2hsaWIuc2hhMzg0OiAnNGVjZTA4NDQ4NTgxM2U5MDg4ZDJjNjNhMDQxYmM1YjQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc0ZjllZjEwMTJhMmI1ODhmM2NkMTFmMDUwMzNhYzRjNicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzBjMmVmNmFiNDAzMGZlODI5NjI0OGRmMTYzZjQ0OTUyJywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTUxMjogJzgwYjI0MjYzYzdjMWEzZWJiNzE0OTNjMWRkN2JlOGI0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOWI0NmQxZjQxYjRhZWVjMTEyMWIwMTM3ODNmOGYzNTInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc2YjU2ZDAzN2UwNWYyNTk4YmQwZmQyMjE1ZDZhMWU1MicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzk1ZTY0ZjczZjYzZjBhZWM4YjkxNWE5ODVkNzg2NTk4JywKKyAgICAgICAgICAgICAgICAgfSkKKworICAgICAgICAjIDQuOC4gIFRlc3QgQ2FzZSA3CisgICAgICAgIGhtYWN0ZXN0KGtleSA9ICdceGFhJyoxMzEsCisgICAgICAgICAgICAgICAgIGRhdGEgPSAnVGhpcyBpcyBhIHRlc3QgdXNpbmcgYSBsYXJnZXIgdGgnCisgICAgICAgICAgICAgICAgICAgICAgICAnYW4gYmxvY2stc2l6ZSBrZXkgYW5kIGEgbGFyZ2VyIHQnCisgICAgICAgICAgICAgICAgICAgICAgICAnaGFuIGJsb2NrLXNpemUgZGF0YS4gVGhlIGtleSBuZWUnCisgICAgICAgICAgICAgICAgICAgICAgICAnZHMgdG8gYmUgaGFzaGVkIGJlZm9yZSBiZWluZyB1c2UnCisgICAgICAgICAgICAgICAgICAgICAgICAnZCBieSB0aGUgSE1BQyBhbGdvcml0aG0uJywKKyAgICAgICAgICAgICAgICAgaGV4ZGlnZXN0cyA9IHsKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTIyNDogJzNhODU0MTY2YWM1ZDlmMDIzZjU0ZDUxN2QwYjM5ZGJkJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOTQ2NzcwZGI5YzJiOTVjOWY2ZjU2NWQxJywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTI1NjogJzliMDlmZmE3MWI5NDJmY2IyNzYzNWZiY2Q1YjBlOTQ0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmZkYzYzNjQ0ZjA3MTM5MzhhN2Y1MTUzNWMzYTM1ZTInLAorICAgICAgICAgICAgICAgICAgIGhhc2hsaWIuc2hhMzg0OiAnNjYxNzE3OGU5NDFmMDIwZDM1MWUyZjI1NGU4ZmQzMmMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc2MDI0MjBmZWIwYjhmYjlhZGNjZWJiODI0NjFlOTljNScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2E2NzhjYzMxZTc5OTE3NmQzODYwZTYxMTBjNDY1MjNlJywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTUxMjogJ2UzN2I2YTc3NWRjODdkYmFhNGRmYTlmOTZlNWUzZmZkJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGViZDcxZjg4NjcyODk4NjVkZjVhMzJkMjBjZGM5NDQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiNjAyMmNhYzNjNDk4MmIxMGQ1ZWViNTVjM2U0ZGUxNScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzEzNDY3NmZiNmRlMDQ0NjA2NWM5NzQ0MGZhOGM2YTU4JywKKyAgICAgICAgICAgICAgICAgfSkKKworICAgIGRlZiB0ZXN0X3NoYTIyNF9yZmM0MjMxKHNlbGYpOgorICAgICAgICBzZWxmLl9yZmM0MjMxX3Rlc3RfY2FzZXMoaGFzaGxpYi5zaGEyMjQpCisKKyAgICBkZWYgdGVzdF9zaGEyNTZfcmZjNDIzMShzZWxmKToKKyAgICAgICAgc2VsZi5fcmZjNDIzMV90ZXN0X2Nhc2VzKGhhc2hsaWIuc2hhMjU2KQorCisgICAgZGVmIHRlc3Rfc2hhMzg0X3JmYzQyMzEoc2VsZik6CisgICAgICAgIHNlbGYuX3JmYzQyMzFfdGVzdF9jYXNlcyhoYXNobGliLnNoYTM4NCkKKworICAgIGRlZiB0ZXN0X3NoYTUxMl9yZmM0MjMxKHNlbGYpOgorICAgICAgICBzZWxmLl9yZmM0MjMxX3Rlc3RfY2FzZXMoaGFzaGxpYi5zaGE1MTIpCisKKyAgICBkZWYgdGVzdF9sZWdhY3lfYmxvY2tfc2l6ZV93YXJuaW5ncyhzZWxmKToKKyAgICAgICAgY2xhc3MgTW9ja0NyYXp5SGFzaChvYmplY3QpOgorICAgICAgICAgICAgIiIiQWluJ3Qgbm8gYmxvY2tfc2l6ZSBhdHRyaWJ1dGUgaGVyZS4iIiIKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgc2VsZi5feCA9IGhhc2hsaWIuc2hhMSgqYXJncykKKyAgICAgICAgICAgICAgICBzZWxmLmRpZ2VzdF9zaXplID0gc2VsZi5feC5kaWdlc3Rfc2l6ZQorICAgICAgICAgICAgZGVmIHVwZGF0ZShzZWxmLCB2KToKKyAgICAgICAgICAgICAgICBzZWxmLl94LnVwZGF0ZSh2KQorICAgICAgICAgICAgZGVmIGRpZ2VzdChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5feC5kaWdlc3QoKQorCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignZXJyb3InLCBSdW50aW1lV2FybmluZykKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZVdhcm5pbmcpOgorICAgICAgICAgICAgICAgIGhtYWMuSE1BQygnYScsICdiJywgZGlnZXN0bW9kPU1vY2tDcmF6eUhhc2gpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdFeHBlY3RlZCB3YXJuaW5nIGFib3V0IG1pc3NpbmcgYmxvY2tfc2l6ZScpCisKKyAgICAgICAgICAgIE1vY2tDcmF6eUhhc2guYmxvY2tfc2l6ZSA9IDEKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZVdhcm5pbmcpOgorICAgICAgICAgICAgICAgIGhtYWMuSE1BQygnYScsICdiJywgZGlnZXN0bW9kPU1vY2tDcmF6eUhhc2gpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdFeHBlY3RlZCB3YXJuaW5nIGFib3V0IHNtYWxsIGJsb2NrX3NpemUnKQorCisKKworY2xhc3MgQ29uc3RydWN0b3JUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9ub3JtYWwoc2VsZik6CisgICAgICAgICMgU3RhbmRhcmQgY29uc3RydWN0b3IgY2FsbC4KKyAgICAgICAgZmFpbGVkID0gMAorICAgICAgICB0cnk6CisgICAgICAgICAgICBoID0gaG1hYy5ITUFDKCJrZXkiKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlN0YW5kYXJkIGNvbnN0cnVjdG9yIGNhbGwgcmFpc2VkIGV4Y2VwdGlvbi4iKQorCisgICAgZGVmIHRlc3Rfd2l0aHRleHQoc2VsZik6CisgICAgICAgICMgQ29uc3RydWN0b3IgY2FsbCB3aXRoIHRleHQuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGggPSBobWFjLkhNQUMoImtleSIsICJoYXNoIHRoaXMhIikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJDb25zdHJ1Y3RvciBjYWxsIHdpdGggdGV4dCBhcmd1bWVudCByYWlzZWQgZXhjZXB0aW9uLiIpCisKKyAgICBkZWYgdGVzdF93aXRobW9kdWxlKHNlbGYpOgorICAgICAgICAjIENvbnN0cnVjdG9yIGNhbGwgd2l0aCB0ZXh0IGFuZCBkaWdlc3QgbW9kdWxlLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBoID0gaG1hYy5ITUFDKCJrZXkiLCAiIiwgaGFzaGxpYi5zaGExKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkNvbnN0cnVjdG9yIGNhbGwgd2l0aCBoYXNobGliLnNoYTEgcmFpc2VkIGV4Y2VwdGlvbi4iKQorCitjbGFzcyBTYW5pdHlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X2lzX21kNShzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGlmIEhNQUMgZGVmYXVsdHMgdG8gTUQ1IGFsZ29yaXRobS4KKyAgICAgICAgIyBOT1RFOiB0aGlzIHdoaXRlYm94IHRlc3QgZGVwZW5kcyBvbiB0aGUgaG1hYyBjbGFzcyBpbnRlcm5hbHMKKyAgICAgICAgaCA9IGhtYWMuSE1BQygia2V5IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGguZGlnZXN0X2NvbnMgPT0gaGFzaGxpYi5tZDUpCisKKyAgICBkZWYgdGVzdF9leGVyY2lzZV9hbGxfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgIyBFeGVyY2lzaW5nIGFsbCBtZXRob2RzIG9uY2UuCisgICAgICAgICMgVGhpcyBtdXN0IG5vdCByYWlzZSBhbnkgZXhjZXB0aW9ucworICAgICAgICB0cnk6CisgICAgICAgICAgICBoID0gaG1hYy5ITUFDKCJteSBzZWNyZXQga2V5IikKKyAgICAgICAgICAgIGgudXBkYXRlKCJjb21wdXRlIHRoZSBoYXNoIG9mIHRoaXMgdGV4dCEiKQorICAgICAgICAgICAgZGlnID0gaC5kaWdlc3QoKQorICAgICAgICAgICAgZGlnID0gaC5oZXhkaWdlc3QoKQorICAgICAgICAgICAgaDIgPSBoLmNvcHkoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkV4Y2VwdGlvbiByYWlzZWQgZHVyaW5nIG5vcm1hbCB1c2FnZSBvZiBITUFDIGNsYXNzLiIpCisKK2NsYXNzIENvcHlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgaWYgYXR0cmlidXRlcyBhcmUgb2Ygc2FtZSB0eXBlLgorICAgICAgICBoMSA9IGhtYWMuSE1BQygia2V5IikKKyAgICAgICAgaDIgPSBoMS5jb3B5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGgxLmRpZ2VzdF9jb25zID09IGgyLmRpZ2VzdF9jb25zLAorICAgICAgICAgICAgImRpZ2VzdCBjb25zdHJ1Y3RvcnMgZG9uJ3QgbWF0Y2guIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoaDEuaW5uZXIpID09IHR5cGUoaDIuaW5uZXIpLAorICAgICAgICAgICAgIlR5cGVzIG9mIGlubmVyIGRvbid0IG1hdGNoLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGgxLm91dGVyKSA9PSB0eXBlKGgyLm91dGVyKSwKKyAgICAgICAgICAgICJUeXBlcyBvZiBvdXRlciBkb24ndCBtYXRjaC4iKQorCisgICAgZGVmIHRlc3RfcmVhbGNvcHkoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBpZiB0aGUgY29weSBtZXRob2QgY3JlYXRlZCBhIHJlYWwgY29weS4KKyAgICAgICAgaDEgPSBobWFjLkhNQUMoImtleSIpCisgICAgICAgIGgyID0gaDEuY29weSgpCisgICAgICAgICMgVXNpbmcgaWQoKSBpbiBjYXNlIHNvbWVib2R5IGhhcyBvdmVycmlkZGVuIF9fY21wX18uCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpZChoMSkgIT0gaWQoaDIpLCAiTm8gcmVhbCBjb3B5IG9mIHRoZSBITUFDIGluc3RhbmNlLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpZChoMS5pbm5lcikgIT0gaWQoaDIuaW5uZXIpLAorICAgICAgICAgICAgIk5vIHJlYWwgY29weSBvZiB0aGUgYXR0cmlidXRlICdpbm5lcicuIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlkKGgxLm91dGVyKSAhPSBpZChoMi5vdXRlciksCisgICAgICAgICAgICAiTm8gcmVhbCBjb3B5IG9mIHRoZSBhdHRyaWJ1dGUgJ291dGVyJy4iKQorCisgICAgZGVmIHRlc3RfZXF1YWxpdHkoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBpZiB0aGUgY29weSBoYXMgdGhlIHNhbWUgZGlnZXN0cy4KKyAgICAgICAgaDEgPSBobWFjLkhNQUMoImtleSIpCisgICAgICAgIGgxLnVwZGF0ZSgic29tZSByYW5kb20gdGV4dCIpCisgICAgICAgIGgyID0gaDEuY29weSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoMS5kaWdlc3QoKSA9PSBoMi5kaWdlc3QoKSwKKyAgICAgICAgICAgICJEaWdlc3Qgb2YgY29weSBkb2Vzbid0IG1hdGNoIG9yaWdpbmFsIGRpZ2VzdC4iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaDEuaGV4ZGlnZXN0KCkgPT0gaDIuaGV4ZGlnZXN0KCksCisgICAgICAgICAgICAiSGV4ZGlnZXN0IG9mIGNvcHkgZG9lc24ndCBtYXRjaCBvcmlnaW5hbCBoZXhkaWdlc3QuIikKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFRlc3RWZWN0b3JzVGVzdENhc2UsCisgICAgICAgIENvbnN0cnVjdG9yVGVzdENhc2UsCisgICAgICAgIFNhbml0eVRlc3RDYXNlLAorICAgICAgICBDb3B5VGVzdENhc2UKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2htYWMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaG1hYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5OTI2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2htYWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2htYWMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaG1hYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5OTI2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2htYWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hvdHNob3QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ob3RzaG90LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTk3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ob3RzaG90LnB5CkBAIC0wLDAgKzEsMTU4IEBACitpbXBvcnQgb3MKK2ltcG9ydCBwcHJpbnQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgX2hvdHNob3QKK2ltcG9ydCBnYworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisjIFNpbGVuY2UgUHkzayB3YXJuaW5nCitob3RzaG90ID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2hvdHNob3QnLCBkZXByZWNhdGVkPVRydWUpCitmcm9tIGhvdHNob3QubG9nIGltcG9ydCBFTlRFUiwgRVhJVCwgTElORQorZnJvbSBob3RzaG90IGltcG9ydCBzdGF0cworCisKK2RlZiBzaG9ydGZpbGVuYW1lKGZuKToKKyAgICAjIFdlIHVzZSBhIHJlYWxseSBzaG9ydGVuZWQgZmlsZW5hbWUgc2luY2UgYW4gZXhhY3QgbWF0Y2ggaXMgbWFkZSwKKyAgICAjIGFuZCB0aGUgc291cmNlIG1heSBiZSBlaXRoZXIgYSBQeXRob24gc291cmNlIGZpbGUgb3IgYQorICAgICMgcHJlLWNvbXBpbGVkIGJ5dGVjb2RlIGZpbGUuCisgICAgaWYgZm46CisgICAgICAgIHJldHVybiBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoZm4pKVswXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBmbgorCisKK2NsYXNzIFVubGlua2luZ0xvZ1JlYWRlcihob3RzaG90LmxvZy5Mb2dSZWFkZXIpOgorICAgICIiIkV4dGVuZCB0aGUgTG9nUmVhZGVyIHNvIHRoZSBsb2cgZmlsZSBpcyB1bmxpbmtlZCB3aGVuIHdlJ3JlCisgICAgZG9uZSB3aXRoIGl0LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvZ2ZuKToKKyAgICAgICAgc2VsZi5fX2xvZ2ZuID0gbG9nZm4KKyAgICAgICAgaG90c2hvdC5sb2cuTG9nUmVhZGVyLl9faW5pdF9fKHNlbGYsIGxvZ2ZuKQorCisgICAgZGVmIG5leHQoc2VsZiwgaW5kZXg9Tm9uZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBob3RzaG90LmxvZy5Mb2dSZWFkZXIubmV4dChzZWxmKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuX19sb2dmbikKKyAgICAgICAgICAgIHJhaXNlCisKKworY2xhc3MgSG90U2hvdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgbmV3X3Byb2ZpbGVyKHNlbGYsIGxpbmVldmVudHM9MCwgbGluZXRpbWluZ3M9MSk6CisgICAgICAgIHNlbGYubG9nZm4gPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHJldHVybiBob3RzaG90LlByb2ZpbGUoc2VsZi5sb2dmbiwgbGluZWV2ZW50cywgbGluZXRpbWluZ3MpCisKKyAgICBkZWYgZ2V0X2xvZ3JlYWRlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIFVubGlua2luZ0xvZ1JlYWRlcihzZWxmLmxvZ2ZuKQorCisgICAgZGVmIGdldF9ldmVudHNfd290aW1lKHNlbGYpOgorICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIGV2ZW50IGluIHNlbGYuZ2V0X2xvZ3JlYWRlcigpOgorICAgICAgICAgICAgd2hhdCwgKGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmNuYW1lKSwgdGRlbHRhID0gZXZlbnQKKyAgICAgICAgICAgIEwuYXBwZW5kKCh3aGF0LCAoc2hvcnRmaWxlbmFtZShmaWxlbmFtZSksIGxpbmVubywgZnVuY25hbWUpKSkKKyAgICAgICAgcmV0dXJuIEwKKworICAgIGRlZiBjaGVja19ldmVudHMoc2VsZiwgZXhwZWN0ZWQpOgorICAgICAgICBldmVudHMgPSBzZWxmLmdldF9ldmVudHNfd290aW1lKCkKKyAgICAgICAgaWYgZXZlbnRzICE9IGV4cGVjdGVkOgorICAgICAgICAgICAgc2VsZi5mYWlsKAorICAgICAgICAgICAgICAgICJldmVudHMgZGlkIG5vdCBtYXRjaCBleHBlY3RhdGlvbjsgZ290OlxuJXNcbmV4cGVjdGVkOlxuJXMiCisgICAgICAgICAgICAgICAgJSAocHByaW50LnBmb3JtYXQoZXZlbnRzKSwgcHByaW50LnBmb3JtYXQoZXhwZWN0ZWQpKSkKKworICAgIGRlZiBydW5fdGVzdChzZWxmLCBjYWxsYWJsZSwgZXZlbnRzLCBwcm9maWxlcj1Ob25lKToKKyAgICAgICAgaWYgcHJvZmlsZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHByb2ZpbGVyID0gc2VsZi5uZXdfcHJvZmlsZXIoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHByb2ZpbGVyLl9wcm9mLmNsb3NlZCkKKyAgICAgICAgcHJvZmlsZXIucnVuY2FsbChjYWxsYWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm9maWxlci5fcHJvZi5jbG9zZWQpCisgICAgICAgIHByb2ZpbGVyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb2ZpbGVyLl9wcm9mLmNsb3NlZCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZXZlbnRzKQorCisgICAgZGVmIHRlc3RfYWRkaW5mbyhzZWxmKToKKyAgICAgICAgZGVmIGYocCk6CisgICAgICAgICAgICBwLmFkZGluZm8oInRlc3Qta2V5IiwgInRlc3QtdmFsdWUiKQorICAgICAgICBwcm9maWxlciA9IHNlbGYubmV3X3Byb2ZpbGVyKCkKKyAgICAgICAgcHJvZmlsZXIucnVuY2FsbChmLCBwcm9maWxlcikKKyAgICAgICAgcHJvZmlsZXIuY2xvc2UoKQorICAgICAgICBsb2cgPSBzZWxmLmdldF9sb2dyZWFkZXIoKQorICAgICAgICBpbmZvID0gbG9nLl9pbmZvCisgICAgICAgIGxpc3QobG9nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5mb1sidGVzdC1rZXkiXSA9PSBbInRlc3QtdmFsdWUiXSkKKworICAgIGRlZiB0ZXN0X2xpbmVfbnVtYmVycyhzZWxmKToKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIHkgPSAyCisgICAgICAgICAgICB4ID0gMQorICAgICAgICBkZWYgZygpOgorICAgICAgICAgICAgZigpCisgICAgICAgIGZfbGluZW5vID0gZi5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8KKyAgICAgICAgZ19saW5lbm8gPSBnLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubworICAgICAgICBldmVudHMgPSBbKEVOVEVSLCAoInRlc3RfaG90c2hvdCIsIGdfbGluZW5vLCAiZyIpKSwKKyAgICAgICAgICAgICAgICAgIChMSU5FLCAgKCJ0ZXN0X2hvdHNob3QiLCBnX2xpbmVubysxLCAiZyIpKSwKKyAgICAgICAgICAgICAgICAgIChFTlRFUiwgKCJ0ZXN0X2hvdHNob3QiLCBmX2xpbmVubywgImYiKSksCisgICAgICAgICAgICAgICAgICAoTElORSwgICgidGVzdF9ob3RzaG90IiwgZl9saW5lbm8rMSwgImYiKSksCisgICAgICAgICAgICAgICAgICAoTElORSwgICgidGVzdF9ob3RzaG90IiwgZl9saW5lbm8rMiwgImYiKSksCisgICAgICAgICAgICAgICAgICAoRVhJVCwgICgidGVzdF9ob3RzaG90IiwgZl9saW5lbm8sICJmIikpLAorICAgICAgICAgICAgICAgICAgKEVYSVQsICAoInRlc3RfaG90c2hvdCIsIGdfbGluZW5vLCAiZyIpKSwKKyAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5ydW5fdGVzdChnLCBldmVudHMsIHNlbGYubmV3X3Byb2ZpbGVyKGxpbmVldmVudHM9MSkpCisKKyAgICBkZWYgdGVzdF9zdGFydF9zdG9wKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBkb24ndCByZXR1cm4gTlVMTCBpbiB0aGUgc3RhcnQoKSBhbmQgc3RvcCgpCisgICAgICAgICMgbWV0aG9kcyB3aGVuIHRoZXJlIGlzbid0IGFuIGVycm9yLiAgQnVnIGluIDIuMiBub3RlZCBieQorICAgICAgICAjIEFudGhvbnkgQmF4dGVyLgorICAgICAgICBwcm9maWxlciA9IHNlbGYubmV3X3Byb2ZpbGVyKCkKKyAgICAgICAgcHJvZmlsZXIuc3RhcnQoKQorICAgICAgICBwcm9maWxlci5zdG9wKCkKKyAgICAgICAgcHJvZmlsZXIuY2xvc2UoKQorICAgICAgICBvcy51bmxpbmsoc2VsZi5sb2dmbikKKworICAgIGRlZiB0ZXN0X2JhZF9zeXNfcGF0aChzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgb3JpZ19wYXRoID0gc3lzLnBhdGgKKyAgICAgICAgY292ZXJhZ2UgPSBob3RzaG90Ll9ob3RzaG90LmNvdmVyYWdlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgdmVyaWZ5IHdlIHJlcXVpcmUgYSBsaXN0IGZvciBzeXMucGF0aAorICAgICAgICAgICAgc3lzLnBhdGggPSAnYWJjJworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjb3ZlcmFnZSwgdGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgICMgdmVyaWZ5IHRoYXQgd2UgcmVxdWlyZSBzeXMucGF0aCBleGlzdHMKKyAgICAgICAgICAgIGRlbCBzeXMucGF0aAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjb3ZlcmFnZSwgdGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5wYXRoID0gb3JpZ19wYXRoCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0ZXN0X3N1cHBvcnQuVEVTVEZOKToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2xvZ3JlYWRlcl9lb2ZfZXJyb3Ioc2VsZik6CisgICAgICAgIGVtcHR5ZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChJT0Vycm9yLCBFT0ZFcnJvciksIF9ob3RzaG90LmxvZ3JlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5ZmlsZS5uYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZW1wdHlmaWxlLmNsb3NlKCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICBkZWYgdGVzdF9sb2FkX3N0YXRzKHNlbGYpOgorICAgICAgICBkZWYgc3RhcnQocHJvZik6CisgICAgICAgICAgICBwcm9mLnN0YXJ0KCkKKyAgICAgICAgIyBNYWtlIHN1cmUgc3RhdHMgY2FuIGJlIGxvYWRlZCB3aGVuIHN0YXJ0IGFuZCBzdG9wIG9mIHByb2ZpbGVyCisgICAgICAgICMgYXJlIG5vdCBleGVjdXRlZCBpbiB0aGUgc2FtZSBzdGFjayBmcmFtZS4KKyAgICAgICAgcHJvZmlsZXIgPSBzZWxmLm5ld19wcm9maWxlcigpCisgICAgICAgIHN0YXJ0KHByb2ZpbGVyKQorICAgICAgICBwcm9maWxlci5zdG9wKCkKKyAgICAgICAgcHJvZmlsZXIuY2xvc2UoKQorICAgICAgICBzdGF0cy5sb2FkKHNlbGYubG9nZm4pCisgICAgICAgIG9zLnVubGluayhzZWxmLmxvZ2ZuKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEhvdFNob3RUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ob3RzaG90LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hvdHNob3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YmIxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ob3RzaG90LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ob3RzaG90LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hvdHNob3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YmIxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ob3RzaG90LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odG1sbGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzgxM2IwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbGxpYi5weQpAQCAtMCwwICsxLDY5IEBACitpbXBvcnQgZm9ybWF0dGVyCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2h0bWxsaWIgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnaHRtbGxpYicsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworCitjbGFzcyBBbmNob3JDb2xsZWN0b3IoaHRtbGxpYi5IVE1MUGFyc2VyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICBzZWxmLl9fYW5jaG9ycyA9IFtdCisgICAgICAgIGh0bWxsaWIuSFRNTFBhcnNlci5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKKworICAgIGRlZiBnZXRfYW5jaG9yX2luZm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fYW5jaG9ycworCisgICAgZGVmIGFuY2hvcl9iZ24oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9fYW5jaG9ycy5hcHBlbmQoYXJncykKKworY2xhc3MgRGVjbENvbGxlY3RvcihodG1sbGliLkhUTUxQYXJzZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgIHNlbGYuX19kZWNscyA9IFtdCisgICAgICAgIGh0bWxsaWIuSFRNTFBhcnNlci5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKKworICAgIGRlZiBnZXRfZGVjbF9pbmZvKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2RlY2xzCisKKyAgICBkZWYgdW5rbm93bl9kZWNsKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9fZGVjbHMuYXBwZW5kKGRhdGEpCisKKworY2xhc3MgSFRNTFBhcnNlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9hbmNob3JfY29sbGVjdGlvbihzZWxmKToKKyAgICAgICAgIyBTZWUgU0YgYnVnICM0NjcwNTkuCisgICAgICAgIHBhcnNlciA9IEFuY2hvckNvbGxlY3Rvcihmb3JtYXR0ZXIuTnVsbEZvcm1hdHRlcigpLCB2ZXJib3NlPTEpCisgICAgICAgIHBhcnNlci5mZWVkKAorICAgICAgICAgICAgIiIiPGEgaHJlZj0naHR0cDovL2Zvby5vcmcvJyBuYW1lPSdzcGxhdCc+IDwvYT4KKyAgICAgICAgICAgIDxhIGhyZWY9J2h0dHA6Ly93d3cucHl0aG9uLm9yZy8nPiA8L2E+CisgICAgICAgICAgICA8YSBuYW1lPSdmcm9iJz4gPC9hPgorICAgICAgICAgICAgIiIiKQorICAgICAgICBwYXJzZXIuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5nZXRfYW5jaG9yX2luZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKCdodHRwOi8vZm9vLm9yZy8nLCAnc3BsYXQnLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnaHR0cDovL3d3dy5weXRob24ub3JnLycsICcnLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnJywgJ2Zyb2InLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9kZWNsX2NvbGxlY3Rpb24oc2VsZik6CisgICAgICAgICMgU2VlIFNGIHBhdGNoICM1NDUzMDAKKyAgICAgICAgcGFyc2VyID0gRGVjbENvbGxlY3Rvcihmb3JtYXR0ZXIuTnVsbEZvcm1hdHRlcigpLCB2ZXJib3NlPTEpCisgICAgICAgIHBhcnNlci5mZWVkKAorICAgICAgICAgICAgIiIiPGh0bWw+CisgICAgICAgICAgICA8Ym9keT4KKyAgICAgICAgICAgIGhhbGxvCisgICAgICAgICAgICA8IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT4KKyAgICAgICAgICAgIDwvYm9keT4KKyAgICAgICAgICAgIDwvaHRtbD4KKyAgICAgICAgICAgICIiIikKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZ2V0X2RlY2xfaW5mbygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsiaWYgIXN1cHBvcnRFbXB0eVBhcmFzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImVuZGlmIgorICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChIVE1MUGFyc2VyVGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odG1sbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTczNTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odG1sbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTczNTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjNDYxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHkKQEAgLTAsMCArMSw2MTAgQEAKKyIiIlRlc3RzIGZvciBIVE1MUGFyc2VyLnB5LiIiIgorCitpbXBvcnQgSFRNTFBhcnNlcgoraW1wb3J0IHBwcmludAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK2NsYXNzIEV2ZW50Q29sbGVjdG9yKEhUTUxQYXJzZXIuSFRNTFBhcnNlcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZXZlbnRzID0gW10KKyAgICAgICAgc2VsZi5hcHBlbmQgPSBzZWxmLmV2ZW50cy5hcHBlbmQKKyAgICAgICAgSFRNTFBhcnNlci5IVE1MUGFyc2VyLl9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgZ2V0X2V2ZW50cyhzZWxmKToKKyAgICAgICAgIyBOb3JtYWxpemUgdGhlIGxpc3Qgb2YgZXZlbnRzIHNvIHRoYXQgYnVmZmVyIGFydGVmYWN0cyBkb24ndAorICAgICAgICAjIHNlcGFyYXRlIHJ1bnMgb2YgY29udGlndW91cyBjaGFyYWN0ZXJzLgorICAgICAgICBMID0gW10KKyAgICAgICAgcHJldnR5cGUgPSBOb25lCisgICAgICAgIGZvciBldmVudCBpbiBzZWxmLmV2ZW50czoKKyAgICAgICAgICAgIHR5cGUgPSBldmVudFswXQorICAgICAgICAgICAgaWYgdHlwZSA9PSBwcmV2dHlwZSA9PSAiZGF0YSI6CisgICAgICAgICAgICAgICAgTFstMV0gPSAoImRhdGEiLCBMWy0xXVsxXSArIGV2ZW50WzFdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBMLmFwcGVuZChldmVudCkKKyAgICAgICAgICAgIHByZXZ0eXBlID0gdHlwZQorICAgICAgICBzZWxmLmV2ZW50cyA9IEwKKyAgICAgICAgcmV0dXJuIEwKKworICAgICMgc3RydWN0dXJlIG1hcmt1cAorCisgICAgZGVmIGhhbmRsZV9zdGFydHRhZyhzZWxmLCB0YWcsIGF0dHJzKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJzdGFydHRhZyIsIHRhZywgYXR0cnMpKQorCisgICAgZGVmIGhhbmRsZV9zdGFydGVuZHRhZyhzZWxmLCB0YWcsIGF0dHJzKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJzdGFydGVuZHRhZyIsIHRhZywgYXR0cnMpKQorCisgICAgZGVmIGhhbmRsZV9lbmR0YWcoc2VsZiwgdGFnKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJlbmR0YWciLCB0YWcpKQorCisgICAgIyBhbGwgb3RoZXIgbWFya3VwCisKKyAgICBkZWYgaGFuZGxlX2NvbW1lbnQoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiY29tbWVudCIsIGRhdGEpKQorCisgICAgZGVmIGhhbmRsZV9jaGFycmVmKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImNoYXJyZWYiLCBkYXRhKSkKKworICAgIGRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJkYXRhIiwgZGF0YSkpCisKKyAgICBkZWYgaGFuZGxlX2RlY2woc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiZGVjbCIsIGRhdGEpKQorCisgICAgZGVmIGhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiZW50aXR5cmVmIiwgZGF0YSkpCisKKyAgICBkZWYgaGFuZGxlX3BpKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFwcGVuZCgoInBpIiwgZGF0YSkpCisKKyAgICBkZWYgdW5rbm93bl9kZWNsKHNlbGYsIGRlY2wpOgorICAgICAgICBzZWxmLmFwcGVuZCgoInVua25vd24gZGVjbCIsIGRlY2wpKQorCisKK2NsYXNzIEV2ZW50Q29sbGVjdG9yRXh0cmEoRXZlbnRDb2xsZWN0b3IpOgorCisgICAgZGVmIGhhbmRsZV9zdGFydHRhZyhzZWxmLCB0YWcsIGF0dHJzKToKKyAgICAgICAgRXZlbnRDb2xsZWN0b3IuaGFuZGxlX3N0YXJ0dGFnKHNlbGYsIHRhZywgYXR0cnMpCisgICAgICAgIHNlbGYuYXBwZW5kKCgic3RhcnR0YWdfdGV4dCIsIHNlbGYuZ2V0X3N0YXJ0dGFnX3RleHQoKSkpCisKKworY2xhc3MgVGVzdENhc2VCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBfcnVuX2NoZWNrKHNlbGYsIHNvdXJjZSwgZXhwZWN0ZWRfZXZlbnRzLCBjb2xsZWN0b3I9RXZlbnRDb2xsZWN0b3IpOgorICAgICAgICBwYXJzZXIgPSBjb2xsZWN0b3IoKQorICAgICAgICBmb3IgcyBpbiBzb3VyY2U6CisgICAgICAgICAgICBwYXJzZXIuZmVlZChzKQorICAgICAgICBwYXJzZXIuY2xvc2UoKQorICAgICAgICBldmVudHMgPSBwYXJzZXIuZ2V0X2V2ZW50cygpCisgICAgICAgIGlmIGV2ZW50cyAhPSBleHBlY3RlZF9ldmVudHM6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJlY2VpdmVkIGV2ZW50cyBkaWQgbm90IG1hdGNoIGV4cGVjdGVkIGV2ZW50c1xuIgorICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDpcbiIgKyBwcHJpbnQucGZvcm1hdChleHBlY3RlZF9ldmVudHMpICsKKyAgICAgICAgICAgICAgICAgICAgICAiXG5SZWNlaXZlZDpcbiIgKyBwcHJpbnQucGZvcm1hdChldmVudHMpKQorCisgICAgZGVmIF9ydW5fY2hlY2tfZXh0cmEoc2VsZiwgc291cmNlLCBldmVudHMpOgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soc291cmNlLCBldmVudHMsIEV2ZW50Q29sbGVjdG9yRXh0cmEpCisKKyAgICBkZWYgX3BhcnNlX2Vycm9yKHNlbGYsIHNvdXJjZSk6CisgICAgICAgIGRlZiBwYXJzZShzb3VyY2U9c291cmNlKToKKyAgICAgICAgICAgIHBhcnNlciA9IEhUTUxQYXJzZXIuSFRNTFBhcnNlcigpCisgICAgICAgICAgICBwYXJzZXIuZmVlZChzb3VyY2UpCisgICAgICAgICAgICBwYXJzZXIuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhIVE1MUGFyc2VyLkhUTUxQYXJzZUVycm9yLCBwYXJzZSkKKworCitjbGFzcyBIVE1MUGFyc2VyVGVzdENhc2UoVGVzdENhc2VCYXNlKToKKworICAgIGRlZiB0ZXN0X3Byb2Nlc3NpbmdfaW5zdHJ1Y3Rpb25fb25seShzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8P3Byb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24+IiwgWworICAgICAgICAgICAgKCJwaSIsICJwcm9jZXNzaW5nIGluc3RydWN0aW9uIiksCisgICAgICAgICAgICBdKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjw/cHJvY2Vzc2luZyBpbnN0cnVjdGlvbiA/PiIsIFsKKyAgICAgICAgICAgICgicGkiLCAicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiA/IiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX2h0bWwoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiIiIKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAnZm9vJz4KKzxIVE1MPiZlbnRpdHk7JiMzMjsKKzwhLS1jb21tZW50MWEKKy0+PC9mb28+PGJhcj4mbHQ7PD9waT8+PC9mb288YmFyCitjb21tZW50MWItLT4KKzxJbWcgc1JjPSdCYXInIGlzTUFQPnNhbXBsZQordGV4dAorJiN4MjAxQzsKKzwhLS1jb21tZW50MmEtLSAtLWNvbW1lbnQyYi0tPgorPC9IdG1sPgorIiIiLCBbCisgICAgKCJkYXRhIiwgIlxuIiksCisgICAgKCJkZWNsIiwgIkRPQ1RZUEUgaHRtbCBQVUJMSUMgJ2ZvbyciKSwKKyAgICAoImRhdGEiLCAiXG4iKSwKKyAgICAoInN0YXJ0dGFnIiwgImh0bWwiLCBbXSksCisgICAgKCJlbnRpdHlyZWYiLCAiZW50aXR5IiksCisgICAgKCJjaGFycmVmIiwgIjMyIiksCisgICAgKCJkYXRhIiwgIlxuIiksCisgICAgKCJjb21tZW50IiwgImNvbW1lbnQxYVxuLT48L2Zvbz48YmFyPiZsdDs8P3BpPz48L2ZvbzxiYXJcbmNvbW1lbnQxYiIpLAorICAgICgiZGF0YSIsICJcbiIpLAorICAgICgic3RhcnR0YWciLCAiaW1nIiwgWygic3JjIiwgIkJhciIpLCAoImlzbWFwIiwgTm9uZSldKSwKKyAgICAoImRhdGEiLCAic2FtcGxlXG50ZXh0XG4iKSwKKyAgICAoImNoYXJyZWYiLCAieDIwMUMiKSwKKyAgICAoImRhdGEiLCAiXG4iKSwKKyAgICAoImNvbW1lbnQiLCAiY29tbWVudDJhLS0gLS1jb21tZW50MmIiKSwKKyAgICAoImRhdGEiLCAiXG4iKSwKKyAgICAoImVuZHRhZyIsICJodG1sIiksCisgICAgKCJkYXRhIiwgIlxuIiksCisgICAgXSkKKworICAgIGRlZiB0ZXN0X3VuY2xvc2VkX2VudGl0eXJlZihzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCImZW50aXR5cmVmIGZvbyIsIFsKKyAgICAgICAgICAgICgiZW50aXR5cmVmIiwgImVudGl0eXJlZiIpLAorICAgICAgICAgICAgKCJkYXRhIiwgIiBmb28iKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9iYWRfbmVzdGluZyhzZWxmKToKKyAgICAgICAgIyBTdHJhbmdlbHksIHRoaXMgKmlzKiBzdXBwb3NlZCB0byB0ZXN0IHRoYXQgb3ZlcmxhcHBpbmcKKyAgICAgICAgIyBlbGVtZW50cyBhcmUgYWxsb3dlZC4gIEhUTUxQYXJzZXIgaXMgbW9yZSBnZWFyZWQgdG93YXJkCisgICAgICAgICMgbGV4aW5nIHRoZSBpbnB1dCB0aGF0IHBhcnNpbmcgdGhlIHN0cnVjdHVyZS4KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8YT48Yj48L2E+PC9iPiIsIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFtdKSwKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiYiIsIFtdKSwKKyAgICAgICAgICAgICgiZW5kdGFnIiwgImEiKSwKKyAgICAgICAgICAgICgiZW5kdGFnIiwgImIiKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9iYXJlX2FtcGVyc2FuZHMoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygidGhpcyB0ZXh0ICYgY29udGFpbnMgJiBhbXBlcnNhbmRzICYiLCBbCisgICAgICAgICAgICAoImRhdGEiLCAidGhpcyB0ZXh0ICYgY29udGFpbnMgJiBhbXBlcnNhbmRzICYiKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9iYXJlX3BvaW50eV9icmFja2V0cyhzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCJ0aGlzIDwgdGV4dCA+IGNvbnRhaW5zIDwgYmFyZT5wb2ludHk8IGJyYWNrZXRzIiwgWworICAgICAgICAgICAgKCJkYXRhIiwgInRoaXMgPCB0ZXh0ID4gY29udGFpbnMgPCBiYXJlPnBvaW50eTwgYnJhY2tldHMiKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9pbGxlZ2FsX2RlY2xhcmF0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCc8IXNwYWNlciB0eXBlPSJibG9jayIgaGVpZ2h0PSIyNSI+JywKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2NvbW1lbnQnLCAnc3BhY2VyIHR5cGU9ImJsb2NrIiBoZWlnaHQ9IjI1IicpXSkKKworICAgIGRlZiB0ZXN0X3N0YXJ0dGFnX2VuZF9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCIiIjxhIGI9JzwnPiIiIiwgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPCIpXSldKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIiIiPGEgYj0nPic+IiIiLCBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICI+IildKV0pCisKKyAgICBkZWYgdGVzdF9idWZmZXJfYXJ0ZWZhY3RzKHNlbGYpOgorICAgICAgICBvdXRwdXQgPSBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICI8IildKV0KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPGEgYj0nPCc+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPGEgIiwgImI9JzwnPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjxhIGIiLCAiPSc8Jz4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8YSBiPSIsICInPCc+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPGEgYj0nPCIsICInPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjxhIGI9JzwnIiwgIj4iXSwgb3V0cHV0KQorCisgICAgICAgIG91dHB1dCA9IFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIj4iKV0pXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8YSBiPSc+Jz4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8YSAiLCAiYj0nPic+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPGEgYiIsICI9Jz4nPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjxhIGI9IiwgIic+Jz4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8YSBiPSc+IiwgIic+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPGEgYj0nPiciLCAiPiJdLCBvdXRwdXQpCisKKyAgICAgICAgb3V0cHV0ID0gWygiY29tbWVudCIsICJhYmMiKV0KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiIiwgIjwhLS1hYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IiwgIiEtLWFiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhIiwgIi0tYWJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtIiwgIi1hYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tIiwgImFiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhLS1hIiwgImJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtLWFiIiwgImMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tYWJjIiwgIi0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhLS1hYmMtIiwgIi0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtLWFiYy0tIiwgIj4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tYWJjLS0+IiwgIiJdLCBvdXRwdXQpCisKKyAgICBkZWYgdGVzdF9zdGFydHRhZ19qdW5rX2NoYXJzKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjwvPiIsIFtdKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjwvJD4iLCBbKCdjb21tZW50JywgJyQnKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPC8iLCBbKCdkYXRhJywgJzwvJyldKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjwvYSIsIFsoJ2RhdGEnLCAnPC9hJyldKQorICAgICAgICAjIFhYWCB0aGlzIG1pZ2h0IGJlIHdyb25nCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGE8YT4iLCBbKCdkYXRhJywgJzxhJyksICgnc3RhcnR0YWcnLCAnYScsIFtdKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPC9hPGE+IiwgWygnZW5kdGFnJywgJ2E8YScpXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8ISIsIFsoJ2RhdGEnLCAnPCEnKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGEiLCBbKCdkYXRhJywgJzxhJyldKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxhIGZvbz0nYmFyJyIsIFsoJ2RhdGEnLCAiPGEgZm9vPSdiYXInIildKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxhIGZvbz0nYmFyIiwgWygnZGF0YScsICI8YSBmb289J2JhciIpXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8YSBmb289Jz4nIiwgWygnZGF0YScsICI8YSBmb289Jz4nIildKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxhIGZvbz0nPiIsIFsoJ2RhdGEnLCAiPGEgZm9vPSc+IildKQorCisgICAgZGVmIHRlc3RfdmFsaWRfZG9jdHlwZXMoc2VsZik6CisgICAgICAgICMgZnJvbSBodHRwOi8vd3d3LnczLm9yZy9RQS8yMDAyLzA0L3ZhbGlkLWR0ZC1saXN0Lmh0bWwKKyAgICAgICAgZHRkcyA9IFsnSFRNTCcsICAjIEhUTUw1IGRvY3R5cGUKKyAgICAgICAgICAgICAgICAoJ0hUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIiAnCisgICAgICAgICAgICAgICAgICciaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCInKSwKKyAgICAgICAgICAgICAgICAoJ0hUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgJworICAgICAgICAgICAgICAgICAnImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCInKSwKKyAgICAgICAgICAgICAgICAoJ2h0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgJworICAgICAgICAgICAgICAgICAnImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiJyksCisgICAgICAgICAgICAgICAgKCdodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIgJworICAgICAgICAgICAgICAgICAnImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLWZyYW1lc2V0LmR0ZCInKSwKKyAgICAgICAgICAgICAgICAoJ21hdGggUFVCTElDICItLy9XM0MvL0RURCBNYXRoTUwgMi4wLy9FTiIgJworICAgICAgICAgICAgICAgICAnImh0dHA6Ly93d3cudzMub3JnL01hdGgvRFREL21hdGhtbDIvbWF0aG1sMi5kdGQiJyksCisgICAgICAgICAgICAgICAgKCdodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgJworICAgICAgICAgICAgICAgICAnWEhUTUwgMS4xIHBsdXMgTWF0aE1MIDIuMCBwbHVzIFNWRyAxLjEvL0VOIiAnCisgICAgICAgICAgICAgICAgICciaHR0cDovL3d3dy53My5vcmcvMjAwMi8wNC94aHRtbC1tYXRoLXN2Zy94aHRtbC1tYXRoLXN2Zy5kdGQiJyksCisgICAgICAgICAgICAgICAgKCdzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgJworICAgICAgICAgICAgICAgICAnImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCInKSwKKyAgICAgICAgICAgICAgICAnaHRtbCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDIuMC8vRU4iJywKKyAgICAgICAgICAgICAgICAnaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgMy4yIEZpbmFsLy9FTiInXQorICAgICAgICBmb3IgZHRkIGluIGR0ZHM6CisgICAgICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjwhRE9DVFlQRSAlcz4iICUgZHRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2RlY2wnLCAnRE9DVFlQRSAnICsgZHRkKV0pCisKKyAgICBkZWYgdGVzdF9zbGFzaGVzX2luX3N0YXJ0dGFnKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soJzxhIGZvbz0idmFyIi8+JywgWygnc3RhcnRlbmR0YWcnLCAnYScsIFsoJ2ZvbycsICd2YXInKV0pXSkKKyAgICAgICAgaHRtbCA9ICgnPGltZyB3aWR0aD05MDIgaGVpZ2h0PTI1MHB4ICcKKyAgICAgICAgICAgICAgICAnc3JjPSIvc2l0ZXMvZGVmYXVsdC9maWxlcy9pbWFnZXMvaG9tZXBhZ2UvZm9vLmpwZyIgJworICAgICAgICAgICAgICAgICcvKndoYXQgYW0gSSBkb2luZyBoZXJlKi8gLz4nKQorICAgICAgICBleHBlY3RlZCA9IFsoCisgICAgICAgICAgICAnc3RhcnRlbmR0YWcnLCAnaW1nJywKKyAgICAgICAgICAgIFsoJ3dpZHRoJywgJzkwMicpLCAoJ2hlaWdodCcsICcyNTBweCcpLAorICAgICAgICAgICAgICgnc3JjJywgJy9zaXRlcy9kZWZhdWx0L2ZpbGVzL2ltYWdlcy9ob21lcGFnZS9mb28uanBnJyksCisgICAgICAgICAgICAgKCcqd2hhdCcsIE5vbmUpLCAoJ2FtJywgTm9uZSksICgnaScsIE5vbmUpLAorICAgICAgICAgICAgICgnZG9pbmcnLCBOb25lKSwgKCdoZXJlKicsIE5vbmUpXQorICAgICAgICApXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soaHRtbCwgZXhwZWN0ZWQpCisgICAgICAgIGh0bWwgPSAoJzxhIC8gL2Zvby8gLyAvPS8gLyAvYmFyLyAvIC8+JworICAgICAgICAgICAgICAgICc8YSAvIC9mb28vIC8gLz0vIC8gL2Jhci8gLyA+JykKKyAgICAgICAgZXhwZWN0ZWQgPSBbCisgICAgICAgICAgICAoJ3N0YXJ0ZW5kdGFnJywgJ2EnLCBbKCdmb28nLCBOb25lKSwgKCc9JywgTm9uZSksICgnYmFyJywgTm9uZSldKSwKKyAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYScsIFsoJ2ZvbycsIE5vbmUpLCAoJz0nLCBOb25lKSwgKCdiYXInLCBOb25lKV0pCisgICAgICAgIF0KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKGh0bWwsIGV4cGVjdGVkKQorICAgICAgICAjc2VlIGlzc3VlICMxNDUzOAorICAgICAgICBodG1sID0gKCc8bWV0YT48bWV0YSAvID48bWV0YSAvLyA+PG1ldGEgLyAvID4nCisgICAgICAgICAgICAgICAgJzxtZXRhLz48bWV0YSAvPjxtZXRhIC8vPjxtZXRhLy8+JykKKyAgICAgICAgZXhwZWN0ZWQgPSBbCisgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ21ldGEnLCBbXSksICgnc3RhcnR0YWcnLCAnbWV0YScsIFtdKSwKKyAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnbWV0YScsIFtdKSwgKCdzdGFydHRhZycsICdtZXRhJywgW10pLAorICAgICAgICAgICAgKCdzdGFydGVuZHRhZycsICdtZXRhJywgW10pLCAoJ3N0YXJ0ZW5kdGFnJywgJ21ldGEnLCBbXSksCisgICAgICAgICAgICAoJ3N0YXJ0ZW5kdGFnJywgJ21ldGEnLCBbXSksICgnc3RhcnRlbmR0YWcnLCAnbWV0YScsIFtdKSwKKyAgICAgICAgXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soaHRtbCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9kZWNsYXJhdGlvbl9qdW5rX2NoYXJzKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjwhRE9DVFlQRSBmb28gJCA+IiwgWygnZGVjbCcsICdET0NUWVBFIGZvbyAkICcpXSkKKworICAgIGRlZiB0ZXN0X3N0YXJ0ZW5kdGFnKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxwLz4iLCBbCisgICAgICAgICAgICAoInN0YXJ0ZW5kdGFnIiwgInAiLCBbXSksCisgICAgICAgICAgICBdKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxwPjwvcD4iLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgInAiLCBbXSksCisgICAgICAgICAgICAoImVuZHRhZyIsICJwIiksCisgICAgICAgICAgICBdKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxwPjxpbWcgc3JjPSdmb28nIC8+PC9wPiIsIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAicCIsIFtdKSwKKyAgICAgICAgICAgICgic3RhcnRlbmR0YWciLCAiaW1nIiwgWygic3JjIiwgImZvbyIpXSksCisgICAgICAgICAgICAoImVuZHRhZyIsICJwIiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9lbmRfdGFncyhzZWxmKToKKyAgICAgICAgIyBBIGNvbGxlY3Rpb24gb2YgYnJva2VuIGVuZCB0YWdzLiA8YnI+IGlzIHVzZWQgYXMgc2VwYXJhdG9yLgorICAgICAgICAjIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS90b2tlbml6YXRpb24uaHRtbCNlbmQtdGFnLW9wZW4tc3RhdGUKKyAgICAgICAgIyBhbmQgIzEzOTkzCisgICAgICAgIGh0bWwgPSAoJzxicj48L2xhYmVsPC9wPjxicj48L2RpdiBlbmQgdG1BZC1sZWFkZXJCb2FyZD48YnI+PC88aDQ+PGJyPicKKyAgICAgICAgICAgICAgICAnPC9saSBjbGFzcz0idW5pdCI+PGJyPjwvbGlcclxuXHRcdFx0XHRcdFx0PC91bD48YnI+PC8+PGJyPicpCisgICAgICAgIGV4cGVjdGVkID0gWygnc3RhcnR0YWcnLCAnYnInLCBbXSksCisgICAgICAgICAgICAgICAgICAgICMgPCBpcyBwYXJ0IG9mIHRoZSBuYW1lLCAvIGlzIGRpc2NhcmRlZCwgcCBpcyBhbiBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgKCdlbmR0YWcnLCAnbGFiZWw8JyksCisgICAgICAgICAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYnInLCBbXSksCisgICAgICAgICAgICAgICAgICAgICMgdGV4dCBhbmQgYXR0cmlidXRlcyBhcmUgZGlzY2FyZGVkCisgICAgICAgICAgICAgICAgICAgICgnZW5kdGFnJywgJ2RpdicpLAorICAgICAgICAgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2JyJywgW10pLAorICAgICAgICAgICAgICAgICAgICAjIGNvbW1lbnQgYmVjYXVzZSB0aGUgZmlyc3QgY2hhciBhZnRlciA8LyBpcyBub3QgYS16QS1aCisgICAgICAgICAgICAgICAgICAgICgnY29tbWVudCcsICc8aDQnKSwKKyAgICAgICAgICAgICAgICAgICAgKCdzdGFydHRhZycsICdicicsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgIyBhdHRyaWJ1dGVzIGFyZSBkaXNjYXJkZWQKKyAgICAgICAgICAgICAgICAgICAgKCdlbmR0YWcnLCAnbGknKSwKKyAgICAgICAgICAgICAgICAgICAgKCdzdGFydHRhZycsICdicicsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgIyBldmVyeXRoaW5nIHRpbGwgdWwgKGluY2x1ZGVkKSBpcyBkaXNjYXJkZWQKKyAgICAgICAgICAgICAgICAgICAgKCdlbmR0YWcnLCAnbGknKSwKKyAgICAgICAgICAgICAgICAgICAgKCdzdGFydHRhZycsICdicicsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgIyA8Lz4gaXMgaWdub3JlZAorICAgICAgICAgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2JyJywgW10pXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soaHRtbCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9icm9rZW5faW52YWxpZF9lbmRfdGFnKHNlbGYpOgorICAgICAgICAjIFRoaXMgaXMgdGVjaG5pY2FsbHkgd3JvbmcgKHRoZSAiPiBzaG91bGRuJ3QgYmUgaW5jbHVkZWQgaW4gdGhlICdkYXRhJykKKyAgICAgICAgIyBidXQgaXMgcHJvYmFibHkgbm90IHdvcnRoIGZpeGluZyBpdCAoaW4gYWRkaXRpb24gdG8gYWxsIHRoZSBjYXNlcyBvZgorICAgICAgICAjIHRoZSBwcmV2aW91cyB0ZXN0LCBpdCB3b3VsZCByZXF1aXJlIGEgZnVsbCBhdHRyaWJ1dGUgcGFyc2luZykuCisgICAgICAgICMgc2VlICMxMzk5MworICAgICAgICBodG1sID0gJzxiPlRoaXM8L2IgYXR0cj0iPiI+IGNvbmZ1c2VzIHRoZSBwYXJzZXInCisgICAgICAgIGV4cGVjdGVkID0gWygnc3RhcnR0YWcnLCAnYicsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgKCdkYXRhJywgJ1RoaXMnKSwKKyAgICAgICAgICAgICAgICAgICAgKCdlbmR0YWcnLCAnYicpLAorICAgICAgICAgICAgICAgICAgICAoJ2RhdGEnLCAnIj4gY29uZnVzZXMgdGhlIHBhcnNlcicpXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soaHRtbCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9nZXRfc3RhcnR0YWdfdGV4dChzZWxmKToKKyAgICAgICAgcyA9ICIiIjxmb286YmFyICAgXG4gICBvbmU9IjEiXHR0d289MiAgID4iIiIKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrX2V4dHJhKHMsIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiZm9vOmJhciIsIFsoIm9uZSIsICIxIiksICgidHdvIiwgIjIiKV0pLAorICAgICAgICAgICAgKCJzdGFydHRhZ190ZXh0IiwgcyldKQorCisgICAgZGVmIHRlc3RfY2RhdGFfY29udGVudChzZWxmKToKKyAgICAgICAgY29udGVudHMgPSBbCisgICAgICAgICAgICAnPCEtLSBub3QgYSBjb21tZW50IC0tPiAmbm90LWFuLWVudGl0eS1yZWY7JywKKyAgICAgICAgICAgICI8bm90IGE9J3N0YXJ0IHRhZyc+IiwKKyAgICAgICAgICAgICc8YSBocmVmPSIiIC8+IDxwPiA8c3Bhbj48L3NwYW4+JywKKyAgICAgICAgICAgICdmb28gPSAiPC9zY3IiICsgImlwdD4iOycsCisgICAgICAgICAgICAnZm9vID0gIjwvU0NSSVBUIiArICI+IjsnLAorICAgICAgICAgICAgJ2ZvbyA9IDxcbi9zY3JpcHQ+ICcsCisgICAgICAgICAgICAnPCEtLSBkb2N1bWVudC53cml0ZSgiPC9zY3IiICsgImlwdD4iKTsgLS0+JywKKyAgICAgICAgICAgICgnXG4vLzwhW0NEQVRBW1xuJworICAgICAgICAgICAgICdkb2N1bWVudC53cml0ZShcJzxzXCcrXCdjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiICcKKyAgICAgICAgICAgICAnc3JjPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL3I9XCcrbmV3ICcKKyAgICAgICAgICAgICAnRGF0ZSgpLmdldFRpbWUoKStcJyI+PFxcL3NcJytcJ2NyaXB0PlwnKTtcbi8vXV0+JyksCisgICAgICAgICAgICAnXG48IS0tIC8vXG52YXIgZm9vID0gMy4xNDtcbi8vIC0tPlxuJywKKyAgICAgICAgICAgICdmb28gPSAiPC9zdHkiICsgImxlPiI7JywKKyAgICAgICAgICAgIHUnPCEtLSBcdTI2MDMgLS0+JywKKyAgICAgICAgICAgICMgdGhlc2UgdHdvIHNob3VsZCBiZSBpbnZhbGlkIGFjY29yZGluZyB0byB0aGUgSFRNTCA1IHNwZWMsCisgICAgICAgICAgICAjIHNlY3Rpb24gOC4xLjIuMgorICAgICAgICAgICAgIydmb28gPSA8L1xuc2NyaXB0PicsCisgICAgICAgICAgICAjJ2ZvbyA9IDwvIHNjcmlwdD4nLAorICAgICAgICBdCisgICAgICAgIGVsZW1lbnRzID0gWydzY3JpcHQnLCAnc3R5bGUnLCAnU0NSSVBUJywgJ1NUWUxFJywgJ1NjcmlwdCcsICdTdHlsZSddCisgICAgICAgIGZvciBjb250ZW50IGluIGNvbnRlbnRzOgorICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gZWxlbWVudHM6CisgICAgICAgICAgICAgICAgZWxlbWVudF9sb3dlciA9IGVsZW1lbnQubG93ZXIoKQorICAgICAgICAgICAgICAgIHMgPSB1Jzx7ZWxlbWVudH0+e2NvbnRlbnR9PC97ZWxlbWVudH0+Jy5mb3JtYXQoZWxlbWVudD1lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudD1jb250ZW50KQorICAgICAgICAgICAgICAgIHNlbGYuX3J1bl9jaGVjayhzLCBbKCJzdGFydHRhZyIsIGVsZW1lbnRfbG93ZXIsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZGF0YSIsIGNvbnRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJlbmR0YWciLCBlbGVtZW50X2xvd2VyKV0pCisKKyAgICBkZWYgdGVzdF9jZGF0YV93aXRoX2Nsb3NpbmdfdGFncyhzZWxmKToKKyAgICAgICAgIyBzZWUgaXNzdWUgIzEzMzU4CisgICAgICAgICMgbWFrZSBzdXJlIHRoYXQgSFRNTFBhcnNlciBjYWxscyBoYW5kbGVfZGF0YSBvbmx5IG9uY2UgZm9yIGVhY2ggQ0RBVEEuCisgICAgICAgICMgVGhlIG5vcm1hbCBldmVudCBjb2xsZWN0b3Igbm9ybWFsaXplcyB0aGUgZXZlbnRzIGluIGdldF9ldmVudHMsCisgICAgICAgICMgc28gd2Ugb3ZlcnJpZGUgaXQgdG8gcmV0dXJuIHRoZSBvcmlnaW5hbCBsaXN0IG9mIGV2ZW50cy4KKyAgICAgICAgY2xhc3MgQ29sbGVjdG9yKEV2ZW50Q29sbGVjdG9yKToKKyAgICAgICAgICAgIGRlZiBnZXRfZXZlbnRzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmV2ZW50cworCisgICAgICAgIGNvbnRlbnQgPSAiIiI8IS0tIG5vdCBhIGNvbW1lbnQgLS0+ICZub3QtYW4tZW50aXR5LXJlZjsKKyAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiIgLz4gPC9wPjxwPiAmYW1wOyA8c3Bhbj48L3NwYW4+PC9zdHlsZT4KKyAgICAgICAgICAgICAgICAgICc8L3NjcmlwdCcgKyAnPicgPC9odG1sPiA8L2hlYWQ+IDwvc2NyaXB0ZXI+ISIiIgorICAgICAgICBmb3IgZWxlbWVudCBpbiBbJyBzY3JpcHQnLCAnc2NyaXB0ICcsICcgc2NyaXB0ICcsCisgICAgICAgICAgICAgICAgICAgICAgICAnXG5zY3JpcHQnLCAnc2NyaXB0XG4nLCAnXG5zY3JpcHRcbiddOgorICAgICAgICAgICAgcyA9IHUnPHNjcmlwdD57Y29udGVudH08L3tlbGVtZW50fT4nLmZvcm1hdChlbGVtZW50PWVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ9Y29udGVudCkKKyAgICAgICAgICAgIHNlbGYuX3J1bl9jaGVjayhzLCBbKCJzdGFydHRhZyIsICJzY3JpcHQiLCBbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZGF0YSIsIGNvbnRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImVuZHRhZyIsICJzY3JpcHQiKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdG9yPUNvbGxlY3RvcikKKworICAgIGRlZiB0ZXN0X21hbGZvcm1hdHRlZF9jaGFycmVmKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxwPiYjYmFkOzwvcD4iLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgInAiLCBbXSksCisgICAgICAgICAgICAoImRhdGEiLCAiJiNiYWQ7IiksCisgICAgICAgICAgICAoImVuZHRhZyIsICJwIiksCisgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF91bmVzY2FwZV9mdW5jdGlvbihzZWxmKToKKyAgICAgICAgcGFyc2VyID0gSFRNTFBhcnNlci5IVE1MUGFyc2VyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIudW5lc2NhcGUoJyYjYmFkOycpLCcmI2JhZDsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci51bmVzY2FwZSgnJiMwMDM4OycpLCcmJykKKworCisKK2NsYXNzIEF0dHJpYnV0ZXNUZXN0Q2FzZShUZXN0Q2FzZUJhc2UpOgorCisgICAgZGVmIHRlc3RfYXR0cl9zeW50YXgoc2VsZik6CisgICAgICAgIG91dHB1dCA9IFsKKyAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgInYiKSwgKCJjIiwgInYiKSwgKCJkIiwgInYiKSwgKCJlIiwgTm9uZSldKQorICAgICAgICBdCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiIiI8YSBiPSd2JyBjPSJ2IiBkPXYgZT4iIiIsIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCIiIjxhICBiID0gJ3YnIGMgPSAidiIgZCA9IHYgZT4iIiIsIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCIiIjxhXG5iXG49XG4ndidcbmNcbj1cbiJ2IlxuZFxuPVxudlxuZT4iIiIsIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCIiIjxhXHRiXHQ9XHQndidcdGNcdD1cdCJ2Ilx0ZFx0PVx0dlx0ZT4iIiIsIG91dHB1dCkKKworICAgIGRlZiB0ZXN0X2F0dHJfdmFsdWVzKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIiIiPGEgYj0neHh4XG5cdHh4eCcgYz0ieXl5XHRcbnl5eSIgZD0nXHR4eXpcbic+IiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAieHh4XG5cdHh4eCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCAieXl5XHRcbnl5eSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImQiLCAiXHR4eXpcbiIpXSldKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIiIiPGEgYj0nJyBjPSIiPiIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIiIpLCAoImMiLCAiIildKV0pCisgICAgICAgICMgUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBwYXRjaCAjNjY5NjgzLgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxlIGE9cmdiKDEsMiwzKT4iLAorICAgICAgICAgICAgICAgICAgICAgICAgWygic3RhcnR0YWciLCAiZSIsIFsoImEiLCAicmdiKDEsMiwzKSIpXSldKQorICAgICAgICAjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM5MjE2NTcuCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygKKyAgICAgICAgICAgICI8YSBocmVmPW1haWx0bzp4eXpAZXhhbXBsZS5jb20+IiwKKyAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJocmVmIiwgIm1haWx0bzp4eXpAZXhhbXBsZS5jb20iKV0pXSkKKworICAgIGRlZiB0ZXN0X2F0dHJfbm9uYXNjaWkoc2VsZik6CisgICAgICAgICMgc2VlIGlzc3VlIDczMTEKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKAorICAgICAgICAgICAgdSI8aW1nIHNyYz0vZm9vL2Jhci5wbmcgYWx0PVx1NGUyZFx1NjU4Nz4iLAorICAgICAgICAgICAgWygic3RhcnR0YWciLCAiaW1nIiwgWygic3JjIiwgIi9mb28vYmFyLnBuZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYWx0IiwgdSJcdTRlMmRcdTY1ODciKV0pXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKAorICAgICAgICAgICAgdSI8YSB0aXRsZT0nXHUzMGM2XHUzMGI5XHUzMGM4JyBocmVmPSdcdTMwYzZcdTMwYjlcdTMwYzguaHRtbCc+IiwKKyAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJ0aXRsZSIsIHUiXHUzMGM2XHUzMGI5XHUzMGM4IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaHJlZiIsIHUiXHUzMGM2XHUzMGI5XHUzMGM4Lmh0bWwiKV0pXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKAorICAgICAgICAgICAgdSc8YSB0aXRsZT0iXHUzMGM2XHUzMGI5XHUzMGM4IiBocmVmPSJcdTMwYzZcdTMwYjlcdTMwYzguaHRtbCI+JywKKyAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJ0aXRsZSIsIHUiXHUzMGM2XHUzMGI5XHUzMGM4IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaHJlZiIsIHUiXHUzMGM2XHUzMGI5XHUzMGM4Lmh0bWwiKV0pXSkKKworICAgIGRlZiB0ZXN0X2F0dHJfZW50aXR5X3JlcGxhY2VtZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soCisgICAgICAgICAgICAiPGEgYj0nJmFtcDsmZ3Q7Jmx0OyZxdW90OyZhcG9zOyc+IiwKKyAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIiY+PFwiJyIpXSldKQorCisgICAgZGVmIHRlc3RfYXR0cl9mdW5reV9uYW1lcyhzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKAorICAgICAgICAgICAgIjxhIGEuYj0ndicgYzpkPXYgZS1mPXY+IiwKKyAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJhLmIiLCAidiIpLCAoImM6ZCIsICJ2IiksICgiZS1mIiwgInYiKV0pXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKAorICAgICAgICAgICAgIjxhICQ+PGIgJD0lPjxjIFw9Lz4iLAorICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoIiQiLCBOb25lKV0pLAorICAgICAgICAgICAgICgic3RhcnR0YWciLCAiYiIsIFsoIiQiLCAiJSIpXSksCisgICAgICAgICAgICAgKCJzdGFydHRhZyIsICJjIiwgWygiXFwiLCAiLyIpXSldKQorCisgICAgZGVmIHRlc3RfZW50aXR5cmVmc19pbl9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soCisgICAgICAgICAgICAiPGh0bWwgZm9vPScmZXVybzsmYW1wOyYjOTc7JiN4NjE7JnVuc3VwcG9ydGVkOyc+IiwKKyAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImh0bWwiLCBbKCJmb28iLCB1Ilx1MjBBQyZhYSZ1bnN1cHBvcnRlZDsiKV0pXSkKKworICAgIGRlZiB0ZXN0X2VudGl0aWVzX2luX2F0dHJpYnV0ZV92YWx1ZShzZWxmKToKKyAgICAgICAgIyBzZWUgIzEyMDAzMTMKKyAgICAgICAgZm9yIGVudGl0eSBpbiBbJyYnLCAnJmFtcDsnLCAnJiMzODsnLCAnJiN4MjY7J106CisgICAgICAgICAgICBzZWxmLl9ydW5fY2hlY2soJzxhIGhyZWY9IiVzIj4nICUgZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJocmVmIiwgIiYiKV0pXSkKKyAgICAgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGEgaHJlZj0nJXMnPiIgJSBlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoImhyZWYiLCAiJiIpXSldKQorICAgICAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8YSBocmVmPSVzPiIgJSBlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoImhyZWYiLCAiJiIpXSldKQorCisgICAgZGVmIHRlc3RfbWFsZm9ybWVkX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgICMgc2VlICMxMzM1NworICAgICAgICBodG1sID0gKAorICAgICAgICAgICAgIjxhIGhyZWY9dGVzdCdzdHlsZT0nY29sb3I6cmVkO2JhZDEnPnRlc3QgLSBiYWQxPC9hPiIKKyAgICAgICAgICAgICI8YSBocmVmPXRlc3QnK3N0eWxlPSdjb2xvcjpyZWQ7YmEyJz50ZXN0IC0gYmFkMjwvYT4iCisgICAgICAgICAgICAiPGEgaHJlZj10ZXN0JyZuYnNwO3N0eWxlPSdjb2xvcjpyZWQ7YmFkMyc+dGVzdCAtIGJhZDM8L2E+IgorICAgICAgICAgICAgIjxhIGhyZWYgPSB0ZXN0JyZuYnNwO3N0eWxlPSdjb2xvcjpyZWQ7YmFkNCcgID50ZXN0IC0gYmFkNDwvYT4iCisgICAgICAgICkKKyAgICAgICAgZXhwZWN0ZWQgPSBbCisgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2EnLCBbKCdocmVmJywgInRlc3Qnc3R5bGU9J2NvbG9yOnJlZDtiYWQxJyIpXSksCisgICAgICAgICAgICAoJ2RhdGEnLCAndGVzdCAtIGJhZDEnKSwgKCdlbmR0YWcnLCAnYScpLAorICAgICAgICAgICAgKCdzdGFydHRhZycsICdhJywgWygnaHJlZicsICJ0ZXN0JytzdHlsZT0nY29sb3I6cmVkO2JhMiciKV0pLAorICAgICAgICAgICAgKCdkYXRhJywgJ3Rlc3QgLSBiYWQyJyksICgnZW5kdGFnJywgJ2EnKSwKKyAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYScsIFsoJ2hyZWYnLCB1InRlc3QnXHhhMHN0eWxlPSdjb2xvcjpyZWQ7YmFkMyciKV0pLAorICAgICAgICAgICAgKCdkYXRhJywgJ3Rlc3QgLSBiYWQzJyksICgnZW5kdGFnJywgJ2EnKSwKKyAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYScsIFsoJ2hyZWYnLCB1InRlc3QnXHhhMHN0eWxlPSdjb2xvcjpyZWQ7YmFkNCciKV0pLAorICAgICAgICAgICAgKCdkYXRhJywgJ3Rlc3QgLSBiYWQ0JyksICgnZW5kdGFnJywgJ2EnKQorICAgICAgICBdCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhodG1sLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X21hbGZvcm1lZF9hZGphY2VudF9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICAjIHNlZSAjMTI2MjkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCc8eD48eSB6PSIibyIiIC8+PC94PicsCisgICAgICAgICAgICAgICAgICAgICAgICBbKCdzdGFydHRhZycsICd4JywgW10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnc3RhcnRlbmR0YWcnLCAneScsIFsoJ3onLCAnJyksICgnbyIiJywgTm9uZSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2VuZHRhZycsICd4JyldKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soJzx4Pjx5IHo9IiIiIiAvPjwveD4nLAorICAgICAgICAgICAgICAgICAgICAgICAgWygnc3RhcnR0YWcnLCAneCcsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3N0YXJ0ZW5kdGFnJywgJ3knLCBbKCd6JywgJycpLCAoJyIiJywgTm9uZSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2VuZHRhZycsICd4JyldKQorCisgICAgIyBzZWUgIzc1NTY3MCBmb3IgdGhlIGZvbGxvd2luZyAzIHRlc3RzCisgICAgZGVmIHRlc3RfYWRqYWNlbnRfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCc8YSB3aWR0aD0iMTAwJSJjZWxsc3BhY2luZz0wPicsCisgICAgICAgICAgICAgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWygid2lkdGgiLCAiMTAwJSIpLCAoImNlbGxzcGFjaW5nIiwiMCIpXSldKQorCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygnPGEgaWQ9ImZvbyJjbGFzcz0iYmFyIj4nLAorICAgICAgICAgICAgICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoImlkIiwgImZvbyIpLCAoImNsYXNzIiwiYmFyIildKV0pCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2F0dHJpYnV0ZV92YWx1ZShzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCc8YSB2PT4nLAorICAgICAgICAgICAgICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoInYiLCAiIildKV0pCisKKyAgICBkZWYgdGVzdF9qYXZhc2NyaXB0X2F0dHJpYnV0ZV92YWx1ZShzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8YSBocmVmPWphdmFzY3JpcHQ6cG9wdXAoJy9wb3B1cC9oZWxwLmh0bWwnKT4iLAorICAgICAgICAgICAgICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoImhyZWYiLCAiamF2YXNjcmlwdDpwb3B1cCgnL3BvcHVwL2hlbHAuaHRtbCcpIildKV0pCisKKyAgICBkZWYgdGVzdF9lbmRfdGFnX2luX2F0dHJpYnV0ZV92YWx1ZShzZWxmKToKKyAgICAgICAgIyBzZWUgIzE3NDU3NjEKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8YSBocmVmPSdodHRwOi8vd3d3LmV4YW1wbGUub3JnL1wiPjsnPnNwYW08L2E+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKCJocmVmIiwgImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvXCI+OyIpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJkYXRhIiwgInNwYW0iKSwgKCJlbmR0YWciLCAiYSIpXSkKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRzKHNlbGYpOgorICAgICAgICBodG1sID0gKCI8IS0tIEknbSBhIHZhbGlkIGNvbW1lbnQgLS0+IgorICAgICAgICAgICAgICAgICc8IS0tbWUgdG9vIS0tPicKKyAgICAgICAgICAgICAgICAnPCEtLS0tLS0+JworICAgICAgICAgICAgICAgICc8IS0tLS0+JworICAgICAgICAgICAgICAgICc8IS0tLS1JIGhhdmUgbWFueSBoeXBoZW5zLS0tLT4nCisgICAgICAgICAgICAgICAgJzwhLS0gSSBoYXZlIGEgPiBpbiB0aGUgbWlkZGxlIC0tPicKKyAgICAgICAgICAgICAgICAnPCEtLSBhbmQgSSBoYXZlIC0tIGluIHRoZSBtaWRkbGUhIC0tPicpCisgICAgICAgIGV4cGVjdGVkID0gWygnY29tbWVudCcsICIgSSdtIGEgdmFsaWQgY29tbWVudCAiKSwKKyAgICAgICAgICAgICAgICAgICAgKCdjb21tZW50JywgJ21lIHRvbyEnKSwKKyAgICAgICAgICAgICAgICAgICAgKCdjb21tZW50JywgJy0tJyksCisgICAgICAgICAgICAgICAgICAgICgnY29tbWVudCcsICcnKSwKKyAgICAgICAgICAgICAgICAgICAgKCdjb21tZW50JywgJy0tSSBoYXZlIG1hbnkgaHlwaGVucy0tJyksCisgICAgICAgICAgICAgICAgICAgICgnY29tbWVudCcsICcgSSBoYXZlIGEgPiBpbiB0aGUgbWlkZGxlICcpLAorICAgICAgICAgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnIGFuZCBJIGhhdmUgLS0gaW4gdGhlIG1pZGRsZSEgJyldCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhodG1sLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2Jyb2tlbl9jb21tZW50cyhzZWxmKToKKyAgICAgICAgaHRtbCA9ICgnPCEgbm90IHJlYWxseSBhIGNvbW1lbnQgPicKKyAgICAgICAgICAgICAgICAnPCEgbm90IGEgY29tbWVudCBlaXRoZXIgLS0+JworICAgICAgICAgICAgICAgICc8ISAtLSBjbG9zZSBlbm91Z2ggLS0+JworICAgICAgICAgICAgICAgICc8IT48ITwtLSB0aGlzIHdhcyBhbiBlbXB0eSBjb21tZW50PicKKyAgICAgICAgICAgICAgICAnPCEhISBhbm90aGVyIGJvZ3VzIGNvbW1lbnQgISEhPicpCisgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgKCdjb21tZW50JywgJyBub3QgcmVhbGx5IGEgY29tbWVudCAnKSwKKyAgICAgICAgICAgICgnY29tbWVudCcsICcgbm90IGEgY29tbWVudCBlaXRoZXIgLS0nKSwKKyAgICAgICAgICAgICgnY29tbWVudCcsICcgLS0gY2xvc2UgZW5vdWdoIC0tJyksCisgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnJyksCisgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnPC0tIHRoaXMgd2FzIGFuIGVtcHR5IGNvbW1lbnQnKSwKKyAgICAgICAgICAgICgnY29tbWVudCcsICchISBhbm90aGVyIGJvZ3VzIGNvbW1lbnQgISEhJyksCisgICAgICAgIF0KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKGh0bWwsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfY29uZGNvbXMoc2VsZik6CisgICAgICAgIGh0bWwgPSAoJzwhLS1baWYgSUUgJiAhKGx0ZSBJRSA4KV0+YXJlblwndDwhW2VuZGlmXS0tPicKKyAgICAgICAgICAgICAgICAnPCEtLVtpZiBJRSA4XT5jb25kY29tczwhW2VuZGlmXS0tPicKKyAgICAgICAgICAgICAgICAnPCEtLVtpZiBsdGUgSUUgN10+cHJldHR5PzwhW2VuZGlmXS0tPicpCisgICAgICAgIGV4cGVjdGVkID0gWygnY29tbWVudCcsICJbaWYgSUUgJiAhKGx0ZSBJRSA4KV0+YXJlbid0PCFbZW5kaWZdIiksCisgICAgICAgICAgICAgICAgICAgICgnY29tbWVudCcsICdbaWYgSUUgOF0+Y29uZGNvbXM8IVtlbmRpZl0nKSwKKyAgICAgICAgICAgICAgICAgICAgKCdjb21tZW50JywgJ1tpZiBsdGUgSUUgN10+cHJldHR5PzwhW2VuZGlmXScpXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soaHRtbCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9icm9rZW5fY29uZGNvbXMoc2VsZik6CisgICAgICAgICMgdGhlc2UgY29uZGNvbXMgYXJlIG1pc3NpbmcgdGhlICctLScgYWZ0ZXIgJzwhJyBhbmQgYmVmb3JlIHRoZSAnPicKKyAgICAgICAgaHRtbCA9ICgnPCFbaWYgIShJRSldPmJyb2tlbiBjb25kY29tPCFbZW5kaWZdPicKKyAgICAgICAgICAgICAgICAnPCFbaWYgISBJRV0+PGxpbmsgaHJlZj0iZmF2aWNvbi50aWZmIi8+PCFbZW5kaWZdPicKKyAgICAgICAgICAgICAgICAnPCFbaWYgIUlFIDZdPjxpbWcgc3JjPSJmaXJlZm94LnBuZyIgLz48IVtlbmRpZl0+JworICAgICAgICAgICAgICAgICc8IVtpZiAhaWUgNl0+PGI+Zm9vPC9iPjwhW2VuZGlmXT4nCisgICAgICAgICAgICAgICAgJzwhW2lmICghSUUpfChsdCBJRSA5KV0+PGltZyBzcmM9Im1hbW1vdGguYm1wIiAvPjwhW2VuZGlmXT4nKQorICAgICAgICAjIEFjY29yZGluZyB0byB0aGUgSFRNTDUgc3BlY3Mgc2VjdGlvbnMgIjguMi40LjQ0IEJvZ3VzIGNvbW1lbnQgc3RhdGUiCisgICAgICAgICMgYW5kICI4LjIuNC40NSBNYXJrdXAgZGVjbGFyYXRpb24gb3BlbiBzdGF0ZSIsIGNvbW1lbnQgdG9rZW5zIHNob3VsZAorICAgICAgICAjIGJlIGVtaXR0ZWQgaW5zdGVhZCBvZiAndW5rbm93biBkZWNsJywgYnV0IGNhbGxpbmcgdW5rbm93bl9kZWNsCisgICAgICAgICMgcHJvdmlkZXMgbW9yZSBmbGV4aWJpbGl0eS4KKyAgICAgICAgIyBTZWUgYWxzbyBMaWIvX21hcmt1cGJhc2UucHk6cGFyc2VfZGVjbGFyYXRpb24KKyAgICAgICAgZXhwZWN0ZWQgPSBbCisgICAgICAgICAgICAoJ3Vua25vd24gZGVjbCcsICdpZiAhKElFKScpLAorICAgICAgICAgICAgKCdkYXRhJywgJ2Jyb2tlbiBjb25kY29tJyksCisgICAgICAgICAgICAoJ3Vua25vd24gZGVjbCcsICdlbmRpZicpLAorICAgICAgICAgICAgKCd1bmtub3duIGRlY2wnLCAnaWYgISBJRScpLAorICAgICAgICAgICAgKCdzdGFydGVuZHRhZycsICdsaW5rJywgWygnaHJlZicsICdmYXZpY29uLnRpZmYnKV0pLAorICAgICAgICAgICAgKCd1bmtub3duIGRlY2wnLCAnZW5kaWYnKSwKKyAgICAgICAgICAgICgndW5rbm93biBkZWNsJywgJ2lmICFJRSA2JyksCisgICAgICAgICAgICAoJ3N0YXJ0ZW5kdGFnJywgJ2ltZycsIFsoJ3NyYycsICdmaXJlZm94LnBuZycpXSksCisgICAgICAgICAgICAoJ3Vua25vd24gZGVjbCcsICdlbmRpZicpLAorICAgICAgICAgICAgKCd1bmtub3duIGRlY2wnLCAnaWYgIWllIDYnKSwKKyAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYicsIFtdKSwKKyAgICAgICAgICAgICgnZGF0YScsICdmb28nKSwKKyAgICAgICAgICAgICgnZW5kdGFnJywgJ2InKSwKKyAgICAgICAgICAgICgndW5rbm93biBkZWNsJywgJ2VuZGlmJyksCisgICAgICAgICAgICAoJ3Vua25vd24gZGVjbCcsICdpZiAoIUlFKXwobHQgSUUgOSknKSwKKyAgICAgICAgICAgICgnc3RhcnRlbmR0YWcnLCAnaW1nJywgWygnc3JjJywgJ21hbW1vdGguYm1wJyldKSwKKyAgICAgICAgICAgICgndW5rbm93biBkZWNsJywgJ2VuZGlmJykKKyAgICAgICAgXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soaHRtbCwgZXhwZWN0ZWQpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoSFRNTFBhcnNlclRlc3RDYXNlLCBBdHRyaWJ1dGVzVGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odG1scGFyc2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk0ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odG1scGFyc2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk0ZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cGxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0dHBsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U4MWEyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0dHBsaWIucHkKQEAgLTAsMCArMSw1MzIgQEAKK2ltcG9ydCBodHRwbGliCitpbXBvcnQgYXJyYXkKK2ltcG9ydCBodHRwbGliCitpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBlcnJubworCitpbXBvcnQgdW5pdHRlc3QKK1Rlc3RDYXNlID0gdW5pdHRlc3QuVGVzdENhc2UKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworSE9TVCA9IHRlc3Rfc3VwcG9ydC5IT1NUCisKK2NsYXNzIEZha2VTb2NrZXQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQsIGZpbGVjbGFzcz1TdHJpbmdJTy5TdHJpbmdJTyk6CisgICAgICAgIHNlbGYudGV4dCA9IHRleHQKKyAgICAgICAgc2VsZi5maWxlY2xhc3MgPSBmaWxlY2xhc3MKKyAgICAgICAgc2VsZi5kYXRhID0gJycKKworICAgIGRlZiBzZW5kYWxsKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmRhdGEgKz0gJycuam9pbihkYXRhKQorCisgICAgZGVmIG1ha2VmaWxlKHNlbGYsIG1vZGUsIGJ1ZnNpemU9Tm9uZSk6CisgICAgICAgIGlmIG1vZGUgIT0gJ3InIGFuZCBtb2RlICE9ICdyYic6CisgICAgICAgICAgICByYWlzZSBodHRwbGliLlVuaW1wbGVtZW50ZWRGaWxlTW9kZSgpCisgICAgICAgIHJldHVybiBzZWxmLmZpbGVjbGFzcyhzZWxmLnRleHQpCisKK2NsYXNzIEVQaXBlU29ja2V0KEZha2VTb2NrZXQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHQsIHBpcGVfdHJpZ2dlcik6CisgICAgICAgICMgV2hlbiBzZW5kYWxsKCkgaXMgY2FsbGVkIHdpdGggcGlwZV90cmlnZ2VyLCByYWlzZSBFUElQRS4KKyAgICAgICAgRmFrZVNvY2tldC5fX2luaXRfXyhzZWxmLCB0ZXh0KQorICAgICAgICBzZWxmLnBpcGVfdHJpZ2dlciA9IHBpcGVfdHJpZ2dlcgorCisgICAgZGVmIHNlbmRhbGwoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIHNlbGYucGlwZV90cmlnZ2VyIGluIGRhdGE6CisgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IoZXJybm8uRVBJUEUsICJnb3RjaGEiKQorICAgICAgICBzZWxmLmRhdGEgKz0gZGF0YQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIE5vRU9GU3RyaW5nSU8oU3RyaW5nSU8uU3RyaW5nSU8pOgorICAgICIiIkxpa2UgU3RyaW5nSU8sIGJ1dCByYWlzZXMgQXNzZXJ0aW9uRXJyb3Igb24gRU9GLgorCisgICAgVGhpcyBpcyB1c2VkIGJlbG93IHRvIHRlc3QgdGhhdCBodHRwbGliIGRvZXNuJ3QgdHJ5IHRvIHJlYWQKKyAgICBtb3JlIGZyb20gdGhlIHVuZGVybHlpbmcgZmlsZSB0aGFuIGl0IHNob3VsZC4KKyAgICAiIiIKKyAgICBkZWYgcmVhZChzZWxmLCBuPS0xKToKKyAgICAgICAgZGF0YSA9IFN0cmluZ0lPLlN0cmluZ0lPLnJlYWQoc2VsZiwgbikKKyAgICAgICAgaWYgZGF0YSA9PSAnJzoKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdjYWxsZXIgdHJpZWQgdG8gcmVhZCBwYXN0IEVPRicpCisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgbGVuZ3RoPU5vbmUpOgorICAgICAgICBkYXRhID0gU3RyaW5nSU8uU3RyaW5nSU8ucmVhZGxpbmUoc2VsZiwgbGVuZ3RoKQorICAgICAgICBpZiBkYXRhID09ICcnOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ2NhbGxlciB0cmllZCB0byByZWFkIHBhc3QgRU9GJykKKyAgICAgICAgcmV0dXJuIGRhdGEKKworCitjbGFzcyBIZWFkZXJUZXN0cyhUZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYXV0b19oZWFkZXJzKHNlbGYpOgorICAgICAgICAjIFNvbWUgaGVhZGVycyBhcmUgYWRkZWQgYXV0b21hdGljYWxseSwgYnV0IHNob3VsZCBub3QgYmUgYWRkZWQgYnkKKyAgICAgICAgIyAucmVxdWVzdCgpIGlmIHRoZXkgYXJlIGV4cGxpY2l0bHkgc2V0LgorCisgICAgICAgIGNsYXNzIEhlYWRlckNvdW50aW5nQnVmZmVyKGxpc3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuY291bnQgPSB7fQorICAgICAgICAgICAgZGVmIGFwcGVuZChzZWxmLCBpdGVtKToKKyAgICAgICAgICAgICAgICBrdiA9IGl0ZW0uc3BsaXQoJzonKQorICAgICAgICAgICAgICAgIGlmIGxlbihrdikgPiAxOgorICAgICAgICAgICAgICAgICAgICAjIGl0ZW0gaXMgYSAnS2V5OiBWYWx1ZScgaGVhZGVyIHN0cmluZworICAgICAgICAgICAgICAgICAgICBsY0tleSA9IGt2WzBdLmxvd2VyKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb3VudC5zZXRkZWZhdWx0KGxjS2V5LCAwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvdW50W2xjS2V5XSArPSAxCisgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQoc2VsZiwgaXRlbSkKKworICAgICAgICBmb3IgZXhwbGljaXRfaGVhZGVyIGluIFRydWUsIEZhbHNlOgorICAgICAgICAgICAgZm9yIGhlYWRlciBpbiAnQ29udGVudC1sZW5ndGgnLCAnSG9zdCcsICdBY2NlcHQtZW5jb2RpbmcnOgorICAgICAgICAgICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCisgICAgICAgICAgICAgICAgY29ubi5zb2NrID0gRmFrZVNvY2tldCgnYmxhaGJsYWhibGFoJykKKyAgICAgICAgICAgICAgICBjb25uLl9idWZmZXIgPSBIZWFkZXJDb3VudGluZ0J1ZmZlcigpCisKKyAgICAgICAgICAgICAgICBib2R5ID0gJ3NwYW1zcGFtc3BhbScKKyAgICAgICAgICAgICAgICBoZWFkZXJzID0ge30KKyAgICAgICAgICAgICAgICBpZiBleHBsaWNpdF9oZWFkZXI6CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNbaGVhZGVyXSA9IHN0cihsZW4oYm9keSkpCisgICAgICAgICAgICAgICAgY29ubi5yZXF1ZXN0KCdQT1NUJywgJy8nLCBib2R5LCBoZWFkZXJzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5fYnVmZmVyLmNvdW50W2hlYWRlci5sb3dlcigpXSwgMSkKKworICAgIGRlZiB0ZXN0X2NvbnRlbnRfbGVuZ3RoXzAoc2VsZik6CisKKyAgICAgICAgY2xhc3MgQ29udGVudExlbmd0aENoZWNrZXIobGlzdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgbGlzdC5fX2luaXRfXyhzZWxmKQorICAgICAgICAgICAgICAgIHNlbGYuY29udGVudF9sZW5ndGggPSBOb25lCisgICAgICAgICAgICBkZWYgYXBwZW5kKHNlbGYsIGl0ZW0pOgorICAgICAgICAgICAgICAgIGt2ID0gaXRlbS5zcGxpdCgnOicsIDEpCisgICAgICAgICAgICAgICAgaWYgbGVuKGt2KSA+IDEgYW5kIGt2WzBdLmxvd2VyKCkgPT0gJ2NvbnRlbnQtbGVuZ3RoJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250ZW50X2xlbmd0aCA9IGt2WzFdLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChzZWxmLCBpdGVtKQorCisgICAgICAgICMgUE9TVCB3aXRoIGVtcHR5IGJvZHkKKyAgICAgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oJ2V4YW1wbGUuY29tJykKKyAgICAgICAgY29ubi5zb2NrID0gRmFrZVNvY2tldChOb25lKQorICAgICAgICBjb25uLl9idWZmZXIgPSBDb250ZW50TGVuZ3RoQ2hlY2tlcigpCisgICAgICAgIGNvbm4ucmVxdWVzdCgnUE9TVCcsICcvJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5fYnVmZmVyLmNvbnRlbnRfbGVuZ3RoLCAnMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnSGVhZGVyIENvbnRlbnQtTGVuZ3RoIG5vdCBzZXQnKQorCisgICAgICAgICMgUFVUIHJlcXVlc3Qgd2l0aCBlbXB0eSBib2R5CisgICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCisgICAgICAgIGNvbm4uc29jayA9IEZha2VTb2NrZXQoTm9uZSkKKyAgICAgICAgY29ubi5fYnVmZmVyID0gQ29udGVudExlbmd0aENoZWNrZXIoKQorICAgICAgICBjb25uLnJlcXVlc3QoJ1BVVCcsICcvJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5fYnVmZmVyLmNvbnRlbnRfbGVuZ3RoLCAnMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnSGVhZGVyIENvbnRlbnQtTGVuZ3RoIG5vdCBzZXQnKQorCisgICAgZGVmIHRlc3RfcHV0aGVhZGVyKHNlbGYpOgorICAgICAgICBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbignZXhhbXBsZS5jb20nKQorICAgICAgICBjb25uLnNvY2sgPSBGYWtlU29ja2V0KE5vbmUpCisgICAgICAgIGNvbm4ucHV0cmVxdWVzdCgnR0VUJywnLycpCisgICAgICAgIGNvbm4ucHV0aGVhZGVyKCdDb250ZW50LWxlbmd0aCcsNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnQ29udGVudC1sZW5ndGg6IDQyJyBpbiBjb25uLl9idWZmZXIpCisKKyAgICBkZWYgdGVzdF9pcHY2aG9zdF9oZWFkZXIoc2VsZik6CisgICAgICAgICMgRGVmYXVsdCBob3N0IGhlYWRlciBvbiBJUHY2IHRyYW5zYWN0aW9uIHNob3VsZCB3cmFwcGVkIGJ5IFtdIGlmCisgICAgICAgICMgaXRzIGFjdHVhbCBJUHY2IGFkZHJlc3MKKyAgICAgICAgZXhwZWN0ZWQgPSAnR0VUIC9mb28gSFRUUC8xLjFcclxuSG9zdDogWzIwMDE6Ol06ODFcclxuJyBcCisgICAgICAgICAgICAgICAgICAgJ0FjY2VwdC1FbmNvZGluZzogaWRlbnRpdHlcclxuXHJcbicKKyAgICAgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oJ1syMDAxOjpdOjgxJykKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoJycpCisgICAgICAgIGNvbm4uc29jayA9IHNvY2sKKyAgICAgICAgY29ubi5yZXF1ZXN0KCdHRVQnLCAnL2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrLmRhdGEuc3RhcnRzd2l0aChleHBlY3RlZCkpCisKKyAgICAgICAgZXhwZWN0ZWQgPSAnR0VUIC9mb28gSFRUUC8xLjFcclxuSG9zdDogWzIwMDE6MTAyQTo6XVxyXG4nIFwKKyAgICAgICAgICAgICAgICAgICAnQWNjZXB0LUVuY29kaW5nOiBpZGVudGl0eVxyXG5cclxuJworICAgICAgICBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbignWzIwMDE6MTAyQTo6XScpCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KCcnKQorICAgICAgICBjb25uLnNvY2sgPSBzb2NrCisgICAgICAgIGNvbm4ucmVxdWVzdCgnR0VUJywgJy9mb28nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29jay5kYXRhLnN0YXJ0c3dpdGgoZXhwZWN0ZWQpKQorCisKK2NsYXNzIEJhc2ljVGVzdChUZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc3RhdHVzX2xpbmVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgSFRUUCBzdGF0dXMgbGluZXMKKworICAgICAgICBib2R5ID0gIkhUVFAvMS4xIDIwMCBPa1xyXG5cclxuVGV4dCIKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoYm9keSkKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2spCisgICAgICAgIHJlc3AuYmVnaW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3AucmVhZCgpLCAnVGV4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNwLmlzY2xvc2VkKCkpCisKKyAgICAgICAgYm9keSA9ICJIVFRQLzEuMSA0MDAuMTAwIE5vdCBPa1xyXG5cclxuVGV4dCIKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoYm9keSkKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2spCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGh0dHBsaWIuQmFkU3RhdHVzTGluZSwgcmVzcC5iZWdpbikKKworICAgIGRlZiB0ZXN0X2JhZF9zdGF0dXNfcmVwcihzZWxmKToKKyAgICAgICAgZXhjID0gaHR0cGxpYi5CYWRTdGF0dXNMaW5lKCcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZXhjKSwgJycnQmFkU3RhdHVzTGluZSgiXCdcJyIsKScnJykKKworICAgIGRlZiB0ZXN0X3BhcnRpYWxfcmVhZHMoc2VsZik6CisgICAgICAgICMgaWYgd2UgaGF2ZSBhIGxlbmd0aCwgdGhlIHN5c3RlbSBrbm93cyB3aGVuIHRvIGNsb3NlIGl0c2VsZgorICAgICAgICAjIHNhbWUgYmVoYXZpb3VyIHRoYW4gd2hlbiB3ZSByZWFkIHRoZSB3aG9sZSB0aGluZyB3aXRoIHJlYWQoKQorICAgICAgICBib2R5ID0gIkhUVFAvMS4xIDIwMCBPa1xyXG5Db250ZW50LUxlbmd0aDogNFxyXG5cclxuVGV4dCIKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoYm9keSkKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2spCisgICAgICAgIHJlc3AuYmVnaW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3AucmVhZCgyKSwgJ1RlJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXNwLmlzY2xvc2VkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKDIpLCAneHQnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcC5pc2Nsb3NlZCgpKQorCisgICAgZGVmIHRlc3RfcGFydGlhbF9yZWFkc19ub19jb250ZW50X2xlbmd0aChzZWxmKToKKyAgICAgICAgIyB3aGVuIG5vIGxlbmd0aCBpcyBwcmVzZW50LCB0aGUgc29ja2V0IHNob3VsZCBiZSBncmFjZWZ1bGx5IGNsb3NlZCB3aGVuCisgICAgICAgICMgYWxsIGRhdGEgd2FzIHJlYWQKKyAgICAgICAgYm9keSA9ICJIVFRQLzEuMSAyMDAgT2tcclxuXHJcblRleHQiCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrKQorICAgICAgICByZXNwLmJlZ2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoMiksICdUZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzcC5pc2Nsb3NlZCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3AucmVhZCgyKSwgJ3h0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoMSksICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcC5pc2Nsb3NlZCgpKQorCisgICAgZGVmIHRlc3RfcGFydGlhbF9yZWFkc19pbmNvbXBsZXRlX2JvZHkoc2VsZik6CisgICAgICAgICMgaWYgdGhlIHNlcnZlciBzaHV0cyBkb3duIHRoZSBjb25uZWN0aW9uIGJlZm9yZSB0aGUgd2hvbGUKKyAgICAgICAgIyBjb250ZW50LWxlbmd0aCBpcyBkZWxpdmVyZWQsIHRoZSBzb2NrZXQgaXMgZ3JhY2VmdWxseSBjbG9zZWQKKyAgICAgICAgYm9keSA9ICJIVFRQLzEuMSAyMDAgT2tcclxuQ29udGVudC1MZW5ndGg6IDEwXHJcblxyXG5UZXh0IgorICAgICAgICBzb2NrID0gRmFrZVNvY2tldChib2R5KQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaykKKyAgICAgICAgcmVzcC5iZWdpbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKDIpLCAnVGUnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3AuaXNjbG9zZWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoMiksICd4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKDEpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3AuaXNjbG9zZWQoKSkKKworICAgIGRlZiB0ZXN0X2hvc3RfcG9ydChzZWxmKToKKyAgICAgICAgIyBDaGVjayBpbnZhbGlkIGhvc3RfcG9ydAorCisgICAgICAgICMgTm90ZSB0aGF0IGh0dHBsaWIgZG9lcyBub3QgYWNjZXB0IHVzZXI6cGFzc3dvcmRAIGluIHRoZSBob3N0LXBvcnQuCisgICAgICAgIGZvciBocCBpbiAoInd3dy5weXRob24ub3JnOmFiYyIsICJ1c2VyOnBhc3N3b3JkQHd3dy5weXRob24ub3JnIik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhodHRwbGliLkludmFsaWRVUkwsIGh0dHBsaWIuSFRUUCwgaHApCisKKyAgICAgICAgZm9yIGhwLCBoLCBwIGluICgoIltmZTgwOjoyMDc6ZTlmZjpmZTliXTo4MDAwIiwgImZlODA6OjIwNzplOWZmOmZlOWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoInd3dy5weXRob24ub3JnOjgwIiwgInd3dy5weXRob24ub3JnIiwgODApLAorICAgICAgICAgICAgICAgICAgICAgICAgICgid3d3LnB5dGhvbi5vcmciLCAid3d3LnB5dGhvbi5vcmciLCA4MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJ3d3cucHl0aG9uLm9yZzoiLCAid3d3LnB5dGhvbi5vcmciLCA4MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJbZmU4MDo6MjA3OmU5ZmY6ZmU5Yl0iLCAiZmU4MDo6MjA3OmU5ZmY6ZmU5YiIsIDgwKSk6CisgICAgICAgICAgICBodHRwID0gaHR0cGxpYi5IVFRQKGhwKQorICAgICAgICAgICAgYyA9IGh0dHAuX2Nvbm4KKyAgICAgICAgICAgIGlmIGggIT0gYy5ob3N0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiSG9zdCBpbmNvcnJlY3RseSBwYXJzZWQ6ICVzICE9ICVzIiAlIChoLCBjLmhvc3QpKQorICAgICAgICAgICAgaWYgcCAhPSBjLnBvcnQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJQb3J0IGluY29ycmVjdGx5IHBhcnNlZDogJXMgIT0gJXMiICUgKHAsIGMuaG9zdCkpCisKKyAgICBkZWYgdGVzdF9yZXNwb25zZV9oZWFkZXJzKHNlbGYpOgorICAgICAgICAjIHRlc3QgcmVzcG9uc2Ugd2l0aCBtdWx0aXBsZSBtZXNzYWdlIGhlYWRlcnMgd2l0aCB0aGUgc2FtZSBmaWVsZCBuYW1lLgorICAgICAgICB0ZXh0ID0gKCdIVFRQLzEuMSAyMDAgT0tcclxuJworICAgICAgICAgICAgICAgICdTZXQtQ29va2llOiBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7JworICAgICAgICAgICAgICAgICcgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIlxyXG4nCisgICAgICAgICAgICAgICAgJ1NldC1Db29raWU6IFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOycKKyAgICAgICAgICAgICAgICAnIFBhdGg9Ii9hY21lIlxyXG4nCisgICAgICAgICAgICAgICAgJ1xyXG4nCisgICAgICAgICAgICAgICAgJ05vIGJvZHlcclxuJykKKyAgICAgICAgaGRyID0gKCdDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInCisgICAgICAgICAgICAgICAnLCAnCisgICAgICAgICAgICAgICAnUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCisgICAgICAgIHMgPSBGYWtlU29ja2V0KHRleHQpCisgICAgICAgIHIgPSBodHRwbGliLkhUVFBSZXNwb25zZShzKQorICAgICAgICByLmJlZ2luKCkKKyAgICAgICAgY29va2llcyA9IHIuZ2V0aGVhZGVyKCJTZXQtQ29va2llIikKKyAgICAgICAgaWYgY29va2llcyAhPSBoZHI6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm11bHRpcGxlIGhlYWRlcnMgbm90IGNvbWJpbmVkIHByb3Blcmx5IikKKworICAgIGRlZiB0ZXN0X3JlYWRfaGVhZChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgdGhlIGxpYnJhcnkgZG9lc24ndCBhdHRlbXB0IHRvIHJlYWQgYW55IGRhdGEKKyAgICAgICAgIyBmcm9tIGEgSEVBRCByZXF1ZXN0LiAgKFRpY2tsZXMgU0YgYnVnICM2MjIwNDIuKQorICAgICAgICBzb2NrID0gRmFrZVNvY2tldCgKKyAgICAgICAgICAgICdIVFRQLzEuMSAyMDAgT0tcclxuJworICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoOiAxNDQzMlxyXG4nCisgICAgICAgICAgICAnXHJcbicsCisgICAgICAgICAgICBOb0VPRlN0cmluZ0lPKQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaywgbWV0aG9kPSJIRUFEIikKKyAgICAgICAgcmVzcC5iZWdpbigpCisgICAgICAgIGlmIHJlc3AucmVhZCgpICE9ICIiOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWQgbm90IGV4cGVjdCByZXNwb25zZSBmcm9tIEhFQUQgcmVxdWVzdCIpCisKKyAgICBkZWYgdGVzdF9zZW5kX2ZpbGUoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gJ0dFVCAvZm9vIEhUVFAvMS4xXHJcbkhvc3Q6IGV4YW1wbGUuY29tXHJcbicgXAorICAgICAgICAgICAgICAgICAgICdBY2NlcHQtRW5jb2Rpbmc6IGlkZW50aXR5XHJcbkNvbnRlbnQtTGVuZ3RoOicKKworICAgICAgICBib2R5ID0gb3BlbihfX2ZpbGVfXywgJ3JiJykKKyAgICAgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oJ2V4YW1wbGUuY29tJykKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoYm9keSkKKyAgICAgICAgY29ubi5zb2NrID0gc29jaworICAgICAgICBjb25uLnJlcXVlc3QoJ0dFVCcsICcvZm9vJywgYm9keSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2suZGF0YS5zdGFydHN3aXRoKGV4cGVjdGVkKSkKKworICAgIGRlZiB0ZXN0X3NlbmQoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gJ3RoaXMgaXMgYSB0ZXN0IHRoaXMgaXMgb25seSBhIHRlc3QnCisgICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KE5vbmUpCisgICAgICAgIGNvbm4uc29jayA9IHNvY2sKKyAgICAgICAgY29ubi5zZW5kKGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBzb2NrLmRhdGEpCisgICAgICAgIHNvY2suZGF0YSA9ICcnCisgICAgICAgIGNvbm4uc2VuZChhcnJheS5hcnJheSgnYycsIGV4cGVjdGVkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgc29jay5kYXRhKQorICAgICAgICBzb2NrLmRhdGEgPSAnJworICAgICAgICBjb25uLnNlbmQoU3RyaW5nSU8uU3RyaW5nSU8oZXhwZWN0ZWQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBzb2NrLmRhdGEpCisKKyAgICBkZWYgdGVzdF9jaHVua2VkKHNlbGYpOgorICAgICAgICBjaHVua2VkX3N0YXJ0ID0gKAorICAgICAgICAgICAgJ0hUVFAvMS4xIDIwMCBPS1xyXG4nCisgICAgICAgICAgICAnVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcclxuXHJcbicKKyAgICAgICAgICAgICdhXHJcbicKKyAgICAgICAgICAgICdoZWxsbyB3b3JsXHJcbicKKyAgICAgICAgICAgICcxXHJcbicKKyAgICAgICAgICAgICdkXHJcbicKKyAgICAgICAgKQorICAgICAgICBzb2NrID0gRmFrZVNvY2tldChjaHVua2VkX3N0YXJ0ICsgJzBcclxuJykKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2ssIG1ldGhvZD0iR0VUIikKKyAgICAgICAgcmVzcC5iZWdpbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKCksICdoZWxsbyB3b3JsZCcpCisgICAgICAgIHJlc3AuY2xvc2UoKQorCisgICAgICAgIGZvciB4IGluICgnJywgJ2Zvb1xyXG4nKToKKyAgICAgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGNodW5rZWRfc3RhcnQgKyB4KQorICAgICAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2ssIG1ldGhvZD0iR0VUIikKKyAgICAgICAgICAgIHJlc3AuYmVnaW4oKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc3AucmVhZCgpCisgICAgICAgICAgICBleGNlcHQgaHR0cGxpYi5JbmNvbXBsZXRlUmVhZCwgaToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkucGFydGlhbCwgJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoaSksJ0luY29tcGxldGVSZWFkKDExIGJ5dGVzIHJlYWQpJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihpKSwnSW5jb21wbGV0ZVJlYWQoMTEgYnl0ZXMgcmVhZCknKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ0luY29tcGxldGVSZWFkIGV4cGVjdGVkJykKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcmVzcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9jaHVua2VkX2hlYWQoc2VsZik6CisgICAgICAgIGNodW5rZWRfc3RhcnQgPSAoCisgICAgICAgICAgICAnSFRUUC8xLjEgMjAwIE9LXHJcbicKKyAgICAgICAgICAgICdUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxyXG5cclxuJworICAgICAgICAgICAgJ2FcclxuJworICAgICAgICAgICAgJ2hlbGxvIHdvcmxkXHJcbicKKyAgICAgICAgICAgICcxXHJcbicKKyAgICAgICAgICAgICdkXHJcbicKKyAgICAgICAgKQorICAgICAgICBzb2NrID0gRmFrZVNvY2tldChjaHVua2VkX3N0YXJ0ICsgJzBcclxuJykKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2ssIG1ldGhvZD0iSEVBRCIpCisgICAgICAgIHJlc3AuYmVnaW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3AucmVhZCgpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnN0YXR1cywgMjAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3AucmVhc29uLCAnT0snKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcC5pc2Nsb3NlZCgpKQorCisgICAgZGVmIHRlc3RfbmVnYXRpdmVfY29udGVudF9sZW5ndGgoc2VsZik6CisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KCdIVFRQLzEuMSAyMDAgT0tcclxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1MZW5ndGg6IC0xXHJcblxyXG5IZWxsb1xyXG4nKQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaywgbWV0aG9kPSJHRVQiKQorICAgICAgICByZXNwLmJlZ2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoKSwgJ0hlbGxvXHJcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNwLmlzY2xvc2VkKCkpCisKKyAgICBkZWYgdGVzdF9pbmNvbXBsZXRlX3JlYWQoc2VsZik6CisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KCdIVFRQLzEuMSAyMDAgT0tcclxuQ29udGVudC1MZW5ndGg6IDEwXHJcblxyXG5IZWxsb1xyXG4nKQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaywgbWV0aG9kPSJHRVQiKQorICAgICAgICByZXNwLmJlZ2luKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzcC5yZWFkKCkKKyAgICAgICAgZXhjZXB0IGh0dHBsaWIuSW5jb21wbGV0ZVJlYWQgYXMgaToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5wYXJ0aWFsLCAnSGVsbG9cclxuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluY29tcGxldGVSZWFkKDcgYnl0ZXMgcmVhZCwgMyBtb3JlIGV4cGVjdGVkKSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluY29tcGxldGVSZWFkKDcgYnl0ZXMgcmVhZCwgMyBtb3JlIGV4cGVjdGVkKSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcC5pc2Nsb3NlZCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdJbmNvbXBsZXRlUmVhZCBleHBlY3RlZCcpCisKKyAgICBkZWYgdGVzdF9lcGlwZShzZWxmKToKKyAgICAgICAgc29jayA9IEVQaXBlU29ja2V0KAorICAgICAgICAgICAgIkhUVFAvMS4wIDQwMSBBdXRob3JpemF0aW9uIFJlcXVpcmVkXHJcbiIKKyAgICAgICAgICAgICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxyXG4iCisgICAgICAgICAgICAiV1dXLUF1dGhlbnRpY2F0ZTogQmFzaWMgcmVhbG09XCJleGFtcGxlXCJcclxuIiwKKyAgICAgICAgICAgIGIiQ29udGVudC1MZW5ndGgiKQorICAgICAgICBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbigiZXhhbXBsZS5jb20iKQorICAgICAgICBjb25uLnNvY2sgPSBzb2NrCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBjb25uLnJlcXVlc3QoIlBVVCIsICIvdXJsIiwgImJvZHkiKSkKKyAgICAgICAgcmVzcCA9IGNvbm4uZ2V0cmVzcG9uc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQwMSwgcmVzcC5zdGF0dXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkJhc2ljIHJlYWxtPVwiZXhhbXBsZVwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLmdldGhlYWRlcigid3d3LWF1dGhlbnRpY2F0ZSIpKQorCisgICAgZGVmIHRlc3RfZmlsZW5vYXR0cihzZWxmKToKKyAgICAgICAgIyBKdXN0IHRlc3QgdGhlIGZpbGVubyBhdHRyaWJ1dGUgaW4gdGhlIEhUVFBSZXNwb25zZSBPYmplY3QuCisgICAgICAgIGJvZHkgPSAiSFRUUC8xLjEgMjAwIE9rXHJcblxyXG5UZXh0IgorICAgICAgICBzb2NrID0gRmFrZVNvY2tldChib2R5KQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIocmVzcCwnZmlsZW5vJyksCisgICAgICAgICAgICAgICAgJ0hUVFBSZXNwb25zZSBzaG91bGQgZXhwb3NlIGEgZmlsZW5vIGF0dHJpYnV0ZScpCisKKyAgICAjIFRlc3QgbGluZXMgb3ZlcmZsb3dpbmcgdGhlIG1heCBsaW5lIHNpemUgKF9NQVhMSU5FIGluIGh0dHAuY2xpZW50KQorCisgICAgZGVmIHRlc3Rfb3ZlcmZsb3dpbmdfc3RhdHVzX2xpbmUoc2VsZik6CisgICAgICAgIHNlbGYuc2tpcFRlc3QoImRpc2FibGVkIGZvciBIVFRQIDAuOSBzdXBwb3J0IikKKyAgICAgICAgYm9keSA9ICJIVFRQLzEuMSAyMDAgT2siICsgImsiICogNjU1MzYgKyAiXHJcbiIKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKEZha2VTb2NrZXQoYm9keSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChodHRwbGliLkxpbmVUb29Mb25nLCBodHRwbGliLkJhZFN0YXR1c0xpbmUpLCByZXNwLmJlZ2luKQorCisgICAgZGVmIHRlc3Rfb3ZlcmZsb3dpbmdfaGVhZGVyX2xpbmUoc2VsZik6CisgICAgICAgIGJvZHkgPSAoCisgICAgICAgICAgICAnSFRUUC8xLjEgMjAwIE9LXHJcbicKKyAgICAgICAgICAgICdYLUZvbzogYmFyJyArICdyJyAqIDY1NTM2ICsgJ1xyXG5cclxuJworICAgICAgICApCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShGYWtlU29ja2V0KGJvZHkpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhodHRwbGliLkxpbmVUb29Mb25nLCByZXNwLmJlZ2luKQorCisgICAgZGVmIHRlc3Rfb3ZlcmZsb3dpbmdfY2h1bmtlZF9saW5lKHNlbGYpOgorICAgICAgICBib2R5ID0gKAorICAgICAgICAgICAgJ0hUVFAvMS4xIDIwMCBPS1xyXG4nCisgICAgICAgICAgICAnVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcclxuXHJcbicKKyAgICAgICAgICAgICsgJzAnICogNjU1MzYgKyAnYVxyXG4nCisgICAgICAgICAgICAnaGVsbG8gd29ybGRcclxuJworICAgICAgICAgICAgJzBcclxuJworICAgICAgICApCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShGYWtlU29ja2V0KGJvZHkpKQorICAgICAgICByZXNwLmJlZ2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoaHR0cGxpYi5MaW5lVG9vTG9uZywgcmVzcC5yZWFkKQorCisgICAgZGVmIHRlc3RfZWFybHlfZW9mKHNlbGYpOgorICAgICAgICAjIFRlc3QgaHR0cHJlc3BvbnNlIHdpdGggbm8gXHJcbiB0ZXJtaW5hdGlvbiwKKyAgICAgICAgYm9keSA9ICJIVFRQLzEuMSAyMDAgT2siCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrKQorICAgICAgICByZXNwLmJlZ2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNwLmlzY2xvc2VkKCkpCisKK2NsYXNzIE9mZmxpbmVUZXN0KFRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9yZXNwb25zZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHR0cGxpYi5yZXNwb25zZXNbaHR0cGxpYi5OT1RfRk9VTkRdLCAiTm90IEZvdW5kIikKKworCitjbGFzcyBTb3VyY2VBZGRyZXNzVGVzdChUZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYucG9ydCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zZXJ2KQorICAgICAgICBzZWxmLnNvdXJjZV9wb3J0ID0gdGVzdF9zdXBwb3J0LmZpbmRfdW51c2VkX3BvcnQoKQorICAgICAgICBzZWxmLnNlcnYubGlzdGVuKDUpCisgICAgICAgIHNlbGYuY29ubiA9IE5vbmUKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jb25uOgorICAgICAgICAgICAgc2VsZi5jb25uLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuY29ubiA9IE5vbmUKKyAgICAgICAgc2VsZi5zZXJ2LmNsb3NlKCkKKyAgICAgICAgc2VsZi5zZXJ2ID0gTm9uZQorCisgICAgZGVmIHRlc3RIVFRQQ29ubmVjdGlvblNvdXJjZUFkZHJlc3Moc2VsZik6CisgICAgICAgIHNlbGYuY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oSE9TVCwgc2VsZi5wb3J0LAorICAgICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzPSgnJywgc2VsZi5zb3VyY2VfcG9ydCkpCisgICAgICAgIHNlbGYuY29ubi5jb25uZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbm4uc29jay5nZXRzb2NrbmFtZSgpWzFdLCBzZWxmLnNvdXJjZV9wb3J0KQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihub3QgaGFzYXR0cihodHRwbGliLCAnSFRUUFNDb25uZWN0aW9uJyksCisgICAgICAgICAgICAgICAgICAgICAnaHR0cGxpYi5IVFRQU0Nvbm5lY3Rpb24gbm90IGRlZmluZWQnKQorICAgIGRlZiB0ZXN0SFRUUFNDb25uZWN0aW9uU291cmNlQWRkcmVzcyhzZWxmKToKKyAgICAgICAgc2VsZi5jb25uID0gaHR0cGxpYi5IVFRQU0Nvbm5lY3Rpb24oSE9TVCwgc2VsZi5wb3J0LAorICAgICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzPSgnJywgc2VsZi5zb3VyY2VfcG9ydCkpCisgICAgICAgICMgV2UgZG9uJ3QgdGVzdCBhbnl0aGluZyBoZXJlIG90aGVyIHRoZSBjb25zdHJ1Y3RvciBub3QgYmFyZmluZyBhcworICAgICAgICAjIHRoaXMgY29kZSBkb2Vzbid0IGRlYWwgd2l0aCBzZXR0aW5nIHVwIGFuIGFjdGl2ZSBydW5uaW5nIFNTTCBzZXJ2ZXIKKyAgICAgICAgIyBmb3IgYW4gc3NsX3dyYXBwZWQgY29ubmVjdCgpIHRvIGFjdHVhbGx5IHJldHVybiBmcm9tLgorCisKK2NsYXNzIFRpbWVvdXRUZXN0KFRlc3RDYXNlKToKKyAgICBQT1JUID0gTm9uZQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIFRpbWVvdXRUZXN0LlBPUlQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc2VydikKKyAgICAgICAgc2VsZi5zZXJ2Lmxpc3Rlbig1KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnYuY2xvc2UoKQorICAgICAgICBzZWxmLnNlcnYgPSBOb25lCisKKyAgICBkZWYgdGVzdFRpbWVvdXRBdHRyaWJ1dGUoc2VsZik6CisgICAgICAgICcnJ1RoaXMgd2lsbCBwcm92ZSB0aGF0IHRoZSB0aW1lb3V0IGdldHMgdGhyb3VnaAorICAgICAgICBIVFRQQ29ubmVjdGlvbiBhbmQgaW50byB0aGUgc29ja2V0LgorICAgICAgICAnJycKKyAgICAgICAgIyBkZWZhdWx0IC0tIHVzZSBnbG9iYWwgc29ja2V0IHRpbWVvdXQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaHR0cENvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKEhPU1QsIFRpbWVvdXRUZXN0LlBPUlQpCisgICAgICAgICAgICBodHRwQ29ubi5jb25uZWN0KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGh0dHBDb25uLnNvY2suZ2V0dGltZW91dCgpLCAzMCkKKyAgICAgICAgaHR0cENvbm4uY2xvc2UoKQorCisgICAgICAgICMgbm8gdGltZW91dCAtLSBkbyBub3QgdXNlIGdsb2JhbCBzb2NrZXQgZGVmYXVsdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBodHRwQ29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oSE9TVCwgVGltZW91dFRlc3QuUE9SVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PU5vbmUpCisgICAgICAgICAgICBodHRwQ29ubi5jb25uZWN0KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGh0dHBDb25uLnNvY2suZ2V0dGltZW91dCgpLCBOb25lKQorICAgICAgICBodHRwQ29ubi5jbG9zZSgpCisKKyAgICAgICAgIyBhIHZhbHVlCisgICAgICAgIGh0dHBDb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbihIT1NULCBUaW1lb3V0VGVzdC5QT1JULCB0aW1lb3V0PTMwKQorICAgICAgICBodHRwQ29ubi5jb25uZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodHRwQ29ubi5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisgICAgICAgIGh0dHBDb25uLmNsb3NlKCkKKworCitjbGFzcyBIVFRQU1RpbWVvdXRUZXN0KFRlc3RDYXNlKToKKyMgWFhYIEhlcmUgc2hvdWxkIGJlIHRlc3RzIGZvciBIVFRQUywgdGhlcmUgaXNuJ3QgYW55IHJpZ2h0IG5vdyEKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgICMgc2ltcGxlIHRlc3QgdG8gY2hlY2sgaXQncyBzdG9yaW5nIGl0CisgICAgICAgIGlmIGhhc2F0dHIoaHR0cGxpYiwgJ0hUVFBTQ29ubmVjdGlvbicpOgorICAgICAgICAgICAgaCA9IGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uKEhPU1QsIFRpbWVvdXRUZXN0LlBPUlQsIHRpbWVvdXQ9MzApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgudGltZW91dCwgMzApCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKG5vdCBoYXNhdHRyKGh0dHBsaWIsICdIVFRQUycpLCAnaHR0cGxpYi5IVFRQUyBub3QgYXZhaWxhYmxlJykKKyAgICBkZWYgdGVzdF9ob3N0X3BvcnQoc2VsZik6CisgICAgICAgICMgQ2hlY2sgaW52YWxpZCBob3N0X3BvcnQKKworICAgICAgICAjIE5vdGUgdGhhdCBodHRwbGliIGRvZXMgbm90IGFjY2VwdCB1c2VyOnBhc3N3b3JkQCBpbiB0aGUgaG9zdC1wb3J0LgorICAgICAgICBmb3IgaHAgaW4gKCJ3d3cucHl0aG9uLm9yZzphYmMiLCAidXNlcjpwYXNzd29yZEB3d3cucHl0aG9uLm9yZyIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoaHR0cGxpYi5JbnZhbGlkVVJMLCBodHRwbGliLkhUVFAsIGhwKQorCisgICAgICAgIGZvciBocCwgaCwgcCBpbiAoKCJbZmU4MDo6MjA3OmU5ZmY6ZmU5Yl06ODAwMCIsICJmZTgwOjoyMDc6ZTlmZjpmZTliIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgODAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJweXBpLnB5dGhvbi5vcmc6NDQzIiwgInB5cGkucHl0aG9uLm9yZyIsIDQ0MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJweXBpLnB5dGhvbi5vcmciLCAicHlwaS5weXRob24ub3JnIiwgNDQzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoInB5cGkucHl0aG9uLm9yZzoiLCAicHlwaS5weXRob24ub3JnIiwgNDQzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoIltmZTgwOjoyMDc6ZTlmZjpmZTliXSIsICJmZTgwOjoyMDc6ZTlmZjpmZTliIiwgNDQzKSk6CisgICAgICAgICAgICBodHRwID0gaHR0cGxpYi5IVFRQUyhocCkKKyAgICAgICAgICAgIGMgPSBodHRwLl9jb25uCisgICAgICAgICAgICBpZiBoICE9IGMuaG9zdDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkhvc3QgaW5jb3JyZWN0bHkgcGFyc2VkOiAlcyAhPSAlcyIgJSAoaCwgYy5ob3N0KSkKKyAgICAgICAgICAgIGlmIHAgIT0gYy5wb3J0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUG9ydCBpbmNvcnJlY3RseSBwYXJzZWQ6ICVzICE9ICVzIiAlIChwLCBjLmhvc3QpKQorCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEhlYWRlclRlc3RzLCBPZmZsaW5lVGVzdCwgQmFzaWNUZXN0LCBUaW1lb3V0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBTVGltZW91dFRlc3QsIFNvdXJjZUFkZHJlc3NUZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwbGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0dHBsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODJkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwbGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0dHBsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODJkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwc2VydmVycy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkY2VkYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwc2VydmVycy5weQpAQCAtMCwwICsxLDUzNyBAQAorIiIiVW5pdHRlc3RzIGZvciB0aGUgdmFyaW91cyBIVFRQU2VydmVyIG1vZHVsZXMuCisKK1dyaXR0ZW4gYnkgQ29keSBBLlcuIFNvbWVydmlsbGUgPGNvZHktc29tZXJ2aWxsZUB1YnVudHUuY29tPiwKK0pvc2lwIER6b2xvbmdhLCBhbmQgTWljaGFlbCBPdHRlbmVkZXIgZm9yIHRoZSAyMDA3LzA4IEdIT1AgY29udGVzdC4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IGJhc2U2NAoraW1wb3J0IHNodXRpbAoraW1wb3J0IHVybGxpYgoraW1wb3J0IGh0dHBsaWIKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgQ0dJSFRUUFNlcnZlcgorCisKK2Zyb20gQmFzZUhUVFBTZXJ2ZXIgaW1wb3J0IEJhc2VIVFRQUmVxdWVzdEhhbmRsZXIsIEhUVFBTZXJ2ZXIKK2Zyb20gU2ltcGxlSFRUUFNlcnZlciBpbXBvcnQgU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyCitmcm9tIENHSUhUVFBTZXJ2ZXIgaW1wb3J0IENHSUhUVFBSZXF1ZXN0SGFuZGxlcgorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKwordGhyZWFkaW5nID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RocmVhZGluZycpCisKKworY2xhc3MgTm9Mb2dSZXF1ZXN0SGFuZGxlcjoKKyAgICBkZWYgbG9nX21lc3NhZ2Uoc2VsZiwgKmFyZ3MpOgorICAgICAgICAjIGRvbid0IHdyaXRlIGxvZyBtZXNzYWdlcyB0byBzdGRlcnIKKyAgICAgICAgcGFzcworCitjbGFzcyBTb2NrZXRsZXNzUmVxdWVzdEhhbmRsZXIoU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZ2V0X2NhbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYucHJvdG9jb2xfdmVyc2lvbiA9ICJIVFRQLzEuMSIKKworICAgIGRlZiBkb19HRVQoc2VsZik6CisgICAgICAgIHNlbGYuZ2V0X2NhbGxlZCA9IFRydWUKKyAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpCisgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICBzZWxmLndmaWxlLndyaXRlKGInPGh0bWw+PGJvZHk+RGF0YTwvYm9keT48L2h0bWw+XHJcbicpCisKKyAgICBkZWYgbG9nX21lc3NhZ2Uoc2VsZiwgZm10LCAqYXJncyk6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBUZXN0U2VydmVyVGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X29iamVjdCwgcmVxdWVzdF9oYW5kbGVyKToKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnJlcXVlc3RfaGFuZGxlciA9IHJlcXVlc3RfaGFuZGxlcgorICAgICAgICBzZWxmLnRlc3Rfb2JqZWN0ID0gdGVzdF9vYmplY3QKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVyID0gSFRUUFNlcnZlcigoJycsIDApLCBzZWxmLnJlcXVlc3RfaGFuZGxlcikKKyAgICAgICAgc2VsZi50ZXN0X29iamVjdC5QT1JUID0gc2VsZi5zZXJ2ZXIuc29ja2V0LmdldHNvY2tuYW1lKClbMV0KKyAgICAgICAgc2VsZi50ZXN0X29iamVjdC5zZXJ2ZXJfc3RhcnRlZC5zZXQoKQorICAgICAgICBzZWxmLnRlc3Rfb2JqZWN0ID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zZXJ2ZV9mb3JldmVyKDAuMDUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zZXJ2ZXJfY2xvc2UoKQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVyLnNodXRkb3duKCkKKworCitjbGFzcyBCYXNlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fdGhyZWFkcyA9IHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQorICAgICAgICBvcy5lbnZpcm9uID0gdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKQorICAgICAgICBzZWxmLnNlcnZlcl9zdGFydGVkID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi50aHJlYWQgPSBUZXN0U2VydmVyVGhyZWFkKHNlbGYsIHNlbGYucmVxdWVzdF9oYW5kbGVyKQorICAgICAgICBzZWxmLnRocmVhZC5zdGFydCgpCisgICAgICAgIHNlbGYuc2VydmVyX3N0YXJ0ZWQud2FpdCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGhyZWFkLnN0b3AoKQorICAgICAgICBvcy5lbnZpcm9uLl9fZXhpdF9fKCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnRocmVhZGluZ19jbGVhbnVwKCpzZWxmLl90aHJlYWRzKQorCisgICAgZGVmIHJlcXVlc3Qoc2VsZiwgdXJpLCBtZXRob2Q9J0dFVCcsIGJvZHk9Tm9uZSwgaGVhZGVycz17fSk6CisgICAgICAgIHNlbGYuY29ubmVjdGlvbiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oJ2xvY2FsaG9zdCcsIHNlbGYuUE9SVCkKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uLnJlcXVlc3QobWV0aG9kLCB1cmksIGJvZHksIGhlYWRlcnMpCisgICAgICAgIHJldHVybiBzZWxmLmNvbm5lY3Rpb24uZ2V0cmVzcG9uc2UoKQorCitjbGFzcyBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIEJhc2VIVFRQU2VydmVyIGZvY3Vzc2luZyBvbgorICAgIEJhc2VIVFRQUmVxdWVzdEhhbmRsZXIuCisgICAgIiIiCisKKyAgICBIVFRQUmVzcG9uc2VNYXRjaCA9IHJlLmNvbXBpbGUoJ0hUVFAvMS5bMC05XSsgMjAwIE9LJykKKworICAgIGRlZiBzZXRVcCAoc2VsZik6CisgICAgICAgIHNlbGYuaGFuZGxlciA9IFNvY2tldGxlc3NSZXF1ZXN0SGFuZGxlcigpCisKKyAgICBkZWYgc2VuZF90eXBpY2FsX3JlcXVlc3Qoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIGlucHV0X21zZyA9IFN0cmluZ0lPKG1lc3NhZ2UpCisgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5oYW5kbGVyLnJmaWxlID0gaW5wdXRfbXNnCisgICAgICAgIHNlbGYuaGFuZGxlci53ZmlsZSA9IG91dHB1dAorICAgICAgICBzZWxmLmhhbmRsZXIuaGFuZGxlX29uZV9yZXF1ZXN0KCkKKyAgICAgICAgb3V0cHV0LnNlZWsoMCkKKyAgICAgICAgcmV0dXJuIG91dHB1dC5yZWFkbGluZXMoKQorCisgICAgZGVmIHZlcmlmeV9nZXRfY2FsbGVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5oYW5kbGVyLmdldF9jYWxsZWQpCisKKyAgICBkZWYgdmVyaWZ5X2V4cGVjdGVkX2hlYWRlcnMoc2VsZiwgaGVhZGVycyk6CisgICAgICAgIGZvciBmaWVsZE5hbWUgaW4gJ1NlcnZlcjogJywgJ0RhdGU6ICcsICdDb250ZW50LVR5cGU6ICc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShoLnN0YXJ0c3dpdGgoZmllbGROYW1lKSBmb3IgaCBpbiBoZWFkZXJzKSwgMSkKKworICAgIGRlZiB2ZXJpZnlfaHR0cF9zZXJ2ZXJfcmVzcG9uc2Uoc2VsZiwgcmVzcG9uc2UpOgorICAgICAgICBtYXRjaCA9IHNlbGYuSFRUUFJlc3BvbnNlTWF0Y2guc2VhcmNoKHJlc3BvbnNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0Y2ggaXMgbm90IE5vbmUpCisKKyAgICBkZWYgdGVzdF9odHRwXzFfMShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZW5kX3R5cGljYWxfcmVxdWVzdCgnR0VUIC8gSFRUUC8xLjFcclxuXHJcbicpCisgICAgICAgIHNlbGYudmVyaWZ5X2h0dHBfc2VydmVyX3Jlc3BvbnNlKHJlc3VsdFswXSkKKyAgICAgICAgc2VsZi52ZXJpZnlfZXhwZWN0ZWRfaGVhZGVycyhyZXN1bHRbMTotMV0pCisgICAgICAgIHNlbGYudmVyaWZ5X2dldF9jYWxsZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFstMV0sICc8aHRtbD48Ym9keT5EYXRhPC9ib2R5PjwvaHRtbD5cclxuJykKKworICAgIGRlZiB0ZXN0X2h0dHBfMV8wKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNlbmRfdHlwaWNhbF9yZXF1ZXN0KCdHRVQgLyBIVFRQLzEuMFxyXG5cclxuJykKKyAgICAgICAgc2VsZi52ZXJpZnlfaHR0cF9zZXJ2ZXJfcmVzcG9uc2UocmVzdWx0WzBdKQorICAgICAgICBzZWxmLnZlcmlmeV9leHBlY3RlZF9oZWFkZXJzKHJlc3VsdFsxOi0xXSkKKyAgICAgICAgc2VsZi52ZXJpZnlfZ2V0X2NhbGxlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0Wy0xXSwgJzxodG1sPjxib2R5PkRhdGE8L2JvZHk+PC9odG1sPlxyXG4nKQorCisgICAgZGVmIHRlc3RfaHR0cF8wXzkoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2VuZF90eXBpY2FsX3JlcXVlc3QoJ0dFVCAvIEhUVFAvMC45XHJcblxyXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFswXSwgJzxodG1sPjxib2R5PkRhdGE8L2JvZHk+PC9odG1sPlxyXG4nKQorICAgICAgICBzZWxmLnZlcmlmeV9nZXRfY2FsbGVkKCkKKworICAgIGRlZiB0ZXN0X3dpdGhfY29udGludWVfMV8wKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNlbmRfdHlwaWNhbF9yZXF1ZXN0KCdHRVQgLyBIVFRQLzEuMFxyXG5FeHBlY3Q6IDEwMC1jb250aW51ZVxyXG5cclxuJykKKyAgICAgICAgc2VsZi52ZXJpZnlfaHR0cF9zZXJ2ZXJfcmVzcG9uc2UocmVzdWx0WzBdKQorICAgICAgICBzZWxmLnZlcmlmeV9leHBlY3RlZF9oZWFkZXJzKHJlc3VsdFsxOi0xXSkKKyAgICAgICAgc2VsZi52ZXJpZnlfZ2V0X2NhbGxlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0Wy0xXSwgJzxodG1sPjxib2R5PkRhdGE8L2JvZHk+PC9odG1sPlxyXG4nKQorCisgICAgZGVmIHRlc3RfcmVxdWVzdF9sZW5ndGgoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEwNzE0OiBodWdlIHJlcXVlc3QgbGluZXMgYXJlIGRpc2NhcmRlZCwgdG8gYXZvaWQgRGVuaWFsCisgICAgICAgICMgb2YgU2VydmljZSBhdHRhY2tzLgorICAgICAgICByZXN1bHQgPSBzZWxmLnNlbmRfdHlwaWNhbF9yZXF1ZXN0KGInR0VUICcgKyBiJ3gnICogNjU1MzcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdLCBiJ0hUVFAvMS4xIDQxNCBSZXF1ZXN0LVVSSSBUb28gTG9uZ1xyXG4nKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuaGFuZGxlci5nZXRfY2FsbGVkKQorCisKK2NsYXNzIEJhc2VIVFRQU2VydmVyVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKyAgICBjbGFzcyByZXF1ZXN0X2hhbmRsZXIoTm9Mb2dSZXF1ZXN0SGFuZGxlciwgQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisgICAgICAgIHByb3RvY29sX3ZlcnNpb24gPSAnSFRUUC8xLjEnCisgICAgICAgIGRlZmF1bHRfcmVxdWVzdF92ZXJzaW9uID0gJ0hUVFAvMS4xJworCisgICAgICAgIGRlZiBkb19URVNUKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwNCkKKyAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWwnKQorICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignQ29ubmVjdGlvbicsICdjbG9zZScpCisgICAgICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKworICAgICAgICBkZWYgZG9fS0VFUChzZWxmKToKKyAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDQpCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJykKKyAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0Nvbm5lY3Rpb24nLCAna2VlcC1hbGl2ZScpCisgICAgICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKworICAgICAgICBkZWYgZG9fS0VZRVJST1Ioc2VsZik6CisgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoOTk5KQorCisgICAgICAgIGRlZiBkb19DVVNUT00oc2VsZik6CisgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoOTk5KQorICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb25uZWN0aW9uJywgJ2Nsb3NlJykKKyAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBCYXNlVGVzdENhc2Uuc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5jb24gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCdsb2NhbGhvc3QnLCBzZWxmLlBPUlQpCisgICAgICAgIHNlbGYuY29uLmNvbm5lY3QoKQorCisgICAgZGVmIHRlc3RfY29tbWFuZChzZWxmKToKKyAgICAgICAgc2VsZi5jb24ucmVxdWVzdCgnR0VUJywgJy8nKQorICAgICAgICByZXMgPSBzZWxmLmNvbi5nZXRyZXNwb25zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgNTAxKQorCisgICAgZGVmIHRlc3RfcmVxdWVzdF9saW5lX3RyaW1taW5nKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5faHR0cF92c25fc3RyID0gJ0hUVFAvMS4xXG4nCisgICAgICAgIHNlbGYuY29uLnB1dHJlcXVlc3QoJ0dFVCcsICcvJykKKyAgICAgICAgc2VsZi5jb24uZW5kaGVhZGVycygpCisgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA1MDEpCisKKyAgICBkZWYgdGVzdF92ZXJzaW9uX2JvZ3VzKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5faHR0cF92c25fc3RyID0gJ0ZVQkFSJworICAgICAgICBzZWxmLmNvbi5wdXRyZXF1ZXN0KCdHRVQnLCAnLycpCisgICAgICAgIHNlbGYuY29uLmVuZGhlYWRlcnMoKQorICAgICAgICByZXMgPSBzZWxmLmNvbi5nZXRyZXNwb25zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgNDAwKQorCisgICAgZGVmIHRlc3RfdmVyc2lvbl9kaWdpdHMoc2VsZik6CisgICAgICAgIHNlbGYuY29uLl9odHRwX3Zzbl9zdHIgPSAnSFRUUC85LjkuOScKKyAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnR0VUJywgJy8nKQorICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKKyAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDQwMCkKKworICAgIGRlZiB0ZXN0X3ZlcnNpb25fbm9uZV9nZXQoc2VsZik6CisgICAgICAgIHNlbGYuY29uLl9odHRwX3Zzbl9zdHIgPSAnJworICAgICAgICBzZWxmLmNvbi5wdXRyZXF1ZXN0KCdHRVQnLCAnLycpCisgICAgICAgIHNlbGYuY29uLmVuZGhlYWRlcnMoKQorICAgICAgICByZXMgPSBzZWxmLmNvbi5nZXRyZXNwb25zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgNTAxKQorCisgICAgZGVmIHRlc3RfdmVyc2lvbl9ub25lKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5faHR0cF92c25fc3RyID0gJycKKyAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnUFVUJywgJy8nKQorICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKKyAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDQwMCkKKworICAgIGRlZiB0ZXN0X3ZlcnNpb25faW52YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5jb24uX2h0dHBfdnNuID0gOTkKKyAgICAgICAgc2VsZi5jb24uX2h0dHBfdnNuX3N0ciA9ICdIVFRQLzkuOScKKyAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnR0VUJywgJy8nKQorICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKKyAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDUwNSkKKworICAgIGRlZiB0ZXN0X3NlbmRfYmxhbmsoc2VsZik6CisgICAgICAgIHNlbGYuY29uLl9odHRwX3Zzbl9zdHIgPSAnJworICAgICAgICBzZWxmLmNvbi5wdXRyZXF1ZXN0KCcnLCAnJykKKyAgICAgICAgc2VsZi5jb24uZW5kaGVhZGVycygpCisgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA0MDApCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY29uLnB1dHJlcXVlc3QoJ0dFVCcsICcvJykKKyAgICAgICAgc2VsZi5jb24ucHV0aGVhZGVyKCdDb25uZWN0aW9uJywgJ2Nsb3NlJykKKyAgICAgICAgc2VsZi5jb24uZW5kaGVhZGVycygpCisgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA1MDEpCisKKyAgICBkZWYgdGVzdF9oZWFkX2tlZXBfYWxpdmUoc2VsZik6CisgICAgICAgIHNlbGYuY29uLl9odHRwX3Zzbl9zdHIgPSAnSFRUUC8xLjEnCisgICAgICAgIHNlbGYuY29uLnB1dHJlcXVlc3QoJ0dFVCcsICcvJykKKyAgICAgICAgc2VsZi5jb24ucHV0aGVhZGVyKCdDb25uZWN0aW9uJywgJ2tlZXAtYWxpdmUnKQorICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKKyAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDUwMSkKKworICAgIGRlZiB0ZXN0X2hhbmRsZXIoc2VsZik6CisgICAgICAgIHNlbGYuY29uLnJlcXVlc3QoJ1RFU1QnLCAnLycpCisgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCAyMDQpCisKKyAgICBkZWYgdGVzdF9yZXR1cm5faGVhZGVyX2tlZXBfYWxpdmUoc2VsZik6CisgICAgICAgIHNlbGYuY29uLnJlcXVlc3QoJ0tFRVAnLCAnLycpCisgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuZ2V0aGVhZGVyKCdDb25uZWN0aW9uJyksICdrZWVwLWFsaXZlJykKKyAgICAgICAgc2VsZi5jb24ucmVxdWVzdCgnVEVTVCcsICcvJykKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlbGYuY29uLmNsb3NlKQorCisgICAgZGVmIHRlc3RfaW50ZXJuYWxfa2V5X2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5yZXF1ZXN0KCdLRVlFUlJPUicsICcvJykKKyAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDk5OSkKKworICAgIGRlZiB0ZXN0X3JldHVybl9jdXN0b21fc3RhdHVzKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5yZXF1ZXN0KCdDVVNUT00nLCAnLycpCisgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA5OTkpCisKKworY2xhc3MgU2ltcGxlSFRUUFNlcnZlclRlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisgICAgY2xhc3MgcmVxdWVzdF9oYW5kbGVyKE5vTG9nUmVxdWVzdEhhbmRsZXIsIFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgQmFzZVRlc3RDYXNlLnNldFVwKHNlbGYpCisgICAgICAgIHNlbGYuY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgYmFzZXRlbXBkaXIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKKyAgICAgICAgb3MuY2hkaXIoYmFzZXRlbXBkaXIpCisgICAgICAgIHNlbGYuZGF0YSA9ICdXZSBhcmUgdGhlIGtuaWdodHMgd2hvIHNheSBOaSEnCisgICAgICAgIHNlbGYudGVtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoZGlyPWJhc2V0ZW1wZGlyKQorICAgICAgICBzZWxmLnRlbXBkaXJfbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc2VsZi50ZW1wZGlyKQorICAgICAgICB0ZW1wID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi50ZW1wZGlyLCAndGVzdCcpLCAnd2InKQorICAgICAgICB0ZW1wLndyaXRlKHNlbGYuZGF0YSkKKyAgICAgICAgdGVtcC5jbG9zZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmNoZGlyKHNlbGYuY3dkKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi50ZW1wZGlyKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgQmFzZVRlc3RDYXNlLnRlYXJEb3duKHNlbGYpCisKKyAgICBkZWYgY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24oc2VsZiwgcmVzcG9uc2UsIHN0YXR1cywgZGF0YT1Ob25lKToKKyAgICAgICAgYm9keSA9IHJlc3BvbnNlLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcG9uc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2Uuc3RhdHVzLCBzdGF0dXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHJlc3BvbnNlLnJlYXNvbikKKyAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgYm9keSkKKworICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgI2NvbnN0cnVjdHMgdGhlIHBhdGggcmVsYXRpdmUgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBIVFRQU2VydmVyCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KHNlbGYudGVtcGRpcl9uYW1lICsgJy90ZXN0JykKKyAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgMjAwLCBkYXRhPXNlbGYuZGF0YSkKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi50ZW1wZGlyX25hbWUgKyAnLycpCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDIwMCkKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3Qoc2VsZi50ZW1wZGlyX25hbWUpCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDMwMSkKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3QoJy9UaGlzRG9lc05vdEV4aXN0JykKKyAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgNDA0KQorICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdCgnLycgKyAnVGhpc0RvZXNOb3RFeGlzdCcgKyAnLycpCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDQwNCkKKyAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYudGVtcGRpcl9uYW1lLCAnaW5kZXguaHRtbCcpLCAndycpCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KCcvJyArIHNlbGYudGVtcGRpcl9uYW1lICsgJy8nKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCAyMDApCisKKyAgICAgICAgIyBjaG1vZCgpIGRvZXNuJ3Qgd29yayBhcyBleHBlY3RlZCBvbiBXaW5kb3dzLCBhbmQgZmlsZXN5c3RlbQorICAgICAgICAjIHBlcm1pc3Npb25zIGFyZSBpZ25vcmVkIGJ5IHJvb3Qgb24gVW5peC4KKyAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnIGFuZCBvcy5nZXRldWlkKCkgIT0gMDoKKyAgICAgICAgICAgIG9zLmNobW9kKHNlbGYudGVtcGRpciwgMCkKKyAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KHNlbGYudGVtcGRpcl9uYW1lICsgJy8nKQorICAgICAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgNDA0KQorICAgICAgICAgICAgb3MuY2htb2Qoc2VsZi50ZW1wZGlyLCAwNzU1KQorCisgICAgZGVmIHRlc3RfaGVhZChzZWxmKToKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3QoCisgICAgICAgICAgICBzZWxmLnRlbXBkaXJfbmFtZSArICcvdGVzdCcsIG1ldGhvZD0nSEVBRCcpCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDIwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5nZXRoZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKGxlbihzZWxmLmRhdGEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5nZXRoZWFkZXIoJ2NvbnRlbnQtdHlwZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9yZXF1ZXN0cyhzZWxmKToKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3QoJy8nLCBtZXRob2Q9J0ZPTycpCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDUwMSkKKyAgICAgICAgIyByZXF1ZXN0cyBtdXN0IGJlIGNhc2Ugc2Vuc2l0aXZlLHNvIHRoaXMgc2hvdWxkIGZhaWwgdG9vCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KCcvJywgbWV0aG9kPSdnZXQnKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCA1MDEpCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KCcvJywgbWV0aG9kPSdHRVRzJykKKyAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgNTAxKQorCisKK2NnaV9maWxlMSA9ICIiIlwKKyMhJXMKKworcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sIgorcHJpbnQKK3ByaW50ICJIZWxsbyBXb3JsZCIKKyIiIgorCitjZ2lfZmlsZTIgPSAiIiJcCisjISVzCitpbXBvcnQgY2dpCisKK3ByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbCIKK3ByaW50CisKK2Zvcm0gPSBjZ2kuRmllbGRTdG9yYWdlKCkKK3ByaW50ICIlJXMsICUlcywgJSVzIiAlJSAoZm9ybS5nZXRmaXJzdCgic3BhbSIpLCBmb3JtLmdldGZpcnN0KCJlZ2dzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uZ2V0Zmlyc3QoImJhY29uIikpCisiIiIKKworCitAdW5pdHRlc3Quc2tpcElmKGhhc2F0dHIob3MsICdnZXRldWlkJykgYW5kIG9zLmdldGV1aWQoKSA9PSAwLAorICAgICAgICAiVGhpcyB0ZXN0IGNhbid0IGJlIHJ1biByZWxpYWJseSBhcyByb290IChpc3N1ZSAjMTMzMDgpLiIpCitjbGFzcyBDR0lIVFRQU2VydmVyVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKyAgICBjbGFzcyByZXF1ZXN0X2hhbmRsZXIoTm9Mb2dSZXF1ZXN0SGFuZGxlciwgQ0dJSFRUUFJlcXVlc3RIYW5kbGVyKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBCYXNlVGVzdENhc2Uuc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5wYXJlbnRfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHNlbGYuY2dpX2RpciA9IG9zLnBhdGguam9pbihzZWxmLnBhcmVudF9kaXIsICdjZ2ktYmluJykKKyAgICAgICAgb3MubWtkaXIoc2VsZi5jZ2lfZGlyKQorCisgICAgICAgICMgVGhlIHNoZWJhbmcgbGluZSBzaG91bGQgYmUgcHVyZSBBU0NJSTogdXNlIHN5bWxpbmsgaWYgcG9zc2libGUuCisgICAgICAgICMgU2VlIGlzc3VlICM3NjY4LgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc3ltbGluaycpOgorICAgICAgICAgICAgc2VsZi5weXRob25leGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXJlbnRfZGlyLCAncHl0aG9uJykKKyAgICAgICAgICAgIG9zLnN5bWxpbmsoc3lzLmV4ZWN1dGFibGUsIHNlbGYucHl0aG9uZXhlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5weXRob25leGUgPSBzeXMuZXhlY3V0YWJsZQorCisgICAgICAgIHNlbGYuZmlsZTFfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmNnaV9kaXIsICdmaWxlMS5weScpCisgICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGUxX3BhdGgsICd3JykgYXMgZmlsZTE6CisgICAgICAgICAgICBmaWxlMS53cml0ZShjZ2lfZmlsZTEgJSBzZWxmLnB5dGhvbmV4ZSkKKyAgICAgICAgb3MuY2htb2Qoc2VsZi5maWxlMV9wYXRoLCAwNzc3KQorCisgICAgICAgIHNlbGYuZmlsZTJfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmNnaV9kaXIsICdmaWxlMi5weScpCisgICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGUyX3BhdGgsICd3JykgYXMgZmlsZTI6CisgICAgICAgICAgICBmaWxlMi53cml0ZShjZ2lfZmlsZTIgJSBzZWxmLnB5dGhvbmV4ZSkKKyAgICAgICAgb3MuY2htb2Qoc2VsZi5maWxlMl9wYXRoLCAwNzc3KQorCisgICAgICAgIHNlbGYuY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIoc2VsZi5wYXJlbnRfZGlyKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5jaGRpcihzZWxmLmN3ZCkKKyAgICAgICAgICAgIGlmIHNlbGYucHl0aG9uZXhlICE9IHN5cy5leGVjdXRhYmxlOgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLnB5dGhvbmV4ZSkKKyAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLmZpbGUxX3BhdGgpCisgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5maWxlMl9wYXRoKQorICAgICAgICAgICAgb3Mucm1kaXIoc2VsZi5jZ2lfZGlyKQorICAgICAgICAgICAgb3Mucm1kaXIoc2VsZi5wYXJlbnRfZGlyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgQmFzZVRlc3RDYXNlLnRlYXJEb3duKHNlbGYpCisKKyAgICBkZWYgdGVzdF91cmxfY29sbGFwc2VfcGF0aChzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgdGFpbCBpcyB0aGUgbGFzdCBwb3J0aW9uIGFuZCBoZWFkIGlzIHRoZSByZXN0IG9uIHByb3BlciB1cmxzCisgICAgICAgIHRlc3RfdmVjdG9ycyA9IHsKKyAgICAgICAgICAgICcnOiAnLy8nLAorICAgICAgICAgICAgJy4uJzogSW5kZXhFcnJvciwKKyAgICAgICAgICAgICcvLi8vLi4nOiBJbmRleEVycm9yLAorICAgICAgICAgICAgJy8nOiAnLy8nLAorICAgICAgICAgICAgJy8vJzogJy8vJywKKyAgICAgICAgICAgICcvXFwnOiAnLy9cXCcsCisgICAgICAgICAgICAnLy4vLyc6ICcvLycsCisgICAgICAgICAgICAnY2dpLWJpbi9maWxlMS5weSc6ICcvY2dpLWJpbi9maWxlMS5weScsCisgICAgICAgICAgICAnL2NnaS1iaW4vZmlsZTEucHknOiAnL2NnaS1iaW4vZmlsZTEucHknLAorICAgICAgICAgICAgJ2EnOiAnLy9hJywKKyAgICAgICAgICAgICcvYSc6ICcvL2EnLAorICAgICAgICAgICAgJy8vYSc6ICcvL2EnLAorICAgICAgICAgICAgJy4vYSc6ICcvL2EnLAorICAgICAgICAgICAgJy4vQzovJzogJy9DOi8nLAorICAgICAgICAgICAgJy9hL2InOiAnL2EvYicsCisgICAgICAgICAgICAnL2EvYi8nOiAnL2EvYi8nLAorICAgICAgICAgICAgJy9hL2IvLic6ICcvYS9iLycsCisgICAgICAgICAgICAnL2EvYi9jLy4uJzogJy9hL2IvJywKKyAgICAgICAgICAgICcvYS9iL2MvLi4vZCc6ICcvYS9iL2QnLAorICAgICAgICAgICAgJy9hL2IvYy8uLi9kL2UvLi4vZic6ICcvYS9iL2QvZicsCisgICAgICAgICAgICAnL2EvYi9jLy4uL2QvZS8uLi8uLi9mJzogJy9hL2IvZicsCisgICAgICAgICAgICAnL2EvYi9jLy4uL2QvZS8uLi8uLy4vLi8uLi8vZic6ICcvYS9iL2YnLAorICAgICAgICAgICAgJy4uL2EvYi9jLy4uL2QvZS8uLi8uLy4vLi8uLi8vZic6IEluZGV4RXJyb3IsCisgICAgICAgICAgICAnL2EvYi9jLy4uL2QvZS8uLi8uLi8uLi9mJzogJy9hL2YnLAorICAgICAgICAgICAgJy9hL2IvYy8uLi9kL2UvLi4vLi4vLi4vLi4vZic6ICcvL2YnLAorICAgICAgICAgICAgJy9hL2IvYy8uLi9kL2UvLi4vLi4vLi4vLi4vLi4vZic6IEluZGV4RXJyb3IsCisgICAgICAgICAgICAnL2EvYi9jLy4uL2QvZS8uLi8uLi8uLi8uLi9mLy4uJzogJy8vJywKKyAgICAgICAgICAgICcvYS9iL2MvLi4vZC9lLy4uLy4uLy4uLy4uL2YvLi4vLic6ICcvLycsCisgICAgICAgIH0KKyAgICAgICAgZm9yIHBhdGgsIGV4cGVjdGVkIGluIHRlc3RfdmVjdG9ycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIHR5cGUpIGFuZCBpc3N1YmNsYXNzKGV4cGVjdGVkLCBFeGNlcHRpb24pOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHSUhUVFBTZXJ2ZXIuX3VybF9jb2xsYXBzZV9wYXRoLCBwYXRoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhY3R1YWwgPSBDR0lIVFRQU2VydmVyLl91cmxfY29sbGFwc2VfcGF0aChwYXRoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0ncGF0aCA9ICVyXG5Hb3Q6ICAgICVyXG5XYW50ZWQ6ICVyJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0aCwgYWN0dWFsLCBleHBlY3RlZCkpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJzX2FuZF9jb250ZW50KHNlbGYpOgorICAgICAgICByZXMgPSBzZWxmLnJlcXVlc3QoJy9jZ2ktYmluL2ZpbGUxLnB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ0hlbGxvIFdvcmxkXG4nLCAndGV4dC9odG1sJywgMjAwKSwKKyAgICAgICAgICAgIChyZXMucmVhZCgpLCByZXMuZ2V0aGVhZGVyKCdDb250ZW50LXR5cGUnKSwgcmVzLnN0YXR1cykpCisKKyAgICBkZWYgdGVzdF9wb3N0KHNlbGYpOgorICAgICAgICBwYXJhbXMgPSB1cmxsaWIudXJsZW5jb2RlKHsnc3BhbScgOiAxLCAnZWdncycgOiAncHl0aG9uJywgJ2JhY29uJyA6IDEyMzQ1Nn0pCisgICAgICAgIGhlYWRlcnMgPSB7J0NvbnRlbnQtdHlwZScgOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ30KKyAgICAgICAgcmVzID0gc2VsZi5yZXF1ZXN0KCcvY2dpLWJpbi9maWxlMi5weScsICdQT1NUJywgcGFyYW1zLCBoZWFkZXJzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnJlYWQoKSwgJzEsIHB5dGhvbiwgMTIzNDU2XG4nKQorCisgICAgZGVmIHRlc3RfaW52YWxpZHVyaShzZWxmKToKKyAgICAgICAgcmVzID0gc2VsZi5yZXF1ZXN0KCcvY2dpLWJpbi9pbnZhbGlkJykKKyAgICAgICAgcmVzLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDQwNCkKKworICAgIGRlZiB0ZXN0X2F1dGhvcml6YXRpb24oc2VsZik6CisgICAgICAgIGhlYWRlcnMgPSB7J0F1dGhvcml6YXRpb24nIDogJ0Jhc2ljICVzJyAlCisgICAgICAgICAgICAgICAgICAgYmFzZTY0LmI2NGVuY29kZSgndXNlcm5hbWU6cGFzcycpfQorICAgICAgICByZXMgPSBzZWxmLnJlcXVlc3QoJy9jZ2ktYmluL2ZpbGUxLnB5JywgJ0dFVCcsIGhlYWRlcnM9aGVhZGVycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ0hlbGxvIFdvcmxkXG4nLCAndGV4dC9odG1sJywgMjAwKSwKKyAgICAgICAgICAgICAgICAocmVzLnJlYWQoKSwgcmVzLmdldGhlYWRlcignQ29udGVudC10eXBlJyksIHJlcy5zdGF0dXMpKQorCisgICAgZGVmIHRlc3Rfbm9fbGVhZGluZ19zbGFzaChzZWxmKToKKyAgICAgICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjI1NAorICAgICAgICByZXMgPSBzZWxmLnJlcXVlc3QoJ2NnaS1iaW4vZmlsZTEucHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgnSGVsbG8gV29ybGRcbicsICd0ZXh0L2h0bWwnLCAyMDApLAorICAgICAgICAgICAgIChyZXMucmVhZCgpLCByZXMuZ2V0aGVhZGVyKCdDb250ZW50LXR5cGUnKSwgcmVzLnN0YXR1cykpCisKKyAgICBkZWYgdGVzdF9vc19lbnZpcm9uX2lzX25vdF9hbHRlcmVkKHNlbGYpOgorICAgICAgICBzaWduYXR1cmUgPSAiVGVzdCBDR0kgU2VydmVyIgorICAgICAgICBvcy5lbnZpcm9uWydTRVJWRVJfU09GVFdBUkUnXSA9IHNpZ25hdHVyZQorICAgICAgICByZXMgPSBzZWxmLnJlcXVlc3QoJy9jZ2ktYmluL2ZpbGUxLnB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYidIZWxsbyBXb3JsZFxuJywgJ3RleHQvaHRtbCcsIDIwMCksCisgICAgICAgICAgICAgICAgKHJlcy5yZWFkKCksIHJlcy5nZXRoZWFkZXIoJ0NvbnRlbnQtdHlwZScpLCByZXMuc3RhdHVzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5lbnZpcm9uWydTRVJWRVJfU09GVFdBUkUnXSwgc2lnbmF0dXJlKQorCisKK2NsYXNzIFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiIgVGVzdCB1cmwgcGFyc2luZyAiIiIKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudHJhbnNsYXRlZCA9IG9zLmdldGN3ZCgpCisgICAgICAgIHNlbGYudHJhbnNsYXRlZCA9IG9zLnBhdGguam9pbihzZWxmLnRyYW5zbGF0ZWQsICdmaWxlbmFtZScpCisgICAgICAgIHNlbGYuaGFuZGxlciA9IFNvY2tldGxlc3NSZXF1ZXN0SGFuZGxlcigpCisKKyAgICBkZWYgdGVzdF9xdWVyeV9hcmd1bWVudHMoc2VsZik6CisgICAgICAgIHBhdGggPSBzZWxmLmhhbmRsZXIudHJhbnNsYXRlX3BhdGgoJy9maWxlbmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0aCwgc2VsZi50cmFuc2xhdGVkKQorICAgICAgICBwYXRoID0gc2VsZi5oYW5kbGVyLnRyYW5zbGF0ZV9wYXRoKCcvZmlsZW5hbWU/Zm9vPWJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0aCwgc2VsZi50cmFuc2xhdGVkKQorICAgICAgICBwYXRoID0gc2VsZi5oYW5kbGVyLnRyYW5zbGF0ZV9wYXRoKCcvZmlsZW5hbWU/YT1iJnNwYW09ZWdncyN6b3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdGgsIHNlbGYudHJhbnNsYXRlZCkKKworICAgIGRlZiB0ZXN0X3N0YXJ0X3dpdGhfZG91YmxlX3NsYXNoKHNlbGYpOgorICAgICAgICBwYXRoID0gc2VsZi5oYW5kbGVyLnRyYW5zbGF0ZV9wYXRoKCcvL2ZpbGVuYW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXRoLCBzZWxmLnRyYW5zbGF0ZWQpCisgICAgICAgIHBhdGggPSBzZWxmLmhhbmRsZXIudHJhbnNsYXRlX3BhdGgoJy8vZmlsZW5hbWU/Zm9vPWJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0aCwgc2VsZi50cmFuc2xhdGVkKQorCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0cnk6CisgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQmFzZUhUVFBSZXF1ZXN0SGFuZGxlclRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlclRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VIVFRQU2VydmVyVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlSFRUUFNlcnZlclRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHSUhUVFBTZXJ2ZXJUZXN0Q2FzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLmNoZGlyKGN3ZCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MGQwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwc2VydmVycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MGQwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwc2VydmVycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1hZ2VvcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYWdlb3AucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTYzMjBmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYWdlb3AucHkKQEAgLTAsMCArMSwyMTEgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiVGVzdCBzY3JpcHQgZm9yIHRoZSBpbWFnZW9wIG1vZHVsZS4gIFRoaXMgaGFzIHRoZSBzaWRlCisgICBlZmZlY3Qgb2YgcGFydGlhbGx5IHRlc3RpbmcgdGhlIGltZ2ZpbGUgbW9kdWxlIGFzIHdlbGwuCisgICBSb2dlciBFLiBNYXNzZQorIiIiCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHVubGluaywgaW1wb3J0X21vZHVsZSwgcnVuX3VuaXR0ZXN0CisKK2ltYWdlb3AgPSBpbXBvcnRfbW9kdWxlKCdpbWFnZW9wJywgZGVwcmVjYXRlZD1UcnVlKQoraW1wb3J0IHV1LCBvcywgdW5pdHRlc3QKKworCitTSVpFUyA9ICgxLCAyLCAzLCA0KQorX1ZBTFVFUyA9ICgxLCAyLCAyKioxMCwgMioqMTUtMSwgMioqMTUsIDIqKjE1KzEsIDIqKjMxLTIsIDIqKjMxLTEpCitWQUxVRVMgPSB0dXBsZSggLXggZm9yIHggaW4gcmV2ZXJzZWQoX1ZBTFVFUykgKSArICgwLCkgKyBfVkFMVUVTCitBQUFBQSA9ICJBIiAqIDEwMjQKK01BWF9MRU4gPSAyKioyMAorCisKK2NsYXNzIElucHV0VmFsaWRhdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBfY2hlY2soc2VsZiwgbmFtZSwgc2l6ZT1Ob25lLCAqZXh0cmEpOgorICAgICAgICBmdW5jID0gZ2V0YXR0cihpbWFnZW9wLCBuYW1lKQorICAgICAgICBmb3IgaGVpZ2h0IGluIFZBTFVFUzoKKyAgICAgICAgICAgIGZvciB3aWR0aCBpbiBWQUxVRVM6CisgICAgICAgICAgICAgICAgc3RybGVuID0gYWJzKHdpZHRoICogaGVpZ2h0KQorICAgICAgICAgICAgICAgIGlmIHNpemU6CisgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAqPSBzaXplCisgICAgICAgICAgICAgICAgaWYgc3RybGVuIDwgTUFYX0xFTjoKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICJBIiAqIHN0cmxlbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBBQUFBQQorICAgICAgICAgICAgICAgIGlmIHNpemU6CisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyA9IChkYXRhLCBzaXplLCB3aWR0aCwgaGVpZ2h0KSArIGV4dHJhCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzID0gKGRhdGEsIHdpZHRoLCBoZWlnaHQpICsgZXh0cmEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMoKmFyZ3VtZW50cykKKyAgICAgICAgICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIGltYWdlb3AuZXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgY2hlY2tfc2l6ZShzZWxmLCBuYW1lLCAqZXh0cmEpOgorICAgICAgICBmb3Igc2l6ZSBpbiBTSVpFUzoKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrKG5hbWUsIHNpemUsICpleHRyYSkKKworICAgIGRlZiBjaGVjayhzZWxmLCBuYW1lLCAqZXh0cmEpOgorICAgICAgICBzZWxmLl9jaGVjayhuYW1lLCBOb25lLCAqZXh0cmEpCisKKyAgICBkZWYgdGVzdF9pbnB1dF92YWxpZGF0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3NpemUoImNyb3AiLCAwLCAwLCAwLCAwKQorICAgICAgICBzZWxmLmNoZWNrX3NpemUoInNjYWxlIiwgMSwgMCkKKyAgICAgICAgc2VsZi5jaGVja19zaXplKCJzY2FsZSIsIC0xLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja19zaXplKCJ0b3ZpZGVvIikKKyAgICAgICAgc2VsZi5jaGVjaygiZ3JleTJtb25vIiwgMTI4KQorICAgICAgICBzZWxmLmNoZWNrKCJncmV5MmdyZXk0IikKKyAgICAgICAgc2VsZi5jaGVjaygiZ3JleTJncmV5MiIpCisgICAgICAgIHNlbGYuY2hlY2soImRpdGhlcjJtb25vIikKKyAgICAgICAgc2VsZi5jaGVjaygiZGl0aGVyMmdyZXkyIikKKyAgICAgICAgc2VsZi5jaGVjaygibW9ubzJncmV5IiwgMCwgMCkKKyAgICAgICAgc2VsZi5jaGVjaygiZ3JleTIyZ3JleSIpCisgICAgICAgIHNlbGYuY2hlY2soInJnYjJyZ2I4IikgIyBubGVuKjQgPT0gbGVuCisgICAgICAgIHNlbGYuY2hlY2soInJnYjgycmdiIikKKyAgICAgICAgc2VsZi5jaGVjaygicmdiMmdyZXkiKQorICAgICAgICBzZWxmLmNoZWNrKCJncmV5MnJnYiIpCisKKworZGVmIHRlc3RfbWFpbigpOgorCisgICAgcnVuX3VuaXR0ZXN0KElucHV0VmFsaWRhdGlvblRlc3RzKQorCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgaW1nZmlsZQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcmV0dXJuCisKKyAgICAjIENyZWF0ZSBiaW5hcnkgdGVzdCBmaWxlcworICAgIHV1LmRlY29kZShnZXRfcXVhbGlmaWVkX3BhdGgoJ3Rlc3RyZ2InK29zLmV4dHNlcCsndXVlJyksICd0ZXN0Jytvcy5leHRzZXArJ3JnYicpCisKKyAgICBpbWFnZSwgd2lkdGgsIGhlaWdodCA9IGdldGltYWdlKCd0ZXN0Jytvcy5leHRzZXArJ3JnYicpCisKKyAgICAjIFJldHVybiB0aGUgc2VsZWN0ZWQgcGFydCBvZiBpbWFnZSwgd2hpY2ggc2hvdWxkIGJ5IHdpZHRoIGJ5IGhlaWdodAorICAgICMgaW4gc2l6ZSBhbmQgY29uc2lzdCBvZiBwaXhlbHMgb2YgcHNpemUgYnl0ZXMuCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2Nyb3AnCisgICAgbmV3aW1hZ2UgPSBpbWFnZW9wLmNyb3AgKGltYWdlLCA0LCB3aWR0aCwgaGVpZ2h0LCAwLCAwLCAxLCAxKQorCisgICAgIyBSZXR1cm4gaW1hZ2Ugc2NhbGVkIHRvIHNpemUgbmV3d2lkdGggYnkgbmV3aGVpZ2h0LiBObyBpbnRlcnBvbGF0aW9uCisgICAgIyBpcyBkb25lLCBzY2FsaW5nIGlzIGRvbmUgYnkgc2ltcGxlLW1pbmRlZCBwaXhlbCBkdXBsaWNhdGlvbiBvciByZW1vdmFsLgorICAgICMgVGhlcmVmb3JlLCBjb21wdXRlci1nZW5lcmF0ZWQgaW1hZ2VzIG9yIGRpdGhlcmVkIGltYWdlcyB3aWxsCisgICAgIyBub3QgbG9vayBuaWNlIGFmdGVyIHNjYWxpbmcuCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ3NjYWxlJworICAgIHNjYWxlaW1hZ2UgPSBpbWFnZW9wLnNjYWxlKGltYWdlLCA0LCB3aWR0aCwgaGVpZ2h0LCAxLCAxKQorCisgICAgIyBSdW4gYSB2ZXJ0aWNhbCBsb3ctcGFzcyBmaWx0ZXIgb3ZlciBhbiBpbWFnZS4gSXQgZG9lcyBzbyBieSBjb21wdXRpbmcKKyAgICAjIGVhY2ggZGVzdGluYXRpb24gcGl4ZWwgYXMgdGhlIGF2ZXJhZ2Ugb2YgdHdvIHZlcnRpY2FsbHktYWxpZ25lZCBzb3VyY2UKKyAgICAjIHBpeGVscy4gVGhlIG1haW4gdXNlIG9mIHRoaXMgcm91dGluZSBpcyB0byBmb3Jlc3RhbGwgZXhjZXNzaXZlIGZsaWNrZXIKKyAgICAjIGlmIHRoZSBpbWFnZSB0d28gdmVydGljYWxseS1hbGlnbmVkIHNvdXJjZSBwaXhlbHMsICBoZW5jZSB0aGUgbmFtZS4KKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAndG92aWRlbycKKyAgICB2aWRlb2ltYWdlID0gaW1hZ2VvcC50b3ZpZGVvIChpbWFnZSwgNCwgd2lkdGgsIGhlaWdodCkKKworICAgICMgQ29udmVydCBhbiByZ2IgaW1hZ2UgdG8gYW4gOCBiaXQgcmdiCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ3JnYjJyZ2I4JworICAgIGdyZXlpbWFnZSA9IGltYWdlb3AucmdiMnJnYjgoaW1hZ2UsIHdpZHRoLCBoZWlnaHQpCisKKyAgICAjIENvbnZlcnQgYW4gOCBiaXQgcmdiIGltYWdlIHRvIGEgMjQgYml0IHJnYiBpbWFnZQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdyZ2I4MnJnYicKKyAgICBpbWFnZSA9IGltYWdlb3AucmdiODJyZ2IoZ3JleWltYWdlLCB3aWR0aCwgaGVpZ2h0KQorCisgICAgIyBDb252ZXJ0IGFuIHJnYiBpbWFnZSB0byBhbiA4IGJpdCBncmV5c2NhbGUgaW1hZ2UKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAncmdiMmdyZXknCisgICAgZ3JleWltYWdlID0gaW1hZ2VvcC5yZ2IyZ3JleShpbWFnZSwgd2lkdGgsIGhlaWdodCkKKworICAgICMgQ29udmVydCBhbiA4IGJpdCBncmV5c2NhbGUgaW1hZ2UgdG8gYSAyNCBiaXQgcmdiIGltYWdlCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2dyZXkycmdiJworICAgIGltYWdlID0gaW1hZ2VvcC5ncmV5MnJnYihncmV5aW1hZ2UsIHdpZHRoLCBoZWlnaHQpCisKKyAgICAjIENvbnZlcnQgYSA4LWJpdCBkZWVwIGdyZXlzY2FsZSBpbWFnZSB0byBhIDEtYml0IGRlZXAgaW1hZ2UgYnkKKyAgICAjIHRocmVzaG9sZGluZyBhbGwgdGhlIHBpeGVscy4gVGhlIHJlc3VsdGluZyBpbWFnZSBpcyB0aWdodGx5IHBhY2tlZAorICAgICMgYW5kIGlzIHByb2JhYmx5IG9ubHkgdXNlZnVsIGFzIGFuIGFyZ3VtZW50IHRvIG1vbm8yZ3JleS4KKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnZ3JleTJtb25vJworICAgIG1vbm9pbWFnZSA9IGltYWdlb3AuZ3JleTJtb25vIChncmV5aW1hZ2UsIHdpZHRoLCBoZWlnaHQsIDApCisKKyAgICAjIG1vbm9pbWFnZSwgd2lkdGgsIGhlaWdodCA9IGdldGltYWdlKCdtb25vdGVzdC5yZ2InKQorICAgICMgQ29udmVydCBhIDEtYml0IG1vbm9jaHJvbWUgaW1hZ2UgdG8gYW4gOCBiaXQgZ3JleXNjYWxlIG9yIGNvbG9yIGltYWdlLgorICAgICMgQWxsIHBpeGVscyB0aGF0IGFyZSB6ZXJvLXZhbHVlZCBvbiBpbnB1dCBnZXQgdmFsdWUgcDAgb24gb3V0cHV0IGFuZAorICAgICMgYWxsIG9uZS12YWx1ZSBpbnB1dCBwaXhlbHMgZ2V0IHZhbHVlIHAxIG9uIG91dHB1dC4gVG8gY29udmVydCBhCisgICAgIyBtb25vY2hyb21lICBibGFjay1hbmQtd2hpdGUgaW1hZ2UgdG8gZ3JleXNjYWxlIHBhc3MgdGhlIHZhbHVlcyAwIGFuZAorICAgICMgMjU1IHJlc3BlY3RpdmVseS4KKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnbW9ubzJncmV5JworICAgIGdyZXlpbWFnZSA9IGltYWdlb3AubW9ubzJncmV5IChtb25vaW1hZ2UsIHdpZHRoLCBoZWlnaHQsIDAsIDI1NSkKKworICAgICMgQ29udmVydCBhbiA4LWJpdCBncmV5c2NhbGUgaW1hZ2UgdG8gYSAxLWJpdCBtb25vY2hyb21lIGltYWdlIHVzaW5nIGEKKyAgICAjIChzaW1wbGUtbWluZGVkKSBkaXRoZXJpbmcgYWxnb3JpdGhtLgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdkaXRoZXIybW9ubycKKyAgICBtb25vaW1hZ2UgPSBpbWFnZW9wLmRpdGhlcjJtb25vIChncmV5aW1hZ2UsIHdpZHRoLCBoZWlnaHQpCisKKyAgICAjIENvbnZlcnQgYW4gOC1iaXQgZ3JleXNjYWxlIGltYWdlIHRvIGEgNC1iaXQgZ3JleXNjYWxlIGltYWdlIHdpdGhvdXQKKyAgICAjIGRpdGhlcmluZy4KKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnZ3JleTJncmV5NCcKKyAgICBncmV5NGltYWdlID0gaW1hZ2VvcC5ncmV5MmdyZXk0IChncmV5aW1hZ2UsIHdpZHRoLCBoZWlnaHQpCisKKyAgICAjIENvbnZlcnQgYW4gOC1iaXQgZ3JleXNjYWxlIGltYWdlIHRvIGEgMi1iaXQgZ3JleXNjYWxlIGltYWdlIHdpdGhvdXQKKyAgICAjIGRpdGhlcmluZy4KKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnZ3JleTJncmV5MicKKyAgICBncmV5MmltYWdlID0gaW1hZ2VvcC5ncmV5MmdyZXkyIChncmV5aW1hZ2UsIHdpZHRoLCBoZWlnaHQpCisKKyAgICAjIENvbnZlcnQgYW4gOC1iaXQgZ3JleXNjYWxlIGltYWdlIHRvIGEgMi1iaXQgZ3JleXNjYWxlIGltYWdlIHdpdGgKKyAgICAjIGRpdGhlcmluZy4gQXMgZm9yIGRpdGhlcjJtb25vLCB0aGUgZGl0aGVyaW5nIGFsZ29yaXRobSBpcyBjdXJyZW50bHkKKyAgICAjIHZlcnkgc2ltcGxlLgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdkaXRoZXIyZ3JleTInCisgICAgZ3JleTJpbWFnZSA9IGltYWdlb3AuZGl0aGVyMmdyZXkyIChncmV5aW1hZ2UsIHdpZHRoLCBoZWlnaHQpCisKKyAgICAjIENvbnZlcnQgYSA0LWJpdCBncmV5c2NhbGUgaW1hZ2UgdG8gYW4gOC1iaXQgZ3JleXNjYWxlIGltYWdlLgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdncmV5NDJncmV5JworICAgIGdyZXlpbWFnZSA9IGltYWdlb3AuZ3JleTQyZ3JleSAoZ3JleTRpbWFnZSwgd2lkdGgsIGhlaWdodCkKKworICAgICMgQ29udmVydCBhIDItYml0IGdyZXlzY2FsZSBpbWFnZSB0byBhbiA4LWJpdCBncmV5c2NhbGUgaW1hZ2UuCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2dyZXkyMmdyZXknCisgICAgaW1hZ2UgPSBpbWFnZW9wLmdyZXkyMmdyZXkgKGdyZXkyaW1hZ2UsIHdpZHRoLCBoZWlnaHQpCisKKyAgICAjIENsZWFudXAKKyAgICB1bmxpbmsoJ3Rlc3QnK29zLmV4dHNlcCsncmdiJykKKworZGVmIGdldGltYWdlKG5hbWUpOgorICAgICIiInJldHVybiBhIHR1cGxlIGNvbnNpc3Rpbmcgb2YKKyAgICAgICBpbWFnZSAoaW4gJ2ltZ2ZpbGUnIGZvcm1hdCkgd2lkdGggYW5kIGhlaWdodAorICAgICIiIgorICAgIGltcG9ydCBpbWdmaWxlCisgICAgdHJ5OgorICAgICAgICBzaXplcyA9IGltZ2ZpbGUuZ2V0c2l6ZXMobmFtZSkKKyAgICBleGNlcHQgaW1nZmlsZS5lcnJvcjoKKyAgICAgICAgbmFtZSA9IGdldF9xdWFsaWZpZWRfcGF0aChuYW1lKQorICAgICAgICBzaXplcyA9IGltZ2ZpbGUuZ2V0c2l6ZXMobmFtZSkKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnaW1nZmlsZSBvcGVuaW5nIHRlc3QgaW1hZ2U6ICVzLCBzaXplczogJXMnICUgKG5hbWUsIHN0cihzaXplcykpCisKKyAgICBpbWFnZSA9IGltZ2ZpbGUucmVhZChuYW1lKQorICAgIHJldHVybiAoaW1hZ2UsIHNpemVzWzBdLCBzaXplc1sxXSkKKworZGVmIGdldF9xdWFsaWZpZWRfcGF0aChuYW1lKToKKyAgICAiIiIgcmV0dXJuIGEgbW9yZSBxdWFsaWZpZWQgcGF0aCB0byBuYW1lIiIiCisgICAgaW1wb3J0IHN5cworICAgIGltcG9ydCBvcworICAgIHBhdGggPSBzeXMucGF0aAorICAgIHRyeToKKyAgICAgICAgcGF0aCA9IFtvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pXSArIHBhdGgKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZm9yIGRpciBpbiBwYXRoOgorICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihkaXIsIG5hbWUpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZ1bGxuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBmdWxsbmFtZQorICAgIHJldHVybiBuYW1lCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYWdlb3AucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1hZ2VvcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0MWYxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYWdlb3AucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYWdlb3AucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1hZ2VvcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc0MWYxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYWdlb3AucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYXBsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFwbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjIxM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFwbGliLnB5CkBAIC0wLDAgKzEsMjQwIEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0CisjIElmIHdlIGVuZCB1cCB3aXRoIGEgc2lnbmlmaWNhbnQgbnVtYmVyIG9mIHRlc3RzIHRoYXQgZG9uJ3QgcmVxdWlyZQorIyB0aHJlYWRpbmcsIHRoaXMgdGVzdCBtb2R1bGUgc2hvdWxkIGJlIHNwbGl0LiAgUmlnaHQgbm93IHdlIHNraXAKKyMgdGhlbSBhbGwgaWYgd2UgZG9uJ3QgaGF2ZSB0aHJlYWRpbmcuCit0aHJlYWRpbmcgPSBzdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RocmVhZGluZycpCisKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKK2ltcG9ydCBpbWFwbGliCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IFNvY2tldFNlcnZlcgoraW1wb3J0IHRpbWUKKworZnJvbSB0ZXN0X3N1cHBvcnQgaW1wb3J0IHJlYXBfdGhyZWFkcywgdmVyYm9zZSwgdHJhbnNpZW50X2ludGVybmV0CitpbXBvcnQgdW5pdHRlc3QKKwordHJ5OgorICAgIGltcG9ydCBzc2wKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBzc2wgPSBOb25lCisKK0NFUlRGSUxFID0gTm9uZQorCisKK2NsYXNzIFRlc3RJbWFwbGliKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3RoYXRfVGltZTJJbnRlcm5hbGRhdGVfcmV0dXJuc19hX3Jlc3VsdChzZWxmKToKKyAgICAgICAgIyBXZSBjYW4gY2hlY2sgb25seSB0aGF0IGl0IHN1Y2Nlc3NmdWxseSBwcm9kdWNlcyBhIHJlc3VsdCwKKyAgICAgICAgIyBub3QgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSByZXN1bHQgaXRzZWxmLCBzaW5jZSB0aGUgcmVzdWx0CisgICAgICAgICMgZGVwZW5kcyBvbiB0aGUgdGltZXpvbmUgdGhlIG1hY2hpbmUgaXMgaW4uCisgICAgICAgIHRpbWV2YWx1ZXMgPSBbMjAwMDAwMDAwMCwgMjAwMDAwMDAwMC4wLCB0aW1lLmxvY2FsdGltZSgyMDAwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAnIjE4LU1heS0yMDMzIDA1OjMzOjIwICswMjAwIiddCisKKyAgICAgICAgZm9yIHQgaW4gdGltZXZhbHVlczoKKyAgICAgICAgICAgIGltYXBsaWIuVGltZTJJbnRlcm5hbGRhdGUodCkKKworCitpZiBzc2w6CisKKyAgICBjbGFzcyBTZWN1cmVUQ1BTZXJ2ZXIoU29ja2V0U2VydmVyLlRDUFNlcnZlcik6CisKKyAgICAgICAgZGVmIGdldF9yZXF1ZXN0KHNlbGYpOgorICAgICAgICAgICAgbmV3c29ja2V0LCBmcm9tYWRkciA9IHNlbGYuc29ja2V0LmFjY2VwdCgpCisgICAgICAgICAgICBjb25uc3RyZWFtID0gc3NsLndyYXBfc29ja2V0KG5ld3NvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX3NpZGU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9Q0VSVEZJTEUpCisgICAgICAgICAgICByZXR1cm4gY29ubnN0cmVhbSwgZnJvbWFkZHIKKworICAgIElNQVA0X1NTTCA9IGltYXBsaWIuSU1BUDRfU1NMCisKK2Vsc2U6CisKKyAgICBjbGFzcyBTZWN1cmVUQ1BTZXJ2ZXI6CisgICAgICAgIHBhc3MKKworICAgIElNQVA0X1NTTCA9IE5vbmUKKworCitjbGFzcyBTaW1wbGVJTUFQSGFuZGxlcihTb2NrZXRTZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIpOgorCisgICAgdGltZW91dCA9IDEKKworICAgIGRlZiBfc2VuZChzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlNFTlQ6IiwgbWVzc2FnZS5zdHJpcCgpCisgICAgICAgIHNlbGYud2ZpbGUud3JpdGUobWVzc2FnZSkKKworICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgICMgU2VuZCBhIHdlbGNvbWUgbWVzc2FnZS4KKyAgICAgICAgc2VsZi5fc2VuZCgnKiBPSyBJTUFQNHJldjFcclxuJykKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICMgR2F0aGVyIHVwIGlucHV0IHVudGlsIHdlIHJlY2VpdmUgYSBsaW5lIHRlcm1pbmF0b3Igb3Igd2UgdGltZW91dC4KKyAgICAgICAgICAgICMgQWNjdW11bGF0ZSByZWFkKDEpIGJlY2F1c2UgaXQncyBzaW1wbGVyIHRvIGhhbmRsZSB0aGUgZGlmZmVyZW5jZXMKKyAgICAgICAgICAgICMgYmV0d2VlbiBuYWtlZCBzb2NrZXRzIGFuZCBTU0wgc29ja2V0cy4KKyAgICAgICAgICAgIGxpbmUgPSAnJworICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxmLnJmaWxlLnJlYWQoMSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcGFydCA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgTmFrZWQgc29ja2V0cyByZXR1cm4gZW1wdHkgc3RyaW5ncy4uCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgbGluZSArPSBwYXJ0CisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgLi5idXQgU1NMU29ja2V0cyByYWlzZSBleGNlcHRpb25zLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKCdcclxuJyk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICdHT1Q6JywgbGluZS5zdHJpcCgpCisgICAgICAgICAgICBzcGxpdGxpbmUgPSBsaW5lLnNwbGl0KCkKKyAgICAgICAgICAgIHRhZyA9IHNwbGl0bGluZVswXQorICAgICAgICAgICAgY21kID0gc3BsaXRsaW5lWzFdCisgICAgICAgICAgICBhcmdzID0gc3BsaXRsaW5lWzI6XQorCisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdjbWRfJXMnICUgKGNtZCwpKToKKyAgICAgICAgICAgICAgICBnZXRhdHRyKHNlbGYsICdjbWRfJXMnICUgKGNtZCwpKSh0YWcsIGFyZ3MpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX3NlbmQoJyVzIEJBRCAlcyB1bmtub3duXHJcbicgJSAodGFnLCBjbWQpKQorCisgICAgZGVmIGNtZF9DQVBBQklMSVRZKHNlbGYsIHRhZywgYXJncyk6CisgICAgICAgIHNlbGYuX3NlbmQoJyogQ0FQQUJJTElUWSBJTUFQNHJldjFcclxuJykKKyAgICAgICAgc2VsZi5fc2VuZCgnJXMgT0sgQ0FQQUJJTElUWSBjb21wbGV0ZWRcclxuJyAlICh0YWcsKSkKKworCitjbGFzcyBCYXNlVGhyZWFkZWROZXR3b3JrZWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgbWFrZV9zZXJ2ZXIoc2VsZiwgYWRkciwgaGRscik6CisKKyAgICAgICAgY2xhc3MgTXlTZXJ2ZXIoc2VsZi5zZXJ2ZXJfY2xhc3MpOgorICAgICAgICAgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZV9yZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfY2xvc2UoKQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgImNyZWF0aW5nIHNlcnZlciIKKyAgICAgICAgc2VydmVyID0gTXlTZXJ2ZXIoYWRkciwgaGRscikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2ZXIuc2VydmVyX2FkZHJlc3MsIHNlcnZlci5zb2NrZXQuZ2V0c29ja25hbWUoKSkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgInNlcnZlciBjcmVhdGVkIgorICAgICAgICAgICAgcHJpbnQgIkFERFIgPSIsIGFkZHIKKyAgICAgICAgICAgIHByaW50ICJDTEFTUyA9Iiwgc2VsZi5zZXJ2ZXJfY2xhc3MKKyAgICAgICAgICAgIHByaW50ICJIRExSID0iLCBzZXJ2ZXIuUmVxdWVzdEhhbmRsZXJDbGFzcworCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKAorICAgICAgICAgICAgbmFtZT0nJXMgc2VydmluZycgJSBzZWxmLnNlcnZlcl9jbGFzcywKKyAgICAgICAgICAgIHRhcmdldD1zZXJ2ZXIuc2VydmVfZm9yZXZlciwKKyAgICAgICAgICAgICMgU2hvcnQgcG9sbCBpbnRlcnZhbCB0byBtYWtlIHRoZSB0ZXN0IGZpbmlzaCBxdWlja2x5LgorICAgICAgICAgICAgIyBUaW1lIGJldHdlZW4gcmVxdWVzdHMgaXMgc2hvcnQgZW5vdWdoIHRoYXQgd2Ugd29uJ3Qgd2FrZQorICAgICAgICAgICAgIyB1cCBzcHVyaW91c2x5IHRvbyBtYW55IHRpbWVzLgorICAgICAgICAgICAga3dhcmdzPXsncG9sbF9pbnRlcnZhbCc6MC4wMX0pCisgICAgICAgIHQuZGFlbW9uID0gVHJ1ZSAgIyBJbiBjYXNlIHRoaXMgZnVuY3Rpb24gcmFpc2VzLgorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgInNlcnZlciBydW5uaW5nIgorICAgICAgICByZXR1cm4gc2VydmVyLCB0CisKKyAgICBkZWYgcmVhcF9zZXJ2ZXIoc2VsZiwgc2VydmVyLCB0aHJlYWQpOgorICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAid2FpdGluZyBmb3Igc2VydmVyIgorICAgICAgICBzZXJ2ZXIuc2h1dGRvd24oKQorICAgICAgICB0aHJlYWQuam9pbigpCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJkb25lIgorCisgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgZGVmIHJlYXBlZF9zZXJ2ZXIoc2VsZiwgaGRscik6CisgICAgICAgIHNlcnZlciwgdGhyZWFkID0gc2VsZi5tYWtlX3NlcnZlcigoc3VwcG9ydC5IT1NULCAwKSwgaGRscikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQgc2VydmVyCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlYXBfc2VydmVyKHNlcnZlciwgdGhyZWFkKQorCisgICAgQHJlYXBfdGhyZWFkcworICAgIGRlZiB0ZXN0X2Nvbm5lY3Qoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5yZWFwZWRfc2VydmVyKFNpbXBsZUlNQVBIYW5kbGVyKSBhcyBzZXJ2ZXI6CisgICAgICAgICAgICBjbGllbnQgPSBzZWxmLmltYXBfY2xhc3MoKnNlcnZlci5zZXJ2ZXJfYWRkcmVzcykKKyAgICAgICAgICAgIGNsaWVudC5zaHV0ZG93bigpCisKKyAgICBAcmVhcF90aHJlYWRzCisgICAgZGVmIHRlc3RfaXNzdWU1OTQ5KHNlbGYpOgorCisgICAgICAgIGNsYXNzIEVPRkhhbmRsZXIoU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKKyAgICAgICAgICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgICAgICAgICAgIyBFT0Ygd2l0aG91dCBzZW5kaW5nIGEgY29tcGxldGUgd2VsY29tZSBtZXNzYWdlLgorICAgICAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoJyogT0snKQorCisgICAgICAgIHdpdGggc2VsZi5yZWFwZWRfc2VydmVyKEVPRkhhbmRsZXIpIGFzIHNlcnZlcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGltYXBsaWIuSU1BUDQuYWJvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmltYXBfY2xhc3MsICpzZXJ2ZXIuc2VydmVyX2FkZHJlc3MpCisKKworY2xhc3MgVGhyZWFkZWROZXR3b3JrZWRUZXN0cyhCYXNlVGhyZWFkZWROZXR3b3JrZWRUZXN0cyk6CisKKyAgICBzZXJ2ZXJfY2xhc3MgPSBTb2NrZXRTZXJ2ZXIuVENQU2VydmVyCisgICAgaW1hcF9jbGFzcyA9IGltYXBsaWIuSU1BUDQKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyhzc2wsICJTU0wgbm90IGF2YWlsYWJsZSIpCitjbGFzcyBUaHJlYWRlZE5ldHdvcmtlZFRlc3RzU1NMKEJhc2VUaHJlYWRlZE5ldHdvcmtlZFRlc3RzKToKKworICAgIHNlcnZlcl9jbGFzcyA9IFNlY3VyZVRDUFNlcnZlcgorICAgIGltYXBfY2xhc3MgPSBJTUFQNF9TU0wKKworCitjbGFzcyBSZW1vdGVJTUFQVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgaG9zdCA9ICdjeXJ1cy5hbmRyZXcuY211LmVkdScKKyAgICBwb3J0ID0gMTQzCisgICAgdXNlcm5hbWUgPSAnYW5vbnltb3VzJworICAgIHBhc3N3b3JkID0gJ3Bhc3MnCisgICAgaW1hcF9jbGFzcyA9IGltYXBsaWIuSU1BUDQKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgd2l0aCB0cmFuc2llbnRfaW50ZXJuZXQoc2VsZi5ob3N0KToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyID0gc2VsZi5pbWFwX2NsYXNzKHNlbGYuaG9zdCwgc2VsZi5wb3J0KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnNlcnZlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyLmxvZ291dCgpCisKKyAgICBkZWYgdGVzdF9sb2dpbmNhcGEoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnTE9HSU5ESVNBQkxFRCcgaW4gc2VsZi5zZXJ2ZXIuY2FwYWJpbGl0aWVzKQorCisgICAgZGVmIHRlc3RfYW5vbmxvZ2luKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0FVVEg9QU5PTllNT1VTJyBpbiBzZWxmLnNlcnZlci5jYXBhYmlsaXRpZXMpCisgICAgICAgIHJzID0gc2VsZi5zZXJ2ZXIubG9naW4oc2VsZi51c2VybmFtZSwgc2VsZi5wYXNzd29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyc1swXSwgJ09LJykKKworICAgIGRlZiB0ZXN0X2xvZ291dChzZWxmKToKKyAgICAgICAgcnMgPSBzZWxmLnNlcnZlci5sb2dvdXQoKQorICAgICAgICBzZWxmLnNlcnZlciA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyc1swXSwgJ0JZRScpCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3NsLCAiU1NMIG5vdCBhdmFpbGFibGUiKQorY2xhc3MgUmVtb3RlSU1BUF9TU0xUZXN0KFJlbW90ZUlNQVBUZXN0KToKKyAgICBwb3J0ID0gOTkzCisgICAgaW1hcF9jbGFzcyA9IElNQVA0X1NTTAorCisgICAgZGVmIHRlc3RfbG9naW5jYXBhKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCdMT0dJTkRJU0FCTEVEJyBpbiBzZWxmLnNlcnZlci5jYXBhYmlsaXRpZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnQVVUSD1QTEFJTicgaW4gc2VsZi5zZXJ2ZXIuY2FwYWJpbGl0aWVzKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0cyA9IFtUZXN0SW1hcGxpYl0KKworICAgIGlmIHN1cHBvcnQuaXNfcmVzb3VyY2VfZW5hYmxlZCgnbmV0d29yaycpOgorICAgICAgICBpZiBzc2w6CisgICAgICAgICAgICBnbG9iYWwgQ0VSVEZJTEUKKyAgICAgICAgICAgIENFUlRGSUxFID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3Igb3MuY3VyZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleWNlcnQucGVtIikKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhDRVJURklMRSk6CisgICAgICAgICAgICAgICAgcmFpc2Ugc3VwcG9ydC5UZXN0RmFpbGVkKCJDYW4ndCByZWFkIGNlcnRpZmljYXRlIGZpbGVzISIpCisgICAgICAgIHRlc3RzLmV4dGVuZChbCisgICAgICAgICAgICBUaHJlYWRlZE5ldHdvcmtlZFRlc3RzLCBUaHJlYWRlZE5ldHdvcmtlZFRlc3RzU1NMLAorICAgICAgICAgICAgUmVtb3RlSU1BUFRlc3QsIFJlbW90ZUlNQVBfU1NMVGVzdCwKKyAgICAgICAgXSkKKworICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN1cHBvcnQudXNlX3Jlc291cmNlcyA9IFsnbmV0d29yayddCisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYXBsaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1hcGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExZGI0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYXBsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYXBsaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1hcGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExZGI0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYXBsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltZ2ZpbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWdmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5ZTg5MTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWdmaWxlLnB5CkBAIC0wLDAgKzEsMTE5IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIlNpbXBsZSB0ZXN0IHNjcmlwdCBmb3IgaW1nZmlsZS5jCisgICBSb2dlciBFLiBNYXNzZQorIiIiCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHVubGluaywgZmluZGZpbGUsIGltcG9ydF9tb2R1bGUKKworaW1nZmlsZSA9IGltcG9ydF9tb2R1bGUoJ2ltZ2ZpbGUnLCBkZXByZWNhdGVkPVRydWUpCitpbXBvcnQgdXUKKworCitkZWYgdGVzdGltYWdlKG5hbWUpOgorICAgICIiIlJ1biB0aHJvdWdoIHRoZSBpbWdmaWxlJ3MgYmF0dGVyeSBvZiBwb3NzaWJsZSBtZXRob2RzCisgICAgICAgb24gdGhlIGltYWdlIHBhc3NlZCBpbiBuYW1lLgorICAgICIiIgorCisgICAgaW1wb3J0IHN5cworICAgIGltcG9ydCBvcworCisgICAgb3V0cHV0ZmlsZSA9ICcvdG1wL2RlbGV0ZW1lJworCisgICAgIyB0cnkgb3BlbmluZyB0aGUgbmFtZSBkaXJlY3RseQorICAgIHRyeToKKyAgICAgICAgIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB0dXBsZSAoeCwgeSwgeikgd2hlcmUgeCBhbmQgeSBhcmUgdGhlIHNpemUKKyAgICAgICAgIyBvZiB0aGUgaW1hZ2UgaW4gcGl4ZWxzIGFuZCB6IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsLiBPbmx5CisgICAgICAgICMgMyBieXRlIFJHQiBwaXhlbHMgYW5kIDEgYnl0ZSBncmV5c2NhbGUgcGl4ZWxzIGFyZSBzdXBwb3J0ZWQuCisgICAgICAgIHNpemVzID0gaW1nZmlsZS5nZXRzaXplcyhuYW1lKQorICAgIGV4Y2VwdCBpbWdmaWxlLmVycm9yOgorICAgICAgICAjIGdldCBhIG1vcmUgcXVhbGlmaWVkIHBhdGggY29tcG9uZW50IG9mIHRoZSBzY3JpcHQuLi4KKyAgICAgICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAgICAgICAgIG91cm5hbWUgPSBzeXMuYXJndlswXQorICAgICAgICBlbHNlOiAjIC4uLm9yIHRoZSBmdWxsIHBhdGggb2YgdGhlIG1vZHVsZQorICAgICAgICAgICAgb3VybmFtZSA9IHN5cy5tb2R1bGVzW19fbmFtZV9fXS5fX2ZpbGVfXworCisgICAgICAgIHBhcnRzID0gb3VybmFtZS5zcGxpdChvcy5zZXApCisgICAgICAgIHBhcnRzWy0xXSA9IG5hbWUKKyAgICAgICAgbmFtZSA9IG9zLnNlcC5qb2luKHBhcnRzKQorICAgICAgICBzaXplcyA9IGltZ2ZpbGUuZ2V0c2l6ZXMobmFtZSkKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnT3BlbmluZyB0ZXN0IGltYWdlOiAlcywgc2l6ZXM6ICVzJyAlIChuYW1lLCBzdHIoc2l6ZXMpKQorICAgICMgVGhpcyBmdW5jdGlvbiByZWFkcyBhbmQgZGVjb2RlcyB0aGUgaW1hZ2Ugb24gdGhlIHNwZWNpZmllZCBmaWxlLAorICAgICMgYW5kIHJldHVybnMgaXQgYXMgYSBweXRob24gc3RyaW5nLiBUaGUgc3RyaW5nIGhhcyBlaXRoZXIgMSBieXRlCisgICAgIyBncmV5c2NhbGUgcGl4ZWxzIG9yIDQgYnl0ZSBSR0JBIHBpeGVscy4gVGhlIGJvdHRvbSBsZWZ0IHBpeGVsCisgICAgIyBpcyB0aGUgZmlyc3QgaW4gdGhlIHN0cmluZy4gVGhpcyBmb3JtYXQgaXMgc3VpdGFibGUgdG8gcGFzcworICAgICMgdG8gZ2wubHJlY3R3cml0ZSwgZm9yIGluc3RhbmNlLgorICAgIGltYWdlID0gaW1nZmlsZS5yZWFkKG5hbWUpCisKKyAgICAjIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBSR0Igb3IgZ3JleXNjYWxlIGRhdGEgaW4gZGF0YSB0bworICAgICMgaW1hZ2UgZmlsZSBmaWxlLiB4IGFuZCB5IGdpdmUgdGhlIHNpemUgb2YgdGhlIGltYWdlLCB6IGlzCisgICAgIyAxIGZvciAxIGJ5dGUgZ3JleXNjYWxlIGltYWdlcyBvciAzIGZvciBSR0IgaW1hZ2VzICh3aGljaAorICAgICMgYXJlIHN0b3JlZCBhcyA0IGJ5dGUgdmFsdWVzIG9mIHdoaWNoIG9ubHkgdGhlIGxvd2VyIHRocmVlCisgICAgIyBieXRlcyBhcmUgdXNlZCkuIFRoZXNlIGFyZSB0aGUgZm9ybWF0cyByZXR1cm5lZCBieSBnbC5scmVjdHJlYWQuCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ1dyaXRpbmcgb3V0cHV0IGZpbGUnCisgICAgaW1nZmlsZS53cml0ZSAob3V0cHV0ZmlsZSwgaW1hZ2UsIHNpemVzWzBdLCBzaXplc1sxXSwgc2l6ZXNbMl0pCisKKworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdPcGVuaW5nIHNjYWxlZCB0ZXN0IGltYWdlOiAlcywgc2l6ZXM6ICVzJyAlIChuYW1lLCBzdHIoc2l6ZXMpKQorICAgICMgVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gcmVhZCBidXQgaXQgcmV0dXJucyBhbiBpbWFnZSB0aGF0CisgICAgIyBpcyBzY2FsZWQgdG8gdGhlIGdpdmVuIHggYW5kIHkgc2l6ZXMuIElmIHRoZSBmaWx0ZXIgYW5kIGJsdXIKKyAgICAjIHBhcmFtZXRlcnMgYXJlIG9taXR0ZWQgc2NhbGluZyBpcyBkb25lIGJ5IHNpbXBseSBkcm9wcGluZworICAgICMgb3IgZHVwbGljYXRpbmcgcGl4ZWxzLCBzbyB0aGUgcmVzdWx0IHdpbGwgYmUgbGVzcyB0aGFuIHBlcmZlY3QsCisgICAgIyBlc3BlY2lhbGx5IGZvciBjb21wdXRlci1nZW5lcmF0ZWQgaW1hZ2VzLiAgQWx0ZXJuYXRpdmVseSwKKyAgICAjIHlvdSBjYW4gc3BlY2lmeSBhIGZpbHRlciB0byB1c2UgdG8gc21vb3RoZW4gdGhlIGltYWdlIGFmdGVyCisgICAgIyBzY2FsaW5nLiBUaGUgZmlsdGVyIGZvcm1zIHN1cHBvcnRlZCBhcmUgJ2ltcHVsc2UnLCAnYm94JywKKyAgICAjICd0cmlhbmdsZScsICdxdWFkcmF0aWMnIGFuZCAnZ2F1c3NpYW4nLiBJZiBhIGZpbHRlciBpcworICAgICMgc3BlY2lmaWVkIGJsdXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlCisgICAgIyBibHVycmluZXNzIG9mIHRoZSBmaWx0ZXIuIEl0IGRlZmF1bHRzIHRvIDEuMC4gIHJlYWRzY2FsZWQKKyAgICAjIG1ha2VzIG5vIGF0dGVtcHQgdG8ga2VlcCB0aGUgYXNwZWN0IHJhdGlvIGNvcnJlY3QsIHNvIHRoYXQKKyAgICAjIGlzIHRoZSB1c2VycycgcmVzcG9uc2liaWxpdHkuCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ0ZpbHRlcmluZyB3aXRoICJpbXB1bHNlIicKKyAgICBzaW1hZ2UgPSBpbWdmaWxlLnJlYWRzY2FsZWQgKG5hbWUsIHNpemVzWzBdLzIsIHNpemVzWzFdLzIsICdpbXB1bHNlJywgMi4wKQorCisgICAgIyBUaGlzIGZ1bmN0aW9uIHNldHMgYSBnbG9iYWwgZmxhZyB3aGljaCBkZWZpbmVzIHdoZXRoZXIgdGhlCisgICAgIyBzY2FuIGxpbmVzIG9mIHRoZSBpbWFnZSBhcmUgcmVhZCBvciB3cml0dGVuIGZyb20gYm90dG9tIHRvCisgICAgIyB0b3AgKGZsYWcgaXMgemVybywgY29tcGF0aWJsZSB3aXRoIFNHSSBHTCkgb3IgZnJvbSB0b3AgdG8KKyAgICAjIGJvdHRvbShmbGFnIGlzIG9uZSwgY29tcGF0aWJsZSB3aXRoIFgpLiBUaGUgZGVmYXVsdCBpcyB6ZXJvLgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdTd2l0Y2hpbmcgdG8gWCBjb21wYXRpYmlsaXR5JworICAgIGltZ2ZpbGUudHRvYiAoMSkKKworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdGaWx0ZXJpbmcgd2l0aCAidHJpYW5nbGUiJworICAgIHNpbWFnZSA9IGltZ2ZpbGUucmVhZHNjYWxlZCAobmFtZSwgc2l6ZXNbMF0vMiwgc2l6ZXNbMV0vMiwgJ3RyaWFuZ2xlJywgMy4wKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdTd2l0Y2hpbmcgYmFjayB0byBTR0kgY29tcGF0aWJpbGl0eScKKyAgICBpbWdmaWxlLnR0b2IgKDApCisKKyAgICBpZiB2ZXJib3NlOiBwcmludCAnRmlsdGVyaW5nIHdpdGggInF1YWRyYXRpYyInCisgICAgc2ltYWdlID0gaW1nZmlsZS5yZWFkc2NhbGVkIChuYW1lLCBzaXplc1swXS8yLCBzaXplc1sxXS8yLCAncXVhZHJhdGljJykKKyAgICBpZiB2ZXJib3NlOiBwcmludCAnRmlsdGVyaW5nIHdpdGggImdhdXNzaWFuIicKKyAgICBzaW1hZ2UgPSBpbWdmaWxlLnJlYWRzY2FsZWQgKG5hbWUsIHNpemVzWzBdLzIsIHNpemVzWzFdLzIsICdnYXVzc2lhbicsIDEuMCkKKworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdXcml0aW5nIG91dHB1dCBmaWxlJworICAgIGltZ2ZpbGUud3JpdGUgKG91dHB1dGZpbGUsIHNpbWFnZSwgc2l6ZXNbMF0vMiwgc2l6ZXNbMV0vMiwgc2l6ZXNbMl0pCisKKyAgICBvcy51bmxpbmsob3V0cHV0ZmlsZSkKKworCitkZWYgdGVzdF9tYWluKCk6CisKKyAgICB1dS5kZWNvZGUoZmluZGZpbGUoJ3Rlc3RyZ2IudXVlJyksICd0ZXN0LnJnYicpCisgICAgdXUuZGVjb2RlKGZpbmRmaWxlKCdncmV5cmdiLnV1ZScpLCAnZ3JleXRlc3QucmdiJykKKworICAgICMgVGVzdCBhIDMgYnl0ZSBjb2xvciBpbWFnZQorICAgIHRlc3RpbWFnZSgndGVzdC5yZ2InKQorCisgICAgIyBUZXN0IGEgMSBieXRlIGdyZXlzY2FsZSBpbWFnZQorICAgIHRlc3RpbWFnZSgnZ3JleXRlc3QucmdiJykKKworICAgIHVubGluaygndGVzdC5yZ2InKQorICAgIHVubGluaygnZ3JleXRlc3QucmdiJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1nZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWdmaWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTg0YTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1nZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1nZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWdmaWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTg0YTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1nZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZTQ0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXAucHkKQEAgLTAsMCArMSw4MSBAQAoraW1wb3J0IGltcAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK2NsYXNzIExvY2tUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJWZXJ5IGJhc2ljIHRlc3Qgb2YgaW1wb3J0IGxvY2sgZnVuY3Rpb25zLiIiIgorCisgICAgZGVmIHZlcmlmeV9sb2NrX3N0YXRlKHNlbGYsIGV4cGVjdGVkKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbXAubG9ja19oZWxkKCksIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgaW1wLmxvY2tfaGVsZCgpIHRvIGJlICVyIiAlIGV4cGVjdGVkKQorICAgIGRlZiB0ZXN0TG9jayhzZWxmKToKKyAgICAgICAgTE9PUFMgPSA1MAorCisgICAgICAgICMgVGhlIGltcG9ydCBsb2NrIG1heSBhbHJlYWR5IGJlIGhlbGQsIGUuZy4gaWYgdGhlIHRlc3Qgc3VpdGUgaXMgcnVuCisgICAgICAgICMgdmlhICJpbXBvcnQgdGVzdC5hdXRvdGVzdCIuCisgICAgICAgIGxvY2tfaGVsZF9hdF9zdGFydCA9IGltcC5sb2NrX2hlbGQoKQorICAgICAgICBzZWxmLnZlcmlmeV9sb2NrX3N0YXRlKGxvY2tfaGVsZF9hdF9zdGFydCkKKworICAgICAgICBmb3IgaSBpbiByYW5nZShMT09QUyk6CisgICAgICAgICAgICBpbXAuYWNxdWlyZV9sb2NrKCkKKyAgICAgICAgICAgIHNlbGYudmVyaWZ5X2xvY2tfc3RhdGUoVHJ1ZSkKKworICAgICAgICBmb3IgaSBpbiByYW5nZShMT09QUyk6CisgICAgICAgICAgICBpbXAucmVsZWFzZV9sb2NrKCkKKworICAgICAgICAjIFRoZSBvcmlnaW5hbCBzdGF0ZSBzaG91bGQgYmUgcmVzdG9yZWQgbm93LgorICAgICAgICBzZWxmLnZlcmlmeV9sb2NrX3N0YXRlKGxvY2tfaGVsZF9hdF9zdGFydCkKKworICAgICAgICBpZiBub3QgbG9ja19oZWxkX2F0X3N0YXJ0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcC5yZWxlYXNlX2xvY2soKQorICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVsZWFzZV9sb2NrKCkgd2l0aG91dCBsb2NrIHNob3VsZCByYWlzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJ1bnRpbWVFcnJvciIpCisKK2NsYXNzIFJlbG9hZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICIiIlZlcnkgYmFzaWMgdGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQgaW1wLnJlbG9hZCgpIG9wZXJhdGVzIGp1c3QgbGlrZQorICAgIHJlbG9hZCgpLiIiIgorCisgICAgZGVmIHRlc3Rfc291cmNlKHNlbGYpOgorICAgICAgICAjIFhYWCAobmNvZ2hsYW4pOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHVzZSB0ZXN0X3N1cHBvcnQuQ2xlYW5JbXBvcnQKKyAgICAgICAgIyBoZXJlLCBidXQgdGhhdCBicmVha3MgYmVjYXVzZSB0aGUgb3MgbW9kdWxlIHJlZ2lzdGVycyBzb21lCisgICAgICAgICMgaGFuZGxlcnMgaW4gY29weV9yZWcgb24gaW1wb3J0LiBTaW5jZSBDbGVhbkltcG9ydCBkb2Vzbid0CisgICAgICAgICMgcmV2ZXJ0IHRoYXQgcmVnaXN0cmF0aW9uLCB0aGUgbW9kdWxlIGlzIGxlZnQgaW4gYSBicm9rZW4KKyAgICAgICAgIyBzdGF0ZSBhZnRlciByZXZlcnNpb24uIFJlaW5pdGlhbGlzaW5nIHRoZSBtb2R1bGUgY29udGVudHMKKyAgICAgICAgIyBhbmQganVzdCByZXZlcnRpbmcgb3MuZW52aXJvbiB0byBpdHMgcHJldmlvdXMgc3RhdGUgaXMgYW4gT0sKKyAgICAgICAgIyB3b3JrYXJvdW5kCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKToKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgaW1wLnJlbG9hZChvcykKKworICAgIGRlZiB0ZXN0X2V4dGVuc2lvbihzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuQ2xlYW5JbXBvcnQoJ3RpbWUnKToKKyAgICAgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgICAgICBpbXAucmVsb2FkKHRpbWUpCisKKyAgICBkZWYgdGVzdF9idWlsdGluKHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5DbGVhbkltcG9ydCgnbWFyc2hhbCcpOgorICAgICAgICAgICAgaW1wb3J0IG1hcnNoYWwKKyAgICAgICAgICAgIGltcC5yZWxvYWQobWFyc2hhbCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdHMgPSBbCisgICAgICAgIFJlbG9hZFRlc3RzLAorICAgIF0KKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB0aHJlYWQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICB0ZXN0cy5hcHBlbmQoTG9ja1Rlc3RzKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXAucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTkwM2ExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXAucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTkwM2ExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE3ZGExMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydC5weQpAQCAtMCwwICsxLDY1MCBAQAoraW1wb3J0IGVycm5vCitpbXBvcnQgaW1wCitpbXBvcnQgbWFyc2hhbAoraW1wb3J0IG9zCitpbXBvcnQgcHlfY29tcGlsZQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHN0YXQKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRleHR3cmFwCitpbXBvcnQgc2h1dGlsCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0ICh1bmxpbmssIFRFU1RGTiwgdW5sb2FkLCBydW5fdW5pdHRlc3QsIHJtdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19qeXRob24sIGNoZWNrX3dhcm5pbmdzLCBFbnZpcm9ubWVudFZhckd1YXJkKQorZnJvbSB0ZXN0IGltcG9ydCBzeW1saW5rX3N1cHBvcnQKK2Zyb20gdGVzdCBpbXBvcnQgc2NyaXB0X2hlbHBlcgorCitkZWYgX2ZpbGVzKG5hbWUpOgorICAgIHJldHVybiAobmFtZSArIG9zLmV4dHNlcCArICJweSIsCisgICAgICAgICAgICBuYW1lICsgb3MuZXh0c2VwICsgInB5YyIsCisgICAgICAgICAgICBuYW1lICsgb3MuZXh0c2VwICsgInB5byIsCisgICAgICAgICAgICBuYW1lICsgb3MuZXh0c2VwICsgInB5dyIsCisgICAgICAgICAgICBuYW1lICsgIiRweS5jbGFzcyIpCisKK2RlZiBjaG1vZF9maWxlcyhuYW1lKToKKyAgICBmb3IgZiBpbiBfZmlsZXMobmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmNobW9kKGYsIDA2MDApCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGV4YzoKKyAgICAgICAgICAgIGlmIGV4Yy5lcnJubyAhPSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgcmFpc2UKKworZGVmIHJlbW92ZV9maWxlcyhuYW1lKToKKyAgICBmb3IgZiBpbiBfZmlsZXMobmFtZSk6CisgICAgICAgIHVubGluayhmKQorCisKK2NsYXNzIEltcG9ydFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdW5sb2FkKFRFU1RGTikKKyAgICBzZXRVcCA9IHRlYXJEb3duCisKKyAgICBkZWYgdGVzdF9jYXNlX3NlbnNpdGl2aXR5KHNlbGYpOgorICAgICAgICAjIEJyaWVmIGRpZ3Jlc3Npb24gdG8gdGVzdCB0aGF0IGltcG9ydCBpcyBjYXNlLXNlbnNpdGl2ZTogIGlmIHdlIGdvdAorICAgICAgICAjIHRoaXMgZmFyLCB3ZSBrbm93IGZvciBzdXJlIHRoYXQgInJhbmRvbSIgZXhpc3RzLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgUkFuRG9NCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiaW1wb3J0IG9mIFJBbkRvTSBzaG91bGQgaGF2ZSBmYWlsZWQgKGNhc2UgbWlzbWF0Y2gpIikKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9jb25zdChzZWxmKToKKyAgICAgICAgIyBBbm90aGVyIGJyaWVmIGRpZ3Jlc3Npb24gdG8gdGVzdCB0aGUgYWNjdXJhY3kgb2YgbWFuaWZlc3QgZmxvYXQKKyAgICAgICAgIyBjb25zdGFudHMuCisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgZG91YmxlX2NvbnN0ICAjIGRvbid0IGJsaW5rIC0tIHRoYXQgKndhcyogdGhlIHRlc3QKKworICAgIGRlZiB0ZXN0X2ltcG9ydChzZWxmKToKKyAgICAgICAgZGVmIHRlc3Rfd2l0aF9leHRlbnNpb24oZXh0KToKKyAgICAgICAgICAgICMgVGhlIGV4dGVuc2lvbiBpcyBub3JtYWxseSAiLnB5IiwgcGVyaGFwcyAiLnB5dyIuCisgICAgICAgICAgICBzb3VyY2UgPSBURVNURk4gKyBleHQKKyAgICAgICAgICAgIHB5byA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweW8iCisgICAgICAgICAgICBpZiBpc19qeXRob246CisgICAgICAgICAgICAgICAgcHljID0gVEVTVEZOICsgIiRweS5jbGFzcyIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHljID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5YyIKKworICAgICAgICAgICAgd2l0aCBvcGVuKHNvdXJjZSwgInciKSBhcyBmOgorICAgICAgICAgICAgICAgIHByaW50ID4+IGYsICgiIyBUaGlzIHRlc3RzIFB5dGhvbidzIGFiaWxpdHkgdG8gaW1wb3J0IGEiLCBleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlLiIpCisgICAgICAgICAgICAgICAgYSA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMCkKKyAgICAgICAgICAgICAgICBiID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwKQorICAgICAgICAgICAgICAgIHByaW50ID4+IGYsICJhID0iLCBhCisgICAgICAgICAgICAgICAgcHJpbnQgPj4gZiwgImIgPSIsIGIKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18oVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJpbXBvcnQgZnJvbSAlcyBmYWlsZWQ6ICVzIiAlIChleHQsIGVycikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmEsIGEsCisgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgbG9hZGVkICglcykgYnV0IGNvbnRlbnRzIGludmFsaWQiICUgbW9kKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmIsIGIsCisgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgbG9hZGVkICglcykgYnV0IGNvbnRlbnRzIGludmFsaWQiICUgbW9kKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB1bmxpbmsoc291cmNlKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgbm90IHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgorICAgICAgICAgICAgICAgICAgICBpbXAucmVsb2FkKG1vZCkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiaW1wb3J0IGZyb20gLnB5Yy8ucHlvIGZhaWxlZDogJXMiICUgZXJyKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB1bmxpbmsocHljKQorICAgICAgICAgICAgICAgIHVubGluayhweW8pCisgICAgICAgICAgICAgICAgdW5sb2FkKFRFU1RGTikKKworICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0X3dpdGhfZXh0ZW5zaW9uKG9zLmV4dHNlcCArICJweSIpCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIik6CisgICAgICAgICAgICAgICAgZm9yIGV4dCBpbiBbIi5QWSIsICIuUHkiLCAiLnBZIiwgIi5weXciLCAiLlBZVyIsICIucFl3Il06CisgICAgICAgICAgICAgICAgICAgIHRlc3Rfd2l0aF9leHRlbnNpb24oZXh0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lID09ICdwb3NpeCcsCisgICAgICAgICJ0ZXN0IG1lYW5pbmdmdWwgb25seSBvbiBwb3NpeCBzeXN0ZW1zIikKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5kb250X3dyaXRlX2J5dGVjb2RlLAorICAgICAgICAidGVzdCBtZWFuaW5nZnVsIG9ubHkgd2hlbiB3cml0aW5nIGJ5dGVjb2RlIikKKyAgICBkZWYgdGVzdF9leGVjdXRlX2JpdF9ub3RfY29waWVkKHNlbGYpOgorICAgICAgICAjIElzc3VlIDYwNzA6IHVuZGVyIHBvc2l4IC5weWMgZmlsZXMgZ290IHRoZWlyIGV4ZWN1dGUgYml0IHNldCBpZgorICAgICAgICAjIHRoZSAucHkgZmlsZSBoYWQgdGhlIGV4ZWN1dGUgYml0IHNldCwgYnV0IHRoZXkgYXJlbid0IGV4ZWN1dGFibGUuCisgICAgICAgIG9sZG1hc2sgPSBvcy51bWFzaygwMjIpCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZuYW1lID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5IgorICAgICAgICAgICAgZiA9IG9wZW4oZm5hbWUsICd3JykuY2xvc2UoKQorICAgICAgICAgICAgb3MuY2htb2QoZm5hbWUsIChzdGF0LlNfSVJVU1IgfCBzdGF0LlNfSVJHUlAgfCBzdGF0LlNfSVJPVEggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0LlNfSVhVU1IgfCBzdGF0LlNfSVhHUlAgfCBzdGF0LlNfSVhPVEgpKQorICAgICAgICAgICAgX19pbXBvcnRfXyhURVNURk4pCisgICAgICAgICAgICBmbiA9IGZuYW1lICsgJ2MnCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZm4pOgorICAgICAgICAgICAgICAgIGZuID0gZm5hbWUgKyAnbycKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZm4pOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIl9faW1wb3J0X18gZGlkIG5vdCByZXN1bHQgaW4gY3JlYXRpb24gb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVpdGhlciBhIC5weWMgb3IgLnB5byBmaWxlIikKKyAgICAgICAgICAgIHMgPSBvcy5zdGF0KGZuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0LlNfSU1PREUocy5zdF9tb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdC5TX0lSVVNSIHwgc3RhdC5TX0lSR1JQIHwgc3RhdC5TX0lST1RIKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW1hc2sob2xkbWFzaykKKyAgICAgICAgICAgIHJlbW92ZV9maWxlcyhURVNURk4pCisgICAgICAgICAgICB1bmxvYWQoVEVTVEZOKQorICAgICAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5kb250X3dyaXRlX2J5dGVjb2RlLAorICAgICAgICAidGVzdCBtZWFuaW5nZnVsIG9ubHkgd2hlbiB3cml0aW5nIGJ5dGVjb2RlIikKKyAgICBkZWYgdGVzdF9yZXdyaXRlX3B5Y193aXRoX3JlYWRfb25seV9zb3VyY2Uoc2VsZik6CisgICAgICAgICMgSXNzdWUgNjA3NDogYSBsb25nIHRpbWUgYWdvIG9uIHBvc2l4LCBhbmQgbW9yZSByZWNlbnRseSBvbiBXaW5kb3dzLAorICAgICAgICAjIGEgcmVhZCBvbmx5IHNvdXJjZSBmaWxlIHJlc3VsdGVkIGluIGEgcmVhZCBvbmx5IHB5YyBmaWxlLCB3aGljaAorICAgICAgICAjIGxlZCB0byBwcm9ibGVtcyB3aXRoIHVwZGF0aW5nIGl0IGxhdGVyCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCisgICAgICAgIGZuYW1lID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5IgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFdyaXRlIGEgUHl0aG9uIGZpbGUsIG1ha2UgaXQgcmVhZC1vbmx5IGFuZCBpbXBvcnQgaXQKKyAgICAgICAgICAgIHdpdGggb3BlbihmbmFtZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoInggPSAnb3JpZ2luYWwnXG4iKQorICAgICAgICAgICAgIyBUd2VhayB0aGUgbXRpbWUgb2YgdGhlIHNvdXJjZSB0byBlbnN1cmUgcHljIGdldHMgdXBkYXRlZCBsYXRlcgorICAgICAgICAgICAgcyA9IG9zLnN0YXQoZm5hbWUpCisgICAgICAgICAgICBvcy51dGltZShmbmFtZSwgKHMuc3RfYXRpbWUsIHMuc3RfbXRpbWUtMTAwMDAwMDAwKSkKKyAgICAgICAgICAgIG9zLmNobW9kKGZuYW1lLCAwNDAwKQorICAgICAgICAgICAgbTEgPSBfX2ltcG9ydF9fKFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEueCwgJ29yaWdpbmFsJykKKyAgICAgICAgICAgICMgQ2hhbmdlIHRoZSBmaWxlIGFuZCB0aGVuIHJlaW1wb3J0IGl0CisgICAgICAgICAgICBvcy5jaG1vZChmbmFtZSwgMDYwMCkKKyAgICAgICAgICAgIHdpdGggb3BlbihmbmFtZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoInggPSAncmV3cml0dGVuJ1xuIikKKyAgICAgICAgICAgIHVubG9hZChURVNURk4pCisgICAgICAgICAgICBtMiA9IF9faW1wb3J0X18oVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMi54LCAncmV3cml0dGVuJykKKyAgICAgICAgICAgICMgTm93IGRlbGV0ZSB0aGUgc291cmNlIGZpbGUgYW5kIGNoZWNrIHRoZSBweWMgd2FzIHJld3JpdHRlbgorICAgICAgICAgICAgdW5saW5rKGZuYW1lKQorICAgICAgICAgICAgdW5sb2FkKFRFU1RGTikKKyAgICAgICAgICAgIG0zID0gX19pbXBvcnRfXyhURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0zLngsICdyZXdyaXR0ZW4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgY2htb2RfZmlsZXMoVEVTVEZOKQorICAgICAgICAgICAgcmVtb3ZlX2ZpbGVzKFRFU1RGTikKKyAgICAgICAgICAgIHVubG9hZChURVNURk4pCisgICAgICAgICAgICBkZWwgc3lzLnBhdGhbMF0KKworICAgIGRlZiB0ZXN0X2ltcF9tb2R1bGUoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIGltcCBtb2R1bGUgY2FuIGNvcnJlY3RseSBsb2FkIGFuZCBmaW5kIC5weSBmaWxlcworCisgICAgICAgICMgWFhYIChuY29naGxhbik6IEl0IHdvdWxkIGJlIG5pY2UgdG8gdXNlIHRlc3Rfc3VwcG9ydC5DbGVhbkltcG9ydAorICAgICAgICAjIGhlcmUsIGJ1dCB0aGF0IGJyZWFrcyBiZWNhdXNlIHRoZSBvcyBtb2R1bGUgcmVnaXN0ZXJzIHNvbWUKKyAgICAgICAgIyBoYW5kbGVycyBpbiBjb3B5X3JlZyBvbiBpbXBvcnQuIFNpbmNlIENsZWFuSW1wb3J0IGRvZXNuJ3QKKyAgICAgICAgIyByZXZlcnQgdGhhdCByZWdpc3RyYXRpb24sIHRoZSBtb2R1bGUgaXMgbGVmdCBpbiBhIGJyb2tlbgorICAgICAgICAjIHN0YXRlIGFmdGVyIHJldmVyc2lvbi4gUmVpbml0aWFsaXNpbmcgdGhlIG1vZHVsZSBjb250ZW50cworICAgICAgICAjIGFuZCBqdXN0IHJldmVydGluZyBvcy5lbnZpcm9uIHRvIGl0cyBwcmV2aW91cyBzdGF0ZSBpcyBhbiBPSworICAgICAgICAjIHdvcmthcm91bmQKKyAgICAgICAgb3JpZ19wYXRoID0gb3MucGF0aAorICAgICAgICBvcmlnX2dldGVudiA9IG9zLmdldGVudgorICAgICAgICB3aXRoIEVudmlyb25tZW50VmFyR3VhcmQoKToKKyAgICAgICAgICAgIHggPSBpbXAuZmluZF9tb2R1bGUoIm9zIikKKyAgICAgICAgICAgIG5ld19vcyA9IGltcC5sb2FkX21vZHVsZSgib3MiLCAqeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3MsIG5ld19vcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3JpZ19wYXRoLCBuZXdfb3MucGF0aCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3Qob3JpZ19nZXRlbnYsIG5ld19vcy5nZXRlbnYpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfd2l0aF9sYXJnZV9zdGFjayhzZWxmLCBtb2R1bGU9J2xvbmdsaXN0Jyk6CisgICAgICAgICMgUmVncmVzc2lvbiB0ZXN0IGZvciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNTYxODU4LgorICAgICAgICBmaWxlbmFtZSA9IG1vZHVsZSArIG9zLmV4dHNlcCArICdweScKKworICAgICAgICAjIENyZWF0ZSBhIGZpbGUgd2l0aCBhIGxpc3Qgb2YgNjUwMDAgZWxlbWVudHMuCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3crJykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoJ2QgPSBbXG4nKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNjUwMDApOgorICAgICAgICAgICAgICAgIGYud3JpdGUoJyIiLFxuJykKKyAgICAgICAgICAgIGYud3JpdGUoJ10nKQorCisgICAgICAgICMgQ29tcGlsZSAmIHJlbW92ZSAucHkgZmlsZSwgd2Ugb25seSBuZWVkIC5weWMgKG9yIC5weW8pLgorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyJykgYXMgZjoKKyAgICAgICAgICAgIHB5X2NvbXBpbGUuY29tcGlsZShmaWxlbmFtZSkKKyAgICAgICAgdW5saW5rKGZpbGVuYW1lKQorCisgICAgICAgICMgTmVlZCB0byBiZSBhYmxlIHRvIGxvYWQgZnJvbSBjdXJyZW50IGRpci4KKyAgICAgICAgc3lzLnBhdGguYXBwZW5kKCcnKQorCisgICAgICAgICMgVGhpcyB1c2VkIHRvIGNyYXNoLgorICAgICAgICBleGVjICdpbXBvcnQgJyArIG1vZHVsZQorCisgICAgICAgICMgQ2xlYW51cC4KKyAgICAgICAgZGVsIHN5cy5wYXRoWy0xXQorICAgICAgICB1bmxpbmsoZmlsZW5hbWUgKyAnYycpCisgICAgICAgIHVubGluayhmaWxlbmFtZSArICdvJykKKworICAgIGRlZiB0ZXN0X2ZhaWxpbmdfaW1wb3J0X3N0aWNrcyhzZWxmKToKKyAgICAgICAgc291cmNlID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5IgorICAgICAgICB3aXRoIG9wZW4oc291cmNlLCAidyIpIGFzIGY6CisgICAgICAgICAgICBwcmludCA+PiBmLCAiYSA9IDEgLy8gMCIKKworICAgICAgICAjIE5ldyBpbiAyLjQsIHdlIHNob3VsZG4ndCBiZSBhYmxlIHRvIGltcG9ydCB0aGF0IG5vIG1hdHRlciBob3cgb2Z0ZW4KKyAgICAgICAgIyB3ZSB0cnkuCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIFsxLCAyLCAzXToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgX19pbXBvcnRfXywgVEVTVEZOKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oVEVTVEZOLCBzeXMubW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYW1hZ2VkIG1vZHVsZSBpbiBzeXMubW9kdWxlcyBvbiAlaSB0cnkiICUgaSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlbCBzeXMucGF0aFswXQorICAgICAgICAgICAgcmVtb3ZlX2ZpbGVzKFRFU1RGTikKKworICAgIGRlZiB0ZXN0X2ZhaWxpbmdfcmVsb2FkKHNlbGYpOgorICAgICAgICAjIEEgZmFpbGluZyByZWxvYWQgc2hvdWxkIGxlYXZlIHRoZSBtb2R1bGUgb2JqZWN0IGluIHN5cy5tb2R1bGVzLgorICAgICAgICBzb3VyY2UgPSBURVNURk4gKyBvcy5leHRzZXAgKyAicHkiCisgICAgICAgIHdpdGggb3Blbihzb3VyY2UsICJ3IikgYXMgZjoKKyAgICAgICAgICAgIHByaW50ID4+IGYsICJhID0gMSIKKyAgICAgICAgICAgIHByaW50ID4+IGYsICJiID0gMiIKKworICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oVEVTVEZOLCBzeXMubW9kdWxlcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmEsIDEsICJtb2R1bGUgaGFzIHdyb25nIGF0dHJpYnV0ZSB2YWx1ZXMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuYiwgMiwgIm1vZHVsZSBoYXMgd3JvbmcgYXR0cmlidXRlIHZhbHVlcyIpCisKKyAgICAgICAgICAgICMgT24gV2luWFAsIGp1c3QgcmVwbGFjaW5nIHRoZSAucHkgZmlsZSB3YXNuJ3QgZW5vdWdoIHRvCisgICAgICAgICAgICAjIGNvbnZpbmNlIHJlbG9hZCgpIHRvIHJlcGFyc2UgaXQuICBNYXliZSB0aGUgdGltZXN0YW1wIGRpZG4ndAorICAgICAgICAgICAgIyBtb3ZlIGVub3VnaC4gIFdlIGZvcmNlIGl0IHRvIGdldCByZXBhcnNlZCBieSByZW1vdmluZyB0aGUKKyAgICAgICAgICAgICMgY29tcGlsZWQgZmlsZSB0b28uCisgICAgICAgICAgICByZW1vdmVfZmlsZXMoVEVTVEZOKQorCisgICAgICAgICAgICAjIE5vdyBkYW1hZ2UgdGhlIG1vZHVsZS4KKyAgICAgICAgICAgIHdpdGggb3Blbihzb3VyY2UsICJ3IikgYXMgZjoKKyAgICAgICAgICAgICAgICBwcmludCA+PiBmLCAiYSA9IDEwIgorICAgICAgICAgICAgICAgIHByaW50ID4+IGYsICJiID0gMjAvLzAiCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBpbXAucmVsb2FkLCBtb2QpCisKKyAgICAgICAgICAgICMgQnV0IHdlIHN0aWxsIGV4cGVjdCB0aGUgbW9kdWxlIHRvIGJlIGluIHN5cy5tb2R1bGVzLgorICAgICAgICAgICAgbW9kID0gc3lzLm1vZHVsZXMuZ2V0KFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QobW9kLCBOb25lLCAiZXhwZWN0ZWQgbW9kdWxlIHRvIGJlIGluIHN5cy5tb2R1bGVzIikKKworICAgICAgICAgICAgIyBXZSBzaG91bGQgaGF2ZSByZXBsYWNlZCBhIHcvIDEwLCBidXQgdGhlIG9sZCBiIHZhbHVlIHNob3VsZAorICAgICAgICAgICAgIyBzdGljay4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmEsIDEwLCAibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmIsIDIsICJtb2R1bGUgaGFzIHdyb25nIGF0dHJpYnV0ZSB2YWx1ZXMiKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWwgc3lzLnBhdGhbMF0KKyAgICAgICAgICAgIHJlbW92ZV9maWxlcyhURVNURk4pCisgICAgICAgICAgICB1bmxvYWQoVEVTVEZOKQorCisgICAgZGVmIHRlc3RfaW5maW5pdGVfcmVsb2FkKHNlbGYpOgorICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU3NDIzNDIgcmVwb3J0cyB0aGF0IFB5dGhvbiBzZWdmYXVsdHMKKyAgICAgICAgIyAoaW5maW5pdGUgcmVjdXJzaW9uIGluIEMpIHdoZW4gZmFjZWQgd2l0aCBzZWxmLXJlY3Vyc2l2ZSByZWxvYWQoKWluZy4KKworICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGluZmluaXRlX3JlbG9hZAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfbmFtZV9iaW5kaW5nKHNlbGYpOgorICAgICAgICAjIGltcG9ydCB4LnkueiBiaW5kcyB4IGluIHRoZSBjdXJyZW50IG5hbWVzcGFjZS4KKyAgICAgICAgaW1wb3J0IHRlc3QgYXMgeAorICAgICAgICBpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4LCB0ZXN0LCB4Ll9fbmFtZV9fKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cih0ZXN0LnRlc3Rfc3VwcG9ydCwgIl9fZmlsZV9fIikpCisKKyAgICAgICAgIyBpbXBvcnQgeC55LnogYXMgdyBiaW5kcyB6IGFzIHcuCisgICAgICAgIGltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydCBhcyB5CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeSwgdGVzdC50ZXN0X3N1cHBvcnQsIHkuX19uYW1lX18pCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfaW5pdGxlc3NfZGlyZWN0b3J5X3dhcm5pbmcoc2VsZik6CisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCcnLCBJbXBvcnRXYXJuaW5nKSk6CisgICAgICAgICAgICAjIEp1c3QgYSByYW5kb20gbm9uLXBhY2thZ2UgZGlyZWN0b3J5IHdlIGFsd2F5cyBleHBlY3QgdG8gYmUKKyAgICAgICAgICAgICMgc29tZXdoZXJlIGluIHN5cy5wYXRoLi4uCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvciwgX19pbXBvcnRfXywgInNpdGUtcGFja2FnZXMiKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2J5X2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBwYXRoID0gb3MucGF0aC5hYnNwYXRoKFRFU1RGTikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvcikgYXMgYzoKKyAgICAgICAgICAgIF9faW1wb3J0X18ocGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiSW1wb3J0IGJ5IGZpbGVuYW1lIGlzIG5vdCBzdXBwb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjLmV4Y2VwdGlvbi5hcmdzWzBdKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2luX2RlbF9kb2VzX25vdF9jcmFzaChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA0MjM2CisgICAgICAgIHRlc3RmbiA9IHNjcmlwdF9oZWxwZXIubWFrZV9zY3JpcHQoJycsIFRFU1RGTiwgdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgICAgIHN5cy5hcmd2Lmluc2VydCgwLCBDKCkpCisgICAgICAgICAgICAiIiIpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fb2sodGVzdGZuKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdW5saW5rKHRlc3RmbikKKworICAgIGRlZiB0ZXN0X2J1Zzc3MzIoc2VsZik6CisgICAgICAgIHNvdXJjZSA9IFRFU1RGTiArICcucHknCisgICAgICAgIG9zLm1rZGlyKHNvdXJjZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKEltcG9ydEVycm9yLCBJT0Vycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcC5maW5kX21vZHVsZSwgVEVTVEZOLCBbIi4iXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJtZGlyKHNvdXJjZSkKKworICAgIGRlZiB0ZXN0X3RpbWVzdGFtcF9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgIyBBIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgbGFyZ2VyIHRoYW4gMioqMzIgc2hvdWxkIG5vdCBiZSBhIHByb2JsZW0KKyAgICAgICAgIyB3aGVuIGltcG9ydGluZyBhIG1vZHVsZSAoaXNzdWUgIzExMjM1KS4KKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc291cmNlID0gVEVTVEZOICsgIi5weSIKKyAgICAgICAgICAgIGNvbXBpbGVkID0gc291cmNlICsgKCdjJyBpZiBfX2RlYnVnX18gZWxzZSAnbycpCisgICAgICAgICAgICB3aXRoIG9wZW4oc291cmNlLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnV0aW1lKHNvdXJjZSwgKDIgKiogMzMgLSA1LCAyICoqIDMzIC0gNSkpCisgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJjYW5ub3Qgc2V0IG1vZGlmaWNhdGlvbiB0aW1lIHRvIGxhcmdlIGludGVnZXIiKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGdldGF0dHIoZXJybm8sICdFT1ZFUkZMT1cnLCBOb25lKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJjYW5ub3Qgc2V0IG1vZGlmaWNhdGlvbiB0aW1lIHRvIGxhcmdlIGludGVnZXIgKHt9KSIuZm9ybWF0KGUpKQorICAgICAgICAgICAgX19pbXBvcnRfXyhURVNURk4pCisgICAgICAgICAgICAjIFRoZSBweWMgZmlsZSB3YXMgY3JlYXRlZC4KKyAgICAgICAgICAgIG9zLnN0YXQoY29tcGlsZWQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWwgc3lzLnBhdGhbMF0KKyAgICAgICAgICAgIHJlbW92ZV9maWxlcyhURVNURk4pCisKKyAgICBkZWYgdGVzdF9weWNfbXRpbWUoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgaXNzdWUgIzEzODYzOiAucHljIHRpbWVzdGFtcCBzb21ldGltZXMgaW5jb3JyZWN0IG9uIFdpbmRvd3MuCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgSmFuIDEsIDIwMTI7IEp1bCAxLCAyMDEyLgorICAgICAgICAgICAgbXRpbWVzID0gMTMyNTM3NjAwMCwgMTM0MTEwMDgwMAorCisgICAgICAgICAgICAjIERpZmZlcmVudCBuYW1lcyB0byBhdm9pZCBydW5uaW5nIGludG8gaW1wb3J0IGNhY2hpbmcuCisgICAgICAgICAgICB0YWlscyA9ICJzcGFtIiwgImVnZ3MiCisgICAgICAgICAgICBmb3IgbXRpbWUsIHRhaWwgaW4gemlwKG10aW1lcywgdGFpbHMpOgorICAgICAgICAgICAgICAgIG1vZHVsZSA9IFRFU1RGTiArIHRhaWwKKyAgICAgICAgICAgICAgICBzb3VyY2UgPSBtb2R1bGUgKyAiLnB5IgorICAgICAgICAgICAgICAgIGNvbXBpbGVkID0gc291cmNlICsgKCdjJyBpZiBfX2RlYnVnX18gZWxzZSAnbycpCisKKyAgICAgICAgICAgICAgICAjIENyZWF0ZSBhIG5ldyBQeXRob24gZmlsZSB3aXRoIHRoZSBnaXZlbiBtdGltZS4KKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oc291cmNlLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIiMgSnVzdCB0ZXN0aW5nXG54PTEsIDIsIDNcbiIpCisgICAgICAgICAgICAgICAgb3MudXRpbWUoc291cmNlLCAobXRpbWUsIG10aW1lKSkKKworICAgICAgICAgICAgICAgICMgR2VuZXJhdGUgdGhlIC5weWMvbyBmaWxlOyBpZiBpdCBjb3VsZG4ndCBiZSBjcmVhdGVkCisgICAgICAgICAgICAgICAgIyBmb3Igc29tZSByZWFzb24sIHNraXAgdGhlIHRlc3QuCisgICAgICAgICAgICAgICAgbSA9IF9faW1wb3J0X18obW9kdWxlKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhjb21waWxlZCk6CisgICAgICAgICAgICAgICAgICAgIHVubGluayhzb3VyY2UpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIkNvdWxkbid0IGNyZWF0ZSAucHljLy5weW8gZmlsZS4iKQorCisgICAgICAgICAgICAgICAgIyBBY3R1YWwgbW9kaWZpY2F0aW9uIHRpbWUgb2YgLnB5IGZpbGUuCisgICAgICAgICAgICAgICAgbXRpbWUxID0gaW50KG9zLnN0YXQoc291cmNlKS5zdF9tdGltZSkgJiAweGZmZmZmZmZmCisKKyAgICAgICAgICAgICAgICAjIG10aW1lIHRoYXQgd2FzIGVuY29kZWQgaW4gdGhlIC5weWMgZmlsZS4KKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oY29tcGlsZWQsICdyYicpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIG10aW1lMiA9IHN0cnVjdC51bnBhY2soJzxMJywgZi5yZWFkKDgpWzQ6XSlbMF0KKworICAgICAgICAgICAgICAgIHVubGluayhjb21waWxlZCkKKyAgICAgICAgICAgICAgICB1bmxpbmsoc291cmNlKQorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtdGltZTEsIG10aW1lMikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5wYXRoLnBvcCgwKQorCisKK2NsYXNzIFB5Y1Jld3JpdGluZ1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRlc3QgdGhhdCB0aGUgYGNvX2ZpbGVuYW1lYCBhdHRyaWJ1dGUgb24gY29kZSBvYmplY3RzIGFsd2F5cyBwb2ludHMKKyAgICAjIHRvIHRoZSByaWdodCBmaWxlLCBldmVuIHdoZW4gdmFyaW91cyB0aGluZ3MgaGFwcGVuIChlLmcuIGJvdGggdGhlIC5weQorICAgICMgYW5kIHRoZSAucHljIGZpbGUgYXJlIHJlbmFtZWQpLgorCisgICAgbW9kdWxlX25hbWUgPSAidW5saWtlbHlfbW9kdWxlX25hbWUiCisgICAgbW9kdWxlX3NvdXJjZSA9ICIiIgoraW1wb3J0IHN5cworY29kZV9maWxlbmFtZSA9IHN5cy5fZ2V0ZnJhbWUoKS5mX2NvZGUuY29fZmlsZW5hbWUKK21vZHVsZV9maWxlbmFtZSA9IF9fZmlsZV9fCitjb25zdGFudCA9IDEKK2RlZiBmdW5jKCk6CisgICAgcGFzcworZnVuY19maWxlbmFtZSA9IGZ1bmMuZnVuY19jb2RlLmNvX2ZpbGVuYW1lCisiIiIKKyAgICBkaXJfbmFtZSA9IG9zLnBhdGguYWJzcGF0aChURVNURk4pCisgICAgZmlsZV9uYW1lID0gb3MucGF0aC5qb2luKGRpcl9uYW1lLCBtb2R1bGVfbmFtZSkgKyBvcy5leHRzZXAgKyAicHkiCisgICAgY29tcGlsZWRfbmFtZSA9IGZpbGVfbmFtZSArICgiYyIgaWYgX19kZWJ1Z19fIGVsc2UgIm8iKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnN5c19wYXRoID0gc3lzLnBhdGhbOl0KKyAgICAgICAgc2VsZi5vcmlnX21vZHVsZSA9IHN5cy5tb2R1bGVzLnBvcChzZWxmLm1vZHVsZV9uYW1lLCBOb25lKQorICAgICAgICBvcy5ta2RpcihzZWxmLmRpcl9uYW1lKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlX25hbWUsICJ3IikgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoc2VsZi5tb2R1bGVfc291cmNlKQorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgc2VsZi5kaXJfbmFtZSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3lzLnBhdGhbOl0gPSBzZWxmLnN5c19wYXRoCisgICAgICAgIGlmIHNlbGYub3JpZ19tb2R1bGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzeXMubW9kdWxlc1tzZWxmLm1vZHVsZV9uYW1lXSA9IHNlbGYub3JpZ19tb2R1bGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHVubG9hZChzZWxmLm1vZHVsZV9uYW1lKQorICAgICAgICB1bmxpbmsoc2VsZi5maWxlX25hbWUpCisgICAgICAgIHVubGluayhzZWxmLmNvbXBpbGVkX25hbWUpCisgICAgICAgIHJtdHJlZShzZWxmLmRpcl9uYW1lKQorCisgICAgZGVmIGltcG9ydF9tb2R1bGUoc2VsZik6CisgICAgICAgIG5zID0gZ2xvYmFscygpCisgICAgICAgIF9faW1wb3J0X18oc2VsZi5tb2R1bGVfbmFtZSwgbnMsIG5zKQorICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbc2VsZi5tb2R1bGVfbmFtZV0KKworICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgbW9kID0gc2VsZi5pbXBvcnRfbW9kdWxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QubW9kdWxlX2ZpbGVuYW1lLCBzZWxmLmZpbGVfbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuY29kZV9maWxlbmFtZSwgc2VsZi5maWxlX25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmZ1bmNfZmlsZW5hbWUsIHNlbGYuZmlsZV9uYW1lKQorICAgICAgICBkZWwgc3lzLm1vZHVsZXNbc2VsZi5tb2R1bGVfbmFtZV0KKyAgICAgICAgbW9kID0gc2VsZi5pbXBvcnRfbW9kdWxlKCkKKyAgICAgICAgaWYgbm90IHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QubW9kdWxlX2ZpbGVuYW1lLCBzZWxmLmNvbXBpbGVkX25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmNvZGVfZmlsZW5hbWUsIHNlbGYuZmlsZV9uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5mdW5jX2ZpbGVuYW1lLCBzZWxmLmZpbGVfbmFtZSkKKworICAgIGRlZiB0ZXN0X2luY29ycmVjdF9jb2RlX25hbWUoc2VsZik6CisgICAgICAgIHB5X2NvbXBpbGUuY29tcGlsZShzZWxmLmZpbGVfbmFtZSwgZGZpbGU9ImFub3RoZXJfbW9kdWxlLnB5IikKKyAgICAgICAgbW9kID0gc2VsZi5pbXBvcnRfbW9kdWxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QubW9kdWxlX2ZpbGVuYW1lLCBzZWxmLmNvbXBpbGVkX25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmNvZGVfZmlsZW5hbWUsIHNlbGYuZmlsZV9uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5mdW5jX2ZpbGVuYW1lLCBzZWxmLmZpbGVfbmFtZSkKKworICAgIGRlZiB0ZXN0X21vZHVsZV93aXRob3V0X3NvdXJjZShzZWxmKToKKyAgICAgICAgdGFyZ2V0ID0gImFub3RoZXJfbW9kdWxlLnB5IgorICAgICAgICBweV9jb21waWxlLmNvbXBpbGUoc2VsZi5maWxlX25hbWUsIGRmaWxlPXRhcmdldCkKKyAgICAgICAgb3MucmVtb3ZlKHNlbGYuZmlsZV9uYW1lKQorICAgICAgICBtb2QgPSBzZWxmLmltcG9ydF9tb2R1bGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5tb2R1bGVfZmlsZW5hbWUsIHNlbGYuY29tcGlsZWRfbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuY29kZV9maWxlbmFtZSwgdGFyZ2V0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5mdW5jX2ZpbGVuYW1lLCB0YXJnZXQpCisKKyAgICBkZWYgdGVzdF9mb3JlaWduX2NvZGUoc2VsZik6CisgICAgICAgIHB5X2NvbXBpbGUuY29tcGlsZShzZWxmLmZpbGVfbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuY29tcGlsZWRfbmFtZSwgInJiIikgYXMgZjoKKyAgICAgICAgICAgIGhlYWRlciA9IGYucmVhZCg4KQorICAgICAgICAgICAgY29kZSA9IG1hcnNoYWwubG9hZChmKQorICAgICAgICBjb25zdGFudHMgPSBsaXN0KGNvZGUuY29fY29uc3RzKQorICAgICAgICBmb3JlaWduX2NvZGUgPSB0ZXN0X21haW4uZnVuY19jb2RlCisgICAgICAgIHBvcyA9IGNvbnN0YW50cy5pbmRleCgxKQorICAgICAgICBjb25zdGFudHNbcG9zXSA9IGZvcmVpZ25fY29kZQorICAgICAgICBjb2RlID0gdHlwZShjb2RlKShjb2RlLmNvX2FyZ2NvdW50LCBjb2RlLmNvX25sb2NhbHMsIGNvZGUuY29fc3RhY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLmNvX2ZsYWdzLCBjb2RlLmNvX2NvZGUsIHR1cGxlKGNvbnN0YW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuY29fbmFtZXMsIGNvZGUuY29fdmFybmFtZXMsIGNvZGUuY29fZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuY29fbmFtZSwgY29kZS5jb19maXJzdGxpbmVubywgY29kZS5jb19sbm90YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuY29fZnJlZXZhcnMsIGNvZGUuY29fY2VsbHZhcnMpCisgICAgICAgIHdpdGggb3BlbihzZWxmLmNvbXBpbGVkX25hbWUsICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGhlYWRlcikKKyAgICAgICAgICAgIG1hcnNoYWwuZHVtcChjb2RlLCBmKQorICAgICAgICBtb2QgPSBzZWxmLmltcG9ydF9tb2R1bGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5jb25zdGFudC5jb19maWxlbmFtZSwgZm9yZWlnbl9jb2RlLmNvX2ZpbGVuYW1lKQorCisKK2NsYXNzIFBhdGhzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHBhdGggPSBURVNURk4KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgb3MubWtkaXIoc2VsZi5wYXRoKQorICAgICAgICBzZWxmLnN5c3BhdGggPSBzeXMucGF0aFs6XQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBybXRyZWUoc2VsZi5wYXRoKQorICAgICAgICBzeXMucGF0aFs6XSA9IHNlbGYuc3lzcGF0aAorCisgICAgIyBSZWdyZXNzaW9uIHRlc3QgZm9yIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMjkzLgorICAgIGRlZiB0ZXN0X3RyYWlsaW5nX3NsYXNoKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHNlbGYucGF0aCwgJ3Rlc3RfdHJhaWxpbmdfc2xhc2gucHknKSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgidGVzdGRhdGEgPSAndGVzdF90cmFpbGluZ19zbGFzaCciKQorICAgICAgICBzeXMucGF0aC5hcHBlbmQoc2VsZi5wYXRoKycvJykKKyAgICAgICAgbW9kID0gX19pbXBvcnRfXygidGVzdF90cmFpbGluZ19zbGFzaCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLnRlc3RkYXRhLCAndGVzdF90cmFpbGluZ19zbGFzaCcpCisgICAgICAgIHVubG9hZCgidGVzdF90cmFpbGluZ19zbGFzaCIpCisKKyAgICAjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTM2NzcuCisgICAgZGVmIF90ZXN0X1VOQ19wYXRoKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHNlbGYucGF0aCwgJ3Rlc3RfdHJhaWxpbmdfc2xhc2gucHknKSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgidGVzdGRhdGEgPSAndGVzdF90cmFpbGluZ19zbGFzaCciKQorICAgICAgICAjIENyZWF0ZSB0aGUgVU5DIHBhdGgsIGxpa2UgXFxteWhvc3RcYyRcZm9vXGJhci4KKyAgICAgICAgcGF0aCA9IG9zLnBhdGguYWJzcGF0aChzZWxmLnBhdGgpCisgICAgICAgIGltcG9ydCBzb2NrZXQKKyAgICAgICAgaG4gPSBzb2NrZXQuZ2V0aG9zdG5hbWUoKQorICAgICAgICBkcml2ZSA9IHBhdGhbMF0KKyAgICAgICAgdW5jID0gIlxcXFwlc1xcJXMkIiUoaG4sIGRyaXZlKQorICAgICAgICB1bmMgKz0gcGF0aFsyOl0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MubGlzdGRpcih1bmMpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vIGluIChlcnJuby5FUEVSTSwgZXJybm8uRUFDQ0VTKToKKyAgICAgICAgICAgICAgICAjIFNlZSBpc3N1ZSAjMTUzMzgKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJjYW5ub3QgYWNjZXNzIGFkbWluaXN0cmF0aXZlIHNoYXJlICVyIiAlICh1bmMsKSkKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHN5cy5wYXRoLmFwcGVuZChwYXRoKQorICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKCJ0ZXN0X3RyYWlsaW5nX3NsYXNoIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QudGVzdGRhdGEsICd0ZXN0X3RyYWlsaW5nX3NsYXNoJykKKyAgICAgICAgdW5sb2FkKCJ0ZXN0X3RyYWlsaW5nX3NsYXNoIikKKworICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorICAgICAgICB0ZXN0X1VOQ19wYXRoID0gX3Rlc3RfVU5DX3BhdGgKKworCitjbGFzcyBSZWxhdGl2ZUltcG9ydFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdW5sb2FkKCJ0ZXN0LnJlbGltcG9ydCIpCisgICAgc2V0VXAgPSB0ZWFyRG93bgorCisgICAgZGVmIHRlc3RfcmVsaW1wb3J0X3N0YXIoc2VsZik6CisgICAgICAgICMgVGhpcyB3aWxsIGltcG9ydCAqIGZyb20gLnRlc3RfaW1wb3J0LgorICAgICAgICBmcm9tIC4gaW1wb3J0IHJlbGltcG9ydAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihyZWxpbXBvcnQsICJSZWxhdGl2ZUltcG9ydFRlc3RzIikpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTMyMjEoc2VsZik6CisgICAgICAgICMgUmVncmVzc2lvbiB0ZXN0IGZvciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMzIyMS4KKyAgICAgICAgZGVmIGNoZWNrX2Fic29sdXRlKCk6CisgICAgICAgICAgICBleGVjICJmcm9tIG9zIGltcG9ydCBwYXRoIiBpbiBucworICAgICAgICBkZWYgY2hlY2tfcmVsYXRpdmUoKToKKyAgICAgICAgICAgIGV4ZWMgImZyb20gLiBpbXBvcnQgcmVsaW1wb3J0IiBpbiBucworCisgICAgICAgICMgQ2hlY2sgYm90aCBPSyB3aXRoIF9fcGFja2FnZV9fIGFuZCBfX25hbWVfXyBjb3JyZWN0CisgICAgICAgIG5zID0gZGljdChfX3BhY2thZ2VfXz0ndGVzdCcsIF9fbmFtZV9fPSd0ZXN0Lm5vdGFyZWFsbW9kdWxlJykKKyAgICAgICAgY2hlY2tfYWJzb2x1dGUoKQorICAgICAgICBjaGVja19yZWxhdGl2ZSgpCisKKyAgICAgICAgIyBDaGVjayBib3RoIE9LIHdpdGggb25seSBfX25hbWVfXyB3cm9uZworICAgICAgICBucyA9IGRpY3QoX19wYWNrYWdlX189J3Rlc3QnLCBfX25hbWVfXz0nbm90YXJlYWxwa2cubm90YXJlYWxtb2R1bGUnKQorICAgICAgICBjaGVja19hYnNvbHV0ZSgpCisgICAgICAgIGNoZWNrX3JlbGF0aXZlKCkKKworICAgICAgICAjIENoZWNrIHJlbGF0aXZlIGZhaWxzIHdpdGggb25seSBfX3BhY2thZ2VfXyB3cm9uZworICAgICAgICBucyA9IGRpY3QoX19wYWNrYWdlX189J2ZvbycsIF9fbmFtZV9fPSd0ZXN0Lm5vdGFyZWFsbW9kdWxlJykKKyAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygoJy4rZm9vJywgUnVudGltZVdhcm5pbmcpKToKKyAgICAgICAgICAgIGNoZWNrX2Fic29sdXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXJyb3IsIGNoZWNrX3JlbGF0aXZlKQorCisgICAgICAgICMgQ2hlY2sgcmVsYXRpdmUgZmFpbHMgd2l0aCBfX3BhY2thZ2VfXyBhbmQgX19uYW1lX18gd3JvbmcKKyAgICAgICAgbnMgPSBkaWN0KF9fcGFja2FnZV9fPSdmb28nLCBfX25hbWVfXz0nbm90YXJlYWxwa2cubm90YXJlYWxtb2R1bGUnKQorICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgnLitmb28nLCBSdW50aW1lV2FybmluZykpOgorICAgICAgICAgICAgY2hlY2tfYWJzb2x1dGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FcnJvciwgY2hlY2tfcmVsYXRpdmUpCisKKyAgICAgICAgIyBDaGVjayBib3RoIGZhaWwgd2l0aCBwYWNrYWdlIHNldCB0byBhIG5vbi1zdHJpbmcKKyAgICAgICAgbnMgPSBkaWN0KF9fcGFja2FnZV9fPW9iamVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjaGVja19hYnNvbHV0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2hlY2tfcmVsYXRpdmUpCisKKyAgICBkZWYgdGVzdF9hYnNvbHV0ZV9pbXBvcnRfd2l0aG91dF9mdXR1cmUoc2VsZik6CisgICAgICAgICMgSWYgZXhwbGljaXQgcmVsYXRpdmUgaW1wb3J0IHN5bnRheCBpcyB1c2VkLCB0aGVuIGRvIG5vdCB0cnkKKyAgICAgICAgIyB0byBwZXJmb3JtIGFuIGFic29sdXRlIGltcG9ydCBpbiB0aGUgZmFjZSBvZiBmYWlsdXJlLgorICAgICAgICAjIElzc3VlICM3OTAyLgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKKyAgICAgICAgICAgIGZyb20gLm9zIGltcG9ydCBzZXAKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwbGljaXQgcmVsYXRpdmUgaW1wb3J0IHRyaWdnZXJlZCBhbiAiCisgICAgICAgICAgICAgICAgICAgICAgImltcGxpY2l0IGFic29sdXRlIGltcG9ydCIpCisKKworY2xhc3MgVGVzdFN5bWJvbGljYWxseUxpbmtlZFBhY2thZ2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHBhY2thZ2VfbmFtZSA9ICdzYW1wbGUnCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGFnZ2VkKToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi50YWdnZWQpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYucGFja2FnZV9uYW1lKToKKyAgICAgICAgICAgIHN5bWxpbmtfc3VwcG9ydC5yZW1vdmVfc3ltbGluayhzZWxmLnBhY2thZ2VfbmFtZSkKKyAgICAgICAgc2VsZi5vcmlnX3N5c19wYXRoID0gc3lzLnBhdGhbOl0KKworICAgICAgICAjIGNyZWF0ZSBhIHNhbXBsZSBwYWNrYWdlOyBpbWFnaW5lIHlvdSBoYXZlIGEgcGFja2FnZSB3aXRoIGEgdGFnIGFuZAorICAgICAgICAjICB5b3Ugd2FudCB0byBzeW1ib2xpY2FsbHkgbGluayBpdCBmcm9tIGl0cyB1bnRhZ2dlZCBuYW1lLgorICAgICAgICBvcy5ta2RpcihzZWxmLnRhZ2dlZCkKKyAgICAgICAgaW5pdF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYudGFnZ2VkLCAnX19pbml0X18ucHknKQorICAgICAgICBvcGVuKGluaXRfZmlsZSwgJ3cnKS5jbG9zZSgpCisgICAgICAgIGFzc2VydCBvcy5wYXRoLmV4aXN0cyhpbml0X2ZpbGUpCisKKyAgICAgICAgIyBub3cgY3JlYXRlIGEgc3ltbGluayB0byB0aGUgdGFnZ2VkIHBhY2thZ2UKKyAgICAgICAgIyBzYW1wbGUgLT4gc2FtcGxlLXRhZ2dlZAorICAgICAgICBzeW1saW5rX3N1cHBvcnQuc3ltbGluayhzZWxmLnRhZ2dlZCwgc2VsZi5wYWNrYWdlX25hbWUpCisKKyAgICAgICAgYXNzZXJ0IG9zLnBhdGguaXNkaXIoc2VsZi5wYWNrYWdlX25hbWUpCisgICAgICAgIGFzc2VydCBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oc2VsZi5wYWNrYWdlX25hbWUsICdfX2luaXRfXy5weScpKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHRhZ2dlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucGFja2FnZV9uYW1lICsgJy10YWdnZWQnCisKKyAgICAjIHJlZ3Jlc3Npb24gdGVzdCBmb3IgaXNzdWU2NzI3CisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoCisgICAgICAgIG5vdCBoYXNhdHRyKHN5cywgJ2dldHdpbmRvd3N2ZXJzaW9uJykKKyAgICAgICAgb3Igc3lzLmdldHdpbmRvd3N2ZXJzaW9uKCkgPj0gKDYsIDApLAorICAgICAgICAiV2luZG93cyBWaXN0YSBvciBsYXRlciByZXF1aXJlZCIpCisgICAgQHN5bWxpbmtfc3VwcG9ydC5za2lwX3VubGVzc19zeW1saW5rCisgICAgZGVmIHRlc3Rfc3ltbGlua2VkX2Rpcl9pbXBvcnRhYmxlKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSBzYW1wbGUgY2FuIG9ubHkgYmUgaW1wb3J0ZWQgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgICAgICAgIHN5cy5wYXRoWzpdID0gWycuJ10KKworICAgICAgICAjIGFuZCB0cnkgdG8gaW1wb3J0IHRoZSBwYWNrYWdlCisgICAgICAgIF9faW1wb3J0X18oc2VsZi5wYWNrYWdlX25hbWUpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICMgbm93IGNsZWFudXAKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5wYWNrYWdlX25hbWUpOgorICAgICAgICAgICAgc3ltbGlua19zdXBwb3J0LnJlbW92ZV9zeW1saW5rKHNlbGYucGFja2FnZV9uYW1lKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRhZ2dlZCk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYudGFnZ2VkKQorICAgICAgICBzeXMucGF0aFs6XSA9IHNlbGYub3JpZ19zeXNfcGF0aAorCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgcnVuX3VuaXR0ZXN0KEltcG9ydFRlc3RzLCBQeWNSZXdyaXRpbmdUZXN0cywgUGF0aHNUZXN0cywKKyAgICAgICAgUmVsYXRpdmVJbXBvcnRUZXN0cywgVGVzdFN5bWJvbGljYWxseUxpbmtlZFBhY2thZ2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgIyBUZXN0IG5lZWRzIHRvIGJlIGEgcGFja2FnZSwgc28gd2UgY2FuIGRvIHJlbGF0aXZlIGltcG9ydHMuCisgICAgZnJvbSB0ZXN0LnRlc3RfaW1wb3J0IGltcG9ydCB0ZXN0X21haW4KKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwNDMwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFlMjIwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0aG9va3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRob29rcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmFiMWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0aG9va3MucHkKQEAgLTAsMCArMSwyNTUgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCBpbXAKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK3Rlc3Rfc3JjID0gIiIiXAorZGVmIGdldF9uYW1lKCk6CisgICAgcmV0dXJuIF9fbmFtZV9fCitkZWYgZ2V0X2ZpbGUoKToKKyAgICByZXR1cm4gX19maWxlX18KKyIiIgorCithYnNpbXAgPSAiaW1wb3J0IHN1YlxuIgorcmVsaW1wID0gImZyb20gLiBpbXBvcnQgc3ViXG4iCitkZWVwcmVsaW1wID0gImZyb20gLi4uLiBpbXBvcnQgc3ViXG4iCitmdXRpbXAgPSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnRcbiIKKworcmVsb2FkX3NyYyA9IHRlc3Rfc3JjKyIiIlwKK3JlbG9hZGVkID0gVHJ1ZQorIiIiCisKK3Rlc3RfY28gPSBjb21waWxlKHRlc3Rfc3JjLCAiPD8/Pz4iLCAiZXhlYyIpCityZWxvYWRfY28gPSBjb21waWxlKHJlbG9hZF9zcmMsICI8Pz8/PiIsICJleGVjIikKKwordGVzdDJfb2xkYWJzX2NvID0gY29tcGlsZShhYnNpbXAgKyB0ZXN0X3NyYywgIjw/Pz8+IiwgImV4ZWMiKQordGVzdDJfbmV3YWJzX2NvID0gY29tcGlsZShmdXRpbXAgKyBhYnNpbXAgKyB0ZXN0X3NyYywgIjw/Pz8+IiwgImV4ZWMiKQordGVzdDJfbmV3cmVsX2NvID0gY29tcGlsZShyZWxpbXAgKyB0ZXN0X3NyYywgIjw/Pz8+IiwgImV4ZWMiKQordGVzdDJfZGVlcHJlbF9jbyA9IGNvbXBpbGUoZGVlcHJlbGltcCArIHRlc3Rfc3JjLCAiPD8/Pz4iLCAiZXhlYyIpCit0ZXN0Ml9mdXRyZWxfY28gPSBjb21waWxlKGZ1dGltcCArIHJlbGltcCArIHRlc3Rfc3JjLCAiPD8/Pz4iLCAiZXhlYyIpCisKK3Rlc3RfcGF0aCA9ICIhISFfdGVzdF8hISEiCisKKworY2xhc3MgVGVzdEltcG9ydGVyOgorCisgICAgbW9kdWxlcyA9IHsKKyAgICAgICAgImhvb2t0ZXN0bW9kdWxlIjogKEZhbHNlLCB0ZXN0X2NvKSwKKyAgICAgICAgImhvb2t0ZXN0cGFja2FnZSI6IChUcnVlLCB0ZXN0X2NvKSwKKyAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5zdWIiOiAoVHJ1ZSwgdGVzdF9jbyksCisgICAgICAgICJob29rdGVzdHBhY2thZ2Uuc3ViLnN1YmJlciI6IChUcnVlLCB0ZXN0X2NvKSwKKyAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5vbGRhYnMiOiAoRmFsc2UsIHRlc3QyX29sZGFic19jbyksCisgICAgICAgICJob29rdGVzdHBhY2thZ2UubmV3YWJzIjogKEZhbHNlLCB0ZXN0Ml9uZXdhYnNfY28pLAorICAgICAgICAiaG9va3Rlc3RwYWNrYWdlLm5ld3JlbCI6IChGYWxzZSwgdGVzdDJfbmV3cmVsX2NvKSwKKyAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5zdWIuc3ViYmVyLnN1YmVzdCI6IChUcnVlLCB0ZXN0Ml9kZWVwcmVsX2NvKSwKKyAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5mdXRyZWwiOiAoRmFsc2UsIHRlc3QyX2Z1dHJlbF9jbyksCisgICAgICAgICJzdWIiOiAoRmFsc2UsIHRlc3RfY28pLAorICAgICAgICAicmVsb2FkbW9kdWxlIjogKEZhbHNlLCB0ZXN0X2NvKSwKKyAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aD10ZXN0X3BhdGgpOgorICAgICAgICBpZiBwYXRoICE9IHRlc3RfcGF0aDoKKyAgICAgICAgICAgICMgaWYgb3V0IGNsYXNzIGlzIG9uIHN5cy5wYXRoX2hvb2tzLCB3ZSBtdXN0IHJhaXNlCisgICAgICAgICAgICAjIEltcG9ydEVycm9yIGZvciBhbnkgcGF0aCBpdGVtIHRoYXQgd2UgY2FuJ3QgaGFuZGxlLgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorCisgICAgZGVmIF9nZXRfX3BhdGhfXyhzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgorICAgICAgICBpZiBmdWxsbmFtZSBpbiBzZWxmLm1vZHVsZXM6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgIGlzcGtnLCBjb2RlID0gc2VsZi5tb2R1bGVzW2Z1bGxuYW1lXQorICAgICAgICBtb2QgPSBzeXMubW9kdWxlcy5zZXRkZWZhdWx0KGZ1bGxuYW1lLGltcC5uZXdfbW9kdWxlKGZ1bGxuYW1lKSkKKyAgICAgICAgbW9kLl9fZmlsZV9fID0gIjwlcz4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgbW9kLl9fbG9hZGVyX18gPSBzZWxmCisgICAgICAgIGlmIGlzcGtnOgorICAgICAgICAgICAgbW9kLl9fcGF0aF9fID0gc2VsZi5fZ2V0X19wYXRoX18oKQorICAgICAgICBleGVjIGNvZGUgaW4gbW9kLl9fZGljdF9fCisgICAgICAgIHJldHVybiBtb2QKKworCitjbGFzcyBNZXRhSW1wb3J0ZXIoVGVzdEltcG9ydGVyKToKKyAgICBkZWYgX2dldF9fcGF0aF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gW10KKworY2xhc3MgUGF0aEltcG9ydGVyKFRlc3RJbXBvcnRlcik6CisgICAgZGVmIF9nZXRfX3BhdGhfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtzZWxmLnBhdGhdCisKKworY2xhc3MgSW1wb3J0QmxvY2tlcjoKKyAgICAiIiJQbGFjZSBhbiBJbXBvcnRCbG9ja2VyIGluc3RhbmNlIG9uIHN5cy5tZXRhX3BhdGggYW5kIHlvdQorICAgIGNhbiBiZSBzdXJlIHRoZSBtb2R1bGVzIHlvdSBzcGVjaWZpZWQgY2FuJ3QgYmUgaW1wb3J0ZWQsIGV2ZW4KKyAgICBpZiBpdCdzIGEgYnVpbHRpbi4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKm5hbWVzdG9ibG9jayk6CisgICAgICAgIHNlbGYubmFtZXN0b2Jsb2NrID0gZGljdC5mcm9ta2V5cyhuYW1lc3RvYmxvY2spCisgICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgorICAgICAgICBpZiBmdWxsbmFtZSBpbiBzZWxmLm5hbWVzdG9ibG9jazoKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIHJldHVybiBOb25lCisgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJJIGRhcmUgeW91IgorCisKK2NsYXNzIEltcFdyYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aD1Ob25lKToKKyAgICAgICAgaWYgcGF0aCBpcyBub3QgTm9uZSBhbmQgbm90IG9zLnBhdGguaXNkaXIocGF0aCk6CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisKKyAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CisgICAgICAgIHN1Ym5hbWUgPSBmdWxsbmFtZS5zcGxpdCgiLiIpWy0xXQorICAgICAgICBpZiBzdWJuYW1lICE9IGZ1bGxuYW1lIGFuZCBzZWxmLnBhdGggaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgorICAgICAgICAgICAgcGF0aCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBbc2VsZi5wYXRoXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlLCBmaWxlbmFtZSwgc3R1ZmYgPSBpbXAuZmluZF9tb2R1bGUoc3VibmFtZSwgcGF0aCkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIEltcExvYWRlcihmaWxlLCBmaWxlbmFtZSwgc3R1ZmYpCisKKworY2xhc3MgSW1wTG9hZGVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIGZpbGVuYW1lLCBzdHVmZik6CisgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuc3R1ZmYgPSBzdHVmZgorCisgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgbW9kID0gaW1wLmxvYWRfbW9kdWxlKGZ1bGxuYW1lLCBzZWxmLmZpbGUsIHNlbGYuZmlsZW5hbWUsIHNlbGYuc3R1ZmYpCisgICAgICAgIGlmIHNlbGYuZmlsZToKKyAgICAgICAgICAgIHNlbGYuZmlsZS5jbG9zZSgpCisgICAgICAgIG1vZC5fX2xvYWRlcl9fID0gc2VsZiAgIyBmb3IgaW50cm9zcGVjdGlvbgorICAgICAgICByZXR1cm4gbW9kCisKKworY2xhc3MgSW1wb3J0SG9va3NCYXNlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhdGggPSBzeXMucGF0aFs6XQorICAgICAgICBzZWxmLm1ldGFfcGF0aCA9IHN5cy5tZXRhX3BhdGhbOl0KKyAgICAgICAgc2VsZi5wYXRoX2hvb2tzID0gc3lzLnBhdGhfaG9va3NbOl0KKyAgICAgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY2xlYXIoKQorICAgICAgICBzZWxmLm1vZHVsZXNfYmVmb3JlID0gc3lzLm1vZHVsZXMuY29weSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5wYXRoWzpdID0gc2VsZi5wYXRoCisgICAgICAgIHN5cy5tZXRhX3BhdGhbOl0gPSBzZWxmLm1ldGFfcGF0aAorICAgICAgICBzeXMucGF0aF9ob29rc1s6XSA9IHNlbGYucGF0aF9ob29rcworICAgICAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5jbGVhcigpCisgICAgICAgIHN5cy5tb2R1bGVzLmNsZWFyKCkKKyAgICAgICAgc3lzLm1vZHVsZXMudXBkYXRlKHNlbGYubW9kdWxlc19iZWZvcmUpCisKKworY2xhc3MgSW1wb3J0SG9va3NUZXN0Q2FzZShJbXBvcnRIb29rc0Jhc2VUZXN0Q2FzZSk6CisKKyAgICBkZWYgZG9UZXN0SW1wb3J0cyhzZWxmLCBpbXBvcnRlcj1Ob25lKToKKyAgICAgICAgaW1wb3J0IGhvb2t0ZXN0bW9kdWxlCisgICAgICAgIGltcG9ydCBob29rdGVzdHBhY2thZ2UKKyAgICAgICAgaW1wb3J0IGhvb2t0ZXN0cGFja2FnZS5zdWIKKyAgICAgICAgaW1wb3J0IGhvb2t0ZXN0cGFja2FnZS5zdWIuc3ViYmVyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG9va3Rlc3Rtb2R1bGUuZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaG9va3Rlc3Rtb2R1bGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0cGFja2FnZS5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJob29rdGVzdHBhY2thZ2UiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0cGFja2FnZS5zdWIuZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaG9va3Rlc3RwYWNrYWdlLnN1YiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG9va3Rlc3RwYWNrYWdlLnN1Yi5zdWJiZXIuZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaG9va3Rlc3RwYWNrYWdlLnN1Yi5zdWJiZXIiKQorICAgICAgICBpZiBpbXBvcnRlcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG9va3Rlc3Rtb2R1bGUuX19sb2FkZXJfXywgaW1wb3J0ZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0cGFja2FnZS5fX2xvYWRlcl9fLCBpbXBvcnRlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG9va3Rlc3RwYWNrYWdlLnN1Yi5fX2xvYWRlcl9fLCBpbXBvcnRlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG9va3Rlc3RwYWNrYWdlLnN1Yi5zdWJiZXIuX19sb2FkZXJfXywgaW1wb3J0ZXIpCisKKyAgICAgICAgVGVzdEltcG9ydGVyLm1vZHVsZXNbJ3JlbG9hZG1vZHVsZSddID0gKEZhbHNlLCB0ZXN0X2NvKQorICAgICAgICBpbXBvcnQgcmVsb2FkbW9kdWxlCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihyZWxvYWRtb2R1bGUsJ3JlbG9hZGVkJykpCisKKyAgICAgICAgVGVzdEltcG9ydGVyLm1vZHVsZXNbJ3JlbG9hZG1vZHVsZSddID0gKEZhbHNlLCByZWxvYWRfY28pCisgICAgICAgIGltcC5yZWxvYWQocmVsb2FkbW9kdWxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihyZWxvYWRtb2R1bGUsJ3JlbG9hZGVkJykpCisKKyAgICAgICAgaW1wb3J0IGhvb2t0ZXN0cGFja2FnZS5vbGRhYnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChob29rdGVzdHBhY2thZ2Uub2xkYWJzLmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5vbGRhYnMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0cGFja2FnZS5vbGRhYnMuc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2t0ZXN0cGFja2FnZS5zdWIpCisKKyAgICAgICAgaW1wb3J0IGhvb2t0ZXN0cGFja2FnZS5uZXdyZWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChob29rdGVzdHBhY2thZ2UubmV3cmVsLmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5uZXdyZWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0cGFja2FnZS5uZXdyZWwuc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2t0ZXN0cGFja2FnZS5zdWIpCisKKyAgICAgICAgaW1wb3J0IGhvb2t0ZXN0cGFja2FnZS5zdWIuc3ViYmVyLnN1YmVzdCBhcyBzdWJlc3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWJlc3QuZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaG9va3Rlc3RwYWNrYWdlLnN1Yi5zdWJiZXIuc3ViZXN0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWJlc3Quc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2t0ZXN0cGFja2FnZS5zdWIpCisKKyAgICAgICAgaW1wb3J0IGhvb2t0ZXN0cGFja2FnZS5mdXRyZWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChob29rdGVzdHBhY2thZ2UuZnV0cmVsLmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5mdXRyZWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0cGFja2FnZS5mdXRyZWwuc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhvb2t0ZXN0cGFja2FnZS5zdWIpCisKKyAgICAgICAgaW1wb3J0IHN1YgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1Yi5nZXRfbmFtZSgpLCAic3ViIikKKworICAgICAgICBpbXBvcnQgaG9va3Rlc3RwYWNrYWdlLm5ld2FicworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0cGFja2FnZS5uZXdhYnMuZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaG9va3Rlc3RwYWNrYWdlLm5ld2FicyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG9va3Rlc3RwYWNrYWdlLm5ld2Ficy5zdWIsIHN1YikKKworICAgIGRlZiB0ZXN0TWV0YVBhdGgoc2VsZik6CisgICAgICAgIGkgPSBNZXRhSW1wb3J0ZXIoKQorICAgICAgICBzeXMubWV0YV9wYXRoLmFwcGVuZChpKQorICAgICAgICBzZWxmLmRvVGVzdEltcG9ydHMoaSkKKworICAgIGRlZiB0ZXN0UGF0aEhvb2soc2VsZik6CisgICAgICAgIHN5cy5wYXRoX2hvb2tzLmFwcGVuZChQYXRoSW1wb3J0ZXIpCisgICAgICAgIHN5cy5wYXRoLmFwcGVuZCh0ZXN0X3BhdGgpCisgICAgICAgIHNlbGYuZG9UZXN0SW1wb3J0cygpCisKKyAgICBkZWYgdGVzdEJsb2NrZXIoc2VsZik6CisgICAgICAgIG1uYW1lID0gImV4Y2VwdGlvbnMiICAjIGFuIGFyYml0cmFyeSBoYXJtbGVzcyBidWlsdGluIG1vZHVsZQorICAgICAgICB0ZXN0X3N1cHBvcnQudW5sb2FkKG1uYW1lKQorICAgICAgICBzeXMubWV0YV9wYXRoLmFwcGVuZChJbXBvcnRCbG9ja2VyKG1uYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IsIF9faW1wb3J0X18sIG1uYW1lKQorCisgICAgZGVmIHRlc3RJbXBXcmFwcGVyKHNlbGYpOgorICAgICAgICBpID0gSW1wV3JhcHBlcigpCisgICAgICAgIHN5cy5tZXRhX3BhdGguYXBwZW5kKGkpCisgICAgICAgIHN5cy5wYXRoX2hvb2tzLmFwcGVuZChJbXBXcmFwcGVyKQorICAgICAgICBtbmFtZXMgPSAoImNvbG9yc3lzIiwgInVybHBhcnNlIiwgImRpc3R1dGlscy5jb3JlIiwgImNvbXBpbGVyLm1pc2MiKQorICAgICAgICBmb3IgbW5hbWUgaW4gbW5hbWVzOgorICAgICAgICAgICAgcGFyZW50ID0gbW5hbWUuc3BsaXQoIi4iKVswXQorICAgICAgICAgICAgZm9yIG4gaW4gc3lzLm1vZHVsZXMua2V5cygpOgorICAgICAgICAgICAgICAgIGlmIG4uc3RhcnRzd2l0aChwYXJlbnQpOgorICAgICAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbl0KKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCJUaGUgY29tcGlsZXIgcGFja2FnZSBpcyBkZXByZWNhdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgcmVtb3ZlZCIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgZm9yIG1uYW1lIGluIG1uYW1lczoKKyAgICAgICAgICAgICAgICBtID0gX19pbXBvcnRfXyhtbmFtZSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWyJfX2R1bW15X18iXSkKKyAgICAgICAgICAgICAgICBtLl9fbG9hZGVyX18gICMgdG8gbWFrZSBzdXJlIHdlIGFjdHVhbGx5IGhhbmRsZWQgdGhlIGltcG9ydAorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEltcG9ydEhvb2tzVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGhvb2tzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGhvb2tzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2YyMjkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0aG9va3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGhvb2tzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGhvb2tzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2YyMjkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0aG9va3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWQ4ZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0bGliLnB5CkBAIC0wLDAgKzEsMTc2IEBACitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IGltcAoraW1wb3J0IGltcG9ydGxpYgoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKKworQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKK2RlZiB1bmNhY2hlKCpuYW1lcyk6CisgICAgIiIiVW5jYWNoZSBhIG1vZHVsZSBmcm9tIHN5cy5tb2R1bGVzLgorCisgICAgQSBiYXNpYyBzYW5pdHkgY2hlY2sgaXMgcGVyZm9ybWVkIHRvIHByZXZlbnQgdW5jYWNoaW5nIG1vZHVsZXMgdGhhdCBlaXRoZXIKKyAgICBjYW5ub3Qvc2hvdWxkbid0IGJlIHVuY2FjaGVkLgorCisgICAgIiIiCisgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgIGlmIG5hbWUgaW4gKCdzeXMnLCAnbWFyc2hhbCcsICdpbXAnKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgImNhbm5vdCB1bmNhY2hlIHswfSBhcyBpdCB3aWxsIGJyZWFrIF9pbXBvcnRsaWIiLmZvcm1hdChuYW1lKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW25hbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICB0cnk6CisgICAgICAgIHlpZWxkCisgICAgZmluYWxseToKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW25hbWVdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgaW1wb3J0X3N0YXRlKCoqa3dhcmdzKToKKyAgICAiIiJDb250ZXh0IG1hbmFnZXIgdG8gbWFuYWdlIHRoZSB2YXJpb3VzIGltcG9ydGVycyBhbmQgc3RvcmVkIHN0YXRlIGluIHRoZQorICAgIHN5cyBtb2R1bGUuCisKKyAgICBUaGUgJ21vZHVsZXMnIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIGFzIHRoZSBpbnRlcnByZXRlciBzdGF0ZSBzdG9yZXMgYQorICAgIHBvaW50ZXIgdG8gdGhlIGRpY3QgdGhhdCB0aGUgaW50ZXJwcmV0ZXIgdXNlcyBpbnRlcm5hbGx5OworICAgIHJlYXNzaWduaW5nIHRvIHN5cy5tb2R1bGVzIGRvZXMgbm90IGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0LgorCisgICAgIiIiCisgICAgb3JpZ2luYWxzID0ge30KKyAgICB0cnk6CisgICAgICAgIGZvciBhdHRyLCBkZWZhdWx0IGluICgoJ21ldGFfcGF0aCcsIFtdKSwgKCdwYXRoJywgW10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdwYXRoX2hvb2tzJywgW10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdwYXRoX2ltcG9ydGVyX2NhY2hlJywge30pKToKKyAgICAgICAgICAgIG9yaWdpbmFsc1thdHRyXSA9IGdldGF0dHIoc3lzLCBhdHRyKQorICAgICAgICAgICAgaWYgYXR0ciBpbiBrd2FyZ3M6CisgICAgICAgICAgICAgICAgbmV3X3ZhbHVlID0ga3dhcmdzW2F0dHJdCisgICAgICAgICAgICAgICAgZGVsIGt3YXJnc1thdHRyXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdfdmFsdWUgPSBkZWZhdWx0CisgICAgICAgICAgICBzZXRhdHRyKHN5cywgYXR0ciwgbmV3X3ZhbHVlKQorICAgICAgICBpZiBsZW4oa3dhcmdzKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICd1bnJlY29nbml6ZWQgYXJndW1lbnRzOiB7MH0nLmZvcm1hdChrd2FyZ3Mua2V5cygpKSkKKyAgICAgICAgeWllbGQKKyAgICBmaW5hbGx5OgorICAgICAgICBmb3IgYXR0ciwgdmFsdWUgaW4gb3JpZ2luYWxzLml0ZW1zKCk6CisgICAgICAgICAgICBzZXRhdHRyKHN5cywgYXR0ciwgdmFsdWUpCisKKworY2xhc3MgbW9ja19tb2R1bGVzKG9iamVjdCk6CisKKyAgICAiIiJBIG1vY2sgaW1wb3J0ZXIvbG9hZGVyLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICpuYW1lcyk6CisgICAgICAgIHNlbGYubW9kdWxlcyA9IHt9CisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgaWYgbm90IG5hbWUuZW5kc3dpdGgoJy5fX2luaXRfXycpOgorICAgICAgICAgICAgICAgIGltcG9ydF9uYW1lID0gbmFtZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbXBvcnRfbmFtZSA9IG5hbWVbOi1sZW4oJy5fX2luaXRfXycpXQorICAgICAgICAgICAgaWYgJy4nIG5vdCBpbiBuYW1lOgorICAgICAgICAgICAgICAgIHBhY2thZ2UgPSBOb25lCisgICAgICAgICAgICBlbGlmIGltcG9ydF9uYW1lID09IG5hbWU6CisgICAgICAgICAgICAgICAgcGFja2FnZSA9IG5hbWUucnNwbGl0KCcuJywgMSlbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFja2FnZSA9IGltcG9ydF9uYW1lCisgICAgICAgICAgICBtb2R1bGUgPSBpbXAubmV3X21vZHVsZShpbXBvcnRfbmFtZSkKKyAgICAgICAgICAgIG1vZHVsZS5fX2xvYWRlcl9fID0gc2VsZgorICAgICAgICAgICAgbW9kdWxlLl9fZmlsZV9fID0gJzxtb2NrIF9fZmlsZV9fPicKKyAgICAgICAgICAgIG1vZHVsZS5fX3BhY2thZ2VfXyA9IHBhY2thZ2UKKyAgICAgICAgICAgIG1vZHVsZS5hdHRyID0gbmFtZQorICAgICAgICAgICAgaWYgaW1wb3J0X25hbWUgIT0gbmFtZToKKyAgICAgICAgICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBbJzxtb2NrIF9fcGF0aF9fPiddCisgICAgICAgICAgICBzZWxmLm1vZHVsZXNbaW1wb3J0X25hbWVdID0gbW9kdWxlCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLm1vZHVsZXNbbmFtZV0KKworICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKKyAgICAgICAgaWYgZnVsbG5hbWUgbm90IGluIHNlbGYubW9kdWxlczoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgaWYgZnVsbG5hbWUgbm90IGluIHNlbGYubW9kdWxlczoKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzeXMubW9kdWxlc1tmdWxsbmFtZV0gPSBzZWxmLm1vZHVsZXNbZnVsbG5hbWVdCisgICAgICAgICAgICByZXR1cm4gc2VsZi5tb2R1bGVzW2Z1bGxuYW1lXQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fdW5jYWNoZSA9IHVuY2FjaGUoKnNlbGYubW9kdWxlcy5rZXlzKCkpCisgICAgICAgIHNlbGYuX3VuY2FjaGUuX19lbnRlcl9fKCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pOgorICAgICAgICBzZWxmLl91bmNhY2hlLl9fZXhpdF9fKE5vbmUsIE5vbmUsIE5vbmUpCisKKworCitjbGFzcyBJbXBvcnRNb2R1bGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJUZXN0IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlLiIiIgorCisgICAgZGVmIHRlc3RfbW9kdWxlX2ltcG9ydChzZWxmKToKKyAgICAgICAgIyBUZXN0IGltcG9ydGluZyBhIHRvcC1sZXZlbCBtb2R1bGUuCisgICAgICAgIHdpdGggbW9ja19tb2R1bGVzKCd0b3BfbGV2ZWwnKSBhcyBtb2NrOgorICAgICAgICAgICAgd2l0aCBpbXBvcnRfc3RhdGUobWV0YV9wYXRoPVttb2NrXSk6CisgICAgICAgICAgICAgICAgbW9kdWxlID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoJ3RvcF9sZXZlbCcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sICd0b3BfbGV2ZWwnKQorCisgICAgZGVmIHRlc3RfYWJzb2x1dGVfcGFja2FnZV9pbXBvcnQoc2VsZik6CisgICAgICAgICMgVGVzdCBpbXBvcnRpbmcgYSBtb2R1bGUgZnJvbSBhIHBhY2thZ2Ugd2l0aCBhbiBhYnNvbHV0ZSBuYW1lLgorICAgICAgICBwa2dfbmFtZSA9ICdwa2cnCisgICAgICAgIHBrZ19sb25nX25hbWUgPSAnezB9Ll9faW5pdF9fJy5mb3JtYXQocGtnX25hbWUpCisgICAgICAgIG5hbWUgPSAnezB9Lm1vZCcuZm9ybWF0KHBrZ19uYW1lKQorICAgICAgICB3aXRoIG1vY2tfbW9kdWxlcyhwa2dfbG9uZ19uYW1lLCBuYW1lKSBhcyBtb2NrOgorICAgICAgICAgICAgd2l0aCBpbXBvcnRfc3RhdGUobWV0YV9wYXRoPVttb2NrXSk6CisgICAgICAgICAgICAgICAgbW9kdWxlID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUobmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZS5fX25hbWVfXywgbmFtZSkKKworICAgIGRlZiB0ZXN0X3NoYWxsb3dfcmVsYXRpdmVfcGFja2FnZV9pbXBvcnQoc2VsZik6CisgICAgICAgIG1vZHVsZXMgPSBbJ2EuX19pbml0X18nLCAnYS5iLl9faW5pdF9fJywgJ2EuYi5jLl9faW5pdF9fJywgJ2EuYi5jLmQnXQorICAgICAgICB3aXRoIG1vY2tfbW9kdWxlcygqbW9kdWxlcykgYXMgbW9jazoKKyAgICAgICAgICAgIHdpdGggaW1wb3J0X3N0YXRlKG1ldGFfcGF0aD1bbW9ja10pOgorICAgICAgICAgICAgICAgIG1vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCcuZCcsICdhLmIuYycpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sICdhLmIuYy5kJykKKworICAgIGRlZiB0ZXN0X2RlZXBfcmVsYXRpdmVfcGFja2FnZV9pbXBvcnQoc2VsZik6CisgICAgICAgICMgVGVzdCBpbXBvcnRpbmcgYSBtb2R1bGUgZnJvbSBhIHBhY2thZ2UgdGhyb3VnaCBhIHJlbGF0dmUgaW1wb3J0LgorICAgICAgICBtb2R1bGVzID0gWydhLl9faW5pdF9fJywgJ2EuYi5fX2luaXRfXycsICdhLmMnXQorICAgICAgICB3aXRoIG1vY2tfbW9kdWxlcygqbW9kdWxlcykgYXMgbW9jazoKKyAgICAgICAgICAgIHdpdGggaW1wb3J0X3N0YXRlKG1ldGFfcGF0aD1bbW9ja10pOgorICAgICAgICAgICAgICAgIG1vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCcuLmMnLCAnYS5iJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZS5fX25hbWVfXywgJ2EuYycpCisKKyAgICBkZWYgdGVzdF9hYnNvbHV0ZV9pbXBvcnRfd2l0aF9wYWNrYWdlKHNlbGYpOgorICAgICAgICAjIFRlc3QgaW1wb3J0aW5nIGEgbW9kdWxlIGZyb20gYSBwYWNrYWdlIHdpdGggYW4gYWJzb2x1dGUgbmFtZSB3aXRoCisgICAgICAgICMgdGhlICdwYWNrYWdlJyBhcmd1bWVudCBnaXZlbi4KKyAgICAgICAgcGtnX25hbWUgPSAncGtnJworICAgICAgICBwa2dfbG9uZ19uYW1lID0gJ3swfS5fX2luaXRfXycuZm9ybWF0KHBrZ19uYW1lKQorICAgICAgICBuYW1lID0gJ3swfS5tb2QnLmZvcm1hdChwa2dfbmFtZSkKKyAgICAgICAgd2l0aCBtb2NrX21vZHVsZXMocGtnX2xvbmdfbmFtZSwgbmFtZSkgYXMgbW9jazoKKyAgICAgICAgICAgIHdpdGggaW1wb3J0X3N0YXRlKG1ldGFfcGF0aD1bbW9ja10pOgorICAgICAgICAgICAgICAgIG1vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKG5hbWUsIHBrZ19uYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCBuYW1lKQorCisgICAgZGVmIHRlc3RfcmVsYXRpdmVfaW1wb3J0X3dvX3BhY2thZ2Uoc2VsZik6CisgICAgICAgICMgUmVsYXRpdmUgaW1wb3J0cyBjYW5ub3QgaGFwcGVuIHdpdGhvdXQgdGhlICdwYWNrYWdlJyBhcmd1bWVudCBiZWluZworICAgICAgICAjIHNldC4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSwgJy5zdXBwb3J0JykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisgICAgcnVuX3VuaXR0ZXN0KEltcG9ydE1vZHVsZVRlc3RzKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMzgzYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMzgzYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2luZGV4LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5kZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyYjQ0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2luZGV4LnB5CkBAIC0wLDAgKzEsMzIzIEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgb3BlcmF0b3IKK2Zyb20gc3lzIGltcG9ydCBtYXhpbnQKK21heHNpemUgPSB0ZXN0X3N1cHBvcnQuTUFYX1B5X3NzaXplX3QKK21pbnNpemUgPSAtbWF4c2l6ZS0xCisKK2NsYXNzIG9sZHN0eWxlOgorICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmluZAorCitjbGFzcyBuZXdzdHlsZShvYmplY3QpOgorICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmluZAorCitjbGFzcyBUcmFwSW50KGludCk6CisgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworY2xhc3MgVHJhcExvbmcobG9uZyk6CisgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworY2xhc3MgQmFzZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubyA9IG9sZHN0eWxlKCkKKyAgICAgICAgc2VsZi5uID0gbmV3c3R5bGUoKQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAtMgorICAgICAgICBzZWxmLm4uaW5kID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmluZGV4KHNlbGYubyksIC0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmluZGV4KHNlbGYubiksIDIpCisKKyAgICBkZWYgdGVzdF9zbGljZShzZWxmKToKKyAgICAgICAgc2VsZi5vLmluZCA9IDEKKyAgICAgICAgc2VsZi5uLmluZCA9IDIKKyAgICAgICAgc2xjID0gc2xpY2Uoc2VsZi5vLCBzZWxmLm8sIHNlbGYubykKKyAgICAgICAgY2hlY2tfc2xjID0gc2xpY2UoMSwgMSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGMuaW5kaWNlcyhzZWxmLm8pLCBjaGVja19zbGMuaW5kaWNlcygxKSkKKyAgICAgICAgc2xjID0gc2xpY2Uoc2VsZi5uLCBzZWxmLm4sIHNlbGYubikKKyAgICAgICAgY2hlY2tfc2xjID0gc2xpY2UoMiwgMiwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGMuaW5kaWNlcyhzZWxmLm4pLCBjaGVja19zbGMuaW5kaWNlcygyKSkKKworICAgIGRlZiB0ZXN0X3dyYXBwZXJzKHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gNAorICAgICAgICBzZWxmLm4uaW5kID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDYgLl9faW5kZXhfXygpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC03TC5fX2luZGV4X18oKSwgLTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5vLl9faW5kZXhfXygpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubi5fX2luZGV4X18oKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLl9faW5kZXhfXygpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLl9faW5kZXhfXygpLCAwKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NlcyhzZWxmKToKKyAgICAgICAgciA9IHJhbmdlKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbVHJhcEludCg1KTpUcmFwSW50KDEwKV0sIHJbNToxMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocltUcmFwTG9uZyg1KTpUcmFwTG9uZygxMCldLCByWzU6MTBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKFRyYXBJbnQoKSkuaW5kaWNlcygwKSwgKDAsMCwxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGljZShUcmFwTG9uZygwKSkuaW5kaWNlcygwKSwgKDAsMCwxKSkKKworICAgIGRlZiB0ZXN0X2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gJ2R1bWInCisgICAgICAgIHNlbGYubi5pbmQgPSAnYmFkJworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmluZGV4LCBzZWxmLm8pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXgsIHNlbGYubikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzbGljZShzZWxmLm8pLmluZGljZXMsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2xpY2Uoc2VsZi5uKS5pbmRpY2VzLCAwKQorCisKK2NsYXNzIFNlcVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoaXMgdGVzdCBjYXNlIGlzbid0IHJ1biBkaXJlY3RseS4gSXQganVzdCBkZWZpbmVzIGNvbW1vbiB0ZXN0cworICAgICMgdG8gdGhlIGRpZmZlcmVudCBzZXF1ZW5jZSB0eXBlcyBiZWxvdworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5vID0gb2xkc3R5bGUoKQorICAgICAgICBzZWxmLm4gPSBuZXdzdHlsZSgpCisgICAgICAgIHNlbGYubzIgPSBvbGRzdHlsZSgpCisgICAgICAgIHNlbGYubjIgPSBuZXdzdHlsZSgpCisKKyAgICBkZWYgdGVzdF9pbmRleChzZWxmKToKKyAgICAgICAgc2VsZi5vLmluZCA9IC0yCisgICAgICAgIHNlbGYubi5pbmQgPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbc2VsZi5uXSwgc2VsZi5zZXFbMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbc2VsZi5vXSwgc2VsZi5zZXFbLTJdKQorCisgICAgZGVmIHRlc3Rfc2xpY2Uoc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAxCisgICAgICAgIHNlbGYubzIuaW5kID0gMworICAgICAgICBzZWxmLm4uaW5kID0gMgorICAgICAgICBzZWxmLm4yLmluZCA9IDQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcVtzZWxmLm86c2VsZi5vMl0sIHNlbGYuc2VxWzE6M10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbc2VsZi5uOnNlbGYubjJdLCBzZWxmLnNlcVsyOjRdKQorCisgICAgZGVmIHRlc3Rfc2xpY2VfYnVnNzUzMihzZWxmKToKKyAgICAgICAgc2VxbGVuID0gbGVuKHNlbGYuc2VxKQorICAgICAgICBzZWxmLm8uaW5kID0gaW50KHNlcWxlbiAqIDEuNSkKKyAgICAgICAgc2VsZi5uLmluZCA9IHNlcWxlbiArIDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcVtzZWxmLm86XSwgc2VsZi5zZXFbMDowXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcVs6c2VsZi5vXSwgc2VsZi5zZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbc2VsZi5uOl0sIHNlbGYuc2VxWzA6MF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbOnNlbGYubl0sIHNlbGYuc2VxKQorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuc2VxLCBDbGFzc2ljU2VxKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIFRoZXNlIHRlc3RzIGZhaWwgZm9yIENsYXNzaWNTZXEgKHNlZSBidWcgIzc1MzIpCisgICAgICAgIHNlbGYubzIuaW5kID0gLXNlcWxlbiAtIDIKKyAgICAgICAgc2VsZi5uMi5pbmQgPSAtaW50KHNlcWxlbiAqIDEuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcVtzZWxmLm8yOl0sIHNlbGYuc2VxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxWzpzZWxmLm8yXSwgc2VsZi5zZXFbMDowXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcVtzZWxmLm4yOl0sIHNlbGYuc2VxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxWzpzZWxmLm4yXSwgc2VsZi5zZXFbMDowXSkKKworICAgIGRlZiB0ZXN0X3JlcGVhdChzZWxmKToKKyAgICAgICAgc2VsZi5vLmluZCA9IDMKKyAgICAgICAgc2VsZi5uLmluZCA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcSAqIHNlbGYubywgc2VsZi5zZXEgKiAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxICogc2VsZi5uLCBzZWxmLnNlcSAqIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5vICogc2VsZi5zZXEsIHNlbGYuc2VxICogMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm4gKiBzZWxmLnNlcSwgc2VsZi5zZXEgKiAyKQorCisgICAgZGVmIHRlc3Rfd3JhcHBlcnMoc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSA0CisgICAgICAgIHNlbGYubi5pbmQgPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXEuX19nZXRpdGVtX18oc2VsZi5vKSwgc2VsZi5zZXFbNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXEuX19tdWxfXyhzZWxmLm8pLCBzZWxmLnNlcSAqIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXEuX19ybXVsX18oc2VsZi5vKSwgc2VsZi5zZXEgKiA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxLl9fZ2V0aXRlbV9fKHNlbGYubiksIHNlbGYuc2VxWzVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxLl9fbXVsX18oc2VsZi5uKSwgc2VsZi5zZXEgKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxLl9fcm11bF9fKHNlbGYubiksIHNlbGYuc2VxICogNSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbVHJhcEludCgpXSwgc2VsZi5zZXFbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbVHJhcExvbmcoKV0sIHNlbGYuc2VxWzBdKQorCisgICAgZGVmIHRlc3RfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAnZHVtYicKKyAgICAgICAgc2VsZi5uLmluZCA9ICdiYWQnCisgICAgICAgIGluZGV4b2JqID0gbGFtYmRhIHgsIG9iajogb2JqLnNlcVt4XQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGluZGV4b2JqLCBzZWxmLm8sIHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW5kZXhvYmosIHNlbGYubiwgc2VsZikKKyAgICAgICAgc2xpY2VvYmogPSBsYW1iZGEgeCwgb2JqOiBvYmouc2VxW3g6XQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNsaWNlb2JqLCBzZWxmLm8sIHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2xpY2VvYmosIHNlbGYubiwgc2VsZikKKworCitjbGFzcyBMaXN0VGVzdENhc2UoU2VxVGVzdENhc2UpOgorICAgIHNlcSA9IFswLDEwLDIwLDMwLDQwLDUwXQorCisgICAgZGVmIHRlc3Rfc2V0ZGVsaXRlbShzZWxmKToKKyAgICAgICAgc2VsZi5vLmluZCA9IC0yCisgICAgICAgIHNlbGYubi5pbmQgPSAyCisgICAgICAgIGxzdCA9IGxpc3QoJ2FiIWNkZWZnaGkhaicpCisgICAgICAgIGRlbCBsc3Rbc2VsZi5vXQorICAgICAgICBkZWwgbHN0W3NlbGYubl0KKyAgICAgICAgbHN0W3NlbGYub10gPSAnWCcKKyAgICAgICAgbHN0W3NlbGYubl0gPSAnWScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIGxpc3QoJ2FiWWRlZmdoWGonKSkKKworICAgICAgICBsc3QgPSBbNSwgNiwgNywgOCwgOSwgMTAsIDExXQorICAgICAgICBsc3QuX19zZXRpdGVtX18oc2VsZi5uLCAiaGVyZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBbNSwgNiwgImhlcmUiLCA4LCA5LCAxMCwgMTFdKQorICAgICAgICBsc3QuX19kZWxpdGVtX18oc2VsZi5uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgWzUsIDYsIDgsIDksIDEwLCAxMV0pCisKKyAgICBkZWYgdGVzdF9pbnBsYWNlX3JlcGVhdChzZWxmKToKKyAgICAgICAgc2VsZi5vLmluZCA9IDIKKyAgICAgICAgc2VsZi5uLmluZCA9IDMKKyAgICAgICAgbHN0ID0gWzYsIDRdCisgICAgICAgIGxzdCAqPSBzZWxmLm8KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFs2LCA0LCA2LCA0XSkKKyAgICAgICAgbHN0ICo9IHNlbGYubgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgWzYsIDQsIDYsIDRdICogMykKKworICAgICAgICBsc3QgPSBbNSwgNiwgNywgOCwgOSwgMTFdCisgICAgICAgIGwyID0gbHN0Ll9faW11bF9fKHNlbGYubikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhsMiwgbHN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgWzUsIDYsIDcsIDgsIDksIDExXSAqIDMpCisKKworY2xhc3MgX0Jhc2VTZXE6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaXRlcmFibGUpOgorICAgICAgICBzZWxmLl9saXN0ID0gbGlzdChpdGVyYWJsZSkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHJlcHIoc2VsZi5fbGlzdCkKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5fbGlzdCA9PSBvdGhlcgorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fbGlzdCkKKworICAgIGRlZiBfX211bF9fKHNlbGYsIG4pOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fbGlzdCpuKQorICAgIF9fcm11bF9fID0gX19tdWxfXworCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3RbaW5kZXhdCisKKworY2xhc3MgX0dldFNsaWNlTWl4aW46CisKKyAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOgorICAgICAgICByZXR1cm4gc2VsZi5fbGlzdC5fX2dldHNsaWNlX18oaSwgaikKKworCitjbGFzcyBDbGFzc2ljU2VxKF9CYXNlU2VxKTogcGFzcworY2xhc3MgTmV3U2VxKF9CYXNlU2VxLCBvYmplY3QpOiBwYXNzCitjbGFzcyBDbGFzc2ljU2VxRGVwcmVjYXRlZChfR2V0U2xpY2VNaXhpbiwgQ2xhc3NpY1NlcSk6IHBhc3MKK2NsYXNzIE5ld1NlcURlcHJlY2F0ZWQoX0dldFNsaWNlTWl4aW4sIE5ld1NlcSk6IHBhc3MKKworCitjbGFzcyBUdXBsZVRlc3RDYXNlKFNlcVRlc3RDYXNlKToKKyAgICBzZXEgPSAoMCwxMCwyMCwzMCw0MCw1MCkKKworY2xhc3MgU3RyaW5nVGVzdENhc2UoU2VxVGVzdENhc2UpOgorICAgIHNlcSA9ICJ0aGlzIGlzIGEgdGVzdCIKKworY2xhc3MgQnl0ZUFycmF5VGVzdENhc2UoU2VxVGVzdENhc2UpOgorICAgIHNlcSA9IGJ5dGVhcnJheSgidGhpcyBpcyBhIHRlc3QiKQorCitjbGFzcyBVbmljb2RlVGVzdENhc2UoU2VxVGVzdENhc2UpOgorICAgIHNlcSA9IHUidGhpcyBpcyBhIHRlc3QiCisKK2NsYXNzIENsYXNzaWNTZXFUZXN0Q2FzZShTZXFUZXN0Q2FzZSk6CisgICAgc2VxID0gQ2xhc3NpY1NlcSgoMCwxMCwyMCwzMCw0MCw1MCkpCisKK2NsYXNzIE5ld1NlcVRlc3RDYXNlKFNlcVRlc3RDYXNlKToKKyAgICBzZXEgPSBOZXdTZXEoKDAsMTAsMjAsMzAsNDAsNTApKQorCitjbGFzcyBDbGFzc2ljU2VxRGVwcmVjYXRlZFRlc3RDYXNlKFNlcVRlc3RDYXNlKToKKyAgICBzZXEgPSBDbGFzc2ljU2VxRGVwcmVjYXRlZCgoMCwxMCwyMCwzMCw0MCw1MCkpCisKK2NsYXNzIE5ld1NlcURlcHJlY2F0ZWRUZXN0Q2FzZShTZXFUZXN0Q2FzZSk6CisgICAgc2VxID0gTmV3U2VxRGVwcmVjYXRlZCgoMCwxMCwyMCwzMCw0MCw1MCkpCisKKworY2xhc3MgWFJhbmdlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfeHJhbmdlKHNlbGYpOgorICAgICAgICBuID0gbmV3c3R5bGUoKQorICAgICAgICBuLmluZCA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4cmFuZ2UoMSwgMjApW25dLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhyYW5nZSgxLCAyMCkuX19nZXRpdGVtX18obiksIDYpCisKK2NsYXNzIE92ZXJmbG93VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBvcyA9IDIqKjEwMAorICAgICAgICBzZWxmLm5lZyA9IC1zZWxmLnBvcworCisgICAgZGVmIHRlc3RfbGFyZ2VfbG9uZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wb3MuX19pbmRleF9fKCksIHNlbGYucG9zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmVnLl9faW5kZXhfXygpLCBzZWxmLm5lZykKKworICAgIGRlZiBfZ2V0aXRlbV9oZWxwZXIoc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIEdldEl0ZW0oYmFzZSk6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF4aW50ICMgY2Fubm90IHJldHVybiBsb25nIGhlcmUKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiBrZXkKKyAgICAgICAgeCA9IEdldEl0ZW0oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbc2VsZi5wb3NdLCBzZWxmLnBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4W3NlbGYubmVnXSwgc2VsZi5uZWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFtzZWxmLm5lZzpzZWxmLnBvc10uaW5kaWNlcyhtYXhzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgbWF4c2l6ZSwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFtzZWxmLm5lZzpzZWxmLnBvczoxXS5pbmRpY2VzKG1heHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBtYXhzaXplLCAxKSkKKworICAgIGRlZiBfZ2V0c2xpY2VfaGVscGVyX2RlcHJlY2F0ZWQoc2VsZiwgYmFzZSk6CisgICAgICAgIGNsYXNzIEdldEl0ZW0oYmFzZSk6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF4aW50ICMgY2Fubm90IHJldHVybiBsb25nIGhlcmUKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiBrZXkKKyAgICAgICAgICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgaSwgaik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGksIGoKKyAgICAgICAgeCA9IEdldEl0ZW0oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbc2VsZi5wb3NdLCBzZWxmLnBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4W3NlbGYubmVnXSwgc2VsZi5uZWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFtzZWxmLm5lZzpzZWxmLnBvc10sIChtYXhpbnQrbWluc2l6ZSwgbWF4c2l6ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFtzZWxmLm5lZzpzZWxmLnBvczoxXS5pbmRpY2VzKG1heHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgwLCBtYXhzaXplLCAxKSkKKworICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CisgICAgICAgIHNlbGYuX2dldGl0ZW1faGVscGVyKG9iamVjdCkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5fZ2V0c2xpY2VfaGVscGVyX2RlcHJlY2F0ZWQob2JqZWN0KQorCisgICAgZGVmIHRlc3RfZ2V0aXRlbV9jbGFzc2ljKHNlbGYpOgorICAgICAgICBjbGFzcyBFbXB0eTogcGFzcworICAgICAgICAjIFhYWCBUaGlzIHRlc3QgZmFpbHMgKHNlZSBidWcgIzc1MzIpCisgICAgICAgICNzZWxmLl9nZXRpdGVtX2hlbHBlcihFbXB0eSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5fZ2V0c2xpY2VfaGVscGVyX2RlcHJlY2F0ZWQoRW1wdHkpCisKKyAgICBkZWYgdGVzdF9zZXF1ZW5jZV9yZXBlYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGxhbWJkYTogImEiICogc2VsZi5wb3MpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGxhbWJkYTogImEiICogc2VsZi5uZWcpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIEJhc2VUZXN0Q2FzZSwKKyAgICAgICAgTGlzdFRlc3RDYXNlLAorICAgICAgICBUdXBsZVRlc3RDYXNlLAorICAgICAgICBCeXRlQXJyYXlUZXN0Q2FzZSwKKyAgICAgICAgU3RyaW5nVGVzdENhc2UsCisgICAgICAgIFVuaWNvZGVUZXN0Q2FzZSwKKyAgICAgICAgQ2xhc3NpY1NlcVRlc3RDYXNlLAorICAgICAgICBOZXdTZXFUZXN0Q2FzZSwKKyAgICAgICAgWFJhbmdlVGVzdENhc2UsCisgICAgICAgIE92ZXJmbG93VGVzdENhc2UsCisgICAgKQorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgICAgIENsYXNzaWNTZXFEZXByZWNhdGVkVGVzdENhc2UsCisgICAgICAgICAgICBOZXdTZXFEZXByZWNhdGVkVGVzdENhc2UsCisgICAgICAgICkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbmRleC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbmRleC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3M2I5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2luZGV4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbmRleC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbmRleC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3M2I5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2luZGV4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnNwZWN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5zcGVjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGRjZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5zcGVjdC5weQpAQCAtMCwwICsxLDg0NSBAQAoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgdHlwZXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGluc3BlY3QKK2ltcG9ydCBsaW5lY2FjaGUKK2ltcG9ydCBkYXRldGltZQorZnJvbSBVc2VyTGlzdCBpbXBvcnQgVXNlckxpc3QKK2Zyb20gVXNlckRpY3QgaW1wb3J0IFVzZXJEaWN0CisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfcHkza193YXJuaW5ncworCit3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICgidHVwbGUgcGFyYW1ldGVyIHVucGFja2luZyBoYXMgYmVlbiByZW1vdmVkIiwgU3ludGF4V2FybmluZyksCisgICAgICAgIHF1aWV0PVRydWUpOgorICAgIGZyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIgYXMgbW9kCisgICAgZnJvbSB0ZXN0IGltcG9ydCBpbnNwZWN0X2ZvZGRlcjIgYXMgbW9kMgorCisjIEMgbW9kdWxlIGZvciB0ZXN0X2ZpbmRzb3VyY2VfYmluYXJ5CitpbXBvcnQgdW5pY29kZWRhdGEKKworIyBGdW5jdGlvbnMgdGVzdGVkIGluIHRoaXMgc3VpdGU6CisjIGlzbW9kdWxlLCBpc2NsYXNzLCBpc21ldGhvZCwgaXNmdW5jdGlvbiwgaXN0cmFjZWJhY2ssIGlzZnJhbWUsIGlzY29kZSwKKyMgaXNidWlsdGluLCBpc3JvdXRpbmUsIGlzZ2VuZXJhdG9yLCBpc2dlbmVyYXRvcmZ1bmN0aW9uLCBnZXRtZW1iZXJzLAorIyBnZXRkb2MsIGdldGZpbGUsIGdldG1vZHVsZSwgZ2V0c291cmNlZmlsZSwgZ2V0Y29tbWVudHMsIGdldHNvdXJjZSwKKyMgZ2V0Y2xhc3N0cmVlLCBnZXRhcmdzcGVjLCBnZXRhcmd2YWx1ZXMsIGZvcm1hdGFyZ3NwZWMsIGZvcm1hdGFyZ3ZhbHVlcywKKyMgY3VycmVudGZyYW1lLCBzdGFjaywgdHJhY2UsIGlzZGF0YWRlc2NyaXB0b3IKKworIyBOT1RFOiBUaGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIHRlc3RzIHJlbGF0aW5nIHRvIGludGVyYWN0aW9uIHdpdGgKKyMgICAgICAgemlwaW1wb3J0IGluIHRoZSB0ZXN0X3ppcGltcG9ydF9zdXBwb3J0IHRlc3QgbW9kdWxlLgorCittb2RmaWxlID0gbW9kLl9fZmlsZV9fCitpZiBtb2RmaWxlLmVuZHN3aXRoKCgnYycsICdvJykpOgorICAgIG1vZGZpbGUgPSBtb2RmaWxlWzotMV0KKworaW1wb3J0IF9fYnVpbHRpbl9fCisKK3RyeToKKyAgICAxIC8vIDAKK2V4Y2VwdDoKKyAgICB0YiA9IHN5cy5leGNfdHJhY2ViYWNrCisKK2dpdCA9IG1vZC5TdHVwaWRHaXQoKQorCitjbGFzcyBJc1Rlc3RCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBwcmVkaWNhdGVzID0gc2V0KFtpbnNwZWN0LmlzYnVpbHRpbiwgaW5zcGVjdC5pc2NsYXNzLCBpbnNwZWN0LmlzY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnNwZWN0LmlzZnJhbWUsIGluc3BlY3QuaXNmdW5jdGlvbiwgaW5zcGVjdC5pc21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnNwZWN0LmlzbW9kdWxlLCBpbnNwZWN0LmlzdHJhY2ViYWNrLAorICAgICAgICAgICAgICAgICAgICAgIGluc3BlY3QuaXNnZW5lcmF0b3IsIGluc3BlY3QuaXNnZW5lcmF0b3JmdW5jdGlvbl0pCisKKyAgICBkZWYgaXN0ZXN0KHNlbGYsIHByZWRpY2F0ZSwgZXhwKToKKyAgICAgICAgb2JqID0gZXZhbChleHApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcmVkaWNhdGUob2JqKSwgJyVzKCVzKScgJSAocHJlZGljYXRlLl9fbmFtZV9fLCBleHApKQorCisgICAgICAgIGZvciBvdGhlciBpbiBzZWxmLnByZWRpY2F0ZXMgLSBzZXQoW3ByZWRpY2F0ZV0pOgorICAgICAgICAgICAgaWYgcHJlZGljYXRlID09IGluc3BlY3QuaXNnZW5lcmF0b3JmdW5jdGlvbiBhbmRcCisgICAgICAgICAgICAgICBvdGhlciA9PSBpbnNwZWN0LmlzZnVuY3Rpb246CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3RoZXIob2JqKSwgJ25vdCAlcyglcyknICUgKG90aGVyLl9fbmFtZV9fLCBleHApKQorCitkZWYgZ2VuZXJhdG9yX2Z1bmN0aW9uX2V4YW1wbGUoc2VsZik6CisgICAgZm9yIGkgaW4geHJhbmdlKDIpOgorICAgICAgICB5aWVsZCBpCisKK2NsYXNzIFRlc3RQcmVkaWNhdGVzKElzVGVzdEJhc2UpOgorICAgIGRlZiB0ZXN0X3NpeHRlZW4oc2VsZik6CisgICAgICAgIGNvdW50ID0gbGVuKGZpbHRlcihsYW1iZGEgeDp4LnN0YXJ0c3dpdGgoJ2lzJyksIGRpcihpbnNwZWN0KSkpCisgICAgICAgICMgVGhpcyB0ZXN0IGlzIGhlcmUgZm9yIHJlbWVtYmVyIHlvdSB0byB1cGRhdGUgRG9jL2xpYnJhcnkvaW5zcGVjdC5yc3QKKyAgICAgICAgIyB3aGljaCBjbGFpbXMgdGhlcmUgYXJlIDE2IHN1Y2ggZnVuY3Rpb25zCisgICAgICAgIGV4cGVjdGVkID0gMTYKKyAgICAgICAgZXJyX21zZyA9ICJUaGVyZSBhcmUgJWQgKG5vdCAlZCkgaXMqIGZ1bmN0aW9ucyIgJSAoY291bnQsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBleHBlY3RlZCwgZXJyX21zZykKKworCisgICAgZGVmIHRlc3RfZXhjbHVkaW5nX3ByZWRpY2F0ZXMoc2VsZik6CisgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNidWlsdGluLCAnc3lzLmV4aXQnKQorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzYnVpbHRpbiwgJ1tdLmFwcGVuZCcpCisgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNjb2RlLCAnbW9kLnNwYW0uZnVuY19jb2RlJykKKyAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2ZyYW1lLCAndGIudGJfZnJhbWUnKQorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzZnVuY3Rpb24sICdtb2Quc3BhbScpCisgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNtZXRob2QsICdtb2QuU3R1cGlkR2l0LmFidXNlJykKKyAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc21ldGhvZCwgJ2dpdC5hcmd1ZScpCisgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNtb2R1bGUsICdtb2QnKQorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzdHJhY2ViYWNrLCAndGInKQorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzZGF0YWRlc2NyaXB0b3IsICdfX2J1aWx0aW5fXy5maWxlLmNsb3NlZCcpCisgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNkYXRhZGVzY3JpcHRvciwgJ19fYnVpbHRpbl9fLmZpbGUuc29mdHNwYWNlJykKKyAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2dlbmVyYXRvciwgJyh4IGZvciB4IGluIHhyYW5nZSgyKSknKQorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzZ2VuZXJhdG9yZnVuY3Rpb24sICdnZW5lcmF0b3JfZnVuY3Rpb25fZXhhbXBsZScpCisgICAgICAgIGlmIGhhc2F0dHIodHlwZXMsICdHZXRTZXREZXNjcmlwdG9yVHlwZScpOgorICAgICAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2dldHNldGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSh0Yi50Yl9mcmFtZSkuZl9sb2NhbHMnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbnNwZWN0LmlzZ2V0c2V0ZGVzY3JpcHRvcih0eXBlKHRiLnRiX2ZyYW1lKS5mX2xvY2FscykpCisgICAgICAgIGlmIGhhc2F0dHIodHlwZXMsICdNZW1iZXJEZXNjcmlwdG9yVHlwZScpOgorICAgICAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc21lbWJlcmRlc2NyaXB0b3IsICdkYXRldGltZS50aW1lZGVsdGEuZGF5cycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluc3BlY3QuaXNtZW1iZXJkZXNjcmlwdG9yKGRhdGV0aW1lLnRpbWVkZWx0YS5kYXlzKSkKKworICAgIGRlZiB0ZXN0X2lzcm91dGluZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluc3BlY3QuaXNyb3V0aW5lKG1vZC5zcGFtKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluc3BlY3QuaXNyb3V0aW5lKFtdLmNvdW50KSkKKworICAgIGRlZiB0ZXN0X2lzY2xhc3Moc2VsZik6CisgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNjbGFzcywgJ21vZC5TdHVwaWRHaXQnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5zcGVjdC5pc2NsYXNzKGxpc3QpKQorCisgICAgICAgIGNsYXNzIG5ld3N0eWxlKG9iamVjdCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluc3BlY3QuaXNjbGFzcyhuZXdzdHlsZSkpCisKKyAgICAgICAgY2xhc3MgQ3VzdG9tR2V0YXR0cihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5zcGVjdC5pc2NsYXNzKEN1c3RvbUdldGF0dHIoKSkpCisKKyAgICBkZWYgdGVzdF9nZXRfc2xvdF9tZW1iZXJzKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSAoImEiLCAiYiIpCisKKyAgICAgICAgeCA9IEMoKQorICAgICAgICB4LmEgPSA0MgorICAgICAgICBtZW1iZXJzID0gZGljdChpbnNwZWN0LmdldG1lbWJlcnMoeCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCBtZW1iZXJzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdiJywgbWVtYmVycykKKworICAgIGRlZiB0ZXN0X2lzYWJzdHJhY3Qoc2VsZik6CisgICAgICAgIGZyb20gYWJjIGltcG9ydCBBQkNNZXRhLCBhYnN0cmFjdG1ldGhvZAorCisgICAgICAgIGNsYXNzIEFic3RyYWN0Q2xhc3NFeGFtcGxlKG9iamVjdCk6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gQUJDTWV0YQorCisgICAgICAgICAgICBAYWJzdHJhY3RtZXRob2QKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIENsYXNzRXhhbXBsZShBYnN0cmFjdENsYXNzRXhhbXBsZSk6CisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBhID0gQ2xhc3NFeGFtcGxlKCkKKworICAgICAgICAjIFRlc3QgZ2VuZXJhbCBiZWhhdmlvdXIuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnNwZWN0LmlzYWJzdHJhY3QoQWJzdHJhY3RDbGFzc0V4YW1wbGUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluc3BlY3QuaXNhYnN0cmFjdChDbGFzc0V4YW1wbGUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluc3BlY3QuaXNhYnN0cmFjdChhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbnNwZWN0LmlzYWJzdHJhY3QoaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbnNwZWN0LmlzYWJzdHJhY3QoNSkpCisKKworY2xhc3MgVGVzdEludGVycHJldGVyU3RhY2soSXNUZXN0QmFzZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKKworICAgICAgICBnaXQuYWJ1c2UoNywgOCwgOSkKKworICAgIGRlZiB0ZXN0X2FidXNlX2RvbmUoc2VsZik6CisgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXN0cmFjZWJhY2ssICdnaXQuZXhbMl0nKQorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzZnJhbWUsICdtb2QuZnInKQorCisgICAgZGVmIHRlc3Rfc3RhY2soc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obW9kLnN0KSA+PSA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5zdFswXVsxOl0sCisgICAgICAgICAgICAgKG1vZGZpbGUsIDE2LCAnZWdncycsIFsnICAgIHN0ID0gaW5zcGVjdC5zdGFjaygpXG4nXSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLnN0WzFdWzE6XSwKKyAgICAgICAgICAgICAobW9kZmlsZSwgOSwgJ3NwYW0nLCBbJyAgICBlZ2dzKGIgKyBkLCBjICsgZilcbiddLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2Quc3RbMl1bMTpdLAorICAgICAgICAgICAgIChtb2RmaWxlLCA0MywgJ2FyZ3VlJywgWycgICAgICAgICAgICBzcGFtKGEsIGIsIGMpXG4nXSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLnN0WzNdWzE6XSwKKyAgICAgICAgICAgICAobW9kZmlsZSwgMzksICdhYnVzZScsIFsnICAgICAgICBzZWxmLmFyZ3VlKGEsIGIsIGMpXG4nXSwgMCkpCisKKyAgICBkZWYgdGVzdF90cmFjZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ2l0LnRyKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnaXQudHJbMF1bMTpdLCAobW9kZmlsZSwgNDMsICdhcmd1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnICAgICAgICAgICAgc3BhbShhLCBiLCBjKVxuJ10sIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdpdC50clsxXVsxOl0sIChtb2RmaWxlLCA5LCAnc3BhbScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnICAgIGVnZ3MoYiArIGQsIGMgKyBmKVxuJ10sIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdpdC50clsyXVsxOl0sIChtb2RmaWxlLCAxOCwgJ2VnZ3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJyAgICBxID0geSAvLyAwXG4nXSwgMCkpCisKKyAgICBkZWYgdGVzdF9mcmFtZShzZWxmKToKKyAgICAgICAgYXJncywgdmFyYXJncywgdmFya3csIGxvY2FscyA9IGluc3BlY3QuZ2V0YXJndmFsdWVzKG1vZC5mcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbJ3gnLCAneSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhcmFyZ3MsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFya3csIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWxzLCB7J3gnOiAxMSwgJ3AnOiAxMSwgJ3knOiAxNH0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5mb3JtYXRhcmd2YWx1ZXMoYXJncywgdmFyYXJncywgdmFya3csIGxvY2FscyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJyh4PTExLCB5PTE0KScpCisKKyAgICBkZWYgdGVzdF9wcmV2aW91c19mcmFtZShzZWxmKToKKyAgICAgICAgYXJncywgdmFyYXJncywgdmFya3csIGxvY2FscyA9IGluc3BlY3QuZ2V0YXJndmFsdWVzKG1vZC5mci5mX2JhY2spCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgWydhJywgJ2InLCAnYycsICdkJywgWydlJywgWydmJ11dXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXJhcmdzLCAnZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFya3csICdoJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmZvcm1hdGFyZ3ZhbHVlcyhhcmdzLCB2YXJhcmdzLCB2YXJrdywgbG9jYWxzKSwKKyAgICAgICAgICAgICAnKGE9NywgYj04LCBjPTksIGQ9MywgKGU9NCwgKGY9NSwpKSwgKmc9KCksICoqaD17fSknKQorCitjbGFzcyBHZXRTb3VyY2VCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZS4KKyAgICBmb2RkZXJGaWxlID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKKworICAgICAgICB3aXRoIG9wZW4oaW5zcGVjdC5nZXRzb3VyY2VmaWxlKHNlbGYuZm9kZGVyRmlsZSkpIGFzIGZwOgorICAgICAgICAgICAgc2VsZi5zb3VyY2UgPSBmcC5yZWFkKCkKKworICAgIGRlZiBzb3VyY2VyYW5nZShzZWxmLCB0b3AsIGJvdHRvbSk6CisgICAgICAgIGxpbmVzID0gc2VsZi5zb3VyY2Uuc3BsaXQoIlxuIikKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihsaW5lc1t0b3AtMTpib3R0b21dKSArICJcbiIKKworICAgIGRlZiBhc3NlcnRTb3VyY2VFcXVhbChzZWxmLCBvYmosIHRvcCwgYm90dG9tKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldHNvdXJjZShvYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc291cmNlcmFuZ2UodG9wLCBib3R0b20pKQorCitjbGFzcyBUZXN0UmV0cmlldmluZ1NvdXJjZUNvZGUoR2V0U291cmNlQmFzZSk6CisgICAgZm9kZGVyRmlsZSA9IG1vZAorCisgICAgZGVmIHRlc3RfZ2V0Y2xhc3NlcyhzZWxmKToKKyAgICAgICAgY2xhc3NlcyA9IGluc3BlY3QuZ2V0bWVtYmVycyhtb2QsIGluc3BlY3QuaXNjbGFzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ0Zlc3RlcmluZ0dvYicsIG1vZC5GZXN0ZXJpbmdHb2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJ01hbG9kb3JvdXNQZXJ2ZXJ0JywgbW9kLk1hbG9kb3JvdXNQZXJ2ZXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCdQYXJyb3REcm9wcGluZ3MnLCBtb2QuUGFycm90RHJvcHBpbmdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCdTdHVwaWRHaXQnLCBtb2QuU3R1cGlkR2l0KV0pCisgICAgICAgIHRyZWUgPSBpbnNwZWN0LmdldGNsYXNzdHJlZShbY2xzWzFdIGZvciBjbHMgaW4gY2xhc3Nlc10sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKG1vZC5QYXJyb3REcm9wcGluZ3MsICgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vZC5TdHVwaWRHaXQsICgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWyhtb2QuTWFsb2Rvcm91c1BlcnZlcnQsIChtb2QuU3R1cGlkR2l0LCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhtb2QuRmVzdGVyaW5nR29iLCAobW9kLk1hbG9kb3JvdXNQZXJ2ZXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLlBhcnJvdERyb3BwaW5ncykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZ2V0ZnVuY3Rpb25zKHNlbGYpOgorICAgICAgICBmdW5jdGlvbnMgPSBpbnNwZWN0LmdldG1lbWJlcnMobW9kLCBpbnNwZWN0LmlzZnVuY3Rpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuY3Rpb25zLCBbKCdlZ2dzJywgbW9kLmVnZ3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnc3BhbScsIG1vZC5zcGFtKV0pCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF9nZXRkb2Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRkb2MobW9kKSwgJ0EgbW9kdWxlIGRvY3N0cmluZy4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0ZG9jKG1vZC5TdHVwaWRHaXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdBIGxvbmdlcixcblxuaW5kZW50ZWRcblxuZG9jc3RyaW5nLicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRkb2MoZ2l0LmFidXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnQW5vdGhlclxuXG5kb2NzdHJpbmdcblxuY29udGFpbmluZ1xuXG50YWJzJykKKworICAgIGRlZiB0ZXN0X2NsZWFuZG9jKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuY2xlYW5kb2MoJ0FuXG4gICAgaW5kZW50ZWRcbiAgICBkb2NzdHJpbmcuJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ0FuXG5pbmRlbnRlZFxuZG9jc3RyaW5nLicpCisKKyAgICBkZWYgdGVzdF9nZXRjb21tZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldGNvbW1lbnRzKG1vZCksICcjIGxpbmUgMVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldGNvbW1lbnRzKG1vZC5TdHVwaWRHaXQpLCAnIyBsaW5lIDIwXG4nKQorCisgICAgZGVmIHRlc3RfZ2V0bW9kdWxlKHNlbGYpOgorICAgICAgICAjIENoZWNrIGFjdHVhbCBtb2R1bGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldG1vZHVsZShtb2QpLCBtb2QpCisgICAgICAgICMgQ2hlY2sgY2xhc3MgKHVzZXMgX19tb2R1bGVfXyBhdHRyaWJ1dGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRtb2R1bGUobW9kLlN0dXBpZEdpdCksIG1vZCkKKyAgICAgICAgIyBDaGVjayBhIG1ldGhvZCAobm8gX19tb2R1bGVfXyBhdHRyaWJ1dGUsIGZhbGxzIGJhY2sgdG8gZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRtb2R1bGUobW9kLlN0dXBpZEdpdC5hYnVzZSksIG1vZCkKKyAgICAgICAgIyBEbyBpdCBhZ2FpbiAoY2hlY2sgdGhlIGNhY2hpbmcgaXNuJ3QgYnJva2VuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0bW9kdWxlKG1vZC5TdHVwaWRHaXQuYWJ1c2UpLCBtb2QpCisgICAgICAgICMgQ2hlY2sgYSBidWlsdGluCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRtb2R1bGUoc3RyKSwgc3lzLm1vZHVsZXNbIl9fYnVpbHRpbl9fIl0pCisgICAgICAgICMgQ2hlY2sgZmlsZW5hbWUgb3ZlcnJpZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldG1vZHVsZShOb25lLCBtb2RmaWxlKSwgbW9kKQorCisgICAgZGVmIHRlc3RfZ2V0c291cmNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKGdpdC5hYnVzZSwgMjksIDM5KQorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZC5TdHVwaWRHaXQsIDIxLCA0NikKKworICAgIGRlZiB0ZXN0X2dldHNvdXJjZWZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRzb3VyY2VmaWxlKG1vZC5zcGFtKSwgbW9kZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldHNvdXJjZWZpbGUoZ2l0LmFidXNlKSwgbW9kZmlsZSkKKyAgICAgICAgZm4gPSAiX25vbl9leGlzdGluZ19maWxlbmFtZV91c2VkX2Zvcl9zb3VyY2VmaWxlX3Rlc3QucHkiCisgICAgICAgIGNvID0gY29tcGlsZSgiTm9uZSIsIGZuLCAiZXhlYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRzb3VyY2VmaWxlKGNvKSwgTm9uZSkKKyAgICAgICAgbGluZWNhY2hlLmNhY2hlW2NvLmNvX2ZpbGVuYW1lXSA9ICgxLCBOb25lLCAiTm9uZSIsIGNvLmNvX2ZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0c291cmNlZmlsZShjbyksIGZuKQorCisgICAgZGVmIHRlc3RfZ2V0ZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldGZpbGUobW9kLlN0dXBpZEdpdCksIG1vZC5fX2ZpbGVfXykKKworICAgIGRlZiB0ZXN0X2dldG1vZHVsZV9yZWN1cnNpb24oc2VsZik6CisgICAgICAgIGZyb20gdHlwZXMgaW1wb3J0IE1vZHVsZVR5cGUKKyAgICAgICAgbmFtZSA9ICdfX2luc3BlY3RfZHVtbXknCisgICAgICAgIG0gPSBzeXMubW9kdWxlc1tuYW1lXSA9IE1vZHVsZVR5cGUobmFtZSkKKyAgICAgICAgbS5fX2ZpbGVfXyA9ICI8c3RyaW5nPiIgIyBob3BlZnVsbHkgbm90IGEgcmVhbCBmaWxlbmFtZS4uLgorICAgICAgICBtLl9fbG9hZGVyX18gPSAiZHVtbXkiICAjIHByZXRlbmQgdGhlIGZpbGVuYW1lIGlzIHVuZGVyc3Rvb2QgYnkgYSBsb2FkZXIKKyAgICAgICAgZXhlYyAiZGVmIHgoKTogcGFzcyIgaW4gbS5fX2RpY3RfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0c291cmNlZmlsZShtLnguZnVuY19jb2RlKSwgJzxzdHJpbmc+JykKKyAgICAgICAgZGVsIHN5cy5tb2R1bGVzW25hbWVdCisgICAgICAgIGluc3BlY3QuZ2V0bW9kdWxlKGNvbXBpbGUoJ2E9MTAnLCcnLCdzaW5nbGUnKSkKKworICAgIGRlZiB0ZXN0X3Byb2NlZWRfd2l0aF9mYWtlX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICAnJydkb2N0ZXN0IG1vbmtleXBhdGNoZXMgbGluZWNhY2hlIHRvIGVuYWJsZSBpbnNwZWN0aW9uJycnCisgICAgICAgIGZuLCBzb3VyY2UgPSAnPHRlc3Q+JywgJ2RlZiB4KCk6IHBhc3NcbicKKyAgICAgICAgZ2V0bGluZXMgPSBsaW5lY2FjaGUuZ2V0bGluZXMKKyAgICAgICAgZGVmIG1vbmtleShmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHM9Tm9uZSk6CisgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSBmbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLnNwbGl0bGluZXMoVHJ1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldGxpbmVzKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscykKKyAgICAgICAgbGluZWNhY2hlLmdldGxpbmVzID0gbW9ua2V5CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5zID0ge30KKyAgICAgICAgICAgIGV4ZWMgY29tcGlsZShzb3VyY2UsIGZuLCAnc2luZ2xlJykgaW4gbnMKKyAgICAgICAgICAgIGluc3BlY3QuZ2V0c291cmNlKG5zWyJ4Il0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBsaW5lY2FjaGUuZ2V0bGluZXMgPSBnZXRsaW5lcworCitjbGFzcyBUZXN0RGVjb3JhdG9ycyhHZXRTb3VyY2VCYXNlKToKKyAgICBmb2RkZXJGaWxlID0gbW9kMgorCisgICAgZGVmIHRlc3Rfd3JhcHBlZF9kZWNvcmF0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwobW9kMi53cmFwcGVkLCAxNCwgMTcpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNpbmdfZGVjb3JhdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZDIuZ29uZSwgOSwgMTApCisKK2NsYXNzIFRlc3RPbmVsaW5lcnMoR2V0U291cmNlQmFzZSk6CisgICAgZm9kZGVyRmlsZSA9IG1vZDIKKyAgICBkZWYgdGVzdF9vbmVsaW5lX2xhbWJkYShzZWxmKToKKyAgICAgICAgIyBUZXN0IGluc3BlY3QuZ2V0c291cmNlIHdpdGggYSBvbmUtbGluZSBsYW1iZGEgZnVuY3Rpb24uCisgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwobW9kMi5vbGwsIDI1LCAyNSkKKworICAgIGRlZiB0ZXN0X3RocmVlbGluZV9sYW1iZGEoc2VsZik6CisgICAgICAgICMgVGVzdCBpbnNwZWN0LmdldHNvdXJjZSB3aXRoIGEgdGhyZWUtbGluZSBsYW1iZGEgZnVuY3Rpb24sCisgICAgICAgICMgd2hlcmUgdGhlIHNlY29uZCBhbmQgdGhpcmQgbGluZXMgYXJlIF9ub3RfIGluZGVudGVkLgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZDIudGxsLCAyOCwgMzApCisKKyAgICBkZWYgdGVzdF90d29saW5lX2luZGVudGVkX2xhbWJkYShzZWxmKToKKyAgICAgICAgIyBUZXN0IGluc3BlY3QuZ2V0c291cmNlIHdpdGggYSB0d28tbGluZSBsYW1iZGEgZnVuY3Rpb24sCisgICAgICAgICMgd2hlcmUgdGhlIHNlY29uZCBsaW5lIF9pc18gaW5kZW50ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwobW9kMi50bGxpLCAzMywgMzQpCisKKyAgICBkZWYgdGVzdF9vbmVsaW5lZnVuYyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGluc3BlY3QuZ2V0c291cmNlIHdpdGggYSByZWd1bGFyIG9uZS1saW5lIGZ1bmN0aW9uLgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZDIub25lbGluZWZ1bmMsIDM3LCAzNykKKworICAgIGRlZiB0ZXN0X21hbnlhcmdzKHNlbGYpOgorICAgICAgICAjIFRlc3QgaW5zcGVjdC5nZXRzb3VyY2Ugd2l0aCBhIHJlZ3VsYXIgZnVuY3Rpb24gd2hlcmUKKyAgICAgICAgIyB0aGUgYXJndW1lbnRzIGFyZSBvbiB0d28gbGluZXMgYW5kIF9ub3RfIGluZGVudGVkIGFuZAorICAgICAgICAjIHRoZSBib2R5IG9uIHRoZSBzZWNvbmQgbGluZSB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cy4KKyAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChtb2QyLm1hbnlhcmdzLCA0MCwgNDEpCisKKyAgICBkZWYgdGVzdF90d29saW5lZnVuYyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGluc3BlY3QuZ2V0c291cmNlIHdpdGggYSByZWd1bGFyIGZ1bmN0aW9uIHdoZXJlCisgICAgICAgICMgdGhlIGJvZHkgaXMgb24gdHdvIGxpbmVzLCBmb2xsb3dpbmcgdGhlIGFyZ3VtZW50IGxpc3QgYW5kCisgICAgICAgICMgY29udGludWVkIG9uIHRoZSBuZXh0IGxpbmUgYnkgYSBcXC4KKyAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChtb2QyLnR3b2xpbmVmdW5jLCA0NCwgNDUpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfaW5fbGlzdChzZWxmKToKKyAgICAgICAgIyBUZXN0IGluc3BlY3QuZ2V0c291cmNlIHdpdGggYSBvbmUtbGluZSBsYW1iZGEgZnVuY3Rpb24KKyAgICAgICAgIyBkZWZpbmVkIGluIGEgbGlzdCwgaW5kZW50ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwobW9kMi5hWzFdLCA0OSwgNDkpCisKKyAgICBkZWYgdGVzdF9hbm9ueW1vdXMoc2VsZik6CisgICAgICAgICMgVGVzdCBpbnNwZWN0LmdldHNvdXJjZSB3aXRoIGEgbGFtYmRhIGZ1bmN0aW9uIGRlZmluZWQKKyAgICAgICAgIyBhcyBhcmd1bWVudCB0byBhbm90aGVyIGZ1bmN0aW9uLgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZDIuYW5vbnltb3VzLCA1NSwgNTUpCisKK2NsYXNzIFRlc3RCdWdneUNhc2VzKEdldFNvdXJjZUJhc2UpOgorICAgIGZvZGRlckZpbGUgPSBtb2QyCisKKyAgICBkZWYgdGVzdF93aXRoX2NvbW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwobW9kMi53aXRoX2NvbW1lbnQsIDU4LCA1OSkKKworICAgIGRlZiB0ZXN0X211bHRpbGluZV9zaWcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwobW9kMi5tdWx0aWxpbmVfc2lnWzBdLCA2MywgNjQpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfY2xhc3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwobW9kMi5mdW5jNjkoKS5mdW5jNzEsIDcxLCA3MikKKworICAgIGRlZiB0ZXN0X29uZV9saW5lcl9mb2xsb3dlZF9ieV9ub25fbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChtb2QyLmZ1bmM3NywgNzcsIDc3KQorCisgICAgZGVmIHRlc3Rfb25lX2xpbmVyX2RlZGVudF9ub25fbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChtb2QyLmNsczgyLmZ1bmM4MywgODMsIDgzKQorCisgICAgZGVmIHRlc3Rfd2l0aF9jb21tZW50X2luc3RlYWRfb2ZfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZDIuZnVuYzg4LCA4OCwgOTApCisKKyAgICBkZWYgdGVzdF9tZXRob2RfaW5fZHluYW1pY19jbGFzcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChtb2QyLm1ldGhvZF9pbl9keW5hbWljX2NsYXNzLCA5NSwgOTcpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKAorICAgICAgICBub3QgaGFzYXR0cih1bmljb2RlZGF0YSwgJ19fZmlsZV9fJykgb3IKKyAgICAgICAgICAgIHVuaWNvZGVkYXRhLl9fZmlsZV9fWy00Ol0gaW4gKCIucHljIiwgIi5weW8iKSwKKyAgICAgICAgInVuaWNvZGVkYXRhIGlzIG5vdCBhbiBleHRlcm5hbCBiaW5hcnkgbW9kdWxlIikKKyAgICBkZWYgdGVzdF9maW5kc291cmNlX2JpbmFyeShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgaW5zcGVjdC5nZXRzb3VyY2UsIHVuaWNvZGVkYXRhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBpbnNwZWN0LmZpbmRzb3VyY2UsIHVuaWNvZGVkYXRhKQorCisgICAgZGVmIHRlc3RfZmluZHNvdXJjZV9jb2RlX2luX2xpbmVjYWNoZShzZWxmKToKKyAgICAgICAgbGluZXMgPSBbIng9MSJdCisgICAgICAgIGNvID0gY29tcGlsZShsaW5lc1swXSwgIl9keW5hbWljYWxseV9jcmVhdGVkX2ZpbGUiLCAiZXhlYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGluc3BlY3QuZmluZHNvdXJjZSwgY28pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGluc3BlY3QuZ2V0c291cmNlLCBjbykKKyAgICAgICAgbGluZWNhY2hlLmNhY2hlW2NvLmNvX2ZpbGVuYW1lXSA9ICgxLCBOb25lLCBsaW5lcywgY28uY29fZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5maW5kc291cmNlKGNvKSwgKGxpbmVzLDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0c291cmNlKGNvKSwgbGluZXNbMF0pCisKKyAgICBkZWYgdGVzdF9maW5kc291cmNlX3dpdGhvdXRfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGZvciBmbmFtZSBpbiBbJycsICc8c3RyaW5nPiddOgorICAgICAgICAgICAgY28gPSBjb21waWxlKCd4PTEnLCBmbmFtZSwgImV4ZWMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgaW5zcGVjdC5maW5kc291cmNlLCBjbykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGluc3BlY3QuZ2V0c291cmNlLCBjbykKKworCitjbGFzcyBfQnJva2VuRGF0YURlc2NyaXB0b3Iob2JqZWN0KToKKyAgICAiIiIKKyAgICBBIGJyb2tlbiBkYXRhIGRlc2NyaXB0b3IuIFNlZSBidWcgIzE3ODUuCisgICAgIiIiCisgICAgZGVmIF9fZ2V0X18oKmFyZ3MpOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigic2hvdWxkIG5vdCBfX2dldF9fIGRhdGEgZGVzY3JpcHRvcnMiKQorCisgICAgZGVmIF9fc2V0X18oKmFyZ3MpOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKworICAgIGRlZiBfX2dldGF0dHJfXygqYXJncyk6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJzaG91bGQgbm90IF9fZ2V0YXR0cl9fIGRhdGEgZGVzY3JpcHRvcnMiKQorCisKK2NsYXNzIF9Ccm9rZW5NZXRob2REZXNjcmlwdG9yKG9iamVjdCk6CisgICAgIiIiCisgICAgQSBicm9rZW4gbWV0aG9kIGRlc2NyaXB0b3IuIFNlZSBidWcgIzE3ODUuCisgICAgIiIiCisgICAgZGVmIF9fZ2V0X18oKmFyZ3MpOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigic2hvdWxkIG5vdCBfX2dldF9fIG1ldGhvZCBkZXNjcmlwdG9ycyIpCisKKyAgICBkZWYgX19nZXRhdHRyX18oKmFyZ3MpOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigic2hvdWxkIG5vdCBfX2dldGF0dHJfXyBtZXRob2QgZGVzY3JpcHRvcnMiKQorCisKKyMgSGVscGVyIGZvciB0ZXN0aW5nIGNsYXNzaWZ5X2NsYXNzX2F0dHJzLgorZGVmIGF0dHJzX3dvX29ianMoY2xzKToKKyAgICByZXR1cm4gW3RbOjNdIGZvciB0IGluIGluc3BlY3QuY2xhc3NpZnlfY2xhc3NfYXR0cnMoY2xzKV0KKworCitjbGFzcyBUZXN0Q2xhc3Nlc0FuZEZ1bmN0aW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY2xhc3NpY19tcm8oc2VsZik6CisgICAgICAgICMgVGVzdCBjbGFzc2ljLWNsYXNzIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyLgorICAgICAgICBjbGFzcyBBOiAgICBwYXNzCisgICAgICAgIGNsYXNzIEIoQSk6IHBhc3MKKyAgICAgICAgY2xhc3MgQyhBKTogcGFzcworICAgICAgICBjbGFzcyBEKEIsIEMpOiBwYXNzCisKKyAgICAgICAgZXhwZWN0ZWQgPSAoRCwgQiwgQSwgQykKKyAgICAgICAgZ290ID0gaW5zcGVjdC5nZXRtcm8oRCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorCisgICAgZGVmIHRlc3RfbmV3c3R5bGVfbXJvKHNlbGYpOgorICAgICAgICAjIFRoZSBzYW1lIHcvIG5ldy1jbGFzcyBNUk8uCisgICAgICAgIGNsYXNzIEEob2JqZWN0KTogICAgcGFzcworICAgICAgICBjbGFzcyBCKEEpOiBwYXNzCisgICAgICAgIGNsYXNzIEMoQSk6IHBhc3MKKyAgICAgICAgY2xhc3MgRChCLCBDKTogcGFzcworCisgICAgICAgIGV4cGVjdGVkID0gKEQsIEIsIEMsIEEsIG9iamVjdCkKKyAgICAgICAgZ290ID0gaW5zcGVjdC5nZXRtcm8oRCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorCisgICAgZGVmIGFzc2VydEFyZ1NwZWNFcXVhbHMoc2VsZiwgcm91dGluZSwgYXJnc19lLCB2YXJhcmdzX2UgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmt3X2UgPSBOb25lLCBkZWZhdWx0c19lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQgPSBOb25lKToKKyAgICAgICAgYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzID0gaW5zcGVjdC5nZXRhcmdzcGVjKHJvdXRpbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgYXJnc19lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhcmFyZ3MsIHZhcmFyZ3NfZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXJrdywgdmFya3dfZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWZhdWx0cywgZGVmYXVsdHNfZSkKKyAgICAgICAgaWYgZm9ybWF0dGVkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmZvcm1hdGFyZ3NwZWMoYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkKQorCisgICAgZGVmIHRlc3RfZ2V0YXJnc3BlYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBcmdTcGVjRXF1YWxzKG1vZC5lZ2dzLCBbJ3gnLCAneSddLCBmb3JtYXR0ZWQgPSAnKHgsIHkpJykKKworICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMobW9kLnNwYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLCAnYicsICdjJywgJ2QnLCBbJ2UnLCBbJ2YnXV1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2cnLCAnaCcsICgzLCAoNCwgKDUsKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhhLCBiLCBjLCBkPTMsIChlLCAoZiwpKT0oNCwgKDUsKSksICpnLCAqKmgpJykKKworICAgIGRlZiB0ZXN0X2dldGFyZ3NwZWNfbWV0aG9kKHNlbGYpOgorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgbShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscyhBLm0sIFsnc2VsZiddKQorCisgICAgZGVmIHRlc3RfZ2V0YXJnc3BlY19zdWJsaXN0b2ZvbmUoc2VsZik6CisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICAgICAoInR1cGxlIHBhcmFtZXRlciB1bnBhY2tpbmcgaGFzIGJlZW4gcmVtb3ZlZCIsIFN5bnRheFdhcm5pbmcpLAorICAgICAgICAgICAgICAgICgicGFyZW50aGVzaXplZCBhcmd1bWVudCBuYW1lcyBhcmUgaW52YWxpZCIsIFN5bnRheFdhcm5pbmcpKToKKyAgICAgICAgICAgIGV4ZWMgJ2RlZiBzdWJsaXN0T2ZPbmUoKGZvbywpKTogcmV0dXJuIDEnCisgICAgICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoc3VibGlzdE9mT25lLCBbWydmb28nXV0pCisKKyAgICAgICAgICAgIGV4ZWMgJ2RlZiBmYWtlU3VibGlzdE9mT25lKChmb28pKTogcmV0dXJuIDEnCisgICAgICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoZmFrZVN1Ymxpc3RPZk9uZSwgWydmb28nXSkKKworCisgICAgZGVmIF9jbGFzc2lmeV90ZXN0KHNlbGYsIG5ld3N0eWxlKToKKyAgICAgICAgIiIiSGVscGVyIGZvciB0ZXN0aW5nIHRoYXQgY2xhc3NpZnlfY2xhc3NfYXR0cnMgZmluZHMgYSBidW5jaCBvZgorICAgICAgICBkaWZmZXJlbnQga2luZHMgb2YgYXR0cmlidXRlcyBvbiBhIGdpdmVuIGNsYXNzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbmV3c3R5bGU6CisgICAgICAgICAgICBiYXNlID0gb2JqZWN0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbGFzcyBiYXNlOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBBKGJhc2UpOgorICAgICAgICAgICAgZGVmIHMoKTogcGFzcworICAgICAgICAgICAgcyA9IHN0YXRpY21ldGhvZChzKQorCisgICAgICAgICAgICBkZWYgYyhjbHMpOiBwYXNzCisgICAgICAgICAgICBjID0gY2xhc3NtZXRob2QoYykKKworICAgICAgICAgICAgZGVmIGdldHAoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIHAgPSBwcm9wZXJ0eShnZXRwKQorCisgICAgICAgICAgICBkZWYgbShzZWxmKTogcGFzcworCisgICAgICAgICAgICBkZWYgbTEoc2VsZik6IHBhc3MKKworICAgICAgICAgICAgZGF0YWJsb2IgPSAnMScKKworICAgICAgICAgICAgZGQgPSBfQnJva2VuRGF0YURlc2NyaXB0b3IoKQorICAgICAgICAgICAgbWQgPSBfQnJva2VuTWV0aG9kRGVzY3JpcHRvcigpCisKKyAgICAgICAgYXR0cnMgPSBhdHRyc193b19vYmpzKEEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdzJywgJ3N0YXRpYyBtZXRob2QnLCBBKSwgYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnYycsICdjbGFzcyBtZXRob2QnLCBBKSwgYXR0cnMsICdtaXNzaW5nIGNsYXNzIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdwJywgJ3Byb3BlcnR5JywgQSksIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdtJywgJ21ldGhvZCcsIEEpLCBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ20xJywgJ21ldGhvZCcsIEEpLCBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSwgYXR0cnMsICdtaXNzaW5nIGRhdGEnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnbWQnLCAnbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBtZXRob2QgZGVzY3JpcHRvcicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdkZCcsICdkYXRhJywgQSksIGF0dHJzLCAnbWlzc2luZyBkYXRhIGRlc2NyaXB0b3InKQorCisgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICBkZWYgbShzZWxmKTogcGFzcworCisgICAgICAgIGF0dHJzID0gYXR0cnNfd29fb2JqcyhCKQorICAgICAgICBzZWxmLmFzc2VydEluKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2MnLCAnY2xhc3MgbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBjbGFzcyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgncCcsICdwcm9wZXJ0eScsIEEpLCBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnbScsICdtZXRob2QnLCBCKSwgYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdtMScsICdtZXRob2QnLCBBKSwgYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdkYXRhYmxvYicsICdkYXRhJywgQSksIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ21kJywgJ21ldGhvZCcsIEEpLCBhdHRycywgJ21pc3NpbmcgbWV0aG9kIGRlc2NyaXB0b3InKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnZGQnLCAnZGF0YScsIEEpLCBhdHRycywgJ21pc3NpbmcgZGF0YSBkZXNjcmlwdG9yJykKKworCisgICAgICAgIGNsYXNzIEMoQSk6CisgICAgICAgICAgICBkZWYgbShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIGMoc2VsZik6IHBhc3MKKworICAgICAgICBhdHRycyA9IGF0dHJzX3dvX29ianMoQykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpLCBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdjJywgJ21ldGhvZCcsIEMpLCBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ3AnLCAncHJvcGVydHknLCBBKSwgYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ20nLCAnbWV0aG9kJywgQyksIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnbTEnLCAnbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpLCBhdHRycywgJ21pc3NpbmcgZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdtZCcsICdtZXRob2QnLCBBKSwgYXR0cnMsICdtaXNzaW5nIG1ldGhvZCBkZXNjcmlwdG9yJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2RkJywgJ2RhdGEnLCBBKSwgYXR0cnMsICdtaXNzaW5nIGRhdGEgZGVzY3JpcHRvcicpCisKKyAgICAgICAgY2xhc3MgRChCLCBDKToKKyAgICAgICAgICAgIGRlZiBtMShzZWxmKTogcGFzcworCisgICAgICAgIGF0dHJzID0gYXR0cnNfd29fb2JqcyhEKQorICAgICAgICBzZWxmLmFzc2VydEluKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKKyAgICAgICAgaWYgbmV3c3R5bGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCgnYycsICdtZXRob2QnLCBDKSwgYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCgnYycsICdjbGFzcyBtZXRob2QnLCBBKSwgYXR0cnMsICdtaXNzaW5nIGNsYXNzIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdwJywgJ3Byb3BlcnR5JywgQSksIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdtJywgJ21ldGhvZCcsIEIpLCBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ20xJywgJ21ldGhvZCcsIEQpLCBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSwgYXR0cnMsICdtaXNzaW5nIGRhdGEnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnbWQnLCAnbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBtZXRob2QgZGVzY3JpcHRvcicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdkZCcsICdkYXRhJywgQSksIGF0dHJzLCAnbWlzc2luZyBkYXRhIGRlc2NyaXB0b3InKQorCisKKyAgICBkZWYgdGVzdF9jbGFzc2lmeV9vbGRzdHlsZShzZWxmKToKKyAgICAgICAgIiIiY2xhc3NpZnlfY2xhc3NfYXR0cnMgZmluZHMgc3RhdGljIG1ldGhvZHMsIGNsYXNzIG1ldGhvZHMsCisgICAgICAgIHByb3BlcnRpZXMsIG5vcm1hbCBtZXRob2RzLCBhbmQgZGF0YSBhdHRyaWJ1dGVzIG9uIGFuIG9sZC1zdHlsZQorICAgICAgICBjbGFzcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NsYXNzaWZ5X3Rlc3QoRmFsc2UpCisKKworICAgIGRlZiB0ZXN0X2NsYXNzaWZ5X25ld3N0eWxlKHNlbGYpOgorICAgICAgICAiIiJKdXN0IGxpa2UgdGVzdF9jbGFzc2lmeV9vbGRzdHlsZSwgYnV0IGZvciBhIG5ldy1zdHlsZSBjbGFzcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NsYXNzaWZ5X3Rlc3QoVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2NsYXNzaWZ5X2J1aWx0aW5fdHlwZXMoc2VsZik6CisgICAgICAgICMgU2ltcGxlIHNhbml0eSBjaGVjayB0aGF0IGFsbCBidWlsdC1pbiB0eXBlcyBjYW4gaGF2ZSB0aGVpcgorICAgICAgICAjIGF0dHJpYnV0ZXMgY2xhc3NpZmllZC4KKyAgICAgICAgZm9yIG5hbWUgaW4gZGlyKF9fYnVpbHRpbl9fKToKKyAgICAgICAgICAgIGJ1aWx0aW4gPSBnZXRhdHRyKF9fYnVpbHRpbl9fLCBuYW1lKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShidWlsdGluLCB0eXBlKToKKyAgICAgICAgICAgICAgICBpbnNwZWN0LmNsYXNzaWZ5X2NsYXNzX2F0dHJzKGJ1aWx0aW4pCisKKyAgICBkZWYgdGVzdF9nZXRtZW1iZXJzX21ldGhvZChzZWxmKToKKyAgICAgICAgIyBPbGQtc3R5bGUgY2xhc3NlcworICAgICAgICBjbGFzcyBCOgorICAgICAgICAgICAgZGVmIGYoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdmJywgQi5mKSwgaW5zcGVjdC5nZXRtZW1iZXJzKEIpKQorICAgICAgICAjIGNvbnRyYXJ5IHRvIHNwZWMsIGlzbWV0aG9kKCkgaXMgYWxzbyBUcnVlIGZvciB1bmJvdW5kIG1ldGhvZHMKKyAgICAgICAgIyAoc2VlICMxNzg1KQorICAgICAgICBzZWxmLmFzc2VydEluKCgnZicsIEIuZiksIGluc3BlY3QuZ2V0bWVtYmVycyhCLCBpbnNwZWN0LmlzbWV0aG9kKSkKKyAgICAgICAgYiA9IEIoKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnZicsIGIuZiksIGluc3BlY3QuZ2V0bWVtYmVycyhiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2YnLCBiLmYpLCBpbnNwZWN0LmdldG1lbWJlcnMoYiwgaW5zcGVjdC5pc21ldGhvZCkpCisKKyAgICAgICAgIyBOZXctc3R5bGUgY2xhc3NlcworICAgICAgICBjbGFzcyBCKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZihzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2YnLCBCLmYpLCBpbnNwZWN0LmdldG1lbWJlcnMoQikpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdmJywgQi5mKSwgaW5zcGVjdC5nZXRtZW1iZXJzKEIsIGluc3BlY3QuaXNtZXRob2QpKQorICAgICAgICBiID0gQigpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdmJywgYi5mKSwgaW5zcGVjdC5nZXRtZW1iZXJzKGIpKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnZicsIGIuZiksIGluc3BlY3QuZ2V0bWVtYmVycyhiLCBpbnNwZWN0LmlzbWV0aG9kKSkKKworCitjbGFzcyBUZXN0R2V0Y2FsbGFyZ3NGdW5jdGlvbnModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyB0dXBsZSBwYXJhbWV0ZXJzIGFyZSBuYW1lZCAnLjEnLCAnLjInLCBldGMuCisgICAgaXNfdHVwbGVuYW1lID0gcmUuY29tcGlsZShyJ15cLlxkKyQnKS5tYXRjaAorCisgICAgZGVmIGFzc2VydEVxdWFsQ2FsbEFyZ3Moc2VsZiwgZnVuYywgY2FsbF9wYXJhbXNfc3RyaW5nLCBsb2NzPU5vbmUpOgorICAgICAgICBsb2NzID0gZGljdChsb2NzIG9yIHt9LCBmdW5jPWZ1bmMpCisgICAgICAgIHIxID0gZXZhbCgnZnVuYyglcyknICUgY2FsbF9wYXJhbXNfc3RyaW5nLCBOb25lLCBsb2NzKQorICAgICAgICByMiA9IGV2YWwoJ2luc3BlY3QuZ2V0Y2FsbGFyZ3MoZnVuYywgJXMpJyAlIGNhbGxfcGFyYW1zX3N0cmluZywgTm9uZSwKKyAgICAgICAgICAgICAgICAgIGxvY3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEsIHIyKQorCisgICAgZGVmIGFzc2VydEVxdWFsRXhjZXB0aW9uKHNlbGYsIGZ1bmMsIGNhbGxfcGFyYW1fc3RyaW5nLCBsb2NzPU5vbmUpOgorICAgICAgICBsb2NzID0gZGljdChsb2NzIG9yIHt9LCBmdW5jPWZ1bmMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV2YWwoJ2Z1bmMoJXMpJyAlIGNhbGxfcGFyYW1fc3RyaW5nLCBOb25lLCBsb2NzKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBleDE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ0V4Y2VwdGlvbiBub3QgcmFpc2VkJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXZhbCgnaW5zcGVjdC5nZXRjYWxsYXJncyhmdW5jLCAlcyknICUgY2FsbF9wYXJhbV9zdHJpbmcsIE5vbmUsCisgICAgICAgICAgICAgICAgIGxvY3MpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGV4MjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnRXhjZXB0aW9uIG5vdCByYWlzZWQnKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUoZXgxKSwgdHlwZShleDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihleDEpLCBzdHIoZXgyKSkKKworICAgIGRlZiBtYWtlQ2FsbGFibGUoc2VsZiwgc2lnbmF0dXJlKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGl0cyBsb2NhbHMoKSwgZXhjbHVkaW5nIHRoZQorICAgICAgICBhdXRvZ2VuZXJhdGVkICcuMScsICcuMicsIGV0Yy4gdHVwbGUgcGFyYW0gbmFtZXMgKGlmIGFueSkuIiIiCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgidHVwbGUgcGFyYW1ldGVyIHVucGFja2luZyBoYXMgYmVlbiByZW1vdmVkIiwgU3ludGF4V2FybmluZyksCisgICAgICAgICAgICBxdWlldD1UcnVlKToKKyAgICAgICAgICAgIGNvZGUgPSAoImxhbWJkYSAlczogZGljdChpIGZvciBpIGluIGxvY2FscygpLml0ZW1zKCkgIgorICAgICAgICAgICAgICAgICAgICAiaWYgbm90IGlzX3R1cGxlbmFtZShpWzBdKSkiKQorICAgICAgICAgICAgcmV0dXJuIGV2YWwoY29kZSAlIHNpZ25hdHVyZSwgeydpc190dXBsZW5hbWUnIDogc2VsZi5pc190dXBsZW5hbWV9KQorCisgICAgZGVmIHRlc3RfcGxhaW4oc2VsZik6CisgICAgICAgIGYgPSBzZWxmLm1ha2VDYWxsYWJsZSgnYSwgYj0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcyLCAzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdhPTInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ2I9MywgYT0yJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcyLCBiPTMnKQorICAgICAgICAjIGV4cGFuZCAqaXRlcmFibGUgLyAqKm1hcHBpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcqKDIsKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKlsyXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKigyLCAzKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKlsyLCAzXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKip7ImEiOjJ9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdiPTMsICoqeyJhIjoyfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgKip7ImIiOjN9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcqKnsiYiI6MywgImEiOjJ9JykKKyAgICAgICAgIyBleHBhbmQgVXNlckxpc3QgLyBVc2VyRGljdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJypVc2VyTGlzdChbMl0pJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcqVXNlckxpc3QoWzIsIDNdKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKipVc2VyRGljdChhPTIpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcyLCAqKlVzZXJEaWN0KGI9MyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ2I9MiwgKipVc2VyRGljdChhPTMpJykKKyAgICAgICAgIyB1bmljb2RlIGtleXdvcmQgYXJncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJyoqe3UiYSI6Mn0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ2I9MywgKip7dSJhIjoyfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgKip7dSJiIjozfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKip7dSJiIjozLCB1ImEiOjJ9JykKKworICAgIGRlZiB0ZXN0X3ZhcmFyZ3Moc2VsZik6CisgICAgICAgIGYgPSBzZWxmLm1ha2VDYWxsYWJsZSgnYSwgYj0xLCAqYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgMywgNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKigyLDMsNCknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsICpbMyw0XScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgMywgKlVzZXJMaXN0KFs0XSknKQorCisgICAgZGVmIHRlc3RfdmFya3coc2VsZik6CisgICAgICAgIGYgPSBzZWxmLm1ha2VDYWxsYWJsZSgnYSwgYj0xLCAqKmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ2E9MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgYj0zLCBjPTQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ2I9MywgYT0yLCBjPTQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ2M9NCwgKip7ImEiOjIsICJiIjozfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgYz00LCAqKnsiYiI6M30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ2I9MiwgKip7ImEiOjMsICJjIjo0fScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKipVc2VyRGljdChhPTIsIGI9MywgYz00KScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgYz00LCAqKlVzZXJEaWN0KGI9MyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ2I9MiwgKipVc2VyRGljdChhPTMsIGM9NCknKQorICAgICAgICAjIHVuaWNvZGUga2V5d29yZCBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnYz00LCAqKnt1ImEiOjIsIHUiYiI6M30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsIGM9NCwgKip7dSJiIjozfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnYj0yLCAqKnt1ImEiOjMsIHUiYyI6NH0nKQorCisgICAgZGVmIHRlc3RfdmFya3dfb25seShzZWxmKToKKyAgICAgICAgIyBpc3N1ZTExMjU2OgorICAgICAgICBmID0gc2VsZi5tYWtlQ2FsbGFibGUoJyoqYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdhPTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ2E9MSwgYj0yJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdjPTMsICoqeyJhIjogMSwgImIiOiAyfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKipVc2VyRGljdChhPTEsIGI9MiknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ2M9MywgKipVc2VyRGljdChhPTEsIGI9MiknKQorCisgICAgZGVmIHRlc3RfdHVwbGVhcmdzKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5tYWtlQ2FsbGFibGUoJyhiLGMpLCAoZCwoZSxmKSk9KDAsWzEsMl0pJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcoMiwzKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnWzIsM10nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ1VzZXJMaXN0KFsyLDNdKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKDIsMyksICg0LCg1LDYpKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKDIsMyksICg0LFs1LDZdKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKDIsMyksIFs0LFVzZXJMaXN0KFs1LDZdKV0nKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfZmVhdHVyZXMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLm1ha2VDYWxsYWJsZSgnYSwgYj0yLCAoYywoZCxlKSk9KDMsWzQsNV0pLCAqZiwgKipnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcyLCAzLCAoNCxbNSw2XSksIDcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsIDMsICpbKDQsWzUsNl0pLCA3XSwgeD04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcyLCAzLCB4PTgsICpbKDQsWzUsNl0pLCA3XScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgeD04LCAqWzMsICg0LFs1LDZdKSwgN10sIHk9OScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAneD04LCAqWzIsIDMsICg0LFs1LDZdKV0sIHk9OScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAneD04LCAqVXNlckxpc3QoWzIsIDMsICg0LFs1LDZdKV0pLCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKip7InkiOjksICJ6IjoxMH0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsIHg9OCwgKlVzZXJMaXN0KFszLCAoNCxbNSw2XSldKSwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyoqVXNlckRpY3QoeT05LCB6PTEwKScpCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIGYwID0gc2VsZi5tYWtlQ2FsbGFibGUoJycpCisgICAgICAgIGYxID0gc2VsZi5tYWtlQ2FsbGFibGUoJ2EsIGInKQorICAgICAgICBmMiA9IHNlbGYubWFrZUNhbGxhYmxlKCdhLCBiPTEnKQorICAgICAgICAjIGYwIHRha2VzIG5vIGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYwLCAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZjAsICd4PTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYwLCAnMSx4PTEnKQorICAgICAgICAjIGYxIHRha2VzIGV4YWN0bHkgMiBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmMSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZjEsICcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmMSwgJ2E9MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZjEsICdiPTMnKQorICAgICAgICAjIGYyIHRha2VzIGF0IGxlYXN0IDEgYXJndW1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmMiwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZjIsICdiPTMnKQorICAgICAgICBmb3IgZiBpbiBmMSwgZjI6CisgICAgICAgICAgICAjIGYxL2YyIHRha2VzIGV4YWN0bHkvYXQgbW9zdCAyIGFyZ3VtZW50cworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmLCAnMiwgMywgNCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYsICcxLCAyLCAzLCBhPTEnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmLCAnMiwgMywgNCwgYz01JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZiwgJzIsIDMsIDQsIGE9MSwgYz01JykKKyAgICAgICAgICAgICMgZiBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYsICdjPTInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmLCAnMiwgYz0zJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZiwgJzIsIDMsIGM9NCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYsICcyLCBjPTQsIGI9MycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYsICcqKnt1Ilx1MDNjMFx1MDNiOSI6IDR9JykKKyAgICAgICAgICAgICMgZiBnb3QgbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZ3VtZW50CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYsICcxLCBhPTInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmLCAnMSwgKip7ImEiOjJ9JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZiwgJzEsIDIsIGI9MycpCisgICAgICAgICAgICAjIFhYWDogUHl0aG9uIGluY29uc2lzdGVuY3kKKyAgICAgICAgICAgICMgLSBmb3IgZnVuY3Rpb25zIGFuZCBib3VuZCBtZXRob2RzOiB1bmV4cGVjdGVkIGtleXdvcmQgJ2MnCisgICAgICAgICAgICAjIC0gZm9yIHVuYm91bmQgbWV0aG9kczogbXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkICdhJworICAgICAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZiwgJzEsIGM9MywgYT0yJykKKyAgICAgICAgZiA9IHNlbGYubWFrZUNhbGxhYmxlKCcoYSxiKT0oMCwxKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZiwgJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYsICdbMV0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYsICcoMSwyLDMpJykKKyAgICAgICAgIyBpc3N1ZTExMjU2OgorICAgICAgICBmMyA9IHNlbGYubWFrZUNhbGxhYmxlKCcqKmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYzLCAnMSwgMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZjMsICcxLCAyLCBhPTEsIGI9MicpCisKK2NsYXNzIFRlc3RHZXRjYWxsYXJnc01ldGhvZHMoVGVzdEdldGNhbGxhcmdzRnVuY3Rpb25zKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuY2xzID0gRm9vCisgICAgICAgIHNlbGYuaW5zdCA9IEZvbygpCisKKyAgICBkZWYgbWFrZUNhbGxhYmxlKHNlbGYsIHNpZ25hdHVyZSk6CisgICAgICAgIGFzc2VydCAnc2VsZicgbm90IGluIHNpZ25hdHVyZQorICAgICAgICBtayA9IHN1cGVyKFRlc3RHZXRjYWxsYXJnc01ldGhvZHMsIHNlbGYpLm1ha2VDYWxsYWJsZQorICAgICAgICBzZWxmLmNscy5tZXRob2QgPSBtaygnc2VsZiwgJyArIHNpZ25hdHVyZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5zdC5tZXRob2QKKworY2xhc3MgVGVzdEdldGNhbGxhcmdzVW5ib3VuZE1ldGhvZHMoVGVzdEdldGNhbGxhcmdzTWV0aG9kcyk6CisKKyAgICBkZWYgbWFrZUNhbGxhYmxlKHNlbGYsIHNpZ25hdHVyZSk6CisgICAgICAgIHN1cGVyKFRlc3RHZXRjYWxsYXJnc1VuYm91bmRNZXRob2RzLCBzZWxmKS5tYWtlQ2FsbGFibGUoc2lnbmF0dXJlKQorICAgICAgICByZXR1cm4gc2VsZi5jbHMubWV0aG9kCisKKyAgICBkZWYgYXNzZXJ0RXF1YWxDYWxsQXJncyhzZWxmLCBmdW5jLCBjYWxsX3BhcmFtc19zdHJpbmcsIGxvY3M9Tm9uZSk6CisgICAgICAgIHJldHVybiBzdXBlcihUZXN0R2V0Y2FsbGFyZ3NVbmJvdW5kTWV0aG9kcywgc2VsZikuYXNzZXJ0RXF1YWxDYWxsQXJncygKKyAgICAgICAgICAgICpzZWxmLl9nZXRBc3NlcnRFcXVhbFBhcmFtcyhmdW5jLCBjYWxsX3BhcmFtc19zdHJpbmcsIGxvY3MpKQorCisgICAgZGVmIGFzc2VydEVxdWFsRXhjZXB0aW9uKHNlbGYsIGZ1bmMsIGNhbGxfcGFyYW1zX3N0cmluZywgbG9jcz1Ob25lKToKKyAgICAgICAgcmV0dXJuIHN1cGVyKFRlc3RHZXRjYWxsYXJnc1VuYm91bmRNZXRob2RzLCBzZWxmKS5hc3NlcnRFcXVhbEV4Y2VwdGlvbigKKyAgICAgICAgICAgICpzZWxmLl9nZXRBc3NlcnRFcXVhbFBhcmFtcyhmdW5jLCBjYWxsX3BhcmFtc19zdHJpbmcsIGxvY3MpKQorCisgICAgZGVmIF9nZXRBc3NlcnRFcXVhbFBhcmFtcyhzZWxmLCBmdW5jLCBjYWxsX3BhcmFtc19zdHJpbmcsIGxvY3M9Tm9uZSk6CisgICAgICAgIGFzc2VydCAnaW5zdCcgbm90IGluIGNhbGxfcGFyYW1zX3N0cmluZworICAgICAgICBsb2NzID0gZGljdChsb2NzIG9yIHt9LCBpbnN0PXNlbGYuaW5zdCkKKyAgICAgICAgcmV0dXJuIChmdW5jLCAnaW5zdCwnICsgY2FsbF9wYXJhbXNfc3RyaW5nLCBsb2NzKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KAorICAgICAgICBUZXN0RGVjb3JhdG9ycywgVGVzdFJldHJpZXZpbmdTb3VyY2VDb2RlLCBUZXN0T25lbGluZXJzLCBUZXN0QnVnZ3lDYXNlcywKKyAgICAgICAgVGVzdEludGVycHJldGVyU3RhY2ssIFRlc3RDbGFzc2VzQW5kRnVuY3Rpb25zLCBUZXN0UHJlZGljYXRlcywKKyAgICAgICAgVGVzdEdldGNhbGxhcmdzRnVuY3Rpb25zLCBUZXN0R2V0Y2FsbGFyZ3NNZXRob2RzLAorICAgICAgICBUZXN0R2V0Y2FsbGFyZ3NVbmJvdW5kTWV0aG9kcykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5zcGVjdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnNwZWN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjM0Y2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5zcGVjdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5zcGVjdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnNwZWN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzVlMWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5zcGVjdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW50LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NWY5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnQucHkKQEAgLTAsMCArMSw0NjcgQEAKK2ltcG9ydCBzeXMKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBoYXZlX3VuaWNvZGUKK2ltcG9ydCBtYXRoCisKK0wgPSBbCisgICAgICAgICgnMCcsIDApLAorICAgICAgICAoJzEnLCAxKSwKKyAgICAgICAgKCc5JywgOSksCisgICAgICAgICgnMTAnLCAxMCksCisgICAgICAgICgnOTknLCA5OSksCisgICAgICAgICgnMTAwJywgMTAwKSwKKyAgICAgICAgKCczMTQnLCAzMTQpLAorICAgICAgICAoJyAzMTQnLCAzMTQpLAorICAgICAgICAoJzMxNCAnLCAzMTQpLAorICAgICAgICAoJyAgXHRcdCAgMzE0ICBcdFx0ICAnLCAzMTQpLAorICAgICAgICAocmVwcihzeXMubWF4aW50KSwgc3lzLm1heGludCksCisgICAgICAgICgnICAxeCcsIFZhbHVlRXJyb3IpLAorICAgICAgICAoJyAgMSAgJywgMSksCisgICAgICAgICgnICAxXDAyICAnLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKCcnLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKCcgJywgVmFsdWVFcnJvciksCisgICAgICAgICgnICBcdFx0ICAnLCBWYWx1ZUVycm9yKQorXQoraWYgaGF2ZV91bmljb2RlOgorICAgIEwgKz0gWworICAgICAgICAodW5pY29kZSgnMCcpLCAwKSwKKyAgICAgICAgKHVuaWNvZGUoJzEnKSwgMSksCisgICAgICAgICh1bmljb2RlKCc5JyksIDkpLAorICAgICAgICAodW5pY29kZSgnMTAnKSwgMTApLAorICAgICAgICAodW5pY29kZSgnOTknKSwgOTkpLAorICAgICAgICAodW5pY29kZSgnMTAwJyksIDEwMCksCisgICAgICAgICh1bmljb2RlKCczMTQnKSwgMzE0KSwKKyAgICAgICAgKHVuaWNvZGUoJyAzMTQnKSwgMzE0KSwKKyAgICAgICAgKHVuaWNvZGUoJ1x1MDY2M1x1MDY2MVx1MDY2NCAnLCdyYXctdW5pY29kZS1lc2NhcGUnKSwgMzE0KSwKKyAgICAgICAgKHVuaWNvZGUoJyAgXHRcdCAgMzE0ICBcdFx0ICAnKSwgMzE0KSwKKyAgICAgICAgKHVuaWNvZGUoJyAgMXgnKSwgVmFsdWVFcnJvciksCisgICAgICAgICh1bmljb2RlKCcgIDEgICcpLCAxKSwKKyAgICAgICAgKHVuaWNvZGUoJyAgMVwwMiAgJyksIFZhbHVlRXJyb3IpLAorICAgICAgICAodW5pY29kZSgnJyksIFZhbHVlRXJyb3IpLAorICAgICAgICAodW5pY29kZSgnICcpLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKHVuaWNvZGUoJyAgXHRcdCAgJyksIFZhbHVlRXJyb3IpLAorICAgICAgICAodW5pY2hyKDB4MjAwKSwgVmFsdWVFcnJvciksCitdCisKK2NsYXNzIEludExvbmdDb21tb25UZXN0cyhvYmplY3QpOgorCisgICAgIiIiTWl4aW4gb2YgdGVzdCBjYXNlcyB0byBzaGFyZSBiZXR3ZWVuIGJvdGggdGVzdF9pbnQgYW5kIHRlc3RfbG9uZy4iIiIKKworICAgICMgQ2hhbmdlIHRvIGludCBvciBsb25nIGluIHRoZSBUZXN0Q2FzZSBzdWJjbGFzcy4KKyAgICBudHlwZSA9IE5vbmUKKworICAgIGRlZiB0ZXN0X25vX2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5udHlwZSgpLCAwKQorCisgICAgZGVmIHRlc3Rfa2V5d29yZF9hcmdzKHNlbGYpOgorICAgICAgICAjIFRlc3QgaW52b2tpbmcgY29uc3RydWN0b3IgdXNpbmcga2V5d29yZCBhcmd1bWVudHMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5udHlwZSh4PTEuMiksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5udHlwZSgnMTAwJywgYmFzZT0yKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm50eXBlKHg9JzEwMCcsIGJhc2U9MiksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5udHlwZSwgYmFzZT0xMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm50eXBlLCBiYXNlPTApCisKK2NsYXNzIEludFRlc3RDYXNlcyhJbnRMb25nQ29tbW9uVGVzdHMsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIG50eXBlID0gaW50CisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoMzE0KSwgMzE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgzLjE0KSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoMzE0TCksIDMxNCkKKyAgICAgICAgIyBDaGVjayB0aGF0IGNvbnZlcnNpb24gZnJvbSBmbG9hdCB0cnVuY2F0ZXMgdG93YXJkcyB6ZXJvCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KC0zLjE0KSwgLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KDMuOSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KC0zLjkpLCAtMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoMy41KSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoLTMuNSksIC0zKQorICAgICAgICAjIERpZmZlcmVudCBiYXNlOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgiMTAiLDE2KSwgMTZMKQorICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCh1bmljb2RlKCIxMCIpLDE2KSwgMTZMKQorICAgICAgICAjIFRlc3QgY29udmVyc2lvbiBmcm9tIHN0cmluZ3MgYW5kIHZhcmlvdXMgYW5vbWFsaWVzCisgICAgICAgIGZvciBzLCB2IGluIEw6CisgICAgICAgICAgICBmb3Igc2lnbiBpbiAiIiwgIisiLCAiLSI6CisgICAgICAgICAgICAgICAgZm9yIHByZWZpeCBpbiAiIiwgIiAiLCAiXHQiLCAiICBcdFx0ICAiOgorICAgICAgICAgICAgICAgICAgICBzcyA9IHByZWZpeCArIHNpZ24gKyBzCisgICAgICAgICAgICAgICAgICAgIHZ2ID0gdgorICAgICAgICAgICAgICAgICAgICBpZiBzaWduID09ICItIiBhbmQgdiBpcyBub3QgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZ2ID0gLXYKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoc3MpLCB2dikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHY6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcyA9IHJlcHIoLTEtc3lzLm1heGludCkKKyAgICAgICAgeCA9IGludChzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgrMSwgLXN5cy5tYXhpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4LCBpbnQpCisgICAgICAgICMgc2hvdWxkIHJldHVybiBsb25nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KHNbMTpdKSwgc3lzLm1heGludCsxKQorCisgICAgICAgICMgc2hvdWxkIHJldHVybiBsb25nCisgICAgICAgIHggPSBpbnQoMWUxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4LCBsb25nKQorICAgICAgICB4ID0gaW50KC0xZTEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHgsIGxvbmcpCisKKworICAgICAgICAjIFNGIGJ1ZyA0MzQxODY6ICAweDgwMDAwMDAwLzIgIT0gMHg4MDAwMDAwMD4+MS4KKyAgICAgICAgIyBXb3JrZWQgYnkgYWNjaWRlbnQgaW4gV2luZG93cyByZWxlYXNlIGJ1aWxkLCBidXQgZmFpbGVkIGluIGRlYnVnIGJ1aWxkLgorICAgICAgICAjIEZhaWxlZCBpbiBhbGwgTGludXggYnVpbGRzLgorICAgICAgICB4ID0gLTEtc3lzLm1heGludAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHggPj4gMSwgeC8vMikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcxMjNcMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzUzJywgNDApCisKKyAgICAgICAgIyBTRiBidWcgMTU0NTQ5NzogZW1iZWRkZWQgTlVMcyB3ZXJlIG5vdCBkZXRlY3RlZCB3aXRoCisgICAgICAgICMgZXhwbGljaXQgYmFzZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcxMjNcMCcsIDEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcxMjNceDAwIDI0NScsIDIwKQorCisgICAgICAgIHggPSBpbnQoJzEnICogNjAwKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeCwgbG9uZykKKworICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICB4ID0gaW50KHVuaWNocigweDY2MSkgKiA2MDApCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeCwgbG9uZykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGludCwgMSwgMTIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzAxMjMnLCAwKSwgODMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcweDEyMycsIDE2KSwgMjkxKQorCisgICAgICAgICMgQnVnIDE2Nzk6ICIweCIgaXMgbm90IGEgdmFsaWQgaGV4IGxpdGVyYWwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAiMHgiLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAiMHgiLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgIjBvIiwgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAiMG8iLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgIjBiIiwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAiMGIiLCAwKQorCisKKyAgICAgICAgIyBTRiBidWcgMTMzNDY2MjogaW50KHN0cmluZywgYmFzZSkgd3JvbmcgYW5zd2VycworICAgICAgICAjIFZhcmlvdXMgcmVwcmVzZW50YXRpb25zIG9mIDIqKjMyIGV2YWx1YXRlZCB0byAwCisgICAgICAgICMgcmF0aGVyIHRoYW4gMioqMzIgaW4gcHJldmlvdXMgdmVyc2lvbnMKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywgMiksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTAyMDAyMDIyMjAxMjIxMTExMjExJywgMyksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTAwMDAwMDAwMDAwMDAwMDAnLCA0KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCczMjI0NDAwMjQyMzE0MScsIDUpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzE1NTAxMDQwMTU1MDQnLCA2KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcyMTEzMDE0MjIzNTQnLCA3KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc0MDAwMDAwMDAwMCcsIDgpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzEyMDY4NjU3NDU0JywgOSksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNDI5NDk2NzI5NicsIDEwKSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxOTA0NDQwNTU0JywgMTEpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzliYTQ2MTU5NCcsIDEyKSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc1MzVhNzk4ODknLCAxMyksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMmNhNWI3NDY0JywgMTQpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzFhMjBkY2Q4MScsIDE1KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxMDAwMDAwMDAnLCAxNiksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnYTdmZmRhOTEnLCAxNyksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNzA0aGU3ZzQnLCAxOCksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNGY1YWZmNjYnLCAxOSksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMzcyM2FpNGcnLCAyMCksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMjgxZDU1aTQnLCAyMSksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMWZqOGIxODQnLCAyMiksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTYwNms3aWMnLCAyMyksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnbWI5OTRhZycsIDI0KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCdoZWsybWdsJywgMjUpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJ2RuY2hibm0nLCAyNiksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnYjI4anBkbScsIDI3KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc4cGZnaWg0JywgMjgpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzc2YmVpZ2cnLCAyOSksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNXFtY3BxZycsIDMwKSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc0cTBqdG80JywgMzEpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzQwMDAwMDAnLCAzMiksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnM2Fva3E5NCcsIDMzKSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcycWh4amxpJywgMzQpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzJicjQ1cWInLCAzNSksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMXoxNDF6NCcsIDM2KSwgNDI5NDk2NzI5NkwpCisKKyAgICAgICAgIyB0ZXN0cyB3aXRoIGJhc2UgMAorICAgICAgICAjIHRoaXMgZmFpbHMgb24gMy4wLCBidXQgaW4gMi54IHRoZSBvbGQgb2N0YWwgc3ludGF4IGlzIGFsbG93ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJyAwMTIzICAnLCAwKSwgODMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcgMDEyMyAgJywgMCksIDgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMDAwJywgMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcwbzEyMycsIDApLCA4MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzB4MTIzJywgMCksIDI5MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzBiMTAwJywgMCksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcgME8xMjMgICAnLCAwKSwgODMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcgMFgxMjMgICcsIDApLCAyOTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcgMEIxMDAgJywgMCksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcwJywgMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcrMCcsIDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnLTAnLCAwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzAwJywgMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzA4JywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnLTAxMjM5NScsIDApCisKKyAgICAgICAgIyB3aXRob3V0IGJhc2Ugc3RpbGwgYmFzZSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMDEyMycpLCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcwMTIzJywgMTApLCAxMjMpCisKKyAgICAgICAgIyB0ZXN0cyB3aXRoIHByZWZpeCBhbmQgYmFzZSAhPSAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcweDEyMycsIDE2KSwgMjkxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMG8xMjMnLCA4KSwgODMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcwYjEwMCcsIDIpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMFgxMjMnLCAxNiksIDI5MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzBPMTIzJywgOCksIDgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMEIxMDAnLCAyKSwgNCkKKworICAgICAgICAjIHRoZSBjb2RlIGhhcyBzcGVjaWFsIGNoZWNrcyBmb3IgdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUKKyAgICAgICAgIyAgdHlwZSBwcmVmaXgKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMGIyJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMGIwMicsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzBCMicsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzBCMDInLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcwbzgnLCA4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcwbzA4JywgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnME84JywgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnME8wOCcsIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzB4ZycsIDE2KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcweDBnJywgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzBYZycsIDE2KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcwWDBnJywgMTYpCisKKyAgICAgICAgIyBTRiBidWcgMTMzNDY2MjogaW50KHN0cmluZywgYmFzZSkgd3JvbmcgYW5zd2VycworICAgICAgICAjIENoZWNrcyBmb3IgcHJvcGVyIGV2YWx1YXRpb24gb2YgMioqMzIgKyAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnLCAyKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxMDIwMDIwMjIyMDEyMjExMTEyMTInLCAzKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxMDAwMDAwMDAwMDAwMDAwMScsIDQpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzMyMjQ0MDAyNDIzMTQyJywgNSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTU1MDEwNDAxNTUwNScsIDYpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzIxMTMwMTQyMjM1NScsIDcpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzQwMDAwMDAwMDAxJywgOCksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTIwNjg2NTc0NTUnLCA5KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc0Mjk0OTY3Mjk3JywgMTApLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzE5MDQ0NDA1NTUnLCAxMSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnOWJhNDYxNTk1JywgMTIpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzUzNWE3OTg4YScsIDEzKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcyY2E1Yjc0NjUnLCAxNCksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMWEyMGRjZDgyJywgMTUpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzEwMDAwMDAwMScsIDE2KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCdhN2ZmZGE5MicsIDE3KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc3MDRoZTdnNScsIDE4KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc0ZjVhZmY2NycsIDE5KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCczNzIzYWk0aCcsIDIwKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcyODFkNTVpNScsIDIxKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxZmo4YjE4NScsIDIyKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxNjA2azdpZCcsIDIzKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCdtYjk5NGFoJywgMjQpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJ2hlazJtZ20nLCAyNSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnZG5jaGJubicsIDI2KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCdiMjhqcGRuJywgMjcpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzhwZmdpaDUnLCAyOCksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNzZiZWlnaCcsIDI5KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc1cW1jcHFoJywgMzApLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzRxMGp0bzUnLCAzMSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNDAwMDAwMScsIDMyKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCczYW9rcTk1JywgMzMpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzJxaHhqbGonLCAzNCksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMmJyNDVxYycsIDM1KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxejE0MXo1JywgMzYpLCA0Mjk0OTY3Mjk3TCkKKworICAgIGRlZiB0ZXN0X2JpdF9sZW5ndGgoc2VsZik6CisgICAgICAgIHRpbnkgPSAxZS0xMAorICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoLTY1MDAwLCA2NTAwMCk6CisgICAgICAgICAgICBrID0geC5iaXRfbGVuZ3RoKCkKKyAgICAgICAgICAgICMgQ2hlY2sgZXF1aXZhbGVuY2Ugd2l0aCBQeXRob24gdmVyc2lvbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBsZW4oYmluKHgpLmxzdHJpcCgnLTBiJykpKQorICAgICAgICAgICAgIyBCZWhhdmlvdXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkb2NzCisgICAgICAgICAgICBpZiB4ICE9IDA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIqKihrLTEpIDw9IGFicyh4KSA8IDIqKmspCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgMCkKKyAgICAgICAgICAgICMgQWx0ZXJuYXRpdmUgZGVmaW5pdGlvbjogeC5iaXRfbGVuZ3RoKCkgPT0gMSArIGZsb29yKGxvZ18yKHgpKQorICAgICAgICAgICAgaWYgeCAhPSAwOgorICAgICAgICAgICAgICAgICMgV2hlbiB4IGlzIGFuIGV4YWN0IHBvd2VyIG9mIDIsIG51bWVyaWMgZXJyb3JzIGNhbgorICAgICAgICAgICAgICAgICMgY2F1c2UgZmxvb3IobG9nKHgpL2xvZygyKSkgdG8gYmUgb25lIHRvbyBzbWFsbDsgZm9yCisgICAgICAgICAgICAgICAgIyBzbWFsbCB4IHRoaXMgY2FuIGJlIGZpeGVkIGJ5IGFkZGluZyBhIHNtYWxsIHF1YW50aXR5CisgICAgICAgICAgICAgICAgIyB0byB0aGUgcXVvdGllbnQgYmVmb3JlIHRha2luZyB0aGUgZmxvb3IuCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCAxICsgbWF0aC5mbG9vcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGgubG9nKGFicyh4KSkvbWF0aC5sb2coMikgKyB0aW55KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwKS5iaXRfbGVuZ3RoKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEpLmJpdF9sZW5ndGgoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTEpLmJpdF9sZW5ndGgoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMikuYml0X2xlbmd0aCgpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtMikuYml0X2xlbmd0aCgpLCAyKQorICAgICAgICBmb3IgaSBpbiBbMiwgMywgMTUsIDE2LCAxNywgMzEsIDMyLCAzMywgNjMsIDY0XToKKyAgICAgICAgICAgIGEgPSAyKippCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLTEpLmJpdF9sZW5ndGgoKSwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEtYSkuYml0X2xlbmd0aCgpLCBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSkuYml0X2xlbmd0aCgpLCBpKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtYSkuYml0X2xlbmd0aCgpLCBpKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhKzEpLmJpdF9sZW5ndGgoKSwgaSsxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLWEtMSkuYml0X2xlbmd0aCgpLCBpKzEpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhmbG9hdC5fX2dldGZvcm1hdF9fKCJkb3VibGUiKS5zdGFydHN3aXRoKCJJRUVFIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgcmVxdWlyZXMgSUVFRSA3NTQgZG91YmxlcyIpCisgICAgZGVmIHRlc3RfZmxvYXRfY29udmVyc2lvbihzZWxmKToKKyAgICAgICAgIyB2YWx1ZXMgZXhhY3RseSByZXByZXNlbnRhYmxlIGFzIGZsb2F0cworICAgICAgICBleGFjdF92YWx1ZXMgPSBbLTIsIC0xLCAwLCAxLCAyLCAyKio1MiwgMioqNTMtMSwgMioqNTMsIDIqKjUzKzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgMioqNTMrNCwgMioqNTQtNCwgMioqNTQtMiwgMioqNjMsIC0yKio2MywgMioqNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgLTIqKjY0LCAxMCoqMjAsIDEwKioyMSwgMTAqKjIyXQorICAgICAgICBmb3IgdmFsdWUgaW4gZXhhY3RfdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoaW50KHZhbHVlKSkpLCB2YWx1ZSkKKworICAgICAgICAjIHRlc3Qgcm91bmQtaGFsZi10by1ldmVuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjUzKzEpKSwgMioqNTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjUzKzIpKSwgMioqNTMrMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoMioqNTMrMykpLCAyKio1Mys0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChmbG9hdCgyKio1Mys1KSksIDIqKjUzKzQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjUzKzYpKSwgMioqNTMrNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoMioqNTMrNykpLCAyKio1Mys4KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KC0yKio1My0xKSksIC0yKio1MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoLTIqKjUzLTIpKSwgLTIqKjUzLTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KC0yKio1My0zKSksIC0yKio1My00KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChmbG9hdCgtMioqNTMtNSkpLCAtMioqNTMtNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoLTIqKjUzLTYpKSwgLTIqKjUzLTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KC0yKio1My03KSksIC0yKio1My04KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjU0LTIpKSwgMioqNTQtMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoMioqNTQtMSkpLCAyKio1NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoMioqNTQrMikpLCAyKio1NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoMioqNTQrMykpLCAyKio1NCs0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChmbG9hdCgyKio1NCs1KSksIDIqKjU0KzQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjU0KzYpKSwgMioqNTQrOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoMioqNTQrMTApKSwgMioqNTQrOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoMioqNTQrMTEpKSwgMioqNTQrMTIpCisKKyAgICBkZWYgdGVzdF92YWxpZF9ub25fbnVtZXJpY19pbnB1dF90eXBlc19mb3JfeChzZWxmKToKKyAgICAgICAgIyBUZXN0IHBvc3NpYmxlIHZhbGlkIG5vbi1udW1lcmljIHR5cGVzIGZvciB4LCBpbmNsdWRpbmcgc3ViY2xhc3NlcworICAgICAgICAjIG9mIHRoZSBhbGxvd2VkIGJ1aWx0LWluIHR5cGVzLgorICAgICAgICBjbGFzcyBDdXN0b21TdHIoc3RyKTogcGFzcworICAgICAgICB2YWx1ZXMgPSBbJzEwMCcsIEN1c3RvbVN0cignMTAwJyldCisKKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgY2xhc3MgQ3VzdG9tVW5pY29kZSh1bmljb2RlKTogcGFzcworICAgICAgICAgICAgdmFsdWVzICs9IFt1bmljb2RlKCcxMDAnKSwgQ3VzdG9tVW5pY29kZSh1bmljb2RlKCcxMDAnKSldCisKKyAgICAgICAgZm9yIHggaW4gdmFsdWVzOgorICAgICAgICAgICAgbXNnID0gJ3ggaGFzIHZhbHVlICVzIGFuZCB0eXBlICVzJyAlICh4LCB0eXBlKHgpLl9fbmFtZV9fKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KHgpLCAxMDAsIG1zZz1tc2cpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoeCwgMiksIDQsIG1zZz1tc2cpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0ZvciAlcyBnb3QgVHlwZUVycm9yOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlKHgpLl9fbmFtZV9fLCBlcnIpKQorCisgICAgZGVmIHRlc3RfZXJyb3Jfb25fc3RyaW5nX2Zsb2F0X2Zvcl94KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcxLjInKQorCisgICAgZGVmIHRlc3RfZXJyb3Jfb25fYnl0ZWFycmF5X2Zvcl94KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGludCwgYnl0ZWFycmF5KCcxMDAnKSwgMikKKworICAgIGRlZiB0ZXN0X2Vycm9yX29uX2ludmFsaWRfaW50X2Jhc2VzKHNlbGYpOgorICAgICAgICBmb3IgYmFzZSBpbiBbLTEsIDEsIDEwMDBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMTAwJywgYmFzZSkKKworICAgIGRlZiB0ZXN0X2Vycm9yX29uX3N0cmluZ19iYXNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGludCwgMTAwLCBiYXNlPSdmb28nKQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9zbWFsbF9pbnRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKGludCgnMTAnKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoaW50KCctMScpLCAtMSkKKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhpbnQodScxMCcpLCAxMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaW50KHUnLTEnKSwgLTEpCisKKyAgICBkZWYgdGVzdF9pbnRjb252ZXJzaW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgX19pbnRfXygpCisgICAgICAgIGNsYXNzIENsYXNzaWNNaXNzaW5nTWV0aG9kczoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGludCwgQ2xhc3NpY01pc3NpbmdNZXRob2RzKCkpCisKKyAgICAgICAgY2xhc3MgTWlzc2luZ01ldGhvZHMob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbnQsIE1pc3NpbmdNZXRob2RzKCkpCisKKyAgICAgICAgY2xhc3MgRm9vMDoKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgIGNsYXNzIEZvbzEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgIGNsYXNzIEZvbzIoaW50KToKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgIGNsYXNzIEZvbzMoaW50KToKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgY2xhc3MgRm9vNChpbnQpOgorICAgICAgICAgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyTAorCisgICAgICAgIGNsYXNzIEZvbzUoaW50KToKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0Mi4KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChGb28wKCkpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoRm9vMSgpKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KEZvbzIoKSksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChGb28zKCkpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChGb280KCkpLCA0MkwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW50LCBGb281KCkpCisKKyAgICAgICAgY2xhc3MgQ2xhc3NpYzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZm9yIGJhc2UgaW4gKG9iamVjdCwgQ2xhc3NpYyk6CisgICAgICAgICAgICBjbGFzcyBJbnRPdmVycmlkZXNUcnVuYyhiYXNlKToKKyAgICAgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgICAgICAgICAgZGVmIF9fdHJ1bmNfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xMgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoSW50T3ZlcnJpZGVzVHJ1bmMoKSksIDQyKQorCisgICAgICAgICAgICBjbGFzcyBKdXN0VHJ1bmMoYmFzZSk6CisgICAgICAgICAgICAgICAgZGVmIF9fdHJ1bmNfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChKdXN0VHJ1bmMoKSksIDQyKQorCisgICAgICAgICAgICBmb3IgdHJ1bmNfcmVzdWx0X2Jhc2UgaW4gKG9iamVjdCwgQ2xhc3NpYyk6CisgICAgICAgICAgICAgICAgY2xhc3MgSW50ZWdyYWwodHJ1bmNfcmVzdWx0X2Jhc2UpOgorICAgICAgICAgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgICAgICAgICAgY2xhc3MgVHJ1bmNSZXR1cm5zTm9uSW50KGJhc2UpOgorICAgICAgICAgICAgICAgICAgICBkZWYgX190cnVuY19fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVncmFsKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChUcnVuY1JldHVybnNOb25JbnQoKSksIDQyKQorCisgICAgICAgICAgICAgICAgY2xhc3MgTm9uSW50ZWdyYWwodHJ1bmNfcmVzdWx0X2Jhc2UpOgorICAgICAgICAgICAgICAgICAgICBkZWYgX190cnVuY19fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayB0aGF0IHdlIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25JbnRlZ3JhbCgpCisKKyAgICAgICAgICAgICAgICBjbGFzcyBUcnVuY1JldHVybnNOb25JbnRlZ3JhbChiYXNlKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9fdHJ1bmNfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25JbnRlZ3JhbCgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpbnQoVHJ1bmNSZXR1cm5zTm9uSW50ZWdyYWwoKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX190cnVuY19fIHJldHVybmVkIG5vbi1JbnRlZ3JhbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAodHlwZSBOb25JbnRlZ3JhbCkiKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRmFpbGVkIHRvIHJhaXNlIFR5cGVFcnJvciB3aXRoICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJhc2UsIHRydW5jX3Jlc3VsdF9iYXNlKSwpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEludFRlc3RDYXNlcykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW50LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ludC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhMzljZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ludC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW50LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ludC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhMzljZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ludC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW50X2xpdGVyYWwucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnRfbGl0ZXJhbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjVjYzdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW50X2xpdGVyYWwucHkKQEAgLTAsMCArMSwxODggQEAKKyIiIlRlc3QgY29ycmVjdCB0cmVhdG1lbnQgb2YgaGV4L29jdCBjb25zdGFudHMuCisKK1RoaXMgaXMgY29tcGxleCBiZWNhdXNlIG9mIGNoYW5nZXMgZHVlIHRvIFBFUCAyMzcuCisiIiIKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK2NsYXNzIFRlc3RIZXhPY3RCaW4odW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfaGV4X2Jhc2VsaW5lKHNlbGYpOgorICAgICAgICAjIEEgZmV3IHVwcGVyL2xvd2VyY2FzZSB0ZXN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDB4MCwgMFgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDB4MSwgMFgxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDB4MTIzNDU2Nzg5YWJjZGVmLCAwWDEyMzQ1Njc4OWFiY2RlZikKKyAgICAgICAgIyBCYXNlbGluZSB0ZXN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDB4MCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgweDEwLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgweDdmZmZmZmZmLCAyMTQ3NDgzNjQ3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDB4N2ZmZmZmZmZmZmZmZmZmZiwgOTIyMzM3MjAzNjg1NDc3NTgwNykKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgcGFyZW50aGVzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDB4MCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgweDEwKSwgLTE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMHg3ZmZmZmZmZiksIC0yMTQ3NDgzNjQ3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMHg3ZmZmZmZmZmZmZmZmZmZmKSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDcpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIE5PIHBhcmVudGhlc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTB4MCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMHgxMCwgLTE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0weDdmZmZmZmZmLCAtMjE0NzQ4MzY0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMHg3ZmZmZmZmZmZmZmZmZmZmLCAtOTIyMzM3MjAzNjg1NDc3NTgwNykKKworICAgIGRlZiB0ZXN0X2hleF91bnNpZ25lZChzZWxmKToKKyAgICAgICAgIyBQb3NpdGl2ZSBjb25zdGFudHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgweDgwMDAwMDAwLCAyMTQ3NDgzNjQ4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZmLCA0Mjk0OTY3Mjk1TCkKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgcGFyZW50aGVzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDB4ODAwMDAwMDApLCAtMjE0NzQ4MzY0OEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgweGZmZmZmZmZmKSwgLTQyOTQ5NjcyOTVMKQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBOTyBwYXJlbnRoZXNlcworICAgICAgICAjIFRoaXMgZmFpbGVkIGluIFB5dGhvbiAyLjIgdGhyb3VnaCAyLjIuMiBhbmQgaW4gMi4zYTEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMHg4MDAwMDAwMCwgLTIxNDc0ODM2NDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0weGZmZmZmZmZmLCAtNDI5NDk2NzI5NUwpCisKKyAgICAgICAgIyBQb3NpdGl2ZSBjb25zdGFudHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgweDgwMDAwMDAwMDAwMDAwMDAsIDkyMjMzNzIwMzY4NTQ3NzU4MDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDB4ZmZmZmZmZmZmZmZmZmZmZiwgMTg0NDY3NDQwNzM3MDk1NTE2MTVMKQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBwYXJlbnRoZXNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMHg4MDAwMDAwMDAwMDAwMDAwKSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMHhmZmZmZmZmZmZmZmZmZmZmKSwgLTE4NDQ2NzQ0MDczNzA5NTUxNjE1TCkKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgTk8gcGFyZW50aGVzZXMKKyAgICAgICAgIyBUaGlzIGZhaWxlZCBpbiBQeXRob24gMi4yIHRocm91Z2ggMi4yLjIgYW5kIGluIDIuM2ExCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTB4ODAwMDAwMDAwMDAwMDAwMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0weGZmZmZmZmZmZmZmZmZmZmYsIC0xODQ0Njc0NDA3MzcwOTU1MTYxNUwpCisKKyAgICBkZWYgdGVzdF9vY3RfYmFzZWxpbmUoc2VsZik6CisgICAgICAgICMgQmFzZWxpbmUgdGVzdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwMjAsIDE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAxNzc3Nzc3Nzc3NywgMjE0NzQ4MzY0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3LCA5MjIzMzcyMDM2ODU0Nzc1ODA3KQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBwYXJlbnRoZXNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMDIwKSwgLTE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMDE3Nzc3Nzc3Nzc3KSwgLTIxNDc0ODM2NDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3KSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDcpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIE5PIHBhcmVudGhlc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTAwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wMjAsIC0xNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMDE3Nzc3Nzc3Nzc3LCAtMjE0NzQ4MzY0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMDc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NywgLTkyMjMzNzIwMzY4NTQ3NzU4MDcpCisKKyAgICBkZWYgdGVzdF9vY3RfYmFzZWxpbmVfbmV3KHNlbGYpOgorICAgICAgICAjIEEgZmV3IHVwcGVyL2xvd2VyY2FzZSB0ZXN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBvMCwgME8wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBvMSwgME8xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBvMTIzNDU2NywgME8xMjM0NTY3KQorICAgICAgICAjIEJhc2VsaW5lIHRlc3RzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMG8wLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBvMjAsIDE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBvMTc3Nzc3Nzc3NzcsIDIxNDc0ODM2NDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMG83Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcsIDkyMjMzNzIwMzY4NTQ3NzU4MDcpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIHBhcmVudGhlc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwbzApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMG8yMCksIC0xNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDBvMTc3Nzc3Nzc3NzcpLCAtMjE0NzQ4MzY0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDBvNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3KSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDcpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIE5PIHBhcmVudGhlc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTBvMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMG8yMCwgLTE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wbzE3Nzc3Nzc3Nzc3LCAtMjE0NzQ4MzY0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMG83Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcsIC05MjIzMzcyMDM2ODU0Nzc1ODA3KQorCisgICAgZGVmIHRlc3Rfb2N0X3Vuc2lnbmVkKHNlbGYpOgorICAgICAgICAjIFBvc2l0aXZlIGNvbnN0YW50cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAyMDAwMDAwMDAwMCwgMjE0NzQ4MzY0OEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMDM3Nzc3Nzc3Nzc3LCA0Mjk0OTY3Mjk1TCkKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgcGFyZW50aGVzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDAyMDAwMDAwMDAwMCksIC0yMTQ3NDgzNjQ4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDAzNzc3Nzc3Nzc3NyksIC00Mjk0OTY3Mjk1TCkKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgTk8gcGFyZW50aGVzZXMKKyAgICAgICAgIyBUaGlzIGZhaWxlZCBpbiBQeXRob24gMi4yIHRocm91Z2ggMi4yLjIgYW5kIGluIDIuM2ExCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTAyMDAwMDAwMDAwMCwgLTIxNDc0ODM2NDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wMzc3Nzc3Nzc3NzcsIC00Mjk0OTY3Mjk1TCkKKworICAgICAgICAjIFBvc2l0aXZlIGNvbnN0YW50cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwLCA5MjIzMzcyMDM2ODU0Nzc1ODA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NywgMTg0NDY3NDQwNzM3MDk1NTE2MTVMKQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBwYXJlbnRoZXNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDApLCAtOTIyMzM3MjAzNjg1NDc3NTgwOEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyksIC0xODQ0Njc0NDA3MzcwOTU1MTYxNUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIE5PIHBhcmVudGhlc2VzCisgICAgICAgICMgVGhpcyBmYWlsZWQgaW4gUHl0aG9uIDIuMiB0aHJvdWdoIDIuMi4yIGFuZCBpbiAyLjNhMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NywgLTE4NDQ2NzQ0MDczNzA5NTUxNjE1TCkKKworICAgIGRlZiB0ZXN0X29jdF91bnNpZ25lZF9uZXcoc2VsZik6CisgICAgICAgICMgUG9zaXRpdmUgY29uc3RhbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMG8yMDAwMDAwMDAwMCwgMjE0NzQ4MzY0OEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMG8zNzc3Nzc3Nzc3NywgNDI5NDk2NzI5NUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIHBhcmVudGhlc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwbzIwMDAwMDAwMDAwKSwgLTIxNDc0ODM2NDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMG8zNzc3Nzc3Nzc3NyksIC00Mjk0OTY3Mjk1TCkKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgTk8gcGFyZW50aGVzZXMKKyAgICAgICAgIyBUaGlzIGZhaWxlZCBpbiBQeXRob24gMi4yIHRocm91Z2ggMi4yLjIgYW5kIGluIDIuM2ExCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTBvMjAwMDAwMDAwMDAsIC0yMTQ3NDgzNjQ4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMG8zNzc3Nzc3Nzc3NywgLTQyOTQ5NjcyOTVMKQorCisgICAgICAgICMgUG9zaXRpdmUgY29uc3RhbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMG8xMDAwMDAwMDAwMDAwMDAwMDAwMDAwLCA5MjIzMzcyMDM2ODU0Nzc1ODA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwbzE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcsIDE4NDQ2NzQ0MDczNzA5NTUxNjE1TCkKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgcGFyZW50aGVzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDBvMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCksIC05MjIzMzcyMDM2ODU0Nzc1ODA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDBvMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyksIC0xODQ0Njc0NDA3MzcwOTU1MTYxNUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIE5PIHBhcmVudGhlc2VzCisgICAgICAgICMgVGhpcyBmYWlsZWQgaW4gUHl0aG9uIDIuMiB0aHJvdWdoIDIuMi4yIGFuZCBpbiAyLjNhMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wbzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMG8xNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3LCAtMTg0NDY3NDQwNzM3MDk1NTE2MTVMKQorCisgICAgZGVmIHRlc3RfYmluX2Jhc2VsaW5lKHNlbGYpOgorICAgICAgICAjIEEgZmV3IHVwcGVyL2xvd2VyY2FzZSB0ZXN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBiMCwgMEIwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBiMSwgMEIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBiMTAxMDEwMTAxMDEsIDBCMTAxMDEwMTAxMDEpCisgICAgICAgICMgQmFzZWxpbmUgdGVzdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwYjAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMGIxMDAwMCwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExLCAyMTQ3NDgzNjQ3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExLCA5MjIzMzcyMDM2ODU0Nzc1ODA3KQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBwYXJlbnRoZXNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMGIwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDBiMTAwMDApLCAtMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEpLCAtMjE0NzQ4MzY0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExKSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDcpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIE5PIHBhcmVudGhlc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTBiMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMGIxMDAwMCwgLTE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEsIC0yMTQ3NDgzNjQ3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDcpCisKKyAgICBkZWYgdGVzdF9iaW5fdW5zaWduZWQoc2VsZik6CisgICAgICAgICMgUG9zaXRpdmUgY29uc3RhbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMGIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCwgMjE0NzQ4MzY0OEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSwgNDI5NDk2NzI5NUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIHBhcmVudGhlc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwYjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwKSwgLTIxNDc0ODM2NDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSksIC00Mjk0OTY3Mjk1TCkKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgTk8gcGFyZW50aGVzZXMKKyAgICAgICAgIyBUaGlzIGZhaWxlZCBpbiBQeXRob24gMi4yIHRocm91Z2ggMi4yLjIgYW5kIGluIDIuM2ExCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTBiMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsIC0yMTQ3NDgzNjQ4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSwgLTQyOTQ5NjcyOTVMKQorCisgICAgICAgICMgUG9zaXRpdmUgY29uc3RhbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMGIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLCA5MjIzMzcyMDM2ODU0Nzc1ODA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEsIDE4NDQ2NzQ0MDczNzA5NTUxNjE1TCkKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgcGFyZW50aGVzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDBiMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCksIC05MjIzMzcyMDM2ODU0Nzc1ODA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSksIC0xODQ0Njc0NDA3MzcwOTU1MTYxNUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIE5PIHBhcmVudGhlc2VzCisgICAgICAgICMgVGhpcyBmYWlsZWQgaW4gUHl0aG9uIDIuMiB0aHJvdWdoIDIuMi4yIGFuZCBpbiAyLjNhMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wYjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExLCAtMTg0NDY3NDQwNzM3MDk1NTE2MTVMKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0SGV4T2N0QmluKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnRfbGl0ZXJhbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnRfbGl0ZXJhbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3ZTJiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ludF9saXRlcmFsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnRfbGl0ZXJhbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnRfbGl0ZXJhbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3ZTJiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ludF9saXRlcmFsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pby5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTA1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pby5weQpAQCAtMCwwICsxLDMwODMgQEAKKyIiIlVuaXQgdGVzdHMgZm9yIHRoZSBpbyBtb2R1bGUuIiIiCisKKyMgVGVzdHMgb2YgaW8gYXJlIHNjYXR0ZXJlZCBvdmVyIHRoZSB0ZXN0IHN1aXRlOgorIyAqIHRlc3RfYnVmaW8gLSB0ZXN0cyBmaWxlIGJ1ZmZlcmluZworIyAqIHRlc3RfbWVtb3J5aW8gLSB0ZXN0cyBCeXRlc0lPIGFuZCBTdHJpbmdJTworIyAqIHRlc3RfZmlsZWlvIC0gdGVzdHMgRmlsZUlPCisjICogdGVzdF9maWxlIC0gdGVzdHMgdGhlIGZpbGUgaW50ZXJmYWNlCisjICogdGVzdF9pbyAtIHRlc3RzIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgaW8gbW9kdWxlCisjICogdGVzdF91bml2bmV3bGluZXMgLSB0ZXN0cyB1bml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0CisjICogdGVzdF9sYXJnZWZpbGUgLSB0ZXN0cyBvcGVyYXRpb25zIG9uIGEgZmlsZSBncmVhdGVyIHRoYW4gMioqMzIgYnl0ZXMKKyMgICAgIChvbmx5IGVuYWJsZWQgd2l0aCAtdWxhcmdlZmlsZSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQVRURU5USU9OIFRFU1QgV1JJVEVSUyEhIQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgV2hlbiB3cml0aW5nIHRlc3RzIGZvciBpbywgaXQncyBpbXBvcnRhbnQgdG8gdGVzdCBib3RoIHRoZSBDIGFuZCBQeXRob24KKyMgaW1wbGVtZW50YXRpb25zLiBUaGlzIGlzIHVzdWFsbHkgZG9uZSBieSB3cml0aW5nIGEgYmFzZSB0ZXN0IHRoYXQgcmVmZXJzIHRvCisjIHRoZSB0eXBlIGl0IGlzIHRlc3RpbmcgYXMgYSBhdHRyaWJ1dGUuIFRoZW4gaXQgcHJvdmlkZXMgY3VzdG9tIHN1YmNsYXNzZXMgdG8KKyMgdGVzdCBib3RoIGltcGxlbWVudGF0aW9ucy4gVGhpcyBmaWxlIGhhcyBsb3RzIG9mIGV4YW1wbGVzLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCBhcnJheQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2Vha3JlZgoraW1wb3J0IGFiYworaW1wb3J0IHNpZ25hbAoraW1wb3J0IGVycm5vCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY3ljbGUsIGNvdW50Citmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQorZnJvbSBVc2VyTGlzdCBpbXBvcnQgVXNlckxpc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0IGFzIHN1cHBvcnQKK2ltcG9ydCBjb250ZXh0bGliCisKK2ltcG9ydCBjb2RlY3MKK2ltcG9ydCBpbyAgIyBDIGltcGxlbWVudGF0aW9uIG9mIGlvCitpbXBvcnQgX3B5aW8gYXMgcHlpbyAjIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiBpbwordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCit0cnk6CisgICAgaW1wb3J0IGZjbnRsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZmNudGwgPSBOb25lCisKK19fbWV0YWNsYXNzX18gPSB0eXBlCitieXRlcyA9IHN1cHBvcnQucHkza19ieXRlcworCitkZWYgX2RlZmF1bHRfY2h1bmtfc2l6ZSgpOgorICAgICIiIkdldCB0aGUgZGVmYXVsdCBUZXh0SU9XcmFwcGVyIGNodW5rIHNpemUiIiIKKyAgICB3aXRoIGlvLm9wZW4oX19maWxlX18sICJyIiwgZW5jb2Rpbmc9ImxhdGluMSIpIGFzIGY6CisgICAgICAgIHJldHVybiBmLl9DSFVOS19TSVpFCisKKworY2xhc3MgTW9ja1Jhd0lPV2l0aG91dFJlYWQ6CisgICAgIiIiQSBSYXdJTyBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IHJlYWQoKSwgc28gYXMgdG8gZXhlcmNpc2UgdGhlIGRlZmF1bHQKKyAgICBSYXdJTy5yZWFkKCkgd2hpY2ggY2FsbHMgcmVhZGludG8oKS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWFkX3N0YWNrPSgpKToKKyAgICAgICAgc2VsZi5fcmVhZF9zdGFjayA9IGxpc3QocmVhZF9zdGFjaykKKyAgICAgICAgc2VsZi5fd3JpdGVfc3RhY2sgPSBbXQorICAgICAgICBzZWxmLl9yZWFkcyA9IDAKKyAgICAgICAgc2VsZi5fZXh0cmFuZW91c19yZWFkcyA9IDAKKworICAgIGRlZiB3cml0ZShzZWxmLCBiKToKKyAgICAgICAgc2VsZi5fd3JpdGVfc3RhY2suYXBwZW5kKGJ5dGVzKGIpKQorICAgICAgICByZXR1cm4gbGVuKGIpCisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICByZXR1cm4gNDIKKworICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZWVrYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlKToKKyAgICAgICAgcmV0dXJuIDAgICAjIHdyb25nIGJ1dCB3ZSBnb3R0YSByZXR1cm4gc29tZXRoaW5nCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgcmV0dXJuIDAgICAjIHNhbWUgY29tbWVudCBhcyBhYm92ZQorCisgICAgZGVmIHJlYWRpbnRvKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuX3JlYWRzICs9IDEKKyAgICAgICAgbWF4X2xlbiA9IGxlbihidWYpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9yZWFkX3N0YWNrWzBdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgc2VsZi5fZXh0cmFuZW91c19yZWFkcyArPSAxCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICBkZWwgc2VsZi5fcmVhZF9zdGFja1swXQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgbiA9IGxlbihkYXRhKQorICAgICAgICBpZiBsZW4oZGF0YSkgPD0gbWF4X2xlbjoKKyAgICAgICAgICAgIGRlbCBzZWxmLl9yZWFkX3N0YWNrWzBdCisgICAgICAgICAgICBidWZbOm5dID0gZGF0YQorICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJ1Zls6XSA9IGRhdGFbOm1heF9sZW5dCisgICAgICAgICAgICBzZWxmLl9yZWFkX3N0YWNrWzBdID0gZGF0YVttYXhfbGVuOl0KKyAgICAgICAgICAgIHJldHVybiBtYXhfbGVuCisKKyAgICBkZWYgdHJ1bmNhdGUoc2VsZiwgcG9zPU5vbmUpOgorICAgICAgICByZXR1cm4gcG9zCisKK2NsYXNzIENNb2NrUmF3SU9XaXRob3V0UmVhZChNb2NrUmF3SU9XaXRob3V0UmVhZCwgaW8uUmF3SU9CYXNlKToKKyAgICBwYXNzCisKK2NsYXNzIFB5TW9ja1Jhd0lPV2l0aG91dFJlYWQoTW9ja1Jhd0lPV2l0aG91dFJlYWQsIHB5aW8uUmF3SU9CYXNlKToKKyAgICBwYXNzCisKKworY2xhc3MgTW9ja1Jhd0lPKE1vY2tSYXdJT1dpdGhvdXRSZWFkKToKKworICAgIGRlZiByZWFkKHNlbGYsIG49Tm9uZSk6CisgICAgICAgIHNlbGYuX3JlYWRzICs9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfc3RhY2sucG9wKDApCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuX2V4dHJhbmVvdXNfcmVhZHMgKz0gMQorICAgICAgICAgICAgcmV0dXJuIGIiIgorCitjbGFzcyBDTW9ja1Jhd0lPKE1vY2tSYXdJTywgaW8uUmF3SU9CYXNlKToKKyAgICBwYXNzCisKK2NsYXNzIFB5TW9ja1Jhd0lPKE1vY2tSYXdJTywgcHlpby5SYXdJT0Jhc2UpOgorICAgIHBhc3MKKworCitjbGFzcyBNaXNiZWhhdmVkUmF3SU8oTW9ja1Jhd0lPKToKKyAgICBkZWYgd3JpdGUoc2VsZiwgYik6CisgICAgICAgIHJldHVybiBNb2NrUmF3SU8ud3JpdGUoc2VsZiwgYikgKiAyCisKKyAgICBkZWYgcmVhZChzZWxmLCBuPU5vbmUpOgorICAgICAgICByZXR1cm4gTW9ja1Jhd0lPLnJlYWQoc2VsZiwgbikgKiAyCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3MsIHdoZW5jZSk6CisgICAgICAgIHJldHVybiAtMTIzCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgcmV0dXJuIC00NTYKKworICAgIGRlZiByZWFkaW50byhzZWxmLCBidWYpOgorICAgICAgICBNb2NrUmF3SU8ucmVhZGludG8oc2VsZiwgYnVmKQorICAgICAgICByZXR1cm4gbGVuKGJ1ZikgKiA1CisKK2NsYXNzIENNaXNiZWhhdmVkUmF3SU8oTWlzYmVoYXZlZFJhd0lPLCBpby5SYXdJT0Jhc2UpOgorICAgIHBhc3MKKworY2xhc3MgUHlNaXNiZWhhdmVkUmF3SU8oTWlzYmVoYXZlZFJhd0lPLCBweWlvLlJhd0lPQmFzZSk6CisgICAgcGFzcworCisKK2NsYXNzIENsb3NlRmFpbHVyZUlPKE1vY2tSYXdJTyk6CisgICAgY2xvc2VkID0gMAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IDEKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IKKworY2xhc3MgQ0Nsb3NlRmFpbHVyZUlPKENsb3NlRmFpbHVyZUlPLCBpby5SYXdJT0Jhc2UpOgorICAgIHBhc3MKKworY2xhc3MgUHlDbG9zZUZhaWx1cmVJTyhDbG9zZUZhaWx1cmVJTywgcHlpby5SYXdJT0Jhc2UpOgorICAgIHBhc3MKKworCitjbGFzcyBNb2NrRmlsZUlPOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnJlYWRfaGlzdG9yeSA9IFtdCisgICAgICAgIHN1cGVyKE1vY2tGaWxlSU8sIHNlbGYpLl9faW5pdF9fKGRhdGEpCisKKyAgICBkZWYgcmVhZChzZWxmLCBuPU5vbmUpOgorICAgICAgICByZXMgPSBzdXBlcihNb2NrRmlsZUlPLCBzZWxmKS5yZWFkKG4pCisgICAgICAgIHNlbGYucmVhZF9oaXN0b3J5LmFwcGVuZChOb25lIGlmIHJlcyBpcyBOb25lIGVsc2UgbGVuKHJlcykpCisgICAgICAgIHJldHVybiByZXMKKworICAgIGRlZiByZWFkaW50byhzZWxmLCBiKToKKyAgICAgICAgcmVzID0gc3VwZXIoTW9ja0ZpbGVJTywgc2VsZikucmVhZGludG8oYikKKyAgICAgICAgc2VsZi5yZWFkX2hpc3RvcnkuYXBwZW5kKHJlcykKKyAgICAgICAgcmV0dXJuIHJlcworCitjbGFzcyBDTW9ja0ZpbGVJTyhNb2NrRmlsZUlPLCBpby5CeXRlc0lPKToKKyAgICBwYXNzCisKK2NsYXNzIFB5TW9ja0ZpbGVJTyhNb2NrRmlsZUlPLCBweWlvLkJ5dGVzSU8pOgorICAgIHBhc3MKKworCitjbGFzcyBNb2NrTm9uQmxvY2tXcml0ZXJJTzoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fd3JpdGVfc3RhY2sgPSBbXQorICAgICAgICBzZWxmLl9ibG9ja2VyX2NoYXIgPSBOb25lCisKKyAgICBkZWYgcG9wX3dyaXR0ZW4oc2VsZik6CisgICAgICAgIHMgPSBiIiIuam9pbihzZWxmLl93cml0ZV9zdGFjaykKKyAgICAgICAgc2VsZi5fd3JpdGVfc3RhY2tbOl0gPSBbXQorICAgICAgICByZXR1cm4gcworCisgICAgZGVmIGJsb2NrX29uKHNlbGYsIGNoYXIpOgorICAgICAgICAiIiJCbG9jayB3aGVuIGEgZ2l2ZW4gY2hhciBpcyBlbmNvdW50ZXJlZC4iIiIKKyAgICAgICAgc2VsZi5fYmxvY2tlcl9jaGFyID0gY2hhcgorCisgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNlZWthYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGIpOgorICAgICAgICBiID0gYnl0ZXMoYikKKyAgICAgICAgbiA9IC0xCisgICAgICAgIGlmIHNlbGYuX2Jsb2NrZXJfY2hhcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuID0gYi5pbmRleChzZWxmLl9ibG9ja2VyX2NoYXIpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG4gPiAwOgorICAgICAgICAgICAgICAgICAgICAjIHdyaXRlIGRhdGEgdXAgdG8gdGhlIGZpcnN0IGJsb2NrZXIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfc3RhY2suYXBwZW5kKGJbOm5dKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgY2FuY2VsIGJsb2NrZXIgYW5kIGluZGljYXRlIHdvdWxkIGJsb2NrCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Jsb2NrZXJfY2hhciA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgc2VsZi5fd3JpdGVfc3RhY2suYXBwZW5kKGIpCisgICAgICAgIHJldHVybiBsZW4oYikKKworY2xhc3MgQ01vY2tOb25CbG9ja1dyaXRlcklPKE1vY2tOb25CbG9ja1dyaXRlcklPLCBpby5SYXdJT0Jhc2UpOgorICAgIEJsb2NraW5nSU9FcnJvciA9IGlvLkJsb2NraW5nSU9FcnJvcgorCitjbGFzcyBQeU1vY2tOb25CbG9ja1dyaXRlcklPKE1vY2tOb25CbG9ja1dyaXRlcklPLCBweWlvLlJhd0lPQmFzZSk6CisgICAgQmxvY2tpbmdJT0Vycm9yID0gcHlpby5CbG9ja2luZ0lPRXJyb3IKKworCitjbGFzcyBJT1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgd3JpdGVfb3BzKHNlbGYsIGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGUoYiJibGFoLiIpLCA1KQorICAgICAgICBmLnRydW5jYXRlKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDUpCisgICAgICAgIGYuc2VlaygwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0ZShiImJsYWguIiksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGUoYiJIZWxsby4iKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWsoLTEsIDEpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGUoYnl0ZWFycmF5KGIiIHdvcmxkXG5cblxuIikpLCA5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlaygwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRlKGIiaCIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlaygtMSwgMiksIDEzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCAxMykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudHJ1bmNhdGUoMTIpLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgMTMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZi5zZWVrLCAwLjApCisKKyAgICBkZWYgcmVhZF9vcHMoc2VsZiwgZiwgYnVmZmVyZWQ9RmFsc2UpOgorICAgICAgICBkYXRhID0gZi5yZWFkKDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgYiJoZWxsbyIpCisgICAgICAgIGRhdGEgPSBieXRlYXJyYXkoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRpbnRvKGRhdGEpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGIiIHdvcmwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGludG8oZGF0YSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRhdGEpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGFbOjJdLCBiImRcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgyMCksIGIiaGVsbG8gd29ybGRcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKDEpLCBiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkaW50byhieXRlYXJyYXkoYiJ4IikpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlaygtNiwgMiksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKDUpLCBiIndvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoMCksIGIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRpbnRvKGJ5dGVhcnJheSgpKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWsoLTYsIDEpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCg1KSwgYiIgd29ybCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYuc2VlaywgMC4wKQorICAgICAgICBpZiBidWZmZXJlZDoKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiJoZWxsbyB3b3JsZFxuIikKKyAgICAgICAgICAgIGYuc2Vlayg2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiJ3b3JsZFxuIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGIiIikKKworICAgIExBUkdFID0gMioqMzEKKworICAgIGRlZiBsYXJnZV9maWxlX29wcyhzZWxmLCBmKToKKyAgICAgICAgYXNzZXJ0IGYucmVhZGFibGUoKQorICAgICAgICBhc3NlcnQgZi53cml0YWJsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKHNlbGYuTEFSR0UpLCBzZWxmLkxBUkdFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBzZWxmLkxBUkdFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGUoYiJ4eHgiKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgc2VsZi5MQVJHRSArIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKC0xLCAxKSwgc2VsZi5MQVJHRSArIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50cnVuY2F0ZSgpLCBzZWxmLkxBUkdFICsgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgc2VsZi5MQVJHRSArIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKDAsIDIpLCBzZWxmLkxBUkdFICsgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRydW5jYXRlKHNlbGYuTEFSR0UgKyAxKSwgc2VsZi5MQVJHRSArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIHNlbGYuTEFSR0UgKyAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlaygwLCAyKSwgc2VsZi5MQVJHRSArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKC0xLCAyKSwgc2VsZi5MQVJHRSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoMiksIGIieCIpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX29wZXJhdGlvbnMoc2VsZik6CisgICAgICAgICMgVHJ5IHdyaXRpbmcgb24gYSBmaWxlIG9wZW5lZCBpbiByZWFkIG1vZGUgYW5kIHZpY2UtdmVyc2EuCisgICAgICAgIGZvciBtb2RlIGluICgidyIsICJ3YiIpOgorICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sIG1vZGUpIGFzIGZwOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGZwLnJlYWQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZnAucmVhZGxpbmUpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGZwLndyaXRlLCBiImJsYWgiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZnAud3JpdGVsaW5lcywgW2IiYmxhaFxuIl0pCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAiciIpIGFzIGZwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZnAud3JpdGUsICJibGFoIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGZwLndyaXRlbGluZXMsIFsiYmxhaFxuIl0pCisKKyAgICBkZWYgdGVzdF9yYXdfZmlsZV9pbyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIsIGJ1ZmZlcmluZz0wKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRhYmxlKCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRhYmxlKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2Vla2FibGUoKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVfb3BzKGYpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiLCBidWZmZXJpbmc9MCkgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkYWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRhYmxlKCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWthYmxlKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLnJlYWRfb3BzKGYpCisKKyAgICBkZWYgdGVzdF9idWZmZXJlZF9maWxlX2lvKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkYWJsZSgpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0YWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWthYmxlKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLndyaXRlX29wcyhmKQorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInJiIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkYWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRhYmxlKCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWthYmxlKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLnJlYWRfb3BzKGYsIFRydWUpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGIiYWJjXG5kZWZcbnh5enp5XG5mb29ceDAwYmFyXG5hbm90aGVyIGxpbmUiKQorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInJiIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZSgpLCBiImFiY1xuIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZSgxMCksIGIiZGVmXG4iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lKDIpLCBiInh5IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZSg0KSwgYiJ6enlcbiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmUoKSwgYiJmb29ceDAwYmFyXG4iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lKE5vbmUpLCBiImFub3RoZXIgbGluZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYucmVhZGxpbmUsIDUuMykKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZi5yZWFkbGluZSwgNS4zKQorCisgICAgZGVmIHRlc3RfcmF3X2J5dGVzX2lvKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5CeXRlc0lPKCkKKyAgICAgICAgc2VsZi53cml0ZV9vcHMoZikKKyAgICAgICAgZGF0YSA9IGYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGIiaGVsbG8gd29ybGRcbiIpCisgICAgICAgIGYgPSBzZWxmLkJ5dGVzSU8oZGF0YSkKKyAgICAgICAgc2VsZi5yZWFkX29wcyhmLCBUcnVlKQorCisgICAgZGVmIHRlc3RfbGFyZ2VfZmlsZV9vcHMoc2VsZik6CisgICAgICAgICMgT24gV2luZG93cyBhbmQgTWFjIE9TWCB0aGlzIHRlc3QgY29tc3VtZXMgbGFyZ2UgcmVzb3VyY2VzOyBJdCB0YWtlcworICAgICAgICAjIGEgbG9uZyB0aW1lIHRvIGJ1aWxkIHRoZSA+MkdCIGZpbGUgYW5kIHRha2VzID4yR0Igb2YgZGlzayBzcGFjZQorICAgICAgICAjIHRoZXJlZm9yZSB0aGUgcmVzb3VyY2UgbXVzdCBiZSBlbmFibGVkIHRvIHJ1biB0aGlzIHRlc3QuCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbicgb3Igc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgaWYgbm90IHN1cHBvcnQuaXNfcmVzb3VyY2VfZW5hYmxlZCgibGFyZ2VmaWxlIik6CisgICAgICAgICAgICAgICAgcHJpbnQoIlxuVGVzdGluZyBsYXJnZSBmaWxlIG9wcyBza2lwcGVkIG9uICVzLiIgJSBzeXMucGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgICAgIHByaW50KCJJdCByZXF1aXJlcyAlZCBieXRlcyBhbmQgYSBsb25nIHRpbWUuIiAlIHNlbGYuTEFSR0UsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgICAgIHByaW50KCJVc2UgJ3JlZ3J0ZXN0LnB5IC11IGxhcmdlZmlsZSB0ZXN0X2lvJyB0byBydW4gaXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICBmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAidytiIiwgMCkgYXMgZjoKKyAgICAgICAgICAgIHNlbGYubGFyZ2VfZmlsZV9vcHMoZikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3K2IiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5sYXJnZV9maWxlX29wcyhmKQorCisgICAgZGVmIHRlc3Rfd2l0aF9vcGVuKHNlbGYpOgorICAgICAgICBmb3IgYnVmc2l6ZSBpbiAoMCwgMSwgMTAwKToKKyAgICAgICAgICAgIGYgPSBOb25lCisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIiwgYnVmc2l6ZSkgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKGIieHh4IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5jbG9zZWQsIFRydWUpCisgICAgICAgICAgICBmID0gTm9uZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiLCBidWZzaXplKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuY2xvc2VkLCBUcnVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIjEgLy8gMCBkaWRuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIikKKworICAgICMgaXNzdWUgNTAwOAorICAgIGRlZiB0ZXN0X2FwcGVuZF9tb2RlX3RlbGwoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShiInh4eCIpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAiYWIiLCBidWZmZXJpbmc9MCkgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDMpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAiYWIiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgMykKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJhIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLnRlbGwoKSA+IDApCisKKyAgICBkZWYgdGVzdF9kZXN0cnVjdG9yKHNlbGYpOgorICAgICAgICByZWNvcmQgPSBbXQorICAgICAgICBjbGFzcyBNeUZpbGVJTyhzZWxmLkZpbGVJTyk6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZWNvcmQuYXBwZW5kKDEpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmID0gc3VwZXIoTXlGaWxlSU8sIHNlbGYpLl9fZGVsX18KKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmKCkKKyAgICAgICAgICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgICAgICAgICByZWNvcmQuYXBwZW5kKDIpCisgICAgICAgICAgICAgICAgc3VwZXIoTXlGaWxlSU8sIHNlbGYpLmNsb3NlKCkKKyAgICAgICAgICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgICAgICAgICByZWNvcmQuYXBwZW5kKDMpCisgICAgICAgICAgICAgICAgc3VwZXIoTXlGaWxlSU8sIHNlbGYpLmZsdXNoKCkKKyAgICAgICAgZiA9IE15RmlsZUlPKHN1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICBmLndyaXRlKGIieHh4IikKKyAgICAgICAgZGVsIGYKKyAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNvcmQsIFsxLCAyLCAzXSkKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiInh4eCIpCisKKyAgICBkZWYgX2NoZWNrX2Jhc2VfZGVzdHJ1Y3RvcihzZWxmLCBiYXNlKToKKyAgICAgICAgcmVjb3JkID0gW10KKyAgICAgICAgY2xhc3MgTXlJTyhiYXNlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAjIFRoaXMgZXhlcmNpc2VzIHRoZSBhdmFpbGFiaWxpdHkgb2YgYXR0cmlidXRlcyBvbiBvYmplY3QKKyAgICAgICAgICAgICAgICAjIGRlc3RydWN0aW9uLgorICAgICAgICAgICAgICAgICMgKGluIHRoZSBDIHZlcnNpb24sIGNsb3NlKCkgaXMgY2FsbGVkIGJ5IHRoZSB0cF9kZWFsbG9jCisgICAgICAgICAgICAgICAgIyBmdW5jdGlvbiwgbm90IGJ5IF9fZGVsX18pCisgICAgICAgICAgICAgICAgc2VsZi5vbl9kZWwgPSAxCisgICAgICAgICAgICAgICAgc2VsZi5vbl9jbG9zZSA9IDIKKyAgICAgICAgICAgICAgICBzZWxmLm9uX2ZsdXNoID0gMworICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZChzZWxmLm9uX2RlbCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGYgPSBzdXBlcihNeUlPLCBzZWxmKS5fX2RlbF9fCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZigpCisgICAgICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZChzZWxmLm9uX2Nsb3NlKQorICAgICAgICAgICAgICAgIHN1cGVyKE15SU8sIHNlbGYpLmNsb3NlKCkKKyAgICAgICAgICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgICAgICAgICByZWNvcmQuYXBwZW5kKHNlbGYub25fZmx1c2gpCisgICAgICAgICAgICAgICAgc3VwZXIoTXlJTywgc2VsZikuZmx1c2goKQorICAgICAgICBmID0gTXlJTygpCisgICAgICAgIGRlbCBmCisgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjb3JkLCBbMSwgMiwgM10pCisKKyAgICBkZWYgdGVzdF9JT0Jhc2VfZGVzdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfYmFzZV9kZXN0cnVjdG9yKHNlbGYuSU9CYXNlKQorCisgICAgZGVmIHRlc3RfUmF3SU9CYXNlX2Rlc3RydWN0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX2Jhc2VfZGVzdHJ1Y3RvcihzZWxmLlJhd0lPQmFzZSkKKworICAgIGRlZiB0ZXN0X0J1ZmZlcmVkSU9CYXNlX2Rlc3RydWN0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX2Jhc2VfZGVzdHJ1Y3RvcihzZWxmLkJ1ZmZlcmVkSU9CYXNlKQorCisgICAgZGVmIHRlc3RfVGV4dElPQmFzZV9kZXN0cnVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19iYXNlX2Rlc3RydWN0b3Ioc2VsZi5UZXh0SU9CYXNlKQorCisgICAgZGVmIHRlc3RfY2xvc2VfZmx1c2hlcyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGIieHh4IikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiInh4eCIpCisKKyAgICBkZWYgdGVzdF9hcnJheV93cml0ZXMoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShiJ2knLCByYW5nZSgxMCkpCisgICAgICAgIG4gPSBsZW4oYS50b3N0cmluZygpKQorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIiwgMCkgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0ZShhKSwgbikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGUoYSksIG4pCisKKyAgICBkZWYgdGVzdF9jbG9zZWZkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLm9wZW4sIHN1cHBvcnQuVEVTVEZOLCAndycsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlZmQ9RmFsc2UpCisKKyAgICBkZWYgdGVzdF9yZWFkX2Nsb3NlZChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3IikgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoImVnZ1xuIikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyIikgYXMgZjoKKyAgICAgICAgICAgIGZpbGUgPSBzZWxmLm9wZW4oZi5maWxlbm8oKSwgInIiLCBjbG9zZWZkPUZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlLnJlYWQoKSwgImVnZ1xuIikKKyAgICAgICAgICAgIGZpbGUuc2VlaygwKQorICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmaWxlLnJlYWQpCisKKyAgICBkZWYgdGVzdF9ub19jbG9zZWZkX3dpdGhfZmlsZW5hbWUoc2VsZik6CisgICAgICAgICMgY2FuJ3QgdXNlIGNsb3NlZmQgaW4gY29tYmluYXRpb24gd2l0aCBhIGZpbGUgbmFtZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLm9wZW4sIHN1cHBvcnQuVEVTVEZOLCAiciIsIGNsb3NlZmQ9RmFsc2UpCisKKyAgICBkZWYgdGVzdF9jbG9zZWZkX2F0dHIoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShiImVnZ1xuIikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5idWZmZXIucmF3LmNsb3NlZmQsIFRydWUpCisgICAgICAgICAgICBmaWxlID0gc2VsZi5vcGVuKGYuZmlsZW5vKCksICJyIiwgY2xvc2VmZD1GYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZS5idWZmZXIucmF3LmNsb3NlZmQsIEZhbHNlKQorCisgICAgZGVmIHRlc3RfZ2FyYmFnZV9jb2xsZWN0aW9uKHNlbGYpOgorICAgICAgICAjIEZpbGVJTyBvYmplY3RzIGFyZSBjb2xsZWN0ZWQsIGFuZCBjb2xsZWN0aW5nIHRoZW0gZmx1c2hlcworICAgICAgICAjIGFsbCBkYXRhIHRvIGRpc2suCisgICAgICAgIGYgPSBzZWxmLkZpbGVJTyhzdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgZi53cml0ZShiImFiY3h4eCIpCisgICAgICAgIGYuZiA9IGYKKyAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZihmKQorICAgICAgICBkZWwgZgorICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod3IoKSBpcyBOb25lLCB3cikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiImFiY3h4eCIpCisKKyAgICBkZWYgdGVzdF91bmJvdW5kZWRfZmlsZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTE3NDYwNjogcmVhZGluZyBmcm9tIGFuIHVuYm91bmRlZCBzdHJlYW0gc3VjaCBhcyAvZGV2L3plcm8uCisgICAgICAgIHplcm8gPSAiL2Rldi96ZXJvIgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoemVybyk6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJ7MH0gZG9lcyBub3QgZXhpc3QiLmZvcm1hdCh6ZXJvKSkKKyAgICAgICAgaWYgc3lzLm1heHNpemUgPiAweDdGRkZGRkZGOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgidGVzdCBjYW4gb25seSBydW4gaW4gYSAzMi1iaXQgYWRkcmVzcyBzcGFjZSIpCisgICAgICAgIGlmIHN1cHBvcnQucmVhbF9tYXhfbWVtdXNlIDwgc3VwcG9ydC5fMkc6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJ0ZXN0IHJlcXVpcmVzIGF0IGxlYXN0IDJHQiBvZiBtZW1vcnkiKQorICAgICAgICB3aXRoIHNlbGYub3Blbih6ZXJvLCAicmIiLCBidWZmZXJpbmc9MCkgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGYucmVhZCkKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oemVybywgInJiIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGYucmVhZCkKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oemVybywgInIiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZi5yZWFkKQorCisgICAgZGVmIHRlc3RfZmx1c2hfZXJyb3Jfb25fY2xvc2Uoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIsIGJ1ZmZlcmluZz0wKQorICAgICAgICBkZWYgYmFkX2ZsdXNoKCk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCkKKyAgICAgICAgZi5mbHVzaCA9IGJhZF9mbHVzaAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBmLmNsb3NlKSAjIGV4Y2VwdGlvbiBub3Qgc3dhbGxvd2VkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmNsb3NlZCkKKworICAgIGRlZiB0ZXN0X211bHRpX2Nsb3NlKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiLCBidWZmZXJpbmc9MCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5mbHVzaCkKKworICAgIGRlZiB0ZXN0X1Jhd0lPQmFzZV9yZWFkKHNlbGYpOgorICAgICAgICAjIEV4ZXJjaXNlIHRoZSBkZWZhdWx0IFJhd0lPQmFzZS5yZWFkKCkgaW1wbGVtZW50YXRpb24gKHdoaWNoIGNhbGxzCisgICAgICAgICMgcmVhZGludG8oKSBpbnRlcm5hbGx5KS4KKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJT1dpdGhvdXRSZWFkKChiImFiYyIsIGIiZCIsIE5vbmUsIGIiZWZnIiwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3aW8ucmVhZCgyKSwgYiJhYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3aW8ucmVhZCgyKSwgYiJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdpby5yZWFkKDIpLCBiImQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLnJlYWQoMiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3aW8ucmVhZCgyKSwgYiJlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3aW8ucmVhZCgyKSwgYiJnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdpby5yZWFkKDIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLnJlYWQoMiksIGIiIikKKworICAgIGRlZiB0ZXN0X2ZpbGVpb19jbG9zZWZkKHNlbGYpOgorICAgICAgICAjIElzc3VlICM0ODQxCisgICAgICAgIHdpdGggc2VsZi5vcGVuKF9fZmlsZV9fLCAncmInKSBhcyBmMSwgXAorICAgICAgICAgICAgIHNlbGYub3BlbihfX2ZpbGVfXywgJ3JiJykgYXMgZjI6CisgICAgICAgICAgICBmaWxlaW8gPSBzZWxmLkZpbGVJTyhmMS5maWxlbm8oKSwgY2xvc2VmZD1GYWxzZSkKKyAgICAgICAgICAgICMgLl9faW5pdF9fKCkgbXVzdCBub3QgY2xvc2UgZjEKKyAgICAgICAgICAgIGZpbGVpby5fX2luaXRfXyhmMi5maWxlbm8oKSwgY2xvc2VmZD1GYWxzZSkKKyAgICAgICAgICAgIGYxLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICMgLmNsb3NlKCkgbXVzdCBub3QgY2xvc2UgZjIKKyAgICAgICAgICAgIGZpbGVpby5jbG9zZSgpCisgICAgICAgICAgICBmMi5yZWFkbGluZSgpCisKKworY2xhc3MgQ0lPVGVzdChJT1Rlc3QpOgorCisgICAgZGVmIHRlc3RfSU9CYXNlX2ZpbmFsaXplKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMjE0OTogc2VnbWVudGF0aW9uIGZhdWx0IG9uIF9QeUlPQmFzZV9maW5hbGl6ZSB3aGVuIGJvdGggYQorICAgICAgICAjIGNsYXNzIHdoaWNoIGluaGVyaXRzIElPQmFzZSBhbmQgYW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgYXJlIGNhdWdodAorICAgICAgICAjIGluIGEgcmVmZXJlbmNlIGN5Y2xlIGFuZCBjbG9zZSgpIGlzIGFscmVhZHkgaW4gdGhlIG1ldGhvZCBjYWNoZS4KKyAgICAgICAgY2xhc3MgTXlJTyhzZWxmLklPQmFzZSk6CisgICAgICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgY3JlYXRlIGFuIGluc3RhbmNlIHRvIHBvcHVsYXRlIHRoZSBtZXRob2QgY2FjaGUKKyAgICAgICAgTXlJTygpCisgICAgICAgIG9iaiA9IE15SU8oKQorICAgICAgICBvYmoub2JqID0gb2JqCisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYob2JqKQorICAgICAgICBkZWwgTXlJTworICAgICAgICBkZWwgb2JqCisgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3cigpIGlzIE5vbmUsIHdyKQorCitjbGFzcyBQeUlPVGVzdChJT1Rlc3QpOgorICAgIHRlc3RfYXJyYXlfd3JpdGVzID0gdW5pdHRlc3Quc2tpcCgKKyAgICAgICAgImxlbihhcnJheS5hcnJheSkgcmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMgcmF0aGVyIHRoYW4gYnl0ZWxlbmd0aCIKKyAgICApKElPVGVzdC50ZXN0X2FycmF5X3dyaXRlcykKKworCitjbGFzcyBDb21tb25CdWZmZXJlZFRlc3RzOgorICAgICMgVGVzdHMgY29tbW9uIHRvIEJ1ZmZlcmVkUmVhZGVyLCBCdWZmZXJlZFdyaXRlciBhbmQgQnVmZmVyZWRSYW5kb20KKworICAgIGRlZiB0ZXN0X2RldGFjaChzZWxmKToKKyAgICAgICAgcmF3ID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWYgPSBzZWxmLnRwKHJhdykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhidWYuZGV0YWNoKCksIHJhdykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmLmRldGFjaCkKKworICAgIGRlZiB0ZXN0X2ZpbGVubyhzZWxmKToKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBidWZpby5maWxlbm8oKSkKKworICAgIGRlZiB0ZXN0X25vX2ZpbGVubyhzZWxmKToKKyAgICAgICAgIyBYWFggd2lsbCB3ZSBhbHdheXMgaGF2ZSBmaWxlbm8oKSBmdW5jdGlvbj8gSWYgc28sIGtpbGwKKyAgICAgICAgIyB0aGlzIHRlc3QuIEVsc2UsIHdyaXRlIGl0LgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2FyZ3Moc2VsZik6CisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8pCisgICAgICAgICMgSW52YWxpZCB3aGVuY2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmaW8uc2VlaywgMCwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLnNlZWssIDAsIDMpCisKKyAgICBkZWYgdGVzdF9vdmVycmlkZV9kZXN0cnVjdG9yKHNlbGYpOgorICAgICAgICB0cCA9IHNlbGYudHAKKyAgICAgICAgcmVjb3JkID0gW10KKyAgICAgICAgY2xhc3MgTXlCdWZmZXJlZElPKHRwKToKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlY29yZC5hcHBlbmQoMSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGYgPSBzdXBlcihNeUJ1ZmZlcmVkSU8sIHNlbGYpLl9fZGVsX18KKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmKCkKKyAgICAgICAgICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgICAgICAgICByZWNvcmQuYXBwZW5kKDIpCisgICAgICAgICAgICAgICAgc3VwZXIoTXlCdWZmZXJlZElPLCBzZWxmKS5jbG9zZSgpCisgICAgICAgICAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZCgzKQorICAgICAgICAgICAgICAgIHN1cGVyKE15QnVmZmVyZWRJTywgc2VsZikuZmx1c2goKQorICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYnVmaW8gPSBNeUJ1ZmZlcmVkSU8ocmF3aW8pCisgICAgICAgIHdyaXRhYmxlID0gYnVmaW8ud3JpdGFibGUoKQorICAgICAgICBkZWwgYnVmaW8KKyAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgaWYgd3JpdGFibGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY29yZCwgWzEsIDIsIDNdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNvcmQsIFsxLCAyXSkKKworICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcihzZWxmKToKKyAgICAgICAgIyBUZXN0IHVzYWJpbGl0eSBhcyBhIGNvbnRleHQgbWFuYWdlcgorICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvKQorICAgICAgICBkZWYgX3dpdGgoKToKKyAgICAgICAgICAgIHdpdGggYnVmaW86CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBfd2l0aCgpCisgICAgICAgICMgYnVmaW8gc2hvdWxkIG5vdyBiZSBjbG9zZWQsIGFuZCB1c2luZyBpdCBhIHNlY29uZCB0aW1lIHNob3VsZCByYWlzZQorICAgICAgICAjIGEgVmFsdWVFcnJvci4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgX3dpdGgpCisKKyAgICBkZWYgdGVzdF9lcnJvcl90aHJvdWdoX2Rlc3RydWN0b3Ioc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRoZSBleGNlcHRpb24gc3RhdGUgaXMgbm90IG1vZGlmaWVkIGJ5IGEgZGVzdHJ1Y3RvciwKKyAgICAgICAgIyBldmVuIGlmIGNsb3NlKCkgZmFpbHMuCisgICAgICAgIHJhd2lvID0gc2VsZi5DbG9zZUZhaWx1cmVJTygpCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBzZWxmLnRwKHJhd2lvKS54eXp6eQorICAgICAgICB3aXRoIHN1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCJzdGRlcnIiKSBhcyBzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGYpCisgICAgICAgIHMgPSBzLmdldHZhbHVlKCkuc3RyaXAoKQorICAgICAgICBpZiBzOgorICAgICAgICAgICAgIyBUaGUgZGVzdHJ1Y3RvciAqbWF5KiBoYXZlIHByaW50ZWQgYW4gdW5yYWlzYWJsZSBlcnJvciwgY2hlY2sgaXQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMuc3BsaXRsaW5lcygpKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoIkV4Y2VwdGlvbiBJT0Vycm9yOiAiKSwgcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmVuZHN3aXRoKCIgaWdub3JlZCIpLCBzKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgcmF3ID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBiID0gc2VsZi50cChyYXcpCisgICAgICAgIGNsc25hbWUgPSAiJXMuJXMiICUgKHNlbGYudHAuX19tb2R1bGVfXywgc2VsZi50cC5fX25hbWVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGIpLCAiPCVzPiIgJSBjbHNuYW1lKQorICAgICAgICByYXcubmFtZSA9ICJkdW1teSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGIpLCAiPCVzIG5hbWU9dSdkdW1teSc+IiAlIGNsc25hbWUpCisgICAgICAgIHJhdy5uYW1lID0gYiJkdW1teSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGIpLCAiPCVzIG5hbWU9J2R1bW15Jz4iICUgY2xzbmFtZSkKKworICAgIGRlZiB0ZXN0X2ZsdXNoX2Vycm9yX29uX2Nsb3NlKHNlbGYpOgorICAgICAgICByYXcgPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGRlZiBiYWRfZmx1c2goKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoKQorICAgICAgICByYXcuZmx1c2ggPSBiYWRfZmx1c2gKKyAgICAgICAgYiA9IHNlbGYudHAocmF3KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBiLmNsb3NlKSAjIGV4Y2VwdGlvbiBub3Qgc3dhbGxvd2VkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiLmNsb3NlZCkKKworICAgIGRlZiB0ZXN0X2Nsb3NlX2Vycm9yX29uX2Nsb3NlKHNlbGYpOgorICAgICAgICByYXcgPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGRlZiBiYWRfZmx1c2goKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ2ZsdXNoJykKKyAgICAgICAgZGVmIGJhZF9jbG9zZSgpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignY2xvc2UnKQorICAgICAgICByYXcuY2xvc2UgPSBiYWRfY2xvc2UKKyAgICAgICAgYiA9IHNlbGYudHAocmF3KQorICAgICAgICBiLmZsdXNoID0gYmFkX2ZsdXNoCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvcikgYXMgZXJyOiAjIGV4Y2VwdGlvbiBub3Qgc3dhbGxvd2VkCisgICAgICAgICAgICBiLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuZXhjZXB0aW9uLmFyZ3MsICgnY2xvc2UnLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYi5jbG9zZWQpCisKKyAgICBkZWYgdGVzdF9tdWx0aV9jbG9zZShzZWxmKToKKyAgICAgICAgcmF3ID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBiID0gc2VsZi50cChyYXcpCisgICAgICAgIGIuY2xvc2UoKQorICAgICAgICBiLmNsb3NlKCkKKyAgICAgICAgYi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGIuZmx1c2gpCisKKyAgICBkZWYgdGVzdF9yZWFkb25seV9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICByYXcgPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZiA9IHNlbGYudHAocmF3KQorICAgICAgICB4ID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKSk6CisgICAgICAgICAgICBidWYucmF3ID0geAorCisKK2NsYXNzIFNpemVvZlRlc3Q6CisKKyAgICBAc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9zaXplb2Yoc2VsZik6CisgICAgICAgIGJ1ZnNpemUxID0gNDA5NgorICAgICAgICBidWZzaXplMiA9IDgxOTIKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbywgYnVmZmVyX3NpemU9YnVmc2l6ZTEpCisgICAgICAgIHNpemUgPSBzeXMuZ2V0c2l6ZW9mKGJ1ZmlvKSAtIGJ1ZnNpemUxCisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8sIGJ1ZmZlcl9zaXplPWJ1ZnNpemUyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRzaXplb2YoYnVmaW8pLCBzaXplICsgYnVmc2l6ZTIpCisKKworY2xhc3MgQnVmZmVyZWRSZWFkZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlLCBDb21tb25CdWZmZXJlZFRlc3RzKToKKyAgICByZWFkX21vZGUgPSAicmIiCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTyhbYiJhYmMiXSkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvKQorICAgICAgICBidWZpby5fX2luaXRfXyhyYXdpbykKKyAgICAgICAgYnVmaW8uX19pbml0X18ocmF3aW8sIGJ1ZmZlcl9zaXplPTEwMjQpCisgICAgICAgIGJ1ZmlvLl9faW5pdF9fKHJhd2lvLCBidWZmZXJfc2l6ZT0xNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFiYyIsIGJ1ZmlvLnJlYWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmaW8uX19pbml0X18sIHJhd2lvLCBidWZmZXJfc2l6ZT0wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5fX2luaXRfXywgcmF3aW8sIGJ1ZmZlcl9zaXplPS0xNikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmaW8uX19pbml0X18sIHJhd2lvLCBidWZmZXJfc2l6ZT0tMSkKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTyhbYiJhYmMiXSkKKyAgICAgICAgYnVmaW8uX19pbml0X18ocmF3aW8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmMiLCBidWZpby5yZWFkKCkpCisKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBmb3IgYXJnIGluIChOb25lLCA3KToKKyAgICAgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKGIiYWJjIiwgYiJkIiwgYiJlZmciKSkKKyAgICAgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmNkZWZnIiwgYnVmaW8ucmVhZChhcmcpKQorICAgICAgICAjIEludmFsaWQgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5yZWFkLCAtMikKKworICAgIGRlZiB0ZXN0X3JlYWQxKHNlbGYpOgorICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKChiImFiYyIsIGIiZCIsIGIiZWZnIikpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImEiLCBidWZpby5yZWFkKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYiIsIGJ1ZmlvLnJlYWQxKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLl9yZWFkcywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImMiLCBidWZpby5yZWFkMSgxMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLl9yZWFkcywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImQiLCBidWZpby5yZWFkMSgxMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLl9yZWFkcywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImVmZyIsIGJ1ZmlvLnJlYWQxKDEwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3aW8uX3JlYWRzLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiIiwgYnVmaW8ucmVhZDEoMTAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdpby5fcmVhZHMsIDQpCisgICAgICAgICMgSW52YWxpZCBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLnJlYWQxLCAtMSkKKworICAgIGRlZiB0ZXN0X3JlYWRpbnRvKHNlbGYpOgorICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKChiImFiYyIsIGIiZCIsIGIiZWZnIikpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgYiA9IGJ5dGVhcnJheSgyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLnJlYWRpbnRvKGIpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiYWIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLnJlYWRpbnRvKGIpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiY2QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLnJlYWRpbnRvKGIpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLnJlYWRpbnRvKGIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiZ2YiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLnJlYWRpbnRvKGIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiZ2YiKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICBkZWYgYnVmaW8oKToKKyAgICAgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKGIiYWJjXG4iLCBiImRcbiIsIGIiZWYiKSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRwKHJhd2lvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvKCkucmVhZGxpbmVzKCksIFtiImFiY1xuIiwgYiJkXG4iLCBiImVmIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8oKS5yZWFkbGluZXMoNSksIFtiImFiY1xuIiwgYiJkXG4iXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpbygpLnJlYWRsaW5lcyhOb25lKSwgW2IiYWJjXG4iLCBiImRcbiIsIGIiZWYiXSkKKworICAgIGRlZiB0ZXN0X2J1ZmZlcmluZyhzZWxmKToKKyAgICAgICAgZGF0YSA9IGIiYWJjZGVmZ2hpIgorICAgICAgICBkbGVuID0gbGVuKGRhdGEpCisKKyAgICAgICAgdGVzdHMgPSBbCisgICAgICAgICAgICBbIDEwMCwgWyAzLCAxLCA0LCA4IF0sIFsgZGxlbiwgMCBdIF0sCisgICAgICAgICAgICBbIDEwMCwgWyAzLCAzLCAzXSwgICAgIFsgZGxlbiBdICAgIF0sCisgICAgICAgICAgICBbICAgNCwgWyAxLCAyLCA0LCAyIF0sIFsgNCwgNCwgMSBdIF0sCisgICAgICAgIF0KKworICAgICAgICBmb3IgYnVmc2l6ZSwgYnVmX3JlYWRfc2l6ZXMsIHJhd19yZWFkX3NpemVzIGluIHRlc3RzOgorICAgICAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tGaWxlSU8oZGF0YSkKKyAgICAgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbywgYnVmZmVyX3NpemU9YnVmc2l6ZSkKKyAgICAgICAgICAgIHBvcyA9IDAKKyAgICAgICAgICAgIGZvciBuYnl0ZXMgaW4gYnVmX3JlYWRfc2l6ZXM6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby5yZWFkKG5ieXRlcyksIGRhdGFbcG9zOnBvcytuYnl0ZXNdKQorICAgICAgICAgICAgICAgIHBvcyArPSBuYnl0ZXMKKyAgICAgICAgICAgICMgdGhpcyBpcyBtaWxkbHkgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLnJlYWRfaGlzdG9yeSwgcmF3X3JlYWRfc2l6ZXMpCisKKyAgICBkZWYgdGVzdF9yZWFkX25vbl9ibG9ja2luZyhzZWxmKToKKyAgICAgICAgIyBJbmplY3Qgc29tZSBOb25lJ3MgaW4gdGhlcmUgdG8gc2ltdWxhdGUgRVdPVUxEQkxPQ0sKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygoYiJhYmMiLCBiImQiLCBOb25lLCBiImVmZyIsIE5vbmUsIE5vbmUsIE5vbmUpKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmNkIiwgYnVmaW8ucmVhZCg2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImUiLCBidWZpby5yZWFkKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiZmciLCBidWZpby5yZWFkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiIiLCBidWZpby5wZWVrKDEpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShidWZpby5yZWFkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiIiLCBidWZpby5yZWFkKCkpCisKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygoYiJhIiwgTm9uZSwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhIiwgcmF3aW8ucmVhZGFsbCgpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyYXdpby5yZWFkYWxsKCkpCisKKyAgICBkZWYgdGVzdF9yZWFkX3Bhc3RfZW9mKHNlbGYpOgorICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKChiImFiYyIsIGIiZCIsIGIiZWZnIikpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjZGVmZyIsIGJ1ZmlvLnJlYWQoOTAwMCkpCisKKyAgICBkZWYgdGVzdF9yZWFkX2FsbChzZWxmKToKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygoYiJhYmMiLCBiImQiLCBiImVmZyIpKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFiY2RlZmciLCBidWZpby5yZWFkKCkpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIEBzdXBwb3J0LnJlcXVpcmVzX3Jlc291cmNlKCdjcHUnKQorICAgIGRlZiB0ZXN0X3RocmVhZHMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgV3JpdGUgb3V0IG1hbnkgYnl0ZXMgd2l0aCBleGFjdGx5IHRoZSBzYW1lIG51bWJlciBvZiAwJ3MsCisgICAgICAgICAgICAjIDEncy4uLiAyNTUncy4gVGhpcyB3aWxsIGhlbHAgdXMgY2hlY2sgdGhhdCBjb25jdXJyZW50IHJlYWRpbmcKKyAgICAgICAgICAgICMgZG9lc24ndCBkdXBsaWNhdGUgb3IgZm9yZ2V0IGNvbnRlbnRzLgorICAgICAgICAgICAgTiA9IDEwMDAKKyAgICAgICAgICAgIGwgPSBsaXN0KHJhbmdlKDI1NikpICogTgorICAgICAgICAgICAgcmFuZG9tLnNodWZmbGUobCkKKyAgICAgICAgICAgIHMgPSBieXRlcyhieXRlYXJyYXkobCkpCisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKHMpCisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgc2VsZi5yZWFkX21vZGUsIGJ1ZmZlcmluZz0wKSBhcyByYXc6CisgICAgICAgICAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhdywgOCkKKyAgICAgICAgICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBbXQorICAgICAgICAgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSW50cmEtYnVmZmVyIHJlYWQgdGhlbiBidWZmZXItZmx1c2hpbmcgcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG4gaW4gY3ljbGUoWzEsIDE5XSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGJ1ZmlvLnJlYWQobikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxpc3QuYXBwZW5kKCkgaXMgYXRvbWljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQocykKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICB0aHJlYWRzID0gW3RocmVhZGluZy5UaHJlYWQodGFyZ2V0PWYpIGZvciB4IGluIHJhbmdlKDIwKV0KKyAgICAgICAgICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDIpICMgeWllbGQKKyAgICAgICAgICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgICAgICAgICB0LmpvaW4oKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZXJyb3JzLAorICAgICAgICAgICAgICAgICAgICAidGhlIGZvbGxvd2luZyBleGNlcHRpb25zIHdlcmUgY2F1Z2h0OiAlciIgJSBlcnJvcnMpCisgICAgICAgICAgICAgICAgcyA9IGInJy5qb2luKHJlc3VsdHMpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgICAgICAgICAgYyA9IGJ5dGVzKGJ5dGVhcnJheShbaV0pKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoYyksIE4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X21pc2JlaGF2ZWRfaW8oc2VsZik6CisgICAgICAgIHJhd2lvID0gc2VsZi5NaXNiZWhhdmVkUmF3SU8oKGIiYWJjIiwgYiJkIiwgYiJlZmciKSkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBidWZpby5zZWVrLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBidWZpby50ZWxsKQorCisgICAgZGVmIHRlc3Rfbm9fZXh0cmFuZW91c19yZWFkKHNlbGYpOgorICAgICAgICAjIElzc3VlICM5NTUwOyB3aGVuIHRoZSByYXcgSU8gb2JqZWN0IGhhcyBzYXRpc2ZpZWQgdGhlIHJlYWQgcmVxdWVzdCwKKyAgICAgICAgIyB3ZSBzaG91bGQgbm90IGlzc3VlIGFueSBhZGRpdGlvbmFsIHJlYWRzLCBvdGhlcndpc2UgaXQgbWF5IGJsb2NrCisgICAgICAgICMgKGUuZy4gc29ja2V0KS4KKyAgICAgICAgYnVmc2l6ZSA9IDE2CisgICAgICAgIGZvciBuIGluICgyLCBidWZzaXplIC0gMSwgYnVmc2l6ZSwgYnVmc2l6ZSArIDEsIGJ1ZnNpemUgKiAyKToKKyAgICAgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oW2IieCIgKiBuXSkKKyAgICAgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbywgYnVmc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ucmVhZChuKSwgYiJ4IiAqIG4pCisgICAgICAgICAgICAjIFNpbXBsZSBjYXNlOiBvbmUgcmF3IHJlYWQgaXMgZW5vdWdoIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLl9leHRyYW5lb3VzX3JlYWRzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIGZvciB7fToge30gIT0gMCIuZm9ybWF0KG4sIHJhd2lvLl9leHRyYW5lb3VzX3JlYWRzKSkKKyAgICAgICAgICAgICMgQSBtb3JlIGNvbXBsZXggY2FzZSB3aGVyZSB0d28gcmF3IHJlYWRzIGFyZSBuZWVkZWQgdG8gc2F0aXNmeQorICAgICAgICAgICAgIyB0aGUgcmVxdWVzdC4KKyAgICAgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oW2IieCIgKiAobiAtIDEpLCBiIngiXSkKKyAgICAgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbywgYnVmc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ucmVhZChuKSwgYiJ4IiAqIG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLl9leHRyYW5lb3VzX3JlYWRzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIGZvciB7fToge30gIT0gMCIuZm9ybWF0KG4sIHJhd2lvLl9leHRyYW5lb3VzX3JlYWRzKSkKKworCitjbGFzcyBDQnVmZmVyZWRSZWFkZXJUZXN0KEJ1ZmZlcmVkUmVhZGVyVGVzdCwgU2l6ZW9mVGVzdCk6CisgICAgdHAgPSBpby5CdWZmZXJlZFJlYWRlcgorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyVGVzdC50ZXN0X2NvbnN0cnVjdG9yKHNlbGYpCisgICAgICAgICMgVGhlIGFsbG9jYXRpb24gY2FuIHN1Y2NlZWQgb24gMzItYml0IGJ1aWxkcywgZS5nLiB3aXRoIG1vcmUKKyAgICAgICAgIyB0aGFuIDJHQiBSQU0gYW5kIGEgNjQtYml0IGtlcm5lbC4KKyAgICAgICAgaWYgc3lzLm1heHNpemUgPiAweDdGRkZGRkZGOgorICAgICAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoT3ZlcmZsb3dFcnJvciwgTWVtb3J5RXJyb3IsIFZhbHVlRXJyb3IpLAorICAgICAgICAgICAgICAgIGJ1ZmlvLl9faW5pdF9fLCByYXdpbywgc3lzLm1heHNpemUpCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXphdGlvbihzZWxmKToKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTyhbYiJhYmMiXSkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5fX2luaXRfXywgcmF3aW8sIGJ1ZmZlcl9zaXplPTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLnJlYWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLl9faW5pdF9fLCByYXdpbywgYnVmZmVyX3NpemU9LTE2KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5yZWFkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5fX2luaXRfXywgcmF3aW8sIGJ1ZmZlcl9zaXplPS0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5yZWFkKQorCisgICAgZGVmIHRlc3RfbWlzYmVoYXZlZF9pb19yZWFkKHNlbGYpOgorICAgICAgICByYXdpbyA9IHNlbGYuTWlzYmVoYXZlZFJhd0lPKChiImFiYyIsIGIiZCIsIGIiZWZnIikpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgIyBfcHlpby5CdWZmZXJlZFJlYWRlciBzZWVtcyB0byBpbXBsZW1lbnQgcmVhZGluZyBkaWZmZXJlbnQsIHNvIHRoYXQKKyAgICAgICAgIyBjaGVja2luZyB0aGlzIGlzIG5vdCBzbyBlYXN5LgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBidWZpby5yZWFkLCAxMCkKKworICAgIGRlZiB0ZXN0X2dhcmJhZ2VfY29sbGVjdGlvbihzZWxmKToKKyAgICAgICAgIyBDIEJ1ZmZlcmVkUmVhZGVyIG9iamVjdHMgYXJlIGNvbGxlY3RlZC4KKyAgICAgICAgIyBUaGUgUHl0aG9uIHZlcnNpb24gaGFzIF9fZGVsX18sIHNvIGl0IGVuZHMgaW50byBnYy5nYXJiYWdlIGluc3RlYWQKKyAgICAgICAgcmF3aW8gPSBzZWxmLkZpbGVJTyhzdXBwb3J0LlRFU1RGTiwgIncrYiIpCisgICAgICAgIGYgPSBzZWxmLnRwKHJhd2lvKQorICAgICAgICBmLmYgPSBmCisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoZikKKyAgICAgICAgZGVsIGYKKyAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyKCkgaXMgTm9uZSwgd3IpCisKKyAgICBkZWYgdGVzdF9hcmdzX2Vycm9yKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNzI3NQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgIkJ1ZmZlcmVkUmVhZGVyIik6CisgICAgICAgICAgICBzZWxmLnRwKGlvLkJ5dGVzSU8oKSwgMTAyNCwgMTAyNCwgMTAyNCkKKworCitjbGFzcyBQeUJ1ZmZlcmVkUmVhZGVyVGVzdChCdWZmZXJlZFJlYWRlclRlc3QpOgorICAgIHRwID0gcHlpby5CdWZmZXJlZFJlYWRlcgorCisKK2NsYXNzIEJ1ZmZlcmVkV3JpdGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwgQ29tbW9uQnVmZmVyZWRUZXN0cyk6CisgICAgd3JpdGVfbW9kZSA9ICJ3YiIKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvKQorICAgICAgICBidWZpby5fX2luaXRfXyhyYXdpbykKKyAgICAgICAgYnVmaW8uX19pbml0X18ocmF3aW8sIGJ1ZmZlcl9zaXplPTEwMjQpCisgICAgICAgIGJ1ZmlvLl9faW5pdF9fKHJhd2lvLCBidWZmZXJfc2l6ZT0xNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBidWZpby53cml0ZShiImFiYyIpKQorICAgICAgICBidWZpby5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLl9faW5pdF9fLCByYXdpbywgYnVmZmVyX3NpemU9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmaW8uX19pbml0X18sIHJhd2lvLCBidWZmZXJfc2l6ZT0tMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLl9faW5pdF9fLCByYXdpbywgYnVmZmVyX3NpemU9LTEpCisgICAgICAgIGJ1ZmlvLl9faW5pdF9fKHJhd2lvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGJ1ZmlvLndyaXRlKGIiZ2hpIikpCisgICAgICAgIGJ1ZmlvLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIiIuam9pbihyYXdpby5fd3JpdGVfc3RhY2spLCBiImFiY2doaSIpCisKKyAgICBkZWYgdGVzdF9kZXRhY2hfZmx1c2goc2VsZik6CisgICAgICAgIHJhdyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYnVmID0gc2VsZi50cChyYXcpCisgICAgICAgIGJ1Zi53cml0ZShiImhvd2R5ISIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmF3Ll93cml0ZV9zdGFjaykKKyAgICAgICAgYnVmLmRldGFjaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3Ll93cml0ZV9zdGFjaywgW2IiaG93ZHkhIl0pCisKKyAgICBkZWYgdGVzdF93cml0ZShzZWxmKToKKyAgICAgICAgIyBXcml0ZSB0byB0aGUgYnVmZmVyZWQgSU8gYnV0IGRvbid0IG92ZXJmbG93IHRoZSBidWZmZXIuCisgICAgICAgIHdyaXRlciA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHdyaXRlciwgOCkKKyAgICAgICAgYnVmaW8ud3JpdGUoYiJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHdyaXRlci5fd3JpdGVfc3RhY2spCisKKyAgICBkZWYgdGVzdF93cml0ZV9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgd3JpdGVyID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAod3JpdGVyLCA4KQorICAgICAgICBjb250ZW50cyA9IGIiYWJjZGVmZ2hpamtsbW5vcCIKKyAgICAgICAgZm9yIG4gaW4gcmFuZ2UoMCwgbGVuKGNvbnRlbnRzKSwgMyk6CisgICAgICAgICAgICBidWZpby53cml0ZShjb250ZW50c1tuOm4rM10pCisgICAgICAgIGZsdXNoZWQgPSBiIiIuam9pbih3cml0ZXIuX3dyaXRlX3N0YWNrKQorICAgICAgICAjIEF0IGxlYXN0ICh0b3RhbCAtIDgpIGJ5dGVzIHdlcmUgaW1wbGljaXRseSBmbHVzaGVkLCBwZXJoYXBzIG1vcmUKKyAgICAgICAgIyBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmx1c2hlZC5zdGFydHN3aXRoKGNvbnRlbnRzWzotOF0pLCBmbHVzaGVkKQorCisgICAgZGVmIGNoZWNrX3dyaXRlcyhzZWxmLCBpbnRlcm1lZGlhdGVfZnVuYyk6CisgICAgICAgICMgTG90cyBvZiB3cml0ZXMsIHRlc3QgdGhlIGZsdXNoZWQgb3V0cHV0IGlzIGFzIGV4cGVjdGVkLgorICAgICAgICBjb250ZW50cyA9IGJ5dGVzKHJhbmdlKDI1NikpICogMTAwMAorICAgICAgICBuID0gMAorICAgICAgICB3cml0ZXIgPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cCh3cml0ZXIsIDEzKQorICAgICAgICAjIEdlbmVyYXRvciBvZiB3cml0ZSBzaXplczogcmVwZWF0IGVhY2ggTiAxNSB0aW1lcyB0aGVuIHByb2NlZWQgdG8gTisxCisgICAgICAgIGRlZiBnZW5fc2l6ZXMoKToKKyAgICAgICAgICAgIGZvciBzaXplIGluIGNvdW50KDEpOgorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDE1KToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgc2l6ZQorICAgICAgICBzaXplcyA9IGdlbl9zaXplcygpCisgICAgICAgIHdoaWxlIG4gPCBsZW4oY29udGVudHMpOgorICAgICAgICAgICAgc2l6ZSA9IG1pbihuZXh0KHNpemVzKSwgbGVuKGNvbnRlbnRzKSAtIG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLndyaXRlKGNvbnRlbnRzW246bitzaXplXSksIHNpemUpCisgICAgICAgICAgICBpbnRlcm1lZGlhdGVfZnVuYyhidWZpbykKKyAgICAgICAgICAgIG4gKz0gc2l6ZQorICAgICAgICBidWZpby5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udGVudHMsCisgICAgICAgICAgICBiIiIuam9pbih3cml0ZXIuX3dyaXRlX3N0YWNrKSkKKworICAgIGRlZiB0ZXN0X3dyaXRlcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja193cml0ZXMobGFtYmRhIGJ1ZmlvOiBOb25lKQorCisgICAgZGVmIHRlc3Rfd3JpdGVzX2FuZF9mbHVzaGVzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3dyaXRlcyhsYW1iZGEgYnVmaW86IGJ1ZmlvLmZsdXNoKCkpCisKKyAgICBkZWYgdGVzdF93cml0ZXNfYW5kX3NlZWtzKHNlbGYpOgorICAgICAgICBkZWYgX3NlZWthYnMoYnVmaW8pOgorICAgICAgICAgICAgcG9zID0gYnVmaW8udGVsbCgpCisgICAgICAgICAgICBidWZpby5zZWVrKHBvcyArIDEsIDApCisgICAgICAgICAgICBidWZpby5zZWVrKHBvcyAtIDEsIDApCisgICAgICAgICAgICBidWZpby5zZWVrKHBvcywgMCkKKyAgICAgICAgc2VsZi5jaGVja193cml0ZXMoX3NlZWthYnMpCisgICAgICAgIGRlZiBfc2Vla3JlbChidWZpbyk6CisgICAgICAgICAgICBwb3MgPSBidWZpby5zZWVrKDAsIDEpCisgICAgICAgICAgICBidWZpby5zZWVrKCsxLCAxKQorICAgICAgICAgICAgYnVmaW8uc2VlaygtMSwgMSkKKyAgICAgICAgICAgIGJ1ZmlvLnNlZWsocG9zLCAwKQorICAgICAgICBzZWxmLmNoZWNrX3dyaXRlcyhfc2Vla3JlbCkKKworICAgIGRlZiB0ZXN0X3dyaXRlc19hbmRfdHJ1bmNhdGVzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3dyaXRlcyhsYW1iZGEgYnVmaW86IGJ1ZmlvLnRydW5jYXRlKGJ1ZmlvLnRlbGwoKSkpCisKKyAgICBkZWYgdGVzdF93cml0ZV9ub25fYmxvY2tpbmcoc2VsZik6CisgICAgICAgIHJhdyA9IHNlbGYuTW9ja05vbkJsb2NrV3JpdGVySU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3LCA4KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ud3JpdGUoYiJhYmNkIiksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ud3JpdGUoYiJlZmdoaSIpLCA1KQorICAgICAgICAjIDEgYnl0ZSB3aWxsIGJlIHdyaXR0ZW4sIHRoZSByZXN0IHdpbGwgYmUgYnVmZmVyZWQKKyAgICAgICAgcmF3LmJsb2NrX29uKGIiayIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ud3JpdGUoYiJqa2xtbiIpLCA1KQorCisgICAgICAgICMgOCBieXRlcyB3aWxsIGJlIHdyaXR0ZW4sIDggd2lsbCBiZSBidWZmZXJlZCBhbmQgdGhlIHJlc3Qgd2lsbCBiZSBsb3N0CisgICAgICAgIHJhdy5ibG9ja19vbihiIjAiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBidWZpby53cml0ZShiIm9wcXJ3eHl6MDEyMzQ1Njc4OSIpCisgICAgICAgIGV4Y2VwdCBzZWxmLkJsb2NraW5nSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgd3JpdHRlbiA9IGUuY2hhcmFjdGVyc193cml0dGVuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkJsb2NraW5nSU9FcnJvciBzaG91bGQgaGF2ZSBiZWVuIHJhaXNlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JpdHRlbiwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3LnBvcF93cml0dGVuKCksCisgICAgICAgICAgICBiImFiY2RlZmdoaWprbG1ub3Bxcnd4eXoiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ud3JpdGUoYiJBQkNERUZHSEkiKSwgOSkKKyAgICAgICAgcyA9IHJhdy5wb3Bfd3JpdHRlbigpCisgICAgICAgICMgUHJldmlvdXNseSBidWZmZXJlZCBieXRlcyB3ZXJlIGZsdXNoZWQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aChiIjAxMjM0NTY3QSIpLCBzKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfYW5kX3Jld2luZChzZWxmKToKKyAgICAgICAgcmF3ID0gaW8uQnl0ZXNJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXcsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ud3JpdGUoYiJhYmNkZWYiKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby50ZWxsKCksIDYpCisgICAgICAgIGJ1ZmlvLnNlZWsoMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby53cml0ZShiIlhZIiksIDIpCisgICAgICAgIGJ1ZmlvLnNlZWsoNiwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXcuZ2V0dmFsdWUoKSwgYiJYWWNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLndyaXRlKGIiMTIzNDU2IiksIDYpCisgICAgICAgIGJ1ZmlvLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXcuZ2V0dmFsdWUoKSwgYiJYWWNkZWYxMjM0NTYiKQorCisgICAgZGVmIHRlc3RfZmx1c2goc2VsZik6CisgICAgICAgIHdyaXRlciA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHdyaXRlciwgOCkKKyAgICAgICAgYnVmaW8ud3JpdGUoYiJhYmMiKQorICAgICAgICBidWZpby5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmMiLCB3cml0ZXIuX3dyaXRlX3N0YWNrWzBdKQorCisgICAgZGVmIHRlc3Rfd3JpdGVsaW5lcyhzZWxmKToKKyAgICAgICAgbCA9IFtiJ2FiJywgYidjZCcsIGInZWYnXQorICAgICAgICB3cml0ZXIgPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cCh3cml0ZXIsIDgpCisgICAgICAgIGJ1ZmlvLndyaXRlbGluZXMobCkKKyAgICAgICAgYnVmaW8uZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInJy5qb2luKHdyaXRlci5fd3JpdGVfc3RhY2spLCBiJ2FiY2RlZicpCisKKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzX3VzZXJsaXN0KHNlbGYpOgorICAgICAgICBsID0gVXNlckxpc3QoW2InYWInLCBiJ2NkJywgYidlZiddKQorICAgICAgICB3cml0ZXIgPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cCh3cml0ZXIsIDgpCisgICAgICAgIGJ1ZmlvLndyaXRlbGluZXMobCkKKyAgICAgICAgYnVmaW8uZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInJy5qb2luKHdyaXRlci5fd3JpdGVfc3RhY2spLCBiJ2FiY2RlZicpCisKKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzX2Vycm9yKHNlbGYpOgorICAgICAgICB3cml0ZXIgPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cCh3cml0ZXIsIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnVmaW8ud3JpdGVsaW5lcywgWzEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJ1ZmlvLndyaXRlbGluZXMsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9kZXN0cnVjdG9yKHNlbGYpOgorICAgICAgICB3cml0ZXIgPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cCh3cml0ZXIsIDgpCisgICAgICAgIGJ1ZmlvLndyaXRlKGIiYWJjIikKKyAgICAgICAgZGVsIGJ1ZmlvCisgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmMiLCB3cml0ZXIuX3dyaXRlX3N0YWNrWzBdKQorCisgICAgZGVmIHRlc3RfdHJ1bmNhdGUoc2VsZik6CisgICAgICAgICMgVHJ1bmNhdGUgaW1wbGljaXRseSBmbHVzaGVzIHRoZSBidWZmZXIuCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCBzZWxmLndyaXRlX21vZGUsIGJ1ZmZlcmluZz0wKSBhcyByYXc6CisgICAgICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3LCA4KQorICAgICAgICAgICAgYnVmaW8ud3JpdGUoYiJhYmNkZWYiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby50cnVuY2F0ZSgzKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8udGVsbCgpLCA2KQorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInJiIiwgYnVmZmVyaW5nPTApIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiImFiYyIpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIEBzdXBwb3J0LnJlcXVpcmVzX3Jlc291cmNlKCdjcHUnKQorICAgIGRlZiB0ZXN0X3RocmVhZHMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgV3JpdGUgb3V0IG1hbnkgYnl0ZXMgZnJvbSBtYW55IHRocmVhZHMgYW5kIHRlc3QgdGhleSB3ZXJlCisgICAgICAgICAgICAjIGFsbCBmbHVzaGVkLgorICAgICAgICAgICAgTiA9IDEwMDAKKyAgICAgICAgICAgIGNvbnRlbnRzID0gYnl0ZXMocmFuZ2UoMjU2KSkgKiBOCisgICAgICAgICAgICBzaXplcyA9IGN5Y2xlKFsxLCAxOV0pCisgICAgICAgICAgICBuID0gMAorICAgICAgICAgICAgcXVldWUgPSBkZXF1ZSgpCisgICAgICAgICAgICB3aGlsZSBuIDwgbGVuKGNvbnRlbnRzKToKKyAgICAgICAgICAgICAgICBzaXplID0gbmV4dChzaXplcykKKyAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQoY29udGVudHNbbjpuK3NpemVdKQorICAgICAgICAgICAgICAgIG4gKz0gc2l6ZQorICAgICAgICAgICAgZGVsIGNvbnRlbnRzCisgICAgICAgICAgICAjIFdlIHVzZSBhIHJlYWwgZmlsZSBvYmplY3QgYmVjYXVzZSBpdCBhbGxvd3MgdXMgdG8KKyAgICAgICAgICAgICMgZXhlcmNpc2Ugc2l0dWF0aW9ucyB3aGVyZSB0aGUgR0lMIGlzIHJlbGVhc2VkIGJlZm9yZQorICAgICAgICAgICAgIyB3cml0aW5nIHRoZSBidWZmZXIgdG8gdGhlIHJhdyBzdHJlYW1zLiBUaGlzIGlzIGluIGFkZGl0aW9uCisgICAgICAgICAgICAjIHRvIGNvbmN1cnJlbmN5IGlzc3VlcyBkdWUgdG8gc3dpdGNoaW5nIHRocmVhZHMgaW4gdGhlIG1pZGRsZQorICAgICAgICAgICAgIyBvZiBQeXRob24gY29kZS4KKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCBzZWxmLndyaXRlX21vZGUsIGJ1ZmZlcmluZz0wKSBhcyByYXc6CisgICAgICAgICAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhdywgOCkKKyAgICAgICAgICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICAgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcXVldWUucG9wbGVmdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmlvLndyaXRlKHMpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgdGhyZWFkcyA9IFt0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1mKSBmb3IgeCBpbiByYW5nZSgyMCldCisgICAgICAgICAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAyKSAjIHlpZWxkCisgICAgICAgICAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgInRoZSBmb2xsb3dpbmcgZXhjZXB0aW9ucyB3ZXJlIGNhdWdodDogJXIiICUgZXJyb3JzKQorICAgICAgICAgICAgICAgIGJ1ZmlvLmNsb3NlKCkKKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgICAgIHMgPSBmLnJlYWQoKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoYnl0ZXMoW2ldKSksIE4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X21pc2JlaGF2ZWRfaW8oc2VsZik6CisgICAgICAgIHJhd2lvID0gc2VsZi5NaXNiZWhhdmVkUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8sIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGJ1ZmlvLnNlZWssIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGJ1ZmlvLnRlbGwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGJ1ZmlvLndyaXRlLCBiImFiY2RlZiIpCisKKyAgICBkZWYgdGVzdF9tYXhfYnVmZmVyX3NpemVfZGVwcmVjYXRpb24oc2VsZik6CisgICAgICAgIHdpdGggc3VwcG9ydC5jaGVja193YXJuaW5ncygoIm1heF9idWZmZXJfc2l6ZSBpcyBkZXByZWNhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIHNlbGYudHAoc2VsZi5Nb2NrUmF3SU8oKSwgOCwgMTIpCisKKyAgICBkZWYgdGVzdF93cml0ZV9lcnJvcl9vbl9jbG9zZShzZWxmKToKKyAgICAgICAgcmF3ID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBkZWYgYmFkX3dyaXRlKGIpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigpCisgICAgICAgIHJhdy53cml0ZSA9IGJhZF93cml0ZQorICAgICAgICBiID0gc2VsZi50cChyYXcpCisgICAgICAgIGIud3JpdGUoYidzcGFtJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgYi5jbG9zZSkgIyBleGNlcHRpb24gbm90IHN3YWxsb3dlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoYi5jbG9zZWQpCisKKworY2xhc3MgQ0J1ZmZlcmVkV3JpdGVyVGVzdChCdWZmZXJlZFdyaXRlclRlc3QsIFNpemVvZlRlc3QpOgorICAgIHRwID0gaW8uQnVmZmVyZWRXcml0ZXIKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBCdWZmZXJlZFdyaXRlclRlc3QudGVzdF9jb25zdHJ1Y3RvcihzZWxmKQorICAgICAgICAjIFRoZSBhbGxvY2F0aW9uIGNhbiBzdWNjZWVkIG9uIDMyLWJpdCBidWlsZHMsIGUuZy4gd2l0aCBtb3JlCisgICAgICAgICMgdGhhbiAyR0IgUkFNIGFuZCBhIDY0LWJpdCBrZXJuZWwuCisgICAgICAgIGlmIHN5cy5tYXhzaXplID4gMHg3RkZGRkZGRjoKKyAgICAgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKE92ZXJmbG93RXJyb3IsIE1lbW9yeUVycm9yLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgICAgICAgICBidWZpby5fX2luaXRfXywgcmF3aW8sIHN5cy5tYXhzaXplKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6YXRpb24oc2VsZik6CisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLl9faW5pdF9fLCByYXdpbywgYnVmZmVyX3NpemU9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmaW8ud3JpdGUsIGIiZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmaW8uX19pbml0X18sIHJhd2lvLCBidWZmZXJfc2l6ZT0tMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLndyaXRlLCBiImRlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLl9faW5pdF9fLCByYXdpbywgYnVmZmVyX3NpemU9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLndyaXRlLCBiImRlZiIpCisKKyAgICBkZWYgdGVzdF9nYXJiYWdlX2NvbGxlY3Rpb24oc2VsZik6CisgICAgICAgICMgQyBCdWZmZXJlZFdyaXRlciBvYmplY3RzIGFyZSBjb2xsZWN0ZWQsIGFuZCBjb2xsZWN0aW5nIHRoZW0gZmx1c2hlcworICAgICAgICAjIGFsbCBkYXRhIHRvIGRpc2suCisgICAgICAgICMgVGhlIFB5dGhvbiB2ZXJzaW9uIGhhcyBfX2RlbF9fLCBzbyBpdCBlbmRzIGludG8gZ2MuZ2FyYmFnZSBpbnN0ZWFkCisgICAgICAgIHJhd2lvID0gc2VsZi5GaWxlSU8oc3VwcG9ydC5URVNURk4sICJ3K2IiKQorICAgICAgICBmID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgZi53cml0ZShiIjEyM3h4eCIpCisgICAgICAgIGYueCA9IGYKKyAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZihmKQorICAgICAgICBkZWwgZgorICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod3IoKSBpcyBOb25lLCB3cikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiIjEyM3h4eCIpCisKKyAgICBkZWYgdGVzdF9hcmdzX2Vycm9yKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNzI3NQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgIkJ1ZmZlcmVkV3JpdGVyIik6CisgICAgICAgICAgICBzZWxmLnRwKGlvLkJ5dGVzSU8oKSwgMTAyNCwgMTAyNCwgMTAyNCkKKworCitjbGFzcyBQeUJ1ZmZlcmVkV3JpdGVyVGVzdChCdWZmZXJlZFdyaXRlclRlc3QpOgorICAgIHRwID0gcHlpby5CdWZmZXJlZFdyaXRlcgorCitjbGFzcyBCdWZmZXJlZFJXUGFpclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIHBhaXIgPSBzZWxmLnRwKHNlbGYuTW9ja1Jhd0lPKCksIHNlbGYuTW9ja1Jhd0lPKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocGFpci5jbG9zZWQpCisKKyAgICBkZWYgdGVzdF9kZXRhY2goc2VsZik6CisgICAgICAgIHBhaXIgPSBzZWxmLnRwKHNlbGYuTW9ja1Jhd0lPKCksIHNlbGYuTW9ja1Jhd0lPKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuVW5zdXBwb3J0ZWRPcGVyYXRpb24sIHBhaXIuZGV0YWNoKQorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3JfbWF4X2J1ZmZlcl9zaXplX2RlcHJlY2F0aW9uKHNlbGYpOgorICAgICAgICB3aXRoIHN1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCJtYXhfYnVmZmVyX3NpemUgaXMgZGVwcmVjYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICBzZWxmLnRwKHNlbGYuTW9ja1Jhd0lPKCksIHNlbGYuTW9ja1Jhd0lPKCksIDgsIDEyKQorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Jfd2l0aF9ub3RfcmVhZGFibGUoc2VsZik6CisgICAgICAgIGNsYXNzIE5vdFJlYWRhYmxlKE1vY2tSYXdJTyk6CisgICAgICAgICAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgc2VsZi50cCwgTm90UmVhZGFibGUoKSwgc2VsZi5Nb2NrUmF3SU8oKSkKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yX3dpdGhfbm90X3dyaXRlYWJsZShzZWxmKToKKyAgICAgICAgY2xhc3MgTm90V3JpdGVhYmxlKE1vY2tSYXdJTyk6CisgICAgICAgICAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgc2VsZi50cCwgc2VsZi5Nb2NrUmF3SU8oKSwgTm90V3JpdGVhYmxlKCkpCisKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBwYWlyID0gc2VsZi50cChzZWxmLkJ5dGVzSU8oYiJhYmNkZWYiKSwgc2VsZi5Nb2NrUmF3SU8oKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhaXIucmVhZCgzKSwgYiJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhaXIucmVhZCgxKSwgYiJkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWlyLnJlYWQoKSwgYiJlZiIpCisgICAgICAgIHBhaXIgPSBzZWxmLnRwKHNlbGYuQnl0ZXNJTyhiImFiYyIpLCBzZWxmLk1vY2tSYXdJTygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhaXIucmVhZChOb25lKSwgYiJhYmMiKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICBwYWlyID0gbGFtYmRhOiBzZWxmLnRwKHNlbGYuQnl0ZXNJTyhiImFiY1xuZGVmXG5oIiksIHNlbGYuTW9ja1Jhd0lPKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFpcigpLnJlYWRsaW5lcygpLCBbYiJhYmNcbiIsIGIiZGVmXG4iLCBiImgiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWlyKCkucmVhZGxpbmVzKCksIFtiImFiY1xuIiwgYiJkZWZcbiIsIGIiaCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhaXIoKS5yZWFkbGluZXMoNSksIFtiImFiY1xuIiwgYiJkZWZcbiJdKQorCisgICAgZGVmIHRlc3RfcmVhZDEoc2VsZik6CisgICAgICAgICMgLnJlYWQxKCkgaXMgZGVsZWdhdGVkIHRvIHRoZSB1bmRlcmx5aW5nIHJlYWRlciBvYmplY3QsIHNvIHRoaXMgdGVzdAorICAgICAgICAjIGNhbiBiZSBzaGFsbG93LgorICAgICAgICBwYWlyID0gc2VsZi50cChzZWxmLkJ5dGVzSU8oYiJhYmNkZWYiKSwgc2VsZi5Nb2NrUmF3SU8oKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhaXIucmVhZDEoMyksIGIiYWJjIikKKworICAgIGRlZiB0ZXN0X3JlYWRpbnRvKHNlbGYpOgorICAgICAgICBwYWlyID0gc2VsZi50cChzZWxmLkJ5dGVzSU8oYiJhYmNkZWYiKSwgc2VsZi5Nb2NrUmF3SU8oKSkKKworICAgICAgICBkYXRhID0gYnl0ZWFycmF5KDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFpci5yZWFkaW50byhkYXRhKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBiImFiY2RlIikKKworICAgIGRlZiB0ZXN0X3dyaXRlKHNlbGYpOgorICAgICAgICB3ID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBwYWlyID0gc2VsZi50cChzZWxmLk1vY2tSYXdJTygpLCB3KQorCisgICAgICAgIHBhaXIud3JpdGUoYiJhYmMiKQorICAgICAgICBwYWlyLmZsdXNoKCkKKyAgICAgICAgcGFpci53cml0ZShiImRlZiIpCisgICAgICAgIHBhaXIuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcuX3dyaXRlX3N0YWNrLCBbYiJhYmMiLCBiImRlZiJdKQorCisgICAgZGVmIHRlc3RfcGVlayhzZWxmKToKKyAgICAgICAgcGFpciA9IHNlbGYudHAoc2VsZi5CeXRlc0lPKGIiYWJjZGVmIiksIHNlbGYuTW9ja1Jhd0lPKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhaXIucGVlaygzKS5zdGFydHN3aXRoKGIiYWJjIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFpci5yZWFkKDMpLCBiImFiYyIpCisKKyAgICBkZWYgdGVzdF9yZWFkYWJsZShzZWxmKToKKyAgICAgICAgcGFpciA9IHNlbGYudHAoc2VsZi5Nb2NrUmF3SU8oKSwgc2VsZi5Nb2NrUmF3SU8oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhaXIucmVhZGFibGUoKSkKKworICAgIGRlZiB0ZXN0X3dyaXRlYWJsZShzZWxmKToKKyAgICAgICAgcGFpciA9IHNlbGYudHAoc2VsZi5Nb2NrUmF3SU8oKSwgc2VsZi5Nb2NrUmF3SU8oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhaXIud3JpdGFibGUoKSkKKworICAgIGRlZiB0ZXN0X3NlZWthYmxlKHNlbGYpOgorICAgICAgICAjIEJ1ZmZlcmVkUldQYWlycyBhcmUgbmV2ZXIgc2Vla2FibGUsIGV2ZW4gaWYgdGhlaXIgcmVhZGVycyBhbmQgd3JpdGVycworICAgICAgICAjIGFyZS4KKyAgICAgICAgcGFpciA9IHNlbGYudHAoc2VsZi5Nb2NrUmF3SU8oKSwgc2VsZi5Nb2NrUmF3SU8oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYWlyLnNlZWthYmxlKCkpCisKKyAgICAjIC5mbHVzaCgpIGlzIGRlbGVnYXRlZCB0byB0aGUgdW5kZXJseWluZyB3cml0ZXIgb2JqZWN0IGFuZCBoYXMgYmVlbgorICAgICMgdGVzdGVkIGluIHRoZSB0ZXN0X3dyaXRlIG1ldGhvZC4KKworICAgIGRlZiB0ZXN0X2Nsb3NlX2FuZF9jbG9zZWQoc2VsZik6CisgICAgICAgIHBhaXIgPSBzZWxmLnRwKHNlbGYuTW9ja1Jhd0lPKCksIHNlbGYuTW9ja1Jhd0lPKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocGFpci5jbG9zZWQpCisgICAgICAgIHBhaXIuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocGFpci5jbG9zZWQpCisKKyAgICBkZWYgdGVzdF9pc2F0dHkoc2VsZik6CisgICAgICAgIGNsYXNzIFNlbGVjdGFibGVJc0F0dHkoTW9ja1Jhd0lPKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpc2F0dHkpOgorICAgICAgICAgICAgICAgIE1vY2tSYXdJTy5fX2luaXRfXyhzZWxmKQorICAgICAgICAgICAgICAgIHNlbGYuX2lzYXR0eSA9IGlzYXR0eQorCisgICAgICAgICAgICBkZWYgaXNhdHR5KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9pc2F0dHkKKworICAgICAgICBwYWlyID0gc2VsZi50cChTZWxlY3RhYmxlSXNBdHR5KEZhbHNlKSwgU2VsZWN0YWJsZUlzQXR0eShGYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocGFpci5pc2F0dHkoKSkKKworICAgICAgICBwYWlyID0gc2VsZi50cChTZWxlY3RhYmxlSXNBdHR5KFRydWUpLCBTZWxlY3RhYmxlSXNBdHR5KEZhbHNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhaXIuaXNhdHR5KCkpCisKKyAgICAgICAgcGFpciA9IHNlbGYudHAoU2VsZWN0YWJsZUlzQXR0eShGYWxzZSksIFNlbGVjdGFibGVJc0F0dHkoVHJ1ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYWlyLmlzYXR0eSgpKQorCisgICAgICAgIHBhaXIgPSBzZWxmLnRwKFNlbGVjdGFibGVJc0F0dHkoVHJ1ZSksIFNlbGVjdGFibGVJc0F0dHkoVHJ1ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYWlyLmlzYXR0eSgpKQorCitjbGFzcyBDQnVmZmVyZWRSV1BhaXJUZXN0KEJ1ZmZlcmVkUldQYWlyVGVzdCk6CisgICAgdHAgPSBpby5CdWZmZXJlZFJXUGFpcgorCitjbGFzcyBQeUJ1ZmZlcmVkUldQYWlyVGVzdChCdWZmZXJlZFJXUGFpclRlc3QpOgorICAgIHRwID0gcHlpby5CdWZmZXJlZFJXUGFpcgorCisKK2NsYXNzIEJ1ZmZlcmVkUmFuZG9tVGVzdChCdWZmZXJlZFJlYWRlclRlc3QsIEJ1ZmZlcmVkV3JpdGVyVGVzdCk6CisgICAgcmVhZF9tb2RlID0gInJiKyIKKyAgICB3cml0ZV9tb2RlID0gIndiKyIKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBCdWZmZXJlZFJlYWRlclRlc3QudGVzdF9jb25zdHJ1Y3RvcihzZWxmKQorICAgICAgICBCdWZmZXJlZFdyaXRlclRlc3QudGVzdF9jb25zdHJ1Y3RvcihzZWxmKQorCisgICAgZGVmIHRlc3RfcmVhZF9hbmRfd3JpdGUoc2VsZik6CisgICAgICAgIHJhdyA9IHNlbGYuTW9ja1Jhd0lPKChiImFzZGYiLCBiImdoamsiKSkKKyAgICAgICAgcncgPSBzZWxmLnRwKHJhdywgOCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYXMiLCBydy5yZWFkKDIpKQorICAgICAgICBydy53cml0ZShiImRkZCIpCisgICAgICAgIHJ3LndyaXRlKGIiZWVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyYXcuX3dyaXRlX3N0YWNrKSAjIEJ1ZmZlciB3cml0ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImdoamsiLCBydy5yZWFkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJkZGRlZWUiLCByYXcuX3dyaXRlX3N0YWNrWzBdKQorCisgICAgZGVmIHRlc3Rfc2Vla19hbmRfdGVsbChzZWxmKToKKyAgICAgICAgcmF3ID0gc2VsZi5CeXRlc0lPKGIiYXNkZmdoamtsIikKKyAgICAgICAgcncgPSBzZWxmLnRwKHJhdykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYXMiLCBydy5yZWFkKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHJ3LnRlbGwoKSkKKyAgICAgICAgcncuc2VlaygwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYXNkZiIsIHJ3LnJlYWQoNCkpCisKKyAgICAgICAgcncud3JpdGUoYiIxMjNmIikKKyAgICAgICAgcncuc2VlaygwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYXNkZjEyM2ZsIiwgcncucmVhZCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDksIHJ3LnRlbGwoKSkKKyAgICAgICAgcncuc2VlaygtNCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBydy50ZWxsKCkpCisgICAgICAgIHJ3LnNlZWsoMiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg3LCBydy50ZWxsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJmbCIsIHJ3LnJlYWQoMTEpKQorICAgICAgICBydy5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhc2RmMTIzZmwiLCByYXcuZ2V0dmFsdWUoKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJ3LnNlZWssIDAuMCkKKworICAgIGRlZiBjaGVja19mbHVzaF9hbmRfcmVhZChzZWxmLCByZWFkX2Z1bmMpOgorICAgICAgICByYXcgPSBzZWxmLkJ5dGVzSU8oYiJhYmNkZWZnaGkiKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYiIsIHJlYWRfZnVuYyhidWZpbywgMikpCisgICAgICAgIGJ1ZmlvLndyaXRlKGIiMTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiZWYiLCByZWFkX2Z1bmMoYnVmaW8sIDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDYsIGJ1ZmlvLnRlbGwoKSkKKyAgICAgICAgYnVmaW8uZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDYsIGJ1ZmlvLnRlbGwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImdoaSIsIHJlYWRfZnVuYyhidWZpbykpCisgICAgICAgIHJhdy5zZWVrKDAsIDApCisgICAgICAgIHJhdy53cml0ZShiIlhZWiIpCisgICAgICAgICMgZmx1c2goKSByZXNldHMgdGhlIHJlYWQgYnVmZmVyCisgICAgICAgIGJ1ZmlvLmZsdXNoKCkKKyAgICAgICAgYnVmaW8uc2VlaygwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiWFlaIiwgcmVhZF9mdW5jKGJ1ZmlvLCAzKSkKKworICAgIGRlZiB0ZXN0X2ZsdXNoX2FuZF9yZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2ZsdXNoX2FuZF9yZWFkKGxhbWJkYSBidWZpbywgKmFyZ3M6IGJ1ZmlvLnJlYWQoKmFyZ3MpKQorCisgICAgZGVmIHRlc3RfZmx1c2hfYW5kX3JlYWRpbnRvKHNlbGYpOgorICAgICAgICBkZWYgX3JlYWRpbnRvKGJ1ZmlvLCBuPS0xKToKKyAgICAgICAgICAgIGIgPSBieXRlYXJyYXkobiBpZiBuID49IDAgZWxzZSA5OTk5KQorICAgICAgICAgICAgbiA9IGJ1ZmlvLnJlYWRpbnRvKGIpCisgICAgICAgICAgICByZXR1cm4gYnl0ZXMoYls6bl0pCisgICAgICAgIHNlbGYuY2hlY2tfZmx1c2hfYW5kX3JlYWQoX3JlYWRpbnRvKQorCisgICAgZGVmIHRlc3RfZmx1c2hfYW5kX3BlZWsoc2VsZik6CisgICAgICAgIGRlZiBfcGVlayhidWZpbywgbj0tMSk6CisgICAgICAgICAgICAjIFRoaXMgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgdGhlIGJ1ZmZlciBjYW4gY29udGFpbiB0aGUgd2hvbGUKKyAgICAgICAgICAgICMgcmF3IHN0cmVhbSwgb3RoZXJ3aXNlIHBlZWsoKSBjYW4gcmV0dXJuIGxlc3MuCisgICAgICAgICAgICBiID0gYnVmaW8ucGVlayhuKQorICAgICAgICAgICAgaWYgbiAhPSAtMToKKyAgICAgICAgICAgICAgICBiID0gYls6bl0KKyAgICAgICAgICAgIGJ1ZmlvLnNlZWsobGVuKGIpLCAxKQorICAgICAgICAgICAgcmV0dXJuIGIKKyAgICAgICAgc2VsZi5jaGVja19mbHVzaF9hbmRfcmVhZChfcGVlaykKKworICAgIGRlZiB0ZXN0X2ZsdXNoX2FuZF93cml0ZShzZWxmKToKKyAgICAgICAgcmF3ID0gc2VsZi5CeXRlc0lPKGIiYWJjZGVmZ2hpIikKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhdykKKworICAgICAgICBidWZpby53cml0ZShiIjEyMyIpCisgICAgICAgIGJ1ZmlvLmZsdXNoKCkKKyAgICAgICAgYnVmaW8ud3JpdGUoYiI0NSIpCisgICAgICAgIGJ1ZmlvLmZsdXNoKCkKKyAgICAgICAgYnVmaW8uc2VlaygwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiMTIzNDVmZ2hpIiwgcmF3LmdldHZhbHVlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiIxMjM0NWZnaGkiLCBidWZpby5yZWFkKCkpCisKKyAgICBkZWYgdGVzdF90aHJlYWRzKHNlbGYpOgorICAgICAgICBCdWZmZXJlZFJlYWRlclRlc3QudGVzdF90aHJlYWRzKHNlbGYpCisgICAgICAgIEJ1ZmZlcmVkV3JpdGVyVGVzdC50ZXN0X3RocmVhZHMoc2VsZikKKworICAgIGRlZiB0ZXN0X3dyaXRlc19hbmRfcGVlayhzZWxmKToKKyAgICAgICAgZGVmIF9wZWVrKGJ1ZmlvKToKKyAgICAgICAgICAgIGJ1ZmlvLnBlZWsoMSkKKyAgICAgICAgc2VsZi5jaGVja193cml0ZXMoX3BlZWspCisgICAgICAgIGRlZiBfcGVlayhidWZpbyk6CisgICAgICAgICAgICBwb3MgPSBidWZpby50ZWxsKCkKKyAgICAgICAgICAgIGJ1ZmlvLnNlZWsoLTEsIDEpCisgICAgICAgICAgICBidWZpby5wZWVrKDEpCisgICAgICAgICAgICBidWZpby5zZWVrKHBvcywgMCkKKyAgICAgICAgc2VsZi5jaGVja193cml0ZXMoX3BlZWspCisKKyAgICBkZWYgdGVzdF93cml0ZXNfYW5kX3JlYWRzKHNlbGYpOgorICAgICAgICBkZWYgX3JlYWQoYnVmaW8pOgorICAgICAgICAgICAgYnVmaW8uc2VlaygtMSwgMSkKKyAgICAgICAgICAgIGJ1ZmlvLnJlYWQoMSkKKyAgICAgICAgc2VsZi5jaGVja193cml0ZXMoX3JlYWQpCisKKyAgICBkZWYgdGVzdF93cml0ZXNfYW5kX3JlYWQxcyhzZWxmKToKKyAgICAgICAgZGVmIF9yZWFkMShidWZpbyk6CisgICAgICAgICAgICBidWZpby5zZWVrKC0xLCAxKQorICAgICAgICAgICAgYnVmaW8ucmVhZDEoMSkKKyAgICAgICAgc2VsZi5jaGVja193cml0ZXMoX3JlYWQxKQorCisgICAgZGVmIHRlc3Rfd3JpdGVzX2FuZF9yZWFkaW50b3Moc2VsZik6CisgICAgICAgIGRlZiBfcmVhZChidWZpbyk6CisgICAgICAgICAgICBidWZpby5zZWVrKC0xLCAxKQorICAgICAgICAgICAgYnVmaW8ucmVhZGludG8oYnl0ZWFycmF5KDEpKQorICAgICAgICBzZWxmLmNoZWNrX3dyaXRlcyhfcmVhZCkKKworICAgIGRlZiB0ZXN0X3dyaXRlX2FmdGVyX3JlYWRhaGVhZChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjNjYyOTogd3JpdGluZyBhZnRlciB0aGUgYnVmZmVyIHdhcyBmaWxsZWQgYnkgcmVhZGFoZWFkIHNob3VsZAorICAgICAgICAjIGZpcnN0IHJld2luZCB0aGUgcmF3IHN0cmVhbS4KKyAgICAgICAgZm9yIG92ZXJ3cml0ZV9zaXplIGluIFsxLCA1XToKKyAgICAgICAgICAgIHJhdyA9IHNlbGYuQnl0ZXNJTyhiIkEiICogMTApCisgICAgICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3LCA0KQorICAgICAgICAgICAgIyBUcmlnZ2VyIHJlYWRhaGVhZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby5yZWFkKDEpLCBiIkEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby50ZWxsKCksIDEpCisgICAgICAgICAgICAjIE92ZXJ3cml0aW5nIHNob3VsZCByZXdpbmQgdGhlIHJhdyBzdHJlYW0gaWYgaXQgbmVlZHMgc28KKyAgICAgICAgICAgIGJ1ZmlvLndyaXRlKGIiQiIgKiBvdmVyd3JpdGVfc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8udGVsbCgpLCBvdmVyd3JpdGVfc2l6ZSArIDEpCisgICAgICAgICAgICAjIElmIHRoZSB3cml0ZSBzaXplIHdhcyBzbWFsbGVyIHRoYW4gdGhlIGJ1ZmZlciBzaXplLCBmbHVzaCgpIGFuZAorICAgICAgICAgICAgIyBjaGVjayB0aGF0IHJld2luZCBoYXBwZW5zLgorICAgICAgICAgICAgYnVmaW8uZmx1c2goKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby50ZWxsKCksIG92ZXJ3cml0ZV9zaXplICsgMSkKKyAgICAgICAgICAgIHMgPSByYXcuZ2V0dmFsdWUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLAorICAgICAgICAgICAgICAgIGIiQSIgKyBiIkIiICogb3ZlcndyaXRlX3NpemUgKyBiIkEiICogKDkgLSBvdmVyd3JpdGVfc2l6ZSkpCisKKyAgICBkZWYgdGVzdF93cml0ZV9yZXdpbmRfd3JpdGUoc2VsZik6CisgICAgICAgICMgVmFyaW91cyBjb21iaW5hdGlvbnMgb2YgcmVhZGluZyAvIHdyaXRpbmcgLyBzZWVraW5nIGJhY2t3YXJkcyAvIHdyaXRpbmcgYWdhaW4KKyAgICAgICAgZGVmIG11dGF0ZShidWZpbywgcG9zMSwgcG9zMik6CisgICAgICAgICAgICBhc3NlcnQgcG9zMiA+PSBwb3MxCisgICAgICAgICAgICAjIEZpbGwgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgYnVmaW8uc2Vlayhwb3MxKQorICAgICAgICAgICAgYnVmaW8ucmVhZChwb3MyIC0gcG9zMSkKKyAgICAgICAgICAgIGJ1ZmlvLndyaXRlKGInXHgwMicpCisgICAgICAgICAgICAjIFRoaXMgd3JpdGVzIGVhcmxpZXIgdGhhbiB0aGUgcHJldmlvdXMgd3JpdGUsIGJ1dCBzdGlsbCBpbnNpZGUKKyAgICAgICAgICAgICMgdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgIGJ1ZmlvLnNlZWsocG9zMSkKKyAgICAgICAgICAgIGJ1ZmlvLndyaXRlKGInXHgwMScpCisKKyAgICAgICAgYiA9IGIiXHg4MFx4ODFceDgyXHg4M1x4ODQiCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihiKSk6CisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZShpLCBsZW4oYikpOgorICAgICAgICAgICAgICAgIHJhdyA9IHNlbGYuQnl0ZXNJTyhiKQorICAgICAgICAgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXcsIDEwMCkKKyAgICAgICAgICAgICAgICBtdXRhdGUoYnVmaW8sIGksIGopCisgICAgICAgICAgICAgICAgYnVmaW8uZmx1c2goKQorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gYnl0ZWFycmF5KGIpCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRbal0gPSAyCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRbaV0gPSAxCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXcuZ2V0dmFsdWUoKSwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHJlc3VsdCBmb3IgaT0lZCwgaj0lZCIgJSAoaSwgaikpCisKKyAgICBkZWYgdGVzdF90cnVuY2F0ZV9hZnRlcl9yZWFkX29yX3dyaXRlKHNlbGYpOgorICAgICAgICByYXcgPSBzZWxmLkJ5dGVzSU8oYiJBIiAqIDEwKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3LCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ucmVhZCgyKSwgYiJBQSIpICMgdGhlIHJlYWQgYnVmZmVyIGdldHMgZmlsbGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8udHJ1bmNhdGUoKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby53cml0ZShiIkJCIiksIDIpICMgdGhlIHdyaXRlIGJ1ZmZlciBpbmNyZWFzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby50cnVuY2F0ZSgpLCA0KQorCisgICAgZGVmIHRlc3RfbWlzYmVoYXZlZF9pbyhzZWxmKToKKyAgICAgICAgQnVmZmVyZWRSZWFkZXJUZXN0LnRlc3RfbWlzYmVoYXZlZF9pbyhzZWxmKQorICAgICAgICBCdWZmZXJlZFdyaXRlclRlc3QudGVzdF9taXNiZWhhdmVkX2lvKHNlbGYpCisKKyAgICBkZWYgdGVzdF9pbnRlcmxlYXZlZF9yZWFkX3dyaXRlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGlzc3VlICMxMjIxMworICAgICAgICB3aXRoIHNlbGYuQnl0ZXNJTyhiJ2FiY2RlZmdoJykgYXMgcmF3OgorICAgICAgICAgICAgd2l0aCBzZWxmLnRwKHJhdywgMTAwKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoYiIxIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgxKSwgYidiJykKKyAgICAgICAgICAgICAgICBmLndyaXRlKGInMicpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQxKDEpLCBiJ2QnKQorICAgICAgICAgICAgICAgIGYud3JpdGUoYiczJykKKyAgICAgICAgICAgICAgICBidWYgPSBieXRlYXJyYXkoMSkKKyAgICAgICAgICAgICAgICBmLnJlYWRpbnRvKGJ1ZikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZiwgYidmJykKKyAgICAgICAgICAgICAgICBmLndyaXRlKGInNCcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBlZWsoMSksIGInaCcpCisgICAgICAgICAgICAgICAgZi5mbHVzaCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXcuZ2V0dmFsdWUoKSwgYicxYjJkM2Y0aCcpCisKKyAgICAgICAgd2l0aCBzZWxmLkJ5dGVzSU8oYidhYmMnKSBhcyByYXc6CisgICAgICAgICAgICB3aXRoIHNlbGYudHAocmF3LCAxMDApIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoMSksIGInYScpCisgICAgICAgICAgICAgICAgZi53cml0ZShiIjIiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKDEpLCBiJ2MnKQorICAgICAgICAgICAgICAgIGYuZmx1c2goKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3LmdldHZhbHVlKCksIGInYTJjJykKKworICAgIGRlZiB0ZXN0X2ludGVybGVhdmVkX3JlYWRsaW5lX3dyaXRlKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuQnl0ZXNJTyhiJ2FiXG5jZGVmXG5nXG4nKSBhcyByYXc6CisgICAgICAgICAgICB3aXRoIHNlbGYudHAocmF3KSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoYicxJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmUoKSwgYidiXG4nKQorICAgICAgICAgICAgICAgIGYud3JpdGUoYicyJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmUoKSwgYidkZWZcbicpCisgICAgICAgICAgICAgICAgZi53cml0ZShiJzMnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZSgpLCBiJ1xuJykKKyAgICAgICAgICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhdy5nZXR2YWx1ZSgpLCBiJzFiXG4yZGVmXG4zXG4nKQorCisKK2NsYXNzIENCdWZmZXJlZFJhbmRvbVRlc3QoQ0J1ZmZlcmVkUmVhZGVyVGVzdCwgQ0J1ZmZlcmVkV3JpdGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRSYW5kb21UZXN0LCBTaXplb2ZUZXN0KToKKyAgICB0cCA9IGlvLkJ1ZmZlcmVkUmFuZG9tCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgQnVmZmVyZWRSYW5kb21UZXN0LnRlc3RfY29uc3RydWN0b3Ioc2VsZikKKyAgICAgICAgIyBUaGUgYWxsb2NhdGlvbiBjYW4gc3VjY2VlZCBvbiAzMi1iaXQgYnVpbGRzLCBlLmcuIHdpdGggbW9yZQorICAgICAgICAjIHRoYW4gMkdCIFJBTSBhbmQgYSA2NC1iaXQga2VybmVsLgorICAgICAgICBpZiBzeXMubWF4c2l6ZSA+IDB4N0ZGRkZGRkY6CisgICAgICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChPdmVyZmxvd0Vycm9yLCBNZW1vcnlFcnJvciwgVmFsdWVFcnJvciksCisgICAgICAgICAgICAgICAgYnVmaW8uX19pbml0X18sIHJhd2lvLCBzeXMubWF4c2l6ZSkKKworICAgIGRlZiB0ZXN0X2dhcmJhZ2VfY29sbGVjdGlvbihzZWxmKToKKyAgICAgICAgQ0J1ZmZlcmVkUmVhZGVyVGVzdC50ZXN0X2dhcmJhZ2VfY29sbGVjdGlvbihzZWxmKQorICAgICAgICBDQnVmZmVyZWRXcml0ZXJUZXN0LnRlc3RfZ2FyYmFnZV9jb2xsZWN0aW9uKHNlbGYpCisKKyAgICBkZWYgdGVzdF9hcmdzX2Vycm9yKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNzI3NQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgIkJ1ZmZlcmVkUmFuZG9tIik6CisgICAgICAgICAgICBzZWxmLnRwKGlvLkJ5dGVzSU8oKSwgMTAyNCwgMTAyNCwgMTAyNCkKKworCitjbGFzcyBQeUJ1ZmZlcmVkUmFuZG9tVGVzdChCdWZmZXJlZFJhbmRvbVRlc3QpOgorICAgIHRwID0gcHlpby5CdWZmZXJlZFJhbmRvbQorCisKKyMgVG8gZnVsbHkgZXhlcmNpc2Ugc2Vlay90ZWxsLCB0aGUgU3RhdGVmdWxJbmNyZW1lbnRhbERlY29kZXIgaGFzIHRoZXNlCisjIHByb3BlcnRpZXM6CisjICAgLSBBIHNpbmdsZSBvdXRwdXQgY2hhcmFjdGVyIGNhbiBjb3JyZXNwb25kIHRvIG1hbnkgYnl0ZXMgb2YgaW5wdXQuCisjICAgLSBUaGUgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIHRvIGNvbXBsZXRlIHRoZSBjaGFyYWN0ZXIgY2FuIGJlCisjICAgICB1bmRldGVybWluZWQgdW50aWwgdGhlIGxhc3QgaW5wdXQgYnl0ZSBpcyByZWNlaXZlZC4KKyMgICAtIFRoZSBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIHByZXZpb3VzIGlucHV0LgorIyAgIC0gQSBzaW5nbGUgaW5wdXQgYnl0ZSBjYW4gY29ycmVzcG9uZCB0byBtYW55IGNoYXJhY3RlcnMgb2Ygb3V0cHV0LgorIyAgIC0gVGhlIG51bWJlciBvZiBvdXRwdXQgY2hhcmFjdGVycyBjYW4gYmUgdW5kZXRlcm1pbmVkIHVudGlsIHRoZQorIyAgICAgbGFzdCBpbnB1dCBieXRlIGlzIHJlY2VpdmVkLgorIyAgIC0gVGhlIG51bWJlciBvZiBvdXRwdXQgY2hhcmFjdGVycyBjYW4gdmFyeSBkZXBlbmRpbmcgb24gcHJldmlvdXMgaW5wdXQuCisKK2NsYXNzIFN0YXRlZnVsSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgICIiIgorICAgIEZvciB0ZXN0aW5nIHNlZWsvdGVsbCBiZWhhdmlvciB3aXRoIGEgc3RhdGVmdWwsIGJ1ZmZlcmluZyBkZWNvZGVyLgorCisgICAgSW5wdXQgaXMgYSBzZXF1ZW5jZSBvZiB3b3Jkcy4gIFdvcmRzIG1heSBiZSBmaXhlZC1sZW5ndGggKGxlbmd0aCBzZXQKKyAgICBieSBpbnB1dCkgb3IgdmFyaWFibGUtbGVuZ3RoIChwZXJpb2QtdGVybWluYXRlZCkuICBJbiB2YXJpYWJsZS1sZW5ndGgKKyAgICBtb2RlLCBleHRyYSBwZXJpb2RzIGFyZSBpZ25vcmVkLiAgUG9zc2libGUgd29yZHMgYXJlOgorICAgICAgLSAnaScgZm9sbG93ZWQgYnkgYSBudW1iZXIgc2V0cyB0aGUgaW5wdXQgbGVuZ3RoLCBJIChtYXhpbXVtIDk5KS4KKyAgICAgICAgV2hlbiBJIGlzIHNldCB0byAwLCB3b3JkcyBhcmUgc3BhY2UtdGVybWluYXRlZC4KKyAgICAgIC0gJ28nIGZvbGxvd2VkIGJ5IGEgbnVtYmVyIHNldHMgdGhlIG91dHB1dCBsZW5ndGgsIE8gKG1heGltdW0gOTkpLgorICAgICAgLSBBbnkgb3RoZXIgd29yZCBpcyBjb252ZXJ0ZWQgaW50byBhIHdvcmQgZm9sbG93ZWQgYnkgYSBwZXJpb2Qgb24KKyAgICAgICAgdGhlIG91dHB1dC4gIFRoZSBvdXRwdXQgd29yZCBjb25zaXN0cyBvZiB0aGUgaW5wdXQgd29yZCB0cnVuY2F0ZWQKKyAgICAgICAgb3IgcGFkZGVkIG91dCB3aXRoIGh5cGhlbnMgdG8gbWFrZSBpdHMgbGVuZ3RoIGVxdWFsIHRvIE8uICBJZiBPCisgICAgICAgIGlzIDAsIHRoZSB3b3JkIGlzIG91dHB1dCB2ZXJiYXRpbSB3aXRob3V0IHRydW5jYXRpbmcgb3IgcGFkZGluZy4KKyAgICBJIGFuZCBPIGFyZSBpbml0aWFsbHkgc2V0IHRvIDEuICBXaGVuIEkgY2hhbmdlcywgYW55IGJ1ZmZlcmVkIGlucHV0IGlzCisgICAgcmUtc2Nhbm5lZCBhY2NvcmRpbmcgdG8gdGhlIG5ldyBJLiAgRU9GIGFsc28gdGVybWluYXRlcyB0aGUgbGFzdCB3b3JkLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIuX19pbml0X18oc2VsZiwgZXJyb3JzKQorICAgICAgICBzZWxmLnJlc2V0KCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8U0lEICV4PicgJSBpZChzZWxmKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLmkgPSAxCisgICAgICAgIHNlbGYubyA9IDEKKyAgICAgICAgc2VsZi5idWZmZXIgPSBieXRlYXJyYXkoKQorCisgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICBpLCBvID0gc2VsZi5pIF4gMSwgc2VsZi5vIF4gMSAjIHNvIHRoYXQgZmxhZ3MgPSAwIGFmdGVyIHJlc2V0KCkKKyAgICAgICAgcmV0dXJuIGJ5dGVzKHNlbGYuYnVmZmVyKSwgaSoxMDAgKyBvCisKKyAgICBkZWYgc2V0c3RhdGUoc2VsZiwgc3RhdGUpOgorICAgICAgICBidWZmZXIsIGlvID0gc3RhdGUKKyAgICAgICAgc2VsZi5idWZmZXIgPSBieXRlYXJyYXkoYnVmZmVyKQorICAgICAgICBpLCBvID0gZGl2bW9kKGlvLCAxMDApCisgICAgICAgIHNlbGYuaSwgc2VsZi5vID0gaSBeIDEsIG8gXiAxCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIG91dHB1dCA9ICcnCisgICAgICAgIGZvciBiIGluIGlucHV0OgorICAgICAgICAgICAgaWYgc2VsZi5pID09IDA6ICMgdmFyaWFibGUtbGVuZ3RoLCB0ZXJtaW5hdGVkIHdpdGggcGVyaW9kCisgICAgICAgICAgICAgICAgaWYgYiA9PSAnLic6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuYnVmZmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IHNlbGYucHJvY2Vzc193b3JkKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlci5hcHBlbmQoYikKKyAgICAgICAgICAgIGVsc2U6ICMgZml4ZWQtbGVuZ3RoLCB0ZXJtaW5hdGUgYWZ0ZXIgc2VsZi5pIGJ5dGVzCisgICAgICAgICAgICAgICAgc2VsZi5idWZmZXIuYXBwZW5kKGIpCisgICAgICAgICAgICAgICAgaWYgbGVuKHNlbGYuYnVmZmVyKSA9PSBzZWxmLmk6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBzZWxmLnByb2Nlc3Nfd29yZCgpCisgICAgICAgIGlmIGZpbmFsIGFuZCBzZWxmLmJ1ZmZlcjogIyBFT0YgdGVybWluYXRlcyB0aGUgbGFzdCB3b3JkCisgICAgICAgICAgICBvdXRwdXQgKz0gc2VsZi5wcm9jZXNzX3dvcmQoKQorICAgICAgICByZXR1cm4gb3V0cHV0CisKKyAgICBkZWYgcHJvY2Vzc193b3JkKHNlbGYpOgorICAgICAgICBvdXRwdXQgPSAnJworICAgICAgICBpZiBzZWxmLmJ1ZmZlclswXSA9PSBvcmQoJ2knKToKKyAgICAgICAgICAgIHNlbGYuaSA9IG1pbig5OSwgaW50KHNlbGYuYnVmZmVyWzE6XSBvciAwKSkgIyBzZXQgaW5wdXQgbGVuZ3RoCisgICAgICAgIGVsaWYgc2VsZi5idWZmZXJbMF0gPT0gb3JkKCdvJyk6CisgICAgICAgICAgICBzZWxmLm8gPSBtaW4oOTksIGludChzZWxmLmJ1ZmZlclsxOl0gb3IgMCkpICMgc2V0IG91dHB1dCBsZW5ndGgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dHB1dCA9IHNlbGYuYnVmZmVyLmRlY29kZSgnYXNjaWknKQorICAgICAgICAgICAgaWYgbGVuKG91dHB1dCkgPCBzZWxmLm86CisgICAgICAgICAgICAgICAgb3V0cHV0ICs9ICctJypzZWxmLm8gIyBwYWQgb3V0IHdpdGggaHlwaGVucworICAgICAgICAgICAgaWYgc2VsZi5vOgorICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dFs6c2VsZi5vXSAjIHRydW5jYXRlIHRvIG91dHB1dCBsZW5ndGgKKyAgICAgICAgICAgIG91dHB1dCArPSAnLicKKyAgICAgICAgc2VsZi5idWZmZXIgPSBieXRlYXJyYXkoKQorICAgICAgICByZXR1cm4gb3V0cHV0CisKKyAgICBjb2RlY0VuYWJsZWQgPSBGYWxzZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGxvb2t1cFRlc3REZWNvZGVyKGNscywgbmFtZSk6CisgICAgICAgIGlmIGNscy5jb2RlY0VuYWJsZWQgYW5kIG5hbWUgPT0gJ3Rlc3RfZGVjb2Rlcic6CisgICAgICAgICAgICBsYXRpbjEgPSBjb2RlY3MubG9va3VwKCdsYXRpbi0xJykKKyAgICAgICAgICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICAgICAgICAgIG5hbWU9J3Rlc3RfZGVjb2RlcicsIGVuY29kZT1sYXRpbjEuZW5jb2RlLCBkZWNvZGU9Tm9uZSwKKyAgICAgICAgICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9Tm9uZSwKKyAgICAgICAgICAgICAgICBzdHJlYW1yZWFkZXI9Tm9uZSwgc3RyZWFtd3JpdGVyPU5vbmUsCisgICAgICAgICAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPWNscykKKworIyBSZWdpc3RlciB0aGUgcHJldmlvdXMgZGVjb2RlciBmb3IgdGVzdGluZy4KKyMgRGlzYWJsZWQgYnkgZGVmYXVsdCwgdGVzdHMgd2lsbCBlbmFibGUgaXQuCitjb2RlY3MucmVnaXN0ZXIoU3RhdGVmdWxJbmNyZW1lbnRhbERlY29kZXIubG9va3VwVGVzdERlY29kZXIpCisKKworY2xhc3MgU3RhdGVmdWxJbmNyZW1lbnRhbERlY29kZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBNYWtlIHN1cmUgdGhlIFN0YXRlZnVsSW5jcmVtZW50YWxEZWNvZGVyIGFjdHVhbGx5IHdvcmtzLgorICAgICIiIgorCisgICAgdGVzdF9jYXNlcyA9IFsKKyAgICAgICAgIyBJPTEsIE89MSAoZml4ZWQtbGVuZ3RoIGlucHV0ID09IGZpeGVkLWxlbmd0aCBvdXRwdXQpCisgICAgICAgIChiJ2FiY2QnLCBGYWxzZSwgJ2EuYi5jLmQuJyksCisgICAgICAgICMgST0wLCBPPTAgKHZhcmlhYmxlLWxlbmd0aCBpbnB1dCwgdmFyaWFibGUtbGVuZ3RoIG91dHB1dCkKKyAgICAgICAgKGInb2lhYmNkJywgVHJ1ZSwgJ2FiY2QuJyksCisgICAgICAgICMgST0wLCBPPTAgKHNob3VsZCBpZ25vcmUgZXh0cmEgcGVyaW9kcykKKyAgICAgICAgKGInb2kuLi5hYmNkLi4uJywgVHJ1ZSwgJ2FiY2QuJyksCisgICAgICAgICMgST0wLCBPPTYgKHZhcmlhYmxlLWxlbmd0aCBpbnB1dCwgZml4ZWQtbGVuZ3RoIG91dHB1dCkKKyAgICAgICAgKGInaS5vNi54Lnh5ei50b29sb25ndG9maXQuJywgRmFsc2UsICd4LS0tLS0ueHl6LS0tLnRvb2xvbi4nKSwKKyAgICAgICAgIyBJPTIsIE89NiAoZml4ZWQtbGVuZ3RoIGlucHV0IDwgZml4ZWQtbGVuZ3RoIG91dHB1dCkKKyAgICAgICAgKGInaS5pMi5vNnh5eicsIFRydWUsICd4eS0tLS0uei0tLS0tLicpLAorICAgICAgICAjIEk9NiwgTz0zIChmaXhlZC1sZW5ndGggaW5wdXQgPiBmaXhlZC1sZW5ndGggb3V0cHV0KQorICAgICAgICAoYidpLm8zLmk2LmFiY2RlZmdoaWprbG1ub3AnLCBUcnVlLCAnYWJjLmdoaS5tbm8uJyksCisgICAgICAgICMgST0wLCB0aGVuIDM7IE89MjksIHRoZW4gMTUgKHdpdGggbG9uZ2VyIG91dHB1dCkKKyAgICAgICAgKGInaS5vMjkuYS5iLmNkZS5vMTUuYWJjZGVmZ2hpamFiY2RlZmdoaWouaTMuYS5iLmMuZC5laTAway5sLm0nLCBUcnVlLAorICAgICAgICAgJ2EtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLicgKworICAgICAgICAgJ2ItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLicgKworICAgICAgICAgJ2NkZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLicgKworICAgICAgICAgJ2FiY2RlZmdoaWphYmNkZS4nICsKKyAgICAgICAgICdhLmItLS0tLS0tLS0tLS0uJyArCisgICAgICAgICAnLmMuLS0tLS0tLS0tLS0tLicgKworICAgICAgICAgJ2QuZS0tLS0tLS0tLS0tLS4nICsKKyAgICAgICAgICdrLS0tLS0tLS0tLS0tLS0uJyArCisgICAgICAgICAnbC0tLS0tLS0tLS0tLS0tLicgKworICAgICAgICAgJ20tLS0tLS0tLS0tLS0tLS4nKQorICAgIF0KKworICAgIGRlZiB0ZXN0X2RlY29kZXIoc2VsZik6CisgICAgICAgICMgVHJ5IGEgZmV3IG9uZS1zaG90IHRlc3QgY2FzZXMuCisgICAgICAgIGZvciBpbnB1dCwgZW9mLCBvdXRwdXQgaW4gc2VsZi50ZXN0X2Nhc2VzOgorICAgICAgICAgICAgZCA9IFN0YXRlZnVsSW5jcmVtZW50YWxEZWNvZGVyKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5kZWNvZGUoaW5wdXQsIGVvZiksIG91dHB1dCkKKworICAgICAgICAjIEFsc28gdGVzdCBhbiB1bmZpbmlzaGVkIGRlY29kZSwgZm9sbG93ZWQgYnkgZm9yY2luZyBFT0YuCisgICAgICAgIGQgPSBTdGF0ZWZ1bEluY3JlbWVudGFsRGVjb2RlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5kZWNvZGUoYidvaWFiY2QnKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5kZWNvZGUoYicnLCAxKSwgJ2FiY2QuJykKKworY2xhc3MgVGV4dElPV3JhcHBlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3RkYXRhID0gYiJBQUFcclxuQkJCXHJDQ0NcclxuREREXG5FRUVcclxuIgorICAgICAgICBzZWxmLm5vcm1hbGl6ZWQgPSBiIkFBQVxuQkJCXG5DQ0NcbkRERFxuRUVFXG4iLmRlY29kZSgiYXNjaWkiKQorICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgciA9IHNlbGYuQnl0ZXNJTyhiIlx4YzNceGE5XG5cbiIpCisgICAgICAgIGIgPSBzZWxmLkJ1ZmZlcmVkUmVhZGVyKHIsIDEwMDApCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYikKKyAgICAgICAgdC5fX2luaXRfXyhiLCBlbmNvZGluZz0ibGF0aW4xIiwgbmV3bGluZT0iXHJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5lbmNvZGluZywgImxhdGluMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5saW5lX2J1ZmZlcmluZywgRmFsc2UpCisgICAgICAgIHQuX19pbml0X18oYiwgZW5jb2Rpbmc9InV0ZjgiLCBsaW5lX2J1ZmZlcmluZz1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZW5jb2RpbmcsICJ1dGY4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmxpbmVfYnVmZmVyaW5nLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJceGU5XG4iLCB0LnJlYWRsaW5lKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdC5fX2luaXRfXywgYiwgbmV3bGluZT00MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5fX2luaXRfXywgYiwgbmV3bGluZT0neHl6enknKQorCisgICAgZGVmIHRlc3RfZGV0YWNoKHNlbGYpOgorICAgICAgICByID0gc2VsZi5CeXRlc0lPKCkKKyAgICAgICAgYiA9IHNlbGYuQnVmZmVyZWRXcml0ZXIocikKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiKQorICAgICAgICBzZWxmLmFzc2VydElzKHQuZGV0YWNoKCksIGIpCisKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0iYXNjaWkiKQorICAgICAgICB0LndyaXRlKCJob3dkeSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoci5nZXR2YWx1ZSgpKQorICAgICAgICB0LmRldGFjaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5nZXR2YWx1ZSgpLCBiImhvd2R5IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5kZXRhY2gpCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICByYXcgPSBzZWxmLkJ5dGVzSU8oImhlbGxvIi5lbmNvZGUoInV0Zi04IikpCisgICAgICAgIGIgPSBzZWxmLkJ1ZmZlcmVkUmVhZGVyKHJhdykKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0idXRmLTgiKQorICAgICAgICBtb2RuYW1lID0gc2VsZi5UZXh0SU9XcmFwcGVyLl9fbW9kdWxlX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICI8JXMuVGV4dElPV3JhcHBlciBlbmNvZGluZz0ndXRmLTgnPiIgJSBtb2RuYW1lKQorICAgICAgICByYXcubmFtZSA9ICJkdW1teSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICI8JXMuVGV4dElPV3JhcHBlciBuYW1lPXUnZHVtbXknIGVuY29kaW5nPSd1dGYtOCc+IiAlIG1vZG5hbWUpCisgICAgICAgIHJhdy5uYW1lID0gYiJkdW1teSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICI8JXMuVGV4dElPV3JhcHBlciBuYW1lPSdkdW1teScgZW5jb2Rpbmc9J3V0Zi04Jz4iICUgbW9kbmFtZSkKKworICAgIGRlZiB0ZXN0X2xpbmVfYnVmZmVyaW5nKHNlbGYpOgorICAgICAgICByID0gc2VsZi5CeXRlc0lPKCkKKyAgICAgICAgYiA9IHNlbGYuQnVmZmVyZWRXcml0ZXIociwgMTAwMCkKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBuZXdsaW5lPSJcbiIsIGxpbmVfYnVmZmVyaW5nPVRydWUpCisgICAgICAgIHQud3JpdGUoIlgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuZ2V0dmFsdWUoKSwgYiIiKSAgIyBObyBmbHVzaCBoYXBwZW5lZAorICAgICAgICB0LndyaXRlKCJZXG5aIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmdldHZhbHVlKCksIGIiWFlcbloiKSAgIyBBbGwgZ290IGZsdXNoZWQKKyAgICAgICAgdC53cml0ZSgiQVxyQiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5nZXR2YWx1ZSgpLCBiIlhZXG5aQVxyQiIpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGUgZW5jb2RpbmcgYXR0cmlidXRlIGlzIGFsd2F5cyBzZXQsIGFuZCB2YWxpZAorICAgICAgICBiID0gc2VsZi5CeXRlc0lPKCkKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0idXRmOCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5lbmNvZGluZywgInV0ZjgiKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0LmVuY29kaW5nIGlzIG5vdCBOb25lKQorICAgICAgICBjb2RlY3MubG9va3VwKHQuZW5jb2RpbmcpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZ19lcnJvcnNfcmVhZGluZyhzZWxmKToKKyAgICAgICAgIyAoMSkgZGVmYXVsdAorICAgICAgICBiID0gc2VsZi5CeXRlc0lPKGIiYWJjXG5ceGZmXG4iKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIsIGVuY29kaW5nPSJhc2NpaSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdC5yZWFkKQorICAgICAgICAjICgyKSBleHBsaWNpdCBzdHJpY3QKKyAgICAgICAgYiA9IHNlbGYuQnl0ZXNJTyhiImFiY1xuXHhmZlxuIikKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9InN0cmljdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdC5yZWFkKQorICAgICAgICAjICgzKSBpZ25vcmUKKyAgICAgICAgYiA9IHNlbGYuQnl0ZXNJTyhiImFiY1xuXHhmZlxuIikKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9Imlnbm9yZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5yZWFkKCksICJhYmNcblxuIikKKyAgICAgICAgIyAoNCkgcmVwbGFjZQorICAgICAgICBiID0gc2VsZi5CeXRlc0lPKGIiYWJjXG5ceGZmXG4iKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIsIGVuY29kaW5nPSJhc2NpaSIsIGVycm9ycz0icmVwbGFjZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5yZWFkKCksICJhYmNcblx1ZmZmZFxuIikKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nX2Vycm9yc193cml0aW5nKHNlbGYpOgorICAgICAgICAjICgxKSBkZWZhdWx0CisgICAgICAgIGIgPSBzZWxmLkJ5dGVzSU8oKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIsIGVuY29kaW5nPSJhc2NpaSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdC53cml0ZSwgIlx4ZmYiKQorICAgICAgICAjICgyKSBleHBsaWNpdCBzdHJpY3QKKyAgICAgICAgYiA9IHNlbGYuQnl0ZXNJTygpCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYiwgZW5jb2Rpbmc9ImFzY2lpIiwgZXJyb3JzPSJzdHJpY3QiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHQud3JpdGUsICJceGZmIikKKyAgICAgICAgIyAoMykgaWdub3JlCisgICAgICAgIGIgPSBzZWxmLkJ5dGVzSU8oKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIsIGVuY29kaW5nPSJhc2NpaSIsIGVycm9ycz0iaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3bGluZT0iXG4iKQorICAgICAgICB0LndyaXRlKCJhYmNceGZmZGVmXG4iKQorICAgICAgICB0LmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmdldHZhbHVlKCksIGIiYWJjZGVmXG4iKQorICAgICAgICAjICg0KSByZXBsYWNlCisgICAgICAgIGIgPSBzZWxmLkJ5dGVzSU8oKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIsIGVuY29kaW5nPSJhc2NpaSIsIGVycm9ycz0icmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmU9IlxuIikKKyAgICAgICAgdC53cml0ZSgiYWJjXHhmZmRlZlxuIikKKyAgICAgICAgdC5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5nZXR2YWx1ZSgpLCBiImFiYz9kZWZcbiIpCisKKyAgICBkZWYgdGVzdF9uZXdsaW5lcyhzZWxmKToKKyAgICAgICAgaW5wdXRfbGluZXMgPSBbICJ1bml4XG4iLCAid2luZG93c1xyXG4iLCAib3M5XHIiLCAibGFzdFxuIiwgIm5vbmwiIF0KKworICAgICAgICB0ZXN0cyA9IFsKKyAgICAgICAgICAgIFsgTm9uZSwgWyAndW5peFxuJywgJ3dpbmRvd3NcbicsICdvczlcbicsICdsYXN0XG4nLCAnbm9ubCcgXSBdLAorICAgICAgICAgICAgWyAnJywgaW5wdXRfbGluZXMgXSwKKyAgICAgICAgICAgIFsgJ1xuJywgWyAidW5peFxuIiwgIndpbmRvd3NcclxuIiwgIm9zOVxybGFzdFxuIiwgIm5vbmwiIF0gXSwKKyAgICAgICAgICAgIFsgJ1xyXG4nLCBbICJ1bml4XG53aW5kb3dzXHJcbiIsICJvczlccmxhc3Rcbm5vbmwiIF0gXSwKKyAgICAgICAgICAgIFsgJ1xyJywgWyAidW5peFxud2luZG93c1xyIiwgIlxub3M5XHIiLCAibGFzdFxubm9ubCIgXSBdLAorICAgICAgICBdCisgICAgICAgIGVuY29kaW5ncyA9ICgKKyAgICAgICAgICAgICd1dGYtOCcsICdsYXRpbi0xJywKKyAgICAgICAgICAgICd1dGYtMTYnLCAndXRmLTE2LWxlJywgJ3V0Zi0xNi1iZScsCisgICAgICAgICAgICAndXRmLTMyJywgJ3V0Zi0zMi1sZScsICd1dGYtMzItYmUnLAorICAgICAgICApCisKKyAgICAgICAgIyBUcnkgYSByYW5nZSBvZiBidWZmZXIgc2l6ZXMgdG8gdGVzdCB0aGUgY2FzZSB3aGVyZSBcciBpcyB0aGUgbGFzdAorICAgICAgICAjIGNoYXJhY3RlciBpbiBUZXh0SU9XcmFwcGVyLl9wZW5kaW5nX2xpbmUuCisgICAgICAgIGZvciBlbmNvZGluZyBpbiBlbmNvZGluZ3M6CisgICAgICAgICAgICAjIFhYWDogc3RyLmVuY29kZSgpIHNob3VsZCByZXR1cm4gYnl0ZXMKKyAgICAgICAgICAgIGRhdGEgPSBieXRlcygnJy5qb2luKGlucHV0X2xpbmVzKS5lbmNvZGUoZW5jb2RpbmcpKQorICAgICAgICAgICAgZm9yIGRvX3JlYWRzIGluIChGYWxzZSwgVHJ1ZSk6CisgICAgICAgICAgICAgICAgZm9yIGJ1ZnNpemUgaW4gcmFuZ2UoMSwgMTApOgorICAgICAgICAgICAgICAgICAgICBmb3IgbmV3bGluZSwgZXhwX2xpbmVzIGluIHRlc3RzOgorICAgICAgICAgICAgICAgICAgICAgICAgYnVmaW8gPSBzZWxmLkJ1ZmZlcmVkUmVhZGVyKHNlbGYuQnl0ZXNJTyhkYXRhKSwgYnVmc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHRpbyA9IHNlbGYuVGV4dElPV3JhcHBlcihidWZpbywgbmV3bGluZT1uZXdsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz1lbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRvX3JlYWRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdF9saW5lcyA9IFtdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSB0ZXh0aW8ucmVhZCgyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjMiA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMyKSwgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290X2xpbmVzLmFwcGVuZChjMiArIHRleHRpby5yZWFkbGluZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RfbGluZXMgPSBsaXN0KHRleHRpbykKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGdvdF9saW5lLCBleHBfbGluZSBpbiB6aXAoZ290X2xpbmVzLCBleHBfbGluZXMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290X2xpbmUsIGV4cF9saW5lKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ290X2xpbmVzKSwgbGVuKGV4cF9saW5lcykpCisKKyAgICBkZWYgdGVzdF9uZXdsaW5lc19pbnB1dChzZWxmKToKKyAgICAgICAgdGVzdGRhdGEgPSBiIkFBQVxuQkJceDAwQlxuQ0NDXHJERERcckVFRVxyXG5GRkZcclxuR0dHIgorICAgICAgICBub3JtYWxpemVkID0gdGVzdGRhdGEucmVwbGFjZShiIlxyXG4iLCBiIlxuIikucmVwbGFjZShiIlxyIiwgYiJcbiIpCisgICAgICAgIGZvciBuZXdsaW5lLCBleHBlY3RlZCBpbiBbCisgICAgICAgICAgICAoTm9uZSwgbm9ybWFsaXplZC5kZWNvZGUoImFzY2lpIikuc3BsaXRsaW5lcyhUcnVlKSksCisgICAgICAgICAgICAoIiIsIHRlc3RkYXRhLmRlY29kZSgiYXNjaWkiKS5zcGxpdGxpbmVzKFRydWUpKSwKKyAgICAgICAgICAgICgiXG4iLCBbIkFBQVxuIiwgIkJCXHgwMEJcbiIsICJDQ0NcckRERFxyRUVFXHJcbiIsICJGRkZcclxuIiwgIkdHRyJdKSwKKyAgICAgICAgICAgICgiXHJcbiIsIFsiQUFBXG5CQlx4MDBCXG5DQ0NcckRERFxyRUVFXHJcbiIsICJGRkZcclxuIiwgIkdHRyJdKSwKKyAgICAgICAgICAgICgiXHIiLCAgWyJBQUFcbkJCXHgwMEJcbkNDQ1xyIiwgIkRERFxyIiwgIkVFRVxyIiwgIlxuRkZGXHIiLCAiXG5HR0ciXSksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgYnVmID0gc2VsZi5CeXRlc0lPKHRlc3RkYXRhKQorICAgICAgICAgICAgdHh0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGJ1ZiwgZW5jb2Rpbmc9ImFzY2lpIiwgbmV3bGluZT1uZXdsaW5lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eHQucmVhZGxpbmVzKCksIGV4cGVjdGVkKQorICAgICAgICAgICAgdHh0LnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHh0LnJlYWQoKSwgIiIuam9pbihleHBlY3RlZCkpCisKKyAgICBkZWYgdGVzdF9uZXdsaW5lc19vdXRwdXQoc2VsZik6CisgICAgICAgIHRlc3RkaWN0ID0geworICAgICAgICAgICAgIiI6IGIiQUFBXG5CQkJcbkNDQ1xuWFxyWVxyXG5aIiwKKyAgICAgICAgICAgICJcbiI6IGIiQUFBXG5CQkJcbkNDQ1xuWFxyWVxyXG5aIiwKKyAgICAgICAgICAgICJcciI6IGIiQUFBXHJCQkJcckNDQ1xyWFxyWVxyXHJaIiwKKyAgICAgICAgICAgICJcclxuIjogYiJBQUFcclxuQkJCXHJcbkNDQ1xyXG5YXHJZXHJcclxuWiIsCisgICAgICAgICAgICB9CisgICAgICAgIHRlc3RzID0gWyhOb25lLCB0ZXN0ZGljdFtvcy5saW5lc2VwXSldICsgc29ydGVkKHRlc3RkaWN0Lml0ZW1zKCkpCisgICAgICAgIGZvciBuZXdsaW5lLCBleHBlY3RlZCBpbiB0ZXN0czoKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuQnl0ZXNJTygpCisgICAgICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYnVmLCBlbmNvZGluZz0iYXNjaWkiLCBuZXdsaW5lPW5ld2xpbmUpCisgICAgICAgICAgICB0eHQud3JpdGUoIkFBQVxuQiIpCisgICAgICAgICAgICB0eHQud3JpdGUoIkJCXG5DQ0NcbiIpCisgICAgICAgICAgICB0eHQud3JpdGUoIlhccllcclxuWiIpCisgICAgICAgICAgICB0eHQuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYuY2xvc2VkLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLmdldHZhbHVlKCksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfZGVzdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgbCA9IFtdCisgICAgICAgIGJhc2UgPSBzZWxmLkJ5dGVzSU8KKyAgICAgICAgY2xhc3MgTXlCeXRlc0lPKGJhc2UpOgorICAgICAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgICAgIGwuYXBwZW5kKHNlbGYuZ2V0dmFsdWUoKSkKKyAgICAgICAgICAgICAgICBiYXNlLmNsb3NlKHNlbGYpCisgICAgICAgIGIgPSBNeUJ5dGVzSU8oKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIsIGVuY29kaW5nPSJhc2NpaSIpCisgICAgICAgIHQud3JpdGUoImFiYyIpCisgICAgICAgIGRlbCB0CisgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2IiYWJjIl0sIGwpCisKKyAgICBkZWYgdGVzdF9vdmVycmlkZV9kZXN0cnVjdG9yKHNlbGYpOgorICAgICAgICByZWNvcmQgPSBbXQorICAgICAgICBjbGFzcyBNeVRleHRJTyhzZWxmLlRleHRJT1dyYXBwZXIpOgorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZCgxKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZiA9IHN1cGVyKE15VGV4dElPLCBzZWxmKS5fX2RlbF9fCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZigpCisgICAgICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZCgyKQorICAgICAgICAgICAgICAgIHN1cGVyKE15VGV4dElPLCBzZWxmKS5jbG9zZSgpCisgICAgICAgICAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZCgzKQorICAgICAgICAgICAgICAgIHN1cGVyKE15VGV4dElPLCBzZWxmKS5mbHVzaCgpCisgICAgICAgIGIgPSBzZWxmLkJ5dGVzSU8oKQorICAgICAgICB0ID0gTXlUZXh0SU8oYiwgZW5jb2Rpbmc9ImFzY2lpIikKKyAgICAgICAgZGVsIHQKKyAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNvcmQsIFsxLCAyLCAzXSkKKworICAgIGRlZiB0ZXN0X2Vycm9yX3Rocm91Z2hfZGVzdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgdGhlIGV4Y2VwdGlvbiBzdGF0ZSBpcyBub3QgbW9kaWZpZWQgYnkgYSBkZXN0cnVjdG9yLAorICAgICAgICAjIGV2ZW4gaWYgY2xvc2UoKSBmYWlscy4KKyAgICAgICAgcmF3aW8gPSBzZWxmLkNsb3NlRmFpbHVyZUlPKCkKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIHNlbGYuVGV4dElPV3JhcHBlcihyYXdpbykueHl6enkKKyAgICAgICAgd2l0aCBzdXBwb3J0LmNhcHR1cmVkX291dHB1dCgic3RkZXJyIikgYXMgczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBmKQorICAgICAgICBzID0gcy5nZXR2YWx1ZSgpLnN0cmlwKCkKKyAgICAgICAgaWYgczoKKyAgICAgICAgICAgICMgVGhlIGRlc3RydWN0b3IgKm1heSogaGF2ZSBwcmludGVkIGFuIHVucmFpc2FibGUgZXJyb3IsIGNoZWNrIGl0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzLnNwbGl0bGluZXMoKSksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCJFeGNlcHRpb24gSU9FcnJvcjogIiksIHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5lbmRzd2l0aCgiIGlnbm9yZWQiKSwgcykKKworICAgICMgU3lzdGVtYXRpYyB0ZXN0cyBvZiB0aGUgdGV4dCBJL08gQVBJCisKKyAgICBkZWYgdGVzdF9iYXNpY19pbyhzZWxmKToKKyAgICAgICAgZm9yIGNodW5rc2l6ZSBpbiAoMSwgMiwgMywgNCwgNSwgMTUsIDE2LCAxNywgMzEsIDMyLCAzMywgNjMsIDY0LCA2NSk6CisgICAgICAgICAgICBmb3IgZW5jIGluICJhc2NpaSIsICJsYXRpbjEiLCAidXRmOCIgOiMgLCAidXRmLTE2LWJlIiwgInV0Zi0xNi1sZSI6CisgICAgICAgICAgICAgICAgZiA9IHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIncrIiwgZW5jb2Rpbmc9ZW5jKQorICAgICAgICAgICAgICAgIGYuX0NIVU5LX1NJWkUgPSBjaHVua3NpemUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGUoImFiYyIpLCAzKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyKyIsIGVuY29kaW5nPWVuYykKKyAgICAgICAgICAgICAgICBmLl9DSFVOS19TSVpFID0gY2h1bmtzaXplCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAiYWJjIikKKyAgICAgICAgICAgICAgICBjb29raWUgPSBmLnRlbGwoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKDApLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKE5vbmUpLCAiYWJjIikKKyAgICAgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgyKSwgImFiIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgxKSwgImMiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKDEpLCAiIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAiIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBjb29raWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWsoMCksIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWsoMCwgMiksIGNvb2tpZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGUoImRlZiIpLCAzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKGNvb2tpZSksIGNvb2tpZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAiZGVmIikKKyAgICAgICAgICAgICAgICBpZiBlbmMuc3RhcnRzd2l0aCgidXRmIik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubXVsdGlfbGluZV90ZXN0KGYsIGVuYykKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBtdWx0aV9saW5lX3Rlc3Qoc2VsZiwgZiwgZW5jKToKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIGYudHJ1bmNhdGUoKQorICAgICAgICBzYW1wbGUgPSAic1x4ZmZcdTBmZmZcdWZmZmYiCisgICAgICAgIHdsaW5lcyA9IFtdCisgICAgICAgIGZvciBzaXplIGluICgwLCAxLCAyLCAzLCA0LCA1LCAzMCwgMzEsIDMyLCAzMywgNjIsIDYzLCA2NCwgNjUsIDEwMDApOgorICAgICAgICAgICAgY2hhcnMgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgY2hhcnMuYXBwZW5kKHNhbXBsZVtpICUgbGVuKHNhbXBsZSldKQorICAgICAgICAgICAgbGluZSA9ICIiLmpvaW4oY2hhcnMpICsgIlxuIgorICAgICAgICAgICAgd2xpbmVzLmFwcGVuZCgoZi50ZWxsKCksIGxpbmUpKQorICAgICAgICAgICAgZi53cml0ZShsaW5lKQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgcmxpbmVzID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHBvcyA9IGYudGVsbCgpCisgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcmxpbmVzLmFwcGVuZCgocG9zLCBsaW5lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChybGluZXMsIHdsaW5lcykKKworICAgIGRlZiB0ZXN0X3RlbGxpbmcoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3KyIsIGVuY29kaW5nPSJ1dGY4IikKKyAgICAgICAgcDAgPSBmLnRlbGwoKQorICAgICAgICBmLndyaXRlKCJceGZmXG4iKQorICAgICAgICBwMSA9IGYudGVsbCgpCisgICAgICAgIGYud3JpdGUoIlx4ZmZcbiIpCisgICAgICAgIHAyID0gZi50ZWxsKCkKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIHAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmUoKSwgIlx4ZmZcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIHAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmUoKSwgIlx4ZmZcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIHAyKQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgIlx4ZmZcbiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBmLnRlbGwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIHAyKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3NlZWtpbmcoc2VsZik6CisgICAgICAgIGNodW5rX3NpemUgPSBfZGVmYXVsdF9jaHVua19zaXplKCkKKyAgICAgICAgcHJlZml4X3NpemUgPSBjaHVua19zaXplIC0gMgorICAgICAgICB1X3ByZWZpeCA9ICJhIiAqIHByZWZpeF9zaXplCisgICAgICAgIHByZWZpeCA9IGJ5dGVzKHVfcHJlZml4LmVuY29kZSgidXRmLTgiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odV9wcmVmaXgpLCBsZW4ocHJlZml4KSkKKyAgICAgICAgdV9zdWZmaXggPSAiXHU4ODg4XG4iCisgICAgICAgIHN1ZmZpeCA9IGJ5dGVzKHVfc3VmZml4LmVuY29kZSgidXRmLTgiKSkKKyAgICAgICAgbGluZSA9IHByZWZpeCArIHN1ZmZpeAorICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICBmLndyaXRlKGxpbmUqMikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyIiwgZW5jb2Rpbmc9InV0Zi04IikKKyAgICAgICAgcyA9IGYucmVhZChwcmVmaXhfc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBwcmVmaXguZGVjb2RlKCJhc2NpaSIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBwcmVmaXhfc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lKCksIHVfc3VmZml4KQorCisgICAgZGVmIHRlc3Rfc2Vla2luZ190b28oc2VsZik6CisgICAgICAgICMgUmVncmVzc2lvbiB0ZXN0IGZvciBhIHNwZWNpZmljIGJ1ZworICAgICAgICBkYXRhID0gYidceGUwXHhiZlx4YmZcbicKKyAgICAgICAgZiA9IHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZiA9IHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInIiLCBlbmNvZGluZz0idXRmLTgiKQorICAgICAgICBmLl9DSFVOS19TSVpFICAjIEp1c3QgdGVzdCB0aGF0IGl0IGV4aXN0cworICAgICAgICBmLl9DSFVOS19TSVpFID0gMgorICAgICAgICBmLnJlYWRsaW5lKCkKKyAgICAgICAgZi50ZWxsKCkKKworICAgIGRlZiB0ZXN0X3NlZWtfYW5kX3RlbGwoc2VsZik6CisgICAgICAgICNUZXN0IHNlZWsvdGVsbCB1c2luZyB0aGUgU3RhdGVmdWxJbmNyZW1lbnRhbERlY29kZXIuCisgICAgICAgICMgTWFrZSB0ZXN0IGZhc3RlciBieSBkb2luZyBzbWFsbGVyIHNlZWtzCisgICAgICAgIENIVU5LX1NJWkUgPSAxMjgKKworICAgICAgICBkZWYgdGVzdF9zZWVrX2FuZF90ZWxsX3dpdGhfZGF0YShkYXRhLCBtaW5fcG9zPTApOgorICAgICAgICAgICAgIiIiVGVsbC9zZWVrIHRvIHZhcmlvdXMgcG9pbnRzIHdpdGhpbiBhIGRhdGEgc3RyZWFtIGFuZCBlbnN1cmUKKyAgICAgICAgICAgIHRoYXQgdGhlIGRlY29kZWQgZGF0YSByZXR1cm5lZCBieSByZWFkKCkgaXMgY29uc2lzdGVudC4iIiIKKyAgICAgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICd3YicpCisgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sIGVuY29kaW5nPSd0ZXN0X2RlY29kZXInKQorICAgICAgICAgICAgZi5fQ0hVTktfU0laRSA9IENIVU5LX1NJWkUKKyAgICAgICAgICAgIGRlY29kZWQgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG1pbl9wb3MsIGxlbihkZWNvZGVkKSArIDEpOiAjIHNlZWsgcG9zaXRpb25zCisgICAgICAgICAgICAgICAgZm9yIGogaW4gWzEsIDUsIGxlbihkZWNvZGVkKSAtIGldOiAjIHJlYWQgbGVuZ3RocworICAgICAgICAgICAgICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCBlbmNvZGluZz0ndGVzdF9kZWNvZGVyJykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoaSksIGRlY29kZWRbOmldKQorICAgICAgICAgICAgICAgICAgICBjb29raWUgPSBmLnRlbGwoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZChqKSwgZGVjb2RlZFtpOmkgKyBqXSkKKyAgICAgICAgICAgICAgICAgICAgZi5zZWVrKGNvb2tpZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgZGVjb2RlZFtpOl0pCisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICMgRW5hYmxlIHRoZSB0ZXN0IGRlY29kZXIuCisgICAgICAgIFN0YXRlZnVsSW5jcmVtZW50YWxEZWNvZGVyLmNvZGVjRW5hYmxlZCA9IDEKKworICAgICAgICAjIFJ1biB0aGUgdGVzdHMuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgVHJ5IGVhY2ggdGVzdCBjYXNlLgorICAgICAgICAgICAgZm9yIGlucHV0LCBfLCBfIGluIFN0YXRlZnVsSW5jcmVtZW50YWxEZWNvZGVyVGVzdC50ZXN0X2Nhc2VzOgorICAgICAgICAgICAgICAgIHRlc3Rfc2Vla19hbmRfdGVsbF93aXRoX2RhdGEoaW5wdXQpCisKKyAgICAgICAgICAgICMgUG9zaXRpb24gZWFjaCB0ZXN0IGNhc2Ugc28gdGhhdCBpdCBjcm9zc2VzIGEgY2h1bmsgYm91bmRhcnkuCisgICAgICAgICAgICBmb3IgaW5wdXQsIF8sIF8gaW4gU3RhdGVmdWxJbmNyZW1lbnRhbERlY29kZXJUZXN0LnRlc3RfY2FzZXM6CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gQ0hVTktfU0laRSAtIGxlbihpbnB1dCkvLzIKKyAgICAgICAgICAgICAgICBwcmVmaXggPSBiJy4nKm9mZnNldAorICAgICAgICAgICAgICAgICMgRG9uJ3QgYm90aGVyIHNlZWtpbmcgaW50byB0aGUgcHJlZml4ICh0YWtlcyB0b28gbG9uZykuCisgICAgICAgICAgICAgICAgbWluX3BvcyA9IG9mZnNldCoyCisgICAgICAgICAgICAgICAgdGVzdF9zZWVrX2FuZF90ZWxsX3dpdGhfZGF0YShwcmVmaXggKyBpbnB1dCwgbWluX3BvcykKKworICAgICAgICAjIEVuc3VyZSBvdXIgdGVzdCBkZWNvZGVyIHdvbid0IGludGVyZmVyZSB3aXRoIHN1YnNlcXVlbnQgdGVzdHMuCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBTdGF0ZWZ1bEluY3JlbWVudGFsRGVjb2Rlci5jb2RlY0VuYWJsZWQgPSAwCisKKyAgICBkZWYgdGVzdF9lbmNvZGVkX3dyaXRlcyhzZWxmKToKKyAgICAgICAgZGF0YSA9ICIxMjM0NTY3ODkwIgorICAgICAgICB0ZXN0cyA9ICgidXRmLTE2IiwKKyAgICAgICAgICAgICAgICAgInV0Zi0xNi1sZSIsCisgICAgICAgICAgICAgICAgICJ1dGYtMTYtYmUiLAorICAgICAgICAgICAgICAgICAidXRmLTMyIiwKKyAgICAgICAgICAgICAgICAgInV0Zi0zMi1sZSIsCisgICAgICAgICAgICAgICAgICJ1dGYtMzItYmUiKQorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gdGVzdHM6CisgICAgICAgICAgICBidWYgPSBzZWxmLkJ5dGVzSU8oKQorICAgICAgICAgICAgZiA9IHNlbGYuVGV4dElPV3JhcHBlcihidWYsIGVuY29kaW5nPWVuY29kaW5nKQorICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgQk9NIGlzIHdyaXR0ZW4gb25seSBvbmNlIChzZWUgaXNzdWUxNzUzKS4KKyAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgZGF0YSAqIDIpCisgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGRhdGEgKiAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYuZ2V0dmFsdWUoKSwgKGRhdGEgKiAyKS5lbmNvZGUoZW5jb2RpbmcpKQorCisgICAgZGVmIHRlc3RfdW5yZWFkYWJsZShzZWxmKToKKyAgICAgICAgY2xhc3MgVW5SZWFkYWJsZShzZWxmLkJ5dGVzSU8pOgorICAgICAgICAgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoVW5SZWFkYWJsZSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB0eHQucmVhZCkKKworICAgIGRlZiB0ZXN0X3JlYWRfb25lX2J5X29uZShzZWxmKToKKyAgICAgICAgdHh0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKHNlbGYuQnl0ZXNJTyhiIkFBXHJcbkJCIikpCisgICAgICAgIHJlYWRzID0gIiIKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGMgPSB0eHQucmVhZCgxKQorICAgICAgICAgICAgaWYgbm90IGM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHJlYWRzICs9IGMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkcywgIkFBXG5CQiIpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6CisgICAgICAgIHR4dCA9IHNlbGYuVGV4dElPV3JhcHBlcihzZWxmLkJ5dGVzSU8oYiJBQVxuQkJcbkNDIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHh0LnJlYWRsaW5lcygpLCBbIkFBXG4iLCAiQkJcbiIsICJDQyJdKQorICAgICAgICB0eHQuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR4dC5yZWFkbGluZXMoTm9uZSksIFsiQUFcbiIsICJCQlxuIiwgIkNDIl0pCisgICAgICAgIHR4dC5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHh0LnJlYWRsaW5lcyg1KSwgWyJBQVxuIiwgIkJCXG4iXSkKKworICAgICMgcmVhZCBpbiBhbW91bnRzIGVxdWFsIHRvIFRleHRJT1dyYXBwZXIuX0NIVU5LX1NJWkUgd2hpY2ggaXMgMTI4LgorICAgIGRlZiB0ZXN0X3JlYWRfYnlfY2h1bmsoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlICJcclxuIiBzdHJhZGRsZXMgMTI4IGNoYXIgYm91bmRhcnkuCisgICAgICAgIHR4dCA9IHNlbGYuVGV4dElPV3JhcHBlcihzZWxmLkJ5dGVzSU8oYiJBIiAqIDEyNyArIGIiXHJcbkIiKSkKKyAgICAgICAgcmVhZHMgPSAiIgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgYyA9IHR4dC5yZWFkKDEyOCkKKyAgICAgICAgICAgIGlmIG5vdCBjOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZWFkcyArPSBjCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZHMsICJBIioxMjcrIlxuQiIpCisKKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzKHNlbGYpOgorICAgICAgICBsID0gWydhYicsICdjZCcsICdlZiddCisgICAgICAgIGJ1ZiA9IHNlbGYuQnl0ZXNJTygpCisgICAgICAgIHR4dCA9IHNlbGYuVGV4dElPV3JhcHBlcihidWYpCisgICAgICAgIHR4dC53cml0ZWxpbmVzKGwpCisgICAgICAgIHR4dC5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLmdldHZhbHVlKCksIGInYWJjZGVmJykKKworICAgIGRlZiB0ZXN0X3dyaXRlbGluZXNfdXNlcmxpc3Qoc2VsZik6CisgICAgICAgIGwgPSBVc2VyTGlzdChbJ2FiJywgJ2NkJywgJ2VmJ10pCisgICAgICAgIGJ1ZiA9IHNlbGYuQnl0ZXNJTygpCisgICAgICAgIHR4dCA9IHNlbGYuVGV4dElPV3JhcHBlcihidWYpCisgICAgICAgIHR4dC53cml0ZWxpbmVzKGwpCisgICAgICAgIHR4dC5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLmdldHZhbHVlKCksIGInYWJjZGVmJykKKworICAgIGRlZiB0ZXN0X3dyaXRlbGluZXNfZXJyb3Ioc2VsZik6CisgICAgICAgIHR4dCA9IHNlbGYuVGV4dElPV3JhcHBlcihzZWxmLkJ5dGVzSU8oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0eHQud3JpdGVsaW5lcywgWzEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHR4dC53cml0ZWxpbmVzLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHR4dC53cml0ZWxpbmVzLCBiJ2FiYycpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTEzOTVfMShzZWxmKToKKyAgICAgICAgdHh0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKHNlbGYuQnl0ZXNJTyhzZWxmLnRlc3RkYXRhKSwgZW5jb2Rpbmc9ImFzY2lpIikKKworICAgICAgICAjIHJlYWQgb25lIGNoYXIgYXQgYSB0aW1lCisgICAgICAgIHJlYWRzID0gIiIKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGMgPSB0eHQucmVhZCgxKQorICAgICAgICAgICAgaWYgbm90IGM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHJlYWRzICs9IGMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkcywgc2VsZi5ub3JtYWxpemVkKQorCisgICAgZGVmIHRlc3RfaXNzdWUxMzk1XzIoc2VsZik6CisgICAgICAgIHR4dCA9IHNlbGYuVGV4dElPV3JhcHBlcihzZWxmLkJ5dGVzSU8oc2VsZi50ZXN0ZGF0YSksIGVuY29kaW5nPSJhc2NpaSIpCisgICAgICAgIHR4dC5fQ0hVTktfU0laRSA9IDQKKworICAgICAgICByZWFkcyA9ICIiCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjID0gdHh0LnJlYWQoNCkKKyAgICAgICAgICAgIGlmIG5vdCBjOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZWFkcyArPSBjCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZHMsIHNlbGYubm9ybWFsaXplZCkKKworICAgIGRlZiB0ZXN0X2lzc3VlMTM5NV8zKHNlbGYpOgorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKHNlbGYudGVzdGRhdGEpLCBlbmNvZGluZz0iYXNjaWkiKQorICAgICAgICB0eHQuX0NIVU5LX1NJWkUgPSA0CisKKyAgICAgICAgcmVhZHMgPSB0eHQucmVhZCg0KQorICAgICAgICByZWFkcyArPSB0eHQucmVhZCg0KQorICAgICAgICByZWFkcyArPSB0eHQucmVhZGxpbmUoKQorICAgICAgICByZWFkcyArPSB0eHQucmVhZGxpbmUoKQorICAgICAgICByZWFkcyArPSB0eHQucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRzLCBzZWxmLm5vcm1hbGl6ZWQpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTEzOTVfNChzZWxmKToKKyAgICAgICAgdHh0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKHNlbGYuQnl0ZXNJTyhzZWxmLnRlc3RkYXRhKSwgZW5jb2Rpbmc9ImFzY2lpIikKKyAgICAgICAgdHh0Ll9DSFVOS19TSVpFID0gNAorCisgICAgICAgIHJlYWRzID0gdHh0LnJlYWQoNCkKKyAgICAgICAgcmVhZHMgKz0gdHh0LnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRzLCBzZWxmLm5vcm1hbGl6ZWQpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTEzOTVfNShzZWxmKToKKyAgICAgICAgdHh0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKHNlbGYuQnl0ZXNJTyhzZWxmLnRlc3RkYXRhKSwgZW5jb2Rpbmc9ImFzY2lpIikKKyAgICAgICAgdHh0Ll9DSFVOS19TSVpFID0gNAorCisgICAgICAgIHJlYWRzID0gdHh0LnJlYWQoNCkKKyAgICAgICAgcG9zID0gdHh0LnRlbGwoKQorICAgICAgICB0eHQuc2VlaygwKQorICAgICAgICB0eHQuc2Vlayhwb3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHh0LnJlYWQoNCksICJCQkJcbiIpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTIyODIoc2VsZik6CisgICAgICAgIGJ1ZmZlciA9IHNlbGYuQnl0ZXNJTyhzZWxmLnRlc3RkYXRhKQorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYnVmZmVyLCBlbmNvZGluZz0iYXNjaWkiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmZmVyLnNlZWthYmxlKCksIHR4dC5zZWVrYWJsZSgpKQorCisgICAgZGVmIHRlc3RfYXBwZW5kX2JvbShzZWxmKToKKyAgICAgICAgIyBUaGUgQk9NIGlzIG5vdCB3cml0dGVuIGFnYWluIHdoZW4gYXBwZW5kaW5nIHRvIGEgbm9uLWVtcHR5IGZpbGUKKyAgICAgICAgZmlsZW5hbWUgPSBzdXBwb3J0LlRFU1RGTgorICAgICAgICBmb3IgY2hhcnNldCBpbiAoJ3V0Zi04LXNpZycsICd1dGYtMTYnLCAndXRmLTMyJyk6CisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihmaWxlbmFtZSwgJ3cnLCBlbmNvZGluZz1jaGFyc2V0KSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoJ2FhYScpCisgICAgICAgICAgICAgICAgcG9zID0gZi50ZWxsKCkKKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKGZpbGVuYW1lLCAncmInKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICdhYWEnLmVuY29kZShjaGFyc2V0KSkKKworICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oZmlsZW5hbWUsICdhJywgZW5jb2Rpbmc9Y2hhcnNldCkgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKCd4eHgnKQorICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgJ2FhYXh4eCcuZW5jb2RlKGNoYXJzZXQpKQorCisgICAgZGVmIHRlc3Rfc2Vla19ib20oc2VsZik6CisgICAgICAgICMgU2FtZSB0ZXN0LCBidXQgd2hlbiBzZWVraW5nIG1hbnVhbGx5CisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgZm9yIGNoYXJzZXQgaW4gKCd1dGYtOC1zaWcnLCAndXRmLTE2JywgJ3V0Zi0zMicpOgorICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oZmlsZW5hbWUsICd3JywgZW5jb2Rpbmc9Y2hhcnNldCkgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKCdhYWEnKQorICAgICAgICAgICAgICAgIHBvcyA9IGYudGVsbCgpCisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihmaWxlbmFtZSwgJ3IrJywgZW5jb2Rpbmc9Y2hhcnNldCkgYXMgZjoKKyAgICAgICAgICAgICAgICBmLnNlZWsocG9zKQorICAgICAgICAgICAgICAgIGYud3JpdGUoJ3p6eicpCisgICAgICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICAgICAgZi53cml0ZSgnYmJiJykKKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKGZpbGVuYW1lLCAncmInKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICdiYmJ6enonLmVuY29kZShjaGFyc2V0KSkKKworICAgIGRlZiB0ZXN0X2Vycm9yc19wcm9wZXJ0eShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3IikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5lcnJvcnMsICJzdHJpY3QiKQorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInciLCBlcnJvcnM9InJlcGxhY2UiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmVycm9ycywgInJlcGxhY2UiKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBkZWYgdGVzdF90aHJlYWRzX3dyaXRlKHNlbGYpOgorICAgICAgICAjIElzc3VlNjc1MDogY29uY3VycmVudCB3cml0ZXMgY291bGQgZHVwbGljYXRlIGRhdGEKKyAgICAgICAgZXZlbnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInciLCBidWZmZXJpbmc9MSkgYXMgZjoKKyAgICAgICAgICAgIGRlZiBydW4obik6CisgICAgICAgICAgICAgICAgdGV4dCA9ICJUaHJlYWQlMDNkXG4iICUgbgorICAgICAgICAgICAgICAgIGV2ZW50LndhaXQoKQorICAgICAgICAgICAgICAgIGYud3JpdGUodGV4dCkKKyAgICAgICAgICAgIHRocmVhZHMgPSBbdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9bGFtYmRhIG49eDogcnVuKG4pKQorICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiByYW5nZSgyMCldCisgICAgICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAyKQorICAgICAgICAgICAgZXZlbnQuc2V0KCkKKyAgICAgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4pIGFzIGY6CisgICAgICAgICAgICBjb250ZW50ID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGZvciBuIGluIHJhbmdlKDIwKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnQuY291bnQoIlRocmVhZCUwM2RcbiIgJSBuKSwgMSkKKworICAgIGRlZiB0ZXN0X2ZsdXNoX2Vycm9yX29uX2Nsb3NlKHNlbGYpOgorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKHNlbGYudGVzdGRhdGEpLCBlbmNvZGluZz0iYXNjaWkiKQorICAgICAgICBkZWYgYmFkX2ZsdXNoKCk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCkKKyAgICAgICAgdHh0LmZsdXNoID0gYmFkX2ZsdXNoCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHR4dC5jbG9zZSkgIyBleGNlcHRpb24gbm90IHN3YWxsb3dlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUodHh0LmNsb3NlZCkKKworICAgIGRlZiB0ZXN0X211bHRpX2Nsb3NlKHNlbGYpOgorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKHNlbGYudGVzdGRhdGEpLCBlbmNvZGluZz0iYXNjaWkiKQorICAgICAgICB0eHQuY2xvc2UoKQorICAgICAgICB0eHQuY2xvc2UoKQorICAgICAgICB0eHQuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0eHQuZmx1c2gpCisKKyAgICBkZWYgdGVzdF9yZWFkb25seV9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKHNlbGYudGVzdGRhdGEpLCBlbmNvZGluZz0iYXNjaWkiKQorICAgICAgICBidWYgPSBzZWxmLkJ5dGVzSU8oc2VsZi50ZXN0ZGF0YSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcygoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcikpOgorICAgICAgICAgICAgdHh0LmJ1ZmZlciA9IGJ1ZgorCisgICAgZGVmIHRlc3RfcmVhZF9ub25ieXRlcyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTcxMDYKKyAgICAgICAgIyBDcmFzaCB3aGVuIHVuZGVybHlpbmcgcmVhZCgpIHJldHVybnMgbm9uLWJ5dGVzCisgICAgICAgIGNsYXNzIE5vbmJ5dGVzU3RyZWFtKHNlbGYuU3RyaW5nSU8pOgorICAgICAgICAgICAgcmVhZDEgPSBzZWxmLlN0cmluZ0lPLnJlYWQKKyAgICAgICAgY2xhc3MgTm9uYnl0ZXNTdHJlYW0oc2VsZi5TdHJpbmdJTyk6CisgICAgICAgICAgICByZWFkMSA9IHNlbGYuU3RyaW5nSU8ucmVhZAorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKE5vbmJ5dGVzU3RyZWFtKCdhJykpCisgICAgICAgIHdpdGggc2VsZi5tYXliZVJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgdC5yZWFkKDEpCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoTm9uYnl0ZXNTdHJlYW0oJ2EnKSkKKyAgICAgICAgd2l0aCBzZWxmLm1heWJlUmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICB0LnJlYWRsaW5lKCkKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihOb25ieXRlc1N0cmVhbSgnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQucmVhZCgpLCB1J2EnKQorCisgICAgZGVmIHRlc3RfaWxsZWdhbF9kZWNvZGVyKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNzEwNgorICAgICAgICAjIENyYXNoIHdoZW4gZGVjb2RlciByZXR1cm5zIG5vbi1zdHJpbmcKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihzZWxmLkJ5dGVzSU8oYidhYWFhYWEnKSwgbmV3bGluZT0nXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPSdxdW9wcmlfY29kZWMnKQorICAgICAgICB3aXRoIHNlbGYubWF5YmVSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHQucmVhZCgxKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKHNlbGYuQnl0ZXNJTyhiJ2FhYWFhYScpLCBuZXdsaW5lPSdcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9J3F1b3ByaV9jb2RlYycpCisgICAgICAgIHdpdGggc2VsZi5tYXliZVJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgdC5yZWFkbGluZSgpCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKGInYWFhYWFhJyksIG5ld2xpbmU9J1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz0ncXVvcHJpX2NvZGVjJykKKyAgICAgICAgd2l0aCBzZWxmLm1heWJlUmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICB0LnJlYWQoKQorCisKK2NsYXNzIENUZXh0SU9XcmFwcGVyVGVzdChUZXh0SU9XcmFwcGVyVGVzdCk6CisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXphdGlvbihzZWxmKToKKyAgICAgICAgciA9IHNlbGYuQnl0ZXNJTyhiIlx4YzNceGE5XG5cbiIpCisgICAgICAgIGIgPSBzZWxmLkJ1ZmZlcmVkUmVhZGVyKHIsIDEwMDApCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0Ll9faW5pdF9fLCBiLCBuZXdsaW5lPTQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnJlYWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuX19pbml0X18sIGIsIG5ld2xpbmU9J3h5enp5JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5yZWFkKQorCisgICAgZGVmIHRlc3RfZ2FyYmFnZV9jb2xsZWN0aW9uKHNlbGYpOgorICAgICAgICAjIEMgVGV4dElPV3JhcHBlciBvYmplY3RzIGFyZSBjb2xsZWN0ZWQsIGFuZCBjb2xsZWN0aW5nIHRoZW0gZmx1c2hlcworICAgICAgICAjIGFsbCBkYXRhIHRvIGRpc2suCisgICAgICAgICMgVGhlIFB5dGhvbiB2ZXJzaW9uIGhhcyBfX2RlbF9fLCBzbyBpdCBlbmRzIGluIGdjLmdhcmJhZ2UgaW5zdGVhZC4KKyAgICAgICAgcmF3aW8gPSBpby5GaWxlSU8oc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIGIgPSBzZWxmLkJ1ZmZlcmVkV3JpdGVyKHJhd2lvKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIsIGVuY29kaW5nPSJhc2NpaSIpCisgICAgICAgIHQud3JpdGUoIjQ1NmRlZiIpCisgICAgICAgIHQueCA9IHQKKyAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZih0KQorICAgICAgICBkZWwgdAorICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod3IoKSBpcyBOb25lLCB3cikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiIjQ1NmRlZiIpCisKKyAgICBkZWYgdGVzdF9yd3BhaXJfY2xlYXJlZF9iZWZvcmVfdGV4dGlvKHNlbGYpOgorICAgICAgICAjIElzc3VlIDEzMDcwOiBUZXh0SU9XcmFwcGVyJ3MgZmluYWxpemF0aW9uIHdvdWxkIGNyYXNoIHdoZW4gY2FsbGVkCisgICAgICAgICMgYWZ0ZXIgdGhlIHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBCdWZmZXJlZFJXUGFpcidzIHdyaXRlciBnb3QKKyAgICAgICAgIyBjbGVhcmVkIGJ5IHRoZSBHQy4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICBiMSA9IHNlbGYuQnVmZmVyZWRSV1BhaXIoc2VsZi5Nb2NrUmF3SU8oKSwgc2VsZi5Nb2NrUmF3SU8oKSkKKyAgICAgICAgICAgIHQxID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIxLCBlbmNvZGluZz0iYXNjaWkiKQorICAgICAgICAgICAgYjIgPSBzZWxmLkJ1ZmZlcmVkUldQYWlyKHNlbGYuTW9ja1Jhd0lPKCksIHNlbGYuTW9ja1Jhd0lPKCkpCisgICAgICAgICAgICB0MiA9IHNlbGYuVGV4dElPV3JhcHBlcihiMiwgZW5jb2Rpbmc9ImFzY2lpIikKKyAgICAgICAgICAgICMgY2lyY3VsYXIgcmVmZXJlbmNlcworICAgICAgICAgICAgdDEuYnVkZHkgPSB0MgorICAgICAgICAgICAgdDIuYnVkZHkgPSB0MQorICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQorCisgICAgbWF5YmVSYWlzZXMgPSB1bml0dGVzdC5UZXN0Q2FzZS5hc3NlcnRSYWlzZXMKKworCitjbGFzcyBQeVRleHRJT1dyYXBwZXJUZXN0KFRleHRJT1dyYXBwZXJUZXN0KToKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBtYXliZVJhaXNlcyhzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgeWllbGQKKworCitjbGFzcyBJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2tfbmV3bGluZV9kZWNvZGluZ191dGY4KHNlbGYsIGRlY29kZXIpOgorICAgICAgICAjIFVURi04IHNwZWNpZmljIHRlc3RzIGZvciBhIG5ld2xpbmUgZGVjb2RlcgorICAgICAgICBkZWYgX2NoZWNrX2RlY29kZShiLCBzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAjIFdlIGV4ZXJjaXNlIGdldHN0YXRlKCkgLyBzZXRzdGF0ZSgpIGFzIHdlbGwgYXMgZGVjb2RlKCkKKyAgICAgICAgICAgIHN0YXRlID0gZGVjb2Rlci5nZXRzdGF0ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKGIsICoqa3dhcmdzKSwgcykKKyAgICAgICAgICAgIGRlY29kZXIuc2V0c3RhdGUoc3RhdGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKGIsICoqa3dhcmdzKSwgcykKKworICAgICAgICBfY2hlY2tfZGVjb2RlKGInXHhlOFx4YTJceDg4JywgIlx1ODg4OCIpCisKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1x4ZTgnLCAiIikKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1x4YTInLCAiIikKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1x4ODgnLCAiXHU4ODg4IikKKworICAgICAgICBfY2hlY2tfZGVjb2RlKGInXHhlOCcsICIiKQorICAgICAgICBfY2hlY2tfZGVjb2RlKGInXHhhMicsICIiKQorICAgICAgICBfY2hlY2tfZGVjb2RlKGInXHg4OCcsICJcdTg4ODgiKQorCisgICAgICAgIF9jaGVja19kZWNvZGUoYidceGU4JywgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgZGVjb2Rlci5kZWNvZGUsIGInJywgZmluYWw9VHJ1ZSkKKworICAgICAgICBkZWNvZGVyLnJlc2V0KCkKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1xuJywgIlxuIikKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1xyJywgIiIpCisgICAgICAgIF9jaGVja19kZWNvZGUoYicnLCAiXG4iLCBmaW5hbD1UcnVlKQorICAgICAgICBfY2hlY2tfZGVjb2RlKGInXHInLCAiXG4iLCBmaW5hbD1UcnVlKQorCisgICAgICAgIF9jaGVja19kZWNvZGUoYidccicsICIiKQorICAgICAgICBfY2hlY2tfZGVjb2RlKGInYScsICJcbmEiKQorCisgICAgICAgIF9jaGVja19kZWNvZGUoYidcclxyXG4nLCAiXG5cbiIpCisgICAgICAgIF9jaGVja19kZWNvZGUoYidccicsICIiKQorICAgICAgICBfY2hlY2tfZGVjb2RlKGInXHInLCAiXG4iKQorICAgICAgICBfY2hlY2tfZGVjb2RlKGInXG5hJywgIlxuYSIpCisKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1x4ZThceGEyXHg4OFxyXG4nLCAiXHU4ODg4XG4iKQorICAgICAgICBfY2hlY2tfZGVjb2RlKGInXHhlOFx4YTJceDg4JywgIlx1ODg4OCIpCisgICAgICAgIF9jaGVja19kZWNvZGUoYidcbicsICJcbiIpCisgICAgICAgIF9jaGVja19kZWNvZGUoYidceGU4XHhhMlx4ODhccicsICJcdTg4ODgiKQorICAgICAgICBfY2hlY2tfZGVjb2RlKGInXG4nLCAiXG4iKQorCisgICAgZGVmIGNoZWNrX25ld2xpbmVfZGVjb2Rpbmcoc2VsZiwgZGVjb2RlciwgZW5jb2RpbmcpOgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKGVuY29kaW5nKSgpCisgICAgICAgICAgICBkZWYgX2RlY29kZV9ieXRld2lzZShzKToKKyAgICAgICAgICAgICAgICAjIERlY29kZSBvbmUgYnl0ZSBhdCBhIHRpbWUKKyAgICAgICAgICAgICAgICBmb3IgYiBpbiBlbmNvZGVyLmVuY29kZShzKToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChkZWNvZGVyLmRlY29kZShiKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVuY29kZXIgPSBOb25lCisgICAgICAgICAgICBkZWYgX2RlY29kZV9ieXRld2lzZShzKToKKyAgICAgICAgICAgICAgICAjIERlY29kZSBvbmUgY2hhciBhdCBhIHRpbWUKKyAgICAgICAgICAgICAgICBmb3IgYyBpbiBzOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGRlY29kZXIuZGVjb2RlKGMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIubmV3bGluZXMsIE5vbmUpCisgICAgICAgIF9kZWNvZGVfYnl0ZXdpc2UoImFiY1xuXHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIubmV3bGluZXMsICdcbicpCisgICAgICAgIF9kZWNvZGVfYnl0ZXdpc2UoIlxuYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLm5ld2xpbmVzLCAoJ1xuJywgJ1xyXG4nKSkKKyAgICAgICAgX2RlY29kZV9ieXRld2lzZSgiYWJjXHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIubmV3bGluZXMsICgnXG4nLCAnXHJcbicpKQorICAgICAgICBfZGVjb2RlX2J5dGV3aXNlKCJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIubmV3bGluZXMsICgnXHInLCAnXG4nLCAnXHJcbicpKQorICAgICAgICBfZGVjb2RlX2J5dGV3aXNlKCJhYmNcciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIiIuam9pbihyZXN1bHQpLCAiYWJjXG5cbmFiY2FiY1xuYWJjYWJjIikKKyAgICAgICAgZGVjb2Rlci5yZXNldCgpCisgICAgICAgIGlucHV0ID0gImFiYyIKKyAgICAgICAgaWYgZW5jb2RlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVuY29kZXIucmVzZXQoKQorICAgICAgICAgICAgaW5wdXQgPSBlbmNvZGVyLmVuY29kZShpbnB1dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZShpbnB1dCksICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIubmV3bGluZXMsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9uZXdsaW5lX2RlY29kZXIoc2VsZik6CisgICAgICAgIGVuY29kaW5ncyA9ICgKKyAgICAgICAgICAgICMgTm9uZSBtZWFuaW5nIHRoZSBJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyIHRha2VzIHVuaWNvZGUgaW5wdXQKKyAgICAgICAgICAgICMgcmF0aGVyIHRoYW4gYnl0ZXMgaW5wdXQKKyAgICAgICAgICAgIE5vbmUsICd1dGYtOCcsICdsYXRpbi0xJywKKyAgICAgICAgICAgICd1dGYtMTYnLCAndXRmLTE2LWxlJywgJ3V0Zi0xNi1iZScsCisgICAgICAgICAgICAndXRmLTMyJywgJ3V0Zi0zMi1sZScsICd1dGYtMzItYmUnLAorICAgICAgICApCisgICAgICAgIGZvciBlbmMgaW4gZW5jb2RpbmdzOgorICAgICAgICAgICAgZGVjb2RlciA9IGVuYyBhbmQgY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcihlbmMpKCkKKyAgICAgICAgICAgIGRlY29kZXIgPSBzZWxmLkluY3JlbWVudGFsTmV3bGluZURlY29kZXIoZGVjb2RlciwgdHJhbnNsYXRlPVRydWUpCisgICAgICAgICAgICBzZWxmLmNoZWNrX25ld2xpbmVfZGVjb2RpbmcoZGVjb2RlciwgZW5jKQorICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcigidXRmLTgiKSgpCisgICAgICAgIGRlY29kZXIgPSBzZWxmLkluY3JlbWVudGFsTmV3bGluZURlY29kZXIoZGVjb2RlciwgdHJhbnNsYXRlPVRydWUpCisgICAgICAgIHNlbGYuY2hlY2tfbmV3bGluZV9kZWNvZGluZ191dGY4KGRlY29kZXIpCisKKyAgICBkZWYgdGVzdF9uZXdsaW5lX2J5dGVzKHNlbGYpOgorICAgICAgICAjIElzc3VlIDU0MzM6IEV4Y2Vzc2l2ZSBvcHRpbWl6YXRpb24gaW4gSW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlcgorICAgICAgICBkZWYgX2NoZWNrKGRlYyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlYy5uZXdsaW5lcywgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjLmRlY29kZSgiXHUwRDAwIiksICJcdTBEMDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWMubmV3bGluZXMsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlYy5kZWNvZGUoIlx1MEEwMCIpLCAiXHUwQTAwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjLm5ld2xpbmVzLCBOb25lKQorICAgICAgICBkZWMgPSBzZWxmLkluY3JlbWVudGFsTmV3bGluZURlY29kZXIoTm9uZSwgdHJhbnNsYXRlPUZhbHNlKQorICAgICAgICBfY2hlY2soZGVjKQorICAgICAgICBkZWMgPSBzZWxmLkluY3JlbWVudGFsTmV3bGluZURlY29kZXIoTm9uZSwgdHJhbnNsYXRlPVRydWUpCisgICAgICAgIF9jaGVjayhkZWMpCisKK2NsYXNzIENJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyVGVzdChJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyVGVzdCk6CisgICAgcGFzcworCitjbGFzcyBQeUluY3JlbWVudGFsTmV3bGluZURlY29kZXJUZXN0KEluY3JlbWVudGFsTmV3bGluZURlY29kZXJUZXN0KToKKyAgICBwYXNzCisKKworIyBYWFggVGVzdHMgZm9yIG9wZW4oKQorCitjbGFzcyBNaXNjSU9UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9fX2FsbF9fKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmlvLl9fYWxsX186CisgICAgICAgICAgICBvYmogPSBnZXRhdHRyKHNlbGYuaW8sIG5hbWUsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob2JqIGlzIG5vdCBOb25lLCBuYW1lKQorICAgICAgICAgICAgaWYgbmFtZSA9PSAib3BlbiI6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgImVycm9yIiBpbiBuYW1lLmxvd2VyKCkgb3IgbmFtZSA9PSAiVW5zdXBwb3J0ZWRPcGVyYXRpb24iOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKG9iaiwgRXhjZXB0aW9uKSwgbmFtZSkKKyAgICAgICAgICAgIGVsaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgiU0VFS18iKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhvYmosIHNlbGYuSU9CYXNlKSkKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIsIGJ1ZmZlcmluZz0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYubW9kZSwgIndiIikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgZiA9IHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIlUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYubmFtZSwgICAgICAgICAgICBzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmJ1ZmZlci5uYW1lLCAgICAgc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5idWZmZXIucmF3Lm5hbWUsIHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYubW9kZSwgICAgICAgICAgICAiVSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5idWZmZXIubW9kZSwgICAgICJyYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5idWZmZXIucmF3Lm1vZGUsICJyYiIpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3KyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5tb2RlLCAgICAgICAgICAgICJ3KyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5idWZmZXIubW9kZSwgICAgICJyYisiKSAjIERvZXMgaXQgcmVhbGx5IG1hdHRlcj8KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmJ1ZmZlci5yYXcubW9kZSwgInJiKyIpCisKKyAgICAgICAgZyA9IHNlbGYub3BlbihmLmZpbGVubygpLCAid2IiLCBjbG9zZWZkPUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGcubW9kZSwgICAgICJ3YiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZy5yYXcubW9kZSwgIndiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLm5hbWUsICAgICBmLmZpbGVubygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGcucmF3Lm5hbWUsIGYuZmlsZW5vKCkpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBnLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2lvX2FmdGVyX2Nsb3NlKHNlbGYpOgorICAgICAgICBmb3Iga3dhcmdzIGluIFsKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAidyJ9LAorICAgICAgICAgICAgICAgIHsibW9kZSI6ICJ3YiJ9LAorICAgICAgICAgICAgICAgIHsibW9kZSI6ICJ3IiwgImJ1ZmZlcmluZyI6IDF9LAorICAgICAgICAgICAgICAgIHsibW9kZSI6ICJ3IiwgImJ1ZmZlcmluZyI6IDJ9LAorICAgICAgICAgICAgICAgIHsibW9kZSI6ICJ3YiIsICJidWZmZXJpbmciOiAwfSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAiciJ9LAorICAgICAgICAgICAgICAgIHsibW9kZSI6ICJyYiJ9LAorICAgICAgICAgICAgICAgIHsibW9kZSI6ICJyIiwgImJ1ZmZlcmluZyI6IDF9LAorICAgICAgICAgICAgICAgIHsibW9kZSI6ICJyIiwgImJ1ZmZlcmluZyI6IDJ9LAorICAgICAgICAgICAgICAgIHsibW9kZSI6ICJyYiIsICJidWZmZXJpbmciOiAwfSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAidysifSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAidytiIn0sCisgICAgICAgICAgICAgICAgeyJtb2RlIjogIncrIiwgImJ1ZmZlcmluZyI6IDF9LAorICAgICAgICAgICAgICAgIHsibW9kZSI6ICJ3KyIsICJidWZmZXJpbmciOiAyfSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAidytiIiwgImJ1ZmZlcmluZyI6IDB9LAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICoqa3dhcmdzKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLmZsdXNoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5maWxlbm8pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLmlzYXR0eSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYuX19pdGVyX18pCisgICAgICAgICAgICBpZiBoYXNhdHRyKGYsICJwZWVrIik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5wZWVrLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5yZWFkKQorICAgICAgICAgICAgaWYgaGFzYXR0cihmLCAicmVhZDEiKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLnJlYWQxLCAxMDI0KQorICAgICAgICAgICAgaWYgaGFzYXR0cihmLCAicmVhZGFsbCIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYucmVhZGFsbCkKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoZiwgInJlYWRpbnRvIik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5yZWFkaW50bywgYnl0ZWFycmF5KDEwMjQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5yZWFkbGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYucmVhZGxpbmVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5zZWVrLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi50ZWxsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi50cnVuY2F0ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYud3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIiIgaWYgImIiIGluIGt3YXJnc1snbW9kZSddIGVsc2UgIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLndyaXRlbGluZXMsIFtdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbmV4dCwgZikKKworICAgIGRlZiB0ZXN0X2Jsb2NraW5naW9lcnJvcihzZWxmKToKKyAgICAgICAgIyBWYXJpb3VzIEJsb2NraW5nSU9FcnJvciBpc3N1ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLkJsb2NraW5nSU9FcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLkJsb2NraW5nSU9FcnJvciwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLkJsb2NraW5nSU9FcnJvciwgMSwgMiwgMywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLkJsb2NraW5nSU9FcnJvciwgMSwgIiIsIE5vbmUpCisgICAgICAgIGIgPSBzZWxmLkJsb2NraW5nSU9FcnJvcigxLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmNoYXJhY3RlcnNfd3JpdHRlbiwgMCkKKyAgICAgICAgY2xhc3MgQyh1bmljb2RlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYyA9IEMoIiIpCisgICAgICAgIGIgPSBzZWxmLkJsb2NraW5nSU9FcnJvcigxLCBjKQorICAgICAgICBjLmIgPSBiCisgICAgICAgIGIuYyA9IGMKKyAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZihjKQorICAgICAgICBkZWwgYywgYgorICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod3IoKSBpcyBOb25lLCB3cikKKworICAgIGRlZiB0ZXN0X2FiY3Moc2VsZik6CisgICAgICAgICMgVGVzdCB0aGUgdmlzaWJsZSBiYXNlIGNsYXNzZXMgYXJlIEFCQ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLklPQmFzZSwgYWJjLkFCQ01ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLlJhd0lPQmFzZSwgYWJjLkFCQ01ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLkJ1ZmZlcmVkSU9CYXNlLCBhYmMuQUJDTWV0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYuVGV4dElPQmFzZSwgYWJjLkFCQ01ldGEpCisKKyAgICBkZWYgX2NoZWNrX2FiY19pbmhlcml0YW5jZShzZWxmLCBhYmNtb2R1bGUpOgorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIiwgYnVmZmVyaW5nPTApIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZiwgYWJjbW9kdWxlLklPQmFzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmLCBhYmNtb2R1bGUuUmF3SU9CYXNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKGYsIGFiY21vZHVsZS5CdWZmZXJlZElPQmFzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShmLCBhYmNtb2R1bGUuVGV4dElPQmFzZSkKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZiwgYWJjbW9kdWxlLklPQmFzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShmLCBhYmNtb2R1bGUuUmF3SU9CYXNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGYsIGFiY21vZHVsZS5CdWZmZXJlZElPQmFzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShmLCBhYmNtb2R1bGUuVGV4dElPQmFzZSkKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3IikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmLCBhYmNtb2R1bGUuSU9CYXNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKGYsIGFiY21vZHVsZS5SYXdJT0Jhc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoZiwgYWJjbW9kdWxlLkJ1ZmZlcmVkSU9CYXNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGYsIGFiY21vZHVsZS5UZXh0SU9CYXNlKQorCisgICAgZGVmIHRlc3RfYWJjX2luaGVyaXRhbmNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgaW1wbGVtZW50YXRpb25zIGluaGVyaXQgZnJvbSB0aGVpciByZXNwZWN0aXZlIEFCQ3MKKyAgICAgICAgc2VsZi5fY2hlY2tfYWJjX2luaGVyaXRhbmNlKHNlbGYpCisKKyAgICBkZWYgdGVzdF9hYmNfaW5oZXJpdGFuY2Vfb2ZmaWNpYWwoc2VsZik6CisgICAgICAgICMgVGVzdCBpbXBsZW1lbnRhdGlvbnMgaW5oZXJpdCBmcm9tIHRoZSBvZmZpY2lhbCBBQkNzIG9mIHRoZQorICAgICAgICAjIGJhc2VsaW5lICJpbyIgbW9kdWxlLgorICAgICAgICBzZWxmLl9jaGVja19hYmNfaW5oZXJpdGFuY2UoaW8pCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhmY250bCwgJ2ZjbnRsIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QnKQorICAgIGRlZiB0ZXN0X25vbmJsb2NrX3BpcGVfd3JpdGVfYmlnYnVmKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X25vbmJsb2NrX3BpcGVfd3JpdGUoMTYqMTAyNCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGZjbnRsLCAnZmNudGwgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdCcpCisgICAgZGVmIHRlc3Rfbm9uYmxvY2tfcGlwZV93cml0ZV9zbWFsbGJ1ZihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9ub25ibG9ja19waXBlX3dyaXRlKDEwMjQpCisKKyAgICBkZWYgX3NldF9ub25fYmxvY2tpbmcoc2VsZiwgZmQpOgorICAgICAgICBmbGFncyA9IGZjbnRsLmZjbnRsKGZkLCBmY250bC5GX0dFVEZMKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZsYWdzLCAtMSkKKyAgICAgICAgcmVzID0gZmNudGwuZmNudGwoZmQsIGZjbnRsLkZfU0VURkwsIGZsYWdzIHwgb3MuT19OT05CTE9DSykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIDApCisKKyAgICBkZWYgX3Rlc3Rfbm9uYmxvY2tfcGlwZV93cml0ZShzZWxmLCBidWZzaXplKToKKyAgICAgICAgc2VudCA9IFtdCisgICAgICAgIHJlY2VpdmVkID0gW10KKyAgICAgICAgciwgdyA9IG9zLnBpcGUoKQorICAgICAgICBzZWxmLl9zZXRfbm9uX2Jsb2NraW5nKHIpCisgICAgICAgIHNlbGYuX3NldF9ub25fYmxvY2tpbmcodykKKworICAgICAgICAjIFRvIGV4ZXJjaXNlIGFsbCBjb2RlIHBhdGhzIGluIHRoZSBDIGltcGxlbWVudGF0aW9uIHdlIG5lZWQKKyAgICAgICAgIyB0byBwbGF5IHdpdGggYnVmZmVyIHNpemVzLiAgRm9yIGluc3RhbmNlLCBpZiB3ZSBjaG9vc2UgYQorICAgICAgICAjIGJ1ZmZlciBzaXplIGxlc3MgdGhhbiBvciBlcXVhbCB0byBfUElQRV9CVUYgKDQwOTYgb24gTGludXgpCisgICAgICAgICMgdGhlbiB3ZSB3aWxsIG5ldmVyIGdldCBhIHBhcnRpYWwgd3JpdGUgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgcmYgPSBzZWxmLm9wZW4ociwgbW9kZT0ncmInLCBjbG9zZWZkPVRydWUsIGJ1ZmZlcmluZz1idWZzaXplKQorICAgICAgICB3ZiA9IHNlbGYub3Blbih3LCBtb2RlPSd3YicsIGNsb3NlZmQ9VHJ1ZSwgYnVmZmVyaW5nPWJ1ZnNpemUpCisKKyAgICAgICAgd2l0aCByZiwgd2Y6CisgICAgICAgICAgICBmb3IgTiBpbiA5OTk5LCA3MywgNzU3NDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBieXRlcyhbaSAlIDI2ICsgOTddKSAqIE4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbnQuYXBwZW5kKG1zZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHdmLndyaXRlKG1zZykKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMQorCisgICAgICAgICAgICAgICAgZXhjZXB0IHNlbGYuQmxvY2tpbmdJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCBlcnJuby5FQUdBSU4pCisgICAgICAgICAgICAgICAgICAgIHNlbnRbLTFdID0gc2VudFstMV1bOmUuY2hhcmFjdGVyc193cml0dGVuXQorICAgICAgICAgICAgICAgICAgICByZWNlaXZlZC5hcHBlbmQocmYucmVhZCgpKQorICAgICAgICAgICAgICAgICAgICBtc2cgPSBiJ0JMT0NLRUQnCisgICAgICAgICAgICAgICAgICAgIHdmLndyaXRlKG1zZykKKyAgICAgICAgICAgICAgICAgICAgc2VudC5hcHBlbmQobXNnKQorCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgd2YuZmx1c2goKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4Y2VwdCBzZWxmLkJsb2NraW5nSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgZXJybm8uRUFHQUlOKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuY2hhcmFjdGVyc193cml0dGVuLCAwKQorICAgICAgICAgICAgICAgICAgICByZWNlaXZlZC5hcHBlbmQocmYucmVhZCgpKQorCisgICAgICAgICAgICByZWNlaXZlZCArPSBpdGVyKHJmLnJlYWQsIE5vbmUpCisKKyAgICAgICAgc2VudCwgcmVjZWl2ZWQgPSBiJycuam9pbihzZW50KSwgYicnLmpvaW4ocmVjZWl2ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZW50ID09IHJlY2VpdmVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod2YuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmYuY2xvc2VkKQorCitjbGFzcyBDTWlzY0lPVGVzdChNaXNjSU9UZXN0KToKKyAgICBpbyA9IGlvCisKK2NsYXNzIFB5TWlzY0lPVGVzdChNaXNjSU9UZXN0KToKKyAgICBpbyA9IHB5aW8KKworCitAdW5pdHRlc3Quc2tpcElmKG9zLm5hbWUgPT0gJ250JywgJ1BPU0lYIHNpZ25hbHMgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgU2lnbmFsc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm9sZGFscm0gPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBzZWxmLmFsYXJtX2ludGVycnVwdCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgc2VsZi5vbGRhbHJtKQorCisgICAgZGVmIGFsYXJtX2ludGVycnVwdChzZWxmLCBzaWcsIGZyYW1lKToKKyAgICAgICAgMSAvLyAwCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtIGluICgnZnJlZWJzZDUnLCAnZnJlZWJzZDYnLCAnZnJlZWJzZDcnKSwKKyAgICAgICAgICAgICAgICAgICAgICdpc3N1ZSAjMTI0Mjk6IHNraXAgdGVzdCBvbiBGcmVlQlNEIDw9IDcnKQorICAgIGRlZiBjaGVja19pbnRlcnJ1cHRlZF93cml0ZShzZWxmLCBpdGVtLCBieXRlcywgKipmZG9wZW5fa3dhcmdzKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBhIHBhcnRpYWwgd3JpdGUsIHdoZW4gaXQgZ2V0cyBpbnRlcnJ1cHRlZCwgcHJvcGVybHkKKyAgICAgICAgaW52b2tlcyB0aGUgc2lnbmFsIGhhbmRsZXIsIGFuZCBidWJibGVzIHVwIHRoZSBleGNlcHRpb24gcmFpc2VkCisgICAgICAgIGluIHRoZSBsYXR0ZXIuIiIiCisgICAgICAgIHJlYWRfcmVzdWx0cyA9IFtdCisgICAgICAgIGRlZiBfcmVhZCgpOgorICAgICAgICAgICAgcyA9IG9zLnJlYWQociwgMSkKKyAgICAgICAgICAgIHJlYWRfcmVzdWx0cy5hcHBlbmQocykKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PV9yZWFkKQorICAgICAgICB0LmRhZW1vbiA9IFRydWUKKyAgICAgICAgciwgdyA9IG9zLnBpcGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aW8gPSBzZWxmLmlvLm9wZW4odywgKipmZG9wZW5fa3dhcmdzKQorICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBzaWduYWwuYWxhcm0oMSkKKyAgICAgICAgICAgICMgRmlsbCB0aGUgcGlwZSBlbm91Z2ggdGhhdCB0aGUgd3JpdGUgd2lsbCBiZSBibG9ja2luZy4KKyAgICAgICAgICAgICMgSXQgd2lsbCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgdGltZXIgYXJtZWQgYWJvdmUuICBTaW5jZSB0aGUKKyAgICAgICAgICAgICMgb3RoZXIgdGhyZWFkIGhhcyByZWFkIG9uZSBieXRlLCB0aGUgbG93LWxldmVsIHdyaXRlIHdpbGwKKyAgICAgICAgICAgICMgcmV0dXJuIHdpdGggYSBzdWNjZXNzZnVsIChwYXJ0aWFsKSByZXN1bHQgcmF0aGVyIHRoYW4gYW4gRUlOVFIuCisgICAgICAgICAgICAjIFRoZSBidWZmZXJlZCBJTyBsYXllciBtdXN0IGNoZWNrIGZvciBwZW5kaW5nIHNpZ25hbAorICAgICAgICAgICAgIyBoYW5kbGVycywgd2hpY2ggaW4gdGhpcyBjYXNlIHdpbGwgaW52b2tlIGFsYXJtX2ludGVycnVwdCgpLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICB3aW8ud3JpdGUsIGl0ZW0gKiAoc3VwcG9ydC5QSVBFX01BWF9TSVpFIC8vIGxlbihpdGVtKSArIDEpKQorICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgICAgICMgV2UgZ290IG9uZSBieXRlLCBnZXQgYW5vdGhlciBvbmUgYW5kIGNoZWNrIHRoYXQgaXQgaXNuJ3QgYQorICAgICAgICAgICAgIyByZXBlYXQgb2YgdGhlIGZpcnN0IG9uZS4KKyAgICAgICAgICAgIHJlYWRfcmVzdWx0cy5hcHBlbmQob3MucmVhZChyLCAxKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZF9yZXN1bHRzLCBbYnl0ZXNbMDoxXSwgYnl0ZXNbMToyXV0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jbG9zZSh3KQorICAgICAgICAgICAgb3MuY2xvc2UocikKKyAgICAgICAgICAgICMgVGhpcyBpcyBkZWxpYmVyYXRlLiBJZiB3ZSBkaWRuJ3QgY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvcgorICAgICAgICAgICAgIyBiZWZvcmUgY2xvc2luZyB3aW8sIHdpbyB3b3VsZCB0cnkgdG8gZmx1c2ggaXRzIGludGVybmFsCisgICAgICAgICAgICAjIGJ1ZmZlciwgYW5kIGJsb2NrIGFnYWluLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpby5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUJBREY6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgdGVzdF9pbnRlcnJ1cHRlZF93cml0ZV91bmJ1ZmZlcmVkKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2ludGVycnVwdGVkX3dyaXRlKGIieHkiLCBiInh5IiwgbW9kZT0id2IiLCBidWZmZXJpbmc9MCkKKworICAgIGRlZiB0ZXN0X2ludGVycnVwdGVkX3dyaXRlX2J1ZmZlcmVkKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2ludGVycnVwdGVkX3dyaXRlKGIieHkiLCBiInh5IiwgbW9kZT0id2IiKQorCisgICAgZGVmIHRlc3RfaW50ZXJydXB0ZWRfd3JpdGVfdGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pbnRlcnJ1cHRlZF93cml0ZSgieHkiLCBiInh5IiwgbW9kZT0idyIsIGVuY29kaW5nPSJhc2NpaSIpCisKKyAgICBkZWYgY2hlY2tfcmVlbnRyYW50X3dyaXRlKHNlbGYsIGRhdGEsICoqZmRvcGVuX2t3YXJncyk6CisgICAgICAgIGRlZiBvbl9hbGFybSgqYXJncyk6CisgICAgICAgICAgICAjIFdpbGwgYmUgY2FsbGVkIHJlZW50cmFudGx5IGZyb20gdGhlIHNhbWUgdGhyZWFkCisgICAgICAgICAgICB3aW8ud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIDEvLzAKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgb25fYWxhcm0pCisgICAgICAgIHIsIHcgPSBvcy5waXBlKCkKKyAgICAgICAgd2lvID0gc2VsZi5pby5vcGVuKHcsICoqZmRvcGVuX2t3YXJncykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgICAgICAjIEVpdGhlciB0aGUgcmVlbnRyYW50IGNhbGwgdG8gd2lvLndyaXRlKCkgZmFpbHMgd2l0aCBSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAjIG9yIHRoZSBzaWduYWwgaGFuZGxlciByYWlzZXMgWmVyb0RpdmlzaW9uRXJyb3IuCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKChaZXJvRGl2aXNpb25FcnJvciwgUnVudGltZUVycm9yKSkgYXMgY206CisgICAgICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpby53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgd2lvLmZsdXNoKCkKKyAgICAgICAgICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGJ1ZmZlciBkb2Vzbid0IGZpbGwgdXAgYW5kIGJsb2NrIGZ1cnRoZXIgd3JpdGVzCisgICAgICAgICAgICAgICAgICAgIG9zLnJlYWQociwgbGVuKGRhdGEpICogMTAwKQorICAgICAgICAgICAgZXhjID0gY20uZXhjZXB0aW9uCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4YywgUnVudGltZUVycm9yKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKGV4Yykuc3RhcnRzd2l0aCgicmVlbnRyYW50IGNhbGwiKSwgc3RyKGV4YykpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB3aW8uY2xvc2UoKQorICAgICAgICAgICAgb3MuY2xvc2UocikKKworICAgIGRlZiB0ZXN0X3JlZW50cmFudF93cml0ZV9idWZmZXJlZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19yZWVudHJhbnRfd3JpdGUoYiJ4eSIsIG1vZGU9IndiIikKKworICAgIGRlZiB0ZXN0X3JlZW50cmFudF93cml0ZV90ZXh0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3JlZW50cmFudF93cml0ZSgieHkiLCBtb2RlPSJ3IiwgZW5jb2Rpbmc9ImFzY2lpIikKKworICAgIGRlZiBjaGVja19pbnRlcnJ1cHRlZF9yZWFkX3JldHJ5KHNlbGYsIGRlY29kZSwgKipmZG9wZW5fa3dhcmdzKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBhIGJ1ZmZlcmVkIHJlYWQsIHdoZW4gaXQgZ2V0cyBpbnRlcnJ1cHRlZCAoZWl0aGVyCisgICAgICAgIHJldHVybmluZyBhIHBhcnRpYWwgcmVzdWx0IG9yIEVJTlRSKSwgcHJvcGVybHkgaW52b2tlcyB0aGUgc2lnbmFsCisgICAgICAgIGhhbmRsZXIgYW5kIHJldHJpZXMgaWYgdGhlIGxhdHRlciByZXR1cm5lZCBzdWNjZXNzZnVsbHkuIiIiCisgICAgICAgIHIsIHcgPSBvcy5waXBlKCkKKyAgICAgICAgZmRvcGVuX2t3YXJnc1siY2xvc2VmZCJdID0gRmFsc2UKKyAgICAgICAgZGVmIGFsYXJtX2hhbmRsZXIoc2lnLCBmcmFtZSk6CisgICAgICAgICAgICBvcy53cml0ZSh3LCBiImJhciIpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIGFsYXJtX2hhbmRsZXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJpbyA9IHNlbGYuaW8ub3BlbihyLCAqKmZkb3Blbl9rd2FyZ3MpCisgICAgICAgICAgICBvcy53cml0ZSh3LCBiImZvbyIpCisgICAgICAgICAgICBzaWduYWwuYWxhcm0oMSkKKyAgICAgICAgICAgICMgRXhwZWN0ZWQgYmVoYXZpb3VyOgorICAgICAgICAgICAgIyAtIGZpcnN0IHJhdyByZWFkKCkgcmV0dXJucyBwYXJ0aWFsIGIiZm9vIgorICAgICAgICAgICAgIyAtIHNlY29uZCByYXcgcmVhZCgpIHJldHVybnMgRUlOVFIKKyAgICAgICAgICAgICMgLSB0aGlyZCByYXcgcmVhZCgpIHJldHVybnMgYiJiYXIiCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShyaW8ucmVhZCg2KSksICJmb29iYXIiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcmlvLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLmNsb3NlKHcpCisgICAgICAgICAgICBvcy5jbG9zZShyKQorCisgICAgZGVmIHRlc3RfaW50ZXJydXB0ZXJkX3JlYWRfcmV0cnlfYnVmZmVyZWQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfaW50ZXJydXB0ZWRfcmVhZF9yZXRyeShsYW1iZGEgeDogeC5kZWNvZGUoJ2xhdGluMScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZT0icmIiKQorCisgICAgZGVmIHRlc3RfaW50ZXJydXB0ZXJkX3JlYWRfcmV0cnlfdGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pbnRlcnJ1cHRlZF9yZWFkX3JldHJ5KGxhbWJkYSB4OiB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZT0iciIpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIGRlZiBjaGVja19pbnRlcnJ1cHRlZF93cml0ZV9yZXRyeShzZWxmLCBpdGVtLCAqKmZkb3Blbl9rd2FyZ3MpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGEgYnVmZmVyZWQgd3JpdGUsIHdoZW4gaXQgZ2V0cyBpbnRlcnJ1cHRlZCAoZWl0aGVyCisgICAgICAgIHJldHVybmluZyBhIHBhcnRpYWwgcmVzdWx0IG9yIEVJTlRSKSwgcHJvcGVybHkgaW52b2tlcyB0aGUgc2lnbmFsCisgICAgICAgIGhhbmRsZXIgYW5kIHJldHJpZXMgaWYgdGhlIGxhdHRlciByZXR1cm5lZCBzdWNjZXNzZnVsbHkuIiIiCisgICAgICAgIHNlbGVjdCA9IHN1cHBvcnQuaW1wb3J0X21vZHVsZSgic2VsZWN0IikKKyAgICAgICAgIyBBIHF1YW50aXR5IHRoYXQgZXhjZWVkcyB0aGUgYnVmZmVyIHNpemUgb2YgYW4gYW5vbnltb3VzIHBpcGUncworICAgICAgICAjIHdyaXRlIGVuZC4KKyAgICAgICAgTiA9IHN1cHBvcnQuUElQRV9NQVhfU0laRQorICAgICAgICByLCB3ID0gb3MucGlwZSgpCisgICAgICAgIGZkb3Blbl9rd2FyZ3NbImNsb3NlZmQiXSA9IEZhbHNlCisgICAgICAgICMgV2UgbmVlZCBhIHNlcGFyYXRlIHRocmVhZCB0byByZWFkIGZyb20gdGhlIHBpcGUgYW5kIGFsbG93IHRoZQorICAgICAgICAjIHdyaXRlKCkgdG8gZmluaXNoLiAgVGhpcyB0aHJlYWQgaXMgc3RhcnRlZCBhZnRlciB0aGUgU0lHQUxSTSBpcworICAgICAgICAjIHJlY2VpdmVkIChmb3JjaW5nIGEgZmlyc3QgRUlOVFIgaW4gd3JpdGUoKSkuCisgICAgICAgIHJlYWRfcmVzdWx0cyA9IFtdCisgICAgICAgIHdyaXRlX2ZpbmlzaGVkID0gRmFsc2UKKyAgICAgICAgZGVmIF9yZWFkKCk6CisgICAgICAgICAgICB3aGlsZSBub3Qgd3JpdGVfZmluaXNoZWQ6CisgICAgICAgICAgICAgICAgd2hpbGUgciBpbiBzZWxlY3Quc2VsZWN0KFtyXSwgW10sIFtdLCAxLjApWzBdOgorICAgICAgICAgICAgICAgICAgICBzID0gb3MucmVhZChyLCAxMDI0KQorICAgICAgICAgICAgICAgICAgICByZWFkX3Jlc3VsdHMuYXBwZW5kKHMpCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1fcmVhZCkKKyAgICAgICAgdC5kYWVtb24gPSBUcnVlCisgICAgICAgIGRlZiBhbGFybTEoc2lnLCBmcmFtZSk6CisgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBhbGFybTIpCisgICAgICAgICAgICBzaWduYWwuYWxhcm0oMSkKKyAgICAgICAgZGVmIGFsYXJtMihzaWcsIGZyYW1lKToKKyAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBhbGFybTEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpbyA9IHNlbGYuaW8ub3Blbih3LCAqKmZkb3Blbl9rd2FyZ3MpCisgICAgICAgICAgICBzaWduYWwuYWxhcm0oMSkKKyAgICAgICAgICAgICMgRXhwZWN0ZWQgYmVoYXZpb3VyOgorICAgICAgICAgICAgIyAtIGZpcnN0IHJhdyB3cml0ZSgpIGlzIHBhcnRpYWwgKGJlY2F1c2Ugb2YgdGhlIGxpbWl0ZWQgcGlwZSBidWZmZXIKKyAgICAgICAgICAgICMgICBhbmQgdGhlIGZpcnN0IGFsYXJtKQorICAgICAgICAgICAgIyAtIHNlY29uZCByYXcgd3JpdGUoKSByZXR1cm5zIEVJTlRSIChiZWNhdXNlIG9mIHRoZSBzZWNvbmQgYWxhcm0pCisgICAgICAgICAgICAjIC0gc3Vic2VxdWVudCB3cml0ZSgpcyBhcmUgc3VjY2Vzc2Z1bCAoZWl0aGVyIHBhcnRpYWwgb3IgY29tcGxldGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE4sIHdpby53cml0ZShpdGVtICogTikpCisgICAgICAgICAgICB3aW8uZmx1c2goKQorICAgICAgICAgICAgd3JpdGVfZmluaXNoZWQgPSBUcnVlCisgICAgICAgICAgICB0LmpvaW4oKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOLCBzdW0obGVuKHgpIGZvciB4IGluIHJlYWRfcmVzdWx0cykpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB3cml0ZV9maW5pc2hlZCA9IFRydWUKKyAgICAgICAgICAgIG9zLmNsb3NlKHcpCisgICAgICAgICAgICBvcy5jbG9zZShyKQorICAgICAgICAgICAgIyBUaGlzIGlzIGRlbGliZXJhdGUuIElmIHdlIGRpZG4ndCBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9yCisgICAgICAgICAgICAjIGJlZm9yZSBjbG9zaW5nIHdpbywgd2lvIHdvdWxkIHRyeSB0byBmbHVzaCBpdHMgaW50ZXJuYWwKKyAgICAgICAgICAgICMgYnVmZmVyLCBhbmQgY291bGQgYmxvY2sgKGluIGNhc2Ugb2YgZmFpbHVyZSkuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2lvLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQkFERjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiB0ZXN0X2ludGVycnVwdGVyZF93cml0ZV9yZXRyeV9idWZmZXJlZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pbnRlcnJ1cHRlZF93cml0ZV9yZXRyeShiIngiLCBtb2RlPSJ3YiIpCisKKyAgICBkZWYgdGVzdF9pbnRlcnJ1cHRlcmRfd3JpdGVfcmV0cnlfdGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pbnRlcnJ1cHRlZF93cml0ZV9yZXRyeSgieCIsIG1vZGU9InciLCBlbmNvZGluZz0ibGF0aW4xIikKKworCitjbGFzcyBDU2lnbmFsc1Rlc3QoU2lnbmFsc1Rlc3QpOgorICAgIGlvID0gaW8KKworY2xhc3MgUHlTaWduYWxzVGVzdChTaWduYWxzVGVzdCk6CisgICAgaW8gPSBweWlvCisKKyAgICAjIEhhbmRsaW5nIHJlZW50cmFuY3kgaXNzdWVzIHdvdWxkIHNsb3cgZG93biBfcHlpbyBldmVuIG1vcmUsIHNvIHRoZQorICAgICMgdGVzdHMgYXJlIGRpc2FibGVkLgorICAgIHRlc3RfcmVlbnRyYW50X3dyaXRlX2J1ZmZlcmVkID0gTm9uZQorICAgIHRlc3RfcmVlbnRyYW50X3dyaXRlX3RleHQgPSBOb25lCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3RzID0gKENJT1Rlc3QsIFB5SU9UZXN0LAorICAgICAgICAgICAgIENCdWZmZXJlZFJlYWRlclRlc3QsIFB5QnVmZmVyZWRSZWFkZXJUZXN0LAorICAgICAgICAgICAgIENCdWZmZXJlZFdyaXRlclRlc3QsIFB5QnVmZmVyZWRXcml0ZXJUZXN0LAorICAgICAgICAgICAgIENCdWZmZXJlZFJXUGFpclRlc3QsIFB5QnVmZmVyZWRSV1BhaXJUZXN0LAorICAgICAgICAgICAgIENCdWZmZXJlZFJhbmRvbVRlc3QsIFB5QnVmZmVyZWRSYW5kb21UZXN0LAorICAgICAgICAgICAgIFN0YXRlZnVsSW5jcmVtZW50YWxEZWNvZGVyVGVzdCwKKyAgICAgICAgICAgICBDSW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlclRlc3QsIFB5SW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlclRlc3QsCisgICAgICAgICAgICAgQ1RleHRJT1dyYXBwZXJUZXN0LCBQeVRleHRJT1dyYXBwZXJUZXN0LAorICAgICAgICAgICAgIENNaXNjSU9UZXN0LCBQeU1pc2NJT1Rlc3QsCisgICAgICAgICAgICAgQ1NpZ25hbHNUZXN0LCBQeVNpZ25hbHNUZXN0LAorICAgICAgICAgICAgICkKKworICAgICMgUHV0IHRoZSBuYW1lc3BhY2VzIG9mIHRoZSBJTyBtb2R1bGUgd2UgYXJlIHRlc3RpbmcgYW5kIHNvbWUgdXNlZnVsIG1vY2sKKyAgICAjIGNsYXNzZXMgaW4gdGhlIF9fZGljdF9fIG9mIGVhY2ggdGVzdC4KKyAgICBtb2NrcyA9IChNb2NrUmF3SU8sIE1pc2JlaGF2ZWRSYXdJTywgTW9ja0ZpbGVJTywgQ2xvc2VGYWlsdXJlSU8sCisgICAgICAgICAgICAgTW9ja05vbkJsb2NrV3JpdGVySU8sIE1vY2tSYXdJT1dpdGhvdXRSZWFkKQorICAgIGFsbF9tZW1iZXJzID0gaW8uX19hbGxfXyArIFsiSW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlciJdCisgICAgY19pb19ucyA9IGRpY3QoKG5hbWUsIGdldGF0dHIoaW8sIG5hbWUpKSBmb3IgbmFtZSBpbiBhbGxfbWVtYmVycykKKyAgICBweV9pb19ucyA9IGRpY3QoKG5hbWUsIGdldGF0dHIocHlpbywgbmFtZSkpIGZvciBuYW1lIGluIGFsbF9tZW1iZXJzKQorICAgIGdsb2JzID0gZ2xvYmFscygpCisgICAgY19pb19ucy51cGRhdGUoKHguX19uYW1lX18sIGdsb2JzWyJDIiArIHguX19uYW1lX19dKSBmb3IgeCBpbiBtb2NrcykKKyAgICBweV9pb19ucy51cGRhdGUoKHguX19uYW1lX18sIGdsb2JzWyJQeSIgKyB4Ll9fbmFtZV9fXSkgZm9yIHggaW4gbW9ja3MpCisgICAgIyBBdm9pZCB0dXJuaW5nIG9wZW4gaW50byBhIGJvdW5kIG1ldGhvZC4KKyAgICBweV9pb19uc1sib3BlbiJdID0gcHlpby5PcGVuV3JhcHBlcgorICAgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgICBpZiB0ZXN0Ll9fbmFtZV9fLnN0YXJ0c3dpdGgoIkMiKToKKyAgICAgICAgICAgIGZvciBuYW1lLCBvYmogaW4gY19pb19ucy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHNldGF0dHIodGVzdCwgbmFtZSwgb2JqKQorICAgICAgICBlbGlmIHRlc3QuX19uYW1lX18uc3RhcnRzd2l0aCgiUHkiKToKKyAgICAgICAgICAgIGZvciBuYW1lLCBvYmogaW4gcHlfaW9fbnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHRlc3QsIG5hbWUsIG9iaikKKworICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW8ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW8ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzAyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pby5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW8ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW8ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTJkNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pby5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW9jdGwucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pb2N0bC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTk2NWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW9jdGwucHkKQEAgLTAsMCArMSw5MyBAQAoraW1wb3J0IGFycmF5CitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZSwgZ2V0X2F0dHJpYnV0ZQoraW1wb3J0IG9zLCBzdHJ1Y3QKK2ZjbnRsID0gaW1wb3J0X21vZHVsZSgnZmNudGwnKQordGVybWlvcyA9IGltcG9ydF9tb2R1bGUoJ3Rlcm1pb3MnKQorZ2V0X2F0dHJpYnV0ZSh0ZXJtaW9zLCAnVElPQ0dQR1JQJykgI0Nhbid0IHJ1biB0ZXN0cyB3aXRob3V0IHRoaXMgZmVhdHVyZQorCit0cnk6CisgICAgdHR5ID0gb3BlbigiL2Rldi90dHkiLCAiciIpCitleGNlcHQgSU9FcnJvcjoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiVW5hYmxlIHRvIG9wZW4gL2Rldi90dHkiKQorZWxzZToKKyAgICAjIFNraXAgaWYgYW5vdGhlciBwcm9jZXNzIGlzIGluIGZvcmVncm91bmQKKyAgICByID0gZmNudGwuaW9jdGwodHR5LCB0ZXJtaW9zLlRJT0NHUEdSUCwgIiAgICAiKQorICAgIHR0eS5jbG9zZSgpCisgICAgcnBncnAgPSBzdHJ1Y3QudW5wYWNrKCJpIiwgcilbMF0KKyAgICBpZiBycGdycCBub3QgaW4gKG9zLmdldHBncnAoKSwgb3MuZ2V0c2lkKDApKToKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIk5laXRoZXIgdGhlIHByb2Nlc3MgZ3JvdXAgbm9yIHRoZSBzZXNzaW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZSBhdHRhY2hlZCB0byAvZGV2L3R0eSIpCisgICAgZGVsIHR0eSwgciwgcnBncnAKKwordHJ5OgorICAgIGltcG9ydCBwdHkKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwdHkgPSBOb25lCisKK2NsYXNzIElvY3RsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2lvY3RsKHNlbGYpOgorICAgICAgICAjIElmIHRoaXMgcHJvY2VzcyBoYXMgYmVlbiBwdXQgaW50byB0aGUgYmFja2dyb3VuZCwgVElPQ0dQR1JQIHJldHVybnMKKyAgICAgICAgIyB0aGUgc2Vzc2lvbiBJRCBpbnN0ZWFkIG9mIHRoZSBwcm9jZXNzIGdyb3VwIGlkLgorICAgICAgICBpZHMgPSAob3MuZ2V0cGdycCgpLCBvcy5nZXRzaWQoMCkpCisgICAgICAgIHR0eSA9IG9wZW4oIi9kZXYvdHR5IiwgInIiKQorICAgICAgICByID0gZmNudGwuaW9jdGwodHR5LCB0ZXJtaW9zLlRJT0NHUEdSUCwgIiAgICAiKQorICAgICAgICBycGdycCA9IHN0cnVjdC51bnBhY2soImkiLCByKVswXQorICAgICAgICBzZWxmLmFzc2VydEluKHJwZ3JwLCBpZHMpCisKKyAgICBkZWYgX2NoZWNrX2lvY3RsX211dGF0ZV9sZW4oc2VsZiwgbmJ5dGVzPU5vbmUpOgorICAgICAgICBidWYgPSBhcnJheS5hcnJheSgnaScpCisgICAgICAgIGludHNpemUgPSBidWYuaXRlbXNpemUKKyAgICAgICAgaWRzID0gKG9zLmdldHBncnAoKSwgb3MuZ2V0c2lkKDApKQorICAgICAgICAjIEEgZmlsbCB2YWx1ZSB1bmxpa2VseSB0byBiZSBpbiBgaWRzYAorICAgICAgICBmaWxsID0gLTEyMzQ1CisgICAgICAgIGlmIG5ieXRlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgRXh0ZW5kIHRoZSBidWZmZXIgc28gdGhhdCBpdCBpcyBleGFjdGx5IGBuYnl0ZXNgIGJ5dGVzIGxvbmcKKyAgICAgICAgICAgIGJ1Zi5leHRlbmQoW2ZpbGxdICogKG5ieXRlcyAvLyBpbnRzaXplKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJ1ZikgKiBpbnRzaXplLCBuYnl0ZXMpICAgIyBzYW5pdHkgY2hlY2sKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoZmlsbCkKKyAgICAgICAgd2l0aCBvcGVuKCIvZGV2L3R0eSIsICJyIikgYXMgdHR5OgorICAgICAgICAgICAgciA9IGZjbnRsLmlvY3RsKHR0eSwgdGVybWlvcy5USU9DR1BHUlAsIGJ1ZiwgMSkKKyAgICAgICAgcnBncnAgPSBidWZbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCAwKQorICAgICAgICBzZWxmLmFzc2VydEluKHJwZ3JwLCBpZHMpCisKKyAgICBkZWYgdGVzdF9pb2N0bF9tdXRhdGUoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX2lvY3RsX211dGF0ZV9sZW4oKQorCisgICAgZGVmIHRlc3RfaW9jdGxfbXV0YXRlXzEwMjQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzk3NTg6IGEgbXV0YWJsZSBidWZmZXIgb2YgZXhhY3RseSAxMDI0IGJ5dGVzIHdvdWxkbid0IGJlCisgICAgICAgICMgY29waWVkIGJhY2sgYWZ0ZXIgdGhlIHN5c3RlbSBjYWxsLgorICAgICAgICBzZWxmLl9jaGVja19pb2N0bF9tdXRhdGVfbGVuKDEwMjQpCisKKyAgICBkZWYgdGVzdF9pb2N0bF9tdXRhdGVfMjA0OChzZWxmKToKKyAgICAgICAgIyBUZXN0IHdpdGggYSBsYXJnZXIgYnVmZmVyLCBqdXN0IGZvciB0aGUgcmVjb3JkLgorICAgICAgICBzZWxmLl9jaGVja19pb2N0bF9tdXRhdGVfbGVuKDIwNDgpCisKKyAgICBkZWYgdGVzdF9pb2N0bF9zaWduZWRfdW5zaWduZWRfY29kZV9wYXJhbShzZWxmKToKKyAgICAgICAgaWYgbm90IHB0eToKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdwdHkgbW9kdWxlIHJlcXVpcmVkJykKKyAgICAgICAgbWZkLCBzZmQgPSBwdHkub3BlbnB0eSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHRlcm1pb3MuVElPQ1NXSU5TWiA8IDA6CisgICAgICAgICAgICAgICAgc2V0X3dpbnN6X29wY29kZV9tYXliZV9uZWcgPSB0ZXJtaW9zLlRJT0NTV0lOU1oKKyAgICAgICAgICAgICAgICBzZXRfd2luc3pfb3Bjb2RlX3BvcyA9IHRlcm1pb3MuVElPQ1NXSU5TWiAmIDB4ZmZmZmZmZmZMCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNldF93aW5zel9vcGNvZGVfcG9zID0gdGVybWlvcy5USU9DU1dJTlNaCisgICAgICAgICAgICAgICAgc2V0X3dpbnN6X29wY29kZV9tYXliZV9uZWcsID0gc3RydWN0LnVucGFjaygiaSIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QucGFjaygiSSIsIHRlcm1pb3MuVElPQ1NXSU5TWikpCisKKyAgICAgICAgICAgIG91cl93aW5zeiA9IHN0cnVjdC5wYWNrKCJISEhIIiw4MCwyNSwwLDApCisgICAgICAgICAgICAjIHRlc3QgYm90aCB3aXRoIGEgcG9zaXRpdmUgYW5kIHBvdGVudGlhbGx5IG5lZ2F0aXZlIGlvY3RsIGNvZGUKKyAgICAgICAgICAgIG5ld193aW5zeiA9IGZjbnRsLmlvY3RsKG1mZCwgc2V0X3dpbnN6X29wY29kZV9wb3MsIG91cl93aW5zeikKKyAgICAgICAgICAgIG5ld193aW5zeiA9IGZjbnRsLmlvY3RsKG1mZCwgc2V0X3dpbnN6X29wY29kZV9tYXliZV9uZWcsIG91cl93aW5zeikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNsb3NlKG1mZCkKKyAgICAgICAgICAgIG9zLmNsb3NlKHNmZCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChJb2N0bFRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pb2N0bC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pb2N0bC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwYWM4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lvY3RsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pb2N0bC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pb2N0bC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwYWM4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lvY3RsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pc2luc3RhbmNlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXNpbnN0YW5jZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWIwODE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXNpbnN0YW5jZS5weQpAQCAtMCwwICsxLDI3NyBAQAorIyBUZXN0cyBzb21lIGNvcm5lciBjYXNlcyB3aXRoIGlzaW5zdGFuY2UoKSBhbmQgaXNzdWJjbGFzcygpLiAgV2hpbGUgdGhlc2UKKyMgdGVzdHMgdXNlIG5ldyBzdHlsZSBjbGFzc2VzIGFuZCBwcm9wZXJ0aWVzLCB0aGV5IGFjdHVhbGx5IGRvIHdoaXRlYm94CisjIHRlc3Rpbmcgb2YgZXJyb3IgY29uZGl0aW9ucyB1bmNvdmVyZWQgd2hlbiB1c2luZyBleHRlbnNpb24gdHlwZXMuCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBzeXMKKworCisMCitjbGFzcyBUZXN0SXNJbnN0YW5jZUV4Y2VwdGlvbnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGVzdCB0byBtYWtlIHN1cmUgdGhhdCBhbiBBdHRyaWJ1dGVFcnJvciB3aGVuIGFjY2Vzc2luZyB0aGUgaW5zdGFuY2UncworICAgICMgY2xhc3MncyBiYXNlcyBpcyBtYXNrZWQuICBUaGlzIHdhcyBhY3R1YWxseSBhIGJ1ZyBpbiBQeXRob24gMi4yIGFuZAorICAgICMgMi4yLjEgd2hlcmUgdGhlIGV4Y2VwdGlvbiB3YXNuJ3QgY2F1Z2h0IGJ1dCBpdCBhbHNvIHdhc24ndCBiZWluZyBjbGVhcmVkCisgICAgIyAobGVhZGluZyB0byBhbiAidW5kZXRlY3RlZCBlcnJvciIgaW4gdGhlIGRlYnVnIGJ1aWxkKS4gIFNldCB1cCBpcywKKyAgICAjIGlzaW5zdGFuY2UoaW5zdCwgY2xzKSB3aGVyZToKKyAgICAjCisgICAgIyAtIGluc3QgaXNuJ3QgYW4gSW5zdGFuY2VUeXBlCisgICAgIyAtIGNscyBpc24ndCBhIENsYXNzVHlwZSwgYSBUeXBlVHlwZSwgb3IgYSBUdXBsZVR5cGUKKyAgICAjIC0gY2xzIGhhcyBhIF9fYmFzZXNfXyBhdHRyaWJ1dGUKKyAgICAjIC0gaW5zdCBoYXMgYSBfX2NsYXNzX18gYXR0cmlidXRlCisgICAgIyAtIGluc3QuX19jbGFzc19fIGFzIG5vIF9fYmFzZXNfXyBhdHRyaWJ1dGUKKyAgICAjCisgICAgIyBTb3VuZHMgY29tcGxpY2F0ZWQsIEkga25vdywgYnV0IHRoaXMgbWltaWNzIGEgc2l0dWF0aW9uIHdoZXJlIGFuCisgICAgIyBleHRlbnNpb24gdHlwZSByYWlzZXMgYW4gQXR0cmlidXRlRXJyb3Igd2hlbiBpdHMgX19iYXNlc19fIGF0dHJpYnV0ZSBpcworICAgICMgZ290dGVuLiAgSW4gdGhhdCBjYXNlLCBpc2luc3RhbmNlKCkgc2hvdWxkIHJldHVybiBGYWxzZS4KKyAgICBkZWYgdGVzdF9jbGFzc19oYXNfbm9fYmFzZXMoc2VsZik6CisgICAgICAgIGNsYXNzIEkob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBnZXRjbGFzcyhzZWxmKToKKyAgICAgICAgICAgICAgICAjIFRoaXMgbXVzdCByZXR1cm4gYW4gb2JqZWN0IHRoYXQgaGFzIG5vIF9fYmFzZXNfXyBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgX19jbGFzc19fID0gcHJvcGVydHkoZ2V0Y2xhc3MpCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGdldGJhc2VzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoKQorICAgICAgICAgICAgX19iYXNlc19fID0gcHJvcGVydHkoZ2V0YmFzZXMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNpbnN0YW5jZShJKCksIEMoKSkpCisKKyAgICAjIExpa2UgYWJvdmUgZXhjZXB0IHRoYXQgaW5zdC5fX2NsYXNzX18uX19iYXNlc19fIHJhaXNlcyBhbiBleGNlcHRpb24KKyAgICAjIG90aGVyIHRoYW4gQXR0cmlidXRlRXJyb3IKKyAgICBkZWYgdGVzdF9iYXNlc19yYWlzZXNfb3RoZXJfdGhhbl9hdHRyaWJ1dGVfZXJyb3Ioc2VsZik6CisgICAgICAgIGNsYXNzIEUob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBnZXRiYXNlcyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgIF9fYmFzZXNfXyA9IHByb3BlcnR5KGdldGJhc2VzKQorCisgICAgICAgIGNsYXNzIEkob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBnZXRjbGFzcyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRSgpCisgICAgICAgICAgICBfX2NsYXNzX18gPSBwcm9wZXJ0eShnZXRjbGFzcykKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZ2V0YmFzZXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICgpCisgICAgICAgICAgICBfX2Jhc2VzX18gPSBwcm9wZXJ0eShnZXRiYXNlcykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGlzaW5zdGFuY2UsIEkoKSwgQygpKQorCisgICAgIyBIZXJlJ3MgYSBzaXR1YXRpb24gd2hlcmUgZ2V0YXR0cihjbHMsICdfX2Jhc2VzX18nKSByYWlzZXMgYW4gZXhjZXB0aW9uLgorICAgICMgSWYgdGhhdCBleGNlcHRpb24gaXMgbm90IEF0dHJpYnV0ZUVycm9yLCBpdCBzaG91bGQgbm90IGdldCBtYXNrZWQKKyAgICBkZWYgdGVzdF9kb250X21hc2tfbm9uX2F0dHJpYnV0ZV9lcnJvcihzZWxmKToKKyAgICAgICAgY2xhc3MgSTogcGFzcworCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBnZXRiYXNlcyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgIF9fYmFzZXNfXyA9IHByb3BlcnR5KGdldGJhc2VzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgaXNpbnN0YW5jZSwgSSgpLCBDKCkpCisKKyAgICAjIExpa2UgYWJvdmUsIGV4Y2VwdCB0aGF0IGdldGF0dHIoY2xzLCAnX19iYXNlc19fJykgcmFpc2VzIGFuCisgICAgIyBBdHRyaWJ1dGVFcnJvciwgd2hpY2ggL3Nob3VsZC8gZ2V0IG1hc2tlZCBhcyBhIFR5cGVFcnJvcgorICAgIGRlZiB0ZXN0X21hc2tfYXR0cmlidXRlX2Vycm9yKHNlbGYpOgorICAgICAgICBjbGFzcyBJOiBwYXNzCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGdldGJhc2VzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICAgICBfX2Jhc2VzX18gPSBwcm9wZXJ0eShnZXRiYXNlcykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlzaW5zdGFuY2UsIEkoKSwgQygpKQorCisKKwwKKyMgVGhlc2UgdGVzdHMgYXJlIHNpbWlsYXIgdG8gYWJvdmUsIGJ1dCB0aWNrbGUgY2VydGFpbiBjb2RlIHBhdGhzIGluCisjIGlzc3ViY2xhc3MoKSBpbnN0ZWFkIG9mIGlzaW5zdGFuY2UoKSAtLSByZWFsbHkgUHlPYmplY3RfSXNTdWJjbGFzcygpCisjIHZzLiBQeU9iamVjdF9Jc0luc3RhbmNlKCkuCitjbGFzcyBUZXN0SXNTdWJjbGFzc0V4Y2VwdGlvbnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2RvbnRfbWFza19ub25fYXR0cmlidXRlX2Vycm9yKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZ2V0YmFzZXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgICAgICBfX2Jhc2VzX18gPSBwcm9wZXJ0eShnZXRiYXNlcykKKworICAgICAgICBjbGFzcyBTKEMpOiBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBpc3N1YmNsYXNzLCBDKCksIFMoKSkKKworICAgIGRlZiB0ZXN0X21hc2tfYXR0cmlidXRlX2Vycm9yKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZ2V0YmFzZXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgIF9fYmFzZXNfXyA9IHByb3BlcnR5KGdldGJhc2VzKQorCisgICAgICAgIGNsYXNzIFMoQyk6IHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlzc3ViY2xhc3MsIEMoKSwgUygpKQorCisgICAgIyBMaWtlIGFib3ZlLCBidXQgdGVzdCB0aGUgc2Vjb25kIGJyYW5jaCwgd2hlcmUgdGhlIF9fYmFzZXNfXyBvZiB0aGUKKyAgICAjIHNlY29uZCBhcmcgKHRoZSBjbHMgYXJnKSBpcyB0ZXN0ZWQuICBUaGlzIG1lYW5zIHRoZSBmaXJzdCBhcmcgbXVzdAorICAgICMgcmV0dXJuIGEgdmFsaWQgX19iYXNlc19fLCBhbmQgaXQncyBva2F5IGZvciBpdCB0byBiZSBhIG5vcm1hbCAtLQorICAgICMgdW5yZWxhdGVkIGJ5IGluaGVyaXRhbmNlIC0tIGNsYXNzLgorICAgIGRlZiB0ZXN0X2RvbnRfbWFza19ub25fYXR0cmlidXRlX2Vycm9yX2luX2Nsc19hcmcoc2VsZik6CisgICAgICAgIGNsYXNzIEI6IHBhc3MKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZ2V0YmFzZXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgICAgICBfX2Jhc2VzX18gPSBwcm9wZXJ0eShnZXRiYXNlcykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGlzc3ViY2xhc3MsIEIsIEMoKSkKKworICAgIGRlZiB0ZXN0X21hc2tfYXR0cmlidXRlX2Vycm9yX2luX2Nsc19hcmcoc2VsZik6CisgICAgICAgIGNsYXNzIEI6IHBhc3MKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZ2V0YmFzZXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgIF9fYmFzZXNfXyA9IHByb3BlcnR5KGdldGJhc2VzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXNzdWJjbGFzcywgQiwgQygpKQorCisKKwwKKyMgbWV0YSBjbGFzc2VzIGZvciBjcmVhdGluZyBhYnN0cmFjdCBjbGFzc2VzIGFuZCBpbnN0YW5jZXMKK2NsYXNzIEFic3RyYWN0Q2xhc3Mob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYmFzZXMpOgorICAgICAgICBzZWxmLmJhc2VzID0gYmFzZXMKKworICAgIGRlZiBnZXRiYXNlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzZXMKKyAgICBfX2Jhc2VzX18gPSBwcm9wZXJ0eShnZXRiYXNlcykKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIEFic3RyYWN0SW5zdGFuY2Uoc2VsZikKKworY2xhc3MgQWJzdHJhY3RJbnN0YW5jZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrbGFzcyk6CisgICAgICAgIHNlbGYua2xhc3MgPSBrbGFzcworCisgICAgZGVmIGdldGNsYXNzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5rbGFzcworICAgIF9fY2xhc3NfXyA9IHByb3BlcnR5KGdldGNsYXNzKQorCisjIGFic3RyYWN0IGNsYXNzZXMKK0Fic3RyYWN0U3VwZXIgPSBBYnN0cmFjdENsYXNzKGJhc2VzPSgpKQorCitBYnN0cmFjdENoaWxkID0gQWJzdHJhY3RDbGFzcyhiYXNlcz0oQWJzdHJhY3RTdXBlciwpKQorCisjIG5vcm1hbCBjbGFzc2VzCitjbGFzcyBTdXBlcjoKKyAgICBwYXNzCisKK2NsYXNzIENoaWxkKFN1cGVyKToKKyAgICBwYXNzCisKKyMgbmV3LXN0eWxlIGNsYXNzZXMKK2NsYXNzIE5ld1N1cGVyKG9iamVjdCk6CisgICAgcGFzcworCitjbGFzcyBOZXdDaGlsZChOZXdTdXBlcik6CisgICAgcGFzcworCisKKwwKK2NsYXNzIFRlc3RJc0luc3RhbmNlSXNTdWJjbGFzcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUZXN0cyB0byBlbnN1cmUgdGhhdCBpc2luc3RhbmNlIGFuZCBpc3N1YmNsYXNzIHdvcmsgb24gYWJzdHJhY3QKKyAgICAjIGNsYXNzZXMgYW5kIGluc3RhbmNlcy4gIEJlZm9yZSB0aGUgMi4yIHJlbGVhc2UsIFR5cGVFcnJvcnMgd2VyZQorICAgICMgcmFpc2VkIHdoZW4gYm9vbGVhbiB2YWx1ZXMgc2hvdWxkIGhhdmUgYmVlbiByZXR1cm5lZC4gIFRoZSBidWcgd2FzCisgICAgIyB0cmlnZ2VyZWQgYnkgbWl4aW5nICdub3JtYWwnIGNsYXNzZXMgYW5kIGluc3RhbmNlcyB3ZXJlIHdpdGgKKyAgICAjICdhYnN0cmFjdCcgY2xhc3NlcyBhbmQgaW5zdGFuY2VzLiAgVGhpcyBjYXNlIHRyaWVzIHRvIHRlc3QgYWxsCisgICAgIyBjb21iaW5hdGlvbnMuCisKKyAgICBkZWYgdGVzdF9pc2luc3RhbmNlX25vcm1hbChzZWxmKToKKyAgICAgICAgIyBub3JtYWwgaW5zdGFuY2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgaXNpbnN0YW5jZShTdXBlcigpLCBTdXBlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzaW5zdGFuY2UoU3VwZXIoKSwgQ2hpbGQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc2luc3RhbmNlKFN1cGVyKCksIEFic3RyYWN0U3VwZXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc2luc3RhbmNlKFN1cGVyKCksIEFic3RyYWN0Q2hpbGQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgaXNpbnN0YW5jZShDaGlsZCgpLCBTdXBlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzaW5zdGFuY2UoQ2hpbGQoKSwgQWJzdHJhY3RTdXBlcikpCisKKyAgICBkZWYgdGVzdF9pc2luc3RhbmNlX2Fic3RyYWN0KHNlbGYpOgorICAgICAgICAjIGFic3RyYWN0IGluc3RhbmNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzaW5zdGFuY2UoQWJzdHJhY3RTdXBlcigpLCBBYnN0cmFjdFN1cGVyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNpbnN0YW5jZShBYnN0cmFjdFN1cGVyKCksIEFic3RyYWN0Q2hpbGQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc2luc3RhbmNlKEFic3RyYWN0U3VwZXIoKSwgU3VwZXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc2luc3RhbmNlKEFic3RyYWN0U3VwZXIoKSwgQ2hpbGQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgaXNpbnN0YW5jZShBYnN0cmFjdENoaWxkKCksIEFic3RyYWN0Q2hpbGQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzaW5zdGFuY2UoQWJzdHJhY3RDaGlsZCgpLCBBYnN0cmFjdFN1cGVyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNpbnN0YW5jZShBYnN0cmFjdENoaWxkKCksIFN1cGVyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNpbnN0YW5jZShBYnN0cmFjdENoaWxkKCksIENoaWxkKSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX25vcm1hbChzZWxmKToKKyAgICAgICAgIyBub3JtYWwgY2xhc3NlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3MoU3VwZXIsIFN1cGVyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNzdWJjbGFzcyhTdXBlciwgQWJzdHJhY3RTdXBlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzc3ViY2xhc3MoU3VwZXIsIENoaWxkKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3MoQ2hpbGQsIENoaWxkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc3N1YmNsYXNzKENoaWxkLCBTdXBlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzc3ViY2xhc3MoQ2hpbGQsIEFic3RyYWN0U3VwZXIpKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfYWJzdHJhY3Qoc2VsZik6CisgICAgICAgICMgYWJzdHJhY3QgY2xhc3NlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3MoQWJzdHJhY3RTdXBlciwgQWJzdHJhY3RTdXBlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzc3ViY2xhc3MoQWJzdHJhY3RTdXBlciwgQWJzdHJhY3RDaGlsZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzc3ViY2xhc3MoQWJzdHJhY3RTdXBlciwgQ2hpbGQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgaXNzdWJjbGFzcyhBYnN0cmFjdENoaWxkLCBBYnN0cmFjdENoaWxkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc3N1YmNsYXNzKEFic3RyYWN0Q2hpbGQsIEFic3RyYWN0U3VwZXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc3N1YmNsYXNzKEFic3RyYWN0Q2hpbGQsIFN1cGVyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNzdWJjbGFzcyhBYnN0cmFjdENoaWxkLCBDaGlsZCkpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc190dXBsZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IHdpdGggYSB0dXBsZSBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IGNsYXNzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc3N1YmNsYXNzKENoaWxkLCAoQ2hpbGQsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgaXNzdWJjbGFzcyhDaGlsZCwgKFN1cGVyLCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc3N1YmNsYXNzKFN1cGVyLCAoQ2hpbGQsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgaXNzdWJjbGFzcyhTdXBlciwgKENoaWxkLCBTdXBlcikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc3N1YmNsYXNzKENoaWxkLCAoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgaXNzdWJjbGFzcyhTdXBlciwgKENoaWxkLCAoU3VwZXIsKSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgaXNzdWJjbGFzcyhOZXdDaGlsZCwgKE5ld0NoaWxkLCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3MoTmV3Q2hpbGQsIChOZXdTdXBlciwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNzdWJjbGFzcyhOZXdTdXBlciwgKE5ld0NoaWxkLCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3MoTmV3U3VwZXIsIChOZXdDaGlsZCwgTmV3U3VwZXIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNzdWJjbGFzcyhOZXdDaGlsZCwgKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3MoTmV3U3VwZXIsIChOZXdDaGlsZCwgKE5ld1N1cGVyLCkpKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3MoaW50LCAobG9uZywgKGZsb2F0LCBpbnQpKSkpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3Moc3RyLCAodW5pY29kZSwgKENoaWxkLCBOZXdDaGlsZCwgYmFzZXN0cmluZykpKSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3JlY3Vyc2lvbl9saW1pdChzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCBpc3N1YmNsYXNzIHJhaXNlcyBSdW50aW1lRXJyb3IgYmVmb3JlIHRoZSBDIHN0YWNrIGlzCisgICAgICAgICMgYmxvd24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBibG93c3RhY2ssIGlzc3ViY2xhc3MsIHN0ciwgc3RyKQorCisgICAgZGVmIHRlc3RfaXNpbnN0YW5jZV9yZWN1cnNpb25fbGltaXQoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIHRoYXQgaXNzdWJjbGFzcyByYWlzZXMgUnVudGltZUVycm9yIGJlZm9yZSB0aGUgQyBzdGFjayBpcworICAgICAgICAjIGJsb3duCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgYmxvd3N0YWNrLCBpc2luc3RhbmNlLCAnJywgc3RyKQorCitkZWYgYmxvd3N0YWNrKGZ4biwgYXJnLCBjb21wYXJlX3RvKToKKyAgICAjIE1ha2Ugc3VyZSB0aGF0IGNhbGxpbmcgaXNpbnN0YW5jZSB3aXRoIGEgZGVlcGx5IG5lc3RlZCB0dXBsZSBmb3IgaXRzCisgICAgIyBhcmd1bWVudCB3aWxsIHJhaXNlIFJ1bnRpbWVFcnJvciBldmVudHVhbGx5LgorICAgIHR1cGxlX2FyZyA9IChjb21wYXJlX3RvLCkKKyAgICBmb3IgY250IGluIHhyYW5nZShzeXMuZ2V0cmVjdXJzaW9ubGltaXQoKSs1KToKKyAgICAgICAgdHVwbGVfYXJnID0gKHR1cGxlX2FyZywpCisgICAgICAgIGZ4bihhcmcsIHR1cGxlX2FyZykKKworDAorZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFRlc3RJc0luc3RhbmNlRXhjZXB0aW9ucywKKyAgICAgICAgVGVzdElzU3ViY2xhc3NFeGNlcHRpb25zLAorICAgICAgICBUZXN0SXNJbnN0YW5jZUlzU3ViY2xhc3MKKyAgICApCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXNpbnN0YW5jZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pc2luc3RhbmNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzM4ZGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXNpbnN0YW5jZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXNpbnN0YW5jZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pc2luc3RhbmNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzM4ZGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXNpbnN0YW5jZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjMzlkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXIucHkKQEAgLTAsMCArMSw5MzIgQEAKKyMgVGVzdCBpdGVyYXRvcnMuCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBURVNURk4sIHVubGluaywgaGF2ZV91bmljb2RlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19weTNrX3dhcm5pbmdzLCBjcHl0aG9uX29ubHkKKworIyBUZXN0IHJlc3VsdCBvZiB0cmlwbGUgbG9vcCAodG9vIGJpZyB0byBpbmxpbmUpCitUUklQTEVUUyA9IFsoMCwgMCwgMCksICgwLCAwLCAxKSwgKDAsIDAsIDIpLAorICAgICAgICAgICAgKDAsIDEsIDApLCAoMCwgMSwgMSksICgwLCAxLCAyKSwKKyAgICAgICAgICAgICgwLCAyLCAwKSwgKDAsIDIsIDEpLCAoMCwgMiwgMiksCisKKyAgICAgICAgICAgICgxLCAwLCAwKSwgKDEsIDAsIDEpLCAoMSwgMCwgMiksCisgICAgICAgICAgICAoMSwgMSwgMCksICgxLCAxLCAxKSwgKDEsIDEsIDIpLAorICAgICAgICAgICAgKDEsIDIsIDApLCAoMSwgMiwgMSksICgxLCAyLCAyKSwKKworICAgICAgICAgICAgKDIsIDAsIDApLCAoMiwgMCwgMSksICgyLCAwLCAyKSwKKyAgICAgICAgICAgICgyLCAxLCAwKSwgKDIsIDEsIDEpLCAoMiwgMSwgMiksCisgICAgICAgICAgICAoMiwgMiwgMCksICgyLCAyLCAxKSwgKDIsIDIsIDIpXQorCisjIEhlbHBlciBjbGFzc2VzCisKK2NsYXNzIEJhc2ljSXRlckNsYXNzOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuKToKKyAgICAgICAgc2VsZi5uID0gbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHJlcyA9IHNlbGYuaQorICAgICAgICBpZiByZXMgPj0gc2VsZi5uOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICBzZWxmLmkgPSByZXMgKyAxCisgICAgICAgIHJldHVybiByZXMKKworY2xhc3MgSXRlcmF0aW5nU2VxdWVuY2VDbGFzczoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbik6CisgICAgICAgIHNlbGYubiA9IG4KKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBCYXNpY0l0ZXJDbGFzcyhzZWxmLm4pCisKK2NsYXNzIFNlcXVlbmNlQ2xhc3M6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG4pOgorICAgICAgICBzZWxmLm4gPSBuCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICBpZiAwIDw9IGkgPCBzZWxmLm46CisgICAgICAgICAgICByZXR1cm4gaQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorCisjIE1haW4gdGVzdCBzdWl0ZQorCitjbGFzcyBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIEhlbHBlciB0byBjaGVjayB0aGF0IGFuIGl0ZXJhdG9yIHJldHVybnMgYSBnaXZlbiBzZXF1ZW5jZQorICAgIGRlZiBjaGVja19pdGVyYXRvcihzZWxmLCBpdCwgc2VxKToKKyAgICAgICAgcmVzID0gW10KKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWwgPSBpdC5uZXh0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZXMuYXBwZW5kKHZhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHNlcSkKKworICAgICMgSGVscGVyIHRvIGNoZWNrIHRoYXQgYSBmb3IgbG9vcCBnZW5lcmF0ZXMgYSBnaXZlbiBzZXF1ZW5jZQorICAgIGRlZiBjaGVja19mb3JfbG9vcChzZWxmLCBleHByLCBzZXEpOgorICAgICAgICByZXMgPSBbXQorICAgICAgICBmb3IgdmFsIGluIGV4cHI6CisgICAgICAgICAgICByZXMuYXBwZW5kKHZhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHNlcSkKKworICAgICMgVGVzdCBiYXNpYyB1c2Ugb2YgaXRlcigpIGZ1bmN0aW9uCisgICAgZGVmIHRlc3RfaXRlcl9iYXNpYyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pdGVyYXRvcihpdGVyKHJhbmdlKDEwKSksIHJhbmdlKDEwKSkKKworICAgICMgVGVzdCB0aGF0IGl0ZXIoaXRlcih4KSkgaXMgdGhlIHNhbWUgYXMgaXRlcih4KQorICAgIGRlZiB0ZXN0X2l0ZXJfaWRlbXBvdGVuY3koc2VsZik6CisgICAgICAgIHNlcSA9IHJhbmdlKDEwKQorICAgICAgICBpdCA9IGl0ZXIoc2VxKQorICAgICAgICBpdDIgPSBpdGVyKGl0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXQgaXMgaXQyKQorCisgICAgIyBUZXN0IHRoYXQgZm9yIGxvb3BzIG92ZXIgaXRlcmF0b3JzIHdvcmsKKyAgICBkZWYgdGVzdF9pdGVyX2Zvcl9sb29wKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Zvcl9sb29wKGl0ZXIocmFuZ2UoMTApKSwgcmFuZ2UoMTApKQorCisgICAgIyBUZXN0IHNldmVyYWwgaW5kZXBlbmRlbnQgaXRlcmF0b3JzIG92ZXIgdGhlIHNhbWUgbGlzdAorICAgIGRlZiB0ZXN0X2l0ZXJfaW5kZXBlbmRlbmNlKHNlbGYpOgorICAgICAgICBzZXEgPSByYW5nZSgzKQorICAgICAgICByZXMgPSBbXQorICAgICAgICBmb3IgaSBpbiBpdGVyKHNlcSk6CisgICAgICAgICAgICBmb3IgaiBpbiBpdGVyKHNlcSk6CisgICAgICAgICAgICAgICAgZm9yIGsgaW4gaXRlcihzZXEpOgorICAgICAgICAgICAgICAgICAgICByZXMuYXBwZW5kKChpLCBqLCBrKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFRSSVBMRVRTKQorCisgICAgIyBUZXN0IHRyaXBsZSBsaXN0IGNvbXByZWhlbnNpb24gdXNpbmcgaXRlcmF0b3JzCisgICAgZGVmIHRlc3RfbmVzdGVkX2NvbXByZWhlbnNpb25zX2l0ZXIoc2VsZik6CisgICAgICAgIHNlcSA9IHJhbmdlKDMpCisgICAgICAgIHJlcyA9IFsoaSwgaiwgaykKKyAgICAgICAgICAgICAgIGZvciBpIGluIGl0ZXIoc2VxKSBmb3IgaiBpbiBpdGVyKHNlcSkgZm9yIGsgaW4gaXRlcihzZXEpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgVFJJUExFVFMpCisKKyAgICAjIFRlc3QgdHJpcGxlIGxpc3QgY29tcHJlaGVuc2lvbiB3aXRob3V0IGl0ZXJhdG9ycworICAgIGRlZiB0ZXN0X25lc3RlZF9jb21wcmVoZW5zaW9uc19mb3Ioc2VsZik6CisgICAgICAgIHNlcSA9IHJhbmdlKDMpCisgICAgICAgIHJlcyA9IFsoaSwgaiwgaykgZm9yIGkgaW4gc2VxIGZvciBqIGluIHNlcSBmb3IgayBpbiBzZXFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBUUklQTEVUUykKKworICAgICMgVGVzdCBhIGNsYXNzIHdpdGggX19pdGVyX18gaW4gYSBmb3IgbG9vcAorICAgIGRlZiB0ZXN0X2l0ZXJfY2xhc3NfZm9yKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Zvcl9sb29wKEl0ZXJhdGluZ1NlcXVlbmNlQ2xhc3MoMTApLCByYW5nZSgxMCkpCisKKyAgICAjIFRlc3QgYSBjbGFzcyB3aXRoIF9faXRlcl9fIHdpdGggZXhwbGljaXQgaXRlcigpCisgICAgZGVmIHRlc3RfaXRlcl9jbGFzc19pdGVyKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2l0ZXJhdG9yKGl0ZXIoSXRlcmF0aW5nU2VxdWVuY2VDbGFzcygxMCkpLCByYW5nZSgxMCkpCisKKyAgICAjIFRlc3QgZm9yIGxvb3Agb24gYSBzZXF1ZW5jZSBjbGFzcyB3aXRob3V0IF9faXRlcl9fCisgICAgZGVmIHRlc3Rfc2VxX2NsYXNzX2ZvcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19mb3JfbG9vcChTZXF1ZW5jZUNsYXNzKDEwKSwgcmFuZ2UoMTApKQorCisgICAgIyBUZXN0IGl0ZXIoKSBvbiBhIHNlcXVlbmNlIGNsYXNzIHdpdGhvdXQgX19pdGVyX18KKyAgICBkZWYgdGVzdF9zZXFfY2xhc3NfaXRlcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pdGVyYXRvcihpdGVyKFNlcXVlbmNlQ2xhc3MoMTApKSwgcmFuZ2UoMTApKQorCisgICAgIyBUZXN0IGEgbmV3X3N0eWxlIGNsYXNzIHdpdGggX19pdGVyX18gYnV0IG5vIG5leHQoKSBtZXRob2QKKyAgICBkZWYgdGVzdF9uZXdfc3R5bGVfaXRlcl9jbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgSXRlckNsYXNzKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpdGVyLCBJdGVyQ2xhc3MoKSkKKworICAgICMgVGVzdCB0d28tYXJndW1lbnQgaXRlcigpIHdpdGggY2FsbGFibGUgaW5zdGFuY2UKKyAgICBkZWYgdGVzdF9pdGVyX2NhbGxhYmxlKHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuaSA9IDAKKyAgICAgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBpID0gc2VsZi5pCisgICAgICAgICAgICAgICAgc2VsZi5pID0gaSArIDEKKyAgICAgICAgICAgICAgICBpZiBpID4gMTAwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yICMgRW1lcmdlbmN5IHN0b3AKKyAgICAgICAgICAgICAgICByZXR1cm4gaQorICAgICAgICBzZWxmLmNoZWNrX2l0ZXJhdG9yKGl0ZXIoQygpLCAxMCksIHJhbmdlKDEwKSkKKworICAgICMgVGVzdCB0d28tYXJndW1lbnQgaXRlcigpIHdpdGggZnVuY3Rpb24KKyAgICBkZWYgdGVzdF9pdGVyX2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICBkZWYgc3BhbShzdGF0ZT1bMF0pOgorICAgICAgICAgICAgaSA9IHN0YXRlWzBdCisgICAgICAgICAgICBzdGF0ZVswXSA9IGkrMQorICAgICAgICAgICAgcmV0dXJuIGkKKyAgICAgICAgc2VsZi5jaGVja19pdGVyYXRvcihpdGVyKHNwYW0sIDEwKSwgcmFuZ2UoMTApKQorCisgICAgIyBUZXN0IHR3by1hcmd1bWVudCBpdGVyKCkgd2l0aCBmdW5jdGlvbiB0aGF0IHJhaXNlcyBTdG9wSXRlcmF0aW9uCisgICAgZGVmIHRlc3RfaXRlcl9mdW5jdGlvbl9zdG9wKHNlbGYpOgorICAgICAgICBkZWYgc3BhbShzdGF0ZT1bMF0pOgorICAgICAgICAgICAgaSA9IHN0YXRlWzBdCisgICAgICAgICAgICBpZiBpID09IDEwOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIHN0YXRlWzBdID0gaSsxCisgICAgICAgICAgICByZXR1cm4gaQorICAgICAgICBzZWxmLmNoZWNrX2l0ZXJhdG9yKGl0ZXIoc3BhbSwgMjApLCByYW5nZSgxMCkpCisKKyAgICAjIFRlc3QgZXhjZXB0aW9uIHByb3BhZ2F0aW9uIHRocm91Z2ggZnVuY3Rpb24gaXRlcmF0b3IKKyAgICBkZWYgdGVzdF9leGNlcHRpb25fZnVuY3Rpb24oc2VsZik6CisgICAgICAgIGRlZiBzcGFtKHN0YXRlPVswXSk6CisgICAgICAgICAgICBpID0gc3RhdGVbMF0KKyAgICAgICAgICAgIHN0YXRlWzBdID0gaSsxCisgICAgICAgICAgICBpZiBpID09IDEwOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgcmV0dXJuIGkKKyAgICAgICAgcmVzID0gW10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIHggaW4gaXRlcihzcGFtLCAyMCk6CisgICAgICAgICAgICAgICAgcmVzLmFwcGVuZCh4KQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHJhbmdlKDEwKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFJ1bnRpbWVFcnJvciIpCisKKyAgICAjIFRlc3QgZXhjZXB0aW9uIHByb3BhZ2F0aW9uIHRocm91Z2ggc2VxdWVuY2UgaXRlcmF0b3IKKyAgICBkZWYgdGVzdF9leGNlcHRpb25fc2VxdWVuY2Uoc2VsZik6CisgICAgICAgIGNsYXNzIE15U2VxdWVuY2VDbGFzcyhTZXF1ZW5jZUNsYXNzKToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBpZiBpID09IDEwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgICAgICByZXR1cm4gU2VxdWVuY2VDbGFzcy5fX2dldGl0ZW1fXyhzZWxmLCBpKQorICAgICAgICByZXMgPSBbXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgeCBpbiBNeVNlcXVlbmNlQ2xhc3MoMjApOgorICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoeCkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCByYW5nZSgxMCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBSdW50aW1lRXJyb3IiKQorCisgICAgIyBUZXN0IGZvciBTdG9wSXRlcmF0aW9uIGZyb20gX19nZXRpdGVtX18KKyAgICBkZWYgdGVzdF9zdG9wX3NlcXVlbmNlKHNlbGYpOgorICAgICAgICBjbGFzcyBNeVNlcXVlbmNlQ2xhc3MoU2VxdWVuY2VDbGFzcyk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgaSA9PSAxMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIHJldHVybiBTZXF1ZW5jZUNsYXNzLl9fZ2V0aXRlbV9fKHNlbGYsIGkpCisgICAgICAgIHNlbGYuY2hlY2tfZm9yX2xvb3AoTXlTZXF1ZW5jZUNsYXNzKDIwKSwgcmFuZ2UoMTApKQorCisgICAgIyBUZXN0IGEgYmlnIHJhbmdlCisgICAgZGVmIHRlc3RfaXRlcl9iaWdfcmFuZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfZm9yX2xvb3AoaXRlcihyYW5nZSgxMDAwMCkpLCByYW5nZSgxMDAwMCkpCisKKyAgICAjIFRlc3QgYW4gZW1wdHkgbGlzdAorICAgIGRlZiB0ZXN0X2l0ZXJfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfZm9yX2xvb3AoaXRlcihbXSksIFtdKQorCisgICAgIyBUZXN0IGEgdHVwbGUKKyAgICBkZWYgdGVzdF9pdGVyX3R1cGxlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Zvcl9sb29wKGl0ZXIoKDAsMSwyLDMsNCw1LDYsNyw4LDkpKSwgcmFuZ2UoMTApKQorCisgICAgIyBUZXN0IGFuIHhyYW5nZQorICAgIGRlZiB0ZXN0X2l0ZXJfeHJhbmdlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Zvcl9sb29wKGl0ZXIoeHJhbmdlKDEwKSksIHJhbmdlKDEwKSkKKworICAgICMgVGVzdCBhIHN0cmluZworICAgIGRlZiB0ZXN0X2l0ZXJfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Zvcl9sb29wKGl0ZXIoImFiY2RlIiksIFsiYSIsICJiIiwgImMiLCAiZCIsICJlIl0pCisKKyAgICAjIFRlc3QgYSBVbmljb2RlIHN0cmluZworICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgZGVmIHRlc3RfaXRlcl91bmljb2RlKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5jaGVja19mb3JfbG9vcChpdGVyKHVuaWNvZGUoImFiY2RlIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdW5pY29kZSgiYSIpLCB1bmljb2RlKCJiIiksIHVuaWNvZGUoImMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGUoImQiKSwgdW5pY29kZSgiZSIpXSkKKworICAgICMgVGVzdCBhIGRpcmVjdG9yeQorICAgIGRlZiB0ZXN0X2l0ZXJfZGljdChzZWxmKToKKyAgICAgICAgZGljdCA9IHt9CisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIGRpY3RbaV0gPSBOb25lCisgICAgICAgIHNlbGYuY2hlY2tfZm9yX2xvb3AoZGljdCwgZGljdC5rZXlzKCkpCisKKyAgICAjIFRlc3QgYSBmaWxlCisgICAgZGVmIHRlc3RfaXRlcl9maWxlKHNlbGYpOgorICAgICAgICBmID0gb3BlbihURVNURk4sICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiJWRcbiIgJSBpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2Zvcl9sb29wKGYsIFsiMFxuIiwgIjFcbiIsICIyXG4iLCAiM1xuIiwgIjRcbiJdKQorICAgICAgICAgICAgc2VsZi5jaGVja19mb3JfbG9vcChmLCBbXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAjIFRlc3QgbGlzdCgpJ3MgdXNlIG9mIGl0ZXJhdG9ycy4KKyAgICBkZWYgdGVzdF9idWlsdGluX2xpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChTZXF1ZW5jZUNsYXNzKDUpKSwgcmFuZ2UoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChTZXF1ZW5jZUNsYXNzKDApKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgoKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmFuZ2UoMTAsIC0xLCAtMSkpLCByYW5nZSgxMCwgLTEsIC0xKSkKKworICAgICAgICBkID0geyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBkLmtleXMoKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIGxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCwgNDIpCisKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgICAgIGYud3JpdGUoIiVkXG4iICUgaSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGYpLCBbIjBcbiIsICIxXG4iLCAiMlxuIiwgIjNcbiIsICI0XG4iXSkKKyAgICAgICAgICAgIGYuc2VlaygwLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIjBcbiIsICIxXG4iLCAiMlxuIiwgIjNcbiIsICI0XG4iXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAjIFRlc3QgdHVwbGVzKCkncyB1c2Ugb2YgaXRlcmF0b3JzLgorICAgIGRlZiB0ZXN0X2J1aWx0aW5fdHVwbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoU2VxdWVuY2VDbGFzcyg1KSksICgwLCAxLCAyLCAzLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShTZXF1ZW5jZUNsYXNzKDApKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoW10pLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZSgoKSksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKCJhYmMiKSwgKCJhIiwgImIiLCAiYyIpKQorCisgICAgICAgIGQgPSB7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKGQpLCB0dXBsZShkLmtleXMoKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0dXBsZSwgbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0dXBsZSwgNDIpCisKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgICAgIGYud3JpdGUoIiVkXG4iICUgaSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShmKSwgKCIwXG4iLCAiMVxuIiwgIjJcbiIsICIzXG4iLCAiNFxuIikpCisgICAgICAgICAgICBmLnNlZWsoMCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiMFxuIiwgIjFcbiIsICIyXG4iLCAiM1xuIiwgIjRcbiIpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdW5saW5rKFRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICMgVGVzdCBmaWx0ZXIoKSdzIHVzZSBvZiBpdGVyYXRvcnMuCisgICAgZGVmIHRlc3RfYnVpbHRpbl9maWx0ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKE5vbmUsIFNlcXVlbmNlQ2xhc3MoNSkpLCByYW5nZSgxLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIoTm9uZSwgU2VxdWVuY2VDbGFzcygwKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihOb25lLCAoKSksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihOb25lLCAiYWJjIiksICJhYmMiKQorCisgICAgICAgIGQgPSB7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihOb25lLCBkKSwgZC5rZXlzKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmaWx0ZXIsIE5vbmUsIGxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmlsdGVyLCBOb25lLCA0MikKKworICAgICAgICBjbGFzcyBCb29sZWFuOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRydXRoKToKKyAgICAgICAgICAgICAgICBzZWxmLnRydXRoID0gdHJ1dGgKKyAgICAgICAgICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi50cnV0aAorICAgICAgICBiVHJ1ZSA9IEJvb2xlYW4oMSkKKyAgICAgICAgYkZhbHNlID0gQm9vbGVhbigwKQorCisgICAgICAgIGNsYXNzIFNlcToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgc2VsZi52YWxzID0gYXJncworICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGNsYXNzIFNlcUl0ZXI6CisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWxzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmFscyA9IHZhbHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaSA9IDAKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gc2VsZi5pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmkgPSBpICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaSA8IGxlbihzZWxmLnZhbHMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIHJldHVybiBTZXFJdGVyKHNlbGYudmFscykKKworICAgICAgICBzZXEgPSBTZXEoKihbYlRydWUsIGJGYWxzZV0gKiAyNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKGxhbWJkYSB4OiBub3QgeCwgc2VxKSwgW2JGYWxzZV0qMjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKGxhbWJkYSB4OiBub3QgeCwgaXRlcihzZXEpKSwgW2JGYWxzZV0qMjUpCisKKyAgICAjIFRlc3QgbWF4KCkgYW5kIG1pbigpJ3MgdXNlIG9mIGl0ZXJhdG9ycy4KKyAgICBkZWYgdGVzdF9idWlsdGluX21heF9taW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF4KFNlcXVlbmNlQ2xhc3MoNSkpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbihTZXF1ZW5jZUNsYXNzKDUpKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoOCwgLTEpLCA4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbig4LCAtMSksIC0xKQorCisgICAgICAgIGQgPSB7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heChkKSwgInR3byIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWluKGQpLCAib25lIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoZC5pdGVydmFsdWVzKCkpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbihpdGVyKGQuaXRlcnZhbHVlcygpKSksIDEpCisKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoIm1lZGl1bSBsaW5lXG4iKQorICAgICAgICAgICAgZi53cml0ZSgieHRyYSBsYXJnZSBsaW5lXG4iKQorICAgICAgICAgICAgZi53cml0ZSgiaXR0eS1iaXR0eSBsaW5lXG4iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbihmKSwgIml0dHktYml0dHkgbGluZVxuIikKKyAgICAgICAgICAgIGYuc2VlaygwLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoZiksICJ4dHJhIGxhcmdlIGxpbmVcbiIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgIyBUZXN0IG1hcCgpJ3MgdXNlIG9mIGl0ZXJhdG9ycy4KKyAgICBkZWYgdGVzdF9idWlsdGluX21hcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAobGFtYmRhIHg6IHgrMSwgU2VxdWVuY2VDbGFzcyg1KSksIHJhbmdlKDEsIDYpKQorCisgICAgICAgIGQgPSB7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChsYW1iZGEgaywgZD1kOiAoaywgZFtrXSksIGQpLCBkLml0ZW1zKCkpCisgICAgICAgIGRrZXlzID0gZC5rZXlzKCkKKyAgICAgICAgZXhwZWN0ZWQgPSBbKGkgPCBsZW4oZCkgYW5kIGRrZXlzW2ldIG9yIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgaSA8IGxlbihkKSBhbmQgZGtleXNbaV0gb3IgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSldCisKKyAgICAgICAgIyBEZXByZWNhdGVkIG1hcChOb25lLCAuLi4pCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAoTm9uZSwgU2VxdWVuY2VDbGFzcyg1KSksIHJhbmdlKDUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAoTm9uZSwgZCksIGQua2V5cygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAoTm9uZSwgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlQ2xhc3MoNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyKGQuaXRlcmtleXMoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKworICAgICAgICBmID0gb3BlbihURVNURk4sICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgICAgIGYud3JpdGUoInh5IiAqIGkgKyAiXG4iKSAjIGxpbmUgaSBoYXMgbGVuIDIqaSsxCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAiciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwKGxlbiwgZiksIHJhbmdlKDEsIDIxLCAyKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAjIFRlc3QgemlwKCkncyB1c2Ugb2YgaXRlcmF0b3JzLgorICAgIGRlZiB0ZXN0X2J1aWx0aW5femlwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCgpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoKltdKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKCpbKDEsIDIpLCAnYWInXSksIFsoMSwgJ2EnKSwgKDIsICdiJyldKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgemlwLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHppcCwgcmFuZ2UoMTApLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB6aXAsIHJhbmdlKDEwKSwgemlwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKEl0ZXJhdGluZ1NlcXVlbmNlQ2xhc3MoMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMCwpLCAoMSwpLCAoMiwpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoU2VxdWVuY2VDbGFzcygzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygwLCksICgxLCksICgyLCldKQorCisgICAgICAgIGQgPSB7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaXRlbXMoKSwgemlwKGQsIGQuaXRlcnZhbHVlcygpKSkKKworICAgICAgICAjIEdlbmVyYXRlIGFsbCBpbnRzIHN0YXJ0aW5nIGF0IGNvbnN0cnVjdG9yIGFyZy4KKyAgICAgICAgY2xhc3MgSW50c0Zyb206CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQpOgorICAgICAgICAgICAgICAgIHNlbGYuaSA9IHN0YXJ0CisKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICBpID0gc2VsZi5pCisgICAgICAgICAgICAgICAgc2VsZi5pID0gaSsxCisgICAgICAgICAgICAgICAgcmV0dXJuIGkKKworICAgICAgICBmID0gb3BlbihURVNURk4sICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiYVxuIiAiYmJiXG4iICJjY1xuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoSW50c0Zyb20oMCksIGYsIEludHNGcm9tKC0xMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygwLCAiYVxuIiwgLTEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgImJiYlxuIiwgLTk5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAiY2NcbiIsIC05OCldKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdW5saW5rKFRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCh4cmFuZ2UoNSkpLCBbKGksKSBmb3IgaSBpbiByYW5nZSg1KV0pCisKKyAgICAgICAgIyBDbGFzc2VzIHRoYXQgbGllIGFib3V0IHRoZWlyIGxlbmd0aHMuCisgICAgICAgIGNsYXNzIE5vR3Vlc3NMZW41OgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIGlmIGkgPj0gNToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorICAgICAgICAgICAgICAgIHJldHVybiBpCisKKyAgICAgICAgY2xhc3MgR3Vlc3MzTGVuNShOb0d1ZXNzTGVuNSk6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMworCisgICAgICAgIGNsYXNzIEd1ZXNzMzBMZW41KE5vR3Vlc3NMZW41KToKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAzMAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEd1ZXNzM0xlbjUoKSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEd1ZXNzMzBMZW41KCkpLCAzMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoTm9HdWVzc0xlbjUoKSksIHppcChyYW5nZSg1KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKEd1ZXNzM0xlbjUoKSksIHppcChyYW5nZSg1KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKEd1ZXNzMzBMZW41KCkpLCB6aXAocmFuZ2UoNSkpKQorCisgICAgICAgIGV4cGVjdGVkID0gWyhpLCBpKSBmb3IgaSBpbiByYW5nZSg1KV0KKyAgICAgICAgZm9yIHggaW4gTm9HdWVzc0xlbjUoKSwgR3Vlc3MzTGVuNSgpLCBHdWVzczMwTGVuNSgpOgorICAgICAgICAgICAgZm9yIHkgaW4gTm9HdWVzc0xlbjUoKSwgR3Vlc3MzTGVuNSgpLCBHdWVzczMwTGVuNSgpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKHgsIHkpLCBleHBlY3RlZCkKKworICAgICMgVGVzdCByZWR1Y2VzKCkncyB1c2Ugb2YgaXRlcmF0b3JzLgorICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfYnVpbHRpbl9yZWR1Y2Uoc2VsZik6CisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9idWlsdGluX3JlZHVjZSgpCisKKyAgICBkZWYgX3Rlc3RfYnVpbHRpbl9yZWR1Y2Uoc2VsZik6CisgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGFkZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShhZGQsIFNlcXVlbmNlQ2xhc3MoNSkpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UoYWRkLCBTZXF1ZW5jZUNsYXNzKDUpLCA0MiksIDUyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZHVjZSwgYWRkLCBTZXF1ZW5jZUNsYXNzKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShhZGQsIFNlcXVlbmNlQ2xhc3MoMCksIDQyKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGFkZCwgU2VxdWVuY2VDbGFzcygxKSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGFkZCwgU2VxdWVuY2VDbGFzcygxKSwgNDIpLCA0MikKKworICAgICAgICBkID0geyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UoYWRkLCBkKSwgIiIuam9pbihkLmtleXMoKSkpCisKKyAgICAjIFRoaXMgdGVzdCBjYXNlIHdpbGwgYmUgcmVtb3ZlZCBpZiB3ZSBkb24ndCBoYXZlIFVuaWNvZGUKKyAgICBkZWYgdGVzdF91bmljb2RlX2pvaW5fZW5kY2FzZShzZWxmKToKKworICAgICAgICAjIFRoaXMgY2xhc3MgaW5zZXJ0cyBhIFVuaWNvZGUgb2JqZWN0IGludG8gaXRzIGFyZ3VtZW50J3MgbmF0dXJhbAorICAgICAgICAjIGl0ZXJhdGlvbiwgaW4gdGhlIDNyZCBwb3NpdGlvbi4KKyAgICAgICAgY2xhc3MgT2hQaG9vZXk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2VxKToKKyAgICAgICAgICAgICAgICBzZWxmLml0ID0gaXRlcihzZXEpCisgICAgICAgICAgICAgICAgc2VsZi5pID0gMAorCisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgaSA9IHNlbGYuaQorICAgICAgICAgICAgICAgIHNlbGYuaSA9IGkrMQorICAgICAgICAgICAgICAgIGlmIGkgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUoImZvb2xlZCB5b3UhIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pdC5uZXh0KCkKKworICAgICAgICBmID0gb3BlbihURVNURk4sICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiYVxuIiArICJiXG4iICsgImNcbiIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBmID0gb3BlbihURVNURk4sICJyIikKKyAgICAgICAgIyBOYXN0eTogIHN0cmluZy5qb2luKHMpIGNhbid0IGtub3cgd2hldGhlciB1bmljb2RlLmpvaW4oKSBpcyBuZWVkZWQKKyAgICAgICAgIyB1bnRpbCBpdCdzIHNlZW4gYWxsIG9mIHMncyBlbGVtZW50cy4gIEJ1dCBpbiB0aGlzIGNhc2UsIGYncworICAgICAgICAjIGl0ZXJhdG9yIGNhbm5vdCBiZSByZXN0YXJ0ZWQuICBTbyB3aGF0IHdlJ3JlIHRlc3RpbmcgaGVyZSBpcworICAgICAgICAjIHdoZXRoZXIgc3RyaW5nLmpvaW4oKSBjYW4gbWFuYWdlIHRvIHJlbWVtYmVyIGV2ZXJ5dGhpbmcgaXQncyBzZWVuCisgICAgICAgICMgYW5kIHBhc3MgdGhhdCBvbiB0byB1bmljb2RlLmpvaW4oKS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZ290ID0gIiAtICIuam9pbihPaFBob29leShmKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCB1bmljb2RlKCJhXG4gLSBiXG4gLSBmb29sZWQgeW91ISAtIGNcbiIpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdW5saW5rKFRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICBpZiBub3QgaGF2ZV91bmljb2RlOgorICAgICAgICBkZWYgdGVzdF91bmljb2RlX2pvaW5fZW5kY2FzZShzZWxmKTogcGFzcworCisgICAgIyBUZXN0IGl0ZXJhdG9ycyB3aXRoICd4IGluIHknIGFuZCAneCBub3QgaW4geScuCisgICAgZGVmIHRlc3RfaW5fYW5kX25vdF9pbihzZWxmKToKKyAgICAgICAgZm9yIHNjNSBpbiBJdGVyYXRpbmdTZXF1ZW5jZUNsYXNzKDUpLCBTZXF1ZW5jZUNsYXNzKDUpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihpLCBzYzUpCisgICAgICAgICAgICBmb3IgaSBpbiAiYWJjIiwgLTEsIDUsIDQyLjQyLCAoMywgNCksIFtdLCB7MTogMX0sIDMtMTJqLCBzYzU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihpLCBzYzUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IDMgaW4gMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAzIG5vdCBpbiBtYXApCisKKyAgICAgICAgZCA9IHsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDMsIDFqOiAyan0KKyAgICAgICAgZm9yIGsgaW4gZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaywgZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oaywgZC5pdGVydmFsdWVzKCkpCisgICAgICAgIGZvciB2IGluIGQudmFsdWVzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHYsIGQuaXRlcnZhbHVlcygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbih2LCBkKQorICAgICAgICBmb3IgaywgdiBpbiBkLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigoaywgdiksIGQuaXRlcml0ZW1zKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCh2LCBrKSwgZC5pdGVyaXRlbXMoKSkKKworICAgICAgICBmID0gb3BlbihURVNURk4sICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiYVxuIiAiYlxuIiAiY1xuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGNodW5rIGluICJhYmMiOgorICAgICAgICAgICAgICAgIGYuc2VlaygwLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oY2h1bmssIGYpCisgICAgICAgICAgICAgICAgZi5zZWVrKDAsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigoY2h1bmsgKyAiXG4iKSwgZikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAjIFRlc3QgaXRlcmF0b3JzIHdpdGggb3BlcmF0b3IuY291bnRPZiAoUHlTZXF1ZW5jZV9Db3VudCkuCisgICAgZGVmIHRlc3RfY291bnRPZihzZWxmKToKKyAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgY291bnRPZgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50T2YoWzEsMiwyLDMsMiw1XSwgMiksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnRPZigoMSwyLDIsMywyLDUpLCAyKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudE9mKCIxMjIzMjUiLCAiMiIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50T2YoIjEyMjMyNSIsICI2IiksIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb3VudE9mLCA0MiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb3VudE9mLCBjb3VudE9mLCBjb3VudE9mKQorCisgICAgICAgIGQgPSB7Im9uZSI6IDMsICJ0d28iOiAzLCAidGhyZWUiOiAzLCAxajogMmp9CisgICAgICAgIGZvciBrIGluIGQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50T2YoZCwgayksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnRPZihkLml0ZXJ2YWx1ZXMoKSwgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnRPZihkLml0ZXJ2YWx1ZXMoKSwgMmopLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50T2YoZC5pdGVydmFsdWVzKCksIDFqKSwgMCkKKworICAgICAgICBmID0gb3BlbihURVNURk4sICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiYVxuIiAiYlxuIiAiY1xuIiAiYlxuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGxldHRlciwgY291bnQgaW4gKCJhIiwgMSksICgiYiIsIDIpLCAoImMiLCAxKSwgKCJkIiwgMCk6CisgICAgICAgICAgICAgICAgZi5zZWVrKDAsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudE9mKGYsIGxldHRlciArICJcbiIpLCBjb3VudCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAjIFRlc3QgaXRlcmF0b3JzIHdpdGggb3BlcmF0b3IuaW5kZXhPZiAoUHlTZXF1ZW5jZV9JbmRleCkuCisgICAgZGVmIHRlc3RfaW5kZXhPZihzZWxmKToKKyAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgaW5kZXhPZgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZGV4T2YoWzEsMiwyLDMsMiw1XSwgMSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5kZXhPZigoMSwyLDIsMywyLDUpLCAyKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleE9mKCgxLDIsMiwzLDIsNSksIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZGV4T2YoKDEsMiwyLDMsMiw1KSwgNSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGluZGV4T2YsICgxLDIsMiwzLDIsNSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGluZGV4T2YsICgxLDIsMiwzLDIsNSksIDYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleE9mKCIxMjIzMjUiLCAiMiIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZGV4T2YoIjEyMjMyNSIsICI1IiksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGluZGV4T2YsICIxMjIzMjUiLCAiNiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbmRleE9mLCA0MiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbmRleE9mLCBpbmRleE9mLCBpbmRleE9mKQorCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJhXG4iICJiXG4iICJjXG4iICJkXG4iICJlXG4iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaXRlciA9IGl0ZXIoZikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5kZXhPZihmaXRlciwgImJcbiIpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleE9mKGZpdGVyLCAiZFxuIiksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZGV4T2YoZml0ZXIsICJlXG4iKSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGluZGV4T2YsIGZpdGVyLCAiYVxuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWNsYXNzID0gSXRlcmF0aW5nU2VxdWVuY2VDbGFzcygzKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5kZXhPZihpY2xhc3MsIGkpLCBpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbmRleE9mLCBpY2xhc3MsIC0xKQorCisgICAgIyBUZXN0IGl0ZXJhdG9ycyB3aXRoIGZpbGUud3JpdGVsaW5lcygpLgorICAgIGRlZiB0ZXN0X3dyaXRlbGluZXMoc2VsZik6CisgICAgICAgIGYgPSBmaWxlKFRFU1RGTiwgInciKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZi53cml0ZWxpbmVzLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLndyaXRlbGluZXMsIDQyKQorCisgICAgICAgICAgICBmLndyaXRlbGluZXMoWyIxXG4iLCAiMlxuIl0pCisgICAgICAgICAgICBmLndyaXRlbGluZXMoKCIzXG4iLCAiNFxuIikpCisgICAgICAgICAgICBmLndyaXRlbGluZXMoeyc1XG4nOiBOb25lfSkKKyAgICAgICAgICAgIGYud3JpdGVsaW5lcyh7fSkKKworICAgICAgICAgICAgIyBUcnkgYSBiaWcgY2h1bmsgdG9vLgorICAgICAgICAgICAgY2xhc3MgSXRlcmF0b3I6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBmaW5pc2gpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maW5pc2ggPSBmaW5pc2gKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pID0gc2VsZi5zdGFydAorCisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuaSA+PSBzZWxmLmZpbmlzaDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc3RyKHNlbGYuaSkgKyAnXG4nCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgY2xhc3MgV2hhdGV2ZXI6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0LCBmaW5pc2gpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maW5pc2ggPSBmaW5pc2gKKworICAgICAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9yKHNlbGYuc3RhcnQsIHNlbGYuZmluaXNoKQorCisgICAgICAgICAgICBmLndyaXRlbGluZXMoV2hhdGV2ZXIoNiwgNisyMDAwKSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBmID0gZmlsZShURVNURk4pCisgICAgICAgICAgICBleHBlY3RlZCA9IFtzdHIoaSkgKyAiXG4iIGZvciBpIGluIHJhbmdlKDEsIDIwMDYpXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGYpLCBleHBlY3RlZCkKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdW5saW5rKFRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworCisgICAgIyBUZXN0IGl0ZXJhdG9ycyBvbiBSSFMgb2YgdW5wYWNraW5nIGFzc2lnbm1lbnRzLgorICAgIGRlZiB0ZXN0X3VucGFja19pdGVyKHNlbGYpOgorICAgICAgICBhLCBiID0gMSwgMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLCBiKSwgKDEsIDIpKQorCisgICAgICAgIGEsIGIsIGMgPSBJdGVyYXRpbmdTZXF1ZW5jZUNsYXNzKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEsIGIsIGMpLCAoMCwgMSwgMikpCisKKyAgICAgICAgdHJ5OiAgICAjIHRvbyBtYW55IHZhbHVlcworICAgICAgICAgICAgYSwgYiA9IEl0ZXJhdGluZ1NlcXVlbmNlQ2xhc3MoMykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBWYWx1ZUVycm9yIikKKworICAgICAgICB0cnk6ICAgICMgbm90IGVub3VnaCB2YWx1ZXMKKyAgICAgICAgICAgIGEsIGIsIGMgPSBJdGVyYXRpbmdTZXF1ZW5jZUNsYXNzKDIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgVmFsdWVFcnJvciIpCisKKyAgICAgICAgdHJ5OiAgICAjIG5vdCBpdGVyYWJsZQorICAgICAgICAgICAgYSwgYiwgYyA9IGxlbgorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgVHlwZUVycm9yIikKKworICAgICAgICBhLCBiLCBjID0gezE6IDQyLCAyOiA0MiwgMzogNDJ9Lml0ZXJ2YWx1ZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLCBiLCBjKSwgKDQyLCA0MiwgNDIpKQorCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInciKQorICAgICAgICBsaW5lcyA9ICgiYVxuIiwgImJiXG4iLCAiY2NjXG4iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgICAgICBmLndyaXRlKGxpbmUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAiciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGEsIGIsIGMgPSBmCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLCBiLCBjKSwgbGluZXMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIChhLCBiKSwgKGMsKSA9IEl0ZXJhdGluZ1NlcXVlbmNlQ2xhc3MoMiksIHs0MjogMjR9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEsIGIsIGMpLCAoMCwgMSwgNDIpKQorCisKKyAgICBAY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfcmVmX2NvdW50aW5nX2JlaGF2aW9yKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscyk6CisgICAgICAgICAgICAgICAgY2xzLmNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fbmV3X18oY2xzKQorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgY2xzID0gc2VsZi5fX2NsYXNzX18KKyAgICAgICAgICAgICAgICBhc3NlcnQgY2xzLmNvdW50ID4gMAorICAgICAgICAgICAgICAgIGNscy5jb3VudCAtPSAxCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmNvdW50LCAxKQorICAgICAgICBkZWwgeAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuY291bnQsIDApCisgICAgICAgIGwgPSBbQygpLCBDKCksIEMoKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmNvdW50LCAzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhLCBiID0gaXRlcihsKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVsIGwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmNvdW50LCAwKQorCisKKyAgICAjIE1ha2Ugc3VyZSBTdG9wSXRlcmF0aW9uIGlzIGEgInNpbmsgc3RhdGUiLgorICAgICMgVGhpcyB0ZXN0cyB2YXJpb3VzIHRoaW5ncyB0aGF0IHdlcmVuJ3Qgc2luayBzdGF0ZXMgaW4gUHl0aG9uIDIuMi4xLAorICAgICMgcGx1cyB2YXJpb3VzIHRoaW5ncyB0aGF0IGFsd2F5cyB3ZXJlIGZpbmUuCisKKyAgICBkZWYgdGVzdF9zaW5rc3RhdGVfbGlzdChzZWxmKToKKyAgICAgICAgIyBUaGlzIHVzZWQgdG8gZmFpbAorICAgICAgICBhID0gcmFuZ2UoNSkKKyAgICAgICAgYiA9IGl0ZXIoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCByYW5nZSg1KSkKKyAgICAgICAgYS5leHRlbmQocmFuZ2UoNSwgMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIFtdKQorCisgICAgZGVmIHRlc3Rfc2lua3N0YXRlX3R1cGxlKHNlbGYpOgorICAgICAgICBhID0gKDAsIDEsIDIsIDMsIDQpCisgICAgICAgIGIgPSBpdGVyKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgcmFuZ2UoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgW10pCisKKyAgICBkZWYgdGVzdF9zaW5rc3RhdGVfc3RyaW5nKHNlbGYpOgorICAgICAgICBhID0gImFiY2RlIgorICAgICAgICBiID0gaXRlcihhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIFsnYScsICdiJywgJ2MnLCAnZCcsICdlJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgW10pCisKKyAgICBkZWYgdGVzdF9zaW5rc3RhdGVfc2VxdWVuY2Uoc2VsZik6CisgICAgICAgICMgVGhpcyB1c2VkIHRvIGZhaWwKKyAgICAgICAgYSA9IFNlcXVlbmNlQ2xhc3MoNSkKKyAgICAgICAgYiA9IGl0ZXIoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCByYW5nZSg1KSkKKyAgICAgICAgYS5uID0gMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCBbXSkKKworICAgIGRlZiB0ZXN0X3NpbmtzdGF0ZV9jYWxsYWJsZShzZWxmKToKKyAgICAgICAgIyBUaGlzIHVzZWQgdG8gZmFpbAorICAgICAgICBkZWYgc3BhbShzdGF0ZT1bMF0pOgorICAgICAgICAgICAgaSA9IHN0YXRlWzBdCisgICAgICAgICAgICBzdGF0ZVswXSA9IGkrMQorICAgICAgICAgICAgaWYgaSA9PSAxMDoKKyAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgInNob3VsZG4ndCBoYXZlIGdvdHRlbiB0aGlzIGZhciIKKyAgICAgICAgICAgIHJldHVybiBpCisgICAgICAgIGIgPSBpdGVyKHNwYW0sIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgcmFuZ2UoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgW10pCisKKyAgICBkZWYgdGVzdF9zaW5rc3RhdGVfZGljdChzZWxmKToKKyAgICAgICAgIyBYWFggRm9yIGEgbW9yZSB0aG9yb3VnaCB0ZXN0LCBzZWUgdG93YXJkcyB0aGUgZW5kIG9mOgorICAgICAgICAjIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1kZXYvMjAwMi1KdWx5LzAyNjUxMi5odG1sCisgICAgICAgIGEgPSB7MToxLCAyOjIsIDA6MCwgNDo0LCAzOjN9CisgICAgICAgIGZvciBiIGluIGl0ZXIoYSksIGEuaXRlcmtleXMoKSwgYS5pdGVyaXRlbXMoKSwgYS5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICBiID0gaXRlcihhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGlzdChiKSksIDUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIFtdKQorCisgICAgZGVmIHRlc3Rfc2lua3N0YXRlX3lpZWxkKHNlbGYpOgorICAgICAgICBkZWYgZ2VuKCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgIGIgPSBnZW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIHJhbmdlKDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIFtdKQorCisgICAgZGVmIHRlc3Rfc2lua3N0YXRlX3JhbmdlKHNlbGYpOgorICAgICAgICBhID0geHJhbmdlKDUpCisgICAgICAgIGIgPSBpdGVyKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgcmFuZ2UoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgW10pCisKKyAgICBkZWYgdGVzdF9zaW5rc3RhdGVfZW51bWVyYXRlKHNlbGYpOgorICAgICAgICBhID0gcmFuZ2UoNSkKKyAgICAgICAgZSA9IGVudW1lcmF0ZShhKQorICAgICAgICBiID0gaXRlcihlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIHppcChyYW5nZSg1KSwgcmFuZ2UoNSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIFtdKQorCisgICAgZGVmIHRlc3RfMzcyMChzZWxmKToKKyAgICAgICAgIyBBdm9pZCBhIGNyYXNoLCB3aGVuIGFuIGl0ZXJhdG9yIGRlbGV0ZXMgaXRzIG5leHQoKSBtZXRob2QuCisgICAgICAgIGNsYXNzIEJhZEl0ZXJhdG9yKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgICAgIGRlbCBCYWRJdGVyYXRvci5uZXh0CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiBCYWRJdGVyYXRvcigpIDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9leHRlbmRpbmdfbGlzdF93aXRoX2l0ZXJhdG9yX2RvZXNfbm90X3NlZ2ZhdWx0KHNlbGYpOgorICAgICAgICAjIFRoZSBjb2RlIHRvIGV4dGVuZCBhIGxpc3Qgd2l0aCBhbiBpdGVyYXRvciBoYXMgYSBmYWlyCisgICAgICAgICMgYW1vdW50IG9mIG5vbnRyaXZpYWwgbG9naWMgaW4gdGVybXMgb2YgZ3Vlc3NpbmcgaG93CisgICAgICAgICMgbXVjaCBtZW1vcnkgdG8gYWxsb2NhdGUgaW4gYWR2YW5jZSwgInN0ZWFsaW5nIiByZWZzLAorICAgICAgICAjIGFuZCB0aGVuIHNocmlua2luZyBhdCB0aGUgZW5kLiAgVGhpcyBpcyBhIGJhc2ljIHNtb2tlCisgICAgICAgICMgdGVzdCBmb3IgdGhhdCBzY2VuYXJpby4KKyAgICAgICAgZGVmIGdlbigpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNTAwKToKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgIGxzdCA9IFswXSAqIDUwMAorICAgICAgICBmb3IgaSBpbiByYW5nZSgyNDApOgorICAgICAgICAgICAgbHN0LnBvcCgwKQorICAgICAgICBsc3QuZXh0ZW5kKGdlbigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsc3QpLCA3NjApCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyN2JiOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZTdlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVybGVuLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcmxlbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGY0M2M3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcmxlbi5weQpAQCAtMCwwICsxLDI1NyBAQAorIiIiIFRlc3QgSXRlcmF0b3IgTGVuZ3RoIFRyYW5zcGFyZW5jeQorCitTb21lIGZ1bmN0aW9ucyBvciBtZXRob2RzIHdoaWNoIGFjY2VwdCBnZW5lcmFsIGl0ZXJhYmxlIGFyZ3VtZW50cyBoYXZlCitvcHRpb25hbCwgbW9yZSBlZmZpY2llbnQgY29kZSBwYXRocyBpZiB0aGV5IGtub3cgaG93IG1hbnkgaXRlbXMgdG8gZXhwZWN0LgorRm9yIGluc3RhbmNlLCBtYXAoZnVuYywgaXRlcmFibGUpLCB3aWxsIHByZS1hbGxvY2F0ZSB0aGUgZXhhY3QgYW1vdW50IG9mCitzcGFjZSByZXF1aXJlZCB3aGVuZXZlciB0aGUgaXRlcmFibGUgY2FuIHJlcG9ydCBpdHMgbGVuZ3RoLgorCitUaGUgZGVzaXJlZCBpbnZhcmlhbnQgaXM6ICBsZW4oaXQpPT1sZW4obGlzdChpdCkpLgorCitBIGNvbXBsaWNhdGlvbiBpcyB0aGF0IGFuIGl0ZXJhYmxlIGFuZCBpdGVyYXRvciBjYW4gYmUgdGhlIHNhbWUgb2JqZWN0LiBUbworbWFpbnRhaW4gdGhlIGludmFyaWFudCwgYW4gaXRlcmF0b3IgbmVlZHMgdG8gZHluYW1pY2FsbHkgdXBkYXRlIGl0cyBsZW5ndGguCitGb3IgaW5zdGFuY2UsIGFuIGl0ZXJhYmxlIHN1Y2ggYXMgeHJhbmdlKDEwKSBhbHdheXMgcmVwb3J0cyBpdHMgbGVuZ3RoIGFzIHRlbiwKK2J1dCBpdD1pdGVyKHhyYW5nZSgxMCkpIHN0YXJ0cyBhdCB0ZW4sIGFuZCB0aGVuIGdvZXMgdG8gbmluZSBhZnRlciBpdC5uZXh0KCkuCitIYXZpbmcgdGhpcyBjYXBhYmlsaXR5IG1lYW5zIHRoYXQgbWFwKCkgY2FuIGlnbm9yZSB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbgorbWFwKGZ1bmMsIGl0ZXJhYmxlKSBhbmQgbWFwKGZ1bmMsIGl0ZXIoaXRlcmFibGUpKS4KKworV2hlbiB0aGUgaXRlcmFibGUgaXMgaW1tdXRhYmxlLCB0aGUgaW1wbGVtZW50YXRpb24gY2FuIHN0cmFpZ2h0LWZvcndhcmRseQorcmVwb3J0IHRoZSBvcmlnaW5hbCBsZW5ndGggbWludXMgdGhlIGN1bXVsYXRpdmUgbnVtYmVyIG9mIGNhbGxzIHRvIG5leHQoKS4KK1RoaXMgaXMgdGhlIGNhc2UgZm9yIHR1cGxlcywgeHJhbmdlIG9iamVjdHMsIGFuZCBpdGVydG9vbHMucmVwZWF0KCkuCisKK1NvbWUgY29udGFpbmVycyBiZWNvbWUgdGVtcG9yYXJpbHkgaW1tdXRhYmxlIGR1cmluZyBpdGVyYXRpb24uICBUaGlzIGluY2x1ZGVzCitkaWN0cywgc2V0cywgYW5kIGNvbGxlY3Rpb25zLmRlcXVlLiAgVGhlaXIgaW1wbGVtZW50YXRpb24gaXMgZXF1YWxseSBzaW1wbGUKK3Rob3VnaCB0aGV5IG5lZWQgdG8gcGVybWFuZW50bHkgc2V0IHRoZWlyIGxlbmd0aCB0byB6ZXJvIHdoZW5ldmVyIHRoZXJlIGlzCithbiBhdHRlbXB0IHRvIGl0ZXJhdGUgYWZ0ZXIgYSBsZW5ndGggbXV0YXRpb24uCisKK1RoZSBzaXR1YXRpb24gc2xpZ2h0bHkgbW9yZSBpbnZvbHZlZCB3aGVuZXZlciBhbiBvYmplY3QgYWxsb3dzIGxlbmd0aCBtdXRhdGlvbgorZHVyaW5nIGl0ZXJhdGlvbi4gIExpc3RzIGFuZCBzZXF1ZW5jZSBpdGVyYXRvcnMgYXJlIGR5bmFtaWNhbGx5IHVwZGF0YWJsZS4KK1NvLCBpZiBhIGxpc3QgaXMgZXh0ZW5kZWQgZHVyaW5nIGl0ZXJhdGlvbiwgdGhlIGl0ZXJhdG9yIHdpbGwgY29udGludWUgdGhyb3VnaAordGhlIG5ldyBpdGVtcy4gIElmIGl0IHNocmlua3MgdG8gYSBwb2ludCBiZWZvcmUgdGhlIG1vc3QgcmVjZW50IGl0ZXJhdGlvbiwKK3RoZW4gbm8gZnVydGhlciBpdGVtcyBhcmUgYXZhaWxhYmxlIGFuZCB0aGUgbGVuZ3RoIGlzIHJlcG9ydGVkIGF0IHplcm8uCisKK1JldmVyc2VkIG9iamVjdHMgY2FuIGFsc28gYmUgd3JhcHBlZCBhcm91bmQgbXV0YWJsZSBvYmplY3RzOyBob3dldmVyLCBhbnkKK2FwcGVuZHMgYWZ0ZXIgdGhlIGN1cnJlbnQgcG9zaXRpb24gYXJlIGlnbm9yZWQuICBBbnkgb3RoZXIgYXBwcm9hY2ggbGVhZHMKK3RvIGNvbmZ1c2lvbiBhbmQgcG9zc2libHkgcmV0dXJuaW5nIHRoZSBzYW1lIGl0ZW0gbW9yZSB0aGFuIG9uY2UuCisKK1RoZSBpdGVyYXRvcnMgbm90IGxpc3RlZCBhYm92ZSwgc3VjaCBhcyBlbnVtZXJhdGUgYW5kIHRoZSBvdGhlciBpdGVydG9vbHMsCithcmUgbm90IGxlbmd0aCB0cmFuc3BhcmVudCBiZWNhdXNlIHRoZXkgaGF2ZSBubyB3YXkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgoraXRlcmFibGVzIHRoYXQgcmVwb3J0IHN0YXRpYyBsZW5ndGggYW5kIGl0ZXJhdG9ycyB3aG9zZSBsZW5ndGggY2hhbmdlcyB3aXRoCitlYWNoIGNhbGwgKGkuZS4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBlbnVtZXJhdGUoJ2FiYycpIGFuZAorZW51bWVyYXRlKGl0ZXIoJ2FiYycpKS4KKworIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCByZXBlYXQKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitmcm9tIF9fYnVpbHRpbl9fIGltcG9ydCBsZW4gYXMgX2xlbgorCituID0gMTAKKworZGVmIGxlbihvYmopOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIF9sZW4ob2JqKQorICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgbm90ZTogdGhpcyBpcyBhbiBpbnRlcm5hbCB1bmRvY3VtZW50ZWQgQVBJLAorICAgICAgICAgICAgIyBkb24ndCByZWx5IG9uIGl0IGluIHlvdXIgb3duIHByb2dyYW1zCisgICAgICAgICAgICByZXR1cm4gb2JqLl9fbGVuZ3RoX2hpbnRfXygpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgorCitjbGFzcyBUZXN0SW52YXJpYW50V2l0aG91dE11dGF0aW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9pbnZhcmlhbnQoc2VsZik6CisgICAgICAgIGl0ID0gc2VsZi5pdAorICAgICAgICBmb3IgaSBpbiByZXZlcnNlZCh4cmFuZ2UoMSwgbisxKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdCksIGkpCisgICAgICAgICAgICBpdC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXQpLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBpdC5uZXh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdCksIDApCisKK2NsYXNzIFRlc3RUZW1wb3JhcmlseUltbXV0YWJsZShUZXN0SW52YXJpYW50V2l0aG91dE11dGF0aW9ucyk6CisKKyAgICBkZWYgdGVzdF9pbW11dGFibGVfZHVyaW5nX2l0ZXJhdGlvbihzZWxmKToKKyAgICAgICAgIyBvYmplY3RzIHN1Y2ggYXMgZGVxdWVzLCBzZXRzLCBhbmQgZGljdGlvbmFyaWVzIGVuZm9yY2UKKyAgICAgICAgIyBsZW5ndGggaW1tdXRhYmlsaXR5ICBkdXJpbmcgaXRlcmF0aW9uCisKKyAgICAgICAgaXQgPSBzZWxmLml0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0KSwgbikKKyAgICAgICAgaXQubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0KSwgbi0xKQorICAgICAgICBzZWxmLm11dGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgaXQubmV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXQpLCAwKQorCisjIyAtLS0tLS0tIENvbmNyZXRlIFR5cGUgVGVzdHMgLS0tLS0tLQorCitjbGFzcyBUZXN0UmVwZWF0KFRlc3RJbnZhcmlhbnRXaXRob3V0TXV0YXRpb25zKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5pdCA9IHJlcGVhdChOb25lLCBuKQorCisgICAgZGVmIHRlc3Rfbm9fbGVuX2Zvcl9pbmZpbml0ZV9yZXBlYXQoc2VsZik6CisgICAgICAgICMgVGhlIHJlcGVhdCgpIG9iamVjdCBjYW4gYWxzbyBiZSBpbmZpbml0ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxlbiwgcmVwZWF0KE5vbmUpKQorCitjbGFzcyBUZXN0WHJhbmdlKFRlc3RJbnZhcmlhbnRXaXRob3V0TXV0YXRpb25zKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5pdCA9IGl0ZXIoeHJhbmdlKG4pKQorCitjbGFzcyBUZXN0WHJhbmdlQ3VzdG9tUmV2ZXJzZWQoVGVzdEludmFyaWFudFdpdGhvdXRNdXRhdGlvbnMpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLml0ID0gcmV2ZXJzZWQoeHJhbmdlKG4pKQorCitjbGFzcyBUZXN0VHVwbGUoVGVzdEludmFyaWFudFdpdGhvdXRNdXRhdGlvbnMpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLml0ID0gaXRlcih0dXBsZSh4cmFuZ2UobikpKQorCisjIyAtLS0tLS0tIFR5cGVzIHRoYXQgc2hvdWxkIG5vdCBiZSBtdXRhdGVkIGR1cmluZyBpdGVyYXRpb24gLS0tLS0tLQorCitjbGFzcyBUZXN0RGVxdWUoVGVzdFRlbXBvcmFyaWx5SW1tdXRhYmxlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKHhyYW5nZShuKSkKKyAgICAgICAgc2VsZi5pdCA9IGl0ZXIoZCkKKyAgICAgICAgc2VsZi5tdXRhdGUgPSBkLnBvcAorCitjbGFzcyBUZXN0RGVxdWVSZXZlcnNlZChUZXN0VGVtcG9yYXJpbHlJbW11dGFibGUpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoeHJhbmdlKG4pKQorICAgICAgICBzZWxmLml0ID0gcmV2ZXJzZWQoZCkKKyAgICAgICAgc2VsZi5tdXRhdGUgPSBkLnBvcAorCitjbGFzcyBUZXN0RGljdEtleXMoVGVzdFRlbXBvcmFyaWx5SW1tdXRhYmxlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZCA9IGRpY3QuZnJvbWtleXMoeHJhbmdlKG4pKQorICAgICAgICBzZWxmLml0ID0gaXRlcihkKQorICAgICAgICBzZWxmLm11dGF0ZSA9IGQucG9waXRlbQorCitjbGFzcyBUZXN0RGljdEl0ZW1zKFRlc3RUZW1wb3JhcmlseUltbXV0YWJsZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGQgPSBkaWN0LmZyb21rZXlzKHhyYW5nZShuKSkKKyAgICAgICAgc2VsZi5pdCA9IGQuaXRlcml0ZW1zKCkKKyAgICAgICAgc2VsZi5tdXRhdGUgPSBkLnBvcGl0ZW0KKworY2xhc3MgVGVzdERpY3RWYWx1ZXMoVGVzdFRlbXBvcmFyaWx5SW1tdXRhYmxlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZCA9IGRpY3QuZnJvbWtleXMoeHJhbmdlKG4pKQorICAgICAgICBzZWxmLml0ID0gZC5pdGVydmFsdWVzKCkKKyAgICAgICAgc2VsZi5tdXRhdGUgPSBkLnBvcGl0ZW0KKworY2xhc3MgVGVzdFNldChUZXN0VGVtcG9yYXJpbHlJbW11dGFibGUpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBkID0gc2V0KHhyYW5nZShuKSkKKyAgICAgICAgc2VsZi5pdCA9IGl0ZXIoZCkKKyAgICAgICAgc2VsZi5tdXRhdGUgPSBkLnBvcAorCisjIyAtLS0tLS0tIFR5cGVzIHRoYXQgY2FuIG11dGF0ZSBkdXJpbmcgaXRlcmF0aW9uIC0tLS0tLS0KKworY2xhc3MgVGVzdExpc3QoVGVzdEludmFyaWFudFdpdGhvdXRNdXRhdGlvbnMpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLml0ID0gaXRlcihyYW5nZShuKSkKKworICAgIGRlZiB0ZXN0X211dGF0aW9uKHNlbGYpOgorICAgICAgICBkID0gcmFuZ2UobikKKyAgICAgICAgaXQgPSBpdGVyKGQpCisgICAgICAgIGl0Lm5leHQoKQorICAgICAgICBpdC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXQpLCBuLTIpCisgICAgICAgIGQuYXBwZW5kKG4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0KSwgbi0xKSAgIyBncm93IHdpdGggYXBwZW5kCisgICAgICAgIGRbMTpdID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXQpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXQpLCBbXSkKKyAgICAgICAgZC5leHRlbmQoeHJhbmdlKDIwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXQpLCAwKQorCitjbGFzcyBUZXN0TGlzdFJldmVyc2VkKFRlc3RJbnZhcmlhbnRXaXRob3V0TXV0YXRpb25zKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5pdCA9IHJldmVyc2VkKHJhbmdlKG4pKQorCisgICAgZGVmIHRlc3RfbXV0YXRpb24oc2VsZik6CisgICAgICAgIGQgPSByYW5nZShuKQorICAgICAgICBpdCA9IHJldmVyc2VkKGQpCisgICAgICAgIGl0Lm5leHQoKQorICAgICAgICBpdC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXQpLCBuLTIpCisgICAgICAgIGQuYXBwZW5kKG4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0KSwgbi0yKSAgIyBpZ25vcmUgYXBwZW5kCisgICAgICAgIGRbMTpdID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXQpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXQpLCBbXSkgICMgY29uZmlybSBpbnZhcmlhbnQKKyAgICAgICAgZC5leHRlbmQoeHJhbmdlKDIwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXQpLCAwKQorCisjIyAtLSBDaGVjayB0byBtYWtlIHN1cmUgZXhjZXB0aW9ucyBhcmUgbm90IHN1cHByZXNzZWQgYnkgX19sZW5ndGhfaGludF9fKCkKKworCitjbGFzcyBCYWRMZW4ob2JqZWN0KToKKyAgICBkZWYgX19pdGVyX18oc2VsZik6IHJldHVybiBpdGVyKHJhbmdlKDEwKSkKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdoZWxsbycpCisKK2NsYXNzIEJhZExlbmd0aEhpbnQob2JqZWN0KToKKyAgICBkZWYgX19pdGVyX18oc2VsZik6IHJldHVybiBpdGVyKHJhbmdlKDEwKSkKKyAgICBkZWYgX19sZW5ndGhfaGludF9fKHNlbGYpOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ2hlbGxvJykKKworY2xhc3MgTm9uZUxlbmd0aEhpbnQob2JqZWN0KToKKyAgICBkZWYgX19pdGVyX18oc2VsZik6IHJldHVybiBpdGVyKHJhbmdlKDEwKSkKKyAgICBkZWYgX19sZW5ndGhfaGludF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCitjbGFzcyBUZXN0TGVuZ3RoSGludEV4Y2VwdGlvbnModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfaXNzdWUxMjQyNjU3KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGxpc3QsIEJhZExlbigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGxpc3QsIEJhZExlbmd0aEhpbnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBbXS5leHRlbmQsIEJhZExlbigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIFtdLmV4dGVuZCwgQmFkTGVuZ3RoSGludCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcCwgQmFkTGVuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwLCBCYWRMZW5ndGhIaW50KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgZmlsdGVyLCBOb25lLCBCYWRMZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBmaWx0ZXIsIE5vbmUsIEJhZExlbmd0aEhpbnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBtYXAsIGNociwgQmFkTGVuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgbWFwLCBjaHIsIEJhZExlbmd0aEhpbnQoKSkKKyAgICAgICAgYiA9IGJ5dGVhcnJheShyYW5nZSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgYi5leHRlbmQsIEJhZExlbigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGIuZXh0ZW5kLCBCYWRMZW5ndGhIaW50KCkpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2hpbnQoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGFuIGludmFsaWQgcmVzdWx0IGRvZXNuJ3QgbXVjay11cCB0aGUgd29ya3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KE5vbmVMZW5ndGhIaW50KCkpLCBsaXN0KHJhbmdlKDEwKSkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHVuaXR0ZXN0cyA9IFsKKyAgICAgICAgVGVzdFJlcGVhdCwKKyAgICAgICAgVGVzdFhyYW5nZSwKKyAgICAgICAgVGVzdFhyYW5nZUN1c3RvbVJldmVyc2VkLAorICAgICAgICBUZXN0VHVwbGUsCisgICAgICAgIFRlc3REZXF1ZSwKKyAgICAgICAgVGVzdERlcXVlUmV2ZXJzZWQsCisgICAgICAgIFRlc3REaWN0S2V5cywKKyAgICAgICAgVGVzdERpY3RJdGVtcywKKyAgICAgICAgVGVzdERpY3RWYWx1ZXMsCisgICAgICAgIFRlc3RTZXQsCisgICAgICAgIFRlc3RMaXN0LAorICAgICAgICBUZXN0TGlzdFJldmVyc2VkLAorICAgICAgICBUZXN0TGVuZ3RoSGludEV4Y2VwdGlvbnMsCisgICAgXQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnVuaXR0ZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcmxlbi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVybGVuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2VlZmFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcmxlbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcmxlbi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVybGVuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2VlZmFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcmxlbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOWY0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVydG9vbHMucHkKQEAgLTAsMCArMSwxNjY1IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIGl0ZXJ0b29scyBpbXBvcnQgKgorZnJvbSB3ZWFrcmVmIGltcG9ydCBwcm94eQorZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCitmcm9tIGZyYWN0aW9ucyBpbXBvcnQgRnJhY3Rpb24KK2ltcG9ydCBzeXMKK2ltcG9ydCBvcGVyYXRvcgoraW1wb3J0IHJhbmRvbQoraW1wb3J0IGNvcHkKK2ltcG9ydCBwaWNrbGUKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2UKK21heHNpemUgPSB0ZXN0X3N1cHBvcnQuTUFYX1B5X3NzaXplX3QKK21pbnNpemUgPSAtbWF4c2l6ZS0xCisKK2RlZiBvbmVhcmcoeCk6CisgICAgJ1Rlc3QgZnVuY3Rpb24gb2Ygb25lIGFyZ3VtZW50JworICAgIHJldHVybiAyKngKKworZGVmIGVycmZ1bmMoKmFyZ3MpOgorICAgICdUZXN0IGZ1bmN0aW9uIHRoYXQgcmFpc2VzIGFuIGVycm9yJworICAgIHJhaXNlIFZhbHVlRXJyb3IKKworZGVmIGdlbjMoKToKKyAgICAnTm9uLXJlc3RhcnRhYmxlIHNvdXJjZSBzZXF1ZW5jZScKKyAgICBmb3IgaSBpbiAoMCwgMSwgMik6CisgICAgICAgIHlpZWxkIGkKKworZGVmIGlzRXZlbih4KToKKyAgICAnVGVzdCBwcmVkaWNhdGUnCisgICAgcmV0dXJuIHglMj09MAorCitkZWYgaXNPZGQoeCk6CisgICAgJ1Rlc3QgcHJlZGljYXRlJworICAgIHJldHVybiB4JTI9PTEKKworY2xhc3MgU3RvcE5vdzoKKyAgICAnQ2xhc3MgZW11bGF0aW5nIGFuIGVtcHR5IGl0ZXJhYmxlLicKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworZGVmIHRha2Uobiwgc2VxKToKKyAgICAnQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHBhcnRpYWxseSBjb25zdW1pbmcgYSBsb25nIG9mIGluZmluaXRlIGl0ZXJhYmxlJworICAgIHJldHVybiBsaXN0KGlzbGljZShzZXEsIG4pKQorCitkZWYgcHJvZChpdGVyYWJsZSk6CisgICAgcmV0dXJuIHJlZHVjZShvcGVyYXRvci5tdWwsIGl0ZXJhYmxlLCAxKQorCitkZWYgZmFjdChuKToKKyAgICAnRmFjdG9yaWFsJworICAgIHJldHVybiBwcm9kKHJhbmdlKDEsIG4rMSkpCisKK2NsYXNzIFRlc3RCYXNpY09wcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY2hhaW4oc2VsZik6CisKKyAgICAgICAgZGVmIGNoYWluMigqaXRlcmFibGVzKToKKyAgICAgICAgICAgICdQdXJlIHB5dGhvbiB2ZXJzaW9uIGluIHRoZSBkb2NzJworICAgICAgICAgICAgZm9yIGl0IGluIGl0ZXJhYmxlczoKKyAgICAgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiBpdDoKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAorCisgICAgICAgIGZvciBjIGluIChjaGFpbiwgY2hhaW4yKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjKCdhYmMnLCAnZGVmJykpLCBsaXN0KCdhYmNkZWYnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjKCdhYmMnKSksIGxpc3QoJ2FiYycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGMoJycpKSwgW10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoNCwgYygnYWJjJywgJ2RlZicpKSwgbGlzdCgnYWJjZCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LGMoMiwgMykpCisKKyAgICBkZWYgdGVzdF9jaGFpbl9mcm9tX2l0ZXJhYmxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY2hhaW4uZnJvbV9pdGVyYWJsZShbJ2FiYycsICdkZWYnXSkpLCBsaXN0KCdhYmNkZWYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNoYWluLmZyb21faXRlcmFibGUoWydhYmMnXSkpLCBsaXN0KCdhYmMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNoYWluLmZyb21faXRlcmFibGUoWycnXSkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDQsIGNoYWluLmZyb21faXRlcmFibGUoWydhYmMnLCAnZGVmJ10pKSwgbGlzdCgnYWJjZCcpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIGNoYWluLmZyb21faXRlcmFibGUoWzIsIDNdKSkKKworICAgIGRlZiB0ZXN0X2NvbWJpbmF0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21iaW5hdGlvbnMsICdhYmMnKSAgICAgICAjIG1pc3NpbmcgciBhcmd1bWVudAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmF0aW9ucywgJ2FiYycsIDIsIDEpICMgdG9vIG1hbnkgYXJndW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tYmluYXRpb25zLCBOb25lKSAgICAgICAgIyBwb29sIGlzIG5vdCBpdGVyYWJsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21iaW5hdGlvbnMsICdhYmMnLCAtMikgICMgciBpcyBuZWdhdGl2ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY29tYmluYXRpb25zKCdhYmMnLCAzMikpLCBbXSkgICAgICMgciA+IG4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbWJpbmF0aW9ucyhyYW5nZSg0KSwgMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoMCwxLDIpLCAoMCwxLDMpLCAoMCwyLDMpLCAoMSwyLDMpXSkKKworICAgICAgICBkZWYgY29tYmluYXRpb25zMShpdGVyYWJsZSwgcik6CisgICAgICAgICAgICAnUHVyZSBweXRob24gdmVyc2lvbiBzaG93biBpbiB0aGUgZG9jcycKKyAgICAgICAgICAgIHBvb2wgPSB0dXBsZShpdGVyYWJsZSkKKyAgICAgICAgICAgIG4gPSBsZW4ocG9vbCkKKyAgICAgICAgICAgIGlmIHIgPiBuOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaW5kaWNlcyA9IHJhbmdlKHIpCisgICAgICAgICAgICB5aWVsZCB0dXBsZShwb29sW2ldIGZvciBpIGluIGluZGljZXMpCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKHIpKToKKyAgICAgICAgICAgICAgICAgICAgaWYgaW5kaWNlc1tpXSAhPSBpICsgbiAtIHI6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGluZGljZXNbaV0gKz0gMQorICAgICAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGkrMSwgcik6CisgICAgICAgICAgICAgICAgICAgIGluZGljZXNbal0gPSBpbmRpY2VzW2otMV0gKyAxCisgICAgICAgICAgICAgICAgeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzKQorCisgICAgICAgIGRlZiBjb21iaW5hdGlvbnMyKGl0ZXJhYmxlLCByKToKKyAgICAgICAgICAgICdQdXJlIHB5dGhvbiB2ZXJzaW9uIHNob3duIGluIHRoZSBkb2NzJworICAgICAgICAgICAgcG9vbCA9IHR1cGxlKGl0ZXJhYmxlKQorICAgICAgICAgICAgbiA9IGxlbihwb29sKQorICAgICAgICAgICAgZm9yIGluZGljZXMgaW4gcGVybXV0YXRpb25zKHJhbmdlKG4pLCByKToKKyAgICAgICAgICAgICAgICBpZiBzb3J0ZWQoaW5kaWNlcykgPT0gbGlzdChpbmRpY2VzKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzKQorCisgICAgICAgIGRlZiBjb21iaW5hdGlvbnMzKGl0ZXJhYmxlLCByKToKKyAgICAgICAgICAgICdQdXJlIHB5dGhvbiB2ZXJzaW9uIGZyb20gY3dyKCknCisgICAgICAgICAgICBwb29sID0gdHVwbGUoaXRlcmFibGUpCisgICAgICAgICAgICBuID0gbGVuKHBvb2wpCisgICAgICAgICAgICBmb3IgaW5kaWNlcyBpbiBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudChyYW5nZShuKSwgcik6CisgICAgICAgICAgICAgICAgaWYgbGVuKHNldChpbmRpY2VzKSkgPT0gcjoKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzKQorCisgICAgICAgIGZvciBuIGluIHJhbmdlKDcpOgorICAgICAgICAgICAgdmFsdWVzID0gWzUqeC0xMiBmb3IgeCBpbiByYW5nZShuKV0KKyAgICAgICAgICAgIGZvciByIGluIHJhbmdlKG4rMik6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdChjb21iaW5hdGlvbnModmFsdWVzLCByKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQpLCAwIGlmIHI+biBlbHNlIGZhY3QobikgLy8gZmFjdChyKSAvLyBmYWN0KG4tcikpICMgcmlnaHQgbnVtYmVyIG9mIGNvbWJzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgbGVuKHNldChyZXN1bHQpKSkgICAgICAgICAjIG5vIHJlcGVhdHMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc29ydGVkKHJlc3VsdCkpICAgICAgICAgICAgICAgICMgbGV4aWNvZ3JhcGhpYyBvcmRlcgorICAgICAgICAgICAgICAgIGZvciBjIGluIHJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIHIpICAgICAgICAgICAgICAgICAgICAgICAgICMgci1sZW5ndGggY29tYmluYXRpb25zCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldChjKSksIHIpICAgICAgICAgICAgICAgICAgICAjIG5vIGR1cGxpY2F0ZSBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYyksIHNvcnRlZChjKSkgICAgICAgICAgICAgICAgIyBrZWVwIG9yaWdpbmFsIG9yZGVyaW5nCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGwoZSBpbiB2YWx1ZXMgZm9yIGUgaW4gYykpICAgICAgICAgICAjIGVsZW1lbnRzIHRha2VuIGZyb20gaW5wdXQgaXRlcmFibGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlIGZvciBlIGluIHZhbHVlcyBpZiBlIGluIGNdKSAgICAgICMgY29tYiBpcyBhIHN1YnNlcXVlbmNlIG9mIHRoZSBpbnB1dCBpdGVyYWJsZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBsaXN0KGNvbWJpbmF0aW9uczEodmFsdWVzLCByKSkpICMgbWF0Y2hlcyBmaXJzdCBwdXJlIHB5dGhvbiB2ZXJzaW9uCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGxpc3QoY29tYmluYXRpb25zMih2YWx1ZXMsIHIpKSkgIyBtYXRjaGVzIHNlY29uZCBwdXJlIHB5dGhvbiB2ZXJzaW9uCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGxpc3QoY29tYmluYXRpb25zMyh2YWx1ZXMsIHIpKSkgIyBtYXRjaGVzIHNlY29uZCBwdXJlIHB5dGhvbiB2ZXJzaW9uCisKKyAgICBAdGVzdF9zdXBwb3J0LmltcGxfZGV0YWlsKCJ0dXBsZSByZXVzZSBpcyBzcGVjaWZpYyB0byBDUHl0aG9uIikKKyAgICBkZWYgdGVzdF9jb21iaW5hdGlvbnNfdHVwbGVfcmV1c2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldChtYXAoaWQsIGNvbWJpbmF0aW9ucygnYWJjZGUnLCAzKSkpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChsZW4oc2V0KG1hcChpZCwgbGlzdChjb21iaW5hdGlvbnMoJ2FiY2RlJywgMykpKSkpLCAxKQorCisgICAgZGVmIHRlc3RfY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoc2VsZik6CisgICAgICAgIGN3ciA9IGNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3dyLCAnYWJjJykgICAgICAgIyBtaXNzaW5nIHIgYXJndW1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjd3IsICdhYmMnLCAyLCAxKSAjIHRvbyBtYW55IGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN3ciwgTm9uZSkgICAgICAgICMgcG9vbCBpcyBub3QgaXRlcmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY3dyLCAnYWJjJywgLTIpICAjIHIgaXMgbmVnYXRpdmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGN3cignQUJDJywgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ0EnLCdBJyksICgnQScsJ0InKSwgKCdBJywnQycpLCAoJ0InLCdCJyksICgnQicsJ0MnKSwgKCdDJywnQycpXSkKKworICAgICAgICBkZWYgY3dyMShpdGVyYWJsZSwgcik6CisgICAgICAgICAgICAnUHVyZSBweXRob24gdmVyc2lvbiBzaG93biBpbiB0aGUgZG9jcycKKyAgICAgICAgICAgICMgbnVtYmVyIGl0ZW1zIHJldHVybmVkOiAgKG4rci0xKSEgLyByISAvIChuLTEpISB3aGVuIG4+MAorICAgICAgICAgICAgcG9vbCA9IHR1cGxlKGl0ZXJhYmxlKQorICAgICAgICAgICAgbiA9IGxlbihwb29sKQorICAgICAgICAgICAgaWYgbm90IG4gYW5kIHI6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpbmRpY2VzID0gWzBdICogcgorICAgICAgICAgICAgeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShyKSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGluZGljZXNbaV0gIT0gbiAtIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGluZGljZXNbaTpdID0gW2luZGljZXNbaV0gKyAxXSAqIChyIC0gaSkKKyAgICAgICAgICAgICAgICB5aWVsZCB0dXBsZShwb29sW2ldIGZvciBpIGluIGluZGljZXMpCisKKyAgICAgICAgZGVmIGN3cjIoaXRlcmFibGUsIHIpOgorICAgICAgICAgICAgJ1B1cmUgcHl0aG9uIHZlcnNpb24gc2hvd24gaW4gdGhlIGRvY3MnCisgICAgICAgICAgICBwb29sID0gdHVwbGUoaXRlcmFibGUpCisgICAgICAgICAgICBuID0gbGVuKHBvb2wpCisgICAgICAgICAgICBmb3IgaW5kaWNlcyBpbiBwcm9kdWN0KHJhbmdlKG4pLCByZXBlYXQ9cik6CisgICAgICAgICAgICAgICAgaWYgc29ydGVkKGluZGljZXMpID09IGxpc3QoaW5kaWNlcyk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlcykKKworICAgICAgICBkZWYgbnVtY29tYnMobiwgcik6CisgICAgICAgICAgICBpZiBub3QgbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gMCBpZiByIGVsc2UgMQorICAgICAgICAgICAgcmV0dXJuIGZhY3QobityLTEpIC8vIGZhY3QocikgLy8gZmFjdChuLTEpCisKKyAgICAgICAgZm9yIG4gaW4gcmFuZ2UoNyk6CisgICAgICAgICAgICB2YWx1ZXMgPSBbNSp4LTEyIGZvciB4IGluIHJhbmdlKG4pXQorICAgICAgICAgICAgZm9yIHIgaW4gcmFuZ2UobisyKToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBsaXN0KGN3cih2YWx1ZXMsIHIpKQorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgbnVtY29tYnMobiwgcikpICAgICAgICAgICAjIHJpZ2h0IG51bWJlciBvZiBjb21icworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdCksIGxlbihzZXQocmVzdWx0KSkpICAgICAgICAgIyBubyByZXBlYXRzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNvcnRlZChyZXN1bHQpKSAgICAgICAgICAgICAgICAjIGxleGljb2dyYXBoaWMgb3JkZXIKKworICAgICAgICAgICAgICAgIHJlZ3VsYXJfY29tYnMgPSBsaXN0KGNvbWJpbmF0aW9ucyh2YWx1ZXMsIHIpKSAgICAgICAgICAgIyBjb21wYXJlIHRvIGNvbWJzIHdpdGhvdXQgcmVwbGFjZW1lbnQKKyAgICAgICAgICAgICAgICBpZiBuID09IDAgb3IgciA8PSAxOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgcmVndWxhcl9jb21icykgICAgICAgICAgICAjIGNhc2VzIHRoYXQgc2hvdWxkIGJlIGlkZW50aWNhbAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQocmVzdWx0KSA+PSBzZXQocmVndWxhcl9jb21icykpICAgICAjIHJlc3Qgc2hvdWxkIGJlIHN1cGVyc2V0cyBvZiByZWd1bGFyIGNvbWJzCisKKyAgICAgICAgICAgICAgICBmb3IgYyBpbiByZXN1bHQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCByKSAgICAgICAgICAgICAgICAgICAgICAgICAjIHItbGVuZ3RoIGNvbWJpbmF0aW9ucworICAgICAgICAgICAgICAgICAgICBub3J1bnMgPSBbayBmb3Igayx2IGluIGdyb3VwYnkoYyldICAgICAgICAgICAgICAgICAgIyBjb21ibyB3aXRob3V0IGNvbnNlY3V0aXZlIHJlcGVhdHMKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obm9ydW5zKSwgbGVuKHNldChub3J1bnMpKSkgICAgICMgbm8gcmVwZWF0cyBvdGhlciB0aGFuIGNvbnNlY3V0aXZlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjKSwgc29ydGVkKGMpKSAgICAgICAgICAgICAgICAjIGtlZXAgb3JpZ2luYWwgb3JkZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChlIGluIHZhbHVlcyBmb3IgZSBpbiBjKSkgICAgICAgICAgICMgZWxlbWVudHMgdGFrZW4gZnJvbSBpbnB1dCBpdGVyYWJsZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vcnVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZSBmb3IgZSBpbiB2YWx1ZXMgaWYgZSBpbiBjXSkgICAgICMgY29tYiBpcyBhIHN1YnNlcXVlbmNlIG9mIHRoZSBpbnB1dCBpdGVyYWJsZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBsaXN0KGN3cjEodmFsdWVzLCByKSkpICAgICAgICAgIyBtYXRjaGVzIGZpcnN0IHB1cmUgcHl0aG9uIHZlcnNpb24KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgbGlzdChjd3IyKHZhbHVlcywgcikpKSAgICAgICAgICMgbWF0Y2hlcyBzZWNvbmQgcHVyZSBweXRob24gdmVyc2lvbgorCisgICAgQHRlc3Rfc3VwcG9ydC5pbXBsX2RldGFpbCgidHVwbGUgcmV1c2UgaXMgc3BlY2lmaWMgdG8gQ1B5dGhvbiIpCisgICAgZGVmIHRlc3RfY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnRfdHVwbGVfcmV1c2Uoc2VsZik6CisgICAgICAgIGN3ciA9IGNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldChtYXAoaWQsIGN3cignYWJjZGUnLCAzKSkpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChsZW4oc2V0KG1hcChpZCwgbGlzdChjd3IoJ2FiY2RlJywgMykpKSkpLCAxKQorCisgICAgZGVmIHRlc3RfcGVybXV0YXRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBlcm11dGF0aW9ucykgICAgICAgICAgICAgICMgdG9vIGZldyBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwZXJtdXRhdGlvbnMsICdhYmMnLCAyLCAxKSAjIHRvbyBtYW55IGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBlcm11dGF0aW9ucywgTm9uZSkgICAgICAgICMgcG9vbCBpcyBub3QgaXRlcmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcGVybXV0YXRpb25zLCAnYWJjJywgLTIpICAjIHIgaXMgbmVnYXRpdmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHBlcm11dGF0aW9ucygnYWJjJywgMzIpKSwgW10pICAgICAjIHIgPiBuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcGVybXV0YXRpb25zLCAnYWJjJywgJ3MnKSAgIyByIGlzIG5vdCBhbiBpbnQgb3IgTm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocGVybXV0YXRpb25zKHJhbmdlKDMpLCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygwLDEpLCAoMCwyKSwgKDEsMCksICgxLDIpLCAoMiwwKSwgKDIsMSldKQorCisgICAgICAgIGRlZiBwZXJtdXRhdGlvbnMxKGl0ZXJhYmxlLCByPU5vbmUpOgorICAgICAgICAgICAgJ1B1cmUgcHl0aG9uIHZlcnNpb24gc2hvd24gaW4gdGhlIGRvY3MnCisgICAgICAgICAgICBwb29sID0gdHVwbGUoaXRlcmFibGUpCisgICAgICAgICAgICBuID0gbGVuKHBvb2wpCisgICAgICAgICAgICByID0gbiBpZiByIGlzIE5vbmUgZWxzZSByCisgICAgICAgICAgICBpZiByID4gbjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGluZGljZXMgPSByYW5nZShuKQorICAgICAgICAgICAgY3ljbGVzID0gcmFuZ2Uobiwgbi1yLCAtMSkKKyAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlc1s6cl0pCisgICAgICAgICAgICB3aGlsZSBuOgorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKHIpKToKKyAgICAgICAgICAgICAgICAgICAgY3ljbGVzW2ldIC09IDEKKyAgICAgICAgICAgICAgICAgICAgaWYgY3ljbGVzW2ldID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2k6XSA9IGluZGljZXNbaSsxOl0gKyBpbmRpY2VzW2k6aSsxXQorICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGVzW2ldID0gbiAtIGkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSBjeWNsZXNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbaV0sIGluZGljZXNbLWpdID0gaW5kaWNlc1stal0sIGluZGljZXNbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlc1s6cl0pCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGRlZiBwZXJtdXRhdGlvbnMyKGl0ZXJhYmxlLCByPU5vbmUpOgorICAgICAgICAgICAgJ1B1cmUgcHl0aG9uIHZlcnNpb24gc2hvd24gaW4gdGhlIGRvY3MnCisgICAgICAgICAgICBwb29sID0gdHVwbGUoaXRlcmFibGUpCisgICAgICAgICAgICBuID0gbGVuKHBvb2wpCisgICAgICAgICAgICByID0gbiBpZiByIGlzIE5vbmUgZWxzZSByCisgICAgICAgICAgICBmb3IgaW5kaWNlcyBpbiBwcm9kdWN0KHJhbmdlKG4pLCByZXBlYXQ9cik6CisgICAgICAgICAgICAgICAgaWYgbGVuKHNldChpbmRpY2VzKSkgPT0gcjoKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzKQorCisgICAgICAgIGZvciBuIGluIHJhbmdlKDcpOgorICAgICAgICAgICAgdmFsdWVzID0gWzUqeC0xMiBmb3IgeCBpbiByYW5nZShuKV0KKyAgICAgICAgICAgIGZvciByIGluIHJhbmdlKG4rMik6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdChwZXJtdXRhdGlvbnModmFsdWVzLCByKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQpLCAwIGlmIHI+biBlbHNlIGZhY3QobikgLy8gZmFjdChuLXIpKSAgICAgICMgcmlnaHQgbnVtYmVyIG9mIHBlcm1zCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgbGVuKHNldChyZXN1bHQpKSkgICAgICAgICAjIG5vIHJlcGVhdHMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc29ydGVkKHJlc3VsdCkpICAgICAgICAgICAgICAgICMgbGV4aWNvZ3JhcGhpYyBvcmRlcgorICAgICAgICAgICAgICAgIGZvciBwIGluIHJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocCksIHIpICAgICAgICAgICAgICAgICAgICAgICAgICMgci1sZW5ndGggcGVybXV0YXRpb25zCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldChwKSksIHIpICAgICAgICAgICAgICAgICAgICAjIG5vIGR1cGxpY2F0ZSBlbGVtZW50cworICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWxsKGUgaW4gdmFsdWVzIGZvciBlIGluIHApKSAgICAgICAgICAgIyBlbGVtZW50cyB0YWtlbiBmcm9tIGlucHV0IGl0ZXJhYmxlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGxpc3QocGVybXV0YXRpb25zMSh2YWx1ZXMsIHIpKSkgIyBtYXRjaGVzIGZpcnN0IHB1cmUgcHl0aG9uIHZlcnNpb24KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgbGlzdChwZXJtdXRhdGlvbnMyKHZhbHVlcywgcikpKSAjIG1hdGNoZXMgc2Vjb25kIHB1cmUgcHl0aG9uIHZlcnNpb24KKyAgICAgICAgICAgICAgICBpZiByID09IG46CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBsaXN0KHBlcm11dGF0aW9ucyh2YWx1ZXMsIE5vbmUpKSkgIyB0ZXN0IHIgYXMgTm9uZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgbGlzdChwZXJtdXRhdGlvbnModmFsdWVzKSkpICAgICAgICMgdGVzdCBkZWZhdWx0IHIKKworICAgIEB0ZXN0X3N1cHBvcnQuaW1wbF9kZXRhaWwoInR1cGxlIHJlc3VzZSBpcyBDUHl0aG9uIHNwZWNpZmljIikKKyAgICBkZWYgdGVzdF9wZXJtdXRhdGlvbnNfdHVwbGVfcmV1c2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldChtYXAoaWQsIHBlcm11dGF0aW9ucygnYWJjZGUnLCAzKSkpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChsZW4oc2V0KG1hcChpZCwgbGlzdChwZXJtdXRhdGlvbnMoJ2FiY2RlJywgMykpKSkpLCAxKQorCisgICAgZGVmIHRlc3RfY29tYmluYXRvcmljcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHJlbGF0aW9uc2hpcHMgYmV0d2VlbiBwcm9kdWN0KCksIHBlcm11dGF0aW9ucygpLAorICAgICAgICAjIGNvbWJpbmF0aW9ucygpIGFuZCBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudCgpLgorCisgICAgICAgIGZvciBuIGluIHJhbmdlKDYpOgorICAgICAgICAgICAgcyA9ICdBQkNERUZHJ1s6bl0KKyAgICAgICAgICAgIGZvciByIGluIHJhbmdlKDgpOgorICAgICAgICAgICAgICAgIHByb2QgPSBsaXN0KHByb2R1Y3QocywgcmVwZWF0PXIpKQorICAgICAgICAgICAgICAgIGN3ciA9IGxpc3QoY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQocywgcikpCisgICAgICAgICAgICAgICAgcGVybSA9IGxpc3QocGVybXV0YXRpb25zKHMsIHIpKQorICAgICAgICAgICAgICAgIGNvbWIgPSBsaXN0KGNvbWJpbmF0aW9ucyhzLCByKSkKKworICAgICAgICAgICAgICAgICMgQ2hlY2sgc2l6ZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHByb2QpLCBuKipyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGN3ciksIChmYWN0KG4rci0xKSAvLyBmYWN0KHIpIC8vIGZhY3Qobi0xKSkgaWYgbiBlbHNlIChub3QgcikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGVybSksIDAgaWYgcj5uIGVsc2UgZmFjdChuKSAvLyBmYWN0KG4tcikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY29tYiksIDAgaWYgcj5uIGVsc2UgZmFjdChuKSAvLyBmYWN0KHIpIC8vIGZhY3Qobi1yKSkKKworICAgICAgICAgICAgICAgICMgQ2hlY2sgbGV4aWNvZ3JhcGhpYyBvcmRlciB3aXRob3V0IHJlcGVhdGVkIHR1cGxlcworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvZCwgc29ydGVkKHNldChwcm9kKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjd3IsIHNvcnRlZChzZXQoY3dyKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwZXJtLCBzb3J0ZWQoc2V0KHBlcm0pKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbWIsIHNvcnRlZChzZXQoY29tYikpKQorCisgICAgICAgICAgICAgICAgIyBDaGVjayBpbnRlcnJlbGF0aW9uc2hpcHMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN3ciwgW3QgZm9yIHQgaW4gcHJvZCBpZiBzb3J0ZWQodCk9PWxpc3QodCldKSAjIGN3cjogcHJvZHMgd2hpY2ggYXJlIHNvcnRlZAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGVybSwgW3QgZm9yIHQgaW4gcHJvZCBpZiBsZW4oc2V0KHQpKT09cl0pICAgICMgcGVybTogcHJvZHMgd2l0aCBubyBkdXBzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21iLCBbdCBmb3IgdCBpbiBwZXJtIGlmIHNvcnRlZCh0KT09bGlzdCh0KV0pICMgY29tYjogcGVybXMgdGhhdCBhcmUgc29ydGVkCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21iLCBbdCBmb3IgdCBpbiBjd3IgaWYgbGVuKHNldCh0KSk9PXJdKSAgICAgICMgY29tYjogY3dycyB3aXRob3V0IGR1cHMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbWIsIGZpbHRlcihzZXQoY3dyKS5fX2NvbnRhaW5zX18sIHBlcm0pKSAgICAgIyBjb21iOiBwZXJtIHRoYXQgaXMgYSBjd3IKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbWIsIGZpbHRlcihzZXQocGVybSkuX19jb250YWluc19fLCBjd3IpKSAgICAgIyBjb21iOiBjd3IgdGhhdCBpcyBhIHBlcm0KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbWIsIHNvcnRlZChzZXQoY3dyKSAmIHNldChwZXJtKSkpICAgICAgICAgICAgIyBjb21iOiBib3RoIGEgY3dyIGFuZCBhIHBlcm0KKworICAgIGRlZiB0ZXN0X2NvbXByZXNzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY29tcHJlc3MoZGF0YT0nQUJDREVGJywgc2VsZWN0b3JzPVsxLDAsMSwwLDEsMV0pKSwgbGlzdCgnQUNFRicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY29tcHJlc3MoJ0FCQ0RFRicsIFsxLDAsMSwwLDEsMV0pKSwgbGlzdCgnQUNFRicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY29tcHJlc3MoJ0FCQ0RFRicsIFswLDAsMCwwLDAsMF0pKSwgbGlzdCgnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb21wcmVzcygnQUJDREVGJywgWzEsMSwxLDEsMSwxXSkpLCBsaXN0KCdBQkNERUYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbXByZXNzKCdBQkNERUYnLCBbMSwwLDFdKSksIGxpc3QoJ0FDJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb21wcmVzcygnQUJDJywgWzAsMSwxLDEsMSwxXSkpLCBsaXN0KCdCQycpKQorICAgICAgICBuID0gMTAwMDAKKyAgICAgICAgZGF0YSA9IGNoYWluLmZyb21faXRlcmFibGUocmVwZWF0KHJhbmdlKDYpLCBuKSkKKyAgICAgICAgc2VsZWN0b3JzID0gY2hhaW4uZnJvbV9pdGVyYWJsZShyZXBlYXQoKDAsIDEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbXByZXNzKGRhdGEsIHNlbGVjdG9ycykpLCBbMSwzLDVdICogbikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wcmVzcywgTm9uZSwgcmFuZ2UoNikpICAgICAgIyAxc3QgYXJnIG5vdCBpdGVyYWJsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXByZXNzLCByYW5nZSg2KSwgTm9uZSkgICAgICAjIDJuZCBhcmcgbm90IGl0ZXJhYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcHJlc3MsIHJhbmdlKDYpKSAgICAgICAgICAgICMgdG9vIGZldyBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcHJlc3MsIHJhbmdlKDYpLCBOb25lKSAgICAgICMgdG9vIG1hbnkgYXJncworCisgICAgZGVmIHRlc3RfY291bnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKCdhYmMnLGNvdW50KCkpLCBbKCdhJywgMCksICgnYicsIDEpLCAoJ2MnLCAyKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKCdhYmMnLGNvdW50KDMpKSwgWygnYScsIDMpLCAoJ2InLCA0KSwgKCdjJywgNSldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMiwgemlwKCdhYmMnLGNvdW50KDMpKSksIFsoJ2EnLCAzKSwgKCdiJywgNCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMiwgemlwKCdhYmMnLGNvdW50KC0xKSkpLCBbKCdhJywgLTEpLCAoJ2InLCAwKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgyLCB6aXAoJ2FiYycsY291bnQoLTMpKSksIFsoJ2EnLCAtMyksICgnYicsIC0yKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY291bnQsIDIsIDMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY291bnQsICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlzbGljZShjb3VudChtYXhzaXplLTUpLCAxMCkpLCByYW5nZShtYXhzaXplLTUsIG1heHNpemUrNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoY291bnQoLW1heHNpemUtNSksIDEwKSksIHJhbmdlKC1tYXhzaXplLTUsIC1tYXhzaXplKzUpKQorICAgICAgICBjID0gY291bnQoMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnY291bnQoMyknKQorICAgICAgICBjLm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYyksICdjb3VudCg0KScpCisgICAgICAgIGMgPSBjb3VudCgtOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnY291bnQoLTkpJykKKyAgICAgICAgYy5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNvdW50KDEwLjI1KSksICdjb3VudCgxMC4yNSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubmV4dCgpLCAtOCkKKyAgICAgICAgZm9yIGkgaW4gKC1zeXMubWF4aW50LTUsIC1zeXMubWF4aW50KzUgLC0xMCwgLTEsIDAsIDEwLCBzeXMubWF4aW50LTUsIHN5cy5tYXhpbnQrNSk6CisgICAgICAgICAgICAjIFRlc3QgcmVwciAoaWdub3JpbmcgdGhlIEwgaW4gbG9uZ3MpCisgICAgICAgICAgICByMSA9IHJlcHIoY291bnQoaSkpLnJlcGxhY2UoJ0wnLCAnJykKKyAgICAgICAgICAgIHIyID0gJ2NvdW50KCVyKScuX19tb2RfXyhpKS5yZXBsYWNlKCdMJywgJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLCByMikKKworICAgICAgICAjIGNoZWNrIGNvcHksIGRlZXBjb3B5LCBwaWNrbGUKKyAgICAgICAgZm9yIHZhbHVlIGluIC0zLCAzLCBzeXMubWF4aW50LTUsIHN5cy5tYXhpbnQrNToKKyAgICAgICAgICAgIGMgPSBjb3VudCh2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChjb3B5LmNvcHkoYykpLCB2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChjb3B5LmRlZXBjb3B5KGMpKSwgdmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQocGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhjKSkpLCB2YWx1ZSkKKworICAgIGRlZiB0ZXN0X2NvdW50X3dpdGhfc3RyaWRlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCgnYWJjJyxjb3VudCgyLDMpKSwgWygnYScsIDIpLCAoJ2InLCA1KSwgKCdjJywgOCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCgnYWJjJyxjb3VudChzdGFydD0yLHN0ZXA9MykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2EnLCAyKSwgKCdiJywgNSksICgnYycsIDgpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoJ2FiYycsY291bnQoc3RlcD0tMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2EnLCAwKSwgKCdiJywgLTEpLCAoJ2MnLCAtMildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCgnYWJjJyxjb3VudCgyLDApKSwgWygnYScsIDIpLCAoJ2InLCAyKSwgKCdjJywgMildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCgnYWJjJyxjb3VudCgyLDEpKSwgWygnYScsIDIpLCAoJ2InLCAzKSwgKCdjJywgNCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMjAsIGNvdW50KG1heHNpemUtMTUsIDMpKSwgdGFrZSgyMCwgcmFuZ2UobWF4c2l6ZS0xNSwgbWF4c2l6ZSsxMDAsIDMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDIwLCBjb3VudCgtbWF4c2l6ZS0xNSwgMykpLCB0YWtlKDIwLCByYW5nZSgtbWF4c2l6ZS0xNSwtbWF4c2l6ZSsxMDAsIDMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDMsIGNvdW50KDIsIDMuMjUtNGopKSwgWzIsIDUuMjUtNGosIDguNS04al0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgzLCBjb3VudChEZWNpbWFsKCcxLjEnKSwgRGVjaW1hbCgnLjEnKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtEZWNpbWFsKCcxLjEnKSwgRGVjaW1hbCgnMS4yJyksIERlY2ltYWwoJzEuMycpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDMsIGNvdW50KEZyYWN0aW9uKDIsMyksIEZyYWN0aW9uKDEsNykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbRnJhY3Rpb24oMiwzKSwgRnJhY3Rpb24oMTcsMjEpLCBGcmFjdGlvbigyMCwyMSldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodGFrZSgzLCBjb3VudCgxMCwgMi41KSkpLCByZXByKFsxMCwgMTIuNSwgMTUuMF0pKQorICAgICAgICBjID0gY291bnQoMywgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnY291bnQoMywgNSknKQorICAgICAgICBjLm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYyksICdjb3VudCg4LCA1KScpCisgICAgICAgIGMgPSBjb3VudCgtOSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnY291bnQoLTksIDApJykKKyAgICAgICAgYy5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnY291bnQoLTksIDApJykKKyAgICAgICAgYyA9IGNvdW50KC05LCAtMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnY291bnQoLTksIC0zKScpCisgICAgICAgIGMubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjKSwgJ2NvdW50KC0xMiwgLTMpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnY291bnQoLTEyLCAtMyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY291bnQoMTAuNSwgMS4yNSkpLCAnY291bnQoMTAuNSwgMS4yNSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY291bnQoMTAuNSwgMSkpLCAnY291bnQoMTAuNSknKSAgICAgICAgICAgIyBzdXBwcmVzcyBzdGVwPTEgd2hlbiBpdCdzIGFuIGludAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY291bnQoMTAuNSwgMS4wMCkpLCAnY291bnQoMTAuNSwgMS4wKScpICAgIyBkbyBzaG93IGZsb2F0IHZhbHVlcyBsaWxrZSAxLjAKKyAgICAgICAgZm9yIGkgaW4gKC1zeXMubWF4aW50LTUsIC1zeXMubWF4aW50KzUgLC0xMCwgLTEsIDAsIDEwLCBzeXMubWF4aW50LTUsIHN5cy5tYXhpbnQrNSk6CisgICAgICAgICAgICBmb3IgaiBpbiAgKC1zeXMubWF4aW50LTUsIC1zeXMubWF4aW50KzUgLC0xMCwgLTEsIDAsIDEsIDEwLCBzeXMubWF4aW50LTUsIHN5cy5tYXhpbnQrNSk6CisgICAgICAgICAgICAgICAgIyBUZXN0IHJlcHIgKGlnbm9yaW5nIHRoZSBMIGluIGxvbmdzKQorICAgICAgICAgICAgICAgIHIxID0gcmVwcihjb3VudChpLCBqKSkucmVwbGFjZSgnTCcsICcnKQorICAgICAgICAgICAgICAgIGlmIGogPT0gMToKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAoJ2NvdW50KCVyKScgJSBpKS5yZXBsYWNlKCdMJywgJycpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAoJ2NvdW50KCVyLCAlciknICUgKGksIGopKS5yZXBsYWNlKCdMJywgJycpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyMSwgcjIpCisKKyAgICBkZWYgdGVzdF9jeWNsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDEwLCBjeWNsZSgnYWJjJykpLCBsaXN0KCdhYmNhYmNhYmNhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjeWNsZSgnJykpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjeWNsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjeWNsZSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlzbGljZShjeWNsZShnZW4zKCkpLDEwKSksIFswLDEsMiwwLDEsMiwwLDEsMiwwXSkKKworICAgIGRlZiB0ZXN0X2dyb3VwYnkoc2VsZik6CisgICAgICAgICMgQ2hlY2sgd2hldGhlciBpdCBhY2NlcHRzIGFyZ3VtZW50cyBjb3JyZWN0bHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgbGlzdChncm91cGJ5KFtdKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIGxpc3QoZ3JvdXBieShbXSwga2V5PWlkKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCwgZ3JvdXBieSgnYWJjJywgW10pKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdyb3VwYnksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ3JvdXBieSwgJ2FiYycsIGxhbWJkYSB4OngsIDEwKQorCisgICAgICAgICMgQ2hlY2sgbm9ybWFsIGlucHV0CisgICAgICAgIHMgPSBbKDAsIDEwLCAyMCksICgwLCAxMSwyMSksICgwLDEyLDIxKSwgKDEsMTMsMjEpLCAoMSwxNCwyMiksCisgICAgICAgICAgICAgKDIsMTUsMjIpLCAoMywxNiwyMyksICgzLDE3LDIzKV0KKyAgICAgICAgZHVwID0gW10KKyAgICAgICAgZm9yIGssIGcgaW4gZ3JvdXBieShzLCBsYW1iZGEgcjpyWzBdKToKKyAgICAgICAgICAgIGZvciBlbGVtIGluIGc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBlbGVtWzBdKQorICAgICAgICAgICAgICAgIGR1cC5hcHBlbmQoZWxlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBkdXApCisKKyAgICAgICAgIyBDaGVjayBuZXN0ZWQgY2FzZQorICAgICAgICBkdXAgPSBbXQorICAgICAgICBmb3IgaywgZyBpbiBncm91cGJ5KHMsIGxhbWJkYSByOnJbMF0pOgorICAgICAgICAgICAgZm9yIGlrLCBpZyBpbiBncm91cGJ5KGcsIGxhbWJkYSByOnJbMl0pOgorICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIGlnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGssIGVsZW1bMF0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWssIGVsZW1bMl0pCisgICAgICAgICAgICAgICAgICAgIGR1cC5hcHBlbmQoZWxlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBkdXApCisKKyAgICAgICAgIyBDaGVjayBjYXNlIHdoZXJlIGlubmVyIGl0ZXJhdG9yIGlzIG5vdCB1c2VkCisgICAgICAgIGtleXMgPSBbayBmb3IgaywgZyBpbiBncm91cGJ5KHMsIGxhbWJkYSByOnJbMF0pXQorICAgICAgICBleHBlY3RlZGtleXMgPSBzZXQoW3JbMF0gZm9yIHIgaW4gc10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGtleXMpLCBleHBlY3RlZGtleXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGtleXMpLCBsZW4oZXhwZWN0ZWRrZXlzKSkKKworICAgICAgICAjIEV4ZXJjaXNlIHBpcGVzIGFuZCBmaWx0ZXJzIHN0eWxlCisgICAgICAgIHMgPSAnYWJyYWNhZGFicmEnCisgICAgICAgICMgc29ydCBzIHwgdW5pcQorICAgICAgICByID0gW2sgZm9yIGssIGcgaW4gZ3JvdXBieShzb3J0ZWQocykpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIFsnYScsICdiJywgJ2MnLCAnZCcsICdyJ10pCisgICAgICAgICMgc29ydCBzIHwgdW5pcSAtZAorICAgICAgICByID0gW2sgZm9yIGssIGcgaW4gZ3JvdXBieShzb3J0ZWQocykpIGlmIGxpc3QoaXNsaWNlKGcsMSwyKSldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgWydhJywgJ2InLCAnciddKQorICAgICAgICAjIHNvcnQgcyB8IHVuaXEgLWMKKyAgICAgICAgciA9IFsobGVuKGxpc3QoZykpLCBrKSBmb3IgaywgZyBpbiBncm91cGJ5KHNvcnRlZChzKSldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgWyg1LCAnYScpLCAoMiwgJ2InKSwgKDEsICdjJyksICgxLCAnZCcpLCAoMiwgJ3InKV0pCisgICAgICAgICMgc29ydCBzIHwgdW5pcSAtYyB8IHNvcnQgLXJuIHwgaGVhZCAtMworICAgICAgICByID0gc29ydGVkKFsobGVuKGxpc3QoZykpICwgaykgZm9yIGssIGcgaW4gZ3JvdXBieShzb3J0ZWQocykpXSwgcmV2ZXJzZT1UcnVlKVs6M10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCBbKDUsICdhJyksICgyLCAncicpLCAoMiwgJ2InKV0pCisKKyAgICAgICAgIyBpdGVyLm5leHQgZmFpbHVyZQorICAgICAgICBjbGFzcyBFeHBlY3RlZEVycm9yKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlZiBkZWxheWVkX3JhaXNlKG49MCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShuKToKKyAgICAgICAgICAgICAgICB5aWVsZCAneW8nCisgICAgICAgICAgICByYWlzZSBFeHBlY3RlZEVycm9yCisgICAgICAgIGRlZiBndWxwKGl0ZXJhYmxlLCBrZXlwPU5vbmUsIGZ1bmM9bGlzdCk6CisgICAgICAgICAgICByZXR1cm4gW2Z1bmMoZykgZm9yIGssIGcgaW4gZ3JvdXBieShpdGVyYWJsZSwga2V5cCldCisKKyAgICAgICAgIyBpdGVyLm5leHQgZmFpbHVyZSBvbiBvdXRlciBvYmplY3QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhwZWN0ZWRFcnJvciwgZ3VscCwgZGVsYXllZF9yYWlzZSgwKSkKKyAgICAgICAgIyBpdGVyLm5leHQgZmFpbHVyZSBvbiBpbm5lciBvYmplY3QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhwZWN0ZWRFcnJvciwgZ3VscCwgZGVsYXllZF9yYWlzZSgxKSkKKworICAgICAgICAjIF9fY21wX18gZmFpbHVyZQorICAgICAgICBjbGFzcyBEdW1teUNtcDoKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIGRzdCk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhwZWN0ZWRFcnJvcgorICAgICAgICBzID0gW0R1bW15Q21wKCksIER1bW15Q21wKCksIE5vbmVdCisKKyAgICAgICAgIyBfX2NtcF9fIGZhaWx1cmUgb24gb3V0ZXIgb2JqZWN0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4cGVjdGVkRXJyb3IsIGd1bHAsIHMsIGZ1bmM9aWQpCisgICAgICAgICMgX19jbXBfXyBmYWlsdXJlIG9uIGlubmVyIG9iamVjdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeHBlY3RlZEVycm9yLCBndWxwLCBzKQorCisgICAgICAgICMga2V5ZnVuYyBmYWlsdXJlCisgICAgICAgIGRlZiBrZXlmdW5jKG9iaik6CisgICAgICAgICAgICBpZiBrZXlmdW5jLnNraXAgPiAwOgorICAgICAgICAgICAgICAgIGtleWZ1bmMuc2tpcCAtPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIG9iagorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBFeHBlY3RlZEVycm9yCisKKyAgICAgICAgIyBrZXlmdW5jIGZhaWx1cmUgb24gb3V0ZXIgb2JqZWN0CisgICAgICAgIGtleWZ1bmMuc2tpcCA9IDAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhwZWN0ZWRFcnJvciwgZ3VscCwgW05vbmVdLCBrZXlmdW5jKQorICAgICAgICBrZXlmdW5jLnNraXAgPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4cGVjdGVkRXJyb3IsIGd1bHAsIFtOb25lLCBOb25lXSwga2V5ZnVuYykKKworICAgIGRlZiB0ZXN0X2lmaWx0ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpZmlsdGVyKGlzRXZlbiwgcmFuZ2UoNikpKSwgWzAsMiw0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlmaWx0ZXIoTm9uZSwgWzAsMSwwLDIsMF0pKSwgWzEsMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpZmlsdGVyKGJvb2wsIFswLDEsMCwyLDBdKSksIFsxLDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoNCwgaWZpbHRlcihpc0V2ZW4sIGNvdW50KCkpKSwgWzAsMiw0LDZdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlmaWx0ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaWZpbHRlciwgbGFtYmRhIHg6eCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpZmlsdGVyLCBsYW1iZGEgeDp4LCByYW5nZSg2KSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpZmlsdGVyLCBpc0V2ZW4sIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaWZpbHRlcihyYW5nZSg2KSwgcmFuZ2UoNikpLm5leHQpCisKKyAgICBkZWYgdGVzdF9pZmlsdGVyZmFsc2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpZmlsdGVyZmFsc2UoaXNFdmVuLCByYW5nZSg2KSkpLCBbMSwzLDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaWZpbHRlcmZhbHNlKE5vbmUsIFswLDEsMCwyLDBdKSksIFswLDAsMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpZmlsdGVyZmFsc2UoYm9vbCwgWzAsMSwwLDIsMF0pKSwgWzAsMCwwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDQsIGlmaWx0ZXJmYWxzZShpc0V2ZW4sIGNvdW50KCkpKSwgWzEsMyw1LDddKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlmaWx0ZXJmYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpZmlsdGVyZmFsc2UsIGxhbWJkYSB4OngpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaWZpbHRlcmZhbHNlLCBsYW1iZGEgeDp4LCByYW5nZSg2KSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpZmlsdGVyZmFsc2UsIGlzRXZlbiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpZmlsdGVyZmFsc2UocmFuZ2UoNiksIHJhbmdlKDYpKS5uZXh0KQorCisgICAgZGVmIHRlc3RfaXppcChzZWxmKToKKyAgICAgICAgYW5zID0gWyh4LHkpIGZvciB4LCB5IGluIGl6aXAoJ2FiYycsY291bnQoKSldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW5zLCBbKCdhJywgMCksICgnYicsIDEpLCAoJ2MnLCAyKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpemlwKCdhYmMnLCByYW5nZSg2KSkpLCB6aXAoJ2FiYycsIHJhbmdlKDYpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXAoJ2FiY2RlZicsIHJhbmdlKDMpKSksIHppcCgnYWJjZGVmJywgcmFuZ2UoMykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMyxpemlwKCdhYmNkZWYnLCBjb3VudCgpKSksIHppcCgnYWJjZGVmJywgcmFuZ2UoMykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcCgnYWJjZGVmJykpLCB6aXAoJ2FiY2RlZicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcCgpKSwgemlwKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXppcCwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpemlwLCByYW5nZSgzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbdHVwbGUobGlzdChwYWlyKSkgZm9yIHBhaXIgaW4gaXppcCgnYWJjJywgJ2RlZicpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB6aXAoJ2FiYycsICdkZWYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbcGFpciBmb3IgcGFpciBpbiBpemlwKCdhYmMnLCAnZGVmJyldLAorICAgICAgICAgICAgICAgICAgICAgICAgIHppcCgnYWJjJywgJ2RlZicpKQorCisgICAgQHRlc3Rfc3VwcG9ydC5pbXBsX2RldGFpbCgidHVwbGUgcmV1c2UgaXMgc3BlY2lmaWMgdG8gQ1B5dGhvbiIpCisgICAgZGVmIHRlc3RfaXppcF90dXBsZV9yZXN1c2Uoc2VsZik6CisgICAgICAgIGlkcyA9IG1hcChpZCwgaXppcCgnYWJjJywgJ2RlZicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbihpZHMpLCBtYXgoaWRzKSkKKyAgICAgICAgaWRzID0gbWFwKGlkLCBsaXN0KGl6aXAoJ2FiYycsICdkZWYnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpY3QuZnJvbWtleXMoaWRzKSksIGxlbihpZHMpKQorCisgICAgZGVmIHRlc3RfaXppcGxvbmdlc3Qoc2VsZik6CisgICAgICAgIGZvciBhcmdzIGluIFsKKyAgICAgICAgICAgICAgICBbJ2FiYycsIHJhbmdlKDYpXSwKKyAgICAgICAgICAgICAgICBbcmFuZ2UoNiksICdhYmMnXSwKKyAgICAgICAgICAgICAgICBbcmFuZ2UoMTAwMCksIHJhbmdlKDIwMDAsMjEwMCksIHJhbmdlKDMwMDAsMzA1MCldLAorICAgICAgICAgICAgICAgIFtyYW5nZSgxMDAwKSwgcmFuZ2UoMCksIHJhbmdlKDMwMDAsMzA1MCksIHJhbmdlKDEyMDApLCByYW5nZSgxNTAwKV0sCisgICAgICAgICAgICAgICAgW3JhbmdlKDEwMDApLCByYW5nZSgwKSwgcmFuZ2UoMzAwMCwzMDUwKSwgcmFuZ2UoMTIwMCksIHJhbmdlKDE1MDApLCByYW5nZSgwKV0sCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgIyB0YXJnZXQgPSBtYXAoTm9uZSwgKmFyZ3MpIDwtIHRoaXMgcmFpc2VzIGEgcHkzayB3YXJuaW5nCisgICAgICAgICAgICAjIHRoaXMgaXMgdGhlIHJlcGxhY2VtZW50OgorICAgICAgICAgICAgdGFyZ2V0ID0gW3R1cGxlKFthcmdbaV0gaWYgaSA8IGxlbihhcmcpIGVsc2UgTm9uZSBmb3IgYXJnIGluIGFyZ3NdKQorICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG1heChtYXAobGVuLCBhcmdzKSkpXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXBfbG9uZ2VzdCgqYXJncykpLCB0YXJnZXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcF9sb25nZXN0KCphcmdzLCAqKnt9KSksIHRhcmdldCkKKyAgICAgICAgICAgIHRhcmdldCA9IFt0dXBsZSgoZSBpcyBOb25lIGFuZCAnWCcgb3IgZSkgZm9yIGUgaW4gdCkgZm9yIHQgaW4gdGFyZ2V0XSAgICMgUmVwbGFjZSBOb25lIGZpbGxzIHdpdGggJ1gnCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcF9sb25nZXN0KCphcmdzLCAqKmRpY3QoZmlsbHZhbHVlPSdYJykpKSwgdGFyZ2V0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgzLGl6aXBfbG9uZ2VzdCgnYWJjZGVmJywgY291bnQoKSkpLCB6aXAoJ2FiY2RlZicsIHJhbmdlKDMpKSkgIyB0YWtlIDMgZnJvbSBpbmZpbml0ZSBpbnB1dAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpemlwX2xvbmdlc3QoKSksIHppcCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcF9sb25nZXN0KFtdKSksIHppcChbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpemlwX2xvbmdlc3QoJ2FiY2RlZicpKSwgemlwKCdhYmNkZWYnKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcF9sb25nZXN0KCdhYmMnLCAnZGVmZycsICoqe30pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB6aXAobGlzdCgnYWJjJykgKyBbTm9uZV0sICdkZWZnJykpICAjIGVtcHR5IGtleXdvcmQgZGljdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGl6aXBfbG9uZ2VzdCwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpemlwX2xvbmdlc3QsIHJhbmdlKDMpLCAzKQorCisgICAgICAgIGZvciBzdG10IGluIFsKKyAgICAgICAgICAgICJpemlwX2xvbmdlc3QoJ2FiYycsIGZ2PTEpIiwKKyAgICAgICAgICAgICJpemlwX2xvbmdlc3QoJ2FiYycsIGZpbGx2YWx1ZT0xLCBib2d1c19rZXl3b3JkPU5vbmUpIiwKKyAgICAgICAgXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBldmFsKHN0bXQsIGdsb2JhbHMoKSwgbG9jYWxzKCkpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdEaWQgbm90IHJhaXNlIFR5cGUgaW46ICAnICsgc3RtdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFt0dXBsZShsaXN0KHBhaXIpKSBmb3IgcGFpciBpbiBpemlwX2xvbmdlc3QoJ2FiYycsICdkZWYnKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgemlwKCdhYmMnLCAnZGVmJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3BhaXIgZm9yIHBhaXIgaW4gaXppcF9sb25nZXN0KCdhYmMnLCAnZGVmJyldLAorICAgICAgICAgICAgICAgICAgICAgICAgIHppcCgnYWJjJywgJ2RlZicpKQorCisgICAgQHRlc3Rfc3VwcG9ydC5pbXBsX2RldGFpbCgidHVwbGUgcmV1c2UgaXMgc3BlY2lmaWMgdG8gQ1B5dGhvbiIpCisgICAgZGVmIHRlc3RfaXppcF9sb25nZXN0X3R1cGxlX3JldXNlKHNlbGYpOgorICAgICAgICBpZHMgPSBtYXAoaWQsIGl6aXBfbG9uZ2VzdCgnYWJjJywgJ2RlZicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbihpZHMpLCBtYXgoaWRzKSkKKyAgICAgICAgaWRzID0gbWFwKGlkLCBsaXN0KGl6aXBfbG9uZ2VzdCgnYWJjJywgJ2RlZicpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGljdC5mcm9ta2V5cyhpZHMpKSwgbGVuKGlkcykpCisKKyAgICBkZWYgdGVzdF9idWdfNzI0NChzZWxmKToKKworICAgICAgICBjbGFzcyBSZXBlYXRlcihvYmplY3QpOgorICAgICAgICAgICAgIyB0aGlzIGNsYXNzIGlzIHNpbWlsYXIgdG8gaXRlcnRvb2xzLnJlcGVhdAorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG8sIHQsIGUpOgorICAgICAgICAgICAgICAgIHNlbGYubyA9IG8KKyAgICAgICAgICAgICAgICBzZWxmLnQgPSBpbnQodCkKKyAgICAgICAgICAgICAgICBzZWxmLmUgPSBlCisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6ICMgaXRzIGl0ZXJhdG9yIGlzIGl0c2VsZgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnQgPiAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnQgLT0gMQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5vCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc2VsZi5lCisKKyAgICAgICAgIyBGb3JtZXJseSB0aGlzIGNvZGUgaW4gd291bGQgZmFpbCBpbiBkZWJ1ZyBtb2RlCisgICAgICAgICMgd2l0aCBVbmRldGVjdGVkIEVycm9yIGFuZCBTdG9wIEl0ZXJhdGlvbgorICAgICAgICByMSA9IFJlcGVhdGVyKDEsIDMsIFN0b3BJdGVyYXRpb24pCisgICAgICAgIHIyID0gUmVwZWF0ZXIoMiwgNCwgU3RvcEl0ZXJhdGlvbikKKyAgICAgICAgZGVmIHJ1bihyMSwgcjIpOgorICAgICAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgICAgIGZvciBpLCBqIGluIGl6aXBfbG9uZ2VzdChyMSwgcjIsIGZpbGx2YWx1ZT0wKToKKyAgICAgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jYXB0dXJlZF9vdXRwdXQoJ3N0ZG91dCcpOgorICAgICAgICAgICAgICAgICAgICBwcmludCAoaSwgaikKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKChpLCBqKSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4ocjEsIHIyKSwgWygxLDIpLCAoMSwyKSwgKDEsMiksICgwLDIpXSkKKworICAgICAgICAjIEZvcm1lcmx5LCB0aGUgUnVudGltZUVycm9yIHdvdWxkIGJlIGxvc3QKKyAgICAgICAgIyBhbmQgU3RvcEl0ZXJhdGlvbiB3b3VsZCBzdG9wIGFzIGV4cGVjdGVkCisgICAgICAgIHIxID0gUmVwZWF0ZXIoMSwgMywgUnVudGltZUVycm9yKQorICAgICAgICByMiA9IFJlcGVhdGVyKDIsIDQsIFN0b3BJdGVyYXRpb24pCisgICAgICAgIGl0ID0gaXppcF9sb25nZXN0KHIxLCByMiwgZmlsbHZhbHVlPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChpdCksICgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0KSwgKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoaXQpLCAoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgbmV4dCwgaXQpCisKKyAgICBkZWYgdGVzdF9wcm9kdWN0KHNlbGYpOgorICAgICAgICBmb3IgYXJncywgcmVzdWx0IGluIFsKKyAgICAgICAgICAgIChbXSwgWygpXSksICAgICAgICAgICAgICAgICAgICAgIyB6ZXJvIGl0ZXJhYmxlcworICAgICAgICAgICAgKFsnYWInXSwgWygnYScsKSwgKCdiJywpXSksICAgICAjIG9uZSBpdGVyYWJsZQorICAgICAgICAgICAgKFtyYW5nZSgyKSwgcmFuZ2UoMyldLCBbKDAsMCksICgwLDEpLCAoMCwyKSwgKDEsMCksICgxLDEpLCAoMSwyKV0pLCAgICAgIyB0d28gaXRlcmFibGVzCisgICAgICAgICAgICAoW3JhbmdlKDApLCByYW5nZSgyKSwgcmFuZ2UoMyldLCBbXSksICAgICAgICAgICAjIGZpcnN0IGl0ZXJhYmxlIHdpdGggemVybyBsZW5ndGgKKyAgICAgICAgICAgIChbcmFuZ2UoMiksIHJhbmdlKDApLCByYW5nZSgzKV0sIFtdKSwgICAgICAgICAgICMgbWlkZGxlIGl0ZXJhYmxlIHdpdGggemVybyBsZW5ndGgKKyAgICAgICAgICAgIChbcmFuZ2UoMiksIHJhbmdlKDMpLCByYW5nZSgwKV0sIFtdKSwgICAgICAgICAgICMgbGFzdCBpdGVyYWJsZSB3aXRoIHplcm8gbGVuZ3RoCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHByb2R1Y3QoKmFyZ3MpKSwgcmVzdWx0KQorICAgICAgICAgICAgZm9yIHIgaW4gcmFuZ2UoNCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHByb2R1Y3QoKihhcmdzKnIpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0KHByb2R1Y3QoKmFyZ3MsICoqZGljdChyZXBlYXQ9cikpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGlzdChwcm9kdWN0KCpbcmFuZ2UoNyldKjYpKSksIDcqKjYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvZHVjdCwgcmFuZ2UoNiksIE5vbmUpCisKKyAgICAgICAgZGVmIHByb2R1Y3QxKCphcmdzLCAqKmt3ZHMpOgorICAgICAgICAgICAgcG9vbHMgPSBtYXAodHVwbGUsIGFyZ3MpICoga3dkcy5nZXQoJ3JlcGVhdCcsIDEpCisgICAgICAgICAgICBuID0gbGVuKHBvb2xzKQorICAgICAgICAgICAgaWYgbiA9PSAwOgorICAgICAgICAgICAgICAgIHlpZWxkICgpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBhbnkobGVuKHBvb2wpID09IDAgZm9yIHBvb2wgaW4gcG9vbHMpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaW5kaWNlcyA9IFswXSAqIG4KKyAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIHBvb2wsIGkgaW4gemlwKHBvb2xzLCBpbmRpY2VzKSkKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobikpOiAgIyByaWdodCB0byBsZWZ0CisgICAgICAgICAgICAgICAgICAgIGlmIGluZGljZXNbaV0gPT0gbGVuKHBvb2xzW2ldKSAtIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2ldICs9IDEKKyAgICAgICAgICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSsxLCBuKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXNbal0gPSAwCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIHBvb2wsIGkgaW4gemlwKHBvb2xzLCBpbmRpY2VzKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBkZWYgcHJvZHVjdDIoKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICAgICAnUHVyZSBweXRob24gdmVyc2lvbiB1c2VkIGluIGRvY3MnCisgICAgICAgICAgICBwb29scyA9IG1hcCh0dXBsZSwgYXJncykgKiBrd2RzLmdldCgncmVwZWF0JywgMSkKKyAgICAgICAgICAgIHJlc3VsdCA9IFtbXV0KKyAgICAgICAgICAgIGZvciBwb29sIGluIHBvb2xzOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IFt4K1t5XSBmb3IgeCBpbiByZXN1bHQgZm9yIHkgaW4gcG9vbF0KKyAgICAgICAgICAgIGZvciBwcm9kIGluIHJlc3VsdDoKKyAgICAgICAgICAgICAgICB5aWVsZCB0dXBsZShwcm9kKQorCisgICAgICAgIGFyZ3R5cGVzID0gWycnLCAnYWJjJywgJycsIHhyYW5nZSgwKSwgeHJhbmdlKDQpLCBkaWN0KGE9MSwgYj0yLCBjPTMpLAorICAgICAgICAgICAgICAgICAgICBzZXQoJ2FiY2RlZmcnKSwgcmFuZ2UoMTEpLCB0dXBsZShyYW5nZSgxMykpXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDApOgorICAgICAgICAgICAgYXJncyA9IFtyYW5kb20uY2hvaWNlKGFyZ3R5cGVzKSBmb3IgaiBpbiByYW5nZShyYW5kb20ucmFuZHJhbmdlKDUpKV0KKyAgICAgICAgICAgIGV4cGVjdGVkX2xlbiA9IHByb2QobWFwKGxlbiwgYXJncykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaXN0KHByb2R1Y3QoKmFyZ3MpKSksIGV4cGVjdGVkX2xlbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwcm9kdWN0KCphcmdzKSksIGxpc3QocHJvZHVjdDEoKmFyZ3MpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwcm9kdWN0KCphcmdzKSksIGxpc3QocHJvZHVjdDIoKmFyZ3MpKSkKKyAgICAgICAgICAgIGFyZ3MgPSBtYXAoaXRlciwgYXJncykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpc3QocHJvZHVjdCgqYXJncykpKSwgZXhwZWN0ZWRfbGVuKQorCisgICAgQHRlc3Rfc3VwcG9ydC5pbXBsX2RldGFpbCgidHVwbGUgcmV1c2UgaXMgc3BlY2lmaWMgdG8gQ1B5dGhvbiIpCisgICAgZGVmIHRlc3RfcHJvZHVjdF90dXBsZV9yZXVzZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2V0KG1hcChpZCwgcHJvZHVjdCgnYWJjJywgJ2RlZicpKSkpLCAxKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGxlbihzZXQobWFwKGlkLCBsaXN0KHByb2R1Y3QoJ2FiYycsICdkZWYnKSkpKSksIDEpCisKKyAgICBkZWYgdGVzdF9yZXBlYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChyZXBlYXQob2JqZWN0PSdhJywgdGltZXM9MykpLCBbJ2EnLCAnYScsICdhJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKHhyYW5nZSgzKSxyZXBlYXQoJ2EnKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygwLCAnYScpLCAoMSwgJ2EnKSwgKDIsICdhJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmVwZWF0KCdhJywgMykpLCBbJ2EnLCAnYScsICdhJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgzLCByZXBlYXQoJ2EnKSksIFsnYScsICdhJywgJ2EnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJlcGVhdCgnYScsIDApKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChyZXBlYXQoJ2EnLCAtMykpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXBlYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVwZWF0LCBOb25lLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlcGVhdCwgTm9uZSwgJ2EnKQorICAgICAgICByID0gcmVwZWF0KDErMGopCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihyKSwgJ3JlcGVhdCgoMSswaikpJykKKyAgICAgICAgciA9IHJlcGVhdCgxKzBqLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIociksICdyZXBlYXQoKDErMGopLCA1KScpCisgICAgICAgIGxpc3QocikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHIpLCAncmVwZWF0KCgxKzBqKSwgMCknKQorCisgICAgZGVmIHRlc3RfaW1hcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGltYXAob3BlcmF0b3IucG93LCByYW5nZSgzKSwgcmFuZ2UoMSw3KSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFswKioxLCAxKioyLCAyKiozXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGltYXAoTm9uZSwgJ2FiYycsIHJhbmdlKDUpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygnYScsMCksKCdiJywxKSwoJ2MnLDIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGltYXAoTm9uZSwgJ2FiYycsIGNvdW50KCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKCdhJywwKSwoJ2InLDEpLCgnYycsMildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMixpbWFwKE5vbmUsICdhYmMnLCBjb3VudCgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygnYScsMCksKCdiJywxKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpbWFwKG9wZXJhdG9yLnBvdywgW10pKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW1hcCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbWFwLCBvcGVyYXRvci5uZWcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW1hcCgxMCwgcmFuZ2UoNSkpLm5leHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGltYXAoZXJyZnVuYywgWzRdLCBbNV0pLm5leHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW1hcChvbmVhcmcsIFs0XSwgWzVdKS5uZXh0KQorCisgICAgZGVmIHRlc3Rfc3Rhcm1hcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN0YXJtYXAob3BlcmF0b3IucG93LCB6aXAocmFuZ2UoMyksIHJhbmdlKDEsNykpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWzAqKjEsIDEqKjIsIDIqKjNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMywgc3Rhcm1hcChvcGVyYXRvci5wb3csIGl6aXAoY291bnQoKSwgY291bnQoMSkpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWzAqKjEsIDEqKjIsIDIqKjNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3Rhcm1hcChvcGVyYXRvci5wb3csIFtdKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3Rhcm1hcChvcGVyYXRvci5wb3csIFtpdGVyKFs0LDVdKV0pKSwgWzQqKjVdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIHN0YXJtYXAob3BlcmF0b3IucG93LCBbTm9uZV0pKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0YXJtYXApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3Rhcm1hcCwgb3BlcmF0b3IucG93LCBbKDQsNSldLCAnZXh0cmEnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0YXJtYXAoMTAsIFsoNCw1KV0pLm5leHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0YXJtYXAoZXJyZnVuYywgWyg0LDUpXSkubmV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdGFybWFwKG9uZWFyZywgWyg0LDUpXSkubmV4dCkKKworICAgIGRlZiB0ZXN0X2lzbGljZShzZWxmKToKKyAgICAgICAgZm9yIGFyZ3MgaW4gWyAgICAgICAgICAjIGlzbGljZShhcmdzKSBzaG91bGQgYWdyZWUgd2l0aCByYW5nZShhcmdzKQorICAgICAgICAgICAgICAgICgxMCwgMjAsIDMpLAorICAgICAgICAgICAgICAgICgxMCwgMywgMjApLAorICAgICAgICAgICAgICAgICgxMCwgMjApLAorICAgICAgICAgICAgICAgICgxMCwgMyksCisgICAgICAgICAgICAgICAgKDIwLCkKKyAgICAgICAgICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlzbGljZSh4cmFuZ2UoMTAwKSwgKmFyZ3MpKSwgcmFuZ2UoKmFyZ3MpKQorCisgICAgICAgIGZvciBhcmdzLCB0Z3RhcmdzIGluIFsgICMgU3RvcCB3aGVuIHNlcW4gaXMgZXhoYXVzdGVkCisgICAgICAgICAgICAgICAgKCgxMCwgMTEwLCAzKSwgKCgxMCwgMTAwLCAzKSkpLAorICAgICAgICAgICAgICAgICgoMTAsIDExMCksICgoMTAsIDEwMCkpKSwKKyAgICAgICAgICAgICAgICAoKDExMCwpLCAoMTAwLCkpCisgICAgICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoeHJhbmdlKDEwMCksICphcmdzKSksIHJhbmdlKCp0Z3RhcmdzKSkKKworICAgICAgICAjIFRlc3Qgc3RvcD1Ob25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoeHJhbmdlKDEwKSwgTm9uZSkpLCByYW5nZSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoeHJhbmdlKDEwKSwgTm9uZSwgTm9uZSkpLCByYW5nZSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoeHJhbmdlKDEwKSwgTm9uZSwgTm9uZSwgTm9uZSkpLCByYW5nZSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoeHJhbmdlKDEwKSwgMiwgTm9uZSkpLCByYW5nZSgyLCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoeHJhbmdlKDEwKSwgMSwgTm9uZSwgMikpLCByYW5nZSgxLCAxMCwgMikpCisKKyAgICAgICAgIyBUZXN0IG51bWJlciBvZiBpdGVtcyBjb25zdW1lZCAgICAgU0YgIzExNzE0MTcKKyAgICAgICAgaXQgPSBpdGVyKHJhbmdlKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlzbGljZShpdCwgMykpLCByYW5nZSgzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0KSwgcmFuZ2UoMywgMTApKQorCisgICAgICAgICMgVGVzdCBpbnZhbGlkIGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlzbGljZSwgeHJhbmdlKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc2xpY2UsIHhyYW5nZSgxMCksIDEsIDIsIDMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGlzbGljZSwgeHJhbmdlKDEwKSwgLTUsIDEwLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpc2xpY2UsIHhyYW5nZSgxMCksIDEsIC01LCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaXNsaWNlLCB4cmFuZ2UoMTApLCAxLCAxMCwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGlzbGljZSwgeHJhbmdlKDEwKSwgMSwgMTAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGlzbGljZSwgeHJhbmdlKDEwKSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpc2xpY2UsIHhyYW5nZSgxMCksICdhJywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaXNsaWNlLCB4cmFuZ2UoMTApLCAxLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGlzbGljZSwgeHJhbmdlKDEwKSwgJ2EnLCAxLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpc2xpY2UsIHhyYW5nZSgxMCksIDEsICdhJywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGlzdChpc2xpY2UoY291bnQoKSwgMSwgMTAsIG1heHNpemUpKSksIDEpCisKKyAgICAgICAgIyBJc3N1ZSAjMTAzMjM6ICBMZXNzIGlzbGljZSBpbiBhIHByZWRpY3RhYmxlIHN0YXRlCisgICAgICAgIGMgPSBjb3VudCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoYywgMSwgMywgNTApKSwgWzFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoYyksIDMpCisKKyAgICBkZWYgdGVzdF90YWtld2hpbGUoc2VsZik6CisgICAgICAgIGRhdGEgPSBbMSwgMywgNSwgMjAsIDIsIDQsIDYsIDhdCisgICAgICAgIHVuZGVydGVuID0gbGFtYmRhIHg6IHg8MTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHRha2V3aGlsZSh1bmRlcnRlbiwgZGF0YSkpLCBbMSwgMywgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh0YWtld2hpbGUodW5kZXJ0ZW4sIFtdKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRha2V3aGlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0YWtld2hpbGUsIG9wZXJhdG9yLnBvdykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0YWtld2hpbGUsIG9wZXJhdG9yLnBvdywgWyg0LDUpXSwgJ2V4dHJhJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0YWtld2hpbGUoMTAsIFsoNCw1KV0pLm5leHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRha2V3aGlsZShlcnJmdW5jLCBbKDQsNSldKS5uZXh0KQorICAgICAgICB0ID0gdGFrZXdoaWxlKGJvb2wsIFsxLCAxLCAxLCAwLCAwLCAwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHQpLCBbMSwgMSwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHQubmV4dCkKKworICAgIGRlZiB0ZXN0X2Ryb3B3aGlsZShzZWxmKToKKyAgICAgICAgZGF0YSA9IFsxLCAzLCA1LCAyMCwgMiwgNCwgNiwgOF0KKyAgICAgICAgdW5kZXJ0ZW4gPSBsYW1iZGEgeDogeDwxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZHJvcHdoaWxlKHVuZGVydGVuLCBkYXRhKSksIFsyMCwgMiwgNCwgNiwgOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkcm9wd2hpbGUodW5kZXJ0ZW4sIFtdKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRyb3B3aGlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkcm9wd2hpbGUsIG9wZXJhdG9yLnBvdykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkcm9wd2hpbGUsIG9wZXJhdG9yLnBvdywgWyg0LDUpXSwgJ2V4dHJhJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkcm9wd2hpbGUoMTAsIFsoNCw1KV0pLm5leHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGRyb3B3aGlsZShlcnJmdW5jLCBbKDQsNSldKS5uZXh0KQorCisgICAgZGVmIHRlc3RfdGVlKHNlbGYpOgorICAgICAgICBuID0gMjAwCisgICAgICAgIGRlZiBpcmFuZ2Uobik6CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uobik6CisgICAgICAgICAgICAgICAgeWllbGQgaQorCisgICAgICAgIGEsIGIgPSB0ZWUoW10pICAgICAgICAjIHRlc3QgZW1wdHkgaXRlcmF0b3IKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGEpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCBbXSkKKworICAgICAgICBhLCBiID0gdGVlKGlyYW5nZShuKSkgIyB0ZXN0IDEwMCUgaW50ZXJsZWF2ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoYSxiKSwgemlwKHJhbmdlKG4pLHJhbmdlKG4pKSkKKworICAgICAgICBhLCBiID0gdGVlKGlyYW5nZShuKSkgIyB0ZXN0IDAlIGludGVybGVhdmVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChhKSwgcmFuZ2UobikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgcmFuZ2UobikpCisKKyAgICAgICAgYSwgYiA9IHRlZShpcmFuZ2UobikpICMgdGVzdCBkZWFsbG9jIG9mIGxlYWRpbmcgaXRlcmF0b3IKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEubmV4dCgpLCBpKQorICAgICAgICBkZWwgYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIHJhbmdlKG4pKQorCisgICAgICAgIGEsIGIgPSB0ZWUoaXJhbmdlKG4pKSAjIHRlc3QgZGVhbGxvYyBvZiB0cmFpbGluZyBpdGVyYXRvcgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5uZXh0KCksIGkpCisgICAgICAgIGRlbCBiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChhKSwgcmFuZ2UoMTAwLCBuKSkKKworICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoNSk6ICAgIyB0ZXN0IHJhbmRvbWx5IGludGVybGVhdmVkCisgICAgICAgICAgICBvcmRlciA9IFswXSpuICsgWzFdKm4KKyAgICAgICAgICAgIHJhbmRvbS5zaHVmZmxlKG9yZGVyKQorICAgICAgICAgICAgbGlzdHMgPSAoW10sIFtdKQorICAgICAgICAgICAgaXRzID0gdGVlKGlyYW5nZShuKSkKKyAgICAgICAgICAgIGZvciBpIGluIG9yZGVyOgorICAgICAgICAgICAgICAgIHZhbHVlID0gaXRzW2ldLm5leHQoKQorICAgICAgICAgICAgICAgIGxpc3RzW2ldLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdHNbMF0sIHJhbmdlKG4pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0c1sxXSwgcmFuZ2UobikpCisKKyAgICAgICAgIyB0ZXN0IGFyZ3VtZW50IGZvcm1hdCBjaGVja2luZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRlZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0ZWUsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGVlLCBbMSwyXSwgJ3gnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRlZSwgWzEsMl0sIDMsICd4JykKKworICAgICAgICAjIHRlZSBvYmplY3Qgc2hvdWxkIGJlIGluc3RhbnRpYWJsZQorICAgICAgICBhLCBiID0gdGVlKCdhYmMnKQorICAgICAgICBjID0gdHlwZShhKSgnZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGMpLCBsaXN0KCdkZWYnKSkKKworICAgICAgICAjIHRlc3QgbG9uZy1sYWdnZWQgYW5kIG11bHRpLXdheSBzcGxpdAorICAgICAgICBhLCBiLCBjID0gdGVlKHhyYW5nZSgyMDAwKSwgMykKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEubmV4dCgpLCBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIHJhbmdlKDIwMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtjLm5leHQoKSwgYy5uZXh0KCldLCByYW5nZSgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGEpLCByYW5nZSgxMDAsMjAwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjKSwgcmFuZ2UoMiwyMDAwKSkKKworICAgICAgICAjIHRlc3QgdmFsdWVzIG9mIG4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0ZWUsICdhYmMnLCAnaW52YWxpZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRlZSwgW10sIC0xKQorICAgICAgICBmb3IgbiBpbiB4cmFuZ2UoNSk6CisgICAgICAgICAgICByZXN1bHQgPSB0ZWUoJ2FiYycsIG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgdHVwbGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQpLCBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAobGlzdCwgcmVzdWx0KSwgW2xpc3QoJ2FiYycpXSpuKQorCisgICAgICAgICMgdGVlIHBhc3MtdGhyb3VnaCB0byBjb3B5YWJsZSBpdGVyYXRvcgorICAgICAgICBhLCBiID0gdGVlKCdhYmMnKQorICAgICAgICBjLCBkID0gdGVlKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIGMpCisKKyAgICAgICAgIyB0ZXN0IHRlZV9uZXcKKyAgICAgICAgdDEsIHQyID0gdGVlKCdhYmMnKQorICAgICAgICB0bmV3ID0gdHlwZSh0MSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0bmV3KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRuZXcsIDEwKQorICAgICAgICB0MyA9IHRuZXcodDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaXN0KHQxKSA9PSBsaXN0KHQyKSA9PSBsaXN0KHQzKSA9PSBsaXN0KCdhYmMnKSkKKworICAgICAgICAjIHRlc3QgdGhhdCB0ZWUgb2JqZWN0cyBhcmUgd2VhayByZWZlcmVuY2FibGUKKyAgICAgICAgYSwgYiA9IHRlZSh4cmFuZ2UoMTApKQorICAgICAgICBwID0gcHJveHkoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKHAsICdfX2NsYXNzX18nKSwgdHlwZShiKSkKKyAgICAgICAgZGVsIGEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUmVmZXJlbmNlRXJyb3IsIGdldGF0dHIsIHAsICdfX2NsYXNzX18nKQorCisgICAgIyBJc3N1ZSAxMzQ1NDogQ3Jhc2ggd2hlbiBkZWxldGluZyBiYWNrd2FyZCBpdGVyYXRvciBmcm9tIHRlZSgpCisgICAgZGVmIHRlc3RfdGVlX2RlbF9iYWNrd2FyZChzZWxmKToKKyAgICAgICAgZm9yd2FyZCwgYmFja3dhcmQgPSB0ZWUocmVwZWF0KE5vbmUsIDIwMDAwMDAwKSkKKyAgICAgICAgYW55KGZvcndhcmQpICAjIGV4aGF1c3QgdGhlIGl0ZXJhdG9yCisgICAgICAgIGRlbCBiYWNrd2FyZAorCisgICAgZGVmIHRlc3RfU3RvcEl0ZXJhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgaXppcCgpLm5leHQpCisKKyAgICAgICAgZm9yIGYgaW4gKGNoYWluLCBjeWNsZSwgaXppcCwgZ3JvdXBieSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBmKFtdKS5uZXh0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgZihTdG9wTm93KCkpLm5leHQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgaXNsaWNlKFtdLCBOb25lKS5uZXh0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBpc2xpY2UoU3RvcE5vdygpLCBOb25lKS5uZXh0KQorCisgICAgICAgIHAsIHEgPSB0ZWUoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHAubmV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgcS5uZXh0KQorICAgICAgICBwLCBxID0gdGVlKFN0b3BOb3coKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgcC5uZXh0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBxLm5leHQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgcmVwZWF0KE5vbmUsIDApLm5leHQpCisKKyAgICAgICAgZm9yIGYgaW4gKGlmaWx0ZXIsIGlmaWx0ZXJmYWxzZSwgaW1hcCwgdGFrZXdoaWxlLCBkcm9wd2hpbGUsIHN0YXJtYXApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgZihsYW1iZGEgeDp4LCBbXSkubmV4dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIGYobGFtYmRhIHg6eCwgU3RvcE5vdygpKS5uZXh0KQorCitjbGFzcyBUZXN0RXhhbXBsZXModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY2hhaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuam9pbihjaGFpbignQUJDJywgJ0RFRicpKSwgJ0FCQ0RFRicpCisKKyAgICBkZWYgdGVzdF9jaGFpbl9mcm9tX2l0ZXJhYmxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmpvaW4oY2hhaW4uZnJvbV9pdGVyYWJsZShbJ0FCQycsICdERUYnXSkpLCAnQUJDREVGJykKKworICAgIGRlZiB0ZXN0X2NvbWJpbmF0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbWJpbmF0aW9ucygnQUJDRCcsIDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKCdBJywnQicpLCAoJ0EnLCdDJyksICgnQScsJ0QnKSwgKCdCJywnQycpLCAoJ0InLCdEJyksICgnQycsJ0QnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb21iaW5hdGlvbnMocmFuZ2UoNCksIDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKDAsMSwyKSwgKDAsMSwzKSwgKDAsMiwzKSwgKDEsMiwzKV0pCisKKyAgICBkZWYgdGVzdF9jb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KCdBQkMnLCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygnQScsJ0EnKSwgKCdBJywnQicpLCAoJ0EnLCdDJyksICgnQicsJ0InKSwgKCdCJywnQycpLCAoJ0MnLCdDJyldKQorCisgICAgZGVmIHRlc3RfY29tcHJlc3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb21wcmVzcygnQUJDREVGJywgWzEsMCwxLDAsMSwxXSkpLCBsaXN0KCdBQ0VGJykpCisKKyAgICBkZWYgdGVzdF9jb3VudChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlzbGljZShjb3VudCgxMCksIDUpKSwgWzEwLCAxMSwgMTIsIDEzLCAxNF0pCisKKyAgICBkZWYgdGVzdF9jeWNsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlzbGljZShjeWNsZSgnQUJDRCcpLCAxMikpLCBsaXN0KCdBQkNEQUJDREFCQ0QnKSkKKworICAgIGRlZiB0ZXN0X2Ryb3B3aGlsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGRyb3B3aGlsZShsYW1iZGEgeDogeDw1LCBbMSw0LDYsNCwxXSkpLCBbNiw0LDFdKQorCisgICAgZGVmIHRlc3RfZ3JvdXBieShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbayBmb3IgaywgZyBpbiBncm91cGJ5KCdBQUFBQkJCQ0NEQUFCQkInKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCgnQUJDREFCJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhsaXN0KGcpKSBmb3IgaywgZyBpbiBncm91cGJ5KCdBQUFBQkJCQ0NEJyldLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtsaXN0KCdBQUFBJyksIGxpc3QoJ0JCQicpLCBsaXN0KCdDQycpLCBsaXN0KCdEJyldKQorCisgICAgZGVmIHRlc3RfaWZpbHRlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlmaWx0ZXIobGFtYmRhIHg6IHglMiwgcmFuZ2UoMTApKSksIFsxLDMsNSw3LDldKQorCisgICAgZGVmIHRlc3RfaWZpbHRlcmZhbHNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaWZpbHRlcmZhbHNlKGxhbWJkYSB4OiB4JTIsIHJhbmdlKDEwKSkpLCBbMCwyLDQsNiw4XSkKKworICAgIGRlZiB0ZXN0X2ltYXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpbWFwKHBvdywgKDIsMywxMCksICg1LDIsMykpKSwgWzMyLCA5LCAxMDAwXSkKKworICAgIGRlZiB0ZXN0X2lzbGljZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlzbGljZSgnQUJDREVGRycsIDIpKSwgbGlzdCgnQUInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlzbGljZSgnQUJDREVGRycsIDIsIDQpKSwgbGlzdCgnQ0QnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlzbGljZSgnQUJDREVGRycsIDIsIE5vbmUpKSwgbGlzdCgnQ0RFRkcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlzbGljZSgnQUJDREVGRycsIDAsIE5vbmUsIDIpKSwgbGlzdCgnQUNFRycpKQorCisgICAgZGVmIHRlc3RfaXppcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXAoJ0FCQ0QnLCAneHknKSksIFsoJ0EnLCAneCcpLCAoJ0InLCAneScpXSkKKworICAgIGRlZiB0ZXN0X2l6aXBfbG9uZ2VzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXBfbG9uZ2VzdCgnQUJDRCcsICd4eScsIGZpbGx2YWx1ZT0nLScpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKCdBJywgJ3gnKSwgKCdCJywgJ3knKSwgKCdDJywgJy0nKSwgKCdEJywgJy0nKV0pCisKKyAgICBkZWYgdGVzdF9wZXJtdXRhdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwZXJtdXRhdGlvbnMoJ0FCQ0QnLCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKHR1cGxlLCAnQUIgQUMgQUQgQkEgQkMgQkQgQ0EgQ0IgQ0QgREEgREIgREMnLnNwbGl0KCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocGVybXV0YXRpb25zKHJhbmdlKDMpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygwLDEsMiksICgwLDIsMSksICgxLDAsMiksICgxLDIsMCksICgyLDAsMSksICgyLDEsMCldKQorCisgICAgZGVmIHRlc3RfcHJvZHVjdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHByb2R1Y3QoJ0FCQ0QnLCAneHknKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKHR1cGxlLCAnQXggQXkgQnggQnkgQ3ggQ3kgRHggRHknLnNwbGl0KCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocHJvZHVjdChyYW5nZSgyKSwgcmVwZWF0PTMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoMCwwLDApLCAoMCwwLDEpLCAoMCwxLDApLCAoMCwxLDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgxLDAsMCksICgxLDAsMSksICgxLDEsMCksICgxLDEsMSldKQorCisgICAgZGVmIHRlc3RfcmVwZWF0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmVwZWF0KDEwLCAzKSksIFsxMCwgMTAsIDEwXSkKKworICAgIGRlZiB0ZXN0X3N0YXBtYXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdGFybWFwKHBvdywgWygyLDUpLCAoMywyKSwgKDEwLDMpXSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFszMiwgOSwgMTAwMF0pCisKKyAgICBkZWYgdGVzdF90YWtld2hpbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh0YWtld2hpbGUobGFtYmRhIHg6IHg8NSwgWzEsNCw2LDQsMV0pKSwgWzEsNF0pCisKKworY2xhc3MgVGVzdEdDKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBtYWtlY3ljbGUoc2VsZiwgaXRlcmF0b3IsIGNvbnRhaW5lcik6CisgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoaXRlcmF0b3IpCisgICAgICAgIGl0ZXJhdG9yLm5leHQoKQorICAgICAgICBkZWwgY29udGFpbmVyLCBpdGVyYXRvcgorCisgICAgZGVmIHRlc3RfY2hhaW4oc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShjaGFpbihhKSwgYSkKKworICAgIGRlZiB0ZXN0X2NoYWluX2Zyb21faXRlcmFibGUoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShjaGFpbi5mcm9tX2l0ZXJhYmxlKFthXSksIGEpCisKKyAgICBkZWYgdGVzdF9jb21iaW5hdGlvbnMoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShjb21iaW5hdGlvbnMoWzEsMixhLDNdLCAzKSwgYSkKKworICAgIGRlZiB0ZXN0X2NvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoWzEsMixhLDNdLCAzKSwgYSkKKworICAgIGRlZiB0ZXN0X2NvbXByZXNzKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoY29tcHJlc3MoJ0FCQ0RFRicsIFsxLDAsMSwwLDEsMF0pLCBhKQorCisgICAgZGVmIHRlc3RfY291bnQoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBJbnQgPSB0eXBlKCdJbnQnLCAoaW50LCksIGRpY3QoeD1hKSkKKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoY291bnQoSW50KDApLCBJbnQoMSkpLCBhKQorCisgICAgZGVmIHRlc3RfY3ljbGUoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShjeWNsZShbYV0qMiksIGEpCisKKyAgICBkZWYgdGVzdF9kcm9wd2hpbGUoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShkcm9wd2hpbGUoYm9vbCwgWzAsIGEsIGFdKSwgYSkKKworICAgIGRlZiB0ZXN0X2dyb3VwYnkoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShncm91cGJ5KFthXSoyLCBsYW1iZGEgeDp4KSwgYSkKKworICAgIGRlZiB0ZXN0X2lzc3VlMjI0NihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAyMjQ2IC0tIHRoZSBfZ3JvdXBlciBpdGVyYXRvciB3YXMgbm90IGluY2x1ZGVkIGluIEdDCisgICAgICAgIG4gPSAxMAorICAgICAgICBrZXlmdW5jID0gbGFtYmRhIHg6IHgKKyAgICAgICAgZm9yIGksIGogaW4gZ3JvdXBieSh4cmFuZ2UobiksIGtleT1rZXlmdW5jKToKKyAgICAgICAgICAgIGtleWZ1bmMuX19kaWN0X18uc2V0ZGVmYXVsdCgneCcsW10pLmFwcGVuZChqKQorCisgICAgZGVmIHRlc3RfaWZpbHRlcihzZWxmKToKKyAgICAgICAgYSA9IFtdCisgICAgICAgIHNlbGYubWFrZWN5Y2xlKGlmaWx0ZXIobGFtYmRhIHg6VHJ1ZSwgW2FdKjIpLCBhKQorCisgICAgZGVmIHRlc3RfaWZpbHRlcmZhbHNlKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoaWZpbHRlcmZhbHNlKGxhbWJkYSB4OkZhbHNlLCBhKSwgYSkKKworICAgIGRlZiB0ZXN0X2l6aXAoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShpemlwKFthXSoyLCBbYV0qMyksIGEpCisKKyAgICBkZWYgdGVzdF9pemlwX2xvbmdlc3Qoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShpemlwX2xvbmdlc3QoW2FdKjIsIFthXSozKSwgYSkKKyAgICAgICAgYiA9IFthLCBOb25lXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShpemlwX2xvbmdlc3QoW2FdKjIsIFthXSozLCBmaWxsdmFsdWU9YiksIGEpCisKKyAgICBkZWYgdGVzdF9pbWFwKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoaW1hcChsYW1iZGEgeDp4LCBbYV0qMiksIGEpCisKKyAgICBkZWYgdGVzdF9pc2xpY2Uoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShpc2xpY2UoW2FdKjIsIE5vbmUpLCBhKQorCisgICAgZGVmIHRlc3RfcGVybXV0YXRpb25zKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUocGVybXV0YXRpb25zKFsxLDIsYSwzXSwgMyksIGEpCisKKyAgICBkZWYgdGVzdF9wcm9kdWN0KHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUocHJvZHVjdChbMSwyLGEsM10sIHJlcGVhdD0zKSwgYSkKKworICAgIGRlZiB0ZXN0X3JlcGVhdChzZWxmKToKKyAgICAgICAgYSA9IFtdCisgICAgICAgIHNlbGYubWFrZWN5Y2xlKHJlcGVhdChhKSwgYSkKKworICAgIGRlZiB0ZXN0X3N0YXJtYXAoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShzdGFybWFwKGxhbWJkYSAqdDogdCwgWyhhLGEpXSoyKSwgYSkKKworICAgIGRlZiB0ZXN0X3Rha2V3aGlsZShzZWxmKToKKyAgICAgICAgYSA9IFtdCisgICAgICAgIHNlbGYubWFrZWN5Y2xlKHRha2V3aGlsZShib29sLCBbMSwgMCwgYSwgYV0pLCBhKQorCitkZWYgUihzZXFuKToKKyAgICAnUmVndWxhciBnZW5lcmF0b3InCisgICAgZm9yIGkgaW4gc2VxbjoKKyAgICAgICAgeWllbGQgaQorCitjbGFzcyBHOgorICAgICdTZXF1ZW5jZSB1c2luZyBfX2dldGl0ZW1fXycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgIHJldHVybiBzZWxmLnNlcW5baV0KKworY2xhc3MgSToKKyAgICAnU2VxdWVuY2UgdXNpbmcgaXRlcmF0b3IgcHJvdG9jb2wnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaSA+PSBsZW4oc2VsZi5zZXFuKTogcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICB2ID0gc2VsZi5zZXFuW3NlbGYuaV0KKyAgICAgICAgc2VsZi5pICs9IDEKKyAgICAgICAgcmV0dXJuIHYKKworY2xhc3MgSWc6CisgICAgJ1NlcXVlbmNlIHVzaW5nIGl0ZXJhdG9yIHByb3RvY29sIGRlZmluZWQgd2l0aCBhIGdlbmVyYXRvcicKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgZm9yIHZhbCBpbiBzZWxmLnNlcW46CisgICAgICAgICAgICB5aWVsZCB2YWwKKworY2xhc3MgWDoKKyAgICAnTWlzc2luZyBfX2dldGl0ZW1fXyBhbmQgX19pdGVyX18nCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pID49IGxlbihzZWxmLnNlcW4pOiByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHYgPSBzZWxmLnNlcW5bc2VsZi5pXQorICAgICAgICBzZWxmLmkgKz0gMQorICAgICAgICByZXR1cm4gdgorCitjbGFzcyBOOgorICAgICdJdGVyYXRvciBtaXNzaW5nIG5leHQoKScKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworY2xhc3MgRToKKyAgICAnVGVzdCBwcm9wYWdhdGlvbiBvZiBleGNlcHRpb25zJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAzIC8vIDAKKworY2xhc3MgUzoKKyAgICAnVGVzdCBpbW1lZGlhdGUgc3RvcCcKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHBhc3MKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworZGVmIEwoc2Vxbik6CisgICAgJ1Rlc3QgbXVsdGlwbGUgdGllcnMgb2YgaXRlcmF0b3JzJworICAgIHJldHVybiBjaGFpbihpbWFwKGxhbWJkYSB4OngsIFIoSWcoRyhzZXFuKSkpKSkKKworCitjbGFzcyBUZXN0VmFyaW91c0l0ZXJhdG9yQXJncyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jaGFpbihzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gKCIxMjMiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNoYWluKGcocykpKSwgbGlzdChnKHMpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY2hhaW4oZyhzKSwgZyhzKSkpLCBsaXN0KGcocykpK2xpc3QoZyhzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIGNoYWluKFgocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBjaGFpbihOKHMpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsaXN0LCBjaGFpbihFKHMpKSkKKworICAgIGRlZiB0ZXN0X2NvbXByZXNzKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAoIjEyMyIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSkpOgorICAgICAgICAgICAgbiA9IGxlbihzKQorICAgICAgICAgICAgZm9yIGcgaW4gKEcsIEksIElnLCBTLCBMLCBSKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY29tcHJlc3MoZyhzKSwgcmVwZWF0KDEpKSksIGxpc3QoZyhzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXByZXNzLCBYKHMpLCByZXBlYXQoMSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIGNvbXByZXNzKE4ocyksIHJlcGVhdCgxKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgbGlzdCwgY29tcHJlc3MoRShzKSwgcmVwZWF0KDEpKSkKKworICAgIGRlZiB0ZXN0X3Byb2R1Y3Qoc2VsZik6CisgICAgICAgIGZvciBzIGluICgiMTIzIiwgIiIsIHJhbmdlKDEwMDApLCAoJ2RvJywgMS4yKSwgeHJhbmdlKDIwMDAsMjIwMCw1KSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb2R1Y3QsIFgocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb2R1Y3QsIE4ocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgcHJvZHVjdCwgRShzKSkKKworICAgIGRlZiB0ZXN0X2N5Y2xlKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAoIjEyMyIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSkpOgorICAgICAgICAgICAgZm9yIGcgaW4gKEcsIEksIElnLCBTLCBMLCBSKToKKyAgICAgICAgICAgICAgICB0Z3RsZW4gPSBsZW4ocykgKiAzCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsaXN0KGcocykpKjMKKyAgICAgICAgICAgICAgICBhY3R1YWwgPSBsaXN0KGlzbGljZShjeWNsZShnKHMpKSwgdGd0bGVuKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN5Y2xlLCBYKHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBjeWNsZShOKHMpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsaXN0LCBjeWNsZShFKHMpKSkKKworICAgIGRlZiB0ZXN0X2dyb3VwYnkoc2VsZik6CisgICAgICAgIGZvciBzIGluIChyYW5nZSgxMCksIHJhbmdlKDApLCByYW5nZSgxMDAwKSwgKDcsMTEpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbayBmb3Igaywgc2IgaW4gZ3JvdXBieShnKHMpKV0sIGxpc3QoZyhzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdyb3VwYnksIFgocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIGdyb3VwYnkoTihzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgbGlzdCwgZ3JvdXBieShFKHMpKSkKKworICAgIGRlZiB0ZXN0X2lmaWx0ZXIoc2VsZik6CisgICAgICAgIGZvciBzIGluIChyYW5nZSgxMCksIHJhbmdlKDApLCByYW5nZSgxMDAwKSwgKDcsMTEpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlmaWx0ZXIoaXNFdmVuLCBnKHMpKSksIGZpbHRlcihpc0V2ZW4sIGcocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpZmlsdGVyLCBpc0V2ZW4sIFgocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIGlmaWx0ZXIoaXNFdmVuLCBOKHMpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsaXN0LCBpZmlsdGVyKGlzRXZlbiwgRShzKSkpCisKKyAgICBkZWYgdGVzdF9pZmlsdGVyZmFsc2Uoc2VsZik6CisgICAgICAgIGZvciBzIGluIChyYW5nZSgxMCksIHJhbmdlKDApLCByYW5nZSgxMDAwKSwgKDcsMTEpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlmaWx0ZXJmYWxzZShpc0V2ZW4sIGcocykpKSwgZmlsdGVyKGlzT2RkLCBnKHMpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaWZpbHRlcmZhbHNlLCBpc0V2ZW4sIFgocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIGlmaWx0ZXJmYWxzZShpc0V2ZW4sIE4ocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGxpc3QsIGlmaWx0ZXJmYWxzZShpc0V2ZW4sIEUocykpKQorCisgICAgZGVmIHRlc3RfaXppcChzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gKCIxMjMiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXAoZyhzKSkpLCB6aXAoZyhzKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXAoZyhzKSwgZyhzKSkpLCB6aXAoZyhzKSwgZyhzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGl6aXAsIFgocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIGl6aXAoTihzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgbGlzdCwgaXppcChFKHMpKSkKKworICAgIGRlZiB0ZXN0X2l6aXBsb25nZXN0KHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAoIjEyMyIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSkpOgorICAgICAgICAgICAgZm9yIGcgaW4gKEcsIEksIElnLCBTLCBMLCBSKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcF9sb25nZXN0KGcocykpKSwgemlwKGcocykpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpemlwX2xvbmdlc3QoZyhzKSwgZyhzKSkpLCB6aXAoZyhzKSwgZyhzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGl6aXBfbG9uZ2VzdCwgWChzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCwgaXppcF9sb25nZXN0KE4ocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGxpc3QsIGl6aXBfbG9uZ2VzdChFKHMpKSkKKworICAgIGRlZiB0ZXN0X2ltYXAoc2VsZik6CisgICAgICAgIGZvciBzIGluIChyYW5nZSgxMCksIHJhbmdlKDApLCByYW5nZSgxMDApLCAoNywxMSksIHhyYW5nZSgyMCw1MCw1KSk6CisgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIFMsIEwsIFIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpbWFwKG9uZWFyZywgZyhzKSkpLCBtYXAob25lYXJnLCBnKHMpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaW1hcChvcGVyYXRvci5wb3csIGcocyksIGcocykpKSwgbWFwKG9wZXJhdG9yLnBvdywgZyhzKSwgZyhzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGltYXAsIG9uZWFyZywgWChzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCwgaW1hcChvbmVhcmcsIE4ocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGxpc3QsIGltYXAob25lYXJnLCBFKHMpKSkKKworICAgIGRlZiB0ZXN0X2lzbGljZShzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gKCIxMjM0NSIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSkpOgorICAgICAgICAgICAgZm9yIGcgaW4gKEcsIEksIElnLCBTLCBMLCBSKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXNsaWNlKGcocyksMSxOb25lLDIpKSwgbGlzdChnKHMpKVsxOjoyXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXNsaWNlLCBYKHMpLCAxMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCwgaXNsaWNlKE4ocyksIDEwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsaXN0LCBpc2xpY2UoRShzKSwgMTApKQorCisgICAgZGVmIHRlc3Rfc3Rhcm1hcChzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gKHJhbmdlKDEwKSwgcmFuZ2UoMCksIHJhbmdlKDEwMCksICg3LDExKSwgeHJhbmdlKDIwLDUwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgc3MgPSB6aXAocywgcykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3Rhcm1hcChvcGVyYXRvci5wb3csIGcoc3MpKSksIG1hcChvcGVyYXRvci5wb3csIGcocyksIGcocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdGFybWFwLCBvcGVyYXRvci5wb3csIFgoc3MpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBzdGFybWFwKG9wZXJhdG9yLnBvdywgTihzcykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGxpc3QsIHN0YXJtYXAob3BlcmF0b3IucG93LCBFKHNzKSkpCisKKyAgICBkZWYgdGVzdF90YWtld2hpbGUoc2VsZik6CisgICAgICAgIGZvciBzIGluIChyYW5nZSgxMCksIHJhbmdlKDApLCByYW5nZSgxMDAwKSwgKDcsMTEpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgdGd0ID0gW10KKyAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBnKHMpOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNFdmVuKGVsZW0pOiBicmVhaworICAgICAgICAgICAgICAgICAgICB0Z3QuYXBwZW5kKGVsZW0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHRha2V3aGlsZShpc0V2ZW4sIGcocykpKSwgdGd0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0YWtld2hpbGUsIGlzRXZlbiwgWChzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCwgdGFrZXdoaWxlKGlzRXZlbiwgTihzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgbGlzdCwgdGFrZXdoaWxlKGlzRXZlbiwgRShzKSkpCisKKyAgICBkZWYgdGVzdF9kcm9wd2hpbGUoc2VsZik6CisgICAgICAgIGZvciBzIGluIChyYW5nZSgxMCksIHJhbmdlKDApLCByYW5nZSgxMDAwKSwgKDcsMTEpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgdGd0ID0gW10KKyAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBnKHMpOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgdGd0IGFuZCBpc09kZChlbGVtKTogY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgdGd0LmFwcGVuZChlbGVtKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkcm9wd2hpbGUoaXNPZGQsIGcocykpKSwgdGd0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkcm9wd2hpbGUsIGlzT2RkLCBYKHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBkcm9wd2hpbGUoaXNPZGQsIE4ocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGxpc3QsIGRyb3B3aGlsZShpc09kZCwgRShzKSkpCisKKyAgICBkZWYgdGVzdF90ZWUoc2VsZik6CisgICAgICAgIGZvciBzIGluICgiMTIzIiwgIiIsIHJhbmdlKDEwMDApLCAoJ2RvJywgMS4yKSwgeHJhbmdlKDIwMDAsMjIwMCw1KSk6CisgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIFMsIEwsIFIpOgorICAgICAgICAgICAgICAgIGl0MSwgaXQyID0gdGVlKGcocykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0MSksIGxpc3QoZyhzKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0MiksIGxpc3QoZyhzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRlZSwgWChzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCwgdGVlKE4ocykpWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGxpc3QsIHRlZShFKHMpKVswXSkKKworY2xhc3MgTGVuZ3RoVHJhbnNwYXJlbmN5KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3JlcGVhdChzZWxmKToKKyAgICAgICAgZnJvbSB0ZXN0LnRlc3RfaXRlcmxlbiBpbXBvcnQgbGVuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcGVhdChOb25lLCA1MCkpLCA1MCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsZW4sIHJlcGVhdChOb25lKSkKKworY2xhc3MgUmVncmVzc2lvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3NmXzc5MzgyNihzZWxmKToKKyAgICAgICAgIyBGaXggQXJtaW4gUmlnbydzIHN1Y2Nlc3NmdWwgZWZmb3J0cyB0byB3cmVhayBoYXZvYworCisgICAgICAgIGRlZiBtdXRhdGluZ3R1cGxlKHR1cGxlMSwgZiwgdHVwbGUyKToKKyAgICAgICAgICAgICMgdGhpcyBidWlsZHMgYSB0dXBsZSB0IHdoaWNoIGlzIGEgY29weSBvZiB0dXBsZTEsCisgICAgICAgICAgICAjIHRoZW4gY2FsbHMgZih0KSwgdGhlbiBtdXRhdGVzIHQgdG8gYmUgZXF1YWwgdG8gdHVwbGUyCisgICAgICAgICAgICAjIChuZWVkcyBsZW4odHVwbGUxKSA9PSBsZW4odHVwbGUyKSkuCisgICAgICAgICAgICBkZWYgZyh2YWx1ZSwgZmlyc3Q9WzFdKToKKyAgICAgICAgICAgICAgICBpZiBmaXJzdDoKKyAgICAgICAgICAgICAgICAgICAgZGVsIGZpcnN0WzpdCisgICAgICAgICAgICAgICAgICAgIGYoei5uZXh0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgICAgICBpdGVtcyA9IGxpc3QodHVwbGUyKQorICAgICAgICAgICAgaXRlbXNbMToxXSA9IGxpc3QodHVwbGUxKQorICAgICAgICAgICAgZ2VuID0gaW1hcChnLCBpdGVtcykKKyAgICAgICAgICAgIHogPSBpemlwKCpbZ2VuXSpsZW4odHVwbGUxKSkKKyAgICAgICAgICAgIHoubmV4dCgpCisKKyAgICAgICAgZGVmIGYodCk6CisgICAgICAgICAgICBnbG9iYWwgVAorICAgICAgICAgICAgVCA9IHQKKyAgICAgICAgICAgIGZpcnN0WzpdID0gbGlzdChUKQorCisgICAgICAgIGZpcnN0ID0gW10KKyAgICAgICAgbXV0YXRpbmd0dXBsZSgoMSwyLDMpLCBmLCAoNCw1LDYpKQorICAgICAgICBzZWNvbmQgPSBsaXN0KFQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3QsIHNlY29uZCkKKworCisgICAgZGVmIHRlc3Rfc2ZfOTUwMDU3KHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGNoYWluKCkgYW5kIGN5Y2xlKCkgY2F0Y2ggZXhjZXB0aW9ucyBpbW1lZGlhdGVseQorICAgICAgICAjIHJhdGhlciB0aGFuIHdoZW4gc2hpZnRpbmcgYmV0d2VlbiBpbnB1dCBzb3VyY2VzCisKKyAgICAgICAgZGVmIGdlbjEoKToKKyAgICAgICAgICAgIGhpc3QuYXBwZW5kKDApCisgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgICAgICBoaXN0LmFwcGVuZCgxKQorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKyAgICAgICAgICAgIGhpc3QuYXBwZW5kKDIpCisKKyAgICAgICAgZGVmIGdlbjIoeCk6CisgICAgICAgICAgICBoaXN0LmFwcGVuZCgzKQorICAgICAgICAgICAgeWllbGQgMgorICAgICAgICAgICAgaGlzdC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGlmIHg6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCisgICAgICAgIGhpc3QgPSBbXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgbGlzdCwgY2hhaW4oZ2VuMSgpLCBnZW4yKEZhbHNlKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGlzdCwgWzAsMV0pCisKKyAgICAgICAgaGlzdCA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBsaXN0LCBjaGFpbihnZW4xKCksIGdlbjIoVHJ1ZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhpc3QsIFswLDFdKQorCisgICAgICAgIGhpc3QgPSBbXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgbGlzdCwgY3ljbGUoZ2VuMSgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoaXN0LCBbMCwxXSkKKworY2xhc3MgU3ViY2xhc3NXaXRoS3dhcmdzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfa2V5d29yZHNfaW5fc3ViY2xhc3Moc2VsZik6CisgICAgICAgICMgY291bnQgaXMgbm90IHN1YmNsYXNzYWJsZS4uLgorICAgICAgICBmb3IgY2xzIGluIChyZXBlYXQsIGl6aXAsIGlmaWx0ZXIsIGlmaWx0ZXJmYWxzZSwgY2hhaW4sIGltYXAsCisgICAgICAgICAgICAgICAgICAgIHN0YXJtYXAsIGlzbGljZSwgdGFrZXdoaWxlLCBkcm9wd2hpbGUsIGN5Y2xlLCBjb21wcmVzcyk6CisgICAgICAgICAgICBjbGFzcyBTdWJjbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuZXdhcmc9Tm9uZSwgKmFyZ3MpOgorICAgICAgICAgICAgICAgICAgICBjbHMuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgU3ViY2xhc3MobmV3YXJnPTEpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgIyB3ZSBleHBlY3QgdHlwZSBlcnJvcnMgYmVjYXVzZSBvZiB3cm9uZyBhcmd1bWVudCBjb3VudAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oImRvZXMgbm90IHRha2Uga2V5d29yZCBhcmd1bWVudHMiLCBlcnIuYXJnc1swXSkKKworCitsaWJyZWZ0ZXN0ID0gIiIiIERvY3Rlc3QgZm9yIGV4YW1wbGVzIGluIHRoZSBsaWJyYXJ5IHJlZmVyZW5jZTogbGliaXRlcnRvb2xzLnRleAorCisKKz4+PiBhbW91bnRzID0gWzEyMC4xNSwgNzY0LjA1LCA4MjMuMTRdCis+Pj4gZm9yIGNoZWNrbnVtLCBhbW91bnQgaW4gaXppcChjb3VudCgxMjAwKSwgYW1vdW50cyk6CisuLi4gICAgIHByaW50ICdDaGVjayAlZCBpcyBmb3IgJCUuMmYnICUgKGNoZWNrbnVtLCBhbW91bnQpCisuLi4KK0NoZWNrIDEyMDAgaXMgZm9yICQxMjAuMTUKK0NoZWNrIDEyMDEgaXMgZm9yICQ3NjQuMDUKK0NoZWNrIDEyMDIgaXMgZm9yICQ4MjMuMTQKKworPj4+IGltcG9ydCBvcGVyYXRvcgorPj4+IGZvciBjdWJlIGluIGltYXAob3BlcmF0b3IucG93LCB4cmFuZ2UoMSw0KSwgcmVwZWF0KDMpKToKKy4uLiAgICBwcmludCBjdWJlCisuLi4KKzEKKzgKKzI3CisKKz4+PiByZXBvcnRsaW5lcyA9IFsnRXVyb1B5dGhvbicsICdSb3N0ZXInLCAnJywgJ2FsZXgnLCAnJywgJ2xhdXJhJywgJycsICdtYXJ0aW4nLCAnJywgJ3dhbHRlcicsICcnLCAnc2FtdWVsZSddCis+Pj4gZm9yIG5hbWUgaW4gaXNsaWNlKHJlcG9ydGxpbmVzLCAzLCBOb25lLCAyKToKKy4uLiAgICBwcmludCBuYW1lLnRpdGxlKCkKKy4uLgorQWxleAorTGF1cmEKK01hcnRpbgorV2FsdGVyCitTYW11ZWxlCisKKz4+PiBmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyCis+Pj4gZCA9IGRpY3QoYT0xLCBiPTIsIGM9MSwgZD0yLCBlPTEsIGY9MiwgZz0zKQorPj4+IGRpID0gc29ydGVkKHNvcnRlZChkLml0ZXJpdGVtcygpKSwga2V5PWl0ZW1nZXR0ZXIoMSkpCis+Pj4gZm9yIGssIGcgaW4gZ3JvdXBieShkaSwgaXRlbWdldHRlcigxKSk6CisuLi4gICAgIHByaW50IGssIG1hcChpdGVtZ2V0dGVyKDApLCBnKQorLi4uCisxIFsnYScsICdjJywgJ2UnXQorMiBbJ2InLCAnZCcsICdmJ10KKzMgWydnJ10KKworIyBGaW5kIHJ1bnMgb2YgY29uc2VjdXRpdmUgbnVtYmVycyB1c2luZyBncm91cGJ5LiAgVGhlIGtleSB0byB0aGUgc29sdXRpb24KKyMgaXMgZGlmZmVyZW5jaW5nIHdpdGggYSByYW5nZSBzbyB0aGF0IGNvbnNlY3V0aXZlIG51bWJlcnMgYWxsIGFwcGVhciBpbgorIyBzYW1lIGdyb3VwLgorPj4+IGRhdGEgPSBbIDEsICA0LDUsNiwgMTAsIDE1LDE2LDE3LDE4LCAyMiwgMjUsMjYsMjcsMjhdCis+Pj4gZm9yIGssIGcgaW4gZ3JvdXBieShlbnVtZXJhdGUoZGF0YSksIGxhbWJkYSB0OnRbMF0tdFsxXSk6CisuLi4gICAgIHByaW50IG1hcChvcGVyYXRvci5pdGVtZ2V0dGVyKDEpLCBnKQorLi4uCitbMV0KK1s0LCA1LCA2XQorWzEwXQorWzE1LCAxNiwgMTcsIDE4XQorWzIyXQorWzI1LCAyNiwgMjcsIDI4XQorCis+Pj4gZGVmIHRha2UobiwgaXRlcmFibGUpOgorLi4uICAgICAiUmV0dXJuIGZpcnN0IG4gaXRlbXMgb2YgdGhlIGl0ZXJhYmxlIGFzIGEgbGlzdCIKKy4uLiAgICAgcmV0dXJuIGxpc3QoaXNsaWNlKGl0ZXJhYmxlLCBuKSkKKworPj4+IGRlZiBlbnVtZXJhdGUoaXRlcmFibGUsIHN0YXJ0PTApOgorLi4uICAgICByZXR1cm4gaXppcChjb3VudChzdGFydCksIGl0ZXJhYmxlKQorCis+Pj4gZGVmIHRhYnVsYXRlKGZ1bmN0aW9uLCBzdGFydD0wKToKKy4uLiAgICAgIlJldHVybiBmdW5jdGlvbigwKSwgZnVuY3Rpb24oMSksIC4uLiIKKy4uLiAgICAgcmV0dXJuIGltYXAoZnVuY3Rpb24sIGNvdW50KHN0YXJ0KSkKKworPj4+IGRlZiBudGgoaXRlcmFibGUsIG4sIGRlZmF1bHQ9Tm9uZSk6CisuLi4gICAgICJSZXR1cm5zIHRoZSBudGggaXRlbSBvciBhIGRlZmF1bHQgdmFsdWUiCisuLi4gICAgIHJldHVybiBuZXh0KGlzbGljZShpdGVyYWJsZSwgbiwgTm9uZSksIGRlZmF1bHQpCisKKz4+PiBkZWYgcXVhbnRpZnkoaXRlcmFibGUsIHByZWQ9Ym9vbCk6CisuLi4gICAgICJDb3VudCBob3cgbWFueSB0aW1lcyB0aGUgcHJlZGljYXRlIGlzIHRydWUiCisuLi4gICAgIHJldHVybiBzdW0oaW1hcChwcmVkLCBpdGVyYWJsZSkpCisKKz4+PiBkZWYgcGFkbm9uZShpdGVyYWJsZSk6CisuLi4gICAgICJSZXR1cm5zIHRoZSBzZXF1ZW5jZSBlbGVtZW50cyBhbmQgdGhlbiByZXR1cm5zIE5vbmUgaW5kZWZpbml0ZWx5IgorLi4uICAgICByZXR1cm4gY2hhaW4oaXRlcmFibGUsIHJlcGVhdChOb25lKSkKKworPj4+IGRlZiBuY3ljbGVzKGl0ZXJhYmxlLCBuKToKKy4uLiAgICAgIlJldHVybnMgdGhlIHNlcXVlbmNlIGVsZW1lbnRzIG4gdGltZXMiCisuLi4gICAgIHJldHVybiBjaGFpbigqcmVwZWF0KGl0ZXJhYmxlLCBuKSkKKworPj4+IGRlZiBkb3Rwcm9kdWN0KHZlYzEsIHZlYzIpOgorLi4uICAgICByZXR1cm4gc3VtKGltYXAob3BlcmF0b3IubXVsLCB2ZWMxLCB2ZWMyKSkKKworPj4+IGRlZiBmbGF0dGVuKGxpc3RPZkxpc3RzKToKKy4uLiAgICAgcmV0dXJuIGxpc3QoY2hhaW4uZnJvbV9pdGVyYWJsZShsaXN0T2ZMaXN0cykpCisKKz4+PiBkZWYgcmVwZWF0ZnVuYyhmdW5jLCB0aW1lcz1Ob25lLCAqYXJncyk6CisuLi4gICAgICJSZXBlYXQgY2FsbHMgdG8gZnVuYyB3aXRoIHNwZWNpZmllZCBhcmd1bWVudHMuIgorLi4uICAgICAiICAgRXhhbXBsZTogIHJlcGVhdGZ1bmMocmFuZG9tLnJhbmRvbSkiCisuLi4gICAgIGlmIHRpbWVzIGlzIE5vbmU6CisuLi4gICAgICAgICByZXR1cm4gc3Rhcm1hcChmdW5jLCByZXBlYXQoYXJncykpCisuLi4gICAgIGVsc2U6CisuLi4gICAgICAgICByZXR1cm4gc3Rhcm1hcChmdW5jLCByZXBlYXQoYXJncywgdGltZXMpKQorCis+Pj4gZGVmIHBhaXJ3aXNlKGl0ZXJhYmxlKToKKy4uLiAgICAgInMgLT4gKHMwLHMxKSwgKHMxLHMyKSwgKHMyLCBzMyksIC4uLiIKKy4uLiAgICAgYSwgYiA9IHRlZShpdGVyYWJsZSkKKy4uLiAgICAgZm9yIGVsZW0gaW4gYjoKKy4uLiAgICAgICAgIGJyZWFrCisuLi4gICAgIHJldHVybiBpemlwKGEsIGIpCisKKz4+PiBkZWYgZ3JvdXBlcihuLCBpdGVyYWJsZSwgZmlsbHZhbHVlPU5vbmUpOgorLi4uICAgICAiZ3JvdXBlcigzLCAnQUJDREVGRycsICd4JykgLS0+IEFCQyBERUYgR3h4IgorLi4uICAgICBhcmdzID0gW2l0ZXIoaXRlcmFibGUpXSAqIG4KKy4uLiAgICAgcmV0dXJuIGl6aXBfbG9uZ2VzdChmaWxsdmFsdWU9ZmlsbHZhbHVlLCAqYXJncykKKworPj4+IGRlZiByb3VuZHJvYmluKCppdGVyYWJsZXMpOgorLi4uICAgICAicm91bmRyb2JpbignQUJDJywgJ0QnLCAnRUYnKSAtLT4gQSBEIEUgQiBGIEMiCisuLi4gICAgICMgUmVjaXBlIGNyZWRpdGVkIHRvIEdlb3JnZSBTYWtraXMKKy4uLiAgICAgcGVuZGluZyA9IGxlbihpdGVyYWJsZXMpCisuLi4gICAgIG5leHRzID0gY3ljbGUoaXRlcihpdCkubmV4dCBmb3IgaXQgaW4gaXRlcmFibGVzKQorLi4uICAgICB3aGlsZSBwZW5kaW5nOgorLi4uICAgICAgICAgdHJ5OgorLi4uICAgICAgICAgICAgIGZvciBuZXh0IGluIG5leHRzOgorLi4uICAgICAgICAgICAgICAgICB5aWVsZCBuZXh0KCkKKy4uLiAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorLi4uICAgICAgICAgICAgIHBlbmRpbmcgLT0gMQorLi4uICAgICAgICAgICAgIG5leHRzID0gY3ljbGUoaXNsaWNlKG5leHRzLCBwZW5kaW5nKSkKKworPj4+IGRlZiBwb3dlcnNldChpdGVyYWJsZSk6CisuLi4gICAgICJwb3dlcnNldChbMSwyLDNdKSAtLT4gKCkgKDEsKSAoMiwpICgzLCkgKDEsMikgKDEsMykgKDIsMykgKDEsMiwzKSIKKy4uLiAgICAgcyA9IGxpc3QoaXRlcmFibGUpCisuLi4gICAgIHJldHVybiBjaGFpbi5mcm9tX2l0ZXJhYmxlKGNvbWJpbmF0aW9ucyhzLCByKSBmb3IgciBpbiByYW5nZShsZW4ocykrMSkpCisKKz4+PiBkZWYgdW5pcXVlX2V2ZXJzZWVuKGl0ZXJhYmxlLCBrZXk9Tm9uZSk6CisuLi4gICAgICJMaXN0IHVuaXF1ZSBlbGVtZW50cywgcHJlc2VydmluZyBvcmRlci4gUmVtZW1iZXIgYWxsIGVsZW1lbnRzIGV2ZXIgc2Vlbi4iCisuLi4gICAgICMgdW5pcXVlX2V2ZXJzZWVuKCdBQUFBQkJCQ0NEQUFCQkInKSAtLT4gQSBCIEMgRAorLi4uICAgICAjIHVuaXF1ZV9ldmVyc2VlbignQUJCQ2NBRCcsIHN0ci5sb3dlcikgLS0+IEEgQiBDIEQKKy4uLiAgICAgc2VlbiA9IHNldCgpCisuLi4gICAgIHNlZW5fYWRkID0gc2Vlbi5hZGQKKy4uLiAgICAgaWYga2V5IGlzIE5vbmU6CisuLi4gICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKKy4uLiAgICAgICAgICAgICBpZiBlbGVtZW50IG5vdCBpbiBzZWVuOgorLi4uICAgICAgICAgICAgICAgICBzZWVuX2FkZChlbGVtZW50KQorLi4uICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtZW50CisuLi4gICAgIGVsc2U6CisuLi4gICAgICAgICBmb3IgZWxlbWVudCBpbiBpdGVyYWJsZToKKy4uLiAgICAgICAgICAgICBrID0ga2V5KGVsZW1lbnQpCisuLi4gICAgICAgICAgICAgaWYgayBub3QgaW4gc2VlbjoKKy4uLiAgICAgICAgICAgICAgICAgc2Vlbl9hZGQoaykKKy4uLiAgICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAorCis+Pj4gZGVmIHVuaXF1ZV9qdXN0c2VlbihpdGVyYWJsZSwga2V5PU5vbmUpOgorLi4uICAgICAiTGlzdCB1bmlxdWUgZWxlbWVudHMsIHByZXNlcnZpbmcgb3JkZXIuIFJlbWVtYmVyIG9ubHkgdGhlIGVsZW1lbnQganVzdCBzZWVuLiIKKy4uLiAgICAgIyB1bmlxdWVfanVzdHNlZW4oJ0FBQUFCQkJDQ0RBQUJCQicpIC0tPiBBIEIgQyBEIEEgQgorLi4uICAgICAjIHVuaXF1ZV9qdXN0c2VlbignQUJCQ2NBRCcsIHN0ci5sb3dlcikgLS0+IEEgQiBDIEEgRAorLi4uICAgICByZXR1cm4gaW1hcChuZXh0LCBpbWFwKGl0ZW1nZXR0ZXIoMSksIGdyb3VwYnkoaXRlcmFibGUsIGtleSkpKQorCitUaGlzIGlzIG5vdCBwYXJ0IG9mIHRoZSBleGFtcGxlcyBidXQgaXQgdGVzdHMgdG8gbWFrZSBzdXJlIHRoZSBkZWZpbml0aW9ucworcGVyZm9ybSBhcyBwdXJwb3J0ZWQuCisKKz4+PiB0YWtlKDEwLCBjb3VudCgpKQorWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisKKz4+PiBsaXN0KGVudW1lcmF0ZSgnYWJjJykpCitbKDAsICdhJyksICgxLCAnYicpLCAoMiwgJ2MnKV0KKworPj4+IGxpc3QoaXNsaWNlKHRhYnVsYXRlKGxhbWJkYSB4OiAyKngpLCA0KSkKK1swLCAyLCA0LCA2XQorCis+Pj4gbnRoKCdhYmNkZScsIDMpCisnZCcKKworPj4+IG50aCgnYWJjZGUnLCA5KSBpcyBOb25lCitUcnVlCisKKz4+PiBxdWFudGlmeSh4cmFuZ2UoOTkpLCBsYW1iZGEgeDogeCUyPT0wKQorNTAKKworPj4+IGEgPSBbWzEsIDIsIDNdLCBbNCwgNSwgNl1dCis+Pj4gZmxhdHRlbihhKQorWzEsIDIsIDMsIDQsIDUsIDZdCisKKz4+PiBsaXN0KHJlcGVhdGZ1bmMocG93LCA1LCAyLCAzKSkKK1s4LCA4LCA4LCA4LCA4XQorCis+Pj4gaW1wb3J0IHJhbmRvbQorPj4+IHRha2UoNSwgaW1hcChpbnQsIHJlcGVhdGZ1bmMocmFuZG9tLnJhbmRvbSkpKQorWzAsIDAsIDAsIDAsIDBdCisKKz4+PiBsaXN0KHBhaXJ3aXNlKCdhYmNkJykpCitbKCdhJywgJ2InKSwgKCdiJywgJ2MnKSwgKCdjJywgJ2QnKV0KKworPj4+IGxpc3QocGFpcndpc2UoW10pKQorW10KKworPj4+IGxpc3QocGFpcndpc2UoJ2EnKSkKK1tdCisKKz4+PiBsaXN0KGlzbGljZShwYWRub25lKCdhYmMnKSwgMCwgNikpCitbJ2EnLCAnYicsICdjJywgTm9uZSwgTm9uZSwgTm9uZV0KKworPj4+IGxpc3QobmN5Y2xlcygnYWJjJywgMykpCitbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ10KKworPj4+IGRvdHByb2R1Y3QoWzEsMiwzXSwgWzQsNSw2XSkKKzMyCisKKz4+PiBsaXN0KGdyb3VwZXIoMywgJ2FiY2RlZmcnLCAneCcpKQorWygnYScsICdiJywgJ2MnKSwgKCdkJywgJ2UnLCAnZicpLCAoJ2cnLCAneCcsICd4JyldCisKKz4+PiBsaXN0KHJvdW5kcm9iaW4oJ2FiYycsICdkJywgJ2VmJykpCitbJ2EnLCAnZCcsICdlJywgJ2InLCAnZicsICdjJ10KKworPj4+IGxpc3QocG93ZXJzZXQoWzEsMiwzXSkpCitbKCksICgxLCksICgyLCksICgzLCksICgxLCAyKSwgKDEsIDMpLCAoMiwgMyksICgxLCAyLCAzKV0KKworPj4+IGFsbChsZW4obGlzdChwb3dlcnNldChyYW5nZShuKSkpKSA9PSAyKipuIGZvciBuIGluIHJhbmdlKDE4KSkKK1RydWUKKworPj4+IGxpc3QocG93ZXJzZXQoJ2FiY2RlJykpID09IHNvcnRlZChzb3J0ZWQoc2V0KHBvd2Vyc2V0KCdhYmNkZScpKSksIGtleT1sZW4pCitUcnVlCisKKz4+PiBsaXN0KHVuaXF1ZV9ldmVyc2VlbignQUFBQUJCQkNDREFBQkJCJykpCitbJ0EnLCAnQicsICdDJywgJ0QnXQorCis+Pj4gbGlzdCh1bmlxdWVfZXZlcnNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpKQorWydBJywgJ0InLCAnQycsICdEJ10KKworPj4+IGxpc3QodW5pcXVlX2p1c3RzZWVuKCdBQUFBQkJCQ0NEQUFCQkInKSkKK1snQScsICdCJywgJ0MnLCAnRCcsICdBJywgJ0InXQorCis+Pj4gbGlzdCh1bmlxdWVfanVzdHNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpKQorWydBJywgJ0InLCAnQycsICdBJywgJ0QnXQorCisiIiIKKworX190ZXN0X18gPSB7J2xpYnJlZnRlc3QnIDogbGlicmVmdGVzdH0KKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3RfY2xhc3NlcyA9IChUZXN0QmFzaWNPcHMsIFRlc3RWYXJpb3VzSXRlcmF0b3JBcmdzLCBUZXN0R0MsCisgICAgICAgICAgICAgICAgICAgIFJlZ3Jlc3Npb25UZXN0cywgTGVuZ3RoVHJhbnNwYXJlbmN5LAorICAgICAgICAgICAgICAgICAgICBTdWJjbGFzc1dpdGhLd2FyZ3NUZXN0LCBUZXN0RXhhbXBsZXMpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorCisgICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCisgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgIGltcG9ydCBnYworICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcHJpbnQgY291bnRzCisKKyAgICAjIGRvY3Rlc3QgdGhlIGV4YW1wbGVzIGluIHRoZSBsaWJyYXJ5IHJlZmVyZW5jZQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdChzeXMubW9kdWxlc1tfX25hbWVfX10sIHZlcmJvc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXJ0b29scy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVydG9vbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ODFiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVydG9vbHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXJ0b29scy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVydG9vbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ODFiMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVydG9vbHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2pzb24ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9qc29uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOGYzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9qc29uLnB5CkBAIC0wLDAgKzEsMTcgQEAKKyIiIlRlc3RzIGZvciBqc29uLgorCitUaGUgdGVzdHMgZm9yIGpzb24gYXJlIGRlZmluZWQgaW4gdGhlIGpzb24udGVzdHMgcGFja2FnZTsKK3RoZSB0ZXN0X3N1aXRlKCkgZnVuY3Rpb24gdGhlcmUgcmV0dXJucyBhIHRlc3Qgc3VpdGUgdGhhdCdzIHJlYWR5IHRvCitiZSBydW4uCisiIiIKKworaW1wb3J0IGpzb24udGVzdHMKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoanNvbi50ZXN0cy50ZXN0X3N1aXRlKCkpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfanNvbi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9qc29uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjBkYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfanNvbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfanNvbi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9qc29uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjBkYzY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfanNvbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfa3F1ZXVlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfa3F1ZXVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOGZmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9rcXVldWUucHkKQEAgLTAsMCArMSwxODcgQEAKKyIiIgorVGVzdHMgZm9yIGtxdWV1ZSB3cmFwcGVyLgorIiIiCitpbXBvcnQgc29ja2V0CitpbXBvcnQgZXJybm8KK2ltcG9ydCB0aW1lCitpbXBvcnQgc2VsZWN0CitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2lmIG5vdCBoYXNhdHRyKHNlbGVjdCwgImtxdWV1ZSIpOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJ0ZXN0IHdvcmtzIG9ubHkgb24gQlNEIikKKworY2xhc3MgVGVzdEtRdWV1ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY3JlYXRlX3F1ZXVlKHNlbGYpOgorICAgICAgICBrcSA9IHNlbGVjdC5rcXVldWUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoa3EuZmlsZW5vKCkgPiAwLCBrcS5maWxlbm8oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBrcS5jbG9zZWQpCisgICAgICAgIGtxLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtxLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwga3EuZmlsZW5vKQorCisgICAgZGVmIHRlc3RfY3JlYXRlX2V2ZW50KHNlbGYpOgorICAgICAgICBmZCA9IHN5cy5zdGRlcnIuZmlsZW5vKCkKKyAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KGZkKQorICAgICAgICBvdGhlciA9IHNlbGVjdC5rZXZlbnQoMTAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5pZGVudCwgZmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZmlsdGVyLCBzZWxlY3QuS1FfRklMVEVSX1JFQUQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZmxhZ3MsIHNlbGVjdC5LUV9FVl9BREQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZmZsYWdzLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmRhdGEsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYudWRhdGEsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYsIGV2KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGV2LCBvdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZXYsIG90aGVyKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldiA8IG90aGVyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3RoZXIgPj0gZXYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCBldiwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIGV2LCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgZXYsICJldiIpCisKKyAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KGZkLCBzZWxlY3QuS1FfRklMVEVSX1dSSVRFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmlkZW50LCBmZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5maWx0ZXIsIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZmxhZ3MsIHNlbGVjdC5LUV9FVl9BREQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZmZsYWdzLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmRhdGEsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYudWRhdGEsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYsIGV2KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGV2LCBvdGhlcikKKworICAgICAgICBldiA9IHNlbGVjdC5rZXZlbnQoZmQsIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUsIHNlbGVjdC5LUV9FVl9PTkVTSE9UKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmlkZW50LCBmZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5maWx0ZXIsIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZmxhZ3MsIHNlbGVjdC5LUV9FVl9PTkVTSE9UKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZmbGFncywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5kYXRhLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LnVkYXRhLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LCBldikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChldiwgb3RoZXIpCisKKyAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KDEsIDIsIDMsIDQsIDUsIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuaWRlbnQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZmlsdGVyLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZsYWdzLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZmbGFncywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5kYXRhLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LnVkYXRhLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LCBldikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChldiwgb3RoZXIpCisKKyAgICAgICAgYmlnbnVtID0gc3lzLm1heHNpemUgKiAyICsgMQorICAgICAgICBldiA9IHNlbGVjdC5rZXZlbnQoYmlnbnVtLCAxLCAyLCAzLCBzeXMubWF4c2l6ZSwgYmlnbnVtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmlkZW50LCBiaWdudW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZmlsdGVyLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZsYWdzLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZmbGFncywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5kYXRhLCBzeXMubWF4c2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi51ZGF0YSwgYmlnbnVtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LCBldikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChldiwgb3RoZXIpCisKKyAgICBkZWYgdGVzdF9xdWV1ZV9ldmVudChzZWxmKToKKyAgICAgICAgc2VydmVyU29ja2V0ID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHNlcnZlclNvY2tldC5iaW5kKCgnMTI3LjAuMC4xJywgMCkpCisgICAgICAgIHNlcnZlclNvY2tldC5saXN0ZW4oMSkKKyAgICAgICAgY2xpZW50ID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIGNsaWVudC5zZXRibG9ja2luZyhGYWxzZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xpZW50LmNvbm5lY3QoKCcxMjcuMC4wLjEnLCBzZXJ2ZXJTb2NrZXQuZ2V0c29ja25hbWUoKVsxXSkpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgZXJybm8uRUlOUFJPR1JFU1MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIkNvbm5lY3Qgc2hvdWxkIGhhdmUgcmFpc2VkIEVJTlBST0dSRVNTIikKKyAgICAgICAgICAgIHBhc3MgIyBGcmVlQlNEIGRvZXNuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIGhlcmUKKyAgICAgICAgc2VydmVyLCBhZGRyID0gc2VydmVyU29ja2V0LmFjY2VwdCgpCisKKyAgICAgICAga3EgPSBzZWxlY3Qua3F1ZXVlKCkKKyAgICAgICAga3EyID0gc2VsZWN0LmtxdWV1ZS5mcm9tZmQoa3EuZmlsZW5vKCkpCisKKyAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KHNlcnZlci5maWxlbm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRVZfQUREIHwgc2VsZWN0LktRX0VWX0VOQUJMRSkKKyAgICAgICAga3EuY29udHJvbChbZXZdLCAwKQorICAgICAgICBldiA9IHNlbGVjdC5rZXZlbnQoc2VydmVyLmZpbGVubygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0ZJTFRFUl9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0VWX0FERCB8IHNlbGVjdC5LUV9FVl9FTkFCTEUpCisgICAgICAgIGtxLmNvbnRyb2woW2V2XSwgMCkKKyAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KGNsaWVudC5maWxlbm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRVZfQUREIHwgc2VsZWN0LktRX0VWX0VOQUJMRSkKKyAgICAgICAga3EyLmNvbnRyb2woW2V2XSwgMCkKKyAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KGNsaWVudC5maWxlbm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9GSUxURVJfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9BREQgfCBzZWxlY3QuS1FfRVZfRU5BQkxFKQorICAgICAgICBrcTIuY29udHJvbChbZXZdLCAwKQorCisgICAgICAgIGV2ZW50cyA9IGtxLmNvbnRyb2woTm9uZSwgNCwgMSkKKyAgICAgICAgZXZlbnRzID0gc2V0KChlLmlkZW50LCBlLmZpbHRlcikgZm9yIGUgaW4gZXZlbnRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgc2V0KFsKKyAgICAgICAgICAgIChjbGllbnQuZmlsZW5vKCksIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUpLAorICAgICAgICAgICAgKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9XUklURSldKSkKKworICAgICAgICBjbGllbnQuc2VuZCgiSGVsbG8hIikKKyAgICAgICAgc2VydmVyLnNlbmQoIndvcmxkISEhIikKKworICAgICAgICAjIFdlIG1heSBuZWVkIHRvIGNhbGwgaXQgc2V2ZXJhbCB0aW1lcworICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBldmVudHMgPSBrcS5jb250cm9sKE5vbmUsIDQsIDEpCisgICAgICAgICAgICBpZiBsZW4oZXZlbnRzKSA9PSA0OgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEuMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgndGltZW91dCB3YWl0aW5nIGZvciBldmVudCBub3RpZmljYXRpb25zJykKKworICAgICAgICBldmVudHMgPSBzZXQoKGUuaWRlbnQsIGUuZmlsdGVyKSBmb3IgZSBpbiBldmVudHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBzZXQoWworICAgICAgICAgICAgKGNsaWVudC5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9XUklURSksCisgICAgICAgICAgICAoY2xpZW50LmZpbGVubygpLCBzZWxlY3QuS1FfRklMVEVSX1JFQUQpLAorICAgICAgICAgICAgKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9XUklURSksCisgICAgICAgICAgICAoc2VydmVyLmZpbGVubygpLCBzZWxlY3QuS1FfRklMVEVSX1JFQUQpXSkpCisKKyAgICAgICAgIyBSZW1vdmUgY29tcGxldGVseSBjbGllbnQsIGFuZCBzZXJ2ZXIgcmVhZCBwYXJ0CisgICAgICAgIGV2ID0gc2VsZWN0LmtldmVudChjbGllbnQuZmlsZW5vKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRklMVEVSX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0VWX0RFTEVURSkKKyAgICAgICAga3EuY29udHJvbChbZXZdLCAwKQorICAgICAgICBldiA9IHNlbGVjdC5rZXZlbnQoY2xpZW50LmZpbGVubygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0ZJTFRFUl9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0VWX0RFTEVURSkKKyAgICAgICAga3EuY29udHJvbChbZXZdLCAwKQorICAgICAgICBldiA9IHNlbGVjdC5rZXZlbnQoc2VydmVyLmZpbGVubygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0ZJTFRFUl9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0VWX0RFTEVURSkKKyAgICAgICAga3EuY29udHJvbChbZXZdLCAwLCAwKQorCisgICAgICAgIGV2ZW50cyA9IGtxLmNvbnRyb2woW10sIDQsIDAuOTkpCisgICAgICAgIGV2ZW50cyA9IHNldCgoZS5pZGVudCwgZS5maWx0ZXIpIGZvciBlIGluIGV2ZW50cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIHNldChbCisgICAgICAgICAgICAoc2VydmVyLmZpbGVubygpLCBzZWxlY3QuS1FfRklMVEVSX1dSSVRFKV0pKQorCisgICAgICAgIGNsaWVudC5jbG9zZSgpCisgICAgICAgIHNlcnZlci5jbG9zZSgpCisgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFBhaXIoc2VsZik6CisgICAgICAgIGtxID0gc2VsZWN0LmtxdWV1ZSgpCisgICAgICAgIGEsIGIgPSBzb2NrZXQuc29ja2V0cGFpcigpCisKKyAgICAgICAgYS5zZW5kKGInZm9vJykKKyAgICAgICAgZXZlbnQxID0gc2VsZWN0LmtldmVudChhLCBzZWxlY3QuS1FfRklMVEVSX1JFQUQsIHNlbGVjdC5LUV9FVl9BREQgfCBzZWxlY3QuS1FfRVZfRU5BQkxFKQorICAgICAgICBldmVudDIgPSBzZWxlY3Qua2V2ZW50KGIsIHNlbGVjdC5LUV9GSUxURVJfUkVBRCwgc2VsZWN0LktRX0VWX0FERCB8IHNlbGVjdC5LUV9FVl9FTkFCTEUpCisgICAgICAgIHIgPSBrcS5jb250cm9sKFtldmVudDEsIGV2ZW50Ml0sIDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJbMF0uZmxhZ3MgJiBzZWxlY3QuS1FfRVZfRVJST1IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yZWN2KHJbMF0uZGF0YSksIGInZm9vJykKKworICAgICAgICBhLmNsb3NlKCkKKyAgICAgICAgYi5jbG9zZSgpCisgICAgICAgIGtxLmNsb3NlKCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdEtRdWV1ZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfa3F1ZXVlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2txdWV1ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5OTFjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2txdWV1ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfa3F1ZXVlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2txdWV1ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5OTFjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2txdWV1ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZGE4ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sYXJnZWZpbGUucHkKQEAgLTAsMCArMSwyMDAgQEAKKyIiIlRlc3QgbGFyZ2VmaWxlIHN1cHBvcnQgb24gc3lzdGVtIHdoZXJlIHRoaXMgbWFrZXMgc2Vuc2UuCisiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgb3MKK2ltcG9ydCBzdGF0CitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgVEVTVEZOLCB2ZXJib3NlLCByZXF1aXJlcywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5saW5rCitpbXBvcnQgaW8gICMgQyBpbXBsZW1lbnRhdGlvbiBvZiBpbworaW1wb3J0IF9weWlvIGFzIHB5aW8gIyBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgaW8KKwordHJ5OgorICAgIGltcG9ydCBzaWduYWwKKyAgICAjIFRoZSBkZWZhdWx0IGhhbmRsZXIgZm9yIFNJR1hGU1ogaXMgdG8gYWJvcnQgdGhlIHByb2Nlc3MuCisgICAgIyBCeSBpZ25vcmluZyBpdCwgc3lzdGVtIGNhbGxzIGV4Y2VlZGluZyB0aGUgZmlsZSBzaXplIHJlc291cmNlCisgICAgIyBsaW1pdCB3aWxsIHJhaXNlIElPRXJyb3IgaW5zdGVhZCBvZiBjcmFzaGluZyB0aGUgaW50ZXJwcmV0ZXIuCisgICAgb2xkaGFuZGxlciA9IHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1hGU1osIHNpZ25hbC5TSUdfSUdOKQorZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgIHBhc3MKKworIyBjcmVhdGUgPjJHQiBmaWxlICgyR0IgPSAyMTQ3NDgzNjQ4IGJ5dGVzKQorc2l6ZSA9IDI1MDAwMDAwMDAKKworCitjbGFzcyBMYXJnZUZpbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgZWFjaCBmaWxlIGZ1bmN0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIGZvciBhIGxhcmdlCisgICAgKGkuZS4gPiAyR0IsIGRvICB3ZSBoYXZlIHRvIGNoZWNrID4gNEdCKSBmaWxlcy4KKworICAgIE5PVEU6IHRoZSBvcmRlciBvZiBleGVjdXRpb24gb2YgdGhlIHRlc3QgbWV0aG9kcyBpcyBpbXBvcnRhbnQhIHRlc3Rfc2VlaworICAgIG11c3QgcnVuIGZpcnN0IHRvIGNyZWF0ZSB0aGUgdGVzdCBmaWxlLiBGaWxlIGNsZWFudXAgbXVzdCBhbHNvIGJlIGhhbmRsZWQKKyAgICBvdXRzaWRlIHRoZSB0ZXN0IGluc3RhbmNlcyBiZWNhdXNlIG9mIHRoaXMuCisKKyAgICAiIiIKKworICAgIGRlZiB0ZXN0X3NlZWsoc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgnY3JlYXRlIGxhcmdlIGZpbGUgdmlhIHNlZWsgKG1heSBiZSBzcGFyc2UgZmlsZSkgLi4uJykKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oVEVTVEZOLCAnd2InKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShiJ3onKQorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICBmLnNlZWsoc2l6ZSkKKyAgICAgICAgICAgIGYud3JpdGUoYidhJykKKyAgICAgICAgICAgIGYuZmx1c2goKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCgnY2hlY2sgZmlsZSBzaXplIHdpdGggb3MuZnN0YXQnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5mc3RhdChmLmZpbGVubygpKVtzdGF0LlNUX1NJWkVdLCBzaXplKzEpCisKKyAgICBkZWYgdGVzdF9vc3N0YXQoc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgnY2hlY2sgZmlsZSBzaXplIHdpdGggb3Muc3RhdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChURVNURk4pW3N0YXQuU1RfU0laRV0sIHNpemUrMSkKKworICAgIGRlZiB0ZXN0X3NlZWtfcmVhZChzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50KCdwbGF5IGFyb3VuZCB3aXRoIHNlZWsoKSBhbmQgcmVhZCgpIHdpdGggdGhlIGJ1aWx0IGxhcmdlZmlsZScpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKFRFU1RGTiwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgxKSwgYid6JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDEpCisgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDApCisgICAgICAgICAgICBmLnNlZWsoMCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDApCisgICAgICAgICAgICBmLnNlZWsoNDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCA0MikKKyAgICAgICAgICAgIGYuc2Vlayg0MiwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDQyKQorICAgICAgICAgICAgZi5zZWVrKDQyLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgODQpCisgICAgICAgICAgICBmLnNlZWsoMCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDg0KQorICAgICAgICAgICAgZi5zZWVrKDAsIDIpICAjIHNlZWsgZnJvbSB0aGUgZW5kCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBzaXplICsgMSArIDApCisgICAgICAgICAgICBmLnNlZWsoLTEwLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgc2l6ZSArIDEgLSAxMCkKKyAgICAgICAgICAgIGYuc2Vlaygtc2l6ZS0xLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgMCkKKyAgICAgICAgICAgIGYuc2VlayhzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgc2l6ZSkKKyAgICAgICAgICAgICMgdGhlICdhJyB0aGF0IHdhcyB3cml0dGVuIGF0IHRoZSBlbmQgb2YgZmlsZSBhYm92ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoMSksIGInYScpCisgICAgICAgICAgICBmLnNlZWsoLXNpemUtMSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKDEpLCBiJ3onKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgMSkKKworICAgIGRlZiB0ZXN0X2xzZWVrKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoJ3BsYXkgYXJvdW5kIHdpdGggb3MubHNlZWsoKSB3aXRoIHRoZSBidWlsdCBsYXJnZWZpbGUnKQorICAgICAgICB3aXRoIHNlbGYub3BlbihURVNURk4sICdyYicpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmxzZWVrKGYuZmlsZW5vKCksIDAsIDApLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5sc2VlayhmLmZpbGVubygpLCA0MiwgMCksIDQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5sc2VlayhmLmZpbGVubygpLCA0MiwgMSksIDg0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5sc2VlayhmLmZpbGVubygpLCAwLCAxKSwgODQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmxzZWVrKGYuZmlsZW5vKCksIDAsIDIpLCBzaXplKzErMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MubHNlZWsoZi5maWxlbm8oKSwgLTEwLCAyKSwgc2l6ZSsxLTEwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5sc2VlayhmLmZpbGVubygpLCAtc2l6ZS0xLCAyKSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MubHNlZWsoZi5maWxlbm8oKSwgc2l6ZSwgMCksIHNpemUpCisgICAgICAgICAgICAjIHRoZSAnYScgdGhhdCB3YXMgd3JpdHRlbiBhdCB0aGUgZW5kIG9mIGZpbGUgYWJvdmUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKDEpLCBiJ2EnKQorCisgICAgZGVmIHRlc3RfdHJ1bmNhdGUoc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgndHJ5IHRydW5jYXRlJykKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oVEVTVEZOLCAncitiJykgYXMgZjoKKyAgICAgICAgICAgICMgdGhpcyBpcyBhbHJlYWR5IGRlY2lkZWQgYmVmb3JlIHN0YXJ0IHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUKKyAgICAgICAgICAgICMgYnV0IHdlIGRvIGl0IGFueXdheSBmb3IgZXh0cmEgcHJvdGVjdGlvbgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoZiwgJ3RydW5jYXRlJyk6CisgICAgICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIm9wZW4oKS50cnVuY2F0ZSgpIG5vdCBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0iKQorICAgICAgICAgICAgZi5zZWVrKDAsIDIpCisgICAgICAgICAgICAjIGVsc2Ugd2UndmUgbG9zdCB0cmFjayBvZiB0aGUgdHJ1ZSBzaXplCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBzaXplKzEpCisgICAgICAgICAgICAjIEN1dCBpdCBiYWNrIHZpYSBzZWVrICsgdHJ1bmNhdGUgd2l0aCBubyBhcmd1bWVudC4KKyAgICAgICAgICAgIG5ld3NpemUgPSBzaXplIC0gMTAKKyAgICAgICAgICAgIGYuc2VlayhuZXdzaXplKQorICAgICAgICAgICAgZi50cnVuY2F0ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBuZXdzaXplKSAgIyBlbHNlIHBvaW50ZXIgbW92ZWQKKyAgICAgICAgICAgIGYuc2VlaygwLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgbmV3c2l6ZSkgICMgZWxzZSB3YXNuJ3QgdHJ1bmNhdGVkCisgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IHRydW5jYXRlKHNtYWxsZXIgdGhhbiB0cnVlIHNpemUpIHNocmlua3MKKyAgICAgICAgICAgICMgdGhlIGZpbGUuCisgICAgICAgICAgICBuZXdzaXplIC09IDEKKyAgICAgICAgICAgIGYuc2Vlayg0MikKKyAgICAgICAgICAgIGYudHJ1bmNhdGUobmV3c2l6ZSkKKyAgICAgICAgICAgIGlmIHNlbGYubmV3X2lvOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDQyKQorICAgICAgICAgICAgZi5zZWVrKDAsIDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBuZXdzaXplKQorICAgICAgICAgICAgIyBYWFggdHJ1bmNhdGUobGFyZ2VyIHRoYW4gdHJ1ZSBzaXplKSBpcyBpbGwtZGVmaW5lZAorICAgICAgICAgICAgIyBhY3Jvc3MgcGxhdGZvcm07IGN1dCBpdCB3YWFhYWF5IGJhY2sKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgZi50cnVuY2F0ZSgxKQorICAgICAgICAgICAgaWYgc2VsZi5uZXdfaW86CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgMCkgICAgICAgIyBlbHNlIHBvaW50ZXIgbW92ZWQKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZi5yZWFkKCkpLCAxKSAgIyBlbHNlIHdhc24ndCB0cnVuY2F0ZWQKKworICAgIGRlZiB0ZXN0X3NlZWthYmxlKHNlbGYpOgorICAgICAgICAjIElzc3VlICM1MDE2OyBzZWVrYWJsZSgpIGNhbiByZXR1cm4gRmFsc2Ugd2hlbiB0aGUgY3VycmVudCBwb3NpdGlvbgorICAgICAgICAjIGlzIG5lZ2F0aXZlIHdoZW4gdHJ1bmNhdGVkIHRvIGFuIGludC4KKyAgICAgICAgaWYgbm90IHNlbGYubmV3X2lvOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiYnVpbHRpbiBmaWxlIGRvZXNuJ3QgaGF2ZSBzZWVrYWJsZSgpIikKKyAgICAgICAgZm9yIHBvcyBpbiAoMioqMzEtMSwgMioqMzEsIDIqKjMxKzEpOgorICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oVEVTVEZOLCAncmInKSBhcyBmOgorICAgICAgICAgICAgICAgIGYuc2Vlayhwb3MpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuc2Vla2FibGUoKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgIyBPbiBXaW5kb3dzIGFuZCBNYWMgT1NYIHRoaXMgdGVzdCBjb21zdW1lcyBsYXJnZSByZXNvdXJjZXM7IEl0CisgICAgIyB0YWtlcyBhIGxvbmcgdGltZSB0byBidWlsZCB0aGUgPjJHQiBmaWxlIGFuZCB0YWtlcyA+MkdCIG9mIGRpc2sKKyAgICAjIHNwYWNlIHRoZXJlZm9yZSB0aGUgcmVzb3VyY2UgbXVzdCBiZSBlbmFibGVkIHRvIHJ1biB0aGlzIHRlc3QuCisgICAgIyBJZiBub3QsIG5vdGhpbmcgYWZ0ZXIgdGhpcyBsaW5lIHN0YW56YSB3aWxsIGJlIGV4ZWN1dGVkLgorICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbicgb3Igc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICByZXF1aXJlcygnbGFyZ2VmaWxlJywKKyAgICAgICAgICAgICAgICAgJ3Rlc3QgcmVxdWlyZXMgJXMgYnl0ZXMgYW5kIGEgbG9uZyB0aW1lIHRvIHJ1bicgJSBzdHIoc2l6ZSkpCisgICAgZWxzZToKKyAgICAgICAgIyBPbmx5IHJ1biBpZiB0aGUgY3VycmVudCBmaWxlc3lzdGVtIHN1cHBvcnRzIGxhcmdlIGZpbGVzLgorICAgICAgICAjIChTa2lwIHRoaXMgdGVzdCBvbiBXaW5kb3dzLCBzaW5jZSB3ZSBub3cgYWx3YXlzIHN1cHBvcnQKKyAgICAgICAgIyBsYXJnZSBmaWxlcy4pCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3diJywgYnVmZmVyaW5nPTApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgMioqMzEgPT0gMjE0NzQ4MzY0OAorICAgICAgICAgICAgZi5zZWVrKDIxNDc0ODM2NDkpCisgICAgICAgICAgICAjIFNlZWtpbmcgaXMgbm90IGVub3VnaCBvZiBhIHRlc3Q6IHlvdSBtdXN0IHdyaXRlIGFuZAorICAgICAgICAgICAgIyBmbHVzaCwgdG9vIQorICAgICAgICAgICAgZi53cml0ZShiJ3gnKQorICAgICAgICAgICAgZi5mbHVzaCgpCisgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgT3ZlcmZsb3dFcnJvcik6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiZmlsZXN5c3RlbSBkb2VzIG5vdCBoYXZlIGxhcmdlZmlsZSBzdXBwb3J0IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBmb3IgX29wZW4sIHByZWZpeCBpbiBbKGlvLm9wZW4sICdDJyksIChweWlvLm9wZW4sICdQeScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAob3BlbiwgJ0J1aWx0aW4nKV06CisgICAgICAgIGNsYXNzIFRlc3RDYXNlKExhcmdlRmlsZVRlc3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBUZXN0Q2FzZS5vcGVuID0gc3RhdGljbWV0aG9kKF9vcGVuKQorICAgICAgICBUZXN0Q2FzZS5uZXdfaW8gPSBfb3BlbiBpcyBub3Qgb3BlbgorICAgICAgICBUZXN0Q2FzZS5fX25hbWVfXyA9IHByZWZpeCArIExhcmdlRmlsZVRlc3QuX19uYW1lX18KKyAgICAgICAgc3VpdGUuYWRkVGVzdChUZXN0Q2FzZSgndGVzdF9zZWVrJykpCisgICAgICAgIHN1aXRlLmFkZFRlc3QoVGVzdENhc2UoJ3Rlc3Rfb3NzdGF0JykpCisgICAgICAgIHN1aXRlLmFkZFRlc3QoVGVzdENhc2UoJ3Rlc3Rfc2Vla19yZWFkJykpCisgICAgICAgIHN1aXRlLmFkZFRlc3QoVGVzdENhc2UoJ3Rlc3RfbHNlZWsnKSkKKyAgICAgICAgd2l0aCBfb3BlbihURVNURk4sICd3YicpIGFzIGY6CisgICAgICAgICAgICBpZiBoYXNhdHRyKGYsICd0cnVuY2F0ZScpOgorICAgICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QoVGVzdENhc2UoJ3Rlc3RfdHJ1bmNhdGUnKSkKKyAgICAgICAgc3VpdGUuYWRkVGVzdChUZXN0Q2FzZSgndGVzdF9zZWVrYWJsZScpKQorICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgIHRyeToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KHN1aXRlKQorICAgIGZpbmFsbHk6CisgICAgICAgIHVubGluayhURVNURk4pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xhcmdlZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sYXJnZWZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NjJhOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sYXJnZWZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xhcmdlZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sYXJnZWZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NjJhOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sYXJnZWZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpYjJ0bzMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saWIydG8zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOWEyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saWIydG8zLnB5CkBAIC0wLDAgKzEsMjEgQEAKKyMgU2tpcHBpbmcgdGVzdF9wYXJzZXIgYW5kIHRlc3RfYWxsX2ZpeGVycworIyBiZWNhdXNlIG9mIHJ1bm5pbmcKK2Zyb20gbGliMnRvMy50ZXN0cyBpbXBvcnQgKHRlc3RfZml4ZXJzLCB0ZXN0X3B5dHJlZSwgdGVzdF91dGlsLCB0ZXN0X3JlZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9wYXJzZXIsIHRlc3RfbWFpbiBhcyB0ZXN0X21haW5fKQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworZGVmIHN1aXRlKCk6CisgICAgdGVzdHMgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgIGZvciBtIGluICh0ZXN0X2ZpeGVycywgdGVzdF9weXRyZWUsdGVzdF91dGlsLCB0ZXN0X3JlZmFjdG9yLCB0ZXN0X3BhcnNlciwKKyAgICAgICAgICAgICAgdGVzdF9tYWluXyk6CisgICAgICAgIHRlc3RzLmFkZFRlc3RzKGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKG0pKQorICAgIHJldHVybiB0ZXN0cworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KHN1aXRlKCkpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGliMnRvMy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saWIydG8zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDhjNDRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGliMnRvMy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGliMnRvMy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saWIydG8zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDhjNDRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGliMnRvMy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjgwYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saW5lY2FjaGUucHkKQEAgLTAsMCArMSwxMzEgQEAKKyIiIiBUZXN0cyBmb3IgdGhlIGxpbmVjYWNoZSBtb2R1bGUgIiIiCisKK2ltcG9ydCBsaW5lY2FjaGUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zLnBhdGgKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0IGFzIHN1cHBvcnQKKworCitGSUxFTkFNRSA9IGxpbmVjYWNoZS5fX2ZpbGVfXworSU5WQUxJRF9OQU1FID0gJyFAJCkoIUAjXzEnCitFTVBUWSA9ICcnCitURVNUUyA9ICdpbnNwZWN0X2ZvZGRlciBpbnNwZWN0X2ZvZGRlcjIgbWFwcGluZ190ZXN0cycKK1RFU1RTID0gVEVTVFMuc3BsaXQoKQorVEVTVF9QQVRIID0gb3MucGF0aC5kaXJuYW1lKHN1cHBvcnQuX19maWxlX18pCitNT0RVTEVTID0gImxpbmVjYWNoZSBhYmMiLnNwbGl0KCkKK01PRFVMRV9QQVRIID0gb3MucGF0aC5kaXJuYW1lKEZJTEVOQU1FKQorCitTT1VSQ0VfMSA9ICcnJworIiBEb2NzdHJpbmcgIgorCitkZWYgZnVuY3Rpb24oKToKKyAgICByZXR1cm4gcmVzdWx0CisKKycnJworCitTT1VSQ0VfMiA9ICcnJworZGVmIGYoKToKKyAgICByZXR1cm4gMSArIDEKKworYSA9IGYoKQorCisnJycKKworU09VUkNFXzMgPSAnJycKK2RlZiBmKCk6CisgICAgcmV0dXJuIDMnJycgIyBObyBlbmRpbmcgbmV3bGluZQorCisKK2NsYXNzIExpbmVDYWNoZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2dldGxpbmUoc2VsZik6CisgICAgICAgIGdldGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZQorCisgICAgICAgICMgQmFkIHZhbHVlcyBmb3IgbGluZSBudW1iZXIgc2hvdWxkIHJldHVybiBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRsaW5lKEZJTEVOQU1FLCAyKioxNSksIEVNUFRZKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGxpbmUoRklMRU5BTUUsIC0xKSwgRU1QVFkpCisKKyAgICAgICAgIyBGbG9hdCB2YWx1ZXMgY3VycmVudGx5IHJhaXNlIFR5cGVFcnJvciwgc2hvdWxkIGl0PworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGxpbmUsIEZJTEVOQU1FLCAxLjEpCisKKyAgICAgICAgIyBCYWQgZmlsZW5hbWVzIHNob3VsZCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0bGluZShFTVBUWSwgMSksIEVNUFRZKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGxpbmUoSU5WQUxJRF9OQU1FLCAxKSwgRU1QVFkpCisKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIGxpbmVzIGNvcnJlc3BvbmQgdG8gdGhvc2UgZnJvbSBmaWxlIGl0ZXJhdGlvbgorICAgICAgICBmb3IgZW50cnkgaW4gVEVTVFM6CisgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihURVNUX1BBVEgsIGVudHJ5KSArICcucHknCisgICAgICAgICAgICBmb3IgaW5kZXgsIGxpbmUgaW4gZW51bWVyYXRlKG9wZW4oZmlsZW5hbWUpKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGdldGxpbmUoZmlsZW5hbWUsIGluZGV4ICsgMSkpCisKKyAgICAgICAgIyBDaGVjayBtb2R1bGUgbG9hZGluZworICAgICAgICBmb3IgZW50cnkgaW4gTU9EVUxFUzoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKE1PRFVMRV9QQVRILCBlbnRyeSkgKyAnLnB5JworICAgICAgICAgICAgZm9yIGluZGV4LCBsaW5lIGluIGVudW1lcmF0ZShvcGVuKGZpbGVuYW1lKSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBnZXRsaW5lKGZpbGVuYW1lLCBpbmRleCArIDEpKQorCisgICAgICAgICMgQ2hlY2sgdGhhdCBib2d1cyBkYXRhIGlzbid0IHJldHVybmVkIChpc3N1ZSAjMTMwOTU2NykKKyAgICAgICAgZW1wdHkgPSBsaW5lY2FjaGUuZ2V0bGluZXMoJ2EvYi9jL19faW5pdF9fLnB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbXB0eSwgW10pCisKKyAgICBkZWYgdGVzdF9ub19lbmRpbmdfbmV3bGluZShzZWxmKToKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgd2l0aCBvcGVuKHN1cHBvcnQuVEVTVEZOLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoU09VUkNFXzMpCisgICAgICAgIGxpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzKHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBbIlxuIiwgImRlZiBmKCk6XG4iLCAiICAgIHJldHVybiAzXG4iXSkKKworICAgIGRlZiB0ZXN0X2NsZWFyY2FjaGUoc2VsZik6CisgICAgICAgIGNhY2hlZCA9IFtdCisgICAgICAgIGZvciBlbnRyeSBpbiBURVNUUzoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKFRFU1RfUEFUSCwgZW50cnkpICsgJy5weScKKyAgICAgICAgICAgIGNhY2hlZC5hcHBlbmQoZmlsZW5hbWUpCisgICAgICAgICAgICBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgMSkKKworICAgICAgICAjIEFyZSBhbGwgZmlsZXMgY2FjaGVkPworICAgICAgICBjYWNoZWRfZW1wdHkgPSBbZm4gZm9yIGZuIGluIGNhY2hlZCBpZiBmbiBub3QgaW4gbGluZWNhY2hlLmNhY2hlXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhY2hlZF9lbXB0eSwgW10pCisKKyAgICAgICAgIyBDYW4gd2UgY2xlYXIgdGhlIGNhY2hlPworICAgICAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCisgICAgICAgIGNhY2hlZF9lbXB0eSA9IFtmbiBmb3IgZm4gaW4gY2FjaGVkIGlmIGZuIGluIGxpbmVjYWNoZS5jYWNoZV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWNoZWRfZW1wdHksIFtdKQorCisgICAgZGVmIHRlc3RfY2hlY2tjYWNoZShzZWxmKToKKyAgICAgICAgZ2V0bGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lCisgICAgICAgICMgQ3JlYXRlIGEgc291cmNlIGZpbGUgYW5kIGNhY2hlIGl0cyBjb250ZW50cworICAgICAgICBzb3VyY2VfbmFtZSA9IHN1cHBvcnQuVEVTVEZOICsgJy5weScKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBzb3VyY2VfbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKHNvdXJjZV9uYW1lLCAndycpIGFzIHNvdXJjZToKKyAgICAgICAgICAgIHNvdXJjZS53cml0ZShTT1VSQ0VfMSkKKyAgICAgICAgZ2V0bGluZShzb3VyY2VfbmFtZSwgMSkKKworICAgICAgICAjIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgY29udGVudHMKKyAgICAgICAgc291cmNlX2xpc3QgPSBbXQorICAgICAgICB3aXRoIG9wZW4oc291cmNlX25hbWUpIGFzIHNvdXJjZToKKyAgICAgICAgICAgIGZvciBpbmRleCwgbGluZSBpbiBlbnVtZXJhdGUoc291cmNlKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGdldGxpbmUoc291cmNlX25hbWUsIGluZGV4ICsgMSkpCisgICAgICAgICAgICAgICAgc291cmNlX2xpc3QuYXBwZW5kKGxpbmUpCisKKyAgICAgICAgd2l0aCBvcGVuKHNvdXJjZV9uYW1lLCAndycpIGFzIHNvdXJjZToKKyAgICAgICAgICAgIHNvdXJjZS53cml0ZShTT1VSQ0VfMikKKworICAgICAgICAjIFRyeSB0byB1cGRhdGUgYSBib2d1cyBjYWNoZSBlbnRyeQorICAgICAgICBsaW5lY2FjaGUuY2hlY2tjYWNoZSgnZHVtbXknKQorCisgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgY2FjaGUgbWF0Y2hlcyB0aGUgb2xkIGNvbnRlbnRzCisgICAgICAgIGZvciBpbmRleCwgbGluZSBpbiBlbnVtZXJhdGUoc291cmNlX2xpc3QpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBnZXRsaW5lKHNvdXJjZV9uYW1lLCBpbmRleCArIDEpKQorCisgICAgICAgICMgVXBkYXRlIHRoZSBjYWNoZSBhbmQgY2hlY2sgd2hldGhlciBpdCBtYXRjaGVzIHRoZSBuZXcgc291cmNlIGZpbGUKKyAgICAgICAgbGluZWNhY2hlLmNoZWNrY2FjaGUoc291cmNlX25hbWUpCisgICAgICAgIHdpdGggb3Blbihzb3VyY2VfbmFtZSkgYXMgc291cmNlOgorICAgICAgICAgICAgZm9yIGluZGV4LCBsaW5lIGluIGVudW1lcmF0ZShzb3VyY2UpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgZ2V0bGluZShzb3VyY2VfbmFtZSwgaW5kZXggKyAxKSkKKyAgICAgICAgICAgICAgICBzb3VyY2VfbGlzdC5hcHBlbmQobGluZSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KExpbmVDYWNoZVRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saW5lY2FjaGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNiOTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saW5lY2FjaGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWNiOTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saW51eGF1ZGlvZGV2LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGludXhhdWRpb2Rldi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWY0NmI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGludXhhdWRpb2Rldi5weQpAQCAtMCwwICsxLDk5IEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAordGVzdF9zdXBwb3J0LnJlcXVpcmVzKCdhdWRpbycpCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGZpbmRmaWxlLCBydW5fdW5pdHRlc3QKKworaW1wb3J0IGVycm5vCitpbXBvcnQgc3lzCitpbXBvcnQgYXVkaW9vcAoraW1wb3J0IHVuaXR0ZXN0CisKK2xpbnV4YXVkaW9kZXYgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnbGludXhhdWRpb2RldicsIGRlcHJlY2F0ZWQ9VHJ1ZSkKK3N1bmF1ZGlvID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3N1bmF1ZGlvJywgZGVwcmVjYXRlZD1UcnVlKQorCitTTkRfRk9STUFUX01VTEFXXzggPSAxCisKK2NsYXNzIExpbnV4QXVkaW9EZXZUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZGV2ID0gbGludXhhdWRpb2Rldi5vcGVuKCd3JykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5kZXYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgIyBhdCBsZWFzdCBjaGVjayB0aGF0IHRoZXNlIG1ldGhvZHMgY2FuIGJlIGludm9rZWQKKyAgICAgICAgc2VsZi5kZXYuYnVmc2l6ZSgpCisgICAgICAgIHNlbGYuZGV2Lm9idWZjb3VudCgpCisgICAgICAgIHNlbGYuZGV2Lm9idWZmcmVlKCkKKyAgICAgICAgc2VsZi5kZXYuZ2V0cHRyKCkKKyAgICAgICAgc2VsZi5kZXYuZmlsZW5vKCkKKworICAgIGRlZiB0ZXN0X3BsYXlfc291bmRfZmlsZShzZWxmKToKKyAgICAgICAgcGF0aCA9IGZpbmRmaWxlKCJhdWRpb3Rlc3QuYXUiKQorICAgICAgICBmcCA9IG9wZW4ocGF0aCwgJ3InKQorICAgICAgICBzaXplLCBlbmMsIHJhdGUsIG5jaGFubmVscywgZXh0cmEgPSBzdW5hdWRpby5nZXRoZHIoZnApCisgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgICAgIGlmIGVuYyAhPSBTTkRfRk9STUFUX01VTEFXXzg6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdCAuYXUgZmlsZSB3aXRoIDgtYml0IG11LWxhdyBzYW1wbGVzIikKKworICAgICAgICAjIGNvbnZlcnQgdGhlIGRhdGEgdG8gMTYtYml0IHNpZ25lZAorICAgICAgICBkYXRhID0gYXVkaW9vcC51bGF3MmxpbihkYXRhLCAyKQorCisgICAgICAgICMgc2V0IHRoZSBkYXRhIGZvcm1hdAorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgorICAgICAgICAgICAgZm10ID0gbGludXhhdWRpb2Rldi5BRk1UX1MxNl9MRQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm10ID0gbGludXhhdWRpb2Rldi5BRk1UX1MxNl9CRQorCisgICAgICAgICMgc2V0IHBhcmFtZXRlcnMgYmFzZWQgb24gLmF1IGZpbGUgaGVhZGVycworICAgICAgICBzZWxmLmRldi5zZXRwYXJhbWV0ZXJzKHJhdGUsIDE2LCBuY2hhbm5lbHMsIGZtdCkKKyAgICAgICAgc2VsZi5kZXYud3JpdGUoZGF0YSkKKyAgICAgICAgc2VsZi5kZXYuZmx1c2goKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBzaXplID0gOAorICAgICAgICBmbXQgPSBsaW51eGF1ZGlvZGV2LkFGTVRfVTgKKyAgICAgICAgcmF0ZSA9IDgwMDAKKyAgICAgICAgbmNoYW5uZWxzID0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRldi5zZXRwYXJhbWV0ZXJzKC0xLCBzaXplLCBuY2hhbm5lbHMsIGZtdCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmFyZ3NbMF0sICJleHBlY3RlZCByYXRlID49IDAsIG5vdCAtMSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZGV2LnNldHBhcmFtZXRlcnMocmF0ZSwgLTIsIG5jaGFubmVscywgZm10KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuYXJnc1swXSwgImV4cGVjdGVkIHNhbXBsZSBzaXplID49IDAsIG5vdCAtMiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZGV2LnNldHBhcmFtZXRlcnMocmF0ZSwgc2l6ZSwgMywgZm10KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuYXJnc1swXSwgIm5jaGFubmVscyBtdXN0IGJlIDEgb3IgMiwgbm90IDMiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRldi5zZXRwYXJhbWV0ZXJzKHJhdGUsIHNpemUsIG5jaGFubmVscywgMTc3KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuYXJnc1swXSwgInVua25vd24gYXVkaW8gZW5jb2Rpbmc6IDE3NyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZGV2LnNldHBhcmFtZXRlcnMocmF0ZSwgc2l6ZSwgbmNoYW5uZWxzLCBsaW51eGF1ZGlvZGV2LkFGTVRfVTE2X0xFKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuYXJnc1swXSwgImZvciBsaW5lYXIgdW5zaWduZWQgMTYtYml0IGxpdHRsZS1lbmRpYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8sIGV4cGVjdGVkIHNhbXBsZSBzaXplIDE2LCBub3QgOCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZGV2LnNldHBhcmFtZXRlcnMocmF0ZSwgMTYsIG5jaGFubmVscywgZm10KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuYXJnc1swXSwgImZvciBsaW5lYXIgdW5zaWduZWQgOC1iaXQgYXVkaW8sIGV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsZSBzaXplIDgsIG5vdCAxNiIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0cnk6CisgICAgICAgIGRzcCA9IGxpbnV4YXVkaW9kZXYub3BlbigndycpCisgICAgZXhjZXB0IGxpbnV4YXVkaW9kZXYuZXJyb3IsIG1zZzoKKyAgICAgICAgaWYgbXNnLmFyZ3NbMF0gaW4gKGVycm5vLkVBQ0NFUywgZXJybm8uRU5PRU5ULCBlcnJuby5FTk9ERVYsIGVycm5vLkVCVVNZKToKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KG1zZykKKyAgICAgICAgcmFpc2UKKyAgICBkc3AuY2xvc2UoKQorICAgIHJ1bl91bml0dGVzdChMaW51eEF1ZGlvRGV2VGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbnV4YXVkaW9kZXYucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGludXhhdWRpb2Rldi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyNjk4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbnV4YXVkaW9kZXYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbnV4YXVkaW9kZXYucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGludXhhdWRpb2Rldi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyNjk4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbnV4YXVkaW9kZXYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpc3QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMDgwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saXN0LnB5CkBAIC0wLDAgKzEsNzggQEAKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCBsaXN0X3Rlc3RzCisKK2NsYXNzIExpc3RUZXN0KGxpc3RfdGVzdHMuQ29tbW9uVGVzdCk6CisgICAgdHlwZTJ0ZXN0ID0gbGlzdAorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChbXSksIFtdKQorICAgICAgICBsMF8zID0gWzAsIDEsIDIsIDNdCisgICAgICAgIGwwXzNfYmlzID0gbGlzdChsMF8zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwwXzMsIGwwXzNfYmlzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobDBfMyBpcyBub3QgbDBfM19iaXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgoKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoKDAsIDEsIDIsIDMpKSwgWzAsIDEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoJycpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCdzcGFtJyksIFsncycsICdwJywgJ2EnLCAnbSddKQorCisgICAgICAgIGlmIHN5cy5tYXhzaXplID09IDB4N2ZmZmZmZmY6CisgICAgICAgICAgICAjIFRoaXMgdGVzdCBjYW4gY3VycmVudGx5IG9ubHkgd29yayBvbiAzMi1iaXQgbWFjaGluZXMuCisgICAgICAgICAgICAjIFhYWCBJZi93aGVuIFB5U2VxdWVuY2VfTGVuZ3RoKCkgcmV0dXJucyBhIHNzaXplX3QsIGl0IHNob3VsZCBiZQorICAgICAgICAgICAgIyBYWFggcmUtZW5hYmxlZC4KKyAgICAgICAgICAgICMgVmVyaWZ5IGNsZWFyaW5nIG9mIGJ1ZyAjNTU2MDI1LgorICAgICAgICAgICAgIyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgbWF4IGRhdGEgc2l6ZSAoc3lzLm1heGludCkgPT0gbWF4CisgICAgICAgICAgICAjIGFkZHJlc3Mgc2l6ZSB0aGlzIGFsc28gYXNzdW1lcyB0aGF0IHRoZSBhZGRyZXNzIHNpemUgaXMgYXQKKyAgICAgICAgICAgICMgbGVhc3QgNCBieXRlcyB3aXRoIDggYnl0ZSBhZGRyZXNzZXMsIHRoZSBidWcgaXMgbm90IHdlbGwKKyAgICAgICAgICAgICMgdGVzdGVkCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIE5vdGU6IFRoaXMgdGVzdCBpcyBleHBlY3RlZCB0byBTRUdWIHVuZGVyIEN5Z3dpbiAxLjMuMTIgb3IKKyAgICAgICAgICAgICMgZWFybGllciBkdWUgdG8gYSBuZXdsaWIgYnVnLiAgU2VlIHRoZSBmb2xsb3dpbmcgbWFpbGluZyBsaXN0CisgICAgICAgICAgICAjIHRocmVhZCBmb3IgdGhlIGRldGFpbHM6CisKKyAgICAgICAgICAgICMgICAgIGh0dHA6Ly9zb3VyY2VzLnJlZGhhdC5jb20vbWwvbmV3bGliLzIwMDIvbXNnMDAzNjkuaHRtbAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTWVtb3J5RXJyb3IsIGxpc3QsIHhyYW5nZShzeXMubWF4aW50IC8vIDIpKQorCisgICAgICAgICMgVGhpcyBjb2RlIHVzZWQgdG8gc2VnZmF1bHQgaW4gUHkyLjRhMworICAgICAgICB4ID0gW10KKyAgICAgICAgeC5leHRlbmQoLXkgZm9yIHkgaW4geCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBbXSkKKworICAgIGRlZiB0ZXN0X3RydXRoKHNlbGYpOgorICAgICAgICBzdXBlcihMaXN0VGVzdCwgc2VsZikudGVzdF90cnV0aCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShbNDJdKQorCisgICAgZGVmIHRlc3RfaWRlbnRpdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShbXSBpcyBub3QgW10pCisKKyAgICBkZWYgdGVzdF9sZW4oc2VsZik6CisgICAgICAgIHN1cGVyKExpc3RUZXN0LCBzZWxmKS50ZXN0X2xlbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFtdKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oWzBdKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oWzAsIDEsIDJdKSwgMykKKworICAgIGRlZiB0ZXN0X292ZXJmbG93KHNlbGYpOgorICAgICAgICBsc3QgPSBbNCwgNSwgNiwgN10KKyAgICAgICAgbiA9IGludCgoc3lzLm1heGludCoyKzIpIC8vIGxlbihsc3QpKQorICAgICAgICBkZWYgbXVsKGEsIGIpOiByZXR1cm4gYSAqIGIKKyAgICAgICAgZGVmIGltdWwoYSwgYik6IGEgKj0gYgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoTWVtb3J5RXJyb3IsIE92ZXJmbG93RXJyb3IpLCBtdWwsIGxzdCwgbikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKE1lbW9yeUVycm9yLCBPdmVyZmxvd0Vycm9yKSwgaW11bCwgbHN0LCBuKQorCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChMaXN0VGVzdCkKKworICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgIGltcG9ydCBzeXMKKyAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgaW1wb3J0IGdjCisgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTGlzdFRlc3QpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcHJpbnQgY291bnRzCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGlzdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTI5NDRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGlzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGlzdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTI5NDRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGlzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9jYWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9jYWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NzU1OTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb2NhbGUucHkKQEAgLTAsMCArMSw0MzggQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgdmVyYm9zZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgbG9jYWxlCitpbXBvcnQgc3lzCitpbXBvcnQgY29kZWNzCisKKworZW5VU19sb2NhbGUgPSBOb25lCisKK2RlZiBnZXRfZW5VU19sb2NhbGUoKToKKyAgICBnbG9iYWwgZW5VU19sb2NhbGUKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICB0bG9jcyA9ICgiZW5fVVMuVVRGLTgiLCAiZW5fVVMuSVNPODg1OS0xIiwgImVuX1VTIikKKyAgICAgICAgaWYgaW50KG9zLnVuYW1lKClbMl0uc3BsaXQoJy4nKVswXSkgPCAxMDoKKyAgICAgICAgICAgICMgVGhlIGxvY2FsZSB0ZXN0IHdvcmsgZmluZSBvbiBPU1ggMTAuNiwgSSAocm9uYWxkb3Vzc29yZW4pCisgICAgICAgICAgICAjIGhhdmVuJ3QgaGFkIHRpbWUgeWV0IHRvIHZlcmlmeSBpZiB0ZXN0cyB3b3JrIG9uIE9TWCAxMC41CisgICAgICAgICAgICAjICgxMC40IGlzIGtub3duIHRvIGJlIGJhZCkKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJMb2NhbGUgc3VwcG9ydCBvbiBNYWNPU1ggaXMgbWluaW1hbCIpCisgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpOgorICAgICAgICB0bG9jcyA9ICgiRW4iLCAiRW5nbGlzaCIpCisgICAgZWxzZToKKyAgICAgICAgdGxvY3MgPSAoImVuX1VTLlVURi04IiwgImVuX1VTLlVTLUFTQ0lJIiwgImVuX1VTIikKKyAgICBvbGRsb2NhbGUgPSBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19OVU1FUklDKQorICAgIGZvciB0bG9jIGluIHRsb2NzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19OVU1FUklDLCB0bG9jKQorICAgICAgICBleGNlcHQgbG9jYWxlLkVycm9yOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgKKyAgICAgICAgICAgICJUZXN0IGxvY2FsZSBub3Qgc3VwcG9ydGVkICh0cmllZCAlcykiICUgKCcsICcuam9pbih0bG9jcykpKQorICAgIGVuVVNfbG9jYWxlID0gdGxvYworICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX05VTUVSSUMsIG9sZGxvY2FsZSkKKworCitjbGFzcyBCYXNlTG9jYWxpemVkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIworICAgICMgQmFzZSBjbGFzcyBmb3IgdGVzdHMgdXNpbmcgYSByZWFsIGxvY2FsZQorICAgICMKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5vbGRsb2NhbGUgPSBsb2NhbGUuc2V0bG9jYWxlKHNlbGYubG9jYWxlX3R5cGUpCisgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUoc2VsZi5sb2NhbGVfdHlwZSwgZW5VU19sb2NhbGUpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAidGVzdGluZyB3aXRoIFwiJXNcIi4uLiIgJSBlblVTX2xvY2FsZSwKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgbG9jYWxlLnNldGxvY2FsZShzZWxmLmxvY2FsZV90eXBlLCBzZWxmLm9sZGxvY2FsZSkKKworCitjbGFzcyBCYXNlQ29va2VkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIworICAgICMgQmFzZSBjbGFzcyBmb3IgdGVzdHMgdXNpbmcgY29va2VkIGxvY2FsZWNvbnYoKSB2YWx1ZXMKKyAgICAjCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGxvY2FsZS5fb3ZlcnJpZGVfbG9jYWxlY29udiA9IHNlbGYuY29va2VkX3ZhbHVlcworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBsb2NhbGUuX292ZXJyaWRlX2xvY2FsZWNvbnYgPSB7fQorCisKK2NsYXNzIENDb29rZWRUZXN0KEJhc2VDb29rZWRUZXN0KToKKyAgICAjIEEgY29va2VkICJDIiBsb2NhbGUKKworICAgIGNvb2tlZF92YWx1ZXMgPSB7CisgICAgICAgICdjdXJyZW5jeV9zeW1ib2wnOiAnJywKKyAgICAgICAgJ2RlY2ltYWxfcG9pbnQnOiAnLicsCisgICAgICAgICdmcmFjX2RpZ2l0cyc6IDEyNywKKyAgICAgICAgJ2dyb3VwaW5nJzogW10sCisgICAgICAgICdpbnRfY3Vycl9zeW1ib2wnOiAnJywKKyAgICAgICAgJ2ludF9mcmFjX2RpZ2l0cyc6IDEyNywKKyAgICAgICAgJ21vbl9kZWNpbWFsX3BvaW50JzogJycsCisgICAgICAgICdtb25fZ3JvdXBpbmcnOiBbXSwKKyAgICAgICAgJ21vbl90aG91c2FuZHNfc2VwJzogJycsCisgICAgICAgICduX2NzX3ByZWNlZGVzJzogMTI3LAorICAgICAgICAnbl9zZXBfYnlfc3BhY2UnOiAxMjcsCisgICAgICAgICduX3NpZ25fcG9zbic6IDEyNywKKyAgICAgICAgJ25lZ2F0aXZlX3NpZ24nOiAnJywKKyAgICAgICAgJ3BfY3NfcHJlY2VkZXMnOiAxMjcsCisgICAgICAgICdwX3NlcF9ieV9zcGFjZSc6IDEyNywKKyAgICAgICAgJ3Bfc2lnbl9wb3NuJzogMTI3LAorICAgICAgICAncG9zaXRpdmVfc2lnbic6ICcnLAorICAgICAgICAndGhvdXNhbmRzX3NlcCc6ICcnCisgICAgfQorCitjbGFzcyBFblVTQ29va2VkVGVzdChCYXNlQ29va2VkVGVzdCk6CisgICAgIyBBIGNvb2tlZCAiZW5fVVMiIGxvY2FsZQorCisgICAgY29va2VkX3ZhbHVlcyA9IHsKKyAgICAgICAgJ2N1cnJlbmN5X3N5bWJvbCc6ICckJywKKyAgICAgICAgJ2RlY2ltYWxfcG9pbnQnOiAnLicsCisgICAgICAgICdmcmFjX2RpZ2l0cyc6IDIsCisgICAgICAgICdncm91cGluZyc6IFszLCAzLCAwXSwKKyAgICAgICAgJ2ludF9jdXJyX3N5bWJvbCc6ICdVU0QgJywKKyAgICAgICAgJ2ludF9mcmFjX2RpZ2l0cyc6IDIsCisgICAgICAgICdtb25fZGVjaW1hbF9wb2ludCc6ICcuJywKKyAgICAgICAgJ21vbl9ncm91cGluZyc6IFszLCAzLCAwXSwKKyAgICAgICAgJ21vbl90aG91c2FuZHNfc2VwJzogJywnLAorICAgICAgICAnbl9jc19wcmVjZWRlcyc6IDEsCisgICAgICAgICduX3NlcF9ieV9zcGFjZSc6IDAsCisgICAgICAgICduX3NpZ25fcG9zbic6IDEsCisgICAgICAgICduZWdhdGl2ZV9zaWduJzogJy0nLAorICAgICAgICAncF9jc19wcmVjZWRlcyc6IDEsCisgICAgICAgICdwX3NlcF9ieV9zcGFjZSc6IDAsCisgICAgICAgICdwX3NpZ25fcG9zbic6IDEsCisgICAgICAgICdwb3NpdGl2ZV9zaWduJzogJycsCisgICAgICAgICd0aG91c2FuZHNfc2VwJzogJywnCisgICAgfQorCisKK2NsYXNzIEZyRlJDb29rZWRUZXN0KEJhc2VDb29rZWRUZXN0KToKKyAgICAjIEEgY29va2VkICJmcl9GUiIgbG9jYWxlIHdpdGggYSBzcGFjZSBjaGFyYWN0ZXIgYXMgZGVjaW1hbCBzZXBhcmF0b3IKKyAgICAjIGFuZCBhIG5vbi1BU0NJSSBjdXJyZW5jeSBzeW1ib2wuCisKKyAgICBjb29rZWRfdmFsdWVzID0geworICAgICAgICAnY3VycmVuY3lfc3ltYm9sJzogJ1x4ZTJceDgyXHhhYycsCisgICAgICAgICdkZWNpbWFsX3BvaW50JzogJywnLAorICAgICAgICAnZnJhY19kaWdpdHMnOiAyLAorICAgICAgICAnZ3JvdXBpbmcnOiBbMywgMywgMF0sCisgICAgICAgICdpbnRfY3Vycl9zeW1ib2wnOiAnRVVSICcsCisgICAgICAgICdpbnRfZnJhY19kaWdpdHMnOiAyLAorICAgICAgICAnbW9uX2RlY2ltYWxfcG9pbnQnOiAnLCcsCisgICAgICAgICdtb25fZ3JvdXBpbmcnOiBbMywgMywgMF0sCisgICAgICAgICdtb25fdGhvdXNhbmRzX3NlcCc6ICcgJywKKyAgICAgICAgJ25fY3NfcHJlY2VkZXMnOiAwLAorICAgICAgICAnbl9zZXBfYnlfc3BhY2UnOiAxLAorICAgICAgICAnbl9zaWduX3Bvc24nOiAxLAorICAgICAgICAnbmVnYXRpdmVfc2lnbic6ICctJywKKyAgICAgICAgJ3BfY3NfcHJlY2VkZXMnOiAwLAorICAgICAgICAncF9zZXBfYnlfc3BhY2UnOiAxLAorICAgICAgICAncF9zaWduX3Bvc24nOiAxLAorICAgICAgICAncG9zaXRpdmVfc2lnbic6ICcnLAorICAgICAgICAndGhvdXNhbmRzX3NlcCc6ICcgJworICAgIH0KKworCitjbGFzcyBCYXNlRm9ybWF0dGluZ1Rlc3Qob2JqZWN0KToKKyAgICAjCisgICAgIyBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZm9ybWF0dGluZyB0ZXN0cworICAgICMKKworICAgIGRlZiBfdGVzdF9mb3JtYXRmdW5jKHNlbGYsIGZvcm1hdCwgdmFsdWUsIG91dCwgZnVuYywgKipmb3JtYXRfb3B0cyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBmdW5jKGZvcm1hdCwgdmFsdWUsICoqZm9ybWF0X29wdHMpLCBvdXQpCisKKyAgICBkZWYgX3Rlc3RfZm9ybWF0KHNlbGYsIGZvcm1hdCwgdmFsdWUsIG91dCwgKipmb3JtYXRfb3B0cyk6CisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0ZnVuYyhmb3JtYXQsIHZhbHVlLCBvdXQsCisgICAgICAgICAgICBmdW5jPWxvY2FsZS5mb3JtYXQsICoqZm9ybWF0X29wdHMpCisKKyAgICBkZWYgX3Rlc3RfZm9ybWF0X3N0cmluZyhzZWxmLCBmb3JtYXQsIHZhbHVlLCBvdXQsICoqZm9ybWF0X29wdHMpOgorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdGZ1bmMoZm9ybWF0LCB2YWx1ZSwgb3V0LAorICAgICAgICAgICAgZnVuYz1sb2NhbGUuZm9ybWF0X3N0cmluZywgKipmb3JtYXRfb3B0cykKKworICAgIGRlZiBfdGVzdF9jdXJyZW5jeShzZWxmLCB2YWx1ZSwgb3V0LCAqKmZvcm1hdF9vcHRzKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NhbGUuY3VycmVuY3kodmFsdWUsICoqZm9ybWF0X29wdHMpLCBvdXQpCisKKworY2xhc3MgRW5VU051bWJlckZvcm1hdHRpbmcoQmFzZUZvcm1hdHRpbmdUZXN0KToKKyAgICAjIFhYWCB0aGVyZSBpcyBhIGdyb3VwaW5nICsgcGFkZGluZyBidWcgd2hlbiB0aGUgdGhvdXNhbmRzIHNlcGFyYXRvcgorICAgICMgaXMgZW1wdHkgYnV0IHRoZSBncm91cGluZyBhcnJheSBjb250YWlucyB2YWx1ZXMgKGUuZy4gU29sYXJpcyAxMCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXAgPSBsb2NhbGUubG9jYWxlY29udigpWyd0aG91c2FuZHNfc2VwJ10KKworICAgIGRlZiB0ZXN0X2dyb3VwaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJWYiLCAxMDI0LCBncm91cGluZz0xLCBvdXQ9JzElczAyNC4wMDAwMDAnICUgc2VsZi5zZXApCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlZiIsIDEwMiwgZ3JvdXBpbmc9MSwgb3V0PScxMDIuMDAwMDAwJykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiVmIiwgLTQyLCBncm91cGluZz0xLCBvdXQ9Jy00Mi4wMDAwMDAnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJStmIiwgLTQyLCBncm91cGluZz0xLCBvdXQ9Jy00Mi4wMDAwMDAnKQorCisgICAgZGVmIHRlc3RfZ3JvdXBpbmdfYW5kX3BhZGRpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlMjAuZiIsIC00MiwgZ3JvdXBpbmc9MSwgb3V0PSctNDInLnJqdXN0KDIwKSkKKyAgICAgICAgaWYgc2VsZi5zZXA6CisgICAgICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJSsxMC5mIiwgLTQyMDAsIGdyb3VwaW5nPTEsCisgICAgICAgICAgICAgICAgb3V0PSgnLTQlczIwMCcgJSBzZWxmLnNlcCkucmp1c3QoMTApKQorICAgICAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUtMTAuZiIsIC00MjAwLCBncm91cGluZz0xLAorICAgICAgICAgICAgICAgIG91dD0oJy00JXMyMDAnICUgc2VsZi5zZXApLmxqdXN0KDEwKSkKKworICAgIGRlZiB0ZXN0X2ludGVnZXJfZ3JvdXBpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlZCIsIDQyMDAsIGdyb3VwaW5nPVRydWUsIG91dD0nNCVzMjAwJyAlIHNlbGYuc2VwKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJStkIiwgNDIwMCwgZ3JvdXBpbmc9VHJ1ZSwgb3V0PScrNCVzMjAwJyAlIHNlbGYuc2VwKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJStkIiwgLTQyMDAsIGdyb3VwaW5nPVRydWUsIG91dD0nLTQlczIwMCcgJSBzZWxmLnNlcCkKKworICAgIGRlZiB0ZXN0X2ludGVnZXJfZ3JvdXBpbmdfYW5kX3BhZGRpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlMTBkIiwgNDIwMCwgZ3JvdXBpbmc9VHJ1ZSwKKyAgICAgICAgICAgIG91dD0oJzQlczIwMCcgJSBzZWxmLnNlcCkucmp1c3QoMTApKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJS0xMGQiLCAtNDIwMCwgZ3JvdXBpbmc9VHJ1ZSwKKyAgICAgICAgICAgIG91dD0oJy00JXMyMDAnICUgc2VsZi5zZXApLmxqdXN0KDEwKSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiVmIiwgMTAyNCwgZ3JvdXBpbmc9MCwgb3V0PScxMDI0LjAwMDAwMCcpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlZiIsIDEwMiwgZ3JvdXBpbmc9MCwgb3V0PScxMDIuMDAwMDAwJykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiVmIiwgLTQyLCBncm91cGluZz0wLCBvdXQ9Jy00Mi4wMDAwMDAnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJStmIiwgLTQyLCBncm91cGluZz0wLCBvdXQ9Jy00Mi4wMDAwMDAnKQorCisgICAgZGVmIHRlc3RfcGFkZGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUyMC5mIiwgLTQyLCBncm91cGluZz0wLCBvdXQ9Jy00Micucmp1c3QoMjApKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJSsxMC5mIiwgLTQyMDAsIGdyb3VwaW5nPTAsIG91dD0nLTQyMDAnLnJqdXN0KDEwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUtMTAuZiIsIDQyMDAsIGdyb3VwaW5nPTAsIG91dD0nNDIwMCcubGp1c3QoMTApKQorCisgICAgZGVmIHRlc3RfY29tcGxleF9mb3JtYXR0aW5nKHNlbGYpOgorICAgICAgICAjIFNwYWNlcyBpbiBmb3JtYXR0aW5nIHN0cmluZworICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdF9zdHJpbmcoIk9uZSBtaWxsaW9uIGlzICVpIiwgMTAwMDAwMCwgZ3JvdXBpbmc9MSwKKyAgICAgICAgICAgIG91dD0nT25lIG1pbGxpb24gaXMgMSVzMDAwJXMwMDAnICUgKHNlbGYuc2VwLCBzZWxmLnNlcCkpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0X3N0cmluZygiT25lICBtaWxsaW9uIGlzICVpIiwgMTAwMDAwMCwgZ3JvdXBpbmc9MSwKKyAgICAgICAgICAgIG91dD0nT25lICBtaWxsaW9uIGlzIDElczAwMCVzMDAwJyAlIChzZWxmLnNlcCwgc2VsZi5zZXApKQorICAgICAgICAjIERvdHMgaW4gZm9ybWF0dGluZyBzdHJpbmcKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXRfc3RyaW5nKCIuJWYuIiwgMTAwMC4wLCBvdXQ9Jy4xMDAwLjAwMDAwMC4nKQorICAgICAgICAjIFBhZGRpbmcKKyAgICAgICAgaWYgc2VsZi5zZXA6CisgICAgICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdF9zdHJpbmcoIi0tPiAgJTEwLjJmIiwgNDIwMCwgZ3JvdXBpbmc9MSwKKyAgICAgICAgICAgICAgICBvdXQ9Jy0tPiAgJyArICgnNCVzMjAwLjAwJyAlIHNlbGYuc2VwKS5yanVzdCgxMCkpCisgICAgICAgICMgQXN0ZXJpc2sgZm9ybWF0cworICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdF9zdHJpbmcoIiUxMC4qZiIsICgyLCAxMDAwKSwgZ3JvdXBpbmc9MCwKKyAgICAgICAgICAgIG91dD0nMTAwMC4wMCcucmp1c3QoMTApKQorICAgICAgICBpZiBzZWxmLnNlcDoKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0X3N0cmluZygiJSouKmYiLCAoMTAsIDIsIDEwMDApLCBncm91cGluZz0xLAorICAgICAgICAgICAgICAgIG91dD0oJzElczAwMC4wMCcgJSBzZWxmLnNlcCkucmp1c3QoMTApKQorICAgICAgICAjIFRlc3QgbW9yZS1pbi1vbmUKKyAgICAgICAgaWYgc2VsZi5zZXA6CisgICAgICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdF9zdHJpbmcoImludCAlaSBmbG9hdCAlLjJmIHN0ciAlcyIsCisgICAgICAgICAgICAgICAgKDEwMDAsIDEwMDAuMCwgJ3N0cicpLCBncm91cGluZz0xLAorICAgICAgICAgICAgICAgIG91dD0naW50IDElczAwMCBmbG9hdCAxJXMwMDAuMDAgc3RyIHN0cicgJQorICAgICAgICAgICAgICAgIChzZWxmLnNlcCwgc2VsZi5zZXApKQorCisKK2NsYXNzIFRlc3RGb3JtYXRQYXR0ZXJuQXJnKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRlc3QgaGFuZGxpbmcgb2YgcGF0dGVybiBhcmd1bWVudCBvZiBmb3JtYXQKKworICAgIGRlZiB0ZXN0X29ubHlPbmVQYXR0ZXJuKHNlbGYpOgorICAgICAgICAjIElzc3VlIDI1MjI6IGFjY2VwdCBleGFjdGx5IG9uZSAlIHBhdHRlcm4sIGFuZCBubyBleHRyYSBjaGFycy4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9jYWxlLmZvcm1hdCwgIiVmXG4iLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9jYWxlLmZvcm1hdCwgIiVmXHIiLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9jYWxlLmZvcm1hdCwgIiVmXHJcbiIsICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsb2NhbGUuZm9ybWF0LCAiICVmIiwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvY2FsZS5mb3JtYXQsICIlZmciLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9jYWxlLmZvcm1hdCwgIiVeZyIsICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsb2NhbGUuZm9ybWF0LCAiJWYlJSIsICdmb28nKQorCisKK2NsYXNzIFRlc3RMb2NhbGVGb3JtYXRTdHJpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIkdlbmVyYWwgdGVzdHMgb24gbG9jYWxlLmZvcm1hdF9zdHJpbmciIiIKKworICAgIGRlZiB0ZXN0X3BlcmNlbnRfZXNjYXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2FsZS5mb3JtYXRfc3RyaW5nKCclZiUlJywgMS4wKSwgJyVmJSUnICUgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2FsZS5mb3JtYXRfc3RyaW5nKCclZCAlZiUlZCcsICgxLCAxLjApKSwKKyAgICAgICAgICAgICclZCAlZiUlZCcgJSAoMSwgMS4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NhbGUuZm9ybWF0X3N0cmluZygnJShmb28pcyAlJWQnLCB7J2Zvbyc6ICdiYXInfSksCisgICAgICAgICAgICAoJyUoZm9vKXMgJSVkJyAlIHsnZm9vJzogJ2Jhcid9KSkKKworICAgIGRlZiB0ZXN0X21hcHBpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWxlLmZvcm1hdF9zdHJpbmcoJyUoZm9vKXMgYmluZy4nLCB7J2Zvbyc6ICdiYXInfSksCisgICAgICAgICAgICAoJyUoZm9vKXMgYmluZy4nICUgeydmb28nOiAnYmFyJ30pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2FsZS5mb3JtYXRfc3RyaW5nKCclKGZvbylzJywgeydmb28nOiAnYmFyJ30pLAorICAgICAgICAgICAgKCclKGZvbylzJyAlIHsnZm9vJzogJ2Jhcid9KSkKKworCisKK2NsYXNzIFRlc3ROdW1iZXJGb3JtYXR0aW5nKEJhc2VMb2NhbGl6ZWRUZXN0LCBFblVTTnVtYmVyRm9ybWF0dGluZyk6CisgICAgIyBUZXN0IG51bWJlciBmb3JtYXR0aW5nIHdpdGggYSByZWFsIEVuZ2xpc2ggbG9jYWxlLgorCisgICAgbG9jYWxlX3R5cGUgPSBsb2NhbGUuTENfTlVNRVJJQworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBCYXNlTG9jYWxpemVkVGVzdC5zZXRVcChzZWxmKQorICAgICAgICBFblVTTnVtYmVyRm9ybWF0dGluZy5zZXRVcChzZWxmKQorCisKK2NsYXNzIFRlc3RFblVTTnVtYmVyRm9ybWF0dGluZyhFblVTQ29va2VkVGVzdCwgRW5VU051bWJlckZvcm1hdHRpbmcpOgorICAgICMgVGVzdCBudW1iZXIgZm9ybWF0dGluZyB3aXRoIGEgY29va2VkICJlbl9VUyIgbG9jYWxlLgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBFblVTQ29va2VkVGVzdC5zZXRVcChzZWxmKQorICAgICAgICBFblVTTnVtYmVyRm9ybWF0dGluZy5zZXRVcChzZWxmKQorCisgICAgZGVmIHRlc3RfY3VycmVuY3koc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfY3VycmVuY3koNTAwMDAsICIkNTAwMDAuMDAiKQorICAgICAgICBzZWxmLl90ZXN0X2N1cnJlbmN5KDUwMDAwLCAiJDUwLDAwMC4wMCIsIGdyb3VwaW5nPVRydWUpCisgICAgICAgIHNlbGYuX3Rlc3RfY3VycmVuY3koNTAwMDAsICJVU0QgNTAsMDAwLjAwIiwKKyAgICAgICAgICAgIGdyb3VwaW5nPVRydWUsIGludGVybmF0aW9uYWw9VHJ1ZSkKKworCitjbGFzcyBUZXN0Q051bWJlckZvcm1hdHRpbmcoQ0Nvb2tlZFRlc3QsIEJhc2VGb3JtYXR0aW5nVGVzdCk6CisgICAgIyBUZXN0IG51bWJlciBmb3JtYXR0aW5nIHdpdGggYSBjb29rZWQgIkMiIGxvY2FsZS4KKworICAgIGRlZiB0ZXN0X2dyb3VwaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJS4yZiIsIDEyMzQ1LjY3LCBncm91cGluZz1UcnVlLCBvdXQ9JzEyMzQ1LjY3JykKKworICAgIGRlZiB0ZXN0X2dyb3VwaW5nX2FuZF9wYWRkaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJTkuMmYiLCAxMjM0NS42NywgZ3JvdXBpbmc9VHJ1ZSwgb3V0PScgMTIzNDUuNjcnKQorCisKK2NsYXNzIFRlc3RGckZSTnVtYmVyRm9ybWF0dGluZyhGckZSQ29va2VkVGVzdCwgQmFzZUZvcm1hdHRpbmdUZXN0KToKKyAgICAjIFRlc3QgbnVtYmVyIGZvcm1hdHRpbmcgd2l0aCBhIGNvb2tlZCAiZnJfRlIiIGxvY2FsZS4KKworICAgIGRlZiB0ZXN0X2RlY2ltYWxfcG9pbnQoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlLjJmIiwgMTIzNDUuNjcsIG91dD0nMTIzNDUsNjcnKQorCisgICAgZGVmIHRlc3RfZ3JvdXBpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlLjJmIiwgMzQ1LjY3LCBncm91cGluZz1UcnVlLCBvdXQ9JzM0NSw2NycpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlLjJmIiwgMTIzNDUuNjcsIGdyb3VwaW5nPVRydWUsIG91dD0nMTIgMzQ1LDY3JykKKworICAgIGRlZiB0ZXN0X2dyb3VwaW5nX2FuZF9wYWRkaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJTYuMmYiLCAzNDUuNjcsIGdyb3VwaW5nPVRydWUsIG91dD0nMzQ1LDY3JykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiU3LjJmIiwgMzQ1LjY3LCBncm91cGluZz1UcnVlLCBvdXQ9JyAzNDUsNjcnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJTguMmYiLCAxMjM0NS42NywgZ3JvdXBpbmc9VHJ1ZSwgb3V0PScxMiAzNDUsNjcnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJTkuMmYiLCAxMjM0NS42NywgZ3JvdXBpbmc9VHJ1ZSwgb3V0PScxMiAzNDUsNjcnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJTEwLjJmIiwgMTIzNDUuNjcsIGdyb3VwaW5nPVRydWUsIG91dD0nIDEyIDM0NSw2NycpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlLTYuMmYiLCAzNDUuNjcsIGdyb3VwaW5nPVRydWUsIG91dD0nMzQ1LDY3JykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUtNy4yZiIsIDM0NS42NywgZ3JvdXBpbmc9VHJ1ZSwgb3V0PSczNDUsNjcgJykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUtOC4yZiIsIDEyMzQ1LjY3LCBncm91cGluZz1UcnVlLCBvdXQ9JzEyIDM0NSw2NycpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlLTkuMmYiLCAxMjM0NS42NywgZ3JvdXBpbmc9VHJ1ZSwgb3V0PScxMiAzNDUsNjcnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJS0xMC4yZiIsIDEyMzQ1LjY3LCBncm91cGluZz1UcnVlLCBvdXQ9JzEyIDM0NSw2NyAnKQorCisgICAgZGVmIHRlc3RfaW50ZWdlcl9ncm91cGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiVkIiwgMjAwLCBncm91cGluZz1UcnVlLCBvdXQ9JzIwMCcpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlZCIsIDQyMDAsIGdyb3VwaW5nPVRydWUsIG91dD0nNCAyMDAnKQorCisgICAgZGVmIHRlc3RfaW50ZWdlcl9ncm91cGluZ19hbmRfcGFkZGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiU0ZCIsIDQyMDAsIGdyb3VwaW5nPVRydWUsIG91dD0nNCAyMDAnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJTVkIiwgNDIwMCwgZ3JvdXBpbmc9VHJ1ZSwgb3V0PSc0IDIwMCcpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlMTBkIiwgNDIwMCwgZ3JvdXBpbmc9VHJ1ZSwgb3V0PSc0IDIwMCcucmp1c3QoMTApKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJS00ZCIsIDQyMDAsIGdyb3VwaW5nPVRydWUsIG91dD0nNCAyMDAnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJS01ZCIsIDQyMDAsIGdyb3VwaW5nPVRydWUsIG91dD0nNCAyMDAnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJS0xMGQiLCA0MjAwLCBncm91cGluZz1UcnVlLCBvdXQ9JzQgMjAwJy5sanVzdCgxMCkpCisKKyAgICBkZWYgdGVzdF9jdXJyZW5jeShzZWxmKToKKyAgICAgICAgZXVybyA9IHUnXHUyMGFjJy5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgc2VsZi5fdGVzdF9jdXJyZW5jeSg1MDAwMCwgIjUwMDAwLDAwICIgKyBldXJvKQorICAgICAgICBzZWxmLl90ZXN0X2N1cnJlbmN5KDUwMDAwLCAiNTAgMDAwLDAwICIgKyBldXJvLCBncm91cGluZz1UcnVlKQorICAgICAgICAjIFhYWCBpcyB0aGUgdHJhaWxpbmcgc3BhY2UgYSBidWc/CisgICAgICAgIHNlbGYuX3Rlc3RfY3VycmVuY3koNTAwMDAsICI1MCAwMDAsMDAgRVVSICIsCisgICAgICAgICAgICBncm91cGluZz1UcnVlLCBpbnRlcm5hdGlvbmFsPVRydWUpCisKKworY2xhc3MgVGVzdFN0cmluZ01ldGhvZHMoQmFzZUxvY2FsaXplZFRlc3QpOgorICAgIGxvY2FsZV90eXBlID0gbG9jYWxlLkxDX0NUWVBFCisKKyAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ3N1bm9zNScgYW5kIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIik6CisgICAgICAgICMgVGVzdCBCU0QgUnVuZSBsb2NhbGUncyBidWcgZm9yIGlzY3R5cGUgZnVuY3Rpb25zLgorCisgICAgICAgIGRlZiB0ZXN0X2lzc3BhY2Uoc2VsZik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceDIwJy5pc3NwYWNlKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceGEwJy5pc3NwYWNlKCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhhMScuaXNzcGFjZSgpLCBGYWxzZSkKKworICAgICAgICBkZWYgdGVzdF9pc2FscGhhKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhjMCcuaXNhbHBoYSgpLCBGYWxzZSkKKworICAgICAgICBkZWYgdGVzdF9pc2FsbnVtKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhjMCcuaXNhbG51bSgpLCBGYWxzZSkKKworICAgICAgICBkZWYgdGVzdF9pc3VwcGVyKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhjMCcuaXN1cHBlcigpLCBGYWxzZSkKKworICAgICAgICBkZWYgdGVzdF9pc2xvd2VyKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhjMCcuaXNsb3dlcigpLCBGYWxzZSkKKworICAgICAgICBkZWYgdGVzdF9sb3dlcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4Y2NceDg1Jy5sb3dlcigpLCAnXHhjY1x4ODUnKQorCisgICAgICAgIGRlZiB0ZXN0X3VwcGVyKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhlZFx4OTVceGEwJy51cHBlcigpLCAnXHhlZFx4OTVceGEwJykKKworICAgICAgICBkZWYgdGVzdF9zdHJpcChzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4ZWRceDk1XHhhMCcuc3RyaXAoKSwgJ1x4ZWRceDk1XHhhMCcpCisKKyAgICAgICAgZGVmIHRlc3Rfc3BsaXQoc2VsZik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceGVjXHhhMFx4YmMnLnNwbGl0KCksIFsnXHhlY1x4YTBceGJjJ10pCisKKworY2xhc3MgVGVzdE1pc2NlbGxhbmVvdXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2dldHByZWZlcnJlZGVuY29kaW5nKHNlbGYpOgorICAgICAgICAjIEludm9rZSBnZXRwcmVmZXJyZWRlbmNvZGluZyB0byBtYWtlIHN1cmUgaXQgZG9lcyBub3QgY2F1c2UgZXhjZXB0aW9ucy4KKyAgICAgICAgZW5jID0gbG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nKCkKKyAgICAgICAgaWYgZW5jOgorICAgICAgICAgICAgIyBJZiBlbmNvZGluZyBub24tZW1wdHksIG1ha2Ugc3VyZSBpdCBpcyB2YWxpZAorICAgICAgICAgICAgY29kZWNzLmxvb2t1cChlbmMpCisKKyAgICBpZiBoYXNhdHRyKGxvY2FsZSwgInN0cmNvbGwiKToKKyAgICAgICAgZGVmIHRlc3Rfc3RyY29sbF8zMzAzKHNlbGYpOgorICAgICAgICAgICAgIyB0ZXN0IGNyYXNoZXIgZnJvbSBidWcgIzMzMDMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbG9jYWxlLnN0cmNvbGwsIHUiYSIsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9zZXRsb2NhbGVfY2F0ZWdvcnkoc2VsZik6CisgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0FMTCkKKyAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfVElNRSkKKyAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQ1RZUEUpCisgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0NPTExBVEUpCisgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX01PTkVUQVJZKQorICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19OVU1FUklDKQorCisgICAgICAgICMgY3Jhc2hlciBmcm9tIGJ1ZyAjNzQxOQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhsb2NhbGUuRXJyb3IsIGxvY2FsZS5zZXRsb2NhbGUsIDEyMzQ1KQorCisgICAgZGVmIHRlc3RfZ2V0c2V0bG9jYWxlX2lzc3VlMTgxMyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTgxMzogc2V0dGluZyBhbmQgZ2V0dGluZyB0aGUgbG9jYWxlIHVuZGVyIGEgVHVya2lzaCBsb2NhbGUKKyAgICAgICAgb2xkbG9jYWxlID0gbG9jYWxlLmdldGxvY2FsZSgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChsb2NhbGUuc2V0bG9jYWxlLCBsb2NhbGUuTENfQ1RZUEUsIG9sZGxvY2FsZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQ1RZUEUsICd0cl9UUicpCisgICAgICAgIGV4Y2VwdCBsb2NhbGUuRXJyb3I6CisgICAgICAgICAgICAjIFVuc3VwcG9ydGVkIGxvY2FsZSBvbiB0aGlzIHN5c3RlbQorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgndGVzdCBuZWVkcyBUdXJraXNoIGxvY2FsZScpCisgICAgICAgIGxvYyA9IGxvY2FsZS5nZXRsb2NhbGUoKQorICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19DVFlQRSwgbG9jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYywgbG9jYWxlLmdldGxvY2FsZSgpKQorCisgICAgZGVmIHRlc3Rfbm9ybWFsaXplX2lzc3VlMTI3NTIoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE4MTMgY2F1c2VkIGEgcmVncmVzc2lvbiB3aGVyZSBsb2NhbGUubm9ybWFsaXplKCkgd291bGQgbm8KKyAgICAgICAgIyBsb25nZXIgYWNjZXB0IHVuaWNvZGUgc3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NhbGUubm9ybWFsaXplKHUnZW5fVVMnKSwgJ2VuX1VTLklTTzg4NTktMScpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3RzID0gWworICAgICAgICBUZXN0TWlzY2VsbGFuZW91cywKKyAgICAgICAgVGVzdEZvcm1hdFBhdHRlcm5BcmcsCisgICAgICAgIFRlc3RMb2NhbGVGb3JtYXRTdHJpbmcsCisgICAgICAgIFRlc3RFblVTTnVtYmVyRm9ybWF0dGluZywKKyAgICAgICAgVGVzdENOdW1iZXJGb3JtYXR0aW5nLAorICAgICAgICBUZXN0RnJGUk51bWJlckZvcm1hdHRpbmcsCisgICAgXQorICAgICMgU2tpcFRlc3QgY2FuJ3QgYmUgcmFpc2VkIGluc2lkZSB1bml0dGVzdHMsIGhhbmRsZSBpdCBtYW51YWxseSBpbnN0ZWFkCisgICAgdHJ5OgorICAgICAgICBnZXRfZW5VU19sb2NhbGUoKQorICAgIGV4Y2VwdCB1bml0dGVzdC5Ta2lwVGVzdCBhcyBlOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIlNvbWUgdGVzdHMgd2lsbCBiZSBkaXNhYmxlZDogJXMiICUgZQorICAgIGVsc2U6CisgICAgICAgIHRlc3RzICs9IFtUZXN0TnVtYmVyRm9ybWF0dGluZywgVGVzdFN0cmluZ01ldGhvZHNdCisgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9jYWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvY2FsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0ZTVhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvY2FsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9jYWxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvY2FsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0ZTVhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvY2FsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9nZ2luZy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvZ2dpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiYzQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvZ2dpbmcucHkKQEAgLTAsMCArMSwxOTk1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDEtMjAxMyBieSBWaW5heSBTYWppcC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisjIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKKyMgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorIyBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyMgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBWaW5heSBTYWppcAorIyBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24KKyMgb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyMgVklOQVkgU0FKSVAgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORworIyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwKKyMgVklOQVkgU0FKSVAgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SCisjIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUgorIyBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAorIyBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisiIiJUZXN0IGhhcm5lc3MgZm9yIHRoZSBsb2dnaW5nIG1vZHVsZS4gUnVuIGFsbCB0ZXN0cy4KKworQ29weXJpZ2h0IChDKSAyMDAxLTIwMTMgVmluYXkgU2FqaXAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisiIiIKKworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBsb2dnaW5nLmhhbmRsZXJzCitpbXBvcnQgbG9nZ2luZy5jb25maWcKKworaW1wb3J0IGNvZGVjcworaW1wb3J0IGNQaWNrbGUKK2ltcG9ydCBjU3RyaW5nSU8KK2ltcG9ydCBnYworaW1wb3J0IGpzb24KK2ltcG9ydCBvcworaW1wb3J0IHJhbmRvbQoraW1wb3J0IHJlCitpbXBvcnQgc2VsZWN0CitpbXBvcnQgc29ja2V0Citmcm9tIFNvY2tldFNlcnZlciBpbXBvcnQgVGhyZWFkaW5nVENQU2VydmVyLCBTdHJlYW1SZXF1ZXN0SGFuZGxlcgoraW1wb3J0IHN0cnVjdAoraW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQsIHJ1bl93aXRoX2xvY2FsZSwgcnVuX3VuaXR0ZXN0CitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworaW1wb3J0IHdlYWtyZWYKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkaW5nID0gTm9uZQorCitjbGFzcyBCYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBsb2dnaW5nIHRlc3RzLiIiIgorCisgICAgbG9nX2Zvcm1hdCA9ICIlKG5hbWUpcyAtPiAlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIKKyAgICBleHBlY3RlZF9sb2dfcGF0ID0gciJeKFtcdy5dKykgLT4gKFtcd10rKTogKFtcZF0rKSQiCisgICAgbWVzc2FnZV9udW0gPSAwCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIlNldHVwIHRoZSBkZWZhdWx0IGxvZ2dpbmcgc3RyZWFtIHRvIGFuIGludGVybmFsIFN0cmluZ0lPIGluc3RhbmNlLAorICAgICAgICBzbyB0aGF0IHdlIGNhbiBleGFtaW5lIGxvZyBvdXRwdXQgYXMgd2Ugd2FudC4iIiIKKyAgICAgICAgbG9nZ2VyX2RpY3QgPSBsb2dnaW5nLmdldExvZ2dlcigpLm1hbmFnZXIubG9nZ2VyRGljdAorICAgICAgICBsb2dnaW5nLl9hY3F1aXJlTG9jaygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2F2ZWRfaGFuZGxlcnMgPSBsb2dnaW5nLl9oYW5kbGVycy5jb3B5KCkKKyAgICAgICAgICAgIHNlbGYuc2F2ZWRfaGFuZGxlcl9saXN0ID0gbG9nZ2luZy5faGFuZGxlckxpc3RbOl0KKyAgICAgICAgICAgIHNlbGYuc2F2ZWRfbG9nZ2VycyA9IGxvZ2dlcl9kaWN0LmNvcHkoKQorICAgICAgICAgICAgc2VsZi5zYXZlZF9sZXZlbF9uYW1lcyA9IGxvZ2dpbmcuX2xldmVsTmFtZXMuY29weSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBsb2dnaW5nLl9yZWxlYXNlTG9jaygpCisKKyAgICAgICAgIyBTZXQgdHdvIHVudXNlZCBsb2dnZXJzOiBvbmUgbm9uLUFTQ0lJIGFuZCBvbmUgVW5pY29kZS4KKyAgICAgICAgIyBUaGlzIGlzIHRvIHRlc3QgY29ycmVjdCBvcGVyYXRpb24gd2hlbiBzb3J0aW5nIGV4aXN0aW5nCisgICAgICAgICMgbG9nZ2VycyBpbiB0aGUgY29uZmlndXJhdGlvbiBjb2RlLiBTZWUgaXNzdWUgODIwMS4KKyAgICAgICAgbG9nZ2luZy5nZXRMb2dnZXIoIlx4YWJceGQ3XHhiYiIpCisgICAgICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKHUiXHUwMTNmXHUwMGQ2XHUwMDQ3IikKKworICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoIiIpCisgICAgICAgIHNlbGYub3JpZ2luYWxfbG9nZ2luZ19sZXZlbCA9IHNlbGYucm9vdF9sb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKQorCisgICAgICAgIHNlbGYuc3RyZWFtID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5yb290X2xvZ2dlci5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQorICAgICAgICBzZWxmLnJvb3RfaGRsciA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzZWxmLnN0cmVhbSkKKyAgICAgICAgc2VsZi5yb290X2Zvcm1hdHRlciA9IGxvZ2dpbmcuRm9ybWF0dGVyKHNlbGYubG9nX2Zvcm1hdCkKKyAgICAgICAgc2VsZi5yb290X2hkbHIuc2V0Rm9ybWF0dGVyKHNlbGYucm9vdF9mb3JtYXR0ZXIpCisgICAgICAgIHNlbGYucm9vdF9sb2dnZXIuYWRkSGFuZGxlcihzZWxmLnJvb3RfaGRscikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIiIiUmVtb3ZlIG91ciBsb2dnaW5nIHN0cmVhbSwgYW5kIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGxvZ2dpbmcKKyAgICAgICAgbGV2ZWwuIiIiCisgICAgICAgIHNlbGYuc3RyZWFtLmNsb3NlKCkKKyAgICAgICAgc2VsZi5yb290X2xvZ2dlci5yZW1vdmVIYW5kbGVyKHNlbGYucm9vdF9oZGxyKQorICAgICAgICB3aGlsZSBzZWxmLnJvb3RfbG9nZ2VyLmhhbmRsZXJzOgorICAgICAgICAgICAgaCA9IHNlbGYucm9vdF9sb2dnZXIuaGFuZGxlcnNbMF0KKyAgICAgICAgICAgIHNlbGYucm9vdF9sb2dnZXIucmVtb3ZlSGFuZGxlcihoKQorICAgICAgICAgICAgaC5jbG9zZSgpCisgICAgICAgIHNlbGYucm9vdF9sb2dnZXIuc2V0TGV2ZWwoc2VsZi5vcmlnaW5hbF9sb2dnaW5nX2xldmVsKQorICAgICAgICBsb2dnaW5nLl9hY3F1aXJlTG9jaygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvZ2dpbmcuX2xldmVsTmFtZXMuY2xlYXIoKQorICAgICAgICAgICAgbG9nZ2luZy5fbGV2ZWxOYW1lcy51cGRhdGUoc2VsZi5zYXZlZF9sZXZlbF9uYW1lcykKKyAgICAgICAgICAgIGxvZ2dpbmcuX2hhbmRsZXJzLmNsZWFyKCkKKyAgICAgICAgICAgIGxvZ2dpbmcuX2hhbmRsZXJzLnVwZGF0ZShzZWxmLnNhdmVkX2hhbmRsZXJzKQorICAgICAgICAgICAgbG9nZ2luZy5faGFuZGxlckxpc3RbOl0gPSBzZWxmLnNhdmVkX2hhbmRsZXJfbGlzdAorICAgICAgICAgICAgbG9nZ2VyRGljdCA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkubWFuYWdlci5sb2dnZXJEaWN0CisgICAgICAgICAgICBsb2dnZXJEaWN0LmNsZWFyKCkKKyAgICAgICAgICAgIGxvZ2dlckRpY3QudXBkYXRlKHNlbGYuc2F2ZWRfbG9nZ2VycykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvZ2dpbmcuX3JlbGVhc2VMb2NrKCkKKworICAgIGRlZiBhc3NlcnRfbG9nX2xpbmVzKHNlbGYsIGV4cGVjdGVkX3ZhbHVlcywgc3RyZWFtPU5vbmUpOgorICAgICAgICAiIiJNYXRjaCB0aGUgY29sbGVjdGVkIGxvZyBsaW5lcyBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAgc2VsZi5leHBlY3RlZF9sb2dfcGF0LCBhbmQgY29tcGFyZSB0aGUgZXh0cmFjdGVkIGdyb3VwIHZhbHVlcyB0bworICAgICAgICB0aGUgZXhwZWN0ZWRfdmFsdWVzIGxpc3Qgb2YgdHVwbGVzLiIiIgorICAgICAgICBzdHJlYW0gPSBzdHJlYW0gb3Igc2VsZi5zdHJlYW0KKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZShzZWxmLmV4cGVjdGVkX2xvZ19wYXQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN0cmVhbS5yZXNldCgpCisgICAgICAgICAgICBhY3R1YWxfbGluZXMgPSBzdHJlYW0ucmVhZGxpbmVzKCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgIyBTdHJpbmdJTy5TdHJpbmdJTyBsYWNrcyBhIHJlc2V0KCkgbWV0aG9kLgorICAgICAgICAgICAgYWN0dWFsX2xpbmVzID0gc3RyZWFtLmdldHZhbHVlKCkuc3BsaXRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFjdHVhbF9saW5lcyksIGxlbihleHBlY3RlZF92YWx1ZXMpKQorICAgICAgICBmb3IgYWN0dWFsLCBleHBlY3RlZCBpbiB6aXAoYWN0dWFsX2xpbmVzLCBleHBlY3RlZF92YWx1ZXMpOgorICAgICAgICAgICAgbWF0Y2ggPSBwYXQuc2VhcmNoKGFjdHVhbCkKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkxvZyBsaW5lIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHBhdHRlcm46XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKG1hdGNoLmdyb3VwcygpKSwgZXhwZWN0ZWQpCisgICAgICAgIHMgPSBzdHJlYW0ucmVhZCgpCisgICAgICAgIGlmIHM6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlJlbWFpbmluZyBvdXRwdXQgYXQgZW5kIG9mIGxvZyBzdHJlYW06XG4iICsgcykKKworICAgIGRlZiBuZXh0X21lc3NhZ2Uoc2VsZik6CisgICAgICAgICIiIkdlbmVyYXRlIGEgbWVzc2FnZSBjb25zaXN0aW5nIHNvbGVseSBvZiBhbiBhdXRvLWluY3JlbWVudGluZworICAgICAgICBpbnRlZ2VyLiIiIgorICAgICAgICBzZWxmLm1lc3NhZ2VfbnVtICs9IDEKKyAgICAgICAgcmV0dXJuICIlZCIgJSBzZWxmLm1lc3NhZ2VfbnVtCisKKworY2xhc3MgQnVpbHRpbkxldmVsc1Rlc3QoQmFzZVRlc3QpOgorICAgICIiIlRlc3QgYnVpbHRpbiBsZXZlbHMgYW5kIHRoZWlyIGluaGVyaXRhbmNlLiIiIgorCisgICAgZGVmIHRlc3RfZmxhdChzZWxmKToKKyAgICAgICAgI0xvZ2dpbmcgbGV2ZWxzIGluIGEgZmxhdCBsb2dnZXIgbmFtZXNwYWNlLgorICAgICAgICBtID0gc2VsZi5uZXh0X21lc3NhZ2UKKworICAgICAgICBFUlIgPSBsb2dnaW5nLmdldExvZ2dlcigiRVJSIikKKyAgICAgICAgRVJSLnNldExldmVsKGxvZ2dpbmcuRVJST1IpCisgICAgICAgIElORiA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJJTkYiKQorICAgICAgICBJTkYuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgICAgICBERUIgPSBsb2dnaW5nLmdldExvZ2dlcigiREVCIikKKyAgICAgICAgREVCLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCisKKyAgICAgICAgIyBUaGVzZSBzaG91bGQgbG9nLgorICAgICAgICBFUlIubG9nKGxvZ2dpbmcuQ1JJVElDQUwsIG0oKSkKKyAgICAgICAgRVJSLmVycm9yKG0oKSkKKworICAgICAgICBJTkYubG9nKGxvZ2dpbmcuQ1JJVElDQUwsIG0oKSkKKyAgICAgICAgSU5GLmVycm9yKG0oKSkKKyAgICAgICAgSU5GLndhcm4obSgpKQorICAgICAgICBJTkYuaW5mbyhtKCkpCisKKyAgICAgICAgREVCLmxvZyhsb2dnaW5nLkNSSVRJQ0FMLCBtKCkpCisgICAgICAgIERFQi5lcnJvcihtKCkpCisgICAgICAgIERFQi53YXJuIChtKCkpCisgICAgICAgIERFQi5pbmZvIChtKCkpCisgICAgICAgIERFQi5kZWJ1ZyhtKCkpCisKKyAgICAgICAgIyBUaGVzZSBzaG91bGQgbm90IGxvZy4KKyAgICAgICAgRVJSLndhcm4obSgpKQorICAgICAgICBFUlIuaW5mbyhtKCkpCisgICAgICAgIEVSUi5kZWJ1ZyhtKCkpCisKKyAgICAgICAgSU5GLmRlYnVnKG0oKSkKKworICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgKCdFUlInLCAnQ1JJVElDQUwnLCAnMScpLAorICAgICAgICAgICAgKCdFUlInLCAnRVJST1InLCAnMicpLAorICAgICAgICAgICAgKCdJTkYnLCAnQ1JJVElDQUwnLCAnMycpLAorICAgICAgICAgICAgKCdJTkYnLCAnRVJST1InLCAnNCcpLAorICAgICAgICAgICAgKCdJTkYnLCAnV0FSTklORycsICc1JyksCisgICAgICAgICAgICAoJ0lORicsICdJTkZPJywgJzYnKSwKKyAgICAgICAgICAgICgnREVCJywgJ0NSSVRJQ0FMJywgJzcnKSwKKyAgICAgICAgICAgICgnREVCJywgJ0VSUk9SJywgJzgnKSwKKyAgICAgICAgICAgICgnREVCJywgJ1dBUk5JTkcnLCAnOScpLAorICAgICAgICAgICAgKCdERUInLCAnSU5GTycsICcxMCcpLAorICAgICAgICAgICAgKCdERUInLCAnREVCVUcnLCAnMTEnKSwKKyAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF9leHBsaWNpdChzZWxmKToKKyAgICAgICAgIyBMb2dnaW5nIGxldmVscyBpbiBhIG5lc3RlZCBuYW1lc3BhY2UsIGFsbCBleHBsaWNpdGx5IHNldC4KKyAgICAgICAgbSA9IHNlbGYubmV4dF9tZXNzYWdlCisKKyAgICAgICAgSU5GID0gbG9nZ2luZy5nZXRMb2dnZXIoIklORiIpCisgICAgICAgIElORi5zZXRMZXZlbChsb2dnaW5nLklORk8pCisgICAgICAgIElORl9FUlIgID0gbG9nZ2luZy5nZXRMb2dnZXIoIklORi5FUlIiKQorICAgICAgICBJTkZfRVJSLnNldExldmVsKGxvZ2dpbmcuRVJST1IpCisKKyAgICAgICAgIyBUaGVzZSBzaG91bGQgbG9nLgorICAgICAgICBJTkZfRVJSLmxvZyhsb2dnaW5nLkNSSVRJQ0FMLCBtKCkpCisgICAgICAgIElORl9FUlIuZXJyb3IobSgpKQorCisgICAgICAgICMgVGhlc2Ugc2hvdWxkIG5vdCBsb2cuCisgICAgICAgIElORl9FUlIud2FybihtKCkpCisgICAgICAgIElORl9FUlIuaW5mbyhtKCkpCisgICAgICAgIElORl9FUlIuZGVidWcobSgpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAoJ0lORi5FUlInLCAnQ1JJVElDQUwnLCAnMScpLAorICAgICAgICAgICAgKCdJTkYuRVJSJywgJ0VSUk9SJywgJzInKSwKKyAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF9pbmhlcml0ZWQoc2VsZik6CisgICAgICAgICNMb2dnaW5nIGxldmVscyBpbiBhIG5lc3RlZCBuYW1lc3BhY2UsIGluaGVyaXRlZCBmcm9tIHBhcmVudCBsb2dnZXJzLgorICAgICAgICBtID0gc2VsZi5uZXh0X21lc3NhZ2UKKworICAgICAgICBJTkYgPSBsb2dnaW5nLmdldExvZ2dlcigiSU5GIikKKyAgICAgICAgSU5GLnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgICAgICAgSU5GX0VSUiAgPSBsb2dnaW5nLmdldExvZ2dlcigiSU5GLkVSUiIpCisgICAgICAgIElORl9FUlIuc2V0TGV2ZWwobG9nZ2luZy5FUlJPUikKKyAgICAgICAgSU5GX1VOREVGID0gbG9nZ2luZy5nZXRMb2dnZXIoIklORi5VTkRFRiIpCisgICAgICAgIElORl9FUlJfVU5ERUYgPSBsb2dnaW5nLmdldExvZ2dlcigiSU5GLkVSUi5VTkRFRiIpCisgICAgICAgIFVOREVGID0gbG9nZ2luZy5nZXRMb2dnZXIoIlVOREVGIikKKworICAgICAgICAjIFRoZXNlIHNob3VsZCBsb2cuCisgICAgICAgIElORl9VTkRFRi5sb2cobG9nZ2luZy5DUklUSUNBTCwgbSgpKQorICAgICAgICBJTkZfVU5ERUYuZXJyb3IobSgpKQorICAgICAgICBJTkZfVU5ERUYud2FybihtKCkpCisgICAgICAgIElORl9VTkRFRi5pbmZvKG0oKSkKKyAgICAgICAgSU5GX0VSUl9VTkRFRi5sb2cobG9nZ2luZy5DUklUSUNBTCwgbSgpKQorICAgICAgICBJTkZfRVJSX1VOREVGLmVycm9yKG0oKSkKKworICAgICAgICAjIFRoZXNlIHNob3VsZCBub3QgbG9nLgorICAgICAgICBJTkZfVU5ERUYuZGVidWcobSgpKQorICAgICAgICBJTkZfRVJSX1VOREVGLndhcm4obSgpKQorICAgICAgICBJTkZfRVJSX1VOREVGLmluZm8obSgpKQorICAgICAgICBJTkZfRVJSX1VOREVGLmRlYnVnKG0oKSkKKworICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgKCdJTkYuVU5ERUYnLCAnQ1JJVElDQUwnLCAnMScpLAorICAgICAgICAgICAgKCdJTkYuVU5ERUYnLCAnRVJST1InLCAnMicpLAorICAgICAgICAgICAgKCdJTkYuVU5ERUYnLCAnV0FSTklORycsICczJyksCisgICAgICAgICAgICAoJ0lORi5VTkRFRicsICdJTkZPJywgJzQnKSwKKyAgICAgICAgICAgICgnSU5GLkVSUi5VTkRFRicsICdDUklUSUNBTCcsICc1JyksCisgICAgICAgICAgICAoJ0lORi5FUlIuVU5ERUYnLCAnRVJST1InLCAnNicpLAorICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX3dpdGhfdmlydHVhbF9wYXJlbnQoc2VsZik6CisgICAgICAgICMgTG9nZ2luZyBsZXZlbHMgd2hlbiBzb21lIHBhcmVudCBkb2VzIG5vdCBleGlzdCB5ZXQuCisgICAgICAgIG0gPSBzZWxmLm5leHRfbWVzc2FnZQorCisgICAgICAgIElORiA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJJTkYiKQorICAgICAgICBHUkFORENISUxEID0gbG9nZ2luZy5nZXRMb2dnZXIoIklORi5CQURQQVJFTlQuVU5ERUYiKQorICAgICAgICBDSElMRCA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJJTkYuQkFEUEFSRU5UIikKKyAgICAgICAgSU5GLnNldExldmVsKGxvZ2dpbmcuSU5GTykKKworICAgICAgICAjIFRoZXNlIHNob3VsZCBsb2cuCisgICAgICAgIEdSQU5EQ0hJTEQubG9nKGxvZ2dpbmcuRkFUQUwsIG0oKSkKKyAgICAgICAgR1JBTkRDSElMRC5pbmZvKG0oKSkKKyAgICAgICAgQ0hJTEQubG9nKGxvZ2dpbmcuRkFUQUwsIG0oKSkKKyAgICAgICAgQ0hJTEQuaW5mbyhtKCkpCisKKyAgICAgICAgIyBUaGVzZSBzaG91bGQgbm90IGxvZy4KKyAgICAgICAgR1JBTkRDSElMRC5kZWJ1ZyhtKCkpCisgICAgICAgIENISUxELmRlYnVnKG0oKSkKKworICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgKCdJTkYuQkFEUEFSRU5ULlVOREVGJywgJ0NSSVRJQ0FMJywgJzEnKSwKKyAgICAgICAgICAgICgnSU5GLkJBRFBBUkVOVC5VTkRFRicsICdJTkZPJywgJzInKSwKKyAgICAgICAgICAgICgnSU5GLkJBRFBBUkVOVCcsICdDUklUSUNBTCcsICczJyksCisgICAgICAgICAgICAoJ0lORi5CQURQQVJFTlQnLCAnSU5GTycsICc0JyksCisgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX25hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbG9nZ2luZy5nZXRMb2dnZXIsIGFueSkKKworY2xhc3MgQmFzaWNGaWx0ZXJUZXN0KEJhc2VUZXN0KToKKworICAgICIiIlRlc3QgdGhlIGJ1bmRsZWQgRmlsdGVyIGNsYXNzLiIiIgorCisgICAgZGVmIHRlc3RfZmlsdGVyKHNlbGYpOgorICAgICAgICAjIE9ubHkgbWVzc2FnZXMgc2F0aXNmeWluZyB0aGUgc3BlY2lmaWVkIGNyaXRlcmlhIHBhc3MgdGhyb3VnaCB0aGUKKyAgICAgICAgIyAgZmlsdGVyLgorICAgICAgICBmaWx0ZXJfID0gbG9nZ2luZy5GaWx0ZXIoInNwYW0uZWdncyIpCisgICAgICAgIGhhbmRsZXIgPSBzZWxmLnJvb3RfbG9nZ2VyLmhhbmRsZXJzWzBdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhhbmRsZXIuYWRkRmlsdGVyKGZpbHRlcl8pCisgICAgICAgICAgICBzcGFtID0gbG9nZ2luZy5nZXRMb2dnZXIoInNwYW0iKQorICAgICAgICAgICAgc3BhbV9lZ2dzID0gbG9nZ2luZy5nZXRMb2dnZXIoInNwYW0uZWdncyIpCisgICAgICAgICAgICBzcGFtX2VnZ3NfZmlzaCA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJzcGFtLmVnZ3MuZmlzaCIpCisgICAgICAgICAgICBzcGFtX2Jha2VkYmVhbnMgPSBsb2dnaW5nLmdldExvZ2dlcigic3BhbS5iYWtlZGJlYW5zIikKKworICAgICAgICAgICAgc3BhbS5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzcGFtX2VnZ3MuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKSAgIyBHb29kLgorICAgICAgICAgICAgc3BhbV9lZ2dzX2Zpc2guaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKSAgIyBHb29kLgorICAgICAgICAgICAgc3BhbV9iYWtlZGJlYW5zLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICAgICAoJ3NwYW0uZWdncycsICdJTkZPJywgJzInKSwKKyAgICAgICAgICAgICAgICAoJ3NwYW0uZWdncy5maXNoJywgJ0lORk8nLCAnMycpLAorICAgICAgICAgICAgXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGhhbmRsZXIucmVtb3ZlRmlsdGVyKGZpbHRlcl8pCisKKworIworIyAgIEZpcnN0LCB3ZSBkZWZpbmUgb3VyIGxldmVscy4gVGhlcmUgY2FuIGJlIGFzIG1hbnkgYXMgeW91IHdhbnQgLSB0aGUgb25seQorIyAgICAgbGltaXRhdGlvbnMgYXJlIHRoYXQgdGhleSBzaG91bGQgYmUgaW50ZWdlcnMsIHRoZSBsb3dlc3Qgc2hvdWxkIGJlID4gMCBhbmQKKyMgICBsYXJnZXIgdmFsdWVzIG1lYW4gbGVzcyBpbmZvcm1hdGlvbiBiZWluZyBsb2dnZWQuIElmIHlvdSBuZWVkIHNwZWNpZmljCisjICAgbGV2ZWwgdmFsdWVzIHdoaWNoIGRvIG5vdCBmaXQgaW50byB0aGVzZSBsaW1pdGF0aW9ucywgeW91IGNhbiB1c2UgYQorIyAgIG1hcHBpbmcgZGljdGlvbmFyeSB0byBjb252ZXJ0IGJldHdlZW4geW91ciBhcHBsaWNhdGlvbiBsZXZlbHMgYW5kIHRoZQorIyAgIGxvZ2dpbmcgc3lzdGVtLgorIworU0lMRU5UICAgICAgPSAxMjAKK1RBQ0lUVVJOICAgID0gMTE5CitURVJTRSAgICAgICA9IDExOAorRUZGVVNJVkUgICAgPSAxMTcKK1NPQ0lBQkxFICAgID0gMTE2CitWRVJCT1NFICAgICA9IDExNQorVEFMS0FUSVZFICAgPSAxMTQKK0dBUlJVTE9VUyAgID0gMTEzCitDSEFUVEVSQk9YICA9IDExMgorQk9SSU5HICAgICAgPSAxMTEKKworTEVWRUxfUkFOR0UgPSByYW5nZShCT1JJTkcsIFNJTEVOVCArIDEpCisKKyMKKyMgICBOZXh0LCB3ZSBkZWZpbmUgbmFtZXMgZm9yIG91ciBsZXZlbHMuIFlvdSBkb24ndCBuZWVkIHRvIGRvIHRoaXMgLSBpbiB3aGljaAorIyAgIGNhc2UgdGhlIHN5c3RlbSB3aWxsIHVzZSAiTGV2ZWwgbiIgdG8gZGVub3RlIHRoZSB0ZXh0IGZvciB0aGUgbGV2ZWwuCisjCitteV9sb2dnaW5nX2xldmVscyA9IHsKKyAgICBTSUxFTlQgICAgICA6ICdTaWxlbnQnLAorICAgIFRBQ0lUVVJOICAgIDogJ1RhY2l0dXJuJywKKyAgICBURVJTRSAgICAgICA6ICdUZXJzZScsCisgICAgRUZGVVNJVkUgICAgOiAnRWZmdXNpdmUnLAorICAgIFNPQ0lBQkxFICAgIDogJ1NvY2lhYmxlJywKKyAgICBWRVJCT1NFICAgICA6ICdWZXJib3NlJywKKyAgICBUQUxLQVRJVkUgICA6ICdUYWxrYXRpdmUnLAorICAgIEdBUlJVTE9VUyAgIDogJ0dhcnJ1bG91cycsCisgICAgQ0hBVFRFUkJPWCAgOiAnQ2hhdHRlcmJveCcsCisgICAgQk9SSU5HICAgICAgOiAnQm9yaW5nJywKK30KKworY2xhc3MgR2FycnVsb3VzRmlsdGVyKGxvZ2dpbmcuRmlsdGVyKToKKworICAgICIiIkEgZmlsdGVyIHdoaWNoIGJsb2NrcyBnYXJydWxvdXMgbWVzc2FnZXMuIiIiCisKKyAgICBkZWYgZmlsdGVyKHNlbGYsIHJlY29yZCk6CisgICAgICAgIHJldHVybiByZWNvcmQubGV2ZWxubyAhPSBHQVJSVUxPVVMKKworY2xhc3MgVmVyeVNwZWNpZmljRmlsdGVyKGxvZ2dpbmcuRmlsdGVyKToKKworICAgICIiIkEgZmlsdGVyIHdoaWNoIGJsb2NrcyBzb2NpYWJsZSBhbmQgdGFjaXR1cm4gbWVzc2FnZXMuIiIiCisKKyAgICBkZWYgZmlsdGVyKHNlbGYsIHJlY29yZCk6CisgICAgICAgIHJldHVybiByZWNvcmQubGV2ZWxubyBub3QgaW4gW1NPQ0lBQkxFLCBUQUNJVFVSTl0KKworCitjbGFzcyBDdXN0b21MZXZlbHNBbmRGaWx0ZXJzVGVzdChCYXNlVGVzdCk6CisKKyAgICAiIiJUZXN0IHZhcmlvdXMgZmlsdGVyaW5nIHBvc3NpYmlsaXRpZXMgd2l0aCBjdXN0b20gbG9nZ2luZyBsZXZlbHMuIiIiCisKKyAgICAjIFNraXAgdGhlIGxvZ2dlciBuYW1lIGdyb3VwLgorICAgIGV4cGVjdGVkX2xvZ19wYXQgPSByIl5bXHcuXSsgLT4gKFtcd10rKTogKFtcZF0rKSQiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIEJhc2VUZXN0LnNldFVwKHNlbGYpCisgICAgICAgIGZvciBrLCB2IGluIG15X2xvZ2dpbmdfbGV2ZWxzLml0ZW1zKCk6CisgICAgICAgICAgICBsb2dnaW5nLmFkZExldmVsTmFtZShrLCB2KQorCisgICAgZGVmIGxvZ19hdF9hbGxfbGV2ZWxzKHNlbGYsIGxvZ2dlcik6CisgICAgICAgIGZvciBsdmwgaW4gTEVWRUxfUkFOR0U6CisgICAgICAgICAgICBsb2dnZXIubG9nKGx2bCwgc2VsZi5uZXh0X21lc3NhZ2UoKSkKKworICAgIGRlZiB0ZXN0X2xvZ2dlcl9maWx0ZXIoc2VsZik6CisgICAgICAgICMgRmlsdGVyIGF0IGxvZ2dlciBsZXZlbC4KKyAgICAgICAgc2VsZi5yb290X2xvZ2dlci5zZXRMZXZlbChWRVJCT1NFKQorICAgICAgICAjIExldmVscyA+PSAnVmVyYm9zZScgYXJlIGdvb2QuCisgICAgICAgIHNlbGYubG9nX2F0X2FsbF9sZXZlbHMoc2VsZi5yb290X2xvZ2dlcikKKyAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICgnVmVyYm9zZScsICc1JyksCisgICAgICAgICAgICAoJ1NvY2lhYmxlJywgJzYnKSwKKyAgICAgICAgICAgICgnRWZmdXNpdmUnLCAnNycpLAorICAgICAgICAgICAgKCdUZXJzZScsICc4JyksCisgICAgICAgICAgICAoJ1RhY2l0dXJuJywgJzknKSwKKyAgICAgICAgICAgICgnU2lsZW50JywgJzEwJyksCisgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9oYW5kbGVyX2ZpbHRlcihzZWxmKToKKyAgICAgICAgIyBGaWx0ZXIgYXQgaGFuZGxlciBsZXZlbC4KKyAgICAgICAgc2VsZi5yb290X2xvZ2dlci5oYW5kbGVyc1swXS5zZXRMZXZlbChTT0NJQUJMRSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBMZXZlbHMgPj0gJ1NvY2lhYmxlJyBhcmUgZ29vZC4KKyAgICAgICAgICAgIHNlbGYubG9nX2F0X2FsbF9sZXZlbHMoc2VsZi5yb290X2xvZ2dlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAgICAgKCdTb2NpYWJsZScsICc2JyksCisgICAgICAgICAgICAgICAgKCdFZmZ1c2l2ZScsICc3JyksCisgICAgICAgICAgICAgICAgKCdUZXJzZScsICc4JyksCisgICAgICAgICAgICAgICAgKCdUYWNpdHVybicsICc5JyksCisgICAgICAgICAgICAgICAgKCdTaWxlbnQnLCAnMTAnKSwKKyAgICAgICAgICAgIF0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyLmhhbmRsZXJzWzBdLnNldExldmVsKGxvZ2dpbmcuTk9UU0VUKQorCisgICAgZGVmIHRlc3Rfc3BlY2lmaWNfZmlsdGVycyhzZWxmKToKKyAgICAgICAgIyBTZXQgYSBzcGVjaWZpYyBmaWx0ZXIgb2JqZWN0IG9uIHRoZSBoYW5kbGVyLCBhbmQgdGhlbiBhZGQgYW5vdGhlcgorICAgICAgICAjICBmaWx0ZXIgb2JqZWN0IG9uIHRoZSBsb2dnZXIgaXRzZWxmLgorICAgICAgICBoYW5kbGVyID0gc2VsZi5yb290X2xvZ2dlci5oYW5kbGVyc1swXQorICAgICAgICBzcGVjaWZpY19maWx0ZXIgPSBOb25lCisgICAgICAgIGdhcnIgPSBHYXJydWxvdXNGaWx0ZXIoKQorICAgICAgICBoYW5kbGVyLmFkZEZpbHRlcihnYXJyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmxvZ19hdF9hbGxfbGV2ZWxzKHNlbGYucm9vdF9sb2dnZXIpCisgICAgICAgICAgICBmaXJzdF9saW5lcyA9IFsKKyAgICAgICAgICAgICAgICAjIE5vdGljZSBob3cgJ0dhcnJ1bG91cycgaXMgbWlzc2luZworICAgICAgICAgICAgICAgICgnQm9yaW5nJywgJzEnKSwKKyAgICAgICAgICAgICAgICAoJ0NoYXR0ZXJib3gnLCAnMicpLAorICAgICAgICAgICAgICAgICgnVGFsa2F0aXZlJywgJzQnKSwKKyAgICAgICAgICAgICAgICAoJ1ZlcmJvc2UnLCAnNScpLAorICAgICAgICAgICAgICAgICgnU29jaWFibGUnLCAnNicpLAorICAgICAgICAgICAgICAgICgnRWZmdXNpdmUnLCAnNycpLAorICAgICAgICAgICAgICAgICgnVGVyc2UnLCAnOCcpLAorICAgICAgICAgICAgICAgICgnVGFjaXR1cm4nLCAnOScpLAorICAgICAgICAgICAgICAgICgnU2lsZW50JywgJzEwJyksCisgICAgICAgICAgICBdCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoZmlyc3RfbGluZXMpCisKKyAgICAgICAgICAgIHNwZWNpZmljX2ZpbHRlciA9IFZlcnlTcGVjaWZpY0ZpbHRlcigpCisgICAgICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyLmFkZEZpbHRlcihzcGVjaWZpY19maWx0ZXIpCisgICAgICAgICAgICBzZWxmLmxvZ19hdF9hbGxfbGV2ZWxzKHNlbGYucm9vdF9sb2dnZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoZmlyc3RfbGluZXMgKyBbCisgICAgICAgICAgICAgICAgIyBOb3Qgb25seSAnR2FycnVsb3VzJyBpcyBzdGlsbCBtaXNzaW5nLCBidXQgYWxzbyAnU29jaWFibGUnCisgICAgICAgICAgICAgICAgIyBhbmQgJ1RhY2l0dXJuJworICAgICAgICAgICAgICAgICgnQm9yaW5nJywgJzExJyksCisgICAgICAgICAgICAgICAgKCdDaGF0dGVyYm94JywgJzEyJyksCisgICAgICAgICAgICAgICAgKCdUYWxrYXRpdmUnLCAnMTQnKSwKKyAgICAgICAgICAgICAgICAoJ1ZlcmJvc2UnLCAnMTUnKSwKKyAgICAgICAgICAgICAgICAoJ0VmZnVzaXZlJywgJzE3JyksCisgICAgICAgICAgICAgICAgKCdUZXJzZScsICcxOCcpLAorICAgICAgICAgICAgICAgICgnU2lsZW50JywgJzIwJyksCisgICAgICAgIF0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBzcGVjaWZpY19maWx0ZXI6CisgICAgICAgICAgICAgICAgc2VsZi5yb290X2xvZ2dlci5yZW1vdmVGaWx0ZXIoc3BlY2lmaWNfZmlsdGVyKQorICAgICAgICAgICAgaGFuZGxlci5yZW1vdmVGaWx0ZXIoZ2FycikKKworCitjbGFzcyBNZW1vcnlIYW5kbGVyVGVzdChCYXNlVGVzdCk6CisKKyAgICAiIiJUZXN0cyBmb3IgdGhlIE1lbW9yeUhhbmRsZXIuIiIiCisKKyAgICAjIERvIG5vdCBib3RoZXIgd2l0aCBhIGxvZ2dlciBuYW1lIGdyb3VwLgorICAgIGV4cGVjdGVkX2xvZ19wYXQgPSByIl5bXHcuXSsgLT4gKFtcd10rKTogKFtcZF0rKSQiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIEJhc2VUZXN0LnNldFVwKHNlbGYpCisgICAgICAgIHNlbGYubWVtX2hkbHIgPSBsb2dnaW5nLmhhbmRsZXJzLk1lbW9yeUhhbmRsZXIoMTAsIGxvZ2dpbmcuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yb290X2hkbHIpCisgICAgICAgIHNlbGYubWVtX2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdtZW0nKQorICAgICAgICBzZWxmLm1lbV9sb2dnZXIucHJvcGFnYXRlID0gMAorICAgICAgICBzZWxmLm1lbV9sb2dnZXIuYWRkSGFuZGxlcihzZWxmLm1lbV9oZGxyKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLm1lbV9oZGxyLmNsb3NlKCkKKyAgICAgICAgQmFzZVRlc3QudGVhckRvd24oc2VsZikKKworICAgIGRlZiB0ZXN0X2ZsdXNoKHNlbGYpOgorICAgICAgICAjIFRoZSBtZW1vcnkgaGFuZGxlciBmbHVzaGVzIHRvIGl0cyB0YXJnZXQgaGFuZGxlciBiYXNlZCBvbiBzcGVjaWZpYworICAgICAgICAjICBjcml0ZXJpYSAobWVzc2FnZSBjb3VudCBhbmQgbWVzc2FnZSBsZXZlbCkuCisgICAgICAgIHNlbGYubWVtX2xvZ2dlci5kZWJ1ZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisgICAgICAgIHNlbGYubWVtX2xvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbXSkKKyAgICAgICAgIyBUaGlzIHdpbGwgZmx1c2ggYmVjYXVzZSB0aGUgbGV2ZWwgaXMgPj0gbG9nZ2luZy5XQVJOSU5HCisgICAgICAgIHNlbGYubWVtX2xvZ2dlci53YXJuKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgIGxpbmVzID0gWworICAgICAgICAgICAgKCdERUJVRycsICcxJyksCisgICAgICAgICAgICAoJ0lORk8nLCAnMicpLAorICAgICAgICAgICAgKCdXQVJOSU5HJywgJzMnKSwKKyAgICAgICAgXQorICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMobGluZXMpCisgICAgICAgIGZvciBuIGluICg0LCAxNCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg5KToKKyAgICAgICAgICAgICAgICBzZWxmLm1lbV9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhsaW5lcykKKyAgICAgICAgICAgICMgVGhpcyB3aWxsIGZsdXNoIGJlY2F1c2UgaXQncyB0aGUgMTB0aCBtZXNzYWdlIHNpbmNlIHRoZSBsYXN0CisgICAgICAgICAgICAjICBmbHVzaC4KKyAgICAgICAgICAgIHNlbGYubWVtX2xvZ2dlci5kZWJ1ZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbGluZXMgPSBsaW5lcyArIFsoJ0RFQlVHJywgc3RyKGkpKSBmb3IgaSBpbiByYW5nZShuLCBuICsgMTApXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGxpbmVzKQorCisgICAgICAgIHNlbGYubWVtX2xvZ2dlci5kZWJ1ZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMobGluZXMpCisKKworY2xhc3MgRXhjZXB0aW9uRm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKToKKyAgICAiIiJBIHNwZWNpYWwgZXhjZXB0aW9uIGZvcm1hdHRlci4iIiIKKyAgICBkZWYgZm9ybWF0RXhjZXB0aW9uKHNlbGYsIGVpKToKKyAgICAgICAgcmV0dXJuICJHb3QgYSBbJXNdIiAlIGVpWzBdLl9fbmFtZV9fCisKKworY2xhc3MgQ29uZmlnRmlsZVRlc3QoQmFzZVRlc3QpOgorCisgICAgIiIiUmVhZGluZyBsb2dnaW5nIGNvbmZpZyBmcm9tIGEgLmluaS1zdHlsZSBjb25maWcgZmlsZS4iIiIKKworICAgIGV4cGVjdGVkX2xvZ19wYXQgPSByIl4oW1x3XSspIFwrXCsgKFtcd10rKSQiCisKKyAgICAjIGNvbmZpZzAgaXMgYSBzdGFuZGFyZCBjb25maWd1cmF0aW9uLgorICAgIGNvbmZpZzAgPSAiIiIKKyAgICBbbG9nZ2Vyc10KKyAgICBrZXlzPXJvb3QKKworICAgIFtoYW5kbGVyc10KKyAgICBrZXlzPWhhbmQxCisKKyAgICBbZm9ybWF0dGVyc10KKyAgICBrZXlzPWZvcm0xCisKKyAgICBbbG9nZ2VyX3Jvb3RdCisgICAgbGV2ZWw9V0FSTklORworICAgIGhhbmRsZXJzPWhhbmQxCisKKyAgICBbaGFuZGxlcl9oYW5kMV0KKyAgICBjbGFzcz1TdHJlYW1IYW5kbGVyCisgICAgbGV2ZWw9Tk9UU0VUCisgICAgZm9ybWF0dGVyPWZvcm0xCisgICAgYXJncz0oc3lzLnN0ZG91dCwpCisKKyAgICBbZm9ybWF0dGVyX2Zvcm0xXQorICAgIGZvcm1hdD0lKGxldmVsbmFtZSlzICsrICUobWVzc2FnZSlzCisgICAgZGF0ZWZtdD0KKyAgICAiIiIKKworICAgICMgY29uZmlnMSBhZGRzIGEgbGl0dGxlIHRvIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uLgorICAgIGNvbmZpZzEgPSAiIiIKKyAgICBbbG9nZ2Vyc10KKyAgICBrZXlzPXJvb3QscGFyc2VyCisKKyAgICBbaGFuZGxlcnNdCisgICAga2V5cz1oYW5kMQorCisgICAgW2Zvcm1hdHRlcnNdCisgICAga2V5cz1mb3JtMQorCisgICAgW2xvZ2dlcl9yb290XQorICAgIGxldmVsPVdBUk5JTkcKKyAgICBoYW5kbGVycz0KKworICAgIFtsb2dnZXJfcGFyc2VyXQorICAgIGxldmVsPURFQlVHCisgICAgaGFuZGxlcnM9aGFuZDEKKyAgICBwcm9wYWdhdGU9MQorICAgIHF1YWxuYW1lPWNvbXBpbGVyLnBhcnNlcgorCisgICAgW2hhbmRsZXJfaGFuZDFdCisgICAgY2xhc3M9U3RyZWFtSGFuZGxlcgorICAgIGxldmVsPU5PVFNFVAorICAgIGZvcm1hdHRlcj1mb3JtMQorICAgIGFyZ3M9KHN5cy5zdGRvdXQsKQorCisgICAgW2Zvcm1hdHRlcl9mb3JtMV0KKyAgICBmb3JtYXQ9JShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcworICAgIGRhdGVmbXQ9CisgICAgIiIiCisKKyAgICAjIGNvbmZpZzFhIG1vdmVzIHRoZSBoYW5kbGVyIHRvIHRoZSByb290LgorICAgIGNvbmZpZzFhID0gIiIiCisgICAgW2xvZ2dlcnNdCisgICAga2V5cz1yb290LHBhcnNlcgorCisgICAgW2hhbmRsZXJzXQorICAgIGtleXM9aGFuZDEKKworICAgIFtmb3JtYXR0ZXJzXQorICAgIGtleXM9Zm9ybTEKKworICAgIFtsb2dnZXJfcm9vdF0KKyAgICBsZXZlbD1XQVJOSU5HCisgICAgaGFuZGxlcnM9aGFuZDEKKworICAgIFtsb2dnZXJfcGFyc2VyXQorICAgIGxldmVsPURFQlVHCisgICAgaGFuZGxlcnM9CisgICAgcHJvcGFnYXRlPTEKKyAgICBxdWFsbmFtZT1jb21waWxlci5wYXJzZXIKKworICAgIFtoYW5kbGVyX2hhbmQxXQorICAgIGNsYXNzPVN0cmVhbUhhbmRsZXIKKyAgICBsZXZlbD1OT1RTRVQKKyAgICBmb3JtYXR0ZXI9Zm9ybTEKKyAgICBhcmdzPShzeXMuc3Rkb3V0LCkKKworICAgIFtmb3JtYXR0ZXJfZm9ybTFdCisgICAgZm9ybWF0PSUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMKKyAgICBkYXRlZm10PQorICAgICIiIgorCisgICAgIyBjb25maWcyIGhhcyBhIHN1YnRsZSBjb25maWd1cmF0aW9uIGVycm9yIHRoYXQgc2hvdWxkIGJlIHJlcG9ydGVkCisgICAgY29uZmlnMiA9IGNvbmZpZzEucmVwbGFjZSgic3lzLnN0ZG91dCIsICJzeXMuc3Rib3V0IikKKworICAgICMgY29uZmlnMyBoYXMgYSBsZXNzIHN1YnRsZSBjb25maWd1cmF0aW9uIGVycm9yCisgICAgY29uZmlnMyA9IGNvbmZpZzEucmVwbGFjZSgiZm9ybWF0dGVyPWZvcm0xIiwgImZvcm1hdHRlcj1taXNzcGVsbGVkX25hbWUiKQorCisgICAgIyBjb25maWc0IHNwZWNpZmllcyBhIGN1c3RvbSBmb3JtYXR0ZXIgY2xhc3MgdG8gYmUgbG9hZGVkCisgICAgY29uZmlnNCA9ICIiIgorICAgIFtsb2dnZXJzXQorICAgIGtleXM9cm9vdAorCisgICAgW2hhbmRsZXJzXQorICAgIGtleXM9aGFuZDEKKworICAgIFtmb3JtYXR0ZXJzXQorICAgIGtleXM9Zm9ybTEKKworICAgIFtsb2dnZXJfcm9vdF0KKyAgICBsZXZlbD1OT1RTRVQKKyAgICBoYW5kbGVycz1oYW5kMQorCisgICAgW2hhbmRsZXJfaGFuZDFdCisgICAgY2xhc3M9U3RyZWFtSGFuZGxlcgorICAgIGxldmVsPU5PVFNFVAorICAgIGZvcm1hdHRlcj1mb3JtMQorICAgIGFyZ3M9KHN5cy5zdGRvdXQsKQorCisgICAgW2Zvcm1hdHRlcl9mb3JtMV0KKyAgICBjbGFzcz0iIiIgKyBfX25hbWVfXyArICIiIi5FeGNlcHRpb25Gb3JtYXR0ZXIKKyAgICBmb3JtYXQ9JShsZXZlbG5hbWUpczolKG5hbWUpczolKG1lc3NhZ2UpcworICAgIGRhdGVmbXQ9CisgICAgIiIiCisKKyAgICAjIGNvbmZpZzUgc3BlY2lmaWVzIGEgY3VzdG9tIGhhbmRsZXIgY2xhc3MgdG8gYmUgbG9hZGVkCisgICAgY29uZmlnNSA9IGNvbmZpZzEucmVwbGFjZSgnY2xhc3M9U3RyZWFtSGFuZGxlcicsICdjbGFzcz1sb2dnaW5nLlN0cmVhbUhhbmRsZXInKQorCisgICAgIyBjb25maWc2IHVzZXMgJywgJyBkZWxpbWl0ZXJzIGluIHRoZSBoYW5kbGVycyBhbmQgZm9ybWF0dGVycyBzZWN0aW9ucworICAgIGNvbmZpZzYgPSAiIiIKKyAgICBbbG9nZ2Vyc10KKyAgICBrZXlzPXJvb3QscGFyc2VyCisKKyAgICBbaGFuZGxlcnNdCisgICAga2V5cz1oYW5kMSwgaGFuZDIKKworICAgIFtmb3JtYXR0ZXJzXQorICAgIGtleXM9Zm9ybTEsIGZvcm0yCisKKyAgICBbbG9nZ2VyX3Jvb3RdCisgICAgbGV2ZWw9V0FSTklORworICAgIGhhbmRsZXJzPQorCisgICAgW2xvZ2dlcl9wYXJzZXJdCisgICAgbGV2ZWw9REVCVUcKKyAgICBoYW5kbGVycz1oYW5kMQorICAgIHByb3BhZ2F0ZT0xCisgICAgcXVhbG5hbWU9Y29tcGlsZXIucGFyc2VyCisKKyAgICBbaGFuZGxlcl9oYW5kMV0KKyAgICBjbGFzcz1TdHJlYW1IYW5kbGVyCisgICAgbGV2ZWw9Tk9UU0VUCisgICAgZm9ybWF0dGVyPWZvcm0xCisgICAgYXJncz0oc3lzLnN0ZG91dCwpCisKKyAgICBbaGFuZGxlcl9oYW5kMl0KKyAgICBjbGFzcz1TdHJlYW1IYW5kbGVyCisgICAgbGV2ZWw9Tk9UU0VUCisgICAgZm9ybWF0dGVyPWZvcm0xCisgICAgYXJncz0oc3lzLnN0ZGVyciwpCisKKyAgICBbZm9ybWF0dGVyX2Zvcm0xXQorICAgIGZvcm1hdD0lKGxldmVsbmFtZSlzICsrICUobWVzc2FnZSlzCisgICAgZGF0ZWZtdD0KKworICAgIFtmb3JtYXR0ZXJfZm9ybTJdCisgICAgZm9ybWF0PSUobWVzc2FnZSlzCisgICAgZGF0ZWZtdD0KKyAgICAiIiIKKworICAgICMgY29uZmlnNyBhZGRzIGEgY29tcGlsZXIgbG9nZ2VyLgorICAgIGNvbmZpZzcgPSAiIiIKKyAgICBbbG9nZ2Vyc10KKyAgICBrZXlzPXJvb3QscGFyc2VyLGNvbXBpbGVyCisKKyAgICBbaGFuZGxlcnNdCisgICAga2V5cz1oYW5kMQorCisgICAgW2Zvcm1hdHRlcnNdCisgICAga2V5cz1mb3JtMQorCisgICAgW2xvZ2dlcl9yb290XQorICAgIGxldmVsPVdBUk5JTkcKKyAgICBoYW5kbGVycz1oYW5kMQorCisgICAgW2xvZ2dlcl9jb21waWxlcl0KKyAgICBsZXZlbD1ERUJVRworICAgIGhhbmRsZXJzPQorICAgIHByb3BhZ2F0ZT0xCisgICAgcXVhbG5hbWU9Y29tcGlsZXIKKworICAgIFtsb2dnZXJfcGFyc2VyXQorICAgIGxldmVsPURFQlVHCisgICAgaGFuZGxlcnM9CisgICAgcHJvcGFnYXRlPTEKKyAgICBxdWFsbmFtZT1jb21waWxlci5wYXJzZXIKKworICAgIFtoYW5kbGVyX2hhbmQxXQorICAgIGNsYXNzPVN0cmVhbUhhbmRsZXIKKyAgICBsZXZlbD1OT1RTRVQKKyAgICBmb3JtYXR0ZXI9Zm9ybTEKKyAgICBhcmdzPShzeXMuc3Rkb3V0LCkKKworICAgIFtmb3JtYXR0ZXJfZm9ybTFdCisgICAgZm9ybWF0PSUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMKKyAgICBkYXRlZm10PQorICAgICIiIgorCisgICAgZGlzYWJsZV90ZXN0ID0gIiIiCisgICAgW2xvZ2dlcnNdCisgICAga2V5cz1yb290CisKKyAgICBbaGFuZGxlcnNdCisgICAga2V5cz1zY3JlZW4KKworICAgIFtmb3JtYXR0ZXJzXQorICAgIGtleXM9CisKKyAgICBbbG9nZ2VyX3Jvb3RdCisgICAgbGV2ZWw9REVCVUcKKyAgICBoYW5kbGVycz1zY3JlZW4KKworICAgIFtoYW5kbGVyX3NjcmVlbl0KKyAgICBsZXZlbD1ERUJVRworICAgIGNsYXNzPVN0cmVhbUhhbmRsZXIKKyAgICBhcmdzPShzeXMuc3Rkb3V0LCkKKyAgICBmb3JtYXR0ZXI9CisgICAgIiIiCisKKyAgICBkZWYgYXBwbHlfY29uZmlnKHNlbGYsIGNvbmYsICoqa3dhcmdzKToKKyAgICAgICAgZmlsZSA9IGNTdHJpbmdJTy5TdHJpbmdJTyh0ZXh0d3JhcC5kZWRlbnQoY29uZikpCisgICAgICAgIGxvZ2dpbmcuY29uZmlnLmZpbGVDb25maWcoZmlsZSwgKiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdF9jb25maWcwX29rKHNlbGYpOgorICAgICAgICAjIEEgc2ltcGxlIGNvbmZpZyBmaWxlIHdoaWNoIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmNvbmZpZzApCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigpCisgICAgICAgICAgICAjIFdvbid0IG91dHB1dCBhbnl0aGluZworICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgICMgT3V0cHV0cyBhIG1lc3NhZ2UKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICAgICAoJ0VSUk9SJywgJzInKSwKKyAgICAgICAgICAgIF0sIHN0cmVhbT1vdXRwdXQpCisgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkuCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisKKyAgICBkZWYgdGVzdF9jb25maWcxX29rKHNlbGYsIGNvbmZpZz1jb25maWcxKToKKyAgICAgICAgIyBBIGNvbmZpZyBmaWxlIGRlZmluaW5nIGEgc3ViLXBhcnNlciBhcyB3ZWxsLgorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dHB1dDoKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKGNvbmZpZykKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21waWxlci5wYXJzZXIiKQorICAgICAgICAgICAgIyBCb3RoIHdpbGwgb3V0cHV0IGEgbWVzc2FnZQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICAgICAoJ0lORk8nLCAnMScpLAorICAgICAgICAgICAgICAgICgnRVJST1InLCAnMicpLAorICAgICAgICAgICAgXSwgc3RyZWFtPW91dHB1dCkKKyAgICAgICAgICAgICMgT3JpZ2luYWwgbG9nZ2VyIG91dHB1dCBpcyBlbXB0eS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbXSkKKworICAgIGRlZiB0ZXN0X2NvbmZpZzJfZmFpbHVyZShzZWxmKToKKyAgICAgICAgIyBBIHNpbXBsZSBjb25maWcgZmlsZSB3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0YW5kYXJkRXJyb3IsIHNlbGYuYXBwbHlfY29uZmlnLCBzZWxmLmNvbmZpZzIpCisKKyAgICBkZWYgdGVzdF9jb25maWczX2ZhaWx1cmUoc2VsZik6CisgICAgICAgICMgQSBzaW1wbGUgY29uZmlnIGZpbGUgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHNldHRpbmdzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdGFuZGFyZEVycm9yLCBzZWxmLmFwcGx5X2NvbmZpZywgc2VsZi5jb25maWczKQorCisgICAgZGVmIHRlc3RfY29uZmlnNF9vayhzZWxmKToKKyAgICAgICAgIyBBIGNvbmZpZyBmaWxlIHNwZWNpZnlpbmcgYSBjdXN0b20gZm9ybWF0dGVyIGNsYXNzLgorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dHB1dDoKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKHNlbGYuY29uZmlnNCkKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoKQorICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbigianVzdCB0ZXN0aW5nIikKKyAgICAgICAgICAgIHN5cy5zdGRvdXQuc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAiRVJST1I6cm9vdDpqdXN0IHRlc3RpbmdcbkdvdCBhIFtSdW50aW1lRXJyb3JdXG4iKQorICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5CisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisKKyAgICBkZWYgdGVzdF9jb25maWc1X29rKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3RfY29uZmlnMV9vayhjb25maWc9c2VsZi5jb25maWc1KQorCisgICAgZGVmIHRlc3RfY29uZmlnNl9vayhzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X2NvbmZpZzFfb2soY29uZmlnPXNlbGYuY29uZmlnNikKKworICAgIGRlZiB0ZXN0X2NvbmZpZzdfb2soc2VsZik6CisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5jb25maWcxYSkKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21waWxlci5wYXJzZXIiKQorICAgICAgICAgICAgIyBTZWUgaXNzdWUgIzExNDI0LiBjb21waWxlci1oeXBoZW5hdGVkIHNvcnRzCisgICAgICAgICAgICAjIGJldHdlZW4gY29tcGlsZXIgYW5kIGNvbXBpbGVyLnh5eiBhbmQgdGhpcworICAgICAgICAgICAgIyB3YXMgcHJldmVudGluZyBjb21waWxlci54eXogZnJvbSBiZWluZyBpbmNsdWRlZAorICAgICAgICAgICAgIyBpbiB0aGUgY2hpbGQgbG9nZ2VycyBvZiBjb21waWxlciBiZWNhdXNlIG9mIGFuCisgICAgICAgICAgICAjIG92ZXJ6ZWFsb3VzIGxvb3AgdGVybWluYXRpb24gY29uZGl0aW9uLgorICAgICAgICAgICAgaHlwaGVuYXRlZCA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdjb21waWxlci1oeXBoZW5hdGVkJykKKyAgICAgICAgICAgICMgQWxsIHdpbGwgb3V0cHV0IGEgbWVzc2FnZQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgaHlwaGVuYXRlZC5jcml0aWNhbChzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICAgICAoJ0lORk8nLCAnMScpLAorICAgICAgICAgICAgICAgICgnRVJST1InLCAnMicpLAorICAgICAgICAgICAgICAgICgnQ1JJVElDQUwnLCAnMycpLAorICAgICAgICAgICAgXSwgc3RyZWFtPW91dHB1dCkKKyAgICAgICAgICAgICMgT3JpZ2luYWwgbG9nZ2VyIG91dHB1dCBpcyBlbXB0eS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbXSkKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmNvbmZpZzcpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tcGlsZXIucGFyc2VyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9nZ2VyLmRpc2FibGVkKQorICAgICAgICAgICAgIyBCb3RoIHdpbGwgb3V0cHV0IGEgbWVzc2FnZQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbXBpbGVyLmxleGVyIikKKyAgICAgICAgICAgICMgQm90aCB3aWxsIG91dHB1dCBhIG1lc3NhZ2UKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgICMgV2lsbCBub3QgYXBwZWFyCisgICAgICAgICAgICBoeXBoZW5hdGVkLmNyaXRpY2FsKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgICAgICgnSU5GTycsICc0JyksCisgICAgICAgICAgICAgICAgKCdFUlJPUicsICc1JyksCisgICAgICAgICAgICAgICAgKCdJTkZPJywgJzYnKSwKKyAgICAgICAgICAgICAgICAoJ0VSUk9SJywgJzcnKSwKKyAgICAgICAgICAgIF0sIHN0cmVhbT1vdXRwdXQpCisgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkuCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisKKyAgICBkZWYgdGVzdF9sb2dnZXJfZGlzYWJsaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmRpc2FibGVfdGVzdCkKKyAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9nZ2VyLmRpc2FibGVkKQorICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmRpc2FibGVfdGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvZ2dlci5kaXNhYmxlZCkKKyAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5kaXNhYmxlX3Rlc3QsIGRpc2FibGVfZXhpc3RpbmdfbG9nZ2Vycz1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsb2dnZXIuZGlzYWJsZWQpCisKK2NsYXNzIExvZ1JlY29yZFN0cmVhbUhhbmRsZXIoU3RyZWFtUmVxdWVzdEhhbmRsZXIpOgorCisgICAgIiIiSGFuZGxlciBmb3IgYSBzdHJlYW1pbmcgbG9nZ2luZyByZXF1ZXN0LiBJdCBzYXZlcyB0aGUgbG9nIG1lc3NhZ2UgaW4gdGhlCisgICAgVENQIHNlcnZlcidzICdsb2dfb3V0cHV0JyBhdHRyaWJ1dGUuIiIiCisKKyAgICBUQ1BfTE9HX0VORCA9ICIhISFFTkQhISEiCisKKyAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAiIiJIYW5kbGUgbXVsdGlwbGUgcmVxdWVzdHMgLSBlYWNoIGV4cGVjdGVkIHRvIGJlIG9mIDQtYnl0ZSBsZW5ndGgsCisgICAgICAgIGZvbGxvd2VkIGJ5IHRoZSBMb2dSZWNvcmQgaW4gcGlja2xlIGZvcm1hdC4gTG9ncyB0aGUgcmVjb3JkCisgICAgICAgIGFjY29yZGluZyB0byB3aGF0ZXZlciBwb2xpY3kgaXMgY29uZmlndXJlZCBsb2NhbGx5LiIiIgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgY2h1bmsgPSBzZWxmLmNvbm5lY3Rpb24ucmVjdig0KQorICAgICAgICAgICAgaWYgbGVuKGNodW5rKSA8IDQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNsZW4gPSBzdHJ1Y3QudW5wYWNrKCI+TCIsIGNodW5rKVswXQorICAgICAgICAgICAgY2h1bmsgPSBzZWxmLmNvbm5lY3Rpb24ucmVjdihzbGVuKQorICAgICAgICAgICAgd2hpbGUgbGVuKGNodW5rKSA8IHNsZW46CisgICAgICAgICAgICAgICAgY2h1bmsgPSBjaHVuayArIHNlbGYuY29ubmVjdGlvbi5yZWN2KHNsZW4gLSBsZW4oY2h1bmspKQorICAgICAgICAgICAgb2JqID0gc2VsZi51bnBpY2tsZShjaHVuaykKKyAgICAgICAgICAgIHJlY29yZCA9IGxvZ2dpbmcubWFrZUxvZ1JlY29yZChvYmopCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9sb2dfcmVjb3JkKHJlY29yZCkKKworICAgIGRlZiB1bnBpY2tsZShzZWxmLCBkYXRhKToKKyAgICAgICAgcmV0dXJuIGNQaWNrbGUubG9hZHMoZGF0YSkKKworICAgIGRlZiBoYW5kbGVfbG9nX3JlY29yZChzZWxmLCByZWNvcmQpOgorICAgICAgICAjIElmIHRoZSBlbmQtb2YtbWVzc2FnZXMgc2VudGluZWwgaXMgc2VlbiwgdGVsbCB0aGUgc2VydmVyIHRvCisgICAgICAgICMgIHRlcm1pbmF0ZS4KKyAgICAgICAgaWYgc2VsZi5UQ1BfTE9HX0VORCBpbiByZWNvcmQubXNnOgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuYWJvcnQgPSAxCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5zZXJ2ZXIubG9nX291dHB1dCArPSByZWNvcmQubXNnICsgIlxuIgorCisKK2NsYXNzIExvZ1JlY29yZFNvY2tldFJlY2VpdmVyKFRocmVhZGluZ1RDUFNlcnZlcik6CisKKyAgICAiIiJBIHNpbXBsZS1taW5kZWQgVENQIHNvY2tldC1iYXNlZCBsb2dnaW5nIHJlY2VpdmVyIHN1aXRhYmxlIGZvciB0ZXN0CisgICAgcHVycG9zZXMuIiIiCisKKyAgICBhbGxvd19yZXVzZV9hZGRyZXNzID0gMQorICAgIGxvZ19vdXRwdXQgPSAiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ9bG9nZ2luZy5oYW5kbGVycy5ERUZBVUxUX1RDUF9MT0dHSU5HX1BPUlQsCisgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyPUxvZ1JlY29yZFN0cmVhbUhhbmRsZXIpOgorICAgICAgICBUaHJlYWRpbmdUQ1BTZXJ2ZXIuX19pbml0X18oc2VsZiwgKGhvc3QsIHBvcnQpLCBoYW5kbGVyKQorICAgICAgICBzZWxmLmFib3J0ID0gRmFsc2UKKyAgICAgICAgc2VsZi50aW1lb3V0ID0gMC4xCisgICAgICAgIHNlbGYuZmluaXNoZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQorCisgICAgZGVmIHNlcnZlX3VudGlsX3N0b3BwZWQoc2VsZik6CisgICAgICAgIHdoaWxlIG5vdCBzZWxmLmFib3J0OgorICAgICAgICAgICAgcmQsIHdyLCBleCA9IHNlbGVjdC5zZWxlY3QoW3NlbGYuc29ja2V0LmZpbGVubygpXSwgW10sIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aW1lb3V0KQorICAgICAgICAgICAgaWYgcmQ6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfcmVxdWVzdCgpCisgICAgICAgICMgTm90aWZ5IHRoZSBtYWluIHRocmVhZCB0aGF0IHdlJ3JlIGFib3V0IHRvIGV4aXQKKyAgICAgICAgc2VsZi5maW5pc2hlZC5zZXQoKQorICAgICAgICAjIGNsb3NlIHRoZSBsaXN0ZW4gc29ja2V0CisgICAgICAgIHNlbGYuc2VydmVyX2Nsb3NlKCkKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgU29ja2V0SGFuZGxlclRlc3QoQmFzZVRlc3QpOgorCisgICAgIiIiVGVzdCBmb3IgU29ja2V0SGFuZGxlciBvYmplY3RzLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJTZXQgdXAgYSBUQ1Agc2VydmVyIHRvIHJlY2VpdmUgbG9nIG1lc3NhZ2VzLCBhbmQgYSBTb2NrZXRIYW5kbGVyCisgICAgICAgIHBvaW50aW5nIHRvIHRoYXQgc2VydmVyJ3MgYWRkcmVzcyBhbmQgcG9ydC4iIiIKKyAgICAgICAgQmFzZVRlc3Quc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi50Y3BzZXJ2ZXIgPSBMb2dSZWNvcmRTb2NrZXRSZWNlaXZlcihwb3J0PTApCisgICAgICAgIHNlbGYucG9ydCA9IHNlbGYudGNwc2VydmVyLnNvY2tldC5nZXRzb2NrbmFtZSgpWzFdCisgICAgICAgIHNlbGYudGhyZWFkcyA9IFsKKyAgICAgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLnRjcHNlcnZlci5zZXJ2ZV91bnRpbF9zdG9wcGVkKV0KKyAgICAgICAgZm9yIHRocmVhZCBpbiBzZWxmLnRocmVhZHM6CisgICAgICAgICAgICB0aHJlYWQuc3RhcnQoKQorCisgICAgICAgIHNlbGYuc29ja19oZGxyID0gbG9nZ2luZy5oYW5kbGVycy5Tb2NrZXRIYW5kbGVyKCdsb2NhbGhvc3QnLCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuc29ja19oZGxyLnNldEZvcm1hdHRlcihzZWxmLnJvb3RfZm9ybWF0dGVyKQorICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyLnJlbW92ZUhhbmRsZXIoc2VsZi5yb290X2xvZ2dlci5oYW5kbGVyc1swXSkKKyAgICAgICAgc2VsZi5yb290X2xvZ2dlci5hZGRIYW5kbGVyKHNlbGYuc29ja19oZGxyKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAiIiJTaHV0ZG93biB0aGUgVENQIHNlcnZlci4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50Y3BzZXJ2ZXIuYWJvcnQgPSBUcnVlCisgICAgICAgICAgICBkZWwgc2VsZi50Y3BzZXJ2ZXIKKyAgICAgICAgICAgIHNlbGYucm9vdF9sb2dnZXIucmVtb3ZlSGFuZGxlcihzZWxmLnNvY2tfaGRscikKKyAgICAgICAgICAgIHNlbGYuc29ja19oZGxyLmNsb3NlKCkKKyAgICAgICAgICAgIGZvciB0aHJlYWQgaW4gc2VsZi50aHJlYWRzOgorICAgICAgICAgICAgICAgIHRocmVhZC5qb2luKDIuMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIEJhc2VUZXN0LnRlYXJEb3duKHNlbGYpCisKKyAgICBkZWYgZ2V0X291dHB1dChzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBsb2cgb3V0cHV0IGFzIHJlY2VpdmVkIGJ5IHRoZSBUQ1Agc2VydmVyLiIiIgorICAgICAgICAjIFNpZ25hbCB0aGUgVENQIHJlY2VpdmVyIGFuZCB3YWl0IGZvciBpdCB0byB0ZXJtaW5hdGUuCisgICAgICAgIHNlbGYucm9vdF9sb2dnZXIuY3JpdGljYWwoTG9nUmVjb3JkU3RyZWFtSGFuZGxlci5UQ1BfTE9HX0VORCkKKyAgICAgICAgc2VsZi50Y3BzZXJ2ZXIuZmluaXNoZWQud2FpdCgyLjApCisgICAgICAgIHJldHVybiBzZWxmLnRjcHNlcnZlci5sb2dfb3V0cHV0CisKKyAgICBkZWYgdGVzdF9vdXRwdXQoc2VsZik6CisgICAgICAgICMgVGhlIGxvZyBtZXNzYWdlIHNlbnQgdG8gdGhlIFNvY2tldEhhbmRsZXIgaXMgcHJvcGVybHkgcmVjZWl2ZWQuCisgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJ0Y3AiKQorICAgICAgICBsb2dnZXIuZXJyb3IoInNwYW0iKQorICAgICAgICBsb2dnZXIuZGVidWcoImVnZ3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X291dHB1dCgpLCAic3BhbVxuZWdnc1xuIikKKworCitjbGFzcyBNZW1vcnlUZXN0KEJhc2VUZXN0KToKKworICAgICIiIlRlc3QgbWVtb3J5IHBlcnNpc3RlbmNlIG9mIGxvZ2dlciBvYmplY3RzLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgYSBkaWN0IHRvIHJlbWVtYmVyIHBvdGVudGlhbGx5IGRlc3Ryb3llZCBvYmplY3RzLiIiIgorICAgICAgICBCYXNlVGVzdC5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLl9zdXJ2aXZvcnMgPSB7fQorCisgICAgZGVmIF93YXRjaF9mb3Jfc3Vydml2YWwoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJXYXRjaCB0aGUgZ2l2ZW4gb2JqZWN0cyBmb3Igc3Vydml2YWwsIGJ5IGNyZWF0aW5nIHdlYWtyZWZzIHRvCisgICAgICAgIHRoZW0uIiIiCisgICAgICAgIGZvciBvYmogaW4gYXJnczoKKyAgICAgICAgICAgIGtleSA9IGlkKG9iaiksIHJlcHIob2JqKQorICAgICAgICAgICAgc2VsZi5fc3Vydml2b3JzW2tleV0gPSB3ZWFrcmVmLnJlZihvYmopCisKKyAgICBkZWYgX2Fzc2VydFRydWVzdXJ2aXZhbChzZWxmKToKKyAgICAgICAgIiIiQXNzZXJ0IHRoYXQgYWxsIG9iamVjdHMgd2F0Y2hlZCBmb3Igc3Vydml2YWwgaGF2ZSBzdXJ2aXZlZC4iIiIKKyAgICAgICAgIyBUcmlnZ2VyIGN5Y2xlIGJyZWFraW5nLgorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZGVhZCA9IFtdCisgICAgICAgIGZvciAoaWRfLCByZXByXyksIHJlZiBpbiBzZWxmLl9zdXJ2aXZvcnMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHJlZigpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVhZC5hcHBlbmQocmVwcl8pCisgICAgICAgIGlmIGRlYWQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIiVkIG9iamVjdHMgc2hvdWxkIGhhdmUgc3Vydml2ZWQgIgorICAgICAgICAgICAgICAgICJidXQgaGF2ZSBiZWVuIGRlc3Ryb3llZDogJXMiICUgKGxlbihkZWFkKSwgIiwgIi5qb2luKGRlYWQpKSkKKworICAgIGRlZiB0ZXN0X3BlcnNpc3RlbnRfbG9nZ2VycyhzZWxmKToKKyAgICAgICAgIyBMb2dnZXIgb2JqZWN0cyBhcmUgcGVyc2lzdGVudCBhbmQgcmV0YWluIHRoZWlyIGNvbmZpZ3VyYXRpb24sIGV2ZW4KKyAgICAgICAgIyAgaWYgdmlzaWJsZSByZWZlcmVuY2VzIGFyZSBkZXN0cm95ZWQuCisgICAgICAgIHNlbGYucm9vdF9sb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgICAgICBmb28gPSBsb2dnaW5nLmdldExvZ2dlcigiZm9vIikKKyAgICAgICAgc2VsZi5fd2F0Y2hfZm9yX3N1cnZpdmFsKGZvbykKKyAgICAgICAgZm9vLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCisgICAgICAgIHNlbGYucm9vdF9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgZm9vLmRlYnVnKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAoJ2ZvbycsICdERUJVRycsICcyJyksCisgICAgICAgIF0pCisgICAgICAgIGRlbCBmb28KKyAgICAgICAgIyBmb28gaGFzIHN1cnZpdmVkLgorICAgICAgICBzZWxmLl9hc3NlcnRUcnVlc3Vydml2YWwoKQorICAgICAgICAjIGZvbyBoYXMgcmV0YWluZWQgaXRzIHNldHRpbmdzLgorICAgICAgICBiYXIgPSBsb2dnaW5nLmdldExvZ2dlcigiZm9vIikKKyAgICAgICAgYmFyLmRlYnVnKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAoJ2ZvbycsICdERUJVRycsICcyJyksCisgICAgICAgICAgICAoJ2ZvbycsICdERUJVRycsICczJyksCisgICAgICAgIF0pCisKKworY2xhc3MgRW5jb2RpbmdUZXN0KEJhc2VUZXN0KToKKyAgICBkZWYgdGVzdF9lbmNvZGluZ19wbGFpbl9maWxlKHNlbGYpOgorICAgICAgICAjIEluIFB5dGhvbiAyLngsIGEgcGxhaW4gZmlsZSBvYmplY3QgaXMgdHJlYXRlZCBhcyBoYXZpbmcgbm8gZW5jb2RpbmcuCisgICAgICAgIGxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJ0ZXN0IikKKyAgICAgICAgZm4gPSB0ZW1wZmlsZS5ta3RlbXAoIi5sb2ciKQorICAgICAgICAjIHRoZSBub24tYXNjaWkgZGF0YSB3ZSB3cml0ZSB0byB0aGUgbG9nLgorICAgICAgICBkYXRhID0gImZvb1x4ODAiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhhbmRsZXIgPSBsb2dnaW5nLkZpbGVIYW5kbGVyKGZuKQorICAgICAgICAgICAgbG9nLmFkZEhhbmRsZXIoaGFuZGxlcikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIHdyaXRlIG5vbi1hc2NpaSBkYXRhIHRvIHRoZSBsb2cuCisgICAgICAgICAgICAgICAgbG9nLndhcm5pbmcoZGF0YSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgbG9nLnJlbW92ZUhhbmRsZXIoaGFuZGxlcikKKyAgICAgICAgICAgICAgICBoYW5kbGVyLmNsb3NlKCkKKyAgICAgICAgICAgICMgY2hlY2sgd2Ugd3JvdGUgZXhhY3RseSB0aG9zZSBieXRlcywgaWdub3JpbmcgdHJhaWxpbmcgXG4gZXRjCisgICAgICAgICAgICBmID0gb3BlbihmbikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLnJzdHJpcCgpLCBkYXRhKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZuKToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZm4pCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZ19jeXJpbGxpY191bmljb2RlKHNlbGYpOgorICAgICAgICBsb2cgPSBsb2dnaW5nLmdldExvZ2dlcigidGVzdCIpCisgICAgICAgICNHZXQgYSBtZXNzYWdlIGluIFVuaWNvZGU6IERvIHN2aWRhbnlhIGluIEN5cmlsbGljIChtZWFuaW5nIGdvb2RieWUpCisgICAgICAgIG1lc3NhZ2UgPSB1J1x1MDQzNFx1MDQzZSBcdTA0NDFcdTA0MzJcdTA0MzhcdTA0MzRcdTA0MzBcdTA0M2RcdTA0MzhcdTA0NGYnCisgICAgICAgICNFbnN1cmUgaXQncyB3cml0dGVuIGluIGEgQ3lyaWxsaWMgZW5jb2RpbmcKKyAgICAgICAgd3JpdGVyX2NsYXNzID0gY29kZWNzLmdldHdyaXRlcignY3AxMjUxJykKKyAgICAgICAgd3JpdGVyX2NsYXNzLmVuY29kaW5nID0gJ2NwMTI1MScKKyAgICAgICAgc3RyZWFtID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgd3JpdGVyID0gd3JpdGVyX2NsYXNzKHN0cmVhbSwgJ3N0cmljdCcpCisgICAgICAgIGhhbmRsZXIgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIod3JpdGVyKQorICAgICAgICBsb2cuYWRkSGFuZGxlcihoYW5kbGVyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2cud2FybmluZyhtZXNzYWdlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9nLnJlbW92ZUhhbmRsZXIoaGFuZGxlcikKKyAgICAgICAgICAgIGhhbmRsZXIuY2xvc2UoKQorICAgICAgICAjIGNoZWNrIHdlIHdyb3RlIGV4YWN0bHkgdGhvc2UgYnl0ZXMsIGlnbm9yaW5nIHRyYWlsaW5nIFxuIGV0YworICAgICAgICBzID0gc3RyZWFtLmdldHZhbHVlKCkKKyAgICAgICAgI0NvbXBhcmUgYWdhaW5zdCB3aGF0IHRoZSBkYXRhIHNob3VsZCBiZSB3aGVuIGVuY29kZWQgaW4gQ1AtMTI1MQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICdceGU0XHhlZSBceGYxXHhlMlx4ZThceGU0XHhlMFx4ZWRceGU4XHhmZlxuJykKKworCitjbGFzcyBXYXJuaW5nc1Rlc3QoQmFzZVRlc3QpOgorCisgICAgZGVmIHRlc3Rfd2FybmluZ3Moc2VsZik6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIGxvZ2dpbmcuY2FwdHVyZVdhcm5pbmdzKFRydWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImFsd2F5cyIsIGNhdGVnb3J5PVVzZXJXYXJuaW5nKQorICAgICAgICAgICAgICAgIGZpbGUgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIGggPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoZmlsZSkKKyAgICAgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigicHkud2FybmluZ3MiKQorICAgICAgICAgICAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKGgpCisgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiSSdtIHdhcm5pbmcgeW91Li4uIikKKyAgICAgICAgICAgICAgICBsb2dnZXIucmVtb3ZlSGFuZGxlcihoKQorICAgICAgICAgICAgICAgIHMgPSBmaWxlLmdldHZhbHVlKCkKKyAgICAgICAgICAgICAgICBoLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5maW5kKCJVc2VyV2FybmluZzogSSdtIHdhcm5pbmcgeW91Li4uXG4iKSA+IDApCisKKyAgICAgICAgICAgICAgICAjU2VlIGlmIGFuIGV4cGxpY2l0IGZpbGUgdXNlcyB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgICAgICBmaWxlID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaG93d2FybmluZygiRXhwbGljaXQiLCBVc2VyV2FybmluZywgImR1bW15LnB5IiwgNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwgIkR1bW15IGxpbmUiKQorICAgICAgICAgICAgICAgIHMgPSBmaWxlLmdldHZhbHVlKCkKKyAgICAgICAgICAgICAgICBmaWxlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsCisgICAgICAgICAgICAgICAgICAgICAgICAiZHVtbXkucHk6NDI6IFVzZXJXYXJuaW5nOiBFeHBsaWNpdFxuICBEdW1teSBsaW5lXG4iKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmNhcHR1cmVXYXJuaW5ncyhGYWxzZSkKKworCitkZWYgZm9ybWF0RnVuYyhmb3JtYXQsIGRhdGVmbXQ9Tm9uZSk6CisgICAgcmV0dXJuIGxvZ2dpbmcuRm9ybWF0dGVyKGZvcm1hdCwgZGF0ZWZtdCkKKworZGVmIGhhbmRsZXJGdW5jKCk6CisgICAgcmV0dXJuIGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpCisKK2NsYXNzIEN1c3RvbUhhbmRsZXIobG9nZ2luZy5TdHJlYW1IYW5kbGVyKToKKyAgICBwYXNzCisKK2NsYXNzIENvbmZpZ0RpY3RUZXN0KEJhc2VUZXN0KToKKworICAgICIiIlJlYWRpbmcgbG9nZ2luZyBjb25maWcgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCisKKyAgICBleHBlY3RlZF9sb2dfcGF0ID0gciJeKFtcd10rKSBcK1wrIChbXHddKykkIgorCisgICAgIyBjb25maWcwIGlzIGEgc3RhbmRhcmQgY29uZmlndXJhdGlvbi4KKyAgICBjb25maWcwID0geworICAgICAgICAndmVyc2lvbic6IDEsCisgICAgICAgICdmb3JtYXR0ZXJzJzogeworICAgICAgICAgICAgJ2Zvcm0xJyA6IHsKKyAgICAgICAgICAgICAgICAnZm9ybWF0JyA6ICclKGxldmVsbmFtZSlzICsrICUobWVzc2FnZSlzJywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdoYW5kbGVycycgOiB7CisgICAgICAgICAgICAnaGFuZDEnIDogeworICAgICAgICAgICAgICAgICdjbGFzcycgOiAnbG9nZ2luZy5TdHJlYW1IYW5kbGVyJywKKyAgICAgICAgICAgICAgICAnZm9ybWF0dGVyJyA6ICdmb3JtMScsCisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdOT1RTRVQnLAorICAgICAgICAgICAgICAgICdzdHJlYW0nICA6ICdleHQ6Ly9zeXMuc3Rkb3V0JywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JyA6IHsKKyAgICAgICAgICAgICdsZXZlbCcgOiAnV0FSTklORycsCisgICAgICAgICAgICAnaGFuZGxlcnMnIDogWydoYW5kMSddLAorICAgICAgICB9LAorICAgIH0KKworICAgICMgY29uZmlnMSBhZGRzIGEgbGl0dGxlIHRvIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uLgorICAgIGNvbmZpZzEgPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdsb2dnaW5nLlN0cmVhbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRvdXQnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2xvZ2dlcnMnIDogeworICAgICAgICAgICAgJ2NvbXBpbGVyLnBhcnNlcicgOiB7CisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdERUJVRycsCisgICAgICAgICAgICAgICAgJ2hhbmRsZXJzJyA6IFsnaGFuZDEnXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JyA6IHsKKyAgICAgICAgICAgICdsZXZlbCcgOiAnV0FSTklORycsCisgICAgICAgIH0sCisgICAgfQorCisgICAgIyBjb25maWcyIGhhcyBhIHN1YnRsZSBjb25maWd1cmF0aW9uIGVycm9yIHRoYXQgc2hvdWxkIGJlIHJlcG9ydGVkCisgICAgY29uZmlnMiA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAxLAorICAgICAgICAnZm9ybWF0dGVycyc6IHsKKyAgICAgICAgICAgICdmb3JtMScgOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlcicgOiAnZm9ybTEnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgICAgICAgICAnc3RyZWFtJyAgOiAnZXh0Oi8vc3lzLnN0ZGJvdXQnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2xvZ2dlcnMnIDogeworICAgICAgICAgICAgJ2NvbXBpbGVyLnBhcnNlcicgOiB7CisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdERUJVRycsCisgICAgICAgICAgICAgICAgJ2hhbmRsZXJzJyA6IFsnaGFuZDEnXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JyA6IHsKKyAgICAgICAgICAgICdsZXZlbCcgOiAnV0FSTklORycsCisgICAgICAgIH0sCisgICAgfQorCisgICAgI0FzIGNvbmZpZzEgYnV0IHdpdGggYSBtaXNzcGVsdCBsZXZlbCBvbiBhIGhhbmRsZXIKKyAgICBjb25maWcyYSA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAxLAorICAgICAgICAnZm9ybWF0dGVycyc6IHsKKyAgICAgICAgICAgICdmb3JtMScgOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlcicgOiAnZm9ybTEnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnTlRPU0VUJywKKyAgICAgICAgICAgICAgICAnc3RyZWFtJyAgOiAnZXh0Oi8vc3lzLnN0ZG91dCcsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnbG9nZ2VycycgOiB7CisgICAgICAgICAgICAnY29tcGlsZXIucGFyc2VyJyA6IHsKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ0RFQlVHJywKKyAgICAgICAgICAgICAgICAnaGFuZGxlcnMnIDogWydoYW5kMSddLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ3Jvb3QnIDogeworICAgICAgICAgICAgJ2xldmVsJyA6ICdXQVJOSU5HJywKKyAgICAgICAgfSwKKyAgICB9CisKKworICAgICNBcyBjb25maWcxIGJ1dCB3aXRoIGEgbWlzc3BlbHQgbGV2ZWwgb24gYSBsb2dnZXIKKyAgICBjb25maWcyYiA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAxLAorICAgICAgICAnZm9ybWF0dGVycyc6IHsKKyAgICAgICAgICAgICdmb3JtMScgOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlcicgOiAnZm9ybTEnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgICAgICAgICAnc3RyZWFtJyAgOiAnZXh0Oi8vc3lzLnN0ZG91dCcsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnbG9nZ2VycycgOiB7CisgICAgICAgICAgICAnY29tcGlsZXIucGFyc2VyJyA6IHsKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ0RFQlVHJywKKyAgICAgICAgICAgICAgICAnaGFuZGxlcnMnIDogWydoYW5kMSddLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ3Jvb3QnIDogeworICAgICAgICAgICAgJ2xldmVsJyA6ICdXUkFOSU5HJywKKyAgICAgICAgfSwKKyAgICB9CisKKyAgICAjIGNvbmZpZzMgaGFzIGEgbGVzcyBzdWJ0bGUgY29uZmlndXJhdGlvbiBlcnJvcgorICAgIGNvbmZpZzMgPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdsb2dnaW5nLlN0cmVhbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ21pc3NwZWxsZWRfbmFtZScsCisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdOT1RTRVQnLAorICAgICAgICAgICAgICAgICdzdHJlYW0nICA6ICdleHQ6Ly9zeXMuc3Rkb3V0JywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdsb2dnZXJzJyA6IHsKKyAgICAgICAgICAgICdjb21waWxlci5wYXJzZXInIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnREVCVUcnLAorICAgICAgICAgICAgICAgICdoYW5kbGVycycgOiBbJ2hhbmQxJ10sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAncm9vdCcgOiB7CisgICAgICAgICAgICAnbGV2ZWwnIDogJ1dBUk5JTkcnLAorICAgICAgICB9LAorICAgIH0KKworICAgICMgY29uZmlnNCBzcGVjaWZpZXMgYSBjdXN0b20gZm9ybWF0dGVyIGNsYXNzIHRvIGJlIGxvYWRlZAorICAgIGNvbmZpZzQgPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICcoKScgOiBfX25hbWVfXyArICcuRXhjZXB0aW9uRm9ybWF0dGVyJywKKyAgICAgICAgICAgICAgICAnZm9ybWF0JyA6ICclKGxldmVsbmFtZSlzOiUobmFtZSlzOiUobWVzc2FnZSlzJywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdoYW5kbGVycycgOiB7CisgICAgICAgICAgICAnaGFuZDEnIDogeworICAgICAgICAgICAgICAgICdjbGFzcycgOiAnbG9nZ2luZy5TdHJlYW1IYW5kbGVyJywKKyAgICAgICAgICAgICAgICAnZm9ybWF0dGVyJyA6ICdmb3JtMScsCisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdOT1RTRVQnLAorICAgICAgICAgICAgICAgICdzdHJlYW0nICA6ICdleHQ6Ly9zeXMuc3Rkb3V0JywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JyA6IHsKKyAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgICAgICAgICAnaGFuZGxlcnMnIDogWydoYW5kMSddLAorICAgICAgICB9LAorICAgIH0KKworICAgICMgQXMgY29uZmlnNCBidXQgdXNpbmcgYW4gYWN0dWFsIGNhbGxhYmxlIHJhdGhlciB0aGFuIGEgc3RyaW5nCisgICAgY29uZmlnNGEgPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICcoKScgOiBFeGNlcHRpb25Gb3JtYXR0ZXIsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpczolKG5hbWUpczolKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJ2Zvcm0yJyA6IHsKKyAgICAgICAgICAgICAgICAnKCknIDogX19uYW1lX18gKyAnLmZvcm1hdEZ1bmMnLAorICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXM6JShuYW1lKXM6JShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICdmb3JtMycgOiB7CisgICAgICAgICAgICAgICAgJygpJyA6IGZvcm1hdEZ1bmMsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpczolKG5hbWUpczolKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlcicgOiAnZm9ybTEnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgICAgICAgICAnc3RyZWFtJyAgOiAnZXh0Oi8vc3lzLnN0ZG91dCcsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJ2hhbmQyJyA6IHsKKyAgICAgICAgICAgICAgICAnKCknIDogaGFuZGxlckZ1bmMsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAncm9vdCcgOiB7CisgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ2hhbmRsZXJzJyA6IFsnaGFuZDEnXSwKKyAgICAgICAgfSwKKyAgICB9CisKKyAgICAjIGNvbmZpZzUgc3BlY2lmaWVzIGEgY3VzdG9tIGhhbmRsZXIgY2xhc3MgdG8gYmUgbG9hZGVkCisgICAgY29uZmlnNSA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAxLAorICAgICAgICAnZm9ybWF0dGVycyc6IHsKKyAgICAgICAgICAgICdmb3JtMScgOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogX19uYW1lX18gKyAnLkN1c3RvbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRvdXQnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2xvZ2dlcnMnIDogeworICAgICAgICAgICAgJ2NvbXBpbGVyLnBhcnNlcicgOiB7CisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdERUJVRycsCisgICAgICAgICAgICAgICAgJ2hhbmRsZXJzJyA6IFsnaGFuZDEnXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JyA6IHsKKyAgICAgICAgICAgICdsZXZlbCcgOiAnV0FSTklORycsCisgICAgICAgIH0sCisgICAgfQorCisgICAgIyBjb25maWc2IHNwZWNpZmllcyBhIGN1c3RvbSBoYW5kbGVyIGNsYXNzIHRvIGJlIGxvYWRlZAorICAgICMgYnV0IGhhcyBiYWQgYXJndW1lbnRzCisgICAgY29uZmlnNiA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAxLAorICAgICAgICAnZm9ybWF0dGVycyc6IHsKKyAgICAgICAgICAgICdmb3JtMScgOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogX19uYW1lX18gKyAnLkN1c3RvbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRvdXQnLAorICAgICAgICAgICAgICAgICc5JyA6ICdpbnZhbGlkIHBhcmFtZXRlciBuYW1lJywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdsb2dnZXJzJyA6IHsKKyAgICAgICAgICAgICdjb21waWxlci5wYXJzZXInIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnREVCVUcnLAorICAgICAgICAgICAgICAgICdoYW5kbGVycycgOiBbJ2hhbmQxJ10sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAncm9vdCcgOiB7CisgICAgICAgICAgICAnbGV2ZWwnIDogJ1dBUk5JTkcnLAorICAgICAgICB9LAorICAgIH0KKworICAgICNjb25maWcgNyBkb2VzIG5vdCBkZWZpbmUgY29tcGlsZXIucGFyc2VyIGJ1dCBkZWZpbmVzIGNvbXBpbGVyLmxleGVyCisgICAgI3NvIGNvbXBpbGVyLnBhcnNlciBzaG91bGQgYmUgZGlzYWJsZWQgYWZ0ZXIgYXBwbHlpbmcgaXQKKyAgICBjb25maWc3ID0geworICAgICAgICAndmVyc2lvbic6IDEsCisgICAgICAgICdmb3JtYXR0ZXJzJzogeworICAgICAgICAgICAgJ2Zvcm0xJyA6IHsKKyAgICAgICAgICAgICAgICAnZm9ybWF0JyA6ICclKGxldmVsbmFtZSlzICsrICUobWVzc2FnZSlzJywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdoYW5kbGVycycgOiB7CisgICAgICAgICAgICAnaGFuZDEnIDogeworICAgICAgICAgICAgICAgICdjbGFzcycgOiAnbG9nZ2luZy5TdHJlYW1IYW5kbGVyJywKKyAgICAgICAgICAgICAgICAnZm9ybWF0dGVyJyA6ICdmb3JtMScsCisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdOT1RTRVQnLAorICAgICAgICAgICAgICAgICdzdHJlYW0nICA6ICdleHQ6Ly9zeXMuc3Rkb3V0JywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdsb2dnZXJzJyA6IHsKKyAgICAgICAgICAgICdjb21waWxlci5sZXhlcicgOiB7CisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdERUJVRycsCisgICAgICAgICAgICAgICAgJ2hhbmRsZXJzJyA6IFsnaGFuZDEnXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JyA6IHsKKyAgICAgICAgICAgICdsZXZlbCcgOiAnV0FSTklORycsCisgICAgICAgIH0sCisgICAgfQorCisgICAgY29uZmlnOCA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAxLAorICAgICAgICAnZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzJyA6IEZhbHNlLAorICAgICAgICAnZm9ybWF0dGVycyc6IHsKKyAgICAgICAgICAgICdmb3JtMScgOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlcicgOiAnZm9ybTEnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgICAgICAgICAnc3RyZWFtJyAgOiAnZXh0Oi8vc3lzLnN0ZG91dCcsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnbG9nZ2VycycgOiB7CisgICAgICAgICAgICAnY29tcGlsZXInIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnREVCVUcnLAorICAgICAgICAgICAgICAgICdoYW5kbGVycycgOiBbJ2hhbmQxJ10sCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgJ2NvbXBpbGVyLmxleGVyJyA6IHsKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JyA6IHsKKyAgICAgICAgICAgICdsZXZlbCcgOiAnV0FSTklORycsCisgICAgICAgIH0sCisgICAgfQorCisgICAgY29uZmlnOSA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAxLAorICAgICAgICAnZm9ybWF0dGVycyc6IHsKKyAgICAgICAgICAgICdmb3JtMScgOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlcicgOiAnZm9ybTEnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnV0FSTklORycsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRvdXQnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2xvZ2dlcnMnIDogeworICAgICAgICAgICAgJ2NvbXBpbGVyLnBhcnNlcicgOiB7CisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdXQVJOSU5HJywKKyAgICAgICAgICAgICAgICAnaGFuZGxlcnMnIDogWydoYW5kMSddLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ3Jvb3QnIDogeworICAgICAgICAgICAgJ2xldmVsJyA6ICdOT1RTRVQnLAorICAgICAgICB9LAorICAgIH0KKworICAgIGNvbmZpZzlhID0geworICAgICAgICAndmVyc2lvbic6IDEsCisgICAgICAgICdpbmNyZW1lbnRhbCcgOiBUcnVlLAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ1dBUk5JTkcnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2xvZ2dlcnMnIDogeworICAgICAgICAgICAgJ2NvbXBpbGVyLnBhcnNlcicgOiB7CisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdJTkZPJywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgfQorCisgICAgY29uZmlnOWIgPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ2luY3JlbWVudGFsJyA6IFRydWUsCisgICAgICAgICdoYW5kbGVycycgOiB7CisgICAgICAgICAgICAnaGFuZDEnIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnSU5GTycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnbG9nZ2VycycgOiB7CisgICAgICAgICAgICAnY29tcGlsZXIucGFyc2VyJyA6IHsKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ0lORk8nLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICB9CisKKyAgICAjQXMgY29uZmlnMSBidXQgd2l0aCBhIGZpbHRlciBhZGRlZAorICAgIGNvbmZpZzEwID0geworICAgICAgICAndmVyc2lvbic6IDEsCisgICAgICAgICdmb3JtYXR0ZXJzJzogeworICAgICAgICAgICAgJ2Zvcm0xJyA6IHsKKyAgICAgICAgICAgICAgICAnZm9ybWF0JyA6ICclKGxldmVsbmFtZSlzICsrICUobWVzc2FnZSlzJywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdmaWx0ZXJzJyA6IHsKKyAgICAgICAgICAgICdmaWx0MScgOiB7CisgICAgICAgICAgICAgICAgJ25hbWUnIDogJ2NvbXBpbGVyLnBhcnNlcicsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlcicgOiAnZm9ybTEnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgICAgICAgICAnc3RyZWFtJyAgOiAnZXh0Oi8vc3lzLnN0ZG91dCcsCisgICAgICAgICAgICAgICAgJ2ZpbHRlcnMnIDogWydmaWx0MSddLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2xvZ2dlcnMnIDogeworICAgICAgICAgICAgJ2NvbXBpbGVyLnBhcnNlcicgOiB7CisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdERUJVRycsCisgICAgICAgICAgICAgICAgJ2ZpbHRlcnMnIDogWydmaWx0MSddLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ3Jvb3QnIDogeworICAgICAgICAgICAgJ2xldmVsJyA6ICdXQVJOSU5HJywKKyAgICAgICAgICAgICdoYW5kbGVycycgOiBbJ2hhbmQxJ10sCisgICAgICAgIH0sCisgICAgfQorCisgICAgI0FzIGNvbmZpZzEgYnV0IHVzaW5nIGNmZzovLyByZWZlcmVuY2VzCisgICAgY29uZmlnMTEgPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ3RydWVfZm9ybWF0dGVycyc6IHsKKyAgICAgICAgICAgICdmb3JtMScgOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcl9jb25maWdzJzogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlcicgOiAnZm9ybTEnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgICAgICAgICAnc3RyZWFtJyAgOiAnZXh0Oi8vc3lzLnN0ZG91dCcsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnZm9ybWF0dGVycycgOiAnY2ZnOi8vdHJ1ZV9mb3JtYXR0ZXJzJywKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiAnY2ZnOi8vaGFuZGxlcl9jb25maWdzW2hhbmQxXScsCisgICAgICAgIH0sCisgICAgICAgICdsb2dnZXJzJyA6IHsKKyAgICAgICAgICAgICdjb21waWxlci5wYXJzZXInIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnREVCVUcnLAorICAgICAgICAgICAgICAgICdoYW5kbGVycycgOiBbJ2hhbmQxJ10sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAncm9vdCcgOiB7CisgICAgICAgICAgICAnbGV2ZWwnIDogJ1dBUk5JTkcnLAorICAgICAgICB9LAorICAgIH0KKworICAgICNBcyBjb25maWcxMSBidXQgbWlzc2luZyB0aGUgdmVyc2lvbiBrZXkKKyAgICBjb25maWcxMiA9IHsKKyAgICAgICAgJ3RydWVfZm9ybWF0dGVycyc6IHsKKyAgICAgICAgICAgICdmb3JtMScgOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcl9jb25maWdzJzogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlcicgOiAnZm9ybTEnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgICAgICAgICAnc3RyZWFtJyAgOiAnZXh0Oi8vc3lzLnN0ZG91dCcsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnZm9ybWF0dGVycycgOiAnY2ZnOi8vdHJ1ZV9mb3JtYXR0ZXJzJywKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiAnY2ZnOi8vaGFuZGxlcl9jb25maWdzW2hhbmQxXScsCisgICAgICAgIH0sCisgICAgICAgICdsb2dnZXJzJyA6IHsKKyAgICAgICAgICAgICdjb21waWxlci5wYXJzZXInIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnREVCVUcnLAorICAgICAgICAgICAgICAgICdoYW5kbGVycycgOiBbJ2hhbmQxJ10sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAncm9vdCcgOiB7CisgICAgICAgICAgICAnbGV2ZWwnIDogJ1dBUk5JTkcnLAorICAgICAgICB9LAorICAgIH0KKworICAgICNBcyBjb25maWcxMSBidXQgdXNpbmcgYW4gdW5zdXBwb3J0ZWQgdmVyc2lvbgorICAgIGNvbmZpZzEzID0geworICAgICAgICAndmVyc2lvbic6IDIsCisgICAgICAgICd0cnVlX2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJfY29uZmlncyc6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdsb2dnaW5nLlN0cmVhbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRvdXQnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnIDogJ2NmZzovL3RydWVfZm9ybWF0dGVycycsCisgICAgICAgICdoYW5kbGVycycgOiB7CisgICAgICAgICAgICAnaGFuZDEnIDogJ2NmZzovL2hhbmRsZXJfY29uZmlnc1toYW5kMV0nLAorICAgICAgICB9LAorICAgICAgICAnbG9nZ2VycycgOiB7CisgICAgICAgICAgICAnY29tcGlsZXIucGFyc2VyJyA6IHsKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ0RFQlVHJywKKyAgICAgICAgICAgICAgICAnaGFuZGxlcnMnIDogWydoYW5kMSddLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ3Jvb3QnIDogeworICAgICAgICAgICAgJ2xldmVsJyA6ICdXQVJOSU5HJywKKyAgICAgICAgfSwKKyAgICB9CisKKyAgICBvdXRfb2Zfb3JkZXIgPSB7CisgICAgICAgICJ2ZXJzaW9uIjogMSwKKyAgICAgICAgImZvcm1hdHRlcnMiOiB7CisgICAgICAgICAgICAibXlTaW1wbGVGb3JtYXR0ZXIiOiB7CisgICAgICAgICAgICAgICAgImZvcm1hdCI6ICIlKGFzY3RpbWUpcyAoJShuYW1lKXMpICUobGV2ZWxuYW1lKXM6ICUobWVzc2FnZSlzIgorICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAiaGFuZGxlcnMiOiB7CisgICAgICAgICAgICAiZmlsZUdsb2JhbCI6IHsKKyAgICAgICAgICAgICAgICAiY2xhc3MiOiAibG9nZ2luZy5TdHJlYW1IYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAibGV2ZWwiOiAiREVCVUciLAorICAgICAgICAgICAgICAgICJmb3JtYXR0ZXIiOiAibXlTaW1wbGVGb3JtYXR0ZXIiCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgImJ1ZmZlckdsb2JhbCI6IHsKKyAgICAgICAgICAgICAgICAiY2xhc3MiOiAibG9nZ2luZy5oYW5kbGVycy5NZW1vcnlIYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAiY2FwYWNpdHkiOiA1LAorICAgICAgICAgICAgICAgICJmb3JtYXR0ZXIiOiAibXlTaW1wbGVGb3JtYXR0ZXIiLAorICAgICAgICAgICAgICAgICJ0YXJnZXQiOiAiZmlsZUdsb2JhbCIsCisgICAgICAgICAgICAgICAgImxldmVsIjogIkRFQlVHIgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImxvZ2dlcnMiOiB7CisgICAgICAgICAgICAibXltb2R1bGUiOiB7CisgICAgICAgICAgICAgICAgImxldmVsIjogIkRFQlVHIiwKKyAgICAgICAgICAgICAgICAiaGFuZGxlcnMiOiBbImJ1ZmZlckdsb2JhbCJdLAorICAgICAgICAgICAgICAgICJwcm9wYWdhdGUiOiAidHJ1ZSIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGRlZiBhcHBseV9jb25maWcoc2VsZiwgY29uZik6CisgICAgICAgIGxvZ2dpbmcuY29uZmlnLmRpY3RDb25maWcoY29uZikKKworICAgIGRlZiB0ZXN0X2NvbmZpZzBfb2soc2VsZik6CisgICAgICAgICMgQSBzaW1wbGUgY29uZmlnIHdoaWNoIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmNvbmZpZzApCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigpCisgICAgICAgICAgICAjIFdvbid0IG91dHB1dCBhbnl0aGluZworICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgICMgT3V0cHV0cyBhIG1lc3NhZ2UKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICAgICAoJ0VSUk9SJywgJzInKSwKKyAgICAgICAgICAgIF0sIHN0cmVhbT1vdXRwdXQpCisgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkuCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisKKyAgICBkZWYgdGVzdF9jb25maWcxX29rKHNlbGYsIGNvbmZpZz1jb25maWcxKToKKyAgICAgICAgIyBBIGNvbmZpZyBkZWZpbmluZyBhIHN1Yi1wYXJzZXIgYXMgd2VsbC4KKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhjb25maWcpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tcGlsZXIucGFyc2VyIikKKyAgICAgICAgICAgICMgQm90aCB3aWxsIG91dHB1dCBhIG1lc3NhZ2UKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAgICAgKCdJTkZPJywgJzEnKSwKKyAgICAgICAgICAgICAgICAoJ0VSUk9SJywgJzInKSwKKyAgICAgICAgICAgIF0sIHN0cmVhbT1vdXRwdXQpCisgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkuCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisKKyAgICBkZWYgdGVzdF9jb25maWcyX2ZhaWx1cmUoc2VsZik6CisgICAgICAgICMgQSBzaW1wbGUgY29uZmlnIHdoaWNoIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RhbmRhcmRFcnJvciwgc2VsZi5hcHBseV9jb25maWcsIHNlbGYuY29uZmlnMikKKworICAgIGRlZiB0ZXN0X2NvbmZpZzJhX2ZhaWx1cmUoc2VsZik6CisgICAgICAgICMgQSBzaW1wbGUgY29uZmlnIHdoaWNoIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RhbmRhcmRFcnJvciwgc2VsZi5hcHBseV9jb25maWcsIHNlbGYuY29uZmlnMmEpCisKKyAgICBkZWYgdGVzdF9jb25maWcyYl9mYWlsdXJlKHNlbGYpOgorICAgICAgICAjIEEgc2ltcGxlIGNvbmZpZyB3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0YW5kYXJkRXJyb3IsIHNlbGYuYXBwbHlfY29uZmlnLCBzZWxmLmNvbmZpZzJiKQorCisgICAgZGVmIHRlc3RfY29uZmlnM19mYWlsdXJlKHNlbGYpOgorICAgICAgICAjIEEgc2ltcGxlIGNvbmZpZyB3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0YW5kYXJkRXJyb3IsIHNlbGYuYXBwbHlfY29uZmlnLCBzZWxmLmNvbmZpZzMpCisKKyAgICBkZWYgdGVzdF9jb25maWc0X29rKHNlbGYpOgorICAgICAgICAjIEEgY29uZmlnIHNwZWNpZnlpbmcgYSBjdXN0b20gZm9ybWF0dGVyIGNsYXNzLgorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dHB1dDoKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKHNlbGYuY29uZmlnNCkKKyAgICAgICAgICAgICNsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oImp1c3QgdGVzdGluZyIpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgIkVSUk9SOnJvb3Q6anVzdCB0ZXN0aW5nXG5Hb3QgYSBbUnVudGltZUVycm9yXVxuIikKKyAgICAgICAgICAgICMgT3JpZ2luYWwgbG9nZ2VyIG91dHB1dCBpcyBlbXB0eQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorCisgICAgZGVmIHRlc3RfY29uZmlnNGFfb2soc2VsZik6CisgICAgICAgICMgQSBjb25maWcgc3BlY2lmeWluZyBhIGN1c3RvbSBmb3JtYXR0ZXIgY2xhc3MuCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5jb25maWc0YSkKKyAgICAgICAgICAgICNsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oImp1c3QgdGVzdGluZyIpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgIkVSUk9SOnJvb3Q6anVzdCB0ZXN0aW5nXG5Hb3QgYSBbUnVudGltZUVycm9yXVxuIikKKyAgICAgICAgICAgICMgT3JpZ2luYWwgbG9nZ2VyIG91dHB1dCBpcyBlbXB0eQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorCisgICAgZGVmIHRlc3RfY29uZmlnNV9vayhzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X2NvbmZpZzFfb2soY29uZmlnPXNlbGYuY29uZmlnNSkKKworICAgIGRlZiB0ZXN0X2NvbmZpZzZfZmFpbHVyZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RhbmRhcmRFcnJvciwgc2VsZi5hcHBseV9jb25maWcsIHNlbGYuY29uZmlnNikKKworICAgIGRlZiB0ZXN0X2NvbmZpZzdfb2soc2VsZik6CisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5jb25maWcxKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbXBpbGVyLnBhcnNlciIpCisgICAgICAgICAgICAjIEJvdGggd2lsbCBvdXRwdXQgYSBtZXNzYWdlCisgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgICAgICgnSU5GTycsICcxJyksCisgICAgICAgICAgICAgICAgKCdFUlJPUicsICcyJyksCisgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQorICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dHB1dDoKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKHNlbGYuY29uZmlnNykKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21waWxlci5wYXJzZXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvZ2dlci5kaXNhYmxlZCkKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21waWxlci5sZXhlciIpCisgICAgICAgICAgICAjIEJvdGggd2lsbCBvdXRwdXQgYSBtZXNzYWdlCisgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgICAgICgnSU5GTycsICczJyksCisgICAgICAgICAgICAgICAgKCdFUlJPUicsICc0JyksCisgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQorICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorCisgICAgI1NhbWUgYXMgdGVzdF9jb25maWdfN19vayBidXQgZG9uJ3QgZGlzYWJsZSBvbGQgbG9nZ2Vycy4KKyAgICBkZWYgdGVzdF9jb25maWdfOF9vayhzZWxmKToKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmNvbmZpZzEpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tcGlsZXIucGFyc2VyIikKKyAgICAgICAgICAgICMgQm90aCB3aWxsIG91dHB1dCBhIG1lc3NhZ2UKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAgICAgKCdJTkZPJywgJzEnKSwKKyAgICAgICAgICAgICAgICAoJ0VSUk9SJywgJzInKSwKKyAgICAgICAgICAgIF0sIHN0cmVhbT1vdXRwdXQpCisgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkuCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5jb25maWc4KQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbXBpbGVyLnBhcnNlciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxvZ2dlci5kaXNhYmxlZCkKKyAgICAgICAgICAgICMgQm90aCB3aWxsIG91dHB1dCBhIG1lc3NhZ2UKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21waWxlci5sZXhlciIpCisgICAgICAgICAgICAjIEJvdGggd2lsbCBvdXRwdXQgYSBtZXNzYWdlCisgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgICAgICgnSU5GTycsICczJyksCisgICAgICAgICAgICAgICAgKCdFUlJPUicsICc0JyksCisgICAgICAgICAgICAgICAgKCdJTkZPJywgJzUnKSwKKyAgICAgICAgICAgICAgICAoJ0VSUk9SJywgJzYnKSwKKyAgICAgICAgICAgIF0sIHN0cmVhbT1vdXRwdXQpCisgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkuCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisKKyAgICBkZWYgdGVzdF9jb25maWdfOV9vayhzZWxmKToKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmNvbmZpZzkpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tcGlsZXIucGFyc2VyIikKKyAgICAgICAgICAgICNOb3RoaW5nIHdpbGwgYmUgb3V0cHV0IHNpbmNlIGJvdGggaGFuZGxlciBhbmQgbG9nZ2VyIGFyZSBzZXQgdG8gV0FSTklORworICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbXSwgc3RyZWFtPW91dHB1dCkKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKHNlbGYuY29uZmlnOWEpCisgICAgICAgICAgICAjTm90aGluZyB3aWxsIGJlIG91dHB1dCBzaW5jZSBib3RoIGhhbmRsZXIgaXMgc3RpbGwgc2V0IHRvIFdBUk5JTkcKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10sIHN0cmVhbT1vdXRwdXQpCisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmNvbmZpZzliKQorICAgICAgICAgICAgI01lc3NhZ2Ugc2hvdWxkIG5vdyBiZSBvdXRwdXQKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgICAgICgnSU5GTycsICczJyksCisgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQorCisgICAgZGVmIHRlc3RfY29uZmlnXzEwX29rKHNlbGYpOgorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dHB1dDoKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKHNlbGYuY29uZmlnMTApCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tcGlsZXIucGFyc2VyIikKKyAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignY29tcGlsZXInKQorICAgICAgICAgICAgI05vdCBvdXRwdXQsIGJlY2F1c2UgZmlsdGVyZWQKKyAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignY29tcGlsZXIubGV4ZXInKQorICAgICAgICAgICAgI05vdCBvdXRwdXQsIGJlY2F1c2UgZmlsdGVyZWQKKyAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tcGlsZXIucGFyc2VyLmNvZGVnZW4iKQorICAgICAgICAgICAgI091dHB1dCwgYXMgbm90IGZpbHRlcmVkCisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAgICAgKCdXQVJOSU5HJywgJzEnKSwKKyAgICAgICAgICAgICAgICAoJ0VSUk9SJywgJzQnKSwKKyAgICAgICAgICAgIF0sIHN0cmVhbT1vdXRwdXQpCisKKyAgICBkZWYgdGVzdF9jb25maWcxMV9vayhzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X2NvbmZpZzFfb2soc2VsZi5jb25maWcxMSkKKworICAgIGRlZiB0ZXN0X2NvbmZpZzEyX2ZhaWx1cmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0YW5kYXJkRXJyb3IsIHNlbGYuYXBwbHlfY29uZmlnLCBzZWxmLmNvbmZpZzEyKQorCisgICAgZGVmIHRlc3RfY29uZmlnMTNfZmFpbHVyZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RhbmRhcmRFcnJvciwgc2VsZi5hcHBseV9jb25maWcsIHNlbGYuY29uZmlnMTMpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdsaXN0ZW4oKSBuZWVkcyB0aHJlYWRpbmcgdG8gd29yaycpCisgICAgZGVmIHNldHVwX3ZpYV9saXN0ZW5lcihzZWxmLCB0ZXh0KToKKyAgICAgICAgIyBBc2sgZm9yIGEgcmFuZG9tbHkgYXNzaWduZWQgcG9ydCAoYnkgdXNpbmcgcG9ydCAwKQorICAgICAgICB0ID0gbG9nZ2luZy5jb25maWcubGlzdGVuKDApCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LnJlYWR5LndhaXQoKQorICAgICAgICAjIE5vdyBnZXQgdGhlIHBvcnQgYWxsb2NhdGVkCisgICAgICAgIHBvcnQgPSB0LnBvcnQKKyAgICAgICAgdC5yZWFkeS5jbGVhcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICAgICBzb2NrLnNldHRpbWVvdXQoMi4wKQorICAgICAgICAgICAgc29jay5jb25uZWN0KCgnbG9jYWxob3N0JywgcG9ydCkpCisKKyAgICAgICAgICAgIHNsZW4gPSBzdHJ1Y3QucGFjaygnPkwnLCBsZW4odGV4dCkpCisgICAgICAgICAgICBzID0gc2xlbiArIHRleHQKKyAgICAgICAgICAgIHNlbnRzb2ZhciA9IDAKKyAgICAgICAgICAgIGxlZnQgPSBsZW4ocykKKyAgICAgICAgICAgIHdoaWxlIGxlZnQgPiAwOgorICAgICAgICAgICAgICAgIHNlbnQgPSBzb2NrLnNlbmQoc1tzZW50c29mYXI6XSkKKyAgICAgICAgICAgICAgICBzZW50c29mYXIgKz0gc2VudAorICAgICAgICAgICAgICAgIGxlZnQgLT0gc2VudAorICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0LnJlYWR5LndhaXQoMi4wKQorICAgICAgICAgICAgbG9nZ2luZy5jb25maWcuc3RvcExpc3RlbmluZygpCisgICAgICAgICAgICB0LmpvaW4oMi4wKQorCisgICAgZGVmIHRlc3RfbGlzdGVuX2NvbmZpZ18xMF9vayhzZWxmKToKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLnNldHVwX3ZpYV9saXN0ZW5lcihqc29uLmR1bXBzKHNlbGYuY29uZmlnMTApKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbXBpbGVyLnBhcnNlciIpCisgICAgICAgICAgICBsb2dnZXIud2FybmluZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2NvbXBpbGVyJykKKyAgICAgICAgICAgICNOb3Qgb3V0cHV0LCBiZWNhdXNlIGZpbHRlcmVkCisgICAgICAgICAgICBsb2dnZXIud2FybmluZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2NvbXBpbGVyLmxleGVyJykKKyAgICAgICAgICAgICNOb3Qgb3V0cHV0LCBiZWNhdXNlIGZpbHRlcmVkCisgICAgICAgICAgICBsb2dnZXIud2FybmluZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbXBpbGVyLnBhcnNlci5jb2RlZ2VuIikKKyAgICAgICAgICAgICNPdXRwdXQsIGFzIG5vdCBmaWx0ZXJlZAorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgICAgICgnV0FSTklORycsICcxJyksCisgICAgICAgICAgICAgICAgKCdFUlJPUicsICc0JyksCisgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQorCisgICAgZGVmIHRlc3RfbGlzdGVuX2NvbmZpZ18xX29rKHNlbGYpOgorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dHB1dDoKKyAgICAgICAgICAgIHNlbGYuc2V0dXBfdmlhX2xpc3RlbmVyKHRleHR3cmFwLmRlZGVudChDb25maWdGaWxlVGVzdC5jb25maWcxKSkKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21waWxlci5wYXJzZXIiKQorICAgICAgICAgICAgIyBCb3RoIHdpbGwgb3V0cHV0IGEgbWVzc2FnZQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICAgICAoJ0lORk8nLCAnMScpLAorICAgICAgICAgICAgICAgICgnRVJST1InLCAnMicpLAorICAgICAgICAgICAgXSwgc3RyZWFtPW91dHB1dCkKKyAgICAgICAgICAgICMgT3JpZ2luYWwgbG9nZ2VyIG91dHB1dCBpcyBlbXB0eS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbXSkKKworICAgIGRlZiB0ZXN0X291dF9vZl9vcmRlcihzZWxmKToKKyAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5vdXRfb2Zfb3JkZXIpCisgICAgICAgIGhhbmRsZXIgPSBsb2dnaW5nLmdldExvZ2dlcignbXltb2R1bGUnKS5oYW5kbGVyc1swXQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaGFuZGxlci50YXJnZXQsIGxvZ2dpbmcuSGFuZGxlcikKKworY2xhc3MgTWFuYWdlclRlc3QoQmFzZVRlc3QpOgorICAgIGRlZiB0ZXN0X21hbmFnZXJfbG9nZ2VyY2xhc3Moc2VsZik6CisgICAgICAgIGxvZ2dlZCA9IFtdCisKKyAgICAgICAgY2xhc3MgTXlMb2dnZXIobG9nZ2luZy5Mb2dnZXIpOgorICAgICAgICAgICAgZGVmIF9sb2coc2VsZiwgbGV2ZWwsIG1zZywgYXJncywgZXhjX2luZm89Tm9uZSwgZXh0cmE9Tm9uZSk6CisgICAgICAgICAgICAgICAgbG9nZ2VkLmFwcGVuZChtc2cpCisKKyAgICAgICAgbWFuID0gbG9nZ2luZy5NYW5hZ2VyKE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWFuLnNldExvZ2dlckNsYXNzLCBpbnQpCisgICAgICAgIG1hbi5zZXRMb2dnZXJDbGFzcyhNeUxvZ2dlcikKKyAgICAgICAgbG9nZ2VyID0gbWFuLmdldExvZ2dlcigndGVzdCcpCisgICAgICAgIGxvZ2dlci53YXJuaW5nKCdzaG91bGQgYXBwZWFyIGluIGxvZ2dlZCcpCisgICAgICAgIGxvZ2dpbmcud2FybmluZygnc2hvdWxkIG5vdCBhcHBlYXIgaW4gbG9nZ2VkJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZ2dlZCwgWydzaG91bGQgYXBwZWFyIGluIGxvZ2dlZCddKQorCisKK2NsYXNzIENoaWxkTG9nZ2VyVGVzdChCYXNlVGVzdCk6CisgICAgZGVmIHRlc3RfY2hpbGRfbG9nZ2VycyhzZWxmKToKKyAgICAgICAgciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkKKyAgICAgICAgbDEgPSBsb2dnaW5nLmdldExvZ2dlcignYWJjJykKKyAgICAgICAgbDIgPSBsb2dnaW5nLmdldExvZ2dlcignZGVmLmdoaScpCisgICAgICAgIGMxID0gci5nZXRDaGlsZCgneHl6JykKKyAgICAgICAgYzIgPSByLmdldENoaWxkKCd1dncueHl6JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMxIGlzIGxvZ2dpbmcuZ2V0TG9nZ2VyKCd4eXonKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMyIGlzIGxvZ2dpbmcuZ2V0TG9nZ2VyKCd1dncueHl6JykpCisgICAgICAgIGMxID0gbDEuZ2V0Q2hpbGQoJ2RlZicpCisgICAgICAgIGMyID0gYzEuZ2V0Q2hpbGQoJ2doaScpCisgICAgICAgIGMzID0gbDEuZ2V0Q2hpbGQoJ2RlZi5naGknKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYzEgaXMgbG9nZ2luZy5nZXRMb2dnZXIoJ2FiYy5kZWYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMyIGlzIGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhYmMuZGVmLmdoaScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYzIgaXMgYzMpCisKKworY2xhc3MgSGFuZGxlclRlc3QoQmFzZVRlc3QpOgorCisgICAgQHVuaXR0ZXN0LnNraXBJZihvcy5uYW1lID09ICdudCcsICdXYXRjaGVkRmlsZUhhbmRsZXIgbm90IGFwcHJvcHJpYXRlIGZvciBXaW5kb3dzLicpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBkZWYgdGVzdF9yYWNlKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNDYzMiByZWZlcnMuCisgICAgICAgIGRlZiByZW1vdmVfbG9vcChmbmFtZSwgdHJpZXMpOgorICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UodHJpZXMpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZuYW1lKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAwNCAqIHJhbmRvbS5yYW5kaW50KDAsIDQpKQorCisgICAgICAgIGRlbF9jb3VudCA9IDUwMAorICAgICAgICBsb2dfY291bnQgPSA1MDAKKworICAgICAgICBmb3IgZGVsYXkgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgIGZkLCBmbiA9IHRlbXBmaWxlLm1rc3RlbXAoJy5sb2cnLCAndGVzdF9sb2dnaW5nLTMtJykKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICAgICAgcmVtb3ZlciA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJlbW92ZV9sb29wLCBhcmdzPShmbiwgZGVsX2NvdW50KSkKKyAgICAgICAgICAgIHJlbW92ZXIuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgcmVtb3Zlci5zdGFydCgpCisgICAgICAgICAgICBoID0gbG9nZ2luZy5oYW5kbGVycy5XYXRjaGVkRmlsZUhhbmRsZXIoZm4sIGRlbGF5PWRlbGF5KQorICAgICAgICAgICAgZiA9IGxvZ2dpbmcuRm9ybWF0dGVyKCclKGFzY3RpbWUpczogJShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMnKQorICAgICAgICAgICAgaC5zZXRGb3JtYXR0ZXIoZikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiByYW5nZShsb2dfY291bnQpOgorICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDA1KQorICAgICAgICAgICAgICAgICAgICByID0gbG9nZ2luZy5tYWtlTG9nUmVjb3JkKHsnbXNnJzogJ3Rlc3RpbmcnIH0pCisgICAgICAgICAgICAgICAgICAgIGguaGFuZGxlKHIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHJlbW92ZXIuam9pbigpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBoLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuKToKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZuKQorCisKKyMgU2V0IHRoZSBsb2NhbGUgdG8gdGhlIHBsYXRmb3JtLWRlcGVuZGVudCBkZWZhdWx0LiAgSSBoYXZlIG5vIGlkZWEKKyMgd2h5IHRoZSB0ZXN0IGRvZXMgdGhpcywgYnV0IGluIGFueSBjYXNlIHdlIHNhdmUgdGhlIGN1cnJlbnQgbG9jYWxlCisjIGZpcnN0IGFuZCByZXN0b3JlIGl0IGF0IHRoZSBlbmQuCitAcnVuX3dpdGhfbG9jYWxlKCdMQ19BTEwnLCAnJykKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoQnVpbHRpbkxldmVsc1Rlc3QsIEJhc2ljRmlsdGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgQ3VzdG9tTGV2ZWxzQW5kRmlsdGVyc1Rlc3QsIE1lbW9yeUhhbmRsZXJUZXN0LAorICAgICAgICAgICAgICAgICBDb25maWdGaWxlVGVzdCwgU29ja2V0SGFuZGxlclRlc3QsIE1lbW9yeVRlc3QsCisgICAgICAgICAgICAgICAgIEVuY29kaW5nVGVzdCwgV2FybmluZ3NUZXN0LCBDb25maWdEaWN0VGVzdCwgTWFuYWdlclRlc3QsCisgICAgICAgICAgICAgICAgIENoaWxkTG9nZ2VyVGVzdCwgSGFuZGxlclRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvZ2dpbmcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9nZ2luZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhMDllNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvZ2dpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvZ2dpbmcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9nZ2luZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhMDllNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvZ2dpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmcucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODQ3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nLnB5CkBAIC0wLDAgKzEsOTE2IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKKworaW1wb3J0IHJhbmRvbQoraW1wb3J0IG1hdGgKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2ludCwgdGVzdF9zdXBwb3J0CisKKyMgVXNlZCBmb3IgbGF6eSBmb3JtYXR0aW5nIG9mIGZhaWx1cmUgbWVzc2FnZXMKK2NsYXNzIEZybShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb3JtYXQsICphcmdzKToKKyAgICAgICAgc2VsZi5mb3JtYXQgPSBmb3JtYXQKKyAgICAgICAgc2VsZi5hcmdzID0gYXJncworCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmZvcm1hdCAlIHNlbGYuYXJncworCisjIFNISUZUIHNob3VsZCBtYXRjaCB0aGUgdmFsdWUgaW4gbG9uZ2ludHJlcHIuaCBmb3IgYmVzdCB0ZXN0aW5nLgorU0hJRlQgPSBzeXMubG9uZ19pbmZvLmJpdHNfcGVyX2RpZ2l0CitCQVNFID0gMiAqKiBTSElGVAorTUFTSyA9IEJBU0UgLSAxCitLQVJBVFNVQkFfQ1VUT0ZGID0gNzAgICAjIGZyb20gbG9uZ29iamVjdC5jCisKKyMgTWF4IG51bWJlciBvZiBiYXNlIEJBU0UgZGlnaXRzIHRvIHVzZSBpbiB0ZXN0IGNhc2VzLiAgRG91YmxpbmcKKyMgdGhpcyB3aWxsIG1vcmUgdGhhbiBkb3VibGUgdGhlIHJ1bnRpbWUuCitNQVhESUdJVFMgPSAxNQorCisjIGJ1aWxkIHNvbWUgc3BlY2lhbCB2YWx1ZXMKK3NwZWNpYWwgPSBtYXAobG9uZywgWzAsIDEsIDIsIEJBU0UsIEJBU0UgPj4gMV0pCitzcGVjaWFsLmFwcGVuZCgweDU1NTU1NTU1NTU1NTU1NTVMKQorc3BlY2lhbC5hcHBlbmQoMHhhYWFhYWFhYWFhYWFhYWFhTCkKKyMgIHNvbWUgc29saWQgc3RyaW5ncyBvZiBvbmUgYml0cworcDIgPSA0TCAgIyAwIGFuZCAxIGFscmVhZHkgYWRkZWQKK2ZvciBpIGluIHJhbmdlKDIqU0hJRlQpOgorICAgIHNwZWNpYWwuYXBwZW5kKHAyIC0gMSkKKyAgICBwMiA9IHAyIDw8IDEKK2RlbCBwMgorIyBhZGQgY29tcGxlbWVudHMgJiBuZWdhdGlvbnMKK3NwZWNpYWwgPSBzcGVjaWFsICsgbWFwKGxhbWJkYSB4OiB+eCwgc3BlY2lhbCkgKyBcCisgICAgICAgICAgICAgICAgICAgIG1hcChsYW1iZGEgeDogLXgsIHNwZWNpYWwpCisKK0wgPSBbCisgICAgICAgICgnMCcsIDApLAorICAgICAgICAoJzEnLCAxKSwKKyAgICAgICAgKCc5JywgOSksCisgICAgICAgICgnMTAnLCAxMCksCisgICAgICAgICgnOTknLCA5OSksCisgICAgICAgICgnMTAwJywgMTAwKSwKKyAgICAgICAgKCczMTQnLCAzMTQpLAorICAgICAgICAoJyAzMTQnLCAzMTQpLAorICAgICAgICAoJzMxNCAnLCAzMTQpLAorICAgICAgICAoJyAgXHRcdCAgMzE0ICBcdFx0ICAnLCAzMTQpLAorICAgICAgICAocmVwcihzeXMubWF4aW50KSwgc3lzLm1heGludCksCisgICAgICAgICgnICAxeCcsIFZhbHVlRXJyb3IpLAorICAgICAgICAoJyAgMSAgJywgMSksCisgICAgICAgICgnICAxXDAyICAnLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKCcnLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKCcgJywgVmFsdWVFcnJvciksCisgICAgICAgICgnICBcdFx0ICAnLCBWYWx1ZUVycm9yKQorXQoraWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICBMICs9IFsKKyAgICAgICAgKHVuaWNvZGUoJzAnKSwgMCksCisgICAgICAgICh1bmljb2RlKCcxJyksIDEpLAorICAgICAgICAodW5pY29kZSgnOScpLCA5KSwKKyAgICAgICAgKHVuaWNvZGUoJzEwJyksIDEwKSwKKyAgICAgICAgKHVuaWNvZGUoJzk5JyksIDk5KSwKKyAgICAgICAgKHVuaWNvZGUoJzEwMCcpLCAxMDApLAorICAgICAgICAodW5pY29kZSgnMzE0JyksIDMxNCksCisgICAgICAgICh1bmljb2RlKCcgMzE0JyksIDMxNCksCisgICAgICAgICh1bmljb2RlKCdcdTA2NjNcdTA2NjFcdTA2NjQgJywncmF3LXVuaWNvZGUtZXNjYXBlJyksIDMxNCksCisgICAgICAgICh1bmljb2RlKCcgIFx0XHQgIDMxNCAgXHRcdCAgJyksIDMxNCksCisgICAgICAgICh1bmljb2RlKCcgIDF4JyksIFZhbHVlRXJyb3IpLAorICAgICAgICAodW5pY29kZSgnICAxICAnKSwgMSksCisgICAgICAgICh1bmljb2RlKCcgIDFcMDIgICcpLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKHVuaWNvZGUoJycpLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKHVuaWNvZGUoJyAnKSwgVmFsdWVFcnJvciksCisgICAgICAgICh1bmljb2RlKCcgIFx0XHQgICcpLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKHVuaWNocigweDIwMCksIFZhbHVlRXJyb3IpLAorXQorCitjbGFzcyBMb25nVGVzdCh0ZXN0X2ludC5JbnRMb25nQ29tbW9uVGVzdHMsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIG50eXBlID0gbG9uZworCisgICAgIyBHZXQgcXVhc2ktcmFuZG9tIGxvbmcgY29uc2lzdGluZyBvZiBuZGlnaXRzIGRpZ2l0cyAoaW4gYmFzZSBCQVNFKS4KKyAgICAjIHF1YXNpID09IHRoZSBtb3N0LXNpZ25pZmljYW50IGRpZ2l0IHdpbGwgbm90IGJlIDAsIGFuZCB0aGUgbnVtYmVyCisgICAgIyBpcyBjb25zdHJ1Y3RlZCB0byBjb250YWluIGxvbmcgc3RyaW5ncyBvZiAwIGFuZCAxIGJpdHMuICBUaGVzZSBhcmUKKyAgICAjIG1vcmUgbGlrZWx5IHRoYW4gcmFuZG9tIGJpdHMgdG8gcHJvdm9rZSBkaWdpdC1ib3VuZGFyeSBlcnJvcnMuCisgICAgIyBUaGUgc2lnbiBvZiB0aGUgbnVtYmVyIGlzIGFsc28gcmFuZG9tLgorCisgICAgZGVmIGdldHJhbihzZWxmLCBuZGlnaXRzKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5kaWdpdHMgPiAwKQorICAgICAgICBuYml0c19oaSA9IG5kaWdpdHMgKiBTSElGVAorICAgICAgICBuYml0c19sbyA9IG5iaXRzX2hpIC0gU0hJRlQgKyAxCisgICAgICAgIGFuc3dlciA9IDBMCisgICAgICAgIG5iaXRzID0gMAorICAgICAgICByID0gaW50KHJhbmRvbS5yYW5kb20oKSAqIChTSElGVCAqIDIpKSB8IDEgICMgZm9yY2UgMSBiaXRzIHRvIHN0YXJ0CisgICAgICAgIHdoaWxlIG5iaXRzIDwgbmJpdHNfbG86CisgICAgICAgICAgICBiaXRzID0gKHIgPj4gMSkgKyAxCisgICAgICAgICAgICBiaXRzID0gbWluKGJpdHMsIG5iaXRzX2hpIC0gbmJpdHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMSA8PSBiaXRzIDw9IFNISUZUKQorICAgICAgICAgICAgbmJpdHMgPSBuYml0cyArIGJpdHMKKyAgICAgICAgICAgIGFuc3dlciA9IGFuc3dlciA8PCBiaXRzCisgICAgICAgICAgICBpZiByICYgMToKKyAgICAgICAgICAgICAgICBhbnN3ZXIgPSBhbnN3ZXIgfCAoKDEgPDwgYml0cykgLSAxKQorICAgICAgICAgICAgciA9IGludChyYW5kb20ucmFuZG9tKCkgKiAoU0hJRlQgKiAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5iaXRzX2xvIDw9IG5iaXRzIDw9IG5iaXRzX2hpKQorICAgICAgICBpZiByYW5kb20ucmFuZG9tKCkgPCAwLjU6CisgICAgICAgICAgICBhbnN3ZXIgPSAtYW5zd2VyCisgICAgICAgIHJldHVybiBhbnN3ZXIKKworICAgICMgR2V0IHJhbmRvbSBsb25nIGNvbnNpc3Rpbmcgb2YgbmRpZ2l0cyByYW5kb20gZGlnaXRzIChyZWxhdGl2ZSB0byBiYXNlCisgICAgIyBCQVNFKS4gIFRoZSBzaWduIGJpdCBpcyBhbHNvIHJhbmRvbS4KKworICAgIGRlZiBnZXRyYW4yKG5kaWdpdHMpOgorICAgICAgICBhbnN3ZXIgPSAwTAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobmRpZ2l0cyk6CisgICAgICAgICAgICBhbnN3ZXIgPSAoYW5zd2VyIDw8IFNISUZUKSB8IHJhbmRvbS5yYW5kaW50KDAsIE1BU0spCisgICAgICAgIGlmIHJhbmRvbS5yYW5kb20oKSA8IDAuNToKKyAgICAgICAgICAgIGFuc3dlciA9IC1hbnN3ZXIKKyAgICAgICAgcmV0dXJuIGFuc3dlcgorCisgICAgZGVmIGNoZWNrX2RpdmlzaW9uKHNlbGYsIHgsIHkpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcSwgciA9IGRpdm1vZCh4LCB5KQorICAgICAgICBxMiwgcjIgPSB4Ly95LCB4JXkKKyAgICAgICAgcGFiLCBwYmEgPSB4KnksIHkqeAorICAgICAgICBlcShwYWIsIHBiYSwgRnJtKCJtdWx0aXBsaWNhdGlvbiBkb2VzIG5vdCBjb21tdXRlIGZvciAlciBhbmQgJXIiLCB4LCB5KSkKKyAgICAgICAgZXEocSwgcTIsIEZybSgiZGl2bW9kIHJldHVybnMgZGlmZmVyZW50IHF1b3RpZW50IHRoYW4gLyBmb3IgJXIgYW5kICVyIiwgeCwgeSkpCisgICAgICAgIGVxKHIsIHIyLCBGcm0oImRpdm1vZCByZXR1cm5zIGRpZmZlcmVudCBtb2QgdGhhbiAlJSBmb3IgJXIgYW5kICVyIiwgeCwgeSkpCisgICAgICAgIGVxKHgsIHEqeSArIHIsIEZybSgieCAhPSBxKnkgKyByIGFmdGVyIGRpdm1vZCBvbiB4PSVyLCB5PSVyIiwgeCwgeSkpCisgICAgICAgIGlmIHkgPiAwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPD0gciA8IHksIEZybSgiYmFkIG1vZCBmcm9tIGRpdm1vZCBvbiAlciBhbmQgJXIiLCB4LCB5KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IDwgciA8PSAwLCBGcm0oImJhZCBtb2QgZnJvbSBkaXZtb2Qgb24gJXIgYW5kICVyIiwgeCwgeSkpCisKKyAgICBkZWYgdGVzdF9kaXZpc2lvbihzZWxmKToKKyAgICAgICAgZGlnaXRzID0gcmFuZ2UoMSwgTUFYRElHSVRTKzEpICsgcmFuZ2UoS0FSQVRTVUJBX0NVVE9GRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0FSQVRTVUJBX0NVVE9GRiArIDE0KQorICAgICAgICBkaWdpdHMuYXBwZW5kKEtBUkFUU1VCQV9DVVRPRkYgKiAzKQorICAgICAgICBmb3IgbGVueCBpbiBkaWdpdHM6CisgICAgICAgICAgICB4ID0gc2VsZi5nZXRyYW4obGVueCkKKyAgICAgICAgICAgIGZvciBsZW55IGluIGRpZ2l0czoKKyAgICAgICAgICAgICAgICB5ID0gc2VsZi5nZXRyYW4obGVueSkgb3IgMUwKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2RpdmlzaW9uKHgsIHkpCisKKyAgICAgICAgIyBzcGVjaWZpYyBudW1iZXJzIGNob3NlbiB0byBleGVyY2lzZSBjb3JuZXIgY2FzZXMgb2YgdGhlCisgICAgICAgICMgY3VycmVudCBsb25nIGRpdmlzaW9uIGltcGxlbWVudGF0aW9uCisKKyAgICAgICAgIyAzMC1iaXQgY2FzZXMgaW52b2x2aW5nIGEgcXVvdGllbnQgZGlnaXQgZXN0aW1hdGUgb2YgQkFTRSsxCisgICAgICAgIHNlbGYuY2hlY2tfZGl2aXNpb24oMTIzMTk0ODQxMjI5MDg3OTM5NTk2NjcwMjg4MUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE0NzM0MTM2NzEzMTQyODY5OEwpCisgICAgICAgIHNlbGYuY2hlY2tfZGl2aXNpb24oODE1NDI3NzU2NDgxMjc1NDMwMzQyMzEyMDIxNTE1NTg3ODgzTCwKKyAgICAgICAgICAgICAgICAgICAgICAgNzA3MjcwODM2MDY5MDI3NzQ1TCkKKyAgICAgICAgc2VsZi5jaGVja19kaXZpc2lvbig2Mjc5NzYwNzM2OTcwMTI4MjA4NDk0NDMzNjM1NjM1OTkwNDFMLAorICAgICAgICAgICAgICAgICAgICAgICA2NDM1ODg3OTg0OTYwNTcwMjBMKQorICAgICAgICBzZWxmLmNoZWNrX2RpdmlzaW9uKDExMTUxNDEzNzM2NTM3NTIzMDM3MTA5MzI3NTYzMjU1NzgwNjVMLAorICAgICAgICAgICAgICAgICAgICAgICAxMDM4NTU2MzM1MTcxNDUzOTM3NzI2ODgyNjI3TCkKKyAgICAgICAgIyAzMC1iaXQgY2FzZXMgdGhhdCByZXF1aXJlIHRoZSBwb3N0LXN1YnRyYWN0aW9uIGNvcnJlY3Rpb24gc3RlcAorICAgICAgICBzZWxmLmNoZWNrX2RpdmlzaW9uKDkyMjQ5ODkwNTQwNTQzNjc1MTk0MDk4OTMyMDkzMDM2ODQ5NEwsCisgICAgICAgICAgICAgICAgICAgICAgIDk0OTk4NTg3MDY4Njc4NjEzNTYyNjk0MzM5NkwpCisgICAgICAgIHNlbGYuY2hlY2tfZGl2aXNpb24oNzY4MjM1ODUzMzI4MDkxMTY3MjA0MDA5NjUyMTc0MDMxODQ0TCwKKyAgICAgICAgICAgICAgICAgICAgICAgMTA5MTU1NTU0MTE4MDM3MTU1NDQyNjU0NTI2NkwpCisKKyAgICAgICAgIyAxNS1iaXQgY2FzZXMgaW52b2x2aW5nIGEgcXVvdGllbnQgZGlnaXQgZXN0aW1hdGUgb2YgQkFTRSsxCisgICAgICAgIHNlbGYuY2hlY2tfZGl2aXNpb24oMjAxNzIxODg5NDc0NDNMLCA2MTU2MTEzOTdMKQorICAgICAgICBzZWxmLmNoZWNrX2RpdmlzaW9uKDEwMjA5MDg1MzAyNzAxNTUwMjVMLCA5NTA3OTU3MTBMKQorICAgICAgICBzZWxmLmNoZWNrX2RpdmlzaW9uKDEyODU4OTU2NTcyMzExMjQwOEwsIDczNjM5MzcxOEwpCisgICAgICAgIHNlbGYuY2hlY2tfZGl2aXNpb24oNjA5OTE5NzgwMjg1NzYxNTc1TCwgMTg2MTMyNzQ1NDY3ODRMKQorICAgICAgICAjIDE1LWJpdCBjYXNlcyB0aGF0IHJlcXVpcmUgdGhlIHBvc3Qtc3VidHJhY3Rpb24gY29ycmVjdGlvbiBzdGVwCisgICAgICAgIHNlbGYuY2hlY2tfZGl2aXNpb24oNzEwMDMxNjgxNTc2Mzg4MDMyTCwgMjY3Njk0MDQzOTEzMDhMKQorICAgICAgICBzZWxmLmNoZWNrX2RpdmlzaW9uKDE5MzM2MjI2MTQyNjgyMjFMLCAzMDIxMjg1MzM0ODgzNkwpCisKKworCisgICAgZGVmIHRlc3Rfa2FyYXRzdWJhKHNlbGYpOgorICAgICAgICBkaWdpdHMgPSByYW5nZSgxLCA1KSArIHJhbmdlKEtBUkFUU1VCQV9DVVRPRkYsIEtBUkFUU1VCQV9DVVRPRkYgKyAxMCkKKyAgICAgICAgZGlnaXRzLmV4dGVuZChbS0FSQVRTVUJBX0NVVE9GRiAqIDEwLCBLQVJBVFNVQkFfQ1VUT0ZGICogMTAwXSkKKworICAgICAgICBiaXRzID0gW2RpZ2l0ICogU0hJRlQgZm9yIGRpZ2l0IGluIGRpZ2l0c10KKworICAgICAgICAjIFRlc3QgcHJvZHVjdHMgb2YgbG9uZyBzdHJpbmdzIG9mIDEgYml0cyAtLSAoMioqeC0xKSooMioqeS0xKSA9PQorICAgICAgICAjIDIqKih4K3kpIC0gMioqeCAtIDIqKnkgKyAxLCBzbyB0aGUgcHJvcGVyIHJlc3VsdCBpcyBlYXN5IHRvIGNoZWNrLgorICAgICAgICBmb3IgYWJpdHMgaW4gYml0czoKKyAgICAgICAgICAgIGEgPSAoMUwgPDwgYWJpdHMpIC0gMQorICAgICAgICAgICAgZm9yIGJiaXRzIGluIGJpdHM6CisgICAgICAgICAgICAgICAgaWYgYmJpdHMgPCBhYml0czoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBiID0gKDFMIDw8IGJiaXRzKSAtIDEKKyAgICAgICAgICAgICAgICB4ID0gYSAqIGIKKyAgICAgICAgICAgICAgICB5ID0gKCgxTCA8PCAoYWJpdHMgKyBiYml0cykpIC0KKyAgICAgICAgICAgICAgICAgICAgICgxTCA8PCBhYml0cykgLQorICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IGJiaXRzKSArCisgICAgICAgICAgICAgICAgICAgICAxKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSwKKyAgICAgICAgICAgICAgICAgICAgRnJtKCJiYWQgcmVzdWx0IGZvciBhKmI6IGE9JXIsIGI9JXIsIHg9JXIsIHk9JXIiLCBhLCBiLCB4LCB5KSkKKworICAgIGRlZiBjaGVja19iaXRvcF9pZGVudGl0aWVzXzEoc2VsZiwgeCk6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh4ICYgMCwgMCwgRnJtKCJ4ICYgMCAhPSAwIGZvciB4PSVyIiwgeCkpCisgICAgICAgIGVxKHggfCAwLCB4LCBGcm0oInggfCAwICE9IHggZm9yIHg9JXIiLCB4KSkKKyAgICAgICAgZXEoeCBeIDAsIHgsIEZybSgieCBeIDAgIT0geCBmb3IgeD0lciIsIHgpKQorICAgICAgICBlcSh4ICYgLTEsIHgsIEZybSgieCAmIC0xICE9IHggZm9yIHg9JXIiLCB4KSkKKyAgICAgICAgZXEoeCB8IC0xLCAtMSwgRnJtKCJ4IHwgLTEgIT0gLTEgZm9yIHg9JXIiLCB4KSkKKyAgICAgICAgZXEoeCBeIC0xLCB+eCwgRnJtKCJ4IF4gLTEgIT0gfnggZm9yIHg9JXIiLCB4KSkKKyAgICAgICAgZXEoeCwgfn54LCBGcm0oInggIT0gfn54IGZvciB4PSVyIiwgeCkpCisgICAgICAgIGVxKHggJiB4LCB4LCBGcm0oInggJiB4ICE9IHggZm9yIHg9JXIiLCB4KSkKKyAgICAgICAgZXEoeCB8IHgsIHgsIEZybSgieCB8IHggIT0geCBmb3IgeD0lciIsIHgpKQorICAgICAgICBlcSh4IF4geCwgMCwgRnJtKCJ4IF4geCAhPSAwIGZvciB4PSVyIiwgeCkpCisgICAgICAgIGVxKHggJiB+eCwgMCwgRnJtKCJ4ICYgfnggIT0gMCBmb3IgeD0lciIsIHgpKQorICAgICAgICBlcSh4IHwgfngsIC0xLCBGcm0oInggfCB+eCAhPSAtMSBmb3IgeD0lciIsIHgpKQorICAgICAgICBlcSh4IF4gfngsIC0xLCBGcm0oInggXiB+eCAhPSAtMSBmb3IgeD0lciIsIHgpKQorICAgICAgICBlcSgteCwgMSArIH54LCBGcm0oIm5vdCAteCA9PSAxICsgfnggZm9yIHg9JXIiLCB4KSkKKyAgICAgICAgZXEoLXgsIH4oeC0xKSwgRnJtKCJub3QgLXggPT0gfih4LTEpIGZvcnggPSVyIiwgeCkpCisgICAgICAgIGZvciBuIGluIHhyYW5nZSgyKlNISUZUKToKKyAgICAgICAgICAgIHAyID0gMkwgKiogbgorICAgICAgICAgICAgZXEoeCA8PCBuID4+IG4sIHgsCisgICAgICAgICAgICAgICAgRnJtKCJ4IDw8IG4gPj4gbiAhPSB4IGZvciB4PSVyLCBuPSVyIiwgKHgsIG4pKSkKKyAgICAgICAgICAgIGVxKHggLy8gcDIsIHggPj4gbiwKKyAgICAgICAgICAgICAgICBGcm0oInggLy8gcDIgIT0geCA+PiBuIGZvciB4PSVyIG49JXIgcDI9JXIiLCAoeCwgbiwgcDIpKSkKKyAgICAgICAgICAgIGVxKHggKiBwMiwgeCA8PCBuLAorICAgICAgICAgICAgICAgIEZybSgieCAqIHAyICE9IHggPDwgbiBmb3IgeD0lciBuPSVyIHAyPSVyIiwgKHgsIG4sIHAyKSkpCisgICAgICAgICAgICBlcSh4ICYgLXAyLCB4ID4+IG4gPDwgbiwKKyAgICAgICAgICAgICAgICBGcm0oIm5vdCB4ICYgLXAyID09IHggPj4gbiA8PCBuIGZvciB4PSVyIG49JXIgcDI9JXIiLCAoeCwgbiwgcDIpKSkKKyAgICAgICAgICAgIGVxKHggJiAtcDIsIHggJiB+KHAyIC0gMSksCisgICAgICAgICAgICAgICAgRnJtKCJub3QgeCAmIC1wMiA9PSB4ICYgfihwMiAtIDEpIGZvciB4PSVyIG49JXIgcDI9JXIiLCAoeCwgbiwgcDIpKSkKKworICAgIGRlZiBjaGVja19iaXRvcF9pZGVudGl0aWVzXzIoc2VsZiwgeCwgeSk6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh4ICYgeSwgeSAmIHgsIEZybSgieCAmIHkgIT0geSAmIHggZm9yIHg9JXIsIHk9JXIiLCAoeCwgeSkpKQorICAgICAgICBlcSh4IHwgeSwgeSB8IHgsIEZybSgieCB8IHkgIT0geSB8IHggZm9yIHg9JXIsIHk9JXIiLCAoeCwgeSkpKQorICAgICAgICBlcSh4IF4geSwgeSBeIHgsIEZybSgieCBeIHkgIT0geSBeIHggZm9yIHg9JXIsIHk9JXIiLCAoeCwgeSkpKQorICAgICAgICBlcSh4IF4geSBeIHgsIHksIEZybSgieCBeIHkgXiB4ICE9IHkgZm9yIHg9JXIsIHk9JXIiLCAoeCwgeSkpKQorICAgICAgICBlcSh4ICYgeSwgfih+eCB8IH55KSwgRnJtKCJ4ICYgeSAhPSB+KH54IHwgfnkpIGZvciB4PSVyLCB5PSVyIiwgKHgsIHkpKSkKKyAgICAgICAgZXEoeCB8IHksIH4ofnggJiB+eSksIEZybSgieCB8IHkgIT0gfih+eCAmIH55KSBmb3IgeD0lciwgeT0lciIsICh4LCB5KSkpCisgICAgICAgIGVxKHggXiB5LCAoeCB8IHkpICYgfih4ICYgeSksCisgICAgICAgICAgICAgRnJtKCJ4IF4geSAhPSAoeCB8IHkpICYgfih4ICYgeSkgZm9yIHg9JXIsIHk9JXIiLCAoeCwgeSkpKQorICAgICAgICBlcSh4IF4geSwgKHggJiB+eSkgfCAofnggJiB5KSwKKyAgICAgICAgICAgICBGcm0oInggXiB5ID09ICh4ICYgfnkpIHwgKH54ICYgeSkgZm9yIHg9JXIsIHk9JXIiLCAoeCwgeSkpKQorICAgICAgICBlcSh4IF4geSwgKHggfCB5KSAmICh+eCB8IH55KSwKKyAgICAgICAgICAgICBGcm0oInggXiB5ID09ICh4IHwgeSkgJiAofnggfCB+eSkgZm9yIHg9JXIsIHk9JXIiLCAoeCwgeSkpKQorCisgICAgZGVmIGNoZWNrX2JpdG9wX2lkZW50aXRpZXNfMyhzZWxmLCB4LCB5LCB6KToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKCh4ICYgeSkgJiB6LCB4ICYgKHkgJiB6KSwKKyAgICAgICAgICAgICBGcm0oIih4ICYgeSkgJiB6ICE9IHggJiAoeSAmIHopIGZvciB4PSVyLCB5PSVyLCB6PSVyIiwgKHgsIHksIHopKSkKKyAgICAgICAgZXEoKHggfCB5KSB8IHosIHggfCAoeSB8IHopLAorICAgICAgICAgICAgIEZybSgiKHggfCB5KSB8IHogIT0geCB8ICh5IHwgeikgZm9yIHg9JXIsIHk9JXIsIHo9JXIiLCAoeCwgeSwgeikpKQorICAgICAgICBlcSgoeCBeIHkpIF4geiwgeCBeICh5IF4geiksCisgICAgICAgICAgICAgRnJtKCIoeCBeIHkpIF4geiAhPSB4IF4gKHkgXiB6KSBmb3IgeD0lciwgeT0lciwgej0lciIsICh4LCB5LCB6KSkpCisgICAgICAgIGVxKHggJiAoeSB8IHopLCAoeCAmIHkpIHwgKHggJiB6KSwKKyAgICAgICAgICAgICBGcm0oInggJiAoeSB8IHopICE9ICh4ICYgeSkgfCAoeCAmIHopIGZvciB4PSVyLCB5PSVyLCB6PSVyIiwgKHgsIHksIHopKSkKKyAgICAgICAgZXEoeCB8ICh5ICYgeiksICh4IHwgeSkgJiAoeCB8IHopLAorICAgICAgICAgICAgIEZybSgieCB8ICh5ICYgeikgIT0gKHggfCB5KSAmICh4IHwgeikgZm9yIHg9JXIsIHk9JXIsIHo9JXIiLCAoeCwgeSwgeikpKQorCisgICAgZGVmIHRlc3RfYml0b3BfaWRlbnRpdGllcyhzZWxmKToKKyAgICAgICAgZm9yIHggaW4gc3BlY2lhbDoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfYml0b3BfaWRlbnRpdGllc18xKHgpCisgICAgICAgIGRpZ2l0cyA9IHhyYW5nZSgxLCBNQVhESUdJVFMrMSkKKyAgICAgICAgZm9yIGxlbnggaW4gZGlnaXRzOgorICAgICAgICAgICAgeCA9IHNlbGYuZ2V0cmFuKGxlbngpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2JpdG9wX2lkZW50aXRpZXNfMSh4KQorICAgICAgICAgICAgZm9yIGxlbnkgaW4gZGlnaXRzOgorICAgICAgICAgICAgICAgIHkgPSBzZWxmLmdldHJhbihsZW55KQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfYml0b3BfaWRlbnRpdGllc18yKHgsIHkpCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19iaXRvcF9pZGVudGl0aWVzXzMoeCwgeSwgc2VsZi5nZXRyYW4oKGxlbnggKyBsZW55KS8vMikpCisKKyAgICBkZWYgc2xvd19mb3JtYXQoc2VsZiwgeCwgYmFzZSk6CisgICAgICAgIGlmICh4LCBiYXNlKSA9PSAoMCwgOCk6CisgICAgICAgICAgICAjIHRoaXMgaXMgYW4gb2RkYmFsbCEKKyAgICAgICAgICAgIHJldHVybiAiMEwiCisgICAgICAgIGRpZ2l0cyA9IFtdCisgICAgICAgIHNpZ24gPSAwCisgICAgICAgIGlmIHggPCAwOgorICAgICAgICAgICAgc2lnbiwgeCA9IDEsIC14CisgICAgICAgIHdoaWxlIHg6CisgICAgICAgICAgICB4LCByID0gZGl2bW9kKHgsIGJhc2UpCisgICAgICAgICAgICBkaWdpdHMuYXBwZW5kKGludChyKSkKKyAgICAgICAgZGlnaXRzLnJldmVyc2UoKQorICAgICAgICBkaWdpdHMgPSBkaWdpdHMgb3IgWzBdCisgICAgICAgIHJldHVybiAnLSdbOnNpZ25dICsgXAorICAgICAgICAgICAgICAgezg6ICcwJywgMTA6ICcnLCAxNjogJzB4J31bYmFzZV0gKyBcCisgICAgICAgICAgICAgICAiIi5qb2luKG1hcChsYW1iZGEgaTogIjAxMjM0NTY3ODlhYmNkZWYiW2ldLCBkaWdpdHMpKSArICJMIgorCisgICAgZGVmIGNoZWNrX2Zvcm1hdF8xKHNlbGYsIHgpOgorICAgICAgICBmb3IgYmFzZSwgbWFwcGVyIGluICg4LCBvY3QpLCAoMTAsIHJlcHIpLCAoMTYsIGhleCk6CisgICAgICAgICAgICBnb3QgPSBtYXBwZXIoeCkKKyAgICAgICAgICAgIGV4cGVjdGVkID0gc2VsZi5zbG93X2Zvcm1hdCh4LCBiYXNlKQorICAgICAgICAgICAgbXNnID0gRnJtKCIlcyByZXR1cm5lZCAlciBidXQgZXhwZWN0ZWQgJXIgZm9yICVyIiwKKyAgICAgICAgICAgICAgICBtYXBwZXIuX19uYW1lX18sIGdvdCwgZXhwZWN0ZWQsIHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQsIG1zZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhnb3QsIDApLCB4LCBGcm0oJ2xvbmcoIiVzIiwgMCkgIT0gJXInLCBnb3QsIHgpKQorICAgICAgICAjIHN0cigpIGhhcyB0byBiZSBjaGVja2VkIGEgbGl0dGxlIGRpZmZlcmVudGx5IHNpbmNlIHRoZXJlJ3Mgbm8KKyAgICAgICAgIyB0cmFpbGluZyAiTCIKKyAgICAgICAgZ290ID0gc3RyKHgpCisgICAgICAgIGV4cGVjdGVkID0gc2VsZi5zbG93X2Zvcm1hdCh4LCAxMClbOi0xXQorICAgICAgICBtc2cgPSBGcm0oIiVzIHJldHVybmVkICVyIGJ1dCBleHBlY3RlZCAlciBmb3IgJXIiLAorICAgICAgICAgICAgbWFwcGVyLl9fbmFtZV9fLCBnb3QsIGV4cGVjdGVkLCB4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQsIG1zZykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmKToKKyAgICAgICAgZm9yIHggaW4gc3BlY2lhbDoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZm9ybWF0XzEoeCkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwKToKKyAgICAgICAgICAgIGZvciBsZW54IGluIHhyYW5nZSgxLCBNQVhESUdJVFMrMSk6CisgICAgICAgICAgICAgICAgeCA9IHNlbGYuZ2V0cmFuKGxlbngpCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19mb3JtYXRfMSh4KQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKDMxNCksIDMxNEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygzLjE0KSwgM0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygzMTRMKSwgMzE0TCkKKyAgICAgICAgIyBDaGVjayB0aGF0IGxvbmcoKSBvZiBiYXNpYyB0eXBlcyBhY3R1YWxseSByZXR1cm5zIGEgbG9uZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUobG9uZygzMTQpKSwgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGxvbmcoMy4xNCkpLCBsb25nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUobG9uZygzMTRMKSksIGxvbmcpCisgICAgICAgICMgQ2hlY2sgdGhhdCBjb252ZXJzaW9uIGZyb20gZmxvYXQgdHJ1bmNhdGVzIHRvd2FyZHMgemVybworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoLTMuMTQpLCAtM0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygzLjkpLCAzTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKC0zLjkpLCAtM0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygzLjUpLCAzTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKC0zLjUpLCAtM0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygiLTMiKSwgLTNMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoIjBiMTAiLCAyKSwgMkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygiMG8xMCIsIDgpLCA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCIweDEwIiwgMTYpLCAxNkwpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcodW5pY29kZSgiLTMiKSksIC0zTCkKKyAgICAgICAgIyBEaWZmZXJlbnQgYmFzZToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCIxMCIsMTYpLCAxNkwpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcodW5pY29kZSgiMTAiKSwxNiksIDE2TCkKKyAgICAgICAgIyBDaGVjayBjb252ZXJzaW9ucyBmcm9tIHN0cmluZyAoc2FtZSB0ZXN0IHNldCBhcyBmb3IgaW50KCksIGFuZCB0aGVuIHNvbWUpCisgICAgICAgIExMID0gWworICAgICAgICAgICAgICAgICgnMScgKyAnMCcqMjAsIDEwTCoqMjApLAorICAgICAgICAgICAgICAgICgnMScgKyAnMCcqMTAwLCAxMEwqKjEwMCkKKyAgICAgICAgXQorICAgICAgICBMMiA9IExbOl0KKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIEwyICs9IFsKKyAgICAgICAgICAgICAgICAodW5pY29kZSgnMScpICsgdW5pY29kZSgnMCcpKjIwLCAxMEwqKjIwKSwKKyAgICAgICAgICAgICAgICAodW5pY29kZSgnMScpICsgdW5pY29kZSgnMCcpKjEwMCwgMTBMKioxMDApLAorICAgICAgICBdCisgICAgICAgIGZvciBzLCB2IGluIEwyICsgTEw6CisgICAgICAgICAgICBmb3Igc2lnbiBpbiAiIiwgIisiLCAiLSI6CisgICAgICAgICAgICAgICAgZm9yIHByZWZpeCBpbiAiIiwgIiAiLCAiXHQiLCAiICBcdFx0ICAiOgorICAgICAgICAgICAgICAgICAgICBzcyA9IHByZWZpeCArIHNpZ24gKyBzCisgICAgICAgICAgICAgICAgICAgIHZ2ID0gdgorICAgICAgICAgICAgICAgICAgICBpZiBzaWduID09ICItIiBhbmQgdiBpcyBub3QgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZ2ID0gLXYKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKHNzKSwgbG9uZyh2dikpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCB2OgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvbmcsICcxMjNcMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvbmcsICc1MycsIDQwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxvbmcsIDEsIDEyKQorCisgICAgICAgICMgdGVzdHMgd2l0aCBiYXNlIDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcgMDEyMyAgJywgMCksIDgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJyAwMTIzICAnLCAwKSwgODMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMDAwJywgMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMG8xMjMnLCAwKSwgODMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMHgxMjMnLCAwKSwgMjkxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzBiMTAwJywgMCksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnIDBPMTIzICAgJywgMCksIDgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJyAwWDEyMyAgJywgMCksIDI5MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcgMEIxMDAgJywgMCksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMCcsIDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJyswJywgMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnLTAnLCAwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcwMCcsIDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsb25nLCAnMDgnLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsb25nLCAnLTAxMjM5NScsIDApCisKKyAgICAgICAgIyBTRiBwYXRjaCAjMTYzODg3OTogZW1iZWRkZWQgTlVMcyB3ZXJlIG5vdCBkZXRlY3RlZCB3aXRoCisgICAgICAgICMgZXhwbGljaXQgYmFzZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsb25nLCAnMTIzXDAnLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9uZywgJzEyM1x4MDAgMjQ1JywgMjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzEwMjAwMjAyMjIwMTIyMTExMTIxMScsIDMpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzEwMDAwMDAwMDAwMDAwMDAwJywgNCksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMzIyNDQwMDI0MjMxNDEnLCA1KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxNTUwMTA0MDE1NTA0JywgNiksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMjExMzAxNDIyMzU0JywgNyksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNDAwMDAwMDAwMDAnLCA4KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxMjA2ODY1NzQ1NCcsIDkpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzQyOTQ5NjcyOTYnLCAxMCksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTkwNDQ0MDU1NCcsIDExKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc5YmE0NjE1OTQnLCAxMiksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNTM1YTc5ODg5JywgMTMpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzJjYTViNzQ2NCcsIDE0KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxYTIwZGNkODEnLCAxNSksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTAwMDAwMDAwJywgMTYpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJ2E3ZmZkYTkxJywgMTcpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzcwNGhlN2c0JywgMTgpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzRmNWFmZjY2JywgMTkpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzM3MjNhaTRnJywgMjApLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzI4MWQ1NWk0JywgMjEpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzFmajhiMTg0JywgMjIpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzE2MDZrN2ljJywgMjMpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJ21iOTk0YWcnLCAyNCksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnaGVrMm1nbCcsIDI1KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdkbmNoYm5tJywgMjYpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJ2IyOGpwZG0nLCAyNyksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnOHBmZ2loNCcsIDI4KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc3NmJlaWdnJywgMjkpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzVxbWNwcWcnLCAzMCksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNHEwanRvNCcsIDMxKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc0MDAwMDAwJywgMzIpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzNhb2txOTQnLCAzMyksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMnFoeGpsaScsIDM0KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcyYnI0NXFiJywgMzUpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzF6MTQxejQnLCAzNiksIDQyOTQ5NjcyOTYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzEwMjAwMjAyMjIwMTIyMTExMTIxMicsIDMpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzEwMDAwMDAwMDAwMDAwMDAxJywgNCksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMzIyNDQwMDI0MjMxNDInLCA1KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxNTUwMTA0MDE1NTA1JywgNiksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMjExMzAxNDIyMzU1JywgNyksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNDAwMDAwMDAwMDEnLCA4KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxMjA2ODY1NzQ1NScsIDkpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzQyOTQ5NjcyOTcnLCAxMCksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTkwNDQ0MDU1NScsIDExKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc5YmE0NjE1OTUnLCAxMiksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNTM1YTc5ODhhJywgMTMpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzJjYTViNzQ2NScsIDE0KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxYTIwZGNkODInLCAxNSksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTAwMDAwMDAxJywgMTYpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJ2E3ZmZkYTkyJywgMTcpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzcwNGhlN2c1JywgMTgpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzRmNWFmZjY3JywgMTkpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzM3MjNhaTRoJywgMjApLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzI4MWQ1NWk1JywgMjEpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzFmajhiMTg1JywgMjIpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzE2MDZrN2lkJywgMjMpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJ21iOTk0YWgnLCAyNCksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnaGVrMm1nbScsIDI1KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdkbmNoYm5uJywgMjYpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJ2IyOGpwZG4nLCAyNyksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnOHBmZ2loNScsIDI4KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc3NmJlaWdoJywgMjkpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzVxbWNwcWgnLCAzMCksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNHEwanRvNScsIDMxKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc0MDAwMDAxJywgMzIpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzNhb2txOTUnLCAzMyksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMnFoeGpsaicsIDM0KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcyYnI0NXFjJywgMzUpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzF6MTQxejUnLCAzNiksIDQyOTQ5NjcyOTcpCisKKworICAgIGRlZiB0ZXN0X2NvbnZlcnNpb24oc2VsZik6CisgICAgICAgICMgVGVzdCBfX2xvbmdfXygpCisgICAgICAgIGNsYXNzIENsYXNzaWNNaXNzaW5nTWV0aG9kczoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGxvbmcsIENsYXNzaWNNaXNzaW5nTWV0aG9kcygpKQorCisgICAgICAgIGNsYXNzIE1pc3NpbmdNZXRob2RzKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbG9uZywgTWlzc2luZ01ldGhvZHMoKSkKKworICAgICAgICBjbGFzcyBGb28wOgorICAgICAgICAgICAgZGVmIF9fbG9uZ19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MkwKKworICAgICAgICBjbGFzcyBGb28xKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19sb25nX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyTAorCisgICAgICAgIGNsYXNzIEZvbzIobG9uZyk6CisgICAgICAgICAgICBkZWYgX19sb25nX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyTAorCisgICAgICAgIGNsYXNzIEZvbzMobG9uZyk6CisgICAgICAgICAgICBkZWYgX19sb25nX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBjbGFzcyBGb280KGxvbmcpOgorICAgICAgICAgICAgZGVmIF9fbG9uZ19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgIGNsYXNzIEZvbzUobG9uZyk6CisgICAgICAgICAgICBkZWYgX19sb25nX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyLgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhGb28wKCkpLCA0MkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhGb28xKCkpLCA0MkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhGb28yKCkpLCA0MkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhGb28zKCkpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoRm9vNCgpKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbG9uZywgRm9vNSgpKQorCisgICAgICAgIGNsYXNzIENsYXNzaWM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZvciBiYXNlIGluIChvYmplY3QsIENsYXNzaWMpOgorICAgICAgICAgICAgY2xhc3MgTG9uZ092ZXJyaWRlc1RydW5jKGJhc2UpOgorICAgICAgICAgICAgICAgIGRlZiBfX2xvbmdfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgICAgICAgICAgZGVmIF9fdHJ1bmNfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xMgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKExvbmdPdmVycmlkZXNUcnVuYygpKSwgNDIpCisKKyAgICAgICAgICAgIGNsYXNzIEp1c3RUcnVuYyhiYXNlKToKKyAgICAgICAgICAgICAgICBkZWYgX190cnVuY19fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhKdXN0VHJ1bmMoKSksIDQyKQorCisgICAgICAgICAgICBmb3IgdHJ1bmNfcmVzdWx0X2Jhc2UgaW4gKG9iamVjdCwgQ2xhc3NpYyk6CisgICAgICAgICAgICAgICAgY2xhc3MgSW50ZWdyYWwodHJ1bmNfcmVzdWx0X2Jhc2UpOgorICAgICAgICAgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgICAgICAgICAgY2xhc3MgVHJ1bmNSZXR1cm5zTm9uTG9uZyhiYXNlKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9fdHJ1bmNfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ3JhbCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKFRydW5jUmV0dXJuc05vbkxvbmcoKSksIDQyKQorCisgICAgICAgICAgICAgICAgY2xhc3MgTm9uSW50ZWdyYWwodHJ1bmNfcmVzdWx0X2Jhc2UpOgorICAgICAgICAgICAgICAgICAgICBkZWYgX190cnVuY19fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayB0aGF0IHdlIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25JbnRlZ3JhbCgpCisKKyAgICAgICAgICAgICAgICBjbGFzcyBUcnVuY1JldHVybnNOb25JbnRlZ3JhbChiYXNlKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9fdHJ1bmNfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25JbnRlZ3JhbCgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBsb25nKFRydW5jUmV0dXJuc05vbkludGVncmFsKCkpCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX190cnVuY19fIHJldHVybmVkIG5vbi1JbnRlZ3JhbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICh0eXBlIE5vbkludGVncmFsKSIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJGYWlsZWQgdG8gcmFpc2UgVHlwZUVycm9yIHdpdGggJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYmFzZSwgdHJ1bmNfcmVzdWx0X2Jhc2UpLCkpCisKKyAgICBkZWYgdGVzdF9taXNjKHNlbGYpOgorCisgICAgICAgICMgY2hlY2sgdGhlIGV4dHJlbWVzIGluIGludDwtPmxvbmcgY29udmVyc2lvbgorICAgICAgICBodWdlcG9zID0gc3lzLm1heGludAorICAgICAgICBodWdlbmVnID0gLWh1Z2Vwb3MgLSAxCisgICAgICAgIGh1Z2Vwb3NfYXNsb25nID0gbG9uZyhodWdlcG9zKQorICAgICAgICBodWdlbmVnX2FzbG9uZyA9IGxvbmcoaHVnZW5lZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodWdlcG9zLCBodWdlcG9zX2FzbG9uZywgImxvbmcoc3lzLm1heGludCkgIT0gc3lzLm1heGludCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHVnZW5lZywgaHVnZW5lZ19hc2xvbmcsCisgICAgICAgICAgICAibG9uZygtc3lzLm1heGludC0xKSAhPSAtc3lzLm1heGludC0xIikKKworICAgICAgICAjIGxvbmcgLT4gaW50IHNob3VsZCBub3QgZmFpbCBmb3IgaHVnZXBvc19hc2xvbmcgb3IgaHVnZW5lZ19hc2xvbmcKKyAgICAgICAgeCA9IGludChodWdlcG9zX2FzbG9uZykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBodWdlcG9zLAorICAgICAgICAgICAgICAgICAgImNvbnZlcnRpbmcgc3lzLm1heGludCB0byBsb25nIGFuZCBiYWNrIHRvIGludCBmYWlscyIpCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJpbnQobG9uZyhzeXMubWF4aW50KSkgb3ZlcmZsb3dlZCEiKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh4LCBpbnQpOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJpbnQobG9uZyhzeXMubWF4aW50KSkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgaW50IikKKyAgICAgICAgeCA9IGludChodWdlbmVnX2FzbG9uZykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBodWdlbmVnLAorICAgICAgICAgICAgICAgICAgImNvbnZlcnRpbmcgLXN5cy5tYXhpbnQtMSB0byBsb25nIGFuZCBiYWNrIHRvIGludCBmYWlscyIpCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJpbnQobG9uZygtc3lzLm1heGludC0xKSkgb3ZlcmZsb3dlZCEiKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh4LCBpbnQpOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJpbnQobG9uZygtc3lzLm1heGludC0xKSkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgaW50IikKKyAgICAgICAgIyBidXQgbG9uZyAtPiBpbnQgc2hvdWxkIG92ZXJmbG93IGZvciBodWdlcG9zKzEgYW5kIGh1Z2VuZWctMQorICAgICAgICB4ID0gaHVnZXBvc19hc2xvbmcgKyAxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHkgPSBpbnQoeCkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoImludChsb25nKHN5cy5tYXhpbnQpICsgMSkgbXVzdG4ndCBvdmVyZmxvdyIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh5LCBsb25nLAorICAgICAgICAgICAgImludChsb25nKHN5cy5tYXhpbnQpICsgMSkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgbG9uZyIpCisKKyAgICAgICAgeCA9IGh1Z2VuZWdfYXNsb25nIC0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICB5ID0gaW50KHgpCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJpbnQobG9uZygtc3lzLm1heGludC0xKSAtIDEpIG11c3RuJ3Qgb3ZlcmZsb3ciKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeSwgbG9uZywKKyAgICAgICAgICAgICAgICJpbnQobG9uZygtc3lzLm1heGludC0xKSAtIDEpIHNob3VsZCBoYXZlIHJldHVybmVkIGxvbmciKQorCisgICAgICAgIGNsYXNzIGxvbmcyKGxvbmcpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB4ID0gbG9uZzIoMUw8PDEwMCkKKyAgICAgICAgeSA9IGludCh4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh5KSBpcyBsb25nLAorICAgICAgICAgICAgIm92ZXJmbG93aW5nIGludCBjb252ZXJzaW9uIG11c3QgcmV0dXJuIGxvbmcgbm90IGxvbmcgc3VidHlwZSIpCisKKyAgICAgICAgIyBsb25nIC0+IFB5X3NzaXplX3QgY29udmVyc2lvbgorICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOgorICAgICAgICAgICAgICAgIHJldHVybiBpLCBqCisKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYKClbLTVMOjdMXSwgKC01LCA3KSkKKyAgICAgICAgICAgICMgdXNlIHRoZSBjbGFtcGluZyBlZmZlY3QgdG8gdGVzdCB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgbG9uZ3MKKyAgICAgICAgICAgICMgdGhhdCBmaXQgYSBQeV9zc2l6ZV90CisgICAgICAgICAgICBzbGljZW1pbiwgc2xpY2VtYXggPSBYKClbLTJMKioxMDA6MkwqKjEwMF0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWCgpW3NsaWNlbWluOnNsaWNlbWF4XSwgKHNsaWNlbWluLCBzbGljZW1heCkpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTk4Njkoc2VsZik6CisgICAgICAgICMgSXNzdWUgOTg2OTogSW50ZXJwcmV0ZXIgY3Jhc2ggd2hlbiBpbml0aWFsaXppbmcgYW4gaW5zdGFuY2UKKyAgICAgICAgIyBvZiBhIGxvbmcgc3ViY2xhc3MgZnJvbSBhbiBvYmplY3Qgd2hvc2UgX19sb25nX18gbWV0aG9kIHJldHVybnMKKyAgICAgICAgIyBhIHBsYWluIGludC4KKyAgICAgICAgY2xhc3MgQmFkTG9uZyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fbG9uZ19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAxMDAwMDAwCisKKyAgICAgICAgY2xhc3MgTXlMb25nKGxvbmcpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHggPSBNeUxvbmcoQmFkTG9uZygpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeCwgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCAxMDAwMDAwKQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdGVzdHMgb2YgYXV0byBpbnQtPmxvbmcgY29udmVyc2lvbgorCisgICAgZGVmIHRlc3RfYXV0b19vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgc3BlY2lhbCA9IFswLCAxLCAyLCAzLCBzeXMubWF4aW50LTEsIHN5cy5tYXhpbnQsIHN5cy5tYXhpbnQrMV0KKyAgICAgICAgc3FydCA9IGludChtYXRoLnNxcnQoc3lzLm1heGludCkpCisgICAgICAgIHNwZWNpYWwuZXh0ZW5kKFtzcXJ0LTEsIHNxcnQsIHNxcnQrMV0pCisgICAgICAgIHNwZWNpYWwuZXh0ZW5kKFstaSBmb3IgaSBpbiBzcGVjaWFsXSkKKworICAgICAgICBkZWYgY2hlY2tpdCgqYXJncyk6CisgICAgICAgICAgICAjIEhlYXZ5IHVzZSBvZiBuZXN0ZWQgc2NvcGVzIGhlcmUhCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgRnJtKCJmb3IgJXIgZXhwZWN0ZWQgJXIgZ290ICVyIiwgYXJncywgZXhwZWN0ZWQsIGdvdCkpCisKKyAgICAgICAgZm9yIHggaW4gc3BlY2lhbDoKKyAgICAgICAgICAgIGxvbmd4ID0gbG9uZyh4KQorCisgICAgICAgICAgICBleHBlY3RlZCA9IC1sb25neAorICAgICAgICAgICAgZ290ID0gLXgKKyAgICAgICAgICAgIGNoZWNraXQoJy0nLCB4KQorCisgICAgICAgICAgICBmb3IgeSBpbiBzcGVjaWFsOgorICAgICAgICAgICAgICAgIGxvbmd5ID0gbG9uZyh5KQorCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsb25neCArIGxvbmd5CisgICAgICAgICAgICAgICAgZ290ID0geCArIHkKKyAgICAgICAgICAgICAgICBjaGVja2l0KHgsICcrJywgeSkKKworICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbG9uZ3ggLSBsb25neQorICAgICAgICAgICAgICAgIGdvdCA9IHggLSB5CisgICAgICAgICAgICAgICAgY2hlY2tpdCh4LCAnLScsIHkpCisKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxvbmd4ICogbG9uZ3kKKyAgICAgICAgICAgICAgICBnb3QgPSB4ICogeQorICAgICAgICAgICAgICAgIGNoZWNraXQoeCwgJyonLCB5KQorCisgICAgICAgICAgICAgICAgaWYgeToKKyAgICAgICAgICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsb25neCAvIGxvbmd5CisgICAgICAgICAgICAgICAgICAgICAgICBnb3QgPSB4IC8geQorICAgICAgICAgICAgICAgICAgICBjaGVja2l0KHgsICcvJywgeSkKKworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxvbmd4IC8vIGxvbmd5CisgICAgICAgICAgICAgICAgICAgIGdvdCA9IHggLy8geQorICAgICAgICAgICAgICAgICAgICBjaGVja2l0KHgsICcvLycsIHkpCisKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBkaXZtb2QobG9uZ3gsIGxvbmd5KQorICAgICAgICAgICAgICAgICAgICBnb3QgPSBkaXZtb2QobG9uZ3gsIGxvbmd5KQorICAgICAgICAgICAgICAgICAgICBjaGVja2l0KHgsICdkaXZtb2QnLCB5KQorCisgICAgICAgICAgICAgICAgaWYgYWJzKHkpIDwgNSBhbmQgbm90ICh4ID09IDAgYW5kIHkgPCAwKToKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsb25neCAqKiBsb25neQorICAgICAgICAgICAgICAgICAgICBnb3QgPSB4ICoqIHkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tpdCh4LCAnKionLCB5KQorCisgICAgICAgICAgICAgICAgICAgIGZvciB6IGluIHNwZWNpYWw6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB6ICE9IDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHkgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBwb3cobG9uZ3gsIGxvbmd5LCBsb25nKHopKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3QgPSBwb3coeCwgeSwgeikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tpdCgncG93JywgeCwgeSwgJyUnLCB6KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG93LGxvbmd4LCBsb25neSwgbG9uZyh6KSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCByZXF1aXJlcyBJRUVFIDc1NCBkb3VibGVzIikKKyAgICBkZWYgdGVzdF9mbG9hdF9jb252ZXJzaW9uKHNlbGYpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIERCTF9NQVggPSBzeXMuZmxvYXRfaW5mby5tYXgKKyAgICAgICAgREJMX01BWF9FWFAgPSBzeXMuZmxvYXRfaW5mby5tYXhfZXhwCisgICAgICAgIERCTF9NQU5UX0RJRyA9IHN5cy5mbG9hdF9pbmZvLm1hbnRfZGlnCisKKyAgICAgICAgZXhhY3RfdmFsdWVzID0gWzBMLCAxTCwgMkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZygyKio1My0zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKDIqKjUzLTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcoMioqNTMtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZygyKio1MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZygyKio1MysyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKDIqKjU0LTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcoMioqNTQtMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZygyKio1NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZygyKio1NCs0KV0KKyAgICAgICAgZm9yIHggaW4gZXhhY3RfdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKGZsb2F0KHgpKSwgeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhmbG9hdCgteCkpLCAteCkKKworICAgICAgICAjIHRlc3Qgcm91bmQtaGFsZi1ldmVuCisgICAgICAgIGZvciB4LCB5IGluIFsoMSwgMCksICgyLCAyKSwgKDMsIDQpLCAoNCwgNCksICg1LCA0KSwgKDYsIDYpLCAoNywgOCldOgorICAgICAgICAgICAgZm9yIHAgaW4geHJhbmdlKDE1KToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoZmxvYXQoMkwqKnAqKDIqKjUzK3gpKSksIDJMKipwKigyKio1Myt5KSkKKworICAgICAgICBmb3IgeCwgeSBpbiBbKDAsIDApLCAoMSwgMCksICgyLCAwKSwgKDMsIDQpLCAoNCwgNCksICg1LCA0KSwgKDYsIDgpLAorICAgICAgICAgICAgICAgICAgICAgKDcsIDgpLCAoOCwgOCksICg5LCA4KSwgKDEwLCA4KSwgKDExLCAxMiksICgxMiwgMTIpLAorICAgICAgICAgICAgICAgICAgICAgKDEzLCAxMiksICgxNCwgMTYpLCAoMTUsIDE2KV06CisgICAgICAgICAgICBmb3IgcCBpbiB4cmFuZ2UoMTUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhmbG9hdCgyTCoqcCooMioqNTQreCkpKSwgMkwqKnAqKDIqKjU0K3kpKQorCisgICAgICAgICMgYmVoYXZpb3VyIG5lYXIgZXh0cmVtZXMgb2YgZmxvYXRpbmctcG9pbnQgcmFuZ2UKKyAgICAgICAgbG9uZ19kYmxfbWF4ID0gbG9uZyhEQkxfTUFYKQorICAgICAgICB0b3BfcG93ZXIgPSAyKipEQkxfTUFYX0VYUAorICAgICAgICBoYWxmd2F5ID0gKGxvbmdfZGJsX21heCArIHRvcF9wb3dlcikvLzIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChsb25nX2RibF9tYXgpLCBEQkxfTUFYKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KGxvbmdfZGJsX21heCsxKSwgREJMX01BWCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChoYWxmd2F5LTEpLCBEQkxfTUFYKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmbG9hdCwgaGFsZndheSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgxLWhhbGZ3YXkpLCAtREJMX01BWCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZmxvYXQsIC1oYWxmd2F5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmbG9hdCwgdG9wX3Bvd2VyLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZsb2F0LCB0b3BfcG93ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZsb2F0LCB0b3BfcG93ZXIrMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZmxvYXQsIDIqdG9wX3Bvd2VyLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZsb2F0LCAyKnRvcF9wb3dlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZmxvYXQsIHRvcF9wb3dlcip0b3BfcG93ZXIpCisKKyAgICAgICAgZm9yIHAgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICB4ID0gbG9uZygyKipwICogKDIqKjUzICsgMSkgKyAxKQorICAgICAgICAgICAgeSA9IGxvbmcoMioqcCAqICgyKio1MysgMikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoZmxvYXQoeCkpLCB5KQorCisgICAgICAgICAgICB4ID0gbG9uZygyKipwICogKDIqKjUzICsgMSkpCisgICAgICAgICAgICB5ID0gbG9uZygyKipwICogMioqNTMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoZmxvYXQoeCkpLCB5KQorCisgICAgZGVmIHRlc3RfZmxvYXRfb3ZlcmZsb3coc2VsZik6CisgICAgICAgIGZvciB4IGluIC0yLjAsIC0xLjAsIDAuMCwgMS4wLCAyLjA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KGxvbmcoeCkpLCB4KQorCisgICAgICAgIHNodWdlID0gJzEyMzQ1JyAqIDEyMAorICAgICAgICBodWdlID0gMUwgPDwgMzAwMDAKKyAgICAgICAgbWh1Z2UgPSAtaHVnZQorICAgICAgICBuYW1lc3BhY2UgPSB7J2h1Z2UnOiBodWdlLCAnbWh1Z2UnOiBtaHVnZSwgJ3NodWdlJzogc2h1Z2UsICdtYXRoJzogbWF0aH0KKyAgICAgICAgZm9yIHRlc3QgaW4gWyJmbG9hdChodWdlKSIsICJmbG9hdChtaHVnZSkiLAorICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXgoaHVnZSkiLCAiY29tcGxleChtaHVnZSkiLAorICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXgoaHVnZSwgMSkiLCAiY29tcGxleChtaHVnZSwgMSkiLAorICAgICAgICAgICAgICAgICAgICAgImNvbXBsZXgoMSwgaHVnZSkiLCAiY29tcGxleCgxLCBtaHVnZSkiLAorICAgICAgICAgICAgICAgICAgICAgIjEuICsgaHVnZSIsICJodWdlICsgMS4iLCAiMS4gKyBtaHVnZSIsICJtaHVnZSArIDEuIiwKKyAgICAgICAgICAgICAgICAgICAgICIxLiAtIGh1Z2UiLCAiaHVnZSAtIDEuIiwgIjEuIC0gbWh1Z2UiLCAibWh1Z2UgLSAxLiIsCisgICAgICAgICAgICAgICAgICAgICAiMS4gKiBodWdlIiwgImh1Z2UgKiAxLiIsICIxLiAqIG1odWdlIiwgIm1odWdlICogMS4iLAorICAgICAgICAgICAgICAgICAgICAgIjEuIC8vIGh1Z2UiLCAiaHVnZSAvLyAxLiIsICIxLiAvLyBtaHVnZSIsICJtaHVnZSAvLyAxLiIsCisgICAgICAgICAgICAgICAgICAgICAiMS4gLyBodWdlIiwgImh1Z2UgLyAxLiIsICIxLiAvIG1odWdlIiwgIm1odWdlIC8gMS4iLAorICAgICAgICAgICAgICAgICAgICAgIjEuICoqIGh1Z2UiLCAiaHVnZSAqKiAxLiIsICIxLiAqKiBtaHVnZSIsICJtaHVnZSAqKiAxLiIsCisgICAgICAgICAgICAgICAgICAgICAibWF0aC5zaW4oaHVnZSkiLCAibWF0aC5zaW4obWh1Z2UpIiwKKyAgICAgICAgICAgICAgICAgICAgICJtYXRoLnNxcnQoaHVnZSkiLCAibWF0aC5zcXJ0KG1odWdlKSIsICMgc2hvdWxkIGRvIGJldHRlcgorICAgICAgICAgICAgICAgICAgICAgIm1hdGguZmxvb3IoaHVnZSkiLCAibWF0aC5mbG9vcihtaHVnZSkiXToKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZXZhbCwgdGVzdCwgbmFtZXNwYWNlKQorCisgICAgICAgICAgICAjIFhYWCBQZXJoYXBzIGZsb2F0KHNodWdlKSBjYW4gcmFpc2UgT3ZlcmZsb3dFcnJvciBvbiBzb21lIGJveD8KKyAgICAgICAgICAgICMgVGhlIGNvbXBhcmlzb24gc2hvdWxkIG5vdC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZmxvYXQoc2h1Z2UpLCBpbnQoc2h1Z2UpLAorICAgICAgICAgICAgICAgICJmbG9hdChzaHVnZSkgc2hvdWxkIG5vdCBlcXVhbCBpbnQoc2h1Z2UpIikKKworICAgIGRlZiB0ZXN0X2xvZ3Moc2VsZik6CisgICAgICAgIExPRzEwRSA9IG1hdGgubG9nMTAobWF0aC5lKQorCisgICAgICAgIGZvciBleHAgaW4gcmFuZ2UoMTApICsgWzEwMCwgMTAwMCwgMTAwMDBdOgorICAgICAgICAgICAgdmFsdWUgPSAxMCAqKiBleHAKKyAgICAgICAgICAgIGxvZzEwID0gbWF0aC5sb2cxMCh2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobG9nMTAsIGV4cCkKKworICAgICAgICAgICAgIyBsb2cxMCh2YWx1ZSkgPT0gZXhwLCBzbyBsb2codmFsdWUpID09IGxvZzEwKHZhbHVlKS9sb2cxMChlKSA9PQorICAgICAgICAgICAgIyBleHAvTE9HMTBFCisgICAgICAgICAgICBleHBlY3RlZCA9IGV4cCAvIExPRzEwRQorICAgICAgICAgICAgbG9nID0gbWF0aC5sb2codmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGxvZywgZXhwZWN0ZWQpCisKKyAgICAgICAgZm9yIGJhZCBpbiAtKDFMIDw8IDEwMDAwKSwgLTJMLCAwTDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgubG9nLCBiYWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmxvZzEwLCBiYWQpCisKKyAgICBkZWYgdGVzdF9taXhlZF9jb21wYXJlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgIyBXZSdyZSBtb3N0bHkgY29uY2VybmVkIHdpdGggdGhhdCBtaXhpbmcgZmxvYXRzIGFuZCBsb25ncyBkb2VzIHRoZQorICAgICAgICAjIHJpZ2h0IHN0dWZmLCBldmVuIHdoZW4gbG9uZ3MgYXJlIHRvbyBsYXJnZSB0byBmaXQgaW4gYSBmbG9hdC4KKyAgICAgICAgIyBUaGUgc2FmZXN0IHdheSB0byBjaGVjayB0aGUgcmVzdWx0cyBpcyB0byB1c2UgYW4gZW50aXJlbHkgZGlmZmVyZW50CisgICAgICAgICMgbWV0aG9kLCB3aGljaCB3ZSBkbyBoZXJlIHZpYSBhIHNrZWxldGFsIHJhdGlvbmFsIGNsYXNzICh3aGljaAorICAgICAgICAjIHJlcHJlc2VudHMgYWxsIFB5dGhvbiBpbnRzLCBsb25ncyBhbmQgZmxvYXRzIGV4YWN0bHkpLgorICAgICAgICBjbGFzcyBSYXQ6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5uID0gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kID0gMQorICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZmxvYXQpOgorICAgICAgICAgICAgICAgICAgICAjIENvbnZlcnQgdG8gZXhhY3QgcmF0aW9uYWwgZXF1aXZhbGVudC4KKyAgICAgICAgICAgICAgICAgICAgZiwgZSA9IG1hdGguZnJleHAoYWJzKHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGYgPT0gMCBvciAwLjUgPD0gZiA8IDEuMAorICAgICAgICAgICAgICAgICAgICAjIHx2YWx1ZXwgPSBmICogMioqZSBleGFjdGx5CisKKyAgICAgICAgICAgICAgICAgICAgIyBTdWNrIHVwIENIVU5LIGJpdHMgYXQgYSB0aW1lOyAyOCBpcyBlbm91Z2ggc28gdGhhdCB3ZSBzdWNrCisgICAgICAgICAgICAgICAgICAgICMgdXAgYWxsIGJpdHMgaW4gMiBpdGVyYXRpb25zIGZvciBhbGwga25vd24gYmluYXJ5IGRvdWJsZS0KKyAgICAgICAgICAgICAgICAgICAgIyBwcmVjaXNpb24gZm9ybWF0cywgYW5kIHNtYWxsIGVub3VnaCB0byBmaXQgaW4gYW4gaW50LgorICAgICAgICAgICAgICAgICAgICBDSFVOSyA9IDI4CisgICAgICAgICAgICAgICAgICAgIHRvcCA9IDAKKyAgICAgICAgICAgICAgICAgICAgIyBpbnZhcmlhbnQ6IHx2YWx1ZXwgPSAodG9wICsgZikgKiAyKiplIGV4YWN0bHkKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgZjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBtYXRoLmxkZXhwKGYsIENIVU5LKQorICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXQgPSBpbnQoZikKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBkaWdpdCA+PiBDSFVOSyA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICB0b3AgPSAodG9wIDw8IENIVU5LKSB8IGRpZ2l0CisgICAgICAgICAgICAgICAgICAgICAgICBmIC09IGRpZ2l0CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgMC4wIDw9IGYgPCAxLjAKKyAgICAgICAgICAgICAgICAgICAgICAgIGUgLT0gQ0hVTksKKworICAgICAgICAgICAgICAgICAgICAjIE5vdyB8dmFsdWV8ID0gdG9wICogMioqZSBleGFjdGx5LgorICAgICAgICAgICAgICAgICAgICBpZiBlID49IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBuID0gdG9wIDw8IGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAxCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBuID0gdG9wCisgICAgICAgICAgICAgICAgICAgICAgICBkID0gMSA8PCAtZQorICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSA8IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBuID0gLW4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5uID0gbgorICAgICAgICAgICAgICAgICAgICBzZWxmLmQgPSBkCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmbG9hdChuKSAvIGZsb2F0KGQpID09IHZhbHVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW4ndCBkZWFsIHdpdGggJXIiICUgdmFsdWUpCisKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgUmF0KToKKyAgICAgICAgICAgICAgICAgICAgb3RoZXIgPSBSYXQob3RoZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLm4gKiBvdGhlci5kLCBzZWxmLmQgKiBvdGhlci5uKQorCisgICAgICAgIGNhc2VzID0gWzAsIDAuMDAxLCAwLjk5LCAxLjAsIDEuNSwgMWUyMCwgMWUyMDBdCisgICAgICAgICMgMioqNDggaXMgYW4gaW1wb3J0YW50IGJvdW5kYXJ5IGluIHRoZSBpbnRlcm5hbHMuICAyKio1MyBpcyBhbgorICAgICAgICAjIGltcG9ydGFudCBib3VuZGFyeSBmb3IgSUVFRSBkb3VibGUgcHJlY2lzaW9uLgorICAgICAgICBmb3IgdCBpbiAyLjAqKjQ4LCAyLjAqKjUwLCAyLjAqKjUzOgorICAgICAgICAgICAgY2FzZXMuZXh0ZW5kKFt0IC0gMS4wLCB0IC0gMC4zLCB0LCB0ICsgMC4zLCB0ICsgMS4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKHQtMSksIGxvbmcodCksIGxvbmcodCsxKV0pCisgICAgICAgIGNhc2VzLmV4dGVuZChbMCwgMSwgMiwgc3lzLm1heGludCwgZmxvYXQoc3lzLm1heGludCldKQorICAgICAgICAjIDFMPDwyMDAwMCBzaG91bGQgZXhjZWVkIGFsbCBkb3VibGUgZm9ybWF0cy4gIGxvbmcoMWUyMDApIGlzIHRvCisgICAgICAgICMgY2hlY2sgdGhhdCB3ZSBnZXQgZXF1YWxpdHkgd2l0aCAxZTIwMCBhYm92ZS4KKyAgICAgICAgdCA9IGxvbmcoMWUyMDApCisgICAgICAgIGNhc2VzLmV4dGVuZChbMEwsIDFMLCAyTCwgMUwgPDwgMjAwMDAsIHQtMSwgdCwgdCsxXSkKKyAgICAgICAgY2FzZXMuZXh0ZW5kKFsteCBmb3IgeCBpbiBjYXNlc10pCisgICAgICAgIGZvciB4IGluIGNhc2VzOgorICAgICAgICAgICAgUnggPSBSYXQoeCkKKyAgICAgICAgICAgIGZvciB5IGluIGNhc2VzOgorICAgICAgICAgICAgICAgIFJ5ID0gUmF0KHkpCisgICAgICAgICAgICAgICAgUmNtcCA9IGNtcChSeCwgUnkpCisgICAgICAgICAgICAgICAgeHljbXAgPSBjbXAoeCwgeSkKKyAgICAgICAgICAgICAgICBlcShSY21wLCB4eWNtcCwgRnJtKCIlciAlciAlZCAlZCIsIHgsIHksIFJjbXAsIHh5Y21wKSkKKyAgICAgICAgICAgICAgICBlcSh4ID09IHksIFJjbXAgPT0gMCwgRnJtKCIlciA9PSAlciAlZCIsIHgsIHksIFJjbXApKQorICAgICAgICAgICAgICAgIGVxKHggIT0geSwgUmNtcCAhPSAwLCBGcm0oIiVyICE9ICVyICVkIiwgeCwgeSwgUmNtcCkpCisgICAgICAgICAgICAgICAgZXEoeCA8IHksIFJjbXAgPCAwLCBGcm0oIiVyIDwgJXIgJWQiLCB4LCB5LCBSY21wKSkKKyAgICAgICAgICAgICAgICBlcSh4IDw9IHksIFJjbXAgPD0gMCwgRnJtKCIlciA8PSAlciAlZCIsIHgsIHksIFJjbXApKQorICAgICAgICAgICAgICAgIGVxKHggPiB5LCBSY21wID4gMCwgRnJtKCIlciA+ICVyICVkIiwgeCwgeSwgUmNtcCkpCisgICAgICAgICAgICAgICAgZXEoeCA+PSB5LCBSY21wID49IDAsIEZybSgiJXIgPj0gJXIgJWQiLCB4LCB5LCBSY21wKSkKKworICAgIGRlZiB0ZXN0X25hbl9pbmYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGxvbmcsIGZsb2F0KCdpbmYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbG9uZywgZmxvYXQoJy1pbmYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9uZywgZmxvYXQoJ25hbicpKQorCisgICAgZGVmIHRlc3RfYml0X2xlbmd0aChzZWxmKToKKyAgICAgICAgdGlueSA9IDFlLTEwCisgICAgICAgIGZvciB4IGluIHhyYW5nZSgtNjUwMDAsIDY1MDAwKToKKyAgICAgICAgICAgIHggPSBsb25nKHgpCisgICAgICAgICAgICBrID0geC5iaXRfbGVuZ3RoKCkKKyAgICAgICAgICAgICMgQ2hlY2sgZXF1aXZhbGVuY2Ugd2l0aCBQeXRob24gdmVyc2lvbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBsZW4oYmluKHgpLmxzdHJpcCgnLTBiJykpKQorICAgICAgICAgICAgIyBCZWhhdmlvdXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkb2NzCisgICAgICAgICAgICBpZiB4ICE9IDA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIqKihrLTEpIDw9IGFicyh4KSA8IDIqKmspCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgMCkKKyAgICAgICAgICAgICMgQWx0ZXJuYXRpdmUgZGVmaW5pdGlvbjogeC5iaXRfbGVuZ3RoKCkgPT0gMSArIGZsb29yKGxvZ18yKHgpKQorICAgICAgICAgICAgaWYgeCAhPSAwOgorICAgICAgICAgICAgICAgICMgV2hlbiB4IGlzIGFuIGV4YWN0IHBvd2VyIG9mIDIsIG51bWVyaWMgZXJyb3JzIGNhbgorICAgICAgICAgICAgICAgICMgY2F1c2UgZmxvb3IobG9nKHgpL2xvZygyKSkgdG8gYmUgb25lIHRvbyBzbWFsbDsgZm9yCisgICAgICAgICAgICAgICAgIyBzbWFsbCB4IHRoaXMgY2FuIGJlIGZpeGVkIGJ5IGFkZGluZyBhIHNtYWxsIHF1YW50aXR5CisgICAgICAgICAgICAgICAgIyB0byB0aGUgcXVvdGllbnQgYmVmb3JlIHRha2luZyB0aGUgZmxvb3IuCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCAxICsgbWF0aC5mbG9vcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGgubG9nKGFicyh4KSkvbWF0aC5sb2coMikgKyB0aW55KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwTCkuYml0X2xlbmd0aCgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxTCkuYml0X2xlbmd0aCgpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtMUwpLmJpdF9sZW5ndGgoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMkwpLmJpdF9sZW5ndGgoKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTJMKS5iaXRfbGVuZ3RoKCksIDIpCisgICAgICAgIGZvciBpIGluIFsyLCAzLCAxNSwgMTYsIDE3LCAzMSwgMzIsIDMzLCA2MywgNjQsIDIzNF06CisgICAgICAgICAgICBhID0gMkwqKmkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEtMSkuYml0X2xlbmd0aCgpLCBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMS1hKS5iaXRfbGVuZ3RoKCksIGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhKS5iaXRfbGVuZ3RoKCksIGkrMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC1hKS5iaXRfbGVuZ3RoKCksIGkrMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGErMSkuYml0X2xlbmd0aCgpLCBpKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtYS0xKS5iaXRfbGVuZ3RoKCksIGkrMSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChMb25nVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGE4NjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWM4YjRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZ19mdXR1cmUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nX2Z1dHVyZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmMzYmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZ19mdXR1cmUucHkKQEAgLTAsMCArMSwyMjEgQEAKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KKyMgV2hlbiB0cnVlIGRpdmlzaW9uIGlzIHRoZSBkZWZhdWx0LCBnZXQgcmlkIG9mIHRoaXMgYW5kIGFkZCBpdCB0bworIyB0ZXN0X2xvbmcucHkgaW5zdGVhZC4gIEluIHRoZSBtZWFudGltZSwgaXQncyB0b28gb2JzY3VyZSB0byB0cnkgdG8KKyMgdHJpY2sganVzdCBwYXJ0IG9mIHRlc3RfbG9uZyBpbnRvIHVzaW5nIGZ1dHVyZSBkaXZpc2lvbi4KKworaW1wb3J0IHN5cworaW1wb3J0IHJhbmRvbQoraW1wb3J0IG1hdGgKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKKyMgZGVjb3JhdG9yIGZvciBza2lwcGluZyB0ZXN0cyBvbiBub24tSUVFRSA3NTQgcGxhdGZvcm1zCityZXF1aXJlc19JRUVFXzc1NCA9IHVuaXR0ZXN0LnNraXBVbmxlc3MoCisgICAgZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpLAorICAgICJ0ZXN0IHJlcXVpcmVzIElFRUUgNzU0IGRvdWJsZXMiKQorCitEQkxfTUFYID0gc3lzLmZsb2F0X2luZm8ubWF4CitEQkxfTUFYX0VYUCA9IHN5cy5mbG9hdF9pbmZvLm1heF9leHAKK0RCTF9NSU5fRVhQID0gc3lzLmZsb2F0X2luZm8ubWluX2V4cAorREJMX01BTlRfRElHID0gc3lzLmZsb2F0X2luZm8ubWFudF9kaWcKK0RCTF9NSU5fT1ZFUkZMT1cgPSAyKipEQkxfTUFYX0VYUCAtIDIqKihEQkxfTUFYX0VYUCAtIERCTF9NQU5UX0RJRyAtIDEpCisKKyMgcHVyZSBQeXRob24gdmVyc2lvbiBvZiBjb3JyZWN0bHktcm91bmRlZCB0cnVlIGRpdmlzaW9uCitkZWYgdHJ1ZWRpdihhLCBiKToKKyAgICAiIiJDb3JyZWN0bHktcm91bmRlZCB0cnVlIGRpdmlzaW9uIGZvciBpbnRlZ2Vycy4iIiIKKyAgICBuZWdhdGl2ZSA9IGFeYiA8IDAKKyAgICBhLCBiID0gYWJzKGEpLCBhYnMoYikKKworICAgICMgZXhjZXB0aW9uczogIGRpdmlzaW9uIGJ5IHplcm8sIG92ZXJmbG93CisgICAgaWYgbm90IGI6CisgICAgICAgIHJhaXNlIFplcm9EaXZpc2lvbkVycm9yKCJkaXZpc2lvbiBieSB6ZXJvIikKKyAgICBpZiBhID49IERCTF9NSU5fT1ZFUkZMT1cgKiBiOgorICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKCJpbnQvaW50IHRvbyBsYXJnZSB0byByZXByZXNlbnQgYXMgYSBmbG9hdCIpCisKKyAgICMgZmluZCBpbnRlZ2VyIGQgc2F0aXNmeWluZyAyKiooZCAtIDEpIDw9IGEvYiA8IDIqKmQKKyAgICBkID0gYS5iaXRfbGVuZ3RoKCkgLSBiLmJpdF9sZW5ndGgoKQorICAgIGlmIGQgPj0gMCBhbmQgYSA+PSAyKipkICogYiBvciBkIDwgMCBhbmQgYSAqIDIqKi1kID49IGI6CisgICAgICAgIGQgKz0gMQorCisgICAgIyBjb21wdXRlIDIqKi1leHAgKiBhIC8gYiBmb3Igc3VpdGFibGUgZXhwCisgICAgZXhwID0gbWF4KGQsIERCTF9NSU5fRVhQKSAtIERCTF9NQU5UX0RJRworICAgIGEsIGIgPSBhIDw8IG1heCgtZXhwLCAwKSwgYiA8PCBtYXgoZXhwLCAwKQorICAgIHEsIHIgPSBkaXZtb2QoYSwgYikKKworICAgICMgcm91bmQtaGFsZi10by1ldmVuOiBmcmFjdGlvbmFsIHBhcnQgaXMgci9iLCB3aGljaCBpcyA+IDAuNSBpZmYKKyAgICAjIDIqciA+IGIsIGFuZCA9PSAwLjUgaWZmIDIqciA9PSBiLgorICAgIGlmIDIqciA+IGIgb3IgMipyID09IGIgYW5kIHEgJSAyID09IDE6CisgICAgICAgIHEgKz0gMQorCisgICAgcmVzdWx0ID0gbWF0aC5sZGV4cChmbG9hdChxKSwgZXhwKQorICAgIHJldHVybiAtcmVzdWx0IGlmIG5lZ2F0aXZlIGVsc2UgcmVzdWx0CisKK2NsYXNzIFRydWVEaXZpc2lvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgaHVnZSA9IDFMIDw8IDQwMDAwCisgICAgICAgIG1odWdlID0gLWh1Z2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodWdlIC8gaHVnZSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1odWdlIC8gbWh1Z2UsIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodWdlIC8gbWh1Z2UsIC0xLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWh1Z2UgLyBodWdlLCAtMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEgLyBodWdlLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMUwgLyBodWdlLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSAvIG1odWdlLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMUwgLyBtaHVnZSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2NjYgKiBodWdlICsgKGh1Z2UgPj4gMSkpIC8gaHVnZSwgNjY2LjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDY2NiAqIG1odWdlICsgKG1odWdlID4+IDEpKSAvIG1odWdlLCA2NjYuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNjY2ICogaHVnZSArIChodWdlID4+IDEpKSAvIG1odWdlLCAtNjY2LjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDY2NiAqIG1odWdlICsgKG1odWdlID4+IDEpKSAvIGh1Z2UsIC02NjYuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodWdlIC8gKGh1Z2UgPDwgMSksIDAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMTAwMDAwMCAqIGh1Z2UpIC8gaHVnZSwgMTAwMDAwMCkKKworICAgICAgICBuYW1lc3BhY2UgPSB7J2h1Z2UnOiBodWdlLCAnbWh1Z2UnOiBtaHVnZX0KKworICAgICAgICBmb3Igb3ZlcmZsb3cgaW4gWyJmbG9hdChodWdlKSIsICJmbG9hdChtaHVnZSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJodWdlIC8gMSIsICJodWdlIC8gMkwiLCAiaHVnZSAvIC0xIiwgImh1Z2UgLyAtMkwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJtaHVnZSAvIDEwMCIsICJtaHVnZSAvIDEwMEwiXToKKyAgICAgICAgICAgICMgSWYgdGhlICJldmFsIiBkb2VzIG5vdCBoYXBwZW4gaW4gdGhpcyBtb2R1bGUsCisgICAgICAgICAgICAjIHRydWUgZGl2aXNpb24gaXMgbm90IGVuYWJsZWQKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvcik6CisgICAgICAgICAgICAgICAgZXZhbChvdmVyZmxvdywgbmFtZXNwYWNlKQorCisgICAgICAgIGZvciB1bmRlcmZsb3cgaW4gWyIxIC8gaHVnZSIsICIyTCAvIGh1Z2UiLCAiLTEgLyBodWdlIiwgIi0yTCAvIGh1Z2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICIxMDAgLyBtaHVnZSIsICIxMDBMIC8gbWh1Z2UiXToKKyAgICAgICAgICAgIHJlc3VsdCA9IGV2YWwodW5kZXJmbG93LCBuYW1lc3BhY2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMC4wLCAnZXhwZWN0ZWQgdW5kZXJmbG93IHRvIDAgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJvbSB7IXJ9Jy5mb3JtYXQodW5kZXJmbG93KSkKKworICAgICAgICBmb3IgemVybyBpbiBbImh1Z2UgLyAwIiwgImh1Z2UgLyAwTCIsICJtaHVnZSAvIDAiLCAibWh1Z2UgLyAwTCJdOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICAgICAgZXZhbCh6ZXJvLCBuYW1lc3BhY2UpCisKKyAgICBkZWYgY2hlY2tfdHJ1ZWRpdihzZWxmLCBhLCBiLCBza2lwX3NtYWxsPVRydWUpOgorICAgICAgICAiIiJWZXJpZnkgdGhhdCB0aGUgcmVzdWx0IG9mIGEvYiBpcyBjb3JyZWN0bHkgcm91bmRlZCwgYnkKKyAgICAgICAgY29tcGFyaW5nIGl0IHdpdGggYSBwdXJlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiBjb3JyZWN0bHkKKyAgICAgICAgcm91bmRlZCBkaXZpc2lvbi4gIGIgc2hvdWxkIGJlIG5vbnplcm8uIiIiCisKKyAgICAgICAgYSwgYiA9IGxvbmcoYSksIGxvbmcoYikKKworICAgICAgICAjIHNraXAgY2hlY2sgZm9yIHNtYWxsIGEgYW5kIGI6IGluIHRoaXMgY2FzZSwgdGhlIGN1cnJlbnQKKyAgICAgICAgIyBpbXBsZW1lbnRhdGlvbiBjb252ZXJ0cyB0aGUgYXJndW1lbnRzIHRvIGZsb2F0IGRpcmVjdGx5IGFuZAorICAgICAgICAjIHRoZW4gYXBwbGllcyBhIGZsb2F0IGRpdmlzaW9uLiAgVGhpcyBjYW4gZ2l2ZSBkb3VibHktcm91bmRlZAorICAgICAgICAjIHJlc3VsdHMgb24geDg3LXVzaW5nIG1hY2hpbmVzIChwYXJ0aWN1bGFybHkgMzItYml0IExpbnV4KS4KKyAgICAgICAgaWYgc2tpcF9zbWFsbCBhbmQgbWF4KGFicyhhKSwgYWJzKGIpKSA8IDIqKkRCTF9NQU5UX0RJRzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgdXNlIHJlcHIgc28gdGhhdCB3ZSBjYW4gZGlzdGluZ3Vpc2ggYmV0d2VlbiAtMC4wIGFuZCAwLjAKKyAgICAgICAgICAgIGV4cGVjdGVkID0gcmVwcih0cnVlZGl2KGEsIGIpKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIGV4cGVjdGVkID0gJ292ZXJmbG93JworICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBleHBlY3RlZCA9ICd6ZXJvZGl2aXNpb24nCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZ290ID0gcmVwcihhIC8gYikKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBnb3QgPSAnb3ZlcmZsb3cnCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgIGdvdCA9ICd6ZXJvZGl2aXNpb24nCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290LCAiSW5jb3JyZWN0bHkgcm91bmRlZCBkaXZpc2lvbiB7fS97fTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCB7fSwgZ290IHt9Ii5mb3JtYXQoYSwgYiwgZXhwZWN0ZWQsIGdvdCkpCisKKyAgICBAcmVxdWlyZXNfSUVFRV83NTQKKyAgICBkZWYgdGVzdF9jb3JyZWN0bHlfcm91bmRlZF90cnVlX2RpdmlzaW9uKHNlbGYpOgorICAgICAgICAjIG1vcmUgc3RyaW5nZW50IHRlc3RzIHRoYW4gdGhvc2UgYWJvdmUsIGNoZWNraW5nIHRoYXQgdGhlCisgICAgICAgICMgcmVzdWx0IG9mIHRydWUgZGl2aXNpb24gb2YgaW50cyBpcyBhbHdheXMgY29ycmVjdGx5IHJvdW5kZWQuCisgICAgICAgICMgVGhpcyB0ZXN0IHNob3VsZCBwcm9iYWJseSBiZSBjb25zaWRlcmVkIENQeXRob24tc3BlY2lmaWMuCisKKyAgICAgICAgIyBFeGVyY2lzZSBhbGwgdGhlIGNvZGUgcGF0aHMgbm90IGludm9sdmluZyBHYi1zaXplZCBpbnRzLgorICAgICAgICAjIC4uLiBkaXZpc2lvbnMgaW52b2x2aW5nIHplcm8KKyAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KDEyMywgMCkKKyAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KC00NTYsIDApCisgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigwLCAzKQorICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoMCwgLTMpCisgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigwLCAwKQorICAgICAgICAjIC4uLiBvdmVyZmxvdyBvciB1bmRlcmZsb3cgYnkgbGFyZ2UgbWFyZ2luCisgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdig2NzEgKiAxMjM0NSAqIDIqKkRCTF9NQVhfRVhQLCAxMjM0NSkKKyAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KDEyMzQ1LCAzNDU2NzggKiAyKiooREJMX01BTlRfRElHIC0gREJMX01JTl9FWFApKQorICAgICAgICAjIC4uLiBhIG11Y2ggbGFyZ2VyIG9yIHNtYWxsZXIgdGhhbiBiCisgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigxMjM0NSoyKioxMDAsIDk4NzY1KQorICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoMTIzNDUqMioqMzAsIDk4NzY1KjcqKjgxKQorICAgICAgICAjIC4uLiBhIC8gYiBuZWFyIGEgYm91bmRhcnk6IG9uZSBvZiAxLCAyKipEQkxfTUFOVF9ESUcsIDIqKkRCTF9NSU5fRVhQLAorICAgICAgICAjICAgICAgICAgICAgICAgICAyKipEQkxfTUFYX0VYUCwgMioqKERCTF9NSU5fRVhQLURCTF9NQU5UX0RJRykKKyAgICAgICAgYmFzZXMgPSAoMCwgREJMX01BTlRfRElHLCBEQkxfTUlOX0VYUCwKKyAgICAgICAgICAgICAgICAgREJMX01BWF9FWFAsIERCTF9NSU5fRVhQIC0gREJMX01BTlRfRElHKQorICAgICAgICBmb3IgYmFzZSBpbiBiYXNlczoKKyAgICAgICAgICAgIGZvciBleHAgaW4gcmFuZ2UoYmFzZSAtIDE1LCBiYXNlICsgMTUpOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdig3NTMxMioyKiptYXgoZXhwLCAwKSwgNjkxODcqMioqbWF4KC1leHAsIDApKQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdig2OTE4NyoyKiptYXgoZXhwLCAwKSwgNzUzMTIqMioqbWF4KC1leHAsIDApKQorCisgICAgICAgICMgb3ZlcmZsb3cgY29ybmVyIGNhc2UKKyAgICAgICAgZm9yIG0gaW4gWzEsIDIsIDcsIDE3LCAxMjM0NSwgNyoqMTAwLAorICAgICAgICAgICAgICAgICAgLTEsIC0yLCAtNSwgLTIzLCAtNjc4OTEsIC00MSoqNTBdOgorICAgICAgICAgICAgZm9yIG4gaW4gcmFuZ2UoLTEwLCAxMCk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KG0qREJMX01JTl9PVkVSRkxPVyArIG4sIG0pCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KG0qREJMX01JTl9PVkVSRkxPVyArIG4sIC1tKQorCisgICAgICAgICMgY2hlY2sgZGV0ZWN0aW9uIG9mIGluZXhhY3RuZXNzIGluIHNoaWZ0aW5nIHN0YWdlCisgICAgICAgIGZvciBuIGluIHJhbmdlKDI1MCk6CisgICAgICAgICAgICAjICgyKipEQkxfTUFOVF9ESUcrMSkvKDIqKkRCTF9NQU5UX0RJRykgbGllcyBoYWxmd2F5CisgICAgICAgICAgICAjIGJldHdlZW4gdHdvIHJlcHJlc2VudGFibGUgZmxvYXRzLCBhbmQgd291bGQgdXN1YWxseSBiZQorICAgICAgICAgICAgIyByb3VuZGVkIGRvd24gdW5kZXIgcm91bmQtaGFsZi10by1ldmVuLiAgVGhlIHRpbmllc3Qgb2YKKyAgICAgICAgICAgICMgYWRkaXRpb25zIHRvIHRoZSBudW1lcmF0b3Igc2hvdWxkIGNhdXNlIGl0IHRvIGJlIHJvdW5kZWQKKyAgICAgICAgICAgICMgdXAgaW5zdGVhZC4KKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigoMioqREJMX01BTlRfRElHICsgMSkqMTIzNDUqMioqMjAwICsgMioqbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDIqKkRCTF9NQU5UX0RJRyoxMjM0NSkKKworICAgICAgICAjIDEvMjczMSBpcyBvbmUgb2YgdGhlIHNtYWxsZXN0IGRpdmlzaW9uIGNhc2VzIHRoYXQncyBzdWJqZWN0CisgICAgICAgICMgdG8gZG91YmxlIHJvdW5kaW5nIG9uIElFRUUgNzU0IG1hY2hpbmVzIHdvcmtpbmcgaW50ZXJuYWxseSB3aXRoCisgICAgICAgICMgNjQtYml0IHByZWNpc2lvbi4gIE9uIHN1Y2ggbWFjaGluZXMsIHRoZSBuZXh0IGNoZWNrIHdvdWxkIGZhaWwsCisgICAgICAgICMgd2VyZSBpdCBub3QgZXhwbGljaXRseSBza2lwcGVkIGluIGNoZWNrX3RydWVkaXYuCisgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigxLCAyNzMxKQorCisgICAgICAgICMgYSBwYXJ0aWN1bGFybHkgYmFkIGNhc2UgZm9yIHRoZSBvbGQgYWxnb3JpdGhtOiAgZ2l2ZXMgYW4KKyAgICAgICAgIyBlcnJvciBvZiBjbG9zZSB0byAzLjUgdWxwcy4KKyAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KDI5NTE0NzkzMTM3MjU4MjI3MzAyMywgMjk1MTQ3OTMyMjY1MTE2MzAzMzYwKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDAwKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigxMCoqKGkrMSksIDEwKippKQorICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KDEwKippLCAxMCoqKGkrMSkpCisKKyAgICAgICAgIyB0ZXN0IHJvdW5kLWhhbGYtdG8tZXZlbiBiZWhhdmlvdXIsIG5vcm1hbCByZXN1bHQKKyAgICAgICAgZm9yIG0gaW4gWzEsIDIsIDQsIDcsIDgsIDE2LCAxNywgMzIsIDEyMzQ1LCA3KioxMDAsCisgICAgICAgICAgICAgICAgICAtMSwgLTIsIC01LCAtMjMsIC02Nzg5MSwgLTQxKio1MF06CisgICAgICAgICAgICBmb3IgbiBpbiByYW5nZSgtMTAsIDEwKToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoMioqREJMX01BTlRfRElHKm0gKyBuLCBtKQorCisgICAgICAgICMgdGVzdCByb3VuZC1oYWxmLXRvLWV2ZW4sIHN1Ym5vcm1hbCByZXN1bHQKKyAgICAgICAgZm9yIG4gaW4gcmFuZ2UoLTIwLCAyMCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYobiwgMioqMTA3NikKKworICAgICAgICAjIGxhcmdlaXNoIHJhbmRvbSBkaXZpc2lvbnM6IGEvYiB3aGVyZSB8YXwgPD0gfGJ8IDw9CisgICAgICAgICMgMip8YXw7IHxhbnN8IGlzIGJldHdlZW4gMC41IGFuZCAxLjAsIHNvIGVycm9yIHNob3VsZAorICAgICAgICAjIGFsd2F5cyBiZSBib3VuZGVkIGJ5IDIqKi01NCB3aXRoIGVxdWFsaXR5IHBvc3NpYmxlIG9ubHkKKyAgICAgICAgIyBpZiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHE9YW5zKjIqKjUzIGlzIHplcm8uCisgICAgICAgIGZvciBNIGluIFsxMCoqMTAsIDEwKioxMDAsIDEwKioxMDAwXToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMDApOgorICAgICAgICAgICAgICAgIGEgPSByYW5kb20ucmFuZHJhbmdlKDEsIE0pCisgICAgICAgICAgICAgICAgYiA9IHJhbmRvbS5yYW5kcmFuZ2UoYSwgMiphKzEpCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KGEsIGIpCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KC1hLCBiKQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdihhLCAtYikKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoLWEsIC1iKQorCisgICAgICAgICMgYW5kIHNvbWUgKGdlbnVpbmVseSkgcmFuZG9tIHRlc3RzCisgICAgICAgIGZvciBfIGluIHJhbmdlKDEwMDAwKToKKyAgICAgICAgICAgIGFfYml0cyA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMCkKKyAgICAgICAgICAgIGJfYml0cyA9IHJhbmRvbS5yYW5kcmFuZ2UoMSwgMTAwMCkKKyAgICAgICAgICAgIHggPSByYW5kb20ucmFuZHJhbmdlKDIqKmFfYml0cykKKyAgICAgICAgICAgIHkgPSByYW5kb20ucmFuZHJhbmdlKDEsIDIqKmJfYml0cykKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdih4LCB5KQorICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KHgsIC15KQorICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KC14LCB5KQorICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KC14LCAteSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRydWVEaXZpc2lvblRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nX2Z1dHVyZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nX2Z1dHVyZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4Njk1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmdfZnV0dXJlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nX2Z1dHVyZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nX2Z1dHVyZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU4Njk1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmdfZnV0dXJlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nZXhwLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZ2V4cC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDIyMmExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZ2V4cC5weQpAQCAtMCwwICsxLDE0IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIExvbmdFeHBUZXh0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9sb25nZXhwKHNlbGYpOgorICAgICAgICBSRVBTID0gNjU1ODAKKyAgICAgICAgbCA9IGV2YWwoIlsiICsgIjIsIiAqIFJFUFMgKyAiXSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBSRVBTKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChMb25nRXhwVGV4dCkKKworaWYgX19uYW1lX189PSJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmdleHAucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZ2V4cC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzNzMyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmdleHAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmdleHAucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZ2V4cC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzNzMyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmdleHAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY29zLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjb3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFmNTEwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY29zLnB5CkBAIC0wLDAgKzEsOTggQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKKworTWFjT1MgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnTWFjT1MnKQorCitURVNURk4yID0gdGVzdF9zdXBwb3J0LlRFU1RGTiArICcyJworCitjbGFzcyBUZXN0TWFjT1ModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RHZXRDcmVhdG9yQW5kVHlwZShzZWxmKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKCcvRGV2ZWxvcGVyL1Rvb2xzL1NldEZpbGUnKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAndycpCisgICAgICAgICAgICBmcC53cml0ZSgnXG4nKQorICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgICAgICAgICBzdWJwcm9jZXNzLmNhbGwoCisgICAgICAgICAgICAgICAgICAgIFsnL0RldmVsb3Blci9Ub29scy9TZXRGaWxlJywgJy10JywgJ0FCQ0QnLCAnLWMnLCAnRUZHSCcsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOXSkKKworICAgICAgICAgICAgY3IsIHRwID0gTWFjT1MuR2V0Q3JlYXRvckFuZFR5cGUodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHAsICdBQkNEJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3IsICdFRkdIJykKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdFNldENyZWF0b3JBbmRUeXBlKHNlbGYpOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoJy9EZXZlbG9wZXIvVG9vbHMvR2V0RmlsZUluZm8nKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAndycpCisgICAgICAgICAgICBmcC53cml0ZSgnXG4nKQorICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgICAgICAgICBNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAgICAnQUJDRCcsICdFRkdIJykKKworICAgICAgICAgICAgY3IsIHRwID0gTWFjT1MuR2V0Q3JlYXRvckFuZFR5cGUodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3IsICdBQkNEJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHAsICdFRkdIJykKKworICAgICAgICAgICAgZGF0YSA9IHN1YnByb2Nlc3MuUG9wZW4oWyIvRGV2ZWxvcGVyL1Rvb2xzL0dldEZpbGVJbmZvIiwgdGVzdF9zdXBwb3J0LlRFU1RGTl0sCisgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpLmNvbW11bmljYXRlKClbMF0KKworICAgICAgICAgICAgdHAgPSBOb25lCisgICAgICAgICAgICBjciA9IE5vbmUKKyAgICAgICAgICAgIGZvciAgbG4gaW4gZGF0YS5zcGxpdGxpbmVzKCk6CisgICAgICAgICAgICAgICAgaWYgbG4uc3RhcnRzd2l0aCgndHlwZTonKToKKyAgICAgICAgICAgICAgICAgICAgdHAgPSBsbi5zcGxpdCgpWy0xXVsxOi0xXQorICAgICAgICAgICAgICAgIGlmIGxuLnN0YXJ0c3dpdGgoJ2NyZWF0b3I6Jyk6CisgICAgICAgICAgICAgICAgICAgIGNyID0gbG4uc3BsaXQoKVstMV1bMTotMV0KKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjciwgJ0FCQ0QnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cCwgJ0VGR0gnKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworCisgICAgZGVmIHRlc3RPcGVuUkYoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAndycpCisgICAgICAgICAgICBmcC53cml0ZSgnaGVsbG8gd29ybGRcbicpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgICAgIHJmcCA9IE1hY09TLm9wZW5yZih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAnKndiJykKKyAgICAgICAgICAgIHJmcC53cml0ZSgnZ29vZGJ5ZSB3b3JsZFxuJykKKyAgICAgICAgICAgIHJmcC5jbG9zZSgpCisKKworICAgICAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICdyJykKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJ2hlbGxvIHdvcmxkXG4nKQorCisgICAgICAgICAgICByZnAgPSBNYWNPUy5vcGVucmYodGVzdF9zdXBwb3J0LlRFU1RGTiwgJypyYicpCisgICAgICAgICAgICBkYXRhID0gcmZwLnJlYWQoMTAwKQorICAgICAgICAgICAgZGF0YTIgPSByZnAucmVhZCgxMDApCisgICAgICAgICAgICByZnAuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAnZ29vZGJ5ZSB3b3JsZFxuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YTIsICcnKQorCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0TWFjT1MpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjb3MucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjb3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMGQ2YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNvcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjb3MucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjb3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMGQ2YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNvcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjb3N0b29scy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY29zdG9vbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxNTk4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY29zdG9vbHMucHkKQEAgLTAsMCArMSw4OCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK01hY09TID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ01hY09TJykKKyNUaGUgZm9sbG93aW5nIG1vZHVsZXMgc2hvdWxkIGV4aXN0IGlmIE1hY09TIGV4aXN0cy4KK2ltcG9ydCBDYXJib24uRmlsZQoraW1wb3J0IG1hY29zdG9vbHMKKworVEVTVEZOMiA9IHRlc3Rfc3VwcG9ydC5URVNURk4gKyAnMicKKworY2xhc3MgVGVzdE1hY29zdG9vbHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBmcCA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3cnKQorICAgICAgICBmcC53cml0ZSgnaGVsbG8gd29ybGRcbicpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgcmZwID0gTWFjT1Mub3BlbnJmKHRlc3Rfc3VwcG9ydC5URVNURk4sICcqd2InKQorICAgICAgICByZnAud3JpdGUoJ2dvb2RieWUgd29ybGRcbicpCisgICAgICAgIHJmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNURk4yKQorCisgICAgZGVmIGNvbXBhcmVEYXRhKHNlbGYpOgorICAgICAgICBmcCA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3InKQorICAgICAgICBkYXRhMSA9IGZwLnJlYWQoKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGZwID0gb3BlbihURVNURk4yLCAncicpCisgICAgICAgIGRhdGEyID0gZnAucmVhZCgpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgaWYgZGF0YTEgIT0gZGF0YTI6CisgICAgICAgICAgICByZXR1cm4gJ0RhdGEgZm9ya3MgZGlmZmVyJworICAgICAgICByZnAgPSBNYWNPUy5vcGVucmYodGVzdF9zdXBwb3J0LlRFU1RGTiwgJypyYicpCisgICAgICAgIGRhdGExID0gcmZwLnJlYWQoMTAwMCkKKyAgICAgICAgcmZwLmNsb3NlKCkKKyAgICAgICAgcmZwID0gTWFjT1Mub3BlbnJmKFRFU1RGTjIsICcqcmInKQorICAgICAgICBkYXRhMiA9IHJmcC5yZWFkKDEwMDApCisgICAgICAgIHJmcC5jbG9zZSgpCisgICAgICAgIGlmIGRhdGExICE9IGRhdGEyOgorICAgICAgICAgICAgcmV0dXJuICdSZXNvdXJjZSBmb3JrcyBkaWZmZXInCisgICAgICAgIHJldHVybiAnJworCisgICAgZGVmIHRlc3RfdG91Y2hlZChzZWxmKToKKyAgICAgICAgIyBUaGlzIHJlYWxseSBvbmx5IHRlc3RzIHRoYXQgbm90aGluZyB1bmZvcmVzZWVuIGhhcHBlbnMuCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnbWFjb3N0b29scy50b3VjaGVkKicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpLCBxdWlldD1UcnVlKToKKyAgICAgICAgICAgIG1hY29zdG9vbHMudG91Y2hlZCh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgaWYgc3lzLm1heGludCA8IDIqKjMyOgorICAgICAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNURk4yKQorICAgICAgICAgICAgbWFjb3N0b29scy5jb3B5KHRlc3Rfc3VwcG9ydC5URVNURk4sIFRFU1RGTjIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGFyZURhdGEoKSwgJycpCisKKyAgICBpZiBzeXMubWF4aW50IDwgMioqMzI6CisgICAgICAgIGRlZiB0ZXN0X21rYWxpYXMoc2VsZik6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKFRFU1RGTjIpCisgICAgICAgICAgICBtYWNvc3Rvb2xzLm1rYWxpYXModGVzdF9zdXBwb3J0LlRFU1RGTiwgVEVTVEZOMikKKyAgICAgICAgICAgIGZzcywgXywgXyA9IENhcmJvbi5GaWxlLlJlc29sdmVBbGlhc0ZpbGUoVEVTVEZOMiwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnNzLmFzX3BhdGhuYW1lKCksIG9zLnBhdGgucmVhbHBhdGgodGVzdF9zdXBwb3J0LlRFU1RGTikpCisKKyAgICAgICAgZGVmIHRlc3RfbWthbGlhc19yZWxhdGl2ZShzZWxmKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoVEVTVEZOMikKKyAgICAgICAgICAgICMgSWYgdGhlIGRpcmVjdG9yeSBkb2Vzbid0IGV4aXN0LCB0aGVuIGNoYW5jZXMgYXJlIHRoaXMgaXMgYSBuZXcKKyAgICAgICAgICAgICMgaW5zdGFsbCBvZiBQeXRob24gc28gZG9uJ3QgY3JlYXRlIGl0IHNpbmNlIHRoZSB1c2VyIG1pZ2h0IGVuZCB1cAorICAgICAgICAgICAgIyBydW5uaW5nIGBgc3VkbyBtYWtlIGluc3RhbGxgYCBhbmQgY3JlYXRpbmcgdGhlIGRpcmVjdG9yeSBoZXJlIHdvbid0CisgICAgICAgICAgICAjIGxlYXZlIGl0IHdpdGggdGhlIHByb3BlciBwZXJtaXNzaW9ucy4KKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzeXMucHJlZml4KToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG1hY29zdG9vbHMubWthbGlhcyh0ZXN0X3N1cHBvcnQuVEVTVEZOLCBURVNURk4yLCBzeXMucHJlZml4KQorICAgICAgICAgICAgZnNzLCBfLCBfID0gQ2FyYm9uLkZpbGUuUmVzb2x2ZUFsaWFzRmlsZShURVNURk4yLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmc3MuYXNfcGF0aG5hbWUoKSwgb3MucGF0aC5yZWFscGF0aCh0ZXN0X3N1cHBvcnQuVEVTVEZOKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgIyBTa2lwIG9uIHdpZGUgdW5pY29kZQorICAgIGlmIGxlbih1J1wwJy5lbmNvZGUoJ3VuaWNvZGUtaW50ZXJuYWwnKSkgPT0gNDoKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoInRlc3RfbWFjb3N0b29scyBpcyBicm9rZW4gaW4gVVNDNCIpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0TWFjb3N0b29scykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNvc3Rvb2xzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY29zdG9vbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MThkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNvc3Rvb2xzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNvc3Rvb2xzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY29zdG9vbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MThkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNvc3Rvb2xzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNwYXRoLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjcGF0aC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg2YzUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjcGF0aC5weQpAQCAtMCwwICsxLDU3IEBACitpbXBvcnQgbWFjcGF0aAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQsIHRlc3RfZ2VuZXJpY3BhdGgKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIE1hY1BhdGhUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hYnNwYXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hY3BhdGguYWJzcGF0aCgieHg6eXkiKSwgInh4Onl5IikKKworICAgIGRlZiB0ZXN0X2lzYWJzKHNlbGYpOgorICAgICAgICBpc2FicyA9IG1hY3BhdGguaXNhYnMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzYWJzKCJ4eDp5eSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNhYnMoInh4Onl5OiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNhYnMoInh4OiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzYWJzKCJmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2FicygiOmZvbyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzYWJzKCI6Zm9vOmJhciIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzYWJzKCI6Zm9vOmJhcjoiKSkKKworICAgIGRlZiB0ZXN0X3NwbGl0KHNlbGYpOgorICAgICAgICBzcGxpdCA9IG1hY3BhdGguc3BsaXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdCgiZm9vOmJhciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2ZvbzonLCAnYmFyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXQoImNvbmt5Om1vdW50cG9pbnQ6Zm9vOmJhciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2Nvbmt5Om1vdW50cG9pbnQ6Zm9vJywgJ2JhcicpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXQoIjoiKSwgKCcnLCAnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXQoIjpjb25reTptb3VudHBvaW50OiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJzpjb25reTptb3VudHBvaW50JywgJycpKQorCisgICAgZGVmIHRlc3Rfc3BsaXRleHQoc2VsZik6CisgICAgICAgIHNwbGl0ZXh0ID0gbWFjcGF0aC5zcGxpdGV4dAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0ZXh0KCI6Zm9vLmV4dCIpLCAoJzpmb28nLCAnLmV4dCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0ZXh0KCJmb286Zm9vLmV4dCIpLCAoJ2Zvbzpmb28nLCAnLmV4dCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0ZXh0KCIuZXh0IiksICgnLmV4dCcsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGV4dCgiZm9vLmV4dDpmb28iKSwgKCdmb28uZXh0OmZvbycsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGV4dCgiOmZvby5leHQ6IiksICgnOmZvby5leHQ6JywgJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0ZXh0KCIiKSwgKCcnLCAnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRleHQoImZvby5iYXIuZXh0IiksICgnZm9vLmJhcicsICcuZXh0JykpCisKKyAgICBkZWYgdGVzdF9ub3JtcGF0aChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA1ODI3OiBNYWtlIHN1cmUgbm9ybXBhdGggcHJlc2VydmVzIHVuaWNvZGUKKyAgICAgICAgZm9yIHBhdGggaW4gKHUnJywgdScuJywgdScvJywgdSdcXCcsIHUnOicsIHUnLy8vZm9vLy4vL2Jhci8vJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobWFjcGF0aC5ub3JtcGF0aChwYXRoKSwgdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9ybXBhdGgoKSByZXR1cm5lZCBzdHIgaW5zdGVhZCBvZiB1bmljb2RlJykKKworY2xhc3MgTWFjQ29tbW9uVGVzdCh0ZXN0X2dlbmVyaWNwYXRoLkNvbW1vblRlc3QpOgorICAgIHBhdGhtb2R1bGUgPSBtYWNwYXRoCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTWFjUGF0aFRlc3RDYXNlLCBNYWNDb21tb25UZXN0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY3BhdGgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjcGF0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4ZTZhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY3BhdGgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY3BhdGgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjcGF0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4ZTZhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY3BhdGgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21haWxib3gucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWlsYm94LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOGUzYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWlsYm94LnB5CkBAIC0wLDAgKzEsMjEyMiBAQAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHN0YXQKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBlbWFpbAoraW1wb3J0IGVtYWlsLm1lc3NhZ2UKK2ltcG9ydCByZQoraW1wb3J0IHNodXRpbAoraW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgdGVtcGZpbGUKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBtYWlsYm94CitpbXBvcnQgZ2xvYgordHJ5OgorICAgIGltcG9ydCBmY250bAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKKworIyBTaWxlbmNlIFB5M2sgd2FybmluZworcmZjODIyID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3JmYzgyMicsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworY2xhc3MgVGVzdEJhc2U6CisKKyAgICBkZWYgX2NoZWNrX3NhbXBsZShzZWxmLCBtc2cpOgorICAgICAgICAjIEluc3BlY3QgYSBtYWlsYm94Lk1lc3NhZ2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNhbXBsZSBtZXNzYWdlCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2csIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZywgbWFpbGJveC5NZXNzYWdlKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBfc2FtcGxlX2hlYWRlcnMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHZhbHVlLCBtc2cuZ2V0X2FsbChrZXkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIGxlbihfc2FtcGxlX3BheWxvYWRzKSkKKyAgICAgICAgZm9yIGksIHBheWxvYWQgaW4gZW51bWVyYXRlKF9zYW1wbGVfcGF5bG9hZHMpOgorICAgICAgICAgICAgcGFydCA9IG1zZy5nZXRfcGF5bG9hZChpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBhcnQsIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShwYXJ0LCBtYWlsYm94Lk1lc3NhZ2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnQuZ2V0X3BheWxvYWQoKSwgcGF5bG9hZCkKKworICAgIGRlZiBfZGVsZXRlX3JlY3Vyc2l2ZWx5KHNlbGYsIHRhcmdldCk6CisgICAgICAgICMgRGVsZXRlIGEgZmlsZSBvciBkZWxldGUgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkKKyAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih0YXJnZXQpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZSh0YXJnZXQpCisgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHModGFyZ2V0KToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGFyZ2V0KQorCisKK2NsYXNzIFRlc3RNYWlsYm94KFRlc3RCYXNlKToKKworICAgIF9mYWN0b3J5ID0gTm9uZSAgICAgIyBPdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcmV1c2UgdGVzdHMKKyAgICBfdGVtcGxhdGUgPSAnRnJvbTogZm9vXG5cbiVzXG4nCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3BhdGggPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuX2RlbGV0ZV9yZWN1cnNpdmVseShzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisgICAgICAgIHNlbGYuX2RlbGV0ZV9yZWN1cnNpdmVseShzZWxmLl9wYXRoKQorCisgICAgZGVmIHRlc3RfYWRkKHNlbGYpOgorICAgICAgICAjIEFkZCBjb3BpZXMgb2YgYSBzYW1wbGUgbWVzc2FnZQorICAgICAgICBrZXlzID0gW10KKyAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAxKQorICAgICAgICBrZXlzLmFwcGVuZChzZWxmLl9ib3guYWRkKG1haWxib3guTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMikKKyAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKF9zYW1wbGVfbWVzc2FnZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAzKQorICAgICAgICBrZXlzLmFwcGVuZChzZWxmLl9ib3guYWRkKFN0cmluZ0lPLlN0cmluZ0lPKF9zYW1wbGVfbWVzc2FnZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCA0KQorICAgICAgICBrZXlzLmFwcGVuZChzZWxmLl9ib3guYWRkKF9zYW1wbGVfbWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5c1swXSksIHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgZm9yIGkgaW4gKDEsIDIsIDMsIDQpOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKHNlbGYuX2JveFtrZXlzW2ldXSkKKworICAgIGRlZiB0ZXN0X2FkZF9maWxlKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoJ3crJykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICBrZXkgPSBzZWxmLl9ib3guYWRkKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5KS5zcGxpdCgnXG4nKSwKKyAgICAgICAgICAgIF9zYW1wbGVfbWVzc2FnZS5zcGxpdCgnXG4nKSkKKworICAgIGRlZiB0ZXN0X2FkZF9TdHJpbmdJTyhzZWxmKToKKyAgICAgICAga2V5ID0gc2VsZi5fYm94LmFkZChTdHJpbmdJTy5TdHJpbmdJTyhzZWxmLl90ZW1wbGF0ZSAlICIwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5KSwgc2VsZi5fdGVtcGxhdGUgJSAiMCIpCisKKyAgICBkZWYgdGVzdF9yZW1vdmUoc2VsZik6CisgICAgICAgICMgUmVtb3ZlIG1lc3NhZ2VzIHVzaW5nIHJlbW92ZSgpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVtb3ZlX29yX2RlbGl0ZW0oc2VsZi5fYm94LnJlbW92ZSkKKworICAgIGRlZiB0ZXN0X2RlbGl0ZW0oc2VsZik6CisgICAgICAgICMgUmVtb3ZlIG1lc3NhZ2VzIHVzaW5nIF9fZGVsaXRlbV9fKCkKKyAgICAgICAgc2VsZi5fdGVzdF9yZW1vdmVfb3JfZGVsaXRlbShzZWxmLl9ib3guX19kZWxpdGVtX18pCisKKyAgICBkZWYgX3Rlc3RfcmVtb3ZlX29yX2RlbGl0ZW0oc2VsZiwgbWV0aG9kKToKKyAgICAgICAgIyAoVXNlZCBieSB0ZXN0X3JlbW92ZSgpIGFuZCB0ZXN0X2RlbGl0ZW0oKS4pCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAyKQorICAgICAgICBtZXRob2Qoa2V5MCkKKyAgICAgICAgbCA9IGxlbihzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94W2tleTBdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBtZXRob2Qoa2V5MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSksIHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAyKQorICAgICAgICBtZXRob2Qoa2V5MikKKyAgICAgICAgbCA9IGxlbihzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94W2tleTJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBtZXRob2Qoa2V5MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSksIHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgbWV0aG9kKGtleTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFtrZXkxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogbWV0aG9kKGtleTEpKQorCisgICAgZGVmIHRlc3RfZGlzY2FyZChzZWxmLCByZXBldGl0aW9ucz0xMCk6CisgICAgICAgICMgRGlzY2FyZCBtZXNzYWdlcworICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMikKKyAgICAgICAgc2VsZi5fYm94LmRpc2NhcmQoa2V5MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94W2tleTBdKQorICAgICAgICBzZWxmLl9ib3guZGlzY2FyZChrZXkwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5MF0pCisKKyAgICBkZWYgdGVzdF9nZXQoc2VsZik6CisgICAgICAgICMgUmV0cmlldmUgbWVzc2FnZXMgdXNpbmcgZ2V0KCkKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBtc2cgPSBzZWxmLl9ib3guZ2V0KGtleTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWydmcm9tJ10sICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgpLCAnMFxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLl9ib3guZ2V0KCdmb28nKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLl9ib3guZ2V0KCdmb28nLCBGYWxzZSkpCisgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCwgZmFjdG9yeT1yZmM4MjIuTWVzc2FnZSkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICBtc2cgPSBzZWxmLl9ib3guZ2V0KGtleTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWydmcm9tJ10sICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5mcC5yZWFkKCksICcxJyArIG9zLmxpbmVzZXApCisgICAgICAgIG1zZy5mcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9nZXRpdGVtKHNlbGYpOgorICAgICAgICAjIFJldHJpZXZlIG1lc3NhZ2UgdXNpbmcgX19nZXRpdGVtX18oKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIG1zZyA9IHNlbGYuX2JveFtrZXkwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1snZnJvbSddLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoKSwgJzBcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFsnZm9vJ10pCisgICAgICAgIHNlbGYuX2JveC5kaXNjYXJkKGtleTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFtrZXkwXSkKKworICAgIGRlZiB0ZXN0X2dldF9tZXNzYWdlKHNlbGYpOgorICAgICAgICAjIEdldCBNZXNzYWdlIHJlcHJlc2VudGF0aW9ucyBvZiBtZXNzYWdlcworICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnMCA9IHNlbGYuX2JveC5nZXRfbWVzc2FnZShrZXkwKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnMCwgbWFpbGJveC5NZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzBbJ2Zyb20nXSwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMC5nZXRfcGF5bG9hZCgpLCAnMFxuJykKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKHNlbGYuX2JveC5nZXRfbWVzc2FnZShrZXkxKSkKKworICAgIGRlZiB0ZXN0X2dldF9zdHJpbmcoc2VsZik6CisgICAgICAgICMgR2V0IHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgbWVzc2FnZXMKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCksIHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSwgX3NhbXBsZV9tZXNzYWdlKQorCisgICAgZGVmIHRlc3RfZ2V0X2ZpbGUoc2VsZik6CisgICAgICAgICMgR2V0IGZpbGUgcmVwcmVzZW50YXRpb25zIG9mIG1lc3NhZ2VzCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBtc2cwID0gc2VsZi5fYm94LmdldF9maWxlKGtleTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMC5yZWFkKCkucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIG1zZzEgPSBzZWxmLl9ib3guZ2V0X2ZpbGUoa2V5MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cxLnJlYWQoKS5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnMC5jbG9zZSgpCisgICAgICAgIG1zZzEuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZ2V0X2ZpbGVfY2FuX2JlX2Nsb3NlZF90d2ljZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxMTcwMAorICAgICAgICBrZXkgPSBzZWxmLl9ib3guYWRkKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgZiA9IHNlbGYuX2JveC5nZXRfZmlsZShrZXkpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2l0ZXJrZXlzKHNlbGYpOgorICAgICAgICAjIEdldCBrZXlzIHVzaW5nIGl0ZXJrZXlzKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfaXRlcmF0aW9uKHNlbGYuX2JveC5pdGVya2V5cywgZG9fa2V5cz1UcnVlLCBkb192YWx1ZXM9RmFsc2UpCisKKyAgICBkZWYgdGVzdF9rZXlzKHNlbGYpOgorICAgICAgICAjIEdldCBrZXlzIHVzaW5nIGtleXMoKQorICAgICAgICBzZWxmLl9jaGVja19pdGVyYXRpb24oc2VsZi5fYm94LmtleXMsIGRvX2tleXM9VHJ1ZSwgZG9fdmFsdWVzPUZhbHNlKQorCisgICAgZGVmIHRlc3RfaXRlcnZhbHVlcyhzZWxmKToKKyAgICAgICAgIyBHZXQgdmFsdWVzIHVzaW5nIGl0ZXJ2YWx1ZXMoKQorICAgICAgICBzZWxmLl9jaGVja19pdGVyYXRpb24oc2VsZi5fYm94Lml0ZXJ2YWx1ZXMsIGRvX2tleXM9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb192YWx1ZXM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X2l0ZXIoc2VsZik6CisgICAgICAgICMgR2V0IHZhbHVlcyB1c2luZyBfX2l0ZXJfXygpCisgICAgICAgIHNlbGYuX2NoZWNrX2l0ZXJhdGlvbihzZWxmLl9ib3guX19pdGVyX18sIGRvX2tleXM9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb192YWx1ZXM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgIyBHZXQgdmFsdWVzIHVzaW5nIHZhbHVlcygpCisgICAgICAgIHNlbGYuX2NoZWNrX2l0ZXJhdGlvbihzZWxmLl9ib3gudmFsdWVzLCBkb19rZXlzPUZhbHNlLCBkb192YWx1ZXM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X2l0ZXJpdGVtcyhzZWxmKToKKyAgICAgICAgIyBHZXQga2V5cyBhbmQgdmFsdWVzIHVzaW5nIGl0ZXJpdGVtcygpCisgICAgICAgIHNlbGYuX2NoZWNrX2l0ZXJhdGlvbihzZWxmLl9ib3guaXRlcml0ZW1zLCBkb19rZXlzPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb192YWx1ZXM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X2l0ZW1zKHNlbGYpOgorICAgICAgICAjIEdldCBrZXlzIGFuZCB2YWx1ZXMgdXNpbmcgaXRlbXMoKQorICAgICAgICBzZWxmLl9jaGVja19pdGVyYXRpb24oc2VsZi5fYm94Lml0ZW1zLCBkb19rZXlzPVRydWUsIGRvX3ZhbHVlcz1UcnVlKQorCisgICAgZGVmIF9jaGVja19pdGVyYXRpb24oc2VsZiwgbWV0aG9kLCBkb19rZXlzLCBkb192YWx1ZXMsIHJlcGV0aXRpb25zPTEwKToKKyAgICAgICAgZm9yIHZhbHVlIGluIG1ldGhvZCgpOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJOb3QgZW1wdHkiKQorICAgICAgICBrZXlzLCB2YWx1ZXMgPSBbXSwgW10KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHJlcGV0aXRpb25zKToKKyAgICAgICAgICAgIGtleXMuYXBwZW5kKHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSBpKSkKKyAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoc2VsZi5fdGVtcGxhdGUgJSBpKQorICAgICAgICBpZiBkb19rZXlzIGFuZCBub3QgZG9fdmFsdWVzOgorICAgICAgICAgICAgcmV0dXJuZWRfa2V5cyA9IGxpc3QobWV0aG9kKCkpCisgICAgICAgIGVsaWYgZG9fdmFsdWVzIGFuZCBub3QgZG9fa2V5czoKKyAgICAgICAgICAgIHJldHVybmVkX3ZhbHVlcyA9IGxpc3QobWV0aG9kKCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm5lZF9rZXlzLCByZXR1cm5lZF92YWx1ZXMgPSBbXSwgW10KKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG1ldGhvZCgpOgorICAgICAgICAgICAgICAgIHJldHVybmVkX2tleXMuYXBwZW5kKGtleSkKKyAgICAgICAgICAgICAgICByZXR1cm5lZF92YWx1ZXMuYXBwZW5kKHZhbHVlKQorICAgICAgICBpZiBkb19rZXlzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oa2V5cyksIGxlbihyZXR1cm5lZF9rZXlzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGtleXMpLCBzZXQocmV0dXJuZWRfa2V5cykpCisgICAgICAgIGlmIGRvX3ZhbHVlczoKKyAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICAgICAgZm9yIHZhbHVlIGluIHJldHVybmVkX3ZhbHVlczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlWydmcm9tJ10sICdmb28nKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQodmFsdWUuZ2V0X3BheWxvYWQoKSkgPCByZXBldGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlLmdldF9wYXlsb2FkKCksIHJlcGV0aXRpb25zKSkKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCBjb3VudCkKKworICAgIGRlZiB0ZXN0X2hhc19rZXkoc2VsZik6CisgICAgICAgICMgQ2hlY2sgZXhpc3RlbmNlIG9mIGtleXMgdXNpbmcgaGFzX2tleSgpCisgICAgICAgIHNlbGYuX3Rlc3RfaGFzX2tleV9vcl9jb250YWlucyhzZWxmLl9ib3guaGFzX2tleSkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgorICAgICAgICAjIENoZWNrIGV4aXN0ZW5jZSBvZiBrZXlzIHVzaW5nIF9fY29udGFpbnNfXygpCisgICAgICAgIHNlbGYuX3Rlc3RfaGFzX2tleV9vcl9jb250YWlucyhzZWxmLl9ib3guX19jb250YWluc19fKQorCisgICAgZGVmIF90ZXN0X2hhc19rZXlfb3JfY29udGFpbnMoc2VsZiwgbWV0aG9kKToKKyAgICAgICAgIyAoVXNlZCBieSB0ZXN0X2hhc19rZXkoKSBhbmQgdGVzdF9jb250YWlucygpLikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtZXRob2QoJ2ZvbycpKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXRob2Qoa2V5MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWV0aG9kKCdmb28nKSkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWV0aG9kKGtleTEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWV0aG9kKGtleTApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1ldGhvZCgnZm9vJykpCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtZXRob2Qoa2V5MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXRob2Qoa2V5MSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWV0aG9kKCdmb28nKSkKKyAgICAgICAgc2VsZi5fYm94LnJlbW92ZShrZXkxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1ldGhvZChrZXkxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtZXRob2Qoa2V5MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWV0aG9kKCdmb28nKSkKKworICAgIGRlZiB0ZXN0X2xlbihzZWxmLCByZXBldGl0aW9ucz0xMCk6CisgICAgICAgICMgR2V0IG1lc3NhZ2UgY291bnQKKyAgICAgICAga2V5cyA9IFtdCisgICAgICAgIGZvciBpIGluIHhyYW5nZShyZXBldGl0aW9ucyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCBpKQorICAgICAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIGkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgIGkgKyAxKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UocmVwZXRpdGlvbnMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgcmVwZXRpdGlvbnMgLSBpKQorICAgICAgICAgICAgc2VsZi5fYm94LnJlbW92ZShrZXlzW2ldKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgcmVwZXRpdGlvbnMgLSBpIC0gMSkKKworICAgIGRlZiB0ZXN0X3NldF9pdGVtKHNlbGYpOgorICAgICAgICAjIE1vZGlmeSBtZXNzYWdlcyB1c2luZyBfX3NldGl0ZW1fXygpCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgJ29yaWdpbmFsIDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTApLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgJ29yaWdpbmFsIDAnKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAxJykKKyAgICAgICAgc2VsZi5fYm94W2tleTBdID0gc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAwJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTApLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMCcpCisgICAgICAgIHNlbGYuX2JveFtrZXkxXSA9IHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDEnKQorICAgICAgICBzZWxmLl9ib3hba2V5MF0gPSBfc2FtcGxlX21lc3NhZ2UKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKHNlbGYuX2JveFtrZXkwXSkKKyAgICAgICAgc2VsZi5fYm94W2tleTFdID0gc2VsZi5fYm94W2tleTBdCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5MV0pCisgICAgICAgIHNlbGYuX2JveFtrZXkwXSA9IHNlbGYuX3RlbXBsYXRlICUgJ29yaWdpbmFsIDAnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMCcpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5MV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHNlbGYuX2JveC5fX3NldGl0ZW1fXygnZm9vJywgJ2JhcicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hbJ2ZvbyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAyKQorCisgICAgZGVmIHRlc3RfY2xlYXIoc2VsZiwgaXRlcmF0aW9ucz0xMCk6CisgICAgICAgICMgUmVtb3ZlIGFsbCBtZXNzYWdlcyB1c2luZyBjbGVhcigpCisgICAgICAgIGtleXMgPSBbXQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoaXRlcmF0aW9ucyk6CisgICAgICAgICAgICBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgaSkKKyAgICAgICAgZm9yIGksIGtleSBpbiBlbnVtZXJhdGUoa2V5cyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSksIHNlbGYuX3RlbXBsYXRlICUgaSkKKyAgICAgICAgc2VsZi5fYm94LmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMCkKKyAgICAgICAgZm9yIGksIGtleSBpbiBlbnVtZXJhdGUoa2V5cyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkpKQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICAjIEdldCBhbmQgcmVtb3ZlIGEgbWVzc2FnZSB1c2luZyBwb3AoKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oa2V5MCwgc2VsZi5fYm94KQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oa2V5MSwgc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5wb3Aoa2V5MCkuZ2V0X3BheWxvYWQoKSwgJzBcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oa2V5MCwgc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydEluKGtleTEsIHNlbGYuX2JveCkKKyAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAyKQorICAgICAgICBzZWxmLmFzc2VydEluKGtleTIsIHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3gucG9wKGtleTIpLmdldF9wYXlsb2FkKCksICcyXG4nKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGtleTIsIHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihrZXkxLCBzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LnBvcChrZXkxKS5nZXRfcGF5bG9hZCgpLCAnMVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihrZXkxLCBzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIDApCisKKyAgICBkZWYgdGVzdF9wb3BpdGVtKHNlbGYsIGl0ZXJhdGlvbnM9MTApOgorICAgICAgICAjIEdldCBhbmQgcmVtb3ZlIGFuIGFyYml0cmFyeSAoa2V5LCBtZXNzYWdlKSB1c2luZyBwb3BpdGVtKCkKKyAgICAgICAga2V5cyA9IFtdCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMCk6CisgICAgICAgICAgICBrZXlzLmFwcGVuZChzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgaSkpCisgICAgICAgIHNlZW4gPSBbXQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTApOgorICAgICAgICAgICAga2V5LCBtc2cgPSBzZWxmLl9ib3gucG9waXRlbSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGtleSwga2V5cykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oa2V5LCBzZWVuKQorICAgICAgICAgICAgc2Vlbi5hcHBlbmQoa2V5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQobXNnLmdldF9wYXlsb2FkKCkpLCBrZXlzLmluZGV4KGtleSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIDApCisgICAgICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFtrZXldKQorCisgICAgZGVmIHRlc3RfdXBkYXRlKHNlbGYpOgorICAgICAgICAjIE1vZGlmeSBtdWx0aXBsZSBtZXNzYWdlcyB1c2luZyB1cGRhdGUoKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJykKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMScpCisgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgJ29yaWdpbmFsIDInKQorICAgICAgICBzZWxmLl9ib3gudXBkYXRlKHtrZXkwOiBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkyOiBfc2FtcGxlX21lc3NhZ2V9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTApLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMScpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5Ml0pCisgICAgICAgIHNlbGYuX2JveC51cGRhdGUoWyhrZXkyLCBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDInKSwKKyAgICAgICAgICAgICAgICAgICAgKGtleTEsIHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMScpLAorICAgICAgICAgICAgICAgICAgICAoa2V5MCwgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHNlbGYuX2JveC51cGRhdGUoeydmb28nOiAnYmFyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTA6IHNlbGYuX3RlbXBsYXRlICUgImNoYW5nZWQgMCJ9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICJjaGFuZ2VkIDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgImNoYW5nZWQgMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAiY2hhbmdlZCAyIikKKworICAgIGRlZiB0ZXN0X2ZsdXNoKHNlbGYpOgorICAgICAgICAjIFdyaXRlIGNoYW5nZXMgdG8gZGlzaworICAgICAgICBzZWxmLl90ZXN0X2ZsdXNoX29yX2Nsb3NlKHNlbGYuX2JveC5mbHVzaCwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3BvcGl0ZW1fYW5kX2ZsdXNoX3R3aWNlKHNlbGYpOgorICAgICAgICAjIFNlZSAjMTUwMzYuCisgICAgICAgIHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgc2VsZi5fYm94LmZsdXNoKCkKKworICAgICAgICBzZWxmLl9ib3gucG9waXRlbSgpCisgICAgICAgIHNlbGYuX2JveC5mbHVzaCgpCisgICAgICAgIHNlbGYuX2JveC5wb3BpdGVtKCkKKyAgICAgICAgc2VsZi5fYm94LmZsdXNoKCkKKworICAgIGRlZiB0ZXN0X2xvY2tfdW5sb2NrKHNlbGYpOgorICAgICAgICAjIExvY2sgYW5kIHVubG9jayB0aGUgbWFpbGJveAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKHNlbGYuX2dldF9sb2NrX3BhdGgoKSkpCisgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNlbGYuX2dldF9sb2NrX3BhdGgoKSkpCisgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKHNlbGYuX2dldF9sb2NrX3BhdGgoKSkpCisKKyAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKKyAgICAgICAgIyBDbG9zZSBtYWlsYm94IGFuZCBmbHVzaCBjaGFuZ2VzIHRvIGRpc2sKKyAgICAgICAgc2VsZi5fdGVzdF9mbHVzaF9vcl9jbG9zZShzZWxmLl9ib3guY2xvc2UsIEZhbHNlKQorCisgICAgZGVmIF90ZXN0X2ZsdXNoX29yX2Nsb3NlKHNlbGYsIG1ldGhvZCwgc2hvdWxkX2NhbGxfY2xvc2UpOgorICAgICAgICBjb250ZW50cyA9IFtzZWxmLl90ZW1wbGF0ZSAlIGkgZm9yIGkgaW4geHJhbmdlKDMpXQorICAgICAgICBzZWxmLl9ib3guYWRkKGNvbnRlbnRzWzBdKQorICAgICAgICBzZWxmLl9ib3guYWRkKGNvbnRlbnRzWzFdKQorICAgICAgICBzZWxmLl9ib3guYWRkKGNvbnRlbnRzWzJdKQorICAgICAgICBvbGRib3ggPSBzZWxmLl9ib3gKKyAgICAgICAgbWV0aG9kKCkKKyAgICAgICAgaWYgc2hvdWxkX2NhbGxfY2xvc2U6CisgICAgICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgpCisgICAgICAgIGtleXMgPSBzZWxmLl9ib3gua2V5cygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGtleXMpLCAzKQorICAgICAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSksIGNvbnRlbnRzKQorICAgICAgICBvbGRib3guY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZHVtcF9tZXNzYWdlKHNlbGYpOgorICAgICAgICAjIFdyaXRlIG1lc3NhZ2UgcmVwcmVzZW50YXRpb25zIHRvIGRpc2sKKyAgICAgICAgZm9yIGlucHV0IGluIChlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKF9zYW1wbGVfbWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgX3NhbXBsZV9tZXNzYWdlLCBTdHJpbmdJTy5TdHJpbmdJTyhfc2FtcGxlX21lc3NhZ2UpKToKKyAgICAgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIHNlbGYuX2JveC5fZHVtcF9tZXNzYWdlKGlucHV0LCBvdXRwdXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2FtcGxlX21lc3NhZ2UucmVwbGFjZSgnXG4nLCBvcy5saW5lc2VwKSkKKyAgICAgICAgb3V0cHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTogc2VsZi5fYm94Ll9kdW1wX21lc3NhZ2UoTm9uZSwgb3V0cHV0KSkKKworICAgIGRlZiBfZ2V0X2xvY2tfcGF0aChzZWxmKToKKyAgICAgICAgIyBSZXR1cm4gdGhlIHBhdGggb2YgdGhlIGRvdCBsb2NrIGZpbGUuIE1heSBiZSBvdmVycmlkZGVuLgorICAgICAgICByZXR1cm4gc2VsZi5fcGF0aCArICcubG9jaycKKworCitjbGFzcyBUZXN0TWFpbGJveFN1cGVyY2xhc3MoVGVzdEJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X25vdGltcGxlbWVudGVkKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBhbGwgTWFpbGJveCBtZXRob2RzIHJhaXNlIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uLgorICAgICAgICBib3ggPSBtYWlsYm94Lk1haWxib3goJ3BhdGgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5hZGQoJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5yZW1vdmUoJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5fX2RlbGl0ZW1fXygnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94LmRpc2NhcmQoJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5fX3NldGl0ZW1fXygnJywgJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5pdGVya2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94Lml0ZXJ2YWx1ZXMoKS5uZXh0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94Ll9faXRlcl9fKCkubmV4dCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC52YWx1ZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guaXRlcml0ZW1zKCkubmV4dCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5pdGVtcygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5nZXQoJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5fX2dldGl0ZW1fXygnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94LmdldF9tZXNzYWdlKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guZ2V0X3N0cmluZygnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94LmdldF9maWxlKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guaGFzX2tleSgnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94Ll9fY29udGFpbnNfXygnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94Ll9fbGVuX18oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guY2xlYXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3gucG9wKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3gucG9waXRlbSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC51cGRhdGUoKCgnJywgJycpLCkpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5mbHVzaCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5sb2NrKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94LnVubG9jaygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5jbG9zZSgpKQorCisKK2NsYXNzIFRlc3RNYWlsZGlyKFRlc3RNYWlsYm94LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBfZmFjdG9yeSA9IGxhbWJkYSBzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmU6IG1haWxib3guTWFpbGRpcihwYXRoLCBmYWN0b3J5KQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBUZXN0TWFpbGJveC5zZXRVcChzZWxmKQorICAgICAgICBpZiBvcy5uYW1lIGluICgnbnQnLCAnb3MyJykgb3Igc3lzLnBsYXRmb3JtID09ICdjeWd3aW4nOgorICAgICAgICAgICAgc2VsZi5fYm94LmNvbG9uID0gJyEnCisKKyAgICBkZWYgdGVzdF9hZGRfTU0oc2VsZik6CisgICAgICAgICMgQWRkIGEgTWFpbGRpck1lc3NhZ2UgaW5zdGFuY2UKKyAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIG1zZy5zZXRfc3ViZGlyKCdjdXInKQorICAgICAgICBtc2cuc2V0X2luZm8oJ2ZvbycpCisgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQobXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICdjdXInLCAnJXMlc2ZvbycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXksIHNlbGYuX2JveC5jb2xvbikpKSkKKworICAgIGRlZiB0ZXN0X2dldF9NTShzZWxmKToKKyAgICAgICAgIyBHZXQgYSBNYWlsZGlyTWVzc2FnZSBpbnN0YW5jZQorICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgbXNnLnNldF9zdWJkaXIoJ2N1cicpCisgICAgICAgIG1zZy5zZXRfZmxhZ3MoJ1JGJykKKyAgICAgICAga2V5ID0gc2VsZi5fYm94LmFkZChtc2cpCisgICAgICAgIG1zZ19yZXR1cm5lZCA9IHNlbGYuX2JveC5nZXRfbWVzc2FnZShrZXkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2dfcmV0dXJuZWQsIG1haWxib3guTWFpbGRpck1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnX3JldHVybmVkLmdldF9zdWJkaXIoKSwgJ2N1cicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnX3JldHVybmVkLmdldF9mbGFncygpLCAnRlInKQorCisgICAgZGVmIHRlc3Rfc2V0X01NKHNlbGYpOgorICAgICAgICAjIFNldCB3aXRoIGEgTWFpbGRpck1lc3NhZ2UgaW5zdGFuY2UKKyAgICAgICAgbXNnMCA9IG1haWxib3guTWFpbGRpck1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBtc2cwLnNldF9mbGFncygnVFAnKQorICAgICAgICBrZXkgPSBzZWxmLl9ib3guYWRkKG1zZzApCisgICAgICAgIG1zZ19yZXR1cm5lZCA9IHNlbGYuX2JveC5nZXRfbWVzc2FnZShrZXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnX3JldHVybmVkLmdldF9zdWJkaXIoKSwgJ25ldycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnX3JldHVybmVkLmdldF9mbGFncygpLCAnUFQnKQorICAgICAgICBtc2cxID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIHNlbGYuX2JveFtrZXldID0gbXNnMQorICAgICAgICBtc2dfcmV0dXJuZWQgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ19yZXR1cm5lZC5nZXRfc3ViZGlyKCksICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ19yZXR1cm5lZC5nZXRfZmxhZ3MoKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnX3JldHVybmVkLmdldF9wYXlsb2FkKCksICcxXG4nKQorICAgICAgICBtc2cyID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDIpCisgICAgICAgIG1zZzIuc2V0X2luZm8oJzIsUycpCisgICAgICAgIHNlbGYuX2JveFtrZXldID0gbXNnMgorICAgICAgICBzZWxmLl9ib3hba2V5XSA9IHNlbGYuX3RlbXBsYXRlICUgMworICAgICAgICBtc2dfcmV0dXJuZWQgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ19yZXR1cm5lZC5nZXRfc3ViZGlyKCksICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ19yZXR1cm5lZC5nZXRfZmxhZ3MoKSwgJ1MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ19yZXR1cm5lZC5nZXRfcGF5bG9hZCgpLCAnM1xuJykKKworICAgIGRlZiB0ZXN0X2NvbnNpc3RlbnRfZmFjdG9yeShzZWxmKToKKyAgICAgICAgIyBBZGQgYSBtZXNzYWdlLgorICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgbXNnLnNldF9zdWJkaXIoJ2N1cicpCisgICAgICAgIG1zZy5zZXRfZmxhZ3MoJ1JGJykKKyAgICAgICAga2V5ID0gc2VsZi5fYm94LmFkZChtc2cpCisKKyAgICAgICAgIyBDcmVhdGUgbmV3IG1haWxib3ggd2l0aAorICAgICAgICBjbGFzcyBGYWtlTWVzc2FnZShtYWlsYm94Lk1haWxkaXJNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYm94ID0gbWFpbGJveC5NYWlsZGlyKHNlbGYuX3BhdGgsIGZhY3Rvcnk9RmFrZU1lc3NhZ2UpCisgICAgICAgIGJveC5jb2xvbiA9IHNlbGYuX2JveC5jb2xvbgorICAgICAgICBtc2cyID0gYm94LmdldF9tZXNzYWdlKGtleSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZzIsIEZha2VNZXNzYWdlKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZV9uZXcoc2VsZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSBhIG5vbi1leGlzdGVudCBtYWlsYm94CisgICAgICAgIHNlbGYudGVhckRvd24oKQorICAgICAgICBzZWxmLl9ib3ggPSBtYWlsYm94Lk1haWxkaXIoc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5fY2hlY2tfYmFzaWNzKGZhY3Rvcnk9cmZjODIyLk1lc3NhZ2UpCisgICAgICAgIHNlbGYuX2RlbGV0ZV9yZWN1cnNpdmVseShzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgsIGZhY3Rvcnk9Tm9uZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfYmFzaWNzKCkKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfZXhpc3Rpbmcoc2VsZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSBhbiBleGlzdGluZyBtYWlsYm94CisgICAgICAgIHNlbGYudGVhckRvd24oKQorICAgICAgICBmb3Igc3ViZGlyIGluICcnLCAndG1wJywgJ25ldycsICdjdXInOgorICAgICAgICAgICAgb3MubWtkaXIob3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3ViZGlyKSkpCisgICAgICAgIHNlbGYuX2JveCA9IG1haWxib3guTWFpbGRpcihzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLl9jaGVja19iYXNpY3MoZmFjdG9yeT1yZmM4MjIuTWVzc2FnZSkKKyAgICAgICAgc2VsZi5fYm94ID0gbWFpbGJveC5NYWlsZGlyKHNlbGYuX3BhdGgsIGZhY3Rvcnk9Tm9uZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfYmFzaWNzKCkKKworICAgIGRlZiBfY2hlY2tfYmFzaWNzKHNlbGYsIGZhY3Rvcnk9Tm9uZSk6CisgICAgICAgICMgKFVzZWQgYnkgdGVzdF9vcGVuX25ldygpIGFuZCB0ZXN0X29wZW5fZXhpc3RpbmcoKS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Ll9wYXRoLCBvcy5wYXRoLmFic3BhdGgoc2VsZi5fcGF0aCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Ll9mYWN0b3J5LCBmYWN0b3J5KQorICAgICAgICBmb3Igc3ViZGlyIGluICcnLCAndG1wJywgJ25ldycsICdjdXInOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdWJkaXIpCisgICAgICAgICAgICBtb2RlID0gb3Muc3RhdChwYXRoKVtzdGF0LlNUX01PREVdCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RhdC5TX0lTRElSKG1vZGUpLCAiTm90IGEgZGlyZWN0b3J5OiAnJXMnIiAlIHBhdGgpCisKKyAgICBkZWYgdGVzdF9saXN0X2ZvbGRlcnMoc2VsZik6CisgICAgICAgICMgTGlzdCBmb2xkZXJzCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCdvbmUnKQorICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcigndHdvJykKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ3RocmVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXQoKCdvbmUnLCAndHdvJywgJ3RocmVlJykpKQorCisgICAgZGVmIHRlc3RfZ2V0X2ZvbGRlcihzZWxmKToKKyAgICAgICAgIyBPcGVuIGZvbGRlcnMKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ2Zvby5iYXInKQorICAgICAgICBmb2xkZXIwID0gc2VsZi5fYm94LmdldF9mb2xkZXIoJ2Zvby5iYXInKQorICAgICAgICBmb2xkZXIwLmFkZChzZWxmLl90ZW1wbGF0ZSAlICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJy5mb28uYmFyJykpKQorICAgICAgICBmb2xkZXIxID0gc2VsZi5fYm94LmdldF9mb2xkZXIoJ2Zvby5iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvbGRlcjEuZ2V0X3N0cmluZyhmb2xkZXIxLmtleXMoKVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKKworICAgIGRlZiB0ZXN0X2FkZF9hbmRfcmVtb3ZlX2ZvbGRlcnMoc2VsZik6CisgICAgICAgICMgRGVsZXRlIGZvbGRlcnMKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ29uZScpCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0d28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLCBzZXQoKCdvbmUnLCAndHdvJykpKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlX2ZvbGRlcignb25lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgc2V0KCgndHdvJywpKSkKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ3RocmVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgc2V0KCgndHdvJywgJ3RocmVlJykpKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlX2ZvbGRlcigndGhyZWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLCBzZXQoKCd0d28nLCkpKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlX2ZvbGRlcigndHdvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCksIFtdKQorCisgICAgZGVmIHRlc3RfY2xlYW4oc2VsZik6CisgICAgICAgICMgUmVtb3ZlIG9sZCBmaWxlcyBmcm9tICd0bXAnCisgICAgICAgIGZvb19wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICd0bXAnLCAnZm9vJykKKyAgICAgICAgYmFyX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ3RtcCcsICdiYXInKQorICAgICAgICB3aXRoIG9wZW4oZm9vX3BhdGgsICd3JykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoIkAiKQorICAgICAgICB3aXRoIG9wZW4oYmFyX3BhdGgsICd3JykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoIkAiKQorICAgICAgICBzZWxmLl9ib3guY2xlYW4oKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZm9vX3BhdGgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoYmFyX3BhdGgpKQorICAgICAgICBmb29fc3RhdCA9IG9zLnN0YXQoZm9vX3BhdGgpCisgICAgICAgIG9zLnV0aW1lKGZvb19wYXRoLCAodGltZS50aW1lKCkgLSAxMjk2MDAgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvb19zdGF0LnN0X210aW1lKSkKKyAgICAgICAgc2VsZi5fYm94LmNsZWFuKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhmb29fcGF0aCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhiYXJfcGF0aCkpCisKKyAgICBkZWYgdGVzdF9jcmVhdGVfdG1wKHNlbGYsIHJlcGV0aXRpb25zPTEwKToKKyAgICAgICAgIyBDcmVhdGUgZmlsZXMgaW4gdG1wIGRpcmVjdG9yeQorICAgICAgICBob3N0bmFtZSA9IHNvY2tldC5nZXRob3N0bmFtZSgpCisgICAgICAgIGlmICcvJyBpbiBob3N0bmFtZToKKyAgICAgICAgICAgIGhvc3RuYW1lID0gaG9zdG5hbWUucmVwbGFjZSgnLycsIHInXDA1NycpCisgICAgICAgIGlmICc6JyBpbiBob3N0bmFtZToKKyAgICAgICAgICAgIGhvc3RuYW1lID0gaG9zdG5hbWUucmVwbGFjZSgnOicsIHInXDA3MicpCisgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCisgICAgICAgIHBhdHRlcm4gPSByZS5jb21waWxlKHIiKD9QPHRpbWU+XGQrKVwuTSg/UDxNPlxkezEsNn0pUCg/UDxQPlxkKykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiUSg/UDxRPlxkKylcLig/UDxob3N0PlteOi9dKykiKQorICAgICAgICBwcmV2aW91c19ncm91cHMgPSBOb25lCisgICAgICAgIGZvciB4IGluIHhyYW5nZShyZXBldGl0aW9ucyk6CisgICAgICAgICAgICB0bXBfZmlsZSA9IHNlbGYuX2JveC5fY3JlYXRlX3RtcCgpCisgICAgICAgICAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdCh0bXBfZmlsZS5uYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZWFkLCBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRtcCIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpbGUgaW4gd3JvbmcgbG9jYXRpb246ICclcyciICUgaGVhZCkKKyAgICAgICAgICAgIG1hdGNoID0gcGF0dGVybi5tYXRjaCh0YWlsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGNoIGlzIG5vdCBOb25lLCAiSW52YWxpZCBmaWxlIG5hbWU6ICclcyciICUgdGFpbCkKKyAgICAgICAgICAgIGdyb3VwcyA9IG1hdGNoLmdyb3VwcygpCisgICAgICAgICAgICBpZiBwcmV2aW91c19ncm91cHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoaW50KGdyb3Vwc1swXSksIGludChwcmV2aW91c19ncm91cHNbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLW1vbm90b25pYyBzZWNvbmRzOiAnJXMnIGJlZm9yZSAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2aW91c19ncm91cHNbMF0sIGdyb3Vwc1swXSkpCisgICAgICAgICAgICAgICAgaWYgaW50KGdyb3Vwc1swXSkgPT0gaW50KHByZXZpb3VzX2dyb3Vwc1swXSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGludChncm91cHNbMV0pLCBpbnQocHJldmlvdXNfZ3JvdXBzWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1tb25vdG9uaWMgbWlsbGlzZWNvbmRzOiAnJXMnIGJlZm9yZSAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmV2aW91c19ncm91cHNbMV0sIGdyb3Vwc1sxXSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludChncm91cHNbMl0pID09IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2Nlc3MgSUQgbWlzbWF0Y2g6ICclcycgc2hvdWxkIGJlICclcyciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyb3Vwc1syXSwgcGlkKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KGdyb3Vwc1szXSkgPT0gaW50KHByZXZpb3VzX2dyb3Vwc1szXSkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLXNlcXVlbnRpYWwgY291bnRlcjogJyVzJyBiZWZvcmUgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNfZ3JvdXBzWzNdLCBncm91cHNbM10pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncm91cHNbNF0gPT0gaG9zdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb3N0IG5hbWUgbWlzbWF0Y2g6ICclcycgc2hvdWxkIGJlICclcyciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdyb3Vwc1s0XSwgaG9zdG5hbWUpKQorICAgICAgICAgICAgcHJldmlvdXNfZ3JvdXBzID0gZ3JvdXBzCisgICAgICAgICAgICB0bXBfZmlsZS53cml0ZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICB0bXBfZmlsZS5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodG1wX2ZpbGUucmVhZCgpID09IF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgICAgIHRtcF9maWxlLmNsb3NlKCkKKyAgICAgICAgZmlsZV9jb3VudCA9IGxlbihvcy5saXN0ZGlyKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAidG1wIikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZV9jb3VudCA9PSByZXBldGl0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICJXcm9uZyBmaWxlIGNvdW50OiAnJXMnIHNob3VsZCBiZSAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAoZmlsZV9jb3VudCwgcmVwZXRpdGlvbnMpKQorCisgICAgZGVmIHRlc3RfcmVmcmVzaChzZWxmKToKKyAgICAgICAgIyBVcGRhdGUgdGhlIHRhYmxlIG9mIGNvbnRlbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Ll90b2MsIHt9KQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guX3RvYywge30pCisgICAgICAgIHNlbGYuX2JveC5fcmVmcmVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Ll90b2MsIHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5MTogb3MucGF0aC5qb2luKCduZXcnLCBrZXkxKX0pCisgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guX3RvYywge2tleTA6IG9zLnBhdGguam9pbignbmV3Jywga2V5MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkxOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTEpfSkKKyAgICAgICAgc2VsZi5fYm94Ll9yZWZyZXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guX3RvYywge2tleTA6IG9zLnBhdGguam9pbignbmV3Jywga2V5MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkxOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Mjogb3MucGF0aC5qb2luKCduZXcnLCBrZXkyKX0pCisKKyAgICBkZWYgdGVzdF9yZWZyZXNoX2FmdGVyX3NhZmV0eV9wZXJpb2Qoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEzMjU0OiBDYWxsIF9yZWZyZXNoIGFmdGVyIHRoZSAiZmlsZSBzeXN0ZW0gc2FmZXR5CisgICAgICAgICMgcGVyaW9kIiBvZiAyIHNlY29uZHMgaGFzIHBhc3NlZDsgX3RvYyBzaG91bGQgc3RpbGwgYmUKKyAgICAgICAgIyB1cGRhdGVkIGJlY2F1c2UgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCB0byBfcmVmcmVzaC4KKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDEpCisKKyAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5fdG9jLCB7fSkKKworICAgICAgICAjIEVtdWxhdGUgc2xlZXBpbmcuIEluc3RlYWQgb2Ygc2xlZXBpbmcgZm9yIDIgc2Vjb25kcywgdXNlIHRoZQorICAgICAgICAjIHNrZXcgZmFjdG9yIHRvIG1ha2UgX3JlZnJlc2ggdGhpbmsgdGhhdCB0aGUgZmlsZXN5c3RlbQorICAgICAgICAjIHNhZmV0eSBwZXJpb2QgaGFzIHBhc3NlZCBhbmQgcmUtcmVhZGluZyB0aGUgX3RvYyBpcyBvbmx5CisgICAgICAgICMgcmVxdWlyZWQgaWYgbXRpbWVzIGRpZmZlci4KKyAgICAgICAgc2VsZi5fYm94Ll9za2V3ZmFjdG9yID0gLTMKKworICAgICAgICBzZWxmLl9ib3guX3JlZnJlc2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChzZWxmLl9ib3guX3RvYy5rZXlzKCkpLCBzb3J0ZWQoW2tleTAsIGtleTFdKSkKKworICAgIGRlZiB0ZXN0X2xvb2t1cChzZWxmKToKKyAgICAgICAgIyBMb29rIHVwIG1lc3NhZ2Ugc3VicGF0aHMgaW4gdGhlIFRPQworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3guX2xvb2t1cCgnZm9vJykpCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guX2xvb2t1cChrZXkwKSwgb3MucGF0aC5qb2luKCduZXcnLCBrZXkwKSkKKyAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnbmV3Jywga2V5MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Ll90b2MsIHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApfSkKKyAgICAgICAgIyBCZSBzdXJlIHRoYXQgdGhlIFRPQyBpcyByZWFkIGJhY2sgZnJvbSBkaXNrIChzZWUgaXNzdWUgIzY4OTYKKyAgICAgICAgIyBhYm91dCBiYWQgbXRpbWUgYmVoYXZpb3VyIG9uIHNvbWUgc3lzdGVtcykuCisgICAgICAgIHNlbGYuX2JveC5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveC5fbG9va3VwKGtleTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5fdG9jLCB7fSkKKworICAgIGRlZiB0ZXN0X2xvY2tfdW5sb2NrKHNlbGYpOgorICAgICAgICAjIExvY2sgYW5kIHVubG9jayB0aGUgbWFpbGJveC4gRm9yIE1haWxkaXIsIHRoaXMgZG9lcyBub3RoaW5nLgorICAgICAgICBzZWxmLl9ib3gubG9jaygpCisgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQorCisgICAgZGVmIHRlc3RfZm9sZGVyIChzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBidWcgIzE1Njk3OTA6IHZlcmlmeSB0aGF0IGZvbGRlcnMgcmV0dXJuZWQgYnkgLmdldF9mb2xkZXIoKQorICAgICAgICAjIHVzZSB0aGUgc2FtZSBmYWN0b3J5IGZ1bmN0aW9uLgorICAgICAgICBkZWYgZHVtbXlfZmFjdG9yeSAocyk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgsIGZhY3Rvcnk9ZHVtbXlfZmFjdG9yeSkKKyAgICAgICAgZm9sZGVyID0gYm94LmFkZF9mb2xkZXIoJ2ZvbGRlcjEnKQorICAgICAgICBzZWxmLmFzc2VydElzKGZvbGRlci5fZmFjdG9yeSwgZHVtbXlfZmFjdG9yeSkKKworICAgICAgICBmb2xkZXIxX2FsaWFzID0gYm94LmdldF9mb2xkZXIoJ2ZvbGRlcjEnKQorICAgICAgICBzZWxmLmFzc2VydElzKGZvbGRlcjFfYWxpYXMuX2ZhY3RvcnksIGR1bW15X2ZhY3RvcnkpCisKKyAgICBkZWYgdGVzdF9kaXJlY3RvcnlfaW5fZm9sZGVyIChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgbWFpbGJveGVzIHN0aWxsIHdvcmsgaWYgdGhlcmUncyBhIHN0cmF5IGV4dHJhIGRpcmVjdG9yeQorICAgICAgICAjIGluIGEgZm9sZGVyLgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBzZWxmLl9ib3guYWRkKG1haWxib3guTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpKQorCisgICAgICAgICMgQ3JlYXRlIGEgc3RyYXkgZGlyZWN0b3J5CisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnY3VyJywgJ3N0cmF5LWRpcicpKQorCisgICAgICAgICMgQ2hlY2sgdGhhdCBsb29waW5nIHN0aWxsIHdvcmtzIHdpdGggdGhlIGRpcmVjdG9yeSBwcmVzZW50LgorICAgICAgICBmb3IgbXNnIGluIHNlbGYuX2JveDoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2ZpbGVfcGVybWlzc2lvbnMoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgbWVzc2FnZSBmaWxlcyBhcmUgY3JlYXRlZCB3aXRob3V0IGV4ZWN1dGUgcGVybWlzc2lvbnMKKyAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJzdGF0Iikgb3Igbm90IGhhc2F0dHIob3MsICJ1bWFzayIpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBvcmlnX3VtYXNrID0gb3MudW1hc2soMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAga2V5ID0gc2VsZi5fYm94LmFkZChtc2cpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bWFzayhvcmlnX3VtYXNrKQorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHNlbGYuX2JveC5fbG9va3VwKGtleSkpCisgICAgICAgIG1vZGUgPSBvcy5zdGF0KHBhdGgpLnN0X21vZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2RlICYgMDExMSwgMCkKKworICAgIGRlZiB0ZXN0X2ZvbGRlcl9maWxlX3Blcm1zKHNlbGYpOgorICAgICAgICAjIEZyb20gYnVnICMzMjI4LCB3ZSB3YW50IHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIGNyZWF0ZWQgaW5zaWRlIGEgTWFpbGRpcgorICAgICAgICAjIHN1YmZvbGRlciBpc24ndCBtYXJrZWQgYXMgZXhlY3V0YWJsZS4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJzdGF0Iikgb3Igbm90IGhhc2F0dHIob3MsICJ1bWFzayIpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgb3JpZ191bWFzayA9IG9zLnVtYXNrKDApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1YmZvbGRlciA9IHNlbGYuX2JveC5hZGRfZm9sZGVyKCdzdWJmb2xkZXInKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW1hc2sob3JpZ191bWFzaykKKworICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHN1YmZvbGRlci5fcGF0aCwgJ21haWxkaXJmb2xkZXInKQorICAgICAgICBzdCA9IG9zLnN0YXQocGF0aCkKKyAgICAgICAgcGVybXMgPSBzdC5zdF9tb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoKHBlcm1zICYgMDExMSkpICMgRXhlY3V0ZSBiaXRzIHNob3VsZCBhbGwgYmUgb2ZmLgorCisgICAgZGVmIHRlc3RfcmVyZWFkKHNlbGYpOgorICAgICAgICAjIERvIGFuIGluaXRpYWwgdW5jb25kaXRpb25hbCByZWZyZXNoCisgICAgICAgIHNlbGYuX2JveC5fcmVmcmVzaCgpCisKKyAgICAgICAgIyBQdXQgdGhlIGxhc3QgbW9kaWZpZWQgdGltZXMgbW9yZSB0aGFuIHR3byBzZWNvbmRzIGludG8gdGhlIHBhc3QKKyAgICAgICAgIyAoYmVjYXVzZSBtdGltZSBtYXkgaGF2ZSBvbmx5IGEgdHdvIHNlY29uZCBncmFudWxhcml0eSkuCisgICAgICAgIGZvciBzdWJkaXIgaW4gKCdjdXInLCAnbmV3Jyk6CisgICAgICAgICAgICBvcy51dGltZShvcy5wYXRoLmpvaW4oc2VsZi5fYm94Ll9wYXRoLCBzdWJkaXIpLAorICAgICAgICAgICAgICAgICAgICAgKHRpbWUudGltZSgpLTUsKSoyKQorCisgICAgICAgICMgQmVjYXVzZSBtdGltZSBoYXMgYSB0d28gc2Vjb25kIGdyYW51bGFyaXR5IGluIHdvcnN0IGNhc2UgKEZBVCksIGEKKyAgICAgICAgIyByZWZyZXNoIGlzIGRvbmUgdW5jb25kaXRpb25hbGx5IGlmIGNhbGxlZCBmb3Igd2l0aGluCisgICAgICAgICMgdHdvLXNlY29uZC1wbHVzLWEtYml0IG9mIHRoZSBsYXN0IG9uZSwganVzdCBpbiBjYXNlIHRoZSBtYm94IGhhcworICAgICAgICAjIGNoYW5nZWQ7IHNvIG5vdyB3ZSBoYXZlIHRvIHdhaXQgZm9yIHRoYXQgaW50ZXJ2YWwgdG8gZXhwaXJlLgorICAgICAgICAjCisgICAgICAgICMgQmVjYXVzZSB0aGlzIGlzIGEgdGVzdCwgZW11bGF0ZSBzbGVlcGluZy4gSW5zdGVhZCBvZgorICAgICAgICAjIHNsZWVwaW5nIGZvciAyIHNlY29uZHMsIHVzZSB0aGUgc2tldyBmYWN0b3IgdG8gbWFrZSBfcmVmcmVzaAorICAgICAgICAjIHRoaW5rIHRoYXQgMiBzZWNvbmRzIGhhdmUgcGFzc2VkIGFuZCByZS1yZWFkaW5nIHRoZSBfdG9jIGlzCisgICAgICAgICMgb25seSByZXF1aXJlZCBpZiBtdGltZXMgZGlmZmVyLgorICAgICAgICBzZWxmLl9ib3guX3NrZXdmYWN0b3IgPSAtMworCisgICAgICAgICMgUmUtcmVhZGluZyBjYXVzZXMgdGhlIC5fdG9jIGF0dHJpYnV0ZSB0byBiZSBhc3NpZ25lZCBhIG5ldyBkaWN0aW9uYXJ5CisgICAgICAgICMgb2JqZWN0LCBzbyB3ZSdsbCBjaGVjayB0aGF0IHRoZSAuX3RvYyBhdHRyaWJ1dGUgaXNuJ3QgYSBkaWZmZXJlbnQKKyAgICAgICAgIyBvYmplY3QuCisgICAgICAgIG9yaWdfdG9jID0gc2VsZi5fYm94Ll90b2MKKyAgICAgICAgZGVmIHJlZnJlc2hlZCgpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2JveC5fdG9jIGlzIG5vdCBvcmlnX3RvYworCisgICAgICAgIHNlbGYuX2JveC5fcmVmcmVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVmcmVzaGVkKCkpCisKKyAgICAgICAgIyBOb3csIHdyaXRlIHNvbWV0aGluZyBpbnRvIGN1ciBhbmQgcmVtb3ZlIGl0LiAgVGhpcyBjaGFuZ2VzCisgICAgICAgICMgdGhlIG10aW1lIGFuZCBzaG91bGQgY2F1c2UgYSByZS1yZWFkLiBOb3RlIHRoYXQgInNsZWVwCisgICAgICAgICMgZW11bGF0aW9uIiBpcyBzdGlsbCBpbiBlZmZlY3QsIGFzIHNrZXdmYWN0b3IgaXMgLTMuCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICdjdXInLCAnc3RyYXktZmlsZScpCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAndycpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuX2JveC5fcmVmcmVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWZyZXNoZWQoKSkKKworCitjbGFzcyBfVGVzdFNpbmdsZUZpbGUoVGVzdE1haWxib3gpOgorICAgICcnJ0NvbW1vbiB0ZXN0cyBmb3Igc2luZ2xlLWZpbGUgbWFpbGJveGVzJycnCisKKyAgICBkZWYgdGVzdF9hZGRfZG9lc250X3Jld3JpdGUoc2VsZik6CisgICAgICAgICMgV2hlbiBvbmx5IGFkZGluZyBtZXNzYWdlcywgZmx1c2goKSBzaG91bGQgbm90IHJld3JpdGUgdGhlCisgICAgICAgICMgbWFpbGJveCBmaWxlLiBTZWUgaXNzdWUgIzk1NTkuCisKKyAgICAgICAgIyBJbm9kZSBudW1iZXIgY2hhbmdlcyBpZiB0aGUgY29udGVudHMgYXJlIHdyaXR0ZW4gdG8gYW5vdGhlcgorICAgICAgICAjIGZpbGUgd2hpY2ggaXMgdGhlbiByZW5hbWVkIG92ZXIgdGhlIG9yaWdpbmFsIGZpbGUuIFNvIHdlCisgICAgICAgICMgbXVzdCBjaGVjayB0aGF0IHRoZSBpbm9kZSBudW1iZXIgZG9lc24ndCBjaGFuZ2UuCisgICAgICAgIGlub2RlX2JlZm9yZSA9IG9zLnN0YXQoc2VsZi5fcGF0aCkuc3RfaW5vCisKKyAgICAgICAgc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIHNlbGYuX2JveC5mbHVzaCgpCisKKyAgICAgICAgaW5vZGVfYWZ0ZXIgPSBvcy5zdGF0KHNlbGYuX3BhdGgpLnN0X2lubworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlub2RlX2JlZm9yZSwgaW5vZGVfYWZ0ZXIpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIG1lc3NhZ2Ugd2FzIHJlYWxseSBhZGRlZAorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIDEpCisKKyAgICBkZWYgdGVzdF9wZXJtaXNzaW9uc19hZnRlcl9mbHVzaChzZWxmKToKKyAgICAgICAgIyBTZWUgaXNzdWUgIzUzNDYKKworICAgICAgICAjIE1ha2UgdGhlIG1haWxib3ggd29ybGQgd3JpdGFibGUuIEl0J3MgdW5saWtlbHkgdGhhdCB0aGUgbmV3CisgICAgICAgICMgbWFpbGJveCBmaWxlIHdvdWxkIGhhdmUgdGhlc2UgcGVybWlzc2lvbnMgYWZ0ZXIgZmx1c2goKSwKKyAgICAgICAgIyBiZWNhdXNlIHVtYXNrIHVzdWFsbHkgcHJldmVudHMgaXQuCisgICAgICAgIG1vZGUgPSBvcy5zdGF0KHNlbGYuX3BhdGgpLnN0X21vZGUgfCAwbzY2NgorICAgICAgICBvcy5jaG1vZChzZWxmLl9wYXRoLCBtb2RlKQorCisgICAgICAgIHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBpID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgICMgTmVlZCB0byByZW1vdmUgb25lIG1lc3NhZ2UgdG8gbWFrZSBmbHVzaCgpIGNyZWF0ZSBhIG5ldyBmaWxlCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoaSkKKyAgICAgICAgc2VsZi5fYm94LmZsdXNoKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoc2VsZi5fcGF0aCkuc3RfbW9kZSwgbW9kZSkKKworCitjbGFzcyBfVGVzdE1ib3hNTURGKF9UZXN0U2luZ2xlRmlsZSk6CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisgICAgICAgIHNlbGYuX2RlbGV0ZV9yZWN1cnNpdmVseShzZWxmLl9wYXRoKQorICAgICAgICBmb3IgbG9ja19yZW1uYW50IGluIGdsb2IuZ2xvYihzZWxmLl9wYXRoICsgJy4qJyk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKGxvY2tfcmVtbmFudCkKKworICAgIGRlZiB0ZXN0X2FkZF9mcm9tX3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBBZGQgYSBzdHJpbmcgc3RhcnRpbmcgd2l0aCAnRnJvbSAnIHRvIHRoZSBtYWlsYm94CisgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQoJ0Zyb20gZm9vQGJhciBibGFoXG5Gcm9tOiBmb29cblxuMFxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3hba2V5XS5nZXRfZnJvbSgpLCAnZm9vQGJhciBibGFoJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3hba2V5XS5nZXRfcGF5bG9hZCgpLCAnMFxuJykKKworICAgIGRlZiB0ZXN0X2FkZF9tYm94X29yX21tZGZfbWVzc2FnZShzZWxmKToKKyAgICAgICAgIyBBZGQgYW4gbWJveE1lc3NhZ2Ugb3IgTU1ERk1lc3NhZ2UKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5tYm94TWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBtc2cgPSBjbGFzc18oJ0Zyb20gZm9vQGJhciBibGFoXG5Gcm9tOiBmb29cblxuMFxuJykKKyAgICAgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQobXNnKQorCisgICAgZGVmIHRlc3Rfb3Blbl9jbG9zZV9vcGVuKHNlbGYpOgorICAgICAgICAjIE9wZW4gYW5kIGluc3BlY3QgcHJldmlvdXNseS1jcmVhdGVkIG1haWxib3gKKyAgICAgICAgdmFsdWVzID0gW3NlbGYuX3RlbXBsYXRlICUgaSBmb3IgaSBpbiB4cmFuZ2UoMyldCisgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CisgICAgICAgICAgICBzZWxmLl9ib3guYWRkKHZhbHVlKQorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICBtdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAzKQorICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2JveC5pdGVya2V5cygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkpLCB2YWx1ZXMpCisgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXRpbWUsIG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5fcGF0aCkpCisKKyAgICBkZWYgdGVzdF9hZGRfYW5kX2Nsb3NlKHNlbGYpOgorICAgICAgICAjIFZlcmlmeWluZyB0aGF0IGNsb3NpbmcgYSBtYWlsYm94IGRvZXNuJ3QgY2hhbmdlIGFkZGVkIGl0ZW1zCisgICAgICAgIHNlbGYuX2JveC5hZGQoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMyk6CisgICAgICAgICAgICBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgaSkKKyAgICAgICAgc2VsZi5fYm94LmFkZChfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHNlbGYuX2JveC5fZmlsZS5mbHVzaCgpCisgICAgICAgIHNlbGYuX2JveC5fZmlsZS5zZWVrKDApCisgICAgICAgIGNvbnRlbnRzID0gc2VsZi5fYm94Ll9maWxlLnJlYWQoKQorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5fcGF0aCwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udGVudHMsIGYucmVhZCgpKQorICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnZm9yaycpLCAiVGVzdCBuZWVkcyBmb3JrKCkuIikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHNvY2tldCwgJ3NvY2tldHBhaXInKSwgIlRlc3QgbmVlZHMgc29ja2V0cGFpcigpLiIpCisgICAgZGVmIHRlc3RfbG9ja19jb25mbGljdChzZWxmKToKKyAgICAgICAgIyBGb3JrIG9mZiBhIGNoaWxkIHByb2Nlc3MgdGhhdCB3aWxsIGxvY2sgdGhlIG1haWxib3ggdGVtcG9yYXJpbHksCisgICAgICAgICMgdW5sb2NrIGl0IGFuZCBleGl0LgorICAgICAgICBjLCBwID0gc29ja2V0LnNvY2tldHBhaXIoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoYy5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuY2xvc2UpCisKKyAgICAgICAgcGlkID0gb3MuZm9yaygpCisgICAgICAgIGlmIHBpZCA9PSAwOgorICAgICAgICAgICAgIyBjaGlsZAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgbG9jayB0aGUgbWFpbGJveCwgYW5kIHNpZ25hbCB0aGUgcGFyZW50IGl0IGNhbiBwcm9jZWVkCisgICAgICAgICAgICAgICAgc2VsZi5fYm94LmxvY2soKQorICAgICAgICAgICAgICAgIGMuc2VuZChiJ2MnKQorCisgICAgICAgICAgICAgICAgIyB3YWl0IHVudGlsIHRoZSBwYXJlbnQgaXMgZG9uZSwgYW5kIHVubG9jayB0aGUgbWFpbGJveAorICAgICAgICAgICAgICAgIGMucmVjdigxKQorICAgICAgICAgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgwKQorCisgICAgICAgICMgSW4gdGhlIHBhcmVudCwgd2FpdCB1bnRpbCB0aGUgY2hpbGQgc2lnbmFscyBpdCBsb2NrZWQgdGhlIG1haWxib3guCisgICAgICAgIHAucmVjdigxKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhtYWlsYm94LkV4dGVybmFsQ2xhc2hFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2JveC5sb2NrKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgIyBTaWduYWwgdGhlIGNoaWxkIGl0IGNhbiBub3cgcmVsZWFzZSB0aGUgbG9jayBhbmQgZXhpdC4KKyAgICAgICAgICAgIHAuc2VuZChiJ3AnKQorICAgICAgICAgICAgIyBXYWl0IGZvciBjaGlsZCB0byBleGl0LiAgTG9ja2luZyBzaG91bGQgbm93IHN1Y2NlZWQuCisgICAgICAgICAgICBleGl0ZWRfcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKHBpZCwgMCkKKworICAgICAgICBzZWxmLl9ib3gubG9jaygpCisgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQorCisgICAgZGVmIHRlc3RfcmVsb2NrKHNlbGYpOgorICAgICAgICAjIFRlc3QgY2FzZSBmb3IgYnVnICMxNTc1NTA2OiB0aGUgbWFpbGJveCBjbGFzcyB3YXMgbG9ja2luZyB0aGUKKyAgICAgICAgIyB3cm9uZyBmaWxlIG9iamVjdCBpbiBpdHMgZmx1c2goKSBtZXRob2QuCisgICAgICAgIG1zZyA9ICJTdWJqZWN0OiBzdWJcblxuYm9keVxuIgorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChtc2cpCisgICAgICAgIHNlbGYuX2JveC5mbHVzaCgpCisgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLl9ib3gubG9jaygpCisgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKG1zZykKKyAgICAgICAgc2VsZi5fYm94LmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5fbG9ja2VkKQorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorCisKK2NsYXNzIFRlc3RNYm94KF9UZXN0TWJveE1NREYsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIF9mYWN0b3J5ID0gbGFtYmRhIHNlbGYsIHBhdGgsIGZhY3Rvcnk9Tm9uZTogbWFpbGJveC5tYm94KHBhdGgsIGZhY3RvcnkpCisKKyAgICBkZWYgdGVzdF9maWxlX3Blcm1zKHNlbGYpOgorICAgICAgICAjIEZyb20gYnVnICMzMjI4LCB3ZSB3YW50IHRvIHZlcmlmeSB0aGF0IHRoZSBtYWlsYm94IGZpbGUgaXNuJ3QgZXhlY3V0YWJsZSwKKyAgICAgICAgIyBldmVuIGlmIHRoZSB1bWFzayBpcyBzZXQgdG8gc29tZXRoaW5nIHRoYXQgd291bGQgbGVhdmUgZXhlY3V0YWJsZSBiaXRzIHNldC4KKyAgICAgICAgIyBXZSBvbmx5IHJ1biB0aGlzIHRlc3Qgb24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB1bWFzay4KKyAgICAgICAgaWYgaGFzYXR0cihvcywgJ3VtYXNrJykgYW5kIGhhc2F0dHIob3MsICdzdGF0Jyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb2xkX3VtYXNrID0gb3MudW1hc2soMDA3NykKKyAgICAgICAgICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICAgICAgICAgIG9zLnVubGluayhzZWxmLl9wYXRoKQorICAgICAgICAgICAgICAgIHNlbGYuX2JveCA9IG1haWxib3gubWJveChzZWxmLl9wYXRoLCBjcmVhdGU9VHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9ib3guYWRkKCcnKQorICAgICAgICAgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLnVtYXNrKG9sZF91bWFzaykKKworICAgICAgICAgICAgc3QgPSBvcy5zdGF0KHNlbGYuX3BhdGgpCisgICAgICAgICAgICBwZXJtcyA9IHN0LnN0X21vZGUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoKHBlcm1zICYgMDExMSkpICMgRXhlY3V0ZSBiaXRzIHNob3VsZCBhbGwgYmUgb2ZmLgorCisgICAgZGVmIHRlc3RfdGVybWluYXRpbmdfbmV3bGluZShzZWxmKToKKyAgICAgICAgbWVzc2FnZSA9IGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSgpCisgICAgICAgIG1lc3NhZ2VbJ0Zyb20nXSA9ICdqb2huQGV4YW1wbGUuY29tJworICAgICAgICBtZXNzYWdlLnNldF9wYXlsb2FkKCdObyBuZXdsaW5lIGF0IHRoZSBlbmQnKQorICAgICAgICBpID0gc2VsZi5fYm94LmFkZChtZXNzYWdlKQorCisgICAgICAgICMgQSBuZXdsaW5lIHNob3VsZCBoYXZlIGJlZW4gYXBwZW5kZWQgdG8gdGhlIHBheWxvYWQKKyAgICAgICAgbWVzc2FnZSA9IHNlbGYuX2JveC5nZXQoaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLmdldF9wYXlsb2FkKCksICdObyBuZXdsaW5lIGF0IHRoZSBlbmRcbicpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX3NlcGFyYXRvcihzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGVyZSdzIGFsd2F5cyBhIHNpbmdsZSBibGFuayBsaW5lIGFmdGVyIGVhY2ggbWVzc2FnZQorICAgICAgICBzZWxmLl9ib3guYWRkKCdGcm9tOiBmb29cblxuMCcpICAjIE5vIG5ld2xpbmUgYXQgdGhlIGVuZAorICAgICAgICB3aXRoIG9wZW4oc2VsZi5fcGF0aCkgYXMgZjoKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhWy0zOl0sICcwXG5cbicpCisKKyAgICAgICAgc2VsZi5fYm94LmFkZCgnRnJvbTogZm9vXG5cbjBcbicpICAjIE5ld2xpbmUgYXQgdGhlIGVuZAorICAgICAgICB3aXRoIG9wZW4oc2VsZi5fcGF0aCkgYXMgZjoKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhWy0zOl0sICcwXG5cbicpCisKKworY2xhc3MgVGVzdE1NREYoX1Rlc3RNYm94TU1ERiwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgX2ZhY3RvcnkgPSBsYW1iZGEgc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lOiBtYWlsYm94Lk1NREYocGF0aCwgZmFjdG9yeSkKKworCitjbGFzcyBUZXN0TUgoVGVzdE1haWxib3gsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIF9mYWN0b3J5ID0gbGFtYmRhIHNlbGYsIHBhdGgsIGZhY3Rvcnk9Tm9uZTogbWFpbGJveC5NSChwYXRoLCBmYWN0b3J5KQorCisgICAgZGVmIHRlc3RfbGlzdF9mb2xkZXJzKHNlbGYpOgorICAgICAgICAjIExpc3QgZm9sZGVycworICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcignb25lJykKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ3R3bycpCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0aHJlZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KCgnb25lJywgJ3R3bycsICd0aHJlZScpKSkKKworICAgIGRlZiB0ZXN0X2dldF9mb2xkZXIoc2VsZik6CisgICAgICAgICMgT3BlbiBmb2xkZXJzCisgICAgICAgIGRlZiBkdW1teV9mYWN0b3J5IChzKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCwgZHVtbXlfZmFjdG9yeSkKKworICAgICAgICBuZXdfZm9sZGVyID0gc2VsZi5fYm94LmFkZF9mb2xkZXIoJ2Zvby5iYXInKQorICAgICAgICBmb2xkZXIwID0gc2VsZi5fYm94LmdldF9mb2xkZXIoJ2Zvby5iYXInKQorICAgICAgICBmb2xkZXIwLmFkZChzZWxmLl90ZW1wbGF0ZSAlICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ2Zvby5iYXInKSkpCisgICAgICAgIGZvbGRlcjEgPSBzZWxmLl9ib3guZ2V0X2ZvbGRlcignZm9vLmJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9sZGVyMS5nZXRfc3RyaW5nKGZvbGRlcjEua2V5cygpWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdiYXInKQorCisgICAgICAgICMgVGVzdCBmb3IgYnVnICMxNTY5NzkwOiB2ZXJpZnkgdGhhdCBmb2xkZXJzIHJldHVybmVkIGJ5IC5nZXRfZm9sZGVyKCkKKyAgICAgICAgIyB1c2UgdGhlIHNhbWUgZmFjdG9yeSBmdW5jdGlvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRJcyhuZXdfZm9sZGVyLl9mYWN0b3J5LCBzZWxmLl9ib3guX2ZhY3RvcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZm9sZGVyMC5fZmFjdG9yeSwgc2VsZi5fYm94Ll9mYWN0b3J5KQorCisgICAgZGVmIHRlc3RfYWRkX2FuZF9yZW1vdmVfZm9sZGVycyhzZWxmKToKKyAgICAgICAgIyBEZWxldGUgZm9sZGVycworICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcignb25lJykKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ3R3bycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksIHNldCgoJ29uZScsICd0d28nKSkpCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmVfZm9sZGVyKCdvbmUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLCBzZXQoKCd0d28nLCApKSkKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ3RocmVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgc2V0KCgndHdvJywgJ3RocmVlJykpKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlX2ZvbGRlcigndGhyZWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLCBzZXQoKCd0d28nLCApKSkKKyAgICAgICAgc2VsZi5fYm94LnJlbW92ZV9mb2xkZXIoJ3R3bycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpLCBbXSkKKworICAgIGRlZiB0ZXN0X3NlcXVlbmNlcyhzZWxmKToKKyAgICAgICAgIyBHZXQgYW5kIHNldCBzZXF1ZW5jZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3NlcXVlbmNlcygpLCB7fSkKKyAgICAgICAgbXNnMCA9IG1haWxib3guTUhNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgbXNnMC5hZGRfc2VxdWVuY2UoJ2ZvbycpCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKG1zZzApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSwgeydmb28nOltrZXkwXX0pCisgICAgICAgIG1zZzEgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIG1zZzEuc2V0X3NlcXVlbmNlcyhbJ2JhcicsICdyZXBsaWVkJywgJ2ZvbyddKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChtc2cxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgeydmb28nOltrZXkwLCBrZXkxXSwgJ2Jhcic6W2tleTFdLCAncmVwbGllZCc6W2tleTFdfSkKKyAgICAgICAgbXNnMC5zZXRfc2VxdWVuY2VzKFsnZmxhZ2dlZCddKQorICAgICAgICBzZWxmLl9ib3hba2V5MF0gPSBtc2cwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7J2Zvbyc6W2tleTFdLCAnYmFyJzpba2V5MV0sICdyZXBsaWVkJzpba2V5MV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICdmbGFnZ2VkJzpba2V5MF19KQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSwgeydmbGFnZ2VkJzpba2V5MF19KQorCisgICAgZGVmIHRlc3RfaXNzdWUyNjI1KHNlbGYpOgorICAgICAgICBtc2cwID0gbWFpbGJveC5NSE1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBtc2cwLmFkZF9zZXF1ZW5jZSgnZm9vJykKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQobXNnMCkKKyAgICAgICAgcmVmbXNnMCA9IHNlbGYuX2JveC5nZXRfbWVzc2FnZShrZXkwKQorCisgICAgZGVmIHRlc3RfaXNzdWU3NjI3KHNlbGYpOgorICAgICAgICBtc2cwID0gbWFpbGJveC5NSE1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChtc2cwKQorICAgICAgICBzZWxmLl9ib3gubG9jaygpCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MCkKKyAgICAgICAgc2VsZi5fYm94LnVubG9jaygpCisKKyAgICBkZWYgdGVzdF9wYWNrKHNlbGYpOgorICAgICAgICAjIFBhY2sgdGhlIGNvbnRlbnRzIG9mIHRoZSBtYWlsYm94CisgICAgICAgIG1zZzAgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIG1zZzEgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIG1zZzIgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDIpCisgICAgICAgIG1zZzMgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDMpCisgICAgICAgIG1zZzAuc2V0X3NlcXVlbmNlcyhbJ2ZvbycsICd1bnNlZW4nXSkKKyAgICAgICAgbXNnMS5zZXRfc2VxdWVuY2VzKFsnZm9vJ10pCisgICAgICAgIG1zZzIuc2V0X3NlcXVlbmNlcyhbJ2ZvbycsICdmbGFnZ2VkJ10pCisgICAgICAgIG1zZzMuc2V0X3NlcXVlbmNlcyhbJ2ZvbycsICdiYXInLCAncmVwbGllZCddKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChtc2cwKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChtc2cxKQorICAgICAgICBrZXkyID0gc2VsZi5fYm94LmFkZChtc2cyKQorICAgICAgICBrZXkzID0gc2VsZi5fYm94LmFkZChtc2czKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgeydmb28nOltrZXkwLGtleTEsa2V5MixrZXkzXSwgJ3Vuc2Vlbic6W2tleTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnZmxhZ2dlZCc6W2tleTJdLCAnYmFyJzpba2V5M10sICdyZXBsaWVkJzpba2V5M119KQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7J2Zvbyc6W2tleTAsa2V5MSxrZXkzXSwgJ3Vuc2Vlbic6W2tleTBdLCAnYmFyJzpba2V5M10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBsaWVkJzpba2V5M119KQorICAgICAgICBzZWxmLl9ib3gucGFjaygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmtleXMoKSwgWzEsIDIsIDNdKQorICAgICAgICBrZXkwID0ga2V5MAorICAgICAgICBrZXkxID0ga2V5MCArIDEKKyAgICAgICAga2V5MiA9IGtleTEgKyAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgIHsnZm9vJzpbMSwgMiwgM10sICd1bnNlZW4nOlsxXSwgJ2Jhcic6WzNdLCAncmVwbGllZCc6WzNdfSkKKworICAgICAgICAjIFRlc3QgY2FzZSBmb3IgcGFja2luZyB3aGlsZSBob2xkaW5nIHRoZSBtYWlsYm94IGxvY2tlZC4KKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQobXNnMSkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQobXNnMSkKKyAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQobXNnMSkKKyAgICAgICAga2V5MyA9IHNlbGYuX2JveC5hZGQobXNnMSkKKworICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTApCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MikKKyAgICAgICAgc2VsZi5fYm94LmxvY2soKQorICAgICAgICBzZWxmLl9ib3gucGFjaygpCisgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgeydmb28nOlsxLCAyLCAzLCA0LCA1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Vuc2Vlbic6WzFdLCAnYmFyJzpbM10sICdyZXBsaWVkJzpbM119KQorCisgICAgZGVmIF9nZXRfbG9ja19wYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcubWhfc2VxdWVuY2VzLmxvY2snKQorCisKK2NsYXNzIFRlc3RCYWJ5bChfVGVzdFNpbmdsZUZpbGUsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIF9mYWN0b3J5ID0gbGFtYmRhIHNlbGYsIHBhdGgsIGZhY3Rvcnk9Tm9uZTogbWFpbGJveC5CYWJ5bChwYXRoLCBmYWN0b3J5KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICBzZWxmLl9kZWxldGVfcmVjdXJzaXZlbHkoc2VsZi5fcGF0aCkKKyAgICAgICAgZm9yIGxvY2tfcmVtbmFudCBpbiBnbG9iLmdsb2Ioc2VsZi5fcGF0aCArICcuKicpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhsb2NrX3JlbW5hbnQpCisKKyAgICBkZWYgdGVzdF9sYWJlbHMoc2VsZik6CisgICAgICAgICMgR2V0IGxhYmVscyBmcm9tIHRoZSBtYWlsYm94CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9sYWJlbHMoKSwgW10pCisgICAgICAgIG1zZzAgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIG1zZzAuYWRkX2xhYmVsKCdmb28nKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChtc2cwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfbGFiZWxzKCksIFsnZm9vJ10pCisgICAgICAgIG1zZzEgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIG1zZzEuc2V0X2xhYmVscyhbJ2JhcicsICdhbnN3ZXJlZCcsICdmb28nXSkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQobXNnMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VsZi5fYm94LmdldF9sYWJlbHMoKSksIHNldChbJ2ZvbycsICdiYXInXSkpCisgICAgICAgIG1zZzAuc2V0X2xhYmVscyhbJ2JsYWgnLCAnZmlsZWQnXSkKKyAgICAgICAgc2VsZi5fYm94W2tleTBdID0gbXNnMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChzZWxmLl9ib3guZ2V0X2xhYmVscygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZXQoWydmb28nLCAnYmFyJywgJ2JsYWgnXSkpCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VsZi5fYm94LmdldF9sYWJlbHMoKSksIHNldChbJ2JsYWgnXSkpCisKKworY2xhc3MgVGVzdE1lc3NhZ2UoVGVzdEJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIF9mYWN0b3J5ID0gbWFpbGJveC5NZXNzYWdlICAgICAgIyBPdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcmV1c2UgdGVzdHMKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fcGF0aCA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5fZGVsZXRlX3JlY3Vyc2l2ZWx5KHNlbGYuX3BhdGgpCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXplX3dpdGhfZU1NKHNlbGYpOgorICAgICAgICAjIEluaXRpYWxpemUgYmFzZWQgb24gZW1haWwubWVzc2FnZS5NZXNzYWdlIGluc3RhbmNlCisgICAgICAgIGVNTSA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBtc2cgPSBzZWxmLl9mYWN0b3J5KGVNTSkKKyAgICAgICAgc2VsZi5fcG9zdF9pbml0aWFsaXplX2hvb2sobXNnKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZV93aXRoX3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBJbml0aWFsaXplIGJhc2VkIG9uIHN0cmluZworICAgICAgICBtc2cgPSBzZWxmLl9mYWN0b3J5KF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgc2VsZi5fcG9zdF9pbml0aWFsaXplX2hvb2sobXNnKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZV93aXRoX2ZpbGUoc2VsZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSBiYXNlZCBvbiBjb250ZW50cyBvZiBmaWxlCisgICAgICAgIHdpdGggb3BlbihzZWxmLl9wYXRoLCAndysnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgIG1zZyA9IHNlbGYuX2ZhY3RvcnkoZikKKyAgICAgICAgICAgIHNlbGYuX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKG1zZykKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXplX3dpdGhfbm90aGluZyhzZWxmKToKKyAgICAgICAgIyBJbml0aWFsaXplIHdpdGhvdXQgYXJndW1lbnRzCisgICAgICAgIG1zZyA9IHNlbGYuX2ZhY3RvcnkoKQorICAgICAgICBzZWxmLl9wb3N0X2luaXRpYWxpemVfaG9vayhtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2csIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZywgbWFpbGJveC5NZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnLCBzZWxmLl9mYWN0b3J5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5rZXlzKCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfaW5jb3JyZWN0bHkoc2VsZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSB3aXRoIGludmFsaWQgYXJndW1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuX2ZhY3Rvcnkob2JqZWN0KCkpKQorCisgICAgZGVmIHRlc3RfYmVjb21lX21lc3NhZ2Uoc2VsZik6CisgICAgICAgICMgVGFrZSBvbiB0aGUgc3RhdGUgb2YgYW5vdGhlciBtZXNzYWdlCisgICAgICAgIGVNTSA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBtc2cgPSBzZWxmLl9mYWN0b3J5KCkKKyAgICAgICAgbXNnLl9iZWNvbWVfbWVzc2FnZShlTU0pCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCisKKyAgICBkZWYgdGVzdF9leHBsYWluX3RvKHNlbGYpOgorICAgICAgICAjIENvcHkgc2VsZidzIGZvcm1hdC1zcGVjaWZpYyBkYXRhIHRvIG90aGVyIG1lc3NhZ2UgZm9ybWF0cy4KKyAgICAgICAgIyBUaGlzIHRlc3QgaXMgc3VwZXJmaWNpYWw7IGJldHRlciBvbmVzIGFyZSBpbiBUZXN0TWVzc2FnZUNvbnZlcnNpb24uCisgICAgICAgIG1zZyA9IHNlbGYuX2ZhY3RvcnkoKQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lk1lc3NhZ2UsIG1haWxib3guTWFpbGRpck1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTUhNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94LkJhYnlsTWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBvdGhlcl9tc2cgPSBjbGFzc18oKQorICAgICAgICAgICAgbXNnLl9leHBsYWluX3RvKG90aGVyX21zZykKKyAgICAgICAgb3RoZXJfbXNnID0gZW1haWwubWVzc2FnZS5NZXNzYWdlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG1zZy5fZXhwbGFpbl90byhvdGhlcl9tc2cpKQorCisgICAgZGVmIF9wb3N0X2luaXRpYWxpemVfaG9vayhzZWxmLCBtc2cpOgorICAgICAgICAjIE92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBjaGVjayBleHRyYSB0aGluZ3MgYWZ0ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgcGFzcworCisKK2NsYXNzIFRlc3RNYWlsZGlyTWVzc2FnZShUZXN0TWVzc2FnZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgX2ZhY3RvcnkgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlCisKKyAgICBkZWYgX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKHNlbGYsIG1zZyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLl9zdWJkaXIsICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5faW5mbywnJykKKworICAgIGRlZiB0ZXN0X3N1YmRpcihzZWxmKToKKyAgICAgICAgIyBVc2UgZ2V0X3N1YmRpcigpIGFuZCBzZXRfc3ViZGlyKCkKKyAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9zdWJkaXIoKSwgJ25ldycpCisgICAgICAgIG1zZy5zZXRfc3ViZGlyKCdjdXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc3ViZGlyKCksICdjdXInKQorICAgICAgICBtc2cuc2V0X3N1YmRpcignbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3N1YmRpcigpLCAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBtc2cuc2V0X3N1YmRpcigndG1wJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9zdWJkaXIoKSwgJ25ldycpCisgICAgICAgIG1zZy5zZXRfc3ViZGlyKCduZXcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc3ViZGlyKCksICduZXcnKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorCisgICAgZGVmIHRlc3RfZmxhZ3Moc2VsZik6CisgICAgICAgICMgVXNlIGdldF9mbGFncygpLCBzZXRfZmxhZ3MoKSwgYWRkX2ZsYWcoKSwgcmVtb3ZlX2ZsYWcoKQorICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc3ViZGlyKCksICduZXcnKQorICAgICAgICBtc2cuc2V0X2ZsYWdzKCdGJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3N1YmRpcigpLCAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksICdGJykKKyAgICAgICAgbXNnLnNldF9mbGFncygnU0RUUCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mbGFncygpLCAnRFBTVCcpCisgICAgICAgIG1zZy5hZGRfZmxhZygnRlQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmxhZ3MoKSwgJ0RGUFNUJykKKyAgICAgICAgbXNnLnJlbW92ZV9mbGFnKCdURFJQJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksICdGUycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9zdWJkaXIoKSwgJ25ldycpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCisKKyAgICBkZWYgdGVzdF9kYXRlKHNlbGYpOgorICAgICAgICAjIFVzZSBnZXRfZGF0ZSgpIGFuZCBzZXRfZGF0ZSgpCisgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBkaWZmID0gbXNnLmdldF9kYXRlKCkgLSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWJzKGRpZmYpIDwgNjAsIGRpZmYpCisgICAgICAgIG1zZy5zZXRfZGF0ZSgwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9kYXRlKCksIDAuMCkKKworICAgIGRlZiB0ZXN0X2luZm8oc2VsZik6CisgICAgICAgICMgVXNlIGdldF9pbmZvKCkgYW5kIHNldF9pbmZvKCkKKyAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9pbmZvKCksICcnKQorICAgICAgICBtc2cuc2V0X2luZm8oJzEsZm9vPWJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9pbmZvKCksICcxLGZvbz1iYXInKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogbXNnLnNldF9pbmZvKE5vbmUpKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorCisgICAgZGVmIHRlc3RfaW5mb19hbmRfZmxhZ3Moc2VsZik6CisgICAgICAgICMgVGVzdCBpbnRlcmFjdGlvbiBvZiBpbmZvIGFuZCBmbGFnIG1ldGhvZHMKKyAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9pbmZvKCksICcnKQorICAgICAgICBtc2cuc2V0X2ZsYWdzKCdTRicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mbGFncygpLCAnRlMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfaW5mbygpLCAnMixGUycpCisgICAgICAgIG1zZy5zZXRfaW5mbygnMSwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmxhZ3MoKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9pbmZvKCksICcxLCcpCisgICAgICAgIG1zZy5yZW1vdmVfZmxhZygnUlBUJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfaW5mbygpLCAnMSwnKQorICAgICAgICBtc2cuYWRkX2ZsYWcoJ0QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmxhZ3MoKSwgJ0QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfaW5mbygpLCAnMixEJykKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKKworCitjbGFzcyBfVGVzdE1ib3hNTURGTWVzc2FnZToKKworICAgIF9mYWN0b3J5ID0gbWFpbGJveC5fbWJveE1NREZNZXNzYWdlCisKKyAgICBkZWYgX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKHNlbGYsIG1zZyk6CisgICAgICAgIHNlbGYuX2NoZWNrX2Zyb20obXNnKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZV93aXRoX3VuaXhmcm9tKHNlbGYpOgorICAgICAgICAjIEluaXRpYWxpemUgd2l0aCBhIG1lc3NhZ2UgdGhhdCBhbHJlYWR5IGhhcyBhIF91bml4ZnJvbSBhdHRyaWJ1dGUKKyAgICAgICAgbXNnID0gbWFpbGJveC5NZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnLnNldF91bml4ZnJvbSgnRnJvbSBmb29AYmFyIGJsYWgnKQorICAgICAgICBtc2cgPSBtYWlsYm94Lm1ib3hNZXNzYWdlKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2Zyb20oKSwgJ2Zvb0BiYXIgYmxhaCcpCisKKyAgICBkZWYgdGVzdF9mcm9tKHNlbGYpOgorICAgICAgICAjIEdldCBhbmQgc2V0ICJGcm9tICIgbGluZQorICAgICAgICBtc2cgPSBtYWlsYm94Lm1ib3hNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfZnJvbShtc2cpCisgICAgICAgIG1zZy5zZXRfZnJvbSgnZm9vIGJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mcm9tKCksICdmb28gYmFyJykKKyAgICAgICAgbXNnLnNldF9mcm9tKCdmb29AYmFyJywgVHJ1ZSkKKyAgICAgICAgc2VsZi5fY2hlY2tfZnJvbShtc2csICdmb29AYmFyJykKKyAgICAgICAgbXNnLnNldF9mcm9tKCdibGFoQHRlbXAnLCB0aW1lLmxvY2FsdGltZSgpKQorICAgICAgICBzZWxmLl9jaGVja19mcm9tKG1zZywgJ2JsYWhAdGVtcCcpCisKKyAgICBkZWYgdGVzdF9mbGFncyhzZWxmKToKKyAgICAgICAgIyBVc2UgZ2V0X2ZsYWdzKCksIHNldF9mbGFncygpLCBhZGRfZmxhZygpLCByZW1vdmVfZmxhZygpCisgICAgICAgIG1zZyA9IG1haWxib3gubWJveE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmxhZ3MoKSwgJycpCisgICAgICAgIG1zZy5zZXRfZmxhZ3MoJ0YnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmxhZ3MoKSwgJ0YnKQorICAgICAgICBtc2cuc2V0X2ZsYWdzKCdYT0RSJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksICdST0RYJykKKyAgICAgICAgbXNnLmFkZF9mbGFnKCdGQScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mbGFncygpLCAnUk9ERkFYJykKKyAgICAgICAgbXNnLnJlbW92ZV9mbGFnKCdGRFhBJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksICdSTycpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCisKKyAgICBkZWYgX2NoZWNrX2Zyb20oc2VsZiwgbXNnLCBzZW5kZXI9Tm9uZSk6CisgICAgICAgICMgQ2hlY2sgY29udGVudHMgb2YgIkZyb20gIiBsaW5lCisgICAgICAgIGlmIHNlbmRlciBpcyBOb25lOgorICAgICAgICAgICAgc2VuZGVyID0gIk1BSUxFUi1EQUVNT04iCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChzZW5kZXIgKyByIiBcd3szfSBcd3szfSBbXGQgXVxkIFtcZCBdXGQ6XGR7Mn06IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJcZHsyfSBcZHs0fSIsIG1zZy5nZXRfZnJvbSgpKSkKKworCitjbGFzcyBUZXN0TWJveE1lc3NhZ2UoX1Rlc3RNYm94TU1ERk1lc3NhZ2UsIFRlc3RNZXNzYWdlKToKKworICAgIF9mYWN0b3J5ID0gbWFpbGJveC5tYm94TWVzc2FnZQorCisKK2NsYXNzIFRlc3RNSE1lc3NhZ2UoVGVzdE1lc3NhZ2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIF9mYWN0b3J5ID0gbWFpbGJveC5NSE1lc3NhZ2UKKworICAgIGRlZiBfcG9zdF9pbml0aWFsaXplX2hvb2soc2VsZiwgbXNnKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuX3NlcXVlbmNlcywgW10pCisKKyAgICBkZWYgdGVzdF9zZXF1ZW5jZXMoc2VsZik6CisgICAgICAgICMgR2V0LCBzZXQsIGpvaW4sIGFuZCBsZWF2ZSBzZXF1ZW5jZXMKKyAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc2VxdWVuY2VzKCksIFtdKQorICAgICAgICBtc2cuc2V0X3NlcXVlbmNlcyhbJ2Zvb2JhciddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc2VxdWVuY2VzKCksIFsnZm9vYmFyJ10pCisgICAgICAgIG1zZy5zZXRfc2VxdWVuY2VzKFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc2VxdWVuY2VzKCksIFtdKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc2VxdWVuY2VzKCksIFsndW5zZWVuJ10pCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc2VxdWVuY2VzKCksIFsndW5zZWVuJywgJ2ZsYWdnZWQnXSkKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9zZXF1ZW5jZXMoKSwgWyd1bnNlZW4nLCAnZmxhZ2dlZCddKQorICAgICAgICBtc2cucmVtb3ZlX3NlcXVlbmNlKCd1bnNlZW4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc2VxdWVuY2VzKCksIFsnZmxhZ2dlZCddKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdmb29iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc2VxdWVuY2VzKCksIFsnZmxhZ2dlZCcsICdmb29iYXInXSkKKyAgICAgICAgbXNnLnJlbW92ZV9zZXF1ZW5jZSgncmVwbGllZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9zZXF1ZW5jZXMoKSwgWydmbGFnZ2VkJywgJ2Zvb2JhciddKQorICAgICAgICBtc2cuc2V0X3NlcXVlbmNlcyhbJ2Zvb2JhcicsICdyZXBsaWVkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9zZXF1ZW5jZXMoKSwgWydmb29iYXInLCAncmVwbGllZCddKQorCisKK2NsYXNzIFRlc3RCYWJ5bE1lc3NhZ2UoVGVzdE1lc3NhZ2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIF9mYWN0b3J5ID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UKKworICAgIGRlZiBfcG9zdF9pbml0aWFsaXplX2hvb2soc2VsZiwgbXNnKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuX2xhYmVscywgW10pCisKKyAgICBkZWYgdGVzdF9sYWJlbHMoc2VsZik6CisgICAgICAgICMgR2V0LCBzZXQsIGpvaW4sIGFuZCBsZWF2ZSBsYWJlbHMKKyAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfbGFiZWxzKCksIFtdKQorICAgICAgICBtc2cuc2V0X2xhYmVscyhbJ2Zvb2JhciddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfbGFiZWxzKCksIFsnZm9vYmFyJ10pCisgICAgICAgIG1zZy5zZXRfbGFiZWxzKFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfbGFiZWxzKCksIFtdKQorICAgICAgICBtc2cuYWRkX2xhYmVsKCdmaWxlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9sYWJlbHMoKSwgWydmaWxlZCddKQorICAgICAgICBtc2cuYWRkX2xhYmVsKCdyZXNlbnQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfbGFiZWxzKCksIFsnZmlsZWQnLCAncmVzZW50J10pCisgICAgICAgIG1zZy5hZGRfbGFiZWwoJ3Jlc2VudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9sYWJlbHMoKSwgWydmaWxlZCcsICdyZXNlbnQnXSkKKyAgICAgICAgbXNnLnJlbW92ZV9sYWJlbCgnZmlsZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfbGFiZWxzKCksIFsncmVzZW50J10pCisgICAgICAgIG1zZy5hZGRfbGFiZWwoJ2Zvb2JhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9sYWJlbHMoKSwgWydyZXNlbnQnLCAnZm9vYmFyJ10pCisgICAgICAgIG1zZy5yZW1vdmVfbGFiZWwoJ3Vuc2VlbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9sYWJlbHMoKSwgWydyZXNlbnQnLCAnZm9vYmFyJ10pCisgICAgICAgIG1zZy5zZXRfbGFiZWxzKFsnZm9vYmFyJywgJ2Fuc3dlcmVkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9sYWJlbHMoKSwgWydmb29iYXInLCAnYW5zd2VyZWQnXSkKKworICAgIGRlZiB0ZXN0X3Zpc2libGUoc2VsZik6CisgICAgICAgICMgR2V0LCBzZXQsIGFuZCB1cGRhdGUgdmlzaWJsZSBoZWFkZXJzCisgICAgICAgIG1zZyA9IG1haWxib3guQmFieWxNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgdmlzaWJsZSA9IG1zZy5nZXRfdmlzaWJsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlzaWJsZS5rZXlzKCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydElzKHZpc2libGUuZ2V0X3BheWxvYWQoKSwgTm9uZSkKKyAgICAgICAgdmlzaWJsZVsnVXNlci1BZ2VudCddID0gJ0Zvb0JhciAxLjAnCisgICAgICAgIHZpc2libGVbJ1gtV2hhdGV2ZXInXSA9ICdCbGFoJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfdmlzaWJsZSgpLmtleXMoKSwgW10pCisgICAgICAgIG1zZy5zZXRfdmlzaWJsZSh2aXNpYmxlKQorICAgICAgICB2aXNpYmxlID0gbXNnLmdldF92aXNpYmxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aXNpYmxlLmtleXMoKSwgWydVc2VyLUFnZW50JywgJ1gtV2hhdGV2ZXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aXNpYmxlWydVc2VyLUFnZW50J10sICdGb29CYXIgMS4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aXNpYmxlWydYLVdoYXRldmVyJ10sICdCbGFoJykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh2aXNpYmxlLmdldF9wYXlsb2FkKCksIE5vbmUpCisgICAgICAgIG1zZy51cGRhdGVfdmlzaWJsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlzaWJsZS5rZXlzKCksIFsnVXNlci1BZ2VudCcsICdYLVdoYXRldmVyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0SXModmlzaWJsZS5nZXRfcGF5bG9hZCgpLCBOb25lKQorICAgICAgICB2aXNpYmxlID0gbXNnLmdldF92aXNpYmxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aXNpYmxlLmtleXMoKSwgWydVc2VyLUFnZW50JywgJ0RhdGUnLCAnRnJvbScsICdUbycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU3ViamVjdCddKQorICAgICAgICBmb3IgaGVhZGVyIGluICgnVXNlci1BZ2VudCcsICdEYXRlJywgJ0Zyb20nLCAnVG8nLCAnU3ViamVjdCcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aXNpYmxlW2hlYWRlcl0sIG1zZ1toZWFkZXJdKQorCisKK2NsYXNzIFRlc3RNTURGTWVzc2FnZShfVGVzdE1ib3hNTURGTWVzc2FnZSwgVGVzdE1lc3NhZ2UpOgorCisgICAgX2ZhY3RvcnkgPSBtYWlsYm94Lk1NREZNZXNzYWdlCisKKworY2xhc3MgVGVzdE1lc3NhZ2VDb252ZXJzaW9uKFRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9wbGFpbl90b194KHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgTWVzc2FnZSB0byBhbGwgZm9ybWF0cworICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lk1lc3NhZ2UsIG1haWxib3guTWFpbGRpck1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTUhNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94LkJhYnlsTWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBtc2dfcGxhaW4gPSBtYWlsYm94Lk1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnID0gY2xhc3NfKG1zZ19wbGFpbikKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCisKKyAgICBkZWYgdGVzdF94X3RvX3BsYWluKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgYWxsIGZvcm1hdHMgdG8gTWVzc2FnZQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lk1lc3NhZ2UsIG1haWxib3guTWFpbGRpck1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTUhNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94LkJhYnlsTWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBtc2cgPSBjbGFzc18oX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnX3BsYWluID0gbWFpbGJveC5NZXNzYWdlKG1zZykKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2dfcGxhaW4pCisKKyAgICBkZWYgdGVzdF94X3RvX2ludmFsaWQoc2VsZik6CisgICAgICAgICMgQ29udmVydCBhbGwgZm9ybWF0cyB0byBhbiBpbnZhbGlkIGZvcm1hdAorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lk1lc3NhZ2UsIG1haWxib3guTWFpbGRpck1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTUhNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94LkJhYnlsTWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogY2xhc3NfKEZhbHNlKSkKKworICAgIGRlZiB0ZXN0X21haWxkaXJfdG9fbWFpbGRpcihzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IE1haWxkaXJNZXNzYWdlIHRvIE1haWxkaXJNZXNzYWdlCisgICAgICAgIG1zZ19tYWlsZGlyID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIG1zZ19tYWlsZGlyLnNldF9mbGFncygnREZQUlNUJykKKyAgICAgICAgbXNnX21haWxkaXIuc2V0X3N1YmRpcignY3VyJykKKyAgICAgICAgZGF0ZSA9IG1zZ19tYWlsZGlyLmdldF9kYXRlKCkKKyAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2dfbWFpbGRpcikKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksICdERlBSU1QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc3ViZGlyKCksICdjdXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZGF0ZSgpLCBkYXRlKQorCisgICAgZGVmIHRlc3RfbWFpbGRpcl90b19tYm94bW1kZihzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IE1haWxkaXJNZXNzYWdlIHRvIG1ib3htZXNzYWdlIGFuZCBNTURGTWVzc2FnZQorICAgICAgICBwYWlycyA9ICgoJ0QnLCAnJyksICgnRicsICdGJyksICgnUCcsICcnKSwgKCdSJywgJ0EnKSwgKCdTJywgJ1InKSwKKyAgICAgICAgICAgICAgICAgKCdUJywgJ0QnKSwgKCdERlBSU1QnLCAnUkRGQScpKQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIG1zZ19tYWlsZGlyID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBtc2dfbWFpbGRpci5zZXRfZGF0ZSgwLjApCisgICAgICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgICAgIG1zZ19tYWlsZGlyLnNldF9mbGFncyhzZXR0aW5nKQorICAgICAgICAgICAgICAgIG1zZyA9IGNsYXNzXyhtc2dfbWFpbGRpcikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmxhZ3MoKSwgcmVzdWx0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mcm9tKCksICdNQUlMRVItREFFTU9OICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLmFzY3RpbWUodGltZS5nbXRpbWUoMC4wKSkpCisgICAgICAgICAgICBtc2dfbWFpbGRpci5zZXRfc3ViZGlyKCdjdXInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbGFzc18obXNnX21haWxkaXIpLmdldF9mbGFncygpLCAnUk9ERkEnKQorCisgICAgZGVmIHRlc3RfbWFpbGRpcl90b19taChzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IE1haWxkaXJNZXNzYWdlIHRvIE1ITWVzc2FnZQorICAgICAgICBtc2dfbWFpbGRpciA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBwYWlycyA9ICgoJ0QnLCBbJ3Vuc2VlbiddKSwgKCdGJywgWyd1bnNlZW4nLCAnZmxhZ2dlZCddKSwKKyAgICAgICAgICAgICAgICAgKCdQJywgWyd1bnNlZW4nXSksICgnUicsIFsndW5zZWVuJywgJ3JlcGxpZWQnXSksICgnUycsIFtdKSwKKyAgICAgICAgICAgICAgICAgKCdUJywgWyd1bnNlZW4nXSksICgnREZQUlNUJywgWydyZXBsaWVkJywgJ2ZsYWdnZWQnXSkpCisgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CisgICAgICAgICAgICBtc2dfbWFpbGRpci5zZXRfZmxhZ3Moc2V0dGluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFpbGJveC5NSE1lc3NhZ2UobXNnX21haWxkaXIpLmdldF9zZXF1ZW5jZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KQorCisgICAgZGVmIHRlc3RfbWFpbGRpcl90b19iYWJ5bChzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IE1haWxkaXJNZXNzYWdlIHRvIEJhYnlsCisgICAgICAgIG1zZ19tYWlsZGlyID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHBhaXJzID0gKCgnRCcsIFsndW5zZWVuJ10pLCAoJ0YnLCBbJ3Vuc2VlbiddKSwKKyAgICAgICAgICAgICAgICAgKCdQJywgWyd1bnNlZW4nLCAnZm9yd2FyZGVkJ10pLCAoJ1InLCBbJ3Vuc2VlbicsICdhbnN3ZXJlZCddKSwKKyAgICAgICAgICAgICAgICAgKCdTJywgW10pLCAoJ1QnLCBbJ3Vuc2VlbicsICdkZWxldGVkJ10pLAorICAgICAgICAgICAgICAgICAoJ0RGUFJTVCcsIFsnZGVsZXRlZCcsICdhbnN3ZXJlZCcsICdmb3J3YXJkZWQnXSkpCisgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CisgICAgICAgICAgICBtc2dfbWFpbGRpci5zZXRfZmxhZ3Moc2V0dGluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnX21haWxkaXIpLmdldF9sYWJlbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KQorCisgICAgZGVmIHRlc3RfbWJveG1tZGZfdG9fbWFpbGRpcihzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IG1ib3hNZXNzYWdlIGFuZCBNTURGTWVzc2FnZSB0byBNYWlsZGlyTWVzc2FnZQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIG1zZ19tYm94TU1ERiA9IGNsYXNzXyhfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBtc2dfbWJveE1NREYuc2V0X2Zyb20oJ2Zvb0BiYXInLCB0aW1lLmdtdGltZSgwLjApKQorICAgICAgICAgICAgcGFpcnMgPSAoKCdSJywgJ1MnKSwgKCdPJywgJycpLCAoJ0QnLCAnVCcpLCAoJ0YnLCAnRicpLCAoJ0EnLCAnUicpLAorICAgICAgICAgICAgICAgICAgICAgKCdST0RGQScsICdGUlNUJykpCisgICAgICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgICAgIG1zZ19tYm94TU1ERi5zZXRfZmxhZ3Moc2V0dGluZykKKyAgICAgICAgICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZ19tYm94TU1ERikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmxhZ3MoKSwgcmVzdWx0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9kYXRlKCksIDAuMCkKKyAgICAgICAgICAgIG1zZ19tYm94TU1ERi5zZXRfZmxhZ3MoJ08nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZ19tYm94TU1ERikuZ2V0X3N1YmRpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3VyJykKKworICAgIGRlZiB0ZXN0X21ib3htbWRmX3RvX21ib3htbWRmKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgbWJveE1lc3NhZ2UgYW5kIE1NREZNZXNzYWdlIHRvIG1ib3hNZXNzYWdlIGFuZCBNTURGTWVzc2FnZQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIG1zZ19tYm94TU1ERiA9IGNsYXNzXyhfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBtc2dfbWJveE1NREYuc2V0X2ZsYWdzKCdST0RGQScpCisgICAgICAgICAgICBtc2dfbWJveE1NREYuc2V0X2Zyb20oJ2Zvb0BiYXInKQorICAgICAgICAgICAgZm9yIGNsYXNzMl8gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgICAgIG1zZzIgPSBjbGFzczJfKG1zZ19tYm94TU1ERikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzIuZ2V0X2ZsYWdzKCksICdST0RGQScpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cyLmdldF9mcm9tKCksICdmb29AYmFyJykKKworICAgIGRlZiB0ZXN0X21ib3htbWRmX3RvX21oKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgbWJveE1lc3NhZ2UgYW5kIE1NREZNZXNzYWdlIHRvIE1ITWVzc2FnZQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIG1zZ19tYm94TU1ERiA9IGNsYXNzXyhfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBwYWlycyA9ICgoJ1InLCBbXSksICgnTycsIFsndW5zZWVuJ10pLCAoJ0QnLCBbJ3Vuc2VlbiddKSwKKyAgICAgICAgICAgICAgICAgICAgICgnRicsIFsndW5zZWVuJywgJ2ZsYWdnZWQnXSksCisgICAgICAgICAgICAgICAgICAgICAoJ0EnLCBbJ3Vuc2VlbicsICdyZXBsaWVkJ10pLAorICAgICAgICAgICAgICAgICAgICAgKCdST0RGQScsIFsncmVwbGllZCcsICdmbGFnZ2VkJ10pKQorICAgICAgICAgICAgZm9yIHNldHRpbmcsIHJlc3VsdCBpbiBwYWlyczoKKyAgICAgICAgICAgICAgICBtc2dfbWJveE1NREYuc2V0X2ZsYWdzKHNldHRpbmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWlsYm94Lk1ITWVzc2FnZShtc2dfbWJveE1NREYpLmdldF9zZXF1ZW5jZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X21ib3htbWRmX3RvX2JhYnlsKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgbWJveE1lc3NhZ2UgYW5kIE1NREZNZXNzYWdlIHRvIEJhYnlsTWVzc2FnZQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIG1zZyA9IGNsYXNzXyhfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBwYWlycyA9ICgoJ1InLCBbXSksICgnTycsIFsndW5zZWVuJ10pLAorICAgICAgICAgICAgICAgICAgICAgKCdEJywgWyd1bnNlZW4nLCAnZGVsZXRlZCddKSwgKCdGJywgWyd1bnNlZW4nXSksCisgICAgICAgICAgICAgICAgICAgICAoJ0EnLCBbJ3Vuc2VlbicsICdhbnN3ZXJlZCddKSwKKyAgICAgICAgICAgICAgICAgICAgICgnUk9ERkEnLCBbJ2RlbGV0ZWQnLCAnYW5zd2VyZWQnXSkpCisgICAgICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgICAgIG1zZy5zZXRfZmxhZ3Moc2V0dGluZykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guQmFieWxNZXNzYWdlKG1zZykuZ2V0X2xhYmVscygpLCByZXN1bHQpCisKKyAgICBkZWYgdGVzdF9taF90b19tYWlsZGlyKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgTUhNZXNzYWdlIHRvIE1haWxkaXJNZXNzYWdlCisgICAgICAgIHBhaXJzID0gKCgndW5zZWVuJywgJycpLCAoJ3JlcGxpZWQnLCAnUlMnKSwgKCdmbGFnZ2VkJywgJ0ZTJykpCisgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CisgICAgICAgICAgICBtc2cgPSBtYWlsYm94Lk1ITWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKHNldHRpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfZmxhZ3MoKSwgcmVzdWx0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X3N1YmRpcigpLCAnY3VyJykKKyAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9mbGFncygpLCAnRlInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfc3ViZGlyKCksICdjdXInKQorCisgICAgZGVmIHRlc3RfbWhfdG9fbWJveG1tZGYoc2VsZik6CisgICAgICAgICMgQ29udmVydCBNSE1lc3NhZ2UgdG8gbWJveE1lc3NhZ2UgYW5kIE1NREZNZXNzYWdlCisgICAgICAgIHBhaXJzID0gKCgndW5zZWVuJywgJ08nKSwgKCdyZXBsaWVkJywgJ1JPQScpLCAoJ2ZsYWdnZWQnLCAnUk9GJykpCisgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CisgICAgICAgICAgICBtc2cgPSBtYWlsYm94Lk1ITWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKHNldHRpbmcpCisgICAgICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNsYXNzXyhtc2cpLmdldF9mbGFncygpLCByZXN1bHQpCisgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgndW5zZWVuJykKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgncmVwbGllZCcpCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xhc3NfKG1zZykuZ2V0X2ZsYWdzKCksICdPRkEnKQorCisgICAgZGVmIHRlc3RfbWhfdG9fbWgoc2VsZik6CisgICAgICAgICMgQ29udmVydCBNSE1lc3NhZ2UgdG8gTUhNZXNzYWdlCisgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgndW5zZWVuJykKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgncmVwbGllZCcpCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guTUhNZXNzYWdlKG1zZykuZ2V0X3NlcXVlbmNlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsndW5zZWVuJywgJ3JlcGxpZWQnLCAnZmxhZ2dlZCddKQorCisgICAgZGVmIHRlc3RfbWhfdG9fYmFieWwoc2VsZik6CisgICAgICAgICMgQ29udmVydCBNSE1lc3NhZ2UgdG8gQmFieWxNZXNzYWdlCisgICAgICAgIHBhaXJzID0gKCgndW5zZWVuJywgWyd1bnNlZW4nXSksICgncmVwbGllZCcsIFsnYW5zd2VyZWQnXSksCisgICAgICAgICAgICAgICAgICgnZmxhZ2dlZCcsIFtdKSkKKyAgICAgICAgZm9yIHNldHRpbmcsIHJlc3VsdCBpbiBwYWlyczoKKyAgICAgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgICAgIG1zZy5hZGRfc2VxdWVuY2Uoc2V0dGluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnKS5nZXRfbGFiZWxzKCksIHJlc3VsdCkKKyAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnKS5nZXRfbGFiZWxzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyd1bnNlZW4nLCAnYW5zd2VyZWQnXSkKKworICAgIGRlZiB0ZXN0X2JhYnlsX3RvX21haWxkaXIoc2VsZik6CisgICAgICAgICMgQ29udmVydCBCYWJ5bE1lc3NhZ2UgdG8gTWFpbGRpck1lc3NhZ2UKKyAgICAgICAgcGFpcnMgPSAoKCd1bnNlZW4nLCAnJyksICgnZGVsZXRlZCcsICdTVCcpLCAoJ2ZpbGVkJywgJ1MnKSwKKyAgICAgICAgICAgICAgICAgKCdhbnN3ZXJlZCcsICdSUycpLCAoJ2ZvcndhcmRlZCcsICdQUycpLCAoJ2VkaXRlZCcsICdTJyksCisgICAgICAgICAgICAgICAgICgncmVzZW50JywgJ1BTJykpCisgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CisgICAgICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKHNldHRpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfZmxhZ3MoKSwgcmVzdWx0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X3N1YmRpcigpLCAnY3VyJykKKyAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBmb3IgbGFiZWwgaW4gKCd1bnNlZW4nLCAnZGVsZXRlZCcsICdmaWxlZCcsICdhbnN3ZXJlZCcsICdmb3J3YXJkZWQnLAorICAgICAgICAgICAgICAgICAgICAgICdlZGl0ZWQnLCAncmVzZW50Jyk6CisgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKGxhYmVsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfZmxhZ3MoKSwgJ1BSVCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9zdWJkaXIoKSwgJ2N1cicpCisKKyAgICBkZWYgdGVzdF9iYWJ5bF90b19tYm94bW1kZihzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IEJhYnlsTWVzc2FnZSB0byBtYm94TWVzc2FnZSBhbmQgTU1ERk1lc3NhZ2UKKyAgICAgICAgcGFpcnMgPSAoKCd1bnNlZW4nLCAnTycpLCAoJ2RlbGV0ZWQnLCAnUk9EJyksICgnZmlsZWQnLCAnUk8nKSwKKyAgICAgICAgICAgICAgICAgKCdhbnN3ZXJlZCcsICdST0EnKSwgKCdmb3J3YXJkZWQnLCAnUk8nKSwgKCdlZGl0ZWQnLCAnUk8nKSwKKyAgICAgICAgICAgICAgICAgKCdyZXNlbnQnLCAnUk8nKSkKKyAgICAgICAgZm9yIHNldHRpbmcsIHJlc3VsdCBpbiBwYWlyczoKKyAgICAgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgICAgIG1zZyA9IG1haWxib3guQmFieWxNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKHNldHRpbmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbGFzc18obXNnKS5nZXRfZmxhZ3MoKSwgcmVzdWx0KQorICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIGZvciBsYWJlbCBpbiAoJ3Vuc2VlbicsICdkZWxldGVkJywgJ2ZpbGVkJywgJ2Fuc3dlcmVkJywgJ2ZvcndhcmRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2VkaXRlZCcsICdyZXNlbnQnKToKKyAgICAgICAgICAgIG1zZy5hZGRfbGFiZWwobGFiZWwpCisgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbGFzc18obXNnKS5nZXRfZmxhZ3MoKSwgJ09EQScpCisKKyAgICBkZWYgdGVzdF9iYWJ5bF90b19taChzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IEJhYnlsTWVzc2FnZSB0byBNSE1lc3NhZ2UKKyAgICAgICAgcGFpcnMgPSAoKCd1bnNlZW4nLCBbJ3Vuc2VlbiddKSwgKCdkZWxldGVkJywgW10pLCAoJ2ZpbGVkJywgW10pLAorICAgICAgICAgICAgICAgICAoJ2Fuc3dlcmVkJywgWydyZXBsaWVkJ10pLCAoJ2ZvcndhcmRlZCcsIFtdKSwgKCdlZGl0ZWQnLCBbXSksCisgICAgICAgICAgICAgICAgICgncmVzZW50JywgW10pKQorICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnLmFkZF9sYWJlbChzZXR0aW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWlsYm94Lk1ITWVzc2FnZShtc2cpLmdldF9zZXF1ZW5jZXMoKSwgcmVzdWx0KQorICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIGZvciBsYWJlbCBpbiAoJ3Vuc2VlbicsICdkZWxldGVkJywgJ2ZpbGVkJywgJ2Fuc3dlcmVkJywgJ2ZvcndhcmRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2VkaXRlZCcsICdyZXNlbnQnKToKKyAgICAgICAgICAgIG1zZy5hZGRfbGFiZWwobGFiZWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFpbGJveC5NSE1lc3NhZ2UobXNnKS5nZXRfc2VxdWVuY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyd1bnNlZW4nLCAncmVwbGllZCddKQorCisgICAgZGVmIHRlc3RfYmFieWxfdG9fYmFieWwoc2VsZik6CisgICAgICAgICMgQ29udmVydCBCYWJ5bE1lc3NhZ2UgdG8gQmFieWxNZXNzYWdlCisgICAgICAgIG1zZyA9IG1haWxib3guQmFieWxNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnLnVwZGF0ZV92aXNpYmxlKCkKKyAgICAgICAgZm9yIGxhYmVsIGluICgndW5zZWVuJywgJ2RlbGV0ZWQnLCAnZmlsZWQnLCAnYW5zd2VyZWQnLCAnZm9yd2FyZGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAnZWRpdGVkJywgJ3Jlc2VudCcpOgorICAgICAgICAgICAgbXNnLmFkZF9sYWJlbChsYWJlbCkKKyAgICAgICAgbXNnMiA9IG1haWxib3guQmFieWxNZXNzYWdlKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cyLmdldF9sYWJlbHMoKSwgWyd1bnNlZW4nLCAnZGVsZXRlZCcsICdmaWxlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5zd2VyZWQnLCAnZm9yd2FyZGVkJywgJ2VkaXRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzZW50J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF92aXNpYmxlKCkua2V5cygpLCBtc2cyLmdldF92aXNpYmxlKCkua2V5cygpKQorICAgICAgICBmb3Iga2V5IGluIG1zZy5nZXRfdmlzaWJsZSgpLmtleXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF92aXNpYmxlKClba2V5XSwgbXNnMi5nZXRfdmlzaWJsZSgpW2tleV0pCisKKworY2xhc3MgVGVzdFByb3h5RmlsZUJhc2UoVGVzdEJhc2UpOgorCisgICAgZGVmIF90ZXN0X3JlYWQoc2VsZiwgcHJveHkpOgorICAgICAgICAjIFJlYWQgYnkgYnl0ZQorICAgICAgICBwcm94eS5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZCgpLCAnYmFyJykKKyAgICAgICAgcHJveHkuc2VlaygxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWQoKSwgJ2FyJykKKyAgICAgICAgcHJveHkuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWQoMiksICdiYScpCisgICAgICAgIHByb3h5LnNlZWsoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS5yZWFkKC0xKSwgJ2FyJykKKyAgICAgICAgcHJveHkuc2VlaygyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWQoMTAwMCksICdyJykKKworICAgIGRlZiBfdGVzdF9yZWFkbGluZShzZWxmLCBwcm94eSk6CisgICAgICAgICMgUmVhZCBieSBsaW5lCisgICAgICAgIHByb3h5LnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS5yZWFkbGluZSgpLCAnZm9vJyArIG9zLmxpbmVzZXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZGxpbmUoKSwgJ2JhcicgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWRsaW5lKCksICdmcmVkJyArIG9zLmxpbmVzZXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZGxpbmUoKSwgJ2JvYicpCisgICAgICAgIHByb3h5LnNlZWsoMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS5yZWFkbGluZSgpLCAnbycgKyBvcy5saW5lc2VwKQorICAgICAgICBwcm94eS5zZWVrKDYgKyAyICogbGVuKG9zLmxpbmVzZXApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWRsaW5lKCksICdmcmVkJyArIG9zLmxpbmVzZXApCisgICAgICAgIHByb3h5LnNlZWsoNiArIDIgKiBsZW4ob3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZGxpbmUoMiksICdmcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZGxpbmUoLTEwKSwgJ2VkJyArIG9zLmxpbmVzZXApCisKKyAgICBkZWYgX3Rlc3RfcmVhZGxpbmVzKHNlbGYsIHByb3h5KToKKyAgICAgICAgIyBSZWFkIG11bHRpcGxlIGxpbmVzCisgICAgICAgIHByb3h5LnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS5yZWFkbGluZXMoKSwgWydmb28nICsgb3MubGluZXNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhcicgKyBvcy5saW5lc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJlZCcgKyBvcy5saW5lc2VwLCAnYm9iJ10pCisgICAgICAgIHByb3h5LnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS5yZWFkbGluZXMoMiksIFsnZm9vJyArIG9zLmxpbmVzZXBdKQorICAgICAgICBwcm94eS5zZWVrKDMgKyBsZW4ob3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZGxpbmVzKDQgKyBsZW4ob3MubGluZXNlcCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnYmFyJyArIG9zLmxpbmVzZXAsICdmcmVkJyArIG9zLmxpbmVzZXBdKQorICAgICAgICBwcm94eS5zZWVrKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZGxpbmVzKDEwMDApLCBbb3MubGluZXNlcCwgJ2JhcicgKyBvcy5saW5lc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcmVkJyArIG9zLmxpbmVzZXAsICdib2InXSkKKworICAgIGRlZiBfdGVzdF9pdGVyYXRpb24oc2VsZiwgcHJveHkpOgorICAgICAgICAjIEl0ZXJhdGUgYnkgbGluZQorICAgICAgICBwcm94eS5zZWVrKDApCisgICAgICAgIGl0ZXJhdG9yID0gaXRlcihwcm94eSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0ZXJhdG9yKSwKKyAgICAgICAgICAgIFsnZm9vJyArIG9zLmxpbmVzZXAsICdiYXInICsgb3MubGluZXNlcCwgJ2ZyZWQnICsgb3MubGluZXNlcCwgJ2JvYiddKQorCisgICAgZGVmIF90ZXN0X3NlZWtfYW5kX3RlbGwoc2VsZiwgcHJveHkpOgorICAgICAgICAjIFNlZWsgYW5kIHVzZSB0ZWxsIHRvIGNoZWNrIHBvc2l0aW9uCisgICAgICAgIHByb3h5LnNlZWsoMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS50ZWxsKCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZChsZW4ob3MubGluZXNlcCkpLCBvcy5saW5lc2VwKQorICAgICAgICBwcm94eS5zZWVrKDIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZCgxICsgbGVuKG9zLmxpbmVzZXApKSwgJ3InICsgb3MubGluZXNlcCkKKyAgICAgICAgcHJveHkuc2VlaygtMyAtIGxlbihvcy5saW5lc2VwKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS5yZWFkKDMpLCAnYmFyJykKKyAgICAgICAgcHJveHkuc2VlaygyLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWQoKSwgJ28nICsgb3MubGluZXNlcCArICdiYXInICsgb3MubGluZXNlcCkKKyAgICAgICAgcHJveHkuc2VlaygxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZCgpLCAnJykKKworICAgIGRlZiBfdGVzdF9jbG9zZShzZWxmLCBwcm94eSk6CisgICAgICAgICMgQ2xvc2UgYSBmaWxlCisgICAgICAgIHByb3h5LmNsb3NlKCkKKyAgICAgICAgIyBJc3N1ZSAxMTcwMCBzdWJzZXF1ZW50IGNsb3NlcyBzaG91bGQgYmUgYSBuby1vcCwgbm90IGFuIGVycm9yLgorICAgICAgICBwcm94eS5jbG9zZSgpCisKKworY2xhc3MgVGVzdFByb3h5RmlsZShUZXN0UHJveHlGaWxlQmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9wYXRoID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLl9maWxlID0gb3BlbihzZWxmLl9wYXRoLCAnd2IrJykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCisgICAgICAgIHNlbGYuX2RlbGV0ZV9yZWN1cnNpdmVseShzZWxmLl9wYXRoKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZShzZWxmKToKKyAgICAgICAgIyBJbml0aWFsaXplIGFuZCBjaGVjayBwb3NpdGlvbgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28nKQorICAgICAgICBwb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBwcm94eTAgPSBtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eTAudGVsbCgpLCBwb3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZmlsZS50ZWxsKCksIHBvcykKKyAgICAgICAgcHJveHkxID0gbWFpbGJveC5fUHJveHlGaWxlKHNlbGYuX2ZpbGUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkxLnRlbGwoKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9maWxlLnRlbGwoKSwgcG9zKQorCisgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnYmFyJykKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkKG1haWxib3guX1Byb3h5RmlsZShzZWxmLl9maWxlKSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28lc2JhciVzZnJlZCVzYm9iJyAlIChvcy5saW5lc2VwLCBvcy5saW5lc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkbGluZShtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSkpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ2ZvbyVzYmFyJXNmcmVkJXNib2InICUgKG9zLmxpbmVzZXAsIG9zLmxpbmVzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmxpbmVzZXApKQorICAgICAgICBzZWxmLl90ZXN0X3JlYWRsaW5lcyhtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSkpCisKKyAgICBkZWYgdGVzdF9pdGVyYXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ2ZvbyVzYmFyJXNmcmVkJXNib2InICUgKG9zLmxpbmVzZXAsIG9zLmxpbmVzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmxpbmVzZXApKQorICAgICAgICBzZWxmLl90ZXN0X2l0ZXJhdGlvbihtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSkpCisKKyAgICBkZWYgdGVzdF9zZWVrX2FuZF90ZWxsKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28lc2JhciVzJyAlIChvcy5saW5lc2VwLCBvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9zZWVrX2FuZF90ZWxsKG1haWxib3guX1Byb3h5RmlsZShzZWxmLl9maWxlKSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28lc2JhciVzJyAlIChvcy5saW5lc2VwLCBvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9jbG9zZShtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSkpCisKKworY2xhc3MgVGVzdFBhcnRpYWxGaWxlKFRlc3RQcm94eUZpbGVCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3BhdGggPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuX2ZpbGUgPSBvcGVuKHNlbGYuX3BhdGgsICd3YisnKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5fZGVsZXRlX3JlY3Vyc2l2ZWx5KHNlbGYuX3BhdGgpCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXplKHNlbGYpOgorICAgICAgICAjIEluaXRpYWxpemUgYW5kIGNoZWNrIHBvc2l0aW9uCisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ2ZvbycgKyBvcy5saW5lc2VwICsgJ2JhcicpCisgICAgICAgIHBvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIHByb3h5ID0gbWFpbGJveC5fUGFydGlhbEZpbGUoc2VsZi5fZmlsZSwgMiwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS50ZWxsKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZmlsZS50ZWxsKCksIHBvcykKKworICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJyoqKmJhcioqKicpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZChtYWlsYm94Ll9QYXJ0aWFsRmlsZShzZWxmLl9maWxlLCAzLCA2KSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCchISEhIWZvbyVzYmFyJXNmcmVkJXNib2IhISEhIScgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChvcy5saW5lc2VwLCBvcy5saW5lc2VwLCBvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkbGluZShtYWlsYm94Ll9QYXJ0aWFsRmlsZShzZWxmLl9maWxlLCA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4ICsgMyAqIGxlbihvcy5saW5lc2VwKSkpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ2ZvbyVzYmFyJXNmcmVkJXNib2I/Pz8/PycgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChvcy5saW5lc2VwLCBvcy5saW5lc2VwLCBvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkbGluZXMobWFpbGJveC5fUGFydGlhbEZpbGUoc2VsZi5fZmlsZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgKyAzICogbGVuKG9zLmxpbmVzZXApKSkKKworICAgIGRlZiB0ZXN0X2l0ZXJhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnX19fX2ZvbyVzYmFyJXNmcmVkJXNib2IjIyMjJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKG9zLmxpbmVzZXAsIG9zLmxpbmVzZXAsIG9zLmxpbmVzZXApKQorICAgICAgICBzZWxmLl90ZXN0X2l0ZXJhdGlvbihtYWlsYm94Ll9QYXJ0aWFsRmlsZShzZWxmLl9maWxlLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNyArIDMgKiBsZW4ob3MubGluZXNlcCkpKQorCisgICAgZGVmIHRlc3Rfc2Vla19hbmRfdGVsbChzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnKCgoZm9vJXNiYXIlcyQkJCcgJSAob3MubGluZXNlcCwgb3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuX3Rlc3Rfc2Vla19hbmRfdGVsbChtYWlsYm94Ll9QYXJ0aWFsRmlsZShzZWxmLl9maWxlLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSArIDIgKiBsZW4ob3MubGluZXNlcCkpKQorCisgICAgZGVmIHRlc3RfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJyZmb28lc2JhciVzXicgJSAob3MubGluZXNlcCwgb3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2UobWFpbGJveC5fUGFydGlhbEZpbGUoc2VsZi5fZmlsZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ICsgMyAqIGxlbihvcy5saW5lc2VwKSkpCisKKworIyMgU3RhcnQ6IHRlc3RzIGZyb20gdGhlIG9yaWdpbmFsIG1vZHVsZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgorCitGUk9NXyA9ICJGcm9tIHNvbWUuYm9keUBkdW1teS5kb21haW4gIFNhdCBKdWwgMjQgMTM6NDM6MzUgMjAwNFxuIgorRFVNTVlfTUVTU0FHRSA9ICIiIlwKK0Zyb206IHNvbWUuYm9keUBkdW1teS5kb21haW4KK1RvOiBtZUBteS5kb21haW4KK1N1YmplY3Q6IFNpbXBsZSBUZXN0CisKK1RoaXMgaXMgYSBkdW1teSBtZXNzYWdlLgorIiIiCisKK2NsYXNzIE1haWxkaXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgY3JlYXRlIGEgbmV3IG1haWxkaXIgbWFpbGJveCB0byB3b3JrIHdpdGg6CisgICAgICAgIHNlbGYuX2RpciA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzZWxmLl9kaXIpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLl9kaXIpCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNlbGYuX2Rpcik6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYuX2RpcikKKyAgICAgICAgb3MubWtkaXIoc2VsZi5fZGlyKQorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCAiY3VyIikpCisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJ0bXAiKSkKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKHNlbGYuX2RpciwgIm5ldyIpKQorICAgICAgICBzZWxmLl9jb3VudGVyID0gMQorICAgICAgICBzZWxmLl9tc2dmaWxlcyA9IFtdCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIG1hcChvcy51bmxpbmssIHNlbGYuX21zZ2ZpbGVzKQorICAgICAgICB0ZXN0X3N1cHBvcnQucm1kaXIob3MucGF0aC5qb2luKHNlbGYuX2RpciwgImN1ciIpKQorICAgICAgICB0ZXN0X3N1cHBvcnQucm1kaXIob3MucGF0aC5qb2luKHNlbGYuX2RpciwgInRtcCIpKQorICAgICAgICB0ZXN0X3N1cHBvcnQucm1kaXIob3MucGF0aC5qb2luKHNlbGYuX2RpciwgIm5ldyIpKQorICAgICAgICB0ZXN0X3N1cHBvcnQucm1kaXIoc2VsZi5fZGlyKQorCisgICAgZGVmIGNyZWF0ZU1lc3NhZ2Uoc2VsZiwgZGlyLCBtYm94PUZhbHNlKToKKyAgICAgICAgdCA9IGludCh0aW1lLnRpbWUoKSAlIDEwMDAwMDApCisgICAgICAgIHBpZCA9IHNlbGYuX2NvdW50ZXIKKyAgICAgICAgc2VsZi5fY291bnRlciArPSAxCisgICAgICAgIGZpbGVuYW1lID0gb3MuZXh0c2VwLmpvaW4oKHN0cih0KSwgc3RyKHBpZCksICJteWhvc3RuYW1lIiwgIm15ZG9tYWluIikpCisgICAgICAgIHRtcG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCAidG1wIiwgZmlsZW5hbWUpCisgICAgICAgIG5ld25hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCBkaXIsIGZpbGVuYW1lKQorICAgICAgICB3aXRoIG9wZW4odG1wbmFtZSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuX21zZ2ZpbGVzLmFwcGVuZCh0bXBuYW1lKQorICAgICAgICAgICAgaWYgbWJveDoKKyAgICAgICAgICAgICAgICBmcC53cml0ZShGUk9NXykKKyAgICAgICAgICAgIGZwLndyaXRlKERVTU1ZX01FU1NBR0UpCisgICAgICAgIGlmIGhhc2F0dHIob3MsICJsaW5rIik6CisgICAgICAgICAgICBvcy5saW5rKHRtcG5hbWUsIG5ld25hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3aXRoIG9wZW4obmV3bmFtZSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBmcC53cml0ZShEVU1NWV9NRVNTQUdFKQorICAgICAgICBzZWxmLl9tc2dmaWxlcy5hcHBlbmQobmV3bmFtZSkKKyAgICAgICAgcmV0dXJuIHRtcG5hbWUKKworICAgIGRlZiB0ZXN0X2VtcHR5X21haWxkaXIoc2VsZik6CisgICAgICAgICIiIlRlc3QgYW4gZW1wdHkgbWFpbGRpciBtYWlsYm94IiIiCisgICAgICAgICMgVGVzdCBmb3IgcmVncmVzc2lvbiBvbiBidWcgIzExNzQ5MDoKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGJveGVzIGF0dHJpYnV0ZSBhY3R1YWxseSBnZXRzIHNldC4KKyAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICNzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzZWxmLm1ib3gsICJib3hlcyIpKQorICAgICAgICAjc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLm1ib3guYm94ZXMpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5tYm94Lm5leHQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLm1ib3gubmV4dCgpLCBOb25lKQorCisgICAgZGVmIHRlc3Rfbm9uZW1wdHlfbWFpbGRpcl9jdXIoc2VsZik6CisgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgiY3VyIikKKyAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICNzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveC5ib3hlcykgPT0gMSkKKyAgICAgICAgbXNnID0gc2VsZi5tYm94Lm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KG1zZywgTm9uZSkKKyAgICAgICAgbXNnLmZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLm1ib3gubmV4dCgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYubWJveC5uZXh0KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9ub25lbXB0eV9tYWlsZGlyX25ldyhzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJuZXciKQorICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5tYm94LmJveGVzKSA9PSAxKQorICAgICAgICBtc2cgPSBzZWxmLm1ib3gubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QobXNnLCBOb25lKQorICAgICAgICBtc2cuZnAuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYubWJveC5uZXh0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5tYm94Lm5leHQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfYm90aChzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJjdXIiKQorICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoIm5ldyIpCisgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAjc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLm1ib3guYm94ZXMpID09IDIpCisgICAgICAgIG1zZyA9IHNlbGYubWJveC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChtc2csIE5vbmUpCisgICAgICAgIG1zZy5mcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IHNlbGYubWJveC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChtc2csIE5vbmUpCisgICAgICAgIG1zZy5mcC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5tYm94Lm5leHQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLm1ib3gubmV4dCgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfdW5peF9tYm94KHNlbGYpOgorICAgICAgICAjIyMgc2hvdWxkIGJlIGJldHRlciEKKyAgICAgICAgaW1wb3J0IGVtYWlsLnBhcnNlcgorICAgICAgICBmbmFtZSA9IHNlbGYuY3JlYXRlTWVzc2FnZSgiY3VyIiwgVHJ1ZSkKKyAgICAgICAgbiA9IDAKKyAgICAgICAgZmlkID0gb3BlbihmbmFtZSkKKyAgICAgICAgZm9yIG1zZyBpbiBtYWlsYm94LlBvcnRhYmxlVW5peE1haWxib3goZmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbC5wYXJzZXIuUGFyc2VyKCkucGFyc2UpOgorICAgICAgICAgICAgbiArPSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1sic3ViamVjdCJdLCAiU2ltcGxlIFRlc3QiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3RyKG1zZykpLCBsZW4oRlJPTV8pK2xlbihEVU1NWV9NRVNTQUdFKSkKKyAgICAgICAgZmlkLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuLCAxKQorCisjIyBFbmQ6IGNsYXNzZXMgZnJvbSB0aGUgb3JpZ2luYWwgbW9kdWxlIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkuCisKKworX3NhbXBsZV9tZXNzYWdlID0gIiIiXAorUmV0dXJuLVBhdGg6IDxna2pAZ3JlZ29yeWtqb2huc29uLmNvbT4KK1gtT3JpZ2luYWwtVG86IGdraitwZXJzb25AbG9jYWxob3N0CitEZWxpdmVyZWQtVG86IGdraitwZXJzb25AbG9jYWxob3N0CitSZWNlaXZlZDogZnJvbSBsb2NhbGhvc3QgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSkKKyAgICAgICAgYnkgYW5keS5ncmVnb3J5a2pvaG5zb24uY29tIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIDM1NkVEOUREMTcKKyAgICAgICAgZm9yIDxna2orcGVyc29uQGxvY2FsaG9zdD47IFdlZCwgMTMgSnVsIDIwMDUgMTc6MjM6MTYgLTA0MDAgKEVEVCkKK0RlbGl2ZXJlZC1UbzogZ2tqQHN1bmRhbmNlLmdyZWdvcnlram9obnNvbi5jb20KK1JlY2VpdmVkOiBmcm9tIGxvY2FsaG9zdCBbMTI3LjAuMC4xXQorICAgICAgICBieSBsb2NhbGhvc3Qgd2l0aCBQT1AzIChmZXRjaG1haWwtNi4yLjUpCisgICAgICAgIGZvciBna2orcGVyc29uQGxvY2FsaG9zdCAoc2luZ2xlLWRyb3ApOyBXZWQsIDEzIEp1bCAyMDA1IDE3OjIzOjE2IC0wNDAwIChFRFQpCitSZWNlaXZlZDogZnJvbSBhbmR5LmdyZWdvcnlram9obnNvbi5jb20gKGFuZHkuZ3JlZ29yeWtqb2huc29uLmNvbSBbNjQuMzIuMjM1LjIyOF0pCisgICAgICAgIGJ5IHN1bmRhbmNlLmdyZWdvcnlram9obnNvbi5jb20gKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgNUIwNTYzMTY3NDYKKyAgICAgICAgZm9yIDxna2pAZ3JlZ29yeWtqb2huc29uLmNvbT47IFdlZCwgMTMgSnVsIDIwMDUgMTc6MjM6MTEgLTA0MDAgKEVEVCkKK1JlY2VpdmVkOiBieSBhbmR5LmdyZWdvcnlram9obnNvbi5jb20gKFBvc3RmaXgsIGZyb20gdXNlcmlkIDEwMDApCisgICAgICAgIGlkIDQ5MENEOUREMTc7IFdlZCwgMTMgSnVsIDIwMDUgMTc6MjM6MTEgLTA0MDAgKEVEVCkKK0RhdGU6IFdlZCwgMTMgSnVsIDIwMDUgMTc6MjM6MTEgLTA0MDAKK0Zyb206ICJHcmVnb3J5IEsuIEpvaG5zb24iIDxna2pAZ3JlZ29yeWtqb2huc29uLmNvbT4KK1RvOiBna2pAZ3JlZ29yeWtqb2huc29uLmNvbQorU3ViamVjdDogU2FtcGxlIG1lc3NhZ2UKK01lc3NhZ2UtSUQ6IDwyMDA1MDcxMzIxMjMxMS5HQzQ3MDFAYW5keS5ncmVnb3J5a2pvaG5zb24uY29tPgorTWltZS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iTk11TXo5bnQwNXc4MGQ0KyIKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZQorVXNlci1BZ2VudDogTXV0dC8xLjUuOWkKKworCistLU5NdU16OW50MDV3ODBkNCsKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lCisKK1RoaXMgaXMgYSBzYW1wbGUgbWVzc2FnZS4KKworLS0KK0dyZWdvcnkgSy4gSm9obnNvbgorCistLU5NdU16OW50MDV3ODBkNCsKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0idGV4dC5neiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCitINHNJQ00yRDFVSUFBM1JsZUhRQUM4bklMRllBb2tTRmt0U0tFb1cwekp4VVBhN3d6SklNaFpMeWZJV2N6THpVWWowdUFIVHMKKzNGWWxBQUFBCisKKy0tTk11TXo5bnQwNXc4MGQ0Ky0tCisiIiIKKworX3NhbXBsZV9oZWFkZXJzID0geworICAgICJSZXR1cm4tUGF0aCI6Ijxna2pAZ3JlZ29yeWtqb2huc29uLmNvbT4iLAorICAgICJYLU9yaWdpbmFsLVRvIjoiZ2tqK3BlcnNvbkBsb2NhbGhvc3QiLAorICAgICJEZWxpdmVyZWQtVG8iOiJna2orcGVyc29uQGxvY2FsaG9zdCIsCisgICAgIlJlY2VpdmVkIjoiIiJmcm9tIGxvY2FsaG9zdCAobG9jYWxob3N0IFsxMjcuMC4wLjFdKQorICAgICAgICBieSBhbmR5LmdyZWdvcnlram9obnNvbi5jb20gKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgMzU2RUQ5REQxNworICAgICAgICBmb3IgPGdraitwZXJzb25AbG9jYWxob3N0PjsgV2VkLCAxMyBKdWwgMjAwNSAxNzoyMzoxNiAtMDQwMCAoRURUKSIiIiwKKyAgICAiRGVsaXZlcmVkLVRvIjoiZ2tqQHN1bmRhbmNlLmdyZWdvcnlram9obnNvbi5jb20iLAorICAgICJSZWNlaXZlZCI6IiIiZnJvbSBsb2NhbGhvc3QgWzEyNy4wLjAuMV0KKyAgICAgICAgYnkgbG9jYWxob3N0IHdpdGggUE9QMyAoZmV0Y2htYWlsLTYuMi41KQorICAgICAgICBmb3IgZ2tqK3BlcnNvbkBsb2NhbGhvc3QgKHNpbmdsZS1kcm9wKTsgV2VkLCAxMyBKdWwgMjAwNSAxNzoyMzoxNiAtMDQwMCAoRURUKSIiIiwKKyAgICAiUmVjZWl2ZWQiOiIiImZyb20gYW5keS5ncmVnb3J5a2pvaG5zb24uY29tIChhbmR5LmdyZWdvcnlram9obnNvbi5jb20gWzY0LjMyLjIzNS4yMjhdKQorICAgICAgICBieSBzdW5kYW5jZS5ncmVnb3J5a2pvaG5zb24uY29tIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIDVCMDU2MzE2NzQ2CisgICAgICAgIGZvciA8Z2tqQGdyZWdvcnlram9obnNvbi5jb20+OyBXZWQsIDEzIEp1bCAyMDA1IDE3OjIzOjExIC0wNDAwIChFRFQpIiIiLAorICAgICJSZWNlaXZlZCI6IiIiYnkgYW5keS5ncmVnb3J5a2pvaG5zb24uY29tIChQb3N0Zml4LCBmcm9tIHVzZXJpZCAxMDAwKQorICAgICAgICBpZCA0OTBDRDlERDE3OyBXZWQsIDEzIEp1bCAyMDA1IDE3OjIzOjExIC0wNDAwIChFRFQpIiIiLAorICAgICJEYXRlIjoiV2VkLCAxMyBKdWwgMjAwNSAxNzoyMzoxMSAtMDQwMCIsCisgICAgIkZyb20iOiIiIiJHcmVnb3J5IEsuIEpvaG5zb24iIDxna2pAZ3JlZ29yeWtqb2huc29uLmNvbT4iIiIsCisgICAgIlRvIjoiZ2tqQGdyZWdvcnlram9obnNvbi5jb20iLAorICAgICJTdWJqZWN0IjoiU2FtcGxlIG1lc3NhZ2UiLAorICAgICJNaW1lLVZlcnNpb24iOiIxLjAiLAorICAgICJDb250ZW50LVR5cGUiOiIiIm11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ik5NdU16OW50MDV3ODBkNCtcIiIiIiwKKyAgICAiQ29udGVudC1EaXNwb3NpdGlvbiI6ImlubGluZSIsCisgICAgIlVzZXItQWdlbnQiOiAiTXV0dC8xLjUuOWkiIH0KKworX3NhbXBsZV9wYXlsb2FkcyA9ICgiIiJUaGlzIGlzIGEgc2FtcGxlIG1lc3NhZ2UuCisKKy0tCitHcmVnb3J5IEsuIEpvaG5zb24KKyIiIiwKKyIiIkg0c0lDTTJEMVVJQUEzUmxlSFFBQzhuSUxGWUFva1NGa3RTS0VvVzB6SnhVUGE3d3pKSU1oWkx5ZklXY3pMelVZajB1QUhUcworM0ZZbEFBQUEKKyIiIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdHMgPSAoVGVzdE1haWxib3hTdXBlcmNsYXNzLCBUZXN0TWFpbGRpciwgVGVzdE1ib3gsIFRlc3RNTURGLCBUZXN0TUgsCisgICAgICAgICAgICAgVGVzdEJhYnlsLCBUZXN0TWVzc2FnZSwgVGVzdE1haWxkaXJNZXNzYWdlLCBUZXN0TWJveE1lc3NhZ2UsCisgICAgICAgICAgICAgVGVzdE1ITWVzc2FnZSwgVGVzdEJhYnlsTWVzc2FnZSwgVGVzdE1NREZNZXNzYWdlLAorICAgICAgICAgICAgIFRlc3RNZXNzYWdlQ29udmVyc2lvbiwgVGVzdFByb3h5RmlsZSwgVGVzdFBhcnRpYWxGaWxlLAorICAgICAgICAgICAgIE1haWxkaXJUZXN0Q2FzZSkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKyAgICB0ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFpbGJveC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWlsYm94LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTlkNjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFpbGJveC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFpbGJveC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWlsYm94LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTlkNjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFpbGJveC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFyc2hhbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hcnNoYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlOGVhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hcnNoYWwucHkKQEAgLTAsMCArMSwzMzIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IG1hcnNoYWwKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCisKK2NsYXNzIEludFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9pbnRzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhlIGZ1bGwgcmFuZ2Ugb2YgUHl0aG9uIGludHMuCisgICAgICAgIG4gPSBzeXMubWF4aW50CisgICAgICAgIHdoaWxlIG46CisgICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gKC1uLCBuKToKKyAgICAgICAgICAgICAgICBzID0gbWFyc2hhbC5kdW1wcyhleHBlY3RlZCkKKyAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorICAgICAgICAgICAgICAgIG1hcnNoYWwuZHVtcChleHBlY3RlZCwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKKyAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisgICAgICAgICAgICBuID0gbiA+PiAxCisgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfaW50NjQoc2VsZik6CisgICAgICAgICMgU2ltdWxhdGUgaW50IG1hcnNoYWxpbmcgb24gYSA2NC1iaXQgYm94LiAgVGhpcyBpcyBtb3N0IGludGVyZXN0aW5nIGlmCisgICAgICAgICMgd2UncmUgcnVubmluZyB0aGUgdGVzdCBvbiBhIDMyLWJpdCBib3gsIG9mIGNvdXJzZS4KKworICAgICAgICBkZWYgdG9fbGl0dGxlX2VuZGlhbl9zdHJpbmcodmFsdWUsIG5ieXRlcyk6CisgICAgICAgICAgICBieXRlcyA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShuYnl0ZXMpOgorICAgICAgICAgICAgICAgIGJ5dGVzLmFwcGVuZChjaHIodmFsdWUgJiAweGZmKSkKKyAgICAgICAgICAgICAgICB2YWx1ZSA+Pj0gOAorICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4oYnl0ZXMpCisKKyAgICAgICAgbWF4aW50NjQgPSAoMUwgPDwgNjMpIC0gMQorICAgICAgICBtaW5pbnQ2NCA9IC1tYXhpbnQ2NC0xCisKKyAgICAgICAgZm9yIGJhc2UgaW4gbWF4aW50NjQsIG1pbmludDY0LCAtbWF4aW50NjQsIC0obWluaW50NjQgPj4gMSk6CisgICAgICAgICAgICB3aGlsZSBiYXNlOgorICAgICAgICAgICAgICAgIHMgPSAnSScgKyB0b19saXR0bGVfZW5kaWFuX3N0cmluZyhiYXNlLCA4KQorICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZHMocykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2UsIGdvdCkKKyAgICAgICAgICAgICAgICBpZiBiYXNlID09IC0xOiAgIyBhIGZpeGVkLXBvaW50IGZvciBzaGlmdGluZyByaWdodCAxCisgICAgICAgICAgICAgICAgICAgIGJhc2UgPSAwCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYmFzZSA+Pj0gMQorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgZm9yIGIgaW4gKFRydWUsIEZhbHNlKToKKyAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgbmV3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGIpLCB0eXBlKG5ldykpCisgICAgICAgICAgICBtYXJzaGFsLmR1bXAoYiwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKKyAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBuZXcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYiksIHR5cGUobmV3KSkKKworY2xhc3MgRmxvYXRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZmxvYXRzKHNlbGYpOgorICAgICAgICAjIFRlc3QgYSBmZXcgZmxvYXRzCisgICAgICAgIHNtYWxsID0gMWUtMjUKKyAgICAgICAgbiA9IHN5cy5tYXhpbnQgKiAzLjdlMjUwCisgICAgICAgIHdoaWxlIG4gPiBzbWFsbDoKKyAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiAoLW4sIG4pOgorICAgICAgICAgICAgICAgIGYgPSBmbG9hdChleHBlY3RlZCkKKyAgICAgICAgICAgICAgICBzID0gbWFyc2hhbC5kdW1wcyhmKQorICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZHMocykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKKyAgICAgICAgICAgICAgICBtYXJzaGFsLmR1bXAoZiwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKKyAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKKyAgICAgICAgICAgIG4gLz0gMTIzLjQ1NjcKKworICAgICAgICBmID0gMC4wCisgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGYsIDIpCisgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZHMocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCisgICAgICAgICMgYW5kIHdpdGggdmVyc2lvbiA8PSAxIChmbG9hdHMgbWFyc2hhbGxlZCBkaWZmZXJlbnRseSB0aGVuKQorICAgICAgICBzID0gbWFyc2hhbC5kdW1wcyhmLCAxKQorICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQorCisgICAgICAgIG4gPSBzeXMubWF4aW50ICogMy43ZS0yNTAKKyAgICAgICAgd2hpbGUgbiA8IHNtYWxsOgorICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluICgtbiwgbik6CisgICAgICAgICAgICAgICAgZiA9IGZsb2F0KGV4cGVjdGVkKQorCisgICAgICAgICAgICAgICAgcyA9IG1hcnNoYWwuZHVtcHMoZikKKyAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCisKKyAgICAgICAgICAgICAgICBzID0gbWFyc2hhbC5kdW1wcyhmLCAxKQorICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZHMocykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKKworICAgICAgICAgICAgICAgIG1hcnNoYWwuZHVtcChmLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQorICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQorCisgICAgICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGYsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIiksIDEpCisgICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCisgICAgICAgICAgICBuICo9IDEyMy40NTY3CisgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCitjbGFzcyBTdHJpbmdUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gW3UiIiwgdSJBbmRy6CBQcmV2aW4iLCB1ImFiYyIsIHUiICIqMTAwMDBdOgorICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBuZXcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHR5cGUobmV3KSkKKyAgICAgICAgICAgIG1hcnNoYWwuZHVtcChzLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQorICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIG5ldykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgdHlwZShuZXcpKQorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gWyIiLCAiQW5kcuggUHJldmluIiwgImFiYyIsICIgIioxMDAwMF06CisgICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIG5ldykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgdHlwZShuZXcpKQorICAgICAgICAgICAgbWFyc2hhbC5kdW1wKHMsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHMpLCB0eXBlKG5ldykpCisgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfYnVmZmVyKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiBbIiIsICJBbmRy6CBQcmV2aW4iLCAiYWJjIiwgIiAiKjEwMDAwXToKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKCJidWZmZXIuLiBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICAgICAgYiA9IGJ1ZmZlcihzKQorICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKGIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBuZXcpCisgICAgICAgICAgICBtYXJzaGFsLmR1bXAoYiwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKKyAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBuZXcpCisgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCitjbGFzcyBFeGNlcHRpb25UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKFN0b3BJdGVyYXRpb24pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFN0b3BJdGVyYXRpb24sIG5ldykKKworY2xhc3MgQ29kZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jb2RlKHNlbGYpOgorICAgICAgICBjbyA9IEV4Y2VwdGlvblRlc3RDYXNlLnRlc3RfZXhjZXB0aW9ucy5mdW5jX2NvZGUKKyAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKGNvKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbywgbmV3KQorCitjbGFzcyBDb250YWluZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZCA9IHsnYXN0cmluZyc6ICdmb29AYmFyLmJhei5zcGFtJywKKyAgICAgICAgICdhZmxvYXQnOiA3MjgzLjQzLAorICAgICAgICAgJ2FuaW50JzogMioqMjAsCisgICAgICAgICAnYXNob3J0bG9uZyc6IDJMLAorICAgICAgICAgJ2FsaXN0JzogWycuenl4LjQxJ10sCisgICAgICAgICAnYXR1cGxlJzogKCcuenl4LjQxJywpKjEwLAorICAgICAgICAgJ2Fib29sZWFuJzogRmFsc2UsCisgICAgICAgICAnYXVuaWNvZGUnOiB1IkFuZHLoIFByZXZpbiIKKyAgICAgICAgIH0KKyAgICBkZWYgdGVzdF9kaWN0KHNlbGYpOgorICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMoc2VsZi5kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQsIG5ldykKKyAgICAgICAgbWFyc2hhbC5kdW1wKHNlbGYuZCwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKKyAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLCBuZXcpCisgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfbGlzdChzZWxmKToKKyAgICAgICAgbHN0ID0gc2VsZi5kLml0ZW1zKCkKKyAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKGxzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBuZXcpCisgICAgICAgIG1hcnNoYWwuZHVtcChsc3QsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgbmV3KQorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X3R1cGxlKHNlbGYpOgorICAgICAgICB0ID0gdHVwbGUoc2VsZi5kLmtleXMoKSkKKyAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIG5ldykKKyAgICAgICAgbWFyc2hhbC5kdW1wKHQsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIG5ldykKKyAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9zZXRzKHNlbGYpOgorICAgICAgICBmb3IgY29uc3RydWN0b3IgaW4gKHNldCwgZnJvemVuc2V0KToKKyAgICAgICAgICAgIHQgPSBjb25zdHJ1Y3RvcihzZWxmLmQua2V5cygpKQorICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBuZXcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShuZXcsIGNvbnN0cnVjdG9yKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQodCksIGlkKG5ldykpCisgICAgICAgICAgICBtYXJzaGFsLmR1bXAodCwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKKyAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBuZXcpCisgICAgICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworY2xhc3MgQnVnc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9idWdfNTg4ODQ1MihzZWxmKToKKyAgICAgICAgIyBTaW1wbGUtbWluZGVkIGNoZWNrIGZvciBTRiA1ODg0NTI6IERlYnVnIGJ1aWxkIGNyYXNoZXMKKyAgICAgICAgbWFyc2hhbC5kdW1wcyhbMTI4XSAqIDEwMDApCisKKyAgICBkZWYgdGVzdF9wYXRjaF84NzMyMjQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgbWFyc2hhbC5sb2FkcywgJzAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIG1hcnNoYWwubG9hZHMsICdmJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLCBtYXJzaGFsLmxvYWRzLCBtYXJzaGFsLmR1bXBzKDVMKVs6LTFdKQorCisgICAgZGVmIHRlc3RfdmVyc2lvbl9hcmd1bWVudChzZWxmKToKKyAgICAgICAgIyBQeXRob24gMi40LjAgY3Jhc2hlcyBmb3IgYW55IGNhbGwgdG8gbWFyc2hhbC5kdW1wcyh4LCB5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyg1LCAwKSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKDUsIDEpKSwgNSkKKworICAgIGRlZiB0ZXN0X2Z1enooc2VsZik6CisgICAgICAgICMgc2ltcGxlIHRlc3QgdGhhdCBpdCdzIGF0IGxlYXN0IG5vdCAqdG90YWxseSogdHJpdmlhbCB0bworICAgICAgICAjIGNyYXNoIGZyb20gYmFkIG1hcnNoYWwgZGF0YQorICAgICAgICBmb3IgYyBpbiBbY2hyKGkpIGZvciBpIGluIHJhbmdlKDI1NildOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1hcnNoYWwubG9hZHMoYykKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfbG9hZHNfcmVjdXJzaW9uKHNlbGYpOgorICAgICAgICBzID0gJ2MnICsgKCdYJyAqIDQqNCkgKyAneycgKiAyKioyMAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXJzaGFsLmxvYWRzLCBzKQorCisgICAgZGVmIHRlc3RfcmVjdXJzaW9uX2xpbWl0KHNlbGYpOgorICAgICAgICAjIENyZWF0ZSBhIGRlZXBseSBuZXN0ZWQgc3RydWN0dXJlLgorICAgICAgICBoZWFkID0gbGFzdCA9IFtdCisgICAgICAgICMgVGhlIG1heCBzdGFjayBkZXB0aCBzaG91bGQgbWF0Y2ggdGhlIHZhbHVlIGluIFB5dGhvbi9tYXJzaGFsLmMuCisgICAgICAgIE1BWF9NQVJTSEFMX1NUQUNLX0RFUFRIID0gMjAwMAorICAgICAgICBmb3IgaSBpbiByYW5nZShNQVhfTUFSU0hBTF9TVEFDS19ERVBUSCAtIDIpOgorICAgICAgICAgICAgbGFzdC5hcHBlbmQoWzBdKQorICAgICAgICAgICAgbGFzdCA9IGxhc3RbLTFdCisKKyAgICAgICAgIyBWZXJpZnkgd2UgZG9uJ3QgYmxvdyBvdXQgdGhlIHN0YWNrIHdpdGggZHVtcHMvbG9hZC4KKyAgICAgICAgZGF0YSA9IG1hcnNoYWwuZHVtcHMoaGVhZCkKKyAgICAgICAgbmV3X2hlYWQgPSBtYXJzaGFsLmxvYWRzKGRhdGEpCisgICAgICAgICMgRG9uJ3QgdXNlID09IHRvIGNvbXBhcmUgb2JqZWN0cywgaXQgY2FuIGV4Y2VlZCB0aGUgcmVjdXJzaW9uIGxpbWl0LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuZXdfaGVhZCksIGxlbihoZWFkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmV3X2hlYWRbMF0pLCBsZW4oaGVhZFswXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5ld19oZWFkWy0xXSksIGxlbihoZWFkWy0xXSkpCisKKyAgICAgICAgbGFzdC5hcHBlbmQoWzBdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXJzaGFsLmR1bXBzLCBoZWFkKQorCisgICAgZGVmIHRlc3RfZXhhY3RfdHlwZV9tYXRjaChzZWxmKToKKyAgICAgICAgIyBGb3JtZXIgYnVnOgorICAgICAgICAjICAgPj4+IGNsYXNzIEludChpbnQpOiBwYXNzCisgICAgICAgICMgICA+Pj4gdHlwZShsb2FkcyhkdW1wcyhJbnQoKSkpKQorICAgICAgICAjICAgPHR5cGUgJ2ludCc+CisgICAgICAgIGZvciB0eXAgaW4gKGludCwgbG9uZywgZmxvYXQsIGNvbXBsZXgsIHR1cGxlLCBsaXN0LCBkaWN0LCBzZXQsIGZyb3plbnNldCk6CisgICAgICAgICAgICAjIE5vdGU6IHN0ciBhbmQgdW5pY29kZSBzdWJjbGFzc2VzIGFyZSBub3QgdGVzdGVkIGJlY2F1c2UgdGhleSBnZXQgaGFuZGxlZAorICAgICAgICAgICAgIyBieSBtYXJzaGFsJ3Mgcm91dGluZXMgZm9yIG9iamVjdHMgc3VwcG9ydGluZyB0aGUgYnVmZmVyIEFQSS4KKyAgICAgICAgICAgIHN1YnR5cCA9IHR5cGUoJ3N1YnR5cCcsICh0eXAsKSwge30pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXJzaGFsLmR1bXBzLCBzdWJ0eXAoKSkKKworICAgICMgSXNzdWUgIzE3OTIgaW50cm9kdWNlZCBhIGNoYW5nZSBpbiBob3cgbWFyc2hhbCBpbmNyZWFzZXMgdGhlIHNpemUgb2YgaXRzCisgICAgIyBpbnRlcm5hbCBidWZmZXI7IHRoaXMgdGVzdCBlbnN1cmVzIHRoYXQgdGhlIG5ldyBjb2RlIGlzIGV4ZXJjaXNlZC4KKyAgICBkZWYgdGVzdF9sYXJnZV9tYXJzaGFsKHNlbGYpOgorICAgICAgICBzaXplID0gaW50KDFlNikKKyAgICAgICAgdGVzdFN0cmluZyA9ICdhYmMnICogc2l6ZQorICAgICAgICBtYXJzaGFsLmR1bXBzKHRlc3RTdHJpbmcpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2xvbmdzKHNlbGYpOgorICAgICAgICAjIElzc3VlICM3MDE5OiBtYXJzaGFsLmxvYWRzIHNob3VsZG4ndCBwcm9kdWNlIHVubm9ybWFsaXplZCBQeUxvbmdzCisgICAgICAgIGludmFsaWRfc3RyaW5nID0gJ2xceDAyXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWFyc2hhbC5sb2FkcywgaW52YWxpZF9zdHJpbmcpCisKK0xBUkdFX1NJWkUgPSAyKiozMQorY2hhcmFjdGVyX3NpemUgPSA0IGlmIHN5cy5tYXh1bmljb2RlID4gMHhGRkZGIGVsc2UgMgorcG9pbnRlcl9zaXplID0gOCBpZiBzeXMubWF4c2l6ZSA+IDB4RkZGRkZGRkYgZWxzZSA0CisKK0B1bml0dGVzdC5za2lwSWYoTEFSR0VfU0laRSA+IHN5cy5tYXhzaXplLCAidGVzdCBjYW5ub3QgcnVuIG9uIDMyLWJpdCBzeXN0ZW1zIikKK2NsYXNzIExhcmdlVmFsdWVzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBjaGVja191bm1hcnNoYWxsYWJsZShzZWxmLCBkYXRhKToKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3diJykKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3Rfc3VwcG9ydC51bmxpbmssIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHdpdGggZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hcnNoYWwuZHVtcCwgZGF0YSwgZikKKworICAgIEB0ZXN0X3N1cHBvcnQucHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPUxBUkdFX1NJWkUsIG1lbXVzZT0xLCBkcnlfcnVuPUZhbHNlKQorICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmLCBzaXplKToKKyAgICAgICAgc2VsZi5jaGVja191bm1hcnNoYWxsYWJsZSgneCcgKiBzaXplKQorCisgICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9TEFSR0VfU0laRSwKKyAgICAgICAgICAgIG1lbXVzZT1jaGFyYWN0ZXJfc2l6ZSwgZHJ5X3J1bj1GYWxzZSkKKyAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKHUneCcgKiBzaXplKQorCisgICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9TEFSR0VfU0laRSwKKyAgICAgICAgICAgIG1lbXVzZT1wb2ludGVyX3NpemUsIGRyeV9ydW49RmFsc2UpCisgICAgZGVmIHRlc3RfdHVwbGUoc2VsZiwgc2l6ZSk6CisgICAgICAgIHNlbGYuY2hlY2tfdW5tYXJzaGFsbGFibGUoKE5vbmUsKSAqIHNpemUpCisKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLAorICAgICAgICAgICAgbWVtdXNlPXBvaW50ZXJfc2l6ZSwgZHJ5X3J1bj1GYWxzZSkKKyAgICBkZWYgdGVzdF9saXN0KHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKFtOb25lXSAqIHNpemUpCisKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLAorICAgICAgICAgICAgbWVtdXNlPXBvaW50ZXJfc2l6ZSoxMiArIHN5cy5nZXRzaXplb2YoTEFSR0VfU0laRS0xKSwKKyAgICAgICAgICAgIGRyeV9ydW49RmFsc2UpCisgICAgZGVmIHRlc3Rfc2V0KHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKHNldChyYW5nZShzaXplKSkpCisKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLAorICAgICAgICAgICAgbWVtdXNlPXBvaW50ZXJfc2l6ZSoxMiArIHN5cy5nZXRzaXplb2YoTEFSR0VfU0laRS0xKSwKKyAgICAgICAgICAgIGRyeV9ydW49RmFsc2UpCisgICAgZGVmIHRlc3RfZnJvemVuc2V0KHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKGZyb3plbnNldChyYW5nZShzaXplKSkpCisKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLCBtZW11c2U9MSwgZHJ5X3J1bj1GYWxzZSkKKyAgICBkZWYgdGVzdF9ieXRlYXJyYXkoc2VsZiwgc2l6ZSk6CisgICAgICAgIHNlbGYuY2hlY2tfdW5tYXJzaGFsbGFibGUoYnl0ZWFycmF5KHNpemUpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEludFRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXRUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1Rlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZVRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25UZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1Z3NUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhcmdlVmFsdWVzVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFyc2hhbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYXJzaGFsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjEzNmFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFyc2hhbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFyc2hhbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYXJzaGFsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjEzNmFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFyc2hhbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWF0aC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0NDc1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hdGgucHkKQEAgLTAsMCArMSwxMDMwIEBACisjIFB5dGhvbiB0ZXN0IHNldCAtLSBtYXRoIG1vZHVsZQorIyBYWFhYIFNob3VsZCBub3QgZG8gdGVzdHMgYXJvdW5kIHplcm8gb25seQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIHZlcmJvc2UKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG1hdGgKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHJhbmRvbQoraW1wb3J0IHN0cnVjdAorCitlcHMgPSAxRS0wNQorTkFOID0gZmxvYXQoJ25hbicpCitJTkYgPSBmbG9hdCgnaW5mJykKK05JTkYgPSBmbG9hdCgnLWluZicpCisKKyMgZGVjb3JhdG9yIGZvciBza2lwcGluZyB0ZXN0cyBvbiBub24tSUVFRSA3NTQgcGxhdGZvcm1zCityZXF1aXJlc19JRUVFXzc1NCA9IHVuaXR0ZXN0LnNraXBVbmxlc3MoCisgICAgZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpLAorICAgICJ0ZXN0IHJlcXVpcmVzIElFRUUgNzU0IGRvdWJsZXMiKQorCisjIGRldGVjdCBldmlkZW5jZSBvZiBkb3VibGUtcm91bmRpbmc6IGZzdW0gaXMgbm90IGFsd2F5cyBjb3JyZWN0bHkKKyMgcm91bmRlZCBvbiBtYWNoaW5lcyB0aGF0IHN1ZmZlciBmcm9tIGRvdWJsZSByb3VuZGluZy4KK3gsIHkgPSAxZTE2LCAyLjk5OTkgIyB1c2UgdGVtcG9yYXJ5IHZhbHVlcyB0byBkZWZlYXQgcGVlcGhvbGUgb3B0aW1pemVyCitIQVZFX0RPVUJMRV9ST1VORElORyA9ICh4ICsgeSA9PSAxZTE2ICsgNCkKKworIyBsb2NhdGUgZmlsZSB3aXRoIHRlc3QgdmFsdWVzCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGZpbGUgPSBzeXMuYXJndlswXQorZWxzZToKKyAgICBmaWxlID0gX19maWxlX18KK3Rlc3RfZGlyID0gb3MucGF0aC5kaXJuYW1lKGZpbGUpIG9yIG9zLmN1cmRpcgorbWF0aF90ZXN0Y2FzZXMgPSBvcy5wYXRoLmpvaW4odGVzdF9kaXIsICdtYXRoX3Rlc3RjYXNlcy50eHQnKQordGVzdF9maWxlID0gb3MucGF0aC5qb2luKHRlc3RfZGlyLCAnY21hdGhfdGVzdGNhc2VzLnR4dCcpCisKK2RlZiB0b191bHBzKHgpOgorICAgICIiIkNvbnZlcnQgYSBub24tTmFOIGZsb2F0IHggdG8gYW4gaW50ZWdlciwgaW4gc3VjaCBhIHdheSB0aGF0CisgICAgYWRqYWNlbnQgZmxvYXRzIGFyZSBjb252ZXJ0ZWQgdG8gYWRqYWNlbnQgaW50ZWdlcnMuICBUaGVuCisgICAgYWJzKHVscHMoeCkgLSB1bHBzKHkpKSBnaXZlcyB0aGUgZGlmZmVyZW5jZSBpbiB1bHBzIGJldHdlZW4gdHdvCisgICAgZmxvYXRzLgorCisgICAgVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGZ1bmN0aW9uIHdpbGwgb25seSBtYWtlIHNlbnNlIG9uIHBsYXRmb3JtcworICAgIHdoZXJlIEMgZG91YmxlcyBhcmUgcmVwcmVzZW50ZWQgaW4gSUVFRSA3NTQgYmluYXJ5NjQgZm9ybWF0LgorCisgICAgIiIiCisgICAgbiA9IHN0cnVjdC51bnBhY2soJzxxJywgc3RydWN0LnBhY2soJzxkJywgeCkpWzBdCisgICAgaWYgbiA8IDA6CisgICAgICAgIG4gPSB+KG4rMioqNjMpCisgICAgcmV0dXJuIG4KKworZGVmIHVscHNfY2hlY2soZXhwZWN0ZWQsIGdvdCwgdWxwcz0yMCk6CisgICAgIiIiR2l2ZW4gbm9uLU5hTiBmbG9hdHMgYGV4cGVjdGVkYCBhbmQgYGdvdGAsCisgICAgY2hlY2sgdGhhdCB0aGV5J3JlIGVxdWFsIHRvIHdpdGhpbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHVscHMuCisKKyAgICBSZXR1cm5zIE5vbmUgb24gc3VjY2VzcyBhbmQgYW4gZXJyb3IgbWVzc2FnZSBvbiBmYWlsdXJlLiIiIgorCisgICAgdWxwc19lcnJvciA9IHRvX3VscHMoZ290KSAtIHRvX3VscHMoZXhwZWN0ZWQpCisgICAgaWYgYWJzKHVscHNfZXJyb3IpIDw9IHVscHM6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuICJlcnJvciA9IHt9IHVscHM7IHBlcm1pdHRlZCBlcnJvciA9IHt9IHVscHMiLmZvcm1hdCh1bHBzX2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWxwcykKKworZGVmIGFjY19jaGVjayhleHBlY3RlZCwgZ290LCByZWxfZXJyPTJlLTE1LCBhYnNfZXJyID0gNWUtMzIzKToKKyAgICAiIiJEZXRlcm1pbmUgd2hldGhlciBub24tTmFOIGZsb2F0cyBhIGFuZCBiIGFyZSBlcXVhbCB0byB3aXRoaW4gYQorICAgIChzbWFsbCkgcm91bmRpbmcgZXJyb3IuICBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHJlbF9lcnIgYW5kCisgICAgYWJzX2VyciBhcmUgY2hvc2VuIHRvIGJlIHN1aXRhYmxlIGZvciBwbGF0Zm9ybXMgd2hlcmUgYSBmbG9hdCBpcworICAgIHJlcHJlc2VudGVkIGJ5IGFuIElFRUUgNzU0IGRvdWJsZS4gIFRoZXkgYWxsb3cgYW4gZXJyb3Igb2YgYmV0d2VlbgorICAgIDkgYW5kIDE5IHVscHMuIiIiCisKKyAgICAjIG5lZWQgdG8gc3BlY2lhbCBjYXNlIGluZmluaXRpZXMsIHNpbmNlIGluZiAtIGluZiBnaXZlcyBuYW4KKyAgICBpZiBtYXRoLmlzaW5mKGV4cGVjdGVkKSBhbmQgZ290ID09IGV4cGVjdGVkOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZXJyb3IgPSBnb3QgLSBleHBlY3RlZAorCisgICAgcGVybWl0dGVkX2Vycm9yID0gbWF4KGFic19lcnIsIHJlbF9lcnIgKiBhYnMoZXhwZWN0ZWQpKQorICAgIGlmIGFicyhlcnJvcikgPCBwZXJtaXR0ZWRfZXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuICJlcnJvciA9IHt9OyBwZXJtaXR0ZWQgZXJyb3IgPSB7fSIuZm9ybWF0KGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXR0ZWRfZXJyb3IpCisKK2RlZiBwYXJzZV9tdGVzdGZpbGUoZm5hbWUpOgorICAgICIiIlBhcnNlIGEgZmlsZSB3aXRoIHRlc3QgdmFsdWVzCisKKyAgICAtLSBzdGFydHMgYSBjb21tZW50CisgICAgYmxhbmsgbGluZXMsIG9yIGxpbmVzIGNvbnRhaW5pbmcgb25seSBhIGNvbW1lbnQsIGFyZSBpZ25vcmVkCisgICAgb3RoZXIgbGluZXMgYXJlIGV4cGVjdGVkIHRvIGhhdmUgdGhlIGZvcm0KKyAgICAgIGlkIGZuIGFyZyAtPiBleHBlY3RlZCBbZmxhZ10qCisKKyAgICAiIiIKKyAgICB3aXRoIG9wZW4oZm5hbWUpIGFzIGZwOgorICAgICAgICBmb3IgbGluZSBpbiBmcDoKKyAgICAgICAgICAgICMgc3RyaXAgY29tbWVudHMsIGFuZCBza2lwIGJsYW5rIGxpbmVzCisgICAgICAgICAgICBpZiAnLS0nIGluIGxpbmU6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOmxpbmUuaW5kZXgoJy0tJyldCisgICAgICAgICAgICBpZiBub3QgbGluZS5zdHJpcCgpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGxocywgcmhzID0gbGluZS5zcGxpdCgnLT4nKQorICAgICAgICAgICAgaWQsIGZuLCBhcmcgPSBsaHMuc3BsaXQoKQorICAgICAgICAgICAgcmhzX3BpZWNlcyA9IHJocy5zcGxpdCgpCisgICAgICAgICAgICBleHAgPSByaHNfcGllY2VzWzBdCisgICAgICAgICAgICBmbGFncyA9IHJoc19waWVjZXNbMTpdCisKKyAgICAgICAgICAgIHlpZWxkIChpZCwgZm4sIGZsb2F0KGFyZyksIGZsb2F0KGV4cCksIGZsYWdzKQorCitkZWYgcGFyc2VfdGVzdGZpbGUoZm5hbWUpOgorICAgICIiIlBhcnNlIGEgZmlsZSB3aXRoIHRlc3QgdmFsdWVzCisKKyAgICBFbXB0eSBsaW5lcyBvciBsaW5lcyBzdGFydGluZyB3aXRoIC0tIGFyZSBpZ25vcmVkCisgICAgeWllbGRzIGlkLCBmbiwgYXJnX3JlYWwsIGFyZ19pbWFnLCBleHBfcmVhbCwgZXhwX2ltYWcKKyAgICAiIiIKKyAgICB3aXRoIG9wZW4oZm5hbWUpIGFzIGZwOgorICAgICAgICBmb3IgbGluZSBpbiBmcDoKKyAgICAgICAgICAgICMgc2tpcCBjb21tZW50IGxpbmVzIGFuZCBibGFuayBsaW5lcworICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCctLScpIG9yIG5vdCBsaW5lLnN0cmlwKCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgbGhzLCByaHMgPSBsaW5lLnNwbGl0KCctPicpCisgICAgICAgICAgICBpZCwgZm4sIGFyZ19yZWFsLCBhcmdfaW1hZyA9IGxocy5zcGxpdCgpCisgICAgICAgICAgICByaHNfcGllY2VzID0gcmhzLnNwbGl0KCkKKyAgICAgICAgICAgIGV4cF9yZWFsLCBleHBfaW1hZyA9IHJoc19waWVjZXNbMF0sIHJoc19waWVjZXNbMV0KKyAgICAgICAgICAgIGZsYWdzID0gcmhzX3BpZWNlc1syOl0KKworICAgICAgICAgICAgeWllbGQgKGlkLCBmbiwKKyAgICAgICAgICAgICAgICAgICBmbG9hdChhcmdfcmVhbCksIGZsb2F0KGFyZ19pbWFnKSwKKyAgICAgICAgICAgICAgICAgICBmbG9hdChleHBfcmVhbCksIGZsb2F0KGV4cF9pbWFnKSwKKyAgICAgICAgICAgICAgICAgICBmbGFncworICAgICAgICAgICAgICAgICAgKQorCitjbGFzcyBNYXRoVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGZ0ZXN0KHNlbGYsIG5hbWUsIHZhbHVlLCBleHBlY3RlZCk6CisgICAgICAgIGlmIGFicyh2YWx1ZS1leHBlY3RlZCkgPiBlcHM6CisgICAgICAgICAgICAjIFVzZSAlciBpbnN0ZWFkIG9mICVmIHNvIHRoZSBlcnJvciBtZXNzYWdlCisgICAgICAgICAgICAjIGRpc3BsYXlzIGZ1bGwgcHJlY2lzaW9uLiBPdGhlcndpc2UgZGlzY3JlcGFuY2llcworICAgICAgICAgICAgIyBpbiB0aGUgbGFzdCBmZXcgYml0cyB3aWxsIGxlYWQgdG8gdmVyeSBjb25mdXNpbmcKKyAgICAgICAgICAgICMgZXJyb3IgbWVzc2FnZXMKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnJXMgcmV0dXJuZWQgJXIsIGV4cGVjdGVkICVyJyAlCisgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsIHZhbHVlLCBleHBlY3RlZCkpCisKKyAgICBkZWYgdGVzdENvbnN0YW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5mdGVzdCgncGknLCBtYXRoLnBpLCAzLjE0MTU5MjYpCisgICAgICAgIHNlbGYuZnRlc3QoJ2UnLCBtYXRoLmUsIDIuNzE4MjgxOCkKKworICAgIGRlZiB0ZXN0QWNvcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmFjb3MpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Fjb3MoLTEpJywgbWF0aC5hY29zKC0xKSwgbWF0aC5waSkKKyAgICAgICAgc2VsZi5mdGVzdCgnYWNvcygwKScsIG1hdGguYWNvcygwKSwgbWF0aC5waS8yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhY29zKDEpJywgbWF0aC5hY29zKDEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFjb3MsIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hY29zLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmFjb3MoTkFOKSkpCisKKyAgICBkZWYgdGVzdEFjb3NoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYWNvc2gpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Fjb3NoKDEpJywgbWF0aC5hY29zaCgxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYWNvc2goMiknLCBtYXRoLmFjb3NoKDIpLCAxLjMxNjk1Nzg5NjkyNDgxNjgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYWNvc2gsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYWNvc2gsIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYWNvc2goSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFjb3NoLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmFjb3NoKE5BTikpKQorCisgICAgZGVmIHRlc3RBc2luKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYXNpbikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXNpbigtMSknLCBtYXRoLmFzaW4oLTEpLCAtbWF0aC5waS8yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhc2luKDApJywgbWF0aC5hc2luKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhc2luKDEpJywgbWF0aC5hc2luKDEpLCBtYXRoLnBpLzIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYXNpbiwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFzaW4sIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXNpbihOQU4pKSkKKworICAgIGRlZiB0ZXN0QXNpbmgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hc2luaCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXNpbmgoMCknLCBtYXRoLmFzaW5oKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhc2luaCgxKScsIG1hdGguYXNpbmgoMSksIDAuODgxMzczNTg3MDE5NTQzMDUpCisgICAgICAgIHNlbGYuZnRlc3QoJ2FzaW5oKC0xKScsIG1hdGguYXNpbmgoLTEpLCAtMC44ODEzNzM1ODcwMTk1NDMwNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmFzaW5oKElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmFzaW5oKE5JTkYpLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmFzaW5oKE5BTikpKQorCisgICAgZGVmIHRlc3RBdGFuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYXRhbikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbigtMSknLCBtYXRoLmF0YW4oLTEpLCAtbWF0aC5waS80KQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuKDApJywgbWF0aC5hdGFuKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuKDEpJywgbWF0aC5hdGFuKDEpLCBtYXRoLnBpLzQpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4oaW5mKScsIG1hdGguYXRhbihJTkYpLCBtYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4oLWluZiknLCBtYXRoLmF0YW4oTklORiksIC1tYXRoLnBpLzIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbihOQU4pKSkKKworICAgIGRlZiB0ZXN0QXRhbmgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hdGFuKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuaCgwKScsIG1hdGguYXRhbmgoMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW5oKDAuNSknLCBtYXRoLmF0YW5oKDAuNSksIDAuNTQ5MzA2MTQ0MzM0MDU0ODkpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW5oKC0wLjUpJywgbWF0aC5hdGFuaCgtMC41KSwgLTAuNTQ5MzA2MTQ0MzM0MDU0ODkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYXRhbmgsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYXRhbmgsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmF0YW5oLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYXRhbmgsIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbmgoTkFOKSkpCisKKyAgICBkZWYgdGVzdEF0YW4yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYXRhbjIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC0xLCAwKScsIG1hdGguYXRhbjIoLTEsIDApLCAtbWF0aC5waS8yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMSwgMSknLCBtYXRoLmF0YW4yKC0xLCAxKSwgLW1hdGgucGkvNCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoMCwgMSknLCBtYXRoLmF0YW4yKDAsIDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigxLCAxKScsIG1hdGguYXRhbjIoMSwgMSksIG1hdGgucGkvNCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoMSwgMCknLCBtYXRoLmF0YW4yKDEsIDApLCBtYXRoLnBpLzIpCisKKyAgICAgICAgIyBtYXRoLmF0YW4yKDAsIHgpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDAuLCAtaW5mKScsIG1hdGguYXRhbjIoMC4sIE5JTkYpLCBtYXRoLnBpKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigwLiwgLTIuMyknLCBtYXRoLmF0YW4yKDAuLCAtMi4zKSwgbWF0aC5waSkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoMC4sIC0wLiknLCBtYXRoLmF0YW4yKDAuLCAtMC4pLCBtYXRoLnBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYXRhbjIoMC4sIDAuKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hdGFuMigwLiwgMi4zKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hdGFuMigwLiwgSU5GKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoMC4sIE5BTikpKQorICAgICAgICAjIG1hdGguYXRhbjIoLTAsIHgpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC0wLiwgLWluZiknLCBtYXRoLmF0YW4yKC0wLiwgTklORiksIC1tYXRoLnBpKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMC4sIC0yLjMpJywgbWF0aC5hdGFuMigtMC4sIC0yLjMpLCAtbWF0aC5waSkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLTAuLCAtMC4pJywgbWF0aC5hdGFuMigtMC4sIC0wLiksIC1tYXRoLnBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYXRhbjIoLTAuLCAwLiksIC0wLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmF0YW4yKC0wLiwgMi4zKSwgLTAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYXRhbjIoLTAuLCBJTkYpLCAtMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoLTAuLCBOQU4pKSkKKyAgICAgICAgIyBtYXRoLmF0YW4yKElORiwgeCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoaW5mLCAtaW5mKScsIG1hdGguYXRhbjIoSU5GLCBOSU5GKSwgbWF0aC5waSozLzQpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKGluZiwgLTIuMyknLCBtYXRoLmF0YW4yKElORiwgLTIuMyksIG1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoaW5mLCAtMC4pJywgbWF0aC5hdGFuMihJTkYsIC0wLjApLCBtYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKGluZiwgMC4pJywgbWF0aC5hdGFuMihJTkYsIDAuMCksIG1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoaW5mLCAyLjMpJywgbWF0aC5hdGFuMihJTkYsIDIuMyksIG1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoaW5mLCBpbmYpJywgbWF0aC5hdGFuMihJTkYsIElORiksIG1hdGgucGkvNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihJTkYsIE5BTikpKQorICAgICAgICAjIG1hdGguYXRhbjIoTklORiwgeCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLWluZiwgLWluZiknLCBtYXRoLmF0YW4yKE5JTkYsIE5JTkYpLCAtbWF0aC5waSozLzQpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC1pbmYsIC0yLjMpJywgbWF0aC5hdGFuMihOSU5GLCAtMi4zKSwgLW1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLWluZiwgLTAuKScsIG1hdGguYXRhbjIoTklORiwgLTAuMCksIC1tYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC1pbmYsIDAuKScsIG1hdGguYXRhbjIoTklORiwgMC4wKSwgLW1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLWluZiwgMi4zKScsIG1hdGguYXRhbjIoTklORiwgMi4zKSwgLW1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLWluZiwgaW5mKScsIG1hdGguYXRhbjIoTklORiwgSU5GKSwgLW1hdGgucGkvNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOSU5GLCBOQU4pKSkKKyAgICAgICAgIyBtYXRoLmF0YW4yKCtmaW5pdGUsIHgpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDIuMywgLWluZiknLCBtYXRoLmF0YW4yKDIuMywgTklORiksIG1hdGgucGkpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDIuMywgLTAuKScsIG1hdGguYXRhbjIoMi4zLCAtMC4pLCBtYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDIuMywgMC4pJywgbWF0aC5hdGFuMigyLjMsIDAuKSwgbWF0aC5waS8yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYXRhbjIoMi4zLCBJTkYpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMigyLjMsIE5BTikpKQorICAgICAgICAjIG1hdGguYXRhbjIoLWZpbml0ZSwgeCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLTIuMywgLWluZiknLCBtYXRoLmF0YW4yKC0yLjMsIE5JTkYpLCAtbWF0aC5waSkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLTIuMywgLTAuKScsIG1hdGguYXRhbjIoLTIuMywgLTAuKSwgLW1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLTIuMywgMC4pJywgbWF0aC5hdGFuMigtMi4zLCAwLiksIC1tYXRoLnBpLzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hdGFuMigtMi4zLCBJTkYpLCAtMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoLTIuMywgTkFOKSkpCisgICAgICAgICMgbWF0aC5hdGFuMihOQU4sIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoTkFOLCBOSU5GKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoTkFOLCAtMi4zKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoTkFOLCAtMC4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIDAuKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoTkFOLCAyLjMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIElORikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgTkFOKSkpCisKKyAgICBkZWYgdGVzdENlaWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5jZWlsKQorICAgICAgICAjIFRoZXNlIHR5cGVzIHdpbGwgYmUgaW50IGluIHB5M2suCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQsIHR5cGUobWF0aC5jZWlsKDEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCwgdHlwZShtYXRoLmNlaWwoMUwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCwgdHlwZShtYXRoLmNlaWwoMS4wKSkpCisgICAgICAgIHNlbGYuZnRlc3QoJ2NlaWwoMC41KScsIG1hdGguY2VpbCgwLjUpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjZWlsKDEuMCknLCBtYXRoLmNlaWwoMS4wKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnY2VpbCgxLjUpJywgbWF0aC5jZWlsKDEuNSksIDIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2NlaWwoLTAuNSknLCBtYXRoLmNlaWwoLTAuNSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2NlaWwoLTEuMCknLCBtYXRoLmNlaWwoLTEuMCksIC0xKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjZWlsKC0xLjUpJywgbWF0aC5jZWlsKC0xLjUpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNlaWwoSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY2VpbChOSU5GKSwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5jZWlsKE5BTikpKQorCisgICAgICAgIGNsYXNzIFRlc3RDZWlsKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MS4zCisgICAgICAgIGNsYXNzIFRlc3ROb0NlaWwob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5mdGVzdCgnY2VpbChUZXN0Q2VpbCgpKScsIG1hdGguY2VpbChUZXN0Q2VpbCgpKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5jZWlsLCBUZXN0Tm9DZWlsKCkpCisKKyAgICAgICAgdCA9IFRlc3ROb0NlaWwoKQorICAgICAgICB0Ll9fY2VpbF9fID0gbGFtYmRhICphcmdzOiBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5jZWlsLCB0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguY2VpbCwgdCwgMCkKKworICAgIEByZXF1aXJlc19JRUVFXzc1NAorICAgIGRlZiB0ZXN0Q29weXNpZ24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3B5c2lnbigxLCA0MiksIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKDAuLCA0MiksIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKDEuLCAtNDIpLCAtMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29weXNpZ24oMywgMC4pLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3B5c2lnbig0LiwgLTAuKSwgLTQuMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguY29weXNpZ24pCisgICAgICAgICMgY29weXNpZ24gc2hvdWxkIGxldCB1cyBkaXN0aW5ndWlzaCBzaWducyBvZiB6ZXJvcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29weXNpZ24oMS4sIDAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3B5c2lnbigxLiwgLTAuKSwgLTEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29weXNpZ24oSU5GLCAwLiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKElORiwgLTAuKSwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKE5JTkYsIDAuKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29weXNpZ24oTklORiwgLTAuKSwgTklORikKKyAgICAgICAgIyBhbmQgb2YgaW5maW5pdGllcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29weXNpZ24oMS4sIElORiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29weXNpZ24oMS4sIE5JTkYpLCAtMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3B5c2lnbihJTkYsIElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKElORiwgTklORiksIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3B5c2lnbihOSU5GLCBJTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3B5c2lnbihOSU5GLCBOSU5GKSwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5jb3B5c2lnbihOQU4sIDEuKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY29weXNpZ24oTkFOLCBJTkYpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5jb3B5c2lnbihOQU4sIE5JTkYpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5jb3B5c2lnbihOQU4sIE5BTikpKQorICAgICAgICAjIGNvcHlzaWduKElORiwgTkFOKSBtYXkgYmUgSU5GIG9yIGl0IG1heSBiZSBOSU5GLCBzaW5jZQorICAgICAgICAjIHdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgc2lnbiBiaXQgb2YgTkFOIGlzIHNldCBvbiBhbnkKKyAgICAgICAgIyBnaXZlbiBwbGF0Zm9ybS4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNpbmYobWF0aC5jb3B5c2lnbihJTkYsIE5BTikpKQorICAgICAgICAjIHNpbWlsYXJseSwgY29weXNpZ24oMi4sIE5BTikgY291bGQgYmUgMi4gb3IgLTIuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzKG1hdGguY29weXNpZ24oMi4sIE5BTikpLCAyLikKKworICAgIGRlZiB0ZXN0Q29zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguY29zKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MoLXBpLzIpJywgbWF0aC5jb3MoLW1hdGgucGkvMiksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2NvcygwKScsIG1hdGguY29zKDApLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MocGkvMiknLCBtYXRoLmNvcyhtYXRoLnBpLzIpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MocGkpJywgbWF0aC5jb3MobWF0aC5waSksIC0xKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmNvcyhJTkYpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY29zKE5JTkYpKSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmNvcywgSU5GKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5jb3MsIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY29zKE5BTikpKQorCisgICAgZGVmIHRlc3RDb3NoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguY29zaCkKKyAgICAgICAgc2VsZi5mdGVzdCgnY29zaCgwKScsIG1hdGguY29zaCgwKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnY29zaCgyKS0yKmNvc2goMSkqKjInLCBtYXRoLmNvc2goMiktMiptYXRoLmNvc2goMSkqKjIsIC0xKSAjIFRoYW5rcyB0byBMYW1iZXJ0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3NoKElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvc2goTklORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5jb3NoKE5BTikpKQorCisgICAgZGVmIHRlc3REZWdyZWVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZGVncmVlcykKKyAgICAgICAgc2VsZi5mdGVzdCgnZGVncmVlcyhwaSknLCBtYXRoLmRlZ3JlZXMobWF0aC5waSksIDE4MC4wKQorICAgICAgICBzZWxmLmZ0ZXN0KCdkZWdyZWVzKHBpLzIpJywgbWF0aC5kZWdyZWVzKG1hdGgucGkvMiksIDkwLjApCisgICAgICAgIHNlbGYuZnRlc3QoJ2RlZ3JlZXMoLXBpLzQpJywgbWF0aC5kZWdyZWVzKC1tYXRoLnBpLzQpLCAtNDUuMCkKKworICAgIGRlZiB0ZXN0RXhwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZXhwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdleHAoLTEpJywgbWF0aC5leHAoLTEpLCAxL21hdGguZSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZXhwKDApJywgbWF0aC5leHAoMCksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2V4cCgxKScsIG1hdGguZXhwKDEpLCBtYXRoLmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5leHAoSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguZXhwKE5JTkYpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5leHAoTkFOKSkpCisKKyAgICBkZWYgdGVzdEZhYnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5mYWJzKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmYWJzKC0xKScsIG1hdGguZmFicygtMSksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2ZhYnMoMCknLCBtYXRoLmZhYnMoMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2ZhYnMoMSknLCBtYXRoLmZhYnMoMSksIDEpCisKKyAgICBkZWYgdGVzdEZhY3RvcmlhbChzZWxmKToKKyAgICAgICAgZGVmIGZhY3Qobik6CisgICAgICAgICAgICByZXN1bHQgPSAxCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBpbnQobikrMSk6CisgICAgICAgICAgICAgICAgcmVzdWx0ICo9IGkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgdmFsdWVzID0gcmFuZ2UoMTApICsgWzUwLCAxMDAsIDUwMF0KKyAgICAgICAgcmFuZG9tLnNodWZmbGUodmFsdWVzKQorICAgICAgICBmb3IgeCBpbiB2YWx1ZXM6CisgICAgICAgICAgICBmb3IgY2FzdCBpbiAoaW50LCBsb25nLCBmbG9hdCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmZhY3RvcmlhbChjYXN0KHgpKSwgZmFjdCh4KSwgKHgsIGZhY3QoeCksIG1hdGguZmFjdG9yaWFsKHgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5mYWN0b3JpYWwsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmZhY3RvcmlhbCwgbWF0aC5waSkKKworICAgIGRlZiB0ZXN0Rmxvb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5mbG9vcikKKyAgICAgICAgIyBUaGVzZSB0eXBlcyB3aWxsIGJlIGludCBpbiBweTNrLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0LCB0eXBlKG1hdGguZmxvb3IoMSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0LCB0eXBlKG1hdGguZmxvb3IoMUwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCwgdHlwZShtYXRoLmZsb29yKDEuMCkpKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigwLjUpJywgbWF0aC5mbG9vcigwLjUpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigxLjApJywgbWF0aC5mbG9vcigxLjApLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigxLjUpJywgbWF0aC5mbG9vcigxLjUpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigtMC41KScsIG1hdGguZmxvb3IoLTAuNSksIC0xKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigtMS4wKScsIG1hdGguZmxvb3IoLTEuMCksIC0xKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigtMS41KScsIG1hdGguZmxvb3IoLTEuNSksIC0yKQorICAgICAgICAjIHBvdygpIHJlbGllcyBvbiBmbG9vcigpIHRvIGNoZWNrIGZvciBpbnRlZ2VycworICAgICAgICAjIFRoaXMgZmFpbHMgb24gc29tZSBwbGF0Zm9ybXMgLSBzbyBjaGVjayBpdCBoZXJlCisgICAgICAgIHNlbGYuZnRlc3QoJ2Zsb29yKDEuMjNlMTY3KScsIG1hdGguZmxvb3IoMS4yM2UxNjcpLCAxLjIzZTE2NykKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoLTEuMjNlMTY3KScsIG1hdGguZmxvb3IoLTEuMjNlMTY3KSwgLTEuMjNlMTY3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY2VpbChJTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jZWlsKE5JTkYpLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmZsb29yKE5BTikpKQorCisgICAgICAgIGNsYXNzIFRlc3RGbG9vcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIuMworICAgICAgICBjbGFzcyBUZXN0Tm9GbG9vcihvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcihUZXN0Rmxvb3IoKSknLCBtYXRoLmZsb29yKFRlc3RGbG9vcigpKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5mbG9vciwgVGVzdE5vRmxvb3IoKSkKKworICAgICAgICB0ID0gVGVzdE5vRmxvb3IoKQorICAgICAgICB0Ll9fZmxvb3JfXyA9IGxhbWJkYSAqYXJnczogYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZmxvb3IsIHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5mbG9vciwgdCwgMCkKKworICAgIGRlZiB0ZXN0Rm1vZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmZtb2QpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Ztb2QoMTAsMSknLCBtYXRoLmZtb2QoMTAsMSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2Ztb2QoMTAsMC41KScsIG1hdGguZm1vZCgxMCwwLjUpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbW9kKDEwLDEuNSknLCBtYXRoLmZtb2QoMTAsMS41KSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgtMTAsMSknLCBtYXRoLmZtb2QoLTEwLDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbW9kKC0xMCwwLjUpJywgbWF0aC5mbW9kKC0xMCwwLjUpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbW9kKC0xMCwxLjUpJywgbWF0aC5mbW9kKC0xMCwxLjUpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5mbW9kKE5BTiwgMS4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5mbW9kKDEuLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5mbW9kKE5BTiwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguZm1vZCwgMS4sIDAuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmZtb2QsIElORiwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguZm1vZCwgTklORiwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguZm1vZCwgSU5GLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmZtb2QoMy4wLCBJTkYpLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5mbW9kKC0zLjAsIElORiksIC0zLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5mbW9kKDMuMCwgTklORiksIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmZtb2QoLTMuMCwgTklORiksIC0zLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5mbW9kKDAuMCwgMy4wKSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguZm1vZCgwLjAsIE5JTkYpLCAwLjApCisKKyAgICBkZWYgdGVzdEZyZXhwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZnJleHApCisKKyAgICAgICAgZGVmIHRlc3RmcmV4cChuYW1lLCByZXN1bHQsIGV4cGVjdGVkKToKKyAgICAgICAgICAgIChtYW50LCBleHApLCAoZW1hbnQsIGVleHApID0gcmVzdWx0LCBleHBlY3RlZAorICAgICAgICAgICAgaWYgYWJzKG1hbnQtZW1hbnQpID4gZXBzIG9yIGV4cCAhPSBlZXhwOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnJXMgcmV0dXJuZWQgJXIsIGV4cGVjdGVkICVyJyVcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCAobWFudCwgZXhwKSwgKGVtYW50LGVleHApKSkKKworICAgICAgICB0ZXN0ZnJleHAoJ2ZyZXhwKC0xKScsIG1hdGguZnJleHAoLTEpLCAoLTAuNSwgMSkpCisgICAgICAgIHRlc3RmcmV4cCgnZnJleHAoMCknLCBtYXRoLmZyZXhwKDApLCAoMCwgMCkpCisgICAgICAgIHRlc3RmcmV4cCgnZnJleHAoMSknLCBtYXRoLmZyZXhwKDEpLCAoMC41LCAxKSkKKyAgICAgICAgdGVzdGZyZXhwKCdmcmV4cCgyKScsIG1hdGguZnJleHAoMiksICgwLjUsIDIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5mcmV4cChJTkYpWzBdLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5mcmV4cChOSU5GKVswXSwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5mcmV4cChOQU4pWzBdKSkKKworICAgIEByZXF1aXJlc19JRUVFXzc1NAorICAgIEB1bml0dGVzdC5za2lwSWYoSEFWRV9ET1VCTEVfUk9VTkRJTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgImZzdW0gaXMgbm90IGV4YWN0IG9uIG1hY2hpbmVzIHdpdGggZG91YmxlIHJvdW5kaW5nIikKKyAgICBkZWYgdGVzdEZzdW0oc2VsZik6CisgICAgICAgICMgbWF0aC5mc3VtIHJlbGllcyBvbiBleGFjdCByb3VuZGluZyBmb3IgY29ycmVjdCBvcGVyYXRpb24uCisgICAgICAgICMgVGhlcmUncyBhIGtub3duIHByb2JsZW0gd2l0aCBJQTMyIGZsb2F0aW5nLXBvaW50IHRoYXQgY2F1c2VzCisgICAgICAgICMgaW5leGFjdCByb3VuZGluZyBpbiBzb21lIHNpdHVhdGlvbnMsIGFuZCB3aWxsIGNhdXNlIHRoZQorICAgICAgICAjIG1hdGguZnN1bSB0ZXN0cyBiZWxvdyB0byBmYWlsOyBzZWUgaXNzdWUgIzI5MzcuICBPbiBub24gSUVFRQorICAgICAgICAjIDc1NCBwbGF0Zm9ybXMsIGFuZCBvbiBJRUVFIDc1NCBwbGF0Zm9ybXMgdGhhdCBleGhpYml0IHRoZQorICAgICAgICAjIHByb2JsZW0gZGVzY3JpYmVkIGluIGlzc3VlICMyOTM3LCB3ZSBzaW1wbHkgc2tpcCB0aGUgd2hvbGUKKyAgICAgICAgIyB0ZXN0LgorCisgICAgICAgICMgUHl0aG9uIHZlcnNpb24gb2YgbWF0aC5mc3VtLCBmb3IgY29tcGFyaXNvbi4gIFVzZXMgYQorICAgICAgICAjIGRpZmZlcmVudCBhbGdvcml0aG0gYmFzZWQgb24gZnJleHAsIGxkZXhwIGFuZCBpbnRlZ2VyCisgICAgICAgICMgYXJpdGhtZXRpYy4KKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IGZsb2F0X2luZm8KKyAgICAgICAgbWFudF9kaWcgPSBmbG9hdF9pbmZvLm1hbnRfZGlnCisgICAgICAgIGV0aW55ID0gZmxvYXRfaW5mby5taW5fZXhwIC0gbWFudF9kaWcKKworICAgICAgICBkZWYgbXN1bShpdGVyYWJsZSk6CisgICAgICAgICAgICAiIiJGdWxsIHByZWNpc2lvbiBzdW1tYXRpb24uICBDb21wdXRlIHN1bShpdGVyYWJsZSkgd2l0aG91dCBhbnkKKyAgICAgICAgICAgIGludGVybWVkaWF0ZSBhY2N1bXVsYXRpb24gb2YgZXJyb3IuICBCYXNlZCBvbiB0aGUgJ2xzdW0nIGZ1bmN0aW9uCisgICAgICAgICAgICBhdCBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy8zOTMwOTAvCisKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgdG1hbnQsIHRleHAgPSAwLCAwCisgICAgICAgICAgICBmb3IgeCBpbiBpdGVyYWJsZToKKyAgICAgICAgICAgICAgICBtYW50LCBleHAgPSBtYXRoLmZyZXhwKHgpCisgICAgICAgICAgICAgICAgbWFudCwgZXhwID0gaW50KG1hdGgubGRleHAobWFudCwgbWFudF9kaWcpKSwgZXhwIC0gbWFudF9kaWcKKyAgICAgICAgICAgICAgICBpZiB0ZXhwID4gZXhwOgorICAgICAgICAgICAgICAgICAgICB0bWFudCA8PD0gdGV4cC1leHAKKyAgICAgICAgICAgICAgICAgICAgdGV4cCA9IGV4cAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1hbnQgPDw9IGV4cC10ZXhwCisgICAgICAgICAgICAgICAgdG1hbnQgKz0gbWFudAorICAgICAgICAgICAgIyBSb3VuZCB0bWFudCAqIDIqKnRleHAgdG8gYSBmbG9hdC4gIFRoZSBvcmlnaW5hbCByZWNpcGUKKyAgICAgICAgICAgICMgdXNlZCBmbG9hdChzdHIodG1hbnQpKSAqIDIuMCoqdGV4cCBmb3IgdGhpcywgYnV0IHRoYXQncworICAgICAgICAgICAgIyBhIGxpdHRsZSB1bnNhZmUgYmVjYXVzZSBzdHIgLT4gZmxvYXQgY29udmVyc2lvbiBjYW4ndCBiZQorICAgICAgICAgICAgIyByZWxpZWQgdXBvbiB0byBkbyBjb3JyZWN0IHJvdW5kaW5nIG9uIGFsbCBwbGF0Zm9ybXMuCisgICAgICAgICAgICB0YWlsID0gbWF4KGxlbihiaW4oYWJzKHRtYW50KSkpLTIgLSBtYW50X2RpZywgZXRpbnkgLSB0ZXhwKQorICAgICAgICAgICAgaWYgdGFpbCA+IDA6CisgICAgICAgICAgICAgICAgaCA9IDEgPDwgKHRhaWwtMSkKKyAgICAgICAgICAgICAgICB0bWFudCA9IHRtYW50IC8vICgyKmgpICsgYm9vbCh0bWFudCAmIGggYW5kIHRtYW50ICYgMypoLTEpCisgICAgICAgICAgICAgICAgdGV4cCArPSB0YWlsCisgICAgICAgICAgICByZXR1cm4gbWF0aC5sZGV4cCh0bWFudCwgdGV4cCkKKworICAgICAgICB0ZXN0X3ZhbHVlcyA9IFsKKyAgICAgICAgICAgIChbXSwgMC4wKSwKKyAgICAgICAgICAgIChbMC4wXSwgMC4wKSwKKyAgICAgICAgICAgIChbMWUxMDAsIDEuMCwgLTFlMTAwLCAxZS0xMDAsIDFlNTAsIC0xLjAsIC0xZTUwXSwgMWUtMTAwKSwKKyAgICAgICAgICAgIChbMi4wKio1MywgLTAuNSwgLTIuMCoqLTU0XSwgMi4wKio1My0xLjApLAorICAgICAgICAgICAgKFsyLjAqKjUzLCAxLjAsIDIuMCoqLTEwMF0sIDIuMCoqNTMrMi4wKSwKKyAgICAgICAgICAgIChbMi4wKio1MysxMC4wLCAxLjAsIDIuMCoqLTEwMF0sIDIuMCoqNTMrMTIuMCksCisgICAgICAgICAgICAoWzIuMCoqNTMtNC4wLCAwLjUsIDIuMCoqLTU0XSwgMi4wKio1My0zLjApLAorICAgICAgICAgICAgKFsxLi9uIGZvciBuIGluIHJhbmdlKDEsIDEwMDEpXSwKKyAgICAgICAgICAgICBmbG9hdC5mcm9taGV4KCcweDEuZGYxMWY0NWY0ZTYxYXArMicpKSwKKyAgICAgICAgICAgIChbKC0xLikqKm4vbiBmb3IgbiBpbiByYW5nZSgxLCAxMDAxKV0sCisgICAgICAgICAgICAgZmxvYXQuZnJvbWhleCgnLTB4MS42MmEyYWYxYmQzNjI0cC0xJykpLAorICAgICAgICAgICAgKFsxLjcqKihpKzEpLTEuNyoqaSBmb3IgaSBpbiByYW5nZSgxMDAwKV0gKyBbLTEuNyoqMTAwMF0sIC0xLjApLAorICAgICAgICAgICAgKFsxZTE2LCAxLiwgMWUtMTZdLCAxMDAwMDAwMDAwMDAwMDAwMi4wKSwKKyAgICAgICAgICAgIChbMWUxNi0yLiwgMS4tMi4qKi01MywgLSgxZTE2LTIuKSwgLSgxLi0yLioqLTUzKV0sIDAuMCksCisgICAgICAgICAgICAjIGV4ZXJjaXNlIGNvZGUgZm9yIHJlc2l6aW5nIHBhcnRpYWxzIGFycmF5CisgICAgICAgICAgICAoWzIuKipuIC0gMi4qKihuKzUwKSArIDIuKioobis1MikgZm9yIG4gaW4gcmFuZ2UoLTEwNzQsIDk3MiwgMildICsKKyAgICAgICAgICAgICBbLTIuKioxMDIyXSwKKyAgICAgICAgICAgICBmbG9hdC5mcm9taGV4KCcweDEuNTU1NTU1NTU1NTU1NXArOTcwJykpLAorICAgICAgICAgICAgXQorCisgICAgICAgIGZvciBpLCAodmFscywgZXhwZWN0ZWQpIGluIGVudW1lcmF0ZSh0ZXN0X3ZhbHVlcyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYWN0dWFsID0gbWF0aC5mc3VtKHZhbHMpCisgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInRlc3QgJWQgZmFpbGVkOiBnb3QgT3ZlcmZsb3dFcnJvciwgZXhwZWN0ZWQgJXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIG1hdGguZnN1bSglLjEwMHIpIiAlIChpLCBleHBlY3RlZCwgdmFscykpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInRlc3QgJWQgZmFpbGVkOiBnb3QgVmFsdWVFcnJvciwgZXhwZWN0ZWQgJXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIG1hdGguZnN1bSglLjEwMHIpIiAlIChpLCBleHBlY3RlZCwgdmFscykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisKKyAgICAgICAgZnJvbSByYW5kb20gaW1wb3J0IHJhbmRvbSwgZ2F1c3MsIHNodWZmbGUKKyAgICAgICAgZm9yIGogaW4geHJhbmdlKDEwMDApOgorICAgICAgICAgICAgdmFscyA9IFs3LCAxZTEwMCwgLTcsIC0xZTEwMCwgLTllLTIwLCA4ZS0yMF0gKiAxMAorICAgICAgICAgICAgcyA9IDAKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMDApOgorICAgICAgICAgICAgICAgIHYgPSBnYXVzcygwLCByYW5kb20oKSkgKiogNyAtIHMKKyAgICAgICAgICAgICAgICBzICs9IHYKKyAgICAgICAgICAgICAgICB2YWxzLmFwcGVuZCh2KQorICAgICAgICAgICAgc2h1ZmZsZSh2YWxzKQorCisgICAgICAgICAgICBzID0gbXN1bSh2YWxzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc3VtKHZhbHMpLCBtYXRoLmZzdW0odmFscykpCisKKyAgICBkZWYgdGVzdEh5cG90KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguaHlwb3QpCisgICAgICAgIHNlbGYuZnRlc3QoJ2h5cG90KDAsMCknLCBtYXRoLmh5cG90KDAsMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2h5cG90KDMsNCknLCBtYXRoLmh5cG90KDMsNCksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5oeXBvdChOQU4sIElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmh5cG90KElORiwgTkFOKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguaHlwb3QoTkFOLCBOSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguaHlwb3QoTklORiwgTkFOKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmh5cG90KDEuMCwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguaHlwb3QoTkFOLCAtMi4wKSkpCisKKyAgICBkZWYgdGVzdExkZXhwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubGRleHApCisgICAgICAgIHNlbGYuZnRlc3QoJ2xkZXhwKDAsMSknLCBtYXRoLmxkZXhwKDAsMSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2xkZXhwKDEsMSknLCBtYXRoLmxkZXhwKDEsMSksIDIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2xkZXhwKDEsLTEpJywgbWF0aC5sZGV4cCgxLC0xKSwgMC41KQorICAgICAgICBzZWxmLmZ0ZXN0KCdsZGV4cCgtMSwxKScsIG1hdGgubGRleHAoLTEsMSksIC0yKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBtYXRoLmxkZXhwLCAxLiwgMTAwMDAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbWF0aC5sZGV4cCwgLTEuLCAxMDAwMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubGRleHAoMS4sIC0xMDAwMDAwKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sZGV4cCgtMS4sIC0xMDAwMDAwKSwgLTAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubGRleHAoSU5GLCAzMCksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmxkZXhwKE5JTkYsIC0yMTMpLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmxkZXhwKE5BTiwgMCkpKQorCisgICAgICAgICMgbGFyZ2Ugc2Vjb25kIGFyZ3VtZW50CisgICAgICAgIGZvciBuIGluIFsxMCoqNSwgMTBMKio1LCAxMCoqMTAsIDEwTCoqMTAsIDEwKioyMCwgMTAqKjQwXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sZGV4cChJTkYsIC1uKSwgSU5GKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmxkZXhwKE5JTkYsIC1uKSwgTklORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sZGV4cCgxLiwgLW4pLCAwLikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sZGV4cCgtMS4sIC1uKSwgLTAuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmxkZXhwKDAuLCAtbiksIDAuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmxkZXhwKC0wLiwgLW4pLCAtMC4pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmxkZXhwKE5BTiwgLW4pKSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbWF0aC5sZGV4cCwgMS4sIG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBtYXRoLmxkZXhwLCAtMS4sIG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubGRleHAoMC4sIG4pLCAwLikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sZGV4cCgtMC4sIG4pLCAtMC4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubGRleHAoSU5GLCBuKSwgSU5GKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmxkZXhwKE5JTkYsIG4pLCBOSU5GKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5sZGV4cChOQU4sIG4pKSkKKworICAgIGRlZiB0ZXN0TG9nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubG9nKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coMS9lKScsIG1hdGgubG9nKDEvbWF0aC5lKSwgLTEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZygxKScsIG1hdGgubG9nKDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coZSknLCBtYXRoLmxvZyhtYXRoLmUpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coMzIsMiknLCBtYXRoLmxvZygzMiwyKSwgNSkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nKDEwKio0MCwgMTApJywgbWF0aC5sb2coMTAqKjQwLCAxMCksIDQwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coMTAqKjQwLCAxMCoqMjApJywgbWF0aC5sb2coMTAqKjQwLCAxMCoqMjApLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubG9nKElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5sb2csIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgubG9nKE5BTikpKQorCisgICAgZGVmIHRlc3RMb2cxcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmxvZzFwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2cxcCgxL2UgLTEpJywgbWF0aC5sb2cxcCgxL21hdGguZS0xKSwgLTEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZzFwKDApJywgbWF0aC5sb2cxcCgwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nMXAoZS0xKScsIG1hdGgubG9nMXAobWF0aC5lLTEpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2cxcCgxKScsIG1hdGgubG9nMXAoMSksIG1hdGgubG9nKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubG9nMXAoSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmxvZzFwLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmxvZzFwKE5BTikpKQorICAgICAgICBuPSAyKio5MAorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKG1hdGgubG9nMXAobiksIDYyLjM4MzI0NjI1MDM5NTA3NSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChtYXRoLmxvZzFwKG4pLCBtYXRoLmxvZzFwKGZsb2F0KG4pKSkKKworICAgIGRlZiB0ZXN0TG9nMTAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5sb2cxMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nMTAoMC4xKScsIG1hdGgubG9nMTAoMC4xKSwgLTEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZzEwKDEpJywgbWF0aC5sb2cxMCgxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nMTAoMTApJywgbWF0aC5sb2cxMCgxMCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sb2coSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmxvZzEwLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmxvZzEwKE5BTikpKQorCisgICAgZGVmIHRlc3RNb2RmKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubW9kZikKKworICAgICAgICBkZWYgdGVzdG1vZGYobmFtZSwgcmVzdWx0LCBleHBlY3RlZCk6CisgICAgICAgICAgICAodjEsIHYyKSwgKGUxLCBlMikgPSByZXN1bHQsIGV4cGVjdGVkCisgICAgICAgICAgICBpZiBhYnModjEtZTEpID4gZXBzIG9yIGFicyh2Mi1lMik6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCclcyByZXR1cm5lZCAlciwgZXhwZWN0ZWQgJXInJVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsICh2MSx2MiksIChlMSxlMikpKQorCisgICAgICAgIHRlc3Rtb2RmKCdtb2RmKDEuNSknLCBtYXRoLm1vZGYoMS41KSwgKDAuNSwgMS4wKSkKKyAgICAgICAgdGVzdG1vZGYoJ21vZGYoLTEuNSknLCBtYXRoLm1vZGYoLTEuNSksICgtMC41LCAtMS4wKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubW9kZihJTkYpLCAoMC4wLCBJTkYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubW9kZihOSU5GKSwgKC0wLjAsIE5JTkYpKQorCisgICAgICAgIG1vZGZfbmFuID0gbWF0aC5tb2RmKE5BTikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obW9kZl9uYW5bMF0pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtb2RmX25hblsxXSkpCisKKyAgICBkZWYgdGVzdFBvdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnBvdykKKyAgICAgICAgc2VsZi5mdGVzdCgncG93KDAsMSknLCBtYXRoLnBvdygwLDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdwb3coMSwwKScsIG1hdGgucG93KDEsMCksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ3BvdygyLDEpJywgbWF0aC5wb3coMiwxKSwgMikKKyAgICAgICAgc2VsZi5mdGVzdCgncG93KDIsLTEpJywgbWF0aC5wb3coMiwtMSksIDAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhJTkYsIDEpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTklORiwgMSksIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG1hdGgucG93KDEsIElORikpLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobWF0aC5wb3coMSwgTklORikpLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5wb3coTkFOLCAxKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgucG93KDIsIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnBvdygwLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLCBOQU4pLCAxKQorCisgICAgICAgICMgcG93KDAuLCB4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDAuLCBJTkYpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygwLiwgMy4pLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygwLiwgMi4zKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMC4sIDIuKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMC4sIDAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMC4sIC0wLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgMC4sIC0yLikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIDAuLCAtMi4zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgMC4sIC0zLikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIDAuLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnBvdygwLiwgTkFOKSkpCisKKyAgICAgICAgIyBwb3coSU5GLCB4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KElORiwgSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KElORiwgMy4pLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coSU5GLCAyLjMpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coSU5GLCAyLiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhJTkYsIDAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coSU5GLCAtMC4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhJTkYsIC0yLiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KElORiwgLTIuMyksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KElORiwgLTMuKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coSU5GLCBOSU5GKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgucG93KElORiwgTkFOKSkpCisKKyAgICAgICAgIyBwb3coLTAuLCB4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0wLiwgSU5GKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTAuLCAzLiksIC0wLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMC4sIDIuMyksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0wLiwgMi4pLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMC4sIDAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTAuLCAtMC4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIC0wLiwgLTIuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgLTAuLCAtMi4zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgLTAuLCAtMy4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgucG93LCAtMC4sIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgucG93KC0wLiwgTkFOKSkpCisKKyAgICAgICAgIyBwb3coTklORiwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhOSU5GLCBJTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTklORiwgMy4pLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KE5JTkYsIDIuMyksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhOSU5GLCAyLiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhOSU5GLCAwLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KE5JTkYsIC0wLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KE5JTkYsIC0yLiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KE5JTkYsIC0yLjMpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhOSU5GLCAtMy4pLCAtMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTklORiwgTklORiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnBvdyhOSU5GLCBOQU4pKSkKKworICAgICAgICAjIHBvdygtMSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMS4sIElORiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0xLiwgMy4pLCAtMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgucG93LCAtMS4sIDIuMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMS4sIDIuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuLCAwLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0xLiwgLTAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuLCAtMi4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIC0xLiwgLTIuMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMS4sIC0zLiksIC0xLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMS4sIE5JTkYpLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5wb3coLTEuLCBOQU4pKSkKKworICAgICAgICAjIHBvdygxLCB4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDEuLCBJTkYpLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLiwgMy4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLiwgMi4zKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMS4sIDIuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMS4sIDAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMS4sIC0wLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDEuLCAtMi4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLiwgLTIuMyksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDEuLCAtMy4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLiwgTklORiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDEuLCBOQU4pLCAxLikKKworICAgICAgICAjIHBvdyh4LCAwKSBzaG91bGQgYmUgMSBmb3IgYW55IHgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygyLjMsIDAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTIuMywgMC4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhOQU4sIDAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMi4zLCAtMC4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMi4zLCAtMC4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhOQU4sIC0wLiksIDEuKQorCisgICAgICAgICMgcG93KHgsIHkpIGlzIGludmFsaWQgaWYgeCBpcyBuZWdhdGl2ZSBhbmQgeSBpcyBub3QgaW50ZWdyYWwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIC0xLiwgMi4zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgLTE1LiwgLTMuMSkKKworICAgICAgICAjIHBvdyh4LCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDEuOSwgTklORiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDEuMSwgTklORiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDAuOSwgTklORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygwLjEsIE5JTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTAuMSwgTklORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMC45LCBOSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0xLjEsIE5JTkYpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMS45LCBOSU5GKSwgMC4pCisKKyAgICAgICAgIyBwb3coeCwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDEuOSwgSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDEuMSwgSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDAuOSwgSU5GKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMC4xLCBJTkYpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMC4xLCBJTkYpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMC45LCBJTkYpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMS4xLCBJTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuOSwgSU5GKSwgSU5GKQorCisgICAgICAgICMgcG93KHgsIHkpIHNob3VsZCB3b3JrIGZvciB4IG5lZ2F0aXZlLCB5IGFuIGludGVnZXIKKyAgICAgICAgc2VsZi5mdGVzdCgnKC0yLikqKjMuJywgbWF0aC5wb3coLTIuMCwgMy4wKSwgLTguMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnKC0yLikqKjIuJywgbWF0aC5wb3coLTIuMCwgMi4wKSwgNC4wKQorICAgICAgICBzZWxmLmZ0ZXN0KCcoLTIuKSoqMS4nLCBtYXRoLnBvdygtMi4wLCAxLjApLCAtMi4wKQorICAgICAgICBzZWxmLmZ0ZXN0KCcoLTIuKSoqMC4nLCBtYXRoLnBvdygtMi4wLCAwLjApLCAxLjApCisgICAgICAgIHNlbGYuZnRlc3QoJygtMi4pKiotMC4nLCBtYXRoLnBvdygtMi4wLCAtMC4wKSwgMS4wKQorICAgICAgICBzZWxmLmZ0ZXN0KCcoLTIuKSoqLTEuJywgbWF0aC5wb3coLTIuMCwgLTEuMCksIC0wLjUpCisgICAgICAgIHNlbGYuZnRlc3QoJygtMi4pKiotMi4nLCBtYXRoLnBvdygtMi4wLCAtMi4wKSwgMC4yNSkKKyAgICAgICAgc2VsZi5mdGVzdCgnKC0yLikqKi0zLicsIG1hdGgucG93KC0yLjAsIC0zLjApLCAtMC4xMjUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgucG93LCAtMi4wLCAtMC41KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgLTIuMCwgMC41KQorCisgICAgICAgICMgdGhlIGZvbGxvd2luZyB0ZXN0cyBoYXZlIGJlZW4gY29tbWVudGVkIG91dCBzaW5jZSB0aGV5IGRvbid0CisgICAgICAgICMgcmVhbGx5IGJlbG9uZyBoZXJlOiAgdGhlIGltcGxlbWVudGF0aW9uIG9mICoqIGZvciBmbG9hdHMgaXMKKyAgICAgICAgIyBpbmRlcGVuZGVudCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgbWF0aC5wb3cKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwoMSoqTkFOLCAxKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbCgxKipJTkYsIDEpCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKDEqKk5JTkYsIDEpCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKDEqKjAsIDEpCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKDEuKipOQU4sIDEpCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKDEuKipJTkYsIDEpCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKDEuKipOSU5GLCAxKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbCgxLioqMCwgMSkKKworICAgIGRlZiB0ZXN0UmFkaWFucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnJhZGlhbnMpCisgICAgICAgIHNlbGYuZnRlc3QoJ3JhZGlhbnMoMTgwKScsIG1hdGgucmFkaWFucygxODApLCBtYXRoLnBpKQorICAgICAgICBzZWxmLmZ0ZXN0KCdyYWRpYW5zKDkwKScsIG1hdGgucmFkaWFucyg5MCksIG1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgncmFkaWFucygtNDUpJywgbWF0aC5yYWRpYW5zKC00NSksIC1tYXRoLnBpLzQpCisKKyAgICBkZWYgdGVzdFNpbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnNpbikKKyAgICAgICAgc2VsZi5mdGVzdCgnc2luKDApJywgbWF0aC5zaW4oMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ3NpbihwaS8yKScsIG1hdGguc2luKG1hdGgucGkvMiksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ3NpbigtcGkvMiknLCBtYXRoLnNpbigtbWF0aC5waS8yKSwgLTEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguc2luKElORikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5zaW4oTklORikpKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguc2luLCBJTkYpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnNpbiwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5zaW4oTkFOKSkpCisKKyAgICBkZWYgdGVzdFNpbmgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5zaW5oKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzaW5oKDApJywgbWF0aC5zaW5oKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzaW5oKDEpKioyLWNvc2goMSkqKjInLCBtYXRoLnNpbmgoMSkqKjItbWF0aC5jb3NoKDEpKioyLCAtMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnc2luaCgxKStzaW5oKC0xKScsIG1hdGguc2luaCgxKSttYXRoLnNpbmgoLTEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguc2luaChJTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5zaW5oKE5JTkYpLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnNpbmgoTkFOKSkpCisKKyAgICBkZWYgdGVzdFNxcnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5zcXJ0KQorICAgICAgICBzZWxmLmZ0ZXN0KCdzcXJ0KDApJywgbWF0aC5zcXJ0KDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzcXJ0KDEpJywgbWF0aC5zcXJ0KDEpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzcXJ0KDQpJywgbWF0aC5zcXJ0KDQpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguc3FydChJTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguc3FydCwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5zcXJ0KE5BTikpKQorCisgICAgZGVmIHRlc3RUYW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC50YW4pCisgICAgICAgIHNlbGYuZnRlc3QoJ3RhbigwKScsIG1hdGgudGFuKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCd0YW4ocGkvNCknLCBtYXRoLnRhbihtYXRoLnBpLzQpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCd0YW4oLXBpLzQpJywgbWF0aC50YW4oLW1hdGgucGkvNCksIC0xKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnRhbihJTkYpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgudGFuKE5JTkYpKSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC50YW4sIElORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgudGFuLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnRhbihOQU4pKSkKKworICAgIGRlZiB0ZXN0VGFuaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnRhbmgpCisgICAgICAgIHNlbGYuZnRlc3QoJ3RhbmgoMCknLCBtYXRoLnRhbmgoMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ3RhbmgoMSkrdGFuaCgtMSknLCBtYXRoLnRhbmgoMSkrbWF0aC50YW5oKC0xKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgndGFuaChpbmYpJywgbWF0aC50YW5oKElORiksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ3RhbmgoLWluZiknLCBtYXRoLnRhbmgoTklORiksIC0xKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnRhbmgoTkFOKSkpCisgICAgICAgICMgY2hlY2sgdGhhdCB0YW5oKC0wLikgPT0gLTAuIG9uIElFRUUgNzU0IHN5c3RlbXMKKyAgICAgICAgaWYgZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnRhbmgoLTAuKSwgLTAuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKDEuLCBtYXRoLnRhbmgoLTAuKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGguY29weXNpZ24oMS4sIC0wLikpCisKKyAgICBkZWYgdGVzdF90cnVuYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnRydW5jKDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgudHJ1bmMoLTEpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKG1hdGgudHJ1bmMoMSkpLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShtYXRoLnRydW5jKDEuNSkpLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC50cnVuYygxLjUpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgudHJ1bmMoLTEuNSksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgudHJ1bmMoMS45OTk5OTkpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgudHJ1bmMoLTEuOTk5OTk5KSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC50cnVuYygtMC45OTk5OTkpLCAtMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnRydW5jKC0xMDAuOTk5KSwgLTEwMCkKKworICAgICAgICBjbGFzcyBUZXN0VHJ1bmMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3RydW5jX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDIzCisKKyAgICAgICAgY2xhc3MgVGVzdE5vVHJ1bmMob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgudHJ1bmMoVGVzdFRydW5jKCkpLCAyMykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgudHJ1bmMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC50cnVuYywgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpLCBtYXRoLnRydW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0Tm9UcnVuYygpKQorCisgICAgZGVmIHRlc3RJc25hbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oZmxvYXQoIm5hbiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oZmxvYXQoImluZiIpKiAwLikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc25hbihmbG9hdCgiaW5mIikpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1hdGguaXNuYW4oMC4pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1hdGguaXNuYW4oMS4pKQorCisgICAgZGVmIHRlc3RJc2luZihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNpbmYoZmxvYXQoImluZiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNpbmYoZmxvYXQoIi1pbmYiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzaW5mKDFFNDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNpbmYoLTFFNDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtYXRoLmlzaW5mKGZsb2F0KCJuYW4iKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc2luZigwLikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc2luZigxLikpCisKKyAgICAjIFJFRF9GTEFHIDE2LU9jdC0yMDAwIFRpbQorICAgICMgV2hpbGUgMi4wIGlzIG1vcmUgY29uc2lzdGVudCBhYm91dCBleGNlcHRpb25zIHRoYW4gcHJldmlvdXMgcmVsZWFzZXMsIGl0CisgICAgIyBzdGlsbCBmYWlscyB0aGlzIHBhcnQgb2YgdGhlIHRlc3Qgb24gc29tZSBwbGF0Zm9ybXMuICBGb3Igbm93LCB3ZSBvbmx5CisgICAgIyAqcnVuKiB0ZXN0X2V4Y2VwdGlvbnMoKSBpbiB2ZXJib3NlIG1vZGUsIHNvIHRoYXQgdGhpcyBpc24ndCBub3JtYWxseQorICAgICMgdGVzdGVkLgorCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgZGVmIHRlc3RfZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4ID0gbWF0aC5leHAoLTEwMDAwMDAwMDApCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBtYXRobW9kdWxlLmMgaXMgZmFpbGluZyB0byB3ZWVkIG91dCB1bmRlcmZsb3dzIGZyb20gbGlibSwgb3IKKyAgICAgICAgICAgICAgICAjIHdlJ3ZlIGdvdCBhbiBmcCBmb3JtYXQgd2l0aCBodWdlIGR5bmFtaWMgcmFuZ2UKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuZGVyZmxvd2luZyBleHAoKSBzaG91bGQgbm90IGhhdmUgcmFpc2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFuIGV4Y2VwdGlvbiIpCisgICAgICAgICAgICBpZiB4ICE9IDA6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmRlcmZsb3dpbmcgZXhwKCkgc2hvdWxkIGhhdmUgcmV0dXJuZWQgMCIpCisKKyAgICAgICAgICAgICMgSWYgdGhpcyBmYWlscywgcHJvYmFibHkgdXNpbmcgYSBzdHJpY3QgSUVFRS03NTQgY29uZm9ybWluZyBsaWJtLCBhbmQgeAorICAgICAgICAgICAgIyBpcyArSW5mIGFmdGVyd2FyZHMuICBCdXQgUHl0aG9uIHdhbnRzIG92ZXJmbG93cyBkZXRlY3RlZCBieSBkZWZhdWx0LgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHggPSBtYXRoLmV4cCgxMDAwMDAwMDAwKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm92ZXJmbG93aW5nIGV4cCgpIGRpZG4ndCB0cmlnZ2VyIE92ZXJmbG93RXJyb3IiKQorCisgICAgICAgICAgICAjIElmIHRoaXMgZmFpbHMsIGl0IGNvdWxkIGJlIGEgcHV6emxlLiAgT25lIG9kZCBwb3NzaWJpbGl0eSBpcyB0aGF0CisgICAgICAgICAgICAjIG1hdGhtb2R1bGUuYydzIG1hY3JvcyBhcmUgZ2V0dGluZyBjb25mdXNlZCB3aGlsZSBjb21wYXJpbmcKKyAgICAgICAgICAgICMgSW5mIChIVUdFX1ZBTCkgdG8gYSBOYU4sIGFuZCBhcnRpZmljaWFsbHkgc2V0dGluZyBlcnJubyB0byBFUkFOR0UKKyAgICAgICAgICAgICMgYXMgYSByZXN1bHQgKGFuZCBzbyByYWlzaW5nIE92ZXJmbG93RXJyb3IgaW5zdGVhZCkuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeCA9IG1hdGguc3FydCgtMS4wKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNxcnQoLTEpIGRpZG4ndCByYWlzZSBWYWx1ZUVycm9yIikKKworICAgIEByZXF1aXJlc19JRUVFXzc1NAorICAgIGRlZiB0ZXN0X3Rlc3RmaWxlKHNlbGYpOgorICAgICAgICBmb3IgaWQsIGZuLCBhciwgYWksIGVyLCBlaSwgZmxhZ3MgaW4gcGFyc2VfdGVzdGZpbGUodGVzdF9maWxlKToKKyAgICAgICAgICAgICMgU2tpcCBpZiBlaXRoZXIgdGhlIGlucHV0IG9yIHJlc3VsdCBpcyBjb21wbGV4LCBvciBpZgorICAgICAgICAgICAgIyBmbGFncyBpcyBub25lbXB0eQorICAgICAgICAgICAgaWYgYWkgIT0gMC4gb3IgZWkgIT0gMC4gb3IgZmxhZ3M6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGZuIGluIFsncmVjdCcsICdwb2xhciddOgorICAgICAgICAgICAgICAgICMgbm8gcmVhbCB2ZXJzaW9ucyBvZiByZWN0LCBwb2xhcgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihtYXRoLCBmbikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jKGFyKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICgiVW5leHBlY3RlZCBWYWx1ZUVycm9yIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgJXM6JXMoJXIpXG4iICUgKGlkLCBmbiwgYXIpKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbChtZXNzYWdlKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICgiVW5leHBlY3RlZCBPdmVyZmxvd0Vycm9yIGluICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgJXM6JXMoJXIpXG4iICUgKGlkLCBmbiwgYXIpKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbChtZXNzYWdlKQorICAgICAgICAgICAgc2VsZi5mdGVzdCgiJXM6JXMoJXIpIiAlIChpZCwgZm4sIGFyKSwgcmVzdWx0LCBlcikKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCByZXF1aXJlcyBJRUVFIDc1NCBkb3VibGVzIikKKyAgICBkZWYgdGVzdF9tdGVzdGZpbGUoc2VsZik6CisgICAgICAgIEFMTE9XRURfRVJST1IgPSAyMCAgIyBwZXJtaXR0ZWQgZXJyb3IsIGluIHVscHMKKyAgICAgICAgZmFpbF9mbXQgPSAie306e30oeyFyfSk6IGV4cGVjdGVkIHshcn0sIGdvdCB7IXJ9IgorCisgICAgICAgIGZhaWx1cmVzID0gW10KKyAgICAgICAgZm9yIGlkLCBmbiwgYXJnLCBleHBlY3RlZCwgZmxhZ3MgaW4gcGFyc2VfbXRlc3RmaWxlKG1hdGhfdGVzdGNhc2VzKToKKyAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKG1hdGgsIGZuKQorCisgICAgICAgICAgICBpZiAnaW52YWxpZCcgaW4gZmxhZ3Mgb3IgJ2RpdmlkZS1ieS16ZXJvJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9ICdWYWx1ZUVycm9yJworICAgICAgICAgICAgZWxpZiAnb3ZlcmZsb3cnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gJ092ZXJmbG93RXJyb3InCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBnb3QgPSBmdW5jKGFyZykKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGdvdCA9ICdWYWx1ZUVycm9yJworICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgZ290ID0gJ092ZXJmbG93RXJyb3InCisKKyAgICAgICAgICAgIGFjY3VyYWN5X2ZhaWx1cmUgPSBOb25lCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGdvdCwgZmxvYXQpIGFuZCBpc2luc3RhbmNlKGV4cGVjdGVkLCBmbG9hdCk6CisgICAgICAgICAgICAgICAgaWYgbWF0aC5pc25hbihleHBlY3RlZCkgYW5kIG1hdGguaXNuYW4oZ290KToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBub3QgbWF0aC5pc25hbihleHBlY3RlZCkgYW5kIG5vdCBtYXRoLmlzbmFuKGdvdCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGZuID09ICdsZ2FtbWEnOgorICAgICAgICAgICAgICAgICAgICAgICAgIyB3ZSB1c2UgYSB3ZWFrZXIgYWNjdXJhY3kgdGVzdCBmb3IgbGdhbW1hOworICAgICAgICAgICAgICAgICAgICAgICAgIyBsZ2FtbWEgb25seSBhY2hpZXZlcyBhbiBhYnNvbHV0ZSBlcnJvciBvZgorICAgICAgICAgICAgICAgICAgICAgICAgIyBhIGZldyBtdWx0aXBsZXMgb2YgdGhlIG1hY2hpbmUgYWNjdXJhY3ksIGluCisgICAgICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYWwuCisgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeV9mYWlsdXJlID0gYWNjX2NoZWNrKGV4cGVjdGVkLCBnb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9lcnIgPSA1ZS0xNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzX2VyciA9IDVlLTE1KQorICAgICAgICAgICAgICAgICAgICBlbGlmIGZuID09ICdlcmZjJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZXJmYyBoYXMgbGVzcy10aGFuLWlkZWFsIGFjY3VyYWN5IGZvciBsYXJnZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMgKHggfiAyNSBvciBzbyksIG1haW5seSBkdWUgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGVycm9yIGludm9sdmVkIGluIGNvbXB1dGluZyBleHAoLXgqeCkuCisgICAgICAgICAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCBXb3VsZCBiZSBiZXR0ZXIgdG8gd2Vha2VuIHRoaXMgdGVzdCBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciBsYXJnZSB4LCBpbnN0ZWFkIG9mIGZvciBhbGwgeC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VyYWN5X2ZhaWx1cmUgPSB1bHBzX2NoZWNrKGV4cGVjdGVkLCBnb3QsIDIwMDApCisKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VyYWN5X2ZhaWx1cmUgPSB1bHBzX2NoZWNrKGV4cGVjdGVkLCBnb3QsIDIwKQorICAgICAgICAgICAgICAgICAgICBpZiBhY2N1cmFjeV9mYWlsdXJlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGdvdCwgc3RyKSBhbmQgaXNpbnN0YW5jZShleHBlY3RlZCwgc3RyKToKKyAgICAgICAgICAgICAgICBpZiBnb3QgPT0gZXhwZWN0ZWQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGZhaWxfbXNnID0gZmFpbF9mbXQuZm9ybWF0KGlkLCBmbiwgYXJnLCBleHBlY3RlZCwgZ290KQorICAgICAgICAgICAgaWYgYWNjdXJhY3lfZmFpbHVyZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBmYWlsX21zZyArPSAnICh7fSknLmZvcm1hdChhY2N1cmFjeV9mYWlsdXJlKQorICAgICAgICAgICAgZmFpbHVyZXMuYXBwZW5kKGZhaWxfbXNnKQorCisgICAgICAgIGlmIGZhaWx1cmVzOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdGYWlsdXJlcyBpbiB0ZXN0X210ZXN0ZmlsZTpcbiAgJyArCisgICAgICAgICAgICAgICAgICAgICAgJ1xuICAnLmpvaW4oZmFpbHVyZXMpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBmcm9tIGRvY3Rlc3QgaW1wb3J0IERvY0ZpbGVTdWl0ZQorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShNYXRoVGVzdHMpKQorICAgIHN1aXRlLmFkZFRlc3QoRG9jRmlsZVN1aXRlKCJpZWVlNzU0LnR4dCIpKQorICAgIHJ1bl91bml0dGVzdChzdWl0ZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWF0aC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYXRoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDVlZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWF0aC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWF0aC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYXRoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDVlZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWF0aC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWQ1LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWQ1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMGU4ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZDUucHkKQEAgLTAsMCArMSw2MSBAQAorIyBUZXN0aW5nIG1kNSBtb2R1bGUKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0aGUgbWQ1IG1vZHVsZSBpcyBkZXByZWNhdGVkLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gbWQ1IGltcG9ydCBtZDUKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2RlZiBoZXhzdHIocyk6CisgICAgaW1wb3J0IHN0cmluZworICAgIGggPSBzdHJpbmcuaGV4ZGlnaXRzCisgICAgciA9ICcnCisgICAgZm9yIGMgaW4gczoKKyAgICAgICAgaSA9IG9yZChjKQorICAgICAgICByID0gciArIGhbKGkgPj4gNCkgJiAweEZdICsgaFtpICYgMHhGXQorICAgIHJldHVybiByCisKK2NsYXNzIE1ENV9UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBtZDV0ZXN0KHNlbGYsIHMsIGV4cGVjdGVkKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZXhzdHIobWQ1KHMpLmRpZ2VzdCgpKSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWQ1KHMpLmhleGRpZ2VzdCgpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm1kNXRlc3QKKyAgICAgICAgZXEoJycsICdkNDFkOGNkOThmMDBiMjA0ZTk4MDA5OThlY2Y4NDI3ZScpCisgICAgICAgIGVxKCdhJywgJzBjYzE3NWI5YzBmMWI2YTgzMWMzOTllMjY5NzcyNjYxJykKKyAgICAgICAgZXEoJ2FiYycsICc5MDAxNTA5ODNjZDI0ZmIwZDY5NjNmN2QyOGUxN2Y3MicpCisgICAgICAgIGVxKCdtZXNzYWdlIGRpZ2VzdCcsICdmOTZiNjk3ZDdjYjc5MzhkNTI1YTJmMzFhYWYxNjFkMCcpCisgICAgICAgIGVxKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicsICdjM2ZjZDNkNzYxOTJlNDAwN2RmYjQ5NmNjYTY3ZTEzYicpCisgICAgICAgIGVxKCdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OScsCisgICAgICAgICAgICdkMTc0YWI5OGQyNzdkOWY1YTU2MTFjMmM5ZjQxOWQ5ZicpCisgICAgICAgIGVxKCcxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCcsCisgICAgICAgICAgICc1N2VkZjRhMjJiZTNjOTU1YWM0OWRhMmUyMTA3YjY3YScpCisKKyAgICBkZWYgdGVzdF9oZXhkaWdlc3Qoc2VsZik6CisgICAgICAgICMgaGV4ZGlnZXN0IGlzIG5ldyB3aXRoIFB5dGhvbiAyLjAKKyAgICAgICAgbSA9IG1kNSgndGVzdGluZyB0aGUgaGV4ZGlnZXN0IG1ldGhvZCcpCisgICAgICAgIGggPSBtLmhleGRpZ2VzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4c3RyKG0uZGlnZXN0KCkpLCBoKQorCisgICAgZGVmIHRlc3RfbGFyZ2VfdXBkYXRlKHNlbGYpOgorICAgICAgICBhYXMgPSAnYScgKiA2NAorICAgICAgICBiZWVzID0gJ2InICogNjQKKyAgICAgICAgY2VlcyA9ICdjJyAqIDY0CisKKyAgICAgICAgbTEgPSBtZDUoKQorICAgICAgICBtMS51cGRhdGUoYWFzKQorICAgICAgICBtMS51cGRhdGUoYmVlcykKKyAgICAgICAgbTEudXBkYXRlKGNlZXMpCisKKyAgICAgICAgbTIgPSBtZDUoKQorICAgICAgICBtMi51cGRhdGUoYWFzICsgYmVlcyArIGNlZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEuZGlnZXN0KCksIG0yLmRpZ2VzdCgpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChNRDVfVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWQ1LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21kNS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjZjZlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21kNS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWQ1LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21kNS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjZjZlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21kNS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWVtb3J5aW8ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZW1vcnlpby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Q1NTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWVtb3J5aW8ucHkKQEAgLTAsMCArMSw3MTcgQEAKKyIiIlVuaXQgdGVzdHMgZm9yIG1lbW9yeS1iYXNlZCBmaWxlLWxpa2Ugb2JqZWN0cy4KK1N0cmluZ0lPIC0tIGZvciB1bmljb2RlIHN0cmluZ3MKK0J5dGVzSU8gLS0gZm9yIGJ5dGVzCisiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAorCitpbXBvcnQgaW8KK2ltcG9ydCBfcHlpbyBhcyBweWlvCitpbXBvcnQgcGlja2xlCisKK2NsYXNzIE1lbW9yeVNlZWtUZXN0TWl4aW46CisKKyAgICBkZWYgdGVzdEluaXQoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIGJ5dGVzSW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorCisgICAgZGVmIHRlc3RSZWFkKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBieXRlc0lvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6MV0sIGJ5dGVzSW8ucmVhZCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbMTo1XSwgYnl0ZXNJby5yZWFkKDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls1Ol0sIGJ5dGVzSW8ucmVhZCg5MDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuRU9GLCBieXRlc0lvLnJlYWQoKSkKKworICAgIGRlZiB0ZXN0UmVhZE5vQXJncyhzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwIikKKyAgICAgICAgYnl0ZXNJbyA9IHNlbGYuaW9jbGFzcyhidWYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGJ5dGVzSW8ucmVhZCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuRU9GLCBieXRlc0lvLnJlYWQoKSkKKworICAgIGRlZiB0ZXN0U2VlayhzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwIikKKyAgICAgICAgYnl0ZXNJbyA9IHNlbGYuaW9jbGFzcyhidWYpCisKKyAgICAgICAgYnl0ZXNJby5yZWFkKDUpCisgICAgICAgIGJ5dGVzSW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZiwgYnl0ZXNJby5yZWFkKCkpCisKKyAgICAgICAgYnl0ZXNJby5zZWVrKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzM6XSwgYnl0ZXNJby5yZWFkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnl0ZXNJby5zZWVrLCAwLjApCisKKyAgICBkZWYgdGVzdFRlbGwoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIGJ5dGVzSW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgYnl0ZXNJby50ZWxsKCkpCisgICAgICAgIGJ5dGVzSW8uc2Vlayg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDUsIGJ5dGVzSW8udGVsbCgpKQorICAgICAgICBieXRlc0lvLnNlZWsoMTAwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwMDAsIGJ5dGVzSW8udGVsbCgpKQorCisKK2NsYXNzIE1lbW9yeVRlc3RNaXhpbjoKKworICAgIGRlZiB0ZXN0X2RldGFjaChzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5VbnN1cHBvcnRlZE9wZXJhdGlvbiwgYnVmLmRldGFjaCkKKworICAgIGRlZiB3cml0ZV9vcHMoc2VsZiwgZiwgdCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0ZSh0KCJibGFoLiIpKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWsoMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0ZSh0KCJIZWxsby4iKSksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKDUpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGUodCgiIHdvcmxkXG5cblxuIikpLCA5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlaygwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRlKHQoImgiKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50cnVuY2F0ZSgxMiksIDEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCAxKQorCisgICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiaGVsbG8gd29ybGRcbiIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKworICAgICAgICBzZWxmLndyaXRlX29wcyhtZW1pbywgc2VsZi5idWZ0eXBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1ZikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBzZWxmLndyaXRlX29wcyhtZW1pbywgc2VsZi5idWZ0eXBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby53cml0ZSwgTm9uZSkKKyAgICAgICAgbWVtaW8uY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby53cml0ZSwgc2VsZi5idWZ0eXBlKCIiKSkKKworICAgIGRlZiB0ZXN0X3dyaXRlbGluZXMoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLndyaXRlbGluZXMoW2J1Zl0gKiAxMDApLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1ZiAqIDEwMCkKKyAgICAgICAgbWVtaW8ud3JpdGVsaW5lcyhbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYgKiAxMDApCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby53cml0ZWxpbmVzLCBbYnVmXSArIFsxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8ud3JpdGVsaW5lcywgTm9uZSkKKyAgICAgICAgbWVtaW8uY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby53cml0ZWxpbmVzLCBbXSkKKworICAgIGRlZiB0ZXN0X3dyaXRlbGluZXNfZXJyb3Ioc2VsZik6CisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgZGVmIGVycm9yX2dlbigpOgorICAgICAgICAgICAgeWllbGQgc2VsZi5idWZ0eXBlKCdzcGFtJykKKyAgICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5Ym9hcmRJbnRlcnJ1cHQsIG1lbWlvLndyaXRlbGluZXMsIGVycm9yX2dlbigpKQorCisgICAgZGVmIHRlc3RfdHJ1bmNhdGUoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby50cnVuY2F0ZSwgLTEpCisgICAgICAgIG1lbWlvLnNlZWsoNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby50cnVuY2F0ZSgpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1Zls6Nl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8udHJ1bmNhdGUoNCksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmWzo0XSkKKyAgICAgICAgIyB0cnVuY2F0ZSgpIGFjY2VwdHMgbG9uZyBvYmplY3RzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8udHJ1bmNhdGUoNEwpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1Zls6NF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8udGVsbCgpLCA2KQorICAgICAgICBtZW1pby5zZWVrKDAsIDIpCisgICAgICAgIG1lbWlvLndyaXRlKGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWZbOjRdICsgYnVmKQorICAgICAgICBwb3MgPSBtZW1pby50ZWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby50cnVuY2F0ZShOb25lKSwgcG9zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnRlbGwoKSwgcG9zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLnRydW5jYXRlLCAnMCcpCisgICAgICAgIG1lbWlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8udHJ1bmNhdGUsIDApCisKKyAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIHNlbGYuRU9GKQorICAgICAgICBtZW1pby5fX2luaXRfXyhidWYgKiAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1ZiAqIDIpCisgICAgICAgIG1lbWlvLl9faW5pdF9fKGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYpCisKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDApLCBzZWxmLkVPRikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDEpLCBidWZbOjFdKQorICAgICAgICAjIHJlYWQoKSBhY2NlcHRzIGxvbmcgb2JqZWN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoNEwpLCBidWZbMTo1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDkwMCksIGJ1Zls1Ol0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgpLCBzZWxmLkVPRikKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgYnVmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgc2VsZi5FT0YpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8udGVsbCgpLCAxMCkKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoLTEpLCBidWYpCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKG1lbWlvLnJlYWQoKSksIHR5cGUoYnVmKSkKKyAgICAgICAgbWVtaW8uc2VlaygxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShtZW1pby5yZWFkKCkpLCB0eXBlKGJ1ZikpCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKE5vbmUpLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8ucmVhZCwgJycpCisgICAgICAgIG1lbWlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8ucmVhZCkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTBcbiIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZiAqIDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZSgwKSwgc2VsZi5FT0YpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmUoKSwgYnVmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRsaW5lKCksIGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZSgpLCBzZWxmLkVPRikKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRsaW5lKDUpLCBidWZbOjVdKQorICAgICAgICAjIHJlYWRsaW5lKCkgYWNjZXB0cyBsb25nIG9iamVjdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZSg1TCksIGJ1Zls1OjEwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZSg1KSwgYnVmWzEwOjE1XSkKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRsaW5lKC0xKSwgYnVmKQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmUoMCksIHNlbGYuRU9GKQorCisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MFxuIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoKGJ1ZiAqIDMpWzotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmUoKSwgYnVmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRsaW5lKCksIGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZSgpLCBidWZbOi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZSgpLCBzZWxmLkVPRikKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUobWVtaW8ucmVhZGxpbmUoKSksIHR5cGUoYnVmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZSgpLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8ucmVhZGxpbmUsICcnKQorICAgICAgICBtZW1pby5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICBtZW1pby5yZWFkbGluZSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwXG4iKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYgKiAxMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRsaW5lcygpLCBbYnVmXSAqIDEwKQorICAgICAgICBtZW1pby5zZWVrKDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmVzKCksIFtidWZbNTpdXSArIFtidWZdICogOSkKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICAjIHJlYWRsaW5lcygpIGFjY2VwdHMgbG9uZyBvYmplY3RzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmVzKDE1TCksIFtidWZdICogMikKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRsaW5lcygtMSksIFtidWZdICogMTApCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZXMoMCksIFtidWZdICogMTApCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKG1lbWlvLnJlYWRsaW5lcygpWzBdKSwgdHlwZShidWYpKQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmVzKE5vbmUpLCBbYnVmXSAqIDEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLnJlYWRsaW5lcywgJycpCisgICAgICAgIG1lbWlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8ucmVhZGxpbmVzKQorCisgICAgZGVmIHRlc3RfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MFxuIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYnVmICogMTApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVyKG1lbWlvKSwgbWVtaW8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG1lbWlvLCAnX19pdGVyX18nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIobWVtaW8sICduZXh0JykpCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBsaW5lIGluIG1lbWlvOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBidWYpCisgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCAxMCkKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBpID0gMAorICAgICAgICBmb3IgbGluZSBpbiBtZW1pbzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgYnVmKQorICAgICAgICAgICAgaSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgMTApCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZiAqIDIpCisgICAgICAgIG1lbWlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbmV4dCwgbWVtaW8pCisKKyAgICBkZWYgdGVzdF9nZXR2YWx1ZShzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmKQorICAgICAgICBtZW1pby5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShtZW1pby5nZXR2YWx1ZSgpKSwgdHlwZShidWYpKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYgKiAxMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKClbLTM6XSwgc2VsZi5idWZ0eXBlKCI4OTAiKSkKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorICAgICAgICBtZW1pby5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLmdldHZhbHVlKQorCisgICAgZGVmIHRlc3Rfc2VlayhzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorCisgICAgICAgIG1lbWlvLnJlYWQoNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8uc2VlaywgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLnNlZWssIDEsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby5zZWVrLCAxLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWsoMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uc2VlaygwLCAwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKCksIGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5zZWVrKDMpLCAzKQorICAgICAgICAjIHNlZWsoKSBhY2NlcHRzIGxvbmcgb2JqZWN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWsoM0wpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWsoMCwgMSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgpLCBidWZbMzpdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWsobGVuKGJ1ZikpLCBsZW4oYnVmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKCksIHNlbGYuRU9GKQorICAgICAgICBtZW1pby5zZWVrKGxlbihidWYpICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKCksIHNlbGYuRU9GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWsoMCwgMiksIGxlbihidWYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgc2VsZi5FT0YpCisgICAgICAgIG1lbWlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8uc2VlaywgMCkKKworICAgIGRlZiB0ZXN0X292ZXJzZWVrKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5zZWVrKGxlbihidWYpICsgMSksIDExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgc2VsZi5FT0YpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8udGVsbCgpLCAxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYpCisgICAgICAgIG1lbWlvLndyaXRlKHNlbGYuRU9GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1ZikKKyAgICAgICAgbWVtaW8ud3JpdGUoYnVmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1ZiArIHNlbGYuYnVmdHlwZSgnXDAnKSArIGJ1ZikKKworICAgIGRlZiB0ZXN0X3RlbGwoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnRlbGwoKSwgMCkKKyAgICAgICAgbWVtaW8uc2Vlayg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnRlbGwoKSwgNSkKKyAgICAgICAgbWVtaW8uc2VlaygxMDAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby50ZWxsKCksIDEwMDAwKQorICAgICAgICBtZW1pby5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLnRlbGwpCisKKyAgICBkZWYgdGVzdF9mbHVzaChzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZmx1c2goKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2ZsYWdzKHNlbGYpOgorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby53cml0YWJsZSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRhYmxlKCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uc2Vla2FibGUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5pc2F0dHkoKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uY2xvc2VkLCBGYWxzZSkKKyAgICAgICAgbWVtaW8uY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby53cml0YWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8ucmVhZGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLnNlZWthYmxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby5pc2F0dHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uY2xvc2VkLCBUcnVlKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3Npbmcoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIGRlZiB0ZXN0MSgpOgorICAgICAgICAgICAgY2xhc3MgTWVtSU8oc2VsZi5pb2NsYXNzKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBtID0gTWVtSU8oYnVmKQorICAgICAgICAgICAgcmV0dXJuIG0uZ2V0dmFsdWUoKQorICAgICAgICBkZWYgdGVzdDIoKToKKyAgICAgICAgICAgIGNsYXNzIE1lbUlPKHNlbGYuaW9jbGFzcyk6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKG1lLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pb2NsYXNzLl9faW5pdF9fKG1lLCBhKQorICAgICAgICAgICAgbSA9IE1lbUlPKGJ1ZiwgTm9uZSkKKyAgICAgICAgICAgIHJldHVybiBtLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0MSgpLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdDIoKSwgYnVmKQorCisgICAgZGVmIHRlc3RfaW5zdGFuY2VfZGljdF9sZWFrKHNlbGYpOgorICAgICAgICAjIFRlc3QgY2FzZSBmb3IgaXNzdWUgIzYyNDIuCisgICAgICAgICMgVGhpcyB3aWxsIGJlIGNhdWdodCBieSByZWdydGVzdC5weSAtUiBpZiB0aGlzIGxlYWsuCisgICAgICAgIGZvciBfIGluIHJhbmdlKDEwMCk6CisgICAgICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgICAgICBtZW1pby5mb28gPSAxCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorICAgICAgICBtZW1pby5mb28gPSA0MgorICAgICAgICBtZW1pby5zZWVrKDIpCisKKyAgICAgICAgY2xhc3MgUGlja2xlVGVzdE1lbUlPKHNlbGYuaW9jbGFzcyk6CisgICAgICAgICAgICBkZWYgX19pbml0X18obWUsIGluaXR2YWx1ZSwgZm9vKToKKyAgICAgICAgICAgICAgICBzZWxmLmlvY2xhc3MuX19pbml0X18obWUsIGluaXR2YWx1ZSkKKyAgICAgICAgICAgICAgICBtZS5mb28gPSBmb28KKyAgICAgICAgICAgICMgX19nZXRuZXdhcmdzX18gaXMgdW5kZWZpbmVkIG9uIHB1cnBvc2UuIFRoaXMgY2hlY2tzIHRoYXQgUEVQIDMwNworICAgICAgICAgICAgIyBpcyB1c2VkIHRvIHByb3ZpZGUgcGlja2xpbmcgc3VwcG9ydC4KKworICAgICAgICAjIFBpY2tsZSBleHBlY3RzIHRoZSBjbGFzcyB0byBiZSBvbiB0aGUgbW9kdWxlIGxldmVsLiBIZXJlIHdlIHVzZSBhCisgICAgICAgICMgbGl0dGxlIGhhY2sgdG8gYWxsb3cgdGhlIFBpY2tsZVRlc3RNZW1JTyBjbGFzcyB0byBkZXJpdmUgZnJvbQorICAgICAgICAjIHNlbGYuaW9jbGFzcyB3aXRob3V0IGhhdmluZyB0byBkZWZpbmUgYWxsIGNvbWJpbmF0aW9ucyBleHBsaWNpdGx5IG9uCisgICAgICAgICMgdGhlIG1vZHVsZS1sZXZlbC4KKyAgICAgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgICAgIFBpY2tsZVRlc3RNZW1JTy5fX21vZHVsZV9fID0gJ19fbWFpbl9fJworICAgICAgICBfX21haW5fXy5QaWNrbGVUZXN0TWVtSU8gPSBQaWNrbGVUZXN0TWVtSU8KKyAgICAgICAgc3VibWVtaW8gPSBQaWNrbGVUZXN0TWVtSU8oYnVmLCA4MCkKKyAgICAgICAgc3VibWVtaW8uc2VlaygyKQorCisgICAgICAgICMgV2Ugb25seSBzdXBwb3J0IHBpY2tsZSBwcm90b2NvbCAyIGFuZCBvbndhcmQgc2luY2Ugd2UgdXNlIGV4dGVuZGVkCisgICAgICAgICMgX19yZWR1Y2VfXyBBUEkgb2YgUEVQIDMwNyB0byBwcm92aWRlIHBpY2tsaW5nIHN1cHBvcnQuCisgICAgICAgIGZvciBwcm90byBpbiByYW5nZSgyLCBwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCk6CisgICAgICAgICAgICBmb3Igb2JqIGluIChtZW1pbywgc3VibWVtaW8pOgorICAgICAgICAgICAgICAgIG9iajIgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKG9iaiwgcHJvdG9jb2w9cHJvdG8pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmdldHZhbHVlKCksIG9iajIuZ2V0dmFsdWUoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5fX2NsYXNzX18sIG9iajIuX19jbGFzc19fKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmZvbywgb2JqMi5mb28pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmoudGVsbCgpLCBvYmoyLnRlbGwoKSkKKyAgICAgICAgICAgICAgICBvYmouY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBpY2tsZS5kdW1wcywgb2JqLCBwcm90bykKKyAgICAgICAgZGVsIF9fbWFpbl9fLlBpY2tsZVRlc3RNZW1JTworCisKK2NsYXNzIFB5Qnl0ZXNJT1Rlc3QoTWVtb3J5VGVzdE1peGluLCBNZW1vcnlTZWVrVGVzdE1peGluLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBVbnN1cHBvcnRlZE9wZXJhdGlvbiA9IHB5aW8uVW5zdXBwb3J0ZWRPcGVyYXRpb24KKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgYnVmdHlwZShzKToKKyAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCJhc2NpaSIpCisgICAgaW9jbGFzcyA9IHB5aW8uQnl0ZXNJTworICAgIEVPRiA9IGIiIgorCisgICAgZGVmIHRlc3RfcmVhZDEoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLnJlYWQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgYnVmKQorCisgICAgZGVmIHRlc3RfcmVhZGludG8oc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKworICAgICAgICBiID0gYnl0ZWFycmF5KGIiaGVsbG8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRpbnRvKGIpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiMTIzNDUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRpbnRvKGIpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiNjc4OTAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRpbnRvKGIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiNjc4OTAiKQorICAgICAgICBiID0gYnl0ZWFycmF5KGIiaGVsbG8gd29ybGQiKQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGludG8oYiksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiMTIzNDU2Nzg5MGQiKQorICAgICAgICBiID0gYnl0ZWFycmF5KGIiIikKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRpbnRvKGIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5yZWFkaW50bywgJycpCisgICAgICAgIGltcG9ydCBhcnJheQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoYidiJywgYiJoZWxsbyB3b3JsZCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKyAgICAgICAgbWVtaW8ucmVhZGludG8oYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnRvc3RyaW5nKCksIGIiMTIzNDU2Nzg5MGQiKQorICAgICAgICBtZW1pby5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLnJlYWRpbnRvLCBiKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhiIjEyMyIpCisgICAgICAgIGIgPSBieXRlYXJyYXkoKQorICAgICAgICBtZW1pby5zZWVrKDQyKQorICAgICAgICBtZW1pby5yZWFkaW50byhiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiIikKKworICAgIGRlZiB0ZXN0X3JlbGF0aXZlX3NlZWsoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWsoLTEsIDEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWsoMywgMSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uc2VlaygtNCwgMSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uc2VlaygtMSwgMiksIDkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uc2VlaygxLCAxKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uc2VlaygxLCAyKSwgMTEpCisgICAgICAgIG1lbWlvLnNlZWsoLTMsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgpLCBidWZbLTM6XSkKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBtZW1pby5zZWVrKDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgpLCBidWZbMTpdKQorCisgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5pb2NsYXNzLCAiMTIzNDU2Nzg5MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8ud3JpdGUsICIxMjM0NTY3ODkwIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby53cml0ZWxpbmVzLCBbIjEyMzQ1Njc4OTAiXSkKKworICAgIGRlZiB0ZXN0X2J5dGVzX2FycmF5KHNlbGYpOgorICAgICAgICBidWYgPSBiIjEyMzQ1Njc4OTAiCisgICAgICAgIGltcG9ydCBhcnJheQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoYidiJywgYnVmKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby53cml0ZShhKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmKQorCisgICAgZGVmIHRlc3RfaXNzdWU1NDQ5KHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBzZWxmLmlvY2xhc3MoaW5pdGlhbF9ieXRlcz1idWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5pb2NsYXNzLCBidWYsIGZvbz1Ob25lKQorCisKK2NsYXNzIFRleHRJT1Rlc3RNaXhpbjoKKworICAgIGRlZiB0ZXN0X25ld2xpbmVzX3Byb3BlcnR5KHNlbGYpOgorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhuZXdsaW5lPU5vbmUpCisgICAgICAgICMgVGhlIEMgU3RyaW5nSU8gZGVjb2RlcyBuZXdsaW5lcyBpbiB3cml0ZSgpIGNhbGxzLCBidXQgdGhlIFB5dGhvbgorICAgICAgICAjIGltcGxlbWVudGF0aW9uIG9ubHkgZG9lcyB3aGVuIHJlYWRpbmcuICBUaGlzIGZ1bmN0aW9uIGZvcmNlcyB0aGVtIHRvCisgICAgICAgICMgYmUgZGVjb2RlZCBmb3IgdGVzdGluZy4KKyAgICAgICAgZGVmIGZvcmNlX2RlY29kZSgpOgorICAgICAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICAgICAgbWVtaW8ucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ubmV3bGluZXMsIE5vbmUpCisgICAgICAgIG1lbWlvLndyaXRlKCJhXG4iKQorICAgICAgICBmb3JjZV9kZWNvZGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLm5ld2xpbmVzLCAiXG4iKQorICAgICAgICBtZW1pby53cml0ZSgiYlxyXG4iKQorICAgICAgICBmb3JjZV9kZWNvZGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLm5ld2xpbmVzLCAoIlxuIiwgIlxyXG4iKSkKKyAgICAgICAgbWVtaW8ud3JpdGUoImNccmQiKQorICAgICAgICBmb3JjZV9kZWNvZGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLm5ld2xpbmVzLCAoIlxyIiwgIlxuIiwgIlxyXG4iKSkKKworICAgIGRlZiB0ZXN0X3JlbGF0aXZlX3NlZWsoc2VsZik6CisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBtZW1pby5zZWVrLCAtMSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgbWVtaW8uc2VlaywgMywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgbWVtaW8uc2VlaywgLTMsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIG1lbWlvLnNlZWssIC0xLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBtZW1pby5zZWVrLCAxLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBtZW1pby5zZWVrLCAxLCAyKQorCisgICAgZGVmIHRlc3RfdGV4dGlvX3Byb3BlcnRpZXMoc2VsZik6CisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCkKKworICAgICAgICAjIFRoZXNlIGFyZSBqdXN0IGR1bW15IHZhbHVlcyBidXQgd2UgbmV2ZXJ0aGVsZXNzIGNoZWNrIHRoZW0gZm9yIGZlYXIKKyAgICAgICAgIyBvZiB1bmV4cGVjdGVkIGJyZWFrYWdlLgorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShtZW1pby5lbmNvZGluZykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobWVtaW8uZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1lbWlvLmxpbmVfYnVmZmVyaW5nKQorCisgICAgZGVmIHRlc3RfbmV3bGluZV9ub25lKHNlbGYpOgorICAgICAgICAjIG5ld2xpbmU9Tm9uZQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygiYVxuYlxyXG5jXHJkIiwgbmV3bGluZT1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVtaW8pLCBbImFcbiIsICJiXG4iLCAiY1xuIiwgImQiXSkKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoMSksICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDIpLCAiXG5iIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDIpLCAiXG5jIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDEpLCAiXG4iKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhuZXdsaW5lPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbWVtaW8ud3JpdGUoImFcbiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIG1lbWlvLndyaXRlKCJiXHJcbiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIG1lbWlvLndyaXRlKCJjXHJkIikpCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKCksICJhXG5iXG5jXG5kIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoImFcclxuYiIsIG5ld2xpbmU9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDMpLCAiYVxuYiIpCisKKyAgICBkZWYgdGVzdF9uZXdsaW5lX2VtcHR5KHNlbGYpOgorICAgICAgICAjIG5ld2xpbmU9IiIKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoImFcbmJcclxuY1xyZCIsIG5ld2xpbmU9IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZW1pbyksIFsiYVxuIiwgImJcclxuIiwgImNcciIsICJkIl0pCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDQpLCAiYVxuYlxyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDIpLCAiXG5jIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDEpLCAiXHIiKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhuZXdsaW5lPSIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1lbWlvLndyaXRlKCJhXG4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBtZW1pby53cml0ZSgiYlxyIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbWVtaW8ud3JpdGUoIlxuYyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1lbWlvLndyaXRlKCJccmQiKSkKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVtaW8pLCBbImFcbiIsICJiXHJcbiIsICJjXHIiLCAiZCJdKQorCisgICAgZGVmIHRlc3RfbmV3bGluZV9sZihzZWxmKToKKyAgICAgICAgIyBuZXdsaW5lPSJcbiIKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoImFcbmJcclxuY1xyZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZW1pbyksIFsiYVxuIiwgImJcclxuIiwgImNccmQiXSkKKworICAgIGRlZiB0ZXN0X25ld2xpbmVfY3Ioc2VsZik6CisgICAgICAgICMgbmV3bGluZT0iXHIiCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCJhXG5iXHJcbmNccmQiLCBuZXdsaW5lPSJcciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgpLCAiYVxyYlxyXHJjXHJkIikKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVtaW8pLCBbImFcciIsICJiXHIiLCAiXHIiLCAiY1xyIiwgImQiXSkKKworICAgIGRlZiB0ZXN0X25ld2xpbmVfY3JsZihzZWxmKToKKyAgICAgICAgIyBuZXdsaW5lPSJcclxuIgorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygiYVxuYlxyXG5jXHJkIiwgbmV3bGluZT0iXHJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgpLCAiYVxyXG5iXHJcclxuY1xyZCIpCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lbWlvKSwgWyJhXHJcbiIsICJiXHJcclxuIiwgImNccmQiXSkKKworICAgIGRlZiB0ZXN0X2lzc3VlNTI2NShzZWxmKToKKyAgICAgICAgIyBTdHJpbmdJTyBjYW4gZHVwbGljYXRlIG5ld2xpbmVzIGluIHVuaXZlcnNhbCBuZXdsaW5lcyBtb2RlCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCJhXHJcbmJcclxuIiwgbmV3bGluZT1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoNSksICJhXG5iXG4iKQorCisKK2NsYXNzIFB5U3RyaW5nSU9UZXN0KE1lbW9yeVRlc3RNaXhpbiwgTWVtb3J5U2Vla1Rlc3RNaXhpbiwKKyAgICAgICAgICAgICAgICAgICAgIFRleHRJT1Rlc3RNaXhpbiwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGJ1ZnR5cGUgPSB1bmljb2RlCisgICAgaW9jbGFzcyA9IHB5aW8uU3RyaW5nSU8KKyAgICBVbnN1cHBvcnRlZE9wZXJhdGlvbiA9IHB5aW8uVW5zdXBwb3J0ZWRPcGVyYXRpb24KKyAgICBFT0YgPSAiIgorCisKK2NsYXNzIFB5U3RyaW5nSU9QaWNrbGVUZXN0KFRleHRJT1Rlc3RNaXhpbiwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgaWYgcGlja2xlIHJlc3RvcmVzIHByb3Blcmx5IHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBTdHJpbmdJTy4KKyAgICAiIiIKKyAgICBidWZ0eXBlID0gdW5pY29kZQorICAgIFVuc3VwcG9ydGVkT3BlcmF0aW9uID0gcHlpby5VbnN1cHBvcnRlZE9wZXJhdGlvbgorICAgIEVPRiA9ICIiCisKKyAgICBjbGFzcyBpb2NsYXNzKHB5aW8uU3RyaW5nSU8pOgorICAgICAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICByZXR1cm4gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhweWlvLlN0cmluZ0lPKCphcmdzLCAqKmt3YXJncykpKQorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHBhc3MKKworCitjbGFzcyBDQnl0ZXNJT1Rlc3QoUHlCeXRlc0lPVGVzdCk6CisgICAgaW9jbGFzcyA9IGlvLkJ5dGVzSU8KKyAgICBVbnN1cHBvcnRlZE9wZXJhdGlvbiA9IGlvLlVuc3VwcG9ydGVkT3BlcmF0aW9uCisKKyAgICB0ZXN0X2J5dGVzX2FycmF5ID0gdW5pdHRlc3Quc2tpcCgKKyAgICAgICAgImFycmF5LmFycmF5KCkgZG9lcyBub3QgaGF2ZSB0aGUgbmV3IGJ1ZmZlciBBUEkiCisgICAgKShQeUJ5dGVzSU9UZXN0LnRlc3RfYnl0ZXNfYXJyYXkpCisKKworICAgIGRlZiB0ZXN0X2dldHN0YXRlKHNlbGYpOgorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIHN0YXRlID0gbWVtaW8uX19nZXRzdGF0ZV9fKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3RhdGUpLCAzKQorICAgICAgICBieXRlYXJyYXkoc3RhdGVbMF0pICMgQ2hlY2sgaWYgc3RhdGVbMF0gc3VwcG9ydHMgdGhlIGJ1ZmZlciBpbnRlcmZhY2UuCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdGF0ZVsxXSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzdGF0ZVsyXSwgZGljdCkgb3Igc3RhdGVbMl0gaXMgTm9uZSkKKyAgICAgICAgbWVtaW8uY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby5fX2dldHN0YXRlX18pCisKKyAgICBkZWYgdGVzdF9zZXRzdGF0ZShzZWxmKToKKyAgICAgICAgIyBUaGlzIGNoZWNrcyB3aGV0aGVyIF9fc2V0c3RhdGVfXyBkb2VzIHByb3BlciBpbnB1dCB2YWxpZGF0aW9uLgorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIG1lbWlvLl9fc2V0c3RhdGVfXygoYiJubyBlcnJvciIsIDAsIE5vbmUpKQorICAgICAgICBtZW1pby5fX3NldHN0YXRlX18oKGJ5dGVhcnJheShiIm5vIGVycm9yIiksIDAsIE5vbmUpKQorICAgICAgICBtZW1pby5fX3NldHN0YXRlX18oKGIibm8gZXJyb3IiLCAwLCB7J3NwYW0nOiAzfSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKGIiIiwgLTEsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKCJ1bmljb2RlIiwgMCwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8uX19zZXRzdGF0ZV9fLCAoYiIiLCAwLjAsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKGIiIiwgMCwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8uX19zZXRzdGF0ZV9fLCAoYiJsZW4tdGVzdCIsIDApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18sIDApCisgICAgICAgIG1lbWlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8uX19zZXRzdGF0ZV9fLCAoYiJjbG9zZWQiLCAwLCBOb25lKSkKKworICAgIGNoZWNrX3NpemVvZiA9IHN1cHBvcnQuY2hlY2tfc2l6ZW9mCisKKyAgICBAc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9zaXplb2Yoc2VsZik6CisgICAgICAgIGJhc2VzaXplID0gc3VwcG9ydC5jYWxjb2Jqc2l6ZShiJ1AyUFAyUCcpCisgICAgICAgIGNoZWNrID0gc2VsZi5jaGVja19zaXplb2YKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmplY3QuX19zaXplb2ZfXyhpby5CeXRlc0lPKCkpLCBiYXNlc2l6ZSkKKyAgICAgICAgY2hlY2soaW8uQnl0ZXNJTygpLCBiYXNlc2l6ZSApCisgICAgICAgIGNoZWNrKGlvLkJ5dGVzSU8oYidhJyksIGJhc2VzaXplICsgMSArIDEgKQorICAgICAgICBjaGVjayhpby5CeXRlc0lPKGInYScgKiAxMDAwKSwgYmFzZXNpemUgKyAxMDAwICsgMSApCisKK2NsYXNzIENTdHJpbmdJT1Rlc3QoUHlTdHJpbmdJT1Rlc3QpOgorICAgIGlvY2xhc3MgPSBpby5TdHJpbmdJTworICAgIFVuc3VwcG9ydGVkT3BlcmF0aW9uID0gaW8uVW5zdXBwb3J0ZWRPcGVyYXRpb24KKworICAgICMgWFhYOiBGb3IgdGhlIFB5dGhvbiB2ZXJzaW9uIG9mIGlvLlN0cmluZ0lPLCB0aGlzIGlzIGhpZ2hseQorICAgICMgZGVwZW5kZW50IG9uIHRoZSBlbmNvZGluZyB1c2VkIGZvciB0aGUgdW5kZXJseWluZyBidWZmZXIuCisgICAgZGVmIHRlc3Rfd2lkZWNoYXIoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiXFUwMDAyMDMwYVxVMDAwMjAzNDciKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ud3JpdGUoYnVmKSwgbGVuKGJ1ZikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8udGVsbCgpLCBsZW4oYnVmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ud3JpdGUoYnVmKSwgbGVuKGJ1ZikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8udGVsbCgpLCBsZW4oYnVmKSAqIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmICsgYnVmKQorCisgICAgZGVmIHRlc3RfZ2V0c3RhdGUoc2VsZik6CisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgc3RhdGUgPSBtZW1pby5fX2dldHN0YXRlX18oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzdGF0ZSksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdGF0ZVswXSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN0YXRlWzFdLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdGF0ZVsyXSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzdGF0ZVszXSwgZGljdCkgb3Igc3RhdGVbM10gaXMgTm9uZSkKKyAgICAgICAgbWVtaW8uY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby5fX2dldHN0YXRlX18pCisKKyAgICBkZWYgdGVzdF9zZXRzdGF0ZShzZWxmKToKKyAgICAgICAgIyBUaGlzIGNoZWNrcyB3aGV0aGVyIF9fc2V0c3RhdGVfXyBkb2VzIHByb3BlciBpbnB1dCB2YWxpZGF0aW9uLgorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIG1lbWlvLl9fc2V0c3RhdGVfXygoIm5vIGVycm9yIiwgIlxuIiwgMCwgTm9uZSkpCisgICAgICAgIG1lbWlvLl9fc2V0c3RhdGVfXygoIm5vIGVycm9yIiwgIiIsIDAsIHsnc3BhbSc6IDN9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8uX19zZXRzdGF0ZV9fLCAoIiIsICJmIiwgMCwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKCIiLCAiIiwgLTEsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKGIiIiwgIiIsIDAsIE5vbmUpKQorICAgICAgICAjIHRydW5rIGlzIG1vcmUgdG9sZXJhbnQgdGhhbiBweTNrIG9uIHRoZSB0eXBlIG9mIHRoZSBuZXdsaW5lIHBhcmFtCisgICAgICAgICNzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKCIiLCBiIiIsIDAsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKCIiLCAiIiwgMC4wLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18sICgiIiwgIiIsIDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKCJsZW4tdGVzdCIsIDApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18sIDApCisgICAgICAgIG1lbWlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8uX19zZXRzdGF0ZV9fLCAoImNsb3NlZCIsICIiLCAwLCBOb25lKSkKKworCitjbGFzcyBDU3RyaW5nSU9QaWNrbGVUZXN0KFB5U3RyaW5nSU9QaWNrbGVUZXN0KToKKyAgICBVbnN1cHBvcnRlZE9wZXJhdGlvbiA9IGlvLlVuc3VwcG9ydGVkT3BlcmF0aW9uCisKKyAgICBjbGFzcyBpb2NsYXNzKGlvLlN0cmluZ0lPKToKKyAgICAgICAgZGVmIF9fbmV3X18oY2xzLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoaW8uU3RyaW5nSU8oKmFyZ3MsICoqa3dhcmdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sPTIpKQorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHBhc3MKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdHMgPSBbUHlCeXRlc0lPVGVzdCwgUHlTdHJpbmdJT1Rlc3QsIENCeXRlc0lPVGVzdCwgQ1N0cmluZ0lPVGVzdCwKKyAgICAgICAgICAgICBQeVN0cmluZ0lPUGlja2xlVGVzdCwgQ1N0cmluZ0lPUGlja2xlVGVzdF0KKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeWlvLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeWlvLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjQyODc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWVtb3J5aW8ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeWlvLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeWlvLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjQyODc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWVtb3J5aW8ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeXZpZXcucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZW1vcnl2aWV3LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNWRkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZW1vcnl2aWV3LnB5CkBAIC0wLDAgKzEsMzYxIEBACisiIiJVbml0IHRlc3RzIGZvciB0aGUgbWVtb3J5dmlldworCitYWFggV2UgbmVlZCBtb3JlIHRlc3RzISBTb21lIHRlc3RzIGFyZSBpbiB0ZXN0X2J5dGVzCisiIiIKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCitpbXBvcnQgZ2MKK2ltcG9ydCB3ZWFrcmVmCitpbXBvcnQgYXJyYXkKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgaW8KKworCitjbGFzcyBBYnN0cmFjdE1lbW9yeVRlc3RzOgorICAgIHNvdXJjZV9ieXRlcyA9IGIiYWJjZGVmIgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIF9zb3VyY2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnNvdXJjZV9ieXRlcworCisgICAgQHByb3BlcnR5CisgICAgZGVmIF90eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGZpbHRlcihOb25lLCBbc2VsZi5yb190eXBlLCBzZWxmLnJ3X3R5cGVdKQorCisgICAgZGVmIGNoZWNrX2dldGl0ZW1fd2l0aF90eXBlKHNlbGYsIHRwKToKKyAgICAgICAgaXRlbSA9IHNlbGYuZ2V0aXRlbV90eXBlCisgICAgICAgIGIgPSB0cChzZWxmLl9zb3VyY2UpCisgICAgICAgIG9sZHJlZmNvdW50ID0gc3lzLmdldHJlZmNvdW50KGIpCisgICAgICAgIG0gPSBzZWxmLl92aWV3KGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVswXSwgaXRlbShiImEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1bMF0sIGJ5dGVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bNV0sIGl0ZW0oYiJmIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVstMV0sIGl0ZW0oYiJmIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVstNl0sIGl0ZW0oYiJhIikpCisgICAgICAgICMgQm91bmRzIGNoZWNraW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogbVs2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBtWy03XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBtW3N5cy5tYXhzaXplXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBtWy1zeXMubWF4c2l6ZV0pCisgICAgICAgICMgVHlwZSBjaGVja2luZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogbVtOb25lXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG1bMC4wXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG1bImEiXSkKKyAgICAgICAgbSA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0cmVmY291bnQoYiksIG9sZHJlZmNvdW50KQorCisgICAgZGVmIHRlc3RfZ2V0aXRlbShzZWxmKToKKyAgICAgICAgZm9yIHRwIGluIHNlbGYuX3R5cGVzOgorICAgICAgICAgICAgc2VsZi5jaGVja19nZXRpdGVtX3dpdGhfdHlwZSh0cCkKKworICAgIGRlZiB0ZXN0X2l0ZXIoc2VsZik6CisgICAgICAgIGZvciB0cCBpbiBzZWxmLl90eXBlczoKKyAgICAgICAgICAgIGIgPSB0cChzZWxmLl9zb3VyY2UpCisgICAgICAgICAgICBtID0gc2VsZi5fdmlldyhiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG0pLCBbbVtpXSBmb3IgaSBpbiByYW5nZShsZW4obSkpXSkKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIGZvciB0cCBpbiBzZWxmLl90eXBlczoKKyAgICAgICAgICAgIGIgPSB0cChzZWxmLl9zb3VyY2UpCisgICAgICAgICAgICBtID0gc2VsZi5fdmlldyhiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG0uX19yZXByX18oKSwgc3RyKQorCisgICAgZGVmIHRlc3Rfc2V0aXRlbV9yZWFkb25seShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucm9fdHlwZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBiID0gc2VsZi5yb190eXBlKHNlbGYuX3NvdXJjZSkKKyAgICAgICAgb2xkcmVmY291bnQgPSBzeXMuZ2V0cmVmY291bnQoYikKKyAgICAgICAgbSA9IHNlbGYuX3ZpZXcoYikKKyAgICAgICAgZGVmIHNldGl0ZW0odmFsdWUpOgorICAgICAgICAgICAgbVswXSA9IHZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0aXRlbSwgYiJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRpdGVtLCA2NSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRpdGVtLCBtZW1vcnl2aWV3KGIiYSIpKQorICAgICAgICBtID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRyZWZjb3VudChiKSwgb2xkcmVmY291bnQpCisKKyAgICBkZWYgdGVzdF9zZXRpdGVtX3dyaXRhYmxlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5yd190eXBlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRwID0gc2VsZi5yd190eXBlCisgICAgICAgIGIgPSBzZWxmLnJ3X3R5cGUoc2VsZi5fc291cmNlKQorICAgICAgICBvbGRyZWZjb3VudCA9IHN5cy5nZXRyZWZjb3VudChiKQorICAgICAgICBtID0gc2VsZi5fdmlldyhiKQorICAgICAgICBtWzBdID0gdHAoYiIwIikKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGVudHModHAsIGIsIGIiMGJjZGVmIikKKyAgICAgICAgbVsxOjNdID0gdHAoYiIxMiIpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRlbnRzKHRwLCBiLCBiIjAxMmRlZiIpCisgICAgICAgIG1bMToxXSA9IHRwKGIiIikKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGVudHModHAsIGIsIGIiMDEyZGVmIikKKyAgICAgICAgbVs6XSA9IHRwKGIiYWJjZGVmIikKKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGVudHModHAsIGIsIGIiYWJjZGVmIikKKworICAgICAgICAjIE92ZXJsYXBwaW5nIGNvcGllcyBvZiBhIHZpZXcgaW50byBpdHNlbGYKKyAgICAgICAgbVswOjNdID0gbVsyOjVdCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRlbnRzKHRwLCBiLCBiImNkZWRlZiIpCisgICAgICAgIG1bOl0gPSB0cChiImFiY2RlZiIpCisgICAgICAgIG1bMjo1XSA9IG1bMDozXQorICAgICAgICBzZWxmLl9jaGVja19jb250ZW50cyh0cCwgYiwgYiJhYmFiY2YiKQorCisgICAgICAgIGRlZiBzZXRpdGVtKGtleSwgdmFsdWUpOgorICAgICAgICAgICAgbVtrZXldID0gdHAodmFsdWUpCisgICAgICAgICMgQm91bmRzIGNoZWNraW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHNldGl0ZW0sIDYsIGIiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHNldGl0ZW0sIC03LCBiImEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBzZXRpdGVtLCBzeXMubWF4c2l6ZSwgYiJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgc2V0aXRlbSwgLXN5cy5tYXhzaXplLCBiImEiKQorICAgICAgICAjIFdyb25nIGluZGV4L3NsaWNlIHR5cGVzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0aXRlbSwgMC4wLCBiImEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGl0ZW0sICgwLCksIGIiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0aXRlbSwgImEiLCBiImEiKQorICAgICAgICAjIFRyeWluZyB0byByZXNpemUgdGhlIG1lbW9yeSBvYmplY3QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0aXRlbSwgMCwgYiIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRpdGVtLCAwLCBiImFiIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0aXRlbSwgc2xpY2UoMSwxKSwgYiJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0aXRlbSwgc2xpY2UoMCwyKSwgYiJhIikKKworICAgICAgICBtID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRyZWZjb3VudChiKSwgb2xkcmVmY291bnQpCisKKyAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgorICAgICAgICBmb3IgdHAgaW4gc2VsZi5fdHlwZXM6CisgICAgICAgICAgICBiID0gdHAoc2VsZi5fc291cmNlKQorICAgICAgICAgICAgbSA9IHNlbGYuX3ZpZXcoYikKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgICAgICBkZWwgbVsxXQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgICAgIGRlbCBtWzE6NF0KKworICAgIGRlZiB0ZXN0X3RvYnl0ZXMoc2VsZik6CisgICAgICAgIGZvciB0cCBpbiBzZWxmLl90eXBlczoKKyAgICAgICAgICAgIG0gPSBzZWxmLl92aWV3KHRwKHNlbGYuX3NvdXJjZSkpCisgICAgICAgICAgICBiID0gbS50b2J5dGVzKCkKKyAgICAgICAgICAgICMgVGhpcyBjYWxscyBzZWxmLmdldGl0ZW1fdHlwZSgpIG9uIGVhY2ggc2VwYXJhdGUgYnl0ZSBvZiBiImFiY2RlZiIKKyAgICAgICAgICAgIGV4cGVjdGVkID0gYiIiLmpvaW4oCisgICAgICAgICAgICAgICAgc2VsZi5nZXRpdGVtX3R5cGUoYykgZm9yIGMgaW4gYiJhYmNkZWYiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBleHBlY3RlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShiLCBieXRlcykKKworICAgIGRlZiB0ZXN0X3RvbGlzdChzZWxmKToKKyAgICAgICAgZm9yIHRwIGluIHNlbGYuX3R5cGVzOgorICAgICAgICAgICAgbSA9IHNlbGYuX3ZpZXcodHAoc2VsZi5fc291cmNlKSkKKyAgICAgICAgICAgIGwgPSBtLnRvbGlzdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwsIG1hcChvcmQsIGIiYWJjZGVmIikpCisKKyAgICBkZWYgdGVzdF9jb21wYXJlKHNlbGYpOgorICAgICAgICAjIG1lbW9yeXZpZXdzIGNhbiBjb21wYXJlIGZvciBlcXVhbGl0eSB3aXRoIG90aGVyIG9iamVjdHMKKyAgICAgICAgIyBoYXZpbmcgdGhlIGJ1ZmZlciBpbnRlcmZhY2UuCisgICAgICAgIGZvciB0cCBpbiBzZWxmLl90eXBlczoKKyAgICAgICAgICAgIG0gPSBzZWxmLl92aWV3KHRwKHNlbGYuX3NvdXJjZSkpCisgICAgICAgICAgICBmb3IgdHBfY29tcCBpbiBzZWxmLl90eXBlczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobSA9PSB0cF9jb21wKGIiYWJjZGVmIikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtICE9IHRwX2NvbXAoYiJhYmNkZWYiKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG0gPT0gdHBfY29tcChiImFiY2RlIikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0gIT0gdHBfY29tcChiImFiY2RlIikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtID09IHRwX2NvbXAoYiJhYmNkZTEiKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobSAhPSB0cF9jb21wKGIiYWJjZGUxIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobSA9PSBtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0gPT0gbVs6XSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtWzA6Nl0gPT0gbVs6XSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobVswOjVdID09IG0pCisKKyAgICAgICAgICAgICMgQ29tcGFyaXNvbiB3aXRoIG9iamVjdHMgd2hpY2ggZG9uJ3Qgc3VwcG9ydCB0aGUgYnVmZmVyIEFQSQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtID09IHUiYWJjZGVmIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtICE9IHUiYWJjZGVmIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodSJhYmNkZWYiID09IG0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodSJhYmNkZWYiICE9IG0pCisKKyAgICAgICAgICAgICMgVW5vcmRlcmVkIGNvbXBhcmlzb25zIGFyZSB1bmltcGxlbWVudGVkLCBhbmQgdGhlcmVmb3JlIGdpdmUKKyAgICAgICAgICAgICMgYXJiaXRyYXJ5IHJlc3VsdHMgKHRoZXkgcmFpc2UgYSBUeXBlRXJyb3IgaW4gcHkzaykKKworICAgIGRlZiBjaGVja19hdHRyaWJ1dGVzX3dpdGhfdHlwZShzZWxmLCB0cCk6CisgICAgICAgIG0gPSBzZWxmLl92aWV3KHRwKHNlbGYuX3NvdXJjZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5mb3JtYXQsIHNlbGYuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobS5mb3JtYXQsIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLml0ZW1zaXplLCBzZWxmLml0ZW1zaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ubmRpbSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnNoYXBlLCAoNiwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnN0cmlkZXMsIChzZWxmLml0ZW1zaXplLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5zdWJvZmZzZXRzLCBOb25lKQorICAgICAgICByZXR1cm4gbQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlc19yZWFkb25seShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucm9fdHlwZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtID0gc2VsZi5jaGVja19hdHRyaWJ1dGVzX3dpdGhfdHlwZShzZWxmLnJvX3R5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZWFkb25seSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXNfd3JpdGFibGUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnJ3X3R5cGU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbSA9IHNlbGYuY2hlY2tfYXR0cmlidXRlc193aXRoX3R5cGUoc2VsZi5yd190eXBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmVhZG9ubHksIEZhbHNlKQorCisgICAgIyBEaXNhYmxlZDogdW5pY29kZSB1c2VzIHRoZSBvbGQgYnVmZmVyIEFQSSBpbiAyLngKKworICAgICNkZWYgdGVzdF9nZXRidWZmZXIoc2VsZik6CisgICAgICAgICMjIFRlc3QgUHlPYmplY3RfR2V0QnVmZmVyKCkgb24gYSBtZW1vcnl2aWV3IG9iamVjdC4KKyAgICAgICAgI2ZvciB0cCBpbiBzZWxmLl90eXBlczoKKyAgICAgICAgICAgICNiID0gdHAoc2VsZi5fc291cmNlKQorICAgICAgICAgICAgI29sZHJlZmNvdW50ID0gc3lzLmdldHJlZmNvdW50KGIpCisgICAgICAgICAgICAjbSA9IHNlbGYuX3ZpZXcoYikKKyAgICAgICAgICAgICNvbGR2aWV3cmVmY291bnQgPSBzeXMuZ2V0cmVmY291bnQobSkKKyAgICAgICAgICAgICNzID0gdW5pY29kZShtLCAidXRmLTgiKQorICAgICAgICAgICAgI3NlbGYuX2NoZWNrX2NvbnRlbnRzKHRwLCBiLCBzLmVuY29kZSgidXRmLTgiKSkKKyAgICAgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRyZWZjb3VudChtKSwgb2xkdmlld3JlZmNvdW50KQorICAgICAgICAgICAgI20gPSBOb25lCisgICAgICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0cmVmY291bnQoYiksIG9sZHJlZmNvdW50KQorCisgICAgZGVmIHRlc3RfZ2Moc2VsZik6CisgICAgICAgIGZvciB0cCBpbiBzZWxmLl90eXBlczoKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRwLCB0eXBlKToKKyAgICAgICAgICAgICAgICAjIElmIHRwIGlzIGEgZmFjdG9yeSByYXRoZXIgdGhhbiBhIHBsYWluIHR5cGUsIHNraXAKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBjbGFzcyBNeVNvdXJjZSh0cCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgY2xhc3MgTXlPYmplY3Q6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAjIENyZWF0ZSBhIHJlZmVyZW5jZSBjeWNsZSB0aHJvdWdoIGEgbWVtb3J5dmlldyBvYmplY3QKKyAgICAgICAgICAgIGIgPSBNeVNvdXJjZSh0cChiJ2FiYycpKQorICAgICAgICAgICAgbSA9IHNlbGYuX3ZpZXcoYikKKyAgICAgICAgICAgIG8gPSBNeU9iamVjdCgpCisgICAgICAgICAgICBiLm0gPSBtCisgICAgICAgICAgICBiLm8gPSBvCisgICAgICAgICAgICB3ciA9IHdlYWtyZWYucmVmKG8pCisgICAgICAgICAgICBiID0gbSA9IG8gPSBOb25lCisgICAgICAgICAgICAjIFRoZSBjeWNsZSBtdXN0IGJlIGJyb2tlbgorICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod3IoKSBpcyBOb25lLCB3cigpKQorCisgICAgZGVmIHRlc3Rfd3JpdGFibGVfcmVhZG9ubHkoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEwNDUxOiBtZW1vcnl2aWV3IGluY29ycmVjdGx5IGV4cG9zZXMgYSByZWFkb25seQorICAgICAgICAjIGJ1ZmZlciBhcyB3cml0YWJsZSBjYXVzaW5nIGEgc2VnZmF1bHQgaWYgdXNpbmcgbW1hcAorICAgICAgICB0cCA9IHNlbGYucm9fdHlwZQorICAgICAgICBpZiB0cCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGIgPSB0cChzZWxmLl9zb3VyY2UpCisgICAgICAgIG0gPSBzZWxmLl92aWV3KGIpCisgICAgICAgIGkgPSBpby5CeXRlc0lPKGInWlpaWicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaS5yZWFkaW50bywgbSkKKworIyBWYXJpYXRpb25zIG9uIHNvdXJjZSBvYmplY3RzIGZvciB0aGUgYnVmZmVyOiBieXRlcy1saWtlIG9iamVjdHMsIHRoZW4gYXJyYXlzCisjIHdpdGggaXRlbXNpemUgPiAxLgorIyBOT1RFOiBzdXBwb3J0IGZvciBtdWx0aS1kaW1lbnNpb25hbCBvYmplY3RzIGlzIHVuaW1wbGVtZW50ZWQuCisKK2NsYXNzIEJhc2VCeXRlc01lbW9yeVRlc3RzKEFic3RyYWN0TWVtb3J5VGVzdHMpOgorICAgIHJvX3R5cGUgPSBieXRlcworICAgIHJ3X3R5cGUgPSBieXRlYXJyYXkKKyAgICBnZXRpdGVtX3R5cGUgPSBieXRlcworICAgIGl0ZW1zaXplID0gMQorICAgIGZvcm1hdCA9ICdCJworCisjIERpc2FibGVkOiBhcnJheS5hcnJheSgpIGRvZXMgbm90IHN1cHBvcnQgdGhlIG5ldyBidWZmZXIgQVBJIGluIDIueAorCisjY2xhc3MgQmFzZUFycmF5TWVtb3J5VGVzdHMoQWJzdHJhY3RNZW1vcnlUZXN0cyk6CisgICAgI3JvX3R5cGUgPSBOb25lCisgICAgI3J3X3R5cGUgPSBsYW1iZGEgc2VsZiwgYjogYXJyYXkuYXJyYXkoJ2knLCBtYXAob3JkLCBiKSkKKyAgICAjZ2V0aXRlbV90eXBlID0gbGFtYmRhIHNlbGYsIGI6IGFycmF5LmFycmF5KCdpJywgbWFwKG9yZCwgYikpLnRvc3RyaW5nKCkKKyAgICAjaXRlbXNpemUgPSBhcnJheS5hcnJheSgnaScpLml0ZW1zaXplCisgICAgI2Zvcm1hdCA9ICdpJworCisgICAgI2RlZiB0ZXN0X2dldGJ1ZmZlcihzZWxmKToKKyAgICAgICAgIyMgWFhYIFRlc3Qgc2hvdWxkIGJlIGFkYXB0ZWQgZm9yIG5vbi1ieXRlIGJ1ZmZlcnMKKyAgICAgICAgI3Bhc3MKKworICAgICNkZWYgdGVzdF90b2xpc3Qoc2VsZik6CisgICAgICAgICMjIFhYWCBOb3RJbXBsZW1lbnRlZEVycm9yOiB0b2xpc3QoKSBvbmx5IHN1cHBvcnRzIGJ5dGUgdmlld3MKKyAgICAgICAgI3Bhc3MKKworCisjIFZhcmlhdGlvbnMgb24gaW5kaXJlY3Rpb24gbGV2ZWxzOiBtZW1vcnl2aWV3LCBzbGljZSBvZiBtZW1vcnl2aWV3LAorIyBzbGljZSBvZiBzbGljZSBvZiBtZW1vcnl2aWV3LgorIyBUaGlzIGlzIGltcG9ydGFudCB0byB0ZXN0IGFsbG9jYXRpb24gc3VidGxldGllcy4KKworY2xhc3MgQmFzZU1lbW9yeXZpZXdUZXN0czoKKyAgICBkZWYgX3ZpZXcoc2VsZiwgb2JqKToKKyAgICAgICAgcmV0dXJuIG1lbW9yeXZpZXcob2JqKQorCisgICAgZGVmIF9jaGVja19jb250ZW50cyhzZWxmLCB0cCwgb2JqLCBjb250ZW50cyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLCB0cChjb250ZW50cykpCisKK2NsYXNzIEJhc2VNZW1vcnlTbGljZVRlc3RzOgorICAgIHNvdXJjZV9ieXRlcyA9IGIiWGFiY2RlZlkiCisKKyAgICBkZWYgX3ZpZXcoc2VsZiwgb2JqKToKKyAgICAgICAgbSA9IG1lbW9yeXZpZXcob2JqKQorICAgICAgICByZXR1cm4gbVsxOjddCisKKyAgICBkZWYgX2NoZWNrX2NvbnRlbnRzKHNlbGYsIHRwLCBvYmosIGNvbnRlbnRzKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmpbMTo3XSwgdHAoY29udGVudHMpKQorCisgICAgZGVmIHRlc3RfcmVmcyhzZWxmKToKKyAgICAgICAgZm9yIHRwIGluIHNlbGYuX3R5cGVzOgorICAgICAgICAgICAgbSA9IG1lbW9yeXZpZXcodHAoc2VsZi5fc291cmNlKSkKKyAgICAgICAgICAgIG9sZHJlZmNvdW50ID0gc3lzLmdldHJlZmNvdW50KG0pCisgICAgICAgICAgICBtWzE6Ml0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHJlZmNvdW50KG0pLCBvbGRyZWZjb3VudCkKKworY2xhc3MgQmFzZU1lbW9yeVNsaWNlU2xpY2VUZXN0czoKKyAgICBzb3VyY2VfYnl0ZXMgPSBiIlhhYmNkZWZZIgorCisgICAgZGVmIF92aWV3KHNlbGYsIG9iaik6CisgICAgICAgIG0gPSBtZW1vcnl2aWV3KG9iaikKKyAgICAgICAgcmV0dXJuIG1bOjddWzE6XQorCisgICAgZGVmIF9jaGVja19jb250ZW50cyhzZWxmLCB0cCwgb2JqLCBjb250ZW50cyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqWzE6N10sIHRwKGNvbnRlbnRzKSkKKworCisjIENvbmNyZXRlIHRlc3QgY2xhc3NlcworCitjbGFzcyBCeXRlc01lbW9yeXZpZXdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlLAorICAgIEJhc2VNZW1vcnl2aWV3VGVzdHMsIEJhc2VCeXRlc01lbW9yeVRlc3RzKToKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBmb3IgdHAgaW4gc2VsZi5fdHlwZXM6CisgICAgICAgICAgICBvYiA9IHRwKHNlbGYuX3NvdXJjZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZW1vcnl2aWV3KG9iKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZW1vcnl2aWV3KG9iamVjdD1vYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbW9yeXZpZXcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbW9yeXZpZXcsIG9iLCBvYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtb3J5dmlldywgYXJndW1lbnQ9b2IpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbW9yeXZpZXcsIG9iLCBhcmd1bWVudD1UcnVlKQorCisjY2xhc3MgQXJyYXlNZW1vcnl2aWV3VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwKKyAgICAjQmFzZU1lbW9yeXZpZXdUZXN0cywgQmFzZUFycmF5TWVtb3J5VGVzdHMpOgorCisgICAgI2RlZiB0ZXN0X2FycmF5X2Fzc2lnbihzZWxmKToKKyAgICAgICAgIyMgSXNzdWUgIzQ1Njk6IHNlZ2ZhdWx0IHdoZW4gbXV0YXRpbmcgYSBtZW1vcnl2aWV3IHdpdGggaXRlbXNpemUgIT0gMQorICAgICAgICAjYSA9IGFycmF5LmFycmF5KCdpJywgcmFuZ2UoMTApKQorICAgICAgICAjbSA9IG1lbW9yeXZpZXcoYSkKKyAgICAgICAgI25ld19hID0gYXJyYXkuYXJyYXkoJ2knLCByYW5nZSg5LCAtMSwgLTEpKQorICAgICAgICAjbVs6XSA9IG5ld19hCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKGEsIG5ld19hKQorCisKK2NsYXNzIEJ5dGVzTWVtb3J5U2xpY2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlLAorICAgIEJhc2VNZW1vcnlTbGljZVRlc3RzLCBCYXNlQnl0ZXNNZW1vcnlUZXN0cyk6CisgICAgcGFzcworCisjY2xhc3MgQXJyYXlNZW1vcnlTbGljZVRlc3QodW5pdHRlc3QuVGVzdENhc2UsCisgICAgI0Jhc2VNZW1vcnlTbGljZVRlc3RzLCBCYXNlQXJyYXlNZW1vcnlUZXN0cyk6CisgICAgI3Bhc3MKKworY2xhc3MgQnl0ZXNNZW1vcnlTbGljZVNsaWNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwKKyAgICBCYXNlTWVtb3J5U2xpY2VTbGljZVRlc3RzLCBCYXNlQnl0ZXNNZW1vcnlUZXN0cyk6CisgICAgcGFzcworCisjY2xhc3MgQXJyYXlNZW1vcnlTbGljZVNsaWNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwKKyAgICAjQmFzZU1lbW9yeVNsaWNlU2xpY2VUZXN0cywgQmFzZUFycmF5TWVtb3J5VGVzdHMpOgorICAgICNwYXNzCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeXZpZXcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWVtb3J5dmlldy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5NWUxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeXZpZXcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeXZpZXcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWVtb3J5dmlldy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5NWUxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeXZpZXcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21obGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWhsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2ZGY0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21obGliLnB5CkBAIC0wLDAgKzEsMzQ4IEBACisiIiIKKyAgIFRlc3RzIGZvciB0aGUgbWhsaWIgbW9kdWxlCisgICBOaWNrIE1hdGhld3NvbgorIiIiCisKKyMjIyBCVUc6IFRoaXMgc3VpdGUgZG9lc24ndCBjdXJyZW50bHkgdGVzdCB0aGUgbWltZSBmdW5jdGlvbmFsaXR5IG9mCisjIyMgICAgICBtaGxpYi4gIEl0IHNob3VsZC4KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIFRFU1RGTiwgaW1wb3J0X21vZHVsZQoraW1wb3J0IG9zLCBTdHJpbmdJTworaW1wb3J0IHN5cworbWhsaWIgPSBpbXBvcnRfbW9kdWxlKCdtaGxpYicsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworaWYgKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJ3aW4iKSBvciBzeXMucGxhdGZvcm09PSJyaXNjb3MiIG9yCisgICAgICBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgiYXRoZW9zIikpOgorICAgICMgbWhsaWIudXBkYXRlbGluZSgpIHJlbmFtZXMgYSBmaWxlIHRvIHRoZSBuYW1lIG9mIGEgZmlsZSB0aGF0IGFscmVhZHkKKyAgICAjIGV4aXN0cy4gIFRoYXQgY2F1c2VzIGEgcmVhc29uYWJsZSBPUyA8d2luaz4gdG8gY29tcGxhaW4gaW4gdGVzdF9zZXF1ZW5jZQorICAgICMgaGVyZSwgbGlrZSB0aGUgIk9TRXJyb3I6IFtFcnJubyAxN10gRmlsZSBleGlzdHMiIHJhaXNlZCBvbiBXaW5kb3dzLgorICAgICMgbWhsaWIncyBsaXN0c3ViZm9sZGVycygpIGFuZCBsaXN0YWxsZm9sZGVycygpIGRvIHNvbWV0aGluZyB3aXRoCisgICAgIyBsaW5rIGNvdW50cywgYW5kIHRoYXQgY2F1c2VzIHRlc3RfbGlzdGZvbGRlcnMoKSBoZXJlIHRvIGdldCBiYWNrCisgICAgIyBhbiBlbXB0eSBsaXN0IGZyb20gaXRzIGNhbGwgb2YgbGlzdGFsbGZvbGRlcnMoKS4KKyAgICAjIFRoZSBvdGhlciB0ZXN0cyBoZXJlIHBhc3Mgb24gV2luZG93cy4KKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgic2tpcHBlZCBvbiAlcyAtLSAiICUgc3lzLnBsYXRmb3JtICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9vIG1hbnkgVW5peCBhc3N1bXB0aW9ucyIpCisKK19taHJvb3QgPSBURVNURk4rIl9NSCIKK19taHBhdGggPSBvcy5wYXRoLmpvaW4oX21ocm9vdCwgIk1IIikKK19taHByb2ZpbGUgPSBvcy5wYXRoLmpvaW4oX21ocm9vdCwgIi5taF9wcm9maWxlIikKKworZGVmIG5vcm1GKGYpOgorICAgIHJldHVybiBvcy5wYXRoLmpvaW4oKmYuc3BsaXQoJy8nKSkKKworZGVmIHdyaXRlRmlsZShmbmFtZSwgY29udGVudHMpOgorICAgIGRpciA9IG9zLnBhdGguc3BsaXQoZm5hbWUpWzBdCisgICAgaWYgZGlyIGFuZCBub3Qgb3MucGF0aC5leGlzdHMoZGlyKToKKyAgICAgICAgbWtkaXJzKGRpcikKKyAgICBmID0gb3BlbihmbmFtZSwgJ3cnKQorICAgIGYud3JpdGUoY29udGVudHMpCisgICAgZi5jbG9zZSgpCisKK2RlZiByZWFkRmlsZShmbmFtZSk6CisgICAgZiA9IG9wZW4oZm5hbWUpCisgICAgciA9IGYucmVhZCgpCisgICAgZi5jbG9zZSgpCisgICAgcmV0dXJuIHIKKworZGVmIHdyaXRlUHJvZmlsZShkaWN0KToKKyAgICBjb250ZW50cyA9IFsgIiVzOiAlc1xuIiAlIChrLCB2KSBmb3IgaywgdiBpbiBkaWN0Lml0ZXJpdGVtcygpIF0KKyAgICB3cml0ZUZpbGUoX21ocHJvZmlsZSwgIiIuam9pbihjb250ZW50cykpCisKK2RlZiB3cml0ZUNvbnRleHQoZm9sZGVyKToKKyAgICBmb2xkZXIgPSBub3JtRihmb2xkZXIpCisgICAgd3JpdGVGaWxlKG9zLnBhdGguam9pbihfbWhwYXRoLCAiY29udGV4dCIpLAorICAgICAgICAgICAgICAiQ3VycmVudC1Gb2xkZXI6ICVzXG4iICUgZm9sZGVyKQorCitkZWYgd3JpdGVDdXJNZXNzYWdlKGZvbGRlciwgY3VyKToKKyAgICBmb2xkZXIgPSBub3JtRihmb2xkZXIpCisgICAgd3JpdGVGaWxlKG9zLnBhdGguam9pbihfbWhwYXRoLCBmb2xkZXIsICIubWhfc2VxdWVuY2VzIiksCisgICAgICAgICAgICAgICJjdXI6ICVzXG4iJWN1cikKKworZGVmIHdyaXRlTWVzc2FnZShmb2xkZXIsIG4sIGhlYWRlcnMsIGJvZHkpOgorICAgIGZvbGRlciA9IG5vcm1GKGZvbGRlcikKKyAgICBoZWFkZXJzID0gIiIuam9pbihbICIlczogJXNcbiIgJSAoaywgdikgZm9yIGssIHYgaW4gaGVhZGVycy5pdGVyaXRlbXMoKSBdKQorICAgIGNvbnRlbnRzID0gIiVzXG4lc1xuIiAlIChoZWFkZXJzLGJvZHkpCisgICAgbWtkaXJzKG9zLnBhdGguam9pbihfbWhwYXRoLCBmb2xkZXIpKQorICAgIHdyaXRlRmlsZShvcy5wYXRoLmpvaW4oX21ocGF0aCwgZm9sZGVyLCBzdHIobikpLCBjb250ZW50cykKKworZGVmIGdldE1IKCk6CisgICAgcmV0dXJuIG1obGliLk1IKG9zLnBhdGguYWJzcGF0aChfbWhwYXRoKSwgX21ocHJvZmlsZSkKKworZGVmIHNvcnRMaW5lcyhzKToKKyAgICBsaW5lcyA9IHMuc3BsaXQoIlxuIikKKyAgICBsaW5lcyA9IFsgbGluZS5zdHJpcCgpIGZvciBsaW5lIGluIGxpbmVzIGlmIGxlbihsaW5lKSA+PSAyIF0KKyAgICBsaW5lcy5zb3J0KCkKKyAgICByZXR1cm4gbGluZXMKKworIyBUaGVzZSBuZXh0IDIgZnVuY3Rpb25zIGFyZSBjb3BpZWQgZnJvbSB0ZXN0X2dsb2IucHkuCitkZWYgbWtkaXJzKGZuYW1lKToKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbmFtZSkgb3IgZm5hbWUgPT0gJyc6CisgICAgICAgIHJldHVybgorICAgIGJhc2UsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KGZuYW1lKQorICAgIG1rZGlycyhiYXNlKQorICAgIG9zLm1rZGlyKGZuYW1lKQorCitkZWYgZGVsdHJlZShmbmFtZSk6CisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZuYW1lKToKKyAgICAgICAgcmV0dXJuCisgICAgZm9yIGYgaW4gb3MubGlzdGRpcihmbmFtZSk6CisgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGZuYW1lLCBmKQorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxuYW1lKToKKyAgICAgICAgICAgIGRlbHRyZWUoZnVsbG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGZ1bGxuYW1lKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICB0cnk6CisgICAgICAgIG9zLnJtZGlyKGZuYW1lKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworCitjbGFzcyBNaGxpYlRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGRlbHRyZWUoX21ocm9vdCkKKyAgICAgICAgbWtkaXJzKF9taHBhdGgpCisgICAgICAgIHdyaXRlUHJvZmlsZSh7J1BhdGgnIDogb3MucGF0aC5hYnNwYXRoKF9taHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICdFZGl0b3InOiAnZW1hY3MnLAorICAgICAgICAgICAgICAgICAgICAgICdpZ25vcmVkLWF0dHJpYnV0ZSc6ICdjYW1waW5nIGhvbGlkYXknfSkKKyAgICAgICAgIyBOb3RlOiBUaGVzZSBoZWFkZXJzIGFyZW4ndCByZWFsbHkgY29uZm9ybWFudCB0byBSRkM4MjIsIGJ1dAorICAgICAgICAjICBtaGxpYiBzaG91bGRuJ3QgY2FyZSBhYm91dCB0aGF0LgorCisgICAgICAgICMgQW4gaW5ib3ggd2l0aCBhIGNvdXBsZSBvZiBtZXNzYWdlcy4KKyAgICAgICAgd3JpdGVNZXNzYWdlKCdpbmJveCcsIDEsCisgICAgICAgICAgICAgICAgICAgICB7J0Zyb20nOiAnTXJzLiBQcmVtaXNlJywKKyAgICAgICAgICAgICAgICAgICAgICAnVG8nOiAnTXJzLiBDb25jbHVzaW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAnRGF0ZSc6ICcxOCBKdWx5IDIwMDEnfSwgIkh1bGxvLCBNcnMuIENvbmNsdXNpb24hXG4iKQorICAgICAgICB3cml0ZU1lc3NhZ2UoJ2luYm94JywgMiwKKyAgICAgICAgICAgICAgICAgICAgIHsnRnJvbSc6ICdNcnMuIENvbmNsdXNpb24nLAorICAgICAgICAgICAgICAgICAgICAgICdUbyc6ICdNcnMuIFByZW1pc2UnLAorICAgICAgICAgICAgICAgICAgICAgICdEYXRlJzogJzI5IEp1bHkgMjAwMSd9LCAiSHVsbG8sIE1ycy4gUHJlbWlzZSFcbiIpCisKKyAgICAgICAgIyBBIGZvbGRlciB3aXRoIG1hbnkgbWVzc2FnZXMKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSwgMTAxKStyYW5nZSgxMDEsIDIwMSwgMik6CisgICAgICAgICAgICB3cml0ZU1lc3NhZ2UoJ3dpZGUnLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsnRnJvbSc6ICdub3doZXJlJywgJ1N1YmplY3QnOiAnbWVzc2FnZSAjJXMnICUgaX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgaXMgbWVzc2FnZSBudW1iZXIgJXNcbiIgJSBpKQorCisgICAgICAgICMgQSBkZWVwbHkgbmVzdGVkIGZvbGRlcgorICAgICAgICBkZWYgZGVlcChmb2xkZXIsIG4pOgorICAgICAgICAgICAgd3JpdGVNZXNzYWdlKGZvbGRlciwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7J1N1YmplY3QnOiAnTWVzc2FnZSAlcy8lcycgJSAoZm9sZGVyLCBuKSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIG1lc3NhZ2UgbnVtYmVyICVzIGluICVzXG4iICUgKG4sIGZvbGRlcikgKQorICAgICAgICBkZWVwKCdkZWVwL2YxJywgMSkKKyAgICAgICAgZGVlcCgnZGVlcC9mMScsIDIpCisgICAgICAgIGRlZXAoJ2RlZXAvZjEnLCAzKQorICAgICAgICBkZWVwKCdkZWVwL2YyJywgNCkKKyAgICAgICAgZGVlcCgnZGVlcC9mMicsIDYpCisgICAgICAgIGRlZXAoJ2RlZXAnLCAzKQorICAgICAgICBkZWVwKCdkZWVwL2YyL2YzJywgMSkKKyAgICAgICAgZGVlcCgnZGVlcC9mMi9mMycsIDIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbHRyZWUoX21ocm9vdCkKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICB3cml0ZUNvbnRleHQoJ2luYm94JykKKyAgICAgICAgd3JpdGVDdXJNZXNzYWdlKCdpbmJveCcsIDIpCisgICAgICAgIG1oID0gZ2V0TUgoKQorCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShtaC5nZXRwcm9maWxlKCdFZGl0b3InKSwgJ2VtYWNzJykKKyAgICAgICAgZXEobWguZ2V0cHJvZmlsZSgnbm90LXNldCcpLCBOb25lKQorICAgICAgICBlcShtaC5nZXRwYXRoKCksIG9zLnBhdGguYWJzcGF0aChfbWhwYXRoKSkKKyAgICAgICAgZXEobWguZ2V0Y29udGV4dCgpLCAnaW5ib3gnKQorCisgICAgICAgIG1oLnNldGNvbnRleHQoJ3dpZGUnKQorICAgICAgICBlcShtaC5nZXRjb250ZXh0KCksICd3aWRlJykKKyAgICAgICAgZXEocmVhZEZpbGUob3MucGF0aC5qb2luKF9taHBhdGgsICdjb250ZXh0JykpLAorICAgICAgICAgICAiQ3VycmVudC1Gb2xkZXI6IHdpZGVcbiIpCisKKyAgICAgICAgbWguc2V0Y29udGV4dCgnaW5ib3gnKQorCisgICAgICAgIGluYm94ID0gbWgub3BlbmZvbGRlcignaW5ib3gnKQorICAgICAgICBlcShpbmJveC5nZXRmdWxsbmFtZSgpLAorICAgICAgICAgICBvcy5wYXRoLmpvaW4ob3MucGF0aC5hYnNwYXRoKF9taHBhdGgpLCAnaW5ib3gnKSkKKyAgICAgICAgZXEoaW5ib3guZ2V0c2VxdWVuY2VzZmlsZW5hbWUoKSwKKyAgICAgICAgICAgb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChfbWhwYXRoKSwgJ2luYm94JywgJy5taF9zZXF1ZW5jZXMnKSkKKyAgICAgICAgZXEoaW5ib3guZ2V0bWVzc2FnZWZpbGVuYW1lKDEpLAorICAgICAgICAgICBvcy5wYXRoLmpvaW4ob3MucGF0aC5hYnNwYXRoKF9taHBhdGgpLCAnaW5ib3gnLCAnMScpKQorCisgICAgZGVmIHRlc3RfbGlzdGZvbGRlcnMoc2VsZik6CisgICAgICAgIG1oID0gZ2V0TUgoKQorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBmb2xkZXJzID0gbWgubGlzdGZvbGRlcnMoKQorICAgICAgICBmb2xkZXJzLnNvcnQoKQorICAgICAgICBlcShmb2xkZXJzLCBbJ2RlZXAnLCAnaW5ib3gnLCAnd2lkZSddKQorCisgICAgICAgIGZvbGRlcnMgPSBtaC5saXN0YWxsZm9sZGVycygpCisgICAgICAgIGZvbGRlcnMuc29ydCgpCisgICAgICAgIHRmb2xkZXJzID0gbWFwKG5vcm1GLCBbJ2RlZXAnLCAnZGVlcC9mMScsICdkZWVwL2YyJywgJ2RlZXAvZjIvZjMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5ib3gnLCAnd2lkZSddKQorICAgICAgICB0Zm9sZGVycy5zb3J0KCkKKyAgICAgICAgZXEoZm9sZGVycywgdGZvbGRlcnMpCisKKyAgICAgICAgZm9sZGVycyA9IG1oLmxpc3RzdWJmb2xkZXJzKCdkZWVwJykKKyAgICAgICAgZm9sZGVycy5zb3J0KCkKKyAgICAgICAgZXEoZm9sZGVycywgbWFwKG5vcm1GLCBbJ2RlZXAvZjEnLCAnZGVlcC9mMiddKSkKKworICAgICAgICBmb2xkZXJzID0gbWgubGlzdGFsbHN1YmZvbGRlcnMoJ2RlZXAnKQorICAgICAgICBmb2xkZXJzLnNvcnQoKQorICAgICAgICBlcShmb2xkZXJzLCBtYXAobm9ybUYsIFsnZGVlcC9mMScsICdkZWVwL2YyJywgJ2RlZXAvZjIvZjMnXSkpCisgICAgICAgIGVxKG1oLmxpc3RzdWJmb2xkZXJzKG5vcm1GKCdkZWVwL2YyJykpLCBbbm9ybUYoJ2RlZXAvZjIvZjMnKV0pCisKKyAgICAgICAgZXEobWgubGlzdHN1YmZvbGRlcnMoJ2luYm94JyksIFtdKQorICAgICAgICBlcShtaC5saXN0YWxsc3ViZm9sZGVycygnaW5ib3gnKSwgW10pCisKKyAgICBkZWYgdGVzdF9zZXF1ZW5jZShzZWxmKToKKyAgICAgICAgbWggPSBnZXRNSCgpCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB3cml0ZUN1ck1lc3NhZ2UoJ3dpZGUnLCA1NSkKKworICAgICAgICBmID0gbWgub3BlbmZvbGRlcignd2lkZScpCisgICAgICAgIGFsbCA9IGYubGlzdG1lc3NhZ2VzKCkKKyAgICAgICAgZXEoYWxsLCByYW5nZSg1LCAxMDEpK3JhbmdlKDEwMSwgMjAxLCAyKSkKKyAgICAgICAgZXEoZi5nZXRjdXJyZW50KCksIDU1KQorICAgICAgICBmLnNldGN1cnJlbnQoOTkpCisgICAgICAgIGVxKHJlYWRGaWxlKG9zLnBhdGguam9pbihfbWhwYXRoLCAnd2lkZScsICcubWhfc2VxdWVuY2VzJykpLAorICAgICAgICAgICAnY3VyOiA5OVxuJykKKworICAgICAgICBkZWYgc2VxZXEoc2VxLCB2YWwpOgorICAgICAgICAgICAgZXEoZi5wYXJzZXNlcXVlbmNlKHNlcSksIHZhbCkKKworICAgICAgICBzZXFlcSgnNS01NScsIHJhbmdlKDUsIDU2KSkKKyAgICAgICAgc2VxZXEoJzkwLTEwOCcsIHJhbmdlKDkwLCAxMDEpK3JhbmdlKDEwMSwgMTA5LCAyKSkKKyAgICAgICAgc2VxZXEoJzkwLTEwOCcsIHJhbmdlKDkwLCAxMDEpK3JhbmdlKDEwMSwgMTA5LCAyKSkKKworICAgICAgICBzZXFlcSgnMTA6MTAnLCByYW5nZSgxMCwgMjApKQorICAgICAgICBzZXFlcSgnMTA6KzEwJywgcmFuZ2UoMTAsIDIwKSkKKyAgICAgICAgc2VxZXEoJzEwMToxMCcsIHJhbmdlKDEwMSwgMTIxLCAyKSkKKworICAgICAgICBzZXFlcSgnY3VyJywgWzk5XSkKKyAgICAgICAgc2VxZXEoJy4nLCBbOTldKQorICAgICAgICBzZXFlcSgncHJldicsIFs5OF0pCisgICAgICAgIHNlcWVxKCduZXh0JywgWzEwMF0pCisgICAgICAgIHNlcWVxKCdjdXI6LTMnLCBbOTcsIDk4LCA5OV0pCisgICAgICAgIHNlcWVxKCdmaXJzdC1jdXInLCByYW5nZSg1LCAxMDApKQorICAgICAgICBzZXFlcSgnMTUwLWxhc3QnLCByYW5nZSgxNTEsIDIwMSwgMikpCisgICAgICAgIHNlcWVxKCdwcmV2LW5leHQnLCBbOTgsIDk5LCAxMDBdKQorCisgICAgICAgIGxvd3ByaW1lcyA9IFs1LCA3LCAxMSwgMTMsIDE3LCAxOSwgMjMsIDI5XQorICAgICAgICBsb3djb21wb3MgPSBbeCBmb3IgeCBpbiByYW5nZSg1LCAzMSkgaWYgbm90IHggaW4gbG93cHJpbWVzIF0KKyAgICAgICAgZi5wdXRzZXF1ZW5jZXMoeydjdXInOiBbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAnbG93cHJpbWUnOiBsb3dwcmltZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAnbG93Y29tcG9zJzogbG93Y29tcG9zfSkKKyAgICAgICAgc2VxcyA9IHJlYWRGaWxlKG9zLnBhdGguam9pbihfbWhwYXRoLCAnd2lkZScsICcubWhfc2VxdWVuY2VzJykpCisgICAgICAgIHNlcXMgPSBzb3J0TGluZXMoc2VxcykKKyAgICAgICAgZXEoc2VxcywgWyJjdXI6IDUiLAorICAgICAgICAgICAgICAgICAgImxvd2NvbXBvczogNiA4LTEwIDEyIDE0LTE2IDE4IDIwLTIyIDI0LTI4IDMwIiwKKyAgICAgICAgICAgICAgICAgICJsb3dwcmltZTogNSA3IDExIDEzIDE3IDE5IDIzIDI5Il0pCisKKyAgICAgICAgc2VxZXEoJ2xvd3ByaW1lJywgbG93cHJpbWVzKQorICAgICAgICBzZXFlcSgnbG93cHJpbWU6MScsIFs1XSkKKyAgICAgICAgc2VxZXEoJ2xvd3ByaW1lOjInLCBbNSwgN10pCisgICAgICAgIHNlcWVxKCdsb3dwcmltZTotMicsIFsyMywgMjldKQorCisgICAgICAgICMjIE5vdCBzdXBwb3J0ZWQKKyAgICAgICAgI3NlcWVxKCdsb3dwcmltZTpmaXJzdCcsIFs1XSkKKyAgICAgICAgI3NlcWVxKCdsb3dwcmltZTpsYXN0JywgWzI5XSkKKyAgICAgICAgI3NlcWVxKCdsb3dwcmltZTpwcmV2JywgWzI5XSkKKyAgICAgICAgI3NlcWVxKCdsb3dwcmltZTpuZXh0JywgWzI5XSkKKworICAgIGRlZiB0ZXN0X21vZGlmeShzZWxmKToKKyAgICAgICAgbWggPSBnZXRNSCgpCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1oLm1ha2Vmb2xkZXIoImR1bW15MSIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oImR1bW15MSIsIG1oLmxpc3Rmb2xkZXJzKCkpCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oX21ocGF0aCwgImR1bW15MSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhwYXRoKSkKKworICAgICAgICBmID0gbWgub3BlbmZvbGRlcignZHVtbXkxJykKKyAgICAgICAgZGVmIGNyZWF0ZShuKToKKyAgICAgICAgICAgIG1zZyA9ICJGcm9tOiBmb29cblN1YmplY3Q6ICVzXG5cbkR1bW15IE1lc3NhZ2UgJXNcbiIgJSAobixuKQorICAgICAgICAgICAgZi5jcmVhdGVtZXNzYWdlKG4sIFN0cmluZ0lPLlN0cmluZ0lPKG1zZykpCisKKyAgICAgICAgY3JlYXRlKDcpCisgICAgICAgIGNyZWF0ZSg4KQorICAgICAgICBjcmVhdGUoOSkKKworICAgICAgICBlcShyZWFkRmlsZShmLmdldG1lc3NhZ2VmaWxlbmFtZSg5KSksCisgICAgICAgICAgICJGcm9tOiBmb29cblN1YmplY3Q6IDlcblxuRHVtbXkgTWVzc2FnZSA5XG4iKQorCisgICAgICAgIGVxKGYubGlzdG1lc3NhZ2VzKCksIFs3LCA4LCA5XSkKKyAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKHBhdGgpCisgICAgICAgIGZpbGVzLnNvcnQoKQorICAgICAgICBlcShmaWxlcywgWyc3JywgJzgnLCAnOSddKQorCisgICAgICAgIGYucmVtb3ZlbWVzc2FnZXMoWyc3JywgJzgnXSkKKyAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKHBhdGgpCisgICAgICAgIGZpbGVzLnNvcnQoKQorICAgICAgICBlcShmaWxlcywgWycsNycsICcsOCcsICc5J10pCisgICAgICAgIGVxKGYubGlzdG1lc3NhZ2VzKCksIFs5XSkKKyAgICAgICAgY3JlYXRlKDEwKQorICAgICAgICBjcmVhdGUoMTEpCisgICAgICAgIGNyZWF0ZSgxMikKKworICAgICAgICBtaC5tYWtlZm9sZGVyKCJkdW1teTIiKQorICAgICAgICBmMiA9IG1oLm9wZW5mb2xkZXIoImR1bW15MiIpCisgICAgICAgIGVxKGYyLmxpc3RtZXNzYWdlcygpLCBbXSkKKyAgICAgICAgZi5tb3ZlbWVzc2FnZSgxMCwgZjIsIDMpCisgICAgICAgIGYubW92ZW1lc3NhZ2UoMTEsIGYyLCA1KQorICAgICAgICBlcShmLmxpc3RtZXNzYWdlcygpLCBbOSwgMTJdKQorICAgICAgICBlcShmMi5saXN0bWVzc2FnZXMoKSwgWzMsIDVdKQorICAgICAgICBlcShyZWFkRmlsZShmMi5nZXRtZXNzYWdlZmlsZW5hbWUoMykpLAorICAgICAgICAgICAiRnJvbTogZm9vXG5TdWJqZWN0OiAxMFxuXG5EdW1teSBNZXNzYWdlIDEwXG4iKQorCisgICAgICAgIGYuY29weW1lc3NhZ2UoOSwgZjIsIDQpCisgICAgICAgIGVxKGYubGlzdG1lc3NhZ2VzKCksIFs5LCAxMl0pCisgICAgICAgIGVxKHJlYWRGaWxlKGYyLmdldG1lc3NhZ2VmaWxlbmFtZSg0KSksCisgICAgICAgICAgICJGcm9tOiBmb29cblN1YmplY3Q6IDlcblxuRHVtbXkgTWVzc2FnZSA5XG4iKQorCisgICAgICAgIGYucmVmaWxlbWVzc2FnZXMoWzksIDEyXSwgZjIpCisgICAgICAgIGVxKGYubGlzdG1lc3NhZ2VzKCksIFtdKQorICAgICAgICBlcShmMi5saXN0bWVzc2FnZXMoKSwgWzMsIDQsIDUsIDYsIDddKQorICAgICAgICBlcShyZWFkRmlsZShmMi5nZXRtZXNzYWdlZmlsZW5hbWUoNykpLAorICAgICAgICAgICAiRnJvbTogZm9vXG5TdWJqZWN0OiAxMlxuXG5EdW1teSBNZXNzYWdlIDEyXG4iKQorICAgICAgICAjIFhYWCBUaGlzIHNob3VsZCBjaGVjayB0aGF0IF9jb3B5c2VxdWVuY2VzIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLgorCisgICAgICAgIG1oLmRlbGV0ZWZvbGRlcignZHVtbXkxJykKKyAgICAgICAgbWguZGVsZXRlZm9sZGVyKCdkdW1teTInKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdkdW1teTEnLCBtaC5saXN0Zm9sZGVycygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHBhdGgpKQorCisgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKKyAgICAgICAgbWggPSBnZXRNSCgpCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIGYgPSBtaC5vcGVuZm9sZGVyKCdpbmJveCcpCisgICAgICAgIG1zZyA9IGYub3Blbm1lc3NhZ2UoMSkKKyAgICAgICAgIyBDaGVjayBzb21lIGJhc2ljIHN0dWZmIGZyb20gcmZjODIyCisgICAgICAgIGVxKG1zZy5nZXRoZWFkZXIoJ0Zyb20nKSwgIk1ycy4gUHJlbWlzZSIpCisgICAgICAgIGVxKG1zZy5nZXRoZWFkZXIoJ1RvJyksICJNcnMuIENvbmNsdXNpb24iKQorCisgICAgICAgICMgT2theSwgd2UgaGF2ZSB0aGUgcmlnaHQgbWVzc2FnZS4gIExldCdzIGNoZWNrIHRoZSBzdHVmZiBmcm9tCisgICAgICAgICMgbWhsaWIuCisgICAgICAgIGxpbmVzID0gc29ydExpbmVzKG1zZy5nZXRoZWFkZXJ0ZXh0KCkpCisgICAgICAgIGVxKGxpbmVzLCBbIkRhdGU6IDE4IEp1bHkgMjAwMSIsCisgICAgICAgICAgICAgICAgICAgIkZyb206IE1ycy4gUHJlbWlzZSIsCisgICAgICAgICAgICAgICAgICAgIlRvOiBNcnMuIENvbmNsdXNpb24iXSkKKyAgICAgICAgbGluZXMgPSBzb3J0TGluZXMobXNnLmdldGhlYWRlcnRleHQobGFtYmRhIGg6IGxlbihoKT09NCkpCisgICAgICAgIGVxKGxpbmVzLCBbIkRhdGU6IDE4IEp1bHkgMjAwMSIsCisgICAgICAgICAgICAgICAgICAgIkZyb206IE1ycy4gUHJlbWlzZSJdKQorICAgICAgICBlcShtc2cuZ2V0Ym9keXRleHQoKSwgIkh1bGxvLCBNcnMuIENvbmNsdXNpb24hXG5cbiIpCisgICAgICAgIGVxKG1zZy5nZXRib2R5dGV4dCgwKSwgIkh1bGxvLCBNcnMuIENvbmNsdXNpb24hXG5cbiIpCisKKyAgICAgICAgIyBYWFhYIHRoZXJlIHNob3VsZCBiZSBhIGJldHRlciB3YXkgdG8gcmVjbGFpbSB0aGUgZmlsZSBoYW5kbGUKKyAgICAgICAgbXNnLmZwLmNsb3NlKCkKKyAgICAgICAgZGVsIG1zZworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoTWhsaWJUZXN0cykKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxMWVkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21obGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxMWVkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21obGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldG9vbHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldG9vbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhMjZkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbWV0b29scy5weQpAQCAtMCwwICsxLDUzIEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBTdHJpbmdJTworCittaW1ldG9vbHMgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgibWltZXRvb2xzIiwgZGVwcmVjYXRlZD1UcnVlKQorCittc2d0ZXh0MSA9IG1pbWV0b29scy5NZXNzYWdlKFN0cmluZ0lPLlN0cmluZ0lPKAorIiIiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PWlzby04ODU5LTE7IGZvcm1hdD1mbG93ZWQKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKKworRm9vIQorIiIiKSkKKworY2xhc3MgTWltZVRvb2xzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9kZWNvZGVlbmNvZGUoc2VsZik6CisgICAgICAgIHN0YXJ0ID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyAiPSIgKyBzdHJpbmcuZGlnaXRzICsgIlxuIgorICAgICAgICBmb3IgZW5jIGluIFsnN2JpdCcsJzhiaXQnLCdiYXNlNjQnLCdxdW90ZWQtcHJpbnRhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgJ3V1ZW5jb2RlJywgJ3gtdXVlbmNvZGUnLCAndXVlJywgJ3gtdXVlJ106CisgICAgICAgICAgICBpID0gU3RyaW5nSU8uU3RyaW5nSU8oc3RhcnQpCisgICAgICAgICAgICBvID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgbWltZXRvb2xzLmVuY29kZShpLCBvLCBlbmMpCisgICAgICAgICAgICBpID0gU3RyaW5nSU8uU3RyaW5nSU8oby5nZXR2YWx1ZSgpKQorICAgICAgICAgICAgbyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIG1pbWV0b29scy5kZWNvZGUoaSwgbywgZW5jKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLmdldHZhbHVlKCksIHN0YXJ0KQorCisgICAgZGVmIHRlc3RfYm91bmRhcnkoc2VsZik6CisgICAgICAgIHMgPSBzZXQoWyIiXSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBuYiA9IG1pbWV0b29scy5jaG9vc2VfYm91bmRhcnkoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihuYiwgcykKKyAgICAgICAgICAgIHMuYWRkKG5iKQorCisgICAgZGVmIHRlc3RfbWVzc2FnZShzZWxmKToKKyAgICAgICAgbXNnID0gbWltZXRvb2xzLk1lc3NhZ2UoU3RyaW5nSU8uU3RyaW5nSU8obXNndGV4dDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXR0eXBlKCksICJ0ZXh0L3BsYWluIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0bWFpbnR5cGUoKSwgInRleHQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRzdWJ0eXBlKCksICJwbGFpbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldHBsaXN0KCksIFsiY2hhcnNldD1pc28tODg1OS0xIiwgImZvcm1hdD1mbG93ZWQiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0cGFyYW1uYW1lcygpLCBbImNoYXJzZXQiLCAiZm9ybWF0Il0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldHBhcmFtKCJjaGFyc2V0IiksICJpc28tODg1OS0xIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0cGFyYW0oImZvcm1hdCIpLCAiZmxvd2VkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0cGFyYW0oInNwYW0iKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0ZW5jb2RpbmcoKSwgIjhiaXQiKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChNaW1lVG9vbHNUZXN0KQorCitpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWltZXRvb2xzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbWV0b29scy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyN2RiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbWV0b29scy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWltZXRvb2xzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbWV0b29scy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyN2RiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbWV0b29scy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OGQ3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldHlwZXMucHkKQEAgLTAsMCArMSw5NiBAQAoraW1wb3J0IG1pbWV0eXBlcworaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBUZWxsIGl0IHdlIGRvbid0IGtub3cgYWJvdXQgZXh0ZXJuYWwgZmlsZXM6CittaW1ldHlwZXMua25vd25maWxlcyA9IFtdCittaW1ldHlwZXMuaW5pdGVkID0gRmFsc2UKK21pbWV0eXBlcy5fZGVmYXVsdF9taW1lX3R5cGVzKCkKKworCitjbGFzcyBNaW1lVHlwZXNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmRiID0gbWltZXR5cGVzLk1pbWVUeXBlcygpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X2RhdGEoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoImZvby5odG1sIiksICgidGV4dC9odG1sIiwgTm9uZSkpCisgICAgICAgIGVxKHNlbGYuZGIuZ3Vlc3NfdHlwZSgiZm9vLnRneiIpLCAoImFwcGxpY2F0aW9uL3gtdGFyIiwgImd6aXAiKSkKKyAgICAgICAgZXEoc2VsZi5kYi5ndWVzc190eXBlKCJmb28udGFyLmd6IiksICgiYXBwbGljYXRpb24veC10YXIiLCAiZ3ppcCIpKQorICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoImZvby50YXIuWiIpLCAoImFwcGxpY2F0aW9uL3gtdGFyIiwgImNvbXByZXNzIikpCisgICAgICAgIGVxKHNlbGYuZGIuZ3Vlc3NfdHlwZSgiZm9vLnRhci5iejIiKSwgKCJhcHBsaWNhdGlvbi94LXRhciIsICJiemlwMiIpKQorICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoImZvby50YXIueHoiKSwgKCJhcHBsaWNhdGlvbi94LXRhciIsICJ4eiIpKQorCisgICAgZGVmIHRlc3RfZGF0YV91cmxzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZ3Vlc3NfdHlwZSA9IHNlbGYuZGIuZ3Vlc3NfdHlwZQorICAgICAgICBlcShndWVzc190eXBlKCJkYXRhOix0aGlzSXNUZXh0UGxhaW4iKSwgKCJ0ZXh0L3BsYWluIiwgTm9uZSkpCisgICAgICAgIGVxKGd1ZXNzX3R5cGUoImRhdGE6O2Jhc2U2NCx0aGlzSXNUZXh0UGxhaW4iKSwgKCJ0ZXh0L3BsYWluIiwgTm9uZSkpCisgICAgICAgIGVxKGd1ZXNzX3R5cGUoImRhdGE6dGV4dC94LWZvbyx0aGlzSXNUZXh0WEZvbyIpLCAoInRleHQveC1mb28iLCBOb25lKSkKKworICAgIGRlZiB0ZXN0X2ZpbGVfcGFyc2luZyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHNpbyA9IFN0cmluZ0lPLlN0cmluZ0lPKCJ4LWFwcGxpY2F0aW9uL3gtdW5pdHRlc3QgcHl1bml0XG4iKQorICAgICAgICBzZWxmLmRiLnJlYWRmcChzaW8pCisgICAgICAgIGVxKHNlbGYuZGIuZ3Vlc3NfdHlwZSgiZm9vLnB5dW5pdCIpLAorICAgICAgICAgICAoIngtYXBwbGljYXRpb24veC11bml0dGVzdCIsIE5vbmUpKQorICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX2V4dGVuc2lvbigieC1hcHBsaWNhdGlvbi94LXVuaXR0ZXN0IiksICIucHl1bml0IikKKworICAgIGRlZiB0ZXN0X25vbl9zdGFuZGFyZF90eXBlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgRmlyc3QgdHJ5IHN0cmljdAorICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoJ2Zvby54dWwnLCBzdHJpY3Q9VHJ1ZSksIChOb25lLCBOb25lKSkKKyAgICAgICAgZXEoc2VsZi5kYi5ndWVzc19leHRlbnNpb24oJ2ltYWdlL2pwZycsIHN0cmljdD1UcnVlKSwgTm9uZSkKKyAgICAgICAgIyBBbmQgdGhlbiBub24tc3RyaWN0CisgICAgICAgIGVxKHNlbGYuZGIuZ3Vlc3NfdHlwZSgnZm9vLnh1bCcsIHN0cmljdD1GYWxzZSksICgndGV4dC94dWwnLCBOb25lKSkKKyAgICAgICAgZXEoc2VsZi5kYi5ndWVzc19leHRlbnNpb24oJ2ltYWdlL2pwZycsIHN0cmljdD1GYWxzZSksICcuanBnJykKKworICAgIGRlZiB0ZXN0X2d1ZXNzX2FsbF90eXBlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICAjIEZpcnN0IHRyeSBzdHJpY3QuICBVc2UgYSBzZXQgaGVyZSBmb3IgdGVzdGluZyB0aGUgcmVzdWx0cyBiZWNhdXNlIGlmCisgICAgICAgICMgdGVzdF91cmxsaWIyIGlzIHJ1biBiZWZvcmUgdGVzdF9taW1ldHlwZXMsIGdsb2JhbCBzdGF0ZSBpcyBtb2RpZmllZAorICAgICAgICAjIHN1Y2ggdGhhdCB0aGUgJ2FsbCcgc2V0IHdpbGwgaGF2ZSBtb3JlIGl0ZW1zIGluIGl0LgorICAgICAgICBhbGwgPSBzZXQoc2VsZi5kYi5ndWVzc19hbGxfZXh0ZW5zaW9ucygndGV4dC9wbGFpbicsIHN0cmljdD1UcnVlKSkKKyAgICAgICAgdW5sZXNzKGFsbCA+PSBzZXQoWycuYmF0JywgJy5jJywgJy5oJywgJy5rc2gnLCAnLnBsJywgJy50eHQnXSkpCisgICAgICAgICMgQW5kIG5vdyBub24tc3RyaWN0CisgICAgICAgIGFsbCA9IHNlbGYuZGIuZ3Vlc3NfYWxsX2V4dGVuc2lvbnMoJ2ltYWdlL2pwZycsIHN0cmljdD1GYWxzZSkKKyAgICAgICAgYWxsLnNvcnQoKQorICAgICAgICBlcShhbGwsIFsnLmpwZyddKQorICAgICAgICAjIEFuZCBub3cgZm9yIG5vIGhpdHMKKyAgICAgICAgYWxsID0gc2VsZi5kYi5ndWVzc19hbGxfZXh0ZW5zaW9ucygnaW1hZ2UvanBnJywgc3RyaWN0PVRydWUpCisgICAgICAgIGVxKGFsbCwgW10pCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpLCAiV2luZG93cyBvbmx5IikKK2NsYXNzIFdpbjMyTWltZVR5cGVzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBlbnN1cmUgYWxsIGVudHJpZXMgYWN0dWFsbHkgY29tZSBmcm9tIHRoZSBXaW5kb3dzIHJlZ2lzdHJ5CisgICAgICAgIHNlbGYub3JpZ2luYWxfdHlwZXNfbWFwID0gbWltZXR5cGVzLnR5cGVzX21hcC5jb3B5KCkKKyAgICAgICAgbWltZXR5cGVzLnR5cGVzX21hcC5jbGVhcigpCisgICAgICAgIG1pbWV0eXBlcy5pbml0KCkKKyAgICAgICAgc2VsZi5kYiA9IG1pbWV0eXBlcy5NaW1lVHlwZXMoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjIHJlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncworICAgICAgICBtaW1ldHlwZXMudHlwZXNfbWFwLmNsZWFyKCkKKyAgICAgICAgbWltZXR5cGVzLnR5cGVzX21hcC51cGRhdGUoc2VsZi5vcmlnaW5hbF90eXBlc19tYXApCisKKyAgICBkZWYgdGVzdF9yZWdpc3RyeV9wYXJzaW5nKHNlbGYpOgorICAgICAgICAjIHRoZSBvcmlnaW5hbCwgbWluaW11bSBjb250ZW50cyBvZiB0aGUgTUlNRSBkYXRhYmFzZSBpbiB0aGUKKyAgICAgICAgIyBXaW5kb3dzIHJlZ2lzdHJ5IGlzIHVuZG9jdW1lbnRlZCBBRkFJSy4KKyAgICAgICAgIyBVc2UgZmlsZSB0eXBlcyB0aGF0IHNob3VsZCAqYWx3YXlzKiBleGlzdDoKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHNlbGYuZGIuZ3Vlc3NfdHlwZSgiZm9vLnR4dCIpLCAoInRleHQvcGxhaW4iLCBOb25lKSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTWltZVR5cGVzVGVzdENhc2UsCisgICAgICAgIFdpbjMyTWltZVR5cGVzVGVzdENhc2UKKyAgICAgICAgKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbWV0eXBlcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldHlwZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZjU2ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldHlwZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbWV0eXBlcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldHlwZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZjU2ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldHlwZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbmlkb20ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW5pZG9tLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMGYwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW5pZG9tLnB5CkBAIC0wLDAgKzEsMTUxMSBAQAorIyB0ZXN0IGZvciB4bWwuZG9tLm1pbmlkb20KKworaW1wb3J0IHBpY2tsZQorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHJ1bl91bml0dGVzdCwgZmluZGZpbGUKK2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgeG1sLmRvbQoraW1wb3J0IHhtbC5kb20ubWluaWRvbQoraW1wb3J0IHhtbC5wYXJzZXJzLmV4cGF0CisKK2Zyb20geG1sLmRvbS5taW5pZG9tIGltcG9ydCBwYXJzZSwgTm9kZSwgRG9jdW1lbnQsIHBhcnNlU3RyaW5nCitmcm9tIHhtbC5kb20ubWluaWRvbSBpbXBvcnQgZ2V0RE9NSW1wbGVtZW50YXRpb24KKworCit0c3RmaWxlID0gZmluZGZpbGUoInRlc3QueG1sIiwgc3ViZGlyPSJ4bWx0ZXN0ZGF0YSIpCisKKworIyBUaGUgdGVzdHMgb2YgRG9jdW1lbnRUeXBlIGltcG9ydGluZyB1c2UgdGhlc2UgaGVscGVycyB0byBjb25zdHJ1Y3QKKyMgdGhlIGRvY3VtZW50cyB0byB3b3JrIHdpdGgsIHNpbmNlIG5vdCBhbGwgRE9NIGJ1aWxkZXJzIGFjdHVhbGx5CisjIGNyZWF0ZSB0aGUgRG9jdW1lbnRUeXBlIG5vZGVzLgorZGVmIGNyZWF0ZV9kb2Nfd2l0aG91dF9kb2N0eXBlKGRvY3R5cGU9Tm9uZSk6CisgICAgcmV0dXJuIGdldERPTUltcGxlbWVudGF0aW9uKCkuY3JlYXRlRG9jdW1lbnQoTm9uZSwgImRvYyIsIGRvY3R5cGUpCisKK2RlZiBjcmVhdGVfbm9uZW1wdHlfZG9jdHlwZSgpOgorICAgIGRvY3R5cGUgPSBnZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50VHlwZSgiZG9jIiwgTm9uZSwgTm9uZSkKKyAgICBkb2N0eXBlLmVudGl0aWVzLl9zZXEgPSBbXQorICAgIGRvY3R5cGUubm90YXRpb25zLl9zZXEgPSBbXQorICAgIG5vdGF0aW9uID0geG1sLmRvbS5taW5pZG9tLk5vdGF0aW9uKCJteS1ub3RhdGlvbiIsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ub3RhdGlvbnMvbXkiKQorICAgIGRvY3R5cGUubm90YXRpb25zLl9zZXEuYXBwZW5kKG5vdGF0aW9uKQorICAgIGVudGl0eSA9IHhtbC5kb20ubWluaWRvbS5FbnRpdHkoIm15LWVudGl0eSIsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5weXRob24ub3JnL2VudGl0aWVzL215IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteS1ub3RhdGlvbiIpCisgICAgZW50aXR5LnZlcnNpb24gPSAiMS4wIgorICAgIGVudGl0eS5lbmNvZGluZyA9ICJ1dGYtOCIKKyAgICBlbnRpdHkuYWN0dWFsRW5jb2RpbmcgPSAidXMtYXNjaWkiCisgICAgZG9jdHlwZS5lbnRpdGllcy5fc2VxLmFwcGVuZChlbnRpdHkpCisgICAgcmV0dXJuIGRvY3R5cGUKKworZGVmIGNyZWF0ZV9kb2Nfd2l0aF9kb2N0eXBlKCk6CisgICAgZG9jdHlwZSA9IGNyZWF0ZV9ub25lbXB0eV9kb2N0eXBlKCkKKyAgICBkb2MgPSBjcmVhdGVfZG9jX3dpdGhvdXRfZG9jdHlwZShkb2N0eXBlKQorICAgIGRvY3R5cGUuZW50aXRpZXMuaXRlbSgwKS5vd25lckRvY3VtZW50ID0gZG9jCisgICAgZG9jdHlwZS5ub3RhdGlvbnMuaXRlbSgwKS5vd25lckRvY3VtZW50ID0gZG9jCisgICAgcmV0dXJuIGRvYworCitjbGFzcyBNaW5pZG9tVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGNvbmZpcm0oc2VsZiwgdGVzdCwgdGVzdG5hbWUgPSAiVGVzdCIpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUodGVzdCwgdGVzdG5hbWUpCisKKyAgICBkZWYgY2hlY2tXaG9sZVRleHQoc2VsZiwgbm9kZSwgcyk6CisgICAgICAgIHQgPSBub2RlLndob2xlVGV4dAorICAgICAgICBzZWxmLmNvbmZpcm0odCA9PSBzLCAibG9va2luZyBmb3IgJXMsIGZvdW5kICVzIiAlIChyZXByKHMpLCByZXByKHQpKSkKKworICAgIGRlZiB0ZXN0UGFyc2VGcm9tRmlsZShzZWxmKToKKyAgICAgICAgZG9tID0gcGFyc2UoU3RyaW5nSU8ob3Blbih0c3RmaWxlKS5yZWFkKCkpKQorICAgICAgICBkb20udW5saW5rKCkKKyAgICAgICAgc2VsZi5jb25maXJtKGlzaW5zdGFuY2UoZG9tLERvY3VtZW50KSkKKworICAgIGRlZiB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWUoc2VsZik6CisgICAgICAgIGRvbSA9IHBhcnNlKHRzdGZpbGUpCisgICAgICAgIHNlbGYuY29uZmlybShkb20uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxJIikgPT0gXAorICAgICAgICAgICAgICAgIGRvbS5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkxJIikpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RJbnNlcnRCZWZvcmUoc2VsZik6CisgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKCI8ZG9jPjxmb28vPjwvZG9jPiIpCisgICAgICAgIHJvb3QgPSBkb20uZG9jdW1lbnRFbGVtZW50CisgICAgICAgIGVsZW0gPSByb290LmNoaWxkTm9kZXNbMF0KKyAgICAgICAgbmVsZW0gPSBkb20uY3JlYXRlRWxlbWVudCgiZWxlbWVudCIpCisgICAgICAgIHJvb3QuaW5zZXJ0QmVmb3JlKG5lbGVtLCBlbGVtKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gMgorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzBdIGlzIG5lbGVtCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5pdGVtKDApIGlzIG5lbGVtCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1sxXSBpcyBlbGVtCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5pdGVtKDEpIGlzIGVsZW0KKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkIGlzIG5lbGVtCisgICAgICAgICAgICAgICAgYW5kIHJvb3QubGFzdENoaWxkIGlzIGVsZW0KKyAgICAgICAgICAgICAgICBhbmQgcm9vdC50b3htbCgpID09ICI8ZG9jPjxlbGVtZW50Lz48Zm9vLz48L2RvYz4iCisgICAgICAgICAgICAgICAgLCAidGVzdEluc2VydEJlZm9yZSAtLSBub2RlIHByb3Blcmx5IHBsYWNlZCBpbiB0cmVlIikKKyAgICAgICAgbmVsZW0gPSBkb20uY3JlYXRlRWxlbWVudCgiZWxlbWVudCIpCisgICAgICAgIHJvb3QuaW5zZXJ0QmVmb3JlKG5lbGVtLCBOb25lKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gMworICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDMKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzFdIGlzIGVsZW0KKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLml0ZW0oMSkgaXMgZWxlbQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXNbMl0gaXMgbmVsZW0KKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLml0ZW0oMikgaXMgbmVsZW0KKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5sYXN0Q2hpbGQgaXMgbmVsZW0KKyAgICAgICAgICAgICAgICBhbmQgbmVsZW0ucHJldmlvdXNTaWJsaW5nIGlzIGVsZW0KKyAgICAgICAgICAgICAgICBhbmQgcm9vdC50b3htbCgpID09ICI8ZG9jPjxlbGVtZW50Lz48Zm9vLz48ZWxlbWVudC8+PC9kb2M+IgorICAgICAgICAgICAgICAgICwgInRlc3RJbnNlcnRCZWZvcmUgLS0gbm9kZSBwcm9wZXJseSBwbGFjZWQgaW4gdHJlZSIpCisgICAgICAgIG5lbGVtMiA9IGRvbS5jcmVhdGVFbGVtZW50KCJiYXIiKQorICAgICAgICByb290Lmluc2VydEJlZm9yZShuZWxlbTIsIG5lbGVtKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gNAorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDQKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzJdIGlzIG5lbGVtMgorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMuaXRlbSgyKSBpcyBuZWxlbTIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzNdIGlzIG5lbGVtCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5pdGVtKDMpIGlzIG5lbGVtCisgICAgICAgICAgICAgICAgYW5kIG5lbGVtMi5uZXh0U2libGluZyBpcyBuZWxlbQorICAgICAgICAgICAgICAgIGFuZCBuZWxlbS5wcmV2aW91c1NpYmxpbmcgaXMgbmVsZW0yCisgICAgICAgICAgICAgICAgYW5kIHJvb3QudG94bWwoKSA9PQorICAgICAgICAgICAgICAgICI8ZG9jPjxlbGVtZW50Lz48Zm9vLz48YmFyLz48ZWxlbWVudC8+PC9kb2M+IgorICAgICAgICAgICAgICAgICwgInRlc3RJbnNlcnRCZWZvcmUgLS0gbm9kZSBwcm9wZXJseSBwbGFjZWQgaW4gdHJlZSIpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIF9jcmVhdGVfZnJhZ21lbnRfdGVzdF9ub2RlcyhzZWxmKToKKyAgICAgICAgZG9tID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCisgICAgICAgIG9yaWcgPSBkb20uY3JlYXRlVGV4dE5vZGUoIm9yaWdpbmFsIikKKyAgICAgICAgYzEgPSBkb20uY3JlYXRlVGV4dE5vZGUoImZvbyIpCisgICAgICAgIGMyID0gZG9tLmNyZWF0ZVRleHROb2RlKCJiYXIiKQorICAgICAgICBjMyA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiYmF0IikKKyAgICAgICAgZG9tLmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChvcmlnKQorICAgICAgICBmcmFnID0gZG9tLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQorICAgICAgICBmcmFnLmFwcGVuZENoaWxkKGMxKQorICAgICAgICBmcmFnLmFwcGVuZENoaWxkKGMyKQorICAgICAgICBmcmFnLmFwcGVuZENoaWxkKGMzKQorICAgICAgICByZXR1cm4gZG9tLCBvcmlnLCBjMSwgYzIsIGMzLCBmcmFnCisKKyAgICBkZWYgdGVzdEluc2VydEJlZm9yZUZyYWdtZW50KHNlbGYpOgorICAgICAgICBkb20sIG9yaWcsIGMxLCBjMiwgYzMsIGZyYWcgPSBzZWxmLl9jcmVhdGVfZnJhZ21lbnRfdGVzdF9ub2RlcygpCisgICAgICAgIGRvbS5kb2N1bWVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGZyYWcsIE5vbmUpCisgICAgICAgIHNlbGYuY29uZmlybSh0dXBsZShkb20uZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpID09CisgICAgICAgICAgICAgICAgICAgICAob3JpZywgYzEsIGMyLCBjMyksCisgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0QmVmb3JlKDxmcmFnbWVudD4sIE5vbmUpIikKKyAgICAgICAgZnJhZy51bmxpbmsoKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgICAgICBkb20sIG9yaWcsIGMxLCBjMiwgYzMsIGZyYWcgPSBzZWxmLl9jcmVhdGVfZnJhZ21lbnRfdGVzdF9ub2RlcygpCisgICAgICAgIGRvbS5kb2N1bWVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGZyYWcsIG9yaWcpCisgICAgICAgIHNlbGYuY29uZmlybSh0dXBsZShkb20uZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpID09CisgICAgICAgICAgICAgICAgICAgICAoYzEsIGMyLCBjMywgb3JpZyksCisgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0QmVmb3JlKDxmcmFnbWVudD4sIG9yaWcpIikKKyAgICAgICAgZnJhZy51bmxpbmsoKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0QXBwZW5kQ2hpbGQoc2VsZik6CisgICAgICAgIGRvbSA9IHBhcnNlKHRzdGZpbGUpCisgICAgICAgIGRvbS5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUNvbW1lbnQodSJIZWxsbyIpKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9tLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzWy0xXS5ub2RlTmFtZSA9PSAiI2NvbW1lbnQiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9tLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzWy0xXS5kYXRhID09ICJIZWxsbyIpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RBcHBlbmRDaGlsZEZyYWdtZW50KHNlbGYpOgorICAgICAgICBkb20sIG9yaWcsIGMxLCBjMiwgYzMsIGZyYWcgPSBzZWxmLl9jcmVhdGVfZnJhZ21lbnRfdGVzdF9ub2RlcygpCisgICAgICAgIGRvbS5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZnJhZykKKyAgICAgICAgc2VsZi5jb25maXJtKHR1cGxlKGRvbS5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcykgPT0KKyAgICAgICAgICAgICAgICAgICAgIChvcmlnLCBjMSwgYzIsIGMzKSwKKyAgICAgICAgICAgICAgICAgICAgICJhcHBlbmRDaGlsZCg8ZnJhZ21lbnQ+KSIpCisgICAgICAgIGZyYWcudW5saW5rKCkKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdFJlcGxhY2VDaGlsZEZyYWdtZW50KHNlbGYpOgorICAgICAgICBkb20sIG9yaWcsIGMxLCBjMiwgYzMsIGZyYWcgPSBzZWxmLl9jcmVhdGVfZnJhZ21lbnRfdGVzdF9ub2RlcygpCisgICAgICAgIGRvbS5kb2N1bWVudEVsZW1lbnQucmVwbGFjZUNoaWxkKGZyYWcsIG9yaWcpCisgICAgICAgIG9yaWcudW5saW5rKCkKKyAgICAgICAgc2VsZi5jb25maXJtKHR1cGxlKGRvbS5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcykgPT0gKGMxLCBjMiwgYzMpLAorICAgICAgICAgICAgICAgICJyZXBsYWNlQ2hpbGQoPGZyYWdtZW50PikiKQorICAgICAgICBmcmFnLnVubGluaygpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RMZWdhbENoaWxkcmVuKHNlbGYpOgorICAgICAgICBkb20gPSBEb2N1bWVudCgpCisgICAgICAgIGVsZW0gPSBkb20uY3JlYXRlRWxlbWVudCgnZWxlbWVudCcpCisgICAgICAgIHRleHQgPSBkb20uY3JlYXRlVGV4dE5vZGUoJ3RleHQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIsIGRvbS5hcHBlbmRDaGlsZCwgdGV4dCkKKworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWxlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyLCBkb20uaW5zZXJ0QmVmb3JlLCB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIsIGRvbS5yZXBsYWNlQ2hpbGQsIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0pCisKKyAgICAgICAgbm9kZW1hcCA9IGVsZW0uYXR0cmlidXRlcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIsIG5vZGVtYXAuc2V0TmFtZWRJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIsIG5vZGVtYXAuc2V0TmFtZWRJdGVtTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQpCisKKyAgICAgICAgZWxlbS5hcHBlbmRDaGlsZCh0ZXh0KQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0TmFtZWROb2RlTWFwU2V0SXRlbShzZWxmKToKKyAgICAgICAgZG9tID0gRG9jdW1lbnQoKQorICAgICAgICBlbGVtID0gZG9tLmNyZWF0ZUVsZW1lbnQoJ2VsZW1lbnQnKQorICAgICAgICBhdHRycyA9IGVsZW0uYXR0cmlidXRlcworICAgICAgICBhdHRyc1siZm9vIl0gPSAiYmFyIgorICAgICAgICBhID0gYXR0cnMuaXRlbSgwKQorICAgICAgICBzZWxmLmNvbmZpcm0oYS5vd25lckRvY3VtZW50IGlzIGRvbSwKKyAgICAgICAgICAgICAgICAiTmFtZWROb2RlTWFwLl9fc2V0aXRlbV9fKCkgc2V0cyBvd25lckRvY3VtZW50IikKKyAgICAgICAgc2VsZi5jb25maXJtKGEub3duZXJFbGVtZW50IGlzIGVsZW0sCisgICAgICAgICAgICAgICAgIk5hbWVkTm9kZU1hcC5fX3NldGl0ZW1fXygpIHNldHMgb3duZXJFbGVtZW50IikKKyAgICAgICAgc2VsZi5jb25maXJtKGEudmFsdWUgPT0gImJhciIsCisgICAgICAgICAgICAgICAgIk5hbWVkTm9kZU1hcC5fX3NldGl0ZW1fXygpIHNldHMgdmFsdWUiKQorICAgICAgICBzZWxmLmNvbmZpcm0oYS5ub2RlVmFsdWUgPT0gImJhciIsCisgICAgICAgICAgICAgICAgIk5hbWVkTm9kZU1hcC5fX3NldGl0ZW1fXygpIHNldHMgbm9kZVZhbHVlIikKKyAgICAgICAgZWxlbS51bmxpbmsoKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0Tm9uWmVybyhzZWxmKToKKyAgICAgICAgZG9tID0gcGFyc2UodHN0ZmlsZSkKKyAgICAgICAgc2VsZi5jb25maXJtKGRvbSkjIHNob3VsZCBub3QgYmUgemVybworICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUNvbW1lbnQoImZvbyIpKQorICAgICAgICBzZWxmLmNvbmZpcm0obm90IGRvbS5jaGlsZE5vZGVzWy0xXS5jaGlsZE5vZGVzKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0VW5saW5rKHNlbGYpOgorICAgICAgICBkb20gPSBwYXJzZSh0c3RmaWxlKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0RWxlbWVudChzZWxmKToKKyAgICAgICAgZG9tID0gRG9jdW1lbnQoKQorICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQoImFiYyIpKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9tLmRvY3VtZW50RWxlbWVudCkKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdEFBQShzZWxmKToKKyAgICAgICAgZG9tID0gcGFyc2VTdHJpbmcoIjxhYmMvPiIpCisgICAgICAgIGVsID0gZG9tLmRvY3VtZW50RWxlbWVudAorICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoInNwYW0iLCAiamFtMiIpCisgICAgICAgIHNlbGYuY29uZmlybShlbC50b3htbCgpID09ICc8YWJjIHNwYW09ImphbTIiLz4nLCAidGVzdEFBQSIpCisgICAgICAgIGEgPSBlbC5nZXRBdHRyaWJ1dGVOb2RlKCJzcGFtIikKKyAgICAgICAgc2VsZi5jb25maXJtKGEub3duZXJEb2N1bWVudCBpcyBkb20sCisgICAgICAgICAgICAgICAgInNldEF0dHJpYnV0ZSgpIHNldHMgb3duZXJEb2N1bWVudCIpCisgICAgICAgIHNlbGYuY29uZmlybShhLm93bmVyRWxlbWVudCBpcyBkb20uZG9jdW1lbnRFbGVtZW50LAorICAgICAgICAgICAgICAgICJzZXRBdHRyaWJ1dGUoKSBzZXRzIG93bmVyRWxlbWVudCIpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RBQUIoc2VsZik6CisgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKCI8YWJjLz4iKQorICAgICAgICBlbCA9IGRvbS5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgZWwuc2V0QXR0cmlidXRlKCJzcGFtIiwgImphbSIpCisgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgic3BhbSIsICJqYW0yIikKKyAgICAgICAgc2VsZi5jb25maXJtKGVsLnRveG1sKCkgPT0gJzxhYmMgc3BhbT0iamFtMiIvPicsICJ0ZXN0QUFCIikKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdEFkZEF0dHIoc2VsZik6CisgICAgICAgIGRvbSA9IERvY3VtZW50KCkKKyAgICAgICAgY2hpbGQgPSBkb20uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQoImFiYyIpKQorCisgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgiZGVmIiwgImdoaSIpCisgICAgICAgIHNlbGYuY29uZmlybShjaGlsZC5nZXRBdHRyaWJ1dGUoImRlZiIpID09ICJnaGkiKQorICAgICAgICBzZWxmLmNvbmZpcm0oY2hpbGQuYXR0cmlidXRlc1siZGVmIl0udmFsdWUgPT0gImdoaSIpCisKKyAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCJqa2wiLCAibW5vIikKKyAgICAgICAgc2VsZi5jb25maXJtKGNoaWxkLmdldEF0dHJpYnV0ZSgiamtsIikgPT0gIm1ubyIpCisgICAgICAgIHNlbGYuY29uZmlybShjaGlsZC5hdHRyaWJ1dGVzWyJqa2wiXS52YWx1ZSA9PSAibW5vIikKKworICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDIpCisKKyAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCJkZWYiLCAibmV3dmFsIikKKyAgICAgICAgc2VsZi5jb25maXJtKGNoaWxkLmdldEF0dHJpYnV0ZSgiZGVmIikgPT0gIm5ld3ZhbCIpCisgICAgICAgIHNlbGYuY29uZmlybShjaGlsZC5hdHRyaWJ1dGVzWyJkZWYiXS52YWx1ZSA9PSAibmV3dmFsIikKKworICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDIpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3REZWxldGVBdHRyKHNlbGYpOgorICAgICAgICBkb20gPSBEb2N1bWVudCgpCisgICAgICAgIGNoaWxkID0gZG9tLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVFbGVtZW50KCJhYmMiKSkKKworICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDApCisgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgiZGVmIiwgImdoaSIpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oY2hpbGQuYXR0cmlidXRlcykgPT0gMSkKKyAgICAgICAgZGVsIGNoaWxkLmF0dHJpYnV0ZXNbImRlZiJdCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oY2hpbGQuYXR0cmlidXRlcykgPT0gMCkKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdFJlbW92ZUF0dHIoc2VsZik6CisgICAgICAgIGRvbSA9IERvY3VtZW50KCkKKyAgICAgICAgY2hpbGQgPSBkb20uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQoImFiYyIpKQorCisgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgiZGVmIiwgImdoaSIpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oY2hpbGQuYXR0cmlidXRlcykgPT0gMSkKKyAgICAgICAgY2hpbGQucmVtb3ZlQXR0cmlidXRlKCJkZWYiKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDApCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RSZW1vdmVBdHRyTlMoc2VsZik6CisgICAgICAgIGRvbSA9IERvY3VtZW50KCkKKyAgICAgICAgY2hpbGQgPSBkb20uYXBwZW5kQ2hpbGQoCisgICAgICAgICAgICAgICAgZG9tLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy5weXRob24ub3JnIiwgInB5dGhvbjphYmMiKSkKKyAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlTlMoImh0dHA6Ly93d3cudzMub3JnIiwgInhtbG5zOnB5dGhvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5weXRob24ub3JnIikKKyAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlTlMoImh0dHA6Ly93d3cucHl0aG9uLm9yZyIsICJweXRob246YWJjYXR0ciIsICJmb28iKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDIpCisgICAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZU5TKCJodHRwOi8vd3d3LnB5dGhvbi5vcmciLCAiYWJjYXR0ciIpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oY2hpbGQuYXR0cmlidXRlcykgPT0gMSkKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdFJlbW92ZUF0dHJpYnV0ZU5vZGUoc2VsZik6CisgICAgICAgIGRvbSA9IERvY3VtZW50KCkKKyAgICAgICAgY2hpbGQgPSBkb20uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQoImZvbyIpKQorICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoInNwYW0iLCAiamFtIikKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihjaGlsZC5hdHRyaWJ1dGVzKSA9PSAxKQorICAgICAgICBub2RlID0gY2hpbGQuZ2V0QXR0cmlidXRlTm9kZSgic3BhbSIpCisgICAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZU5vZGUobm9kZSkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihjaGlsZC5hdHRyaWJ1dGVzKSA9PSAwCisgICAgICAgICAgICAgICAgYW5kIGNoaWxkLmdldEF0dHJpYnV0ZU5vZGUoInNwYW0iKSBpcyBOb25lKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0Q2hhbmdlQXR0cihzZWxmKToKKyAgICAgICAgZG9tID0gcGFyc2VTdHJpbmcoIjxhYmMvPiIpCisgICAgICAgIGVsID0gZG9tLmRvY3VtZW50RWxlbWVudAorICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoInNwYW0iLCAiamFtIikKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihlbC5hdHRyaWJ1dGVzKSA9PSAxKQorICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoInNwYW0iLCAiYmFtIikKKyAgICAgICAgIyBTZXQgdGhpcyBhdHRyaWJ1dGUgdG8gYmUgYW4gSUQgYW5kIG1ha2Ugc3VyZSB0aGF0IGRvZXNuJ3QgY2hhbmdlCisgICAgICAgICMgd2hlbiBjaGFuZ2luZyB0aGUgdmFsdWU6CisgICAgICAgIGVsLnNldElkQXR0cmlidXRlKCJzcGFtIikKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihlbC5hdHRyaWJ1dGVzKSA9PSAxCisgICAgICAgICAgICAgICAgYW5kIGVsLmF0dHJpYnV0ZXNbInNwYW0iXS52YWx1ZSA9PSAiYmFtIgorICAgICAgICAgICAgICAgIGFuZCBlbC5hdHRyaWJ1dGVzWyJzcGFtIl0ubm9kZVZhbHVlID09ICJiYW0iCisgICAgICAgICAgICAgICAgYW5kIGVsLmdldEF0dHJpYnV0ZSgic3BhbSIpID09ICJiYW0iCisgICAgICAgICAgICAgICAgYW5kIGVsLmdldEF0dHJpYnV0ZU5vZGUoInNwYW0iKS5pc0lkKQorICAgICAgICBlbC5hdHRyaWJ1dGVzWyJzcGFtIl0gPSAiaGFtIgorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGVsLmF0dHJpYnV0ZXMpID09IDEKKyAgICAgICAgICAgICAgICBhbmQgZWwuYXR0cmlidXRlc1sic3BhbSJdLnZhbHVlID09ICJoYW0iCisgICAgICAgICAgICAgICAgYW5kIGVsLmF0dHJpYnV0ZXNbInNwYW0iXS5ub2RlVmFsdWUgPT0gImhhbSIKKyAgICAgICAgICAgICAgICBhbmQgZWwuZ2V0QXR0cmlidXRlKCJzcGFtIikgPT0gImhhbSIKKyAgICAgICAgICAgICAgICBhbmQgZWwuYXR0cmlidXRlc1sic3BhbSJdLmlzSWQpCisgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgic3BhbTIiLCAiYmFtIikKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihlbC5hdHRyaWJ1dGVzKSA9PSAyCisgICAgICAgICAgICAgICAgYW5kIGVsLmF0dHJpYnV0ZXNbInNwYW0iXS52YWx1ZSA9PSAiaGFtIgorICAgICAgICAgICAgICAgIGFuZCBlbC5hdHRyaWJ1dGVzWyJzcGFtIl0ubm9kZVZhbHVlID09ICJoYW0iCisgICAgICAgICAgICAgICAgYW5kIGVsLmdldEF0dHJpYnV0ZSgic3BhbSIpID09ICJoYW0iCisgICAgICAgICAgICAgICAgYW5kIGVsLmF0dHJpYnV0ZXNbInNwYW0yIl0udmFsdWUgPT0gImJhbSIKKyAgICAgICAgICAgICAgICBhbmQgZWwuYXR0cmlidXRlc1sic3BhbTIiXS5ub2RlVmFsdWUgPT0gImJhbSIKKyAgICAgICAgICAgICAgICBhbmQgZWwuZ2V0QXR0cmlidXRlKCJzcGFtMiIpID09ICJiYW0iKQorICAgICAgICBlbC5hdHRyaWJ1dGVzWyJzcGFtMiJdID0gImJhbTIiCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oZWwuYXR0cmlidXRlcykgPT0gMgorICAgICAgICAgICAgICAgIGFuZCBlbC5hdHRyaWJ1dGVzWyJzcGFtIl0udmFsdWUgPT0gImhhbSIKKyAgICAgICAgICAgICAgICBhbmQgZWwuYXR0cmlidXRlc1sic3BhbSJdLm5vZGVWYWx1ZSA9PSAiaGFtIgorICAgICAgICAgICAgICAgIGFuZCBlbC5nZXRBdHRyaWJ1dGUoInNwYW0iKSA9PSAiaGFtIgorICAgICAgICAgICAgICAgIGFuZCBlbC5hdHRyaWJ1dGVzWyJzcGFtMiJdLnZhbHVlID09ICJiYW0yIgorICAgICAgICAgICAgICAgIGFuZCBlbC5hdHRyaWJ1dGVzWyJzcGFtMiJdLm5vZGVWYWx1ZSA9PSAiYmFtMiIKKyAgICAgICAgICAgICAgICBhbmQgZWwuZ2V0QXR0cmlidXRlKCJzcGFtMiIpID09ICJiYW0yIikKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdEdldEF0dHJMaXN0KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdEdldEF0dHJWYWx1ZXMoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0R2V0QXR0ckxlbmd0aChzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RHZXRBdHRyaWJ1dGUoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0R2V0QXR0cmlidXRlTlMoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0R2V0QXR0cmlidXRlTm9kZShzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RHZXRFbGVtZW50c0J5VGFnTmFtZU5TKHNlbGYpOgorICAgICAgICBkPSIiIjxmb28geG1sbnM6bWluaWRvbT0naHR0cDovL3B5eG1sLnNmLm5ldC9taW5pZG9tJz4KKyAgICAgICAgPG1pbmlkb206bXllbGVtLz4KKyAgICAgICAgPC9mb28+IiIiCisgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKGQpCisgICAgICAgIGVsZW1zID0gZG9tLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoImh0dHA6Ly9weXhtbC5zZi5uZXQvbWluaWRvbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15ZWxlbSIpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oZWxlbXMpID09IDEKKyAgICAgICAgICAgICAgICBhbmQgZWxlbXNbMF0ubmFtZXNwYWNlVVJJID09ICJodHRwOi8vcHl4bWwuc2YubmV0L21pbmlkb20iCisgICAgICAgICAgICAgICAgYW5kIGVsZW1zWzBdLmxvY2FsTmFtZSA9PSAibXllbGVtIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtc1swXS5wcmVmaXggPT0gIm1pbmlkb20iCisgICAgICAgICAgICAgICAgYW5kIGVsZW1zWzBdLnRhZ05hbWUgPT0gIm1pbmlkb206bXllbGVtIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtc1swXS5ub2RlTmFtZSA9PSAibWluaWRvbTpteWVsZW0iKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiBnZXRfZW1wdHlfbm9kZWxpc3RfZnJvbV9lbGVtZW50c19ieV90YWdOYW1lX25zX2hlbHBlcihzZWxmLCBkb2MsIG5zdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbmFtZSk6CisgICAgICAgIG5vZGVsaXN0ID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMobnN1cmksIGxuYW1lKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKG5vZGVsaXN0KSA9PSAwKQorCisgICAgZGVmIHRlc3RHZXRFbXB0eU5vZGVMaXN0RnJvbUVsZW1lbnRzQnlUYWdOYW1lTlMoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCc8ZG9jLz4nKQorICAgICAgICBzZWxmLmdldF9lbXB0eV9ub2RlbGlzdF9mcm9tX2VsZW1lbnRzX2J5X3RhZ05hbWVfbnNfaGVscGVyKAorICAgICAgICAgICAgZG9jLCAnaHR0cDovL3htbC5weXRob24ub3JnL25hbWVzcGFjZXMvYScsICdsb2NhbG5hbWUnKQorICAgICAgICBzZWxmLmdldF9lbXB0eV9ub2RlbGlzdF9mcm9tX2VsZW1lbnRzX2J5X3RhZ05hbWVfbnNfaGVscGVyKAorICAgICAgICAgICAgZG9jLCAnKicsICdzcGxhdCcpCisgICAgICAgIHNlbGYuZ2V0X2VtcHR5X25vZGVsaXN0X2Zyb21fZWxlbWVudHNfYnlfdGFnTmFtZV9uc19oZWxwZXIoCisgICAgICAgICAgICBkb2MsICdodHRwOi8veG1sLnB5dGhvbi5vcmcvbmFtZXNwYWNlcy9hJywgJyonKQorCisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCc8ZG9jIHhtbG5zPSJodHRwOi8veG1sLnB5dGhvbi5vcmcvc3BsYXQiPjxlLz48L2RvYz4nKQorICAgICAgICBzZWxmLmdldF9lbXB0eV9ub2RlbGlzdF9mcm9tX2VsZW1lbnRzX2J5X3RhZ05hbWVfbnNfaGVscGVyKAorICAgICAgICAgICAgZG9jLCAiaHR0cDovL3htbC5weXRob24ub3JnL3NwbGF0IiwgIm5vdC10aGVyZSIpCisgICAgICAgIHNlbGYuZ2V0X2VtcHR5X25vZGVsaXN0X2Zyb21fZWxlbWVudHNfYnlfdGFnTmFtZV9uc19oZWxwZXIoCisgICAgICAgICAgICBkb2MsICIqIiwgIm5vdC10aGVyZSIpCisgICAgICAgIHNlbGYuZ2V0X2VtcHR5X25vZGVsaXN0X2Zyb21fZWxlbWVudHNfYnlfdGFnTmFtZV9uc19oZWxwZXIoCisgICAgICAgICAgICBkb2MsICJodHRwOi8vc29tZXdoZXJlLmVsc2UubmV0L25vdC10aGVyZSIsICJlIikKKworICAgIGRlZiB0ZXN0RWxlbWVudFJlcHJBbmRTdHIoc2VsZik6CisgICAgICAgIGRvbSA9IERvY3VtZW50KCkKKyAgICAgICAgZWwgPSBkb20uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQoImFiYyIpKQorICAgICAgICBzdHJpbmcxID0gcmVwcihlbCkKKyAgICAgICAgc3RyaW5nMiA9IHN0cihlbCkKKyAgICAgICAgc2VsZi5jb25maXJtKHN0cmluZzEgPT0gc3RyaW5nMikKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdEVsZW1lbnRSZXByQW5kU3RyVW5pY29kZShzZWxmKToKKyAgICAgICAgZG9tID0gRG9jdW1lbnQoKQorICAgICAgICBlbCA9IGRvbS5hcHBlbmRDaGlsZChkb20uY3JlYXRlRWxlbWVudCh1ImFiYyIpKQorICAgICAgICBzdHJpbmcxID0gcmVwcihlbCkKKyAgICAgICAgc3RyaW5nMiA9IHN0cihlbCkKKyAgICAgICAgc2VsZi5jb25maXJtKHN0cmluZzEgPT0gc3RyaW5nMikKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdEVsZW1lbnRSZXByQW5kU3RyVW5pY29kZU5TKHNlbGYpOgorICAgICAgICBkb20gPSBEb2N1bWVudCgpCisgICAgICAgIGVsID0gZG9tLmFwcGVuZENoaWxkKAorICAgICAgICAgICAgZG9tLmNyZWF0ZUVsZW1lbnROUyh1Imh0dHA6Ly93d3cuc2xhc2hkb3Qub3JnIiwgdSJzbGFzaDphYmMiKSkKKyAgICAgICAgc3RyaW5nMSA9IHJlcHIoZWwpCisgICAgICAgIHN0cmluZzIgPSBzdHIoZWwpCisgICAgICAgIHNlbGYuY29uZmlybShzdHJpbmcxID09IHN0cmluZzIpCisgICAgICAgIHNlbGYuY29uZmlybSgic2xhc2g6YWJjIiBpbiBzdHJpbmcxKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0QXR0cmlidXRlUmVwcihzZWxmKToKKyAgICAgICAgZG9tID0gRG9jdW1lbnQoKQorICAgICAgICBlbCA9IGRvbS5hcHBlbmRDaGlsZChkb20uY3JlYXRlRWxlbWVudCh1ImFiYyIpKQorICAgICAgICBub2RlID0gZWwuc2V0QXR0cmlidXRlKCJhYmMiLCAiZGVmIikKKyAgICAgICAgc2VsZi5jb25maXJtKHN0cihub2RlKSA9PSByZXByKG5vZGUpKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0VGV4dE5vZGVSZXByKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdFdyaXRlWE1MKHNlbGYpOgorICAgICAgICBzdHIgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiA/PjxhIGI9ImMiLz4nCisgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKHN0cikKKyAgICAgICAgZG9tc3RyID0gZG9tLnRveG1sKCkKKyAgICAgICAgZG9tLnVubGluaygpCisgICAgICAgIHNlbGYuY29uZmlybShzdHIgPT0gZG9tc3RyKQorCisgICAgZGVmIHRlc3RBbHROZXdsaW5lKHNlbGYpOgorICAgICAgICBzdHIgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiA/PlxuPGEgYj0iYyIvPlxuJworICAgICAgICBkb20gPSBwYXJzZVN0cmluZyhzdHIpCisgICAgICAgIGRvbXN0ciA9IGRvbS50b3ByZXR0eXhtbChuZXdsPSJcclxuIikKKyAgICAgICAgZG9tLnVubGluaygpCisgICAgICAgIHNlbGYuY29uZmlybShkb21zdHIgPT0gc3RyLnJlcGxhY2UoIlxuIiwgIlxyXG4iKSkKKworICAgIGRlZiB0ZXN0X3RvcHJldHR5eG1sX3dpdGhfdGV4dF9ub2RlcyhzZWxmKToKKyAgICAgICAgIyBzZWUgaXNzdWUgIzQxNDcsIHRleHQgbm9kZXMgYXJlIG5vdCBpbmRlbnRlZAorICAgICAgICBkZWNsID0gJzw/eG1sIHZlcnNpb249IjEuMCIgPz5cbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZVN0cmluZygnPEI+QTwvQj4nKS50b3ByZXR0eXhtbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wgKyAnPEI+QTwvQj5cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VTdHJpbmcoJzxDPkE8Qj5BPC9CPjwvQz4nKS50b3ByZXR0eXhtbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wgKyAnPEM+XG5cdEFcblx0PEI+QTwvQj5cbjwvQz5cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VTdHJpbmcoJzxDPjxCPkE8L0I+QTwvQz4nKS50b3ByZXR0eXhtbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wgKyAnPEM+XG5cdDxCPkE8L0I+XG5cdEFcbjwvQz5cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VTdHJpbmcoJzxDPjxCPkE8L0I+PEI+QTwvQj48L0M+JykudG9wcmV0dHl4bWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsICsgJzxDPlxuXHQ8Qj5BPC9CPlxuXHQ8Qj5BPC9CPlxuPC9DPlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZVN0cmluZygnPEM+PEI+QTwvQj5BPEI+QTwvQj48L0M+JykudG9wcmV0dHl4bWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsICsgJzxDPlxuXHQ8Qj5BPC9CPlxuXHRBXG5cdDxCPkE8L0I+XG48L0M+XG4nKQorCisgICAgZGVmIHRlc3RfdG9wcmV0dHl4bWxfd2l0aF9hZGphY2VudF90ZXh0X25vZGVzKHNlbGYpOgorICAgICAgICAjIHNlZSBpc3N1ZSAjNDE0NywgYWRqYWNlbnQgdGV4dCBub2RlcyBhcmUgaW5kZW50ZWQgbm9ybWFsbHkKKyAgICAgICAgZG9tID0gRG9jdW1lbnQoKQorICAgICAgICBlbGVtID0gZG9tLmNyZWF0ZUVsZW1lbnQodSdlbGVtJykKKyAgICAgICAgZWxlbS5hcHBlbmRDaGlsZChkb20uY3JlYXRlVGV4dE5vZGUodSdURVhUJykpCisgICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZVRleHROb2RlKHUnVEVYVCcpKQorICAgICAgICBkb20uYXBwZW5kQ2hpbGQoZWxlbSkKKyAgICAgICAgZGVjbCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiID8+XG4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZG9tLnRvcHJldHR5eG1sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbCArICc8ZWxlbT5cblx0VEVYVFxuXHRURVhUXG48L2VsZW0+XG4nKQorCisgICAgZGVmIHRlc3RfdG9wcmV0dHl4bWxfcHJlc2VydmVzX2NvbnRlbnRfb2ZfdGV4dF9ub2RlKHNlbGYpOgorICAgICAgICAjIHNlZSBpc3N1ZSAjNDE0NworICAgICAgICBmb3Igc3RyIGluICgnPEI+QTwvQj4nLCAnPEE+PEI+QzwvQj48L0E+Jyk6CisgICAgICAgICAgICBkb20gPSBwYXJzZVN0cmluZyhzdHIpCisgICAgICAgICAgICBkb20yID0gcGFyc2VTdHJpbmcoZG9tLnRvcHJldHR5eG1sKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIGRvbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnQicpWzBdLmNoaWxkTm9kZXNbMF0udG94bWwoKSwKKyAgICAgICAgICAgICAgICBkb20yLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdCJylbMF0uY2hpbGROb2Rlc1swXS50b3htbCgpKQorCisgICAgZGVmIHRlc3RQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oc2VsZik6CisgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKCc8ZT48P215cGkgXHRcbiBkYXRhIFx0XG4gPz48L2U+JykKKyAgICAgICAgcGkgPSBkb20uZG9jdW1lbnRFbGVtZW50LmZpcnN0Q2hpbGQKKyAgICAgICAgc2VsZi5jb25maXJtKHBpLnRhcmdldCA9PSAibXlwaSIKKyAgICAgICAgICAgICAgICBhbmQgcGkuZGF0YSA9PSAiZGF0YSBcdFxuICIKKyAgICAgICAgICAgICAgICBhbmQgcGkubm9kZU5hbWUgPT0gIm15cGkiCisgICAgICAgICAgICAgICAgYW5kIHBpLm5vZGVUeXBlID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFCisgICAgICAgICAgICAgICAgYW5kIHBpLmF0dHJpYnV0ZXMgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBub3QgcGkuaGFzQ2hpbGROb2RlcygpCisgICAgICAgICAgICAgICAgYW5kIGxlbihwaS5jaGlsZE5vZGVzKSA9PSAwCisgICAgICAgICAgICAgICAgYW5kIHBpLmZpcnN0Q2hpbGQgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBwaS5sYXN0Q2hpbGQgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBwaS5sb2NhbE5hbWUgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBwaS5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UpCisKKyAgICBkZWYgdGVzdFByb2Nlc3NpbmdJbnN0cnVjdGlvblJlcHIoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0VGV4dFJlcHIoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0V3JpdGVUZXh0KHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdERvY3VtZW50RWxlbWVudChzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RUb29NYW55RG9jdW1lbnRFbGVtZW50cyhzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCisgICAgICAgIGVsZW0gPSBkb2MuY3JlYXRlRWxlbWVudCgiZXh0cmEiKQorICAgICAgICAjIFNob3VsZCByYWlzZSBhbiBleGNlcHRpb24gd2hlbiBhZGRpbmcgYW4gZXh0cmEgZG9jdW1lbnQgZWxlbWVudC4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyLCBkb2MuYXBwZW5kQ2hpbGQsIGVsZW0pCisgICAgICAgIGVsZW0udW5saW5rKCkKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICBkZWYgdGVzdENyZWF0ZUVsZW1lbnROUyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RDcmVhdGVBdHRyaWJ1dGVOUyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RQYXJzZShzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RQYXJzZVN0cmluZyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RDb21tZW50KHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdEF0dHJMaXN0SXRlbShzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RBdHRyTGlzdEl0ZW1zKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdEF0dHJMaXN0SXRlbU5TKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdEF0dHJMaXN0S2V5cyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RBdHRyTGlzdEtleXNOUyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RSZW1vdmVOYW1lZEl0ZW0oc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jIGE9JycvPiIpCisgICAgICAgIGUgPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIGF0dHJzID0gZS5hdHRyaWJ1dGVzCisgICAgICAgIGExID0gZS5nZXRBdHRyaWJ1dGVOb2RlKCJhIikKKyAgICAgICAgYTIgPSBhdHRycy5yZW1vdmVOYW1lZEl0ZW0oImEiKQorICAgICAgICBzZWxmLmNvbmZpcm0oYTEuaXNTYW1lTm9kZShhMikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uTm90Rm91bmRFcnIsIGF0dHJzLnJlbW92ZU5hbWVkSXRlbSwgImEiKQorCisgICAgZGVmIHRlc3RSZW1vdmVOYW1lZEl0ZW1OUyhzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MgeG1sbnM6YT0naHR0cDovL3htbC5weXRob24ub3JnLycgYTpiPScnLz4iKQorICAgICAgICBlID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICBhdHRycyA9IGUuYXR0cmlidXRlcworICAgICAgICBhMSA9IGUuZ2V0QXR0cmlidXRlTm9kZU5TKCJodHRwOi8veG1sLnB5dGhvbi5vcmcvIiwgImIiKQorICAgICAgICBhMiA9IGF0dHJzLnJlbW92ZU5hbWVkSXRlbU5TKCJodHRwOi8veG1sLnB5dGhvbi5vcmcvIiwgImIiKQorICAgICAgICBzZWxmLmNvbmZpcm0oYTEuaXNTYW1lTm9kZShhMikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uTm90Rm91bmRFcnIsIGF0dHJzLnJlbW92ZU5hbWVkSXRlbU5TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5weXRob24ub3JnLyIsICJiIikKKworICAgIGRlZiB0ZXN0QXR0ckxpc3RWYWx1ZXMoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0QXR0ckxpc3RMZW5ndGgoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0QXR0ckxpc3RfX2dldGl0ZW1fXyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RBdHRyTGlzdF9fc2V0aXRlbV9fKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdFNldEF0dHJWYWx1ZWFuZE5vZGVWYWx1ZShzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RQYXJzZUVsZW1lbnQoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0UGFyc2VBdHRyaWJ1dGVzKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdFBhcnNlRWxlbWVudE5hbWVzcGFjZXMoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0UGFyc2VBdHRyaWJ1dGVOYW1lc3BhY2VzKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdFBhcnNlUHJvY2Vzc2luZ0luc3RydWN0aW9ucyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RDaGlsZE5vZGVzKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdEZpcnN0Q2hpbGQoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0SGFzQ2hpbGROb2RlcyhzZWxmKTogcGFzcworCisgICAgZGVmIF90ZXN0Q2xvbmVFbGVtZW50Q29waWVzQXR0cmlidXRlcyhzZWxmLCBlMSwgZTIsIHRlc3QpOgorICAgICAgICBhdHRyczEgPSBlMS5hdHRyaWJ1dGVzCisgICAgICAgIGF0dHJzMiA9IGUyLmF0dHJpYnV0ZXMKKyAgICAgICAga2V5czEgPSBhdHRyczEua2V5cygpCisgICAgICAgIGtleXMyID0gYXR0cnMyLmtleXMoKQorICAgICAgICBrZXlzMS5zb3J0KCkKKyAgICAgICAga2V5czIuc29ydCgpCisgICAgICAgIHNlbGYuY29uZmlybShrZXlzMSA9PSBrZXlzMiwgImNsb25lIG9mIGVsZW1lbnQgaGFzIHNhbWUgYXR0cmlidXRlIGtleXMiKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oa2V5czEpKToKKyAgICAgICAgICAgIGExID0gYXR0cnMxLml0ZW0oaSkKKyAgICAgICAgICAgIGEyID0gYXR0cnMyLml0ZW0oaSkKKyAgICAgICAgICAgIHNlbGYuY29uZmlybShhMSBpcyBub3QgYTIKKyAgICAgICAgICAgICAgICAgICAgYW5kIGExLnZhbHVlID09IGEyLnZhbHVlCisgICAgICAgICAgICAgICAgICAgIGFuZCBhMS5ub2RlVmFsdWUgPT0gYTIubm9kZVZhbHVlCisgICAgICAgICAgICAgICAgICAgIGFuZCBhMS5uYW1lc3BhY2VVUkkgPT0gYTIubmFtZXNwYWNlVVJJCisgICAgICAgICAgICAgICAgICAgIGFuZCBhMS5sb2NhbE5hbWUgPT0gYTIubG9jYWxOYW1lCisgICAgICAgICAgICAgICAgICAgICwgImNsb25lIG9mIGF0dHJpYnV0ZSBub2RlIGhhcyBwcm9wZXIgYXR0cmlidXRlIHZhbHVlcyIpCisgICAgICAgICAgICBzZWxmLmNvbmZpcm0oYTIub3duZXJFbGVtZW50IGlzIGUyLAorICAgICAgICAgICAgICAgICAgICAiY2xvbmUgb2YgYXR0cmlidXRlIG5vZGUgY29ycmVjdGx5IG93bmVkIikKKworICAgIGRlZiBfc2V0dXBDbG9uZUVsZW1lbnQoc2VsZiwgZGVlcCk6CisgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKCI8ZG9jIGF0dHI9J3ZhbHVlJz48Zm9vLz48L2RvYz4iKQorICAgICAgICByb290ID0gZG9tLmRvY3VtZW50RWxlbWVudAorICAgICAgICBjbG9uZSA9IHJvb3QuY2xvbmVOb2RlKGRlZXApCisgICAgICAgIHNlbGYuX3Rlc3RDbG9uZUVsZW1lbnRDb3BpZXNBdHRyaWJ1dGVzKAorICAgICAgICAgICAgcm9vdCwgY2xvbmUsICJ0ZXN0Q2xvbmVFbGVtZW50IiArIChkZWVwIGFuZCAiRGVlcCIgb3IgIlNoYWxsb3ciKSkKKyAgICAgICAgIyBtdXRpbGF0ZSB0aGUgb3JpZ2luYWwgc28gc2hhcmVkIGRhdGEgaXMgZGV0ZWN0ZWQKKyAgICAgICAgcm9vdC50YWdOYW1lID0gcm9vdC5ub2RlTmFtZSA9ICJNT0RJRklFRCIKKyAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoImF0dHIiLCAiTkVXIFZBTFVFIikKKyAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGUoImFkZGVkIiwgIlZBTFVFIikKKyAgICAgICAgcmV0dXJuIGRvbSwgY2xvbmUKKworICAgIGRlZiB0ZXN0Q2xvbmVFbGVtZW50U2hhbGxvdyhzZWxmKToKKyAgICAgICAgZG9tLCBjbG9uZSA9IHNlbGYuX3NldHVwQ2xvbmVFbGVtZW50KDApCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oY2xvbmUuY2hpbGROb2RlcykgPT0gMAorICAgICAgICAgICAgICAgIGFuZCBjbG9uZS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAwCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLnBhcmVudE5vZGUgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBjbG9uZS50b3htbCgpID09ICc8ZG9jIGF0dHI9InZhbHVlIi8+JworICAgICAgICAgICAgICAgICwgInRlc3RDbG9uZUVsZW1lbnRTaGFsbG93IikKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdENsb25lRWxlbWVudERlZXAoc2VsZik6CisgICAgICAgIGRvbSwgY2xvbmUgPSBzZWxmLl9zZXR1cENsb25lRWxlbWVudCgxKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNsb25lLmNoaWxkTm9kZXMpID09IDEKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMQorICAgICAgICAgICAgICAgIGFuZCBjbG9uZS5wYXJlbnROb2RlIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUudG94bWwoKSA9PSAnPGRvYyBhdHRyPSJ2YWx1ZSI+PGZvby8+PC9kb2M+JworICAgICAgICAgICAgICAgICwgInRlc3RDbG9uZUVsZW1lbnREZWVwIikKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdENsb25lRG9jdW1lbnRTaGFsbG93KHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPD94bWwgdmVyc2lvbj0nMS4wJz8+XG4iCisgICAgICAgICAgICAgICAgICAgICI8IS0tIGNvbW1lbnQgLS0+IgorICAgICAgICAgICAgICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCisgICAgICAgICAgICAgICAgICAgICI8IU5PVEFUSU9OIG5vdGF0aW9uIFNZU1RFTSAnaHR0cDovL3htbC5weXRob24ub3JnLyc+XG4iCisgICAgICAgICAgICAgICAgICAgICJdPlxuIgorICAgICAgICAgICAgICAgICAgICAiPGRvYyBhdHRyPSd2YWx1ZScvPiIpCisgICAgICAgIGRvYzIgPSBkb2MuY2xvbmVOb2RlKDApCisgICAgICAgIHNlbGYuY29uZmlybShkb2MyIGlzIE5vbmUsCisgICAgICAgICAgICAgICAgInRlc3RDbG9uZURvY3VtZW50U2hhbGxvdzoiCisgICAgICAgICAgICAgICAgIiBzaGFsbG93IGNsb25pbmcgb2YgZG9jdW1lbnRzIG1ha2VzIG5vIHNlbnNlISIpCisKKyAgICBkZWYgdGVzdENsb25lRG9jdW1lbnREZWVwKHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPD94bWwgdmVyc2lvbj0nMS4wJz8+XG4iCisgICAgICAgICAgICAgICAgICAgICI8IS0tIGNvbW1lbnQgLS0+IgorICAgICAgICAgICAgICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCisgICAgICAgICAgICAgICAgICAgICI8IU5PVEFUSU9OIG5vdGF0aW9uIFNZU1RFTSAnaHR0cDovL3htbC5weXRob24ub3JnLyc+XG4iCisgICAgICAgICAgICAgICAgICAgICJdPlxuIgorICAgICAgICAgICAgICAgICAgICAiPGRvYyBhdHRyPSd2YWx1ZScvPiIpCisgICAgICAgIGRvYzIgPSBkb2MuY2xvbmVOb2RlKDEpCisgICAgICAgIHNlbGYuY29uZmlybShub3QgKGRvYy5pc1NhbWVOb2RlKGRvYzIpIG9yIGRvYzIuaXNTYW1lTm9kZShkb2MpKSwKKyAgICAgICAgICAgICAgICAidGVzdENsb25lRG9jdW1lbnREZWVwOiBkb2N1bWVudCBvYmplY3RzIG5vdCBkaXN0aW5jdCIpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oZG9jLmNoaWxkTm9kZXMpID09IGxlbihkb2MyLmNoaWxkTm9kZXMpLAorICAgICAgICAgICAgICAgICJ0ZXN0Q2xvbmVEb2N1bWVudERlZXA6IHdyb25nIG51bWJlciBvZiBEb2N1bWVudCBjaGlsZHJlbiIpCisgICAgICAgIHNlbGYuY29uZmlybShkb2MyLmRvY3VtZW50RWxlbWVudC5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSwKKyAgICAgICAgICAgICAgICAidGVzdENsb25lRG9jdW1lbnREZWVwOiBkb2N1bWVudEVsZW1lbnQgbm90IGFuIEVMRU1FTlRfTk9ERSIpCisgICAgICAgIHNlbGYuY29uZmlybShkb2MyLmRvY3VtZW50RWxlbWVudC5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUoZG9jMiksCisgICAgICAgICAgICAidGVzdENsb25lRG9jdW1lbnREZWVwOiBkb2N1bWVudEVsZW1lbnQgb3duZXIgaXMgbm90IG5ldyBkb2N1bWVudCIpCisgICAgICAgIHNlbGYuY29uZmlybShub3QgZG9jLmRvY3VtZW50RWxlbWVudC5pc1NhbWVOb2RlKGRvYzIuZG9jdW1lbnRFbGVtZW50KSwKKyAgICAgICAgICAgICAgICAidGVzdENsb25lRG9jdW1lbnREZWVwOiBkb2N1bWVudEVsZW1lbnQgc2hvdWxkIG5vdCBiZSBzaGFyZWQiKQorICAgICAgICBpZiBkb2MuZG9jdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgY2hlY2sgdGhlIGRvY3R5cGUgaWZmIHRoZSBvcmlnaW5hbCBET00gbWFpbnRhaW5lZCBpdAorICAgICAgICAgICAgc2VsZi5jb25maXJtKGRvYzIuZG9jdHlwZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgInRlc3RDbG9uZURvY3VtZW50RGVlcDogZG9jdHlwZSBub3QgYSBET0NVTUVOVF9UWVBFX05PREUiKQorICAgICAgICAgICAgc2VsZi5jb25maXJtKGRvYzIuZG9jdHlwZS5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUoZG9jMikpCisgICAgICAgICAgICBzZWxmLmNvbmZpcm0obm90IGRvYy5kb2N0eXBlLmlzU2FtZU5vZGUoZG9jMi5kb2N0eXBlKSkKKworICAgIGRlZiB0ZXN0Q2xvbmVEb2N1bWVudFR5cGVEZWVwT2soc2VsZik6CisgICAgICAgIGRvY3R5cGUgPSBjcmVhdGVfbm9uZW1wdHlfZG9jdHlwZSgpCisgICAgICAgIGNsb25lID0gZG9jdHlwZS5jbG9uZU5vZGUoMSkKKyAgICAgICAgc2VsZi5jb25maXJtKGNsb25lIGlzIG5vdCBOb25lCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLm5vZGVOYW1lID09IGRvY3R5cGUubm9kZU5hbWUKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUubmFtZSA9PSBkb2N0eXBlLm5hbWUKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUucHVibGljSWQgPT0gZG9jdHlwZS5wdWJsaWNJZAorICAgICAgICAgICAgICAgIGFuZCBjbG9uZS5zeXN0ZW1JZCA9PSBkb2N0eXBlLnN5c3RlbUlkCisgICAgICAgICAgICAgICAgYW5kIGxlbihjbG9uZS5lbnRpdGllcykgPT0gbGVuKGRvY3R5cGUuZW50aXRpZXMpCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLmVudGl0aWVzLml0ZW0obGVuKGNsb25lLmVudGl0aWVzKSkgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBsZW4oY2xvbmUubm90YXRpb25zKSA9PSBsZW4oZG9jdHlwZS5ub3RhdGlvbnMpCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLm5vdGF0aW9ucy5pdGVtKGxlbihjbG9uZS5ub3RhdGlvbnMpKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGxlbihjbG9uZS5jaGlsZE5vZGVzKSA9PSAwKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZG9jdHlwZS5lbnRpdGllcykpOgorICAgICAgICAgICAgc2UgPSBkb2N0eXBlLmVudGl0aWVzLml0ZW0oaSkKKyAgICAgICAgICAgIGNlID0gY2xvbmUuZW50aXRpZXMuaXRlbShpKQorICAgICAgICAgICAgc2VsZi5jb25maXJtKChub3Qgc2UuaXNTYW1lTm9kZShjZSkpCisgICAgICAgICAgICAgICAgICAgIGFuZCAobm90IGNlLmlzU2FtZU5vZGUoc2UpKQorICAgICAgICAgICAgICAgICAgICBhbmQgY2Uubm9kZU5hbWUgPT0gc2Uubm9kZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgYW5kIGNlLm5vdGF0aW9uTmFtZSA9PSBzZS5ub3RhdGlvbk5hbWUKKyAgICAgICAgICAgICAgICAgICAgYW5kIGNlLnB1YmxpY0lkID09IHNlLnB1YmxpY0lkCisgICAgICAgICAgICAgICAgICAgIGFuZCBjZS5zeXN0ZW1JZCA9PSBzZS5zeXN0ZW1JZAorICAgICAgICAgICAgICAgICAgICBhbmQgY2UuZW5jb2RpbmcgPT0gc2UuZW5jb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgYW5kIGNlLmFjdHVhbEVuY29kaW5nID09IHNlLmFjdHVhbEVuY29kaW5nCisgICAgICAgICAgICAgICAgICAgIGFuZCBjZS52ZXJzaW9uID09IHNlLnZlcnNpb24pCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihkb2N0eXBlLm5vdGF0aW9ucykpOgorICAgICAgICAgICAgc24gPSBkb2N0eXBlLm5vdGF0aW9ucy5pdGVtKGkpCisgICAgICAgICAgICBjbiA9IGNsb25lLm5vdGF0aW9ucy5pdGVtKGkpCisgICAgICAgICAgICBzZWxmLmNvbmZpcm0oKG5vdCBzbi5pc1NhbWVOb2RlKGNuKSkKKyAgICAgICAgICAgICAgICAgICAgYW5kIChub3QgY24uaXNTYW1lTm9kZShzbikpCisgICAgICAgICAgICAgICAgICAgIGFuZCBjbi5ub2RlTmFtZSA9PSBzbi5ub2RlTmFtZQorICAgICAgICAgICAgICAgICAgICBhbmQgY24ucHVibGljSWQgPT0gc24ucHVibGljSWQKKyAgICAgICAgICAgICAgICAgICAgYW5kIGNuLnN5c3RlbUlkID09IHNuLnN5c3RlbUlkKQorCisgICAgZGVmIHRlc3RDbG9uZURvY3VtZW50VHlwZURlZXBOb3RPayhzZWxmKToKKyAgICAgICAgZG9jID0gY3JlYXRlX2RvY193aXRoX2RvY3R5cGUoKQorICAgICAgICBjbG9uZSA9IGRvYy5kb2N0eXBlLmNsb25lTm9kZSgxKQorICAgICAgICBzZWxmLmNvbmZpcm0oY2xvbmUgaXMgTm9uZSwgInRlc3RDbG9uZURvY3VtZW50VHlwZURlZXBOb3RPayIpCisKKyAgICBkZWYgdGVzdENsb25lRG9jdW1lbnRUeXBlU2hhbGxvd09rKHNlbGYpOgorICAgICAgICBkb2N0eXBlID0gY3JlYXRlX25vbmVtcHR5X2RvY3R5cGUoKQorICAgICAgICBjbG9uZSA9IGRvY3R5cGUuY2xvbmVOb2RlKDApCisgICAgICAgIHNlbGYuY29uZmlybShjbG9uZSBpcyBub3QgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBjbG9uZS5ub2RlTmFtZSA9PSBkb2N0eXBlLm5vZGVOYW1lCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLm5hbWUgPT0gZG9jdHlwZS5uYW1lCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLnB1YmxpY0lkID09IGRvY3R5cGUucHVibGljSWQKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUuc3lzdGVtSWQgPT0gZG9jdHlwZS5zeXN0ZW1JZAorICAgICAgICAgICAgICAgIGFuZCBsZW4oY2xvbmUuZW50aXRpZXMpID09IDAKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUuZW50aXRpZXMuaXRlbSgwKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGxlbihjbG9uZS5ub3RhdGlvbnMpID09IDAKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUubm90YXRpb25zLml0ZW0oMCkgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBsZW4oY2xvbmUuY2hpbGROb2RlcykgPT0gMCkKKworICAgIGRlZiB0ZXN0Q2xvbmVEb2N1bWVudFR5cGVTaGFsbG93Tm90T2soc2VsZik6CisgICAgICAgIGRvYyA9IGNyZWF0ZV9kb2Nfd2l0aF9kb2N0eXBlKCkKKyAgICAgICAgY2xvbmUgPSBkb2MuZG9jdHlwZS5jbG9uZU5vZGUoMCkKKyAgICAgICAgc2VsZi5jb25maXJtKGNsb25lIGlzIE5vbmUsICJ0ZXN0Q2xvbmVEb2N1bWVudFR5cGVTaGFsbG93Tm90T2siKQorCisgICAgZGVmIGNoZWNrX2ltcG9ydF9kb2N1bWVudChzZWxmLCBkZWVwLCB0ZXN0TmFtZSk6CisgICAgICAgIGRvYzEgPSBwYXJzZVN0cmluZygiPGRvYy8+IikKKyAgICAgICAgZG9jMiA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLk5vdFN1cHBvcnRlZEVyciwgZG9jMS5pbXBvcnROb2RlLCBkb2MyLCBkZWVwKQorCisgICAgZGVmIHRlc3RJbXBvcnREb2N1bWVudFNoYWxsb3coc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfaW1wb3J0X2RvY3VtZW50KDAsICJ0ZXN0SW1wb3J0RG9jdW1lbnRTaGFsbG93IikKKworICAgIGRlZiB0ZXN0SW1wb3J0RG9jdW1lbnREZWVwKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2ltcG9ydF9kb2N1bWVudCgxLCAidGVzdEltcG9ydERvY3VtZW50RGVlcCIpCisKKyAgICBkZWYgdGVzdEltcG9ydERvY3VtZW50VHlwZVNoYWxsb3coc2VsZik6CisgICAgICAgIHNyYyA9IGNyZWF0ZV9kb2Nfd2l0aF9kb2N0eXBlKCkKKyAgICAgICAgdGFyZ2V0ID0gY3JlYXRlX2RvY193aXRob3V0X2RvY3R5cGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLk5vdFN1cHBvcnRlZEVyciwgdGFyZ2V0LmltcG9ydE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy5kb2N0eXBlLCAwKQorCisgICAgZGVmIHRlc3RJbXBvcnREb2N1bWVudFR5cGVEZWVwKHNlbGYpOgorICAgICAgICBzcmMgPSBjcmVhdGVfZG9jX3dpdGhfZG9jdHlwZSgpCisgICAgICAgIHRhcmdldCA9IGNyZWF0ZV9kb2Nfd2l0aG91dF9kb2N0eXBlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIsIHRhcmdldC5pbXBvcnROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuZG9jdHlwZSwgMSkKKworICAgICMgVGVzdGluZyBhdHRyaWJ1dGUgY2xvbmVzIHVzZXMgYSBoZWxwZXIsIGFuZCBzaG91bGQgYWx3YXlzIGJlIGRlZXAsCisgICAgIyBldmVuIGlmIHRoZSBhcmd1bWVudCB0byBjbG9uZU5vZGUgaXMgZmFsc2UuCisgICAgZGVmIGNoZWNrX2Nsb25lX2F0dHJpYnV0ZShzZWxmLCBkZWVwLCB0ZXN0TmFtZSk6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jIGF0dHI9J3ZhbHVlJy8+IikKKyAgICAgICAgYXR0ciA9IGRvYy5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZSgiYXR0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYXR0ciwgTm9uZSkKKyAgICAgICAgY2xvbmUgPSBhdHRyLmNsb25lTm9kZShkZWVwKQorICAgICAgICBzZWxmLmNvbmZpcm0obm90IGNsb25lLmlzU2FtZU5vZGUoYXR0cikpCisgICAgICAgIHNlbGYuY29uZmlybShub3QgYXR0ci5pc1NhbWVOb2RlKGNsb25lKSkKKyAgICAgICAgc2VsZi5jb25maXJtKGNsb25lLm93bmVyRWxlbWVudCBpcyBOb25lLAorICAgICAgICAgICAgICAgIHRlc3ROYW1lICsgIjogb3duZXJFbGVtZW50IHNob3VsZCBiZSBOb25lIikKKyAgICAgICAgc2VsZi5jb25maXJtKGNsb25lLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShhdHRyLm93bmVyRG9jdW1lbnQpLAorICAgICAgICAgICAgICAgIHRlc3ROYW1lICsgIjogb3duZXJEb2N1bWVudCBkb2VzIG5vdCBtYXRjaCIpCisgICAgICAgIHNlbGYuY29uZmlybShjbG9uZS5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgdGVzdE5hbWUgKyAiOiBjbG9uZWQgYXR0cmlidXRlIG11c3QgaGF2ZSBzcGVjaWZpZWQgPT0gVHJ1ZSIpCisKKyAgICBkZWYgdGVzdENsb25lQXR0cmlidXRlU2hhbGxvdyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19jbG9uZV9hdHRyaWJ1dGUoMCwgInRlc3RDbG9uZUF0dHJpYnV0ZVNoYWxsb3ciKQorCisgICAgZGVmIHRlc3RDbG9uZUF0dHJpYnV0ZURlZXAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfY2xvbmVfYXR0cmlidXRlKDEsICJ0ZXN0Q2xvbmVBdHRyaWJ1dGVEZWVwIikKKworICAgIGRlZiBjaGVja19jbG9uZV9waShzZWxmLCBkZWVwLCB0ZXN0TmFtZSk6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8P3RhcmdldCBkYXRhPz48ZG9jLz4iKQorICAgICAgICBwaSA9IGRvYy5maXJzdENoaWxkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGkubm9kZVR5cGUsIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQorICAgICAgICBjbG9uZSA9IHBpLmNsb25lTm9kZShkZWVwKQorICAgICAgICBzZWxmLmNvbmZpcm0oY2xvbmUudGFyZ2V0ID09IHBpLnRhcmdldAorICAgICAgICAgICAgICAgIGFuZCBjbG9uZS5kYXRhID09IHBpLmRhdGEpCisKKyAgICBkZWYgdGVzdENsb25lUElTaGFsbG93KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Nsb25lX3BpKDAsICJ0ZXN0Q2xvbmVQSVNoYWxsb3ciKQorCisgICAgZGVmIHRlc3RDbG9uZVBJRGVlcChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19jbG9uZV9waSgxLCAidGVzdENsb25lUElEZWVwIikKKworICAgIGRlZiB0ZXN0Tm9ybWFsaXplKHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYy8+IikKKyAgICAgICAgcm9vdCA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoImZpcnN0IikpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJzZWNvbmQiKSkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihyb290LmNoaWxkTm9kZXMpID09IDIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAyLAorICAgICAgICAgICAgICAgICJ0ZXN0Tm9ybWFsaXplIC0tIHByZXBhcmF0aW9uIikKKyAgICAgICAgZG9jLm5vcm1hbGl6ZSgpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSAxCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMQorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQgaXMgcm9vdC5sYXN0Q2hpbGQKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkLmRhdGEgPT0gImZpcnN0c2Vjb25kIgorICAgICAgICAgICAgICAgICwgInRlc3ROb3JtYWxpemUgLS0gcmVzdWx0IikKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCisgICAgICAgIHJvb3QgPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCIiKSkKKyAgICAgICAgZG9jLm5vcm1hbGl6ZSgpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSAwCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMCwKKyAgICAgICAgICAgICAgICAidGVzdE5vcm1hbGl6ZSAtLSBzaW5nbGUgZW1wdHkgbm9kZSByZW1vdmVkIikKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICBkZWYgdGVzdE5vcm1hbGl6ZUNvbWJpbmVBbmROZXh0U2libGluZyhzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCisgICAgICAgIHJvb3QgPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJmaXJzdCIpKQorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgic2Vjb25kIikpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUVsZW1lbnQoImkiKSkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihyb290LmNoaWxkTm9kZXMpID09IDMKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAzLAorICAgICAgICAgICAgICAgICJ0ZXN0Tm9ybWFsaXplQ29tYmluZUFuZE5leHRTaWJsaW5nIC0tIHByZXBhcmF0aW9uIikKKyAgICAgICAgZG9jLm5vcm1hbGl6ZSgpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSAyCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMgorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQuZGF0YSA9PSAiZmlyc3RzZWNvbmQiCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZCBpcyBub3Qgcm9vdC5sYXN0Q2hpbGQKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkLm5leHRTaWJsaW5nIGlzIHJvb3QubGFzdENoaWxkCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZC5wcmV2aW91c1NpYmxpbmcgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCByb290Lmxhc3RDaGlsZC5wcmV2aW91c1NpYmxpbmcgaXMgcm9vdC5maXJzdENoaWxkCisgICAgICAgICAgICAgICAgYW5kIHJvb3QubGFzdENoaWxkLm5leHRTaWJsaW5nIGlzIE5vbmUKKyAgICAgICAgICAgICAgICAsICJ0ZXN0Tm9ybWFsaXplQ29tYmluZWRBbmROZXh0U2libGluZyAtLSByZXN1bHQiKQorICAgICAgICBkb2MudW5saW5rKCkKKworICAgIGRlZiB0ZXN0Tm9ybWFsaXplRGVsZXRlV2l0aFByZXZTaWJsaW5nKHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYy8+IikKKyAgICAgICAgcm9vdCA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoImZpcnN0IikpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCIiKSkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihyb290LmNoaWxkTm9kZXMpID09IDIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAyLAorICAgICAgICAgICAgICAgICJ0ZXN0Tm9ybWFsaXplRGVsZXRlV2l0aFByZXZTaWJsaW5nIC0tIHByZXBhcmF0aW9uIikKKyAgICAgICAgZG9jLm5vcm1hbGl6ZSgpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSAxCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMQorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQuZGF0YSA9PSAiZmlyc3QiCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZCBpcyByb290Lmxhc3RDaGlsZAorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQubmV4dFNpYmxpbmcgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQucHJldmlvdXNTaWJsaW5nIGlzIE5vbmUKKyAgICAgICAgICAgICAgICAsICJ0ZXN0Tm9ybWFsaXplRGVsZXRlV2l0aFByZXZTaWJsaW5nIC0tIHJlc3VsdCIpCisgICAgICAgIGRvYy51bmxpbmsoKQorCisgICAgZGVmIHRlc3ROb3JtYWxpemVEZWxldGVXaXRoTmV4dFNpYmxpbmcoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQorICAgICAgICByb290ID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiIikpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJzZWNvbmQiKSkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihyb290LmNoaWxkTm9kZXMpID09IDIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAyLAorICAgICAgICAgICAgICAgICJ0ZXN0Tm9ybWFsaXplRGVsZXRlV2l0aE5leHRTaWJsaW5nIC0tIHByZXBhcmF0aW9uIikKKyAgICAgICAgZG9jLm5vcm1hbGl6ZSgpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSAxCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMQorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQuZGF0YSA9PSAic2Vjb25kIgorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQgaXMgcm9vdC5sYXN0Q2hpbGQKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkLm5leHRTaWJsaW5nIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkLnByZXZpb3VzU2libGluZyBpcyBOb25lCisgICAgICAgICAgICAgICAgLCAidGVzdE5vcm1hbGl6ZURlbGV0ZVdpdGhOZXh0U2libGluZyAtLSByZXN1bHQiKQorICAgICAgICBkb2MudW5saW5rKCkKKworICAgIGRlZiB0ZXN0Tm9ybWFsaXplRGVsZXRlV2l0aFR3b05vblRleHRTaWJsaW5ncyhzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCisgICAgICAgIHJvb3QgPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUVsZW1lbnQoImkiKSkKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIiIpKQorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVFbGVtZW50KCJpIikpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSAzCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMywKKyAgICAgICAgICAgICAgICAidGVzdE5vcm1hbGl6ZURlbGV0ZVdpdGhUd29TaWJsaW5ncyAtLSBwcmVwYXJhdGlvbiIpCisgICAgICAgIGRvYy5ub3JtYWxpemUoKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gMgorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkIGlzIG5vdCByb290Lmxhc3RDaGlsZAorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQubmV4dFNpYmxpbmcgaXMgcm9vdC5sYXN0Q2hpbGQKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkLnByZXZpb3VzU2libGluZyBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIHJvb3QubGFzdENoaWxkLnByZXZpb3VzU2libGluZyBpcyByb290LmZpcnN0Q2hpbGQKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5sYXN0Q2hpbGQubmV4dFNpYmxpbmcgaXMgTm9uZQorICAgICAgICAgICAgICAgICwgInRlc3ROb3JtYWxpemVEZWxldGVXaXRoVHdvU2libGluZ3MgLS0gcmVzdWx0IikKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICBkZWYgdGVzdE5vcm1hbGl6ZURlbGV0ZUFuZENvbWJpbmUoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQorICAgICAgICByb290ID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiIikpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJzZWNvbmQiKSkKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIiIpKQorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiZm91cnRoIikpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCIiKSkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihyb290LmNoaWxkTm9kZXMpID09IDUKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCA9PSA1LAorICAgICAgICAgICAgICAgICJ0ZXN0Tm9ybWFsaXplRGVsZXRlQW5kQ29tYmluZSAtLSBwcmVwYXJhdGlvbiIpCisgICAgICAgIGRvYy5ub3JtYWxpemUoKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gMQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDEKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkIGlzIHJvb3QubGFzdENoaWxkCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZC5kYXRhID09ICJzZWNvbmRmb3VydGgiCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZC5wcmV2aW91c1NpYmxpbmcgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQubmV4dFNpYmxpbmcgaXMgTm9uZQorICAgICAgICAgICAgICAgICwgInRlc3ROb3JtYWxpemVEZWxldGVBbmRDb21iaW5lIC0tIHJlc3VsdCIpCisgICAgICAgIGRvYy51bmxpbmsoKQorCisgICAgZGVmIHRlc3ROb3JtYWxpemVSZWN1cnNpb24oc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPG8+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxpLz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvbz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxvPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8bz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0MiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3gyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9vPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0MyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN4MworICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L28+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvZG9jPiIpCisgICAgICAgIHJvb3QgPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIHJvb3QuY2hpbGROb2Rlc1swXS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIiIpKQorICAgICAgICByb290LmNoaWxkTm9kZXNbMF0uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJ4IikpCisgICAgICAgIHJvb3QuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgieDIiKSkKKyAgICAgICAgcm9vdC5jaGlsZE5vZGVzWzFdLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgieDMiKSkKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIiIpKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gMworICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDMKKyAgICAgICAgICAgICAgICBhbmQgbGVuKHJvb3QuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzKSA9PSA0CisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzLmxlbmd0aCA9PSA0CisgICAgICAgICAgICAgICAgYW5kIGxlbihyb290LmNoaWxkTm9kZXNbMV0uY2hpbGROb2RlcykgPT0gMworICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlcy5sZW5ndGggPT0gMworICAgICAgICAgICAgICAgIGFuZCBsZW4ocm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2RlcykgPT0gMgorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAyCisgICAgICAgICAgICAgICAgLCAidGVzdE5vcm1hbGl6ZTIgLS0gcHJlcGFyYXRpb24iKQorICAgICAgICBkb2Mubm9ybWFsaXplKCkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihyb290LmNoaWxkTm9kZXMpID09IDIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAyCisgICAgICAgICAgICAgICAgYW5kIGxlbihyb290LmNoaWxkTm9kZXNbMF0uY2hpbGROb2RlcykgPT0gMgorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGggPT0gMgorICAgICAgICAgICAgICAgIGFuZCBsZW4ocm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXMpID09IDIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXMubGVuZ3RoID09IDIKKyAgICAgICAgICAgICAgICBhbmQgbGVuKHJvb3QuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMpID09IDEKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGggPT0gMQorICAgICAgICAgICAgICAgICwgInRlc3ROb3JtYWxpemUyIC0tIGNoaWxkTm9kZXMgbGVuZ3RocyIpCisgICAgICAgIHNlbGYuY29uZmlybShyb290LmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXS5kYXRhID09ICJ0eCIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXS5kYXRhID09ICJ0MngyIgorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1sxXS5kYXRhID09ICJ0M3gzIgorICAgICAgICAgICAgICAgICwgInRlc3ROb3JtYWxpemUyIC0tIGpvaW5lZCB0ZXh0IGZpZWxkcyIpCisgICAgICAgIHNlbGYuY29uZmlybShyb290LmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXS5uZXh0U2libGluZyBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdLnByZXZpb3VzU2libGluZworICAgICAgICAgICAgICAgICAgICAgICAgaXMgcm9vdC5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0KKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0ucHJldmlvdXNTaWJsaW5nIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0ubmV4dFNpYmxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJvb3QuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzFdCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzFdLm5leHRTaWJsaW5nIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMV0ucHJldmlvdXNTaWJsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBpcyByb290LmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5wcmV2aW91c1NpYmxpbmcgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5uZXh0U2libGluZworICAgICAgICAgICAgICAgICAgICAgICAgaXMgcm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMV0KKyAgICAgICAgICAgICAgICAsICJ0ZXN0Tm9ybWFsaXplMiAtLSBzaWJsaW5nIHBvaW50ZXJzIikKKyAgICAgICAgZG9jLnVubGluaygpCisKKworICAgIGRlZiB0ZXN0QnVnMDc3Nzg4NChzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxvPnRleHQ8L28+IikKKyAgICAgICAgdGV4dCA9IGRvYy5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2Rlc1swXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQubm9kZVR5cGUsIE5vZGUuVEVYVF9OT0RFKQorICAgICAgICAjIFNob3VsZCBydW4gcXVpZXRseSwgZG9pbmcgbm90aGluZy4KKyAgICAgICAgdGV4dC5ub3JtYWxpemUoKQorICAgICAgICBkb2MudW5saW5rKCkKKworICAgIGRlZiB0ZXN0QnVnMTQzMzY5NChzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxvPjxpLz50PC9vPiIpCisgICAgICAgIG5vZGUgPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIG5vZGUuY2hpbGROb2Rlc1sxXS5ub2RlVmFsdWUgPSAiIgorICAgICAgICBub2RlLm5vcm1hbGl6ZSgpCisgICAgICAgIHNlbGYuY29uZmlybShub2RlLmNoaWxkTm9kZXNbLTFdLm5leHRTaWJsaW5nIGlzIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAiRmluYWwgY2hpbGQncyAubmV4dFNpYmxpbmcgc2hvdWxkIGJlIE5vbmUiKQorCisgICAgZGVmIHRlc3RTaWJsaW5ncyhzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2M+PD9waT8+dGV4dD88ZWxtLz48L2RvYz4iKQorICAgICAgICByb290ID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICAocGksIHRleHQsIGVsbSkgPSByb290LmNoaWxkTm9kZXMKKworICAgICAgICBzZWxmLmNvbmZpcm0ocGkubmV4dFNpYmxpbmcgaXMgdGV4dCBhbmQKKyAgICAgICAgICAgICAgICBwaS5wcmV2aW91c1NpYmxpbmcgaXMgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICB0ZXh0Lm5leHRTaWJsaW5nIGlzIGVsbSBhbmQKKyAgICAgICAgICAgICAgICB0ZXh0LnByZXZpb3VzU2libGluZyBpcyBwaSBhbmQKKyAgICAgICAgICAgICAgICBlbG0ubmV4dFNpYmxpbmcgaXMgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICBlbG0ucHJldmlvdXNTaWJsaW5nIGlzIHRleHQsICJ0ZXN0U2libGluZ3MiKQorCisgICAgICAgIGRvYy51bmxpbmsoKQorCisgICAgZGVmIHRlc3RQYXJlbnRzKHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygKKyAgICAgICAgICAgICI8ZG9jPjxlbG0xPjxlbG0yLz48ZWxtMj48ZWxtMy8+PC9lbG0yPjwvZWxtMT48L2RvYz4iKQorICAgICAgICByb290ID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICBlbG0xID0gcm9vdC5jaGlsZE5vZGVzWzBdCisgICAgICAgIChlbG0yYSwgZWxtMmIpID0gZWxtMS5jaGlsZE5vZGVzCisgICAgICAgIGVsbTMgPSBlbG0yYi5jaGlsZE5vZGVzWzBdCisKKyAgICAgICAgc2VsZi5jb25maXJtKHJvb3QucGFyZW50Tm9kZSBpcyBkb2MgYW5kCisgICAgICAgICAgICAgICAgZWxtMS5wYXJlbnROb2RlIGlzIHJvb3QgYW5kCisgICAgICAgICAgICAgICAgZWxtMmEucGFyZW50Tm9kZSBpcyBlbG0xIGFuZAorICAgICAgICAgICAgICAgIGVsbTJiLnBhcmVudE5vZGUgaXMgZWxtMSBhbmQKKyAgICAgICAgICAgICAgICBlbG0zLnBhcmVudE5vZGUgaXMgZWxtMmIsICJ0ZXN0UGFyZW50cyIpCisgICAgICAgIGRvYy51bmxpbmsoKQorCisgICAgZGVmIHRlc3ROb2RlTGlzdEl0ZW0oc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jPjxlLz48ZS8+PC9kb2M+IikKKyAgICAgICAgY2hpbGRyZW4gPSBkb2MuY2hpbGROb2RlcworICAgICAgICBkb2NlbGVtID0gY2hpbGRyZW5bMF0KKyAgICAgICAgc2VsZi5jb25maXJtKGNoaWxkcmVuWzBdIGlzIGNoaWxkcmVuLml0ZW0oMCkKKyAgICAgICAgICAgICAgICBhbmQgY2hpbGRyZW4uaXRlbSgxKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGRvY2VsZW0uY2hpbGROb2Rlcy5pdGVtKDApIGlzIGRvY2VsZW0uY2hpbGROb2Rlc1swXQorICAgICAgICAgICAgICAgIGFuZCBkb2NlbGVtLmNoaWxkTm9kZXMuaXRlbSgxKSBpcyBkb2NlbGVtLmNoaWxkTm9kZXNbMV0KKyAgICAgICAgICAgICAgICBhbmQgZG9jZWxlbS5jaGlsZE5vZGVzLml0ZW0oMCkuY2hpbGROb2Rlcy5pdGVtKDApIGlzIE5vbmUsCisgICAgICAgICAgICAgICAgInRlc3QgTm9kZUxpc3QuaXRlbSgpIikKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICBkZWYgdGVzdFNBWDJET00oc2VsZik6CisgICAgICAgIGZyb20geG1sLmRvbSBpbXBvcnQgcHVsbGRvbQorCisgICAgICAgIHNheDJkb20gPSBwdWxsZG9tLlNBWDJET00oKQorICAgICAgICBzYXgyZG9tLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBzYXgyZG9tLnN0YXJ0RWxlbWVudCgiZG9jIiwge30pCisgICAgICAgIHNheDJkb20uY2hhcmFjdGVycygidGV4dCIpCisgICAgICAgIHNheDJkb20uc3RhcnRFbGVtZW50KCJzdWJlbG0iLCB7fSkKKyAgICAgICAgc2F4MmRvbS5jaGFyYWN0ZXJzKCJ0ZXh0IikKKyAgICAgICAgc2F4MmRvbS5lbmRFbGVtZW50KCJzdWJlbG0iKQorICAgICAgICBzYXgyZG9tLmNoYXJhY3RlcnMoInRleHQiKQorICAgICAgICBzYXgyZG9tLmVuZEVsZW1lbnQoImRvYyIpCisgICAgICAgIHNheDJkb20uZW5kRG9jdW1lbnQoKQorCisgICAgICAgIGRvYyA9IHNheDJkb20uZG9jdW1lbnQKKyAgICAgICAgcm9vdCA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgKHRleHQxLCBlbG0xLCB0ZXh0MikgPSByb290LmNoaWxkTm9kZXMKKyAgICAgICAgdGV4dDMgPSBlbG0xLmNoaWxkTm9kZXNbMF0KKworICAgICAgICBzZWxmLmNvbmZpcm0odGV4dDEucHJldmlvdXNTaWJsaW5nIGlzIE5vbmUgYW5kCisgICAgICAgICAgICAgICAgdGV4dDEubmV4dFNpYmxpbmcgaXMgZWxtMSBhbmQKKyAgICAgICAgICAgICAgICBlbG0xLnByZXZpb3VzU2libGluZyBpcyB0ZXh0MSBhbmQKKyAgICAgICAgICAgICAgICBlbG0xLm5leHRTaWJsaW5nIGlzIHRleHQyIGFuZAorICAgICAgICAgICAgICAgIHRleHQyLnByZXZpb3VzU2libGluZyBpcyBlbG0xIGFuZAorICAgICAgICAgICAgICAgIHRleHQyLm5leHRTaWJsaW5nIGlzIE5vbmUgYW5kCisgICAgICAgICAgICAgICAgdGV4dDMucHJldmlvdXNTaWJsaW5nIGlzIE5vbmUgYW5kCisgICAgICAgICAgICAgICAgdGV4dDMubmV4dFNpYmxpbmcgaXMgTm9uZSwgInRlc3RTQVgyRE9NIC0gc2libGluZ3MiKQorCisgICAgICAgIHNlbGYuY29uZmlybShyb290LnBhcmVudE5vZGUgaXMgZG9jIGFuZAorICAgICAgICAgICAgICAgIHRleHQxLnBhcmVudE5vZGUgaXMgcm9vdCBhbmQKKyAgICAgICAgICAgICAgICBlbG0xLnBhcmVudE5vZGUgaXMgcm9vdCBhbmQKKyAgICAgICAgICAgICAgICB0ZXh0Mi5wYXJlbnROb2RlIGlzIHJvb3QgYW5kCisgICAgICAgICAgICAgICAgdGV4dDMucGFyZW50Tm9kZSBpcyBlbG0xLCAidGVzdFNBWDJET00gLSBwYXJlbnRzIikKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICBkZWYgdGVzdEVuY29kaW5ncyhzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoJzxmb28+JiN4MjBhYzs8L2Zvbz4nKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9jLnRveG1sKCkgPT0gdSc8P3htbCB2ZXJzaW9uPSIxLjAiID8+PGZvbz5cdTIwYWM8L2Zvbz4nCisgICAgICAgICAgICAgICAgYW5kIGRvYy50b3htbCgndXRmLTgnKSA9PQorICAgICAgICAgICAgICAgICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pjxmb28+XHhlMlx4ODJceGFjPC9mb28+JworICAgICAgICAgICAgICAgIGFuZCBkb2MudG94bWwoJ2lzby04ODU5LTE1JykgPT0KKyAgICAgICAgICAgICAgICAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMTUiPz48Zm9vPlx4YTQ8L2Zvbz4nLAorICAgICAgICAgICAgICAgICJ0ZXN0RW5jb2RpbmdzIC0gZW5jb2RpbmcgRVVSTyBTSUdOIikKKworICAgICAgICAjIFZlcmlmeSB0aGF0IGNoYXJhY3RlciBkZWNvZGluZyBlcnJvcnMgcmFpc2UgZXhjZXB0aW9ucyBpbnN0ZWFkCisgICAgICAgICMgb2YgY3Jhc2hpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBwYXJzZVN0cmluZywKKyAgICAgICAgICAgICAgICAnPGZyYW5ceGU3YWlzPkNvbW1lbnQgXHhlN2EgdmEgPyBUclx4ZThzIGJpZW4gPzwvZnJhblx4ZTdhaXM+JykKKworICAgICAgICBkb2MudW5saW5rKCkKKworICAgIGNsYXNzIFVzZXJEYXRhSGFuZGxlcjoKKyAgICAgICAgY2FsbGVkID0gMAorICAgICAgICBkZWYgaGFuZGxlKHNlbGYsIG9wZXJhdGlvbiwga2V5LCBkYXRhLCBzcmMsIGRzdCk6CisgICAgICAgICAgICBkc3Quc2V0VXNlckRhdGEoa2V5LCBkYXRhICsgMSwgc2VsZikKKyAgICAgICAgICAgIHNyYy5zZXRVc2VyRGF0YShrZXksIE5vbmUsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmNhbGxlZCA9IDEKKworICAgIGRlZiB0ZXN0VXNlckRhdGEoc2VsZik6CisgICAgICAgIGRvbSA9IERvY3VtZW50KCkKKyAgICAgICAgbiA9IGRvbS5jcmVhdGVFbGVtZW50KCdlJykKKyAgICAgICAgc2VsZi5jb25maXJtKG4uZ2V0VXNlckRhdGEoImZvbyIpIGlzIE5vbmUpCisgICAgICAgIG4uc2V0VXNlckRhdGEoImZvbyIsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuY29uZmlybShuLmdldFVzZXJEYXRhKCJmb28iKSBpcyBOb25lKQorICAgICAgICBuLnNldFVzZXJEYXRhKCJmb28iLCAxMiwgMTIpCisgICAgICAgIG4uc2V0VXNlckRhdGEoImJhciIsIDEzLCAxMykKKyAgICAgICAgc2VsZi5jb25maXJtKG4uZ2V0VXNlckRhdGEoImZvbyIpID09IDEyKQorICAgICAgICBzZWxmLmNvbmZpcm0obi5nZXRVc2VyRGF0YSgiYmFyIikgPT0gMTMpCisgICAgICAgIG4uc2V0VXNlckRhdGEoImZvbyIsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuY29uZmlybShuLmdldFVzZXJEYXRhKCJmb28iKSBpcyBOb25lKQorICAgICAgICBzZWxmLmNvbmZpcm0obi5nZXRVc2VyRGF0YSgiYmFyIikgPT0gMTMpCisKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuVXNlckRhdGFIYW5kbGVyKCkKKyAgICAgICAgbi5zZXRVc2VyRGF0YSgiYmFyIiwgMTIsIGhhbmRsZXIpCisgICAgICAgIGMgPSBuLmNsb25lTm9kZSgxKQorICAgICAgICBzZWxmLmNvbmZpcm0oaGFuZGxlci5jYWxsZWQKKyAgICAgICAgICAgICAgICBhbmQgbi5nZXRVc2VyRGF0YSgiYmFyIikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBjLmdldFVzZXJEYXRhKCJiYXIiKSA9PSAxMykKKyAgICAgICAgbi51bmxpbmsoKQorICAgICAgICBjLnVubGluaygpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIGNoZWNrUmVuYW1lTm9kZVNoYXJlZENvbnN0cmFpbnRzKHNlbGYsIGRvYywgbm9kZSk6CisgICAgICAgICMgTWFrZSBzdXJlIGlsbGVnYWwgTlMgdXNhZ2UgaXMgZGV0ZWN0ZWQ6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uTmFtZXNwYWNlRXJyLCBkb2MucmVuYW1lTm9kZSwgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ucyIsICJ4bWxuczpmb28iKQorICAgICAgICBkb2MyID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uV3JvbmdEb2N1bWVudEVyciwgZG9jMi5yZW5hbWVOb2RlLCBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImZvbyIpCisKKyAgICBkZWYgdGVzdFJlbmFtZUF0dHJpYnV0ZShzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MgYT0ndicvPiIpCisgICAgICAgIGVsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIGF0dHJtYXAgPSBlbGVtLmF0dHJpYnV0ZXMKKyAgICAgICAgYXR0ciA9IGVsZW0uYXR0cmlidXRlc1snYSddCisKKyAgICAgICAgIyBTaW1wbGUgcmVuYW1pbmcKKyAgICAgICAgYXR0ciA9IGRvYy5yZW5hbWVOb2RlKGF0dHIsIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiYiIpCisgICAgICAgIHNlbGYuY29uZmlybShhdHRyLm5hbWUgPT0gImIiCisgICAgICAgICAgICAgICAgYW5kIGF0dHIubm9kZU5hbWUgPT0gImIiCisgICAgICAgICAgICAgICAgYW5kIGF0dHIubG9jYWxOYW1lIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci5wcmVmaXggaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBhdHRyLnZhbHVlID09ICJ2IgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImEiKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiYiIpLmlzU2FtZU5vZGUoYXR0cikKKyAgICAgICAgICAgICAgICBhbmQgYXR0cm1hcFsiYiJdLmlzU2FtZU5vZGUoYXR0cikKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUoZG9jKQorICAgICAgICAgICAgICAgIGFuZCBhdHRyLm93bmVyRWxlbWVudC5pc1NhbWVOb2RlKGVsZW0pKQorCisgICAgICAgICMgUmVuYW1lIHRvIGhhdmUgYSBuYW1lc3BhY2UsIG5vIHByZWZpeAorICAgICAgICBhdHRyID0gZG9jLnJlbmFtZU5vZGUoYXR0ciwgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ucyIsICJjIikKKyAgICAgICAgc2VsZi5jb25maXJtKGF0dHIubmFtZSA9PSAiYyIKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci5ub2RlTmFtZSA9PSAiYyIKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci5sb2NhbE5hbWUgPT0gImMiCisgICAgICAgICAgICAgICAgYW5kIGF0dHIubmFtZXNwYWNlVVJJID09ICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMiCisgICAgICAgICAgICAgICAgYW5kIGF0dHIucHJlZml4IGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci52YWx1ZSA9PSAidiIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJhIikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImIiKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiYyIpLmlzU2FtZU5vZGUoYXR0cikKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlTlMoCisgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMiLCAiYyIpLmlzU2FtZU5vZGUoYXR0cikKKyAgICAgICAgICAgICAgICBhbmQgYXR0cm1hcFsiYyJdLmlzU2FtZU5vZGUoYXR0cikKKyAgICAgICAgICAgICAgICBhbmQgYXR0cm1hcFsoImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ucyIsICJjIildLmlzU2FtZU5vZGUoYXR0cikpCisKKyAgICAgICAgIyBSZW5hbWUgdG8gaGF2ZSBhIG5hbWVzcGFjZSwgd2l0aCBwcmVmaXgKKyAgICAgICAgYXR0ciA9IGRvYy5yZW5hbWVOb2RlKGF0dHIsICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMyIiwgInA6ZCIpCisgICAgICAgIHNlbGYuY29uZmlybShhdHRyLm5hbWUgPT0gInA6ZCIKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci5ub2RlTmFtZSA9PSAicDpkIgorICAgICAgICAgICAgICAgIGFuZCBhdHRyLmxvY2FsTmFtZSA9PSAiZCIKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci5uYW1lc3BhY2VVUkkgPT0gImh0dHA6Ly94bWwucHl0aG9uLm9yZy9uczIiCisgICAgICAgICAgICAgICAgYW5kIGF0dHIucHJlZml4ID09ICJwIgorICAgICAgICAgICAgICAgIGFuZCBhdHRyLnZhbHVlID09ICJ2IgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImEiKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiYiIpIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJjIikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGVOUygKKyAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ucyIsICJjIikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoInA6ZCIpLmlzU2FtZU5vZGUoYXR0cikKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlTlMoCisgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMyIiwgImQiKS5pc1NhbWVOb2RlKGF0dHIpCisgICAgICAgICAgICAgICAgYW5kIGF0dHJtYXBbInA6ZCJdLmlzU2FtZU5vZGUoYXR0cikKKyAgICAgICAgICAgICAgICBhbmQgYXR0cm1hcFsoImh0dHA6Ly94bWwucHl0aG9uLm9yZy9uczIiLCAiZCIpXS5pc1NhbWVOb2RlKGF0dHIpKQorCisgICAgICAgICMgUmVuYW1lIGJhY2sgdG8gYSBzaW1wbGUgbm9uLU5TIG5vZGUKKyAgICAgICAgYXR0ciA9IGRvYy5yZW5hbWVOb2RlKGF0dHIsIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZSIpCisgICAgICAgIHNlbGYuY29uZmlybShhdHRyLm5hbWUgPT0gImUiCisgICAgICAgICAgICAgICAgYW5kIGF0dHIubm9kZU5hbWUgPT0gImUiCisgICAgICAgICAgICAgICAgYW5kIGF0dHIubG9jYWxOYW1lIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci5wcmVmaXggaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBhdHRyLnZhbHVlID09ICJ2IgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImEiKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiYiIpIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJjIikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoInA6ZCIpIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlTlMoCisgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMiLCAiYyIpIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJlIikuaXNTYW1lTm9kZShhdHRyKQorICAgICAgICAgICAgICAgIGFuZCBhdHRybWFwWyJlIl0uaXNTYW1lTm9kZShhdHRyKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLk5hbWVzcGFjZUVyciwgZG9jLnJlbmFtZU5vZGUsIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMiLCAieG1sbnMiKQorICAgICAgICBzZWxmLmNoZWNrUmVuYW1lTm9kZVNoYXJlZENvbnN0cmFpbnRzKGRvYywgYXR0cikKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICBkZWYgdGVzdFJlbmFtZUVsZW1lbnQoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQorICAgICAgICBlbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudAorCisgICAgICAgICMgU2ltcGxlIHJlbmFtaW5nCisgICAgICAgIGVsZW0gPSBkb2MucmVuYW1lTm9kZShlbGVtLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImEiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZWxlbS50YWdOYW1lID09ICJhIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLm5vZGVOYW1lID09ICJhIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmxvY2FsTmFtZSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ubmFtZXNwYWNlVVJJID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ucHJlZml4IGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUoZG9jKSkKKworICAgICAgICAjIFJlbmFtZSB0byBoYXZlIGEgbmFtZXNwYWNlLCBubyBwcmVmaXgKKyAgICAgICAgZWxlbSA9IGRvYy5yZW5hbWVOb2RlKGVsZW0sICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMiLCAiYiIpCisgICAgICAgIHNlbGYuY29uZmlybShlbGVtLnRhZ05hbWUgPT0gImIiCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ubm9kZU5hbWUgPT0gImIiCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ubG9jYWxOYW1lID09ICJiIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLm5hbWVzcGFjZVVSSSA9PSAiaHR0cDovL3htbC5weXRob24ub3JnL25zIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLnByZWZpeCBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKGRvYykpCisKKyAgICAgICAgIyBSZW5hbWUgdG8gaGF2ZSBhIG5hbWVzcGFjZSwgd2l0aCBwcmVmaXgKKyAgICAgICAgZWxlbSA9IGRvYy5yZW5hbWVOb2RlKGVsZW0sICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMyIiwgInA6YyIpCisgICAgICAgIHNlbGYuY29uZmlybShlbGVtLnRhZ05hbWUgPT0gInA6YyIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5ub2RlTmFtZSA9PSAicDpjIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmxvY2FsTmFtZSA9PSAiYyIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5uYW1lc3BhY2VVUkkgPT0gImh0dHA6Ly94bWwucHl0aG9uLm9yZy9uczIiCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ucHJlZml4ID09ICJwIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShkb2MpKQorCisgICAgICAgICMgUmVuYW1lIGJhY2sgdG8gYSBzaW1wbGUgbm9uLU5TIG5vZGUKKyAgICAgICAgZWxlbSA9IGRvYy5yZW5hbWVOb2RlKGVsZW0sIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZCIpCisgICAgICAgIHNlbGYuY29uZmlybShlbGVtLnRhZ05hbWUgPT0gImQiCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ubm9kZU5hbWUgPT0gImQiCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ubG9jYWxOYW1lIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5wcmVmaXggaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBlbGVtLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShkb2MpKQorCisgICAgICAgIHNlbGYuY2hlY2tSZW5hbWVOb2RlU2hhcmVkQ29uc3RyYWludHMoZG9jLCBlbGVtKQorICAgICAgICBkb2MudW5saW5rKCkKKworICAgIGRlZiB0ZXN0UmVuYW1lT3RoZXIoc2VsZik6CisgICAgICAgICMgV2UgaGF2ZSB0byBjcmVhdGUgYSBjb21tZW50IG5vZGUgZXhwbGljaXRseSBzaW5jZSBub3QgYWxsIERPTQorICAgICAgICAjIGJ1aWxkZXJzIHVzZWQgd2l0aCBtaW5pZG9tIGFkZCBjb21tZW50cyB0byB0aGUgRE9NLgorICAgICAgICBkb2MgPSB4bWwuZG9tLm1pbmlkb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudCgKKyAgICAgICAgICAgIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZSIsIE5vbmUpCisgICAgICAgIG5vZGUgPSBkb2MuY3JlYXRlQ29tbWVudCgiY29tbWVudCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uTm90U3VwcG9ydGVkRXJyLCBkb2MucmVuYW1lTm9kZSwgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJmb28iKQorICAgICAgICBkb2MudW5saW5rKCkKKworICAgIGRlZiB0ZXN0V2hvbGVUZXh0KHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYz5hPC9kb2M+IikKKyAgICAgICAgZWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgdGV4dCA9IGVsZW0uY2hpbGROb2Rlc1swXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQubm9kZVR5cGUsIE5vZGUuVEVYVF9OT0RFKQorCisgICAgICAgIHNlbGYuY2hlY2tXaG9sZVRleHQodGV4dCwgImEiKQorICAgICAgICBlbGVtLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiYiIpKQorICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQsICJhYiIpCisgICAgICAgIGVsZW0uaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVDREFUQVNlY3Rpb24oImMiKSwgdGV4dCkKKyAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0LCAiY2FiIikKKworICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBkb24ndCBjcm9zcyBvdGhlciBub2RlcworICAgICAgICBzcGxpdHRlciA9IGRvYy5jcmVhdGVDb21tZW50KCJjb21tZW50IikKKyAgICAgICAgZWxlbS5hcHBlbmRDaGlsZChzcGxpdHRlcikKKyAgICAgICAgdGV4dDIgPSBkb2MuY3JlYXRlVGV4dE5vZGUoImQiKQorICAgICAgICBlbGVtLmFwcGVuZENoaWxkKHRleHQyKQorICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQsICJjYWIiKQorICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQyLCAiZCIpCisKKyAgICAgICAgeCA9IGRvYy5jcmVhdGVFbGVtZW50KCJ4IikKKyAgICAgICAgZWxlbS5yZXBsYWNlQ2hpbGQoeCwgc3BsaXR0ZXIpCisgICAgICAgIHNwbGl0dGVyID0geAorICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQsICJjYWIiKQorICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQyLCAiZCIpCisKKyAgICAgICAgeCA9IGRvYy5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oInkiLCAieiIpCisgICAgICAgIGVsZW0ucmVwbGFjZUNoaWxkKHgsIHNwbGl0dGVyKQorICAgICAgICBzcGxpdHRlciA9IHgKKyAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0LCAiY2FiIikKKyAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0MiwgImQiKQorCisgICAgICAgIGVsZW0ucmVtb3ZlQ2hpbGQoc3BsaXR0ZXIpCisgICAgICAgIHNlbGYuY2hlY2tXaG9sZVRleHQodGV4dCwgImNhYmQiKQorICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQyLCAiY2FiZCIpCisKKyAgICBkZWYgdGVzdFBhdGNoMTA5NDE2NChzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2M+PGUvPjwvZG9jPiIpCisgICAgICAgIGVsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIGUgPSBlbGVtLmZpcnN0Q2hpbGQKKyAgICAgICAgc2VsZi5jb25maXJtKGUucGFyZW50Tm9kZSBpcyBlbGVtLCAiQmVmb3JlIHJlcGxhY2VDaGlsZCgpIikKKyAgICAgICAgIyBDaGVjayB0aGF0IHJlcGxhY2luZyBhIGNoaWxkIHdpdGggaXRzZWxmIGxlYXZlcyB0aGUgdHJlZSB1bmNoYW5nZWQKKyAgICAgICAgZWxlbS5yZXBsYWNlQ2hpbGQoZSwgZSkKKyAgICAgICAgc2VsZi5jb25maXJtKGUucGFyZW50Tm9kZSBpcyBlbGVtLCAiQWZ0ZXIgcmVwbGFjZUNoaWxkKCkiKQorCisgICAgZGVmIHRlc3RSZXBsYWNlV2hvbGVUZXh0KHNlbGYpOgorICAgICAgICBkZWYgc2V0dXAoKToKKyAgICAgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jPmE8ZS8+ZDwvZG9jPiIpCisgICAgICAgICAgICBlbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICAgICAgdGV4dDEgPSBlbGVtLmZpcnN0Q2hpbGQKKyAgICAgICAgICAgIHRleHQyID0gZWxlbS5sYXN0Q2hpbGQKKyAgICAgICAgICAgIHNwbGl0dGVyID0gdGV4dDEubmV4dFNpYmxpbmcKKyAgICAgICAgICAgIGVsZW0uaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVUZXh0Tm9kZSgiYiIpLCBzcGxpdHRlcikKKyAgICAgICAgICAgIGVsZW0uaW5zZXJ0QmVmb3JlKGRvYy5jcmVhdGVDREFUQVNlY3Rpb24oImMiKSwgdGV4dDEpCisgICAgICAgICAgICByZXR1cm4gZG9jLCBlbGVtLCB0ZXh0MSwgc3BsaXR0ZXIsIHRleHQyCisKKyAgICAgICAgZG9jLCBlbGVtLCB0ZXh0MSwgc3BsaXR0ZXIsIHRleHQyID0gc2V0dXAoKQorICAgICAgICB0ZXh0ID0gdGV4dDEucmVwbGFjZVdob2xlVGV4dCgibmV3IGNvbnRlbnQiKQorICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQsICJuZXcgY29udGVudCIpCisgICAgICAgIHNlbGYuY2hlY2tXaG9sZVRleHQodGV4dDIsICJkIikKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihlbGVtLmNoaWxkTm9kZXMpID09IDMpCisKKyAgICAgICAgZG9jLCBlbGVtLCB0ZXh0MSwgc3BsaXR0ZXIsIHRleHQyID0gc2V0dXAoKQorICAgICAgICB0ZXh0ID0gdGV4dDIucmVwbGFjZVdob2xlVGV4dCgibmV3IGNvbnRlbnQiKQorICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQsICJuZXcgY29udGVudCIpCisgICAgICAgIHNlbGYuY2hlY2tXaG9sZVRleHQodGV4dDEsICJjYWIiKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGVsZW0uY2hpbGROb2RlcykgPT0gNSkKKworICAgICAgICBkb2MsIGVsZW0sIHRleHQxLCBzcGxpdHRlciwgdGV4dDIgPSBzZXR1cCgpCisgICAgICAgIHRleHQgPSB0ZXh0MS5yZXBsYWNlV2hvbGVUZXh0KCIiKQorICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQyLCAiZCIpCisgICAgICAgIHNlbGYuY29uZmlybSh0ZXh0IGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgbGVuKGVsZW0uY2hpbGROb2RlcykgPT0gMikKKworICAgIGRlZiB0ZXN0U2NoZW1hVHlwZShzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoCisgICAgICAgICAgICAiPCFET0NUWVBFIGRvYyBbXG4iCisgICAgICAgICAgICAiICA8IUVOVElUWSBlMSBTWVNURU0gJ2h0dHA6Ly94bWwucHl0aG9uLm9yZy9lMSc+XG4iCisgICAgICAgICAgICAiICA8IUVOVElUWSBlMiBTWVNURU0gJ2h0dHA6Ly94bWwucHl0aG9uLm9yZy9lMic+XG4iCisgICAgICAgICAgICAiICA8IUFUVExJU1QgZG9jIGlkICAgSUQgICAgICAgI0lNUExJRUQgXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgIHJlZiAgSURSRUYgICAgI0lNUExJRUQgXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgIHJlZnMgSURSRUZTICAgI0lNUExJRUQgXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgIGVudW0gKGF8YikgICAgI0lNUExJRUQgXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgIGVudCAgRU5USVRZICAgI0lNUExJRUQgXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgIGVudHMgRU5USVRJRVMgI0lNUExJRUQgXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgIG5tICAgTk1UT0tFTiAgI0lNUExJRUQgXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgIG5tcyAgTk1UT0tFTlMgI0lNUExJRUQgXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgIHRleHQgQ0RBVEEgICAgI0lNUExJRUQgXG4iCisgICAgICAgICAgICAiICAgID5cbiIKKyAgICAgICAgICAgICJdPjxkb2MgaWQ9J25hbWUnIG5vdGlkPSduYW1lJyB0ZXh0PSdzcGxhdCEnIGVudW09J2InIgorICAgICAgICAgICAgIiAgICAgICByZWY9J25hbWUnIHJlZnM9J25hbWUgbmFtZScgZW50PSdlMScgZW50cz0nZTEgZTInIgorICAgICAgICAgICAgIiAgICAgICBubT0nMTIzJyBubXM9JzEyMyBhYmMnIC8+IikKKyAgICAgICAgZWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgIyBXZSBkb24ndCB3YW50IHRvIHJlbHkgb24gYW55IHNwZWNpZmljIGxvYWRlciBhdCB0aGlzIHBvaW50LCBzbworICAgICAgICAjIGp1c3QgbWFrZSBzdXJlIHdlIGNhbiBnZXQgdG8gYWxsIHRoZSBuYW1lcywgYW5kIHRoYXQgdGhlCisgICAgICAgICMgRFRELWJhc2VkIG5hbWVzcGFjZSBpcyByaWdodC4gIFRoZSBuYW1lcyBjYW4gdmFyeSBieSBsb2FkZXIKKyAgICAgICAgIyBzaW5jZSBlYWNoIHN1cHBvcnRzIGEgZGlmZmVyZW50IGxldmVsIG9mIERURCBpbmZvcm1hdGlvbi4KKyAgICAgICAgdCA9IGVsZW0uc2NoZW1hVHlwZQorICAgICAgICBzZWxmLmNvbmZpcm0odC5uYW1lIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgdC5uYW1lc3BhY2UgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UpCisgICAgICAgIG5hbWVzID0gImlkIG5vdGlkIHRleHQgZW51bSByZWYgcmVmcyBlbnQgZW50cyBubSBubXMiLnNwbGl0KCkKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBhID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpCisgICAgICAgICAgICB0ID0gYS5zY2hlbWFUeXBlCisgICAgICAgICAgICBzZWxmLmNvbmZpcm0oaGFzYXR0cih0LCAibmFtZSIpCisgICAgICAgICAgICAgICAgICAgIGFuZCB0Lm5hbWVzcGFjZSA9PSB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSkKKworICAgIGRlZiB0ZXN0U2V0SWRBdHRyaWJ1dGUoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jIGExPSd2JyBhMj0ndycvPiIpCisgICAgICAgIGUgPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIGExID0gZS5nZXRBdHRyaWJ1dGVOb2RlKCJhMSIpCisgICAgICAgIGEyID0gZS5nZXRBdHRyaWJ1dGVOb2RlKCJhMiIpCisgICAgICAgIHNlbGYuY29uZmlybShkb2MuZ2V0RWxlbWVudEJ5SWQoInYiKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIG5vdCBhMS5pc0lkCisgICAgICAgICAgICAgICAgYW5kIG5vdCBhMi5pc0lkKQorICAgICAgICBlLnNldElkQXR0cmlidXRlKCJhMSIpCisgICAgICAgIHNlbGYuY29uZmlybShlLmlzU2FtZU5vZGUoZG9jLmdldEVsZW1lbnRCeUlkKCJ2IikpCisgICAgICAgICAgICAgICAgYW5kIGExLmlzSWQKKyAgICAgICAgICAgICAgICBhbmQgbm90IGEyLmlzSWQpCisgICAgICAgIGUuc2V0SWRBdHRyaWJ1dGUoImEyIikKKyAgICAgICAgc2VsZi5jb25maXJtKGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInYiKSkKKyAgICAgICAgICAgICAgICBhbmQgZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidyIpKQorICAgICAgICAgICAgICAgIGFuZCBhMS5pc0lkCisgICAgICAgICAgICAgICAgYW5kIGEyLmlzSWQpCisgICAgICAgICMgcmVwbGFjZSB0aGUgYTEgbm9kZTsgdGhlIG5ldyBub2RlIHNob3VsZCAqbm90KiBiZSBhbiBJRAorICAgICAgICBhMyA9IGRvYy5jcmVhdGVBdHRyaWJ1dGUoImExIikKKyAgICAgICAgYTMudmFsdWUgPSAidiIKKyAgICAgICAgZS5zZXRBdHRyaWJ1dGVOb2RlKGEzKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9jLmdldEVsZW1lbnRCeUlkKCJ2IikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBlLmlzU2FtZU5vZGUoZG9jLmdldEVsZW1lbnRCeUlkKCJ3IikpCisgICAgICAgICAgICAgICAgYW5kIG5vdCBhMS5pc0lkCisgICAgICAgICAgICAgICAgYW5kIGEyLmlzSWQKKyAgICAgICAgICAgICAgICBhbmQgbm90IGEzLmlzSWQpCisgICAgICAgICMgcmVuYW1pbmcgYW4gYXR0cmlidXRlIHNob3VsZCBub3QgYWZmZWN0IGl0cyBJRC1uZXNzOgorICAgICAgICBkb2MucmVuYW1lTm9kZShhMiwgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhbiIpCisgICAgICAgIHNlbGYuY29uZmlybShlLmlzU2FtZU5vZGUoZG9jLmdldEVsZW1lbnRCeUlkKCJ3IikpCisgICAgICAgICAgICAgICAgYW5kIGEyLmlzSWQpCisKKyAgICBkZWYgdGVzdFNldElkQXR0cmlidXRlTlMoc2VsZik6CisgICAgICAgIE5TMSA9ICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMxIgorICAgICAgICBOUzIgPSAiaHR0cDovL3htbC5weXRob24ub3JnL25zMiIKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgeG1sbnM6bnMxPSciICsgTlMxICsgIiciCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgeG1sbnM6bnMyPSciICsgTlMyICsgIiciCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgbnMxOmExPSd2JyBuczI6YTI9J3cnLz4iKQorICAgICAgICBlID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICBhMSA9IGUuZ2V0QXR0cmlidXRlTm9kZU5TKE5TMSwgImExIikKKyAgICAgICAgYTIgPSBlLmdldEF0dHJpYnV0ZU5vZGVOUyhOUzIsICJhMiIpCisgICAgICAgIHNlbGYuY29uZmlybShkb2MuZ2V0RWxlbWVudEJ5SWQoInYiKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIG5vdCBhMS5pc0lkCisgICAgICAgICAgICAgICAgYW5kIG5vdCBhMi5pc0lkKQorICAgICAgICBlLnNldElkQXR0cmlidXRlTlMoTlMxLCAiYTEiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidiIpKQorICAgICAgICAgICAgICAgIGFuZCBhMS5pc0lkCisgICAgICAgICAgICAgICAgYW5kIG5vdCBhMi5pc0lkKQorICAgICAgICBlLnNldElkQXR0cmlidXRlTlMoTlMyLCAiYTIiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidiIpKQorICAgICAgICAgICAgICAgIGFuZCBlLmlzU2FtZU5vZGUoZG9jLmdldEVsZW1lbnRCeUlkKCJ3IikpCisgICAgICAgICAgICAgICAgYW5kIGExLmlzSWQKKyAgICAgICAgICAgICAgICBhbmQgYTIuaXNJZCkKKyAgICAgICAgIyByZXBsYWNlIHRoZSBhMSBub2RlOyB0aGUgbmV3IG5vZGUgc2hvdWxkICpub3QqIGJlIGFuIElECisgICAgICAgIGEzID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZU5TKE5TMSwgImExIikKKyAgICAgICAgYTMudmFsdWUgPSAidiIKKyAgICAgICAgZS5zZXRBdHRyaWJ1dGVOb2RlKGEzKQorICAgICAgICBzZWxmLmNvbmZpcm0oZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidyIpKSkKKyAgICAgICAgc2VsZi5jb25maXJtKG5vdCBhMS5pc0lkKQorICAgICAgICBzZWxmLmNvbmZpcm0oYTIuaXNJZCkKKyAgICAgICAgc2VsZi5jb25maXJtKG5vdCBhMy5pc0lkKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9jLmdldEVsZW1lbnRCeUlkKCJ2IikgaXMgTm9uZSkKKyAgICAgICAgIyByZW5hbWluZyBhbiBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBhZmZlY3QgaXRzIElELW5lc3M6CisgICAgICAgIGRvYy5yZW5hbWVOb2RlKGEyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImFuIikKKyAgICAgICAgc2VsZi5jb25maXJtKGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInciKSkKKyAgICAgICAgICAgICAgICBhbmQgYTIuaXNJZCkKKworICAgIGRlZiB0ZXN0U2V0SWRBdHRyaWJ1dGVOb2RlKHNlbGYpOgorICAgICAgICBOUzEgPSAiaHR0cDovL3htbC5weXRob24ub3JnL25zMSIKKyAgICAgICAgTlMyID0gImh0dHA6Ly94bWwucHl0aG9uLm9yZy9uczIiCisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIHhtbG5zOm5zMT0nIiArIE5TMSArICInIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIHhtbG5zOm5zMj0nIiArIE5TMiArICInIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5zMTphMT0ndicgbnMyOmEyPSd3Jy8+IikKKyAgICAgICAgZSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgYTEgPSBlLmdldEF0dHJpYnV0ZU5vZGVOUyhOUzEsICJhMSIpCisgICAgICAgIGEyID0gZS5nZXRBdHRyaWJ1dGVOb2RlTlMoTlMyLCAiYTIiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9jLmdldEVsZW1lbnRCeUlkKCJ2IikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBub3QgYTEuaXNJZAorICAgICAgICAgICAgICAgIGFuZCBub3QgYTIuaXNJZCkKKyAgICAgICAgZS5zZXRJZEF0dHJpYnV0ZU5vZGUoYTEpCisgICAgICAgIHNlbGYuY29uZmlybShlLmlzU2FtZU5vZGUoZG9jLmdldEVsZW1lbnRCeUlkKCJ2IikpCisgICAgICAgICAgICAgICAgYW5kIGExLmlzSWQKKyAgICAgICAgICAgICAgICBhbmQgbm90IGEyLmlzSWQpCisgICAgICAgIGUuc2V0SWRBdHRyaWJ1dGVOb2RlKGEyKQorICAgICAgICBzZWxmLmNvbmZpcm0oZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidiIpKQorICAgICAgICAgICAgICAgIGFuZCBlLmlzU2FtZU5vZGUoZG9jLmdldEVsZW1lbnRCeUlkKCJ3IikpCisgICAgICAgICAgICAgICAgYW5kIGExLmlzSWQKKyAgICAgICAgICAgICAgICBhbmQgYTIuaXNJZCkKKyAgICAgICAgIyByZXBsYWNlIHRoZSBhMSBub2RlOyB0aGUgbmV3IG5vZGUgc2hvdWxkICpub3QqIGJlIGFuIElECisgICAgICAgIGEzID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZU5TKE5TMSwgImExIikKKyAgICAgICAgYTMudmFsdWUgPSAidiIKKyAgICAgICAgZS5zZXRBdHRyaWJ1dGVOb2RlKGEzKQorICAgICAgICBzZWxmLmNvbmZpcm0oZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidyIpKSkKKyAgICAgICAgc2VsZi5jb25maXJtKG5vdCBhMS5pc0lkKQorICAgICAgICBzZWxmLmNvbmZpcm0oYTIuaXNJZCkKKyAgICAgICAgc2VsZi5jb25maXJtKG5vdCBhMy5pc0lkKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9jLmdldEVsZW1lbnRCeUlkKCJ2IikgaXMgTm9uZSkKKyAgICAgICAgIyByZW5hbWluZyBhbiBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBhZmZlY3QgaXRzIElELW5lc3M6CisgICAgICAgIGRvYy5yZW5hbWVOb2RlKGEyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImFuIikKKyAgICAgICAgc2VsZi5jb25maXJtKGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInciKSkKKyAgICAgICAgICAgICAgICBhbmQgYTIuaXNJZCkKKworICAgIGRlZiB0ZXN0UGlja2xlZERvY3VtZW50KHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0ndXMtYXNjaWknPz5cbiIKKyAgICAgICAgICAgICAgICAgICAgIjwhRE9DVFlQRSBkb2MgUFVCTElDICdodHRwOi8veG1sLnB5dGhvbi5vcmcvcHVibGljJyIKKyAgICAgICAgICAgICAgICAgICAgIiAnaHR0cDovL3htbC5weXRob24ub3JnL3N5c3RlbScgW1xuIgorICAgICAgICAgICAgICAgICAgICAiICA8IUVMRU1FTlQgZSBFTVBUWT5cbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgPCFFTlRJVFkgZW50IFNZU1RFTSAnaHR0cDovL3htbC5weXRob24ub3JnL2VudGl0eSc+XG4iCisgICAgICAgICAgICAgICAgICAgICJdPjxkb2MgYXR0cj0ndmFsdWUnPiB0ZXh0XG4iCisgICAgICAgICAgICAgICAgICAgICI8P3BpIHNhbXBsZT8+IDwhLS0gY29tbWVudCAtLT4gPGUvPiA8L2RvYz4iKQorICAgICAgICBzID0gcGlja2xlLmR1bXBzKGRvYykKKyAgICAgICAgZG9jMiA9IHBpY2tsZS5sb2FkcyhzKQorICAgICAgICBzdGFjayA9IFsoZG9jLCBkb2MyKV0KKyAgICAgICAgd2hpbGUgc3RhY2s6CisgICAgICAgICAgICBuMSwgbjIgPSBzdGFjay5wb3AoKQorICAgICAgICAgICAgc2VsZi5jb25maXJtKG4xLm5vZGVUeXBlID09IG4yLm5vZGVUeXBlCisgICAgICAgICAgICAgICAgICAgIGFuZCBsZW4objEuY2hpbGROb2RlcykgPT0gbGVuKG4yLmNoaWxkTm9kZXMpCisgICAgICAgICAgICAgICAgICAgIGFuZCBuMS5ub2RlTmFtZSA9PSBuMi5ub2RlTmFtZQorICAgICAgICAgICAgICAgICAgICBhbmQgbm90IG4xLmlzU2FtZU5vZGUobjIpCisgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgbjIuaXNTYW1lTm9kZShuMSkpCisgICAgICAgICAgICBpZiBuMS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERToKKyAgICAgICAgICAgICAgICBsZW4objEuZW50aXRpZXMpCisgICAgICAgICAgICAgICAgbGVuKG4yLmVudGl0aWVzKQorICAgICAgICAgICAgICAgIGxlbihuMS5ub3RhdGlvbnMpCisgICAgICAgICAgICAgICAgbGVuKG4yLm5vdGF0aW9ucykKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpcm0obGVuKG4xLmVudGl0aWVzKSA9PSBsZW4objIuZW50aXRpZXMpCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbGVuKG4xLm5vdGF0aW9ucykgPT0gbGVuKG4yLm5vdGF0aW9ucykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKG4xLm5vdGF0aW9ucykpOgorICAgICAgICAgICAgICAgICAgICAjIFhYWCB0aGlzIGxvb3AgYm9keSBkb2Vzbid0IHNlZW0gdG8gYmUgZXhlY3V0ZWQ/CisgICAgICAgICAgICAgICAgICAgIG5vMSA9IG4xLm5vdGF0aW9ucy5pdGVtKGkpCisgICAgICAgICAgICAgICAgICAgIG5vMiA9IG4xLm5vdGF0aW9ucy5pdGVtKGkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlybShubzEubmFtZSA9PSBubzIubmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBubzEucHVibGljSWQgPT0gbm8yLnB1YmxpY0lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vMS5zeXN0ZW1JZCA9PSBubzIuc3lzdGVtSWQpCisgICAgICAgICAgICAgICAgICAgIHN0YWNrLmFwcGVuZCgobm8xLCBubzIpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihuMS5lbnRpdGllcykpOgorICAgICAgICAgICAgICAgICAgICBlMSA9IG4xLmVudGl0aWVzLml0ZW0oaSkKKyAgICAgICAgICAgICAgICAgICAgZTIgPSBuMi5lbnRpdGllcy5pdGVtKGkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlybShlMS5ub3RhdGlvbk5hbWUgPT0gZTIubm90YXRpb25OYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGUxLnB1YmxpY0lkID09IGUyLnB1YmxpY0lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGUxLnN5c3RlbUlkID09IGUyLnN5c3RlbUlkKQorICAgICAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQoKGUxLCBlMikpCisgICAgICAgICAgICBpZiBuMS5ub2RlVHlwZSAhPSBOb2RlLkRPQ1VNRU5UX05PREU6CisgICAgICAgICAgICAgICAgc2VsZi5jb25maXJtKG4xLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShkb2MpCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbjIub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKGRvYzIpKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKG4xLmNoaWxkTm9kZXMpKToKKyAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQoKG4xLmNoaWxkTm9kZXNbaV0sIG4yLmNoaWxkTm9kZXNbaV0pKQorCisgICAgZGVmIHRlc3RTZXJpYWxpemVDb21tZW50Tm9kZVdpdGhEb3VibGVIeXBoZW4oc2VsZik6CisgICAgICAgIGRvYyA9IGNyZWF0ZV9kb2Nfd2l0aG91dF9kb2N0eXBlKCkKKyAgICAgICAgZG9jLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDb21tZW50KCJmb28tLWJhciIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkb2MudG94bWwpCisKKyAgICBkZWYgdGVzdEVtcHR5WE1MTlNWYWx1ZShzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxlbGVtZW50IHhtbG5zPScnPlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiPGZvby8+XG48L2VsZW1lbnQ+IikKKyAgICAgICAgZG9jMiA9IHBhcnNlU3RyaW5nKGRvYy50b3htbCgpKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9jMi5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChNaW5pZG9tVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWluaWRvbS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW5pZG9tLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTljNjQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWluaWRvbS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWluaWRvbS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW5pZG9tLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTljNjQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWluaWRvbS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW1hcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21tYXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0YjIwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21tYXAucHkKQEAgLTAsMCArMSw3MjQgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IChURVNURk4sIHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZSwgdW5saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzLCBfMkcsIF80RykKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zLCByZSwgaXRlcnRvb2xzLCBzb2NrZXQsIHN5cworCittbWFwID0gaW1wb3J0X21vZHVsZSgnbW1hcCcpCisKK1BBR0VTSVpFID0gbW1hcC5QQUdFU0laRQorCitjbGFzcyBNbWFwVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhURVNURk4pOgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBUZXN0IG1tYXAgbW9kdWxlIG9uIFVuaXggc3lzdGVtcyBhbmQgV2luZG93cworCisgICAgICAgICMgQ3JlYXRlIGEgZmlsZSB0byBiZSBtbWFwJ2VkLgorICAgICAgICBmID0gb3BlbihURVNURk4sICd3KycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgV3JpdGUgMiBwYWdlcyB3b3J0aCBvZiBkYXRhIHRvIHRoZSBmaWxlCisgICAgICAgICAgICBmLndyaXRlKCdcMCcqIFBBR0VTSVpFKQorICAgICAgICAgICAgZi53cml0ZSgnZm9vJykKKyAgICAgICAgICAgIGYud3JpdGUoJ1wwJyogKFBBR0VTSVpFLTMpICkKKyAgICAgICAgICAgIGYuZmx1c2goKQorICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCAyICogUEFHRVNJWkUpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgIyBTaW1wbGUgc2FuaXR5IGNoZWNrcworCisgICAgICAgICAgICB0cCA9IHN0cih0eXBlKG0pKSAgIyBTRiBidWcgMTI4NzEzOiAgc2VnZmF1bHRlZCBvbiBMaW51eAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmZpbmQoJ2ZvbycpLCBQQUdFU0laRSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obSksIDIqUEFHRVNJWkUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVswXSwgJ1wwJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVswOjNdLCAnXDBcMFwwJykKKworICAgICAgICAgICAgIyBTaG91bGRuJ3QgY3Jhc2ggb24gYm91bmRhcnkgKElzc3VlICM1MjkyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbS5fX2dldGl0ZW1fXywgbGVuKG0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbS5fX3NldGl0ZW1fXywgbGVuKG0pLCAnXDAnKQorCisgICAgICAgICAgICAjIE1vZGlmeSB0aGUgZmlsZSdzIGNvbnRlbnQKKyAgICAgICAgICAgIG1bMF0gPSAnMycKKyAgICAgICAgICAgIG1bUEFHRVNJWkUgKzM6IFBBR0VTSVpFICszKzNdID0gJ2JhcicKKworICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBtb2RpZmljYXRpb24gd29ya2VkCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bMF0sICczJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVswOjNdLCAnM1wwXDAnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtW1BBR0VTSVpFLTEgOiBQQUdFU0laRSArIDddLCAnXDBmb29iYXJcMCcpCisKKyAgICAgICAgICAgIG0uZmx1c2goKQorCisgICAgICAgICAgICAjIFRlc3QgZG9pbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggaW4gYW4gbW1hcCdlZCBmaWxlCisgICAgICAgICAgICBtYXRjaCA9IHJlLnNlYXJjaCgnW0EtWmEtel0rJywgbSkKKyAgICAgICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdyZWdleCBtYXRjaCBvbiBtbWFwIGZhaWxlZCEnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGFydCwgZW5kID0gbWF0Y2guc3BhbigwKQorICAgICAgICAgICAgICAgIGxlbmd0aCA9IGVuZCAtIHN0YXJ0CisKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXJ0LCBQQUdFU0laRSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuZCwgUEFHRVNJWkUgKyA2KQorCisgICAgICAgICAgICAjIHRlc3Qgc2Vla2luZyBhcm91bmQgKHRyeSB0byBvdmVyZmxvdyB0aGUgc2VlayBpbXBsZW1lbnRhdGlvbikKKyAgICAgICAgICAgIG0uc2VlaygwLDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0udGVsbCgpLCAwKQorICAgICAgICAgICAgbS5zZWVrKDQyLDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0udGVsbCgpLCA0MikKKyAgICAgICAgICAgIG0uc2VlaygwLDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0udGVsbCgpLCBsZW4obSkpCisKKyAgICAgICAgICAgICMgVHJ5IHRvIHNlZWsgdG8gbmVnYXRpdmUgcG9zaXRpb24uLi4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0uc2VlaywgLTEpCisKKyAgICAgICAgICAgICMgVHJ5IHRvIHNlZWsgYmV5b25kIGVuZCBvZiBtbWFwLi4uCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLnNlZWssIDEsIDIpCisKKyAgICAgICAgICAgICMgVHJ5IHRvIHNlZWsgdG8gbmVnYXRpdmUgcG9zaXRpb24uLi4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0uc2VlaywgLWxlbihtKS0xLCAyKQorCisgICAgICAgICAgICAjIFRyeSByZXNpemluZyBtYXAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtLnJlc2l6ZSg1MTIpCisgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3I6CisgICAgICAgICAgICAgICAgIyByZXNpemUoKSBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgIyBObyBtZXNzYWdlcyBhcmUgcHJpbnRlZCwgc2luY2UgdGhlIG91dHB1dCBvZiB0aGlzIHRlc3Qgc3VpdGUKKyAgICAgICAgICAgICAgICAjIHdvdWxkIHRoZW4gYmUgZGlmZmVyZW50IGFjcm9zcyBwbGF0Zm9ybXMuCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHJlc2l6ZSgpIGlzIHN1cHBvcnRlZAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG0pLCA1MTIpCisgICAgICAgICAgICAgICAgIyBDaGVjayB0aGF0IHdlIGNhbiBubyBsb25nZXIgc2VlayBiZXlvbmQgdGhlIG5ldyBzaXplLgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0uc2VlaywgNTEzLCAwKQorCisgICAgICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSB1bmRlcmx5aW5nIGZpbGUgaXMgdHJ1bmNhdGVkIHRvbworICAgICAgICAgICAgICAgICMgKGJ1ZyAjNzI4NTE1KQorICAgICAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTikKKyAgICAgICAgICAgICAgICBmLnNlZWsoMCwgMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCA1MTIpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnNpemUoKSwgNTEyKQorCisgICAgICAgICAgICBtLmNsb3NlKCkKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfYWNjZXNzX3BhcmFtZXRlcihzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciAiYWNjZXNzIiBrZXl3b3JkIHBhcmFtZXRlcgorICAgICAgICBtYXBzaXplID0gMTAKKyAgICAgICAgb3BlbihURVNURk4sICJ3YiIpLndyaXRlKCJhIiptYXBzaXplKQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyYiIpCisgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbWFwc2l6ZSwgYWNjZXNzPW1tYXAuQUNDRVNTX1JFQUQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVs6XSwgJ2EnKm1hcHNpemUsICJSZWFkb25seSBtZW1vcnkgbWFwIGRhdGEgaW5jb3JyZWN0LiIpCisKKyAgICAgICAgIyBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgc2xpY2UgYXNzaWduZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbVs6XSA9ICdiJyptYXBzaXplCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkFibGUgdG8gd3JpdGUgdG8gcmVhZG9ubHkgbWVtb3J5IG1hcCIpCisKKyAgICAgICAgIyBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgaXRlbSBhc3NpZ25lZAorICAgICAgICB0cnk6CisgICAgICAgICAgICBtWzBdID0gJ2InCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkFibGUgdG8gd3JpdGUgdG8gcmVhZG9ubHkgbWVtb3J5IG1hcCIpCisKKyAgICAgICAgIyBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgd3JpdGUoKSB0bworICAgICAgICB0cnk6CisgICAgICAgICAgICBtLnNlZWsoMCwwKQorICAgICAgICAgICAgbS53cml0ZSgnYWJjJykKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQWJsZSB0byB3cml0ZSB0byByZWFkb25seSBtZW1vcnkgbWFwIikKKworICAgICAgICAjIEVuc3VyaW5nIHRoYXQgcmVhZG9ubHkgbW1hcCBjYW4ndCBiZSB3cml0ZV9ieXRlKCkgdG8KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbS5zZWVrKDAsMCkKKyAgICAgICAgICAgIG0ud3JpdGVfYnl0ZSgnZCcpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkFibGUgdG8gd3JpdGUgdG8gcmVhZG9ubHkgbWVtb3J5IG1hcCIpCisKKyAgICAgICAgIyBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgcmVzaXplZAorICAgICAgICB0cnk6CisgICAgICAgICAgICBtLnJlc2l6ZSgyKm1hcHNpemUpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvcjogICAjIHJlc2l6ZSBpcyBub3QgdW5pdmVyc2FsbHkgc3VwcG9ydGVkCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkFibGUgdG8gcmVzaXplIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZGVsIG0sIGYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVuKFRFU1RGTiwgInJiIikucmVhZCgpLCAnYScqbWFwc2l6ZSwKKyAgICAgICAgICAgICAgICJSZWFkb25seSBtZW1vcnkgbWFwIGRhdGEgZmlsZSB3YXMgbW9kaWZpZWQiKQorCisgICAgICAgICMgT3BlbmluZyBtbWFwIHdpdGggc2l6ZSB0b28gYmlnCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicitiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBtYXBzaXplKzEpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgIyB3ZSBkbyBub3QgZXhwZWN0IGEgVmFsdWVFcnJvciBvbiBXaW5kb3dzCisgICAgICAgICAgICAjIENBVVRJT046ICBUaGlzIGFsc28gY2hhbmdlcyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSBvbiBkaXNrLCBhbmQKKyAgICAgICAgICAgICMgbGF0ZXIgdGVzdHMgYXNzdW1lIHRoYXQgdGhlIGxlbmd0aCBoYXNuJ3QgY2hhbmdlZC4gIFdlIG5lZWQgdG8KKyAgICAgICAgICAgICMgcmVwYWlyIHRoYXQuCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJPcGVuaW5nIG1tYXAgd2l0aCBzaXplKzEgc2hvdWxkIHdvcmsgb24gV2luZG93cy4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB3ZSBleHBlY3QgYSBWYWx1ZUVycm9yIG9uIFVuaXgsIGJ1dCBub3Qgb24gV2luZG93cworICAgICAgICAgICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk9wZW5pbmcgbW1hcCB3aXRoIHNpemUrMSBzaG91bGQgcmFpc2UgVmFsdWVFcnJvci4iKQorICAgICAgICAgICAgbS5jbG9zZSgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyk6CisgICAgICAgICAgICAjIFJlcGFpciBkYW1hZ2UgZnJvbSB0aGUgcmVzaXppbmcgdGVzdC4KKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3IrYicpCisgICAgICAgICAgICBmLnRydW5jYXRlKG1hcHNpemUpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAjIE9wZW5pbmcgbW1hcCB3aXRoIGFjY2Vzcz1BQ0NFU1NfV1JJVEUKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicitiIikKKyAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBtYXBzaXplLCBhY2Nlc3M9bW1hcC5BQ0NFU1NfV1JJVEUpCisgICAgICAgICMgTW9kaWZ5aW5nIHdyaXRlLXRocm91Z2ggbWVtb3J5IG1hcAorICAgICAgICBtWzpdID0gJ2MnKm1hcHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzpdLCAnYycqbWFwc2l6ZSwKKyAgICAgICAgICAgICAgICJXcml0ZS10aHJvdWdoIG1lbW9yeSBtYXAgbWVtb3J5IG5vdCB1cGRhdGVkIHByb3Blcmx5LiIpCisgICAgICAgIG0uZmx1c2goKQorICAgICAgICBtLmNsb3NlKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3JiJykKKyAgICAgICAgc3R1ZmYgPSBmLnJlYWQoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHVmZiwgJ2MnKm1hcHNpemUsCisgICAgICAgICAgICAgICAiV3JpdGUtdGhyb3VnaCBtZW1vcnkgbWFwIGRhdGEgZmlsZSBub3QgdXBkYXRlZCBwcm9wZXJseS4iKQorCisgICAgICAgICMgT3BlbmluZyBtbWFwIHdpdGggYWNjZXNzPUFDQ0VTU19DT1BZCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCisgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbWFwc2l6ZSwgYWNjZXNzPW1tYXAuQUNDRVNTX0NPUFkpCisgICAgICAgICMgTW9kaWZ5aW5nIGNvcHktb24td3JpdGUgbWVtb3J5IG1hcAorICAgICAgICBtWzpdID0gJ2QnKm1hcHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzpdLCAnZCcgKiBtYXBzaXplLAorICAgICAgICAgICAgICAgIkNvcHktb24td3JpdGUgbWVtb3J5IG1hcCBkYXRhIG5vdCB3cml0dGVuIGNvcnJlY3RseS4iKQorICAgICAgICBtLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVuKFRFU1RGTiwgInJiIikucmVhZCgpLCAnYycqbWFwc2l6ZSwKKyAgICAgICAgICAgICAgICJDb3B5LW9uLXdyaXRlIHRlc3QgZGF0YSBmaWxlIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuIikKKyAgICAgICAgIyBFbnN1cmluZyBjb3B5LW9uLXdyaXRlIG1hcHMgY2Fubm90IGJlIHJlc2l6ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtLnJlc2l6ZSwgMiptYXBzaXplKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZGVsIG0sIGYKKworICAgICAgICAjIEVuc3VyaW5nIGludmFsaWQgYWNjZXNzIHBhcmFtZXRlciByYWlzZXMgZXhjZXB0aW9uCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1tYXAubW1hcCwgZi5maWxlbm8oKSwgbWFwc2l6ZSwgYWNjZXNzPTQpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGlmIG9zLm5hbWUgPT0gInBvc2l4IjoKKyAgICAgICAgICAgICMgVHJ5IGluY29tcGF0aWJsZSBmbGFncywgcHJvdCBhbmQgYWNjZXNzIHBhcmFtZXRlcnMuCisgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbW1hcC5tbWFwLCBmLmZpbGVubygpLCBtYXBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M9bW1hcC5NQVBfUFJJVkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3Q9bW1hcC5QUk9UX1JFQUQsIGFjY2Vzcz1tbWFwLkFDQ0VTU19XUklURSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICAjIFRyeSB3cml0aW5nIHdpdGggUFJPVF9FWEVDIGFuZCB3aXRob3V0IFBST1RfV1JJVEUKKyAgICAgICAgICAgIHByb3QgPSBtbWFwLlBST1RfUkVBRCB8IGdldGF0dHIobW1hcCwgJ1BST1RfRVhFQycsIDApCisgICAgICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAicitiIikgYXMgZjoKKyAgICAgICAgICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIG1hcHNpemUsIHByb3Q9cHJvdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG0ud3JpdGUsIGIiYWJjZGVmIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG0ud3JpdGVfYnl0ZSwgMCkKKyAgICAgICAgICAgICAgICBtLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2JhZF9maWxlX2Rlc2Moc2VsZik6CisgICAgICAgICMgVHJ5IG9wZW5pbmcgYSBiYWQgZmlsZSBkZXNjcmlwdG9yLi4uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1tYXAuZXJyb3IsIG1tYXAubW1hcCwgLTIsIDQwOTYpCisKKyAgICBkZWYgdGVzdF90b3VnaGVyX2ZpbmQoc2VsZik6CisgICAgICAgICMgRG8gYSB0b3VnaGVyIC5maW5kKCkgdGVzdC4gIFNGIGJ1ZyA1MTU5NDMgcG9pbnRlZCBvdXQgdGhhdCwgaW4gMi4yLAorICAgICAgICAjIHNlYXJjaGluZyBmb3IgZGF0YSB3aXRoIGVtYmVkZGVkIFwwIGJ5dGVzIGRpZG4ndCB3b3JrLgorICAgICAgICBmID0gb3BlbihURVNURk4sICd3KycpCisKKyAgICAgICAgZGF0YSA9ICdhYWJhYWNceDAwZGVlZlx4MDBceDAwYWFceDAwJworICAgICAgICBuID0gbGVuKGRhdGEpCisgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgZi5mbHVzaCgpCisgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgZm9yIHN0YXJ0IGluIHJhbmdlKG4rMSk6CisgICAgICAgICAgICBmb3IgZmluaXNoIGluIHJhbmdlKHN0YXJ0LCBuKzEpOgorICAgICAgICAgICAgICAgIHNsaWNlID0gZGF0YVtzdGFydCA6IGZpbmlzaF0KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZmluZChzbGljZSksIGRhdGEuZmluZChzbGljZSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmZpbmQoc2xpY2UgKyAneCcpLCAtMSkKKyAgICAgICAgbS5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9maW5kX2VuZChzZWxmKToKKyAgICAgICAgIyB0ZXN0IHRoZSBuZXcgJ2VuZCcgcGFyYW1ldGVyIHdvcmtzIGFzIGV4cGVjdGVkCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crJykKKyAgICAgICAgZGF0YSA9ICdvbmUgdHdvIG9uZXMnCisgICAgICAgIG4gPSBsZW4oZGF0YSkKKyAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBuKQorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZmluZCgnb25lJyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5maW5kKCdvbmVzJyksIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5maW5kKCdvbmUnLCAwLCAtMSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5maW5kKCdvbmUnLCAxKSwgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmZpbmQoJ29uZScsIDEsIC0xKSwgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmZpbmQoJ29uZScsIDEsIC0yKSwgLTEpCisKKworICAgIGRlZiB0ZXN0X3JmaW5kKHNlbGYpOgorICAgICAgICAjIHRlc3QgdGhlIG5ldyAnZW5kJyBwYXJhbWV0ZXIgd29ya3MgYXMgZXhwZWN0ZWQKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQorICAgICAgICBkYXRhID0gJ29uZSB0d28gb25lcycKKyAgICAgICAgbiA9IGxlbihkYXRhKQorICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgIGYuZmx1c2goKQorICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIG4pCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZmluZCgnb25lJyksIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZmluZCgnb25lICcpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmZpbmQoJ29uZScsIDAsIC0xKSwgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJmaW5kKCdvbmUnLCAwLCAtMiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZmluZCgnb25lJywgMSwgLTEpLCA4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmZpbmQoJ29uZScsIDEsIC0yKSwgLTEpCisKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9jbG9zZShzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgYSBkb3VibGUgY2xvc2UgZG9lc24ndCBjcmFzaCBvbiBTb2xhcmlzIChCdWcjIDY2NTkxMykKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQorCisgICAgICAgIGYud3JpdGUoMioqMTYgKiAnYScpICMgQXJiaXRyYXJ5IGNoYXJhY3RlcgorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBmID0gb3BlbihURVNURk4pCisgICAgICAgIG1mID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDIqKjE2LCBhY2Nlc3M9bW1hcC5BQ0NFU1NfUkVBRCkKKyAgICAgICAgbWYuY2xvc2UoKQorICAgICAgICBtZi5jbG9zZSgpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZW50aXJlX2ZpbGUoc2VsZik6CisgICAgICAgICMgdGVzdCBtYXBwaW5nIG9mIGVudGlyZSBmaWxlIGJ5IHBhc3NpbmcgMCBmb3IgbWFwIGxlbmd0aAorICAgICAgICBpZiBoYXNhdHRyKG9zLCAic3RhdCIpOgorICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidysiKQorCisgICAgICAgICAgICBmLndyaXRlKDIqKjE2ICogJ20nKSAjIEFyYml0cmFyeSBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICJyYisiKQorICAgICAgICAgICAgbWYgPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1mKSwgMioqMTYsICJNYXAgc2l6ZSBzaG91bGQgZXF1YWwgZmlsZSBzaXplLiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1mLnJlYWQoMioqMTYpLCAyKioxNiAqICJtIikKKyAgICAgICAgICAgIG1mLmNsb3NlKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfbGVuZ3RoXzBfb2Zmc2V0KHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMDkxNjogdGVzdCBtYXBwaW5nIG9mIHJlbWFpbmRlciBvZiBmaWxlIGJ5IHBhc3NpbmcgMCBmb3IKKyAgICAgICAgIyBtYXAgbGVuZ3RoIHdpdGggYW4gb2Zmc2V0IGRvZXNuJ3QgY2F1c2UgYSBzZWdmYXVsdC4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJzdGF0Iik6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJuZWVkcyBvcy5zdGF0IikKKyAgICAgICAgIyBOT1RFOiBhbGxvY2F0aW9uIGdyYW51bGFyaXR5IGlzIGN1cnJlbnRseSA2NTUzNiB1bmRlciBXaW42NCwKKyAgICAgICAgIyBhbmQgdGhlcmVmb3JlIHRoZSBtaW5pbXVtIG9mZnNldCBhbGlnbm1lbnQuCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCg2NTUzNiAqIDIpICogYidtJykgIyBBcmJpdHJhcnkgY2hhcmFjdGVyCisKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgInJiIikgYXMgZjoKKyAgICAgICAgICAgIG1mID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDAsIG9mZnNldD02NTUzNiwgYWNjZXNzPW1tYXAuQUNDRVNTX1JFQUQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbWYuX19nZXRpdGVtX18sIDgwMDAwKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBtZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9sZW5ndGhfMF9sYXJnZV9vZmZzZXQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEwOTU5OiB0ZXN0IG1hcHBpbmcgb2YgYSBmaWxlIGJ5IHBhc3NpbmcgMCBmb3IKKyAgICAgICAgIyBtYXAgbGVuZ3RoIHdpdGggYSBsYXJnZSBvZmZzZXQgZG9lc24ndCBjYXVzZSBhIHNlZ2ZhdWx0LgorICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgInN0YXQiKToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIm5lZWRzIG9zLnN0YXQiKQorCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKDExNTY5OSAqIGInbScpICMgQXJiaXRyYXJ5IGNoYXJhY3RlcgorCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICJ3K2IiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbW1hcC5tbWFwLCBmLmZpbGVubygpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PTIxNDc0MTgxMTIpCisKKyAgICBkZWYgdGVzdF9tb3ZlKHNlbGYpOgorICAgICAgICAjIG1ha2UgbW92ZSB3b3JrcyBldmVyeXdoZXJlICg2NC1iaXQgZm9ybWF0IHByb2JsZW0gZWFybGllcikKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQorCisgICAgICAgIGYud3JpdGUoIkFCQ0RFYWJjZGUiKSAjIEFyYml0cmFyeSBjaGFyYWN0ZXIKKyAgICAgICAgZi5mbHVzaCgpCisKKyAgICAgICAgbWYgPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMTApCisgICAgICAgIG1mLm1vdmUoNSwgMCwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZls6XSwgIkFCQ0RFQUJDREUiLCAiTWFwIG1vdmUgc2hvdWxkIGhhdmUgZHVwbGljYXRlZCBmcm9udCA1IikKKyAgICAgICAgbWYuY2xvc2UoKQorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAjIG1vcmUgZXhjZXNzaXZlIHRlc3QKKyAgICAgICAgZGF0YSA9ICIwMTIzNDU2Nzg5IgorICAgICAgICBmb3IgZGVzdCBpbiByYW5nZShsZW4oZGF0YSkpOgorICAgICAgICAgICAgZm9yIHNyYyBpbiByYW5nZShsZW4oZGF0YSkpOgorICAgICAgICAgICAgICAgIGZvciBjb3VudCBpbiByYW5nZShsZW4oZGF0YSkgLSBtYXgoZGVzdCwgc3JjKSk6CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gZGF0YVs6ZGVzdF0gKyBkYXRhW3NyYzpzcmMrY291bnRdICsgZGF0YVtkZXN0K2NvdW50Ol0KKyAgICAgICAgICAgICAgICAgICAgbSA9IG1tYXAubW1hcCgtMSwgbGVuKGRhdGEpKQorICAgICAgICAgICAgICAgICAgICBtWzpdID0gZGF0YQorICAgICAgICAgICAgICAgICAgICBtLm1vdmUoZGVzdCwgc3JjLCBjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzpdLCBleHBlY3RlZCkKKyAgICAgICAgICAgICAgICAgICAgbS5jbG9zZSgpCisKKyAgICAgICAgIyBzZWdmYXVsdCB0ZXN0IChJc3N1ZSA1Mzg3KQorICAgICAgICBtID0gbW1hcC5tbWFwKC0xLCAxMDApCisgICAgICAgIG9mZnNldHMgPSBbLTEwMCwgLTEsIDAsIDEsIDEwMF0KKyAgICAgICAgZm9yIHNvdXJjZSwgZGVzdCwgc2l6ZSBpbiBpdGVydG9vbHMucHJvZHVjdChvZmZzZXRzLCBvZmZzZXRzLCBvZmZzZXRzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtLm1vdmUoc291cmNlLCBkZXN0LCBzaXplKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIG9mZnNldHMgPSBbKC0xLCAtMSwgLTEpLCAoLTEsIC0xLCAwKSwgKC0xLCAwLCAtMSksICgwLCAtMSwgLTEpLAorICAgICAgICAgICAgICAgICAgICgtMSwgMCwgMCksICgwLCAtMSwgMCksICgwLCAwLCAtMSldCisgICAgICAgIGZvciBzb3VyY2UsIGRlc3QsIHNpemUgaW4gb2Zmc2V0czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0ubW92ZSwgc291cmNlLCBkZXN0LCBzaXplKQorCisgICAgICAgIG0uY2xvc2UoKQorCisgICAgICAgIG0gPSBtbWFwLm1tYXAoLTEsIDEpICMgc2luZ2xlIGJ5dGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbS5tb3ZlLCAwLCAwLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLm1vdmUsIDEsIDAsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0ubW92ZSwgMCwgMSwgMSkKKyAgICAgICAgbS5tb3ZlKDAsIDAsIDEpCisgICAgICAgIG0ubW92ZSgwLCAwLCAwKQorCisKKyAgICBkZWYgdGVzdF9hbm9ueW1vdXMoc2VsZik6CisgICAgICAgICMgYW5vbnltb3VzIG1tYXAubW1hcCgtMSwgUEFHRSkKKyAgICAgICAgbSA9IG1tYXAubW1hcCgtMSwgUEFHRVNJWkUpCisgICAgICAgIGZvciB4IGluIHhyYW5nZShQQUdFU0laRSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1beF0sICdcMCcsICJhbm9ueW1vdXNseSBtbWFwJ2VkIGNvbnRlbnRzIHNob3VsZCBiZSB6ZXJvIikKKworICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoUEFHRVNJWkUpOgorICAgICAgICAgICAgbVt4XSA9IGNoID0gY2hyKHggJiAyNTUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1beF0sIGNoKQorCisgICAgZGVmIHRlc3RfZXh0ZW5kZWRfZ2V0c2xpY2Uoc2VsZik6CisgICAgICAgICMgVGVzdCBleHRlbmRlZCBzbGljaW5nIGJ5IGNvbXBhcmluZyB3aXRoIGxpc3Qgc2xpY2luZy4KKyAgICAgICAgcyA9ICIiLmpvaW4oY2hyKGMpIGZvciBjIGluIHJldmVyc2VkKHJhbmdlKDI1NikpKQorICAgICAgICBtID0gbW1hcC5tbWFwKC0xLCBsZW4ocykpCisgICAgICAgIG1bOl0gPSBzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVs6XSwgcykKKyAgICAgICAgaW5kaWNlcyA9ICgwLCBOb25lLCAxLCAzLCAxOSwgMzAwLCAtMSwgLTIsIC0zMSwgLTMwMCkKKyAgICAgICAgZm9yIHN0YXJ0IGluIGluZGljZXM6CisgICAgICAgICAgICBmb3Igc3RvcCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgICAgICMgU2tpcCBzdGVwIDAgKGludmFsaWQpCisgICAgICAgICAgICAgICAgZm9yIHN0ZXAgaW4gaW5kaWNlc1sxOl06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVtzdGFydDpzdG9wOnN0ZXBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbc3RhcnQ6c3RvcDpzdGVwXSkKKworICAgIGRlZiB0ZXN0X2V4dGVuZGVkX3NldF9kZWxfc2xpY2Uoc2VsZik6CisgICAgICAgICMgVGVzdCBleHRlbmRlZCBzbGljaW5nIGJ5IGNvbXBhcmluZyB3aXRoIGxpc3Qgc2xpY2luZy4KKyAgICAgICAgcyA9ICIiLmpvaW4oY2hyKGMpIGZvciBjIGluIHJldmVyc2VkKHJhbmdlKDI1NikpKQorICAgICAgICBtID0gbW1hcC5tbWFwKC0xLCBsZW4ocykpCisgICAgICAgIGluZGljZXMgPSAoMCwgTm9uZSwgMSwgMywgMTksIDMwMCwgLTEsIC0yLCAtMzEsIC0zMDApCisgICAgICAgIGZvciBzdGFydCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgZm9yIHN0b3AgaW4gaW5kaWNlczoKKyAgICAgICAgICAgICAgICAjIFNraXAgaW52YWxpZCBzdGVwIDAKKyAgICAgICAgICAgICAgICBmb3Igc3RlcCBpbiBpbmRpY2VzWzE6XToKKyAgICAgICAgICAgICAgICAgICAgbVs6XSA9IHMKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzpdLCBzKQorICAgICAgICAgICAgICAgICAgICBMID0gbGlzdChzKQorICAgICAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgc2xpY2Ugb2YgZXhhY3RseSB0aGUgcmlnaHQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAjIGJ1dCB3aXRoIGRpZmZlcmVudCBkYXRhLgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gTFtzdGFydDpzdG9wOnN0ZXBdCisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAiIi5qb2luKHJldmVyc2VkKGRhdGEpKQorICAgICAgICAgICAgICAgICAgICBMW3N0YXJ0OnN0b3A6c3RlcF0gPSBkYXRhCisgICAgICAgICAgICAgICAgICAgIG1bc3RhcnQ6c3RvcDpzdGVwXSA9IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzpdLCAiIi5qb2luKEwpKQorCisgICAgZGVmIG1ha2VfbW1hcF9maWxlIChzZWxmLCBmLCBoYWxmc2l6ZSk6CisgICAgICAgICMgV3JpdGUgMiBwYWdlcyB3b3J0aCBvZiBkYXRhIHRvIHRoZSBmaWxlCisgICAgICAgIGYud3JpdGUgKCdcMCcgKiBoYWxmc2l6ZSkKKyAgICAgICAgZi53cml0ZSAoJ2ZvbycpCisgICAgICAgIGYud3JpdGUgKCdcMCcgKiAoaGFsZnNpemUgLSAzKSkKKyAgICAgICAgZi5mbHVzaCAoKQorICAgICAgICByZXR1cm4gbW1hcC5tbWFwIChmLmZpbGVubygpLCAwKQorCisgICAgZGVmIHRlc3RfZW1wdHlfZmlsZSAoc2VsZik6CisgICAgICAgIGYgPSBvcGVuIChURVNURk4sICd3K2InKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgInJiIikgYXMgZiA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCAwLCBhY2Nlc3M9bW1hcC5BQ0NFU1NfUkVBRCkKKyAgICAgICAgICAgICAgICBtLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBub3QgaGF2ZSBiZWVuIGFibGUgdG8gbW1hcCBlbXB0eSBmaWxlIikKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm1lc3NhZ2UsICJjYW5ub3QgbW1hcCBhbiBlbXB0eSBmaWxlIikKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuZXhwZWN0ZWQgZXhjZXB0aW9uOiAiICsgc3RyKGUpKQorCisgICAgZGVmIHRlc3Rfb2Zmc2V0IChzZWxmKToKKyAgICAgICAgZiA9IG9wZW4gKFRFU1RGTiwgJ3crYicpCisKKyAgICAgICAgdHJ5OiAjIHVubGluayBURVNURk4gbm8gbWF0dGVyIHdoYXQKKyAgICAgICAgICAgIGhhbGZzaXplID0gbW1hcC5BTExPQ0FUSU9OR1JBTlVMQVJJVFkKKyAgICAgICAgICAgIG0gPSBzZWxmLm1ha2VfbW1hcF9maWxlIChmLCBoYWxmc2l6ZSkKKyAgICAgICAgICAgIG0uY2xvc2UgKCkKKyAgICAgICAgICAgIGYuY2xvc2UgKCkKKworICAgICAgICAgICAgbWFwc2l6ZSA9IGhhbGZzaXplICogMgorICAgICAgICAgICAgIyBUcnkgaW52YWxpZCBvZmZzZXQKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCisgICAgICAgICAgICBmb3Igb2Zmc2V0IGluIFstMiwgLTEsIE5vbmVdOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBtYXBzaXplLCBvZmZzZXQ9b2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIDEpCisgICAgICAgICAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBUeXBlRXJyb3IsIE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCAwKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgICMgVHJ5IHZhbGlkIG9mZnNldCwgaG9wZWZ1bGx5IDgxOTIgd29ya3Mgb24gYWxsIE9TZXMKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCisgICAgICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIG1hcHNpemUgLSBoYWxmc2l6ZSwgb2Zmc2V0PWhhbGZzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzA6M10sICdmb28nKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgICMgVHJ5IHJlc2l6aW5nIG1hcAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG0ucmVzaXplKDUxMikKKyAgICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgcmVzaXplKCkgaXMgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obSksIDUxMikKKyAgICAgICAgICAgICAgICAjIENoZWNrIHRoYXQgd2UgY2FuIG5vIGxvbmdlciBzZWVrIGJleW9uZCB0aGUgbmV3IHNpemUuCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbS5zZWVrLCA1MTMsIDApCisgICAgICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBjb250ZW50IGlzIG5vdCBjaGFuZ2VkCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzA6M10sICdmb28nKQorCisgICAgICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSB1bmRlcmx5aW5nIGZpbGUgaXMgdHJ1bmNhdGVkIHRvbworICAgICAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTikKKyAgICAgICAgICAgICAgICBmLnNlZWsoMCwgMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBoYWxmc2l6ZSArIDUxMikKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uc2l6ZSgpLCBoYWxmc2l6ZSArIDUxMikKKworICAgICAgICAgICAgbS5jbG9zZSgpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgYW5vbl9tbWFwKG1tYXAubW1hcCk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhrbGFzcywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbW1hcC5tbWFwLl9fbmV3X18oa2xhc3MsIC0xLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIGFub25fbW1hcChQQUdFU0laRSkKKworICAgIGRlZiB0ZXN0X3Byb3RfcmVhZG9ubHkoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG1tYXAsICdQUk9UX1JFQUQnKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtYXBzaXplID0gMTAKKyAgICAgICAgb3BlbihURVNURk4sICJ3YiIpLndyaXRlKCJhIiptYXBzaXplKQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyYiIpCisgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbWFwc2l6ZSwgcHJvdD1tbWFwLlBST1RfUkVBRCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtLndyaXRlLCAiZm9vIikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MobW1hcC5lcnJvciwgRW52aXJvbm1lbnRFcnJvcikpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm1tYXAuZXJyb3IiLCBzdHIobW1hcC5lcnJvcikpCisKKyAgICBkZWYgdGVzdF9pb19tZXRob2RzKHNlbGYpOgorICAgICAgICBkYXRhID0gIjAxMjM0NTY3ODkiCisgICAgICAgIG9wZW4oVEVTVEZOLCAid2IiKS53cml0ZSgieCIqbGVuKGRhdGEpKQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQorICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIGxlbihkYXRhKSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICMgVGVzdCB3cml0ZV9ieXRlKCkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihkYXRhKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0udGVsbCgpLCBpKQorICAgICAgICAgICAgbS53cml0ZV9ieXRlKGRhdGFbaV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0udGVsbCgpLCBpKzEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0ud3JpdGVfYnl0ZSwgIngiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bOl0sIGRhdGEpCisgICAgICAgICMgVGVzdCByZWFkX2J5dGUoKQorICAgICAgICBtLnNlZWsoMCkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihkYXRhKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0udGVsbCgpLCBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJlYWRfYnl0ZSgpLCBkYXRhW2ldKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRlbGwoKSwgaSsxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLnJlYWRfYnl0ZSkKKyAgICAgICAgIyBUZXN0IHJlYWQoKQorICAgICAgICBtLnNlZWsoMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJlYWQoMyksICIzNDUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0udGVsbCgpLCA2KQorICAgICAgICAjIFRlc3Qgd3JpdGUoKQorICAgICAgICBtLnNlZWsoMykKKyAgICAgICAgbS53cml0ZSgiYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRlbGwoKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzpdLCAiMDEyYmFyNjc4OSIpCisgICAgICAgIG0uc2Vlayg4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLndyaXRlLCAiYmFyIikKKworICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgZGVmIHRlc3RfdGFnbmFtZShzZWxmKToKKyAgICAgICAgICAgIGRhdGExID0gIjAxMjM0NTY3ODkiCisgICAgICAgICAgICBkYXRhMiA9ICJhYmNkZWZnaGlqIgorICAgICAgICAgICAgYXNzZXJ0IGxlbihkYXRhMSkgPT0gbGVuKGRhdGEyKQorCisgICAgICAgICAgICAjIFRlc3Qgc2FtZSB0YWcKKyAgICAgICAgICAgIG0xID0gbW1hcC5tbWFwKC0xLCBsZW4oZGF0YTEpLCB0YWduYW1lPSJmb28iKQorICAgICAgICAgICAgbTFbOl0gPSBkYXRhMQorICAgICAgICAgICAgbTIgPSBtbWFwLm1tYXAoLTEsIGxlbihkYXRhMiksIHRhZ25hbWU9ImZvbyIpCisgICAgICAgICAgICBtMls6XSA9IGRhdGEyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0xWzpdLCBkYXRhMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTJbOl0sIGRhdGEyKQorICAgICAgICAgICAgbTIuY2xvc2UoKQorICAgICAgICAgICAgbTEuY2xvc2UoKQorCisgICAgICAgICAgICAjIFRlc3QgZGlmZmVyZW50IHRhZworICAgICAgICAgICAgbTEgPSBtbWFwLm1tYXAoLTEsIGxlbihkYXRhMSksIHRhZ25hbWU9ImZvbyIpCisgICAgICAgICAgICBtMVs6XSA9IGRhdGExCisgICAgICAgICAgICBtMiA9IG1tYXAubW1hcCgtMSwgbGVuKGRhdGEyKSwgdGFnbmFtZT0iYm9vIikKKyAgICAgICAgICAgIG0yWzpdID0gZGF0YTIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTFbOl0sIGRhdGExKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMls6XSwgZGF0YTIpCisgICAgICAgICAgICBtMi5jbG9zZSgpCisgICAgICAgICAgICBtMS5jbG9zZSgpCisKKyAgICAgICAgZGVmIHRlc3RfY3Jhc2hlcl9vbl93aW5kb3dzKHNlbGYpOgorICAgICAgICAgICAgIyBTaG91bGQgbm90IGNyYXNoIChJc3N1ZSAxNzMzOTg2KQorICAgICAgICAgICAgbSA9IG1tYXAubW1hcCgtMSwgMTAwMCwgdGFnbmFtZT0iZm9vIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtbWFwLm1tYXAoLTEsIDUwMDAsIHRhZ25hbWU9ImZvbyIpWzpdICMgc2FtZSB0YWduYW1lLCBidXQgbGFyZ2VyIHNpemUKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBtLmNsb3NlKCkKKworICAgICAgICAgICAgIyBTaG91bGQgbm90IGNyYXNoIChJc3N1ZSA1Mzg1KQorICAgICAgICAgICAgb3BlbihURVNURk4sICJ3YiIpLndyaXRlKCJ4IioxMCkKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCisgICAgICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDApCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtLnJlc2l6ZSgwKSAjIHdpbGwgcmFpc2UgV2luZG93c0Vycm9yCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1bOl0KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBtLmNsb3NlKCkKKworICAgICAgICBkZWYgdGVzdF9pbnZhbGlkX2Rlc2NyaXB0b3Ioc2VsZik6CisgICAgICAgICAgICAjIHNvY2tldCBmaWxlIGRlc2NyaXB0b3JzIGFyZSB2YWxpZCwgYnV0IG91dCBvZiByYW5nZQorICAgICAgICAgICAgIyBmb3IgX2dldF9vc2ZoYW5kbGUsIGNhdXNpbmcgYSBjcmFzaCB3aGVuIHZhbGlkYXRpbmcgdGhlCisgICAgICAgICAgICAjIHBhcmFtZXRlcnMgdG8gX2dldF9vc2ZoYW5kbGUuCisgICAgICAgICAgICBzID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhtbWFwLmVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgbSA9IG1tYXAubW1hcChzLmZpbGVubygpLCAxMCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKKworY2xhc3MgTGFyZ2VNbWFwVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICB1bmxpbmsoVEVTVEZOKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB1bmxpbmsoVEVTVEZOKQorCisgICAgZGVmIF9tYWtlX3Rlc3RfZmlsZShzZWxmLCBudW1femVyb2VzLCB0YWlsKToKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnd2luJyBvciBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICByZXF1aXJlcygnbGFyZ2VmaWxlJywKKyAgICAgICAgICAgICAgICAndGVzdCByZXF1aXJlcyAlcyBieXRlcyBhbmQgYSBsb25nIHRpbWUgdG8gcnVuJyAlIHN0cigweDE4MDAwMDAwMCkpCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYuc2VlayhudW1femVyb2VzKQorICAgICAgICAgICAgZi53cml0ZSh0YWlsKQorICAgICAgICAgICAgZi5mbHVzaCgpCisgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgT3ZlcmZsb3dFcnJvcik6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJmaWxlc3lzdGVtIGRvZXMgbm90IGhhdmUgbGFyZ2VmaWxlIHN1cHBvcnQiKQorICAgICAgICByZXR1cm4gZgorCisgICAgZGVmIHRlc3RfbGFyZ2Vfb2Zmc2V0KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuX21ha2VfdGVzdF9maWxlKDB4MTRGRkZGRkZGLCBiIiAiKSBhcyBmOgorICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCAwLCBvZmZzZXQ9MHgxNDAwMDAwMDAsIGFjY2Vzcz1tbWFwLkFDQ0VTU19SRUFEKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVsweEZGRkZGRkZdLCBiIiAiKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBtLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2xhcmdlX2ZpbGVzaXplKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuX21ha2VfdGVzdF9maWxlKDB4MTdGRkZGRkZGLCBiIiAiKSBhcyBmOgorICAgICAgICAgICAgaWYgc3lzLm1heHNpemUgPCAweDE4MDAwMDAwMDoKKyAgICAgICAgICAgICAgICAjIE9uIDMyIGJpdCBwbGF0Zm9ybXMgdGhlIGZpbGUgaXMgbGFyZ2VyIHRoYW4gc3lzLm1heHNpemUgc28KKyAgICAgICAgICAgICAgICAjIG1hcHBpbmcgdGhlIHdob2xlIGZpbGUgc2hvdWxkIGZhaWwgLS0gSXNzdWUgIzE2NzQzCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yKToKKyAgICAgICAgICAgICAgICAgICAgbW1hcC5tbWFwKGYuZmlsZW5vKCksIDB4MTgwMDAwMDAwLCBhY2Nlc3M9bW1hcC5BQ0NFU1NfUkVBRCkKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMCwgYWNjZXNzPW1tYXAuQUNDRVNTX1JFQUQpCisgICAgICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDB4MTAwMDAsIGFjY2Vzcz1tbWFwLkFDQ0VTU19SRUFEKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5zaXplKCksIDB4MTgwMDAwMDAwKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBtLmNsb3NlKCkKKworICAgICMgSXNzdWUgMTEyNzc6IG1tYXAoKSB3aXRoIGxhcmdlICh+NEdCKSBzcGFyc2UgZmlsZXMgY3Jhc2hlcyBvbiBPUyBYLgorCisgICAgZGVmIF90ZXN0X2Fyb3VuZF9ib3VuZGFyeShzZWxmLCBib3VuZGFyeSk6CisgICAgICAgIHRhaWwgPSBiJyAgREVBUmRlYXIgICcKKyAgICAgICAgc3RhcnQgPSBib3VuZGFyeSAtIGxlbih0YWlsKSAvLyAyCisgICAgICAgIGVuZCA9IHN0YXJ0ICsgbGVuKHRhaWwpCisgICAgICAgIHdpdGggc2VsZi5fbWFrZV90ZXN0X2ZpbGUoc3RhcnQsIHRhaWwpIGFzIGY6CisgICAgICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDAsIGFjY2Vzcz1tbWFwLkFDQ0VTU19SRUFEKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVtzdGFydDplbmRdLCB0YWlsKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBtLmNsb3NlKCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5tYXhzaXplID4gXzRHLCAidGVzdCBjYW5ub3QgcnVuIG9uIDMyLWJpdCBzeXN0ZW1zIikKKyAgICBkZWYgdGVzdF9hcm91bmRfMkdCKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Fyb3VuZF9ib3VuZGFyeShfMkcpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMubWF4c2l6ZSA+IF80RywgInRlc3QgY2Fubm90IHJ1biBvbiAzMi1iaXQgc3lzdGVtcyIpCisgICAgZGVmIHRlc3RfYXJvdW5kXzRHQihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9hcm91bmRfYm91bmRhcnkoXzRHKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoTW1hcFRlc3RzLCBMYXJnZU1tYXBUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW1hcC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tbWFwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzg4NjViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW1hcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW1hcC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tbWFwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWZhZGIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW1hcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW9kdWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW9kdWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZWFmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tb2R1bGUucHkKQEAgLTAsMCArMSw4NSBAQAorIyBUZXN0IHRoZSBtb2R1bGUgdHlwZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGdjX2NvbGxlY3QKKworaW1wb3J0IHN5cworTW9kdWxlVHlwZSA9IHR5cGUoc3lzKQorCitjbGFzcyBNb2R1bGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfdW5pbml0aWFsaXplZChzZWxmKToKKyAgICAgICAgIyBBbiB1bmluaXRpYWxpemVkIG1vZHVsZSBoYXMgbm8gX19kaWN0X18gb3IgX19uYW1lX18sCisgICAgICAgICMgYW5kIF9fZG9jX18gaXMgTm9uZQorICAgICAgICBmb28gPSBNb2R1bGVUeXBlLl9fbmV3X18oTW9kdWxlVHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvby5fX2RpY3RfXyBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FcnJvciwgZGlyLCBmb28pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSBmb28uX19uYW1lX18KKyAgICAgICAgICAgIHNlbGYuZmFpbCgiX19uYW1lX18gPSAlcyIgJSByZXByKHMpKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLl9fZG9jX18sIE1vZHVsZVR5cGUuX19kb2NfXykKKworICAgIGRlZiB0ZXN0X25vX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBSZWd1bGFybHkgaW5pdGlhbGl6ZWQgbW9kdWxlLCBubyBkb2NzdHJpbmcKKyAgICAgICAgZm9vID0gTW9kdWxlVHlwZSgiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uX19uYW1lX18sICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5fX2RvY19fLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5fX2RpY3RfXywgeyJfX25hbWVfXyI6ICJmb28iLCAiX19kb2NfXyI6IE5vbmV9KQorCisgICAgZGVmIHRlc3RfYXNjaWlfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAjIEFTQ0lJIGRvY3N0cmluZworICAgICAgICBmb28gPSBNb2R1bGVUeXBlKCJmb28iLCAiZm9vZG9jIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uX19uYW1lX18sICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5fX2RvY19fLCAiZm9vZG9jIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uX19kaWN0X18sCisgICAgICAgICAgICAgICAgICAgICAgICAgeyJfX25hbWVfXyI6ICJmb28iLCAiX19kb2NfXyI6ICJmb29kb2MifSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAjIFVuaWNvZGUgZG9jc3RyaW5nCisgICAgICAgIGZvbyA9IE1vZHVsZVR5cGUoImZvbyIsIHUiZm9vZG9jXHUxMjM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uX19uYW1lX18sICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5fX2RvY19fLCB1ImZvb2RvY1x1MTIzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLl9fZGljdF9fLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsiX19uYW1lX18iOiAiZm9vIiwgIl9fZG9jX18iOiB1ImZvb2RvY1x1MTIzNCJ9KQorCisgICAgZGVmIHRlc3RfcmVpbml0KHNlbGYpOgorICAgICAgICAjIFJlaW5pdGlhbGl6YXRpb24gc2hvdWxkIG5vdCByZXBsYWNlIHRoZSBfX2RpY3RfXworICAgICAgICBmb28gPSBNb2R1bGVUeXBlKCJmb28iLCB1ImZvb2RvY1x1MTIzNCIpCisgICAgICAgIGZvby5iYXIgPSA0MgorICAgICAgICBkID0gZm9vLl9fZGljdF9fCisgICAgICAgIGZvby5fX2luaXRfXygiZm9vIiwgImZvb2RvYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLl9fbmFtZV9fLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uX19kb2NfXywgImZvb2RvYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLmJhciwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLl9fZGljdF9fLAorICAgICAgICAgICAgICB7Il9fbmFtZV9fIjogImZvbyIsICJfX2RvY19fIjogImZvb2RvYyIsICJiYXIiOiA0Mn0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb28uX19kaWN0X18gaXMgZCkKKworICAgIEB1bml0dGVzdC5leHBlY3RlZEZhaWx1cmUKKyAgICBkZWYgdGVzdF9kb250X2NsZWFyX2RpY3Qoc2VsZik6CisgICAgICAgICMgU2VlIGlzc3VlIDcxNDAuCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBmb28gPSBNb2R1bGVUeXBlKCJmb28iKQorICAgICAgICAgICAgZm9vLmJhciA9IDQKKyAgICAgICAgICAgIHJldHVybiBmb28KKyAgICAgICAgZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZigpLl9fZGljdF9fWyJiYXIiXSwgNCkKKworICAgIGRlZiB0ZXN0X2NsZWFyX2RpY3RfaW5fcmVmX2N5Y2xlKHNlbGYpOgorICAgICAgICBkZXN0cm95ZWQgPSBbXQorICAgICAgICBtID0gTW9kdWxlVHlwZSgiZm9vIikKKyAgICAgICAgbS5kZXN0cm95ZWQgPSBkZXN0cm95ZWQKKyAgICAgICAgcyA9ICIiImNsYXNzIEE6CisgICAgZGVmIF9fZGVsX18oc2VsZiwgZGVzdHJveWVkPWRlc3Ryb3llZCk6CisgICAgICAgIGRlc3Ryb3llZC5hcHBlbmQoMSkKK2EgPSBBKCkiIiIKKyAgICAgICAgZXhlYyhzLCBtLl9fZGljdF9fKQorICAgICAgICBkZWwgbQorICAgICAgICBnY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXN0cm95ZWQsIFsxXSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChNb2R1bGVUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW9kdWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21vZHVsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkYzk2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21vZHVsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW9kdWxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21vZHVsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkYzk2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21vZHVsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MWQxZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tb2R1bGVmaW5kZXIucHkKQEAgLTAsMCArMSwyODYgQEAKK2ltcG9ydCBfX2Z1dHVyZV9fCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGRpc3R1dGlscy5kaXJfdXRpbAoraW1wb3J0IHRlbXBmaWxlCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK3RyeTogc2V0CitleGNlcHQgTmFtZUVycm9yOiBmcm9tIHNldHMgaW1wb3J0IFNldCBhcyBzZXQKKworaW1wb3J0IG1vZHVsZWZpbmRlcgorCisjIE5vdGU6IFRvIHRlc3QgbW9kdWxlZmluZGVyIHdpdGggUHl0aG9uIDIuMiwgc2V0cy5weSBhbmQKKyMgbW9kdWxlZmluZGVyLnB5IG11c3QgYmUgYXZhaWxhYmxlIC0gdGhleSBhcmUgbm90IGluIHRoZSBzdGFuZGFyZAorIyBsaWJyYXJ5LgorCitURVNUX0RJUiA9IHRlbXBmaWxlLm1rZHRlbXAoKQorVEVTVF9QQVRIID0gW1RFU1RfRElSLCBvcy5wYXRoLmRpcm5hbWUoX19mdXR1cmVfXy5fX2ZpbGVfXyldCisKKyMgRWFjaCB0ZXN0IGRlc2NyaXB0aW9uIGlzIGEgbGlzdCBvZiA1IGl0ZW1zOgorIworIyAxLiBhIG1vZHVsZSBuYW1lIHRoYXQgd2lsbCBiZSBpbXBvcnRlZCBieSBtb2R1bGVmaW5kZXIKKyMgMi4gYSBsaXN0IG9mIG1vZHVsZSBuYW1lcyB0aGF0IG1vZHVsZWZpbmRlciBpcyByZXF1aXJlZCB0byBmaW5kCisjIDMuIGEgbGlzdCBvZiBtb2R1bGUgbmFtZXMgdGhhdCBtb2R1bGVmaW5kZXIgc2hvdWxkIGNvbXBsYWluCisjICAgIGFib3V0IGJlY2F1c2UgdGhleSBhcmUgbm90IGZvdW5kCisjIDQuIGEgbGlzdCBvZiBtb2R1bGUgbmFtZXMgdGhhdCBtb2R1bGVmaW5kZXIgc2hvdWxkIGNvbXBsYWluCisjICAgIGFib3V0IGJlY2F1c2UgdGhleSBNQVkgYmUgbm90IGZvdW5kCisjIDUuIGEgc3RyaW5nIHNwZWNpZnlpbmcgcGFja2FnZXMgdG8gY3JlYXRlOyB0aGUgZm9ybWF0IGlzIG9idmlvdXMgaW1vLgorIworIyBFYWNoIHBhY2thZ2Ugd2lsbCBiZSBjcmVhdGVkIGluIFRFU1RfRElSLCBhbmQgVEVTVF9ESVIgd2lsbCBiZQorIyByZW1vdmVkIGFmdGVyIHRoZSB0ZXN0cyBhZ2Fpbi4KKyMgTW9kdWxlZmluZGVyIHNlYXJjaGVzIGluIGEgcGF0aCB0aGF0IGNvbnRhaW5zIFRFU1RfRElSLCBwbHVzCisjIHRoZSBzdGFuZGFyZCBMaWIgZGlyZWN0b3J5LgorCittYXliZV90ZXN0ID0gWworICAgICJhLm1vZHVsZSIsCisgICAgWyJhIiwgImEubW9kdWxlIiwgInN5cyIsCisgICAgICJiIl0sCisgICAgWyJjIl0sIFsiYi5zb21ldGhpbmciXSwKKyAgICAiIiJcCithL19faW5pdF9fLnB5CithL21vZHVsZS5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGIgaW1wb3J0IHNvbWV0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGMgaW1wb3J0IHNvbWV0aGluZworYi9fX2luaXRfXy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHN5cyBpbXBvcnQgKgorIiIiXQorCittYXliZV90ZXN0X25ldyA9IFsKKyAgICAiYS5tb2R1bGUiLAorICAgIFsiYSIsICJhLm1vZHVsZSIsICJzeXMiLAorICAgICAiYiIsICJfX2Z1dHVyZV9fIl0sCisgICAgWyJjIl0sIFsiYi5zb21ldGhpbmciXSwKKyAgICAiIiJcCithL19faW5pdF9fLnB5CithL21vZHVsZS5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGIgaW1wb3J0IHNvbWV0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGMgaW1wb3J0IHNvbWV0aGluZworYi9fX2luaXRfXy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHN5cyBpbXBvcnQgKgorIiIiXQorCitwYWNrYWdlX3Rlc3QgPSBbCisgICAgImEubW9kdWxlIiwKKyAgICBbImEiLCAiYS5iIiwgImEuYyIsICJhLm1vZHVsZSIsICJteW1vZHVsZSIsICJzeXMiXSwKKyAgICBbImJsYWhibGFoIl0sIFtdLAorICAgICIiIlwKK215bW9kdWxlLnB5CithL19faW5pdF9fLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBibGFoYmxhaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGEgaW1wb3J0IGIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGMKK2EvbW9kdWxlLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBhIGltcG9ydCBiIGFzIHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBhLmMgaW1wb3J0IHNpbGx5bmFtZQorYS9iLnB5CithL2MucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBhLm1vZHVsZSBpbXBvcnQgeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgbXltb2R1bGUgYXMgc2lsbHluYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gc3lzIGltcG9ydCB2ZXJzaW9uX2luZm8KKyIiIl0KKworYWJzb2x1dGVfaW1wb3J0X3Rlc3QgPSBbCisgICAgImEubW9kdWxlIiwKKyAgICBbImEiLCAiYS5tb2R1bGUiLAorICAgICAiYiIsICJiLngiLCAiYi55IiwgImIueiIsCisgICAgICJfX2Z1dHVyZV9fIiwgInN5cyIsICJleGNlcHRpb25zIl0sCisgICAgWyJibGFoYmxhaCJdLCBbXSwKKyAgICAiIiJcCitteW1vZHVsZS5weQorYS9fX2luaXRfXy5weQorYS9tb2R1bGUucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHN5cyAjIHN5cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYmxhaGJsYWggIyBmYWlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgZXhjZXB0aW9ucyAjIGV4Y2VwdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGIueCAjIGIueAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGIgaW1wb3J0IHkgIyBiLnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBiLnogaW1wb3J0ICogIyBiLnouKgorYS9leGNlcHRpb25zLnB5CithL3N5cy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgbXltb2R1bGUKK2EvYi9fX2luaXRfXy5weQorYS9iL3gucHkKK2EvYi95LnB5CithL2Ivei5weQorYi9fX2luaXRfXy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgegorYi91bnVzZWQucHkKK2IveC5weQorYi95LnB5CitiL3oucHkKKyIiIl0KKworcmVsYXRpdmVfaW1wb3J0X3Rlc3QgPSBbCisgICAgImEubW9kdWxlIiwKKyAgICBbIl9fZnV0dXJlX18iLAorICAgICAiYSIsICJhLm1vZHVsZSIsCisgICAgICJhLmIiLCAiYS5iLnkiLCAiYS5iLnoiLAorICAgICAiYS5iLmMiLCAiYS5iLmMubW9kdWxlQyIsCisgICAgICJhLmIuYy5kIiwgImEuYi5jLmUiLAorICAgICAiYS5iLngiLAorICAgICAiZXhjZXB0aW9ucyJdLAorICAgIFtdLCBbXSwKKyAgICAiIiJcCitteW1vZHVsZS5weQorYS9fX2luaXRfXy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIC5iIGltcG9ydCB5LCB6ICMgYS5iLnksIGEuYi56CithL21vZHVsZS5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydCAjIF9fZnV0dXJlX18KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGV4Y2VwdGlvbnMgIyBleGNlcHRpb25zCithL2V4Y2VwdGlvbnMucHkKK2Evc3lzLnB5CithL2IvX19pbml0X18ucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAuLmIgaW1wb3J0IHggIyBhLmIueAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZnJvbSBhLmIuYyBpbXBvcnQgbW9kdWxlQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIC5jIGltcG9ydCBtb2R1bGVDICMgYS5iLm1vZHVsZUMKK2EvYi94LnB5CithL2IveS5weQorYS9iL3oucHkKK2EvYi9nLnB5CithL2IvYy9fX2luaXRfXy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIC4uYyBpbXBvcnQgZSAjIGEuYi5jLmUKK2EvYi9jL21vZHVsZUMucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAuLmMgaW1wb3J0IGQgIyBhLmIuYy5kCithL2IvYy9kLnB5CithL2IvYy9lLnB5CithL2IvYy94LnB5CisiIiJdCisKK3JlbGF0aXZlX2ltcG9ydF90ZXN0XzIgPSBbCisgICAgImEubW9kdWxlIiwKKyAgICBbImEiLCAiYS5tb2R1bGUiLAorICAgICAiYS5zeXMiLAorICAgICAiYS5iIiwgImEuYi55IiwgImEuYi56IiwKKyAgICAgImEuYi5jIiwgImEuYi5jLmQiLAorICAgICAiYS5iLmMuZSIsCisgICAgICJhLmIuYy5tb2R1bGVDIiwKKyAgICAgImEuYi5jLmYiLAorICAgICAiYS5iLngiLAorICAgICAiYS5hbm90aGVyIl0sCisgICAgW10sIFtdLAorICAgICIiIlwKK215bW9kdWxlLnB5CithL19faW5pdF9fLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgc3lzICMgYS5zeXMKK2EvYW5vdGhlci5weQorYS9tb2R1bGUucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAuYiBpbXBvcnQgeSwgeiAjIGEuYi55LCBhLmIuegorYS9leGNlcHRpb25zLnB5CithL3N5cy5weQorYS9iL19faW5pdF9fLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gLmMgaW1wb3J0IG1vZHVsZUMgIyBhLmIuYy5tb2R1bGVDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gLmMgaW1wb3J0IGQgIyBhLmIuYy5kCithL2IveC5weQorYS9iL3kucHkKK2EvYi96LnB5CithL2IvYy9fX2luaXRfXy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIC4gaW1wb3J0IGUgIyBhLmIuYy5lCithL2IvYy9tb2R1bGVDLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBmICAgIyBhLmIuYy5mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gLi4gaW1wb3J0IHggICMgYS5iLngKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAuLi4gaW1wb3J0IGFub3RoZXIgIyBhLmFub3RoZXIKK2EvYi9jL2QucHkKK2EvYi9jL2UucHkKK2EvYi9jL2YucHkKKyIiIl0KKworcmVsYXRpdmVfaW1wb3J0X3Rlc3RfMyA9IFsKKyAgICAiYS5tb2R1bGUiLAorICAgIFsiYSIsICJhLm1vZHVsZSJdLAorICAgIFsiYS5iYXIiXSwKKyAgICBbXSwKKyAgICAiIiJcCithL19faW5pdF9fLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBmb28oKTogcGFzcworYS9tb2R1bGUucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBmb28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBiYXIKKyIiIl0KKworZGVmIG9wZW5fZmlsZShwYXRoKToKKyAgICAjI3ByaW50ICIjIiwgb3MucGF0aC5hYnNwYXRoKHBhdGgpCisgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShwYXRoKQorICAgIGRpc3R1dGlscy5kaXJfdXRpbC5ta3BhdGgoZGlybmFtZSkKKyAgICByZXR1cm4gb3BlbihwYXRoLCAidyIpCisKK2RlZiBjcmVhdGVfcGFja2FnZShzb3VyY2UpOgorICAgIG9maSA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgIGZvciBsaW5lIGluIHNvdXJjZS5zcGxpdGxpbmVzKCk6CisgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIiAiKSBvciBsaW5lLnN0YXJ0c3dpdGgoIlx0Iik6CisgICAgICAgICAgICAgICAgb2ZpLndyaXRlKGxpbmUuc3RyaXAoKSArICJcbiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG9maToKKyAgICAgICAgICAgICAgICAgICAgb2ZpLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBvZmkgPSBvcGVuX2ZpbGUob3MucGF0aC5qb2luKFRFU1RfRElSLCBsaW5lLnN0cmlwKCkpKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIG9maToKKyAgICAgICAgICAgIG9maS5jbG9zZSgpCisKK2NsYXNzIE1vZHVsZUZpbmRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfZG9fdGVzdChzZWxmLCBpbmZvLCByZXBvcnQ9RmFsc2UpOgorICAgICAgICBpbXBvcnRfdGhpcywgbW9kdWxlcywgbWlzc2luZywgbWF5YmVfbWlzc2luZywgc291cmNlID0gaW5mbworICAgICAgICBjcmVhdGVfcGFja2FnZShzb3VyY2UpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1mID0gbW9kdWxlZmluZGVyLk1vZHVsZUZpbmRlcihwYXRoPVRFU1RfUEFUSCkKKyAgICAgICAgICAgIG1mLmltcG9ydF9ob29rKGltcG9ydF90aGlzKQorICAgICAgICAgICAgaWYgcmVwb3J0OgorICAgICAgICAgICAgICAgIG1mLnJlcG9ydCgpCisjIyAgICAgICAgICAgICAgICAjIFRoaXMgd291bGRuJ3Qgd29yayBpbiBnZW5lcmFsIHdoZW4gZXhlY3V0ZWQgc2V2ZXJhbCB0aW1lczoKKyMjICAgICAgICAgICAgICAgIG9wYXRoID0gc3lzLnBhdGhbOl0KKyMjICAgICAgICAgICAgICAgIHN5cy5wYXRoID0gVEVTVF9QQVRICisjIyAgICAgICAgICAgICAgICB0cnk6CisjIyAgICAgICAgICAgICAgICAgICAgX19pbXBvcnRfXyhpbXBvcnRfdGhpcykKKyMjICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyMjICAgICAgICAgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrOyB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyMjICAgICAgICAgICAgICAgIHN5cy5wYXRoID0gb3BhdGgKKyMjICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgbW9kdWxlcyA9IHNldChtb2R1bGVzKQorICAgICAgICAgICAgZm91bmQgPSBzZXQobWYubW9kdWxlcy5rZXlzKCkpCisgICAgICAgICAgICBtb3JlID0gbGlzdChmb3VuZCAtIG1vZHVsZXMpCisgICAgICAgICAgICBsZXNzID0gbGlzdChtb2R1bGVzIC0gZm91bmQpCisgICAgICAgICAgICAjIGNoZWNrIGlmIHdlIGZvdW5kIHdoYXQgd2UgZXhwZWN0ZWQsIG5vdCBtb3JlLCBub3QgbGVzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobW9yZSwgbGVzcyksIChbXSwgW10pKQorCisgICAgICAgICAgICAjIGNoZWNrIGZvciBtaXNzaW5nIGFuZCBtYXliZSBtaXNzaW5nIG1vZHVsZXMKKyAgICAgICAgICAgIGJhZCwgbWF5YmUgPSBtZi5hbnlfbWlzc2luZ19tYXliZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhZCwgbWlzc2luZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF5YmUsIG1heWJlX21pc3NpbmcpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkaXN0dXRpbHMuZGlyX3V0aWwucmVtb3ZlX3RyZWUoVEVTVF9ESVIpCisKKyAgICBkZWYgdGVzdF9wYWNrYWdlKHNlbGYpOgorICAgICAgICBzZWxmLl9kb190ZXN0KHBhY2thZ2VfdGVzdCkKKworICAgIGRlZiB0ZXN0X21heWJlKHNlbGYpOgorICAgICAgICBzZWxmLl9kb190ZXN0KG1heWJlX3Rlc3QpCisKKyAgICBpZiBnZXRhdHRyKF9fZnV0dXJlX18sICJhYnNvbHV0ZV9pbXBvcnQiLCBOb25lKToKKworICAgICAgICBkZWYgdGVzdF9tYXliZV9uZXcoc2VsZik6CisgICAgICAgICAgICBzZWxmLl9kb190ZXN0KG1heWJlX3Rlc3RfbmV3KQorCisgICAgICAgIGRlZiB0ZXN0X2Fic29sdXRlX2ltcG9ydHMoc2VsZik6CisgICAgICAgICAgICBzZWxmLl9kb190ZXN0KGFic29sdXRlX2ltcG9ydF90ZXN0KQorCisgICAgICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2ltcG9ydHMoc2VsZik6CisgICAgICAgICAgICBzZWxmLl9kb190ZXN0KHJlbGF0aXZlX2ltcG9ydF90ZXN0KQorCisgICAgICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2ltcG9ydHNfMihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX2RvX3Rlc3QocmVsYXRpdmVfaW1wb3J0X3Rlc3RfMikKKworICAgICAgICBkZWYgdGVzdF9yZWxhdGl2ZV9pbXBvcnRzXzMoc2VsZik6CisgICAgICAgICAgICBzZWxmLl9kb190ZXN0KHJlbGF0aXZlX2ltcG9ydF90ZXN0XzMpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBkaXN0dXRpbHMubG9nLnNldF90aHJlc2hvbGQoZGlzdHV0aWxzLmxvZy5XQVJOKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTW9kdWxlRmluZGVyVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21vZHVsZWZpbmRlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tb2R1bGVmaW5kZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNGE5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tb2R1bGVmaW5kZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21vZHVsZWZpbmRlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tb2R1bGVmaW5kZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNGE5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tb2R1bGVmaW5kZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21zaWxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21zaWxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDViMGM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXNpbGliLnB5CkBAIC0wLDAgKzEsNDYgQEAKKyIiIiBUZXN0IHN1aXRlIGZvciB0aGUgY29kZSBpbiBtc2lsaWIgIiIiCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworZnJvbSB0ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZQorbXNpbGliID0gaW1wb3J0X21vZHVsZSgnbXNpbGliJykKKworY2xhc3MgVGVzdF9tYWtlX2lkKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2FhMzY5MjEyKHY9dnMuODUpLmFzcHgKKyAgICAiIiJUaGUgSWRlbnRpZmllciBkYXRhIHR5cGUgaXMgYSB0ZXh0IHN0cmluZy4gSWRlbnRpZmllcnMgbWF5IGNvbnRhaW4gdGhlCisgICAgQVNDSUkgY2hhcmFjdGVycyBBLVogKGEteiksIGRpZ2l0cywgdW5kZXJzY29yZXMgKF8pLCBvciBwZXJpb2RzICguKS4KKyAgICBIb3dldmVyLCBldmVyeSBpZGVudGlmaWVyIG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgYSBsZXR0ZXIgb3IgYW4KKyAgICB1bmRlcnNjb3JlLgorICAgICIiIgorCisgICAgZGVmIHRlc3RfaXNfbm9fY2hhbmdlX3JlcXVpcmVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNpbGliLm1ha2VfaWQoInNob3J0IiksICJzaG9ydCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2lsaWIubWFrZV9pZCgibm9jaGFuZ2VyZXF1aXJlZCIpLCAibm9jaGFuZ2VyZXF1aXJlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2lsaWIubWFrZV9pZCgib25lLmRvdCIpLCAib25lLmRvdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2lsaWIubWFrZV9pZCgiXyIpLCAiXyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2lsaWIubWFrZV9pZCgiYSIpLCAiYSIpCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAjICAgIG1zaWxpYi5tYWtlX2lkKCIiKSwgIiIpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2ZpcnN0X2NoYXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2lsaWIubWFrZV9pZCgiOS5zaG9ydCIpLCAiXzkuc2hvcnQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNpbGliLm1ha2VfaWQoIi5zaG9ydCIpLCAiXy5zaG9ydCIpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2FueV9jaGFyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNpbGliLm1ha2VfaWQoIi5zXHg4Mm9ydCIpLCAiXy5zX29ydCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwgICAgKAorICAgICAgICAgICAgbXNpbGliLm1ha2VfaWQoIi5zXHg4Mm8/KitydCIpLCAiXy5zX29fX19ydCIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXNpbGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21zaWxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwMjQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21zaWxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXNpbGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21zaWxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUwMjQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21zaWxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTg2Y2EyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKQEAgLTAsMCArMSwyNzQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyB0ZXN0X211bHRpYnl0ZWNvZGVjLnB5CisjICAgVW5pdCB0ZXN0IGZvciBtdWx0aWJ5dGVjb2RlYyBpdHNlbGYKKyMKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTgoraW1wb3J0IHVuaXR0ZXN0LCBTdHJpbmdJTywgY29kZWNzLCBzeXMsIG9zCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjCisKK0FMTF9DSktFTkNPRElOR1MgPSBbCisjIF9jb2RlY3NfY24KKyAgICAnZ2IyMzEyJywgJ2diaycsICdnYjE4MDMwJywgJ2h6JywKKyMgX2NvZGVjc19oaworICAgICdiaWc1aGtzY3MnLAorIyBfY29kZWNzX2pwCisgICAgJ2NwOTMyJywgJ3NoaWZ0X2ppcycsICdldWNfanAnLCAnZXVjX2ppc3gwMjEzJywgJ3NoaWZ0X2ppc3gwMjEzJywKKyAgICAnZXVjX2ppc18yMDA0JywgJ3NoaWZ0X2ppc18yMDA0JywKKyMgX2NvZGVjc19rcgorICAgICdjcDk0OScsICdldWNfa3InLCAnam9oYWInLAorIyBfY29kZWNzX3R3CisgICAgJ2JpZzUnLCAnY3A5NTAnLAorIyBfY29kZWNzX2lzbzIwMjIKKyAgICAnaXNvMjAyMl9qcCcsICdpc28yMDIyX2pwXzEnLCAnaXNvMjAyMl9qcF8yJywgJ2lzbzIwMjJfanBfMjAwNCcsCisgICAgJ2lzbzIwMjJfanBfMycsICdpc28yMDIyX2pwX2V4dCcsICdpc28yMDIyX2tyJywKK10KKworY2xhc3MgVGVzdF9NdWx0aWJ5dGVDb2RlYyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9udWxsY29kaW5nKHNlbGYpOgorICAgICAgICBmb3IgZW5jIGluIEFMTF9DSktFTkNPRElOR1M6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmRlY29kZShlbmMpLCB1JycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJycsIGVuYyksIHUnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodScnLmVuY29kZShlbmMpLCAnJykKKworICAgIGRlZiB0ZXN0X3N0cl9kZWNvZGUoc2VsZik6CisgICAgICAgIGZvciBlbmMgaW4gQUxMX0NKS0VOQ09ESU5HUzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiY2QnLmVuY29kZShlbmMpLCAnYWJjZCcpCisKKyAgICBkZWYgdGVzdF9lcnJvcmNhbGxiYWNrX2xvbmdpbmRleChzZWxmKToKKyAgICAgICAgZGVjID0gY29kZWNzLmdldGRlY29kZXIoJ2V1Yy1rcicpCisgICAgICAgIG15cmVwbGFjZSAgPSBsYW1iZGEgZXhjOiAodScnLCBzeXMubWF4aW50KzEpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigndGVzdC5jamt0ZXN0JywgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsZVx4OTJoYW1ceDkzc3BhbScsICd0ZXN0LmNqa3Rlc3QnKQorCisgICAgZGVmIHRlc3RfY29kaW5nc3BlYyhzZWxmKToKKyAgICAgICAgZm9yIGVuYyBpbiBBTExfQ0pLRU5DT0RJTkdTOgorICAgICAgICAgICAgY29kZSA9ICcjIGNvZGluZzoge31cbicuZm9ybWF0KGVuYykKKyAgICAgICAgICAgIGV4ZWMgY29kZQorCisgICAgZGVmIHRlc3RfaW5pdF9zZWdmYXVsdChzZWxmKToKKyAgICAgICAgIyBidWcgIzMzMDU6IHRoaXMgdXNlZCB0byBzZWdmYXVsdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX211bHRpYnl0ZWNvZGVjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9tdWx0aWJ5dGVjb2RlYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIE5vbmUpCisKKworY2xhc3MgVGVzdF9JbmNyZW1lbnRhbEVuY29kZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc3RhdGVsZXNzKHNlbGYpOgorICAgICAgICAjIGNwOTQ5IGVuY29kZXIgaXNuJ3Qgc3RhdGVmdWwgYXQgYWxsLgorICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcignY3A5NDknKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdWQzMGNcdWM3NzRcdWMzNmMgXHViOWM4XHVjNzQ0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4YzZceGM0XHhjMFx4Y2NceGJkXHhlMyBceGI4XHhiNlx4YzBceGJiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTI2MDZcdTIyM2NcdTI2MDYnLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXHhhMVx4ZDlceGExXHhhZFx4YTFceGQ5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodScnLCBUcnVlKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodScnLCBGYWxzZSksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIucmVzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3N0YXRlZnVsKHNlbGYpOgorICAgICAgICAjIGppc3gwMjEzIGVuY29kZXIgaXMgc3RhdGVmdWwgZm9yIGEgZmV3IGNvZGVwb2ludHMuIGVnKQorICAgICAgICAjICAgVSswMEU2ID0+IEE5REMKKyAgICAgICAgIyAgIFUrMDBFNiBVKzAzMDAgPT4gQUJDNAorICAgICAgICAjICAgVSswMzAwID0+IEFCREMKKworICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcignamlzeDAyMTMnKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAwZTZcdTAzMDAnKSwgJ1x4YWJceGM0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDBlNicpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDMwMCcpLCAnXHhhYlx4YzQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMGU2JywgVHJ1ZSksICdceGE5XHhkYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAzMDAnKSwgJ1x4YWJceGRjJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMGU2JyksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKCcnLCBUcnVlKSwgJ1x4YTlceGRjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSgnJywgVHJ1ZSksICcnKQorCisgICAgZGVmIHRlc3Rfc3RhdGVmdWxfa2VlcF9idWZmZXIoc2VsZik6CisgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKCdqaXN4MDIxMycpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDBlNicpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBlbmNvZGVyLmVuY29kZSwgdSdcdTAxMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMzAwXHUwMGU2JyksICdceGFiXHhjNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgZW5jb2Rlci5lbmNvZGUsIHUnXHUwMTIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAzMDAnKSwgJ1x4YWJceGRjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDBlNicpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBlbmNvZGVyLmVuY29kZSwgdSdcdTAxMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnJywgVHJ1ZSksICdceGE5XHhkYycpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTU2NDAoc2VsZik6CisgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKCdzaGlmdC1qaXMnKSgnYmFja3NsYXNocmVwbGFjZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdceGZmJyksIGInXFx4ZmYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXG4nKSwgYidcbicpCisKK2NsYXNzIFRlc3RfSW5jcmVtZW50YWxEZWNvZGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2RiY3Moc2VsZik6CisgICAgICAgICMgY3A5NDkgZGVjb2RlciBpcyBzaW1wbGUgd2l0aCBvbmx5IDEgb3IgMiBieXRlcyBzZXF1ZW5jZXMuCisgICAgICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKCdjcDk0OScpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnXHhjNlx4YzRceGMwXHhjY1x4YmQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1x1ZDMwY1x1Yzc3NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ1x4ZTMgXHhiOFx4YjZceGMwXHhiYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXHVjMzZjIFx1YjljOFx1Yzc0NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJycpLCB1JycpCisKKyAgICBkZWYgdGVzdF9kYmNzX2tlZXBfYnVmZmVyKHNlbGYpOgorICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcignY3A5NDknKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ1x4YzZceGM0XHhjMCcpLCB1J1x1ZDMwYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgZGVjb2Rlci5kZWNvZGUsICcnLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdceGNjJyksIHUnXHVjNzc0JykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdceGM2XHhjNFx4YzAnKSwgdSdcdWQzMGMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRlY29kZXIuZGVjb2RlLCAnXHhjY1x4YmQnLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdceGNjJyksIHUnXHVjNzc0JykKKworICAgIGRlZiB0ZXN0X2lzbzIwMjIoc2VsZik6CisgICAgICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKCdpc28yMDIyLWpwJykoKQorICAgICAgICBFU0MgPSAnXHgxYicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZShFU0MgKyAnKCcpLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ0InLCBUcnVlKSwgdScnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKEVTQyArICckJyksIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnQkAkJyksIHUnXHU0ZTE2JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnQCRAJyksIHUnXHU0ZTE2JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnJCcsIFRydWUpLCB1J1x1NGUxNicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5yZXNldCgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdAJCcpLCB1J0AkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZShFU0MgKyAnJCcpLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgZGVjb2Rlci5kZWNvZGUsICcnLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdCQCQnKSwgdSdcdTRlMTYnKQorCitjbGFzcyBUZXN0X1N0cmVhbVJlYWRlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYnVnMTcyODQwMyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3BlbihURVNURk4sICd3Jykud3JpdGUoJ1x4YTEnKQorICAgICAgICAgICAgZiA9IGNvZGVjcy5vcGVuKFRFU1RGTiwgZW5jb2Rpbmc9J2NwOTQ5JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgZi5yZWFkLCAyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OiBmLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKworY2xhc3MgVGVzdF9TdHJlYW1Xcml0ZXIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGlmIGxlbih1J1xVMDAwMTIzNDUnKSA9PSAyOiAjIFVDUzIKKyAgICAgICAgZGVmIHRlc3RfZ2IxODAzMChzZWxmKToKKyAgICAgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBjID0gY29kZWNzLmdldHdyaXRlcignZ2IxODAzMCcpKHMpCisgICAgICAgICAgICBjLndyaXRlKHUnMTIzJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzJykKKyAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzXHg5MDdceDk1OScpCisgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NSdbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyM1x4OTA3XHg5NTknKQorICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnWzFdICsgdSdcVTAwMDEyMzQ1JyArIHUnXHVhYzAwXHUwMGFjJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAnMTIzXHg5MDdceDk1OVx4OTA3XHg5NTlceDkwN1x4OTU5XHg4MjdceGNmNVx4ODEwXHg4NTEnKQorICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICcxMjNceDkwN1x4OTU5XHg5MDdceDk1OVx4OTA3XHg5NTlceDgyN1x4Y2Y1XHg4MTBceDg1MScpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGMucmVzZXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgJzEyM1x4OTA3XHg5NTlceDkwN1x4OTU5XHg5MDdceDk1OVx4ODI3XHhjZjVceDgxMFx4ODUxJykKKworICAgICAgICBkZWYgdGVzdF91dGZfOChzZWxmKToKKyAgICAgICAgICAgIHM9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIGMgPSBjb2RlY3MuZ2V0d3JpdGVyKCd1dGYtOCcpKHMpCisgICAgICAgICAgICBjLndyaXRlKHUnMTIzJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzJykKKyAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzXHhmMFx4OTJceDhkXHg4NScpCisKKyAgICAgICAgICAgICMgUHl0aG9uIHV0Zi04IGNvZGVjIGNhbid0IGJ1ZmZlciBzdXJyb2dhdGUgcGFpcnMgeWV0LgorICAgICAgICAgICAgaWYgMDoKKyAgICAgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NSdbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcxMjNceGYwXHg5Mlx4OGRceDg1JykKKyAgICAgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NSdbMV0gKyB1J1xVMDAwMTIzNDUnICsgdSdcdWFjMDBcdTAwYWMnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAnMTIzXHhmMFx4OTJceDhkXHg4NVx4ZjBceDkyXHg4ZFx4ODVceGYwXHg5Mlx4OGRceDg1JworICAgICAgICAgICAgICAgICAgICAnXHhlYVx4YjBceDgwXHhjMlx4YWMnKQorICAgICAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1J1swXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgJzEyM1x4ZjBceDkyXHg4ZFx4ODVceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NScKKyAgICAgICAgICAgICAgICAgICAgJ1x4ZWFceGIwXHg4MFx4YzJceGFjJykKKyAgICAgICAgICAgICAgICBjLnJlc2V0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgJzEyM1x4ZjBceDkyXHg4ZFx4ODVceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NScKKyAgICAgICAgICAgICAgICAgICAgJ1x4ZWFceGIwXHg4MFx4YzJceGFjXHhlZFx4YTBceDg4JykKKyAgICAgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NSdbMV0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICcxMjNceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NVx4ZjBceDkyXHg4ZFx4ODUnCisgICAgICAgICAgICAgICAgICAgICdceGVhXHhiMFx4ODBceGMyXHhhY1x4ZWRceGEwXHg4OFx4ZWRceGJkXHg4NScpCisKKyAgICBlbHNlOiAjIFVDUzQKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3Rfc3RyZWFtd3JpdGVyX3N0cndyaXRlKHNlbGYpOgorICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICB3ciA9IGNvZGVjcy5nZXR3cml0ZXIoJ2diMTgwMzAnKShzKQorICAgICAgICB3ci53cml0ZSgnYWJjZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnYWJjZCcpCisKK2NsYXNzIFRlc3RfSVNPMjAyMih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZzIoc2VsZik6CisgICAgICAgIGlzbzIwMjJqcDIgPSAnXHgxYihCOmh1NDp1bml0XHgxYi5BXHgxYk5pIGRlIGZhbWlsbGUnCisgICAgICAgIHVuaSA9IHUnOmh1NDp1bml0XHhlOSBkZSBmYW1pbGxlJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzbzIwMjJqcDIuZGVjb2RlKCdpc28yMDIyLWpwLTInKSwgdW5pKQorCisgICAgZGVmIHRlc3RfaXNvMjAyMl9qcF9nMChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignXHgwZScsIHUnXE57U09GVCBIWVBIRU59Jy5lbmNvZGUoJ2lzby0yMDIyLWpwLTInKSkKKyAgICAgICAgZm9yIGVuY29kaW5nIGluICgnaXNvLTIwMjItanAtMjAwNCcsICdpc28tMjAyMi1qcC0zJyk6CisgICAgICAgICAgICBlID0gdSdcdTM0MDYnLmVuY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmlsdGVyKGxhbWJkYSB4OiB4ID49ICdceDgwJywgZSkpCisKKyAgICBkZWYgdGVzdF9idWcxNTcyODMyKHNlbGYpOgorICAgICAgICBpZiBzeXMubWF4dW5pY29kZSA+PSAweDEwMDAwOgorICAgICAgICAgICAgbXl1bmljaHIgPSB1bmljaHIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG15dW5pY2hyID0gbGFtYmRhIHg6IHVuaWNocigweEQ3QzArKHg+PjEwKSkgKyB1bmljaHIoMHhEQzAwKyh4JjB4M0ZGKSkKKworICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoMHgxMDAwMCwgMHgxMTAwMDApOgorICAgICAgICAgICAgIyBBbnkgSVNPIDIwMjIgY29kZWMgd2lsbCBjYXVzZSB0aGUgc2VnZmF1bHQKKyAgICAgICAgICAgIG15dW5pY2hyKHgpLmVuY29kZSgnaXNvXzIwMjJfanAnLCAnaWdub3JlJykKKworY2xhc3MgVGVzdFN0YXRlZnVsKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICB0ZXh0ID0gdSdcdTRFMTZcdTRFMTYnCisgICAgZW5jb2RpbmcgPSAnaXNvLTIwMjItanAnCisgICAgZXhwZWN0ZWQgPSBiJ1x4MWIkQkAkQCQnCisgICAgZXhwZWN0ZWRfcmVzZXQgPSBiJ1x4MWIkQkAkQCRceDFiKEInCisKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ZXh0LmVuY29kZShzZWxmLmVuY29kaW5nKSwgc2VsZi5leHBlY3RlZF9yZXNldCkKKworICAgIGRlZiB0ZXN0X2luY3JlbWVudGFsZW5jb2RlcihzZWxmKToKKyAgICAgICAgZW5jb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGVuY29kZXIoc2VsZi5lbmNvZGluZykoKQorICAgICAgICBvdXRwdXQgPSBiJycuam9pbigKKyAgICAgICAgICAgIGVuY29kZXIuZW5jb2RlKGNoYXIpCisgICAgICAgICAgICBmb3IgY2hhciBpbiBzZWxmLnRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LCBzZWxmLmV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfaW5jcmVtZW50YWxlbmNvZGVyX2ZpbmFsKHNlbGYpOgorICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcihzZWxmLmVuY29kaW5nKSgpCisgICAgICAgIGxhc3RfaW5kZXggPSBsZW4oc2VsZi50ZXh0KSAtIDEKKyAgICAgICAgb3V0cHV0ID0gYicnLmpvaW4oCisgICAgICAgICAgICBlbmNvZGVyLmVuY29kZShjaGFyLCBpbmRleCA9PSBsYXN0X2luZGV4KQorICAgICAgICAgICAgZm9yIGluZGV4LCBjaGFyIGluIGVudW1lcmF0ZShzZWxmLnRleHQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dCwgc2VsZi5leHBlY3RlZF9yZXNldCkKKworY2xhc3MgVGVzdEhaU3RhdGVmdWwoVGVzdFN0YXRlZnVsKToKKyAgICB0ZXh0ID0gdSdcdTgwNGFcdTgwNGEnCisgICAgZW5jb2RpbmcgPSAnaHonCisgICAgZXhwZWN0ZWQgPSBiJ357QURBRCcKKyAgICBleHBlY3RlZF9yZXNldCA9IGInfntBREFEfn0nCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1ZWUyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1ZWUyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmEyZTUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weQpAQCAtMCwwICsxLDM3NCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weQorIyAgIENvbW1vbiBVbml0dGVzdCBSb3V0aW5lcyBmb3IgQ0pLIGNvZGVjcworIworCitpbXBvcnQgY29kZWNzCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGh0dHBsaWIgaW1wb3J0IEhUVFBFeGNlcHRpb24KK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitjbGFzcyBUZXN0QmFzZToKKyAgICBlbmNvZGluZyAgICAgICAgPSAnJyAgICMgY29kZWMgbmFtZQorICAgIGNvZGVjICAgICAgICAgICA9IE5vbmUgIyBjb2RlYyB0dXBsZSAod2l0aCA0IGVsZW1lbnRzKQorICAgIHRzdHJpbmcgICAgICAgICA9ICcnICAgIyBzdHJpbmcgdG8gdGVzdCBTdHJlYW1SZWFkZXIKKworICAgIGNvZGVjdGVzdHMgICAgICA9IE5vbmUgIyBtdXN0IHNldC4gY29kZWMgdGVzdCB0dXBsZQorICAgIHJvdW5kdHJpcHRlc3QgICA9IDEgICAgIyBzZXQgaWYgcm91bmR0cmlwIGlzIHBvc3NpYmxlIHdpdGggdW5pY29kZQorICAgIGhhc19pc28xMDY0NiAgICA9IDAgICAgIyBzZXQgaWYgdGhpcyBlbmNvZGluZyBjb250YWlucyB3aG9sZSBpc28xMDY0NiBtYXAKKyAgICB4bWxjaGFybmFtZXRlc3QgPSBOb25lICMgc3RyaW5nIHRvIHRlc3QgeG1sY2hhcnJlZnJlcGxhY2UKKyAgICB1bm1hcHBlZHVuaWNvZGUgPSB1J1x1ZGVlZScgIyBhIHVuaWNvZGUgY29kZXBvaW50IHRoYXQgaXMgbm90IG1hcHBlZC4KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jb2RlYyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jb2RlYyA9IGNvZGVjcy5sb29rdXAoc2VsZi5lbmNvZGluZykKKyAgICAgICAgc2VsZi5lbmNvZGUgPSBzZWxmLmNvZGVjLmVuY29kZQorICAgICAgICBzZWxmLmRlY29kZSA9IHNlbGYuY29kZWMuZGVjb2RlCisgICAgICAgIHNlbGYucmVhZGVyID0gc2VsZi5jb2RlYy5zdHJlYW1yZWFkZXIKKyAgICAgICAgc2VsZi53cml0ZXIgPSBzZWxmLmNvZGVjLnN0cmVhbXdyaXRlcgorICAgICAgICBzZWxmLmluY3JlbWVudGFsZW5jb2RlciA9IHNlbGYuY29kZWMuaW5jcmVtZW50YWxlbmNvZGVyCisgICAgICAgIHNlbGYuaW5jcmVtZW50YWxkZWNvZGVyID0gc2VsZi5jb2RlYy5pbmNyZW1lbnRhbGRlY29kZXIKKworICAgIGRlZiB0ZXN0X2NodW5rY29kaW5nKHNlbGYpOgorICAgICAgICBmb3IgbmF0aXZlLCB1dGY4IGluIHppcCgqW1N0cmluZ0lPKGYpLnJlYWRsaW5lcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gc2VsZi50c3RyaW5nXSk6CisgICAgICAgICAgICB1ID0gc2VsZi5kZWNvZGUobmF0aXZlKVswXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCB1dGY4LmRlY29kZSgndXRmLTgnKSkKKyAgICAgICAgICAgIGlmIHNlbGYucm91bmR0cmlwdGVzdDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hdGl2ZSwgc2VsZi5lbmNvZGUodSlbMF0pCisKKyAgICBkZWYgdGVzdF9lcnJvcmhhbmRsZShzZWxmKToKKyAgICAgICAgZm9yIHNvdXJjZSwgc2NoZW1lLCBleHBlY3RlZCBpbiBzZWxmLmNvZGVjdGVzdHM6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNvdXJjZSwgYnl0ZXMpOgorICAgICAgICAgICAgICAgIGZ1bmMgPSBzZWxmLmRlY29kZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmdW5jID0gc2VsZi5lbmNvZGUKKyAgICAgICAgICAgIGlmIGV4cGVjdGVkOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMoc291cmNlLCBzY2hlbWUpWzBdCisgICAgICAgICAgICAgICAgaWYgZnVuYyBpcyBzZWxmLmRlY29kZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocmVzdWx0KSBpcyB1bmljb2RlLCB0eXBlKHJlc3VsdCkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIuZGVjb2RlKCVyLCAlcik9JXIgIT0gJXInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc291cmNlLCBzZWxmLmVuY29kaW5nLCBzY2hlbWUsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocmVzdWx0KSBpcyBieXRlcywgdHlwZShyZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyLmVuY29kZSglciwgJXIpPSVyICE9ICVyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNvdXJjZSwgc2VsZi5lbmNvZGluZywgc2NoZW1lLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGZ1bmMsIHNvdXJjZSwgc2NoZW1lKQorCisgICAgZGVmIHRlc3RfeG1sY2hhcnJlZnJlcGxhY2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFzX2lzbzEwNjQ2OgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcyA9IHUiXHUwYjEzXHUwYjIzXHUwYjYwIG5kIGVnZ3MiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLmVuY29kZShzLCAieG1sY2hhcnJlZnJlcGxhY2UiKVswXSwKKyAgICAgICAgICAgICImIzI4MzU7JiMyODUxOyYjMjkxMjsgbmQgZWdncyIKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfY3VzdG9tcmVwbGFjZV9lbmNvZGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFzX2lzbzEwNjQ2OgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZnJvbSBodG1sZW50aXR5ZGVmcyBpbXBvcnQgY29kZXBvaW50Mm5hbWUKKworICAgICAgICBkZWYgeG1sY2hhcm5hbWVyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIFVuaWNvZGVFbmNvZGVFcnJvcik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJXIiICUgZXhjKQorICAgICAgICAgICAgbCA9IFtdCisgICAgICAgICAgICBmb3IgYyBpbiBleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuZW5kXToKKyAgICAgICAgICAgICAgICBpZiBvcmQoYykgaW4gY29kZXBvaW50Mm5hbWU6CisgICAgICAgICAgICAgICAgICAgIGwuYXBwZW5kKHUiJiVzOyIgJSBjb2RlcG9pbnQybmFtZVtvcmQoYyldKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGwuYXBwZW5kKHUiJiMlZDsiICUgb3JkKGMpKQorICAgICAgICAgICAgcmV0dXJuICh1IiIuam9pbihsKSwgZXhjLmVuZCkKKworICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QueG1sY2hhcm5hbWVyZXBsYWNlIiwgeG1sY2hhcm5hbWVyZXBsYWNlKQorCisgICAgICAgIGlmIHNlbGYueG1sY2hhcm5hbWV0ZXN0OgorICAgICAgICAgICAgc2luLCBzb3V0ID0gc2VsZi54bWxjaGFybmFtZXRlc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNpbiA9IHUiXHhhYlx1MjExY1x4YmIgPSBcdTIzMjlcdTEyMzRcdTIzMmEiCisgICAgICAgICAgICBzb3V0ID0gIiZsYXF1bzsmcmVhbDsmcmFxdW87ID0gJmxhbmc7JiM0NjYwOyZyYW5nOyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuY29kZShzaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdC54bWxjaGFybmFtZXJlcGxhY2UiKVswXSwgc291dCkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX3dyb25nX29iamVjdHMoc2VsZik6CisgICAgICAgIGRlZiBteXJlcGxhY2UoZXhjKToKKyAgICAgICAgICAgIHJldHVybiAocmV0LCBleGMuZW5kKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuY2prdGVzdCIsIG15cmVwbGFjZSkKKworICAgICAgICBmb3IgcmV0IGluIChbMSwgMiwgM10sIFtdLCBOb25lLCBvYmplY3QoKSwgJ3N0cmluZycsICcnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5lbmNvZGUsIHNlbGYudW5tYXBwZWR1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19sb25nX2luZGV4KHNlbGYpOgorICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUneCcsIGxvbmcoZXhjLmVuZCkpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5jb2RlKHUnYWJjZCcgKyBzZWxmLnVubWFwcGVkdW5pY29kZSArIHUnZWZnaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpLCAoJ2FiY2R4ZWZnaCcsIDkpKQorCisgICAgICAgIGRlZiBteXJlcGxhY2UoZXhjKToKKyAgICAgICAgICAgIHJldHVybiAodSd4Jywgc3lzLm1heGludCArIDEpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBzZWxmLmVuY29kZSwgc2VsZi51bm1hcHBlZHVuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LmNqa3Rlc3QnKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfTm9uZV9pbmRleChzZWxmKToKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgcmV0dXJuICh1J3gnLCBOb25lKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuY2prdGVzdCIsIG15cmVwbGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmVuY29kZSwgc2VsZi51bm1hcHBlZHVuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LmNqa3Rlc3QnKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfYmFja3dhcmRfaW5kZXgoc2VsZik6CisgICAgICAgIGRlZiBteXJlcGxhY2UoZXhjKToKKyAgICAgICAgICAgIGlmIG15cmVwbGFjZS5saW1pdCA+IDA6CisgICAgICAgICAgICAgICAgbXlyZXBsYWNlLmxpbWl0IC09IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gKHUnUkVQTEFDRUQnLCAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKHUnVEVSTUlOQUwnLCBleGMuZW5kKQorICAgICAgICBteXJlcGxhY2UubGltaXQgPSAzCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5jb2RlKHUnYWJjZCcgKyBzZWxmLnVubWFwcGVkdW5pY29kZSArIHUnZWZnaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpLAorICAgICAgICAgICAgICAgICgnYWJjZFJFUExBQ0VEYWJjZFJFUExBQ0VEYWJjZFJFUExBQ0VEYWJjZFRFUk1JTkFMZWZnaCcsIDkpKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfZm9yd2FyZF9pbmRleChzZWxmKToKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgcmV0dXJuICh1J1JFUExBQ0VEJywgZXhjLmVuZCArIDIpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW5jb2RlKHUnYWJjZCcgKyBzZWxmLnVubWFwcGVkdW5pY29kZSArIHUnZWZnaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpLCAoJ2FiY2RSRVBMQUNFRGdoJywgOSkpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19pbmRleF9vdXRvZmJvdW5kKHNlbGYpOgorICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUnVEVSTScsIDEwMCkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHNlbGYuZW5jb2RlLCBzZWxmLnVubWFwcGVkdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuY2prdGVzdCcpCisKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRhbGVuY29kZXIoc2VsZik6CisgICAgICAgIFVURjhSZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpCisgICAgICAgIGZvciBzaXplaGludCBpbiBbTm9uZV0gKyByYW5nZSgxLCAzMykgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICBbNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjRdOgorICAgICAgICAgICAgaXN0cmVhbSA9IFVURjhSZWFkZXIoU3RyaW5nSU8oc2VsZi50c3RyaW5nWzFdKSkKKyAgICAgICAgICAgIG9zdHJlYW0gPSBTdHJpbmdJTygpCisgICAgICAgICAgICBlbmNvZGVyID0gc2VsZi5pbmNyZW1lbnRhbGVuY29kZXIoKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBpZiBzaXplaGludCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGlzdHJlYW0ucmVhZChzaXplaGludCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gaXN0cmVhbS5yZWFkKCkKKworICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGUgPSBlbmNvZGVyLmVuY29kZShkYXRhKQorICAgICAgICAgICAgICAgIG9zdHJlYW0ud3JpdGUoZSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvc3RyZWFtLmdldHZhbHVlKCksIHNlbGYudHN0cmluZ1swXSkKKworICAgIGRlZiB0ZXN0X2luY3JlbWVudGFsZGVjb2RlcihzZWxmKToKKyAgICAgICAgVVRGOFdyaXRlciA9IGNvZGVjcy5nZXR3cml0ZXIoJ3V0Zi04JykKKyAgICAgICAgZm9yIHNpemVoaW50IGluIFtOb25lLCAtMV0gKyByYW5nZSgxLCAzMykgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICBbNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjRdOgorICAgICAgICAgICAgaXN0cmVhbSA9IFN0cmluZ0lPKHNlbGYudHN0cmluZ1swXSkKKyAgICAgICAgICAgIG9zdHJlYW0gPSBVVEY4V3JpdGVyKFN0cmluZ0lPKCkpCisgICAgICAgICAgICBkZWNvZGVyID0gc2VsZi5pbmNyZW1lbnRhbGRlY29kZXIoKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBkYXRhID0gaXN0cmVhbS5yZWFkKHNpemVoaW50KQorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHUgPSBkZWNvZGVyLmRlY29kZShkYXRhKQorICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKHUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3N0cmVhbS5nZXR2YWx1ZSgpLCBzZWxmLnRzdHJpbmdbMV0pCisKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRhbGVuY29kZXJfZXJyb3JfY2FsbGJhY2soc2VsZik6CisgICAgICAgIGludiA9IHNlbGYudW5tYXBwZWR1bmljb2RlCisKKyAgICAgICAgZSA9IHNlbGYuaW5jcmVtZW50YWxlbmNvZGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBlLmVuY29kZSwgaW52LCBUcnVlKQorCisgICAgICAgIGUuZXJyb3JzID0gJ2lnbm9yZScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmVuY29kZShpbnYsIFRydWUpLCAnJykKKworICAgICAgICBlLnJlc2V0KCkKKyAgICAgICAgZGVmIHRlbXByZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUnY2FsbGVkJywgZXhjLmVuZCkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCd0ZXN0LmluY3JlbWVudGFsX2Vycm9yX2NhbGxiYWNrJywgdGVtcHJlcGxhY2UpCisgICAgICAgIGUuZXJyb3JzID0gJ3Rlc3QuaW5jcmVtZW50YWxfZXJyb3JfY2FsbGJhY2snCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lbmNvZGUoaW52LCBUcnVlKSwgJ2NhbGxlZCcpCisKKyAgICAgICAgIyBhZ2FpbgorICAgICAgICBlLmVycm9ycyA9ICdpZ25vcmUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lbmNvZGUoaW52LCBUcnVlKSwgJycpCisKKyAgICBkZWYgdGVzdF9zdHJlYW1yZWFkZXIoc2VsZik6CisgICAgICAgIFVURjhXcml0ZXIgPSBjb2RlY3MuZ2V0d3JpdGVyKCd1dGYtOCcpCisgICAgICAgIGZvciBuYW1lIGluIFsicmVhZCIsICJyZWFkbGluZSIsICJyZWFkbGluZXMiXToKKyAgICAgICAgICAgIGZvciBzaXplaGludCBpbiBbTm9uZSwgLTFdICsgcmFuZ2UoMSwgMzMpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs2NCwgMTI4LCAyNTYsIDUxMiwgMTAyNF06CisgICAgICAgICAgICAgICAgaXN0cmVhbSA9IHNlbGYucmVhZGVyKFN0cmluZ0lPKHNlbGYudHN0cmluZ1swXSkpCisgICAgICAgICAgICAgICAgb3N0cmVhbSA9IFVURjhXcml0ZXIoU3RyaW5nSU8oKSkKKyAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihpc3RyZWFtLCBuYW1lKQorICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmdW5jKHNpemVoaW50KQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gInJlYWRsaW5lcyI6CisgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlbGluZXMoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0ud3JpdGUoZGF0YSkKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3N0cmVhbS5nZXR2YWx1ZSgpLCBzZWxmLnRzdHJpbmdbMV0pCisKKyAgICBkZWYgdGVzdF9zdHJlYW13cml0ZXIoc2VsZik6CisgICAgICAgIHJlYWRmdW5jcyA9ICgncmVhZCcsICdyZWFkbGluZScsICdyZWFkbGluZXMnKQorICAgICAgICBVVEY4UmVhZGVyID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKQorICAgICAgICBmb3IgbmFtZSBpbiByZWFkZnVuY3M6CisgICAgICAgICAgICBmb3Igc2l6ZWhpbnQgaW4gW05vbmVdICsgcmFuZ2UoMSwgMzMpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs2NCwgMTI4LCAyNTYsIDUxMiwgMTAyNF06CisgICAgICAgICAgICAgICAgaXN0cmVhbSA9IFVURjhSZWFkZXIoU3RyaW5nSU8oc2VsZi50c3RyaW5nWzFdKSkKKyAgICAgICAgICAgICAgICBvc3RyZWFtID0gc2VsZi53cml0ZXIoU3RyaW5nSU8oKSkKKyAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihpc3RyZWFtLCBuYW1lKQorICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgIGlmIHNpemVoaW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGZ1bmMoc2l6ZWhpbnQpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZnVuYygpCisKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBpZiBuYW1lID09ICJyZWFkbGluZXMiOgorICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZWxpbmVzKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKGRhdGEpCisKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zdHJlYW0uZ2V0dmFsdWUoKSwgc2VsZi50c3RyaW5nWzBdKQorCitjbGFzcyBUZXN0QmFzZV9NYXBwaW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBwYXNzX2VuY3Rlc3QgPSBbXQorICAgIHBhc3NfZGVjdGVzdCA9IFtdCisgICAgc3VwbWFwcyA9IFtdCisgICAgY29kZWN0ZXN0cyA9IFtdCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5vcGVuX21hcHBpbmdfZmlsZSgpLmNsb3NlKCkgIyB0ZXN0IGl0IHRvIHJlcG9ydCB0aGUgZXJyb3IgZWFybHkKKyAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBIVFRQRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIkNvdWxkIG5vdCByZXRyaWV2ZSAiK3NlbGYubWFwZmlsZXVybCkKKworICAgIGRlZiBvcGVuX21hcHBpbmdfZmlsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHRlc3Rfc3VwcG9ydC5vcGVuX3VybHJlc291cmNlKHNlbGYubWFwZmlsZXVybCkKKworICAgIGRlZiB0ZXN0X21hcHBpbmdfZmlsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5tYXBmaWxldXJsLmVuZHN3aXRoKCcueG1sJyk6CisgICAgICAgICAgICBzZWxmLl90ZXN0X21hcHBpbmdfZmlsZV91Y20oKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9tYXBwaW5nX2ZpbGVfcGxhaW4oKQorCisgICAgZGVmIF90ZXN0X21hcHBpbmdfZmlsZV9wbGFpbihzZWxmKToKKyAgICAgICAgX3VuaWNociA9IGxhbWJkYSBjOiBldmFsKCJ1J1xcVSUwOHgnIiAlIGludChjLCAxNikpCisgICAgICAgIHVuaWNocnMgPSBsYW1iZGEgczogdScnLmpvaW4oX3VuaWNocihjKSBmb3IgYyBpbiBzLnNwbGl0KCcrJykpCisgICAgICAgIHVydF93YSA9IHt9CisKKyAgICAgICAgd2l0aCBzZWxmLm9wZW5fbWFwcGluZ19maWxlKCkgYXMgZjoKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZGF0YSA9IGxpbmUuc3BsaXQoJyMnKVswXS5zdHJpcCgpLnNwbGl0KCkKKyAgICAgICAgICAgICAgICBpZiBsZW4oZGF0YSkgIT0gMjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGNzZXR2YWwgPSBldmFsKGRhdGFbMF0pCisgICAgICAgICAgICAgICAgaWYgY3NldHZhbCA8PSAweDdGOgorICAgICAgICAgICAgICAgICAgICBjc2V0Y2ggPSBjaHIoY3NldHZhbCAmIDB4ZmYpCisgICAgICAgICAgICAgICAgZWxpZiBjc2V0dmFsID49IDB4MTAwMDAwMDoKKyAgICAgICAgICAgICAgICAgICAgY3NldGNoID0gY2hyKGNzZXR2YWwgPj4gMjQpICsgY2hyKChjc2V0dmFsID4+IDE2KSAmIDB4ZmYpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHIoKGNzZXR2YWwgPj4gOCkgJiAweGZmKSArIGNocihjc2V0dmFsICYgMHhmZikKKyAgICAgICAgICAgICAgICBlbGlmIGNzZXR2YWwgPj0gMHgxMDAwMDoKKyAgICAgICAgICAgICAgICAgICAgY3NldGNoID0gY2hyKGNzZXR2YWwgPj4gMTYpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHIoKGNzZXR2YWwgPj4gOCkgJiAweGZmKSArIGNocihjc2V0dmFsICYgMHhmZikKKyAgICAgICAgICAgICAgICBlbGlmIGNzZXR2YWwgPj0gMHgxMDA6CisgICAgICAgICAgICAgICAgICAgIGNzZXRjaCA9IGNocihjc2V0dmFsID4+IDgpICsgY2hyKGNzZXR2YWwgJiAweGZmKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICB1bmljaCA9IHVuaWNocnMoZGF0YVsxXSkKKyAgICAgICAgICAgICAgICBpZiB1bmljaCA9PSB1J1x1ZmZmZCcgb3IgdW5pY2ggaW4gdXJ0X3dhOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHVydF93YVt1bmljaF0gPSBjc2V0Y2gKKworICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3Rwb2ludChjc2V0Y2gsIHVuaWNoKQorCisgICAgZGVmIF90ZXN0X21hcHBpbmdfZmlsZV91Y20oc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5vcGVuX21hcHBpbmdfZmlsZSgpIGFzIGY6CisgICAgICAgICAgICB1Y21kYXRhID0gZi5yZWFkKCkKKyAgICAgICAgdWMgPSByZS5maW5kYWxsKCc8YSB1PSIoW0EtRjAtOV17NH0pIiBiPSIoWzAtOUEtRiBdKykiLz4nLCB1Y21kYXRhKQorICAgICAgICBmb3IgdW5pLCBjb2RlZCBpbiB1YzoKKyAgICAgICAgICAgIHVuaWNoID0gdW5pY2hyKGludCh1bmksIDE2KSkKKyAgICAgICAgICAgIGNvZGVjaCA9ICcnLmpvaW4oY2hyKGludChjLCAxNikpIGZvciBjIGluIGNvZGVkLnNwbGl0KCkpCisgICAgICAgICAgICBzZWxmLl90ZXN0cG9pbnQoY29kZWNoLCB1bmljaCkKKworICAgIGRlZiB0ZXN0X21hcHBpbmdfc3VwcGxlbWVudGFsKHNlbGYpOgorICAgICAgICBmb3IgbWFwcGluZyBpbiBzZWxmLnN1cG1hcHM6CisgICAgICAgICAgICBzZWxmLl90ZXN0cG9pbnQoKm1hcHBpbmcpCisKKyAgICBkZWYgX3Rlc3Rwb2ludChzZWxmLCBjc2V0Y2gsIHVuaWNoKToKKyAgICAgICAgaWYgKGNzZXRjaCwgdW5pY2gpIG5vdCBpbiBzZWxmLnBhc3NfZW5jdGVzdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNoLmVuY29kZShzZWxmLmVuY29kaW5nKSwgY3NldGNoKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvciwgZXhjOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnRW5jb2RpbmcgZmFpbGVkIHdoaWxlIHRlc3RpbmcgJXMgLT4gJXM6ICVzJyAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByKHVuaWNoKSwgcmVwcihjc2V0Y2gpLCBleGMucmVhc29uKSkKKyAgICAgICAgaWYgKGNzZXRjaCwgdW5pY2gpIG5vdCBpbiBzZWxmLnBhc3NfZGVjdGVzdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzZXRjaC5kZWNvZGUoc2VsZi5lbmNvZGluZyksIHVuaWNoKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvciwgZXhjOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnRGVjb2RpbmcgZmFpbGVkIHdoaWxlIHRlc3RpbmcgJXMgLT4gJXM6ICVzJyAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByKGNzZXRjaCksIHJlcHIodW5pY2gpLCBleGMucmVhc29uKSkKKworICAgIGRlZiB0ZXN0X2Vycm9yaGFuZGxlKHNlbGYpOgorICAgICAgICBmb3Igc291cmNlLCBzY2hlbWUsIGV4cGVjdGVkIGluIHNlbGYuY29kZWN0ZXN0czoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc291cmNlLCBieXRlcyk6CisgICAgICAgICAgICAgICAgZnVuYyA9IHNvdXJjZS5kZWNvZGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZnVuYyA9IHNvdXJjZS5lbmNvZGUKKyAgICAgICAgICAgIGlmIGV4cGVjdGVkOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc291cmNlLCBieXRlcyk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMoc2VsZi5lbmNvZGluZywgc2NoZW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyZXN1bHQpIGlzIHVuaWNvZGUsIHR5cGUocmVzdWx0KSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclci5kZWNvZGUoJXIsICVyKT0lciAhPSAlcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzb3VyY2UsIHNlbGYuZW5jb2RpbmcsIHNjaGVtZSwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jKHNlbGYuZW5jb2RpbmcsIHNjaGVtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocmVzdWx0KSBpcyBieXRlcywgdHlwZShyZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyLmVuY29kZSglciwgJXIpPSVyICE9ICVyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNvdXJjZSwgc2VsZi5lbmNvZGluZywgc2NoZW1lLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGZ1bmMsIHNlbGYuZW5jb2RpbmcsIHNjaGVtZSkKKworZGVmIGxvYWRfdGVzdHN0cmluZyhuYW1lKToKKyAgICBkaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJ2Nqa2VuY29kaW5ncycpCisgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihkaXIsIG5hbWUgKyAnLnR4dCcpLCAncmInKSBhcyBmOgorICAgICAgICBlbmNvZGVkID0gZi5yZWFkKCkKKyAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRpciwgbmFtZSArICctdXRmOC50eHQnKSwgJ3JiJykgYXMgZjoKKyAgICAgICAgdXRmOCA9IGYucmVhZCgpCisgICAgcmV0dXJuIGVuY29kZWQsIHV0ZjgKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjNzhkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjNzhkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpZmlsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDMwNzViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlmaWxlLnB5CkBAIC0wLDAgKzEsNjcgQEAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CittaW1ldG9vbHMgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnbWltZXRvb2xzJywgZGVwcmVjYXRlZD1UcnVlKQorbXVsdGlmaWxlID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ211bHRpZmlsZScsIGRlcHJlY2F0ZWQ9VHJ1ZSkKK2ltcG9ydCBjU3RyaW5nSU8KKworbXNnID0gIiIiTWltZS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOworICAgICAgICBib3VuZGFyeT0iPT09PT09PT09PT09PT09PT09PT09XzU5MDQ1MzY2Nz09XyIKK1gtT3JpZ2luYWxBcnJpdmFsVGltZTogMDUgRmViIDIwMDIgMDM6NDM6MjMuMDMxMCAoVVRDKSBGSUxFVElNRT1bNDJEODhDRTA6MDFDMUFERjddCisKKy0tPT09PT09PT09PT09PT09PT09PT09XzU5MDQ1MzY2Nz09XworQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7CisgICAgICAgIGJvdW5kYXJ5PSI9PT09PT09PT09PT09PT09PT09PT1fNTkwNDUzNjc3PT1fLkFMVCIKKworLS09PT09PT09PT09PT09PT09PT09PT1fNTkwNDUzNjc3PT1fLkFMVAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSI7IGZvcm1hdD1mbG93ZWQKKwordGVzdCBBCistLT09PT09PT09PT09PT09PT09PT09PV81OTA0NTM2Nzc9PV8uQUxUCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD0idXMtYXNjaWkiCisKKzxodG1sPgorPGI+dGVzdCBCPC9mb250PjwvYj48L2h0bWw+CisKKy0tPT09PT09PT09PT09PT09PT09PT09XzU5MDQ1MzY3Nz09Xy5BTFQtLQorCistLT09PT09PT09PT09PT09PT09PT09PV81OTA0NTM2Njc9PV8KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iYXR0LnR4dCIKKworQXR0YWNoZWQgQ29udGVudC4KK0F0dGFjaGVkIENvbnRlbnQuCitBdHRhY2hlZCBDb250ZW50LgorQXR0YWNoZWQgQ29udGVudC4KKworLS09PT09PT09PT09PT09PT09PT09PT1fNTkwNDUzNjY3PT1fLS0KKworIiIiCisKK2RlZiBnZXRNSU1FTXNnKG1mKToKKyAgICBnbG9iYWwgYm91bmRhcmllcywgbGluZWNvdW50CisgICAgbXNnID0gbWltZXRvb2xzLk1lc3NhZ2UobWYpCisKKyAgICAjcHJpbnQgIlRZUEU6ICVzIiAlIG1zZy5nZXR0eXBlKCkKKyAgICBpZiBtc2cuZ2V0bWFpbnR5cGUoKSA9PSAnbXVsdGlwYXJ0JzoKKyAgICAgICAgYm91bmRhcnkgPSBtc2cuZ2V0cGFyYW0oImJvdW5kYXJ5IikKKyAgICAgICAgYm91bmRhcmllcyArPSAxCisKKyAgICAgICAgbWYucHVzaChib3VuZGFyeSkKKyAgICAgICAgd2hpbGUgbWYubmV4dCgpOgorICAgICAgICAgICAgZ2V0TUlNRU1zZyhtZikKKyAgICAgICAgbWYucG9wKCkKKyAgICBlbHNlOgorICAgICAgICBsaW5lcyA9IG1mLnJlYWRsaW5lcygpCisgICAgICAgIGxpbmVjb3VudCArPSBsZW4obGluZXMpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBnbG9iYWwgYm91bmRhcmllcywgbGluZWNvdW50CisgICAgYm91bmRhcmllcyA9IDAKKyAgICBsaW5lY291bnQgPSAwCisgICAgZiA9IGNTdHJpbmdJTy5TdHJpbmdJTyhtc2cpCisgICAgZ2V0TUlNRU1zZyhtdWx0aWZpbGUuTXVsdGlGaWxlKGYpKQorICAgIGFzc2VydCBib3VuZGFyaWVzID09IDIKKyAgICBhc3NlcnQgbGluZWNvdW50ID09IDkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlmaWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlNGI1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlmaWxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4NGY1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NjYzZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkKQEAgLTAsMCArMSwyNTI3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIworIyBVbml0IHRlc3RzIGZvciB0aGUgbXVsdGlwcm9jZXNzaW5nIHBhY2thZ2UKKyMKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgUXVldWUKK2ltcG9ydCB0aW1lCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBnYworaW1wb3J0IHNpZ25hbAoraW1wb3J0IGFycmF5CitpbXBvcnQgc29ja2V0CitpbXBvcnQgcmFuZG9tCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGVycm5vCitpbXBvcnQgdGVzdC5zY3JpcHRfaGVscGVyCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK19tdWx0aXByb2Nlc3NpbmcgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnX211bHRpcHJvY2Vzc2luZycpCisjIGltcG9ydCB0aHJlYWRpbmcgYWZ0ZXIgX211bHRpcHJvY2Vzc2luZyB0byByYWlzZSBhIG1vcmUgcmVsZXZhbnQgZXJyb3IKKyMgbWVzc2FnZTogIk5vIG1vZHVsZSBuYW1lZCBfbXVsdGlwcm9jZXNzaW5nIi4gX211bHRpcHJvY2Vzc2luZyBpcyBub3QgY29tcGlsZWQKKyMgd2l0aG91dCB0aHJlYWQgc3VwcG9ydC4KK2ltcG9ydCB0aHJlYWRpbmcKKworIyBXb3JrIGFyb3VuZCBicm9rZW4gc2VtX29wZW4gaW1wbGVtZW50YXRpb25zCit0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnbXVsdGlwcm9jZXNzaW5nLnN5bmNocm9uaXplJykKKworaW1wb3J0IG11bHRpcHJvY2Vzc2luZy5kdW1teQoraW1wb3J0IG11bHRpcHJvY2Vzc2luZy5jb25uZWN0aW9uCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nLmhlYXAKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcucG9vbAorCitmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgdXRpbAorCit0cnk6CisgICAgZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0IHJlZHVjdGlvbgorICAgIEhBU19SRURVQ1RJT04gPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgSEFTX1JFRFVDVElPTiA9IEZhbHNlCisKK3RyeToKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5zaGFyZWRjdHlwZXMgaW1wb3J0IFZhbHVlLCBjb3B5CisgICAgSEFTX1NIQVJFRENUWVBFUyA9IFRydWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBIQVNfU0hBUkVEQ1RZUEVTID0gRmFsc2UKKwordHJ5OgorICAgIGltcG9ydCBtc3ZjcnQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBtc3ZjcnQgPSBOb25lCisKKyMKKyMKKyMKKworbGF0aW4gPSBzdHIKKworIworIyBDb25zdGFudHMKKyMKKworTE9HX0xFVkVMID0gdXRpbC5TVUJXQVJOSU5HCisjTE9HX0xFVkVMID0gbG9nZ2luZy5ERUJVRworCitERUxUQSA9IDAuMQorQ0hFQ0tfVElNSU5HUyA9IEZhbHNlICAgICAjIG1ha2luZyB0cnVlIG1ha2VzIHRlc3RzIHRha2UgYSBsb3QgbG9uZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgYW5kIGNhbiBzb21ldGltZXMgY2F1c2Ugc29tZSBub24tc2VyaW91cworICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZhaWx1cmVzIGJlY2F1c2Ugc29tZSBjYWxscyBibG9jayBhIGJpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvbmdlciB0aGFuIGV4cGVjdGVkCitpZiBDSEVDS19USU1JTkdTOgorICAgIFRJTUVPVVQxLCBUSU1FT1VUMiwgVElNRU9VVDMgPSAwLjgyLCAwLjM1LCAxLjQKK2Vsc2U6CisgICAgVElNRU9VVDEsIFRJTUVPVVQyLCBUSU1FT1VUMyA9IDAuMSwgMC4xLCAwLjEKKworSEFWRV9HRVRWQUxVRSA9IG5vdCBnZXRhdHRyKF9tdWx0aXByb2Nlc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hBVkVfQlJPS0VOX1NFTV9HRVRWQUxVRScsIEZhbHNlKQorCitXSU4zMiA9IChzeXMucGxhdGZvcm0gPT0gIndpbjMyIikKKwordHJ5OgorICAgIE1BWEZEID0gb3Muc3lzY29uZigiU0NfT1BFTl9NQVgiKQorZXhjZXB0OgorICAgIE1BWEZEID0gMjU2CisKKyMKKyMgU29tZSB0ZXN0cyByZXF1aXJlIGN0eXBlcworIworCit0cnk6CisgICAgZnJvbSBjdHlwZXMgaW1wb3J0IFN0cnVjdHVyZSwgY19pbnQsIGNfZG91YmxlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgU3RydWN0dXJlID0gb2JqZWN0CisgICAgY19pbnQgPSBjX2RvdWJsZSA9IE5vbmUKKworCitkZWYgY2hlY2tfZW5vdWdoX3NlbWFwaG9yZXMoKToKKyAgICAiIiJDaGVjayB0aGF0IHRoZSBzeXN0ZW0gc3VwcG9ydHMgZW5vdWdoIHNlbWFwaG9yZXMgdG8gcnVuIHRoZSB0ZXN0LiIiIgorICAgICMgbWluaW11bSBudW1iZXIgb2Ygc2VtYXBob3JlcyBhdmFpbGFibGUgYWNjb3JkaW5nIHRvIFBPU0lYCisgICAgbnNlbXNfbWluID0gMjU2CisgICAgdHJ5OgorICAgICAgICBuc2VtcyA9IG9zLnN5c2NvbmYoIlNDX1NFTV9OU0VNU19NQVgiKQorICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAjIHN5c2NvbmYgbm90IGF2YWlsYWJsZSBvciBzZXR0aW5nIG5vdCBhdmFpbGFibGUKKyAgICAgICAgcmV0dXJuCisgICAgaWYgbnNlbXMgPT0gLTEgb3IgbnNlbXMgPj0gbnNlbXNfbWluOgorICAgICAgICByZXR1cm4KKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiVGhlIE9TIGRvZXNuJ3Qgc3VwcG9ydCBlbm91Z2ggc2VtYXBob3JlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIHJ1biB0aGUgdGVzdCAocmVxdWlyZWQ6ICVkKS4iICUgbnNlbXNfbWluKQorCisKKyMKKyMgQ3JlYXRlcyBhIHdyYXBwZXIgZm9yIGEgZnVuY3Rpb24gd2hpY2ggcmVjb3JkcyB0aGUgdGltZSBpdCB0YWtlcyB0byBmaW5pc2gKKyMKKworY2xhc3MgVGltaW5nV3JhcHBlcihvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMpOgorICAgICAgICBzZWxmLmZ1bmMgPSBmdW5jCisgICAgICAgIHNlbGYuZWxhcHNlZCA9IE5vbmUKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgdCA9IHRpbWUudGltZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZ1bmMoKmFyZ3MsICoqa3dkcykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuZWxhcHNlZCA9IHRpbWUudGltZSgpIC0gdAorCisjCisjIEJhc2UgY2xhc3MgZm9yIHRlc3QgY2FzZXMKKyMKKworY2xhc3MgQmFzZVRlc3RDYXNlKG9iamVjdCk6CisKKyAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCAnbWFuYWdlcicsICd0aHJlYWRzJykKKworICAgIGRlZiBhc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChzZWxmLCBhLCBiKToKKyAgICAgICAgaWYgQ0hFQ0tfVElNSU5HUzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoYSwgYiwgMSkKKworICAgIGRlZiBhc3NlcnRSZXR1cm5zSWZJbXBsZW1lbnRlZChzZWxmLCB2YWx1ZSwgZnVuYywgKmFyZ3MpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXMgPSBmdW5jKCphcmdzKQorICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCByZXMpCisKKyAgICAjIEZvciB0aGUgc2FuaXR5IG9mIFdpbmRvd3MgdXNlcnMsIHJhdGhlciB0aGFuIGNyYXNoaW5nIG9yIGZyZWV6aW5nIGluCisgICAgIyBtdWx0aXBsZSB3YXlzLgorICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigic2hvdWxkbid0IHRyeSB0byBwaWNrbGUgYSB0ZXN0IGNhc2UiKQorCisgICAgX19yZWR1Y2VfZXhfXyA9IF9fcmVkdWNlX18KKworIworIyBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgc2VtYXBob3JlCisjCisKK2RlZiBnZXRfdmFsdWUoc2VsZik6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gc2VsZi5nZXRfdmFsdWUoKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX1NlbWFwaG9yZV9fdmFsdWUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl92YWx1ZQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworIworIyBUZXN0Y2FzZXMKKyMKKworY2xhc3MgX1Rlc3RQcm9jZXNzKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCAndGhyZWFkcycpCisKKyAgICBkZWYgdGVzdF9jdXJyZW50KHNlbGYpOgorICAgICAgICBpZiBzZWxmLlRZUEUgPT0gJ3RocmVhZHMnOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgY3VycmVudCA9IHNlbGYuY3VycmVudF9wcm9jZXNzKCkKKyAgICAgICAgYXV0aGtleSA9IGN1cnJlbnQuYXV0aGtleQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjdXJyZW50LmlzX2FsaXZlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY3VycmVudC5kYWVtb24pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShhdXRoa2V5LCBieXRlcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihhdXRoa2V5KSA+IDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VycmVudC5pZGVudCwgb3MuZ2V0cGlkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VycmVudC5leGl0Y29kZSwgTm9uZSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfdGVzdChjbHMsIHEsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICBjdXJyZW50ID0gY2xzLmN1cnJlbnRfcHJvY2VzcygpCisgICAgICAgIHEucHV0KGFyZ3MpCisgICAgICAgIHEucHV0KGt3ZHMpCisgICAgICAgIHEucHV0KGN1cnJlbnQubmFtZSkKKyAgICAgICAgaWYgY2xzLlRZUEUgIT0gJ3RocmVhZHMnOgorICAgICAgICAgICAgcS5wdXQoYnl0ZXMoY3VycmVudC5hdXRoa2V5KSkKKyAgICAgICAgICAgIHEucHV0KGN1cnJlbnQucGlkKQorCisgICAgZGVmIHRlc3RfcHJvY2VzcyhzZWxmKToKKyAgICAgICAgcSA9IHNlbGYuUXVldWUoMSkKKyAgICAgICAgZSA9IHNlbGYuRXZlbnQoKQorICAgICAgICBhcmdzID0gKHEsIDEsIDIpCisgICAgICAgIGt3YXJncyA9IHsnaGVsbG8nOjIzLCAnYnllJzoyLjU0fQorICAgICAgICBuYW1lID0gJ1NvbWVQcm9jZXNzJworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKAorICAgICAgICAgICAgdGFyZ2V0PXNlbGYuX3Rlc3QsIGFyZ3M9YXJncywga3dhcmdzPWt3YXJncywgbmFtZT1uYW1lCisgICAgICAgICAgICApCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBjdXJyZW50ID0gc2VsZi5jdXJyZW50X3Byb2Nlc3MoKQorCisgICAgICAgIGlmIHNlbGYuVFlQRSAhPSAndGhyZWFkcyc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuYXV0aGtleSwgY3VycmVudC5hdXRoa2V5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuaXNfYWxpdmUoKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5kYWVtb24sIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ocCwgc2VsZi5hY3RpdmVfY2hpbGRyZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoc2VsZi5hY3RpdmVfY2hpbGRyZW4oKSkgaXMgbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmV4aXRjb2RlLCBOb25lKQorCisgICAgICAgIHAuc3RhcnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5leGl0Y29kZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmlzX2FsaXZlKCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocCwgc2VsZi5hY3RpdmVfY2hpbGRyZW4oKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHEuZ2V0KCksIGFyZ3NbMTpdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHEuZ2V0KCksIGt3YXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLmdldCgpLCBwLm5hbWUpCisgICAgICAgIGlmIHNlbGYuVFlQRSAhPSAndGhyZWFkcyc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHEuZ2V0KCksIGN1cnJlbnQuYXV0aGtleSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocS5nZXQoKSwgcC5waWQpCisKKyAgICAgICAgcC5qb2luKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZXhpdGNvZGUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5pc19hbGl2ZSgpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihwLCBzZWxmLmFjdGl2ZV9jaGlsZHJlbigpKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF90ZXN0X3Rlcm1pbmF0ZShjbHMpOgorICAgICAgICB0aW1lLnNsZWVwKDEwMDApCisKKyAgICBkZWYgdGVzdF90ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuVFlQRSA9PSAndGhyZWFkcyc6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl90ZXN0X3Rlcm1pbmF0ZSkKKyAgICAgICAgcC5kYWVtb24gPSBUcnVlCisgICAgICAgIHAuc3RhcnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5pc19hbGl2ZSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEluKHAsIHNlbGYuYWN0aXZlX2NoaWxkcmVuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5leGl0Y29kZSwgTm9uZSkKKworICAgICAgICBwLnRlcm1pbmF0ZSgpCisKKyAgICAgICAgam9pbiA9IFRpbWluZ1dyYXBwZXIocC5qb2luKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGpvaW4oKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChqb2luLmVsYXBzZWQsIDAuMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuaXNfYWxpdmUoKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ocCwgc2VsZi5hY3RpdmVfY2hpbGRyZW4oKSkKKworICAgICAgICBwLmpvaW4oKQorCisgICAgICAgICMgWFhYIHNvbWV0aW1lcyBnZXQgcC5leGl0Y29kZSA9PSAwIG9uIFdpbmRvd3MgLi4uCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKHAuZXhpdGNvZGUsIC1zaWduYWwuU0lHVEVSTSkKKworICAgIGRlZiB0ZXN0X2NwdV9jb3VudChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3B1cyA9IG11bHRpcHJvY2Vzc2luZy5jcHVfY291bnQoKQorICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgIGNwdXMgPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGNwdXMpIGlzIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNwdXMgPj0gMSkKKworICAgIGRlZiB0ZXN0X2FjdGl2ZV9jaGlsZHJlbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHNlbGYuYWN0aXZlX2NoaWxkcmVuKCkpLCBsaXN0KQorCisgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXRpbWUuc2xlZXAsIGFyZ3M9KERFTFRBLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ocCwgc2VsZi5hY3RpdmVfY2hpbGRyZW4oKSkKKworICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocCwgc2VsZi5hY3RpdmVfY2hpbGRyZW4oKSkKKworICAgICAgICBwLmpvaW4oKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHAsIHNlbGYuYWN0aXZlX2NoaWxkcmVuKCkpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlc3RfcmVjdXJzaW9uKGNscywgd2Nvbm4sIGlkKToKKyAgICAgICAgZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0IGZvcmtpbmcKKyAgICAgICAgd2Nvbm4uc2VuZChpZCkKKyAgICAgICAgaWYgbGVuKGlkKSA8IDI6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgyKToKKyAgICAgICAgICAgICAgICBwID0gY2xzLlByb2Nlc3MoCisgICAgICAgICAgICAgICAgICAgIHRhcmdldD1jbHMuX3Rlc3RfcmVjdXJzaW9uLCBhcmdzPSh3Y29ubiwgaWQrW2ldKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgcC5zdGFydCgpCisgICAgICAgICAgICAgICAgcC5qb2luKCkKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2lvbihzZWxmKToKKyAgICAgICAgcmNvbm4sIHdjb25uID0gc2VsZi5QaXBlKGR1cGxleD1GYWxzZSkKKyAgICAgICAgc2VsZi5fdGVzdF9yZWN1cnNpb24od2Nvbm4sIFtdKQorCisgICAgICAgIHRpbWUuc2xlZXAoREVMVEEpCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIHdoaWxlIHJjb25uLnBvbGwoKToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocmNvbm4ucmVjdigpKQorCisgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgW10sCisgICAgICAgICAgICAgIFswXSwKKyAgICAgICAgICAgICAgICBbMCwgMF0sCisgICAgICAgICAgICAgICAgWzAsIDFdLAorICAgICAgICAgICAgICBbMV0sCisgICAgICAgICAgICAgICAgWzEsIDBdLAorICAgICAgICAgICAgICAgIFsxLCAxXQorICAgICAgICAgICAgXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlc3Rfc3lzX2V4aXQoY2xzLCByZWFzb24sIHRlc3Rmbik6CisgICAgICAgIHN5cy5zdGRlcnIgPSBvcGVuKHRlc3RmbiwgJ3cnKQorICAgICAgICBzeXMuZXhpdChyZWFzb24pCisKKyAgICBkZWYgdGVzdF9zeXNfZXhpdChzZWxmKToKKyAgICAgICAgIyBTZWUgSXNzdWUgMTM4NTQKKyAgICAgICAgaWYgc2VsZi5UWVBFID09ICd0aHJlYWRzJzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRlc3RmbiA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3Rfc3VwcG9ydC51bmxpbmssIHRlc3RmbikKKworICAgICAgICBmb3IgcmVhc29uLCBjb2RlIGluICgoWzEsIDIsIDNdLCAxKSwgKCdpZ25vcmUgdGhpcycsIDApKToKKyAgICAgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3Rlc3Rfc3lzX2V4aXQsIGFyZ3M9KHJlYXNvbiwgdGVzdGZuKSkKKyAgICAgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgcC5zdGFydCgpCisgICAgICAgICAgICBwLmpvaW4oNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5leGl0Y29kZSwgY29kZSkKKworICAgICAgICAgICAgd2l0aCBvcGVuKHRlc3RmbiwgJ3InKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCkucnN0cmlwKCksIHN0cihyZWFzb24pKQorCisgICAgICAgIGZvciByZWFzb24gaW4gKFRydWUsIEZhbHNlLCA4KToKKyAgICAgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXN5cy5leGl0LCBhcmdzPShyZWFzb24sKSkKKyAgICAgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgcC5zdGFydCgpCisgICAgICAgICAgICBwLmpvaW4oNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5leGl0Y29kZSwgcmVhc29uKQorCisjCisjCisjCisKK2NsYXNzIF9VcHBlckNhc2VyKG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5jaGlsZF9jb25uLCBzZWxmLnBhcmVudF9jb25uID0gbXVsdGlwcm9jZXNzaW5nLlBpcGUoKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5wYXJlbnRfY29ubi5jbG9zZSgpCisgICAgICAgIGZvciBzIGluIGl0ZXIoc2VsZi5jaGlsZF9jb25uLnJlY3YsIE5vbmUpOgorICAgICAgICAgICAgc2VsZi5jaGlsZF9jb25uLnNlbmQocy51cHBlcigpKQorICAgICAgICBzZWxmLmNoaWxkX2Nvbm4uY2xvc2UoKQorCisgICAgZGVmIHN1Ym1pdChzZWxmLCBzKToKKyAgICAgICAgYXNzZXJ0IHR5cGUocykgaXMgc3RyCisgICAgICAgIHNlbGYucGFyZW50X2Nvbm4uc2VuZChzKQorICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnRfY29ubi5yZWN2KCkKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICBzZWxmLnBhcmVudF9jb25uLnNlbmQoTm9uZSkKKyAgICAgICAgc2VsZi5wYXJlbnRfY29ubi5jbG9zZSgpCisgICAgICAgIHNlbGYuY2hpbGRfY29ubi5jbG9zZSgpCisKK2NsYXNzIF9UZXN0U3ViY2xhc3NpbmdQcm9jZXNzKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzaW5nKHNlbGYpOgorICAgICAgICB1cHBlcmNhc2VyID0gX1VwcGVyQ2FzZXIoKQorICAgICAgICB1cHBlcmNhc2VyLmRhZW1vbiA9IFRydWUKKyAgICAgICAgdXBwZXJjYXNlci5zdGFydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXBwZXJjYXNlci5zdWJtaXQoJ2hlbGxvJyksICdIRUxMTycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXBwZXJjYXNlci5zdWJtaXQoJ3dvcmxkJyksICdXT1JMRCcpCisgICAgICAgIHVwcGVyY2FzZXIuc3RvcCgpCisgICAgICAgIHVwcGVyY2FzZXIuam9pbigpCisKKyMKKyMKKyMKKworZGVmIHF1ZXVlX2VtcHR5KHEpOgorICAgIGlmIGhhc2F0dHIocSwgJ2VtcHR5Jyk6CisgICAgICAgIHJldHVybiBxLmVtcHR5KCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcS5xc2l6ZSgpID09IDAKKworZGVmIHF1ZXVlX2Z1bGwocSwgbWF4c2l6ZSk6CisgICAgaWYgaGFzYXR0cihxLCAnZnVsbCcpOgorICAgICAgICByZXR1cm4gcS5mdWxsKCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcS5xc2l6ZSgpID09IG1heHNpemUKKworCitjbGFzcyBfVGVzdFF1ZXVlKEJhc2VUZXN0Q2FzZSk6CisKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfdGVzdF9wdXQoY2xzLCBxdWV1ZSwgY2hpbGRfY2FuX3N0YXJ0LCBwYXJlbnRfY2FuX2NvbnRpbnVlKToKKyAgICAgICAgY2hpbGRfY2FuX3N0YXJ0LndhaXQoKQorICAgICAgICBmb3IgaSBpbiByYW5nZSg2KToKKyAgICAgICAgICAgIHF1ZXVlLmdldCgpCisgICAgICAgIHBhcmVudF9jYW5fY29udGludWUuc2V0KCkKKworICAgIGRlZiB0ZXN0X3B1dChzZWxmKToKKyAgICAgICAgTUFYU0laRSA9IDYKKyAgICAgICAgcXVldWUgPSBzZWxmLlF1ZXVlKG1heHNpemU9TUFYU0laRSkKKyAgICAgICAgY2hpbGRfY2FuX3N0YXJ0ID0gc2VsZi5FdmVudCgpCisgICAgICAgIHBhcmVudF9jYW5fY29udGludWUgPSBzZWxmLkV2ZW50KCkKKworICAgICAgICBwcm9jID0gc2VsZi5Qcm9jZXNzKAorICAgICAgICAgICAgdGFyZ2V0PXNlbGYuX3Rlc3RfcHV0LAorICAgICAgICAgICAgYXJncz0ocXVldWUsIGNoaWxkX2Nhbl9zdGFydCwgcGFyZW50X2Nhbl9jb250aW51ZSkKKyAgICAgICAgICAgICkKKyAgICAgICAgcHJvYy5kYWVtb24gPSBUcnVlCisgICAgICAgIHByb2Muc3RhcnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVldWVfZW1wdHkocXVldWUpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1ZXVlX2Z1bGwocXVldWUsIE1BWFNJWkUpLCBGYWxzZSkKKworICAgICAgICBxdWV1ZS5wdXQoMSkKKyAgICAgICAgcXVldWUucHV0KDIsIFRydWUpCisgICAgICAgIHF1ZXVlLnB1dCgzLCBUcnVlLCBOb25lKQorICAgICAgICBxdWV1ZS5wdXQoNCwgRmFsc2UpCisgICAgICAgIHF1ZXVlLnB1dCg1LCBGYWxzZSwgTm9uZSkKKyAgICAgICAgcXVldWUucHV0X25vd2FpdCg2KQorCisgICAgICAgICMgdGhlIHZhbHVlcyBtYXkgYmUgaW4gYnVmZmVyIGJ1dCBub3QgeWV0IGluIHBpcGUgc28gc2xlZXAgYSBiaXQKKyAgICAgICAgdGltZS5zbGVlcChERUxUQSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1ZXVlX2VtcHR5KHF1ZXVlKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVldWVfZnVsbChxdWV1ZSwgTUFYU0laRSksIFRydWUpCisKKyAgICAgICAgcHV0ID0gVGltaW5nV3JhcHBlcihxdWV1ZS5wdXQpCisgICAgICAgIHB1dF9ub3dhaXQgPSBUaW1pbmdXcmFwcGVyKHF1ZXVlLnB1dF9ub3dhaXQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUXVldWUuRnVsbCwgcHV0LCA3LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChwdXQuZWxhcHNlZCwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhRdWV1ZS5GdWxsLCBwdXQsIDcsIEZhbHNlLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKHB1dC5lbGFwc2VkLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFF1ZXVlLkZ1bGwsIHB1dF9ub3dhaXQsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwocHV0X25vd2FpdC5lbGFwc2VkLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFF1ZXVlLkZ1bGwsIHB1dCwgNywgVHJ1ZSwgVElNRU9VVDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwocHV0LmVsYXBzZWQsIFRJTUVPVVQxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFF1ZXVlLkZ1bGwsIHB1dCwgNywgRmFsc2UsIFRJTUVPVVQyKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKHB1dC5lbGFwc2VkLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFF1ZXVlLkZ1bGwsIHB1dCwgNywgVHJ1ZSwgdGltZW91dD1USU1FT1VUMykKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChwdXQuZWxhcHNlZCwgVElNRU9VVDMpCisKKyAgICAgICAgY2hpbGRfY2FuX3N0YXJ0LnNldCgpCisgICAgICAgIHBhcmVudF9jYW5fY29udGludWUud2FpdCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdWV1ZV9lbXB0eShxdWV1ZSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVldWVfZnVsbChxdWV1ZSwgTUFYU0laRSksIEZhbHNlKQorCisgICAgICAgIHByb2Muam9pbigpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlc3RfZ2V0KGNscywgcXVldWUsIGNoaWxkX2Nhbl9zdGFydCwgcGFyZW50X2Nhbl9jb250aW51ZSk6CisgICAgICAgIGNoaWxkX2Nhbl9zdGFydC53YWl0KCkKKyAgICAgICAgI3F1ZXVlLnB1dCgxKQorICAgICAgICBxdWV1ZS5wdXQoMikKKyAgICAgICAgcXVldWUucHV0KDMpCisgICAgICAgIHF1ZXVlLnB1dCg0KQorICAgICAgICBxdWV1ZS5wdXQoNSkKKyAgICAgICAgcGFyZW50X2Nhbl9jb250aW51ZS5zZXQoKQorCisgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgorICAgICAgICBxdWV1ZSA9IHNlbGYuUXVldWUoKQorICAgICAgICBjaGlsZF9jYW5fc3RhcnQgPSBzZWxmLkV2ZW50KCkKKyAgICAgICAgcGFyZW50X2Nhbl9jb250aW51ZSA9IHNlbGYuRXZlbnQoKQorCisgICAgICAgIHByb2MgPSBzZWxmLlByb2Nlc3MoCisgICAgICAgICAgICB0YXJnZXQ9c2VsZi5fdGVzdF9nZXQsCisgICAgICAgICAgICBhcmdzPShxdWV1ZSwgY2hpbGRfY2FuX3N0YXJ0LCBwYXJlbnRfY2FuX2NvbnRpbnVlKQorICAgICAgICAgICAgKQorICAgICAgICBwcm9jLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcHJvYy5zdGFydCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdWV1ZV9lbXB0eShxdWV1ZSksIFRydWUpCisKKyAgICAgICAgY2hpbGRfY2FuX3N0YXJ0LnNldCgpCisgICAgICAgIHBhcmVudF9jYW5fY29udGludWUud2FpdCgpCisKKyAgICAgICAgdGltZS5zbGVlcChERUxUQSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdWV1ZV9lbXB0eShxdWV1ZSksIEZhbHNlKQorCisgICAgICAgICMgSGFuZ3MgdW5leHBlY3RlZGx5LCByZW1vdmUgZm9yIG5vdworICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChxdWV1ZS5nZXQoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdWV1ZS5nZXQoVHJ1ZSwgTm9uZSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVldWUuZ2V0KFRydWUpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1ZXVlLmdldCh0aW1lb3V0PTEpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1ZXVlLmdldF9ub3dhaXQoKSwgNSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1ZXVlX2VtcHR5KHF1ZXVlKSwgVHJ1ZSkKKworICAgICAgICBnZXQgPSBUaW1pbmdXcmFwcGVyKHF1ZXVlLmdldCkKKyAgICAgICAgZ2V0X25vd2FpdCA9IFRpbWluZ1dyYXBwZXIocXVldWUuZ2V0X25vd2FpdCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhRdWV1ZS5FbXB0eSwgZ2V0LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChnZXQuZWxhcHNlZCwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhRdWV1ZS5FbXB0eSwgZ2V0LCBGYWxzZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChnZXQuZWxhcHNlZCwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhRdWV1ZS5FbXB0eSwgZ2V0X25vd2FpdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChnZXRfbm93YWl0LmVsYXBzZWQsIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUXVldWUuRW1wdHksIGdldCwgVHJ1ZSwgVElNRU9VVDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoZ2V0LmVsYXBzZWQsIFRJTUVPVVQxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFF1ZXVlLkVtcHR5LCBnZXQsIEZhbHNlLCBUSU1FT1VUMikKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChnZXQuZWxhcHNlZCwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhRdWV1ZS5FbXB0eSwgZ2V0LCB0aW1lb3V0PVRJTUVPVVQzKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKGdldC5lbGFwc2VkLCBUSU1FT1VUMykKKworICAgICAgICBwcm9jLmpvaW4oKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF90ZXN0X2ZvcmsoY2xzLCBxdWV1ZSk6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwLCAyMCk6CisgICAgICAgICAgICBxdWV1ZS5wdXQoaSkKKyAgICAgICAgIyBub3RlIHRoYXQgYXQgdGhpcyBwb2ludCB0aGUgaXRlbXMgbWF5IG9ubHkgYmUgYnVmZmVyZWQsIHNvIHRoZQorICAgICAgICAjIHByb2Nlc3MgY2Fubm90IHNodXRkb3duIHVudGlsIHRoZSBmZWVkZXIgdGhyZWFkIGhhcyBmaW5pc2hlZAorICAgICAgICAjIHB1c2hpbmcgaXRlbXMgb250byB0aGUgcGlwZS4KKworICAgIGRlZiB0ZXN0X2Zvcmsoc2VsZik6CisgICAgICAgICMgT2xkIHZlcnNpb25zIG9mIFF1ZXVlIHdvdWxkIGZhaWwgdG8gY3JlYXRlIGEgbmV3IGZlZWRlcgorICAgICAgICAjIHRocmVhZCBmb3IgYSBmb3JrZWQgcHJvY2VzcyBpZiB0aGUgb3JpZ2luYWwgcHJvY2VzcyBoYWQgaXRzCisgICAgICAgICMgb3duIGZlZWRlciB0aHJlYWQuICBUaGlzIHRlc3QgY2hlY2tzIHRoYXQgdGhpcyBubyBsb25nZXIKKyAgICAgICAgIyBoYXBwZW5zLgorCisgICAgICAgIHF1ZXVlID0gc2VsZi5RdWV1ZSgpCisKKyAgICAgICAgIyBwdXQgaXRlbXMgb24gcXVldWUgc28gdGhhdCBtYWluIHByb2Nlc3Mgc3RhcnRzIGEgZmVlZGVyIHRocmVhZAorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBxdWV1ZS5wdXQoaSkKKworICAgICAgICAjIHdhaXQgdG8gbWFrZSBzdXJlIHRocmVhZCBzdGFydHMgYmVmb3JlIHdlIGZvcmsgYSBuZXcgcHJvY2VzcworICAgICAgICB0aW1lLnNsZWVwKERFTFRBKQorCisgICAgICAgICMgZm9yayBwcm9jZXNzCisgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3Rlc3RfZm9yaywgYXJncz0ocXVldWUsKSkKKyAgICAgICAgcC5kYWVtb24gPSBUcnVlCisgICAgICAgIHAuc3RhcnQoKQorCisgICAgICAgICMgY2hlY2sgdGhhdCBhbGwgZXhwZWN0ZWQgaXRlbXMgYXJlIGluIHRoZSBxdWV1ZQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1ZXVlLmdldCgpLCBpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhRdWV1ZS5FbXB0eSwgcXVldWUuZ2V0LCBGYWxzZSkKKworICAgICAgICBwLmpvaW4oKQorCisgICAgZGVmIHRlc3RfcXNpemUoc2VsZik6CisgICAgICAgIHEgPSBzZWxmLlF1ZXVlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLnFzaXplKCksIDApCisgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHEucHV0KDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocS5xc2l6ZSgpLCAxKQorICAgICAgICBxLnB1dCg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHEucXNpemUoKSwgMikKKyAgICAgICAgcS5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHEucXNpemUoKSwgMSkKKyAgICAgICAgcS5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHEucXNpemUoKSwgMCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfdGVzdF90YXNrX2RvbmUoY2xzLCBxKToKKyAgICAgICAgZm9yIG9iaiBpbiBpdGVyKHEuZ2V0LCBOb25lKToKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoREVMVEEpCisgICAgICAgICAgICBxLnRhc2tfZG9uZSgpCisKKyAgICBkZWYgdGVzdF90YXNrX2RvbmUoc2VsZik6CisgICAgICAgIHF1ZXVlID0gc2VsZi5Kb2luYWJsZVF1ZXVlKCkKKworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDUpIGFuZCBub3QgaGFzYXR0cihxdWV1ZSwgJ3Rhc2tfZG9uZScpOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgicmVxdWlyZXMgJ3F1ZXVlLnRhc2tfZG9uZSgpJyBtZXRob2QiKQorCisgICAgICAgIHdvcmtlcnMgPSBbc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl90ZXN0X3Rhc2tfZG9uZSwgYXJncz0ocXVldWUsKSkKKyAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNCldCisKKyAgICAgICAgZm9yIHAgaW4gd29ya2VyczoKKyAgICAgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgcC5zdGFydCgpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwKToKKyAgICAgICAgICAgIHF1ZXVlLnB1dChpKQorCisgICAgICAgIHF1ZXVlLmpvaW4oKQorCisgICAgICAgIGZvciBwIGluIHdvcmtlcnM6CisgICAgICAgICAgICBxdWV1ZS5wdXQoTm9uZSkKKworICAgICAgICBmb3IgcCBpbiB3b3JrZXJzOgorICAgICAgICAgICAgcC5qb2luKCkKKworIworIworIworCitjbGFzcyBfVGVzdExvY2soQmFzZVRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2xvY2soc2VsZik6CisgICAgICAgIGxvY2sgPSBzZWxmLkxvY2soKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2suYWNxdWlyZSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2suYWNxdWlyZShGYWxzZSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2sucmVsZWFzZSgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVmFsdWVFcnJvciwgdGhyZWFkaW5nLlRocmVhZEVycm9yKSwgbG9jay5yZWxlYXNlKQorCisgICAgZGVmIHRlc3RfcmxvY2soc2VsZik6CisgICAgICAgIGxvY2sgPSBzZWxmLlJMb2NrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NrLmFjcXVpcmUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NrLmFjcXVpcmUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NrLmFjcXVpcmUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NrLnJlbGVhc2UoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NrLnJlbGVhc2UoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NrLnJlbGVhc2UoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKEFzc2VydGlvbkVycm9yLCBSdW50aW1lRXJyb3IpLCBsb2NrLnJlbGVhc2UpCisKKyAgICBkZWYgdGVzdF9sb2NrX2NvbnRleHQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5Mb2NrKCk6CisgICAgICAgICAgICBwYXNzCisKKworY2xhc3MgX1Rlc3RTZW1hcGhvcmUoQmFzZVRlc3RDYXNlKToKKworICAgIGRlZiBfdGVzdF9zZW1hcGhvcmUoc2VsZiwgc2VtKToKKyAgICAgICAgc2VsZi5hc3NlcnRSZXR1cm5zSWZJbXBsZW1lbnRlZCgyLCBnZXRfdmFsdWUsIHNlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZW0uYWNxdWlyZSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFJldHVybnNJZkltcGxlbWVudGVkKDEsIGdldF92YWx1ZSwgc2VtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbS5hY3F1aXJlKCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmV0dXJuc0lmSW1wbGVtZW50ZWQoMCwgZ2V0X3ZhbHVlLCBzZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VtLmFjcXVpcmUoRmFsc2UpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZXR1cm5zSWZJbXBsZW1lbnRlZCgwLCBnZXRfdmFsdWUsIHNlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZW0ucmVsZWFzZSgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJldHVybnNJZkltcGxlbWVudGVkKDEsIGdldF92YWx1ZSwgc2VtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbS5yZWxlYXNlKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmV0dXJuc0lmSW1wbGVtZW50ZWQoMiwgZ2V0X3ZhbHVlLCBzZW0pCisKKyAgICBkZWYgdGVzdF9zZW1hcGhvcmUoc2VsZik6CisgICAgICAgIHNlbSA9IHNlbGYuU2VtYXBob3JlKDIpCisgICAgICAgIHNlbGYuX3Rlc3Rfc2VtYXBob3JlKHNlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZW0ucmVsZWFzZSgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJldHVybnNJZkltcGxlbWVudGVkKDMsIGdldF92YWx1ZSwgc2VtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbS5yZWxlYXNlKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmV0dXJuc0lmSW1wbGVtZW50ZWQoNCwgZ2V0X3ZhbHVlLCBzZW0pCisKKyAgICBkZWYgdGVzdF9ib3VuZGVkX3NlbWFwaG9yZShzZWxmKToKKyAgICAgICAgc2VtID0gc2VsZi5Cb3VuZGVkU2VtYXBob3JlKDIpCisgICAgICAgIHNlbGYuX3Rlc3Rfc2VtYXBob3JlKHNlbSkKKyAgICAgICAgIyBDdXJyZW50bHkgZmFpbHMgb24gT1MvWAorICAgICAgICAjaWYgSEFWRV9HRVRWQUxVRToKKyAgICAgICAgIyAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZW0ucmVsZWFzZSkKKyAgICAgICAgIyAgICBzZWxmLmFzc2VydFJldHVybnNJZkltcGxlbWVudGVkKDIsIGdldF92YWx1ZSwgc2VtKQorCisgICAgZGVmIHRlc3RfdGltZW91dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5UWVBFICE9ICdwcm9jZXNzZXMnOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VtID0gc2VsZi5TZW1hcGhvcmUoMCkKKyAgICAgICAgYWNxdWlyZSA9IFRpbWluZ1dyYXBwZXIoc2VtLmFjcXVpcmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3F1aXJlKEZhbHNlKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoYWNxdWlyZS5lbGFwc2VkLCAwLjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3F1aXJlKEZhbHNlLCBOb25lKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoYWNxdWlyZS5lbGFwc2VkLCAwLjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3F1aXJlKEZhbHNlLCBUSU1FT1VUMSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKGFjcXVpcmUuZWxhcHNlZCwgMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjcXVpcmUoVHJ1ZSwgVElNRU9VVDIpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChhY3F1aXJlLmVsYXBzZWQsIFRJTUVPVVQyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWNxdWlyZSh0aW1lb3V0PVRJTUVPVVQzKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoYWNxdWlyZS5lbGFwc2VkLCBUSU1FT1VUMykKKworCitjbGFzcyBfVGVzdENvbmRpdGlvbihCYXNlVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGYoY2xzLCBjb25kLCBzbGVlcGluZywgd29rZW4sIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIGNvbmQuYWNxdWlyZSgpCisgICAgICAgIHNsZWVwaW5nLnJlbGVhc2UoKQorICAgICAgICBjb25kLndhaXQodGltZW91dCkKKyAgICAgICAgd29rZW4ucmVsZWFzZSgpCisgICAgICAgIGNvbmQucmVsZWFzZSgpCisKKyAgICBkZWYgY2hlY2tfaW52YXJpYW50KHNlbGYsIGNvbmQpOgorICAgICAgICAjIHRoaXMgaXMgb25seSBzdXBwb3NlZCB0byBzdWNjZWVkIHdoZW4gdGhlcmUgYXJlIG5vIHNsZWVwZXJzCisgICAgICAgIGlmIHNlbGYuVFlQRSA9PSAncHJvY2Vzc2VzJzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzbGVlcGVycyA9IChjb25kLl9zbGVlcGluZ19jb3VudC5nZXRfdmFsdWUoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZC5fd29rZW5fY291bnQuZ2V0X3ZhbHVlKCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGVlcGVycywgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbmQuX3dhaXRfc2VtYXBob3JlLmdldF92YWx1ZSgpLCAwKQorICAgICAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3Rfbm90aWZ5KHNlbGYpOgorICAgICAgICBjb25kID0gc2VsZi5Db25kaXRpb24oKQorICAgICAgICBzbGVlcGluZyA9IHNlbGYuU2VtYXBob3JlKDApCisgICAgICAgIHdva2VuID0gc2VsZi5TZW1hcGhvcmUoMCkKKworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLmYsIGFyZ3M9KGNvbmQsIHNsZWVwaW5nLCB3b2tlbikpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKworICAgICAgICBwID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5mLCBhcmdzPShjb25kLCBzbGVlcGluZywgd29rZW4pKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisKKyAgICAgICAgIyB3YWl0IGZvciBib3RoIGNoaWxkcmVuIHRvIHN0YXJ0IHNsZWVwaW5nCisgICAgICAgIHNsZWVwaW5nLmFjcXVpcmUoKQorICAgICAgICBzbGVlcGluZy5hY3F1aXJlKCkKKworICAgICAgICAjIGNoZWNrIG5vIHByb2Nlc3MvdGhyZWFkIGhhcyB3b2tlbiB1cAorICAgICAgICB0aW1lLnNsZWVwKERFTFRBKQorICAgICAgICBzZWxmLmFzc2VydFJldHVybnNJZkltcGxlbWVudGVkKDAsIGdldF92YWx1ZSwgd29rZW4pCisKKyAgICAgICAgIyB3YWtlIHVwIG9uZSBwcm9jZXNzL3RocmVhZAorICAgICAgICBjb25kLmFjcXVpcmUoKQorICAgICAgICBjb25kLm5vdGlmeSgpCisgICAgICAgIGNvbmQucmVsZWFzZSgpCisKKyAgICAgICAgIyBjaGVjayBvbmUgcHJvY2Vzcy90aHJlYWQgaGFzIHdva2VuIHVwCisgICAgICAgIHRpbWUuc2xlZXAoREVMVEEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmV0dXJuc0lmSW1wbGVtZW50ZWQoMSwgZ2V0X3ZhbHVlLCB3b2tlbikKKworICAgICAgICAjIHdha2UgdXAgYW5vdGhlcgorICAgICAgICBjb25kLmFjcXVpcmUoKQorICAgICAgICBjb25kLm5vdGlmeSgpCisgICAgICAgIGNvbmQucmVsZWFzZSgpCisKKyAgICAgICAgIyBjaGVjayBvdGhlciBoYXMgd29rZW4gdXAKKyAgICAgICAgdGltZS5zbGVlcChERUxUQSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZXR1cm5zSWZJbXBsZW1lbnRlZCgyLCBnZXRfdmFsdWUsIHdva2VuKQorCisgICAgICAgICMgY2hlY2sgc3RhdGUgaXMgbm90IG11Y2tlZCB1cAorICAgICAgICBzZWxmLmNoZWNrX2ludmFyaWFudChjb25kKQorICAgICAgICBwLmpvaW4oKQorCisgICAgZGVmIHRlc3Rfbm90aWZ5X2FsbChzZWxmKToKKyAgICAgICAgY29uZCA9IHNlbGYuQ29uZGl0aW9uKCkKKyAgICAgICAgc2xlZXBpbmcgPSBzZWxmLlNlbWFwaG9yZSgwKQorICAgICAgICB3b2tlbiA9IHNlbGYuU2VtYXBob3JlKDApCisKKyAgICAgICAgIyBzdGFydCBzb21lIHRocmVhZHMvcHJvY2Vzc2VzIHdoaWNoIHdpbGwgdGltZW91dAorICAgICAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oY29uZCwgc2xlZXBpbmcsIHdva2VuLCBUSU1FT1VUMSkpCisgICAgICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHAuc3RhcnQoKQorCisgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oY29uZCwgc2xlZXBpbmcsIHdva2VuLCBUSU1FT1VUMSkpCisgICAgICAgICAgICB0LmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHQuc3RhcnQoKQorCisgICAgICAgICMgd2FpdCBmb3IgdGhlbSBhbGwgdG8gc2xlZXAKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDYpOgorICAgICAgICAgICAgc2xlZXBpbmcuYWNxdWlyZSgpCisKKyAgICAgICAgIyBjaGVjayB0aGV5IGhhdmUgYWxsIHRpbWVkIG91dAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNik6CisgICAgICAgICAgICB3b2tlbi5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSZXR1cm5zSWZJbXBsZW1lbnRlZCgwLCBnZXRfdmFsdWUsIHdva2VuKQorCisgICAgICAgICMgY2hlY2sgc3RhdGUgaXMgbm90IG11Y2tlZCB1cAorICAgICAgICBzZWxmLmNoZWNrX2ludmFyaWFudChjb25kKQorCisgICAgICAgICMgc3RhcnQgc29tZSBtb3JlIHRocmVhZHMvcHJvY2Vzc2VzCisgICAgICAgIGZvciBpIGluIHJhbmdlKDMpOgorICAgICAgICAgICAgcCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5mLCBhcmdzPShjb25kLCBzbGVlcGluZywgd29rZW4pKQorICAgICAgICAgICAgcC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICBwLnN0YXJ0KCkKKworICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuZiwgYXJncz0oY29uZCwgc2xlZXBpbmcsIHdva2VuKSkKKyAgICAgICAgICAgIHQuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgdC5zdGFydCgpCisKKyAgICAgICAgIyB3YWl0IGZvciB0aGVtIHRvIGFsbCBzbGVlcAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNik6CisgICAgICAgICAgICBzbGVlcGluZy5hY3F1aXJlKCkKKworICAgICAgICAjIGNoZWNrIG5vIHByb2Nlc3MvdGhyZWFkIGhhcyB3b2tlbiB1cAorICAgICAgICB0aW1lLnNsZWVwKERFTFRBKQorICAgICAgICBzZWxmLmFzc2VydFJldHVybnNJZkltcGxlbWVudGVkKDAsIGdldF92YWx1ZSwgd29rZW4pCisKKyAgICAgICAgIyB3YWtlIHRoZW0gYWxsIHVwCisgICAgICAgIGNvbmQuYWNxdWlyZSgpCisgICAgICAgIGNvbmQubm90aWZ5X2FsbCgpCisgICAgICAgIGNvbmQucmVsZWFzZSgpCisKKyAgICAgICAgIyBjaGVjayB0aGV5IGhhdmUgYWxsIHdva2VuCisgICAgICAgIHRpbWUuc2xlZXAoREVMVEEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmV0dXJuc0lmSW1wbGVtZW50ZWQoNiwgZ2V0X3ZhbHVlLCB3b2tlbikKKworICAgICAgICAjIGNoZWNrIHN0YXRlIGlzIG5vdCBtdWNrZWQgdXAKKyAgICAgICAgc2VsZi5jaGVja19pbnZhcmlhbnQoY29uZCkKKworICAgIGRlZiB0ZXN0X3RpbWVvdXQoc2VsZik6CisgICAgICAgIGNvbmQgPSBzZWxmLkNvbmRpdGlvbigpCisgICAgICAgIHdhaXQgPSBUaW1pbmdXcmFwcGVyKGNvbmQud2FpdCkKKyAgICAgICAgY29uZC5hY3F1aXJlKCkKKyAgICAgICAgcmVzID0gd2FpdChUSU1FT1VUMSkKKyAgICAgICAgY29uZC5yZWxlYXNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwod2FpdC5lbGFwc2VkLCBUSU1FT1VUMSkKKworCitjbGFzcyBfVGVzdEV2ZW50KEJhc2VUZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlc3RfZXZlbnQoY2xzLCBldmVudCk6CisgICAgICAgIHRpbWUuc2xlZXAoVElNRU9VVDIpCisgICAgICAgIGV2ZW50LnNldCgpCisKKyAgICBkZWYgdGVzdF9ldmVudChzZWxmKToKKyAgICAgICAgZXZlbnQgPSBzZWxmLkV2ZW50KCkKKyAgICAgICAgd2FpdCA9IFRpbWluZ1dyYXBwZXIoZXZlbnQud2FpdCkKKworICAgICAgICAjIFJlbW92ZWQgdGVtcG9yYXJpbHksIGR1ZSB0byBBUEkgc2hlYXIsIHRoaXMgZG9lcyBub3QKKyAgICAgICAgIyB3b3JrIHdpdGggdGhyZWFkaW5nLl9FdmVudCBvYmplY3RzLiBpc19zZXQgPT0gaXNTZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudC5pc19zZXQoKSwgRmFsc2UpCisKKyAgICAgICAgIyBSZW1vdmVkLCB0aHJlYWRpbmcuRXZlbnQud2FpdCgpIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgX19mbGFnCisgICAgICAgICMgaW5zdGVhZCBvZiBOb25lLiBBUEkgU2hlYXIgd2l0aCB0aGUgc2VtYXBob3JlIGJhY2tlZCBtcC5FdmVudAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdhaXQoMC4wKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwod2FpdC5lbGFwc2VkLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2FpdChUSU1FT1VUMSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKHdhaXQuZWxhcHNlZCwgVElNRU9VVDEpCisKKyAgICAgICAgZXZlbnQuc2V0KCkKKworICAgICAgICAjIFNlZSBub3RlIGFib3ZlIG9uIHRoZSBBUEkgZGlmZmVyZW5jZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudC5pc19zZXQoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3YWl0KCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwod2FpdC5lbGFwc2VkLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2FpdChUSU1FT1VUMSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwod2FpdC5lbGFwc2VkLCAwLjApCisgICAgICAgICMgc2VsZi5hc3NlcnRFcXVhbChldmVudC5pc19zZXQoKSwgVHJ1ZSkKKworICAgICAgICBldmVudC5jbGVhcigpCisKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwoZXZlbnQuaXNfc2V0KCksIEZhbHNlKQorCisgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3Rlc3RfZXZlbnQsIGFyZ3M9KGV2ZW50LCkpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3YWl0KCksIFRydWUpCisKKyMKKyMKKyMKKworY2xhc3MgX1Rlc3RWYWx1ZShCYXNlVGVzdENhc2UpOgorCisgICAgQUxMT1dFRF9UWVBFUyA9ICgncHJvY2Vzc2VzJywpCisKKyAgICBjb2Rlc192YWx1ZXMgPSBbCisgICAgICAgICgnaScsIDQzNDMsIDI0MjM0KSwKKyAgICAgICAgKCdkJywgMy42MjUsIC00LjI1KSwKKyAgICAgICAgKCdoJywgLTIzMiwgMjM0KSwKKyAgICAgICAgKCdjJywgbGF0aW4oJ3gnKSwgbGF0aW4oJ3knKSkKKyAgICAgICAgXQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBub3QgSEFTX1NIQVJFRENUWVBFUzoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInJlcXVpcmVzIG11bHRpcHJvY2Vzc2luZy5zaGFyZWRjdHlwZXMiKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF90ZXN0KGNscywgdmFsdWVzKToKKyAgICAgICAgZm9yIHN2LCBjdiBpbiB6aXAodmFsdWVzLCBjbHMuY29kZXNfdmFsdWVzKToKKyAgICAgICAgICAgIHN2LnZhbHVlID0gY3ZbMl0KKworCisgICAgZGVmIHRlc3RfdmFsdWUoc2VsZiwgcmF3PUZhbHNlKToKKyAgICAgICAgaWYgcmF3OgorICAgICAgICAgICAgdmFsdWVzID0gW3NlbGYuUmF3VmFsdWUoY29kZSwgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgZm9yIGNvZGUsIHZhbHVlLCBfIGluIHNlbGYuY29kZXNfdmFsdWVzXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsdWVzID0gW3NlbGYuVmFsdWUoY29kZSwgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgZm9yIGNvZGUsIHZhbHVlLCBfIGluIHNlbGYuY29kZXNfdmFsdWVzXQorCisgICAgICAgIGZvciBzdiwgY3YgaW4gemlwKHZhbHVlcywgc2VsZi5jb2Rlc192YWx1ZXMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdi52YWx1ZSwgY3ZbMV0pCisKKyAgICAgICAgcHJvYyA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fdGVzdCwgYXJncz0odmFsdWVzLCkpCisgICAgICAgIHByb2MuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwcm9jLnN0YXJ0KCkKKyAgICAgICAgcHJvYy5qb2luKCkKKworICAgICAgICBmb3Igc3YsIGN2IGluIHppcCh2YWx1ZXMsIHNlbGYuY29kZXNfdmFsdWVzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3YudmFsdWUsIGN2WzJdKQorCisgICAgZGVmIHRlc3RfcmF3dmFsdWUoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF92YWx1ZShyYXc9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X2dldG9ial9nZXRsb2NrKHNlbGYpOgorICAgICAgICB2YWwxID0gc2VsZi5WYWx1ZSgnaScsIDUpCisgICAgICAgIGxvY2sxID0gdmFsMS5nZXRfbG9jaygpCisgICAgICAgIG9iajEgPSB2YWwxLmdldF9vYmooKQorCisgICAgICAgIHZhbDIgPSBzZWxmLlZhbHVlKCdpJywgNSwgbG9jaz1Ob25lKQorICAgICAgICBsb2NrMiA9IHZhbDIuZ2V0X2xvY2soKQorICAgICAgICBvYmoyID0gdmFsMi5nZXRfb2JqKCkKKworICAgICAgICBsb2NrID0gc2VsZi5Mb2NrKCkKKyAgICAgICAgdmFsMyA9IHNlbGYuVmFsdWUoJ2knLCA1LCBsb2NrPWxvY2spCisgICAgICAgIGxvY2szID0gdmFsMy5nZXRfbG9jaygpCisgICAgICAgIG9iajMgPSB2YWwzLmdldF9vYmooKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2ssIGxvY2szKQorCisgICAgICAgIGFycjQgPSBzZWxmLlZhbHVlKCdpJywgNSwgbG9jaz1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGFycjQsICdnZXRfbG9jaycpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYXJyNCwgJ2dldF9vYmonKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2VsZi5WYWx1ZSwgJ2knLCA1LCBsb2NrPSduYXZhbHVlJykKKworICAgICAgICBhcnI1ID0gc2VsZi5SYXdWYWx1ZSgnaScsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhcnI1LCAnZ2V0X2xvY2snKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGFycjUsICdnZXRfb2JqJykpCisKKworY2xhc3MgX1Rlc3RBcnJheShCYXNlVGVzdENhc2UpOgorCisgICAgQUxMT1dFRF9UWVBFUyA9ICgncHJvY2Vzc2VzJywpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZihjbHMsIHNlcSk6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihzZXEpKToKKyAgICAgICAgICAgIHNlcVtpXSArPSBzZXFbaS0xXQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihjX2ludCBpcyBOb25lLCAicmVxdWlyZXMgX2N0eXBlcyIpCisgICAgZGVmIHRlc3RfYXJyYXkoc2VsZiwgcmF3PUZhbHNlKToKKyAgICAgICAgc2VxID0gWzY4MCwgNjI2LCA5MzQsIDgyMSwgMTUwLCAyMzMsIDU0OCwgOTgyLCA3MTQsIDgzMV0KKyAgICAgICAgaWYgcmF3OgorICAgICAgICAgICAgYXJyID0gc2VsZi5SYXdBcnJheSgnaScsIHNlcSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyciA9IHNlbGYuQXJyYXkoJ2knLCBzZXEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYXJyKSwgbGVuKHNlcSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJyWzNdLCBzZXFbM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChhcnJbMjo3XSksIGxpc3Qoc2VxWzI6N10pKQorCisgICAgICAgIGFycls0OjhdID0gc2VxWzQ6OF0gPSBhcnJheS5hcnJheSgnaScsIFsxLCAyLCAzLCA0XSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYXJyWzpdKSwgc2VxKQorCisgICAgICAgIHNlbGYuZihzZXEpCisKKyAgICAgICAgcCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5mLCBhcmdzPShhcnIsKSkKKyAgICAgICAgcC5kYWVtb24gPSBUcnVlCisgICAgICAgIHAuc3RhcnQoKQorICAgICAgICBwLmpvaW4oKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChhcnJbOl0pLCBzZXEpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKGNfaW50IGlzIE5vbmUsICJyZXF1aXJlcyBfY3R5cGVzIikKKyAgICBkZWYgdGVzdF9hcnJheV9mcm9tX3NpemUoc2VsZik6CisgICAgICAgIHNpemUgPSAxMAorICAgICAgICAjIFRlc3QgZm9yIHplcm9pbmcgKHNlZSBpc3N1ZSAjMTE2NzUpLgorICAgICAgICAjIFRoZSByZXBldGl0aW9uIGJlbG93IHN0cmVuZ3RoZW5zIHRoZSB0ZXN0IGJ5IGluY3JlYXNpbmcgdGhlIGNoYW5jZXMKKyAgICAgICAgIyBvZiBwcmV2aW91c2x5IGFsbG9jYXRlZCBub24temVybyBtZW1vcnkgYmVpbmcgdXNlZCBmb3IgdGhlIG5ldyBhcnJheQorICAgICAgICAjIG9uIHRoZSAybmQgYW5kIDNyZCBsb29wcy4KKyAgICAgICAgZm9yIF8gaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICBhcnIgPSBzZWxmLkFycmF5KCdpJywgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFyciksIHNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYXJyKSwgWzBdICogc2l6ZSkKKyAgICAgICAgICAgIGFycls6XSA9IHJhbmdlKDEwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGFyciksIHJhbmdlKDEwKSkKKyAgICAgICAgICAgIGRlbCBhcnIKKworICAgIEB1bml0dGVzdC5za2lwSWYoY19pbnQgaXMgTm9uZSwgInJlcXVpcmVzIF9jdHlwZXMiKQorICAgIGRlZiB0ZXN0X3Jhd2FycmF5KHNlbGYpOgorICAgICAgICBzZWxmLnRlc3RfYXJyYXkocmF3PVRydWUpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKGNfaW50IGlzIE5vbmUsICJyZXF1aXJlcyBfY3R5cGVzIikKKyAgICBkZWYgdGVzdF9hcnJheV9hY2NlcHRzX2xvbmcoc2VsZik6CisgICAgICAgIGFyciA9IHNlbGYuQXJyYXkoJ2knLCAxMEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFyciksIDEwKQorICAgICAgICByYXdfYXJyID0gc2VsZi5SYXdBcnJheSgnaScsIDEwTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmF3X2FyciksIDEwKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihjX2ludCBpcyBOb25lLCAicmVxdWlyZXMgX2N0eXBlcyIpCisgICAgZGVmIHRlc3RfZ2V0b2JqX2dldGxvY2tfb2JqKHNlbGYpOgorICAgICAgICBhcnIxID0gc2VsZi5BcnJheSgnaScsIHJhbmdlKDEwKSkKKyAgICAgICAgbG9jazEgPSBhcnIxLmdldF9sb2NrKCkKKyAgICAgICAgb2JqMSA9IGFycjEuZ2V0X29iaigpCisKKyAgICAgICAgYXJyMiA9IHNlbGYuQXJyYXkoJ2knLCByYW5nZSgxMCksIGxvY2s9Tm9uZSkKKyAgICAgICAgbG9jazIgPSBhcnIyLmdldF9sb2NrKCkKKyAgICAgICAgb2JqMiA9IGFycjIuZ2V0X29iaigpCisKKyAgICAgICAgbG9jayA9IHNlbGYuTG9jaygpCisgICAgICAgIGFycjMgPSBzZWxmLkFycmF5KCdpJywgcmFuZ2UoMTApLCBsb2NrPWxvY2spCisgICAgICAgIGxvY2szID0gYXJyMy5nZXRfbG9jaygpCisgICAgICAgIG9iajMgPSBhcnIzLmdldF9vYmooKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2ssIGxvY2szKQorCisgICAgICAgIGFycjQgPSBzZWxmLkFycmF5KCdpJywgcmFuZ2UoMTApLCBsb2NrPUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYXJyNCwgJ2dldF9sb2NrJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhcnI0LCAnZ2V0X29iaicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5BcnJheSwgJ2knLCByYW5nZSgxMCksIGxvY2s9J25vdGFsb2NrJykKKworICAgICAgICBhcnI1ID0gc2VsZi5SYXdBcnJheSgnaScsIHJhbmdlKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGFycjUsICdnZXRfbG9jaycpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYXJyNSwgJ2dldF9vYmonKSkKKworIworIworIworCitjbGFzcyBfVGVzdENvbnRhaW5lcnMoQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ21hbmFnZXInLCkKKworICAgIGRlZiB0ZXN0X2xpc3Qoc2VsZik6CisgICAgICAgIGEgPSBzZWxmLmxpc3QocmFuZ2UoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOl0sIHJhbmdlKDEwKSkKKworICAgICAgICBiID0gc2VsZi5saXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCBbXSkKKworICAgICAgICBiLmV4dGVuZChyYW5nZSg1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCByYW5nZSg1KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMl0sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlsyOjEwXSwgWzIsMyw0XSkKKworICAgICAgICBiICo9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCBbMCwgMSwgMiwgMywgNCwgMCwgMSwgMiwgMywgNF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiICsgWzUsIDZdLCBbMCwgMSwgMiwgMywgNCwgMCwgMSwgMiwgMywgNCwgNSwgNl0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzpdLCByYW5nZSgxMCkpCisKKyAgICAgICAgZCA9IFthLCBiXQorICAgICAgICBlID0gc2VsZi5saXN0KGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBlWzpdLAorICAgICAgICAgICAgW1swLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XSwgWzAsIDEsIDIsIDMsIDQsIDAsIDEsIDIsIDMsIDRdXQorICAgICAgICAgICAgKQorCisgICAgICAgIGYgPSBzZWxmLmxpc3QoW2FdKQorICAgICAgICBhLmFwcGVuZCgnaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZbOl0sIFtbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgJ2hlbGxvJ11dKQorCisgICAgZGVmIHRlc3RfZGljdChzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuZGljdCgpCisgICAgICAgIGluZGljZXMgPSByYW5nZSg2NSwgNzApCisgICAgICAgIGZvciBpIGluIGluZGljZXM6CisgICAgICAgICAgICBkW2ldID0gY2hyKGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5jb3B5KCksIGRpY3QoKGksIGNocihpKSkgZm9yIGkgaW4gaW5kaWNlcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGQua2V5cygpKSwgaW5kaWNlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoZC52YWx1ZXMoKSksIFtjaHIoaSkgZm9yIGkgaW4gaW5kaWNlc10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGQuaXRlbXMoKSksIFsoaSwgY2hyKGkpKSBmb3IgaSBpbiBpbmRpY2VzXSkKKworICAgIGRlZiB0ZXN0X25hbWVzcGFjZShzZWxmKToKKyAgICAgICAgbiA9IHNlbGYuTmFtZXNwYWNlKCkKKyAgICAgICAgbi5uYW1lID0gJ0JvYicKKyAgICAgICAgbi5qb2IgPSAnQnVpbGRlcicKKyAgICAgICAgbi5faGlkZGVuID0gJ2hpZGRlbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobi5uYW1lLCBuLmpvYiksICgnQm9iJywgJ0J1aWxkZXInKSkKKyAgICAgICAgZGVsIG4uam9iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG4pLCAiTmFtZXNwYWNlKG5hbWU9J0JvYicpIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIobiwgJ25hbWUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKG4sICdqb2InKSkKKworIworIworIworCitkZWYgc3FyKHgsIHdhaXQ9MC4wKToKKyAgICB0aW1lLnNsZWVwKHdhaXQpCisgICAgcmV0dXJuIHgqeAorY2xhc3MgX1Rlc3RQb29sKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hcHBseShzZWxmKToKKyAgICAgICAgcGFwcGx5ID0gc2VsZi5wb29sLmFwcGx5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFwcGx5KHNxciwgKDUsKSksIHNxcig1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXBwbHkoc3FyLCAoKSwgeyd4JzozfSksIHNxcih4PTMpKQorCisgICAgZGVmIHRlc3RfbWFwKHNlbGYpOgorICAgICAgICBwbWFwID0gc2VsZi5wb29sLm1hcAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBtYXAoc3FyLCByYW5nZSgxMCkpLCBtYXAoc3FyLCByYW5nZSgxMCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBtYXAoc3FyLCByYW5nZSgxMDApLCBjaHVua3NpemU9MjApLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hcChzcXIsIHJhbmdlKDEwMCkpKQorCisgICAgZGVmIHRlc3RfbWFwX2NodW5rc2l6ZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5wb29sLm1hcF9hc3luYyhzcXIsIFtdLCBjaHVua3NpemU9MSkuZ2V0KHRpbWVvdXQ9VElNRU9VVDEpCisgICAgICAgIGV4Y2VwdCBtdWx0aXByb2Nlc3NpbmcuVGltZW91dEVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJwb29sLm1hcF9hc3luYyB3aXRoIGNodW5rc2l6ZSBzdGFsbGVkIG9uIG51bGwgbGlzdCIpCisKKyAgICBkZWYgdGVzdF9hc3luYyhzZWxmKToKKyAgICAgICAgcmVzID0gc2VsZi5wb29sLmFwcGx5X2FzeW5jKHNxciwgKDcsIFRJTUVPVVQxLCkpCisgICAgICAgIGdldCA9IFRpbWluZ1dyYXBwZXIocmVzLmdldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXQoKSwgNDkpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoZ2V0LmVsYXBzZWQsIFRJTUVPVVQxKQorCisgICAgZGVmIHRlc3RfYXN5bmNfdGltZW91dChzZWxmKToKKyAgICAgICAgcmVzID0gc2VsZi5wb29sLmFwcGx5X2FzeW5jKHNxciwgKDYsIFRJTUVPVVQyICsgMC4yKSkKKyAgICAgICAgZ2V0ID0gVGltaW5nV3JhcHBlcihyZXMuZ2V0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhtdWx0aXByb2Nlc3NpbmcuVGltZW91dEVycm9yLCBnZXQsIHRpbWVvdXQ9VElNRU9VVDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoZ2V0LmVsYXBzZWQsIFRJTUVPVVQyKQorCisgICAgZGVmIHRlc3RfaW1hcChzZWxmKToKKyAgICAgICAgaXQgPSBzZWxmLnBvb2wuaW1hcChzcXIsIHJhbmdlKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0KSwgbWFwKHNxciwgcmFuZ2UoMTApKSkKKworICAgICAgICBpdCA9IHNlbGYucG9vbC5pbWFwKHNxciwgcmFuZ2UoMTApKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0Lm5leHQoKSwgaSppKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBpdC5uZXh0KQorCisgICAgICAgIGl0ID0gc2VsZi5wb29sLmltYXAoc3FyLCByYW5nZSgxMDAwKSwgY2h1bmtzaXplPTEwMCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0Lm5leHQoKSwgaSppKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBpdC5uZXh0KQorCisgICAgZGVmIHRlc3RfaW1hcF91bm9yZGVyZWQoc2VsZik6CisgICAgICAgIGl0ID0gc2VsZi5wb29sLmltYXBfdW5vcmRlcmVkKHNxciwgcmFuZ2UoMTAwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGl0KSwgbWFwKHNxciwgcmFuZ2UoMTAwMCkpKQorCisgICAgICAgIGl0ID0gc2VsZi5wb29sLmltYXBfdW5vcmRlcmVkKHNxciwgcmFuZ2UoMTAwMCksIGNodW5rc2l6ZT01MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoaXQpLCBtYXAoc3FyLCByYW5nZSgxMDAwKSkpCisKKyAgICBkZWYgdGVzdF9tYWtlX3Bvb2woc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG11bHRpcHJvY2Vzc2luZy5Qb29sLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbXVsdGlwcm9jZXNzaW5nLlBvb2wsIDApCisKKyAgICAgICAgcCA9IG11bHRpcHJvY2Vzc2luZy5Qb29sKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKHAuX3Bvb2wpKQorICAgICAgICBwLmNsb3NlKCkKKyAgICAgICAgcC5qb2luKCkKKworICAgIGRlZiB0ZXN0X3Rlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5UWVBFID09ICdtYW5hZ2VyJzoKKyAgICAgICAgICAgICMgT24gVW5peCBhIGZvcmtlZCBwcm9jZXNzIGluY3JlZnMgZWFjaCBzaGFyZWQgb2JqZWN0IHRvCisgICAgICAgICAgICAjIHdoaWNoIGl0cyBwYXJlbnQgcHJvY2VzcyBoZWxkIGEgcmVmZXJlbmNlLiAgSWYgdGhlCisgICAgICAgICAgICAjIGZvcmtlZCBwcm9jZXNzIGdldHMgdGVybWluYXRlZCB0aGVuIHRoZXJlIGlzIGxpa2VseSB0bworICAgICAgICAgICAgIyBiZSBhIHJlZmVyZW5jZSBsZWFrLiAgU28gdG8gcHJldmVudAorICAgICAgICAgICAgIyBfVGVzdFpaWk51bWJlck9mT2JqZWN0cyBmcm9tIGZhaWxpbmcgd2Ugc2tpcCB0aGlzIHRlc3QKKyAgICAgICAgICAgICMgd2hlbiB1c2luZyBhIG1hbmFnZXIuCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICByZXN1bHQgPSBzZWxmLnBvb2wubWFwX2FzeW5jKAorICAgICAgICAgICAgdGltZS5zbGVlcCwgWzAuMSBmb3IgaSBpbiByYW5nZSgxMDAwMCldLCBjaHVua3NpemU9MQorICAgICAgICAgICAgKQorICAgICAgICBzZWxmLnBvb2wudGVybWluYXRlKCkKKyAgICAgICAgam9pbiA9IFRpbWluZ1dyYXBwZXIoc2VsZi5wb29sLmpvaW4pCisgICAgICAgIGpvaW4oKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoam9pbi5lbGFwc2VkIDwgMC4yKQorCisgICAgZGVmIHRlc3RfZW1wdHlfaXRlcmFibGUoc2VsZik6CisgICAgICAgICMgU2VlIElzc3VlIDEyMTU3CisgICAgICAgIHAgPSBzZWxmLlBvb2woMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubWFwKHNxciwgW10pLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHAuaW1hcChzcXIsIFtdKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocC5pbWFwX3Vub3JkZXJlZChzcXIsIFtdKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubWFwX2FzeW5jKHNxciwgW10pLmdldCgpLCBbXSkKKworICAgICAgICBwLmNsb3NlKCkKKyAgICAgICAgcC5qb2luKCkKKworZGVmIHVucGlja2xlYWJsZV9yZXN1bHQoKToKKyAgICByZXR1cm4gbGFtYmRhOiA0MgorCitjbGFzcyBfVGVzdFBvb2xXb3JrZXJFcnJvcnMoQmFzZVRlc3RDYXNlKToKKyAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCApCisKKyAgICBkZWYgdGVzdF91bnBpY2tsZWFibGVfcmVzdWx0KHNlbGYpOgorICAgICAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5wb29sIGltcG9ydCBNYXliZUVuY29kaW5nRXJyb3IKKyAgICAgICAgcCA9IG11bHRpcHJvY2Vzc2luZy5Qb29sKDIpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgd2UgZG9uJ3QgbG9zZSBwb29sIHByb2Nlc3NlcyBiZWNhdXNlIG9mIGVuY29kaW5nIGVycm9ycy4KKyAgICAgICAgZm9yIGl0ZXJhdGlvbiBpbiByYW5nZSgyMCk6CisgICAgICAgICAgICByZXMgPSBwLmFwcGx5X2FzeW5jKHVucGlja2xlYWJsZV9yZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhNYXliZUVuY29kaW5nRXJyb3IsIHJlcy5nZXQpCisKKyAgICAgICAgcC5jbG9zZSgpCisgICAgICAgIHAuam9pbigpCisKK2NsYXNzIF9UZXN0UG9vbFdvcmtlckxpZmV0aW1lKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCApCisgICAgZGVmIHRlc3RfcG9vbF93b3JrZXJfbGlmZXRpbWUoc2VsZik6CisgICAgICAgIHAgPSBtdWx0aXByb2Nlc3NpbmcuUG9vbCgzLCBtYXh0YXNrc3BlcmNoaWxkPTEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihwLl9wb29sKSkKKyAgICAgICAgb3JpZ3dvcmtlcnBpZHMgPSBbdy5waWQgZm9yIHcgaW4gcC5fcG9vbF0KKyAgICAgICAgIyBSdW4gbWFueSB0YXNrcyBzbyBlYWNoIHdvcmtlciBnZXRzIHJlcGxhY2VkIChob3BlZnVsbHkpCisgICAgICAgIHJlc3VsdHMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDApOgorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQocC5hcHBseV9hc3luYyhzcXIsIChpLCApKSkKKyAgICAgICAgIyBGZXRjaCB0aGUgcmVzdWx0cyBhbmQgdmVyaWZ5IHdlIGdvdCB0aGUgcmlnaHQgYW5zd2VycywKKyAgICAgICAgIyBhbHNvIGVuc3VyaW5nIGFsbCB0aGUgdGFza3MgaGF2ZSBjb21wbGV0ZWQuCisgICAgICAgIGZvciAoaiwgcmVzKSBpbiBlbnVtZXJhdGUocmVzdWx0cyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5nZXQoKSwgc3FyKGopKQorICAgICAgICAjIFJlZmlsbCB0aGUgcG9vbAorICAgICAgICBwLl9yZXBvcHVsYXRlX3Bvb2woKQorICAgICAgICAjIFdhaXQgdW50aWwgYWxsIHdvcmtlcnMgYXJlIGFsaXZlCisgICAgICAgICMgKGNvdW50ZG93biAqIERFTFRBID0gNSBzZWNvbmRzIG1heCBzdGFydHVwIHByb2Nlc3MgdGltZSkKKyAgICAgICAgY291bnRkb3duID0gNTAKKyAgICAgICAgd2hpbGUgY291bnRkb3duIGFuZCBub3QgYWxsKHcuaXNfYWxpdmUoKSBmb3IgdyBpbiBwLl9wb29sKToKKyAgICAgICAgICAgIGNvdW50ZG93biAtPSAxCisgICAgICAgICAgICB0aW1lLnNsZWVwKERFTFRBKQorICAgICAgICBmaW5hbHdvcmtlcnBpZHMgPSBbdy5waWQgZm9yIHcgaW4gcC5fcG9vbF0KKyAgICAgICAgIyBBbGwgcGlkcyBzaG91bGQgYmUgYXNzaWduZWQuICBTZWUgaXNzdWUgIzc4MDUuCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oTm9uZSwgb3JpZ3dvcmtlcnBpZHMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oTm9uZSwgZmluYWx3b3JrZXJwaWRzKQorICAgICAgICAjIEZpbmFsbHksIGNoZWNrIHRoYXQgdGhlIHdvcmtlciBwaWRzIGhhdmUgY2hhbmdlZAorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNvcnRlZChvcmlnd29ya2VycGlkcyksIHNvcnRlZChmaW5hbHdvcmtlcnBpZHMpKQorICAgICAgICBwLmNsb3NlKCkKKyAgICAgICAgcC5qb2luKCkKKworICAgIGRlZiB0ZXN0X3Bvb2xfd29ya2VyX2xpZmV0aW1lX2Vhcmx5X2Nsb3NlKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMDMzMjogY2xvc2luZyBhIHBvb2wgd2hvc2Ugd29ya2VycyBoYXZlIGxpbWl0ZWQgbGlmZXRpbWVzCisgICAgICAgICMgYmVmb3JlIGFsbCB0aGUgdGFza3MgY29tcGxldGVkIHdvdWxkIG1ha2Ugam9pbigpIGhhbmcuCisgICAgICAgIHAgPSBtdWx0aXByb2Nlc3NpbmcuUG9vbCgzLCBtYXh0YXNrc3BlcmNoaWxkPTEpCisgICAgICAgIHJlc3VsdHMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSg2KToKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHAuYXBwbHlfYXN5bmMoc3FyLCAoaSwgMC4zKSkpCisgICAgICAgIHAuY2xvc2UoKQorICAgICAgICBwLmpvaW4oKQorICAgICAgICAjIGNoZWNrIHRoZSByZXN1bHRzCisgICAgICAgIGZvciAoaiwgcmVzKSBpbiBlbnVtZXJhdGUocmVzdWx0cyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5nZXQoKSwgc3FyKGopKQorCisKKyMKKyMgVGVzdCB0aGF0IG1hbmFnZXIgaGFzIGV4cGVjdGVkIG51bWJlciBvZiBzaGFyZWQgb2JqZWN0cyBsZWZ0CisjCisKK2NsYXNzIF9UZXN0WlpaTnVtYmVyT2ZPYmplY3RzKEJhc2VUZXN0Q2FzZSk6CisgICAgIyBCZWNhdXNlIHRlc3QgY2FzZXMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseSwgdGhpcyBvbmUgd2lsbCBnZXQKKyAgICAjIHJ1biBhZnRlciBhbGwgdGhlIG90aGVyIHRlc3RzIGZvciB0aGUgbWFuYWdlci4gIEl0IHRlc3RzIHRoYXQKKyAgICAjIHRoZXJlIGhhdmUgYmVlbiBubyAicmVmZXJlbmNlIGxlYWtzIiBmb3IgdGhlIG1hbmFnZXIncyBzaGFyZWQKKyAgICAjIG9iamVjdHMuICBOb3RlIHRoZSBjb21tZW50IGluIF9UZXN0UG9vbC50ZXN0X3Rlcm1pbmF0ZSgpLgorICAgIEFMTE9XRURfVFlQRVMgPSAoJ21hbmFnZXInLCkKKworICAgIGRlZiB0ZXN0X251bWJlcl9vZl9vYmplY3RzKHNlbGYpOgorICAgICAgICBFWFBFQ1RFRF9OVU1CRVIgPSAxICAgICAgICAgICAgICAgICMgdGhlIHBvb2wgb2JqZWN0IGlzIHN0aWxsIGFsaXZlCisgICAgICAgIG11bHRpcHJvY2Vzc2luZy5hY3RpdmVfY2hpbGRyZW4oKSAgIyBkaXNjYXJkIGRlYWQgcHJvY2VzcyBvYmpzCisgICAgICAgIGdjLmNvbGxlY3QoKSAgICAgICAgICAgICAgICAgICAgICAgIyBkbyBnYXJiYWdlIGNvbGxlY3Rpb24KKyAgICAgICAgcmVmcyA9IHNlbGYubWFuYWdlci5fbnVtYmVyX29mX29iamVjdHMoKQorICAgICAgICBkZWJ1Z19pbmZvID0gc2VsZi5tYW5hZ2VyLl9kZWJ1Z19pbmZvKCkKKyAgICAgICAgaWYgcmVmcyAhPSBFWFBFQ1RFRF9OVU1CRVI6CisgICAgICAgICAgICBwcmludCBzZWxmLm1hbmFnZXIuX2RlYnVnX2luZm8oKQorICAgICAgICAgICAgcHJpbnQgZGVidWdfaW5mbworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmcywgRVhQRUNURURfTlVNQkVSKQorCisjCisjIFRlc3Qgb2YgY3JlYXRpbmcgYSBjdXN0b21pemVkIG1hbmFnZXIgY2xhc3MKKyMKKworZnJvbSBtdWx0aXByb2Nlc3NpbmcubWFuYWdlcnMgaW1wb3J0IEJhc2VNYW5hZ2VyLCBCYXNlUHJveHksIFJlbW90ZUVycm9yCisKK2NsYXNzIEZvb0JhcihvYmplY3QpOgorICAgIGRlZiBmKHNlbGYpOgorICAgICAgICByZXR1cm4gJ2YoKScKKyAgICBkZWYgZyhzZWxmKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgIGRlZiBfaChzZWxmKToKKyAgICAgICAgcmV0dXJuICdfaCgpJworCitkZWYgYmF6KCk6CisgICAgZm9yIGkgaW4geHJhbmdlKDEwKToKKyAgICAgICAgeWllbGQgaSppCisKK2NsYXNzIEl0ZXJhdG9yUHJveHkoQmFzZVByb3h5KToKKyAgICBfZXhwb3NlZF8gPSAoJ25leHQnLCAnX19uZXh0X18nKQorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ25leHQnKQorICAgIGRlZiBfX25leHRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ19fbmV4dF9fJykKKworY2xhc3MgTXlNYW5hZ2VyKEJhc2VNYW5hZ2VyKToKKyAgICBwYXNzCisKK015TWFuYWdlci5yZWdpc3RlcignRm9vJywgY2FsbGFibGU9Rm9vQmFyKQorTXlNYW5hZ2VyLnJlZ2lzdGVyKCdCYXInLCBjYWxsYWJsZT1Gb29CYXIsIGV4cG9zZWQ9KCdmJywgJ19oJykpCitNeU1hbmFnZXIucmVnaXN0ZXIoJ2JheicsIGNhbGxhYmxlPWJheiwgcHJveHl0eXBlPUl0ZXJhdG9yUHJveHkpCisKKworY2xhc3MgX1Rlc3RNeU1hbmFnZXIoQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ21hbmFnZXInLCkKKworICAgIGRlZiB0ZXN0X215bWFuYWdlcihzZWxmKToKKyAgICAgICAgbWFuYWdlciA9IE15TWFuYWdlcigpCisgICAgICAgIG1hbmFnZXIuc3RhcnQoKQorCisgICAgICAgIGZvbyA9IG1hbmFnZXIuRm9vKCkKKyAgICAgICAgYmFyID0gbWFuYWdlci5CYXIoKQorICAgICAgICBiYXogPSBtYW5hZ2VyLmJheigpCisKKyAgICAgICAgZm9vX21ldGhvZHMgPSBbbmFtZSBmb3IgbmFtZSBpbiAoJ2YnLCAnZycsICdfaCcpIGlmIGhhc2F0dHIoZm9vLCBuYW1lKV0KKyAgICAgICAgYmFyX21ldGhvZHMgPSBbbmFtZSBmb3IgbmFtZSBpbiAoJ2YnLCAnZycsICdfaCcpIGlmIGhhc2F0dHIoYmFyLCBuYW1lKV0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvb19tZXRob2RzLCBbJ2YnLCAnZyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhcl9tZXRob2RzLCBbJ2YnLCAnX2gnXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5mKCksICdmKCknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb28uZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uX2NhbGxtZXRob2QoJ2YnKSwgJ2YoKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJlbW90ZUVycm9yLCBmb28uX2NhbGxtZXRob2QsICdfaCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXIuZigpLCAnZigpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXIuX2goKSwgJ19oKCknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhci5fY2FsbG1ldGhvZCgnZicpLCAnZigpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXIuX2NhbGxtZXRob2QoJ19oJyksICdfaCgpJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYmF6KSwgW2kqaSBmb3IgaSBpbiByYW5nZSgxMCldKQorCisgICAgICAgIG1hbmFnZXIuc2h1dGRvd24oKQorCisjCisjIFRlc3Qgb2YgY29ubmVjdGluZyB0byBhIHJlbW90ZSBzZXJ2ZXIgYW5kIHVzaW5nIHhtbHJwY2xpYiBmb3Igc2VyaWFsaXphdGlvbgorIworCitfcXVldWUgPSBRdWV1ZS5RdWV1ZSgpCitkZWYgZ2V0X3F1ZXVlKCk6CisgICAgcmV0dXJuIF9xdWV1ZQorCitjbGFzcyBRdWV1ZU1hbmFnZXIoQmFzZU1hbmFnZXIpOgorICAgICcnJ21hbmFnZXIgY2xhc3MgdXNlZCBieSBzZXJ2ZXIgcHJvY2VzcycnJworUXVldWVNYW5hZ2VyLnJlZ2lzdGVyKCdnZXRfcXVldWUnLCBjYWxsYWJsZT1nZXRfcXVldWUpCisKK2NsYXNzIFF1ZXVlTWFuYWdlcjIoQmFzZU1hbmFnZXIpOgorICAgICcnJ21hbmFnZXIgY2xhc3Mgd2hpY2ggc3BlY2lmaWVzIHRoZSBzYW1lIGludGVyZmFjZSBhcyBRdWV1ZU1hbmFnZXInJycKK1F1ZXVlTWFuYWdlcjIucmVnaXN0ZXIoJ2dldF9xdWV1ZScpCisKKworU0VSSUFMSVpFUiA9ICd4bWxycGNsaWInCisKK2NsYXNzIF9UZXN0UmVtb3RlTWFuYWdlcihCYXNlVGVzdENhc2UpOgorCisgICAgQUxMT1dFRF9UWVBFUyA9ICgnbWFuYWdlcicsKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9wdXR0ZXIoY2xzLCBhZGRyZXNzLCBhdXRoa2V5KToKKyAgICAgICAgbWFuYWdlciA9IFF1ZXVlTWFuYWdlcjIoCisgICAgICAgICAgICBhZGRyZXNzPWFkZHJlc3MsIGF1dGhrZXk9YXV0aGtleSwgc2VyaWFsaXplcj1TRVJJQUxJWkVSCisgICAgICAgICAgICApCisgICAgICAgIG1hbmFnZXIuY29ubmVjdCgpCisgICAgICAgIHF1ZXVlID0gbWFuYWdlci5nZXRfcXVldWUoKQorICAgICAgICBxdWV1ZS5wdXQoKCdoZWxsbyB3b3JsZCcsIE5vbmUsIFRydWUsIDIuMjUpKQorCisgICAgZGVmIHRlc3RfcmVtb3RlKHNlbGYpOgorICAgICAgICBhdXRoa2V5ID0gb3MudXJhbmRvbSgzMikKKworICAgICAgICBtYW5hZ2VyID0gUXVldWVNYW5hZ2VyKAorICAgICAgICAgICAgYWRkcmVzcz0oJ2xvY2FsaG9zdCcsIDApLCBhdXRoa2V5PWF1dGhrZXksIHNlcmlhbGl6ZXI9U0VSSUFMSVpFUgorICAgICAgICAgICAgKQorICAgICAgICBtYW5hZ2VyLnN0YXJ0KCkKKworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl9wdXR0ZXIsIGFyZ3M9KG1hbmFnZXIuYWRkcmVzcywgYXV0aGtleSkpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKworICAgICAgICBtYW5hZ2VyMiA9IFF1ZXVlTWFuYWdlcjIoCisgICAgICAgICAgICBhZGRyZXNzPW1hbmFnZXIuYWRkcmVzcywgYXV0aGtleT1hdXRoa2V5LCBzZXJpYWxpemVyPVNFUklBTElaRVIKKyAgICAgICAgICAgICkKKyAgICAgICAgbWFuYWdlcjIuY29ubmVjdCgpCisgICAgICAgIHF1ZXVlID0gbWFuYWdlcjIuZ2V0X3F1ZXVlKCkKKworICAgICAgICAjIE5vdGUgdGhhdCB4bWxycGNsaWIgd2lsbCBkZXNlcmlhbGl6ZSBvYmplY3QgYXMgYSBsaXN0IG5vdCBhIHR1cGxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVldWUuZ2V0KCksIFsnaGVsbG8gd29ybGQnLCBOb25lLCBUcnVlLCAyLjI1XSkKKworICAgICAgICAjIEJlY2F1c2Ugd2UgYXJlIHVzaW5nIHhtbHJwY2xpYiBmb3Igc2VyaWFsaXphdGlvbiBpbnN0ZWFkIG9mCisgICAgICAgICMgcGlja2xlIHRoaXMgd2lsbCBjYXVzZSBhIHNlcmlhbGl6YXRpb24gZXJyb3IuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgcXVldWUucHV0LCB0aW1lLnNsZWVwKQorCisgICAgICAgICMgTWFrZSBxdWV1ZSBmaW5hbGl6ZXIgcnVuIGJlZm9yZSB0aGUgc2VydmVyIGlzIHN0b3BwZWQKKyAgICAgICAgZGVsIHF1ZXVlCisgICAgICAgIG1hbmFnZXIuc2h1dGRvd24oKQorCitjbGFzcyBfVGVzdE1hbmFnZXJSZXN0YXJ0KEJhc2VUZXN0Q2FzZSk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3B1dHRlcihjbHMsIGFkZHJlc3MsIGF1dGhrZXkpOgorICAgICAgICBtYW5hZ2VyID0gUXVldWVNYW5hZ2VyKAorICAgICAgICAgICAgYWRkcmVzcz1hZGRyZXNzLCBhdXRoa2V5PWF1dGhrZXksIHNlcmlhbGl6ZXI9U0VSSUFMSVpFUikKKyAgICAgICAgbWFuYWdlci5jb25uZWN0KCkKKyAgICAgICAgcXVldWUgPSBtYW5hZ2VyLmdldF9xdWV1ZSgpCisgICAgICAgIHF1ZXVlLnB1dCgnaGVsbG8gd29ybGQnKQorCisgICAgZGVmIHRlc3RfcmFwaWRfcmVzdGFydChzZWxmKToKKyAgICAgICAgYXV0aGtleSA9IG9zLnVyYW5kb20oMzIpCisgICAgICAgIG1hbmFnZXIgPSBRdWV1ZU1hbmFnZXIoCisgICAgICAgICAgICBhZGRyZXNzPSgnbG9jYWxob3N0JywgMCksIGF1dGhrZXk9YXV0aGtleSwgc2VyaWFsaXplcj1TRVJJQUxJWkVSKQorICAgICAgICBzcnZyID0gbWFuYWdlci5nZXRfc2VydmVyKCkKKyAgICAgICAgYWRkciA9IHNydnIuYWRkcmVzcworICAgICAgICAjIENsb3NlIHRoZSBjb25uZWN0aW9uLkxpc3RlbmVyIHNvY2tldCB3aGljaCBnZXRzIG9wZW5lZCBhcyBhIHBhcnQKKyAgICAgICAgIyBvZiBtYW5hZ2VyLmdldF9zZXJ2ZXIoKS4gSXQncyBub3QgbmVlZGVkIGZvciB0aGUgdGVzdC4KKyAgICAgICAgc3J2ci5saXN0ZW5lci5jbG9zZSgpCisgICAgICAgIG1hbmFnZXIuc3RhcnQoKQorCisgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3B1dHRlciwgYXJncz0obWFuYWdlci5hZGRyZXNzLCBhdXRoa2V5KSkKKyAgICAgICAgcC5kYWVtb24gPSBUcnVlCisgICAgICAgIHAuc3RhcnQoKQorICAgICAgICBxdWV1ZSA9IG1hbmFnZXIuZ2V0X3F1ZXVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdWV1ZS5nZXQoKSwgJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZGVsIHF1ZXVlCisgICAgICAgIG1hbmFnZXIuc2h1dGRvd24oKQorICAgICAgICBtYW5hZ2VyID0gUXVldWVNYW5hZ2VyKAorICAgICAgICAgICAgYWRkcmVzcz1hZGRyLCBhdXRoa2V5PWF1dGhrZXksIHNlcmlhbGl6ZXI9U0VSSUFMSVpFUikKKyAgICAgICAgbWFuYWdlci5zdGFydCgpCisgICAgICAgIG1hbmFnZXIuc2h1dGRvd24oKQorCisjCisjCisjCisKK1NFTlRJTkVMID0gbGF0aW4oJycpCisKK2NsYXNzIF9UZXN0Q29ubmVjdGlvbihCYXNlVGVzdENhc2UpOgorCisgICAgQUxMT1dFRF9UWVBFUyA9ICgncHJvY2Vzc2VzJywgJ3RocmVhZHMnKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9lY2hvKGNscywgY29ubik6CisgICAgICAgIGZvciBtc2cgaW4gaXRlcihjb25uLnJlY3ZfYnl0ZXMsIFNFTlRJTkVMKToKKyAgICAgICAgICAgIGNvbm4uc2VuZF9ieXRlcyhtc2cpCisgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgZGVmIHRlc3RfY29ubmVjdGlvbihzZWxmKToKKyAgICAgICAgY29ubiwgY2hpbGRfY29ubiA9IHNlbGYuUGlwZSgpCisKKyAgICAgICAgcCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fZWNobywgYXJncz0oY2hpbGRfY29ubiwpKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisKKyAgICAgICAgc2VxID0gWzEsIDIuMjUsIE5vbmVdCisgICAgICAgIG1zZyA9IGxhdGluKCdoZWxsbyB3b3JsZCcpCisgICAgICAgIGxvbmdtc2cgPSBtc2cgKiAxMAorICAgICAgICBhcnIgPSBhcnJheS5hcnJheSgnaScsIHJhbmdlKDQpKQorCisgICAgICAgIGlmIHNlbGYuVFlQRSA9PSAncHJvY2Vzc2VzJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShjb25uLmZpbGVubygpKSwgaW50KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5zZW5kKHNlcSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5yZWN2KCksIHNlcSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4uc2VuZF9ieXRlcyhtc2cpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4ucmVjdl9ieXRlcygpLCBtc2cpCisKKyAgICAgICAgaWYgc2VsZi5UWVBFID09ICdwcm9jZXNzZXMnOgorICAgICAgICAgICAgYnVmZmVyID0gYXJyYXkuYXJyYXkoJ2knLCBbMF0qMTApCisgICAgICAgICAgICBleHBlY3RlZCA9IGxpc3QoYXJyKSArIFswXSAqICgxMCAtIGxlbihhcnIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnNlbmRfYnl0ZXMoYXJyKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5yZWN2X2J5dGVzX2ludG8oYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGFycikgKiBidWZmZXIuaXRlbXNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYnVmZmVyKSwgZXhwZWN0ZWQpCisKKyAgICAgICAgICAgIGJ1ZmZlciA9IGFycmF5LmFycmF5KCdpJywgWzBdKjEwKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSBbMF0gKiAzICsgbGlzdChhcnIpICsgWzBdICogKDEwIC0gMyAtIGxlbihhcnIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnNlbmRfYnl0ZXMoYXJyKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5yZWN2X2J5dGVzX2ludG8oYnVmZmVyLCAzICogYnVmZmVyLml0ZW1zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGFycikgKiBidWZmZXIuaXRlbXNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYnVmZmVyKSwgZXhwZWN0ZWQpCisKKyAgICAgICAgICAgIGJ1ZmZlciA9IGJ5dGVhcnJheShsYXRpbignICcgKiA0MCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4uc2VuZF9ieXRlcyhsb25nbXNnKSwgTm9uZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXMgPSBjb25uLnJlY3ZfYnl0ZXNfaW50byhidWZmZXIpCisgICAgICAgICAgICBleGNlcHQgbXVsdGlwcm9jZXNzaW5nLkJ1ZmZlclRvb1Nob3J0LCBlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzLCAobG9uZ21zZywpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ2V4cGVjdGVkIEJ1ZmZlclRvb1Nob3J0LCBnb3QgJXMnICUgcmVzKQorCisgICAgICAgIHBvbGwgPSBUaW1pbmdXcmFwcGVyKGNvbm4ucG9sbCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvbGwoKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwocG9sbC5lbGFwc2VkLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9sbChUSU1FT1VUMSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKHBvbGwuZWxhcHNlZCwgVElNRU9VVDEpCisKKyAgICAgICAgY29ubi5zZW5kKE5vbmUpCisgICAgICAgIHRpbWUuc2xlZXAoLjEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb2xsKFRJTUVPVVQxKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChwb2xsLmVsYXBzZWQsIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnJlY3YoKSwgTm9uZSkKKworICAgICAgICByZWFsbHlfYmlnX21zZyA9IGxhdGluKCdYJykgKiAoMTAyNCAqIDEwMjQgKiAxNikgICAjIDE2TWIKKyAgICAgICAgY29ubi5zZW5kX2J5dGVzKHJlYWxseV9iaWdfbXNnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4ucmVjdl9ieXRlcygpLCByZWFsbHlfYmlnX21zZykKKworICAgICAgICBjb25uLnNlbmRfYnl0ZXMoU0VOVElORUwpICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRlbGwgY2hpbGQgdG8gcXVpdAorICAgICAgICBjaGlsZF9jb25uLmNsb3NlKCkKKworICAgICAgICBpZiBzZWxmLlRZUEUgPT0gJ3Byb2Nlc3Nlcyc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4ucmVhZGFibGUsIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4ud3JpdGFibGUsIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgY29ubi5yZWN2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGNvbm4ucmVjdl9ieXRlcykKKworICAgICAgICBwLmpvaW4oKQorCisgICAgZGVmIHRlc3RfZHVwbGV4X2ZhbHNlKHNlbGYpOgorICAgICAgICByZWFkZXIsIHdyaXRlciA9IHNlbGYuUGlwZShkdXBsZXg9RmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JpdGVyLnNlbmQoMSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlY3YoKSwgMSkKKyAgICAgICAgaWYgc2VsZi5UWVBFID09ICdwcm9jZXNzZXMnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGFibGUsIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci53cml0YWJsZSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyaXRlci5yZWFkYWJsZSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyaXRlci53cml0YWJsZSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHJlYWRlci5zZW5kLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgd3JpdGVyLnJlY3YpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB3cml0ZXIucG9sbCkKKworICAgIGRlZiB0ZXN0X3NwYXduX2Nsb3NlKHNlbGYpOgorICAgICAgICAjIFdlIHRlc3QgdGhhdCBhIHBpcGUgY29ubmVjdGlvbiBjYW4gYmUgY2xvc2VkIGJ5IHBhcmVudAorICAgICAgICAjIHByb2Nlc3MgaW1tZWRpYXRlbHkgYWZ0ZXIgY2hpbGQgaXMgc3Bhd25lZC4gIE9uIFdpbmRvd3MgdGhpcworICAgICAgICAjIHdvdWxkIGhhdmUgc29tZXRpbWVzIGZhaWxlZCBvbiBvbGQgdmVyc2lvbnMgYmVjYXVzZQorICAgICAgICAjIGNoaWxkX2Nvbm4gd291bGQgYmUgY2xvc2VkIGJlZm9yZSB0aGUgY2hpbGQgZ290IGEgY2hhbmNlIHRvCisgICAgICAgICMgZHVwbGljYXRlIGl0LgorICAgICAgICBjb25uLCBjaGlsZF9jb25uID0gc2VsZi5QaXBlKCkKKworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl9lY2hvLCBhcmdzPShjaGlsZF9jb25uLCkpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgY2hpbGRfY29ubi5jbG9zZSgpICAgICMgdGhpcyBtaWdodCBjb21wbGV0ZSBiZWZvcmUgY2hpbGQgaW5pdGlhbGl6ZXMKKworICAgICAgICBtc2cgPSBsYXRpbignaGVsbG8nKQorICAgICAgICBjb25uLnNlbmRfYnl0ZXMobXNnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4ucmVjdl9ieXRlcygpLCBtc2cpCisKKyAgICAgICAgY29ubi5zZW5kX2J5dGVzKFNFTlRJTkVMKQorICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgcC5qb2luKCkKKworICAgIGRlZiB0ZXN0X3NlbmRieXRlcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5UWVBFICE9ICdwcm9jZXNzZXMnOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgbXNnID0gbGF0aW4oJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JykKKyAgICAgICAgYSwgYiA9IHNlbGYuUGlwZSgpCisKKyAgICAgICAgYS5zZW5kX2J5dGVzKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJlY3ZfYnl0ZXMoKSwgbXNnKQorCisgICAgICAgIGEuc2VuZF9ieXRlcyhtc2csIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yZWN2X2J5dGVzKCksIG1zZ1s1Ol0pCisKKyAgICAgICAgYS5zZW5kX2J5dGVzKG1zZywgNywgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJlY3ZfYnl0ZXMoKSwgbXNnWzc6Nys4XSkKKworICAgICAgICBhLnNlbmRfYnl0ZXMobXNnLCAyNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJlY3ZfYnl0ZXMoKSwgbGF0aW4oJycpKQorCisgICAgICAgIGEuc2VuZF9ieXRlcyhtc2csIDI2LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucmVjdl9ieXRlcygpLCBsYXRpbignJykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5zZW5kX2J5dGVzLCBtc2csIDI3KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEuc2VuZF9ieXRlcywgbXNnLCAyMiwgNSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLnNlbmRfYnl0ZXMsIG1zZywgMjYsIDEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5zZW5kX2J5dGVzLCBtc2csIC0xKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEuc2VuZF9ieXRlcywgbXNnLCA0LCAtMSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfaXNfZmRfYXNzaWduZWQoY2xzLCBmZCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmZzdGF0KGZkKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FQkFERjoKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF93cml0ZWZkKGNscywgY29ubiwgZGF0YSwgY3JlYXRlX2R1bW15X2Zkcz1GYWxzZSk6CisgICAgICAgIGlmIGNyZWF0ZV9kdW1teV9mZHM6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCAyNTYpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBjbHMuX2lzX2ZkX2Fzc2lnbmVkKGkpOgorICAgICAgICAgICAgICAgICAgICBvcy5kdXAyKGNvbm4uZmlsZW5vKCksIGkpCisgICAgICAgIGZkID0gcmVkdWN0aW9uLnJlY3ZfaGFuZGxlKGNvbm4pCisgICAgICAgIGlmIG1zdmNydDoKKyAgICAgICAgICAgIGZkID0gbXN2Y3J0Lm9wZW5fb3NmaGFuZGxlKGZkLCBvcy5PX1dST05MWSkKKyAgICAgICAgb3Mud3JpdGUoZmQsIGRhdGEpCisgICAgICAgIG9zLmNsb3NlKGZkKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFTX1JFRFVDVElPTiwgInRlc3QgbmVlZHMgbXVsdGlwcm9jZXNzaW5nLnJlZHVjdGlvbiIpCisgICAgZGVmIHRlc3RfZmRfdHJhbnNmZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuVFlQRSAhPSAncHJvY2Vzc2VzJzoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIm9ubHkgbWFrZXMgc2Vuc2Ugd2l0aCBwcm9jZXNzZXMiKQorICAgICAgICBjb25uLCBjaGlsZF9jb25uID0gc2VsZi5QaXBlKGR1cGxleD1UcnVlKQorCisgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3dyaXRlZmQsIGFyZ3M9KGNoaWxkX2Nvbm4sIGIiZm9vIikpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBmZCA9IGYuZmlsZW5vKCkKKyAgICAgICAgICAgIGlmIG1zdmNydDoKKyAgICAgICAgICAgICAgICBmZCA9IG1zdmNydC5nZXRfb3NmaGFuZGxlKGZkKQorICAgICAgICAgICAgcmVkdWN0aW9uLnNlbmRfaGFuZGxlKGNvbm4sIGZkLCBwLnBpZCkKKyAgICAgICAgcC5qb2luKCkKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiImZvbyIpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhIQVNfUkVEVUNUSU9OLCAidGVzdCBuZWVkcyBtdWx0aXByb2Nlc3NpbmcucmVkdWN0aW9uIikKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLAorICAgICAgICAgICAgICAgICAgICAgInRlc3Qgc2VtYW50aWNzIGRvbid0IG1ha2Ugc2Vuc2Ugb24gV2luZG93cyIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihNQVhGRCA8PSAyNTYsCisgICAgICAgICAgICAgICAgICAgICAibGFyZ2VzdCBhc3NpZ25hYmxlIGZkIG51bWJlciBpcyB0b28gc21hbGwiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICJkdXAyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgbmVlZHMgb3MuZHVwMigpIikKKyAgICBkZWYgdGVzdF9sYXJnZV9mZF90cmFuc2ZlcihzZWxmKToKKyAgICAgICAgIyBXaXRoIGZkID4gMjU2IChpc3N1ZSAjMTE2NTcpCisgICAgICAgIGlmIHNlbGYuVFlQRSAhPSAncHJvY2Vzc2VzJzoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIm9ubHkgbWFrZXMgc2Vuc2Ugd2l0aCBwcm9jZXNzZXMiKQorICAgICAgICBjb25uLCBjaGlsZF9jb25uID0gc2VsZi5QaXBlKGR1cGxleD1UcnVlKQorCisgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3dyaXRlZmQsIGFyZ3M9KGNoaWxkX2Nvbm4sIGIiYmFyIiwgVHJ1ZSkpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBmZCA9IGYuZmlsZW5vKCkKKyAgICAgICAgICAgIGZvciBuZXdmZCBpbiByYW5nZSgyNTYsIE1BWEZEKToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5faXNfZmRfYXNzaWduZWQobmV3ZmQpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImNvdWxkIG5vdCBmaW5kIGFuIHVuYXNzaWduZWQgbGFyZ2UgZmlsZSBkZXNjcmlwdG9yIikKKyAgICAgICAgICAgIG9zLmR1cDIoZmQsIG5ld2ZkKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlZHVjdGlvbi5zZW5kX2hhbmRsZShjb25uLCBuZXdmZCwgcC5waWQpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLmNsb3NlKG5ld2ZkKQorICAgICAgICBwLmpvaW4oKQorICAgICAgICB3aXRoIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGIiYmFyIikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfc2VuZF9kYXRhX3dpdGhvdXRfZmQoc2VsZiwgY29ubik6CisgICAgICAgIG9zLndyaXRlKGNvbm4uZmlsZW5vKCksIGIiXDAiKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFTX1JFRFVDVElPTiwgInRlc3QgbmVlZHMgbXVsdGlwcm9jZXNzaW5nLnJlZHVjdGlvbiIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgImRvZXNuJ3QgbWFrZSBzZW5zZSBvbiBXaW5kb3dzIikKKyAgICBkZWYgdGVzdF9taXNzaW5nX2ZkX3RyYW5zZmVyKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIHJlY2VpdmVkIGRhdGEgaXMgbm90CisgICAgICAgICMgYWNjb21wYW5pZWQgYnkgYSBmaWxlIGRlc2NyaXB0b3IgaW4gYW5jaWxsYXJ5IGRhdGEuCisgICAgICAgIGlmIHNlbGYuVFlQRSAhPSAncHJvY2Vzc2VzJzoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIm9ubHkgbWFrZXMgc2Vuc2Ugd2l0aCBwcm9jZXNzZXMiKQorICAgICAgICBjb25uLCBjaGlsZF9jb25uID0gc2VsZi5QaXBlKGR1cGxleD1UcnVlKQorCisgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3NlbmRfZGF0YV93aXRob3V0X2ZkLCBhcmdzPShjaGlsZF9jb25uLCkpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCByZWR1Y3Rpb24ucmVjdl9oYW5kbGUsIGNvbm4pCisgICAgICAgIHAuam9pbigpCisKK2NsYXNzIF9UZXN0TGlzdGVuZXJDbGllbnQoQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ3Byb2Nlc3NlcycsICd0aHJlYWRzJykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfdGVzdChjbHMsIGFkZHJlc3MpOgorICAgICAgICBjb25uID0gY2xzLmNvbm5lY3Rpb24uQ2xpZW50KGFkZHJlc3MpCisgICAgICAgIGNvbm4uc2VuZCgnaGVsbG8nKQorICAgICAgICBjb25uLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2xpc3RlbmVyX2NsaWVudChzZWxmKToKKyAgICAgICAgZm9yIGZhbWlseSBpbiBzZWxmLmNvbm5lY3Rpb24uZmFtaWxpZXM6CisgICAgICAgICAgICBsID0gc2VsZi5jb25uZWN0aW9uLkxpc3RlbmVyKGZhbWlseT1mYW1pbHkpCisgICAgICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl90ZXN0LCBhcmdzPShsLmFkZHJlc3MsKSkKKyAgICAgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgcC5zdGFydCgpCisgICAgICAgICAgICBjb25uID0gbC5hY2NlcHQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnJlY3YoKSwgJ2hlbGxvJykKKyAgICAgICAgICAgIHAuam9pbigpCisgICAgICAgICAgICBsLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2lzc3VlMTQ3MjUoc2VsZik6CisgICAgICAgIGwgPSBzZWxmLmNvbm5lY3Rpb24uTGlzdGVuZXIoKQorICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl90ZXN0LCBhcmdzPShsLmFkZHJlc3MsKSkKKyAgICAgICAgcC5kYWVtb24gPSBUcnVlCisgICAgICAgIHAuc3RhcnQoKQorICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgICMgT24gV2luZG93cyB0aGUgY2xpZW50IHByb2Nlc3Mgc2hvdWxkIGJ5IG5vdyBoYXZlIGNvbm5lY3RlZCwKKyAgICAgICAgIyB3cml0dGVuIGRhdGEgYW5kIGNsb3NlZCB0aGUgcGlwZSBoYW5kbGUgYnkgbm93LiAgVGhpcyBjYXVzZXMKKyAgICAgICAgIyBDb25uZWN0TmFtZGVkUGlwZSgpIHRvIGZhaWwgd2l0aCBFUlJPUl9OT19EQVRBLiAgU2VlIElzc3VlCisgICAgICAgICMgMTQ3MjUuCisgICAgICAgIGNvbm4gPSBsLmFjY2VwdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5yZWN2KCksICdoZWxsbycpCisgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICBwLmpvaW4oKQorICAgICAgICBsLmNsb3NlKCkKKworIworIyBUZXN0IG9mIHNlbmRpbmcgY29ubmVjdGlvbiBhbmQgc29ja2V0IG9iamVjdHMgYmV0d2VlbiBwcm9jZXNzZXMKKyMKKyIiIgorY2xhc3MgX1Rlc3RQaWNrbGluZ0Nvbm5lY3Rpb25zKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCkKKworICAgIGRlZiBfbGlzdGVuZXIoc2VsZiwgY29ubiwgZmFtaWxpZXMpOgorICAgICAgICBmb3IgZmFtIGluIGZhbWlsaWVzOgorICAgICAgICAgICAgbCA9IHNlbGYuY29ubmVjdGlvbi5MaXN0ZW5lcihmYW1pbHk9ZmFtKQorICAgICAgICAgICAgY29ubi5zZW5kKGwuYWRkcmVzcykKKyAgICAgICAgICAgIG5ld19jb25uID0gbC5hY2NlcHQoKQorICAgICAgICAgICAgY29ubi5zZW5kKG5ld19jb25uKQorCisgICAgICAgIGlmIHNlbGYuVFlQRSA9PSAncHJvY2Vzc2VzJzoKKyAgICAgICAgICAgIGwgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgICAgIGwuYmluZCgoJ2xvY2FsaG9zdCcsIDApKQorICAgICAgICAgICAgY29ubi5zZW5kKGwuZ2V0c29ja25hbWUoKSkKKyAgICAgICAgICAgIGwubGlzdGVuKDEpCisgICAgICAgICAgICBuZXdfY29ubiwgYWRkciA9IGwuYWNjZXB0KCkKKyAgICAgICAgICAgIGNvbm4uc2VuZChuZXdfY29ubikKKworICAgICAgICBjb25uLnJlY3YoKQorCisgICAgZGVmIF9yZW1vdGUoc2VsZiwgY29ubik6CisgICAgICAgIGZvciAoYWRkcmVzcywgbXNnKSBpbiBpdGVyKGNvbm4ucmVjdiwgTm9uZSk6CisgICAgICAgICAgICBjbGllbnQgPSBzZWxmLmNvbm5lY3Rpb24uQ2xpZW50KGFkZHJlc3MpCisgICAgICAgICAgICBjbGllbnQuc2VuZChtc2cudXBwZXIoKSkKKyAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpCisKKyAgICAgICAgaWYgc2VsZi5UWVBFID09ICdwcm9jZXNzZXMnOgorICAgICAgICAgICAgYWRkcmVzcywgbXNnID0gY29ubi5yZWN2KCkKKyAgICAgICAgICAgIGNsaWVudCA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICAgICAgY2xpZW50LmNvbm5lY3QoYWRkcmVzcykKKyAgICAgICAgICAgIGNsaWVudC5zZW5kYWxsKG1zZy51cHBlcigpKQorICAgICAgICAgICAgY2xpZW50LmNsb3NlKCkKKworICAgICAgICBjb25uLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBtdWx0aXByb2Nlc3NpbmcuYWxsb3dfY29ubmVjdGlvbl9waWNrbGluZygpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZhbWlsaWVzID0gc2VsZi5jb25uZWN0aW9uLmZhbWlsaWVzCisKKyAgICAgICAgbGNvbm4sIGxjb25uMCA9IHNlbGYuUGlwZSgpCisgICAgICAgIGxwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl9saXN0ZW5lciwgYXJncz0obGNvbm4wLCBmYW1pbGllcykpCisgICAgICAgIGxwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgbHAuc3RhcnQoKQorICAgICAgICBsY29ubjAuY2xvc2UoKQorCisgICAgICAgIHJjb25uLCByY29ubjAgPSBzZWxmLlBpcGUoKQorICAgICAgICBycCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fcmVtb3RlLCBhcmdzPShyY29ubjAsKSkKKyAgICAgICAgcnAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBycC5zdGFydCgpCisgICAgICAgIHJjb25uMC5jbG9zZSgpCisKKyAgICAgICAgZm9yIGZhbSBpbiBmYW1pbGllczoKKyAgICAgICAgICAgIG1zZyA9ICgnVGhpcyBjb25uZWN0aW9uIHVzZXMgZmFtaWx5ICVzJyAlIGZhbSkuZW5jb2RlKCdhc2NpaScpCisgICAgICAgICAgICBhZGRyZXNzID0gbGNvbm4ucmVjdigpCisgICAgICAgICAgICByY29ubi5zZW5kKChhZGRyZXNzLCBtc2cpKQorICAgICAgICAgICAgbmV3X2Nvbm4gPSBsY29ubi5yZWN2KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X2Nvbm4ucmVjdigpLCBtc2cudXBwZXIoKSkKKworICAgICAgICByY29ubi5zZW5kKE5vbmUpCisKKyAgICAgICAgaWYgc2VsZi5UWVBFID09ICdwcm9jZXNzZXMnOgorICAgICAgICAgICAgbXNnID0gbGF0aW4oJ1RoaXMgY29ubmVjdGlvbiB1c2VzIGEgbm9ybWFsIHNvY2tldCcpCisgICAgICAgICAgICBhZGRyZXNzID0gbGNvbm4ucmVjdigpCisgICAgICAgICAgICByY29ubi5zZW5kKChhZGRyZXNzLCBtc2cpKQorICAgICAgICAgICAgaWYgaGFzYXR0cihzb2NrZXQsICdmcm9tZmQnKToKKyAgICAgICAgICAgICAgICBuZXdfY29ubiA9IGxjb25uLnJlY3YoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X2Nvbm4ucmVjdigxMDApLCBtc2cudXBwZXIoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBYWFggT24gV2luZG93cyB3aXRoIFB5Mi42IG5lZWQgdG8gYmFja3BvcnQgZnJvbWZkKCkKKyAgICAgICAgICAgICAgICBkaXNjYXJkID0gbGNvbm4ucmVjdl9ieXRlcygpCisKKyAgICAgICAgbGNvbm4uc2VuZChOb25lKQorCisgICAgICAgIHJjb25uLmNsb3NlKCkKKyAgICAgICAgbGNvbm4uY2xvc2UoKQorCisgICAgICAgIGxwLmpvaW4oKQorICAgICAgICBycC5qb2luKCkKKyIiIgorIworIworIworCitjbGFzcyBfVGVzdEhlYXAoQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ3Byb2Nlc3NlcycsKQorCisgICAgZGVmIHRlc3RfaGVhcChzZWxmKToKKyAgICAgICAgaXRlcmF0aW9ucyA9IDUwMDAKKyAgICAgICAgbWF4YmxvY2tzID0gNTAKKyAgICAgICAgYmxvY2tzID0gW10KKworICAgICAgICAjIGNyZWF0ZSBhbmQgZGVzdHJveSBsb3RzIG9mIGJsb2NrcyBvZiBkaWZmZXJlbnQgc2l6ZXMKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGl0ZXJhdGlvbnMpOgorICAgICAgICAgICAgc2l6ZSA9IGludChyYW5kb20ubG9nbm9ybXZhcmlhdGUoMCwgMSkgKiAxMDAwKQorICAgICAgICAgICAgYiA9IG11bHRpcHJvY2Vzc2luZy5oZWFwLkJ1ZmZlcldyYXBwZXIoc2l6ZSkKKyAgICAgICAgICAgIGJsb2Nrcy5hcHBlbmQoYikKKyAgICAgICAgICAgIGlmIGxlbihibG9ja3MpID4gbWF4YmxvY2tzOgorICAgICAgICAgICAgICAgIGkgPSByYW5kb20ucmFuZHJhbmdlKG1heGJsb2NrcykKKyAgICAgICAgICAgICAgICBkZWwgYmxvY2tzW2ldCisKKyAgICAgICAgIyBnZXQgdGhlIGhlYXAgb2JqZWN0CisgICAgICAgIGhlYXAgPSBtdWx0aXByb2Nlc3NpbmcuaGVhcC5CdWZmZXJXcmFwcGVyLl9oZWFwCisKKyAgICAgICAgIyB2ZXJpZnkgdGhlIHN0YXRlIG9mIHRoZSBoZWFwCisgICAgICAgIGFsbCA9IFtdCisgICAgICAgIG9jY3VwaWVkID0gMAorICAgICAgICBoZWFwLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoaGVhcC5fbG9jay5yZWxlYXNlKQorICAgICAgICBmb3IgTCBpbiBoZWFwLl9sZW5fdG9fc2VxLnZhbHVlcygpOgorICAgICAgICAgICAgZm9yIGFyZW5hLCBzdGFydCwgc3RvcCBpbiBMOgorICAgICAgICAgICAgICAgIGFsbC5hcHBlbmQoKGhlYXAuX2FyZW5hcy5pbmRleChhcmVuYSksIHN0YXJ0LCBzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3Atc3RhcnQsICdmcmVlJykpCisgICAgICAgIGZvciBhcmVuYSwgc3RhcnQsIHN0b3AgaW4gaGVhcC5fYWxsb2NhdGVkX2Jsb2NrczoKKyAgICAgICAgICAgIGFsbC5hcHBlbmQoKGhlYXAuX2FyZW5hcy5pbmRleChhcmVuYSksIHN0YXJ0LCBzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcC1zdGFydCwgJ29jY3VwaWVkJykpCisgICAgICAgICAgICBvY2N1cGllZCArPSAoc3RvcC1zdGFydCkKKworICAgICAgICBhbGwuc29ydCgpCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGFsbCktMSk6CisgICAgICAgICAgICAoYXJlbmEsIHN0YXJ0LCBzdG9wKSA9IGFsbFtpXVs6M10KKyAgICAgICAgICAgIChuYXJlbmEsIG5zdGFydCwgbnN0b3ApID0gYWxsW2krMV1bOjNdCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoKGFyZW5hICE9IG5hcmVuYSBhbmQgbnN0YXJ0ID09IDApIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0b3AgPT0gbnN0YXJ0KSkKKworICAgIGRlZiB0ZXN0X2ZyZWVfZnJvbV9nYyhzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGZyZWVpbmcgb2YgYmxvY2tzIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3RvciBkb2Vzbid0IGRlYWRsb2NrCisgICAgICAgICMgKGlzc3VlICMxMjM1MikuCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBHQyBpcyBlbmFibGVkLCBhbmQgc2V0IGxvd2VyIGNvbGxlY3Rpb24gdGhyZXNob2xkcyB0bworICAgICAgICAjIG1ha2UgY29sbGVjdGlvbnMgbW9yZSBmcmVxdWVudCAoYW5kIGluY3JlYXNlIHRoZSBwcm9iYWJpbGl0eSBvZgorICAgICAgICAjIGRlYWRsb2NrKS4KKyAgICAgICAgaWYgbm90IGdjLmlzZW5hYmxlZCgpOgorICAgICAgICAgICAgZ2MuZW5hYmxlKCkKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChnYy5kaXNhYmxlKQorICAgICAgICB0aHJlc2hvbGRzID0gZ2MuZ2V0X3RocmVzaG9sZCgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChnYy5zZXRfdGhyZXNob2xkLCAqdGhyZXNob2xkcykKKyAgICAgICAgZ2Muc2V0X3RocmVzaG9sZCgxMCkKKworICAgICAgICAjIHBlcmZvcm0gbnVtZXJvdXMgYmxvY2sgYWxsb2NhdGlvbnMsIHdpdGggY3ljbGljIHJlZmVyZW5jZXMgdG8gbWFrZQorICAgICAgICAjIHN1cmUgb2JqZWN0cyBhcmUgY29sbGVjdGVkIGFzeW5jaHJvbm91c2x5IGJ5IHRoZSBnYworICAgICAgICBmb3IgaSBpbiByYW5nZSg1MDAwKToKKyAgICAgICAgICAgIGEgPSBtdWx0aXByb2Nlc3NpbmcuaGVhcC5CdWZmZXJXcmFwcGVyKDEpCisgICAgICAgICAgICBiID0gbXVsdGlwcm9jZXNzaW5nLmhlYXAuQnVmZmVyV3JhcHBlcigxKQorICAgICAgICAgICAgIyBjaXJjdWxhciByZWZlcmVuY2VzCisgICAgICAgICAgICBhLmJ1ZGR5ID0gYgorICAgICAgICAgICAgYi5idWRkeSA9IGEKKworIworIworIworCitjbGFzcyBfRm9vKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbCisgICAgICAgICgneCcsIGNfaW50KSwKKyAgICAgICAgKCd5JywgY19kb3VibGUpCisgICAgICAgIF0KKworY2xhc3MgX1Rlc3RTaGFyZWRDVHlwZXMoQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ3Byb2Nlc3NlcycsKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBub3QgSEFTX1NIQVJFRENUWVBFUzoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInJlcXVpcmVzIG11bHRpcHJvY2Vzc2luZy5zaGFyZWRjdHlwZXMiKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9kb3VibGUoY2xzLCB4LCB5LCBmb28sIGFyciwgc3RyaW5nKToKKyAgICAgICAgeC52YWx1ZSAqPSAyCisgICAgICAgIHkudmFsdWUgKj0gMgorICAgICAgICBmb28ueCAqPSAyCisgICAgICAgIGZvby55ICo9IDIKKyAgICAgICAgc3RyaW5nLnZhbHVlICo9IDIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGFycikpOgorICAgICAgICAgICAgYXJyW2ldICo9IDIKKworICAgIGRlZiB0ZXN0X3NoYXJlZGN0eXBlcyhzZWxmLCBsb2NrPUZhbHNlKToKKyAgICAgICAgeCA9IFZhbHVlKCdpJywgNywgbG9jaz1sb2NrKQorICAgICAgICB5ID0gVmFsdWUoY19kb3VibGUsIDEuMC8zLjAsIGxvY2s9bG9jaykKKyAgICAgICAgZm9vID0gVmFsdWUoX0ZvbywgMywgMiwgbG9jaz1sb2NrKQorICAgICAgICBhcnIgPSBzZWxmLkFycmF5KCdkJywgcmFuZ2UoMTApLCBsb2NrPWxvY2spCisgICAgICAgIHN0cmluZyA9IHNlbGYuQXJyYXkoJ2MnLCAyMCwgbG9jaz1sb2NrKQorICAgICAgICBzdHJpbmcudmFsdWUgPSBsYXRpbignaGVsbG8nKQorCisgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuX2RvdWJsZSwgYXJncz0oeCwgeSwgZm9vLCBhcnIsIHN0cmluZykpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgcC5qb2luKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgudmFsdWUsIDE0KQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHkudmFsdWUsIDIuMC8zLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLngsIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZm9vLnksIDQuMCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChhcnJbaV0sIGkqMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmcudmFsdWUsIGxhdGluKCdoZWxsb2hlbGxvJykpCisKKyAgICBkZWYgdGVzdF9zeW5jaHJvbml6ZShzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X3NoYXJlZGN0eXBlcyhsb2NrPVRydWUpCisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBmb28gPSBfRm9vKDIsIDUuMCkKKyAgICAgICAgYmFyID0gY29weShmb28pCisgICAgICAgIGZvby54ID0gMAorICAgICAgICBmb28ueSA9IDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXIueCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChiYXIueSwgNS4wKQorCisjCisjCisjCisKK2NsYXNzIF9UZXN0RmluYWxpemUoQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ3Byb2Nlc3NlcycsKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF90ZXN0X2ZpbmFsaXplKGNscywgY29ubik6CisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGEgPSBGb28oKQorICAgICAgICB1dGlsLkZpbmFsaXplKGEsIGNvbm4uc2VuZCwgYXJncz0oJ2EnLCkpCisgICAgICAgIGRlbCBhICAgICAgICAgICAjIHRyaWdnZXJzIGNhbGxiYWNrIGZvciBhCisKKyAgICAgICAgYiA9IEZvbygpCisgICAgICAgIGNsb3NlX2IgPSB1dGlsLkZpbmFsaXplKGIsIGNvbm4uc2VuZCwgYXJncz0oJ2InLCkpCisgICAgICAgIGNsb3NlX2IoKSAgICAgICAjIHRyaWdnZXJzIGNhbGxiYWNrIGZvciBiCisgICAgICAgIGNsb3NlX2IoKSAgICAgICAjIGRvZXMgbm90aGluZyBiZWNhdXNlIGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkCisgICAgICAgIGRlbCBiICAgICAgICAgICAjIGRvZXMgbm90aGluZyBiZWNhdXNlIGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkCisKKyAgICAgICAgYyA9IEZvbygpCisgICAgICAgIHV0aWwuRmluYWxpemUoYywgY29ubi5zZW5kLCBhcmdzPSgnYycsKSkKKworICAgICAgICBkMTAgPSBGb28oKQorICAgICAgICB1dGlsLkZpbmFsaXplKGQxMCwgY29ubi5zZW5kLCBhcmdzPSgnZDEwJywpLCBleGl0cHJpb3JpdHk9MSkKKworICAgICAgICBkMDEgPSBGb28oKQorICAgICAgICB1dGlsLkZpbmFsaXplKGQwMSwgY29ubi5zZW5kLCBhcmdzPSgnZDAxJywpLCBleGl0cHJpb3JpdHk9MCkKKyAgICAgICAgZDAyID0gRm9vKCkKKyAgICAgICAgdXRpbC5GaW5hbGl6ZShkMDIsIGNvbm4uc2VuZCwgYXJncz0oJ2QwMicsKSwgZXhpdHByaW9yaXR5PTApCisgICAgICAgIGQwMyA9IEZvbygpCisgICAgICAgIHV0aWwuRmluYWxpemUoZDAzLCBjb25uLnNlbmQsIGFyZ3M9KCdkMDMnLCksIGV4aXRwcmlvcml0eT0wKQorCisgICAgICAgIHV0aWwuRmluYWxpemUoTm9uZSwgY29ubi5zZW5kLCBhcmdzPSgnZScsKSwgZXhpdHByaW9yaXR5PS0xMCkKKworICAgICAgICB1dGlsLkZpbmFsaXplKE5vbmUsIGNvbm4uc2VuZCwgYXJncz0oJ1NUT1AnLCksIGV4aXRwcmlvcml0eT0tMTAwKQorCisgICAgICAgICMgY2FsbCBtdWx0aXByb2Nlc3NpbmcncyBjbGVhbnVwIGZ1bmN0aW9uIHRoZW4gZXhpdCBwcm9jZXNzIHdpdGhvdXQKKyAgICAgICAgIyBnYXJiYWdlIGNvbGxlY3RpbmcgbG9jYWxzCisgICAgICAgIHV0aWwuX2V4aXRfZnVuY3Rpb24oKQorICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgb3MuX2V4aXQoMCkKKworICAgIGRlZiB0ZXN0X2ZpbmFsaXplKHNlbGYpOgorICAgICAgICBjb25uLCBjaGlsZF9jb25uID0gc2VsZi5QaXBlKCkKKworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl90ZXN0X2ZpbmFsaXplLCBhcmdzPShjaGlsZF9jb25uLCkpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgcC5qb2luKCkKKworICAgICAgICByZXN1bHQgPSBbb2JqIGZvciBvYmogaW4gaXRlcihjb25uLnJlY3YsICdTVE9QJyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBbJ2EnLCAnYicsICdkMTAnLCAnZDAzJywgJ2QwMicsICdkMDEnLCAnZSddKQorCisjCisjIFRlc3QgdGhhdCBmcm9tIC4uLiBpbXBvcnQgKiB3b3JrcyBmb3IgZWFjaCBtb2R1bGUKKyMKKworY2xhc3MgX1Rlc3RJbXBvcnRTdGFyKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCkKKworICAgIGRlZiB0ZXN0X2ltcG9ydChzZWxmKToKKyAgICAgICAgbW9kdWxlcyA9IFsKKyAgICAgICAgICAgICdtdWx0aXByb2Nlc3NpbmcnLCAnbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24nLAorICAgICAgICAgICAgJ211bHRpcHJvY2Vzc2luZy5oZWFwJywgJ211bHRpcHJvY2Vzc2luZy5tYW5hZ2VycycsCisgICAgICAgICAgICAnbXVsdGlwcm9jZXNzaW5nLnBvb2wnLCAnbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MnLAorICAgICAgICAgICAgJ211bHRpcHJvY2Vzc2luZy5zeW5jaHJvbml6ZScsICdtdWx0aXByb2Nlc3NpbmcudXRpbCcKKyAgICAgICAgICAgIF0KKworICAgICAgICBpZiBIQVNfUkVEVUNUSU9OOgorICAgICAgICAgICAgbW9kdWxlcy5hcHBlbmQoJ211bHRpcHJvY2Vzc2luZy5yZWR1Y3Rpb24nKQorCisgICAgICAgIGlmIGNfaW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBUaGlzIG1vZHVsZSByZXF1aXJlcyBfY3R5cGVzCisgICAgICAgICAgICBtb2R1bGVzLmFwcGVuZCgnbXVsdGlwcm9jZXNzaW5nLnNoYXJlZGN0eXBlcycpCisKKyAgICAgICAgZm9yIG5hbWUgaW4gbW9kdWxlczoKKyAgICAgICAgICAgIF9faW1wb3J0X18obmFtZSkKKyAgICAgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW25hbWVdCisKKyAgICAgICAgICAgIGZvciBhdHRyIGluIGdldGF0dHIobW9kLCAnX19hbGxfXycsICgpKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgIGhhc2F0dHIobW9kLCBhdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgJyVyIGRvZXMgbm90IGhhdmUgYXR0cmlidXRlICVyJyAlIChtb2QsIGF0dHIpCisgICAgICAgICAgICAgICAgICAgICkKKworIworIyBRdWljayB0ZXN0IHRoYXQgbG9nZ2luZyB3b3JrcyAtLSBkb2VzIG5vdCB0ZXN0IGxvZ2dpbmcgb3V0cHV0CisjCisKK2NsYXNzIF9UZXN0TG9nZ2luZyhCYXNlVGVzdENhc2UpOgorCisgICAgQUxMT1dFRF9UWVBFUyA9ICgncHJvY2Vzc2VzJywpCisKKyAgICBkZWYgdGVzdF9lbmFibGVfbG9nZ2luZyhzZWxmKToKKyAgICAgICAgbG9nZ2VyID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgICAgICBsb2dnZXIuc2V0TGV2ZWwodXRpbC5TVUJXQVJOSU5HKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobG9nZ2VyIGlzIG5vdCBOb25lKQorICAgICAgICBsb2dnZXIuZGVidWcoJ3RoaXMgd2lsbCBub3QgYmUgcHJpbnRlZCcpCisgICAgICAgIGxvZ2dlci5pbmZvKCdub3Igd2lsbCB0aGlzJykKKyAgICAgICAgbG9nZ2VyLnNldExldmVsKExPR19MRVZFTCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfdGVzdF9sZXZlbChjbHMsIGNvbm4pOgorICAgICAgICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIGNvbm4uc2VuZChsb2dnZXIuZ2V0RWZmZWN0aXZlTGV2ZWwoKSkKKworICAgIGRlZiB0ZXN0X2xldmVsKHNlbGYpOgorICAgICAgICBMRVZFTDEgPSAzMgorICAgICAgICBMRVZFTDIgPSAzNworCisgICAgICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgcm9vdF9sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigpCisgICAgICAgIHJvb3RfbGV2ZWwgPSByb290X2xvZ2dlci5sZXZlbAorCisgICAgICAgIHJlYWRlciwgd3JpdGVyID0gbXVsdGlwcm9jZXNzaW5nLlBpcGUoZHVwbGV4PUZhbHNlKQorCisgICAgICAgIGxvZ2dlci5zZXRMZXZlbChMRVZFTDEpCisgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3Rlc3RfbGV2ZWwsIGFyZ3M9KHdyaXRlciwpKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTEVWRUwxLCByZWFkZXIucmVjdigpKQorCisgICAgICAgIGxvZ2dlci5zZXRMZXZlbChsb2dnaW5nLk5PVFNFVCkKKyAgICAgICAgcm9vdF9sb2dnZXIuc2V0TGV2ZWwoTEVWRUwyKQorICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl90ZXN0X2xldmVsLCBhcmdzPSh3cml0ZXIsKSkKKyAgICAgICAgcC5kYWVtb24gPSBUcnVlCisgICAgICAgIHAuc3RhcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExFVkVMMiwgcmVhZGVyLnJlY3YoKSkKKworICAgICAgICByb290X2xvZ2dlci5zZXRMZXZlbChyb290X2xldmVsKQorICAgICAgICBsb2dnZXIuc2V0TGV2ZWwobGV2ZWw9TE9HX0xFVkVMKQorCisKKyMgY2xhc3MgX1Rlc3RMb2dnaW5nUHJvY2Vzc05hbWUoQmFzZVRlc3RDYXNlKToKKyMKKyMgICAgIGRlZiBoYW5kbGUoc2VsZiwgcmVjb3JkKToKKyMgICAgICAgICBhc3NlcnQgcmVjb3JkLnByb2Nlc3NOYW1lID09IG11bHRpcHJvY2Vzc2luZy5jdXJyZW50X3Byb2Nlc3MoKS5uYW1lCisjICAgICAgICAgc2VsZi5fX2hhbmRsZWQgPSBUcnVlCisjCisjICAgICBkZWYgdGVzdF9sb2dnaW5nKHNlbGYpOgorIyAgICAgICAgIGhhbmRsZXIgPSBsb2dnaW5nLkhhbmRsZXIoKQorIyAgICAgICAgIGhhbmRsZXIuaGFuZGxlID0gc2VsZi5oYW5kbGUKKyMgICAgICAgICBzZWxmLl9faGFuZGxlZCA9IEZhbHNlCisjICAgICAgICAgIyBCeXBhc3MgZ2V0TG9nZ2VyKCkgYW5kIHNpZGUtZWZmZWN0cworIyAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyQ2xhc3MoKSgKKyMgICAgICAgICAgICAgICAgICdtdWx0aXByb2Nlc3NpbmcudGVzdC5UZXN0TG9nZ2luZ1Byb2Nlc3NOYW1lJykKKyMgICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKQorIyAgICAgICAgIGxvZ2dlci5wcm9wYWdhdGUgPSBGYWxzZQorIworIyAgICAgICAgIGxvZ2dlci53YXJuKCdmb28nKQorIyAgICAgICAgIGFzc2VydCBzZWxmLl9faGFuZGxlZAorCisjCisjIENoZWNrIHRoYXQgUHJvY2Vzcy5qb2luKCkgcmV0cmllcyBpZiBvcy53YWl0cGlkKCkgZmFpbHMgd2l0aCBFSU5UUgorIworCitjbGFzcyBfVGVzdFBvbGxFaW50cihCYXNlVGVzdENhc2UpOgorCisgICAgQUxMT1dFRF9UWVBFUyA9ICgncHJvY2Vzc2VzJywpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX2tpbGxlcihjbHMsIHBpZCk6CisgICAgICAgIHRpbWUuc2xlZXAoMC41KQorICAgICAgICBvcy5raWxsKHBpZCwgc2lnbmFsLlNJR1VTUjEpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHNpZ25hbCwgJ1NJR1VTUjEnKSwgJ3JlcXVpcmVzIFNJR1VTUjEnKQorICAgIGRlZiB0ZXN0X3BvbGxfZWludHIoc2VsZik6CisgICAgICAgIGdvdF9zaWduYWwgPSBbRmFsc2VdCisgICAgICAgIGRlZiByZWNvcmQoKmFyZ3MpOgorICAgICAgICAgICAgZ290X3NpZ25hbFswXSA9IFRydWUKKyAgICAgICAgcGlkID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgb2xkaGFuZGxlciA9IHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjEsIHJlY29yZCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAga2lsbGVyID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl9raWxsZXIsIGFyZ3M9KHBpZCwpKQorICAgICAgICAgICAga2lsbGVyLnN0YXJ0KCkKKyAgICAgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXRpbWUuc2xlZXAsIGFyZ3M9KDEsKSkKKyAgICAgICAgICAgIHAuc3RhcnQoKQorICAgICAgICAgICAgcC5qb2luKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnb3Rfc2lnbmFsWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmV4aXRjb2RlLCAwKQorICAgICAgICAgICAga2lsbGVyLmpvaW4oKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMSwgb2xkaGFuZGxlcikKKworIworIyBUZXN0IHRvIHZlcmlmeSBoYW5kbGUgdmVyaWZpY2F0aW9uLCBzZWUgaXNzdWUgMzMyMQorIworCitjbGFzcyBUZXN0SW52YWxpZEhhbmRsZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAdW5pdHRlc3Quc2tpcElmKFdJTjMyLCAic2tpcHBlZCBvbiBXaW5kb3dzIikKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2hhbmRsZXMoc2VsZik6CisgICAgICAgIGNvbm4gPSBfbXVsdGlwcm9jZXNzaW5nLkNvbm5lY3Rpb24oNDQ5Nzc2MDgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGNvbm4ucG9sbCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgX211bHRpcHJvY2Vzc2luZy5Db25uZWN0aW9uLCAtMSkKKworIworIyBGdW5jdGlvbnMgdXNlZCB0byBjcmVhdGUgdGVzdCBjYXNlcyBmcm9tIHRoZSBiYXNlIG9uZXMgaW4gdGhpcyBtb2R1bGUKKyMKKworZGVmIGdldF9hdHRyaWJ1dGVzKFNvdXJjZSwgbmFtZXMpOgorICAgIGQgPSB7fQorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBvYmogPSBnZXRhdHRyKFNvdXJjZSwgbmFtZSkKKyAgICAgICAgaWYgdHlwZShvYmopID09IHR5cGUoZ2V0X2F0dHJpYnV0ZXMpOgorICAgICAgICAgICAgb2JqID0gc3RhdGljbWV0aG9kKG9iaikKKyAgICAgICAgZFtuYW1lXSA9IG9iagorICAgIHJldHVybiBkCisKK2RlZiBjcmVhdGVfdGVzdF9jYXNlcyhNaXhpbiwgdHlwZSk6CisgICAgcmVzdWx0ID0ge30KKyAgICBnbG9iID0gZ2xvYmFscygpCisgICAgVHlwZSA9IHR5cGUuY2FwaXRhbGl6ZSgpCisKKyAgICBmb3IgbmFtZSBpbiBnbG9iLmtleXMoKToKKyAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdfVGVzdCcpOgorICAgICAgICAgICAgYmFzZSA9IGdsb2JbbmFtZV0KKyAgICAgICAgICAgIGlmIHR5cGUgaW4gYmFzZS5BTExPV0VEX1RZUEVTOgorICAgICAgICAgICAgICAgIG5ld25hbWUgPSAnV2l0aCcgKyBUeXBlICsgbmFtZVsxOl0KKyAgICAgICAgICAgICAgICBjbGFzcyBUZW1wKGJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlLCBNaXhpbik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICByZXN1bHRbbmV3bmFtZV0gPSBUZW1wCisgICAgICAgICAgICAgICAgVGVtcC5fX25hbWVfXyA9IG5ld25hbWUKKyAgICAgICAgICAgICAgICBUZW1wLl9fbW9kdWxlX18gPSBNaXhpbi5fX21vZHVsZV9fCisgICAgcmV0dXJuIHJlc3VsdAorCisjCisjIENyZWF0ZSB0ZXN0IGNhc2VzCisjCisKK2NsYXNzIFByb2Nlc3Nlc01peGluKG9iamVjdCk6CisgICAgVFlQRSA9ICdwcm9jZXNzZXMnCisgICAgUHJvY2VzcyA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzCisgICAgbG9jYWxzKCkudXBkYXRlKGdldF9hdHRyaWJ1dGVzKG11bHRpcHJvY2Vzc2luZywgKAorICAgICAgICAnUXVldWUnLCAnTG9jaycsICdSTG9jaycsICdTZW1hcGhvcmUnLCAnQm91bmRlZFNlbWFwaG9yZScsCisgICAgICAgICdDb25kaXRpb24nLCAnRXZlbnQnLCAnVmFsdWUnLCAnQXJyYXknLCAnUmF3VmFsdWUnLAorICAgICAgICAnUmF3QXJyYXknLCAnY3VycmVudF9wcm9jZXNzJywgJ2FjdGl2ZV9jaGlsZHJlbicsICdQaXBlJywKKyAgICAgICAgJ2Nvbm5lY3Rpb24nLCAnSm9pbmFibGVRdWV1ZScsICdQb29sJworICAgICAgICApKSkKKwordGVzdGNhc2VzX3Byb2Nlc3NlcyA9IGNyZWF0ZV90ZXN0X2Nhc2VzKFByb2Nlc3Nlc01peGluLCB0eXBlPSdwcm9jZXNzZXMnKQorZ2xvYmFscygpLnVwZGF0ZSh0ZXN0Y2FzZXNfcHJvY2Vzc2VzKQorCisKK2NsYXNzIE1hbmFnZXJNaXhpbihvYmplY3QpOgorICAgIFRZUEUgPSAnbWFuYWdlcicKKyAgICBQcm9jZXNzID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MKKyAgICBtYW5hZ2VyID0gb2JqZWN0Ll9fbmV3X18obXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLlN5bmNNYW5hZ2VyKQorICAgIGxvY2FscygpLnVwZGF0ZShnZXRfYXR0cmlidXRlcyhtYW5hZ2VyLCAoCisgICAgICAgICdRdWV1ZScsICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywKKyAgICAgICAnQ29uZGl0aW9uJywgJ0V2ZW50JywgJ1ZhbHVlJywgJ0FycmF5JywgJ2xpc3QnLCAnZGljdCcsCisgICAgICAgICdOYW1lc3BhY2UnLCAnSm9pbmFibGVRdWV1ZScsICdQb29sJworICAgICAgICApKSkKKwordGVzdGNhc2VzX21hbmFnZXIgPSBjcmVhdGVfdGVzdF9jYXNlcyhNYW5hZ2VyTWl4aW4sIHR5cGU9J21hbmFnZXInKQorZ2xvYmFscygpLnVwZGF0ZSh0ZXN0Y2FzZXNfbWFuYWdlcikKKworCitjbGFzcyBUaHJlYWRzTWl4aW4ob2JqZWN0KToKKyAgICBUWVBFID0gJ3RocmVhZHMnCisgICAgUHJvY2VzcyA9IG11bHRpcHJvY2Vzc2luZy5kdW1teS5Qcm9jZXNzCisgICAgbG9jYWxzKCkudXBkYXRlKGdldF9hdHRyaWJ1dGVzKG11bHRpcHJvY2Vzc2luZy5kdW1teSwgKAorICAgICAgICAnUXVldWUnLCAnTG9jaycsICdSTG9jaycsICdTZW1hcGhvcmUnLCAnQm91bmRlZFNlbWFwaG9yZScsCisgICAgICAgICdDb25kaXRpb24nLCAnRXZlbnQnLCAnVmFsdWUnLCAnQXJyYXknLCAnY3VycmVudF9wcm9jZXNzJywKKyAgICAgICAgJ2FjdGl2ZV9jaGlsZHJlbicsICdQaXBlJywgJ2Nvbm5lY3Rpb24nLCAnZGljdCcsICdsaXN0JywKKyAgICAgICAgJ05hbWVzcGFjZScsICdKb2luYWJsZVF1ZXVlJywgJ1Bvb2wnCisgICAgICAgICkpKQorCit0ZXN0Y2FzZXNfdGhyZWFkcyA9IGNyZWF0ZV90ZXN0X2Nhc2VzKFRocmVhZHNNaXhpbiwgdHlwZT0ndGhyZWFkcycpCitnbG9iYWxzKCkudXBkYXRlKHRlc3RjYXNlc190aHJlYWRzKQorCitjbGFzcyBPdGhlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVE9ETzogYWRkIG1vcmUgdGVzdHMgZm9yIGRlbGl2ZXIvYW5zd2VyIGNoYWxsZW5nZS4KKyAgICBkZWYgdGVzdF9kZWxpdmVyX2NoYWxsZW5nZV9hdXRoX2ZhaWx1cmUoc2VsZik6CisgICAgICAgIGNsYXNzIF9GYWtlQ29ubmVjdGlvbihvYmplY3QpOgorICAgICAgICAgICAgZGVmIHJlY3ZfYnl0ZXMoc2VsZiwgc2l6ZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGInc29tZXRoaW5nIGJvZ3VzJworICAgICAgICAgICAgZGVmIHNlbmRfYnl0ZXMoc2VsZiwgZGF0YSk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhtdWx0aXByb2Nlc3NpbmcuQXV0aGVudGljYXRpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24uZGVsaXZlcl9jaGFsbGVuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9GYWtlQ29ubmVjdGlvbigpLCBiJ2FiYycpCisKKyAgICBkZWYgdGVzdF9hbnN3ZXJfY2hhbGxlbmdlX2F1dGhfZmFpbHVyZShzZWxmKToKKyAgICAgICAgY2xhc3MgX0Zha2VDb25uZWN0aW9uKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKyAgICAgICAgICAgIGRlZiByZWN2X2J5dGVzKHNlbGYsIHNpemUpOgorICAgICAgICAgICAgICAgIHNlbGYuY291bnQgKz0gMQorICAgICAgICAgICAgICAgIGlmIHNlbGYuY291bnQgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG11bHRpcHJvY2Vzc2luZy5jb25uZWN0aW9uLkNIQUxMRU5HRQorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5jb3VudCA9PSAyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYidzb21ldGhpbmcgYm9ndXMnCisgICAgICAgICAgICAgICAgcmV0dXJuIGInJworICAgICAgICAgICAgZGVmIHNlbmRfYnl0ZXMoc2VsZiwgZGF0YSk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhtdWx0aXByb2Nlc3NpbmcuQXV0aGVudGljYXRpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24uYW5zd2VyX2NoYWxsZW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX0Zha2VDb25uZWN0aW9uKCksIGInYWJjJykKKworIworIyBUZXN0IE1hbmFnZXIuc3RhcnQoKS9Qb29sLl9faW5pdF9fKCkgaW5pdGlhbGl6ZXIgZmVhdHVyZSAtIHNlZSBpc3N1ZSA1NTg1CisjCisKK2RlZiBpbml0aWFsaXplcihucyk6CisgICAgbnMudGVzdCArPSAxCisKK2NsYXNzIFRlc3RJbml0aWFsaXplcnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5tZ3IgPSBtdWx0aXByb2Nlc3NpbmcuTWFuYWdlcigpCisgICAgICAgIHNlbGYubnMgPSBzZWxmLm1nci5OYW1lc3BhY2UoKQorICAgICAgICBzZWxmLm5zLnRlc3QgPSAwCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYubWdyLnNodXRkb3duKCkKKworICAgIGRlZiB0ZXN0X21hbmFnZXJfaW5pdGlhbGl6ZXIoc2VsZik6CisgICAgICAgIG0gPSBtdWx0aXByb2Nlc3NpbmcubWFuYWdlcnMuU3luY01hbmFnZXIoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG0uc3RhcnQsIDEpCisgICAgICAgIG0uc3RhcnQoaW5pdGlhbGl6ZXIsIChzZWxmLm5zLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5ucy50ZXN0LCAxKQorICAgICAgICBtLnNodXRkb3duKCkKKworICAgIGRlZiB0ZXN0X3Bvb2xfaW5pdGlhbGl6ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbXVsdGlwcm9jZXNzaW5nLlBvb2wsIGluaXRpYWxpemVyPTEpCisgICAgICAgIHAgPSBtdWx0aXByb2Nlc3NpbmcuUG9vbCgxLCBpbml0aWFsaXplciwgKHNlbGYubnMsKSkKKyAgICAgICAgcC5jbG9zZSgpCisgICAgICAgIHAuam9pbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5ucy50ZXN0LCAxKQorCisjCisjIElzc3VlIDUxNTUsIDUzMTMsIDUzMzE6IFRlc3QgcHJvY2VzcyBpbiBwcm9jZXNzZXMKKyMgVmVyaWZpZXMgb3MuY2xvc2Uoc3lzLnN0ZGluLmZpbGVubykgdnMuIHN5cy5zdGRpbi5jbG9zZSgpIGJlaGF2aW9yCisjCisKK2RlZiBfVGhpc1N1YlByb2Nlc3MocSk6CisgICAgdHJ5OgorICAgICAgICBpdGVtID0gcS5nZXQoYmxvY2s9RmFsc2UpCisgICAgZXhjZXB0IFF1ZXVlLkVtcHR5OgorICAgICAgICBwYXNzCisKK2RlZiBfVGVzdFByb2Nlc3MocSk6CisgICAgcXVldWUgPSBtdWx0aXByb2Nlc3NpbmcuUXVldWUoKQorICAgIHN1YlByb2MgPSBtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcyh0YXJnZXQ9X1RoaXNTdWJQcm9jZXNzLCBhcmdzPShxdWV1ZSwpKQorICAgIHN1YlByb2MuZGFlbW9uID0gVHJ1ZQorICAgIHN1YlByb2Muc3RhcnQoKQorICAgIHN1YlByb2Muam9pbigpCisKK2RlZiBfYWZ1bmMoeCk6CisgICAgcmV0dXJuIHgqeAorCitkZWYgcG9vbF9pbl9wcm9jZXNzKCk6CisgICAgcG9vbCA9IG11bHRpcHJvY2Vzc2luZy5Qb29sKHByb2Nlc3Nlcz00KQorICAgIHggPSBwb29sLm1hcChfYWZ1bmMsIFsxLCAyLCAzLCA0LCA1LCA2LCA3XSkKKworY2xhc3MgX2ZpbGVfbGlrZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWxlZ2F0ZSk6CisgICAgICAgIHNlbGYuX2RlbGVnYXRlID0gZGVsZWdhdGUKKyAgICAgICAgc2VsZi5fcGlkID0gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNhY2hlKHNlbGYpOgorICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQorICAgICAgICAjIFRoZXJlIGFyZSBubyByYWNlIGNvbmRpdGlvbnMgc2luY2UgZm9yayBrZWVwcyBvbmx5IHRoZSBydW5uaW5nIHRocmVhZAorICAgICAgICBpZiBwaWQgIT0gc2VsZi5fcGlkOgorICAgICAgICAgICAgc2VsZi5fcGlkID0gcGlkCisgICAgICAgICAgICBzZWxmLl9jYWNoZSA9IFtdCisgICAgICAgIHJldHVybiBzZWxmLl9jYWNoZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmNhY2hlLmFwcGVuZChkYXRhKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBzZWxmLl9kZWxlZ2F0ZS53cml0ZSgnJy5qb2luKHNlbGYuY2FjaGUpKQorICAgICAgICBzZWxmLl9jYWNoZSA9IFtdCisKK2NsYXNzIFRlc3RTdGRpbkJhZGZpbGVkZXNjcmlwdG9yKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3F1ZXVlX2luX3Byb2Nlc3Moc2VsZik6CisgICAgICAgIHF1ZXVlID0gbXVsdGlwcm9jZXNzaW5nLlF1ZXVlKCkKKyAgICAgICAgcHJvYyA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1fVGVzdFByb2Nlc3MsIGFyZ3M9KHF1ZXVlLCkpCisgICAgICAgIHByb2Muc3RhcnQoKQorICAgICAgICBwcm9jLmpvaW4oKQorCisgICAgZGVmIHRlc3RfcG9vbF9pbl9wcm9jZXNzKHNlbGYpOgorICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PXBvb2xfaW5fcHJvY2VzcykKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIHAuam9pbigpCisKKyAgICBkZWYgdGVzdF9mbHVzaGluZyhzZWxmKToKKyAgICAgICAgc2lvID0gU3RyaW5nSU8oKQorICAgICAgICBmbGlrZSA9IF9maWxlX2xpa2Uoc2lvKQorICAgICAgICBmbGlrZS53cml0ZSgnZm9vJykKKyAgICAgICAgcHJvYyA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1sYW1iZGE6IGZsaWtlLmZsdXNoKCkpCisgICAgICAgIGZsaWtlLmZsdXNoKCkKKyAgICAgICAgYXNzZXJ0IHNpby5nZXR2YWx1ZSgpID09ICdmb28nCisKKyMKKyMgVGVzdCBpbnRlcmFjdGlvbiB3aXRoIHNvY2tldCB0aW1lb3V0cyAtIHNlZSBJc3N1ZSAjNjA1NgorIworCitjbGFzcyBUZXN0VGltZW91dHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfdGVzdF90aW1lb3V0KGNscywgY2hpbGQsIGFkZHJlc3MpOgorICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgIGNoaWxkLnNlbmQoMTIzKQorICAgICAgICBjaGlsZC5jbG9zZSgpCisgICAgICAgIGNvbm4gPSBtdWx0aXByb2Nlc3NpbmcuY29ubmVjdGlvbi5DbGllbnQoYWRkcmVzcykKKyAgICAgICAgY29ubi5zZW5kKDQ1NikKKyAgICAgICAgY29ubi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF90aW1lb3V0KHNlbGYpOgorICAgICAgICBvbGRfdGltZW91dCA9IHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgwLjEpCisgICAgICAgICAgICBwYXJlbnQsIGNoaWxkID0gbXVsdGlwcm9jZXNzaW5nLlBpcGUoZHVwbGV4PVRydWUpCisgICAgICAgICAgICBsID0gbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24uTGlzdGVuZXIoZmFtaWx5PSdBRl9JTkVUJykKKyAgICAgICAgICAgIHAgPSBtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fdGVzdF90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGNoaWxkLCBsLmFkZHJlc3MpKQorICAgICAgICAgICAgcC5zdGFydCgpCisgICAgICAgICAgICBjaGlsZC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmVudC5yZWN2KCksIDEyMykKKyAgICAgICAgICAgIHBhcmVudC5jbG9zZSgpCisgICAgICAgICAgICBjb25uID0gbC5hY2NlcHQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnJlY3YoKSwgNDU2KQorICAgICAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgICAgICBsLmNsb3NlKCkKKyAgICAgICAgICAgIHAuam9pbigxMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvbGRfdGltZW91dCkKKworIworIyBUZXN0IHdoYXQgaGFwcGVucyB3aXRoIG5vICJpZiBfX25hbWVfXyA9PSAnX19tYWluX18nIgorIworCitjbGFzcyBUZXN0Tm9Gb3JrQm9tYih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfbm9mb3JrYm9tYihzZWxmKToKKyAgICAgICAgbmFtZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAnbXBfZm9ya19ib21iLnB5JykKKyAgICAgICAgaWYgV0lOMzI6CisgICAgICAgICAgICByYywgb3V0LCBlcnIgPSB0ZXN0LnNjcmlwdF9oZWxwZXIuYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKG5hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBvdXQuZGVjb2RlKCdhc2NpaScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignUnVudGltZUVycm9yJywgZXJyLmRlY29kZSgnYXNjaWknKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJjLCBvdXQsIGVyciA9IHRlc3Quc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX29rKG5hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxMjMnLCBvdXQuZGVjb2RlKCdhc2NpaScpLnJzdHJpcCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgZXJyLmRlY29kZSgnYXNjaWknKSkKKworIworIyBJc3N1ZSAxMjA5ODogY2hlY2sgc3lzLmZsYWdzIG9mIGNoaWxkIG1hdGNoZXMgdGhhdCBmb3IgcGFyZW50CisjCisKK2NsYXNzIFRlc3RGbGFncyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHJ1bl9pbl9ncmFuZGNoaWxkKGNscywgY29ubik6CisgICAgICAgIGNvbm4uc2VuZCh0dXBsZShzeXMuZmxhZ3MpKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHJ1bl9pbl9jaGlsZChjbHMpOgorICAgICAgICBpbXBvcnQganNvbgorICAgICAgICByLCB3ID0gbXVsdGlwcm9jZXNzaW5nLlBpcGUoZHVwbGV4PUZhbHNlKQorICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PWNscy5ydW5faW5fZ3JhbmRjaGlsZCwgYXJncz0odywpKQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgZ3JhbmRjaGlsZF9mbGFncyA9IHIucmVjdigpCisgICAgICAgIHAuam9pbigpCisgICAgICAgIHIuY2xvc2UoKQorICAgICAgICB3LmNsb3NlKCkKKyAgICAgICAgZmxhZ3MgPSAodHVwbGUoc3lzLmZsYWdzKSwgZ3JhbmRjaGlsZF9mbGFncykKKyAgICAgICAgcHJpbnQoanNvbi5kdW1wcyhmbGFncykpCisKKyAgICBkZWYgdGVzdF9mbGFncyhzZWxmKToKKyAgICAgICAgaW1wb3J0IGpzb24sIHN1YnByb2Nlc3MKKyAgICAgICAgIyBzdGFydCBjaGlsZCBwcm9jZXNzIHVzaW5nIHVudXN1YWwgZmxhZ3MKKyAgICAgICAgcHJvZyA9ICgnZnJvbSB0ZXN0LnRlc3RfbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBUZXN0RmxhZ3M7ICcgKworICAgICAgICAgICAgICAgICdUZXN0RmxhZ3MucnVuX2luX2NoaWxkKCknKQorICAgICAgICBkYXRhID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoCisgICAgICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICctRScsICctQicsICctTycsICctYycsIHByb2ddKQorICAgICAgICBjaGlsZF9mbGFncywgZ3JhbmRjaGlsZF9mbGFncyA9IGpzb24ubG9hZHMoZGF0YS5kZWNvZGUoJ2FzY2lpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2hpbGRfZmxhZ3MsIGdyYW5kY2hpbGRfZmxhZ3MpCisKKyMKKyMgSXNzdWUgIzE3NTU1OiBGb3JrQXdhcmVUaHJlYWRMb2NrCisjCisKK2NsYXNzIFRlc3RGb3JrQXdhcmVUaHJlYWRMb2NrKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFdlIHJlY3VyaXN2ZWx5IHN0YXJ0IHByb2Nlc3Nlcy4gIElzc3VlICMxNzU1NSBtZWFudCB0aGF0IHRoZQorICAgICMgYWZ0ZXIgZm9yayByZWdpc3RyeSB3b3VsZCBnZXQgZHVwbGljYXRlIGVudHJpZXMgZm9yIHRoZSBzYW1lCisgICAgIyBsb2NrLiAgVGhlIHNpemUgb2YgdGhlIHJlZ2lzdHJ5IGF0IGdlbmVyYXRpb24gbiB3YXMgfjIqKm4uCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgY2hpbGQoY2xzLCBuLCBjb25uKToKKyAgICAgICAgaWYgbiA+IDE6CisgICAgICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PWNscy5jaGlsZCwgYXJncz0obi0xLCBjb25uKSkKKyAgICAgICAgICAgIHAuc3RhcnQoKQorICAgICAgICAgICAgcC5qb2luKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbm4uc2VuZChsZW4odXRpbC5fYWZ0ZXJmb3JrX3JlZ2lzdHJ5KSkKKyAgICAgICAgY29ubi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9sb2NrKHNlbGYpOgorICAgICAgICByLCB3ID0gbXVsdGlwcm9jZXNzaW5nLlBpcGUoRmFsc2UpCisgICAgICAgIGwgPSB1dGlsLkZvcmtBd2FyZVRocmVhZExvY2soKQorICAgICAgICBvbGRfc2l6ZSA9IGxlbih1dGlsLl9hZnRlcmZvcmtfcmVnaXN0cnkpCisgICAgICAgIHAgPSBtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5jaGlsZCwgYXJncz0oNSwgdykpCisgICAgICAgIHAuc3RhcnQoKQorICAgICAgICBuZXdfc2l6ZSA9IHIucmVjdigpCisgICAgICAgIHAuam9pbigpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKG5ld19zaXplLCBvbGRfc2l6ZSkKKworIworIworIworCit0ZXN0Y2FzZXNfb3RoZXIgPSBbT3RoZXJUZXN0LCBUZXN0SW52YWxpZEhhbmRsZSwgVGVzdEluaXRpYWxpemVycywKKyAgICAgICAgICAgICAgICAgICBUZXN0U3RkaW5CYWRmaWxlZGVzY3JpcHRvciwgVGVzdFRpbWVvdXRzLCBUZXN0Tm9Gb3JrQm9tYiwKKyAgICAgICAgICAgICAgICAgICBUZXN0RmxhZ3MsIFRlc3RGb3JrQXdhcmVUaHJlYWRMb2NrXQorCisjCisjCisjCisKK2RlZiB0ZXN0X21haW4ocnVuPU5vbmUpOgorICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJsaW51eCIpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2NrID0gbXVsdGlwcm9jZXNzaW5nLlJMb2NrKCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiT1NFcnJvciByYWlzZXMgb24gUkxvY2sgY3JlYXRpb24sIHNlZSBpc3N1ZSAzMTExISIpCisKKyAgICBjaGVja19lbm91Z2hfc2VtYXBob3JlcygpCisKKyAgICBpZiBydW4gaXMgTm9uZToKKyAgICAgICAgZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0IGFzIHJ1bgorCisgICAgdXRpbC5nZXRfdGVtcF9kaXIoKSAgICAgIyBjcmVhdGVzIHRlbXAgZGlyZWN0b3J5IGZvciB1c2UgYnkgYWxsIHByb2Nlc3NlcworCisgICAgbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKS5zZXRMZXZlbChMT0dfTEVWRUwpCisKKyAgICBQcm9jZXNzZXNNaXhpbi5wb29sID0gbXVsdGlwcm9jZXNzaW5nLlBvb2woNCkKKyAgICBUaHJlYWRzTWl4aW4ucG9vbCA9IG11bHRpcHJvY2Vzc2luZy5kdW1teS5Qb29sKDQpCisgICAgTWFuYWdlck1peGluLm1hbmFnZXIuX19pbml0X18oKQorICAgIE1hbmFnZXJNaXhpbi5tYW5hZ2VyLnN0YXJ0KCkKKyAgICBNYW5hZ2VyTWl4aW4ucG9vbCA9IE1hbmFnZXJNaXhpbi5tYW5hZ2VyLlBvb2woNCkKKworICAgIHRlc3RjYXNlcyA9ICgKKyAgICAgICAgc29ydGVkKHRlc3RjYXNlc19wcm9jZXNzZXMudmFsdWVzKCksIGtleT1sYW1iZGEgdGM6dGMuX19uYW1lX18pICsKKyAgICAgICAgc29ydGVkKHRlc3RjYXNlc190aHJlYWRzLnZhbHVlcygpLCBrZXk9bGFtYmRhIHRjOnRjLl9fbmFtZV9fKSArCisgICAgICAgIHNvcnRlZCh0ZXN0Y2FzZXNfbWFuYWdlci52YWx1ZXMoKSwga2V5PWxhbWJkYSB0Yzp0Yy5fX25hbWVfXykgKworICAgICAgICB0ZXN0Y2FzZXNfb3RoZXIKKyAgICAgICAgKQorCisgICAgbG9hZFRlc3RzRnJvbVRlc3RDYXNlID0gdW5pdHRlc3QuZGVmYXVsdFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUobG9hZFRlc3RzRnJvbVRlc3RDYXNlKHRjKSBmb3IgdGMgaW4gdGVzdGNhc2VzKQorICAgICMgKG5jb2dobGFuKTogV2hldGhlciBvciBub3Qgc3lzLmV4Y19jbGVhciBpcyBleGVjdXRlZCBieSB0aGUgdGhyZWFkaW5nCisgICAgIyBtb2R1bGUgZHVyaW5nIHRoZXNlIHRlc3RzIGlzIGF0IGxlYXN0IHBsYXRmb3JtIGRlcGVuZGVudCBhbmQgcG9zc2libHkKKyAgICAjIG5vbi1kZXRlcm1pbmlzdGljIG9uIGFueSBnaXZlbiBwbGF0Zm9ybS4gU28gd2UgZG9uJ3QgbWluZCBpZiB0aGUgbGlzdGVkCisgICAgIyB3YXJuaW5ncyBhcmVuJ3QgYWN0dWFsbHkgcmFpc2VkLgorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoIi4rX18oZ2V0fHNldClzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgKHIic3lzLmV4Y19jbGVhclwoXCkgbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICBxdWlldD1UcnVlKToKKyAgICAgICAgcnVuKHN1aXRlKQorCisgICAgVGhyZWFkc01peGluLnBvb2wudGVybWluYXRlKCkKKyAgICBQcm9jZXNzZXNNaXhpbi5wb29sLnRlcm1pbmF0ZSgpCisgICAgTWFuYWdlck1peGluLnBvb2wudGVybWluYXRlKCkKKyAgICBNYW5hZ2VyTWl4aW4ubWFuYWdlci5zaHV0ZG93bigpCisKKyAgICBkZWwgUHJvY2Vzc2VzTWl4aW4ucG9vbCwgVGhyZWFkc01peGluLnBvb2wsIE1hbmFnZXJNaXhpbi5wb29sCisKK2RlZiBtYWluKCk6CisgICAgdGVzdF9tYWluKHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHZlcmJvc2l0eT0yKS5ydW4pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmY1NTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTVhZjBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdXRhbnRzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXV0YW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWMzODFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXV0YW50cy5weQpAQCAtMCwwICsxLDI5MiBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgVEVTVEZOCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgb3MKKworIyBGcm9tIFNGIGJ1ZyAjNDIyMTIxOiAgSW5zZWN1cml0aWVzIGluIGRpY3QgY29tcGFyaXNvbi4KKworIyBTYWZldHkgb2YgY29kZSBkb2luZyBjb21wYXJpc29ucyBoYXMgYmVlbiBhbiBoaXN0b3JpY2FsIFB5dGhvbiB3ZWFrIHNwb3QuCisjIFRoZSBwcm9ibGVtIGlzIHRoYXQgY29tcGFyaXNvbiBvZiBzdHJ1Y3R1cmVzIHdyaXR0ZW4gaW4gQyAqbmF0dXJhbGx5KgorIyB3YW50cyB0byBob2xkIG9uIHRvIHRoaW5ncyBsaWtlIHRoZSBzaXplIG9mIHRoZSBjb250YWluZXIsIG9yICJ0aGUKKyMgYmlnZ2VzdCIgY29udGFpbmVlIHNvIGZhciwgYWNyb3NzIGEgdHJhdmVyc2FsIG9mIHRoZSBjb250YWluZXI7IGJ1dAorIyBjb2RlIHRvIGRvIGNvbnRhaW5lZSBjb21wYXJpc29ucyBjYW4gY2FsbCBiYWNrIGludG8gUHl0aG9uIGFuZCBtdXRhdGUKKyMgdGhlIGNvbnRhaW5lciBpbiBhcmJpdHJhcnkgd2F5cyB3aGlsZSB0aGUgQyBsb29wIGlzIGluIG1pZHN0cmVhbS4gIElmIHRoZQorIyBDIGNvZGUgaXNuJ3QgZXh0cmVtZWx5IHBhcmFub2lkIGFib3V0IGRpZ2dpbmcgdGhpbmdzIG91dCBvZiBtZW1vcnkgb24KKyMgZWFjaCB0cmlwLCBhbmQgYXJ0aWZpY2lhbGx5IGJvb3N0aW5nIHJlZmNvdW50cyBmb3IgdGhlIGR1cmF0aW9uLCBhbnl0aGluZworIyBmcm9tIGluZmluaXRlIGxvb3BzIHRvIE9TIGNyYXNoZXMgY2FuIHJlc3VsdCAoeWVzLCBJIHVzZSBXaW5kb3dzIDx3aW5rPikuCisjCisjIFRoZSBvdGhlciBwcm9ibGVtIGlzIHRoYXQgY29kZSBkZXNpZ25lZCB0byBwcm92b2tlIGEgd2Vha25lc3MgaXMgdXN1YWxseQorIyB3aGl0ZS1ib3ggY29kZSwgYW5kIHNvIGNhdGNoZXMgb25seSB0aGUgcGFydGljdWxhciB2dWxuZXJhYmlsaXRpZXMgdGhlCisjIGF1dGhvciBrbmV3IHRvIHByb3RlY3QgYWdhaW5zdC4gIEZvciBleGFtcGxlLCBQeXRob24ncyBsaXN0LnNvcnQoKSBjb2RlCisjIHdlbnQgdGhydSBtYW55IGl0ZXJhdGlvbnMgYXMgb25lICJuZXciIHZ1bG5lcmFiaWxpdHkgYWZ0ZXIgYW5vdGhlciB3YXMKKyMgZGlzY292ZXJlZC4KKyMKKyMgU28gdGhlIGRpY3QgY29tcGFyaXNvbiB0ZXN0IGhlcmUgdXNlcyBhIGJsYWNrLWJveCBhcHByb2FjaCBpbnN0ZWFkLAorIyBnZW5lcmF0aW5nIGRpY3RzIG9mIHZhcmlvdXMgc2l6ZXMgYXQgcmFuZG9tLCBhbmQgcGVyZm9ybWluZyByYW5kb20KKyMgbXV0YXRpb25zIG9uIHRoZW0gYXQgcmFuZG9tIHRpbWVzLiAgVGhpcyBwcm92ZWQgdmVyeSBlZmZlY3RpdmUsCisjIHRyaWdnZXJpbmcgYXQgbGVhc3Qgc2l4IGRpc3RpbmN0IGZhaWx1cmUgbW9kZXMgdGhlIGZpcnN0IDIwIHRpbWVzIEkKKyMgcmFuIGl0LiAgSW5kZWVkLCBhdCB0aGUgc3RhcnQsIHRoZSBkcml2ZXIgbmV2ZXIgZ290IGJleW9uZCA2IGl0ZXJhdGlvbnMKKyMgYmVmb3JlIHRoZSB0ZXN0IGRpZWQuCisKKyMgVGhlIGRpY3RzIGFyZSBnbG9iYWwgdG8gbWFrZSBpdCBlYXN5IHRvIG11dGF0ZSB0aGFtIGZyb20gd2l0aGluIGZ1bmN0aW9ucy4KK2RpY3QxID0ge30KK2RpY3QyID0ge30KKworIyBUaGUgY3VycmVudCBzZXQgb2Yga2V5cyBpbiBkaWN0MSBhbmQgZGljdDIuICBUaGVzZSBhcmUgbWF0ZXJpYWxpemVkIGFzCisjIGxpc3RzIHRvIG1ha2UgaXQgZWFzeSB0byBwaWNrIGEgZGljdCBrZXkgYXQgcmFuZG9tLgorZGljdDFrZXlzID0gW10KK2RpY3Qya2V5cyA9IFtdCisKKyMgR2xvYmFsIGZsYWcgdGVsbGluZyBtYXliZV9tdXRhdGUoKSB3aGV0aGVyIHRvICpjb25zaWRlciogbXV0YXRpbmcuCittdXRhdGUgPSAwCisKKyMgSWYgZ2xvYmFsIG11dGF0ZSBpcyB0cnVlLCBjb25zaWRlciBtdXRhdGluZyBhIGRpY3QuICBNYXkgb3IgbWF5IG5vdAorIyBtdXRhdGUgYSBkaWN0IGV2ZW4gaWYgbXV0YXRlIGlzIHRydWUuICBJZiBpdCBkb2VzIGRlY2lkZSB0byBtdXRhdGUgYQorIyBkaWN0LCBpdCBwaWNrcyBvbmUgb2Yge2RpY3QxLCBkaWN0Mn0gYXQgcmFuZG9tLCBhbmQgZGVsZXRlcyBhIHJhbmRvbQorIyBlbnRyeSBmcm9tIGl0OyBvciwgbW9yZSByYXJlbHksIGFkZHMgYSByYW5kb20gZWxlbWVudC4KKworZGVmIG1heWJlX211dGF0ZSgpOgorICAgIGdsb2JhbCBtdXRhdGUKKyAgICBpZiBub3QgbXV0YXRlOgorICAgICAgICByZXR1cm4KKyAgICBpZiByYW5kb20ucmFuZG9tKCkgPCAwLjU6CisgICAgICAgIHJldHVybgorCisgICAgaWYgcmFuZG9tLnJhbmRvbSgpIDwgMC41OgorICAgICAgICB0YXJnZXQsIGtleXMgPSBkaWN0MSwgZGljdDFrZXlzCisgICAgZWxzZToKKyAgICAgICAgdGFyZ2V0LCBrZXlzID0gZGljdDIsIGRpY3Qya2V5cworCisgICAgaWYgcmFuZG9tLnJhbmRvbSgpIDwgMC4yOgorICAgICAgICAjIEluc2VydCBhIG5ldyBrZXkuCisgICAgICAgIG11dGF0ZSA9IDAgICAjIGRpc2FibGUgbXV0YXRpb24gdW50aWwga2V5IGluc2VydGVkCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBuZXdrZXkgPSBIb3JyaWQocmFuZG9tLnJhbmRyYW5nZSgxMDApKQorICAgICAgICAgICAgaWYgbmV3a2V5IG5vdCBpbiB0YXJnZXQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgdGFyZ2V0W25ld2tleV0gPSBIb3JyaWQocmFuZG9tLnJhbmRyYW5nZSgxMDApKQorICAgICAgICBrZXlzLmFwcGVuZChuZXdrZXkpCisgICAgICAgIG11dGF0ZSA9IDEKKworICAgIGVsaWYga2V5czoKKyAgICAgICAgIyBEZWxldGUgYSBrZXkgYXQgcmFuZG9tLgorICAgICAgICBtdXRhdGUgPSAwICAgIyBkaXNhYmxlIG11dGF0aW9uIHVudGlsIGtleSBkZWxldGVkCisgICAgICAgIGkgPSByYW5kb20ucmFuZHJhbmdlKGxlbihrZXlzKSkKKyAgICAgICAga2V5ID0ga2V5c1tpXQorICAgICAgICBkZWwgdGFyZ2V0W2tleV0KKyAgICAgICAgZGVsIGtleXNbaV0KKyAgICAgICAgbXV0YXRlID0gMQorCisjIEEgaG9ycmlkIGNsYXNzIHRoYXQgdHJpZ2dlcnMgcmFuZG9tIG11dGF0aW9ucyBvZiBkaWN0MSBhbmQgZGljdDIgd2hlbgorIyBpbnN0YW5jZXMgYXJlIGNvbXBhcmVkLgorCitjbGFzcyBIb3JyaWQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGkpOgorICAgICAgICAjIENvbXBhcmlzb24gb3V0Y29tZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIHZhbHVlIG9mIGkuCisgICAgICAgIHNlbGYuaSA9IGkKKworICAgICAgICAjIEFuIGFydGlmaWNpYWwgaGFzaGNvZGUgaXMgc2VsZWN0ZWQgYXQgcmFuZG9tIHNvIHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgIyBoYXZlIGFueSBzeXN0ZW1hdGljIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbXBhcmlzb24gb3V0Y29tZXMKKyAgICAgICAgIyAoYmFzZWQgb24gc2VsZi5pIGFuZCBvdGhlci5pKSBhbmQgcmVsYXRpdmUgcG9zaXRpb24gd2l0aGluIHRoZQorICAgICAgICAjIGhhc2ggdmVjdG9yIChiYXNlZCBvbiBoYXNoY29kZSkuCisgICAgICAgIHNlbGYuaGFzaGNvZGUgPSByYW5kb20ucmFuZHJhbmdlKDEwMDAwMDAwMDApCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiA0MgorICAgICAgICByZXR1cm4gc2VsZi5oYXNoY29kZQorCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBtYXliZV9tdXRhdGUoKSAgICMgVGhlIHBvaW50IG9mIHRoZSB0ZXN0LgorICAgICAgICByZXR1cm4gY21wKHNlbGYuaSwgb3RoZXIuaSkKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBtYXliZV9tdXRhdGUoKSAgICMgVGhlIHBvaW50IG9mIHRoZSB0ZXN0LgorICAgICAgICByZXR1cm4gc2VsZi5pID09IG90aGVyLmkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJIb3JyaWQoJWQpIiAlIHNlbGYuaQorCisjIEZpbGwgZGljdCBkIHdpdGggbnVtZW50cmllcyAoSG9ycmlkKGkpLCBIb3JyaWQoaikpIGtleS12YWx1ZSBwYWlycywKKyMgd2hlcmUgaSBhbmQgaiBhcmUgc2VsZWN0ZWQgYXQgcmFuZG9tIGZyb20gdGhlIGNhbmRpZGF0ZXMgbGlzdC4KKyMgUmV0dXJuIGQua2V5cygpIGFmdGVyIGZpbGxpbmcuCisKK2RlZiBmaWxsX2RpY3QoZCwgY2FuZGlkYXRlcywgbnVtZW50cmllcyk6CisgICAgZC5jbGVhcigpCisgICAgZm9yIGkgaW4geHJhbmdlKG51bWVudHJpZXMpOgorICAgICAgICBkW0hvcnJpZChyYW5kb20uY2hvaWNlKGNhbmRpZGF0ZXMpKV0gPSBcCisgICAgICAgICAgICBIb3JyaWQocmFuZG9tLmNob2ljZShjYW5kaWRhdGVzKSkKKyAgICByZXR1cm4gZC5rZXlzKCkKKworIyBUZXN0IG9uZSBwYWlyIG9mIHJhbmRvbWx5IGdlbmVyYXRlZCBkaWN0cywgZWFjaCB3aXRoIG4gZW50cmllcy4KKyMgTm90ZSB0aGF0IGRpY3QgY29tcGFyaXNvbiBpcyB0cml2aWFsIGlmIHRoZXkgZG9uJ3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIKKyMgb2YgZW50aXJlcyAodGhlbiB0aGUgInNob3J0ZXIiIGRpY3QgaXMgaW5zdGFudGx5IGNvbnNpZGVyZWQgdG8gYmUgdGhlCisjIHNtYWxsZXIgb25lLCB3aXRob3V0IGV2ZW4gbG9va2luZyBhdCB0aGUgZW50cmllcykuCisKK2RlZiB0ZXN0X29uZShuKToKKyAgICBnbG9iYWwgbXV0YXRlLCBkaWN0MSwgZGljdDIsIGRpY3Qxa2V5cywgZGljdDJrZXlzCisKKyAgICAjIEZpbGwgdGhlIGRpY3RzIHdpdGhvdXQgbXV0YXRpbmcgdGhlbS4KKyAgICBtdXRhdGUgPSAwCisgICAgZGljdDFrZXlzID0gZmlsbF9kaWN0KGRpY3QxLCByYW5nZShuKSwgbikKKyAgICBkaWN0MmtleXMgPSBmaWxsX2RpY3QoZGljdDIsIHJhbmdlKG4pLCBuKQorCisgICAgIyBFbmFibGUgbXV0YXRpb24sIHRoZW4gY29tcGFyZSB0aGUgZGljdHMgc28gbG9uZyBhcyB0aGV5IGhhdmUgdGhlCisgICAgIyBzYW1lIHNpemUuCisgICAgbXV0YXRlID0gMQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICJ0cnlpbmcgdy8gbGVuZ3RocyIsIGxlbihkaWN0MSksIGxlbihkaWN0MiksCisgICAgd2hpbGUgZGljdDEgYW5kIGxlbihkaWN0MSkgPT0gbGVuKGRpY3QyKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIuIiwKKyAgICAgICAgaWYgcmFuZG9tLnJhbmRvbSgpIDwgMC41OgorICAgICAgICAgICAgYyA9IGNtcChkaWN0MSwgZGljdDIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjID0gZGljdDEgPT0gZGljdDIKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludAorCisjIFJ1biB0ZXN0X29uZSBuIHRpbWVzLiAgQXQgdGhlIHN0YXJ0IChiZWZvcmUgdGhlIGJ1Z3Mgd2VyZSBmaXhlZCksIDIwCisjIGNvbnNlY3V0aXZlIHJ1bnMgb2YgdGhpcyB0ZXN0IGVhY2ggYmxldyB1cCBvbiBvciBiZWZvcmUgdGhlIHNpeHRoIHRpbWUKKyMgdGVzdF9vbmUgd2FzIHJ1bi4gIFNvIG4gZG9lc24ndCBoYXZlIHRvIGJlIGxhcmdlIHRvIGdldCBhbiBpbnRlcmVzdGluZworIyB0ZXN0LgorIyBPVE9ILCBjYWxsaW5nIHdpdGggbGFyZ2UgbiBpcyBhbHNvIGludGVyZXN0aW5nLCB0byBlbnN1cmUgdGhhdCB0aGUgZml4ZWQKKyMgY29kZSBkb2Vzbid0IGhvbGQgb24gdG8gcmVmY291bnRzICp0b28qIGxvbmcgKGluIHdoaWNoIGNhc2UgbWVtb3J5IHdvdWxkCisjIGxlYWspLgorCitkZWYgdGVzdChuKToKKyAgICBmb3IgaSBpbiB4cmFuZ2Uobik6CisgICAgICAgIHRlc3Rfb25lKHJhbmRvbS5yYW5kcmFuZ2UoMSwgMTAwKSkKKworIyBTZWUgbGFzdCBjb21tZW50IGJsb2NrIGZvciBjbHVlcyBhYm91dCBnb29kIHZhbHVlcyBmb3Igbi4KK3Rlc3QoMTAwKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBbm90aGVyIHNlZ2ZhdWx0IGJ1ZywgZGlzdGlsbGVkIGJ5IE1pY2hhZWwgSHVkc29uIGZyb20gYSBjLmwucHkgcG9zdC4KKworY2xhc3MgQ2hpbGQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCk6CisgICAgICAgIHNlbGYuX19kaWN0X19bJ3BhcmVudCddID0gcGFyZW50CisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICBzZWxmLnBhcmVudC5hID0gMQorICAgICAgICBzZWxmLnBhcmVudC5iID0gMQorICAgICAgICBzZWxmLnBhcmVudC5jID0gMQorICAgICAgICBzZWxmLnBhcmVudC5kID0gMQorICAgICAgICBzZWxmLnBhcmVudC5lID0gMQorICAgICAgICBzZWxmLnBhcmVudC5mID0gMQorICAgICAgICBzZWxmLnBhcmVudC5nID0gMQorICAgICAgICBzZWxmLnBhcmVudC5oID0gMQorICAgICAgICBzZWxmLnBhcmVudC5pID0gMQorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnBhcmVudCwgYXR0cikKKworY2xhc3MgUGFyZW50OgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5hID0gQ2hpbGQoc2VsZikKKworIyBIYXJkIHRvIHNheSB3aGF0IHRoaXMgd2lsbCBwcmludCEgIE1heSB2YXJ5IGZyb20gdGltZSB0byB0aW1lLiAgQnV0CisjIHdlJ3JlIHNwZWNpZmljYWxseSB0cnlpbmcgdG8gdGVzdCB0aGUgdHBfcHJpbnQgc2xvdCBoZXJlLCBhbmQgdGhpcyBpcworIyB0aGUgY2xlYXJlc3Qgd2F5IHRvIGRvIGl0LiAgV2UgcHJpbnQgdGhlIHJlc3VsdCB0byBhIHRlbXAgZmlsZSBzbyB0aGF0CisjIHRoZSBleHBlY3RlZC1vdXRwdXQgZmlsZSBkb2Vzbid0IG5lZWQgdG8gY2hhbmdlLgorCitmID0gb3BlbihURVNURk4sICJ3IikKK3ByaW50ID4+IGYsIFBhcmVudCgpLl9fZGljdF9fCitmLmNsb3NlKCkKK29zLnVubGluayhURVNURk4pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFuZCBhbm90aGVyIGNvcmUtZHVtcGVyIGZyb20gTWljaGFlbCBIdWRzb24uCisKK2RpY3QgPSB7fQorCisjIEZvcmNlIGRpY3QgdG8gbWFsbG9jIGl0cyB0YWJsZS4KK2ZvciBpIGluIHJhbmdlKDEsIDEwKToKKyAgICBkaWN0W2ldID0gaQorCitmID0gb3BlbihURVNURk4sICJ3IikKKworY2xhc3MgTWFjaGlhdmVsbGk6CisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBkaWN0LmNsZWFyKCkKKworICAgICAgICAjIE1pY2hhZWwgc2V6OiAgImRvZXNuJ3QgY3Jhc2ggd2l0aG91dCB0aGlzLiAgZG9uJ3Qga25vdyB3aHkuIgorICAgICAgICAjIFRpbSBzZXo6ICAibHVjayBvZiB0aGUgZHJhdzsgY3Jhc2hlcyB3aXRoIG9yIHdpdGhvdXQgZm9yIG1lLiIKKyAgICAgICAgcHJpbnQgPj4gZgorCisgICAgICAgIHJldHVybiByZXByKCJtYWNoaWF2ZWxsaSIpCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiAwCisKK2RpY3RbTWFjaGlhdmVsbGkoKV0gPSBNYWNoaWF2ZWxsaSgpCisKK3ByaW50ID4+IGYsIHN0cihkaWN0KQorZi5jbG9zZSgpCitvcy51bmxpbmsoVEVTVEZOKQorZGVsIGYsIGRpY3QKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBbmQgYW5vdGhlciBjb3JlLWR1bXBlciBmcm9tIE1pY2hhZWwgSHVkc29uLgorCitkaWN0ID0ge30KKworIyBsZXQncyBmb3JjZSBkaWN0IHRvIG1hbGxvYyBpdHMgdGFibGUKK2ZvciBpIGluIHJhbmdlKDEsIDEwKToKKyAgICBkaWN0W2ldID0gaQorCitjbGFzcyBNYWNoaWF2ZWxsaTI6CisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGRpY3QuY2xlYXIoKQorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gMAorCitkaWN0W01hY2hpYXZlbGxpMigpXSA9IE1hY2hpYXZlbGxpMigpCisKK3RyeToKKyAgICBkaWN0W01hY2hpYXZlbGxpMigpXQorZXhjZXB0IEtleUVycm9yOgorICAgIHBhc3MKKworZGVsIGRpY3QKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQW5kIGFub3RoZXIgY29yZS1kdW1wZXIgZnJvbSBNaWNoYWVsIEh1ZHNvbi4KKworZGljdCA9IHt9CisKKyMgbGV0J3MgZm9yY2UgZGljdCB0byBtYWxsb2MgaXRzIHRhYmxlCitmb3IgaSBpbiByYW5nZSgxLCAxMCk6CisgICAgZGljdFtpXSA9IGkKKworY2xhc3MgTWFjaGlhdmVsbGkzOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpZCk6CisgICAgICAgIHNlbGYuaWQgPSBpZAorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHNlbGYuaWQgPT0gb3RoZXIuaWQ6CisgICAgICAgICAgICBkaWN0LmNsZWFyKCkKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzKCVzKSIlKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLmlkKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gMAorCitkaWN0W01hY2hpYXZlbGxpMygxKV0gPSBNYWNoaWF2ZWxsaTMoMCkKK2RpY3RbTWFjaGlhdmVsbGkzKDIpXSA9IE1hY2hpYXZlbGxpMygwKQorCitmID0gb3BlbihURVNURk4sICJ3IikKK3RyeToKKyAgICB0cnk6CisgICAgICAgIHByaW50ID4+IGYsIGRpY3RbTWFjaGlhdmVsbGkzKDIpXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcGFzcworZmluYWxseToKKyAgICBmLmNsb3NlKCkKKyAgICBvcy51bmxpbmsoVEVTVEZOKQorCitkZWwgZGljdAorZGVsIGRpY3QxLCBkaWN0MiwgZGljdDFrZXlzLCBkaWN0MmtleXMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGFudHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXV0YW50cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhMmY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGFudHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGFudHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXV0YW50cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhMmY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGFudHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGV4LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXV0ZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwMDgwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGV4LnB5CkBAIC0wLDAgKzEsMzUgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0CisKK211dGV4ID0gdGVzdC50ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgibXV0ZXgiLCBkZXByZWNhdGVkPVRydWUpCisKK2NsYXNzIE11dGV4VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9sb2NrX2FuZF91bmxvY2soc2VsZik6CisKKyAgICAgICAgZGVmIGNhbGxlZF9ieV9tdXRleChzb21lX2RhdGEpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb21lX2RhdGEsICJzcGFtIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLnRlc3QoKSwgIm11dGV4IG5vdCBoZWxkIikKKyAgICAgICAgICAgICMgTmVzdGVkIGxvY2tpbmcKKyAgICAgICAgICAgIG0ubG9jayhjYWxsZWRfYnlfbXV0ZXgyLCAiZWdncyIpCisKKyAgICAgICAgZGVmIGNhbGxlZF9ieV9tdXRleDIoc29tZV9kYXRhKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29tZV9kYXRhLCAiZWdncyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobS50ZXN0KCksICJtdXRleCBub3QgaGVsZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVhZHlfZm9yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImNhbGxlZF9ieV9tdXRleDIgY2FsbGVkIHRvbyBzb29uIikKKworICAgICAgICBtID0gbXV0ZXgubXV0ZXgoKQorICAgICAgICByZWFkX2Zvcl8yID0gRmFsc2UKKyAgICAgICAgbS5sb2NrKGNhbGxlZF9ieV9tdXRleCwgInNwYW0iKQorICAgICAgICByZWFkeV9mb3JfMiA9IFRydWUKKyAgICAgICAgIyB1bmxvY2sgYm90aCBsb2NrcworICAgICAgICBtLnVubG9jaygpCisgICAgICAgIG0udW5sb2NrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtLnRlc3QoKSwgIm11dGV4IHN0aWxsIGhlbGQiKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE11dGV4VGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXV0ZXgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXV0ZXgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMDVmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdXRleC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXV0ZXgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXV0ZXgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMDVmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdXRleC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmV0cmMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXRyYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzk1NDU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmV0cmMucHkKQEAgLTAsMCArMSwxMTAgQEAKK2ltcG9ydCBuZXRyYywgb3MsIHVuaXR0ZXN0LCBzeXMsIHRleHR3cmFwCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCit0ZW1wX2ZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorCitjbGFzcyBOZXRyY1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgb3MudW5saW5rKHRlbXBfZmlsZW5hbWUpCisKKyAgICBkZWYgbWFrZV9ucmMoc2VsZiwgdGVzdF9kYXRhKToKKyAgICAgICAgdGVzdF9kYXRhID0gdGV4dHdyYXAuZGVkZW50KHRlc3RfZGF0YSkKKyAgICAgICAgbW9kZSA9ICd3JworICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ2N5Z3dpbic6CisgICAgICAgICAgICBtb2RlICs9ICd0JworICAgICAgICB3aXRoIG9wZW4odGVtcF9maWxlbmFtZSwgbW9kZSkgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZSh0ZXN0X2RhdGEpCisgICAgICAgIHJldHVybiBuZXRyYy5uZXRyYyh0ZW1wX2ZpbGVuYW1lKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKKyAgICAgICAgbnJjID0gc2VsZi5tYWtlX25yYygiIiJcCisgICAgICAgICAgICBtYWNoaW5lIGhvc3QxLmRvbWFpbi5jb20gbG9naW4gbG9nMSBwYXNzd29yZCBwYXNzMSBhY2NvdW50IGFjY3QxCisgICAgICAgICAgICBkZWZhdWx0IGxvZ2luIGxvZzIgcGFzc3dvcmQgcGFzczIKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucmMuaG9zdHNbJ2hvc3QxLmRvbWFpbi5jb20nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2xvZzEnLCAnYWNjdDEnLCAncGFzczEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucmMuaG9zdHNbJ2RlZmF1bHQnXSwgKCdsb2cyJywgTm9uZSwgJ3Bhc3MyJykpCisKKyAgICBkZWYgdGVzdF9tYWNyb3Moc2VsZik6CisgICAgICAgIG5yYyA9IHNlbGYubWFrZV9ucmMoIiIiXAorICAgICAgICAgICAgbWFjZGVmIG1hY3JvMQorICAgICAgICAgICAgbGluZTEKKyAgICAgICAgICAgIGxpbmUyCisKKyAgICAgICAgICAgIG1hY2RlZiBtYWNybzIKKyAgICAgICAgICAgIGxpbmUzCisgICAgICAgICAgICBsaW5lNAorICAgICAgICAgICAgIiIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5yYy5tYWNyb3MsIHsnbWFjcm8xJzogWydsaW5lMVxuJywgJ2xpbmUyXG4nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hY3JvMic6IFsnbGluZTNcbicsICdsaW5lNFxuJ119KQorCisgICAgZGVmIF90ZXN0X3Bhc3N3b3JkcyhzZWxmLCBucmMsIHBhc3N3ZCk6CisgICAgICAgIG5yYyA9IHNlbGYubWFrZV9ucmMobnJjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5yYy5ob3N0c1snaG9zdC5kb21haW4uY29tJ10sICgnbG9nJywgJ2FjY3QnLCBwYXNzd2QpKQorCisgICAgZGVmIHRlc3RfcGFzc3dvcmRfd2l0aF9sZWFkaW5nX2hhc2goc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfcGFzc3dvcmRzKCIiIlwKKyAgICAgICAgICAgIG1hY2hpbmUgaG9zdC5kb21haW4uY29tIGxvZ2luIGxvZyBwYXNzd29yZCAjcGFzcyBhY2NvdW50IGFjY3QKKyAgICAgICAgICAgICIiIiwgJyNwYXNzJykKKworICAgIGRlZiB0ZXN0X3Bhc3N3b3JkX3dpdGhfdHJhaWxpbmdfaGFzaChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9wYXNzd29yZHMoIiIiXAorICAgICAgICAgICAgbWFjaGluZSBob3N0LmRvbWFpbi5jb20gbG9naW4gbG9nIHBhc3N3b3JkIHBhc3MjIGFjY291bnQgYWNjdAorICAgICAgICAgICAgIiIiLCAncGFzcyMnKQorCisgICAgZGVmIHRlc3RfcGFzc3dvcmRfd2l0aF9pbnRlcm5hbF9oYXNoKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3Bhc3N3b3JkcygiIiJcCisgICAgICAgICAgICBtYWNoaW5lIGhvc3QuZG9tYWluLmNvbSBsb2dpbiBsb2cgcGFzc3dvcmQgcGEjc3MgYWNjb3VudCBhY2N0CisgICAgICAgICAgICAiIiIsICdwYSNzcycpCisKKyAgICBkZWYgX3Rlc3RfY29tbWVudChzZWxmLCBucmMsIHBhc3N3ZD0ncGFzcycpOgorICAgICAgICBucmMgPSBzZWxmLm1ha2VfbnJjKG5yYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucmMuaG9zdHNbJ2Zvby5kb21haW4uY29tJ10sICgnYmFyJywgTm9uZSwgcGFzc3dkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucmMuaG9zdHNbJ2Jhci5kb21haW4uY29tJ10sICgnZm9vJywgTm9uZSwgJ3Bhc3MnKSkKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRfYmVmb3JlX21hY2hpbmVfbGluZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9jb21tZW50KCIiIlwKKyAgICAgICAgICAgICMgY29tbWVudAorICAgICAgICAgICAgbWFjaGluZSBmb28uZG9tYWluLmNvbSBsb2dpbiBiYXIgcGFzc3dvcmQgcGFzcworICAgICAgICAgICAgbWFjaGluZSBiYXIuZG9tYWluLmNvbSBsb2dpbiBmb28gcGFzc3dvcmQgcGFzcworICAgICAgICAgICAgIiIiKQorCisgICAgZGVmIHRlc3RfY29tbWVudF9iZWZvcmVfbWFjaGluZV9saW5lX25vX3NwYWNlKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2NvbW1lbnQoIiIiXAorICAgICAgICAgICAgI2NvbW1lbnQKKyAgICAgICAgICAgIG1hY2hpbmUgZm9vLmRvbWFpbi5jb20gbG9naW4gYmFyIHBhc3N3b3JkIHBhc3MKKyAgICAgICAgICAgIG1hY2hpbmUgYmFyLmRvbWFpbi5jb20gbG9naW4gZm9vIHBhc3N3b3JkIHBhc3MKKyAgICAgICAgICAgICIiIikKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRfYmVmb3JlX21hY2hpbmVfbGluZV9oYXNoX29ubHkoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfY29tbWVudCgiIiJcCisgICAgICAgICAgICAjCisgICAgICAgICAgICBtYWNoaW5lIGZvby5kb21haW4uY29tIGxvZ2luIGJhciBwYXNzd29yZCBwYXNzCisgICAgICAgICAgICBtYWNoaW5lIGJhci5kb21haW4uY29tIGxvZ2luIGZvbyBwYXNzd29yZCBwYXNzCisgICAgICAgICAgICAiIiIpCisKKyAgICBkZWYgdGVzdF9jb21tZW50X2F0X2VuZF9vZl9tYWNoaW5lX2xpbmUoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfY29tbWVudCgiIiJcCisgICAgICAgICAgICBtYWNoaW5lIGZvby5kb21haW4uY29tIGxvZ2luIGJhciBwYXNzd29yZCBwYXNzICMgY29tbWVudAorICAgICAgICAgICAgbWFjaGluZSBiYXIuZG9tYWluLmNvbSBsb2dpbiBmb28gcGFzc3dvcmQgcGFzcworICAgICAgICAgICAgIiIiKQorCisgICAgZGVmIHRlc3RfY29tbWVudF9hdF9lbmRfb2ZfbWFjaGluZV9saW5lX25vX3NwYWNlKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2NvbW1lbnQoIiIiXAorICAgICAgICAgICAgbWFjaGluZSBmb28uZG9tYWluLmNvbSBsb2dpbiBiYXIgcGFzc3dvcmQgcGFzcyAjY29tbWVudAorICAgICAgICAgICAgbWFjaGluZSBiYXIuZG9tYWluLmNvbSBsb2dpbiBmb28gcGFzc3dvcmQgcGFzcworICAgICAgICAgICAgIiIiKQorCisgICAgZGVmIHRlc3RfY29tbWVudF9hdF9lbmRfb2ZfbWFjaGluZV9saW5lX3Bhc3NfaGFzX2hhc2goc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfY29tbWVudCgiIiJcCisgICAgICAgICAgICBtYWNoaW5lIGZvby5kb21haW4uY29tIGxvZ2luIGJhciBwYXNzd29yZCAjcGFzcyAjY29tbWVudAorICAgICAgICAgICAgbWFjaGluZSBiYXIuZG9tYWluLmNvbSBsb2dpbiBmb28gcGFzc3dvcmQgcGFzcworICAgICAgICAgICAgIiIiLCAnI3Bhc3MnKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE5ldHJjVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldHJjLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldHJjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTg5YjNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmV0cmMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldHJjLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldHJjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTg5YjNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmV0cmMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODRiM2QxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmV3LnB5CkBAIC0wLDAgKzEsMTYzIEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgc3lzCituZXcgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnbmV3JywgZGVwcmVjYXRlZD1UcnVlKQorCitjbGFzcyBOZXdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9zcGFtKHNlbGYpOgorICAgICAgICBjbGFzcyBFZ2dzOgorICAgICAgICAgICAgZGVmIGdldF95b2xrcyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi55b2xrcworCisgICAgICAgIG0gPSBuZXcubW9kdWxlKCdTcGFtJykKKyAgICAgICAgbS5FZ2dzID0gRWdncworICAgICAgICBzeXMubW9kdWxlc1snU3BhbSddID0gbQorICAgICAgICBpbXBvcnQgU3BhbQorCisgICAgICAgIGRlZiBnZXRfbW9yZV95b2xrcyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnlvbGtzICsgMworCisgICAgICAgICMgbmV3LmNsYXNzb2JqKCkKKyAgICAgICAgQyA9IG5ldy5jbGFzc29iaignU3BhbScsIChTcGFtLkVnZ3MsKSwgeydnZXRfbW9yZV95b2xrcyc6IGdldF9tb3JlX3lvbGtzfSkKKworICAgICAgICAjIG5ldy5pbnN0YW5jZSgpCisgICAgICAgIGMgPSBuZXcuaW5zdGFuY2UoQywgeyd5b2xrcyc6IDN9KQorCisgICAgICAgIG8gPSBuZXcuaW5zdGFuY2UoQykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLl9fZGljdF9fLCB7fSwgIm5ldyBfX2RpY3RfXyBzaG91bGQgYmUgZW1wdHkiKQorICAgICAgICBkZWwgbworICAgICAgICBvID0gbmV3Lmluc3RhbmNlKEMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5fX2RpY3RfXywge30sICJuZXcgX19kaWN0X18gc2hvdWxkIGJlIGVtcHR5IikKKyAgICAgICAgZGVsIG8KKworICAgICAgICBkZWYgYnJlYWtfeW9sa3Moc2VsZik6CisgICAgICAgICAgICBzZWxmLnlvbGtzID0gc2VsZi55b2xrcyAtIDIKKworICAgICAgICAjIG5ldy5pbnN0YW5jZW1ldGhvZCgpCisgICAgICAgIGltID0gbmV3Lmluc3RhbmNlbWV0aG9kKGJyZWFrX3lvbGtzLCBjLCBDKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5nZXRfeW9sa3MoKSwgMywKKyAgICAgICAgICAgICdCcm9rZW4gY2FsbCBvZiBoYW5kLWNyYWZ0ZWQgY2xhc3MgaW5zdGFuY2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZ2V0X21vcmVfeW9sa3MoKSwgNiwKKyAgICAgICAgICAgICdCcm9rZW4gY2FsbCBvZiBoYW5kLWNyYWZ0ZWQgY2xhc3MgaW5zdGFuY2UnKQorCisgICAgICAgIGltKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmdldF95b2xrcygpLCAxLAorICAgICAgICAgICAgJ0Jyb2tlbiBjYWxsIG9mIGhhbmQtY3JhZnRlZCBpbnN0YW5jZSBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZ2V0X21vcmVfeW9sa3MoKSwgNCwKKyAgICAgICAgICAgICdCcm9rZW4gY2FsbCBvZiBoYW5kLWNyYWZ0ZWQgaW5zdGFuY2UgbWV0aG9kJykKKworICAgICAgICBpbSA9IG5ldy5pbnN0YW5jZW1ldGhvZChicmVha195b2xrcywgYykKKyAgICAgICAgaW0oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZ2V0X3lvbGtzKCksIC0xKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgZGFuZ2Vyb3VzIGluc3RhbmNlIG1ldGhvZCBjcmVhdGlvbiBpcyBmb3JiaWRkZW4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBuZXcuaW5zdGFuY2VtZXRob2QsIGJyZWFrX3lvbGtzLCBOb25lKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgaW5zdGFuY2VtZXRob2QoKSBkb2Vzbid0IGFsbG93IGtleXdvcmQgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG5ldy5pbnN0YW5jZW1ldGhvZCwgYnJlYWtfeW9sa3MsIGMsIGt3PTEpCisKKyAgICBkZWYgdGVzdF9zY29wZShzZWxmKToKKyAgICAgICAgIyBJdCdzIHVuY2xlYXIgd2hhdCB0aGUgc2VtYW50aWNzIHNob3VsZCBiZSBmb3IgYSBjb2RlIG9iamVjdCBjb21waWxlZAorICAgICAgICAjIGF0IG1vZHVsZSBzY29wZSwgYnV0IGJvdW5kIGFuZCBydW4gaW4gYSBmdW5jdGlvbi4gIEluIENQeXRob24sIGBjJyBpcworICAgICAgICAjIGdsb2JhbCAoYnkgYWNjaWRlbnQ/KSB3aGlsZSBpbiBKeXRob24sIGBjJyBpcyBsb2NhbC4gIFRoZSBpbnRlbnQgb2YKKyAgICAgICAgIyB0aGUgdGVzdCBjbGVhcmx5IGlzIHRvIG1ha2UgYGMnIGdsb2JhbCwgc28gbGV0J3MgYmUgZXhwbGljaXQgYWJvdXQgaXQuCisgICAgICAgIGNvZGVzdHIgPSAnJycKKyAgICAgICAgZ2xvYmFsIGMKKyAgICAgICAgYSA9IDEKKyAgICAgICAgYiA9IDIKKyAgICAgICAgYyA9IGEgKyBiCisgICAgICAgICcnJworCisgICAgICAgIGNvZGVzdHIgPSAiXG4iLmpvaW4obC5zdHJpcCgpIGZvciBsIGluIGNvZGVzdHIuc3BsaXRsaW5lcygpKQorCisgICAgICAgIGNjb2RlID0gY29tcGlsZShjb2Rlc3RyLCAnPHN0cmluZz4nLCAnZXhlYycpCisgICAgICAgICMgSnl0aG9uIGRvZXNuJ3QgaGF2ZSBhIF9fYnVpbHRpbnNfXywgc28gdXNlIGEgcG9ydGFibGUgYWx0ZXJuYXRpdmUKKyAgICAgICAgaW1wb3J0IF9fYnVpbHRpbl9fCisgICAgICAgIGcgPSB7J2MnOiAwLCAnX19idWlsdGluc19fJzogX19idWlsdGluX199CisKKyAgICAgICAgIyB0aGlzIHRlc3QgY291bGQgYmUgbW9yZSByb2J1c3QKKyAgICAgICAgZnVuYyA9IG5ldy5mdW5jdGlvbihjY29kZSwgZykKKyAgICAgICAgZnVuYygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ1snYyddLCAzLCAnQ291bGQgbm90IGNyZWF0ZSBhIHByb3BlciBmdW5jdGlvbiBvYmplY3QnKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb24oc2VsZik6CisgICAgICAgICMgdGVzdCB0aGUgdmFyaW91cyBleHRlbmRlZCBmbGF2b3JzIG9mIGZ1bmN0aW9uLm5ldworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGRlZiBnKHkpOgorICAgICAgICAgICAgICAgIHJldHVybiB4ICsgeQorICAgICAgICAgICAgcmV0dXJuIGcKKyAgICAgICAgZyA9IGYoNCkKKyAgICAgICAgbmV3LmZ1bmN0aW9uKGYuZnVuY19jb2RlLCB7fSwgImJsYWgiKQorICAgICAgICBnMiA9IG5ldy5mdW5jdGlvbihnLmZ1bmNfY29kZSwge30sICJibGFoIiwgKDIsKSwgZy5mdW5jX2Nsb3N1cmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZzIoKSwgNikKKyAgICAgICAgZzMgPSBuZXcuZnVuY3Rpb24oZy5mdW5jX2NvZGUsIHt9LCAiYmxhaCIsIE5vbmUsIGcuZnVuY19jbG9zdXJlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGczKDUpLCA5KQorICAgICAgICBkZWYgdGVzdF9jbG9zdXJlKGZ1bmMsIGNsb3N1cmUsIGV4Yyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhleGMsIG5ldy5mdW5jdGlvbiwgZnVuYy5mdW5jX2NvZGUsIHt9LCAiIiwgTm9uZSwgY2xvc3VyZSkKKworICAgICAgICB0ZXN0X2Nsb3N1cmUoZywgTm9uZSwgVHlwZUVycm9yKSAjIGludmFsaWQgY2xvc3VyZQorICAgICAgICB0ZXN0X2Nsb3N1cmUoZywgKDEsKSwgVHlwZUVycm9yKSAjIG5vbi1jZWxsIGluIGNsb3N1cmUKKyAgICAgICAgdGVzdF9jbG9zdXJlKGcsICgxLCAxKSwgVmFsdWVFcnJvcikgIyBjbG9zdXJlIGlzIHdyb25nIHNpemUKKyAgICAgICAgdGVzdF9jbG9zdXJlKGYsIGcuZnVuY19jbG9zdXJlLCBWYWx1ZUVycm9yKSAjIG5vIGNsb3N1cmUgbmVlZGVkCisKKyAgICAjIE5vdGU6IEp5dGhvbiB3aWxsIG5ldmVyIGhhdmUgbmV3LmNvZGUoKQorICAgIGlmIGhhc2F0dHIobmV3LCAnY29kZScpOgorICAgICAgICBkZWYgdGVzdF9jb2RlKHNlbGYpOgorICAgICAgICAgICAgIyBib2d1cyB0ZXN0IG9mIG5ldy5jb2RlKCkKKyAgICAgICAgICAgIGRlZiBmKGEpOiBwYXNzCisKKyAgICAgICAgICAgIGMgPSBmLmZ1bmNfY29kZQorICAgICAgICAgICAgYXJnY291bnQgPSBjLmNvX2FyZ2NvdW50CisgICAgICAgICAgICBubG9jYWxzID0gYy5jb19ubG9jYWxzCisgICAgICAgICAgICBzdGFja3NpemUgPSBjLmNvX3N0YWNrc2l6ZQorICAgICAgICAgICAgZmxhZ3MgPSBjLmNvX2ZsYWdzCisgICAgICAgICAgICBjb2Rlc3RyaW5nID0gYy5jb19jb2RlCisgICAgICAgICAgICBjb25zdGFudHMgPSBjLmNvX2NvbnN0cworICAgICAgICAgICAgbmFtZXMgPSBjLmNvX25hbWVzCisgICAgICAgICAgICB2YXJuYW1lcyA9IGMuY29fdmFybmFtZXMKKyAgICAgICAgICAgIGZpbGVuYW1lID0gYy5jb19maWxlbmFtZQorICAgICAgICAgICAgbmFtZSA9IGMuY29fbmFtZQorICAgICAgICAgICAgZmlyc3RsaW5lbm8gPSBjLmNvX2ZpcnN0bGluZW5vCisgICAgICAgICAgICBsbm90YWIgPSBjLmNvX2xub3RhYgorICAgICAgICAgICAgZnJlZXZhcnMgPSBjLmNvX2ZyZWV2YXJzCisgICAgICAgICAgICBjZWxsdmFycyA9IGMuY29fY2VsbHZhcnMKKworICAgICAgICAgICAgZCA9IG5ldy5jb2RlKGFyZ2NvdW50LCBubG9jYWxzLCBzdGFja3NpemUsIGZsYWdzLCBjb2Rlc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50cywgbmFtZXMsIHZhcm5hbWVzLCBmaWxlbmFtZSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdGxpbmVubywgbG5vdGFiLCBmcmVldmFycywgY2VsbHZhcnMpCisKKyAgICAgICAgICAgICMgdGVzdCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB2ZXJzaW9uIHdpdGggbm8gZnJlZXZhcnMgb3IgY2VsbHZhcnMKKyAgICAgICAgICAgIGQgPSBuZXcuY29kZShhcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywgY29kZXN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudHMsIG5hbWVzLCB2YXJuYW1lcywgZmlsZW5hbWUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RsaW5lbm8sIGxub3RhYikKKworICAgICAgICAgICAgIyBuZWdhdGl2ZSBjb19hcmdjb3VudCB1c2VkIHRvIHRyaWdnZXIgYSBTeXN0ZW1FcnJvcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbmV3LmNvZGUsCisgICAgICAgICAgICAgICAgLWFyZ2NvdW50LCBubG9jYWxzLCBzdGFja3NpemUsIGZsYWdzLCBjb2Rlc3RyaW5nLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cywgbmFtZXMsIHZhcm5hbWVzLCBmaWxlbmFtZSwgbmFtZSwgZmlyc3RsaW5lbm8sIGxub3RhYikKKworICAgICAgICAgICAgIyBuZWdhdGl2ZSBjb19ubG9jYWxzIHVzZWQgdG8gdHJpZ2dlciBhIFN5c3RlbUVycm9yCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBuZXcuY29kZSwKKyAgICAgICAgICAgICAgICBhcmdjb3VudCwgLW5sb2NhbHMsIHN0YWNrc2l6ZSwgZmxhZ3MsIGNvZGVzdHJpbmcsCisgICAgICAgICAgICAgICAgY29uc3RhbnRzLCBuYW1lcywgdmFybmFtZXMsIGZpbGVuYW1lLCBuYW1lLCBmaXJzdGxpbmVubywgbG5vdGFiKQorCisgICAgICAgICAgICAjIG5vbi1zdHJpbmcgY29fbmFtZSB1c2VkIHRvIHRyaWdnZXIgYSBQeV9GYXRhbEVycm9yCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG5ldy5jb2RlLAorICAgICAgICAgICAgICAgIGFyZ2NvdW50LCBubG9jYWxzLCBzdGFja3NpemUsIGZsYWdzLCBjb2Rlc3RyaW5nLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cywgKDUsKSwgdmFybmFtZXMsIGZpbGVuYW1lLCBuYW1lLCBmaXJzdGxpbmVubywgbG5vdGFiKQorCisgICAgICAgICAgICAjIG5ldy5jb2RlIHVzZWQgdG8gYmUgYSB3YXkgdG8gbXV0YXRlIGEgdHVwbGUuLi4KKyAgICAgICAgICAgIGNsYXNzIFMoc3RyKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0ID0gKFMoImFiIiksKQorICAgICAgICAgICAgZCA9IG5ldy5jb2RlKGFyZ2NvdW50LCBubG9jYWxzLCBzdGFja3NpemUsIGZsYWdzLCBjb2Rlc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0YW50cywgdCwgdmFybmFtZXMsIGZpbGVuYW1lLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0bGluZW5vLCBsbm90YWIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0WzBdKSBpcyBTLCAiZWVrLCB0dXBsZSBjaGFuZ2VkIHVuZGVyIHVzISIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE5ld1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODVmODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODVmODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25pcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25pcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDQ5NTUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmlzLnB5CkBAIC0wLDAgKzEsNDQgQEAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKKworbmlzID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ25pcycpCisKK2NsYXNzIE5pc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9tYXBzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBtYXBzID0gbmlzLm1hcHMoKQorICAgICAgICBleGNlcHQgbmlzLmVycm9yLCBtc2c6CisgICAgICAgICAgICAjIE5JUyBpcyBwcm9iYWJseSBub3QgYWN0aXZlLCBzbyB0aGlzIHRlc3QgaXNuJ3QgdXNlZnVsCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiVGVzdCBTa2lwcGVkOiIsIG1zZworICAgICAgICAgICAgIyBDYW4ndCByYWlzZSBTa2lwVGVzdCBhcyByZWdydGVzdCBvbmx5IHJlY29nbml6ZXMgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgIyAgIGltcG9ydCB0aW1lLgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgT24gc29tZSBzeXN0ZW1zLCB0aGlzIG1hcCBpcyBvbmx5IGFjY2Vzc2libGUgdG8gdGhlCisgICAgICAgICAgICAjIHN1cGVyIHVzZXIKKyAgICAgICAgICAgIG1hcHMucmVtb3ZlKCJwYXNzd2QuYWRqdW5jdC5ieW5hbWUiKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkb25lID0gMAorICAgICAgICBmb3IgbmlzbWFwIGluIG1hcHM6CisgICAgICAgICAgICBtYXBwaW5nID0gbmlzLmNhdChuaXNtYXApCisgICAgICAgICAgICBmb3IgaywgdiBpbiBtYXBwaW5nLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGs6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbmlzLm1hdGNoKGssIG5pc21hcCkgIT0gdjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJOSVMgbWF0Y2ggZmFpbGVkIGZvciBrZXkgYCVzJyBpbiBtYXAgYCVzJyIgJSAoaywgbmlzbWFwKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGp1c3QgdGVzdCB0aGUgb25lIGtleSwgb3RoZXJ3aXNlIHRoaXMgdGVzdCBjb3VsZCB0YWtlIGEKKyAgICAgICAgICAgICAgICAgICAgIyB2ZXJ5IGxvbmcgdGltZQorICAgICAgICAgICAgICAgICAgICBkb25lID0gMQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgZG9uZToKKyAgICAgICAgICAgICAgICBicmVhaworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChOaXNUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmlzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25pcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzZWQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25pcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmlzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25pcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzZWQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25pcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0MGEwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkKQEAgLTAsMCArMSwxMDIgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgb3Blbl91cmxyZXNvdXJjZQoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gaHR0cGxpYiBpbXBvcnQgSFRUUEV4Y2VwdGlvbgoraW1wb3J0IHN5cworaW1wb3J0IG9zCitmcm9tIHVuaWNvZGVkYXRhIGltcG9ydCBub3JtYWxpemUsIHVuaWRhdGFfdmVyc2lvbgorCitURVNUREFUQUZJTEUgPSAiTm9ybWFsaXphdGlvblRlc3QudHh0IgorVEVTVERBVEFVUkwgPSAiaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvIiArIHVuaWRhdGFfdmVyc2lvbiArICIvdWNkLyIgKyBURVNUREFUQUZJTEUKKworZGVmIGNoZWNrX3ZlcnNpb24odGVzdGZpbGUpOgorICAgIGhkciA9IHRlc3RmaWxlLnJlYWRsaW5lKCkKKyAgICByZXR1cm4gdW5pZGF0YV92ZXJzaW9uIGluIGhkcgorCitjbGFzcyBSYW5nZUVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitkZWYgTkZDKHN0cik6CisgICAgcmV0dXJuIG5vcm1hbGl6ZSgiTkZDIiwgc3RyKQorCitkZWYgTkZLQyhzdHIpOgorICAgIHJldHVybiBub3JtYWxpemUoIk5GS0MiLCBzdHIpCisKK2RlZiBORkQoc3RyKToKKyAgICByZXR1cm4gbm9ybWFsaXplKCJORkQiLCBzdHIpCisKK2RlZiBORktEKHN0cik6CisgICAgcmV0dXJuIG5vcm1hbGl6ZSgiTkZLRCIsIHN0cikKKworZGVmIHVuaXN0cihkYXRhKToKKyAgICBkYXRhID0gW2ludCh4LCAxNikgZm9yIHggaW4gZGF0YS5zcGxpdCgiICIpXQorICAgIGZvciB4IGluIGRhdGE6CisgICAgICAgIGlmIHggPiBzeXMubWF4dW5pY29kZToKKyAgICAgICAgICAgIHJhaXNlIFJhbmdlRXJyb3IKKyAgICByZXR1cm4gdSIiLmpvaW4oW3VuaWNocih4KSBmb3IgeCBpbiBkYXRhXSkKKworY2xhc3MgTm9ybWFsaXphdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X21haW4oc2VsZik6CisgICAgICAgIHBhcnQgPSBOb25lCisgICAgICAgIHBhcnQxX2RhdGEgPSB7fQorICAgICAgICAjIEhpdCB0aGUgZXhjZXB0aW9uIGVhcmx5CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3RkYXRhID0gb3Blbl91cmxyZXNvdXJjZShURVNUREFUQVVSTCwgY2hlY2tfdmVyc2lvbikKKyAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBIVFRQRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIkNvdWxkIG5vdCByZXRyaWV2ZSAiICsgVEVTVERBVEFVUkwpCisgICAgICAgIGZvciBsaW5lIGluIHRlc3RkYXRhOgorICAgICAgICAgICAgaWYgJyMnIGluIGxpbmU6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3BsaXQoJyMnKVswXQorICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgiQFBhcnQiKToKKyAgICAgICAgICAgICAgICBwYXJ0ID0gbGluZS5zcGxpdCgpWzBdCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjMSxjMixjMyxjNCxjNSA9IFt1bmlzdHIoeCkgZm9yIHggaW4gbGluZS5zcGxpdCgnOycpWzotMV1dCisgICAgICAgICAgICBleGNlcHQgUmFuZ2VFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFNraXAgdW5zdXBwb3J0ZWQgY2hhcmFjdGVyczsKKyAgICAgICAgICAgICAgICAjIHRyeSBhdGxlYXN0IGFkZGluZyBjMSBpZiB3ZSBhcmUgaW4gcGFydDEKKyAgICAgICAgICAgICAgICBpZiBwYXJ0ID09ICJAUGFydDEiOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBjMSA9IHVuaXN0cihsaW5lLnNwbGl0KCc7JylbMF0pCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBSYW5nZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFydDFfZGF0YVtjMV0gPSAxCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBQZXJmb3JtIHRlc3RzCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzIgPT0gIE5GQyhjMSkgPT0gIE5GQyhjMikgPT0gIE5GQyhjMyksIGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzQgPT0gIE5GQyhjNCkgPT0gIE5GQyhjNSksIGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzMgPT0gIE5GRChjMSkgPT0gIE5GRChjMikgPT0gIE5GRChjMyksIGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzUgPT0gIE5GRChjNCkgPT0gIE5GRChjNSksIGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzQgPT0gTkZLQyhjMSkgPT0gTkZLQyhjMikgPT0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GS0MoYzMpID09IE5GS0MoYzQpID09IE5GS0MoYzUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzUgPT0gTkZLRChjMSkgPT0gTkZLRChjMikgPT0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GS0QoYzMpID09IE5GS0QoYzQpID09IE5GS0QoYzUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpCisKKyAgICAgICAgICAgICMgUmVjb3JkIHBhcnQgMSBkYXRhCisgICAgICAgICAgICBpZiBwYXJ0ID09ICJAUGFydDEiOgorICAgICAgICAgICAgICAgIHBhcnQxX2RhdGFbYzFdID0gMQorCisgICAgICAgICMgUGVyZm9ybSB0ZXN0cyBmb3IgYWxsIG90aGVyIGRhdGEKKyAgICAgICAgZm9yIGMgaW4gcmFuZ2Uoc3lzLm1heHVuaWNvZGUrMSk6CisgICAgICAgICAgICBYID0gdW5pY2hyKGMpCisgICAgICAgICAgICBpZiBYIGluIHBhcnQxX2RhdGE6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShYID09IE5GQyhYKSA9PSBORkQoWCkgPT0gTkZLQyhYKSA9PSBORktEKFgpLCBjKQorCisgICAgZGVmIHRlc3RfYnVnXzgzNDY3NihzZWxmKToKKyAgICAgICAgIyBDaGVjayBmb3IgYnVnIDgzNDY3NgorICAgICAgICBub3JtYWxpemUoJ05GQycsIHUnXHVkNTVjXHVhZTAwJykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KE5vcm1hbGl6YXRpb25UZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZWMxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZWMxMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9udHBhdGgucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9udHBhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4NTJjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X250cGF0aC5weQpAQCAtMCwwICsxLDIwMyBAQAoraW1wb3J0IG50cGF0aAoraW1wb3J0IG9zCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0RmFpbGVkCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgdGVzdF9nZW5lcmljcGF0aAoraW1wb3J0IHVuaXR0ZXN0CisKKworZGVmIHRlc3Rlcihmbiwgd2FudFJlc3VsdCk6CisgICAgZm4gPSBmbi5yZXBsYWNlKCJcXCIsICJcXFxcIikKKyAgICBnb3RSZXN1bHQgPSBldmFsKGZuKQorICAgIGlmIHdhbnRSZXN1bHQgIT0gZ290UmVzdWx0OgorICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiJXMgc2hvdWxkIHJldHVybjogJXMgYnV0IHJldHVybmVkOiAlcyIgXAorICAgICAgICAgICAgICAlKHN0cihmbiksIHN0cih3YW50UmVzdWx0KSwgc3RyKGdvdFJlc3VsdCkpCisKKworY2xhc3MgVGVzdE50cGF0aCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc3BsaXRleHQoc2VsZik6CisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0ZXh0KCJmb28uZXh0IiknLCAoJ2ZvbycsICcuZXh0JykpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0ZXh0KCIvZm9vL2Zvby5leHQiKScsICgnL2Zvby9mb28nLCAnLmV4dCcpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGV4dCgiLmV4dCIpJywgKCcuZXh0JywgJycpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGV4dCgiXFxmb28uZXh0XFxmb28iKScsICgnXFxmb28uZXh0XFxmb28nLCAnJykpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0ZXh0KCJmb28uZXh0XFwiKScsICgnZm9vLmV4dFxcJywgJycpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGV4dCgiIiknLCAoJycsICcnKSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXRleHQoImZvby5iYXIuZXh0IiknLCAoJ2Zvby5iYXInLCAnLmV4dCcpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGV4dCgieHgvZm9vLmJhci5leHQiKScsICgneHgvZm9vLmJhcicsICcuZXh0JykpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0ZXh0KCJ4eFxcZm9vLmJhci5leHQiKScsICgneHhcXGZvby5iYXInLCAnLmV4dCcpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGV4dCgiYzphL2JcXGMuZCIpJywgKCdjOmEvYlxcYycsICcuZCcpKQorCisgICAgZGVmIHRlc3Rfc3BsaXRkcml2ZShzZWxmKToKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXRkcml2ZSgiYzpcXGZvb1xcYmFyIiknLAorICAgICAgICAgICAgICAgKCdjOicsICdcXGZvb1xcYmFyJykpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0ZHJpdmUoImM6L2Zvby9iYXIiKScsCisgICAgICAgICAgICAgICAoJ2M6JywgJy9mb28vYmFyJykpCisKKyAgICBkZWYgdGVzdF9zcGxpdHVuYyhzZWxmKToKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXR1bmMoIlxcXFxjb25reVxcbW91bnRwb2ludFxcZm9vXFxiYXIiKScsCisgICAgICAgICAgICAgICAoJ1xcXFxjb25reVxcbW91bnRwb2ludCcsICdcXGZvb1xcYmFyJykpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0dW5jKCIvL2Nvbmt5L21vdW50cG9pbnQvZm9vL2JhciIpJywKKyAgICAgICAgICAgICAgICgnLy9jb25reS9tb3VudHBvaW50JywgJy9mb28vYmFyJykpCisKKyAgICBkZWYgdGVzdF9zcGxpdChzZWxmKToKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXQoImM6XFxmb29cXGJhciIpJywgKCdjOlxcZm9vJywgJ2JhcicpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdCgiXFxcXGNvbmt5XFxtb3VudHBvaW50XFxmb29cXGJhciIpJywKKyAgICAgICAgICAgICAgICgnXFxcXGNvbmt5XFxtb3VudHBvaW50XFxmb28nLCAnYmFyJykpCisKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXQoImM6XFwiKScsICgnYzpcXCcsICcnKSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXQoIlxcXFxjb25reVxcbW91bnRwb2ludFxcIiknLAorICAgICAgICAgICAgICAgKCdcXFxcY29ua3lcXG1vdW50cG9pbnQnLCAnJykpCisKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXQoImM6LyIpJywgKCdjOi8nLCAnJykpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0KCIvL2Nvbmt5L21vdW50cG9pbnQvIiknLCAoJy8vY29ua3kvbW91bnRwb2ludCcsICcnKSkKKworICAgIGRlZiB0ZXN0X2lzYWJzKHNlbGYpOgorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5pc2FicygiYzpcXCIpJywgMSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguaXNhYnMoIlxcXFxjb25reVxcbW91bnRwb2ludFxcIiknLCAxKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5pc2FicygiXFxmb28iKScsIDEpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmlzYWJzKCJcXGZvb1xcYmFyIiknLCAxKQorCisgICAgZGVmIHRlc3RfY29tbW9ucHJlZml4KHNlbGYpOgorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5jb21tb25wcmVmaXgoWyIvaG9tZS9zd2Vuc29uL3NwYW0iLCAiL2hvbWUvc3dlbi9zcGFtIl0pJywKKyAgICAgICAgICAgICAgICIvaG9tZS9zd2VuIikKKyAgICAgICAgdGVzdGVyKCdudHBhdGguY29tbW9ucHJlZml4KFsiXFxob21lXFxzd2VuXFxzcGFtIiwgIlxcaG9tZVxcc3dlblxcZWdncyJdKScsCisgICAgICAgICAgICAgICAiXFxob21lXFxzd2VuXFwiKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5jb21tb25wcmVmaXgoWyIvaG9tZS9zd2VuL3NwYW0iLCAiL2hvbWUvc3dlbi9zcGFtIl0pJywKKyAgICAgICAgICAgICAgICIvaG9tZS9zd2VuL3NwYW0iKQorCisgICAgZGVmIHRlc3Rfam9pbihzZWxmKToKKyAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiIiknLCAnJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiIiwgIiIsICIiKScsICcnKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJhIiknLCAnYScpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oIi9hIiknLCAnL2EnKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJcXGEiKScsICdcXGEnKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJhOiIpJywgJ2E6JykKKyAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiYToiLCAiYiIpJywgJ2E6YicpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oImE6IiwgIi9iIiknLCAnYTovYicpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oImE6IiwgIlxcYiIpJywgJ2E6XFxiJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiYSIsICIvYiIpJywgJy9iJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiYSIsICJcXGIiKScsICdcXGInKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJhIiwgImIiLCAiYyIpJywgJ2FcXGJcXGMnKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJhXFwiLCAiYiIsICJjIiknLCAnYVxcYlxcYycpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oImEiLCAiYlxcIiwgImMiKScsICdhXFxiXFxjJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiYSIsICJiIiwgIlxcYyIpJywgJ1xcYycpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oImQ6XFwiLCAiXFxwbGVlcCIpJywgJ2Q6XFxwbGVlcCcpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oImQ6XFwiLCAiYSIsICJiIiknLCAnZDpcXGFcXGInKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdjOicsICcvYScpIiwgJ2M6L2EnKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdjOi8nLCAnL2EnKSIsICdjOi9hJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYzovYScsICcvYicpIiwgJy9iJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYzonLCAnZDovJykiLCAnZDovJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYzovJywgJ2Q6LycpIiwgJ2Q6LycpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2M6LycsICdkOi9hL2InKSIsICdkOi9hL2InKQorCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJycpIiwgJycpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJycsICcnLCAnJywgJycsICcnKSIsICcnKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdhJykiLCAnYScpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJycsICdhJykiLCAnYScpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJycsICcnLCAnJywgJycsICdhJykiLCAnYScpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2EnLCAnJykiLCAnYVxcJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYScsICcnLCAnJywgJycsICcnKSIsICdhXFwnKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdhXFwnLCAnJykiLCAnYVxcJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYVxcJywgJycsICcnLCAnJywgJycpIiwgJ2FcXCcpCisKKyAgICBkZWYgdGVzdF9ub3JtcGF0aChzZWxmKToKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJ0EvLy8vLy8uLy4vLy8uLy9CJykiLCByJ0FcQicpCisgICAgICAgIHRlc3RlcigibnRwYXRoLm5vcm1wYXRoKCdBLy4vQicpIiwgcidBXEInKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnQS9mb28vLi4vQicpIiwgcidBXEInKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnQzpBLy9CJykiLCByJ0M6QVxCJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJ0Q6QS8uL0InKSIsIHInRDpBXEInKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnZTpBL2Zvby8uLi9CJykiLCByJ2U6QVxCJykKKworICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnQzovLy9BLy9CJykiLCByJ0M6XEFcQicpCisgICAgICAgIHRlc3RlcigibnRwYXRoLm5vcm1wYXRoKCdEOi8vL0EvLi9CJykiLCByJ0Q6XEFcQicpCisgICAgICAgIHRlc3RlcigibnRwYXRoLm5vcm1wYXRoKCdlOi8vL0EvZm9vLy4uL0InKSIsIHInZTpcQVxCJykKKworICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnLi4nKSIsIHInLi4nKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnLicpIiwgcicuJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJycpIiwgcicuJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJy8nKSIsICdcXCcpCisgICAgICAgIHRlc3RlcigibnRwYXRoLm5vcm1wYXRoKCdjOi8nKSIsICdjOlxcJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJy8uLi8uLi8uLy4uJykiLCAnXFwnKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnYzovLi4vLi4vLi4nKSIsICdjOlxcJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJy4uLy4uLy4vLi4nKSIsIHInLi5cLi5cLi4nKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnSzouLi8uLi8uLy4uJykiLCByJ0s6Li5cLi5cLi4nKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnQzovLy8vYS9iJykiLCByJ0M6XGFcYicpCisgICAgICAgIHRlc3RlcigibnRwYXRoLm5vcm1wYXRoKCcvL21hY2hpbmUvc2hhcmUvL2EvYicpIiwgcidcXG1hY2hpbmVcc2hhcmVcYVxiJykKKworICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnXFxcXC5cXE5VTCcpIiwgcidcXC5cTlVMJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJ1xcXFw/XFxEOi9YWVxcWicpIiwgcidcXD9cRDovWFlcWicpCisKKyAgICBkZWYgdGVzdF9leHBhbmR2YXJzKHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52OgorICAgICAgICAgICAgZW52LmNsZWFyKCkKKyAgICAgICAgICAgIGVudlsiZm9vIl0gPSAiYmFyIgorICAgICAgICAgICAgZW52WyJ7Zm9vIl0gPSAiYmF6MSIKKyAgICAgICAgICAgIGVudlsie2Zvb30iXSA9ICJiYXoyIgorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiZm9vIiknLCAiZm9vIikKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiRmb28gYmFyIiknLCAiYmFyIGJhciIpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCIke2Zvb31iYXIiKScsICJiYXJiYXIiKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJFtmb29dYmFyIiknLCAiJFtmb29dYmFyIikKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiRiYXIgYmFyIiknLCAiJGJhciBiYXIiKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJD9iYXIiKScsICIkP2JhciIpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCIke2Zvb31iYXIiKScsICJiYXJiYXIiKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJGZvb31iYXIiKScsICJiYXJ9YmFyIikKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiR7Zm9vIiknLCAiJHtmb28iKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJHt7Zm9vfX0iKScsICJiYXoxfSIpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCIkZm9vJGZvbyIpJywgImJhcmJhciIpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCIkYmFyJGJhciIpJywgIiRiYXIkYmFyIikKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiVmb28lIGJhciIpJywgImJhciBiYXIiKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJWZvbyViYXIiKScsICJiYXJiYXIiKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJWZvbyUlZm9vJSIpJywgImJhcmJhciIpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCIlJWZvbyUlZm9vJWZvbyUiKScsICIlZm9vJWZvb2JhciIpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCIlP2JhciUiKScsICIlP2JhciUiKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJWZvbyUlYmFyIiknLCAiYmFyJWJhciIpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCJcJyVmb28lXCclYmFyIiknLCAiXCclZm9vJVwnJWJhciIpCisKKyAgICBkZWYgdGVzdF9hYnNwYXRoKHNlbGYpOgorICAgICAgICAjIG50cGF0aC5hYnNwYXRoKCkgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIHN5c3RlbSB3aXRoIHRoZSAibnQiIG1vZHVsZQorICAgICAgICAjIChyZWFzb25hYmx5KSwgc28gd2UgcHJvdGVjdCB0aGlzIHRlc3Qgd2l0aCAiaW1wb3J0IG50Ii4gIFRoaXMgYWxsb3dzCisgICAgICAgICMgdGhlIHJlc3Qgb2YgdGhlIHRlc3RzIGZvciB0aGUgbnRwYXRoIG1vZHVsZSB0byBiZSBydW4gdG8gY29tcGxldGlvbgorICAgICAgICAjIG9uIGFueSBwbGF0Zm9ybSwgc2luY2UgbW9zdCBvZiB0aGUgbW9kdWxlIGlzIGludGVuZGVkIHRvIGJlIHVzYWJsZQorICAgICAgICAjIGZyb20gYW55IHBsYXRmb3JtLgorICAgICAgICAjIFhYWCB0aGlzIG5lZWRzIG1vcmUgdGVzdHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IG50CisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICMgY2hlY2sgdGhhdCB0aGUgZnVuY3Rpb24gaXMgdGhlcmUgZXZlbiBpZiB3ZSBhcmUgbm90IG9uIFdpbmRvd3MKKyAgICAgICAgICAgIG50cGF0aC5hYnNwYXRoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5hYnNwYXRoKCJDOlxcIiknLCAiQzpcXCIpCisKKyAgICBkZWYgdGVzdF9yZWxwYXRoKHNlbGYpOgorICAgICAgICBjdXJyZW50ZGlyID0gb3MucGF0aC5zcGxpdChvcy5nZXRjd2QoKSlbLTFdCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoImEiKScsICdhJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGgucmVscGF0aChvcy5wYXRoLmFic3BhdGgoImEiKSknLCAnYScpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoImEvYiIpJywgJ2FcXGInKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5yZWxwYXRoKCIuLi9hL2IiKScsICcuLlxcYVxcYicpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoImEiLCAiLi4vYiIpJywgJy4uXFwnK2N1cnJlbnRkaXIrJ1xcYScpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoImEvYiIsICIuLi9jIiknLCAnLi5cXCcrY3VycmVudGRpcisnXFxhXFxiJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGgucmVscGF0aCgiYSIsICJiL2MiKScsICcuLlxcLi5cXGEnKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5yZWxwYXRoKCIvL2Nvbmt5L21vdW50cG9pbnQvYSIsICIvL2Nvbmt5L21vdW50cG9pbnQvYi9jIiknLCAnLi5cXC4uXFxhJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGgucmVscGF0aCgiYSIsICJhIiknLCAnLicpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoIi9mb28vYmFyL2JhdCIsICIveC95L3oiKScsICcuLlxcLi5cXC4uXFxmb29cXGJhclxcYmF0JykKKyAgICAgICAgdGVzdGVyKCdudHBhdGgucmVscGF0aCgiL2Zvby9iYXIvYmF0IiwgIi9mb28vYmFyIiknLCAnYmF0JykKKyAgICAgICAgdGVzdGVyKCdudHBhdGgucmVscGF0aCgiL2Zvby9iYXIvYmF0IiwgIi8iKScsICdmb29cXGJhclxcYmF0JykKKyAgICAgICAgdGVzdGVyKCdudHBhdGgucmVscGF0aCgiLyIsICIvZm9vL2Jhci9iYXQiKScsICcuLlxcLi5cXC4uJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGgucmVscGF0aCgiL2Zvby9iYXIvYmF0IiwgIi94IiknLCAnLi5cXGZvb1xcYmFyXFxiYXQnKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5yZWxwYXRoKCIveCIsICIvZm9vL2Jhci9iYXQiKScsICcuLlxcLi5cXC4uXFx4JykKKyAgICAgICAgdGVzdGVyKCdudHBhdGgucmVscGF0aCgiLyIsICIvIiknLCAnLicpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoIi9hIiwgIi9hIiknLCAnLicpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoIi9hL2IiLCAiL2EvYiIpJywgJy4nKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5yZWxwYXRoKCJjOi9mb28iLCAiQzovRk9PIiknLCAnLicpCisKKworY2xhc3MgTnRDb21tb25UZXN0KHRlc3RfZ2VuZXJpY3BhdGguQ29tbW9uVGVzdCk6CisgICAgcGF0aG1vZHVsZSA9IG50cGF0aAorICAgIGF0dHJpYnV0ZXMgPSBbJ3JlbHBhdGgnLCAnc3BsaXR1bmMnXQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3ROdHBhdGgsIE50Q29tbW9uVGVzdCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbnRwYXRoLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X250cGF0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzNjU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X250cGF0aC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbnRwYXRoLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X250cGF0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzNjU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X250cGF0aC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb2xkX21haWxib3gucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGJhOWMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb2xkX21haWxib3gucHkKQEAgLTAsMCArMSwxNjAgQEAKKyMgVGhpcyBzZXQgb2YgdGVzdHMgZXhlcmNpc2VzIHRoZSBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IGNsYXNzCisjIGluIG1haWxib3gucHkgKHRoZSBvbmVzIHdpdGhvdXQgd3JpdGUgc3VwcG9ydCkuCisKK2ltcG9ydCBtYWlsYm94CitpbXBvcnQgb3MKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgY2xlYW51cCBlYXJsaWVyIHRlc3RzCit0cnk6CisgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCitleGNlcHQgb3MuZXJyb3I6CisgICAgcGFzcworCitGUk9NXyA9ICJGcm9tIHNvbWUuYm9keUBkdW1teS5kb21haW4gIFNhdCBKdWwgMjQgMTM6NDM6MzUgMjAwNFxuIgorRFVNTVlfTUVTU0FHRSA9ICIiIlwKK0Zyb206IHNvbWUuYm9keUBkdW1teS5kb21haW4KK1RvOiBtZUBteS5kb21haW4KK1N1YmplY3Q6IFNpbXBsZSBUZXN0CisKK1RoaXMgaXMgYSBkdW1teSBtZXNzYWdlLgorIiIiCisKK2NsYXNzIE1haWxkaXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgY3JlYXRlIGEgbmV3IG1haWxkaXIgbWFpbGJveCB0byB3b3JrIHdpdGg6CisgICAgICAgIHNlbGYuX2RpciA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgb3MubWtkaXIoc2VsZi5fZGlyKQorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCAiY3VyIikpCisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJ0bXAiKSkKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKHNlbGYuX2RpciwgIm5ldyIpKQorICAgICAgICBzZWxmLl9jb3VudGVyID0gMQorICAgICAgICBzZWxmLl9tc2dmaWxlcyA9IFtdCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIG1hcChvcy51bmxpbmssIHNlbGYuX21zZ2ZpbGVzKQorICAgICAgICBvcy5ybWRpcihvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCAiY3VyIikpCisgICAgICAgIG9zLnJtZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJ0bXAiKSkKKyAgICAgICAgb3Mucm1kaXIob3MucGF0aC5qb2luKHNlbGYuX2RpciwgIm5ldyIpKQorICAgICAgICBvcy5ybWRpcihzZWxmLl9kaXIpCisKKyAgICBkZWYgY3JlYXRlTWVzc2FnZShzZWxmLCBkaXIsIG1ib3g9RmFsc2UpOgorICAgICAgICB0ID0gaW50KHRpbWUudGltZSgpICUgMTAwMDAwMCkKKyAgICAgICAgcGlkID0gc2VsZi5fY291bnRlcgorICAgICAgICBzZWxmLl9jb3VudGVyICs9IDEKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5leHRzZXAuam9pbigoc3RyKHQpLCBzdHIocGlkKSwgIm15aG9zdG5hbWUiLCAibXlkb21haW4iKSkKKyAgICAgICAgdG1wbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJ0bXAiLCBmaWxlbmFtZSkKKyAgICAgICAgbmV3bmFtZSA9IG9zLnBhdGguam9pbihzZWxmLl9kaXIsIGRpciwgZmlsZW5hbWUpCisgICAgICAgIHdpdGggb3Blbih0bXBuYW1lLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgc2VsZi5fbXNnZmlsZXMuYXBwZW5kKHRtcG5hbWUpCisgICAgICAgICAgICBpZiBtYm94OgorICAgICAgICAgICAgICAgIGZwLndyaXRlKEZST01fKQorICAgICAgICAgICAgZnAud3JpdGUoRFVNTVlfTUVTU0FHRSkKKyAgICAgICAgaWYgaGFzYXR0cihvcywgImxpbmsiKToKKyAgICAgICAgICAgIG9zLmxpbmsodG1wbmFtZSwgbmV3bmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdpdGggb3BlbihuZXduYW1lLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKERVTU1ZX01FU1NBR0UpCisgICAgICAgIHNlbGYuX21zZ2ZpbGVzLmFwcGVuZChuZXduYW1lKQorICAgICAgICByZXR1cm4gdG1wbmFtZQorCisgICAgZGVmIHRlc3RfZW1wdHlfbWFpbGRpcihzZWxmKToKKyAgICAgICAgIiIiVGVzdCBhbiBlbXB0eSBtYWlsZGlyIG1haWxib3giIiIKKyAgICAgICAgIyBUZXN0IGZvciByZWdyZXNzaW9uIG9uIGJ1ZyAjMTE3NDkwOgorICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLm1ib3gpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisKKyAgICBkZWYgdGVzdF9ub25lbXB0eV9tYWlsZGlyX2N1cihzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJjdXIiKQorICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLm1ib3gpID09IDEpCisgICAgICAgIG1zZyA9IHNlbGYubWJveC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZyBpcyBub3QgTm9uZSkKKyAgICAgICAgbXNnLmZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKworICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfbmV3KHNlbGYpOgorICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoIm5ldyIpCisgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveCkgPT0gMSkKKyAgICAgICAgbXNnID0gc2VsZi5tYm94Lm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnIGlzIG5vdCBOb25lKQorICAgICAgICBtc2cuZnAuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorCisgICAgZGVmIHRlc3Rfbm9uZW1wdHlfbWFpbGRpcl9ib3RoKHNlbGYpOgorICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoImN1ciIpCisgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgibmV3IikKKyAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5tYm94KSA9PSAyKQorICAgICAgICBtc2cgPSBzZWxmLm1ib3gubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cgaXMgbm90IE5vbmUpCisgICAgICAgIG1zZy5mcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IHNlbGYubWJveC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZyBpcyBub3QgTm9uZSkKKyAgICAgICAgbXNnLmZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKworICAgIGRlZiB0ZXN0X3VuaXhfbWJveChzZWxmKToKKyAgICAgICAgIyMjIHNob3VsZCBiZSBiZXR0ZXIhCisgICAgICAgIGltcG9ydCBlbWFpbC5wYXJzZXIKKyAgICAgICAgZm5hbWUgPSBzZWxmLmNyZWF0ZU1lc3NhZ2UoImN1ciIsIFRydWUpCisgICAgICAgIG4gPSAwCisgICAgICAgIHdpdGggb3BlbihmbmFtZSkgYXMgZjoKKyAgICAgICAgICAgIGZvciBtc2cgaW4gbWFpbGJveC5Qb3J0YWJsZVVuaXhNYWlsYm94KGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsLnBhcnNlci5QYXJzZXIoKS5wYXJzZSk6CisgICAgICAgICAgICAgICAgbiArPSAxCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbInN1YmplY3QiXSwgIlNpbXBsZSBUZXN0IikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzdHIobXNnKSksIGxlbihGUk9NXykrbGVuKERVTU1ZX01FU1NBR0UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4sIDEpCisKK2NsYXNzIE1ib3hUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIGNyZWF0ZSBhIG5ldyBtYWlsZGlyIG1haWxib3ggdG8gd29yayB3aXRoOgorICAgICAgICBzZWxmLl9wYXRoID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBvcy51bmxpbmsoc2VsZi5fcGF0aCkKKworICAgIGRlZiB0ZXN0X2Zyb21fcmVnZXggKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgbmV3IHJlZ2V4IGZyb20gYnVnICMxNjMzNjc4CisgICAgICAgIHdpdGggb3BlbihzZWxmLl9wYXRoLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCIiIkZyb20gZnJlZEBleGFtcGxlLmNvbSBNb24gTWF5IDMxIDEzOjI0OjUwIDIwMDQgKzAyMDAKK1N1YmplY3Q6IG1lc3NhZ2UgMQorCitib2R5MQorRnJvbSBmcmVkQGV4YW1wbGUuY29tIE1vbiBNYXkgMzEgMTM6MjQ6NTAgMjAwNCAtMDIwMAorU3ViamVjdDogbWVzc2FnZSAyCisKK2JvZHkyCitGcm9tIGZyZWRAZXhhbXBsZS5jb20gTW9uIE1heSAzMSAxMzoyNDo1MCAyMDA0CitTdWJqZWN0OiBtZXNzYWdlIDMKKworYm9keTMKK0Zyb20gZnJlZEBleGFtcGxlLmNvbSBNb24gTWF5IDMxIDEzOjI0OjUwIDIwMDQKK1N1YmplY3Q6IG1lc3NhZ2UgNAorCitib2R5NAorIiIiKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5fcGF0aCwgJ3InKSBhcyBmOgorICAgICAgICAgICAgYm94ID0gbWFpbGJveC5Vbml4TWFpbGJveChmKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihsaXN0KGl0ZXIoYm94KSkpID09IDQpCisKKworICAgICMgWFhYIFdlIHN0aWxsIG5lZWQgbW9yZSB0ZXN0cyEKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChNYWlsZGlyVGVzdENhc2UsIE1ib3hUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjNmFmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29sZF9tYWlsYm94LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjNmFmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29sZF9tYWlsYm94LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGNvZGVzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDExN2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weQpAQCAtMCwwICsxLDEyMSBAQAorIyBQeXRob24gdGVzdCBzZXQgLS0gcGFydCAyLCBvcGNvZGVzCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfcHkza193YXJuaW5ncworaW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIE9wY29kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdHJ5X2luc2lkZV9mb3JfbG9vcChzZWxmKToKKyAgICAgICAgbiA9IDAKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgbiA9IG4raQorICAgICAgICAgICAgdHJ5OiAxIC8vIDAKKyAgICAgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6IHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICAgICAgdHJ5OiBwYXNzCisgICAgICAgICAgICBleGNlcHQ6IHBhc3MKKyAgICAgICAgICAgIHRyeTogcGFzcworICAgICAgICAgICAgZmluYWxseTogcGFzcworICAgICAgICAgICAgbiA9IG4raQorICAgICAgICBpZiBuICE9IDkwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCd0cnkgaW5zaWRlIGZvcicpCisKKyAgICBkZWYgdGVzdF9yYWlzZV9jbGFzc19leGNlcHRpb25zKHNlbGYpOgorCisgICAgICAgIGNsYXNzIEFDbGFzczogcGFzcworICAgICAgICBjbGFzcyBCQ2xhc3MoQUNsYXNzKTogcGFzcworICAgICAgICBjbGFzcyBDQ2xhc3M6IHBhc3MKKyAgICAgICAgY2xhc3MgRENsYXNzKEFDbGFzcyk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaWdub3JlKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdHJ5OiByYWlzZSBBQ2xhc3MoKQorICAgICAgICBleGNlcHQ6IHBhc3MKKworICAgICAgICB0cnk6IHJhaXNlIEFDbGFzcygpCisgICAgICAgIGV4Y2VwdCBBQ2xhc3M6IHBhc3MKKworICAgICAgICB0cnk6IHJhaXNlIEJDbGFzcygpCisgICAgICAgIGV4Y2VwdCBBQ2xhc3M6IHBhc3MKKworICAgICAgICB0cnk6IHJhaXNlIEJDbGFzcygpCisgICAgICAgIGV4Y2VwdCBDQ2xhc3M6IHNlbGYuZmFpbCgpCisgICAgICAgIGV4Y2VwdDogcGFzcworCisgICAgICAgIGEgPSBBQ2xhc3MoKQorICAgICAgICBiID0gQkNsYXNzKCkKKworICAgICAgICB0cnk6IHJhaXNlIEFDbGFzcywgYgorICAgICAgICBleGNlcHQgQkNsYXNzLCB2OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCBiKQorICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgdHJ5OiByYWlzZSBiCisgICAgICAgIGV4Y2VwdCBBQ2xhc3MsIHY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIGIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgIyBub3QgZW5vdWdoIGFyZ3VtZW50cworICAgICAgICB0cnk6ICByYWlzZSBCQ2xhc3MsIGEKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgdHJ5OiAgcmFpc2UgRENsYXNzLCBhCisgICAgICAgIGV4Y2VwdCBEQ2xhc3MsIHY6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodiwgRENsYXNzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQorCisgICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl9vYmplY3RzKHNlbGYpOgorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGE6IE5vbmUnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhOiBOb25lJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmLCBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGEgYTogYScpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGEgYTogYScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZiwgZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhIGE9MTogYScpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGEgYT0xOiBhJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmLCBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGE6IDAnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhOiAxJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmLCBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGE6IE5vbmUnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhIGE6IE5vbmUnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGYsIGcpCisKKyAgICAgICAgZiA9IGV2YWwoJ2xhbWJkYSBhOiBOb25lJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYSBiOiBOb25lJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmLCBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGEgYTogTm9uZScpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGEgYT1Ob25lOiBOb25lJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmLCBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGEgYT0wOiBOb25lJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYSBhPTE6IE5vbmUnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGYsIGcpCisKKyAgICBkZWYgdGVzdF9tb2R1bG9fb2Zfc3RyaW5nX3N1YmNsYXNzZXMoc2VsZik6CisgICAgICAgIGNsYXNzIE15U3RyaW5nKHN0cik6CisgICAgICAgICAgICBkZWYgX19tb2RfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTXlTdHJpbmcoKSAlIDMsIDQyKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKCJleGNlcHRpb25zIG11c3QgZGVyaXZlIGZyb20gQmFzZUV4Y2VwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImNhdGNoaW5nIGNsYXNzZXMgdGhhdCBkb24ndCBpbmhlcml0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIEJhc2VFeGNlcHRpb24gaXMgbm90IGFsbG93ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHJ1bl91bml0dGVzdChPcGNvZGVUZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGNvZGVzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wY29kZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZTIxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGNvZGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGNvZGVzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wY29kZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZTIxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGNvZGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVucHR5LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlbnB0eS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM0ZmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlbnB0eS5weQpAQCAtMCwwICsxLDIzIEBACisjIFRlc3QgdG8gc2VlIGlmIG9wZW5wdHkgd29ya3MuIChCdXQgZG9uJ3Qgd29ycnkgaWYgaXQgaXNuJ3QgYXZhaWxhYmxlLikKKworaW1wb3J0IG9zLCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2lmIG5vdCBoYXNhdHRyKG9zLCAib3BlbnB0eSIpOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0LCAiTm8gb3BlbnB0eSgpIGF2YWlsYWJsZS4iCisKKworY2xhc3MgT3BlbnB0eVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBtYXN0ZXIsIHNsYXZlID0gb3Mub3BlbnB0eSgpCisgICAgICAgIGlmIG5vdCBvcy5pc2F0dHkoc2xhdmUpOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTbGF2ZS1lbmQgb2YgcHR5IGlzIG5vdCBhIHRlcm1pbmFsLiIpCisKKyAgICAgICAgb3Mud3JpdGUoc2xhdmUsICdQaW5nIScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucmVhZChtYXN0ZXIsIDEwMjQpLCAnUGluZyEnKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KE9wZW5wdHlUZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVucHR5LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wZW5wdHkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDUzYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVucHR5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVucHR5LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wZW5wdHkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDUzYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVucHR5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVyYXRvci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTgwMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVyYXRvci5weQpAQCAtMCwwICsxLDUzMiBAQAoraW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgU2VxMToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbHN0KToKKyAgICAgICAgc2VsZi5sc3QgPSBsc3QKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmxzdCkKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgIHJldHVybiBzZWxmLmxzdFtpXQorICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYubHN0ICsgb3RoZXIubHN0CisgICAgZGVmIF9fbXVsX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5sc3QgKiBvdGhlcgorICAgIGRlZiBfX3JtdWxfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBvdGhlciAqIHNlbGYubHN0CisKK2NsYXNzIFNlcTIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbHN0KToKKyAgICAgICAgc2VsZi5sc3QgPSBsc3QKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmxzdCkKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgIHJldHVybiBzZWxmLmxzdFtpXQorICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYubHN0ICsgb3RoZXIubHN0CisgICAgZGVmIF9fbXVsX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5sc3QgKiBvdGhlcgorICAgIGRlZiBfX3JtdWxfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBvdGhlciAqIHNlbGYubHN0CisKKworY2xhc3MgT3BlcmF0b3JUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubHQsIDFqLCAyaikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5sdCgxLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5sdCgxLCAwLjApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmx0KDEsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmx0KDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sdCgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmx0KDEsIDIuMCkpCisKKyAgICBkZWYgdGVzdF9sZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sZSwgMWosIDJqKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmxlKDEsIDApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmxlKDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sZSgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxlKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sZSgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxlKDEsIDIuMCkpCisKKyAgICBkZWYgdGVzdF9lcShzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKKyAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBvcGVyYXRvci5lcSwgQygpLCBDKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZXEoMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZXEoMSwgMC4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmVxKDEsIDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZXEoMSwgMS4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5lcSgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5lcSgxLCAyLjApKQorCisgICAgZGVmIHRlc3RfbmUoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBvcGVyYXRvci5uZSwgQygpLCBDKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5uZSgxLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm5lKDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IubmUoMSwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IubmUoMSwgMS4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm5lKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubmUoMSwgMi4wKSkKKworICAgIGRlZiB0ZXN0X2dlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdlLCAxaiwgMmopCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZSgxLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmdlKDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZSgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmdlKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ2UoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ2UoMSwgMi4wKSkKKworICAgIGRlZiB0ZXN0X2d0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmd0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmd0LCAxaiwgMmopCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5ndCgxLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmd0KDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ3QoMSwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ3QoMSwgMS4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5ndCgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5ndCgxLCAyLjApKQorCisgICAgZGVmIHRlc3RfYWJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFicykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hYnMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hYnMoLTEpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hYnMoMSkgPT0gMSkKKworICAgIGRlZiB0ZXN0X2FkZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hZGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYWRkLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuYWRkKDMsIDQpID09IDcpCisKKyAgICBkZWYgdGVzdF9iaXR3aXNlX2FuZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hbmRfKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFuZF8sIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hbmRfKDB4ZiwgMHhhKSA9PSAweGEpCisKKyAgICBkZWYgdGVzdF9jb25jYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29uY2F0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdCgncHknLCAndGhvbicpID09ICdweXRob24nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29uY2F0KFsxLCAyXSwgWzMsIDRdKSA9PSBbMSwgMiwgMywgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoU2VxMShbNSwgNl0pLCBTZXExKFs3XSkpID09IFs1LCA2LCA3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdChTZXEyKFs1LCA2XSksIFNlcTIoWzddKSkgPT0gWzUsIDYsIDddKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCwgMTMsIDI5KQorCisgICAgZGVmIHRlc3RfY291bnRPZihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb3VudE9mKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvdW50T2YsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb3VudE9mKFsxLCAyLCAxLCAzLCAxLCA0XSwgMykgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCA1KSA9PSAwKQorCisgICAgZGVmIHRlc3RfZGVsaXRlbShzZWxmKToKKyAgICAgICAgYSA9IFs0LCAzLCAyLCAxXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZGVsaXRlbSwgYSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmRlbGl0ZW0oYSwgMSkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gWzQsIDIsIDFdKQorCisgICAgZGVmIHRlc3RfZGVsc2xpY2Uoc2VsZik6CisgICAgICAgIGEgPSByYW5nZSgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxzbGljZSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxzbGljZSwgYSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmRlbHNsaWNlKGEsIDIsIDgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFswLCAxLCA4LCA5XSkKKyAgICAgICAgb3BlcmF0b3IuZGVsc2xpY2UoYSwgMCwgdGVzdF9zdXBwb3J0Lk1BWF9QeV9zc2l6ZV90KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbXSkKKworICAgIGRlZiB0ZXN0X2RpdihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kaXYsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZGl2LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZmxvb3JkaXYoNSwgMikgPT0gMikKKworICAgIGRlZiB0ZXN0X2Zsb29yZGl2KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmZsb29yZGl2LCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmZsb29yZGl2LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZmxvb3JkaXYoNSwgMikgPT0gMikKKworICAgIGRlZiB0ZXN0X3RydWVkaXYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IudHJ1ZWRpdiwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci50cnVlZGl2LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IudHJ1ZWRpdig1LCAyKSA9PSAyLjUpCisKKyAgICBkZWYgdGVzdF9nZXRpdGVtKHNlbGYpOgorICAgICAgICBhID0gcmFuZ2UoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtLCBhLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZ2V0aXRlbShhLCAyKSA9PSAyKQorCisgICAgZGVmIHRlc3RfZ2V0c2xpY2Uoc2VsZik6CisgICAgICAgIGEgPSByYW5nZSgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZXRzbGljZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZXRzbGljZSwgYSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmdldHNsaWNlKGEsIDQsIDYpID09IFs0LCA1XSkKKyAgICAgICAgYiA9IG9wZXJhdG9yLmdldHNsaWNlKGEsIDAsIHRlc3Rfc3VwcG9ydC5NQVhfUHlfc3NpemVfdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIgPT0gYSkKKworICAgIGRlZiB0ZXN0X2luZGV4T2Yoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXhPZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleE9mLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaW5kZXhPZihbNCwgMywgMiwgMV0sIDMpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmluZGV4T2YsIFs0LCAzLCAyLCAxXSwgMCkKKworICAgIGRlZiB0ZXN0X2ludmVydChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbnZlcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW52ZXJ0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaW52KDQpID09IC01KQorCisgICAgZGVmIHRlc3RfaXNDYWxsYWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pc0NhbGxhYmxlKQorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWYgY2hlY2soc2VsZiwgbywgdik6CisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pc0NhbGxhYmxlKG8pLCB2KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FsbGFibGUobyksIHYpCisgICAgICAgIGNoZWNrKHNlbGYsIDQsIDApCisgICAgICAgIGNoZWNrKHNlbGYsIG9wZXJhdG9yLmlzQ2FsbGFibGUsIDEpCisgICAgICAgIGNoZWNrKHNlbGYsIEMsIDEpCisgICAgICAgIGNoZWNrKHNlbGYsIEMoKSwgMCkKKworICAgIGRlZiB0ZXN0X2lzTWFwcGluZ1R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNNYXBwaW5nVHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5pc01hcHBpbmdUeXBlKDEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUob3BlcmF0b3IuaXNNYXBwaW5nVHlwZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc01hcHBpbmdUeXBlKG9wZXJhdG9yLl9fZGljdF9fKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUoe30pKQorCisgICAgZGVmIHRlc3RfaXNOdW1iZXJUeXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzTnVtYmVyVHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzTnVtYmVyVHlwZSg4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzTnVtYmVyVHlwZSg4aikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc051bWJlclR5cGUoOEwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNOdW1iZXJUeXBlKDguMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuaXNOdW1iZXJUeXBlKGRpcigpKSkKKworICAgIGRlZiB0ZXN0X2lzU2VxdWVuY2VUeXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUoZGlyKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUoKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUoeHJhbmdlKDEwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSgneWVhaGJ1ZGR5JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUoMykpCisgICAgICAgIGNsYXNzIERpY3QoZGljdCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5pc1NlcXVlbmNlVHlwZShEaWN0KCkpKQorCisgICAgZGVmIHRlc3RfbHNoaWZ0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sc2hpZnQsIE5vbmUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHNoaWZ0KDUsIDEpID09IDEwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHNoaWZ0KDUsIDApID09IDUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCwgMiwgLTEpCisKKyAgICBkZWYgdGVzdF9tb2Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubW9kKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm1vZCwgTm9uZSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5tb2QoNSwgMikgPT0gMSkKKworICAgIGRlZiB0ZXN0X211bChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tdWwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubXVsLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubXVsKDUsIDIpID09IDEwKQorCisgICAgZGVmIHRlc3RfbmVnKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm5lZykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5uZWcsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5uZWcoNSkgPT0gLTUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5uZWcoLTUpID09IDUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5uZWcoMCkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm5lZygtMCkgPT0gMCkKKworICAgIGRlZiB0ZXN0X2JpdHdpc2Vfb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iub3JfKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm9yXywgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm9yXygweGEsIDB4NSkgPT0gMHhmKQorCisgICAgZGVmIHRlc3RfcG9zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5wb3MsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5wb3MoNSkgPT0gNSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnBvcygtNSkgPT0gLTUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5wb3MoMCkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnBvcygtMCkgPT0gMCkKKworICAgIGRlZiB0ZXN0X3BvdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5wb3cpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucG93LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucG93KDMsNSkgPT0gMyoqNSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLl9fcG93X18oMyw1KSA9PSAzKio1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnBvdywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5wb3csIDEsIDIsIDMpCisKKyAgICBkZWYgdGVzdF9yZXBlYXQoc2VsZik6CisgICAgICAgIGEgPSByYW5nZSgzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnJlcGVhdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yZXBlYXQsIGEsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gYSthKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMCkgPT0gW10pCisgICAgICAgIGEgPSAoMSwgMiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAyKSA9PSBhK2EpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMSkgPT0gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAwKSA9PSAoKSkKKyAgICAgICAgYSA9ICcxMjMnCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gYSthKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMCkgPT0gJycpCisgICAgICAgIGEgPSBTZXExKFs0LCA1LCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAyKSA9PSBbNCwgNSwgNiwgNCwgNSwgNl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMSkgPT0gWzQsIDUsIDZdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDApID09IFtdKQorICAgICAgICBhID0gU2VxMihbNCwgNSwgNl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gWzQsIDUsIDYsIDQsIDUsIDZdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IFs0LCA1LCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAwKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yZXBlYXQsIDYsIDcpCisKKyAgICBkZWYgdGVzdF9yc2hpZnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucnNoaWZ0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnJzaGlmdCwgTm9uZSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yc2hpZnQoNSwgMSkgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJzaGlmdCg1LCAwKSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5yc2hpZnQsIDIsIC0xKQorCisgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29udGFpbnMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29udGFpbnMsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb250YWlucyhyYW5nZSg0KSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuY29udGFpbnMocmFuZ2UoNCksIDUpKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc2VxdWVuY2VJbmNsdWRlcyhyYW5nZSg0KSwgMikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMocmFuZ2UoNCksIDUpKQorCisgICAgZGVmIHRlc3Rfc2V0aXRlbShzZWxmKToKKyAgICAgICAgYSA9IHJhbmdlKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc2V0aXRlbShhLCAwLCAyKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbMiwgMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGEsIDQsIDIpCisKKyAgICBkZWYgdGVzdF9zZXRzbGljZShzZWxmKToKKyAgICAgICAgYSA9IHJhbmdlKDQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0c2xpY2UsIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0c2xpY2UsIGEsIE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5zZXRzbGljZShhLCAxLCAzLCBbMiwgMV0pIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFswLCAyLCAxLCAzXSkKKyAgICAgICAgb3BlcmF0b3Iuc2V0c2xpY2UoYSwgMCwgdGVzdF9zdXBwb3J0Lk1BWF9QeV9zc2l6ZV90LCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gW10pCisKKyAgICBkZWYgdGVzdF9zdWIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc3ViKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnN1YiwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnN1Yig1LCAyKSA9PSAzKQorCisgICAgZGVmIHRlc3RfdHJ1dGgoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydXRoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IudHJ1dGgsIEMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnRydXRoKDUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IudHJ1dGgoWzBdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci50cnV0aCgwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci50cnV0aChbXSkpCisKKyAgICBkZWYgdGVzdF9iaXR3aXNlX3hvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci54b3IpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IueG9yLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IueG9yKDB4YiwgMHhjKSA9PSAweDcpCisKKyAgICBkZWYgdGVzdF9pcyhzZWxmKToKKyAgICAgICAgYSA9IGIgPSAneHl6cGRxJworICAgICAgICBjID0gYVs6M10gKyBiWzM6XQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzXyhhLCBiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5pc18oYSxjKSkKKworICAgIGRlZiB0ZXN0X2lzX25vdChzZWxmKToKKyAgICAgICAgYSA9IGIgPSAneHl6cGRxJworICAgICAgICBjID0gYVs6M10gKyBiWzM6XQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzX25vdCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5pc19ub3QoYSwgYikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc19ub3QoYSxjKSkKKworICAgIGRlZiB0ZXN0X2F0dHJnZXR0ZXIoc2VsZik6CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgYS5uYW1lID0gJ2FydGh1cicKKyAgICAgICAgZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ25hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoYSksICdhcnRodXInKQorICAgICAgICBmID0gb3BlcmF0b3IuYXR0cmdldHRlcigncmFuaycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBmLCBhKQorICAgICAgICBmID0gb3BlcmF0b3IuYXR0cmdldHRlcigyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYXR0cmdldHRlcikKKworICAgICAgICAjIG11bHRpcGxlIGdldHMKKyAgICAgICAgcmVjb3JkID0gQSgpCisgICAgICAgIHJlY29yZC54ID0gJ1gnCisgICAgICAgIHJlY29yZC55ID0gJ1knCisgICAgICAgIHJlY29yZC56ID0gJ1onCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuYXR0cmdldHRlcigneCcsJ3onLCd5JykocmVjb3JkKSwgKCdYJywgJ1onLCAnWScpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ3gnLCAoKSwgJ3knKSwgcmVjb3JkKQorCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IuYXR0cmdldHRlcignZm9vJyksIEMoKSkKKworICAgICAgICAjIHJlY3Vyc2l2ZSBnZXRzCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgYS5uYW1lID0gJ2FydGh1cicKKyAgICAgICAgYS5jaGlsZCA9IEEoKQorICAgICAgICBhLmNoaWxkLm5hbWUgPSAndGhvbWFzJworICAgICAgICBmID0gb3BlcmF0b3IuYXR0cmdldHRlcignY2hpbGQubmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihhKSwgJ3Rob21hcycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBmLCBhLmNoaWxkKQorICAgICAgICBmID0gb3BlcmF0b3IuYXR0cmdldHRlcignbmFtZScsICdjaGlsZC5uYW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKGEpLCAoJ2FydGh1cicsICd0aG9tYXMnKSkKKyAgICAgICAgZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ25hbWUnLCAnY2hpbGQubmFtZScsICdjaGlsZC5jaGlsZC5uYW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGYsIGEpCisKKyAgICAgICAgYS5jaGlsZC5jaGlsZCA9IEEoKQorICAgICAgICBhLmNoaWxkLmNoaWxkLm5hbWUgPSAnam9obnNvbicKKyAgICAgICAgZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ2NoaWxkLmNoaWxkLm5hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoYSksICdqb2huc29uJykKKyAgICAgICAgZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ25hbWUnLCAnY2hpbGQubmFtZScsICdjaGlsZC5jaGlsZC5uYW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKGEpLCAoJ2FydGh1cicsICd0aG9tYXMnLCAnam9obnNvbicpKQorCisgICAgZGVmIHRlc3RfaXRlbWdldHRlcihzZWxmKToKKyAgICAgICAgYSA9ICdBQkNERScKKyAgICAgICAgZiA9IG9wZXJhdG9yLml0ZW1nZXR0ZXIoMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKGEpLCAnQycpCisgICAgICAgIGYgPSBvcGVyYXRvci5pdGVtZ2V0dGVyKDEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBmLCBhKQorCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IuaXRlbWdldHRlcig0MiksIEMoKSkKKworICAgICAgICBmID0gb3BlcmF0b3IuaXRlbWdldHRlcignbmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pdGVtZ2V0dGVyKQorCisgICAgICAgIGQgPSBkaWN0KGtleT0ndmFsJykKKyAgICAgICAgZiA9IG9wZXJhdG9yLml0ZW1nZXR0ZXIoJ2tleScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihkKSwgJ3ZhbCcpCisgICAgICAgIGYgPSBvcGVyYXRvci5pdGVtZ2V0dGVyKCdub25rZXknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZiwgZCkKKworICAgICAgICAjIGV4YW1wbGUgdXNlZCBpbiB0aGUgZG9jcworICAgICAgICBpbnZlbnRvcnkgPSBbKCdhcHBsZScsIDMpLCAoJ2JhbmFuYScsIDIpLCAoJ3BlYXInLCA1KSwgKCdvcmFuZ2UnLCAxKV0KKyAgICAgICAgZ2V0Y291bnQgPSBvcGVyYXRvci5pdGVtZ2V0dGVyKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwKGdldGNvdW50LCBpbnZlbnRvcnkpLCBbMywgMiwgNSwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGludmVudG9yeSwga2V5PWdldGNvdW50KSwKKyAgICAgICAgICAgIFsoJ29yYW5nZScsIDEpLCAoJ2JhbmFuYScsIDIpLCAoJ2FwcGxlJywgMyksICgncGVhcicsIDUpXSkKKworICAgICAgICAjIG11bHRpcGxlIGdldHMKKyAgICAgICAgZGF0YSA9IG1hcChzdHIsIHJhbmdlKDIwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pdGVtZ2V0dGVyKDIsMTAsNSkoZGF0YSksICgnMicsICcxMCcsICc1JykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXRlbWdldHRlcigyLCAneCcsIDUpLCBkYXRhKQorCisgICAgZGVmIHRlc3RfbWV0aG9kY2FsbGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm1ldGhvZGNhbGxlcikKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3NbMF0gKyBhcmdzWzFdCisgICAgICAgICAgICBkZWYgYmFyKHNlbGYsIGY9NDIpOgorICAgICAgICAgICAgICAgIHJldHVybiBmCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgZiA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcignZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZiwgYSkKKyAgICAgICAgZiA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcignZm9vJywgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKGEpLCAzKQorICAgICAgICBmID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoYSksIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIGEsIGEpCisgICAgICAgIGYgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoJ2JhcicsIGY9NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKGEpLCA1KQorCisgICAgZGVmIHRlc3RfaW5wbGFjZShzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faWFkZF9fICAgICAoc2VsZiwgb3RoZXIpOiByZXR1cm4gImlhZGQiCisgICAgICAgICAgICBkZWYgX19pYW5kX18gICAgIChzZWxmLCBvdGhlcik6IHJldHVybiAiaWFuZCIKKyAgICAgICAgICAgIGRlZiBfX2lkaXZfXyAgICAgKHNlbGYsIG90aGVyKTogcmV0dXJuICJpZGl2IgorICAgICAgICAgICAgZGVmIF9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpOiByZXR1cm4gImlmbG9vcmRpdiIKKyAgICAgICAgICAgIGRlZiBfX2lsc2hpZnRfXyAgKHNlbGYsIG90aGVyKTogcmV0dXJuICJpbHNoaWZ0IgorICAgICAgICAgICAgZGVmIF9faW1vZF9fICAgICAoc2VsZiwgb3RoZXIpOiByZXR1cm4gImltb2QiCisgICAgICAgICAgICBkZWYgX19pbXVsX18gICAgIChzZWxmLCBvdGhlcik6IHJldHVybiAiaW11bCIKKyAgICAgICAgICAgIGRlZiBfX2lvcl9fICAgICAgKHNlbGYsIG90aGVyKTogcmV0dXJuICJpb3IiCisgICAgICAgICAgICBkZWYgX19pcG93X18gICAgIChzZWxmLCBvdGhlcik6IHJldHVybiAiaXBvdyIKKyAgICAgICAgICAgIGRlZiBfX2lyc2hpZnRfXyAgKHNlbGYsIG90aGVyKTogcmV0dXJuICJpcnNoaWZ0IgorICAgICAgICAgICAgZGVmIF9faXN1Yl9fICAgICAoc2VsZiwgb3RoZXIpOiByZXR1cm4gImlzdWIiCisgICAgICAgICAgICBkZWYgX19pdHJ1ZWRpdl9fIChzZWxmLCBvdGhlcik6IHJldHVybiAiaXRydWVkaXYiCisgICAgICAgICAgICBkZWYgX19peG9yX18gICAgIChzZWxmLCBvdGhlcik6IHJldHVybiAiaXhvciIKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBvdGhlcik6IHJldHVybiA1ICAjIHNvIHRoYXQgQyBpcyBhIHNlcXVlbmNlCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pYWRkICAgICAoYywgNSksICJpYWRkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pYW5kICAgICAoYywgNSksICJpYW5kIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pZGl2ICAgICAoYywgNSksICJpZGl2IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pZmxvb3JkaXYoYywgNSksICJpZmxvb3JkaXYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmlsc2hpZnQgIChjLCA1KSwgImlsc2hpZnQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmltb2QgICAgIChjLCA1KSwgImltb2QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmltdWwgICAgIChjLCA1KSwgImltdWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmlvciAgICAgIChjLCA1KSwgImlvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaXBvdyAgICAgKGMsIDUpLCAiaXBvdyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaXJzaGlmdCAgKGMsIDUpLCAiaXJzaGlmdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaXN1YiAgICAgKGMsIDUpLCAiaXN1YiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaXRydWVkaXYgKGMsIDUpLCAiaXRydWVkaXYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLml4b3IgICAgIChjLCA1KSwgIml4b3IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmljb25jYXQgIChjLCBjKSwgImlhZGQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmlyZXBlYXQgIChjLCA1KSwgImltdWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLl9faWFkZF9fICAgICAoYywgNSksICJpYWRkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5fX2lhbmRfXyAgICAgKGMsIDUpLCAiaWFuZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuX19pZGl2X18gICAgIChjLCA1KSwgImlkaXYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLl9faWZsb29yZGl2X18oYywgNSksICJpZmxvb3JkaXYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLl9faWxzaGlmdF9fICAoYywgNSksICJpbHNoaWZ0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5fX2ltb2RfXyAgICAgKGMsIDUpLCAiaW1vZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuX19pbXVsX18gICAgIChjLCA1KSwgImltdWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLl9faW9yX18gICAgICAoYywgNSksICJpb3IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLl9faXBvd19fICAgICAoYywgNSksICJpcG93IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5fX2lyc2hpZnRfXyAgKGMsIDUpLCAiaXJzaGlmdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuX19pc3ViX18gICAgIChjLCA1KSwgImlzdWIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLl9faXRydWVkaXZfXyAoYywgNSksICJpdHJ1ZWRpdiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuX19peG9yX18gICAgIChjLCA1KSwgIml4b3IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLl9faWNvbmNhdF9fICAoYywgYyksICJpYWRkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5fX2lyZXBlYXRfXyAgKGMsIDUpLCAiaW11bCIpCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBpbXBvcnQgc3lzCisgICAgdGVzdF9jbGFzc2VzID0gKAorICAgICAgICBPcGVyYXRvclRlc3RDYXNlLAorICAgICkKKworICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKworICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIHByaW50IGNvdW50cworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVyYXRvci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVyYXRvci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkYzcxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wZXJhdG9yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVyYXRvci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVyYXRvci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkYzcxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wZXJhdG9yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcHRwYXJzZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wdHBhcnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZTViYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcHRwYXJzZS5weQpAQCAtMCwwICsxLDE2MjYgQEAKKyMKKyMgVGVzdCBzdWl0ZSBmb3IgT3B0aWsuICBTdXBwbGllZCBieSBKb2hhbm5lcyBHaWpzYmVycworIyAodGFyYWRpbm9Ac29mdGhvbWUubmV0KSAtLSB0cmFuc2xhdGVkIGZyb20gdGhlIG9yaWdpbmFsIE9wdGlrCisjIHRlc3Qgc3VpdGUgdG8gdGhpcyBQeVVuaXQtYmFzZWQgdmVyc2lvbi4KKyMKKyMgJElkJAorIworCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IGNvcHkKK2ltcG9ydCB0eXBlcworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK2Zyb20gb3B0cGFyc2UgaW1wb3J0IG1ha2Vfb3B0aW9uLCBPcHRpb24sIFwKKyAgICAgVGl0bGVkSGVscEZvcm1hdHRlciwgT3B0aW9uUGFyc2VyLCBPcHRpb25Hcm91cCwgXAorICAgICBTVVBQUkVTU19VU0FHRSwgT3B0aW9uRXJyb3IsIE9wdGlvbkNvbmZsaWN0RXJyb3IsIFwKKyAgICAgQmFkT3B0aW9uRXJyb3IsIE9wdGlvblZhbHVlRXJyb3IsIFZhbHVlcworZnJvbSBvcHRwYXJzZSBpbXBvcnQgX21hdGNoX2FiYnJldgorZnJvbSBvcHRwYXJzZSBpbXBvcnQgX3BhcnNlX251bQorCityZXR5cGUgPSB0eXBlKHJlLmNvbXBpbGUoJycpKQorCitjbGFzcyBJbnRlcmNlcHRlZEVycm9yKEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2U9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZXhpdF9zdGF0dXM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZXhpdF9tZXNzYWdlPU5vbmUpOgorICAgICAgICBzZWxmLmVycm9yX21lc3NhZ2UgPSBlcnJvcl9tZXNzYWdlCisgICAgICAgIHNlbGYuZXhpdF9zdGF0dXMgPSBleGl0X3N0YXR1cworICAgICAgICBzZWxmLmV4aXRfbWVzc2FnZSA9IGV4aXRfbWVzc2FnZQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmVycm9yX21lc3NhZ2Ugb3Igc2VsZi5leGl0X21lc3NhZ2Ugb3IgImludGVyY2VwdGVkIGVycm9yIgorCitjbGFzcyBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIoT3B0aW9uUGFyc2VyKToKKyAgICBkZWYgZXhpdChzZWxmLCBzdGF0dXM9MCwgbXNnPU5vbmUpOgorICAgICAgICByYWlzZSBJbnRlcmNlcHRlZEVycm9yKGV4aXRfc3RhdHVzPXN0YXR1cywgZXhpdF9tZXNzYWdlPW1zZykKKworICAgIGRlZiBlcnJvcihzZWxmLCBtc2cpOgorICAgICAgICByYWlzZSBJbnRlcmNlcHRlZEVycm9yKGVycm9yX21lc3NhZ2U9bXNnKQorCisKK2NsYXNzIEJhc2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgYXNzZXJ0UGFyc2VPSyhzZWxmLCBhcmdzLCBleHBlY3RlZF9vcHRzLCBleHBlY3RlZF9wb3NpdGlvbmFsX2FyZ3MpOgorICAgICAgICAiIiJBc3NlcnQgdGhlIG9wdGlvbnMgYXJlIHdoYXQgd2UgZXhwZWN0ZWQgd2hlbiBwYXJzaW5nIGFyZ3VtZW50cy4KKworICAgICAgICBPdGhlcndpc2UsIGZhaWwgd2l0aCBhIG5pY2VseSBmb3JtYXR0ZWQgbWVzc2FnZS4KKworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50czoKKyAgICAgICAgYXJncyAtLSBBIGxpc3Qgb2YgYXJndW1lbnRzIHRvIHBhcnNlIHdpdGggT3B0aW9uUGFyc2VyLgorICAgICAgICBleHBlY3RlZF9vcHRzIC0tIFRoZSBvcHRpb25zIGV4cGVjdGVkLgorICAgICAgICBleHBlY3RlZF9wb3NpdGlvbmFsX2FyZ3MgLS0gVGhlIHBvc2l0aW9uYWwgYXJndW1lbnRzIGV4cGVjdGVkLgorCisgICAgICAgIFJldHVybnMgdGhlIG9wdGlvbnMgYW5kIHBvc2l0aW9uYWwgYXJncyBmb3IgZnVydGhlciB0ZXN0aW5nLgorICAgICAgICAiIiIKKworICAgICAgICAob3B0aW9ucywgcG9zaXRpb25hbF9hcmdzKSA9IHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKKyAgICAgICAgb3B0ZGljdCA9IHZhcnMob3B0aW9ucykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdGRpY3QsIGV4cGVjdGVkX29wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIiIiCitPcHRpb25zIGFyZSAlKG9wdGRpY3Qpcy4KK1Nob3VsZCBiZSAlKGV4cGVjdGVkX29wdHMpcy4KK0FyZ3Mgd2VyZSAlKGFyZ3Mpcy4iIiIgJSBsb2NhbHMoKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l0aW9uYWxfYXJncywgZXhwZWN0ZWRfcG9zaXRpb25hbF9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICIiIgorUG9zaXRpb25hbCBhcmd1bWVudHMgYXJlICUocG9zaXRpb25hbF9hcmdzKXMuCitTaG91bGQgYmUgJShleHBlY3RlZF9wb3NpdGlvbmFsX2FyZ3Mpcy4KK0FyZ3Mgd2VyZSAlKGFyZ3Mpcy4iIiIgJSBsb2NhbHMgKCkpCisKKyAgICAgICAgcmV0dXJuIChvcHRpb25zLCBwb3NpdGlvbmFsX2FyZ3MpCisKKyAgICBkZWYgYXNzZXJ0UmFpc2VzKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgYXJncywKKyAgICAgICAgICAgICAgICAgICAgIGt3YXJncywKKyAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX21lc3NhZ2UpOgorICAgICAgICAiIiIKKyAgICAgICAgQXNzZXJ0IHRoYXQgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBjYWxsaW5nIGEKKyAgICAgICAgZnVuY3Rpb24sIGFuZCB0aGF0IHRoZSByaWdodCBlcnJvciBtZXNzYWdlIGlzIGluY2x1ZGVkIHdpdGgKKyAgICAgICAgdGhhdCBleGNlcHRpb24uCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICAgIGZ1bmMgLS0gdGhlIGZ1bmN0aW9uIHRvIGNhbGwKKyAgICAgICAgICBhcmdzIC0tIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRvIGBmdW5jYAorICAgICAgICAgIGt3YXJncyAtLSBrZXl3b3JkIGFyZ3VtZW50cyB0byBgZnVuY2AKKyAgICAgICAgICBleHBlY3RlZF9leGNlcHRpb24gLS0gZXhjZXB0aW9uIHRoYXQgc2hvdWxkIGJlIHJhaXNlZAorICAgICAgICAgIGV4cGVjdGVkX21lc3NhZ2UgLS0gZXhwZWN0ZWQgZXhjZXB0aW9uIG1lc3NhZ2UgKG9yIHBhdHRlcm4KKyAgICAgICAgICAgIGlmIGEgY29tcGlsZWQgcmVnZXggb2JqZWN0KQorCisgICAgICAgIFJldHVybnMgdGhlIGV4Y2VwdGlvbiByYWlzZWQgZm9yIGZ1cnRoZXIgdGVzdGluZy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGFyZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIGFyZ3MgPSAoKQorICAgICAgICBpZiBrd2FyZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIGt3YXJncyA9IHt9CisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIGV4Y2VwdCBleHBlY3RlZF9leGNlcHRpb24sIGVycjoKKyAgICAgICAgICAgIGFjdHVhbF9tZXNzYWdlID0gc3RyKGVycikKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWRfbWVzc2FnZSwgcmV0eXBlKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWRfbWVzc2FnZS5zZWFyY2goYWN0dWFsX21lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiJcCitleHBlY3RlZCBleGNlcHRpb24gbWVzc2FnZSBwYXR0ZXJuOgorLyVzLworYWN0dWFsIGV4Y2VwdGlvbiBtZXNzYWdlOgorJycnJXMnJycKKyIiIiAlIChleHBlY3RlZF9tZXNzYWdlLnBhdHRlcm4sIGFjdHVhbF9tZXNzYWdlKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWxfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiJcCitleHBlY3RlZCBleGNlcHRpb24gbWVzc2FnZToKKycnJyVzJycnCithY3R1YWwgZXhjZXB0aW9uIG1lc3NhZ2U6CisnJyclcycnJworIiIiICUgKGV4cGVjdGVkX21lc3NhZ2UsIGFjdHVhbF9tZXNzYWdlKSkKKworICAgICAgICAgICAgcmV0dXJuIGVycgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCIiImV4cGVjdGVkIGV4Y2VwdGlvbiAlKGV4cGVjdGVkX2V4Y2VwdGlvbilzIG5vdCByYWlzZWQKK2NhbGxlZCAlKGZ1bmMpcgord2l0aCBhcmdzICUoYXJncylyCithbmQga3dhcmdzICUoa3dhcmdzKXIKKyIiIiAlIGxvY2FscyAoKSkKKworCisgICAgIyAtLSBBc3NlcnRpb25zIHVzZWQgaW4gbW9yZSB0aGFuIG9uZSBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGFzc2VydFBhcnNlRmFpbChzZWxmLCBjbWRsaW5lX2FyZ3MsIGV4cGVjdGVkX291dHB1dCk6CisgICAgICAgICIiIgorICAgICAgICBBc3NlcnQgdGhlIHBhcnNlciBmYWlscyB3aXRoIHRoZSBleHBlY3RlZCBtZXNzYWdlLiAgQ2FsbGVyCisgICAgICAgIG11c3QgZW5zdXJlIHRoYXQgc2VsZi5wYXJzZXIgaXMgYW4gSW50ZXJjZXB0aW5nT3B0aW9uUGFyc2VyLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VfYXJncyhjbWRsaW5lX2FyZ3MpCisgICAgICAgIGV4Y2VwdCBJbnRlcmNlcHRlZEVycm9yLCBlcnI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyci5lcnJvcl9tZXNzYWdlLCBleHBlY3RlZF9vdXRwdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCJleHBlY3RlZCBwYXJzZSBmYWlsdXJlIikKKworICAgIGRlZiBhc3NlcnRPdXRwdXQoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGNtZGxpbmVfYXJncywKKyAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3N0YXR1cz0wLAorICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZXJyb3I9Tm9uZSk6CisgICAgICAgICIiIkFzc2VydCB0aGUgcGFyc2VyIHByaW50cyB0aGUgZXhwZWN0ZWQgb3V0cHV0IG9uIHN0ZG91dC4iIiIKKyAgICAgICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIGVuY29kaW5nID0gZ2V0YXR0cihzYXZlX3N0ZG91dCwgJ2VuY29kaW5nJywgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBTdHJpbmdJTygpCisgICAgICAgICAgICAgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZW5jb2RpbmcgPSBlbmNvZGluZworICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoY21kbGluZV9hcmdzKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBzeXMuc3Rkb3V0LmdldHZhbHVlKCkKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKKworICAgICAgICBleGNlcHQgSW50ZXJjZXB0ZWRFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgIHR5cGUob3V0cHV0KSBpcyB0eXBlcy5TdHJpbmdUeXBlLAorICAgICAgICAgICAgICAgICJleHBlY3RlZCBvdXRwdXQgdG8gYmUgYW4gb3JkaW5hcnkgc3RyaW5nLCBub3QgJXIiCisgICAgICAgICAgICAgICAgJSB0eXBlKG91dHB1dCkpCisKKyAgICAgICAgICAgIGlmIG91dHB1dCAhPSBleHBlY3RlZF9vdXRwdXQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZDogXG4nJydcbiIgKyBleHBlY3RlZF9vdXRwdXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAiJycnXG5idXQgZ290IFxuJycnXG4iICsgb3V0cHV0ICsgIicnJyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyci5leGl0X3N0YXR1cywgZXhwZWN0ZWRfc3RhdHVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuZXhpdF9tZXNzYWdlLCBleHBlY3RlZF9lcnJvcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoImV4cGVjdGVkIHBhcnNlci5leGl0KCkiKQorCisgICAgZGVmIGFzc2VydFR5cGVFcnJvcihzZWxmLCBmdW5jLCBleHBlY3RlZF9tZXNzYWdlLCAqYXJncyk6CisgICAgICAgICIiIkFzc2VydCB0aGF0IFR5cGVFcnJvciBpcyByYWlzZWQgd2hlbiBleGVjdXRpbmcgZnVuYy4iIiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZnVuYywgYXJncywgTm9uZSwgVHlwZUVycm9yLCBleHBlY3RlZF9tZXNzYWdlKQorCisgICAgZGVmIGFzc2VydEhlbHAoc2VsZiwgcGFyc2VyLCBleHBlY3RlZF9oZWxwKToKKyAgICAgICAgYWN0dWFsX2hlbHAgPSBwYXJzZXIuZm9ybWF0X2hlbHAoKQorICAgICAgICBpZiBhY3R1YWxfaGVscCAhPSBleHBlY3RlZF9oZWxwOgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICdoZWxwIHRleHQgZmFpbHVyZTsgZXhwZWN0ZWQ6XG4iJyArCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfaGVscCArICciOyBnb3Q6XG4iJyArCisgICAgICAgICAgICAgICAgYWN0dWFsX2hlbHAgKyAnIlxuJykKKworIyAtLSBUZXN0IG1ha2Vfb3B0aW9uKCkgYWthIE9wdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSXQncyBub3QgbmVjZXNzYXJ5IHRvIHRlc3QgY29ycmVjdCBvcHRpb25zIGhlcmUuICBBbGwgdGhlIHRlc3RzIGluIHRoZQorIyBwYXJzZXIucGFyc2VfYXJncygpIHNlY3Rpb24gZGVhbCB3aXRoIHRob3NlLCBiZWNhdXNlIHRoZXkncmUgbmVlZGVkCisjIHRoZXJlLgorCitjbGFzcyBUZXN0T3B0aW9uQ2hlY2tzKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyID0gT3B0aW9uUGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFKQorCisgICAgZGVmIGFzc2VydE9wdGlvbkVycm9yKHNlbGYsIGV4cGVjdGVkX21lc3NhZ2UsIGFyZ3M9W10sIGt3YXJncz17fSk6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1ha2Vfb3B0aW9uLCBhcmdzLCBrd2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbkVycm9yLCBleHBlY3RlZF9tZXNzYWdlKQorCisgICAgZGVmIHRlc3Rfb3B0X3N0cmluZ19lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlRXJyb3IobWFrZV9vcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdCBsZWFzdCBvbmUgb3B0aW9uIHN0cmluZyBtdXN0IGJlIHN1cHBsaWVkIikKKworICAgIGRlZiB0ZXN0X29wdF9zdHJpbmdfdG9vX3Nob3J0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9wdGlvbkVycm9yKAorICAgICAgICAgICAgImludmFsaWQgb3B0aW9uIHN0cmluZyAnYic6IG11c3QgYmUgYXQgbGVhc3QgdHdvIGNoYXJhY3RlcnMgbG9uZyIsCisgICAgICAgICAgICBbImIiXSkKKworICAgIGRlZiB0ZXN0X29wdF9zdHJpbmdfc2hvcnRfaW52YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJpbnZhbGlkIHNob3J0IG9wdGlvbiBzdHJpbmcgJy0tJzogbXVzdCBiZSAiCisgICAgICAgICAgICAib2YgdGhlIGZvcm0gLXgsICh4IGFueSBub24tZGFzaCBjaGFyKSIsCisgICAgICAgICAgICBbIi0tIl0pCisKKyAgICBkZWYgdGVzdF9vcHRfc3RyaW5nX2xvbmdfaW52YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJpbnZhbGlkIGxvbmcgb3B0aW9uIHN0cmluZyAnLS0tJzogIgorICAgICAgICAgICAgIm11c3Qgc3RhcnQgd2l0aCAtLSwgZm9sbG93ZWQgYnkgbm9uLWRhc2giLAorICAgICAgICAgICAgWyItLS0iXSkKKworICAgIGRlZiB0ZXN0X2F0dHJfaW52YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJvcHRpb24gLWI6IGludmFsaWQga2V5d29yZCBhcmd1bWVudHM6IGJhciwgZm9vIiwKKyAgICAgICAgICAgIFsiLWIiXSwgeydmb28nOiBOb25lLCAnYmFyJzogTm9uZX0pCisKKyAgICBkZWYgdGVzdF9hY3Rpb25faW52YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJvcHRpb24gLWI6IGludmFsaWQgYWN0aW9uOiAnZm9vJyIsCisgICAgICAgICAgICBbIi1iIl0sIHsnYWN0aW9uJzogJ2Zvbyd9KQorCisgICAgZGVmIHRlc3RfdHlwZV9pbnZhbGlkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9wdGlvbkVycm9yKAorICAgICAgICAgICAgIm9wdGlvbiAtYjogaW52YWxpZCBvcHRpb24gdHlwZTogJ2ZvbyciLAorICAgICAgICAgICAgWyItYiJdLCB7J3R5cGUnOiAnZm9vJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uIC1iOiBpbnZhbGlkIG9wdGlvbiB0eXBlOiAndHVwbGUnIiwKKyAgICAgICAgICAgIFsiLWIiXSwgeyd0eXBlJzogdHVwbGV9KQorCisgICAgZGVmIHRlc3Rfbm9fdHlwZV9mb3JfYWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9wdGlvbkVycm9yKAorICAgICAgICAgICAgIm9wdGlvbiAtYjogbXVzdCBub3Qgc3VwcGx5IGEgdHlwZSBmb3IgYWN0aW9uICdjb3VudCciLAorICAgICAgICAgICAgWyItYiJdLCB7J2FjdGlvbic6ICdjb3VudCcsICd0eXBlJzogJ2ludCd9KQorCisgICAgZGVmIHRlc3Rfbm9fY2hvaWNlc19saXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9wdGlvbkVycm9yKAorICAgICAgICAgICAgIm9wdGlvbiAtYi8tLWJhZDogbXVzdCBzdXBwbHkgYSBsaXN0IG9mICIKKyAgICAgICAgICAgICJjaG9pY2VzIGZvciB0eXBlICdjaG9pY2UnIiwKKyAgICAgICAgICAgIFsiLWIiLCAiLS1iYWQiXSwgeyd0eXBlJzogImNob2ljZSJ9KQorCisgICAgZGVmIHRlc3RfYmFkX2Nob2ljZXNfbGlzdChzZWxmKToKKyAgICAgICAgdHlwZW5hbWUgPSB0eXBlKCcnKS5fX25hbWVfXworICAgICAgICBzZWxmLmFzc2VydE9wdGlvbkVycm9yKAorICAgICAgICAgICAgIm9wdGlvbiAtYi8tLWJhZDogY2hvaWNlcyBtdXN0IGJlIGEgbGlzdCBvZiAiCisgICAgICAgICAgICAic3RyaW5ncyAoJyVzJyBzdXBwbGllZCkiICUgdHlwZW5hbWUsCisgICAgICAgICAgICBbIi1iIiwgIi0tYmFkIl0sCisgICAgICAgICAgICB7J3R5cGUnOiAiY2hvaWNlIiwgJ2Nob2ljZXMnOiJiYWQgY2hvaWNlcyJ9KQorCisgICAgZGVmIHRlc3Rfbm9fY2hvaWNlc19mb3JfdHlwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJvcHRpb24gLWI6IG11c3Qgbm90IHN1cHBseSBjaG9pY2VzIGZvciB0eXBlICdpbnQnIiwKKyAgICAgICAgICAgIFsiLWIiXSwgeyd0eXBlJzogJ2ludCcsICdjaG9pY2VzJzoiYmFkIn0pCisKKyAgICBkZWYgdGVzdF9ub19jb25zdF9mb3JfYWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9wdGlvbkVycm9yKAorICAgICAgICAgICAgIm9wdGlvbiAtYjogJ2NvbnN0JyBtdXN0IG5vdCBiZSBzdXBwbGllZCBmb3IgYWN0aW9uICdzdG9yZSciLAorICAgICAgICAgICAgWyItYiJdLCB7J2FjdGlvbic6ICdzdG9yZScsICdjb25zdCc6IDF9KQorCisgICAgZGVmIHRlc3Rfbm9fbmFyZ3NfZm9yX2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJvcHRpb24gLWI6ICduYXJncycgbXVzdCBub3QgYmUgc3VwcGxpZWQgZm9yIGFjdGlvbiAnY291bnQnIiwKKyAgICAgICAgICAgIFsiLWIiXSwgeydhY3Rpb24nOiAnY291bnQnLCAnbmFyZ3MnOiAyfSkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX25vdF9jYWxsYWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJvcHRpb24gLWI6IGNhbGxiYWNrIG5vdCBjYWxsYWJsZTogJ2ZvbyciLAorICAgICAgICAgICAgWyItYiJdLCB7J2FjdGlvbic6ICdjYWxsYmFjaycsCisgICAgICAgICAgICAgICAgICAgICAnY2FsbGJhY2snOiAnZm9vJ30pCisKKyAgICBkZWYgZHVtbXkoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX2FyZ3Nfbm9fdHVwbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uIC1iOiBjYWxsYmFja19hcmdzLCBpZiBzdXBwbGllZCwgIgorICAgICAgICAgICAgIm11c3QgYmUgYSB0dXBsZTogbm90ICdmb28nIiwKKyAgICAgICAgICAgIFsiLWIiXSwgeydhY3Rpb24nOiAnY2FsbGJhY2snLAorICAgICAgICAgICAgICAgICAgICAgJ2NhbGxiYWNrJzogc2VsZi5kdW1teSwKKyAgICAgICAgICAgICAgICAgICAgICdjYWxsYmFja19hcmdzJzogJ2Zvbyd9KQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfa3dhcmdzX25vX2RpY3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uIC1iOiBjYWxsYmFja19rd2FyZ3MsIGlmIHN1cHBsaWVkLCAiCisgICAgICAgICAgICAibXVzdCBiZSBhIGRpY3Q6IG5vdCAnZm9vJyIsCisgICAgICAgICAgICBbIi1iIl0sIHsnYWN0aW9uJzogJ2NhbGxiYWNrJywKKyAgICAgICAgICAgICAgICAgICAgICdjYWxsYmFjayc6IHNlbGYuZHVtbXksCisgICAgICAgICAgICAgICAgICAgICAnY2FsbGJhY2tfa3dhcmdzJzogJ2Zvbyd9KQorCisgICAgZGVmIHRlc3Rfbm9fY2FsbGJhY2tfZm9yX2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJvcHRpb24gLWI6IGNhbGxiYWNrIHN1cHBsaWVkICgnZm9vJykgZm9yIG5vbi1jYWxsYmFjayBvcHRpb24iLAorICAgICAgICAgICAgWyItYiJdLCB7J2FjdGlvbic6ICdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAnY2FsbGJhY2snOiAnZm9vJ30pCisKKyAgICBkZWYgdGVzdF9ub19jYWxsYmFja19hcmdzX2Zvcl9hY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uIC1iOiBjYWxsYmFja19hcmdzIHN1cHBsaWVkIGZvciBub24tY2FsbGJhY2sgb3B0aW9uIiwKKyAgICAgICAgICAgIFsiLWIiXSwgeydhY3Rpb24nOiAnc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgJ2NhbGxiYWNrX2FyZ3MnOiAnZm9vJ30pCisKKyAgICBkZWYgdGVzdF9ub19jYWxsYmFja19rd2FyZ3NfZm9yX2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJvcHRpb24gLWI6IGNhbGxiYWNrX2t3YXJncyBzdXBwbGllZCBmb3Igbm9uLWNhbGxiYWNrIG9wdGlvbiIsCisgICAgICAgICAgICBbIi1iIl0sIHsnYWN0aW9uJzogJ3N0b3JlJywKKyAgICAgICAgICAgICAgICAgICAgICdjYWxsYmFja19rd2FyZ3MnOiAnZm9vJ30pCisKK2NsYXNzIFRlc3RPcHRpb25QYXJzZXIoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItdiIsICItLXZlcmJvc2UiLCAiLW4iLCAiLS1ub2lzeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InZlcmJvc2UiKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItcSIsICItLXF1aWV0IiwgIi0tc2lsZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9InZlcmJvc2UiKQorCisgICAgZGVmIHRlc3RfYWRkX29wdGlvbl9ub19PcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKHNlbGYucGFyc2VyLmFkZF9vcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYW4gT3B0aW9uIGluc3RhbmNlOiBOb25lIiwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2FkZF9vcHRpb25faW52YWxpZF9hcmd1bWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKHNlbGYucGFyc2VyLmFkZF9vcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGFyZ3VtZW50cyIsIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9nZXRfb3B0aW9uKHNlbGYpOgorICAgICAgICBvcHQxID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLXYiKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uob3B0MSwgT3B0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdDEuX3Nob3J0X29wdHMsIFsiLXYiLCAiLW4iXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQxLl9sb25nX29wdHMsIFsiLS12ZXJib3NlIiwgIi0tbm9pc3kiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQxLmFjdGlvbiwgInN0b3JlX3RydWUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdDEuZGVzdCwgInZlcmJvc2UiKQorCisgICAgZGVmIHRlc3RfZ2V0X29wdGlvbl9lcXVhbHMoc2VsZik6CisgICAgICAgIG9wdDEgPSBzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItdiIpCisgICAgICAgIG9wdDIgPSBzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItLXZlcmJvc2UiKQorICAgICAgICBvcHQzID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLW4iKQorICAgICAgICBvcHQ0ID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLS1ub2lzeSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcHQxIGlzIG9wdDIgaXMgb3B0MyBpcyBvcHQ0KQorCisgICAgZGVmIHRlc3RfaGFzX29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi12IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItLXZlcmJvc2UiKSkKKworICAgIGRlZiBhc3NlcnRUcnVlcmVtb3ZlZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi12IikgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi0tdmVyYm9zZSIpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItbiIpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItLW5vaXN5IikgaXMgTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi12IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLS12ZXJib3NlIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLW4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItLW5vaXN5IikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi1xIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItLXNpbGVudCIpKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlX3Nob3J0X29wdChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlX29wdGlvbigiLW4iKQorICAgICAgICBzZWxmLmFzc2VydFRydWVyZW1vdmVkKCkKKworICAgIGRlZiB0ZXN0X3JlbW92ZV9sb25nX29wdChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlX29wdGlvbigiLS12ZXJib3NlIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlcmVtb3ZlZCgpCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfbm9uZXhpc3RlbnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYucGFyc2VyLnJlbW92ZV9vcHRpb24sICgnZm9vJywpLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUVycm9yLCAibm8gc3VjaCBvcHRpb24gJ2ZvbyciKQorCisgICAgZGVmIHRlc3RfcmVmbGVhayhzZWxmKToKKyAgICAgICAgIyBJZiBhbiBPcHRpb25QYXJzZXIgaXMgY2FycnlpbmcgYXJvdW5kIGEgcmVmZXJlbmNlIHRvIGEgbGFyZ2UKKyAgICAgICAgIyBvYmplY3QsIHZhcmlvdXMgY3ljbGVzIGNhbiBwcmV2ZW50IGl0IGZyb20gYmVpbmcgR0MnZCBpbgorICAgICAgICAjIGEgdGltZWx5IGZhc2hpb24uICBkZXN0cm95KCkgYnJlYWtzIHRoZSBjeWNsZXMgdG8gZW5zdXJlIHN0dWZmCisgICAgICAgICMgY2FuIGJlIGNsZWFuZWQgdXAuCisgICAgICAgIGJpZ190aGluZyA9IFs0Ml0KKyAgICAgICAgcmVmY291bnQgPSBzeXMuZ2V0cmVmY291bnQoYmlnX3RoaW5nKQorICAgICAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLWEiLCAiLS1hYWFyZ2doIikKKyAgICAgICAgcGFyc2VyLmJpZ190aGluZyA9IGJpZ190aGluZworCisgICAgICAgIHBhcnNlci5kZXN0cm95KCkKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwocmVmY291bnQsIHN5cy5nZXRyZWZjb3VudChiaWdfdGhpbmcpKQorICAgICAgICBkZWwgcGFyc2VyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmY291bnQsIHN5cy5nZXRyZWZjb3VudChiaWdfdGhpbmcpKQorCisKK2NsYXNzIFRlc3RPcHRpb25WYWx1ZXMoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgorICAgICAgICB2YWx1ZXMgPSBWYWx1ZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhcnModmFsdWVzKSwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh2YWx1ZXMsIHsiZm9vIjogImJhciJ9KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHZhbHVlcywgIiIpCisKKyAgICAgICAgZGljdCA9IHsiZm9vIjogImJhciIsICJiYXoiOiA0Mn0KKyAgICAgICAgdmFsdWVzID0gVmFsdWVzKGRlZmF1bHRzPWRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFycyh2YWx1ZXMpLCBkaWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh2YWx1ZXMsIHsiZm9vIjogImJhciJ9KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHZhbHVlcywge30pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodmFsdWVzLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh2YWx1ZXMsIFtdKQorCisKK2NsYXNzIFRlc3RUeXBlQWxpYXNlcyhCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IE9wdGlvblBhcnNlcigpCisKKyAgICBkZWYgdGVzdF9zdHJfYWxpYXNlc19zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1zIiwgdHlwZT0ic3RyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItcyIpLnR5cGUsICJzdHJpbmciKQorCisgICAgZGVmIHRlc3RfbmV3X3R5cGVfb2JqZWN0KHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItcyIsIHR5cGU9c3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi1zIikudHlwZSwgInN0cmluZyIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi14IiwgdHlwZT1pbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLXgiKS50eXBlLCAiaW50IikKKworICAgIGRlZiB0ZXN0X29sZF90eXBlX29iamVjdChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXMiLCB0eXBlPXR5cGVzLlN0cmluZ1R5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLXMiKS50eXBlLCAic3RyaW5nIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXgiLCB0eXBlPXR5cGVzLkludFR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLXgiKS50eXBlLCAiaW50IikKKworCisjIEN1c3RvbSB0eXBlIGZvciB0ZXN0aW5nIHByb2Nlc3Npbmcgb2YgZGVmYXVsdCB2YWx1ZXMuCitfdGltZV91bml0cyA9IHsgJ3MnIDogMSwgJ20nIDogNjAsICdoJyA6IDYwKjYwLCAnZCcgOiA2MCo2MCoyNCB9CisKK2RlZiBfY2hlY2tfZHVyYXRpb24ob3B0aW9uLCBvcHQsIHZhbHVlKToKKyAgICB0cnk6CisgICAgICAgIGlmIHZhbHVlWy0xXS5pc2RpZ2l0KCk6CisgICAgICAgICAgICByZXR1cm4gaW50KHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGludCh2YWx1ZVs6LTFdKSAqIF90aW1lX3VuaXRzW3ZhbHVlWy0xXV0KKyAgICBleGNlcHQgKFZhbHVlRXJyb3IsIEluZGV4RXJyb3IpOgorICAgICAgICByYWlzZSBPcHRpb25WYWx1ZUVycm9yKAorICAgICAgICAgICAgJ29wdGlvbiAlczogaW52YWxpZCBkdXJhdGlvbjogJXInICUgKG9wdCwgdmFsdWUpKQorCitjbGFzcyBEdXJhdGlvbk9wdGlvbihPcHRpb24pOgorICAgIFRZUEVTID0gT3B0aW9uLlRZUEVTICsgKCdkdXJhdGlvbicsKQorICAgIFRZUEVfQ0hFQ0tFUiA9IGNvcHkuY29weShPcHRpb24uVFlQRV9DSEVDS0VSKQorICAgIFRZUEVfQ0hFQ0tFUlsnZHVyYXRpb24nXSA9IF9jaGVja19kdXJhdGlvbgorCitjbGFzcyBUZXN0RGVmYXVsdFZhbHVlcyhCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi12IiwgIi0tdmVyYm9zZSIsIGRlZmF1bHQ9VHJ1ZSkKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXEiLCAiLS1xdWlldCIsIGRlc3Q9J3ZlcmJvc2UnKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItbiIsIHR5cGU9ImludCIsIGRlZmF1bHQ9MzcpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1tIiwgdHlwZT0iaW50IikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXMiLCBkZWZhdWx0PSJmb28iKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItdCIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi11IiwgZGVmYXVsdD1Ob25lKQorICAgICAgICBzZWxmLmV4cGVjdGVkID0geyAndmVyYm9zZSc6IFRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICduJzogMzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdtJzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3MnOiAiZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3QnOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAndSc6IE5vbmUgfQorCisgICAgZGVmIHRlc3RfYmFzaWNfZGVmYXVsdHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuZ2V0X2RlZmF1bHRfdmFsdWVzKCksIHNlbGYuZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9taXhlZF9kZWZhdWx0c19wb3N0KHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5zZXRfZGVmYXVsdHMobj00MiwgbT0tMTAwKQorICAgICAgICBzZWxmLmV4cGVjdGVkLnVwZGF0ZSh7J24nOiA0MiwgJ20nOiAtMTAwfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5nZXRfZGVmYXVsdF92YWx1ZXMoKSwgc2VsZi5leHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X21peGVkX2RlZmF1bHRzX3ByZShzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuc2V0X2RlZmF1bHRzKHg9ImJhcmYiLCB5PSJibGFoIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXgiLCBkZWZhdWx0PSJmcm9iIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXkiKQorCisgICAgICAgIHNlbGYuZXhwZWN0ZWQudXBkYXRlKHsneCc6ICJmcm9iIiwgJ3knOiAiYmxhaCJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmdldF9kZWZhdWx0X3ZhbHVlcygpLCBzZWxmLmV4cGVjdGVkKQorCisgICAgICAgIHNlbGYucGFyc2VyLnJlbW92ZV9vcHRpb24oIi15IikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXkiLCBkZWZhdWx0PU5vbmUpCisgICAgICAgIHNlbGYuZXhwZWN0ZWQudXBkYXRlKHsneSc6IE5vbmV9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmdldF9kZWZhdWx0X3ZhbHVlcygpLCBzZWxmLmV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfcHJvY2Vzc19kZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5vcHRpb25fY2xhc3MgPSBEdXJhdGlvbk9wdGlvbgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItZCIsIHR5cGU9ImR1cmF0aW9uIiwgZGVmYXVsdD0zMDApCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1lIiwgdHlwZT0iZHVyYXRpb24iLCBkZWZhdWx0PSI2bSIpCisgICAgICAgIHNlbGYucGFyc2VyLnNldF9kZWZhdWx0cyhuPSI0MiIpCisgICAgICAgIHNlbGYuZXhwZWN0ZWQudXBkYXRlKHsnZCc6IDMwMCwgJ2UnOiAzNjAsICduJzogNDJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmdldF9kZWZhdWx0X3ZhbHVlcygpLCBzZWxmLmV4cGVjdGVkKQorCisgICAgICAgIHNlbGYucGFyc2VyLnNldF9wcm9jZXNzX2RlZmF1bHRfdmFsdWVzKEZhbHNlKQorICAgICAgICBzZWxmLmV4cGVjdGVkLnVwZGF0ZSh7J2QnOiAzMDAsICdlJzogIjZtIiwgJ24nOiAiNDIifSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5nZXRfZGVmYXVsdF92YWx1ZXMoKSwgc2VsZi5leHBlY3RlZCkKKworCitjbGFzcyBUZXN0UHJvZ05hbWUoQmFzZVRlc3QpOgorICAgICIiIgorICAgIFRlc3QgdGhhdCAlcHJvZyBleHBhbmRzIHRvIHRoZSByaWdodCB0aGluZyBpbiB1c2FnZSwgdmVyc2lvbiwKKyAgICBhbmQgaGVscCBzdHJpbmdzLgorICAgICIiIgorCisgICAgZGVmIGFzc2VydFVzYWdlKHNlbGYsIHBhcnNlciwgZXhwZWN0ZWRfdXNhZ2UpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5nZXRfdXNhZ2UoKSwgZXhwZWN0ZWRfdXNhZ2UpCisKKyAgICBkZWYgYXNzZXJ0VmVyc2lvbihzZWxmLCBwYXJzZXIsIGV4cGVjdGVkX3ZlcnNpb24pOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5nZXRfdmVyc2lvbigpLCBleHBlY3RlZF92ZXJzaW9uKQorCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3Byb2duYW1lKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHByb2dyYW0gbmFtZSB0YWtlbiBmcm9tIHN5cy5hcmd2WzBdIGJ5IGRlZmF1bHQuCisgICAgICAgIHNhdmVfYXJndiA9IHN5cy5hcmd2WzpdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5hcmd2WzBdID0gb3MucGF0aC5qb2luKCJmb28iLCAiYmFyIiwgImJhei5weSIpCisgICAgICAgICAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIoIiVwcm9nIC4uLiIsIHZlcnNpb249IiVwcm9nIDEuMiIpCisgICAgICAgICAgICBleHBlY3RlZF91c2FnZSA9ICJVc2FnZTogYmF6LnB5IC4uLlxuIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRVc2FnZShwYXJzZXIsIGV4cGVjdGVkX3VzYWdlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRWZXJzaW9uKHBhcnNlciwgImJhei5weSAxLjIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRIZWxwKHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF91c2FnZSArICJcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPcHRpb25zOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIC0tdmVyc2lvbiAgIHNob3cgcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdFxuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5hcmd2WzpdID0gc2F2ZV9hcmd2CisKKyAgICBkZWYgdGVzdF9jdXN0b21fcHJvZ25hbWUoc2VsZik6CisgICAgICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcihwcm9nPSJ0aGluZ3kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0iJXByb2cgMC4xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlPSIlcHJvZyBhcmcgYXJnIikKKyAgICAgICAgcGFyc2VyLnJlbW92ZV9vcHRpb24oIi1oIikKKyAgICAgICAgcGFyc2VyLnJlbW92ZV9vcHRpb24oIi0tdmVyc2lvbiIpCisgICAgICAgIGV4cGVjdGVkX3VzYWdlID0gIlVzYWdlOiB0aGluZ3kgYXJnIGFyZ1xuIgorICAgICAgICBzZWxmLmFzc2VydFVzYWdlKHBhcnNlciwgZXhwZWN0ZWRfdXNhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VmVyc2lvbihwYXJzZXIsICJ0aGluZ3kgMC4xIikKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwKHBhcnNlciwgZXhwZWN0ZWRfdXNhZ2UgKyAiXG4iKQorCisKK2NsYXNzIFRlc3RFeHBhbmREZWZhdWx0cyhCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IE9wdGlvblBhcnNlcihwcm9nPSJ0ZXN0IikKKyAgICAgICAgc2VsZi5oZWxwX3ByZWZpeCA9ICIiIlwKK1VzYWdlOiB0ZXN0IFtvcHRpb25zXQorCitPcHRpb25zOgorICAtaCwgLS1oZWxwICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorIiIiCisgICAgICAgIHNlbGYuZmlsZV9oZWxwID0gInJlYWQgZnJvbSBGSUxFIFtkZWZhdWx0OiAlZGVmYXVsdF0iCisgICAgICAgIHNlbGYuZXhwZWN0ZWRfaGVscF9maWxlID0gc2VsZi5oZWxwX3ByZWZpeCArIFwKKyAgICAgICAgICAgICIgIC1mIEZJTEUsIC0tZmlsZT1GSUxFICByZWFkIGZyb20gRklMRSBbZGVmYXVsdDogZm9vLnR4dF1cbiIKKyAgICAgICAgc2VsZi5leHBlY3RlZF9oZWxwX25vbmUgPSBzZWxmLmhlbHBfcHJlZml4ICsgXAorICAgICAgICAgICAgIiAgLWYgRklMRSwgLS1maWxlPUZJTEUgIHJlYWQgZnJvbSBGSUxFIFtkZWZhdWx0OiBub25lXVxuIgorCisgICAgZGVmIHRlc3Rfb3B0aW9uX2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZm9vLnR4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD1zZWxmLmZpbGVfaGVscCkKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwKHNlbGYucGFyc2VyLCBzZWxmLmV4cGVjdGVkX2hlbHBfZmlsZSkKKworICAgIGRlZiB0ZXN0X3BhcnNlcl9kZWZhdWx0XzEoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD1zZWxmLmZpbGVfaGVscCkKKyAgICAgICAgc2VsZi5wYXJzZXIuc2V0X2RlZmF1bHQoJ2ZpbGUnLCAiZm9vLnR4dCIpCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscChzZWxmLnBhcnNlciwgc2VsZi5leHBlY3RlZF9oZWxwX2ZpbGUpCisKKyAgICBkZWYgdGVzdF9wYXJzZXJfZGVmYXVsdF8yKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9c2VsZi5maWxlX2hlbHApCisgICAgICAgIHNlbGYucGFyc2VyLnNldF9kZWZhdWx0cyhmaWxlPSJmb28udHh0IikKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwKHNlbGYucGFyc2VyLCBzZWxmLmV4cGVjdGVkX2hlbHBfZmlsZSkKKworICAgIGRlZiB0ZXN0X25vX2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD1zZWxmLmZpbGVfaGVscCkKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwKHNlbGYucGFyc2VyLCBzZWxmLmV4cGVjdGVkX2hlbHBfbm9uZSkKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfbm9uZV8xKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPXNlbGYuZmlsZV9oZWxwKQorICAgICAgICBzZWxmLmFzc2VydEhlbHAoc2VsZi5wYXJzZXIsIHNlbGYuZXhwZWN0ZWRfaGVscF9ub25lKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9ub25lXzIoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD1zZWxmLmZpbGVfaGVscCkKKyAgICAgICAgc2VsZi5wYXJzZXIuc2V0X2RlZmF1bHRzKGZpbGU9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwKHNlbGYucGFyc2VyLCBzZWxmLmV4cGVjdGVkX2hlbHBfbm9uZSkKKworICAgIGRlZiB0ZXN0X2Zsb2F0X2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICAgICAiLXAiLCAiLS1wcm9iIiwKKyAgICAgICAgICAgIGhlbHA9ImJsb3cgdXAgd2l0aCBwcm9iYWJpbGl0eSBQUk9CIFtkZWZhdWx0OiAlZGVmYXVsdF0iKQorICAgICAgICBzZWxmLnBhcnNlci5zZXRfZGVmYXVsdHMocHJvYj0wLjQzKQorICAgICAgICBleHBlY3RlZF9oZWxwID0gc2VsZi5oZWxwX3ByZWZpeCArIFwKKyAgICAgICAgICAgICIgIC1wIFBST0IsIC0tcHJvYj1QUk9CICBibG93IHVwIHdpdGggcHJvYmFiaWxpdHkgUFJPQiBbZGVmYXVsdDogMC40M11cbiIKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwKHNlbGYucGFyc2VyLCBleHBlY3RlZF9oZWxwKQorCisgICAgZGVmIHRlc3RfYWx0X2V4cGFuZChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmb28udHh0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJyZWFkIGZyb20gRklMRSBbZGVmYXVsdDogKkRFRkFVTFQqXSIpCisgICAgICAgIHNlbGYucGFyc2VyLmZvcm1hdHRlci5kZWZhdWx0X3RhZyA9ICIqREVGQVVMVCoiCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscChzZWxmLnBhcnNlciwgc2VsZi5leHBlY3RlZF9oZWxwX2ZpbGUpCisKKyAgICBkZWYgdGVzdF9ub19leHBhbmQoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZm9vLnR4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0icmVhZCBmcm9tICVkZWZhdWx0IGZpbGUiKQorICAgICAgICBzZWxmLnBhcnNlci5mb3JtYXR0ZXIuZGVmYXVsdF90YWcgPSBOb25lCisgICAgICAgIGV4cGVjdGVkX2hlbHAgPSBzZWxmLmhlbHBfcHJlZml4ICsgXAorICAgICAgICAgICAgIiAgLWYgRklMRSwgLS1maWxlPUZJTEUgIHJlYWQgZnJvbSAlZGVmYXVsdCBmaWxlXG4iCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscChzZWxmLnBhcnNlciwgZXhwZWN0ZWRfaGVscCkKKworCisjIC0tIFRlc3QgcGFyc2VyLnBhcnNlX2FyZ3MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdFN0YW5kYXJkKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbbWFrZV9vcHRpb24oIi1hIiwgdHlwZT0ic3RyaW5nIiksCisgICAgICAgICAgICAgICAgICAgbWFrZV9vcHRpb24oIi1iIiwgIi0tYm9vIiwgdHlwZT0iaW50IiwgZGVzdD0nYm9vJyksCisgICAgICAgICAgICAgICAgICAgbWFrZV9vcHRpb24oIi0tZm9vIiwgYWN0aW9uPSJhcHBlbmQiKV0KKworICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2xpc3Q9b3B0aW9ucykKKworICAgIGRlZiB0ZXN0X3JlcXVpcmVkX3ZhbHVlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlRmFpbChbIi1hIl0sICItYSBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQiKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9pbnRlZ2VyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlRmFpbChbIi1iIiwgIjV4Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gLWI6IGludmFsaWQgaW50ZWdlciB2YWx1ZTogJzV4JyIpCisKKyAgICBkZWYgdGVzdF9ub19zdWNoX29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItLWJvbzEzIl0sICJubyBzdWNoIG9wdGlvbjogLS1ib28xMyIpCisKKyAgICBkZWYgdGVzdF9sb25nX2ludmFsaWRfaW50ZWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItLWJvbz14NSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIC0tYm9vOiBpbnZhbGlkIGludGVnZXIgdmFsdWU6ICd4NSciKQorCisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbXSwgeydhJzogTm9uZSwgJ2Jvbyc6IE5vbmUsICdmb28nOiBOb25lfSwgW10pCisKKyAgICBkZWYgdGVzdF9zaG9ydG9wdF9lbXB0eV9sb25nb3B0X2FwcGVuZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWEiLCAiIiwgIi0tZm9vPWJsYWgiLCAiLS1mb289Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAiIiwgJ2Jvbyc6IE5vbmUsICdmb28nOiBbImJsYWgiLCAiIl19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9sb25nX29wdGlvbl9hcHBlbmQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tZm9vIiwgImJhciIsICItLWZvbyIsICIiLCAiLS1mb289eCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9vJzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vJzogWyJiYXIiLCAiIiwgIngiXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X29wdGlvbl9hcmd1bWVudF9qb2luZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1hYmMiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6ICJiYyIsICdib28nOiBOb25lLCAnZm9vJzogTm9uZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X29wdGlvbl9hcmd1bWVudF9zcGxpdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWEiLCAiMzQiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6ICIzNCIsICdib28nOiBOb25lLCAnZm9vJzogTm9uZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X29wdGlvbl9hcmd1bWVudF9qb2luZWRfaW50ZWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWIzNCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogTm9uZSwgJ2Jvbyc6IDM0LCAnZm9vJzogTm9uZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X29wdGlvbl9hcmd1bWVudF9zcGxpdF9uZWdhdGl2ZV9pbnRlZ2VyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItYiIsICItNSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogTm9uZSwgJ2Jvbyc6IC01LCAnZm9vJzogTm9uZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X2xvbmdfb3B0aW9uX2FyZ3VtZW50X2pvaW5lZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLS1ib289MTMiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6IE5vbmUsICdib28nOiAxMywgJ2Zvbyc6IE5vbmV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9sb25nX29wdGlvbl9hcmd1bWVudF9zcGxpdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLS1ib28iLCAiMTExIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiBOb25lLCAnYm9vJzogMTExLCAnZm9vJzogTm9uZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X2xvbmdfb3B0aW9uX3Nob3J0X29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLS1mb289YmFyIiwgIi1heHl6Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAneHl6JywgJ2Jvbyc6IE5vbmUsICdmb28nOiBbImJhciJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisgICAgZGVmIHRlc3RfYWJicmV2X2xvbmdfb3B0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItLWY9YmFyIiwgIi1heHl6Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAneHl6JywgJ2Jvbyc6IE5vbmUsICdmb28nOiBbImJhciJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdHMoc2VsZik6CisgICAgICAgIChvcHRpb25zLCBhcmdzKSA9IHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoW10pCisgICAgICAgIGRlZmF1bHRzID0gc2VsZi5wYXJzZXIuZ2V0X2RlZmF1bHRfdmFsdWVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXJzKGRlZmF1bHRzKSwgdmFycyhvcHRpb25zKSkKKworICAgIGRlZiB0ZXN0X2FtYmlndW91c19vcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi0tZm96IiwgYWN0aW9uPSJzdG9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic3RyaW5nIiwgZGVzdD0iZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItLWY9YmFyIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbWJpZ3VvdXMgb3B0aW9uOiAtLWYgKC0tZm9vLCAtLWZvej8pIikKKworCisgICAgZGVmIHRlc3Rfc2hvcnRfYW5kX2xvbmdfb3B0aW9uX3NwbGl0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItYSIsICJ4eXoiLCAiLS1mb28iLCAiYmFyIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAneHl6JywgJ2Jvbyc6IE5vbmUsICdmb28nOiBbImJhciJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKSwKKworICAgIGRlZiB0ZXN0X3Nob3J0X29wdGlvbl9zcGxpdF9sb25nX29wdGlvbl9hcHBlbmQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tZm9vPWJhciIsICItYiIsICIxMjMiLCAiLS1mb28iLCAiYmF6Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiBOb25lLCAnYm9vJzogMTIzLCAnZm9vJzogWyJiYXIiLCAiYmF6Il19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9zaG9ydF9vcHRpb25fc3BsaXRfb25lX3Bvc2l0aW9uYWxfYXJnKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItYSIsICJmb28iLCAiYmFyIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAiZm9vIiwgJ2Jvbyc6IE5vbmUsICdmb28nOiBOb25lfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiYmFyIl0pLAorCisgICAgZGVmIHRlc3Rfc2hvcnRfb3B0aW9uX2NvbnN1bWVzX3NlcGFyYXRvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWEiLCAiLS0iLCAiZm9vIiwgImJhciJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogIi0tIiwgJ2Jvbyc6IE5vbmUsICdmb28nOiBOb25lfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZm9vIiwgImJhciJdKSwKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWEiLCAiLS0iLCAiLS1mb28iLCAiYmFyIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAiLS0iLCAnYm9vJzogTm9uZSwgJ2Zvbyc6IFsiYmFyIl19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pLAorCisgICAgZGVmIHRlc3Rfc2hvcnRfb3B0aW9uX2pvaW5lZF9hbmRfc2VwYXJhdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItYWIiLCAiLS0iLCAiLS1mb28iLCAiYmFyIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAiYiIsICdib28nOiBOb25lLCAnZm9vJzogTm9uZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbIi0tZm9vIiwgImJhciJdKSwKKworICAgIGRlZiB0ZXN0X2h5cGhlbl9iZWNvbWVzX3Bvc2l0aW9uYWxfYXJnKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItYWIiLCAiLSIsICItLWZvbyIsICJiYXIiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6ICJiIiwgJ2Jvbyc6IE5vbmUsICdmb28nOiBbImJhciJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiLSJdKQorCisgICAgZGVmIHRlc3Rfbm9fYXBwZW5kX3ZlcnN1c19hcHBlbmQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1iMyIsICItYiIsICI1IiwgIi0tZm9vPWJhciIsICItLWZvbyIsICJiYXoiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6IE5vbmUsICdib28nOiA1LCAnZm9vJzogWyJiYXIiLCAiYmF6Il19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9vcHRpb25fY29uc3VtZXNfb3B0aW9ubGlrZV9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1hIiwgIi1iMyJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogIi1iMyIsICdib28nOiBOb25lLCAnZm9vJzogTm9uZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X2NvbWJpbmVkX3NpbmdsZV9pbnZhbGlkX29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXQiLCBhY3Rpb249InN0b3JlX3RydWUiKQorICAgICAgICBzZWxmLmFzc2VydFBhcnNlRmFpbChbIi10ZXN0Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyBzdWNoIG9wdGlvbjogLWUiKQorCisgICAgZGVmIHRlc3RfYWRkX29wdGlvbl9hY2NlcHRzX3VuaWNvZGUoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24odSItdSIsIHUiLS11bmljb2RlIiwgYWN0aW9uPSJzdG9yZV90cnVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXUiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6IE5vbmUsICdib28nOiBOb25lLCAnZm9vJzogTm9uZSwgJ3VuaWNvZGUnOiBUcnVlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisKK2NsYXNzIFRlc3RCb29sKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbbWFrZV9vcHRpb24oIi12IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS12ZXJib3NlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9JycpLAorICAgICAgICAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItcSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tcXVpZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiKV0KKyAgICAgICAgc2VsZi5wYXJzZXIgPSBPcHRpb25QYXJzZXIob3B0aW9uX2xpc3QgPSBvcHRpb25zKQorCisgICAgZGVmIHRlc3RfYm9vbF9kZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3ZlcmJvc2UnOiAnJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X2Jvb2xfZmFsc2Uoc2VsZik6CisgICAgICAgIChvcHRpb25zLCBhcmdzKSA9IHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1xIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3ZlcmJvc2UnOiAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3B0aW9ucy52ZXJib3NlIGlzIEZhbHNlKQorCisgICAgZGVmIHRlc3RfYm9vbF90cnVlKHNlbGYpOgorICAgICAgICAob3B0aW9ucywgYXJncykgPSBzZWxmLmFzc2VydFBhcnNlT0soWyItdiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyd2ZXJib3NlJzogMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wdGlvbnMudmVyYm9zZSBpcyBUcnVlKQorCisgICAgZGVmIHRlc3RfYm9vbF9mbGlja2VyX29uX2FuZF9vZmYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1xdnEiLCAiLXEiLCAiLXYiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsndmVyYm9zZSc6IDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKK2NsYXNzIFRlc3RDaG9pY2UoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1jIiwgYWN0aW9uPSJzdG9yZSIsIHR5cGU9ImNob2ljZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0iY2hvaWNlIiwgY2hvaWNlcz1bIm9uZSIsICJ0d28iLCAidGhyZWUiXSkKKworICAgIGRlZiB0ZXN0X3ZhbGlkX2Nob2ljZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWMiLCAib25lIiwgInh5eiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydjaG9pY2UnOiAnb25lJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbInh5eiJdKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9jaG9pY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLWMiLCAiZm91ciIsICJhYmMiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiAtYzogaW52YWxpZCBjaG9pY2U6ICdmb3VyJyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoY2hvb3NlIGZyb20gJ29uZScsICd0d28nLCAndGhyZWUnKSIpCisKKyAgICBkZWYgdGVzdF9hZGRfY2hvaWNlX29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLWQiLCAiLS1kZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9pY2VzPVsiZm91ciIsICJmaXZlIiwgInNpeCJdKQorICAgICAgICBvcHQgPSBzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LnR5cGUsICJjaG9pY2UiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdC5hY3Rpb24sICJzdG9yZSIpCisKK2NsYXNzIFRlc3RDb3VudChCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSkKKyAgICAgICAgc2VsZi52X29wdCA9IG1ha2Vfb3B0aW9uKCItdiIsIGFjdGlvbj0iY291bnQiLCBkZXN0PSJ2ZXJib3NlIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbihzZWxmLnZfb3B0KQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItLXZlcmJvc2UiLCB0eXBlPSJpbnQiLCBkZXN0PSJ2ZXJib3NlIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXEiLCAiLS1xdWlldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV9jb25zdCIsIGRlc3Q9InZlcmJvc2UiLCBjb25zdD0wKQorCisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbXSwgeyd2ZXJib3NlJzogTm9uZX0sIFtdKQorCisgICAgZGVmIHRlc3RfY291bnRfb25lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItdiJdLCB7J3ZlcmJvc2UnOiAxfSwgW10pCisKKyAgICBkZWYgdGVzdF9jb3VudF90aHJlZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXZ2diJdLCB7J3ZlcmJvc2UnOiAzfSwgW10pCisKKyAgICBkZWYgdGVzdF9jb3VudF90aHJlZV9hcGFydChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXYiLCAiLXYiLCAiLXYiXSwgeyd2ZXJib3NlJzogM30sIFtdKQorCisgICAgZGVmIHRlc3RfY291bnRfb3ZlcnJpZGVfYW1vdW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItdnZ2IiwgIi0tdmVyYm9zZT0yIl0sIHsndmVyYm9zZSc6IDJ9LCBbXSkKKworICAgIGRlZiB0ZXN0X2NvdW50X292ZXJyaWRlX3F1aWV0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItdnZ2IiwgIi0tdmVyYm9zZT0yIiwgIi1xIl0sIHsndmVyYm9zZSc6IDB9LCBbXSkKKworICAgIGRlZiB0ZXN0X2NvdW50X292ZXJyaWRpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi12dnYiLCAiLS12ZXJib3NlPTIiLCAiLXEiLCAiLXYiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsndmVyYm9zZSc6IDF9LCBbXSkKKworICAgIGRlZiB0ZXN0X2NvdW50X2ludGVyc3BlcnNlZF9hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItLXF1aWV0IiwgIjMiLCAiLXYiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsndmVyYm9zZSc6IDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyIzIl0pCisKKyAgICBkZWYgdGVzdF9jb3VudF9ub19pbnRlcnNwZXJzZWRfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuZGlzYWJsZV9pbnRlcnNwZXJzZWRfYXJncygpCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tcXVpZXQiLCAiMyIsICItdiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyd2ZXJib3NlJzogMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbIjMiLCAiLXYiXSkKKworICAgIGRlZiB0ZXN0X2NvdW50X25vX3N1Y2hfb3B0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlRmFpbChbIi1xMyIsICItdiJdLCAibm8gc3VjaCBvcHRpb246IC0zIikKKworICAgIGRlZiB0ZXN0X2NvdW50X29wdGlvbl9ub192YWx1ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItLXF1aWV0PTMiLCAiLXYiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tcXVpZXQgb3B0aW9uIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIpCisKKyAgICBkZWYgdGVzdF9jb3VudF93aXRoX2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLnNldF9kZWZhdWx0KCd2ZXJib3NlJywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFtdLCB7J3ZlcmJvc2UnOjB9LCBbXSkKKworICAgIGRlZiB0ZXN0X2NvdW50X292ZXJyaWRpbmdfZGVmYXVsdChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuc2V0X2RlZmF1bHQoJ3ZlcmJvc2UnLCAwKQorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItdnZ2IiwgIi0tdmVyYm9zZT0yIiwgIi1xIiwgIi12Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3ZlcmJvc2UnOiAxfSwgW10pCisKK2NsYXNzIFRlc3RNdWx0aXBsZUFyZ3MoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1wIiwgIi0tcG9pbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmUiLCBuYXJncz0zLCB0eXBlPSJmbG9hdCIsIGRlc3Q9InBvaW50IikKKworICAgIGRlZiB0ZXN0X25hcmdzX3dpdGhfcG9zaXRpb25hbF9hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyJmb28iLCAiLXAiLCAiMSIsICIyLjUiLCAiLTQuMyIsICJ4eXoiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsncG9pbnQnOiAoMS4wLCAyLjUsIC00LjMpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiZm9vIiwgInh5eiJdKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfbG9uZ19vcHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tcG9pbnQiLCAiLTEiLCAiMi41IiwgIi0wIiwgInh5eiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydwb2ludCc6ICgtMS4wLCAyLjUsIC0wLjApfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsieHl6Il0pCisKKyAgICBkZWYgdGVzdF9uYXJnc19pbnZhbGlkX2Zsb2F0X3ZhbHVlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlRmFpbChbIi1wIiwgIjEuMCIsICIyeCIsICIzLjUiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiAtcDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBmbG9hdGluZy1wb2ludCB2YWx1ZTogJzJ4JyIpCisKKyAgICBkZWYgdGVzdF9uYXJnc19yZXF1aXJlZF92YWx1ZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLS1wb2ludCIsICIxLjAiLCAiMy41Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLXBvaW50IG9wdGlvbiByZXF1aXJlcyAzIGFyZ3VtZW50cyIpCisKK2NsYXNzIFRlc3RNdWx0aXBsZUFyZ3NBcHBlbmQoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1wIiwgIi0tcG9pbnQiLCBhY3Rpb249InN0b3JlIiwgbmFyZ3M9MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJmbG9hdCIsIGRlc3Q9InBvaW50IikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1mb28iLCBhY3Rpb249ImFwcGVuZCIsIG5hcmdzPTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iaW50IiwgZGVzdD0iZm9vIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXoiLCAiLS16ZXJvIiwgYWN0aW9uPSJhcHBlbmRfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9ImZvbyIsIGNvbnN0PSgwLCAwKSkKKworICAgIGRlZiB0ZXN0X25hcmdzX2FwcGVuZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWYiLCAiNCIsICItMyIsICJibGFoIiwgIi0tZm9vIiwgIjEiLCAiNjY2Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3BvaW50JzogTm9uZSwgJ2Zvbyc6IFsoNCwgLTMpLCAoMSwgNjY2KV19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJibGFoIl0pCisKKyAgICBkZWYgdGVzdF9uYXJnc19hcHBlbmRfcmVxdWlyZWRfdmFsdWVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlRmFpbChbIi1mNCwzIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItZiBvcHRpb24gcmVxdWlyZXMgMiBhcmd1bWVudHMiKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfYXBwZW5kX3NpbXBsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLS1mb289MyIsICI0Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3BvaW50JzogTm9uZSwgJ2Zvbyc6WygzLCA0KV19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9uYXJnc19hcHBlbmRfY29uc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0temVybyIsICItLWZvbyIsICIzIiwgIjQiLCAiLXoiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsncG9pbnQnOiBOb25lLCAnZm9vJzpbKDAsIDApLCAoMywgNCksICgwLCAwKV19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKK2NsYXNzIFRlc3RWZXJzaW9uKEJhc2VUZXN0KToKKyAgICBkZWYgdGVzdF92ZXJzaW9uKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0iJXByb2cgMC4xIikKKyAgICAgICAgc2F2ZV9hcmd2ID0gc3lzLmFyZ3ZbOl0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLmFyZ3ZbMF0gPSBvcy5wYXRoLmpvaW4ob3MuY3VyZGlyLCAiZm9vIiwgImJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydE91dHB1dChbIi0tdmVyc2lvbiJdLCAiYmFyIDAuMVxuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5hcmd2WzpdID0gc2F2ZV9hcmd2CisKKyAgICBkZWYgdGVzdF9ub192ZXJzaW9uKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSkKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItLXZlcnNpb24iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIHN1Y2ggb3B0aW9uOiAtLXZlcnNpb24iKQorCisjIC0tIFRlc3QgY29uZmxpY3RpbmcgZGVmYXVsdCB2YWx1ZXMgYW5kIHBhcnNlci5wYXJzZV9hcmdzKCkgLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdENvbmZsaWN0aW5nRGVmYXVsdHMoQmFzZVRlc3QpOgorICAgICIiIkNvbmZsaWN0aW5nIGRlZmF1bHQgdmFsdWVzOiB0aGUgbGFzdCBvbmUgc2hvdWxkIHdpbi4iIiIKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyID0gT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PVsKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItdiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9InZlcmJvc2UiLCBkZWZhdWx0PTEpXSkKKworICAgIGRlZiB0ZXN0X2NvbmZsaWN0X2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1xIiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9InZlcmJvc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFtdLCB7J3ZlcmJvc2UnOiAwfSwgW10pCisKKyAgICBkZWYgdGVzdF9jb25mbGljdF9kZWZhdWx0X25vbmUoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1xIiwgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9InZlcmJvc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFtdLCB7J3ZlcmJvc2UnOiBOb25lfSwgW10pCisKK2NsYXNzIFRlc3RPcHRpb25Hcm91cChCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSkKKworICAgIGRlZiB0ZXN0X29wdGlvbl9ncm91cF9jcmVhdGVfaW5zdGFuY2Uoc2VsZik6CisgICAgICAgIGdyb3VwID0gT3B0aW9uR3JvdXAoc2VsZi5wYXJzZXIsICJTcGFtIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbl9ncm91cChncm91cCkKKyAgICAgICAgZ3JvdXAuYWRkX29wdGlvbigiLS1zcGFtIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJzcGFtIHNwYW0gc3BhbSBzcGFtIikKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLS1zcGFtIl0sIHsnc3BhbSc6IDF9LCBbXSkKKworICAgIGRlZiB0ZXN0X2FkZF9ncm91cF9ub19ncm91cChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlRXJyb3Ioc2VsZi5wYXJzZXIuYWRkX29wdGlvbl9ncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbiBPcHRpb25Hcm91cCBpbnN0YW5jZTogTm9uZSIsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9hZGRfZ3JvdXBfaW52YWxpZF9hcmd1bWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKHNlbGYucGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIGFyZ3VtZW50cyIsIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9hZGRfZ3JvdXBfd3JvbmdfcGFyc2VyKHNlbGYpOgorICAgICAgICBncm91cCA9IE9wdGlvbkdyb3VwKHNlbGYucGFyc2VyLCAiU3BhbSIpCisgICAgICAgIGdyb3VwLnBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYucGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAsIChncm91cCwpLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUVycm9yLCAiaW52YWxpZCBPcHRpb25Hcm91cCAod3JvbmcgcGFyc2VyKSIpCisKKyAgICBkZWYgdGVzdF9ncm91cF9tYW5pcHVsYXRlKHNlbGYpOgorICAgICAgICBncm91cCA9IHNlbGYucGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoIkdyb3VwIDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249IlNvbWUgbW9yZSBvcHRpb25zIikKKyAgICAgICAgZ3JvdXAuc2V0X3RpdGxlKCJCYWNvbiIpCisgICAgICAgIGdyb3VwLmFkZF9vcHRpb24oIi0tYmFjb24iLCB0eXBlPSJpbnQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuZ2V0X29wdGlvbl9ncm91cCgiLS1iYWNvbiIpLCBncm91cCkKKworIyAtLSBUZXN0IGV4dGVuZGluZyBhbmQgcGFyc2VyLnBhcnNlX2FyZ3MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RFeHRlbmRBZGRUeXBlcyhCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2NsYXNzPXNlbGYuTXlPcHRpb24pCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1hIiwgTm9uZSwgdHlwZT0ic3RyaW5nIiwgZGVzdD0iYSIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZmlsZSIsIHR5cGU9ImZpbGUiLCBkZXN0PSJmaWxlIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKToKKyAgICAgICAgICAgIG9zLnJtZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTik6CisgICAgICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGNsYXNzIE15T3B0aW9uIChPcHRpb24pOgorICAgICAgICBkZWYgY2hlY2tfZmlsZShvcHRpb24sIG9wdCwgdmFsdWUpOgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHZhbHVlKToKKyAgICAgICAgICAgICAgICByYWlzZSBPcHRpb25WYWx1ZUVycm9yKCIlczogZmlsZSBkb2VzIG5vdCBleGlzdCIgJSB2YWx1ZSkKKyAgICAgICAgICAgIGVsaWYgbm90IG9zLnBhdGguaXNmaWxlKHZhbHVlKToKKyAgICAgICAgICAgICAgICByYWlzZSBPcHRpb25WYWx1ZUVycm9yKCIlczogbm90IGEgcmVndWxhciBmaWxlIiAlIHZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICAgICAgVFlQRVMgPSBPcHRpb24uVFlQRVMgKyAoImZpbGUiLCkKKyAgICAgICAgVFlQRV9DSEVDS0VSID0gY29weS5jb3B5KE9wdGlvbi5UWVBFX0NIRUNLRVIpCisgICAgICAgIFRZUEVfQ0hFQ0tFUlsiZmlsZSJdID0gY2hlY2tfZmlsZQorCisgICAgZGVmIHRlc3RfZmlsZXR5cGVfb2soc2VsZik6CisgICAgICAgIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgInciKS5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tZmlsZSIsIHRlc3Rfc3VwcG9ydC5URVNURk4sICItYWZvbyJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydmaWxlJzogdGVzdF9zdXBwb3J0LlRFU1RGTiwgJ2EnOiAnZm9vJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X2ZpbGV0eXBlX25vZXhpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLS1maWxlIiwgdGVzdF9zdXBwb3J0LlRFU1RGTiwgIi1hZm9vIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogZmlsZSBkb2VzIG5vdCBleGlzdCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfZmlsZXR5cGVfbm90ZmlsZShzZWxmKToKKyAgICAgICAgb3MubWtkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItLWZpbGUiLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCAiLWFmb28iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBub3QgYSByZWd1bGFyIGZpbGUiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTikKKworCitjbGFzcyBUZXN0RXh0ZW5kQWRkQWN0aW9ucyhCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBvcHRpb25zID0gW3NlbGYuTXlPcHRpb24oIi1hIiwgIi0tYXBwbGUiLCBhY3Rpb249ImV4dGVuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzdHJpbmciLCBkZXN0PSJhcHBsZSIpXQorICAgICAgICBzZWxmLnBhcnNlciA9IE9wdGlvblBhcnNlcihvcHRpb25fbGlzdD1vcHRpb25zKQorCisgICAgY2xhc3MgTXlPcHRpb24gKE9wdGlvbik6CisgICAgICAgIEFDVElPTlMgPSBPcHRpb24uQUNUSU9OUyArICgiZXh0ZW5kIiwpCisgICAgICAgIFNUT1JFX0FDVElPTlMgPSBPcHRpb24uU1RPUkVfQUNUSU9OUyArICgiZXh0ZW5kIiwpCisgICAgICAgIFRZUEVEX0FDVElPTlMgPSBPcHRpb24uVFlQRURfQUNUSU9OUyArICgiZXh0ZW5kIiwpCisKKyAgICAgICAgZGVmIHRha2VfYWN0aW9uKHNlbGYsIGFjdGlvbiwgZGVzdCwgb3B0LCB2YWx1ZSwgdmFsdWVzLCBwYXJzZXIpOgorICAgICAgICAgICAgaWYgYWN0aW9uID09ICJleHRlbmQiOgorICAgICAgICAgICAgICAgIGx2YWx1ZSA9IHZhbHVlLnNwbGl0KCIsIikKKyAgICAgICAgICAgICAgICB2YWx1ZXMuZW5zdXJlX3ZhbHVlKGRlc3QsIFtdKS5leHRlbmQobHZhbHVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBPcHRpb24udGFrZV9hY3Rpb24oc2VsZiwgYWN0aW9uLCBkZXN0LCBvcHQsIHBhcnNlciwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcykKKworICAgIGRlZiB0ZXN0X2V4dGVuZF9hZGRfYWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItYWZvbyxiYXIiLCAiLS1hcHBsZT1ibGFoIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2FwcGxlJzogWyJmb28iLCAiYmFyIiwgImJsYWgiXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X2V4dGVuZF9hZGRfYWN0aW9uX25vcm1hbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWEiLCAiZm9vIiwgIi1hYmFyIiwgIi0tYXBwbGU9eCx5Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2FwcGxlJzogWyJmb28iLCAiYmFyIiwgIngiLCAieSJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisjIC0tIFRlc3QgY2FsbGJhY2tzIGFuZCBwYXJzZXIucGFyc2VfYXJncygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdENhbGxiYWNrKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbbWFrZV9vcHRpb24oIi14IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0iY2FsbGJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPXNlbGYucHJvY2Vzc19vcHQpLAorICAgICAgICAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s9c2VsZi5wcm9jZXNzX29wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJzdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9ImZpbGVuYW1lIildCisgICAgICAgIHNlbGYucGFyc2VyID0gT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PW9wdGlvbnMpCisKKyAgICBkZWYgcHJvY2Vzc19vcHQoc2VsZiwgb3B0aW9uLCBvcHQsIHZhbHVlLCBwYXJzZXJfKToKKyAgICAgICAgaWYgb3B0ID09ICIteCI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdGlvbi5fc2hvcnRfb3B0cywgWyIteCJdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24uX2xvbmdfb3B0cywgW10pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocGFyc2VyXyBpcyBzZWxmLnBhcnNlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWx1ZSBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXJzKHBhcnNlcl8udmFsdWVzKSwgeydmaWxlbmFtZSc6IE5vbmV9KQorCisgICAgICAgICAgICBwYXJzZXJfLnZhbHVlcy54ID0gNDIKKyAgICAgICAgZWxpZiBvcHQgPT0gIi0tZmlsZSI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdGlvbi5fc2hvcnRfb3B0cywgWyItZiJdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24uX2xvbmdfb3B0cywgWyItLWZpbGUiXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXJzZXJfIGlzIHNlbGYucGFyc2VyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhcnMocGFyc2VyXy52YWx1ZXMpLCB7J2ZpbGVuYW1lJzogTm9uZSwgJ3gnOiA0Mn0pCisKKyAgICAgICAgICAgIHNldGF0dHIocGFyc2VyXy52YWx1ZXMsIG9wdGlvbi5kZXN0LCB2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVW5rbm93biBvcHRpb24gJXIgaW4gcHJvY2Vzc19vcHQuIiAlIG9wdCkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyIteCIsICItLWZpbGU9Zm9vIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2ZpbGVuYW1lJzogImZvbyIsICd4JzogNDJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19oZWxwKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdCB3YXMgcHJvbXB0ZWQgYnkgU0YgYnVnICM5NjA1MTUgLS0gdGhlIHBvaW50IGlzCisgICAgICAgICMgbm90IHRvIGluc3BlY3QgdGhlIGhlbHAgdGV4dCwganVzdCB0byBtYWtlIHN1cmUgdGhhdAorICAgICAgICAjIGZvcm1hdF9oZWxwKCkgZG9lc24ndCBjcmFzaC4KKyAgICAgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFKQorICAgICAgICBwYXJzZXIucmVtb3ZlX29wdGlvbigiLWgiKQorICAgICAgICBwYXJzZXIuYWRkX29wdGlvbigiLXQiLCAiLS10ZXN0IiwgYWN0aW9uPSJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPWxhbWJkYTogTm9uZSwgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iZm9vIikKKworICAgICAgICBleHBlY3RlZF9oZWxwID0gKCJPcHRpb25zOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgIC10IFRFU1QsIC0tdGVzdD1URVNUICBmb29cbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscChwYXJzZXIsIGV4cGVjdGVkX2hlbHApCisKKworY2xhc3MgVGVzdENhbGxiYWNrRXh0cmFBcmdzKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbbWFrZV9vcHRpb24oIi1wIiwgIi0tcG9pbnQiLCBhY3Rpb249ImNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz1zZWxmLnByb2Nlc3NfdHVwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tfYXJncz0oMywgaW50KSwgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJwb2ludHMiLCBkZWZhdWx0PVtdKV0KKyAgICAgICAgc2VsZi5wYXJzZXIgPSBPcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9ucykKKworICAgIGRlZiBwcm9jZXNzX3R1cGxlKHNlbGYsIG9wdGlvbiwgb3B0LCB2YWx1ZSwgcGFyc2VyXywgbGVuLCB0eXBlKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4sIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlIGlzIGludCkKKworICAgICAgICBpZiBvcHQgPT0gIi1wIjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsICIxLDIsMyIpCisgICAgICAgIGVsaWYgb3B0ID09ICItLXBvaW50IjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsICI0LDUsNiIpCisKKyAgICAgICAgdmFsdWUgPSB0dXBsZShtYXAodHlwZSwgdmFsdWUuc3BsaXQoIiwiKSkpCisgICAgICAgIGdldGF0dHIocGFyc2VyXy52YWx1ZXMsIG9wdGlvbi5kZXN0KS5hcHBlbmQodmFsdWUpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19leHRyYV9hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItcDEsMiwzIiwgIi0tcG9pbnQiLCAiNCw1LDYiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsncG9pbnRzJzogWygxLDIsMyksICg0LDUsNildfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCitjbGFzcyBUZXN0Q2FsbGJhY2tNZWRkbGVBcmdzKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbbWFrZV9vcHRpb24oc3RyKHgpLCBhY3Rpb249ImNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz1zZWxmLnByb2Nlc3NfbiwgZGVzdD0ndGhpbmdzJykKKyAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiByYW5nZSgtMSwgLTYsIC0xKV0KKyAgICAgICAgc2VsZi5wYXJzZXIgPSBPcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9ucykKKworICAgICMgQ2FsbGJhY2sgdGhhdCBtZWRkbGVzIGluIHJhcmdzLCBsYXJncworICAgIGRlZiBwcm9jZXNzX24oc2VsZiwgb3B0aW9uLCBvcHQsIHZhbHVlLCBwYXJzZXJfKToKKyAgICAgICAgIyBvcHRpb24gaXMgLTMsIC01LCBldGMuCisgICAgICAgIG5hcmdzID0gaW50KG9wdFsxOl0pCisgICAgICAgIHJhcmdzID0gcGFyc2VyXy5yYXJncworICAgICAgICBpZiBsZW4ocmFyZ3MpIDwgbmFyZ3M6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkICVkIGFyZ3VtZW50cyBmb3IgJXMgb3B0aW9uLiIgJSAobmFyZ3MsIG9wdCkpCisgICAgICAgIGRlc3QgPSBwYXJzZXJfLnZhbHVlcy5lbnN1cmVfdmFsdWUob3B0aW9uLmRlc3QsIFtdKQorICAgICAgICBkZXN0LmFwcGVuZCh0dXBsZShyYXJnc1swOm5hcmdzXSkpCisgICAgICAgIHBhcnNlcl8ubGFyZ3MuYXBwZW5kKG5hcmdzKQorICAgICAgICBkZWwgcmFyZ3NbMDpuYXJnc10KKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX21lZGRsZV9hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItMSIsICJmb28iLCAiLTMiLCAiYmFyIiwgImJheiIsICJxdXgiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsndGhpbmdzJzogWygiZm9vIiwpLCAoImJhciIsICJiYXoiLCAicXV4IildfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxLCAzXSkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX21lZGRsZV9hcmdzX3NlcGFyYXRvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLTIiLCAiZm9vIiwgIi0tIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3RoaW5ncyc6IFsoJ2ZvbycsICctLScpXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMl0pCisKK2NsYXNzIFRlc3RDYWxsYmFja01hbnlBcmdzKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbbWFrZV9vcHRpb24oIi1hIiwgIi0tYXBwbGUiLCBhY3Rpb249ImNhbGxiYWNrIiwgbmFyZ3M9MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz1zZWxmLnByb2Nlc3NfbWFueSwgdHlwZT0ic3RyaW5nIiksCisgICAgICAgICAgICAgICAgICAgbWFrZV9vcHRpb24oIi1iIiwgIi0tYm9iIiwgYWN0aW9uPSJjYWxsYmFjayIsIG5hcmdzPTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s9c2VsZi5wcm9jZXNzX21hbnksIHR5cGU9ImludCIpXQorICAgICAgICBzZWxmLnBhcnNlciA9IE9wdGlvblBhcnNlcihvcHRpb25fbGlzdD1vcHRpb25zKQorCisgICAgZGVmIHByb2Nlc3NfbWFueShzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcl8pOgorICAgICAgICBpZiBvcHQgPT0gIi1hIjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsICgiZm9vIiwgImJhciIpKQorICAgICAgICBlbGlmIG9wdCA9PSAiLS1hcHBsZSI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCAoImRpbmciLCAiZG9uZyIpKQorICAgICAgICBlbGlmIG9wdCA9PSAiLWIiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgKDEsIDIsIDMpKQorICAgICAgICBlbGlmIG9wdCA9PSAiLS1ib2IiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgKC02NjYsIDQyLCAwKSkKKworICAgIGRlZiB0ZXN0X21hbnlfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWEiLCAiZm9vIiwgImJhciIsICItLWFwcGxlIiwgImRpbmciLCAiZG9uZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1iIiwgIjEiLCAiMiIsICIzIiwgIi0tYm9iIiwgIi02NjYiLCAiNDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImFwcGxlIjogTm9uZSwgImJvYiI6IE5vbmV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKK2NsYXNzIFRlc3RDYWxsYmFja0NoZWNrQWJicmV2KEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLS1mb28tYmFyIiwgYWN0aW9uPSJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s9c2VsZi5jaGVja19hYmJyZXYpCisKKyAgICBkZWYgY2hlY2tfYWJicmV2KHNlbGYsIG9wdGlvbiwgb3B0LCB2YWx1ZSwgcGFyc2VyKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQsICItLWZvby1iYXIiKQorCisgICAgZGVmIHRlc3RfYWJicmV2X2NhbGxiYWNrX2V4cGFuc2lvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLS1mb28iXSwge30sIFtdKQorCitjbGFzcyBUZXN0Q2FsbGJhY2tWYXJBcmdzKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbbWFrZV9vcHRpb24oIi1hIiwgdHlwZT0iaW50IiwgbmFyZ3M9MiwgZGVzdD0iYSIpLAorICAgICAgICAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItYiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9ImIiKSwKKyAgICAgICAgICAgICAgICAgICBtYWtlX29wdGlvbigiLWMiLCAiLS1jYWxsYmFjayIsIGFjdGlvbj0iY2FsbGJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPXNlbGYudmFyaWFibGVfYXJncywgZGVzdD0iYyIpXQorICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2xpc3Q9b3B0aW9ucykKKworICAgIGRlZiB2YXJpYWJsZV9hcmdzKHNlbGYsIG9wdGlvbiwgb3B0LCB2YWx1ZSwgcGFyc2VyKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlIGlzIE5vbmUpCisgICAgICAgIHZhbHVlID0gW10KKyAgICAgICAgcmFyZ3MgPSBwYXJzZXIucmFyZ3MKKyAgICAgICAgd2hpbGUgcmFyZ3M6CisgICAgICAgICAgICBhcmcgPSByYXJnc1swXQorICAgICAgICAgICAgaWYgKChhcmdbOjJdID09ICItLSIgYW5kIGxlbihhcmcpID4gMikgb3IKKyAgICAgICAgICAgICAgICAoYXJnWzoxXSA9PSAiLSIgYW5kIGxlbihhcmcpID4gMSBhbmQgYXJnWzFdICE9ICItIikpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChhcmcpCisgICAgICAgICAgICAgICAgZGVsIHJhcmdzWzBdCisgICAgICAgIHNldGF0dHIocGFyc2VyLnZhbHVlcywgb3B0aW9uLmRlc3QsIHZhbHVlKQorCisgICAgZGVmIHRlc3RfdmFyaWFibGVfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWEzIiwgIi01IiwgIi0tY2FsbGJhY2siLCAiZm9vIiwgImJhciJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogKDMsIC01KSwgJ2InOiBOb25lLCAnYyc6IFsiZm9vIiwgImJhciJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisgICAgZGVmIHRlc3RfY29uc3VtZV9zZXBhcmF0b3Jfc3RvcF9hdF9vcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1jIiwgIjM3IiwgIi0tIiwgInh4eCIsICItYiIsICJoZWxsbyJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYic6IFRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnOiBbIjM3IiwgIi0tIiwgInh4eCJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiaGVsbG8iXSkKKworICAgIGRlZiB0ZXN0X3Bvc2l0aW9uYWxfYXJnX2FuZF92YXJpYWJsZV9hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyJoZWxsbyIsICItYyIsICJmb28iLCAiLSIsICJiYXIiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJzpbImZvbyIsICItIiwgImJhciJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiaGVsbG8iXSkKKworICAgIGRlZiB0ZXN0X3N0b3BfYXRfb3B0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItYyIsICJmb28iLCAiLWIiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6IE5vbmUsICdiJzogVHJ1ZSwgJ2MnOiBbImZvbyJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisgICAgZGVmIHRlc3Rfc3RvcF9hdF9pbnZhbGlkX29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItYyIsICIzIiwgIi01IiwgIi1hIl0sICJubyBzdWNoIG9wdGlvbjogLTUiKQorCisKKyMgLS0gVGVzdCBjb25mbGljdCBoYW5kbGluZyBhbmQgcGFyc2VyLnBhcnNlX2FyZ3MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBDb25mbGljdEJhc2UoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgb3B0aW9ucyA9IFttYWtlX29wdGlvbigiLXYiLCAiLS12ZXJib3NlIiwgYWN0aW9uPSJjb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0idmVyYm9zZSIsIGhlbHA9ImluY3JlbWVudCB2ZXJib3NpdHkiKV0KKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9saXN0PW9wdGlvbnMpCisKKyAgICBkZWYgc2hvd192ZXJzaW9uKHNlbGYsIG9wdGlvbiwgb3B0LCB2YWx1ZSwgcGFyc2VyKToKKyAgICAgICAgcGFyc2VyLnZhbHVlcy5zaG93X3ZlcnNpb24gPSAxCisKK2NsYXNzIFRlc3RDb25mbGljdChDb25mbGljdEJhc2UpOgorICAgICIiIlVzZSB0aGUgZGVmYXVsdCBjb25mbGljdCByZXNvbHV0aW9uIGZvciBPcHRpayAxLjI6IGVycm9yLiIiIgorICAgIGRlZiBhc3NlcnRUcnVlY29uZmxpY3RfZXJyb3Ioc2VsZiwgZnVuYyk6CisgICAgICAgIGVyciA9IHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgZnVuYywgKCItdiIsICItLXZlcnNpb24iKSwgeydhY3Rpb24nIDogImNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FsbGJhY2snIDogc2VsZi5zaG93X3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlbHAnIDogInNob3cgdmVyc2lvbiJ9LAorICAgICAgICAgICAgT3B0aW9uQ29uZmxpY3RFcnJvciwKKyAgICAgICAgICAgICJvcHRpb24gLXYvLS12ZXJzaW9uOiBjb25mbGljdGluZyBvcHRpb24gc3RyaW5nKHMpOiAtdiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIubXNnLCAiY29uZmxpY3Rpbmcgb3B0aW9uIHN0cmluZyhzKTogLXYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyci5vcHRpb25faWQsICItdi8tLXZlcnNpb24iKQorCisgICAgZGVmIHRlc3RfY29uZmxpY3RfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZWNvbmZsaWN0X2Vycm9yKHNlbGYucGFyc2VyLmFkZF9vcHRpb24pCisKKyAgICBkZWYgdGVzdF9jb25mbGljdF9lcnJvcl9ncm91cChzZWxmKToKKyAgICAgICAgZ3JvdXAgPSBPcHRpb25Hcm91cChzZWxmLnBhcnNlciwgIkdyb3VwIDEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWVjb25mbGljdF9lcnJvcihncm91cC5hZGRfb3B0aW9uKQorCisgICAgZGVmIHRlc3Rfbm9fc3VjaF9jb25mbGljdF9oYW5kbGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLnNldF9jb25mbGljdF9oYW5kbGVyLCAoJ2ZvbycsKSwgTm9uZSwKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJpbnZhbGlkIGNvbmZsaWN0X3Jlc29sdXRpb24gdmFsdWUgJ2ZvbyciKQorCisKK2NsYXNzIFRlc3RDb25mbGljdFJlc29sdmUoQ29uZmxpY3RCYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIENvbmZsaWN0QmFzZS5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLnBhcnNlci5zZXRfY29uZmxpY3RfaGFuZGxlcigicmVzb2x2ZSIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi12IiwgIi0tdmVyc2lvbiIsIGFjdGlvbj0iY2FsbGJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPXNlbGYuc2hvd192ZXJzaW9uLCBoZWxwPSJzaG93IHZlcnNpb24iKQorCisgICAgZGVmIHRlc3RfY29uZmxpY3RfcmVzb2x2ZShzZWxmKToKKyAgICAgICAgdl9vcHQgPSBzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItdiIpCisgICAgICAgIHZlcmJvc2Vfb3B0ID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLS12ZXJib3NlIikKKyAgICAgICAgdmVyc2lvbl9vcHQgPSBzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItLXZlcnNpb24iKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2X29wdCBpcyB2ZXJzaW9uX29wdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZfb3B0IGlzIG5vdCB2ZXJib3NlX29wdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2X29wdC5fbG9uZ19vcHRzLCBbIi0tdmVyc2lvbiJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZlcnNpb25fb3B0Ll9zaG9ydF9vcHRzLCBbIi12Il0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmVyc2lvbl9vcHQuX2xvbmdfb3B0cywgWyItLXZlcnNpb24iXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2ZXJib3NlX29wdC5fc2hvcnRfb3B0cywgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmVyYm9zZV9vcHQuX2xvbmdfb3B0cywgWyItLXZlcmJvc2UiXSkKKworICAgIGRlZiB0ZXN0X2NvbmZsaWN0X3Jlc29sdmVfaGVscChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPdXRwdXQoWyItaCJdLCAiIiJcCitPcHRpb25zOgorICAtLXZlcmJvc2UgICAgICBpbmNyZW1lbnQgdmVyYm9zaXR5CisgIC1oLCAtLWhlbHAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgLXYsIC0tdmVyc2lvbiAgc2hvdyB2ZXJzaW9uCisiIiIpCisKKyAgICBkZWYgdGVzdF9jb25mbGljdF9yZXNvbHZlX3Nob3J0X29wdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXYiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsndmVyYm9zZSc6IE5vbmUsICdzaG93X3ZlcnNpb24nOiAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisgICAgZGVmIHRlc3RfY29uZmxpY3RfcmVzb2x2ZV9sb25nX29wdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLS12ZXJib3NlIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3ZlcmJvc2UnOiAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisgICAgZGVmIHRlc3RfY29uZmxpY3RfcmVzb2x2ZV9sb25nX29wdHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tdmVyYm9zZSIsICItLXZlcnNpb24iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsndmVyYm9zZSc6IDEsICdzaG93X3ZlcnNpb24nOiAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCitjbGFzcyBUZXN0Q29uZmxpY3RPdmVycmlkZShCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSkKKyAgICAgICAgc2VsZi5wYXJzZXIuc2V0X2NvbmZsaWN0X2hhbmRsZXIoInJlc29sdmUiKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItbiIsICItLWRyeS1ydW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlc3Q9ImRyeV9ydW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRvbid0IGRvIGFueXRoaW5nIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLS1kcnktcnVuIiwgIi1uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlX2NvbnN0IiwgY29uc3Q9NDIsIGRlc3Q9ImRyeV9ydW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImRyeSBydW4gbW9kZSIpCisKKyAgICBkZWYgdGVzdF9jb25mbGljdF9vdmVycmlkZV9vcHRzKHNlbGYpOgorICAgICAgICBvcHQgPSBzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItLWRyeS1ydW4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdC5fc2hvcnRfb3B0cywgWyItbiJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdC5fbG9uZ19vcHRzLCBbIi0tZHJ5LXJ1biJdKQorCisgICAgZGVmIHRlc3RfY29uZmxpY3Rfb3ZlcnJpZGVfaGVscChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPdXRwdXQoWyItaCJdLCAiIiJcCitPcHRpb25zOgorICAtaCwgLS1oZWxwICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgIC1uLCAtLWRyeS1ydW4gIGRyeSBydW4gbW9kZQorIiIiKQorCisgICAgZGVmIHRlc3RfY29uZmxpY3Rfb3ZlcnJpZGVfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLW4iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnZHJ5X3J1bic6IDQyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisjIC0tIE90aGVyIHRlc3RpbmcuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworX2V4cGVjdGVkX2hlbHBfYmFzaWMgPSAiIiJcCitVc2FnZTogYmFyLnB5IFtvcHRpb25zXQorCitPcHRpb25zOgorICAtYSBBUFBMRSAgICAgICAgICAgdGhyb3cgQVBQTEVzIGF0IGJhc2tldAorICAtYiBOVU0sIC0tYm9vPU5VTSAgc2hvdXQgImJvbyEiIE5VTSB0aW1lcyAoaW4gb3JkZXIgdG8gZnJpZ2h0ZW4gYXdheSBhbGwgdGhlCisgICAgICAgICAgICAgICAgICAgICBldmlsIHNwaXJpdHMgdGhhdCBjYXVzZSB0cm91YmxlIGFuZCBtYXloZW0pCisgIC0tZm9vPUZPTyAgICAgICAgICBzdG9yZSBGT08gaW4gdGhlIGZvbyBsaXN0IGZvciBsYXRlciBmb29pbmcKKyAgLWgsIC0taGVscCAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyIiIgorCitfZXhwZWN0ZWRfaGVscF9sb25nX29wdHNfZmlyc3QgPSAiIiJcCitVc2FnZTogYmFyLnB5IFtvcHRpb25zXQorCitPcHRpb25zOgorICAtYSBBUFBMRSAgICAgICAgICAgdGhyb3cgQVBQTEVzIGF0IGJhc2tldAorICAtLWJvbz1OVU0sIC1iIE5VTSAgc2hvdXQgImJvbyEiIE5VTSB0aW1lcyAoaW4gb3JkZXIgdG8gZnJpZ2h0ZW4gYXdheSBhbGwgdGhlCisgICAgICAgICAgICAgICAgICAgICBldmlsIHNwaXJpdHMgdGhhdCBjYXVzZSB0cm91YmxlIGFuZCBtYXloZW0pCisgIC0tZm9vPUZPTyAgICAgICAgICBzdG9yZSBGT08gaW4gdGhlIGZvbyBsaXN0IGZvciBsYXRlciBmb29pbmcKKyAgLS1oZWxwLCAtaCAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyIiIgorCitfZXhwZWN0ZWRfaGVscF90aXRsZV9mb3JtYXR0ZXIgPSAiIiJcCitVc2FnZQorPT09PT0KKyAgYmFyLnB5IFtvcHRpb25zXQorCitPcHRpb25zCis9PT09PT09CistYSBBUFBMRSAgICAgICAgICAgdGhyb3cgQVBQTEVzIGF0IGJhc2tldAorLS1ib289TlVNLCAtYiBOVU0gIHNob3V0ICJib28hIiBOVU0gdGltZXMgKGluIG9yZGVyIHRvIGZyaWdodGVuIGF3YXkgYWxsIHRoZQorICAgICAgICAgICAgICAgICAgIGV2aWwgc3Bpcml0cyB0aGF0IGNhdXNlIHRyb3VibGUgYW5kIG1heWhlbSkKKy0tZm9vPUZPTyAgICAgICAgICBzdG9yZSBGT08gaW4gdGhlIGZvbyBsaXN0IGZvciBsYXRlciBmb29pbmcKKy0taGVscCwgLWggICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisiIiIKKworX2V4cGVjdGVkX2hlbHBfc2hvcnRfbGluZXMgPSAiIiJcCitVc2FnZTogYmFyLnB5IFtvcHRpb25zXQorCitPcHRpb25zOgorICAtYSBBUFBMRSAgICAgICAgICAgdGhyb3cgQVBQTEVzIGF0IGJhc2tldAorICAtYiBOVU0sIC0tYm9vPU5VTSAgc2hvdXQgImJvbyEiIE5VTSB0aW1lcyAoaW4gb3JkZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgIGZyaWdodGVuIGF3YXkgYWxsIHRoZSBldmlsIHNwaXJpdHMKKyAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2F1c2UgdHJvdWJsZSBhbmQgbWF5aGVtKQorICAtLWZvbz1GT08gICAgICAgICAgc3RvcmUgRk9PIGluIHRoZSBmb28gbGlzdCBmb3IgbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgIGZvb2luZworICAtaCwgLS1oZWxwICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorIiIiCisKK2NsYXNzIFRlc3RIZWxwKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyID0gc2VsZi5tYWtlX3BhcnNlcig4MCkKKworICAgIGRlZiBtYWtlX3BhcnNlcihzZWxmLCBjb2x1bW5zKToKKyAgICAgICAgb3B0aW9ucyA9IFsKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItYSIsIHR5cGU9InN0cmluZyIsIGRlc3Q9J2EnLAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0iQVBQTEUiLCBoZWxwPSJ0aHJvdyBBUFBMRXMgYXQgYmFza2V0IiksCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLWIiLCAiLS1ib28iLCB0eXBlPSJpbnQiLCBkZXN0PSdib28nLAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0iTlVNIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9CisgICAgICAgICAgICAgICAgICAgICAgICAic2hvdXQgXCJib28hXCIgTlVNIHRpbWVzIChpbiBvcmRlciB0byBmcmlnaHRlbiBhd2F5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbGwgdGhlIGV2aWwgc3Bpcml0cyB0aGF0IGNhdXNlIHRyb3VibGUgYW5kIG1heWhlbSkiKSwKKyAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLWZvbyIsIGFjdGlvbj0iYXBwZW5kIiwgdHlwZT0ic3RyaW5nIiwgZGVzdD0nZm9vJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InN0b3JlIEZPTyBpbiB0aGUgZm9vIGxpc3QgZm9yIGxhdGVyIGZvb2luZyIpLAorICAgICAgICAgICAgXQorCisgICAgICAgICMgV2UgbmVlZCB0byBzZXQgQ09MVU1OUyBmb3IgdGhlIE9wdGlvblBhcnNlciBjb25zdHJ1Y3RvciwgYnV0CisgICAgICAgICMgd2UgbXVzdCByZXN0b3JlIGl0cyBvcmlnaW5hbCB2YWx1ZSAtLSBvdGhlcndpc2UsIHRoaXMgdGVzdAorICAgICAgICAjIHNjcmV3cyB0aGluZ3MgdXAgZm9yIG90aGVyIHRlc3RzIHdoZW4gaXQncyBwYXJ0IG9mIHRoZSBQeXRob24KKyAgICAgICAgIyB0ZXN0IHN1aXRlLgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52OgorICAgICAgICAgICAgZW52WydDT0xVTU5TJ10gPSBzdHIoY29sdW1ucykKKyAgICAgICAgICAgIHJldHVybiBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9ucykKKworICAgIGRlZiBhc3NlcnRIZWxwRXF1YWxzKHNlbGYsIGV4cGVjdGVkX291dHB1dCk6CisgICAgICAgIGlmIHR5cGUoZXhwZWN0ZWRfb3V0cHV0KSBpcyB0eXBlcy5Vbmljb2RlVHlwZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gc2VsZi5wYXJzZXIuX2dldF9lbmNvZGluZyhzeXMuc3Rkb3V0KQorICAgICAgICAgICAgZXhwZWN0ZWRfb3V0cHV0ID0gZXhwZWN0ZWRfb3V0cHV0LmVuY29kZShlbmNvZGluZywgInJlcGxhY2UiKQorCisgICAgICAgIHNhdmVfYXJndiA9IHN5cy5hcmd2WzpdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgTWFrZSBvcHRwYXJzZSBiZWxpZXZlIGJhci5weSBpcyBiZWluZyBleGVjdXRlZC4KKyAgICAgICAgICAgIHN5cy5hcmd2WzBdID0gb3MucGF0aC5qb2luKCJmb28iLCAiYmFyLnB5IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0T3V0cHV0KFsiLWgiXSwgZXhwZWN0ZWRfb3V0cHV0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzYXZlX2FyZ3YKKworICAgIGRlZiB0ZXN0X2hlbHAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SGVscEVxdWFscyhfZXhwZWN0ZWRfaGVscF9iYXNpYykKKworICAgIGRlZiB0ZXN0X2hlbHBfb2xkX3VzYWdlKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5zZXRfdXNhZ2UoIlVzYWdlOiAlcHJvZyBbb3B0aW9uc10iKQorICAgICAgICBzZWxmLmFzc2VydEhlbHBFcXVhbHMoX2V4cGVjdGVkX2hlbHBfYmFzaWMpCisKKyAgICBkZWYgdGVzdF9oZWxwX2xvbmdfb3B0c19maXJzdChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuZm9ybWF0dGVyLnNob3J0X2ZpcnN0ID0gMAorICAgICAgICBzZWxmLmFzc2VydEhlbHBFcXVhbHMoX2V4cGVjdGVkX2hlbHBfbG9uZ19vcHRzX2ZpcnN0KQorCisgICAgZGVmIHRlc3RfaGVscF90aXRsZV9mb3JtYXR0ZXIoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnY6CisgICAgICAgICAgICBlbnZbIkNPTFVNTlMiXSA9ICI4MCIKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLmZvcm1hdHRlciA9IFRpdGxlZEhlbHBGb3JtYXR0ZXIoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKF9leHBlY3RlZF9oZWxwX3RpdGxlX2Zvcm1hdHRlcikKKworICAgIGRlZiB0ZXN0X3dyYXBfY29sdW1ucyhzZWxmKToKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB3cmFwcGluZyByZXNwZWN0cyAkQ09MVU1OUyBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAgICAgIyBOZWVkIHRvIHJlY29uc3RydWN0IHRoZSBwYXJzZXIsIHNpbmNlIHRoYXQncyB0aGUgb25seSB0aW1lCisgICAgICAgICMgd2UgbG9vayBhdCAkQ09MVU1OUy4KKyAgICAgICAgc2VsZi5wYXJzZXIgPSBzZWxmLm1ha2VfcGFyc2VyKDYwKQorICAgICAgICBzZWxmLmFzc2VydEhlbHBFcXVhbHMoX2V4cGVjdGVkX2hlbHBfc2hvcnRfbGluZXMpCisKKyAgICBkZWYgdGVzdF9oZWxwX3VuaWNvZGUoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyID0gSW50ZXJjZXB0aW5nT3B0aW9uUGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItYSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGhlbHA9dSJvbFx1MDBFOSEiKQorICAgICAgICBleHBlY3QgPSB1IiIiXAorT3B0aW9uczoKKyAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAtYSAgICAgICAgICBvbFx1MDBFOSEKKyIiIgorICAgICAgICBzZWxmLmFzc2VydEhlbHBFcXVhbHMoZXhwZWN0KQorCisgICAgZGVmIHRlc3RfaGVscF91bmljb2RlX2Rlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249dSJvbFx1MDBFOSEiKQorICAgICAgICBleHBlY3QgPSB1IiIiXAorb2xcdTAwRTkhCisKK09wdGlvbnM6CisgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyIiIgorICAgICAgICBzZWxmLmFzc2VydEhlbHBFcXVhbHMoZXhwZWN0KQorCisgICAgZGVmIHRlc3RfaGVscF9kZXNjcmlwdGlvbl9ncm91cHMoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLnNldF9kZXNjcmlwdGlvbigKKyAgICAgICAgICAgICJUaGlzIGlzIHRoZSBwcm9ncmFtIGRlc2NyaXB0aW9uIGZvciAlcHJvZy4gICVwcm9nIGhhcyAiCisgICAgICAgICAgICAiYW4gb3B0aW9uIGdyb3VwIGFzIHdlbGwgYXMgc2luZ2xlIG9wdGlvbnMuIikKKworICAgICAgICBncm91cCA9IE9wdGlvbkdyb3VwKAorICAgICAgICAgICAgc2VsZi5wYXJzZXIsICJEYW5nZXJvdXMgT3B0aW9ucyIsCisgICAgICAgICAgICAiQ2F1dGlvbjogdXNlIG9mIHRoZXNlIG9wdGlvbnMgaXMgYXQgeW91ciBvd24gcmlzay4gICIKKyAgICAgICAgICAgICJJdCBpcyBiZWxpZXZlZCB0aGF0IHNvbWUgb2YgdGhlbSBiaXRlLiIpCisgICAgICAgIGdyb3VwLmFkZF9vcHRpb24oIi1nIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgaGVscD0iR3JvdXAgb3B0aW9uLiIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoZ3JvdXApCisKKyAgICAgICAgZXhwZWN0ID0gIiIiXAorVXNhZ2U6IGJhci5weSBbb3B0aW9uc10KKworVGhpcyBpcyB0aGUgcHJvZ3JhbSBkZXNjcmlwdGlvbiBmb3IgYmFyLnB5LiAgYmFyLnB5IGhhcyBhbiBvcHRpb24gZ3JvdXAgYXMKK3dlbGwgYXMgc2luZ2xlIG9wdGlvbnMuCisKK09wdGlvbnM6CisgIC1hIEFQUExFICAgICAgICAgICB0aHJvdyBBUFBMRXMgYXQgYmFza2V0CisgIC1iIE5VTSwgLS1ib289TlVNICBzaG91dCAiYm9vISIgTlVNIHRpbWVzIChpbiBvcmRlciB0byBmcmlnaHRlbiBhd2F5IGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGV2aWwgc3Bpcml0cyB0aGF0IGNhdXNlIHRyb3VibGUgYW5kIG1heWhlbSkKKyAgLS1mb289Rk9PICAgICAgICAgIHN0b3JlIEZPTyBpbiB0aGUgZm9vIGxpc3QgZm9yIGxhdGVyIGZvb2luZworICAtaCwgLS1oZWxwICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorCisgIERhbmdlcm91cyBPcHRpb25zOgorICAgIENhdXRpb246IHVzZSBvZiB0aGVzZSBvcHRpb25zIGlzIGF0IHlvdXIgb3duIHJpc2suICBJdCBpcyBiZWxpZXZlZAorICAgIHRoYXQgc29tZSBvZiB0aGVtIGJpdGUuCisKKyAgICAtZyAgICAgICAgICAgICAgIEdyb3VwIG9wdGlvbi4KKyIiIgorCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscEVxdWFscyhleHBlY3QpCisKKyAgICAgICAgc2VsZi5wYXJzZXIuZXBpbG9nID0gIlBsZWFzZSByZXBvcnQgYnVncyB0byAvZGV2L251bGwuIgorICAgICAgICBzZWxmLmFzc2VydEhlbHBFcXVhbHMoZXhwZWN0ICsgIlxuUGxlYXNlIHJlcG9ydCBidWdzIHRvIC9kZXYvbnVsbC5cbiIpCisKKworY2xhc3MgVGVzdE1hdGNoQWJicmV2KEJhc2VUZXN0KToKKyAgICBkZWYgdGVzdF9tYXRjaF9hYmJyZXYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX21hdGNoX2FiYnJldigiLS1mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiLS1mb3oiOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWZvbyI6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tZmllIjogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1mIjogTm9uZX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICItLWYiKQorCisgICAgZGVmIHRlc3RfbWF0Y2hfYWJicmV2X2Vycm9yKHNlbGYpOgorICAgICAgICBzID0gIi0tZiIKKyAgICAgICAgd29yZG1hcCA9IHsiLS1mb3oiOiBOb25lLCAiLS1mb28iOiBOb25lLCAiLS1maWUiOiBOb25lfQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIF9tYXRjaF9hYmJyZXYsIChzLCB3b3JkbWFwKSwgTm9uZSwKKyAgICAgICAgICAgIEJhZE9wdGlvbkVycm9yLCAiYW1iaWd1b3VzIG9wdGlvbjogLS1mICgtLWZpZSwgLS1mb28sIC0tZm96PykiKQorCisKK2NsYXNzIFRlc3RQYXJzZU51bWJlcihCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcigpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1uIiwgdHlwZT1pbnQpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1sIiwgdHlwZT1sb25nKQorCisgICAgZGVmIHRlc3RfcGFyc2VfbnVtX2ZhaWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgX3BhcnNlX251bSwgKCIiLCBpbnQpLCB7fSwKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsCisgICAgICAgICAgICByZS5jb21waWxlKHIiaW52YWxpZCBsaXRlcmFsIGZvciBpbnQoKS4qOiAnPyc/IikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgX3BhcnNlX251bSwgKCIweE9vb3BzIiwgbG9uZyksIHt9LAorICAgICAgICAgICAgVmFsdWVFcnJvciwKKyAgICAgICAgICAgIHJlLmNvbXBpbGUociJpbnZhbGlkIGxpdGVyYWwgZm9yIGxvbmcoKS4qOiAnPzB4T29vcHMnPyIpKQorCisgICAgZGVmIHRlc3RfcGFyc2VfbnVtX29rKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9wYXJzZV9udW0oIjAiLCBpbnQpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9wYXJzZV9udW0oIjB4MTAiLCBpbnQpLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfcGFyc2VfbnVtKCIwWEEiLCBsb25nKSwgMTBMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9wYXJzZV9udW0oIjAxMCIsIGxvbmcpLCA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfcGFyc2VfbnVtKCIwYjExIiwgaW50KSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfcGFyc2VfbnVtKCIwYiIsIGxvbmcpLCAwTCkKKworICAgIGRlZiB0ZXN0X251bWVyaWNfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLW4iLCAiNDIiLCAiLWwiLCAiMHgyMCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAibiI6IDQyLCAibCI6IDB4MjAgfSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1uIiwgIjBiMDEwMSIsICItbDAxMCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAibiI6IDUsICJsIjogOCB9LCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItbjAwOCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIC1uOiBpbnZhbGlkIGludGVnZXIgdmFsdWU6ICcwMDgnIikKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItbDBiMDEyMyJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIC1sOiBpbnZhbGlkIGxvbmcgaW50ZWdlciB2YWx1ZTogJzBiMDEyMyciKQorICAgICAgICBzZWxmLmFzc2VydFBhcnNlRmFpbChbIi1sIiwgIjB4MTJ4Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gLWw6IGludmFsaWQgbG9uZyBpbnRlZ2VyIHZhbHVlOiAnMHgxMngnIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3B0cGFyc2UucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3B0cGFyc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MTdlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcHRwYXJzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3B0cGFyc2UucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3B0cGFyc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MTdlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcHRwYXJzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzFmNDlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3MucHkKQEAgLTAsMCArMSw4NjYgQEAKKyMgQXMgYSB0ZXN0IHN1aXRlIGZvciB0aGUgb3MgbW9kdWxlLCB0aGlzIGlzIHdvZWZ1bGx5IGluYWRlcXVhdGUsIGJ1dCB0aGlzCisjIGRvZXMgYWRkIHRlc3RzIGZvciBhIGZldyBmdW5jdGlvbnMgd2hpY2ggaGF2ZSBiZWVuIGRldGVybWluZWQgdG8gYmUgbW9yZQorIyBwb3J0YWJsZSB0aGFuIHRoZXkgaGFkIGJlZW4gdGhvdWdodCB0byBiZS4KKworaW1wb3J0IG9zCitpbXBvcnQgZXJybm8KK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCitpbXBvcnQgc3lzCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRpbWUKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBtbWFwCitpbXBvcnQgdXVpZAorCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInRlbXBuYW0iLCBSdW50aW1lV2FybmluZywgX19uYW1lX18pCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInRtcG5hbSIsIFJ1bnRpbWVXYXJuaW5nLCBfX25hbWVfXykKKworIyBUZXN0cyBjcmVhdGluZyBURVNURk4KK2NsYXNzIEZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0ZXN0X3N1cHBvcnQuVEVTVEZOKToKKyAgICAgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgIHRlYXJEb3duID0gc2V0VXAKKworICAgIGRlZiB0ZXN0X2FjY2VzcyhzZWxmKToKKyAgICAgICAgZiA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuT19DUkVBVHxvcy5PX1JEV1IpCisgICAgICAgIG9zLmNsb3NlKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5hY2Nlc3ModGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuV19PSykpCisKKyAgICBkZWYgdGVzdF9jbG9zZXJhbmdlKHNlbGYpOgorICAgICAgICBmaXJzdCA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuT19DUkVBVHxvcy5PX1JEV1IpCisgICAgICAgICMgV2UgbXVzdCBhbGxvY2F0ZSB0d28gY29uc2VjdXRpdmUgZmlsZSBkZXNjcmlwdG9ycywgb3RoZXJ3aXNlCisgICAgICAgICMgaXQgd2lsbCBtZXNzIHVwIG90aGVyIGZpbGUgZGVzY3JpcHRvcnMgKHBlcmhhcHMgZXZlbiB0aGUgdGhyZWUKKyAgICAgICAgIyBzdGFuZGFyZCBvbmVzKS4KKyAgICAgICAgc2Vjb25kID0gb3MuZHVwKGZpcnN0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXRyaWVzID0gMAorICAgICAgICAgICAgd2hpbGUgc2Vjb25kICE9IGZpcnN0ICsgMToKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShmaXJzdCkKKyAgICAgICAgICAgICAgICByZXRyaWVzICs9IDEKKyAgICAgICAgICAgICAgICBpZiByZXRyaWVzID4gMTA6CisgICAgICAgICAgICAgICAgICAgICMgWFhYIHRlc3Qgc2tpcHBlZAorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJjb3VsZG4ndCBhbGxvY2F0ZSB0d28gY29uc2VjdXRpdmUgZmRzIikKKyAgICAgICAgICAgICAgICBmaXJzdCwgc2Vjb25kID0gc2Vjb25kLCBvcy5kdXAoc2Vjb25kKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2xvc2Uoc2Vjb25kKQorICAgICAgICAjIGNsb3NlIGEgZmQgdGhhdCBpcyBvcGVuLCBhbmQgb25lIHRoYXQgaXNuJ3QKKyAgICAgICAgb3MuY2xvc2VyYW5nZShmaXJzdCwgZmlyc3QgKyAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy53cml0ZSwgZmlyc3QsICJhIikKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfcmVuYW1lKHNlbGYpOgorICAgICAgICBwYXRoID0gdW5pY29kZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBvbGQgPSBzeXMuZ2V0cmVmY291bnQocGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcy5yZW5hbWUsIHBhdGgsIDApCisgICAgICAgIG5ldyA9IHN5cy5nZXRyZWZjb3VudChwYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9sZCwgbmV3KQorCisKK2NsYXNzIFRlbXBvcmFyeUZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVzID0gW10KKyAgICAgICAgb3MubWtkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5maWxlczoKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorICAgICAgICBvcy5ybWRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIGNoZWNrX3RlbXBmaWxlKHNlbGYsIG5hbWUpOgorICAgICAgICAjIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3Q6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMobmFtZSksCisgICAgICAgICAgICAgICAgICAgICJmaWxlIGFscmVhZHkgZXhpc3RzIGZvciB0ZW1wb3JhcnkgZmlsZSIpCisgICAgICAgICMgbWFrZSBzdXJlIHdlIGNhbiBjcmVhdGUgdGhlIGZpbGUKKyAgICAgICAgb3BlbihuYW1lLCAidyIpCisgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKG5hbWUpCisKKyAgICBkZWYgdGVzdF90ZW1wbmFtKHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgInRlbXBuYW0iKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInRlbXBuYW0iLCBSdW50aW1lV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIidGVzdF9vcyQiKQorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0ZW1wbmFtIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5jaGVja190ZW1wZmlsZShvcy50ZW1wbmFtKCkpCisKKyAgICAgICAgICAgIG5hbWUgPSBvcy50ZW1wbmFtKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBzZWxmLmNoZWNrX3RlbXBmaWxlKG5hbWUpCisKKyAgICAgICAgICAgIG5hbWUgPSBvcy50ZW1wbmFtKHRlc3Rfc3VwcG9ydC5URVNURk4sICJwZngiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguYmFzZW5hbWUobmFtZSlbOjNdID09ICJwZngiKQorICAgICAgICAgICAgc2VsZi5jaGVja190ZW1wZmlsZShuYW1lKQorCisgICAgZGVmIHRlc3RfdG1wZmlsZShzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJ0bXBmaWxlIik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBBcyB3aXRoIHRlc3RfdG1wbmFtKCkgYmVsb3csIHRoZSBXaW5kb3dzIGltcGxlbWVudGF0aW9uIG9mIHRtcGZpbGUoKQorICAgICAgICAjIGF0dGVtcHRzIHRvIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IGRyaXZlLgorICAgICAgICAjIE9uIFZpc3RhIGFuZCBTZXJ2ZXIgMjAwOCwgdGhpcyB0ZXN0IHdpbGwgYWx3YXlzIGZhaWwgZm9yIG5vcm1hbCB1c2VycworICAgICAgICAjIGFzIHdyaXRpbmcgdG8gdGhlIHJvb3QgZGlyZWN0b3J5IHJlcXVpcmVzIGVsZXZhdGVkIHByaXZpbGVnZXMuICBXaXRoCisgICAgICAgICMgWFAgYW5kIGJlbG93LCB0aGUgc2VtYW50aWNzIG9mIHRtcGZpbGUoKSBhcmUgdGhlIHNhbWUsIGJ1dCB0aGUgdXNlcgorICAgICAgICAjIHJ1bm5pbmcgdGhlIHRlc3QgaXMgbW9yZSBsaWtlbHkgdG8gaGF2ZSBhZG1pbmlzdHJhdGl2ZSBwcml2aWxlZ2VzIG9uCisgICAgICAgICMgdGhlaXIgYWNjb3VudCBhbHJlYWR5LiAgSWYgdGhhdCdzIHRoZSBjYXNlLCB0aGVuIG9zLnRtcGZpbGUoKSBzaG91bGQKKyAgICAgICAgIyB3b3JrLiAgSW4gb3JkZXIgdG8gbWFrZSB0aGlzIHRlc3QgYXMgdXNlZnVsIGFzIHBvc3NpYmxlLCByYXRoZXIgdGhhbgorICAgICAgICAjIHRyeWluZyB0byBkZXRlY3QgV2luZG93cyB2ZXJzaW9ucyBvciB3aGV0aGVyIG9yIG5vdCB0aGUgdXNlciBoYXMgdGhlCisgICAgICAgICMgcmlnaHQgcGVybWlzc2lvbnMsIGp1c3QgdHJ5IGFuZCBjcmVhdGUgYSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeQorICAgICAgICAjIGFuZCBzZWUgaWYgaXQgcmFpc2VzIGEgJ1Blcm1pc3Npb24gZGVuaWVkJyBPU0Vycm9yLiAgSWYgaXQgZG9lcywgdGhlbgorICAgICAgICAjIHRlc3QgdGhhdCBhIHN1YnNlcXVlbnQgY2FsbCB0byBvcy50bXBmaWxlKCkgcmFpc2VzIHRoZSBzYW1lIGVycm9yLiBJZgorICAgICAgICAjIGl0IGRvZXNuJ3QsIGFzc3VtZSB3ZSdyZSBvbiBYUCBvciBiZWxvdyBhbmQgdGhlIHVzZXIgcnVubmluZyB0aGUgdGVzdAorICAgICAgICAjIGhhcyBhZG1pbmlzdHJhdGl2ZSBwcml2aWxlZ2VzLCBhbmQgcHJvY2VlZCB3aXRoIHRoZSB0ZXN0IGFzIG5vcm1hbC4KKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0bXBmaWxlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgICAgICBuYW1lID0gJ1xccHl0aG9uX3Rlc3Rfb3NfdGVzdF90bXBmaWxlLnR4dCcKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKG5hbWUpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmcCA9IG9wZW4obmFtZSwgJ3cnKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBmaXJzdDoKKyAgICAgICAgICAgICAgICAgICAgIyBvcGVuKCkgZmFpbGVkLCBhc3NlcnQgdG1wZmlsZSgpIGZhaWxzIGluIHRoZSBzYW1lIHdheS4KKyAgICAgICAgICAgICAgICAgICAgIyBBbHRob3VnaCBvcGVuKCkgcmFpc2VzIGFuIElPRXJyb3IgYW5kIG9zLnRtcGZpbGUoKSByYWlzZXMgYW4KKyAgICAgICAgICAgICAgICAgICAgIyBPU0Vycm9yKCksICdhcmdzJyB3aWxsIGJlICgxMywgJ1Blcm1pc3Npb24gZGVuaWVkJykgaW4gYm90aAorICAgICAgICAgICAgICAgICAgICAjIGNhc2VzLgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBmcCA9IG9zLnRtcGZpbGUoKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgc2Vjb25kOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdC5hcmdzLCBzZWNvbmQuYXJncykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgb3MudG1wZmlsZSgpIHRvIHJhaXNlIE9TRXJyb3IiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIG9wZW4oKSB3b3JrZWQsIHRoZXJlZm9yZSwgdG1wZmlsZSgpIHNob3VsZCB3b3JrLiAgQ2xvc2Ugb3VyCisgICAgICAgICAgICAgICAgICAgICMgZHVtbXkgZmlsZSBhbmQgcHJvY2VlZCB3aXRoIHRoZSB0ZXN0IGFzIG5vcm1hbC4KKyAgICAgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUobmFtZSkKKworICAgICAgICAgICAgZnAgPSBvcy50bXBmaWxlKCkKKyAgICAgICAgICAgIGZwLndyaXRlKCJmb29iYXIiKQorICAgICAgICAgICAgZnAuc2VlaygwLDApCisgICAgICAgICAgICBzID0gZnAucmVhZCgpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocyA9PSAiZm9vYmFyIikKKworICAgIGRlZiB0ZXN0X3RtcG5hbShzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJ0bXBuYW0iKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInRtcG5hbSIsIFJ1bnRpbWVXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJ0ZXN0X29zJCIpCisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInRtcG5hbSIsIERlcHJlY2F0aW9uV2FybmluZykKKworICAgICAgICAgICAgbmFtZSA9IG9zLnRtcG5hbSgpCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCJ3aW4zMiIsKToKKyAgICAgICAgICAgICAgICAjIFRoZSBXaW5kb3dzIHRtcG5hbSgpIHNlZW1zIHVzZWxlc3MuICBGcm9tIHRoZSBNUyBkb2NzOgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjICAgICBUaGUgY2hhcmFjdGVyIHN0cmluZyB0aGF0IHRtcG5hbSBjcmVhdGVzIGNvbnNpc3RzIG9mCisgICAgICAgICAgICAgICAgIyAgICAgdGhlIHBhdGggcHJlZml4LCBkZWZpbmVkIGJ5IHRoZSBlbnRyeSBQX3RtcGRpciBpbiB0aGUKKyAgICAgICAgICAgICAgICAjICAgICBmaWxlIFNURElPLkgsIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2UgY29uc2lzdGluZyBvZiB0aGUKKyAgICAgICAgICAgICAgICAjICAgICBkaWdpdCBjaGFyYWN0ZXJzICcwJyB0aHJvdWdoICc5JzsgdGhlIG51bWVyaWNhbCB2YWx1ZQorICAgICAgICAgICAgICAgICMgICAgIG9mIHRoaXMgc3RyaW5nIGlzIGluIHRoZSByYW5nZSAxIC0gNjUsNTM1LiAgQ2hhbmdpbmcgdGhlCisgICAgICAgICAgICAgICAgIyAgICAgZGVmaW5pdGlvbnMgb2YgTF90bXBuYW0gb3IgUF90bXBkaXIgaW4gU1RESU8uSCBkb2VzIG5vdAorICAgICAgICAgICAgICAgICMgICAgIGNoYW5nZSB0aGUgb3BlcmF0aW9uIG9mIHRtcG5hbS4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBUaGUgcmVhbGx5IGJpemFycmUgcGFydCBpcyB0aGF0LCBhdCBsZWFzdCB1bmRlciBNU1ZDNiwKKyAgICAgICAgICAgICAgICAjIFBfdG1wZGlyIGlzICJcXCIuICBUaGF0IGlzLCB0aGUgcGF0aCByZXR1cm5lZCByZWZlcnMgdG8KKyAgICAgICAgICAgICAgICAjIHRoZSByb290IG9mIHRoZSBjdXJyZW50IGRyaXZlLiAgVGhhdCdzIGEgdGVycmlibGUgcGxhY2UgdG8KKyAgICAgICAgICAgICAgICAjIHB1dCB0ZW1wIGZpbGVzLCBhbmQsIGRlcGVuZGluZyBvbiBwcml2aWxlZ2VzLCB0aGUgdXNlcgorICAgICAgICAgICAgICAgICMgbWF5IG5vdCBldmVuIGJlIGFibGUgdG8gb3BlbiBhIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMobmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgYWxyZWFkeSBleGlzdHMgZm9yIHRlbXBvcmFyeSBmaWxlIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja190ZW1wZmlsZShuYW1lKQorCisjIFRlc3QgYXR0cmlidXRlcyBvbiByZXR1cm4gdmFsdWVzIGZyb20gb3MuKnN0YXQqIGZhbWlseS4KK2NsYXNzIFN0YXRBdHRyaWJ1dGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBvcy5ta2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmZuYW1lID0gb3MucGF0aC5qb2luKHRlc3Rfc3VwcG9ydC5URVNURk4sICJmMSIpCisgICAgICAgIGYgPSBvcGVuKHNlbGYuZm5hbWUsICd3YicpCisgICAgICAgIGYud3JpdGUoIkFCQyIpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBvcy51bmxpbmsoc2VsZi5mbmFtZSkKKyAgICAgICAgb3Mucm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X3N0YXRfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJzdGF0Iik6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpbXBvcnQgc3RhdAorICAgICAgICByZXN1bHQgPSBvcy5zdGF0KHNlbGYuZm5hbWUpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgZGlyZWN0IGFjY2VzcyB3b3JrcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFtzdGF0LlNUX1NJWkVdLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5zdF9zaXplLCAzKQorCisgICAgICAgICMgTWFrZSBzdXJlIGFsbCB0aGUgYXR0cmlidXRlcyBhcmUgdGhlcmUKKyAgICAgICAgbWVtYmVycyA9IGRpcihyZXN1bHQpCisgICAgICAgIGZvciBuYW1lIGluIGRpcihzdGF0KToKKyAgICAgICAgICAgIGlmIG5hbWVbOjNdID09ICdTVF8nOgorICAgICAgICAgICAgICAgIGF0dHIgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCJUSU1FIik6CisgICAgICAgICAgICAgICAgICAgIGRlZiB0cnVuYyh4KTogcmV0dXJuIGludCh4KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRlZiB0cnVuYyh4KTogcmV0dXJuIHgKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRydW5jKGdldGF0dHIocmVzdWx0LCBhdHRyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbZ2V0YXR0cihzdGF0LCBuYW1lKV0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihhdHRyLCBtZW1iZXJzKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdFsyMDBdCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGFzc2lnbm1lbnQgZmFpbHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0LnN0X21vZGUgPSAxCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQorICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdC5zdF9yZGV2ID0gMQorICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gcmFpc2VkIikKKyAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQucGFycm90ID0gMQorICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gcmFpc2VkIikKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgVXNlIHRoZSBzdGF0X3Jlc3VsdCBjb25zdHJ1Y3RvciB3aXRoIGEgdG9vLXNob3J0IHR1cGxlLgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQyID0gb3Muc3RhdF9yZXN1bHQoKDEwLCkpCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgVXNlIHRoZSBjb25zdHJ1Y3RvciB3aXRoIGEgdG9vLWxvbmcgdHVwbGUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdDIgPSBvcy5zdGF0X3Jlc3VsdCgoMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKworICAgIGRlZiB0ZXN0X3N0YXR2ZnNfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJzdGF0dmZzIik6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSBvcy5zdGF0dmZzKHNlbGYuZm5hbWUpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgIyBPbiBBdGhlT1MsIGdsaWJjIGFsd2F5cyByZXR1cm5zIEVOT1NZUworICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9TWVM6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBNYWtlIHN1cmUgZGlyZWN0IGFjY2VzcyB3b3JrcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5mX2JmcmVlLCByZXN1bHRbM10pCisKKyAgICAgICAgIyBNYWtlIHN1cmUgYWxsIHRoZSBhdHRyaWJ1dGVzIGFyZSB0aGVyZS4KKyAgICAgICAgbWVtYmVycyA9ICgnYnNpemUnLCAnZnJzaXplJywgJ2Jsb2NrcycsICdiZnJlZScsICdiYXZhaWwnLCAnZmlsZXMnLAorICAgICAgICAgICAgICAgICAgICAnZmZyZWUnLCAnZmF2YWlsJywgJ2ZsYWcnLCAnbmFtZW1heCcpCisgICAgICAgIGZvciB2YWx1ZSwgbWVtYmVyIGluIGVudW1lcmF0ZShtZW1iZXJzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihyZXN1bHQsICdmXycgKyBtZW1iZXIpLCByZXN1bHRbdmFsdWVdKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgYXNzaWdubWVudCByZWFsbHkgZmFpbHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0LmZfYmZyZWUgPSAxCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdC5wYXJyb3QgPSAxCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBVc2UgdGhlIGNvbnN0cnVjdG9yIHdpdGggYSB0b28tc2hvcnQgdHVwbGUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdDIgPSBvcy5zdGF0dmZzX3Jlc3VsdCgoMTAsKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHJhaXNlZCIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBVc2UgdGhlIGNvbnN0cnVjdG9yIHdpdGggYSB0b28tbG9uZyB0dXBsZS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0MiA9IG9zLnN0YXR2ZnNfcmVzdWx0KCgwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0KSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3V0aW1lX2RpcihzZWxmKToKKyAgICAgICAgZGVsdGEgPSAxMDAwMDAwCisgICAgICAgIHN0ID0gb3Muc3RhdCh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAjIHJvdW5kIHRvIGludCwgYmVjYXVzZSBzb21lIHN5c3RlbXMgbWF5IHN1cHBvcnQgc3ViLXNlY29uZAorICAgICAgICAjIHRpbWUgc3RhbXBzIGluIHN0YXQsIGJ1dCBub3QgaW4gdXRpbWUuCisgICAgICAgIG9zLnV0aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4sIChzdC5zdF9hdGltZSwgaW50KHN0LnN0X210aW1lLWRlbHRhKSkpCisgICAgICAgIHN0MiA9IG9zLnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdDIuc3RfbXRpbWUsIGludChzdC5zdF9tdGltZS1kZWx0YSkpCisKKyAgICAjIFJlc3RyaWN0IHRlc3QgdG8gV2luMzIsIHNpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSBvdGhlcgorICAgICMgc3lzdGVtcyBzdXBwb3J0IGNlbnRpc2Vjb25kcworICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICBkZWYgZ2V0X2ZpbGVfc3lzdGVtKHBhdGgpOgorICAgICAgICAgICAgcm9vdCA9IG9zLnBhdGguc3BsaXRkcml2ZShvcy5wYXRoLmFic3BhdGgocGF0aCkpWzBdICsgJ1xcJworICAgICAgICAgICAgaW1wb3J0IGN0eXBlcworICAgICAgICAgICAga2VybmVsMzIgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyCisgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIoIiIsIDEwMCkKKyAgICAgICAgICAgIGlmIGtlcm5lbDMyLkdldFZvbHVtZUluZm9ybWF0aW9uQShyb290LCBOb25lLCAwLCBOb25lLCBOb25lLCBOb25lLCBidWYsIGxlbihidWYpKToKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmLnZhbHVlCisKKyAgICAgICAgaWYgZ2V0X2ZpbGVfc3lzdGVtKHRlc3Rfc3VwcG9ydC5URVNURk4pID09ICJOVEZTIjoKKyAgICAgICAgICAgIGRlZiB0ZXN0XzE1NjUxNTAoc2VsZik6CisgICAgICAgICAgICAgICAgdDEgPSAxMTU5MTk1MDM5LjI1CisgICAgICAgICAgICAgICAgb3MudXRpbWUoc2VsZi5mbmFtZSwgKHQxLCB0MSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KHNlbGYuZm5hbWUpLnN0X210aW1lLCB0MSkKKworICAgICAgICAgICAgZGVmIHRlc3RfbGFyZ2VfdGltZShzZWxmKToKKyAgICAgICAgICAgICAgICB0MSA9IDUwMDAwMDAwMDAgIyBzb21lIGRheSBpbiAyMTI4CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAjTm90ZSBmYWlsIGlmIHRpbWVfdCBpcyAzMiBiaXQKKyAgICAgICAgICAgICAgICAgICAgb3MudXRpbWUoc2VsZi5mbmFtZSwgKHQxLCB0MSkpCisgICAgICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInJlcXVpcmVzIGF0IGxlYXN0IDY0LWJpdCB0aW1lX3QiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChzZWxmLmZuYW1lKS5zdF9tdGltZSwgdDEpCisKKyAgICAgICAgZGVmIHRlc3RfMTY4NjQ3NShzZWxmKToKKyAgICAgICAgICAgICMgVmVyaWZ5IHRoYXQgYW4gb3BlbiBmaWxlIGNhbiBiZSBzdGF0J2VkCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3Muc3RhdChyImM6XHBhZ2VmaWxlLnN5cyIpCisgICAgICAgICAgICBleGNlcHQgV2luZG93c0Vycm9yLCBlOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gMjogIyBmaWxlIGRvZXMgbm90IGV4aXN0OyBjYW5ub3QgcnVuIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJDb3VsZCBub3Qgc3RhdCBwYWdlZmlsZS5zeXMiKQorCitmcm9tIHRlc3QgaW1wb3J0IG1hcHBpbmdfdGVzdHMKKworY2xhc3MgRW52aXJvblRlc3RzKG1hcHBpbmdfdGVzdHMuQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sKToKKyAgICAiIiJjaGVjayB0aGF0IG9zLmVudmlyb24gb2JqZWN0IGNvbmZvcm0gdG8gbWFwcGluZyBwcm90b2NvbCIiIgorICAgIHR5cGUydGVzdCA9IE5vbmUKKyAgICBkZWYgX3JlZmVyZW5jZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHsiS0VZMSI6IlZBTFVFMSIsICJLRVkyIjoiVkFMVUUyIiwgIktFWTMiOiJWQUxVRTMifQorICAgIGRlZiBfZW1wdHlfbWFwcGluZyhzZWxmKToKKyAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCisgICAgICAgIHJldHVybiBvcy5lbnZpcm9uCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9fc2F2ZSA9IGRpY3Qob3MuZW52aXJvbikKKyAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBvcy5lbnZpcm9uLmNsZWFyKCkKKyAgICAgICAgb3MuZW52aXJvbi51cGRhdGUoc2VsZi5fX3NhdmUpCisKKyAgICAjIEJ1ZyAxMTEwNDc4CisgICAgZGVmIHRlc3RfdXBkYXRlMihzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoIi9iaW4vc2giKToKKyAgICAgICAgICAgIG9zLmVudmlyb24udXBkYXRlKEhFTExPPSJXb3JsZCIpCisgICAgICAgICAgICB3aXRoIG9zLnBvcGVuKCIvYmluL3NoIC1jICdlY2hvICRIRUxMTyciKSBhcyBwb3BlbjoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHBvcGVuLnJlYWQoKS5zdHJpcCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgIldvcmxkIikKKworICAgICMgT24gRnJlZUJTRCA8IDcgYW5kIE9TIFggPCAxMC42LCB1bnNldGVudigpIGRvZXNuJ3QgcmV0dXJuIGEgdmFsdWUgKGlzc3VlCisgICAgIyAjMTM0MTUpLgorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoKCdmcmVlYnNkJywgJ2RhcndpbicpKSwKKyAgICAgICAgICAgICAgICAgICAgICJkdWUgdG8ga25vd24gT1MgYnVnOiBzZWUgaXNzdWUgIzEzNDE1IikKKyAgICBkZWYgdGVzdF91bnNldF9lcnJvcihzZWxmKToKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgICAgICAgICAjIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGxpbWl0ZWQgdG8gMzIsNzY3IGNoYXJhY3RlcnMKKyAgICAgICAgICAgIGtleSA9ICd4JyAqIDUwMDAwCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcy5lbnZpcm9uLl9fZGVsaXRlbV9fLCBrZXkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjICI9IiBpcyBub3QgYWxsb3dlZCBpbiBhIHZhcmlhYmxlIG5hbWUKKyAgICAgICAgICAgIGtleSA9ICdrZXk9JworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3MuZW52aXJvbi5fX2RlbGl0ZW1fXywga2V5KQorCitjbGFzcyBXYWxrVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciBvcy53YWxrKCkuIiIiCisKKyAgICBkZWYgdGVzdF90cmF2ZXJzYWwoc2VsZik6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBmcm9tIG9zLnBhdGggaW1wb3J0IGpvaW4KKworICAgICAgICAjIEJ1aWxkOgorICAgICAgICAjICAgICBURVNURk4vCisgICAgICAgICMgICAgICAgVEVTVDEvICAgICAgICAgICAgICBhIGZpbGUga2lkIGFuZCB0d28gZGlyZWN0b3J5IGtpZHMKKyAgICAgICAgIyAgICAgICAgIHRtcDEKKyAgICAgICAgIyAgICAgICAgIFNVQjEvICAgICAgICAgICAgIGEgZmlsZSBraWQgYW5kIGEgZGlyZWN0b3J5IGtpZAorICAgICAgICAjICAgICAgICAgICB0bXAyCisgICAgICAgICMgICAgICAgICAgIFNVQjExLyAgICAgICAgICBubyBraWRzCisgICAgICAgICMgICAgICAgICBTVUIyLyAgICAgICAgICAgICBhIGZpbGUga2lkIGFuZCBhIGRpcnN5bWxpbmsga2lkCisgICAgICAgICMgICAgICAgICAgIHRtcDMKKyAgICAgICAgIyAgICAgICAgICAgbGluay8gICAgICAgICAgIGEgc3ltbGluayB0byBURVNURk4uMgorICAgICAgICAjICAgICAgIFRFU1QyLworICAgICAgICAjICAgICAgICAgdG1wNCAgICAgICAgICAgICAgYSBsb25lIGZpbGUKKyAgICAgICAgd2Fsa19wYXRoID0gam9pbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAiVEVTVDEiKQorICAgICAgICBzdWIxX3BhdGggPSBqb2luKHdhbGtfcGF0aCwgIlNVQjEiKQorICAgICAgICBzdWIxMV9wYXRoID0gam9pbihzdWIxX3BhdGgsICJTVUIxMSIpCisgICAgICAgIHN1YjJfcGF0aCA9IGpvaW4od2Fsa19wYXRoLCAiU1VCMiIpCisgICAgICAgIHRtcDFfcGF0aCA9IGpvaW4od2Fsa19wYXRoLCAidG1wMSIpCisgICAgICAgIHRtcDJfcGF0aCA9IGpvaW4oc3ViMV9wYXRoLCAidG1wMiIpCisgICAgICAgIHRtcDNfcGF0aCA9IGpvaW4oc3ViMl9wYXRoLCAidG1wMyIpCisgICAgICAgIGxpbmtfcGF0aCA9IGpvaW4oc3ViMl9wYXRoLCAibGluayIpCisgICAgICAgIHQyX3BhdGggPSBqb2luKHRlc3Rfc3VwcG9ydC5URVNURk4sICJURVNUMiIpCisgICAgICAgIHRtcDRfcGF0aCA9IGpvaW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIlRFU1QyIiwgInRtcDQiKQorCisgICAgICAgICMgQ3JlYXRlIHN0dWZmLgorICAgICAgICBvcy5tYWtlZGlycyhzdWIxMV9wYXRoKQorICAgICAgICBvcy5tYWtlZGlycyhzdWIyX3BhdGgpCisgICAgICAgIG9zLm1ha2VkaXJzKHQyX3BhdGgpCisgICAgICAgIGZvciBwYXRoIGluIHRtcDFfcGF0aCwgdG1wMl9wYXRoLCB0bXAzX3BhdGgsIHRtcDRfcGF0aDoKKyAgICAgICAgICAgIGYgPSBmaWxlKHBhdGgsICJ3IikKKyAgICAgICAgICAgIGYud3JpdGUoIkknbSAiICsgcGF0aCArICIgYW5kIHByb3VkIG9mIGl0LiAgQmxhbWUgdGVzdF9vcy5cbiIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKKyAgICAgICAgICAgIG9zLnN5bWxpbmsob3MucGF0aC5hYnNwYXRoKHQyX3BhdGgpLCBsaW5rX3BhdGgpCisgICAgICAgICAgICBzdWIyX3RyZWUgPSAoc3ViMl9wYXRoLCBbImxpbmsiXSwgWyJ0bXAzIl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdWIyX3RyZWUgPSAoc3ViMl9wYXRoLCBbXSwgWyJ0bXAzIl0pCisKKyAgICAgICAgIyBXYWxrIHRvcC1kb3duLgorICAgICAgICBhbGwgPSBsaXN0KG9zLndhbGsod2Fsa19wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYWxsKSwgNCkKKyAgICAgICAgIyBXZSBjYW4ndCBrbm93IHdoaWNoIG9yZGVyIFNVQjEgYW5kIFNVQjIgd2lsbCBhcHBlYXIgaW4uCisgICAgICAgICMgTm90IGZsaXBwZWQ6ICBURVNURk4sIFNVQjEsIFNVQjExLCBTVUIyCisgICAgICAgICMgICAgIGZsaXBwZWQ6ICBURVNURk4sIFNVQjIsIFNVQjEsIFNVQjExCisgICAgICAgIGZsaXBwZWQgPSBhbGxbMF1bMV1bMF0gIT0gIlNVQjEiCisgICAgICAgIGFsbFswXVsxXS5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxbMF0sICh3YWxrX3BhdGgsIFsiU1VCMSIsICJTVUIyIl0sIFsidG1wMSJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxbMSArIGZsaXBwZWRdLCAoc3ViMV9wYXRoLCBbIlNVQjExIl0sIFsidG1wMiJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxbMiArIGZsaXBwZWRdLCAoc3ViMTFfcGF0aCwgW10sIFtdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxbMyAtIDIgKiBmbGlwcGVkXSwgc3ViMl90cmVlKQorCisgICAgICAgICMgUHJ1bmUgdGhlIHNlYXJjaC4KKyAgICAgICAgYWxsID0gW10KKyAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsod2Fsa19wYXRoKToKKyAgICAgICAgICAgIGFsbC5hcHBlbmQoKHJvb3QsIGRpcnMsIGZpbGVzKSkKKyAgICAgICAgICAgICMgRG9uJ3QgZGVzY2VuZCBpbnRvIFNVQjEuCisgICAgICAgICAgICBpZiAnU1VCMScgaW4gZGlyczoKKyAgICAgICAgICAgICAgICAjIE5vdGUgdGhhdCB0aGlzIGFsc28gbXV0YXRlcyB0aGUgZGlycyB3ZSBhcHBlbmRlZCB0byBhbGwhCisgICAgICAgICAgICAgICAgZGlycy5yZW1vdmUoJ1NVQjEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhbGwpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbFswXSwgKHdhbGtfcGF0aCwgWyJTVUIyIl0sIFsidG1wMSJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxbMV0sIHN1YjJfdHJlZSkKKworICAgICAgICAjIFdhbGsgYm90dG9tLXVwLgorICAgICAgICBhbGwgPSBsaXN0KG9zLndhbGsod2Fsa19wYXRoLCB0b3Bkb3duPUZhbHNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYWxsKSwgNCkKKyAgICAgICAgIyBXZSBjYW4ndCBrbm93IHdoaWNoIG9yZGVyIFNVQjEgYW5kIFNVQjIgd2lsbCBhcHBlYXIgaW4uCisgICAgICAgICMgTm90IGZsaXBwZWQ6ICBTVUIxMSwgU1VCMSwgU1VCMiwgVEVTVEZOCisgICAgICAgICMgICAgIGZsaXBwZWQ6ICBTVUIyLCBTVUIxMSwgU1VCMSwgVEVTVEZOCisgICAgICAgIGZsaXBwZWQgPSBhbGxbM11bMV1bMF0gIT0gIlNVQjEiCisgICAgICAgIGFsbFszXVsxXS5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxbM10sICh3YWxrX3BhdGgsIFsiU1VCMSIsICJTVUIyIl0sIFsidG1wMSJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxbZmxpcHBlZF0sIChzdWIxMV9wYXRoLCBbXSwgW10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbFtmbGlwcGVkICsgMV0sIChzdWIxX3BhdGgsIFsiU1VCMTEiXSwgWyJ0bXAyIl0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbFsyIC0gMiAqIGZsaXBwZWRdLCBzdWIyX3RyZWUpCisKKyAgICAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKKyAgICAgICAgICAgICMgV2FsaywgZm9sbG93aW5nIHN5bWxpbmtzLgorICAgICAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsod2Fsa19wYXRoLCBmb2xsb3dsaW5rcz1UcnVlKToKKyAgICAgICAgICAgICAgICBpZiByb290ID09IGxpbmtfcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXJzLCBbXSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlcywgWyJ0bXA0Il0pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IGZvbGxvdyBzeW1saW5rIHdpdGggZm9sbG93bGlua3M9VHJ1ZSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICMgVGVhciBldmVyeXRoaW5nIGRvd24uICBUaGlzIGlzIGEgZGVjZW50IHVzZSBmb3IgYm90dG9tLXVwIG9uCisgICAgICAgICMgV2luZG93cywgd2hpY2ggZG9lc24ndCBoYXZlIGEgcmVjdXJzaXZlIGRlbGV0ZSBjb21tYW5kLiAgVGhlCisgICAgICAgICMgKG5vdCBzbykgc3VidGxldHkgaXMgdGhhdCBybWRpciB3aWxsIGZhaWwgdW5sZXNzIHRoZSBkaXIncworICAgICAgICAjIGtpZHMgYXJlIHJlbW92ZWQgZmlyc3QsIHNvIGJvdHRvbSB1cCBpcyBlc3NlbnRpYWwuCisgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHRlc3Rfc3VwcG9ydC5URVNURk4sIHRvcGRvd249RmFsc2UpOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihyb290LCBuYW1lKSkKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGRpcnM6CisgICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbihyb290LCBuYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzbGluayhkaXJuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZGlybmFtZSkKKyAgICAgICAgb3Mucm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKworY2xhc3MgTWFrZWRpclRlc3RzICh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBvcy5ta2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfbWFrZWRpcihzZWxmKToKKyAgICAgICAgYmFzZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLCAnZGlyMScsICdkaXIyJywgJ2RpcjMnKQorICAgICAgICBvcy5tYWtlZGlycyhwYXRoKSAgICAgICAgICAgICAjIFNob3VsZCB3b3JrCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgJ2RpcjEnLCAnZGlyMicsICdkaXIzJywgJ2RpcjQnKQorICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQorCisgICAgICAgICMgVHJ5IHBhdGhzIHdpdGggYSAnLicgaW4gdGhlbQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5tYWtlZGlycywgb3MuY3VyZGlyKQorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsICdkaXIxJywgJ2RpcjInLCAnZGlyMycsICdkaXI0JywgJ2RpcjUnLCBvcy5jdXJkaXIpCisgICAgICAgIG9zLm1ha2VkaXJzKHBhdGgpCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgJ2RpcjEnLCBvcy5jdXJkaXIsICdkaXIyJywgJ2RpcjMnLCAnZGlyNCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpcjUnLCAnZGlyNicpCisgICAgICAgIG9zLm1ha2VkaXJzKHBhdGgpCisKKworCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ2RpcjEnLCAnZGlyMicsICdkaXIzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlyNCcsICdkaXI1JywgJ2RpcjYnKQorICAgICAgICAjIElmIHRoZSB0ZXN0cyBmYWlsZWQsIHRoZSBib3R0b20tbW9zdCBkaXJlY3RvcnkgKCcuLi9kaXI2JykKKyAgICAgICAgIyBtYXkgbm90IGhhdmUgYmVlbiBjcmVhdGVkLCBzbyB3ZSBsb29rIGZvciB0aGUgb3V0ZXJtb3N0IGRpcmVjdG9yeQorICAgICAgICAjIHRoYXQgZXhpc3RzLgorICAgICAgICB3aGlsZSBub3Qgb3MucGF0aC5leGlzdHMocGF0aCkgYW5kIHBhdGggIT0gdGVzdF9zdXBwb3J0LlRFU1RGTjoKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKKworICAgICAgICBvcy5yZW1vdmVkaXJzKHBhdGgpCisKK2NsYXNzIERldk51bGxUZXN0cyAodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2Rldm51bGwoc2VsZik6CisgICAgICAgIGYgPSBmaWxlKG9zLmRldm51bGwsICd3JykKKyAgICAgICAgZi53cml0ZSgnaGVsbG8nKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZiA9IGZpbGUob3MuZGV2bnVsbCwgJ3InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAnJykKKyAgICAgICAgZi5jbG9zZSgpCisKK2NsYXNzIFVSYW5kb21UZXN0cyAodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdXJhbmRvbV9sZW5ndGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9zLnVyYW5kb20oMCkpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvcy51cmFuZG9tKDEpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3MudXJhbmRvbSgxMCkpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3MudXJhbmRvbSgxMDApKSwgMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvcy51cmFuZG9tKDEwMDApKSwgMTAwMCkKKworICAgIGRlZiB0ZXN0X3VyYW5kb21fdmFsdWUoc2VsZik6CisgICAgICAgIGRhdGExID0gb3MudXJhbmRvbSgxNikKKyAgICAgICAgZGF0YTIgPSBvcy51cmFuZG9tKDE2KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGRhdGExLCBkYXRhMikKKworICAgIGRlZiBnZXRfdXJhbmRvbV9zdWJwcm9jZXNzKHNlbGYsIGNvdW50KToKKyAgICAgICAgIyBXZSBuZWVkIHRvIHVzZSByZXByKCkgYW5kIGV2YWwoKSB0byBhdm9pZCBsaW5lIGVuZGluZyBjb252ZXJzaW9ucworICAgICAgICAjIHVuZGVyIFdpbmRvd3MuCisgICAgICAgIGNvZGUgPSAnXG4nLmpvaW4oKAorICAgICAgICAgICAgJ2ltcG9ydCBvcywgc3lzJywKKyAgICAgICAgICAgICdkYXRhID0gb3MudXJhbmRvbSglcyknICUgY291bnQsCisgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZShyZXByKGRhdGEpKScsCisgICAgICAgICAgICAnc3lzLnN0ZG91dC5mbHVzaCgpJywKKyAgICAgICAgICAgICdwcmludCA+PiBzeXMuc3RkZXJyLCAobGVuKGRhdGEpLCBkYXRhKScpKQorICAgICAgICBjbWRfbGluZSA9IFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgY29kZV0KKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kX2xpbmUsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgb3V0LCBlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLndhaXQoKSwgMCwgKHAud2FpdCgpLCBlcnIpKQorICAgICAgICBvdXQgPSBldmFsKG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3V0KSwgY291bnQsIGVycikKKyAgICAgICAgcmV0dXJuIG91dAorCisgICAgZGVmIHRlc3RfdXJhbmRvbV9zdWJwcm9jZXNzKHNlbGYpOgorICAgICAgICBkYXRhMSA9IHNlbGYuZ2V0X3VyYW5kb21fc3VicHJvY2VzcygxNikKKyAgICAgICAgZGF0YTIgPSBzZWxmLmdldF91cmFuZG9tX3N1YnByb2Nlc3MoMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZGF0YTEsIGRhdGEyKQorCisgICAgZGVmIHRlc3RfZXhlY3ZwZV93aXRoX2JhZF9hcmdsaXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcy5leGVjdnBlLCAnbm90ZXBhZCcsIFtdLCBOb25lKQorCitjbGFzcyBXaW4zMkVycm9yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3JlbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCBvcy5yZW5hbWUsIHRlc3Rfc3VwcG9ydC5URVNURk4sIHRlc3Rfc3VwcG9ydC5URVNURk4rIi5iYWsiKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsIG9zLnJlbW92ZSwgdGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2NoZGlyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsIG9zLmNoZGlyLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfbWtkaXIoc2VsZik6CisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCBvcy5ta2RpciwgdGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF91dGltZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCBvcy51dGltZSwgdGVzdF9zdXBwb3J0LlRFU1RGTiwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2NobW9kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsIG9zLmNobW9kLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCAwKQorCitjbGFzcyBUZXN0SW52YWxpZEZEKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBzaW5nbGVzID0gWyJmY2hkaXIiLCAiZmRvcGVuIiwgImR1cCIsICJmZGF0YXN5bmMiLCAiZnN0YXQiLAorICAgICAgICAgICAgICAgImZzdGF0dmZzIiwgImZzeW5jIiwgInRjZ2V0cGdycCIsICJ0dHluYW1lIl0KKyAgICAjc2luZ2xlcy5hcHBlbmQoImNsb3NlIikKKyAgICAjV2Ugb21pdCBjbG9zZSBiZWNhdXNlIGl0IGRvZXNuJ3IgcmFpc2UgYW4gZXhjZXB0aW9uIG9uIHNvbWUgcGxhdGZvcm1zCisgICAgZGVmIGdldF9zaW5nbGUoZik6CisgICAgICAgIGRlZiBoZWxwZXIoc2VsZik6CisgICAgICAgICAgICBpZiAgaGFzYXR0cihvcywgZik6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVjayhnZXRhdHRyKG9zLCBmKSkKKyAgICAgICAgcmV0dXJuIGhlbHBlcgorICAgIGZvciBmIGluIHNpbmdsZXM6CisgICAgICAgIGxvY2FscygpWyJ0ZXN0XyIrZl0gPSBnZXRfc2luZ2xlKGYpCisKKyAgICBkZWYgY2hlY2soc2VsZiwgZiwgKmFyZ3MpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmKHRlc3Rfc3VwcG9ydC5tYWtlX2JhZF9mZCgpLCAqYXJncykKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lcnJubywgZXJybm8uRUJBREYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIiVyIGRpZG4ndCByYWlzZSBhIE9TRXJyb3Igd2l0aCBhIGJhZCBmaWxlIGRlc2NyaXB0b3IiCisgICAgICAgICAgICAgICAgICAgICAgJSBmKQorCisgICAgZGVmIHRlc3RfaXNhdHR5KHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAiaXNhdHR5Iik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmlzYXR0eSh0ZXN0X3N1cHBvcnQubWFrZV9iYWRfZmQoKSksIEZhbHNlKQorCisgICAgZGVmIHRlc3RfY2xvc2VyYW5nZShzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihvcywgImNsb3NlcmFuZ2UiKToKKyAgICAgICAgICAgIGZkID0gdGVzdF9zdXBwb3J0Lm1ha2VfYmFkX2ZkKCkKKyAgICAgICAgICAgICMgTWFrZSBzdXJlIG5vbmUgb2YgdGhlIGRlc2NyaXB0b3JzIHdlIGFyZSBhYm91dCB0byBjbG9zZSBhcmUKKyAgICAgICAgICAgICMgY3VycmVudGx5IHZhbGlkIChpc3N1ZSA2NTQyKS4KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgICAgICB0cnk6IG9zLmZzdGF0KGZkK2kpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgaSA8IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gYWNxdWlyZSBhIHJhbmdlIG9mIGludmFsaWQgZmlsZSBkZXNjcmlwdG9ycyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmNsb3NlcmFuZ2UoZmQsIGZkICsgaS0xKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2R1cDIoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIob3MsICJkdXAyIik6CisgICAgICAgICAgICBzZWxmLmNoZWNrKG9zLmR1cDIsIDIwKQorCisgICAgZGVmIHRlc3RfZmNobW9kKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAiZmNobW9kIik6CisgICAgICAgICAgICBzZWxmLmNoZWNrKG9zLmZjaG1vZCwgMCkKKworICAgIGRlZiB0ZXN0X2ZjaG93bihzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihvcywgImZjaG93biIpOgorICAgICAgICAgICAgc2VsZi5jaGVjayhvcy5mY2hvd24sIC0xLCAtMSkKKworICAgIGRlZiB0ZXN0X2ZwYXRoY29uZihzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihvcywgImZwYXRoY29uZiIpOgorICAgICAgICAgICAgc2VsZi5jaGVjayhvcy5mcGF0aGNvbmYsICJQQ19OQU1FX01BWCIpCisKKyAgICBkZWYgdGVzdF9mdHJ1bmNhdGUoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIob3MsICJmdHJ1bmNhdGUiKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2sob3MuZnRydW5jYXRlLCAwKQorCisgICAgZGVmIHRlc3RfbHNlZWsoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIob3MsICJsc2VlayIpOgorICAgICAgICAgICAgc2VsZi5jaGVjayhvcy5sc2VlaywgMCwgMCkKKworICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIob3MsICJyZWFkIik6CisgICAgICAgICAgICBzZWxmLmNoZWNrKG9zLnJlYWQsIDEpCisKKyAgICBkZWYgdGVzdF90Y3NldHBncnB0KHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAidGNzZXRwZ3JwIik6CisgICAgICAgICAgICBzZWxmLmNoZWNrKG9zLnRjc2V0cGdycCwgMCkKKworICAgIGRlZiB0ZXN0X3dyaXRlKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAid3JpdGUiKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2sob3Mud3JpdGUsICIgIikKKworaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6CisgICAgY2xhc3MgV2luMzJFcnJvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgcGFzcworCisgICAgY2xhc3MgUG9zaXhVaWRHaWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgIGlmIGhhc2F0dHIob3MsICdzZXR1aWQnKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X3NldHVpZChzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBvcy5nZXR1aWQoKSAhPSAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhvcy5lcnJvciwgb3Muc2V0dWlkLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9zLnNldHVpZCwgMTw8MzIpCisKKyAgICAgICAgaWYgaGFzYXR0cihvcywgJ3NldGdpZCcpOgorICAgICAgICAgICAgZGVmIHRlc3Rfc2V0Z2lkKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIG9zLmdldHVpZCgpICE9IDA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG9zLmVycm9yLCBvcy5zZXRnaWQsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgb3Muc2V0Z2lkLCAxPDwzMikKKworICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc2V0ZXVpZCcpOgorICAgICAgICAgICAgZGVmIHRlc3Rfc2V0ZXVpZChzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBvcy5nZXR1aWQoKSAhPSAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhvcy5lcnJvciwgb3Muc2V0ZXVpZCwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcy5zZXRldWlkLCAxPDwzMikKKworICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc2V0ZWdpZCcpOgorICAgICAgICAgICAgZGVmIHRlc3Rfc2V0ZWdpZChzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBvcy5nZXR1aWQoKSAhPSAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhvcy5lcnJvciwgb3Muc2V0ZWdpZCwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcy5zZXRlZ2lkLCAxPDwzMikKKworICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc2V0cmV1aWQnKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X3NldHJldWlkKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIG9zLmdldHVpZCgpICE9IDA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG9zLmVycm9yLCBvcy5zZXRyZXVpZCwgMCwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcy5zZXRyZXVpZCwgMTw8MzIsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgb3Muc2V0cmV1aWQsIDAsIDE8PDMyKQorCisgICAgICAgICAgICBkZWYgdGVzdF9zZXRyZXVpZF9uZWcxKHNlbGYpOgorICAgICAgICAgICAgICAgICMgTmVlZHMgdG8gYWNjZXB0IC0xLiAgV2UgcnVuIHRoaXMgaW4gYSBzdWJwcm9jZXNzIHRvIGF2b2lkCisgICAgICAgICAgICAgICAgIyBhbHRlcmluZyB0aGUgdGVzdCBydW5uZXIncyBwcm9jZXNzIHN0YXRlIChpc3N1ZTgwNDUpLgorICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbCisgICAgICAgICAgICAgICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSwgJy1jJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgb3Msc3lzO29zLnNldHJldWlkKC0xLC0xKTtzeXMuZXhpdCgwKSddKQorCisgICAgICAgIGlmIGhhc2F0dHIob3MsICdzZXRyZWdpZCcpOgorICAgICAgICAgICAgZGVmIHRlc3Rfc2V0cmVnaWQoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgb3MuZ2V0dWlkKCkgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMob3MuZXJyb3IsIG9zLnNldHJlZ2lkLCAwLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9zLnNldHJlZ2lkLCAxPDwzMiwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcy5zZXRyZWdpZCwgMCwgMTw8MzIpCisKKyAgICAgICAgICAgIGRlZiB0ZXN0X3NldHJlZ2lkX25lZzEoc2VsZik6CisgICAgICAgICAgICAgICAgIyBOZWVkcyB0byBhY2NlcHQgLTEuICBXZSBydW4gdGhpcyBpbiBhIHN1YnByb2Nlc3MgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAjIGFsdGVyaW5nIHRoZSB0ZXN0IHJ1bm5lcidzIHByb2Nlc3Mgc3RhdGUgKGlzc3VlODA0NSkuCisgICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlLCAnLWMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBvcyxzeXM7b3Muc2V0cmVnaWQoLTEsLTEpO3N5cy5leGl0KDApJ10pCitlbHNlOgorICAgIGNsYXNzIFBvc2l4VWlkR2lkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBwYXNzCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiV2luMzIgc3BlY2lmaWMgdGVzdHMiKQorY2xhc3MgV2luMzJLaWxsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBfa2lsbChzZWxmLCBzaWcpOgorICAgICAgICAjIFN0YXJ0IHN5cy5leGVjdXRhYmxlIGFzIGEgc3VicHJvY2VzcyBhbmQgY29tbXVuaWNhdGUgZnJvbSB0aGUKKyAgICAgICAgIyBzdWJwcm9jZXNzIHRvIHRoZSBwYXJlbnQgdGhhdCB0aGUgaW50ZXJwcmV0ZXIgaXMgcmVhZHkuIFdoZW4gaXQKKyAgICAgICAgIyBiZWNvbWVzIHJlYWR5LCBzZW5kICpzaWcqIHZpYSBvcy5raWxsIHRvIHRoZSBzdWJwcm9jZXNzIGFuZCBjaGVjaworICAgICAgICAjIHRoYXQgdGhlIHJldHVybiBjb2RlIGlzIGVxdWFsIHRvICpzaWcqLgorICAgICAgICBpbXBvcnQgY3R5cGVzCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW50eXBlcworICAgICAgICBpbXBvcnQgbXN2Y3J0CisKKyAgICAgICAgIyBTaW5jZSB3ZSBjYW4ndCBhY2Nlc3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9jZXNzJyBzdGRvdXQgdW50aWwgdGhlCisgICAgICAgICMgcHJvY2VzcyBoYXMgZXhpdGVkLCB1c2UgUGVla05hbWVkUGlwZSB0byBzZWUgd2hhdCdzIGluc2lkZSBzdGRvdXQKKyAgICAgICAgIyB3aXRob3V0IHdhaXRpbmcuIFRoaXMgaXMgZG9uZSBzbyB3ZSBjYW4gdGVsbCB0aGF0IHRoZSBpbnRlcnByZXRlcgorICAgICAgICAjIGlzIHN0YXJ0ZWQgYW5kIHJ1bm5pbmcgYXQgYSBwb2ludCB3aGVyZSBpdCBjb3VsZCBoYW5kbGUgYSBzaWduYWwuCisgICAgICAgIFBlZWtOYW1lZFBpcGUgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLlBlZWtOYW1lZFBpcGUKKyAgICAgICAgUGVla05hbWVkUGlwZS5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAorICAgICAgICBQZWVrTmFtZWRQaXBlLmFyZ3R5cGVzID0gKHdpbnR5cGVzLkhBTkRMRSwgIyBQaXBlIGhhbmRsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlcy5QT0lOVEVSKGN0eXBlcy5jX2NoYXIpLCAjIHN0ZG91dCBidWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW50eXBlcy5EV09SRCwgIyBCdWZmZXIgc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlcy5QT0lOVEVSKHdpbnR5cGVzLkRXT1JEKSwgIyBieXRlcyByZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVzLlBPSU5URVIod2ludHlwZXMuRFdPUkQpLCAjIGJ5dGVzIGF2YWlsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGVzLlBPSU5URVIod2ludHlwZXMuRFdPUkQpKSAjIGJ5dGVzIGxlZnQKKyAgICAgICAgbXNnID0gInJ1bm5pbmciCisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXMuc3Rkb3V0LndyaXRlKCd7fScpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXMuc3Rkb3V0LmZsdXNoKCk7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0KCkiLmZvcm1hdChtc2cpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocHJvYy5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwcm9jLnN0ZGVyci5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHByb2Muc3RkaW4uY2xvc2UpCisKKyAgICAgICAgY291bnQsIG1heCA9IDAsIDEwMAorICAgICAgICB3aGlsZSBjb3VudCA8IG1heCBhbmQgcHJvYy5wb2xsKCkgaXMgTm9uZToKKyAgICAgICAgICAgICMgQ3JlYXRlIGEgc3RyaW5nIGJ1ZmZlciB0byBzdG9yZSB0aGUgcmVzdWx0IG9mIHN0ZG91dCBmcm9tIHRoZSBwaXBlCisgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIobGVuKG1zZykpCisgICAgICAgICAgICAjIE9idGFpbiB0aGUgdGV4dCBjdXJyZW50bHkgaW4gcHJvYy5zdGRvdXQKKyAgICAgICAgICAgICMgQnl0ZXMgcmVhZC9hdmFpbC9sZWZ0IGFyZSBsZWZ0IGFzIE5VTEwgYW5kIHVudXNlZAorICAgICAgICAgICAgcnNsdCA9IFBlZWtOYW1lZFBpcGUobXN2Y3J0LmdldF9vc2ZoYW5kbGUocHJvYy5zdGRvdXQuZmlsZW5vKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBjdHlwZXMuc2l6ZW9mKGJ1ZiksIE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJzbHQsIDAsICJQZWVrTmFtZWRQaXBlIGZhaWxlZCIpCisgICAgICAgICAgICBpZiBidWYudmFsdWU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIGJ1Zi52YWx1ZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZCBub3QgcmVjZWl2ZSBjb21tdW5pY2F0aW9uIGZyb20gdGhlIHN1YnByb2Nlc3MiKQorCisgICAgICAgIG9zLmtpbGwocHJvYy5waWQsIHNpZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9jLndhaXQoKSwgc2lnKQorCisgICAgZGVmIHRlc3Rfa2lsbF9zaWd0ZXJtKHNlbGYpOgorICAgICAgICAjIFNJR1RFUk0gZG9lc24ndCBtZWFuIGFueXRoaW5nIHNwZWNpYWwsIGJ1dCBtYWtlIHN1cmUgaXQgd29ya3MKKyAgICAgICAgc2VsZi5fa2lsbChzaWduYWwuU0lHVEVSTSkKKworICAgIGRlZiB0ZXN0X2tpbGxfaW50KHNlbGYpOgorICAgICAgICAjIG9zLmtpbGwgb24gV2luZG93cyBjYW4gdGFrZSBhbiBpbnQgd2hpY2ggZ2V0cyBzZXQgYXMgdGhlIGV4aXQgY29kZQorICAgICAgICBzZWxmLl9raWxsKDEwMCkKKworICAgIGRlZiBfa2lsbF93aXRoX2V2ZW50KHNlbGYsIGV2ZW50LCBuYW1lKToKKyAgICAgICAgdGFnbmFtZSA9ICJ0ZXN0X29zXyVzIiAlIHV1aWQudXVpZDEoKQorICAgICAgICBtID0gbW1hcC5tbWFwKC0xLCAxLCB0YWduYW1lKQorICAgICAgICBtWzBdID0gJzAnCisgICAgICAgICMgUnVuIGEgc2NyaXB0IHdoaWNoIGhhcyBjb25zb2xlIGNvbnRyb2wgaGFuZGxpbmcgZW5hYmxlZC4KKyAgICAgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAorICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2luX2NvbnNvbGVfaGFuZGxlci5weSIpLCB0YWduYW1lXSwKKyAgICAgICAgICAgICAgICAgICBjcmVhdGlvbmZsYWdzPXN1YnByb2Nlc3MuQ1JFQVRFX05FV19QUk9DRVNTX0dST1VQKQorICAgICAgICAjIExldCB0aGUgaW50ZXJwcmV0ZXIgc3RhcnR1cCBiZWZvcmUgd2Ugc2VuZCBzaWduYWxzLiBTZWUgIzMxMzcuCisgICAgICAgIGNvdW50LCBtYXggPSAwLCAyMAorICAgICAgICB3aGlsZSBjb3VudCA8IG1heCBhbmQgcHJvYy5wb2xsKCkgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIG1bMF0gPT0gJzEnOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuNSkKKyAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU3VicHJvY2VzcyBkaWRuJ3QgZmluaXNoIGluaXRpYWxpemF0aW9uIikKKyAgICAgICAgb3Mua2lsbChwcm9jLnBpZCwgZXZlbnQpCisgICAgICAgICMgcHJvYy5zZW5kX3NpZ25hbChldmVudCkgY291bGQgYWxzbyBiZSBkb25lIGhlcmUuCisgICAgICAgICMgQWxsb3cgdGltZSBmb3IgdGhlIHNpZ25hbCB0byBiZSBwYXNzZWQgYW5kIHRoZSBwcm9jZXNzIHRvIGV4aXQuCisgICAgICAgIHRpbWUuc2xlZXAoMC41KQorICAgICAgICBpZiBub3QgcHJvYy5wb2xsKCk6CisgICAgICAgICAgICAjIEZvcmNlZnVsbHkga2lsbCB0aGUgcHJvY2VzcyBpZiB3ZSB3ZXJlbid0IGFibGUgdG8gc2lnbmFsIGl0LgorICAgICAgICAgICAgb3Mua2lsbChwcm9jLnBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic3VicHJvY2VzcyBkaWQgbm90IHN0b3Agb24ge30iLmZvcm1hdChuYW1lKSkKKworICAgIEB1bml0dGVzdC5za2lwKCJzdWJwcm9jZXNzZXMgYXJlbid0IGluaGVyaXRpbmcgQ1RSTCtDIHByb3BlcnR5IikKKyAgICBkZWYgdGVzdF9DVFJMX0NfRVZFTlQoc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW50eXBlcworICAgICAgICBpbXBvcnQgY3R5cGVzCisKKyAgICAgICAgIyBNYWtlIGEgTlVMTCB2YWx1ZSBieSBjcmVhdGluZyBhIHBvaW50ZXIgd2l0aCBubyBhcmd1bWVudC4KKyAgICAgICAgTlVMTCA9IGN0eXBlcy5QT0lOVEVSKGN0eXBlcy5jX2ludCkoKQorICAgICAgICBTZXRDb25zb2xlQ3RybEhhbmRsZXIgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLlNldENvbnNvbGVDdHJsSGFuZGxlcgorICAgICAgICBTZXRDb25zb2xlQ3RybEhhbmRsZXIuYXJndHlwZXMgPSAoY3R5cGVzLlBPSU5URVIoY3R5cGVzLmNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbnR5cGVzLkJPT0wpCisgICAgICAgIFNldENvbnNvbGVDdHJsSGFuZGxlci5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAorCisgICAgICAgICMgQ2FsbGluZyB0aGlzIHdpdGggTlVMTCBhbmQgRkFMU0UgY2F1c2VzIHRoZSBjYWxsaW5nIHByb2Nlc3MgdG8KKyAgICAgICAgIyBoYW5kbGUgQ1RSTCtDLCByYXRoZXIgdGhhbiBpZ25vcmUgaXQuIFRoaXMgcHJvcGVydHkgaXMgaW5oZXJpdGVkCisgICAgICAgICMgYnkgc3VicHJvY2Vzc2VzLgorICAgICAgICBTZXRDb25zb2xlQ3RybEhhbmRsZXIoTlVMTCwgMCkKKworICAgICAgICBzZWxmLl9raWxsX3dpdGhfZXZlbnQoc2lnbmFsLkNUUkxfQ19FVkVOVCwgIkNUUkxfQ19FVkVOVCIpCisKKyAgICBkZWYgdGVzdF9DVFJMX0JSRUFLX0VWRU5UKHNlbGYpOgorICAgICAgICBzZWxmLl9raWxsX3dpdGhfZXZlbnQoc2lnbmFsLkNUUkxfQlJFQUtfRVZFTlQsICJDVFJMX0JSRUFLX0VWRU5UIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgRmlsZVRlc3RzLAorICAgICAgICBUZW1wb3JhcnlGaWxlVGVzdHMsCisgICAgICAgIFN0YXRBdHRyaWJ1dGVUZXN0cywKKyAgICAgICAgRW52aXJvblRlc3RzLAorICAgICAgICBXYWxrVGVzdHMsCisgICAgICAgIE1ha2VkaXJUZXN0cywKKyAgICAgICAgRGV2TnVsbFRlc3RzLAorICAgICAgICBVUmFuZG9tVGVzdHMsCisgICAgICAgIFdpbjMyRXJyb3JUZXN0cywKKyAgICAgICAgVGVzdEludmFsaWRGRCwKKyAgICAgICAgUG9zaXhVaWRHaWRUZXN0cywKKyAgICAgICAgV2luMzJLaWxsVGVzdHMKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk2NDYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTk2NDYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzNTdhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5CkBAIC0wLDAgKzEsMTc0IEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAordGVzdF9zdXBwb3J0LnJlcXVpcmVzKCdhdWRpbycpCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGZpbmRmaWxlCisKK29zc2F1ZGlvZGV2ID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ29zc2F1ZGlvZGV2JykKKworaW1wb3J0IGVycm5vCitpbXBvcnQgc3lzCitpbXBvcnQgc3VuYXUKK2ltcG9ydCB0aW1lCitpbXBvcnQgYXVkaW9vcAoraW1wb3J0IHVuaXR0ZXN0CisKKyMgQXJnZ2gsIEFGTVRfUzE2X05FIG5vdCBkZWZpbmVkIG9uIGFsbCBwbGF0Zm9ybXMgLS0gc2VlbXMgdG8gYmUgYQorIyBmYWlybHkgcmVjZW50IGFkZGl0aW9uIHRvIE9TUy4KK3RyeToKKyAgICBmcm9tIG9zc2F1ZGlvZGV2IGltcG9ydCBBRk1UX1MxNl9ORQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgIEFGTVRfUzE2X05FID0gb3NzYXVkaW9kZXYuQUZNVF9TMTZfTEUKKyAgICBlbHNlOgorICAgICAgICBBRk1UX1MxNl9ORSA9IG9zc2F1ZGlvZGV2LkFGTVRfUzE2X0JFCisKKworZGVmIHJlYWRfc291bmRfZmlsZShwYXRoKToKKyAgICB3aXRoIG9wZW4ocGF0aCwgJ3JiJykgYXMgZnA6CisgICAgICAgIGF1ID0gc3VuYXUub3BlbihmcCkKKyAgICAgICAgcmF0ZSA9IGF1LmdldGZyYW1lcmF0ZSgpCisgICAgICAgIG5jaGFubmVscyA9IGF1LmdldG5jaGFubmVscygpCisgICAgICAgIGVuY29kaW5nID0gYXUuX2VuY29kaW5nCisgICAgICAgIGZwLnNlZWsoMCkKKyAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQorCisgICAgaWYgZW5jb2RpbmcgIT0gc3VuYXUuQVVESU9fRklMRV9FTkNPRElOR19NVUxBV184OgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkV4cGVjdCAuYXUgZmlsZSB3aXRoIDgtYml0IG11LWxhdyBzYW1wbGVzIikKKworICAgICMgQ29udmVydCB0aGUgZGF0YSB0byAxNi1iaXQgc2lnbmVkLgorICAgIGRhdGEgPSBhdWRpb29wLnVsYXcybGluKGRhdGEsIDIpCisgICAgcmV0dXJuIChkYXRhLCByYXRlLCAxNiwgbmNoYW5uZWxzKQorCitjbGFzcyBPU1NBdWRpb0RldlRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBwbGF5X3NvdW5kX2ZpbGUoc2VsZiwgZGF0YSwgcmF0ZSwgc3NpemUsIG5jaGFubmVscyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRzcCA9IG9zc2F1ZGlvZGV2Lm9wZW4oJ3cnKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICAgICAgaWYgbXNnLmFyZ3NbMF0gaW4gKGVycm5vLkVBQ0NFUywgZXJybm8uRU5PRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vLkVOT0RFViwgZXJybm8uRUJVU1kpOgorICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KG1zZykKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgIyBhdCBsZWFzdCBjaGVjayB0aGF0IHRoZXNlIG1ldGhvZHMgY2FuIGJlIGludm9rZWQKKyAgICAgICAgZHNwLmJ1ZnNpemUoKQorICAgICAgICBkc3Aub2J1ZmNvdW50KCkKKyAgICAgICAgZHNwLm9idWZmcmVlKCkKKyAgICAgICAgZHNwLmdldHB0cigpCisgICAgICAgIGRzcC5maWxlbm8oKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSByZWFkLW9ubHkgYXR0cmlidXRlcyB3b3JrLgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGRzcC5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHNwLm5hbWUsICIvZGV2L2RzcCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHNwLm1vZGUsICJ3IiwgImJhZCBkc3AubW9kZTogJXIiICUgZHNwLm1vZGUpCisKKyAgICAgICAgIyBBbmQgbWFrZSBzdXJlIHRoZXkncmUgcmVhbGx5IHJlYWQtb25seS4KKyAgICAgICAgZm9yIGF0dHIgaW4gKCdjbG9zZWQnLCAnbmFtZScsICdtb2RlJyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2V0YXR0cihkc3AsIGF0dHIsIDQyKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZHNwLiVzIG5vdCByZWFkLW9ubHkiICUgYXR0cikKKworICAgICAgICAjIENvbXB1dGUgZXhwZWN0ZWQgcnVubmluZyB0aW1lIG9mIHNvdW5kIHNhbXBsZSAoaW4gc2Vjb25kcykuCisgICAgICAgIGV4cGVjdGVkX3RpbWUgPSBmbG9hdChsZW4oZGF0YSkpIC8gKHNzaXplLy84KSAvIG5jaGFubmVscyAvIHJhdGUKKworICAgICAgICAjIHNldCBwYXJhbWV0ZXJzIGJhc2VkIG9uIC5hdSBmaWxlIGhlYWRlcnMKKyAgICAgICAgZHNwLnNldHBhcmFtZXRlcnMoQUZNVF9TMTZfTkUsIG5jaGFubmVscywgcmF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFicyhleHBlY3RlZF90aW1lIC0gMy41MSkgPCAxZS0yLCBleHBlY3RlZF90aW1lKQorICAgICAgICB0MSA9IHRpbWUudGltZSgpCisgICAgICAgIGRzcC53cml0ZShkYXRhKQorICAgICAgICBkc3AuY2xvc2UoKQorICAgICAgICB0MiA9IHRpbWUudGltZSgpCisgICAgICAgIGVsYXBzZWRfdGltZSA9IHQyIC0gdDEKKworICAgICAgICBwZXJjZW50X2RpZmYgPSAoYWJzKGVsYXBzZWRfdGltZSAtIGV4cGVjdGVkX3RpbWUpIC8gZXhwZWN0ZWRfdGltZSkgKiAxMDAKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBlcmNlbnRfZGlmZiA8PSAxMC4wLAorICAgICAgICAgICAgICAgICAgICAgICAgImVsYXBzZWQgdGltZSA+IDEwJSBvZmYgb2YgZXhwZWN0ZWQgdGltZSIpCisKKyAgICBkZWYgc2V0X3BhcmFtZXRlcnMoc2VsZiwgZHNwKToKKyAgICAgICAgIyBUd28gY29uZmlndXJhdGlvbnMgZm9yIHRlc3Rpbmc6CisgICAgICAgICMgICBjb25maWcxICg4LWJpdCwgbW9ubywgOCBrSHopIHNob3VsZCB3b3JrIG9uIGV2ZW4gdGhlIG1vc3QKKyAgICAgICAgIyAgICAgIGFuY2llbnQgYW5kIGNydWZ0eSBzb3VuZCBjYXJkLCBidXQgbWF5YmUgbm90IG9uIHNwZWNpYWwtCisgICAgICAgICMgICAgICBwdXJwb3NlIGhpZ2gtZW5kIGhhcmR3YXJlCisgICAgICAgICMgICBjb25maWcyICgxNi1iaXQsIHN0ZXJlbywgNDQuMWtIeikgc2hvdWxkIHdvcmsgb24gYWxsIGJ1dCB0aGUKKyAgICAgICAgIyAgICAgIG1vc3QgYW5jaWVudCBhbmQgY3J1ZnR5IGhhcmR3YXJlCisgICAgICAgIGNvbmZpZzEgPSAob3NzYXVkaW9kZXYuQUZNVF9VOCwgMSwgODAwMCkKKyAgICAgICAgY29uZmlnMiA9IChBRk1UX1MxNl9ORSwgMiwgNDQxMDApCisKKyAgICAgICAgZm9yIGNvbmZpZyBpbiBbY29uZmlnMSwgY29uZmlnMl06CisgICAgICAgICAgICAoZm10LCBjaGFubmVscywgcmF0ZSkgPSBjb25maWcKKyAgICAgICAgICAgIGlmIChkc3Auc2V0Zm10KGZtdCkgPT0gZm10IGFuZAorICAgICAgICAgICAgICAgIGRzcC5jaGFubmVscyhjaGFubmVscykgPT0gY2hhbm5lbHMgYW5kCisgICAgICAgICAgICAgICAgZHNwLnNwZWVkKHJhdGUpID09IHJhdGUpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoInVuYWJsZSB0byBzZXQgYXVkaW8gc2FtcGxpbmcgcGFyYW1ldGVyczogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5b3UgbXVzdCBoYXZlIHJlYWxseSB3ZWlyZCBhdWRpbyBoYXJkd2FyZSIpCisKKyAgICAgICAgIyBzZXRwYXJhbWV0ZXJzKCkgc2hvdWxkIGJlIGFibGUgdG8gc2V0IHRoaXMgY29uZmlndXJhdGlvbiBpbgorICAgICAgICAjIGVpdGhlciBzdHJpY3Qgb3Igbm9uLXN0cmljdCBtb2RlLgorICAgICAgICByZXN1bHQgPSBkc3Auc2V0cGFyYW1ldGVycyhmbXQsIGNoYW5uZWxzLCByYXRlLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChmbXQsIGNoYW5uZWxzLCByYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2V0cGFyYW1ldGVycyVyOiByZXR1cm5lZCAlciIgJSAoY29uZmlnLCByZXN1bHQpKQorCisgICAgICAgIHJlc3VsdCA9IGRzcC5zZXRwYXJhbWV0ZXJzKGZtdCwgY2hhbm5lbHMsIHJhdGUsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoZm10LCBjaGFubmVscywgcmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgInNldHBhcmFtZXRlcnMlcjogcmV0dXJuZWQgJXIiICUgKGNvbmZpZywgcmVzdWx0KSkKKworICAgIGRlZiBzZXRfYmFkX3BhcmFtZXRlcnMoc2VsZiwgZHNwKToKKyAgICAgICAgIyBOb3cgdHJ5IHNvbWUgY29uZmlndXJhdGlvbnMgdGhhdCBhcmUgcHJlc3VtYWJseSBib2d1czogZWcuIDMwMAorICAgICAgICAjIGNoYW5uZWxzIGN1cnJlbnRseSBleGNlZWRzIGV2ZW4gSG9sbHl3b29kJ3MgYW1iaXRpb25zLCBhbmQKKyAgICAgICAgIyBuZWdhdGl2ZSBzYW1wbGluZyByYXRlIGlzIHV0dGVyIG5vbnNlbnNlLiAgc2V0cGFyYW1ldGVycygpIHNob3VsZAorICAgICAgICAjIGFjY2VwdCB0aGVzZSBpbiBub24tc3RyaWN0IG1vZGUsIHJldHVybmluZyBzb21ldGhpbmcgb3RoZXIgdGhhbgorICAgICAgICAjIHdhcyByZXF1ZXN0ZWQsIGJ1dCBzaG91bGQgYmFyZiBpbiBzdHJpY3QgbW9kZS4KKyAgICAgICAgZm10ID0gQUZNVF9TMTZfTkUKKyAgICAgICAgcmF0ZSA9IDQ0MTAwCisgICAgICAgIGNoYW5uZWxzID0gMgorICAgICAgICBmb3IgY29uZmlnIGluIFsoZm10LCAzMDAsIHJhdGUpLCAgICAgICAjIHJpZGljdWxvdXMgbmNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgIChmbXQsIC01LCByYXRlKSwgICAgICAgICMgaW1wb3NzaWJsZSBuY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgKGZtdCwgY2hhbm5lbHMsIC01MCksICAgIyBpbXBvc3NpYmxlIHJhdGUKKyAgICAgICAgICAgICAgICAgICAgICBdOgorICAgICAgICAgICAgKGZtdCwgY2hhbm5lbHMsIHJhdGUpID0gY29uZmlnCisgICAgICAgICAgICByZXN1bHQgPSBkc3Auc2V0cGFyYW1ldGVycyhmbXQsIGNoYW5uZWxzLCByYXRlLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmVzdWx0LCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkbHkgZ290IHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIikKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRzcC5zZXRwYXJhbWV0ZXJzKGZtdCwgY2hhbm5lbHMsIHJhdGUsIFRydWUpCisgICAgICAgICAgICBleGNlcHQgb3NzYXVkaW9kZXYuT1NTQXVkaW9FcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBPU1NBdWRpb0Vycm9yIikKKworICAgIGRlZiB0ZXN0X3BsYXliYWNrKHNlbGYpOgorICAgICAgICBzb3VuZF9pbmZvID0gcmVhZF9zb3VuZF9maWxlKGZpbmRmaWxlKCdhdWRpb3Rlc3QuYXUnKSkKKyAgICAgICAgc2VsZi5wbGF5X3NvdW5kX2ZpbGUoKnNvdW5kX2luZm8pCisKKyAgICBkZWYgdGVzdF9zZXRfcGFyYW1ldGVycyhzZWxmKToKKyAgICAgICAgZHNwID0gb3NzYXVkaW9kZXYub3BlbigidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2V0X3BhcmFtZXRlcnMoZHNwKQorCisgICAgICAgICAgICAjIERpc2FibGVkIGJlY2F1c2UgaXQgZmFpbHMgdW5kZXIgTGludXggMi42IHdpdGggQUxTQSdzIE9TUworICAgICAgICAgICAgIyBlbXVsYXRpb24gbGF5ZXIuCisgICAgICAgICAgICAjc2VsZi5zZXRfYmFkX3BhcmFtZXRlcnMoZHNwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZHNwLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkc3AuY2xvc2VkKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0cnk6CisgICAgICAgIGRzcCA9IG9zc2F1ZGlvZGV2Lm9wZW4oJ3cnKQorICAgIGV4Y2VwdCAob3NzYXVkaW9kZXYuZXJyb3IsIElPRXJyb3IpLCBtc2c6CisgICAgICAgIGlmIG1zZy5hcmdzWzBdIGluIChlcnJuby5FQUNDRVMsIGVycm5vLkVOT0VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vLkVOT0RFViwgZXJybm8uRUJVU1kpOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QobXNnKQorICAgICAgICByYWlzZQorICAgIGRzcC5jbG9zZSgpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MjVmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MjVmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGFyc2VyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YTc2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wYXJzZXIucHkKQEAgLTAsMCArMSw2NTcgQEAKK2ltcG9ydCBwYXJzZXIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworaW1wb3J0IHN0cnVjdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAorZnJvbSB0ZXN0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fZmFpbHVyZQorCisjCisjICBGaXJzdCwgd2UgdGVzdCB0aGF0IHdlIGNhbiBnZW5lcmF0ZSB0cmVlcyBmcm9tIHZhbGlkIHNvdXJjZSBmcmFnbWVudHMsCisjICBhbmQgdGhhdCB0aGVzZSB2YWxpZCB0cmVlcyBhcmUgaW5kZWVkIGFsbG93ZWQgYnkgdGhlIHRyZWUtbG9hZGluZyBzaWRlCisjICBvZiB0aGUgcGFyc2VyIG1vZHVsZS4KKyMKKworY2xhc3MgUm91bmR0cmlwTGVnYWxTeW50YXhUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgcm91bmR0cmlwKHNlbGYsIGYsIHMpOgorICAgICAgICBzdDEgPSBmKHMpCisgICAgICAgIHQgPSBzdDEudG90dXBsZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN0MiA9IHBhcnNlci5zZXF1ZW5jZTJzdCh0KQorICAgICAgICBleGNlcHQgcGFyc2VyLlBhcnNlckVycm9yLCB3aHk6CisgICAgICAgICAgICBzZWxmLmZhaWwoImNvdWxkIG5vdCByb3VuZHRyaXAgJXI6ICVzIiAlIChzLCB3aHkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgc3QyLnRvdHVwbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IHJlLWdlbmVyYXRlIHN5bnRheCB0cmVlIikKKworICAgIGRlZiBjaGVja19leHByKHNlbGYsIHMpOgorICAgICAgICBzZWxmLnJvdW5kdHJpcChwYXJzZXIuZXhwciwgcykKKworICAgIGRlZiB0ZXN0X2ZsYWdzX3Bhc3NlZChzZWxmKToKKyAgICAgICAgIyBUaGUgdW5pY29kZSBsaXRlcmFscyBmbGFncyBoYXMgdG8gYmUgcGFzc2VkIGZyb20gdGhlIHBhc2VyIHRvIEFTVAorICAgICAgICAjIGdlbmVyYXRpb24uCisgICAgICAgIHN1aXRlID0gcGFyc2VyLnN1aXRlKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHM7IHggPSAnJyIpCisgICAgICAgIGNvZGUgPSBzdWl0ZS5jb21waWxlKCkKKyAgICAgICAgc2NvcGUgPSB7fQorICAgICAgICBleGVjIGNvZGUgaW4gc2NvcGUKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNjb3BlWyJ4Il0sIHVuaWNvZGUpCisKKyAgICBkZWYgY2hlY2tfc3VpdGUoc2VsZiwgcyk6CisgICAgICAgIHNlbGYucm91bmR0cmlwKHBhcnNlci5zdWl0ZSwgcykKKworICAgIGRlZiB0ZXN0X3lpZWxkX3N0YXRlbWVudChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoKTogeWllbGQgMSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCk6IHlpZWxkIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoKTogeCArPSB5aWVsZCIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCk6IHggPSB5aWVsZCAxIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoKTogeCA9IHkgPSB5aWVsZCAxIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoKTogeCA9IHlpZWxkIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoKTogeCA9IHkgPSB5aWVsZCIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCk6IDEgKyAoeWllbGQpKjIiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZigpOiAoeWllbGQgMSkqMiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCk6IHJldHVybjsgeWllbGQgMSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCk6IHlpZWxkIDE7IHJldHVybiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCk6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBmb3IgeCBpbiByYW5nZSgzMCk6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgeWllbGQgeFxuIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoKTpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGlmICh5aWVsZCk6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgeWllbGQgeFxuIikKKworICAgIGRlZiB0ZXN0X2V4cHJlc3Npb25zKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbygxKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiezE6MX0iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoInsxOjEsIDI6MiwgMzozfSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiezE6MSwgMjoyLCAzOjMsfSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiezF9IikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJ7MSwgMiwgM30iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoInsxLCAyLCAzLH0iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIltdIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJbMV0iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIlsxLCAyLCAzXSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiWzEsIDIsIDMsXSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiKCkiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIigxLCkiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIigxLCAyLCAzKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiKDEsIDIsIDMsKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiW3gqKjMgZm9yIHggaW4gcmFuZ2UoMjApXSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiW3gqKjMgZm9yIHggaW4gcmFuZ2UoMjApIGlmIHggJSAzXSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiW3gqKjMgZm9yIHggaW4gcmFuZ2UoMjApIGlmIHggJSAyIGlmIHggJSAzXSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiW3greSBmb3IgeCBpbiByYW5nZSgzMCkgZm9yIHkgaW4gcmFuZ2UoMjApIGlmIHggJSAyIGlmIHkgJSAzXSIpCisgICAgICAgICNzZWxmLmNoZWNrX2V4cHIoIlt4IGZvciB4IGluIGxhbWJkYTogVHJ1ZSwgbGFtYmRhOiBGYWxzZSBpZiB4KCldIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsaXN0KHgqKjMgZm9yIHggaW4gcmFuZ2UoMjApKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGlzdCh4KiozIGZvciB4IGluIHJhbmdlKDIwKSBpZiB4ICUgMykiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImxpc3QoeCoqMyBmb3IgeCBpbiByYW5nZSgyMCkgaWYgeCAlIDIgaWYgeCAlIDMpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsaXN0KHgreSBmb3IgeCBpbiByYW5nZSgzMCkgZm9yIHkgaW4gcmFuZ2UoMjApIGlmIHggJSAyIGlmIHkgJSAzKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigie3gqKjMgZm9yIHggaW4gcmFuZ2UoMzApfSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigie3gqKjMgZm9yIHggaW4gcmFuZ2UoMzApIGlmIHggJSAzfSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigie3gqKjMgZm9yIHggaW4gcmFuZ2UoMzApIGlmIHggJSAyIGlmIHggJSAzfSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigie3greSBmb3IgeCBpbiByYW5nZSgzMCkgZm9yIHkgaW4gcmFuZ2UoMjApIGlmIHggJSAyIGlmIHkgJSAzfSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigie3gqKjM6IHkqKjIgZm9yIHgsIHkgaW4gemlwKHJhbmdlKDMwKSwgcmFuZ2UoMzApKX0iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoInt4KiozOiB5KioyIGZvciB4LCB5IGluIHppcChyYW5nZSgzMCksIHJhbmdlKDMwKSkgaWYgeCAlIDN9IikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJ7eCoqMzogeSoqMiBmb3IgeCwgeSBpbiB6aXAocmFuZ2UoMzApLCByYW5nZSgzMCkpIGlmIHggJSAzIGlmIHkgJSAzfSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigie3g6eSBmb3IgeCBpbiByYW5nZSgzMCkgZm9yIHkgaW4gcmFuZ2UoMjApIGlmIHggJSAyIGlmIHkgJSAzfSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiZm9vKCphcmdzKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiZm9vKCphcmdzLCAqKmt3KSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiZm9vKCoqa3cpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oa2V5PXZhbHVlKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiZm9vKGtleT12YWx1ZSwgKmFyZ3MpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oa2V5PXZhbHVlLCAqYXJncywgKiprdykiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbyhrZXk9dmFsdWUsICoqa3cpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oYSwgYiwgYywgKmFyZ3MpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oYSwgYiwgYywgKmFyZ3MsICoqa3cpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oYSwgYiwgYywgKiprdykiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbyhhLCAqYXJncywga2V5d29yZD0yMykiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbyArIGJhciIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiZm9vIC0gYmFyIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28gKiBiYXIiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbyAvIGJhciIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiZm9vIC8vIGJhciIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGFtYmRhOiAwIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsYW1iZGEgeDogMCIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGFtYmRhICp5OiAwIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsYW1iZGEgKnksICoqejogMCIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGFtYmRhICoqejogMCIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGFtYmRhIHgsIHk6IDAiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImxhbWJkYSBmb289YmFyOiAwIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsYW1iZGEgZm9vPWJhciwgc3Bhej1uaWZ0eStzcGl0OiAwIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsYW1iZGEgZm9vPWJhciwgKip6OiAwIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsYW1iZGEgZm9vPWJhciwgYmxhej1ibGF0KzIsICoqejogMCIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGFtYmRhIGZvbz1iYXIsIGJsYXo9YmxhdCsyLCAqeSwgKip6OiAwIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsYW1iZGEgeCwgKnksICoqejogMCIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGFtYmRhIHg6IDUgaWYgeCBlbHNlIDIiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIih4IGZvciB4IGluIHJhbmdlKDEwKSkiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbyh4IGZvciB4IGluIHJhbmdlKDEwKSkiKQorCisgICAgZGVmIHRlc3RfcHJpbnQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoInByaW50IikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgicHJpbnQgMSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoInByaW50IDEsIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgicHJpbnQgPj5mcCIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoInByaW50ID4+ZnAsIDEiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJwcmludCA+PmZwLCAxLCIpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfZXhwcmVzc2lvbihzZWxmKToKKyAgICAgICAgIyBleHByX3N0bXQKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYSIpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfYXNzaWdubWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgPSBiIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYSA9IGIgPSBjID0gZCA9IGUiKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX2F1Z21lbnRlZF9hc3NpZ25tZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYSArPSBiIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYSAtPSBiIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYSAqPSBiIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYSAvPSBiIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYSAvLz0gYiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgJT0gYiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgJj0gYiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgfD0gYiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgXj0gYiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgPDw9IGIiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJhID4+PSBiIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYSAqKj0gYiIpCisKKyAgICBkZWYgdGVzdF9mdW5jdGlvbl9kZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZigpOiBwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoKmFyZ3MpOiBwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoKmFyZ3MsICoqa3cpOiBwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoKiprdyk6IHBhc3MiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZihmb289YmFyKTogcGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKGZvbz1iYXIsICphcmdzKTogcGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKGZvbz1iYXIsICphcmdzLCAqKmt3KTogcGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKGZvbz1iYXIsICoqa3cpOiBwYXNzIikKKworICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZihhLCBiKTogcGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKGEsIGIsICphcmdzKTogcGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKGEsIGIsICphcmdzLCAqKmt3KTogcGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKGEsIGIsICoqa3cpOiBwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoYSwgYiwgZm9vPWJhcik6IHBhc3MiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZihhLCBiLCBmb289YmFyLCAqYXJncyk6IHBhc3MiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZihhLCBiLCBmb289YmFyLCAqYXJncywgKiprdyk6IHBhc3MiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZihhLCBiLCBmb289YmFyLCAqKmt3KTogcGFzcyIpCisKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiQHN0YXRpY21ldGhvZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJkZWYgZigpOiBwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiQHN0YXRpY21ldGhvZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJAZnVuY2F0dHJzKHgsIHkpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgImRlZiBmKCk6IHBhc3MiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJAZnVuY2F0dHJzKClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmIGYoKTogcGFzcyIpCisKKyAgICBkZWYgdGVzdF9jbGFzc19kZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJjbGFzcyBmb28oKTpwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiQGNsYXNzX2RlY29yYXRvclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzcyBmb28oKTpwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiQGNsYXNzX2RlY29yYXRvcihhcmcpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzIGZvbygpOnBhc3MiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJAZGVjb3JhdG9yMVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJAZGVjb3JhdG9yMlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzcyBmb28oKTpwYXNzIikKKworCisgICAgZGVmIHRlc3RfaW1wb3J0X2Zyb21fc3RhdGVtZW50KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJmcm9tIHN5cy5wYXRoIGltcG9ydCAqIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZnJvbSBzeXMucGF0aCBpbXBvcnQgZGlybmFtZSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImZyb20gc3lzLnBhdGggaW1wb3J0IChkaXJuYW1lKSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImZyb20gc3lzLnBhdGggaW1wb3J0IChkaXJuYW1lLCkiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJmcm9tIHN5cy5wYXRoIGltcG9ydCBkaXJuYW1lIGFzIG15X2Rpcm5hbWUiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJmcm9tIHN5cy5wYXRoIGltcG9ydCAoZGlybmFtZSBhcyBteV9kaXJuYW1lKSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImZyb20gc3lzLnBhdGggaW1wb3J0IChkaXJuYW1lIGFzIG15X2Rpcm5hbWUsKSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImZyb20gc3lzLnBhdGggaW1wb3J0IGRpcm5hbWUsIGJhc2VuYW1lIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZnJvbSBzeXMucGF0aCBpbXBvcnQgKGRpcm5hbWUsIGJhc2VuYW1lKSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImZyb20gc3lzLnBhdGggaW1wb3J0IChkaXJuYW1lLCBiYXNlbmFtZSwpIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgKKyAgICAgICAgICAgICJmcm9tIHN5cy5wYXRoIGltcG9ydCBkaXJuYW1lIGFzIG15X2Rpcm5hbWUsIGJhc2VuYW1lIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgKKyAgICAgICAgICAgICJmcm9tIHN5cy5wYXRoIGltcG9ydCAoZGlybmFtZSBhcyBteV9kaXJuYW1lLCBiYXNlbmFtZSkiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKAorICAgICAgICAgICAgImZyb20gc3lzLnBhdGggaW1wb3J0IChkaXJuYW1lIGFzIG15X2Rpcm5hbWUsIGJhc2VuYW1lLCkiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKAorICAgICAgICAgICAgImZyb20gc3lzLnBhdGggaW1wb3J0IGRpcm5hbWUsIGJhc2VuYW1lIGFzIG15X2Jhc2VuYW1lIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgKKyAgICAgICAgICAgICJmcm9tIHN5cy5wYXRoIGltcG9ydCAoZGlybmFtZSwgYmFzZW5hbWUgYXMgbXlfYmFzZW5hbWUpIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgKKyAgICAgICAgICAgICJmcm9tIHN5cy5wYXRoIGltcG9ydCAoZGlybmFtZSwgYmFzZW5hbWUgYXMgbXlfYmFzZW5hbWUsKSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImZyb20gLmJvZ3VzIGltcG9ydCB4IikKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2ltcG9ydF9zdGF0ZW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImltcG9ydCBzeXMiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJpbXBvcnQgc3lzIGFzIHN5c3RlbSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImltcG9ydCBzeXMsIG1hdGgiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJpbXBvcnQgc3lzIGFzIHN5c3RlbSwgbWF0aCIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImltcG9ydCBzeXMsIG1hdGggYXMgbXlfbWF0aCIpCisKKyAgICBkZWYgdGVzdF9yZWxhdGl2ZV9pbXBvcnRzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJmcm9tIC4gaW1wb3J0IG5hbWUiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJmcm9tIC4uIGltcG9ydCBuYW1lIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZnJvbSAucGtnIGltcG9ydCBuYW1lIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZnJvbSAuLnBrZyBpbXBvcnQgbmFtZSIpCisKKyAgICBkZWYgdGVzdF9wZXAyNjMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoIiMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAicGFzc1xuIikKKworICAgIGRlZiB0ZXN0X2Fzc2VydChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYXNzZXJ0IGFsbyA8IGFoaSBhbmQgYmxvIDwgYmhpXG4iKQorCisgICAgZGVmIHRlc3Rfd2l0aChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgid2l0aCBvcGVuKCd4Jyk6IHBhc3NcbiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoIndpdGggb3BlbigneCcpIGFzIGY6IHBhc3NcbiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoIndpdGggb3BlbigneCcpIGFzIGYsIG9wZW4oJ3knKSBhcyBnOiBwYXNzXG4iKQorCisgICAgZGVmIHRlc3RfdHJ5X3N0bXQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoInRyeTogcGFzc1xuZXhjZXB0OiBwYXNzXG4iKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ0cnk6IHBhc3NcbmZpbmFsbHk6IHBhc3NcbiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoInRyeTogcGFzc1xuZXhjZXB0IEE6IHBhc3NcbmZpbmFsbHk6IHBhc3NcbiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoInRyeTogcGFzc1xuZXhjZXB0IEE6IHBhc3NcbmV4Y2VwdDogcGFzc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5hbGx5OiBwYXNzXG4iKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ0cnk6IHBhc3NcbmV4Y2VwdDogcGFzc1xuZWxzZTogcGFzc1xuIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgidHJ5OiBwYXNzXG5leGNlcHQ6IHBhc3NcbmVsc2U6IHBhc3NcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZmluYWxseTogcGFzc1xuIikKKworICAgIGRlZiB0ZXN0X2V4Y2VwdF9jbGF1c2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoInRyeTogcGFzc1xuZXhjZXB0OiBwYXNzXG4iKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ0cnk6IHBhc3NcbmV4Y2VwdCBBOiBwYXNzXG4iKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ0cnk6IHBhc3NcbmV4Y2VwdCBBLCBlOiBwYXNzXG4iKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ0cnk6IHBhc3NcbmV4Y2VwdCBBIGFzIGU6IHBhc3NcbiIpCisKKyAgICBkZWYgdGVzdF9wb3NpdGlvbihzZWxmKToKKyAgICAgICAgIyBBbiBhYnNvbHV0ZWx5IG1pbmltYWwgdGVzdCBvZiBwb3NpdGlvbiBpbmZvcm1hdGlvbi4gIEJldHRlcgorICAgICAgICAjIHRlc3RzIHdvdWxkIGJlIGEgYmlnIHByb2plY3QuCisgICAgICAgIGNvZGUgPSAiZGVmIGYoeCk6XG4gICAgcmV0dXJuIHggKyAxIgorICAgICAgICBzdDEgPSBwYXJzZXIuc3VpdGUoY29kZSkKKyAgICAgICAgc3QyID0gc3QxLnRvdHVwbGUobGluZV9pbmZvPTEsIGNvbF9pbmZvPTEpCisKKyAgICAgICAgZGVmIHdhbGsodHJlZSk6CisgICAgICAgICAgICBub2RlX3R5cGUgPSB0cmVlWzBdCisgICAgICAgICAgICBuZXh0ID0gdHJlZVsxXQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuZXh0LCB0dXBsZSk6CisgICAgICAgICAgICAgICAgZm9yIGVsdCBpbiB0cmVlWzE6XToKKyAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gd2FsayhlbHQpOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgeAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCB0cmVlCisKKyAgICAgICAgdGVybWluYWxzID0gbGlzdCh3YWxrKHN0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWworICAgICAgICAgICAgKDEsICdkZWYnLCAxLCAwKSwKKyAgICAgICAgICAgICgxLCAnZicsIDEsIDQpLAorICAgICAgICAgICAgKDcsICcoJywgMSwgNSksCisgICAgICAgICAgICAoMSwgJ3gnLCAxLCA2KSwKKyAgICAgICAgICAgICg4LCAnKScsIDEsIDcpLAorICAgICAgICAgICAgKDExLCAnOicsIDEsIDgpLAorICAgICAgICAgICAgKDQsICcnLCAxLCA5KSwKKyAgICAgICAgICAgICg1LCAnJywgMiwgLTEpLAorICAgICAgICAgICAgKDEsICdyZXR1cm4nLCAyLCA0KSwKKyAgICAgICAgICAgICgxLCAneCcsIDIsIDExKSwKKyAgICAgICAgICAgICgxNCwgJysnLCAyLCAxMyksCisgICAgICAgICAgICAoMiwgJzEnLCAyLCAxNSksCisgICAgICAgICAgICAoNCwgJycsIDIsIDE2KSwKKyAgICAgICAgICAgICg2LCAnJywgMiwgLTEpLAorICAgICAgICAgICAgKDQsICcnLCAyLCAtMSksCisgICAgICAgICAgICAoMCwgJycsIDIsIC0xKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdGVybWluYWxzKQorCisKKyMKKyMgIFNlY29uZCwgd2UgdGFrZSAqaW52YWxpZCogdHJlZXMgYW5kIG1ha2Ugc3VyZSB3ZSBnZXQgUGFyc2VyRXJyb3IKKyMgIHJlamVjdGlvbnMgZm9yIHRoZW0uCisjCisKK2NsYXNzIElsbGVnYWxTeW50YXhUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2tfYmFkX3RyZWUoc2VsZiwgdHJlZSwgbGFiZWwpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJzZXIuc2VxdWVuY2Uyc3QodHJlZSkKKyAgICAgICAgZXhjZXB0IHBhcnNlci5QYXJzZXJFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGlkIG5vdCBkZXRlY3QgaW52YWxpZCB0cmVlIGZvciAlciIgJSBsYWJlbCkKKworICAgIGRlZiB0ZXN0X2p1bmsoc2VsZik6CisgICAgICAgICMgbm90IGV2ZW4gcmVtb3RlbHkgdmFsaWQ6CisgICAgICAgIHNlbGYuY2hlY2tfYmFkX3RyZWUoKDEsIDIsIDMpLCAiPGp1bms+IikKKworICAgIGRlZiB0ZXN0X2lsbGVnYWxfeWllbGRfMShzZWxmKToKKyAgICAgICAgIyBJbGxlZ2FsIHlpZWxkIHN0YXRlbWVudDogZGVmIGYoKTogcmV0dXJuIDE7IHlpZWxkIDEKKyAgICAgICAgdHJlZSA9IFwKKyAgICAgICAgKDI1NywKKyAgICAgICAgICgyNjQsCisgICAgICAgICAgKDI4NSwKKyAgICAgICAgICAgKDI1OSwKKyAgICAgICAgICAgICgxLCAnZGVmJyksCisgICAgICAgICAgICAoMSwgJ2YnKSwKKyAgICAgICAgICAgICgyNjAsICg3LCAnKCcpLCAoOCwgJyknKSksCisgICAgICAgICAgICAoMTEsICc6JyksCisgICAgICAgICAgICAoMjkxLAorICAgICAgICAgICAgICg0LCAnJyksCisgICAgICAgICAgICAgKDUsICcnKSwKKyAgICAgICAgICAgICAoMjY0LAorICAgICAgICAgICAgICAoMjY1LAorICAgICAgICAgICAgICAgKDI2NiwKKyAgICAgICAgICAgICAgICAoMjcyLAorICAgICAgICAgICAgICAgICAoMjc1LAorICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nKSwKKyAgICAgICAgICAgICAgICAgICgzMTMsCisgICAgICAgICAgICAgICAgICAgKDI5MiwKKyAgICAgICAgICAgICAgICAgICAgKDI5MywKKyAgICAgICAgICAgICAgICAgICAgICgyOTQsCisgICAgICAgICAgICAgICAgICAgICAgKDI5NSwKKyAgICAgICAgICAgICAgICAgICAgICAgKDI5NywKKyAgICAgICAgICAgICAgICAgICAgICAgICgyOTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgKDI5OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgzMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMwMiwgKDMwMywgKDMwNCwgKDMwNSwgKDIsICcxJykpKSkpKSkpKSkpKSkpKSkpKSwKKyAgICAgICAgICAgICAgICgyNjQsCisgICAgICAgICAgICAgICAgKDI2NSwKKyAgICAgICAgICAgICAgICAgKDI2NiwKKyAgICAgICAgICAgICAgICAgICgyNzIsCisgICAgICAgICAgICAgICAgICAgKDI3NiwKKyAgICAgICAgICAgICAgICAgICAgKDEsICd5aWVsZCcpLAorICAgICAgICAgICAgICAgICAgICAoMzEzLAorICAgICAgICAgICAgICAgICAgICAgKDI5MiwKKyAgICAgICAgICAgICAgICAgICAgICAoMjkzLAorICAgICAgICAgICAgICAgICAgICAgICAoMjk0LAorICAgICAgICAgICAgICAgICAgICAgICAgKDI5NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMjk3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMjk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDI5OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzAzLCAoMzA0LCAoMzA1LCAoMiwgJzEnKSkpKSkpKSkpKSkpKSkpKSkpLAorICAgICAgICAgICAgICAgICAoNCwgJycpKSksCisgICAgICAgICAgICAgICAoNiwgJycpKSkpKSwKKyAgICAgICAgICAgKDQsICcnKSwKKyAgICAgICAgICAgKDAsICcnKSkpKQorICAgICAgICBzZWxmLmNoZWNrX2JhZF90cmVlKHRyZWUsICJkZWYgZigpOlxuICByZXR1cm4gMVxuICB5aWVsZCAxIikKKworICAgIGRlZiB0ZXN0X2lsbGVnYWxfeWllbGRfMihzZWxmKToKKyAgICAgICAgIyBJbGxlZ2FsIHJldHVybiBpbiBnZW5lcmF0b3I6IGRlZiBmKCk6IHJldHVybiAxOyB5aWVsZCAxCisgICAgICAgIHRyZWUgPSBcCisgICAgICAgICgyNTcsCisgICAgICAgICAoMjY0LAorICAgICAgICAgICgyNjUsCisgICAgICAgICAgICgyNjYsCisgICAgICAgICAgICAoMjc4LAorICAgICAgICAgICAgICgxLCAnZnJvbScpLAorICAgICAgICAgICAgICgyODEsICgxLCAnX19mdXR1cmVfXycpKSwKKyAgICAgICAgICAgICAoMSwgJ2ltcG9ydCcpLAorICAgICAgICAgICAgICgyNzksICgxLCAnZ2VuZXJhdG9ycycpKSkpLAorICAgICAgICAgICAoNCwgJycpKSksCisgICAgICAgICAoMjY0LAorICAgICAgICAgICgyODUsCisgICAgICAgICAgICgyNTksCisgICAgICAgICAgICAoMSwgJ2RlZicpLAorICAgICAgICAgICAgKDEsICdmJyksCisgICAgICAgICAgICAoMjYwLCAoNywgJygnKSwgKDgsICcpJykpLAorICAgICAgICAgICAgKDExLCAnOicpLAorICAgICAgICAgICAgKDI5MSwKKyAgICAgICAgICAgICAoNCwgJycpLAorICAgICAgICAgICAgICg1LCAnJyksCisgICAgICAgICAgICAgKDI2NCwKKyAgICAgICAgICAgICAgKDI2NSwKKyAgICAgICAgICAgICAgICgyNjYsCisgICAgICAgICAgICAgICAgKDI3MiwKKyAgICAgICAgICAgICAgICAgKDI3NSwKKyAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJyksCisgICAgICAgICAgICAgICAgICAoMzEzLAorICAgICAgICAgICAgICAgICAgICgyOTIsCisgICAgICAgICAgICAgICAgICAgICgyOTMsCisgICAgICAgICAgICAgICAgICAgICAoMjk0LAorICAgICAgICAgICAgICAgICAgICAgICgyOTUsCisgICAgICAgICAgICAgICAgICAgICAgICgyOTcsCisgICAgICAgICAgICAgICAgICAgICAgICAoMjk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICgyOTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgzMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzMDIsICgzMDMsICgzMDQsICgzMDUsICgyLCAnMScpKSkpKSkpKSkpKSkpKSkpKSksCisgICAgICAgICAgICAgICAoMjY0LAorICAgICAgICAgICAgICAgICgyNjUsCisgICAgICAgICAgICAgICAgICgyNjYsCisgICAgICAgICAgICAgICAgICAoMjcyLAorICAgICAgICAgICAgICAgICAgICgyNzYsCisgICAgICAgICAgICAgICAgICAgICgxLCAneWllbGQnKSwKKyAgICAgICAgICAgICAgICAgICAgKDMxMywKKyAgICAgICAgICAgICAgICAgICAgICgyOTIsCisgICAgICAgICAgICAgICAgICAgICAgKDI5MywKKyAgICAgICAgICAgICAgICAgICAgICAgKDI5NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICgyOTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKDI5NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDI5OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgyOTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMwMywgKDMwNCwgKDMwNSwgKDIsICcxJykpKSkpKSkpKSkpKSkpKSkpKSwKKyAgICAgICAgICAgICAgICAgKDQsICcnKSkpLAorICAgICAgICAgICAgICAgKDYsICcnKSkpKSksCisgICAgICAgICAgICg0LCAnJyksCisgICAgICAgICAgICgwLCAnJykpKSkKKyAgICAgICAgc2VsZi5jaGVja19iYWRfdHJlZSh0cmVlLCAiZGVmIGYoKTpcbiAgcmV0dXJuIDFcbiAgeWllbGQgMSIpCisKKyAgICBkZWYgdGVzdF9wcmludF9jaGV2cm9uX2NvbW1hKHNlbGYpOgorICAgICAgICAjIElsbGVnYWwgaW5wdXQ6IHByaW50ID4+ZnAsCisgICAgICAgIHRyZWUgPSBcCisgICAgICAgICgyNTcsCisgICAgICAgICAoMjY0LAorICAgICAgICAgICgyNjUsCisgICAgICAgICAgICgyNjYsCisgICAgICAgICAgICAoMjY4LAorICAgICAgICAgICAgICgxLCAncHJpbnQnKSwKKyAgICAgICAgICAgICAoMzUsICc+PicpLAorICAgICAgICAgICAgICgyOTAsCisgICAgICAgICAgICAgICgyOTEsCisgICAgICAgICAgICAgICAoMjkyLAorICAgICAgICAgICAgICAgICgyOTMsCisgICAgICAgICAgICAgICAgICgyOTUsCisgICAgICAgICAgICAgICAgICAoMjk2LAorICAgICAgICAgICAgICAgICAgICgyOTcsCisgICAgICAgICAgICAgICAgICAgICgyOTgsICgyOTksICgzMDAsICgzMDEsICgzMDIsICgzMDMsICgxLCAnZnAnKSkpKSkpKSkpKSkpKSksCisgICAgICAgICAgICAgKDEyLCAnLCcpKSksCisgICAgICAgICAgICg0LCAnJykpKSwKKyAgICAgICAgICgwLCAnJykpCisgICAgICAgIHNlbGYuY2hlY2tfYmFkX3RyZWUodHJlZSwgInByaW50ID4+ZnAsIikKKworICAgIGRlZiB0ZXN0X2FfY29tbWFfY29tbWFfYyhzZWxmKToKKyAgICAgICAgIyBJbGxlZ2FsIGlucHV0OiBhLCxjCisgICAgICAgIHRyZWUgPSBcCisgICAgICAgICgyNTgsCisgICAgICAgICAoMzExLAorICAgICAgICAgICgyOTAsCisgICAgICAgICAgICgyOTEsCisgICAgICAgICAgICAoMjkyLAorICAgICAgICAgICAgICgyOTMsCisgICAgICAgICAgICAgICgyOTUsCisgICAgICAgICAgICAgICAoMjk2LAorICAgICAgICAgICAgICAgICgyOTcsCisgICAgICAgICAgICAgICAgICgyOTgsICgyOTksICgzMDAsICgzMDEsICgzMDIsICgzMDMsICgxLCAnYScpKSkpKSkpKSkpKSkpKSwKKyAgICAgICAgICAoMTIsICcsJyksCisgICAgICAgICAgKDEyLCAnLCcpLAorICAgICAgICAgICgyOTAsCisgICAgICAgICAgICgyOTEsCisgICAgICAgICAgICAoMjkyLAorICAgICAgICAgICAgICgyOTMsCisgICAgICAgICAgICAgICgyOTUsCisgICAgICAgICAgICAgICAoMjk2LAorICAgICAgICAgICAgICAgICgyOTcsCisgICAgICAgICAgICAgICAgICgyOTgsICgyOTksICgzMDAsICgzMDEsICgzMDIsICgzMDMsICgxLCAnYycpKSkpKSkpKSkpKSkpKSksCisgICAgICAgICAoNCwgJycpLAorICAgICAgICAgKDAsICcnKSkKKyAgICAgICAgc2VsZi5jaGVja19iYWRfdHJlZSh0cmVlLCAiYSwsYyIpCisKKyAgICBkZWYgdGVzdF9pbGxlZ2FsX29wZXJhdG9yKHNlbGYpOgorICAgICAgICAjIElsbGVnYWwgaW5wdXQ6IGEgJD0gYgorICAgICAgICB0cmVlID0gXAorICAgICAgICAoMjU3LAorICAgICAgICAgKDI2NCwKKyAgICAgICAgICAoMjY1LAorICAgICAgICAgICAoMjY2LAorICAgICAgICAgICAgKDI2NywKKyAgICAgICAgICAgICAoMzEyLAorICAgICAgICAgICAgICAoMjkxLAorICAgICAgICAgICAgICAgKDI5MiwKKyAgICAgICAgICAgICAgICAoMjkzLAorICAgICAgICAgICAgICAgICAoMjk0LAorICAgICAgICAgICAgICAgICAgKDI5NiwKKyAgICAgICAgICAgICAgICAgICAoMjk3LAorICAgICAgICAgICAgICAgICAgICAoMjk4LAorICAgICAgICAgICAgICAgICAgICAgKDI5OSwKKyAgICAgICAgICAgICAgICAgICAgICAoMzAwLCAoMzAxLCAoMzAyLCAoMzAzLCAoMzA0LCAoMSwgJ2EnKSkpKSkpKSkpKSkpKSkpLAorICAgICAgICAgICAgICgyNjgsICgzNywgJyQ9JykpLAorICAgICAgICAgICAgICgzMTIsCisgICAgICAgICAgICAgICgyOTEsCisgICAgICAgICAgICAgICAoMjkyLAorICAgICAgICAgICAgICAgICgyOTMsCisgICAgICAgICAgICAgICAgICgyOTQsCisgICAgICAgICAgICAgICAgICAoMjk2LAorICAgICAgICAgICAgICAgICAgICgyOTcsCisgICAgICAgICAgICAgICAgICAgICgyOTgsCisgICAgICAgICAgICAgICAgICAgICAoMjk5LAorICAgICAgICAgICAgICAgICAgICAgICgzMDAsICgzMDEsICgzMDIsICgzMDMsICgzMDQsICgxLCAnYicpKSkpKSkpKSkpKSkpKSkpKSwKKyAgICAgICAgICAgKDQsICcnKSkpLAorICAgICAgICAgKDAsICcnKSkKKyAgICAgICAgc2VsZi5jaGVja19iYWRfdHJlZSh0cmVlLCAiYSAkPSBiIikKKworICAgIGRlZiB0ZXN0X21hbGZvcm1lZF9nbG9iYWwoc2VsZik6CisgICAgICAgICNkb2Vzbid0IGhhdmUgZ2xvYmFsIGtleXdvcmQgaW4gYXN0CisgICAgICAgIHRyZWUgPSAoMjU3LAorICAgICAgICAgICAgICAgICgyNjQsCisgICAgICAgICAgICAgICAgICgyNjUsCisgICAgICAgICAgICAgICAgICAoMjY2LAorICAgICAgICAgICAgICAgICAgICgyODIsICgxLCAnZm9vJykpKSwgKDQsICcnKSkpLAorICAgICAgICAgICAgICAgICg0LCAnJyksCisgICAgICAgICAgICAgICAgKDAsICcnKSkKKyAgICAgICAgc2VsZi5jaGVja19iYWRfdHJlZSh0cmVlLCAibWFsZm9ybWVkIGdsb2JhbCBhc3QiKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19pbXBvcnRfc291cmNlKHNlbGYpOgorICAgICAgICAjIGZyb20gaW1wb3J0IGEKKyAgICAgICAgdHJlZSA9IFwKKyAgICAgICAgICAgICgyNTcsCisgICAgICAgICAgICAgKDI2NywKKyAgICAgICAgICAgICAgKDI2OCwKKyAgICAgICAgICAgICAgICgyNjksCisgICAgICAgICAgICAgICAgKDI4MSwKKyAgICAgICAgICAgICAgICAgKDI4MywgKDEsICdmcm9tJyksICgxLCAnaW1wb3J0JyksCisgICAgICAgICAgICAgICAgICAoMjg2LCAoMjg0LCAoMSwgJ2ZyZWQnKSkpKSkpLAorICAgICAgICAgICAgICAgKDQsICcnKSkpLAorICAgICAgICAgICAgICg0LCAnJyksICgwLCAnJykpCisgICAgICAgIHNlbGYuY2hlY2tfYmFkX3RyZWUodHJlZSwgImZyb20gaW1wb3J0IGEiKQorCisKK2NsYXNzIENvbXBpbGVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIFRoZXNlIHRlc3RzIGFyZSB2ZXJ5IG1pbmltYWwuIDotKAorCisgICAgZGVmIHRlc3RfY29tcGlsZV9leHByKHNlbGYpOgorICAgICAgICBzdCA9IHBhcnNlci5leHByKCcyICsgMycpCisgICAgICAgIGNvZGUgPSBwYXJzZXIuY29tcGlsZXN0KHN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoY29kZSksIDUpCisKKyAgICBkZWYgdGVzdF9jb21waWxlX3N1aXRlKHNlbGYpOgorICAgICAgICBzdCA9IHBhcnNlci5zdWl0ZSgneCA9IDI7IHkgPSB4ICsgMycpCisgICAgICAgIGNvZGUgPSBwYXJzZXIuY29tcGlsZXN0KHN0KQorICAgICAgICBnbG9icyA9IHt9CisgICAgICAgIGV4ZWMgY29kZSBpbiBnbG9icworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdsb2JzWyd5J10sIDUpCisKKyAgICBkZWYgdGVzdF9jb21waWxlX2Vycm9yKHNlbGYpOgorICAgICAgICBzdCA9IHBhcnNlci5zdWl0ZSgnMSA9IDMgKyA0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIHBhcnNlci5jb21waWxlc3QsIHN0KQorCisgICAgZGVmIHRlc3RfY29tcGlsZV9iYWR1bmljb2RlKHNlbGYpOgorICAgICAgICBzdCA9IHBhcnNlci5zdWl0ZSgnYSA9IHUiXFUxMjM0NTY3OCInKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgcGFyc2VyLmNvbXBpbGVzdCwgc3QpCisgICAgICAgIHN0ID0gcGFyc2VyLnN1aXRlKCdhID0gdSJcdTEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIHBhcnNlci5jb21waWxlc3QsIHN0KQorCisgICAgZGVmIHRlc3RfaXNzdWVfOTAxMShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA5MDExOiBjb21waWxhdGlvbiBvZiBhbiB1bmFyeSBtaW51cyBleHByZXNzaW9uIGNoYW5nZWQKKyAgICAgICAgIyB0aGUgbWVhbmluZyBvZiB0aGUgU1QsIHNvIHRoYXQgYSBzZWNvbmQgY29tcGlsYXRpb24gcHJvZHVjZWQKKyAgICAgICAgIyBpbmNvcnJlY3QgcmVzdWx0cy4KKyAgICAgICAgc3QgPSBwYXJzZXIuZXhwcignLTMnKQorICAgICAgICBjb2RlMSA9IHBhcnNlci5jb21waWxlc3Qoc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChjb2RlMSksIC0zKQorICAgICAgICBjb2RlMiA9IHBhcnNlci5jb21waWxlc3Qoc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChjb2RlMiksIC0zKQorCisKK2NsYXNzIFBhcnNlclN0YWNrTGltaXRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIidHJ5IHRvIHB1c2ggdGhlIHBhcnNlciB0by9vdmVyIGl0cyBsaW1pdHMuCisgICAgc2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxODgxIGZvciBhIGRpc2N1c3Npb24KKyAgICAiIiIKKyAgICBkZWYgX25lc3RlZF9leHByZXNzaW9uKHNlbGYsIGxldmVsKToKKyAgICAgICAgcmV0dXJuICJbIipsZXZlbCsiXSIqbGV2ZWwKKworICAgIGRlZiB0ZXN0X2RlZXBseV9uZXN0ZWRfbGlzdChzZWxmKToKKyAgICAgICAgZSA9IHNlbGYuX25lc3RlZF9leHByZXNzaW9uKDk5KQorICAgICAgICBzdCA9IHBhcnNlci5leHByKGUpCisgICAgICAgIHN0LmNvbXBpbGUoKQorCisgICAgZGVmIHRlc3RfdHJpZ2dlcl9tZW1vcnlfZXJyb3Ioc2VsZik6CisgICAgICAgIGUgPSBzZWxmLl9uZXN0ZWRfZXhwcmVzc2lvbigxMDApCisgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLWMnLCBlKQorICAgICAgICAjIHBhcnNpbmcgdGhlIGV4cHJlc3Npb24gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IgbWVzc2FnZQorICAgICAgICAjIGZvbGxvd2VkIGJ5IGEgTWVtb3J5RXJyb3IgKHNlZSAjMTE5NjMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidzX3B1c2g6IHBhcnNlciBzdGFjayBvdmVyZmxvdycsIGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiJ01lbW9yeUVycm9yJywgZXJyKQorCitjbGFzcyBTVE9iamVjdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IG9wZXJhdGlvbnMgb24gU1Qgb2JqZWN0cyB0aGVtc2VsdmVzIiIiCisKKyAgICBjaGVja19zaXplb2YgPSBzdXBwb3J0LmNoZWNrX3NpemVvZgorCisgICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc2l6ZW9mKHNlbGYpOgorICAgICAgICBkZWYgWFhYUk9VTkRVUChuKToKKyAgICAgICAgICAgIGlmIG4gPD0gMToKKyAgICAgICAgICAgICAgICByZXR1cm4gbgorICAgICAgICAgICAgaWYgbiA8PSAxMjg6CisgICAgICAgICAgICAgICAgcmV0dXJuIChuICsgMykgJiB+MworICAgICAgICAgICAgcmV0dXJuIDEgPDwgKG4gLSAxKS5iaXRfbGVuZ3RoKCkKKworICAgICAgICBiYXNlc2l6ZSA9IHN1cHBvcnQuY2FsY29ianNpemUoJ1BpaScpCisgICAgICAgIG5vZGVzaXplID0gc3RydWN0LmNhbGNzaXplKCdoUDNpUDBoJykKKyAgICAgICAgZGVmIHNpemVvZmNoaWxkcmVuKG5vZGUpOgorICAgICAgICAgICAgaWYgbm9kZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICByZXMgPSAwCisgICAgICAgICAgICBoYXNzdHIgPSBsZW4obm9kZSkgPiAxIGFuZCBpc2luc3RhbmNlKG5vZGVbLTFdLCBzdHIpCisgICAgICAgICAgICBpZiBoYXNzdHI6CisgICAgICAgICAgICAgICAgcmVzICs9IGxlbihub2RlWy0xXSkgKyAxCisgICAgICAgICAgICBjaGlsZHJlbiA9IG5vZGVbMTotMV0gaWYgaGFzc3RyIGVsc2Ugbm9kZVsxOl0KKyAgICAgICAgICAgIGlmIGNoaWxkcmVuOgorICAgICAgICAgICAgICAgIHJlcyArPSBYWFhST1VORFVQKGxlbihjaGlsZHJlbikpICogbm9kZXNpemUKKyAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW46CisgICAgICAgICAgICAgICAgICAgIHJlcyArPSBzaXplb2ZjaGlsZHJlbihjaGlsZCkKKyAgICAgICAgICAgIHJldHVybiByZXMKKworICAgICAgICBkZWYgY2hlY2tfc3Rfc2l6ZW9mKHN0KToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfc2l6ZW9mKHN0LCBiYXNlc2l6ZSArIG5vZGVzaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2ZjaGlsZHJlbihzdC50b3R1cGxlKCkpKQorCisgICAgICAgIGNoZWNrX3N0X3NpemVvZihwYXJzZXIuZXhwcignMiArIDMnKSkKKyAgICAgICAgY2hlY2tfc3Rfc2l6ZW9mKHBhcnNlci5leHByKCcyICsgMyArIDQnKSkKKyAgICAgICAgY2hlY2tfc3Rfc2l6ZW9mKHBhcnNlci5zdWl0ZSgneCA9IDIgKyAzJykpCisgICAgICAgIGNoZWNrX3N0X3NpemVvZihwYXJzZXIuc3VpdGUoJycpKQorICAgICAgICBjaGVja19zdF9zaXplb2YocGFyc2VyLnN1aXRlKCcjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLScpKQorICAgICAgICBjaGVja19zdF9zaXplb2YocGFyc2VyLmV4cHIoJ1snICsgJzIsJyAqIDEwMDAgKyAnXScpKQorCisKKyAgICAjIFhYWCB0ZXN0cyBmb3IgcGlja2xpbmcgYW5kIHVucGlja2xpbmcgb2YgU1Qgb2JqZWN0cyBzaG91bGQgZ28gaGVyZQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFJvdW5kdHJpcExlZ2FsU3ludGF4VGVzdENhc2UsCisgICAgICAgIElsbGVnYWxTeW50YXhUZXN0Q2FzZSwKKyAgICAgICAgQ29tcGlsZVRlc3RDYXNlLAorICAgICAgICBQYXJzZXJTdGFja0xpbWl0VGVzdENhc2UsCisgICAgICAgIFNUT2JqZWN0VGVzdENhc2UsCisgICAgKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BhcnNlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wYXJzZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxODI2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wYXJzZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BhcnNlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wYXJzZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxODI2MzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wYXJzZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BkYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BkYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTlmNzU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGRiLnB5CkBAIC0wLDAgKzEsMzc0IEBACisjIEEgdGVzdCBzdWl0ZSBmb3IgcGRiOyBhdCB0aGUgbW9tZW50LCB0aGlzIG9ubHkgdmFsaWRhdGVzIHNraXBwaW5nIG9mCisjIHNwZWNpZmllZCB0ZXN0IG1vZHVsZXMgKFJGRSAjNTE0MikuCisKK2ltcG9ydCBpbXAKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRleHR3cmFwCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisjIFRoaXMgbGl0dGxlIGhlbHBlciBjbGFzcyBpcyBlc3NlbnRpYWwgZm9yIHRlc3RpbmcgcGRiIHVuZGVyIGRvY3Rlc3QuCitmcm9tIHRlc3RfZG9jdGVzdCBpbXBvcnQgX0Zha2VJbnB1dAorCisKK2NsYXNzIFBkYlRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBydW5fcGRiKHNlbGYsIHNjcmlwdCwgY29tbWFuZHMpOgorICAgICAgICAiIiJSdW4gJ3NjcmlwdCcgbGluZXMgd2l0aCBwZGIgYW5kIHRoZSBwZGIgJ2NvbW1hbmRzJy4iIiIKKyAgICAgICAgZmlsZW5hbWUgPSAnbWFpbi5weScKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKHRleHR3cmFwLmRlZGVudChzY3JpcHQpKQorICAgICAgICBzZWxmLmFkZENsZWFudXAodGVzdF9zdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisgICAgICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgJy1tJywgJ3BkYicsIGZpbGVuYW1lXQorICAgICAgICBzdGRvdXQgPSBzdGRlcnIgPSBOb25lCisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jLmNvbW11bmljYXRlKGNvbW1hbmRzKQorICAgICAgICBwcm9jLnN0ZG91dC5jbG9zZSgpCisgICAgICAgIHByb2Muc3RkaW4uY2xvc2UoKQorICAgICAgICByZXR1cm4gc3Rkb3V0LCBzdGRlcnIKKworICAgIGRlZiB0ZXN0X2lzc3VlMTMxODMoc2VsZik6CisgICAgICAgIHNjcmlwdCA9ICIiIgorICAgICAgICAgICAgZnJvbSBiYXIgaW1wb3J0IGJhcgorCisgICAgICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgYmFyKCkKKworICAgICAgICAgICAgZGVmIG5vcGUoKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGRlZiBmb29iYXIoKToKKyAgICAgICAgICAgICAgICBmb28oKQorICAgICAgICAgICAgICAgIG5vcGUoKQorCisgICAgICAgICAgICBmb29iYXIoKQorICAgICAgICAiIiIKKyAgICAgICAgY29tbWFuZHMgPSAiIiIKKyAgICAgICAgICAgIGZyb20gYmFyIGltcG9ydCBiYXIKKyAgICAgICAgICAgIGJyZWFrIGJhcgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHN0ZXAKKyAgICAgICAgICAgIHN0ZXAKKyAgICAgICAgICAgIHF1aXQKKyAgICAgICAgIiIiCisgICAgICAgIGJhciA9ICIiIgorICAgICAgICAgICAgZGVmIGJhcigpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgIHdpdGggb3BlbignYmFyLnB5JywgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSh0ZXh0d3JhcC5kZWRlbnQoYmFyKSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3Rfc3VwcG9ydC51bmxpbmssICdiYXIucHknKQorICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHNlbGYucnVuX3BkYihzY3JpcHQsIGNvbW1hbmRzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBhbnkoJ21haW4ucHkoNSlmb28oKS0+Tm9uZScgaW4gbCBmb3IgbCBpbiBzdGRvdXQuc3BsaXRsaW5lcygpKSwKKyAgICAgICAgICAgICdGYWlsIHRvIHN0ZXAgaW50byB0aGUgY2FsbGVyIGFmdGVyIGEgcmV0dXJuJykKKworCitjbGFzcyBQZGJUZXN0SW5wdXQob2JqZWN0KToKKyAgICAiIiJDb250ZXh0IG1hbmFnZXIgdGhhdCBtYWtlcyB0ZXN0aW5nIFBkYiBpbiBkb2N0ZXN0cyBlYXNpZXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5wdXQpOgorICAgICAgICBzZWxmLmlucHV0ID0gaW5wdXQKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYucmVhbF9zdGRpbiA9IHN5cy5zdGRpbgorICAgICAgICBzeXMuc3RkaW4gPSBfRmFrZUlucHV0KHNlbGYuaW5wdXQpCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Yyk6CisgICAgICAgIHN5cy5zdGRpbiA9IHNlbGYucmVhbF9zdGRpbgorCisKK2RlZiB3cml0ZSh4KToKKyAgICBwcmludCB4CisKK2RlZiB0ZXN0X3BkYl9kaXNwbGF5aG9vaygpOgorICAgICIiIlRoaXMgdGVzdHMgdGhlIGN1c3RvbSBkaXNwbGF5aG9vayBmb3IgcGRiLgorCisgICAgPj4+IGRlZiB0ZXN0X2Z1bmN0aW9uKGZvbywgYmFyKToKKyAgICAuLi4gICAgIGltcG9ydCBwZGI7IHBkYi5QZGIoKS5zZXRfdHJhY2UoKQorICAgIC4uLiAgICAgcGFzcworCisgICAgPj4+IHdpdGggUGRiVGVzdElucHV0KFsKKyAgICAuLi4gICAgICdmb28nLAorICAgIC4uLiAgICAgJ2JhcicsCisgICAgLi4uICAgICAnZm9yIGkgaW4gcmFuZ2UoNSk6IHdyaXRlKGkpJywKKyAgICAuLi4gICAgICdjb250aW51ZScsCisgICAgLi4uIF0pOgorICAgIC4uLiAgICAgdGVzdF9mdW5jdGlvbigxLCBOb25lKQorICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9kaXNwbGF5aG9va1swXT4oMyl0ZXN0X2Z1bmN0aW9uKCkKKyAgICAtPiBwYXNzCisgICAgKFBkYikgZm9vCisgICAgMQorICAgIChQZGIpIGJhcgorICAgIChQZGIpIGZvciBpIGluIHJhbmdlKDUpOiB3cml0ZShpKQorICAgIDAKKyAgICAxCisgICAgMgorICAgIDMKKyAgICA0CisgICAgKFBkYikgY29udGludWUKKyAgICAiIiIKKworZGVmIHRlc3RfcGRiX2JyZWFrcG9pbnRfY29tbWFuZHMoKToKKyAgICAiIiJUZXN0IGJhc2ljIGNvbW1hbmRzIHJlbGF0ZWQgdG8gYnJlYWtwb2ludHMuCisKKyAgICA+Pj4gZGVmIHRlc3RfZnVuY3Rpb24oKToKKyAgICAuLi4gICAgIGltcG9ydCBwZGI7IHBkYi5QZGIoKS5zZXRfdHJhY2UoKQorICAgIC4uLiAgICAgcHJpbnQoMSkKKyAgICAuLi4gICAgIHByaW50KDIpCisgICAgLi4uICAgICBwcmludCgzKQorICAgIC4uLiAgICAgcHJpbnQoNCkKKworICAgIEZpcnN0LCBuZWVkIHRvIGNsZWFyIGJkYiBzdGF0ZSB0aGF0IG1pZ2h0IGJlIGxlZnQgb3ZlciBmcm9tIHByZXZpb3VzIHRlc3RzLgorICAgIE90aGVyd2lzZSwgdGhlIG5ldyBicmVha3BvaW50cyBtaWdodCBnZXQgYXNzaWduZWQgZGlmZmVyZW50IG51bWJlcnMuCisKKyAgICA+Pj4gZnJvbSBiZGIgaW1wb3J0IEJyZWFrcG9pbnQKKyAgICA+Pj4gQnJlYWtwb2ludC5uZXh0ID0gMQorICAgID4+PiBCcmVha3BvaW50LmJwbGlzdCA9IHt9CisgICAgPj4+IEJyZWFrcG9pbnQuYnBieW51bWJlciA9IFtOb25lXQorCisgICAgTm93IHRlc3QgdGhlIGJyZWFrcG9pbnQgY29tbWFuZHMuICBOT1JNQUxJWkVfV0hJVEVTUEFDRSBpcyBuZWVkZWQgYmVjYXVzZQorICAgIHRoZSBicmVha3BvaW50IGxpc3Qgb3V0cHV0cyBhIHRhYiBmb3IgdGhlICJzdG9wIG9ubHkiIGFuZCAiaWdub3JlIG5leHQiCisgICAgbGluZXMsIHdoaWNoIHdlIGRvbid0IHdhbnQgdG8gcHV0IGluIGhlcmUuCisKKyAgICA+Pj4gd2l0aCBQZGJUZXN0SW5wdXQoWyAgIyBkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKKyAgICAuLi4gICAgICdicmVhayAzJywKKyAgICAuLi4gICAgICdkaXNhYmxlIDEnLAorICAgIC4uLiAgICAgJ2lnbm9yZSAxIDEwJywKKyAgICAuLi4gICAgICdjb25kaXRpb24gMSAxIDwgMicsCisgICAgLi4uICAgICAnYnJlYWsgNCcsCisgICAgLi4uICAgICAnYnJlYWsgNCcsCisgICAgLi4uICAgICAnYnJlYWsnLAorICAgIC4uLiAgICAgJ2NsZWFyIDMnLAorICAgIC4uLiAgICAgJ2JyZWFrJywKKyAgICAuLi4gICAgICdjb25kaXRpb24gMScsCisgICAgLi4uICAgICAnZW5hYmxlIDEnLAorICAgIC4uLiAgICAgJ2NsZWFyIDEnLAorICAgIC4uLiAgICAgJ2NvbW1hbmRzIDInLAorICAgIC4uLiAgICAgJ3ByaW50IDQyJywKKyAgICAuLi4gICAgICdlbmQnLAorICAgIC4uLiAgICAgJ2NvbnRpbnVlJywgICMgd2lsbCBzdG9wIGF0IGJyZWFrcG9pbnQgMiAobGluZSA0KQorICAgIC4uLiAgICAgJ2NsZWFyJywgICAgICMgY2xlYXIgYWxsIQorICAgIC4uLiAgICAgJ3knLAorICAgIC4uLiAgICAgJ3RicmVhayA1JywKKyAgICAuLi4gICAgICdjb250aW51ZScsICAjIHdpbGwgc3RvcCBhdCB0ZW1wb3JhcnkgYnJlYWtwb2ludAorICAgIC4uLiAgICAgJ2JyZWFrJywgICAgICMgbWFrZSBzdXJlIGJyZWFrcG9pbnQgaXMgZ29uZQorICAgIC4uLiAgICAgJ2NvbnRpbnVlJywKKyAgICAuLi4gXSk6CisgICAgLi4uICAgIHRlc3RfZnVuY3Rpb24oKQorICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9icmVha3BvaW50X2NvbW1hbmRzWzBdPigzKXRlc3RfZnVuY3Rpb24oKQorICAgIC0+IHByaW50KDEpCisgICAgKFBkYikgYnJlYWsgMworICAgIEJyZWFrcG9pbnQgMSBhdCA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX2JyZWFrcG9pbnRfY29tbWFuZHNbMF0+OjMKKyAgICAoUGRiKSBkaXNhYmxlIDEKKyAgICAoUGRiKSBpZ25vcmUgMSAxMAorICAgIFdpbGwgaWdub3JlIG5leHQgMTAgY3Jvc3NpbmdzIG9mIGJyZWFrcG9pbnQgMS4KKyAgICAoUGRiKSBjb25kaXRpb24gMSAxIDwgMgorICAgIChQZGIpIGJyZWFrIDQKKyAgICBCcmVha3BvaW50IDIgYXQgPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9icmVha3BvaW50X2NvbW1hbmRzWzBdPjo0CisgICAgKFBkYikgYnJlYWsgNAorICAgIEJyZWFrcG9pbnQgMyBhdCA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX2JyZWFrcG9pbnRfY29tbWFuZHNbMF0+OjQKKyAgICAoUGRiKSBicmVhaworICAgIE51bSBUeXBlICAgICAgICAgRGlzcCBFbmIgICBXaGVyZQorICAgIDEgICBicmVha3BvaW50ICAga2VlcCBubyAgICBhdCA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX2JyZWFrcG9pbnRfY29tbWFuZHNbMF0+OjMKKyAgICAgICAgICAgIHN0b3Agb25seSBpZiAxIDwgMgorICAgICAgICAgICAgaWdub3JlIG5leHQgMTAgaGl0cworICAgIDIgICBicmVha3BvaW50ICAga2VlcCB5ZXMgICBhdCA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX2JyZWFrcG9pbnRfY29tbWFuZHNbMF0+OjQKKyAgICAzICAgYnJlYWtwb2ludCAgIGtlZXAgeWVzICAgYXQgPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9icmVha3BvaW50X2NvbW1hbmRzWzBdPjo0CisgICAgKFBkYikgY2xlYXIgMworICAgIERlbGV0ZWQgYnJlYWtwb2ludCAzCisgICAgKFBkYikgYnJlYWsKKyAgICBOdW0gVHlwZSAgICAgICAgIERpc3AgRW5iICAgV2hlcmUKKyAgICAxICAgYnJlYWtwb2ludCAgIGtlZXAgbm8gICAgYXQgPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9icmVha3BvaW50X2NvbW1hbmRzWzBdPjozCisgICAgICAgICAgICBzdG9wIG9ubHkgaWYgMSA8IDIKKyAgICAgICAgICAgIGlnbm9yZSBuZXh0IDEwIGhpdHMKKyAgICAyICAgYnJlYWtwb2ludCAgIGtlZXAgeWVzICAgYXQgPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9icmVha3BvaW50X2NvbW1hbmRzWzBdPjo0CisgICAgKFBkYikgY29uZGl0aW9uIDEKKyAgICBCcmVha3BvaW50IDEgaXMgbm93IHVuY29uZGl0aW9uYWwuCisgICAgKFBkYikgZW5hYmxlIDEKKyAgICAoUGRiKSBjbGVhciAxCisgICAgRGVsZXRlZCBicmVha3BvaW50IDEKKyAgICAoUGRiKSBjb21tYW5kcyAyCisgICAgKGNvbSkgcHJpbnQgNDIKKyAgICAoY29tKSBlbmQKKyAgICAoUGRiKSBjb250aW51ZQorICAgIDEKKyAgICA0MgorICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9icmVha3BvaW50X2NvbW1hbmRzWzBdPig0KXRlc3RfZnVuY3Rpb24oKQorICAgIC0+IHByaW50KDIpCisgICAgKFBkYikgY2xlYXIKKyAgICBDbGVhciBhbGwgYnJlYWtzPyB5CisgICAgKFBkYikgdGJyZWFrIDUKKyAgICBCcmVha3BvaW50IDQgYXQgPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9icmVha3BvaW50X2NvbW1hbmRzWzBdPjo1CisgICAgKFBkYikgY29udGludWUKKyAgICAyCisgICAgRGVsZXRlZCBicmVha3BvaW50IDQKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfYnJlYWtwb2ludF9jb21tYW5kc1swXT4oNSl0ZXN0X2Z1bmN0aW9uKCkKKyAgICAtPiBwcmludCgzKQorICAgIChQZGIpIGJyZWFrCisgICAgKFBkYikgY29udGludWUKKyAgICAzCisgICAgNAorICAgICIiIgorCisKK2RlZiB0ZXN0X3BkYl9za2lwX21vZHVsZXMoKToKKyAgICAiIiJUaGlzIGlsbHVzdHJhdGVzIHRoZSBzaW1wbGUgY2FzZSBvZiBtb2R1bGUgc2tpcHBpbmcuCisKKyAgICA+Pj4gZGVmIHNraXBfbW9kdWxlKCk6CisgICAgLi4uICAgICBpbXBvcnQgc3RyaW5nCisgICAgLi4uICAgICBpbXBvcnQgcGRiOyBwZGIuUGRiKHNraXA9WydzdHJpbmcqJ10pLnNldF90cmFjZSgpCisgICAgLi4uICAgICBzdHJpbmcubG93ZXIoJ0ZPTycpCisKKyAgICA+Pj4gd2l0aCBQZGJUZXN0SW5wdXQoWworICAgIC4uLiAgICAgJ3N0ZXAnLAorICAgIC4uLiAgICAgJ2NvbnRpbnVlJywKKyAgICAuLi4gXSk6CisgICAgLi4uICAgICBza2lwX21vZHVsZSgpCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX3NraXBfbW9kdWxlc1swXT4oNClza2lwX21vZHVsZSgpCisgICAgLT4gc3RyaW5nLmxvd2VyKCdGT08nKQorICAgIChQZGIpIHN0ZXAKKyAgICAtLVJldHVybi0tCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX3NraXBfbW9kdWxlc1swXT4oNClza2lwX21vZHVsZSgpLT5Ob25lCisgICAgLT4gc3RyaW5nLmxvd2VyKCdGT08nKQorICAgIChQZGIpIGNvbnRpbnVlCisgICAgIiIiCisKKworIyBNb2R1bGUgZm9yIHRlc3Rpbmcgc2tpcHBpbmcgb2YgbW9kdWxlIHRoYXQgbWFrZXMgYSBjYWxsYmFjaworbW9kID0gaW1wLm5ld19tb2R1bGUoJ21vZHVsZV90b19za2lwJykKK2V4ZWMgJ2RlZiBmb29fcG9ueShjYWxsYmFjayk6IHggPSAxOyBjYWxsYmFjaygpOyByZXR1cm4gTm9uZScgaW4gbW9kLl9fZGljdF9fCisKKworZGVmIHRlc3RfcGRiX3NraXBfbW9kdWxlc193aXRoX2NhbGxiYWNrKCk6CisgICAgIiIiVGhpcyBpbGx1c3RyYXRlcyBza2lwcGluZyBvZiBtb2R1bGVzIHRoYXQgY2FsbCBpbnRvIG90aGVyIGNvZGUuCisKKyAgICA+Pj4gZGVmIHNraXBfbW9kdWxlKCk6CisgICAgLi4uICAgICBkZWYgY2FsbGJhY2soKToKKyAgICAuLi4gICAgICAgICByZXR1cm4gTm9uZQorICAgIC4uLiAgICAgaW1wb3J0IHBkYjsgcGRiLlBkYihza2lwPVsnbW9kdWxlX3RvX3NraXAqJ10pLnNldF90cmFjZSgpCisgICAgLi4uICAgICBtb2QuZm9vX3BvbnkoY2FsbGJhY2spCisKKyAgICA+Pj4gd2l0aCBQZGJUZXN0SW5wdXQoWworICAgIC4uLiAgICAgJ3N0ZXAnLAorICAgIC4uLiAgICAgJ3N0ZXAnLAorICAgIC4uLiAgICAgJ3N0ZXAnLAorICAgIC4uLiAgICAgJ3N0ZXAnLAorICAgIC4uLiAgICAgJ3N0ZXAnLAorICAgIC4uLiAgICAgJ2NvbnRpbnVlJywKKyAgICAuLi4gXSk6CisgICAgLi4uICAgICBza2lwX21vZHVsZSgpCisgICAgLi4uICAgICBwYXNzICAjIHByb3ZpZGVzIHNvbWV0aGluZyB0byAic3RlcCIgdG8KKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfc2tpcF9tb2R1bGVzX3dpdGhfY2FsbGJhY2tbMF0+KDUpc2tpcF9tb2R1bGUoKQorICAgIC0+IG1vZC5mb29fcG9ueShjYWxsYmFjaykKKyAgICAoUGRiKSBzdGVwCisgICAgLS1DYWxsLS0KKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfc2tpcF9tb2R1bGVzX3dpdGhfY2FsbGJhY2tbMF0+KDIpY2FsbGJhY2soKQorICAgIC0+IGRlZiBjYWxsYmFjaygpOgorICAgIChQZGIpIHN0ZXAKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfc2tpcF9tb2R1bGVzX3dpdGhfY2FsbGJhY2tbMF0+KDMpY2FsbGJhY2soKQorICAgIC0+IHJldHVybiBOb25lCisgICAgKFBkYikgc3RlcAorICAgIC0tUmV0dXJuLS0KKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfc2tpcF9tb2R1bGVzX3dpdGhfY2FsbGJhY2tbMF0+KDMpY2FsbGJhY2soKS0+Tm9uZQorICAgIC0+IHJldHVybiBOb25lCisgICAgKFBkYikgc3RlcAorICAgIC0tUmV0dXJuLS0KKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfc2tpcF9tb2R1bGVzX3dpdGhfY2FsbGJhY2tbMF0+KDUpc2tpcF9tb2R1bGUoKS0+Tm9uZQorICAgIC0+IG1vZC5mb29fcG9ueShjYWxsYmFjaykKKyAgICAoUGRiKSBzdGVwCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX3NraXBfbW9kdWxlc193aXRoX2NhbGxiYWNrWzFdPigxMCk8bW9kdWxlPigpCisgICAgLT4gcGFzcyAgIyBwcm92aWRlcyBzb21ldGhpbmcgdG8gInN0ZXAiIHRvCisgICAgKFBkYikgY29udGludWUKKyAgICAiIiIKKworCitkZWYgdGVzdF9wZGJfY29udGludWVfaW5fYm90dG9tZnJhbWUoKToKKyAgICAiIiJUZXN0IHRoYXQgImNvbnRpbnVlIiBhbmQgIm5leHQiIHdvcmsgcHJvcGVybHkgaW4gYm90dG9tIGZyYW1lIChpc3N1ZSAjNTI5NCkuCisKKyAgICA+Pj4gZGVmIHRlc3RfZnVuY3Rpb24oKToKKyAgICAuLi4gICAgIGltcG9ydCBwZGIsIHN5czsgaW5zdCA9IHBkYi5QZGIoKQorICAgIC4uLiAgICAgaW5zdC5zZXRfdHJhY2UoKQorICAgIC4uLiAgICAgaW5zdC5ib3RmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoKSAgIyBoYWNrZXJ5IHRvIGdldCB0aGUgcmlnaHQgYm90ZnJhbWUKKyAgICAuLi4gICAgIHByaW50KDEpCisgICAgLi4uICAgICBwcmludCgyKQorICAgIC4uLiAgICAgcHJpbnQoMykKKyAgICAuLi4gICAgIHByaW50KDQpCisKKyAgICBGaXJzdCwgbmVlZCB0byBjbGVhciBiZGIgc3RhdGUgdGhhdCBtaWdodCBiZSBsZWZ0IG92ZXIgZnJvbSBwcmV2aW91cyB0ZXN0cy4KKyAgICBPdGhlcndpc2UsIHRoZSBuZXcgYnJlYWtwb2ludHMgbWlnaHQgZ2V0IGFzc2lnbmVkIGRpZmZlcmVudCBudW1iZXJzLgorCisgICAgPj4+IGZyb20gYmRiIGltcG9ydCBCcmVha3BvaW50CisgICAgPj4+IEJyZWFrcG9pbnQubmV4dCA9IDEKKyAgICA+Pj4gQnJlYWtwb2ludC5icGxpc3QgPSB7fQorICAgID4+PiBCcmVha3BvaW50LmJwYnludW1iZXIgPSBbTm9uZV0KKworICAgID4+PiB3aXRoIFBkYlRlc3RJbnB1dChbCisgICAgLi4uICAgICAnbmV4dCcsCisgICAgLi4uICAgICAnYnJlYWsgNycsCisgICAgLi4uICAgICAnY29udGludWUnLAorICAgIC4uLiAgICAgJ25leHQnLAorICAgIC4uLiAgICAgJ2NvbnRpbnVlJywKKyAgICAuLi4gICAgICdjb250aW51ZScsCisgICAgLi4uIF0pOgorICAgIC4uLiAgICB0ZXN0X2Z1bmN0aW9uKCkKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfY29udGludWVfaW5fYm90dG9tZnJhbWVbMF0+KDQpdGVzdF9mdW5jdGlvbigpCisgICAgLT4gaW5zdC5ib3RmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoKSAgIyBoYWNrZXJ5IHRvIGdldCB0aGUgcmlnaHQgYm90ZnJhbWUKKyAgICAoUGRiKSBuZXh0CisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX2NvbnRpbnVlX2luX2JvdHRvbWZyYW1lWzBdPig1KXRlc3RfZnVuY3Rpb24oKQorICAgIC0+IHByaW50KDEpCisgICAgKFBkYikgYnJlYWsgNworICAgIEJyZWFrcG9pbnQgMSBhdCA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX2NvbnRpbnVlX2luX2JvdHRvbWZyYW1lWzBdPjo3CisgICAgKFBkYikgY29udGludWUKKyAgICAxCisgICAgMgorICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9jb250aW51ZV9pbl9ib3R0b21mcmFtZVswXT4oNyl0ZXN0X2Z1bmN0aW9uKCkKKyAgICAtPiBwcmludCgzKQorICAgIChQZGIpIG5leHQKKyAgICAzCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX2NvbnRpbnVlX2luX2JvdHRvbWZyYW1lWzBdPig4KXRlc3RfZnVuY3Rpb24oKQorICAgIC0+IHByaW50KDQpCisgICAgKFBkYikgY29udGludWUKKyAgICA0CisgICAgIiIiCisKK2NsYXNzIE1vZHVsZUluaXRUZXN0ZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZmlsZW5hbWVfY29ycmVjdChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEluIGlzc3VlIDc3NTAsIGl0IHdhcyBmb3VuZCB0aGF0IGlmIHRoZSBmaWxlbmFtZSBoYXMgYSBzZXF1ZW5jZSB0aGF0CisgICAgICAgIHJlc29sdmVzIHRvIGFuIGVzY2FwZSBjaGFyYWN0ZXIgaW4gYSBQeXRob24gc3RyaW5nIChzdWNoIGFzIFx0KSwgaXQKKyAgICAgICAgd2lsbCBiZSB0cmVhdGVkIGFzIHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4KKyAgICAgICAgIiIiCisgICAgICAgICMgdGhlIHRlc3RfZm4gbXVzdCBjb250YWluIHNvbWV0aGluZyBsaWtlIFx0CisgICAgICAgICMgb24gV2luZG93cywgdGhpcyB3aWxsIGNyZWF0ZSAndGVzdF9tb2QucHknIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAgICAgICAgIyBvbiBVbml4LCB0aGlzIHdpbGwgY3JlYXRlICcuXHRlc3RfbW9kLnB5JyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgICAgICAgIHRlc3RfZm4gPSAnLlxcdGVzdF9tb2QucHknCisgICAgICAgIGNvZGUgPSAncHJpbnQoInRlc3RpbmcgcGRiIiknCisgICAgICAgIHdpdGggb3Blbih0ZXN0X2ZuLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGNvZGUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5yZW1vdmUsIHRlc3RfZm4pCisgICAgICAgIGNtZCA9IFtzeXMuZXhlY3V0YWJsZSwgJy1tJywgJ3BkYicsIHRlc3RfZm4sXQorICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsCisgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAorICAgICAgICAgICAgKQorICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHByb2MuY29tbXVuaWNhdGUoJ3F1aXRcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oY29kZSwgc3Rkb3V0LCAicGRiIG11bmdlZCB0aGUgZmlsZW5hbWUiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfcGRiCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfcGRiLCB2ZXJib3NpdHk9VHJ1ZSkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBQZGJUZXN0Q2FzZSwKKyAgICAgICAgTW9kdWxlSW5pdFRlc3RlcikKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGRiLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BkYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4NDNmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BkYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGRiLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BkYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4NDNmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BkYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDVmNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKQEAgLTAsMCArMSwyNDQgQEAKK2ltcG9ydCBkaXMKK2ltcG9ydCBzeXMKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IHVuaXR0ZXN0CisKK2RlZiBkaXNhc3NlbWJsZShmdW5jKToKKyAgICBmID0gU3RyaW5nSU8oKQorICAgIHRtcCA9IHN5cy5zdGRvdXQKKyAgICBzeXMuc3Rkb3V0ID0gZgorICAgIGRpcy5kaXMoZnVuYykKKyAgICBzeXMuc3Rkb3V0ID0gdG1wCisgICAgcmVzdWx0ID0gZi5nZXR2YWx1ZSgpCisgICAgZi5jbG9zZSgpCisgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgZGlzX3NpbmdsZShsaW5lKToKKyAgICByZXR1cm4gZGlzYXNzZW1ibGUoY29tcGlsZShsaW5lLCAnJywgJ3NpbmdsZScpKQorCitjbGFzcyBUZXN0VHJhbmZvcm1zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3Vub3Qoc2VsZik6CisgICAgICAgICMgVU5BUllfTk9UIFBPUF9KVU1QX0lGX0ZBTFNFICAtLT4gIFBPUF9KVU1QX0lGX1RSVUUKKyAgICAgICAgZGVmIHVub3QoeCk6CisgICAgICAgICAgICBpZiBub3QgeCA9PSAyOgorICAgICAgICAgICAgICAgIGRlbCB4CisgICAgICAgIGFzbSA9IGRpc2Fzc2VtYmxlKHVub3QpCisgICAgICAgIGZvciBlbGVtIGluICgnVU5BUllfTk9UJywgJ1BPUF9KVU1QX0lGX0ZBTFNFJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGVsZW0sIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignUE9QX0pVTVBfSUZfVFJVRScsIGFzbSkKKworICAgIGRlZiB0ZXN0X2VsaW1faW52ZXJzaW9uX29mX2lzX29yX2luKHNlbGYpOgorICAgICAgICBmb3IgbGluZSwgZWxlbSBpbiAoCisgICAgICAgICAgICAoJ25vdCBhIGlzIGInLCAnKGlzIG5vdCknLCksCisgICAgICAgICAgICAoJ25vdCBhIGluIGInLCAnKG5vdCBpbiknLCksCisgICAgICAgICAgICAoJ25vdCBhIGlzIG5vdCBiJywgJyhpcyknLCksCisgICAgICAgICAgICAoJ25vdCBhIG5vdCBpbiBiJywgJyhpbiknLCksCisgICAgICAgICAgICApOgorICAgICAgICAgICAgYXNtID0gZGlzX3NpbmdsZShsaW5lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlbGVtLCBhc20pCisKKyAgICBkZWYgdGVzdF9ub25lX2FzX2NvbnN0YW50KHNlbGYpOgorICAgICAgICAjIExPQURfR0xPQkFMIE5vbmUgIC0tPiAgTE9BRF9DT05TVCBOb25lCisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgYXNtID0gZGlzYXNzZW1ibGUoZikKKyAgICAgICAgZm9yIGVsZW0gaW4gKCdMT0FEX0dMT0JBTCcsKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oZWxlbSwgYXNtKQorICAgICAgICBmb3IgZWxlbSBpbiAoJ0xPQURfQ09OU1QnLCAnKE5vbmUpJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVsZW0sIGFzbSkKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICdBZGRpbmcgYSBkb2NzdHJpbmcgbWFkZSB0aGlzIHRlc3QgZmFpbCBpbiBQeTIuNS4wJworICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRJbignTE9BRF9DT05TVCcsIGRpc2Fzc2VtYmxlKGYpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdMT0FEX0dMT0JBTCcsIGRpc2Fzc2VtYmxlKGYpKQorCisgICAgZGVmIHRlc3Rfd2hpbGVfb25lKHNlbGYpOgorICAgICAgICAjIFNraXAgb3ZlcjogIExPQURfQ09OU1QgdHJ1ZWNvbnN0ICBQT1BfSlVNUF9JRl9GQUxTRSB4eAorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICByZXR1cm4gbGlzdAorICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQorICAgICAgICBmb3IgZWxlbSBpbiAoJ0xPQURfQ09OU1QnLCAnUE9QX0pVTVBfSUZfRkFMU0UnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oZWxlbSwgYXNtKQorICAgICAgICBmb3IgZWxlbSBpbiAoJ0pVTVBfQUJTT0xVVEUnLCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVsZW0sIGFzbSkKKworICAgIGRlZiB0ZXN0X3BhY2tfdW5wYWNrKHNlbGYpOgorICAgICAgICBmb3IgbGluZSwgZWxlbSBpbiAoCisgICAgICAgICAgICAoJ2EsID0gYSwnLCAnTE9BRF9DT05TVCcsKSwKKyAgICAgICAgICAgICgnYSwgYiA9IGEsIGInLCAnUk9UX1RXTycsKSwKKyAgICAgICAgICAgICgnYSwgYiwgYyA9IGEsIGIsIGMnLCAnUk9UX1RIUkVFJywpLAorICAgICAgICAgICAgKToKKyAgICAgICAgICAgIGFzbSA9IGRpc19zaW5nbGUobGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZWxlbSwgYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbignQlVJTERfVFVQTEUnLCBhc20pCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdVTlBBQ0tfVFVQTEUnLCBhc20pCisKKyAgICBkZWYgdGVzdF9mb2xkaW5nX29mX3R1cGxlc19vZl9jb25zdGFudHMoc2VsZik6CisgICAgICAgIGZvciBsaW5lLCBlbGVtIGluICgKKyAgICAgICAgICAgICgnYSA9IDEsMiwzJywgJygoMSwgMiwgMykpJyksCisgICAgICAgICAgICAoJygiYSIsImIiLCJjIiknLCAiKCgnYScsICdiJywgJ2MnKSkiKSwKKyAgICAgICAgICAgICgnYSxiLGMgPSAxLDIsMycsICcoKDEsIDIsIDMpKScpLAorICAgICAgICAgICAgKCcoTm9uZSwgMSwgTm9uZSknLCAnKChOb25lLCAxLCBOb25lKSknKSwKKyAgICAgICAgICAgICgnKCgxLCAyKSwgMywgNCknLCAnKCgoMSwgMiksIDMsIDQpKScpLAorICAgICAgICAgICAgKToKKyAgICAgICAgICAgIGFzbSA9IGRpc19zaW5nbGUobGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZWxlbSwgYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbignQlVJTERfVFVQTEUnLCBhc20pCisKKyAgICAgICAgIyBCdWcgMTA1MzgxOTogIFR1cGxlIG9mIGNvbnN0YW50cyBtaXNpZGVudGlmaWVkIHdoZW4gcHJlc2VudGVkIHdpdGg6CisgICAgICAgICMgLiAuIC4gb3Bjb2RlX3dpdGhfYXJnIDEwMCAgIHVuYXJ5X29wY29kZSAgIEJVSUxEX1RVUExFIDEgIC4gLiAuCisgICAgICAgICMgVGhlIGZvbGxvd2luZyB3b3VsZCBzZWdmYXVsdCB1cG9uIGNvbXBpbGF0aW9uCisgICAgICAgIGRlZiBjcmF0ZXIoKToKKyAgICAgICAgICAgICh+WworICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksCisgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwKKyAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LAorICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksCisgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwKKyAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LAorICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksCisgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwKKyAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LAorICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksCisgICAgICAgICAgICBdLCkKKworICAgIGRlZiB0ZXN0X2ZvbGRpbmdfb2ZfYmlub3BzX29uX2NvbnN0YW50cyhzZWxmKToKKyAgICAgICAgZm9yIGxpbmUsIGVsZW0gaW4gKAorICAgICAgICAgICAgKCdhID0gMiszKzQnLCAnKDkpJyksICAgICAgICAgICAgICAgICAgICMgY2hhaW5lZCBmb2xkCisgICAgICAgICAgICAoJyJAIio0JywgIignQEBAQCcpIiksICAgICAgICAgICAgICAgICAgIyBjaGVjayBzdHJpbmcgb3BzCisgICAgICAgICAgICAoJ2E9ImFiYyIgKyAiZGVmIicsICIoJ2FiY2RlZicpIiksICAgICAgIyBjaGVjayBzdHJpbmcgb3BzCisgICAgICAgICAgICAoJ2EgPSAzKio0JywgJyg4MSknKSwgICAgICAgICAgICAgICAgICAgIyBiaW5hcnkgcG93ZXIKKyAgICAgICAgICAgICgnYSA9IDMqNCcsICcoMTIpJyksICAgICAgICAgICAgICAgICAgICAjIGJpbmFyeSBtdWx0aXBseQorICAgICAgICAgICAgKCdhID0gMTMvLzQnLCAnKDMpJyksICAgICAgICAgICAgICAgICAgICMgYmluYXJ5IGZsb29yIGRpdmlkZQorICAgICAgICAgICAgKCdhID0gMTQlNCcsICcoMiknKSwgICAgICAgICAgICAgICAgICAgICMgYmluYXJ5IG1vZHVsbworICAgICAgICAgICAgKCdhID0gMiszJywgJyg1KScpLCAgICAgICAgICAgICAgICAgICAgICMgYmluYXJ5IGFkZAorICAgICAgICAgICAgKCdhID0gMTMtNCcsICcoOSknKSwgICAgICAgICAgICAgICAgICAgICMgYmluYXJ5IHN1YnRyYWN0CisgICAgICAgICAgICAoJ2EgPSAoMTIsMTMpWzFdJywgJygxMyknKSwgICAgICAgICAgICAgIyBiaW5hcnkgc3Vic2NyCisgICAgICAgICAgICAoJ2EgPSAxMyA8PCAyJywgJyg1MiknKSwgICAgICAgICAgICAgICAgIyBiaW5hcnkgbHNoaWZ0CisgICAgICAgICAgICAoJ2EgPSAxMyA+PiAyJywgJygzKScpLCAgICAgICAgICAgICAgICAgIyBiaW5hcnkgcnNoaWZ0CisgICAgICAgICAgICAoJ2EgPSAxMyAmIDcnLCAnKDUpJyksICAgICAgICAgICAgICAgICAgIyBiaW5hcnkgYW5kCisgICAgICAgICAgICAoJ2EgPSAxMyBeIDcnLCAnKDEwKScpLCAgICAgICAgICAgICAgICAgIyBiaW5hcnkgeG9yCisgICAgICAgICAgICAoJ2EgPSAxMyB8IDcnLCAnKDE1KScpLCAgICAgICAgICAgICAgICAgIyBiaW5hcnkgb3IKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICBhc20gPSBkaXNfc2luZ2xlKGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVsZW0sIGFzbSwgYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbignQklOQVJZXycsIGFzbSkKKworICAgICAgICAjIFZlcmlmeSB0aGF0IHVuZm9sZGFibGVzIGFyZSBza2lwcGVkCisgICAgICAgIGFzbSA9IGRpc19zaW5nbGUoJ2E9MisiYiInKQorICAgICAgICBzZWxmLmFzc2VydEluKCcoMiknLCBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIignYicpIiwgYXNtKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgbGFyZ2Ugc2VxdWVuY2VzIGRvIG5vdCByZXN1bHQgZnJvbSBmb2xkaW5nCisgICAgICAgIGFzbSA9IGRpc19zaW5nbGUoJ2E9IngiKjEwMDAnKQorICAgICAgICBzZWxmLmFzc2VydEluKCcoMTAwMCknLCBhc20pCisKKyAgICBkZWYgdGVzdF9iaW5hcnlfc3Vic2NyX29uX3VuaWNvZGUoc2VsZik6CisgICAgICAgICMgdW5pY29kZSBzdHJpbmdzIGRvbid0IGdldCBvcHRpbWl6ZWQKKyAgICAgICAgYXNtID0gZGlzX3NpbmdsZSgndSJmb28iWzBdJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiKHUnZicpIiwgYXNtKQorICAgICAgICBzZWxmLmFzc2VydEluKCdCSU5BUllfU1VCU0NSJywgYXNtKQorICAgICAgICBhc20gPSBkaXNfc2luZ2xlKCd1Ilx1MDA2MVx1ZmZmZiJbMV0nKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCIodSdcXHVmZmZmJykiLCBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0JJTkFSWV9TVUJTQ1InLCBhc20pCisKKyAgICAgICAgIyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgYXNtID0gZGlzX3NpbmdsZSgndSJmdXUiWzEwXScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0JJTkFSWV9TVUJTQ1InLCBhc20pCisgICAgICAgICMgbm9uLUJNUCBjaGFyIChzZWUgIzUwNTcpCisgICAgICAgIGFzbSA9IGRpc19zaW5nbGUoJ3UiXFUwMDAxMjM0NSJbMF0nKQorICAgICAgICBzZWxmLmFzc2VydEluKCdCSU5BUllfU1VCU0NSJywgYXNtKQorICAgICAgICBhc20gPSBkaXNfc2luZ2xlKCd1IlxVMDAwMTIzNDVhYmNkZWYiWzNdJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQklOQVJZX1NVQlNDUicsIGFzbSkKKworCisgICAgZGVmIHRlc3RfZm9sZGluZ19vZl91bmFyeW9wc19vbl9jb25zdGFudHMoc2VsZik6CisgICAgICAgIGZvciBsaW5lLCBlbGVtIGluICgKKyAgICAgICAgICAgICgnYDFgJywgIignMScpIiksICAgICAgICAgICAgICAgICAgICAgICAjIHVuYXJ5IGNvbnZlcnQKKyAgICAgICAgICAgICgnLTAuNScsICcoLTAuNSknKSwgICAgICAgICAgICAgICAgICAgICAjIHVuYXJ5IG5lZ2F0aXZlCisgICAgICAgICAgICAoJ34tMicsICcoMSknKSwgICAgICAgICAgICAgICAgICAgICAgICAgIyB1bmFyeSBpbnZlcnQKKyAgICAgICAgKToKKyAgICAgICAgICAgIGFzbSA9IGRpc19zaW5nbGUobGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZWxlbSwgYXNtLCBhc20pCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdVTkFSWV8nLCBhc20pCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB1bmZvbGRhYmxlcyBhcmUgc2tpcHBlZAorICAgICAgICBmb3IgbGluZSwgZWxlbSBpbiAoCisgICAgICAgICAgICAoJy0iYWJjIicsICIoJ2FiYycpIiksICAgICAgICAgICAgICAgICAgIyB1bmFyeSBuZWdhdGl2ZQorICAgICAgICAgICAgKCd+ImFiYyInLCAiKCdhYmMnKSIpLCAgICAgICAgICAgICAgICAgICMgdW5hcnkgaW52ZXJ0CisgICAgICAgICk6CisgICAgICAgICAgICBhc20gPSBkaXNfc2luZ2xlKGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVsZW0sIGFzbSwgYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignVU5BUllfJywgYXNtKQorCisgICAgZGVmIHRlc3RfZWxpbV9leHRyYV9yZXR1cm4oc2VsZik6CisgICAgICAgICMgUkVUVVJOIExPQURfQ09OU1QgTm9uZSBSRVRVUk4gIC0tPiAgUkVUVVJOCisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgYXNtID0gZGlzYXNzZW1ibGUoZikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignTE9BRF9DT05TVCcsIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignKE5vbmUpJywgYXNtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdSRVRVUk5fVkFMVUUnKSwgMSkKKworICAgIGRlZiB0ZXN0X2VsaW1fanVtcF90b19yZXR1cm4oc2VsZik6CisgICAgICAgICMgSlVNUF9GT1JXQVJEIHRvIFJFVFVSTiAtLT4gIFJFVFVSTgorICAgICAgICBkZWYgZihjb25kLCB0cnVlX3ZhbHVlLCBmYWxzZV92YWx1ZSk6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZV92YWx1ZSBpZiBjb25kIGVsc2UgZmFsc2VfdmFsdWUKKyAgICAgICAgYXNtID0gZGlzYXNzZW1ibGUoZikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignSlVNUF9GT1JXQVJEJywgYXNtKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdKVU1QX0FCU09MVVRFJywgYXNtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdSRVRVUk5fVkFMVUUnKSwgMikKKworICAgIGRlZiB0ZXN0X2VsaW1fanVtcF9hZnRlcl9yZXR1cm4xKHNlbGYpOgorICAgICAgICAjIEVsaW1pbmF0ZSBkZWFkIGNvZGU6IGp1bXBzIGltbWVkaWF0ZWx5IGFmdGVyIHJldHVybnMgY2FuJ3QgYmUgcmVhY2hlZAorICAgICAgICBkZWYgZihjb25kMSwgY29uZDIpOgorICAgICAgICAgICAgaWYgY29uZDE6IHJldHVybiAxCisgICAgICAgICAgICBpZiBjb25kMjogcmV0dXJuIDIKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIDMKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgaWYgY29uZDE6IHJldHVybiA0CisgICAgICAgICAgICAgICAgcmV0dXJuIDUKKyAgICAgICAgICAgIHJldHVybiA2CisgICAgICAgIGFzbSA9IGRpc2Fzc2VtYmxlKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0pVTVBfRk9SV0FSRCcsIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignSlVNUF9BQlNPTFVURScsIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnUkVUVVJOX1ZBTFVFJyksIDYpCisKKyAgICBkZWYgdGVzdF9lbGltX2p1bXBfYWZ0ZXJfcmV0dXJuMihzZWxmKToKKyAgICAgICAgIyBFbGltaW5hdGUgZGVhZCBjb2RlOiBqdW1wcyBpbW1lZGlhdGVseSBhZnRlciByZXR1cm5zIGNhbid0IGJlIHJlYWNoZWQKKyAgICAgICAgZGVmIGYoY29uZDEsIGNvbmQyKToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgaWYgY29uZDE6IHJldHVybiA0CisgICAgICAgIGFzbSA9IGRpc2Fzc2VtYmxlKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0pVTVBfRk9SV0FSRCcsIGFzbSkKKyAgICAgICAgIyBUaGVyZSBzaG91bGQgYmUgb25lIGp1bXAgZm9yIHRoZSB3aGlsZSBsb29wLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdKVU1QX0FCU09MVVRFJyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXNtLnNwbGl0KCkuY291bnQoJ1JFVFVSTl9WQUxVRScpLCAyKQorCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBpbXBvcnQgc3lzCisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKyAgICB0ZXN0X2NsYXNzZXMgPSAoVGVzdFRyYW5mb3JtcywpCisKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgKCJiYWNrcXVvdGUgbm90IHN1cHBvcnRlZCIsIFN5bnRheFdhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorCisgICAgICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgICAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgICAgIGltcG9ydCBnYworICAgICAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICAgICAgcHJpbnQgY291bnRzCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlZXBob2xlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZWVwaG9sZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YTZmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZWVwaG9sZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlZXBob2xlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZWVwaG9sZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YTZmNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZWVwaG9sZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI0Ny5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI0Ny5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjNkMzMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjQ3LnB5CkBAIC0wLDAgKzEsNzQgQEAKKyIiIgorVGVzdCBzdWl0ZSB0byBjaGVjayBjb21waWxhbmNlIHdpdGggUEVQIDI0NywgdGhlIHN0YW5kYXJkIEFQSQorZm9yIGhhc2hpbmcgYWxnb3JpdGhtcworIiIiCisKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2lnbm9yZScsICd0aGUgbWQ1IG1vZHVsZSBpcyBkZXByZWNhdGVkLionLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2lnbm9yZScsICd0aGUgc2hhIG1vZHVsZSBpcyBkZXByZWNhdGVkLionLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorCitpbXBvcnQgaG1hYworaW1wb3J0IG1kNQoraW1wb3J0IHNoYQorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIFBlcDI0N1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrX21vZHVsZShzZWxmLCBtb2R1bGUsIGtleT1Ob25lKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIobW9kdWxlLCAnZGlnZXN0X3NpemUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1vZHVsZS5kaWdlc3Rfc2l6ZSBpcyBOb25lIG9yIG1vZHVsZS5kaWdlc3Rfc2l6ZSA+IDApCisKKyAgICAgICAgaWYgbm90IGtleSBpcyBOb25lOgorICAgICAgICAgICAgb2JqMSA9IG1vZHVsZS5uZXcoa2V5KQorICAgICAgICAgICAgb2JqMiA9IG1vZHVsZS5uZXcoa2V5LCAnc3RyaW5nJykKKworICAgICAgICAgICAgaDEgPSBtb2R1bGUubmV3KGtleSwgJ3N0cmluZycpLmRpZ2VzdCgpCisgICAgICAgICAgICBvYmozID0gbW9kdWxlLm5ldyhrZXkpCisgICAgICAgICAgICBvYmozLnVwZGF0ZSgnc3RyaW5nJykKKyAgICAgICAgICAgIGgyID0gb2JqMy5kaWdlc3QoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2JqMSA9IG1vZHVsZS5uZXcoKQorICAgICAgICAgICAgb2JqMiA9IG1vZHVsZS5uZXcoJ3N0cmluZycpCisKKyAgICAgICAgICAgIGgxID0gbW9kdWxlLm5ldygnc3RyaW5nJykuZGlnZXN0KCkKKyAgICAgICAgICAgIG9iajMgPSBtb2R1bGUubmV3KCkKKyAgICAgICAgICAgIG9iajMudXBkYXRlKCdzdHJpbmcnKQorICAgICAgICAgICAgaDIgPSBvYmozLmRpZ2VzdCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoMSwgaDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIob2JqMSwgJ2RpZ2VzdF9zaXplJykpCisKKyAgICAgICAgaWYgbm90IG1vZHVsZS5kaWdlc3Rfc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmoxLmRpZ2VzdF9zaXplLCBtb2R1bGUuZGlnZXN0X3NpemUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmoxLmRpZ2VzdF9zaXplLCBsZW4oaDEpKQorICAgICAgICBvYmoxLnVwZGF0ZSgnc3RyaW5nJykKKyAgICAgICAgb2JqX2NvcHkgPSBvYmoxLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iajEuZGlnZXN0KCksIG9ial9jb3B5LmRpZ2VzdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iajEuaGV4ZGlnZXN0KCksIG9ial9jb3B5LmhleGRpZ2VzdCgpKQorCisgICAgICAgIGRpZ2VzdCwgaGV4ZGlnZXN0ID0gb2JqMS5kaWdlc3QoKSwgb2JqMS5oZXhkaWdlc3QoKQorICAgICAgICBoZDIgPSAiIgorICAgICAgICBmb3IgYnl0ZSBpbiBkaWdlc3Q6CisgICAgICAgICAgICBoZDIgKz0gJyUwMngnICUgb3JkKGJ5dGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGQyLCBoZXhkaWdlc3QpCisKKyAgICBkZWYgdGVzdF9tZDUoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfbW9kdWxlKG1kNSkKKworICAgIGRlZiB0ZXN0X3NoYShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19tb2R1bGUoc2hhKQorCisgICAgZGVmIHRlc3RfaG1hYyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19tb2R1bGUoaG1hYywga2V5PSdhYmMnKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChQZXAyNDdUZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNDcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjQ3LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk1MWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjQ3LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNDcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjQ3LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk1MWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjQ3LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNjMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNjMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NjQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI2My5weQpAQCAtMCwwICsxLDQ4IEBACisjIC0qLSBjb2Rpbmc6IGtvaTgtciAtKi0KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBQRVAyNjNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3BlcDI2MyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHUi8MnUz84iLmVuY29kZSgidXRmLTgiKSwKKyAgICAgICAgICAgICdceGQwXHg5Zlx4ZDBceGI4XHhkMVx4ODJceGQwXHhiZVx4ZDBceGJkJworICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1IlzwIi5lbmNvZGUoInV0Zi04IiksCisgICAgICAgICAgICAnXFxceGQwXHg5ZicKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfY29tcGlsZXN0cmluZyhzZWxmKToKKyAgICAgICAgIyBzZWUgIzE4ODIKKyAgICAgICAgYyA9IGNvbXBpbGUoIlxuIyBjb2Rpbmc6IHV0Zi04XG51ID0gdSdceGMzXHhiMydcbiIsICJkdW1teSIsICJleGVjIikKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGV4ZWMgYyBpbiBkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsndSddLCB1J1x4ZjMnKQorCisKKyAgICBkZWYgdGVzdF9pc3N1ZTMyOTcoc2VsZik6CisgICAgICAgIGMgPSBjb21waWxlKCJhLCBiID0gJ1xVMDAwMTAxMEYnLCAnXFxVMDAwMTAxMEYnIiwgImR1bW15IiwgImV4ZWMiKQorICAgICAgICBkID0ge30KKyAgICAgICAgZXhlYyhjLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2EnXSwgZFsnYiddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkWydhJ10pLCBsZW4oZFsnYiddKSkKKworICAgIGRlZiB0ZXN0X2lzc3VlNzgyMChzZWxmKToKKyAgICAgICAgIyBFbnN1cmUgdGhhdCBjaGVja19ib20oKSByZXN0b3JlcyBhbGwgYnl0ZXMgaW4gdGhlIHJpZ2h0IG9yZGVyIGlmCisgICAgICAgICMgY2hlY2tfYm9tKCkgZmFpbHMgaW4gcHlkZWJ1ZyBtb2RlOiBhIGJ1ZmZlciBzdGFydHMgd2l0aCB0aGUgZmlyc3QKKyAgICAgICAgIyBieXRlIG9mIGEgdmFsaWQgQk9NLCBidXQgbmV4dCBieXRlcyBhcmUgZGlmZmVyZW50CisKKyAgICAgICAgIyBvbmUgYnl0ZSBpbiBjb21tb24gd2l0aCB0aGUgVVRGLTE2LUxFIEJPTQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgJ1x4ZmZceDIwJykKKworICAgICAgICAjIHR3byBieXRlcyBpbiBjb21tb24gd2l0aCB0aGUgVVRGLTggQk9NCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAnXHhlZlx4YmJceDIwJykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUEVQMjYzVGVzdCkKKworaWYgX19uYW1lX189PSJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI2My5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNjMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjJiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNjMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI2My5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNjMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjJiMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNjMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI3Ny5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI3Ny5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmI4MmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjc3LnB5CkBAIC0wLDAgKzEsMjEwIEBACisjIFRlc3QgdGhlIFVuaWNvZGUgdmVyc2lvbnMgb2Ygbm9ybWFsIGZpbGUgZnVuY3Rpb25zCisjIG9wZW4sIG9zLm9wZW4sIG9zLnN0YXQuIG9zLmxpc3RkaXIsIG9zLnJlbmFtZSwgb3MucmVtb3ZlLCBvcy5ta2Rpciwgb3MuY2hkaXIsIG9zLnJtZGlyCitpbXBvcnQgc3lzLCBvcywgdW5pdHRlc3QKK2Zyb20gdW5pY29kZWRhdGEgaW1wb3J0IG5vcm1hbGl6ZQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworZmlsZW5hbWVzID0gWworICAgICcxX2FiYycsCisgICAgdScyX2FzY2lpJywKKyAgICB1JzNfR3JceGZjXHhkZi1Hb3R0JywKKyAgICB1JzRfXHUwMzkzXHUwM2I1XHUwM2I5XHUwM2FjLVx1MDNjM1x1MDNiMVx1MDNjMicsCisgICAgdSc1X1x1MDQxN1x1MDQzNFx1MDQ0MFx1MDQzMFx1MDQzMlx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQ0M1x1MDQzOVx1MDQ0Mlx1MDQzNScsCisgICAgdSc2X1x1MzA2Ylx1MzA3ZFx1MzA5MycsCisgICAgdSc3X1x1MDVkNFx1MDVlOVx1MDVlN1x1MDVlNlx1MDVlNVx1MDVlMScsCisgICAgdSc4X1x1NjZlOFx1NjZlOVx1NjZlYicsCisgICAgdSc5X1x1NjZlOFx1MDVlOVx1MzA5M1x1MDQzNFx1MDM5M1x4ZGYnLAorICAgICMgU3BlY2lmaWMgY29kZSBwb2ludHM6IGZuLCBORkMoZm4pIGFuZCBORktDKGZuKSBhbGwgZGlmZmVyZW50cworICAgIHUnMTBfXHUxZmVlXHUxZmZkJywKKyAgICBdCisKKyMgTWFjIE9TIFggZGVjb21wb3NlcyBVbmljb2RlIG5hbWVzLCB1c2luZyBOb3JtYWwgRm9ybSBELgorIyBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9tYWMvbGlicmFyeS9xYS9xYTIwMDEvcWExMTczLmh0bWwKKyMgIkhvd2V2ZXIsIG1vc3Qgdm9sdW1lIGZvcm1hdHMgZG8gbm90IGZvbGxvdyB0aGUgZXhhY3Qgc3BlY2lmaWNhdGlvbiBmb3IKKyMgdGhlc2Ugbm9ybWFsIGZvcm1zLiAgRm9yIGV4YW1wbGUsIEhGUyBQbHVzIHVzZXMgYSB2YXJpYW50IG9mIE5vcm1hbCBGb3JtIEQKKyMgaW4gd2hpY2ggVSsyMDAwIHRocm91Z2ggVSsyRkZGLCBVK0Y5MDAgdGhyb3VnaCBVK0ZBRkYsIGFuZCBVKzJGODAwIHRocm91Z2gKKyMgVSsyRkFGRiBhcmUgbm90IGRlY29tcG9zZWQuIgoraWYgc3lzLnBsYXRmb3JtICE9ICdkYXJ3aW4nOgorICAgIGZpbGVuYW1lcy5leHRlbmQoWworICAgICAgICAjIFNwZWNpZmljIGNvZGUgcG9pbnRzOiBORkMoZm4pLCBORkQoZm4pLCBORktDKGZuKSBhbmQgTkZLRChmbikgYWxsIGRpZmZlcmVudHMKKyAgICAgICAgdScxMV9cdTAzODVcdTAzZDNcdTAzZDQnLAorICAgICAgICB1JzEyX1x1MDBhOFx1MDMwMVx1MDNkMlx1MDMwMVx1MDNkMlx1MDMwOCcsICAgICMgPT0gTkZEKHUnXHUwMzg1XHUwM2QzXHUwM2Q0JykKKyAgICAgICAgdScxM19cdTAwMjBcdTAzMDhcdTAzMDFcdTAzOGVcdTAzYWInLCAgICAgICAgICAjID09IE5GS0ModSdcdTAzODVcdTAzZDNcdTAzZDQnKQorICAgICAgICB1JzE0X1x1MWU5Ylx1MWZjMVx1MWZjZFx1MWZjZVx1MWZjZlx1MWZkZFx1MWZkZVx1MWZkZlx1MWZlZCcsCisKKyAgICAgICAgIyBTcGVjaWZpYyBjb2RlIHBvaW50czogZm4sIE5GQyhmbikgYW5kIE5GS0MoZm4pIGFsbCBkaWZmZXJlbnRzCisgICAgICAgIHUnMTVfXHUxZmVlXHUxZmZkXHVmYWQxJywKKyAgICAgICAgdScxNl9cdTIwMDBcdTIwMDBcdTIwMDBBJywKKyAgICAgICAgdScxN19cdTIwMDFcdTIwMDFcdTIwMDFBJywKKyAgICAgICAgdScxOF9cdTIwMDNcdTIwMDNcdTIwMDNBJywgIyA9PSBORkModSdcdTIwMDFcdTIwMDFcdTIwMDFBJykKKyAgICAgICAgdScxOV9cdTAwMjBcdTAwMjBcdTAwMjBBJywgIyB1J1x1MDAyMCcgPT0gdScgJyA9PSBORktDKHUnXHUyMDAwJykgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIE5GS0ModSdcdTIwMDEnKSA9PSBORktDKHUnXHUyMDAzJykKK10pCisKKworIyBJcyBpdCBVbmljb2RlLWZyaWVuZGx5PworaWYgbm90IG9zLnBhdGguc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXM6CisgICAgZnNlbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSBvciBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKKyAgICB0cnk6CisgICAgICAgIGZvciBuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgIG5hbWUuZW5jb2RlKGZzZW5jb2RpbmcpCisgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIm9ubHkgTlQrIGFuZCBzeXN0ZW1zIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pY29kZS1mcmllbmRseSBmaWxlc3lzdGVtIGVuY29kaW5nIikKKworCisjIERlc3Ryb3kgZGlyZWN0b3J5IGRpcm5hbWUgYW5kIGFsbCBmaWxlcyB1bmRlciBpdCwgdG8gb25lIGxldmVsLgorZGVmIGRlbHRyZWUoZGlybmFtZSk6CisgICAgIyBEb24ndCBoaWRlIGxlZ2l0aW1hdGUgZXJyb3JzOiAgaWYgb25lIG9mIHRoZXNlIHN1Y2tlcnMgZXhpc3RzLCBpdCdzCisgICAgIyBhbiBlcnJvciBpZiB3ZSBjYW4ndCByZW1vdmUgaXQuCisgICAgaWYgb3MucGF0aC5leGlzdHMoZGlybmFtZSk6CisgICAgICAgICMgbXVzdCBwYXNzIHVuaWNvZGUgdG8gb3MubGlzdGRpcigpIHNvIHdlIGdldCBiYWNrIHVuaWNvZGUgcmVzdWx0cy4KKyAgICAgICAgZm9yIGZuYW1lIGluIG9zLmxpc3RkaXIodW5pY29kZShkaXJuYW1lKSk6CisgICAgICAgICAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKGRpcm5hbWUsIGZuYW1lKSkKKyAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKKworCitjbGFzcyBVbmljb2RlRmlsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmaWxlcyA9IHNldChmaWxlbmFtZXMpCisgICAgbm9ybWFsX2Zvcm0gPSBOb25lCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLm1rZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmaWxlcyA9IHNldCgpCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuZmlsZXM6CisgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5qb2luKHRlc3Rfc3VwcG9ydC5URVNURk4sIHNlbGYubm9ybShuYW1lKSkKKyAgICAgICAgICAgIHdpdGggb3BlbihuYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgobmFtZSsnXG4nKS5lbmNvZGUoInV0Zi04IikpCisgICAgICAgICAgICBvcy5zdGF0KG5hbWUpCisgICAgICAgICAgICBmaWxlcy5hZGQobmFtZSkKKyAgICAgICAgc2VsZi5maWxlcyA9IGZpbGVzCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbHRyZWUodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiBub3JtKHNlbGYsIHMpOgorICAgICAgICBpZiBzZWxmLm5vcm1hbF9mb3JtIGFuZCBpc2luc3RhbmNlKHMsIHVuaWNvZGUpOgorICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShzZWxmLm5vcm1hbF9mb3JtLCBzKQorICAgICAgICByZXR1cm4gcworCisgICAgZGVmIF9hcHBseV9mYWlsdXJlKHNlbGYsIGZuLCBmaWxlbmFtZSwgZXhwZWN0ZWRfZXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjaGVja19mbl9pbl9leGNlcHRpb24gPSBUcnVlKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhleHBlY3RlZF9leGNlcHRpb24pIGFzIGM6CisgICAgICAgICAgICBmbihmaWxlbmFtZSkKKyAgICAgICAgZXhjX2ZpbGVuYW1lID0gYy5leGNlcHRpb24uZmlsZW5hbWUKKyAgICAgICAgIyB0aGUgImZpbGVuYW1lIiBleGNlcHRpb24gYXR0cmlidXRlIG1heSBiZSBlbmNvZGVkCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhjX2ZpbGVuYW1lLCBzdHIpOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKQorICAgICAgICBpZiBjaGVja19mbl9pbl9leGNlcHRpb246CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Y19maWxlbmFtZSwgZmlsZW5hbWUsICJGdW5jdGlvbiAnJXMoJXIpIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIGJhZCBmaWxlbmFtZSBpbiB0aGUgZXhjZXB0aW9uOiAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm4uX19uYW1lX18sIGZpbGVuYW1lLCBleGNfZmlsZW5hbWUpKQorCisgICAgZGVmIHRlc3RfZmFpbHVyZXMoc2VsZik6CisgICAgICAgICMgUGFzcyBub24tZXhpc3RpbmcgVW5pY29kZSBmaWxlbmFtZXMgYWxsIG92ZXIgdGhlIHBsYWNlLgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmZpbGVzOgorICAgICAgICAgICAgbmFtZSA9ICJub3RfIiArIG5hbWUKKyAgICAgICAgICAgIHNlbGYuX2FwcGx5X2ZhaWx1cmUob3BlbiwgbmFtZSwgSU9FcnJvcikKKyAgICAgICAgICAgIHNlbGYuX2FwcGx5X2ZhaWx1cmUob3Muc3RhdCwgbmFtZSwgT1NFcnJvcikKKyAgICAgICAgICAgIHNlbGYuX2FwcGx5X2ZhaWx1cmUob3MuY2hkaXIsIG5hbWUsIE9TRXJyb3IpCisgICAgICAgICAgICBzZWxmLl9hcHBseV9mYWlsdXJlKG9zLnJtZGlyLCBuYW1lLCBPU0Vycm9yKQorICAgICAgICAgICAgc2VsZi5fYXBwbHlfZmFpbHVyZShvcy5yZW1vdmUsIG5hbWUsIE9TRXJyb3IpCisgICAgICAgICAgICAjIGxpc3RkaXIgbWF5IGFwcGVuZCBhIHdpbGRjYXJkIHRvIHRoZSBmaWxlbmFtZSwgc28gZG9udCBjaGVjaworICAgICAgICAgICAgc2VsZi5fYXBwbHlfZmFpbHVyZShvcy5saXN0ZGlyLCBuYW1lLCBPU0Vycm9yLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X29wZW4oc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuZmlsZXM6CisgICAgICAgICAgICBmID0gb3BlbihuYW1lLCAndycpCisgICAgICAgICAgICBmLndyaXRlKChuYW1lKydcbicpLmVuY29kZSgidXRmLTgiKSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgb3Muc3RhdChuYW1lKQorCisgICAgIyBTa2lwIHRoZSB0ZXN0IG9uIGRhcndpbiwgYmVjYXVzZSBkYXJ3aW4gZG9lcyBub3JtYWxpemUgdGhlIGZpbGVuYW1lIHRvCisgICAgIyBORkQgKGEgdmFyaWFudCBvZiBVbmljb2RlIE5GRCBmb3JtKS4gTm9ybWFsaXplIHRoZSBmaWxlbmFtZSB0byBORkMsIE5GS0MsCisgICAgIyBORktEIGluIFB5dGhvbiBpcyB1c2VsZXNzLCBiZWNhdXNlIGRhcndpbiB3aWxsIG5vcm1hbGl6ZSBpdCBsYXRlciBhbmQgc28KKyAgICAjIG9wZW4oKSwgb3Muc3RhdCgpLCBldGMuIGRvbid0IHJhaXNlIGFueSBleGNlcHRpb24uCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicsICdpcnJlbGV2YW50IHRlc3Qgb24gTWFjIE9TIFgnKQorICAgIGRlZiB0ZXN0X25vcm1hbGl6ZShzZWxmKToKKyAgICAgICAgZmlsZXMgPSBzZXQoZiBmb3IgZiBpbiBzZWxmLmZpbGVzIGlmIGlzaW5zdGFuY2UoZiwgdW5pY29kZSkpCisgICAgICAgIG90aGVycyA9IHNldCgpCisgICAgICAgIGZvciBuZiBpbiBzZXQoWydORkMnLCAnTkZEJywgJ05GS0MnLCAnTkZLRCddKToKKyAgICAgICAgICAgIG90aGVycyB8PSBzZXQobm9ybWFsaXplKG5mLCBmaWxlKSBmb3IgZmlsZSBpbiBmaWxlcykKKyAgICAgICAgb3RoZXJzIC09IGZpbGVzCisgICAgICAgIGZvciBuYW1lIGluIG90aGVyczoKKyAgICAgICAgICAgIHNlbGYuX2FwcGx5X2ZhaWx1cmUob3BlbiwgbmFtZSwgSU9FcnJvcikKKyAgICAgICAgICAgIHNlbGYuX2FwcGx5X2ZhaWx1cmUob3Muc3RhdCwgbmFtZSwgT1NFcnJvcikKKyAgICAgICAgICAgIHNlbGYuX2FwcGx5X2ZhaWx1cmUob3MuY2hkaXIsIG5hbWUsIE9TRXJyb3IpCisgICAgICAgICAgICBzZWxmLl9hcHBseV9mYWlsdXJlKG9zLnJtZGlyLCBuYW1lLCBPU0Vycm9yKQorICAgICAgICAgICAgc2VsZi5fYXBwbHlfZmFpbHVyZShvcy5yZW1vdmUsIG5hbWUsIE9TRXJyb3IpCisgICAgICAgICAgICAjIGxpc3RkaXIgbWF5IGFwcGVuZCBhIHdpbGRjYXJkIHRvIHRoZSBmaWxlbmFtZSwgc28gZG9udCBjaGVjaworICAgICAgICAgICAgc2VsZi5fYXBwbHlfZmFpbHVyZShvcy5saXN0ZGlyLCBuYW1lLCBPU0Vycm9yLCBGYWxzZSkKKworICAgICMgU2tpcCB0aGUgdGVzdCBvbiBkYXJ3aW4sIGJlY2F1c2UgZGFyd2luIHVzZXMgYSBub3JtYWxpemF0aW9uIGRpZmZlcmVudAorICAgICMgdGhhbiBQeXRob24gTkZEIG5vcm1hbGl6YXRpb246IGZpbGVuYW1lcyBhcmUgZGlmZmVyZW50IGV2ZW4gaWYgd2UgdXNlCisgICAgIyBQeXRob24gTkZEIG5vcm1hbGl6YXRpb24uCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicsICdpcnJlbGV2YW50IHRlc3Qgb24gTWFjIE9TIFgnKQorICAgIGRlZiB0ZXN0X2xpc3RkaXIoc2VsZik6CisgICAgICAgIHNmMCA9IHNldChzZWxmLmZpbGVzKQorICAgICAgICBmMSA9IG9zLmxpc3RkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZjIgPSBvcy5saXN0ZGlyKHVuaWNvZGUodGVzdF9zdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKSkKKyAgICAgICAgc2YyID0gc2V0KG9zLnBhdGguam9pbih1bmljb2RlKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBmKSBmb3IgZiBpbiBmMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZjAsIHNmMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZjEpLCBsZW4oZjIpKQorCisgICAgZGVmIHRlc3RfcmVuYW1lKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmZpbGVzOgorICAgICAgICAgICAgb3MucmVuYW1lKG5hbWUsICJ0bXAiKQorICAgICAgICAgICAgb3MucmVuYW1lKCJ0bXAiLCBuYW1lKQorCisgICAgZGVmIHRlc3RfZGlyZWN0b3J5KHNlbGYpOgorICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5qb2luKHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSdHclx4ZmNceGRmLVx1NjZlOFx1NjZlOVx1NjZlYicpCisgICAgICAgIGZpbGVuYW1lID0gdSdceGRmLVx1NjZlOFx1NjZlOVx1NjZlYicKKyAgICAgICAgb2xkd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5ta2RpcihkaXJuYW1lKQorICAgICAgICBvcy5jaGRpcihkaXJuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3JykgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKChmaWxlbmFtZSArICdcbicpLmVuY29kZSgidXRmLTgiKSkKKyAgICAgICAgICAgIG9zLmFjY2VzcyhmaWxlbmFtZSxvcy5SX09LKQorICAgICAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkd2QpCisgICAgICAgICAgICBvcy5ybWRpcihkaXJuYW1lKQorCisKK2NsYXNzIFVuaWNvZGVORkNGaWxlVGVzdHMoVW5pY29kZUZpbGVUZXN0cyk6CisgICAgbm9ybWFsX2Zvcm0gPSAnTkZDJworCisKK2NsYXNzIFVuaWNvZGVORkRGaWxlVGVzdHMoVW5pY29kZUZpbGVUZXN0cyk6CisgICAgbm9ybWFsX2Zvcm0gPSAnTkZEJworCisKK2NsYXNzIFVuaWNvZGVORktDRmlsZVRlc3RzKFVuaWNvZGVGaWxlVGVzdHMpOgorICAgIG5vcm1hbF9mb3JtID0gJ05GS0MnCisKKworY2xhc3MgVW5pY29kZU5GS0RGaWxlVGVzdHMoVW5pY29kZUZpbGVUZXN0cyk6CisgICAgbm9ybWFsX2Zvcm0gPSAnTkZLRCcKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdHJ5OgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICAgICAgVW5pY29kZUZpbGVUZXN0cywKKyAgICAgICAgICAgIFVuaWNvZGVORkNGaWxlVGVzdHMsCisgICAgICAgICAgICBVbmljb2RlTkZERmlsZVRlc3RzLAorICAgICAgICAgICAgVW5pY29kZU5GS0NGaWxlVGVzdHMsCisgICAgICAgICAgICBVbmljb2RlTkZLREZpbGVUZXN0cywKKyAgICAgICAgKQorICAgIGZpbmFsbHk6CisgICAgICAgIGRlbHRyZWUodGVzdF9zdXBwb3J0LlRFU1RGTikKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNzcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjc3LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTNiZjQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjc3LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNzcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjc3LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTNiZjQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjc3LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyOTIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyOTIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4YTI0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI5Mi5weQpAQCAtMCwwICsxLDE5MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBiYXJyeUBweXRob24ub3JnIChCYXJyeSBXYXJzYXcpCisjIExpY2Vuc2U6IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvUHl0aG9uU29mdEZvdW5kYXRpb24ucGhwCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBzdHJpbmcgaW1wb3J0IFRlbXBsYXRlCisKKworY2xhc3MgQmFnOgorICAgIHBhc3MKKworY2xhc3MgTWFwcGluZzoKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CisgICAgICAgIG9iaiA9IHNlbGYKKyAgICAgICAgZm9yIHBhcnQgaW4gbmFtZS5zcGxpdCgnLicpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9iaiA9IGdldGF0dHIob2JqLCBwYXJ0KQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKG5hbWUpCisgICAgICAgIHJldHVybiBvYmoKKworCitjbGFzcyBUZXN0VGVtcGxhdGUodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3JlZ3VsYXJfdGVtcGxhdGVzKHNlbGYpOgorICAgICAgICBzID0gVGVtcGxhdGUoJyR3aG8gbGlrZXMgdG8gZWF0IGEgYmFnIG9mICR3aGF0IHdvcnRoICQkMTAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN1YnN0aXR1dGUoZGljdCh3aG89J3RpbScsIHdoYXQ9J2hhbScpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGltIGxpa2VzIHRvIGVhdCBhIGJhZyBvZiBoYW0gd29ydGggJDEwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBzLnN1YnN0aXR1dGUsIGRpY3Qod2hvPSd0aW0nKSkKKworICAgIGRlZiB0ZXN0X3JlZ3VsYXJfdGVtcGxhdGVzX3dpdGhfYnJhY2VzKHNlbGYpOgorICAgICAgICBzID0gVGVtcGxhdGUoJyR3aG8gbGlrZXMgJHt3aGF0fSBmb3IgJHttZWFsfScpCisgICAgICAgIGQgPSBkaWN0KHdobz0ndGltJywgd2hhdD0naGFtJywgbWVhbD0nZGlubmVyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN1YnN0aXR1dGUoZCksICd0aW0gbGlrZXMgaGFtIGZvciBkaW5uZXInKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgcy5zdWJzdGl0dXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0KHdobz0ndGltJywgd2hhdD0naGFtJykpCisKKyAgICBkZWYgdGVzdF9lc2NhcGVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9IFRlbXBsYXRlKCckd2hvIGxpa2VzIHRvIGVhdCBhIGJhZyBvZiAkJHdoYXQgd29ydGggJCQxMDAnKQorICAgICAgICBlcShzLnN1YnN0aXR1dGUoZGljdCh3aG89J3RpbScsIHdoYXQ9J2hhbScpKSwKKyAgICAgICAgICAgJ3RpbSBsaWtlcyB0byBlYXQgYSBiYWcgb2YgJHdoYXQgd29ydGggJDEwMCcpCisgICAgICAgIHMgPSBUZW1wbGF0ZSgnJHdobyBsaWtlcyAkJCcpCisgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShkaWN0KHdobz0ndGltJywgd2hhdD0naGFtJykpLCAndGltIGxpa2VzICQnKQorCisgICAgZGVmIHRlc3RfcGVyY2VudHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gVGVtcGxhdGUoJyUoZm9vKXMgJGZvbyAke2Zvb30nKQorICAgICAgICBkID0gZGljdChmb289J2JheicpCisgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShkKSwgJyUoZm9vKXMgYmF6IGJheicpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGQpLCAnJShmb28pcyBiYXogYmF6JykKKworICAgIGRlZiB0ZXN0X3N0cmluZ2lmaWNhdGlvbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSBUZW1wbGF0ZSgndGltIGhhcyBlYXRlbiAkY291bnQgYmFncyBvZiBoYW0gdG9kYXknKQorICAgICAgICBkID0gZGljdChjb3VudD03KQorICAgICAgICBlcShzLnN1YnN0aXR1dGUoZCksICd0aW0gaGFzIGVhdGVuIDcgYmFncyBvZiBoYW0gdG9kYXknKQorICAgICAgICBlcShzLnNhZmVfc3Vic3RpdHV0ZShkKSwgJ3RpbSBoYXMgZWF0ZW4gNyBiYWdzIG9mIGhhbSB0b2RheScpCisgICAgICAgIHMgPSBUZW1wbGF0ZSgndGltIGhhcyBlYXRlbiAke2NvdW50fSBiYWdzIG9mIGhhbSB0b2RheScpCisgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShkKSwgJ3RpbSBoYXMgZWF0ZW4gNyBiYWdzIG9mIGhhbSB0b2RheScpCisKKyAgICBkZWYgdGVzdF90dXBsZWFyZ3Moc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gVGVtcGxhdGUoJyR3aG8gYXRlICR7bWVhbH0nKQorICAgICAgICBkID0gZGljdCh3aG89KCd0aW0nLCAnZnJlZCcpLCBtZWFsPSgnaGFtJywgJ2t1bmcgcGFvJykpCisgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShkKSwgIigndGltJywgJ2ZyZWQnKSBhdGUgKCdoYW0nLCAna3VuZyBwYW8nKSIpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGQpLCAiKCd0aW0nLCAnZnJlZCcpIGF0ZSAoJ2hhbScsICdrdW5nIHBhbycpIikKKworICAgIGRlZiB0ZXN0X1NhZmVUZW1wbGF0ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSBUZW1wbGF0ZSgnJHdobyBsaWtlcyAke3doYXR9IGZvciAke21lYWx9JykKKyAgICAgICAgZXEocy5zYWZlX3N1YnN0aXR1dGUoZGljdCh3aG89J3RpbScpKSwgJ3RpbSBsaWtlcyAke3doYXR9IGZvciAke21lYWx9JykKKyAgICAgICAgZXEocy5zYWZlX3N1YnN0aXR1dGUoZGljdCh3aGF0PSdoYW0nKSksICckd2hvIGxpa2VzIGhhbSBmb3IgJHttZWFsfScpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGRpY3Qod2hhdD0naGFtJywgbWVhbD0nZGlubmVyJykpLAorICAgICAgICAgICAnJHdobyBsaWtlcyBoYW0gZm9yIGRpbm5lcicpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGRpY3Qod2hvPSd0aW0nLCB3aGF0PSdoYW0nKSksCisgICAgICAgICAgICd0aW0gbGlrZXMgaGFtIGZvciAke21lYWx9JykKKyAgICAgICAgZXEocy5zYWZlX3N1YnN0aXR1dGUoZGljdCh3aG89J3RpbScsIHdoYXQ9J2hhbScsIG1lYWw9J2Rpbm5lcicpKSwKKyAgICAgICAgICAgJ3RpbSBsaWtlcyBoYW0gZm9yIGRpbm5lcicpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX3BsYWNlaG9sZGVycyhzZWxmKToKKyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyAgICAgICAgcyA9IFRlbXBsYXRlKCckd2hvIGxpa2VzICQnKQorICAgICAgICByYWlzZXMoVmFsdWVFcnJvciwgcy5zdWJzdGl0dXRlLCBkaWN0KHdobz0ndGltJykpCisgICAgICAgIHMgPSBUZW1wbGF0ZSgnJHdobyBsaWtlcyAke3doYXQpJykKKyAgICAgICAgcmFpc2VzKFZhbHVlRXJyb3IsIHMuc3Vic3RpdHV0ZSwgZGljdCh3aG89J3RpbScpKQorICAgICAgICBzID0gVGVtcGxhdGUoJyR3aG8gbGlrZXMgJDEwMCcpCisgICAgICAgIHJhaXNlcyhWYWx1ZUVycm9yLCBzLnN1YnN0aXR1dGUsIGRpY3Qod2hvPSd0aW0nKSkKKworICAgIGRlZiB0ZXN0X2lkcGF0dGVybl9vdmVycmlkZShzZWxmKToKKyAgICAgICAgY2xhc3MgUGF0aFBhdHRlcm4oVGVtcGxhdGUpOgorICAgICAgICAgICAgaWRwYXR0ZXJuID0gcidbX2Etel1bLl9hLXowLTldKicKKyAgICAgICAgbSA9IE1hcHBpbmcoKQorICAgICAgICBtLmJhZyA9IEJhZygpCisgICAgICAgIG0uYmFnLmZvbyA9IEJhZygpCisgICAgICAgIG0uYmFnLmZvby53aG8gPSAndGltJworICAgICAgICBtLmJhZy53aGF0ID0gJ2hhbScKKyAgICAgICAgcyA9IFBhdGhQYXR0ZXJuKCckYmFnLmZvby53aG8gbGlrZXMgdG8gZWF0IGEgYmFnIG9mICRiYWcud2hhdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdWJzdGl0dXRlKG0pLCAndGltIGxpa2VzIHRvIGVhdCBhIGJhZyBvZiBoYW0nKQorCisgICAgZGVmIHRlc3RfcGF0dGVybl9vdmVycmlkZShzZWxmKToKKyAgICAgICAgY2xhc3MgTXlQYXR0ZXJuKFRlbXBsYXRlKToKKyAgICAgICAgICAgIHBhdHRlcm4gPSByIiIiCisgICAgICAgICAgICAoP1A8ZXNjYXBlZD5AezJ9KSAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICAgICBAKD9QPG5hbWVkPltfYS16XVsuX2EtejAtOV0qKSAgICAgICB8CisgICAgICAgICAgICBAeyg/UDxicmFjZWQ+W19hLXpdWy5fYS16MC05XSopfSAgICB8CisgICAgICAgICAgICAoP1A8aW52YWxpZD5AKQorICAgICAgICAgICAgIiIiCisgICAgICAgIG0gPSBNYXBwaW5nKCkKKyAgICAgICAgbS5iYWcgPSBCYWcoKQorICAgICAgICBtLmJhZy5mb28gPSBCYWcoKQorICAgICAgICBtLmJhZy5mb28ud2hvID0gJ3RpbScKKyAgICAgICAgbS5iYWcud2hhdCA9ICdoYW0nCisgICAgICAgIHMgPSBNeVBhdHRlcm4oJ0BiYWcuZm9vLndobyBsaWtlcyB0byBlYXQgYSBiYWcgb2YgQGJhZy53aGF0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN1YnN0aXR1dGUobSksICd0aW0gbGlrZXMgdG8gZWF0IGEgYmFnIG9mIGhhbScpCisKKyAgICAgICAgY2xhc3MgQmFkUGF0dGVybihUZW1wbGF0ZSk6CisgICAgICAgICAgICBwYXR0ZXJuID0gciIiIgorICAgICAgICAgICAgKD9QPGJhZG5hbWU+LiopICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgKD9QPGVzY2FwZWQ+QHsyfSkgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgQCg/UDxuYW1lZD5bX2Etel1bLl9hLXowLTldKikgICAgICAgfAorICAgICAgICAgICAgQHsoP1A8YnJhY2VkPltfYS16XVsuX2EtejAtOV0qKX0gICAgfAorICAgICAgICAgICAgKD9QPGludmFsaWQ+QCkgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgIiIiCisgICAgICAgIHMgPSBCYWRQYXR0ZXJuKCdAYmFnLmZvby53aG8gbGlrZXMgdG8gZWF0IGEgYmFnIG9mIEBiYWcud2hhdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHMuc3Vic3RpdHV0ZSwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHMuc2FmZV9zdWJzdGl0dXRlLCB7fSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfdmFsdWVzKHNlbGYpOgorICAgICAgICBzID0gVGVtcGxhdGUoJyR3aG8gbGlrZXMgJHdoYXQnKQorICAgICAgICBkID0gZGljdCh3aG89dSd0XHhmZm0nLCB3aGF0PXUnZlx4ZmVcZmVkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN1YnN0aXR1dGUoZCksIHUndFx4ZmZtIGxpa2VzIGZceGZlXHgwY2VkJykKKworICAgIGRlZiB0ZXN0X2tleXdvcmRfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9IFRlbXBsYXRlKCckd2hvIGxpa2VzICR3aGF0JykKKyAgICAgICAgZXEocy5zdWJzdGl0dXRlKHdobz0ndGltJywgd2hhdD0naGFtJyksICd0aW0gbGlrZXMgaGFtJykKKyAgICAgICAgZXEocy5zdWJzdGl0dXRlKGRpY3Qod2hvPSd0aW0nKSwgd2hhdD0naGFtJyksICd0aW0gbGlrZXMgaGFtJykKKyAgICAgICAgZXEocy5zdWJzdGl0dXRlKGRpY3Qod2hvPSdmcmVkJywgd2hhdD0na3VuZyBwYW8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdobz0ndGltJywgd2hhdD0naGFtJyksCisgICAgICAgICAgICd0aW0gbGlrZXMgaGFtJykKKyAgICAgICAgcyA9IFRlbXBsYXRlKCd0aGUgbWFwcGluZyBpcyAkbWFwcGluZycpCisgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShkaWN0KGZvbz0nbm9uZScpLCBtYXBwaW5nPSdib3pvJyksCisgICAgICAgICAgICd0aGUgbWFwcGluZyBpcyBib3pvJykKKyAgICAgICAgZXEocy5zdWJzdGl0dXRlKGRpY3QobWFwcGluZz0nb25lJyksIG1hcHBpbmc9J3R3bycpLAorICAgICAgICAgICAndGhlIG1hcHBpbmcgaXMgdHdvJykKKworICAgIGRlZiB0ZXN0X2tleXdvcmRfYXJndW1lbnRzX3NhZmUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcworICAgICAgICBzID0gVGVtcGxhdGUoJyR3aG8gbGlrZXMgJHdoYXQnKQorICAgICAgICBlcShzLnNhZmVfc3Vic3RpdHV0ZSh3aG89J3RpbScsIHdoYXQ9J2hhbScpLCAndGltIGxpa2VzIGhhbScpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGRpY3Qod2hvPSd0aW0nKSwgd2hhdD0naGFtJyksICd0aW0gbGlrZXMgaGFtJykKKyAgICAgICAgZXEocy5zYWZlX3N1YnN0aXR1dGUoZGljdCh3aG89J2ZyZWQnLCB3aGF0PSdrdW5nIHBhbycpLAorICAgICAgICAgICAgICAgICAgICAgICAgd2hvPSd0aW0nLCB3aGF0PSdoYW0nKSwKKyAgICAgICAgICAgJ3RpbSBsaWtlcyBoYW0nKQorICAgICAgICBzID0gVGVtcGxhdGUoJ3RoZSBtYXBwaW5nIGlzICRtYXBwaW5nJykKKyAgICAgICAgZXEocy5zYWZlX3N1YnN0aXR1dGUoZGljdChmb289J25vbmUnKSwgbWFwcGluZz0nYm96bycpLAorICAgICAgICAgICAndGhlIG1hcHBpbmcgaXMgYm96bycpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGRpY3QobWFwcGluZz0nb25lJyksIG1hcHBpbmc9J3R3bycpLAorICAgICAgICAgICAndGhlIG1hcHBpbmcgaXMgdHdvJykKKyAgICAgICAgZCA9IGRpY3QobWFwcGluZz0nb25lJykKKyAgICAgICAgcmFpc2VzKFR5cGVFcnJvciwgcy5zdWJzdGl0dXRlLCBkLCB7fSkKKyAgICAgICAgcmFpc2VzKFR5cGVFcnJvciwgcy5zYWZlX3N1YnN0aXR1dGUsIGQsIHt9KQorCisgICAgZGVmIHRlc3RfZGVsaW1pdGVyX292ZXJyaWRlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyAgICAgICAgY2xhc3MgQW1wZXJzYW5kVGVtcGxhdGUoVGVtcGxhdGUpOgorICAgICAgICAgICAgZGVsaW1pdGVyID0gJyYnCisgICAgICAgIHMgPSBBbXBlcnNhbmRUZW1wbGF0ZSgndGhpcyAmZ2lmdCBpcyBmb3IgJnt3aG99ICYmJykKKyAgICAgICAgZXEocy5zdWJzdGl0dXRlKGdpZnQ9J2J1ZCcsIHdobz0neW91JyksICd0aGlzIGJ1ZCBpcyBmb3IgeW91ICYnKQorICAgICAgICByYWlzZXMoS2V5RXJyb3IsIHMuc3Vic3RpdHV0ZSkKKyAgICAgICAgZXEocy5zYWZlX3N1YnN0aXR1dGUoZ2lmdD0nYnVkJywgd2hvPSd5b3UnKSwgJ3RoaXMgYnVkIGlzIGZvciB5b3UgJicpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKCksICd0aGlzICZnaWZ0IGlzIGZvciAme3dob30gJicpCisgICAgICAgIHMgPSBBbXBlcnNhbmRUZW1wbGF0ZSgndGhpcyAmZ2lmdCBpcyBmb3IgJnt3aG99ICYnKQorICAgICAgICByYWlzZXMoVmFsdWVFcnJvciwgcy5zdWJzdGl0dXRlLCBkaWN0KGdpZnQ9J2J1ZCcsIHdobz0neW91JykpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKCksICd0aGlzICZnaWZ0IGlzIGZvciAme3dob30gJicpCisKKyAgICAgICAgY2xhc3MgUGllRGVsaW1zKFRlbXBsYXRlKToKKyAgICAgICAgICAgIGRlbGltaXRlciA9ICdAJworICAgICAgICBzID0gUGllRGVsaW1zKCdAd2hvIGxpa2VzIHRvIGVhdCBhIGJhZyBvZiBAe3doYXR9IHdvcnRoICQxMDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3Vic3RpdHV0ZShkaWN0KHdobz0ndGltJywgd2hhdD0naGFtJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0aW0gbGlrZXMgdG8gZWF0IGEgYmFnIG9mIGhhbSB3b3J0aCAkMTAwJykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKyAgICB0ZXN0X2NsYXNzZXMgPSBbVGVzdFRlbXBsYXRlLF0KKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjkyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI5Mi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkNWU5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI5Mi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjkyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI5Mi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkNWU5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI5Mi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMzUyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMzUyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YjMxMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAzNTIucHkKQEAgLTAsMCArMSwyMzkgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IF9fYnVpbHRpbl9fCitpbXBvcnQgZXhjZXB0aW9ucworaW1wb3J0IHdhcm5pbmdzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNoZWNrX3dhcm5pbmdzCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2Zyb20gcGxhdGZvcm0gaW1wb3J0IHN5c3RlbSBhcyBwbGF0Zm9ybV9zeXN0ZW0KKworREVQUkVDQVRJT05fV0FSTklOR1MgPSBbIkJhc2VFeGNlcHRpb24ubWVzc2FnZSBoYXMgYmVlbiBkZXByZWNhdGVkIl0KKworaWYgc3lzLnB5M2t3YXJuaW5nOgorICAgIERFUFJFQ0FUSU9OX1dBUk5JTkdTLmV4dGVuZCgKKyAgICAgICAgWyJleGNlcHRpb25zIG11c3QgZGVyaXZlIGZyb20gQmFzZUV4Y2VwdGlvbiIsCisgICAgICAgICAiY2F0Y2hpbmcgY2xhc3NlcyB0aGF0IGRvbid0IGluaGVyaXQgZnJvbSBCYXNlRXhjZXB0aW9uIGlzIG5vdCBhbGxvd2VkIiwKKyAgICAgICAgICJfX2dldChpdGVtfHNsaWNlKV9fIG5vdCBzdXBwb3J0ZWQgZm9yIGV4Y2VwdGlvbiBjbGFzc2VzIl0pCisKK19kZXByZWNhdGlvbnMgPSBbKG1zZywgRGVwcmVjYXRpb25XYXJuaW5nKSBmb3IgbXNnIGluIERFUFJFQ0FUSU9OX1dBUk5JTkdTXQorCisjIFNpbGVuY2UgUHkzayBhbmQgb3RoZXIgZGVwcmVjYXRpb24gd2FybmluZ3MKK2RlZiBpZ25vcmVfZGVwcmVjYXRpb25fd2FybmluZ3MoZnVuYyk6CisgICAgIiIiSWdub3JlIHRoZSBrbm93biBEZXByZWNhdGlvbldhcm5pbmdzLiIiIgorICAgIGRlZiB3cmFwcGVyKCphcmdzLCAqKmt3KToKKyAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygqX2RlcHJlY2F0aW9ucywgcXVpZXQ9VHJ1ZSk6CisgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprdykKKyAgICByZXR1cm4gd3JhcHBlcgorCitjbGFzcyBFeGNlcHRpb25DbGFzc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICIiIlRlc3RzIGZvciBhbnl0aGluZyByZWxhdGluZyB0byBleGNlcHRpb24gb2JqZWN0cyB0aGVtc2VsdmVzIChlLmcuLAorICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeSkiIiIKKworICAgIGRlZiB0ZXN0X2J1aWx0aW5zX25ld19zdHlsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoRXhjZXB0aW9uLCBvYmplY3QpKQorCisgICAgQGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncworICAgIGRlZiB2ZXJpZnlfaW5zdGFuY2VfaW50ZXJmYWNlKHNlbGYsIGlucyk6CisgICAgICAgIGZvciBhdHRyIGluICgiYXJncyIsICJtZXNzYWdlIiwgIl9fc3RyX18iLCAiX19yZXByX18iLCAiX19nZXRpdGVtX18iKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGlucywgYXR0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG1pc3NpbmcgJXMgYXR0cmlidXRlIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlucy5fX2NsYXNzX18uX19uYW1lX18sIGF0dHIpKQorCisgICAgZGVmIHRlc3RfaW5oZXJpdGFuY2Uoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgbWF0Y2hlcyB0aGUgZG9jdW1lbnRhdGlvbgorICAgICAgICBleGNfc2V0ID0gc2V0KHggZm9yIHggaW4gZGlyKGV4Y2VwdGlvbnMpIGlmIG5vdCB4LnN0YXJ0c3dpdGgoJ18nKSkKKyAgICAgICAgaW5oZXJpdGFuY2VfdHJlZSA9IG9wZW4ob3MucGF0aC5qb2luKG9zLnBhdGguc3BsaXQoX19maWxlX18pWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbl9oaWVyYXJjaHkudHh0JykpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1cGVyY2xhc3NfbmFtZSA9IGluaGVyaXRhbmNlX3RyZWUucmVhZGxpbmUoKS5yc3RyaXAoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxhc3RfZXhjID0gZ2V0YXR0cihfX2J1aWx0aW5fXywgc3VwZXJjbGFzc19uYW1lKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiYmFzZSBjbGFzcyAlcyBub3QgYSBidWlsdC1pbiIgJSBzdXBlcmNsYXNzX25hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHN1cGVyY2xhc3NfbmFtZSwgZXhjX3NldCkKKyAgICAgICAgICAgIGV4Y19zZXQuZGlzY2FyZChzdXBlcmNsYXNzX25hbWUpCisgICAgICAgICAgICBzdXBlcmNsYXNzZXMgPSBbXSAgIyBMb29wIHdpbGwgaW5zZXJ0IGJhc2UgZXhjZXB0aW9uCisgICAgICAgICAgICBsYXN0X2RlcHRoID0gMAorICAgICAgICAgICAgZm9yIGV4Y19saW5lIGluIGluaGVyaXRhbmNlX3RyZWU6CisgICAgICAgICAgICAgICAgZXhjX2xpbmUgPSBleGNfbGluZS5yc3RyaXAoKQorICAgICAgICAgICAgICAgIGRlcHRoID0gZXhjX2xpbmUucmluZGV4KCctJykKKyAgICAgICAgICAgICAgICBleGNfbmFtZSA9IGV4Y19saW5lW2RlcHRoKzI6XSAgIyBTbGljZSBwYXN0IHNwYWNlCisgICAgICAgICAgICAgICAgaWYgJygnIGluIGV4Y19uYW1lOgorICAgICAgICAgICAgICAgICAgICBwYXJlbl9pbmRleCA9IGV4Y19uYW1lLmluZGV4KCcoJykKKyAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1fbmFtZSA9IGV4Y19uYW1lW3BhcmVuX2luZGV4KzE6LTFdCisgICAgICAgICAgICAgICAgICAgIGV4Y19uYW1lID0gZXhjX25hbWVbOnBhcmVuX2luZGV4LTFdICAjIFNsaWNlIG9mZiBzcGFjZQorICAgICAgICAgICAgICAgICAgICBpZiBwbGF0Zm9ybV9zeXN0ZW0oKSAhPSBwbGF0Zm9ybV9uYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhjX3NldC5kaXNjYXJkKGV4Y19uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiAnWycgaW4gZXhjX25hbWU6CisgICAgICAgICAgICAgICAgICAgIGxlZnRfYnJhY2tldCA9IGV4Y19uYW1lLmluZGV4KCdbJykKKyAgICAgICAgICAgICAgICAgICAgZXhjX25hbWUgPSBleGNfbmFtZVs6bGVmdF9icmFja2V0LTFdICAjIGNvdmVyIHNwYWNlCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBleGMgPSBnZXRhdHRyKF9fYnVpbHRpbl9fLCBleGNfbmFtZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXMgbm90IGEgYnVpbHQtaW4gZXhjZXB0aW9uIiAlIGV4Y19uYW1lKQorICAgICAgICAgICAgICAgIGlmIGxhc3RfZGVwdGggPCBkZXB0aDoKKyAgICAgICAgICAgICAgICAgICAgc3VwZXJjbGFzc2VzLmFwcGVuZCgobGFzdF9kZXB0aCwgbGFzdF9leGMpKQorICAgICAgICAgICAgICAgIGVsaWYgbGFzdF9kZXB0aCA+IGRlcHRoOgorICAgICAgICAgICAgICAgICAgICB3aGlsZSBzdXBlcmNsYXNzZXNbLTFdWzBdID49IGRlcHRoOgorICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJjbGFzc2VzLnBvcCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoZXhjLCBzdXBlcmNsYXNzZXNbLTFdWzFdKSwKKyAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc3ViY2xhc3Mgb2YgJXMiICUgKGV4Yy5fX25hbWVfXywKKyAgICAgICAgICAgICAgICAgICAgc3VwZXJjbGFzc2VzWy0xXVsxXS5fX25hbWVfXykpCisgICAgICAgICAgICAgICAgdHJ5OiAgIyBTb21lIGV4Y2VwdGlvbnMgcmVxdWlyZSBhcmd1bWVudHM7IGp1c3Qgc2tpcCB0aGVtCisgICAgICAgICAgICAgICAgICAgIHNlbGYudmVyaWZ5X2luc3RhbmNlX2ludGVyZmFjZShleGMoKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihleGNfbmFtZSwgZXhjX3NldCkKKyAgICAgICAgICAgICAgICBleGNfc2V0LmRpc2NhcmQoZXhjX25hbWUpCisgICAgICAgICAgICAgICAgbGFzdF9leGMgPSBleGMKKyAgICAgICAgICAgICAgICBsYXN0X2RlcHRoID0gZGVwdGgKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGluaGVyaXRhbmNlX3RyZWUuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihleGNfc2V0KSwgMCwgIiVzIG5vdCBhY2NvdW50ZWQgZm9yIiAlIGV4Y19zZXQpCisKKyAgICBpbnRlcmZhY2VfdGVzdHMgPSAoImxlbmd0aCIsICJhcmdzIiwgIm1lc3NhZ2UiLCAic3RyIiwgInVuaWNvZGUiLCAicmVwciIsCisgICAgICAgICAgICAiaW5kZXhpbmciKQorCisgICAgZGVmIGludGVyZmFjZV90ZXN0X2RyaXZlcihzZWxmLCByZXN1bHRzKToKKyAgICAgICAgZm9yIHRlc3RfbmFtZSwgKGdpdmVuLCBleHBlY3RlZCkgaW4gemlwKHNlbGYuaW50ZXJmYWNlX3Rlc3RzLCByZXN1bHRzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2l2ZW4sIGV4cGVjdGVkLCAiJXM6ICVzICE9ICVzIiAlICh0ZXN0X25hbWUsCisgICAgICAgICAgICAgICAgZ2l2ZW4sIGV4cGVjdGVkKSkKKworICAgIEBpZ25vcmVfZGVwcmVjYXRpb25fd2FybmluZ3MKKyAgICBkZWYgdGVzdF9pbnRlcmZhY2Vfc2luZ2xlX2FyZyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgaW50ZXJmYWNlIHdvcmtzIHByb3Blcmx5IHdoZW4gZ2l2ZW4gYSBzaW5nbGUgYXJndW1lbnQKKyAgICAgICAgYXJnID0gInNwYW0iCisgICAgICAgIGV4YyA9IEV4Y2VwdGlvbihhcmcpCisgICAgICAgIHJlc3VsdHMgPSAoW2xlbihleGMuYXJncyksIDFdLCBbZXhjLmFyZ3NbMF0sIGFyZ10sIFtleGMubWVzc2FnZSwgYXJnXSwKKyAgICAgICAgICAgICAgICAgICBbc3RyKGV4YyksIHN0cihhcmcpXSwgW3VuaWNvZGUoZXhjKSwgdW5pY29kZShhcmcpXSwKKyAgICAgICAgICAgICAgICAgICBbcmVwcihleGMpLCBleGMuX19jbGFzc19fLl9fbmFtZV9fICsgcmVwcihleGMuYXJncyldLAorICAgICAgICAgICAgICAgICAgIFtleGNbMF0sIGFyZ10pCisgICAgICAgIHNlbGYuaW50ZXJmYWNlX3Rlc3RfZHJpdmVyKHJlc3VsdHMpCisKKyAgICBAaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzCisgICAgZGVmIHRlc3RfaW50ZXJmYWNlX211bHRpX2FyZyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgaW50ZXJmYWNlIGNvcnJlY3Qgd2hlbiBtdWx0aXBsZSBhcmd1bWVudHMgZ2l2ZW4KKyAgICAgICAgYXJnX2NvdW50ID0gMworICAgICAgICBhcmdzID0gdHVwbGUocmFuZ2UoYXJnX2NvdW50KSkKKyAgICAgICAgZXhjID0gRXhjZXB0aW9uKCphcmdzKQorICAgICAgICByZXN1bHRzID0gKFtsZW4oZXhjLmFyZ3MpLCBhcmdfY291bnRdLCBbZXhjLmFyZ3MsIGFyZ3NdLAorICAgICAgICAgICAgICAgICAgIFtleGMubWVzc2FnZSwgJyddLCBbc3RyKGV4YyksIHN0cihhcmdzKV0sCisgICAgICAgICAgICAgICAgICAgW3VuaWNvZGUoZXhjKSwgdW5pY29kZShhcmdzKV0sCisgICAgICAgICAgICAgICAgICAgW3JlcHIoZXhjKSwgZXhjLl9fY2xhc3NfXy5fX25hbWVfXyArIHJlcHIoZXhjLmFyZ3MpXSwKKyAgICAgICAgICAgICAgICAgICBbZXhjWy0xXSwgYXJnc1stMV1dKQorICAgICAgICBzZWxmLmludGVyZmFjZV90ZXN0X2RyaXZlcihyZXN1bHRzKQorCisgICAgQGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncworICAgIGRlZiB0ZXN0X2ludGVyZmFjZV9ub19hcmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgd2l0aCBubyBhcmdzIHRoYXQgaW50ZXJmYWNlIGlzIGNvcnJlY3QKKyAgICAgICAgZXhjID0gRXhjZXB0aW9uKCkKKyAgICAgICAgcmVzdWx0cyA9IChbbGVuKGV4Yy5hcmdzKSwgMF0sIFtleGMuYXJncywgdHVwbGUoKV0sCisgICAgICAgICAgICAgICAgICAgW2V4Yy5tZXNzYWdlLCAnJ10sCisgICAgICAgICAgICAgICAgICAgW3N0cihleGMpLCAnJ10sIFt1bmljb2RlKGV4YyksIHUnJ10sCisgICAgICAgICAgICAgICAgICAgW3JlcHIoZXhjKSwgZXhjLl9fY2xhc3NfXy5fX25hbWVfXyArICcoKSddLCBbVHJ1ZSwgVHJ1ZV0pCisgICAgICAgIHNlbGYuaW50ZXJmYWNlX3Rlc3RfZHJpdmVyKHJlc3VsdHMpCisKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZGVwcmVjYXRpb24oc2VsZik6CisgICAgICAgICMgQXMgb2YgUHl0aG9uIDIuNiwgQmFzZUV4Y2VwdGlvbi5tZXNzYWdlIGlzIGRlcHJlY2F0ZWQuCisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCIiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIEJhc2VFeGNlcHRpb24oKS5tZXNzYWdlCisKKworY2xhc3MgVXNhZ2VUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJUZXN0IHVzYWdlIG9mIGV4Y2VwdGlvbnMiIiIKKworICAgIGRlZiByYWlzZV9mYWlscyhzZWxmLCBvYmplY3RfKToKKyAgICAgICAgIiIiTWFrZSBzdXJlIHRoYXQgcmFpc2luZyAnb2JqZWN0XycgdHJpZ2dlcnMgYSBUeXBlRXJyb3IuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIG9iamVjdF8KKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAgIyBXaGF0IGlzIGV4cGVjdGVkLgorICAgICAgICBzZWxmLmZhaWwoIlR5cGVFcnJvciBleHBlY3RlZCBmb3IgcmFpc2luZyAlcyIgJSB0eXBlKG9iamVjdF8pKQorCisgICAgZGVmIGNhdGNoX2ZhaWxzKHNlbGYsIG9iamVjdF8pOgorICAgICAgICAiIiJDYXRjaGluZyAnb2JqZWN0Xycgc2hvdWxkIHJhaXNlIGEgVHlwZUVycm9yLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RhbmRhcmRFcnJvcgorICAgICAgICAgICAgZXhjZXB0IG9iamVjdF86CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVHlwZUVycm9yIGV4cGVjdGVkIHdoZW4gY2F0Y2hpbmcgJXMiICUgdHlwZShvYmplY3RfKSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RhbmRhcmRFcnJvcgorICAgICAgICAgICAgZXhjZXB0IChvYmplY3RfLCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJUeXBlRXJyb3IgZXhwZWN0ZWQgd2hlbiBjYXRjaGluZyAlcyBhcyBzcGVjaWZpZWQgaW4gYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAidHVwbGUiICUgdHlwZShvYmplY3RfKSkKKworICAgIEBpZ25vcmVfZGVwcmVjYXRpb25fd2FybmluZ3MKKyAgICBkZWYgdGVzdF9yYWlzZV9jbGFzc2ljKHNlbGYpOgorICAgICAgICAjIFJhaXNpbmcgYSBjbGFzc2ljIGNsYXNzIGlzIG9rYXkgKGZvciBub3cpLgorICAgICAgICBjbGFzcyBDbGFzc2ljQ2xhc3M6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIENsYXNzaWNDbGFzcworICAgICAgICBleGNlcHQgQ2xhc3NpY0NsYXNzOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInVuYWJsZSB0byByYWlzZSBjbGFzc2ljIGNsYXNzIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgQ2xhc3NpY0NsYXNzKCkKKyAgICAgICAgZXhjZXB0IENsYXNzaWNDbGFzczoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmFibGUgdG8gcmFpc2UgY2xhc3NpYyBjbGFzcyBpbnN0YW5jZSIpCisKKyAgICBkZWYgdGVzdF9yYWlzZV9uZXdfc3R5bGVfbm9uX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgIyBZb3UgY2Fubm90IHJhaXNlIGEgbmV3LXN0eWxlIGNsYXNzIHRoYXQgZG9lcyBub3QgaW5oZXJpdCBmcm9tCisgICAgICAgICMgQmFzZUV4Y2VwdGlvbjsgdGhlIGFiaWxpdHkgd2FzIG5vdCBwb3NzaWJsZSB1bnRpbCBCYXNlRXhjZXB0aW9uJ3MKKyAgICAgICAgIyBpbnRyb2R1Y3Rpb24gc28gbm8gbmVlZCB0byBzdXBwb3J0IG5ldy1zdHlsZSBvYmplY3RzIHRoYXQgZG8gbm90CisgICAgICAgICMgaW5oZXJpdCBmcm9tIGl0LgorICAgICAgICBjbGFzcyBOZXdTdHlsZUNsYXNzKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYucmFpc2VfZmFpbHMoTmV3U3R5bGVDbGFzcykKKyAgICAgICAgc2VsZi5yYWlzZV9mYWlscyhOZXdTdHlsZUNsYXNzKCkpCisKKyAgICBkZWYgdGVzdF9yYWlzZV9zdHJpbmcoc2VsZik6CisgICAgICAgICMgUmFpc2luZyBhIHN0cmluZyByYWlzZXMgVHlwZUVycm9yLgorICAgICAgICBzZWxmLnJhaXNlX2ZhaWxzKCJzcGFtIikKKworICAgIGRlZiB0ZXN0X2NhdGNoX3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBDYXRjaGluZyBhIHN0cmluZyBzaG91bGQgdHJpZ2dlciBhIERlcHJlY2F0aW9uV2FybmluZy4KKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3MucmVzZXR3YXJuaW5ncygpCisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiKQorICAgICAgICAgICAgc3RyX2V4YyA9ICJzcGFtIgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RhbmRhcmRFcnJvcgorICAgICAgICAgICAgICAgIGV4Y2VwdCBzdHJfZXhjOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgZXZlbiBpZiB0aGUgc3RyaW5nIGV4Y2VwdGlvbiBpcyBsaXN0ZWQgaW4gYSB0dXBsZQorICAgICAgICAgICAgIyB0aGF0IGEgd2FybmluZyBpcyByYWlzZWQuCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKERlcHJlY2F0aW9uV2FybmluZyk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTdGFuZGFyZEVycm9yCisgICAgICAgICAgICAgICAgZXhjZXB0IChBc3NlcnRpb25FcnJvciwgc3RyX2V4Yyk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEV4Y2VwdGlvbkNsYXNzVGVzdHMsIFVzYWdlVGVzdHMpCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAzNTIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMzUyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTE4MTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMzUyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAzNTIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMzUyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTE4MTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMzUyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxMjY0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpY2tsZS5weQpAQCAtMCwwICsxLDkyIEBACitpbXBvcnQgcGlja2xlCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworZnJvbSB0ZXN0LnBpY2tsZXRlc3RlciBpbXBvcnQgKEFic3RyYWN0UGlja2xlVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQaWNrbGVNb2R1bGVUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBlcnNpc3RlbnRQaWNrbGVyVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQaWNrbGVyVW5waWNrbGVyT2JqZWN0VGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlnbWVtUGlja2xlVGVzdHMpCisKK2NsYXNzIFBpY2tsZVRlc3RzKEFic3RyYWN0UGlja2xlVGVzdHMsIEFic3RyYWN0UGlja2xlTW9kdWxlVGVzdHMpOgorCisgICAgZGVmIGR1bXBzKHNlbGYsIGFyZywgcHJvdG89MCwgZmFzdD0wKToKKyAgICAgICAgIyBJZ25vcmUgZmFzdAorICAgICAgICByZXR1cm4gcGlja2xlLmR1bXBzKGFyZywgcHJvdG8pCisKKyAgICBkZWYgbG9hZHMoc2VsZiwgYnVmKToKKyAgICAgICAgIyBJZ25vcmUgZmFzdAorICAgICAgICByZXR1cm4gcGlja2xlLmxvYWRzKGJ1ZikKKworICAgIG1vZHVsZSA9IHBpY2tsZQorICAgIGVycm9yID0gS2V5RXJyb3IKKworY2xhc3MgUGlja2xlclRlc3RzKEFic3RyYWN0UGlja2xlVGVzdHMpOgorCisgICAgZXJyb3IgPSBLZXlFcnJvcgorCisgICAgZGVmIGR1bXBzKHNlbGYsIGFyZywgcHJvdG89MCwgZmFzdD0wKToKKyAgICAgICAgZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgcCA9IHBpY2tsZS5QaWNrbGVyKGYsIHByb3RvKQorICAgICAgICBpZiBmYXN0OgorICAgICAgICAgICAgcC5mYXN0ID0gZmFzdAorICAgICAgICBwLmR1bXAoYXJnKQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgcmV0dXJuIGYucmVhZCgpCisKKyAgICBkZWYgbG9hZHMoc2VsZiwgYnVmKToKKyAgICAgICAgZiA9IFN0cmluZ0lPKGJ1ZikKKyAgICAgICAgdSA9IHBpY2tsZS5VbnBpY2tsZXIoZikKKyAgICAgICAgcmV0dXJuIHUubG9hZCgpCisKK2NsYXNzIFBlcnNQaWNrbGVyVGVzdHMoQWJzdHJhY3RQZXJzaXN0ZW50UGlja2xlclRlc3RzKToKKworICAgIGRlZiBkdW1wcyhzZWxmLCBhcmcsIHByb3RvPTAsIGZhc3Q9MCk6CisgICAgICAgIGNsYXNzIFBlcnNQaWNrbGVyKHBpY2tsZS5QaWNrbGVyKToKKyAgICAgICAgICAgIGRlZiBwZXJzaXN0ZW50X2lkKHN1YnNlbGYsIG9iaik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGVyc2lzdGVudF9pZChvYmopCisgICAgICAgIGYgPSBTdHJpbmdJTygpCisgICAgICAgIHAgPSBQZXJzUGlja2xlcihmLCBwcm90bykKKyAgICAgICAgaWYgZmFzdDoKKyAgICAgICAgICAgIHAuZmFzdCA9IGZhc3QKKyAgICAgICAgcC5kdW1wKGFyZykKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHJldHVybiBmLnJlYWQoKQorCisgICAgZGVmIGxvYWRzKHNlbGYsIGJ1Zik6CisgICAgICAgIGNsYXNzIFBlcnNVbnBpY2tsZXIocGlja2xlLlVucGlja2xlcik6CisgICAgICAgICAgICBkZWYgcGVyc2lzdGVudF9sb2FkKHN1YnNlbGYsIG9iaik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGVyc2lzdGVudF9sb2FkKG9iaikKKyAgICAgICAgZiA9IFN0cmluZ0lPKGJ1ZikKKyAgICAgICAgdSA9IFBlcnNVbnBpY2tsZXIoZikKKyAgICAgICAgcmV0dXJuIHUubG9hZCgpCisKK2NsYXNzIFBpY2tsZXJVbnBpY2tsZXJPYmplY3RUZXN0cyhBYnN0cmFjdFBpY2tsZXJVbnBpY2tsZXJPYmplY3RUZXN0cyk6CisKKyAgICBwaWNrbGVyX2NsYXNzID0gcGlja2xlLlBpY2tsZXIKKyAgICB1bnBpY2tsZXJfY2xhc3MgPSBwaWNrbGUuVW5waWNrbGVyCisKK2NsYXNzIFBpY2tsZUJpZ21lbVBpY2tsZVRlc3RzKEJpZ21lbVBpY2tsZVRlc3RzKToKKworICAgIGRlZiBkdW1wcyhzZWxmLCBhcmcsIHByb3RvPTAsIGZhc3Q9MCk6CisgICAgICAgICMgSWdub3JlIGZhc3QKKyAgICAgICAgcmV0dXJuIHBpY2tsZS5kdW1wcyhhcmcsIHByb3RvKQorCisgICAgZGVmIGxvYWRzKHNlbGYsIGJ1Zik6CisgICAgICAgICMgSWdub3JlIGZhc3QKKyAgICAgICAgcmV0dXJuIHBpY2tsZS5sb2FkcyhidWYpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFBpY2tsZVRlc3RzLAorICAgICAgICBQaWNrbGVyVGVzdHMsCisgICAgICAgIFBlcnNQaWNrbGVyVGVzdHMsCisgICAgICAgIFBpY2tsZXJVbnBpY2tsZXJPYmplY3RUZXN0cywKKyAgICAgICAgUGlja2xlQmlnbWVtUGlja2xlVGVzdHMsCisgICAgKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdChwaWNrbGUpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpY2tsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzgxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpY2tsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzgxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1YjM1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5CkBAIC0wLDAgKzEsMjQgQEAKK2ltcG9ydCBwaWNrbGUKK2ltcG9ydCBwaWNrbGV0b29scworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC5waWNrbGV0ZXN0ZXIgaW1wb3J0IEFic3RyYWN0UGlja2xlVGVzdHMKK2Zyb20gdGVzdC5waWNrbGV0ZXN0ZXIgaW1wb3J0IEFic3RyYWN0UGlja2xlTW9kdWxlVGVzdHMKKworY2xhc3MgT3B0aW1pemVkUGlja2xlVGVzdHMoQWJzdHJhY3RQaWNrbGVUZXN0cywgQWJzdHJhY3RQaWNrbGVNb2R1bGVUZXN0cyk6CisKKyAgICBkZWYgZHVtcHMoc2VsZiwgYXJnLCBwcm90bz0wLCBmYXN0PTApOgorICAgICAgICByZXR1cm4gcGlja2xldG9vbHMub3B0aW1pemUocGlja2xlLmR1bXBzKGFyZywgcHJvdG8pKQorCisgICAgZGVmIGxvYWRzKHNlbGYsIGJ1Zik6CisgICAgICAgIHJldHVybiBwaWNrbGUubG9hZHMoYnVmKQorCisgICAgbW9kdWxlID0gcGlja2xlCisgICAgZXJyb3IgPSBLZXlFcnJvcgorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChPcHRpbWl6ZWRQaWNrbGVUZXN0cykKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QocGlja2xldG9vbHMpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjNlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGV0b29scy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZjNlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGV0b29scy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlwZXMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGI4YmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlwZXMucHkKQEAgLTAsMCArMSwyMDQgQEAKK2ltcG9ydCBwaXBlcworaW1wb3J0IG9zCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0LCB1bmxpbmssIHJlYXBfY2hpbGRyZW4KKworaWYgb3MubmFtZSAhPSAncG9zaXgnOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdwaXBlcyBtb2R1bGUgb25seSB3b3JrcyBvbiBwb3NpeCcpCisKK1RFU1RGTjIgPSBURVNURk4gKyAiMiIKKworIyB0ciBhLXogQS1aIGlzIG5vdCBwb3J0YWJsZSwgc28gbWFrZSB0aGUgcmFuZ2VzIGV4cGxpY2l0CitzX2NvbW1hbmQgPSAndHIgJXMgJXMnICUgKHN0cmluZy5hc2NpaV9sb3dlcmNhc2UsIHN0cmluZy5hc2NpaV91cHBlcmNhc2UpCisKK2NsYXNzIFNpbXBsZVBpcGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOLCBURVNURk4yKToKKyAgICAgICAgICAgIHVubGluayhmKQorCisgICAgZGVmIHRlc3RTaW1wbGVQaXBlMShzZWxmKToKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgdC5hcHBlbmQoc19jb21tYW5kLCBwaXBlcy5TVERJTl9TVERPVVQpCisgICAgICAgIGYgPSB0Lm9wZW4oVEVTVEZOLCAndycpCisgICAgICAgIGYud3JpdGUoJ2hlbGxvIHdvcmxkICMxJykKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHdpdGggb3BlbihURVNURk4pIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAnSEVMTE8gV09STEQgIzEnKQorCisgICAgZGVmIHRlc3RTaW1wbGVQaXBlMihzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgnaGVsbG8gd29ybGQgIzInKQorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICB0LmFwcGVuZChzX2NvbW1hbmQgKyAnIDwgJElOID4gJE9VVCcsIHBpcGVzLkZJTEVJTl9GSUxFT1VUKQorICAgICAgICB0LmNvcHkoVEVTVEZOLCBURVNURk4yKQorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICdIRUxMTyBXT1JMRCAjMicpCisKKyAgICBkZWYgdGVzdFNpbXBsZVBpcGUzKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCdoZWxsbyB3b3JsZCAjMicpCisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHQuYXBwZW5kKHNfY29tbWFuZCArICcgPCAkSU4nLCBwaXBlcy5GSUxFSU5fU1RET1VUKQorICAgICAgICB3aXRoIHQub3BlbihURVNURk4sICdyJykgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICdIRUxMTyBXT1JMRCAjMicpCisKKyAgICBkZWYgdGVzdEVtcHR5UGlwZWxpbmUxKHNlbGYpOgorICAgICAgICAjIGNvcHkgdGhyb3VnaCBlbXB0eSBwaXBlCisgICAgICAgIGQgPSAnZW1wdHkgcGlwZWxpbmUgdGVzdCBDT1BZJworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGQpCisgICAgICAgIHdpdGggb3BlbihURVNURk4yLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCcnKQorICAgICAgICB0PXBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgdC5jb3B5KFRFU1RGTiwgVEVTVEZOMikKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTjIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBkKQorCisgICAgZGVmIHRlc3RFbXB0eVBpcGVsaW5lMihzZWxmKToKKyAgICAgICAgIyByZWFkIHRocm91Z2ggZW1wdHkgcGlwZQorICAgICAgICBkID0gJ2VtcHR5IHBpcGVsaW5lIHRlc3QgUkVBRCcKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShkKQorICAgICAgICB0PXBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgd2l0aCB0Lm9wZW4oVEVTVEZOLCAncicpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBkKQorCisgICAgZGVmIHRlc3RFbXB0eVBpcGVsaW5lMyhzZWxmKToKKyAgICAgICAgIyB3cml0ZSB0aHJvdWdoIGVtcHR5IHBpcGUKKyAgICAgICAgZCA9ICdlbXB0eSBwaXBlbGluZSB0ZXN0IFdSSVRFJworICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICB3aXRoIHQub3BlbihURVNURk4sICd3JykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoZCkKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGQpCisKKyAgICBkZWYgdGVzdFF1b3Rpbmcoc2VsZik6CisgICAgICAgIHNhZmV1bnF1b3RlZCA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICdAJV8tKz06LC4vJworICAgICAgICB1bnNhZmUgPSAnImAkXFwhJworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGlwZXMucXVvdGUoJycpLCAiJyciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpcGVzLnF1b3RlKHNhZmV1bnF1b3RlZCksIHNhZmV1bnF1b3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaXBlcy5xdW90ZSgndGVzdCBmaWxlIG5hbWUnKSwgIid0ZXN0IGZpbGUgbmFtZSciKQorICAgICAgICBmb3IgdSBpbiB1bnNhZmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpcGVzLnF1b3RlKCd0ZXN0JXNuYW1lJyAlIHUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIid0ZXN0JXNuYW1lJyIgJSB1KQorICAgICAgICBmb3IgdSBpbiB1bnNhZmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpcGVzLnF1b3RlKCJ0ZXN0JXMnbmFtZSciICUgdSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIndGVzdCVzJ1wiJ1wiJ25hbWUnXCInXCInJyIgJSB1KQorCisgICAgZGVmIHRlc3RSZXByKHNlbGYpOgorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodCksICI8VGVtcGxhdGUgaW5zdGFuY2UsIHN0ZXBzPVtdPiIpCisgICAgICAgIHQuYXBwZW5kKCd0ciBhLXogQS1aJywgcGlwZXMuU1RESU5fU1RET1VUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodCksCisgICAgICAgICAgICAgICAgICAgICI8VGVtcGxhdGUgaW5zdGFuY2UsIHN0ZXBzPVsoJ3RyIGEteiBBLVonLCAnLS0nKV0+IikKKworICAgIGRlZiB0ZXN0U2V0RGVidWcoc2VsZik6CisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHQuZGVidWcoRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5kZWJ1Z2dpbmcsIEZhbHNlKQorICAgICAgICB0LmRlYnVnKFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5kZWJ1Z2dpbmcsIFRydWUpCisKKyAgICBkZWYgdGVzdFJlYWRPcGVuU2luayhzZWxmKToKKyAgICAgICAgIyBjaGVjayBjYWxsaW5nIG9wZW4oJ3InKSBvbiBhIHBpcGUgZW5kaW5nIHdpdGgKKyAgICAgICAgIyBhIHNpbmsgcmFpc2VzIFZhbHVlRXJyb3IKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgdC5hcHBlbmQoJ2JvZ3VzY21kJywgcGlwZXMuU0lOSykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5vcGVuLCAnYm9ndXNmaWxlJywgJ3InKQorCisgICAgZGVmIHRlc3RXcml0ZU9wZW5Tb3VyY2Uoc2VsZik6CisgICAgICAgICMgY2hlY2sgY2FsbGluZyBvcGVuKCd3Jykgb24gYSBwaXBlIGVuZGluZyB3aXRoCisgICAgICAgICMgYSBzb3VyY2UgcmFpc2VzIFZhbHVlRXJyb3IKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgdC5wcmVwZW5kKCdib2d1c2NtZCcsIHBpcGVzLlNPVVJDRSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5vcGVuLCAnYm9ndXNmaWxlJywgJ3cnKQorCisgICAgZGVmIHRlc3RCYWRBcHBlbmRPcHRpb25zKHNlbGYpOgorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorCisgICAgICAgICMgdHJ5IGEgbm9uLXN0cmluZyBjb21tYW5kCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdC5hcHBlbmQsIDcsIHBpcGVzLlNURElOX1NURE9VVCkKKworICAgICAgICAjIHRyeSBhIHR5cGUgdGhhdCBpc24ndCByZWNvZ25pemVkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuYXBwZW5kLCAnYm9ndXNjbWQnLCAneHgnKQorCisgICAgICAgICMgc2hvdWxkbid0IGJlIGFibGUgdG8gYXBwZW5kIGEgc291cmNlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuYXBwZW5kLCAnYm9ndXNjbWQnLCBwaXBlcy5TT1VSQ0UpCisKKyAgICAgICAgIyBjaGVjayBhcHBlbmRpbmcgdHdvIHNpbmtzCisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHQuYXBwZW5kKCdib2d1c2NtZCcsIHBpcGVzLlNJTkspCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuYXBwZW5kLCAnYm9ndXNjbWQnLCBwaXBlcy5TSU5LKQorCisgICAgICAgICMgY29tbWFuZCBuZWVkaW5nIGZpbGUgaW5wdXQgYnV0IHdpdGggbm8gJElOCisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuYXBwZW5kLCAnYm9ndXNjbWQgJE9VVCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlcy5GSUxFSU5fRklMRU9VVCkKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5hcHBlbmQsICdib2d1c2NtZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlcy5GSUxFSU5fU1RET1VUKQorCisgICAgICAgICMgY29tbWFuZCBuZWVkaW5nIGZpbGUgb3V0cHV0IGJ1dCB3aXRoIG5vICRPVVQKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5hcHBlbmQsICdib2d1c2NtZCAkSU4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZXMuRklMRUlOX0ZJTEVPVVQpCisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuYXBwZW5kLCAnYm9ndXNjbWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZXMuU1RESU5fRklMRU9VVCkKKworCisgICAgZGVmIHRlc3RCYWRQcmVwZW5kT3B0aW9ucyhzZWxmKToKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKworICAgICAgICAjIHRyeSBhIG5vbi1zdHJpbmcgY29tbWFuZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQucHJlcGVuZCwgNywgcGlwZXMuU1RESU5fU1RET1VUKQorCisgICAgICAgICMgdHJ5IGEgdHlwZSB0aGF0IGlzbid0IHJlY29nbml6ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5wcmVwZW5kLCAndHIgYS16IEEtWicsICd4eCcpCisKKyAgICAgICAgIyBzaG91bGRuJ3QgYmUgYWJsZSB0byBwcmVwZW5kIGEgc2luaworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnByZXBlbmQsICdib2d1c2NtZCcsIHBpcGVzLlNJTkspCisKKyAgICAgICAgIyBjaGVjayBwcmVwZW5kaW5nIHR3byBzb3VyY2VzCisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHQucHJlcGVuZCgnYm9ndXNjbWQnLCBwaXBlcy5TT1VSQ0UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQucHJlcGVuZCwgJ2JvZ3VzY21kJywgcGlwZXMuU09VUkNFKQorCisgICAgICAgICMgY29tbWFuZCBuZWVkaW5nIGZpbGUgaW5wdXQgYnV0IHdpdGggbm8gJElOCisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQucHJlcGVuZCwgJ2JvZ3VzY21kICRPVVQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZXMuRklMRUlOX0ZJTEVPVVQpCisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQucHJlcGVuZCwgJ2JvZ3VzY21kJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVzLkZJTEVJTl9TVERPVVQpCisKKyAgICAgICAgIyBjb21tYW5kIG5lZWRpbmcgZmlsZSBvdXRwdXQgYnV0IHdpdGggbm8gJE9VVAorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnByZXBlbmQsICdib2d1c2NtZCAkSU4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZXMuRklMRUlOX0ZJTEVPVVQpCisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQucHJlcGVuZCwgJ2JvZ3VzY21kJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVzLlNURElOX0ZJTEVPVVQpCisKKyAgICBkZWYgdGVzdEJhZE9wZW5Nb2RlKHNlbGYpOgorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0Lm9wZW4sICdib2d1c2ZpbGUnLCAneCcpCisKKyAgICBkZWYgdGVzdENsb25lKHNlbGYpOgorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICB0LmFwcGVuZCgndHIgYS16IEEtWicsIHBpcGVzLlNURElOX1NURE9VVCkKKworICAgICAgICB1ID0gdC5jbG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQodCksIGlkKHUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc3RlcHMsIHUuc3RlcHMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQodC5zdGVwcyksIGlkKHUuc3RlcHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZGVidWdnaW5nLCB1LmRlYnVnZ2luZykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChTaW1wbGVQaXBlVGVzdHMpCisgICAgcmVhcF9jaGlsZHJlbigpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpcGVzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpcGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWFhYWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlwZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpcGVzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpcGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWFhYWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlwZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjE2NTliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnLnB5CkBAIC0wLDAgKzEsMjkyIEBACisjIFRlc3QgcGFja2FnZXMgKGRvdHRlZC1uYW1lIGltcG9ydCkKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0ZXh0d3JhcAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKKyMgSGVscGVycyB0byBjcmVhdGUgYW5kIGRlc3Ryb3kgaGllcmFyY2hpZXMuCisKK2RlZiBjbGVhbm91dChyb290KToKKyAgICBuYW1lcyA9IG9zLmxpc3RkaXIocm9vdCkKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhmdWxsbmFtZSk6CisgICAgICAgICAgICBjbGVhbm91dChmdWxsbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9zLnJlbW92ZShmdWxsbmFtZSkKKyAgICBvcy5ybWRpcihyb290KQorCitkZWYgZml4ZGlyKGxzdCk6CisgICAgaWYgIl9fYnVpbHRpbnNfXyIgaW4gbHN0OgorICAgICAgICBsc3QucmVtb3ZlKCJfX2J1aWx0aW5zX18iKQorICAgIHJldHVybiBsc3QKKworCisjIFhYWCBUaGluZ3MgdG8gdGVzdAorIworIyBpbXBvcnQgcGFja2FnZSB3aXRob3V0IF9faW5pdF9fCisjIGltcG9ydCBwYWNrYWdlIHdpdGggX19pbml0X18KKyMgX19pbml0X18gaW1wb3J0aW5nIHN1Ym1vZHVsZQorIyBfX2luaXRfXyBpbXBvcnRpbmcgZ2xvYmFsIG1vZHVsZQorIyBfX2luaXRfXyBkZWZpbmluZyB2YXJpYWJsZXMKKyMgc3VibW9kdWxlIGltcG9ydGluZyBvdGhlciBzdWJtb2R1bGUKKyMgc3VibW9kdWxlIGltcG9ydGluZyBnbG9iYWwgbW9kdWxlCisjIHN1Ym1vZHVsZSBpbXBvcnQgc3VibW9kdWxlIHZpYSBnbG9iYWwgbmFtZQorIyBmcm9tIHBhY2thZ2UgaW1wb3J0IHN1Ym1vZHVsZQorIyBmcm9tIHBhY2thZ2UgaW1wb3J0IHN1YnBhY2thZ2UKKyMgZnJvbSBwYWNrYWdlIGltcG9ydCB2YXJpYWJsZSAoZGVmaW5lZCBpbiBfX2luaXRfXykKKyMgZnJvbSBwYWNrYWdlIGltcG9ydCAqIChkZWZpbmVkIGluIF9faW5pdF9fKQorCisKK2NsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnJvb3QgPSBOb25lCisgICAgICAgIHNlbGYucGtnbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5zeXNwYXRoID0gbGlzdChzeXMucGF0aCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3lzLnBhdGhbOl0gPSBzZWxmLnN5c3BhdGgKKyAgICAgICAgaWYgc2VsZi5yb290OiAjIE9ubHkgY2xlYW4gaWYgdGhlIHRlc3Qgd2FzIGFjdHVhbGx5IHJ1bgorICAgICAgICAgICAgY2xlYW5vdXQoc2VsZi5yb290KQorCisgICAgICAgICMgZGVsZXRlIGFsbCBtb2R1bGVzIGNvbmNlcm5pbmcgdGhlIHRlc3RlZCBoaWVyYXJjaHkKKyAgICAgICAgaWYgc2VsZi5wa2duYW1lOgorICAgICAgICAgICAgbW9kdWxlcyA9IFtuYW1lIGZvciBuYW1lIGluIHN5cy5tb2R1bGVzCisgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucGtnbmFtZSBpbiBuYW1lLnNwbGl0KCcuJyldCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBtb2R1bGVzOgorICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tuYW1lXQorCisgICAgZGVmIHJ1bl9jb2RlKHNlbGYsIGNvZGUpOgorICAgICAgICBleGVjKHRleHR3cmFwLmRlZGVudChjb2RlKSwgZ2xvYmFscygpLCB7InNlbGYiOiBzZWxmfSkKKworICAgIGRlZiBta2hpZXIoc2VsZiwgZGVzY3IpOgorICAgICAgICByb290ID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCByb290KQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2Rpcihyb290KToKKyAgICAgICAgICAgIG9zLm1rZGlyKHJvb3QpCisgICAgICAgIGZvciBuYW1lLCBjb250ZW50cyBpbiBkZXNjcjoKKyAgICAgICAgICAgIGNvbXBzID0gbmFtZS5zcGxpdCgpCisgICAgICAgICAgICBmdWxsbmFtZSA9IHJvb3QKKyAgICAgICAgICAgIGZvciBjIGluIGNvbXBzOgorICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGZ1bGxuYW1lLCBjKQorICAgICAgICAgICAgaWYgY29udGVudHMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihmdWxsbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4oZnVsbG5hbWUsICJ3IikKKyAgICAgICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQorICAgICAgICAgICAgICAgIGlmIGNvbnRlbnRzIGFuZCBjb250ZW50c1stMV0gIT0gJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnXG4nKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLnJvb3QgPSByb290CisgICAgICAgICMgcGFja2FnZSBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBpdGVtCisgICAgICAgIHNlbGYucGtnbmFtZSA9IGRlc2NyWzBdWzBdCisKKyAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICBoaWVyID0gWygidDEiLCBOb25lKSwgKCJ0MSBfX2luaXRfXyIrb3MuZXh0c2VwKyJweSIsICIiKV0KKyAgICAgICAgc2VsZi5ta2hpZXIoaGllcikKKyAgICAgICAgaW1wb3J0IHQxCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBoaWVyID0gWworICAgICAgICAgKCJ0MiIsIE5vbmUpLAorICAgICAgICAgKCJ0MiBfX2luaXRfXyIrb3MuZXh0c2VwKyJweSIsICInZG9jIGZvciB0MiciKSwKKyAgICAgICAgICgidDIgc3ViIiwgTm9uZSksCisgICAgICAgICAoInQyIHN1YiBfX2luaXRfXyIrb3MuZXh0c2VwKyJweSIsICIiKSwKKyAgICAgICAgICgidDIgc3ViIHN1YnN1YiIsIE5vbmUpLAorICAgICAgICAgKCJ0MiBzdWIgc3Vic3ViIF9faW5pdF9fIitvcy5leHRzZXArInB5IiwgInNwYW0gPSAxIiksCisgICAgICAgIF0KKyAgICAgICAgc2VsZi5ta2hpZXIoaGllcikKKworICAgICAgICBpbXBvcnQgdDIuc3ViCisgICAgICAgIGltcG9ydCB0Mi5zdWIuc3Vic3ViCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIuX19uYW1lX18sICJ0MiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIuc3ViLl9fbmFtZV9fLCAidDIuc3ViIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi5zdWIuc3Vic3ViLl9fbmFtZV9fLCAidDIuc3ViLnN1YnN1YiIpCisKKyAgICAgICAgIyBUaGlzIGV4ZWMgY3JhcCBpcyBuZWVkZWQgYmVjYXVzZSBQeTNrIGZvcmJpZHMgJ2ltcG9ydCAqJyBvdXRzaWRlCisgICAgICAgICMgb2YgbW9kdWxlLXNjb3BlIGFuZCBfX2ltcG9ydF9fKCkgaXMgaW5zdWZmaWNpZW50IGZvciB3aGF0IHdlIG5lZWQuCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGltcG9ydCB0MgorICAgICAgICAgICAgZnJvbSB0MiBpbXBvcnQgKgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIoKSwgWydzZWxmJywgJ3N1YicsICd0MiddKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYucnVuX2NvZGUocykKKworICAgICAgICBmcm9tIHQyIGltcG9ydCBzdWIKKyAgICAgICAgZnJvbSB0Mi5zdWIgaW1wb3J0IHN1YnN1YgorICAgICAgICBmcm9tIHQyLnN1Yi5zdWJzdWIgaW1wb3J0IHNwYW0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWIuX19uYW1lX18sICJ0Mi5zdWIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1YnN1Yi5fX25hbWVfXywgInQyLnN1Yi5zdWJzdWIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1Yi5zdWJzdWIuX19uYW1lX18sICJ0Mi5zdWIuc3Vic3ViIikKKyAgICAgICAgZm9yIG5hbWUgaW4gWydzcGFtJywgJ3N1YicsICdzdWJzdWInLCAndDInXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2NhbHMoKVsibmFtZSJdLCAiRmFpbGVkIHRvIGltcG9ydCAlcyIgJSBuYW1lKQorCisgICAgICAgIGltcG9ydCB0Mi5zdWIKKyAgICAgICAgaW1wb3J0IHQyLnN1Yi5zdWJzdWIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi5fX25hbWVfXywgInQyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi5zdWIuX19uYW1lX18sICJ0Mi5zdWIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLnN1Yi5zdWJzdWIuX19uYW1lX18sICJ0Mi5zdWIuc3Vic3ViIikKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBmcm9tIHQyIGltcG9ydCAqCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlyKCksIFsnc2VsZicsICdzdWInXSkKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLnJ1bl9jb2RlKHMpCisKKyAgICBkZWYgdGVzdF8zKHNlbGYpOgorICAgICAgICBoaWVyID0gWworICAgICAgICAgICAgICAgICgidDMiLCBOb25lKSwKKyAgICAgICAgICAgICAgICAoInQzIF9faW5pdF9fIitvcy5leHRzZXArInB5IiwgIiIpLAorICAgICAgICAgICAgICAgICgidDMgc3ViIiwgTm9uZSksCisgICAgICAgICAgICAgICAgKCJ0MyBzdWIgX19pbml0X18iK29zLmV4dHNlcCsicHkiLCAiIiksCisgICAgICAgICAgICAgICAgKCJ0MyBzdWIgc3Vic3ViIiwgTm9uZSksCisgICAgICAgICAgICAgICAgKCJ0MyBzdWIgc3Vic3ViIF9faW5pdF9fIitvcy5leHRzZXArInB5IiwgInNwYW0gPSAxIiksCisgICAgICAgICAgICAgICBdCisgICAgICAgIHNlbGYubWtoaWVyKGhpZXIpCisKKyAgICAgICAgaW1wb3J0IHQzLnN1Yi5zdWJzdWIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My5fX25hbWVfXywgInQzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My5zdWIuX19uYW1lX18sICJ0My5zdWIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLnN1Yi5zdWJzdWIuX19uYW1lX18sICJ0My5zdWIuc3Vic3ViIikKKworICAgIGRlZiB0ZXN0XzQoc2VsZik6CisgICAgICAgIGhpZXIgPSBbCisgICAgICAgICgidDQucHkiLCAicmFpc2UgUnVudGltZUVycm9yKCdTaG91bGRudCBsb2FkIHQ0LnB5JykiKSwKKyAgICAgICAgKCJ0NCIsIE5vbmUpLAorICAgICAgICAoInQ0IF9faW5pdF9fIitvcy5leHRzZXArInB5IiwgIiIpLAorICAgICAgICAoInQ0IHN1Yi5weSIsICJyYWlzZSBSdW50aW1lRXJyb3IoJ1Nob3VsZG50IGxvYWQgc3ViLnB5JykiKSwKKyAgICAgICAgKCJ0NCBzdWIiLCBOb25lKSwKKyAgICAgICAgKCJ0NCBzdWIgX19pbml0X18iK29zLmV4dHNlcCsicHkiLCAiIiksCisgICAgICAgICgidDQgc3ViIHN1YnN1YiIrb3MuZXh0c2VwKyJweSIsCisgICAgICAgICAicmFpc2UgUnVudGltZUVycm9yKCdTaG91bGRudCBsb2FkIHN1YnN1Yi5weScpIiksCisgICAgICAgICgidDQgc3ViIHN1YnN1YiIsIE5vbmUpLAorICAgICAgICAoInQ0IHN1YiBzdWJzdWIgX19pbml0X18iK29zLmV4dHNlcCsicHkiLCAic3BhbSA9IDEiKSwKKyAgICAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5ta2hpZXIoaGllcikKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBmcm9tIHQ0LnN1Yi5zdWJzdWIgaW1wb3J0ICoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BhbSwgMSkKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLnJ1bl9jb2RlKHMpCisKKyAgICBkZWYgdGVzdF81KHNlbGYpOgorICAgICAgICBoaWVyID0gWworICAgICAgICAoInQ1IiwgTm9uZSksCisgICAgICAgICgidDUgX19pbml0X18iK29zLmV4dHNlcCsicHkiLCAiaW1wb3J0IHQ1LmZvbyIpLAorICAgICAgICAoInQ1IHN0cmluZyIrb3MuZXh0c2VwKyJweSIsICJzcGFtID0gMSIpLAorICAgICAgICAoInQ1IGZvbyIrb3MuZXh0c2VwKyJweSIsCisgICAgICAgICAiZnJvbSAuIGltcG9ydCBzdHJpbmc7IGFzc2VydCBzdHJpbmcuc3BhbSA9PSAxIiksCisgICAgICAgICBdCisgICAgICAgIHNlbGYubWtoaWVyKGhpZXIpCisKKyAgICAgICAgaW1wb3J0IHQ1CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZyb20gdDUgaW1wb3J0ICoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKCksIFsnZm9vJywgJ3NlbGYnLCAnc3RyaW5nJywgJ3Q1J10pCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ydW5fY29kZShzKQorCisgICAgICAgIGltcG9ydCB0NQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeGRpcihkaXIodDUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ19fZG9jX18nLCAnX19maWxlX18nLCAnX19uYW1lX18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnX19wYWNrYWdlX18nLCAnX19wYXRoX18nLCAnZm9vJywgJ3N0cmluZycsICd0NSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeGRpcihkaXIodDUuZm9vKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydfX2RvY19fJywgJ19fZmlsZV9fJywgJ19fbmFtZV9fJywgJ19fcGFja2FnZV9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeGRpcihkaXIodDUuc3RyaW5nKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydfX2RvY19fJywgJ19fZmlsZV9fJywgJ19fbmFtZV9fJywnX19wYWNrYWdlX18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnc3BhbSddKQorCisgICAgZGVmIHRlc3RfNihzZWxmKToKKyAgICAgICAgaGllciA9IFsKKyAgICAgICAgICAgICAgICAoInQ2IiwgTm9uZSksCisgICAgICAgICAgICAgICAgKCJ0NiBfX2luaXRfXyIrb3MuZXh0c2VwKyJweSIsCisgICAgICAgICAgICAgICAgICJfX2FsbF9fID0gWydzcGFtJywgJ2hhbScsICdlZ2dzJ10iKSwKKyAgICAgICAgICAgICAgICAoInQ2IHNwYW0iK29zLmV4dHNlcCsicHkiLCAiIiksCisgICAgICAgICAgICAgICAgKCJ0NiBoYW0iK29zLmV4dHNlcCsicHkiLCAiIiksCisgICAgICAgICAgICAgICAgKCJ0NiBlZ2dzIitvcy5leHRzZXArInB5IiwgIiIpLAorICAgICAgICAgICAgICAgXQorICAgICAgICBzZWxmLm1raGllcihoaWVyKQorCisgICAgICAgIGltcG9ydCB0NgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeGRpcihkaXIodDYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ19fYWxsX18nLCAnX19kb2NfXycsICdfX2ZpbGVfXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdfX25hbWVfXycsICdfX3BhY2thZ2VfXycsICdfX3BhdGhfXyddKQorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgdDYKKyAgICAgICAgICAgIGZyb20gdDYgaW1wb3J0ICoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZml4ZGlyKGRpcih0NikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ19fYWxsX18nLCAnX19kb2NfXycsICdfX2ZpbGVfXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX19uYW1lX18nLCAnX19wYWNrYWdlX18nLCAnX19wYXRoX18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VnZ3MnLCAnaGFtJywgJ3NwYW0nXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKCksIFsnZWdncycsICdoYW0nLCAnc2VsZicsICdzcGFtJywgJ3Q2J10pCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ydW5fY29kZShzKQorCisgICAgZGVmIHRlc3RfNyhzZWxmKToKKyAgICAgICAgaGllciA9IFsKKyAgICAgICAgICAgICAgICAoInQ3IiwgTm9uZSksCisgICAgICAgICAgICAgICAgKCJ0NyIrb3MuZXh0c2VwKyJweSIsICIiKSwKKyAgICAgICAgICAgICAgICAoInQ3IF9faW5pdF9fIitvcy5leHRzZXArInB5IiwgIiIpLAorICAgICAgICAgICAgICAgICgidDcgc3ViIitvcy5leHRzZXArInB5IiwKKyAgICAgICAgICAgICAgICAgInJhaXNlIFJ1bnRpbWVFcnJvcignU2hvdWxkbnQgbG9hZCBzdWIucHknKSIpLAorICAgICAgICAgICAgICAgICgidDcgc3ViIiwgTm9uZSksCisgICAgICAgICAgICAgICAgKCJ0NyBzdWIgX19pbml0X18iK29zLmV4dHNlcCsicHkiLCAiIiksCisgICAgICAgICAgICAgICAgKCJ0NyBzdWIgIitvcy5leHRzZXArInB5IiwKKyAgICAgICAgICAgICAgICAgInJhaXNlIFJ1bnRpbWVFcnJvcignU2hvdWxkbnQgbG9hZCBzdWJzdWIucHknKSIpLAorICAgICAgICAgICAgICAgICgidDcgc3ViIHN1YnN1YiIsIE5vbmUpLAorICAgICAgICAgICAgICAgICgidDcgc3ViIHN1YnN1YiBfX2luaXRfXyIrb3MuZXh0c2VwKyJweSIsCisgICAgICAgICAgICAgICAgICJzcGFtID0gMSIpLAorICAgICAgICAgICAgICAgXQorICAgICAgICBzZWxmLm1raGllcihoaWVyKQorCisKKyAgICAgICAgdDcsIHN1Yiwgc3Vic3ViID0gTm9uZSwgTm9uZSwgTm9uZQorICAgICAgICBpbXBvcnQgdDcgYXMgdGFzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZml4ZGlyKGRpcih0YXMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ19fZG9jX18nLCAnX19maWxlX18nLCAnX19uYW1lX18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnX19wYWNrYWdlX18nLCAnX19wYXRoX18nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0NykKKyAgICAgICAgZnJvbSB0NyBpbXBvcnQgc3ViIGFzIHN1YnBhcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeGRpcihkaXIoc3VicGFyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydfX2RvY19fJywgJ19fZmlsZV9fJywgJ19fbmFtZV9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fcGFja2FnZV9fJywgJ19fcGF0aF9fJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3ViKQorICAgICAgICBmcm9tIHQ3LnN1YiBpbXBvcnQgc3Vic3ViIGFzIHN1YnN1YnN1YgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeGRpcihkaXIoc3Vic3Vic3ViKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydfX2RvY19fJywgJ19fZmlsZV9fJywgJ19fbmFtZV9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnX19wYWNrYWdlX18nLCAnX19wYXRoX18nLCAnc3BhbSddKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQ3KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHN1YikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzdWJzdWIpCisgICAgICAgIGZyb20gdDcuc3ViLnN1YnN1YiBpbXBvcnQgc3BhbSBhcyBoYW0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW0sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3ViKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHN1YnN1YikKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0Xzgoc2VsZik6CisgICAgICAgIGhpZXIgPSBbCisgICAgICAgICAgICAgICAgKCJ0OCIsIE5vbmUpLAorICAgICAgICAgICAgICAgICgidDggX19pbml0X18iK29zLmV4dHNlcCsicHkiLCAiJ2RvYyBmb3IgdDgnIiksCisgICAgICAgICAgICAgICBdCisgICAgICAgIHNlbGYubWtoaWVyKGhpZXIpCisKKyAgICAgICAgaW1wb3J0IHQ4CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDguX19kb2NfXywgImRvYyBmb3IgdDgiKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2cucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg1M2E3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2cucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjg1M2E3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2dpbXBvcnQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2dpbXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkNDhjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ2ltcG9ydC5weQpAQCAtMCwwICsxLDgzIEBACitpbXBvcnQgb3MsIHN5cywgc3RyaW5nLCByYW5kb20sIHRlbXBmaWxlLCB1bml0dGVzdAorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworY2xhc3MgVGVzdEltcG9ydCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICBzZWxmLnBhY2thZ2VfbmFtZSA9ICdQQUNLQUdFXycKKyAgICAgICAgd2hpbGUgc2VsZi5wYWNrYWdlX25hbWUgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfbmFtZSArPSByYW5kb20uY2hvb3NlKHN0cmluZy5sZXR0ZXJzKQorICAgICAgICBzZWxmLm1vZHVsZV9uYW1lID0gc2VsZi5wYWNrYWdlX25hbWUgKyAnLmZvbycKKyAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCisKKyAgICBkZWYgcmVtb3ZlX21vZHVsZXMoc2VsZik6CisgICAgICAgIGZvciBtb2R1bGVfbmFtZSBpbiAoc2VsZi5wYWNrYWdlX25hbWUsIHNlbGYubW9kdWxlX25hbWUpOgorICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZHVsZV9uYW1lXQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3RfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHN5cy5wYXRoLmFwcGVuZChzZWxmLnRlc3RfZGlyKQorICAgICAgICBzZWxmLnBhY2thZ2VfZGlyID0gb3MucGF0aC5qb2luKHNlbGYudGVzdF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWNrYWdlX25hbWUpCisgICAgICAgIG9zLm1rZGlyKHNlbGYucGFja2FnZV9kaXIpCisgICAgICAgIG9wZW4ob3MucGF0aC5qb2luKAorICAgICAgICAgICAgICAgIHNlbGYucGFja2FnZV9kaXIsICdfX2luaXRfXycrb3MuZXh0c2VwKydweScpLCAndycpLmNsb3NlKCkKKyAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhY2thZ2VfZGlyLCAnZm9vJytvcy5leHRzZXArJ3B5JykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIGZpbGUgaW4gb3MubGlzdGRpcihzZWxmLnBhY2thZ2VfZGlyKToKKyAgICAgICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4oc2VsZi5wYWNrYWdlX2RpciwgZmlsZSkpCisgICAgICAgIG9zLnJtZGlyKHNlbGYucGFja2FnZV9kaXIpCisgICAgICAgIG9zLnJtZGlyKHNlbGYudGVzdF9kaXIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc3lzLnBhdGguY291bnQoc2VsZi50ZXN0X2RpciksIDApCisgICAgICAgIHN5cy5wYXRoLnJlbW92ZShzZWxmLnRlc3RfZGlyKQorICAgICAgICBzZWxmLnJlbW92ZV9tb2R1bGVzKCkKKworICAgIGRlZiByZXdyaXRlX2ZpbGUoc2VsZiwgY29udGVudHMpOgorICAgICAgICBmb3IgZXh0ZW5zaW9uIGluICJjbyI6CisgICAgICAgICAgICBjb21waWxlZF9wYXRoID0gc2VsZi5tb2R1bGVfcGF0aCArIGV4dGVuc2lvbgorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoY29tcGlsZWRfcGF0aCk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGNvbXBpbGVkX3BhdGgpCisgICAgICAgIGYgPSBvcGVuKHNlbGYubW9kdWxlX3BhdGgsICd3JykKKyAgICAgICAgZi53cml0ZShjb250ZW50cykKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9wYWNrYWdlX2ltcG9ydF9fc2VtYW50aWNzKHNlbGYpOgorCisgICAgICAgICMgR2VuZXJhdGUgYSBjb3VwbGUgb2YgYnJva2VuIG1vZHVsZXMgdG8gdHJ5IGltcG9ydGluZy4KKworICAgICAgICAjIC4uLnRyeSBsb2FkaW5nIHRoZSBtb2R1bGUgd2hlbiB0aGVyZSdzIGEgU3ludGF4RXJyb3IKKyAgICAgICAgc2VsZi5yZXdyaXRlX2ZpbGUoJ2ZvcicpCisgICAgICAgIHRyeTogX19pbXBvcnRfXyhzZWxmLm1vZHVsZV9uYW1lKQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogcmFpc2UgUnVudGltZUVycm9yLCAnRmFpbGVkIHRvIGluZHVjZSBTeW50YXhFcnJvcicKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihzZWxmLm1vZHVsZV9uYW1lLCBzeXMubW9kdWxlcykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHN5cy5tb2R1bGVzW3NlbGYucGFja2FnZV9uYW1lXSwgJ2ZvbycpKQorCisgICAgICAgICMgLi4ubWFrZSB1cCBhIHZhcmlhYmxlIG5hbWUgdGhhdCBpc24ndCBib3VuZCBpbiBfX2J1aWx0aW5zX18KKyAgICAgICAgdmFyID0gJ2EnCisgICAgICAgIHdoaWxlIHZhciBpbiBkaXIoX19idWlsdGluc19fKToKKyAgICAgICAgICAgIHZhciArPSByYW5kb20uY2hvb3NlKHN0cmluZy5sZXR0ZXJzKQorCisgICAgICAgICMgLi4ubWFrZSBhIG1vZHVsZSB0aGF0IGp1c3QgY29udGFpbnMgdGhhdAorICAgICAgICBzZWxmLnJld3JpdGVfZmlsZSh2YXIpCisKKyAgICAgICAgdHJ5OiBfX2ltcG9ydF9fKHNlbGYubW9kdWxlX25hbWUpCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogcmFpc2UgUnVudGltZUVycm9yLCAnRmFpbGVkIHRvIGluZHVjZSBOYW1lRXJyb3IuJworCisgICAgICAgICMgLi4ubm93ICBjaGFuZ2UgIHRoZSBtb2R1bGUgIHNvICB0aGF0ICB0aGUgTmFtZUVycm9yICBkb2Vzbid0CisgICAgICAgICMgaGFwcGVuCisgICAgICAgIHNlbGYucmV3cml0ZV9maWxlKCclcyA9IDEnICUgdmFyKQorICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKHNlbGYubW9kdWxlX25hbWUpLmZvbworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIobW9kdWxlLCB2YXIpLCAxKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdEltcG9ydCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2dpbXBvcnQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2VhYzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2dpbXBvcnQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2VhYzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2d1dGlsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtndXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjY1ZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtndXRpbC5weQpAQCAtMCwwICsxLDE0MSBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBpbXAKK2ltcG9ydCBwa2d1dGlsCitpbXBvcnQgb3MKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCB6aXBmaWxlCisKKworCitjbGFzcyBQa2d1dGlsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmRpcm5hbWUgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNodXRpbC5ybXRyZWUsIHNlbGYuZGlybmFtZSkKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNlbGYuZGlybmFtZSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisKKyAgICBkZWYgdGVzdF9nZXRkYXRhX2ZpbGVzeXMoc2VsZik6CisgICAgICAgIHBrZyA9ICd0ZXN0X2dldGRhdGFfZmlsZXN5cycKKworICAgICAgICAjIEluY2x1ZGUgYSBMRiBhbmQgYSBDUkxGLCB0byB0ZXN0IHRoYXQgYmluYXJ5IGRhdGEgaXMgcmVhZCBiYWNrCisgICAgICAgIFJFU09VUkNFX0RBVEEgPSAnSGVsbG8sIHdvcmxkIVxuU2Vjb25kIGxpbmVcclxuVGhpcmQgbGluZScKKworICAgICAgICAjIE1ha2UgYSBwYWNrYWdlIHdpdGggc29tZSByZXNvdXJjZXMKKyAgICAgICAgcGFja2FnZV9kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBwa2cpCisgICAgICAgIG9zLm1rZGlyKHBhY2thZ2VfZGlyKQorICAgICAgICAjIEVtcHR5IGluaXQucHkKKyAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHBhY2thZ2VfZGlyLCAnX19pbml0X18ucHknKSwgIndiIikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICMgUmVzb3VyY2UgZmlsZXMsIHJlcy50eHQsIHN1Yi9yZXMudHh0CisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihwYWNrYWdlX2RpciwgJ3Jlcy50eHQnKSwgIndiIikKKyAgICAgICAgZi53cml0ZShSRVNPVVJDRV9EQVRBKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKHBhY2thZ2VfZGlyLCAnc3ViJykpCisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihwYWNrYWdlX2RpciwgJ3N1YicsICdyZXMudHh0JyksICJ3YiIpCisgICAgICAgIGYud3JpdGUoUkVTT1VSQ0VfREFUQSkKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgIyBDaGVjayB3ZSBjYW4gcmVhZCB0aGUgcmVzb3VyY2VzCisgICAgICAgIHJlczEgPSBwa2d1dGlsLmdldF9kYXRhKHBrZywgJ3Jlcy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlczEsIFJFU09VUkNFX0RBVEEpCisgICAgICAgIHJlczIgPSBwa2d1dGlsLmdldF9kYXRhKHBrZywgJ3N1Yi9yZXMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMyLCBSRVNPVVJDRV9EQVRBKQorCisgICAgICAgIGRlbCBzeXMubW9kdWxlc1twa2ddCisKKyAgICBkZWYgdGVzdF9nZXRkYXRhX3ppcGZpbGUoc2VsZik6CisgICAgICAgIHppcCA9ICd0ZXN0X2dldGRhdGFfemlwZmlsZS56aXAnCisgICAgICAgIHBrZyA9ICd0ZXN0X2dldGRhdGFfemlwZmlsZScKKworICAgICAgICAjIEluY2x1ZGUgYSBMRiBhbmQgYSBDUkxGLCB0byB0ZXN0IHRoYXQgYmluYXJ5IGRhdGEgaXMgcmVhZCBiYWNrCisgICAgICAgIFJFU09VUkNFX0RBVEEgPSAnSGVsbG8sIHdvcmxkIVxuU2Vjb25kIGxpbmVcclxuVGhpcmQgbGluZScKKworICAgICAgICAjIE1ha2UgYSBwYWNrYWdlIHdpdGggc29tZSByZXNvdXJjZXMKKyAgICAgICAgemlwX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCB6aXApCisgICAgICAgIHogPSB6aXBmaWxlLlppcEZpbGUoemlwX2ZpbGUsICd3JykKKworICAgICAgICAjIEVtcHR5IGluaXQucHkKKyAgICAgICAgei53cml0ZXN0cihwa2cgKyAnL19faW5pdF9fLnB5JywgIiIpCisgICAgICAgICMgUmVzb3VyY2UgZmlsZXMsIHJlcy50eHQsIHN1Yi9yZXMudHh0CisgICAgICAgIHoud3JpdGVzdHIocGtnICsgJy9yZXMudHh0JywgUkVTT1VSQ0VfREFUQSkKKyAgICAgICAgei53cml0ZXN0cihwa2cgKyAnL3N1Yi9yZXMudHh0JywgUkVTT1VSQ0VfREFUQSkKKyAgICAgICAgei5jbG9zZSgpCisKKyAgICAgICAgIyBDaGVjayB3ZSBjYW4gcmVhZCB0aGUgcmVzb3VyY2VzCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCB6aXBfZmlsZSkKKyAgICAgICAgcmVzMSA9IHBrZ3V0aWwuZ2V0X2RhdGEocGtnLCAncmVzLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzMSwgUkVTT1VSQ0VfREFUQSkKKyAgICAgICAgcmVzMiA9IHBrZ3V0aWwuZ2V0X2RhdGEocGtnLCAnc3ViL3Jlcy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlczIsIFJFU09VUkNFX0RBVEEpCisgICAgICAgIGRlbCBzeXMucGF0aFswXQorCisgICAgICAgIGRlbCBzeXMubW9kdWxlc1twa2ddCisKKyAgICBkZWYgdGVzdF91bnJlYWRhYmxlX2Rpcl9vbl9zeXNwYXRoKHNlbGYpOgorICAgICAgICAjIGlzc3VlNzM2NyAtIHdhbGtfcGFja2FnZXMgZmFpbGVkIGlmIHVucmVhZGFibGUgZGlyIG9uIHN5cy5wYXRoCisgICAgICAgIHBhY2thZ2VfbmFtZSA9ICJ1bnJlYWRhYmxlX3BhY2thZ2UiCisgICAgICAgIGQgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJuYW1lLCBwYWNrYWdlX25hbWUpCisgICAgICAgICMgdGhpcyBkb2VzIG5vdCBhcHBlYXIgdG8gY3JlYXRlIGFuIHVucmVhZGFibGUgZGlyIG9uIFdpbmRvd3MKKyAgICAgICAgIyAgIGJ1dCB0aGUgdGVzdCBzaG91bGQgbm90IGZhaWwgYW55d2F5CisgICAgICAgIG9zLm1rZGlyKGQsIDApCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5ybWRpciwgZCkKKyAgICAgICAgZm9yIHQgaW4gcGtndXRpbC53YWxrX3BhY2thZ2VzKHBhdGg9W3NlbGYuZGlybmFtZV0pOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmV4cGVjdGVkIHBhY2thZ2UgZm91bmQiKQorCitjbGFzcyBQa2d1dGlsUEVQMzAyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgY2xhc3MgTXlUZXN0TG9hZGVyKG9iamVjdCk6CisgICAgICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgICAgICAjIENyZWF0ZSBhbiBlbXB0eSBtb2R1bGUKKyAgICAgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzLnNldGRlZmF1bHQoZnVsbG5hbWUsIGltcC5uZXdfbW9kdWxlKGZ1bGxuYW1lKSkKKyAgICAgICAgICAgIG1vZC5fX2ZpbGVfXyA9ICI8JXM+IiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgICAgICBtb2QuX19sb2FkZXJfXyA9IHNlbGYKKyAgICAgICAgICAgICMgTWFrZSBpdCBhIHBhY2thZ2UKKyAgICAgICAgICAgIG1vZC5fX3BhdGhfXyA9IFtdCisgICAgICAgICAgICAjIENvdW50IGhvdyBtYW55IHRpbWVzIHRoZSBtb2R1bGUgaXMgcmVsb2FkZWQKKyAgICAgICAgICAgIG1vZC5fX2RpY3RfX1snbG9hZHMnXSA9IG1vZC5fX2RpY3RfXy5nZXQoJ2xvYWRzJywwKSArIDEKKyAgICAgICAgICAgIHJldHVybiBtb2QKKworICAgICAgICBkZWYgZ2V0X2RhdGEoc2VsZiwgcGF0aCk6CisgICAgICAgICAgICByZXR1cm4gIkhlbGxvLCB3b3JsZCEiCisKKyAgICBjbGFzcyBNeVRlc3RJbXBvcnRlcihvYmplY3QpOgorICAgICAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CisgICAgICAgICAgICByZXR1cm4gUGtndXRpbFBFUDMwMlRlc3RzLk15VGVzdExvYWRlcigpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN5cy5tZXRhX3BhdGguaW5zZXJ0KDAsIHNlbGYuTXlUZXN0SW1wb3J0ZXIoKSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZGVsIHN5cy5tZXRhX3BhdGhbMF0KKworICAgIGRlZiB0ZXN0X2dldGRhdGFfcGVwMzAyKHNlbGYpOgorICAgICAgICAjIFVzZSBhIGR1bW15IGltcG9ydGVyL2xvYWRlcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBrZ3V0aWwuZ2V0X2RhdGEoJ2ZvbycsICdkdW1teScpLCAiSGVsbG8sIHdvcmxkISIpCisgICAgICAgIGRlbCBzeXMubW9kdWxlc1snZm9vJ10KKworICAgIGRlZiB0ZXN0X2FscmVhZHlsb2FkZWQoc2VsZik6CisgICAgICAgICMgRW5zdXJlIHRoYXQgZ2V0X2RhdGEgd29ya3Mgd2l0aG91dCByZWxvYWRpbmcgLSB0aGUgImxvYWRzIiBtb2R1bGUKKyAgICAgICAgIyB2YXJpYWJsZSBpbiB0aGUgZXhhbXBsZSBsb2FkZXIgc2hvdWxkIGNvdW50IGhvdyBtYW55IHRpbWVzIGEgcmVsb2FkCisgICAgICAgICMgb2NjdXJzLgorICAgICAgICBpbXBvcnQgZm9vCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLmxvYWRzLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBrZ3V0aWwuZ2V0X2RhdGEoJ2ZvbycsICdkdW1teScpLCAiSGVsbG8sIHdvcmxkISIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLmxvYWRzLCAxKQorICAgICAgICBkZWwgc3lzLm1vZHVsZXNbJ2ZvbyddCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoUGtndXRpbFRlc3RzLCBQa2d1dGlsUEVQMzAyVGVzdHMpCisgICAgIyB0aGlzIGlzIG5lY2Vzc2FyeSBpZiB0ZXN0IGlzIHJ1biByZXBlYXRlZCAobGlrZSB3aGVuIGZpbmRpbmcgbGVha3MpCisgICAgaW1wb3J0IHppcGltcG9ydAorICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jbGVhcigpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ3V0aWwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtndXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2MTRmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ3V0aWwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtndXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2MTRmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsYXRmb3JtLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxhdGZvcm0ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxZDQyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsYXRmb3JtLnB5CkBAIC0wLDAgKzEsMjU0IEBACitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgc3VicHJvY2VzcworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBQbGF0Zm9ybVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2FyY2hpdGVjdHVyZShzZWxmKToKKyAgICAgICAgcmVzID0gcGxhdGZvcm0uYXJjaGl0ZWN0dXJlKCkKKworICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIik6CisgICAgICAgIGRlZiB0ZXN0X2FyY2hpdGVjdHVyZV92aWFfc3ltbGluayhzZWxmKTogIyBpc3N1ZTM3NjIKKyAgICAgICAgICAgIGRlZiBnZXQocHl0aG9uKToKKyAgICAgICAgICAgICAgICBjbWQgPSBbcHl0aG9uLCAnLWMnLAorICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHBsYXRmb3JtOyBwcmludCBwbGF0Zm9ybS5hcmNoaXRlY3R1cmUoKSddCisgICAgICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAgICAgICAgIHJldHVybiBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgICAgIHJlYWwgPSBvcy5wYXRoLnJlYWxwYXRoKHN5cy5leGVjdXRhYmxlKQorICAgICAgICAgICAgbGluayA9IG9zLnBhdGguYWJzcGF0aCh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgb3Muc3ltbGluayhyZWFsLCBsaW5rKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0KHJlYWwpLCBnZXQobGluaykpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShsaW5rKQorCisgICAgZGVmIHRlc3RfcGxhdGZvcm0oc2VsZik6CisgICAgICAgIGZvciBhbGlhc2VkIGluIChGYWxzZSwgVHJ1ZSk6CisgICAgICAgICAgICBmb3IgdGVyc2UgaW4gKEZhbHNlLCBUcnVlKToKKyAgICAgICAgICAgICAgICByZXMgPSBwbGF0Zm9ybS5wbGF0Zm9ybShhbGlhc2VkLCB0ZXJzZSkKKworICAgIGRlZiB0ZXN0X3N5c3RlbShzZWxmKToKKyAgICAgICAgcmVzID0gcGxhdGZvcm0uc3lzdGVtKCkKKworICAgIGRlZiB0ZXN0X25vZGUoc2VsZik6CisgICAgICAgIHJlcyA9IHBsYXRmb3JtLm5vZGUoKQorCisgICAgZGVmIHRlc3RfcmVsZWFzZShzZWxmKToKKyAgICAgICAgcmVzID0gcGxhdGZvcm0ucmVsZWFzZSgpCisKKyAgICBkZWYgdGVzdF92ZXJzaW9uKHNlbGYpOgorICAgICAgICByZXMgPSBwbGF0Zm9ybS52ZXJzaW9uKCkKKworICAgIGRlZiB0ZXN0X21hY2hpbmUoc2VsZik6CisgICAgICAgIHJlcyA9IHBsYXRmb3JtLm1hY2hpbmUoKQorCisgICAgZGVmIHRlc3RfcHJvY2Vzc29yKHNlbGYpOgorICAgICAgICByZXMgPSBwbGF0Zm9ybS5wcm9jZXNzb3IoKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNhdmVfdmVyc2lvbiA9IHN5cy52ZXJzaW9uCisgICAgICAgIHNlbGYuc2F2ZV9zdWJ2ZXJzaW9uID0gc3lzLnN1YnZlcnNpb24KKyAgICAgICAgc2VsZi5zYXZlX3BsYXRmb3JtID0gc3lzLnBsYXRmb3JtCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy52ZXJzaW9uID0gc2VsZi5zYXZlX3ZlcnNpb24KKyAgICAgICAgc3lzLnN1YnZlcnNpb24gPSBzZWxmLnNhdmVfc3VidmVyc2lvbgorICAgICAgICBzeXMucGxhdGZvcm0gPSBzZWxmLnNhdmVfcGxhdGZvcm0KKworICAgIGRlZiB0ZXN0X3N5c192ZXJzaW9uKHNlbGYpOgorICAgICAgICAjIE9sZCB0ZXN0LgorICAgICAgICBmb3IgaW5wdXQsIG91dHB1dCBpbiAoCisgICAgICAgICAgICAoJzIuNC4zICgjMSwgSnVuIDIxIDIwMDYsIDEzOjU0OjIxKSBcbltHQ0MgMy4zLjQgKHByZSAzLjMuNSAyMDA0MDgwOSldJywKKyAgICAgICAgICAgICAoJ0NQeXRob24nLCAnMi40LjMnLCAnJywgJycsICcxJywgJ0p1biAyMSAyMDA2IDEzOjU0OjIxJywgJ0dDQyAzLjMuNCAocHJlIDMuMy41IDIwMDQwODA5KScpKSwKKyAgICAgICAgICAgICgnSXJvblB5dGhvbiAxLjAuNjA4MTYgb24gLk5FVCAyLjAuNTA3MjcuNDInLAorICAgICAgICAgICAgICgnSXJvblB5dGhvbicsICcxLjAuNjA4MTYnLCAnJywgJycsICcnLCAnJywgJy5ORVQgMi4wLjUwNzI3LjQyJykpLAorICAgICAgICAgICAgKCdJcm9uUHl0aG9uIDEuMCAoMS4wLjYxMDA1LjE5NzcpIG9uIC5ORVQgMi4wLjUwNzI3LjQyJywKKyAgICAgICAgICAgICAoJ0lyb25QeXRob24nLCAnMS4wLjAnLCAnJywgJycsICcnLCAnJywgJy5ORVQgMi4wLjUwNzI3LjQyJykpLAorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICMgYnJhbmNoIGFuZCByZXZpc2lvbiBhcmUgbm90ICJwYXJzZWQiLCBidXQgZmV0Y2hlZAorICAgICAgICAgICAgIyBmcm9tIHN5cy5zdWJ2ZXJzaW9uLiAgSWdub3JlIHRoZW0KKyAgICAgICAgICAgIChuYW1lLCB2ZXJzaW9uLCBicmFuY2gsIHJldmlzaW9uLCBidWlsZG5vLCBidWlsZGRhdGUsIGNvbXBpbGVyKSBcCisgICAgICAgICAgICAgICAgICAgPSBwbGF0Zm9ybS5fc3lzX3ZlcnNpb24oaW5wdXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIChuYW1lLCB2ZXJzaW9uLCAnJywgJycsIGJ1aWxkbm8sIGJ1aWxkZGF0ZSwgY29tcGlsZXIpLCBvdXRwdXQpCisKKyAgICAgICAgIyBUZXN0cyBmb3IgcHl0aG9uX2ltcGxlbWVudGF0aW9uKCksIHB5dGhvbl92ZXJzaW9uKCksIHB5dGhvbl9icmFuY2goKSwKKyAgICAgICAgIyBweXRob25fcmV2aXNpb24oKSwgcHl0aG9uX2J1aWxkKCksIGFuZCBweXRob25fY29tcGlsZXIoKS4KKyAgICAgICAgc3lzX3ZlcnNpb25zID0geworICAgICAgICAgICAgKCIyLjYuMSAocjI2MTo2NzUxNSwgRGVjICA2IDIwMDgsIDE1OjI2OjAwKSBcbltHQ0MgNC4wLjEgKEFwcGxlIENvbXB1dGVyLCBJbmMuIGJ1aWxkIDUzNzApXSIsCisgICAgICAgICAgICAgKCdDUHl0aG9uJywgJ3RhZ3MvcjI2MScsICc2NzUxNScpLCBzZWxmLnNhdmVfcGxhdGZvcm0pCisgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgKCJDUHl0aG9uIiwgIjIuNi4xIiwgInRhZ3MvcjI2MSIsICI2NzUxNSIsCisgICAgICAgICAgICAgICAgICgncjI2MTo2NzUxNScsICdEZWMgIDYgMjAwOCAxNToyNjowMCcpLAorICAgICAgICAgICAgICAgICAnR0NDIDQuMC4xIChBcHBsZSBDb21wdXRlciwgSW5jLiBidWlsZCA1MzcwKScpLAorICAgICAgICAgICAgKCJJcm9uUHl0aG9uIDIuMCAoMi4wLjAuMCkgb24gLk5FVCAyLjAuNTA3MjcuMzA1MyIsIE5vbmUsICJjbGkiKQorICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICgiSXJvblB5dGhvbiIsICIyLjAuMCIsICIiLCAiIiwgKCIiLCAiIiksCisgICAgICAgICAgICAgICAgICIuTkVUIDIuMC41MDcyNy4zMDUzIiksCisgICAgICAgICAgICAoIjIuNSAodHJ1bms6NjEwNywgTWFyIDI2IDIwMDksIDEzOjAyOjE4KSBcbltKYXZhIEhvdFNwb3QoVE0pIENsaWVudCBWTSAoXCJBcHBsZSBDb21wdXRlciwgSW5jLlwiKV0iLAorICAgICAgICAgICAgKCdKeXRob24nLCAndHJ1bmsnLCAnNjEwNycpLCAiamF2YTEuNS4wXzE2IikKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAoIkp5dGhvbiIsICIyLjUuMCIsICJ0cnVuayIsICI2MTA3IiwKKyAgICAgICAgICAgICAgICAgKCd0cnVuazo2MTA3JywgJ01hciAyNiAyMDA5JyksICJqYXZhMS41LjBfMTYiKSwKKyAgICAgICAgICAgICgiMi41LjIgKDYzMzc4LCBNYXIgMjYgMjAwOSwgMTg6MDM6MjkpXG5bUHlQeSAxLjAuMF0iLAorICAgICAgICAgICAgICgnUHlQeScsICd0cnVuaycsICc2MzM3OCcpLCBzZWxmLnNhdmVfcGxhdGZvcm0pCisgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgKCJQeVB5IiwgIjIuNS4yIiwgInRydW5rIiwgIjYzMzc4IiwgKCc2MzM3OCcsICdNYXIgMjYgMjAwOScpLAorICAgICAgICAgICAgICAgICAiIikKKyAgICAgICAgICAgIH0KKyAgICAgICAgZm9yICh2ZXJzaW9uX3RhZywgc3VidmVyc2lvbiwgc3lzX3BsYXRmb3JtKSwgaW5mbyBpbiBcCisgICAgICAgICAgICAgICAgc3lzX3ZlcnNpb25zLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc3lzLnZlcnNpb24gPSB2ZXJzaW9uX3RhZworICAgICAgICAgICAgaWYgc3VidmVyc2lvbiBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoc3lzLCAic3VidmVyc2lvbiIpOgorICAgICAgICAgICAgICAgICAgICBkZWwgc3lzLnN1YnZlcnNpb24KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3lzLnN1YnZlcnNpb24gPSBzdWJ2ZXJzaW9uCisgICAgICAgICAgICBpZiBzeXNfcGxhdGZvcm0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc3lzLnBsYXRmb3JtID0gc3lzX3BsYXRmb3JtCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLCBpbmZvWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGF0Zm9ybS5weXRob25fdmVyc2lvbigpLCBpbmZvWzFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGF0Zm9ybS5weXRob25fYnJhbmNoKCksIGluZm9bMl0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsYXRmb3JtLnB5dGhvbl9yZXZpc2lvbigpLCBpbmZvWzNdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGF0Zm9ybS5weXRob25fYnVpbGQoKSwgaW5mb1s0XSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhdGZvcm0ucHl0aG9uX2NvbXBpbGVyKCksIGluZm9bNV0pCisKKyAgICBkZWYgdGVzdF9zeXN0ZW1fYWxpYXMoc2VsZik6CisgICAgICAgIHJlcyA9IHBsYXRmb3JtLnN5c3RlbV9hbGlhcygKKyAgICAgICAgICAgIHBsYXRmb3JtLnN5c3RlbSgpLAorICAgICAgICAgICAgcGxhdGZvcm0ucmVsZWFzZSgpLAorICAgICAgICAgICAgcGxhdGZvcm0udmVyc2lvbigpLAorICAgICAgICApCisKKyAgICBkZWYgdGVzdF91bmFtZShzZWxmKToKKyAgICAgICAgcmVzID0gcGxhdGZvcm0udW5hbWUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYW55KHJlcykpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyksICJ3aW5kb3dzIG9ubHkgdGVzdCIpCisgICAgZGVmIHRlc3RfdW5hbWVfd2luMzJfQVJDSElURVc2NDMyKHNlbGYpOgorICAgICAgICAjIElzc3VlIDc4NjA6IG1ha2Ugc3VyZSB3ZSBnZXQgYXJjaGl0ZWN0dXJlIGZyb20gdGhlIGNvcnJlY3QgdmFyaWFibGUKKyAgICAgICAgIyBvbiA2NCBiaXQgV2luZG93czogaWYgUFJPQ0VTU09SX0FSQ0hJVEVXNjQzMiBleGlzdHMgd2Ugc2hvdWxkIGJlCisgICAgICAgICMgdXNpbmcgaXQsIHBlcgorICAgICAgICAjIGh0dHA6Ly9ibG9ncy5tc2RuLmNvbS9kYXZpZC53YW5nL2FyY2hpdmUvMjAwNi8wMy8yNi9IT1dUTy1EZXRlY3QtUHJvY2Vzcy1CaXRuZXNzLmFzcHgKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudmlyb246CisgICAgICAgICAgICAgICAgaWYgJ1BST0NFU1NPUl9BUkNISVRFVzY0MzInIGluIGVudmlyb246CisgICAgICAgICAgICAgICAgICAgIGRlbCBlbnZpcm9uWydQUk9DRVNTT1JfQVJDSElURVc2NDMyJ10KKyAgICAgICAgICAgICAgICBlbnZpcm9uWydQUk9DRVNTT1JfQVJDSElURUNUVVJFJ10gPSAnZm9vJworICAgICAgICAgICAgICAgIHBsYXRmb3JtLl91bmFtZV9jYWNoZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBzeXN0ZW0sIG5vZGUsIHJlbGVhc2UsIHZlcnNpb24sIG1hY2hpbmUsIHByb2Nlc3NvciA9IHBsYXRmb3JtLnVuYW1lKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hY2hpbmUsICdmb28nKQorICAgICAgICAgICAgICAgIGVudmlyb25bJ1BST0NFU1NPUl9BUkNISVRFVzY0MzInXSA9ICdiYXInCisgICAgICAgICAgICAgICAgcGxhdGZvcm0uX3VuYW1lX2NhY2hlID0gTm9uZQorICAgICAgICAgICAgICAgIHN5c3RlbSwgbm9kZSwgcmVsZWFzZSwgdmVyc2lvbiwgbWFjaGluZSwgcHJvY2Vzc29yID0gcGxhdGZvcm0udW5hbWUoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFjaGluZSwgJ2JhcicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBwbGF0Zm9ybS5fdW5hbWVfY2FjaGUgPSBOb25lCisKKyAgICBkZWYgdGVzdF9qYXZhX3ZlcihzZWxmKToKKyAgICAgICAgcmVzID0gcGxhdGZvcm0uamF2YV92ZXIoKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2phdmEnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChyZXMpKQorCisgICAgZGVmIHRlc3Rfd2luMzJfdmVyKHNlbGYpOgorICAgICAgICByZXMgPSBwbGF0Zm9ybS53aW4zMl92ZXIoKQorCisgICAgZGVmIHRlc3RfbWFjX3ZlcihzZWxmKToKKyAgICAgICAgcmVzID0gcGxhdGZvcm0ubWFjX3ZlcigpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGdlc3RhbHQKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaGF2ZV90b29sYm94X2dsdWUgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGF2ZV90b29sYm94X2dsdWUgPSBUcnVlCisKKyAgICAgICAgaWYgaGF2ZV90b29sYm94X2dsdWUgYW5kIHBsYXRmb3JtLnVuYW1lKClbMF0gPT0gJ0Rhcndpbic6CisgICAgICAgICAgICAjIFdlJ3JlIG9uIGEgTWFjT1NYIHN5c3RlbSwgY2hlY2sgdGhhdAorICAgICAgICAgICAgIyB0aGUgcmlnaHQgdmVyc2lvbiBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZAorICAgICAgICAgICAgZmQgPSBvcy5wb3Blbignc3dfdmVycycsICdyJykKKyAgICAgICAgICAgIHJlYWxfdmVyID0gTm9uZQorICAgICAgICAgICAgZm9yIGxuIGluIGZkOgorICAgICAgICAgICAgICAgIGlmIGxuLnN0YXJ0c3dpdGgoJ1Byb2R1Y3RWZXJzaW9uOicpOgorICAgICAgICAgICAgICAgICAgICByZWFsX3ZlciA9IGxuLnN0cmlwKCkuc3BsaXQoKVstMV0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGZkLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVhbF92ZXIgaXMgTm9uZSkKKyAgICAgICAgICAgIHJlc3VsdF9saXN0ID0gcmVzWzBdLnNwbGl0KCcuJykKKyAgICAgICAgICAgIGV4cGVjdF9saXN0ID0gcmVhbF92ZXIuc3BsaXQoJy4nKQorICAgICAgICAgICAgbGVuX2RpZmYgPSBsZW4ocmVzdWx0X2xpc3QpIC0gbGVuKGV4cGVjdF9saXN0KQorICAgICAgICAgICAgIyBPbiBTbm93IExlb3BhcmQsIHN3X3ZlcnMgcmVwb3J0cyAxMC42LjAgYXMgMTAuNgorICAgICAgICAgICAgaWYgbGVuX2RpZmYgPiAwOgorICAgICAgICAgICAgICAgIGV4cGVjdF9saXN0LmV4dGVuZChbJzAnXSAqIGxlbl9kaWZmKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRfbGlzdCwgZXhwZWN0X2xpc3QpCisKKyAgICAgICAgICAgICMgcmVzWzFdIGNsYWltcyB0byBjb250YWluCisgICAgICAgICAgICAjICh2ZXJzaW9uLCBkZXZfc3RhZ2UsIG5vbl9yZWxlYXNlX3ZlcnNpb24pCisgICAgICAgICAgICAjIFRoYXQgaW5mb3JtYXRpb24gaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMV0sICgnJywgJycsICcnKSkKKworICAgICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAnbGl0dGxlJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJlc1syXSwgKCdpMzg2JywgJ3g4Nl82NCcpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1syXSwgJ1Bvd2VyUEMnKQorCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicsICJPU1ggb25seSB0ZXN0IikKKyAgICBkZWYgdGVzdF9tYWNfdmVyX3dpdGhfZm9yayhzZWxmKToKKyAgICAgICAgIyBJc3N1ZTc4OTU6IHBsYXRmb3JtLm1hY192ZXIoKSBjcmFzaGVzIHdoZW4gdXNpbmcgZm9yayB3aXRob3V0IGV4ZWMKKyAgICAgICAgIworICAgICAgICAjIFRoaXMgdGVzdCBjaGVja3MgdGhhdCB0aGUgZml4IGZvciB0aGF0IGlzc3VlIHdvcmtzLgorICAgICAgICAjCisgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICBpZiBwaWQgPT0gMDoKKyAgICAgICAgICAgICMgY2hpbGQKKyAgICAgICAgICAgIGluZm8gPSBwbGF0Zm9ybS5tYWNfdmVyKCkKKyAgICAgICAgICAgIG9zLl9leGl0KDApCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgcGFyZW50CisgICAgICAgICAgICBjcGlkLCBzdHMgPSBvcy53YWl0cGlkKHBpZCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3BpZCwgcGlkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHMsIDApCisKKyAgICBkZWYgdGVzdF9kaXN0KHNlbGYpOgorICAgICAgICByZXMgPSBwbGF0Zm9ybS5kaXN0KCkKKworICAgIGRlZiB0ZXN0X2xpYmNfdmVyKHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzeXMuZXhlY3V0YWJsZSkgYW5kIFwKKyAgICAgICAgICAgb3MucGF0aC5leGlzdHMoc3lzLmV4ZWN1dGFibGUrJy5leGUnKToKKyAgICAgICAgICAgICMgQ3lnd2luIGhvcnJvcgorICAgICAgICAgICAgZXhlY3V0YWJsZSA9IHN5cy5leGVjdXRhYmxlICsgJy5leGUnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleGVjdXRhYmxlID0gc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgcmVzID0gcGxhdGZvcm0ubGliY192ZXIoZXhlY3V0YWJsZSkKKworICAgIGRlZiB0ZXN0X3BhcnNlX3JlbGVhc2VfZmlsZShzZWxmKToKKworICAgICAgICBmb3IgaW5wdXQsIG91dHB1dCBpbiAoCisgICAgICAgICAgICAjIEV4YW1wbGVzIG9mIHJlbGVhc2UgZmlsZSBjb250ZW50czoKKyAgICAgICAgICAgICgnU3VTRSBMaW51eCA5LjMgKHg4Ni02NCknLCAoJ1N1U0UgTGludXggJywgJzkuMycsICd4ODYtNjQnKSksCisgICAgICAgICAgICAoJ1NVU0UgTElOVVggMTAuMSAoWDg2LTY0KScsICgnU1VTRSBMSU5VWCAnLCAnMTAuMScsICdYODYtNjQnKSksCisgICAgICAgICAgICAoJ1NVU0UgTElOVVggMTAuMSAoaTU4NiknLCAoJ1NVU0UgTElOVVggJywgJzEwLjEnLCAnaTU4NicpKSwKKyAgICAgICAgICAgICgnRmVkb3JhIENvcmUgcmVsZWFzZSA1IChCb3JkZWF1eCknLCAoJ0ZlZG9yYSBDb3JlJywgJzUnLCAnQm9yZGVhdXgnKSksCisgICAgICAgICAgICAoJ1JlZCBIYXQgTGludXggcmVsZWFzZSA4LjAgKFBzeWNoZSknLCAoJ1JlZCBIYXQgTGludXgnLCAnOC4wJywgJ1BzeWNoZScpKSwKKyAgICAgICAgICAgICgnUmVkIEhhdCBMaW51eCByZWxlYXNlIDkgKFNocmlrZSknLCAoJ1JlZCBIYXQgTGludXgnLCAnOScsICdTaHJpa2UnKSksCisgICAgICAgICAgICAoJ1JlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCByZWxlYXNlIDQgKE5haGFudCknLCAoJ1JlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCcsICc0JywgJ05haGFudCcpKSwKKyAgICAgICAgICAgICgnQ2VudE9TIHJlbGVhc2UgNCcsICgnQ2VudE9TJywgJzQnLCBOb25lKSksCisgICAgICAgICAgICAoJ1JvY2tzIHJlbGVhc2UgNC4yLjEgKEN5ZG9uaWEpJywgKCdSb2NrcycsICc0LjIuMScsICdDeWRvbmlhJykpLAorICAgICAgICAgICAgKCcnLCAoJycsICcnLCAnJykpLCAjIElmIHRoZXJlJ3Mgbm90aGluZyB0aGVyZS4KKyAgICAgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsYXRmb3JtLl9wYXJzZV9yZWxlYXNlX2ZpbGUoaW5wdXQpLCBvdXRwdXQpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFBsYXRmb3JtVGVzdAorICAgICkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxhdGZvcm0ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxhdGZvcm0ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYWU5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wbGF0Zm9ybS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxhdGZvcm0ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxhdGZvcm0ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYWU5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wbGF0Zm9ybS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxpc3RsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wbGlzdGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODU5YWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxpc3RsaWIucHkKQEAgLTAsMCArMSwyMDQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAzIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHBsaXN0bGliCitpbXBvcnQgb3MKK2ltcG9ydCBkYXRldGltZQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCisjIFRoaXMgdGVzdCBkYXRhIHdhcyBnZW5lcmF0ZWQgdGhyb3VnaCBDb2NvYSdzIE5TRGljdGlvbmFyeSBjbGFzcworVEVTVERBVEEgPSAiIiI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiBcCisiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Cis8cGxpc3QgdmVyc2lvbj0iMS4wIj4KKzxkaWN0PgorICAgICAgICA8a2V5PmFEYXRlPC9rZXk+CisgICAgICAgIDxkYXRlPjIwMDQtMTAtMjZUMTA6MzM6MzNaPC9kYXRlPgorICAgICAgICA8a2V5PmFEaWN0PC9rZXk+CisgICAgICAgIDxkaWN0PgorICAgICAgICAgICAgICAgIDxrZXk+YUZhbHNlVmFsdWU8L2tleT4KKyAgICAgICAgICAgICAgICA8ZmFsc2UvPgorICAgICAgICAgICAgICAgIDxrZXk+YVRydWVWYWx1ZTwva2V5PgorICAgICAgICAgICAgICAgIDx0cnVlLz4KKyAgICAgICAgICAgICAgICA8a2V5PmFVbmljb2RlVmFsdWU8L2tleT4KKyAgICAgICAgICAgICAgICA8c3RyaW5nPk1ceGMzXHhhNHNzaWcsIE1hXHhjM1x4OWY8L3N0cmluZz4KKyAgICAgICAgICAgICAgICA8a2V5PmFub3RoZXJTdHJpbmc8L2tleT4KKyAgICAgICAgICAgICAgICA8c3RyaW5nPiZsdDtoZWxsbyAmYW1wOyAnaGknIHRoZXJlISZndDs8L3N0cmluZz4KKyAgICAgICAgICAgICAgICA8a2V5PmRlZXBlckRpY3Q8L2tleT4KKyAgICAgICAgICAgICAgICA8ZGljdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxrZXk+YTwva2V5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGludGVnZXI+MTc8L2ludGVnZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8a2V5PmI8L2tleT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWFsPjMyLjU8L3JlYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8a2V5PmM8L2tleT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnJheT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGludGVnZXI+MTwvaW50ZWdlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGludGVnZXI+MjwvaW50ZWdlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmluZz50ZXh0PC9zdHJpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2FycmF5PgorICAgICAgICAgICAgICAgIDwvZGljdD4KKyAgICAgICAgPC9kaWN0PgorICAgICAgICA8a2V5PmFGbG9hdDwva2V5PgorICAgICAgICA8cmVhbD4wLjU8L3JlYWw+CisgICAgICAgIDxrZXk+YUxpc3Q8L2tleT4KKyAgICAgICAgPGFycmF5PgorICAgICAgICAgICAgICAgIDxzdHJpbmc+QTwvc3RyaW5nPgorICAgICAgICAgICAgICAgIDxzdHJpbmc+Qjwvc3RyaW5nPgorICAgICAgICAgICAgICAgIDxpbnRlZ2VyPjEyPC9pbnRlZ2VyPgorICAgICAgICAgICAgICAgIDxyZWFsPjMyLjU8L3JlYWw+CisgICAgICAgICAgICAgICAgPGFycmF5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGludGVnZXI+MTwvaW50ZWdlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnRlZ2VyPjI8L2ludGVnZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW50ZWdlcj4zPC9pbnRlZ2VyPgorICAgICAgICAgICAgICAgIDwvYXJyYXk+CisgICAgICAgIDwvYXJyYXk+CisgICAgICAgIDxrZXk+YVN0cmluZzwva2V5PgorICAgICAgICA8c3RyaW5nPkRvb2RhaDwvc3RyaW5nPgorICAgICAgICA8a2V5PmFuSW50PC9rZXk+CisgICAgICAgIDxpbnRlZ2VyPjcyODwvaW50ZWdlcj4KKyAgICAgICAgPGtleT5uZXN0ZWREYXRhPC9rZXk+CisgICAgICAgIDxhcnJheT4KKyAgICAgICAgICAgICAgICA8ZGF0YT4KKyAgICAgICAgICAgICAgICBQR3h2ZEhNZ2IyWWdZbWx1WVhKNUlHZDFibXMrQUFFQ0F6eHNiM1J6SUc5bUlHSnBibUZ5ZVNCbmRXNXIKKyAgICAgICAgICAgICAgICBQZ0FCQWdNOGJHOTBjeUJ2WmlCaWFXNWhjbmtnWjNWdWF6NEFBUUlEUEd4dmRITWdiMllnWW1sdVlYSjUKKyAgICAgICAgICAgICAgICBJR2QxYm1zK0FBRUNBenhzYjNSeklHOW1JR0pwYm1GeWVTQm5kVzVyUGdBQkFnTThiRzkwY3lCdlppQmkKKyAgICAgICAgICAgICAgICBhVzVoY25rZ1ozVnVhejRBQVFJRFBHeHZkSE1nYjJZZ1ltbHVZWEo1SUdkMWJtcytBQUVDQXp4c2IzUnoKKyAgICAgICAgICAgICAgICBJRzltSUdKcGJtRnllU0JuZFc1clBnQUJBZ004Ykc5MGN5QnZaaUJpYVc1aGNua2daM1Z1YXo0QUFRSUQKKyAgICAgICAgICAgICAgICBQR3h2ZEhNZ2IyWWdZbWx1WVhKNUlHZDFibXMrQUFFQ0F3PT0KKyAgICAgICAgICAgICAgICA8L2RhdGE+CisgICAgICAgIDwvYXJyYXk+CisgICAgICAgIDxrZXk+c29tZURhdGE8L2tleT4KKyAgICAgICAgPGRhdGE+CisgICAgICAgIFBHSnBibUZ5ZVNCbmRXNXJQZz09CisgICAgICAgIDwvZGF0YT4KKyAgICAgICAgPGtleT5zb21lTW9yZURhdGE8L2tleT4KKyAgICAgICAgPGRhdGE+CisgICAgICAgIFBHeHZkSE1nYjJZZ1ltbHVZWEo1SUdkMWJtcytBQUVDQXp4c2IzUnpJRzltSUdKcGJtRnllU0JuZFc1clBnQUJBZ004CisgICAgICAgIGJHOTBjeUJ2WmlCaWFXNWhjbmtnWjNWdWF6NEFBUUlEUEd4dmRITWdiMllnWW1sdVlYSjVJR2QxYm1zK0FBRUNBenhzCisgICAgICAgIGIzUnpJRzltSUdKcGJtRnllU0JuZFc1clBnQUJBZ004Ykc5MGN5QnZaaUJpYVc1aGNua2daM1Z1YXo0QUFRSURQR3h2CisgICAgICAgIGRITWdiMllnWW1sdVlYSjVJR2QxYm1zK0FBRUNBenhzYjNSeklHOW1JR0pwYm1GeWVTQm5kVzVyUGdBQkFnTThiRzkwCisgICAgICAgIGN5QnZaaUJpYVc1aGNua2daM1Z1YXo0QUFRSURQR3h2ZEhNZ2IyWWdZbWx1WVhKNUlHZDFibXMrQUFFQ0F3PT0KKyAgICAgICAgPC9kYXRhPgorICAgICAgICA8a2V5Plx4YzNceDg1YmVucmFhPC9rZXk+CisgICAgICAgIDxzdHJpbmc+VGhhdCB3YXMgYSB1bmljb2RlIGtleS48L3N0cmluZz4KKzwvZGljdD4KKzwvcGxpc3Q+CisiIiIucmVwbGFjZSgiICIgKiA4LCAiXHQiKSAgIyBBcHBsZSBhcyB3ZWxsIGFzIHBsaXN0bGliLnB5IG91dHB1dCBoYXJkIHRhYnMKKworCitjbGFzcyBUZXN0UGxpc3RsaWIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF9jcmVhdGUoc2VsZik6CisgICAgICAgIHBsID0gZGljdCgKKyAgICAgICAgICAgIGFTdHJpbmc9IkRvb2RhaCIsCisgICAgICAgICAgICBhTGlzdD1bIkEiLCAiQiIsIDEyLCAzMi41LCBbMSwgMiwgM11dLAorICAgICAgICAgICAgYUZsb2F0ID0gMC41LAorICAgICAgICAgICAgYW5JbnQgPSA3MjgsCisgICAgICAgICAgICBhRGljdD1kaWN0KAorICAgICAgICAgICAgICAgIGFub3RoZXJTdHJpbmc9IjxoZWxsbyAmICdoaScgdGhlcmUhPiIsCisgICAgICAgICAgICAgICAgYVVuaWNvZGVWYWx1ZT11J01ceGU0c3NpZywgTWFceGRmJywKKyAgICAgICAgICAgICAgICBhVHJ1ZVZhbHVlPVRydWUsCisgICAgICAgICAgICAgICAgYUZhbHNlVmFsdWU9RmFsc2UsCisgICAgICAgICAgICAgICAgZGVlcGVyRGljdD1kaWN0KGE9MTcsIGI9MzIuNSwgYz1bMSwgMiwgInRleHQiXSksCisgICAgICAgICAgICApLAorICAgICAgICAgICAgc29tZURhdGEgPSBwbGlzdGxpYi5EYXRhKCI8YmluYXJ5IGd1bms+IiksCisgICAgICAgICAgICBzb21lTW9yZURhdGEgPSBwbGlzdGxpYi5EYXRhKCI8bG90cyBvZiBiaW5hcnkgZ3Vuaz5cMFwxXDJcMyIgKiAxMCksCisgICAgICAgICAgICBuZXN0ZWREYXRhID0gW3BsaXN0bGliLkRhdGEoIjxsb3RzIG9mIGJpbmFyeSBndW5rPlwwXDFcMlwzIiAqIDEwKV0sCisgICAgICAgICAgICBhRGF0ZSA9IGRhdGV0aW1lLmRhdGV0aW1lKDIwMDQsIDEwLCAyNiwgMTAsIDMzLCAzMyksCisgICAgICAgICkKKyAgICAgICAgcGxbdSdceGM1YmVucmFhJ10gPSAiVGhhdCB3YXMgYSB1bmljb2RlIGtleS4iCisgICAgICAgIHJldHVybiBwbAorCisgICAgZGVmIHRlc3RfY3JlYXRlKHNlbGYpOgorICAgICAgICBwbCA9IHNlbGYuX2NyZWF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxbImFTdHJpbmciXSwgIkRvb2RhaCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxbImFEaWN0Il1bImFGYWxzZVZhbHVlIl0sIEZhbHNlKQorCisgICAgZGVmIHRlc3RfaW8oc2VsZik6CisgICAgICAgIHBsID0gc2VsZi5fY3JlYXRlKCkKKyAgICAgICAgcGxpc3RsaWIud3JpdGVQbGlzdChwbCwgdGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgcGwyID0gcGxpc3RsaWIucmVhZFBsaXN0KHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdChwbCksIGRpY3QocGwyKSkKKworICAgIGRlZiB0ZXN0X3N0cmluZyhzZWxmKToKKyAgICAgICAgcGwgPSBzZWxmLl9jcmVhdGUoKQorICAgICAgICBkYXRhID0gcGxpc3RsaWIud3JpdGVQbGlzdFRvU3RyaW5nKHBsKQorICAgICAgICBwbDIgPSBwbGlzdGxpYi5yZWFkUGxpc3RGcm9tU3RyaW5nKGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdChwbCksIGRpY3QocGwyKSkKKyAgICAgICAgZGF0YTIgPSBwbGlzdGxpYi53cml0ZVBsaXN0VG9TdHJpbmcocGwyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGRhdGEyKQorCisgICAgZGVmIHRlc3RfaW5kZW50YXRpb25fYXJyYXkoc2VsZik6CisgICAgICAgIGRhdGEgPSBbW1tbW1tbW3sndGVzdCc6IHBsaXN0bGliLkRhdGEoYidhYWFhYWEnKX1dXV1dXV1dXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsaXN0bGliLnJlYWRQbGlzdEZyb21TdHJpbmcocGxpc3RsaWIud3JpdGVQbGlzdFRvU3RyaW5nKGRhdGEpKSwgZGF0YSkKKworICAgIGRlZiB0ZXN0X2luZGVudGF0aW9uX2RpY3Qoc2VsZik6CisgICAgICAgIGRhdGEgPSB7JzEnOiB7JzInOiB7JzMnOiB7JzQnOiB7JzUnOiB7JzYnOiB7JzcnOiB7JzgnOiB7JzknOiBwbGlzdGxpYi5EYXRhKGInYWFhYWFhJyl9fX19fX19fX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGlzdGxpYi5yZWFkUGxpc3RGcm9tU3RyaW5nKHBsaXN0bGliLndyaXRlUGxpc3RUb1N0cmluZyhkYXRhKSksIGRhdGEpCisKKyAgICBkZWYgdGVzdF9pbmRlbnRhdGlvbl9kaWN0X21peChzZWxmKToKKyAgICAgICAgZGF0YSA9IHsnMSc6IHsnMic6IFt7JzMnOiBbW1tbW3sndGVzdCc6IHBsaXN0bGliLkRhdGEoYidhYWFhYWEnKX1dXV1dXX1dfX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGlzdGxpYi5yZWFkUGxpc3RGcm9tU3RyaW5nKHBsaXN0bGliLndyaXRlUGxpc3RUb1N0cmluZyhkYXRhKSksIGRhdGEpCisKKyAgICBkZWYgdGVzdF9hcHBsZWZvcm1hdHRpbmcoc2VsZik6CisgICAgICAgIHBsID0gcGxpc3RsaWIucmVhZFBsaXN0RnJvbVN0cmluZyhURVNUREFUQSkKKyAgICAgICAgZGF0YSA9IHBsaXN0bGliLndyaXRlUGxpc3RUb1N0cmluZyhwbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBURVNUREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVkIGRhdGEgd2FzIG5vdCBpZGVudGljYWwgdG8gQXBwbGUncyBvdXRwdXQiKQorCisgICAgZGVmIHRlc3RfYXBwbGVmb3JtYXR0aW5nZnJvbWxpdGVyYWwoc2VsZik6CisgICAgICAgIHBsID0gc2VsZi5fY3JlYXRlKCkKKyAgICAgICAgcGwyID0gcGxpc3RsaWIucmVhZFBsaXN0RnJvbVN0cmluZyhURVNUREFUQSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0KHBsKSwgZGljdChwbDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnZW5lcmF0ZWQgZGF0YSB3YXMgbm90IGlkZW50aWNhbCB0byBBcHBsZSdzIG91dHB1dCIpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdpbyhzZWxmKToKKyAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgcGwgPSBzZWxmLl9jcmVhdGUoKQorICAgICAgICBwbGlzdGxpYi53cml0ZVBsaXN0KHBsLCBmKQorICAgICAgICBwbDIgPSBwbGlzdGxpYi5yZWFkUGxpc3QoU3RyaW5nSU8oZi5nZXR2YWx1ZSgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0KHBsKSwgZGljdChwbDIpKQorCisgICAgZGVmIHRlc3RfY3N0cmluZ2lvKHNlbGYpOgorICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgcGwgPSBzZWxmLl9jcmVhdGUoKQorICAgICAgICBwbGlzdGxpYi53cml0ZVBsaXN0KHBsLCBmKQorICAgICAgICBwbDIgPSBwbGlzdGxpYi5yZWFkUGxpc3QoU3RyaW5nSU8oZi5nZXR2YWx1ZSgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0KHBsKSwgZGljdChwbDIpKQorCisgICAgZGVmIHRlc3RfY29udHJvbGNoYXJhY3RlcnMoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDEyOCk6CisgICAgICAgICAgICBjID0gY2hyKGkpCisgICAgICAgICAgICB0ZXN0U3RyaW5nID0gInN0cmluZyBjb250YWluaW5nICVzIiAlIGMKKyAgICAgICAgICAgIGlmIGkgPj0gMzIgb3IgYyBpbiAiXHJcblx0IjoKKyAgICAgICAgICAgICAgICAjIFxyLCBcbiBhbmQgXHQgYXJlIHRoZSBvbmx5IGxlZ2FsIGNvbnRyb2wgY2hhcnMgaW4gWE1MCisgICAgICAgICAgICAgICAgcGxpc3RsaWIud3JpdGVQbGlzdFRvU3RyaW5nKHRlc3RTdHJpbmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxpc3RsaWIud3JpdGVQbGlzdFRvU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RTdHJpbmcpCisKKyAgICBkZWYgdGVzdF9ub25kaWN0cm9vdChzZWxmKToKKyAgICAgICAgdGVzdDEgPSAiYWJjIgorICAgICAgICB0ZXN0MiA9IFsxLCAyLCAzLCAiYWJjIl0KKyAgICAgICAgcmVzdWx0MSA9IHBsaXN0bGliLnJlYWRQbGlzdEZyb21TdHJpbmcocGxpc3RsaWIud3JpdGVQbGlzdFRvU3RyaW5nKHRlc3QxKSkKKyAgICAgICAgcmVzdWx0MiA9IHBsaXN0bGliLnJlYWRQbGlzdEZyb21TdHJpbmcocGxpc3RsaWIud3JpdGVQbGlzdFRvU3RyaW5nKHRlc3QyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0MSwgcmVzdWx0MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0MiwgcmVzdWx0MikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0UGxpc3RsaWIpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxpc3RsaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxpc3RsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzN2IzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wbGlzdGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxpc3RsaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxpc3RsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzN2IzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wbGlzdGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9sbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyOTRmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvbGwucHkKQEAgLTAsMCArMSwxNjcgQEAKKyMgVGVzdCBjYXNlIGZvciB0aGUgb3MucG9sbCgpIGZ1bmN0aW9uCisKK2ltcG9ydCBvcywgc2VsZWN0LCByYW5kb20sIHVuaXR0ZXN0CitpbXBvcnQgX3Rlc3RjYXBpCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdAorCit0cnk6CisgICAgc2VsZWN0LnBvbGwKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCwgInNlbGVjdC5wb2xsIG5vdCBkZWZpbmVkIC0tIHNraXBwaW5nIHRlc3RfcG9sbCIKKworCitkZWYgZmluZF9yZWFkeV9tYXRjaGluZyhyZWFkeSwgZmxhZyk6CisgICAgbWF0Y2ggPSBbXQorICAgIGZvciBmZCwgbW9kZSBpbiByZWFkeToKKyAgICAgICAgaWYgbW9kZSAmIGZsYWc6CisgICAgICAgICAgICBtYXRjaC5hcHBlbmQoZmQpCisgICAgcmV0dXJuIG1hdGNoCisKK2NsYXNzIFBvbGxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9wb2xsMShzZWxmKToKKyAgICAgICAgIyBCYXNpYyBmdW5jdGlvbmFsIHRlc3Qgb2YgcG9sbCBvYmplY3QKKyAgICAgICAgIyBDcmVhdGUgYSBidW5jaCBvZiBwaXBlIGFuZCB0ZXN0IHRoYXQgcG9sbCB3b3JrcyB3aXRoIHRoZW0uCisKKyAgICAgICAgcCA9IHNlbGVjdC5wb2xsKCkKKworICAgICAgICBOVU1fUElQRVMgPSAxMgorICAgICAgICBNU0cgPSAiIFRoaXMgaXMgYSB0ZXN0LiIKKyAgICAgICAgTVNHX0xFTiA9IGxlbihNU0cpCisgICAgICAgIHJlYWRlcnMgPSBbXQorICAgICAgICB3cml0ZXJzID0gW10KKyAgICAgICAgcjJ3ID0ge30KKyAgICAgICAgdzJyID0ge30KKworICAgICAgICBmb3IgaSBpbiByYW5nZShOVU1fUElQRVMpOgorICAgICAgICAgICAgcmQsIHdyID0gb3MucGlwZSgpCisgICAgICAgICAgICBwLnJlZ2lzdGVyKHJkKQorICAgICAgICAgICAgcC5tb2RpZnkocmQsIHNlbGVjdC5QT0xMSU4pCisgICAgICAgICAgICBwLnJlZ2lzdGVyKHdyLCBzZWxlY3QuUE9MTE9VVCkKKyAgICAgICAgICAgIHJlYWRlcnMuYXBwZW5kKHJkKQorICAgICAgICAgICAgd3JpdGVycy5hcHBlbmQod3IpCisgICAgICAgICAgICByMndbcmRdID0gd3IKKyAgICAgICAgICAgIHcyclt3cl0gPSByZAorCisgICAgICAgIGJ1ZnMgPSBbXQorCisgICAgICAgIHdoaWxlIHdyaXRlcnM6CisgICAgICAgICAgICByZWFkeSA9IHAucG9sbCgpCisgICAgICAgICAgICByZWFkeV93cml0ZXJzID0gZmluZF9yZWFkeV9tYXRjaGluZyhyZWFkeSwgc2VsZWN0LlBPTExPVVQpCisgICAgICAgICAgICBpZiBub3QgcmVhZHlfd3JpdGVyczoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJubyBwaXBlcyByZWFkeSBmb3Igd3JpdGluZyIKKyAgICAgICAgICAgIHdyID0gcmFuZG9tLmNob2ljZShyZWFkeV93cml0ZXJzKQorICAgICAgICAgICAgb3Mud3JpdGUod3IsIE1TRykKKworICAgICAgICAgICAgcmVhZHkgPSBwLnBvbGwoKQorICAgICAgICAgICAgcmVhZHlfcmVhZGVycyA9IGZpbmRfcmVhZHlfbWF0Y2hpbmcocmVhZHksIHNlbGVjdC5QT0xMSU4pCisgICAgICAgICAgICBpZiBub3QgcmVhZHlfcmVhZGVyczoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJubyBwaXBlcyByZWFkeSBmb3IgcmVhZGluZyIKKyAgICAgICAgICAgIHJkID0gcmFuZG9tLmNob2ljZShyZWFkeV9yZWFkZXJzKQorICAgICAgICAgICAgYnVmID0gb3MucmVhZChyZCwgTVNHX0xFTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJ1ZiksIE1TR19MRU4pCisgICAgICAgICAgICBidWZzLmFwcGVuZChidWYpCisgICAgICAgICAgICBvcy5jbG9zZShyMndbcmRdKSA7IG9zLmNsb3NlKCByZCApCisgICAgICAgICAgICBwLnVucmVnaXN0ZXIoIHIyd1tyZF0gKQorICAgICAgICAgICAgcC51bnJlZ2lzdGVyKCByZCApCisgICAgICAgICAgICB3cml0ZXJzLnJlbW92ZShyMndbcmRdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmcywgW01TR10gKiBOVU1fUElQRVMpCisKKyAgICBkZWYgcG9sbF91bml0X3Rlc3RzKHNlbGYpOgorICAgICAgICAjIHJldHVybnMgTlZBTCBmb3IgaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgRkQgPSA0MgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5jbG9zZShGRCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHAgPSBzZWxlY3QucG9sbCgpCisgICAgICAgIHAucmVnaXN0ZXIoRkQpCisgICAgICAgIHIgPSBwLnBvbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbMF0sIChGRCwgc2VsZWN0LlBPTExOVkFMKSkKKworICAgICAgICBmID0gb3BlbihURVNURk4sICd3JykKKyAgICAgICAgZmQgPSBmLmZpbGVubygpCisgICAgICAgIHAgPSBzZWxlY3QucG9sbCgpCisgICAgICAgIHAucmVnaXN0ZXIoZikKKyAgICAgICAgciA9IHAucG9sbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoclswXVswXSwgZmQpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICByID0gcC5wb2xsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyWzBdLCAoZmQsIHNlbGVjdC5QT0xMTlZBTCkpCisgICAgICAgIG9zLnVubGluayhURVNURk4pCisKKyAgICAgICAgIyB0eXBlIGVycm9yIGZvciBpbnZhbGlkIGFyZ3VtZW50cworICAgICAgICBwID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHAucmVnaXN0ZXIsIHApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcC51bnJlZ2lzdGVyLCBwKQorCisgICAgICAgICMgY2FuJ3QgdW5yZWdpc3RlciBub24tZXhpc3RlbnQgb2JqZWN0CisgICAgICAgIHAgPSBzZWxlY3QucG9sbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBwLnVucmVnaXN0ZXIsIDMpCisKKyAgICAgICAgIyBUZXN0IGVycm9yIGNhc2VzCisgICAgICAgIHBvbGxzdGVyID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBjbGFzcyBOb3BlOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEFsbW9zdDoKKyAgICAgICAgICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdmaWxlbm8nCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb2xsc3Rlci5yZWdpc3RlciwgTm9wZSgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvbGxzdGVyLnJlZ2lzdGVyLCBBbG1vc3QoKSwgMCkKKworICAgICMgQW5vdGhlciB0ZXN0IGNhc2UgZm9yIHBvbGwoKS4gIFRoaXMgaXMgY29waWVkIGZyb20gdGhlIHRlc3QgY2FzZSBmb3IKKyAgICAjIHNlbGVjdCgpLCBtb2RpZmllZCB0byB1c2UgcG9sbCgpIGluc3RlYWQuCisKKyAgICBkZWYgdGVzdF9wb2xsMihzZWxmKToKKyAgICAgICAgY21kID0gJ2ZvciBpIGluIDAgMSAyIDMgNCA1IDYgNyA4IDk7IGRvIGVjaG8gdGVzdGluZy4uLjsgc2xlZXAgMTsgZG9uZScKKyAgICAgICAgcCA9IG9zLnBvcGVuKGNtZCwgJ3InKQorICAgICAgICBwb2xsc3RlciA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgcG9sbHN0ZXIucmVnaXN0ZXIoIHAsIHNlbGVjdC5QT0xMSU4gKQorICAgICAgICBmb3IgdG91dCBpbiAoMCwgMTAwMCwgMjAwMCwgNDAwMCwgODAwMCwgMTYwMDApICsgKC0xLCkqMTA6CisgICAgICAgICAgICBmZGxpc3QgPSBwb2xsc3Rlci5wb2xsKHRvdXQpCisgICAgICAgICAgICBpZiAoZmRsaXN0ID09IFtdKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmQsIGZsYWdzID0gZmRsaXN0WzBdCisgICAgICAgICAgICBpZiBmbGFncyAmIHNlbGVjdC5QT0xMSFVQOgorICAgICAgICAgICAgICAgIGxpbmUgPSBwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lICE9ICIiOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ2Vycm9yOiBwaXBlIHNlZW1zIHRvIGJlIGNsb3NlZCwgYnV0IHN0aWxsIHJldHVybnMgZGF0YScpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgZWxpZiBmbGFncyAmIHNlbGVjdC5QT0xMSU46CisgICAgICAgICAgICAgICAgbGluZSA9IHAucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnVW5leHBlY3RlZCByZXR1cm4gdmFsdWUgZnJvbSBzZWxlY3QucG9sbDogJXMnICUgZmRsaXN0KQorICAgICAgICBwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3BvbGwzKHNlbGYpOgorICAgICAgICAjIHRlc3QgaW50IG92ZXJmbG93CisgICAgICAgIHBvbGxzdGVyID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBwb2xsc3Rlci5yZWdpc3RlcigxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHBvbGxzdGVyLnBvbGwsIDFMIDw8IDY0KQorCisgICAgICAgIHggPSAyICsgMworICAgICAgICBpZiB4ICE9IDU6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ092ZXJmbG93IG11c3QgaGF2ZSBvY2N1cnJlZCcpCisKKyAgICAgICAgcG9sbHN0ZXIgPSBzZWxlY3QucG9sbCgpCisgICAgICAgICMgSXNzdWUgMTU5ODkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcG9sbHN0ZXIucmVnaXN0ZXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF90ZXN0Y2FwaS5TSFJUX01BWCArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHBvbGxzdGVyLnJlZ2lzdGVyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfdGVzdGNhcGkuVVNIUlRfTUFYICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcG9sbHN0ZXIucG9sbCwgX3Rlc3RjYXBpLklOVF9NQVggKyAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBwb2xsc3Rlci5wb2xsLCBfdGVzdGNhcGkuVUlOVF9NQVggKyAxKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFBvbGxUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9sbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb2xsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDk0YmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9sbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9sbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb2xsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDk0YmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9sbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3Blbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmI1ZTkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4ucHkKQEAgLTAsMCArMSw1MiBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiQmFzaWMgdGVzdHMgZm9yIG9zLnBvcGVuKCkKKworICBQYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBwbGF0Zm9ybXMgdGhhdCBmYWtlIHBvcGVuLgorIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBvcywgc3lzCisKKyMgVGVzdCB0aGF0IGNvbW1hbmQtbGluZXMgZ2V0IGRvd24gYXMgd2UgZXhwZWN0LgorIyBUbyBkbyB0aGlzIHdlIGV4ZWN1dGU6CisjICAgIHB5dGhvbiAtYyAiaW1wb3J0IHN5cztwcmludCBzeXMuYXJndiIge3Jlc3Rfb2ZfY29tbWFuZGxpbmV9CisjIFRoaXMgcmVzdWx0cyBpbiBQeXRob24gYmVpbmcgc3Bhd25lZCBhbmQgcHJpbnRpbmcgdGhlIHN5cy5hcmd2IGxpc3QuCisjIFdlIGNhbiB0aGVuIGV2YWwoKSB0aGUgcmVzdWx0IG9mIHRoaXMsIGFuZCBzZWUgd2hhdCBlYWNoIGFyZ3Ygd2FzLgorcHl0aG9uID0gc3lzLmV4ZWN1dGFibGUKKworY2xhc3MgUG9wZW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX2RvX3Rlc3RfY29tbWFuZGxpbmUoc2VsZiwgY21kbGluZSwgZXhwZWN0ZWQpOgorICAgICAgICBjbWQgPSAnJXMgLWMgImltcG9ydCBzeXM7cHJpbnQgc3lzLmFyZ3YiICVzJyAlIChweXRob24sIGNtZGxpbmUpCisgICAgICAgIGRhdGEgPSBvcy5wb3BlbihjbWQpLnJlYWQoKSArICdcbicKKyAgICAgICAgZ290ID0gZXZhbChkYXRhKVsxOl0gIyBzdHJpcCBvZmYgYXJndlswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9wb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcy5wb3BlbikKKyAgICAgICAgc2VsZi5fZG9fdGVzdF9jb21tYW5kbGluZSgKKyAgICAgICAgICAgICJmb28gYmFyIiwKKyAgICAgICAgICAgIFsiZm9vIiwgImJhciJdCisgICAgICAgICkKKyAgICAgICAgc2VsZi5fZG9fdGVzdF9jb21tYW5kbGluZSgKKyAgICAgICAgICAgICdmb28gInNwYW0gYW5kIGVnZ3MiICJzaWxseSB3YWxrIicsCisgICAgICAgICAgICBbImZvbyIsICJzcGFtIGFuZCBlZ2dzIiwgInNpbGx5IHdhbGsiXQorICAgICAgICApCisgICAgICAgIHNlbGYuX2RvX3Rlc3RfY29tbWFuZGxpbmUoCisgICAgICAgICAgICAnZm9vICJhIFxcInF1b3RlZFxcIiBhcmciIGJhcicsCisgICAgICAgICAgICBbImZvbyIsICdhICJxdW90ZWQiIGFyZycsICJiYXIiXQorICAgICAgICApCisgICAgICAgIHRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKKworICAgIGRlZiB0ZXN0X3JldHVybl9jb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBvcGVuKCJleGl0IDAiKS5jbG9zZSgpLCBOb25lKQorICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBvcGVuKCJleGl0IDQyIikuY2xvc2UoKSwgNDIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBvcGVuKCJleGl0IDQyIikuY2xvc2UoKSwgNDIgPDwgOCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUG9wZW5UZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3Blbi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3Blbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhMGE1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGVuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3Blbi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3Blbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhMGE1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGVuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BlbjIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BlbjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE0MTA3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGVuMi5weQpAQCAtMCwwICsxLDEzMCBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiVGVzdCBzY3JpcHQgZm9yIHBvcGVuMi5weSIiIgorCitpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLipwb3BlbjIgbW9kdWxlIGlzIGRlcHJlY2F0ZWQuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgIm9zXC5wb3Blbi4gaXMgZGVwcmVjYXRlZC4qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBwb3BlbjIKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCByZWFwX2NoaWxkcmVuCisKK2lmIHN5cy5wbGF0Zm9ybVs6NF0gPT0gJ2Jlb3MnIG9yIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gJ2F0aGVvcyc6CisgICAgIyAgTG9ja3MgZ2V0IG1lc3NlZCB1cCBvciBzb21ldGhpbmcuICBHZW5lcmFsbHkgd2UncmUgc3VwcG9zZWQKKyAgICAjICB0byBhdm9pZCBtaXhpbmcgInBvc2l4IiBmb3JrICYgZXhlYyB3aXRoIG5hdGl2ZSB0aHJlYWRzLCBhbmQKKyAgICAjICB0aGV5IG1heSBiZSByaWdodCBhYm91dCB0aGF0IGFmdGVyIGFsbC4KKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgicG9wZW4yKCkgZG9lc24ndCB3b3JrIG9uICIgKyBzeXMucGxhdGZvcm0pCisKKyMgaWYgd2UgZG9uJ3QgaGF2ZSBvcy5wb3BlbiwgY2hlY2sgdGhhdAorIyB3ZSBoYXZlIG9zLmZvcmsuICBpZiBub3QsIHNraXAgdGhlIHRlc3QKKyMgKGJ5IHJhaXNpbmcgYW4gSW1wb3J0RXJyb3IpCit0cnk6CisgICAgZnJvbSBvcyBpbXBvcnQgcG9wZW4KKyAgICBkZWwgcG9wZW4KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIG9zIGltcG9ydCBmb3JrCisgICAgZGVsIGZvcmsKKworY2xhc3MgUG9wZW4yVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgY21kID0gImNhdCIKKyAgICBpZiBvcy5uYW1lID09ICJudCI6CisgICAgICAgIGNtZCA9ICJtb3JlIgorICAgIHRlc3RzdHIgPSAiYWIgY2RcbiIKKyAgICAjICJtb3JlIiBkb2Vzbid0IGFjdCB0aGUgc2FtZSB3YXkgYWNyb3NzIFdpbmRvd3MgZmxhdm9ycywKKyAgICAjIHNvbWV0aW1lcyBhZGRpbmcgYW4gZXh0cmEgbmV3bGluZSBhdCB0aGUgc3RhcnQgb3IgdGhlCisgICAgIyBlbmQuICBTbyB3ZSBzdHJpcCB3aGl0ZXNwYWNlIG9mZiBib3RoIGVuZHMgZm9yIGNvbXBhcmlzb24uCisgICAgZXhwZWN0ZWQgPSB0ZXN0c3RyLnN0cmlwKCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgcG9wZW4yLl9jbGVhbnVwKCkKKyAgICAgICAgIyBXaGVuIHRoZSB0ZXN0IHJ1bnMsIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgb3BlbiBwaXBlcworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBvcGVuMi5fYWN0aXZlLCAiQWN0aXZlIHBpcGVzIHdoZW4gdGVzdCBzdGFydHMiICsKKyAgICAgICAgICAgIHJlcHIoW2MuY21kIGZvciBjIGluIHBvcGVuMi5fYWN0aXZlXSkpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciBpbnN0IGluIHBvcGVuMi5fYWN0aXZlOgorICAgICAgICAgICAgaW5zdC53YWl0KCkKKyAgICAgICAgcG9wZW4yLl9jbGVhbnVwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwb3BlbjIuX2FjdGl2ZSwgInBvcGVuMi5fYWN0aXZlIG5vdCBlbXB0eSIpCisgICAgICAgICMgVGhlIG9zLnBvcGVuKigpIEFQSSBkZWxlZ2F0ZXMgdG8gdGhlIHN1YnByb2Nlc3MgbW9kdWxlIChvbiBVbml4KQorICAgICAgICBpbXBvcnQgc3VicHJvY2VzcworICAgICAgICBmb3IgaW5zdCBpbiBzdWJwcm9jZXNzLl9hY3RpdmU6CisgICAgICAgICAgICBpbnN0LndhaXQoKQorICAgICAgICBzdWJwcm9jZXNzLl9jbGVhbnVwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzdWJwcm9jZXNzLl9hY3RpdmUsICJzdWJwcm9jZXNzLl9hY3RpdmUgbm90IGVtcHR5IikKKyAgICAgICAgcmVhcF9jaGlsZHJlbigpCisKKyAgICBkZWYgdmFsaWRhdGVfb3V0cHV0KHNlbGYsIHRlc3RzdHIsIGV4cGVjdGVkX291dCwgciwgdywgZT1Ob25lKToKKyAgICAgICAgdy53cml0ZSh0ZXN0c3RyKQorICAgICAgICB3LmNsb3NlKCkKKyAgICAgICAgZ290ID0gci5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9vdXQsIGdvdC5zdHJpcCgpLCAid3JvdGUgJXIgcmVhZCAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXN0c3RyLCBnb3QpKQorCisgICAgICAgIGlmIGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBnb3QgPSBlLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnb3QsICJ1bmV4cGVjdGVkICVyIG9uIHN0ZGVyciIgJSBnb3QpCisKKyAgICBkZWYgdGVzdF9wb3BlbjIoc2VsZik6CisgICAgICAgIHIsIHcgPSBwb3BlbjIucG9wZW4yKHNlbGYuY21kKQorICAgICAgICBzZWxmLnZhbGlkYXRlX291dHB1dChzZWxmLnRlc3RzdHIsIHNlbGYuZXhwZWN0ZWQsIHIsIHcpCisKKyAgICBkZWYgdGVzdF9wb3BlbjMoc2VsZik6CisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgICAgIHIsIHcsIGUgPSBwb3BlbjIucG9wZW4zKFtzZWxmLmNtZF0pCisgICAgICAgICAgICBzZWxmLnZhbGlkYXRlX291dHB1dChzZWxmLnRlc3RzdHIsIHNlbGYuZXhwZWN0ZWQsIHIsIHcsIGUpCisKKyAgICAgICAgciwgdywgZSA9IHBvcGVuMi5wb3BlbjMoc2VsZi5jbWQpCisgICAgICAgIHNlbGYudmFsaWRhdGVfb3V0cHV0KHNlbGYudGVzdHN0ciwgc2VsZi5leHBlY3RlZCwgciwgdywgZSkKKworICAgIGRlZiB0ZXN0X29zX3BvcGVuMihzZWxmKToKKyAgICAgICAgIyBzYW1lIHRlc3QgYXMgdGVzdF9wb3BlbjIoKSwgYnV0IHVzaW5nIHRoZSBvcy5wb3BlbiooKSBBUEkKKyAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAgICAgdywgciA9IG9zLnBvcGVuMihbc2VsZi5jbWRdKQorICAgICAgICAgICAgc2VsZi52YWxpZGF0ZV9vdXRwdXQoc2VsZi50ZXN0c3RyLCBzZWxmLmV4cGVjdGVkLCByLCB3KQorCisgICAgICAgICAgICB3LCByID0gb3MucG9wZW4yKFsiZWNobyIsIHNlbGYudGVzdHN0cl0pCisgICAgICAgICAgICBnb3QgPSByLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIHNlbGYudGVzdHN0ciArICJcbiIpCisKKyAgICAgICAgdywgciA9IG9zLnBvcGVuMihzZWxmLmNtZCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9vdXRwdXQoc2VsZi50ZXN0c3RyLCBzZWxmLmV4cGVjdGVkLCByLCB3KQorCisgICAgZGVmIHRlc3Rfb3NfcG9wZW4zKHNlbGYpOgorICAgICAgICAjIHNhbWUgdGVzdCBhcyB0ZXN0X3BvcGVuMygpLCBidXQgdXNpbmcgdGhlIG9zLnBvcGVuKigpIEFQSQorICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICB3LCByLCBlID0gb3MucG9wZW4zKFtzZWxmLmNtZF0pCisgICAgICAgICAgICBzZWxmLnZhbGlkYXRlX291dHB1dChzZWxmLnRlc3RzdHIsIHNlbGYuZXhwZWN0ZWQsIHIsIHcsIGUpCisKKyAgICAgICAgICAgIHcsIHIsIGUgPSBvcy5wb3BlbjMoWyJlY2hvIiwgc2VsZi50ZXN0c3RyXSkKKyAgICAgICAgICAgIGdvdCA9IHIucmVhZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgc2VsZi50ZXN0c3RyICsgIlxuIikKKyAgICAgICAgICAgIGdvdCA9IGUucmVhZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdvdCwgInVuZXhwZWN0ZWQgJXIgb24gc3RkZXJyIiAlIGdvdCkKKworICAgICAgICB3LCByLCBlID0gb3MucG9wZW4zKHNlbGYuY21kKQorICAgICAgICBzZWxmLnZhbGlkYXRlX291dHB1dChzZWxmLnRlc3RzdHIsIHNlbGYuZXhwZWN0ZWQsIHIsIHcsIGUpCisKKyAgICBkZWYgdGVzdF9vc19wb3BlbjQoc2VsZik6CisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgICAgIHcsIHIgPSBvcy5wb3BlbjQoW3NlbGYuY21kXSkKKyAgICAgICAgICAgIHNlbGYudmFsaWRhdGVfb3V0cHV0KHNlbGYudGVzdHN0ciwgc2VsZi5leHBlY3RlZCwgciwgdykKKworICAgICAgICAgICAgdywgciA9IG9zLnBvcGVuNChbImVjaG8iLCBzZWxmLnRlc3RzdHJdKQorICAgICAgICAgICAgZ290ID0gci5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBzZWxmLnRlc3RzdHIgKyAiXG4iKQorCisgICAgICAgIHcsIHIgPSBvcy5wb3BlbjQoc2VsZi5jbWQpCisgICAgICAgIHNlbGYudmFsaWRhdGVfb3V0cHV0KHNlbGYudGVzdHN0ciwgc2VsZi5leHBlY3RlZCwgciwgdykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFBvcGVuMlRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGVuMi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BlbjIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NmFjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BlbjIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGVuMi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BlbjIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NmFjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BlbjIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTA1YzIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wbGliLnB5CkBAIC0wLDAgKzEsMzQ1IEBACisiIiJUZXN0IHNjcmlwdCBmb3IgcG9wbGliIG1vZHVsZS4iIiIKKworIyBNb2RpZmllZCBieSBHaWFtcGFvbG8gUm9kb2xhJyB0byBnaXZlIHBvcGxpYi5QT1AzIGFuZCBwb3BsaWIuUE9QM19TU0wKKyMgYSByZWFsIHRlc3Qgc3VpdGUKKworaW1wb3J0IHBvcGxpYgoraW1wb3J0IGFzeW5jb3JlCitpbXBvcnQgYXN5bmNoYXQKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBvcworaW1wb3J0IHRpbWUKK2ltcG9ydCBlcnJubworCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IEhPU1QKK3RocmVhZGluZyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQorCisKKyMgdGhlIGR1bW15IGRhdGEgcmV0dXJuZWQgYnkgc2VydmVyIHdoZW4gTElTVCBhbmQgUkVUUiBjb21tYW5kcyBhcmUgaXNzdWVkCitMSVNUX1JFU1AgPSAnMSAxXHJcbjIgMlxyXG4zIDNcclxuNCA0XHJcbjUgNVxyXG4uXHJcbicKK1JFVFJfUkVTUCA9ICIiIkZyb206IHBvc3RtYXN0ZXJAcHl0aG9uLm9yZ1wKK1xyXG5Db250ZW50LVR5cGU6IHRleHQvcGxhaW5cclxuXAorTUlNRS1WZXJzaW9uOiAxLjBcclxuXAorU3ViamVjdDogRHVtbXlcclxuXAorXHJcblwKK2xpbmUxXHJcblwKK2xpbmUyXHJcblwKK2xpbmUzXHJcblwKKy5cclxuIiIiCisKKworY2xhc3MgRHVtbXlQT1AzSGFuZGxlcihhc3luY2hhdC5hc3luY19jaGF0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uKToKKyAgICAgICAgYXN5bmNoYXQuYXN5bmNfY2hhdC5fX2luaXRfXyhzZWxmLCBjb25uKQorICAgICAgICBzZWxmLnNldF90ZXJtaW5hdG9yKCJcclxuIikKKyAgICAgICAgc2VsZi5pbl9idWZmZXIgPSBbXQorICAgICAgICBzZWxmLnB1c2goJytPSyBkdW1teSBwb3AzIHNlcnZlciByZWFkeS4nKQorCisgICAgZGVmIGNvbGxlY3RfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5pbl9idWZmZXIuYXBwZW5kKGRhdGEpCisKKyAgICBkZWYgZm91bmRfdGVybWluYXRvcihzZWxmKToKKyAgICAgICAgbGluZSA9ICcnLmpvaW4oc2VsZi5pbl9idWZmZXIpCisgICAgICAgIHNlbGYuaW5fYnVmZmVyID0gW10KKyAgICAgICAgY21kID0gbGluZS5zcGxpdCgnICcpWzBdLmxvd2VyKCkKKyAgICAgICAgc3BhY2UgPSBsaW5lLmZpbmQoJyAnKQorICAgICAgICBpZiBzcGFjZSAhPSAtMToKKyAgICAgICAgICAgIGFyZyA9IGxpbmVbc3BhY2UgKyAxOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFyZyA9ICIiCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2NtZF8nICsgY21kKToKKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZiwgJ2NtZF8nICsgY21kKQorICAgICAgICAgICAgbWV0aG9kKGFyZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHVzaCgnLUVSUiB1bnJlY29nbml6ZWQgUE9QMyBjb21tYW5kICIlcyIuJyAlY21kKQorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgcmFpc2UKKworICAgIGRlZiBwdXNoKHNlbGYsIGRhdGEpOgorICAgICAgICBhc3luY2hhdC5hc3luY19jaGF0LnB1c2goc2VsZiwgZGF0YSArICdcclxuJykKKworICAgIGRlZiBjbWRfZWNobyhzZWxmLCBhcmcpOgorICAgICAgICAjIHNlbmRzIGJhY2sgdGhlIHJlY2VpdmVkIHN0cmluZyAodXNlZCBieSB0aGUgdGVzdCBzdWl0ZSkKKyAgICAgICAgc2VsZi5wdXNoKGFyZykKKworICAgIGRlZiBjbWRfdXNlcihzZWxmLCBhcmcpOgorICAgICAgICBpZiBhcmcgIT0gImd1aWRvIjoKKyAgICAgICAgICAgIHNlbGYucHVzaCgiLUVSUiBubyBzdWNoIHVzZXIiKQorICAgICAgICBzZWxmLnB1c2goJytPSyBwYXNzd29yZCByZXF1aXJlZCcpCisKKyAgICBkZWYgY21kX3Bhc3Moc2VsZiwgYXJnKToKKyAgICAgICAgaWYgYXJnICE9ICJweXRob24iOgorICAgICAgICAgICAgc2VsZi5wdXNoKCItRVJSIHdyb25nIHBhc3N3b3JkIikKKyAgICAgICAgc2VsZi5wdXNoKCcrT0sgMTAgbWVzc2FnZXMnKQorCisgICAgZGVmIGNtZF9zdGF0KHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnK09LIDEwIDEwMCcpCisKKyAgICBkZWYgY21kX2xpc3Qoc2VsZiwgYXJnKToKKyAgICAgICAgaWYgYXJnOgorICAgICAgICAgICAgc2VsZi5wdXNoKCcrT0sgJXMgJXMnICUoYXJnLCBhcmcpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wdXNoKCcrT0snKQorICAgICAgICAgICAgYXN5bmNoYXQuYXN5bmNfY2hhdC5wdXNoKHNlbGYsIExJU1RfUkVTUCkKKworICAgIGNtZF91aWRsID0gY21kX2xpc3QKKworICAgIGRlZiBjbWRfcmV0cihzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJytPSyAlcyBieXRlcycgJWxlbihSRVRSX1JFU1ApKQorICAgICAgICBhc3luY2hhdC5hc3luY19jaGF0LnB1c2goc2VsZiwgUkVUUl9SRVNQKQorCisgICAgY21kX3RvcCA9IGNtZF9yZXRyCisKKyAgICBkZWYgY21kX2RlbGUoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCcrT0sgbWVzc2FnZSBtYXJrZWQgZm9yIGRlbGV0aW9uLicpCisKKyAgICBkZWYgY21kX25vb3Aoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCcrT0sgZG9uZSBub3RoaW5nLicpCisKKyAgICBkZWYgY21kX3Jwb3Aoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCcrT0sgZG9uZSBub3RoaW5nLicpCisKKworY2xhc3MgRHVtbXlQT1AzU2VydmVyKGFzeW5jb3JlLmRpc3BhdGNoZXIsIHRocmVhZGluZy5UaHJlYWQpOgorCisgICAgaGFuZGxlciA9IER1bW15UE9QM0hhbmRsZXIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzLCBhZj1zb2NrZXQuQUZfSU5FVCk6CisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgYXN5bmNvcmUuZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZV9zb2NrZXQoYWYsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5iaW5kKGFkZHJlc3MpCisgICAgICAgIHNlbGYubGlzdGVuKDUpCisgICAgICAgIHNlbGYuYWN0aXZlID0gRmFsc2UKKyAgICAgICAgc2VsZi5hY3RpdmVfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKyAgICAgICAgc2VsZi5ob3N0LCBzZWxmLnBvcnQgPSBzZWxmLnNvY2tldC5nZXRzb2NrbmFtZSgpWzoyXQorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBhc3NlcnQgbm90IHNlbGYuYWN0aXZlCisgICAgICAgIHNlbGYuX19mbGFnID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5zdGFydChzZWxmKQorICAgICAgICBzZWxmLl9fZmxhZy53YWl0KCkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuYWN0aXZlID0gVHJ1ZQorICAgICAgICBzZWxmLl9fZmxhZy5zZXQoKQorICAgICAgICB3aGlsZSBzZWxmLmFjdGl2ZSBhbmQgYXN5bmNvcmUuc29ja2V0X21hcDoKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlX2xvY2suYWNxdWlyZSgpCisgICAgICAgICAgICBhc3luY29yZS5sb29wKHRpbWVvdXQ9MC4xLCBjb3VudD0xKQorICAgICAgICAgICAgc2VsZi5hY3RpdmVfbG9jay5yZWxlYXNlKCkKKyAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKGlnbm9yZV9hbGw9VHJ1ZSkKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5hY3RpdmUKKyAgICAgICAgc2VsZi5hY3RpdmUgPSBGYWxzZQorICAgICAgICBzZWxmLmpvaW4oKQorCisgICAgZGVmIGhhbmRsZV9hY2NlcHQoc2VsZik6CisgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLmFjY2VwdCgpCisgICAgICAgIHNlbGYuaGFuZGxlciA9IHNlbGYuaGFuZGxlcihjb25uKQorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBoYW5kbGVfY29ubmVjdChzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgaGFuZGxlX3JlYWQgPSBoYW5kbGVfY29ubmVjdAorCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgcmFpc2UKKworCitjbGFzcyBUZXN0UE9QM0NsYXNzKFRlc3RDYXNlKToKKworICAgIGRlZiBhc3NlcnRPSyhzZWxmLCByZXNwKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3Auc3RhcnRzd2l0aCgiK09LIikpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVyID0gRHVtbXlQT1AzU2VydmVyKChIT1NULCAwKSkKKyAgICAgICAgc2VsZi5zZXJ2ZXIuc3RhcnQoKQorICAgICAgICBzZWxmLmNsaWVudCA9IHBvcGxpYi5QT1AzKHNlbGYuc2VydmVyLmhvc3QsIHNlbGYuc2VydmVyLnBvcnQpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50LnF1aXQoKQorICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworICAgIGRlZiB0ZXN0X2dldHdlbGNvbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQuZ2V0d2VsY29tZSgpLCAnK09LIGR1bW15IHBvcDMgc2VydmVyIHJlYWR5LicpCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhwb3BsaWIuZXJyb3JfcHJvdG8sIHNlbGYuY2xpZW50Ll9zaG9ydGNtZCwgJ2VjaG8gLWVycicpCisKKyAgICBkZWYgdGVzdF91c2VyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9LKHNlbGYuY2xpZW50LnVzZXIoJ2d1aWRvJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHBvcGxpYi5lcnJvcl9wcm90bywgc2VsZi5jbGllbnQudXNlciwgJ2ludmFsaWQnKQorCisgICAgZGVmIHRlc3RfcGFzc18oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T0soc2VsZi5jbGllbnQucGFzc18oJ3B5dGhvbicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhwb3BsaWIuZXJyb3JfcHJvdG8sIHNlbGYuY2xpZW50LnVzZXIsICdpbnZhbGlkJykKKworICAgIGRlZiB0ZXN0X3N0YXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQuc3RhdCgpLCAoMTAsIDEwMCkpCisKKyAgICBkZWYgdGVzdF9saXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50Lmxpc3QoKVsxOl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgKFsnMSAxJywgJzIgMicsICczIDMnLCAnNCA0JywgJzUgNSddLCAyNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmNsaWVudC5saXN0KCcxJykuZW5kc3dpdGgoIk9LIDEgMSIpKQorCisgICAgZGVmIHRlc3RfcmV0cihzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAoJytPSyAxMTYgYnl0ZXMnLAorICAgICAgICAgICAgICAgICAgICBbJ0Zyb206IHBvc3RtYXN0ZXJAcHl0aG9uLm9yZycsICdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nLAorICAgICAgICAgICAgICAgICAgICAgJ01JTUUtVmVyc2lvbjogMS4wJywgJ1N1YmplY3Q6IER1bW15JywKKyAgICAgICAgICAgICAgICAgICAgICcnLCAnbGluZTEnLCAnbGluZTInLCAnbGluZTMnXSwKKyAgICAgICAgICAgICAgICAgICAgMTEzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnJldHIoJ2ZvbycpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2RlbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T0soc2VsZi5jbGllbnQuZGVsZSgnZm9vJykpCisKKyAgICBkZWYgdGVzdF9ub29wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9LKHNlbGYuY2xpZW50Lm5vb3AoKSkKKworICAgIGRlZiB0ZXN0X3Jwb3Aoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T0soc2VsZi5jbGllbnQucnBvcCgnZm9vJykpCisKKyAgICBkZWYgdGVzdF90b3Aoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gICgnK09LIDExNiBieXRlcycsCisgICAgICAgICAgICAgICAgICAgICBbJ0Zyb206IHBvc3RtYXN0ZXJAcHl0aG9uLm9yZycsICdDb250ZW50LVR5cGU6IHRleHQvcGxhaW4nLAorICAgICAgICAgICAgICAgICAgICAgICdNSU1FLVZlcnNpb246IDEuMCcsICdTdWJqZWN0OiBEdW1teScsICcnLAorICAgICAgICAgICAgICAgICAgICAgICdsaW5lMScsICdsaW5lMicsICdsaW5lMyddLAorICAgICAgICAgICAgICAgICAgICAgMTEzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnRvcCgxLCAxKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF91aWRsKHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC51aWRsKCkKKyAgICAgICAgc2VsZi5jbGllbnQudWlkbCgnZm9vJykKKworCitTVVBQT1JUU19TU0wgPSBGYWxzZQoraWYgaGFzYXR0cihwb3BsaWIsICdQT1AzX1NTTCcpOgorICAgIGltcG9ydCBzc2wKKworICAgIFNVUFBPUlRTX1NTTCA9IFRydWUKKyAgICBDRVJURklMRSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpciwgImtleWNlcnQucGVtIikKKworICAgIGNsYXNzIER1bW15UE9QM19TU0xIYW5kbGVyKER1bW15UE9QM0hhbmRsZXIpOgorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uKToKKyAgICAgICAgICAgIGFzeW5jaGF0LmFzeW5jX2NoYXQuX19pbml0X18oc2VsZiwgY29ubikKKyAgICAgICAgICAgIHNlbGYuc29ja2V0ID0gc3NsLndyYXBfc29ja2V0KHNlbGYuc29ja2V0LCBjZXJ0ZmlsZT1DRVJURklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9zaWRlPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgICAgICMgTXVzdCB0cnkgaGFuZHNoYWtlIGJlZm9yZSBjYWxsaW5nIHB1c2goKQorICAgICAgICAgICAgc2VsZi5fc3NsX2FjY2VwdGluZyA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuX2RvX3NzbF9oYW5kc2hha2UoKQorICAgICAgICAgICAgc2VsZi5zZXRfdGVybWluYXRvcigiXHJcbiIpCisgICAgICAgICAgICBzZWxmLmluX2J1ZmZlciA9IFtdCisgICAgICAgICAgICBzZWxmLnB1c2goJytPSyBkdW1teSBwb3AzIHNlcnZlciByZWFkeS4nKQorCisgICAgICAgIGRlZiBfZG9fc3NsX2hhbmRzaGFrZShzZWxmKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2tldC5kb19oYW5kc2hha2UoKQorICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdIGluIChzc2wuU1NMX0VSUk9SX1dBTlRfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLlNTTF9FUlJPUl9XQU5UX1dSSVRFKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZWxpZiBlcnIuYXJnc1swXSA9PSBzc2wuU1NMX0VSUk9SX0VPRjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlX2Nsb3NlKCkKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdID09IGVycm5vLkVDT05OQUJPUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlX2Nsb3NlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fc3NsX2FjY2VwdGluZyA9IEZhbHNlCisKKyAgICAgICAgZGVmIGhhbmRsZV9yZWFkKHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5fc3NsX2FjY2VwdGluZzoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb19zc2xfaGFuZHNoYWtlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgRHVtbXlQT1AzSGFuZGxlci5oYW5kbGVfcmVhZChzZWxmKQorCisgICAgY2xhc3MgVGVzdFBPUDNfU1NMQ2xhc3MoVGVzdFBPUDNDbGFzcyk6CisgICAgICAgICMgcmVwZWF0IHByZXZpb3VzIHRlc3RzIGJ5IHVzaW5nIHBvcGxpYi5QT1AzX1NTTAorCisgICAgICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyID0gRHVtbXlQT1AzU2VydmVyKChIT1NULCAwKSkKKyAgICAgICAgICAgIHNlbGYuc2VydmVyLmhhbmRsZXIgPSBEdW1teVBPUDNfU1NMSGFuZGxlcgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RhcnQoKQorICAgICAgICAgICAgc2VsZi5jbGllbnQgPSBwb3BsaWIuUE9QM19TU0woc2VsZi5zZXJ2ZXIuaG9zdCwgc2VsZi5zZXJ2ZXIucG9ydCkKKworICAgICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdQT1AzX1NTTCcsIHBvcGxpYi5fX2FsbF9fKQorCisKK2NsYXNzIFRlc3RUaW1lb3V0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZXZ0ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dCg2MCkgICMgU2FmZXR5IG5ldC4gTG9vayBpc3N1ZSAxMTgxMgorICAgICAgICBzZWxmLnBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc29jaykKKyAgICAgICAgc2VsZi50aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLnNlcnZlciwgYXJncz0oc2VsZi5ldnQsc2VsZi5zb2NrKSkKKyAgICAgICAgc2VsZi50aHJlYWQuc2V0RGFlbW9uKFRydWUpCisgICAgICAgIHNlbGYudGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5ldnQud2FpdCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGhyZWFkLmpvaW4oKQorICAgICAgICBkZWwgc2VsZi50aHJlYWQgICMgQ2xlYXIgb3V0IGFueSBkYW5nbGluZyBUaHJlYWQgb2JqZWN0cy4KKworICAgIGRlZiBzZXJ2ZXIoc2VsZiwgZXZ0LCBzZXJ2KToKKyAgICAgICAgc2Vydi5saXN0ZW4oNSkKKyAgICAgICAgZXZ0LnNldCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbm4sIGFkZHIgPSBzZXJ2LmFjY2VwdCgpCisgICAgICAgICAgICBjb25uLnNlbmQoIisgSG9sYSBtdW5kb1xuIikKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZXJ2LmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBvcCA9IHBvcGxpYi5QT1AzKEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvcC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisgICAgICAgIHBvcC5zb2NrLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dE5vbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBvcCA9IHBvcGxpYi5QT1AzKEhPU1QsIHNlbGYucG9ydCwgdGltZW91dD1Ob25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3Auc29jay5nZXR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgcG9wLnNvY2suY2xvc2UoKQorCisgICAgZGVmIHRlc3RUaW1lb3V0VmFsdWUoc2VsZik6CisgICAgICAgIHBvcCA9IHBvcGxpYi5QT1AzKEhPU1QsIHNlbGYucG9ydCwgdGltZW91dD0zMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3Auc29jay5nZXR0aW1lb3V0KCksIDMwKQorICAgICAgICBwb3Auc29jay5jbG9zZSgpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3RzID0gW1Rlc3RQT1AzQ2xhc3MsIFRlc3RUaW1lb3V0c10KKyAgICBpZiBTVVBQT1JUU19TU0w6CisgICAgICAgIHRlc3RzLmFwcGVuZChUZXN0UE9QM19TU0xDbGFzcykKKyAgICB0aHJlYWRfaW5mbyA9IHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQorICAgIHRyeToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCisgICAgZmluYWxseToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnRocmVhZGluZ19jbGVhbnVwKCp0aHJlYWRfaW5mbykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BsaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2Y3YmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BsaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWY4MWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3NpeC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvc2l4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYThjZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3NpeC5weQpAQCAtMCwwICsxLDU0NiBAQAorIlRlc3QgcG9zaXggZnVuY3Rpb25zIgorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisjIFNraXAgdGhlc2UgdGVzdHMgaWYgdGhlcmUgaXMgbm8gcG9zaXggbW9kdWxlLgorcG9zaXggPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgncG9zaXgnKQorCitpbXBvcnQgZXJybm8KK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgb3MKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHB3ZAoraW1wb3J0IHNodXRpbAoraW1wb3J0IHN0YXQKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKKworX0RVTU1ZX1NZTUxJTksgPSBvcy5wYXRoLmpvaW4odGVtcGZpbGUuZ2V0dGVtcGRpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiArICctZHVtbXktc3ltbGluaycpCisKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnLCAnLiogcG90ZW50aWFsIHNlY3VyaXR5IHJpc2sgLionLAorICAgICAgICAgICAgICAgICAgICAgICAgUnVudGltZVdhcm5pbmcpCisKK2NsYXNzIFBvc2l4VGVzdGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBjcmVhdGUgZW1wdHkgZmlsZQorICAgICAgICBmcCA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3crJykKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzZWxmLnRlYXJkb3duX2ZpbGVzID0gWyB0ZXN0X3N1cHBvcnQuVEVTVEZOIF0KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIHRlYXJkb3duX2ZpbGUgaW4gc2VsZi50ZWFyZG93bl9maWxlczoKKyAgICAgICAgICAgIG9zLnVubGluayh0ZWFyZG93bl9maWxlKQorCisgICAgZGVmIHRlc3ROb0FyZ0Z1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHBvc2l4IGZ1bmN0aW9ucyB3aGljaCB0YWtlIG5vIGFyZ3VtZW50cyBhbmQgaGF2ZQorICAgICAgICAjIG5vIHNpZGUtZWZmZWN0cyB3aGljaCB3ZSBuZWVkIHRvIGNsZWFudXAgKGUuZy4sIGZvcmssIHdhaXQsIGFib3J0KQorICAgICAgICBOT19BUkdfRlVOQ1RJT05TID0gWyAiY3Rlcm1pZCIsICJnZXRjd2QiLCAiZ2V0Y3dkdSIsICJ1bmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lcyIsICJnZXRsb2FkYXZnIiwgInRtcG5hbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRlZ2lkIiwgImdldGV1aWQiLCAiZ2V0Z2lkIiwgImdldGdyb3VwcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRwaWQiLCAiZ2V0cGdycCIsICJnZXRwcGlkIiwgImdldHVpZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBOT19BUkdfRlVOQ1RJT05TOgorICAgICAgICAgICAgICAgIHBvc2l4X2Z1bmMgPSBnZXRhdHRyKHBvc2l4LCBuYW1lLCBOb25lKQorICAgICAgICAgICAgICAgIGlmIHBvc2l4X2Z1bmMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHBvc2l4X2Z1bmMoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4X2Z1bmMsIDEpCisKKyAgICBpZiBoYXNhdHRyKHBvc2l4LCAnZ2V0cmVzdWlkJyk6CisgICAgICAgIGRlZiB0ZXN0X2dldHJlc3VpZChzZWxmKToKKyAgICAgICAgICAgIHVzZXJfaWRzID0gcG9zaXguZ2V0cmVzdWlkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHVzZXJfaWRzKSwgMykKKyAgICAgICAgICAgIGZvciB2YWwgaW4gdXNlcl9pZHM6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwodmFsLCAwKQorCisgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2dldHJlc2dpZCcpOgorICAgICAgICBkZWYgdGVzdF9nZXRyZXNnaWQoc2VsZik6CisgICAgICAgICAgICBncm91cF9pZHMgPSBwb3NpeC5nZXRyZXNnaWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ3JvdXBfaWRzKSwgMykKKyAgICAgICAgICAgIGZvciB2YWwgaW4gZ3JvdXBfaWRzOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKHZhbCwgMCkKKworICAgIGlmIGhhc2F0dHIocG9zaXgsICdzZXRyZXN1aWQnKToKKyAgICAgICAgZGVmIHRlc3Rfc2V0cmVzdWlkKHNlbGYpOgorICAgICAgICAgICAgY3VycmVudF91c2VyX2lkcyA9IHBvc2l4LmdldHJlc3VpZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwb3NpeC5zZXRyZXN1aWQoKmN1cnJlbnRfdXNlcl9pZHMpKQorICAgICAgICAgICAgIyAtMSBtZWFucyBkb24ndCBjaGFuZ2UgdGhhdCB2YWx1ZS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHBvc2l4LnNldHJlc3VpZCgtMSwgLTEsIC0xKSkKKworICAgICAgICBkZWYgdGVzdF9zZXRyZXN1aWRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAgICAgIyBEb24ndCBkbyB0aGlzIHRlc3QgaWYgc29tZW9uZSBpcyBzaWxseSBlbm91Z2ggdG8gcnVuIHVzIGFzIHJvb3QuCisgICAgICAgICAgICBjdXJyZW50X3VzZXJfaWRzID0gcG9zaXguZ2V0cmVzdWlkKCkKKyAgICAgICAgICAgIGlmIDAgbm90IGluIGN1cnJlbnRfdXNlcl9pZHM6CisgICAgICAgICAgICAgICAgbmV3X3VzZXJfaWRzID0gKGN1cnJlbnRfdXNlcl9pZHNbMF0rMSwgLTEsIC0xKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIHBvc2l4LnNldHJlc3VpZCwgKm5ld191c2VyX2lkcykKKworICAgIGlmIGhhc2F0dHIocG9zaXgsICdzZXRyZXNnaWQnKToKKyAgICAgICAgZGVmIHRlc3Rfc2V0cmVzZ2lkKHNlbGYpOgorICAgICAgICAgICAgY3VycmVudF9ncm91cF9pZHMgPSBwb3NpeC5nZXRyZXNnaWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocG9zaXguc2V0cmVzZ2lkKCpjdXJyZW50X2dyb3VwX2lkcykpCisgICAgICAgICAgICAjIC0xIG1lYW5zIGRvbid0IGNoYW5nZSB0aGF0IHZhbHVlLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocG9zaXguc2V0cmVzZ2lkKC0xLCAtMSwgLTEpKQorCisgICAgICAgIGRlZiB0ZXN0X3NldHJlc2dpZF9leGNlcHRpb24oc2VsZik6CisgICAgICAgICAgICAjIERvbid0IGRvIHRoaXMgdGVzdCBpZiBzb21lb25lIGlzIHNpbGx5IGVub3VnaCB0byBydW4gdXMgYXMgcm9vdC4KKyAgICAgICAgICAgIGN1cnJlbnRfZ3JvdXBfaWRzID0gcG9zaXguZ2V0cmVzZ2lkKCkKKyAgICAgICAgICAgIGlmIDAgbm90IGluIGN1cnJlbnRfZ3JvdXBfaWRzOgorICAgICAgICAgICAgICAgIG5ld19ncm91cF9pZHMgPSAoY3VycmVudF9ncm91cF9pZHNbMF0rMSwgLTEsIC0xKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIHBvc2l4LnNldHJlc2dpZCwgKm5ld19ncm91cF9pZHMpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAnaW5pdGdyb3VwcycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IG5lZWRzIG9zLmluaXRncm91cHMoKSIpCisgICAgZGVmIHRlc3RfaW5pdGdyb3VwcyhzZWxmKToKKyAgICAgICAgIyBJdCB0YWtlcyBhIHN0cmluZyBhbmQgYW4gaW50ZWdlcjsgY2hlY2sgdGhhdCBpdCByYWlzZXMgYSBUeXBlRXJyb3IKKyAgICAgICAgIyBmb3Igb3RoZXIgYXJndW1lbnQgbGlzdHMuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG9zaXguaW5pdGdyb3VwcykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb3NpeC5pbml0Z3JvdXBzLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4LmluaXRncm91cHMsIDMsICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4LmluaXRncm91cHMsICJmb28iLCAzLCBvYmplY3QoKSkKKworICAgICAgICAjIElmIGEgbm9uLXByaXZpbGVnZWQgdXNlciBpbnZva2VzIGl0LCBpdCBzaG91bGQgZmFpbCB3aXRoIE9TRXJyb3IKKyAgICAgICAgIyBFUEVSTS4KKyAgICAgICAgaWYgb3MuZ2V0dWlkKCkgIT0gMDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuYW1lID0gcHdkLmdldHB3dWlkKHBvc2l4LmdldHVpZCgpKS5wd19uYW1lCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgIyB0aGUgY3VycmVudCBVSUQgbWF5IG5vdCBoYXZlIGEgcHdkIGVudHJ5CisgICAgICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIm5lZWQgYSBwd2QgZW50cnkiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBvc2l4LmluaXRncm91cHMobmFtZSwgMTMpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lcnJubywgZXJybm8uRVBFUk0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRXhwZWN0ZWQgT1NFcnJvciB0byBiZSByYWlzZWQgYnkgaW5pdGdyb3VwcyIpCisKKyAgICBkZWYgdGVzdF9zdGF0dmZzKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnc3RhdHZmcycpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnN0YXR2ZnMob3MuY3VyZGlyKSkKKworICAgIGRlZiB0ZXN0X2ZzdGF0dmZzKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnZnN0YXR2ZnMnKToKKyAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5mc3RhdHZmcyhmcC5maWxlbm8oKSkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2Z0cnVuY2F0ZShzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2Z0cnVuY2F0ZScpOgorICAgICAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3KycpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyB3ZSBuZWVkIHRvIGhhdmUgc29tZSBkYXRhIHRvIHRydW5jYXRlCisgICAgICAgICAgICAgICAgZnAud3JpdGUoJ3Rlc3QnKQorICAgICAgICAgICAgICAgIGZwLmZsdXNoKCkKKyAgICAgICAgICAgICAgICBwb3NpeC5mdHJ1bmNhdGUoZnAuZmlsZW5vKCksIDApCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2R1cChzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2R1cCcpOgorICAgICAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmQgPSBwb3NpeC5kdXAoZnAuZmlsZW5vKCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZkLCBpbnQpCisgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2NvbmZzdHIoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdjb25mc3RyJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwb3NpeC5jb25mc3RyLCAiQ1NfZ2FyYmFnZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwb3NpeC5jb25mc3RyKCJDU19QQVRIIikpID4gMCwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2R1cDIoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdkdXAyJyk6CisgICAgICAgICAgICBmcDEgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBmcDIgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcG9zaXguZHVwMihmcDEuZmlsZW5vKCksIGZwMi5maWxlbm8oKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZnAxLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBmcDIuY2xvc2UoKQorCisgICAgZGVmIGZkb3Blbl9oZWxwZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBmZCA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuT19SRE9OTFkpCisgICAgICAgIGZwMiA9IHBvc2l4LmZkb3BlbihmZCwgKmFyZ3MpCisgICAgICAgIGZwMi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9mZG9wZW4oc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdmZG9wZW4nKToKKyAgICAgICAgICAgIHNlbGYuZmRvcGVuX2hlbHBlcigpCisgICAgICAgICAgICBzZWxmLmZkb3Blbl9oZWxwZXIoJ3InKQorICAgICAgICAgICAgc2VsZi5mZG9wZW5faGVscGVyKCdyJywgMTAwKQorCisgICAgZGVmIHRlc3Rfb3NleGxvY2soc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICJPX0VYTE9DSyIpOgorICAgICAgICAgICAgZmQgPSBvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgb3MuT19XUk9OTFl8b3MuT19FWExPQ0t8b3MuT19DUkVBVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIG9zLm9wZW4sIHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX1dST05MWXxvcy5PX0VYTE9DS3xvcy5PX05PTkJMT0NLKQorICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisKKyAgICAgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICJPX1NITE9DSyIpOgorICAgICAgICAgICAgICAgIGZkID0gb3Mub3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX1dST05MWXxvcy5PX1NITE9DS3xvcy5PX0NSRUFUKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIG9zLm9wZW4sIHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuT19XUk9OTFl8b3MuT19FWExPQ0t8b3MuT19OT05CTE9DSykKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKKworICAgIGRlZiB0ZXN0X29zc2hsb2NrKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAiT19TSExPQ0siKToKKyAgICAgICAgICAgIGZkMSA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX1dST05MWXxvcy5PX1NITE9DS3xvcy5PX0NSRUFUKQorICAgICAgICAgICAgZmQyID0gb3Mub3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX1dST05MWXxvcy5PX1NITE9DS3xvcy5PX0NSRUFUKQorICAgICAgICAgICAgb3MuY2xvc2UoZmQyKQorICAgICAgICAgICAgb3MuY2xvc2UoZmQxKQorCisgICAgICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAiT19FWExPQ0siKToKKyAgICAgICAgICAgICAgICBmZCA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuT19XUk9OTFl8b3MuT19TSExPQ0t8b3MuT19DUkVBVCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5vcGVuLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLk9fUkRPTkxZfG9zLk9fRVhMT0NLfG9zLk9fTk9OQkxPQ0spCisgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisKKyAgICBkZWYgdGVzdF9mc3RhdChzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2ZzdGF0Jyk6CisgICAgICAgICAgICBmcCA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXguZnN0YXQoZnAuZmlsZW5vKCkpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9zdGF0KHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnc3RhdCcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTikpCisKKyAgICBkZWYgX3Rlc3RfYWxsX2Nob3duX2NvbW1vbihzZWxmLCBjaG93bl9mdW5jLCBmaXJzdF9wYXJhbSwgc3RhdF9mdW5jKToKKyAgICAgICAgIiIiQ29tbW9uIGNvZGUgZm9yIGNob3duLCBmY2hvd24gYW5kIGxjaG93biB0ZXN0cy4iIiIKKyAgICAgICAgZGVmIGNoZWNrX3N0YXQodWlkLCBnaWQpOgorICAgICAgICAgICAgaWYgc3RhdF9mdW5jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHN0YXQgPSBzdGF0X2Z1bmMoZmlyc3RfcGFyYW0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0LnN0X3VpZCwgdWlkKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdC5zdF9naWQsIGdpZCkKKyAgICAgICAgdWlkID0gb3MuZ2V0dWlkKCkKKyAgICAgICAgZ2lkID0gb3MuZ2V0Z2lkKCkKKyAgICAgICAgIyB0ZXN0IGEgc3VjY2Vzc2Z1bCBjaG93biBjYWxsCisgICAgICAgIGNob3duX2Z1bmMoZmlyc3RfcGFyYW0sIHVpZCwgZ2lkKQorICAgICAgICBjaGVja19zdGF0KHVpZCwgZ2lkKQorICAgICAgICBjaG93bl9mdW5jKGZpcnN0X3BhcmFtLCAtMSwgZ2lkKQorICAgICAgICBjaGVja19zdGF0KHVpZCwgZ2lkKQorICAgICAgICBjaG93bl9mdW5jKGZpcnN0X3BhcmFtLCB1aWQsIC0xKQorICAgICAgICBjaGVja19zdGF0KHVpZCwgZ2lkKQorCisgICAgICAgIGlmIHVpZCA9PSAwOgorICAgICAgICAgICAgIyBUcnkgYW4gYW11c2luZ2x5IGxhcmdlIHVpZC9naWQgdG8gbWFrZSBzdXJlIHdlIGhhbmRsZQorICAgICAgICAgICAgIyBsYXJnZSB1bnNpZ25lZCB2YWx1ZXMuICAoY2hvd24gbGV0cyB5b3UgdXNlIGFueQorICAgICAgICAgICAgIyB1aWQvZ2lkIHlvdSBsaWtlLCBldmVuIGlmIHRoZXkgYXJlbid0IGRlZmluZWQuKQorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBUaGlzIHByb2JsZW0ga2VlcHMgY29taW5nIHVwOgorICAgICAgICAgICAgIyAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNzQ3ODU4CisgICAgICAgICAgICAjICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTQ1OTEKKyAgICAgICAgICAgICMgICBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTUzMDEKKyAgICAgICAgICAgICMgSG9wZWZ1bGx5IHRoZSBmaXggaW4gNDU5MSBmaXhlcyBpdCBmb3IgZ29vZCEKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhpcyBwYXJ0IG9mIHRoZSB0ZXN0IG9ubHkgcnVucyB3aGVuIHJ1biBhcyByb290LgorICAgICAgICAgICAgIyBPbmx5IHNjYXJ5IHBlb3BsZSBydW4gdGhlaXIgdGVzdHMgYXMgcm9vdC4KKworICAgICAgICAgICAgYmlnX3ZhbHVlID0gMioqMzEKKyAgICAgICAgICAgIGNob3duX2Z1bmMoZmlyc3RfcGFyYW0sIGJpZ192YWx1ZSwgYmlnX3ZhbHVlKQorICAgICAgICAgICAgY2hlY2tfc3RhdChiaWdfdmFsdWUsIGJpZ192YWx1ZSkKKyAgICAgICAgICAgIGNob3duX2Z1bmMoZmlyc3RfcGFyYW0sIC0xLCAtMSkKKyAgICAgICAgICAgIGNoZWNrX3N0YXQoYmlnX3ZhbHVlLCBiaWdfdmFsdWUpCisgICAgICAgICAgICBjaG93bl9mdW5jKGZpcnN0X3BhcmFtLCB1aWQsIGdpZCkKKyAgICAgICAgICAgIGNoZWNrX3N0YXQodWlkLCBnaWQpCisgICAgICAgIGVsaWYgcGxhdGZvcm0uc3lzdGVtKCkgaW4gKCdIUC1VWCcsICdTdW5PUycpOgorICAgICAgICAgICAgIyBIUC1VWCBhbmQgU29sYXJpcyBjYW4gYWxsb3cgYSBub24tcm9vdCB1c2VyIHRvIGNob3duKCkgdG8gcm9vdAorICAgICAgICAgICAgIyAoaXNzdWUgIzUxMTMpCisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiU2tpcHBpbmcgYmVjYXVzZSBvZiBub24tc3RhbmRhcmQgY2hvd24oKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVoYXZpb3IiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBub24tcm9vdCBjYW5ub3QgY2hvd24gdG8gcm9vdCwgcmFpc2VzIE9TRXJyb3IKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNob3duX2Z1bmMsIGZpcnN0X3BhcmFtLCAwLCAwKQorICAgICAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNob3duX2Z1bmMsIGZpcnN0X3BhcmFtLCAwLCAtMSkKKyAgICAgICAgICAgIGNoZWNrX3N0YXQodWlkLCBnaWQpCisgICAgICAgICAgICBpZiAwIG5vdCBpbiBvcy5nZXRncm91cHMoKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjaG93bl9mdW5jLCBmaXJzdF9wYXJhbSwgLTEsIDApCisgICAgICAgICAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKyAgICAgICAgIyB0ZXN0IGlsbGVnYWwgdHlwZXMKKyAgICAgICAgZm9yIHQgaW4gc3RyLCBmbG9hdDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2hvd25fZnVuYywgZmlyc3RfcGFyYW0sIHQodWlkKSwgZ2lkKQorICAgICAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2hvd25fZnVuYywgZmlyc3RfcGFyYW0sIHVpZCwgdChnaWQpKQorICAgICAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdjaG93bicpLCAidGVzdCBuZWVkcyBvcy5jaG93bigpIikKKyAgICBkZWYgdGVzdF9jaG93bihzZWxmKToKKyAgICAgICAgIyByYWlzZSBhbiBPU0Vycm9yIGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0CisgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBwb3NpeC5jaG93biwgdGVzdF9zdXBwb3J0LlRFU1RGTiwgLTEsIC0xKQorCisgICAgICAgICMgcmUtY3JlYXRlIHRoZSBmaWxlCisgICAgICAgIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3cnKS5jbG9zZSgpCisgICAgICAgIHNlbGYuX3Rlc3RfYWxsX2Nob3duX2NvbW1vbihwb3NpeC5jaG93biwgdGVzdF9zdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIocG9zaXgsICdzdGF0JywgTm9uZSkpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAnZmNob3duJyksICJ0ZXN0IG5lZWRzIG9zLmZjaG93bigpIikKKyAgICBkZWYgdGVzdF9mY2hvd24oc2VsZik6CisgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgICAgICMgcmUtY3JlYXRlIHRoZSBmaWxlCisgICAgICAgIHRlc3RfZmlsZSA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3cnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmZCA9IHRlc3RfZmlsZS5maWxlbm8oKQorICAgICAgICAgICAgc2VsZi5fdGVzdF9hbGxfY2hvd25fY29tbW9uKHBvc2l4LmZjaG93biwgZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihwb3NpeCwgJ2ZzdGF0JywgTm9uZSkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0ZXN0X2ZpbGUuY2xvc2UoKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ2xjaG93bicpLCAidGVzdCBuZWVkcyBvcy5sY2hvd24oKSIpCisgICAgZGVmIHRlc3RfbGNob3duKHNlbGYpOgorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgIyBjcmVhdGUgYSBzeW1saW5rCisgICAgICAgIG9zLnN5bWxpbmsoX0RVTU1ZX1NZTUxJTkssIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuX3Rlc3RfYWxsX2Nob3duX2NvbW1vbihwb3NpeC5sY2hvd24sIHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHBvc2l4LCAnbHN0YXQnLCBOb25lKSkKKworICAgIGRlZiB0ZXN0X2NoZGlyKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnY2hkaXInKToKKyAgICAgICAgICAgIHBvc2l4LmNoZGlyKG9zLmN1cmRpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIHBvc2l4LmNoZGlyLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfbHNkaXIoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdsc2RpcicpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCBwb3NpeC5sc2Rpcihvcy5jdXJkaXIpKQorCisgICAgZGVmIHRlc3RfYWNjZXNzKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnYWNjZXNzJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXguYWNjZXNzKHRlc3Rfc3VwcG9ydC5URVNURk4sIG9zLlJfT0spKQorCisgICAgZGVmIHRlc3RfdW1hc2soc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICd1bWFzaycpOgorICAgICAgICAgICAgb2xkX21hc2sgPSBwb3NpeC51bWFzaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG9sZF9tYXNrLCBpbnQpCisgICAgICAgICAgICBwb3NpeC51bWFzayhvbGRfbWFzaykKKworICAgIGRlZiB0ZXN0X3N0cmVycm9yKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnc3RyZXJyb3InKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5zdHJlcnJvcigwKSkKKworICAgIGRlZiB0ZXN0X3BpcGUoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdwaXBlJyk6CisgICAgICAgICAgICByZWFkZXIsIHdyaXRlciA9IHBvc2l4LnBpcGUoKQorICAgICAgICAgICAgb3MuY2xvc2UocmVhZGVyKQorICAgICAgICAgICAgb3MuY2xvc2Uod3JpdGVyKQorCisgICAgZGVmIHRlc3RfdGVtcG5hbShzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3RlbXBuYW0nKToKKyAgICAgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInRlbXBuYW0iLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnRlbXBuYW0oKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXgudGVtcG5hbShvcy5jdXJkaXIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC50ZW1wbmFtKG9zLmN1cmRpciwgJ2JsYWgnKSkKKworICAgIGRlZiB0ZXN0X3RtcGZpbGUoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICd0bXBmaWxlJyk6CisgICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0bXBmaWxlIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgICAgIGZwID0gcG9zaXgudG1wZmlsZSgpCisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfdXRpbWUoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICd1dGltZScpOgorICAgICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIHBvc2l4LnV0aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4sIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4LnV0aW1lLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCAoTm9uZSwgTm9uZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4LnV0aW1lLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCAobm93LCBOb25lKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG9zaXgudXRpbWUsIHRlc3Rfc3VwcG9ydC5URVNURk4sIChOb25lLCBub3cpKQorICAgICAgICAgICAgcG9zaXgudXRpbWUodGVzdF9zdXBwb3J0LlRFU1RGTiwgKGludChub3cpLCBpbnQobm93KSkpCisgICAgICAgICAgICBwb3NpeC51dGltZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAobm93LCBub3cpKQorCisgICAgZGVmIF90ZXN0X2NoZmxhZ3NfcmVndWxhcl9maWxlKHNlbGYsIGNoZmxhZ3NfZnVuYywgdGFyZ2V0X2ZpbGUpOgorICAgICAgICBzdCA9IG9zLnN0YXQodGFyZ2V0X2ZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHN0LCAnc3RfZmxhZ3MnKSkKKworICAgICAgICAjIFpGUyByZXR1cm5zIEVPUE5PVFNVUFAgd2hlbiBhdHRlbXB0aW5nIHRvIHNldCBmbGFnIFVGX0lNTVVUQUJMRS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2hmbGFnc19mdW5jKHRhcmdldF9maWxlLCBzdC5zdF9mbGFncyB8IHN0YXQuVUZfSU1NVVRBQkxFKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6CisgICAgICAgICAgICBpZiBlcnIuZXJybm8gIT0gZXJybm8uRU9QTk9UU1VQUDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgbXNnID0gJ2NoZmxhZyBVRl9JTU1VVEFCTEUgbm90IHN1cHBvcnRlZCBieSB1bmRlcmx5aW5nIGZzJworICAgICAgICAgICAgc2VsZi5za2lwVGVzdChtc2cpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV3X3N0ID0gb3Muc3RhdCh0YXJnZXRfZmlsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Quc3RfZmxhZ3MgfCBzdGF0LlVGX0lNTVVUQUJMRSwgbmV3X3N0LnN0X2ZsYWdzKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZkID0gb3Blbih0YXJnZXRfZmlsZSwgJ3crJykKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmVycm5vLCBlcnJuby5FUEVSTSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHBvc2l4LmNoZmxhZ3ModGFyZ2V0X2ZpbGUsIHN0LnN0X2ZsYWdzKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ2NoZmxhZ3MnKSwgJ3Rlc3QgbmVlZHMgb3MuY2hmbGFncygpJykKKyAgICBkZWYgdGVzdF9jaGZsYWdzKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2NoZmxhZ3NfcmVndWxhcl9maWxlKHBvc2l4LmNoZmxhZ3MsIHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAnbGNoZmxhZ3MnKSwgJ3Rlc3QgbmVlZHMgb3MubGNoZmxhZ3MoKScpCisgICAgZGVmIHRlc3RfbGNoZmxhZ3NfcmVndWxhcl9maWxlKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2NoZmxhZ3NfcmVndWxhcl9maWxlKHBvc2l4LmxjaGZsYWdzLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ2xjaGZsYWdzJyksICd0ZXN0IG5lZWRzIG9zLmxjaGZsYWdzKCknKQorICAgIGRlZiB0ZXN0X2xjaGZsYWdzX3N5bWxpbmsoc2VsZik6CisgICAgICAgIHRlc3Rmbl9zdCA9IG9zLnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cih0ZXN0Zm5fc3QsICdzdF9mbGFncycpKQorCisgICAgICAgIG9zLnN5bWxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTiwgX0RVTU1ZX1NZTUxJTkspCisgICAgICAgIHNlbGYudGVhcmRvd25fZmlsZXMuYXBwZW5kKF9EVU1NWV9TWU1MSU5LKQorICAgICAgICBkdW1teV9zeW1saW5rX3N0ID0gb3MubHN0YXQoX0RVTU1ZX1NZTUxJTkspCisKKyAgICAgICAgIyBaRlMgcmV0dXJucyBFT1BOT1RTVVBQIHdoZW4gYXR0ZW1wdGluZyB0byBzZXQgZmxhZyBVRl9JTU1VVEFCTEUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBvc2l4LmxjaGZsYWdzKF9EVU1NWV9TWU1MSU5LLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlfc3ltbGlua19zdC5zdF9mbGFncyB8IHN0YXQuVUZfSU1NVVRBQkxFKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6CisgICAgICAgICAgICBpZiBlcnIuZXJybm8gIT0gZXJybm8uRU9QTk9UU1VQUDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgbXNnID0gJ2NoZmxhZyBVRl9JTU1VVEFCTEUgbm90IHN1cHBvcnRlZCBieSB1bmRlcmx5aW5nIGZzJworICAgICAgICAgICAgc2VsZi5za2lwVGVzdChtc2cpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV3X3Rlc3Rmbl9zdCA9IG9zLnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIG5ld19kdW1teV9zeW1saW5rX3N0ID0gb3MubHN0YXQoX0RVTU1ZX1NZTUxJTkspCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdGZuX3N0LnN0X2ZsYWdzLCBuZXdfdGVzdGZuX3N0LnN0X2ZsYWdzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdW1teV9zeW1saW5rX3N0LnN0X2ZsYWdzIHwgc3RhdC5VRl9JTU1VVEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19kdW1teV9zeW1saW5rX3N0LnN0X2ZsYWdzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcG9zaXgubGNoZmxhZ3MoX0RVTU1ZX1NZTUxJTkssIGR1bW15X3N5bWxpbmtfc3Quc3RfZmxhZ3MpCisKKyAgICBkZWYgdGVzdF9nZXRjd2RfbG9uZ19wYXRobmFtZXMoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdnZXRjd2QnKToKKyAgICAgICAgICAgIGRpcm5hbWUgPSAnZ2V0Y3dkLXRlc3QtZGlyZWN0b3J5LTAxMjM0NTY3ODlhYmNkZWYtMDEyMzQ1Njc4OTBhYmNkZWYnCisgICAgICAgICAgICBjdXJkaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICAgICAgYmFzZV9wYXRoID0gb3MucGF0aC5hYnNwYXRoKHRlc3Rfc3VwcG9ydC5URVNURk4pICsgJy5nZXRjd2QnCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihiYXNlX3BhdGgpCisgICAgICAgICAgICAgICAgb3MuY2hkaXIoYmFzZV9wYXRoKQorICAgICAgICAgICAgZXhjZXB0OgorIyAgICAgICAgICAgICAgIEp1c3QgcmV0dXJuaW5nIG5vdGhpbmcgaW5zdGVhZCBvZiB0aGUgU2tpcFRlc3QgZXhjZXB0aW9uLAorIyAgICAgICAgICAgICAgIGJlY2F1c2UgdGhlIHRlc3QgcmVzdWx0cyBpbiBFcnJvciBpbiB0aGF0IGNhc2UuCisjICAgICAgICAgICAgICAgSXMgdGhhdCBvaz8KKyMgICAgICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QsICJjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBmb3IgdGVzdGluZyIKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlZiBfY3JlYXRlX2FuZF9kb19nZXRjd2QoZGlybmFtZSwgY3VycmVudF9wYXRoX2xlbmd0aCA9IDApOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5ta2RpcihkaXJuYW1lKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCwgIm1rZGlyIGNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5IHN1ZmZpY2llbnRseSBkZWVwIGZvciBnZXRjd2QgdGVzdCIKKworICAgICAgICAgICAgICAgICAgICBvcy5jaGRpcihkaXJuYW1lKQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5nZXRjd2QoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY3VycmVudF9wYXRoX2xlbmd0aCA8IDQwOTk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NyZWF0ZV9hbmRfZG9fZ2V0Y3dkKGRpcm5hbWUsIGN1cnJlbnRfcGF0aF9sZW5ndGggKyBsZW4oZGlybmFtZSkgKyAxKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZXJybm8gPSBlcnJuby5FTkFNRVRPT0xPTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyBwbGF0Zm9ybXMgaGF2ZSBxdWlya3kgZ2V0Y3dkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYmVoYXZpb3VyIC0tIHNlZSBpc3N1ZSA5MTg1IGFuZCAxNTc2NSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIHF1aXJreV9wbGF0Zm9ybSA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3Vub3MnIGluIHN5cy5wbGF0Zm9ybSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICduZXRic2QnIGluIHN5cy5wbGF0Zm9ybSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcGVuYnNkJyBpbiBzeXMucGxhdGZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHF1aXJreV9wbGF0Zm9ybToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9lcnJubyA9IGVycm5vLkVSQU5HRQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmVycm5vLCBleHBlY3RlZF9lcnJubykKKyAgICAgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNoZGlyKCcuLicpCisgICAgICAgICAgICAgICAgICAgICAgICBvcy5ybWRpcihkaXJuYW1lKQorCisgICAgICAgICAgICAgICAgX2NyZWF0ZV9hbmRfZG9fZ2V0Y3dkKGRpcm5hbWUpCisKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIoY3VyZGlyKQorICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoYmFzZV9wYXRoKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2dldGVnaWQnKSwgInRlc3QgbmVlZHMgb3MuZ2V0ZWdpZCgpIikKKyAgICBkZWYgdGVzdF9nZXRncm91cHMoc2VsZik6CisgICAgICAgIHdpdGggb3MucG9wZW4oJ2lkIC1HJykgYXMgaWRnOgorICAgICAgICAgICAgZ3JvdXBzID0gaWRnLnJlYWQoKS5zdHJpcCgpCisgICAgICAgICAgICByZXQgPSBpZGcuY2xvc2UoKQorCisgICAgICAgIGlmIHJldCAhPSBOb25lIG9yIG5vdCBncm91cHM6CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgibmVlZCB3b3JraW5nICdpZCAtRyciKQorCisgICAgICAgICMgSXNzdWVzIDE2Njk4OiBPUyBYIEFCSXMgcHJpb3IgdG8gMTAuNiBoYXZlIGxpbWl0cyBvbiBnZXRncm91cHMoKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICBpbXBvcnQgc3lzY29uZmlnCisgICAgICAgICAgICBkdCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJykgb3IgJzEwLjAnCisgICAgICAgICAgICBpZiBmbG9hdChkdCkgPCAxMC42OgorICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJnZXRncm91cHMoMikgaXMgYnJva2VuIHByaW9yIHRvIDEwLjYiKQorCisgICAgICAgICMgJ2lkIC1HJyBhbmQgJ29zLmdldGdyb3VwcygpJyBzaG91bGQgcmV0dXJuIHRoZSBzYW1lCisgICAgICAgICMgZ3JvdXBzLCBpZ25vcmluZyBvcmRlciBhbmQgZHVwbGljYXRlcy4KKyAgICAgICAgIyAjMTA4MjIgLSBpdCBpcyBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHdoZXRoZXIgcG9zaXguZ2V0Z3JvdXBzKCkKKyAgICAgICAgIyBpbmNsdWRlcyB0aGUgZWZmZWN0aXZlIGdpZCBzbyB3ZSBpbmNsdWRlIGl0IGFueXdheSwgc2luY2UgaWQgLUcgZG9lcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIHNldChbaW50KHgpIGZvciB4IGluIGdyb3Vwcy5zcGxpdCgpXSksCisgICAgICAgICAgICAgICAgc2V0KHBvc2l4LmdldGdyb3VwcygpICsgW3Bvc2l4LmdldGVnaWQoKV0pKQorCitjbGFzcyBQb3NpeEdyb3Vwc1Rlc3Rlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIHBvc2l4LmdldHVpZCgpICE9IDA6CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgibm90IGVub3VnaCBwcml2aWxlZ2VzIikKKyAgICAgICAgaWYgbm90IGhhc2F0dHIocG9zaXgsICdnZXRncm91cHMnKToKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJuZWVkIHBvc2l4LmdldGdyb3VwcyIpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJnZXRncm91cHMoMikgaXMgYnJva2VuIG9uIE9TWCIpCisgICAgICAgIHNlbGYuc2F2ZWRfZ3JvdXBzID0gcG9zaXguZ2V0Z3JvdXBzKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3NldGdyb3VwcycpOgorICAgICAgICAgICAgcG9zaXguc2V0Z3JvdXBzKHNlbGYuc2F2ZWRfZ3JvdXBzKQorICAgICAgICBlbGlmIGhhc2F0dHIocG9zaXgsICdpbml0Z3JvdXBzJyk6CisgICAgICAgICAgICBuYW1lID0gcHdkLmdldHB3dWlkKHBvc2l4LmdldHVpZCgpKS5wd19uYW1lCisgICAgICAgICAgICBwb3NpeC5pbml0Z3JvdXBzKG5hbWUsIHNlbGYuc2F2ZWRfZ3JvdXBzWzBdKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ2luaXRncm91cHMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCBuZWVkcyBwb3NpeC5pbml0Z3JvdXBzKCkiKQorICAgIGRlZiB0ZXN0X2luaXRncm91cHMoc2VsZik6CisgICAgICAgICMgZmluZCBtaXNzaW5nIGdyb3VwCisKKyAgICAgICAgZyA9IG1heChzZWxmLnNhdmVkX2dyb3VwcykgKyAxCisgICAgICAgIG5hbWUgPSBwd2QuZ2V0cHd1aWQocG9zaXguZ2V0dWlkKCkpLnB3X25hbWUKKyAgICAgICAgcG9zaXguaW5pdGdyb3VwcyhuYW1lLCBnKQorICAgICAgICBzZWxmLmFzc2VydEluKGcsIHBvc2l4LmdldGdyb3VwcygpKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ3NldGdyb3VwcycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IG5lZWRzIHBvc2l4LnNldGdyb3VwcygpIikKKyAgICBkZWYgdGVzdF9zZXRncm91cHMoc2VsZik6CisgICAgICAgIGZvciBncm91cHMgaW4gW1swXSwgcmFuZ2UoMTYpXToKKyAgICAgICAgICAgIHBvc2l4LnNldGdyb3Vwcyhncm91cHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbChncm91cHMsIHBvc2l4LmdldGdyb3VwcygpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFBvc2l4VGVzdGVyLCBQb3NpeEdyb3Vwc1Rlc3RlcikKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDVhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3NpeC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDVhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3NpeC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NGRjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3NpeHBhdGgucHkKQEAgLTAsMCArMSw0MjMgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQsIHRlc3RfZ2VuZXJpY3BhdGgKKworaW1wb3J0IHBvc2l4cGF0aCwgb3MKK2Zyb20gcG9zaXhwYXRoIGltcG9ydCByZWFscGF0aCwgYWJzcGF0aCwgZGlybmFtZSwgYmFzZW5hbWUKKworIyBBbiBhYnNvbHV0ZSBwYXRoIHRvIGEgdGVtcG9yYXJ5IGZpbGVuYW1lIGZvciB0ZXN0aW5nLiBXZSBjYW4ndCByZWx5IG9uIFRFU1RGTgorIyBiZWluZyBhbiBhYnNvbHV0ZSBwYXRoLCBzbyB3ZSBuZWVkIHRoaXMuCisKK0FCU1RGTiA9IGFic3BhdGgodGVzdF9zdXBwb3J0LlRFU1RGTikKKworZGVmIHNraXBfaWZfQUJTVEZOX2NvbnRhaW5zX2JhY2tzbGFzaCh0ZXN0KToKKyAgICAiIiIKKyAgICBPbiBXaW5kb3dzLCBwb3NpeHBhdGguYWJzcGF0aCBzdGlsbCByZXR1cm5zIHBhdGhzIHdpdGggYmFja3NsYXNoZXMKKyAgICBpbnN0ZWFkIG9mIHBvc2l4IGZvcndhcmQgc2xhc2hlcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgc2V2ZXJhbCB0ZXN0cworICAgIGZhaWwsIHNvIHNraXAgdGhlbS4KKyAgICAiIiIKKyAgICBmb3VuZF9iYWNrc2xhc2ggPSAnXFwnIGluIEFCU1RGTgorICAgIG1zZyA9ICJBQlNURk4gaXMgbm90IGEgcG9zaXggcGF0aCAtIHRlc3RzIGZhaWwiCisgICAgcmV0dXJuIFt0ZXN0LCB1bml0dGVzdC5za2lwKG1zZykodGVzdCldW2ZvdW5kX2JhY2tzbGFzaF0KKworZGVmIHNhZmVfcm1kaXIoZGlybmFtZSk6CisgICAgdHJ5OgorICAgICAgICBvcy5ybWRpcihkaXJuYW1lKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBwYXNzCisKK2NsYXNzIFBvc2l4UGF0aFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRlYXJEb3duKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIHN1ZmZpeCBpbiBbIiIsICIxIiwgIjIiXToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTiArIHN1ZmZpeCkKKyAgICAgICAgICAgIHNhZmVfcm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTiArIHN1ZmZpeCkKKworICAgIGRlZiB0ZXN0X2pvaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLmpvaW4oIi9mb28iLCAiYmFyIiwgIi9iYXIiLCAiYmF6IiksICIvYmFyL2JheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLmpvaW4oIi9mb28iLCAiYmFyIiwgImJheiIpLCAiL2Zvby9iYXIvYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguam9pbigiL2Zvby8iLCAiYmFyLyIsICJiYXovIiksICIvZm9vL2Jhci9iYXovIikKKworICAgIGRlZiB0ZXN0X3NwbGl0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5zcGxpdCgiL2Zvby9iYXIiKSwgKCIvZm9vIiwgImJhciIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5zcGxpdCgiLyIpLCAoIi8iLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnNwbGl0KCJmb28iKSwgKCIiLCAiZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnNwbGl0KCIvLy8vZm9vIiksICgiLy8vLyIsICJmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguc3BsaXQoIi8vZm9vLy9iYXIiKSwgKCIvL2ZvbyIsICJiYXIiKSkKKworICAgIGRlZiBzcGxpdGV4dFRlc3Qoc2VsZiwgcGF0aCwgZmlsZW5hbWUsIGV4dCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnNwbGl0ZXh0KHBhdGgpLCAoZmlsZW5hbWUsIGV4dCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnNwbGl0ZXh0KCIvIiArIHBhdGgpLCAoIi8iICsgZmlsZW5hbWUsIGV4dCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnNwbGl0ZXh0KCJhYmMvIiArIHBhdGgpLCAoImFiYy8iICsgZmlsZW5hbWUsIGV4dCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnNwbGl0ZXh0KCJhYmMuZGVmLyIgKyBwYXRoKSwgKCJhYmMuZGVmLyIgKyBmaWxlbmFtZSwgZXh0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguc3BsaXRleHQoIi9hYmMuZGVmLyIgKyBwYXRoKSwgKCIvYWJjLmRlZi8iICsgZmlsZW5hbWUsIGV4dCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnNwbGl0ZXh0KHBhdGggKyAiLyIpLCAoZmlsZW5hbWUgKyBleHQgKyAiLyIsICIiKSkKKworICAgIGRlZiB0ZXN0X3NwbGl0ZXh0KHNlbGYpOgorICAgICAgICBzZWxmLnNwbGl0ZXh0VGVzdCgiZm9vLmJhciIsICJmb28iLCAiLmJhciIpCisgICAgICAgIHNlbGYuc3BsaXRleHRUZXN0KCJmb28uYm9vLmJhciIsICJmb28uYm9vIiwgIi5iYXIiKQorICAgICAgICBzZWxmLnNwbGl0ZXh0VGVzdCgiZm9vLmJvby5iaWZmLmJhciIsICJmb28uYm9vLmJpZmYiLCAiLmJhciIpCisgICAgICAgIHNlbGYuc3BsaXRleHRUZXN0KCIuY3NoLnJjIiwgIi5jc2giLCAiLnJjIikKKyAgICAgICAgc2VsZi5zcGxpdGV4dFRlc3QoIm5vZG90cyIsICJub2RvdHMiLCAiIikKKyAgICAgICAgc2VsZi5zcGxpdGV4dFRlc3QoIi5jc2hyYyIsICIuY3NocmMiLCAiIikKKyAgICAgICAgc2VsZi5zcGxpdGV4dFRlc3QoIi4uLm1hbnlkb3RzIiwgIi4uLm1hbnlkb3RzIiwgIiIpCisgICAgICAgIHNlbGYuc3BsaXRleHRUZXN0KCIuLi5tYW55ZG90cy5leHQiLCAiLi4ubWFueWRvdHMiLCAiLmV4dCIpCisgICAgICAgIHNlbGYuc3BsaXRleHRUZXN0KCIuIiwgIi4iLCAiIikKKyAgICAgICAgc2VsZi5zcGxpdGV4dFRlc3QoIi4uIiwgIi4uIiwgIiIpCisgICAgICAgIHNlbGYuc3BsaXRleHRUZXN0KCIuLi4uLi4uLiIsICIuLi4uLi4uLiIsICIiKQorICAgICAgICBzZWxmLnNwbGl0ZXh0VGVzdCgiIiwgIiIsICIiKQorCisgICAgZGVmIHRlc3RfaXNhYnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMocG9zaXhwYXRoLmlzYWJzKCIiKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocG9zaXhwYXRoLmlzYWJzKCIvIiksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocG9zaXhwYXRoLmlzYWJzKCIvZm9vIiksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocG9zaXhwYXRoLmlzYWJzKCIvZm9vL2JhciIpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKHBvc2l4cGF0aC5pc2FicygiZm9vL2JhciIpLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2Jhc2VuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5iYXNlbmFtZSgiL2Zvby9iYXIiKSwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLmJhc2VuYW1lKCIvIiksICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5iYXNlbmFtZSgiZm9vIiksICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5iYXNlbmFtZSgiLy8vL2ZvbyIpLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguYmFzZW5hbWUoIi8vZm9vLy9iYXIiKSwgImJhciIpCisKKyAgICBkZWYgdGVzdF9kaXJuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5kaXJuYW1lKCIvZm9vL2JhciIpLCAiL2ZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLmRpcm5hbWUoIi8iKSwgIi8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5kaXJuYW1lKCJmb28iKSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLmRpcm5hbWUoIi8vLy9mb28iKSwgIi8vLy8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5kaXJuYW1lKCIvL2Zvby8vYmFyIiksICIvL2ZvbyIpCisKKyAgICBkZWYgdGVzdF9pc2xpbmsoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMocG9zaXhwYXRoLmlzbGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiKSwgRmFsc2UpCisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMocG9zaXhwYXRoLmlzbGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiKSwgRmFsc2UpCisgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAic3ltbGluayIpOgorICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiwgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHBvc2l4cGF0aC5pc2xpbmsodGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIiksIFRydWUpCisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhwb3NpeHBhdGguaXNsaW5rKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpLCBUcnVlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMocG9zaXhwYXRoLmV4aXN0cyh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiKSwgRmFsc2UpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhwb3NpeHBhdGgubGV4aXN0cyh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiKSwgVHJ1ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlKCk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9zYW1lZmlsZShzZWxmKToKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiZm9vIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcygKKyAgICAgICAgICAgICAgICBwb3NpeHBhdGguc2FtZWZpbGUoCisgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsCisgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIFRydWUKKyAgICAgICAgICAgICkKKworICAgICAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGxpbmtzLCBhc3N1bWUgdGhhdCBvcy5zdGF0IGRvZXNuJ3QgcmV0dXJuCisgICAgICAgICAgICAjIHJlYXNvbmFibGUgaW5vZGUgaW5mb3JtYXRpb24gYW5kIHRodXMsIHRoYXQgc2FtZWZpbGUoKSBkb2Vzbid0CisgICAgICAgICAgICAjIHdvcmsuCisgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAic3ltbGluayIpOgorICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsoCisgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsCisgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcygKKyAgICAgICAgICAgICAgICAgICAgcG9zaXhwYXRoLnNhbWVmaWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgVHJ1ZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIikKKyAgICAgICAgICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiLCAid2IiKQorICAgICAgICAgICAgICAgIGYud3JpdGUoImJhciIpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcygKKyAgICAgICAgICAgICAgICAgICAgcG9zaXhwYXRoLnNhbWVmaWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgRmFsc2UKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3Rfc2FtZXN0YXQoc2VsZik6CisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoCisgICAgICAgICAgICAgICAgcG9zaXhwYXRoLnNhbWVzdGF0KAorICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIpLAorICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIpCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICBUcnVlCisgICAgICAgICAgICApCisgICAgICAgICAgICAjIElmIHdlIGRvbid0IGhhdmUgbGlua3MsIGFzc3VtZSB0aGF0IG9zLnN0YXQoKSBkb2Vzbid0IHJldHVybgorICAgICAgICAgICAgIyByZWFzb25hYmxlIGlub2RlIGluZm9ybWF0aW9uIGFuZCB0aHVzLCB0aGF0IHNhbWVzdGF0KCkgZG9lc24ndAorICAgICAgICAgICAgIyB3b3JrLgorICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcygKKyAgICAgICAgICAgICAgICAgICAgcG9zaXhwYXRoLnNhbWVzdGF0KAorICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdCh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIikKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgVHJ1ZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIikKKyAgICAgICAgICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiLCAid2IiKQorICAgICAgICAgICAgICAgIGYud3JpdGUoImJhciIpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcygKKyAgICAgICAgICAgICAgICAgICAgcG9zaXhwYXRoLnNhbWVzdGF0KAorICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdCh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIikKKyAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgRmFsc2UKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfaXNtb3VudChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhwb3NpeHBhdGguaXNtb3VudCgiLyIpLCBUcnVlKQorCisgICAgZGVmIHRlc3RfZXhwYW5kdXNlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguZXhwYW5kdXNlcigiZm9vIiksICJmb28iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgcHdkCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwb3NpeHBhdGguZXhwYW5kdXNlcigifi8iKSwgYmFzZXN0cmluZykKKyAgICAgICAgICAgICMgaWYgaG9tZSBkaXJlY3RvcnkgPT0gcm9vdCBkaXJlY3RvcnksIHRoaXMgdGVzdCBtYWtlcyBubyBzZW5zZQorICAgICAgICAgICAgaWYgcG9zaXhwYXRoLmV4cGFuZHVzZXIoIn4iKSAhPSAnLyc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgcG9zaXhwYXRoLmV4cGFuZHVzZXIoIn4iKSArICIvIiwKKyAgICAgICAgICAgICAgICAgICAgcG9zaXhwYXRoLmV4cGFuZHVzZXIoIn4vIikKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocG9zaXhwYXRoLmV4cGFuZHVzZXIoIn5yb290LyIpLCBiYXNlc3RyaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBvc2l4cGF0aC5leHBhbmR1c2VyKCJ+Zm9vLyIpLCBiYXNlc3RyaW5nKQorCisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52OgorICAgICAgICAgICAgICAgIGVudlsnSE9NRSddID0gJy8nCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguZXhwYW5kdXNlcigifiIpLCAiLyIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguZXhwYW5kdXNlcigifi9mb28iKSwgIi9mb28iKQorCisgICAgZGVmIHRlc3Rfbm9ybXBhdGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLm5vcm1wYXRoKCIiKSwgIi4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5ub3JtcGF0aCgiLyIpLCAiLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLm5vcm1wYXRoKCIvLyIpLCAiLy8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5ub3JtcGF0aCgiLy8vIiksICIvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgubm9ybXBhdGgoIi8vL2Zvby8uLy9iYXIvLyIpLCAiL2Zvby9iYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5ub3JtcGF0aCgiLy8vZm9vLy4vL2Jhci8vLi8vLi4vLy4vL2JheiIpLCAiL2Zvby9iYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5ub3JtcGF0aCgiLy8vLi4vLy4vZm9vLy4vL2JhciIpLCAiL2Zvby9iYXIiKQorCisgICAgQHNraXBfaWZfQUJTVEZOX2NvbnRhaW5zX2JhY2tzbGFzaAorICAgIGRlZiB0ZXN0X3JlYWxwYXRoX2N1cmRpcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aCgnLicpLCBvcy5nZXRjd2QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aCgnLi8uJyksIG9zLmdldGN3ZCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKCcvJy5qb2luKFsnLiddICogMTAwKSksIG9zLmdldGN3ZCgpKQorCisgICAgQHNraXBfaWZfQUJTVEZOX2NvbnRhaW5zX2JhY2tzbGFzaAorICAgIGRlZiB0ZXN0X3JlYWxwYXRoX3BhcmRpcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aCgnLi4nKSwgZGlybmFtZShvcy5nZXRjd2QoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoJy4uLy4uJyksIGRpcm5hbWUoZGlybmFtZShvcy5nZXRjd2QoKSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKCcvJy5qb2luKFsnLi4nXSAqIDEwMCkpLCAnLycpCisKKyAgICBpZiBoYXNhdHRyKG9zLCAic3ltbGluayIpOgorICAgICAgICBkZWYgdGVzdF9yZWFscGF0aF9iYXNpYyhzZWxmKToKKyAgICAgICAgICAgICMgQmFzaWMgb3BlcmF0aW9uLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsoQUJTVEZOKyIxIiwgQUJTVEZOKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKSwgQUJTVEZOKyIxIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhBQlNURk4pCisKKyAgICAgICAgZGVmIHRlc3RfcmVhbHBhdGhfc3ltbGlua19sb29wcyhzZWxmKToKKyAgICAgICAgICAgICMgQnVnICM5MzAwMjQsIHJldHVybiB0aGUgcGF0aCB1bmNoYW5nZWQgaWYgd2UgZ2V0IGludG8gYW4gaW5maW5pdGUKKyAgICAgICAgICAgICMgc3ltbGluayBsb29wLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9sZF9wYXRoID0gYWJzcGF0aCgnLicpCisgICAgICAgICAgICAgICAgb3Muc3ltbGluayhBQlNURk4sIEFCU1RGTikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKEFCU1RGTiksIEFCU1RGTikKKworICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsoQUJTVEZOKyIxIiwgQUJTVEZOKyIyIikKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKEFCU1RGTisiMiIsIEFCU1RGTisiMSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4rIjEiKSwgQUJTVEZOKyIxIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKEFCU1RGTisiMiIpLCBBQlNURk4rIjIiKQorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4rIjEveCIpLCBBQlNURk4rIjEveCIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4rIjEvLi4iKSwgZGlybmFtZShBQlNURk4pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKyIxLy4uL3giKSwgZGlybmFtZShBQlNURk4pICsgIi94IikKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKEFCU1RGTisieCIsIEFCU1RGTisieSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4rIjEvLi4vIiArIGJhc2VuYW1lKEFCU1RGTikgKyAieSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlNURk4gKyAieSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4rIjEvLi4vIiArIGJhc2VuYW1lKEFCU1RGTikgKyAiMSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlNURk4gKyAiMSIpCisKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKGJhc2VuYW1lKEFCU1RGTikgKyAiYS9iIiwgQUJTVEZOKyJhIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKEFCU1RGTisiYSIpLCBBQlNURk4rImEvYiIpCisKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKCIuLi8iICsgYmFzZW5hbWUoZGlybmFtZShBQlNURk4pKSArICIvIiArCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZShBQlNURk4pICsgImMiLCBBQlNURk4rImMiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKyJjIiksIEFCU1RGTisiYyIpCisKKyAgICAgICAgICAgICAgICAjIFRlc3QgdXNpbmcgcmVsYXRpdmUgcGF0aCBhcyB3ZWxsLgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKGRpcm5hbWUoQUJTVEZOKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKGJhc2VuYW1lKEFCU1RGTikpLCBBQlNURk4pCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9wYXRoKQorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoQUJTVEZOKQorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoQUJTVEZOKyIxIikKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKEFCU1RGTisiMiIpCisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhBQlNURk4rInkiKQorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoQUJTVEZOKyJjIikKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKEFCU1RGTisiYSIpCisKKyAgICAgICAgZGVmIHRlc3RfcmVhbHBhdGhfcmVwZWF0ZWRfaW5kaXJlY3Rfc3ltbGlua3Moc2VsZik6CisgICAgICAgICAgICAjIElzc3VlICM2OTc1LgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLm1rZGlyKEFCU1RGTikKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKCcuLi8nICsgYmFzZW5hbWUoQUJTVEZOKSwgQUJTVEZOICsgJy9zZWxmJykKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKCdzZWxmL3NlbGYvc2VsZicsIEFCU1RGTiArICcvbGluaycpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4gKyAnL2xpbmsnKSwgQUJTVEZOKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKEFCU1RGTiArICcvc2VsZicpCisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhBQlNURk4gKyAnL2xpbmsnKQorICAgICAgICAgICAgICAgIHNhZmVfcm1kaXIoQUJTVEZOKQorCisgICAgICAgIGRlZiB0ZXN0X3JlYWxwYXRoX2RlZXBfcmVjdXJzaW9uKHNlbGYpOgorICAgICAgICAgICAgZGVwdGggPSAxMAorICAgICAgICAgICAgb2xkX3BhdGggPSBhYnNwYXRoKCcuJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihBQlNURk4pCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZGVwdGgpOgorICAgICAgICAgICAgICAgICAgICBvcy5zeW1saW5rKCcvJy5qb2luKFsnJWQnICUgaV0gKiAxMCksIEFCU1RGTiArICcvJWQnICUgKGkgKyAxKSkKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKCcuJywgQUJTVEZOICsgJy8wJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKEFCU1RGTiArICcvJWQnICUgZGVwdGgpLCBBQlNURk4pCisKKyAgICAgICAgICAgICAgICAjIFRlc3QgdXNpbmcgcmVsYXRpdmUgcGF0aCBhcyB3ZWxsLgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKEFCU1RGTikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKCclZCcgJSBkZXB0aCksIEFCU1RGTikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIob2xkX3BhdGgpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZGVwdGggKyAxKToKKyAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhBQlNURk4gKyAnLyVkJyAlIGkpCisgICAgICAgICAgICAgICAgc2FmZV9ybWRpcihBQlNURk4pCisKKyAgICAgICAgZGVmIHRlc3RfcmVhbHBhdGhfcmVzb2x2ZV9wYXJlbnRzKHNlbGYpOgorICAgICAgICAgICAgIyBXZSBhbHNvIG5lZWQgdG8gcmVzb2x2ZSBhbnkgc3ltbGlua3MgaW4gdGhlIHBhcmVudHMgb2YgYSByZWxhdGl2ZQorICAgICAgICAgICAgIyBwYXRoIHBhc3NlZCB0byByZWFscGF0aC4gRS5nLjogY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBpcworICAgICAgICAgICAgIyAvdXNyL2RvYyB3aXRoICdkb2MnIGJlaW5nIGEgc3ltbGluayB0byAvdXNyL3NoYXJlL2RvYy4gV2UgY2FsbAorICAgICAgICAgICAgIyByZWFscGF0aCgiYSIpLiBUaGlzIHNob3VsZCByZXR1cm4gL3Vzci9zaGFyZS9kb2MvYS8uCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb2xkX3BhdGggPSBhYnNwYXRoKCcuJykKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihBQlNURk4pCisgICAgICAgICAgICAgICAgb3MubWtkaXIoQUJTVEZOICsgIi95IikKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKEFCU1RGTiArICIveSIsIEFCU1RGTiArICIvayIpCisKKyAgICAgICAgICAgICAgICBvcy5jaGRpcihBQlNURk4gKyAiL2siKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoImEiKSwgQUJTVEZOICsgIi95L2EiKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5jaGRpcihvbGRfcGF0aCkKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKEFCU1RGTiArICIvayIpCisgICAgICAgICAgICAgICAgc2FmZV9ybWRpcihBQlNURk4gKyAiL3kiKQorICAgICAgICAgICAgICAgIHNhZmVfcm1kaXIoQUJTVEZOKQorCisgICAgICAgIGRlZiB0ZXN0X3JlYWxwYXRoX3Jlc29sdmVfYmVmb3JlX25vcm1hbGl6aW5nKHNlbGYpOgorICAgICAgICAgICAgIyBCdWcgIzk5MDY2OTogU3ltYm9saWMgbGlua3Mgc2hvdWxkIGJlIHJlc29sdmVkIGJlZm9yZSB3ZQorICAgICAgICAgICAgIyBub3JtYWxpemUgdGhlIHBhdGguIEUuZy46IGlmIHdlIGhhdmUgZGlyZWN0b3JpZXMgJ2EnLCAnaycgYW5kICd5JworICAgICAgICAgICAgIyBpbiB0aGUgZm9sbG93aW5nIGhpZXJhcmNoeToKKyAgICAgICAgICAgICMgYS9rL3kKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgYW5kIGEgc3ltYm9saWMgbGluayAnbGluay15JyBwb2ludGluZyB0byAneScgaW4gZGlyZWN0b3J5ICdhJywKKyAgICAgICAgICAgICMgdGhlbiByZWFscGF0aCgibGluay15Ly4uIikgc2hvdWxkIHJldHVybiAnaycsIG5vdCAnYScuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb2xkX3BhdGggPSBhYnNwYXRoKCcuJykKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihBQlNURk4pCisgICAgICAgICAgICAgICAgb3MubWtkaXIoQUJTVEZOICsgIi9rIikKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihBQlNURk4gKyAiL2sveSIpCisgICAgICAgICAgICAgICAgb3Muc3ltbGluayhBQlNURk4gKyAiL2sveSIsIEFCU1RGTiArICIvbGluay15IikKKworICAgICAgICAgICAgICAgICMgQWJzb2x1dGUgcGF0aC4KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKEFCU1RGTiArICIvbGluay15Ly4uIiksIEFCU1RGTiArICIvayIpCisgICAgICAgICAgICAgICAgIyBSZWxhdGl2ZSBwYXRoLgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKGRpcm5hbWUoQUJTVEZOKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKGJhc2VuYW1lKEFCU1RGTikgKyAiL2xpbmsteS8uLiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTVEZOICsgIi9rIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIob2xkX3BhdGgpCisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhBQlNURk4gKyAiL2xpbmsteSIpCisgICAgICAgICAgICAgICAgc2FmZV9ybWRpcihBQlNURk4gKyAiL2sveSIpCisgICAgICAgICAgICAgICAgc2FmZV9ybWRpcihBQlNURk4gKyAiL2siKQorICAgICAgICAgICAgICAgIHNhZmVfcm1kaXIoQUJTVEZOKQorCisgICAgICAgIGRlZiB0ZXN0X3JlYWxwYXRoX3Jlc29sdmVfZmlyc3Qoc2VsZik6CisgICAgICAgICAgICAjIEJ1ZyAjMTIxMzg5NDogVGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aCwgaWYgbm90IGFic29sdXRlLAorICAgICAgICAgICAgIyBtdXN0IGJlIHJlc29sdmVkIHRvby4KKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9sZF9wYXRoID0gYWJzcGF0aCgnLicpCisgICAgICAgICAgICAgICAgb3MubWtkaXIoQUJTVEZOKQorICAgICAgICAgICAgICAgIG9zLm1rZGlyKEFCU1RGTiArICIvayIpCisgICAgICAgICAgICAgICAgb3Muc3ltbGluayhBQlNURk4sIEFCU1RGTiArICJsaW5rIikKKyAgICAgICAgICAgICAgICBvcy5jaGRpcihkaXJuYW1lKEFCU1RGTikpCisKKyAgICAgICAgICAgICAgICBiYXNlID0gYmFzZW5hbWUoQUJTVEZOKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoYmFzZSArICJsaW5rIiksIEFCU1RGTikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKGJhc2UgKyAibGluay9rIiksIEFCU1RGTiArICIvayIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9wYXRoKQorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoQUJTVEZOICsgImxpbmsiKQorICAgICAgICAgICAgICAgIHNhZmVfcm1kaXIoQUJTVEZOICsgIi9rIikKKyAgICAgICAgICAgICAgICBzYWZlX3JtZGlyKEFCU1RGTikKKworICAgIGRlZiB0ZXN0X3JlbHBhdGgoc2VsZik6CisgICAgICAgIChyZWFsX2dldGN3ZCwgb3MuZ2V0Y3dkKSA9IChvcy5nZXRjd2QsIGxhbWJkYTogciIvaG9tZS91c2VyL2JhciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1cmRpciA9IG9zLnBhdGguc3BsaXQob3MuZ2V0Y3dkKCkpWy0xXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG9zaXhwYXRoLnJlbHBhdGgsICIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgucmVscGF0aCgiYSIpLCAiYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5yZWxwYXRoKHBvc2l4cGF0aC5hYnNwYXRoKCJhIikpLCAiYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5yZWxwYXRoKCJhL2IiKSwgImEvYiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5yZWxwYXRoKCIuLi9hL2IiKSwgIi4uL2EvYiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5yZWxwYXRoKCJhIiwgIi4uL2IiKSwgIi4uLyIrY3VyZGlyKyIvYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5yZWxwYXRoKCJhL2IiLCAiLi4vYyIpLCAiLi4vIitjdXJkaXIrIi9hL2IiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgucmVscGF0aCgiYSIsICJiL2MiKSwgIi4uLy4uL2EiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgucmVscGF0aCgiYSIsICJhIiksICIuIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnJlbHBhdGgoIi9mb28vYmFyL2JhdCIsICIveC95L3oiKSwgJy4uLy4uLy4uL2Zvby9iYXIvYmF0JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnJlbHBhdGgoIi9mb28vYmFyL2JhdCIsICIvZm9vL2JhciIpLCAnYmF0JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnJlbHBhdGgoIi9mb28vYmFyL2JhdCIsICIvIiksICdmb28vYmFyL2JhdCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5yZWxwYXRoKCIvIiwgIi9mb28vYmFyL2JhdCIpLCAnLi4vLi4vLi4nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgucmVscGF0aCgiL2Zvby9iYXIvYmF0IiwgIi94IiksICcuLi9mb28vYmFyL2JhdCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5yZWxwYXRoKCIveCIsICIvZm9vL2Jhci9iYXQiKSwgJy4uLy4uLy4uL3gnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgucmVscGF0aCgiLyIsICIvIiksICcuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnJlbHBhdGgoIi9hIiwgIi9hIiksICcuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnJlbHBhdGgoIi9hL2IiLCAiL2EvYiIpLCAnLicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5nZXRjd2QgPSByZWFsX2dldGN3ZAorCisKK2NsYXNzIFBvc2l4Q29tbW9uVGVzdCh0ZXN0X2dlbmVyaWNwYXRoLkNvbW1vblRlc3QpOgorICAgIHBhdGhtb2R1bGUgPSBwb3NpeHBhdGgKKyAgICBhdHRyaWJ1dGVzID0gWydyZWxwYXRoJywgJ3NhbWVmaWxlJywgJ3NhbWVvcGVuZmlsZScsICdzYW1lc3RhdCddCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUG9zaXhQYXRoVGVzdCwgUG9zaXhDb21tb25UZXN0KQorCisKK2lmIF9fbmFtZV9fPT0iX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3NpeHBhdGgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODk1MjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3NpeHBhdGgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODk1MjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3cucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlNjdiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvdy5weQpAQCAtMCwwICsxLDEyOSBAQAoraW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0LCB1bml0dGVzdAorCitjbGFzcyBQb3dUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBwb3d0ZXN0KHNlbGYsIHR5cGUpOgorICAgICAgICBpZiB0eXBlICE9IGZsb2F0OgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoLTEwMDAsIDEwMDApOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KHR5cGUoaSksIDApLCAxKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KHR5cGUoaSksIDEpLCB0eXBlKGkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KHR5cGUoMCksIDEpLCB0eXBlKDApKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KHR5cGUoMSksIDEpLCB0eXBlKDEpKQorCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgtMTAwLCAxMDApOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KHR5cGUoaSksIDMpLCBpKmkqaSkKKworICAgICAgICAgICAgcG93MiA9IDEKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsMzEpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDIsIGkpLCBwb3cyKQorICAgICAgICAgICAgICAgIGlmIGkgIT0gMzAgOiBwb3cyID0gcG93MioyCisKKyAgICAgICAgICAgIGZvciBvdGhlcnR5cGUgaW4gaW50LCBsb25nOgorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKC0xMCwgMCkgKyByYW5nZSgxLCAxMCk6CisgICAgICAgICAgICAgICAgICAgIGlpID0gdHlwZShpKQorICAgICAgICAgICAgICAgICAgICBmb3IgaiBpbiByYW5nZSgxLCAxMSk6CisgICAgICAgICAgICAgICAgICAgICAgICBqaiA9IC1vdGhlcnR5cGUoaikKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvdyhpaSwgamopCisKKyAgICAgICAgZm9yIG90aGVydHlwZSBpbiBpbnQsIGxvbmcsIGZsb2F0OgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgMTAwKToKKyAgICAgICAgICAgICAgICB6ZXJvID0gdHlwZSgwKQorICAgICAgICAgICAgICAgIGV4cCA9IC1vdGhlcnR5cGUoaS8xMC4wKQorICAgICAgICAgICAgICAgIGlmIGV4cCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBwb3csIHplcm8sIGV4cCkKKworICAgICAgICBpbCwgaWggPSAtMjAsIDIwCisgICAgICAgIGpsLCBqaCA9IC01LCAgIDUKKyAgICAgICAga2wsIGtoID0gLTEwLCAxMAorICAgICAgICBhc3NlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaWYgdHlwZSA9PSBmbG9hdDoKKyAgICAgICAgICAgIGlsID0gMQorICAgICAgICAgICAgYXNzZXEgPSBzZWxmLmFzc2VydEFsbW9zdEVxdWFsCisgICAgICAgIGVsaWYgdHlwZSA9PSBpbnQ6CisgICAgICAgICAgICBqbCA9IDAKKyAgICAgICAgZWxpZiB0eXBlID09IGxvbmc6CisgICAgICAgICAgICBqbCwgamggPSAwLCAxNQorICAgICAgICBmb3IgaSBpbiByYW5nZShpbCwgaWgrMSk6CisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZShqbCwgamgrMSk6CisgICAgICAgICAgICAgICAgZm9yIGsgaW4gcmFuZ2Uoa2wsIGtoKzEpOgorICAgICAgICAgICAgICAgICAgICBpZiBrICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0eXBlID09IGZsb2F0IG9yIGogPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG93LCB0eXBlKGkpLCBqLCBrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3codHlwZShpKSxqLGspLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdyh0eXBlKGkpLGopJSB0eXBlKGspCisgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9wb3dpbnQoc2VsZik6CisgICAgICAgIHNlbGYucG93dGVzdChpbnQpCisKKyAgICBkZWYgdGVzdF9wb3dsb25nKHNlbGYpOgorICAgICAgICBzZWxmLnBvd3Rlc3QobG9uZykKKworICAgIGRlZiB0ZXN0X3Bvd2Zsb2F0KHNlbGYpOgorICAgICAgICBzZWxmLnBvd3Rlc3QoZmxvYXQpCisKKyAgICBkZWYgdGVzdF9vdGhlcihzZWxmKToKKyAgICAgICAgIyBPdGhlciB0ZXN0cy0tIG5vdCB2ZXJ5IHN5c3RlbWF0aWMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMywzKSAlIDgsIHBvdygzLDMsOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDMsMykgJSAtOCwgcG93KDMsMywtOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDMsMikgJSAtMiwgcG93KDMsMiwtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KC0zLDMpICUgOCwgcG93KC0zLDMsOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KC0zLDMpICUgLTgsIHBvdygtMywzLC04KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coNSwyKSAlIC04LCBwb3coNSwyLC04KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygzTCwzTCkgJSA4LCBwb3coM0wsM0wsOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDNMLDNMKSAlIC04LCBwb3coM0wsM0wsLTgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygzTCwyKSAlIC0yLCBwb3coM0wsMiwtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KC0zTCwzTCkgJSA4LCBwb3coLTNMLDNMLDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygtM0wsM0wpICUgLTgsIHBvdygtM0wsM0wsLTgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdyg1TCwyKSAlIC04LCBwb3coNUwsMiwtOCkpCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoLTEwLCAxMSk6CisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZSgwLCA2KToKKyAgICAgICAgICAgICAgICBmb3IgayBpbiByYW5nZSgtNywgMTEpOgorICAgICAgICAgICAgICAgICAgICBpZiBqID49IDAgYW5kIGsgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG93KGksaikgJSBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdyhpLGosaykKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgaWYgaiA+PSAwIGFuZCBrICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdyhsb25nKGkpLGopICUgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3cobG9uZyhpKSxqLGspCisgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9idWc2NDMyNjAoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3RScG93OgorICAgICAgICAgICAgZGVmIF9fcnBvd19fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBOb25lICoqIFRlc3RScG93KCkgIyBXb24ndCBmYWlsIHdoZW4gX19ycG93X18gaW52b2tlZC4gIFNGIGJ1ZyAjNjQzMjYwLgorCisgICAgZGVmIHRlc3RfYnVnNzA1MjMxKHNlbGYpOgorICAgICAgICAjIC0xLjAgcmFpc2VkIHRvIGFuIGludGVnZXIgc2hvdWxkIG5ldmVyIGJsb3cgdXAuICBJdCBkaWQgaWYgdGhlCisgICAgICAgICMgcGxhdGZvcm0gcG93KCkgd2FzIGJ1Z2d5LCBhbmQgUHl0aG9uIGRpZG4ndCB3b3JtIGFyb3VuZCBpdC4KKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGEgPSAtMS4wCisgICAgICAgICMgVGhlIG5leHQgdHdvIHRlc3RzIGNhbiBzdGlsbCBmYWlsIGlmIHRoZSBwbGF0Zm9ybSBmbG9vcigpCisgICAgICAgICMgZnVuY3Rpb24gZG9lc24ndCB0cmVhdCBhbGwgbGFyZ2UgaW5wdXRzIGFzIGludGVnZXJzCisgICAgICAgICMgdGVzdF9tYXRoIHNob3VsZCBhbHNvIGZhaWwgaWYgdGhhdCBpcyBoYXBwZW5pbmcKKyAgICAgICAgZXEocG93KGEsIDEuMjNlMTY3KSwgMS4wKQorICAgICAgICBlcShwb3coYSwgLTEuMjNlMTY3KSwgMS4wKQorICAgICAgICBmb3IgYiBpbiByYW5nZSgtMTAsIDExKToKKyAgICAgICAgICAgIGVxKHBvdyhhLCBmbG9hdChiKSksIGIgJiAxIGFuZCAtMS4wIG9yIDEuMCkKKyAgICAgICAgZm9yIG4gaW4gcmFuZ2UoMCwgMTAwKToKKyAgICAgICAgICAgIGZpdmV0byA9IGZsb2F0KDUgKiogbikKKyAgICAgICAgICAgICMgRm9yIHNtYWxsIG4sIGZpdmV0byB3aWxsIGJlIG9kZC4gIEV2ZW50dWFsbHkgd2UgcnVuIG91dCBvZgorICAgICAgICAgICAgIyBtYW50aXNzYSBiaXRzLCB0aG91Z2gsIGFuZCB0aGVyZWFmZXIgZml2ZXRvIHdpbGwgYmUgZXZlbi4KKyAgICAgICAgICAgIGV4cGVjdGVkID0gZml2ZXRvICUgMi4wIGFuZCAtMS4wIG9yIDEuMAorICAgICAgICAgICAgZXEocG93KGEsIGZpdmV0byksIGV4cGVjdGVkKQorICAgICAgICAgICAgZXEocG93KGEsIC1maXZldG8pLCBleHBlY3RlZCkKKyAgICAgICAgZXEoZXhwZWN0ZWQsIDEuMCkgICAjIGVsc2Ugd2UgZGlkbid0IHB1c2ggZml2ZXRvIHRvIGV2ZW5uZXNzCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUG93VGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG93LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvdy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdjZjM5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvdy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG93LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvdy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdjZjM5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvdy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHByaW50LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHByaW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTM3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcHJpbnQucHkKQEAgLTAsMCArMSw0MzIgQEAKK2ltcG9ydCBwcHJpbnQKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGVzdC50ZXN0X3NldAorCit0cnk6CisgICAgdW5pID0gdW5pY29kZQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBkZWYgdW5pKHgpOgorICAgICAgICByZXR1cm4geAorCisjIGxpc3QsIHR1cGxlIGFuZCBkaWN0IHN1YmNsYXNzZXMgdGhhdCBkbyBvciBkb24ndCBvdmVyd3JpdGUgX19yZXByX18KK2NsYXNzIGxpc3QyKGxpc3QpOgorICAgIHBhc3MKKworY2xhc3MgbGlzdDMobGlzdCk6CisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGlzdC5fX3JlcHJfXyhzZWxmKQorCitjbGFzcyB0dXBsZTIodHVwbGUpOgorICAgIHBhc3MKKworY2xhc3MgdHVwbGUzKHR1cGxlKToKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZS5fX3JlcHJfXyhzZWxmKQorCitjbGFzcyBkaWN0MihkaWN0KToKKyAgICBwYXNzCisKK2NsYXNzIGRpY3QzKGRpY3QpOgorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGRpY3QuX19yZXByX18oc2VsZikKKworY2xhc3MgUXVlcnlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuYSA9IHJhbmdlKDEwMCkKKyAgICAgICAgc2VsZi5iID0gcmFuZ2UoMjAwKQorICAgICAgICBzZWxmLmFbLTEyXSA9IHNlbGYuYgorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IC5pc3JlY3Vyc2l2ZSgpIGFuZCAuaXNyZWFkYWJsZSgpIHcvbyByZWN1cnNpb24KKyAgICAgICAgcHAgPSBwcHJpbnQuUHJldHR5UHJpbnRlcigpCisgICAgICAgIGZvciBzYWZlIGluICgyLCAyLjAsIDJqLCAiYWJjIiwgWzNdLCAoMiwyKSwgezM6IDN9LCB1bmkoInlhZGRheWFkZGEiKSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuYSwgc2VsZi5iKToKKyAgICAgICAgICAgICMgbW9kdWxlLWxldmVsIGNvbnZlbmllbmNlIGZ1bmN0aW9ucworICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwcHJpbnQuaXNyZWN1cnNpdmUoc2FmZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBub3QgaXNyZWN1cnNpdmUgZm9yICVyIiAlIChzYWZlLCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocHByaW50LmlzcmVhZGFibGUoc2FmZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGlzcmVhZGFibGUgZm9yICVyIiAlIChzYWZlLCkpCisgICAgICAgICAgICAjIFByZXR0eVByaW50ZXIgbWV0aG9kcworICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwcC5pc3JlY3Vyc2l2ZShzYWZlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIG5vdCBpc3JlY3Vyc2l2ZSBmb3IgJXIiICUgKHNhZmUsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcC5pc3JlYWRhYmxlKHNhZmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBpc3JlYWRhYmxlIGZvciAlciIgJSAoc2FmZSwpKQorCisgICAgZGVmIHRlc3Rfa25vdHRlZChzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgLmlzcmVjdXJzaXZlKCkgYW5kIC5pc3JlYWRhYmxlKCkgdy8gcmVjdXJzaW9uCisgICAgICAgICMgVGllIGEga25vdC4KKyAgICAgICAgc2VsZi5iWzY3XSA9IHNlbGYuYQorICAgICAgICAjIE1lc3N5IGRpY3QuCisgICAgICAgIHNlbGYuZCA9IHt9CisgICAgICAgIHNlbGYuZFswXSA9IHNlbGYuZFsxXSA9IHNlbGYuZFsyXSA9IHNlbGYuZAorCisgICAgICAgIHBwID0gcHByaW50LlByZXR0eVByaW50ZXIoKQorCisgICAgICAgIGZvciBpY2t5IGluIHNlbGYuYSwgc2VsZi5iLCBzZWxmLmQsIChzZWxmLmQsIHNlbGYuZCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocHByaW50LmlzcmVjdXJzaXZlKGlja3kpLCAiZXhwZWN0ZWQgaXNyZWN1cnNpdmUiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwcHJpbnQuaXNyZWFkYWJsZShpY2t5KSwgImV4cGVjdGVkIG5vdCBpc3JlYWRhYmxlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcC5pc3JlY3Vyc2l2ZShpY2t5KSwgImV4cGVjdGVkIGlzcmVjdXJzaXZlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHAuaXNyZWFkYWJsZShpY2t5KSwgImV4cGVjdGVkIG5vdCBpc3JlYWRhYmxlIikKKworICAgICAgICAjIEJyZWFrIHRoZSBjeWNsZXMuCisgICAgICAgIHNlbGYuZC5jbGVhcigpCisgICAgICAgIGRlbCBzZWxmLmFbOl0KKyAgICAgICAgZGVsIHNlbGYuYls6XQorCisgICAgICAgIGZvciBzYWZlIGluIHNlbGYuYSwgc2VsZi5iLCBzZWxmLmQsIChzZWxmLmQsIHNlbGYuZCk6CisgICAgICAgICAgICAjIG1vZHVsZS1sZXZlbCBjb252ZW5pZW5jZSBmdW5jdGlvbnMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHByaW50LmlzcmVjdXJzaXZlKHNhZmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgbm90IGlzcmVjdXJzaXZlIGZvciAlciIgJSAoc2FmZSwpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBwcmludC5pc3JlYWRhYmxlKHNhZmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBpc3JlYWRhYmxlIGZvciAlciIgJSAoc2FmZSwpKQorICAgICAgICAgICAgIyBQcmV0dHlQcmludGVyIG1ldGhvZHMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHAuaXNyZWN1cnNpdmUoc2FmZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBub3QgaXNyZWN1cnNpdmUgZm9yICVyIiAlIChzYWZlLCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocHAuaXNyZWFkYWJsZShzYWZlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgaXNyZWFkYWJsZSBmb3IgJXIiICUgKHNhZmUsKSkKKworICAgIGRlZiB0ZXN0X3VucmVhZGFibGUoc2VsZik6CisgICAgICAgICMgTm90IHJlY3Vyc2l2ZSBidXQgbm90IHJlYWRhYmxlIGFueXdheQorICAgICAgICBwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKCkKKyAgICAgICAgZm9yIHVucmVhZGFibGUgaW4gdHlwZSgzKSwgcHByaW50LCBwcHJpbnQuaXNyZWN1cnNpdmU6CisgICAgICAgICAgICAjIG1vZHVsZS1sZXZlbCBjb252ZW5pZW5jZSBmdW5jdGlvbnMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHByaW50LmlzcmVjdXJzaXZlKHVucmVhZGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgbm90IGlzcmVjdXJzaXZlIGZvciAlciIgJSAodW5yZWFkYWJsZSwpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwcHJpbnQuaXNyZWFkYWJsZSh1bnJlYWRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIG5vdCBpc3JlYWRhYmxlIGZvciAlciIgJSAodW5yZWFkYWJsZSwpKQorICAgICAgICAgICAgIyBQcmV0dHlQcmludGVyIG1ldGhvZHMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHAuaXNyZWN1cnNpdmUodW5yZWFkYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBub3QgaXNyZWN1cnNpdmUgZm9yICVyIiAlICh1bnJlYWRhYmxlLCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBwLmlzcmVhZGFibGUodW5yZWFkYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBub3QgaXNyZWFkYWJsZSBmb3IgJXIiICUgKHVucmVhZGFibGUsKSkKKworICAgIGRlZiB0ZXN0X3NhbWVfYXNfcmVwcihzZWxmKToKKyAgICAgICAgIyBTaW1wbGUgb2JqZWN0cywgc21hbGwgY29udGFpbmVycyBhbmQgY2xhc3NlcyB0aGF0IG92ZXJ3cml0ZSBfX3JlcHJfXworICAgICAgICAjIEZvciB0aG9zZSB0aGUgcmVzdWx0IHNob3VsZCBiZSB0aGUgc2FtZSBhcyByZXByKCkuCisgICAgICAgICMgQWhlbS4gIFRoZSBkb2NzIGRvbid0IHNheSBhbnl0aGluZyBhYm91dCB0aGF0IC0tIHRoaXMgYXBwZWFycyB0bworICAgICAgICAjIGJlIHRlc3RpbmcgYW4gaW1wbGVtZW50YXRpb24gcXVpcmsuICBTdGFydGluZyBpbiBQeXRob24gMi41LCBpdCdzCisgICAgICAgICMgbm90IHRydWUgZm9yIGRpY3RzOiAgcHByaW50IGFsd2F5cyBzb3J0cyBkaWN0cyBieSBrZXkgbm93OyBiZWZvcmUsCisgICAgICAgICMgaXQgc29ydGVkIGEgZGljdCBkaXNwbGF5IGlmIGFuZCBvbmx5IGlmIHRoZSBkaXNwbGF5IHJlcXVpcmVkCisgICAgICAgICMgbXVsdGlwbGUgbGluZXMuICBGb3IgdGhhdCByZWFzb24sIGRpY3RzIHdpdGggbW9yZSB0aGFuIG9uZSBlbGVtZW50CisgICAgICAgICMgYXJlbid0IHRlc3RlZCBoZXJlLgorICAgICAgICBmb3Igc2ltcGxlIGluICgwLCAwTCwgMCswaiwgMC4wLCAiIiwgdW5pKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKCksIHR1cGxlMigpLCB0dXBsZTMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgW10sIGxpc3QyKCksIGxpc3QzKCksCisgICAgICAgICAgICAgICAgICAgICAgIHt9LCBkaWN0MigpLCBkaWN0MygpLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUsIHBwcmludCwKKyAgICAgICAgICAgICAgICAgICAgICAgLTYsIC02TCwgLTYtNmosIC0xLjUsICJ4IiwgdW5pKCJ4IiksICgzLCksIFszXSwgezM6IDZ9LAorICAgICAgICAgICAgICAgICAgICAgICAoMSwyKSwgWzMsNF0sIHs1OiA2fSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHVwbGUyKCgxLDIpKSwgdHVwbGUzKCgxLDIpKSwgdHVwbGUzKHJhbmdlKDEwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICBbMyw0XSwgbGlzdDIoWzMsNF0pLCBsaXN0MyhbMyw0XSksIGxpc3QzKHJhbmdlKDEwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICBkaWN0Mih7NTogNn0pLCBkaWN0Myh7NTogNn0pLAorICAgICAgICAgICAgICAgICAgICAgICByYW5nZSgxMCwgLTExLCAtMSkKKyAgICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgbmF0aXZlID0gcmVwcihzaW1wbGUpCisgICAgICAgICAgICBmb3IgZnVuY3Rpb24gaW4gInBmb3JtYXQiLCAic2FmZXJlcHIiOgorICAgICAgICAgICAgICAgIGYgPSBnZXRhdHRyKHBwcmludCwgZnVuY3Rpb24pCisgICAgICAgICAgICAgICAgZ290ID0gZihzaW1wbGUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYXRpdmUsIGdvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyBnb3QgJXMgZnJvbSBwcHJpbnQuJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYXRpdmUsIGdvdCwgZnVuY3Rpb24pKQorCisgICAgZGVmIHRlc3RfYmFzaWNfbGluZV93cmFwKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSBiYXNpYyBsaW5lLXdyYXBwaW5nIG9wZXJhdGlvbgorICAgICAgICBvID0geydSUE1fY2FsJzogMCwKKyAgICAgICAgICAgICAnUlBNX2NhbDInOiA0ODA1OSwKKyAgICAgICAgICAgICAnU3BlZWRfY2FsJzogMCwKKyAgICAgICAgICAgICAnY29udHJvbGRlc2tfcnVudGltZV91cyc6IDAsCisgICAgICAgICAgICAgJ21haW5fY29kZV9ydW50aW1lX3VzJzogMCwKKyAgICAgICAgICAgICAncmVhZF9pb19ydW50aW1lX3VzJzogMCwKKyAgICAgICAgICAgICAnd3JpdGVfaW9fcnVudGltZV91cyc6IDQzNjkwfQorICAgICAgICBleHAgPSAiIiJcCit7J1JQTV9jYWwnOiAwLAorICdSUE1fY2FsMic6IDQ4MDU5LAorICdTcGVlZF9jYWwnOiAwLAorICdjb250cm9sZGVza19ydW50aW1lX3VzJzogMCwKKyAnbWFpbl9jb2RlX3J1bnRpbWVfdXMnOiAwLAorICdyZWFkX2lvX3J1bnRpbWVfdXMnOiAwLAorICd3cml0ZV9pb19ydW50aW1lX3VzJzogNDM2OTB9IiIiCisgICAgICAgIGZvciB0eXBlIGluIFtkaWN0LCBkaWN0Ml06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KHR5cGUobykpLCBleHApCisKKyAgICAgICAgbyA9IHJhbmdlKDEwMCkKKyAgICAgICAgZXhwID0gJ1slc10nICUgJyxcbiAnLmpvaW4obWFwKHN0ciwgbykpCisgICAgICAgIGZvciB0eXBlIGluIFtsaXN0LCBsaXN0Ml06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KHR5cGUobykpLCBleHApCisKKyAgICAgICAgbyA9IHR1cGxlKHJhbmdlKDEwMCkpCisgICAgICAgIGV4cCA9ICcoJXMpJyAlICcsXG4gJy5qb2luKG1hcChzdHIsIG8pKQorICAgICAgICBmb3IgdHlwZSBpbiBbdHVwbGUsIHR1cGxlMl06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KHR5cGUobykpLCBleHApCisKKyAgICAgICAgIyBpbmRlbnQgcGFyYW1ldGVyCisgICAgICAgIG8gPSByYW5nZSgxMDApCisgICAgICAgIGV4cCA9ICdbICAgJXNdJyAlICcsXG4gICAgJy5qb2luKG1hcChzdHIsIG8pKQorICAgICAgICBmb3IgdHlwZSBpbiBbbGlzdCwgbGlzdDJdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdCh0eXBlKG8pLCBpbmRlbnQ9NCksIGV4cCkKKworICAgIGRlZiB0ZXN0X25lc3RlZF9pbmRlbnRhdGlvbnMoc2VsZik6CisgICAgICAgIG8xID0gbGlzdChyYW5nZSgxMCkpCisgICAgICAgIG8yID0gZGljdChmaXJzdD0xLCBzZWNvbmQ9MiwgdGhpcmQ9MykKKyAgICAgICAgbyA9IFtvMSwgbzJdCisgICAgICAgIGV4cGVjdGVkID0gIiIiXAorWyAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XSwKKyAgICB7ICAgJ2ZpcnN0JzogMSwKKyAgICAgICAgJ3NlY29uZCc6IDIsCisgICAgICAgICd0aGlyZCc6IDN9XSIiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KG8sIGluZGVudD00LCB3aWR0aD00MiksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3Rfc29ydGVkX2RpY3Qoc2VsZik6CisgICAgICAgICMgU3RhcnRpbmcgaW4gUHl0aG9uIDIuNSwgcHByaW50IHNvcnRzIGRpY3QgZGlzcGxheXMgYnkga2V5IHJlZ2FyZGxlc3MKKyAgICAgICAgIyBvZiBob3cgc21hbGwgdGhlIGRpY3Rpb25hcnkgbWF5IGJlLgorICAgICAgICAjIEJlZm9yZSB0aGUgY2hhbmdlLCBvbiAzMi1iaXQgV2luZG93cyBwZm9ybWF0KCkgZ2F2ZSBvcmRlcgorICAgICAgICAjICdhJywgJ2MnLCAnYicgaGVyZSwgc28gdGhpcyB0ZXN0IGZhaWxlZC4KKyAgICAgICAgZCA9IHsnYSc6IDEsICdiJzogMSwgJ2MnOiAxfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KGQpLCAieydhJzogMSwgJ2InOiAxLCAnYyc6IDF9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChbZCwgZF0pLAorICAgICAgICAgICAgIlt7J2EnOiAxLCAnYic6IDEsICdjJzogMX0sIHsnYSc6IDEsICdiJzogMSwgJ2MnOiAxfV0iKQorCisgICAgICAgICMgVGhlIG5leHQgb25lIGlzIGtpbmQgb2YgZ29vZnkuICBUaGUgc29ydGVkIG9yZGVyIGRlcGVuZHMgb24gdGhlCisgICAgICAgICMgYWxwaGFiZXRpYyBvcmRlciBvZiB0eXBlIG5hbWVzOiAgImludCIgPCAic3RyIiA8ICJ0dXBsZSIuICBCZWZvcmUKKyAgICAgICAgIyBQeXRob24gMi41LCB0aGlzIHdhcyBpbiB0aGUgdGVzdF9zYW1lX2FzX3JlcHIoKSB0ZXN0LiAgSXQncyB3b3J0aAorICAgICAgICAjIGtlZXBpbmcgYXJvdW5kIGZvciBub3cgYmVjYXVzZSBpdCdzIG9uZSBvZiBmZXcgdGVzdHMgb2YgcHByaW50CisgICAgICAgICMgYWdhaW5zdCBhIGNyYXp5IG1peCBvZiB0eXBlcy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdCh7Inh5XHRhYlxuIjogKDMsKSwgNTogW1tdXSwgKCk6IHt9fSksCisgICAgICAgICAgICByIns1OiBbW11dLCAneHlcdGFiXG4nOiAoMywpLCAoKToge319IikKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzaW5nKHNlbGYpOgorICAgICAgICBvID0geyduYW1lcyB3aXRoIHNwYWNlcyc6ICdzaG91bGQgYmUgcHJlc2VudGVkIHVzaW5nIHJlcHIoKScsCisgICAgICAgICAgICAgJ290aGVycy5zaG91bGQubm90LmJlJzogJ2xpa2UudGhpcyd9CisgICAgICAgIGV4cCA9ICIiIlwKK3snbmFtZXMgd2l0aCBzcGFjZXMnOiAnc2hvdWxkIGJlIHByZXNlbnRlZCB1c2luZyByZXByKCknLAorIG90aGVycy5zaG91bGQubm90LmJlOiBsaWtlLnRoaXN9IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRG90dGVkUHJldHR5UHJpbnRlcigpLnBmb3JtYXQobyksIGV4cCkKKworICAgIGRlZiB0ZXN0X3NldF9yZXBycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChzZXQoKSksICdzZXQoKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoc2V0KHJhbmdlKDMpKSksICdzZXQoWzAsIDEsIDJdKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoZnJvemVuc2V0KCkpLCAnZnJvemVuc2V0KCknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KGZyb3plbnNldChyYW5nZSgzKSkpLCAnZnJvemVuc2V0KFswLCAxLCAyXSknKQorICAgICAgICBjdWJlX3JlcHJfdGd0ID0gIiIiXAore2Zyb3plbnNldChbXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFsyXSksIGZyb3plbnNldChbMF0pLCBmcm96ZW5zZXQoWzFdKV0pLAorIGZyb3plbnNldChbMF0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwgMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwgMV0pXSksCisgZnJvemVuc2V0KFsxXSk6IGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxLCAyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLCAxXSldKSwKKyBmcm96ZW5zZXQoWzJdKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzEsIDJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsIDJdKV0pLAorIGZyb3plbnNldChbMSwgMl0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwgMSwgMl0pXSksCisgZnJvemVuc2V0KFswLCAyXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFsyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLCAxLCAyXSldKSwKKyBmcm96ZW5zZXQoWzAsIDFdKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsIDEsIDJdKV0pLAorIGZyb3plbnNldChbMCwgMSwgMl0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbMSwgMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwgMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwgMV0pXSl9IiIiCisgICAgICAgIGN1YmUgPSB0ZXN0LnRlc3Rfc2V0LmN1YmUoMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChjdWJlKSwgY3ViZV9yZXByX3RndCkKKyAgICAgICAgY3Vib19yZXByX3RndCA9ICIiIlwKK3tmcm96ZW5zZXQoW2Zyb3plbnNldChbMCwgMl0pLCBmcm96ZW5zZXQoWzBdKV0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMV0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzBdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pXSksCisgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzAsIDFdKSwgZnJvemVuc2V0KFsxXSldKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW2Zyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxXSldKV0pLAorIGZyb3plbnNldChbZnJvemVuc2V0KFsxLCAyXSksIGZyb3plbnNldChbMV0pXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFtmcm96ZW5zZXQoWzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFsyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMV0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMV0pXSldKSwKKyBmcm96ZW5zZXQoW2Zyb3plbnNldChbMSwgMl0pLCBmcm96ZW5zZXQoWzJdKV0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbZnJvemVuc2V0KFsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzJdKV0pXSksCisgZnJvemVuc2V0KFtmcm96ZW5zZXQoW10pLCBmcm96ZW5zZXQoWzBdKV0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbZnJvemVuc2V0KFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMV0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzJdKV0pXSksCisgZnJvemVuc2V0KFtmcm96ZW5zZXQoW10pLCBmcm96ZW5zZXQoWzFdKV0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdKV0pXSksCisgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzJdKSwgZnJvemVuc2V0KFtdKV0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbZnJvemVuc2V0KFsyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzFdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pXSksCisgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzAsIDEsIDJdKSwgZnJvemVuc2V0KFswLCAxXSldKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW2Zyb3plbnNldChbMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXSldKV0pLAorIGZyb3plbnNldChbZnJvemVuc2V0KFswXSksIGZyb3plbnNldChbMCwgMV0pXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMV0pXSldKSwKKyBmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLCBmcm96ZW5zZXQoWzAsIDJdKV0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzJdKV0pXSksCisgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzAsIDEsIDJdKSwgZnJvemVuc2V0KFswLCAyXSldKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW2Zyb3plbnNldChbMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFsyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKV0pLAorIGZyb3plbnNldChbZnJvemVuc2V0KFsxLCAyXSksIGZyb3plbnNldChbMCwgMSwgMl0pXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFtmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSldKX0iIiIKKworICAgICAgICBjdWJvID0gdGVzdC50ZXN0X3NldC5saW5lZ3JhcGgoY3ViZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChjdWJvKSwgY3Vib19yZXByX3RndCkKKworICAgIGRlZiB0ZXN0X2RlcHRoKHNlbGYpOgorICAgICAgICBuZXN0ZWRfdHVwbGUgPSAoMSwgKDIsICgzLCAoNCwgKDUsIDYpKSkpKQorICAgICAgICBuZXN0ZWRfZGljdCA9IHsxOiB7MjogezM6IHs0OiB7NTogezY6IDZ9fX19fX0KKyAgICAgICAgbmVzdGVkX2xpc3QgPSBbMSwgWzIsIFszLCBbNCwgWzUsIFs2LCBbXV1dXV1dXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KG5lc3RlZF90dXBsZSksIHJlcHIobmVzdGVkX3R1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChuZXN0ZWRfZGljdCksIHJlcHIobmVzdGVkX2RpY3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KG5lc3RlZF9saXN0KSwgcmVwcihuZXN0ZWRfbGlzdCkpCisKKyAgICAgICAgbHYxX3R1cGxlID0gJygxLCAoLi4uKSknCisgICAgICAgIGx2MV9kaWN0ID0gJ3sxOiB7Li4ufX0nCisgICAgICAgIGx2MV9saXN0ID0gJ1sxLCBbLi4uXV0nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQobmVzdGVkX3R1cGxlLCBkZXB0aD0xKSwgbHYxX3R1cGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KG5lc3RlZF9kaWN0LCBkZXB0aD0xKSwgbHYxX2RpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQobmVzdGVkX2xpc3QsIGRlcHRoPTEpLCBsdjFfbGlzdCkKKworCitjbGFzcyBEb3R0ZWRQcmV0dHlQcmludGVyKHBwcmludC5QcmV0dHlQcmludGVyKToKKworICAgIGRlZiBmb3JtYXQoc2VsZiwgb2JqZWN0LCBjb250ZXh0LCBtYXhsZXZlbHMsIGxldmVsKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvYmplY3QsIHN0cik6CisgICAgICAgICAgICBpZiAnICcgaW4gb2JqZWN0OgorICAgICAgICAgICAgICAgIHJldHVybiByZXByKG9iamVjdCksIDEsIDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCwgMCwgMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHBwcmludC5QcmV0dHlQcmludGVyLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBzZWxmLCBvYmplY3QsIGNvbnRleHQsIG1heGxldmVscywgbGV2ZWwpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChRdWVyeVRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BwcmludC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcHJpbnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjdjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcHJpbnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BwcmludC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcHJpbnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjdjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcHJpbnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ByaW50LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJpbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyNjM0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ByaW50LnB5CkBAIC0wLDAgKzEsMTQxIEBACisiIiJUZXN0IGNvcnJlY3Qgb3BlcmF0aW9uIG9mIHRoZSBwcmludCBmdW5jdGlvbi4KKyIiIgorCisjIEluIDIuNiwgdGhpcyBnaXZlcyB1cyB0aGUgYmVoYXZpb3Igd2Ugd2FudC4gIEluIDMuMCwgaXQgaGFzCisjICBubyBmdW5jdGlvbiwgYnV0IGl0IHN0aWxsIG11c3QgcGFyc2UgY29ycmVjdGx5LgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK05vdERlZmluZWQgPSBvYmplY3QoKQorCisjIEEgZGlzcGF0Y2ggdGFibGUgYWxsIDggY29tYmluYXRpb25zIG9mIHByb3ZpZGluZworIyAgc2VwLCBlbmQsIGFuZCBmaWxlCisjIEkgdXNlIHRoaXMgbWFjaGluZXJ5IHNvIHRoYXQgSSdtIG5vdCBqdXN0IHBhc3NpbmcgZGVmYXVsdAorIyAgdmFsdWVzIHRvIHByaW50LCBJJ20gZWl0aGVyIHBhc3Npbmcgb3Igbm90IHBhc3NpbmcgaW4gdGhlCisjICBhcmd1bWVudHMKK2Rpc3BhdGNoID0geworICAgIChGYWxzZSwgRmFsc2UsIEZhbHNlKToKKyAgICAgbGFtYmRhIGFyZ3MsIHNlcCwgZW5kLCBmaWxlOiBwcmludCgqYXJncyksCisgICAgKEZhbHNlLCBGYWxzZSwgVHJ1ZSk6CisgICAgIGxhbWJkYSBhcmdzLCBzZXAsIGVuZCwgZmlsZTogcHJpbnQoZmlsZT1maWxlLCAqYXJncyksCisgICAgKEZhbHNlLCBUcnVlLCAgRmFsc2UpOgorICAgICBsYW1iZGEgYXJncywgc2VwLCBlbmQsIGZpbGU6IHByaW50KGVuZD1lbmQsICphcmdzKSwKKyAgICAoRmFsc2UsIFRydWUsICBUcnVlKToKKyAgICAgbGFtYmRhIGFyZ3MsIHNlcCwgZW5kLCBmaWxlOiBwcmludChlbmQ9ZW5kLCBmaWxlPWZpbGUsICphcmdzKSwKKyAgICAoVHJ1ZSwgIEZhbHNlLCBGYWxzZSk6CisgICAgIGxhbWJkYSBhcmdzLCBzZXAsIGVuZCwgZmlsZTogcHJpbnQoc2VwPXNlcCwgKmFyZ3MpLAorICAgIChUcnVlLCAgRmFsc2UsIFRydWUpOgorICAgICBsYW1iZGEgYXJncywgc2VwLCBlbmQsIGZpbGU6IHByaW50KHNlcD1zZXAsIGZpbGU9ZmlsZSwgKmFyZ3MpLAorICAgIChUcnVlLCAgVHJ1ZSwgIEZhbHNlKToKKyAgICAgbGFtYmRhIGFyZ3MsIHNlcCwgZW5kLCBmaWxlOiBwcmludChzZXA9c2VwLCBlbmQ9ZW5kLCAqYXJncyksCisgICAgKFRydWUsICBUcnVlLCAgVHJ1ZSk6CisgICAgIGxhbWJkYSBhcmdzLCBzZXAsIGVuZCwgZmlsZTogcHJpbnQoc2VwPXNlcCwgZW5kPWVuZCwgZmlsZT1maWxlLCAqYXJncyksCisgICAgfQorCisjIENsYXNzIHVzZWQgdG8gdGVzdCBfX3N0cl9fIGFuZCBwcmludAorY2xhc3MgQ2xhc3NXaXRoX19zdHJfXzoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgIHNlbGYueCA9IHgKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYueAorCitjbGFzcyBUZXN0UHJpbnQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBjaGVjayhzZWxmLCBleHBlY3RlZCwgYXJncywKKyAgICAgICAgICAgIHNlcD1Ob3REZWZpbmVkLCBlbmQ9Tm90RGVmaW5lZCwgZmlsZT1Ob3REZWZpbmVkKToKKyAgICAgICAgIyBDYXB0dXJlIHN5cy5zdGRvdXQgaW4gYSBTdHJpbmdJTy4gIENhbGwgcHJpbnQgd2l0aCBhcmdzLAorICAgICAgICAjICBhbmQgd2l0aCBzZXAsIGVuZCwgYW5kIGZpbGUsIGlmIHRoZXkncmUgZGVmaW5lZC4gIFJlc3VsdAorICAgICAgICAjICBtdXN0IG1hdGNoIGV4cGVjdGVkLgorCisgICAgICAgICMgTG9vayB1cCB0aGUgYWN0dWFsIGZ1bmN0aW9uIHRvIGNhbGwsIGJhc2VkIG9uIGlmIHNlcCwgZW5kLCBhbmQgZmlsZQorICAgICAgICAjICBhcmUgZGVmaW5lZAorICAgICAgICBmbiA9IGRpc3BhdGNoWyhzZXAgaXMgbm90IE5vdERlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGVuZCBpcyBub3QgTm90RGVmaW5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBpcyBub3QgTm90RGVmaW5lZCldCisKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfc3Rkb3V0KCkgYXMgdDoKKyAgICAgICAgICAgIGZuKGFyZ3MsIHNlcCwgZW5kLCBmaWxlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5nZXR2YWx1ZSgpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3ByaW50KHNlbGYpOgorICAgICAgICBkZWYgeChleHBlY3RlZCwgYXJncywgc2VwPU5vdERlZmluZWQsIGVuZD1Ob3REZWZpbmVkKToKKyAgICAgICAgICAgICMgUnVuIHRoZSB0ZXN0IDIgd2F5czogbm90IHVzaW5nIGZpbGUsIGFuZCB1c2luZworICAgICAgICAgICAgIyAgZmlsZSBkaXJlY3RlZCB0byBhIFN0cmluZ0lPCisKKyAgICAgICAgICAgIHNlbGYuY2hlY2soZXhwZWN0ZWQsIGFyZ3MsIHNlcD1zZXAsIGVuZD1lbmQpCisKKyAgICAgICAgICAgICMgV2hlbiB3cml0aW5nIHRvIGEgZmlsZSwgc3Rkb3V0IGlzIGV4cGVjdGVkIHRvIGJlIGVtcHR5CisgICAgICAgICAgICBvID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgc2VsZi5jaGVjaygnJywgYXJncywgc2VwPXNlcCwgZW5kPWVuZCwgZmlsZT1vKQorCisgICAgICAgICAgICAjIEFuZCBvIHdpbGwgY29udGFpbiB0aGUgZXhwZWN0ZWQgb3V0cHV0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uZ2V0dmFsdWUoKSwgZXhwZWN0ZWQpCisKKyAgICAgICAgeCgnXG4nLCAoKSkKKyAgICAgICAgeCgnYVxuJywgKCdhJywpKQorICAgICAgICB4KCdOb25lXG4nLCAoTm9uZSwpKQorICAgICAgICB4KCcxIDJcbicsICgxLCAyKSkKKyAgICAgICAgeCgnMSAgIDJcbicsICgxLCAnICcsIDIpKQorICAgICAgICB4KCcxKjJcbicsICgxLCAyKSwgc2VwPScqJykKKyAgICAgICAgeCgnMSBzJywgKDEsICdzJyksIGVuZD0nJykKKyAgICAgICAgeCgnYVxuYlxuJywgKCdhJywgJ2InKSwgc2VwPSdcbicpCisgICAgICAgIHgoJzEuMDEnLCAoMS4wLCAxKSwgc2VwPScnLCBlbmQ9JycpCisgICAgICAgIHgoJzEqYSoxLjMrJywgKDEsICdhJywgMS4zKSwgc2VwPScqJywgZW5kPScrJykKKyAgICAgICAgeCgnYVxuXG5iXG4nLCAoJ2FcbicsICdiJyksIHNlcD0nXG4nKQorICAgICAgICB4KCdcMCsgK1wwXG4nLCAoJ1wwJywgJyAnLCAnXDAnKSwgc2VwPScrJykKKworICAgICAgICB4KCdhXG4gYlxuJywgKCdhXG4nLCAnYicpKQorICAgICAgICB4KCdhXG4gYlxuJywgKCdhXG4nLCAnYicpLCBzZXA9Tm9uZSkKKyAgICAgICAgeCgnYVxuIGJcbicsICgnYVxuJywgJ2InKSwgZW5kPU5vbmUpCisgICAgICAgIHgoJ2FcbiBiXG4nLCAoJ2FcbicsICdiJyksIHNlcD1Ob25lLCBlbmQ9Tm9uZSkKKworICAgICAgICB4KCcqXG4nLCAoQ2xhc3NXaXRoX19zdHJfXygnKicpLCkpCisgICAgICAgIHgoJ2FiYyAxXG4nLCAoQ2xhc3NXaXRoX19zdHJfXygnYWJjJyksIDEpKQorCisgICAgICAgICMgMi54IHVuaWNvZGUgdGVzdHMKKyAgICAgICAgeCh1JzEgMlxuJywgKCcxJywgdScyJykpCisgICAgICAgIHgodSd1XDEyMzRcbicsICh1J3VcMTIzNCcsKSkKKyAgICAgICAgeCh1JyAgYWJjIDFcbicsICgnICcsIENsYXNzV2l0aF9fc3RyX18odSdhYmMnKSwgMSkpCisKKyAgICAgICAgIyBlcnJvcnMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcmludCwgJycsIHNlcD0zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByaW50LCAnJywgZW5kPTMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBwcmludCwgJycsIGZpbGU9JycpCisKKyAgICBkZWYgdGVzdF9taXhlZF9hcmdzKHNlbGYpOgorICAgICAgICAjIElmIGFuIHVuaWNvZGUgYXJnIGlzIHBhc3NlZCwgc2VwIGFuZCBlbmQgc2hvdWxkIGJlIHVuaWNvZGUsIHRvby4KKyAgICAgICAgY2xhc3MgUmVjb3JkZXIob2JqZWN0KToKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG11c3RfYmVfdW5pY29kZSk6CisgICAgICAgICAgICAgICAgc2VsZi5idWYgPSBbXQorICAgICAgICAgICAgICAgIHNlbGYuZm9yY2VfdW5pY29kZSA9IG11c3RfYmVfdW5pY29kZQorCisgICAgICAgICAgICBkZWYgd3JpdGUoc2VsZiwgd2hhdCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5mb3JjZV91bmljb2RlIGFuZCBub3QgaXNpbnN0YW5jZSh3aGF0LCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoInswIXJ9IGlzIG5vdCB1bmljb2RlIi5mb3JtYXQod2hhdCkpCisgICAgICAgICAgICAgICAgc2VsZi5idWYuYXBwZW5kKHdoYXQpCisKKyAgICAgICAgYnVmID0gUmVjb3JkZXIoVHJ1ZSkKKyAgICAgICAgcHJpbnQodSdoaScsIGZpbGU9YnVmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnJy5qb2luKGJ1Zi5idWYpLCAnaGlcbicpCisgICAgICAgIGRlbCBidWYuYnVmWzpdCisgICAgICAgIHByaW50KHUnaGknLCB1J25vdGhpbmcnLCBmaWxlPWJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Jycuam9pbihidWYuYnVmKSwgJ2hpIG5vdGhpbmdcbicpCisgICAgICAgIGJ1ZiA9IFJlY29yZGVyKEZhbHNlKQorICAgICAgICBwcmludCgnaGknLCAnYnllJywgZW5kPXUnXG4nLCBmaWxlPWJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGJ1Zi5idWZbMV0sIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShidWYuYnVmWzNdLCB1bmljb2RlKQorICAgICAgICBkZWwgYnVmLmJ1Zls6XQorICAgICAgICBwcmludChzZXA9dSd4JywgZmlsZT1idWYpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShidWYuYnVmWy0xXSwgdW5pY29kZSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0UHJpbnQpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ByaW50LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ByaW50LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjMwZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJpbnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ByaW50LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ByaW50LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjMwZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJpbnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Byb2ZpbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9maWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOTNkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9maWxlLnB5CkBAIC0wLDAgKzEsMTg2IEBACisiIiJUZXN0IHN1aXRlIGZvciB0aGUgcHJvZmlsZSBtb2R1bGUuIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBwc3RhdHMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitpbXBvcnQgcHJvZmlsZQorZnJvbSB0ZXN0LnByb2ZpbGVlIGltcG9ydCB0ZXN0ZnVuYywgdGltZXIKKworCitjbGFzcyBQcm9maWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBwcm9maWxlcmNsYXNzID0gcHJvZmlsZS5Qcm9maWxlCisgICAgbWV0aG9kbmFtZXMgPSBbJ3ByaW50X3N0YXRzJywgJ3ByaW50X2NhbGxlcnMnLCAncHJpbnRfY2FsbGVlcyddCisgICAgZXhwZWN0ZWRfb3V0cHV0ID0ge30KKyAgICBleHBlY3RlZF9saXN0X3NvcnRfb3V0cHV0ID0gJzowKHNvcnQpJworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGRvX3Byb2ZpbGluZyhjbHMpOgorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgcHJvZiA9IGNscy5wcm9maWxlcmNsYXNzKHRpbWVyLCAwLjAwMSkKKyAgICAgICAgc3RhcnRfdGltZXIgPSB0aW1lcigpCisgICAgICAgIHByb2YucnVuY3R4KCJ0ZXN0ZnVuYygpIiwgZ2xvYmFscygpLCBsb2NhbHMoKSkKKyAgICAgICAgcmVzdWx0cy5hcHBlbmQodGltZXIoKSAtIHN0YXJ0X3RpbWVyKQorICAgICAgICBmb3IgbWV0aG9kbmFtZSBpbiBjbHMubWV0aG9kbmFtZXM6CisgICAgICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgc3RhdHMgPSBwc3RhdHMuU3RhdHMocHJvZiwgc3RyZWFtPXMpCisgICAgICAgICAgICBzdGF0cy5zdHJpcF9kaXJzKCkuc29ydF9zdGF0cygic3RkbmFtZSIpCisgICAgICAgICAgICBnZXRhdHRyKHN0YXRzLCBtZXRob2RuYW1lKSgpCisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChzLmdldHZhbHVlKCkpCisgICAgICAgIHJldHVybiByZXN1bHRzCisKKyAgICBkZWYgdGVzdF9jcHJvZmlsZShzZWxmKToKKyAgICAgICAgcmVzdWx0cyA9IHNlbGYuZG9fcHJvZmlsaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzWzBdLCAxMDAwKQorICAgICAgICBmb3IgaSwgbWV0aG9kIGluIGVudW1lcmF0ZShzZWxmLm1ldGhvZG5hbWVzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0c1tpKzFdLCBzZWxmLmV4cGVjdGVkX291dHB1dFttZXRob2RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhdHMuJXMgb3V0cHV0IGZvciAlcyBkb2Vzbid0IGZpdCBleHBlY3RhdGlvbiEiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1ldGhvZCwgc2VsZi5wcm9maWxlcmNsYXNzLl9fbmFtZV9fKSkKKworICAgIGRlZiB0ZXN0X2NhbGxpbmdfY29udmVudGlvbnMoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzUzMzA6IHByb2ZpbGUgYW5kIGNQcm9maWxlIHdvdWxkbid0IHJlcG9ydCBDIGZ1bmN0aW9ucyBjYWxsZWQKKyAgICAgICAgIyB3aXRoIGtleXdvcmQgYXJndW1lbnRzLiBXZSB0ZXN0IGFsbCBjYWxsaW5nIGNvbnZlbnRpb25zLgorICAgICAgICBzdG10cyA9IFsKKyAgICAgICAgICAgICJbXS5zb3J0KCkiLAorICAgICAgICAgICAgIltdLnNvcnQocmV2ZXJzZT1UcnVlKSIsCisgICAgICAgICAgICAiW10uc29ydCgqKE5vbmUsIE5vbmUsIFRydWUpKSIsCisgICAgICAgICAgICAiW10uc29ydCgqKmRpY3QocmV2ZXJzZT1UcnVlKSkiLAorICAgICAgICBdCisgICAgICAgIGZvciBzdG10IGluIHN0bXRzOgorICAgICAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIHByb2YgPSBzZWxmLnByb2ZpbGVyY2xhc3ModGltZXIsIDAuMDAxKQorICAgICAgICAgICAgcHJvZi5ydW5jdHgoc3RtdCwgZ2xvYmFscygpLCBsb2NhbHMoKSkKKyAgICAgICAgICAgIHN0YXRzID0gcHN0YXRzLlN0YXRzKHByb2YsIHN0cmVhbT1zKQorICAgICAgICAgICAgc3RhdHMucHJpbnRfc3RhdHMoKQorICAgICAgICAgICAgcmVzID0gcy5nZXR2YWx1ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHNlbGYuZXhwZWN0ZWRfbGlzdF9zb3J0X291dHB1dCwgcmVzLAorICAgICAgICAgICAgICAgICJQcm9maWxpbmcgezAhcn0gZGlkbid0IHJlcG9ydCBsaXN0LnNvcnQ6XG57MX0iLmZvcm1hdChzdG10LCByZXMpKQorCisKK2RlZiByZWdlbmVyYXRlX2V4cGVjdGVkX291dHB1dChmaWxlbmFtZSwgY2xzKToKKyAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnJzdHJpcCgnY28nKQorICAgIHByaW50ICdSZWdlbmVyYXRpbmcgJXMuLi4nICUgZmlsZW5hbWUKKyAgICByZXN1bHRzID0gY2xzLmRvX3Byb2ZpbGluZygpCisKKyAgICBuZXdmaWxlID0gW10KKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyJykgYXMgZjoKKyAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgIG5ld2ZpbGUuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICBpZiBsaW5lWzo2XSA9PSAnIy0tY3V0JzoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAndycpIGFzIGY6CisgICAgICAgIGYud3JpdGVsaW5lcyhuZXdmaWxlKQorICAgICAgICBmb3IgaSwgbWV0aG9kIGluIGVudW1lcmF0ZShjbHMubWV0aG9kbmFtZXMpOgorICAgICAgICAgICAgZi53cml0ZSgnJXMuZXhwZWN0ZWRfb3V0cHV0WyVyXSA9ICIiIlxcXG4lcyIiIlxuJyAlICgKKyAgICAgICAgICAgICAgICBjbHMuX19uYW1lX18sIG1ldGhvZCwgcmVzdWx0c1tpKzFdKSkKKyAgICAgICAgZi53cml0ZSgnXG5pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOlxuICAgIG1haW4oKVxuJykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFByb2ZpbGVUZXN0KQorCitkZWYgbWFpbigpOgorICAgIGlmICctcicgbm90IGluIHN5cy5hcmd2OgorICAgICAgICB0ZXN0X21haW4oKQorICAgIGVsc2U6CisgICAgICAgIHJlZ2VuZXJhdGVfZXhwZWN0ZWRfb3V0cHV0KF9fZmlsZV9fLCBQcm9maWxlVGVzdCkKKworCisjIERvbid0IHJlbW92ZSB0aGlzIGNvbW1lbnQuIEV2ZXJ5dGhpbmcgYmVsb3cgaXQgaXMgYXV0by1nZW5lcmF0ZWQuCisjLS1jdXQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorUHJvZmlsZVRlc3QuZXhwZWN0ZWRfb3V0cHV0WydwcmludF9zdGF0cyddID0gIiIiXAorICAgICAgICAgMTI3IGZ1bmN0aW9uIGNhbGxzICgxMDcgcHJpbWl0aXZlIGNhbGxzKSBpbiA5OTkuNzQ5IHNlY29uZHMKKworICAgT3JkZXJlZCBieTogc3RhbmRhcmQgbmFtZQorCisgICBuY2FsbHMgIHRvdHRpbWUgIHBlcmNhbGwgIGN1bXRpbWUgIHBlcmNhbGwgZmlsZW5hbWU6bGluZW5vKGZ1bmN0aW9uKQorICAgICAgICA0ICAgLTAuMDA0ICAgLTAuMDAxICAgLTAuMDA0ICAgLTAuMDAxIDowKGFwcGVuZCkKKyAgICAgICAgNCAgIC0wLjAwNCAgIC0wLjAwMSAgIC0wLjAwNCAgIC0wLjAwMSA6MChleGNfaW5mbykKKyAgICAgICAxMiAgIC0wLjAyNCAgIC0wLjAwMiAgIDExLjk2NCAgICAwLjk5NyA6MChoYXNhdHRyKQorICAgICAgICA4ICAgLTAuMDA4ICAgLTAuMDAxICAgLTAuMDA4ICAgLTAuMDAxIDowKHJhbmdlKQorICAgICAgICAxICAgIDAuMDAwICAgIDAuMDAwICAgIDAuMDAwICAgIDAuMDAwIDowKHNldHByb2ZpbGUpCisgICAgICAgIDEgICAtMC4wMDIgICAtMC4wMDIgIDk5OS43NTEgIDk5OS43NTEgPHN0cmluZz46MSg8bW9kdWxlPikKKyAgICAgICAgMCAgICAwLjAwMCAgICAgICAgICAgICAwLjAwMCAgICAgICAgICBwcm9maWxlOjAocHJvZmlsZXIpCisgICAgICAgIDEgICAtMC4wMDIgICAtMC4wMDIgIDk5OS43NDkgIDk5OS43NDkgcHJvZmlsZTowKHRlc3RmdW5jKCkpCisgICAgICAgMjggICAyNy45NzIgICAgMC45OTkgICAyNy45NzIgICAgMC45OTkgcHJvZmlsZWUucHk6MTEwKF9fZ2V0YXR0cl9fKQorICAgICAgICAxICAyNjkuOTk2ICAyNjkuOTk2ICA5OTkuNzUzICA5OTkuNzUzIHByb2ZpbGVlLnB5OjI1KHRlc3RmdW5jKQorICAgICAyMy8zICAxNDkuOTM3ICAgIDYuNTE5ICAxNjkuOTE3ICAgNTYuNjM5IHByb2ZpbGVlLnB5OjM1KGZhY3RvcmlhbCkKKyAgICAgICAyMCAgIDE5Ljk4MCAgICAwLjk5OSAgIDE5Ljk4MCAgICAwLjk5OSBwcm9maWxlZS5weTo0OChtdWwpCisgICAgICAgIDIgICAzOS45ODYgICAxOS45OTMgIDU5OS44MTQgIDI5OS45MDcgcHJvZmlsZWUucHk6NTUoaGVscGVyKQorICAgICAgICA0ICAxMTUuOTg0ICAgMjguOTk2ICAxMTkuOTY0ICAgMjkuOTkxIHByb2ZpbGVlLnB5OjczKGhlbHBlcjEpCisgICAgICAgIDIgICAtMC4wMDYgICAtMC4wMDMgIDEzOS45NDIgICA2OS45NzEgcHJvZmlsZWUucHk6ODQoaGVscGVyMl9pbmRpcmVjdCkKKyAgICAgICAgOCAgMzExLjk3NiAgIDM4Ljk5NyAgMzk5Ljg5NiAgIDQ5Ljk4NyBwcm9maWxlZS5weTo4OChoZWxwZXIyKQorICAgICAgICA4ICAgNjMuOTY4ICAgIDcuOTk2ICAgNzkuOTQ0ICAgIDkuOTkzIHByb2ZpbGVlLnB5Ojk4KHN1YmhlbHBlcikKKworCisiIiIKK1Byb2ZpbGVUZXN0LmV4cGVjdGVkX291dHB1dFsncHJpbnRfY2FsbGVycyddID0gIiIiXAorICAgT3JkZXJlZCBieTogc3RhbmRhcmQgbmFtZQorCitGdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIGNhbGxlZCBieS4uLgorOjAoYXBwZW5kKSAgICAgICAgICAgICAgICAgICAgICAgIDwtIHByb2ZpbGVlLnB5OjczKGhlbHBlcjEpKDQpICAxMTkuOTY0Cis6MChleGNfaW5mbykgICAgICAgICAgICAgICAgICAgICAgPC0gcHJvZmlsZWUucHk6NzMoaGVscGVyMSkoNCkgIDExOS45NjQKKzowKGhhc2F0dHIpICAgICAgICAgICAgICAgICAgICAgICA8LSBwcm9maWxlZS5weTo3MyhoZWxwZXIxKSg0KSAgMTE5Ljk2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVlLnB5Ojg4KGhlbHBlcjIpKDgpICAzOTkuODk2Cis6MChyYW5nZSkgICAgICAgICAgICAgICAgICAgICAgICAgPC0gcHJvZmlsZWUucHk6OTgoc3ViaGVscGVyKSg4KSAgIDc5Ljk0NAorOjAoc2V0cHJvZmlsZSkgICAgICAgICAgICAgICAgICAgIDwtIHByb2ZpbGU6MCh0ZXN0ZnVuYygpKSgxKSAgOTk5Ljc0OQorPHN0cmluZz46MSg8bW9kdWxlPikgICAgICAgICAgICAgIDwtIHByb2ZpbGU6MCh0ZXN0ZnVuYygpKSgxKSAgOTk5Ljc0OQorcHJvZmlsZTowKHByb2ZpbGVyKSAgICAgICAgICAgICAgIDwtCitwcm9maWxlOjAodGVzdGZ1bmMoKSkgICAgICAgICAgICAgPC0gcHJvZmlsZTowKHByb2ZpbGVyKSgxKSAgICAwLjAwMAorcHJvZmlsZWUucHk6MTEwKF9fZ2V0YXR0cl9fKSAgICAgIDwtIDowKGhhc2F0dHIpKDEyKSAgIDExLjk2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVlLnB5Ojk4KHN1YmhlbHBlcikoMTYpICAgNzkuOTQ0Citwcm9maWxlZS5weToyNSh0ZXN0ZnVuYykgICAgICAgICAgPC0gPHN0cmluZz46MSg8bW9kdWxlPikoMSkgIDk5OS43NTEKK3Byb2ZpbGVlLnB5OjM1KGZhY3RvcmlhbCkgICAgICAgICA8LSBwcm9maWxlZS5weToyNSh0ZXN0ZnVuYykoMSkgIDk5OS43NTMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlZS5weTozNShmYWN0b3JpYWwpKDIwKSAgMTY5LjkxNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVlLnB5Ojg0KGhlbHBlcjJfaW5kaXJlY3QpKDIpICAxMzkuOTQyCitwcm9maWxlZS5weTo0OChtdWwpICAgICAgICAgICAgICAgPC0gcHJvZmlsZWUucHk6MzUoZmFjdG9yaWFsKSgyMCkgIDE2OS45MTcKK3Byb2ZpbGVlLnB5OjU1KGhlbHBlcikgICAgICAgICAgICA8LSBwcm9maWxlZS5weToyNSh0ZXN0ZnVuYykoMikgIDk5OS43NTMKK3Byb2ZpbGVlLnB5OjczKGhlbHBlcjEpICAgICAgICAgICA8LSBwcm9maWxlZS5weTo1NShoZWxwZXIpKDQpICA1OTkuODE0Citwcm9maWxlZS5weTo4NChoZWxwZXIyX2luZGlyZWN0KSAgPC0gcHJvZmlsZWUucHk6NTUoaGVscGVyKSgyKSAgNTk5LjgxNAorcHJvZmlsZWUucHk6ODgoaGVscGVyMikgICAgICAgICAgIDwtIHByb2ZpbGVlLnB5OjU1KGhlbHBlcikoNikgIDU5OS44MTQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlZS5weTo4NChoZWxwZXIyX2luZGlyZWN0KSgyKSAgMTM5Ljk0MgorcHJvZmlsZWUucHk6OTgoc3ViaGVscGVyKSAgICAgICAgIDwtIHByb2ZpbGVlLnB5Ojg4KGhlbHBlcjIpKDgpICAzOTkuODk2CisKKworIiIiCitQcm9maWxlVGVzdC5leHBlY3RlZF9vdXRwdXRbJ3ByaW50X2NhbGxlZXMnXSA9ICIiIlwKKyAgIE9yZGVyZWQgYnk6IHN0YW5kYXJkIG5hbWUKKworRnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZC4uLgorOjAoYXBwZW5kKSAgICAgICAgICAgICAgICAgICAgICAgIC0+Cis6MChleGNfaW5mbykgICAgICAgICAgICAgICAgICAgICAgLT4KKzowKGhhc2F0dHIpICAgICAgICAgICAgICAgICAgICAgICAtPiBwcm9maWxlZS5weToxMTAoX19nZXRhdHRyX18pKDEyKSAgIDI3Ljk3MgorOjAocmFuZ2UpICAgICAgICAgICAgICAgICAgICAgICAgIC0+Cis6MChzZXRwcm9maWxlKSAgICAgICAgICAgICAgICAgICAgLT4KKzxzdHJpbmc+OjEoPG1vZHVsZT4pICAgICAgICAgICAgICAtPiBwcm9maWxlZS5weToyNSh0ZXN0ZnVuYykoMSkgIDk5OS43NTMKK3Byb2ZpbGU6MChwcm9maWxlcikgICAgICAgICAgICAgICAtPiBwcm9maWxlOjAodGVzdGZ1bmMoKSkoMSkgIDk5OS43NDkKK3Byb2ZpbGU6MCh0ZXN0ZnVuYygpKSAgICAgICAgICAgICAtPiA6MChzZXRwcm9maWxlKSgxKSAgICAwLjAwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmc+OjEoPG1vZHVsZT4pKDEpICA5OTkuNzUxCitwcm9maWxlZS5weToxMTAoX19nZXRhdHRyX18pICAgICAgLT4KK3Byb2ZpbGVlLnB5OjI1KHRlc3RmdW5jKSAgICAgICAgICAtPiBwcm9maWxlZS5weTozNShmYWN0b3JpYWwpKDEpICAxNjkuOTE3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZWUucHk6NTUoaGVscGVyKSgyKSAgNTk5LjgxNAorcHJvZmlsZWUucHk6MzUoZmFjdG9yaWFsKSAgICAgICAgIC0+IHByb2ZpbGVlLnB5OjM1KGZhY3RvcmlhbCkoMjApICAxNjkuOTE3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZWUucHk6NDgobXVsKSgyMCkgICAxOS45ODAKK3Byb2ZpbGVlLnB5OjQ4KG11bCkgICAgICAgICAgICAgICAtPgorcHJvZmlsZWUucHk6NTUoaGVscGVyKSAgICAgICAgICAgIC0+IHByb2ZpbGVlLnB5OjczKGhlbHBlcjEpKDQpICAxMTkuOTY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZWUucHk6ODQoaGVscGVyMl9pbmRpcmVjdCkoMikgIDEzOS45NDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlZS5weTo4OChoZWxwZXIyKSg2KSAgMzk5Ljg5NgorcHJvZmlsZWUucHk6NzMoaGVscGVyMSkgICAgICAgICAgIC0+IDowKGFwcGVuZCkoNCkgICAtMC4wMDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MChleGNfaW5mbykoNCkgICAtMC4wMDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MChoYXNhdHRyKSg0KSAgIDExLjk2NAorcHJvZmlsZWUucHk6ODQoaGVscGVyMl9pbmRpcmVjdCkgIC0+IHByb2ZpbGVlLnB5OjM1KGZhY3RvcmlhbCkoMikgIDE2OS45MTcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlZS5weTo4OChoZWxwZXIyKSgyKSAgMzk5Ljg5NgorcHJvZmlsZWUucHk6ODgoaGVscGVyMikgICAgICAgICAgIC0+IDowKGhhc2F0dHIpKDgpICAgMTEuOTY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZWUucHk6OTgoc3ViaGVscGVyKSg4KSAgIDc5Ljk0NAorcHJvZmlsZWUucHk6OTgoc3ViaGVscGVyKSAgICAgICAgIC0+IDowKHJhbmdlKSg4KSAgIC0wLjAwOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVlLnB5OjExMChfX2dldGF0dHJfXykoMTYpICAgMjcuOTcyCisKKworIiIiCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9maWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Byb2ZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODhhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9maWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9maWxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Byb2ZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkODhhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9maWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9wZXJ0eS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Byb3BlcnR5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTAyOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9wZXJ0eS5weQpAQCAtMCwwICsxLDIzMSBAQAorIyBUZXN0IGNhc2UgZm9yIHByb3BlcnR5CisjIG1vcmUgdGVzdHMgYXJlIGluIHRlc3RfZGVzY3IKKworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworY2xhc3MgUHJvcGVydHlCYXNlKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitjbGFzcyBQcm9wZXJ0eUdldChQcm9wZXJ0eUJhc2UpOgorICAgIHBhc3MKKworY2xhc3MgUHJvcGVydHlTZXQoUHJvcGVydHlCYXNlKToKKyAgICBwYXNzCisKK2NsYXNzIFByb3BlcnR5RGVsKFByb3BlcnR5QmFzZSk6CisgICAgcGFzcworCitjbGFzcyBCYXNlQ2xhc3Mob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3NwYW0gPSA1CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3BhbShzZWxmKToKKyAgICAgICAgIiIiQmFzZUNsYXNzLmdldHRlciIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc3BhbQorCisgICAgQHNwYW0uc2V0dGVyCisgICAgZGVmIHNwYW0oc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLl9zcGFtID0gdmFsdWUKKworICAgIEBzcGFtLmRlbGV0ZXIKKyAgICBkZWYgc3BhbShzZWxmKToKKyAgICAgICAgZGVsIHNlbGYuX3NwYW0KKworY2xhc3MgU3ViQ2xhc3MoQmFzZUNsYXNzKToKKworICAgIEBCYXNlQ2xhc3Muc3BhbS5nZXR0ZXIKKyAgICBkZWYgc3BhbShzZWxmKToKKyAgICAgICAgIiIiU3ViQ2xhc3MuZ2V0dGVyIiIiCisgICAgICAgIHJhaXNlIFByb3BlcnR5R2V0KHNlbGYuX3NwYW0pCisKKyAgICBAc3BhbS5zZXR0ZXIKKyAgICBkZWYgc3BhbShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHJhaXNlIFByb3BlcnR5U2V0KHNlbGYuX3NwYW0pCisKKyAgICBAc3BhbS5kZWxldGVyCisgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgIHJhaXNlIFByb3BlcnR5RGVsKHNlbGYuX3NwYW0pCisKK2NsYXNzIFByb3BlcnR5RG9jQmFzZShvYmplY3QpOgorICAgIF9zcGFtID0gMQorICAgIGRlZiBfZ2V0X3NwYW0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zcGFtCisgICAgc3BhbSA9IHByb3BlcnR5KF9nZXRfc3BhbSwgZG9jPSJzcGFtIHNwYW0gc3BhbSIpCisKK2NsYXNzIFByb3BlcnR5RG9jU3ViKFByb3BlcnR5RG9jQmFzZSk6CisgICAgQFByb3BlcnR5RG9jQmFzZS5zcGFtLmdldHRlcgorICAgIGRlZiBzcGFtKHNlbGYpOgorICAgICAgICAiIiJUaGUgZGVjb3JhdG9yIGRvZXMgbm90IHVzZSB0aGlzIGRvYyBzdHJpbmciIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NwYW0KKworY2xhc3MgUHJvcGVydHlTdWJOZXdHZXR0ZXIoQmFzZUNsYXNzKToKKyAgICBAQmFzZUNsYXNzLnNwYW0uZ2V0dGVyCisgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgICIiIm5ldyBkb2NzdHJpbmciIiIKKyAgICAgICAgcmV0dXJuIDUKKworY2xhc3MgUHJvcGVydHlOZXdHZXR0ZXIob2JqZWN0KToKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc3BhbShzZWxmKToKKyAgICAgICAgIiIib3JpZ2luYWwgZG9jc3RyaW5nIiIiCisgICAgICAgIHJldHVybiAxCisgICAgQHNwYW0uZ2V0dGVyCisgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgICIiIm5ldyBkb2NzdHJpbmciIiIKKyAgICAgICAgcmV0dXJuIDgKKworY2xhc3MgUHJvcGVydHlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcHJvcGVydHlfZGVjb3JhdG9yX2Jhc2VjbGFzcyhzZWxmKToKKyAgICAgICAgIyBzZWUgIzE2MjAKKyAgICAgICAgYmFzZSA9IEJhc2VDbGFzcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS5zcGFtLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2UuX3NwYW0sIDUpCisgICAgICAgIGJhc2Uuc3BhbSA9IDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS5zcGFtLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLl9zcGFtLCAxMCkKKyAgICAgICAgZGVsYXR0cihiYXNlLCAic3BhbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihiYXNlLCAic3BhbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoYmFzZSwgIl9zcGFtIikpCisgICAgICAgIGJhc2Uuc3BhbSA9IDIwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS5zcGFtLCAyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLl9zcGFtLCAyMCkKKworICAgIGRlZiB0ZXN0X3Byb3BlcnR5X2RlY29yYXRvcl9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgIyBzZWUgIzE2MjAKKyAgICAgICAgc3ViID0gU3ViQ2xhc3MoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQcm9wZXJ0eUdldCwgZ2V0YXR0ciwgc3ViLCAic3BhbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFByb3BlcnR5U2V0LCBzZXRhdHRyLCBzdWIsICJzcGFtIiwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUHJvcGVydHlEZWwsIGRlbGF0dHIsIHN1YiwgInNwYW0iKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RfcHJvcGVydHlfZGVjb3JhdG9yX3N1YmNsYXNzX2RvYyhzZWxmKToKKyAgICAgICAgc3ViID0gU3ViQ2xhc3MoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1Yi5fX2NsYXNzX18uc3BhbS5fX2RvY19fLCAiU3ViQ2xhc3MuZ2V0dGVyIikKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0X3Byb3BlcnR5X2RlY29yYXRvcl9iYXNlY2xhc3NfZG9jKHNlbGYpOgorICAgICAgICBiYXNlID0gQmFzZUNsYXNzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLl9fY2xhc3NfXy5zcGFtLl9fZG9jX18sICJCYXNlQ2xhc3MuZ2V0dGVyIikKKworICAgIGRlZiB0ZXN0X3Byb3BlcnR5X2RlY29yYXRvcl9kb2Moc2VsZik6CisgICAgICAgIGJhc2UgPSBQcm9wZXJ0eURvY0Jhc2UoKQorICAgICAgICBzdWIgPSBQcm9wZXJ0eURvY1N1YigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS5fX2NsYXNzX18uc3BhbS5fX2RvY19fLCAic3BhbSBzcGFtIHNwYW0iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1Yi5fX2NsYXNzX18uc3BhbS5fX2RvY19fLCAic3BhbSBzcGFtIHNwYW0iKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RfcHJvcGVydHlfZ2V0dGVyX2RvY19vdmVycmlkZShzZWxmKToKKyAgICAgICAgbmV3Z2V0dGVyc3ViID0gUHJvcGVydHlTdWJOZXdHZXR0ZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld2dldHRlcnN1Yi5zcGFtLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld2dldHRlcnN1Yi5fX2NsYXNzX18uc3BhbS5fX2RvY19fLCAibmV3IGRvY3N0cmluZyIpCisgICAgICAgIG5ld2dldHRlciA9IFByb3BlcnR5TmV3R2V0dGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdnZXR0ZXIuc3BhbSwgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdnZXR0ZXIuX19jbGFzc19fLnNwYW0uX19kb2NfXywgIm5ldyBkb2NzdHJpbmciKQorCisKKyMgSXNzdWUgNTg5MDogc3ViY2xhc3NlcyBvZiBwcm9wZXJ0eSBkbyBub3QgcHJlc2VydmUgbWV0aG9kIF9fZG9jX18gc3RyaW5ncworY2xhc3MgUHJvcGVydHlTdWIocHJvcGVydHkpOgorICAgICIiIlRoaXMgaXMgYSBzdWJjbGFzcyBvZiBwcm9wZXJ0eSIiIgorCitjbGFzcyBQcm9wZXJ0eVN1YlNsb3RzKHByb3BlcnR5KToKKyAgICAiIiJUaGlzIGlzIGEgc3ViY2xhc3Mgb2YgcHJvcGVydHkgdGhhdCBkZWZpbmVzIF9fc2xvdHNfXyIiIgorICAgIF9fc2xvdHNfXyA9ICgpCisKK2NsYXNzIFByb3BlcnR5U3ViY2xhc3NUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zbG90c19kb2NzdHJpbmdfY29weV9leGNlcHRpb24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgICAgIEBQcm9wZXJ0eVN1YlNsb3RzCisgICAgICAgICAgICAgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICIiIlRyeWluZyB0byBjb3B5IHRoaXMgZG9jc3RyaW5nIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIiIiCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiQXR0cmlidXRlRXJyb3Igbm90IHJhaXNlZCIpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF9kb2NzdHJpbmdfY29weShzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBAUHJvcGVydHlTdWIKKyAgICAgICAgICAgIGRlZiBzcGFtKHNlbGYpOgorICAgICAgICAgICAgICAgICIiInNwYW0gd3JhcHBlZCBpbiBwcm9wZXJ0eSBzdWJjbGFzcyIiIgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBGb28uc3BhbS5fX2RvY19fLAorICAgICAgICAgICAgInNwYW0gd3JhcHBlZCBpbiBwcm9wZXJ0eSBzdWJjbGFzcyIpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF9wcm9wZXJ0eV9zZXR0ZXJfY29waWVzX2dldHRlcl9kb2NzdHJpbmcoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLl9zcGFtID0gMQorICAgICAgICAgICAgQFByb3BlcnR5U3ViCisgICAgICAgICAgICBkZWYgc3BhbShzZWxmKToKKyAgICAgICAgICAgICAgICAiIiJzcGFtIHdyYXBwZWQgaW4gcHJvcGVydHkgc3ViY2xhc3MiIiIKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3BhbQorICAgICAgICAgICAgQHNwYW0uc2V0dGVyCisgICAgICAgICAgICBkZWYgc3BhbShzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgIiIidGhpcyBkb2NzdHJpbmcgaXMgaWdub3JlZCIiIgorICAgICAgICAgICAgICAgIHNlbGYuX3NwYW0gPSB2YWx1ZQorICAgICAgICBmb28gPSBGb28oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5zcGFtLCAxKQorICAgICAgICBmb28uc3BhbSA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uc3BhbSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIEZvby5zcGFtLl9fZG9jX18sCisgICAgICAgICAgICAic3BhbSB3cmFwcGVkIGluIHByb3BlcnR5IHN1YmNsYXNzIikKKyAgICAgICAgY2xhc3MgRm9vU3ViKEZvbyk6CisgICAgICAgICAgICBARm9vLnNwYW0uc2V0dGVyCisgICAgICAgICAgICBkZWYgc3BhbShzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgIiIiYW5vdGhlciBpZ25vcmVkIGRvY3N0cmluZyIiIgorICAgICAgICAgICAgICAgIHNlbGYuX3NwYW0gPSAnZWdncycKKyAgICAgICAgZm9vc3ViID0gRm9vU3ViKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb29zdWIuc3BhbSwgMSkKKyAgICAgICAgZm9vc3ViLnNwYW0gPSA3CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vc3ViLnNwYW0sICdlZ2dzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIEZvb1N1Yi5zcGFtLl9fZG9jX18sCisgICAgICAgICAgICAic3BhbSB3cmFwcGVkIGluIHByb3BlcnR5IHN1YmNsYXNzIikKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0X3Byb3BlcnR5X25ld19nZXR0ZXJfbmV3X2RvY3N0cmluZyhzZWxmKToKKworICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIEBQcm9wZXJ0eVN1YgorICAgICAgICAgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgICAgICAgICAgIiIiYSBkb2NzdHJpbmciIiIKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgQHNwYW0uZ2V0dGVyCisgICAgICAgICAgICBkZWYgc3BhbShzZWxmKToKKyAgICAgICAgICAgICAgICAiIiJhIG5ldyBkb2NzdHJpbmciIiIKKyAgICAgICAgICAgICAgICByZXR1cm4gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZvby5zcGFtLl9fZG9jX18sICJhIG5ldyBkb2NzdHJpbmciKQorICAgICAgICBjbGFzcyBGb29CYXNlKG9iamVjdCk6CisgICAgICAgICAgICBAUHJvcGVydHlTdWIKKyAgICAgICAgICAgIGRlZiBzcGFtKHNlbGYpOgorICAgICAgICAgICAgICAgICIiImEgZG9jc3RyaW5nIiIiCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgY2xhc3MgRm9vMihGb29CYXNlKToKKyAgICAgICAgICAgIEBGb29CYXNlLnNwYW0uZ2V0dGVyCisgICAgICAgICAgICBkZWYgc3BhbShzZWxmKToKKyAgICAgICAgICAgICAgICAiIiJhIG5ldyBkb2NzdHJpbmciIiIKKyAgICAgICAgICAgICAgICByZXR1cm4gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZvby5zcGFtLl9fZG9jX18sICJhIG5ldyBkb2NzdHJpbmciKQorCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChQcm9wZXJ0eVRlc3RzLCBQcm9wZXJ0eVN1YmNsYXNzVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Byb3BlcnR5LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Byb3BlcnR5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjA0YWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJvcGVydHkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Byb3BlcnR5LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Byb3BlcnR5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjA0YWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJvcGVydHkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BzdGF0cy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BzdGF0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWQ5NDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHN0YXRzLnB5CkBAIC0wLDAgKzEsMzIgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBwc3RhdHMKKworCisKK2NsYXNzIEFkZENhbGxlcnNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIHBzdGF0cy5hZGRfY2FsbGVycyBoZWxwZXIuIiIiCisKKyAgICBkZWYgdGVzdF9jb21iaW5lX3Jlc3VsdHMoc2VsZik6CisgICAgICAgICIiInBzdGF0cy5hZGRfY2FsbGVycyBzaG91bGQgY29tYmluZSB0aGUgY2FsbCByZXN1bHRzIG9mIGJvdGggdGFyZ2V0CisgICAgICAgIGFuZCBzb3VyY2UgYnkgYWRkaW5nIHRoZSBjYWxsIHRpbWUuIFNlZSBpc3N1ZTEyNjkuIiIiCisgICAgICAgICMgbmV3IGZvcm1hdDogdXNlZCBieSB0aGUgY1Byb2ZpbGUgbW9kdWxlCisgICAgICAgIHRhcmdldCA9IHsiYSI6ICgxLCAyLCAzLCA0KX0KKyAgICAgICAgc291cmNlID0geyJhIjogKDEsIDIsIDMsIDQpLCAiYiI6ICg1LCA2LCA3LCA4KX0KKyAgICAgICAgbmV3X2NhbGxlcnMgPSBwc3RhdHMuYWRkX2NhbGxlcnModGFyZ2V0LCBzb3VyY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X2NhbGxlcnMsIHsnYSc6ICgyLCA0LCA2LCA4KSwgJ2InOiAoNSwgNiwgNywgOCl9KQorICAgICAgICAjIG9sZCBmb3JtYXQ6IHVzZWQgYnkgdGhlIHByb2ZpbGUgbW9kdWxlCisgICAgICAgIHRhcmdldCA9IHsiYSI6IDF9CisgICAgICAgIHNvdXJjZSA9IHsiYSI6IDEsICJiIjogNX0KKyAgICAgICAgbmV3X2NhbGxlcnMgPSBwc3RhdHMuYWRkX2NhbGxlcnModGFyZ2V0LCBzb3VyY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X2NhbGxlcnMsIHsnYSc6IDIsICdiJzogNX0pCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIEFkZENhbGxlcnNUZXN0Q2FzZQorICAgICkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wc3RhdHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHN0YXRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWMyYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHN0YXRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wc3RhdHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHN0YXRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWMyYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHN0YXRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wdHkucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wdHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjMzhjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B0eS5weQpAQCAtMCwwICsxLDI4OSBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgcnVuX3VuaXR0ZXN0LCBpbXBvcnRfbW9kdWxlCisKKyNTa2lwIHRoZXNlIHRlc3RzIGlmIGVpdGhlciBmY250bCBvciB0ZXJtaW9zIGlzIG5vdCBhdmFpbGFibGUKK2ZjbnRsID0gaW1wb3J0X21vZHVsZSgnZmNudGwnKQoraW1wb3J0X21vZHVsZSgndGVybWlvcycpCisKK2ltcG9ydCBlcnJubworaW1wb3J0IHB0eQoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc2VsZWN0CitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc29ja2V0CitpbXBvcnQgdW5pdHRlc3QKKworVEVTVF9TVFJJTkdfMSA9ICJJIHdpc2ggdG8gYnV5IGEgZmlzaCBsaWNlbnNlLlxuIgorVEVTVF9TVFJJTkdfMiA9ICJGb3IgbXkgcGV0IGZpc2gsIEVyaWMuXG4iCisKK2lmIHZlcmJvc2U6CisgICAgZGVmIGRlYnVnKG1zZyk6CisgICAgICAgIHByaW50IG1zZworZWxzZToKKyAgICBkZWYgZGVidWcobXNnKToKKyAgICAgICAgcGFzcworCisKK2RlZiBub3JtYWxpemVfb3V0cHV0KGRhdGEpOgorICAgICMgU29tZSBvcGVyYXRpbmcgc3lzdGVtcyBkbyBjb252ZXJzaW9ucyBvbiBuZXdsaW5lLiAgV2UgY291bGQgcG9zc2libHkKKyAgICAjIGZpeCB0aGF0IGJ5IGRvaW5nIHRoZSBhcHByb3ByaWF0ZSB0ZXJtaW9zLnRjc2V0YXR0cigpcy4gIEkgY291bGRuJ3QKKyAgICAjIGZpZ3VyZSBvdXQgdGhlIHJpZ2h0IGNvbWJvIG9uIFRydTY0IGFuZCBJIGRvbid0IGhhdmUgYW4gSVJJWCBib3guCisgICAgIyBTbyBqdXN0IG5vcm1hbGl6ZSB0aGUgb3V0cHV0IGFuZCBkb2MgdGhlIHByb2JsZW0gTy9TZXMgYnkgYWxsb3dpbmcKKyAgICAjIGNlcnRhaW4gY29tYmluYXRpb25zIGZvciBzb21lIHBsYXRmb3JtcywgYnV0IGF2b2lkIGFsbG93aW5nIG90aGVyCisgICAgIyBkaWZmZXJlbmNlcyAobGlrZSBleHRyYSB3aGl0ZXNwYWNlLCB0cmFpbGluZyBnYXJiYWdlLCBldGMuKQorCisgICAgIyBUaGlzIGlzIGFib3V0IHRoZSBiZXN0IHdlIGNhbiBkbyB3aXRob3V0IGdldHRpbmcgc29tZSBmZWVkYmFjaworICAgICMgZnJvbSBzb21lb25lIG1vcmUga25vd2xlZGdhYmxlLgorCisgICAgIyBPU0YvMSAoVHJ1NjQpIGFwcGFyZW50bHkgdHVybnMgXG4gaW50byBcclxyXG4uCisgICAgaWYgZGF0YS5lbmRzd2l0aCgnXHJcclxuJyk6CisgICAgICAgIHJldHVybiBkYXRhLnJlcGxhY2UoJ1xyXHJcbicsICdcbicpCisKKyAgICAjIElSSVggYXBwYXJlbnRseSB0dXJucyBcbiBpbnRvIFxyXG4uCisgICAgaWYgZGF0YS5lbmRzd2l0aCgnXHJcbicpOgorICAgICAgICByZXR1cm4gZGF0YS5yZXBsYWNlKCdcclxuJywgJ1xuJykKKworICAgIHJldHVybiBkYXRhCisKKworIyBNYXJnaW5hbCB0ZXN0aW5nIG9mIHB0eSBzdWl0ZS4gQ2Fubm90IGRvIGV4dGVuc2l2ZSAnZG8gb3IgZmFpbCcgdGVzdGluZworIyBiZWNhdXNlIHB0eSBjb2RlIGlzIG5vdCB0b28gcG9ydGFibGUuCisjIFhYWChubm9yd2l0eik6ICB0aGVzZSB0ZXN0cyBsZWFrIGZkcyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yLgorY2xhc3MgUHR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIGlzYXR0eSgpIGFuZCBjbG9zZSgpIGNhbiBoYW5nIG9uIHNvbWUgcGxhdGZvcm1zLiAgU2V0IGFuIGFsYXJtCisgICAgICAgICMgYmVmb3JlIHJ1bm5pbmcgdGhlIHRlc3QgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGhhbmcgZm9yZXZlci4KKyAgICAgICAgc2VsZi5vbGRfYWxhcm0gPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBzZWxmLmhhbmRsZV9zaWcpCisgICAgICAgIHNpZ25hbC5hbGFybSgxMCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIyByZW1vdmUgYWxhcm0sIHJlc3RvcmUgb2xkIGFsYXJtIGhhbmRsZXIKKyAgICAgICAgc2lnbmFsLmFsYXJtKDApCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIHNlbGYub2xkX2FsYXJtKQorCisgICAgZGVmIGhhbmRsZV9zaWcoc2VsZiwgc2lnLCBmcmFtZSk6CisgICAgICAgIHNlbGYuZmFpbCgiaXNhdHR5IGh1bmciKQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlYnVnKCJDYWxsaW5nIG1hc3Rlcl9vcGVuKCkiKQorICAgICAgICAgICAgbWFzdGVyX2ZkLCBzbGF2ZV9uYW1lID0gcHR5Lm1hc3Rlcl9vcGVuKCkKKyAgICAgICAgICAgIGRlYnVnKCJHb3QgbWFzdGVyX2ZkICclZCcsIHNsYXZlX25hbWUgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgKG1hc3Rlcl9mZCwgc2xhdmVfbmFtZSkpCisgICAgICAgICAgICBkZWJ1ZygiQ2FsbGluZyBzbGF2ZV9vcGVuKCVyKSIgJSAoc2xhdmVfbmFtZSwpKQorICAgICAgICAgICAgc2xhdmVfZmQgPSBwdHkuc2xhdmVfb3BlbihzbGF2ZV9uYW1lKQorICAgICAgICAgICAgZGVidWcoIkdvdCBzbGF2ZV9mZCAnJWQnIiAlIHNsYXZlX2ZkKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICMgIiBBbiBvcHRpb25hbCBmZWF0dXJlIGNvdWxkIG5vdCBiZSBpbXBvcnRlZCAiIC4uLiA/CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCwgIlBzZXVkby10ZXJtaW5hbHMgKHNlZW1pbmdseSkgbm90IGZ1bmN0aW9uYWwuIgorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5pc2F0dHkoc2xhdmVfZmQpLCAnc2xhdmVfZmQgaXMgbm90IGEgdHR5JykKKworICAgICAgICAjIFNvbGFyaXMgcmVxdWlyZXMgcmVhZGluZyB0aGUgZmQgYmVmb3JlIGFueXRoaW5nIGlzIHJldHVybmVkLgorICAgICAgICAjIE15IGd1ZXNzIGlzIHRoYXQgc2luY2Ugd2Ugb3BlbiBhbmQgY2xvc2UgdGhlIHNsYXZlIGZkCisgICAgICAgICMgaW4gbWFzdGVyX29wZW4oKSwgd2UgbmVlZCB0byByZWFkIHRoZSBFT0YuCisKKyAgICAgICAgIyBFbnN1cmUgdGhlIGZkIGlzIG5vbi1ibG9ja2luZyBpbiBjYXNlIHRoZXJlJ3Mgbm90aGluZyB0byByZWFkLgorICAgICAgICBvcmlnX2ZsYWdzID0gZmNudGwuZmNudGwobWFzdGVyX2ZkLCBmY250bC5GX0dFVEZMKQorICAgICAgICBmY250bC5mY250bChtYXN0ZXJfZmQsIGZjbnRsLkZfU0VURkwsIG9yaWdfZmxhZ3MgfCBvcy5PX05PTkJMT0NLKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzMSA9IG9zLnJlYWQobWFzdGVyX2ZkLCAxMDI0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgczEpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQUdBSU46CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgIyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBmbGFncy4KKyAgICAgICAgZmNudGwuZmNudGwobWFzdGVyX2ZkLCBmY250bC5GX1NFVEZMLCBvcmlnX2ZsYWdzKQorCisgICAgICAgIGRlYnVnKCJXcml0aW5nIHRvIHNsYXZlX2ZkIikKKyAgICAgICAgb3Mud3JpdGUoc2xhdmVfZmQsIFRFU1RfU1RSSU5HXzEpCisgICAgICAgIHMxID0gb3MucmVhZChtYXN0ZXJfZmQsIDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0kgd2lzaCB0byBidXkgYSBmaXNoIGxpY2Vuc2UuXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZV9vdXRwdXQoczEpKQorCisgICAgICAgIGRlYnVnKCJXcml0aW5nIGNodW5rZWQgb3V0cHV0IikKKyAgICAgICAgb3Mud3JpdGUoc2xhdmVfZmQsIFRFU1RfU1RSSU5HXzJbOjVdKQorICAgICAgICBvcy53cml0ZShzbGF2ZV9mZCwgVEVTVF9TVFJJTkdfMls1Ol0pCisgICAgICAgIHMyID0gb3MucmVhZChtYXN0ZXJfZmQsIDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0ZvciBteSBwZXQgZmlzaCwgRXJpYy5cbicsIG5vcm1hbGl6ZV9vdXRwdXQoczIpKQorCisgICAgICAgIG9zLmNsb3NlKHNsYXZlX2ZkKQorICAgICAgICBvcy5jbG9zZShtYXN0ZXJfZmQpCisKKworICAgIGRlZiB0ZXN0X2Zvcmsoc2VsZik6CisgICAgICAgIGRlYnVnKCJjYWxsaW5nIHB0eS5mb3JrKCkiKQorICAgICAgICBwaWQsIG1hc3Rlcl9mZCA9IHB0eS5mb3JrKCkKKyAgICAgICAgaWYgcGlkID09IHB0eS5DSElMRDoKKyAgICAgICAgICAgICMgc3Rkb3V0IHNob3VsZCBiZSBjb25uZWN0ZWQgdG8gYSB0dHkuCisgICAgICAgICAgICBpZiBub3Qgb3MuaXNhdHR5KDEpOgorICAgICAgICAgICAgICAgIGRlYnVnKCJDaGlsZCdzIGZkIDEgaXMgbm90IGEgdHR5PyEiKQorICAgICAgICAgICAgICAgIG9zLl9leGl0KDMpCisKKyAgICAgICAgICAgICMgQWZ0ZXIgcHR5LmZvcmsoKSwgdGhlIGNoaWxkIHNob3VsZCBhbHJlYWR5IGJlIGEgc2Vzc2lvbiBsZWFkZXIuCisgICAgICAgICAgICAjIChvbiB0aG9zZSBzeXN0ZW1zIHRoYXQgaGF2ZSB0aGF0IGNvbmNlcHQuKQorICAgICAgICAgICAgZGVidWcoIkluIGNoaWxkLCBjYWxsaW5nIG9zLnNldHNpZCgpIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5zZXRzaWQoKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgIyBHb29kLCB3ZSBhbHJlYWR5IHdlcmUgc2Vzc2lvbiBsZWFkZXIKKyAgICAgICAgICAgICAgICBkZWJ1ZygiR29vZDogT1NFcnJvciB3YXMgcmFpc2VkLiIpCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICMgSGF2ZSBwdHksIGJ1dCBub3Qgc2V0c2lkKCk/CisgICAgICAgICAgICAgICAgZGVidWcoIk5vIHNldHNpZCgpIGF2YWlsYWJsZT8iKQorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIFdlIGRvbid0IHdhbnQgdGhpcyBlcnJvciB0byBwcm9wYWdhdGUsIGVzY2FwaW5nIHRoZSBjYWxsIHRvCisgICAgICAgICAgICAgICAgIyBvcy5fZXhpdCgpIGFuZCBjYXVzaW5nIHZlcnkgcGVjdWxpYXIgYmVoYXZpb3IgaW4gdGhlIGNhbGxpbmcKKyAgICAgICAgICAgICAgICAjIHJlZ3J0ZXN0LnB5ICEKKyAgICAgICAgICAgICAgICAjIE5vdGU6IGNvdWxkIGFkZCB0cmFjZWJhY2sgcHJpbnRpbmcgaGVyZS4KKyAgICAgICAgICAgICAgICBkZWJ1ZygiQW4gdW5leHBlY3RlZCBlcnJvciB3YXMgcmFpc2VkLiIpCisgICAgICAgICAgICAgICAgb3MuX2V4aXQoMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVidWcoIm9zLnNldHNpZCgpIHN1Y2NlZWRlZCEgKGJhZCEpIikKKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgyKQorICAgICAgICAgICAgb3MuX2V4aXQoNCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlYnVnKCJXYWl0aW5nIGZvciBjaGlsZCAoJWQpIHRvIGZpbmlzaC4iICUgcGlkKQorICAgICAgICAgICAgIyBJbiB2ZXJib3NlIG1vZGUsIHdlIGhhdmUgdG8gY29uc3VtZSB0aGUgZGVidWcgb3V0cHV0IGZyb20gdGhlCisgICAgICAgICAgICAjIGNoaWxkIG9yIHRoZSBjaGlsZCB3aWxsIGJsb2NrLCBjYXVzaW5nIHRoaXMgdGVzdCB0byBoYW5nIGluIHRoZQorICAgICAgICAgICAgIyBwYXJlbnQncyB3YWl0cGlkKCkgY2FsbC4gIFRoZSBjaGlsZCBibG9ja3MgYWZ0ZXIgYQorICAgICAgICAgICAgIyBwbGF0Zm9ybS1kZXBlbmRlbnQgYW1vdW50IG9mIGRhdGEgaXMgd3JpdHRlbiB0byBpdHMgZmQuICBPbgorICAgICAgICAgICAgIyBMaW51eCAyLjYsIGl0J3MgNDAwMCBieXRlcyBhbmQgdGhlIGNoaWxkIHdvbid0IGJsb2NrLCBidXQgb24gT1MKKyAgICAgICAgICAgICMgWCBldmVuIHRoZSBzbWFsbCB3cml0ZXMgaW4gdGhlIGNoaWxkIGFib3ZlIHdpbGwgYmxvY2sgaXQuICBBbHNvCisgICAgICAgICAgICAjIG9uIExpbnV4LCB0aGUgcmVhZCgpIHdpbGwgcmFpc2UgYW4gT1NFcnJvciAoaW5wdXQvb3V0cHV0IGVycm9yKQorICAgICAgICAgICAgIyB3aGVuIGl0IHRyaWVzIHRvIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYnV0IHRoZSBjaGlsZCdzCisgICAgICAgICAgICAjIGFscmVhZHkgZXhpdGVkLCBzbyBjYXRjaCBhbmQgZGlzY2FyZCB0aG9zZSBleGNlcHRpb25zLiAgSXQncyBub3QKKyAgICAgICAgICAgICMgd29ydGggY2hlY2tpbmcgZm9yIEVJTy4KKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gb3MucmVhZChtYXN0ZXJfZmQsIDgwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoZGF0YS5yZXBsYWNlKCdcclxuJywgJ1xuJykpCisKKyAgICAgICAgICAgICMjbGluZSA9IG9zLnJlYWQobWFzdGVyX2ZkLCA4MCkKKyAgICAgICAgICAgICMjbGluZXMgPSBsaW5lLnJlcGxhY2UoJ1xyXG4nLCAnXG4nKS5zcGxpdCgnXG4nKQorICAgICAgICAgICAgIyNpZiBGYWxzZSBhbmQgbGluZXMgIT0gWydJbiBjaGlsZCwgY2FsbGluZyBvcy5zZXRzaWQoKScsCisgICAgICAgICAgICAjIyAgICAgICAgICAgICAnR29vZDogT1NFcnJvciB3YXMgcmFpc2VkLicsICcnXToKKyAgICAgICAgICAgICMjICAgIHJhaXNlIFRlc3RGYWlsZWQoIlVuZXhwZWN0ZWQgb3V0cHV0IGZyb20gY2hpbGQ6ICVyIiAlIGxpbmUpCisKKyAgICAgICAgICAgIChwaWQsIHN0YXR1cykgPSBvcy53YWl0cGlkKHBpZCwgMCkKKyAgICAgICAgICAgIHJlcyA9IHN0YXR1cyA+PiA4CisgICAgICAgICAgICBkZWJ1ZygiQ2hpbGQgKCVkKSBleGl0ZWQgd2l0aCBzdGF0dXMgJWQgKCVkKS4iICUgKHBpZCwgcmVzLCBzdGF0dXMpKQorICAgICAgICAgICAgaWYgcmVzID09IDE6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJDaGlsZCByYWlzZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gaW4gb3Muc2V0c2lkKCkiKQorICAgICAgICAgICAgZWxpZiByZXMgPT0gMjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInB0eS5mb3JrKCkgZmFpbGVkIHRvIG1ha2UgY2hpbGQgYSBzZXNzaW9uIGxlYWRlci4iKQorICAgICAgICAgICAgZWxpZiByZXMgPT0gMzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkNoaWxkIHNwYXduZWQgYnkgcHR5LmZvcmsoKSBkaWQgbm90IGhhdmUgYSB0dHkgYXMgc3Rkb3V0IikKKyAgICAgICAgICAgIGVsaWYgcmVzICE9IDQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJwdHkuZm9yaygpIGZhaWxlZCBmb3IgdW5rbm93biByZWFzb25zLiIpCisKKyAgICAgICAgICAgICMjZGVidWcoIlJlYWRpbmcgZnJvbSBtYXN0ZXJfZmQgbm93IHRoYXQgdGhlIGNoaWxkIGhhcyBleGl0ZWQiKQorICAgICAgICAgICAgIyN0cnk6CisgICAgICAgICAgICAjIyAgICBzMSA9IG9zLnJlYWQobWFzdGVyX2ZkLCAxMDI0KQorICAgICAgICAgICAgIyNleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAjIyAgICBwYXNzCisgICAgICAgICAgICAjI2Vsc2U6CisgICAgICAgICAgICAjIyAgICByYWlzZSBUZXN0RmFpbGVkKCJSZWFkIGZyb20gbWFzdGVyX2ZkIGRpZCBub3QgcmFpc2UgZXhjZXB0aW9uIikKKworICAgICAgICBvcy5jbG9zZShtYXN0ZXJfZmQpCisKKyAgICAgICAgIyBwdHkuZm9yaygpIHBhc3NlZC4KKworCitjbGFzcyBTbWFsbFB0eVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUaGVzZSB0ZXN0cyBkb24ndCBzcGF3biBjaGlsZHJlbiBvciBoYW5nLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm9yaWdfc3RkaW5fZmlsZW5vID0gcHR5LlNURElOX0ZJTEVOTworICAgICAgICBzZWxmLm9yaWdfc3Rkb3V0X2ZpbGVubyA9IHB0eS5TVERPVVRfRklMRU5PCisgICAgICAgIHNlbGYub3JpZ19wdHlfc2VsZWN0ID0gcHR5LnNlbGVjdAorICAgICAgICBzZWxmLmZkcyA9IFtdICAjIEEgbGlzdCBvZiBmaWxlIGRlc2NyaXB0b3JzIHRvIGNsb3NlLgorICAgICAgICBzZWxmLnNlbGVjdF9yZmRzX2xlbmd0aHMgPSBbXQorICAgICAgICBzZWxmLnNlbGVjdF9yZmRzX3Jlc3VsdHMgPSBbXQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBwdHkuU1RESU5fRklMRU5PID0gc2VsZi5vcmlnX3N0ZGluX2ZpbGVubworICAgICAgICBwdHkuU1RET1VUX0ZJTEVOTyA9IHNlbGYub3JpZ19zdGRvdXRfZmlsZW5vCisgICAgICAgIHB0eS5zZWxlY3QgPSBzZWxmLm9yaWdfcHR5X3NlbGVjdAorICAgICAgICBmb3IgZmQgaW4gc2VsZi5mZHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF9waXBlKHNlbGYpOgorICAgICAgICBwaXBlX2ZkcyA9IG9zLnBpcGUoKQorICAgICAgICBzZWxmLmZkcy5leHRlbmQocGlwZV9mZHMpCisgICAgICAgIHJldHVybiBwaXBlX2ZkcworCisgICAgZGVmIF9tb2NrX3NlbGVjdChzZWxmLCByZmRzLCB3ZmRzLCB4ZmRzKToKKyAgICAgICAgIyBUaGlzIHdpbGwgcmFpc2UgSW5kZXhFcnJvciB3aGVuIG5vIG1vcmUgZXhwZWN0ZWQgY2FsbHMgZXhpc3QuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZWxlY3RfcmZkc19sZW5ndGhzLnBvcCgwKSwgbGVuKHJmZHMpKQorICAgICAgICByZXR1cm4gc2VsZi5zZWxlY3RfcmZkc19yZXN1bHRzLnBvcCgwKSwgW10sIFtdCisKKyAgICBkZWYgdGVzdF9fY29weV90b19lYWNoKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoZSBub3JtYWwgZGF0YSBjYXNlIG9uIGJvdGggbWFzdGVyX2ZkIGFuZCBzdGRpbi4iIiIKKyAgICAgICAgcmVhZF9mcm9tX3N0ZG91dF9mZCwgbW9ja19zdGRvdXRfZmQgPSBzZWxmLl9waXBlKCkKKyAgICAgICAgcHR5LlNURE9VVF9GSUxFTk8gPSBtb2NrX3N0ZG91dF9mZAorICAgICAgICBtb2NrX3N0ZGluX2ZkLCB3cml0ZV90b19zdGRpbl9mZCA9IHNlbGYuX3BpcGUoKQorICAgICAgICBwdHkuU1RESU5fRklMRU5PID0gbW9ja19zdGRpbl9mZAorICAgICAgICBzb2NrZXRwYWlyID0gc29ja2V0LnNvY2tldHBhaXIoKQorICAgICAgICBtYXN0ZXJzID0gW3MuZmlsZW5vKCkgZm9yIHMgaW4gc29ja2V0cGFpcl0KKyAgICAgICAgc2VsZi5mZHMuZXh0ZW5kKG1hc3RlcnMpCisKKyAgICAgICAgIyBGZWVkIGRhdGEuICBTbWFsbGVyIHRoYW4gUElQRUJVRi4gIFRoZXNlIHdyaXRlcyB3aWxsIG5vdCBibG9jay4KKyAgICAgICAgb3Mud3JpdGUobWFzdGVyc1sxXSwgYidmcm9tIG1hc3RlcicpCisgICAgICAgIG9zLndyaXRlKHdyaXRlX3RvX3N0ZGluX2ZkLCBiJ2Zyb20gc3RkaW4nKQorCisgICAgICAgICMgRXhwZWN0IHR3byBzZWxlY3QgY2FsbHMsIHRoZSBsYXN0IG9uZSB3aWxsIGNhdXNlIEluZGV4RXJyb3IKKyAgICAgICAgcHR5LnNlbGVjdCA9IHNlbGYuX21vY2tfc2VsZWN0CisgICAgICAgIHNlbGYuc2VsZWN0X3JmZHNfbGVuZ3Rocy5hcHBlbmQoMikKKyAgICAgICAgc2VsZi5zZWxlY3RfcmZkc19yZXN1bHRzLmFwcGVuZChbbW9ja19zdGRpbl9mZCwgbWFzdGVyc1swXV0pCisgICAgICAgIHNlbGYuc2VsZWN0X3JmZHNfbGVuZ3Rocy5hcHBlbmQoMikKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IpOgorICAgICAgICAgICAgcHR5Ll9jb3B5KG1hc3RlcnNbMF0pCisKKyAgICAgICAgIyBUZXN0IHRoYXQgdGhlIHJpZ2h0IGRhdGEgd2VudCB0byB0aGUgcmlnaHQgcGxhY2VzLgorICAgICAgICByZmRzID0gc2VsZWN0LnNlbGVjdChbcmVhZF9mcm9tX3N0ZG91dF9mZCwgbWFzdGVyc1sxXV0sIFtdLCBbXSwgMClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbcmVhZF9mcm9tX3N0ZG91dF9mZCwgbWFzdGVyc1sxXV0sIHJmZHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucmVhZChyZWFkX2Zyb21fc3Rkb3V0X2ZkLCAyMCksIGInZnJvbSBtYXN0ZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnJlYWQobWFzdGVyc1sxXSwgMjApLCBiJ2Zyb20gc3RkaW4nKQorCisgICAgZGVmIHRlc3RfX2NvcHlfZW9mX29uX2FsbChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGUgZW1wdHkgcmVhZCBFT0YgY2FzZSBvbiBib3RoIG1hc3Rlcl9mZCBhbmQgc3RkaW4uIiIiCisgICAgICAgIHJlYWRfZnJvbV9zdGRvdXRfZmQsIG1vY2tfc3Rkb3V0X2ZkID0gc2VsZi5fcGlwZSgpCisgICAgICAgIHB0eS5TVERPVVRfRklMRU5PID0gbW9ja19zdGRvdXRfZmQKKyAgICAgICAgbW9ja19zdGRpbl9mZCwgd3JpdGVfdG9fc3RkaW5fZmQgPSBzZWxmLl9waXBlKCkKKyAgICAgICAgcHR5LlNURElOX0ZJTEVOTyA9IG1vY2tfc3RkaW5fZmQKKyAgICAgICAgc29ja2V0cGFpciA9IHNvY2tldC5zb2NrZXRwYWlyKCkKKyAgICAgICAgbWFzdGVycyA9IFtzLmZpbGVubygpIGZvciBzIGluIHNvY2tldHBhaXJdCisgICAgICAgIHNlbGYuZmRzLmV4dGVuZChtYXN0ZXJzKQorCisgICAgICAgIG9zLmNsb3NlKG1hc3RlcnNbMV0pCisgICAgICAgIHNvY2tldHBhaXJbMV0uY2xvc2UoKQorICAgICAgICBvcy5jbG9zZSh3cml0ZV90b19zdGRpbl9mZCkKKworICAgICAgICAjIEV4cGVjdCB0d28gc2VsZWN0IGNhbGxzLCB0aGUgbGFzdCBvbmUgd2lsbCBjYXVzZSBJbmRleEVycm9yCisgICAgICAgIHB0eS5zZWxlY3QgPSBzZWxmLl9tb2NrX3NlbGVjdAorICAgICAgICBzZWxmLnNlbGVjdF9yZmRzX2xlbmd0aHMuYXBwZW5kKDIpCisgICAgICAgIHNlbGYuc2VsZWN0X3JmZHNfcmVzdWx0cy5hcHBlbmQoW21vY2tfc3RkaW5fZmQsIG1hc3RlcnNbMF1dKQorICAgICAgICAjIFdlIGV4cGVjdCB0aGF0IGJvdGggZmRzIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBmZHMgbGlzdCBhcyB0aGV5CisgICAgICAgICMgYm90aCBlbmNvdW50ZXJlZCBhbiBFT0YgYmVmb3JlIHRoZSBzZWNvbmQgc2VsZWN0IGNhbGwuCisgICAgICAgIHNlbGYuc2VsZWN0X3JmZHNfbGVuZ3Rocy5hcHBlbmQoMCkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IpOgorICAgICAgICAgICAgcHR5Ll9jb3B5KG1hc3RlcnNbMF0pCisKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHJ1bl91bml0dGVzdChTbWFsbFB0eVRlc3RzLCBQdHlUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wdHkucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHR5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGVlYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHR5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wdHkucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHR5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGVlYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHR5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wd2QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wd2QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk2MTYxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B3ZC5weQpAQCAtMCwwICsxLDEwOSBAQAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitwd2QgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgncHdkJykKKworY2xhc3MgUHdkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF92YWx1ZXMoc2VsZik6CisgICAgICAgIGVudHJpZXMgPSBwd2QuZ2V0cHdhbGwoKQorICAgICAgICBlbnRyaWVzYnluYW1lID0ge30KKyAgICAgICAgZW50cmllc2J5dWlkID0ge30KKworICAgICAgICBmb3IgZSBpbiBlbnRyaWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZSksIDcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVbMF0sIGUucHdfbmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlLnB3X25hbWUsIGJhc2VzdHJpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVbMV0sIGUucHdfcGFzc3dkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGUucHdfcGFzc3dkLCBiYXNlc3RyaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlWzJdLCBlLnB3X3VpZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlLnB3X3VpZCwgKGludCwgbG9uZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVbM10sIGUucHdfZ2lkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGUucHdfZ2lkLCAoaW50LCBsb25nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZVs0XSwgZS5wd19nZWNvcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlLnB3X2dlY29zLCBiYXNlc3RyaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlWzVdLCBlLnB3X2RpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlLnB3X2RpciwgYmFzZXN0cmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZVs2XSwgZS5wd19zaGVsbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlLnB3X3NoZWxsLCBiYXNlc3RyaW5nKQorCisgICAgICAgICAgICAjIFRoZSBmb2xsb3dpbmcgd29uJ3Qgd29yaywgYmVjYXVzZSBvZiBkdXBsaWNhdGUgZW50cmllcworICAgICAgICAgICAgIyBmb3Igb25lIHVpZAorICAgICAgICAgICAgIyAgICBzZWxmLmFzc2VydEVxdWFsKHB3ZC5nZXRwd3VpZChlLnB3X3VpZCksIGUpCisgICAgICAgICAgICAjIGluc3RlYWQgb2YgdGhpcyBjb2xsZWN0IGFsbCBlbnRyaWVzIGZvciBvbmUgdWlkCisgICAgICAgICAgICAjIGFuZCBjaGVjayBhZnRlcndhcmRzCisgICAgICAgICAgICBlbnRyaWVzYnluYW1lLnNldGRlZmF1bHQoZS5wd19uYW1lLCBbXSkuYXBwZW5kKGUpCisgICAgICAgICAgICBlbnRyaWVzYnl1aWQuc2V0ZGVmYXVsdChlLnB3X3VpZCwgW10pLmFwcGVuZChlKQorCisgICAgICAgIGlmIGxlbihlbnRyaWVzKSA+IDEwMDA6ICAjIEh1Z2UgcGFzc3dkIGZpbGUgKE5JUz8pIC0tIHNraXAgdGhlIHJlc3QKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgY2hlY2sgd2hldGhlciB0aGUgZW50cnkgcmV0dXJuZWQgYnkgZ2V0cHd1aWQoKQorICAgICAgICAjIGZvciBlYWNoIHVpZCBpcyBhbW9uZyB0aG9zZSBmcm9tIGdldHB3YWxsKCkgZm9yIHRoaXMgdWlkCisgICAgICAgIGZvciBlIGluIGVudHJpZXM6CisgICAgICAgICAgICBpZiBub3QgZVswXSBvciBlWzBdID09ICcrJzoKKyAgICAgICAgICAgICAgICBjb250aW51ZSAjIHNraXAgTklTIGVudHJpZXMgZXRjLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihwd2QuZ2V0cHduYW0oZS5wd19uYW1lKSwgZW50cmllc2J5bmFtZVtlLnB3X25hbWVdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihwd2QuZ2V0cHd1aWQoZS5wd191aWQpLCBlbnRyaWVzYnl1aWRbZS5wd191aWRdKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHB3ZC5nZXRwd3VpZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwd2QuZ2V0cHd1aWQsIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHdkLmdldHB3bmFtKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHB3ZC5nZXRwd25hbSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHdkLmdldHB3YWxsLCA0MikKKworICAgICAgICAjIHRyeSB0byBnZXQgc29tZSBlcnJvcnMKKyAgICAgICAgYnluYW1lcyA9IHt9CisgICAgICAgIGJ5dWlkcyA9IHt9CisgICAgICAgIGZvciAobiwgcCwgdSwgZywgZ2Vjb3MsIGQsIHMpIGluIHB3ZC5nZXRwd2FsbCgpOgorICAgICAgICAgICAgYnluYW1lc1tuXSA9IHUKKyAgICAgICAgICAgIGJ5dWlkc1t1XSA9IG4KKworICAgICAgICBhbGxuYW1lcyA9IGJ5bmFtZXMua2V5cygpCisgICAgICAgIG5hbWVpID0gMAorICAgICAgICBmYWtlbmFtZSA9IGFsbG5hbWVzW25hbWVpXQorICAgICAgICB3aGlsZSBmYWtlbmFtZSBpbiBieW5hbWVzOgorICAgICAgICAgICAgY2hhcnMgPSBsaXN0KGZha2VuYW1lKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjaGFycykpOgorICAgICAgICAgICAgICAgIGlmIGNoYXJzW2ldID09ICd6JzoKKyAgICAgICAgICAgICAgICAgICAgY2hhcnNbaV0gPSAnQScKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIGNoYXJzW2ldID09ICdaJzoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjaGFyc1tpXSA9IGNocihvcmQoY2hhcnNbaV0pICsgMSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmFtZWkgPSBuYW1laSArIDEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZha2VuYW1lID0gYWxsbmFtZXNbbmFtZWldCisgICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgc2hvdWxkIG5ldmVyIGhhcHBlbi4uLiBpZiBzbywganVzdCBmb3JnZXQgaXQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGZha2VuYW1lID0gJycuam9pbihjaGFycykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgcHdkLmdldHB3bmFtLCBmYWtlbmFtZSkKKworICAgICAgICAjIEluIHNvbWUgY2FzZXMsIGJ5dWlkcyBpc24ndCBhIGNvbXBsZXRlIGxpc3Qgb2YgYWxsIHVzZXJzIGluIHRoZQorICAgICAgICAjIHN5c3RlbSwgc28gaWYgd2UgdHJ5IHRvIHBpY2sgYSB2YWx1ZSBub3QgaW4gYnl1aWRzICh2aWEgYSBwZXJ0dXJiaW5nCisgICAgICAgICMgbG9vcCwgc2F5KSwgcHdkLmdldHB3dWlkKCkgbWlnaHQgc3RpbGwgYmUgYWJsZSB0byBmaW5kIGRhdGEgZm9yIHRoYXQKKyAgICAgICAgIyB1aWQuIFVzaW5nIHN5cy5tYXhpbnQgbWF5IHByb3Zva2UgdGhlIHNhbWUgcHJvYmxlbXMsIGJ1dCBob3BlZnVsbHkKKyAgICAgICAgIyBpdCB3aWxsIGJlIGEgbW9yZSByZXBlYXRhYmxlIGZhaWx1cmUuCisgICAgICAgIGZha2V1aWQgPSBzeXMubWF4aW50CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oZmFrZXVpZCwgYnl1aWRzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgcHdkLmdldHB3dWlkLCBmYWtldWlkKQorCisgICAgICAgICMgLTEgc2hvdWxkbid0IGJlIGEgdmFsaWQgdWlkIGJlY2F1c2UgaXQgaGFzIGEgc3BlY2lhbCBtZWFuaW5nIGluIG1hbnkKKyAgICAgICAgIyB1aWQtcmVsYXRlZCBmdW5jdGlvbnMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHB3ZC5nZXRwd3VpZCwgLTEpCisgICAgICAgICMgc2hvdWxkIGJlIG91dCBvZiB1aWRfdCByYW5nZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgcHdkLmdldHB3dWlkLCAyKioxMjgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBwd2QuZ2V0cHd1aWQsIC0yKioxMjgpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFB3ZFRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B3ZC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wd2QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGJmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wd2QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B3ZC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wd2QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGJmNWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wd2QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5M2t3YXJuLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHkza3dhcm4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmZDhhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5M2t3YXJuLnB5CkBAIC0wLDAgKzEsNDI2IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGNoZWNrX3B5M2tfd2FybmluZ3MsIENsZWFuSW1wb3J0LCBydW5fdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworCitpZiBub3Qgc3lzLnB5M2t3YXJuaW5nOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCclcyBtdXN0IGJlIHJ1biB3aXRoIHRoZSAtMyBmbGFnJyAlIF9fbmFtZV9fKQorCit0cnk6CisgICAgZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgX193YXJuaW5ncmVnaXN0cnlfXyBhcyBfcmVnaXN0cnkKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBkZWYgY2hlY2tfZGVwcmVjYXRlZF9tb2R1bGUobW9kdWxlX25hbWUpOgorICAgICAgICByZXR1cm4gRmFsc2UKK2Vsc2U6CisgICAgcGFzdF93YXJuaW5ncyA9IF9yZWdpc3RyeS5rZXlzKCkKKyAgICBkZWwgX3JlZ2lzdHJ5CisgICAgZGVmIGNoZWNrX2RlcHJlY2F0ZWRfbW9kdWxlKG1vZHVsZV9uYW1lKToKKyAgICAgICAgIiIiTG9va3VwIHRoZSBwYXN0IHdhcm5pbmdzIGZvciBtb2R1bGUgYWxyZWFkeSBsb2FkZWQgdXNpbmcKKyAgICAgICAgdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoLi4uLCBkZXByZWNhdGVkPVRydWUpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gYW55KG1vZHVsZV9uYW1lIGluIG1zZyBhbmQgJyByZW1vdmVkJyBpbiBtc2cKKyAgICAgICAgICAgICAgICAgICBhbmQgaXNzdWJjbGFzcyhjbHMsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgICAgICAgICBhbmQgKCcgbW9kdWxlJyBpbiBtc2cgb3IgJyBwYWNrYWdlJyBpbiBtc2cpCisgICAgICAgICAgICAgICAgICAgZm9yIChtc2csIGNscywgbGluZSkgaW4gcGFzdF93YXJuaW5ncykKKworZGVmIHJlc2V0X21vZHVsZV9yZWdpc3RyeShtb2R1bGUpOgorICAgIHRyeToKKyAgICAgICAgcmVnaXN0cnkgPSBtb2R1bGUuX193YXJuaW5ncmVnaXN0cnlfXworICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHJlZ2lzdHJ5LmNsZWFyKCkKKworY2xhc3MgVGVzdFB5M0tXYXJuaW5ncyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgYXNzZXJ0V2FybmluZyhzZWxmLCBfLCB3YXJuaW5nLCBleHBlY3RlZF9tZXNzYWdlKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod2FybmluZy5tZXNzYWdlKSwgZXhwZWN0ZWRfbWVzc2FnZSkKKworICAgIGRlZiBhc3NlcnROb1dhcm5pbmcoc2VsZiwgXywgcmVjb3JkZXIpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZWNvcmRlci53YXJuaW5ncyksIDApCisKKyAgICBkZWYgdGVzdF9iYWNrcXVvdGUoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gJ2JhY2txdW90ZSBub3Qgc3VwcG9ydGVkIGluIDMueDsgdXNlIHJlcHIoKScKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKChleHBlY3RlZCwgU3ludGF4V2FybmluZykpOgorICAgICAgICAgICAgZXhlYyAiYDJgIiBpbiB7fQorCisgICAgZGVmIHRlc3RfcGFyZW5fYXJnX25hbWVzKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICdwYXJlbnRoZXNpemVkIGFyZ3VtZW50IG5hbWVzIGFyZSBpbnZhbGlkIGluIDMueCcKKyAgICAgICAgZGVmIGNoZWNrKHMpOgorICAgICAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKChleHBlY3RlZCwgU3ludGF4V2FybmluZykpOgorICAgICAgICAgICAgICAgIGV4ZWMgcyBpbiB7fQorICAgICAgICBjaGVjaygiZGVmIGYoKHgpKTogcGFzcyIpCisgICAgICAgIGNoZWNrKCJkZWYgZigoKCh4KSkpLCAoeSkpOiBwYXNzIikKKyAgICAgICAgY2hlY2soImRlZiBmKCh4KSwgKCgoeSkpKSwgbT0zMik6IHBhc3MiKQorICAgICAgICAjIFNvbWV0aGluZyBsaWtlIGRlZiBmKChhLCAoYikpKTogcGFzcyB3aWxsIHJhaXNlIHRoZSB0dXBsZQorICAgICAgICAjIHVucGFja2luZyB3YXJuaW5nLgorCisgICAgZGVmIHRlc3RfZm9yYmlkZGVuX25hbWVzKHNlbGYpOgorICAgICAgICAjIFNvIHdlIGRvbid0IHNjcmV3IHVwIG91ciBnbG9iYWxzCisgICAgICAgIGRlZiBzYWZlX2V4ZWMoZXhwcik6CisgICAgICAgICAgICBkZWYgZigqKmt3YXJncyk6IHBhc3MKKyAgICAgICAgICAgIGV4ZWMgZXhwciBpbiB7J2YnIDogZn0KKworICAgICAgICB0ZXN0cyA9IFsoIlRydWUiLCAiYXNzaWdubWVudCB0byBUcnVlIG9yIEZhbHNlIGlzIGZvcmJpZGRlbiBpbiAzLngiKSwKKyAgICAgICAgICAgICAgICAgKCJGYWxzZSIsICJhc3NpZ25tZW50IHRvIFRydWUgb3IgRmFsc2UgaXMgZm9yYmlkZGVuIGluIDMueCIpLAorICAgICAgICAgICAgICAgICAoIm5vbmxvY2FsIiwgIm5vbmxvY2FsIGlzIGEga2V5d29yZCBpbiAzLngiKV0KKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCgnJywgU3ludGF4V2FybmluZykpIGFzIHc6CisgICAgICAgICAgICBmb3Iga2V5d29yZCwgZXhwZWN0ZWQgaW4gdGVzdHM6CisgICAgICAgICAgICAgICAgc2FmZV9leGVjKCJ7MH0gPSBGYWxzZSIuZm9ybWF0KGtleXdvcmQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhOb25lLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNhZmVfZXhlYygib2JqLnswfSA9IFRydWUiLmZvcm1hdChrZXl3b3JkKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKE5vbmUsIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgICAgIHNhZmVfZXhlYygiZGVmIHswfSgpOiBwYXNzIi5mb3JtYXQoa2V5d29yZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKE5vbmUsIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgICAgIHNhZmVfZXhlYygiY2xhc3MgezB9OiBwYXNzIi5mb3JtYXQoa2V5d29yZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKE5vbmUsIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgICAgIHNhZmVfZXhlYygiZGVmIGYoezB9PTQzKTogcGFzcyIuZm9ybWF0KGtleXdvcmQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhOb25lLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgICAgICB3LnJlc2V0KCkKKworCisgICAgZGVmIHRlc3RfdHlwZV9pbmVxdWFsaXR5X2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICd0eXBlIGluZXF1YWxpdHkgY29tcGFyaXNvbnMgbm90IHN1cHBvcnRlZCBpbiAzLngnCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoaW50IDwgc3RyLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKHR5cGUgPCBvYmplY3QsIHcsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3Rfb2JqZWN0X2luZXF1YWxpdHlfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gJ2NvbXBhcmluZyB1bmVxdWFsIHR5cGVzIG5vdCBzdXBwb3J0ZWQgaW4gMy54JworICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKHN0ciA8IFtdLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKG9iamVjdCgpIDwgKDEsIDIpLCB3LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2RpY3RfaW5lcXVhbGl0eV9jb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAnZGljdCBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgaW4gMy54JworICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKHt9IDwgezI6M30sIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoe30gPD0ge30sIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoe30gPiB7MjozfSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyh7MjozfSA+PSB7fSwgdywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9jZWxsX2luZXF1YWxpdHlfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gJ2NlbGwgY29tcGFyaXNvbnMgbm90IHN1cHBvcnRlZCBpbiAzLngnCisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgcmV0dXJuIGcKKyAgICAgICAgY2VsbDAsID0gZigwKS5mdW5jX2Nsb3N1cmUKKyAgICAgICAgY2VsbDEsID0gZigxKS5mdW5jX2Nsb3N1cmUKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhjZWxsMCA9PSBjZWxsMSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhjZWxsMCA8IGNlbGwxLCB3LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2NvZGVfaW5lcXVhbGl0eV9jb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAnY29kZSBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgaW4gMy54JworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIGcoeCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoZi5mdW5jX2NvZGUgPCBnLmZ1bmNfY29kZSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhmLmZ1bmNfY29kZSA8PSBnLmZ1bmNfY29kZSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhmLmZ1bmNfY29kZSA+PSBnLmZ1bmNfY29kZSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhmLmZ1bmNfY29kZSA+IGcuZnVuY19jb2RlLCB3LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2J1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kX2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICgnYnVpbHRpbl9mdW5jdGlvbl9vcl9tZXRob2QgJworICAgICAgICAgICAgICAgICAgICAnb3JkZXIgY29tcGFyaXNvbnMgbm90IHN1cHBvcnRlZCBpbiAzLngnKQorICAgICAgICBmdW5jID0gZXZhbAorICAgICAgICBtZXRoID0ge30uZ2V0CisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoZnVuYyA8IG1ldGgsIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoZnVuYyA+IG1ldGgsIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcobWV0aCA8PSBmdW5jLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKG1ldGggPj0gZnVuYywgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm9XYXJuaW5nKG1ldGggPT0gZnVuYywgdykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm9XYXJuaW5nKG1ldGggIT0gZnVuYywgdykKKyAgICAgICAgICAgIGxhbSA9IGxhbWJkYSB4OiB4CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZyhsYW0gPT0gZnVuYywgdykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm9XYXJuaW5nKGxhbSAhPSBmdW5jLCB3KQorCisgICAgZGVmIHRlc3RfZnJhbWVfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgdGVtcGxhdGUgPSAiJXMgaGFzIGJlZW4gcmVtb3ZlZCBpbiAzLngiCisgICAgICAgIGYgPSBzeXMuX2dldGZyYW1lKDApCisgICAgICAgIGZvciBhdHRyIGluICgiZl9leGNfdHJhY2ViYWNrIiwgImZfZXhjX3ZhbHVlIiwgImZfZXhjX3R5cGUiKToKKyAgICAgICAgICAgIGV4cGVjdGVkID0gdGVtcGxhdGUgJSBhdHRyCisgICAgICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhnZXRhdHRyKGYsIGF0dHIpLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoc2V0YXR0cihmLCBhdHRyLCBOb25lKSwgdywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9zb3J0X2NtcF9hcmcoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gInRoZSBjbXAgYXJndW1lbnQgaXMgbm90IHN1cHBvcnRlZCBpbiAzLngiCisgICAgICAgIGxzdCA9IHJhbmdlKDUpCisgICAgICAgIGNtcCA9IGxhbWJkYSB4LHk6IC0xCisKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhsc3Quc29ydChjbXA9Y21wKSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhzb3J0ZWQobHN0LCBjbXA9Y21wKSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhsc3Quc29ydChjbXApLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKHNvcnRlZChsc3QsIGNtcCksIHcsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3Rfc3lzX2V4Y19jbGVhcihzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAnc3lzLmV4Y19jbGVhcigpIG5vdCBzdXBwb3J0ZWQgaW4gMy54OyB1c2UgZXhjZXB0IGNsYXVzZXMnCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoc3lzLmV4Y19jbGVhcigpLCB3LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X21ldGhvZHNfbWVtYmVycyhzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAnX19tZW1iZXJzX18gYW5kIF9fbWV0aG9kc19fIG5vdCBzdXBwb3J0ZWQgaW4gMy54JworICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgX19tZXRob2RzX18gPSBbJ2EnXQorICAgICAgICAgICAgX19tZW1iZXJzX18gPSBbJ2InXQorICAgICAgICBjID0gQygpCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoZGlyKGMpLCB3LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3NvZnRzcGFjZShzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAnZmlsZS5zb2Z0c3BhY2Ugbm90IHN1cHBvcnRlZCBpbiAzLngnCisgICAgICAgIHdpdGggZmlsZShfX2ZpbGVfXykgYXMgZjoKKyAgICAgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKGYuc29mdHNwYWNlLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgIGRlZiBzZXQoKToKKyAgICAgICAgICAgICAgICBmLnNvZnRzcGFjZSA9IDAKKyAgICAgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKHNldCgpLCB3LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3NsaWNlX21ldGhvZHMoc2VsZik6CisgICAgICAgIGNsYXNzIFNwYW0ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgaSwgaik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgaSwgaiwgd2hhdCk6IHBhc3MKKyAgICAgICAgICAgIGRlZiBfX2RlbHNsaWNlX18oc2VsZiwgaSwgaik6IHBhc3MKKyAgICAgICAgY2xhc3MgRWdnOgorICAgICAgICAgICAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBpLCBoKTogcGFzcworICAgICAgICAgICAgZGVmIF9fc2V0c2xpY2VfXyhzZWxmLCBpLCBqLCB3aGF0KTogcGFzcworICAgICAgICAgICAgZGVmIF9fZGVsc2xpY2VfXyhzZWxmLCBpLCBqKTogcGFzcworCisgICAgICAgIGV4cGVjdGVkID0gImluIDMueCwgX197MH1zbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQ7IHVzZSBfX3swfWl0ZW1fXyIKKworICAgICAgICBmb3Igb2JqIGluIChTcGFtKCksIEVnZygpKToKKyAgICAgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKG9ialsxOjJdLCB3LCBleHBlY3RlZC5mb3JtYXQoJ2dldCcpKQorICAgICAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgICAgIGRlbCBvYmpbMzo0XQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhOb25lLCB3LCBleHBlY3RlZC5mb3JtYXQoJ2RlbCcpKQorICAgICAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgICAgIG9ials0OjVdID0gImVnZ3MiCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKE5vbmUsIHcsIGV4cGVjdGVkLmZvcm1hdCgnc2V0JykpCisKKyAgICBkZWYgdGVzdF90dXBsZV9wYXJhbWV0ZXJfdW5wYWNraW5nKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICJ0dXBsZSBwYXJhbWV0ZXIgdW5wYWNraW5nIGhhcyBiZWVuIHJlbW92ZWQgaW4gMy54IgorICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKGV4cGVjdGVkLCBTeW50YXhXYXJuaW5nKSk6CisgICAgICAgICAgICBleGVjICJkZWYgZigoYSwgYikpOiBwYXNzIgorCisgICAgZGVmIHRlc3RfYnVmZmVyKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICdidWZmZXIoKSBub3Qgc3VwcG9ydGVkIGluIDMueCcKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhidWZmZXIoJ2EnKSwgdywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9maWxlX3hyZWFkbGluZXMoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gKCJmLnhyZWFkbGluZXMoKSBub3Qgc3VwcG9ydGVkIGluIDMueCwgIgorICAgICAgICAgICAgICAgICAgICAidHJ5ICdmb3IgbGluZSBpbiBmJyBpbnN0ZWFkIikKKyAgICAgICAgd2l0aCBmaWxlKF9fZmlsZV9fKSBhcyBmOgorICAgICAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoZi54cmVhZGxpbmVzKCksIHcsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfaGFzaF9pbmhlcml0YW5jZShzZWxmKToKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgICMgV2l0aCBvYmplY3QgYXMgdGhlIGJhc2UgY2xhc3MKKyAgICAgICAgICAgIGNsYXNzIFdhcm5Pbmx5Q21wKG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOiBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMCkKKyAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgY2xhc3MgV2Fybk9ubHlFcShvYmplY3QpOgorICAgICAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhOb25lLCB3LAorICAgICAgICAgICAgICAgICAiT3ZlcnJpZGluZyBfX2VxX18gYmxvY2tzIGluaGVyaXRhbmNlIG9mIF9faGFzaF9fIGluIDMueCIpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIGNsYXNzIFdhcm5DbXBBbmRFcShvYmplY3QpOgorICAgICAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKTogcGFzcworICAgICAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhOb25lLCB3LAorICAgICAgICAgICAgICAgICAiT3ZlcnJpZGluZyBfX2VxX18gYmxvY2tzIGluaGVyaXRhbmNlIG9mIF9faGFzaF9fIGluIDMueCIpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIGNsYXNzIE5vV2FybmluZ09ubHlIYXNoKG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMCkKKyAgICAgICAgICAgICMgV2l0aCBhbiBpbnRlcm1lZGlhdGUgY2xhc3MgaW4gdGhlIGhlaXJhcmNoeQorICAgICAgICAgICAgY2xhc3MgRGVmaW5lc0FsbFRocmVlKG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOiBwYXNzCisgICAgICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IHBhc3MKKyAgICAgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGNsYXNzIFdhcm5Pbmx5Q21wKERlZmluZXNBbGxUaHJlZSk6CisgICAgICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOiBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMCkKKyAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgY2xhc3MgV2Fybk9ubHlFcShEZWZpbmVzQWxsVGhyZWUpOgorICAgICAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhOb25lLCB3LAorICAgICAgICAgICAgICAgICAiT3ZlcnJpZGluZyBfX2VxX18gYmxvY2tzIGluaGVyaXRhbmNlIG9mIF9faGFzaF9fIGluIDMueCIpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIGNsYXNzIFdhcm5DbXBBbmRFcShEZWZpbmVzQWxsVGhyZWUpOgorICAgICAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKTogcGFzcworICAgICAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhOb25lLCB3LAorICAgICAgICAgICAgICAgICAiT3ZlcnJpZGluZyBfX2VxX18gYmxvY2tzIGluaGVyaXRhbmNlIG9mIF9faGFzaF9fIGluIDMueCIpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIGNsYXNzIE5vV2FybmluZ09ubHlIYXNoKERlZmluZXNBbGxUaHJlZSk6CisgICAgICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMCkKKworICAgIGRlZiB0ZXN0X29wZXJhdG9yKHNlbGYpOgorICAgICAgICBmcm9tIG9wZXJhdG9yIGltcG9ydCBpc0NhbGxhYmxlLCBzZXF1ZW5jZUluY2x1ZGVzCisKKyAgICAgICAgY2FsbGFibGVfd2FybiA9ICgib3BlcmF0b3IuaXNDYWxsYWJsZSgpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMy54LiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSBoYXNhdHRyKG9iaiwgJ19fY2FsbF9fJykuIikKKyAgICAgICAgc2VxX3dhcm4gPSAoIm9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMoKSBpcyBub3Qgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgImluIDMueC4gVXNlIG9wZXJhdG9yLmNvbnRhaW5zKCkuIikKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhpc0NhbGxhYmxlKHNlbGYpLCB3LCBjYWxsYWJsZV93YXJuKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoc2VxdWVuY2VJbmNsdWRlcyhyYW5nZSgzKSwgMiksIHcsIHNlcV93YXJuKQorCisKK2NsYXNzIFRlc3RTdGRsaWJSZW1vdmFscyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIHRlc3QudGVzdGFsbCBub3QgdGVzdGVkIGFzIGl0IGV4ZWN1dGVzIGFsbCB1bml0IHRlc3RzIGFzIGFuCisgICAgIyBpbXBvcnQgc2lkZS1lZmZlY3QuCisgICAgYWxsX3BsYXRmb3JtcyA9ICgnYXVkaW9kZXYnLCAnaW1wdXRpbCcsICdtdXRleCcsICd1c2VyJywgJ25ldycsICdyZXhlYycsCisgICAgICAgICAgICAgICAgICAgICAgICAnQmFzdGlvbicsICdjb21waWxlcicsICdkaXJjYWNoZScsICdtaW1ldG9vbHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2ZwZm9ybWF0JywgJ2lob29rcycsICdtaGxpYicsICdzdGF0dmZzJywgJ2h0bWxsaWInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3NnbWxsaWInLCAncmZjODIyJywgJ3N1bmF1ZGlvJykKKyAgICBpbmNsdXNpdmVfcGxhdGZvcm1zID0geydpcml4JyA6ICgncHVyZScsICdBTCcsICdhbCcsICdDRCcsICdjZCcsICdjZGRiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2RwbGF5ZXInLCAnQ0wnLCAnY2wnLCAnREVWSUNFJywgJ0dMJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2wnLCAnRVJSTk8nLCAnRklMRScsICdGTCcsICdmbHAnLCAnZmwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmbScsICdHRVQnLCAnR0xXUycsICdpbWdmaWxlJywgJ0lOJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSU9DVEwnLCAnanBlZycsICdwYW5lbCcsICdwYW5lbHBhcnNlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlYWRjZCcsICdTVicsICd0b3JnYicsICdXQUlUJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXJ3aW4nIDogKCdhdXRvR0lMJywgJ0NhcmJvbicsICdPU0FUZXJtaW5vbG9neScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpY2dsdWUnLCAnTmF2JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNYWNPUyBzaG91bGQgKGFuZCBkb2VzKSBnaXZlIGEgUHkza1dhcm5pbmcsIGJ1dCBvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZWFybGllciB0ZXN0cyBhbHJlYWR5IGltcG9ydHMgdGhlIE1hY09TIGV4dGVuc2lvbiB3aGljaCBjYXVzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGlzIHRlc3QgdG8gZmFpbC4gRGlzYWJsaW5nIHRoZSB0ZXN0IGZvciAnTWFjT1MnIGF2b2lkcyB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3B1cmlvdXMgdGVzdCBmYWlsdXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjJ01hY09TJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FlcGFjaycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZXRvb2xzJywgJ2FldHlwZXMnLCAnYXBwbGVzaW5nbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwbGV0cmF3bWFpbicsICdhcHBsZXRydW5uZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJndmVtdWxhdG9yJywgJ2JnZW5sb2NhdGlvbnMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRWFzeURpYWxvZ3MnLCAnbWFjZXJyb3JzJywgJ21hY29zdG9vbHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmluZGVydG9vbHMnLCAnRnJhbWVXb3JrJywgJ2ljJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dlbnN1aXRlbW9kdWxlJywgJ2ljb3BlbicsICdtYWNyZXNvdXJjZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNaW5pQUVGcmFtZScsICdwaW1wJywgJ1BpeE1hcFdyYXBwZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVybWluYWxjb21tYW5kJywgJ3ZpZGVvcmVhZGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19idWlsdGluU3VpdGVzJywgJ0NvZGVXYXJyaW9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0V4cGxvcmVyJywgJ0ZpbmRlcicsICdOZXRzY2FwZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTdGRTdWl0ZXMnLCAnU3lzdGVtRXZlbnRzJywgJ1Rlcm1pbmFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NmbWZpbGUnLCAnYnVuZGxlYnVpbGRlcicsICdidWlsZHRvb2xzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbG9yUGlja2VyJywgJ0F1ZGlvX21hYycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1bm9zNScgOiAoJ3N1bmF1ZGlvZGV2JywgJ1NVTkFVRElPREVWJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBvcHRpb25hbF9tb2R1bGVzID0gKCdic2RkYjE4NScsICdDYW52YXMnLCAnZGwnLCAnbGludXhhdWRpb2RldicsICdpbWFnZW9wJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzdicsICdic2RkYicsICdkYmhhc2gnKQorCisgICAgZGVmIGNoZWNrX3JlbW92YWwoc2VsZiwgbW9kdWxlX25hbWUsIG9wdGlvbmFsPUZhbHNlKToKKyAgICAgICAgIiIiTWFrZSBzdXJlIHRoZSBzcGVjaWZpZWQgbW9kdWxlLCB3aGVuIGltcG9ydGVkLCByYWlzZXMgYQorICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcgYW5kIHNwZWNpZmllcyBpdHNlbGYgaW4gdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIHdpdGggQ2xlYW5JbXBvcnQobW9kdWxlX25hbWUpLCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgIi4rIChtb2R1bGV8cGFja2FnZSkgLisgcmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIF9fbmFtZV9fKQorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgIi4rIHJlbW92ZWQgLisgKG1vZHVsZXxwYWNrYWdlKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIF9fbmFtZV9fKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIF9faW1wb3J0X18obW9kdWxlX25hbWUsIGxldmVsPTApCisgICAgICAgICAgICBleGNlcHQgRGVwcmVjYXRpb25XYXJuaW5nIGFzIGV4YzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKG1vZHVsZV9uYW1lLCBleGMuYXJnc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyB3YXJuaW5nIGRpZG4ndCBjb250YWluIG1vZHVsZSBuYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBtb2R1bGVfbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9uYWw6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiTm9uLW9wdGlvbmFsIG1vZHVsZSB7MH0gcmFpc2VkIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbXBvcnRFcnJvci4iLmZvcm1hdChtb2R1bGVfbmFtZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgRm9yIGV4dGVuc2lvbiBtb2R1bGVzLCBjaGVjayB0aGUgX193YXJuaW5ncmVnaXN0cnlfXy4KKyAgICAgICAgICAgICAgICAjIFRoZXkgd29uJ3QgcmVydW4gdGhlaXIgaW5pdCBjb2RlIGV2ZW4gd2l0aCBDbGVhbkltcG9ydC4KKyAgICAgICAgICAgICAgICBpZiBub3QgY2hlY2tfZGVwcmVjYXRlZF9tb2R1bGUobW9kdWxlX25hbWUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkRlcHJlY2F0aW9uV2FybmluZyBub3QgcmFpc2VkIGZvciB7MH0iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KG1vZHVsZV9uYW1lKSkKKworICAgIGRlZiB0ZXN0X3BsYXRmb3JtX2luZGVwZW5kZW50X3JlbW92YWxzKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBtb2R1bGVzIHRoYXQgYXJlIGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zIHJhaXNlCisgICAgICAgICMgdGhlIHByb3BlciBEZXByZWNhdGlvbldhcm5pbmcuCisgICAgICAgIGZvciBtb2R1bGVfbmFtZSBpbiBzZWxmLmFsbF9wbGF0Zm9ybXM6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3JlbW92YWwobW9kdWxlX25hbWUpCisKKyAgICBkZWYgdGVzdF9wbGF0Zm9ybV9zcGVjaWZpY19yZW1vdmFscyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoZSByZW1vdmFsIG9mIHBsYXRmb3JtLXNwZWNpZmljIG1vZHVsZXMuCisgICAgICAgIGZvciBtb2R1bGVfbmFtZSBpbiBzZWxmLmluY2x1c2l2ZV9wbGF0Zm9ybXMuZ2V0KHN5cy5wbGF0Zm9ybSwgW10pOgorICAgICAgICAgICAgc2VsZi5jaGVja19yZW1vdmFsKG1vZHVsZV9uYW1lLCBvcHRpb25hbD1UcnVlKQorCisgICAgZGVmIHRlc3Rfb3B0aW9uYWxfbW9kdWxlX3JlbW92YWxzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhlIHJlbW92YWwgb2YgbW9kdWxlcyB0aGF0IG1heSBvciBtYXkgbm90IGJlIGJ1aWx0LgorICAgICAgICBmb3IgbW9kdWxlX25hbWUgaW4gc2VsZi5vcHRpb25hbF9tb2R1bGVzOgorICAgICAgICAgICAgc2VsZi5jaGVja19yZW1vdmFsKG1vZHVsZV9uYW1lLCBvcHRpb25hbD1UcnVlKQorCisgICAgZGVmIHRlc3Rfb3NfcGF0aF93YWxrKHNlbGYpOgorICAgICAgICBtc2cgPSAiSW4gMy54LCBvcy5wYXRoLndhbGsgaXMgcmVtb3ZlZCBpbiBmYXZvciBvZiBvcy53YWxrLiIKKyAgICAgICAgZGVmIGR1bWJvKHdoZXJlLCBuYW1lcywgYXJncyk6IHBhc3MKKyAgICAgICAgZm9yIHBhdGhfbW9kIGluICgibnRwYXRoIiwgIm1hY3BhdGgiLCAib3MyZW14cGF0aCIsICJwb3NpeHBhdGgiKToKKyAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18ocGF0aF9tb2QpCisgICAgICAgICAgICByZXNldF9tb2R1bGVfcmVnaXN0cnkobW9kKQorICAgICAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgICAgICBtb2Qud2FsaygiY3Jhc2hlcnMiLCBkdW1ibywgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHcubWVzc2FnZSksIG1zZykKKworICAgIGRlZiB0ZXN0X3JlZHVjZV9tb3ZlKHNlbGYpOgorICAgICAgICBmcm9tIG9wZXJhdG9yIGltcG9ydCBhZGQKKyAgICAgICAgIyByZWR1Y2UgdGVzdHMgbWF5IGhhdmUgYWxyZWFkeSB0cmlnZ2VyZWQgdGhpcyB3YXJuaW5nCisgICAgICAgIHJlc2V0X21vZHVsZV9yZWdpc3RyeSh1bml0dGVzdC5jYXNlKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCAicmVkdWNlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERlcHJlY2F0aW9uV2FybmluZywgcmVkdWNlLCBhZGQsIHJhbmdlKDEwKSkKKworICAgIGRlZiB0ZXN0X211dGFibGVzdHJpbmdfcmVtb3ZhbChzZWxmKToKKyAgICAgICAgIyBVc2VyU3RyaW5nLk11dGFibGVTdHJpbmcgaGFzIGJlZW4gcmVtb3ZlZCBpbiAzLjAuCisgICAgICAgIGltcG9ydCBVc2VyU3RyaW5nCisgICAgICAgICMgVXNlclN0cmluZyB0ZXN0cyBtYXkgaGF2ZSBhbHJlYWR5IHRyaWdnZXJlZCB0aGlzIHdhcm5pbmcKKyAgICAgICAgcmVzZXRfbW9kdWxlX3JlZ2lzdHJ5KFVzZXJTdHJpbmcpCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsICIuKk11dGFibGVTdHJpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGVwcmVjYXRpb25XYXJuaW5nLCBVc2VyU3RyaW5nLk11dGFibGVTdHJpbmcpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUZXN0UHkzS1dhcm5pbmdzLAorICAgICAgICAgICAgICAgICBUZXN0U3RkbGliUmVtb3ZhbHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5M2t3YXJuLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5M2t3YXJuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDIzZTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHkza3dhcm4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5M2t3YXJuLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5M2t3YXJuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDIzZTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHkza3dhcm4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5X2NvbXBpbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weV9jb21waWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTlkYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weV9jb21waWxlLnB5CkBAIC0wLDAgKzEsNTQgQEAKK2ltcG9ydCBpbXAKK2ltcG9ydCBvcworaW1wb3J0IHB5X2NvbXBpbGUKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIFB5Q29tcGlsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kaXJlY3RvcnkgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi5zb3VyY2VfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmRpcmVjdG9yeSwgJ190ZXN0LnB5JykKKyAgICAgICAgc2VsZi5weWNfcGF0aCA9IHNlbGYuc291cmNlX3BhdGggKyAnYycKKyAgICAgICAgc2VsZi5jd2RfZHJpdmUgPSBvcy5wYXRoLnNwbGl0ZHJpdmUob3MuZ2V0Y3dkKCkpWzBdCisgICAgICAgICMgSW4gdGhlc2UgdGVzdHMgd2UgY29tcHV0ZSByZWxhdGl2ZSBwYXRocy4gIFdoZW4gdXNpbmcgV2luZG93cywgdGhlCisgICAgICAgICMgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBwYXRoIGFuZCB0aGUgJ3NlbGYuc291cmNlX3BhdGgnIG1pZ2h0IGJlCisgICAgICAgICMgb24gZGlmZmVyZW50IGRyaXZlcy4gIFRoZXJlZm9yZSB3ZSBuZWVkIHRvIHN3aXRjaCB0byB0aGUgZHJpdmUgd2hlcmUKKyAgICAgICAgIyB0aGUgdGVtcG9yYXJ5IHNvdXJjZSBmaWxlIGxpdmVzLgorICAgICAgICBkcml2ZSA9IG9zLnBhdGguc3BsaXRkcml2ZShzZWxmLnNvdXJjZV9wYXRoKVswXQorICAgICAgICBpZiBkcml2ZToKKyAgICAgICAgICAgIG9zLmNoZGlyKGRyaXZlKQorCisgICAgICAgIHdpdGggb3BlbihzZWxmLnNvdXJjZV9wYXRoLCAndycpIGFzIGZpbGU6CisgICAgICAgICAgICBmaWxlLndyaXRlKCd4ID0gMTIzXG4nKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuZGlyZWN0b3J5KQorICAgICAgICBpZiBzZWxmLmN3ZF9kcml2ZToKKyAgICAgICAgICAgIG9zLmNoZGlyKHNlbGYuY3dkX2RyaXZlKQorCisgICAgZGVmIHRlc3RfYWJzb2x1dGVfcGF0aChzZWxmKToKKyAgICAgICAgcHlfY29tcGlsZS5jb21waWxlKHNlbGYuc291cmNlX3BhdGgsIHNlbGYucHljX3BhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWxmLnB5Y19wYXRoKSkKKworICAgIGRlZiB0ZXN0X2N3ZChzZWxmKToKKyAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIoc2VsZi5kaXJlY3RvcnkpCisgICAgICAgIHB5X2NvbXBpbGUuY29tcGlsZShvcy5wYXRoLmJhc2VuYW1lKHNlbGYuc291cmNlX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShzZWxmLnB5Y19wYXRoKSkKKyAgICAgICAgb3MuY2hkaXIoY3dkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2VsZi5weWNfcGF0aCkpCisKKyAgICBkZWYgdGVzdF9yZWxhdGl2ZV9wYXRoKHNlbGYpOgorICAgICAgICBweV9jb21waWxlLmNvbXBpbGUob3MucGF0aC5yZWxwYXRoKHNlbGYuc291cmNlX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5yZWxwYXRoKHNlbGYucHljX3BhdGgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2VsZi5weWNfcGF0aCkpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFB5Q29tcGlsZVRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weV9jb21waWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5X2NvbXBpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZGM0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weV9jb21waWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weV9jb21waWxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5X2NvbXBpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZGM0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weV9jb21waWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWNsYnIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWNsYnIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkYzU1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5Y2xici5weQpAQCAtMCwwICsxLDIwMiBAQAorJycnCisgICBUZXN0IGNhc2VzIGZvciBweWNsYnIucHkKKyAgIE5pY2sgTWF0aGV3c29uCisnJycKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZQoraW1wb3J0IHN5cworZnJvbSB0eXBlcyBpbXBvcnQgQ2xhc3NUeXBlLCBGdW5jdGlvblR5cGUsIE1ldGhvZFR5cGUsIEJ1aWx0aW5GdW5jdGlvblR5cGUKK2ltcG9ydCBweWNsYnIKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlCisKK1N0YXRpY01ldGhvZFR5cGUgPSB0eXBlKHN0YXRpY21ldGhvZChsYW1iZGE6IE5vbmUpKQorQ2xhc3NNZXRob2RUeXBlID0gdHlwZShjbGFzc21ldGhvZChsYW1iZGEgYzogTm9uZSkpCisKKyMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKK2ltcG9ydF9tb2R1bGUoJ2NvbW1hbmRzJywgZGVwcmVjYXRlZD1UcnVlKQorCisjIFRoaXMgbmV4dCBsaW5lIHRyaWdnZXJzIGFuIGVycm9yIG9uIG9sZCB2ZXJzaW9ucyBvZiBweWNsYnIuCitmcm9tIGNvbW1hbmRzIGltcG9ydCBnZXRzdGF0dXMKKworIyBIZXJlIHdlIHRlc3QgdGhlIHB5dGhvbiBjbGFzcyBicm93c2VyIGNvZGUuCisjCisjIFRoZSBtYWluIGZ1bmN0aW9uIGluIHRoaXMgc3VpdGUsICd0ZXN0TW9kdWxlJywgY29tcGFyZXMgdGhlIG91dHB1dAorIyBvZiBweWNsYnIgd2l0aCB0aGUgaW50cm9zcGVjdGVkIG1lbWJlcnMgb2YgYSBtb2R1bGUuICBCZWNhdXNlIHB5Y2xicgorIyBpcyBpbXBlcmZlY3QgKGFzIGRlc2lnbmVkKSwgdGVzdE1vZHVsZSBpcyBjYWxsZWQgd2l0aCBhIHNldCBvZgorIyBtZW1iZXJzIHRvIGlnbm9yZS4KKworY2xhc3MgUHljbGJyVGVzdChUZXN0Q2FzZSk6CisKKyAgICBkZWYgYXNzZXJ0TGlzdEVxKHNlbGYsIGwxLCBsMiwgaWdub3JlKToKKyAgICAgICAgJycnIHN1Y2NlZWQgaWZmIHtsMX0gLSB7aWdub3JlfSA9PSB7bDJ9IC0ge2lnbm9yZX0gJycnCisgICAgICAgIG1pc3NpbmcgPSAoc2V0KGwxKSBeIHNldChsMikpIC0gc2V0KGlnbm9yZSkKKyAgICAgICAgaWYgbWlzc2luZzoKKyAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgImwxPSVyXG5sMj0lclxuaWdub3JlPSVyIiAlIChsMSwgbDIsIGlnbm9yZSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiJXIgbWlzc2luZyIgJSBtaXNzaW5nLnBvcCgpKQorCisgICAgZGVmIGFzc2VydEhhc2F0dHIoc2VsZiwgb2JqLCBhdHRyLCBpZ25vcmUpOgorICAgICAgICAnJycgc3VjY2VlZCBpZmYgaGFzYXR0cihvYmosYXR0cikgb3IgYXR0ciBpbiBpZ25vcmUuICcnJworICAgICAgICBpZiBhdHRyIGluIGlnbm9yZTogcmV0dXJuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9iaiwgYXR0cik6IHByaW50ICI/Pz8iLCBhdHRyCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG9iaiwgYXR0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAnZXhwZWN0ZWQgaGFzYXR0ciglciwgJXIpJyAlIChvYmosIGF0dHIpKQorCisKKyAgICBkZWYgYXNzZXJ0SGFza2V5KHNlbGYsIG9iaiwga2V5LCBpZ25vcmUpOgorICAgICAgICAnJycgc3VjY2VlZCBpZmYga2V5IGluIG9iaiBvciBrZXkgaW4gaWdub3JlLiAnJycKKyAgICAgICAgaWYga2V5IGluIGlnbm9yZTogcmV0dXJuCisgICAgICAgIGlmIGtleSBub3QgaW4gb2JqOgorICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiKioqIiwga2V5CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oa2V5LCBvYmopCisKKyAgICBkZWYgYXNzZXJ0RXF1YWxzT3JJZ25vcmVkKHNlbGYsIGEsIGIsIGlnbm9yZSk6CisgICAgICAgICcnJyBzdWNjZWVkIGlmZiBhID09IGIgb3IgYSBpbiBpZ25vcmUgb3IgYiBpbiBpZ25vcmUgJycnCisgICAgICAgIGlmIGEgbm90IGluIGlnbm9yZSBhbmQgYiBub3QgaW4gaWdub3JlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCisgICAgZGVmIGNoZWNrTW9kdWxlKHNlbGYsIG1vZHVsZU5hbWUsIG1vZHVsZT1Ob25lLCBpZ25vcmU9KCkpOgorICAgICAgICAnJycgc3VjY2VlZCBpZmYgcHljbGJyLnJlYWRtb2R1bGVfZXgobW9kdWxlbmFtZSkgY29ycmVzcG9uZHMKKyAgICAgICAgICAgIHRvIHRoZSBhY3R1YWwgbW9kdWxlIG9iamVjdCwgbW9kdWxlLiAgQW55IGlkZW50aWZpZXJzIGluCisgICAgICAgICAgICBpZ25vcmUgYXJlIGlnbm9yZWQuICAgSWYgbm8gbW9kdWxlIGlzIHByb3ZpZGVkLCB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgICAgIG1vZHVsZSBpcyBsb2FkZWQgd2l0aCBfX2ltcG9ydF9fLicnJworCisgICAgICAgIGlmIG1vZHVsZSBpcyBOb25lOgorICAgICAgICAgICAgIyBJbXBvcnQgaXQuCisgICAgICAgICAgICAjICgnPHNpbGx5PicgaXMgdG8gd29yayBhcm91bmQgYW4gQVBJIHNpbGxpbmVzcyBpbiBfX2ltcG9ydF9fKQorICAgICAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXyhtb2R1bGVOYW1lLCBnbG9iYWxzKCksIHt9LCBbJzxzaWxseT4nXSkKKworICAgICAgICBkaWN0ID0gcHljbGJyLnJlYWRtb2R1bGVfZXgobW9kdWxlTmFtZSkKKworICAgICAgICBkZWYgaXNtZXRob2Qob2NsYXNzLCBvYmosIG5hbWUpOgorICAgICAgICAgICAgY2xhc3NkaWN0ID0gb2NsYXNzLl9fZGljdF9fCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgRnVuY3Rpb25UeXBlKToKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjbGFzc2RpY3RbbmFtZV0sIFN0YXRpY01ldGhvZFR5cGUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbm90ICBpc2luc3RhbmNlKG9iaiwgTWV0aG9kVHlwZSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgICAgIGlmIG9iai5pbV9zZWxmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBpZiAobm90IGlzaW5zdGFuY2UoY2xhc3NkaWN0W25hbWVdLCBDbGFzc01ldGhvZFR5cGUpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICBvYmouaW1fc2VsZiBpcyBub3Qgb2NsYXNzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNsYXNzZGljdFtuYW1lXSwgRnVuY3Rpb25UeXBlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICAgICBvYmpuYW1lID0gb2JqLl9fbmFtZV9fCisgICAgICAgICAgICBpZiBvYmpuYW1lLnN0YXJ0c3dpdGgoIl9fIikgYW5kIG5vdCBvYmpuYW1lLmVuZHN3aXRoKCJfXyIpOgorICAgICAgICAgICAgICAgIG9iam5hbWUgPSAiXyVzJXMiICUgKG9iai5pbV9jbGFzcy5fX25hbWVfXywgb2JqbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBvYmpuYW1lID09IG5hbWUKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgdG9wbGV2ZWwgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGRpY3QuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gaWdub3JlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEhhc2F0dHIobW9kdWxlLCBuYW1lLCBpZ25vcmUpCisgICAgICAgICAgICBweV9pdGVtID0gZ2V0YXR0cihtb2R1bGUsIG5hbWUpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBweWNsYnIuRnVuY3Rpb24pOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShweV9pdGVtLCAoRnVuY3Rpb25UeXBlLCBCdWlsdGluRnVuY3Rpb25UeXBlKSkKKyAgICAgICAgICAgICAgICBpZiBweV9pdGVtLl9fbW9kdWxlX18gIT0gbW9kdWxlTmFtZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAjIHNraXAgZnVuY3Rpb25zIHRoYXQgY2FtZSBmcm9tIHNvbWV3aGVyZSBlbHNlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweV9pdGVtLl9fbW9kdWxlX18sIHZhbHVlLm1vZHVsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHB5X2l0ZW0sIChDbGFzc1R5cGUsIHR5cGUpKQorICAgICAgICAgICAgICAgIGlmIHB5X2l0ZW0uX19tb2R1bGVfXyAhPSBtb2R1bGVOYW1lOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgICMgc2tpcCBjbGFzc2VzIHRoYXQgY2FtZSBmcm9tIHNvbWV3aGVyZSBlbHNlCisKKyAgICAgICAgICAgICAgICByZWFsX2Jhc2VzID0gW2Jhc2UuX19uYW1lX18gZm9yIGJhc2UgaW4gcHlfaXRlbS5fX2Jhc2VzX19dCisgICAgICAgICAgICAgICAgcHljbGJyX2Jhc2VzID0gWyBnZXRhdHRyKGJhc2UsICduYW1lJywgYmFzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBiYXNlIGluIHZhbHVlLnN1cGVyIF0KKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXEocmVhbF9iYXNlcywgcHljbGJyX2Jhc2VzLCBpZ25vcmUpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJjbGFzcz0lcyIgJSBweV9pdGVtCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgICAgICAgICBhY3R1YWxNZXRob2RzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgbSBpbiBweV9pdGVtLl9fZGljdF9fLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNtZXRob2QocHlfaXRlbSwgZ2V0YXR0cihweV9pdGVtLCBtKSwgbSk6CisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxNZXRob2RzLmFwcGVuZChtKQorICAgICAgICAgICAgICAgIGZvdW5kTWV0aG9kcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIG0gaW4gdmFsdWUubWV0aG9kcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIGlmIG1bOjJdID09ICdfXycgYW5kIG1bLTI6XSAhPSAnX18nOgorICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNZXRob2RzLmFwcGVuZCgnXycrbmFtZSttKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNZXRob2RzLmFwcGVuZChtKQorCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydExpc3RFcShmb3VuZE1ldGhvZHMsIGFjdHVhbE1ldGhvZHMsIGlnbm9yZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweV9pdGVtLl9fbW9kdWxlX18sIHZhbHVlLm1vZHVsZSkKKworICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsc09ySWdub3JlZChweV9pdGVtLl9fbmFtZV9fLCB2YWx1ZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUpCisgICAgICAgICAgICAgICAgICAgICMgY2FuJ3QgY2hlY2sgZmlsZSBvciBsaW5lbm8KKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgImNsYXNzPSVzIiAlIHB5X2l0ZW0KKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICAjIE5vdyBjaGVjayBmb3IgbWlzc2luZyBzdHVmZi4KKyAgICAgICAgZGVmIGRlZmluZWRfaW4oaXRlbSwgbW9kdWxlKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgQ2xhc3NUeXBlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5fX21vZHVsZV9fID09IG1vZHVsZS5fX25hbWVfXworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBGdW5jdGlvblR5cGUpOgorICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmZ1bmNfZ2xvYmFscyBpcyBtb2R1bGUuX19kaWN0X18KKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmb3IgbmFtZSBpbiBkaXIobW9kdWxlKToKKyAgICAgICAgICAgIGl0ZW0gPSBnZXRhdHRyKG1vZHVsZSwgbmFtZSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgIChDbGFzc1R5cGUsIEZ1bmN0aW9uVHlwZSkpOgorICAgICAgICAgICAgICAgIGlmIGRlZmluZWRfaW4oaXRlbSwgbW9kdWxlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRIYXNrZXkoZGljdCwgbmFtZSwgaWdub3JlKQorCisgICAgZGVmIHRlc3RfZWFzeShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja01vZHVsZSgncHljbGJyJykKKyAgICAgICAgc2VsZi5jaGVja01vZHVsZSgnZG9jdGVzdCcsIGlnbm9yZT0oIkRvY1Rlc3RDYXNlIiwpKQorICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgIHJmYzgyMiA9IGltcG9ydF9tb2R1bGUoJ3JmYzgyMicsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKyAgICAgICAgc2VsZi5jaGVja01vZHVsZSgncmZjODIyJywgcmZjODIyKQorICAgICAgICBzZWxmLmNoZWNrTW9kdWxlKCdkaWZmbGliJykKKworICAgIGRlZiB0ZXN0X2RlY29yYXRvcnMoc2VsZik6CisgICAgICAgICMgWFhYOiBTZWUgY29tbWVudCBpbiBweWNsYnJfaW5wdXQucHkgZm9yIGEgdGVzdCB0aGF0IHdvdWxkIGZhaWwKKyAgICAgICAgIyAgICAgIGlmIGl0IHdlcmUgbm90IGNvbW1lbnRlZCBvdXQuCisgICAgICAgICMKKyAgICAgICAgc2VsZi5jaGVja01vZHVsZSgndGVzdC5weWNsYnJfaW5wdXQnKQorCisgICAgZGVmIHRlc3Rfb3RoZXJzKHNlbGYpOgorICAgICAgICBjbSA9IHNlbGYuY2hlY2tNb2R1bGUKKworICAgICAgICAjIFRoZXNlIHdlcmUgb25jZSBhYm91dCB0aGUgMTAgbG9uZ2VzdCBtb2R1bGVzCisgICAgICAgIGNtKCdyYW5kb20nLCBpZ25vcmU9KCdSYW5kb20nLCkpICAjIGZyb20gX3JhbmRvbSBpbXBvcnQgUmFuZG9tIGFzIENvcmVHZW5lcmF0b3IKKyAgICAgICAgY20oJ2NnaScsIGlnbm9yZT0oJ2xvZycsKSkgICAgICAjIHNldCB3aXRoID0gaW4gbW9kdWxlCisgICAgICAgIGNtKCd1cmxsaWInLCBpZ25vcmU9KCdfQ0ZOdW1iZXJUb0ludDMyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19DU3RyaW5nRnJvbUNGU3RyaW5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19DRlNldHVwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dldHByb3hpZXNfcmVnaXN0cnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJveHlfYnlwYXNzX3JlZ2lzdHJ5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3h5X2J5cGFzc19tYWNvc3hfc3lzY29uZicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcGVuX2h0dHBzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dldHByb3hpZXNfbWFjb3N4X3N5c2NvbmYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2V0cHJveGllc19pbnRlcm5ldGNvbmZpZycsKSkgIyBub3Qgb24gYWxsIHBsYXRmb3JtcworICAgICAgICBjbSgncGlja2xlJykKKyAgICAgICAgY20oJ2FpZmMnLCBpZ25vcmU9KCdvcGVuZnAnLCkpICAjIHNldCB3aXRoID0gaW4gbW9kdWxlCisgICAgICAgIGNtKCdDb29raWUnKQorICAgICAgICBjbSgnc3JlX3BhcnNlJywgaWdub3JlPSgnZHVtcCcsKSkgIyBmcm9tIHNyZV9jb25zdGFudHMgaW1wb3J0ICoKKyAgICAgICAgY20oJ3BkYicpCisgICAgICAgIGNtKCdweWRvYycpCisKKyAgICAgICAgIyBUZXN0cyBmb3IgbW9kdWxlcyBpbnNpZGUgcGFja2FnZXMKKyAgICAgICAgY20oJ2VtYWlsLnBhcnNlcicpCisgICAgICAgIGNtKCd0ZXN0LnRlc3RfcHljbGJyJykKKworICAgIGRlZiB0ZXN0X2lzc3VlXzE0Nzk4KHNlbGYpOgorICAgICAgICAjIHRlc3QgSW1wb3J0RXJyb3IgaXMgcmFpc2VkIHdoZW4gdGhlIGZpcnN0IHBhcnQgb2YgYSBkb3R0ZWQgbmFtZSBpcworICAgICAgICAjIG5vdCBhIHBhY2thZ2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IsIHB5Y2xici5yZWFkbW9kdWxlX2V4LCAnYXN5bmNvcmUuZm9vJykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFB5Y2xiclRlc3QpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHljbGJyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5Y2xici5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1ZGNiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5Y2xici5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHljbGJyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5Y2xici5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY1ZGNiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5Y2xici5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlkb2MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWRvYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODJkNmRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlkb2MucHkKQEAgLTAsMCArMSw0MjMgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGRpZmZsaWIKK2ltcG9ydCBfX2J1aWx0aW5fXworaW1wb3J0IHJlCitpbXBvcnQgcHlkb2MKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQga2V5d29yZAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgeG1sLmV0cmVlCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKK2Zyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCBhc3NlcnRfcHl0aG9uX29rCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAoCisgICAgVEVTVEZOLCBybXRyZWUsIHJlYXBfY2hpbGRyZW4sIGNhcHR1cmVkX3N0ZG91dCkKKworZnJvbSB0ZXN0IGltcG9ydCBweWRvY19tb2QKKworaWYgdGVzdC50ZXN0X3N1cHBvcnQuSEFWRV9ET0NTVFJJTkdTOgorICAgIGV4cGVjdGVkX2RhdGFfZG9jc3RyaW5ncyA9ICgKKyAgICAgICAgJ2RpY3Rpb25hcnkgZm9yIGluc3RhbmNlIHZhcmlhYmxlcyAoaWYgZGVmaW5lZCknLAorICAgICAgICAnbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIG9iamVjdCAoaWYgZGVmaW5lZCknLAorICAgICAgICApCitlbHNlOgorICAgIGV4cGVjdGVkX2RhdGFfZG9jc3RyaW5ncyA9ICgnJywgJycpCisKK2V4cGVjdGVkX3RleHRfcGF0dGVybiA9IFwKKyIiIgorTkFNRQorICAgIHRlc3QucHlkb2NfbW9kIC0gVGhpcyBpcyBhIHRlc3QgbW9kdWxlIGZvciB0ZXN0X3B5ZG9jCisKK0ZJTEUKKyAgICAlcworJXMKK0NMQVNTRVMKKyAgICBfX2J1aWx0aW5fXy5vYmplY3QKKyAgICAgICAgQgorICAgIEEKK1x4MjBceDIwXHgyMFx4MjAKKyAgICBjbGFzcyBBCisgICAgIHwgIEhlbGxvIGFuZCBnb29kYnllCisgICAgIHxceDIwXHgyMAorICAgICB8ICBNZXRob2RzIGRlZmluZWQgaGVyZToKKyAgICAgfFx4MjBceDIwCisgICAgIHwgIF9faW5pdF9fKCkKKyAgICAgfCAgICAgIFdvdywgSSBoYXZlIG5vIGZ1bmN0aW9uIQorXHgyMFx4MjBceDIwXHgyMAorICAgIGNsYXNzIEIoX19idWlsdGluX18ub2JqZWN0KQorICAgICB8ICBEYXRhIGRlc2NyaXB0b3JzIGRlZmluZWQgaGVyZToKKyAgICAgfFx4MjBceDIwCisgICAgIHwgIF9fZGljdF9fJXMKKyAgICAgfFx4MjBceDIwCisgICAgIHwgIF9fd2Vha3JlZl9fJXMKKyAgICAgfFx4MjBceDIwCisgICAgIHwgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgfCAgRGF0YSBhbmQgb3RoZXIgYXR0cmlidXRlcyBkZWZpbmVkIGhlcmU6CisgICAgIHxceDIwXHgyMAorICAgICB8ICBOT19NRUFOSU5HID0gJ2VnZ3MnCisKK0ZVTkNUSU9OUworICAgIGRvY19mdW5jKCkKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBzb2x2ZXMgYWxsIG9mIHRoZSB3b3JsZCdzIHByb2JsZW1zOgorICAgICAgICBodW5nZXIKKyAgICAgICAgbGFjayBvZiBQeXRob24KKyAgICAgICAgd2FyCitceDIwXHgyMFx4MjBceDIwCisgICAgbm9kb2NfZnVuYygpCisKK0RBVEEKKyAgICBfX2F1dGhvcl9fID0gJ0JlbmphbWluIFBldGVyc29uJworICAgIF9fY3JlZGl0c19fID0gJ05vYm9keScKKyAgICBfX3ZlcnNpb25fXyA9ICcxLjIuMy40JworCitWRVJTSU9OCisgICAgMS4yLjMuNAorCitBVVRIT1IKKyAgICBCZW5qYW1pbiBQZXRlcnNvbgorCitDUkVESVRTCisgICAgTm9ib2R5CisiIiIuc3RyaXAoKQorCitleHBlY3RlZF90ZXh0X2RhdGFfZG9jc3RyaW5ncyA9IHR1cGxlKCdcbiAgICAgfCAgICAgICcgKyBzIGlmIHMgZWxzZSAnJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcyBpbiBleHBlY3RlZF9kYXRhX2RvY3N0cmluZ3MpCisKK2V4cGVjdGVkX2h0bWxfcGF0dGVybiA9IFwKKyIiIgorPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIGJvcmRlcj0wIHN1bW1hcnk9ImhlYWRpbmciPgorPHRyIGJnY29sb3I9IiM3Nzk5ZWUiPgorPHRkIHZhbGlnbj1ib3R0b20+Jm5ic3A7PGJyPgorPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPiZuYnNwOzxicj48YmlnPjxiaWc+PHN0cm9uZz48YSBocmVmPSJ0ZXN0Lmh0bWwiPjxmb250IGNvbG9yPSIjZmZmZmZmIj50ZXN0PC9mb250PjwvYT4ucHlkb2NfbW9kPC9zdHJvbmc+PC9iaWc+PC9iaWc+ICh2ZXJzaW9uIDEuMi4zLjQpPC9mb250PjwvdGQKKz48dGQgYWxpZ249cmlnaHQgdmFsaWduPWJvdHRvbQorPjxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48YSBocmVmPSIuIj5pbmRleDwvYT48YnI+PGEgaHJlZj0iZmlsZTolcyI+JXM8L2E+JXM8L2ZvbnQ+PC90ZD48L3RyPjwvdGFibGU+CisgICAgPHA+PHR0PlRoaXMmbmJzcDtpcyZuYnNwO2EmbmJzcDt0ZXN0Jm5ic3A7bW9kdWxlJm5ic3A7Zm9yJm5ic3A7dGVzdF9weWRvYzwvdHQ+PC9wPgorPHA+Cis8dGFibGUgd2lkdGg9IjEwMCUlIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTIgYm9yZGVyPTAgc3VtbWFyeT0ic2VjdGlvbiI+Cis8dHIgYmdjb2xvcj0iI2VlNzdhYSI+Cis8dGQgY29sc3Bhbj0zIHZhbGlnbj1ib3R0b20+Jm5ic3A7PGJyPgorPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPjxiaWc+PHN0cm9uZz5DbGFzc2VzPC9zdHJvbmc+PC9iaWc+PC9mb250PjwvdGQ+PC90cj4KK1x4MjBceDIwXHgyMFx4MjAKKzx0cj48dGQgYmdjb2xvcj0iI2VlNzdhYSI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdHQ+PC90ZD48dGQ+Jm5ic3A7PC90ZD4KKzx0ZCB3aWR0aD0iMTAwJSUiPjxkbD4KKzxkdD48Zm9udCBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48YSBocmVmPSJfX2J1aWx0aW5fXy5odG1sI29iamVjdCI+X19idWlsdGluX18ub2JqZWN0PC9hPgorPC9mb250PjwvZHQ+PGRkPgorPGRsPgorPGR0Pjxmb250IGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPjxhIGhyZWY9InRlc3QucHlkb2NfbW9kLmh0bWwjQiI+QjwvYT4KKzwvZm9udD48L2R0PjwvZGw+Cis8L2RkPgorPGR0Pjxmb250IGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPjxhIGhyZWY9InRlc3QucHlkb2NfbW9kLmh0bWwjQSI+QTwvYT4KKzwvZm9udD48L2R0PjwvZGw+CisgPHA+Cis8dGFibGUgd2lkdGg9IjEwMCUlIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTIgYm9yZGVyPTAgc3VtbWFyeT0ic2VjdGlvbiI+Cis8dHIgYmdjb2xvcj0iI2ZmYzhkOCI+Cis8dGQgY29sc3Bhbj0zIHZhbGlnbj1ib3R0b20+Jm5ic3A7PGJyPgorPGZvbnQgY29sb3I9IiMwMDAwMDAiIGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPjxhIG5hbWU9IkEiPmNsYXNzIDxzdHJvbmc+QTwvc3Ryb25nPjwvYT48L2ZvbnQ+PC90ZD48L3RyPgorXHgyMFx4MjBceDIwXHgyMAorPHRyIGJnY29sb3I9IiNmZmM4ZDgiPjx0ZCByb3dzcGFuPTI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOzwvdHQ+PC90ZD4KKzx0ZCBjb2xzcGFuPTI+PHR0PkhlbGxvJm5ic3A7YW5kJm5ic3A7Z29vZGJ5ZTxicj4mbmJzcDs8L3R0PjwvdGQ+PC90cj4KKzx0cj48dGQ+Jm5ic3A7PC90ZD4KKzx0ZCB3aWR0aD0iMTAwJSUiPk1ldGhvZHMgZGVmaW5lZCBoZXJlOjxicj4KKzxkbD48ZHQ+PGEgbmFtZT0iQS1fX2luaXRfXyI+PHN0cm9uZz5fX2luaXRfXzwvc3Ryb25nPjwvYT4oKTwvZHQ+PGRkPjx0dD5Xb3csJm5ic3A7SSZuYnNwO2hhdmUmbmJzcDtubyZuYnNwO2Z1bmN0aW9uITwvdHQ+PC9kZD48L2RsPgorCis8L3RkPjwvdHI+PC90YWJsZT4gPHA+Cis8dGFibGUgd2lkdGg9IjEwMCUlIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTIgYm9yZGVyPTAgc3VtbWFyeT0ic2VjdGlvbiI+Cis8dHIgYmdjb2xvcj0iI2ZmYzhkOCI+Cis8dGQgY29sc3Bhbj0zIHZhbGlnbj1ib3R0b20+Jm5ic3A7PGJyPgorPGZvbnQgY29sb3I9IiMwMDAwMDAiIGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPjxhIG5hbWU9IkIiPmNsYXNzIDxzdHJvbmc+Qjwvc3Ryb25nPjwvYT4oPGEgaHJlZj0iX19idWlsdGluX18uaHRtbCNvYmplY3QiPl9fYnVpbHRpbl9fLm9iamVjdDwvYT4pPC9mb250PjwvdGQ+PC90cj4KK1x4MjBceDIwXHgyMFx4MjAKKzx0cj48dGQgYmdjb2xvcj0iI2ZmYzhkOCI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOzwvdHQ+PC90ZD48dGQ+Jm5ic3A7PC90ZD4KKzx0ZCB3aWR0aD0iMTAwJSUiPkRhdGEgZGVzY3JpcHRvcnMgZGVmaW5lZCBoZXJlOjxicj4KKzxkbD48ZHQ+PHN0cm9uZz5fX2RpY3RfXzwvc3Ryb25nPjwvZHQ+Cis8ZGQ+PHR0PiVzPC90dD48L2RkPgorPC9kbD4KKzxkbD48ZHQ+PHN0cm9uZz5fX3dlYWtyZWZfXzwvc3Ryb25nPjwvZHQ+Cis8ZGQ+PHR0PiVzPC90dD48L2RkPgorPC9kbD4KKzxocj4KK0RhdGEgYW5kIG90aGVyIGF0dHJpYnV0ZXMgZGVmaW5lZCBoZXJlOjxicj4KKzxkbD48ZHQ+PHN0cm9uZz5OT19NRUFOSU5HPC9zdHJvbmc+ID0gJ2VnZ3MnPC9kbD4KKworPC90ZD48L3RyPjwvdGFibGU+PC90ZD48L3RyPjwvdGFibGU+PHA+Cis8dGFibGUgd2lkdGg9IjEwMCUlIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTIgYm9yZGVyPTAgc3VtbWFyeT0ic2VjdGlvbiI+Cis8dHIgYmdjb2xvcj0iI2VlYWE3NyI+Cis8dGQgY29sc3Bhbj0zIHZhbGlnbj1ib3R0b20+Jm5ic3A7PGJyPgorPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPjxiaWc+PHN0cm9uZz5GdW5jdGlvbnM8L3N0cm9uZz48L2JpZz48L2ZvbnQ+PC90ZD48L3RyPgorXHgyMFx4MjBceDIwXHgyMAorPHRyPjx0ZCBiZ2NvbG9yPSIjZWVhYTc3Ij48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90dD48L3RkPjx0ZD4mbmJzcDs8L3RkPgorPHRkIHdpZHRoPSIxMDAlJSI+PGRsPjxkdD48YSBuYW1lPSItZG9jX2Z1bmMiPjxzdHJvbmc+ZG9jX2Z1bmM8L3N0cm9uZz48L2E+KCk8L2R0PjxkZD48dHQ+VGhpcyZuYnNwO2Z1bmN0aW9uJm5ic3A7c29sdmVzJm5ic3A7YWxsJm5ic3A7b2YmbmJzcDt0aGUmbmJzcDt3b3JsZCdzJm5ic3A7cHJvYmxlbXM6PGJyPgoraHVuZ2VyPGJyPgorbGFjayZuYnNwO29mJm5ic3A7UHl0aG9uPGJyPgord2FyPC90dD48L2RkPjwvZGw+CisgPGRsPjxkdD48YSBuYW1lPSItbm9kb2NfZnVuYyI+PHN0cm9uZz5ub2RvY19mdW5jPC9zdHJvbmc+PC9hPigpPC9kdD48L2RsPgorPC90ZD48L3RyPjwvdGFibGU+PHA+Cis8dGFibGUgd2lkdGg9IjEwMCUlIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTIgYm9yZGVyPTAgc3VtbWFyeT0ic2VjdGlvbiI+Cis8dHIgYmdjb2xvcj0iIzU1YWE1NSI+Cis8dGQgY29sc3Bhbj0zIHZhbGlnbj1ib3R0b20+Jm5ic3A7PGJyPgorPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPjxiaWc+PHN0cm9uZz5EYXRhPC9zdHJvbmc+PC9iaWc+PC9mb250PjwvdGQ+PC90cj4KK1x4MjBceDIwXHgyMFx4MjAKKzx0cj48dGQgYmdjb2xvcj0iIzU1YWE1NSI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdHQ+PC90ZD48dGQ+Jm5ic3A7PC90ZD4KKzx0ZCB3aWR0aD0iMTAwJSUiPjxzdHJvbmc+X19hdXRob3JfXzwvc3Ryb25nPiA9ICdCZW5qYW1pbiBQZXRlcnNvbic8YnI+Cis8c3Ryb25nPl9fY3JlZGl0c19fPC9zdHJvbmc+ID0gJ05vYm9keSc8YnI+Cis8c3Ryb25nPl9fdmVyc2lvbl9fPC9zdHJvbmc+ID0gJzEuMi4zLjQnPC90ZD48L3RyPjwvdGFibGU+PHA+Cis8dGFibGUgd2lkdGg9IjEwMCUlIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTIgYm9yZGVyPTAgc3VtbWFyeT0ic2VjdGlvbiI+Cis8dHIgYmdjb2xvcj0iIzc3OTllZSI+Cis8dGQgY29sc3Bhbj0zIHZhbGlnbj1ib3R0b20+Jm5ic3A7PGJyPgorPGZvbnQgY29sb3I9IiNmZmZmZmYiIGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPjxiaWc+PHN0cm9uZz5BdXRob3I8L3N0cm9uZz48L2JpZz48L2ZvbnQ+PC90ZD48L3RyPgorXHgyMFx4MjBceDIwXHgyMAorPHRyPjx0ZCBiZ2NvbG9yPSIjNzc5OWVlIj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90dD48L3RkPjx0ZD4mbmJzcDs8L3RkPgorPHRkIHdpZHRoPSIxMDAlJSI+QmVuamFtaW4mbmJzcDtQZXRlcnNvbjwvdGQ+PC90cj48L3RhYmxlPjxwPgorPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIGJvcmRlcj0wIHN1bW1hcnk9InNlY3Rpb24iPgorPHRyIGJnY29sb3I9IiM3Nzk5ZWUiPgorPHRkIGNvbHNwYW49MyB2YWxpZ249Ym90dG9tPiZuYnNwOzxicj4KKzxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48YmlnPjxzdHJvbmc+Q3JlZGl0czwvc3Ryb25nPjwvYmlnPjwvZm9udD48L3RkPjwvdHI+CitceDIwXHgyMFx4MjBceDIwCis8dHI+PHRkIGJnY29sb3I9IiM3Nzk5ZWUiPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3R0PjwvdGQ+PHRkPiZuYnNwOzwvdGQ+Cis8dGQgd2lkdGg9IjEwMCUlIj5Ob2JvZHk8L3RkPjwvdHI+PC90YWJsZT4KKyIiIi5zdHJpcCgpCisKK2V4cGVjdGVkX2h0bWxfZGF0YV9kb2NzdHJpbmdzID0gdHVwbGUocy5yZXBsYWNlKCcgJywgJyZuYnNwOycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzIGluIGV4cGVjdGVkX2RhdGFfZG9jc3RyaW5ncykKKworIyBvdXRwdXQgcGF0dGVybiBmb3IgbWlzc2luZyBtb2R1bGUKK21pc3NpbmdfcGF0dGVybiA9ICJubyBQeXRob24gZG9jdW1lbnRhdGlvbiBmb3VuZCBmb3IgJyVzJyIKKworIyBvdXRwdXQgcGF0dGVybiBmb3IgbW9kdWxlIHdpdGggYmFkIGltcG9ydHMKK2JhZGltcG9ydF9wYXR0ZXJuID0gInByb2JsZW0gaW4gJXMgLSA8dHlwZSAnZXhjZXB0aW9ucy5JbXBvcnRFcnJvcic+OiBObyBtb2R1bGUgbmFtZWQgJXMiCisKK2RlZiBydW5fcHlkb2MobW9kdWxlX25hbWUsICphcmdzLCAqKmVudik6CisgICAgIiIiCisgICAgUnVucyBweWRvYyBvbiB0aGUgc3BlY2lmaWVkIG1vZHVsZS4gUmV0dXJucyB0aGUgc3RyaXBwZWQKKyAgICBvdXRwdXQgb2YgcHlkb2MuCisgICAgIiIiCisgICAgYXJncyA9IGFyZ3MgKyAobW9kdWxlX25hbWUsKQorICAgICMgZG8gbm90IHdyaXRlIGJ5dGVjb2RlIGZpbGVzIHRvIGF2b2lkIGNhY2hpbmcgZXJyb3JzCisgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygnLUInLCBweWRvYy5fX2ZpbGVfXywgKmFyZ3MsICoqZW52KQorICAgIHJldHVybiBvdXQuc3RyaXAoKQorCitkZWYgZ2V0X3B5ZG9jX2h0bWwobW9kdWxlKToKKyAgICAiUmV0dXJucyBweWRvYyBnZW5lcmF0ZWQgb3V0cHV0IGFzIGh0bWwiCisgICAgZG9jID0gcHlkb2MuSFRNTERvYygpCisgICAgb3V0cHV0ID0gZG9jLmRvY21vZHVsZShtb2R1bGUpCisgICAgbG9jID0gZG9jLmdldGRvY2xvYyhweWRvY19tb2QpIG9yICIiCisgICAgaWYgbG9jOgorICAgICAgICBsb2MgPSAiPGJyPjxhIGhyZWY9XCIiICsgbG9jICsgIlwiPk1vZHVsZSBEb2NzPC9hPiIKKyAgICByZXR1cm4gb3V0cHV0LnN0cmlwKCksIGxvYworCitkZWYgZ2V0X3B5ZG9jX3RleHQobW9kdWxlKToKKyAgICAiUmV0dXJucyBweWRvYyBnZW5lcmF0ZWQgb3V0cHV0IGFzIHRleHQiCisgICAgZG9jID0gcHlkb2MuVGV4dERvYygpCisgICAgbG9jID0gZG9jLmdldGRvY2xvYyhweWRvY19tb2QpIG9yICIiCisgICAgaWYgbG9jOgorICAgICAgICBsb2MgPSAiXG5NT0RVTEUgRE9DU1xuICAgICIgKyBsb2MgKyAiXG4iCisKKyAgICBvdXRwdXQgPSBkb2MuZG9jbW9kdWxlKG1vZHVsZSkKKworICAgICMgY2xlYW51cCB0aGUgZXh0cmEgdGV4dCBmb3JtYXR0aW5nIHRoYXQgcHlkb2MgcHJlZm9ybXMKKyAgICBwYXR0ID0gcmUuY29tcGlsZSgnXGIuJykKKyAgICBvdXRwdXQgPSBwYXR0LnN1YignJywgb3V0cHV0KQorICAgIHJldHVybiBvdXRwdXQuc3RyaXAoKSwgbG9jCisKK2RlZiBwcmludF9kaWZmcyh0ZXh0MSwgdGV4dDIpOgorICAgICJQcmludHMgdW5pZmllZCBkaWZmcyBmb3IgdHdvIHRleHRzIgorICAgIGxpbmVzMSA9IHRleHQxLnNwbGl0bGluZXMoVHJ1ZSkKKyAgICBsaW5lczIgPSB0ZXh0Mi5zcGxpdGxpbmVzKFRydWUpCisgICAgZGlmZnMgPSBkaWZmbGliLnVuaWZpZWRfZGlmZihsaW5lczEsIGxpbmVzMiwgbj0wLCBmcm9tZmlsZT0nZXhwZWN0ZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9maWxlPSdnb3QnKQorICAgIHByaW50ICdcbicgKyAnJy5qb2luKGRpZmZzKQorCisKK2NsYXNzIFB5RG9jRG9jVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF9odG1sX2RvYyhzZWxmKToKKyAgICAgICAgcmVzdWx0LCBkb2NfbG9jID0gZ2V0X3B5ZG9jX2h0bWwocHlkb2NfbW9kKQorICAgICAgICBtb2RfZmlsZSA9IGluc3BlY3QuZ2V0YWJzZmlsZShweWRvY19tb2QpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgaW1wb3J0IG50dXJsMnBhdGgKKyAgICAgICAgICAgIG1vZF91cmwgPSBudHVybDJwYXRoLnBhdGhuYW1lMnVybChtb2RfZmlsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZF91cmwgPSBtb2RfZmlsZQorICAgICAgICBleHBlY3RlZF9odG1sID0gZXhwZWN0ZWRfaHRtbF9wYXR0ZXJuICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgKG1vZF91cmwsIG1vZF9maWxlLCBkb2NfbG9jKSArCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9odG1sX2RhdGFfZG9jc3RyaW5ncykKKyAgICAgICAgaWYgcmVzdWx0ICE9IGV4cGVjdGVkX2h0bWw6CisgICAgICAgICAgICBwcmludF9kaWZmcyhleHBlY3RlZF9odG1sLCByZXN1bHQpCisgICAgICAgICAgICBzZWxmLmZhaWwoIm91dHB1dHMgYXJlIG5vdCBlcXVhbCwgc2VlIGRpZmYgYWJvdmUiKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RfdGV4dF9kb2Moc2VsZik6CisgICAgICAgIHJlc3VsdCwgZG9jX2xvYyA9IGdldF9weWRvY190ZXh0KHB5ZG9jX21vZCkKKyAgICAgICAgZXhwZWN0ZWRfdGV4dCA9IGV4cGVjdGVkX3RleHRfcGF0dGVybiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnNwZWN0LmdldGFic2ZpbGUocHlkb2NfbW9kKSwgZG9jX2xvYykgKworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfdGV4dF9kYXRhX2RvY3N0cmluZ3MpCisgICAgICAgIGlmIHJlc3VsdCAhPSBleHBlY3RlZF90ZXh0OgorICAgICAgICAgICAgcHJpbnRfZGlmZnMoZXhwZWN0ZWRfdGV4dCwgcmVzdWx0KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJvdXRwdXRzIGFyZSBub3QgZXF1YWwsIHNlZSBkaWZmIGFib3ZlIikKKworICAgIGRlZiB0ZXN0X2lzc3VlODIyNShzZWxmKToKKyAgICAgICAgIyBUZXN0IGlzc3VlODIyNSB0byBlbnN1cmUgbm8gZG9jIGxpbmsgYXBwZWFycyBmb3IgeG1sLmV0cmVlCisgICAgICAgIHJlc3VsdCwgZG9jX2xvYyA9IGdldF9weWRvY190ZXh0KHhtbC5ldHJlZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkb2NfbG9jLCAiIiwgIk1PRFVMRSBET0NTIGluY29ycmVjdGx5IGluY2x1ZGVzIGEgbGluayIpCisKKyAgICBkZWYgdGVzdF9ub25fc3RyX25hbWUoc2VsZik6CisgICAgICAgICMgaXNzdWUxNDYzOAorICAgICAgICAjIFRyZWF0IGlsbGVnYWwgKG5vbi1zdHIpIG5hbWUgbGlrZSBubyBuYW1lCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBfX25hbWVfXyA9IDQyCisgICAgICAgIGNsYXNzIEI6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGFkb2MgPSBweWRvYy5yZW5kZXJfZG9jKEEoKSkKKyAgICAgICAgYmRvYyA9IHB5ZG9jLnJlbmRlcl9kb2MoQigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkb2MucmVwbGFjZSgiQSIsICJCIiksIGJkb2MpCisKKyAgICBkZWYgdGVzdF9ub3RfaGVyZShzZWxmKToKKyAgICAgICAgbWlzc2luZ19tb2R1bGUgPSAidGVzdC5pX2FtX25vdF9oZXJlIgorICAgICAgICByZXN1bHQgPSBydW5fcHlkb2MobWlzc2luZ19tb2R1bGUpCisgICAgICAgIGV4cGVjdGVkID0gbWlzc2luZ19wYXR0ZXJuICUgbWlzc2luZ19tb2R1bGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgcmVzdWx0LAorICAgICAgICAgICAgImRvY3VtZW50YXRpb24gZm9yIG1pc3NpbmcgbW9kdWxlIGZvdW5kIikKKworICAgIGRlZiB0ZXN0X2lucHV0X3N0cmlwKHNlbGYpOgorICAgICAgICBtaXNzaW5nX21vZHVsZSA9ICIgdGVzdC5pX2FtX25vdF9oZXJlICIKKyAgICAgICAgcmVzdWx0ID0gcnVuX3B5ZG9jKG1pc3NpbmdfbW9kdWxlKQorICAgICAgICBleHBlY3RlZCA9IG1pc3NpbmdfcGF0dGVybiAlIG1pc3NpbmdfbW9kdWxlLnN0cmlwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgcmVzdWx0LAorICAgICAgICAgICAgIndoaXRlIHNwYWNlIHdhcyBub3Qgc3RyaXBwZWQgZnJvbSBtb2R1bGUgbmFtZSAiCisgICAgICAgICAgICAib3Igb3RoZXIgZXJyb3Igb3V0cHV0IG1pc21hdGNoIikKKworICAgIGRlZiB0ZXN0X3N0cmlwaWQoc2VsZik6CisgICAgICAgICMgdGVzdCB3aXRoIHN0cmluZ3MsIG90aGVyIGltcGxlbWVudGF0aW9ucyBtaWdodCBoYXZlIGRpZmZlcmVudCByZXByKCkKKyAgICAgICAgc3RyaXBpZCA9IHB5ZG9jLnN0cmlwaWQKKyAgICAgICAgIyBzdHJpcCB0aGUgaWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpcGlkKCc8ZnVuY3Rpb24gc3RyaXBpZCBhdCAweDg4ZGNlZTQ+JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJzxmdW5jdGlvbiBzdHJpcGlkPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaXBpZCgnPGZ1bmN0aW9uIHN0cmlwaWQgYXQgMHgwMUY2NTM5MD4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnPGZ1bmN0aW9uIHN0cmlwaWQ+JykKKyAgICAgICAgIyBub3RoaW5nIHRvIHN0cmlwLCByZXR1cm4gdGhlIHNhbWUgdGV4dAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmlwaWQoJzQyJyksICc0MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaXBpZCgiPHR5cGUgJ2V4Y2VwdGlvbnMuRXhjZXB0aW9uJz4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiPHR5cGUgJ2V4Y2VwdGlvbnMuRXhjZXB0aW9uJz4iKQorCisKK2NsYXNzIFB5ZG9jSW1wb3J0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF9kaXIgPSBvcy5ta2RpcihURVNURk4pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChybXRyZWUsIFRFU1RGTikKKworICAgIGRlZiB0ZXN0X2JhZGltcG9ydChzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3RzIHRoZSBmaXggZm9yIGlzc3VlIDUyMzAsIHdoZXJlIGlmIHB5ZG9jIGZvdW5kIHRoZSBtb2R1bGUKKyAgICAgICAgIyBidXQgdGhlIG1vZHVsZSBoYWQgYW4gaW50ZXJuYWwgaW1wb3J0IGVycm9yIHB5ZG9jIHdvdWxkIHJlcG9ydCBubyBkb2MKKyAgICAgICAgIyBmb3VuZC4KKyAgICAgICAgbW9kbmFtZSA9ICd0ZXN0bW9kX3h5enp5JworICAgICAgICB0ZXN0cGFpcnMgPSAoCisgICAgICAgICAgICAoJ2lfYW1fbm90X2hlcmUnLCAnaV9hbV9ub3RfaGVyZScpLAorICAgICAgICAgICAgKCd0ZXN0LmlfYW1fbm90X2hlcmVfZWl0aGVyJywgJ2lfYW1fbm90X2hlcmVfZWl0aGVyJyksCisgICAgICAgICAgICAoJ3Rlc3QuaV9hbV9ub3RfaGVyZS5uZWl0aGVyX2FtX2knLCAnaV9hbV9ub3RfaGVyZS5uZWl0aGVyX2FtX2knKSwKKyAgICAgICAgICAgICgnaV9hbV9ub3RfaGVyZS57fScuZm9ybWF0KG1vZG5hbWUpLAorICAgICAgICAgICAgICdpX2FtX25vdF9oZXJlLnt9Jy5mb3JtYXQobW9kbmFtZSkpLAorICAgICAgICAgICAgKCd0ZXN0Lnt9Jy5mb3JtYXQobW9kbmFtZSksIG1vZG5hbWUpLAorICAgICAgICAgICAgKQorCisgICAgICAgIHNvdXJjZWZuID0gb3MucGF0aC5qb2luKFRFU1RGTiwgbW9kbmFtZSkgKyBvcy5leHRzZXAgKyAicHkiCisgICAgICAgIGZvciBpbXBvcnRzdHJpbmcsIGV4cGVjdGVkaW5tc2cgaW4gdGVzdHBhaXJzOgorICAgICAgICAgICAgd2l0aCBvcGVuKHNvdXJjZWZuLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiaW1wb3J0IHt9XG4iLmZvcm1hdChpbXBvcnRzdHJpbmcpKQorICAgICAgICAgICAgcmVzdWx0ID0gcnVuX3B5ZG9jKG1vZG5hbWUsIFBZVEhPTlBBVEg9VEVTVEZOKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSBiYWRpbXBvcnRfcGF0dGVybiAlIChtb2RuYW1lLCBleHBlY3RlZGlubXNnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgcmVzdWx0KQorCisgICAgZGVmIHRlc3RfYXByb3Bvc193aXRoX2JhZF9wYWNrYWdlKHNlbGYpOgorICAgICAgICAjIElzc3VlIDc0MjUgLSBweWRvYyAtayBmYWlsZWQgd2hlbiBiYWQgcGFja2FnZSBvbiBwYXRoCisgICAgICAgIHBrZ2RpciA9IG9zLnBhdGguam9pbihURVNURk4sICJzeW50YXhlcnIiKQorICAgICAgICBvcy5ta2Rpcihwa2dkaXIpCisgICAgICAgIGJhZHN5bnRheCA9IG9zLnBhdGguam9pbihwa2dkaXIsICJfX2luaXRfXyIpICsgb3MuZXh0c2VwICsgInB5IgorICAgICAgICB3aXRoIG9wZW4oYmFkc3ludGF4LCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCJpbnZhbGlkIHB5dGhvbiBzeW50YXggPSAkMVxuIikKKyAgICAgICAgcmVzdWx0ID0gcnVuX3B5ZG9jKCd6cXd5a2p2JywgJy1rJywgUFlUSE9OUEFUSD1URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X2Fwcm9wb3Nfd2l0aF91bnJlYWRhYmxlX2RpcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA3MzY3IC0gcHlkb2MgLWsgZmFpbGVkIHdoZW4gdW5yZWFkYWJsZSBkaXIgb24gcGF0aAorICAgICAgICBzZWxmLnVucmVhZGFibGVfZGlyID0gb3MucGF0aC5qb2luKFRFU1RGTiwgInVucmVhZGFibGUiKQorICAgICAgICBvcy5ta2RpcihzZWxmLnVucmVhZGFibGVfZGlyLCAwKQorICAgICAgICBzZWxmLmFkZENsZWFudXAob3Mucm1kaXIsIHNlbGYudW5yZWFkYWJsZV9kaXIpCisgICAgICAgICMgTm90ZSwgb24gV2luZG93cyB0aGUgZGlyZWN0b3J5IGFwcGVhcnMgdG8gYmUgc3RpbGwKKyAgICAgICAgIyAgIHJlYWRhYmxlIHNvIHRoaXMgaXMgbm90IHJlYWxseSB0ZXN0aW5nIHRoZSBpc3N1ZSB0aGVyZQorICAgICAgICByZXN1bHQgPSBydW5fcHlkb2MoJ3pxd3lranYnLCAnLWsnLCBQWVRIT05QQVRIPVRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgcmVzdWx0KQorCisKK2NsYXNzIFRlc3REZXNjcmlwdGlvbnModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbW9kdWxlKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgcHlkb2Nmb2RkZXIgbW9kdWxlIGNhbiBiZSBkZXNjcmliZWQKKyAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCBweWRvY2ZvZGRlcgorICAgICAgICBkb2MgPSBweWRvYy5yZW5kZXJfZG9jKHB5ZG9jZm9kZGVyKQorICAgICAgICBzZWxmLmFzc2VydEluKCJweWRvY2ZvZGRlciIsIGRvYykKKworICAgIGRlZiB0ZXN0X2NsYXNzaWNfY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEM6ICJDbGFzc2ljIGNsYXNzIgorICAgICAgICBjID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHlkb2MuZGVzY3JpYmUoQyksICdjbGFzcyBDJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweWRvYy5kZXNjcmliZShjKSwgJ2luc3RhbmNlIG9mIEMnKQorICAgICAgICBleHBlY3RlZCA9ICdpbnN0YW5jZSBvZiBDIGluIG1vZHVsZSAlcycgJSBfX25hbWVfXworICAgICAgICBzZWxmLmFzc2VydEluKGV4cGVjdGVkLCBweWRvYy5yZW5kZXJfZG9jKGMpKQorCisgICAgZGVmIHRlc3RfY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KTogIk5ldy1zdHlsZSBjbGFzcyIKKyAgICAgICAgYyA9IEMoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHlkb2MuZGVzY3JpYmUoQyksICdjbGFzcyBDJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweWRvYy5kZXNjcmliZShjKSwgJ0MnKQorICAgICAgICBleHBlY3RlZCA9ICdDIGluIG1vZHVsZSAlcyBvYmplY3QnICUgX19uYW1lX18KKyAgICAgICAgc2VsZi5hc3NlcnRJbihleHBlY3RlZCwgcHlkb2MucmVuZGVyX2RvYyhjKSkKKworICAgIGRlZiB0ZXN0X25hbWVkdHVwbGVfcHVibGljX3VuZGVyc2NvcmUoc2VsZik6CisgICAgICAgIE5UID0gbmFtZWR0dXBsZSgnTlQnLCBbJ2FiYycsICdkZWYnXSwgcmVuYW1lPVRydWUpCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgaGVscF9pbzoKKyAgICAgICAgICAgIGhlbHAoTlQpCisgICAgICAgIGhlbHB0ZXh0ID0gaGVscF9pby5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ18xJywgaGVscHRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ19yZXBsYWNlJywgaGVscHRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ19hc2RpY3QnLCBoZWxwdGV4dCkKKworCitjbGFzcyBUZXN0SGVscGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9rZXl3b3JkcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQocHlkb2MuSGVscGVyLmtleXdvcmRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWQoa2V5d29yZC5rd2xpc3QpKQorCisgICAgZGVmIHRlc3RfYnVpbHRpbihzZWxmKToKKyAgICAgICAgZm9yIG5hbWUgaW4gKCdzdHInLCAnc3RyLnRyYW5zbGF0ZScsICdfX2J1aWx0aW5fXy5zdHInLAorICAgICAgICAgICAgICAgICAgICAgJ19fYnVpbHRpbl9fLnN0ci50cmFuc2xhdGUnKToKKyAgICAgICAgICAgICMgdGVzdCBsb3ctbGV2ZWwgZnVuY3Rpb24KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHB5ZG9jLmxvY2F0ZShuYW1lKSkKKyAgICAgICAgICAgICMgdGVzdCBoaWdoLWxldmVsIGZ1bmN0aW9uCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcHlkb2MucmVuZGVyX2RvYyhuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnZmluZGluZyB0aGUgZG9jIG9mIHshcn0gZmFpbGVkJy5mb3JtYXQobykpCisKKyAgICAgICAgZm9yIG5hbWUgaW4gKCdub3RfX2J1aWx0aW5fXycsICdzdHJycicsICdzdHJyLnRyYW5zbGF0ZScsCisgICAgICAgICAgICAgICAgICAgICAnc3RyLnRycnJyYW5zbGF0ZScsICdfX2J1aWx0aW5fXy5zdHJycicsCisgICAgICAgICAgICAgICAgICAgICAnX19idWlsdGluX18uc3RyLnRycnJhbnNsYXRlJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShweWRvYy5sb2NhdGUobmFtZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvciwgcHlkb2MucmVuZGVyX2RvYywgbmFtZSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdHJ5OgorICAgICAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUHlEb2NEb2NUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlkb2NJbXBvcnRUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdERlc2NyaXB0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RIZWxwZXIpCisgICAgZmluYWxseToKKyAgICAgICAgcmVhcF9jaGlsZHJlbigpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZG9jLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZG9jLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjY1M2NjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlkb2MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZG9jLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZG9jLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjY1M2NjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlkb2MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZXhwYXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWV4cGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MTFhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWV4cGF0LnB5CkBAIC0wLDAgKzEsNjU3IEBACisjIFhYWCBUeXBlRXJyb3JzIG9uIGNhbGxpbmcgaGFuZGxlcnMsIG9yIG9uIGJhZCByZXR1cm4gdmFsdWVzIGZyb20gYQorIyBoYW5kbGVyLCBhcmUgb2JzY3VyZSBhbmQgdW5oZWxwZnVsLgorCitpbXBvcnQgU3RyaW5nSU8sIHN5cworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20geG1sLnBhcnNlcnMgaW1wb3J0IGV4cGF0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBzb3J0ZGljdCwgcnVuX3VuaXR0ZXN0CisKKworY2xhc3MgU2V0QXR0cmlidXRlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZShuYW1lc3BhY2Vfc2VwYXJhdG9yPSchJykKKyAgICAgICAgc2VsZi5zZXRfZ2V0X3BhaXJzID0gWworICAgICAgICAgICAgWzAsIDBdLAorICAgICAgICAgICAgWzEsIDFdLAorICAgICAgICAgICAgWzIsIDFdLAorICAgICAgICAgICAgWzAsIDBdLAorICAgICAgICAgICAgXQorCisgICAgZGVmIHRlc3RfcmV0dXJuc191bmljb2RlKHNlbGYpOgorICAgICAgICBmb3IgeCwgeSBpbiBzZWxmLnNldF9nZXRfcGFpcnM6CisgICAgICAgICAgICBzZWxmLnBhcnNlci5yZXR1cm5zX3VuaWNvZGUgPSB4CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLnJldHVybnNfdW5pY29kZSwgeSkKKworICAgIGRlZiB0ZXN0X29yZGVyZWRfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgZm9yIHgsIHkgaW4gc2VsZi5zZXRfZ2V0X3BhaXJzOgorICAgICAgICAgICAgc2VsZi5wYXJzZXIub3JkZXJlZF9hdHRyaWJ1dGVzID0geAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5vcmRlcmVkX2F0dHJpYnV0ZXMsIHkpCisKKyAgICBkZWYgdGVzdF9zcGVjaWZpZWRfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgZm9yIHgsIHkgaW4gc2VsZi5zZXRfZ2V0X3BhaXJzOgorICAgICAgICAgICAgc2VsZi5wYXJzZXIuc3BlY2lmaWVkX2F0dHJpYnV0ZXMgPSB4CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLnNwZWNpZmllZF9hdHRyaWJ1dGVzLCB5KQorCisKK2RhdGEgPSAnJydcCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIiBzdGFuZGFsb25lPSJubyI/PgorPD94bWwtc3R5bGVzaGVldCBocmVmPSJzdHlsZXNoZWV0LmNzcyI/PgorPCEtLSBjb21tZW50IGRhdGEgLS0+Cis8IURPQ1RZUEUgcXVvdGF0aW9ucyBTWVNURU0gInF1b3RhdGlvbnMuZHRkIiBbCis8IUVMRU1FTlQgcm9vdCBBTlk+Cis8IU5PVEFUSU9OIG5vdGF0aW9uIFNZU1RFTSAibm90YXRpb24uanBlZyI+Cis8IUVOVElUWSBhY2lyYyAiJiMyMjY7Ij4KKzwhRU5USVRZIGV4dGVybmFsX2VudGl0eSBTWVNURU0gImVudGl0eS5maWxlIj4KKzwhRU5USVRZIHVucGFyc2VkX2VudGl0eSBTWVNURU0gImVudGl0eS5maWxlIiBOREFUQSBub3RhdGlvbj4KKyV1bnBhcnNlZF9lbnRpdHk7CitdPgorCis8cm9vdCBhdHRyMT0idmFsdWUxIiBhdHRyMj0idmFsdWUyJiM4MDAwOyI+Cis8bXluczpzdWJlbGVtZW50IHhtbG5zOm15bnM9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9uYW1lc3BhY2UiPgorICAgICBDb250ZW50cyBvZiBzdWJlbGVtZW50cworPC9teW5zOnN1YmVsZW1lbnQ+Cis8c3ViMj48IVtDREFUQVtjb250ZW50cyBvZiBDREFUQSBzZWN0aW9uXV0+PC9zdWIyPgorJmV4dGVybmFsX2VudGl0eTsKKzwvcm9vdD4KKycnJworCisKKyMgUHJvZHVjZSBVVEYtOCBvdXRwdXQKK2NsYXNzIFBhcnNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgY2xhc3MgT3V0cHV0dGVyOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICBzZWxmLm91dCA9IFtdCisKKyAgICAgICAgZGVmIFN0YXJ0RWxlbWVudEhhbmRsZXIoc2VsZiwgbmFtZSwgYXR0cnMpOgorICAgICAgICAgICAgc2VsZi5vdXQuYXBwZW5kKCdTdGFydCBlbGVtZW50OiAnICsgcmVwcihuYW1lKSArICcgJyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGRpY3QoYXR0cnMpKQorCisgICAgICAgIGRlZiBFbmRFbGVtZW50SGFuZGxlcihzZWxmLCBuYW1lKToKKyAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnRW5kIGVsZW1lbnQ6ICcgKyByZXByKG5hbWUpKQorCisgICAgICAgIGRlZiBDaGFyYWN0ZXJEYXRhSGFuZGxlcihzZWxmLCBkYXRhKToKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICAgICAgc2VsZi5vdXQuYXBwZW5kKCdDaGFyYWN0ZXIgZGF0YTogJyArIHJlcHIoZGF0YSkpCisKKyAgICAgICAgZGVmIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIoc2VsZiwgdGFyZ2V0LCBkYXRhKToKKyAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnUEk6ICcgKyByZXByKHRhcmdldCkgKyAnICcgKyByZXByKGRhdGEpKQorCisgICAgICAgIGRlZiBTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyKHNlbGYsIHByZWZpeCwgdXJpKToKKyAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnTlMgZGVjbDogJyArIHJlcHIocHJlZml4KSArICcgJyArIHJlcHIodXJpKSkKKworICAgICAgICBkZWYgRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIoc2VsZiwgcHJlZml4KToKKyAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnRW5kIG9mIE5TIGRlY2w6ICcgKyByZXByKHByZWZpeCkpCisKKyAgICAgICAgZGVmIFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnU3RhcnQgb2YgQ0RBVEEgc2VjdGlvbicpCisKKyAgICAgICAgZGVmIEVuZENkYXRhU2VjdGlvbkhhbmRsZXIoc2VsZik6CisgICAgICAgICAgICBzZWxmLm91dC5hcHBlbmQoJ0VuZCBvZiBDREFUQSBzZWN0aW9uJykKKworICAgICAgICBkZWYgQ29tbWVudEhhbmRsZXIoc2VsZiwgdGV4dCk6CisgICAgICAgICAgICBzZWxmLm91dC5hcHBlbmQoJ0NvbW1lbnQ6ICcgKyByZXByKHRleHQpKQorCisgICAgICAgIGRlZiBOb3RhdGlvbkRlY2xIYW5kbGVyKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgIG5hbWUsIGJhc2UsIHN5c2lkLCBwdWJpZCA9IGFyZ3MKKyAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnTm90YXRpb24gZGVjbGFyZWQ6ICVzJyAlKGFyZ3MsKSkKKworICAgICAgICBkZWYgVW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcihzZWxmLCAqYXJncyk6CisgICAgICAgICAgICBlbnRpdHlOYW1lLCBiYXNlLCBzeXN0ZW1JZCwgcHVibGljSWQsIG5vdGF0aW9uTmFtZSA9IGFyZ3MKKyAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnVW5wYXJzZWQgZW50aXR5IGRlY2w6ICVzJyAlKGFyZ3MsKSkKKworICAgICAgICBkZWYgTm90U3RhbmRhbG9uZUhhbmRsZXIoc2VsZiwgdXNlckRhdGEpOgorICAgICAgICAgICAgc2VsZi5vdXQuYXBwZW5kKCdOb3Qgc3RhbmRhbG9uZScpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIGRlZiBFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgY29udGV4dCwgYmFzZSwgc3lzSWQsIHB1YklkID0gYXJncworICAgICAgICAgICAgc2VsZi5vdXQuYXBwZW5kKCdFeHRlcm5hbCBlbnRpdHkgcmVmOiAlcycgJShhcmdzWzE6XSwpKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICBkZWYgRGVmYXVsdEhhbmRsZXIoc2VsZiwgdXNlckRhdGEpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBEZWZhdWx0SGFuZGxlckV4cGFuZChzZWxmLCB1c2VyRGF0YSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICBoYW5kbGVyX25hbWVzID0gWworICAgICAgICAnU3RhcnRFbGVtZW50SGFuZGxlcicsICdFbmRFbGVtZW50SGFuZGxlcicsCisgICAgICAgICdDaGFyYWN0ZXJEYXRhSGFuZGxlcicsICdQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyJywKKyAgICAgICAgJ1VucGFyc2VkRW50aXR5RGVjbEhhbmRsZXInLCAnTm90YXRpb25EZWNsSGFuZGxlcicsCisgICAgICAgICdTdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyJywgJ0VuZE5hbWVzcGFjZURlY2xIYW5kbGVyJywKKyAgICAgICAgJ0NvbW1lbnRIYW5kbGVyJywgJ1N0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlcicsCisgICAgICAgICdFbmRDZGF0YVNlY3Rpb25IYW5kbGVyJywKKyAgICAgICAgJ0RlZmF1bHRIYW5kbGVyJywgJ0RlZmF1bHRIYW5kbGVyRXhwYW5kJywKKyAgICAgICAgIydOb3RTdGFuZGFsb25lSGFuZGxlcicsCisgICAgICAgICdFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXInCisgICAgICAgIF0KKworICAgIGRlZiB0ZXN0X3V0Zjgoc2VsZik6CisKKyAgICAgICAgb3V0ID0gc2VsZi5PdXRwdXR0ZXIoKQorICAgICAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUobmFtZXNwYWNlX3NlcGFyYXRvcj0nIScpCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuaGFuZGxlcl9uYW1lczoKKyAgICAgICAgICAgIHNldGF0dHIocGFyc2VyLCBuYW1lLCBnZXRhdHRyKG91dCwgbmFtZSkpCisgICAgICAgIHBhcnNlci5yZXR1cm5zX3VuaWNvZGUgPSAwCisgICAgICAgIHBhcnNlci5QYXJzZShkYXRhLCAxKQorCisgICAgICAgICMgVmVyaWZ5IG91dHB1dAorICAgICAgICBvcCA9IG91dC5vdXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFswXSwgJ1BJOiBcJ3htbC1zdHlsZXNoZWV0XCcgXCdocmVmPSJzdHlsZXNoZWV0LmNzcyJcJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMV0sICJDb21tZW50OiAnIGNvbW1lbnQgZGF0YSAnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsyXSwgIk5vdGF0aW9uIGRlY2xhcmVkOiAoJ25vdGF0aW9uJywgTm9uZSwgJ25vdGF0aW9uLmpwZWcnLCBOb25lKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbM10sICJVbnBhcnNlZCBlbnRpdHkgZGVjbDogKCd1bnBhcnNlZF9lbnRpdHknLCBOb25lLCAnZW50aXR5LmZpbGUnLCBOb25lLCAnbm90YXRpb24nKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbNF0sICJTdGFydCBlbGVtZW50OiAncm9vdCcgeydhdHRyMSc6ICd2YWx1ZTEnLCAnYXR0cjInOiAndmFsdWUyXFx4ZTFcXHhiZFxceDgwJ30iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzVdLCAiTlMgZGVjbDogJ215bnMnICdodHRwOi8vd3d3LnB5dGhvbi5vcmcvbmFtZXNwYWNlJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbNl0sICJTdGFydCBlbGVtZW50OiAnaHR0cDovL3d3dy5weXRob24ub3JnL25hbWVzcGFjZSFzdWJlbGVtZW50JyB7fSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbN10sICJDaGFyYWN0ZXIgZGF0YTogJ0NvbnRlbnRzIG9mIHN1YmVsZW1lbnRzJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbOF0sICJFbmQgZWxlbWVudDogJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy9uYW1lc3BhY2Uhc3ViZWxlbWVudCciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzldLCAiRW5kIG9mIE5TIGRlY2w6ICdteW5zJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTBdLCAiU3RhcnQgZWxlbWVudDogJ3N1YjInIHt9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxMV0sICdTdGFydCBvZiBDREFUQSBzZWN0aW9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxMl0sICJDaGFyYWN0ZXIgZGF0YTogJ2NvbnRlbnRzIG9mIENEQVRBIHNlY3Rpb24nIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxM10sICdFbmQgb2YgQ0RBVEEgc2VjdGlvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTRdLCAiRW5kIGVsZW1lbnQ6ICdzdWIyJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTVdLCAiRXh0ZXJuYWwgZW50aXR5IHJlZjogKE5vbmUsICdlbnRpdHkuZmlsZScsIE5vbmUpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxNl0sICJFbmQgZWxlbWVudDogJ3Jvb3QnIikKKworICAgIGRlZiB0ZXN0X3VuaWNvZGUoc2VsZik6CisgICAgICAgICMgVHJ5IHRoZSBwYXJzZSBhZ2FpbiwgdGhpcyB0aW1lIHByb2R1Y2luZyBVbmljb2RlIG91dHB1dAorICAgICAgICBvdXQgPSBzZWxmLk91dHB1dHRlcigpCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZShuYW1lc3BhY2Vfc2VwYXJhdG9yPSchJykKKyAgICAgICAgcGFyc2VyLnJldHVybnNfdW5pY29kZSA9IDEKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5oYW5kbGVyX25hbWVzOgorICAgICAgICAgICAgc2V0YXR0cihwYXJzZXIsIG5hbWUsIGdldGF0dHIob3V0LCBuYW1lKSkKKworICAgICAgICBwYXJzZXIuUGFyc2UoZGF0YSwgMSkKKworICAgICAgICBvcCA9IG91dC5vdXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFswXSwgJ1BJOiB1XCd4bWwtc3R5bGVzaGVldFwnIHVcJ2hyZWY9InN0eWxlc2hlZXQuY3NzIlwnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxXSwgIkNvbW1lbnQ6IHUnIGNvbW1lbnQgZGF0YSAnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsyXSwgIk5vdGF0aW9uIGRlY2xhcmVkOiAodSdub3RhdGlvbicsIE5vbmUsIHUnbm90YXRpb24uanBlZycsIE5vbmUpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFszXSwgIlVucGFyc2VkIGVudGl0eSBkZWNsOiAodSd1bnBhcnNlZF9lbnRpdHknLCBOb25lLCB1J2VudGl0eS5maWxlJywgTm9uZSwgdSdub3RhdGlvbicpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFs0XSwgIlN0YXJ0IGVsZW1lbnQ6IHUncm9vdCcge3UnYXR0cjEnOiB1J3ZhbHVlMScsIHUnYXR0cjInOiB1J3ZhbHVlMlxcdTFmNDAnfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbNV0sICJOUyBkZWNsOiB1J215bnMnIHUnaHR0cDovL3d3dy5weXRob24ub3JnL25hbWVzcGFjZSciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzZdLCAiU3RhcnQgZWxlbWVudDogdSdodHRwOi8vd3d3LnB5dGhvbi5vcmcvbmFtZXNwYWNlIXN1YmVsZW1lbnQnIHt9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFs3XSwgIkNoYXJhY3RlciBkYXRhOiB1J0NvbnRlbnRzIG9mIHN1YmVsZW1lbnRzJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbOF0sICJFbmQgZWxlbWVudDogdSdodHRwOi8vd3d3LnB5dGhvbi5vcmcvbmFtZXNwYWNlIXN1YmVsZW1lbnQnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFs5XSwgIkVuZCBvZiBOUyBkZWNsOiB1J215bnMnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxMF0sICJTdGFydCBlbGVtZW50OiB1J3N1YjInIHt9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxMV0sICdTdGFydCBvZiBDREFUQSBzZWN0aW9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxMl0sICJDaGFyYWN0ZXIgZGF0YTogdSdjb250ZW50cyBvZiBDREFUQSBzZWN0aW9uJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTNdLCAnRW5kIG9mIENEQVRBIHNlY3Rpb24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzE0XSwgIkVuZCBlbGVtZW50OiB1J3N1YjInIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxNV0sICJFeHRlcm5hbCBlbnRpdHkgcmVmOiAoTm9uZSwgdSdlbnRpdHkuZmlsZScsIE5vbmUpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxNl0sICJFbmQgZWxlbWVudDogdSdyb290JyIpCisKKyAgICBkZWYgdGVzdF9wYXJzZV9maWxlKHNlbGYpOgorICAgICAgICAjIFRyeSBwYXJzaW5nIGEgZmlsZQorICAgICAgICBvdXQgPSBzZWxmLk91dHB1dHRlcigpCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZShuYW1lc3BhY2Vfc2VwYXJhdG9yPSchJykKKyAgICAgICAgcGFyc2VyLnJldHVybnNfdW5pY29kZSA9IDEKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5oYW5kbGVyX25hbWVzOgorICAgICAgICAgICAgc2V0YXR0cihwYXJzZXIsIG5hbWUsIGdldGF0dHIob3V0LCBuYW1lKSkKKyAgICAgICAgZmlsZSA9IFN0cmluZ0lPLlN0cmluZ0lPKGRhdGEpCisKKyAgICAgICAgcGFyc2VyLlBhcnNlRmlsZShmaWxlKQorCisgICAgICAgIG9wID0gb3V0Lm91dAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzBdLCAnUEk6IHVcJ3htbC1zdHlsZXNoZWV0XCcgdVwnaHJlZj0ic3R5bGVzaGVldC5jc3MiXCcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzFdLCAiQ29tbWVudDogdScgY29tbWVudCBkYXRhICciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzJdLCAiTm90YXRpb24gZGVjbGFyZWQ6ICh1J25vdGF0aW9uJywgTm9uZSwgdSdub3RhdGlvbi5qcGVnJywgTm9uZSkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzNdLCAiVW5wYXJzZWQgZW50aXR5IGRlY2w6ICh1J3VucGFyc2VkX2VudGl0eScsIE5vbmUsIHUnZW50aXR5LmZpbGUnLCBOb25lLCB1J25vdGF0aW9uJykiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzRdLCAiU3RhcnQgZWxlbWVudDogdSdyb290JyB7dSdhdHRyMSc6IHUndmFsdWUxJywgdSdhdHRyMic6IHUndmFsdWUyXFx1MWY0MCd9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFs1XSwgIk5TIGRlY2w6IHUnbXlucycgdSdodHRwOi8vd3d3LnB5dGhvbi5vcmcvbmFtZXNwYWNlJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbNl0sICJTdGFydCBlbGVtZW50OiB1J2h0dHA6Ly93d3cucHl0aG9uLm9yZy9uYW1lc3BhY2Uhc3ViZWxlbWVudCcge30iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzddLCAiQ2hhcmFjdGVyIGRhdGE6IHUnQ29udGVudHMgb2Ygc3ViZWxlbWVudHMnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFs4XSwgIkVuZCBlbGVtZW50OiB1J2h0dHA6Ly93d3cucHl0aG9uLm9yZy9uYW1lc3BhY2Uhc3ViZWxlbWVudCciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzldLCAiRW5kIG9mIE5TIGRlY2w6IHUnbXlucyciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzEwXSwgIlN0YXJ0IGVsZW1lbnQ6IHUnc3ViMicge30iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzExXSwgJ1N0YXJ0IG9mIENEQVRBIHNlY3Rpb24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzEyXSwgIkNoYXJhY3RlciBkYXRhOiB1J2NvbnRlbnRzIG9mIENEQVRBIHNlY3Rpb24nIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxM10sICdFbmQgb2YgQ0RBVEEgc2VjdGlvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTRdLCAiRW5kIGVsZW1lbnQ6IHUnc3ViMiciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzE1XSwgIkV4dGVybmFsIGVudGl0eSByZWY6IChOb25lLCB1J2VudGl0eS5maWxlJywgTm9uZSkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzE2XSwgIkVuZCBlbGVtZW50OiB1J3Jvb3QnIikKKworICAgICAgICAjIElzc3VlIDQ4Nzc6IGV4cGF0LlBhcnNlRmlsZSBjYXVzZXMgc2VnZmF1bHQgb24gYSBjbG9zZWQgZmlsZS4KKyAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3YicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhcnNlci5QYXJzZUZpbGUoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKworY2xhc3MgTmFtZXNwYWNlU2VwYXJhdG9yVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbGVnYWwoc2VsZik6CisgICAgICAgICMgVGVzdHMgdGhhdCBtYWtlIHN1cmUgd2UgZ2V0IGVycm9ycyB3aGVuIHRoZSBuYW1lc3BhY2Vfc2VwYXJhdG9yIHZhbHVlCisgICAgICAgICMgaXMgaWxsZWdhbCwgYW5kIHRoYXQgd2UgZG9uJ3QgZm9yIGdvb2QgdmFsdWVzOgorICAgICAgICBleHBhdC5QYXJzZXJDcmVhdGUoKQorICAgICAgICBleHBhdC5QYXJzZXJDcmVhdGUobmFtZXNwYWNlX3NlcGFyYXRvcj1Ob25lKQorICAgICAgICBleHBhdC5QYXJzZXJDcmVhdGUobmFtZXNwYWNlX3NlcGFyYXRvcj0nICcpCisKKyAgICBkZWYgdGVzdF9pbGxlZ2FsKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBleHBhdC5QYXJzZXJDcmVhdGUobmFtZXNwYWNlX3NlcGFyYXRvcj00MikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwKKyAgICAgICAgICAgICAgICAnUGFyc2VyQ3JlYXRlKCkgYXJndW1lbnQgMiBtdXN0IGJlIHN0cmluZyBvciBOb25lLCBub3QgaW50JykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBleHBhdC5QYXJzZXJDcmVhdGUobmFtZXNwYWNlX3NlcGFyYXRvcj0ndG9vIGxvbmcnKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwKKyAgICAgICAgICAgICAgICAnbmFtZXNwYWNlX3NlcGFyYXRvciBtdXN0IGJlIGF0IG1vc3Qgb25lIGNoYXJhY3Rlciwgb21pdHRlZCwgb3IgTm9uZScpCisKKyAgICBkZWYgdGVzdF96ZXJvX2xlbmd0aChzZWxmKToKKyAgICAgICAgIyBQYXJzZXJDcmVhdGUoKSBuZWVkcyB0byBhY2NlcHQgYSBuYW1lc3BhY2Vfc2VwYXJhdG9yIG9mIHplcm8gbGVuZ3RoCisgICAgICAgICMgdG8gc2F0aXNmeSB0aGUgcmVxdWlyZW1lbnRzIG9mIFJERiBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgcmVxdWlyZWQKKyAgICAgICAgIyB0byBzaW1wbHkgZ2x1ZSB0b2dldGhlciB0aGUgbmFtZXNwYWNlIFVSSSBhbmQgdGhlIGxvY2FsbmFtZS4gIFRob3VnaAorICAgICAgICAjIGNvbnNpZGVyZWQgYSB3YXJ0IG9mIHRoZSBSREYgc3BlY2lmaWNhdGlvbnMsIGl0IG5lZWRzIHRvIGJlIHN1cHBvcnRlZC4KKyAgICAgICAgIworICAgICAgICAjIFNlZSBYTUwtU0lHIG1haWxpbmcgbGlzdCB0aHJlYWQgc3RhcnRpbmcgd2l0aAorICAgICAgICAjIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3htbC1zaWcvMjAwMS1BcHJpbC8wMDUyMDIuaHRtbAorICAgICAgICAjCisgICAgICAgIGV4cGF0LlBhcnNlckNyZWF0ZShuYW1lc3BhY2Vfc2VwYXJhdG9yPScnKSAjIHRvbyBzaG9ydAorCisKK2NsYXNzIEludGVybmluZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhlIGludGVybmluZyBtYWNoaW5lcnkuCisgICAgICAgIHAgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQorICAgICAgICBMID0gW10KKyAgICAgICAgZGVmIGNvbGxlY3RvcihuYW1lLCAqYXJncyk6CisgICAgICAgICAgICBMLmFwcGVuZChuYW1lKQorICAgICAgICBwLlN0YXJ0RWxlbWVudEhhbmRsZXIgPSBjb2xsZWN0b3IKKyAgICAgICAgcC5FbmRFbGVtZW50SGFuZGxlciA9IGNvbGxlY3RvcgorICAgICAgICBwLlBhcnNlKCI8ZT4gPGUvPiA8ZT48L2U+IDwvZT4iLCAxKQorICAgICAgICB0YWcgPSBMWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEwpLCA2KQorICAgICAgICBmb3IgZW50cnkgaW4gTDoKKyAgICAgICAgICAgICMgTCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBzdHJpbmcgcmVwZWF0ZWQgb3ZlciBhbmQgb3Zlci4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YWcgaXMgZW50cnkpCisKKworY2xhc3MgQnVmZmVyVGV4dFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zdHVmZiA9IFtdCisgICAgICAgIHNlbGYucGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgc2VsZi5wYXJzZXIuYnVmZmVyX3RleHQgPSAxCisgICAgICAgIHNlbGYucGFyc2VyLkNoYXJhY3RlckRhdGFIYW5kbGVyID0gc2VsZi5DaGFyYWN0ZXJEYXRhSGFuZGxlcgorCisgICAgZGVmIGNoZWNrKHNlbGYsIGV4cGVjdGVkLCBsYWJlbCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdHVmZiwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgIiVzXG5zdHVmZiAgICA9ICVyXG5leHBlY3RlZCA9ICVyIgorICAgICAgICAgICAgICAgICUgKGxhYmVsLCBzZWxmLnN0dWZmLCBtYXAodW5pY29kZSwgZXhwZWN0ZWQpKSkKKworICAgIGRlZiBDaGFyYWN0ZXJEYXRhSGFuZGxlcihzZWxmLCB0ZXh0KToKKyAgICAgICAgc2VsZi5zdHVmZi5hcHBlbmQodGV4dCkKKworICAgIGRlZiBTdGFydEVsZW1lbnRIYW5kbGVyKHNlbGYsIG5hbWUsIGF0dHJzKToKKyAgICAgICAgc2VsZi5zdHVmZi5hcHBlbmQoIjwlcz4iICUgbmFtZSkKKyAgICAgICAgYnQgPSBhdHRycy5nZXQoImJ1ZmZlci10ZXh0IikKKyAgICAgICAgaWYgYnQgPT0gInllcyI6CisgICAgICAgICAgICBzZWxmLnBhcnNlci5idWZmZXJfdGV4dCA9IDEKKyAgICAgICAgZWxpZiBidCA9PSAibm8iOgorICAgICAgICAgICAgc2VsZi5wYXJzZXIuYnVmZmVyX3RleHQgPSAwCisKKyAgICBkZWYgRW5kRWxlbWVudEhhbmRsZXIoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuc3R1ZmYuYXBwZW5kKCI8LyVzPiIgJSBuYW1lKQorCisgICAgZGVmIENvbW1lbnRIYW5kbGVyKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnN0dWZmLmFwcGVuZCgiPCEtLSVzLS0+IiAlIGRhdGEpCisKKyAgICBkZWYgc2V0SGFuZGxlcnMoc2VsZiwgaGFuZGxlcnM9W10pOgorICAgICAgICBmb3IgbmFtZSBpbiBoYW5kbGVyczoKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZi5wYXJzZXIsIG5hbWUsIGdldGF0dHIoc2VsZiwgbmFtZSkpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3RvX2Rpc2FibGVkKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBhcnNlci5idWZmZXJfdGV4dCkKKworICAgIGRlZiB0ZXN0X2J1ZmZlcmluZ19lbmFibGVkKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBidWZmZXJpbmcgaXMgdHVybmVkIG9uCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5idWZmZXJfdGV4dCkKKyAgICAgICAgc2VsZi5wYXJzZXIuUGFyc2UoIjxhPjE8Yi8+MjxjLz4zPC9hPiIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdHVmZiwgWycxMjMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyZWQgdGV4dCBub3QgcHJvcGVybHkgY29sbGFwc2VkIikKKworICAgIGRlZiB0ZXN0MShzZWxmKToKKyAgICAgICAgIyBYWFggVGhpcyB0ZXN0IGV4cG9zZXMgbW9yZSBkZXRhaWwgb2YgRXhwYXQncyB0ZXh0IGNodW5raW5nIHRoYW4gd2UKKyAgICAgICAgIyBYWFggbGlrZSwgYnV0IGl0IHRlc3RzIHdoYXQgd2UgbmVlZCB0byBjb25jaXNlbHkuCisgICAgICAgIHNlbGYuc2V0SGFuZGxlcnMoWyJTdGFydEVsZW1lbnRIYW5kbGVyIl0pCisgICAgICAgIHNlbGYucGFyc2VyLlBhcnNlKCI8YT4xPGIgYnVmZmVyLXRleHQ9J25vJy8+MlxuMzxjIGJ1ZmZlci10ZXh0PSd5ZXMnLz40XG41PC9hPiIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdHVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbIjxhPiIsICIxIiwgIjxiPiIsICIyIiwgIlxuIiwgIjMiLCAiPGM+IiwgIjRcbjUiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyaW5nIGNvbnRyb2wgbm90IHJlYWN0aW5nIGFzIGV4cGVjdGVkIikKKworICAgIGRlZiB0ZXN0MihzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuUGFyc2UoIjxhPjE8Yi8+Jmx0OzImZ3Q7PGMvPiYjMzI7XG4mI3gyMDszPC9hPiIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdHVmZiwgWyIxPDI+IFxuIDMiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyZWQgdGV4dCBub3QgcHJvcGVybHkgY29sbGFwc2VkIikKKworICAgIGRlZiB0ZXN0MyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXRIYW5kbGVycyhbIlN0YXJ0RWxlbWVudEhhbmRsZXIiXSkKKyAgICAgICAgc2VsZi5wYXJzZXIuUGFyc2UoIjxhPjE8Yi8+MjxjLz4zPC9hPiIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdHVmZiwgWyI8YT4iLCAiMSIsICI8Yj4iLCAiMiIsICI8Yz4iLCAiMyJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyZWQgdGV4dCBub3QgcHJvcGVybHkgc3BsaXQiKQorCisgICAgZGVmIHRlc3Q0KHNlbGYpOgorICAgICAgICBzZWxmLnNldEhhbmRsZXJzKFsiU3RhcnRFbGVtZW50SGFuZGxlciIsICJFbmRFbGVtZW50SGFuZGxlciJdKQorICAgICAgICBzZWxmLnBhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJzZXIuUGFyc2UoIjxhPjE8Yi8+MjxjLz4zPC9hPiIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdHVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbIjxhPiIsICI8Yj4iLCAiPC9iPiIsICI8Yz4iLCAiPC9jPiIsICI8L2E+Il0pCisKKyAgICBkZWYgdGVzdDUoc2VsZik6CisgICAgICAgIHNlbGYuc2V0SGFuZGxlcnMoWyJTdGFydEVsZW1lbnRIYW5kbGVyIiwgIkVuZEVsZW1lbnRIYW5kbGVyIl0pCisgICAgICAgIHNlbGYucGFyc2VyLlBhcnNlKCI8YT4xPGI+PC9iPjI8Yy8+MzwvYT4iLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3R1ZmYsCisgICAgICAgICAgICBbIjxhPiIsICIxIiwgIjxiPiIsICI8L2I+IiwgIjIiLCAiPGM+IiwgIjwvYz4iLCAiMyIsICI8L2E+Il0pCisKKyAgICBkZWYgdGVzdDYoc2VsZik6CisgICAgICAgIHNlbGYuc2V0SGFuZGxlcnMoWyJDb21tZW50SGFuZGxlciIsICJFbmRFbGVtZW50SGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICJTdGFydEVsZW1lbnRIYW5kbGVyIl0pCisgICAgICAgIHNlbGYucGFyc2VyLlBhcnNlKCI8YT4xPGIvPjI8Yz48L2M+MzQ1PC9hPiAiLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3R1ZmYsCisgICAgICAgICAgICBbIjxhPiIsICIxIiwgIjxiPiIsICI8L2I+IiwgIjIiLCAiPGM+IiwgIjwvYz4iLCAiMzQ1IiwgIjwvYT4iXSwKKyAgICAgICAgICAgICJidWZmZXJlZCB0ZXh0IG5vdCBwcm9wZXJseSBzcGxpdCIpCisKKyAgICBkZWYgdGVzdDcoc2VsZik6CisgICAgICAgIHNlbGYuc2V0SGFuZGxlcnMoWyJDb21tZW50SGFuZGxlciIsICJFbmRFbGVtZW50SGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICJTdGFydEVsZW1lbnRIYW5kbGVyIl0pCisgICAgICAgIHNlbGYucGFyc2VyLlBhcnNlKCI8YT4xPGIvPjI8Yz48L2M+MzwhLS1hYmMtLT40PCEtLWRlZi0tPjU8L2E+ICIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdHVmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbIjxhPiIsICIxIiwgIjxiPiIsICI8L2I+IiwgIjIiLCAiPGM+IiwgIjwvYz4iLCAiMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICI8IS0tYWJjLS0+IiwgIjQiLCAiPCEtLWRlZi0tPiIsICI1IiwgIjwvYT4iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyZWQgdGV4dCBub3QgcHJvcGVybHkgc3BsaXQiKQorCisKKyMgVGVzdCBoYW5kbGluZyBvZiBleGNlcHRpb24gZnJvbSBjYWxsYmFjazoKK2NsYXNzIEhhbmRsZXJFeGNlcHRpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgU3RhcnRFbGVtZW50SGFuZGxlcihzZWxmLCBuYW1lLCBhdHRycyk6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcihuYW1lKQorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHBhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyID0gc2VsZi5TdGFydEVsZW1lbnRIYW5kbGVyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlci5QYXJzZSgiPGE+PGI+PGMvPjwvYj48L2E+IiwgMSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgJ2EnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgUnVudGltZUVycm9yIGZvciBlbGVtZW50ICdhJywgYnV0IiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3VuZCAlciIgJSBlLmFyZ3NbMF0pCisKKworIyBUZXN0IEN1cnJlbnQqIG1lbWJlcnM6CitjbGFzcyBQb3NpdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBTdGFydEVsZW1lbnRIYW5kbGVyKHNlbGYsIG5hbWUsIGF0dHJzKToKKyAgICAgICAgc2VsZi5jaGVja19wb3MoJ3MnKQorCisgICAgZGVmIEVuZEVsZW1lbnRIYW5kbGVyKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLmNoZWNrX3BvcygnZScpCisKKyAgICBkZWYgY2hlY2tfcG9zKHNlbGYsIGV2ZW50KToKKyAgICAgICAgcG9zID0gKGV2ZW50LAorICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuQ3VycmVudEJ5dGVJbmRleCwKKyAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLkN1cnJlbnRMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuQ3VycmVudENvbHVtbk51bWJlcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudXB0byA8IGxlbihzZWxmLmV4cGVjdGVkX2xpc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3RvbyBtYW55IHBhcnNlciBldmVudHMnKQorICAgICAgICBleHBlY3RlZCA9IHNlbGYuZXhwZWN0ZWRfbGlzdFtzZWxmLnVwdG9dCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAnRXhwZWN0ZWQgcG9zaXRpb24gJXMsIGdvdCBwb3NpdGlvbiAlcycgJShwb3MsIGV4cGVjdGVkKSkKKyAgICAgICAgc2VsZi51cHRvICs9IDEKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHNlbGYucGFyc2VyLlN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzZWxmLlN0YXJ0RWxlbWVudEhhbmRsZXIKKyAgICAgICAgc2VsZi5wYXJzZXIuRW5kRWxlbWVudEhhbmRsZXIgPSBzZWxmLkVuZEVsZW1lbnRIYW5kbGVyCisgICAgICAgIHNlbGYudXB0byA9IDAKKyAgICAgICAgc2VsZi5leHBlY3RlZF9saXN0ID0gWygncycsIDAsIDEsIDApLCAoJ3MnLCA1LCAyLCAxKSwgKCdzJywgMTEsIDMsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdlJywgMTUsIDMsIDYpLCAoJ2UnLCAxNywgNCwgMSksICgnZScsIDIyLCA1LCAwKV0KKworICAgICAgICB4bWwgPSAnPGE+XG4gPGI+XG4gIDxjLz5cbiA8L2I+XG48L2E+JworICAgICAgICBzZWxmLnBhcnNlci5QYXJzZSh4bWwsIDEpCisKKworY2xhc3Mgc2YxMjk2NDMzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcGFyc2Vfb25seV94bWxfZGF0YShzZWxmKToKKyAgICAgICAgIyBodHRwOi8vcHl0aG9uLm9yZy9zZi8xMjk2NDMzCisgICAgICAgICMKKyAgICAgICAgeG1sID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzbzg4NTknPz48cz4lczwvcz4iICUgKCdhJyAqIDEwMjUpCisgICAgICAgICMgdGhpcyBvbmUgZG9lc24ndCBjcmFzaAorICAgICAgICAjeG1sID0gIjw/eG1sIHZlcnNpb249JzEuMCc/PjxzPiVzPC9zPiIgJSAoJ2EnICogMTAwMDApCisKKyAgICAgICAgY2xhc3MgU3BlY2lmaWNFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgaGFuZGxlcih0ZXh0KToKKyAgICAgICAgICAgIHJhaXNlIFNwZWNpZmljRXhjZXB0aW9uCisKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgcGFyc2VyLkNoYXJhY3RlckRhdGFIYW5kbGVyID0gaGFuZGxlcgorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgcGFyc2VyLlBhcnNlLCB4bWwpCisKK2NsYXNzIENoYXJkYXRhQnVmZmVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiCisgICAgdGVzdCBzZXR0aW5nIG9mIGNoYXJkYXRhIGJ1ZmZlciBzaXplCisgICAgIiIiCisKKyAgICBkZWYgdGVzdF8xMDI1X2J5dGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc21hbGxfYnVmZmVyX3Rlc3QoMTAyNSksIDIpCisKKyAgICBkZWYgdGVzdF8xMDAwX2J5dGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc21hbGxfYnVmZmVyX3Rlc3QoMTAwMCksIDEpCisKKyAgICBkZWYgdGVzdF93cm9uZ19zaXplKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQorICAgICAgICBwYXJzZXIuYnVmZmVyX3RleHQgPSAxCisgICAgICAgIGRlZiBmKHNpemUpOgorICAgICAgICAgICAgcGFyc2VyLmJ1ZmZlcl9zaXplID0gc2l6ZQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgc3lzLm1heGludCsxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZiwgMCkKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF9zaXplKHNlbGYpOgorICAgICAgICB4bWwxID0gKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc284ODU5Jz8+PHM+JXMiICUgKCdhJyAqIDUxMikpCisgICAgICAgIHhtbDIgPSAnYScqNTEyICsgJzwvcz4nCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHBhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IHNlbGYuY291bnRpbmdfaGFuZGxlcgorICAgICAgICBwYXJzZXIuYnVmZmVyX3NpemUgPSA1MTIKKyAgICAgICAgcGFyc2VyLmJ1ZmZlcl90ZXh0ID0gMQorCisgICAgICAgICMgRmVlZCA1MTIgYnl0ZXMgb2YgY2hhcmFjdGVyIGRhdGE6IHRoZSBoYW5kbGVyIHNob3VsZCBiZSBjYWxsZWQKKyAgICAgICAgIyBvbmNlLgorICAgICAgICBzZWxmLm4gPSAwCisgICAgICAgIHBhcnNlci5QYXJzZSh4bWwxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubiwgMSkKKworICAgICAgICAjIFJlYXNzaWduIHRvIGJ1ZmZlcl9zaXplLCBidXQgYXNzaWduIHRoZSBzYW1lIHNpemUuCisgICAgICAgIHBhcnNlci5idWZmZXJfc2l6ZSA9IHBhcnNlci5idWZmZXJfc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubiwgMSkKKworICAgICAgICAjIFRyeSBwYXJzaW5nIHJlc3Qgb2YgdGhlIGRvY3VtZW50CisgICAgICAgIHBhcnNlci5QYXJzZSh4bWwyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubiwgMikKKworCisgICAgZGVmIHRlc3RfZGlzYWJsaW5nX2J1ZmZlcihzZWxmKToKKyAgICAgICAgeG1sMSA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc284ODU5Jz8+PGE+JXMiICUgKCdhJyAqIDUxMikKKyAgICAgICAgeG1sMiA9ICgnYicgKiAxMDI0KQorICAgICAgICB4bWwzID0gIiVzPC9hPiIgJSAoJ2MnICogMTAyNCkKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgcGFyc2VyLkNoYXJhY3RlckRhdGFIYW5kbGVyID0gc2VsZi5jb3VudGluZ19oYW5kbGVyCisgICAgICAgIHBhcnNlci5idWZmZXJfdGV4dCA9IDEKKyAgICAgICAgcGFyc2VyLmJ1ZmZlcl9zaXplID0gMTAyNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5idWZmZXJfc2l6ZSwgMTAyNCkKKworICAgICAgICAjIFBhcnNlIG9uZSBjaHVuayBvZiBYTUwKKyAgICAgICAgc2VsZi5uID0gMAorICAgICAgICBwYXJzZXIuUGFyc2UoeG1sMSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuYnVmZmVyX3NpemUsIDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uLCAxKQorCisgICAgICAgICMgVHVybiBvZmYgYnVmZmVyaW5nIGFuZCBwYXJzZSB0aGUgbmV4dCBjaHVuay4KKyAgICAgICAgcGFyc2VyLmJ1ZmZlcl90ZXh0ID0gMAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBhcnNlci5idWZmZXJfdGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuYnVmZmVyX3NpemUsIDEwMjQpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIHBhcnNlci5QYXJzZSh4bWwyLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubiwgMTEpCisKKyAgICAgICAgcGFyc2VyLmJ1ZmZlcl90ZXh0ID0gMQorICAgICAgICBzZWxmLmFzc2VydFRydWUocGFyc2VyLmJ1ZmZlcl90ZXh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5idWZmZXJfc2l6ZSwgMTAyNCkKKyAgICAgICAgcGFyc2VyLlBhcnNlKHhtbDMsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uLCAxMikKKworCisKKyAgICBkZWYgbWFrZV9kb2N1bWVudChzZWxmLCBieXRlcyk6CisgICAgICAgIHJldHVybiAoIjw/eG1sIHZlcnNpb249JzEuMCc/Pjx0YWc+IiArIGJ5dGVzICogJ2EnICsgJzwvdGFnPicpCisKKyAgICBkZWYgY291bnRpbmdfaGFuZGxlcihzZWxmLCB0ZXh0KToKKyAgICAgICAgc2VsZi5uICs9IDEKKworICAgIGRlZiBzbWFsbF9idWZmZXJfdGVzdChzZWxmLCBidWZmZXJfbGVuKToKKyAgICAgICAgeG1sID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzbzg4NTknPz48cz4lczwvcz4iICUgKCdhJyAqIGJ1ZmZlcl9sZW4pCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHBhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IHNlbGYuY291bnRpbmdfaGFuZGxlcgorICAgICAgICBwYXJzZXIuYnVmZmVyX3NpemUgPSAxMDI0CisgICAgICAgIHBhcnNlci5idWZmZXJfdGV4dCA9IDEKKworICAgICAgICBzZWxmLm4gPSAwCisgICAgICAgIHBhcnNlci5QYXJzZSh4bWwpCisgICAgICAgIHJldHVybiBzZWxmLm4KKworICAgIGRlZiB0ZXN0X2NoYW5nZV9zaXplXzEoc2VsZik6CisgICAgICAgIHhtbDEgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvODg1OSc/PjxhPjxzPiVzIiAlICgnYScgKiAxMDI0KQorICAgICAgICB4bWwyID0gImFhYTwvcz48cz4lczwvcz48L2E+IiAlICgnYScgKiAxMDI1KQorICAgICAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQorICAgICAgICBwYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBzZWxmLmNvdW50aW5nX2hhbmRsZXIKKyAgICAgICAgcGFyc2VyLmJ1ZmZlcl90ZXh0ID0gMQorICAgICAgICBwYXJzZXIuYnVmZmVyX3NpemUgPSAxMDI0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmJ1ZmZlcl9zaXplLCAxMDI0KQorCisgICAgICAgIHNlbGYubiA9IDAKKyAgICAgICAgcGFyc2VyLlBhcnNlKHhtbDEsIDApCisgICAgICAgIHBhcnNlci5idWZmZXJfc2l6ZSAqPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmJ1ZmZlcl9zaXplLCAyMDQ4KQorICAgICAgICBwYXJzZXIuUGFyc2UoeG1sMiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm4sIDIpCisKKyAgICBkZWYgdGVzdF9jaGFuZ2Vfc2l6ZV8yKHNlbGYpOgorICAgICAgICB4bWwxID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzbzg4NTknPz48YT5hPHM+JXMiICUgKCdhJyAqIDEwMjMpCisgICAgICAgIHhtbDIgPSAiYWFhPC9zPjxzPiVzPC9zPjwvYT4iICUgKCdhJyAqIDEwMjUpCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHBhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IHNlbGYuY291bnRpbmdfaGFuZGxlcgorICAgICAgICBwYXJzZXIuYnVmZmVyX3RleHQgPSAxCisgICAgICAgIHBhcnNlci5idWZmZXJfc2l6ZSA9IDIwNDgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuYnVmZmVyX3NpemUsIDIwNDgpCisKKyAgICAgICAgc2VsZi5uPTAKKyAgICAgICAgcGFyc2VyLlBhcnNlKHhtbDEsIDApCisgICAgICAgIHBhcnNlci5idWZmZXJfc2l6ZSAvLz0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5idWZmZXJfc2l6ZSwgMTAyNCkKKyAgICAgICAgcGFyc2VyLlBhcnNlKHhtbDIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uLCA0KQorCitjbGFzcyBNYWxmb3JtZWRJbnB1dFRleHQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0MShzZWxmKToKKyAgICAgICAgeG1sID0gIlwwXHJcbiIKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFyc2VyLlBhcnNlKHhtbCwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCisgICAgICAgIGV4Y2VwdCBleHBhdC5FeHBhdEVycm9yIGFzIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgJ3VuY2xvc2VkIHRva2VuOiBsaW5lIDIsIGNvbHVtbiAwJykKKworICAgIGRlZiB0ZXN0MihzZWxmKToKKyAgICAgICAgeG1sID0gIjw/eG1sIHZlcnNpb25ceGMyXHg4NT0nMS4wJz8+XHJcbiIKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFyc2VyLlBhcnNlKHhtbCwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCisgICAgICAgIGV4Y2VwdCBleHBhdC5FeHBhdEVycm9yIGFzIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgJ1hNTCBkZWNsYXJhdGlvbiBub3Qgd2VsbC1mb3JtZWQ6IGxpbmUgMSwgY29sdW1uIDE0JykKKworY2xhc3MgRm9yZWlnbkRURFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0cyBmb3IgdGhlIFVzZUZvcmVpZ25EVEQgbWV0aG9kIG9mIGV4cGF0IHBhcnNlciBvYmplY3RzLgorICAgICIiIgorICAgIGRlZiB0ZXN0X3VzZV9mb3JlaWduX2R0ZChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIElmIFVzZUZvcmVpZ25EVEQgaXMgcGFzc2VkIFRydWUgYW5kIGEgZG9jdW1lbnQgd2l0aG91dCBhbiBleHRlcm5hbAorICAgICAgICBlbnRpdHkgcmVmZXJlbmNlIGlzIHBhcnNlZCwgRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIGlzIGZpcnN0IGNhbGxlZAorICAgICAgICB3aXRoIE5vbmUgZm9yIHRoZSBwdWJsaWMgYW5kIHN5c3RlbSBpZHMuCisgICAgICAgICIiIgorICAgICAgICBoYW5kbGVyX2NhbGxfYXJncyA9IFtdCisgICAgICAgIGRlZiByZXNvbHZlX2VudGl0eShjb250ZXh0LCBiYXNlLCBzeXN0ZW1faWQsIHB1YmxpY19pZCk6CisgICAgICAgICAgICBoYW5kbGVyX2NhbGxfYXJncy5hcHBlbmQoKHB1YmxpY19pZCwgc3lzdGVtX2lkKSkKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgcGFyc2VyLlVzZUZvcmVpZ25EVEQoVHJ1ZSkKKyAgICAgICAgcGFyc2VyLlNldFBhcmFtRW50aXR5UGFyc2luZyhleHBhdC5YTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfQUxXQVlTKQorICAgICAgICBwYXJzZXIuRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyID0gcmVzb2x2ZV9lbnRpdHkKKyAgICAgICAgcGFyc2VyLlBhcnNlKCI8P3htbCB2ZXJzaW9uPScxLjAnPz48ZWxlbWVudC8+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW5kbGVyX2NhbGxfYXJncywgWyhOb25lLCBOb25lKV0pCisKKyAgICAgICAgIyB0ZXN0IFVzZUZvcmVpZ25EVEQoKSBpcyBlcXVhbCB0byBVc2VGb3JlaWduRFREKFRydWUpCisgICAgICAgIGhhbmRsZXJfY2FsbF9hcmdzWzpdID0gW10KKworICAgICAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQorICAgICAgICBwYXJzZXIuVXNlRm9yZWlnbkRURCgpCisgICAgICAgIHBhcnNlci5TZXRQYXJhbUVudGl0eVBhcnNpbmcoZXhwYXQuWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUykKKyAgICAgICAgcGFyc2VyLkV4dGVybmFsRW50aXR5UmVmSGFuZGxlciA9IHJlc29sdmVfZW50aXR5CisgICAgICAgIHBhcnNlci5QYXJzZSgiPD94bWwgdmVyc2lvbj0nMS4wJz8+PGVsZW1lbnQvPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFuZGxlcl9jYWxsX2FyZ3MsIFsoTm9uZSwgTm9uZSldKQorCisgICAgZGVmIHRlc3RfaWdub3JlX3VzZV9mb3JlaWduX2R0ZChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIElmIFVzZUZvcmVpZ25EVEQgaXMgcGFzc2VkIFRydWUgYW5kIGEgZG9jdW1lbnQgd2l0aCBhbiBleHRlcm5hbAorICAgICAgICBlbnRpdHkgcmVmZXJlbmNlIGlzIHBhcnNlZCwgRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIGlzIGNhbGxlZCB3aXRoCisgICAgICAgIHRoZSBwdWJsaWMgYW5kIHN5c3RlbSBpZHMgZnJvbSB0aGUgZG9jdW1lbnQuCisgICAgICAgICIiIgorICAgICAgICBoYW5kbGVyX2NhbGxfYXJncyA9IFtdCisgICAgICAgIGRlZiByZXNvbHZlX2VudGl0eShjb250ZXh0LCBiYXNlLCBzeXN0ZW1faWQsIHB1YmxpY19pZCk6CisgICAgICAgICAgICBoYW5kbGVyX2NhbGxfYXJncy5hcHBlbmQoKHB1YmxpY19pZCwgc3lzdGVtX2lkKSkKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgcGFyc2VyLlVzZUZvcmVpZ25EVEQoVHJ1ZSkKKyAgICAgICAgcGFyc2VyLlNldFBhcmFtRW50aXR5UGFyc2luZyhleHBhdC5YTUxfUEFSQU1fRU5USVRZX1BBUlNJTkdfQUxXQVlTKQorICAgICAgICBwYXJzZXIuRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyID0gcmVzb2x2ZV9lbnRpdHkKKyAgICAgICAgcGFyc2VyLlBhcnNlKAorICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCc/PjwhRE9DVFlQRSBmb28gUFVCTElDICdiYXInICdiYXonPjxlbGVtZW50Lz4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhbmRsZXJfY2FsbF9hcmdzLCBbKCJiYXIiLCAiYmF6IildKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoU2V0QXR0cmlidXRlVGVzdCwKKyAgICAgICAgICAgICAgICAgUGFyc2VUZXN0LAorICAgICAgICAgICAgICAgICBOYW1lc3BhY2VTZXBhcmF0b3JUZXN0LAorICAgICAgICAgICAgICAgICBJbnRlcm5pbmdUZXN0LAorICAgICAgICAgICAgICAgICBCdWZmZXJUZXh0VGVzdCwKKyAgICAgICAgICAgICAgICAgSGFuZGxlckV4Y2VwdGlvblRlc3QsCisgICAgICAgICAgICAgICAgIFBvc2l0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgc2YxMjk2NDMzVGVzdCwKKyAgICAgICAgICAgICAgICAgQ2hhcmRhdGFCdWZmZXJUZXN0LAorICAgICAgICAgICAgICAgICBNYWxmb3JtZWRJbnB1dFRleHQsCisgICAgICAgICAgICAgICAgIEZvcmVpZ25EVERUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlleHBhdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWV4cGF0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjYwZTViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlleHBhdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlleHBhdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWV4cGF0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjYwZTViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlleHBhdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcXVldWUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdWV1ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGE0YWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcXVldWUucHkKQEAgLTAsMCArMSwzMjUgQEAKKyMgU29tZSBzaW1wbGUgcXVldWUgbW9kdWxlIHRlc3RzLCBwbHVzIHNvbWUgZmFpbHVyZSBjb25kaXRpb25zCisjIHRvIGVuc3VyZSB0aGUgUXVldWUgbG9ja3MgcmVtYWluIHN0YWJsZS4KK2ltcG9ydCBRdWV1ZQoraW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK3RocmVhZGluZyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQorCitRVUVVRV9TSVpFID0gNQorCisjIEEgdGhyZWFkIHRvIHJ1biBhIGZ1bmN0aW9uIHRoYXQgdW5jbG9ncyBhIGJsb2NrZWQgUXVldWUuCitjbGFzcyBfVHJpZ2dlclRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZm4sIGFyZ3MpOgorICAgICAgICBzZWxmLmZuID0gZm4KKyAgICAgICAgc2VsZi5hcmdzID0gYXJncworICAgICAgICBzZWxmLnN0YXJ0ZWRFdmVudCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICMgVGhlIHNsZWVwIGlzbid0IG5lY2Vzc2FyeSwgYnV0IGlzIGludGVuZGVkIHRvIGdpdmUgdGhlIGJsb2NraW5nCisgICAgICAgICMgZnVuY3Rpb24gaW4gdGhlIG1haW4gdGhyZWFkIGEgY2hhbmNlIGF0IGFjdHVhbGx5IGJsb2NraW5nIGJlZm9yZQorICAgICAgICAjIHdlIHVuY2xvZyBpdC4gIEJ1dCBpZiB0aGUgc2xlZXAgaXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWVvdXQtYmFzZWQKKyAgICAgICAgIyB0ZXN0cyB3YWl0IGluIHRoZWlyIGJsb2NraW5nIGZ1bmN0aW9ucywgdGhvc2UgdGVzdHMgd2lsbCBmYWlsLgorICAgICAgICAjIFNvIHdlIGdpdmUgdGhlbSBtdWNoIGxvbmdlciB0aW1lb3V0IHZhbHVlcyBjb21wYXJlZCB0byB0aGUKKyAgICAgICAgIyBzbGVlcCBoZXJlIChJIGFpbWVkIGF0IDEwIHNlY29uZHMgZm9yIGJsb2NraW5nIGZ1bmN0aW9ucyAtLQorICAgICAgICAjIHRoZXkgc2hvdWxkIG5ldmVyIGFjdHVhbGx5IHdhaXQgdGhhdCBsb25nIC0gdGhleSBzaG91bGQgbWFrZQorICAgICAgICAjIHByb2dyZXNzIGFzIHNvb24gYXMgd2UgY2FsbCBzZWxmLmZuKCkpLgorICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAgICAgc2VsZi5zdGFydGVkRXZlbnQuc2V0KCkKKyAgICAgICAgc2VsZi5mbigqc2VsZi5hcmdzKQorCisKKyMgRXhlY3V0ZSBhIGZ1bmN0aW9uIHRoYXQgYmxvY2tzLCBhbmQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQsIGEgZnVuY3Rpb24gdGhhdAorIyB0cmlnZ2VycyB0aGUgcmVsZWFzZS4gIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgYmxvY2tpbmcgZnVuY3Rpb24uICBDYXV0aW9uOgorIyBibG9ja19mdW5jIG11c3QgZ3VhcmFudGVlIHRvIGJsb2NrIHVudGlsIHRyaWdnZXJfZnVuYyBpcyBjYWxsZWQsIGFuZAorIyB0cmlnZ2VyX2Z1bmMgbXVzdCBndWFyYW50ZWUgdG8gY2hhbmdlIHF1ZXVlIHN0YXRlIHNvIHRoYXQgYmxvY2tfZnVuYyBjYW4gbWFrZQorIyBlbm91Z2ggcHJvZ3Jlc3MgdG8gcmV0dXJuLiAgSW4gcGFydGljdWxhciwgYSBibG9ja19mdW5jIHRoYXQganVzdCByYWlzZXMgYW4KKyMgZXhjZXB0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0cmlnZ2VyX2Z1bmMgaXMgY2FsbGVkIHdpbGwgbGVhZCB0bworIyB0aW1pbmctZGVwZW5kZW50IHNwb3JhZGljIGZhaWx1cmVzLCBhbmQgb25lIG9mIHRob3NlIHdlbnQgcmFyZWx5IHNlZW4gYnV0CisjIHVuZGlhZ25vc2VkIGZvciB5ZWFycy4gIE5vdyBibG9ja19mdW5jIG11c3QgYmUgdW5leGNlcHRpb25hbC4gIElmIGJsb2NrX2Z1bmMKKyMgaXMgc3VwcG9zZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uLCBjYWxsIGRvX2V4Y2VwdGlvbmFsX2Jsb2NraW5nX3Rlc3QoKQorIyBpbnN0ZWFkLgorCitjbGFzcyBCbG9ja2luZ1Rlc3RNaXhpbjoKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50ID0gTm9uZQorCisgICAgZGVmIGRvX2Jsb2NraW5nX3Rlc3Qoc2VsZiwgYmxvY2tfZnVuYywgYmxvY2tfYXJncywgdHJpZ2dlcl9mdW5jLCB0cmlnZ2VyX2FyZ3MpOgorICAgICAgICBzZWxmLnQgPSBfVHJpZ2dlclRocmVhZCh0cmlnZ2VyX2Z1bmMsIHRyaWdnZXJfYXJncykKKyAgICAgICAgc2VsZi50LnN0YXJ0KCkKKyAgICAgICAgc2VsZi5yZXN1bHQgPSBibG9ja19mdW5jKCpibG9ja19hcmdzKQorICAgICAgICAjIElmIGJsb2NrX2Z1bmMgcmV0dXJuZWQgYmVmb3JlIG91ciB0aHJlYWQgbWFkZSB0aGUgY2FsbCwgd2UgZmFpbGVkIQorICAgICAgICBpZiBub3Qgc2VsZi50LnN0YXJ0ZWRFdmVudC5pc19zZXQoKToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiYmxvY2tpbmcgZnVuY3Rpb24gJyVyJyBhcHBlYXJlZCBub3QgdG8gYmxvY2siICUKKyAgICAgICAgICAgICAgICAgICAgICBibG9ja19mdW5jKQorICAgICAgICBzZWxmLnQuam9pbigxMCkgIyBtYWtlIHN1cmUgdGhlIHRocmVhZCB0ZXJtaW5hdGVzCisgICAgICAgIGlmIHNlbGYudC5pc19hbGl2ZSgpOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ0cmlnZ2VyIGZ1bmN0aW9uICclcicgYXBwZWFyZWQgdG8gbm90IHJldHVybiIgJQorICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJfZnVuYykKKyAgICAgICAgcmV0dXJuIHNlbGYucmVzdWx0CisKKyAgICAjIENhbGwgdGhpcyBpbnN0ZWFkIGlmIGJsb2NrX2Z1bmMgaXMgc3VwcG9zZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgIGRlZiBkb19leGNlcHRpb25hbF9ibG9ja2luZ190ZXN0KHNlbGYsYmxvY2tfZnVuYywgYmxvY2tfYXJncywgdHJpZ2dlcl9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyX2FyZ3MsIGV4cGVjdGVkX2V4Y2VwdGlvbl9jbGFzcyk6CisgICAgICAgIHNlbGYudCA9IF9UcmlnZ2VyVGhyZWFkKHRyaWdnZXJfZnVuYywgdHJpZ2dlcl9hcmdzKQorICAgICAgICBzZWxmLnQuc3RhcnQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYmxvY2tfZnVuYygqYmxvY2tfYXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBleHBlY3RlZF9leGNlcHRpb25fY2xhc3M6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24gb2Yga2luZCAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZXhjZXB0aW9uX2NsYXNzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi50LmpvaW4oMTApICMgbWFrZSBzdXJlIHRoZSB0aHJlYWQgdGVybWluYXRlcworICAgICAgICAgICAgaWYgc2VsZi50LmlzX2FsaXZlKCk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ0cmlnZ2VyIGZ1bmN0aW9uICclcicgYXBwZWFyZWQgdG8gbm90IHJldHVybiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcl9mdW5jKQorICAgICAgICAgICAgaWYgbm90IHNlbGYudC5zdGFydGVkRXZlbnQuaXNfc2V0KCk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ0cmlnZ2VyIHRocmVhZCBlbmRlZCBidXQgZXZlbnQgbmV2ZXIgc2V0IikKKworCitjbGFzcyBCYXNlUXVldWVUZXN0KEJsb2NraW5nVGVzdE1peGluKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY3VtID0gMAorICAgICAgICBzZWxmLmN1bWxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisKKyAgICBkZWYgc2ltcGxlX3F1ZXVlX3Rlc3Qoc2VsZiwgcSk6CisgICAgICAgIGlmIG5vdCBxLmVtcHR5KCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJDYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhbiBlbXB0eSBxdWV1ZSIKKyAgICAgICAgIyBJIGd1ZXNzIHdlIGJldHRlciBjaGVjayB0aGluZ3MgYWN0dWFsbHkgcXVldWUgY29ycmVjdGx5IGEgbGl0dGxlIDopCisgICAgICAgIHEucHV0KDExMSkKKyAgICAgICAgcS5wdXQoMzMzKQorICAgICAgICBxLnB1dCgyMjIpCisgICAgICAgIHRhcmdldF9vcmRlciA9IGRpY3QoUXVldWUgPSBbMTExLCAzMzMsIDIyMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlmb1F1ZXVlID0gWzIyMiwgMzMzLCAxMTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5UXVldWUgPSBbMTExLCAyMjIsIDMzM10pCisgICAgICAgIGFjdHVhbF9vcmRlciA9IFtxLmdldCgpLCBxLmdldCgpLCBxLmdldCgpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbF9vcmRlciwgdGFyZ2V0X29yZGVyW3EuX19jbGFzc19fLl9fbmFtZV9fXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRGlkbid0IHNlZW0gdG8gcXVldWUgdGhlIGNvcnJlY3QgZGF0YSEiKQorICAgICAgICBmb3IgaSBpbiByYW5nZShRVUVVRV9TSVpFLTEpOgorICAgICAgICAgICAgcS5wdXQoaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBlbXB0eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5mdWxsKCksICJRdWV1ZSBzaG91bGQgbm90IGJlIGZ1bGwiKQorICAgICAgICBsYXN0ID0gMiAqIFFVRVVFX1NJWkUKKyAgICAgICAgZnVsbCA9IDMgKiAyICogUVVFVUVfU0laRQorICAgICAgICBxLnB1dChsYXN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocS5mdWxsKCksICJRdWV1ZSBzaG91bGQgYmUgZnVsbCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHEucHV0KGZ1bGwsIGJsb2NrPTApCisgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCBhcHBlYXIgdG8gYmxvY2sgd2l0aCBhIGZ1bGwgcXVldWUiKQorICAgICAgICBleGNlcHQgUXVldWUuRnVsbDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcS5wdXQoZnVsbCwgdGltZW91dD0wLjAxKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgYXBwZWFyIHRvIHRpbWUtb3V0IHdpdGggYSBmdWxsIHF1ZXVlIikKKyAgICAgICAgZXhjZXB0IFF1ZXVlLkZ1bGw6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgVGVzdCBhIGJsb2NraW5nIHB1dAorICAgICAgICBzZWxmLmRvX2Jsb2NraW5nX3Rlc3QocS5wdXQsIChmdWxsLCksIHEuZ2V0LCAoKSkKKyAgICAgICAgc2VsZi5kb19ibG9ja2luZ190ZXN0KHEucHV0LCAoZnVsbCwgVHJ1ZSwgMTApLCBxLmdldCwgKCkpCisgICAgICAgICMgRW1wdHkgaXQKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoUVVFVUVfU0laRSk6CisgICAgICAgICAgICBxLmdldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgYmUgZW1wdHkiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBxLmdldChibG9jaz0wKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgYXBwZWFyIHRvIGJsb2NrIHdpdGggYW4gZW1wdHkgcXVldWUiKQorICAgICAgICBleGNlcHQgUXVldWUuRW1wdHk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHEuZ2V0KHRpbWVvdXQ9MC4wMSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IGFwcGVhciB0byB0aW1lLW91dCB3aXRoIGFuIGVtcHR5IHF1ZXVlIikKKyAgICAgICAgZXhjZXB0IFF1ZXVlLkVtcHR5OgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIFRlc3QgYSBibG9ja2luZyBnZXQKKyAgICAgICAgc2VsZi5kb19ibG9ja2luZ190ZXN0KHEuZ2V0LCAoKSwgcS5wdXQsICgnZW1wdHknLCkpCisgICAgICAgIHNlbGYuZG9fYmxvY2tpbmdfdGVzdChxLmdldCwgKFRydWUsIDEwKSwgcS5wdXQsICgnZW1wdHknLCkpCisKKworICAgIGRlZiB3b3JrZXIoc2VsZiwgcSk6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB4ID0gcS5nZXQoKQorICAgICAgICAgICAgaWYgeCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHEudGFza19kb25lKCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHdpdGggc2VsZi5jdW1sb2NrOgorICAgICAgICAgICAgICAgIHNlbGYuY3VtICs9IHgKKyAgICAgICAgICAgIHEudGFza19kb25lKCkKKworICAgIGRlZiBxdWV1ZV9qb2luX3Rlc3Qoc2VsZiwgcSk6CisgICAgICAgIHNlbGYuY3VtID0gMAorICAgICAgICBmb3IgaSBpbiAoMCwxKToKKyAgICAgICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYud29ya2VyLCBhcmdzPShxLCkpLnN0YXJ0KCkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBxLnB1dChpKQorICAgICAgICBxLmpvaW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3VtLCBzdW0ocmFuZ2UoMTAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgInEuam9pbigpIGRpZCBub3QgYmxvY2sgdW50aWwgYWxsIHRhc2tzIHdlcmUgZG9uZSIpCisgICAgICAgIGZvciBpIGluICgwLDEpOgorICAgICAgICAgICAgcS5wdXQoTm9uZSkgICAgICAgICAjIGluc3RydWN0IHRoZSB0aHJlYWRzIHRvIGNsb3NlCisgICAgICAgIHEuam9pbigpICAgICAgICAgICAgICAgICMgdmVyaWZ5IHRoYXQgeW91IGNhbiBqb2luIHR3aWNlCisKKyAgICBkZWYgdGVzdF9xdWV1ZV90YXNrX2RvbmUoc2VsZik6CisgICAgICAgICMgVGVzdCB0byBtYWtlIHN1cmUgYSBxdWV1ZSB0YXNrIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICAgIHEgPSBzZWxmLnR5cGUydGVzdCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHEudGFza19kb25lKCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZCBub3QgZGV0ZWN0IHRhc2sgY291bnQgZ29pbmcgbmVnYXRpdmUiKQorCisgICAgZGVmIHRlc3RfcXVldWVfam9pbihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgYSBxdWV1ZSBqb2luKClzIHN1Y2Nlc3NmdWxseSwgYW5kIGJlZm9yZSBhbnl0aGluZyBlbHNlCisgICAgICAgICMgKGRvbmUgdHdpY2UgZm9yIGluc3VyYW5jZSkuCisgICAgICAgIHEgPSBzZWxmLnR5cGUydGVzdCgpCisgICAgICAgIHNlbGYucXVldWVfam9pbl90ZXN0KHEpCisgICAgICAgIHNlbGYucXVldWVfam9pbl90ZXN0KHEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHEudGFza19kb25lKCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZCBub3QgZGV0ZWN0IHRhc2sgY291bnQgZ29pbmcgbmVnYXRpdmUiKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX3F1ZXVlKHNlbGYpOgorICAgICAgICAjIERvIGl0IGEgY291cGxlIG9mIHRpbWVzIG9uIHRoZSBzYW1lIHF1ZXVlLgorICAgICAgICAjIERvbmUgdHdpY2UgdG8gbWFrZSBzdXJlIHdvcmtzIHdpdGggc2FtZSBpbnN0YW5jZSByZXVzZWQuCisgICAgICAgIHEgPSBzZWxmLnR5cGUydGVzdChRVUVVRV9TSVpFKQorICAgICAgICBzZWxmLnNpbXBsZV9xdWV1ZV90ZXN0KHEpCisgICAgICAgIHNlbGYuc2ltcGxlX3F1ZXVlX3Rlc3QocSkKKworCitjbGFzcyBRdWV1ZVRlc3QoQmFzZVF1ZXVlVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHR5cGUydGVzdCA9IFF1ZXVlLlF1ZXVlCisKK2NsYXNzIExpZm9RdWV1ZVRlc3QoQmFzZVF1ZXVlVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHR5cGUydGVzdCA9IFF1ZXVlLkxpZm9RdWV1ZQorCitjbGFzcyBQcmlvcml0eVF1ZXVlVGVzdChCYXNlUXVldWVUZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgdHlwZTJ0ZXN0ID0gUXVldWUuUHJpb3JpdHlRdWV1ZQorCisKKworIyBBIFF1ZXVlIHN1YmNsYXNzIHRoYXQgY2FuIHByb3Zva2UgZmFpbHVyZSBhdCBhIG1vbWVudCdzIG5vdGljZSA6KQorY2xhc3MgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitjbGFzcyBGYWlsaW5nUXVldWUoUXVldWUuUXVldWUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuZmFpbF9uZXh0X3B1dCA9IEZhbHNlCisgICAgICAgIHNlbGYuZmFpbF9uZXh0X2dldCA9IEZhbHNlCisgICAgICAgIFF1ZXVlLlF1ZXVlLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgIGRlZiBfcHV0KHNlbGYsIGl0ZW0pOgorICAgICAgICBpZiBzZWxmLmZhaWxfbmV4dF9wdXQ6CisgICAgICAgICAgICBzZWxmLmZhaWxfbmV4dF9wdXQgPSBGYWxzZQorICAgICAgICAgICAgcmFpc2UgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uLCAiWW91IExvc2UiCisgICAgICAgIHJldHVybiBRdWV1ZS5RdWV1ZS5fcHV0KHNlbGYsIGl0ZW0pCisgICAgZGVmIF9nZXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZmFpbF9uZXh0X2dldDoKKyAgICAgICAgICAgIHNlbGYuZmFpbF9uZXh0X2dldCA9IEZhbHNlCisgICAgICAgICAgICByYWlzZSBGYWlsaW5nUXVldWVFeGNlcHRpb24sICJZb3UgTG9zZSIKKyAgICAgICAgcmV0dXJuIFF1ZXVlLlF1ZXVlLl9nZXQoc2VsZikKKworY2xhc3MgRmFpbGluZ1F1ZXVlVGVzdChCbG9ja2luZ1Rlc3RNaXhpbiwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGZhaWxpbmdfcXVldWVfdGVzdChzZWxmLCBxKToKKyAgICAgICAgaWYgbm90IHEuZW1wdHkoKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIGFuIGVtcHR5IHF1ZXVlIgorICAgICAgICBmb3IgaSBpbiByYW5nZShRVUVVRV9TSVpFLTEpOgorICAgICAgICAgICAgcS5wdXQoaSkKKyAgICAgICAgIyBUZXN0IGEgZmFpbGluZyBub24tYmxvY2tpbmcgcHV0LgorICAgICAgICBxLmZhaWxfbmV4dF9wdXQgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHEucHV0KCJvb3BzIiwgYmxvY2s9MCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGhlIHF1ZXVlIGRpZG4ndCBmYWlsIHdoZW4gaXQgc2hvdWxkIGhhdmUiKQorICAgICAgICBleGNlcHQgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBxLmZhaWxfbmV4dF9wdXQgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHEucHV0KCJvb3BzIiwgdGltZW91dD0wLjEpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlRoZSBxdWV1ZSBkaWRuJ3QgZmFpbCB3aGVuIGl0IHNob3VsZCBoYXZlIikKKyAgICAgICAgZXhjZXB0IEZhaWxpbmdRdWV1ZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcS5wdXQoImxhc3QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocS5mdWxsKCksICJRdWV1ZSBzaG91bGQgYmUgZnVsbCIpCisgICAgICAgICMgVGVzdCBhIGZhaWxpbmcgYmxvY2tpbmcgcHV0CisgICAgICAgIHEuZmFpbF9uZXh0X3B1dCA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kb19ibG9ja2luZ190ZXN0KHEucHV0LCAoImZ1bGwiLCksIHEuZ2V0LCAoKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGhlIHF1ZXVlIGRpZG4ndCBmYWlsIHdoZW4gaXQgc2hvdWxkIGhhdmUiKQorICAgICAgICBleGNlcHQgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIENoZWNrIHRoZSBRdWV1ZSBpc24ndCBkYW1hZ2VkLgorICAgICAgICAjIHB1dCBmYWlsZWQsIGJ1dCBnZXQgc3VjY2VlZGVkIC0gcmUtYWRkCisgICAgICAgIHEucHV0KCJsYXN0IikKKyAgICAgICAgIyBUZXN0IGEgZmFpbGluZyB0aW1lb3V0IHB1dAorICAgICAgICBxLmZhaWxfbmV4dF9wdXQgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZG9fZXhjZXB0aW9uYWxfYmxvY2tpbmdfdGVzdChxLnB1dCwgKCJmdWxsIiwgVHJ1ZSwgMTApLCBxLmdldCwgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJUaGUgcXVldWUgZGlkbid0IGZhaWwgd2hlbiBpdCBzaG91bGQgaGF2ZSIpCisgICAgICAgIGV4Y2VwdCBGYWlsaW5nUXVldWVFeGNlcHRpb246CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgQ2hlY2sgdGhlIFF1ZXVlIGlzbid0IGRhbWFnZWQuCisgICAgICAgICMgcHV0IGZhaWxlZCwgYnV0IGdldCBzdWNjZWVkZWQgLSByZS1hZGQKKyAgICAgICAgcS5wdXQoImxhc3QiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocS5mdWxsKCksICJRdWV1ZSBzaG91bGQgYmUgZnVsbCIpCisgICAgICAgIHEuZ2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBxLmZ1bGwoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZnVsbCIpCisgICAgICAgIHEucHV0KCJsYXN0IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIGJlIGZ1bGwiKQorICAgICAgICAjIFRlc3QgYSBibG9ja2luZyBwdXQKKyAgICAgICAgc2VsZi5kb19ibG9ja2luZ190ZXN0KHEucHV0LCAoImZ1bGwiLCksIHEuZ2V0LCAoKSkKKyAgICAgICAgIyBFbXB0eSBpdAorICAgICAgICBmb3IgaSBpbiByYW5nZShRVUVVRV9TSVpFKToKKyAgICAgICAgICAgIHEuZ2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBiZSBlbXB0eSIpCisgICAgICAgIHEucHV0KCJmaXJzdCIpCisgICAgICAgIHEuZmFpbF9uZXh0X2dldCA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcS5nZXQoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJUaGUgcXVldWUgZGlkbid0IGZhaWwgd2hlbiBpdCBzaG91bGQgaGF2ZSIpCisgICAgICAgIGV4Y2VwdCBGYWlsaW5nUXVldWVFeGNlcHRpb246CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBlbXB0eSIpCisgICAgICAgIHEuZmFpbF9uZXh0X2dldCA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcS5nZXQodGltZW91dD0wLjEpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlRoZSBxdWV1ZSBkaWRuJ3QgZmFpbCB3aGVuIGl0IHNob3VsZCBoYXZlIikKKyAgICAgICAgZXhjZXB0IEZhaWxpbmdRdWV1ZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgbm90IGJlIGVtcHR5IikKKyAgICAgICAgcS5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIGJlIGVtcHR5IikKKyAgICAgICAgcS5mYWlsX25leHRfZ2V0ID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRvX2V4Y2VwdGlvbmFsX2Jsb2NraW5nX3Rlc3QocS5nZXQsICgpLCBxLnB1dCwgKCdlbXB0eScsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWlsaW5nUXVldWVFeGNlcHRpb24pCisgICAgICAgICAgICBzZWxmLmZhaWwoIlRoZSBxdWV1ZSBkaWRuJ3QgZmFpbCB3aGVuIGl0IHNob3VsZCBoYXZlIikKKyAgICAgICAgZXhjZXB0IEZhaWxpbmdRdWV1ZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBwdXQgc3VjY2VlZGVkLCBidXQgZ2V0IGZhaWxlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgbm90IGJlIGVtcHR5IikKKyAgICAgICAgcS5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIGJlIGVtcHR5IikKKworICAgIGRlZiB0ZXN0X2ZhaWxpbmdfcXVldWUoc2VsZik6CisgICAgICAgICMgVGVzdCB0byBtYWtlIHN1cmUgYSBxdWV1ZSBpcyBmdW5jdGlvbmluZyBjb3JyZWN0bHkuCisgICAgICAgICMgRG9uZSB0d2ljZSB0byB0aGUgc2FtZSBpbnN0YW5jZS4KKyAgICAgICAgcSA9IEZhaWxpbmdRdWV1ZShRVUVVRV9TSVpFKQorICAgICAgICBzZWxmLmZhaWxpbmdfcXVldWVfdGVzdChxKQorICAgICAgICBzZWxmLmZhaWxpbmdfcXVldWVfdGVzdChxKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFF1ZXVlVGVzdCwgTGlmb1F1ZXVlVGVzdCwgUHJpb3JpdHlRdWV1ZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWlsaW5nUXVldWVUZXN0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1ZXVlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1ZXVlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGEzYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcXVldWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1ZXVlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1ZXVlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGEzYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcXVldWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1b3ByaS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1b3ByaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2M0ZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcXVvcHJpLnB5CkBAIC0wLDAgKzEsMjAxIEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK2ltcG9ydCBzeXMsIGNTdHJpbmdJTywgc3VicHJvY2VzcworaW1wb3J0IHF1b3ByaQorCisKKworRU5DU0FNUExFID0gIiIiXAorSGVyZSdzIGEgYnVuY2ggb2Ygc3BlY2lhbD0yMAorCis9QTE9QTI9QTM9QTQ9QTU9QTY9QTc9QTg9QTkKKz1BQT1BQj1BQz1BRD1BRT1BRj1CMD1CMT1CMj1CMworPUI0PUI1PUI2PUI3PUI4PUI5PUJBPUJCPUJDPUJEPUJFCis9QkY9QzA9QzE9QzI9QzM9QzQ9QzU9QzYKKz1DNz1DOD1DOT1DQT1DQj1DQz1DRD1DRT1DRgorPUQwPUQxPUQyPUQzPUQ0PUQ1PUQ2PUQ3Cis9RDg9RDk9REE9REI9REM9REQ9REU9REYKKz1FMD1FMT1FMj1FMz1FND1FNT1FNj1FNworPUU4PUU5PUVBPUVCPUVDPUVEPUVFPUVGCis9RjA9RjE9RjI9RjM9RjQ9RjU9RjY9RjcKKz1GOD1GOT1GQT1GQj1GQz1GRD1GRT1GRgorCitjaGFyYWN0ZXJzLi4uIGhhdmUgZnVuIQorIiIiCisKKyMgRmlyc3QgbGluZSBlbmRzIHdpdGggYSBzcGFjZQorREVDU0FNUExFID0gIkhlcmUncyBhIGJ1bmNoIG9mIHNwZWNpYWwgXG4iICsgXAorIiIiXAorCitceGExXHhhMlx4YTNceGE0XHhhNVx4YTZceGE3XHhhOFx4YTkKK1x4YWFceGFiXHhhY1x4YWRceGFlXHhhZlx4YjBceGIxXHhiMlx4YjMKK1x4YjRceGI1XHhiNlx4YjdceGI4XHhiOVx4YmFceGJiXHhiY1x4YmRceGJlCitceGJmXHhjMFx4YzFceGMyXHhjM1x4YzRceGM1XHhjNgorXHhjN1x4YzhceGM5XHhjYVx4Y2JceGNjXHhjZFx4Y2VceGNmCitceGQwXHhkMVx4ZDJceGQzXHhkNFx4ZDVceGQ2XHhkNworXHhkOFx4ZDlceGRhXHhkYlx4ZGNceGRkXHhkZVx4ZGYKK1x4ZTBceGUxXHhlMlx4ZTNceGU0XHhlNVx4ZTZceGU3CitceGU4XHhlOVx4ZWFceGViXHhlY1x4ZWRceGVlXHhlZgorXHhmMFx4ZjFceGYyXHhmM1x4ZjRceGY1XHhmNlx4ZjcKK1x4ZjhceGY5XHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmCisKK2NoYXJhY3RlcnMuLi4gaGF2ZSBmdW4hCisiIiIKKworCitkZWYgd2l0aHB5dGhvbmltcGxlbWVudGF0aW9uKHRlc3RmdW5jKToKKyAgICBkZWYgbmV3dGVzdChzZWxmKToKKyAgICAgICAgIyBUZXN0IGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgdGVzdGZ1bmMoc2VsZikKKyAgICAgICAgIyBUZXN0IFB5dGhvbiBpbXBsZW1lbnRhdGlvbgorICAgICAgICBpZiBxdW9wcmkuYjJhX3FwIGlzIG5vdCBOb25lIG9yIHF1b3ByaS5hMmJfcXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvbGRlbmNvZGUgPSBxdW9wcmkuYjJhX3FwCisgICAgICAgICAgICBvbGRkZWNvZGUgPSBxdW9wcmkuYTJiX3FwCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcXVvcHJpLmIyYV9xcCA9IE5vbmUKKyAgICAgICAgICAgICAgICBxdW9wcmkuYTJiX3FwID0gTm9uZQorICAgICAgICAgICAgICAgIHRlc3RmdW5jKHNlbGYpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHF1b3ByaS5iMmFfcXAgPSBvbGRlbmNvZGUKKyAgICAgICAgICAgICAgICBxdW9wcmkuYTJiX3FwID0gb2xkZGVjb2RlCisgICAgbmV3dGVzdC5fX25hbWVfXyA9IHRlc3RmdW5jLl9fbmFtZV9fCisgICAgcmV0dXJuIG5ld3Rlc3QKKworY2xhc3MgUXVvcHJpVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgRWFjaCBlbnRyeSBpcyBhIHR1cGxlIG9mIChwbGFpbnRleHQsIGVuY29kZWQgc3RyaW5nKS4gIFRoZXNlIHN0cmluZ3MgYXJlCisgICAgIyB1c2VkIGluIHRoZSAicXVvdGV0YWJzPTAiIHRlc3RzLgorICAgIFNUUklOR1MgPSAoCisgICAgICAgICMgU29tZSBub3JtYWwgc3RyaW5ncworICAgICAgICAoJ2hlbGxvJywgJ2hlbGxvJyksCisgICAgICAgICgnJydoZWxsbworICAgICAgICB0aGVyZQorICAgICAgICB3b3JsZCcnJywgJycnaGVsbG8KKyAgICAgICAgdGhlcmUKKyAgICAgICAgd29ybGQnJycpLAorICAgICAgICAoJycnaGVsbG8KKyAgICAgICAgdGhlcmUKKyAgICAgICAgd29ybGQKKycnJywgJycnaGVsbG8KKyAgICAgICAgdGhlcmUKKyAgICAgICAgd29ybGQKKycnJyksCisgICAgICAgICgnXDIwMVwyMDJcMjAzJywgJz04MT04Mj04MycpLAorICAgICAgICAjIEFkZCBzb21lIHRyYWlsaW5nIE1VU1QgUVVPVEUgc3RyaW5ncworICAgICAgICAoJ2hlbGxvICcsICdoZWxsbz0yMCcpLAorICAgICAgICAoJ2hlbGxvXHQnLCAnaGVsbG89MDknKSwKKyAgICAgICAgIyBTb21lIGxvbmcgbGluZXMuICBGaXJzdCwgYSBzaW5nbGUgbGluZSBvZiAxMDggY2hhcmFjdGVycworICAgICAgICAoJ3h4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4XHhkOFx4ZDlceGRhXHhkYlx4ZGNceGRkXHhkZVx4ZGZ4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCcsCisgICAgICAgICAnJyd4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eD1EOD1EOT1EQT1EQj1EQz1ERD1ERT1ERng9Cit4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4JycnKSwKKyAgICAgICAgIyBBIGxpbmUgb2YgZXhhY3RseSA3NiBjaGFyYWN0ZXJzLCBubyBzb2Z0IGxpbmUgYnJlYWsgc2hvdWxkIGJlIG5lZWRlZAorICAgICAgICAoJ3l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXknLAorICAgICAgICAneXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eScpLAorICAgICAgICAjIEEgbGluZSBvZiA3NyBjaGFyYWN0ZXJzLCBmb3JjaW5nIGEgc29mdCBsaW5lIGJyZWFrIGF0IHBvc2l0aW9uIDc1LAorICAgICAgICAjIGFuZCBhIHNlY29uZCBsaW5lIG9mIGV4YWN0bHkgMiBjaGFyYWN0ZXJzIChiZWNhdXNlIHRoZSBzb2Z0IGxpbmUKKyAgICAgICAgIyBicmVhayBgPScgc2lnbiBjb3VudHMgYWdhaW5zdCB0aGUgbGluZSBsZW5ndGggbGltaXQpLgorICAgICAgICAoJ3p6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6JywKKyAgICAgICAgICcnJ3p6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6ej0KK3p6JycnKSwKKyAgICAgICAgIyBBIGxpbmUgb2YgMTUxIGNoYXJhY3RlcnMsIGZvcmNpbmcgYSBzb2Z0IGxpbmUgYnJlYWsgYXQgcG9zaXRpb24gNzUsCisgICAgICAgICMgd2l0aCBhIHNlY29uZCBsaW5lIG9mIGV4YWN0bHkgNzYgY2hhcmFjdGVycyBhbmQgbm8gdHJhaWxpbmcgPQorICAgICAgICAoJ3p6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enonLAorICAgICAgICAgJycnenp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6PQorenp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6eicnJyksCisgICAgICAgICMgQSBzdHJpbmcgY29udGFpbmluZyBhIGhhcmQgbGluZSBicmVhaywgYnV0IHdoaWNoIHRoZSBmaXJzdCBsaW5lIGlzCisgICAgICAgICMgMTUxIGNoYXJhY3RlcnMgYW5kIHRoZSBzZWNvbmQgbGluZSBpcyBleGFjdGx5IDc2IGNoYXJhY3RlcnMuICBUaGlzCisgICAgICAgICMgc2hvdWxkIGxlYXZlIHVzIHdpdGggdGhyZWUgbGluZXMsIHRoZSBmaXJzdCB3aGljaCBoYXMgYSBzb2Z0IGxpbmUKKyAgICAgICAgIyBicmVhaywgYW5kIHdoaWNoIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGRvIG5vdC4KKyAgICAgICAgKCcnJ3l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXkKK3p6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enonJycsCisgICAgICAgICAnJyd5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXk9Cit5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5Cit6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6JycnKSwKKyAgICAgICAgIyBOb3cgc29tZSByZWFsbHkgY29tcGxleCBzdHVmZiA7KQorICAgICAgICAoREVDU0FNUExFLCBFTkNTQU1QTEUpLAorICAgICAgICApCisKKyAgICAjIFRoZXNlIGFyZSB1c2VkIGluIHRoZSAicXVvdGV0YWJzPTEiIHRlc3RzLgorICAgIEVTVFJJTkdTID0gKAorICAgICAgICAoJ2hlbGxvIHdvcmxkJywgJ2hlbGxvPTIwd29ybGQnKSwKKyAgICAgICAgKCdoZWxsb1x0d29ybGQnLCAnaGVsbG89MDl3b3JsZCcpLAorICAgICAgICApCisKKyAgICAjIFRoZXNlIGFyZSB1c2VkIGluIHRoZSAiaGVhZGVyPTEiIHRlc3RzLgorICAgIEhTVFJJTkdTID0gKAorICAgICAgICAoJ2hlbGxvIHdvcmxkJywgJ2hlbGxvX3dvcmxkJyksCisgICAgICAgICgnaGVsbG9fd29ybGQnLCAnaGVsbG89NUZ3b3JsZCcpLAorICAgICAgICApCisKKyAgICBAd2l0aHB5dGhvbmltcGxlbWVudGF0aW9uCisgICAgZGVmIHRlc3RfZW5jb2Rlc3RyaW5nKHNlbGYpOgorICAgICAgICBmb3IgcCwgZSBpbiBzZWxmLlNUUklOR1M6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocXVvcHJpLmVuY29kZXN0cmluZyhwKSA9PSBlKQorCisgICAgQHdpdGhweXRob25pbXBsZW1lbnRhdGlvbgorICAgIGRlZiB0ZXN0X2RlY29kZXN0cmluZyhzZWxmKToKKyAgICAgICAgZm9yIHAsIGUgaW4gc2VsZi5TVFJJTkdTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHF1b3ByaS5kZWNvZGVzdHJpbmcoZSkgPT0gcCkKKworICAgIEB3aXRocHl0aG9uaW1wbGVtZW50YXRpb24KKyAgICBkZWYgdGVzdF9pZGVtcG90ZW50X3N0cmluZyhzZWxmKToKKyAgICAgICAgZm9yIHAsIGUgaW4gc2VsZi5TVFJJTkdTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHF1b3ByaS5kZWNvZGVzdHJpbmcocXVvcHJpLmVuY29kZXN0cmluZyhlKSkgPT0gZSkKKworICAgIEB3aXRocHl0aG9uaW1wbGVtZW50YXRpb24KKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGZvciBwLCBlIGluIHNlbGYuU1RSSU5HUzoKKyAgICAgICAgICAgIGluZnAgPSBjU3RyaW5nSU8uU3RyaW5nSU8ocCkKKyAgICAgICAgICAgIG91dGZwID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIHF1b3ByaS5lbmNvZGUoaW5mcCwgb3V0ZnAsIHF1b3RldGFicz1GYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvdXRmcC5nZXR2YWx1ZSgpID09IGUpCisKKyAgICBAd2l0aHB5dGhvbmltcGxlbWVudGF0aW9uCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBmb3IgcCwgZSBpbiBzZWxmLlNUUklOR1M6CisgICAgICAgICAgICBpbmZwID0gY1N0cmluZ0lPLlN0cmluZ0lPKGUpCisgICAgICAgICAgICBvdXRmcCA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBxdW9wcmkuZGVjb2RlKGluZnAsIG91dGZwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG91dGZwLmdldHZhbHVlKCkgPT0gcCkKKworICAgIEB3aXRocHl0aG9uaW1wbGVtZW50YXRpb24KKyAgICBkZWYgdGVzdF9lbWJlZGRlZF93cyhzZWxmKToKKyAgICAgICAgZm9yIHAsIGUgaW4gc2VsZi5FU1RSSU5HUzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmkuZW5jb2Rlc3RyaW5nKHAsIHF1b3RldGFicz1UcnVlKSA9PSBlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHF1b3ByaS5kZWNvZGVzdHJpbmcoZSkgPT0gcCkKKworICAgIEB3aXRocHl0aG9uaW1wbGVtZW50YXRpb24KKyAgICBkZWYgdGVzdF9lbmNvZGVfaGVhZGVyKHNlbGYpOgorICAgICAgICBmb3IgcCwgZSBpbiBzZWxmLkhTVFJJTkdTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHF1b3ByaS5lbmNvZGVzdHJpbmcocCwgaGVhZGVyPVRydWUpID09IGUpCisKKyAgICBAd2l0aHB5dGhvbmltcGxlbWVudGF0aW9uCisgICAgZGVmIHRlc3RfZGVjb2RlX2hlYWRlcihzZWxmKToKKyAgICAgICAgZm9yIHAsIGUgaW4gc2VsZi5IU1RSSU5HUzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmkuZGVjb2Rlc3RyaW5nKGUsIGhlYWRlcj1UcnVlKSA9PSBwKQorCisgICAgZGVmIHRlc3Rfc2NyaXB0ZW5jb2RlKHNlbGYpOgorICAgICAgICAocCwgZSkgPSBzZWxmLlNUUklOR1NbLTFdCisgICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1tcXVvcHJpIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHByb2Nlc3Muc3Rkb3V0LmNsb3NlKQorICAgICAgICBjb3V0LCBjZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZShwKQorICAgICAgICAjIE9uIFdpbmRvd3MsIFB5dGhvbiB3aWxsIG91dHB1dCB0aGUgcmVzdWx0IHRvIHN0ZG91dCB1c2luZworICAgICAgICAjIENSTEYsIGFzIHRoZSBtb2RlIG9mIHN0ZG91dCBpcyB0ZXh0IG1vZGUuIFRvIGNvbXBhcmUgdGhpcworICAgICAgICAjIHdpdGggdGhlIGV4cGVjdGVkIHJlc3VsdCwgd2UgbmVlZCB0byBkbyBhIGxpbmUtYnktbGluZSBjb21wYXJpc29uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdXQuc3BsaXRsaW5lcygpLCBlLnNwbGl0bGluZXMoKSkKKworICAgIGRlZiB0ZXN0X3NjcmlwdGRlY29kZShzZWxmKToKKyAgICAgICAgKHAsIGUpID0gc2VsZi5TVFJJTkdTWy0xXQorICAgICAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItbXF1b3ByaSIsICItZCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwcm9jZXNzLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgY291dCwgY2VyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3V0LnNwbGl0bGluZXMoKSwgcC5zcGxpdGxpbmVzKCkpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFF1b3ByaVRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1b3ByaS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdW9wcmkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNDAzMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdW9wcmkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1b3ByaS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdW9wcmkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNDAzMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdW9wcmkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JhbmRvbS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JhbmRvbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzE2NDE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmFuZG9tLnB5CkBAIC0wLDAgKzEsNjI0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgcmFuZG9tCitpbXBvcnQgdGltZQoraW1wb3J0IHBpY2tsZQoraW1wb3J0IHdhcm5pbmdzCitmcm9tIG1hdGggaW1wb3J0IGxvZywgZXhwLCBwaSwgZnN1bSwgc2luCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgcmVkdWNlCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBUZXN0QmFzaWNPcHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgU3VwZXJjbGFzcyB3aXRoIHRlc3RzIGNvbW1vbiB0byBhbGwgZ2VuZXJhdG9ycy4KKyAgICAjIFN1YmNsYXNzZXMgbXVzdCBhcnJhbmdlIGZvciBzZWxmLmdlbiB0byByZXRyaWV2ZSB0aGUgUmFuZG9tIGluc3RhbmNlCisgICAgIyB0byBiZSB0ZXN0ZWQuCisKKyAgICBkZWYgcmFuZG9tbGlzdChzZWxmLCBuKToKKyAgICAgICAgIiIiSGVscGVyIGZ1bmN0aW9uIHRvIG1ha2UgYSBsaXN0IG9mIHJhbmRvbSBudW1iZXJzIiIiCisgICAgICAgIHJldHVybiBbc2VsZi5nZW4ucmFuZG9tKCkgZm9yIGkgaW4geHJhbmdlKG4pXQorCisgICAgZGVmIHRlc3RfYXV0b3NlZWQoc2VsZik6CisgICAgICAgIHNlbGYuZ2VuLnNlZWQoKQorICAgICAgICBzdGF0ZTEgPSBzZWxmLmdlbi5nZXRzdGF0ZSgpCisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICBzZWxmLmdlbi5zZWVkKCkgICAgICAjIGRpZmZlbnQgc2VlZHMgYXQgZGlmZmVyZW50IHRpbWVzCisgICAgICAgIHN0YXRlMiA9IHNlbGYuZ2VuLmdldHN0YXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzdGF0ZTEsIHN0YXRlMikKKworICAgIGRlZiB0ZXN0X3NhdmVyZXN0b3JlKHNlbGYpOgorICAgICAgICBOID0gMTAwMAorICAgICAgICBzZWxmLmdlbi5zZWVkKCkKKyAgICAgICAgc3RhdGUgPSBzZWxmLmdlbi5nZXRzdGF0ZSgpCisgICAgICAgIHJhbmRzZXEgPSBzZWxmLnJhbmRvbWxpc3QoTikKKyAgICAgICAgc2VsZi5nZW4uc2V0c3RhdGUoc3RhdGUpICAgICMgc2hvdWxkIHJlZ2VuZXJhdGUgdGhlIHNhbWUgc2VxdWVuY2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5kc2VxLCBzZWxmLnJhbmRvbWxpc3QoTikpCisKKyAgICBkZWYgdGVzdF9zZWVkYXJncyhzZWxmKToKKyAgICAgICAgZm9yIGFyZyBpbiBbTm9uZSwgMCwgMEwsIDEsIDFMLCAtMSwgLTFMLCAxMCoqMjAsIC0oMTAqKjIwKSwKKyAgICAgICAgICAgICAgICAgICAgMy4xNCwgMSsyaiwgJ2EnLCB0dXBsZSgnYWJjJyldOgorICAgICAgICAgICAgc2VsZi5nZW4uc2VlZChhcmcpCisgICAgICAgIGZvciBhcmcgaW4gW3JhbmdlKDMpLCBkaWN0KG9uZT0xKV06CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZ2VuLnNlZWQsIGFyZykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmdlbi5zZWVkLCAxLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHR5cGUoc2VsZi5nZW4pLCBbXSkKKworICAgIGRlZiB0ZXN0X2p1bXBhaGVhZChzZWxmKToKKyAgICAgICAgc2VsZi5nZW4uc2VlZCgpCisgICAgICAgIHN0YXRlMSA9IHNlbGYuZ2VuLmdldHN0YXRlKCkKKyAgICAgICAgc2VsZi5nZW4uanVtcGFoZWFkKDEwMCkKKyAgICAgICAgc3RhdGUyID0gc2VsZi5nZW4uZ2V0c3RhdGUoKSAgICAjIHMvYiBkaXN0aW5jdCBmcm9tIHN0YXRlMQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHN0YXRlMSwgc3RhdGUyKQorICAgICAgICBzZWxmLmdlbi5qdW1wYWhlYWQoMTAwKQorICAgICAgICBzdGF0ZTMgPSBzZWxmLmdlbi5nZXRzdGF0ZSgpICAgICMgcy9iIGRpc3RpbmN0IGZyb20gc3RhdGUyCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc3RhdGUyLCBzdGF0ZTMpCisKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncyhxdWlldD1UcnVlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5nZW4uanVtcGFoZWFkKSAgIyBuZWVkcyBhbiBhcmcKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5nZW4uanVtcGFoZWFkLCAyLCAzKSAgIyB0b28gbWFueQorCisgICAgZGVmIHRlc3RfanVtcGFoZWFkX3Byb2R1Y2VzX3ZhbGlkX3N0YXRlKHNlbGYpOgorICAgICAgICAjIEZyb20gaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE0NTkxLgorICAgICAgICBzZWxmLmdlbi5zZWVkKDE5OTIxMDM2OCkKKyAgICAgICAgc2VsZi5nZW4uanVtcGFoZWFkKDEzNTUwNjc0MjMyNTU0NjQ1OTAwKQorICAgICAgICBmb3IgaSBpbiByYW5nZSg1MDApOgorICAgICAgICAgICAgdmFsID0gc2VsZi5nZW4ucmFuZG9tKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyh2YWwsIDEuMCkKKworICAgIGRlZiB0ZXN0X3NhbXBsZShzZWxmKToKKyAgICAgICAgIyBGb3IgdGhlIGVudGlyZSBhbGxvd2FibGUgcmFuZ2Ugb2YgMCA8PSBrIDw9IE4sIHZhbGlkYXRlIHRoYXQKKyAgICAgICAgIyB0aGUgc2FtcGxlIGlzIG9mIHRoZSBjb3JyZWN0IGxlbmd0aCBhbmQgY29udGFpbnMgb25seSB1bmlxdWUgaXRlbXMKKyAgICAgICAgTiA9IDEwMAorICAgICAgICBwb3B1bGF0aW9uID0geHJhbmdlKE4pCisgICAgICAgIGZvciBrIGluIHhyYW5nZShOKzEpOgorICAgICAgICAgICAgcyA9IHNlbGYuZ2VuLnNhbXBsZShwb3B1bGF0aW9uLCBrKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIGspCisgICAgICAgICAgICB1bmlxID0gc2V0KHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih1bmlxKSwgaykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bmlxIDw9IHNldChwb3B1bGF0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdlbi5zYW1wbGUoW10sIDApLCBbXSkgICMgdGVzdCBlZGdlIGNhc2UgTj09az09MAorCisgICAgZGVmIHRlc3Rfc2FtcGxlX2Rpc3RyaWJ1dGlvbihzZWxmKToKKyAgICAgICAgIyBGb3IgdGhlIGVudGlyZSBhbGxvd2FibGUgcmFuZ2Ugb2YgMCA8PSBrIDw9IE4sIHZhbGlkYXRlIHRoYXQKKyAgICAgICAgIyBzYW1wbGUgZ2VuZXJhdGVzIGFsbCBwb3NzaWJsZSBwZXJtdXRhdGlvbnMKKyAgICAgICAgbiA9IDUKKyAgICAgICAgcG9wID0gcmFuZ2UobikKKyAgICAgICAgdHJpYWxzID0gMTAwMDAgICMgbGFyZ2UgbnVtIHByZXZlbnRzIGZhbHNlIG5lZ2F0aXZlcyB3aXRob3V0IHNsb3dpbmcgbm9ybWFsIGNhc2UKKyAgICAgICAgZGVmIGZhY3RvcmlhbChuKToKKyAgICAgICAgICAgIHJldHVybiByZWR1Y2UoaW50Ll9fbXVsX18sIHhyYW5nZSgxLCBuKSwgMSkKKyAgICAgICAgZm9yIGsgaW4geHJhbmdlKG4pOgorICAgICAgICAgICAgZXhwZWN0ZWQgPSBmYWN0b3JpYWwobikgLy8gZmFjdG9yaWFsKG4taykKKyAgICAgICAgICAgIHBlcm1zID0ge30KKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSh0cmlhbHMpOgorICAgICAgICAgICAgICAgIHBlcm1zW3R1cGxlKHNlbGYuZ2VuLnNhbXBsZShwb3AsIGspKV0gPSBOb25lCisgICAgICAgICAgICAgICAgaWYgbGVuKHBlcm1zKSA9PSBleHBlY3RlZDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCkKKworICAgIGRlZiB0ZXN0X3NhbXBsZV9pbnB1dHMoc2VsZik6CisgICAgICAgICMgU0YgYnVnICM4MDEzNDIgLS0gcG9wdWxhdGlvbiBjYW4gYmUgYW55IGl0ZXJhYmxlIGRlZmluaW5nIF9fbGVuX18oKQorICAgICAgICBzZWxmLmdlbi5zYW1wbGUoc2V0KHJhbmdlKDIwKSksIDIpCisgICAgICAgIHNlbGYuZ2VuLnNhbXBsZShyYW5nZSgyMCksIDIpCisgICAgICAgIHNlbGYuZ2VuLnNhbXBsZSh4cmFuZ2UoMjApLCAyKQorICAgICAgICBzZWxmLmdlbi5zYW1wbGUoc3RyKCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpLCAyKQorICAgICAgICBzZWxmLmdlbi5zYW1wbGUodHVwbGUoJ2FiY2RlZmdoaWprbG1ub3BxcnN0JyksIDIpCisKKyAgICBkZWYgdGVzdF9zYW1wbGVfb25fZGljdHMoc2VsZik6CisgICAgICAgIHNlbGYuZ2VuLnNhbXBsZShkaWN0LmZyb21rZXlzKCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpLCAyKQorCisgICAgICAgICMgU0YgYnVnICMxNDYwMzQwIC0tIHJhbmRvbS5zYW1wbGUgY2FuIHJhaXNlIEtleUVycm9yCisgICAgICAgIGEgPSBkaWN0LmZyb21rZXlzKHJhbmdlKDEwKStyYW5nZSgxMCwxMDAsMikrcmFuZ2UoMTAwLDExMCkpCisgICAgICAgIHNlbGYuZ2VuLnNhbXBsZShhLCAzKQorCisgICAgICAgICMgQSBmb2xsb3d1cCB0byBidWcgIzE0NjAzNDA6ICBzYW1wbGluZyBmcm9tIGEgZGljdCBjb3VsZCByZXR1cm4KKyAgICAgICAgIyBhIHN1YnNldCBvZiBpdHMga2V5cyBvciBvZiBpdHMgdmFsdWVzLCBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YKKyAgICAgICAgIyB0aGUgc3Vic2V0IHJlcXVlc3RlZC4KKyAgICAgICAgTiA9IDMwCisgICAgICAgIGQgPSBkaWN0KChpLCBjb21wbGV4KGksIGkpKSBmb3IgaSBpbiB4cmFuZ2UoTikpCisgICAgICAgIGZvciBrIGluIHhyYW5nZShOKzEpOgorICAgICAgICAgICAgc2FtcCA9IHNlbGYuZ2VuLnNhbXBsZShkLCBrKQorICAgICAgICAgICAgIyBWZXJpZnkgdGhhdCB3ZSBnb3QgaW50cyBiYWNrIChrZXlzKTsgdGhlIHZhbHVlcyBhcmUgY29tcGxleC4KKyAgICAgICAgICAgIGZvciB4IGluIHNhbXA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoeCkgaXMgaW50KQorICAgICAgICBzYW1wLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhbXAsIHJhbmdlKE4pKQorCisgICAgZGVmIHRlc3RfZ2F1c3Moc2VsZik6CisgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIHNlZWQoKSBtZXRob2QgaW5pdGlhbGl6ZXMgYWxsIHRoZSBoaWRkZW4gc3RhdGUuICBJbgorICAgICAgICAjIHBhcnRpY3VsYXIsIHRocm91Z2ggMi4yLjEgaXQgZmFpbGVkIHRvIHJlc2V0IGEgcGllY2Ugb2Ygc3RhdGUgdXNlZAorICAgICAgICAjIGJ5IChhbmQgb25seSBieSkgdGhlIC5nYXVzcygpIG1ldGhvZC4KKworICAgICAgICBmb3Igc2VlZCBpbiAxLCAxMiwgMTIzLCAxMjM0LCAxMjM0NSwgMTIzNDU2LCA2NTQzMjE6CisgICAgICAgICAgICBzZWxmLmdlbi5zZWVkKHNlZWQpCisgICAgICAgICAgICB4MSA9IHNlbGYuZ2VuLnJhbmRvbSgpCisgICAgICAgICAgICB5MSA9IHNlbGYuZ2VuLmdhdXNzKDAsIDEpCisKKyAgICAgICAgICAgIHNlbGYuZ2VuLnNlZWQoc2VlZCkKKyAgICAgICAgICAgIHgyID0gc2VsZi5nZW4ucmFuZG9tKCkKKyAgICAgICAgICAgIHkyID0gc2VsZi5nZW4uZ2F1c3MoMCwgMSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4MSwgeDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkxLCB5MikKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgorICAgICAgICBzdGF0ZSA9IHBpY2tsZS5kdW1wcyhzZWxmLmdlbikKKyAgICAgICAgb3JpZ3NlcSA9IFtzZWxmLmdlbi5yYW5kb20oKSBmb3IgaSBpbiB4cmFuZ2UoMTApXQorICAgICAgICBuZXdnZW4gPSBwaWNrbGUubG9hZHMoc3RhdGUpCisgICAgICAgIHJlc3RvcmVkc2VxID0gW25ld2dlbi5yYW5kb20oKSBmb3IgaSBpbiB4cmFuZ2UoMTApXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWdzZXEsIHJlc3RvcmVkc2VxKQorCisgICAgZGVmIHRlc3RfYnVnXzE3Mjc3ODAoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHRoYXQgdmVyc2lvbi0yLXBpY2tsZXMgY2FuIGJlIGxvYWRlZAorICAgICAgICAjIGZpbmUsIHdoZXRoZXIgdGhleSBhcmUgY3JlYXRlZCBvbiAzMi1iaXQgb3IgNjQtYml0CisgICAgICAgICMgcGxhdGZvcm1zLCBhbmQgdGhhdCB2ZXJzaW9uLTMtcGlja2xlcyBsb2FkIGZpbmUuCisgICAgICAgIGZpbGVzID0gWygicmFuZHYyXzMyLnBjayIsIDc4MCksCisgICAgICAgICAgICAgICAgICgicmFuZHYyXzY0LnBjayIsIDg2NiksCisgICAgICAgICAgICAgICAgICgicmFuZHYzLnBjayIsIDM0MyldCisgICAgICAgIGZvciBmaWxlLCB2YWx1ZSBpbiBmaWxlczoKKyAgICAgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5maW5kZmlsZShmaWxlKSwicmIiKQorICAgICAgICAgICAgciA9IHBpY2tsZS5sb2FkKGYpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5yYW5kcmFuZ2UoMTAwMCksIHZhbHVlKQorCitjbGFzcyBXaWNobWFubkhpbGxfVGVzdEJhc2ljT3BzKFRlc3RCYXNpY09wcyk6CisgICAgZ2VuID0gcmFuZG9tLldpY2htYW5uSGlsbCgpCisKKyAgICBkZWYgdGVzdF9zZXRzdGF0ZV9maXJzdF9hcmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZ2VuLnNldHN0YXRlLCAoMiwgTm9uZSwgTm9uZSkpCisKKyAgICBkZWYgdGVzdF9zdHJvbmdfanVtcGFoZWFkKHNlbGYpOgorICAgICAgICAjIHRlc3RzIHRoYXQganVtcGFoZWFkKG4pIHNlbWFudGljcyBjb3JyZXNwb25kIHRvIG4gY2FsbHMgdG8gcmFuZG9tKCkKKyAgICAgICAgTiA9IDEwMDAKKyAgICAgICAgcyA9IHNlbGYuZ2VuLmdldHN0YXRlKCkKKyAgICAgICAgc2VsZi5nZW4uanVtcGFoZWFkKE4pCisgICAgICAgIHIxID0gc2VsZi5nZW4ucmFuZG9tKCkKKyAgICAgICAgIyBub3cgZG8gaXQgdGhlIHNsb3cgd2F5CisgICAgICAgIHNlbGYuZ2VuLnNldHN0YXRlKHMpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShOKToKKyAgICAgICAgICAgIHNlbGYuZ2VuLnJhbmRvbSgpCisgICAgICAgIHIyID0gc2VsZi5nZW4ucmFuZG9tKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyMSwgcjIpCisKKyAgICBkZWYgdGVzdF9nYXVzc193aXRoX3doc2VlZChzZWxmKToKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB0aGUgc2VlZCgpIG1ldGhvZCBpbml0aWFsaXplcyBhbGwgdGhlIGhpZGRlbiBzdGF0ZS4gIEluCisgICAgICAgICMgcGFydGljdWxhciwgdGhyb3VnaCAyLjIuMSBpdCBmYWlsZWQgdG8gcmVzZXQgYSBwaWVjZSBvZiBzdGF0ZSB1c2VkCisgICAgICAgICMgYnkgKGFuZCBvbmx5IGJ5KSB0aGUgLmdhdXNzKCkgbWV0aG9kLgorCisgICAgICAgIGZvciBzZWVkIGluIDEsIDEyLCAxMjMsIDEyMzQsIDEyMzQ1LCAxMjM0NTYsIDY1NDMyMToKKyAgICAgICAgICAgIHNlbGYuZ2VuLndoc2VlZChzZWVkKQorICAgICAgICAgICAgeDEgPSBzZWxmLmdlbi5yYW5kb20oKQorICAgICAgICAgICAgeTEgPSBzZWxmLmdlbi5nYXVzcygwLCAxKQorCisgICAgICAgICAgICBzZWxmLmdlbi53aHNlZWQoc2VlZCkKKyAgICAgICAgICAgIHgyID0gc2VsZi5nZW4ucmFuZG9tKCkKKyAgICAgICAgICAgIHkyID0gc2VsZi5nZW4uZ2F1c3MoMCwgMSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4MSwgeDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkxLCB5MikKKworICAgIGRlZiB0ZXN0X2JpZ3JhbmQoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHdhcm5pbmdzIGFyZSByYWlzZWQgd2hlbiByYW5kcmFuZ2UgaXMgdG9vIGxhcmdlIGZvciByYW5kb20oKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCAiVW5kZXJseWluZyByYW5kb20iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVXNlcldhcm5pbmcsIHNlbGYuZ2VuLnJhbmRyYW5nZSwgMioqNjApCisKK2NsYXNzIFN5c3RlbVJhbmRvbV9UZXN0QmFzaWNPcHMoVGVzdEJhc2ljT3BzKToKKyAgICBnZW4gPSByYW5kb20uU3lzdGVtUmFuZG9tKCkKKworICAgIGRlZiB0ZXN0X2F1dG9zZWVkKHNlbGYpOgorICAgICAgICAjIERvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBleGNlcHQgbm90IGZhaWwKKyAgICAgICAgc2VsZi5nZW4uc2VlZCgpCisKKyAgICBkZWYgdGVzdF9zYXZlcmVzdG9yZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgc2VsZi5nZW4uZ2V0c3RhdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIHNlbGYuZ2VuLnNldHN0YXRlLCBOb25lKQorCisgICAgZGVmIHRlc3Rfc2VlZGFyZ3Moc2VsZik6CisgICAgICAgICMgRG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGV4Y2VwdCBub3QgZmFpbAorICAgICAgICBzZWxmLmdlbi5zZWVkKDEwMCkKKworICAgIGRlZiB0ZXN0X2p1bXBhaGVhZChzZWxmKToKKyAgICAgICAgIyBEb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgZXhjZXB0IG5vdCBmYWlsCisgICAgICAgIHNlbGYuZ2VuLmp1bXBhaGVhZCgxMDApCisKKyAgICBkZWYgdGVzdF9nYXVzcyhzZWxmKToKKyAgICAgICAgc2VsZi5nZW4uZ2F1c3NfbmV4dCA9IE5vbmUKKyAgICAgICAgc2VsZi5nZW4uc2VlZCgxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZW4uZ2F1c3NfbmV4dCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBwaWNrbGUuZHVtcHMsIHNlbGYuZ2VuKQorCisgICAgZGVmIHRlc3RfNTNfYml0c19wZXJfZmxvYXQoc2VsZik6CisgICAgICAgICMgVGhpcyBzaG91bGQgcGFzcyB3aGVuZXZlciBhIEMgZG91YmxlIGhhcyA1MyBiaXQgcHJlY2lzaW9uLgorICAgICAgICBzcGFuID0gMiAqKiA1MworICAgICAgICBjdW0gPSAwCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgY3VtIHw9IGludChzZWxmLmdlbi5yYW5kb20oKSAqIHNwYW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VtLCBzcGFuLTEpCisKKyAgICBkZWYgdGVzdF9iaWdyYW5kKHNlbGYpOgorICAgICAgICAjIFRoZSByYW5kcmFuZ2Ugcm91dGluZSBzaG91bGQgYnVpbGQtdXAgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBiaXRzCisgICAgICAgICMgaW4gc3RhZ2VzIHNvIHRoYXQgYWxsIGJpdCBwb3NpdGlvbnMgYXJlIGFjdGl2ZS4KKyAgICAgICAgc3BhbiA9IDIgKiogNTAwCisgICAgICAgIGN1bSA9IDAKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICByID0gc2VsZi5nZW4ucmFuZHJhbmdlKHNwYW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSByIDwgc3BhbikKKyAgICAgICAgICAgIGN1bSB8PSByCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VtLCBzcGFuLTEpCisKKyAgICBkZWYgdGVzdF9iaWdyYW5kX3JhbmdlcyhzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gWzQwLDgwLCAxNjAsIDIwMCwgMjExLCAyNTAsIDM3NSwgNTEyLCA1NTBdOgorICAgICAgICAgICAgc3RhcnQgPSBzZWxmLmdlbi5yYW5kcmFuZ2UoMiAqKiBpKQorICAgICAgICAgICAgc3RvcCA9IHNlbGYuZ2VuLnJhbmRyYW5nZSgyICoqIChpLTIpKQorICAgICAgICAgICAgaWYgc3RvcCA8PSBzdGFydDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdGFydCA8PSBzZWxmLmdlbi5yYW5kcmFuZ2Uoc3RhcnQsIHN0b3ApIDwgc3RvcCkKKworICAgIGRlZiB0ZXN0X3JhbmdlbGltaXRzKHNlbGYpOgorICAgICAgICBmb3Igc3RhcnQsIHN0b3AgaW4gWygtMiwwKSwgKC0oMioqNjApLTIsLSgyKio2MCkpLCAoMioqNjAsMioqNjArMildOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQocmFuZ2Uoc3RhcnQsc3RvcCkpLAorICAgICAgICAgICAgICAgIHNldChbc2VsZi5nZW4ucmFuZHJhbmdlKHN0YXJ0LHN0b3ApIGZvciBpIGluIHhyYW5nZSgxMDApXSkpCisKKyAgICBkZWYgdGVzdF9nZW5yYW5kYml0cyhzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgcmFuZ2VzCisgICAgICAgIGZvciBrIGluIHhyYW5nZSgxLCAxMDAwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9IHNlbGYuZ2VuLmdldHJhbmRiaXRzKGspIDwgMioqaykKKworICAgICAgICAjIFZlcmlmeSBhbGwgYml0cyBhY3RpdmUKKyAgICAgICAgZ2V0Yml0cyA9IHNlbGYuZ2VuLmdldHJhbmRiaXRzCisgICAgICAgIGZvciBzcGFuIGluIFsxLCAyLCAzLCA0LCAzMSwgMzIsIDMyLCA1MiwgNTMsIDU0LCAxMTksIDEyNywgMTI4LCAxMjldOgorICAgICAgICAgICAgY3VtID0gMAorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICAgICAgY3VtIHw9IGdldGJpdHMoc3BhbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VtLCAyKipzcGFuLTEpCisKKyAgICAgICAgIyBWZXJpZnkgYXJndW1lbnQgY2hlY2tpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmdlbi5nZXRyYW5kYml0cykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmdlbi5nZXRyYW5kYml0cywgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5nZW4uZ2V0cmFuZGJpdHMsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZ2VuLmdldHJhbmRiaXRzLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmdlbi5nZXRyYW5kYml0cywgMTAuMSkKKworICAgIGRlZiB0ZXN0X3JhbmRiZWxvd19sb2dpYyhzZWxmLCBfbG9nPWxvZywgaW50PWludCk6CisgICAgICAgICMgY2hlY2sgYml0Y291bnQgdHJhbnNpdGlvbiBwb2ludHM6ICAyKippIGFuZCAyKiooaSsxKS0xCisgICAgICAgICMgc2hvdyB0aGF0OiBrID0gaW50KDEuMDAxICsgX2xvZyhuLCAyKSkKKyAgICAgICAgIyBpcyBlcXVhbCB0byBvciBvbmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYml0cyBpbiBuCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxLCAxMDAwKToKKyAgICAgICAgICAgIG4gPSAxTCA8PCBpICMgY2hlY2sgYW4gZXhhY3QgcG93ZXIgb2YgdHdvCisgICAgICAgICAgICBudW1iaXRzID0gaSsxCisgICAgICAgICAgICBrID0gaW50KDEuMDAwMDEgKyBfbG9nKG4sIDIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBudW1iaXRzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG4gPT0gMioqKGstMSkpCisKKyAgICAgICAgICAgIG4gKz0gbiAtIDEgICAgICAjIGNoZWNrIDEgYmVsb3cgdGhlIG5leHQgcG93ZXIgb2YgdHdvCisgICAgICAgICAgICBrID0gaW50KDEuMDAwMDEgKyBfbG9nKG4sIDIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihrLCBbbnVtYml0cywgbnVtYml0cysxXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyKiprID4gbiA+IDIqKihrLTIpKQorCisgICAgICAgICAgICBuIC09IG4gPj4gMTUgICAgICMgY2hlY2sgYSBsaXR0bGUgZmFydGhlciBiZWxvdyB0aGUgbmV4dCBwb3dlciBvZiB0d28KKyAgICAgICAgICAgIGsgPSBpbnQoMS4wMDAwMSArIF9sb2cobiwgMikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGssIG51bWJpdHMpICAgICAgICAjIG5vdGUgdGhlIHN0cm9uZ2VyIGFzc2VydGlvbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIqKmsgPiBuID4gMioqKGstMSkpICAgIyBub3RlIHRoZSBzdHJvbmdlciBhc3NlcnRpb24KKworCitjbGFzcyBNZXJzZW5uZVR3aXN0ZXJfVGVzdEJhc2ljT3BzKFRlc3RCYXNpY09wcyk6CisgICAgZ2VuID0gcmFuZG9tLlJhbmRvbSgpCisKKyAgICBkZWYgdGVzdF9zZXRzdGF0ZV9maXJzdF9hcmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZ2VuLnNldHN0YXRlLCAoMSwgTm9uZSwgTm9uZSkpCisKKyAgICBkZWYgdGVzdF9zZXRzdGF0ZV9taWRkbGVfYXJnKHNlbGYpOgorICAgICAgICAjIFdyb25nIHR5cGUsIHMvYiB0dXBsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZ2VuLnNldHN0YXRlLCAoMiwgTm9uZSwgTm9uZSkpCisgICAgICAgICMgV3JvbmcgbGVuZ3RoLCBzL2IgNjI1CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZ2VuLnNldHN0YXRlLCAoMiwgKDEsMiwzKSwgTm9uZSkpCisgICAgICAgICMgV3JvbmcgdHlwZSwgcy9iIHR1cGxlIG9mIDYyNSBpbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5nZW4uc2V0c3RhdGUsICgyLCAoJ2EnLCkqNjI1LCBOb25lKSkKKyAgICAgICAgIyBMYXN0IGVsZW1lbnQgcy9iIGFuIGludCBhbHNvCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5nZW4uc2V0c3RhdGUsICgyLCAoMCwpKjYyNCsoJ2EnLCksIE5vbmUpKQorCisgICAgZGVmIHRlc3RfcmVmZXJlbmNlSW1wbGVtZW50YXRpb24oc2VsZik6CisgICAgICAgICMgQ29tcGFyZSB0aGUgcHl0aG9uIGltcGxlbWVudGF0aW9uIHdpdGggcmVzdWx0cyBmcm9tIHRoZSBvcmlnaW5hbAorICAgICAgICAjIGNvZGUuICBDcmVhdGUgMjAwMCA1My1iaXQgcHJlY2lzaW9uIHJhbmRvbSBmbG9hdHMuICBDb21wYXJlIG9ubHkKKyAgICAgICAgIyB0aGUgbGFzdCB0ZW4gZW50cmllcyB0byBzaG93IHRoYXQgdGhlIGluZGVwZW5kZW50IGltcGxlbWVudGF0aW9ucworICAgICAgICAjIGFyZSB0cmFja2luZy4gIEhlcmUgaXMgdGhlIG1haW4oKSBmdW5jdGlvbiBuZWVkZWQgdG8gY3JlYXRlIHRoZQorICAgICAgICAjIGxpc3Qgb2YgZXhwZWN0ZWQgcmFuZG9tIG51bWJlcnM6CisgICAgICAgICMgICAgdm9pZCBtYWluKHZvaWQpeworICAgICAgICAjICAgICAgICAgaW50IGk7CisgICAgICAgICMgICAgICAgICB1bnNpZ25lZCBsb25nIGluaXRbNF09ezYxNzMxLCAyNDkwMywgNjE0LCA0MjE0M30sIGxlbmd0aD00OworICAgICAgICAjICAgICAgICAgaW5pdF9ieV9hcnJheShpbml0LCBsZW5ndGgpOworICAgICAgICAjICAgICAgICAgZm9yIChpPTA7IGk8MjAwMDsgaSsrKSB7CisgICAgICAgICMgICAgICAgICAgIHByaW50ZigiJS4xNWYgIiwgZ2VucmFuZF9yZXM1MygpKTsKKyAgICAgICAgIyAgICAgICAgICAgaWYgKGklNT09NCkgcHJpbnRmKCJcbiIpOworICAgICAgICAjICAgICAgICAgfQorICAgICAgICAjICAgICB9CisgICAgICAgIGV4cGVjdGVkID0gWzAuNDU4Mzk4MDMwNzM3MTMyNTksCisgICAgICAgICAgICAgICAgICAgIDAuODYwNTc4MTUyMDE5Nzg3ODIsCisgICAgICAgICAgICAgICAgICAgIDAuOTI4NDgzMzE3MjY3ODIxNTIsCisgICAgICAgICAgICAgICAgICAgIDAuMzU5MzI2ODExMTk3ODI0NjEsCisgICAgICAgICAgICAgICAgICAgIDAuMDgxODIzNDkzNzYyNDQ5NTczLAorICAgICAgICAgICAgICAgICAgICAwLjE0MzMyMjI2NDcwMTY5MzI5LAorICAgICAgICAgICAgICAgICAgICAwLjA4NDI5NzgyMzgyMzUyMDAyNCwKKyAgICAgICAgICAgICAgICAgICAgMC41MzgxNDg2NDY3MTgzMTQ1MywKKyAgICAgICAgICAgICAgICAgICAgMC4wODkyMTUwMjQ5MTE5OTM0MDEsCisgICAgICAgICAgICAgICAgICAgIDAuNzg0ODYxOTYxMDUzNzI5MDddCisKKyAgICAgICAgc2VsZi5nZW4uc2VlZCg2MTczMUwgKyAoMjQ5MDNMPDwzMikgKyAoNjE0TDw8NjQpICsgKDQyMTQzTDw8OTYpKQorICAgICAgICBhY3R1YWwgPSBzZWxmLnJhbmRvbWxpc3QoMjAwMClbLTEwOl0KKyAgICAgICAgZm9yIGEsIGUgaW4gemlwKGFjdHVhbCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChhLGUscGxhY2VzPTE0KQorCisgICAgZGVmIHRlc3Rfc3Ryb25nX3JlZmVyZW5jZV9pbXBsZW1lbnRhdGlvbihzZWxmKToKKyAgICAgICAgIyBMaWtlIHRlc3RfcmVmZXJlbmNlSW1wbGVtZW50YXRpb24sIGJ1dCBjaGVja3MgZm9yIGV4YWN0IGJpdC1sZXZlbAorICAgICAgICAjIGVxdWFsaXR5LiAgVGhpcyBzaG91bGQgcGFzcyBvbiBhbnkgYm94IHdoZXJlIEMgZG91YmxlIGNvbnRhaW5zCisgICAgICAgICMgYXQgbGVhc3QgNTMgYml0cyBvZiBwcmVjaXNpb24gKHRoZSB1bmRlcmx5aW5nIGFsZ29yaXRobSBzdWZmZXJzCisgICAgICAgICMgbm8gcm91bmRpbmcgZXJyb3JzIC0tIGFsbCByZXN1bHRzIGFyZSBleGFjdCkuCisgICAgICAgIGZyb20gbWF0aCBpbXBvcnQgbGRleHAKKworICAgICAgICBleHBlY3RlZCA9IFsweDBlYWIzMjU4ZDIyMzFmTCwKKyAgICAgICAgICAgICAgICAgICAgMHgxYjg5ZGIzMTUyNzdhNUwsCisgICAgICAgICAgICAgICAgICAgIDB4MWRiNjIyYTU1MTgwMTZMLAorICAgICAgICAgICAgICAgICAgICAweDBiN2Y5YWYwZDU3NWJmTCwKKyAgICAgICAgICAgICAgICAgICAgMHgwMjllNGM0ZGI4MjI0MEwsCisgICAgICAgICAgICAgICAgICAgIDB4MDQ5NjE4OTJmNWQ2NzNMLAorICAgICAgICAgICAgICAgICAgICAweDAyYjI5MTU5OGU0NTg5TCwKKyAgICAgICAgICAgICAgICAgICAgMHgxMTM4ODM4MmMxNTY5NEwsCisgICAgICAgICAgICAgICAgICAgIDB4MDJkYWQ5NzdjOWUxZmVMLAorICAgICAgICAgICAgICAgICAgICAweDE5MWQ5NmQ0ZDMzNGM2TF0KKyAgICAgICAgc2VsZi5nZW4uc2VlZCg2MTczMUwgKyAoMjQ5MDNMPDwzMikgKyAoNjE0TDw8NjQpICsgKDQyMTQzTDw8OTYpKQorICAgICAgICBhY3R1YWwgPSBzZWxmLnJhbmRvbWxpc3QoMjAwMClbLTEwOl0KKyAgICAgICAgZm9yIGEsIGUgaW4gemlwKGFjdHVhbCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKGxkZXhwKGEsIDUzKSksIGUpCisKKyAgICBkZWYgdGVzdF9sb25nX3NlZWQoc2VsZik6CisgICAgICAgICMgVGhpcyBpcyBtb3N0IGludGVyZXN0aW5nIHRvIHJ1biBpbiBkZWJ1ZyBtb2RlLCBqdXN0IHRvIG1ha2Ugc3VyZQorICAgICAgICAjIG5vdGhpbmcgYmxvd3MgdXAuICBVbmRlciB0aGUgY292ZXJzLCBhIGR5bmFtaWNhbGx5IHJlc2l6ZWQgYXJyYXkKKyAgICAgICAgIyBpcyBhbGxvY2F0ZWQsIGNvbnN1bWluZyBzcGFjZSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZiBiaXRzCisgICAgICAgICMgaW4gdGhlIHNlZWQuICBVbmZvcnR1bmF0ZWx5LCB0aGF0J3MgYSBxdWFkcmF0aWMtdGltZSBhbGdvcml0aG0sCisgICAgICAgICMgc28gZG9uJ3QgbWFrZSB0aGlzIGhvcnJpYmx5IGJpZy4KKyAgICAgICAgc2VlZCA9ICgxTCA8PCAoMTAwMDAgKiA4KSkgLSAxICAjIGFib3V0IDEwSyBieXRlcworICAgICAgICBzZWxmLmdlbi5zZWVkKHNlZWQpCisKKyAgICBkZWYgdGVzdF81M19iaXRzX3Blcl9mbG9hdChzZWxmKToKKyAgICAgICAgIyBUaGlzIHNob3VsZCBwYXNzIHdoZW5ldmVyIGEgQyBkb3VibGUgaGFzIDUzIGJpdCBwcmVjaXNpb24uCisgICAgICAgIHNwYW4gPSAyICoqIDUzCisgICAgICAgIGN1bSA9IDAKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBjdW0gfD0gaW50KHNlbGYuZ2VuLnJhbmRvbSgpICogc3BhbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdW0sIHNwYW4tMSkKKworICAgIGRlZiB0ZXN0X2JpZ3JhbmQoc2VsZik6CisgICAgICAgICMgVGhlIHJhbmRyYW5nZSByb3V0aW5lIHNob3VsZCBidWlsZC11cCB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgIyBpbiBzdGFnZXMgc28gdGhhdCBhbGwgYml0IHBvc2l0aW9ucyBhcmUgYWN0aXZlLgorICAgICAgICBzcGFuID0gMiAqKiA1MDAKKyAgICAgICAgY3VtID0gMAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgICAgIHIgPSBzZWxmLmdlbi5yYW5kcmFuZ2Uoc3BhbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9IHIgPCBzcGFuKQorICAgICAgICAgICAgY3VtIHw9IHIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdW0sIHNwYW4tMSkKKworICAgIGRlZiB0ZXN0X2JpZ3JhbmRfcmFuZ2VzKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiBbNDAsODAsIDE2MCwgMjAwLCAyMTEsIDI1MCwgMzc1LCA1MTIsIDU1MF06CisgICAgICAgICAgICBzdGFydCA9IHNlbGYuZ2VuLnJhbmRyYW5nZSgyICoqIGkpCisgICAgICAgICAgICBzdG9wID0gc2VsZi5nZW4ucmFuZHJhbmdlKDIgKiogKGktMikpCisgICAgICAgICAgICBpZiBzdG9wIDw9IHN0YXJ0OgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0YXJ0IDw9IHNlbGYuZ2VuLnJhbmRyYW5nZShzdGFydCwgc3RvcCkgPCBzdG9wKQorCisgICAgZGVmIHRlc3RfcmFuZ2VsaW1pdHMoc2VsZik6CisgICAgICAgIGZvciBzdGFydCwgc3RvcCBpbiBbKC0yLDApLCAoLSgyKio2MCktMiwtKDIqKjYwKSksICgyKio2MCwyKio2MCsyKV06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChyYW5nZShzdGFydCxzdG9wKSksCisgICAgICAgICAgICAgICAgc2V0KFtzZWxmLmdlbi5yYW5kcmFuZ2Uoc3RhcnQsc3RvcCkgZm9yIGkgaW4geHJhbmdlKDEwMCldKSkKKworICAgIGRlZiB0ZXN0X2dlbnJhbmRiaXRzKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSBjcm9zcy1wbGF0Zm9ybSByZXBlYXRhYmlsaXR5CisgICAgICAgIHNlbGYuZ2VuLnNlZWQoMTIzNDU2NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdlbi5nZXRyYW5kYml0cygxMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIDk3OTA0ODQ1Nzc3MzQzNTEwNDA0NzE4OTU2MTE1TCkKKyAgICAgICAgIyBWZXJpZnkgcmFuZ2VzCisgICAgICAgIGZvciBrIGluIHhyYW5nZSgxLCAxMDAwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9IHNlbGYuZ2VuLmdldHJhbmRiaXRzKGspIDwgMioqaykKKworICAgICAgICAjIFZlcmlmeSBhbGwgYml0cyBhY3RpdmUKKyAgICAgICAgZ2V0Yml0cyA9IHNlbGYuZ2VuLmdldHJhbmRiaXRzCisgICAgICAgIGZvciBzcGFuIGluIFsxLCAyLCAzLCA0LCAzMSwgMzIsIDMyLCA1MiwgNTMsIDU0LCAxMTksIDEyNywgMTI4LCAxMjldOgorICAgICAgICAgICAgY3VtID0gMAorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICAgICAgY3VtIHw9IGdldGJpdHMoc3BhbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VtLCAyKipzcGFuLTEpCisKKyAgICAgICAgIyBWZXJpZnkgYXJndW1lbnQgY2hlY2tpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmdlbi5nZXRyYW5kYml0cykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmdlbi5nZXRyYW5kYml0cywgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZ2VuLmdldHJhbmRiaXRzLCAxLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmdlbi5nZXRyYW5kYml0cywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5nZW4uZ2V0cmFuZGJpdHMsIC0xKQorCisgICAgZGVmIHRlc3RfcmFuZGJlbG93X2xvZ2ljKHNlbGYsIF9sb2c9bG9nLCBpbnQ9aW50KToKKyAgICAgICAgIyBjaGVjayBiaXRjb3VudCB0cmFuc2l0aW9uIHBvaW50czogIDIqKmkgYW5kIDIqKihpKzEpLTEKKyAgICAgICAgIyBzaG93IHRoYXQ6IGsgPSBpbnQoMS4wMDEgKyBfbG9nKG4sIDIpKQorICAgICAgICAjIGlzIGVxdWFsIHRvIG9yIG9uZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBiaXRzIGluIG4KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEsIDEwMDApOgorICAgICAgICAgICAgbiA9IDFMIDw8IGkgIyBjaGVjayBhbiBleGFjdCBwb3dlciBvZiB0d28KKyAgICAgICAgICAgIG51bWJpdHMgPSBpKzEKKyAgICAgICAgICAgIGsgPSBpbnQoMS4wMDAwMSArIF9sb2cobiwgMikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGssIG51bWJpdHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobiA9PSAyKiooay0xKSkKKworICAgICAgICAgICAgbiArPSBuIC0gMSAgICAgICMgY2hlY2sgMSBiZWxvdyB0aGUgbmV4dCBwb3dlciBvZiB0d28KKyAgICAgICAgICAgIGsgPSBpbnQoMS4wMDAwMSArIF9sb2cobiwgMikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGssIFtudW1iaXRzLCBudW1iaXRzKzFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIqKmsgPiBuID4gMioqKGstMikpCisKKyAgICAgICAgICAgIG4gLT0gbiA+PiAxNSAgICAgIyBjaGVjayBhIGxpdHRsZSBmYXJ0aGVyIGJlbG93IHRoZSBuZXh0IHBvd2VyIG9mIHR3bworICAgICAgICAgICAgayA9IGludCgxLjAwMDAxICsgX2xvZyhuLCAyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgbnVtYml0cykgICAgICAgICMgbm90ZSB0aGUgc3Ryb25nZXIgYXNzZXJ0aW9uCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMioqayA+IG4gPiAyKiooay0xKSkgICAjIG5vdGUgdGhlIHN0cm9uZ2VyIGFzc2VydGlvbgorCisgICAgZGVmIHRlc3RfcmFuZHJhbmdlX2J1Z18xNTkwODkxKHNlbGYpOgorICAgICAgICBzdGFydCA9IDEwMDAwMDAwMDAwMDAKKyAgICAgICAgc3RvcCA9IC0xMDAwMDAwMDAwMDAwMDAwMDAwMDAKKyAgICAgICAgc3RlcCA9IC0yMDAKKyAgICAgICAgeCA9IHNlbGYuZ2VuLnJhbmRyYW5nZShzdGFydCwgc3RvcCwgc3RlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0b3AgPCB4IDw9IHN0YXJ0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4K3N0b3ApJXN0ZXAsIDApCisKK2RlZiBnYW1tYSh6LCBzcXJ0MnBpPSgyLjAqcGkpKiowLjUpOgorICAgICMgUmVmbGVjdGlvbiB0byByaWdodCBoYWxmIG9mIGNvbXBsZXggcGxhbmUKKyAgICBpZiB6IDwgMC41OgorICAgICAgICByZXR1cm4gcGkgLyBzaW4ocGkqeikgLyBnYW1tYSgxLjAteikKKyAgICAjIExhbmN6b3MgYXBwcm94aW1hdGlvbiB3aXRoIGc9NworICAgIGF6ID0geiArICg3LjAgLSAwLjUpCisgICAgcmV0dXJuIGF6ICoqICh6LTAuNSkgLyBleHAoYXopICogc3FydDJwaSAqIGZzdW0oWworICAgICAgICAwLjk5OTk5OTk5OTk5OTUxODMsCisgICAgICAgIDY3Ni41MjAzNjgxMjE4ODM1IC8geiwKKyAgICAgICAgLTEyNTkuMTM5MjE2NzIyMjg5IC8gKHorMS4wKSwKKyAgICAgICAgNzcxLjMyMzQyODc3NTc2NzQgLyAoeisyLjApLAorICAgICAgICAtMTc2LjYxNTAyOTE0OTgzODYgLyAoeiszLjApLAorICAgICAgICAxMi41MDczNDMyNDAwOTA1NiAvICh6KzQuMCksCisgICAgICAgIC0wLjEzODU3MTAzMzEyOTY1MjYgLyAoeis1LjApLAorICAgICAgICAwLjk5MzQ5MzcxMTM5MzA3NDhlLTA1IC8gKHorNi4wKSwKKyAgICAgICAgMC4xNjU5NDcwMTg3NDA4NDYyZS0wNiAvICh6KzcuMCksCisgICAgXSkKKworY2xhc3MgVGVzdERpc3RyaWJ1dGlvbnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3plcm9pbnB1dHMoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgZGlzdHJpYnV0aW9ucyBjYW4gaGFuZGxlIGEgc2VyaWVzIG9mIHplcm8gaW5wdXRzJworICAgICAgICBnID0gcmFuZG9tLlJhbmRvbSgpCisgICAgICAgIHggPSBbZy5yYW5kb20oKSBmb3IgaSBpbiB4cmFuZ2UoNTApXSArIFswLjBdKjUKKyAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy51bmlmb3JtKDEsMTApCisgICAgICAgIGcucmFuZG9tID0geFs6XS5wb3A7IGcucGFyZXRvdmFyaWF0ZSgxLjApCisgICAgICAgIGcucmFuZG9tID0geFs6XS5wb3A7IGcuZXhwb3ZhcmlhdGUoMS4wKQorICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wOyBnLndlaWJ1bGx2YXJpYXRlKDEuMCwgMS4wKQorICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wOyBnLnZvbm1pc2VzdmFyaWF0ZSgxLjAsIDEuMCkKKyAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy5ub3JtYWx2YXJpYXRlKDAuMCwgMS4wKQorICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wOyBnLmdhdXNzKDAuMCwgMS4wKQorICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wOyBnLmxvZ25vcm12YXJpYXRlKDAuMCwgMS4wKQorICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wOyBnLnZvbm1pc2VzdmFyaWF0ZSgwLjAsIDEuMCkKKyAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy5nYW1tYXZhcmlhdGUoMC4wMSwgMS4wKQorICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wOyBnLmdhbW1hdmFyaWF0ZSgxLjAsIDEuMCkKKyAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy5nYW1tYXZhcmlhdGUoMjAwLjAsIDEuMCkKKyAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy5iZXRhdmFyaWF0ZSgzLjAsIDMuMCkKKyAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy50cmlhbmd1bGFyKDAuMCwgMS4wLCAxLjAvMy4wKQorCisgICAgZGVmIHRlc3RfYXZnX3N0ZChzZWxmKToKKyAgICAgICAgIyBVc2UgaW50ZWdyYXRpb24gdG8gdGVzdCBkaXN0cmlidXRpb24gYXZlcmFnZSBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uLgorICAgICAgICAjIE9ubHkgd29ya3MgZm9yIGRpc3RyaWJ1dGlvbnMgd2hpY2ggZG8gbm90IGNvbnN1bWUgdmFyaWF0ZXMgaW4gcGFpcnMKKyAgICAgICAgZyA9IHJhbmRvbS5SYW5kb20oKQorICAgICAgICBOID0gNTAwMAorICAgICAgICB4ID0gW2kvZmxvYXQoTikgZm9yIGkgaW4geHJhbmdlKDEsTildCisgICAgICAgIGZvciB2YXJpYXRlLCBhcmdzLCBtdSwgc2lnbWFzcXJkIGluIFsKKyAgICAgICAgICAgICAgICAoZy51bmlmb3JtLCAoMS4wLDEwLjApLCAoMTAuMCsxLjApLzIsICgxMC4wLTEuMCkqKjIvMTIpLAorICAgICAgICAgICAgICAgIChnLnRyaWFuZ3VsYXIsICgwLjAsIDEuMCwgMS4wLzMuMCksIDQuMC85LjAsIDcuMC85LjAvMTguMCksCisgICAgICAgICAgICAgICAgKGcuZXhwb3ZhcmlhdGUsICgxLjUsKSwgMS8xLjUsIDEvMS41KioyKSwKKyAgICAgICAgICAgICAgICAoZy52b25taXNlc3ZhcmlhdGUsICgxLjIzLCAwKSwgcGksIHBpKioyLzMpLAorICAgICAgICAgICAgICAgIChnLnBhcmV0b3ZhcmlhdGUsICg1LjAsKSwgNS4wLyg1LjAtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNS4wLygoNS4wLTEpKioyKig1LjAtMikpKSwKKyAgICAgICAgICAgICAgICAoZy53ZWlidWxsdmFyaWF0ZSwgKDEuMCwgMy4wKSwgZ2FtbWEoMSsxLzMuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtbWEoMSsyLzMuMCktZ2FtbWEoMSsxLzMuMCkqKjIpIF06CisgICAgICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wCisgICAgICAgICAgICB5ID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oeCkpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgeS5hcHBlbmQodmFyaWF0ZSgqYXJncykpCisgICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHMxID0gczIgPSAwCisgICAgICAgICAgICBmb3IgZSBpbiB5OgorICAgICAgICAgICAgICAgIHMxICs9IGUKKyAgICAgICAgICAgICAgICBzMiArPSAoZSAtIG11KSAqKiAyCisgICAgICAgICAgICBOID0gbGVuKHkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHMxL04sIG11LCBwbGFjZXM9MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSclcyVyJyAlICh2YXJpYXRlLl9fbmFtZV9fLCBhcmdzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoczIvKE4tMSksIHNpZ21hc3FyZCwgcGxhY2VzPTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nJXMlcicgJSAodmFyaWF0ZS5fX25hbWVfXywgYXJncykpCisKKyAgICBkZWYgdGVzdF9jb25zdGFudChzZWxmKToKKyAgICAgICAgZyA9IHJhbmRvbS5SYW5kb20oKQorICAgICAgICBOID0gMTAwCisgICAgICAgIGZvciB2YXJpYXRlLCBhcmdzLCBleHBlY3RlZCBpbiBbCisgICAgICAgICAgICAgICAgKGcudW5pZm9ybSwgKDEwLjAsIDEwLjApLCAxMC4wKSwKKyAgICAgICAgICAgICAgICAoZy50cmlhbmd1bGFyLCAoMTAuMCwgMTAuMCksIDEwLjApLAorICAgICAgICAgICAgICAgICMoZy50cmlhbmd1bGFyLCAoMTAuMCwgMTAuMCwgMTAuMCksIDEwLjApLAorICAgICAgICAgICAgICAgIChnLmV4cG92YXJpYXRlLCAoZmxvYXQoJ2luZicpLCksIDAuMCksCisgICAgICAgICAgICAgICAgKGcudm9ubWlzZXN2YXJpYXRlLCAoMy4wLCBmbG9hdCgnaW5mJykpLCAzLjApLAorICAgICAgICAgICAgICAgIChnLmdhdXNzLCAoMTAuMCwgMC4wKSwgMTAuMCksCisgICAgICAgICAgICAgICAgKGcubG9nbm9ybXZhcmlhdGUsICgwLjAsIDAuMCksIDEuMCksCisgICAgICAgICAgICAgICAgKGcubG9nbm9ybXZhcmlhdGUsICgtZmxvYXQoJ2luZicpLCAwLjApLCAwLjApLAorICAgICAgICAgICAgICAgIChnLm5vcm1hbHZhcmlhdGUsICgxMC4wLCAwLjApLCAxMC4wKSwKKyAgICAgICAgICAgICAgICAoZy5wYXJldG92YXJpYXRlLCAoZmxvYXQoJ2luZicpLCksIDEuMCksCisgICAgICAgICAgICAgICAgKGcud2VpYnVsbHZhcmlhdGUsICgxMC4wLCBmbG9hdCgnaW5mJykpLCAxMC4wKSwKKyAgICAgICAgICAgICAgICAoZy53ZWlidWxsdmFyaWF0ZSwgKDAuMCwgMTAuMCksIDAuMCksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXJpYXRlKCphcmdzKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF92b25fbWlzZXNfcmFuZ2Uoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTcxNDk6IHZvbiBtaXNlcyB2YXJpYXRlcyB3ZXJlIG5vdCBjb25zaXN0ZW50bHkgaW4gdGhlCisgICAgICAgICMgcmFuZ2UgWzAsIDIqUEldLgorICAgICAgICBnID0gcmFuZG9tLlJhbmRvbSgpCisgICAgICAgIE4gPSAxMDAKKyAgICAgICAgZm9yIG11IGluIDAuMCwgMC4xLCAzLjEsIDYuMjoKKyAgICAgICAgICAgIGZvciBrYXBwYSBpbiAwLjAsIDIuMywgNTAwLjA6CisgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UoTik6CisgICAgICAgICAgICAgICAgICAgIHNhbXBsZSA9IGcudm9ubWlzZXN2YXJpYXRlKG11LCBrYXBwYSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgMCA8PSBzYW1wbGUgPD0gcmFuZG9tLlRXT1BJLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSgidm9ubWlzZXN2YXJpYXRlKHt9LCB7fSkgcHJvZHVjZWQgYSByZXN1bHQge30gb3V0IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mIHJhbmdlIFswLCAyKnBpXSIpLmZvcm1hdChtdSwga2FwcGEsIHNhbXBsZSkpCisKKyAgICBkZWYgdGVzdF92b25fbWlzZXNfbGFyZ2Vfa2FwcGEoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE3MTQxOiB2b25taXNlc3ZhcmlhdGUoKSB3YXMgaGFuZyBmb3IgbGFyZ2Uga2FwcGFzCisgICAgICAgIHJhbmRvbS52b25taXNlc3ZhcmlhdGUoMCwgMWUxNSkKKyAgICAgICAgcmFuZG9tLnZvbm1pc2VzdmFyaWF0ZSgwLCAxZTEwMCkKKworCitjbGFzcyBUZXN0TW9kdWxlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdE1hZ2ljQ29uc3RhbnRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJhbmRvbS5OVl9NQUdJQ0NPTlNULCAxLjcxNTUyNzc2OTkyMTQxKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJhbmRvbS5UV09QSSwgNi4yODMxODUzMDcxOCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyYW5kb20uTE9HNCwgMS4zODYyOTQzNjExMTk4OSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyYW5kb20uU0dfTUFHSUNDT05TVCwgMi41MDQwNzczOTY3NzYyNykKKworICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKKyAgICAgICAgIyB0ZXN0cyB2YWxpZGl0eSBidXQgbm90IGNvbXBsZXRlbmVzcyBvZiB0aGUgX19hbGxfXyBsaXN0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQocmFuZG9tLl9fYWxsX18pIDw9IHNldChkaXIocmFuZG9tKSkpCisKKyAgICBkZWYgdGVzdF9yYW5kb21fc3ViY2xhc3Nfd2l0aF9rd2FyZ3Moc2VsZik6CisgICAgICAgICMgU0YgYnVnICMxNDg2NjYzIC0tIHRoaXMgdXNlZCB0byBlcnJvbmVvdXNseSByYWlzZSBhIFR5cGVFcnJvcgorICAgICAgICBjbGFzcyBTdWJjbGFzcyhyYW5kb20uUmFuZG9tKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuZXdhcmc9Tm9uZSk6CisgICAgICAgICAgICAgICAgcmFuZG9tLlJhbmRvbS5fX2luaXRfXyhzZWxmKQorICAgICAgICBTdWJjbGFzcyhuZXdhcmc9MSkKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdGNsYXNzZXMgPSAgICBbV2ljaG1hbm5IaWxsX1Rlc3RCYXNpY09wcywKKyAgICAgICAgICAgICAgICAgICAgICBNZXJzZW5uZVR3aXN0ZXJfVGVzdEJhc2ljT3BzLAorICAgICAgICAgICAgICAgICAgICAgIFRlc3REaXN0cmlidXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgIFRlc3RNb2R1bGVdCisKKyAgICB0cnk6CisgICAgICAgIHJhbmRvbS5TeXN0ZW1SYW5kb20oKS5yYW5kb20oKQorICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgdGVzdGNsYXNzZXMuYXBwZW5kKFN5c3RlbVJhbmRvbV9UZXN0QmFzaWNPcHMpCisKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0Y2xhc3NlcykKKworICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgIGltcG9ydCBzeXMKKyAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdGNsYXNzZXMpCisgICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIHByaW50IGNvdW50cworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yYW5kb20ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmFuZG9tLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTgxMWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmFuZG9tLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yYW5kb20ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmFuZG9tLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTgxMWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmFuZG9tLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YTgxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZS5weQpAQCAtMCwwICsxLDEwMzAgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcHJlY2lzaW9uYmlnbWVtdGVzdCwgXzJHLCBjcHl0aG9uX29ubHkKK2ltcG9ydCByZQorZnJvbSByZSBpbXBvcnQgU2Nhbm5lcgoraW1wb3J0IHNyZV9jb25zdGFudHMKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCB0cmFjZWJhY2sKK2Zyb20gd2Vha3JlZiBpbXBvcnQgcHJveHkKKworCisjIE1pc2MgdGVzdHMgZnJvbSBUaW0gUGV0ZXJzJyByZS5kb2MKKworIyBXQVJOSU5HOiBEb24ndCBjaGFuZ2UgZGV0YWlscyBpbiB0aGVzZSB0ZXN0cyBpZiB5b3UgZG9uJ3Qga25vdworIyB3aGF0IHlvdSdyZSBkb2luZy4gU29tZSBvZiB0aGVzZSB0ZXN0cyB3ZXJlIGNhcmVmdWxseSBtb2RlbGVkIHRvCisjIGNvdmVyIG1vc3Qgb2YgdGhlIGNvZGUuCisKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBSZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3dlYWtyZWYoc2VsZik6CisgICAgICAgIHMgPSAnUWFiYmJjUicKKyAgICAgICAgeCA9IHJlLmNvbXBpbGUoJ2FiK2MnKQorICAgICAgICB5ID0gcHJveHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZpbmRhbGwoJ1FhYmJiY1InKSwgeS5maW5kYWxsKCdRYWJiYmNSJykpCisKKyAgICBkZWYgdGVzdF9zZWFyY2hfc3Rhcl9wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaCgneConLCAnYXh4Jykuc3BhbigwKSwgKDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaCgneConLCAnYXh4Jykuc3BhbigpLCAoMCwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKCd4KycsICdheHgnKS5zcGFuKDApLCAoMSwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKCd4KycsICdheHgnKS5zcGFuKCksICgxLCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2goJ3gnLCAnYWFhJyksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ2EqJywgJ3h4eCcpLnNwYW4oMCksICgwLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnYSonLCAneHh4Jykuc3BhbigpLCAoMCwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ3gqJywgJ3h4eGEnKS5zcGFuKDApLCAoMCwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ3gqJywgJ3h4eGEnKS5zcGFuKCksICgwLCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnYSsnLCAneHh4JyksIE5vbmUpCisKKyAgICBkZWYgYnVtcF9udW0oc2VsZiwgbWF0Y2hvYmopOgorICAgICAgICBpbnRfdmFsdWUgPSBpbnQobWF0Y2hvYmouZ3JvdXAoMCkpCisgICAgICAgIHJldHVybiBzdHIoaW50X3ZhbHVlICsgMSkKKworICAgIGRlZiB0ZXN0X2Jhc2ljX3JlX3N1YihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoIig/aSliKyIsICJ4IiwgImJiYmIgQkJCQiIpLCAneCB4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIocidcZCsnLCBzZWxmLmJ1bXBfbnVtLCAnMDguMiAtMiAyM3g5OXknKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnOS4zIC0zIDI0eDEwMHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YihyJ1xkKycsIHNlbGYuYnVtcF9udW0sICcwOC4yIC0yIDIzeDk5eScsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICc5LjMgLTMgMjN4OTl5JykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignLicsIGxhbWJkYSBtOiByIlxuIiwgJ3gnKSwgJ1xcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCcuJywgciJcbiIsICd4JyksICdcbicpCisKKyAgICAgICAgcyA9IHIiXDFcMSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJyguKScsIHMsICd4JyksICd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCcoLiknLCByZS5lc2NhcGUocyksICd4JyksIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCcoLiknLCBsYW1iZGEgbTogcywgJ3gnKSwgcykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignKD9QPGE+eCknLCAnXGc8YT5cZzxhPicsICd4eCcpLCAneHh4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCcoP1A8YT54KScsICdcZzxhPlxnPDE+JywgJ3h4JyksICd4eHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJyg/UDx1bms+eCknLCAnXGc8dW5rPlxnPHVuaz4nLCAneHgnKSwgJ3h4eHgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignKD9QPHVuaz54KScsICdcZzwxPlxnPDE+JywgJ3h4JyksICd4eHh4JykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignYScscidcdFxuXHZcclxmXGFcYlxCXFpcYVxBXHdcV1xzXFNcZFxEJywnYScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdcdFxuXHZcclxmXGFcYlxcQlxcWlxhXFxBXFx3XFxXXFxzXFxTXFxkXFxEJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ2EnLCAnXHRcblx2XHJcZlxhJywgJ2EnKSwgJ1x0XG5cdlxyXGZcYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCdhJywgJ1x0XG5cdlxyXGZcYScsICdhJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNocig5KStjaHIoMTApK2NocigxMSkrY2hyKDEzKStjaHIoMTIpK2Nocig3KSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ15ccyonLCAnWCcsICd0ZXN0JyksICdYdGVzdCcpCisKKyAgICBkZWYgdGVzdF9idWdfNDQ5OTY0KHNlbGYpOgorICAgICAgICAjIGZhaWxzIGZvciBncm91cCBmb2xsb3dlZCBieSBvdGhlciBlc2NhcGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIocicoP1A8dW5rPngpJywgJ1xnPDE+XGc8MT5cXGInLCAneHgnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAneHhcYnh4XGInKQorCisgICAgZGVmIHRlc3RfYnVnXzQ0OTAwMChzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBzdWIoKSBvbiBlc2NhcGVkIGNoYXJhY3RlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIocidcclxuJywgcidcbicsICdhYmNcclxuZGVmXHJcbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdhYmNcbmRlZlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ1xyXG4nLCByJ1xuJywgJ2FiY1xyXG5kZWZcclxuJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FiY1xuZGVmXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YihyJ1xyXG4nLCAnXG4nLCAnYWJjXHJcbmRlZlxyXG4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYWJjXG5kZWZcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCdcclxuJywgJ1xuJywgJ2FiY1xyXG5kZWZcclxuJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FiY1xuZGVmXG4nKQorCisgICAgZGVmIHRlc3RfYnVnXzExNDAoc2VsZik6CisgICAgICAgICMgcmUuc3ViKHgsIHksIHUnJykgc2hvdWxkIHJldHVybiB1JycsIG5vdCAnJywgYW5kCisgICAgICAgICMgcmUuc3ViKHgsIHksICcnKSBzaG91bGQgcmV0dXJuICcnLCBub3QgdScnLgorICAgICAgICAjIEFsc286CisgICAgICAgICMgcmUuc3ViKHgsIHksIHVuaWNvZGUoeCkpIHNob3VsZCByZXR1cm4gdW5pY29kZSh5KSwgYW5kCisgICAgICAgICMgcmUuc3ViKHgsIHksIHN0cih4KSkgc2hvdWxkIHJldHVybgorICAgICAgICAjICAgICBzdHIoeSkgaWYgaXNpbnN0YW5jZSh5LCBzdHIpIGVsc2UgdW5pY29kZSh5KS4KKyAgICAgICAgZm9yIHggaW4gJ3gnLCB1J3gnOgorICAgICAgICAgICAgZm9yIHkgaW4gJ3knLCB1J3knOgorICAgICAgICAgICAgICAgIHogPSByZS5zdWIoeCwgeSwgdScnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeiwgdScnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh6KSwgdW5pY29kZSkKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgeiA9IHJlLnN1Yih4LCB5LCAnJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHosICcnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh6KSwgc3RyKQorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICB6ID0gcmUuc3ViKHgsIHksIHVuaWNvZGUoeCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6LCB5KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh6KSwgdW5pY29kZSkKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgeiA9IHJlLnN1Yih4LCB5LCBzdHIoeCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6LCB5KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh6KSwgdHlwZSh5KSkKKworICAgIGRlZiB0ZXN0X2J1Z18xNjYxKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IGZsYWdzIGRvIG5vdCBnZXQgc2lsZW50bHkgaWdub3JlZCB3aXRoIGNvbXBpbGVkIHBhdHRlcm5zCisgICAgICAgIHBhdHRlcm4gPSByZS5jb21waWxlKCcuJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUubWF0Y2gsIHBhdHRlcm4sICdBJywgcmUuSSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuc2VhcmNoLCBwYXR0ZXJuLCAnQScsIHJlLkkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLmZpbmRhbGwsIHBhdHRlcm4sICdBJywgcmUuSSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmUuY29tcGlsZSwgcGF0dGVybiwgcmUuSSkKKworICAgIGRlZiB0ZXN0X2J1Z18zNjI5KHNlbGYpOgorICAgICAgICAjIEEgcmVnZXggdGhhdCB0cmlnZ2VyZWQgYSBidWcgaW4gdGhlIHNyZS1jb2RlIHZhbGlkYXRvcgorICAgICAgICByZS5jb21waWxlKCIoP1A8cXVvdGU+KSg/KHF1b3RlKSkiKQorCisgICAgZGVmIHRlc3Rfc3ViX3RlbXBsYXRlX251bWVyaWNfZXNjYXBlKHNlbGYpOgorICAgICAgICAjIGJ1ZyA3NzYzMTEgYW5kIGZyaWVuZHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ3gnLCByJ1wwJywgJ3gnKSwgJ1wwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ3gnLCByJ1wwMDAnLCAneCcpLCAnXDAwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4JywgcidcMDAxJywgJ3gnKSwgJ1wwMDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneCcsIHInXDAwOCcsICd4JyksICdcMCcgKyAnOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4JywgcidcMDA5JywgJ3gnKSwgJ1wwJyArICc5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ3gnLCByJ1wxMTEnLCAneCcpLCAnXDExMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4JywgcidcMTE3JywgJ3gnKSwgJ1wxMTcnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4JywgcidcMTExMScsICd4JyksICdcMTExMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4JywgcidcMTExMScsICd4JyksICdcMTExJyArICcxJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneCcsIHInXDAwJywgJ3gnKSwgJ1x4MDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneCcsIHInXDA3JywgJ3gnKSwgJ1x4MDcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneCcsIHInXDA4JywgJ3gnKSwgJ1wwJyArICc4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ3gnLCByJ1wwOScsICd4JyksICdcMCcgKyAnOScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4JywgcidcMGEnLCAneCcpLCAnXDAnICsgJ2EnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4JywgcidcNDAwJywgJ3gnKSwgJ1wwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ3gnLCByJ1w3NzcnLCAneCcpLCAnXDM3NycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJ3gnLCByJ1wxJywgJ3gnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuc3ViLCAneCcsIHInXDgnLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICd4JywgcidcOScsICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJ3gnLCByJ1wxMScsICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJ3gnLCByJ1wxOCcsICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJ3gnLCByJ1wxYScsICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJ3gnLCByJ1w5MCcsICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJ3gnLCByJ1w5OScsICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJ3gnLCByJ1wxMTgnLCAneCcpICMgcidcMTEnICsgJzgnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICd4JywgcidcMTFhJywgJ3gnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuc3ViLCAneCcsIHInXDE4MScsICd4JykgIyByJ1wxOCcgKyAnMScKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJ3gnLCByJ1w4MDAnLCAneCcpICMgcidcODAnICsgJzAnCisKKyAgICAgICAgIyBpbiBweXRob24yLjMgKGV0YyksIHRoZXNlIGxvb3AgZW5kbGVzc2x5IGluIHNyZV9wYXJzZXIucHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJygoKCgoKCgoKCgoeCkpKSkpKSkpKSkpJywgcidcMTEnLCAneCcpLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCcoKCgoKCgoKCgoeSkpKSkpKSkpKSkoLiknLCByJ1wxMTgnLCAneHl6JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3h6OCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCcoKCgoKCgoKCgoeSkpKSkpKSkpKSkoLiknLCByJ1wxMWEnLCAneHl6JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3h6YScpCisKKyAgICBkZWYgdGVzdF9xdWFsaWZpZWRfcmVfc3ViKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignYScsICdiJywgJ2FhYWFhJyksICdiYmJiYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCdhJywgJ2InLCAnYWFhYWEnLCAxKSwgJ2JhYWFhJykKKworICAgIGRlZiB0ZXN0X2J1Z18xMTQ2NjAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKHInKFxTKVxzKyhcUyknLCByJ1wxIFwyJywgJ2hlbGxvICB0aGVyZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdoZWxsbyB0aGVyZScpCisKKyAgICBkZWYgdGVzdF9idWdfNDYyMjcwKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGVtcHR5IHN1YigpIGJlaGF2aW91ciwgc2VlIFNGIGJ1ZyAjNDYyMjcwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4KicsICctJywgJ2FieGQnKSwgJy1hLWItZC0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneCsnLCAnLScsICdhYnhkJyksICdhYi1kJykKKworICAgIGRlZiB0ZXN0X3N5bWJvbGljX2dyb3VwcyhzZWxmKToKKyAgICAgICAgcmUuY29tcGlsZSgnKD9QPGE+eCkoP1A9YSkoPyhhKXkpJykKKyAgICAgICAgcmUuY29tcGlsZSgnKD9QPGExPngpKD9QPWExKSg/KGExKXkpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoP1A8YT4pKD9QPGE+KScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD9QeCknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/UD0pJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoP1A9MSknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/UD1hKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD9QPWExKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD9QPWEuKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD9QPCknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/UDw+KScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD9QPDE+KScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD9QPGEuPiknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/KCkpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoPyhhKSknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/KDFhKSknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/KGEuKSknKQorCisgICAgZGVmIHRlc3Rfc3ltYm9saWNfcmVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJyg/UDxhPngpJywgJ1xnPGEnLCAneHgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuc3ViLCAnKD9QPGE+eCknLCAnXGc8JywgJ3h4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJyg/UDxhPngpJywgJ1xnJywgJ3h4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJyg/UDxhPngpJywgJ1xnPGEgYT4nLCAneHgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuc3ViLCAnKD9QPGE+eCknLCAnXGc8PicsICd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICcoP1A8YT54KScsICdcZzwxYTE+JywgJ3h4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcmUuc3ViLCAnKD9QPGE+eCknLCAnXGc8YWI+JywgJ3h4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJyg/UDxhPngpfCg/UDxiPnkpJywgJ1xnPGI+JywgJ3h4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJyg/UDxhPngpfCg/UDxiPnkpJywgJ1xcMicsICd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICcoP1A8YT54KScsICdcZzwtMT4nLCAneHgnKQorCisgICAgZGVmIHRlc3RfcmVfc3VibihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWJuKCIoP2kpYisiLCAieCIsICJiYmJiIEJCQkIiKSwgKCd4IHgnLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWJuKCJiKyIsICJ4IiwgImJiYmIgQkJCQiIpLCAoJ3ggQkJCQicsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1Ym4oImIrIiwgIngiLCAieHl6IiksICgneHl6JywgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3VibigiYioiLCAieCIsICJ4eXoiKSwgKCd4eHh5eHp4JywgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3VibigiYioiLCAieCIsICJ4eXoiLCAyKSwgKCd4eHh5eicsIDIpKQorCisgICAgZGVmIHRlc3RfcmVfc3BsaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3BsaXQoIjoiLCAiOmE6Yjo6YyIpLCBbJycsICdhJywgJ2InLCAnJywgJ2MnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zcGxpdCgiOioiLCAiOmE6Yjo6YyIpLCBbJycsICdhJywgJ2InLCAnYyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNwbGl0KCIoOiopIiwgIjphOmI6OmMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJycsICc6JywgJ2EnLCAnOicsICdiJywgJzo6JywgJ2MnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zcGxpdCgiKD86OiopIiwgIjphOmI6OmMiKSwgWycnLCAnYScsICdiJywgJ2MnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zcGxpdCgiKDopKiIsICI6YTpiOjpjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWycnLCAnOicsICdhJywgJzonLCAnYicsICc6JywgJ2MnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zcGxpdCgiKFtiOl0rKSIsICI6YTpiOjpjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWycnLCAnOicsICdhJywgJzpiOjonLCAnYyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNwbGl0KCIoYil8KDorKSIsICI6YTpiOjpjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWycnLCBOb25lLCAnOicsICdhJywgTm9uZSwgJzonLCAnJywgJ2InLCBOb25lLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgJzo6JywgJ2MnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zcGxpdCgiKD86Yil8KD86OispIiwgIjphOmI6OmMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJycsICdhJywgJycsICcnLCAnYyddKQorCisgICAgZGVmIHRlc3RfcXVhbGlmaWVkX3JlX3NwbGl0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNwbGl0KCI6IiwgIjphOmI6OmMiLCAyKSwgWycnLCAnYScsICdiOjpjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3BsaXQoJzonLCAnYTpiOmM6ZCcsIDIpLCBbJ2EnLCAnYicsICdjOmQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zcGxpdCgiKDopIiwgIjphOmI6OmMiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJycsICc6JywgJ2EnLCAnOicsICdiOjpjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3BsaXQoIig6KikiLCAiOmE6Yjo6YyIsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnJywgJzonLCAnYScsICc6JywgJ2I6OmMnXSkKKworICAgIGRlZiB0ZXN0X3JlX2ZpbmRhbGwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZmluZGFsbCgiOisiLCAiYWJjIiksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmZpbmRhbGwoIjorIiwgImE6Yjo6Yzo6OmQiKSwgWyI6IiwgIjo6IiwgIjo6OiJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmZpbmRhbGwoIig6KykiLCAiYTpiOjpjOjo6ZCIpLCBbIjoiLCAiOjoiLCAiOjo6Il0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZmluZGFsbCgiKDopKDoqKSIsICJhOmI6OmM6OjpkIiksIFsoIjoiLCAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIjoiLCAiOiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCI6IiwgIjo6IildKQorCisgICAgZGVmIHRlc3RfYnVnXzExNzYxMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5maW5kYWxsKHIiKGF8KGIpKSIsICJhYmEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKCJhIiwgIiIpLCgiYiIsICJiIiksKCJhIiwgIiIpXSkKKworICAgIGRlZiB0ZXN0X3JlX21hdGNoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdhJywgJ2EnKS5ncm91cHMoKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJyhhKScsICdhJykuZ3JvdXBzKCksICgnYScsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJyhhKScsICdhJykuZ3JvdXAoMCksICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJyhhKScsICdhJykuZ3JvdXAoMSksICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJyhhKScsICdhJykuZ3JvdXAoMSwgMSksICgnYScsICdhJykpCisKKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZSgnKChhKXwoYikpKGMpPycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdhJykuZ3JvdXBzKCksICgnYScsICdhJywgTm9uZSwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdiJykuZ3JvdXBzKCksICgnYicsIE5vbmUsICdiJywgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdhYycpLmdyb3VwcygpLCAoJ2EnLCAnYScsIE5vbmUsICdjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdiYycpLmdyb3VwcygpLCAoJ2InLCBOb25lLCAnYicsICdjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdiYycpLmdyb3VwcygiIiksICgnYicsICIiLCAnYicsICdjJykpCisKKyAgICAgICAgIyBBIHNpbmdsZSBncm91cAorICAgICAgICBtID0gcmUubWF0Y2goJyhhKScsICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDApLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgwKSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoMSksICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDEsIDEpLCAoJ2EnLCAnYScpKQorCisgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoJyg/Oig/UDxhMT5hKXwoP1A8YjI+YikpKD9QPGMzPmMpPycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCdhJykuZ3JvdXAoMSwgMiwgMyksICgnYScsIE5vbmUsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYicpLmdyb3VwKCdhMScsICdiMicsICdjMycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCAnYicsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYWMnKS5ncm91cCgxLCAnYjInLCAzKSwgKCdhJywgTm9uZSwgJ2MnKSkKKworICAgIGRlZiB0ZXN0X3JlX2dyb3VwcmVmX2V4aXN0cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXihcKCk/KFteKCldKykoPygxKVwpKSQnLCAnKGEpJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCcoJywgJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXihcKCk/KFteKCldKykoPygxKVwpKSQnLCAnYScpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKFwoKT8oW14oKV0rKSg/KDEpXCkpJCcsICdhKScpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKFwoKT8oW14oKV0rKSg/KDEpXCkpJCcsICcoYScpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKD86KGEpfGMpKCg/KDEpYnxkKSkkJywgJ2FiJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdhJywgJ2InKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXig/OihhKXxjKSgoPygxKWJ8ZCkpJCcsICdjZCcpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCAnZCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKD86KGEpfGMpKCg/KDEpfGQpKSQnLCAnY2QnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgJ2QnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXig/OihhKXxjKSgoPygxKXxkKSkkJywgJ2EnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EnLCAnJykpCisKKyAgICAgICAgIyBUZXN0cyBmb3IgYnVnICMxMTc3ODMxOiBleGVyY2lzZSBncm91cHMgb3RoZXIgdGhhbiB0aGUgZmlyc3QgZ3JvdXAKKyAgICAgICAgcCA9IHJlLmNvbXBpbGUoJyg/UDxnMT5hKSg/UDxnMj5iKT8oKD8oZzIpY3xkKSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubWF0Y2goJ2FiYycpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnYScsICdiJywgJ2MnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm1hdGNoKCdhZCcpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnYScsIE5vbmUsICdkJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5tYXRjaCgnYWJkJyksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5tYXRjaCgnYWMnKSwgTm9uZSkKKworCisgICAgZGVmIHRlc3RfcmVfZ3JvdXByZWYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocideKFx8KT8oW14oKV0rKVwxJCcsICd8YXwnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ3wnLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInXihcfCk/KFteKCldKylcMT8kJywgJ2EnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJ14oXHwpPyhbXigpXSspXDEkJywgJ2F8JyksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocideKFx8KT8oW14oKV0rKVwxJCcsICd8YScpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInXig/OihhKXxjKShcMSkkJywgJ2FhJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdhJywgJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJ14oPzooYSl8YykoXDEpPyQnLCAnYycpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCBOb25lKSkKKworICAgIGRlZiB0ZXN0X2dyb3VwZGljdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnKD9QPGZpcnN0PmZpcnN0KSAoP1A8c2Vjb25kPnNlY29uZCknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaXJzdCBzZWNvbmQnKS5ncm91cGRpY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7J2ZpcnN0JzonZmlyc3QnLCAnc2Vjb25kJzonc2Vjb25kJ30pCisKKyAgICBkZWYgdGVzdF9leHBhbmQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIig/UDxmaXJzdD5maXJzdCkgKD9QPHNlY29uZD5zZWNvbmQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlyc3Qgc2Vjb25kIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhwYW5kKHIiXDIgXDEgXGc8c2Vjb25kPiBcZzxmaXJzdD4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic2Vjb25kIGZpcnN0IHNlY29uZCBmaXJzdCIpCisKKyAgICBkZWYgdGVzdF9yZXBlYXRfbWlubWF4KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeKFx3KXsxfSQiLCAiYWJjIiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl4oXHcpezF9PyQiLCAiYWJjIiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl4oXHcpezEsMn0kIiwgImFiYyIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeKFx3KXsxLDJ9PyQiLCAiYWJjIiksIE5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXihcdyl7M30kIiwgImFiYyIpLmdyb3VwKDEpLCAiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl4oXHcpezEsM30kIiwgImFiYyIpLmdyb3VwKDEpLCAiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl4oXHcpezEsNH0kIiwgImFiYyIpLmdyb3VwKDEpLCAiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl4oXHcpezMsNH0/JCIsICJhYmMiKS5ncm91cCgxKSwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeKFx3KXszfT8kIiwgImFiYyIpLmdyb3VwKDEpLCAiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl4oXHcpezEsM30/JCIsICJhYmMiKS5ncm91cCgxKSwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeKFx3KXsxLDR9PyQiLCAiYWJjIikuZ3JvdXAoMSksICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXihcdyl7Myw0fT8kIiwgImFiYyIpLmdyb3VwKDEpLCAiYyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXnh7MX0kIiwgInh4eCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeeHsxfT8kIiwgInh4eCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeeHsxLDJ9JCIsICJ4eHgiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXnh7MSwyfT8kIiwgInh4eCIpLCBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2goIl54ezN9JCIsICJ4eHgiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5tYXRjaCgiXnh7MSwzfSQiLCAieHh4IiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2goIl54ezEsNH0kIiwgInh4eCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKCJeeHszLDR9PyQiLCAieHh4IiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2goIl54ezN9PyQiLCAieHh4IiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2goIl54ezEsM30/JCIsICJ4eHgiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5tYXRjaCgiXnh7MSw0fT8kIiwgInh4eCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKCJeeHszLDR9PyQiLCAieHh4IiksIE5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXnh7fSQiLCAieHh4IiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2goIl54e30kIiwgInh7fSIpLCBOb25lKQorCisgICAgZGVmIHRlc3RfZ2V0YXR0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiKGEpIiwgImEiKS5wb3MsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIihhKSIsICJhIikuZW5kcG9zLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoYSkiLCAiYSIpLnN0cmluZywgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoYSkiLCAiYSIpLnJlZ3MsICgoMCwgMSksICgwLCAxKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2goIihhKSIsICJhIikucmUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9zcGVjaWFsX2VzY2FwZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXGIoYi4pXGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjZCBhYmMgYmNkIGJ4IikuZ3JvdXAoMSksICJieCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXEIoYi4pXEIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjIGJjZCBiYyBhYnhkIikuZ3JvdXAoMSksICJieCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXGIoYi4pXGIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjZCBhYmMgYmNkIGJ4IiwgcmUuTE9DQUxFKS5ncm91cCgxKSwgImJ4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJcQihiLilcQiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMgYmNkIGJjIGFieGQiLCByZS5MT0NBTEUpLmdyb3VwKDEpLCAiYngiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIlxiKGIuKVxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiY2QgYWJjIGJjZCBieCIsIHJlLlVOSUNPREUpLmdyb3VwKDEpLCAiYngiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIlxCKGIuKVxCIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiYyBiY2QgYmMgYWJ4ZCIsIHJlLlVOSUNPREUpLmdyb3VwKDEpLCAiYngiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIl5hYmMkIiwgIlxuYWJjXG4iLCByZS5NKS5ncm91cCgwKSwgImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXlxBYWJjXFokIiwgImFiYyIsIHJlLk0pLmdyb3VwKDApLCAiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJeXEFhYmNcWiQiLCAiXG5hYmNcbiIsIHJlLk0pLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIlxiKGIuKVxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSJhYmNkIGFiYyBiY2QgYngiKS5ncm91cCgxKSwgImJ4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJcQihiLilcQiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUiYWJjIGJjZCBiYyBhYnhkIikuZ3JvdXAoMSksICJieCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXmFiYyQiLCB1IlxuYWJjXG4iLCByZS5NKS5ncm91cCgwKSwgImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXlxBYWJjXFokIiwgdSJhYmMiLCByZS5NKS5ncm91cCgwKSwgImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXlxBYWJjXFokIiwgdSJcbmFiY1xuIiwgcmUuTSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXGRcRFx3XFdcc1xTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjFhYSEgYSIpLmdyb3VwKDApLCAiMWFhISBhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJcZFxEXHdcV1xzXFMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMWFhISBhIiwgcmUuTE9DQUxFKS5ncm91cCgwKSwgIjFhYSEgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXGRcRFx3XFdcc1xTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjFhYSEgYSIsIHJlLlVOSUNPREUpLmdyb3VwKDApLCAiMWFhISBhIikKKworICAgIGRlZiB0ZXN0X3N0cmluZ19ib3VuZGFyaWVzKHNlbGYpOgorICAgICAgICAjIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTA3MTMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJcYihhYmMpXGIiLCAiYWJjIikuZ3JvdXAoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgImFiYyIpCisgICAgICAgICMgVGhlcmUncyBhIHdvcmQgYm91bmRhcnkgYXQgdGhlIHN0YXJ0IG9mIGEgc3RyaW5nLgorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2gociJcYiIsICJhYmMiKSkKKyAgICAgICAgIyBBIG5vbi1lbXB0eSBzdHJpbmcgaW5jbHVkZXMgYSBub24tYm91bmRhcnkgemVyby1sZW5ndGggbWF0Y2guCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2gociJcQiIsICJhYmMiKSkKKyAgICAgICAgIyBUaGVyZSBpcyBubyBub24tYm91bmRhcnkgbWF0Y2ggYXQgdGhlIHN0YXJ0IG9mIGEgc3RyaW5nLgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlLm1hdGNoKHIiXEIiLCAiYWJjIikpCisgICAgICAgICMgSG93ZXZlciwgYW4gZW1wdHkgc3RyaW5nIGNvbnRhaW5zIG5vIHdvcmQgYm91bmRhcmllcywgYW5kIGFsc28gbm8KKyAgICAgICAgIyBub24tYm91bmRhcmllcy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJcQiIsICIiKSwgTm9uZSkKKyAgICAgICAgIyBUaGlzIG9uZSBpcyBxdWVzdGlvbmFibGUgYW5kIGRpZmZlcmVudCBmcm9tIHRoZSBwZXJscmUgYmVoYXZpb3VyLAorICAgICAgICAjIGJ1dCBkZXNjcmliZXMgY3VycmVudCBiZWhhdmlvci4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJcYiIsICIiKSwgTm9uZSkKKyAgICAgICAgIyBBIHNpbmdsZSB3b3JkLWNoYXJhY3RlciBzdHJpbmcgaGFzIHR3byBib3VuZGFyaWVzLCBidXQgbm8KKyAgICAgICAgIyBub24tYm91bmRhcnkgZ2Fwcy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmUuZmluZGFsbChyIlxiIiwgImEiKSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlLmZpbmRhbGwociJcQiIsICJhIikpLCAwKQorICAgICAgICAjIElmIHRoZXJlIGFyZSBubyB3b3JkcywgdGhlcmUgYXJlIG5vIGJvdW5kYXJpZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmUuZmluZGFsbChyIlxiIiwgIiAiKSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlLmZpbmRhbGwociJcYiIsICIgICAiKSksIDApCisgICAgICAgICMgQ2FuIG1hdGNoIGFyb3VuZCB0aGUgd2hpdGVzcGFjZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmUuZmluZGFsbChyIlxCIiwgIiAiKSksIDIpCisKKyAgICBkZWYgdGVzdF9iaWdjaGFyc2V0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHUiKFtcdTIyMjJcdTIyMjNdKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSJcdTIyMjIiKS5ncm91cCgxKSwgdSJcdTIyMjIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHUiKFtcdTIyMjJcdTIyMjNdKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSJcdTIyMjIiLCByZS5VTklDT0RFKS5ncm91cCgxKSwgdSJcdTIyMjIiKQorCisgICAgZGVmIHRlc3RfYmlnX2NvZGVzaXplKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMTYwCisgICAgICAgIHIgPSByZS5jb21waWxlKCd8Jy5qb2luKCgnJWQnJXggZm9yIHggaW4gcmFuZ2UoMTAwMDApKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHIubWF0Y2goJzEwMDAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUoci5tYXRjaCgnOTk5OScpKQorCisgICAgZGVmIHRlc3RfYW55YWxsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJhLmIiLCAiYVxuYiIsIHJlLkRPVEFMTCkuZ3JvdXAoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImFcbmIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJhLipiIiwgImFcblxuYiIsIHJlLkRPVEFMTCkuZ3JvdXAoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImFcblxuYiIpCisKKyAgICBkZWYgdGVzdF9ub25fY29uc3VtaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoYSg/PVxzW15hXSkpIiwgImEgYiIpLmdyb3VwKDEpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIihhKD89XHNbXmFdKikpIiwgImEgYiIpLmdyb3VwKDEpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIihhKD89XHNbYWJjXSkpIiwgImEgYiIpLmdyb3VwKDEpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIihhKD89XHNbYWJjXSopKSIsICJhIGJjIikuZ3JvdXAoMSksICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIihhKSg/PVxzXDEpIiwgImEgYSIpLmdyb3VwKDEpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYSkoPz1cc1wxKikiLCAiYSBhYSIpLmdyb3VwKDEpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYSkoPz1ccyhhYmN8YSkpIiwgImEgYSIpLmdyb3VwKDEpLCAiYSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIihhKD8hXHNbXmFdKSkiLCAiYSBhIikuZ3JvdXAoMSksICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIihhKD8hXHNbYWJjXSkpIiwgImEgZCIpLmdyb3VwKDEpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYSkoPyFcc1wxKSIsICJhIGIiKS5ncm91cCgxKSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiKGEpKD8hXHMoYWJjfGEpKSIsICJhIGIiKS5ncm91cCgxKSwgImEiKQorCisgICAgZGVmIHRlc3RfaWdub3JlX2Nhc2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goImFiYyIsICJBQkMiLCByZS5JKS5ncm91cCgwKSwgIkFCQyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goImFiYyIsIHUiQUJDIiwgcmUuSSkuZ3JvdXAoMCksICJBQkMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiKGFcc1teYV0pIiwgImEgYiIsIHJlLkkpLmdyb3VwKDEpLCAiYSBiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIihhXHNbXmFdKikiLCAiYSBiYiIsIHJlLkkpLmdyb3VwKDEpLCAiYSBiYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYVxzW2FiY10pIiwgImEgYiIsIHJlLkkpLmdyb3VwKDEpLCAiYSBiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIihhXHNbYWJjXSopIiwgImEgYmIiLCByZS5JKS5ncm91cCgxKSwgImEgYmIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiKChhKVxzXDIpIiwgImEgYSIsIHJlLkkpLmdyb3VwKDEpLCAiYSBhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIigoYSlcc1wyKikiLCAiYSBhYSIsIHJlLkkpLmdyb3VwKDEpLCAiYSBhYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoKGEpXHMoYWJjfGEpKSIsICJhIGEiLCByZS5JKS5ncm91cCgxKSwgImEgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoKGEpXHMoYWJjfGEpKikiLCAiYSBhYSIsIHJlLkkpLmdyb3VwKDEpLCAiYSBhYSIpCisKKyAgICBkZWYgdGVzdF9jYXRlZ29yeShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIihccykiLCAiICIpLmdyb3VwKDEpLCAiICIpCisKKyAgICBkZWYgdGVzdF9nZXRsb3dlcihzZWxmKToKKyAgICAgICAgaW1wb3J0IF9zcmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfc3JlLmdldGxvd2VyKG9yZCgnQScpLCAwKSwgb3JkKCdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3NyZS5nZXRsb3dlcihvcmQoJ0EnKSwgcmUuTE9DQUxFKSwgb3JkKCdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3NyZS5nZXRsb3dlcihvcmQoJ0EnKSwgcmUuVU5JQ09ERSksIG9yZCgnYScpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goImFiYyIsICJBQkMiLCByZS5JKS5ncm91cCgwKSwgIkFCQyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goImFiYyIsIHUiQUJDIiwgcmUuSSkuZ3JvdXAoMCksICJBQkMiKQorCisgICAgZGVmIHRlc3Rfbm90X2xpdGVyYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKCJccyhbXmFdKSIsICIgYiIpLmdyb3VwKDEpLCAiYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKCJccyhbXmFdKikiLCAiIGJiIikuZ3JvdXAoMSksICJiYiIpCisKKyAgICBkZWYgdGVzdF9zZWFyY2hfY292ZXJhZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKCJccyhiKSIsICIgYiIpLmdyb3VwKDEpLCAiYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKCJhXHMiLCAiYSAiKS5ncm91cCgwKSwgImEgIikKKworICAgIGRlZiBhc3NlcnRNYXRjaChzZWxmLCBwYXR0ZXJuLCB0ZXh0LCBtYXRjaD1Ob25lLCBzcGFuPU5vbmUsCisgICAgICAgICAgICAgICAgICAgIG1hdGNoZXI9cmUubWF0Y2gpOgorICAgICAgICBpZiBtYXRjaCBpcyBOb25lIGFuZCBzcGFuIGlzIE5vbmU6CisgICAgICAgICAgICAjIHRoZSBwYXR0ZXJuIG1hdGNoZXMgdGhlIHdob2xlIHRleHQKKyAgICAgICAgICAgIG1hdGNoID0gdGV4dAorICAgICAgICAgICAgc3BhbiA9ICgwLCBsZW4odGV4dCkpCisgICAgICAgIGVsaWYgbWF0Y2ggaXMgTm9uZSBvciBzcGFuIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJZiBtYXRjaCBpcyBub3QgTm9uZSwgc3BhbiBzaG91bGQgYmUgc3BlY2lmaWVkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyhhbmQgdmljZSB2ZXJzYSkuJykKKyAgICAgICAgbSA9IG1hdGNoZXIocGF0dGVybiwgdGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgpLCBtYXRjaCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnNwYW4oKSwgc3BhbikKKworICAgIGRlZiB0ZXN0X3JlX2VzY2FwZShzZWxmKToKKyAgICAgICAgYWxudW1fY2hhcnMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMKKyAgICAgICAgcCA9IHUnJy5qb2luKHVuaWNocihpKSBmb3IgaSBpbiByYW5nZSgyNTYpKQorICAgICAgICBmb3IgYyBpbiBwOgorICAgICAgICAgICAgaWYgYyBpbiBhbG51bV9jaGFyczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmVzY2FwZShjKSwgYykKKyAgICAgICAgICAgIGVsaWYgYyA9PSB1J1x4MDAnOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZXNjYXBlKGMpLCB1J1xcMDAwJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5lc2NhcGUoYyksIHUnXFwnICsgYykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TWF0Y2gocmUuZXNjYXBlKGMpLCBjKQorICAgICAgICBzZWxmLmFzc2VydE1hdGNoKHJlLmVzY2FwZShwKSwgcCkKKworICAgIGRlZiB0ZXN0X3JlX2VzY2FwZV9ieXRlKHNlbGYpOgorICAgICAgICBhbG51bV9jaGFycyA9IChzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMpLmVuY29kZSgnYXNjaWknKQorICAgICAgICBwID0gJycuam9pbihjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMjU2KSkKKyAgICAgICAgZm9yIGIgaW4gcDoKKyAgICAgICAgICAgIGlmIGIgaW4gYWxudW1fY2hhcnM6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5lc2NhcGUoYiksIGIpCisgICAgICAgICAgICBlbGlmIGIgPT0gYidceDAwJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmVzY2FwZShiKSwgYidcXDAwMCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZXNjYXBlKGIpLCBiJ1xcJyArIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydE1hdGNoKHJlLmVzY2FwZShiKSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRNYXRjaChyZS5lc2NhcGUocCksIHApCisKKyAgICBkZWYgdGVzdF9yZV9lc2NhcGVfbm9uX2FzY2lpKHNlbGYpOgorICAgICAgICBzID0gdSd4eHhcdTI2MjBcdTI2MjBcdTI2MjB4eHgnCisgICAgICAgIHNfZXNjYXBlZCA9IHJlLmVzY2FwZShzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNfZXNjYXBlZCwgdSd4eHhcXFx1MjYyMFxcXHUyNjIwXFxcdTI2MjB4eHgnKQorICAgICAgICBzZWxmLmFzc2VydE1hdGNoKHNfZXNjYXBlZCwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRNYXRjaCh1Jy4lcysuJyAlIHJlLmVzY2FwZSh1J1x1MjYyMCcpLCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUneFx1MjYyMFx1MjYyMFx1MjYyMHgnLCAoMiwgNyksIHJlLnNlYXJjaCkKKworICAgIGRlZiB0ZXN0X3JlX2VzY2FwZV9ub25fYXNjaWlfYnl0ZXMoc2VsZik6CisgICAgICAgIGIgPSB1J3lcdTI2MjB5XHUyNjIweScuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIGJfZXNjYXBlZCA9IHJlLmVzY2FwZShiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJfZXNjYXBlZCwgYid5XFxceGUyXFxceDk4XFxceGEweVxcXHhlMlxcXHg5OFxcXHhhMHknKQorICAgICAgICBzZWxmLmFzc2VydE1hdGNoKGJfZXNjYXBlZCwgYikKKyAgICAgICAgcmVzID0gcmUuZmluZGFsbChyZS5lc2NhcGUodSdcdTI2MjAnLmVuY29kZSgndXRmLTgnKSksIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDIpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBzZWxmLnBpY2tsZV90ZXN0KHBpY2tsZSkKKyAgICAgICAgaW1wb3J0IGNQaWNrbGUKKyAgICAgICAgc2VsZi5waWNrbGVfdGVzdChjUGlja2xlKQorICAgICAgICAjIG9sZCBwaWNrbGVzIGV4cGVjdCB0aGUgX2NvbXBpbGUoKSByZWNvbnN0cnVjdG9yIGluIHNyZSBtb2R1bGUKKyAgICAgICAgaW1wb3J0X21vZHVsZSgic3JlIiwgZGVwcmVjYXRlZD1UcnVlKQorICAgICAgICBmcm9tIHNyZSBpbXBvcnQgX2NvbXBpbGUKKworICAgIGRlZiBwaWNrbGVfdGVzdChzZWxmLCBwaWNrbGUpOgorICAgICAgICBvbGRwYXQgPSByZS5jb21waWxlKCdhKD86YnwoY3xlKXsxLDJ9P3xkKSs/KC4pJykKKyAgICAgICAgcyA9IHBpY2tsZS5kdW1wcyhvbGRwYXQpCisgICAgICAgIG5ld3BhdCA9IHBpY2tsZS5sb2FkcyhzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9sZHBhdCwgbmV3cGF0KQorCisgICAgZGVmIHRlc3RfY29uc3RhbnRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLkksIHJlLklHTk9SRUNBU0UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuTCwgcmUuTE9DQUxFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLk0sIHJlLk1VTFRJTElORSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5TLCByZS5ET1RBTEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuWCwgcmUuVkVSQk9TRSkKKworICAgIGRlZiB0ZXN0X2ZsYWdzKHNlbGYpOgorICAgICAgICBmb3IgZmxhZyBpbiBbcmUuSSwgcmUuTSwgcmUuWCwgcmUuUywgcmUuTF06CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLmNvbXBpbGUoJ15wYXR0ZXJuJCcsIGZsYWcpLCBOb25lKQorCisgICAgZGVmIHRlc3Rfc3JlX2NoYXJhY3Rlcl9saXRlcmFscyhzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gWzAsIDgsIDE2LCAzMiwgNjQsIDEyNywgMTI4LCAyNTVdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5tYXRjaChyIlwlMDNvIiAlIGksIGNocihpKSksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKHIiXCUwM28wIiAlIGksIGNocihpKSsiMCIpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5tYXRjaChyIlwlMDNvOCIgJSBpLCBjaHIoaSkrIjgiKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2gociJceCUwMngiICUgaSwgY2hyKGkpKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2gociJceCUwMngwIiAlIGksIGNocihpKSsiMCIpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5tYXRjaChyIlx4JTAyeHoiICUgaSwgY2hyKGkpKyJ6IiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5tYXRjaCwgIlw5MTEiLCAiIikKKworICAgIGRlZiB0ZXN0X3NyZV9jaGFyYWN0ZXJfY2xhc3NfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgIGZvciBpIGluIFswLCA4LCAxNiwgMzIsIDY0LCAxMjcsIDEyOCwgMjU1XToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2gociJbXCUwM29dIiAlIGksIGNocihpKSksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKHIiW1wlMDNvMF0iICUgaSwgY2hyKGkpKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2gociJbXCUwM284XSIgJSBpLCBjaHIoaSkpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5tYXRjaChyIltceCUwMnhdIiAlIGksIGNocihpKSksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKHIiW1x4JTAyeDBdIiAlIGksIGNocihpKSksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKHIiW1x4JTAyeHpdIiAlIGksIGNocihpKSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5tYXRjaCwgIltcOTExXSIsICIiKQorCisgICAgZGVmIHRlc3RfYnVnXzExMzI1NChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJyhhKXwoYiknLCAnYicpLnN0YXJ0KDEpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJyhhKXwoYiknLCAnYicpLmVuZCgxKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocicoYSl8KGIpJywgJ2InKS5zcGFuKDEpLCAoLTEsIC0xKSkKKworICAgIGRlZiB0ZXN0X2J1Z181MjczNzEoc2VsZik6CisgICAgICAgICMgYnVnIGRlc2NyaWJlZCBpbiBwYXRjaGVzIDUyNzM3MS82NzI0OTEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJyhhKT9hJywnYScpLmxhc3RpbmRleCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJyhhKShiKT9iJywnYWInKS5sYXN0aW5kZXgsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocicoP1A8YT5hKSg/UDxiPmIpP2InLCdhYicpLmxhc3Rncm91cCwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoP1A8YT5hKGIpKSIsICJhYiIpLmxhc3Rncm91cCwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoKGEpKSIsICJhIikubGFzdGluZGV4LCAxKQorCisgICAgZGVmIHRlc3RfYnVnXzU0NTg1NShzZWxmKToKKyAgICAgICAgIyBidWcgNTQ1ODU1IC0tIFRoaXMgcGF0dGVybiBmYWlsZWQgdG8gY2F1c2UgYSBjb21waWxlIGVycm9yIGFzIGl0CisgICAgICAgICMgc2hvdWxkLCBpbnN0ZWFkIHByb3Zva2luZyBhIFR5cGVFcnJvci4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICdmb29bYS0nKQorCisgICAgZGVmIHRlc3RfYnVnXzQxODYyNihzZWxmKToKKyAgICAgICAgIyBidWdzIDQxODYyNiBhdCBhbC4gLS0gVGVzdGluZyBHcmVnIENoYXBtYW4ncyBhZGRpdGlvbiBvZiBvcCBjb2RlCisgICAgICAgICMgU1JFX09QX01JTl9SRVBFQVRfT05FIGZvciBlbGltaW5hdGluZyByZWN1cnNpb24gb24gc2ltcGxlIHVzZXMgb2YKKyAgICAgICAgIyBwYXR0ZXJuICcqPycgb24gYSBsb25nIHN0cmluZy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnLio/YycsIDEwMDAwKidhYicrJ2NkJykuZW5kKDApLCAyMDAwMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnLio/Y2QnLCA1MDAwKidhYicrJ2MnKzUwMDAqJ2FiJysnY2RlJykuZW5kKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCcuKj9jZCcsIDIwMDAwKidhYmMnKydkZScpLmVuZCgwKSwgNjAwMDEpCisgICAgICAgICMgbm9uLXNpbXBsZSAnKj8nIHN0aWxsIHVzZWQgdG8gaGl0IHRoZSByZWN1cnNpb24gbGltaXQsIGJlZm9yZSB0aGUKKyAgICAgICAgIyBub24tcmVjdXJzaXZlIHNjaGVtZSB3YXMgaW1wbGVtZW50ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKCcoYXxiKSo/YycsIDEwMDAwKidhYicrJ2NkJykuZW5kKDApLCAyMDAwMSkKKworICAgIGRlZiB0ZXN0X2J1Z182MTIwNzQoc2VsZik6CisgICAgICAgIHBhdD11IlsiK3JlLmVzY2FwZSh1Ilx1MjAzOSIpK3UiXSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5jb21waWxlKHBhdCkgYW5kIDEsIDEpCisKKyAgICBkZWYgdGVzdF9zdGFja19vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgIyBuYXN0eSBjYXNlcyB0aGF0IHVzZWQgdG8gb3ZlcmZsb3cgdGhlIHN0cmFpZ2h0Zm9yd2FyZCByZWN1cnNpdmUKKyAgICAgICAgIyBpbXBsZW1lbnRhdGlvbiBvZiByZXBlYXRlZCBncm91cHMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJyh4KSonLCA1MDAwMConeCcpLmdyb3VwKDEpLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJyh4KSp5JywgNTAwMDAqJ3gnKyd5JykuZ3JvdXAoMSksICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnKHgpKj95JywgNTAwMDAqJ3gnKyd5JykuZ3JvdXAoMSksICd4JykKKworICAgIGRlZiB0ZXN0X3VubGltaXRlZF96ZXJvX3dpZHRoX3JlcGVhdChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjOTY2OQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyJyg/OmE/KSp5JywgJ3onKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gocicoPzphPykreScsICd6JykpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHInKD86YT8pezIsfXknLCAneicpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyJyg/OmE/KSo/eScsICd6JykpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHInKD86YT8pKz95JywgJ3onKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gocicoPzphPyl7Mix9P3knLCAneicpKQorCisgICAgZGVmIHRlc3Rfc2Nhbm5lcihzZWxmKToKKyAgICAgICAgZGVmIHNfaWRlbnQoc2Nhbm5lciwgdG9rZW4pOiByZXR1cm4gdG9rZW4KKyAgICAgICAgZGVmIHNfb3BlcmF0b3Ioc2Nhbm5lciwgdG9rZW4pOiByZXR1cm4gIm9wJXMiICUgdG9rZW4KKyAgICAgICAgZGVmIHNfZmxvYXQoc2Nhbm5lciwgdG9rZW4pOiByZXR1cm4gZmxvYXQodG9rZW4pCisgICAgICAgIGRlZiBzX2ludChzY2FubmVyLCB0b2tlbik6IHJldHVybiBpbnQodG9rZW4pCisKKyAgICAgICAgc2Nhbm5lciA9IFNjYW5uZXIoWworICAgICAgICAgICAgKHIiW2EtekEtWl9dXHcqIiwgc19pZGVudCksCisgICAgICAgICAgICAociJcZCtcLlxkKiIsIHNfZmxvYXQpLAorICAgICAgICAgICAgKHIiXGQrIiwgc19pbnQpLAorICAgICAgICAgICAgKHIiPXxcK3wtfFwqfC8iLCBzX29wZXJhdG9yKSwKKyAgICAgICAgICAgIChyIlxzKyIsIE5vbmUpLAorICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNjYW5uZXIuc2Nhbm5lci5zY2FubmVyKCIiKS5wYXR0ZXJuLCBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Nhbm5lci5zY2FuKCJzdW0gPSAzKmZvbyArIDMxMi41MCArIGJhciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChbJ3N1bScsICdvcD0nLCAzLCAnb3AqJywgJ2ZvbycsICdvcCsnLCAzMTIuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcCsnLCAnYmFyJ10sICcnKSkKKworICAgIGRlZiB0ZXN0X2J1Z180NDg5NTEoc2VsZik6CisgICAgICAgICMgYnVnIDQ0ODk1MSAoc2ltaWxhciB0byA0MjkzNTcsIGJ1dCB3aXRoIHNpbmdsZSBjaGFyIG1hdGNoKQorICAgICAgICAjIChBbHNvIHRlc3QgZ3JlZWR5IG1hdGNoZXMuKQorICAgICAgICBmb3Igb3AgaW4gJycsJz8nLCcqJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocicoKC4lcyk6KT96JyVvcCwgJ3onKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJygoLiVzKTopP3onJW9wLCAnYTp6JykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYTonLCAnYScpKQorCisgICAgZGVmIHRlc3RfYnVnXzcyNTEwNihzZWxmKToKKyAgICAgICAgIyBjYXB0dXJpbmcgZ3JvdXBzIGluIGFsdGVybmF0aXZlcyBpbiByZXBlYXRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ14oKGEpfGIpKicsICdhYmMnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2InLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKChbYWJdKXxjKSonLCAnYWJjJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdjJywgJ2InKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXigoZCl8W2FiXSkqJywgJ2FiYycpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnYicsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKChhKWN8W2FiXSkqJywgJ2FiYycpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnYicsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKChhKXxiKSo/YycsICdhYmMnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2InLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKChbYWJdKXxjKSo/ZCcsICdhYmNkJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdjJywgJ2InKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXigoZCl8W2FiXSkqP2MnLCAnYWJjJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdiJywgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ14oKGEpY3xbYWJdKSo/YycsICdhYmMnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2InLCBOb25lKSkKKworICAgIGRlZiB0ZXN0X2J1Z183MjUxNDkoc2VsZik6CisgICAgICAgICMgbWFya19zdGFja19iYXNlIHJlc3RvcmluZyBiZWZvcmUgcmVzdG9yaW5nIG1hcmtzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJyhhKSg/Oig/PShiKSopYykqJywgJ2FiYicpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnYScsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCcoYSkoKD8hKGIpKikpKicsICdhYmInKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EnLCBOb25lLCBOb25lKSkKKworICAgIGRlZiB0ZXN0X2J1Z183NjQ1NDgoc2VsZik6CisgICAgICAgICMgYnVnIDc2NDU0OCwgcmUuY29tcGlsZSgpIGJhcmZzIG9uIHN0ci91bmljb2RlIHN1YmNsYXNzZXMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdW5pY29kZQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuICAjIG5vIHByb2JsZW0gaWYgd2UgaGF2ZSBubyB1bmljb2RlCisgICAgICAgIGNsYXNzIG15X3VuaWNvZGUodW5pY29kZSk6IHBhc3MKKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZShteV91bmljb2RlKCJhYmMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXQubWF0Y2goInh5eiIpLCBOb25lKQorCisgICAgZGVmIHRlc3RfZmluZGl0ZXIoc2VsZik6CisgICAgICAgIGl0ZXIgPSByZS5maW5kaXRlcihyIjorIiwgImE6Yjo6Yzo6OmQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtpdGVtLmdyb3VwKDApIGZvciBpdGVtIGluIGl0ZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsiOiIsICI6OiIsICI6OjoiXSkKKworICAgIGRlZiB0ZXN0X2J1Z185MjYwNzUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVuaWNvZGUKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAjIG5vIHByb2JsZW0gaWYgd2UgaGF2ZSBubyB1bmljb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5jb21waWxlKCdidWdfOTI2MDc1JykgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICByZS5jb21waWxlKGV2YWwoInUnYnVnXzkyNjA3NSciKSkpCisKKyAgICBkZWYgdGVzdF9idWdfOTMxODQ4KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB1bmljb2RlCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHBhdHRlcm4gPSBldmFsKCd1IltcdTAwMkVcdTMwMDJcdUZGMEVcdUZGNjFdIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuY29tcGlsZShwYXR0ZXJuKS5zcGxpdCgiYS5iLmMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2EnLCdiJywnYyddKQorCisgICAgZGVmIHRlc3RfYnVnXzU4MTA4MChzZWxmKToKKyAgICAgICAgaXRlciA9IHJlLmZpbmRpdGVyKHIiXHMiLCAiYSBiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVyLm5leHQoKS5zcGFuKCksICgxLDIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBpdGVyLm5leHQpCisKKyAgICAgICAgc2Nhbm5lciA9IHJlLmNvbXBpbGUociJccyIpLnNjYW5uZXIoImEgYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Nhbm5lci5zZWFyY2goKS5zcGFuKCksICgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzY2FubmVyLnNlYXJjaCgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfYnVnXzgxNzIzNChzZWxmKToKKyAgICAgICAgaXRlciA9IHJlLmZpbmRpdGVyKHIiLioiLCAiYXNkZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlci5uZXh0KCkuc3BhbigpLCAoMCwgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlci5uZXh0KCkuc3BhbigpLCAoNCwgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIGl0ZXIubmV4dCkKKworICAgIGRlZiB0ZXN0X2J1Z182NTYxKHNlbGYpOgorICAgICAgICAjICdcZCcgc2hvdWxkIG1hdGNoIGNoYXJhY3RlcnMgaW4gVW5pY29kZSBjYXRlZ29yeSAnTmQnCisgICAgICAgICMgKE51bWJlciwgRGVjaW1hbCBEaWdpdCksIGJ1dCBub3QgdGhvc2UgaW4gJ05sJyAoTnVtYmVyLAorICAgICAgICAjIExldHRlcikgb3IgJ05vJyAoTnVtYmVyLCBPdGhlcikuCisgICAgICAgIGRlY2ltYWxfZGlnaXRzID0gWworICAgICAgICAgICAgdSdcdTAwMzcnLCAjICdcTntESUdJVCBTRVZFTn0nLCBjYXRlZ29yeSAnTmQnCisgICAgICAgICAgICB1J1x1MGU1OCcsICMgJ1xOe1RIQUkgRElHSVQgU0lYfScsIGNhdGVnb3J5ICdOZCcKKyAgICAgICAgICAgIHUnXHVmZjEwJywgIyAnXE57RlVMTFdJRFRIIERJR0lUIFpFUk99JywgY2F0ZWdvcnkgJ05kJworICAgICAgICAgICAgXQorICAgICAgICBmb3IgeCBpbiBkZWNpbWFsX2RpZ2l0czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ15cZCQnLCB4LCByZS5VTklDT0RFKS5ncm91cCgwKSwgeCkKKworICAgICAgICBub3RfZGVjaW1hbF9kaWdpdHMgPSBbCisgICAgICAgICAgICB1J1x1MjE2NScsICMgJ1xOe1JPTUFOIE5VTUVSQUwgU0lYfScsIGNhdGVnb3J5ICdObCcKKyAgICAgICAgICAgIHUnXHUzMDM5JywgIyAnXE57SEFOR1pIT1UgTlVNRVJBTCBUV0VOVFl9JywgY2F0ZWdvcnkgJ05sJworICAgICAgICAgICAgdSdcdTIwODInLCAjICdcTntTVUJTQ1JJUFQgVFdPfScsIGNhdGVnb3J5ICdObycKKyAgICAgICAgICAgIHUnXHUzMmI0JywgIyAnXE57Q0lSQ0xFRCBOVU1CRVIgVEhJUlRZIE5JTkV9JywgY2F0ZWdvcnkgJ05vJworICAgICAgICAgICAgXQorICAgICAgICBmb3IgeCBpbiBub3RfZGVjaW1hbF9kaWdpdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaCgnXlxkJCcsIHgsIHJlLlVOSUNPREUpKQorCisgICAgZGVmIHRlc3RfZW1wdHlfYXJyYXkoc2VsZik6CisgICAgICAgICMgU0YgYnVmIDE2NDc1NDEKKyAgICAgICAgaW1wb3J0IGFycmF5CisgICAgICAgIGZvciB0eXBlY29kZSBpbiAnY2JCdWhIaUlsTGZkJzoKKyAgICAgICAgICAgIGEgPSBhcnJheS5hcnJheSh0eXBlY29kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuY29tcGlsZSgiYmxhIikubWF0Y2goYSksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmNvbXBpbGUoIiIpLm1hdGNoKGEpLmdyb3VwcygpLCAoKSkKKworICAgIGRlZiB0ZXN0X2lubGluZV9mbGFncyhzZWxmKToKKyAgICAgICAgIyBCdWcgIzE3MDAKKyAgICAgICAgdXBwZXJfY2hhciA9IHVuaWNocigweDFlYTApICMgTGF0aW4gQ2FwaXRhbCBMZXR0ZXIgQSB3aXRoIERvdCBCZWxsb3cKKyAgICAgICAgbG93ZXJfY2hhciA9IHVuaWNocigweDFlYTEpICMgTGF0aW4gU21hbGwgTGV0dGVyIEEgd2l0aCBEb3QgQmVsbG93CisKKyAgICAgICAgcCA9IHJlLmNvbXBpbGUodXBwZXJfY2hhciwgcmUuSSB8IHJlLlUpCisgICAgICAgIHEgPSBwLm1hdGNoKGxvd2VyX2NoYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocSwgTm9uZSkKKworICAgICAgICBwID0gcmUuY29tcGlsZShsb3dlcl9jaGFyLCByZS5JIHwgcmUuVSkKKyAgICAgICAgcSA9IHAubWF0Y2godXBwZXJfY2hhcikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChxLCBOb25lKQorCisgICAgICAgIHAgPSByZS5jb21waWxlKCcoP2kpJyArIHVwcGVyX2NoYXIsIHJlLlUpCisgICAgICAgIHEgPSBwLm1hdGNoKGxvd2VyX2NoYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocSwgTm9uZSkKKworICAgICAgICBwID0gcmUuY29tcGlsZSgnKD9pKScgKyBsb3dlcl9jaGFyLCByZS5VKQorICAgICAgICBxID0gcC5tYXRjaCh1cHBlcl9jaGFyKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHEsIE5vbmUpCisKKyAgICAgICAgcCA9IHJlLmNvbXBpbGUoJyg/aXUpJyArIHVwcGVyX2NoYXIpCisgICAgICAgIHEgPSBwLm1hdGNoKGxvd2VyX2NoYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocSwgTm9uZSkKKworICAgICAgICBwID0gcmUuY29tcGlsZSgnKD9pdSknICsgbG93ZXJfY2hhcikKKyAgICAgICAgcSA9IHAubWF0Y2godXBwZXJfY2hhcikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChxLCBOb25lKQorCisgICAgZGVmIHRlc3RfZG9sbGFyX21hdGNoZXNfdHdpY2Uoc2VsZik6CisgICAgICAgICIkIG1hdGNoZXMgdGhlIGVuZCBvZiBzdHJpbmcsIGFuZCBqdXN0IGJlZm9yZSB0aGUgdGVybWluYXRpbmcgXG4iCisgICAgICAgIHBhdHRlcm4gPSByZS5jb21waWxlKCckJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXR0ZXJuLnN1YignIycsICdhXG5iXG4nKSwgJ2FcbmIjXG4jJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXR0ZXJuLnN1YignIycsICdhXG5iXG5jJyksICdhXG5iXG5jIycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0dGVybi5zdWIoJyMnLCAnXG4nKSwgJyNcbiMnKQorCisgICAgICAgIHBhdHRlcm4gPSByZS5jb21waWxlKCckJywgcmUuTVVMVElMSU5FKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdHRlcm4uc3ViKCcjJywgJ2FcbmJcbicgKSwgJ2EjXG5iI1xuIycgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdHRlcm4uc3ViKCcjJywgJ2FcbmJcbmMnKSwgJ2EjXG5iI1xuYyMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdHRlcm4uc3ViKCcjJywgJ1xuJyksICcjXG4jJykKKworICAgIGRlZiB0ZXN0X2RlYWxsb2Moc2VsZik6CisgICAgICAgICMgaXNzdWUgMzI5OTogY2hlY2sgZm9yIHNlZ2ZhdWx0IGluIGRlYnVnIGJ1aWxkCisgICAgICAgIGltcG9ydCBfc3JlCisgICAgICAgICMgdGhlIG92ZXJmbG93IGxpbWl0IGlzIGRpZmZlcmVudCBvbiB3aWRlIGFuZCBuYXJyb3cgYnVpbGRzIGFuZCBpdAorICAgICAgICAjIGRlcGVuZHMgb24gdGhlIGRlZmluaXRpb24gb2YgU1JFX0NPREUgKHNlZSBzcmUuaCkuCisgICAgICAgICMgMioqMTI4IHNob3VsZCBiZSBiaWcgZW5vdWdoIHRvIG92ZXJmbG93IG9uIGJvdGguIEZvciBzbWFsbGVyIHZhbHVlcworICAgICAgICAjIGEgUnVudGltZUVycm9yIGlzIHJhaXNlZCBpbnN0ZWFkIG9mIE92ZXJmbG93RXJyb3IuCisgICAgICAgIGxvbmdfb3ZlcmZsb3cgPSAyKioxMjgKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZS5maW5kaXRlciwgImEiLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgX3NyZS5jb21waWxlLCAiYWJjIiwgMCwgW2xvbmdfb3ZlcmZsb3ddKQorCisgICAgZGVmIHRlc3RfY29tcGlsZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHJldHVybiB2YWx1ZSB3aGVuIGdpdmVuIHN0cmluZyBhbmQgcGF0dGVybiBhcyBwYXJhbWV0ZXIKKyAgICAgICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoJ3JhbmRvbSBwYXR0ZXJuJykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBhdHRlcm4sIHJlLl9wYXR0ZXJuX3R5cGUpCisgICAgICAgIHNhbWVfcGF0dGVybiA9IHJlLmNvbXBpbGUocGF0dGVybikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNhbWVfcGF0dGVybiwgcmUuX3BhdHRlcm5fdHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzYW1lX3BhdHRlcm4sIHBhdHRlcm4pCisgICAgICAgICMgVGVzdCBiZWhhdmlvdXIgd2hlbiBub3QgZ2l2ZW4gYSBzdHJpbmcgb3IgcGF0dGVybiBhcyBwYXJhbWV0ZXIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZS5jb21waWxlLCAwKQorCisgICAgZGVmIHRlc3RfYnVnXzEzODk5KHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMzg5OTogcmUgcGF0dGVybiByIltcQV0iIHNob3VsZCB3b3JrIGxpa2UgIkEiIGJ1dCBtYXRjaGVzCisgICAgICAgICMgbm90aGluZy4gRGl0dG8gQiBhbmQgWi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5maW5kYWxsKHInW1xBXEJcYlxDXFpdJywgJ0FCXGJDWicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnQScsICdCJywgJ1xiJywgJ0MnLCAnWiddKQorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fMkcsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X2xhcmdlX3NlYXJjaChzZWxmLCBzaXplKToKKyAgICAgICAgIyBJc3N1ZSAjMTAxODI6IGluZGljZXMgd2VyZSAzMi1iaXQtdHJ1bmNhdGVkLgorICAgICAgICBzID0gJ2EnICogc2l6ZQorICAgICAgICBtID0gcmUuc2VhcmNoKCckJywgcykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnN0YXJ0KCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5lbmQoKSwgc2l6ZSkKKworICAgICMgVGhlIGh1Z2UgbWVtdXNlIGlzIGJlY2F1c2Ugb2YgcmUuc3ViKCkgdXNpbmcgYSBsaXN0IGFuZCBhIGpvaW4oKQorICAgICMgdG8gY3JlYXRlIHRoZSByZXBsYWNlbWVudCByZXN1bHQuCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fMkcsIG1lbXVzZT0xNiArIDIpCisgICAgZGVmIHRlc3RfbGFyZ2Vfc3VibihzZWxmLCBzaXplKToKKyAgICAgICAgIyBJc3N1ZSAjMTAxODI6IGluZGljZXMgd2VyZSAzMi1iaXQtdHJ1bmNhdGVkLgorICAgICAgICBzID0gJ2EnICogc2l6ZQorICAgICAgICByLCBuID0gcmUuc3VibignJywgJycsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuLCBzaXplICsgMSkKKworCisgICAgZGVmIHRlc3RfcmVwZWF0X21pbm1heF9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTMxNjkKKyAgICAgICAgc3RyaW5nID0gIngiICogMTAwMDAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIuezY1NTM1fSIsIHN0cmluZykuc3BhbigpLCAoMCwgNjU1MzUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiLnssNjU1MzV9Iiwgc3RyaW5nKS5zcGFuKCksICgwLCA2NTUzNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIuezY1NTM1LH0/Iiwgc3RyaW5nKS5zcGFuKCksICgwLCA2NTUzNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIuezY1NTM2fSIsIHN0cmluZykuc3BhbigpLCAoMCwgNjU1MzYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiLnssNjU1MzZ9Iiwgc3RyaW5nKS5zcGFuKCksICgwLCA2NTUzNikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIuezY1NTM2LH0/Iiwgc3RyaW5nKS5zcGFuKCksICgwLCA2NTUzNikpCisgICAgICAgICMgMioqMTI4IHNob3VsZCBiZSBiaWcgZW5vdWdoIHRvIG92ZXJmbG93IGJvdGggU1JFX0NPREUgYW5kIFB5X3NzaXplX3QuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHJlLmNvbXBpbGUsIHIiLnslZH0iICUgMioqMTI4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCByZS5jb21waWxlLCByIi57LCVkfSIgJSAyKioxMjgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHJlLmNvbXBpbGUsIHIiLnslZCx9PyIgJSAyKioxMjgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHJlLmNvbXBpbGUsIHIiLnslZCwlZH0iICUgKDIqKjEyOSwgMioqMTI4KSkKKworICAgIEBjcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9yZXBlYXRfbWlubWF4X292ZXJmbG93X21heHJlcGVhdChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBfc3JlIGltcG9ydCBNQVhSRVBFQVQKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgncmVxdWlyZXMgX3NyZS5NQVhSRVBFQVQgY29uc3RhbnQnKQorICAgICAgICBzdHJpbmcgPSAieCIgKiAxMDAwMDAKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gociIueyVkfSIgJSAoTUFYUkVQRUFUIC0gMSksIHN0cmluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIueywlZH0iICUgKE1BWFJFUEVBVCAtIDEpLCBzdHJpbmcpLnNwYW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgMTAwMDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gociIueyVkLH0/IiAlIChNQVhSRVBFQVQgLSAxKSwgc3RyaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcmUuY29tcGlsZSwgciIueyVkfSIgJSBNQVhSRVBFQVQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHJlLmNvbXBpbGUsIHIiLnssJWR9IiAlIE1BWFJFUEVBVCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcmUuY29tcGlsZSwgciIueyVkLH0/IiAlIE1BWFJFUEVBVCkKKworICAgIGRlZiB0ZXN0X2JhY2tyZWZfZ3JvdXBfbmFtZV9pbl9leGNlcHRpb24oc2VsZik6CisgICAgICAgICMgSXNzdWUgMTczNDE6IFBvb3IgZXJyb3IgbWVzc2FnZSB3aGVuIGNvbXBpbGluZyBpbnZhbGlkIHJlZ2V4CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoc3JlX2NvbnN0YW50cy5lcnJvciwgJzxmb28+Jyk6CisgICAgICAgICAgICByZS5jb21waWxlKCcoP1A9PGZvbz4pJykKKworICAgIGRlZiB0ZXN0X2dyb3VwX25hbWVfaW5fZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAjIElzc3VlIDE3MzQxOiBQb29yIGVycm9yIG1lc3NhZ2Ugd2hlbiBjb21waWxpbmcgaW52YWxpZCByZWdleAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKHNyZV9jb25zdGFudHMuZXJyb3IsICdcP2ZvbycpOgorICAgICAgICAgICAgcmUuY29tcGlsZSgnKD9QPD9mb28+KScpCisKKworZGVmIHJ1bl9yZV90ZXN0cygpOgorICAgIGZyb20gdGVzdC5yZV90ZXN0cyBpbXBvcnQgdGVzdHMsIFNVQ0NFRUQsIEZBSUwsIFNZTlRBWF9FUlJPUgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdSdW5uaW5nIHJlX3Rlc3RzIHRlc3Qgc3VpdGUnCisgICAgZWxzZToKKyAgICAgICAgIyBUbyBzYXZlIHRpbWUsIG9ubHkgcnVuIHRoZSBmaXJzdCBhbmQgbGFzdCAxMCB0ZXN0cworICAgICAgICAjdGVzdHMgPSB0ZXN0c1s6MTBdICsgdGVzdHNbLTEwOl0KKyAgICAgICAgcGFzcworCisgICAgZm9yIHQgaW4gdGVzdHM6CisgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICBwYXR0ZXJuID0gcyA9IG91dGNvbWUgPSByZXBsID0gZXhwZWN0ZWQgPSBOb25lCisgICAgICAgIGlmIGxlbih0KSA9PSA1OgorICAgICAgICAgICAgcGF0dGVybiwgcywgb3V0Y29tZSwgcmVwbCwgZXhwZWN0ZWQgPSB0CisgICAgICAgIGVsaWYgbGVuKHQpID09IDM6CisgICAgICAgICAgICBwYXR0ZXJuLCBzLCBvdXRjb21lID0gdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgKCdUZXN0IHR1cGxlcyBzaG91bGQgaGF2ZSAzIG9yIDUgZmllbGRzJywgdCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBvYmogPSByZS5jb21waWxlKHBhdHRlcm4pCisgICAgICAgIGV4Y2VwdCByZS5lcnJvcjoKKyAgICAgICAgICAgIGlmIG91dGNvbWUgPT0gU1lOVEFYX0VSUk9SOiBwYXNzICAjIEV4cGVjdGVkIGEgc3ludGF4IGVycm9yCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICc9PT0gU3ludGF4IGVycm9yOicsIHQKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OiByYWlzZSBLZXlib2FyZEludGVycnVwdAorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwcmludCAnKioqIFVuZXhwZWN0ZWQgZXJyb3IgKioqJywgdAorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKGZpbGU9c3lzLnN0ZG91dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBvYmouc2VhcmNoKHMpCisgICAgICAgICAgICBleGNlcHQgcmUuZXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBwcmludCAnPT09IFVuZXhwZWN0ZWQgZXhjZXB0aW9uJywgdCwgcmVwcihtc2cpCisgICAgICAgICAgICBpZiBvdXRjb21lID09IFNZTlRBWF9FUlJPUjoKKyAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGhhdmUgYmVlbiBhIHN5bnRheCBlcnJvcjsgZm9yZ2V0IGl0LgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsaWYgb3V0Y29tZSA9PSBGQUlMOgorICAgICAgICAgICAgICAgIGlmIHJlc3VsdCBpcyBOb25lOiBwYXNzICAgIyBObyBtYXRjaCwgYXMgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICBlbHNlOiBwcmludCAnPT09IFN1Y2NlZWRlZCBpbmNvcnJlY3RseScsIHQKKyAgICAgICAgICAgIGVsaWYgb3V0Y29tZSA9PSBTVUNDRUVEOgorICAgICAgICAgICAgICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBNYXRjaGVkLCBhcyBleHBlY3RlZCwgc28gbm93IHdlIGNvbXB1dGUgdGhlCisgICAgICAgICAgICAgICAgICAgICMgcmVzdWx0IHN0cmluZyBhbmQgY29tcGFyZSBpdCB0byBvdXIgZXhwZWN0ZWQgcmVzdWx0LgorICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kID0gcmVzdWx0LnNwYW4oMCkKKyAgICAgICAgICAgICAgICAgICAgdmFyZGljdD17J2ZvdW5kJzogcmVzdWx0Lmdyb3VwKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3JvdXBzJzogcmVzdWx0Lmdyb3VwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmbGFncyc6IHJlc3VsdC5yZS5mbGFnc30KKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgMTAwKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaSA9IHJlc3VsdC5ncm91cChpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU3BlY2lhbCBoYWNrIGJlY2F1c2UgZWxzZSB0aGUgc3RyaW5nIGNvbmNhdCBmYWlsczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBnaSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaSA9ICJOb25lIgorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2kgPSAiRXJyb3IiCisgICAgICAgICAgICAgICAgICAgICAgICB2YXJkaWN0WydnJWQnICUgaV0gPSBnaQorICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXN1bHQucmUuZ3JvdXBpbmRleC5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2kgPSByZXN1bHQuZ3JvdXAoaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBnaSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaSA9ICJOb25lIgorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2kgPSAiRXJyb3IiCisgICAgICAgICAgICAgICAgICAgICAgICB2YXJkaWN0W2ldID0gZ2kKKyAgICAgICAgICAgICAgICAgICAgcmVwbCA9IGV2YWwocmVwbCwgdmFyZGljdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVwbCAhPSBleHBlY3RlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICc9PT0gZ3JvdXBpbmcgZXJyb3InLCB0LAorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgcmVwcihyZXBsKSArICcgc2hvdWxkIGJlICcgKyByZXByKGV4cGVjdGVkKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICc9PT0gRmFpbGVkIGluY29ycmVjdGx5JywgdAorCisgICAgICAgICAgICAgICAgIyBUcnkgdGhlIG1hdGNoIG9uIGEgdW5pY29kZSBzdHJpbmcsIGFuZCBjaGVjayB0aGF0IGl0CisgICAgICAgICAgICAgICAgIyBzdGlsbCBzdWNjZWVkcy4KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9iai5zZWFyY2godW5pY29kZShzLCAibGF0aW4tMSIpKQorICAgICAgICAgICAgICAgICAgICBpZiByZXN1bHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICc9PT0gRmFpbHMgb24gdW5pY29kZSBtYXRjaCcsIHQKKyAgICAgICAgICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAjIDEuNS4yCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgIyB1bmljb2RlIHRlc3QgY2FzZQorCisgICAgICAgICAgICAgICAgIyBUcnkgdGhlIG1hdGNoIG9uIGEgdW5pY29kZSBwYXR0ZXJuLCBhbmQgY2hlY2sgdGhhdCBpdAorICAgICAgICAgICAgICAgICMgc3RpbGwgc3VjY2VlZHMuCisgICAgICAgICAgICAgICAgb2JqPXJlLmNvbXBpbGUodW5pY29kZShwYXR0ZXJuLCAibGF0aW4tMSIpKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9iai5zZWFyY2gocykKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJz09PSBGYWlscyBvbiB1bmljb2RlIHBhdHRlcm4gbWF0Y2gnLCB0CisKKyAgICAgICAgICAgICAgICAjIFRyeSB0aGUgbWF0Y2ggd2l0aCB0aGUgc2VhcmNoIGFyZWEgbGltaXRlZCB0byB0aGUgZXh0ZW50CisgICAgICAgICAgICAgICAgIyBvZiB0aGUgbWF0Y2ggYW5kIHNlZSBpZiBpdCBzdGlsbCBzdWNjZWVkcy4gIFxCIHdpbGwKKyAgICAgICAgICAgICAgICAjIGJyZWFrIChiZWNhdXNlIGl0IHdvbid0IG1hdGNoIGF0IHRoZSBlbmQgb3Igc3RhcnQgb2YgYQorICAgICAgICAgICAgICAgICMgc3RyaW5nKSwgc28gd2UnbGwgaWdub3JlIHBhdHRlcm5zIHRoYXQgZmVhdHVyZSBpdC4KKworICAgICAgICAgICAgICAgIGlmIHBhdHRlcm5bOjJdICE9ICdcXEInIGFuZCBwYXR0ZXJuWy0yOl0gIT0gJ1xcQicgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZXN1bHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG9iaiA9IHJlLmNvbXBpbGUocGF0dGVybikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gb2JqLnNlYXJjaChzLCByZXN1bHQuc3RhcnQoMCksIHJlc3VsdC5lbmQoMCkgKyAxKQorICAgICAgICAgICAgICAgICAgICBpZiByZXN1bHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICc9PT0gRmFpbGVkIG9uIHJhbmdlLWxpbWl0ZWQgbWF0Y2gnLCB0CisKKyAgICAgICAgICAgICAgICAjIFRyeSB0aGUgbWF0Y2ggd2l0aCBJR05PUkVDQVNFIGVuYWJsZWQsIGFuZCBjaGVjayB0aGF0IGl0CisgICAgICAgICAgICAgICAgIyBzdGlsbCBzdWNjZWVkcy4KKyAgICAgICAgICAgICAgICBvYmogPSByZS5jb21waWxlKHBhdHRlcm4sIHJlLklHTk9SRUNBU0UpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gb2JqLnNlYXJjaChzKQorICAgICAgICAgICAgICAgIGlmIHJlc3VsdCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnPT09IEZhaWxzIG9uIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2gnLCB0CisKKyAgICAgICAgICAgICAgICAjIFRyeSB0aGUgbWF0Y2ggd2l0aCBMT0NBTEUgZW5hYmxlZCwgYW5kIGNoZWNrIHRoYXQgaXQKKyAgICAgICAgICAgICAgICAjIHN0aWxsIHN1Y2NlZWRzLgorICAgICAgICAgICAgICAgIG9iaiA9IHJlLmNvbXBpbGUocGF0dGVybiwgcmUuTE9DQUxFKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9iai5zZWFyY2gocykKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJz09PSBGYWlscyBvbiBsb2NhbGUtc2Vuc2l0aXZlIG1hdGNoJywgdAorCisgICAgICAgICAgICAgICAgIyBUcnkgdGhlIG1hdGNoIHdpdGggVU5JQ09ERSBsb2NhbGUgZW5hYmxlZCwgYW5kIGNoZWNrCisgICAgICAgICAgICAgICAgIyB0aGF0IGl0IHN0aWxsIHN1Y2NlZWRzLgorICAgICAgICAgICAgICAgIG9iaiA9IHJlLmNvbXBpbGUocGF0dGVybiwgcmUuVU5JQ09ERSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBvYmouc2VhcmNoKHMpCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICc9PT0gRmFpbHMgb24gdW5pY29kZS1zZW5zaXRpdmUgbWF0Y2gnLCB0CisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoUmVUZXN0cykKKyAgICBydW5fcmVfdGVzdHMoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkZjk5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhkZjk5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZWFkbGluZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlYWRsaW5lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NWM3ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZWFkbGluZS5weQpAQCAtMCwwICsxLDQ3IEBACisiIiIKK1ZlcnkgbWluaW1hbCB1bml0dGVzdHMgZm9yIHBhcnRzIG9mIHRoZSByZWFkbGluZSBtb2R1bGUuCisKK1RoZXNlIHRlc3RzIHdlcmUgYWRkZWQgdG8gY2hlY2sgdGhhdCB0aGUgbGliZWRpdCBlbXVsYXRpb24gb24gT1NYIGFuZAordGhlICJyZWFsIiByZWFkbGluZSBoYXZlIHRoZSBzYW1lIGludGVyZmFjZSBmb3IgaGlzdG9yeSBtYW5pcHVsYXRpb24uIFRoYXQncword2h5IHRoZSB0ZXN0cyBjb3ZlciBvbmx5IGEgc21hbGwgc3Vic2V0IG9mIHRoZSBpbnRlcmZhY2UuCisiIiIKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBpbXBvcnRfbW9kdWxlCisKKyMgU2tpcCB0ZXN0cyBpZiB0aGVyZSBpcyBubyByZWFkbGluZSBtb2R1bGUKK3JlYWRsaW5lID0gaW1wb3J0X21vZHVsZSgncmVhZGxpbmUnKQorCitjbGFzcyBUZXN0SGlzdG9yeU1hbmlwdWxhdGlvbiAodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQHVuaXR0ZXN0LnNraXBJZihub3QgaGFzYXR0cihyZWFkbGluZSwgJ2NsZWFyX2hpc3RvcnknKSwKKyAgICAgICAgICAgICAgICAgICAgICJUaGUgaGlzdG9yeSB1cGRhdGUgdGVzdCBjYW5ub3QgYmUgcnVuIGJlY2F1c2UgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICJjbGVhcl9oaXN0b3J5IG1ldGhvZCBpcyBub3QgYXZhaWxhYmxlLiIpCisgICAgZGVmIHRlc3RIaXN0b3J5VXBkYXRlcyhzZWxmKToKKyAgICAgICAgcmVhZGxpbmUuY2xlYXJfaGlzdG9yeSgpCisKKyAgICAgICAgcmVhZGxpbmUuYWRkX2hpc3RvcnkoImZpcnN0IGxpbmUiKQorICAgICAgICByZWFkbGluZS5hZGRfaGlzdG9yeSgic2Vjb25kIGxpbmUiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGxpbmUuZ2V0X2hpc3RvcnlfaXRlbSgwKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkbGluZS5nZXRfaGlzdG9yeV9pdGVtKDEpLCAiZmlyc3QgbGluZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGxpbmUuZ2V0X2hpc3RvcnlfaXRlbSgyKSwgInNlY29uZCBsaW5lIikKKworICAgICAgICByZWFkbGluZS5yZXBsYWNlX2hpc3RvcnlfaXRlbSgwLCAicmVwbGFjZWQgbGluZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGxpbmUuZ2V0X2hpc3RvcnlfaXRlbSgwKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkbGluZS5nZXRfaGlzdG9yeV9pdGVtKDEpLCAicmVwbGFjZWQgbGluZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGxpbmUuZ2V0X2hpc3RvcnlfaXRlbSgyKSwgInNlY29uZCBsaW5lIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRsaW5lLmdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoKCksIDIpCisKKyAgICAgICAgcmVhZGxpbmUucmVtb3ZlX2hpc3RvcnlfaXRlbSgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRsaW5lLmdldF9oaXN0b3J5X2l0ZW0oMCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGxpbmUuZ2V0X2hpc3RvcnlfaXRlbSgxKSwgInNlY29uZCBsaW5lIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRsaW5lLmdldF9jdXJyZW50X2hpc3RvcnlfbGVuZ3RoKCksIDEpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUZXN0SGlzdG9yeU1hbmlwdWxhdGlvbikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVhZGxpbmUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVhZGxpbmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTU5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZWFkbGluZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVhZGxpbmUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVhZGxpbmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTU5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZWFkbGluZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVwci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlcHIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyZmNjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlcHIucHkKQEAgLTAsMCArMSwzMjcgQEAKKyIiIgorICBUZXN0IGNhc2VzIGZvciB0aGUgcmVwciBtb2R1bGUKKyAgTmljayBNYXRoZXdzb24KKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNoZWNrX3B5M2tfd2FybmluZ3MKK2Zyb20gcmVwciBpbXBvcnQgcmVwciBhcyByICMgRG9uJ3Qgc2hhZG93IGJ1aWx0aW4gcmVwcgorZnJvbSByZXByIGltcG9ydCBSZXByCisKKworZGVmIG5lc3RlZFR1cGxlKG5lc3RpbmcpOgorICAgIHQgPSAoKQorICAgIGZvciBpIGluIHJhbmdlKG5lc3RpbmcpOgorICAgICAgICB0ID0gKHQsKQorICAgIHJldHVybiB0CisKK2NsYXNzIFJlcHJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShyKCJhYmMiKSwgIidhYmMnIikKKyAgICAgICAgZXEocigiYWJjZGVmZ2hpamtsbW5vcCIpLCInYWJjZGVmZ2hpamtsbW5vcCciKQorCisgICAgICAgIHMgPSAiYSIqMzArImIiKjMwCisgICAgICAgIGV4cGVjdGVkID0gcmVwcihzKVs6MTNdICsgIi4uLiIgKyByZXByKHMpWy0xNDpdCisgICAgICAgIGVxKHIocyksIGV4cGVjdGVkKQorCisgICAgICAgIGVxKHIoIlwiJyIpLCByZXByKCJcIiciKSkKKyAgICAgICAgcyA9ICJcIiIqMzArIiciKjEwMAorICAgICAgICBleHBlY3RlZCA9IHJlcHIocylbOjEzXSArICIuLi4iICsgcmVwcihzKVstMTQ6XQorICAgICAgICBlcShyKHMpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3R1cGxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEocigoMSwpKSwgIigxLCkiKQorCisgICAgICAgIHQzID0gKDEsIDIsIDMpCisgICAgICAgIGVxKHIodDMpLCAiKDEsIDIsIDMpIikKKworICAgICAgICByMiA9IFJlcHIoKQorICAgICAgICByMi5tYXh0dXBsZSA9IDIKKyAgICAgICAgZXhwZWN0ZWQgPSByZXByKHQzKVs6LTJdICsgIi4uLikiCisgICAgICAgIGVxKHIyLnJlcHIodDMpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5lcihzZWxmKToKKyAgICAgICAgZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKKyAgICAgICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKKworICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUdXBsZXMgZ2l2ZSB1cCBhZnRlciA2IGVsZW1lbnRzCisgICAgICAgIGVxKHIoKCkpLCAiKCkiKQorICAgICAgICBlcShyKCgxLCkpLCAiKDEsKSIpCisgICAgICAgIGVxKHIoKDEsIDIsIDMpKSwgIigxLCAyLCAzKSIpCisgICAgICAgIGVxKHIoKDEsIDIsIDMsIDQsIDUsIDYpKSwgIigxLCAyLCAzLCA0LCA1LCA2KSIpCisgICAgICAgIGVxKHIoKDEsIDIsIDMsIDQsIDUsIDYsIDcpKSwgIigxLCAyLCAzLCA0LCA1LCA2LCAuLi4pIikKKworICAgICAgICAjIExpc3RzIGdpdmUgdXAgYWZ0ZXIgNiBhcyB3ZWxsCisgICAgICAgIGVxKHIoW10pLCAiW10iKQorICAgICAgICBlcShyKFsxXSksICJbMV0iKQorICAgICAgICBlcShyKFsxLCAyLCAzXSksICJbMSwgMiwgM10iKQorICAgICAgICBlcShyKFsxLCAyLCAzLCA0LCA1LCA2XSksICJbMSwgMiwgMywgNCwgNSwgNl0iKQorICAgICAgICBlcShyKFsxLCAyLCAzLCA0LCA1LCA2LCA3XSksICJbMSwgMiwgMywgNCwgNSwgNiwgLi4uXSIpCisKKyAgICAgICAgIyBTZXRzIGdpdmUgdXAgYWZ0ZXIgNiBhcyB3ZWxsCisgICAgICAgIGVxKHIoc2V0KFtdKSksICJzZXQoW10pIikKKyAgICAgICAgZXEocihzZXQoWzFdKSksICJzZXQoWzFdKSIpCisgICAgICAgIGVxKHIoc2V0KFsxLCAyLCAzXSkpLCAic2V0KFsxLCAyLCAzXSkiKQorICAgICAgICBlcShyKHNldChbMSwgMiwgMywgNCwgNSwgNl0pKSwgInNldChbMSwgMiwgMywgNCwgNSwgNl0pIikKKyAgICAgICAgZXEocihzZXQoWzEsIDIsIDMsIDQsIDUsIDYsIDddKSksICJzZXQoWzEsIDIsIDMsIDQsIDUsIDYsIC4uLl0pIikKKworICAgICAgICAjIEZyb3plbnNldHMgZ2l2ZSB1cCBhZnRlciA2IGFzIHdlbGwKKyAgICAgICAgZXEocihmcm96ZW5zZXQoW10pKSwgImZyb3plbnNldChbXSkiKQorICAgICAgICBlcShyKGZyb3plbnNldChbMV0pKSwgImZyb3plbnNldChbMV0pIikKKyAgICAgICAgZXEocihmcm96ZW5zZXQoWzEsIDIsIDNdKSksICJmcm96ZW5zZXQoWzEsIDIsIDNdKSIpCisgICAgICAgIGVxKHIoZnJvemVuc2V0KFsxLCAyLCAzLCA0LCA1LCA2XSkpLCAiZnJvemVuc2V0KFsxLCAyLCAzLCA0LCA1LCA2XSkiKQorICAgICAgICBlcShyKGZyb3plbnNldChbMSwgMiwgMywgNCwgNSwgNiwgN10pKSwgImZyb3plbnNldChbMSwgMiwgMywgNCwgNSwgNiwgLi4uXSkiKQorCisgICAgICAgICMgY29sbGVjdGlvbnMuZGVxdWUgYWZ0ZXIgNgorICAgICAgICBlcShyKGRlcXVlKFsxLCAyLCAzLCA0LCA1LCA2LCA3XSkpLCAiZGVxdWUoWzEsIDIsIDMsIDQsIDUsIDYsIC4uLl0pIikKKworICAgICAgICAjIERpY3Rpb25hcmllcyBnaXZlIHVwIGFmdGVyIDQuCisgICAgICAgIGVxKHIoe30pLCAie30iKQorICAgICAgICBkID0geydhbGljZSc6IDEsICdib2InOiAyLCAnY2hhcmxlcyc6IDMsICdkYXZlJzogNH0KKyAgICAgICAgZXEocihkKSwgInsnYWxpY2UnOiAxLCAnYm9iJzogMiwgJ2NoYXJsZXMnOiAzLCAnZGF2ZSc6IDR9IikKKyAgICAgICAgZFsnYXJ0aHVyJ10gPSAxCisgICAgICAgIGVxKHIoZCksICJ7J2FsaWNlJzogMSwgJ2FydGh1cic6IDEsICdib2InOiAyLCAnY2hhcmxlcyc6IDMsIC4uLn0iKQorCisgICAgICAgICMgYXJyYXkuYXJyYXkgYWZ0ZXIgNS4KKyAgICAgICAgZXEocihhcnJheSgnaScpKSwgImFycmF5KCdpJywgW10pIikKKyAgICAgICAgZXEocihhcnJheSgnaScsIFsxXSkpLCAiYXJyYXkoJ2knLCBbMV0pIikKKyAgICAgICAgZXEocihhcnJheSgnaScsIFsxLCAyXSkpLCAiYXJyYXkoJ2knLCBbMSwgMl0pIikKKyAgICAgICAgZXEocihhcnJheSgnaScsIFsxLCAyLCAzXSkpLCAiYXJyYXkoJ2knLCBbMSwgMiwgM10pIikKKyAgICAgICAgZXEocihhcnJheSgnaScsIFsxLCAyLCAzLCA0XSkpLCAiYXJyYXkoJ2knLCBbMSwgMiwgMywgNF0pIikKKyAgICAgICAgZXEocihhcnJheSgnaScsIFsxLCAyLCAzLCA0LCA1XSkpLCAiYXJyYXkoJ2knLCBbMSwgMiwgMywgNCwgNV0pIikKKyAgICAgICAgZXEocihhcnJheSgnaScsIFsxLCAyLCAzLCA0LCA1LCA2XSkpLAorICAgICAgICAgICAgICAgICAgICJhcnJheSgnaScsIFsxLCAyLCAzLCA0LCA1LCAuLi5dKSIpCisKKyAgICBkZWYgdGVzdF9udW1iZXJzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEocigxMjMpLCByZXByKDEyMykpCisgICAgICAgIGVxKHIoMTIzTCksIHJlcHIoMTIzTCkpCisgICAgICAgIGVxKHIoMS4wLzMpLCByZXByKDEuMC8zKSkKKworICAgICAgICBuID0gMTBMKioxMDAKKyAgICAgICAgZXhwZWN0ZWQgPSByZXByKG4pWzoxOF0gKyAiLi4uIiArIHJlcHIobilbLTE5Ol0KKyAgICAgICAgZXEocihuKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9pbnN0YW5jZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGkxID0gQ2xhc3NXaXRoUmVwcigiYSIpCisgICAgICAgIGVxKHIoaTEpLCByZXByKGkxKSkKKworICAgICAgICBpMiA9IENsYXNzV2l0aFJlcHIoIngiKjEwMDApCisgICAgICAgIGV4cGVjdGVkID0gcmVwcihpMilbOjEzXSArICIuLi4iICsgcmVwcihpMilbLTE0Ol0KKyAgICAgICAgZXEocihpMiksIGV4cGVjdGVkKQorCisgICAgICAgIGkzID0gQ2xhc3NXaXRoRmFpbGluZ1JlcHIoKQorICAgICAgICBlcShyKGkzKSwgKCI8Q2xhc3NXaXRoRmFpbGluZ1JlcHIgaW5zdGFuY2UgYXQgJXg+IiVpZChpMykpKQorCisgICAgICAgIHMgPSByKENsYXNzV2l0aEZhaWxpbmdSZXByKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCI8Y2xhc3MgIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmVuZHN3aXRoKCI+IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmZpbmQoIi4uLiIpID09IDgpCisKKyAgICBkZWYgdGVzdF9maWxlKHNlbGYpOgorICAgICAgICBmcCA9IG9wZW4odW5pdHRlc3QuX19maWxlX18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGZwKS5zdGFydHN3aXRoKAorICAgICAgICAgICAgIjxvcGVuIGZpbGUgJXIsIG1vZGUgJ3InIGF0IDB4IiAlIHVuaXR0ZXN0Ll9fZmlsZV9fKSkKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihmcCkuc3RhcnRzd2l0aCgKKyAgICAgICAgICAgICI8Y2xvc2VkIGZpbGUgJXIsIG1vZGUgJ3InIGF0IDB4IiAlIHVuaXR0ZXN0Ll9fZmlsZV9fKSkKKworICAgIGRlZiB0ZXN0X2xhbWJkYShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIobGFtYmRhIHg6IHgpLnN0YXJ0c3dpdGgoCisgICAgICAgICAgICAiPGZ1bmN0aW9uIDxsYW1iZGEiKSkKKyAgICAgICAgIyBYWFggYW5vbnltb3VzIGZ1bmN0aW9ucz8gIHNlZSBmdW5jX3JlcHIKKworICAgIGRlZiB0ZXN0X2J1aWx0aW5fZnVuY3Rpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIEZ1bmN0aW9ucworICAgICAgICBlcShyZXByKGhhc2gpLCAnPGJ1aWx0LWluIGZ1bmN0aW9uIGhhc2g+JykKKyAgICAgICAgIyBNZXRob2RzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKCcnLnNwbGl0KS5zdGFydHN3aXRoKAorICAgICAgICAgICAgJzxidWlsdC1pbiBtZXRob2Qgc3BsaXQgb2Ygc3RyIG9iamVjdCBhdCAweCcpKQorCisgICAgZGVmIHRlc3RfeHJhbmdlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEocmVwcih4cmFuZ2UoMSkpLCAneHJhbmdlKDEpJykKKyAgICAgICAgZXEocmVwcih4cmFuZ2UoMSwgMikpLCAneHJhbmdlKDEsIDIpJykKKyAgICAgICAgZXEocmVwcih4cmFuZ2UoMSwgMiwgMykpLCAneHJhbmdlKDEsIDQsIDMpJykKKworICAgIGRlZiB0ZXN0X25lc3Rpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIGV2ZXJ5dGhpbmcgaXMgbWVhbnQgdG8gZ2l2ZSB1cCBhZnRlciA2IGxldmVscy4KKyAgICAgICAgZXEocihbW1tbW1tbXV1dXV1dXSksICJbW1tbW1tbXV1dXV1dXSIpCisgICAgICAgIGVxKHIoW1tbW1tbW1tdXV1dXV1dXSksICJbW1tbW1tbLi4uXV1dXV1dXSIpCisKKyAgICAgICAgZXEocihuZXN0ZWRUdXBsZSg2KSksICIoKCgoKCgoKSwpLCksKSwpLCksKSIpCisgICAgICAgIGVxKHIobmVzdGVkVHVwbGUoNykpLCAiKCgoKCgoKC4uLiksKSwpLCksKSwpLCkiKQorCisgICAgICAgIGVxKHIoeyBuZXN0ZWRUdXBsZSg1KSA6IG5lc3RlZFR1cGxlKDUpIH0pLAorICAgICAgICAgICAieygoKCgoKCksKSwpLCksKSwpOiAoKCgoKCgpLCksKSwpLCksKX0iKQorICAgICAgICBlcShyKHsgbmVzdGVkVHVwbGUoNikgOiBuZXN0ZWRUdXBsZSg2KSB9KSwKKyAgICAgICAgICAgInsoKCgoKCguLi4pLCksKSwpLCksKTogKCgoKCgoLi4uKSwpLCksKSwpLCl9IikKKworICAgICAgICBlcShyKFtbW1tbW3t9XV1dXV1dKSwgIltbW1tbW3t9XV1dXV1dIikKKyAgICAgICAgZXEocihbW1tbW1tbe31dXV1dXV1dKSwgIltbW1tbW1suLi5dXV1dXV1dIikKKworICAgIGRlZiB0ZXN0X2J1ZmZlcihzZWxmKToKKyAgICAgICAgIyBYWFggZG9lc24ndCB0ZXN0IGJ1ZmZlcnMgd2l0aCBubyBiX2Jhc2Ugb3IgcmVhZC13cml0ZSBidWZmZXJzIChzZWUKKyAgICAgICAgIyBidWZmZXJvYmplY3QuYykuICBUaGUgdGVzdCBpcyBmYWlybHkgaW5jb21wbGV0ZSB0b28uICBTaWdoLgorICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHggPSBidWZmZXIoJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKHgpLnN0YXJ0c3dpdGgoJzxyZWFkLW9ubHkgYnVmZmVyIGZvciAweCcpKQorCisgICAgZGVmIHRlc3RfY2VsbChzZWxmKToKKyAgICAgICAgIyBYWFggSG1tPyBIb3cgdG8gZ2V0IGF0IGEgY2VsbCBvYmplY3Q/CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2Rlc2NyaXB0b3JzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBtZXRob2QgZGVzY3JpcHRvcnMKKyAgICAgICAgZXEocmVwcihkaWN0Lml0ZW1zKSwgIjxtZXRob2QgJ2l0ZW1zJyBvZiAnZGljdCcgb2JqZWN0cz4iKQorICAgICAgICAjIFhYWCBtZW1iZXIgZGVzY3JpcHRvcnMKKyAgICAgICAgIyBYWFggYXR0cmlidXRlIGRlc2NyaXB0b3JzCisgICAgICAgICMgWFhYIHNsb3QgZGVzY3JpcHRvcnMKKyAgICAgICAgIyBzdGF0aWMgYW5kIGNsYXNzIG1ldGhvZHMKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBmb28oY2xzKTogcGFzcworICAgICAgICB4ID0gc3RhdGljbWV0aG9kKEMuZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcih4KS5zdGFydHN3aXRoKCc8c3RhdGljbWV0aG9kIG9iamVjdCBhdCAweCcpKQorICAgICAgICB4ID0gY2xhc3NtZXRob2QoQy5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKHgpLnN0YXJ0c3dpdGgoJzxjbGFzc21ldGhvZCBvYmplY3QgYXQgMHgnKSkKKworICAgIGRlZiB0ZXN0X3Vuc29ydGFibGUoc2VsZik6CisgICAgICAgICMgUmVwci5yZXByKCkgdXNlZCB0byBjYWxsIHNvcnRlZCgpIG9uIHNldHMsIGZyb3plbnNldHMgYW5kIGRpY3RzCisgICAgICAgICMgd2l0aG91dCB0YWtpbmcgaW50byBhY2NvdW50IHRoYXQgbm90IGFsbCBvYmplY3RzIGFyZSBjb21wYXJhYmxlCisgICAgICAgIHggPSBzZXQoWzFqLCAyaiwgM2pdKQorICAgICAgICB5ID0gZnJvemVuc2V0KHgpCisgICAgICAgIHogPSB7MWo6IDEsIDJqOiAyfQorICAgICAgICByKHgpCisgICAgICAgIHIoeSkKKyAgICAgICAgcih6KQorCitkZWYgdG91Y2gocGF0aCwgdGV4dD0nJyk6CisgICAgZnAgPSBvcGVuKHBhdGgsICd3JykKKyAgICBmcC53cml0ZSh0ZXh0KQorICAgIGZwLmNsb3NlKCkKKworY2xhc3MgTG9uZ1JlcHJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGxvbmduYW1lID0gJ2FyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbicKKyAgICAgICAgc2VsZi5wa2duYW1lID0gb3MucGF0aC5qb2luKGxvbmduYW1lKQorICAgICAgICBzZWxmLnN1YnBrZ25hbWUgPSBvcy5wYXRoLmpvaW4obG9uZ25hbWUsIGxvbmduYW1lKQorICAgICAgICAjIE1ha2UgdGhlIHBhY2thZ2UgYW5kIHN1YnBhY2thZ2UKKyAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLnBrZ25hbWUsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKyAgICAgICAgb3MubWtkaXIoc2VsZi5wa2duYW1lKQorICAgICAgICB0b3VjaChvcy5wYXRoLmpvaW4oc2VsZi5wa2duYW1lLCAnX19pbml0X18nK29zLmV4dHNlcCsncHknKSkKKyAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLnN1YnBrZ25hbWUsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKyAgICAgICAgb3MubWtkaXIoc2VsZi5zdWJwa2duYW1lKQorICAgICAgICB0b3VjaChvcy5wYXRoLmpvaW4oc2VsZi5zdWJwa2duYW1lLCAnX19pbml0X18nK29zLmV4dHNlcCsncHknKSkKKyAgICAgICAgIyBSZW1lbWJlciB3aGVyZSB3ZSBhcmUKKyAgICAgICAgc2VsZi5oZXJlID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNlbGYuaGVyZSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgYWN0aW9ucyA9IFtdCisgICAgICAgIGZvciBkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzIGluIG9zLndhbGsoc2VsZi5wa2duYW1lKToKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGRpcm5hbWVzICsgZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgIGFjdGlvbnMuYXBwZW5kKG9zLnBhdGguam9pbihkaXJwYXRoLCBuYW1lKSkKKyAgICAgICAgYWN0aW9ucy5hcHBlbmQoc2VsZi5wa2duYW1lKQorICAgICAgICBhY3Rpb25zLnNvcnQoKQorICAgICAgICBhY3Rpb25zLnJldmVyc2UoKQorICAgICAgICBmb3IgcCBpbiBhY3Rpb25zOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwKToKKyAgICAgICAgICAgICAgICBvcy5ybWRpcihwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUocCkKKyAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisKKyAgICBkZWYgdGVzdF9tb2R1bGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB0b3VjaChvcy5wYXRoLmpvaW4oc2VsZi5zdWJwa2duYW1lLCBzZWxmLnBrZ25hbWUgKyBvcy5leHRzZXAgKyAncHknKSkKKyAgICAgICAgZnJvbSBhcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24uYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uIGltcG9ydCBhcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24KKyAgICAgICAgZXEocmVwcihhcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24pLAorICAgICAgICAgICAiPG1vZHVsZSAnJXMnIGZyb20gJyVzJz4iICUgKGFyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbi5fX25hbWVfXywgYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uLl9fZmlsZV9fKSkKKyAgICAgICAgZXEocmVwcihzeXMpLCAiPG1vZHVsZSAnc3lzJyAoYnVpbHQtaW4pPiIpCisKKyAgICBkZWYgdGVzdF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdG91Y2gob3MucGF0aC5qb2luKHNlbGYuc3VicGtnbmFtZSwgJ2Zvbycrb3MuZXh0c2VwKydweScpLCAnJydcCitjbGFzcyBmb28ob2JqZWN0KToKKyAgICBwYXNzCisnJycpCisgICAgICAgIGZyb20gYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uLmFyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbiBpbXBvcnQgZm9vCisgICAgICAgIGVxKHJlcHIoZm9vLmZvbyksCisgICAgICAgICAgICAgICAiPGNsYXNzICclcy5mb28nPiIgJSBmb28uX19uYW1lX18pCisKKyAgICBkZWYgdGVzdF9vYmplY3Qoc2VsZik6CisgICAgICAgICMgWFhYIFRlc3QgdGhlIHJlcHIgb2YgYSB0eXBlIHdpdGggYSByZWFsbHkgbG9uZyB0cF9uYW1lIGJ1dCB3aXRoIG5vCisgICAgICAgICMgdHBfcmVwci4gIFdJQk5JIHdlIGhhZCA6OklubGluZT8gOikKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfY2xhc3Moc2VsZik6CisgICAgICAgIHRvdWNoKG9zLnBhdGguam9pbihzZWxmLnN1YnBrZ25hbWUsICdiYXInK29zLmV4dHNlcCsncHknKSwgJycnXAorY2xhc3MgYmFyOgorICAgIHBhc3MKKycnJykKKyAgICAgICAgZnJvbSBhcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24uYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uIGltcG9ydCBiYXIKKyAgICAgICAgIyBNb2R1bGUgbmFtZSBtYXkgYmUgcHJlZml4ZWQgd2l0aCAidGVzdC4iLCBkZXBlbmRpbmcgb24gaG93IHJ1bi4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoYmFyLmJhcikuc3RhcnRzd2l0aCgKKyAgICAgICAgICAgICI8Y2xhc3MgJXMuYmFyIGF0IDB4IiAlIGJhci5fX25hbWVfXykpCisKKyAgICBkZWYgdGVzdF9pbnN0YW5jZShzZWxmKToKKyAgICAgICAgdG91Y2gob3MucGF0aC5qb2luKHNlbGYuc3VicGtnbmFtZSwgJ2Jheicrb3MuZXh0c2VwKydweScpLCAnJydcCitjbGFzcyBiYXo6CisgICAgcGFzcworJycnKQorICAgICAgICBmcm9tIGFyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbi5hcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24gaW1wb3J0IGJhegorICAgICAgICBpYmF6ID0gYmF6LmJheigpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGliYXopLnN0YXJ0c3dpdGgoCisgICAgICAgICAgICAiPCVzLmJheiBpbnN0YW5jZSBhdCAweCIgJSBiYXouX19uYW1lX18pKQorCisgICAgZGVmIHRlc3RfbWV0aG9kKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdG91Y2gob3MucGF0aC5qb2luKHNlbGYuc3VicGtnbmFtZSwgJ3F1eCcrb3MuZXh0c2VwKydweScpLCAnJydcCitjbGFzcyBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYToKKyAgICBkZWYgYW1ldGhvZChzZWxmKTogcGFzcworJycnKQorICAgICAgICBmcm9tIGFyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbi5hcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24gaW1wb3J0IHF1eAorICAgICAgICAjIFVuYm91bmQgbWV0aG9kcyBmaXJzdAorICAgICAgICBlcShyZXByKHF1eC5hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS5hbWV0aG9kKSwKKyAgICAgICAgJzx1bmJvdW5kIG1ldGhvZCBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS5hbWV0aG9kPicpCisgICAgICAgICMgQm91bmQgbWV0aG9kIG5leHQKKyAgICAgICAgaXF1eCA9IHF1eC5hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGlxdXguYW1ldGhvZCkuc3RhcnRzd2l0aCgKKyAgICAgICAgICAgICc8Ym91bmQgbWV0aG9kIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLmFtZXRob2Qgb2YgPCVzLmFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIGluc3RhbmNlIGF0IDB4JyBcCisgICAgICAgICAgICAlIChxdXguX19uYW1lX18sKSApKQorCisgICAgZGVmIHRlc3RfYnVpbHRpbl9mdW5jdGlvbihzZWxmKToKKyAgICAgICAgIyBYWFggdGVzdCBidWlsdC1pbiBmdW5jdGlvbnMgYW5kIG1ldGhvZHMgd2l0aCByZWFsbHkgbG9uZyBuYW1lcworICAgICAgICBwYXNzCisKK2NsYXNzIENsYXNzV2l0aFJlcHI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHMpOgorICAgICAgICBzZWxmLnMgPSBzCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkNsYXNzV2l0aExvbmdSZXByKCVyKSIgJSBzZWxmLnMKKworCitjbGFzcyBDbGFzc1dpdGhGYWlsaW5nUmVwcjoKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiVGhpcyBzaG91bGQgYmUgY2F1Z2h0IGJ5IFJlcHIucmVwcl9pbnN0YW5jZSIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChSZXByVGVzdHMpCisgICAgcnVuX3VuaXR0ZXN0KExvbmdSZXByVGVzdCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXByLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlcHIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ODczM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXByLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXByLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlcHIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ODczM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXByLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXNvdXJjZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Jlc291cmNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NWIyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXNvdXJjZS5weQpAQCAtMCwwICsxLDEyNyBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHRpbWUKKworcmVzb3VyY2UgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgncmVzb3VyY2UnKQorCisjIFRoaXMgdGVzdCBpcyBjaGVja2luZyBhIGZldyBzcGVjaWZpYyBwcm9ibGVtIHNwb3RzIHdpdGggdGhlIHJlc291cmNlIG1vZHVsZS4KKworY2xhc3MgUmVzb3VyY2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVzb3VyY2UuZ2V0cmxpbWl0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlc291cmNlLmdldHJsaW1pdCwgNDIsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlc291cmNlLnNldHJsaW1pdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXNvdXJjZS5zZXRybGltaXQsIDQyLCA0MiwgNDIpCisKKyAgICBkZWYgdGVzdF9mc2l6ZV9pc21heChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgKGN1ciwgbWF4KSA9IHJlc291cmNlLmdldHJsaW1pdChyZXNvdXJjZS5STElNSVRfRlNJWkUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgUkxJTUlUX0ZTSVpFIHNob3VsZCBiZSBSTElNX0lORklOSVRZLCB3aGljaCB3aWxsIGJlIGEgcmVhbGx5IGJpZworICAgICAgICAgICAgIyBudW1iZXIgb24gYSBwbGF0Zm9ybSB3aXRoIGxhcmdlIGZpbGUgc3VwcG9ydC4gIE9uIHRoZXNlIHBsYXRmb3JtcywKKyAgICAgICAgICAgICMgd2UgbmVlZCB0byB0ZXN0IHRoYXQgdGhlIGdldC9zZXRybGltaXQgZnVuY3Rpb25zIHByb3Blcmx5IGNvbnZlcnQKKyAgICAgICAgICAgICMgdGhlIG51bWJlciB0byBhIEMgbG9uZyBsb25nIGFuZCB0aGF0IHRoZSBjb252ZXJzaW9uIGRvZXNuJ3QgcmFpc2UKKyAgICAgICAgICAgICMgYW4gZXJyb3IuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc291cmNlLlJMSU1fSU5GSU5JVFksIG1heCkKKyAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfRlNJWkUsIChjdXIsIG1heCkpCisKKyAgICBkZWYgdGVzdF9mc2l6ZV9lbmZvcmNlZChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgKGN1ciwgbWF4KSA9IHJlc291cmNlLmdldHJsaW1pdChyZXNvdXJjZS5STElNSVRfRlNJWkUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQ2hlY2sgdG8gc2VlIHdoYXQgaGFwcGVucyB3aGVuIHRoZSBSTElNSVRfRlNJWkUgaXMgc21hbGwuICBTb21lCisgICAgICAgICAgICAjIHZlcnNpb25zIG9mIFB5dGhvbiB3ZXJlIHRlcm1pbmF0ZWQgYnkgYW4gdW5jYXVnaHQgU0lHWEZTWiwgYnV0CisgICAgICAgICAgICAjIHB5dGhvbnJ1bi5jIGhhcyBiZWVuIGZpeGVkIHRvIGlnbm9yZSB0aGF0IGV4Y2VwdGlvbi4gIElmIHNvLCB0aGUKKyAgICAgICAgICAgICMgd3JpdGUoKSBzaG91bGQgcmV0dXJuIEVGQklHIHdoZW4gdGhlIGxpbWl0IGlzIGV4Y2VlZGVkLgorCisgICAgICAgICAgICAjIEF0IGxlYXN0IG9uZSBwbGF0Zm9ybSBoYXMgYW4gdW5saW1pdGVkIFJMSU1JVF9GU0laRSBhbmQgYXR0ZW1wdHMKKyAgICAgICAgICAgICMgdG8gY2hhbmdlIGl0IHJhaXNlIFZhbHVlRXJyb3IgaW5zdGVhZC4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfRlNJWkUsICgxMDI0LCBtYXgpKQorICAgICAgICAgICAgICAgICAgICBsaW1pdF9zZXQgPSBUcnVlCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGxpbWl0X3NldCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIlgiICogMTAyNCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgiWSIpCisgICAgICAgICAgICAgICAgICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgT24gc29tZSBzeXN0ZW1zIChlLmcuLCBVYnVudHUgb24gaHBwYSkgdGhlIGZsdXNoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZG9lc24ndCBhbHdheXMgY2F1c2UgdGhlIGV4Y2VwdGlvbiwgYnV0IHRoZSBjbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAjIGRvZXMgZXZlbnR1YWxseS4gIFRyeSBmbHVzaGluZyBzZXZlcmFsIHRpbWVzIGluCisgICAgICAgICAgICAgICAgICAgICAgICAjIGFuIGF0dGVtcHQgdG8gZW5zdXJlIHRoZSBmaWxlIGlzIHJlYWxseSBzeW5jZWQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBleGNlcHRpb24gcmFpc2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCguMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGltaXRfc2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbWl0X3NldDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQ2xvc2Ugd2lsbCBhdHRlbXB0IHRvIGZsdXNoIHRoZSBieXRlIHdlIHdyb3RlCisgICAgICAgICAgICAgICAgICAgICAgICAjIFJlc3RvcmUgbGltaXQgZmlyc3QgdG8gYXZvaWQgZ2V0dGluZyBhIHNwdXJpb3VzIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0ZTSVpFLCAoY3VyLCBtYXgpKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBsaW1pdF9zZXQ6CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfRlNJWkUsIChjdXIsIG1heCkpCisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfZnNpemVfdG9vYmlnKHNlbGYpOgorICAgICAgICAjIEJlIHN1cmUgdGhhdCBzZXRybGltaXQgaXMgY2hlY2tpbmcgZm9yIHJlYWxseSBsYXJnZSB2YWx1ZXMKKyAgICAgICAgdG9vX2JpZyA9IDEwTCoqNTAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgKGN1ciwgbWF4KSA9IHJlc291cmNlLmdldHJsaW1pdChyZXNvdXJjZS5STElNSVRfRlNJWkUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0ZTSVpFLCAodG9vX2JpZywgbWF4KSkKKyAgICAgICAgICAgIGV4Y2VwdCAoT3ZlcmZsb3dFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfRlNJWkUsIChtYXgsIHRvb19iaWcpKQorICAgICAgICAgICAgZXhjZXB0IChPdmVyZmxvd0Vycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9nZXRydXNhZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVzb3VyY2UuZ2V0cnVzYWdlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlc291cmNlLmdldHJ1c2FnZSwgNDIsIDQyKQorICAgICAgICB1c2FnZXNlbGYgPSByZXNvdXJjZS5nZXRydXNhZ2UocmVzb3VyY2UuUlVTQUdFX1NFTEYpCisgICAgICAgIHVzYWdlY2hpbGRyZW4gPSByZXNvdXJjZS5nZXRydXNhZ2UocmVzb3VyY2UuUlVTQUdFX0NISUxEUkVOKQorICAgICAgICAjIE1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbCBzeXN0ZW1zLgorICAgICAgICB0cnk6CisgICAgICAgICAgICB1c2FnZWJvdGggPSByZXNvdXJjZS5nZXRydXNhZ2UocmVzb3VyY2UuUlVTQUdFX0JPVEgpCisgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgcGFzcworCisgICAgIyBJc3N1ZSA2MDgzOiBSZWZlcmVuY2UgY291bnRpbmcgYnVnCisgICAgZGVmIHRlc3Rfc2V0cnVzYWdlX3JlZmNvdW50KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaW1pdHMgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0NQVSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2xhc3MgQmFkU2VxdWVuY2U6CisgICAgICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAyCisgICAgICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGtleSBpbiAoMCwgMSk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVuKHR1cGxlKHJhbmdlKDEwMDAwMDApKSkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorCisgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0NQVSwgQmFkU2VxdWVuY2UoKSkKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUmVzb3VyY2VUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXNvdXJjZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXNvdXJjZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhZmIzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Jlc291cmNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXNvdXJjZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXNvdXJjZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhZmIzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Jlc291cmNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZmM4MjIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZmM4MjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhMDI4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JmYzgyMi5weQpAQCAtMCwwICsxLDI1NyBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCityZmM4MjIgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgicmZjODIyIiwgZGVwcmVjYXRlZD1UcnVlKQorCit0cnk6CisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworCitjbGFzcyBNZXNzYWdlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBjcmVhdGVfbWVzc2FnZShzZWxmLCBtc2cpOgorICAgICAgICByZXR1cm4gcmZjODIyLk1lc3NhZ2UoU3RyaW5nSU8obXNnKSkKKworICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5jcmVhdGVfbWVzc2FnZSgKKyAgICAgICAgICAgICdUbzogImxhc3QsIGZpcnN0IiA8dXNlcmlkQGZvby5uZXQ+XG5cbnRlc3RcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0KCJ0byIpID09ICcibGFzdCwgZmlyc3QiIDx1c2VyaWRAZm9vLm5ldD4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldCgiVE8iKSA9PSAnImxhc3QsIGZpcnN0IiA8dXNlcmlkQGZvby5uZXQ+JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXQoIk5vLVN1Y2gtSGVhZGVyIikgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXQoIk5vLVN1Y2gtSGVhZGVyIiwgIk5vLVN1Y2gtVmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAgPT0gIk5vLVN1Y2gtVmFsdWUiKQorCisgICAgZGVmIHRlc3Rfc2V0ZGVmYXVsdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5jcmVhdGVfbWVzc2FnZSgKKyAgICAgICAgICAgICdUbzogImxhc3QsIGZpcnN0IiA8dXNlcmlkQGZvby5uZXQ+XG5cbnRlc3RcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgbXNnLmhhc19rZXkoIk5ldy1IZWFkZXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5zZXRkZWZhdWx0KCJOZXctSGVhZGVyIiwgIk5ldy1WYWx1ZSIpID09ICJOZXctVmFsdWUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLnNldGRlZmF1bHQoIk5ldy1IZWFkZXIiLCAiRGlmZmVyZW50LVZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgID09ICJOZXctVmFsdWUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnWyJuZXctaGVhZGVyIl0gPT0gIk5ldy1WYWx1ZSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5zZXRkZWZhdWx0KCJBbm90aGVyLUhlYWRlciIpID09ICIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnWyJhbm90aGVyLWhlYWRlciJdID09ICIiKQorCisgICAgZGVmIGNoZWNrKHNlbGYsIG1zZywgcmVzdWx0cyk6CisgICAgICAgICIiIkNoZWNrIGFkZHJlc3NlcyBhbmQgdGhlIGRhdGUuIiIiCisgICAgICAgIG0gPSBzZWxmLmNyZWF0ZV9tZXNzYWdlKG1zZykKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIG4sIGEgaW4gbS5nZXRhZGRybGlzdCgndG8nKSArIG0uZ2V0YWRkcmxpc3QoJ2NjJyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbW4sIG1hID0gcmVzdWx0c1tpXVswXSwgcmVzdWx0c1tpXVsxXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQgJ2V4dHJhIHBhcnNlZCBhZGRyZXNzOicsIHJlcHIobiksIHJlcHIoYSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1uLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW4tZXhwZWN0ZWQgbmFtZTogJXIgIT0gJXIiICUgKG1uLCBuKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWEsIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbi1leHBlY3RlZCBhZGRyZXNzOiAlciAhPSAlciIgJSAobWEsIGEpKQorICAgICAgICAgICAgaWYgbW4gPT0gbiBhbmQgbWEgPT0gYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICdub3QgZm91bmQ6JywgcmVwcihuKSwgcmVwcihhKQorCisgICAgICAgIG91dCA9IG0uZ2V0ZGF0ZSgnZGF0ZScpCisgICAgICAgIGlmIG91dDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTk5OSwgMSwgMTMsIDIzLCA1NywgMzUsIDAsIDEsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZSBjb252ZXJzaW9uIGZhaWxlZCIpCisKKworICAgICMgTm90ZTogYWxsIHRlc3QgY2FzZXMgbXVzdCBoYXZlIHRoZSBzYW1lIGRhdGUgKGluIHZhcmlvdXMgZm9ybWF0cyksCisgICAgIyBvciBubyBkYXRlIQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soCisgICAgICAgICAgICAnRGF0ZTogICAgV2VkLCAxMyBKYW4gMTk5OSAyMzo1NzozNSAtMDUwMFxuJworICAgICAgICAgICAgJ0Zyb206ICAgIEd1aWRvIHZhbiBSb3NzdW0gPGd1aWRvQENOUkkuUmVzdG9uLlZBLlVTPlxuJworICAgICAgICAgICAgJ1RvOiAgICAgICJHdWlkbyB2YW5cbicKKyAgICAgICAgICAgICdcdCA6IFJvc3N1bSIgPGd1aWRvQHB5dGhvbi5vcmc+XG4nCisgICAgICAgICAgICAnU3ViamVjdDogdGVzdDJcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICd0ZXN0MlxuJywKKyAgICAgICAgICAgIFsoJ0d1aWRvIHZhblxuXHQgOiBSb3NzdW0nLCAnZ3VpZG9AcHl0aG9uLm9yZycpXSkKKworICAgICAgICBzZWxmLmNoZWNrKAorICAgICAgICAgICAgJ0Zyb206IEJhcnJ5IDxid2Fyc2F3QHB5dGhvbi5vcmdcbicKKyAgICAgICAgICAgICdUbzogZ3VpZG9AcHl0aG9uLm9yZyAoR3VpZG86IHRoZSBCYXJiYXJpYW4pXG4nCisgICAgICAgICAgICAnU3ViamVjdDogbm9uc2Vuc2VcbicKKyAgICAgICAgICAgICdEYXRlOiBXZWRuZXNkYXksIEphbnVhcnkgMTMgMTk5OSAyMzo1NzozNSAtMDUwMFxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ3Rlc3QnLAorICAgICAgICAgICAgWygnR3VpZG86IHRoZSBCYXJiYXJpYW4nLCAnZ3VpZG9AcHl0aG9uLm9yZycpXSkKKworICAgICAgICBzZWxmLmNoZWNrKAorICAgICAgICAgICAgJ0Zyb206IEJhcnJ5IDxid2Fyc2F3QHB5dGhvbi5vcmdcbicKKyAgICAgICAgICAgICdUbzogZ3VpZG9AcHl0aG9uLm9yZyAoR3VpZG86IHRoZSBCYXJiYXJpYW4pXG4nCisgICAgICAgICAgICAnQ2M6ICJHdWlkbzogdGhlIE1hZG1hbiIgPGd1aWRvQHB5dGhvbi5vcmc+XG4nCisgICAgICAgICAgICAnRGF0ZTogIDEzLUphbi0xOTk5IDIzOjU3OjM1IEVTVFxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ3Rlc3QnLAorICAgICAgICAgICAgWygnR3VpZG86IHRoZSBCYXJiYXJpYW4nLCAnZ3VpZG9AcHl0aG9uLm9yZycpLAorICAgICAgICAgICAgICgnR3VpZG86IHRoZSBNYWRtYW4nLCAnZ3VpZG9AcHl0aG9uLm9yZycpCisgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmNoZWNrKAorICAgICAgICAgICAgJ1RvOiAiVGhlIG1vbnN0ZXIgd2l0aFxuJworICAgICAgICAgICAgJyAgICAgdGhlIHZlcnkgbG9uZyBuYW1lOiBHdWlkbyIgPGd1aWRvQHB5dGhvbi5vcmc+XG4nCisgICAgICAgICAgICAnRGF0ZTogICAgV2VkLCAxMyBKYW4gMTk5OSAyMzo1NzozNSAtMDUwMFxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ3Rlc3QnLAorICAgICAgICAgICAgWygnVGhlIG1vbnN0ZXIgd2l0aFxuICAgICB0aGUgdmVyeSBsb25nIG5hbWU6IEd1aWRvJywKKyAgICAgICAgICAgICAgJ2d1aWRvQHB5dGhvbi5vcmcnKV0pCisKKyAgICAgICAgc2VsZi5jaGVjaygKKyAgICAgICAgICAgICdUbzogIkFtaXQgSi4gUGF0ZWwiIDxhbWl0cEBUaGVvcnkuU3RhbmZvcmQuRURVPlxuJworICAgICAgICAgICAgJ0NDOiBNaWtlIEZsZXRjaGVyIDxtZmxldGNoQHZydGVsZWNvbS5jb20+LFxuJworICAgICAgICAgICAgJyAgICAgICAgIlwnc3RyaW5nLXNpZ0BweXRob24ub3JnXCciIDxzdHJpbmctc2lnQHB5dGhvbi5vcmc+XG4nCisgICAgICAgICAgICAnQ2M6IGZvb3pAYmF0LmNvbSwgYmFydEB0b29mLmNvbVxuJworICAgICAgICAgICAgJ0NjOiBnb2l0QGxpcC5jb21cbicKKyAgICAgICAgICAgICdEYXRlOiAgICBXZWQsIDEzIEphbiAxOTk5IDIzOjU3OjM1IC0wNTAwXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAndGVzdCcsCisgICAgICAgICAgICBbKCdBbWl0IEouIFBhdGVsJywgJ2FtaXRwQFRoZW9yeS5TdGFuZm9yZC5FRFUnKSwKKyAgICAgICAgICAgICAoJ01pa2UgRmxldGNoZXInLCAnbWZsZXRjaEB2cnRlbGVjb20uY29tJyksCisgICAgICAgICAgICAgKCInc3RyaW5nLXNpZ0BweXRob24ub3JnJyIsICdzdHJpbmctc2lnQHB5dGhvbi5vcmcnKSwKKyAgICAgICAgICAgICAoJycsICdmb296QGJhdC5jb20nKSwKKyAgICAgICAgICAgICAoJycsICdiYXJ0QHRvb2YuY29tJyksCisgICAgICAgICAgICAgKCcnLCAnZ29pdEBsaXAuY29tJyksCisgICAgICAgICAgICAgXSkKKworICAgICAgICBzZWxmLmNoZWNrKAorICAgICAgICAgICAgJ1RvOiBTb21lIE9uZSA8c29tZW9uZUBkb20uYWluPlxuJworICAgICAgICAgICAgJ0Zyb206IEFudWRkZXIgUGVyc2luIDxzdWJ1ZGR5LmVsc2VAZG9tLmFpbj5cbicKKyAgICAgICAgICAgICdEYXRlOlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ3Rlc3QnLAorICAgICAgICAgICAgWygnU29tZSBPbmUnLCAnc29tZW9uZUBkb20uYWluJyldKQorCisgICAgICAgIHNlbGYuY2hlY2soCisgICAgICAgICAgICAnVG86IHBlcnNvbkBkb20uYWluIChVc2VyIEouIFBlcnNvbilcblxuJywKKyAgICAgICAgICAgIFsoJ1VzZXIgSi4gUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJyldKQorCisgICAgZGVmIHRlc3RfZG91YmxlY29tbWVudChzZWxmKToKKyAgICAgICAgIyBUaGUgUkZDIGFsbG93cyBjb21tZW50cyB3aXRoaW4gY29tbWVudHMgaW4gYW4gZW1haWwgYWRkcgorICAgICAgICBzZWxmLmNoZWNrKAorICAgICAgICAgICAgJ1RvOiBwZXJzb25AZG9tLmFpbiAoKFVzZXIgSi4gUGVyc29uKSksIEpvaG4gRG9lIDxmb29AYmFyLmNvbT5cblxuJywKKyAgICAgICAgICAgIFsoJ1VzZXIgSi4gUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJyksICgnSm9obiBEb2UnLCAnZm9vQGJhci5jb20nKV0pCisKKyAgICBkZWYgdGVzdF90d2lzdGVkKHNlbGYpOgorICAgICAgICAjIFRoaXMgb25lIGlzIGp1c3QgdHdpc3RlZC4gIEkgZG9uJ3Qga25vdyB3aGF0IHRoZSBwcm9wZXIKKyAgICAgICAgIyByZXN1bHQgc2hvdWxkIGJlLCBidXQgaXQgc2hvdWxkbid0IGJlIHRvIGluZmxvb3AsIHdoaWNoIGlzCisgICAgICAgICMgd2hhdCB1c2VkIHRvIGhhcHBlbiEKKyAgICAgICAgc2VsZi5jaGVjaygKKyAgICAgICAgICAgICdUbzogPFtzbXRwOmRkNDdAbWFpbC54eHguZWR1XV9hdF9obWhxQGhkcS1tZG0xLWltZ291dC5jb21wYW5heS5jb20+XG4nCisgICAgICAgICAgICAnRGF0ZTogICAgV2VkLCAxMyBKYW4gMTk5OSAyMzo1NzozNSAtMDUwMFxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ3Rlc3QnLAorICAgICAgICAgICAgWygnJywgJycpLAorICAgICAgICAgICAgICgnJywgJ2RkNDdAbWFpbC54eHguZWR1JyksCisgICAgICAgICAgICAgKCcnLCAnX2F0X2htaHFAaGRxLW1kbTEtaW1nb3V0LmNvbXBhbmF5LmNvbScpLAorICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9jb21tYXNfaW5fZnVsbF9uYW1lKHNlbGYpOgorICAgICAgICAjIFRoaXMgZXhlcmNpc2VzIHRoZSBvbGQgY29tbWFzLWluLWEtZnVsbC1uYW1lIGJ1Zywgd2hpY2gKKyAgICAgICAgIyBzaG91bGQgYmUgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nIGluIHJlY2VudCB2ZXJzaW9ucyBvZiB0aGUKKyAgICAgICAgIyBtb2R1bGUuCisgICAgICAgIHNlbGYuY2hlY2soCisgICAgICAgICAgICAnVG86ICJsYXN0LCBmaXJzdCIgPHVzZXJpZEBmb28ubmV0PlxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ3Rlc3QnLAorICAgICAgICAgICAgWygnbGFzdCwgZmlyc3QnLCAndXNlcmlkQGZvby5uZXQnKV0pCisKKyAgICBkZWYgdGVzdF9xdW90ZWRfbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygKKyAgICAgICAgICAgICdUbzogKENvbW1lbnQgc3R1ZmYpICJRdW90ZWQgbmFtZSJAc29tZXdoZXJlLmNvbVxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ3Rlc3QnLAorICAgICAgICAgICAgWygnQ29tbWVudCBzdHVmZicsICciUXVvdGVkIG5hbWUiQHNvbWV3aGVyZS5jb20nKV0pCisKKyAgICBkZWYgdGVzdF9ib2d1c190b19oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soCisgICAgICAgICAgICAnVG86IDpcbicKKyAgICAgICAgICAgICdDYzogZ29pdEBsaXAuY29tXG4nCisgICAgICAgICAgICAnRGF0ZTogICAgV2VkLCAxMyBKYW4gMTk5OSAyMzo1NzozNSAtMDUwMFxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ3Rlc3QnLAorICAgICAgICAgICAgWygnJywgJ2dvaXRAbGlwLmNvbScpXSkKKworICAgIGRlZiB0ZXN0X2FkZHJfaXBxdWFkKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKAorICAgICAgICAgICAgJ1RvOiBndWlkb0BbMTMyLjE1MS4xLjIxXVxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ2ZvbycsCisgICAgICAgICAgICBbKCcnLCAnZ3VpZG9AWzEzMi4xNTEuMS4yMV0nKV0pCisKKyAgICBkZWYgdGVzdF9pdGVyKHNlbGYpOgorICAgICAgICBtID0gcmZjODIyLk1lc3NhZ2UoU3RyaW5nSU8oCisgICAgICAgICAgICAnRGF0ZTogICAgV2VkLCAxMyBKYW4gMTk5OSAyMzo1NzozNSAtMDUwMFxuJworICAgICAgICAgICAgJ0Zyb206ICAgIEd1aWRvIHZhbiBSb3NzdW0gPGd1aWRvQENOUkkuUmVzdG9uLlZBLlVTPlxuJworICAgICAgICAgICAgJ1RvOiAgICAgICJHdWlkbyB2YW5cbicKKyAgICAgICAgICAgICdcdCA6IFJvc3N1bSIgPGd1aWRvQHB5dGhvbi5vcmc+XG4nCisgICAgICAgICAgICAnU3ViamVjdDogdGVzdDJcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICd0ZXN0MlxuJyApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChtKSwgWydkYXRlJywgJ2Zyb20nLCAnc3ViamVjdCcsICd0byddKQorCisgICAgZGVmIHRlc3RfcmZjMjgyMl9waHJhc2VzKHNlbGYpOgorICAgICAgICAjIFJGQyAyODIyICh0aGUgdXBkYXRlIHRvIFJGQyA4MjIpIHNwZWNpZmllcyB0aGF0IGRvdHMgaW4gcGhyYXNlcyBhcmUKKyAgICAgICAgIyBvYnNvbGV0ZSBzeW50YXgsIHdoaWNoIGNvbmZvcm1pbmcgcHJvZ3JhbXMgTVVTVCByZWNvZ25pemUgYnV0IE5FVkVSCisgICAgICAgICMgZ2VuZXJhdGUgKHNlZSAkNC4xIE1pc2NlbGxhbmVvdXMgb2Jzb2xldGUgdG9rZW5zKS4gIFRoaXMgaXMgYQorICAgICAgICAjIGRlcGFydHVyZSBmcm9tIFJGQyA4MjIgd2hpY2ggZGlkIG5vdCBhbGxvdyBkb3RzIGluIG5vbi1xdW90ZWQKKyAgICAgICAgIyBwaHJhc2VzLgorICAgICAgICBzZWxmLmNoZWNrKCdUbzogVXNlciBKLiBQZXJzb24gPHBlcnNvbkBkb20uYWluPlxuXG4nLAorICAgICAgICAgICAgICAgICAgIFsoJ1VzZXIgSi4gUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJyldKQorCisgICAgIyBUaGlzIHRha2VzIHRvbyBsb25nIHRvIGFkZCB0byB0aGUgdGVzdCBzdWl0ZQorIyMgICAgZGVmIHRlc3RfYW5fZXhjcnV0aWF0aW5nbHlfbG9uZ19hZGRyZXNzX2ZpZWxkKHNlbGYpOgorIyMgICAgICAgIE9CU0NFTkVMWV9MT05HX0hFQURFUl9NVUxUSVBMSUVSID0gMTAwMDAKKyMjICAgICAgICBvbmVhZGRyID0gKCdQZXJzb24nICogMTApICsgJ0AnICsgKCcuJy5qb2luKFsnZG9tJ10qMTApKSArICcuY29tJworIyMgICAgICAgIGFkZHIgPSAnLCAnLmpvaW4oW29uZWFkZHJdICogT0JTQ0VORUxZX0xPTkdfSEVBREVSX01VTFRJUExJRVIpCisjIyAgICAgICAgbHN0ID0gcmZjODIyLkFkZHJsaXN0Q2xhc3MoYWRkcikuZ2V0YWRkcmxpc3QoKQorIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxzdCksIE9CU0NFTkVMWV9MT05HX0hFQURFUl9NVUxUSVBMSUVSKQorCisgICAgZGVmIHRlc3RfMmdldGFkZHJsaXN0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5jcmVhdGVfbWVzc2FnZSgiIiJcCitUbzogYXBlcnNvbkBkb20uYWluCitDYzogYnBlcnNvbkBkb20uYWluCitDYzogY3BlcnNvbkBkb20uYWluCitDYzogZHBlcnNvbkBkb20uYWluCisKK0EgdGVzdCBtZXNzYWdlLgorIiIiKQorICAgICAgICBjY3MgPSBbKCcnLCBhKSBmb3IgYSBpbgorICAgICAgICAgICAgICAgWydicGVyc29uQGRvbS5haW4nLCAnY3BlcnNvbkBkb20uYWluJywgJ2RwZXJzb25AZG9tLmFpbiddXQorICAgICAgICBhZGRycyA9IG1zZy5nZXRhZGRybGlzdCgnY2MnKQorICAgICAgICBhZGRycy5zb3J0KCkKKyAgICAgICAgZXEoYWRkcnMsIGNjcykKKyAgICAgICAgIyBUcnkgYWdhaW4sIHRoaXMgb25lIHVzZWQgdG8gZmFpbAorICAgICAgICBhZGRycyA9IG1zZy5nZXRhZGRybGlzdCgnY2MnKQorICAgICAgICBhZGRycy5zb3J0KCkKKyAgICAgICAgZXEoYWRkcnMsIGNjcykKKworICAgIGRlZiB0ZXN0X3BhcnNlYWRkcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHJmYzgyMi5wYXJzZWFkZHIoJzw+JyksICgnJywgJycpKQorICAgICAgICBlcShyZmM4MjIucGFyc2VhZGRyKCdhcGVyc29uQGRvbS5haW4nKSwgKCcnLCAnYXBlcnNvbkBkb20uYWluJykpCisgICAgICAgIGVxKHJmYzgyMi5wYXJzZWFkZHIoJ2JwZXJzb25AZG9tLmFpbiAoQmVhIEEuIFBlcnNvbiknKSwKKyAgICAgICAgICAgKCdCZWEgQS4gUGVyc29uJywgJ2JwZXJzb25AZG9tLmFpbicpKQorICAgICAgICBlcShyZmM4MjIucGFyc2VhZGRyKCdDeW50aGlhIFBlcnNvbiA8Y3BlcnNvbkBkb20uYWluPicpLAorICAgICAgICAgICAoJ0N5bnRoaWEgUGVyc29uJywgJ2NwZXJzb25AZG9tLmFpbicpKQorCisgICAgZGVmIHRlc3RfcXVvdGVfdW5xdW90ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHJmYzgyMi5xdW90ZSgnZm9vXFx3YWNreSJuYW1lJyksICdmb29cXFxcd2Fja3lcXCJuYW1lJykKKyAgICAgICAgZXEocmZjODIyLnVucXVvdGUoJyJmb29cXFxcd2Fja3lcXCJuYW1lIicpLCAnZm9vXFx3YWNreSJuYW1lJykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChNZXNzYWdlVGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmZjODIyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JmYzgyMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5OTVmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JmYzgyMi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmZjODIyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JmYzgyMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5OTVmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JmYzgyMi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmljaGNtcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JpY2hjbXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmYTBkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JpY2hjbXAucHkKQEAgLTAsMCArMSwzMzggQEAKKyMgVGVzdHMgZm9yIHJpY2ggY29tcGFyaXNvbnMKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitpbXBvcnQgb3BlcmF0b3IKKworY2xhc3MgTnVtYmVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICBzZWxmLnggPSB4CisKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYueCA8IG90aGVyCisKKyAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYueCA8PSBvdGhlcgorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLnggPT0gb3RoZXIKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi54ICE9IG90aGVyCisKKyAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYueCA+IG90aGVyCisKKyAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYueCA+PSBvdGhlcgorCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgIk51bWJlci5fX2NtcF9fKCkgc2hvdWxkIG5vdCBiZSBjYWxsZWQiCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTnVtYmVyKCVyKSIgJSAoc2VsZi54LCApCisKK2NsYXNzIFZlY3RvcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5kYXRhID0gZGF0YQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5kYXRhKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhW2ldCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaSwgdik6CisgICAgICAgIHNlbGYuZGF0YVtpXSA9IHYKKworICAgIF9faGFzaF9fID0gTm9uZSAjIFZlY3RvcnMgY2Fubm90IGJlIGhhc2hlZAorCisgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJWZWN0b3JzIGNhbm5vdCBiZSB1c2VkIGluIEJvb2xlYW4gY29udGV4dHMiCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkLCAiVmVjdG9yLl9fY21wX18oKSBzaG91bGQgbm90IGJlIGNhbGxlZCIKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJWZWN0b3IoJXIpIiAlIChzZWxmLmRhdGEsICkKKworICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gVmVjdG9yKFthIDwgYiBmb3IgYSwgYiBpbiB6aXAoc2VsZi5kYXRhLCBzZWxmLl9fY2FzdChvdGhlcikpXSkKKworICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gVmVjdG9yKFthIDw9IGIgZm9yIGEsIGIgaW4gemlwKHNlbGYuZGF0YSwgc2VsZi5fX2Nhc3Qob3RoZXIpKV0pCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIFZlY3RvcihbYSA9PSBiIGZvciBhLCBiIGluIHppcChzZWxmLmRhdGEsIHNlbGYuX19jYXN0KG90aGVyKSldKQorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBWZWN0b3IoW2EgIT0gYiBmb3IgYSwgYiBpbiB6aXAoc2VsZi5kYXRhLCBzZWxmLl9fY2FzdChvdGhlcikpXSkKKworICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gVmVjdG9yKFthID4gYiBmb3IgYSwgYiBpbiB6aXAoc2VsZi5kYXRhLCBzZWxmLl9fY2FzdChvdGhlcikpXSkKKworICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gVmVjdG9yKFthID49IGIgZm9yIGEsIGIgaW4gemlwKHNlbGYuZGF0YSwgc2VsZi5fX2Nhc3Qob3RoZXIpKV0pCisKKyAgICBkZWYgX19jYXN0KHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVmVjdG9yKToKKyAgICAgICAgICAgIG90aGVyID0gb3RoZXIuZGF0YQorICAgICAgICBpZiBsZW4oc2VsZi5kYXRhKSAhPSBsZW4ob3RoZXIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkNhbm5vdCBjb21wYXJlIHZlY3RvcnMgb2YgZGlmZmVyZW50IGxlbmd0aCIKKyAgICAgICAgcmV0dXJuIG90aGVyCisKK29wbWFwID0geworICAgICJsdCI6IChsYW1iZGEgYSxiOiBhPCBiLCBvcGVyYXRvci5sdCwgb3BlcmF0b3IuX19sdF9fKSwKKyAgICAibGUiOiAobGFtYmRhIGEsYjogYTw9Yiwgb3BlcmF0b3IubGUsIG9wZXJhdG9yLl9fbGVfXyksCisgICAgImVxIjogKGxhbWJkYSBhLGI6IGE9PWIsIG9wZXJhdG9yLmVxLCBvcGVyYXRvci5fX2VxX18pLAorICAgICJuZSI6IChsYW1iZGEgYSxiOiBhIT1iLCBvcGVyYXRvci5uZSwgb3BlcmF0b3IuX19uZV9fKSwKKyAgICAiZ3QiOiAobGFtYmRhIGEsYjogYT4gYiwgb3BlcmF0b3IuZ3QsIG9wZXJhdG9yLl9fZ3RfXyksCisgICAgImdlIjogKGxhbWJkYSBhLGI6IGE+PWIsIG9wZXJhdG9yLmdlLCBvcGVyYXRvci5fX2dlX18pCit9CisKK2NsYXNzIFZlY3RvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrZmFpbChzZWxmLCBlcnJvciwgb3BuYW1lLCAqYXJncyk6CisgICAgICAgIGZvciBvcCBpbiBvcG1hcFtvcG5hbWVdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3IsIG9wLCAqYXJncykKKworICAgIGRlZiBjaGVja2VxdWFsKHNlbGYsIG9wbmFtZSwgYSwgYiwgZXhwcmVzKToKKyAgICAgICAgZm9yIG9wIGluIG9wbWFwW29wbmFtZV06CisgICAgICAgICAgICByZWFscmVzID0gb3AoYSwgYikKKyAgICAgICAgICAgICMgY2FuJ3QgdXNlIGFzc2VydEVxdWFsKHJlYWxyZXMsIGV4cHJlcykgaGVyZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVhbHJlcyksIGxlbihleHByZXMpKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihyZWFscmVzKSk6CisgICAgICAgICAgICAgICAgIyByZXN1bHRzIGFyZSBib29sLCBzbyB3ZSBjYW4gdXNlICJpcyIgaGVyZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWFscmVzW2ldIGlzIGV4cHJlc1tpXSkKKworICAgIGRlZiB0ZXN0X21peGVkKHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgY29tcGFyaXNvbnMgaW52b2x2aW5nIFZlY3RvciBvYmplY3RzCisgICAgICAgICMgd2hpY2ggcmV0dXJuIHJpY2ggcmVzdWx0cyAoaS5lLiBWZWN0b3JzIHdpdGggaXRlbXdpc2UKKyAgICAgICAgIyBjb21wYXJpc29uIHJlc3VsdHMpIHdvcmsKKyAgICAgICAgYSA9IFZlY3RvcihyYW5nZSgyKSkKKyAgICAgICAgYiA9IFZlY3RvcihyYW5nZSgzKSkKKyAgICAgICAgIyBhbGwgY29tcGFyaXNvbnMgc2hvdWxkIGZhaWwgZm9yIGRpZmZlcmVudCBsZW5ndGgKKyAgICAgICAgZm9yIG9wbmFtZSBpbiBvcG1hcDoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tmYWlsKFZhbHVlRXJyb3IsIG9wbmFtZSwgYSwgYikKKworICAgICAgICBhID0gcmFuZ2UoNSkKKyAgICAgICAgYiA9IDUgKiBbMl0KKyAgICAgICAgIyB0cnkgbWl4ZWQgYXJndW1lbnRzIChidXQgbm90IChhLCBiKSBhcyB0aGF0IHdvbid0IHJldHVybiBhIGJvb2wgdmVjdG9yKQorICAgICAgICBhcmdzID0gWyhhLCBWZWN0b3IoYikpLCAoVmVjdG9yKGEpLCBiKSwgKFZlY3RvcihhKSwgVmVjdG9yKGIpKV0KKyAgICAgICAgZm9yIChhLCBiKSBpbiBhcmdzOgorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCJsdCIsIGEsIGIsIFtUcnVlLCAgVHJ1ZSwgIEZhbHNlLCBGYWxzZSwgRmFsc2VdKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCJsZSIsIGEsIGIsIFtUcnVlLCAgVHJ1ZSwgIFRydWUsICBGYWxzZSwgRmFsc2VdKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCJlcSIsIGEsIGIsIFtGYWxzZSwgRmFsc2UsIFRydWUsICBGYWxzZSwgRmFsc2VdKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCJuZSIsIGEsIGIsIFtUcnVlLCAgVHJ1ZSwgIEZhbHNlLCBUcnVlLCAgVHJ1ZSBdKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCJndCIsIGEsIGIsIFtGYWxzZSwgRmFsc2UsIEZhbHNlLCBUcnVlLCAgVHJ1ZSBdKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCJnZSIsIGEsIGIsIFtGYWxzZSwgRmFsc2UsIFRydWUsICBUcnVlLCAgVHJ1ZSBdKQorCisgICAgICAgICAgICBmb3Igb3BzIGluIG9wbWFwLml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgICAgICAgICBmb3Igb3AgaW4gb3BzOgorICAgICAgICAgICAgICAgICAgICAjIGNhbGxzIF9fbm9uemVyb19fLCB3aGljaCBzaG91bGQgZmFpbAorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJvb2wsIG9wKGEsIGIpKQorCitjbGFzcyBOdW1iZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgY29tcGFyaXNvbnMgaW52b2x2aW5nIE51bWJlciBvYmplY3RzCisgICAgICAgICMgZ2l2ZSB0aGUgc2FtZSByZXN1bHRzIGdpdmUgYXMgY29tcGFyaW5nIHRoZQorICAgICAgICAjIGNvcnJlc3BvbmRpbmcgaW50cworICAgICAgICBmb3IgYSBpbiB4cmFuZ2UoMyk6CisgICAgICAgICAgICBmb3IgYiBpbiB4cmFuZ2UoMyk6CisgICAgICAgICAgICAgICAgZm9yIHR5cGVhIGluIChpbnQsIE51bWJlcik6CisgICAgICAgICAgICAgICAgICAgIGZvciB0eXBlYiBpbiAoaW50LCBOdW1iZXIpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHlwZWE9PXR5cGViPT1pbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgIyB0aGUgY29tYmluYXRpb24gaW50LCBpbnQgaXMgdXNlbGVzcworICAgICAgICAgICAgICAgICAgICAgICAgdGEgPSB0eXBlYShhKQorICAgICAgICAgICAgICAgICAgICAgICAgdGIgPSB0eXBlYihiKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG9wcyBpbiBvcG1hcC5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG9wIGluIG9wczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG91dGNvbWUgPSBvcChhLCBiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0b3V0Y29tZSA9IG9wKHRhLCB0YikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFsb3V0Y29tZSwgdGVzdG91dGNvbWUpCisKKyAgICBkZWYgY2hlY2t2YWx1ZShzZWxmLCBvcG5hbWUsIGEsIGIsIGV4cHJlcyk6CisgICAgICAgIGZvciB0eXBlYSBpbiAoaW50LCBOdW1iZXIpOgorICAgICAgICAgICAgZm9yIHR5cGViIGluIChpbnQsIE51bWJlcik6CisgICAgICAgICAgICAgICAgdGEgPSB0eXBlYShhKQorICAgICAgICAgICAgICAgIHRiID0gdHlwZWIoYikKKyAgICAgICAgICAgICAgICBmb3Igb3AgaW4gb3BtYXBbb3BuYW1lXToKKyAgICAgICAgICAgICAgICAgICAgcmVhbHJlcyA9IG9wKHRhLCB0YikKKyAgICAgICAgICAgICAgICAgICAgcmVhbHJlcyA9IGdldGF0dHIocmVhbHJlcywgIngiLCByZWFscmVzKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVhbHJlcyBpcyBleHByZXMpCisKKyAgICBkZWYgdGVzdF92YWx1ZXMoc2VsZik6CisgICAgICAgICMgY2hlY2sgYWxsIG9wZXJhdG9ycyBhbmQgYWxsIGNvbXBhcmlzb24gcmVzdWx0cworICAgICAgICBzZWxmLmNoZWNrdmFsdWUoImx0IiwgMCwgMCwgRmFsc2UpCisgICAgICAgIHNlbGYuY2hlY2t2YWx1ZSgibGUiLCAwLCAwLCBUcnVlICkKKyAgICAgICAgc2VsZi5jaGVja3ZhbHVlKCJlcSIsIDAsIDAsIFRydWUgKQorICAgICAgICBzZWxmLmNoZWNrdmFsdWUoIm5lIiwgMCwgMCwgRmFsc2UpCisgICAgICAgIHNlbGYuY2hlY2t2YWx1ZSgiZ3QiLCAwLCAwLCBGYWxzZSkKKyAgICAgICAgc2VsZi5jaGVja3ZhbHVlKCJnZSIsIDAsIDAsIFRydWUgKQorCisgICAgICAgIHNlbGYuY2hlY2t2YWx1ZSgibHQiLCAwLCAxLCBUcnVlICkKKyAgICAgICAgc2VsZi5jaGVja3ZhbHVlKCJsZSIsIDAsIDEsIFRydWUgKQorICAgICAgICBzZWxmLmNoZWNrdmFsdWUoImVxIiwgMCwgMSwgRmFsc2UpCisgICAgICAgIHNlbGYuY2hlY2t2YWx1ZSgibmUiLCAwLCAxLCBUcnVlICkKKyAgICAgICAgc2VsZi5jaGVja3ZhbHVlKCJndCIsIDAsIDEsIEZhbHNlKQorICAgICAgICBzZWxmLmNoZWNrdmFsdWUoImdlIiwgMCwgMSwgRmFsc2UpCisKKyAgICAgICAgc2VsZi5jaGVja3ZhbHVlKCJsdCIsIDEsIDAsIEZhbHNlKQorICAgICAgICBzZWxmLmNoZWNrdmFsdWUoImxlIiwgMSwgMCwgRmFsc2UpCisgICAgICAgIHNlbGYuY2hlY2t2YWx1ZSgiZXEiLCAxLCAwLCBGYWxzZSkKKyAgICAgICAgc2VsZi5jaGVja3ZhbHVlKCJuZSIsIDEsIDAsIFRydWUgKQorICAgICAgICBzZWxmLmNoZWNrdmFsdWUoImd0IiwgMSwgMCwgVHJ1ZSApCisgICAgICAgIHNlbGYuY2hlY2t2YWx1ZSgiZ2UiLCAxLCAwLCBUcnVlICkKKworY2xhc3MgTWlzY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbWlzYmVoYXZpbihzZWxmKToKKyAgICAgICAgY2xhc3MgTWlzYjoKKyAgICAgICAgICAgIGRlZiBfX2x0X18oc2VsZl8sIG90aGVyKTogcmV0dXJuIDAKKyAgICAgICAgICAgIGRlZiBfX2d0X18oc2VsZl8sIG90aGVyKTogcmV0dXJuIDAKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZl8sIG90aGVyKTogcmV0dXJuIDAKKyAgICAgICAgICAgIGRlZiBfX2xlX18oc2VsZl8sIG90aGVyKTogc2VsZi5mYWlsKCJUaGlzIHNob3VsZG4ndCBoYXBwZW4iKQorICAgICAgICAgICAgZGVmIF9fZ2VfXyhzZWxmXywgb3RoZXIpOiBzZWxmLmZhaWwoIlRoaXMgc2hvdWxkbid0IGhhcHBlbiIpCisgICAgICAgICAgICBkZWYgX19uZV9fKHNlbGZfLCBvdGhlcik6IHNlbGYuZmFpbCgiVGhpcyBzaG91bGRuJ3QgaGFwcGVuIikKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGZfLCBvdGhlcik6IHJhaXNlIFJ1bnRpbWVFcnJvciwgImV4cGVjdGVkIgorICAgICAgICBhID0gTWlzYigpCisgICAgICAgIGIgPSBNaXNiKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhPGIsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYT09YiwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhPmIsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY21wLCBhLCBiKQorCisgICAgZGVmIHRlc3Rfbm90KHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgZXhjZXB0aW9ucyBpbiBfX25vbnplcm9fXyBhcmUgcHJvcGVybHkKKyAgICAgICAgIyBwcm9wYWdhdGVkIGJ5IHRoZSBub3Qgb3BlcmF0b3IKKyAgICAgICAgaW1wb3J0IG9wZXJhdG9yCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBCYWQ6CisgICAgICAgICAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjCisKKyAgICAgICAgZGVmIGRvKGJhZCk6CisgICAgICAgICAgICBub3QgYmFkCisKKyAgICAgICAgZm9yIGZ1bmMgaW4gKGRvLCBvcGVyYXRvci5ub3RfKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgZnVuYywgQmFkKCkpCisKKyAgICBkZWYgdGVzdF9yZWN1cnNpb24oc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBjb21wYXJpc29uIGZvciByZWN1cnNpdmUgb2JqZWN0cyBmYWlscyBncmFjZWZ1bGx5CisgICAgICAgIGZyb20gVXNlckxpc3QgaW1wb3J0IFVzZXJMaXN0CisgICAgICAgIGEgPSBVc2VyTGlzdCgpCisgICAgICAgIGIgPSBVc2VyTGlzdCgpCisgICAgICAgIGEuYXBwZW5kKGIpCisgICAgICAgIGIuYXBwZW5kKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgb3BlcmF0b3IuZXEsIGEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgb3BlcmF0b3IubmUsIGEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgb3BlcmF0b3IubHQsIGEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgb3BlcmF0b3IubGUsIGEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgb3BlcmF0b3IuZ3QsIGEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgb3BlcmF0b3IuZ2UsIGEsIGIpCisKKyAgICAgICAgYi5hcHBlbmQoMTcpCisgICAgICAgICMgRXZlbiByZWN1cnNpdmUgbGlzdHMgb2YgZGlmZmVyZW50IGxlbmd0aHMgYXJlIGRpZmZlcmVudCwKKyAgICAgICAgIyBidXQgdGhleSBjYW5ub3QgYmUgb3JkZXJlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IChhID09IGIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAhPSBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLmx0LCBhLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLmxlLCBhLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLmd0LCBhLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLmdlLCBhLCBiKQorICAgICAgICBhLmFwcGVuZCgxNykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBvcGVyYXRvci5lcSwgYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBvcGVyYXRvci5uZSwgYSwgYikKKyAgICAgICAgYS5pbnNlcnQoMCwgMTEpCisgICAgICAgIGIuaW5zZXJ0KDAsIDEyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IChhID09IGIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAhPSBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA8IGIpCisKK2NsYXNzIERpY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2RpY3RzKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IF9fZXFfXyBhbmQgX19uZV9fIHdvcmsgZm9yIGRpY3RzIGV2ZW4gaWYgdGhlIGtleXMgYW5kCisgICAgICAgICMgdmFsdWVzIGRvbid0IHN1cHBvcnQgYW55dGhpbmcgb3RoZXIgdGhhbiBfX2VxX18gYW5kIF9fbmVfXyAoYW5kCisgICAgICAgICMgX19oYXNoX18pLiAgQ29tcGxleCBudW1iZXJzIGFyZSBhIGZpbmUgZXhhbXBsZSBvZiB0aGF0LgorICAgICAgICBpbXBvcnQgcmFuZG9tCisgICAgICAgIGltYWcxYSA9IHt9CisgICAgICAgIGZvciBpIGluIHJhbmdlKDUwKToKKyAgICAgICAgICAgIGltYWcxYVtyYW5kb20ucmFuZHJhbmdlKDEwMCkqMWpdID0gcmFuZG9tLnJhbmRyYW5nZSgxMDApKjFqCisgICAgICAgIGl0ZW1zID0gaW1hZzFhLml0ZW1zKCkKKyAgICAgICAgcmFuZG9tLnNodWZmbGUoaXRlbXMpCisgICAgICAgIGltYWcxYiA9IHt9CisgICAgICAgIGZvciBrLCB2IGluIGl0ZW1zOgorICAgICAgICAgICAgaW1hZzFiW2tdID0gdgorICAgICAgICBpbWFnMiA9IGltYWcxYi5jb3B5KCkKKyAgICAgICAgaW1hZzJba10gPSB2ICsgMS4wCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbWFnMWEgPT0gaW1hZzFhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW1hZzFhID09IGltYWcxYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGltYWcyID09IGltYWcyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW1hZzFhICE9IGltYWcyKQorICAgICAgICBmb3Igb3BuYW1lIGluICgibHQiLCAibGUiLCAiZ3QiLCAiZ2UiKToKKyAgICAgICAgICAgIGZvciBvcCBpbiBvcG1hcFtvcG5hbWVdOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3AsIGltYWcxYSwgaW1hZzIpCisKK2NsYXNzIExpc3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NvdmVyYWdlKHNlbGYpOgorICAgICAgICAjIGV4ZXJjaXNlIGFsbCBjb21wYXJpc29ucyBmb3IgbGlzdHMKKyAgICAgICAgeCA9IFs0Ml0KKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4PHgsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKHg8PXgsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeD09eCwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4IT14LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4PngsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKHg+PXgsIFRydWUpCisgICAgICAgIHkgPSBbNDIsIDQyXQorICAgICAgICBzZWxmLmFzc2VydElzKHg8eSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4PD15LCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKHg9PXksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKHghPXksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeD55LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4Pj15LCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2JhZGVudHJ5KHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IGV4Y2VwdGlvbnMgZm9yIGl0ZW0gY29tcGFyaXNvbiBhcmUgcHJvcGVybHkKKyAgICAgICAgIyBwcm9wYWdhdGVkIGluIGxpc3QgY29tcGFyaXNvbnMKKyAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEJhZDoKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YworCisgICAgICAgIHggPSBbQmFkKCldCisgICAgICAgIHkgPSBbQmFkKCldCisKKyAgICAgICAgZm9yIG9wIGluIG9wbWFwWyJlcSJdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBvcCwgeCwgeSkKKworICAgIGRlZiB0ZXN0X2dvb2RlbnRyeShzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3QgZXhlcmNpc2VzIHRoZSBmaW5hbCBjYWxsIHRvIFB5T2JqZWN0X1JpY2hDb21wYXJlKCkKKyAgICAgICAgIyBpbiBPYmplY3RzL2xpc3RvYmplY3QuYzo6bGlzdF9yaWNoY29tcGFyZSgpCisgICAgICAgIGNsYXNzIEdvb2Q6CisgICAgICAgICAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHggPSBbR29vZCgpXQorICAgICAgICB5ID0gW0dvb2QoKV0KKworICAgICAgICBmb3Igb3AgaW4gb3BtYXBbImx0Il06CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKG9wKHgsIHkpLCBUcnVlKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChWZWN0b3JUZXN0LCBOdW1iZXJUZXN0LCBNaXNjVGVzdCwgTGlzdFRlc3QpCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygoImRpY3QgaW5lcXVhbGl0eSBjb21wYXJpc29ucyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IHN1cHBvcnRlZCBpbiAzLngiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoRGljdFRlc3QpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmljaGNtcC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yaWNoY21wLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTAwMWUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmljaGNtcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmljaGNtcC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yaWNoY21wLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTAwMWUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmljaGNtcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzBlNzBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHkKQEAgLTAsMCArMSw3MyBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgX19idWlsdGluX18gYXMgYnVpbHRpbnMKK2ltcG9ydCBybGNvbXBsZXRlcgorCitjbGFzcyBDb21wbGV0ZU1lKG9iamVjdCk6CisgICAgIiIiIFRyaXZpYWwgY2xhc3MgdXNlZCBpbiB0ZXN0aW5nIHJsY29tcGxldGVyLkNvbXBsZXRlci4gIiIiCisgICAgc3BhbSA9IDEKKworCitjbGFzcyBUZXN0Umxjb21wbGV0ZXIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zdGRjb21wbGV0ZXIgPSBybGNvbXBsZXRlci5Db21wbGV0ZXIoKQorICAgICAgICBzZWxmLmNvbXBsZXRlciA9IHJsY29tcGxldGVyLkNvbXBsZXRlcihkaWN0KHNwYW09aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVnZz1zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGVNZT1Db21wbGV0ZU1lKSkKKworICAgICAgICAjIGZvcmNlcyBzdGRjb21wbGV0ZXIgdG8gYmluZCBidWlsdGlucyBuYW1lc3BhY2UKKyAgICAgICAgc2VsZi5zdGRjb21wbGV0ZXIuY29tcGxldGUoJycsIDApCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEEoZGljdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEIobGlzdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuc3RkY29tcGxldGVyLnVzZV9tYWluX25zKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuY29tcGxldGVyLnVzZV9tYWluX25zKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJsY29tcGxldGVyLkNvbXBsZXRlcihBKCkpLnVzZV9tYWluX25zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJsY29tcGxldGVyLkNvbXBsZXRlciwgQigoMSwpKSkKKworICAgIGRlZiB0ZXN0X2dsb2JhbF9tYXRjaGVzKHNlbGYpOgorICAgICAgICAjIHRlc3Qgd2l0aCBidWlsdGlucyBuYW1lc3BhY2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoc2VsZi5zdGRjb21wbGV0ZXIuZ2xvYmFsX21hdGNoZXMoJ2RpJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFt4KycoJyBmb3IgeCBpbiBkaXIoYnVpbHRpbnMpIGlmIHguc3RhcnRzd2l0aCgnZGknKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHNlbGYuc3RkY29tcGxldGVyLmdsb2JhbF9tYXRjaGVzKCdzdCcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbeCsnKCcgZm9yIHggaW4gZGlyKGJ1aWx0aW5zKSBpZiB4LnN0YXJ0c3dpdGgoJ3N0JyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmdsb2JhbF9tYXRjaGVzKCdha2Frc2FqYWRoYWsnKSwgW10pCisKKyAgICAgICAgIyB0ZXN0IHdpdGggYSBjdXN0b21pemVkIG5hbWVzcGFjZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmdsb2JhbF9tYXRjaGVzKCdDb21wbGV0ZU0nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUoJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuZ2xvYmFsX21hdGNoZXMoJ2VnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydlZ2coJ10pCisgICAgICAgICMgWFhYOiBzZWUgaXNzdWU1MjU2CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuZ2xvYmFsX21hdGNoZXMoJ0NvbXBsZXRlTScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZSgnXSkKKworICAgIGRlZiB0ZXN0X2F0dHJfbWF0Y2hlcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHdpdGggYnVpbHRpbnMgbmFtZXNwYWNlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGRjb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdzdHIucycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnc3RyLnt9KCcuZm9ybWF0KHgpIGZvciB4IGluIGRpcihzdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHguc3RhcnRzd2l0aCgncycpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0ZGNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ3R1cGxlLmZvb3NwYW1lZ2cnKSwgW10pCisKKyAgICAgICAgIyB0ZXN0IHdpdGggYSBjdXN0b21pemVkIG5hbWVzcGFjZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnQ29tcGxldGVNZS5zcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZS5zcGFtJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdDb21wbGV0ZW1lLmVnZycpLCBbXSkKKworICAgICAgICBDb21wbGV0ZU1lLm1lID0gQ29tcGxldGVNZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnQ29tcGxldGVNZS5tZS5tZS5zcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnQ29tcGxldGVNZS5tZS5tZS5zcGFtJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCdlZ2cucycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnZWdnLnt9KCcuZm9ybWF0KHgpIGZvciB4IGluIGRpcihzdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHguc3RhcnRzd2l0aCgncycpXSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RSbGNvbXBsZXRlcikKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiMDZkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JsY29tcGxldGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiMDZkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JsY29tcGxldGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZDRhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weQpAQCAtMCwwICsxLDI3NiBAQAoraW1wb3J0IHVuaXR0ZXN0LCBTdHJpbmdJTywgcm9ib3RwYXJzZXIKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHVybGxpYjIgaW1wb3J0IHVybG9wZW4sIEhUVFBFcnJvcgorCitjbGFzcyBSb2JvdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZXgsIHBhcnNlciwgdXJsLCBnb29kLCBhZ2VudCk6CisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYpCisgICAgICAgIGlmIGdvb2Q6CisgICAgICAgICAgICBzZWxmLnN0ciA9ICJSb2JvdFRlc3QoJWQsIGdvb2QsICVzKSIgJSAoaW5kZXgsIHVybCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RyID0gIlJvYm90VGVzdCglZCwgYmFkLCAlcykiICUgKGluZGV4LCB1cmwpCisgICAgICAgIHNlbGYucGFyc2VyID0gcGFyc2VyCisgICAgICAgIHNlbGYudXJsID0gdXJsCisgICAgICAgIHNlbGYuZ29vZCA9IGdvb2QKKyAgICAgICAgc2VsZi5hZ2VudCA9IGFnZW50CisKKyAgICBkZWYgcnVuVGVzdChzZWxmKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnVybCwgdHVwbGUpOgorICAgICAgICAgICAgYWdlbnQsIHVybCA9IHNlbGYudXJsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1cmwgPSBzZWxmLnVybAorICAgICAgICAgICAgYWdlbnQgPSBzZWxmLmFnZW50CisgICAgICAgIGlmIHNlbGYuZ29vZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5jYW5fZmV0Y2goYWdlbnQsIHVybCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGFyc2VyLmNhbl9mZXRjaChhZ2VudCwgdXJsKSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdHIKKwordGVzdHMgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCitkZWYgUm9ib3RUZXN0KGluZGV4LCByb2JvdHNfdHh0LCBnb29kX3VybHMsIGJhZF91cmxzLAorICAgICAgICAgICAgICBhZ2VudD0idGVzdF9yb2JvdHBhcnNlciIpOgorCisgICAgbGluZXMgPSBTdHJpbmdJTy5TdHJpbmdJTyhyb2JvdHNfdHh0KS5yZWFkbGluZXMoKQorICAgIHBhcnNlciA9IHJvYm90cGFyc2VyLlJvYm90RmlsZVBhcnNlcigpCisgICAgcGFyc2VyLnBhcnNlKGxpbmVzKQorICAgIGZvciB1cmwgaW4gZ29vZF91cmxzOgorICAgICAgICB0ZXN0cy5hZGRUZXN0KFJvYm90VGVzdENhc2UoaW5kZXgsIHBhcnNlciwgdXJsLCAxLCBhZ2VudCkpCisgICAgZm9yIHVybCBpbiBiYWRfdXJsczoKKyAgICAgICAgdGVzdHMuYWRkVGVzdChSb2JvdFRlc3RDYXNlKGluZGV4LCBwYXJzZXIsIHVybCwgMCwgYWdlbnQpKQorCisjIEV4YW1wbGVzIGZyb20gaHR0cDovL3d3dy5yb2JvdHN0eHQub3JnL3djL25vcm9ib3RzLmh0bWwgKGZldGNoZWQgMjAwMikKKworIyAxLgorZG9jID0gIiIiCitVc2VyLWFnZW50OiAqCitEaXNhbGxvdzogL2N5YmVyd29ybGQvbWFwLyAjIFRoaXMgaXMgYW4gaW5maW5pdGUgdmlydHVhbCBVUkwgc3BhY2UKK0Rpc2FsbG93OiAvdG1wLyAjIHRoZXNlIHdpbGwgc29vbiBkaXNhcHBlYXIKK0Rpc2FsbG93OiAvZm9vLmh0bWwKKyIiIgorCitnb29kID0gWycvJywnL3Rlc3QuaHRtbCddCitiYWQgPSBbJy9jeWJlcndvcmxkL21hcC9pbmRleC5odG1sJywnL3RtcC94eHgnLCcvZm9vLmh0bWwnXQorCitSb2JvdFRlc3QoMSwgZG9jLCBnb29kLCBiYWQpCisKKyMgMi4KK2RvYyA9ICIiIgorIyByb2JvdHMudHh0IGZvciBodHRwOi8vd3d3LmV4YW1wbGUuY29tLworCitVc2VyLWFnZW50OiAqCitEaXNhbGxvdzogL2N5YmVyd29ybGQvbWFwLyAjIFRoaXMgaXMgYW4gaW5maW5pdGUgdmlydHVhbCBVUkwgc3BhY2UKKworIyBDeWJlcm1hcHBlciBrbm93cyB3aGVyZSB0byBnby4KK1VzZXItYWdlbnQ6IGN5YmVybWFwcGVyCitEaXNhbGxvdzoKKworIiIiCisKK2dvb2QgPSBbJy8nLCcvdGVzdC5odG1sJywoJ2N5YmVybWFwcGVyJywnL2N5YmVyd29ybGQvbWFwL2luZGV4Lmh0bWwnKV0KK2JhZCA9IFsnL2N5YmVyd29ybGQvbWFwL2luZGV4Lmh0bWwnXQorCitSb2JvdFRlc3QoMiwgZG9jLCBnb29kLCBiYWQpCisKKyMgMy4KK2RvYyA9ICIiIgorIyBnbyBhd2F5CitVc2VyLWFnZW50OiAqCitEaXNhbGxvdzogLworIiIiCisKK2dvb2QgPSBbXQorYmFkID0gWycvY3liZXJ3b3JsZC9tYXAvaW5kZXguaHRtbCcsJy8nLCcvdG1wLyddCisKK1JvYm90VGVzdCgzLCBkb2MsIGdvb2QsIGJhZCkKKworIyBFeGFtcGxlcyBmcm9tIGh0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZy93Yy9ub3JvYm90cy1yZmMuaHRtbCAoZmV0Y2hlZCAyMDAyKQorCisjIDQuCitkb2MgPSAiIiIKK1VzZXItYWdlbnQ6IGZpZ3RyZWUKK0Rpc2FsbG93OiAvdG1wCitEaXNhbGxvdzogL2ElM2NkLmh0bWwKK0Rpc2FsbG93OiAvYSUyZmIuaHRtbAorRGlzYWxsb3c6IC8lN2Vqb2UvaW5kZXguaHRtbAorIiIiCisKK2dvb2QgPSBbXSAjIFhGQUlMICcvYS9iLmh0bWwnCitiYWQgPSBbJy90bXAnLCcvdG1wLmh0bWwnLCcvdG1wL2EuaHRtbCcsCisgICAgICAgJy9hJTNjZC5odG1sJywnL2ElM0NkLmh0bWwnLCcvYSUyZmIuaHRtbCcsCisgICAgICAgJy9+am9lL2luZGV4Lmh0bWwnCisgICAgICAgXQorCitSb2JvdFRlc3QoNCwgZG9jLCBnb29kLCBiYWQsICdmaWd0cmVlJykKK1JvYm90VGVzdCg1LCBkb2MsIGdvb2QsIGJhZCwgJ0ZpZ1RyZWUgUm9ib3QgbGlid3d3LXBlcmwvNS4wNCcpCisKKyMgNi4KK2RvYyA9ICIiIgorVXNlci1hZ2VudDogKgorRGlzYWxsb3c6IC90bXAvCitEaXNhbGxvdzogL2ElM0NkLmh0bWwKK0Rpc2FsbG93OiAvYS9iLmh0bWwKK0Rpc2FsbG93OiAvJTdlam9lL2luZGV4Lmh0bWwKKyIiIgorCitnb29kID0gWycvdG1wJyxdICMgWEZBSUw6ICcvYSUyZmIuaHRtbCcKK2JhZCA9IFsnL3RtcC8nLCcvdG1wL2EuaHRtbCcsCisgICAgICAgJy9hJTNjZC5odG1sJywnL2ElM0NkLmh0bWwnLCIvYS9iLmh0bWwiLAorICAgICAgICcvJTdFam9lL2luZGV4Lmh0bWwnXQorCitSb2JvdFRlc3QoNiwgZG9jLCBnb29kLCBiYWQpCisKKyMgRnJvbSBidWcgcmVwb3J0ICM1MjMwNDEKKworIyA3LgorZG9jID0gIiIiCitVc2VyLUFnZW50OiAqCitEaXNhbGxvdzogLy4KKyIiIgorCitnb29kID0gWycvZm9vLmh0bWwnXQorYmFkID0gW10gIyBCdWcgcmVwb3J0IHNheXMgIi8iIHNob3VsZCBiZSBkZW5pZWQsIGJ1dCB0aGF0IGlzIG5vdCBpbiB0aGUgUkZDCisKK1JvYm90VGVzdCg3LCBkb2MsIGdvb2QsIGJhZCkKKworIyBGcm9tIEdvb2dsZTogaHR0cDovL3d3dy5nb29nbGUuY29tL3N1cHBvcnQvd2VibWFzdGVycy9iaW4vYW5zd2VyLnB5P2hsPWVuJmFuc3dlcj00MDM2NAorCisjIDguCitkb2MgPSAiIiIKK1VzZXItYWdlbnQ6IEdvb2dsZWJvdAorQWxsb3c6IC9mb2xkZXIxL215ZmlsZS5odG1sCitEaXNhbGxvdzogL2ZvbGRlcjEvCisiIiIKKworZ29vZCA9IFsnL2ZvbGRlcjEvbXlmaWxlLmh0bWwnXQorYmFkID0gWycvZm9sZGVyMS9hbm90aGVyZmlsZS5odG1sJ10KKworUm9ib3RUZXN0KDgsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90IikKKworIyA5LiAgVGhpcyBmaWxlIGlzIGluY29ycmVjdCBiZWNhdXNlICJHb29nbGVib3QiIGlzIGEgc3Vic3RyaW5nIG9mCisjICAgICAiR29vZ2xlYm90LU1vYmlsZSIsIHNvIHRlc3QgMTAgd29ya3MganVzdCBsaWtlIHRlc3QgOS4KK2RvYyA9ICIiIgorVXNlci1hZ2VudDogR29vZ2xlYm90CitEaXNhbGxvdzogLworCitVc2VyLWFnZW50OiBHb29nbGVib3QtTW9iaWxlCitBbGxvdzogLworIiIiCisKK2dvb2QgPSBbXQorYmFkID0gWycvc29tZXRoaW5nLmpwZyddCisKK1JvYm90VGVzdCg5LCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdCIpCisKK2dvb2QgPSBbXQorYmFkID0gWycvc29tZXRoaW5nLmpwZyddCisKK1JvYm90VGVzdCgxMCwgZG9jLCBnb29kLCBiYWQsIGFnZW50PSJHb29nbGVib3QtTW9iaWxlIikKKworIyAxMS4gIEdldCB0aGUgb3JkZXIgY29ycmVjdC4KK2RvYyA9ICIiIgorVXNlci1hZ2VudDogR29vZ2xlYm90LU1vYmlsZQorQWxsb3c6IC8KKworVXNlci1hZ2VudDogR29vZ2xlYm90CitEaXNhbGxvdzogLworIiIiCisKK2dvb2QgPSBbXQorYmFkID0gWycvc29tZXRoaW5nLmpwZyddCisKK1JvYm90VGVzdCgxMSwgZG9jLCBnb29kLCBiYWQsIGFnZW50PSJHb29nbGVib3QiKQorCitnb29kID0gWycvc29tZXRoaW5nLmpwZyddCitiYWQgPSBbXQorCitSb2JvdFRlc3QoMTIsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCisKKworIyAxMy4gIEdvb2dsZSBhbHNvIGdvdCB0aGUgb3JkZXIgd3JvbmcgaW4gIzguICBZb3UgbmVlZCB0byBzcGVjaWZ5IHRoZQorIyAgICAgIFVSTHMgZnJvbSBtb3JlIHNwZWNpZmljIHRvIG1vcmUgZ2VuZXJhbC4KK2RvYyA9ICIiIgorVXNlci1hZ2VudDogR29vZ2xlYm90CitBbGxvdzogL2ZvbGRlcjEvbXlmaWxlLmh0bWwKK0Rpc2FsbG93OiAvZm9sZGVyMS8KKyIiIgorCitnb29kID0gWycvZm9sZGVyMS9teWZpbGUuaHRtbCddCitiYWQgPSBbJy9mb2xkZXIxL2Fub3RoZXJmaWxlLmh0bWwnXQorCitSb2JvdFRlc3QoMTMsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iZ29vZ2xlYm90IikKKworCisjIDE0LiBGb3IgaXNzdWUgIzYzMjUgKHF1ZXJ5IHN0cmluZyBzdXBwb3J0KQorZG9jID0gIiIiCitVc2VyLWFnZW50OiAqCitEaXNhbGxvdzogL3NvbWUvcGF0aD9uYW1lPXZhbHVlCisiIiIKKworZ29vZCA9IFsnL3NvbWUvcGF0aCddCitiYWQgPSBbJy9zb21lL3BhdGg/bmFtZT12YWx1ZSddCisKK1JvYm90VGVzdCgxNCwgZG9jLCBnb29kLCBiYWQpCisKKyMgMTUuIEZvciBpc3N1ZSAjNDEwOCAob2JleSBmaXJzdCAqIGVudHJ5KQorZG9jID0gIiIiCitVc2VyLWFnZW50OiAqCitEaXNhbGxvdzogL3NvbWUvcGF0aAorCitVc2VyLWFnZW50OiAqCitEaXNhbGxvdzogL2Fub3RoZXIvcGF0aAorIiIiCisKK2dvb2QgPSBbJy9hbm90aGVyL3BhdGgnXQorYmFkID0gWycvc29tZS9wYXRoJ10KKworUm9ib3RUZXN0KDE1LCBkb2MsIGdvb2QsIGJhZCkKKworCitjbGFzcyBOZXR3b3JrVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RQYXNzd29yZFByb3RlY3RlZFNpdGUoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5yZXF1aXJlcygnbmV0d29yaycpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgnbXVlYmxlc21vcmFsZWRhLmNvbScpOgorICAgICAgICAgICAgdXJsID0gJ2h0dHA6Ly9tdWVibGVzbW9yYWxlZGEuY29tJworICAgICAgICAgICAgcm9ib3RzX3VybCA9IHVybCArICIvcm9ib3RzLnR4dCIKKyAgICAgICAgICAgICMgRmlyc3QgY2hlY2sgdGhlIFVSTCBpcyB1c2FibGUgZm9yIG91ciBwdXJwb3Nlcywgc2luY2UgdGhlCisgICAgICAgICAgICAjIHRlc3Qgc2l0ZSBpcyBhIGJpdCBmbGFreS4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1cmxvcGVuKHJvYm90c191cmwpCisgICAgICAgICAgICBleGNlcHQgSFRUUEVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgZS5jb2RlIG5vdCBpbiB7NDAxLCA0MDN9OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgIiVyIHNob3VsZCByZXR1cm4gYSA0MDEgb3IgNDAzIEhUVFAgZXJyb3IsIG5vdCAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgKHJvYm90c191cmwsIGUuY29kZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoCisgICAgICAgICAgICAgICAgICAgICIlciBzaG91bGQgcmV0dXJuIGEgNDAxIG9yIDQwMyBIVFRQIGVycm9yLCBub3Qgc3VjY2VlZCIKKyAgICAgICAgICAgICAgICAgICAgJSAocm9ib3RzX3VybCkpCisgICAgICAgICAgICBwYXJzZXIgPSByb2JvdHBhcnNlci5Sb2JvdEZpbGVQYXJzZXIoKQorICAgICAgICAgICAgcGFyc2VyLnNldF91cmwodXJsKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhcnNlci5yZWFkKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJyVzIGlzIHVuYXZhaWxhYmxlJyAlIHVybCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmNhbl9mZXRjaCgiKiIsIHJvYm90c191cmwpLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0UHl0aG9uT3JnKHNlbGYpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoJ25ldHdvcmsnKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoJ3d3dy5weXRob24ub3JnJyk6CisgICAgICAgICAgICBwYXJzZXIgPSByb2JvdHBhcnNlci5Sb2JvdEZpbGVQYXJzZXIoCisgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cucHl0aG9uLm9yZy9yb2JvdHMudHh0IikKKyAgICAgICAgICAgIHBhcnNlci5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICBwYXJzZXIuY2FuX2ZldGNoKCIqIiwgImh0dHA6Ly93d3cucHl0aG9uLm9yZy9yb2JvdHMudHh0IikpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QodGVzdHMpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChOZXR3b3JrVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fPT0nX19tYWluX18nOgorICAgIHRlc3Rfc3VwcG9ydC52ZXJib3NlID0gMQorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4MzEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg4MzEyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ydW5weS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3J1bnB5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ODU4ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ydW5weS5weQpAQCAtMCwwICsxLDQwNSBAQAorIyBUZXN0IHRoZSBydW5weSBtb2R1bGUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHN5cworaW1wb3J0IHJlCitpbXBvcnQgdGVtcGZpbGUKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHJ1bl91bml0dGVzdCwgZm9yZ2V0Citmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgKHRlbXBfZGlyLCBtYWtlX3NjcmlwdCwgY29tcGlsZV9zY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGtnLCBtYWtlX3ppcF9zY3JpcHQsIG1ha2VfemlwX3BrZykKKworCitmcm9tIHJ1bnB5IGltcG9ydCBfcnVuX2NvZGUsIF9ydW5fbW9kdWxlX2NvZGUsIHJ1bl9tb2R1bGUsIHJ1bl9wYXRoCisjIE5vdGU6IFRoaXMgbW9kdWxlIGNhbid0IHNhZmVseSB0ZXN0IF9ydW5fbW9kdWxlX2FzX21haW4gYXMgaXQKKyMgcnVucyBpdHMgdGVzdHMgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcywgd2hpY2ggd291bGQgbWVzcyB3aXRoIHRoZQorIyByZWFsIF9fbWFpbl9fIG1vZHVsZSAodXN1YWxseSB0ZXN0LnJlZ3J0ZXN0KQorIyBTZWUgdGVzdF9jbWRfbGluZV9zY3JpcHQgZm9yIGEgdGVzdCB0aGF0IGV4ZWN1dGVzIHRoYXQgY29kZSBwYXRoCisKKyMgU2V0IHVwIHRoZSB0ZXN0IGNvZGUgYW5kIGV4cGVjdGVkIHJlc3VsdHMKKworY2xhc3MgUnVuTW9kdWxlQ29kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlVuaXQgdGVzdHMgZm9yIHJ1bnB5Ll9ydW5fY29kZSBhbmQgcnVucHkuX3J1bl9tb2R1bGVfY29kZSIiIgorCisgICAgZXhwZWN0ZWRfcmVzdWx0ID0gWyJUb3AgbGV2ZWwgYXNzaWdubWVudCIsICJMb3dlciBsZXZlbCByZWZlcmVuY2UiXQorICAgIHRlc3Rfc291cmNlID0gKAorICAgICAgICAiIyBDaGVjayBiYXNpYyBjb2RlIGV4ZWN1dGlvblxuIgorICAgICAgICAicmVzdWx0ID0gWydUb3AgbGV2ZWwgYXNzaWdubWVudCddXG4iCisgICAgICAgICJkZWYgZigpOlxuIgorICAgICAgICAiICAgIHJlc3VsdC5hcHBlbmQoJ0xvd2VyIGxldmVsIHJlZmVyZW5jZScpXG4iCisgICAgICAgICJmKClcbiIKKyAgICAgICAgIiMgQ2hlY2sgdGhlIHN5cyBtb2R1bGVcbiIKKyAgICAgICAgImltcG9ydCBzeXNcbiIKKyAgICAgICAgInJ1bl9hcmd2MCA9IHN5cy5hcmd2WzBdXG4iCisgICAgICAgICJydW5fbmFtZV9pbl9zeXNfbW9kdWxlcyA9IF9fbmFtZV9fIGluIHN5cy5tb2R1bGVzXG4iCisgICAgICAgICJpZiBydW5fbmFtZV9pbl9zeXNfbW9kdWxlczpcbiIKKyAgICAgICAgIiAgIG1vZHVsZV9pbl9zeXNfbW9kdWxlcyA9IGdsb2JhbHMoKSBpcyBzeXMubW9kdWxlc1tfX25hbWVfX10uX19kaWN0X19cbiIKKyAgICAgICAgIiMgQ2hlY2sgbmVzdGVkIG9wZXJhdGlvblxuIgorICAgICAgICAiaW1wb3J0IHJ1bnB5XG4iCisgICAgICAgICJuZXN0ZWQgPSBydW5weS5fcnVuX21vZHVsZV9jb2RlKCd4PTFcXG4nLCBtb2RfbmFtZT0nPHJ1bj4nKVxuIgorICAgICkKKworICAgIGRlZiB0ZXN0X3J1bl9jb2RlKHNlbGYpOgorICAgICAgICBzYXZlZF9hcmd2MCA9IHN5cy5hcmd2WzBdCisgICAgICAgIGQgPSBfcnVuX2NvZGUoc2VsZi50ZXN0X3NvdXJjZSwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsicmVzdWx0Il0sIHNlbGYuZXhwZWN0ZWRfcmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydElzKGRbIl9fbmFtZV9fIl0sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZFsiX19maWxlX18iXSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhkWyJfX2xvYWRlcl9fIl0sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZFsiX19wYWNrYWdlX18iXSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhkWyJydW5fYXJndjAiXSwgc2F2ZWRfYXJndjApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oInJ1bl9uYW1lIiwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzeXMuYXJndlswXSwgc2F2ZWRfYXJndjApCisKKyAgICBkZWYgdGVzdF9ydW5fbW9kdWxlX2NvZGUoc2VsZik6CisgICAgICAgIGluaXRpYWwgPSBvYmplY3QoKQorICAgICAgICBuYW1lID0gIjxOb25zZW5zZT4iCisgICAgICAgIGZpbGUgPSAiU29tZSBvdGhlciBub25zZW5zZSIKKyAgICAgICAgbG9hZGVyID0gIk5vdyB5b3UncmUganVzdCBiZWluZyBzaWxseSIKKyAgICAgICAgcGFja2FnZSA9ICcnICMgVHJlYXQgYXMgYSB0b3AgbGV2ZWwgbW9kdWxlCisgICAgICAgIGQxID0gZGljdChpbml0aWFsPWluaXRpYWwpCisgICAgICAgIHNhdmVkX2FyZ3YwID0gc3lzLmFyZ3ZbMF0KKyAgICAgICAgZDIgPSBfcnVuX21vZHVsZV9jb2RlKHNlbGYudGVzdF9zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigicmVzdWx0IiwgZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZDJbImluaXRpYWwiXSwgaW5pdGlhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMlsicmVzdWx0Il0sIHNlbGYuZXhwZWN0ZWRfcmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyWyJuZXN0ZWQiXVsieCJdLCAxKQorICAgICAgICBzZWxmLmFzc2VydElzKGQyWyJfX25hbWVfXyJdLCBuYW1lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbInJ1bl9uYW1lX2luX3N5c19tb2R1bGVzIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMlsibW9kdWxlX2luX3N5c19tb2R1bGVzIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZDJbIl9fZmlsZV9fIl0sIGZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZDJbInJ1bl9hcmd2MCJdLCBmaWxlKQorICAgICAgICBzZWxmLmFzc2VydElzKGQyWyJfX2xvYWRlcl9fIl0sIGxvYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhkMlsiX19wYWNrYWdlX18iXSwgcGFja2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzeXMuYXJndlswXSwgc2F2ZWRfYXJndjApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4obmFtZSwgc3lzLm1vZHVsZXMpCisKKworY2xhc3MgUnVuTW9kdWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVW5pdCB0ZXN0cyBmb3IgcnVucHkucnVuX21vZHVsZSIiIgorCisgICAgZGVmIGV4cGVjdF9pbXBvcnRfZXJyb3Ioc2VsZiwgbW9kX25hbWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBydW5fbW9kdWxlKG1vZF9uYW1lKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkIGltcG9ydCBlcnJvciBmb3IgIiArIG1vZF9uYW1lKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9uYW1lcyhzZWxmKToKKyAgICAgICAgIyBCdWlsdGluIG1vZHVsZQorICAgICAgICBzZWxmLmV4cGVjdF9pbXBvcnRfZXJyb3IoInN5cyIpCisgICAgICAgICMgTm9uLWV4aXN0ZW50IG1vZHVsZXMKKyAgICAgICAgc2VsZi5leHBlY3RfaW1wb3J0X2Vycm9yKCJzeXMuaW1wLmVyaWMiKQorICAgICAgICBzZWxmLmV4cGVjdF9pbXBvcnRfZXJyb3IoIm9zLnBhdGguaGFsZiIpCisgICAgICAgIHNlbGYuZXhwZWN0X2ltcG9ydF9lcnJvcigiYS5iZWUiKQorICAgICAgICBzZWxmLmV4cGVjdF9pbXBvcnRfZXJyb3IoIi5ob3dhcmQiKQorICAgICAgICBzZWxmLmV4cGVjdF9pbXBvcnRfZXJyb3IoIi4uZWF0ZW4iKQorICAgICAgICAjIFBhY2thZ2Ugd2l0aG91dCBfX21haW5fXy5weQorICAgICAgICBzZWxmLmV4cGVjdF9pbXBvcnRfZXJyb3IoIm11bHRpcHJvY2Vzc2luZyIpCisKKyAgICBkZWYgdGVzdF9saWJyYXJ5X21vZHVsZShzZWxmKToKKyAgICAgICAgcnVuX21vZHVsZSgicnVucHkiKQorCisgICAgZGVmIF9hZGRfcGtnX2RpcihzZWxmLCBwa2dfZGlyKToKKyAgICAgICAgb3MubWtkaXIocGtnX2RpcikKKyAgICAgICAgcGtnX2ZuYW1lID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICJfX2luaXRfXyIrb3MuZXh0c2VwKyJweSIpCisgICAgICAgIHBrZ19maWxlID0gb3Blbihwa2dfZm5hbWUsICJ3IikKKyAgICAgICAgcGtnX2ZpbGUuY2xvc2UoKQorICAgICAgICByZXR1cm4gcGtnX2ZuYW1lCisKKyAgICBkZWYgX21ha2VfcGtnKHNlbGYsIHNvdXJjZSwgZGVwdGgsIG1vZF9iYXNlPSJydW5weV90ZXN0Iik6CisgICAgICAgIHBrZ19uYW1lID0gIl9fcnVucHlfcGtnX18iCisgICAgICAgIHRlc3RfZm5hbWUgPSBtb2RfYmFzZStvcy5leHRzZXArInB5IgorICAgICAgICBwa2dfZGlyID0gc3ViX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiICBQYWNrYWdlIHRyZWUgaW46Iiwgc3ViX2RpcgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcGtnX2RpcikKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIiAgVXBkYXRlZCBzeXMucGF0aDoiLCBzeXMucGF0aFswXQorICAgICAgICBmb3IgaSBpbiByYW5nZShkZXB0aCk6CisgICAgICAgICAgICBzdWJfZGlyID0gb3MucGF0aC5qb2luKHN1Yl9kaXIsIHBrZ19uYW1lKQorICAgICAgICAgICAgcGtnX2ZuYW1lID0gc2VsZi5fYWRkX3BrZ19kaXIoc3ViX2RpcikKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICIgIE5leHQgbGV2ZWwgaW46Iiwgc3ViX2RpcgorICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIiAgQ3JlYXRlZDoiLCBwa2dfZm5hbWUKKyAgICAgICAgbW9kX2ZuYW1lID0gb3MucGF0aC5qb2luKHN1Yl9kaXIsIHRlc3RfZm5hbWUpCisgICAgICAgIG1vZF9maWxlID0gb3Blbihtb2RfZm5hbWUsICJ3IikKKyAgICAgICAgbW9kX2ZpbGUud3JpdGUoc291cmNlKQorICAgICAgICBtb2RfZmlsZS5jbG9zZSgpCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICIgIENyZWF0ZWQ6IiwgbW9kX2ZuYW1lCisgICAgICAgIG1vZF9uYW1lID0gKHBrZ19uYW1lKyIuIikqZGVwdGggKyBtb2RfYmFzZQorICAgICAgICByZXR1cm4gcGtnX2RpciwgbW9kX2ZuYW1lLCBtb2RfbmFtZQorCisgICAgZGVmIF9kZWxfcGtnKHNlbGYsIHRvcCwgZGVwdGgsIG1vZF9uYW1lKToKKyAgICAgICAgZm9yIGVudHJ5IGluIGxpc3Qoc3lzLm1vZHVsZXMpOgorICAgICAgICAgICAgaWYgZW50cnkuc3RhcnRzd2l0aCgiX19ydW5weV9wa2dfXyIpOgorICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tlbnRyeV0KKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIiAgUmVtb3ZlZCBzeXMubW9kdWxlcyBlbnRyaWVzIgorICAgICAgICBkZWwgc3lzLnBhdGhbMF0KKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIiAgUmVtb3ZlZCBzeXMucGF0aCBlbnRyeSIKKyAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsodG9wLCB0b3Bkb3duPUZhbHNlKToKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihyb290LCBuYW1lKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZXg6CisgICAgICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50IGV4ICMgUGVyc2lzdCB3aXRoIGNsZWFuaW5nIHVwCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBkaXJzOgorICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHJvb3QsIG5hbWUpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy5ybWRpcihmdWxsbmFtZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZXg6CisgICAgICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50IGV4ICMgUGVyc2lzdCB3aXRoIGNsZWFuaW5nIHVwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJtZGlyKHRvcCkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICIgIFJlbW92ZWQgcGFja2FnZSB0cmVlIgorICAgICAgICBleGNlcHQgT1NFcnJvciwgZXg6CisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCBleCAjIFBlcnNpc3Qgd2l0aCBjbGVhbmluZyB1cAorCisgICAgZGVmIF9jaGVja19tb2R1bGUoc2VsZiwgZGVwdGgpOgorICAgICAgICBwa2dfZGlyLCBtb2RfZm5hbWUsIG1vZF9uYW1lID0gKAorICAgICAgICAgICAgICAgc2VsZi5fbWFrZV9wa2coIng9MVxuIiwgZGVwdGgpKQorICAgICAgICBmb3JnZXQobW9kX25hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJSdW5uaW5nIGZyb20gc291cmNlOiIsIG1vZF9uYW1lCisgICAgICAgICAgICBkMSA9IHJ1bl9tb2R1bGUobW9kX25hbWUpICMgUmVhZCBmcm9tIHNvdXJjZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigieCIsIGQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQxWyJ4Il0gPT0gMSkKKyAgICAgICAgICAgIGRlbCBkMSAjIEVuc3VyZSBfX2xvYWRlcl9fIGVudHJ5IGRvZXNuJ3Qga2VlcCBmaWxlIG9wZW4KKyAgICAgICAgICAgIF9faW1wb3J0X18obW9kX25hbWUpCisgICAgICAgICAgICBvcy5yZW1vdmUobW9kX2ZuYW1lKQorICAgICAgICAgICAgaWYgbm90IHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJSdW5uaW5nIGZyb20gY29tcGlsZWQ6IiwgbW9kX25hbWUKKyAgICAgICAgICAgICAgICBkMiA9IHJ1bl9tb2R1bGUobW9kX25hbWUpICMgUmVhZCBmcm9tIGJ5dGVjb2RlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigieCIsIGQyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMlsieCJdID09IDEpCisgICAgICAgICAgICAgICAgZGVsIGQyICMgRW5zdXJlIF9fbG9hZGVyX18gZW50cnkgZG9lc24ndCBrZWVwIGZpbGUgb3BlbgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fZGVsX3BrZyhwa2dfZGlyLCBkZXB0aCwgbW9kX25hbWUpCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJNb2R1bGUgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IgorCisgICAgZGVmIF9jaGVja19wYWNrYWdlKHNlbGYsIGRlcHRoKToKKyAgICAgICAgcGtnX2RpciwgbW9kX2ZuYW1lLCBtb2RfbmFtZSA9ICgKKyAgICAgICAgICAgICAgIHNlbGYuX21ha2VfcGtnKCJ4PTFcbiIsIGRlcHRoLCAiX19tYWluX18iKSkKKyAgICAgICAgcGtnX25hbWUsIF8sIF8gPSBtb2RfbmFtZS5ycGFydGl0aW9uKCIuIikKKyAgICAgICAgZm9yZ2V0KG1vZF9uYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiUnVubmluZyBmcm9tIHNvdXJjZToiLCBwa2dfbmFtZQorICAgICAgICAgICAgZDEgPSBydW5fbW9kdWxlKHBrZ19uYW1lKSAjIFJlYWQgZnJvbSBzb3VyY2UKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIngiLCBkMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMVsieCJdID09IDEpCisgICAgICAgICAgICBkZWwgZDEgIyBFbnN1cmUgX19sb2FkZXJfXyBlbnRyeSBkb2Vzbid0IGtlZXAgZmlsZSBvcGVuCisgICAgICAgICAgICBfX2ltcG9ydF9fKG1vZF9uYW1lKQorICAgICAgICAgICAgb3MucmVtb3ZlKG1vZF9mbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBzeXMuZG9udF93cml0ZV9ieXRlY29kZToKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiUnVubmluZyBmcm9tIGNvbXBpbGVkOiIsIHBrZ19uYW1lCisgICAgICAgICAgICAgICAgZDIgPSBydW5fbW9kdWxlKHBrZ19uYW1lKSAjIFJlYWQgZnJvbSBieXRlY29kZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIngiLCBkMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbIngiXSA9PSAxKQorICAgICAgICAgICAgICAgIGRlbCBkMiAjIEVuc3VyZSBfX2xvYWRlcl9fIGVudHJ5IGRvZXNuJ3Qga2VlcCBmaWxlIG9wZW4KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2RlbF9wa2cocGtnX2RpciwgZGVwdGgsIHBrZ19uYW1lKQorICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiUGFja2FnZSBleGVjdXRlZCBzdWNjZXNzZnVsbHkiCisKKyAgICBkZWYgX2FkZF9yZWxhdGl2ZV9tb2R1bGVzKHNlbGYsIGJhc2VfZGlyLCBzb3VyY2UsIGRlcHRoKToKKyAgICAgICAgaWYgZGVwdGggPD0gMToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlJlbGF0aXZlIG1vZHVsZSB0ZXN0IG5lZWRzIGRlcHRoID4gMSIpCisgICAgICAgIHBrZ19uYW1lID0gIl9fcnVucHlfcGtnX18iCisgICAgICAgIG1vZHVsZV9kaXIgPSBiYXNlX2RpcgorICAgICAgICBmb3IgaSBpbiByYW5nZShkZXB0aCk6CisgICAgICAgICAgICBwYXJlbnRfZGlyID0gbW9kdWxlX2RpcgorICAgICAgICAgICAgbW9kdWxlX2RpciA9IG9zLnBhdGguam9pbihtb2R1bGVfZGlyLCBwa2dfbmFtZSkKKyAgICAgICAgIyBBZGQgc2libGluZyBtb2R1bGUKKyAgICAgICAgc2libGluZ19mbmFtZSA9IG9zLnBhdGguam9pbihtb2R1bGVfZGlyLCAic2libGluZyIrb3MuZXh0c2VwKyJweSIpCisgICAgICAgIHNpYmxpbmdfZmlsZSA9IG9wZW4oc2libGluZ19mbmFtZSwgInciKQorICAgICAgICBzaWJsaW5nX2ZpbGUuY2xvc2UoKQorICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiICBBZGRlZCBzaWJsaW5nIG1vZHVsZToiLCBzaWJsaW5nX2ZuYW1lCisgICAgICAgICMgQWRkIG5lcGhldyBtb2R1bGUKKyAgICAgICAgdW5jbGVfZGlyID0gb3MucGF0aC5qb2luKHBhcmVudF9kaXIsICJ1bmNsZSIpCisgICAgICAgIHNlbGYuX2FkZF9wa2dfZGlyKHVuY2xlX2RpcikKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIiAgQWRkZWQgdW5jbGUgcGFja2FnZToiLCB1bmNsZV9kaXIKKyAgICAgICAgY291c2luX2RpciA9IG9zLnBhdGguam9pbih1bmNsZV9kaXIsICJjb3VzaW4iKQorICAgICAgICBzZWxmLl9hZGRfcGtnX2Rpcihjb3VzaW5fZGlyKQorICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiICBBZGRlZCBjb3VzaW4gcGFja2FnZToiLCBjb3VzaW5fZGlyCisgICAgICAgIG5lcGhld19mbmFtZSA9IG9zLnBhdGguam9pbihjb3VzaW5fZGlyLCAibmVwaGV3Iitvcy5leHRzZXArInB5IikKKyAgICAgICAgbmVwaGV3X2ZpbGUgPSBvcGVuKG5lcGhld19mbmFtZSwgInciKQorICAgICAgICBuZXBoZXdfZmlsZS5jbG9zZSgpCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICIgIEFkZGVkIG5lcGhldyBtb2R1bGU6IiwgbmVwaGV3X2ZuYW1lCisKKyAgICBkZWYgX2NoZWNrX3JlbGF0aXZlX2ltcG9ydHMoc2VsZiwgZGVwdGgsIHJ1bl9uYW1lPU5vbmUpOgorICAgICAgICBjb250ZW50cyA9IHIiIiJcCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorZnJvbSAuIGltcG9ydCBzaWJsaW5nCitmcm9tIC4udW5jbGUuY291c2luIGltcG9ydCBuZXBoZXcKKyIiIgorICAgICAgICBwa2dfZGlyLCBtb2RfZm5hbWUsIG1vZF9uYW1lID0gKAorICAgICAgICAgICAgICAgc2VsZi5fbWFrZV9wa2coY29udGVudHMsIGRlcHRoKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fYWRkX3JlbGF0aXZlX21vZHVsZXMocGtnX2RpciwgY29udGVudHMsIGRlcHRoKQorICAgICAgICAgICAgcGtnX25hbWUgPSBtb2RfbmFtZS5ycGFydGl0aW9uKCcuJylbMF0KKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJSdW5uaW5nIGZyb20gc291cmNlOiIsIG1vZF9uYW1lCisgICAgICAgICAgICBkMSA9IHJ1bl9tb2R1bGUobW9kX25hbWUsIHJ1bl9uYW1lPXJ1bl9uYW1lKSAjIFJlYWQgZnJvbSBzb3VyY2UKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIl9fcGFja2FnZV9fIiwgZDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZDFbIl9fcGFja2FnZV9fIl0gPT0gcGtnX25hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJzaWJsaW5nIiwgZDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJuZXBoZXciLCBkMSkKKyAgICAgICAgICAgIGRlbCBkMSAjIEVuc3VyZSBfX2xvYWRlcl9fIGVudHJ5IGRvZXNuJ3Qga2VlcCBmaWxlIG9wZW4KKyAgICAgICAgICAgIF9faW1wb3J0X18obW9kX25hbWUpCisgICAgICAgICAgICBvcy5yZW1vdmUobW9kX2ZuYW1lKQorICAgICAgICAgICAgaWYgbm90IHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJSdW5uaW5nIGZyb20gY29tcGlsZWQ6IiwgbW9kX25hbWUKKyAgICAgICAgICAgICAgICBkMiA9IHJ1bl9tb2R1bGUobW9kX25hbWUsIHJ1bl9uYW1lPXJ1bl9uYW1lKSAjIFJlYWQgZnJvbSBieXRlY29kZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIl9fcGFja2FnZV9fIiwgZDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJfX3BhY2thZ2VfXyJdID09IHBrZ19uYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oInNpYmxpbmciLCBkMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJuZXBoZXciLCBkMikKKyAgICAgICAgICAgICAgICBkZWwgZDIgIyBFbnN1cmUgX19sb2FkZXJfXyBlbnRyeSBkb2Vzbid0IGtlZXAgZmlsZSBvcGVuCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9kZWxfcGtnKHBrZ19kaXIsIGRlcHRoLCBtb2RfbmFtZSkKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIk1vZHVsZSBleGVjdXRlZCBzdWNjZXNzZnVsbHkiCisKKyAgICBkZWYgdGVzdF9ydW5fbW9kdWxlKHNlbGYpOgorICAgICAgICBmb3IgZGVwdGggaW4gcmFuZ2UoNCk6CisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiVGVzdGluZyBwYWNrYWdlIGRlcHRoOiIsIGRlcHRoCisgICAgICAgICAgICBzZWxmLl9jaGVja19tb2R1bGUoZGVwdGgpCisKKyAgICBkZWYgdGVzdF9ydW5fcGFja2FnZShzZWxmKToKKyAgICAgICAgZm9yIGRlcHRoIGluIHJhbmdlKDEsIDQpOgorICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlRlc3RpbmcgcGFja2FnZSBkZXB0aDoiLCBkZXB0aAorICAgICAgICAgICAgc2VsZi5fY2hlY2tfcGFja2FnZShkZXB0aCkKKworICAgIGRlZiB0ZXN0X2V4cGxpY2l0X3JlbGF0aXZlX2ltcG9ydChzZWxmKToKKyAgICAgICAgZm9yIGRlcHRoIGluIHJhbmdlKDIsIDUpOgorICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlRlc3RpbmcgcmVsYXRpdmUgaW1wb3J0cyBhdCBkZXB0aDoiLCBkZXB0aAorICAgICAgICAgICAgc2VsZi5fY2hlY2tfcmVsYXRpdmVfaW1wb3J0cyhkZXB0aCkKKworICAgIGRlZiB0ZXN0X21haW5fcmVsYXRpdmVfaW1wb3J0KHNlbGYpOgorICAgICAgICBmb3IgZGVwdGggaW4gcmFuZ2UoMiwgNSk6CisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiVGVzdGluZyBtYWluIHJlbGF0aXZlIGltcG9ydHMgYXQgZGVwdGg6IiwgZGVwdGgKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3JlbGF0aXZlX2ltcG9ydHMoZGVwdGgsICJfX21haW5fXyIpCisKKworY2xhc3MgUnVuUGF0aFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlVuaXQgdGVzdHMgZm9yIHJ1bnB5LnJ1bl9wYXRoIiIiCisgICAgIyBCYXNlZCBvbiBjb3JyZXNwb25kaW5nIHRlc3RzIGluIHRlc3RfY21kX2xpbmVfc2NyaXB0CisKKyAgICB0ZXN0X3NvdXJjZSA9ICIiIlwKKyMgU2NyaXB0IG1heSBiZSBydW4gd2l0aCBvcHRpbWlzYXRpb24gZW5hYmxlZCwgc28gZG9uJ3QgcmVseSBvbiBhc3NlcnQKKyMgc3RhdGVtZW50cyBiZWluZyBleGVjdXRlZAorZGVmIGFzc2VydEVxdWFsKGxocywgcmhzKToKKyAgICBpZiBsaHMgIT0gcmhzOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignJXIgIT0gJXInICUgKGxocywgcmhzKSkKK2RlZiBhc3NlcnRJcyhsaHMsIHJocyk6CisgICAgaWYgbGhzIGlzIG5vdCByaHM6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCclciBpcyBub3QgJXInICUgKGxocywgcmhzKSkKKyMgQ2hlY2sgYmFzaWMgY29kZSBleGVjdXRpb24KK3Jlc3VsdCA9IFsnVG9wIGxldmVsIGFzc2lnbm1lbnQnXQorZGVmIGYoKToKKyAgICByZXN1bHQuYXBwZW5kKCdMb3dlciBsZXZlbCByZWZlcmVuY2UnKQorZigpCithc3NlcnRFcXVhbChyZXN1bHQsIFsnVG9wIGxldmVsIGFzc2lnbm1lbnQnLCAnTG93ZXIgbGV2ZWwgcmVmZXJlbmNlJ10pCisjIENoZWNrIHRoZSBzeXMgbW9kdWxlCitpbXBvcnQgc3lzCithc3NlcnRJcyhnbG9iYWxzKCksIHN5cy5tb2R1bGVzW19fbmFtZV9fXS5fX2RpY3RfXykKK2FyZ3YwID0gc3lzLmFyZ3ZbMF0KKyIiIgorCisgICAgZGVmIF9tYWtlX3Rlc3Rfc2NyaXB0KHNlbGYsIHNjcmlwdF9kaXIsIHNjcmlwdF9iYXNlbmFtZSwgc291cmNlPU5vbmUpOgorICAgICAgICBpZiBzb3VyY2UgaXMgTm9uZToKKyAgICAgICAgICAgIHNvdXJjZSA9IHNlbGYudGVzdF9zb3VyY2UKKyAgICAgICAgcmV0dXJuIG1ha2Vfc2NyaXB0KHNjcmlwdF9kaXIsIHNjcmlwdF9iYXNlbmFtZSwgc291cmNlKQorCisgICAgZGVmIF9jaGVja19zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIGV4cGVjdGVkX25hbWUsIGV4cGVjdGVkX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfYXJndjAsIGV4cGVjdGVkX3BhY2thZ2UpOgorICAgICAgICByZXN1bHQgPSBydW5fcGF0aChzY3JpcHRfbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbIl9fbmFtZV9fIl0sIGV4cGVjdGVkX25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WyJfX2ZpbGVfXyJdLCBleHBlY3RlZF9maWxlKQorICAgICAgICBzZWxmLmFzc2VydEluKCJhcmd2MCIsIHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbImFyZ3YwIl0sIGV4cGVjdGVkX2FyZ3YwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFsiX19wYWNrYWdlX18iXSwgZXhwZWN0ZWRfcGFja2FnZSkKKworICAgIGRlZiBfY2hlY2tfaW1wb3J0X2Vycm9yKHNlbGYsIHNjcmlwdF9uYW1lLCBtc2cpOgorICAgICAgICBtc2cgPSByZS5lc2NhcGUobXNnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChJbXBvcnRFcnJvciwgbXNnLCBydW5fcGF0aCwgc2NyaXB0X25hbWUpCisKKyAgICBkZWYgdGVzdF9iYXNpY19zY3JpcHQoc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgbW9kX25hbWUgPSAnc2NyaXB0JworICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBzZWxmLl9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsIG1vZF9uYW1lKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2NyaXB0KHNjcmlwdF9uYW1lLCAiPHJ1bl9wYXRoPiIsIHNjcmlwdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdF9uYW1lLCBOb25lKQorCisgICAgZGVmIHRlc3Rfc2NyaXB0X2NvbXBpbGVkKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIG1vZF9uYW1lID0gJ3NjcmlwdCcKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gc2VsZi5fbWFrZV90ZXN0X3NjcmlwdChzY3JpcHRfZGlyLCBtb2RfbmFtZSkKKyAgICAgICAgICAgIGNvbXBpbGVkX25hbWUgPSBjb21waWxlX3NjcmlwdChzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIG9zLnJlbW92ZShzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NjcmlwdChjb21waWxlZF9uYW1lLCAiPHJ1bl9wYXRoPiIsIGNvbXBpbGVkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRfbmFtZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBtb2RfbmFtZSA9ICdfX21haW5fXycKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gc2VsZi5fbWFrZV90ZXN0X3NjcmlwdChzY3JpcHRfZGlyLCBtb2RfbmFtZSkKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NjcmlwdChzY3JpcHRfZGlyLCAiPHJ1bl9wYXRoPiIsIHNjcmlwdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdF9kaXIsICcnKQorCisgICAgZGVmIHRlc3RfZGlyZWN0b3J5X2NvbXBpbGVkKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIG1vZF9uYW1lID0gJ19fbWFpbl9fJworICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBzZWxmLl9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsIG1vZF9uYW1lKQorICAgICAgICAgICAgY29tcGlsZWRfbmFtZSA9IGNvbXBpbGVfc2NyaXB0KHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgb3MucmVtb3ZlKHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2NyaXB0KHNjcmlwdF9kaXIsICI8cnVuX3BhdGg+IiwgY29tcGlsZWRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfZGlyLCAnJykKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yeV9lcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBtb2RfbmFtZSA9ICdub3RfbWFpbicKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gc2VsZi5fbWFrZV90ZXN0X3NjcmlwdChzY3JpcHRfZGlyLCBtb2RfbmFtZSkKKyAgICAgICAgICAgIG1zZyA9ICJjYW4ndCBmaW5kICdfX21haW5fXycgbW9kdWxlIGluICVyIiAlIHNjcmlwdF9kaXIKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ltcG9ydF9lcnJvcihzY3JpcHRfZGlyLCBtc2cpCisKKyAgICBkZWYgdGVzdF96aXBmaWxlKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIG1vZF9uYW1lID0gJ19fbWFpbl9fJworICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBzZWxmLl9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsIG1vZF9uYW1lKQorICAgICAgICAgICAgemlwX25hbWUsIGZuYW1lID0gbWFrZV96aXBfc2NyaXB0KHNjcmlwdF9kaXIsICd0ZXN0X3ppcCcsIHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2NyaXB0KHppcF9uYW1lLCAiPHJ1bl9wYXRoPiIsIGZuYW1lLCB6aXBfbmFtZSwgJycpCisKKyAgICBkZWYgdGVzdF96aXBmaWxlX2NvbXBpbGVkKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIG1vZF9uYW1lID0gJ19fbWFpbl9fJworICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBzZWxmLl9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsIG1vZF9uYW1lKQorICAgICAgICAgICAgY29tcGlsZWRfbmFtZSA9IGNvbXBpbGVfc2NyaXB0KHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgemlwX25hbWUsIGZuYW1lID0gbWFrZV96aXBfc2NyaXB0KHNjcmlwdF9kaXIsICd0ZXN0X3ppcCcsIGNvbXBpbGVkX25hbWUpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQoemlwX25hbWUsICI8cnVuX3BhdGg+IiwgZm5hbWUsIHppcF9uYW1lLCAnJykKKworICAgIGRlZiB0ZXN0X3ppcGZpbGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgbW9kX25hbWUgPSAnbm90X21haW4nCisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IHNlbGYuX21ha2VfdGVzdF9zY3JpcHQoc2NyaXB0X2RpciwgbW9kX25hbWUpCisgICAgICAgICAgICB6aXBfbmFtZSwgZm5hbWUgPSBtYWtlX3ppcF9zY3JpcHQoc2NyaXB0X2RpciwgJ3Rlc3RfemlwJywgc2NyaXB0X25hbWUpCisgICAgICAgICAgICBtc2cgPSAiY2FuJ3QgZmluZCAnX19tYWluX18nIG1vZHVsZSBpbiAlciIgJSB6aXBfbmFtZQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfaW1wb3J0X2Vycm9yKHppcF9uYW1lLCBtc2cpCisKKyAgICBkZWYgdGVzdF9tYWluX3JlY3Vyc2lvbl9lcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXIsIHRlbXBfZGlyKCkgYXMgZHVtbXlfZGlyOgorICAgICAgICAgICAgbW9kX25hbWUgPSAnX19tYWluX18nCisgICAgICAgICAgICBzb3VyY2UgPSAoImltcG9ydCBydW5weVxuIgorICAgICAgICAgICAgICAgICAgICAgICJydW5weS5ydW5fcGF0aCglcilcbiIpICUgZHVtbXlfZGlyCisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IHNlbGYuX21ha2VfdGVzdF9zY3JpcHQoc2NyaXB0X2RpciwgbW9kX25hbWUsIHNvdXJjZSkKKyAgICAgICAgICAgIHppcF9uYW1lLCBmbmFtZSA9IG1ha2VfemlwX3NjcmlwdChzY3JpcHRfZGlyLCAndGVzdF96aXAnLCBzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIG1zZyA9ICJyZWN1cnNpb24gZGVwdGggZXhjZWVkZWQiCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChSdW50aW1lRXJyb3IsIG1zZywgcnVuX3BhdGgsIHppcF9uYW1lKQorCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChSdW5Nb2R1bGVDb2RlVGVzdCwgUnVuTW9kdWxlVGVzdCwgUnVuUGF0aFRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3J1bnB5LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3J1bnB5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2ZmZTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcnVucHkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3J1bnB5LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3J1bnB5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2ZmZTdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcnVucHkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NheC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NheC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTIwZWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2F4LnB5CkBAIC0wLDAgKzEsODg3IEBACisjIHJlZ3Jlc3Npb24gdGVzdCBmb3IgU0FYIDIuMCAgICAgICAgICAgIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIyAkSWQkCisKK2Zyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIsIENvbnRlbnRIYW5kbGVyLCBcCisgICAgICAgICAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiwgU0FYUmVhZGVyTm90QXZhaWxhYmxlLCBTQVhQYXJzZUV4Y2VwdGlvbgordHJ5OgorICAgIG1ha2VfcGFyc2VyKCkKK2V4Y2VwdCBTQVhSZWFkZXJOb3RBdmFpbGFibGU6CisgICAgIyBkb24ndCB0cnkgdG8gdGVzdCB0aGlzIG1vZHVsZSBpZiB3ZSBjYW5ub3QgY3JlYXRlIGEgcGFyc2VyCisgICAgcmFpc2UgSW1wb3J0RXJyb3IoIm5vIFhNTCBwYXJzZXJzIGF2YWlsYWJsZSIpCitmcm9tIHhtbC5zYXguc2F4dXRpbHMgaW1wb3J0IFhNTEdlbmVyYXRvciwgZXNjYXBlLCB1bmVzY2FwZSwgcXVvdGVhdHRyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTEZpbHRlckJhc2UKK2Zyb20geG1sLnNheC5leHBhdHJlYWRlciBpbXBvcnQgY3JlYXRlX3BhcnNlcgorZnJvbSB4bWwuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfbmFtZXNwYWNlcworZnJvbSB4bWwuc2F4LnhtbHJlYWRlciBpbXBvcnQgSW5wdXRTb3VyY2UsIEF0dHJpYnV0ZXNJbXBsLCBBdHRyaWJ1dGVzTlNJbXBsCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBpbworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBmaW5kZmlsZSwgcnVuX3VuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKKworVEVTVF9YTUxGSUxFID0gZmluZGZpbGUoInRlc3QueG1sIiwgc3ViZGlyPSJ4bWx0ZXN0ZGF0YSIpCitURVNUX1hNTEZJTEVfT1VUID0gZmluZGZpbGUoInRlc3QueG1sLm91dCIsIHN1YmRpcj0ieG1sdGVzdGRhdGEiKQorCitzdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lcyA9IFRydWUKK2lmIG5vdCBvcy5wYXRoLnN1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzOgorICAgIHRyeToKKyAgICAgICAgc3VwcG9ydC5URVNURk5fVU5JQ09ERS5lbmNvZGUoc3VwcG9ydC5URVNURk5fRU5DT0RJTkcpCisgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVW5pY29kZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAjIEVpdGhlciB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgaXMgTm9uZSwgb3IgdGhlIGZpbGUgbmFtZQorICAgICAgICAjIGNhbm5vdCBiZSBlbmNvZGVkIGluIHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZy4KKyAgICAgICAgc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMgPSBGYWxzZQorcmVxdWlyZXNfdW5pY29kZV9maWxlbmFtZXMgPSB1bml0dGVzdC5za2lwVW5sZXNzKAorICAgICAgICBzdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lcywKKyAgICAgICAgJ1JlcXVpcmVzIHVuaWNvZGUgZmlsZW5hbWVzIHN1cHBvcnQnKQorCituc191cmkgPSAiaHR0cDovL3d3dy5weXRob24ub3JnL3htbC1ucy9zYXh0ZXN0LyIKKworY2xhc3MgWG1sVGVzdEJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB2ZXJpZnlfZW1wdHlfYXR0cnMoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgYXR0cnMuZ2V0VmFsdWUsICJhdHRyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGF0dHJzLmdldFZhbHVlQnlRTmFtZSwgImF0dHIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgYXR0cnMuZ2V0TmFtZUJ5UU5hbWUsICJhdHRyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGF0dHJzLmdldFFOYW1lQnlOYW1lLCAiYXR0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBhdHRycy5fX2dldGl0ZW1fXywgImF0dHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldExlbmd0aCgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldE5hbWVzKCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldFFOYW1lcygpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYXR0cnMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGF0dHJzLmhhc19rZXkoImF0dHIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5rZXlzKCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldCgiYXR0cnMiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXQoImF0dHJzIiwgMjUpLCAyNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5pdGVtcygpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy52YWx1ZXMoKSwgW10pCisKKyAgICBkZWYgdmVyaWZ5X2VtcHR5X25zYXR0cnMoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgYXR0cnMuZ2V0VmFsdWUsIChuc191cmksICJhdHRyIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBhdHRycy5nZXRWYWx1ZUJ5UU5hbWUsICJuczphdHRyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGF0dHJzLmdldE5hbWVCeVFOYW1lLCAibnM6YXR0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBhdHRycy5nZXRRTmFtZUJ5TmFtZSwgKG5zX3VyaSwgImF0dHIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGF0dHJzLl9fZ2V0aXRlbV9fLCAobnNfdXJpLCAiYXR0ciIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldExlbmd0aCgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldE5hbWVzKCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldFFOYW1lcygpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYXR0cnMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGF0dHJzLmhhc19rZXkoKG5zX3VyaSwgImF0dHIiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMua2V5cygpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0KChuc191cmksICJhdHRyIiksIDI1KSwgMjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuaXRlbXMoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMudmFsdWVzKCksIFtdKQorCisgICAgZGVmIHZlcmlmeV9hdHRyc193YXR0cihzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0TGVuZ3RoKCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0TmFtZXMoKSwgWyJhdHRyIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0UU5hbWVzKCksIFsiYXR0ciJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhdHRycyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhdHRycy5oYXNfa2V5KCJhdHRyIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMua2V5cygpLCBbImF0dHIiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXQoImF0dHIiKSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0KCJhdHRyIiwgMjUpLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5pdGVtcygpLCBbKCJhdHRyIiwgInZhbCIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy52YWx1ZXMoKSwgWyJ2YWwiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXRWYWx1ZSgiYXR0ciIpLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXRWYWx1ZUJ5UU5hbWUoImF0dHIiKSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0TmFtZUJ5UU5hbWUoImF0dHIiKSwgImF0dHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzWyJhdHRyIl0sICJ2YWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldFFOYW1lQnlOYW1lKCJhdHRyIiksICJhdHRyIikKKworY2xhc3MgTWFrZVBhcnNlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X21ha2VfcGFyc2VyMihzZWxmKToKKyAgICAgICAgIyBDcmVhdGluZyBwYXJzZXJzIHNldmVyYWwgdGltZXMgaW4gYSByb3cgc2hvdWxkIHN1Y2NlZWQuCisgICAgICAgICMgVGVzdGluZyB0aGlzIGJlY2F1c2UgdGhlcmUgaGF2ZSBiZWVuIGZhaWx1cmVzIG9mIHRoaXMga2luZAorICAgICAgICAjIGJlZm9yZS4KKyAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgorICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQorICAgICAgICBmcm9tIHhtbC5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCisgICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCisgICAgICAgIGZyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKKyAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKKyAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgorICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQorICAgICAgICBmcm9tIHhtbC5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCisgICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCisgICAgICAgIGZyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKKyAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKKworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyAgIHNheHV0aWxzIHRlc3RzCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBTYXh1dGlsc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgPT09PT0gZXNjYXBlCisgICAgZGVmIHRlc3RfZXNjYXBlX2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVzY2FwZSgiRG9uYWxkIER1Y2sgJiBDbyIpLCAiRG9uYWxkIER1Y2sgJmFtcDsgQ28iKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlc2NhcGUoIjxEb25hbGQgRHVjayAmIENvPiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICImbHQ7RG9uYWxkIER1Y2sgJmFtcDsgQ28mZ3Q7IikKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9leHRyYShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlc2NhcGUoIkhlaSBww6UgZGVnIiwgeyLDpSIgOiAiJmFyaW5nOyJ9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSGVpIHAmYXJpbmc7IGRlZyIpCisKKyAgICAjID09PT09IHVuZXNjYXBlCisgICAgZGVmIHRlc3RfdW5lc2NhcGVfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5lc2NhcGUoIkRvbmFsZCBEdWNrICZhbXA7IENvIiksICJEb25hbGQgRHVjayAmIENvIikKKworICAgIGRlZiB0ZXN0X3VuZXNjYXBlX2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmVzY2FwZSgiJmx0O0RvbmFsZCBEdWNrICZhbXA7IENvJmd0OyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICI8RG9uYWxkIER1Y2sgJiBDbz4iKQorCisgICAgZGVmIHRlc3RfdW5lc2NhcGVfZXh0cmEoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5lc2NhcGUoIkhlaSBww6UgZGVnIiwgeyLDpSIgOiAiJmFyaW5nOyJ9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSGVpIHAmYXJpbmc7IGRlZyIpCisKKyAgICBkZWYgdGVzdF91bmVzY2FwZV9hbXBfZXh0cmEoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5lc2NhcGUoIiZhbXA7Zm9vOyIsIHsiJmZvbzsiOiAic3BsYXQifSksICImZm9vOyIpCisKKyAgICAjID09PT09IHF1b3RlYXR0cgorICAgIGRlZiB0ZXN0X3F1b3RlYXR0cl9iYXNpYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdW90ZWF0dHIoIkRvbmFsZCBEdWNrICYgQ28iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnIkRvbmFsZCBEdWNrICZhbXA7IENvIicpCisKKyAgICBkZWYgdGVzdF9zaW5nbGVfcXVvdGVhdHRyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1b3RlYXR0cignSW5jbHVkZXMgImRvdWJsZSIgcXVvdGVzJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1wnSW5jbHVkZXMgImRvdWJsZSIgcXVvdGVzXCcnKQorCisgICAgZGVmIHRlc3RfZG91YmxlX3F1b3RlYXR0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdW90ZWF0dHIoIkluY2x1ZGVzICdzaW5nbGUnIHF1b3RlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJcIkluY2x1ZGVzICdzaW5nbGUnIHF1b3Rlc1wiIikKKworICAgIGRlZiB0ZXN0X3NpbmdsZV9kb3VibGVfcXVvdGVhdHRyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1b3RlYXR0cigiSW5jbHVkZXMgJ3NpbmdsZScgYW5kIFwiZG91YmxlXCIgcXVvdGVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIlwiSW5jbHVkZXMgJ3NpbmdsZScgYW5kICZxdW90O2RvdWJsZSZxdW90OyBxdW90ZXNcIiIpCisKKyAgICAjID09PT09IG1ha2VfcGFyc2VyCisgICAgZGVmIHRlc3RfbWFrZV9wYXJzZXIoc2VsZik6CisgICAgICAgICMgQ3JlYXRpbmcgYSBwYXJzZXIgc2hvdWxkIHN1Y2NlZWQgLSBpdCBzaG91bGQgZmFsbCBiYWNrCisgICAgICAgICMgdG8gdGhlIGV4cGF0cmVhZGVyCisgICAgICAgIHAgPSBtYWtlX3BhcnNlcihbJ3htbC5wYXJzZXJzLm5vX3N1Y2hfcGFyc2VyJ10pCisKKworIyA9PT09PSBYTUxHZW5lcmF0b3IKKworc3RhcnQgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PlxuJworCitjbGFzcyBYbWxnZW5UZXN0OgorICAgIGRlZiB0ZXN0X3htbGdlbl9iYXNpYyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCisgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKyAiPGRvYz48L2RvYz4iKQorCisgICAgZGVmIHRlc3RfeG1sZ2VuX2NvbnRlbnQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKKyAgICAgICAgZ2VuLmNoYXJhY3RlcnMoImh1aGVpIikKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCisgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKyAiPGRvYz5odWhlaTwvZG9jPiIpCisKKyAgICBkZWYgdGVzdF94bWxnZW5fcGkoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4ucHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ0ZXN0IiwgImRhdGEiKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCisgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKyAiPD90ZXN0IGRhdGE/Pjxkb2M+PC9kb2M+IikKKworICAgIGRlZiB0ZXN0X3htbGdlbl9jb250ZW50X2VzY2FwZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQorICAgICAgICBnZW4uY2hhcmFjdGVycygiPGh1aGVpJiIpCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksCisgICAgICAgICAgICBzdGFydCArICI8ZG9jPiZsdDtodWhlaSZhbXA7PC9kb2M+IikKKworICAgIGRlZiB0ZXN0X3htbGdlbl9hdHRyX2VzY2FwZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHsiYSI6ICciJ30pCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImUiLCB7ImEiOiAiJyJ9KQorICAgICAgICBnZW4uZW5kRWxlbWVudCgiZSIpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImUiLCB7ImEiOiAiJ1wiIn0pCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJlIikKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZSIsIHsiYSI6ICJcblxyXHQifSkKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImUiKQorICAgICAgICBnZW4uZW5kRWxlbWVudCgiZG9jIikKKyAgICAgICAgZ2VuLmVuZERvY3VtZW50KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCBzdGFydCArCisgICAgICAgICAgICAoIjxkb2MgYT0nXCInPjxlIGE9XCInXCI+PC9lPiIKKyAgICAgICAgICAgICAiPGUgYT1cIicmcXVvdDtcIj48L2U+IgorICAgICAgICAgICAgICI8ZSBhPVwiJiMxMDsmIzEzOyYjOTtcIj48L2U+PC9kb2M+IikpCisKKyAgICBkZWYgdGVzdF94bWxnZW5fZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIGVuY29kaW5ncyA9ICgnaXNvLTg4NTktMTUnLCAndXRmLTgnLAorICAgICAgICAgICAgICAgICAgICAgJ3V0Zi0xNmJlJywgJ3V0Zi0xNmxlJywKKyAgICAgICAgICAgICAgICAgICAgICd1dGYtMzJiZScsICd1dGYtMzJsZScpCisgICAgICAgIGZvciBlbmNvZGluZyBpbiBlbmNvZGluZ3M6CisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCwgZW5jb2Rpbmc9ZW5jb2RpbmcpCisKKyAgICAgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHsiYSI6IHUnXHUyMGFjJ30pCisgICAgICAgICAgICBnZW4uY2hhcmFjdGVycyh1Ilx1MjBhYyIpCisgICAgICAgICAgICBnZW4uZW5kRWxlbWVudCgiZG9jIikKKyAgICAgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksICgKKyAgICAgICAgICAgICAgICB1Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiVzIj8+XG4nCisgICAgICAgICAgICAgICAgdSc8ZG9jIGE9Ilx1MjBhYyI+XHUyMGFjPC9kb2M+JyAlIGVuY29kaW5nCisgICAgICAgICAgICAgICAgKS5lbmNvZGUoZW5jb2RpbmcsICd4bWxjaGFycmVmcmVwbGFjZScpKQorCisgICAgZGVmIHRlc3RfeG1sZ2VuX3VuZW5jb2RhYmxlKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0LCBlbmNvZGluZz0nYXNjaWknKQorCisgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZG9jIiwgeyJhIjogdSdcdTIwYWMnfSkKKyAgICAgICAgZ2VuLmNoYXJhY3RlcnModSJcdTIwYWMiKQorICAgICAgICBnZW4uZW5kRWxlbWVudCgiZG9jIikKKyAgICAgICAgZ2VuLmVuZERvY3VtZW50KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJhc2NpaSI/PlxuJworICAgICAgICAgICAgICAgICc8ZG9jIGE9IiYjODM2NDsiPiYjODM2NDs8L2RvYz4nKQorCisgICAgZGVmIHRlc3RfeG1sZ2VuX2lnbm9yYWJsZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQorICAgICAgICBnZW4uaWdub3JhYmxlV2hpdGVzcGFjZSgiICIpCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+IDwvZG9jPiIpCisKKyAgICBkZWYgdGVzdF94bWxnZW5fbnMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRQcmVmaXhNYXBwaW5nKCJuczEiLCBuc191cmkpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnROUygobnNfdXJpLCAiZG9jIiksICJuczE6ZG9jIiwge30pCisgICAgICAgICMgYWRkIGFuIHVucXVhbGlmaWVkIG5hbWUKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudE5TKChOb25lLCAidWRvYyIpLCBOb25lLCB7fSkKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnROUygoTm9uZSwgInVkb2MiKSwgTm9uZSkKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnROUygobnNfdXJpLCAiZG9jIiksICJuczE6ZG9jIikKKyAgICAgICAgZ2VuLmVuZFByZWZpeE1hcHBpbmcoIm5zMSIpCisgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKyBcCisgICAgICAgICAgICgnPG5zMTpkb2MgeG1sbnM6bnMxPSIlcyI+PHVkb2M+PC91ZG9jPjwvbnMxOmRvYz4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNfdXJpKSkKKworICAgIGRlZiB0ZXN0XzE0NjMwMjZfMShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnROUygoTm9uZSwgJ2EnKSwgJ2EnLCB7KE5vbmUsICdiJyk6J2MnfSkKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnROUygoTm9uZSwgJ2EnKSwgJ2EnKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0Kyc8YSBiPSJjIj48L2E+JykKKworICAgIGRlZiB0ZXN0XzE0NjMwMjZfMihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydFByZWZpeE1hcHBpbmcoTm9uZSwgJ3F1eCcpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnROUygoJ3F1eCcsICdhJyksICdhJywge30pCisgICAgICAgIGdlbi5lbmRFbGVtZW50TlMoKCdxdXgnLCAnYScpLCAnYScpCisgICAgICAgIGdlbi5lbmRQcmVmaXhNYXBwaW5nKE5vbmUpCisgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQrJzxhIHhtbG5zPSJxdXgiPjwvYT4nKQorCisgICAgZGVmIHRlc3RfMTQ2MzAyNl8zKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorCisgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0UHJlZml4TWFwcGluZygnbXknLCAncXV4JykKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudE5TKCgncXV4JywgJ2EnKSwgJ2EnLCB7KE5vbmUsICdiJyk6J2MnfSkKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnROUygoJ3F1eCcsICdhJyksICdhJykKKyAgICAgICAgZ2VuLmVuZFByZWZpeE1hcHBpbmcoJ215JykKKyAgICAgICAgZ2VuLmVuZERvY3VtZW50KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgc3RhcnQrJzxteTphIHhtbG5zOm15PSJxdXgiIGI9ImMiPjwvbXk6YT4nKQorCisgICAgZGVmIHRlc3RfNTAyN18xKHNlbGYpOgorICAgICAgICAjIFRoZSB4bWwgcHJlZml4IChhcyBpbiB4bWw6bGFuZyBiZWxvdykgaXMgcmVzZXJ2ZWQgYW5kIGJvdW5kIGJ5CisgICAgICAgICMgZGVmaW5pdGlvbiB0byBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuICBYTUxHZW5lcmF0b3IgaGFkCisgICAgICAgICMgYSBidWcgd2hlcmVieSBhIEtleUVycm9yIGlzIHJhaXNlZCBiZWNhdXNlIHRoaXMgbmFtZXNwYWNlIGlzIG1pc3NpbmcKKyAgICAgICAgIyBmcm9tIGEgZGljdGlvbmFyeS4KKyAgICAgICAgIworICAgICAgICAjIFRoaXMgdGVzdCBkZW1vbnN0cmF0ZXMgdGhlIGJ1ZyBieSBwYXJzaW5nIGEgZG9jdW1lbnQuCisgICAgICAgIHRlc3RfeG1sID0gU3RyaW5nSU8oCisgICAgICAgICAgICAnPD94bWwgdmVyc2lvbj0iMS4wIj8+JworICAgICAgICAgICAgJzxhOmcxIHhtbG5zOmE9Imh0dHA6Ly9leGFtcGxlLmNvbS9ucyI+JworICAgICAgICAgICAgICc8YTpnMiB4bWw6bGFuZz0iZW4iPkhlbGxvPC9hOmcyPicKKyAgICAgICAgICAgICc8L2E6ZzE+JykKKworICAgICAgICBwYXJzZXIgPSBtYWtlX3BhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRGZWF0dXJlKGZlYXR1cmVfbmFtZXNwYWNlcywgVHJ1ZSkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKGdlbikKKyAgICAgICAgcGFyc2VyLnBhcnNlKHRlc3RfeG1sKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyAoCisgICAgICAgICAgICAgICAgICAgICAgICAgJzxhOmcxIHhtbG5zOmE9Imh0dHA6Ly9leGFtcGxlLmNvbS9ucyI+JworICAgICAgICAgICAgICAgICAgICAgICAgICAnPGE6ZzIgeG1sOmxhbmc9ImVuIj5IZWxsbzwvYTpnMj4nCisgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYTpnMT4nKSkKKworICAgIGRlZiB0ZXN0XzUwMjdfMihzZWxmKToKKyAgICAgICAgIyBUaGUgeG1sIHByZWZpeCAoYXMgaW4geG1sOmxhbmcgYmVsb3cpIGlzIHJlc2VydmVkIGFuZCBib3VuZCBieQorICAgICAgICAjIGRlZmluaXRpb24gdG8gaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLiAgWE1MR2VuZXJhdG9yIGhhZAorICAgICAgICAjIGEgYnVnIHdoZXJlYnkgYSBLZXlFcnJvciBpcyByYWlzZWQgYmVjYXVzZSB0aGlzIG5hbWVzcGFjZSBpcyBtaXNzaW5nCisgICAgICAgICMgZnJvbSBhIGRpY3Rpb25hcnkuCisgICAgICAgICMKKyAgICAgICAgIyBUaGlzIHRlc3QgZGVtb25zdHJhdGVzIHRoZSBidWcgYnkgZGlyZWN0IG1hbmlwdWxhdGlvbiBvZiB0aGUKKyAgICAgICAgIyBYTUxHZW5lcmF0b3IuCisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRQcmVmaXhNYXBwaW5nKCdhJywgJ2h0dHA6Ly9leGFtcGxlLmNvbS9ucycpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnROUygoJ2h0dHA6Ly9leGFtcGxlLmNvbS9ucycsICdnMScpLCAnZzEnLCB7fSkKKyAgICAgICAgbGFuZ19hdHRyID0geygnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJywgJ2xhbmcnKTogJ2VuJ30KKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudE5TKCgnaHR0cDovL2V4YW1wbGUuY29tL25zJywgJ2cyJyksICdnMicsIGxhbmdfYXR0cikKKyAgICAgICAgZ2VuLmNoYXJhY3RlcnMoJ0hlbGxvJykKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnROUygoJ2h0dHA6Ly9leGFtcGxlLmNvbS9ucycsICdnMicpLCAnZzInKQorICAgICAgICBnZW4uZW5kRWxlbWVudE5TKCgnaHR0cDovL2V4YW1wbGUuY29tL25zJywgJ2cxJyksICdnMScpCisgICAgICAgIGdlbi5lbmRQcmVmaXhNYXBwaW5nKCdhJykKKyAgICAgICAgZ2VuLmVuZERvY3VtZW50KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgKAorICAgICAgICAgICAgICAgICAgICAgICAgICc8YTpnMSB4bWxuczphPSJodHRwOi8vZXhhbXBsZS5jb20vbnMiPicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJzxhOmcyIHhtbDpsYW5nPSJlbiI+SGVsbG88L2E6ZzI+JworICAgICAgICAgICAgICAgICAgICAgICAgICc8L2E6ZzE+JykpCisKKyAgICBkZWYgdGVzdF9ub19jbG9zZV9maWxlKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBkZWYgZnVuYyhvdXQpOgorICAgICAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKG91dCkKKyAgICAgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQorICAgICAgICBmdW5jKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHQuY2xvc2VkKQorCisgICAgZGVmIHRlc3RfeG1sZ2VuX2ZyYWdtZW50KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorCisgICAgICAgICMgRG9uJ3QgY2FsbCBnZW4uc3RhcnREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImZvbyIsIHsiYSI6ICIxLjAifSkKKyAgICAgICAgZ2VuLmNoYXJhY3RlcnMoIkhlbGxvIikKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImZvbyIpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImJhciIsIHsiYiI6ICIyLjAifSkKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImJhciIpCisgICAgICAgICMgRG9uJ3QgY2FsbCBnZW4uZW5kRG9jdW1lbnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJzxmb28gYT0iMS4wIj5IZWxsbzwvZm9vPjxiYXIgYj0iMi4wIj48L2Jhcj4nKQorCitjbGFzcyBTdHJpbmdYbWxnZW5UZXN0KFhtbGdlblRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBpb2NsYXNzID0gU3RyaW5nSU8KKworY2xhc3MgQnl0ZXNJT1htbGdlblRlc3QoWG1sZ2VuVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGlvY2xhc3MgPSBpby5CeXRlc0lPCisKK2NsYXNzIFdyaXRlclhtbGdlblRlc3QoWG1sZ2VuVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGNsYXNzIGlvY2xhc3MobGlzdCk6CisgICAgICAgIHdyaXRlID0gbGlzdC5hcHBlbmQKKyAgICAgICAgY2xvc2VkID0gRmFsc2UKKworICAgICAgICBkZWYgZ2V0dmFsdWUoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gYicnLmpvaW4oc2VsZikKKworCitjbGFzcyBYTUxGaWx0ZXJCYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZmlsdGVyX2Jhc2ljKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIGZpbHRlciA9IFhNTEZpbHRlckJhc2UoKQorICAgICAgICBmaWx0ZXIuc2V0Q29udGVudEhhbmRsZXIoZ2VuKQorCisgICAgICAgIGZpbHRlci5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZmlsdGVyLnN0YXJ0RWxlbWVudCgiZG9jIiwge30pCisgICAgICAgIGZpbHRlci5jaGFyYWN0ZXJzKCJjb250ZW50IikKKyAgICAgICAgZmlsdGVyLmlnbm9yYWJsZVdoaXRlc3BhY2UoIiAiKQorICAgICAgICBmaWx0ZXIuZW5kRWxlbWVudCgiZG9jIikKKyAgICAgICAgZmlsdGVyLmVuZERvY3VtZW50KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCBzdGFydCArICI8ZG9jPmNvbnRlbnQgPC9kb2M+IikKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICBleHBhdHJlYWRlciB0ZXN0cworIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworeG1sX3Rlc3Rfb3V0ID0gb3BlbihURVNUX1hNTEZJTEVfT1VUKS5yZWFkKCkKKworY2xhc3MgRXhwYXRSZWFkZXJUZXN0KFhtbFRlc3RCYXNlKToKKworICAgICMgPT09PT0gWE1MUmVhZGVyIHN1cHBvcnQKKworICAgIGRlZiB0ZXN0X2V4cGF0X2ZpbGUoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKKyAgICAgICAgcGFyc2VyLnBhcnNlKG9wZW4oVEVTVF9YTUxGSUxFKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCB4bWxfdGVzdF9vdXQpCisKKyAgICBAcmVxdWlyZXNfdW5pY29kZV9maWxlbmFtZXMKKyAgICBkZWYgdGVzdF9leHBhdF9maWxlX3VuaWNvZGUoc2VsZik6CisgICAgICAgIGZuYW1lID0gc3VwcG9ydC5URVNURk5fVU5JQ09ERQorICAgICAgICBzaHV0aWwuY29weWZpbGUoVEVTVF9YTUxGSUxFLCBmbmFtZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmbmFtZSkKKworICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisgICAgICAgIHBhcnNlci5wYXJzZShvcGVuKGZuYW1lKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCB4bWxfdGVzdF9vdXQpCisKKyAgICAjID09PT09IERUREhhbmRsZXIgc3VwcG9ydAorCisgICAgY2xhc3MgVGVzdERUREhhbmRsZXI6CisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fbm90YXRpb25zID0gW10KKyAgICAgICAgICAgIHNlbGYuX2VudGl0aWVzICA9IFtdCisKKyAgICAgICAgZGVmIG5vdGF0aW9uRGVjbChzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgorICAgICAgICAgICAgc2VsZi5fbm90YXRpb25zLmFwcGVuZCgobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKSkKKworICAgICAgICBkZWYgdW5wYXJzZWRFbnRpdHlEZWNsKHNlbGYsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbmRhdGEpOgorICAgICAgICAgICAgc2VsZi5fZW50aXRpZXMuYXBwZW5kKChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG5kYXRhKSkKKworICAgIGRlZiB0ZXN0X2V4cGF0X2R0ZGhhbmRsZXIoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICBoYW5kbGVyID0gc2VsZi5UZXN0RFRESGFuZGxlcigpCisgICAgICAgIHBhcnNlci5zZXREVERIYW5kbGVyKGhhbmRsZXIpCisKKyAgICAgICAgcGFyc2VyLmZlZWQoJzwhRE9DVFlQRSBkb2MgW1xuJykKKyAgICAgICAgcGFyc2VyLmZlZWQoJyAgPCFFTlRJVFkgaW1nIFNZU1RFTSAiZXhwYXQuZ2lmIiBOREFUQSBHSUY+XG4nKQorICAgICAgICBwYXJzZXIuZmVlZCgnICA8IU5PVEFUSU9OIEdJRiBQVUJMSUMgIi0vL0NvbXB1U2VydmUvL05PVEFUSU9OIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdCA4OWEvL0VOIj5cbicpCisgICAgICAgIHBhcnNlci5mZWVkKCddPlxuJykKKyAgICAgICAgcGFyc2VyLmZlZWQoJzxkb2M+PC9kb2M+JykKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhbmRsZXIuX25vdGF0aW9ucywKKyAgICAgICAgICAgIFsoIkdJRiIsICItLy9Db21wdVNlcnZlLy9OT1RBVElPTiBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQgODlhLy9FTiIsIE5vbmUpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW5kbGVyLl9lbnRpdGllcywgWygiaW1nIiwgTm9uZSwgImV4cGF0LmdpZiIsICJHSUYiKV0pCisKKyAgICAjID09PT09IEVudGl0eVJlc29sdmVyIHN1cHBvcnQKKworICAgIGNsYXNzIFRlc3RFbnRpdHlSZXNvbHZlcjoKKworICAgICAgICBkZWYgcmVzb2x2ZUVudGl0eShzZWxmLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgorICAgICAgICAgICAgaW5wc3JjID0gSW5wdXRTb3VyY2UoKQorICAgICAgICAgICAgaW5wc3JjLnNldEJ5dGVTdHJlYW0oU3RyaW5nSU8oIjxlbnRpdHkvPiIpKQorICAgICAgICAgICAgcmV0dXJuIGlucHNyYworCisgICAgZGVmIHRlc3RfZXhwYXRfZW50aXR5cmVzb2x2ZXIoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICBwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIoc2VsZi5UZXN0RW50aXR5UmVzb2x2ZXIoKSkKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoWE1MR2VuZXJhdG9yKHJlc3VsdCkpCisKKyAgICAgICAgcGFyc2VyLmZlZWQoJzwhRE9DVFlQRSBkb2MgW1xuJykKKyAgICAgICAgcGFyc2VyLmZlZWQoJyAgPCFFTlRJVFkgdGVzdCBTWVNURU0gIndoYXRldmVyIj5cbicpCisgICAgICAgIHBhcnNlci5mZWVkKCddPlxuJykKKyAgICAgICAgcGFyc2VyLmZlZWQoJzxkb2M+JnRlc3Q7PC9kb2M+JykKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCBzdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgIjxkb2M+PGVudGl0eT48L2VudGl0eT48L2RvYz4iKQorCisgICAgIyA9PT09PSBBdHRyaWJ1dGVzIHN1cHBvcnQKKworICAgIGNsYXNzIEF0dHJHYXRoZXJlcihDb250ZW50SGFuZGxlcik6CisKKyAgICAgICAgZGVmIHN0YXJ0RWxlbWVudChzZWxmLCBuYW1lLCBhdHRycyk6CisgICAgICAgICAgICBzZWxmLl9hdHRycyA9IGF0dHJzCisKKyAgICAgICAgZGVmIHN0YXJ0RWxlbWVudE5TKHNlbGYsIG5hbWUsIHFuYW1lLCBhdHRycyk6CisgICAgICAgICAgICBzZWxmLl9hdHRycyA9IGF0dHJzCisKKyAgICBkZWYgdGVzdF9leHBhdF9hdHRyc19lbXB0eShzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIGdhdGhlciA9IHNlbGYuQXR0ckdhdGhlcmVyKCkKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKGdhdGhlcikKKworICAgICAgICBwYXJzZXIuZmVlZCgiPGRvYy8+IikKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKworICAgICAgICBzZWxmLnZlcmlmeV9lbXB0eV9hdHRycyhnYXRoZXIuX2F0dHJzKQorCisgICAgZGVmIHRlc3RfZXhwYXRfYXR0cnNfd2F0dHIoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICBnYXRoZXIgPSBzZWxmLkF0dHJHYXRoZXJlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2MgYXR0cj0ndmFsJy8+IikKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKworICAgICAgICBzZWxmLnZlcmlmeV9hdHRyc193YXR0cihnYXRoZXIuX2F0dHJzKQorCisgICAgZGVmIHRlc3RfZXhwYXRfbnNhdHRyc19lbXB0eShzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigxKQorICAgICAgICBnYXRoZXIgPSBzZWxmLkF0dHJHYXRoZXJlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2MvPiIpCisgICAgICAgIHBhcnNlci5jbG9zZSgpCisKKyAgICAgICAgc2VsZi52ZXJpZnlfZW1wdHlfbnNhdHRycyhnYXRoZXIuX2F0dHJzKQorCisgICAgZGVmIHRlc3RfZXhwYXRfbnNhdHRyc193YXR0cihzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigxKQorICAgICAgICBnYXRoZXIgPSBzZWxmLkF0dHJHYXRoZXJlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2MgeG1sbnM6bnM9JyVzJyBuczphdHRyPSd2YWwnLz4iICUgbnNfdXJpKQorICAgICAgICBwYXJzZXIuY2xvc2UoKQorCisgICAgICAgIGF0dHJzID0gZ2F0aGVyLl9hdHRycworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0TGVuZ3RoKCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0TmFtZXMoKSwgWyhuc191cmksICJhdHRyIildKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGF0dHJzLmdldFFOYW1lcygpID09IFtdIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVzKCkgPT0gWyJuczphdHRyIl0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhdHRycyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhdHRycy5oYXNfa2V5KChuc191cmksICJhdHRyIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldCgobnNfdXJpLCAiYXR0ciIpKSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0KChuc191cmksICJhdHRyIiksIDI1KSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuaXRlbXMoKSwgWygobnNfdXJpLCAiYXR0ciIpLCAidmFsIildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLnZhbHVlcygpLCBbInZhbCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldFZhbHVlKChuc191cmksICJhdHRyIikpLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRyc1sobnNfdXJpLCAiYXR0ciIpXSwgInZhbCIpCisKKyAgICAjID09PT09IElucHV0U291cmNlIHN1cHBvcnQKKworICAgIGRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9maWxlbmFtZShzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorICAgICAgICBwYXJzZXIucGFyc2UoVEVTVF9YTUxGSUxFKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHhtbF90ZXN0X291dCkKKworICAgIGRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9zeXNpZChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorICAgICAgICBwYXJzZXIucGFyc2UoSW5wdXRTb3VyY2UoVEVTVF9YTUxGSUxFKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCB4bWxfdGVzdF9vdXQpCisKKyAgICBAcmVxdWlyZXNfdW5pY29kZV9maWxlbmFtZXMKKyAgICBkZWYgdGVzdF9leHBhdF9pbnBzb3VyY2Vfc3lzaWRfdW5pY29kZShzZWxmKToKKyAgICAgICAgZm5hbWUgPSBzdXBwb3J0LlRFU1RGTl9VTklDT0RFCisgICAgICAgIHNodXRpbC5jb3B5ZmlsZShURVNUX1hNTEZJTEUsIGZuYW1lKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3VwcG9ydC51bmxpbmssIGZuYW1lKQorCisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKKyAgICAgICAgcGFyc2VyLnBhcnNlKElucHV0U291cmNlKGZuYW1lKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCB4bWxfdGVzdF9vdXQpCisKKyAgICBkZWYgdGVzdF9leHBhdF9pbnBzb3VyY2Vfc3RyZWFtKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisgICAgICAgIGlucHNyYyA9IElucHV0U291cmNlKCkKKyAgICAgICAgaW5wc3JjLnNldEJ5dGVTdHJlYW0ob3BlbihURVNUX1hNTEZJTEUpKQorICAgICAgICBwYXJzZXIucGFyc2UoaW5wc3JjKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHhtbF90ZXN0X291dCkKKworICAgICMgPT09PT0gSW5jcmVtZW50YWxQYXJzZXIgc3VwcG9ydAorCisgICAgZGVmIHRlc3RfZXhwYXRfaW5jcmVtZW50YWwoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKKyAgICAgICAgcGFyc2VyLmZlZWQoIjwvZG9jPiIpCisgICAgICAgIHBhcnNlci5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKyAiPGRvYz48L2RvYz4iKQorCisgICAgZGVmIHRlc3RfZXhwYXRfaW5jcmVtZW50YWxfcmVzZXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKKyAgICAgICAgcGFyc2VyLmZlZWQoInRleHQiKQorCisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKKyAgICAgICAgcGFyc2VyLnJlc2V0KCkKKworICAgICAgICBwYXJzZXIuZmVlZCgiPGRvYz4iKQorICAgICAgICBwYXJzZXIuZmVlZCgidGV4dCIpCisgICAgICAgIHBhcnNlci5mZWVkKCI8L2RvYz4iKQorICAgICAgICBwYXJzZXIuY2xvc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+dGV4dDwvZG9jPiIpCisKKyAgICAjID09PT09IExvY2F0b3Igc3VwcG9ydAorCisgICAgZGVmIHRlc3RfZXhwYXRfbG9jYXRvcl9ub2luZm8oc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKKyAgICAgICAgcGFyc2VyLmZlZWQoIjwvZG9jPiIpCisgICAgICAgIHBhcnNlci5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZ2V0U3lzdGVtSWQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZ2V0UHVibGljSWQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZ2V0TGluZU51bWJlcigpLCAxKQorCisgICAgZGVmIHRlc3RfZXhwYXRfbG9jYXRvcl93aXRoaW5mbyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKKyAgICAgICAgcGFyc2VyLnBhcnNlKFRFU1RfWE1MRklMRSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5nZXRTeXN0ZW1JZCgpLCBURVNUX1hNTEZJTEUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmdldFB1YmxpY0lkKCksIE5vbmUpCisKKyAgICBAcmVxdWlyZXNfdW5pY29kZV9maWxlbmFtZXMKKyAgICBkZWYgdGVzdF9leHBhdF9sb2NhdG9yX3dpdGhpbmZvX3VuaWNvZGUoc2VsZik6CisgICAgICAgIGZuYW1lID0gc3VwcG9ydC5URVNURk5fVU5JQ09ERQorICAgICAgICBzaHV0aWwuY29weWZpbGUoVEVTVF9YTUxGSUxFLCBmbmFtZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmbmFtZSkKKworICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorICAgICAgICBwYXJzZXIucGFyc2UoZm5hbWUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZ2V0U3lzdGVtSWQoKSwgZm5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmdldFB1YmxpY0lkKCksIE5vbmUpCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICBlcnJvciByZXBvcnRpbmcKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIEVycm9yUmVwb3J0aW5nVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZXhwYXRfaW5wc291cmNlX2xvY2F0aW9uKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKENvbnRlbnRIYW5kbGVyKCkpICMgZG8gbm90aGluZworICAgICAgICBzb3VyY2UgPSBJbnB1dFNvdXJjZSgpCisgICAgICAgIHNvdXJjZS5zZXRCeXRlU3RyZWFtKFN0cmluZ0lPKCI8Zm9vIGJhciBmb29iYXI+IikpICAgI2lsbC1mb3JtZWQKKyAgICAgICAgbmFtZSA9ICJhIGZpbGUgbmFtZSIKKyAgICAgICAgc291cmNlLnNldFN5c3RlbUlkKG5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZShzb3VyY2UpCisgICAgICAgICAgICBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQgU0FYRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmdldFN5c3RlbUlkKCksIG5hbWUpCisKKyAgICBkZWYgdGVzdF9leHBhdF9pbmNvbXBsZXRlKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKENvbnRlbnRIYW5kbGVyKCkpICMgZG8gbm90aGluZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTQVhQYXJzZUV4Y2VwdGlvbiwgcGFyc2VyLnBhcnNlLCBTdHJpbmdJTygiPGZvbz4iKSkKKworICAgIGRlZiB0ZXN0X3NheF9wYXJzZV9leGNlcHRpb25fc3RyKHNlbGYpOgorICAgICAgICAjIHBhc3MgdmFyaW91cyB2YWx1ZXMgZnJvbSBhIGxvY2F0b3IgdG8gdGhlIFNBWFBhcnNlRXhjZXB0aW9uIHRvCisgICAgICAgICMgbWFrZSBzdXJlIHRoYXQgdGhlIF9fc3RyX18oKSBkb2Vzbid0IGZhbGwgYXBhcnQgd2hlbiBOb25lIGlzCisgICAgICAgICMgcGFzc2VkIGluc3RlYWQgb2YgYW4gaW50ZWdlciBsaW5lIGFuZCBjb2x1bW4gbnVtYmVyCisgICAgICAgICMKKyAgICAgICAgIyB1c2UgIm5vcm1hbCIgdmFsdWVzIGZvciB0aGUgbG9jYXRvcjoKKyAgICAgICAgc3RyKFNBWFBhcnNlRXhjZXB0aW9uKCJtZXNzYWdlIiwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRHVtbXlMb2NhdG9yKDEsIDEpKSkKKyAgICAgICAgIyB1c2UgTm9uZSBmb3IgdGhlIGxpbmUgbnVtYmVyOgorICAgICAgICBzdHIoU0FYUGFyc2VFeGNlcHRpb24oIm1lc3NhZ2UiLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5EdW1teUxvY2F0b3IoTm9uZSwgMSkpKQorICAgICAgICAjIHVzZSBOb25lIGZvciB0aGUgY29sdW1uIG51bWJlcjoKKyAgICAgICAgc3RyKFNBWFBhcnNlRXhjZXB0aW9uKCJtZXNzYWdlIiwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRHVtbXlMb2NhdG9yKDEsIE5vbmUpKSkKKyAgICAgICAgIyB1c2UgTm9uZSBmb3IgYm90aDoKKyAgICAgICAgc3RyKFNBWFBhcnNlRXhjZXB0aW9uKCJtZXNzYWdlIiwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRHVtbXlMb2NhdG9yKE5vbmUsIE5vbmUpKSkKKworICAgIGNsYXNzIER1bW15TG9jYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmVubywgY29sbm8pOgorICAgICAgICAgICAgc2VsZi5fbGluZW5vID0gbGluZW5vCisgICAgICAgICAgICBzZWxmLl9jb2xubyA9IGNvbG5vCisKKyAgICAgICAgZGVmIGdldFB1YmxpY0lkKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuICJwdWJpZCIKKworICAgICAgICBkZWYgZ2V0U3lzdGVtSWQoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gInN5c2lkIgorCisgICAgICAgIGRlZiBnZXRMaW5lTnVtYmVyKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xpbmVubworCisgICAgICAgIGRlZiBnZXRDb2x1bW5OdW1iZXIoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29sbm8KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICB4bWxyZWFkZXIgdGVzdHMKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFhtbFJlYWRlclRlc3QoWG1sVGVzdEJhc2UpOgorCisgICAgIyA9PT09PSBBdHRyaWJ1dGVzSW1wbAorICAgIGRlZiB0ZXN0X2F0dHJzX2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLnZlcmlmeV9lbXB0eV9hdHRycyhBdHRyaWJ1dGVzSW1wbCh7fSkpCisKKyAgICBkZWYgdGVzdF9hdHRyc193YXR0cihzZWxmKToKKyAgICAgICAgc2VsZi52ZXJpZnlfYXR0cnNfd2F0dHIoQXR0cmlidXRlc0ltcGwoeyJhdHRyIiA6ICJ2YWwifSkpCisKKyAgICBkZWYgdGVzdF9uc2F0dHJzX2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLnZlcmlmeV9lbXB0eV9uc2F0dHJzKEF0dHJpYnV0ZXNOU0ltcGwoe30sIHt9KSkKKworICAgIGRlZiB0ZXN0X25zYXR0cnNfd2F0dHIoc2VsZik6CisgICAgICAgIGF0dHJzID0gQXR0cmlidXRlc05TSW1wbCh7KG5zX3VyaSwgImF0dHIiKSA6ICJ2YWwifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsobnNfdXJpLCAiYXR0ciIpIDogIm5zOmF0dHIifSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldExlbmd0aCgpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldE5hbWVzKCksIFsobnNfdXJpLCAiYXR0ciIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXRRTmFtZXMoKSwgWyJuczphdHRyIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGF0dHJzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGF0dHJzLmhhc19rZXkoKG5zX3VyaSwgImF0dHIiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMua2V5cygpLCBbKG5zX3VyaSwgImF0dHIiKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0KChuc191cmksICJhdHRyIikpLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSwgMjUpLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5pdGVtcygpLCBbKChuc191cmksICJhdHRyIiksICJ2YWwiKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMudmFsdWVzKCksIFsidmFsIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0VmFsdWUoKG5zX3VyaSwgImF0dHIiKSksICJ2YWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldFZhbHVlQnlRTmFtZSgibnM6YXR0ciIpLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXROYW1lQnlRTmFtZSgibnM6YXR0ciIpLCAobnNfdXJpLCAiYXR0ciIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzWyhuc191cmksICJhdHRyIildLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXRRTmFtZUJ5TmFtZSgobnNfdXJpLCAiYXR0ciIpKSwgIm5zOmF0dHIiKQorCisKKyAgICAjIER1cmluZyB0aGUgZGV2ZWxvcG1lbnQgb2YgUHl0aG9uIDIuNSwgYW4gYXR0ZW1wdCB0byBtb3ZlIHRoZSAieG1sIgorICAgICMgcGFja2FnZSBpbXBsZW1lbnRhdGlvbiB0byBhIG5ldyBwYWNrYWdlICgieG1sY29yZSIpIHByb3ZlZCBwYWluZnVsLgorICAgICMgVGhlIGdvYWwgb2YgdGhpcyBjaGFuZ2Ugd2FzIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBiZSBhYmxlIHRvCisgICAgIyBvYnRhaW4gYW5kIHJlbHkgb24gYmVoYXZpb3IgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KKyAgICAjIG9mIHRoZSBYTUwgc3VwcG9ydCB3aXRob3V0IG5lZWRpbmcgdG8gYmUgY29uY2VybmVkIGFib3V0IHRoZQorICAgICMgYXZhaWxhYmlsaXR5IG9mIHRoZSBQeVhNTCBpbXBsZW1lbnRhdGlvbi4KKyAgICAjCisgICAgIyBXaGlsZSB0aGUgZXhpc3RpbmcgaW1wb3J0IGhhY2tlcnkgaW4gTGliL3htbC9fX2luaXRfXy5weSBjYW4gY2F1c2UKKyAgICAjIFB5WE1MJ3MgX3htbHB1cyBwYWNrYWdlIHRvIHN1cHBsYW50IHRoZSAieG1sIiBwYWNrYWdlLCB0aGF0IG9ubHkKKyAgICAjIHdvcmtzIGJlY2F1c2UgZWl0aGVyIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlICJ4bWwiIHBhY2thZ2UgbmFtZSBmb3IKKyAgICAjIGltcG9ydHMuCisgICAgIworICAgICMgVGhlIG1vdmUgcmVzdWx0ZWQgaW4gYSBudW1iZXIgb2YgcHJvYmxlbXMgcmVsYXRlZCB0byB0aGUgZmFjdCB0aGF0CisgICAgIyB0aGUgaW1wb3J0IG1hY2hpbmVyeSdzICJwYWNrYWdlIGNvbnRleHQiIGlzIGJhc2VkIG9uIHRoZSBuYW1lIHRoYXQncworICAgICMgYmVpbmcgaW1wb3J0ZWQgcmF0aGVyIHRoYW4gdGhlIF9fbmFtZV9fIG9mIHRoZSBhY3R1YWwgcGFja2FnZQorICAgICMgY29udGFpbm1lbnQ7IGl0IHdhc24ndCBwb3NzaWJsZSBmb3IgdGhlICJ4bWwiIHBhY2thZ2UgdG8gYmUgcmVwbGFjZWQKKyAgICAjIGJ5IGEgc2ltcGxlIG1vZHVsZSB0aGF0IGluZGlyZWN0ZWQgaW1wb3J0cyB0byB0aGUgInhtbGNvcmUiIHBhY2thZ2UuCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyB0d28gdGVzdHMgZXhlcmNpc2VkIGJ1Z3MgdGhhdCB3ZXJlIGludHJvZHVjZWQgaW4gdGhhdAorICAgICMgYXR0ZW1wdC4gIEtlZXBpbmcgdGhlc2UgdGVzdHMgYXJvdW5kIHdpbGwgaGVscCBkZXRlY3QgcHJvYmxlbXMgd2l0aAorICAgICMgb3RoZXIgYXR0ZW1wdHMgdG8gcHJvdmlkZSByZWxpYWJsZSBhY2Nlc3MgdG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkncworICAgICMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFhNTCBzdXBwb3J0LgorCisgICAgZGVmIHRlc3Rfc2ZfMTUxMTQ5NyhzZWxmKToKKyAgICAgICAgIyBCdWcgcmVwb3J0OiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvMTUxMTQ5NworICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIG9sZF9tb2R1bGVzID0gc3lzLm1vZHVsZXMuY29weSgpCisgICAgICAgIGZvciBtb2RuYW1lIGluIHN5cy5tb2R1bGVzLmtleXMoKToKKyAgICAgICAgICAgIGlmIG1vZG5hbWUuc3RhcnRzd2l0aCgieG1sLiIpOgorICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1ttb2RuYW1lXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgeG1sLnNheC5leHBhdHJlYWRlcgorICAgICAgICAgICAgbW9kdWxlID0geG1sLnNheC5leHBhdHJlYWRlcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sICJ4bWwuc2F4LmV4cGF0cmVhZGVyIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5tb2R1bGVzLnVwZGF0ZShvbGRfbW9kdWxlcykKKworICAgIGRlZiB0ZXN0X3NmXzE1MTM2MTEoc2VsZik6CisgICAgICAgICMgQnVnIHJlcG9ydDogaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzE1MTM2MTEKKyAgICAgICAgc2lvID0gU3RyaW5nSU8oImludmFsaWQiKQorICAgICAgICBwYXJzZXIgPSBtYWtlX3BhcnNlcigpCisgICAgICAgIGZyb20geG1sLnNheCBpbXBvcnQgU0FYUGFyc2VFeGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU0FYUGFyc2VFeGNlcHRpb24sIHBhcnNlci5wYXJzZSwgc2lvKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoTWFrZVBhcnNlclRlc3QsCisgICAgICAgICAgICAgICAgIFNheHV0aWxzVGVzdCwKKyAgICAgICAgICAgICAgICAgU3RyaW5nWG1sZ2VuVGVzdCwKKyAgICAgICAgICAgICAgICAgQnl0ZXNJT1htbGdlblRlc3QsCisgICAgICAgICAgICAgICAgIFdyaXRlclhtbGdlblRlc3QsCisgICAgICAgICAgICAgICAgIEV4cGF0UmVhZGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgRXJyb3JSZXBvcnRpbmdUZXN0LAorICAgICAgICAgICAgICAgICBYbWxSZWFkZXJUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zYXgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2F4LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWE3OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2F4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zYXgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2F4LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWE3OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2F4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zY29wZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Njb3BlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTgzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zY29wZS5weQpAQCAtMCwwICsxLDY2NCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjaGVja19zeW50YXhfZXJyb3IsIGNoZWNrX3B5M2tfd2FybmluZ3MsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3dhcm5pbmdzLCBydW5fdW5pdHRlc3QKKworCitjbGFzcyBTY29wZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0U2ltcGxlTmVzdGluZyhzZWxmKToKKworICAgICAgICBkZWYgbWFrZV9hZGRlcih4KToKKyAgICAgICAgICAgIGRlZiBhZGRlcih5KToKKyAgICAgICAgICAgICAgICByZXR1cm4geCArIHkKKyAgICAgICAgICAgIHJldHVybiBhZGRlcgorCisgICAgICAgIGluYyA9IG1ha2VfYWRkZXIoMSkKKyAgICAgICAgcGx1czEwID0gbWFrZV9hZGRlcigxMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoLTIpLCA4KQorCisgICAgZGVmIHRlc3RFeHRyYU5lc3Rpbmcoc2VsZik6CisKKyAgICAgICAgZGVmIG1ha2VfYWRkZXIyKHgpOgorICAgICAgICAgICAgZGVmIGV4dHJhKCk6ICMgY2hlY2sgZnJlZXZhcnMgcGFzc2luZyB0aHJvdWdoIG5vbi11c2Ugc2NvcGVzCisgICAgICAgICAgICAgICAgZGVmIGFkZGVyKHkpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4geCArIHkKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRkZXIKKyAgICAgICAgICAgIHJldHVybiBleHRyYSgpCisKKyAgICAgICAgaW5jID0gbWFrZV9hZGRlcjIoMSkKKyAgICAgICAgcGx1czEwID0gbWFrZV9hZGRlcjIoMTApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGx1czEwKC0yKSwgOCkKKworICAgIGRlZiB0ZXN0U2ltcGxlQW5kUmViaW5kaW5nKHNlbGYpOgorCisgICAgICAgIGRlZiBtYWtlX2FkZGVyMyh4KToKKyAgICAgICAgICAgIGRlZiBhZGRlcih5KToKKyAgICAgICAgICAgICAgICByZXR1cm4geCArIHkKKyAgICAgICAgICAgIHggPSB4ICsgMSAjIGNoZWNrIHRyYWNraW5nIG9mIGFzc2lnbm1lbnQgdG8geCBpbiBkZWZpbmluZyBzY29wZQorICAgICAgICAgICAgcmV0dXJuIGFkZGVyCisKKyAgICAgICAgaW5jID0gbWFrZV9hZGRlcjMoMCkKKyAgICAgICAgcGx1czEwID0gbWFrZV9hZGRlcjMoOSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoLTIpLCA4KQorCisgICAgZGVmIHRlc3ROZXN0aW5nR2xvYmFsTm9GcmVlKHNlbGYpOgorCisgICAgICAgIGRlZiBtYWtlX2FkZGVyNCgpOiAjIFhYWCBhZGQgZXh0YSBsZXZlbCBvZiBpbmRpcmVjdGlvbgorICAgICAgICAgICAgZGVmIG5lc3QoKToKKyAgICAgICAgICAgICAgICBkZWYgbmVzdCgpOgorICAgICAgICAgICAgICAgICAgICBkZWYgYWRkZXIoeSk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsX3ggKyB5ICMgY2hlY2sgdGhhdCBwbGFpbiBvbGQgZ2xvYmFscyB3b3JrCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRlcgorICAgICAgICAgICAgICAgIHJldHVybiBuZXN0KCkKKyAgICAgICAgICAgIHJldHVybiBuZXN0KCkKKworICAgICAgICBnbG9iYWxfeCA9IDEKKyAgICAgICAgYWRkZXIgPSBtYWtlX2FkZGVyNCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWRkZXIoMSksIDIpCisKKyAgICAgICAgZ2xvYmFsX3ggPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkZGVyKC0yKSwgOCkKKworICAgIGRlZiB0ZXN0TmVzdGluZ1Rocm91Z2hDbGFzcyhzZWxmKToKKworICAgICAgICBkZWYgbWFrZV9hZGRlcjUoeCk6CisgICAgICAgICAgICBjbGFzcyBBZGRlcjoKKyAgICAgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZiwgeSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICsgeQorICAgICAgICAgICAgcmV0dXJuIEFkZGVyKCkKKworICAgICAgICBpbmMgPSBtYWtlX2FkZGVyNSgxKQorICAgICAgICBwbHVzMTAgPSBtYWtlX2FkZGVyNSgxMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoLTIpLCA4KQorCisgICAgZGVmIHRlc3ROZXN0aW5nUGx1c0ZyZWVSZWZUb0dsb2JhbChzZWxmKToKKworICAgICAgICBkZWYgbWFrZV9hZGRlcjYoeCk6CisgICAgICAgICAgICBnbG9iYWwgZ2xvYmFsX25lc3RfeAorICAgICAgICAgICAgZGVmIGFkZGVyKHkpOgorICAgICAgICAgICAgICAgIHJldHVybiBnbG9iYWxfbmVzdF94ICsgeQorICAgICAgICAgICAgZ2xvYmFsX25lc3RfeCA9IHgKKyAgICAgICAgICAgIHJldHVybiBhZGRlcgorCisgICAgICAgIGluYyA9IG1ha2VfYWRkZXI2KDEpCisgICAgICAgIHBsdXMxMCA9IG1ha2VfYWRkZXI2KDEwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5jKDEpLCAxMSkgIyB0aGVyZSdzIG9ubHkgb25lIGdsb2JhbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsdXMxMCgtMiksIDgpCisKKyAgICBkZWYgdGVzdE5lYXJlc3RFbmNsb3NpbmdTY29wZShzZWxmKToKKworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGRlZiBnKHkpOgorICAgICAgICAgICAgICAgIHggPSA0MiAjIGNoZWNrIHRoYXQgdGhpcyBtYXNrcyBiaW5kaW5nIGluIGYoKQorICAgICAgICAgICAgICAgIGRlZiBoKHopOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4geCArIHoKKyAgICAgICAgICAgICAgICByZXR1cm4gaAorICAgICAgICAgICAgcmV0dXJuIGcoMikKKworICAgICAgICB0ZXN0X2Z1bmMgPSBmKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RfZnVuYyg1KSwgNDcpCisKKyAgICBkZWYgdGVzdE1peGVkRnJlZXZhcnNBbmRDZWxsdmFycyhzZWxmKToKKworICAgICAgICBkZWYgaWRlbnRpdHkoeCk6CisgICAgICAgICAgICByZXR1cm4geAorCisgICAgICAgIGRlZiBmKHgsIHksIHopOgorICAgICAgICAgICAgZGVmIGcoYSwgYiwgYyk6CisgICAgICAgICAgICAgICAgYSA9IGEgKyB4ICMgMworICAgICAgICAgICAgICAgIGRlZiBoKCk6CisgICAgICAgICAgICAgICAgICAgICMgeiAqICg0ICsgOSkKKyAgICAgICAgICAgICAgICAgICAgIyAzICogMTMKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlkZW50aXR5KHogKiAoYiArIHkpKQorICAgICAgICAgICAgICAgIHkgPSBjICsgeiAjIDkKKyAgICAgICAgICAgICAgICByZXR1cm4gaAorICAgICAgICAgICAgcmV0dXJuIGcKKworICAgICAgICBnID0gZigxLCAyLCAzKQorICAgICAgICBoID0gZygyLCA0LCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgoKSwgMzkpCisKKyAgICBkZWYgdGVzdEZyZWVWYXJJbk1ldGhvZChzZWxmKToKKworICAgICAgICBkZWYgdGVzdCgpOgorICAgICAgICAgICAgbWV0aG9kX2FuZF92YXIgPSAidmFyIgorICAgICAgICAgICAgY2xhc3MgVGVzdDoKKyAgICAgICAgICAgICAgICBkZWYgbWV0aG9kX2FuZF92YXIoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAibWV0aG9kIgorICAgICAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kX2FuZF92YXIKKyAgICAgICAgICAgICAgICBkZWYgYWN0dWFsX2dsb2JhbChzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cigiZ2xvYmFsIikKKyAgICAgICAgICAgICAgICBkZWYgc3RyKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYpCisgICAgICAgICAgICByZXR1cm4gVGVzdCgpCisKKyAgICAgICAgdCA9IHRlc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudGVzdCgpLCAidmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm1ldGhvZF9hbmRfdmFyKCksICJtZXRob2QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuYWN0dWFsX2dsb2JhbCgpLCAiZ2xvYmFsIikKKworICAgICAgICBtZXRob2RfYW5kX3ZhciA9ICJ2YXIiCisgICAgICAgIGNsYXNzIFRlc3Q6CisgICAgICAgICAgICAjIHRoaXMgY2xhc3MgaXMgbm90IG5lc3RlZCwgc28gdGhlIHJ1bGVzIGFyZSBkaWZmZXJlbnQKKyAgICAgICAgICAgIGRlZiBtZXRob2RfYW5kX3ZhcihzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGhvZCIKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2RfYW5kX3ZhcgorICAgICAgICAgICAgZGVmIGFjdHVhbF9nbG9iYWwoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cigiZ2xvYmFsIikKKyAgICAgICAgICAgIGRlZiBzdHIoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmKQorCisgICAgICAgIHQgPSBUZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRlc3QoKSwgInZhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5tZXRob2RfYW5kX3ZhcigpLCAibWV0aG9kIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmFjdHVhbF9nbG9iYWwoKSwgImdsb2JhbCIpCisKKyAgICBkZWYgdGVzdFJlY3Vyc2lvbihzZWxmKToKKworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGRlZiBmYWN0KG4pOgorICAgICAgICAgICAgICAgIGlmIG4gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbiAqIGZhY3QobiAtIDEpCisgICAgICAgICAgICBpZiB4ID49IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3QoeCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInggbXVzdCBiZSA+PSAwIgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZig2KSwgNzIwKQorCisKKyAgICBkZWYgdGVzdFVub3B0aW1pemVkTmFtZXNwYWNlcyhzZWxmKToKKworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIiIiXAorZGVmIHVub3B0aW1pemVkX2NsYXNoMShzdHJpcCk6CisgICAgZGVmIGYocyk6CisgICAgICAgIGZyb20gc3RyaW5nIGltcG9ydCAqCisgICAgICAgIHJldHVybiBzdHJpcChzKSAjIGFtYmlndWl0eTogZnJlZSBvciBsb2NhbAorICAgIHJldHVybiBmCisiIiIpCisKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICIiIlwKK2RlZiB1bm9wdGltaXplZF9jbGFzaDIoKToKKyAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgorICAgIGRlZiBmKHMpOgorICAgICAgICByZXR1cm4gc3RyaXAocykgIyBhbWJpZ3VpdHk6IGdsb2JhbCBvciBsb2NhbAorICAgIHJldHVybiBmCisiIiIpCisKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICIiIlwKK2RlZiB1bm9wdGltaXplZF9jbGFzaDIoKToKKyAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgorICAgIGRlZiBnKCk6CisgICAgICAgIGRlZiBmKHMpOgorICAgICAgICAgICAgcmV0dXJuIHN0cmlwKHMpICMgYW1iaWd1aXR5OiBnbG9iYWwgb3IgbG9jYWwKKyAgICAgICAgcmV0dXJuIGYKKyIiIikKKworICAgICAgICAjIFhYWCBjb3VsZCBhbGxvdyB0aGlzIGZvciBleGVjIHdpdGggY29uc3QgYXJndW1lbnQsIGJ1dCB3aGF0J3MgdGhlIHBvaW50CisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiIiJcCitkZWYgZXJyb3IoeSk6CisgICAgZXhlYyAiYSA9IDEiCisgICAgZGVmIGYoeCk6CisgICAgICAgIHJldHVybiB4ICsgeQorICAgIHJldHVybiBmCisiIiIpCisKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICIiIlwKK2RlZiBmKHgpOgorICAgIGRlZiBnKCk6CisgICAgICAgIHJldHVybiB4CisgICAgZGVsIHggIyBjYW4ndCBkZWwgbmFtZQorIiIiKQorCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiIiJcCitkZWYgZigpOgorICAgIGRlZiBnKCk6CisgICAgICAgIGZyb20gc3RyaW5nIGltcG9ydCAqCisgICAgICAgIHJldHVybiBzdHJpcCAjIGdsb2JhbCBvciBsb2NhbD8KKyIiIikKKworICAgICAgICAjIGFuZCB2ZXJpZnkgYSBmZXcgY2FzZXMgdGhhdCBzaG91bGQgd29yaworCisgICAgICAgIGV4ZWMgIiIiCitkZWYgbm9wcm9ibGVtMSgpOgorICAgIGZyb20gc3RyaW5nIGltcG9ydCAqCisgICAgZiA9IGxhbWJkYSB4OngKKworZGVmIG5vcHJvYmxlbTIoKToKKyAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgorICAgIGRlZiBmKHgpOgorICAgICAgICByZXR1cm4geCArIDEKKworZGVmIG5vcHJvYmxlbTMoKToKKyAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgorICAgIGRlZiBmKHgpOgorICAgICAgICBnbG9iYWwgeQorICAgICAgICB5ID0geAorIiIiCisKKyAgICBkZWYgdGVzdExhbWJkYXMoc2VsZik6CisKKyAgICAgICAgZjEgPSBsYW1iZGEgeDogbGFtYmRhIHk6IHggKyB5CisgICAgICAgIGluYyA9IGYxKDEpCisgICAgICAgIHBsdXMxMCA9IGYxKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoNSksIDE1KQorCisgICAgICAgIGYyID0gbGFtYmRhIHg6IChsYW1iZGEgOiBsYW1iZGEgeTogeCArIHkpKCkKKyAgICAgICAgaW5jID0gZjIoMSkKKyAgICAgICAgcGx1czEwID0gZjIoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5jKDEpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsdXMxMCg1KSwgMTUpCisKKyAgICAgICAgZjMgPSBsYW1iZGEgeDogbGFtYmRhIHk6IGdsb2JhbF94ICsgeQorICAgICAgICBnbG9iYWxfeCA9IDEKKyAgICAgICAgaW5jID0gZjMoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMiksIDMpCisKKyAgICAgICAgZjggPSBsYW1iZGEgeCwgeSwgejogbGFtYmRhIGEsIGIsIGM6IGxhbWJkYSA6IHogKiAoYiArIHkpCisgICAgICAgIGcgPSBmOCgxLCAyLCAzKQorICAgICAgICBoID0gZygyLCA0LCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgoKSwgMTgpCisKKyAgICBkZWYgdGVzdFVuYm91bmRMb2NhbChzZWxmKToKKworICAgICAgICBkZWYgZXJyb3JJbk91dGVyKCk6CisgICAgICAgICAgICBwcmludCB5CisgICAgICAgICAgICBkZWYgaW5uZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geQorICAgICAgICAgICAgeSA9IDEKKworICAgICAgICBkZWYgZXJyb3JJbklubmVyKCk6CisgICAgICAgICAgICBkZWYgaW5uZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geQorICAgICAgICAgICAgaW5uZXIoKQorICAgICAgICAgICAgeSA9IDEKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmJvdW5kTG9jYWxFcnJvciwgZXJyb3JJbk91dGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOYW1lRXJyb3IsIGVycm9ySW5Jbm5lcikKKworICAgICAgICAjIHRlc3QgZm9yIGJ1ZyAjMTUwMTkzNDogaW5jb3JyZWN0IExPQUQvU1RPUkVfR0xPQkFMIGdlbmVyYXRpb24KKyAgICAgICAgZXhlYyAiIiIKK2dsb2JhbF94ID0gMQorZGVmIGYoKToKKyAgICBnbG9iYWxfeCArPSAxCit0cnk6CisgICAgZigpCitleGNlcHQgVW5ib3VuZExvY2FsRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBmYWlsKCdzY29wZSBvZiBnbG9iYWxfeCBub3QgY29ycmVjdGx5IGRldGVybWluZWQnKQorIiIiIGluIHsnZmFpbCc6IHNlbGYuZmFpbH0KKworICAgIGRlZiB0ZXN0Q29tcGxleERlZmluaXRpb25zKHNlbGYpOgorCisgICAgICAgIGRlZiBtYWtlUmV0dXJuZXIoKmxzdCk6CisgICAgICAgICAgICBkZWYgcmV0dXJuZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbHN0CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1ha2VSZXR1cm5lcigxLDIsMykoKSwgKDEsMiwzKSkKKworICAgICAgICBkZWYgbWFrZVJldHVybmVyMigqKmt3YXJncyk6CisgICAgICAgICAgICBkZWYgcmV0dXJuZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4ga3dhcmdzCisgICAgICAgICAgICByZXR1cm4gcmV0dXJuZXIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1ha2VSZXR1cm5lcjIoYT0xMSkoKVsnYSddLCAxMSkKKworICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKCJ0dXBsZSBwYXJhbWV0ZXIgdW5wYWNraW5nIGhhcyBiZWVuIHJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcpKToKKyAgICAgICAgICAgIGV4ZWMgIiIiXAorZGVmIG1ha2VBZGRQYWlyKChhLCBiKSk6CisgICAgZGVmIGFkZFBhaXIoKGMsIGQpKToKKyAgICAgICAgcmV0dXJuIChhICsgYywgYiArIGQpCisgICAgcmV0dXJuIGFkZFBhaXIKKyIiIiBpbiBsb2NhbHMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1ha2VBZGRQYWlyKCgxLCAyKSkoKDEwMCwgMjAwKSksICgxMDEsMjAyKSkKKworICAgIGRlZiB0ZXN0U2NvcGVPZkdsb2JhbFN0bXQoc2VsZik6CisjIEV4YW1wbGVzIHBvc3RlZCBieSBTYW11ZWxlIFBlZHJvbmkgdG8gcHl0aG9uLWRldiBvbiAzLzEvMjAwMQorCisgICAgICAgIGV4ZWMgIiIiXAorIyBJCit4ID0gNworZGVmIGYoKToKKyAgICB4ID0gMQorICAgIGRlZiBnKCk6CisgICAgICAgIGdsb2JhbCB4CisgICAgICAgIGRlZiBpKCk6CisgICAgICAgICAgICBkZWYgaCgpOgorICAgICAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgICAgICByZXR1cm4gaCgpCisgICAgICAgIHJldHVybiBpKCkKKyAgICByZXR1cm4gZygpCitzZWxmLmFzc2VydEVxdWFsKGYoKSwgNykKK3NlbGYuYXNzZXJ0RXF1YWwoeCwgNykKKworIyBJSQoreCA9IDcKK2RlZiBmKCk6CisgICAgeCA9IDEKKyAgICBkZWYgZygpOgorICAgICAgICB4ID0gMgorICAgICAgICBkZWYgaSgpOgorICAgICAgICAgICAgZGVmIGgoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgcmV0dXJuIGgoKQorICAgICAgICByZXR1cm4gaSgpCisgICAgcmV0dXJuIGcoKQorc2VsZi5hc3NlcnRFcXVhbChmKCksIDIpCitzZWxmLmFzc2VydEVxdWFsKHgsIDcpCisKKyMgSUlJCit4ID0gNworZGVmIGYoKToKKyAgICB4ID0gMQorICAgIGRlZiBnKCk6CisgICAgICAgIGdsb2JhbCB4CisgICAgICAgIHggPSAyCisgICAgICAgIGRlZiBpKCk6CisgICAgICAgICAgICBkZWYgaCgpOgorICAgICAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgICAgICByZXR1cm4gaCgpCisgICAgICAgIHJldHVybiBpKCkKKyAgICByZXR1cm4gZygpCitzZWxmLmFzc2VydEVxdWFsKGYoKSwgMikKK3NlbGYuYXNzZXJ0RXF1YWwoeCwgMikKKworIyBJVgoreCA9IDcKK2RlZiBmKCk6CisgICAgeCA9IDMKKyAgICBkZWYgZygpOgorICAgICAgICBnbG9iYWwgeAorICAgICAgICB4ID0gMgorICAgICAgICBkZWYgaSgpOgorICAgICAgICAgICAgZGVmIGgoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgcmV0dXJuIGgoKQorICAgICAgICByZXR1cm4gaSgpCisgICAgcmV0dXJuIGcoKQorc2VsZi5hc3NlcnRFcXVhbChmKCksIDIpCitzZWxmLmFzc2VydEVxdWFsKHgsIDIpCisKKyMgWFhYIHdoYXQgYWJvdXQgZ2xvYmFsIHN0YXRlbWVudHMgaW4gY2xhc3MgYmxvY2tzPworIyBkbyB0aGV5IGFmZmVjdCBtZXRob2RzPworCit4ID0gMTIKK2NsYXNzIEdsb2JhbDoKKyAgICBnbG9iYWwgeAorICAgIHggPSAxMworICAgIGRlZiBzZXQoc2VsZiwgdmFsKToKKyAgICAgICAgeCA9IHZhbAorICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIHJldHVybiB4CisKK2cgPSBHbG9iYWwoKQorc2VsZi5hc3NlcnRFcXVhbChnLmdldCgpLCAxMykKK2cuc2V0KDE1KQorc2VsZi5hc3NlcnRFcXVhbChnLmdldCgpLCAxMykKKyIiIgorCisgICAgZGVmIHRlc3RMZWFrcyhzZWxmKToKKworICAgICAgICBjbGFzcyBGb286CisgICAgICAgICAgICBjb3VudCA9IDAKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIEZvby5jb3VudCArPSAxCisKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIEZvby5jb3VudCAtPSAxCisKKyAgICAgICAgZGVmIGYxKCk6CisgICAgICAgICAgICB4ID0gRm9vKCkKKyAgICAgICAgICAgIGRlZiBmMigpOgorICAgICAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgICAgICBmMigpCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwKToKKyAgICAgICAgICAgIGYxKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZvby5jb3VudCwgMCkKKworICAgIGRlZiB0ZXN0Q2xhc3NBbmRHbG9iYWwoc2VsZik6CisKKyAgICAgICAgZXhlYyAiIiJcCitkZWYgdGVzdCh4KToKKyAgICBjbGFzcyBGb286CisgICAgICAgIGdsb2JhbCB4CisgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCB5KToKKyAgICAgICAgICAgIHJldHVybiB4ICsgeQorICAgIHJldHVybiBGb28oKQorCit4ID0gMAorc2VsZi5hc3NlcnRFcXVhbCh0ZXN0KDYpKDIpLCA4KQoreCA9IC0xCitzZWxmLmFzc2VydEVxdWFsKHRlc3QoMykoMiksIDUpCisKK2xvb2tlZF91cF9ieV9sb2FkX25hbWUgPSBGYWxzZQorY2xhc3MgWDoKKyAgICAjIEltcGxpY2l0IGdsb2JhbHMgaW5zaWRlIGNsYXNzZXMgYXJlIGJlIGxvb2tlZCB1cCBieSBMT0FEX05BTUUsIG5vdAorICAgICMgTE9BRF9HTE9CQUwuCisgICAgbG9jYWxzKClbJ2xvb2tlZF91cF9ieV9sb2FkX25hbWUnXSA9IFRydWUKKyAgICBwYXNzZWQgPSBsb29rZWRfdXBfYnlfbG9hZF9uYW1lCisKK3NlbGYuYXNzZXJ0VHJ1ZShYLnBhc3NlZCkKKyIiIgorCisgICAgZGVmIHRlc3RMb2NhbHNGdW5jdGlvbihzZWxmKToKKworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGRlZiBnKHkpOgorICAgICAgICAgICAgICAgIGRlZiBoKHopOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4geSArIHoKKyAgICAgICAgICAgICAgICB3ID0geCArIHkKKyAgICAgICAgICAgICAgICB5ICs9IDMKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxzKCkKKyAgICAgICAgICAgIHJldHVybiBnCisKKyAgICAgICAgZCA9IGYoMikoNCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignaCcsIGQpCisgICAgICAgIGRlbCBkWydoJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7J3gnOiAyLCAneSc6IDcsICd3JzogNn0pCisKKyAgICBkZWYgdGVzdExvY2Fsc0NsYXNzKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IGNhbGxpbmcgbG9jYWxzKCkgZG9lcyBub3QgcG9sbHV0ZQorICAgICAgICAjIHRoZSBsb2NhbCBuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIHdpdGggZnJlZSB2YXJpYWJsZXMuICBPbGQKKyAgICAgICAgIyB2ZXJzaW9ucyBvZiBQeXRob24gaGFkIGEgYnVnLCB3aGVyZSBhIGZyZWUgdmFyaWFibGUgYmVpbmcKKyAgICAgICAgIyBwYXNzZWQgdGhyb3VnaCBhIGNsYXNzIG5hbWVzcGFjZSB3b3VsZCBiZSBpbnNlcnRlZCBpbnRvCisgICAgICAgICMgbG9jYWxzKCkgYnkgbG9jYWxzKCkgb3IgZXhlYyBvciBhIHRyYWNlIGZ1bmN0aW9uLgorICAgICAgICAjCisgICAgICAgICMgVGhlIHJlYWwgYnVnIGxpZXMgaW4gZnJhbWUgY29kZSB0aGF0IGNvcGllcyB2YXJpYWJsZXMKKyAgICAgICAgIyBiZXR3ZWVuIGZhc3QgbG9jYWxzIGFuZCB0aGUgbG9jYWxzIGRpY3QsIGUuZy4gd2hlbiBleGVjdXRpbmcKKyAgICAgICAgIyBhIHRyYWNlIGZ1bmN0aW9uLgorCisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgICAgICB4ID0gMTIKKyAgICAgICAgICAgICAgICBkZWYgbShzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgICAgICAgICBsb2NhbHMoKQorICAgICAgICAgICAgcmV0dXJuIEMKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoMSkueCwgMTIpCisKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgICAgIHkgPSB4CisgICAgICAgICAgICAgICAgZGVmIG0oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgICAgICAgICAgeiA9IGxpc3QobG9jYWxzKCkpCisgICAgICAgICAgICByZXR1cm4gQworCisgICAgICAgIHZhcm5hbWVzID0gZigxKS56CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIngiLCB2YXJuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigieSIsIHZhcm5hbWVzKQorCisgICAgZGVmIHRlc3RMb2NhbHNDbGFzc19XaXRoVHJhY2Uoc2VsZik6CisgICAgICAgICMgSXNzdWUyMzcyODogYWZ0ZXIgdGhlIHRyYWNlIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBsb2NhbHMoKQorICAgICAgICAjIGRpY3Rpb25hcnkgaXMgdXNlZCB0byB1cGRhdGUgYWxsIHZhcmlhYmxlcywgdGhpcyB1c2VkIHRvCisgICAgICAgICMgaW5jbHVkZSBmcmVlIHZhcmlhYmxlcy4gQnV0IGluIGNsYXNzIHN0YXRlbWVudHMsIGZyZWUKKyAgICAgICAgIyB2YXJpYWJsZXMgYXJlIG5vdCBpbnNlcnRlZC4uLgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIHN5cy5zZXR0cmFjZShsYW1iZGEgYSxiLGM6Tm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeCA9IDEyCisKKyAgICAgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICAgICAgZGVmIGYoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4CisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgMTIpICMgVXNlZCB0byByYWlzZSBVbmJvdW5kTG9jYWxFcnJvcgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCisKKyAgICBkZWYgdGVzdEJvdW5kQW5kRnJlZShzZWxmKToKKyAgICAgICAgIyB2YXIgaXMgYm91bmQgYW5kIGZyZWUgaW4gY2xhc3MKKworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICAgICAgZGVmIG0oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgICAgICAgICAgYSA9IHgKKyAgICAgICAgICAgIHJldHVybiBDCisKKyAgICAgICAgaW5zdCA9IGYoMykoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3QuYSwgaW5zdC5tKCkpCisKKyAgICBkZWYgdGVzdEludGVyYWN0aW9uV2l0aFRyYWNlRnVuYyhzZWxmKToKKworICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGRlZiB0cmFjZXIoYSxiLGMpOgorICAgICAgICAgICAgcmV0dXJuIHRyYWNlcgorCisgICAgICAgIGRlZiBhZGFwdGdldHRlcihuYW1lLCBrbGFzcywgZ2V0dGVyKToKKyAgICAgICAgICAgIGtpbmQsIGRlcyA9IGdldHRlcgorICAgICAgICAgICAgaWYga2luZCA9PSAxOiAgICAgICAjIEFWIGhhcHBlbnMgd2hlbiBzdGVwcGluZyBmcm9tIHRoaXMgbGluZSB0byBuZXh0CisgICAgICAgICAgICAgICAgaWYgZGVzID09ICIiOgorICAgICAgICAgICAgICAgICAgICBkZXMgPSAiXyVzX18lcyIgJSAoa2xhc3MuX19uYW1lX18sIG5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSBvYmo6IGdldGF0dHIob2JqLCBkZXMpCisKKyAgICAgICAgY2xhc3MgVGVzdENsYXNzOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHN5cy5zZXR0cmFjZSh0cmFjZXIpCisgICAgICAgIGFkYXB0Z2V0dGVyKCJmb28iLCBUZXN0Q2xhc3MsICgxLCAiIikpCisgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLnNldHRyYWNlKQorCisgICAgZGVmIHRlc3RFdmFsRXhlY0ZyZWVWYXJzKHNlbGYpOgorCisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYTogeCArIDEKKworICAgICAgICBnID0gZigzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsIGcuZnVuY19jb2RlKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgZy5mdW5jX2NvZGUgaW4ge30KKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhlYyBzaG91bGQgaGF2ZSBmYWlsZWQsIGJlY2F1c2UgY29kZSBjb250YWluZWQgZnJlZSB2YXJzIikKKworICAgIGRlZiB0ZXN0TGlzdENvbXBMb2NhbFZhcnMoc2VsZik6CisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJpbnQgYmFkCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiYmFkIHNob3VsZCBub3QgYmUgZGVmaW5lZCIKKworICAgICAgICBkZWYgeCgpOgorICAgICAgICAgICAgW2JhZCBmb3IgcyBpbiAnYSBiJyBmb3IgYmFkIGluIHMuc3BsaXQoKV0KKworICAgICAgICB4KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJpbnQgYmFkCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdEV2YWxGcmVlVmFycyhzZWxmKToKKworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGRlZiBnKCk6CisgICAgICAgICAgICAgICAgeAorICAgICAgICAgICAgICAgIGV2YWwoInggKyAxIikKKyAgICAgICAgICAgIHJldHVybiBnCisKKyAgICAgICAgZig0KSgpCisKKyAgICBkZWYgdGVzdEZyZWVpbmdDZWxsKHNlbGYpOgorICAgICAgICAjIFRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gYSBmaW5hbGl6ZXIgYWNjZXNzZXMKKyAgICAgICAgIyB0aGUgY2VsbCB3aGVyZSB0aGUgb2JqZWN0IHdhcyBzdG9yZWQuCisgICAgICAgIGNsYXNzIFNwZWNpYWw6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBuZXN0ZWRjZWxsX2dldCgpCisKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGdsb2JhbCBuZXN0ZWRjZWxsX2dldAorICAgICAgICAgICAgZGVmIG5lc3RlZGNlbGxfZ2V0KCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGMKKworICAgICAgICAgICAgYyA9IChTcGVjaWFsKCksKQorICAgICAgICAgICAgYyA9IDIKKworICAgICAgICBmKCkgIyB1c2VkIHRvIGNyYXNoIHRoZSBpbnRlcnByZXRlci4uLgorCisgICAgZGVmIHRlc3RHbG9iYWxJblBhcmFsbGVsTmVzdGVkRnVuY3Rpb25zKHNlbGYpOgorICAgICAgICAjIEEgc3ltYm9sIHRhYmxlIGJ1ZyBsZWFrZWQgdGhlIGdsb2JhbCBzdGF0ZW1lbnQgZnJvbSBvbmUKKyAgICAgICAgIyBmdW5jdGlvbiB0byBvdGhlciBuZXN0ZWQgZnVuY3Rpb25zIGluIHRoZSBzYW1lIGJsb2NrLgorICAgICAgICAjIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IGEgZ2xvYmFsIHN0YXRlbWVudCBpbiB0aGUgZmlyc3QKKyAgICAgICAgIyBmdW5jdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlY29uZCBmdW5jdGlvbi4KKyAgICAgICAgQ09ERSA9ICIiImRlZiBmKCk6CisgICAgeSA9IDEKKyAgICBkZWYgZygpOgorICAgICAgICBnbG9iYWwgeQorICAgICAgICByZXR1cm4geQorICAgIGRlZiBoKCk6CisgICAgICAgIHJldHVybiB5ICsgMQorICAgIHJldHVybiBnLCBoCisKK3kgPSA5CitnLCBoID0gZigpCityZXN1bHQ5ID0gZygpCityZXN1bHQyID0gaCgpCisiIiIKKyAgICAgICAgbG9jYWxfbnMgPSB7fQorICAgICAgICBnbG9iYWxfbnMgPSB7fQorICAgICAgICBleGVjIENPREUgaW4gbG9jYWxfbnMsIGdsb2JhbF9ucworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGdsb2JhbF9uc1sicmVzdWx0MiJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDksIGdsb2JhbF9uc1sicmVzdWx0OSJdKQorCisgICAgZGVmIHRlc3RUb3BJc05vdFNpZ25pZmljYW50KHNlbGYpOgorICAgICAgICAjIFNlZSAjOTk5Ny4KKyAgICAgICAgZGVmIHRvcChhKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIGIoKToKKyAgICAgICAgICAgIGdsb2JhbCBhCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCJpbXBvcnQgXCogb25seSBhbGxvd2VkIGF0IG1vZHVsZSBsZXZlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZykpOgorICAgICAgICBydW5fdW5pdHRlc3QoU2NvcGVUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NvcGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NvcGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YTNmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zY29wZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NvcGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NvcGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YTNmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zY29wZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NyaXB0cGFja2FnZXMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zY3JpcHRwYWNrYWdlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTAyZmEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NyaXB0cGFja2FnZXMucHkKQEAgLTAsMCArMSw1MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisjIFNraXAgdGhpcyB0ZXN0IGlmIGFldG9vbHMgZG9lcyBub3QgZXhpc3QuCit0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnYWV0b29scycpCisKK2NsYXNzIFRlc3RTY3JpcHRwYWNrYWdlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX3Rlc3Rfc2NyaXB0cGFja2FnZShzZWxmLCBwYWNrYWdlLCB0ZXN0b2JqZWN0PTEpOgorICAgICAgICAjIENoZWNrIHRoYXQgd2UgY2FuIGltcG9ydCB0aGUgcGFja2FnZQorICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKHBhY2thZ2UpCisgICAgICAgICMgVGVzdCB0aGF0IHdlIGNhbiBnZXQgdGhlIG1haW4gZXZlbnQgY2xhc3MKKyAgICAgICAga2xhc3MgPSBnZXRhdHRyKG1vZCwgcGFja2FnZSkKKyAgICAgICAgIyBUZXN0IHRoYXQgd2UgY2FuIGluc3RhbnRpYXRlIHRoYXQgY2xhc3MKKyAgICAgICAgdGFsa2VyID0ga2xhc3MoKQorICAgICAgICBpZiB0ZXN0b2JqZWN0OgorICAgICAgICAgICAgIyBUZXN0IHRoYXQgd2UgY2FuIGdldCBhbiBhcHBsaWNhdGlvbiBvYmplY3QKKyAgICAgICAgICAgIG9iaiA9IG1vZC5hcHBsaWNhdGlvbigwKQorCisgICAgZGVmIHRlc3RfX2J1aWx0aW5TdWl0ZXMoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3Rfc2NyaXB0cGFja2FnZSgnX2J1aWx0aW5TdWl0ZXMnLCB0ZXN0b2JqZWN0PTApCisKKyAgICBkZWYgdGVzdF9TdGRTdWl0ZXMoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3Rfc2NyaXB0cGFja2FnZSgnU3RkU3VpdGVzJykKKworICAgIGRlZiB0ZXN0X1N5c3RlbUV2ZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9zY3JpcHRwYWNrYWdlKCdTeXN0ZW1FdmVudHMnKQorCisgICAgZGVmIHRlc3RfRmluZGVyKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3NjcmlwdHBhY2thZ2UoJ0ZpbmRlcicpCisKKyAgICBkZWYgdGVzdF9UZXJtaW5hbChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9zY3JpcHRwYWNrYWdlKCdUZXJtaW5hbCcpCisKKyAgICBkZWYgdGVzdF9OZXRzY2FwZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9zY3JpcHRwYWNrYWdlKCdOZXRzY2FwZScpCisKKyAgICBkZWYgdGVzdF9FeHBsb3JlcihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9zY3JpcHRwYWNrYWdlKCdFeHBsb3JlcicpCisKKyAgICBkZWYgdGVzdF9Db2RlV2FycmlvcihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9zY3JpcHRwYWNrYWdlKCdDb2RlV2FycmlvcicpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RTY3JpcHRwYWNrYWdlcykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zY3JpcHRwYWNrYWdlcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zY3JpcHRwYWNrYWdlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4MmU2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NjcmlwdHBhY2thZ2VzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zY3JpcHRwYWNrYWdlcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zY3JpcHRwYWNrYWdlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4MmU2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NjcmlwdHBhY2thZ2VzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZWxlY3QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZWxlY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1YmJkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NlbGVjdC5weQpAQCAtMCwwICsxLDY3IEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc2VsZWN0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm1bOjNdIGluICgnd2luJywgJ29zMicsICdyaXNjb3MnKSwKKyAgICAgICAgICAgICAgICAgImNhbid0IGVhc2lseSB0ZXN0IG9uIHRoaXMgc3lzdGVtIikKK2NsYXNzIFNlbGVjdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGNsYXNzIE5vcGU6CisgICAgICAgIHBhc3MKKworICAgIGNsYXNzIEFsbW9zdDoKKyAgICAgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAnZmlsZW5vJworCisgICAgZGVmIHRlc3RfZXJyb3JfY29uZGl0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxlY3Quc2VsZWN0LCAxLCAyLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGVjdC5zZWxlY3QsIFtzZWxmLk5vcGUoKV0sIFtdLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxlY3Quc2VsZWN0LCBbc2VsZi5BbG1vc3QoKV0sIFtdLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxlY3Quc2VsZWN0LCBbXSwgW10sIFtdLCAibm90IGEgbnVtYmVyIikKKworICAgIGRlZiB0ZXN0X3JldHVybmVkX2xpc3RfaWRlbnRpdHkoc2VsZik6CisgICAgICAgICMgU2VlIGlzc3VlICM4MzI5CisgICAgICAgIHIsIHcsIHggPSBzZWxlY3Quc2VsZWN0KFtdLCBbXSwgW10sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QociwgdykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChyLCB4KQorICAgICAgICBzZWxmLmFzc2VydElzTm90KHcsIHgpCisKKyAgICBkZWYgdGVzdF9zZWxlY3Qoc2VsZik6CisgICAgICAgIGNtZCA9ICdmb3IgaSBpbiAwIDEgMiAzIDQgNSA2IDcgOCA5OyBkbyBlY2hvIHRlc3RpbmcuLi47IHNsZWVwIDE7IGRvbmUnCisgICAgICAgIHAgPSBvcy5wb3BlbihjbWQsICdyJykKKyAgICAgICAgZm9yIHRvdXQgaW4gKDAsIDEsIDIsIDQsIDgsIDE2KSArIChOb25lLCkqMTA6CisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAndGltZW91dCA9JywgdG91dAorICAgICAgICAgICAgcmZkLCB3ZmQsIHhmZCA9IHNlbGVjdC5zZWxlY3QoW3BdLCBbXSwgW10sIHRvdXQpCisgICAgICAgICAgICBpZiAocmZkLCB3ZmQsIHhmZCkgPT0gKFtdLCBbXSwgW10pOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiAocmZkLCB3ZmQsIHhmZCkgPT0gKFtwXSwgW10sIFtdKToKKyAgICAgICAgICAgICAgICBsaW5lID0gcC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50IHJlcHIobGluZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnRU9GJworICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmZhaWwoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlcyBmcm9tIHNlbGVjdCgpOicsIHJmZCwgd2ZkLCB4ZmQpCisgICAgICAgIHAuY2xvc2UoKQorCisgICAgIyBJc3N1ZSAxNjIzMDogQ3Jhc2ggb24gc2VsZWN0IHJlc2l6ZWQgbGlzdAorICAgIGRlZiB0ZXN0X3NlbGVjdF9tdXRhdGVkKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgY2xhc3MgRjoKKyAgICAgICAgICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgICAgICAgICAgZGVsIGFbLTFdCisgICAgICAgICAgICAgICAgcmV0dXJuIHN5cy5fX3N0ZG91dF9fLmZpbGVubygpCisgICAgICAgIGFbOl0gPSBbRigpXSAqIDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZWN0LnNlbGVjdChbXSwgYSwgW10pLCAoW10sIGFbOjVdLCBbXSkpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFNlbGVjdFRlc3RDYXNlKQorICAgIHRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2VsZWN0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NlbGVjdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc0OGIxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NlbGVjdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2VsZWN0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NlbGVjdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc0OGIxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NlbGVjdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYjI2ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXQucHkKQEAgLTAsMCArMSwxODMyIEBACisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBnYworaW1wb3J0IHdlYWtyZWYKK2ltcG9ydCBvcGVyYXRvcgoraW1wb3J0IGNvcHkKK2ltcG9ydCBwaWNrbGUKK2Zyb20gcmFuZG9tIGltcG9ydCByYW5kcmFuZ2UsIHNodWZmbGUKK2ltcG9ydCBzeXMKK2ltcG9ydCBjb2xsZWN0aW9ucworCitjbGFzcyBQYXNzVGhydShFeGNlcHRpb24pOgorICAgIHBhc3MKKworZGVmIGNoZWNrX3Bhc3NfdGhydSgpOgorICAgIHJhaXNlIFBhc3NUaHJ1CisgICAgeWllbGQgMQorCitjbGFzcyBCYWRDbXA6CisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gMQorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisKK2NsYXNzIFJlcHJXcmFwcGVyOgorICAgICdVc2VkIHRvIHRlc3Qgc2VsZi1yZWZlcmVudGlhbCByZXByKCkgY2FsbHMnCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gcmVwcihzZWxmLnZhbHVlKQorCitjbGFzcyBIYXNoQ291bnRpbmdJbnQoaW50KToKKyAgICAnaW50LWxpa2Ugb2JqZWN0IHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgdGltZXMgX19oYXNoX18gaXMgY2FsbGVkJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuaGFzaF9jb3VudCA9IDAKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHNlbGYuaGFzaF9jb3VudCArPSAxCisgICAgICAgIHJldHVybiBpbnQuX19oYXNoX18oc2VsZikKKworY2xhc3MgVGVzdEpvaW50T3BzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRlc3RzIGNvbW1vbiB0byBib3RoIHNldCBhbmQgZnJvemVuc2V0CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYud29yZCA9IHdvcmQgPSAnc2ltc2FsYWJpbScKKyAgICAgICAgc2VsZi5vdGhlcndvcmQgPSAnbWFkYWdhc2NhcicKKyAgICAgICAgc2VsZi5sZXR0ZXJzID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCisgICAgICAgIHNlbGYucyA9IHNlbGYudGhldHlwZSh3b3JkKQorICAgICAgICBzZWxmLmQgPSBkaWN0LmZyb21rZXlzKHdvcmQpCisKKyAgICBkZWYgdGVzdF9uZXdfb3JfaW5pdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnRoZXR5cGUsIFtdLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldCgpLl9faW5pdF9fLCBhPTEpCisKKyAgICBkZWYgdGVzdF91bmlxdWlmaWNhdGlvbihzZWxmKToKKyAgICAgICAgYWN0dWFsID0gc29ydGVkKHNlbGYucykKKyAgICAgICAgZXhwZWN0ZWQgPSBzb3J0ZWQoc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFBhc3NUaHJ1LCBzZWxmLnRoZXR5cGUsIGNoZWNrX3Bhc3NfdGhydSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudGhldHlwZSwgW1tdXSkKKworICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zKSwgbGVuKHNlbGYuZCkpCisKKyAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5sZXR0ZXJzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjIGluIHNlbGYucywgYyBpbiBzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLl9fY29udGFpbnNfXywgW1tdXSkKKyAgICAgICAgcyA9IHNlbGYudGhldHlwZShbZnJvemVuc2V0KHNlbGYubGV0dGVycyldKQorICAgICAgICBzZWxmLmFzc2VydEluKHNlbGYudGhldHlwZShzZWxmLmxldHRlcnMpLCBzKQorCisgICAgZGVmIHRlc3RfdW5pb24oc2VsZik6CisgICAgICAgIHUgPSBzZWxmLnMudW5pb24oc2VsZi5vdGhlcndvcmQpCisgICAgICAgIGZvciBjIGluIHNlbGYubGV0dGVyczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYyBpbiB1LCBjIGluIHNlbGYuZCBvciBjIGluIHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucywgc2VsZi50aGV0eXBlKHNlbGYud29yZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh1KSwgc2VsZi50aGV0eXBlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQYXNzVGhydSwgc2VsZi5zLnVuaW9uLCBjaGVja19wYXNzX3RocnUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMudW5pb24sIFtbXV0pCisgICAgICAgIGZvciBDIGluIHNldCwgZnJvemVuc2V0LCBkaWN0LmZyb21rZXlzLCBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykudW5pb24oQygnY2RjJykpLCBzZXQoJ2FiY2QnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLnVuaW9uKEMoJ2VmZ2ZlJykpLCBzZXQoJ2FiY2VmZycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykudW5pb24oQygnY2NiJykpLCBzZXQoJ2FiYycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykudW5pb24oQygnZWYnKSksIHNldCgnYWJjZWYnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLnVuaW9uKEMoJ2VmJyksIEMoJ2ZnJykpLCBzZXQoJ2FiY2VmZycpKQorCisgICAgICAgICMgSXNzdWUgIzY1NzMKKyAgICAgICAgeCA9IHNlbGYudGhldHlwZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC51bmlvbihzZXQoWzFdKSwgeCwgc2V0KFsyXSkpLCBzZWxmLnRoZXR5cGUoWzEsIDJdKSkKKworICAgIGRlZiB0ZXN0X29yKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5zLnVuaW9uKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyB8IHNldChzZWxmLm90aGVyd29yZCksIGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zIHwgZnJvemVuc2V0KHNlbGYub3RoZXJ3b3JkKSwgaSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zIHwgc2VsZi5vdGhlcndvcmQKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic3x0IGRpZCBub3Qgc2NyZWVuLW91dCBnZW5lcmFsIGl0ZXJhYmxlcyIpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb24oc2VsZik6CisgICAgICAgIGkgPSBzZWxmLnMuaW50ZXJzZWN0aW9uKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmxldHRlcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMgaW4gaSwgYyBpbiBzZWxmLmQgYW5kIGMgaW4gc2VsZi5vdGhlcndvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLCBzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGkpLCBzZWxmLnRoZXR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFBhc3NUaHJ1LCBzZWxmLnMuaW50ZXJzZWN0aW9uLCBjaGVja19wYXNzX3RocnUoKSkKKyAgICAgICAgZm9yIEMgaW4gc2V0LCBmcm96ZW5zZXQsIGRpY3QuZnJvbWtleXMsIHN0ciwgdW5pY29kZSwgbGlzdCwgdHVwbGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS5pbnRlcnNlY3Rpb24oQygnY2RjJykpLCBzZXQoJ2NjJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS5pbnRlcnNlY3Rpb24oQygnZWZnZmUnKSksIHNldCgnJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS5pbnRlcnNlY3Rpb24oQygnY2NiJykpLCBzZXQoJ2JjJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS5pbnRlcnNlY3Rpb24oQygnZWYnKSksIHNldCgnJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS5pbnRlcnNlY3Rpb24oQygnY2JjZicpLCBDKCdiYWcnKSksIHNldCgnYicpKQorICAgICAgICBzID0gc2VsZi50aGV0eXBlKCdhYmNiYScpCisgICAgICAgIHogPSBzLmludGVyc2VjdGlvbigpCisgICAgICAgIGlmIHNlbGYudGhldHlwZSA9PSBmcm96ZW5zZXQoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQocyksIGlkKHopKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChzKSwgaWQoeikpCisKKyAgICBkZWYgdGVzdF9pc2Rpc2pvaW50KHNlbGYpOgorICAgICAgICBkZWYgZihzMSwgczIpOgorICAgICAgICAgICAgJ1B1cmUgcHl0aG9uIGVxdWl2YWxlbnQgb2YgaXNkaXNqb2ludCgpJworICAgICAgICAgICAgcmV0dXJuIG5vdCBzZXQoczEpLmludGVyc2VjdGlvbihzMikKKyAgICAgICAgZm9yIGxhcmcgaW4gJycsICdhJywgJ2FiJywgJ2FiYycsICdhYmFiYWMnLCAnY2RjJywgJ2NjJywgJ2VmZ2ZlJywgJ2NjYicsICdlZic6CisgICAgICAgICAgICBzMSA9IHNlbGYudGhldHlwZShsYXJnKQorICAgICAgICAgICAgZm9yIHJhcmcgaW4gJycsICdhJywgJ2FiJywgJ2FiYycsICdhYmFiYWMnLCAnY2RjJywgJ2NjJywgJ2VmZ2ZlJywgJ2NjYicsICdlZic6CisgICAgICAgICAgICAgICAgZm9yIEMgaW4gc2V0LCBmcm96ZW5zZXQsIGRpY3QuZnJvbWtleXMsIHN0ciwgdW5pY29kZSwgbGlzdCwgdHVwbGU6CisgICAgICAgICAgICAgICAgICAgIHMyID0gQyhyYXJnKQorICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSBzMS5pc2Rpc2pvaW50KHMyKQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGYoczEsIHMyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhY3R1YWwgaXMgVHJ1ZSBvciBhY3R1YWwgaXMgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9hbmQoc2VsZik6CisgICAgICAgIGkgPSBzZWxmLnMuaW50ZXJzZWN0aW9uKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyAmIHNldChzZWxmLm90aGVyd29yZCksIGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zICYgZnJvemVuc2V0KHNlbGYub3RoZXJ3b3JkKSwgaSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zICYgc2VsZi5vdGhlcndvcmQKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicyZ0IGRpZCBub3Qgc2NyZWVuLW91dCBnZW5lcmFsIGl0ZXJhYmxlcyIpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5zLmRpZmZlcmVuY2Uoc2VsZi5vdGhlcndvcmQpCisgICAgICAgIGZvciBjIGluIHNlbGYubGV0dGVyczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYyBpbiBpLCBjIGluIHNlbGYuZCBhbmQgYyBub3QgaW4gc2VsZi5vdGhlcndvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLCBzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGkpLCBzZWxmLnRoZXR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFBhc3NUaHJ1LCBzZWxmLnMuZGlmZmVyZW5jZSwgY2hlY2tfcGFzc190aHJ1KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLmRpZmZlcmVuY2UsIFtbXV0pCisgICAgICAgIGZvciBDIGluIHNldCwgZnJvemVuc2V0LCBkaWN0LmZyb21rZXlzLCBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykuZGlmZmVyZW5jZShDKCdjZGMnKSksIHNldCgnYWInKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLmRpZmZlcmVuY2UoQygnZWZnZmUnKSksIHNldCgnYWJjJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS5kaWZmZXJlbmNlKEMoJ2NjYicpKSwgc2V0KCdhJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS5kaWZmZXJlbmNlKEMoJ2VmJykpLCBzZXQoJ2FiYycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykuZGlmZmVyZW5jZSgpLCBzZXQoJ2FiYycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykuZGlmZmVyZW5jZShDKCdhJyksIEMoJ2InKSksIHNldCgnYycpKQorCisgICAgZGVmIHRlc3Rfc3ViKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5zLmRpZmZlcmVuY2Uoc2VsZi5vdGhlcndvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zIC0gc2V0KHNlbGYub3RoZXJ3b3JkKSwgaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMgLSBmcm96ZW5zZXQoc2VsZi5vdGhlcndvcmQpLCBpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnMgLSBzZWxmLm90aGVyd29yZAorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzLXQgZGlkIG5vdCBzY3JlZW4tb3V0IGdlbmVyYWwgaXRlcmFibGVzIikKKworICAgIGRlZiB0ZXN0X3N5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmxldHRlcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMgaW4gaSwgKGMgaW4gc2VsZi5kKSBeIChjIGluIHNlbGYub3RoZXJ3b3JkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMsIHNlbGYudGhldHlwZShzZWxmLndvcmQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoaSksIHNlbGYudGhldHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUGFzc1RocnUsIHNlbGYucy5zeW1tZXRyaWNfZGlmZmVyZW5jZSwgY2hlY2tfcGFzc190aHJ1KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlLCBbW11dKQorICAgICAgICBmb3IgQyBpbiBzZXQsIGZyb3plbnNldCwgZGljdC5mcm9ta2V5cywgc3RyLCB1bmljb2RlLCBsaXN0LCB0dXBsZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLnN5bW1ldHJpY19kaWZmZXJlbmNlKEMoJ2NkYycpKSwgc2V0KCdhYmQnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLnN5bW1ldHJpY19kaWZmZXJlbmNlKEMoJ2VmZ2ZlJykpLCBzZXQoJ2FiY2VmZycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykuc3ltbWV0cmljX2RpZmZlcmVuY2UoQygnY2NiJykpLCBzZXQoJ2EnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLnN5bW1ldHJpY19kaWZmZXJlbmNlKEMoJ2VmJykpLCBzZXQoJ2FiY2VmJykpCisKKyAgICBkZWYgdGVzdF94b3Ioc2VsZik6CisgICAgICAgIGkgPSBzZWxmLnMuc3ltbWV0cmljX2RpZmZlcmVuY2Uoc2VsZi5vdGhlcndvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zIF4gc2V0KHNlbGYub3RoZXJ3b3JkKSwgaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMgXiBmcm96ZW5zZXQoc2VsZi5vdGhlcndvcmQpLCBpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnMgXiBzZWxmLm90aGVyd29yZAorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzXnQgZGlkIG5vdCBzY3JlZW4tb3V0IGdlbmVyYWwgaXRlcmFibGVzIikKKworICAgIGRlZiB0ZXN0X2VxdWFsaXR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucywgc2V0KHNlbGYud29yZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLCBmcm96ZW5zZXQoc2VsZi53b3JkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMgPT0gc2VsZi53b3JkLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLnMsIHNldChzZWxmLm90aGVyd29yZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5zLCBmcm96ZW5zZXQoc2VsZi5vdGhlcndvcmQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyAhPSBzZWxmLndvcmQsIFRydWUpCisKKyAgICBkZWYgdGVzdF9zZXRPZkZyb3plbnNldHMoc2VsZik6CisgICAgICAgIHQgPSBtYXAoZnJvemVuc2V0LCBbJ2FiY2RlZicsICdiY2QnLCAnYmRjYicsICdmZWQnLCAnZmVkY2NiYSddKQorICAgICAgICBzID0gc2VsZi50aGV0eXBlKHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCAzKQorCisgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuX19jbXBfXywgc2VsZi5zKQorCisgICAgZGVmIHRlc3Rfc3ViX2FuZF9zdXBlcihzZWxmKToKKyAgICAgICAgcCwgcSwgciA9IG1hcChzZWxmLnRoZXR5cGUsIFsnYWInLCAnYWJjZGUnLCAnZGVmJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwIDwgcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAgPD0gcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEgPD0gcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEgPiBwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocSA+PSBwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHEgPCByKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHEgPD0gcikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxID4gcikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxID49IHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoJ2EnKS5pc3N1YnNldCgnYWJjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoJ2FiYycpLmlzc3VwZXJzZXQoJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZXQoJ2EnKS5pc3N1YnNldCgnY2JzJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2V0KCdjYnMnKS5pc3N1cGVyc2V0KCdhJykpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgIHAgPSBwaWNrbGUuZHVtcHMoc2VsZi5zLCBpKQorICAgICAgICAgICAgZHVwID0gcGlja2xlLmxvYWRzKHApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucywgZHVwLCAiJXMgIT0gJXMiICUgKHNlbGYucywgZHVwKSkKKyAgICAgICAgICAgIGlmIHR5cGUoc2VsZi5zKSBub3QgaW4gKHNldCwgZnJvemVuc2V0KToKKyAgICAgICAgICAgICAgICBzZWxmLnMueCA9IDEwCisgICAgICAgICAgICAgICAgcCA9IHBpY2tsZS5kdW1wcyhzZWxmLnMpCisgICAgICAgICAgICAgICAgZHVwID0gcGlja2xlLmxvYWRzKHApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMueCwgZHVwLngpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weShzZWxmKToKKyAgICAgICAgY2xhc3MgVHJhY2VyOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQorICAgICAgICAgICAgZGVmIF9fZGVlcGNvcHlfXyhzZWxmLCBtZW1vPU5vbmUpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZXIoc2VsZi52YWx1ZSArIDEpCisgICAgICAgIHQgPSBUcmFjZXIoMTApCisgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoW3RdKQorICAgICAgICBkdXAgPSBjb3B5LmRlZXBjb3B5KHMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQocyksIGlkKGR1cCkpCisgICAgICAgIGZvciBlbGVtIGluIGR1cDoKKyAgICAgICAgICAgIG5ld3QgPSBlbGVtCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQodCksIGlkKG5ld3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudmFsdWUgKyAxLCBuZXd0LnZhbHVlKQorCisgICAgZGVmIHRlc3RfZ2Moc2VsZik6CisgICAgICAgICMgQ3JlYXRlIGEgbmVzdCBvZiBjeWNsZXMgdG8gZXhlcmNpc2Ugb3ZlcmFsbCByZWYgY291bnQgY2hlY2sKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcyA9IHNldChBKCkgZm9yIGkgaW4geHJhbmdlKDEwMDApKQorICAgICAgICBmb3IgZWxlbSBpbiBzOgorICAgICAgICAgICAgZWxlbS5jeWNsZSA9IHMKKyAgICAgICAgICAgIGVsZW0uc3ViID0gZWxlbQorICAgICAgICAgICAgZWxlbS5zZXQgPSBzZXQoW2VsZW1dKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3Nfd2l0aF9jdXN0b21faGFzaChzZWxmKToKKyAgICAgICAgIyBCdWcgIzEyNTc3MzEKKyAgICAgICAgY2xhc3MgSChzZWxmLnRoZXR5cGUpOgorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQoaWQoc2VsZikgJiAweDdmZmZmZmZmKQorICAgICAgICBzPUgoKQorICAgICAgICBmPXNldCgpCisgICAgICAgIGYuYWRkKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocywgZikKKyAgICAgICAgZi5yZW1vdmUocykKKyAgICAgICAgZi5hZGQocykKKyAgICAgICAgZi5kaXNjYXJkKHMpCisKKyAgICBkZWYgdGVzdF9iYWRjbXAoc2VsZik6CisgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoW0JhZENtcCgpXSkKKyAgICAgICAgIyBEZXRlY3QgY29tcGFyaXNvbiBlcnJvcnMgZHVyaW5nIGluc2VydGlvbiBhbmQgbG9va3VwCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2VsZi50aGV0eXBlLCBbQmFkQ21wKCksIEJhZENtcCgpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzLl9fY29udGFpbnNfXywgQmFkQ21wKCkpCisgICAgICAgICMgRGV0ZWN0IGVycm9ycyBkdXJpbmcgbXV0YXRpbmcgb3BlcmF0aW9ucworICAgICAgICBpZiBoYXNhdHRyKHMsICdhZGQnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgcy5hZGQsIEJhZENtcCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzLmRpc2NhcmQsIEJhZENtcCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzLnJlbW92ZSwgQmFkQ21wKCkpCisKKyAgICBkZWYgdGVzdF9jeWNsaWNhbF9yZXByKHNlbGYpOgorICAgICAgICB3ID0gUmVwcldyYXBwZXIoKQorICAgICAgICBzID0gc2VsZi50aGV0eXBlKFt3XSkKKyAgICAgICAgdy52YWx1ZSA9IHMKKyAgICAgICAgbmFtZSA9IHJlcHIocykucGFydGl0aW9uKCcoJylbMF0gICAgIyBzdHJpcCBjbGFzcyBuYW1lIGZyb20gcmVwciBzdHJpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHMpLCAnJXMoWyVzKC4uLildKScgJSAobmFtZSwgbmFtZSkpCisKKyAgICBkZWYgdGVzdF9jeWNsaWNhbF9wcmludChzZWxmKToKKyAgICAgICAgdyA9IFJlcHJXcmFwcGVyKCkKKyAgICAgICAgcyA9IHNlbGYudGhldHlwZShbd10pCisgICAgICAgIHcudmFsdWUgPSBzCisgICAgICAgIGZvID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmludCA+PiBmbywgcywKKyAgICAgICAgICAgIGZvLmNsb3NlKCkKKyAgICAgICAgICAgIGZvID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby5yZWFkKCksIHJlcHIocykpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmby5jbG9zZSgpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9kb19ub3RfcmVoYXNoX2RpY3Rfa2V5cyhzZWxmKToKKyAgICAgICAgbiA9IDEwCisgICAgICAgIGQgPSBkaWN0LmZyb21rZXlzKG1hcChIYXNoQ291bnRpbmdJbnQsIHhyYW5nZShuKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKGVsZW0uaGFzaF9jb3VudCBmb3IgZWxlbSBpbiBkKSwgbikKKyAgICAgICAgcyA9IHNlbGYudGhldHlwZShkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShlbGVtLmhhc2hfY291bnQgZm9yIGVsZW0gaW4gZCksIG4pCisgICAgICAgIHMuZGlmZmVyZW5jZShkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShlbGVtLmhhc2hfY291bnQgZm9yIGVsZW0gaW4gZCksIG4pCisgICAgICAgIGlmIGhhc2F0dHIocywgJ3N5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZScpOgorICAgICAgICAgICAgcy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oZWxlbS5oYXNoX2NvdW50IGZvciBlbGVtIGluIGQpLCBuKQorICAgICAgICBkMiA9IGRpY3QuZnJvbWtleXMoc2V0KGQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShlbGVtLmhhc2hfY291bnQgZm9yIGVsZW0gaW4gZCksIG4pCisgICAgICAgIGQzID0gZGljdC5mcm9ta2V5cyhmcm96ZW5zZXQoZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKGVsZW0uaGFzaF9jb3VudCBmb3IgZWxlbSBpbiBkKSwgbikKKyAgICAgICAgZDMgPSBkaWN0LmZyb21rZXlzKGZyb3plbnNldChkKSwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShlbGVtLmhhc2hfY291bnQgZm9yIGVsZW0gaW4gZCksIG4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDMsIGRpY3QuZnJvbWtleXMoZCwgMTIzKSkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5lcl9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgIyBCdWcgIzM2ODA6IHRwX3RyYXZlcnNlIHdhcyBub3QgaW1wbGVtZW50ZWQgZm9yIHNldCBpdGVyYXRvciBvYmplY3QKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBvYmogPSBDKCkKKyAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYob2JqKQorICAgICAgICBjb250YWluZXIgPSBzZXQoW29iaiwgMV0pCisgICAgICAgIG9iai54ID0gaXRlcihjb250YWluZXIpCisgICAgICAgIGRlbCBvYmosIGNvbnRhaW5lcgorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZigpIGlzIE5vbmUsICJDeWNsZSB3YXMgbm90IGNvbGxlY3RlZCIpCisKK2NsYXNzIFRlc3RTZXQoVGVzdEpvaW50T3BzKToKKyAgICB0aGV0eXBlID0gc2V0CisKKyAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgICAgICBzID0gc2VsZi50aGV0eXBlKCkKKyAgICAgICAgcy5fX2luaXRfXyhzZWxmLndvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgc2V0KHNlbGYud29yZCkpCisgICAgICAgIHMuX19pbml0X18oc2VsZi5vdGhlcndvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgc2V0KHNlbGYub3RoZXJ3b3JkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzLl9faW5pdF9fLCBzLCAyKTsKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzLl9faW5pdF9fLCAxKTsKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yX2lkZW50aXR5KHNlbGYpOgorICAgICAgICBzID0gc2VsZi50aGV0eXBlKHJhbmdlKDMpKQorICAgICAgICB0ID0gc2VsZi50aGV0eXBlKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQocyksIGlkKHQpKQorCisgICAgZGVmIHRlc3RfaGFzaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBzZWxmLnMpCisKKyAgICBkZWYgdGVzdF9jbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi5zLmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMsIHNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnMpLCAwKQorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgZHVwID0gc2VsZi5zLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucywgZHVwKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKHNlbGYucyksIGlkKGR1cCkpCisKKyAgICBkZWYgdGVzdF9hZGQoc2VsZik6CisgICAgICAgIHNlbGYucy5hZGQoJ1EnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdRJywgc2VsZi5zKQorICAgICAgICBkdXAgPSBzZWxmLnMuY29weSgpCisgICAgICAgIHNlbGYucy5hZGQoJ1EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucywgZHVwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5hZGQsIFtdKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgorICAgICAgICBzZWxmLnMucmVtb3ZlKCdhJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignYScsIHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHNlbGYucy5yZW1vdmUsICdRJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMucmVtb3ZlLCBbXSkKKyAgICAgICAgcyA9IHNlbGYudGhldHlwZShbZnJvemVuc2V0KHNlbGYud29yZCldKQorICAgICAgICBzZWxmLmFzc2VydEluKHNlbGYudGhldHlwZShzZWxmLndvcmQpLCBzKQorICAgICAgICBzLnJlbW92ZShzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHNlbGYucy5yZW1vdmUsIHNlbGYudGhldHlwZShzZWxmLndvcmQpKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlX2tleWVycm9yX3VucGFja2luZyhzZWxmKToKKyAgICAgICAgIyBidWc6ICB3d3cucHl0aG9uLm9yZy9zZi8xNTc2NjU3CisgICAgICAgIGZvciB2MSBpbiBbJ1EnLCAoMSwpXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnMucmVtb3ZlKHYxKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yLCBlOgorICAgICAgICAgICAgICAgIHYyID0gZS5hcmdzWzBdCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2MSwgdjIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgpCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfa2V5ZXJyb3Jfc2V0KHNlbGYpOgorICAgICAgICBrZXkgPSBzZWxmLnRoZXR5cGUoWzMsIDRdKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnMucmVtb3ZlKGtleSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yIGFzIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZS5hcmdzWzBdIGlzIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiS2V5RXJyb3Igc2hvdWxkIGJlIHswfSwgbm90IHsxfSIuZm9ybWF0KGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYXJnc1swXSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoKQorCisgICAgZGVmIHRlc3RfZGlzY2FyZChzZWxmKToKKyAgICAgICAgc2VsZi5zLmRpc2NhcmQoJ2EnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdhJywgc2VsZi5zKQorICAgICAgICBzZWxmLnMuZGlzY2FyZCgnUScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLmRpc2NhcmQsIFtdKQorICAgICAgICBzID0gc2VsZi50aGV0eXBlKFtmcm96ZW5zZXQoc2VsZi53b3JkKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oc2VsZi50aGV0eXBlKHNlbGYud29yZCksIHMpCisgICAgICAgIHMuZGlzY2FyZChzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSwgcykKKyAgICAgICAgcy5kaXNjYXJkKHNlbGYudGhldHlwZShzZWxmLndvcmQpKQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKHNlbGYucykpOgorICAgICAgICAgICAgZWxlbSA9IHNlbGYucy5wb3AoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihlbGVtLCBzZWxmLnMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBzZWxmLnMucG9wKQorCisgICAgZGVmIHRlc3RfdXBkYXRlKHNlbGYpOgorICAgICAgICByZXR2YWwgPSBzZWxmLnMudXBkYXRlKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldHZhbCwgTm9uZSkKKyAgICAgICAgZm9yIGMgaW4gKHNlbGYud29yZCArIHNlbGYub3RoZXJ3b3JkKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQYXNzVGhydSwgc2VsZi5zLnVwZGF0ZSwgY2hlY2tfcGFzc190aHJ1KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnVwZGF0ZSwgW1tdXSkKKyAgICAgICAgZm9yIHAsIHEgaW4gKCgnY2RjJywgJ2FiY2QnKSwgKCdlZmdmZScsICdhYmNlZmcnKSwgKCdjY2InLCAnYWJjJyksICgnZWYnLCAnYWJjZWYnKSk6CisgICAgICAgICAgICBmb3IgQyBpbiBzZXQsIGZyb3plbnNldCwgZGljdC5mcm9ta2V5cywgc3RyLCB1bmljb2RlLCBsaXN0LCB0dXBsZToKKyAgICAgICAgICAgICAgICBzID0gc2VsZi50aGV0eXBlKCdhYmNiYScpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnVwZGF0ZShDKHApKSwgTm9uZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHNldChxKSkKKyAgICAgICAgZm9yIHAgaW4gKCdjZGMnLCAnZWZnZmUnLCAnY2NiJywgJ2VmJywgJ2FiY2RhJyk6CisgICAgICAgICAgICBxID0gJ2FoaScKKyAgICAgICAgICAgIGZvciBDIGluIHNldCwgZnJvemVuc2V0LCBkaWN0LmZyb21rZXlzLCBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlOgorICAgICAgICAgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoJ2FiY2JhJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudXBkYXRlKEMocCksIEMocSkpLCBOb25lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgc2V0KHMpIHwgc2V0KHApIHwgc2V0KHEpKQorCisgICAgZGVmIHRlc3RfaW9yKHNlbGYpOgorICAgICAgICBzZWxmLnMgfD0gc2V0KHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi53b3JkICsgc2VsZi5vdGhlcndvcmQpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihjLCBzZWxmLnMpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fdXBkYXRlKHNlbGYpOgorICAgICAgICByZXR2YWwgPSBzZWxmLnMuaW50ZXJzZWN0aW9uX3VwZGF0ZShzZWxmLm90aGVyd29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXR2YWwsIE5vbmUpCisgICAgICAgIGZvciBjIGluIChzZWxmLndvcmQgKyBzZWxmLm90aGVyd29yZCk6CisgICAgICAgICAgICBpZiBjIGluIHNlbGYub3RoZXJ3b3JkIGFuZCBjIGluIHNlbGYud29yZDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGMsIHNlbGYucykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihjLCBzZWxmLnMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFBhc3NUaHJ1LCBzZWxmLnMuaW50ZXJzZWN0aW9uX3VwZGF0ZSwgY2hlY2tfcGFzc190aHJ1KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLmludGVyc2VjdGlvbl91cGRhdGUsIFtbXV0pCisgICAgICAgIGZvciBwLCBxIGluICgoJ2NkYycsICdjJyksICgnZWZnZmUnLCAnJyksICgnY2NiJywgJ2JjJyksICgnZWYnLCAnJykpOgorICAgICAgICAgICAgZm9yIEMgaW4gc2V0LCBmcm96ZW5zZXQsIGRpY3QuZnJvbWtleXMsIHN0ciwgdW5pY29kZSwgbGlzdCwgdHVwbGU6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYudGhldHlwZSgnYWJjYmEnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5pbnRlcnNlY3Rpb25fdXBkYXRlKEMocCkpLCBOb25lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgc2V0KHEpKQorICAgICAgICAgICAgICAgIHNzID0gJ2FiY2JhJworICAgICAgICAgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoc3MpCisgICAgICAgICAgICAgICAgdCA9ICdjYmMnCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmludGVyc2VjdGlvbl91cGRhdGUoQyhwKSwgQyh0KSksIE5vbmUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBzZXQoJ2FiY2JhJykmc2V0KHApJnNldCh0KSkKKworICAgIGRlZiB0ZXN0X2lhbmQoc2VsZik6CisgICAgICAgIHNlbGYucyAmPSBzZXQoc2VsZi5vdGhlcndvcmQpCisgICAgICAgIGZvciBjIGluIChzZWxmLndvcmQgKyBzZWxmLm90aGVyd29yZCk6CisgICAgICAgICAgICBpZiBjIGluIHNlbGYub3RoZXJ3b3JkIGFuZCBjIGluIHNlbGYud29yZDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGMsIHNlbGYucykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihjLCBzZWxmLnMpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX3VwZGF0ZShzZWxmKToKKyAgICAgICAgcmV0dmFsID0gc2VsZi5zLmRpZmZlcmVuY2VfdXBkYXRlKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldHZhbCwgTm9uZSkKKyAgICAgICAgZm9yIGMgaW4gKHNlbGYud29yZCArIHNlbGYub3RoZXJ3b3JkKToKKyAgICAgICAgICAgIGlmIGMgaW4gc2VsZi53b3JkIGFuZCBjIG5vdCBpbiBzZWxmLm90aGVyd29yZDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGMsIHNlbGYucykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihjLCBzZWxmLnMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFBhc3NUaHJ1LCBzZWxmLnMuZGlmZmVyZW5jZV91cGRhdGUsIGNoZWNrX3Bhc3NfdGhydSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5kaWZmZXJlbmNlX3VwZGF0ZSwgW1tdXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlLCBbW11dKQorICAgICAgICBmb3IgcCwgcSBpbiAoKCdjZGMnLCAnYWInKSwgKCdlZmdmZScsICdhYmMnKSwgKCdjY2InLCAnYScpLCAoJ2VmJywgJ2FiYycpKToKKyAgICAgICAgICAgIGZvciBDIGluIHNldCwgZnJvemVuc2V0LCBkaWN0LmZyb21rZXlzLCBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlOgorICAgICAgICAgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoJ2FiY2JhJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZGlmZmVyZW5jZV91cGRhdGUoQyhwKSksIE5vbmUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBzZXQocSkpCisKKyAgICAgICAgICAgICAgICBzID0gc2VsZi50aGV0eXBlKCdhYmNkZWZnaGloJykKKyAgICAgICAgICAgICAgICBzLmRpZmZlcmVuY2VfdXBkYXRlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHNlbGYudGhldHlwZSgnYWJjZGVmZ2hpaCcpKQorCisgICAgICAgICAgICAgICAgcyA9IHNlbGYudGhldHlwZSgnYWJjZGVmZ2hpaCcpCisgICAgICAgICAgICAgICAgcy5kaWZmZXJlbmNlX3VwZGF0ZShDKCdhYmEnKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHNlbGYudGhldHlwZSgnY2RlZmdoaWgnKSkKKworICAgICAgICAgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoJ2FiY2RlZmdoaWgnKQorICAgICAgICAgICAgICAgIHMuZGlmZmVyZW5jZV91cGRhdGUoQygnY2RjJyksIEMoJ2FiYScpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgc2VsZi50aGV0eXBlKCdlZmdoaWgnKSkKKworICAgIGRlZiB0ZXN0X2lzdWIoc2VsZik6CisgICAgICAgIHNlbGYucyAtPSBzZXQoc2VsZi5vdGhlcndvcmQpCisgICAgICAgIGZvciBjIGluIChzZWxmLndvcmQgKyBzZWxmLm90aGVyd29yZCk6CisgICAgICAgICAgICBpZiBjIGluIHNlbGYud29yZCBhbmQgYyBub3QgaW4gc2VsZi5vdGhlcndvcmQ6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihjLCBzZWxmLnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYywgc2VsZi5zKQorCisgICAgZGVmIHRlc3Rfc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHNlbGYpOgorICAgICAgICByZXR2YWwgPSBzZWxmLnMuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldHZhbCwgTm9uZSkKKyAgICAgICAgZm9yIGMgaW4gKHNlbGYud29yZCArIHNlbGYub3RoZXJ3b3JkKToKKyAgICAgICAgICAgIGlmIChjIGluIHNlbGYud29yZCkgXiAoYyBpbiBzZWxmLm90aGVyd29yZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihjLCBzZWxmLnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYywgc2VsZi5zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQYXNzVGhydSwgc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSwgY2hlY2tfcGFzc190aHJ1KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSwgW1tdXSkKKyAgICAgICAgZm9yIHAsIHEgaW4gKCgnY2RjJywgJ2FiZCcpLCAoJ2VmZ2ZlJywgJ2FiY2VmZycpLCAoJ2NjYicsICdhJyksICgnZWYnLCAnYWJjZWYnKSk6CisgICAgICAgICAgICBmb3IgQyBpbiBzZXQsIGZyb3plbnNldCwgZGljdC5mcm9ta2V5cywgc3RyLCB1bmljb2RlLCBsaXN0LCB0dXBsZToKKyAgICAgICAgICAgICAgICBzID0gc2VsZi50aGV0eXBlKCdhYmNiYScpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShDKHApKSwgTm9uZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHNldChxKSkKKworICAgIGRlZiB0ZXN0X2l4b3Ioc2VsZik6CisgICAgICAgIHNlbGYucyBePSBzZXQoc2VsZi5vdGhlcndvcmQpCisgICAgICAgIGZvciBjIGluIChzZWxmLndvcmQgKyBzZWxmLm90aGVyd29yZCk6CisgICAgICAgICAgICBpZiAoYyBpbiBzZWxmLndvcmQpIF4gKGMgaW4gc2VsZi5vdGhlcndvcmQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGMsIHNlbGYucykKKworICAgIGRlZiB0ZXN0X2lucGxhY2Vfb25fc2VsZihzZWxmKToKKyAgICAgICAgdCA9IHNlbGYucy5jb3B5KCkKKyAgICAgICAgdCB8PSB0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgc2VsZi5zKQorICAgICAgICB0ICY9IHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBzZWxmLnMpCisgICAgICAgIHQgLT0gdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHNlbGYudGhldHlwZSgpKQorICAgICAgICB0ID0gc2VsZi5zLmNvcHkoKQorICAgICAgICB0IF49IHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBzZWxmLnRoZXR5cGUoKSkKKworICAgIGRlZiB0ZXN0X3dlYWtyZWYoc2VsZik6CisgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoJ2dhbGxhaGFkJykKKyAgICAgICAgcCA9IHdlYWtyZWYucHJveHkocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIocCksIHN0cihzKSkKKyAgICAgICAgcyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUmVmZXJlbmNlRXJyb3IsIHN0ciwgcCkKKworICAgICMgQyBBUEkgdGVzdCBvbmx5IGF2YWlsYWJsZSBpbiBhIGRlYnVnIGJ1aWxkCisgICAgaWYgaGFzYXR0cihzZXQsICJ0ZXN0X2NfYXBpIik6CisgICAgICAgIGRlZiB0ZXN0X2NfYXBpKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoKS50ZXN0X2NfYXBpKCksIFRydWUpCisKK2NsYXNzIFNldFN1YmNsYXNzKHNldCk6CisgICAgcGFzcworCitjbGFzcyBUZXN0U2V0U3ViY2xhc3MoVGVzdFNldCk6CisgICAgdGhldHlwZSA9IFNldFN1YmNsYXNzCisKK2NsYXNzIFNldFN1YmNsYXNzV2l0aEtleXdvcmRBcmdzKHNldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZXJhYmxlPVtdLCBuZXdhcmc9Tm9uZSk6CisgICAgICAgIHNldC5fX2luaXRfXyhzZWxmLCBpdGVyYWJsZSkKKworY2xhc3MgVGVzdFNldFN1YmNsYXNzV2l0aEtleXdvcmRBcmdzKFRlc3RTZXQpOgorCisgICAgZGVmIHRlc3Rfa2V5d29yZHNfaW5fc3ViY2xhc3Moc2VsZik6CisgICAgICAgICdTRiBidWcgIzE0ODY2NjMgLS0gdGhpcyB1c2VkIHRvIGVycm9uZW91c2x5IHJhaXNlIGEgVHlwZUVycm9yJworICAgICAgICBTZXRTdWJjbGFzc1dpdGhLZXl3b3JkQXJncyhuZXdhcmc9MSkKKworY2xhc3MgVGVzdEZyb3plblNldChUZXN0Sm9pbnRPcHMpOgorICAgIHRoZXR5cGUgPSBmcm96ZW5zZXQKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoc2VsZi53b3JkKQorICAgICAgICBzLl9faW5pdF9fKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHNldChzZWxmLndvcmQpKQorCisgICAgZGVmIHRlc3Rfc2luZ2xldG9uX2VtcHR5X2Zyb3plbnNldChzZWxmKToKKyAgICAgICAgZiA9IGZyb3plbnNldCgpCisgICAgICAgIGVmcyA9IFtmcm96ZW5zZXQoKSwgZnJvemVuc2V0KFtdKSwgZnJvemVuc2V0KCgpKSwgZnJvemVuc2V0KCcnKSwKKyAgICAgICAgICAgICAgIGZyb3plbnNldCgpLCBmcm96ZW5zZXQoW10pLCBmcm96ZW5zZXQoKCkpLCBmcm96ZW5zZXQoJycpLAorICAgICAgICAgICAgICAgZnJvemVuc2V0KHhyYW5nZSgwKSksIGZyb3plbnNldChmcm96ZW5zZXQoKSksCisgICAgICAgICAgICAgICBmcm96ZW5zZXQoZiksIGZdCisgICAgICAgICMgQWxsIG9mIHRoZSBlbXB0eSBmcm96ZW5zZXRzIHNob3VsZCBoYXZlIGp1c3Qgb25lIGlkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2V0KG1hcChpZCwgZWZzKSkpLCAxKQorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3JfaWRlbnRpdHkoc2VsZik6CisgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUocmFuZ2UoMykpCisgICAgICAgIHQgPSBzZWxmLnRoZXR5cGUocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChzKSwgaWQodCkpCisKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goc2VsZi50aGV0eXBlKCdhYmNkZWInKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaChzZWxmLnRoZXR5cGUoJ2ViZWNkYScpKSkKKworICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IGFsbCBwZXJtdXRhdGlvbnMgZ2l2ZSB0aGUgc2FtZSBoYXNoIHZhbHVlCisgICAgICAgIG4gPSAxMDAKKyAgICAgICAgc2VxID0gW3JhbmRyYW5nZShuKSBmb3IgaSBpbiB4cmFuZ2UobildCisgICAgICAgIHJlc3VsdHMgPSBzZXQoKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjAwKToKKyAgICAgICAgICAgIHNodWZmbGUoc2VxKQorICAgICAgICAgICAgcmVzdWx0cy5hZGQoaGFzaChzZWxmLnRoZXR5cGUoc2VxKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdHMpLCAxKQorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgZHVwID0gc2VsZi5zLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKHNlbGYucyksIGlkKGR1cCkpCisKKyAgICBkZWYgdGVzdF9mcm96ZW5fYXNfZGljdGtleShzZWxmKToKKyAgICAgICAgc2VxID0gcmFuZ2UoMTApICsgbGlzdCgnYWJjZGVmZycpICsgWydhcHBsZSddCisgICAgICAgIGtleTEgPSBzZWxmLnRoZXR5cGUoc2VxKQorICAgICAgICBrZXkyID0gc2VsZi50aGV0eXBlKHJldmVyc2VkKHNlcSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5MSwga2V5MikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChrZXkxKSwgaWQoa2V5MikpCisgICAgICAgIGQgPSB7fQorICAgICAgICBkW2tleTFdID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkW2tleTJdLCA0MikKKworICAgIGRlZiB0ZXN0X2hhc2hfY2FjaGluZyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYudGhldHlwZSgnYWJjZGNkYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChmKSwgaGFzaChmKSkKKworICAgIGRlZiB0ZXN0X2hhc2hfZWZmZWN0aXZlbmVzcyhzZWxmKToKKyAgICAgICAgbiA9IDEzCisgICAgICAgIGhhc2h2YWx1ZXMgPSBzZXQoKQorICAgICAgICBhZGRoYXNodmFsdWUgPSBoYXNodmFsdWVzLmFkZAorICAgICAgICBlbGVtbWFza3MgPSBbKGkrMSwgMTw8aSkgZm9yIGkgaW4gcmFuZ2UobildCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgyKipuKToKKyAgICAgICAgICAgIGFkZGhhc2h2YWx1ZShoYXNoKGZyb3plbnNldChbZSBmb3IgZSwgbSBpbiBlbGVtbWFza3MgaWYgbSZpXSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihoYXNodmFsdWVzKSwgMioqbikKKworY2xhc3MgRnJvemVuU2V0U3ViY2xhc3MoZnJvemVuc2V0KToKKyAgICBwYXNzCisKK2NsYXNzIFRlc3RGcm96ZW5TZXRTdWJjbGFzcyhUZXN0RnJvemVuU2V0KToKKyAgICB0aGV0eXBlID0gRnJvemVuU2V0U3ViY2xhc3MKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yX2lkZW50aXR5KHNlbGYpOgorICAgICAgICBzID0gc2VsZi50aGV0eXBlKHJhbmdlKDMpKQorICAgICAgICB0ID0gc2VsZi50aGV0eXBlKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQocyksIGlkKHQpKQorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgZHVwID0gc2VsZi5zLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKHNlbGYucyksIGlkKGR1cCkpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfZW1wdHlfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoKQorICAgICAgICB0ID0gc2VsZi50aGV0eXBlKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgdCkKKworICAgIGRlZiB0ZXN0X3NpbmdsZXRvbl9lbXB0eV9mcm96ZW5zZXQoc2VsZik6CisgICAgICAgIEZyb3plbnNldCA9IHNlbGYudGhldHlwZQorICAgICAgICBmID0gZnJvemVuc2V0KCkKKyAgICAgICAgRiA9IEZyb3plbnNldCgpCisgICAgICAgIGVmcyA9IFtGcm96ZW5zZXQoKSwgRnJvemVuc2V0KFtdKSwgRnJvemVuc2V0KCgpKSwgRnJvemVuc2V0KCcnKSwKKyAgICAgICAgICAgICAgIEZyb3plbnNldCgpLCBGcm96ZW5zZXQoW10pLCBGcm96ZW5zZXQoKCkpLCBGcm96ZW5zZXQoJycpLAorICAgICAgICAgICAgICAgRnJvemVuc2V0KHhyYW5nZSgwKSksIEZyb3plbnNldChGcm96ZW5zZXQoKSksCisgICAgICAgICAgICAgICBGcm96ZW5zZXQoZnJvemVuc2V0KCkpLCBmLCBGLCBGcm96ZW5zZXQoZiksIEZyb3plbnNldChGKV0KKyAgICAgICAgIyBBbGwgZW1wdHkgZnJvemVuc2V0IHN1YmNsYXNzIGluc3RhbmNlcyBzaG91bGQgaGF2ZSBkaWZmZXJlbnQgaWRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldChtYXAoaWQsIGVmcykpKSwgbGVuKGVmcykpCisKKyMgVGVzdHMgdGFrZW4gZnJvbSB0ZXN0X3NldHMucHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2VtcHR5X3NldCA9IHNldCgpCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEJhc2ljT3BzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIGlmIHNlbGYucmVwciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzZWxmLnNldCksIHNlbGYucmVwcikKKworICAgIGRlZiBjaGVja19yZXByX2FnYWluc3RfdmFsdWVzKHNlbGYpOgorICAgICAgICB0ZXh0ID0gcmVwcihzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRleHQuc3RhcnRzd2l0aCgneycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGV4dC5lbmRzd2l0aCgnfScpKQorCisgICAgICAgIHJlc3VsdCA9IHRleHRbMTotMV0uc3BsaXQoJywgJykKKyAgICAgICAgcmVzdWx0LnNvcnQoKQorICAgICAgICBzb3J0ZWRfcmVwcl92YWx1ZXMgPSBbcmVwcih2YWx1ZSkgZm9yIHZhbHVlIGluIHNlbGYudmFsdWVzXQorICAgICAgICBzb3J0ZWRfcmVwcl92YWx1ZXMuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzb3J0ZWRfcmVwcl92YWx1ZXMpCisKKyAgICBkZWYgdGVzdF9wcmludChzZWxmKToKKyAgICAgICAgZm8gPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50ID4+IGZvLCBzZWxmLnNldCwKKyAgICAgICAgICAgIGZvLmNsb3NlKCkKKyAgICAgICAgICAgIGZvID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby5yZWFkKCksIHJlcHIoc2VsZi5zZXQpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm8uY2xvc2UoKQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfbGVuZ3RoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnNldCksIHNlbGYubGVuZ3RoKQorCisgICAgZGVmIHRlc3Rfc2VsZl9lcXVhbGl0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2VsZi5zZXQpCisKKyAgICBkZWYgdGVzdF9lcXVpdmFsZW50X2VxdWFsaXR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZWxmLmR1cCkKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQuY29weSgpLCBzZWxmLmR1cCkKKworICAgIGRlZiB0ZXN0X3NlbGZfdW5pb24oc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IHwgc2VsZi5zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuZHVwKQorCisgICAgZGVmIHRlc3RfZW1wdHlfdW5pb24oc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IHwgZW1wdHlfc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZWxmLmR1cCkKKworICAgIGRlZiB0ZXN0X3VuaW9uX2VtcHR5KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBlbXB0eV9zZXQgfCBzZWxmLnNldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2VsZi5kdXApCisKKyAgICBkZWYgdGVzdF9zZWxmX2ludGVyc2VjdGlvbihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgJiBzZWxmLnNldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2VsZi5kdXApCisKKyAgICBkZWYgdGVzdF9lbXB0eV9pbnRlcnNlY3Rpb24oc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0ICYgZW1wdHlfc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBlbXB0eV9zZXQpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fZW1wdHkoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IGVtcHR5X3NldCAmIHNlbGYuc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBlbXB0eV9zZXQpCisKKyAgICBkZWYgdGVzdF9zZWxmX2lzZGlzam9pbnQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0LmlzZGlzam9pbnQoc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBub3Qgc2VsZi5zZXQpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9pc2Rpc2pvaW50KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldC5pc2Rpc2pvaW50KGVtcHR5X3NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFRydWUpCisKKyAgICBkZWYgdGVzdF9pc2Rpc2pvaW50X2VtcHR5KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBlbXB0eV9zZXQuaXNkaXNqb2ludChzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFRydWUpCisKKyAgICBkZWYgdGVzdF9zZWxmX3N5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCBeIHNlbGYuc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBlbXB0eV9zZXQpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9zeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgXiBlbXB0eV9zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuc2V0KQorCisgICAgZGVmIHRlc3Rfc2VsZl9kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAtIHNlbGYuc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBlbXB0eV9zZXQpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAtIGVtcHR5X3NldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2VsZi5kdXApCisKKyAgICBkZWYgdGVzdF9lbXB0eV9kaWZmZXJlbmNlX3JldihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gZW1wdHlfc2V0IC0gc2VsZi5zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGVtcHR5X3NldCkKKworICAgIGRlZiB0ZXN0X2l0ZXJhdGlvbihzZWxmKToKKyAgICAgICAgZm9yIHYgaW4gc2VsZi5zZXQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHYsIHNlbGYudmFsdWVzKQorICAgICAgICBzZXRpdGVyID0gaXRlcihzZWxmLnNldCkKKyAgICAgICAgIyBub3RlOiBfX2xlbmd0aF9oaW50X18gaXMgYW4gaW50ZXJuYWwgdW5kb2N1bWVudGVkIEFQSSwKKyAgICAgICAgIyBkb24ndCByZWx5IG9uIGl0IGluIHlvdXIgb3duIHByb2dyYW1zCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0aXRlci5fX2xlbmd0aF9oaW50X18oKSwgbGVuKHNlbGYuc2V0KSkKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgorICAgICAgICBwID0gcGlja2xlLmR1bXBzKHNlbGYuc2V0KQorICAgICAgICBjb3B5ID0gcGlja2xlLmxvYWRzKHApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIGNvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzICE9ICVzIiAlIChzZWxmLnNldCwgY29weSkpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdEJhc2ljT3BzRW1wdHkoVGVzdEJhc2ljT3BzKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZSAgID0gImVtcHR5IHNldCIKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbXQorICAgICAgICBzZWxmLnNldCAgICA9IHNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5kdXAgICAgPSBzZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYubGVuZ3RoID0gMAorICAgICAgICBzZWxmLnJlcHIgICA9ICJzZXQoW10pIgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RCYXNpY09wc1NpbmdsZXRvbihUZXN0QmFzaWNPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlICAgPSAidW5pdCBzZXQgKG51bWJlcikiCisgICAgICAgIHNlbGYudmFsdWVzID0gWzNdCisgICAgICAgIHNlbGYuc2V0ICAgID0gc2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmR1cCAgICA9IHNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5sZW5ndGggPSAxCisgICAgICAgIHNlbGYucmVwciAgID0gInNldChbM10pIgorCisgICAgZGVmIHRlc3RfaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oMywgc2VsZi5zZXQpCisKKyAgICBkZWYgdGVzdF9ub3RfaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMiwgc2VsZi5zZXQpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdEJhc2ljT3BzVHVwbGUoVGVzdEJhc2ljT3BzKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZSAgID0gInVuaXQgc2V0ICh0dXBsZSkiCisgICAgICAgIHNlbGYudmFsdWVzID0gWygwLCAiemVybyIpXQorICAgICAgICBzZWxmLnNldCAgICA9IHNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5kdXAgICAgPSBzZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYubGVuZ3RoID0gMQorICAgICAgICBzZWxmLnJlcHIgICA9ICJzZXQoWygwLCAnemVybycpXSkiCisKKyAgICBkZWYgdGVzdF9pbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoMCwgInplcm8iKSwgc2VsZi5zZXQpCisKKyAgICBkZWYgdGVzdF9ub3RfaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oOSwgc2VsZi5zZXQpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdEJhc2ljT3BzVHJpcGxlKFRlc3RCYXNpY09wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2UgICA9ICJ0cmlwbGUgc2V0IgorICAgICAgICBzZWxmLnZhbHVlcyA9IFswLCAiemVybyIsIG9wZXJhdG9yLmFkZF0KKyAgICAgICAgc2VsZi5zZXQgICAgPSBzZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYuZHVwICAgID0gc2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmxlbmd0aCA9IDMKKyAgICAgICAgc2VsZi5yZXByICAgPSBOb25lCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdEJhc2ljT3BzU3RyaW5nKFRlc3RCYXNpY09wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2UgICA9ICJzdHJpbmcgc2V0IgorICAgICAgICBzZWxmLnZhbHVlcyA9IFsiYSIsICJiIiwgImMiXQorICAgICAgICBzZWxmLnNldCAgICA9IHNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5kdXAgICAgPSBzZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYubGVuZ3RoID0gMworCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19yZXByX2FnYWluc3RfdmFsdWVzKCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0QmFzaWNPcHNVbmljb2RlKFRlc3RCYXNpY09wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2UgICA9ICJ1bmljb2RlIHNldCIKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbdSJhIiwgdSJiIiwgdSJjIl0KKyAgICAgICAgc2VsZi5zZXQgICAgPSBzZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYuZHVwICAgID0gc2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmxlbmd0aCA9IDMKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcmVwcl9hZ2FpbnN0X3ZhbHVlcygpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdEJhc2ljT3BzTWl4ZWRTdHJpbmdVbmljb2RlKFRlc3RCYXNpY09wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2UgICA9ICJzdHJpbmcgYW5kIGJ5dGVzIHNldCIKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbImEiLCAiYiIsIHUiYSIsIHUiYiJdCisgICAgICAgIHNlbGYuc2V0ICAgID0gc2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmR1cCAgICA9IHNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5sZW5ndGggPSA0CisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5jaGVja19yZXByX2FnYWluc3RfdmFsdWVzKCkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitkZWYgYmFkaXRlcigpOgorICAgIHJhaXNlIFR5cGVFcnJvcgorICAgIHlpZWxkIFRydWUKKworZGVmIGdvb2RpdGVyKCk6CisgICAgeWllbGQgVHJ1ZQorCitjbGFzcyBUZXN0RXhjZXB0aW9uUHJvcGFnYXRpb24odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlNGIDYyODI0NjogIFNldCBjb25zdHJ1Y3RvciBzaG91bGQgbm90IHRyYXAgaXRlcmF0b3IgVHlwZUVycm9ycyIiIgorCisgICAgZGVmIHRlc3RfaW5zdGFuY2VXaXRoRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldCwgYmFkaXRlcigpKQorCisgICAgZGVmIHRlc3RfaW5zdGFuY2VzV2l0aG91dEV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgIyBBbGwgb2YgdGhlc2UgaXRlcmFibGVzIHNob3VsZCBsb2FkIHdpdGhvdXQgZXhjZXB0aW9uLgorICAgICAgICBzZXQoWzEsMiwzXSkKKyAgICAgICAgc2V0KCgxLDIsMykpCisgICAgICAgIHNldCh7J29uZSc6MSwgJ3R3byc6MiwgJ3RocmVlJzozfSkKKyAgICAgICAgc2V0KHhyYW5nZSgzKSkKKyAgICAgICAgc2V0KCdhYmMnKQorICAgICAgICBzZXQoZ29vZGl0ZXIoKSkKKworICAgIGRlZiB0ZXN0X2NoYW5naW5nU2l6ZVdoaWxlSXRlcmF0aW5nKHNlbGYpOgorICAgICAgICBzID0gc2V0KFsxLDIsM10pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIHM6CisgICAgICAgICAgICAgICAgcy51cGRhdGUoWzRdKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBleGNlcHRpb24gd2hlbiBjaGFuZ2luZyBzaXplIGR1cmluZyBpdGVyYXRpb24iKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RTZXRPZlNldHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBpbm5lciA9IGZyb3plbnNldChbMV0pCisgICAgICAgIG91dGVyID0gc2V0KFtpbm5lcl0pCisgICAgICAgIGVsZW1lbnQgPSBvdXRlci5wb3AoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZWxlbWVudCksIGZyb3plbnNldCkKKyAgICAgICAgb3V0ZXIuYWRkKGlubmVyKSAgICAgICAgIyBSZWJ1aWxkIHNldCBvZiBzZXRzIHdpdGggLmFkZCBtZXRob2QKKyAgICAgICAgb3V0ZXIucmVtb3ZlKGlubmVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dGVyLCBzZXQoKSkgICAjIFZlcmlmeSB0aGF0IHJlbW92ZSB3b3JrZWQKKyAgICAgICAgb3V0ZXIuZGlzY2FyZChpbm5lcikgICAgIyBBYnNlbmNlIG9mIEtleUVycm9yIGluZGljYXRlcyB3b3JraW5nIGZpbmUKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0QmluYXJ5T3BzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ID0gc2V0KCgyLCA0LCA2KSkKKworICAgIGRlZiB0ZXN0X2VxKHNlbGYpOiAgICAgICAgICAgICAgIyBTRiBidWcgNjQzMTE1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldCh7MjoxLDQ6Myw2OjV9KSkKKworICAgIGRlZiB0ZXN0X3VuaW9uX3N1YnNldChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgfCBzZXQoWzJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2V0KCgyLCA0LCA2KSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9zdXBlcnNldChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgfCBzZXQoWzIsIDQsIDYsIDhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2V0KFsyLCA0LCA2LCA4XSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9vdmVybGFwKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCB8IHNldChbMywgNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZXQoWzIsIDMsIDQsIDUsIDZdKSkKKworICAgIGRlZiB0ZXN0X3VuaW9uX25vbl9vdmVybGFwKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCB8IHNldChbOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZXQoWzIsIDQsIDYsIDhdKSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9zdWJzZXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0ICYgc2V0KCgyLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNldCgoMiwgNCkpKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3N1cGVyc2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAmIHNldChbMiwgNCwgNiwgOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZXQoWzIsIDQsIDZdKSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9vdmVybGFwKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAmIHNldChbMywgNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZXQoWzRdKSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9ub25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgJiBzZXQoWzhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZW1wdHlfc2V0KQorCisgICAgZGVmIHRlc3RfaXNkaXNqb2ludF9zdWJzZXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0LmlzZGlzam9pbnQoc2V0KCgyLCA0KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2lzZGlzam9pbnRfc3VwZXJzZXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0LmlzZGlzam9pbnQoc2V0KFsyLCA0LCA2LCA4XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2lzZGlzam9pbnRfb3ZlcmxhcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQuaXNkaXNqb2ludChzZXQoWzMsIDQsIDVdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIEZhbHNlKQorCisgICAgZGVmIHRlc3RfaXNkaXNqb2ludF9ub25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQuaXNkaXNqb2ludChzZXQoWzhdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFRydWUpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV9zdWJzZXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IF4gc2V0KCgyLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNldChbNl0pKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfc3VwZXJzZXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IF4gc2V0KCgyLCA0LCA2LCA4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNldChbOF0pKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfb3ZlcmxhcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgXiBzZXQoKDMsIDQsIDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2V0KFsyLCAzLCA1LCA2XSkpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV9ub25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgXiBzZXQoWzhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2V0KFsyLCA0LCA2LCA4XSkpCisKKyAgICBkZWYgdGVzdF9jbXAoc2VsZik6CisgICAgICAgIGEsIGIgPSBzZXQoJ2EnKSwgc2V0KCdiJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIGEsIGIpCisKKyAgICAgICAgIyBZb3UgY2FuIHZpZXcgdGhpcyBhcyBhIGJ1Z2xldDogIGNtcChhLCBhKSBkb2VzIG5vdCByYWlzZSBUeXBlRXJyb3IsCisgICAgICAgICMgYmVjYXVzZSBfX2VxX18gaXMgdHJpZWQgYmVmb3JlIF9fY21wX18sIGFuZCBhLl9fZXFfXyhhKSByZXR1cm5zIFRydWUsCisgICAgICAgICMgd2hpY2ggUHl0aG9uIHRoaW5rcyBpcyBnb29kIGVub3VnaCB0byBzeW50aGVzaXplIGEgY21wKCkgcmVzdWx0CisgICAgICAgICMgd2l0aG91dCBjYWxsaW5nIF9fY21wX18uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGEsIGEpLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCBhLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsICJhYmMiLCBhKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RVcGRhdGVPcHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgPSBzZXQoKDIsIDQsIDYpKQorCisgICAgZGVmIHRlc3RfdW5pb25fc3Vic2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNldCB8PSBzZXQoWzJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoKDIsIDQsIDYpKSkKKworICAgIGRlZiB0ZXN0X3VuaW9uX3N1cGVyc2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNldCB8PSBzZXQoWzIsIDQsIDYsIDhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoWzIsIDQsIDYsIDhdKSkKKworICAgIGRlZiB0ZXN0X3VuaW9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IHw9IHNldChbMywgNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbMiwgMywgNCwgNSwgNl0pKQorCisgICAgZGVmIHRlc3RfdW5pb25fbm9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IHw9IHNldChbOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbMiwgNCwgNiwgOF0pKQorCisgICAgZGVmIHRlc3RfdW5pb25fbWV0aG9kX2NhbGwoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LnVwZGF0ZShzZXQoWzMsIDQsIDVdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KFsyLCAzLCA0LCA1LCA2XSkpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fc3Vic2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNldCAmPSBzZXQoKDIsIDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoKDIsIDQpKSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9zdXBlcnNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgJj0gc2V0KFsyLCA0LCA2LCA4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KFsyLCA0LCA2XSkpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgJj0gc2V0KFszLCA0LCA1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KFs0XSkpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fbm9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ICY9IHNldChbOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIGVtcHR5X3NldCkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9tZXRob2RfY2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQuaW50ZXJzZWN0aW9uX3VwZGF0ZShzZXQoWzMsIDQsIDVdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KFs0XSkpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV9zdWJzZXQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IF49IHNldCgoMiwgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbNl0pKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfc3VwZXJzZXQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IF49IHNldCgoMiwgNCwgNiwgOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbOF0pKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfb3ZlcmxhcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgXj0gc2V0KCgzLCA0LCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KFsyLCAzLCA1LCA2XSkpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV9ub25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgXj0gc2V0KFs4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KFsyLCA0LCA2LCA4XSkpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV9tZXRob2RfY2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHNldChbMywgNCwgNV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoWzIsIDMsIDUsIDZdKSkKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2Vfc3Vic2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNldCAtPSBzZXQoKDIsIDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoWzZdKSkKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2Vfc3VwZXJzZXQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IC09IHNldCgoMiwgNCwgNiwgOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbXSkpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IC09IHNldCgoMywgNCwgNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbMiwgNl0pKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZV9ub25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgLT0gc2V0KFs4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KFsyLCA0LCA2XSkpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX21ldGhvZF9jYWxsKHNlbGYpOgorICAgICAgICBzZWxmLnNldC5kaWZmZXJlbmNlX3VwZGF0ZShzZXQoWzMsIDQsIDVdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KFsyLCA2XSkpCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdE11dGF0ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnZhbHVlcyA9IFsiYSIsICJiIiwgImMiXQorICAgICAgICBzZWxmLnNldCA9IHNldChzZWxmLnZhbHVlcykKKworICAgIGRlZiB0ZXN0X2FkZF9wcmVzZW50KHNlbGYpOgorICAgICAgICBzZWxmLnNldC5hZGQoImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoImFiYyIpKQorCisgICAgZGVmIHRlc3RfYWRkX2Fic2VudChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQuYWRkKCJkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KCJhYmNkIikpCisKKyAgICBkZWYgdGVzdF9hZGRfdW50aWxfZnVsbChzZWxmKToKKyAgICAgICAgdG1wID0gc2V0KCkKKyAgICAgICAgZXhwZWN0ZWRfbGVuID0gMAorICAgICAgICBmb3IgdiBpbiBzZWxmLnZhbHVlczoKKyAgICAgICAgICAgIHRtcC5hZGQodikKKyAgICAgICAgICAgIGV4cGVjdGVkX2xlbiArPSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0bXApLCBleHBlY3RlZF9sZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG1wLCBzZWxmLnNldCkKKworICAgIGRlZiB0ZXN0X3JlbW92ZV9wcmVzZW50KHNlbGYpOgorICAgICAgICBzZWxmLnNldC5yZW1vdmUoImIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoImFjIikpCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfYWJzZW50KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNldC5yZW1vdmUoImQiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJSZW1vdmluZyBtaXNzaW5nIGVsZW1lbnQgc2hvdWxkIGhhdmUgcmFpc2VkIExvb2t1cEVycm9yIikKKyAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfcmVtb3ZlX3VudGlsX2VtcHR5KHNlbGYpOgorICAgICAgICBleHBlY3RlZF9sZW4gPSBsZW4oc2VsZi5zZXQpCisgICAgICAgIGZvciB2IGluIHNlbGYudmFsdWVzOgorICAgICAgICAgICAgc2VsZi5zZXQucmVtb3ZlKHYpCisgICAgICAgICAgICBleHBlY3RlZF9sZW4gLT0gMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zZXQpLCBleHBlY3RlZF9sZW4pCisKKyAgICBkZWYgdGVzdF9kaXNjYXJkX3ByZXNlbnQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LmRpc2NhcmQoImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoImFiIikpCisKKyAgICBkZWYgdGVzdF9kaXNjYXJkX2Fic2VudChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQuZGlzY2FyZCgiZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldCgiYWJjIikpCisKKyAgICBkZWYgdGVzdF9jbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi5zZXQuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnNldCksIDApCisKKyAgICBkZWYgdGVzdF9wb3Aoc2VsZik6CisgICAgICAgIHBvcHBlZCA9IHt9CisgICAgICAgIHdoaWxlIHNlbGYuc2V0OgorICAgICAgICAgICAgcG9wcGVkW3NlbGYuc2V0LnBvcCgpXSA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocG9wcGVkKSwgbGVuKHNlbGYudmFsdWVzKSkKKyAgICAgICAgZm9yIHYgaW4gc2VsZi52YWx1ZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHYsIHBvcHBlZCkKKworICAgIGRlZiB0ZXN0X3VwZGF0ZV9lbXB0eV90dXBsZShzZWxmKToKKyAgICAgICAgc2VsZi5zZXQudXBkYXRlKCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoc2VsZi52YWx1ZXMpKQorCisgICAgZGVmIHRlc3RfdXBkYXRlX3VuaXRfdHVwbGVfb3ZlcmxhcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQudXBkYXRlKCgiYSIsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KHNlbGYudmFsdWVzKSkKKworICAgIGRlZiB0ZXN0X3VwZGF0ZV91bml0X3R1cGxlX25vbl9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldC51cGRhdGUoKCJhIiwgInoiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KHNlbGYudmFsdWVzICsgWyJ6Il0pKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RTdWJzZXRzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGNhc2UybWV0aG9kID0geyI8PSI6ICJpc3N1YnNldCIsCisgICAgICAgICAgICAgICAgICAgIj49IjogImlzc3VwZXJzZXQiLAorICAgICAgICAgICAgICAgICAgfQorCisgICAgcmV2ZXJzZSA9IHsiPT0iOiAiPT0iLAorICAgICAgICAgICAgICAgIiE9IjogIiE9IiwKKyAgICAgICAgICAgICAgICI8IjogICI+IiwKKyAgICAgICAgICAgICAgICI+IjogICI8IiwKKyAgICAgICAgICAgICAgICI8PSI6ICI+PSIsCisgICAgICAgICAgICAgICAiPj0iOiAiPD0iLAorICAgICAgICAgICAgICB9CisKKyAgICBkZWYgdGVzdF9pc3N1YnNldChzZWxmKToKKyAgICAgICAgeCA9IHNlbGYubGVmdAorICAgICAgICB5ID0gc2VsZi5yaWdodAorICAgICAgICBmb3IgY2FzZSBpbiAiIT0iLCAiPT0iLCAiPCIsICI8PSIsICI+IiwgIj49IjoKKyAgICAgICAgICAgIGV4cGVjdGVkID0gY2FzZSBpbiBzZWxmLmNhc2VzCisgICAgICAgICAgICAjIFRlc3QgdGhlIGJpbmFyeSBpbmZpeCBzcGVsbGluZy4KKyAgICAgICAgICAgIHJlc3VsdCA9IGV2YWwoIngiICsgY2FzZSArICJ5IiwgbG9jYWxzKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisgICAgICAgICAgICAjIFRlc3QgdGhlICJmcmllbmRseSIgbWV0aG9kLW5hbWUgc3BlbGxpbmcsIGlmIG9uZSBleGlzdHMuCisgICAgICAgICAgICBpZiBjYXNlIGluIFRlc3RTdWJzZXRzLmNhc2UybWV0aG9kOgorICAgICAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoeCwgVGVzdFN1YnNldHMuY2FzZTJtZXRob2RbY2FzZV0pCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kKHkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorCisgICAgICAgICAgICAjIE5vdyBkbyB0aGUgc2FtZSBmb3IgdGhlIG9wZXJhbmRzIHJldmVyc2VkLgorICAgICAgICAgICAgcmNhc2UgPSBUZXN0U3Vic2V0cy5yZXZlcnNlW2Nhc2VdCisgICAgICAgICAgICByZXN1bHQgPSBldmFsKCJ5IiArIHJjYXNlICsgIngiLCBsb2NhbHMoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKKyAgICAgICAgICAgIGlmIHJjYXNlIGluIFRlc3RTdWJzZXRzLmNhc2UybWV0aG9kOgorICAgICAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoeSwgVGVzdFN1YnNldHMuY2FzZTJtZXRob2RbcmNhc2VdKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZCh4KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdFN1YnNldEVxdWFsRW1wdHkoVGVzdFN1YnNldHMpOgorICAgIGxlZnQgID0gc2V0KCkKKyAgICByaWdodCA9IHNldCgpCisgICAgbmFtZSAgPSAiYm90aCBlbXB0eSIKKyAgICBjYXNlcyA9ICI9PSIsICI8PSIsICI+PSIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0U3Vic2V0RXF1YWxOb25FbXB0eShUZXN0U3Vic2V0cyk6CisgICAgbGVmdCAgPSBzZXQoWzEsIDJdKQorICAgIHJpZ2h0ID0gc2V0KFsxLCAyXSkKKyAgICBuYW1lICA9ICJlcXVhbCBwYWlyIgorICAgIGNhc2VzID0gIj09IiwgIjw9IiwgIj49IgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RTdWJzZXRFbXB0eU5vbkVtcHR5KFRlc3RTdWJzZXRzKToKKyAgICBsZWZ0ICA9IHNldCgpCisgICAgcmlnaHQgPSBzZXQoWzEsIDJdKQorICAgIG5hbWUgID0gIm9uZSBlbXB0eSwgb25lIG5vbi1lbXB0eSIKKyAgICBjYXNlcyA9ICIhPSIsICI8IiwgIjw9IgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RTdWJzZXRQYXJ0aWFsKFRlc3RTdWJzZXRzKToKKyAgICBsZWZ0ICA9IHNldChbMV0pCisgICAgcmlnaHQgPSBzZXQoWzEsIDJdKQorICAgIG5hbWUgID0gIm9uZSBhIG5vbi1lbXB0eSBwcm9wZXIgc3Vic2V0IG9mIG90aGVyIgorICAgIGNhc2VzID0gIiE9IiwgIjwiLCAiPD0iCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdFN1YnNldE5vbk92ZXJsYXAoVGVzdFN1YnNldHMpOgorICAgIGxlZnQgID0gc2V0KFsxXSkKKyAgICByaWdodCA9IHNldChbMl0pCisgICAgbmFtZSAgPSAibmVpdGhlciBlbXB0eSwgbmVpdGhlciBjb250YWlucyIKKyAgICBjYXNlcyA9ICIhPSIKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0T25seVNldHNJbkJpbmFyeU9wcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9lcV9uZShzZWxmKToKKyAgICAgICAgIyBVbmxpa2UgdGhlIG90aGVycywgdGhpcyBpcyB0ZXN0aW5nIHRoYXQgPT0gYW5kICE9ICphcmUqIGFsbG93ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5vdGhlciA9PSBzZWxmLnNldCwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQgPT0gc2VsZi5vdGhlciwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5vdGhlciAhPSBzZWxmLnNldCwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCAhPSBzZWxmLm90aGVyLCBUcnVlKQorCisgICAgZGVmIHRlc3RfZ2VfZ3RfbGVfbHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA8IHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA8PSBzZWxmLm90aGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgPiBzZWxmLm90aGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgPj0gc2VsZi5vdGhlcikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA8IHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA8PSBzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgPiBzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgPj0gc2VsZi5zZXQpCisKKyAgICBkZWYgdGVzdF91cGRhdGVfb3BlcmF0b3Ioc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2V0IHw9IHNlbGYub3RoZXIKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgVHlwZUVycm9yIikKKworICAgIGRlZiB0ZXN0X3VwZGF0ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6CisgICAgICAgICAgICBzZWxmLnNldC51cGRhdGUoc2VsZi5vdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zZXQudXBkYXRlLCBzZWxmLm90aGVyKQorCisgICAgZGVmIHRlc3RfdW5pb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCB8IHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIHwgc2VsZi5zZXQpCisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQudW5pb24oc2VsZi5vdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zZXQudW5pb24sIHNlbGYub3RoZXIpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fdXBkYXRlX29wZXJhdG9yKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNldCAmPSBzZWxmLm90aGVyCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIFR5cGVFcnJvciIpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fdXBkYXRlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm90aGVySXNJdGVyYWJsZToKKyAgICAgICAgICAgIHNlbGYuc2V0LmludGVyc2VjdGlvbl91cGRhdGUoc2VsZi5vdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0LmludGVyc2VjdGlvbl91cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm90aGVyKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgJiBzZWxmLm90aGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciAmIHNlbGYuc2V0KQorICAgICAgICBpZiBzZWxmLm90aGVySXNJdGVyYWJsZToKKyAgICAgICAgICAgIHNlbGYuc2V0LmludGVyc2VjdGlvbihzZWxmLm90aGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnNldC5pbnRlcnNlY3Rpb24sIHNlbGYub3RoZXIpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV91cGRhdGVfb3BlcmF0b3Ioc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2V0IF49IHNlbGYub3RoZXIKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgVHlwZUVycm9yIikKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX3VwZGF0ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6CisgICAgICAgICAgICBzZWxmLnNldC5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoc2VsZi5vdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0LnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3RoZXIpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IF4gc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgXiBzZWxmLnNldCkKKyAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6CisgICAgICAgICAgICBzZWxmLnNldC5zeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmLm90aGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnNldC5zeW1tZXRyaWNfZGlmZmVyZW5jZSwgc2VsZi5vdGhlcikKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2VfdXBkYXRlX29wZXJhdG9yKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNldCAtPSBzZWxmLm90aGVyCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIFR5cGVFcnJvciIpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX3VwZGF0ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6CisgICAgICAgICAgICBzZWxmLnNldC5kaWZmZXJlbmNlX3VwZGF0ZShzZWxmLm90aGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXQuZGlmZmVyZW5jZV91cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm90aGVyKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IC0gc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgLSBzZWxmLnNldCkKKyAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6CisgICAgICAgICAgICBzZWxmLnNldC5kaWZmZXJlbmNlKHNlbGYub3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuc2V0LmRpZmZlcmVuY2UsIHNlbGYub3RoZXIpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdE9ubHlTZXRzTnVtZXJpYyhUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAgID0gc2V0KCgxLCAyLCAzKSkKKyAgICAgICAgc2VsZi5vdGhlciA9IDE5CisgICAgICAgIHNlbGYub3RoZXJJc0l0ZXJhYmxlID0gRmFsc2UKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0T25seVNldHNEaWN0KFRlc3RPbmx5U2V0c0luQmluYXJ5T3BzKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ICAgPSBzZXQoKDEsIDIsIDMpKQorICAgICAgICBzZWxmLm90aGVyID0gezE6MiwgMzo0fQorICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IFRydWUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0T25seVNldHNPcGVyYXRvcihUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAgID0gc2V0KCgxLCAyLCAzKSkKKyAgICAgICAgc2VsZi5vdGhlciA9IG9wZXJhdG9yLmFkZAorICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IEZhbHNlCisKKyAgICBkZWYgdGVzdF9nZV9ndF9sZV9sdChzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc3VwZXIoVGVzdE9ubHlTZXRzT3BlcmF0b3IsIHNlbGYpLnRlc3RfZ2VfZ3RfbGVfbHQoKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RPbmx5U2V0c1R1cGxlKFRlc3RPbmx5U2V0c0luQmluYXJ5T3BzKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ICAgPSBzZXQoKDEsIDIsIDMpKQorICAgICAgICBzZWxmLm90aGVyID0gKDIsIDQsIDYpCisgICAgICAgIHNlbGYub3RoZXJJc0l0ZXJhYmxlID0gVHJ1ZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RPbmx5U2V0c1N0cmluZyhUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAgID0gc2V0KCgxLCAyLCAzKSkKKyAgICAgICAgc2VsZi5vdGhlciA9ICdhYmMnCisgICAgICAgIHNlbGYub3RoZXJJc0l0ZXJhYmxlID0gVHJ1ZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RPbmx5U2V0c0dlbmVyYXRvcihUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBkZWYgZ2VuKCk6CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMCwgMTAsIDIpOgorICAgICAgICAgICAgICAgIHlpZWxkIGkKKyAgICAgICAgc2VsZi5zZXQgICA9IHNldCgoMSwgMiwgMykpCisgICAgICAgIHNlbGYub3RoZXIgPSBnZW4oKQorICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IFRydWUKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0Q29weWluZyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBkdXAgPSBsaXN0KHNlbGYuc2V0LmNvcHkoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZHVwKSwgbGVuKHNlbGYuc2V0KSkKKyAgICAgICAgZm9yIGVsIGluIHNlbGYuc2V0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlbCwgZHVwKQorICAgICAgICAgICAgcG9zID0gZHVwLmluZGV4KGVsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhlbCwgZHVwLnBvcChwb3MpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGR1cCkKKworICAgIGRlZiB0ZXN0X2RlZXBfY29weShzZWxmKToKKyAgICAgICAgZHVwID0gY29weS5kZWVwY29weShzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChkdXAsIHNlbGYuc2V0KQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RDb3B5aW5nRW1wdHkoVGVzdENvcHlpbmcpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgPSBzZXQoKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RDb3B5aW5nU2luZ2xldG9uKFRlc3RDb3B5aW5nKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ID0gc2V0KFsiaGVsbG8iXSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0Q29weWluZ1RyaXBsZShUZXN0Q29weWluZyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCA9IHNldChbInplcm8iLCAwLCBOb25lXSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0Q29weWluZ1R1cGxlKFRlc3RDb3B5aW5nKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ID0gc2V0KFsoMSwgMildKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RDb3B5aW5nTmVzdGVkKFRlc3RDb3B5aW5nKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ID0gc2V0KFsoKDEsIDIpLCAoMywgNCkpXSkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0SWRlbnRpdGllcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmEgPSBzZXQoJ2FicmFjYWRhYnJhJykKKyAgICAgICAgc2VsZi5iID0gc2V0KCdhbGFjYXphbScpCisKKyAgICBkZWYgdGVzdF9iaW5vcHNWc1N1YnNldHMoc2VsZik6CisgICAgICAgIGEsIGIgPSBzZWxmLmEsIHNlbGYuYgorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAtIGIgPCBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiAtIGEgPCBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAmIGIgPCBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAmIGIgPCBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSB8IGIgPiBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSB8IGIgPiBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBeIGIgPCBhIHwgYikKKworICAgIGRlZiB0ZXN0X2NvbW11dGF0aXZpdHkoc2VsZik6CisgICAgICAgIGEsIGIgPSBzZWxmLmEsIHNlbGYuYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEmYiwgYiZhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF8YiwgYnxhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFeYiwgYl5hKQorICAgICAgICBpZiBhICE9IGI6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGEtYiwgYi1hKQorCisgICAgZGVmIHRlc3Rfc3VtbWF0aW9ucyhzZWxmKToKKyAgICAgICAgIyBjaGVjayB0aGF0IHN1bXMgb2YgcGFydHMgZXF1YWwgdGhlIHdob2xlCisgICAgICAgIGEsIGIgPSBzZWxmLmEsIHNlbGYuYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLWIpfChhJmIpfChiLWEpLCBhfGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEmYil8KGFeYiksIGF8YikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhfChiLWEpLCBhfGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEtYil8YiwgYXxiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLWIpfChhJmIpLCBhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChiLWEpfChhJmIpLCBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLWIpfChiLWEpLCBhXmIpCisKKyAgICBkZWYgdGVzdF9leGNsdXNpb24oc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCBpbnZlcnNlIG9wZXJhdGlvbnMgc2hvdyBub24tb3ZlcmxhcAorICAgICAgICBhLCBiLCB6ZXJvID0gc2VsZi5hLCBzZWxmLmIsIHNldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEtYikmYiwgemVybykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYi1hKSZhLCB6ZXJvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhJmIpJihhXmIpLCB6ZXJvKQorCisjIFRlc3RzIGRlcml2ZWQgZnJvbSB0ZXN0X2l0ZXJ0b29scy5weSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZGVmIFIoc2Vxbik6CisgICAgJ1JlZ3VsYXIgZ2VuZXJhdG9yJworICAgIGZvciBpIGluIHNlcW46CisgICAgICAgIHlpZWxkIGkKKworY2xhc3MgRzoKKyAgICAnU2VxdWVuY2UgdXNpbmcgX19nZXRpdGVtX18nCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5zZXFuW2ldCisKK2NsYXNzIEk6CisgICAgJ1NlcXVlbmNlIHVzaW5nIGl0ZXJhdG9yIHByb3RvY29sJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmkgPj0gbGVuKHNlbGYuc2Vxbik6IHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgdiA9IHNlbGYuc2VxbltzZWxmLmldCisgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgIHJldHVybiB2CisKK2NsYXNzIElnOgorICAgICdTZXF1ZW5jZSB1c2luZyBpdGVyYXRvciBwcm90b2NvbCBkZWZpbmVkIHdpdGggYSBnZW5lcmF0b3InCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIGZvciB2YWwgaW4gc2VsZi5zZXFuOgorICAgICAgICAgICAgeWllbGQgdmFsCisKK2NsYXNzIFg6CisgICAgJ01pc3NpbmcgX19nZXRpdGVtX18gYW5kIF9faXRlcl9fJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaSA+PSBsZW4oc2VsZi5zZXFuKTogcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICB2ID0gc2VsZi5zZXFuW3NlbGYuaV0KKyAgICAgICAgc2VsZi5pICs9IDEKKyAgICAgICAgcmV0dXJuIHYKKworY2xhc3MgTjoKKyAgICAnSXRlcmF0b3IgbWlzc2luZyBuZXh0KCknCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKK2NsYXNzIEU6CisgICAgJ1Rlc3QgcHJvcGFnYXRpb24gb2YgZXhjZXB0aW9ucycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgMyAvLyAwCisKK2NsYXNzIFM6CisgICAgJ1Rlc3QgaW1tZWRpYXRlIHN0b3AnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBwYXNzCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbiwgaW1hcAorZGVmIEwoc2Vxbik6CisgICAgJ1Rlc3QgbXVsdGlwbGUgdGllcnMgb2YgaXRlcmF0b3JzJworICAgIHJldHVybiBjaGFpbihpbWFwKGxhbWJkYSB4OngsIFIoSWcoRyhzZXFuKSkpKSkKKworY2xhc3MgVGVzdFZhcmlvdXNJdGVyYXRvckFyZ3ModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIGZvciBjb25zIGluIChzZXQsIGZyb3plbnNldCk6CisgICAgICAgICAgICBmb3IgcyBpbiAoIjEyMyIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSkpOgorICAgICAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoY29ucyhnKHMpKSwgc2V0KGcocykpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29ucyAsIFgocykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb25zICwgTihzKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgY29ucyAsIEUocykpCisKKyAgICBkZWYgdGVzdF9pbmxpbmVfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgcyA9IHNldCgnbm92ZW1iZXInKQorICAgICAgICBmb3IgZGF0YSBpbiAoIjEyMyIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSksICdkZWNlbWJlcicpOgorICAgICAgICAgICAgZm9yIG1ldGggaW4gKHMudW5pb24sIHMuaW50ZXJzZWN0aW9uLCBzLmRpZmZlcmVuY2UsIHMuc3ltbWV0cmljX2RpZmZlcmVuY2UsIHMuaXNkaXNqb2ludCk6CisgICAgICAgICAgICAgICAgZm9yIGcgaW4gKEcsIEksIElnLCBMLCBSKToKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBtZXRoKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGFjdHVhbCA9IG1ldGgoRyhkYXRhKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZCwgYm9vbCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFNldEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZXRoLCBYKHMpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgTihzKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgbWV0aCwgRShzKSkKKworICAgIGRlZiB0ZXN0X2lucGxhY2VfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgZm9yIGRhdGEgaW4gKCIxMjMiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpLCAnZGVjZW1iZXInKToKKyAgICAgICAgICAgIGZvciBtZXRobmFtZSBpbiAoJ3VwZGF0ZScsICdpbnRlcnNlY3Rpb25fdXBkYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpZmZlcmVuY2VfdXBkYXRlJywgJ3N5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZScpOgorICAgICAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgICAgIHMgPSBzZXQoJ2phbnVhcnknKQorICAgICAgICAgICAgICAgICAgICB0ID0gcy5jb3B5KCkKKyAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihzLCBtZXRobmFtZSkobGlzdChnKGRhdGEpKSkKKyAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cih0LCBtZXRobmFtZSkoZyhkYXRhKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChzLCB0KQorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhdHRyKHNldCgnamFudWFyeScpLCBtZXRobmFtZSksIFgoZGF0YSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhdHRyKHNldCgnamFudWFyeScpLCBtZXRobmFtZSksIE4oZGF0YSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGdldGF0dHIoc2V0KCdqYW51YXJ5JyksIG1ldGhuYW1lKSwgRShkYXRhKSkKKworY2xhc3MgYmFkX2VxOgorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBiZV9iYWQ6CisgICAgICAgICAgICBzZXQyLmNsZWFyKCkKKyAgICAgICAgICAgIHJhaXNlIFplcm9EaXZpc2lvbkVycm9yCisgICAgICAgIHJldHVybiBzZWxmIGlzIG90aGVyCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gMAorCitjbGFzcyBiYWRfZGljdF9jbGVhcjoKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgYmVfYmFkOgorICAgICAgICAgICAgZGljdDIuY2xlYXIoKQorICAgICAgICByZXR1cm4gc2VsZiBpcyBvdGhlcgorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworY2xhc3MgVGVzdFdlaXJkQnVncyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfODQyMF9zZXRfbWVyZ2Uoc2VsZik6CisgICAgICAgICMgVGhpcyB1c2VkIHRvIHNlZ2ZhdWx0CisgICAgICAgIGdsb2JhbCBiZV9iYWQsIHNldDIsIGRpY3QyCisgICAgICAgIGJlX2JhZCA9IEZhbHNlCisgICAgICAgIHNldDEgPSB7YmFkX2VxKCl9CisgICAgICAgIHNldDIgPSB7YmFkX2VxKCkgZm9yIGkgaW4gcmFuZ2UoNzUpfQorICAgICAgICBiZV9iYWQgPSBUcnVlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBzZXQxLnVwZGF0ZSwgc2V0MikKKworICAgICAgICBiZV9iYWQgPSBGYWxzZQorICAgICAgICBzZXQxID0ge2JhZF9kaWN0X2NsZWFyKCl9CisgICAgICAgIGRpY3QyID0ge2JhZF9kaWN0X2NsZWFyKCk6IE5vbmV9CisgICAgICAgIGJlX2JhZCA9IFRydWUKKyAgICAgICAgc2V0MS5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoZGljdDIpCisKKyMgQXBwbGljYXRpb24gdGVzdHMgKGJhc2VkIG9uIERhdmlkIEVwcHN0ZWluJ3MgZ3JhcGggcmVjaXBlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZGVmIHBvd2Vyc2V0KFUpOgorICAgICIiIkdlbmVyYXRlcyBhbGwgc3Vic2V0cyBvZiBhIHNldCBvciBzZXF1ZW5jZSBVLiIiIgorICAgIFUgPSBpdGVyKFUpCisgICAgdHJ5OgorICAgICAgICB4ID0gZnJvemVuc2V0KFtVLm5leHQoKV0pCisgICAgICAgIGZvciBTIGluIHBvd2Vyc2V0KFUpOgorICAgICAgICAgICAgeWllbGQgUworICAgICAgICAgICAgeWllbGQgUyB8IHgKKyAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgeWllbGQgZnJvemVuc2V0KCkKKworZGVmIGN1YmUobik6CisgICAgIiIiR3JhcGggb2Ygbi1kaW1lbnNpb25hbCBoeXBlcmN1YmUuIiIiCisgICAgc2luZ2xldG9ucyA9IFtmcm96ZW5zZXQoW3hdKSBmb3IgeCBpbiByYW5nZShuKV0KKyAgICByZXR1cm4gZGljdChbKHgsIGZyb3plbnNldChbeF5zIGZvciBzIGluIHNpbmdsZXRvbnNdKSkKKyAgICAgICAgICAgICAgICAgZm9yIHggaW4gcG93ZXJzZXQocmFuZ2UobikpXSkKKworZGVmIGxpbmVncmFwaChHKToKKyAgICAiIiJHcmFwaCwgdGhlIHZlcnRpY2VzIG9mIHdoaWNoIGFyZSBlZGdlcyBvZiBHLAorICAgIHdpdGggdHdvIHZlcnRpY2VzIGJlaW5nIGFkamFjZW50IGlmZiB0aGUgY29ycmVzcG9uZGluZworICAgIGVkZ2VzIHNoYXJlIGEgdmVydGV4LiIiIgorICAgIEwgPSB7fQorICAgIGZvciB4IGluIEc6CisgICAgICAgIGZvciB5IGluIEdbeF06CisgICAgICAgICAgICBueCA9IFtmcm96ZW5zZXQoW3gsel0pIGZvciB6IGluIEdbeF0gaWYgeiAhPSB5XQorICAgICAgICAgICAgbnkgPSBbZnJvemVuc2V0KFt5LHpdKSBmb3IgeiBpbiBHW3ldIGlmIHogIT0geF0KKyAgICAgICAgICAgIExbZnJvemVuc2V0KFt4LHldKV0gPSBmcm96ZW5zZXQobngrbnkpCisgICAgcmV0dXJuIEwKKworZGVmIGZhY2VzKEcpOgorICAgICdSZXR1cm4gYSBzZXQgb2YgZmFjZXMgaW4gRy4gIFdoZXJlIGEgZmFjZSBpcyBhIHNldCBvZiB2ZXJ0aWNlcyBvbiB0aGF0IGZhY2UnCisgICAgIyBjdXJyZW50bHkgbGltaXRlZCB0byB0cmlhbmdsZXMsc3F1YXJlcywgYW5kIHBlbnRhZ29ucworICAgIGYgPSBzZXQoKQorICAgIGZvciB2MSwgZWRnZXMgaW4gRy5pdGVtcygpOgorICAgICAgICBmb3IgdjIgaW4gZWRnZXM6CisgICAgICAgICAgICBmb3IgdjMgaW4gR1t2Ml06CisgICAgICAgICAgICAgICAgaWYgdjEgPT0gdjM6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgdjEgaW4gR1t2M106CisgICAgICAgICAgICAgICAgICAgIGYuYWRkKGZyb3plbnNldChbdjEsIHYyLCB2M10pKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZvciB2NCBpbiBHW3YzXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHY0ID09IHYyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB2MSBpbiBHW3Y0XToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmFkZChmcm96ZW5zZXQoW3YxLCB2MiwgdjMsIHY0XSkpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2NSBpbiBHW3Y0XToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdjUgPT0gdjMgb3IgdjUgPT0gdjI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB2MSBpbiBHW3Y1XToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuYWRkKGZyb3plbnNldChbdjEsIHYyLCB2MywgdjQsIHY1XSkpCisgICAgcmV0dXJuIGYKKworCitjbGFzcyBUZXN0R3JhcGhzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2N1YmUoc2VsZik6CisKKyAgICAgICAgZyA9IGN1YmUoMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdmVydCAtLT4ge3YxLCB2MiwgdjN9CisgICAgICAgIHZlcnRpY2VzMSA9IHNldChnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2ZXJ0aWNlczEpLCA4KSAgICAgIyBlaWdodCB2ZXJ0aWNlcworICAgICAgICBmb3IgZWRnZSBpbiBnLnZhbHVlcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZWRnZSksIDMpICAgICAgIyBlYWNoIHZlcnRleCBjb25uZWN0cyB0byB0aHJlZSBlZGdlcworICAgICAgICB2ZXJ0aWNlczIgPSBzZXQodiBmb3IgZWRnZXMgaW4gZy52YWx1ZXMoKSBmb3IgdiBpbiBlZGdlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2ZXJ0aWNlczEsIHZlcnRpY2VzMikgICMgZWRnZSB2ZXJ0aWNlcyBpbiBvcmlnaW5hbCBzZXQKKworICAgICAgICBjdWJlZmFjZXMgPSBmYWNlcyhnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjdWJlZmFjZXMpLCA2KSAgICAgIyBzaXggZmFjZXMKKyAgICAgICAgZm9yIGZhY2UgaW4gY3ViZWZhY2VzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZmFjZSksIDQpICAgICAgIyBlYWNoIGZhY2UgaXMgYSBzcXVhcmUKKworICAgIGRlZiB0ZXN0X2N1Ym9jdGFoZWRyb24oc2VsZik6CisKKyAgICAgICAgIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1Ym9jdGFoZWRyb24KKyAgICAgICAgIyA4IHRyaWFuZ3VsYXIgZmFjZXMgYW5kIDYgc3F1YXJlIGZhY2VzCisgICAgICAgICMgMTIgaW5kZW50aWNhbCB2ZXJ0aWNlcyBlYWNoIGNvbm5lY3RpbmcgYSB0cmlhbmdsZSBhbmQgc3F1YXJlCisKKyAgICAgICAgZyA9IGN1YmUoMykKKyAgICAgICAgY3Vib2N0YWhlZHJvbiA9IGxpbmVncmFwaChnKSAgICAgICAgICAgICMgViggLS0+IHtWMSwgVjIsIFYzLCBWNH0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY3Vib2N0YWhlZHJvbiksIDEyKSMgdHdlbHZlIHZlcnRpY2VzCisKKyAgICAgICAgdmVydGljZXMgPSBzZXQoY3Vib2N0YWhlZHJvbikKKyAgICAgICAgZm9yIGVkZ2VzIGluIGN1Ym9jdGFoZWRyb24udmFsdWVzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlZGdlcyksIDQpICAgICAjIGVhY2ggdmVydGV4IGNvbm5lY3RzIHRvIGZvdXIgb3RoZXIgdmVydGljZXMKKyAgICAgICAgb3RoZXJ2ZXJ0aWNlcyA9IHNldChlZGdlIGZvciBlZGdlcyBpbiBjdWJvY3RhaGVkcm9uLnZhbHVlcygpIGZvciBlZGdlIGluIGVkZ2VzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZlcnRpY2VzLCBvdGhlcnZlcnRpY2VzKSAgICMgZWRnZSB2ZXJ0aWNlcyBpbiBvcmlnaW5hbCBzZXQKKworICAgICAgICBjdWJvZmFjZXMgPSBmYWNlcyhjdWJvY3RhaGVkcm9uKQorICAgICAgICBmYWNlc2l6ZXMgPSBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdChpbnQpCisgICAgICAgIGZvciBmYWNlIGluIGN1Ym9mYWNlczoKKyAgICAgICAgICAgIGZhY2VzaXplc1tsZW4oZmFjZSldICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmYWNlc2l6ZXNbM10sIDgpICAgICAgICMgZWlnaHQgdHJpYW5ndWxhciBmYWNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZhY2VzaXplc1s0XSwgNikgICAgICAgIyBzaXggc3F1YXJlIGZhY2VzCisKKyAgICAgICAgZm9yIHZlcnRleCBpbiBjdWJvY3RhaGVkcm9uOgorICAgICAgICAgICAgZWRnZSA9IHZlcnRleCAgICAgICAgICAgICAgICAgICAgICAgIyBDdWJvY3RhaGVkcm9uIHZlcnRpY2VzIGFyZSBlZGdlcyBpbiBDdWJlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlZGdlKSwgMikgICAgICAjIFR3byBjdWJlIHZlcnRpY2VzIGRlZmluZSBhbiBlZGdlCisgICAgICAgICAgICBmb3IgY3ViZXZlcnQgaW4gZWRnZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGN1YmV2ZXJ0LCBnKQorCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3RfY2xhc3NlcyA9ICgKKyAgICAgICAgVGVzdFNldCwKKyAgICAgICAgVGVzdFNldFN1YmNsYXNzLAorICAgICAgICBUZXN0U2V0U3ViY2xhc3NXaXRoS2V5d29yZEFyZ3MsCisgICAgICAgIFRlc3RGcm96ZW5TZXQsCisgICAgICAgIFRlc3RGcm96ZW5TZXRTdWJjbGFzcywKKyAgICAgICAgVGVzdFNldE9mU2V0cywKKyAgICAgICAgVGVzdEV4Y2VwdGlvblByb3BhZ2F0aW9uLAorICAgICAgICBUZXN0QmFzaWNPcHNFbXB0eSwKKyAgICAgICAgVGVzdEJhc2ljT3BzU2luZ2xldG9uLAorICAgICAgICBUZXN0QmFzaWNPcHNUdXBsZSwKKyAgICAgICAgVGVzdEJhc2ljT3BzVHJpcGxlLAorICAgICAgICBUZXN0QmluYXJ5T3BzLAorICAgICAgICBUZXN0VXBkYXRlT3BzLAorICAgICAgICBUZXN0TXV0YXRlLAorICAgICAgICBUZXN0U3Vic2V0RXF1YWxFbXB0eSwKKyAgICAgICAgVGVzdFN1YnNldEVxdWFsTm9uRW1wdHksCisgICAgICAgIFRlc3RTdWJzZXRFbXB0eU5vbkVtcHR5LAorICAgICAgICBUZXN0U3Vic2V0UGFydGlhbCwKKyAgICAgICAgVGVzdFN1YnNldE5vbk92ZXJsYXAsCisgICAgICAgIFRlc3RPbmx5U2V0c051bWVyaWMsCisgICAgICAgIFRlc3RPbmx5U2V0c0RpY3QsCisgICAgICAgIFRlc3RPbmx5U2V0c09wZXJhdG9yLAorICAgICAgICBUZXN0T25seVNldHNUdXBsZSwKKyAgICAgICAgVGVzdE9ubHlTZXRzU3RyaW5nLAorICAgICAgICBUZXN0T25seVNldHNHZW5lcmF0b3IsCisgICAgICAgIFRlc3RDb3B5aW5nRW1wdHksCisgICAgICAgIFRlc3RDb3B5aW5nU2luZ2xldG9uLAorICAgICAgICBUZXN0Q29weWluZ1RyaXBsZSwKKyAgICAgICAgVGVzdENvcHlpbmdUdXBsZSwKKyAgICAgICAgVGVzdENvcHlpbmdOZXN0ZWQsCisgICAgICAgIFRlc3RJZGVudGl0aWVzLAorICAgICAgICBUZXN0VmFyaW91c0l0ZXJhdG9yQXJncywKKyAgICAgICAgVGVzdEdyYXBocywKKyAgICAgICAgVGVzdFdlaXJkQnVncywKKyAgICAgICAgKQorCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorCisgICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCisgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgIGltcG9ydCBnYworICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcHJpbnQgY291bnRzCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYzA1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYzA1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldGNvbXBzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0Y29tcHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1ZTZmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldGNvbXBzLnB5CkBAIC0wLDAgKzEsMTUxIEBACitkb2N0ZXN0cyA9ICIiIgorIyMjIyMjIyMjIyMgVGVzdHMgbW9zdGx5IGNvcGllZCBmcm9tIHRlc3RfbGlzdGNvbXBzLnB5ICMjIyMjIyMjIyMjIworCitUZXN0IHNpbXBsZSBsb29wIHdpdGggY29uZGl0aW9uYWwKKworICAgID4+PiBzdW0oe2kqaSBmb3IgaSBpbiByYW5nZSgxMDApIGlmIGkmMSA9PSAxfSkKKyAgICAxNjY2NTAKKworVGVzdCBzaW1wbGUgY2FzZQorCisgICAgPj4+IHsyKnkgKyB4ICsgMSBmb3IgeCBpbiAoMCwpIGZvciB5IGluICgxLCl9CisgICAgc2V0KFszXSkKKworVGVzdCBzaW1wbGUgbmVzdGluZworCisgICAgPj4+IGxpc3Qoc29ydGVkKHsoaSxqKSBmb3IgaSBpbiByYW5nZSgzKSBmb3IgaiBpbiByYW5nZSg0KX0pKQorICAgIFsoMCwgMCksICgwLCAxKSwgKDAsIDIpLCAoMCwgMyksICgxLCAwKSwgKDEsIDEpLCAoMSwgMiksICgxLCAzKSwgKDIsIDApLCAoMiwgMSksICgyLCAyKSwgKDIsIDMpXQorCitUZXN0IG5lc3Rpbmcgd2l0aCB0aGUgaW5uZXIgZXhwcmVzc2lvbiBkZXBlbmRlbnQgb24gdGhlIG91dGVyCisKKyAgICA+Pj4gbGlzdChzb3J0ZWQoeyhpLGopIGZvciBpIGluIHJhbmdlKDQpIGZvciBqIGluIHJhbmdlKGkpfSkpCisgICAgWygxLCAwKSwgKDIsIDApLCAoMiwgMSksICgzLCAwKSwgKDMsIDEpLCAoMywgMildCisKK01ha2Ugc3VyZSB0aGUgaW5kdWN0aW9uIHZhcmlhYmxlIGlzIG5vdCBleHBvc2VkCisKKyAgICA+Pj4gaSA9IDIwCisgICAgPj4+IHN1bSh7aSppIGZvciBpIGluIHJhbmdlKDEwMCl9KQorICAgIDMyODM1MAorCisgICAgPj4+IGkKKyAgICAyMAorCitWZXJpZnkgdGhhdCBzeW50YXggZXJyb3IncyBhcmUgcmFpc2VkIGZvciBzZXRjb21wcyB1c2VkIGFzIGx2YWx1ZXMKKworICAgID4+PiB7eSBmb3IgeSBpbiAoMSwyKX0gPSAxMCAgICAgICAgICAjIGRvY3Rlc3Q6ICtJR05PUkVfRVhDRVBUSU9OX0RFVEFJTAorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAuLi4KKyAgICBTeW50YXhFcnJvcjogLi4uCisKKyAgICA+Pj4ge3kgZm9yIHkgaW4gKDEsMil9ICs9IDEwICAgICAgICAgIyBkb2N0ZXN0OiArSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgLi4uCisgICAgU3ludGF4RXJyb3I6IC4uLgorCisKK01ha2UgYSBuZXN0ZWQgc2V0IGNvbXByZWhlbnNpb24gdGhhdCBhY3RzIGxpa2Ugc2V0KHJhbmdlKCkpCisKKyAgICA+Pj4gZGVmIHNyYW5nZShuKToKKyAgICAuLi4gICAgIHJldHVybiB7aSBmb3IgaSBpbiByYW5nZShuKX0KKyAgICA+Pj4gbGlzdChzb3J0ZWQoc3JhbmdlKDEwKSkpCisgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisKK1NhbWUgYWdhaW4sIG9ubHkgYXMgYSBsYW1iZGEgZXhwcmVzc2lvbiBpbnN0ZWFkIG9mIGEgZnVuY3Rpb24gZGVmaW5pdGlvbgorCisgICAgPj4+IGxyYW5nZSA9IGxhbWJkYSBuOiAge2kgZm9yIGkgaW4gcmFuZ2Uobil9CisgICAgPj4+IGxpc3Qoc29ydGVkKGxyYW5nZSgxMCkpKQorICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQorCitHZW5lcmF0b3JzIGNhbiBjYWxsIG90aGVyIGdlbmVyYXRvcnM6CisKKyAgICA+Pj4gZGVmIGdyYW5nZShuKToKKyAgICAuLi4gICAgIGZvciB4IGluIHtpIGZvciBpIGluIHJhbmdlKG4pfToKKyAgICAuLi4gICAgICAgICB5aWVsZCB4CisgICAgPj4+IGxpc3Qoc29ydGVkKGdyYW5nZSg1KSkpCisgICAgWzAsIDEsIDIsIDMsIDRdCisKKworTWFrZSBzdXJlIHRoYXQgTm9uZSBpcyBhIHZhbGlkIHJldHVybiB2YWx1ZQorCisgICAgPj4+IHtOb25lIGZvciBpIGluIHJhbmdlKDEwKX0KKyAgICBzZXQoW05vbmVdKQorCisjIyMjIyMjIyMjIyBUZXN0cyBmb3IgdmFyaW91cyBzY29waW5nIGNvcm5lciBjYXNlcyAjIyMjIyMjIyMjIyMKKworUmV0dXJuIGxhbWJkYXMgdGhhdCB1c2UgdGhlIGl0ZXJhdGlvbiB2YXJpYWJsZSBhcyBhIGRlZmF1bHQgYXJndW1lbnQKKworICAgID4+PiBpdGVtcyA9IHsobGFtYmRhIGk9aTogaSkgZm9yIGkgaW4gcmFuZ2UoNSl9CisgICAgPj4+IHt4KCkgZm9yIHggaW4gaXRlbXN9ID09IHNldChyYW5nZSg1KSkKKyAgICBUcnVlCisKK1NhbWUgYWdhaW4sIG9ubHkgdGhpcyB0aW1lIGFzIGEgY2xvc3VyZSB2YXJpYWJsZQorCisgICAgPj4+IGl0ZW1zID0geyhsYW1iZGE6IGkpIGZvciBpIGluIHJhbmdlKDUpfQorICAgID4+PiB7eCgpIGZvciB4IGluIGl0ZW1zfQorICAgIHNldChbNF0pCisKK0Fub3RoZXIgd2F5IHRvIHRlc3QgdGhhdCB0aGUgaXRlcmF0aW9uIHZhcmlhYmxlIGlzIGxvY2FsIHRvIHRoZSBsaXN0IGNvbXAKKworICAgID4+PiBpdGVtcyA9IHsobGFtYmRhOiBpKSBmb3IgaSBpbiByYW5nZSg1KX0KKyAgICA+Pj4gaSA9IDIwCisgICAgPj4+IHt4KCkgZm9yIHggaW4gaXRlbXN9CisgICAgc2V0KFs0XSkKKworQW5kIGNvbmZpcm0gdGhhdCBhIGNsb3N1cmUgY2FuIGp1bXAgb3ZlciB0aGUgbGlzdCBjb21wIHNjb3BlCisKKyAgICA+Pj4gaXRlbXMgPSB7KGxhbWJkYTogeSkgZm9yIGkgaW4gcmFuZ2UoNSl9CisgICAgPj4+IHkgPSAyCisgICAgPj4+IHt4KCkgZm9yIHggaW4gaXRlbXN9CisgICAgc2V0KFsyXSkKKworV2UgYWxzbyByZXBlYXQgZWFjaCBvZiB0aGUgYWJvdmUgc2NvcGluZyB0ZXN0cyBpbnNpZGUgYSBmdW5jdGlvbgorCisgICAgPj4+IGRlZiB0ZXN0X2Z1bmMoKToKKyAgICAuLi4gICAgIGl0ZW1zID0geyhsYW1iZGEgaT1pOiBpKSBmb3IgaSBpbiByYW5nZSg1KX0KKyAgICAuLi4gICAgIHJldHVybiB7eCgpIGZvciB4IGluIGl0ZW1zfQorICAgID4+PiB0ZXN0X2Z1bmMoKSA9PSBzZXQocmFuZ2UoNSkpCisgICAgVHJ1ZQorCisgICAgPj4+IGRlZiB0ZXN0X2Z1bmMoKToKKyAgICAuLi4gICAgIGl0ZW1zID0geyhsYW1iZGE6IGkpIGZvciBpIGluIHJhbmdlKDUpfQorICAgIC4uLiAgICAgcmV0dXJuIHt4KCkgZm9yIHggaW4gaXRlbXN9CisgICAgPj4+IHRlc3RfZnVuYygpCisgICAgc2V0KFs0XSkKKworICAgID4+PiBkZWYgdGVzdF9mdW5jKCk6CisgICAgLi4uICAgICBpdGVtcyA9IHsobGFtYmRhOiBpKSBmb3IgaSBpbiByYW5nZSg1KX0KKyAgICAuLi4gICAgIGkgPSAyMAorICAgIC4uLiAgICAgcmV0dXJuIHt4KCkgZm9yIHggaW4gaXRlbXN9CisgICAgPj4+IHRlc3RfZnVuYygpCisgICAgc2V0KFs0XSkKKworICAgID4+PiBkZWYgdGVzdF9mdW5jKCk6CisgICAgLi4uICAgICBpdGVtcyA9IHsobGFtYmRhOiB5KSBmb3IgaSBpbiByYW5nZSg1KX0KKyAgICAuLi4gICAgIHkgPSAyCisgICAgLi4uICAgICByZXR1cm4ge3goKSBmb3IgeCBpbiBpdGVtc30KKyAgICA+Pj4gdGVzdF9mdW5jKCkKKyAgICBzZXQoWzJdKQorCisiIiIKKworCitfX3Rlc3RfXyA9IHsnZG9jdGVzdHMnIDogZG9jdGVzdHN9CisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBpbXBvcnQgc3lzCisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc2V0Y29tcHMKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9zZXRjb21wcywgdmVyYm9zZSkKKworICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9zZXRjb21wcywgdmVyYm9zZSkKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBwcmludChjb3VudHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldGNvbXBzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldGNvbXBzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjBlZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0Y29tcHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldGNvbXBzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldGNvbXBzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjBlZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0Y29tcHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NTRlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRzLnB5CkBAIC0wLDAgKzEsODYyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IHVuaXR0ZXN0LCBvcGVyYXRvciwgY29weSwgcGlja2xlLCByYW5kb20KK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK3Rlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCJzZXRzIiwgZGVwcmVjYXRlZD1UcnVlKQorZnJvbSBzZXRzIGltcG9ydCBTZXQsIEltbXV0YWJsZVNldAorCitlbXB0eV9zZXQgPSBTZXQoKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RCYXNpY09wcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnJlcHIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoc2VsZi5zZXQpLCBzZWxmLnJlcHIpCisKKyAgICBkZWYgdGVzdF9sZW5ndGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuc2V0KSwgc2VsZi5sZW5ndGgpCisKKyAgICBkZWYgdGVzdF9zZWxmX2VxdWFsaXR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZWxmLnNldCkKKworICAgIGRlZiB0ZXN0X2VxdWl2YWxlbnRfZXF1YWxpdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNlbGYuZHVwKQorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldC5jb3B5KCksIHNlbGYuZHVwKQorCisgICAgZGVmIHRlc3Rfc2VsZl91bmlvbihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgfCBzZWxmLnNldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2VsZi5kdXApCisKKyAgICBkZWYgdGVzdF9lbXB0eV91bmlvbihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgfCBlbXB0eV9zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuZHVwKQorCisgICAgZGVmIHRlc3RfdW5pb25fZW1wdHkoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IGVtcHR5X3NldCB8IHNlbGYuc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZWxmLmR1cCkKKworICAgIGRlZiB0ZXN0X3NlbGZfaW50ZXJzZWN0aW9uKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAmIHNlbGYuc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZWxmLmR1cCkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2ludGVyc2VjdGlvbihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgJiBlbXB0eV9zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGVtcHR5X3NldCkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9lbXB0eShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gZW1wdHlfc2V0ICYgc2VsZi5zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGVtcHR5X3NldCkKKworICAgIGRlZiB0ZXN0X3NlbGZfc3ltbWV0cmljX2RpZmZlcmVuY2Uoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IF4gc2VsZi5zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGVtcHR5X3NldCkKKworICAgIGRlZiBjaGVja2VtcHR5X3N5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCBeIGVtcHR5X3NldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2VsZi5zZXQpCisKKyAgICBkZWYgdGVzdF9zZWxmX2RpZmZlcmVuY2Uoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IC0gc2VsZi5zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGVtcHR5X3NldCkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2RpZmZlcmVuY2Uoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IC0gZW1wdHlfc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZWxmLmR1cCkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2RpZmZlcmVuY2VfcmV2KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBlbXB0eV9zZXQgLSBzZWxmLnNldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZW1wdHlfc2V0KQorCisgICAgZGVmIHRlc3RfaXRlcmF0aW9uKHNlbGYpOgorICAgICAgICBmb3IgdiBpbiBzZWxmLnNldDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4odiwgc2VsZi52YWx1ZXMpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgcCA9IHBpY2tsZS5kdW1wcyhzZWxmLnNldCkKKyAgICAgICAgY29weSA9IHBpY2tsZS5sb2FkcyhwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBjb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAhPSAlcyIgJSAoc2VsZi5zZXQsIGNvcHkpKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RCYXNpY09wc0VtcHR5KFRlc3RCYXNpY09wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2UgICA9ICJlbXB0eSBzZXQiCisgICAgICAgIHNlbGYudmFsdWVzID0gW10KKyAgICAgICAgc2VsZi5zZXQgICAgPSBTZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYuZHVwICAgID0gU2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmxlbmd0aCA9IDAKKyAgICAgICAgc2VsZi5yZXByICAgPSAiU2V0KFtdKSIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0QmFzaWNPcHNTaW5nbGV0b24oVGVzdEJhc2ljT3BzKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZSAgID0gInVuaXQgc2V0IChudW1iZXIpIgorICAgICAgICBzZWxmLnZhbHVlcyA9IFszXQorICAgICAgICBzZWxmLnNldCAgICA9IFNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5kdXAgICAgPSBTZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYubGVuZ3RoID0gMQorICAgICAgICBzZWxmLnJlcHIgICA9ICJTZXQoWzNdKSIKKworICAgIGRlZiB0ZXN0X2luKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoMyBpbiBzZWxmLnNldCkKKworICAgIGRlZiB0ZXN0X25vdF9pbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIgbm90IGluIHNlbGYuc2V0KQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RCYXNpY09wc1R1cGxlKFRlc3RCYXNpY09wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2UgICA9ICJ1bml0IHNldCAodHVwbGUpIgorICAgICAgICBzZWxmLnZhbHVlcyA9IFsoMCwgInplcm8iKV0KKyAgICAgICAgc2VsZi5zZXQgICAgPSBTZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYuZHVwICAgID0gU2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmxlbmd0aCA9IDEKKyAgICAgICAgc2VsZi5yZXByICAgPSAiU2V0KFsoMCwgJ3plcm8nKV0pIgorCisgICAgZGVmIHRlc3RfaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoMCwgInplcm8iKSBpbiBzZWxmLnNldCkKKworICAgIGRlZiB0ZXN0X25vdF9pbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDkgbm90IGluIHNlbGYuc2V0KQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RCYXNpY09wc1RyaXBsZShUZXN0QmFzaWNPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlICAgPSAidHJpcGxlIHNldCIKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbMCwgInplcm8iLCBvcGVyYXRvci5hZGRdCisgICAgICAgIHNlbGYuc2V0ICAgID0gU2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmR1cCAgICA9IFNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5sZW5ndGggPSAzCisgICAgICAgIHNlbGYucmVwciAgID0gTm9uZQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2RlZiBiYWRpdGVyKCk6CisgICAgcmFpc2UgVHlwZUVycm9yCisgICAgeWllbGQgVHJ1ZQorCitkZWYgZ29vZGl0ZXIoKToKKyAgICB5aWVsZCBUcnVlCisKK2NsYXNzIFRlc3RFeGNlcHRpb25Qcm9wYWdhdGlvbih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiU0YgNjI4MjQ2OiAgU2V0IGNvbnN0cnVjdG9yIHNob3VsZCBub3QgdHJhcCBpdGVyYXRvciBUeXBlRXJyb3JzIiIiCisKKyAgICBkZWYgdGVzdF9pbnN0YW5jZVdpdGhFeGNlcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgU2V0LCBiYWRpdGVyKCkpCisKKyAgICBkZWYgdGVzdF9pbnN0YW5jZXNXaXRob3V0RXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAjIEFsbCBvZiB0aGVzZSBpdGVyYWJsZXMgc2hvdWxkIGxvYWQgd2l0aG91dCBleGNlcHRpb24uCisgICAgICAgIFNldChbMSwyLDNdKQorICAgICAgICBTZXQoKDEsMiwzKSkKKyAgICAgICAgU2V0KHsnb25lJzoxLCAndHdvJzoyLCAndGhyZWUnOjN9KQorICAgICAgICBTZXQoeHJhbmdlKDMpKQorICAgICAgICBTZXQoJ2FiYycpCisgICAgICAgIFNldChnb29kaXRlcigpKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RTZXRPZlNldHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBpbm5lciA9IFNldChbMV0pCisgICAgICAgIG91dGVyID0gU2V0KFtpbm5lcl0pCisgICAgICAgIGVsZW1lbnQgPSBvdXRlci5wb3AoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZWxlbWVudCksIEltbXV0YWJsZVNldCkKKyAgICAgICAgb3V0ZXIuYWRkKGlubmVyKSAgICAgICAgIyBSZWJ1aWxkIHNldCBvZiBzZXRzIHdpdGggLmFkZCBtZXRob2QKKyAgICAgICAgb3V0ZXIucmVtb3ZlKGlubmVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dGVyLCBTZXQoKSkgICAjIFZlcmlmeSB0aGF0IHJlbW92ZSB3b3JrZWQKKyAgICAgICAgb3V0ZXIuZGlzY2FyZChpbm5lcikgICAgIyBBYnNlbmNlIG9mIEtleUVycm9yIGluZGljYXRlcyB3b3JraW5nIGZpbmUKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0QmluYXJ5T3BzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ID0gU2V0KCgyLCA0LCA2KSkKKworICAgIGRlZiB0ZXN0X2VxKHNlbGYpOiAgICAgICAgICAgICAgIyBTRiBidWcgNjQzMTE1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCh7MjoxLDQ6Myw2OjV9KSkKKworICAgIGRlZiB0ZXN0X3VuaW9uX3N1YnNldChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgfCBTZXQoWzJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgU2V0KCgyLCA0LCA2KSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9zdXBlcnNldChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgfCBTZXQoWzIsIDQsIDYsIDhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgU2V0KFsyLCA0LCA2LCA4XSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9vdmVybGFwKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCB8IFNldChbMywgNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzIsIDMsIDQsIDUsIDZdKSkKKworICAgIGRlZiB0ZXN0X3VuaW9uX25vbl9vdmVybGFwKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCB8IFNldChbOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzIsIDQsIDYsIDhdKSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9zdWJzZXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0ICYgU2V0KCgyLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFNldCgoMiwgNCkpKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3N1cGVyc2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAmIFNldChbMiwgNCwgNiwgOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzIsIDQsIDZdKSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9vdmVybGFwKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAmIFNldChbMywgNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzRdKSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9ub25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgJiBTZXQoWzhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZW1wdHlfc2V0KQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfc3Vic2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCBeIFNldCgoMiwgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzZdKSkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX3N1cGVyc2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCBeIFNldCgoMiwgNCwgNiwgOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzhdKSkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX292ZXJsYXAoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IF4gU2V0KCgzLCA0LCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFNldChbMiwgMywgNSwgNl0pKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfbm9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IF4gU2V0KFs4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFNldChbMiwgNCwgNiwgOF0pKQorCisgICAgZGVmIHRlc3RfY21wKHNlbGYpOgorICAgICAgICBhLCBiID0gU2V0KCdhJyksIFNldCgnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCBhLCBiKQorCisgICAgICAgICMgWW91IGNhbiB2aWV3IHRoaXMgYXMgYSBidWdsZXQ6ICBjbXAoYSwgYSkgZG9lcyBub3QgcmFpc2UgVHlwZUVycm9yLAorICAgICAgICAjIGJlY2F1c2UgX19lcV9fIGlzIHRyaWVkIGJlZm9yZSBfX2NtcF9fLCBhbmQgYS5fX2VxX18oYSkgcmV0dXJucyBUcnVlLAorICAgICAgICAjIHdoaWNoIFB5dGhvbiB0aGlua3MgaXMgZ29vZCBlbm91Z2ggdG8gc3ludGhlc2l6ZSBhIGNtcCgpIHJlc3VsdAorICAgICAgICAjIHdpdGhvdXQgY2FsbGluZyBfX2NtcF9fLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChhLCBhKSwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgYSwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCAiYWJjIiwgYSkKKworICAgIGRlZiB0ZXN0X2lucGxhY2Vfb25fc2VsZihzZWxmKToKKyAgICAgICAgdCA9IHNlbGYuc2V0LmNvcHkoKQorICAgICAgICB0IHw9IHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBzZWxmLnNldCkKKyAgICAgICAgdCAmPSB0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgc2VsZi5zZXQpCisgICAgICAgIHQgLT0gdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0KSwgMCkKKyAgICAgICAgdCA9IHNlbGYuc2V0LmNvcHkoKQorICAgICAgICB0IF49IHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odCksIDApCisKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0VXBkYXRlT3BzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ID0gU2V0KCgyLCA0LCA2KSkKKworICAgIGRlZiB0ZXN0X3VuaW9uX3N1YnNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgfD0gU2V0KFsyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KCgyLCA0LCA2KSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9zdXBlcnNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgfD0gU2V0KFsyLCA0LCA2LCA4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFsyLCA0LCA2LCA4XSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCB8PSBTZXQoWzMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDMsIDQsIDUsIDZdKSkKKworICAgIGRlZiB0ZXN0X3VuaW9uX25vbl9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCB8PSBTZXQoWzhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDQsIDYsIDhdKSkKKworICAgIGRlZiB0ZXN0X3VuaW9uX21ldGhvZF9jYWxsKHNlbGYpOgorICAgICAgICBzZWxmLnNldC51bmlvbl91cGRhdGUoU2V0KFszLCA0LCA1XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbMiwgMywgNCwgNSwgNl0pKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3N1YnNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgJj0gU2V0KCgyLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KCgyLCA0KSkpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fc3VwZXJzZXQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ICY9IFNldChbMiwgNCwgNiwgOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbMiwgNCwgNl0pKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ICY9IFNldChbMywgNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbNF0pKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX25vbl9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAmPSBTZXQoWzhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBlbXB0eV9zZXQpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fbWV0aG9kX2NhbGwoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LmludGVyc2VjdGlvbl91cGRhdGUoU2V0KFszLCA0LCA1XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbNF0pKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfc3Vic2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNldCBePSBTZXQoKDIsIDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzZdKSkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX3N1cGVyc2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNldCBePSBTZXQoKDIsIDQsIDYsIDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzhdKSkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IF49IFNldCgoMywgNCwgNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbMiwgMywgNSwgNl0pKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfbm9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IF49IFNldChbOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbMiwgNCwgNiwgOF0pKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2VfbWV0aG9kX2NhbGwoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShTZXQoWzMsIDQsIDVdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFsyLCAzLCA1LCA2XSkpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX3N1YnNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgLT0gU2V0KCgyLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFs2XSkpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX3N1cGVyc2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNldCAtPSBTZXQoKDIsIDQsIDYsIDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoW10pKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZV9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAtPSBTZXQoKDMsIDQsIDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDZdKSkKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2Vfbm9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IC09IFNldChbOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbMiwgNCwgNl0pKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZV9tZXRob2RfY2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQuZGlmZmVyZW5jZV91cGRhdGUoU2V0KFszLCA0LCA1XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbMiwgNl0pKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RNdXRhdGUodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbImEiLCAiYiIsICJjIl0KKyAgICAgICAgc2VsZi5zZXQgPSBTZXQoc2VsZi52YWx1ZXMpCisKKyAgICBkZWYgdGVzdF9hZGRfcHJlc2VudChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQuYWRkKCJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KCJhYmMiKSkKKworICAgIGRlZiB0ZXN0X2FkZF9hYnNlbnQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LmFkZCgiZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCgiYWJjZCIpKQorCisgICAgZGVmIHRlc3RfYWRkX3VudGlsX2Z1bGwoc2VsZik6CisgICAgICAgIHRtcCA9IFNldCgpCisgICAgICAgIGV4cGVjdGVkX2xlbiA9IDAKKyAgICAgICAgZm9yIHYgaW4gc2VsZi52YWx1ZXM6CisgICAgICAgICAgICB0bXAuYWRkKHYpCisgICAgICAgICAgICBleHBlY3RlZF9sZW4gKz0gMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odG1wKSwgZXhwZWN0ZWRfbGVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRtcCwgc2VsZi5zZXQpCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfcHJlc2VudChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQucmVtb3ZlKCJiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KCJhYyIpKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlX2Fic2VudChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXQucmVtb3ZlKCJkIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiUmVtb3ZpbmcgbWlzc2luZyBlbGVtZW50IHNob3VsZCBoYXZlIHJhaXNlZCBMb29rdXBFcnJvciIpCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3JlbW92ZV91bnRpbF9lbXB0eShzZWxmKToKKyAgICAgICAgZXhwZWN0ZWRfbGVuID0gbGVuKHNlbGYuc2V0KQorICAgICAgICBmb3IgdiBpbiBzZWxmLnZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuc2V0LnJlbW92ZSh2KQorICAgICAgICAgICAgZXhwZWN0ZWRfbGVuIC09IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuc2V0KSwgZXhwZWN0ZWRfbGVuKQorCisgICAgZGVmIHRlc3RfZGlzY2FyZF9wcmVzZW50KHNlbGYpOgorICAgICAgICBzZWxmLnNldC5kaXNjYXJkKCJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KCJhYiIpKQorCisgICAgZGVmIHRlc3RfZGlzY2FyZF9hYnNlbnQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LmRpc2NhcmQoImQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoImFiYyIpKQorCisgICAgZGVmIHRlc3RfY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zZXQpLCAwKQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICBwb3BwZWQgPSB7fQorICAgICAgICB3aGlsZSBzZWxmLnNldDoKKyAgICAgICAgICAgIHBvcHBlZFtzZWxmLnNldC5wb3AoKV0gPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBvcHBlZCksIGxlbihzZWxmLnZhbHVlcykpCisgICAgICAgIGZvciB2IGluIHNlbGYudmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih2LCBwb3BwZWQpCisKKyAgICBkZWYgdGVzdF91cGRhdGVfZW1wdHlfdHVwbGUoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LnVuaW9uX3VwZGF0ZSgoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KHNlbGYudmFsdWVzKSkKKworICAgIGRlZiB0ZXN0X3VwZGF0ZV91bml0X3R1cGxlX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LnVuaW9uX3VwZGF0ZSgoImEiLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChzZWxmLnZhbHVlcykpCisKKyAgICBkZWYgdGVzdF91cGRhdGVfdW5pdF90dXBsZV9ub25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQudW5pb25fdXBkYXRlKCgiYSIsICJ6IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChzZWxmLnZhbHVlcyArIFsieiJdKSkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0U3Vic2V0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBjYXNlMm1ldGhvZCA9IHsiPD0iOiAiaXNzdWJzZXQiLAorICAgICAgICAgICAgICAgICAgICI+PSI6ICJpc3N1cGVyc2V0IiwKKyAgICAgICAgICAgICAgICAgIH0KKworICAgIHJldmVyc2UgPSB7Ij09IjogIj09IiwKKyAgICAgICAgICAgICAgICIhPSI6ICIhPSIsCisgICAgICAgICAgICAgICAiPCI6ICAiPiIsCisgICAgICAgICAgICAgICAiPiI6ICAiPCIsCisgICAgICAgICAgICAgICAiPD0iOiAiPj0iLAorICAgICAgICAgICAgICAgIj49IjogIjw9IiwKKyAgICAgICAgICAgICAgfQorCisgICAgZGVmIHRlc3RfaXNzdWJzZXQoc2VsZik6CisgICAgICAgIHggPSBzZWxmLmxlZnQKKyAgICAgICAgeSA9IHNlbGYucmlnaHQKKyAgICAgICAgZm9yIGNhc2UgaW4gIiE9IiwgIj09IiwgIjwiLCAiPD0iLCAiPiIsICI+PSI6CisgICAgICAgICAgICBleHBlY3RlZCA9IGNhc2UgaW4gc2VsZi5jYXNlcworICAgICAgICAgICAgIyBUZXN0IHRoZSBiaW5hcnkgaW5maXggc3BlbGxpbmcuCisgICAgICAgICAgICByZXN1bHQgPSBldmFsKCJ4IiArIGNhc2UgKyAieSIsIGxvY2FscygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorICAgICAgICAgICAgIyBUZXN0IHRoZSAiZnJpZW5kbHkiIG1ldGhvZC1uYW1lIHNwZWxsaW5nLCBpZiBvbmUgZXhpc3RzLgorICAgICAgICAgICAgaWYgY2FzZSBpbiBUZXN0U3Vic2V0cy5jYXNlMm1ldGhvZDoKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHgsIFRlc3RTdWJzZXRzLmNhc2UybWV0aG9kW2Nhc2VdKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZCh5KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKKworICAgICAgICAgICAgIyBOb3cgZG8gdGhlIHNhbWUgZm9yIHRoZSBvcGVyYW5kcyByZXZlcnNlZC4KKyAgICAgICAgICAgIHJjYXNlID0gVGVzdFN1YnNldHMucmV2ZXJzZVtjYXNlXQorICAgICAgICAgICAgcmVzdWx0ID0gZXZhbCgieSIgKyByY2FzZSArICJ4IiwgbG9jYWxzKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisgICAgICAgICAgICBpZiByY2FzZSBpbiBUZXN0U3Vic2V0cy5jYXNlMm1ldGhvZDoKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHksIFRlc3RTdWJzZXRzLmNhc2UybWV0aG9kW3JjYXNlXSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRob2QoeCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RTdWJzZXRFcXVhbEVtcHR5KFRlc3RTdWJzZXRzKToKKyAgICBsZWZ0ICA9IFNldCgpCisgICAgcmlnaHQgPSBTZXQoKQorICAgIG5hbWUgID0gImJvdGggZW1wdHkiCisgICAgY2FzZXMgPSAiPT0iLCAiPD0iLCAiPj0iCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdFN1YnNldEVxdWFsTm9uRW1wdHkoVGVzdFN1YnNldHMpOgorICAgIGxlZnQgID0gU2V0KFsxLCAyXSkKKyAgICByaWdodCA9IFNldChbMSwgMl0pCisgICAgbmFtZSAgPSAiZXF1YWwgcGFpciIKKyAgICBjYXNlcyA9ICI9PSIsICI8PSIsICI+PSIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0U3Vic2V0RW1wdHlOb25FbXB0eShUZXN0U3Vic2V0cyk6CisgICAgbGVmdCAgPSBTZXQoKQorICAgIHJpZ2h0ID0gU2V0KFsxLCAyXSkKKyAgICBuYW1lICA9ICJvbmUgZW1wdHksIG9uZSBub24tZW1wdHkiCisgICAgY2FzZXMgPSAiIT0iLCAiPCIsICI8PSIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0U3Vic2V0UGFydGlhbChUZXN0U3Vic2V0cyk6CisgICAgbGVmdCAgPSBTZXQoWzFdKQorICAgIHJpZ2h0ID0gU2V0KFsxLCAyXSkKKyAgICBuYW1lICA9ICJvbmUgYSBub24tZW1wdHkgcHJvcGVyIHN1YnNldCBvZiBvdGhlciIKKyAgICBjYXNlcyA9ICIhPSIsICI8IiwgIjw9IgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RTdWJzZXROb25PdmVybGFwKFRlc3RTdWJzZXRzKToKKyAgICBsZWZ0ICA9IFNldChbMV0pCisgICAgcmlnaHQgPSBTZXQoWzJdKQorICAgIG5hbWUgID0gIm5laXRoZXIgZW1wdHksIG5laXRoZXIgY29udGFpbnMiCisgICAgY2FzZXMgPSAiIT0iCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZXFfbmUoc2VsZik6CisgICAgICAgICMgVW5saWtlIHRoZSBvdGhlcnMsIHRoaXMgaXMgdGVzdGluZyB0aGF0ID09IGFuZCAhPSAqYXJlKiBhbGxvd2VkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYub3RoZXIgPT0gc2VsZi5zZXQsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0ID09IHNlbGYub3RoZXIsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYub3RoZXIgIT0gc2VsZi5zZXQsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQgIT0gc2VsZi5vdGhlciwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2dlX2d0X2xlX2x0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgPCBzZWxmLm90aGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgPD0gc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0ID4gc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0ID49IHNlbGYub3RoZXIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgPCBzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgPD0gc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyID4gc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyID49IHNlbGYuc2V0KQorCisgICAgZGVmIHRlc3RfdW5pb25fdXBkYXRlX29wZXJhdG9yKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNldCB8PSBzZWxmLm90aGVyCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIFR5cGVFcnJvciIpCisKKyAgICBkZWYgdGVzdF91bmlvbl91cGRhdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQudW5pb25fdXBkYXRlKHNlbGYub3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuc2V0LnVuaW9uX3VwZGF0ZSwgc2VsZi5vdGhlcikKKworICAgIGRlZiB0ZXN0X3VuaW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgfCBzZWxmLm90aGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciB8IHNlbGYuc2V0KQorICAgICAgICBpZiBzZWxmLm90aGVySXNJdGVyYWJsZToKKyAgICAgICAgICAgIHNlbGYuc2V0LnVuaW9uKHNlbGYub3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuc2V0LnVuaW9uLCBzZWxmLm90aGVyKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3VwZGF0ZV9vcGVyYXRvcihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXQgJj0gc2VsZi5vdGhlcgorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBUeXBlRXJyb3IiKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3VwZGF0ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6CisgICAgICAgICAgICBzZWxmLnNldC5pbnRlcnNlY3Rpb25fdXBkYXRlKHNlbGYub3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldC5pbnRlcnNlY3Rpb25fdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vdGhlcikKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0ICYgc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgJiBzZWxmLnNldCkKKyAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6CisgICAgICAgICAgICBzZWxmLnNldC5pbnRlcnNlY3Rpb24oc2VsZi5vdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zZXQuaW50ZXJzZWN0aW9uLCBzZWxmLm90aGVyKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2VfdXBkYXRlX29wZXJhdG9yKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNldCBePSBzZWxmLm90aGVyCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIFR5cGVFcnJvciIpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV91cGRhdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHNlbGYub3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldC5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm90aGVyKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCBeIHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIF4gc2VsZi5zZXQpCisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQuc3ltbWV0cmljX2RpZmZlcmVuY2Uoc2VsZi5vdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zZXQuc3ltbWV0cmljX2RpZmZlcmVuY2UsIHNlbGYub3RoZXIpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX3VwZGF0ZV9vcGVyYXRvcihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXQgLT0gc2VsZi5vdGhlcgorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBUeXBlRXJyb3IiKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZV91cGRhdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQuZGlmZmVyZW5jZV91cGRhdGUoc2VsZi5vdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0LmRpZmZlcmVuY2VfdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vdGhlcikKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCAtIHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIC0gc2VsZi5zZXQpCisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQuZGlmZmVyZW5jZShzZWxmLm90aGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnNldC5kaWZmZXJlbmNlLCBzZWxmLm90aGVyKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RPbmx5U2V0c051bWVyaWMoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgICA9IFNldCgoMSwgMiwgMykpCisgICAgICAgIHNlbGYub3RoZXIgPSAxOQorICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IEZhbHNlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdE9ubHlTZXRzRGljdChUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAgID0gU2V0KCgxLCAyLCAzKSkKKyAgICAgICAgc2VsZi5vdGhlciA9IHsxOjIsIDM6NH0KKyAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBUcnVlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdE9ubHlTZXRzT3BlcmF0b3IoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgICA9IFNldCgoMSwgMiwgMykpCisgICAgICAgIHNlbGYub3RoZXIgPSBvcGVyYXRvci5hZGQKKyAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBGYWxzZQorCisgICAgZGVmIHRlc3RfZ2VfZ3RfbGVfbHQoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHN1cGVyKFRlc3RPbmx5U2V0c09wZXJhdG9yLCBzZWxmKS50ZXN0X2dlX2d0X2xlX2x0KCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0T25seVNldHNUdXBsZShUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAgID0gU2V0KCgxLCAyLCAzKSkKKyAgICAgICAgc2VsZi5vdGhlciA9ICgyLCA0LCA2KQorICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IFRydWUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0T25seVNldHNTdHJpbmcoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgICA9IFNldCgoMSwgMiwgMykpCisgICAgICAgIHNlbGYub3RoZXIgPSAnYWJjJworICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IFRydWUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0T25seVNldHNHZW5lcmF0b3IoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZGVmIGdlbigpOgorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDAsIDEwLCAyKToKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgIHNlbGYuc2V0ICAgPSBTZXQoKDEsIDIsIDMpKQorICAgICAgICBzZWxmLm90aGVyID0gZ2VuKCkKKyAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBUcnVlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdE9ubHlTZXRzb2ZTZXRzKFRlc3RPbmx5U2V0c0luQmluYXJ5T3BzKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ICAgPSBTZXQoKDEsIDIsIDMpKQorICAgICAgICBzZWxmLm90aGVyID0gW1NldCgnYWInKSwgSW1tdXRhYmxlU2V0KCdjZCcpXQorICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IFRydWUKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0Q29weWluZyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBkdXAgPSBzZWxmLnNldC5jb3B5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZHVwKSwgbGVuKHNlbGYuc2V0KSkKKyAgICAgICAgZHVwX2xpc3QgPSBzb3J0ZWQoZHVwKQorICAgICAgICBzZXRfbGlzdCA9IHNvcnRlZChzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZHVwX2xpc3QpLCBsZW4oc2V0X2xpc3QpKQorICAgICAgICBmb3IgaSwgZWwgaW4gZW51bWVyYXRlKGR1cF9saXN0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZWwsIHNldF9saXN0W2ldKQorCisgICAgZGVmIHRlc3RfZGVlcF9jb3B5KHNlbGYpOgorICAgICAgICBkdXAgPSBjb3B5LmRlZXBjb3B5KHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFNldEVxdWFsKGR1cCwgc2VsZi5zZXQpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdENvcHlpbmdFbXB0eShUZXN0Q29weWluZyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCA9IFNldCgpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdENvcHlpbmdTaW5nbGV0b24oVGVzdENvcHlpbmcpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgPSBTZXQoWyJoZWxsbyJdKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RDb3B5aW5nVHJpcGxlKFRlc3RDb3B5aW5nKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ID0gU2V0KFsiemVybyIsIDAsIE5vbmVdKQorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc3VwZXIoVGVzdENvcHlpbmdUcmlwbGUsIHNlbGYpLnRlc3RfY29weSgpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdENvcHlpbmdUdXBsZShUZXN0Q29weWluZyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCA9IFNldChbKDEsIDIpXSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0Q29weWluZ05lc3RlZChUZXN0Q29weWluZyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCA9IFNldChbKCgxLCAyKSwgKDMsIDQpKV0pCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdElkZW50aXRpZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5hID0gU2V0KFtyYW5kb20ucmFuZHJhbmdlKDEwMCkgZm9yIGkgaW4geHJhbmdlKDUwKV0pCisgICAgICAgIHNlbGYuYiA9IFNldChbcmFuZG9tLnJhbmRyYW5nZSgxMDApIGZvciBpIGluIHhyYW5nZSg1MCldKQorCisgICAgZGVmIHRlc3RfYmlub3BzVnNTdWJzZXRzKHNlbGYpOgorICAgICAgICBhLCBiID0gc2VsZi5hLCBzZWxmLmIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgLSBiIDw9IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIC0gYSA8PSBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAmIGIgPD0gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgJiBiIDw9IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIHwgYiA+PSBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSB8IGIgPj0gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgXiBiIDw9IGEgfCBiKQorCisgICAgZGVmIHRlc3RfY29tbXV0YXRpdml0eShzZWxmKToKKyAgICAgICAgYSwgYiA9IHNlbGYuYSwgc2VsZi5iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSZiLCBiJmEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXxiLCBifGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYV5iLCBiXmEpCisgICAgICAgIGlmIGEgIT0gYjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYS1iLCBiLWEpCisKKyAgICBkZWYgdGVzdF9yZWZsZXhzaXZlX3JlbGF0aW9ucyhzZWxmKToKKyAgICAgICAgYSwgemVybyA9IHNlbGYuYSwgU2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIF4gYSwgemVybykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gYSwgemVybykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIHwgYSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICYgYSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPD0gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPj0gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gYSkKKworICAgIGRlZiB0ZXN0X3N1bW1hdGlvbnMoc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCBzdW1zIG9mIHBhcnRzIGVxdWFsIHRoZSB3aG9sZQorICAgICAgICBhLCBiID0gc2VsZi5hLCBzZWxmLmIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS1iKXwoYSZiKXwoYi1hKSwgYXxiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhJmIpfChhXmIpLCBhfGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXwoYi1hKSwgYXxiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLWIpfGIsIGF8YikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS1iKXwoYSZiKSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYi1hKXwoYSZiKSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS1iKXwoYi1hKSwgYV5iKQorCisgICAgZGVmIHRlc3RfZXhjbHVzaW9uKHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgaW52ZXJzZSBvcGVyYXRpb25zIGRvIG5vdCBvdmVybGFwCisgICAgICAgIGEsIGIsIHplcm8gPSBzZWxmLmEsIHNlbGYuYiwgU2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS1iKSZiLCB6ZXJvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChiLWEpJmEsIHplcm8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEmYikmKGFeYiksIHplcm8pCisKKyAgICBkZWYgdGVzdF9jYXJkaW5hbGl0eV9yZWxhdGlvbnMoc2VsZik6CisgICAgICAgIGEsIGIgPSBzZWxmLmEsIHNlbGYuYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhKSwgbGVuKGEtYikgKyBsZW4oYSZiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIGxlbihiLWEpICsgbGVuKGEmYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFeYiksIGxlbihhLWIpICsgbGVuKGItYSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGF8YiksIGxlbihhLWIpICsgbGVuKGEmYikgKyBsZW4oYi1hKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYV5iKSArIGxlbihhJmIpLCBsZW4oYXxiKSkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitsaWJyZWZ0ZXN0ID0gIiIiCitFeGFtcGxlIGZyb20gdGhlIExpYnJhcnkgUmVmZXJlbmNlOiAgRG9jL2xpYi9saWJzZXRzLnRleAorCis+Pj4gZnJvbSBzZXRzIGltcG9ydCBTZXQgYXMgQmFzZSAgIyBvdmVycmlkZSBfcmVwciB0byBnZXQgc29ydGVkIG91dHB1dAorPj4+IGNsYXNzIFNldChCYXNlKToKKy4uLiAgICAgZGVmIF9yZXByKHNlbGYpOgorLi4uICAgICAgICAgcmV0dXJuIEJhc2UuX3JlcHIoc2VsZiwgc29ydGVkPVRydWUpCis+Pj4gZW5naW5lZXJzID0gU2V0KFsnSm9obicsICdKYW5lJywgJ0phY2snLCAnSmFuaWNlJ10pCis+Pj4gcHJvZ3JhbW1lcnMgPSBTZXQoWydKYWNrJywgJ1NhbScsICdTdXNhbicsICdKYW5pY2UnXSkKKz4+PiBtYW5hZ2VycyA9IFNldChbJ0phbmUnLCAnSmFjaycsICdTdXNhbicsICdaYWNrJ10pCis+Pj4gZW1wbG95ZWVzID0gZW5naW5lZXJzIHwgcHJvZ3JhbW1lcnMgfCBtYW5hZ2VycyAgICAgICAgICAgIyB1bmlvbgorPj4+IGVuZ2luZWVyaW5nX21hbmFnZW1lbnQgPSBlbmdpbmVlcnMgJiBtYW5hZ2VycyAgICAgICAgICAgICMgaW50ZXJzZWN0aW9uCis+Pj4gZnVsbHRpbWVfbWFuYWdlbWVudCA9IG1hbmFnZXJzIC0gZW5naW5lZXJzIC0gcHJvZ3JhbW1lcnMgIyBkaWZmZXJlbmNlCis+Pj4gZW5naW5lZXJzLmFkZCgnTWFydmluJykKKz4+PiBwcmludCBlbmdpbmVlcnMKK1NldChbJ0phY2snLCAnSmFuZScsICdKYW5pY2UnLCAnSm9obicsICdNYXJ2aW4nXSkKKz4+PiBlbXBsb3llZXMuaXNzdXBlcnNldChlbmdpbmVlcnMpICAgICAgICAgICAjIHN1cGVyc2V0IHRlc3QKK0ZhbHNlCis+Pj4gZW1wbG95ZWVzLnVuaW9uX3VwZGF0ZShlbmdpbmVlcnMpICAgICAgICAgIyB1cGRhdGUgZnJvbSBhbm90aGVyIHNldAorPj4+IGVtcGxveWVlcy5pc3N1cGVyc2V0KGVuZ2luZWVycykKK1RydWUKKz4+PiBmb3IgZ3JvdXAgaW4gW2VuZ2luZWVycywgcHJvZ3JhbW1lcnMsIG1hbmFnZXJzLCBlbXBsb3llZXNdOgorLi4uICAgICBncm91cC5kaXNjYXJkKCdTdXNhbicpICAgICAgICAgICAgICAgICMgdW5jb25kaXRpb25hbGx5IHJlbW92ZSBlbGVtZW50CisuLi4gICAgIHByaW50IGdyb3VwCisuLi4KK1NldChbJ0phY2snLCAnSmFuZScsICdKYW5pY2UnLCAnSm9obicsICdNYXJ2aW4nXSkKK1NldChbJ0phY2snLCAnSmFuaWNlJywgJ1NhbSddKQorU2V0KFsnSmFjaycsICdKYW5lJywgJ1phY2snXSkKK1NldChbJ0phY2snLCAnSmFuZScsICdKYW5pY2UnLCAnSm9obicsICdNYXJ2aW4nLCAnU2FtJywgJ1phY2snXSkKKyIiIgorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK19fdGVzdF9fID0geydsaWJyZWZ0ZXN0JyA6IGxpYnJlZnRlc3R9CisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBpbXBvcnQgZG9jdGVzdAorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zZXRzCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgVGVzdFNldE9mU2V0cywKKyAgICAgICAgVGVzdEV4Y2VwdGlvblByb3BhZ2F0aW9uLAorICAgICAgICBUZXN0QmFzaWNPcHNFbXB0eSwKKyAgICAgICAgVGVzdEJhc2ljT3BzU2luZ2xldG9uLAorICAgICAgICBUZXN0QmFzaWNPcHNUdXBsZSwKKyAgICAgICAgVGVzdEJhc2ljT3BzVHJpcGxlLAorICAgICAgICBUZXN0QmluYXJ5T3BzLAorICAgICAgICBUZXN0VXBkYXRlT3BzLAorICAgICAgICBUZXN0TXV0YXRlLAorICAgICAgICBUZXN0U3Vic2V0RXF1YWxFbXB0eSwKKyAgICAgICAgVGVzdFN1YnNldEVxdWFsTm9uRW1wdHksCisgICAgICAgIFRlc3RTdWJzZXRFbXB0eU5vbkVtcHR5LAorICAgICAgICBUZXN0U3Vic2V0UGFydGlhbCwKKyAgICAgICAgVGVzdFN1YnNldE5vbk92ZXJsYXAsCisgICAgICAgIFRlc3RPbmx5U2V0c051bWVyaWMsCisgICAgICAgIFRlc3RPbmx5U2V0c0RpY3QsCisgICAgICAgIFRlc3RPbmx5U2V0c09wZXJhdG9yLAorICAgICAgICBUZXN0T25seVNldHNUdXBsZSwKKyAgICAgICAgVGVzdE9ubHlTZXRzU3RyaW5nLAorICAgICAgICBUZXN0T25seVNldHNHZW5lcmF0b3IsCisgICAgICAgIFRlc3RPbmx5U2V0c29mU2V0cywKKyAgICAgICAgVGVzdENvcHlpbmdFbXB0eSwKKyAgICAgICAgVGVzdENvcHlpbmdTaW5nbGV0b24sCisgICAgICAgIFRlc3RDb3B5aW5nVHJpcGxlLAorICAgICAgICBUZXN0Q29weWluZ1R1cGxlLAorICAgICAgICBUZXN0Q29weWluZ05lc3RlZCwKKyAgICAgICAgVGVzdElkZW50aXRpZXMsCisgICAgICAgIGRvY3Rlc3QuRG9jVGVzdFN1aXRlKHRlc3Rfc2V0cyksCisgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjUxN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZjUxN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZ21sbGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2dtbGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMThiY2MzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2dtbGxpYi5weQpAQCAtMCwwICsxLDQzOSBAQAoraW1wb3J0IHBwcmludAoraW1wb3J0IHJlCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitzZ21sbGliID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3NnbWxsaWInLCBkZXByZWNhdGVkPVRydWUpCisKKworY2xhc3MgRXZlbnRDb2xsZWN0b3Ioc2dtbGxpYi5TR01MUGFyc2VyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5ldmVudHMgPSBbXQorICAgICAgICBzZWxmLmFwcGVuZCA9IHNlbGYuZXZlbnRzLmFwcGVuZAorICAgICAgICBzZ21sbGliLlNHTUxQYXJzZXIuX19pbml0X18oc2VsZikKKworICAgIGRlZiBnZXRfZXZlbnRzKHNlbGYpOgorICAgICAgICAjIE5vcm1hbGl6ZSB0aGUgbGlzdCBvZiBldmVudHMgc28gdGhhdCBidWZmZXIgYXJ0ZWZhY3RzIGRvbid0CisgICAgICAgICMgc2VwYXJhdGUgcnVucyBvZiBjb250aWd1b3VzIGNoYXJhY3RlcnMuCisgICAgICAgIEwgPSBbXQorICAgICAgICBwcmV2dHlwZSA9IE5vbmUKKyAgICAgICAgZm9yIGV2ZW50IGluIHNlbGYuZXZlbnRzOgorICAgICAgICAgICAgdHlwZSA9IGV2ZW50WzBdCisgICAgICAgICAgICBpZiB0eXBlID09IHByZXZ0eXBlID09ICJkYXRhIjoKKyAgICAgICAgICAgICAgICBMWy0xXSA9ICgiZGF0YSIsIExbLTFdWzFdICsgZXZlbnRbMV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIEwuYXBwZW5kKGV2ZW50KQorICAgICAgICAgICAgcHJldnR5cGUgPSB0eXBlCisgICAgICAgIHNlbGYuZXZlbnRzID0gTAorICAgICAgICByZXR1cm4gTAorCisgICAgIyBzdHJ1Y3R1cmUgbWFya3VwCisKKyAgICBkZWYgdW5rbm93bl9zdGFydHRhZyhzZWxmLCB0YWcsIGF0dHJzKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJzdGFydHRhZyIsIHRhZywgYXR0cnMpKQorCisgICAgZGVmIHVua25vd25fZW5kdGFnKHNlbGYsIHRhZyk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiZW5kdGFnIiwgdGFnKSkKKworICAgICMgYWxsIG90aGVyIG1hcmt1cAorCisgICAgZGVmIGhhbmRsZV9jb21tZW50KHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImNvbW1lbnQiLCBkYXRhKSkKKworICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJjaGFycmVmIiwgZGF0YSkpCisKKyAgICBkZWYgaGFuZGxlX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiZGF0YSIsIGRhdGEpKQorCisgICAgZGVmIGhhbmRsZV9kZWNsKHNlbGYsIGRlY2wpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImRlY2wiLCBkZWNsKSkKKworICAgIGRlZiBoYW5kbGVfZW50aXR5cmVmKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImVudGl0eXJlZiIsIGRhdGEpKQorCisgICAgZGVmIGhhbmRsZV9waShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJwaSIsIGRhdGEpKQorCisgICAgZGVmIHVua25vd25fZGVjbChzZWxmLCBkZWNsKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJ1bmtub3duIGRlY2wiLCBkZWNsKSkKKworCitjbGFzcyBDREFUQUV2ZW50Q29sbGVjdG9yKEV2ZW50Q29sbGVjdG9yKToKKyAgICBkZWYgc3RhcnRfY2RhdGEoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmFwcGVuZCgoInN0YXJ0dGFnIiwgImNkYXRhIiwgYXR0cnMpKQorICAgICAgICBzZWxmLnNldGxpdGVyYWwoKQorCisKK2NsYXNzIEhUTUxFbnRpdHlDb2xsZWN0b3IoRXZlbnRDb2xsZWN0b3IpOgorCisgICAgZW50aXR5X29yX2NoYXJyZWYgPSByZS5jb21waWxlKCcoPzomKFthLXpBLVpdWy0uYS16QS1aMC05XSopJworICAgICAgICAnfCYjKHhbMC05YS16QS1aXSt8WzAtOV0rKSkoOz8pJykKKworICAgIGRlZiBjb252ZXJ0X2NoYXJyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiY2hhcnJlZiIsICJjb252ZXJ0IiwgbmFtZSkpCisgICAgICAgIGlmIG5hbWVbMF0gIT0gIngiOgorICAgICAgICAgICAgcmV0dXJuIEV2ZW50Q29sbGVjdG9yLmNvbnZlcnRfY2hhcnJlZihzZWxmLCBuYW1lKQorCisgICAgZGVmIGNvbnZlcnRfY29kZXBvaW50KHNlbGYsIGNvZGVwb2ludCk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiY29kZXBvaW50IiwgImNvbnZlcnQiLCBjb2RlcG9pbnQpKQorICAgICAgICBFdmVudENvbGxlY3Rvci5jb252ZXJ0X2NvZGVwb2ludChzZWxmLCBjb2RlcG9pbnQpCisKKyAgICBkZWYgY29udmVydF9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiZW50aXR5cmVmIiwgImNvbnZlcnQiLCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIEV2ZW50Q29sbGVjdG9yLmNvbnZlcnRfZW50aXR5cmVmKHNlbGYsIG5hbWUpCisKKyAgICAjIFRoZXNlIHRvIHJlY29yZCB0aGF0IHRoZXkgd2VyZSBjYWxsZWQsIHRoZW4gcGFzcyB0aGUgY2FsbCBhbG9uZworICAgICMgdG8gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc28gdGhhdCBpdCdzIGFjdGlvbnMgY2FuIGJlCisgICAgIyByZWNvcmRlZC4KKworICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJjaGFycmVmIiwgZGF0YSkpCisgICAgICAgIHNnbWxsaWIuU0dNTFBhcnNlci5oYW5kbGVfY2hhcnJlZihzZWxmLCBkYXRhKQorCisgICAgZGVmIGhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiZW50aXR5cmVmIiwgZGF0YSkpCisgICAgICAgIHNnbWxsaWIuU0dNTFBhcnNlci5oYW5kbGVfZW50aXR5cmVmKHNlbGYsIGRhdGEpCisKKworY2xhc3MgU0dNTFBhcnNlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGNvbGxlY3RvciA9IEV2ZW50Q29sbGVjdG9yCisKKyAgICBkZWYgZ2V0X2V2ZW50cyhzZWxmLCBzb3VyY2UpOgorICAgICAgICBwYXJzZXIgPSBzZWxmLmNvbGxlY3RvcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBzIGluIHNvdXJjZToKKyAgICAgICAgICAgICAgICBwYXJzZXIuZmVlZChzKQorICAgICAgICAgICAgcGFyc2VyLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgI3NlbGYuZXZlbnRzID0gcGFyc2VyLmV2ZW50cworICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIHBhcnNlci5nZXRfZXZlbnRzKCkKKworICAgIGRlZiBjaGVja19ldmVudHMoc2VsZiwgc291cmNlLCBleHBlY3RlZF9ldmVudHMpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBldmVudHMgPSBzZWxmLmdldF9ldmVudHMoc291cmNlKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAjaW1wb3J0IHN5cworICAgICAgICAgICAgI3ByaW50ID4+c3lzLnN0ZGVyciwgcHByaW50LnBmb3JtYXQoc2VsZi5ldmVudHMpCisgICAgICAgICAgICByYWlzZQorICAgICAgICBpZiBldmVudHMgIT0gZXhwZWN0ZWRfZXZlbnRzOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWNlaXZlZCBldmVudHMgZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBldmVudHNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6XG4iICsgcHByaW50LnBmb3JtYXQoZXhwZWN0ZWRfZXZlbnRzKSArCisgICAgICAgICAgICAgICAgICAgICAgIlxuUmVjZWl2ZWQ6XG4iICsgcHByaW50LnBmb3JtYXQoZXZlbnRzKSkKKworICAgIGRlZiBjaGVja19wYXJzZV9lcnJvcihzZWxmLCBzb3VyY2UpOgorICAgICAgICBwYXJzZXIgPSBFdmVudENvbGxlY3RvcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlci5mZWVkKHNvdXJjZSkKKyAgICAgICAgICAgIHBhcnNlci5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBzZ21sbGliLlNHTUxQYXJzZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBTR01MUGFyc2VFcnJvciBmb3IgJXJcblJlY2VpdmVkOlxuJXMiCisgICAgICAgICAgICAgICAgICAgICAgJSAoc291cmNlLCBwcHJpbnQucGZvcm1hdChwYXJzZXIuZ2V0X2V2ZW50cygpKSkpCisKKyAgICBkZWYgdGVzdF9kb2N0eXBlX2RlY2xfaW50ZXJuYWwoc2VsZik6CisgICAgICAgIGluc2lkZSA9ICIiIlwKK0RPQ1RZUEUgaHRtbCBQVUJMSUMgJy0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4nCisgICAgICAgICAgICAgU1lTVEVNICdodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL3N0cmljdC5kdGQnIFsKKyAgPCFFTEVNRU5UIGh0bWwgLSBPIEVNUFRZPgorICA8IUFUVExJU1QgaHRtbAorICAgICAgdmVyc2lvbiBDREFUQSAjSU1QTElFRAorICAgICAgcHJvZmlsZSBDREFUQSAnRHVibGluQ29yZSc+CisgIDwhTk9UQVRJT04gZGF0YXR5cGUgU1lTVEVNICdodHRwOi8veG1sLnB5dGhvbi5vcmcvbm90YXRpb25zL3B5dGhvbi1tb2R1bGUnPgorICA8IUVOVElUWSBteUVudGl0eSAnaW50ZXJuYWwgcGFyc2VkIGVudGl0eSc+CisgIDwhRU5USVRZIGFuRW50aXR5IFNZU1RFTSAnaHR0cDovL3htbC5weXRob24ub3JnL2VudGl0aWVzL3NvbWV0aGluZy54bWwnPgorICA8IUVOVElUWSAlIHBhcmFtRW50aXR5ICduYW1lfG5hbWV8bmFtZSc+CisgICVwYXJhbUVudGl0eTsKKyAgPCEtLSBjb21tZW50IC0tPgorXSIiIgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhJXM+IiAlIGluc2lkZV0sIFsKKyAgICAgICAgICAgICgiZGVjbCIsIGluc2lkZSksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZG9jdHlwZV9kZWNsX2V4dGVybmFsKHNlbGYpOgorICAgICAgICBpbnNpZGUgPSAiRE9DVFlQRSBodG1sIFBVQkxJQyAnLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiciCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCI8ISVzPiIgJSBpbnNpZGUsIFsKKyAgICAgICAgICAgICgiZGVjbCIsIGluc2lkZSksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfdW5kZXJzY29yZV9pbl9hdHRybmFtZShzZWxmKToKKyAgICAgICAgIyBTRiBidWcgIzQzNjYyMQorICAgICAgICAiIiJNYWtlIHN1cmUgYXR0cmlidXRlIG5hbWVzIHdpdGggdW5kZXJzY29yZXMgYXJlIGFjY2VwdGVkIiIiCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCI8YSBoYXNfdW5kZXIgX3VuZGVyPiIsIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFsoImhhc191bmRlciIsICJoYXNfdW5kZXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIl91bmRlciIsICJfdW5kZXIiKV0pLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3VuZGVyc2NvcmVfaW5fdGFnbmFtZShzZWxmKToKKyAgICAgICAgIyBTRiBidWcgIzQzNjYyMQorICAgICAgICAiIiJNYWtlIHN1cmUgdGFnIG5hbWVzIHdpdGggdW5kZXJzY29yZXMgYXJlIGFjY2VwdGVkIiIiCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCI8aGFzX3VuZGVyPjwvaGFzX3VuZGVyPiIsIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiaGFzX3VuZGVyIiwgW10pLAorICAgICAgICAgICAgKCJlbmR0YWciLCAiaGFzX3VuZGVyIiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfcXVvdGVzX2luX3VucXVvdGVkX2F0dHJzKHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyAjNDM2NjIxCisgICAgICAgICIiIkJlIHN1cmUgcXVvdGVzIGluIHVucXVvdGVkIGF0dHJpYnV0ZXMgYXJlIG1hZGUgcGFydCBvZiB0aGUgdmFsdWUiIiIKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIjxhIGhyZWY9Zm9vJ2JhclwiYmF6PiIsIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFsoImhyZWYiLCAiZm9vJ2JhclwiYmF6IildKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF94aHRtbF9lbXB0eV90YWcoc2VsZik6CisgICAgICAgICIiIkhhbmRsaW5nIG9mIFhIVE1MLXN0eWxlIGVtcHR5IHN0YXJ0IHRhZ3MiIiIKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIjxiciAvPnRleHQ8aT48L2k+IiwgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJiciIsIFtdKSwKKyAgICAgICAgICAgICgiZGF0YSIsICJ0ZXh0IiksCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImkiLCBbXSksCisgICAgICAgICAgICAoImVuZHRhZyIsICJpIiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfcHJvY2Vzc2luZ19pbnN0cnVjdGlvbl9vbmx5KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiPD9wcm9jZXNzaW5nIGluc3RydWN0aW9uPiIsIFsKKyAgICAgICAgICAgICgicGkiLCAicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiIpLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2JhZF9uZXN0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiPGE+PGI+PC9hPjwvYj4iLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbXSksCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImIiLCBbXSksCisgICAgICAgICAgICAoImVuZHRhZyIsICJhIiksCisgICAgICAgICAgICAoImVuZHRhZyIsICJiIiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfYmFyZV9hbXBlcnNhbmRzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygidGhpcyB0ZXh0ICYgY29udGFpbnMgJiBhbXBlcnNhbmRzICYiLCBbCisgICAgICAgICAgICAoImRhdGEiLCAidGhpcyB0ZXh0ICYgY29udGFpbnMgJiBhbXBlcnNhbmRzICYiKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9iYXJlX3BvaW50eV9icmFja2V0cyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoInRoaXMgPCB0ZXh0ID4gY29udGFpbnMgPCBiYXJlPnBvaW50eTwgYnJhY2tldHMiLCBbCisgICAgICAgICAgICAoImRhdGEiLCAidGhpcyA8IHRleHQgPiBjb250YWlucyA8IGJhcmU+cG9pbnR5PCBicmFja2V0cyIpLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2F0dHJfc3ludGF4KHNlbGYpOgorICAgICAgICBvdXRwdXQgPSBbCisgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICJ2IiksICgiYyIsICJ2IiksICgiZCIsICJ2IiksICgiZSIsICJlIildKQorICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgYj0ndicgYz0idiIgZD12IGU+IiIiLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhICBiID0gJ3YnIGMgPSAidiIgZCA9IHYgZT4iIiIsIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGFcbmJcbj1cbid2J1xuY1xuPVxuInYiXG5kXG49XG52XG5lPiIiIiwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YVx0Ylx0PVx0J3YnXHRjXHQ9XHQidiJcdGRcdD1cdHZcdGU+IiIiLCBvdXRwdXQpCisKKyAgICBkZWYgdGVzdF9hdHRyX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgYj0neHh4XG5cdHh4eCcgYz0ieXl5XHRcbnl5eSIgZD0nXHR4eXpcbic+IiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAieHh4XG5cdHh4eCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCAieXl5XHRcbnl5eSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImQiLCAiXHR4eXpcbiIpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSBiPScnIGM9IiI+IiIiLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIiIpLCAoImMiLCAiIildKSwKKyAgICAgICAgICAgIF0pCisgICAgICAgICMgVVJMIGNvbnN0cnVjdGlvbiBzdHVmZiBmcm9tIFJGQyAxODA4OgorICAgICAgICBzYWZlID0gIiQtXy4rIgorICAgICAgICBleHRyYSA9ICIhKicoKSwiCisgICAgICAgIHJlc2VydmVkID0gIjsvPzpAJj0iCisgICAgICAgIHVybCA9ICJodHRwOi8vZXhhbXBsZS5jb206ODA4MC9wYXRoL3RvL2ZpbGU/JXMlcyVzIiAlICgKKyAgICAgICAgICAgIHNhZmUsIGV4dHJhLCByZXNlcnZlZCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGUgYT0lcz4iIiIgJSB1cmwsIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiZSIsIFsoImEiLCB1cmwpXSksCisgICAgICAgICAgICBdKQorICAgICAgICAjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgcGF0Y2ggIzY2OTY4My4KKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIjxlIGE9cmdiKDEsMiwzKT4iLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImUiLCBbKCJhIiwgInJnYigxLDIsMykiKV0pLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2F0dHJfdmFsdWVzX2VudGl0aWVzKHNlbGYpOgorICAgICAgICAiIiJTdWJzdGl0dXRpb24gb2YgZW50aXRpZXMgYW5kIGNoYXJyZWZzIGluIGF0dHJpYnV0ZSB2YWx1ZXMiIiIKKyAgICAgICAgIyBTRiBidWcgIzE0NTIyNDYKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgYj0mbHQ7IGM9Jmx0OyZndDsgZD0mbHQtJmd0OyBlPScmbHQ7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZj0iJnh4eDsiIGc9JyYjMzI7JiMzMzsnIGg9JyYjNTAwOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaT0neD9hPWImYz1kOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaj0nJmFtcDsjNDI7JyBrPScmIzM4OyM0MjsnPiIiIiwKKyAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIjwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgIjw+IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsICImbHQtPiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImUiLCAiPCAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJmIiwgIiZ4eHg7IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZyIsICIgISIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImgiLCAiJiM1MDA7IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaSIsICJ4P2E9YiZjPWQ7IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaiIsICImIzQyOyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImsiLCAiJiM0MjsiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSldKQorCisgICAgZGVmIHRlc3RfY29udmVydF9vdmVycmlkZXMoc2VsZik6CisgICAgICAgICMgVGhpcyBjaGVja3MgdGhhdCB0aGUgY2hhcmFjdGVyIGFuZCBlbnRpdHkgcmVmZXJlbmNlCisgICAgICAgICMgY29udmVyc2lvbiBoZWxwZXJzIGFyZSBjYWxsZWQgYXQgdGhlIGRvY3VtZW50ZWQgdGltZXMuICBObworICAgICAgICAjIGF0dGVtcHQgaXMgbWFkZSB0byByZWFsbHkgY2hhbmdlIHdoYXQgdGhlIHBhcnNlciBhY2NlcHRzLgorICAgICAgICAjCisgICAgICAgIHNlbGYuY29sbGVjdG9yID0gSFRNTEVudGl0eUNvbGxlY3RvcgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygoJzxhIHRpdGxlPSImbGRxdW87dGVzdCYjeDIwMWQ7Ij5mb288L2E+JworICAgICAgICAgICAgICAgICAgICAgICAgICAgJyZmb29iYXI7JiM0MjsnKSwgWworICAgICAgICAgICAgKCdlbnRpdHlyZWYnLCAnY29udmVydCcsICdsZHF1bycpLAorICAgICAgICAgICAgKCdjaGFycmVmJywgJ2NvbnZlcnQnLCAneDIwMWQnKSwKKyAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYScsIFsoJ3RpdGxlJywgJyZsZHF1bzt0ZXN0JiN4MjAxZDsnKV0pLAorICAgICAgICAgICAgKCdkYXRhJywgJ2ZvbycpLAorICAgICAgICAgICAgKCdlbmR0YWcnLCAnYScpLAorICAgICAgICAgICAgKCdlbnRpdHlyZWYnLCAnZm9vYmFyJyksCisgICAgICAgICAgICAoJ2VudGl0eXJlZicsICdjb252ZXJ0JywgJ2Zvb2JhcicpLAorICAgICAgICAgICAgKCdjaGFycmVmJywgJzQyJyksCisgICAgICAgICAgICAoJ2NoYXJyZWYnLCAnY29udmVydCcsICc0MicpLAorICAgICAgICAgICAgKCdjb2RlcG9pbnQnLCAnY29udmVydCcsIDQyKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9hdHRyX2Z1bmt5X25hbWVzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSBhLmI9J3YnIGM6ZD12IGUtZj12PiIiIiwgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgWygiYS5iIiwgInYiKSwgKCJjOmQiLCAidiIpLCAoImUtZiIsICJ2IildKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9hdHRyX3ZhbHVlX2lwNl91cmwoc2VsZik6CisgICAgICAgICMgaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzg1MzUwNgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygoIjxhIGhyZWY9J2h0dHA6Ly9bMTA4MDo6ODo4MDA6MjAwQzo0MTdBXS8nPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YSBocmVmPWh0dHA6Ly9bMTA4MDo6ODo4MDA6MjAwQzo0MTdBXS8+IiksIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFsoImhyZWYiLCAiaHR0cDovL1sxMDgwOjo4OjgwMDoyMDBDOjQxN0FdLyIpXSksCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbKCJocmVmIiwgImh0dHA6Ly9bMTA4MDo6ODo4MDA6MjAwQzo0MTdBXS8iKV0pLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3dlaXJkX3N0YXJ0dGFncyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIjxhPGE+IiwgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgW10pLAorICAgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgW10pLAorICAgICAgICAgICAgXSkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIjwvYTxhPiIsIFsKKyAgICAgICAgICAgICgiZW5kdGFnIiwgImEiKSwKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFtdKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9kZWNsYXJhdGlvbl9qdW5rX2NoYXJzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8IURPQ1RZUEUgZm9vICQgPiIpCisKKyAgICBkZWYgdGVzdF9nZXRfc3RhcnR0YWdfdGV4dChzZWxmKToKKyAgICAgICAgcyA9ICIiIjxmb29iYXIgICBcbiAgIG9uZT0iMSJcdHR3bz0yICAgPiIiIgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhzLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImZvb2JhciIsIFsoIm9uZSIsICIxIiksICgidHdvIiwgIjIiKV0pLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2NkYXRhX2NvbnRlbnQoc2VsZik6CisgICAgICAgIHMgPSAoIjxjZGF0YT4gPCEtLSBub3QgYSBjb21tZW50IC0tPiAmbm90LWFuLWVudGl0eS1yZWY7IDwvY2RhdGE+IgorICAgICAgICAgICAgICI8bm90Y2RhdGE+IDwhLS0gY29tbWVudCAtLT4gPC9ub3RjZGF0YT4iKQorICAgICAgICBzZWxmLmNvbGxlY3RvciA9IENEQVRBRXZlbnRDb2xsZWN0b3IKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMocywgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJjZGF0YSIsIFtdKSwKKyAgICAgICAgICAgICgiZGF0YSIsICIgPCEtLSBub3QgYSBjb21tZW50IC0tPiAmbm90LWFuLWVudGl0eS1yZWY7ICIpLAorICAgICAgICAgICAgKCJlbmR0YWciLCAiY2RhdGEiKSwKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAibm90Y2RhdGEiLCBbXSksCisgICAgICAgICAgICAoImRhdGEiLCAiICIpLAorICAgICAgICAgICAgKCJjb21tZW50IiwgIiBjb21tZW50ICIpLAorICAgICAgICAgICAgKCJkYXRhIiwgIiAiKSwKKyAgICAgICAgICAgICgiZW5kdGFnIiwgIm5vdGNkYXRhIiksCisgICAgICAgICAgICBdKQorICAgICAgICBzID0gIiIiPGNkYXRhPiA8bm90IGE9J3N0YXJ0IHRhZyc+IDwvY2RhdGE+IiIiCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKHMsIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiY2RhdGEiLCBbXSksCisgICAgICAgICAgICAoImRhdGEiLCAiIDxub3QgYT0nc3RhcnQgdGFnJz4gIiksCisgICAgICAgICAgICAoImVuZHRhZyIsICJjZGF0YSIpLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2lsbGVnYWxfZGVjbGFyYXRpb25zKHNlbGYpOgorICAgICAgICBzID0gJ2FiYzwhc3BhY2VyIHR5cGU9ImJsb2NrIiBoZWlnaHQ9IjI1Ij5kZWYnCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKHMsIFsKKyAgICAgICAgICAgICgiZGF0YSIsICJhYmMiKSwKKyAgICAgICAgICAgICgidW5rbm93biBkZWNsIiwgJ3NwYWNlciB0eXBlPSJibG9jayIgaGVpZ2h0PSIyNSInKSwKKyAgICAgICAgICAgICgiZGF0YSIsICJkZWYiKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9lbnVtZXJhdGVkX2F0dHJfdHlwZShzZWxmKToKKyAgICAgICAgcyA9ICI8IURPQ1RZUEUgZG9jIFs8IUFUVExJU1QgZG9jIGF0dHIgKGEgfCBiKSA+XT4iCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKHMsIFsKKyAgICAgICAgICAgICgnZGVjbCcsICdET0NUWVBFIGRvYyBbPCFBVFRMSVNUIGRvYyBhdHRyIChhIHwgYikgPl0nKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9yZWFkX2NodW5rcyhzZWxmKToKKyAgICAgICAgIyBTRiBidWcgIzE1NDE2OTcsIHRoaXMgY2F1c2VkIHNnbWwgcGFyc2VyIHRvIGhhbmcKKyAgICAgICAgIyBKdXN0IHZlcmlmeSB0aGlzIGNvZGUgZG9lc24ndCBjYXVzZSBhIGhhbmcuCisgICAgICAgIENIVU5LID0gMTAyNCAgIyBpbmNyZWFzaW5nIHRoaXMgdG8gODIxMiBtYWtlcyB0aGUgcHJvYmxlbSBnbyBhd2F5CisKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LmZpbmRmaWxlKCdzZ21sX2lucHV0Lmh0bWwnKSkKKyAgICAgICAgZnAgPSBzZ21sbGliLlNHTUxQYXJzZXIoKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgZGF0YSA9IGYucmVhZChDSFVOSykKKyAgICAgICAgICAgIGZwLmZlZWQoZGF0YSkKKyAgICAgICAgICAgIGlmIGxlbihkYXRhKSAhPSBDSFVOSzoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIHRlc3Rfb25seV9kZWNvZGVfYXNjaWkoc2VsZik6CisgICAgICAgICMgU0YgYnVnICMxNjUxOTk1LCBtYWtlIHN1cmUgbm9uLWFzY2lpIGNoYXJhY3RlciByZWZlcmVuY2VzIGFyZSBub3QgZGVjb2RlZAorICAgICAgICBzID0gJzxzaWducyBleGNsYW1hdGlvbj0iJiMzMyIgY29weXJpZ2h0PSImIzE2OSIgcXVvdGVsZWZ0PSImIzgyMTY7Ij4nCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKHMsIFsKKyAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnc2lnbnMnLAorICAgICAgICAgICAgIFsoJ2V4Y2xhbWF0aW9uJywgJyEnKSwgKCdjb3B5cmlnaHQnLCAnJiMxNjknKSwKKyAgICAgICAgICAgICAgKCdxdW90ZWxlZnQnLCAnJiM4MjE2OycpXSksCisgICAgICAgICAgICBdKQorCisgICAgIyBYWFggVGhlc2UgdGVzdHMgaGF2ZSBiZWVuIGRpc2FibGVkIGJ5IHByZWZpeGluZyB0aGVpciBuYW1lcyB3aXRoCisgICAgIyBhbiB1bmRlcnNjb3JlLiAgVGhlIGZpcnN0IHR3byBleGVyY2lzZSBvdXRzdGFuZGluZyBidWdzIGluIHRoZQorICAgICMgc2dtbGxpYiBtb2R1bGUsIGFuZCB0aGUgdGhpcmQgZXhoaWJpdHMgcXVlc3Rpb25hYmxlIGJlaGF2aW9yCisgICAgIyB0aGF0IG5lZWRzIHRvIGJlIGNhcmVmdWxseSBjb25zaWRlcmVkIGJlZm9yZSBjaGFuZ2luZyBpdC4KKworICAgIGRlZiBfdGVzdF9zdGFydHRhZ19lbmRfYm91bmRhcnkoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCI8YSBiPSc8Jz4iLCBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICI8IildKV0pCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCI8YSBiPSc+Jz4iLCBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICI+IildKV0pCisKKyAgICBkZWYgX3Rlc3RfYnVmZmVyX2FydGVmYWN0cyhzZWxmKToKKyAgICAgICAgb3V0cHV0ID0gWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPCIpXSldCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPGEgYj0nPCc+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8YSAiLCAiYj0nPCc+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8YSBiIiwgIj0nPCc+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8YSBiPSIsICInPCc+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8YSBiPSc8IiwgIic+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8YSBiPSc8JyIsICI+Il0sIG91dHB1dCkKKworICAgICAgICBvdXRwdXQgPSBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICI+IildKV0KKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8YSBiPSc+Jz4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjxhICIsICJiPSc+Jz4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjxhIGIiLCAiPSc+Jz4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjxhIGI9IiwgIic+Jz4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjxhIGI9Jz4iLCAiJz4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjxhIGI9Jz4nIiwgIj4iXSwgb3V0cHV0KQorCisgICAgICAgIG91dHB1dCA9IFsoImNvbW1lbnQiLCAiYWJjIildCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiIiwgIjwhLS1hYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwiLCAiIS0tYWJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8ISIsICItLWFiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtIiwgIi1hYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS0iLCAiYWJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IS0tYSIsICJiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtLWFiIiwgImMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS1hYmMiLCAiLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IS0tYWJjLSIsICItPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtLWFiYy0tIiwgIj4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS1hYmMtLT4iLCAiIl0sIG91dHB1dCkKKworICAgIGRlZiBfdGVzdF9zdGFydHRhZ19qdW5rX2NoYXJzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8IikKKyAgICAgICAgc2VsZi5jaGVja19wYXJzZV9lcnJvcigiPD4iKQorICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8LyQ+IikKKyAgICAgICAgc2VsZi5jaGVja19wYXJzZV9lcnJvcigiPC8iKQorICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8L2EiKQorICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8JCIpCisgICAgICAgIHNlbGYuY2hlY2tfcGFyc2VfZXJyb3IoIjwkPiIpCisgICAgICAgIHNlbGYuY2hlY2tfcGFyc2VfZXJyb3IoIjwhIikKKyAgICAgICAgc2VsZi5jaGVja19wYXJzZV9lcnJvcigiPGEgJD4iKQorICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8YSIpCisgICAgICAgIHNlbGYuY2hlY2tfcGFyc2VfZXJyb3IoIjxhIGZvbz0nYmFyJyIpCisgICAgICAgIHNlbGYuY2hlY2tfcGFyc2VfZXJyb3IoIjxhIGZvbz0nYmFyIikKKyAgICAgICAgc2VsZi5jaGVja19wYXJzZV9lcnJvcigiPGEgZm9vPSc+JyIpCisgICAgICAgIHNlbGYuY2hlY2tfcGFyc2VfZXJyb3IoIjxhIGZvbz0nPiIpCisgICAgICAgIHNlbGYuY2hlY2tfcGFyc2VfZXJyb3IoIjxhIGZvbz0+IikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTR01MUGFyc2VyVGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2dtbGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZ21sbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzk3YjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2dtbGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2dtbGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZ21sbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzk3YjdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2dtbGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hhLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzg0MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGEucHkKQEAgLTAsMCArMSw1NiBAQAorIyBUZXN0aW5nIHNoYSBtb2R1bGUgKE5JU1QncyBTZWN1cmUgSGFzaCBBbGdvcml0aG0pCisKKyMgdXNlIHRoZSB0aHJlZSBleGFtcGxlcyBmcm9tIEZlZGVyYWwgSW5mb3JtYXRpb24gUHJvY2Vzc2luZyBTdGFuZGFyZHMKKyMgUHVibGljYXRpb24gMTgwLTEsIFNlY3VyZSBIYXNoIFN0YW5kYXJkLCAgMTk5NSBBcHJpbCAxNworIyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTcvcHVicy9maXAxODAtMS5odG0KKworaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInRoZSBzaGEgbW9kdWxlIGlzIGRlcHJlY2F0ZWQuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCisKK2ltcG9ydCBzaGEKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitjbGFzcyBTSEFUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGNoZWNrKHNlbGYsIGRhdGEsIGRpZ2VzdCk6CisgICAgICAgICMgQ2hlY2sgZGlnZXN0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIHZhbHVlCisgICAgICAgIG9iaiA9IHNoYS5uZXcoZGF0YSkKKyAgICAgICAgY29tcHV0ZWQgPSBvYmouaGV4ZGlnZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbXB1dGVkID09IGRpZ2VzdCkKKworICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSB2YWx1ZSBkb2Vzbid0IGNoYW5nZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZQorICAgICAgICAjIGRpZ2VzdCBvcGVyYXRpb25zLgorICAgICAgICBjb21wdXRlZF9hZ2FpbiA9IG9iai5oZXhkaWdlc3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcHV0ZWQgPT0gY29tcHV0ZWRfYWdhaW4pCisKKyAgICAgICAgIyBDaGVjayBoZXhkaWdlc3QoKSBvdXRwdXQgbWF0Y2hlcyBkaWdlc3QoKSdzIG91dHB1dAorICAgICAgICBkaWdlc3QgPSBvYmouZGlnZXN0KCkKKyAgICAgICAgaGV4ZCA9ICIiCisgICAgICAgIGZvciBjIGluIGRpZ2VzdDoKKyAgICAgICAgICAgIGhleGQgKz0gJyUwMngnICUgb3JkKGMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21wdXRlZCA9PSBoZXhkKQorCisgICAgZGVmIHRlc3RfY2FzZV8xKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCJhYmMiLAorICAgICAgICAgICAgICAgICAgICJhOTk5M2UzNjQ3MDY4MTZhYmEzZTI1NzE3ODUwYzI2YzljZDBkODlkIikKKworICAgIGRlZiB0ZXN0X2Nhc2VfMihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLAorICAgICAgICAgICAgICAgICAgICI4NDk4M2U0NDFjM2JkMjZlYmFhZTRhYTFmOTUxMjllNWU1NDY3MGYxIikKKworICAgIGRlZiB0ZXN0X2Nhc2VfMyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygiYSIgKiAxMDAwMDAwLAorICAgICAgICAgICAgICAgICAgICIzNGFhOTczY2Q0YzRkYWE0ZjYxZWViMmJkYmFkMjczMTY1MzQwMTZmIikKKworICAgIGRlZiB0ZXN0X2Nhc2VfNChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjayhjaHIoMHhBQSkgKiA4MCwKKyAgICAgICAgICAgICAgICAgICAnNGNhMGVmMzhmMTc5NGIyOGE4ZjhlZTExMGVlNzlkNDhjZTEzYmUyNScpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFNIQVRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoYS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjhjY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoYS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZjhjY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoZWx2ZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoZWx2ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjU2NjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hlbHZlLnB5CkBAIC0wLDAgKzEsMTYzIEBACitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNoZWx2ZQoraW1wb3J0IGdsb2IKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK3Rlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdhbnlkYm0nLCBkZXByZWNhdGVkPVRydWUpCisKK2NsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGZuID0gInNoZWxmdGVtcCIgKyBvcy5leHRzZXAgKyAiZGIiCisKKyAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKKyAgICAgICAgZDEgPSB7fQorICAgICAgICBzID0gc2hlbHZlLlNoZWxmKGQxLCBwcm90b2NvbD0yLCB3cml0ZWJhY2s9RmFsc2UpCisgICAgICAgIHNbJ2tleTEnXSA9IFsxLDIsMyw0XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbJ2tleTEnXSwgWzEsMiwzLDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgMSkKKyAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxlbiwgcykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc1sna2V5MSddCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdDbG9zZWQgc2hlbGYgc2hvdWxkIG5vdCBmaW5kIGEga2V5JykKKworICAgIGRlZiB0ZXN0X2FzY2lpX2ZpbGVfc2hlbGYoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSBzaGVsdmUub3BlbihzZWxmLmZuLCBwcm90b2NvbD0wKQorICAgICAgICAgICAgc1sna2V5MSddID0gKDEsMiwzLDQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbJ2tleTEnXSwgKDEsMiwzLDQpKQorICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmb3IgZiBpbiBnbG9iLmdsb2Ioc2VsZi5mbisiKiIpOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhmKQorCisgICAgZGVmIHRlc3RfYmluYXJ5X2ZpbGVfc2hlbGYoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSBzaGVsdmUub3BlbihzZWxmLmZuLCBwcm90b2NvbD0xKQorICAgICAgICAgICAgc1sna2V5MSddID0gKDEsMiwzLDQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbJ2tleTEnXSwgKDEsMiwzLDQpKQorICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmb3IgZiBpbiBnbG9iLmdsb2Ioc2VsZi5mbisiKiIpOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhmKQorCisgICAgZGVmIHRlc3RfcHJvdG8yX2ZpbGVfc2hlbGYoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSBzaGVsdmUub3BlbihzZWxmLmZuLCBwcm90b2NvbD0yKQorICAgICAgICAgICAgc1sna2V5MSddID0gKDEsMiwzLDQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbJ2tleTEnXSwgKDEsMiwzLDQpKQorICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmb3IgZiBpbiBnbG9iLmdsb2Ioc2VsZi5mbisiKiIpOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhmKQorCisgICAgZGVmIHRlc3RfaW5fbWVtb3J5X3NoZWxmKHNlbGYpOgorICAgICAgICBkMSA9IHt9CisgICAgICAgIHMgPSBzaGVsdmUuU2hlbGYoZDEsIHByb3RvY29sPTApCisgICAgICAgIHNbJ2tleTEnXSA9ICgxLDIsMyw0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbJ2tleTEnXSwgKDEsMiwzLDQpKQorICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgZDIgPSB7fQorICAgICAgICBzID0gc2hlbHZlLlNoZWxmKGQyLCBwcm90b2NvbD0xKQorICAgICAgICBzWydrZXkxJ10gPSAoMSwyLDMsNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWydrZXkxJ10sICgxLDIsMyw0KSkKKyAgICAgICAgcy5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGQxLCBkMikKKworICAgIGRlZiB0ZXN0X211dGFibGVfZW50cnkoc2VsZik6CisgICAgICAgIGQxID0ge30KKyAgICAgICAgcyA9IHNoZWx2ZS5TaGVsZihkMSwgcHJvdG9jb2w9Miwgd3JpdGViYWNrPUZhbHNlKQorICAgICAgICBzWydrZXkxJ10gPSBbMSwyLDMsNF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWydrZXkxJ10sIFsxLDIsMyw0XSkKKyAgICAgICAgc1sna2V5MSddLmFwcGVuZCg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbJ2tleTEnXSwgWzEsMiwzLDRdKQorICAgICAgICBzLmNsb3NlKCkKKworICAgICAgICBkMiA9IHt9CisgICAgICAgIHMgPSBzaGVsdmUuU2hlbGYoZDIsIHByb3RvY29sPTIsIHdyaXRlYmFjaz1UcnVlKQorICAgICAgICBzWydrZXkxJ10gPSBbMSwyLDMsNF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWydrZXkxJ10sIFsxLDIsMyw0XSkKKyAgICAgICAgc1sna2V5MSddLmFwcGVuZCg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbJ2tleTEnXSwgWzEsMiwzLDQsNV0pCisgICAgICAgIHMuY2xvc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZDIpLCAxKQorCisgICAgZGVmIHRlc3Rfd3JpdGViYWNrX2Fsc29fd3JpdGVzX2ltbWVkaWF0ZWx5KHNlbGYpOgorICAgICAgICAjIElzc3VlIDU3NTQKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHMgPSBzaGVsdmUuU2hlbGYoZCwgd3JpdGViYWNrPVRydWUpCisgICAgICAgIHNbJ2tleSddID0gWzFdCisgICAgICAgIHAxID0gZFsna2V5J10gICMgV2lsbCBnaXZlIGEgS2V5RXJyb3IgaWYgYmFja2luZyBzdG9yZSBub3QgdXBkYXRlZAorICAgICAgICBzWydrZXknXS5hcHBlbmQoMikKKyAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIHAyID0gZFsna2V5J10KKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwMSwgcDIpICAjIFdyaXRlIGNyZWF0ZXMgbmV3IG9iamVjdCBpbiBzdG9yZQorCisKK2Zyb20gdGVzdCBpbXBvcnQgbWFwcGluZ190ZXN0cworCitjbGFzcyBUZXN0U2hlbHZlQmFzZShtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CisgICAgZm4gPSAic2hlbGZ0ZW1wLmRiIgorICAgIGNvdW50ZXIgPSAwCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgc2VsZi5fZGIgPSBbXQorICAgICAgICBtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKKyAgICB0eXBlMnRlc3QgPSBzaGVsdmUuU2hlbGYKKyAgICBkZWYgX3JlZmVyZW5jZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHsia2V5MSI6InZhbHVlMSIsICJrZXkyIjoyLCAia2V5MyI6KDEsMiwzKX0KKyAgICBkZWYgX2VtcHR5X21hcHBpbmcoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2luX21lbToKKyAgICAgICAgICAgIHg9IHNoZWx2ZS5TaGVsZih7fSwgKipzZWxmLl9hcmdzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jb3VudGVyKz0xCisgICAgICAgICAgICB4PSBzaGVsdmUub3BlbihzZWxmLmZuK3N0cihzZWxmLmNvdW50ZXIpLCAqKnNlbGYuX2FyZ3MpCisgICAgICAgIHNlbGYuX2RiLmFwcGVuZCh4KQorICAgICAgICByZXR1cm4geAorICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIGRiIGluIHNlbGYuX2RiOgorICAgICAgICAgICAgZGIuY2xvc2UoKQorICAgICAgICBzZWxmLl9kYiA9IFtdCisgICAgICAgIGlmIG5vdCBzZWxmLl9pbl9tZW06CisgICAgICAgICAgICBmb3IgZiBpbiBnbG9iLmdsb2Ioc2VsZi5mbisiKiIpOgorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoZikKKworY2xhc3MgVGVzdEFzY2lpRmlsZVNoZWx2ZShUZXN0U2hlbHZlQmFzZSk6CisgICAgX2FyZ3M9eydwcm90b2NvbCc6MH0KKyAgICBfaW5fbWVtID0gRmFsc2UKK2NsYXNzIFRlc3RCaW5hcnlGaWxlU2hlbHZlKFRlc3RTaGVsdmVCYXNlKToKKyAgICBfYXJncz17J3Byb3RvY29sJzoxfQorICAgIF9pbl9tZW0gPSBGYWxzZQorY2xhc3MgVGVzdFByb3RvMkZpbGVTaGVsdmUoVGVzdFNoZWx2ZUJhc2UpOgorICAgIF9hcmdzPXsncHJvdG9jb2wnOjJ9CisgICAgX2luX21lbSA9IEZhbHNlCitjbGFzcyBUZXN0QXNjaWlNZW1TaGVsdmUoVGVzdFNoZWx2ZUJhc2UpOgorICAgIF9hcmdzPXsncHJvdG9jb2wnOjB9CisgICAgX2luX21lbSA9IFRydWUKK2NsYXNzIFRlc3RCaW5hcnlNZW1TaGVsdmUoVGVzdFNoZWx2ZUJhc2UpOgorICAgIF9hcmdzPXsncHJvdG9jb2wnOjF9CisgICAgX2luX21lbSA9IFRydWUKK2NsYXNzIFRlc3RQcm90bzJNZW1TaGVsdmUoVGVzdFNoZWx2ZUJhc2UpOgorICAgIF9hcmdzPXsncHJvdG9jb2wnOjJ9CisgICAgX2luX21lbSA9IFRydWUKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFRlc3RBc2NpaUZpbGVTaGVsdmUsCisgICAgICAgIFRlc3RCaW5hcnlGaWxlU2hlbHZlLAorICAgICAgICBUZXN0UHJvdG8yRmlsZVNoZWx2ZSwKKyAgICAgICAgVGVzdEFzY2lpTWVtU2hlbHZlLAorICAgICAgICBUZXN0QmluYXJ5TWVtU2hlbHZlLAorICAgICAgICBUZXN0UHJvdG8yTWVtU2hlbHZlLAorICAgICAgICBUZXN0Q2FzZQorICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hlbHZlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoZWx2ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4NmI0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoZWx2ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hlbHZlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoZWx2ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4NmI0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoZWx2ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hsZXgucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGxleC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzM1ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hsZXgucHkKQEAgLTAsMCArMSwxOTEgQEAKKyMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNobGV4CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCisKKyMgVGhlIG9yaWdpbmFsIHRlc3QgZGF0YSBzZXQgd2FzIGZyb20gc2hlbGx3b3JkcywgYnkgSGFydG11dCBHb2ViZWwuCisKK2RhdGEgPSByIiIieHx4fAorZm9vIGJhcnxmb298YmFyfAorIGZvbyBiYXJ8Zm9vfGJhcnwKKyBmb28gYmFyIHxmb298YmFyfAorZm9vICAgYmFyICAgIGJsYSAgICAgZmFzZWx8Zm9vfGJhcnxibGF8ZmFzZWx8Cit4IHkgIHogICAgICAgICAgICAgIHh4eHh8eHx5fHp8eHh4eHwKK1x4IGJhcnxcfHh8YmFyfAorXCB4IGJhcnxcfHh8YmFyfAorXCBiYXJ8XHxiYXJ8Citmb28gXHggYmFyfGZvb3xcfHh8YmFyfAorZm9vIFwgeCBiYXJ8Zm9vfFx8eHxiYXJ8Citmb28gXCBiYXJ8Zm9vfFx8YmFyfAorZm9vICJiYXIiIGJsYXxmb298ImJhciJ8YmxhfAorImZvbyIgImJhciIgImJsYSJ8ImZvbyJ8ImJhciJ8ImJsYSJ8CisiZm9vIiBiYXIgImJsYSJ8ImZvbyJ8YmFyfCJibGEifAorImZvbyIgYmFyIGJsYXwiZm9vInxiYXJ8YmxhfAorZm9vICdiYXInIGJsYXxmb298J2Jhcid8YmxhfAorJ2ZvbycgJ2JhcicgJ2JsYSd8J2Zvbyd8J2Jhcid8J2JsYSd8CisnZm9vJyBiYXIgJ2JsYSd8J2Zvbyd8YmFyfCdibGEnfAorJ2ZvbycgYmFyIGJsYXwnZm9vJ3xiYXJ8YmxhfAorYmx1cmIgZm9vImJhciJiYXIiZmFzZWwiIGJhenxibHVyYnxmb28iYmFyImJhciJmYXNlbCJ8YmF6fAorYmx1cmIgZm9vJ2JhcidiYXInZmFzZWwnIGJhenxibHVyYnxmb28nYmFyJ2JhcidmYXNlbCd8YmF6fAorIiJ8IiJ8CisnJ3wnJ3wKK2ZvbyAiIiBiYXJ8Zm9vfCIifGJhcnwKK2ZvbyAnJyBiYXJ8Zm9vfCcnfGJhcnwKK2ZvbyAiIiAiIiAiIiBiYXJ8Zm9vfCIifCIifCIifGJhcnwKK2ZvbyAnJyAnJyAnJyBiYXJ8Zm9vfCcnfCcnfCcnfGJhcnwKK1wiInxcfCIifAorIlwifCJcInwKKyJmb29cIGJhciJ8ImZvb1wgYmFyInwKKyJmb29cXCBiYXIifCJmb29cXCBiYXIifAorImZvb1xcIGJhclwifCJmb29cXCBiYXJcInwKKyJmb29cXCIgYmFyXCIifCJmb29cXCJ8YmFyfFx8IiJ8CisiZm9vXFwgYmFyXCIgZGZhZGYifCJmb29cXCBiYXJcInxkZmFkZiJ8CisiZm9vXFxcIGJhclwiIGRmYWRmInwiZm9vXFxcIGJhclwifGRmYWRmInwKKyJmb29cXFx4IGJhclwiIGRmYWRmInwiZm9vXFxceCBiYXJcInxkZmFkZiJ8CisiZm9vXHggYmFyXCIgZGZhZGYifCJmb29ceCBiYXJcInxkZmFkZiJ8CitcJyd8XHwnJ3wKKydmb29cIGJhcid8J2Zvb1wgYmFyJ3wKKydmb29cXCBiYXInfCdmb29cXCBiYXInfAorImZvb1xcXHggYmFyXCIgZGYnYVwgJ2RmJ3wiZm9vXFxceCBiYXJcInxkZidhfFx8J2RmJ3wKK1wiZm9vInxcfCJmb28ifAorXCJmb28iXHh8XHwiZm9vInxcfHh8CisiZm9vXHgifCJmb29ceCJ8CisiZm9vXCAifCJmb29cICJ8Citmb29cIHh4fGZvb3xcfHh4fAorZm9vXCB4XHh8Zm9vfFx8eHxcfHh8Citmb29cIHhceFwiInxmb298XHx4fFx8eHxcfCIifAorImZvb1wgeFx4InwiZm9vXCB4XHgifAorImZvb1wgeFx4XFwifCJmb29cIHhceFxcInwKKyJmb29cIHhceFxcIiJmb29iYXIifCJmb29cIHhceFxcInwiZm9vYmFyInwKKyJmb29cIHhceFxcIlwnJyJmb29iYXIifCJmb29cIHhceFxcInxcfCcnfCJmb29iYXIifAorImZvb1wgeFx4XFwiXCciZm8nb2JhciJ8ImZvb1wgeFx4XFwifFx8JyJmbyd8b2JhciJ8CisiZm9vXCB4XHhcXCJcJyJmbydvYmFyIiAnZG9uJ1wnJ3QnfCJmb29cIHhceFxcInxcfCciZm8nfG9iYXIifCdkb24nfFx8Jyd8dCd8CisnZm9vXCBiYXInfCdmb29cIGJhcid8CisnZm9vXFwgYmFyJ3wnZm9vXFwgYmFyJ3wKK2Zvb1wgYmFyfGZvb3xcfGJhcnwKK2ZvbyNiYXJcbmJhenxmb29iYXp8Cis6LSkgOy0pfDp8LXwpfDt8LXwpfAor4ent8/p84XzpfO1883z6fAorIiIiCisKK3Bvc2l4X2RhdGEgPSByIiIieHx4fAorZm9vIGJhcnxmb298YmFyfAorIGZvbyBiYXJ8Zm9vfGJhcnwKKyBmb28gYmFyIHxmb298YmFyfAorZm9vICAgYmFyICAgIGJsYSAgICAgZmFzZWx8Zm9vfGJhcnxibGF8ZmFzZWx8Cit4IHkgIHogICAgICAgICAgICAgIHh4eHh8eHx5fHp8eHh4eHwKK1x4IGJhcnx4fGJhcnwKK1wgeCBiYXJ8IHh8YmFyfAorXCBiYXJ8IGJhcnwKK2ZvbyBceCBiYXJ8Zm9vfHh8YmFyfAorZm9vIFwgeCBiYXJ8Zm9vfCB4fGJhcnwKK2ZvbyBcIGJhcnxmb298IGJhcnwKK2ZvbyAiYmFyIiBibGF8Zm9vfGJhcnxibGF8CisiZm9vIiAiYmFyIiAiYmxhInxmb298YmFyfGJsYXwKKyJmb28iIGJhciAiYmxhInxmb298YmFyfGJsYXwKKyJmb28iIGJhciBibGF8Zm9vfGJhcnxibGF8Citmb28gJ2JhcicgYmxhfGZvb3xiYXJ8YmxhfAorJ2ZvbycgJ2JhcicgJ2JsYSd8Zm9vfGJhcnxibGF8CisnZm9vJyBiYXIgJ2JsYSd8Zm9vfGJhcnxibGF8CisnZm9vJyBiYXIgYmxhfGZvb3xiYXJ8YmxhfAorYmx1cmIgZm9vImJhciJiYXIiZmFzZWwiIGJhenxibHVyYnxmb29iYXJiYXJmYXNlbHxiYXp8CitibHVyYiBmb28nYmFyJ2JhcidmYXNlbCcgYmF6fGJsdXJifGZvb2JhcmJhcmZhc2VsfGJhenwKKyIifHwKKycnfHwKK2ZvbyAiIiBiYXJ8Zm9vfHxiYXJ8Citmb28gJycgYmFyfGZvb3x8YmFyfAorZm9vICIiICIiICIiIGJhcnxmb298fHx8YmFyfAorZm9vICcnICcnICcnIGJhcnxmb298fHx8YmFyfAorXCJ8InwKKyJcIiJ8InwKKyJmb29cIGJhciJ8Zm9vXCBiYXJ8CisiZm9vXFwgYmFyInxmb29cIGJhcnwKKyJmb29cXCBiYXJcIiJ8Zm9vXCBiYXIifAorImZvb1xcIiBiYXJcInxmb29cfGJhciJ8CisiZm9vXFwgYmFyXCIgZGZhZGYifGZvb1wgYmFyIiBkZmFkZnwKKyJmb29cXFwgYmFyXCIgZGZhZGYifGZvb1xcIGJhciIgZGZhZGZ8CisiZm9vXFxceCBiYXJcIiBkZmFkZiJ8Zm9vXFx4IGJhciIgZGZhZGZ8CisiZm9vXHggYmFyXCIgZGZhZGYifGZvb1x4IGJhciIgZGZhZGZ8CitcJ3wnfAorJ2Zvb1wgYmFyJ3xmb29cIGJhcnwKKydmb29cXCBiYXInfGZvb1xcIGJhcnwKKyJmb29cXFx4IGJhclwiIGRmJ2FcICdkZiJ8Zm9vXFx4IGJhciIgZGYnYVwgJ2RmfAorXCJmb298ImZvb3wKK1wiZm9vXHh8ImZvb3h8CisiZm9vXHgifGZvb1x4fAorImZvb1wgInxmb29cIHwKK2Zvb1wgeHh8Zm9vIHh4fAorZm9vXCB4XHh8Zm9vIHh4fAorZm9vXCB4XHhcInxmb28geHgifAorImZvb1wgeFx4Inxmb29cIHhceHwKKyJmb29cIHhceFxcInxmb29cIHhceFx8CisiZm9vXCB4XHhcXCIiZm9vYmFyInxmb29cIHhceFxmb29iYXJ8CisiZm9vXCB4XHhcXCJcJyJmb29iYXIifGZvb1wgeFx4XCdmb29iYXJ8CisiZm9vXCB4XHhcXCJcJyJmbydvYmFyInxmb29cIHhceFwnZm8nb2JhcnwKKyJmb29cIHhceFxcIlwnImZvJ29iYXIiICdkb24nXCcndCd8Zm9vXCB4XHhcJ2ZvJ29iYXJ8ZG9uJ3R8CisiZm9vXCB4XHhcXCJcJyJmbydvYmFyIiAnZG9uJ1wnJ3QnIFxcfGZvb1wgeFx4XCdmbydvYmFyfGRvbid0fFx8CisnZm9vXCBiYXInfGZvb1wgYmFyfAorJ2Zvb1xcIGJhcid8Zm9vXFwgYmFyfAorZm9vXCBiYXJ8Zm9vIGJhcnwKK2ZvbyNiYXJcbmJhenxmb298YmF6fAorOi0pIDstKXw6LSl8Oy0pfAor4ent8/p84ent8/p8CisiIiIKKworY2xhc3MgU2hsZXhUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZGF0YSA9IFt4LnNwbGl0KCJ8IilbOi0xXQorICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gZGF0YS5zcGxpdGxpbmVzKCldCisgICAgICAgIHNlbGYucG9zaXhfZGF0YSA9IFt4LnNwbGl0KCJ8IilbOi0xXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gcG9zaXhfZGF0YS5zcGxpdGxpbmVzKCldCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYuZGF0YToKKyAgICAgICAgICAgIGl0ZW1bMF0gPSBpdGVtWzBdLnJlcGxhY2UociJcbiIsICJcbiIpCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYucG9zaXhfZGF0YToKKyAgICAgICAgICAgIGl0ZW1bMF0gPSBpdGVtWzBdLnJlcGxhY2UociJcbiIsICJcbiIpCisKKyAgICBkZWYgc3BsaXRUZXN0KHNlbGYsIGRhdGEsIGNvbW1lbnRzKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGRhdGEpKToKKyAgICAgICAgICAgIGwgPSBzaGxleC5zcGxpdChkYXRhW2ldWzBdLCBjb21tZW50cz1jb21tZW50cykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgZGF0YVtpXVsxOl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogJXMgIT0gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRhdGFbaV1bMF0sIGwsIGRhdGFbaV1bMTpdKSkKKworICAgIGRlZiBvbGRTcGxpdChzZWxmLCBzKToKKyAgICAgICAgcmV0ID0gW10KKyAgICAgICAgbGV4ID0gc2hsZXguc2hsZXgoU3RyaW5nSU8ocykpCisgICAgICAgIHRvayA9IGxleC5nZXRfdG9rZW4oKQorICAgICAgICB3aGlsZSB0b2s6CisgICAgICAgICAgICByZXQuYXBwZW5kKHRvaykKKyAgICAgICAgICAgIHRvayA9IGxleC5nZXRfdG9rZW4oKQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgdGVzdFNwbGl0UG9zaXgoc2VsZik6CisgICAgICAgICIiIlRlc3QgZGF0YSBzcGxpdHRpbmcgd2l0aCBwb3NpeCBwYXJzZXIiIiIKKyAgICAgICAgc2VsZi5zcGxpdFRlc3Qoc2VsZi5wb3NpeF9kYXRhLCBjb21tZW50cz1UcnVlKQorCisgICAgZGVmIHRlc3RDb21wYXQoc2VsZik6CisgICAgICAgICIiIlRlc3QgY29tcGF0aWJpbGl0eSBpbnRlcmZhY2UiIiIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZGF0YSkpOgorICAgICAgICAgICAgbCA9IHNlbGYub2xkU3BsaXQoc2VsZi5kYXRhW2ldWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLCBzZWxmLmRhdGFbaV1bMTpdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmRhdGFbaV1bMF0sIGwsIHNlbGYuZGF0YVtpXVsxOl0pKQorCisjIEFsbG93IHRoaXMgdGVzdCB0byBiZSB1c2VkIHdpdGggb2xkIHNobGV4LnB5CitpZiBub3QgZ2V0YXR0cihzaGxleCwgInNwbGl0IiwgTm9uZSk6CisgICAgZm9yIG1ldGhuYW1lIGluIGRpcihTaGxleFRlc3QpOgorICAgICAgICBpZiBtZXRobmFtZS5zdGFydHN3aXRoKCJ0ZXN0IikgYW5kIG1ldGhuYW1lICE9ICJ0ZXN0Q29tcGF0IjoKKyAgICAgICAgICAgIGRlbGF0dHIoU2hsZXhUZXN0LCBtZXRobmFtZSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU2hsZXhUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGxleC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGxleC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlODdmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NobGV4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGxleC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGxleC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlODdmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NobGV4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaHV0aWwucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaHV0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkYjcyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NodXRpbC5weQpAQCAtMCwwICsxLDg2NSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc2h1dGlsCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdGF0CitpbXBvcnQgb3MKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgZXJybm8KK2Zyb20gb3MucGF0aCBpbXBvcnQgc3BsaXRkcml2ZQorZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZSwgc3Bhd24KK2Zyb20gc2h1dGlsIGltcG9ydCAoX21ha2VfdGFyYmFsbCwgX21ha2VfemlwZmlsZSwgbWFrZV9hcmNoaXZlLAorICAgICAgICAgICAgICAgICAgICByZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdCwgdW5yZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgZ2V0X2FyY2hpdmVfZm9ybWF0cykKK2ltcG9ydCB0YXJmaWxlCitpbXBvcnQgd2FybmluZ3MKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgY2hlY2tfd2FybmluZ3MsIGNhcHR1cmVkX3N0ZG91dAorCitURVNURk4yID0gVEVTVEZOICsgIjIiCisKK3RyeToKKyAgICBpbXBvcnQgZ3JwCisgICAgaW1wb3J0IHB3ZAorICAgIFVJRF9HSURfU1VQUE9SVCA9IFRydWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBVSURfR0lEX1NVUFBPUlQgPSBGYWxzZQorCit0cnk6CisgICAgaW1wb3J0IHpsaWIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB6bGliID0gTm9uZQorCit0cnk6CisgICAgaW1wb3J0IHppcGZpbGUKKyAgICBaSVBfU1VQUE9SVCA9IFRydWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBaSVBfU1VQUE9SVCA9IGZpbmRfZXhlY3V0YWJsZSgnemlwJykKKworY2xhc3MgVGVzdFNodXRpbCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RTaHV0aWwsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi50ZW1wZGlycyA9IFtdCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RTaHV0aWwsIHNlbGYpLnRlYXJEb3duKCkKKyAgICAgICAgd2hpbGUgc2VsZi50ZW1wZGlyczoKKyAgICAgICAgICAgIGQgPSBzZWxmLnRlbXBkaXJzLnBvcCgpCisgICAgICAgICAgICBzaHV0aWwucm10cmVlKGQsIG9zLm5hbWUgaW4gKCdudCcsICdjeWd3aW4nKSkKKworICAgIGRlZiB3cml0ZV9maWxlKHNlbGYsIHBhdGgsIGNvbnRlbnQ9J3h4eCcpOgorICAgICAgICAiIiJXcml0ZXMgYSBmaWxlIGluIHRoZSBnaXZlbiBwYXRoLgorCisKKyAgICAgICAgcGF0aCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBzZXF1ZW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKCpwYXRoKQorICAgICAgICBmID0gb3BlbihwYXRoLCAndycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoY29udGVudCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIG1rZHRlbXAoc2VsZik6CisgICAgICAgICIiIkNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdGhhdCB3aWxsIGJlIGNsZWFuZWQgdXAuCisKKyAgICAgICAgUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZGlyZWN0b3J5LgorICAgICAgICAiIiIKKyAgICAgICAgZCA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBzZWxmLnRlbXBkaXJzLmFwcGVuZChkKQorICAgICAgICByZXR1cm4gZAorICAgIGRlZiB0ZXN0X3JtdHJlZV9lcnJvcnMoc2VsZik6CisgICAgICAgICMgZmlsZW5hbWUgaXMgZ3VhcmFudGVlZCBub3QgdG8gZXhpc3QKKyAgICAgICAgZmlsZW5hbWUgPSB0ZW1wZmlsZS5ta3RlbXAoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBzaHV0aWwucm10cmVlLCBmaWxlbmFtZSkKKworICAgICMgU2VlIGJ1ZyAjMTA3MTUxMyBmb3Igd2h5IHdlIGRvbid0IHJ1biB0aGlzIG9uIGN5Z3dpbgorICAgICMgYW5kIGJ1ZyAjMTA3NjQ2NyBmb3Igd2h5IHdlIGRvbid0IHJ1biB0aGlzIGFzIHJvb3QuCisgICAgaWYgKGhhc2F0dHIob3MsICdjaG1vZCcpIGFuZCBzeXMucGxhdGZvcm1bOjZdICE9ICdjeWd3aW4nCisgICAgICAgIGFuZCBub3QgKGhhc2F0dHIob3MsICdnZXRldWlkJykgYW5kIG9zLmdldGV1aWQoKSA9PSAwKSk6CisgICAgICAgIGRlZiB0ZXN0X29uX2Vycm9yKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5lcnJvclN0YXRlID0gMAorICAgICAgICAgICAgb3MubWtkaXIoVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5jaGlsZHBhdGggPSBvcy5wYXRoLmpvaW4oVEVTVEZOLCAnYScpCisgICAgICAgICAgICBmID0gb3BlbihzZWxmLmNoaWxkcGF0aCwgJ3cnKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBvbGRfZGlyX21vZGUgPSBvcy5zdGF0KFRFU1RGTikuc3RfbW9kZQorICAgICAgICAgICAgb2xkX2NoaWxkX21vZGUgPSBvcy5zdGF0KHNlbGYuY2hpbGRwYXRoKS5zdF9tb2RlCisgICAgICAgICAgICAjIE1ha2UgdW53cml0YWJsZS4KKyAgICAgICAgICAgIG9zLmNobW9kKHNlbGYuY2hpbGRwYXRoLCBzdGF0LlNfSVJFQUQpCisgICAgICAgICAgICBvcy5jaG1vZChURVNURk4sIHN0YXQuU19JUkVBRCkKKworICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4sIG9uZXJyb3I9c2VsZi5jaGVja19hcmdzX3RvX29uZXJyb3IpCisgICAgICAgICAgICAjIFRlc3Qgd2hldGhlciBvbmVycm9yIGhhcyBhY3R1YWxseSBiZWVuIGNhbGxlZC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lcnJvclN0YXRlLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgY2FsbCB0byBvbmVycm9yIGZ1bmN0aW9uIGRpZCBub3QgaGFwcGVuLiIpCisKKyAgICAgICAgICAgICMgTWFrZSB3cml0YWJsZSBhZ2Fpbi4KKyAgICAgICAgICAgIG9zLmNobW9kKFRFU1RGTiwgb2xkX2Rpcl9tb2RlKQorICAgICAgICAgICAgb3MuY2htb2Qoc2VsZi5jaGlsZHBhdGgsIG9sZF9jaGlsZF9tb2RlKQorCisgICAgICAgICAgICAjIENsZWFuIHVwLgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4pCisKKyAgICBkZWYgY2hlY2tfYXJnc190b19vbmVycm9yKHNlbGYsIGZ1bmMsIGFyZywgZXhjKToKKyAgICAgICAgIyB0ZXN0X3JtdHJlZV9lcnJvcnMgZGVsaWJlcmF0ZWx5IHJ1bnMgcm10cmVlCisgICAgICAgICMgb24gYSBkaXJlY3RvcnkgdGhhdCBpcyBjaG1vZCA0MDAsIHdoaWNoIHdpbGwgZmFpbC4KKyAgICAgICAgIyBUaGlzIGZ1bmN0aW9uIGlzIHJ1biB3aGVuIHNodXRpbC5ybXRyZWUgZmFpbHMuCisgICAgICAgICMgOTkuOSUgb2YgdGhlIHRpbWUgaXQgaW5pdGlhbGx5IGZhaWxzIHRvIHJlbW92ZQorICAgICAgICAjIGEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LCBzbyB0aGUgZmlyc3QgdGltZSB0aHJvdWdoCisgICAgICAgICMgZnVuYyBpcyBvcy5yZW1vdmUuCisgICAgICAgICMgSG93ZXZlciwgc29tZSBMaW51eCBtYWNoaW5lcyBydW5uaW5nIFpGUyBvbgorICAgICAgICAjIEZVU0UgZXhwZXJpZW5jZWQgYSBmYWlsdXJlIGVhcmxpZXIgaW4gdGhlIHByb2Nlc3MKKyAgICAgICAgIyBhdCBvcy5saXN0ZGlyLiAgVGhlIGZpcnN0IGZhaWx1cmUgbWF5IGxlZ2FsbHkKKyAgICAgICAgIyBiZSBlaXRoZXIuCisgICAgICAgIGlmIHNlbGYuZXJyb3JTdGF0ZSA9PSAwOgorICAgICAgICAgICAgaWYgZnVuYyBpcyBvcy5yZW1vdmU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmcsIHNlbGYuY2hpbGRwYXRoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKGZ1bmMsIG9zLmxpc3RkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVuYyBtdXN0IGJlIGVpdGhlciBvcy5yZW1vdmUgb3Igb3MubGlzdGRpciIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmcsIFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGV4Y1swXSwgT1NFcnJvcikpCisgICAgICAgICAgICBzZWxmLmVycm9yU3RhdGUgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMsIG9zLnJtZGlyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmcsIFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGV4Y1swXSwgT1NFcnJvcikpCisgICAgICAgICAgICBzZWxmLmVycm9yU3RhdGUgPSAyCisKKyAgICBkZWYgdGVzdF9ybXRyZWVfZG9udF9kZWxldGVfZmlsZShzZWxmKToKKyAgICAgICAgIyBXaGVuIGNhbGxlZCBvbiBhIGZpbGUgaW5zdGVhZCBvZiBhIGRpcmVjdG9yeSwgZG9uJ3QgZGVsZXRlIGl0LgorICAgICAgICBoYW5kbGUsIHBhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgb3MuZmRvcGVuKGhhbmRsZSkuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBzaHV0aWwucm10cmVlLCBwYXRoKQorICAgICAgICBvcy5yZW1vdmUocGF0aCkKKworICAgIGRlZiB0ZXN0X2NvcHl0cmVlX3NpbXBsZShzZWxmKToKKyAgICAgICAgZGVmIHdyaXRlX2RhdGEocGF0aCwgZGF0YSk6CisgICAgICAgICAgICBmID0gb3BlbihwYXRoLCAidyIpCisgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBkZWYgcmVhZF9kYXRhKHBhdGgpOgorICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCkKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICByZXR1cm4gZGF0YQorCisgICAgICAgIHNyY19kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgZHN0X2RpciA9IG9zLnBhdGguam9pbih0ZW1wZmlsZS5ta2R0ZW1wKCksICdkZXN0aW5hdGlvbicpCisKKyAgICAgICAgd3JpdGVfZGF0YShvcy5wYXRoLmpvaW4oc3JjX2RpciwgJ3Rlc3QudHh0JyksICcxMjMnKQorCisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihzcmNfZGlyLCAndGVzdF9kaXInKSkKKyAgICAgICAgd3JpdGVfZGF0YShvcy5wYXRoLmpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyJywgJ3Rlc3QudHh0JyksICc0NTYnKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNodXRpbC5jb3B5dHJlZShzcmNfZGlyLCBkc3RfZGlyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihkc3RfZGlyLCAndGVzdC50eHQnKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyJykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihkc3RfZGlyLCAndGVzdF9kaXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC50eHQnKSkpCisgICAgICAgICAgICBhY3R1YWwgPSByZWFkX2RhdGEob3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0LnR4dCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsICcxMjMnKQorICAgICAgICAgICAgYWN0dWFsID0gcmVhZF9kYXRhKG9zLnBhdGguam9pbihkc3RfZGlyLCAndGVzdF9kaXInLCAndGVzdC50eHQnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCAnNDU2JykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZvciBwYXRoIGluICgKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNyY19kaXIsICd0ZXN0LnR4dCcpLAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3QudHh0JyksCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzcmNfZGlyLCAndGVzdF9kaXInLCAndGVzdC50eHQnKSwKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0X2RpcicsICd0ZXN0LnR4dCcpLAorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoKQorICAgICAgICAgICAgZm9yIHBhdGggaW4gKHNyY19kaXIsCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShkc3RfZGlyKQorICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUocGF0aCkKKworICAgIGRlZiB0ZXN0X2NvcHl0cmVlX3dpdGhfZXhjbHVkZShzZWxmKToKKworICAgICAgICBkZWYgd3JpdGVfZGF0YShwYXRoLCBkYXRhKToKKyAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgsICJ3IikKKyAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGRlZiByZWFkX2RhdGEocGF0aCk6CisgICAgICAgICAgICBmID0gb3BlbihwYXRoKQorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJldHVybiBkYXRhCisKKyAgICAgICAgIyBjcmVhdGluZyBkYXRhCisgICAgICAgIGpvaW4gPSBvcy5wYXRoLmpvaW4KKyAgICAgICAgZXhpc3RzID0gb3MucGF0aC5leGlzdHMKKyAgICAgICAgc3JjX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkc3RfZGlyID0gam9pbih0ZW1wZmlsZS5ta2R0ZW1wKCksICdkZXN0aW5hdGlvbicpCisgICAgICAgICAgICB3cml0ZV9kYXRhKGpvaW4oc3JjX2RpciwgJ3Rlc3QudHh0JyksICcxMjMnKQorICAgICAgICAgICAgd3JpdGVfZGF0YShqb2luKHNyY19kaXIsICd0ZXN0LnRtcCcpLCAnMTIzJykKKyAgICAgICAgICAgIG9zLm1rZGlyKGpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyJykpCisgICAgICAgICAgICB3cml0ZV9kYXRhKGpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyJywgJ3Rlc3QudHh0JyksICc0NTYnKQorICAgICAgICAgICAgb3MubWtkaXIoam9pbihzcmNfZGlyLCAndGVzdF9kaXIyJykpCisgICAgICAgICAgICB3cml0ZV9kYXRhKGpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyMicsICd0ZXN0LnR4dCcpLCAnNDU2JykKKyAgICAgICAgICAgIG9zLm1rZGlyKGpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXInKSkKKyAgICAgICAgICAgIG9zLm1rZGlyKGpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXIyJykpCisgICAgICAgICAgICB3cml0ZV9kYXRhKGpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXInLCAndGVzdC50eHQnKSwgJzQ1NicpCisgICAgICAgICAgICB3cml0ZV9kYXRhKGpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXIyJywgJ3Rlc3QucHknKSwgJzQ1NicpCisKKworICAgICAgICAgICAgIyB0ZXN0aW5nIGdsb2ItbGlrZSBwYXR0ZXJucworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhdHRlcm5zID0gc2h1dGlsLmlnbm9yZV9wYXR0ZXJucygnKi50bXAnLCAndGVzdF9kaXIyJykKKyAgICAgICAgICAgICAgICBzaHV0aWwuY29weXRyZWUoc3JjX2RpciwgZHN0X2RpciwgaWdub3JlPXBhdHRlcm5zKQorICAgICAgICAgICAgICAgICMgY2hlY2tpbmcgdGhlIHJlc3VsdDogc29tZSBlbGVtZW50cyBzaG91bGQgbm90IGJlIGNvcGllZAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdC50eHQnKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdC50bXAnKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdF9kaXIyJykpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkc3RfZGlyKToKKyAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkc3RfZGlyKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhdHRlcm5zID0gc2h1dGlsLmlnbm9yZV9wYXR0ZXJucygnKi50bXAnLCAnc3ViZGlyKicpCisgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKHNyY19kaXIsIGRzdF9kaXIsIGlnbm9yZT1wYXR0ZXJucykKKyAgICAgICAgICAgICAgICAjIGNoZWNraW5nIHRoZSByZXN1bHQ6IHNvbWUgZWxlbWVudHMgc2hvdWxkIG5vdCBiZSBjb3BpZWQKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0LnRtcCcpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyMicpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyJykpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkc3RfZGlyKToKKyAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkc3RfZGlyKQorCisgICAgICAgICAgICAjIHRlc3RpbmcgY2FsbGFibGUtc3R5bGUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZWYgX2ZpbHRlcihzcmMsIG5hbWVzKToKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gW10KKyAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNyYywgbmFtZSkKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9zLnBhdGguaXNkaXIocGF0aCkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5zcGxpdCgpWy0xXSA9PSAnc3ViZGlyJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmFwcGVuZChuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLnNwbGl0ZXh0KHBhdGgpWy0xXSBpbiAoJy5weScpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcworCisgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKHNyY19kaXIsIGRzdF9kaXIsIGlnbm9yZT1fZmlsdGVyKQorCisgICAgICAgICAgICAgICAgIyBjaGVja2luZyB0aGUgcmVzdWx0OiBzb21lIGVsZW1lbnRzIHNob3VsZCBub3QgYmUgY29waWVkCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdF9kaXIyJywgJ3N1YmRpcjInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LnB5JykpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXInKSkpCisKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHN0X2Rpcik6CisgICAgICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZHN0X2RpcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoc3JjX2RpcikKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUob3MucGF0aC5kaXJuYW1lKGRzdF9kaXIpKQorCisgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKKyAgICAgICAgZGVmIHRlc3RfZG9udF9jb3B5X2ZpbGVfb250b19saW5rX3RvX2l0c2VsZihzZWxmKToKKyAgICAgICAgICAgICMgYnVnIDg1MTEyMy4KKyAgICAgICAgICAgIG9zLm1rZGlyKFRFU1RGTikKKyAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihURVNURk4sICdjaGVlc2UnKQorICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKFRFU1RGTiwgJ3Nob3AnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKHNyYywgJ3cnKQorICAgICAgICAgICAgICAgIGYud3JpdGUoJ2NoZWRkYXInKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICAgICAgb3MubGluayhzcmMsIGRzdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzaHV0aWwuRXJyb3IsIHNodXRpbC5jb3B5ZmlsZSwgc3JjLCBkc3QpCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHNyYywgJ3InKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAnY2hlZGRhcicpCisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGRzdCkKKworICAgICAgICAgICAgICAgICMgVXNpbmcgYHNyY2AgaGVyZSB3b3VsZCBtZWFuIHdlIGVuZCB1cCB3aXRoIGEgc3ltbGluayBwb2ludGluZworICAgICAgICAgICAgICAgICMgdG8gVEVTVEZOL1RFU1RGTi9jaGVlc2UsIHdoaWxlIGl0IHNob3VsZCBwb2ludCBhdAorICAgICAgICAgICAgICAgICMgVEVTVEZOL2NoZWVzZS4KKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKCdjaGVlc2UnLCBkc3QpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2h1dGlsLkVycm9yLCBzaHV0aWwuY29weWZpbGUsIHNyYywgZHN0KQorICAgICAgICAgICAgICAgIHdpdGggb3BlbihzcmMsICdyJykgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgJ2NoZWRkYXInKQorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShkc3QpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4pCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgdGVzdF9ybXRyZWVfb25fc3ltbGluayhzZWxmKToKKyAgICAgICAgICAgICMgYnVnIDE2NjkuCisgICAgICAgICAgICBvcy5ta2RpcihURVNURk4pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKFRFU1RGTiwgJ2NoZWVzZScpCisgICAgICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKFRFU1RGTiwgJ3Nob3AnKQorICAgICAgICAgICAgICAgIG9zLm1rZGlyKHNyYykKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKHNyYywgZHN0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIHNodXRpbC5ybXRyZWUsIGRzdCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4sIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworICAgIGlmIGhhc2F0dHIob3MsICJta2ZpZm8iKToKKyAgICAgICAgIyBJc3N1ZSAjMzAwMjogY29weWZpbGUgYW5kIGNvcHl0cmVlIGJsb2NrIGluZGVmaW5pdGVseSBvbiBuYW1lZCBwaXBlcworICAgICAgICBkZWYgdGVzdF9jb3B5ZmlsZV9uYW1lZF9waXBlKHNlbGYpOgorICAgICAgICAgICAgb3MubWtmaWZvKFRFU1RGTikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzaHV0aWwuU3BlY2lhbEZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUsIFRFU1RGTiwgVEVTVEZOMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzaHV0aWwuU3BlY2lhbEZpbGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUsIF9fZmlsZV9fLCBURVNURk4pCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShURVNURk4pCisKKyAgICAgICAgZGVmIHRlc3RfY29weXRyZWVfbmFtZWRfcGlwZShzZWxmKToKKyAgICAgICAgICAgIG9zLm1rZGlyKFRFU1RGTikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzdWJkaXIgPSBvcy5wYXRoLmpvaW4oVEVTVEZOLCAic3ViZGlyIikKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihzdWJkaXIpCisgICAgICAgICAgICAgICAgcGlwZSA9IG9zLnBhdGguam9pbihzdWJkaXIsICJteXBpcGUiKQorICAgICAgICAgICAgICAgIG9zLm1rZmlmbyhwaXBlKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKFRFU1RGTiwgVEVTVEZOMikKKyAgICAgICAgICAgICAgICBleGNlcHQgc2h1dGlsLkVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IGUuYXJnc1swXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlcnJvcnMpLCAxKQorICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgZXJyb3JfbXNnID0gZXJyb3JzWzBdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImAlc2AgaXMgYSBuYW1lZCBwaXBlIiAlIHBpcGUsIGVycm9yX21zZykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNodXRpbC5FcnJvciBzaG91bGQgaGF2ZSBiZWVuIHJhaXNlZCIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOLCBpZ25vcmVfZXJyb3JzPVRydWUpCisgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4yLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnY2hmbGFncycpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2F0dHIoZXJybm8sICdFT1BOT1RTVVBQJykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFzYXR0cihlcnJubywgJ0VOT1RTVVAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZXMgb3MuY2hmbGFncywgRU9QTk9UU1VQUCAmIEVOT1RTVVAiKQorICAgIGRlZiB0ZXN0X2NvcHlzdGF0X2hhbmRsZXNfaGFybWxlc3NfY2hmbGFnc19lcnJvcnMoc2VsZik6CisgICAgICAgIHRtcGRpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGZpbGUxID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2ZpbGUxJykKKyAgICAgICAgZmlsZTIgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnZmlsZTInKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZmlsZTEsICd4eHgnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZmlsZTIsICd4eHgnKQorCisgICAgICAgIGRlZiBtYWtlX2NoZmxhZ3NfcmFpc2VyKGVycik6CisgICAgICAgICAgICBleCA9IE9TRXJyb3IoKQorCisgICAgICAgICAgICBkZWYgX2NoZmxhZ3NfcmFpc2VyKHBhdGgsIGZsYWdzKToKKyAgICAgICAgICAgICAgICBleC5lcnJubyA9IGVycgorICAgICAgICAgICAgICAgIHJhaXNlIGV4CisgICAgICAgICAgICByZXR1cm4gX2NoZmxhZ3NfcmFpc2VyCisgICAgICAgIG9sZF9jaGZsYWdzID0gb3MuY2hmbGFncworICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgZXJyIGluIGVycm5vLkVPUE5PVFNVUFAsIGVycm5vLkVOT1RTVVA6CisgICAgICAgICAgICAgICAgb3MuY2hmbGFncyA9IG1ha2VfY2hmbGFnc19yYWlzZXIoZXJyKQorICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5c3RhdChmaWxlMSwgZmlsZTIpCisgICAgICAgICAgICAjIGFzc2VydCBvdGhlcnMgZXJyb3JzIGJyZWFrIGl0CisgICAgICAgICAgICBvcy5jaGZsYWdzID0gbWFrZV9jaGZsYWdzX3JhaXNlcihlcnJuby5FT1BOT1RTVVBQICsgZXJybm8uRU5PVFNVUCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIHNodXRpbC5jb3B5c3RhdCwgZmlsZTEsIGZpbGUyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hmbGFncyA9IG9sZF9jaGZsYWdzCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfbWFrZV90YXJiYWxsKHNlbGYpOgorICAgICAgICAjIGNyZWF0aW5nIHNvbWV0aGluZyB0byB0YXIKKyAgICAgICAgdG1wZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKFt0bXBkaXIsICdmaWxlMSddLCAneHh4JykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKFt0bXBkaXIsICdmaWxlMiddLCAneHh4JykKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKHRtcGRpciwgJ3N1YicpKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoW3RtcGRpciwgJ3N1YicsICdmaWxlMyddLCAneHh4JykKKworICAgICAgICB0bXBkaXIyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgIyBmb3JjZSBzaHV0aWwgdG8gY3JlYXRlIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgb3Mucm1kaXIodG1wZGlyMikKKyAgICAgICAgdW5pdHRlc3Quc2tpcFVubGVzcyhzcGxpdGRyaXZlKHRtcGRpcilbMF0gPT0gc3BsaXRkcml2ZSh0bXBkaXIyKVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291cmNlIGFuZCB0YXJnZXQgc2hvdWxkIGJlIG9uIHNhbWUgZHJpdmUiKQorCisgICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIyLCAnYXJjaGl2ZScpCisKKyAgICAgICAgIyB3b3JraW5nIHdpdGggcmVsYXRpdmUgcGF0aHMgdG8gYXZvaWQgdGFyIHdhcm5pbmdzCisgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcih0bXBkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9tYWtlX3RhcmJhbGwoc3BsaXRkcml2ZShiYXNlX25hbWUpWzFdLCAnLicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorCisgICAgICAgICMgY2hlY2sgaWYgdGhlIGNvbXByZXNzZWQgdGFyYmFsbCB3YXMgY3JlYXRlZAorICAgICAgICB0YXJiYWxsID0gYmFzZV9uYW1lICsgJy50YXIuZ3onCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKKworICAgICAgICAjIHRyeWluZyBhbiB1bmNvbXByZXNzZWQgb25lCisgICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIyLCAnYXJjaGl2ZScpCisgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcih0bXBkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9tYWtlX3RhcmJhbGwoc3BsaXRkcml2ZShiYXNlX25hbWUpWzFdLCAnLicsIGNvbXByZXNzPU5vbmUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorICAgICAgICB0YXJiYWxsID0gYmFzZV9uYW1lICsgJy50YXInCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKKworICAgIGRlZiBfdGFyaW5mbyhzZWxmLCBwYXRoKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHBhdGgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWVzID0gdGFyLmdldG5hbWVzKCkKKyAgICAgICAgICAgIG5hbWVzLnNvcnQoKQorICAgICAgICAgICAgcmV0dXJuIHR1cGxlKG5hbWVzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdGFyLmNsb3NlKCkKKworICAgIGRlZiBfY3JlYXRlX2ZpbGVzKHNlbGYpOgorICAgICAgICAjIGNyZWF0aW5nIHNvbWV0aGluZyB0byB0YXIKKyAgICAgICAgdG1wZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgZGlzdCA9IG9zLnBhdGguam9pbih0bXBkaXIsICdkaXN0JykKKyAgICAgICAgb3MubWtkaXIoZGlzdCkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKFtkaXN0LCAnZmlsZTEnXSwgJ3h4eCcpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShbZGlzdCwgJ2ZpbGUyJ10sICd4eHgnKQorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oZGlzdCwgJ3N1YicpKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoW2Rpc3QsICdzdWInLCAnZmlsZTMnXSwgJ3h4eCcpCisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihkaXN0LCAnc3ViMicpKQorICAgICAgICB0bXBkaXIyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5qb2luKHRtcGRpcjIsICdhcmNoaXZlJykKKyAgICAgICAgcmV0dXJuIHRtcGRpciwgdG1wZGlyMiwgYmFzZV9uYW1lCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAiUmVxdWlyZXMgemxpYiIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZmluZF9leGVjdXRhYmxlKCd0YXInKSBhbmQgZmluZF9leGVjdXRhYmxlKCdnemlwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ05lZWQgdGhlIHRhciBjb21tYW5kIHRvIHJ1bicpCisgICAgZGVmIHRlc3RfdGFyZmlsZV92c190YXIoc2VsZik6CisgICAgICAgIHRtcGRpciwgdG1wZGlyMiwgYmFzZV9uYW1lID0gIHNlbGYuX2NyZWF0ZV9maWxlcygpCisgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcih0bXBkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9tYWtlX3RhcmJhbGwoYmFzZV9uYW1lLCAnZGlzdCcpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorCisgICAgICAgICMgY2hlY2sgaWYgdGhlIGNvbXByZXNzZWQgdGFyYmFsbCB3YXMgY3JlYXRlZAorICAgICAgICB0YXJiYWxsID0gYmFzZV9uYW1lICsgJy50YXIuZ3onCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKKworICAgICAgICAjIG5vdyBjcmVhdGUgYW5vdGhlciB0YXJiYWxsIHVzaW5nIGB0YXJgCisgICAgICAgIHRhcmJhbGwyID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2FyY2hpdmUyLnRhci5neicpCisgICAgICAgIHRhcl9jbWQgPSBbJ3RhcicsICctY2YnLCAnYXJjaGl2ZTIudGFyJywgJ2Rpc3QnXQorICAgICAgICBnemlwX2NtZCA9IFsnZ3ppcCcsICctZjknLCAnYXJjaGl2ZTIudGFyJ10KKyAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHRtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzOgorICAgICAgICAgICAgICAgIHNwYXduKHRhcl9jbWQpCisgICAgICAgICAgICAgICAgc3Bhd24oZ3ppcF9jbWQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsMikpCisgICAgICAgICMgbGV0J3MgY29tcGFyZSBib3RoIHRhcmJhbGxzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fdGFyaW5mbyh0YXJiYWxsKSwgc2VsZi5fdGFyaW5mbyh0YXJiYWxsMikpCisKKyAgICAgICAgIyB0cnlpbmcgYW4gdW5jb21wcmVzc2VkIG9uZQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQorICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIodG1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBfbWFrZV90YXJiYWxsKGJhc2VfbmFtZSwgJ2Rpc3QnLCBjb21wcmVzcz1Ob25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKyAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcudGFyJworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisKKyAgICAgICAgIyBub3cgZm9yIGEgZHJ5X3J1bgorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQorICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIodG1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBfbWFrZV90YXJiYWxsKGJhc2VfbmFtZSwgJ2Rpc3QnLCBjb21wcmVzcz1Ob25lLCBkcnlfcnVuPVRydWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorICAgICAgICB0YXJiYWxsID0gYmFzZV9uYW1lICsgJy50YXInCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJSZXF1aXJlcyB6bGliIikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhaSVBfU1VQUE9SVCwgJ05lZWQgemlwIHN1cHBvcnQgdG8gcnVuJykKKyAgICBkZWYgdGVzdF9tYWtlX3ppcGZpbGUoc2VsZik6CisgICAgICAgICMgY3JlYXRpbmcgc29tZXRoaW5nIHRvIHRhcgorICAgICAgICB0bXBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoW3RtcGRpciwgJ2ZpbGUxJ10sICd4eHgnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoW3RtcGRpciwgJ2ZpbGUyJ10sICd4eHgnKQorCisgICAgICAgIHRtcGRpcjIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICAjIGZvcmNlIHNodXRpbCB0byBjcmVhdGUgdGhlIGRpcmVjdG9yeQorICAgICAgICBvcy5ybWRpcih0bXBkaXIyKQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQorICAgICAgICBfbWFrZV96aXBmaWxlKGJhc2VfbmFtZSwgdG1wZGlyKQorCisgICAgICAgICMgY2hlY2sgaWYgdGhlIGNvbXByZXNzZWQgdGFyYmFsbCB3YXMgY3JlYXRlZAorICAgICAgICB0YXJiYWxsID0gYmFzZV9uYW1lICsgJy56aXAnCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKKworCisgICAgZGVmIHRlc3RfbWFrZV9hcmNoaXZlKHNlbGYpOgorICAgICAgICB0bXBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnYXJjaGl2ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1ha2VfYXJjaGl2ZSwgYmFzZV9uYW1lLCAneHh4JykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJSZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9tYWtlX2FyY2hpdmVfb3duZXJfZ3JvdXAoc2VsZik6CisgICAgICAgICMgdGVzdGluZyBtYWtlX2FyY2hpdmUgd2l0aCBvd25lciBhbmQgZ3JvdXAsIHdpdGggdmFyaW91cyBjb21iaW5hdGlvbnMKKyAgICAgICAgIyB0aGlzIHdvcmtzIGV2ZW4gaWYgdGhlcmUncyBub3QgZ2lkL3VpZCBzdXBwb3J0CisgICAgICAgIGlmIFVJRF9HSURfU1VQUE9SVDoKKyAgICAgICAgICAgIGdyb3VwID0gZ3JwLmdldGdyZ2lkKDApWzBdCisgICAgICAgICAgICBvd25lciA9IHB3ZC5nZXRwd3VpZCgwKVswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ3JvdXAgPSBvd25lciA9ICdyb290JworCisgICAgICAgIGJhc2VfZGlyLCByb290X2RpciwgYmFzZV9uYW1lID0gIHNlbGYuX2NyZWF0ZV9maWxlcygpCisgICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLm1rZHRlbXAoKSAsICdhcmNoaXZlJykKKyAgICAgICAgcmVzID0gbWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgJ3ppcCcsIHJvb3RfZGlyLCBiYXNlX2Rpciwgb3duZXI9b3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cD1ncm91cCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHJlcykpCisKKyAgICAgICAgcmVzID0gbWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgJ3ppcCcsIHJvb3RfZGlyLCBiYXNlX2RpcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHJlcykpCisKKyAgICAgICAgcmVzID0gbWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgJ3RhcicsIHJvb3RfZGlyLCBiYXNlX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyPW93bmVyLCBncm91cD1ncm91cCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHJlcykpCisKKyAgICAgICAgcmVzID0gbWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgJ3RhcicsIHJvb3RfZGlyLCBiYXNlX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyPSdramhramhramcnLCBncm91cD0nb2lob2hvaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhyZXMpKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgIlJlcXVpcmVzIHpsaWIiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKFVJRF9HSURfU1VQUE9SVCwgIlJlcXVpcmVzIGdycCBhbmQgcHdkIHN1cHBvcnQiKQorICAgIGRlZiB0ZXN0X3RhcmZpbGVfcm9vdF9vd25lcihzZWxmKToKKyAgICAgICAgdG1wZGlyLCB0bXBkaXIyLCBiYXNlX25hbWUgPSAgc2VsZi5fY3JlYXRlX2ZpbGVzKCkKKyAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHRtcGRpcikKKyAgICAgICAgZ3JvdXAgPSBncnAuZ2V0Z3JnaWQoMClbMF0KKyAgICAgICAgb3duZXIgPSBwd2QuZ2V0cHd1aWQoMClbMF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXJjaGl2ZV9uYW1lID0gX21ha2VfdGFyYmFsbChiYXNlX25hbWUsICdkaXN0JywgY29tcHJlc3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXI9b3duZXIsIGdyb3VwPWdyb3VwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKworICAgICAgICAjIGNoZWNrIGlmIHRoZSBjb21wcmVzc2VkIHRhcmJhbGwgd2FzIGNyZWF0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGFyY2hpdmVfbmFtZSkpCisKKyAgICAgICAgIyBub3cgY2hlY2tzIHRoZSByaWdodHMKKyAgICAgICAgYXJjaGl2ZSA9IHRhcmZpbGUub3BlbihhcmNoaXZlX25hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gYXJjaGl2ZS5nZXRtZW1iZXJzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1iZXIudWlkLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtYmVyLmdpZCwgMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGFyY2hpdmUuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfbWFrZV9hcmNoaXZlX2N3ZChzZWxmKToKKyAgICAgICAgY3VycmVudF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBkZWYgX2JyZWFrcygqYXJncywgKiprdyk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoKQorCisgICAgICAgIHJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0KCd4eHgnLCBfYnJlYWtzLCBbXSwgJ3h4eCBmaWxlJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1ha2VfYXJjaGl2ZSgneHh4JywgJ3h4eCcsIHJvb3RfZGlyPXNlbGYubWtkdGVtcCgpKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmdldGN3ZCgpLCBjdXJyZW50X2RpcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHVucmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQoJ3h4eCcpCisKKyAgICBkZWYgdGVzdF9yZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdChzZWxmKToKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0LCAneHh4JywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdCwgJ3h4eCcsIGxhbWJkYTogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdCwgJ3h4eCcsIGxhbWJkYTogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWygxLCAyKSwgKDEsIDIsIDMpXSkKKworICAgICAgICByZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdCgneHh4JywgbGFtYmRhOiB4LCBbKDEsIDIpXSwgJ3h4eCBmaWxlJykKKyAgICAgICAgZm9ybWF0cyA9IFtuYW1lIGZvciBuYW1lLCBwYXJhbXMgaW4gZ2V0X2FyY2hpdmVfZm9ybWF0cygpXQorICAgICAgICBzZWxmLmFzc2VydEluKCd4eHgnLCBmb3JtYXRzKQorCisgICAgICAgIHVucmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQoJ3h4eCcpCisgICAgICAgIGZvcm1hdHMgPSBbbmFtZSBmb3IgbmFtZSwgcGFyYW1zIGluIGdldF9hcmNoaXZlX2Zvcm1hdHMoKV0KKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigneHh4JywgZm9ybWF0cykKKworCitjbGFzcyBUZXN0TW92ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZpbGVuYW1lID0gImZvbyIKKyAgICAgICAgc2VsZi5zcmNfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHNlbGYuZHN0X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBzZWxmLnNyY19maWxlID0gb3MucGF0aC5qb2luKHNlbGYuc3JjX2RpciwgZmlsZW5hbWUpCisgICAgICAgIHNlbGYuZHN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kc3RfZGlyLCBmaWxlbmFtZSkKKyAgICAgICAgIyBUcnkgdG8gY3JlYXRlIGEgZGlyIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgaG9waW5nIHRoYXQgaXQgaXMKKyAgICAgICAgIyBub3QgbG9jYXRlZCBvbiB0aGUgc2FtZSBmaWxlc3lzdGVtIGFzIHRoZSBzeXN0ZW0gdG1wIGRpci4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kaXJfb3RoZXJfZnMgPSB0ZW1wZmlsZS5ta2R0ZW1wKAorICAgICAgICAgICAgICAgIGRpcj1vcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorICAgICAgICAgICAgc2VsZi5maWxlX290aGVyX2ZzID0gb3MucGF0aC5qb2luKHNlbGYuZGlyX290aGVyX2ZzLAorICAgICAgICAgICAgICAgIGZpbGVuYW1lKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZGlyX290aGVyX2ZzID0gTm9uZQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5zcmNfZmlsZSwgIndiIikgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoInNwYW0iKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmb3IgZCBpbiAoc2VsZi5zcmNfZGlyLCBzZWxmLmRzdF9kaXIsIHNlbGYuZGlyX290aGVyX2ZzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBkOgorICAgICAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKGQpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF9jaGVja19tb3ZlX2ZpbGUoc2VsZiwgc3JjLCBkc3QsIHJlYWxfZHN0KToKKyAgICAgICAgd2l0aCBvcGVuKHNyYywgInJiIikgYXMgZjoKKyAgICAgICAgICAgIGNvbnRlbnRzID0gZi5yZWFkKCkKKyAgICAgICAgc2h1dGlsLm1vdmUoc3JjLCBkc3QpCisgICAgICAgIHdpdGggb3BlbihyZWFsX2RzdCwgInJiIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udGVudHMsIGYucmVhZCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKHNyYykpCisKKyAgICBkZWYgX2NoZWNrX21vdmVfZGlyKHNlbGYsIHNyYywgZHN0LCByZWFsX2RzdCk6CisgICAgICAgIGNvbnRlbnRzID0gc29ydGVkKG9zLmxpc3RkaXIoc3JjKSkKKyAgICAgICAgc2h1dGlsLm1vdmUoc3JjLCBkc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udGVudHMsIHNvcnRlZChvcy5saXN0ZGlyKHJlYWxfZHN0KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoc3JjKSkKKworICAgIGRlZiB0ZXN0X21vdmVfZmlsZShzZWxmKToKKyAgICAgICAgIyBNb3ZlIGEgZmlsZSB0byBhbm90aGVyIGxvY2F0aW9uIG9uIHRoZSBzYW1lIGZpbGVzeXN0ZW0uCisgICAgICAgIHNlbGYuX2NoZWNrX21vdmVfZmlsZShzZWxmLnNyY19maWxlLCBzZWxmLmRzdF9maWxlLCBzZWxmLmRzdF9maWxlKQorCisgICAgZGVmIHRlc3RfbW92ZV9maWxlX3RvX2RpcihzZWxmKToKKyAgICAgICAgIyBNb3ZlIGEgZmlsZSBpbnNpZGUgYW4gZXhpc3RpbmcgZGlyIG9uIHRoZSBzYW1lIGZpbGVzeXN0ZW0uCisgICAgICAgIHNlbGYuX2NoZWNrX21vdmVfZmlsZShzZWxmLnNyY19maWxlLCBzZWxmLmRzdF9kaXIsIHNlbGYuZHN0X2ZpbGUpCisKKyAgICBkZWYgdGVzdF9tb3ZlX2ZpbGVfb3RoZXJfZnMoc2VsZik6CisgICAgICAgICMgTW92ZSBhIGZpbGUgdG8gYW4gZXhpc3RpbmcgZGlyIG9uIGFub3RoZXIgZmlsZXN5c3RlbS4KKyAgICAgICAgaWYgbm90IHNlbGYuZGlyX290aGVyX2ZzOgorICAgICAgICAgICAgIyBza2lwCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fY2hlY2tfbW92ZV9maWxlKHNlbGYuc3JjX2ZpbGUsIHNlbGYuZmlsZV9vdGhlcl9mcywKKyAgICAgICAgICAgIHNlbGYuZmlsZV9vdGhlcl9mcykKKworICAgIGRlZiB0ZXN0X21vdmVfZmlsZV90b19kaXJfb3RoZXJfZnMoc2VsZik6CisgICAgICAgICMgTW92ZSBhIGZpbGUgdG8gYW5vdGhlciBsb2NhdGlvbiBvbiBhbm90aGVyIGZpbGVzeXN0ZW0uCisgICAgICAgIGlmIG5vdCBzZWxmLmRpcl9vdGhlcl9mczoKKyAgICAgICAgICAgICMgc2tpcAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2NoZWNrX21vdmVfZmlsZShzZWxmLnNyY19maWxlLCBzZWxmLmRpcl9vdGhlcl9mcywKKyAgICAgICAgICAgIHNlbGYuZmlsZV9vdGhlcl9mcykKKworICAgIGRlZiB0ZXN0X21vdmVfZGlyKHNlbGYpOgorICAgICAgICAjIE1vdmUgYSBkaXIgdG8gYW5vdGhlciBsb2NhdGlvbiBvbiB0aGUgc2FtZSBmaWxlc3lzdGVtLgorICAgICAgICBkc3RfZGlyID0gdGVtcGZpbGUubWt0ZW1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfbW92ZV9kaXIoc2VsZi5zcmNfZGlyLCBkc3RfZGlyLCBkc3RfZGlyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZHN0X2RpcikKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9tb3ZlX2Rpcl9vdGhlcl9mcyhzZWxmKToKKyAgICAgICAgIyBNb3ZlIGEgZGlyIHRvIGFub3RoZXIgbG9jYXRpb24gb24gYW5vdGhlciBmaWxlc3lzdGVtLgorICAgICAgICBpZiBub3Qgc2VsZi5kaXJfb3RoZXJfZnM6CisgICAgICAgICAgICAjIHNraXAKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBkc3RfZGlyID0gdGVtcGZpbGUubWt0ZW1wKGRpcj1zZWxmLmRpcl9vdGhlcl9mcykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfbW92ZV9kaXIoc2VsZi5zcmNfZGlyLCBkc3RfZGlyLCBkc3RfZGlyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZHN0X2RpcikKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9tb3ZlX2Rpcl90b19kaXIoc2VsZik6CisgICAgICAgICMgTW92ZSBhIGRpciBpbnNpZGUgYW4gZXhpc3RpbmcgZGlyIG9uIHRoZSBzYW1lIGZpbGVzeXN0ZW0uCisgICAgICAgIHNlbGYuX2NoZWNrX21vdmVfZGlyKHNlbGYuc3JjX2Rpciwgc2VsZi5kc3RfZGlyLAorICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuZHN0X2Rpciwgb3MucGF0aC5iYXNlbmFtZShzZWxmLnNyY19kaXIpKSkKKworICAgIGRlZiB0ZXN0X21vdmVfZGlyX3RvX2Rpcl9vdGhlcl9mcyhzZWxmKToKKyAgICAgICAgIyBNb3ZlIGEgZGlyIGluc2lkZSBhbiBleGlzdGluZyBkaXIgb24gYW5vdGhlciBmaWxlc3lzdGVtLgorICAgICAgICBpZiBub3Qgc2VsZi5kaXJfb3RoZXJfZnM6CisgICAgICAgICAgICAjIHNraXAKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9jaGVja19tb3ZlX2RpcihzZWxmLnNyY19kaXIsIHNlbGYuZGlyX290aGVyX2ZzLAorICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuZGlyX290aGVyX2ZzLCBvcy5wYXRoLmJhc2VuYW1lKHNlbGYuc3JjX2RpcikpKQorCisgICAgZGVmIHRlc3RfZXhpc3RpbmdfZmlsZV9pbnNpZGVfZGVzdF9kaXIoc2VsZik6CisgICAgICAgICMgQSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBpbnNpZGUgdGhlIGRlc3RpbmF0aW9uIGRpciBhbHJlYWR5IGV4aXN0cy4KKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZHN0X2ZpbGUsICJ3YiIpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzaHV0aWwuRXJyb3IsIHNodXRpbC5tb3ZlLCBzZWxmLnNyY19maWxlLCBzZWxmLmRzdF9kaXIpCisKKyAgICBkZWYgdGVzdF9kb250X21vdmVfZGlyX2luX2l0c2VsZihzZWxmKToKKyAgICAgICAgIyBNb3ZpbmcgYSBkaXIgaW5zaWRlIGl0c2VsZiByYWlzZXMgYW4gRXJyb3IuCisgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihzZWxmLnNyY19kaXIsICJiYXIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzaHV0aWwuRXJyb3IsIHNodXRpbC5tb3ZlLCBzZWxmLnNyY19kaXIsIGRzdCkKKworICAgIGRlZiB0ZXN0X2Rlc3RpbnNyY19mYWxzZV9uZWdhdGl2ZShzZWxmKToKKyAgICAgICAgb3MubWtkaXIoVEVTVEZOKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3Igc3JjLCBkc3QgaW4gWygnc3JjZGlyJywgJ3NyY2Rpci9kZXN0JyldOgorICAgICAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihURVNURk4sIHNyYykKKyAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oVEVTVEZOLCBkc3QpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNodXRpbC5fZGVzdGluc3JjKHNyYywgZHN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdfZGVzdGluc3JjKCkgd3JvbmdseSBjb25jbHVkZWQgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkc3QgKCVzKSBpcyBub3QgaW4gc3JjICglcyknICUgKGRzdCwgc3JjKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKyAgICBkZWYgdGVzdF9kZXN0aW5zcmNfZmFsc2VfcG9zaXRpdmUoc2VsZik6CisgICAgICAgIG9zLm1rZGlyKFRFU1RGTikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIHNyYywgZHN0IGluIFsoJ3NyY2RpcicsICdzcmMvZGVzdCcpLCAoJ3NyY2RpcicsICdzcmNkaXIubmV3JyldOgorICAgICAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihURVNURk4sIHNyYykKKyAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oVEVTVEZOLCBkc3QpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzaHV0aWwuX2Rlc3RpbnNyYyhzcmMsIGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdfZGVzdGluc3JjKCkgd3JvbmdseSBjb25jbHVkZWQgdGhhdCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RzdCAoJXMpIGlzIGluIHNyYyAoJXMpJyAlIChkc3QsIHNyYykpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKFRFU1RGTiwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisKK2NsYXNzIFRlc3RDb3B5RmlsZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBfZGVsZXRlID0gRmFsc2UKKworICAgIGNsYXNzIEZhdXgob2JqZWN0KToKKyAgICAgICAgX2VudGVyZWQgPSBGYWxzZQorICAgICAgICBfZXhpdGVkX3dpdGggPSBOb25lCisgICAgICAgIF9yYWlzZWQgPSBGYWxzZQorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcmFpc2VfaW5fZXhpdD1GYWxzZSwgc3VwcHJlc3NfYXRfZXhpdD1UcnVlKToKKyAgICAgICAgICAgIHNlbGYuX3JhaXNlX2luX2V4aXQgPSByYWlzZV9pbl9leGl0CisgICAgICAgICAgICBzZWxmLl9zdXBwcmVzc19hdF9leGl0ID0gc3VwcHJlc3NfYXRfZXhpdAorICAgICAgICBkZWYgcmVhZChzZWxmLCAqYXJncyk6CisgICAgICAgICAgICByZXR1cm4gJycKKyAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX2VudGVyZWQgPSBUcnVlCisgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbCwgZXhjX3RiKToKKyAgICAgICAgICAgIHNlbGYuX2V4aXRlZF93aXRoID0gZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190YgorICAgICAgICAgICAgaWYgc2VsZi5fcmFpc2VfaW5fZXhpdDoKKyAgICAgICAgICAgICAgICBzZWxmLl9yYWlzZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiQ2Fubm90IGNsb3NlIikKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zdXBwcmVzc19hdF9leGl0CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2RlbGV0ZToKKyAgICAgICAgICAgIGRlbCBzaHV0aWwub3BlbgorCisgICAgZGVmIF9zZXRfc2h1dGlsX29wZW4oc2VsZiwgZnVuYyk6CisgICAgICAgIHNodXRpbC5vcGVuID0gZnVuYworICAgICAgICBzZWxmLl9kZWxldGUgPSBUcnVlCisKKyAgICBkZWYgdGVzdF93X3NvdXJjZV9vcGVuX2ZhaWxzKHNlbGYpOgorICAgICAgICBkZWYgX29wZW4oZmlsZW5hbWUsIG1vZGU9J3InKToKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lID09ICdzcmNmaWxlJzoKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdDYW5ub3Qgb3BlbiAic3JjZmlsZSInKQorICAgICAgICAgICAgYXNzZXJ0IDAgICMgc2hvdWxkbid0IHJlYWNoIGhlcmUuCisKKyAgICAgICAgc2VsZi5fc2V0X3NodXRpbF9vcGVuKF9vcGVuKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHNodXRpbC5jb3B5ZmlsZSwgJ3NyY2ZpbGUnLCAnZGVzdGZpbGUnKQorCisgICAgZGVmIHRlc3Rfd19kZXN0X29wZW5fZmFpbHMoc2VsZik6CisKKyAgICAgICAgc3JjZmlsZSA9IHNlbGYuRmF1eCgpCisKKyAgICAgICAgZGVmIF9vcGVuKGZpbGVuYW1lLCBtb2RlPSdyJyk6CisgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSAnc3JjZmlsZSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNyY2ZpbGUKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lID09ICdkZXN0ZmlsZSc6CisgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignQ2Fubm90IG9wZW4gImRlc3RmaWxlIicpCisgICAgICAgICAgICBhc3NlcnQgMCAgIyBzaG91bGRuJ3QgcmVhY2ggaGVyZS4KKworICAgICAgICBzZWxmLl9zZXRfc2h1dGlsX29wZW4oX29wZW4pCisKKyAgICAgICAgc2h1dGlsLmNvcHlmaWxlKCdzcmNmaWxlJywgJ2Rlc3RmaWxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNyY2ZpbGUuX2VudGVyZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcmNmaWxlLl9leGl0ZWRfd2l0aFswXSBpcyBJT0Vycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNyY2ZpbGUuX2V4aXRlZF93aXRoWzFdLmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdDYW5ub3Qgb3BlbiAiZGVzdGZpbGUiJywpKQorCisgICAgZGVmIHRlc3Rfd19kZXN0X2Nsb3NlX2ZhaWxzKHNlbGYpOgorCisgICAgICAgIHNyY2ZpbGUgPSBzZWxmLkZhdXgoKQorICAgICAgICBkZXN0ZmlsZSA9IHNlbGYuRmF1eChUcnVlKQorCisgICAgICAgIGRlZiBfb3BlbihmaWxlbmFtZSwgbW9kZT0ncicpOgorICAgICAgICAgICAgaWYgZmlsZW5hbWUgPT0gJ3NyY2ZpbGUnOgorICAgICAgICAgICAgICAgIHJldHVybiBzcmNmaWxlCisgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSAnZGVzdGZpbGUnOgorICAgICAgICAgICAgICAgIHJldHVybiBkZXN0ZmlsZQorICAgICAgICAgICAgYXNzZXJ0IDAgICMgc2hvdWxkbid0IHJlYWNoIGhlcmUuCisKKyAgICAgICAgc2VsZi5fc2V0X3NodXRpbF9vcGVuKF9vcGVuKQorCisgICAgICAgIHNodXRpbC5jb3B5ZmlsZSgnc3JjZmlsZScsICdkZXN0ZmlsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcmNmaWxlLl9lbnRlcmVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGVzdGZpbGUuX2VudGVyZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkZXN0ZmlsZS5fcmFpc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3JjZmlsZS5fZXhpdGVkX3dpdGhbMF0gaXMgSU9FcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcmNmaWxlLl9leGl0ZWRfd2l0aFsxXS5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnQ2Fubm90IGNsb3NlJywpKQorCisgICAgZGVmIHRlc3Rfd19zb3VyY2VfY2xvc2VfZmFpbHMoc2VsZik6CisKKyAgICAgICAgc3JjZmlsZSA9IHNlbGYuRmF1eChUcnVlKQorICAgICAgICBkZXN0ZmlsZSA9IHNlbGYuRmF1eCgpCisKKyAgICAgICAgZGVmIF9vcGVuKGZpbGVuYW1lLCBtb2RlPSdyJyk6CisgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSAnc3JjZmlsZSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNyY2ZpbGUKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lID09ICdkZXN0ZmlsZSc6CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc3RmaWxlCisgICAgICAgICAgICBhc3NlcnQgMCAgIyBzaG91bGRuJ3QgcmVhY2ggaGVyZS4KKworICAgICAgICBzZWxmLl9zZXRfc2h1dGlsX29wZW4oX29wZW4pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlLCAnc3JjZmlsZScsICdkZXN0ZmlsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcmNmaWxlLl9lbnRlcmVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGVzdGZpbGUuX2VudGVyZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZGVzdGZpbGUuX3JhaXNlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNyY2ZpbGUuX2V4aXRlZF93aXRoWzBdIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcmNmaWxlLl9yYWlzZWQpCisKKyAgICBkZWYgdGVzdF9tb3ZlX2Rpcl9jYXNlaW5zZW5zaXRpdmUoc2VsZik6CisgICAgICAgICMgUmVuYW1lcyBhIGZvbGRlciB0byB0aGUgc2FtZSBuYW1lCisgICAgICAgICMgYnV0IGEgZGlmZmVyZW50IGNhc2UuCisKKyAgICAgICAgc2VsZi5zcmNfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIGRzdF9kaXIgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKHNlbGYuc3JjX2RpciksCisgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShzZWxmLnNyY19kaXIpLnVwcGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5zcmNfZGlyLCBkc3RfZGlyKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNodXRpbC5tb3ZlKHNlbGYuc3JjX2RpciwgZHN0X2RpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZGlyKGRzdF9kaXIpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHN0X2Rpcik6CisgICAgICAgICAgICAgICAgb3Mucm1kaXIoZHN0X2RpcikKKworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RTaHV0aWwsIFRlc3RNb3ZlLCBUZXN0Q29weUZpbGUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NodXRpbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaHV0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOTg2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaHV0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NodXRpbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaHV0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMTE0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaHV0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NpZ25hbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NpZ25hbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDgzZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2lnbmFsLnB5CkBAIC0wLDAgKzEsNTAxIEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNsb3NpbmcKK2ltcG9ydCBnYworaW1wb3J0IHBpY2tsZQoraW1wb3J0IHNlbGVjdAoraW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCBzeXMsIG9zLCB0aW1lLCBlcnJubworCitpZiBzeXMucGxhdGZvcm0gaW4gKCdvczInLCAncmlzY29zJyk6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIkNhbid0IHRlc3Qgc2lnbmFsIG9uICVzIiAlIHN5cy5wbGF0Zm9ybSkKKworCitjbGFzcyBIYW5kbGVyQkNhbGxlZChFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitkZWYgZXhpdF9zdWJwcm9jZXNzKCk6CisgICAgIiIiVXNlIG9zLl9leGl0KDApIHRvIGV4aXQgdGhlIGN1cnJlbnQgc3VicHJvY2Vzcy4KKworICAgIE90aGVyd2lzZSwgdGhlIHRlc3QgY2F0Y2hlcyB0aGUgU3lzdGVtRXhpdCBhbmQgY29udGludWVzIGV4ZWN1dGluZworICAgIGluIHBhcmFsbGVsIHdpdGggdGhlIG9yaWdpbmFsIHRlc3QsIHNvIHlvdSB3aW5kIHVwIHdpdGggYW4KKyAgICBleHBvbmVudGlhbCBudW1iZXIgb2YgdGVzdHMgcnVubmluZyBjb25jdXJyZW50bHkuCisgICAgIiIiCisgICAgb3MuX2V4aXQoMCkKKworCitkZWYgaWdub3JpbmdfZWludHIoX19mdW5jLCAqYXJncywgKiprd2FyZ3MpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIF9fZnVuYygqYXJncywgKiprd2FyZ3MpCisgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgZToKKyAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FSU5UUjoKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHJldHVybiBOb25lCisKKworQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIk5vdCB2YWxpZCBvbiBXaW5kb3dzIikKK2NsYXNzIEludGVyUHJvY2Vzc1NpZ25hbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBNQVhfRFVSQVRJT04gPSAyMCAgICMgRW50aXJlIHRlc3Qgc2hvdWxkIGxhc3QgYXQgbW9zdCAyMCBzZWMuCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudXNpbmdfZ2MgPSBnYy5pc2VuYWJsZWQoKQorICAgICAgICBnYy5kaXNhYmxlKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi51c2luZ19nYzoKKyAgICAgICAgICAgIGdjLmVuYWJsZSgpCisKKyAgICBkZWYgZm9ybWF0X2ZyYW1lKHNlbGYsIGZyYW1lLCBsaW1pdD1Ob25lKToKKyAgICAgICAgcmV0dXJuICcnLmpvaW4odHJhY2ViYWNrLmZvcm1hdF9zdGFjayhmcmFtZSwgbGltaXQ9bGltaXQpKQorCisgICAgZGVmIGhhbmRsZXJBKHNlbGYsIHNpZ251bSwgZnJhbWUpOgorICAgICAgICBzZWxmLmFfY2FsbGVkID0gVHJ1ZQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJoYW5kbGVyQSBpbnZva2VkIGZyb20gc2lnbmFsICVzIGF0OlxuJXMiICUgKAorICAgICAgICAgICAgICAgIHNpZ251bSwgc2VsZi5mb3JtYXRfZnJhbWUoZnJhbWUsIGxpbWl0PTEpKQorCisgICAgZGVmIGhhbmRsZXJCKHNlbGYsIHNpZ251bSwgZnJhbWUpOgorICAgICAgICBzZWxmLmJfY2FsbGVkID0gVHJ1ZQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJoYW5kbGVyQiBpbnZva2VkIGZyb20gc2lnbmFsICVzIGF0OlxuJXMiICUgKAorICAgICAgICAgICAgICAgIHNpZ251bSwgc2VsZi5mb3JtYXRfZnJhbWUoZnJhbWUsIGxpbWl0PTEpKQorICAgICAgICByYWlzZSBIYW5kbGVyQkNhbGxlZChzaWdudW0sIHNlbGYuZm9ybWF0X2ZyYW1lKGZyYW1lKSkKKworICAgIGRlZiB3YWl0KHNlbGYsIGNoaWxkKToKKyAgICAgICAgIiIiV2FpdCBmb3IgY2hpbGQgdG8gZmluaXNoLCBpZ25vcmluZyBFSU5UUi4iIiIKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjaGlsZC53YWl0KCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBydW5fdGVzdChzZWxmKToKKyAgICAgICAgIyBJbnN0YWxsIGhhbmRsZXJzLiBUaGlzIGZ1bmN0aW9uIHJ1bnMgaW4gYSBzdWItcHJvY2Vzcywgc28gd2UKKyAgICAgICAgIyBkb24ndCB3b3JyeSBhYm91dCByZS1zZXR0aW5nIHRoZSBkZWZhdWx0IGhhbmRsZXJzLgorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIHNlbGYuaGFuZGxlckEpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjEsIHNlbGYuaGFuZGxlckIpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjIsIHNpZ25hbC5TSUdfSUdOKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBzaWduYWwuZGVmYXVsdF9pbnRfaGFuZGxlcikKKworICAgICAgICAjIFZhcmlhYmxlcyB0aGUgc2lnbmFscyB3aWxsIG1vZGlmeToKKyAgICAgICAgc2VsZi5hX2NhbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuYl9jYWxsZWQgPSBGYWxzZQorCisgICAgICAgICMgTGV0IHRoZSBzdWItcHJvY2Vzc2VzIGtub3cgd2hvIHRvIHNlbmQgc2lnbmFscyB0by4KKyAgICAgICAgcGlkID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAidGVzdCBydW5uZXIncyBwaWQgaXMiLCBwaWQKKworICAgICAgICBjaGlsZCA9IGlnbm9yaW5nX2VpbnRyKHN1YnByb2Nlc3MuUG9wZW4sIFsna2lsbCcsICctSFVQJywgc3RyKHBpZCldKQorICAgICAgICBpZiBjaGlsZDoKKyAgICAgICAgICAgIHNlbGYud2FpdChjaGlsZCkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmFfY2FsbGVkOgorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkgICMgR2l2ZSB0aGUgc2lnbmFsIHRpbWUgdG8gYmUgZGVsaXZlcmVkLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5hX2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmJfY2FsbGVkKQorICAgICAgICBzZWxmLmFfY2FsbGVkID0gRmFsc2UKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgc2lnbmFsIGlzbid0IGRlbGl2ZXJlZCB3aGlsZSB0aGUgcHJldmlvdXMKKyAgICAgICAgIyBQb3BlbiBvYmplY3QgaXMgYmVpbmcgZGVzdHJveWVkLCBiZWNhdXNlIF9fZGVsX18gc3dhbGxvd3MKKyAgICAgICAgIyBleGNlcHRpb25zLgorICAgICAgICBkZWwgY2hpbGQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2hpbGQgPSBzdWJwcm9jZXNzLlBvcGVuKFsna2lsbCcsICctVVNSMScsIHN0cihwaWQpXSkKKyAgICAgICAgICAgICMgVGhpcyB3YWl0IHNob3VsZCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgc2lnbmFsJ3MgZXhjZXB0aW9uLgorICAgICAgICAgICAgc2VsZi53YWl0KGNoaWxkKQorICAgICAgICAgICAgdGltZS5zbGVlcCgxKSAgIyBHaXZlIHRoZSBzaWduYWwgdGltZSB0byBiZSBkZWxpdmVyZWQuCisgICAgICAgICAgICBzZWxmLmZhaWwoJ0hhbmRsZXJCQ2FsbGVkIGV4Y2VwdGlvbiBub3QgcmFpc2VkJykKKyAgICAgICAgZXhjZXB0IEhhbmRsZXJCQ2FsbGVkOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuYl9jYWxsZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuYV9jYWxsZWQpCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiSGFuZGxlckJDYWxsZWQgZXhjZXB0aW9uIGNhdWdodCIKKworICAgICAgICBjaGlsZCA9IGlnbm9yaW5nX2VpbnRyKHN1YnByb2Nlc3MuUG9wZW4sIFsna2lsbCcsICctVVNSMicsIHN0cihwaWQpXSkKKyAgICAgICAgaWYgY2hpbGQ6CisgICAgICAgICAgICBzZWxmLndhaXQoY2hpbGQpICAjIE5vdGhpbmcgc2hvdWxkIGhhcHBlbi4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzaWduYWwuYWxhcm0oMSkKKyAgICAgICAgICAgICMgVGhlIHJhY2UgY29uZGl0aW9uIGluIHBhdXNlIGRvZXNuJ3QgbWF0dGVyIGluIHRoaXMgY2FzZSwKKyAgICAgICAgICAgICMgc2luY2UgYWxhcm0gaXMgZ29pbmcgdG8gcmFpc2UgYSBLZXlib2FyZEV4Y2VwdGlvbiwgd2hpY2gKKyAgICAgICAgICAgICMgd2lsbCBza2lwIHRoZSBjYWxsLgorICAgICAgICAgICAgc2lnbmFsLnBhdXNlKCkKKyAgICAgICAgICAgICMgQnV0IGlmIGFub3RoZXIgc2lnbmFsIGFycml2ZXMgYmVmb3JlIHRoZSBhbGFybSwgcGF1c2UKKyAgICAgICAgICAgICMgbWF5IHJldHVybiBlYXJseS4KKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIktleWJvYXJkSW50ZXJydXB0ICh0aGUgYWxhcm0oKSB3ZW50IG9mZikiCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU29tZSBvdGhlciBleGNlcHRpb24gd29rZSB1cyBmcm9tIHBhdXNlOiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgIHRyYWNlYmFjay5mb3JtYXRfZXhjKCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInBhdXNlIHJldHVybmVkIG9mIGl0cyBvd24gYWNjb3JkLCBhbmQgdGhlIHNpZ25hbCIKKyAgICAgICAgICAgICAgICAgICAgICAiIGRpZG4ndCBhcnJpdmUgYWZ0ZXIgYW5vdGhlciBzZWNvbmQuIikKKworICAgICMgSXNzdWUgMzg2NC4gVW5rbm93biBpZiB0aGlzIGFmZmVjdHMgZWFybGllciB2ZXJzaW9ucyBvZiBmcmVlYnNkIGFsc28uCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm09PSdmcmVlYnNkNicsCisgICAgICAgICdpbnRlciBwcm9jZXNzIHNpZ25hbHMgbm90IHJlbGlhYmxlIChkbyBub3QgbWl4IHdlbGwgd2l0aCB0aHJlYWRpbmcpICcKKyAgICAgICAgJ29uIGZyZWVic2Q2JykKKyAgICBkZWYgdGVzdF9tYWluKHNlbGYpOgorICAgICAgICAjIFRoaXMgZnVuY3Rpb24gc3Bhd25zIGEgY2hpbGQgcHJvY2VzcyB0byBpbnN1bGF0ZSB0aGUgbWFpbgorICAgICAgICAjIHRlc3QtcnVubmluZyBwcm9jZXNzIGZyb20gYWxsIHRoZSBzaWduYWxzLiBJdCB0aGVuCisgICAgICAgICMgY29tbXVuaWNhdGVzIHdpdGggdGhhdCBjaGlsZCBwcm9jZXNzIG92ZXIgYSBwaXBlIGFuZAorICAgICAgICAjIHJlLXJhaXNlcyBpbmZvcm1hdGlvbiBhYm91dCBhbnkgZXhjZXB0aW9ucyB0aGUgY2hpbGQKKyAgICAgICAgIyByYWlzZXMuIFRoZSByZWFsIHdvcmsgaGFwcGVucyBpbiBzZWxmLnJ1bl90ZXN0KCkuCisgICAgICAgIG9zX2RvbmVfciwgb3NfZG9uZV93ID0gb3MucGlwZSgpCisgICAgICAgIHdpdGggY2xvc2luZyhvcy5mZG9wZW4ob3NfZG9uZV9yKSkgYXMgZG9uZV9yLCBcCisgICAgICAgICAgICAgY2xvc2luZyhvcy5mZG9wZW4ob3NfZG9uZV93LCAndycpKSBhcyBkb25lX3c6CisgICAgICAgICAgICBjaGlsZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgaWYgY2hpbGQgPT0gMDoKKyAgICAgICAgICAgICAgICAjIEluIHRoZSBjaGlsZCBwcm9jZXNzOyBydW4gdGhlIHRlc3QgYW5kIHJlcG9ydCByZXN1bHRzCisgICAgICAgICAgICAgICAgIyB0aHJvdWdoIHRoZSBwaXBlLgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZG9uZV9yLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgIyBIYXZlIHRvIGNsb3NlIGRvbmVfdyBhZ2FpbiBoZXJlIGJlY2F1c2UKKyAgICAgICAgICAgICAgICAgICAgIyBleGl0X3N1YnByb2Nlc3MoKSB3aWxsIHNraXAgdGhlIGVuY2xvc2luZyB3aXRoIGJsb2NrLgorICAgICAgICAgICAgICAgICAgICB3aXRoIGNsb3NpbmcoZG9uZV93KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJ1bl90ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcCh0cmFjZWJhY2suZm9ybWF0X2V4YygpLCBkb25lX3cpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKE5vbmUsIGRvbmVfdykKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICdVaCBvaCwgcmFpc2VkIGZyb20gcGlja2xlLicKKyAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9zdWJwcm9jZXNzKCkKKworICAgICAgICAgICAgZG9uZV93LmNsb3NlKCkKKyAgICAgICAgICAgICMgQmxvY2sgZm9yIHVwIHRvIE1BWF9EVVJBVElPTiBzZWNvbmRzIGZvciB0aGUgdGVzdCB0byBmaW5pc2guCisgICAgICAgICAgICByLCB3LCB4ID0gc2VsZWN0LnNlbGVjdChbZG9uZV9yXSwgW10sIFtdLCBzZWxmLk1BWF9EVVJBVElPTikKKyAgICAgICAgICAgIGlmIGRvbmVfciBpbiByOgorICAgICAgICAgICAgICAgIHRiID0gcGlja2xlLmxvYWQoZG9uZV9yKQorICAgICAgICAgICAgICAgIGlmIHRiOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwodGIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9zLmtpbGwoY2hpbGQsIHNpZ25hbC5TSUdLSUxMKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnVGVzdCBkZWFkbG9ja2VkIGFmdGVyICVkIHNlY29uZHMuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuTUFYX0RVUkFUSU9OKQorCisKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJOb3QgdmFsaWQgb24gV2luZG93cyIpCitjbGFzcyBCYXNpY1NpZ25hbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdHJpdmlhbF9zaWduYWxfaGFuZGxlcihzZWxmLCAqYXJncyk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X291dF9vZl9yYW5nZV9zaWduYWxfbnVtYmVyX3JhaXNlc19lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2lnbmFsLmdldHNpZ25hbCwgNDI0MikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzaWduYWwuc2lnbmFsLCA0MjQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaXZpYWxfc2lnbmFsX2hhbmRsZXIpCisKKyAgICBkZWYgdGVzdF9zZXR0aW5nX3NpZ25hbF9oYW5kbGVyX3RvX25vbmVfcmFpc2VzX2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNpZ25hbC5zaWduYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbC5TSUdVU1IxLCBOb25lKQorCisgICAgZGVmIHRlc3RfZ2V0c2lnbmFsKHNlbGYpOgorICAgICAgICBodXAgPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdIVVAsIHNlbGYudHJpdmlhbF9zaWduYWxfaGFuZGxlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdIVVApLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHJpdmlhbF9zaWduYWxfaGFuZGxlcikKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSFVQLCBodXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSFVQKSwgaHVwKQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiV2luZG93cyBzcGVjaWZpYyIpCitjbGFzcyBXaW5kb3dzU2lnbmFsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2lzc3VlOTMyNChzZWxmKToKKyAgICAgICAgIyBVcGRhdGVkIGZvciBpc3N1ZSAjMTAwMDMsIGFkZGluZyBTSUdCUkVBSworICAgICAgICBoYW5kbGVyID0gbGFtYmRhIHgsIHk6IE5vbmUKKyAgICAgICAgZm9yIHNpZyBpbiAoc2lnbmFsLlNJR0FCUlQsIHNpZ25hbC5TSUdCUkVBSywgc2lnbmFsLlNJR0ZQRSwKKyAgICAgICAgICAgICAgICAgICAgc2lnbmFsLlNJR0lMTCwgc2lnbmFsLlNJR0lOVCwgc2lnbmFsLlNJR1NFR1YsCisgICAgICAgICAgICAgICAgICAgIHNpZ25hbC5TSUdURVJNKToKKyAgICAgICAgICAgICMgU2V0IGFuZCB0aGVuIHJlc2V0IGEgaGFuZGxlciBmb3Igc2lnbmFscyB0aGF0IHdvcmsgb24gd2luZG93cworICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWcsIHNpZ25hbC5zaWduYWwoc2lnLCBoYW5kbGVyKSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgc2lnbmFsLnNpZ25hbCgtMSwgaGFuZGxlcikKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgc2lnbmFsLnNpZ25hbCg3LCBoYW5kbGVyKQorCisKK2NsYXNzIFdha2V1cEZEVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfaW52YWxpZF9mZChzZWxmKToKKyAgICAgICAgZmQgPSB0ZXN0X3N1cHBvcnQubWFrZV9iYWRfZmQoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzaWduYWwuc2V0X3dha2V1cF9mZCwgZmQpCisKKworQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIk5vdCB2YWxpZCBvbiBXaW5kb3dzIikKK2NsYXNzIFdha2V1cFNpZ25hbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBUSU1FT1VUX0ZVTEwgPSAxMAorICAgIFRJTUVPVVRfSEFMRiA9IDUKKworICAgIGRlZiB0ZXN0X3dha2V1cF9mZF9lYXJseShzZWxmKToKKyAgICAgICAgaW1wb3J0IHNlbGVjdAorCisgICAgICAgIHNpZ25hbC5hbGFybSgxKQorICAgICAgICBiZWZvcmVfdGltZSA9IHRpbWUudGltZSgpCisgICAgICAgICMgV2UgYXR0ZW1wdCB0byBnZXQgYSBzaWduYWwgZHVyaW5nIHRoZSBzbGVlcCwKKyAgICAgICAgIyBiZWZvcmUgc2VsZWN0IGlzIGNhbGxlZAorICAgICAgICB0aW1lLnNsZWVwKHNlbGYuVElNRU9VVF9GVUxMKQorICAgICAgICBtaWRfdGltZSA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtaWRfdGltZSAtIGJlZm9yZV90aW1lIDwgc2VsZi5USU1FT1VUX0hBTEYpCisgICAgICAgIHNlbGVjdC5zZWxlY3QoW3NlbGYucmVhZF0sIFtdLCBbXSwgc2VsZi5USU1FT1VUX0ZVTEwpCisgICAgICAgIGFmdGVyX3RpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWZ0ZXJfdGltZSAtIG1pZF90aW1lIDwgc2VsZi5USU1FT1VUX0hBTEYpCisKKyAgICBkZWYgdGVzdF93YWtldXBfZmRfZHVyaW5nKHNlbGYpOgorICAgICAgICBpbXBvcnQgc2VsZWN0CisKKyAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgIGJlZm9yZV90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgIyBXZSBhdHRlbXB0IHRvIGdldCBhIHNpZ25hbCBkdXJpbmcgdGhlIHNlbGVjdCBjYWxsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGVjdC5lcnJvciwgc2VsZWN0LnNlbGVjdCwKKyAgICAgICAgICAgIFtzZWxmLnJlYWRdLCBbXSwgW10sIHNlbGYuVElNRU9VVF9GVUxMKQorICAgICAgICBhZnRlcl90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFmdGVyX3RpbWUgLSBiZWZvcmVfdGltZSA8IHNlbGYuVElNRU9VVF9IQUxGKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpbXBvcnQgZmNudGwKKworICAgICAgICBzZWxmLmFscm0gPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBsYW1iZGEgeCx5Ok5vbmUpCisgICAgICAgIHNlbGYucmVhZCwgc2VsZi53cml0ZSA9IG9zLnBpcGUoKQorICAgICAgICBmbGFncyA9IGZjbnRsLmZjbnRsKHNlbGYud3JpdGUsIGZjbnRsLkZfR0VURkwsIDApCisgICAgICAgIGZsYWdzID0gZmxhZ3MgfCBvcy5PX05PTkJMT0NLCisgICAgICAgIGZjbnRsLmZjbnRsKHNlbGYud3JpdGUsIGZjbnRsLkZfU0VURkwsIGZsYWdzKQorICAgICAgICBzZWxmLm9sZF93YWtldXAgPSBzaWduYWwuc2V0X3dha2V1cF9mZChzZWxmLndyaXRlKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzaWduYWwuc2V0X3dha2V1cF9mZChzZWxmLm9sZF93YWtldXApCisgICAgICAgIG9zLmNsb3NlKHNlbGYucmVhZCkKKyAgICAgICAgb3MuY2xvc2Uoc2VsZi53cml0ZSkKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgc2VsZi5hbHJtKQorCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiTm90IHZhbGlkIG9uIFdpbmRvd3MiKQorY2xhc3MgU2lnaW50ZXJydXB0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIkluc3RhbGwgYSBuby1vcCBzaWduYWwgaGFuZGxlciB0aGF0IGNhbiBiZSBzZXQgdG8gYWxsb3cKKyAgICAgICAgaW50ZXJydXB0cyBvciBub3QsIGFuZCBhcnJhbmdlIGZvciB0aGUgb3JpZ2luYWwgc2lnbmFsIGhhbmRsZXIgdG8gYmUKKyAgICAgICAgcmUtaW5zdGFsbGVkIHdoZW4gdGhlIHRlc3QgaXMgZmluaXNoZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnNpZ251bSA9IHNpZ25hbC5TSUdVU1IxCisgICAgICAgIG9sZGhhbmRsZXIgPSBzaWduYWwuc2lnbmFsKHNlbGYuc2lnbnVtLCBsYW1iZGEgeCx5OiBOb25lKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2lnbmFsLnNpZ25hbCwgc2VsZi5zaWdudW0sIG9sZGhhbmRsZXIpCisKKyAgICBkZWYgcmVhZHBpcGVfaW50ZXJydXB0ZWQoc2VsZik6CisgICAgICAgICIiIlBlcmZvcm0gYSByZWFkIGR1cmluZyB3aGljaCBhIHNpZ25hbCB3aWxsIGFycml2ZS4gIFJldHVybiBUcnVlIGlmIHRoZQorICAgICAgICByZWFkIGlzIGludGVycnVwdGVkIGJ5IHRoZSBzaWduYWwgYW5kIHJhaXNlcyBhbiBleGNlcHRpb24uICBSZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgaXQgcmV0dXJucyBub3JtYWxseS4KKyAgICAgICAgIiIiCisgICAgICAgICMgQ3JlYXRlIGEgcGlwZSB0aGF0IGNhbiBiZSB1c2VkIGZvciB0aGUgcmVhZC4gIEFsc28gY2xlYW4gaXQgdXAKKyAgICAgICAgIyB3aGVuIHRoZSB0ZXN0IGlzIG92ZXIsIHNpbmNlIG5vdGhpbmcgZWxzZSB3aWxsIChidXQgc2VlIGJlbG93IGZvcgorICAgICAgICAjIHRoZSB3cml0ZSBlbmQpLgorICAgICAgICByLCB3ID0gb3MucGlwZSgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5jbG9zZSwgcikKKworICAgICAgICAjIENyZWF0ZSBhbm90aGVyIHByb2Nlc3Mgd2hpY2ggY2FuIHNlbmQgYSBzaWduYWwgdG8gdGhpcyBvbmUgdG8gdHJ5CisgICAgICAgICMgdG8gaW50ZXJydXB0IHRoZSByZWFkLgorICAgICAgICBwcGlkID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgcGlkID0gb3MuZm9yaygpCisKKyAgICAgICAgaWYgcGlkID09IDA6CisgICAgICAgICAgICAjIENoaWxkIGNvZGU6IHNsZWVwIHRvIGdpdmUgdGhlIHBhcmVudCBlbm91Z2ggdGltZSB0byBlbnRlciB0aGUKKyAgICAgICAgICAgICMgcmVhZCgpIGNhbGwgKHRoZXJlJ3MgYSByYWNlIGhlcmUsIGJ1dCBpdCdzIHJlYWxseSB0cmlja3kgdG8KKyAgICAgICAgICAgICMgZWxpbWluYXRlIGl0KTsgdGhlbiBzaWduYWwgdGhlIHBhcmVudCBwcm9jZXNzLiAgQWxzbywgc2xlZXAKKyAgICAgICAgICAgICMgYWdhaW4gdG8gbWFrZSBpdCBsaWtlbHkgdGhhdCB0aGUgc2lnbmFsIGlzIGRlbGl2ZXJlZCB0byB0aGUKKyAgICAgICAgICAgICMgcGFyZW50IHByb2Nlc3MgYmVmb3JlIHRoZSBjaGlsZCBleGl0cy4gIElmIHRoZSBjaGlsZCBleGl0cworICAgICAgICAgICAgIyBmaXJzdCwgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZSB3aWxsIGJlIGNsb3NlZCBhbmQgdGhlIHRlc3QKKyAgICAgICAgICAgICMgaXMgaW52YWxpZC4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMikKKyAgICAgICAgICAgICAgICBvcy5raWxsKHBwaWQsIHNlbGYuc2lnbnVtKQorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4yKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAjIE5vIG1hdHRlciB3aGF0LCBqdXN0IGV4aXQgYXMgZmFzdCBhcyBwb3NzaWJsZSBub3cuCisgICAgICAgICAgICAgICAgZXhpdF9zdWJwcm9jZXNzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgUGFyZW50IGNvZGUuCisgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgY2hpbGQgaXMgZXZlbnR1YWxseSByZWFwZWQsIGVsc2UgaXQnbGwgYmUgYQorICAgICAgICAgICAgIyB6b21iaWUgZm9yIHRoZSByZXN0IG9mIHRoZSB0ZXN0IHN1aXRlIHJ1bi4KKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy53YWl0cGlkLCBwaWQsIDApCisKKyAgICAgICAgICAgICMgQ2xvc2UgdGhlIHdyaXRlIGVuZCBvZiB0aGUgcGlwZS4gIFRoZSBjaGlsZCBoYXMgYSBjb3B5LCBzbworICAgICAgICAgICAgIyBpdCdzIG5vdCByZWFsbHkgY2xvc2VkIHVudGlsIHRoZSBjaGlsZCBleGl0cy4gIFdlIG5lZWQgaXQgdG8KKyAgICAgICAgICAgICMgY2xvc2Ugd2hlbiB0aGUgY2hpbGQgZXhpdHMgc28gdGhhdCBpbiB0aGUgbm9uLWludGVycnVwdCBjYXNlCisgICAgICAgICAgICAjIHRoZSByZWFkIGV2ZW50dWFsbHkgY29tcGxldGVzLCBvdGhlcndpc2Ugd2UgY291bGQganVzdCBjbG9zZQorICAgICAgICAgICAgIyBpdCAqYWZ0ZXIqIHRoZSB0ZXN0LgorICAgICAgICAgICAgb3MuY2xvc2UodykKKworICAgICAgICAgICAgIyBUcnkgdGhlIHJlYWQgYW5kIHJlcG9ydCB3aGV0aGVyIGl0IGlzIGludGVycnVwdGVkIG9yIG5vdCB0bworICAgICAgICAgICAgIyB0aGUgY2FsbGVyLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGQgPSBvcy5yZWFkKHIsIDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIGlmIGVyci5lcnJubyAhPSBlcnJuby5FSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHRlc3Rfd2l0aG91dF9zaWdpbnRlcnJ1cHQoc2VsZik6CisgICAgICAgICIiIklmIGEgc2lnbmFsIGhhbmRsZXIgaXMgaW5zdGFsbGVkIGFuZCBzaWdpbnRlcnJ1cHQgaXMgbm90IGNhbGxlZAorICAgICAgICBhdCBhbGwsIHdoZW4gdGhhdCBzaWduYWwgYXJyaXZlcywgaXQgaW50ZXJydXB0cyBhIHN5c2NhbGwgdGhhdCdzIGluCisgICAgICAgIHByb2dyZXNzLgorICAgICAgICAiIiIKKyAgICAgICAgaSA9IHNlbGYucmVhZHBpcGVfaW50ZXJydXB0ZWQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaSkKKyAgICAgICAgIyBBcnJpdmFsIG9mIHRoZSBzaWduYWwgc2hvdWxkbid0IGhhdmUgY2hhbmdlZCBhbnl0aGluZy4KKyAgICAgICAgaSA9IHNlbGYucmVhZHBpcGVfaW50ZXJydXB0ZWQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaSkKKworICAgIGRlZiB0ZXN0X3NpZ2ludGVycnVwdF9vbihzZWxmKToKKyAgICAgICAgIiIiSWYgYSBzaWduYWwgaGFuZGxlciBpcyBpbnN0YWxsZWQgYW5kIHNpZ2ludGVycnVwdCBpcyBjYWxsZWQgd2l0aAorICAgICAgICBhIHRydWUgdmFsdWUgZm9yIHRoZSBzZWNvbmQgYXJndW1lbnQsIHdoZW4gdGhhdCBzaWduYWwgYXJyaXZlcywgaXQKKyAgICAgICAgaW50ZXJydXB0cyBhIHN5c2NhbGwgdGhhdCdzIGluIHByb2dyZXNzLgorICAgICAgICAiIiIKKyAgICAgICAgc2lnbmFsLnNpZ2ludGVycnVwdChzZWxmLnNpZ251bSwgMSkKKyAgICAgICAgaSA9IHNlbGYucmVhZHBpcGVfaW50ZXJydXB0ZWQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaSkKKyAgICAgICAgIyBBcnJpdmFsIG9mIHRoZSBzaWduYWwgc2hvdWxkbid0IGhhdmUgY2hhbmdlZCBhbnl0aGluZy4KKyAgICAgICAgaSA9IHNlbGYucmVhZHBpcGVfaW50ZXJydXB0ZWQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaSkKKworICAgIGRlZiB0ZXN0X3NpZ2ludGVycnVwdF9vZmYoc2VsZik6CisgICAgICAgICIiIklmIGEgc2lnbmFsIGhhbmRsZXIgaXMgaW5zdGFsbGVkIGFuZCBzaWdpbnRlcnJ1cHQgaXMgY2FsbGVkIHdpdGgKKyAgICAgICAgYSBmYWxzZSB2YWx1ZSBmb3IgdGhlIHNlY29uZCBhcmd1bWVudCwgd2hlbiB0aGF0IHNpZ25hbCBhcnJpdmVzLCBpdAorICAgICAgICBkb2VzIG5vdCBpbnRlcnJ1cHQgYSBzeXNjYWxsIHRoYXQncyBpbiBwcm9ncmVzcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNpZ25hbC5zaWdpbnRlcnJ1cHQoc2VsZi5zaWdudW0sIDApCisgICAgICAgIGkgPSBzZWxmLnJlYWRwaXBlX2ludGVycnVwdGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpKQorICAgICAgICAjIEFycml2YWwgb2YgdGhlIHNpZ25hbCBzaG91bGRuJ3QgaGF2ZSBjaGFuZ2VkIGFueXRoaW5nLgorICAgICAgICBpID0gc2VsZi5yZWFkcGlwZV9pbnRlcnJ1cHRlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaSkKKworCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiTm90IHZhbGlkIG9uIFdpbmRvd3MiKQorY2xhc3MgSXRpbWVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmhuZGxfY2FsbGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5obmRsX2NvdW50ID0gMAorICAgICAgICBzZWxmLml0aW1lciA9IE5vbmUKKyAgICAgICAgc2VsZi5vbGRfYWxhcm0gPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBzZWxmLnNpZ19hbHJtKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBzZWxmLm9sZF9hbGFybSkKKyAgICAgICAgaWYgc2VsZi5pdGltZXIgaXMgbm90IE5vbmU6ICMgdGVzdF9pdGltZXJfZXhjIGRvZXNuJ3QgY2hhbmdlIHRoaXMgYXR0cgorICAgICAgICAgICAgIyBqdXN0IGVuc3VyZSB0aGF0IGl0aW1lciBpcyBzdG9wcGVkCisgICAgICAgICAgICBzaWduYWwuc2V0aXRpbWVyKHNlbGYuaXRpbWVyLCAwKQorCisgICAgZGVmIHNpZ19hbHJtKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5obmRsX2NhbGxlZCA9IFRydWUKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiU0lHQUxSTSBoYW5kbGVyIGludm9rZWQiLCBhcmdzKQorCisgICAgZGVmIHNpZ192dGFscm0oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLmhuZGxfY2FsbGVkID0gVHJ1ZQorCisgICAgICAgIGlmIHNlbGYuaG5kbF9jb3VudCA+IDM6CisgICAgICAgICAgICAjIGl0IHNob3VsZG4ndCBiZSBoZXJlLCBiZWNhdXNlIGl0IHNob3VsZCBoYXZlIGJlZW4gZGlzYWJsZWQuCisgICAgICAgICAgICByYWlzZSBzaWduYWwuSXRpbWVyRXJyb3IoInNldGl0aW1lciBkaWRuJ3QgZGlzYWJsZSBJVElNRVJfVklSVFVBTCAiCisgICAgICAgICAgICAgICAgInRpbWVyLiIpCisgICAgICAgIGVsaWYgc2VsZi5obmRsX2NvdW50ID09IDM6CisgICAgICAgICAgICAjIGRpc2FibGUgSVRJTUVSX1ZJUlRVQUwsIHRoaXMgZnVuY3Rpb24gc2hvdWxkbid0IGJlIGNhbGxlZCBhbnltb3JlCisgICAgICAgICAgICBzaWduYWwuc2V0aXRpbWVyKHNpZ25hbC5JVElNRVJfVklSVFVBTCwgMCkKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50KCJsYXN0IFNJR1ZUQUxSTSBoYW5kbGVyIGNhbGwiKQorCisgICAgICAgIHNlbGYuaG5kbF9jb3VudCArPSAxCisKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiU0lHVlRBTFJNIGhhbmRsZXIgaW52b2tlZCIsIGFyZ3MpCisKKyAgICBkZWYgc2lnX3Byb2Yoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLmhuZGxfY2FsbGVkID0gVHJ1ZQorICAgICAgICBzaWduYWwuc2V0aXRpbWVyKHNpZ25hbC5JVElNRVJfUFJPRiwgMCkKKworICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50KCJTSUdQUk9GIGhhbmRsZXIgaW52b2tlZCIsIGFyZ3MpCisKKyAgICBkZWYgdGVzdF9pdGltZXJfZXhjKHNlbGYpOgorICAgICAgICAjIFhYWCBJJ20gYXNzdW1pbmcgLTEgaXMgYW4gaW52YWxpZCBpdGltZXIsIGJ1dCBtYXliZSBzb21lIHBsYXRmb3JtCisgICAgICAgICMgZGVmaW5lcyBpdCA/CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNpZ25hbC5JdGltZXJFcnJvciwgc2lnbmFsLnNldGl0aW1lciwgLTEsIDApCisgICAgICAgICMgTmVnYXRpdmUgdGltZXMgYXJlIHRyZWF0ZWQgYXMgemVybyBvbiBzb21lIHBsYXRmb3Jtcy4KKyAgICAgICAgaWYgMDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNpZ25hbC5JdGltZXJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbC5zZXRpdGltZXIsIHNpZ25hbC5JVElNRVJfUkVBTCwgLTEpCisKKyAgICBkZWYgdGVzdF9pdGltZXJfcmVhbChzZWxmKToKKyAgICAgICAgc2VsZi5pdGltZXIgPSBzaWduYWwuSVRJTUVSX1JFQUwKKyAgICAgICAgc2lnbmFsLnNldGl0aW1lcihzZWxmLml0aW1lciwgMS4wKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50KCJcbmNhbGwgcGF1c2UoKS4uLiIpCisgICAgICAgIHNpZ25hbC5wYXVzZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhuZGxfY2FsbGVkLCBUcnVlKQorCisgICAgIyBJc3N1ZSAzODY0LiBVbmtub3duIGlmIHRoaXMgYWZmZWN0cyBlYXJsaWVyIHZlcnNpb25zIG9mIGZyZWVic2QgYWxzby4KKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSBpbiAoJ2ZyZWVic2Q2JywgJ25ldGJzZDUnKSwKKyAgICAgICAgJ2l0aW1lciBub3QgcmVsaWFibGUgKGRvZXMgbm90IG1peCB3ZWxsIHdpdGggdGhyZWFkaW5nKSBvbiBzb21lIEJTRHMuJykKKyAgICBkZWYgdGVzdF9pdGltZXJfdmlydHVhbChzZWxmKToKKyAgICAgICAgc2VsZi5pdGltZXIgPSBzaWduYWwuSVRJTUVSX1ZJUlRVQUwKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVlRBTFJNLCBzZWxmLnNpZ192dGFscm0pCisgICAgICAgIHNpZ25hbC5zZXRpdGltZXIoc2VsZi5pdGltZXIsIDAuMywgMC4yKQorCisgICAgICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICB3aGlsZSB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUgPCA2MC4wOgorICAgICAgICAgICAgIyB1c2UgdXAgc29tZSB2aXJ0dWFsIHRpbWUgYnkgZG9pbmcgcmVhbCB3b3JrCisgICAgICAgICAgICBfID0gcG93KDEyMzQ1LCA2Nzg5MCwgMTAwMDAwMTkpCisgICAgICAgICAgICBpZiBzaWduYWwuZ2V0aXRpbWVyKHNlbGYuaXRpbWVyKSA9PSAoMC4wLCAwLjApOgorICAgICAgICAgICAgICAgIGJyZWFrICMgc2lnX3Z0YWxybSBoYW5kbGVyIHN0b3BwZWQgdGhpcyBpdGltZXIKKyAgICAgICAgZWxzZTogIyBJc3N1ZSA4NDI0CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJ0aW1lb3V0OiBsaWtlbHkgY2F1c2U6IG1hY2hpbmUgdG9vIHNsb3cgb3IgbG9hZCB0b28gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlnaCIpCisKKyAgICAgICAgIyB2aXJ0dWFsIGl0aW1lciBzaG91bGQgYmUgKDAuMCwgMC4wKSBub3cKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYWwuZ2V0aXRpbWVyKHNlbGYuaXRpbWVyKSwgKDAuMCwgMC4wKSkKKyAgICAgICAgIyBhbmQgdGhlIGhhbmRsZXIgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhuZGxfY2FsbGVkLCBUcnVlKQorCisgICAgIyBJc3N1ZSAzODY0LiBVbmtub3duIGlmIHRoaXMgYWZmZWN0cyBlYXJsaWVyIHZlcnNpb25zIG9mIGZyZWVic2QgYWxzby4KKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybT09J2ZyZWVic2Q2JywKKyAgICAgICAgJ2l0aW1lciBub3QgcmVsaWFibGUgKGRvZXMgbm90IG1peCB3ZWxsIHdpdGggdGhyZWFkaW5nKSBvbiBmcmVlYnNkNicpCisgICAgZGVmIHRlc3RfaXRpbWVyX3Byb2Yoc2VsZik6CisgICAgICAgIHNlbGYuaXRpbWVyID0gc2lnbmFsLklUSU1FUl9QUk9GCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1BST0YsIHNlbGYuc2lnX3Byb2YpCisgICAgICAgIHNpZ25hbC5zZXRpdGltZXIoc2VsZi5pdGltZXIsIDAuMiwgMC4yKQorCisgICAgICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICB3aGlsZSB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUgPCA2MC4wOgorICAgICAgICAgICAgIyBkbyBzb21lIHdvcmsKKyAgICAgICAgICAgIF8gPSBwb3coMTIzNDUsIDY3ODkwLCAxMDAwMDAxOSkKKyAgICAgICAgICAgIGlmIHNpZ25hbC5nZXRpdGltZXIoc2VsZi5pdGltZXIpID09ICgwLjAsIDAuMCk6CisgICAgICAgICAgICAgICAgYnJlYWsgIyBzaWdfcHJvZiBoYW5kbGVyIHN0b3BwZWQgdGhpcyBpdGltZXIKKyAgICAgICAgZWxzZTogIyBJc3N1ZSA4NDI0CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJ0aW1lb3V0OiBsaWtlbHkgY2F1c2U6IG1hY2hpbmUgdG9vIHNsb3cgb3IgbG9hZCB0b28gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlnaCIpCisKKyAgICAgICAgIyBwcm9maWxpbmcgaXRpbWVyIHNob3VsZCBiZSAoMC4wLCAwLjApIG5vdworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hbC5nZXRpdGltZXIoc2VsZi5pdGltZXIpLCAoMC4wLCAwLjApKQorICAgICAgICAjIGFuZCB0aGUgaGFuZGxlciBzaG91bGQgaGF2ZSBiZWVuIGNhbGxlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaG5kbF9jYWxsZWQsIFRydWUpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEJhc2ljU2lnbmFsVGVzdHMsIEludGVyUHJvY2Vzc1NpZ25hbFRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FrZXVwRkRUZXN0cywgV2FrZXVwU2lnbmFsVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaWdpbnRlcnJ1cHRUZXN0LCBJdGltZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93c1NpZ25hbFRlc3RzKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NpZ25hbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaWduYWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNGQ1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaWduYWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NpZ25hbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaWduYWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNGQ1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaWduYWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NpdGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjVmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaXRlLnB5CkBAIC0wLDAgKzEsMzk0IEBACisiIiJUZXN0cyBmb3IgJ3NpdGUnLgorCitUZXN0cyBhc3N1bWUgdGhlIGluaXRpYWwgcGF0aHMgaW4gc3lzLnBhdGggb25jZSB0aGUgaW50ZXJwcmV0ZXIgaGFzIGJlZ3VuCitleGVjdXRpbmcgaGF2ZSBub3QgYmVlbiByZW1vdmVkLgorCisiIiIKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBURVNURk4sIEVudmlyb25tZW50VmFyR3VhcmQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGNhcHR1cmVkX291dHB1dAoraW1wb3J0IF9fYnVpbHRpbl9fCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IGVuY29kaW5ncworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXNjb25maWcKK2Zyb20gY29weSBpbXBvcnQgY29weQorCisjIE5lZWQgdG8gbWFrZSBzdXJlIHRvIG5vdCBpbXBvcnQgJ3NpdGUnIGlmIHNvbWVvbmUgc3BlY2lmaWVkIGBgLVNgYCBhdCB0aGUKKyMgY29tbWFuZC1saW5lLiAgRGV0ZWN0IHRoaXMgYnkganVzdCBtYWtpbmcgc3VyZSAnc2l0ZScgaGFzIG5vdCBiZWVuIGltcG9ydGVkCisjIGFscmVhZHkuCitpZiAic2l0ZSIgaW4gc3lzLm1vZHVsZXM6CisgICAgaW1wb3J0IHNpdGUKK2Vsc2U6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoImltcG9ydGF0aW9uIG9mIHNpdGUucHkgc3VwcHJlc3NlZCIpCisKK2lmIHNpdGUuRU5BQkxFX1VTRVJfU0lURSBhbmQgbm90IG9zLnBhdGguaXNkaXIoc2l0ZS5VU0VSX1NJVEUpOgorICAgICMgbmVlZCB0byBhZGQgdXNlciBzaXRlIGRpcmVjdG9yeSBmb3IgdGVzdHMKKyAgICBvcy5tYWtlZGlycyhzaXRlLlVTRVJfU0lURSkKKyAgICBzaXRlLmFkZHNpdGVkaXIoc2l0ZS5VU0VSX1NJVEUpCisKK2NsYXNzIEhlbHBlckZ1bmN0aW9uc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgaGVscGVyIGZ1bmN0aW9ucy4KKworICAgIFRoZSBzZXR0aW5nIG9mIHRoZSBlbmNvZGluZyAoc2V0IHVzaW5nIHN5cy5zZXRkZWZhdWx0ZW5jb2RpbmcpIHVzZWQgYnkKKyAgICB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbiBpcyBub3QgdGVzdGVkLgorCisgICAgIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIlNhdmUgYSBjb3B5IG9mIHN5cy5wYXRoIiIiCisgICAgICAgIHNlbGYuc3lzX3BhdGggPSBzeXMucGF0aFs6XQorICAgICAgICBzZWxmLm9sZF9iYXNlID0gc2l0ZS5VU0VSX0JBU0UKKyAgICAgICAgc2VsZi5vbGRfc2l0ZSA9IHNpdGUuVVNFUl9TSVRFCisgICAgICAgIHNlbGYub2xkX3ByZWZpeGVzID0gc2l0ZS5QUkVGSVhFUworICAgICAgICBzZWxmLm9sZF92YXJzID0gY29weShzeXNjb25maWcuX0NPTkZJR19WQVJTKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAiIiJSZXN0b3JlIHN5cy5wYXRoIiIiCisgICAgICAgIHN5cy5wYXRoWzpdID0gc2VsZi5zeXNfcGF0aAorICAgICAgICBzaXRlLlVTRVJfQkFTRSA9IHNlbGYub2xkX2Jhc2UKKyAgICAgICAgc2l0ZS5VU0VSX1NJVEUgPSBzZWxmLm9sZF9zaXRlCisgICAgICAgIHNpdGUuUFJFRklYRVMgPSBzZWxmLm9sZF9wcmVmaXhlcworICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTID0gc2VsZi5vbGRfdmFycworCisgICAgZGVmIHRlc3RfbWFrZXBhdGgoc2VsZik6CisgICAgICAgICMgVGVzdCBtYWtlcGF0aCgpIGhhdmUgYW4gYWJzb2x1dGUgcGF0aCBmb3IgaXRzIGZpcnN0IHJldHVybiB2YWx1ZQorICAgICAgICAjIGFuZCBhIGNhc2Utbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBhYnNvbHV0ZSBwYXRoIGZvciBpdHMKKyAgICAgICAgIyBzZWNvbmQgdmFsdWUuCisgICAgICAgIHBhdGhfcGFydHMgPSAoIkJlZ2lubmluZyIsICJFbmQiKQorICAgICAgICBvcmlnaW5hbF9kaXIgPSBvcy5wYXRoLmpvaW4oKnBhdGhfcGFydHMpCisgICAgICAgIGFic19kaXIsIG5vcm1fZGlyID0gc2l0ZS5tYWtlcGF0aCgqcGF0aF9wYXJ0cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmFic3BhdGgob3JpZ2luYWxfZGlyKSwgYWJzX2RpcikKKyAgICAgICAgaWYgb3JpZ2luYWxfZGlyID09IG9zLnBhdGgubm9ybWNhc2Uob3JpZ2luYWxfZGlyKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzX2Rpciwgbm9ybV9kaXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGgubm9ybWNhc2UoYWJzX2RpciksIG5vcm1fZGlyKQorCisgICAgZGVmIHRlc3RfaW5pdF9wYXRoaW5mbyhzZWxmKToKKyAgICAgICAgZGlyX3NldCA9IHNpdGUuX2luaXRfcGF0aGluZm8oKQorICAgICAgICBmb3IgZW50cnkgaW4gW3NpdGUubWFrZXBhdGgocGF0aClbMV0gZm9yIHBhdGggaW4gc3lzLnBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBhdGggYW5kIG9zLnBhdGguaXNkaXIocGF0aCldOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlbnRyeSwgZGlyX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGZyb20gc3lzLnBhdGggbm90IGZvdW5kIGluIHNldCByZXR1cm5lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJieSBfaW5pdF9wYXRoaW5mbygpOiAlcyIgJSAoZW50cnksIGRpcl9zZXQpKQorCisgICAgZGVmIHB0aF9maWxlX3Rlc3RzKHNlbGYsIHB0aF9maWxlKToKKyAgICAgICAgIiIiQ29udGFpbiBjb21tb24gY29kZSBmb3IgdGVzdGluZyByZXN1bHRzIG9mIHJlYWRpbmcgYSAucHRoIGZpbGUiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRJbihwdGhfZmlsZS5pbXBvcnRlZCwgc3lzLm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgIiVzIG5vdCBpbiBzeXMubW9kdWxlcyIgJSBwdGhfZmlsZS5pbXBvcnRlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzaXRlLm1ha2VwYXRoKHB0aF9maWxlLmdvb2RfZGlyX3BhdGgpWzBdLCBzeXMucGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhwdGhfZmlsZS5iYWRfZGlyX3BhdGgpKQorCisgICAgZGVmIHRlc3RfYWRkcGFja2FnZShzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgYWRkcGFja2FnZSgpIGltcG9ydHMgaWYgdGhlIGxpbmUgc3RhcnRzIHdpdGggJ2ltcG9ydCcsCisgICAgICAgICMgYWRkcyBkaXJlY3RvcmllcyB0byBzeXMucGF0aCBmb3IgYW55IGxpbmUgaW4gdGhlIGZpbGUgdGhhdCBpcyBub3QgYQorICAgICAgICAjIGNvbW1lbnQgb3IgaW1wb3J0IHRoYXQgaXMgYSB2YWxpZCBkaXJlY3RvcnkgbmFtZSBmb3Igd2hlcmUgdGhlIC5wdGgKKyAgICAgICAgIyBmaWxlIHJlc2lkZXM7IGludmFsaWQgZGlyZWN0b3JpZXMgYXJlIG5vdCBhZGRlZAorICAgICAgICBwdGhfZmlsZSA9IFB0aEZpbGUoKQorICAgICAgICBwdGhfZmlsZS5jbGVhbnVwKHByZXA9VHJ1ZSkgICMgdG8gbWFrZSBzdXJlIHRoYXQgbm90aGluZyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZS1leGlzdGluZyB0aGF0IHNob3VsZG4ndCBiZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwdGhfZmlsZS5jcmVhdGUoKQorICAgICAgICAgICAgc2l0ZS5hZGRwYWNrYWdlKHB0aF9maWxlLmJhc2VfZGlyLCBwdGhfZmlsZS5maWxlbmFtZSwgc2V0KCkpCisgICAgICAgICAgICBzZWxmLnB0aF9maWxlX3Rlc3RzKHB0aF9maWxlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcHRoX2ZpbGUuY2xlYW51cCgpCisKKyAgICBkZWYgbWFrZV9wdGgoc2VsZiwgY29udGVudHMsIHB0aF9kaXI9Jy4nLCBwdGhfbmFtZT1URVNURk4pOgorICAgICAgICAjIENyZWF0ZSBhIC5wdGggZmlsZSBhbmQgcmV0dXJuIGl0cyAoYWJzcGF0aCwgYmFzZW5hbWUpLgorICAgICAgICBwdGhfZGlyID0gb3MucGF0aC5hYnNwYXRoKHB0aF9kaXIpCisgICAgICAgIHB0aF9iYXNlbmFtZSA9IHB0aF9uYW1lICsgJy5wdGgnCisgICAgICAgIHB0aF9mbiA9IG9zLnBhdGguam9pbihwdGhfZGlyLCBwdGhfYmFzZW5hbWUpCisgICAgICAgIHB0aF9maWxlID0gb3BlbihwdGhfZm4sICd3JykKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGxhbWJkYTogb3MucmVtb3ZlKHB0aF9mbikpCisgICAgICAgIHB0aF9maWxlLndyaXRlKGNvbnRlbnRzKQorICAgICAgICBwdGhfZmlsZS5jbG9zZSgpCisgICAgICAgIHJldHVybiBwdGhfZGlyLCBwdGhfYmFzZW5hbWUKKworICAgIGRlZiB0ZXN0X2FkZHBhY2thZ2VfaW1wb3J0X2JhZF9zeW50YXgoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTA2NDIKKyAgICAgICAgcHRoX2RpciwgcHRoX2ZuID0gc2VsZi5tYWtlX3B0aCgiaW1wb3J0IGJhZClzeW50YXhcbiIpCisgICAgICAgIHdpdGggY2FwdHVyZWRfb3V0cHV0KCJzdGRlcnIiKSBhcyBlcnJfb3V0OgorICAgICAgICAgICAgc2l0ZS5hZGRwYWNrYWdlKHB0aF9kaXIsIHB0aF9mbiwgc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhlcnJfb3V0LmdldHZhbHVlKCksICJsaW5lIDEiKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMoZXJyX291dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgcmUuZXNjYXBlKG9zLnBhdGguam9pbihwdGhfZGlyLCBwdGhfZm4pKSkKKyAgICAgICAgIyBYWFg6IHRoZSBwcmV2aW91cyB0d28gc2hvdWxkIGJlIGluZGVwZW5kZW50IGNoZWNrcyBzbyB0aGF0IHRoZQorICAgICAgICAjIG9yZGVyIGRvZXNuJ3QgbWF0dGVyLiAgVGhlIG5leHQgdGhyZWUgY291bGQgYmUgYSBzaW5nbGUgY2hlY2sKKyAgICAgICAgIyBidXQgbXkgcmVnZXggZm9vIGlzbid0IGdvb2QgZW5vdWdoIHRvIHdyaXRlIGl0LgorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMoZXJyX291dC5nZXR2YWx1ZSgpLCAnVHJhY2ViYWNrJykKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKGVycl9vdXQuZ2V0dmFsdWUoKSwgcidpbXBvcnQgYmFkXClzeW50YXgnKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMoZXJyX291dC5nZXR2YWx1ZSgpLCAnU3ludGF4RXJyb3InKQorCisgICAgZGVmIHRlc3RfYWRkcGFja2FnZV9pbXBvcnRfYmFkX2V4ZWMoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTA2NDIKKyAgICAgICAgcHRoX2RpciwgcHRoX2ZuID0gc2VsZi5tYWtlX3B0aCgicmFuZG9tcGF0aFxuaW1wb3J0IG5vc3VjaG1vZHVsZVxuIikKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9vdXRwdXQoInN0ZGVyciIpIGFzIGVycl9vdXQ6CisgICAgICAgICAgICBzaXRlLmFkZHBhY2thZ2UocHRoX2RpciwgcHRoX2ZuLCBzZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKGVycl9vdXQuZ2V0dmFsdWUoKSwgImxpbmUgMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhlcnJfb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICByZS5lc2NhcGUob3MucGF0aC5qb2luKHB0aF9kaXIsIHB0aF9mbikpKQorICAgICAgICAjIFhYWDogZGl0dG8gcHJldmlvdXMgWFhYIGNvbW1lbnQuCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhlcnJfb3V0LmdldHZhbHVlKCksICdUcmFjZWJhY2snKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMoZXJyX291dC5nZXR2YWx1ZSgpLCAnSW1wb3J0RXJyb3InKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbmRvd3MgZG9lcyBub3QgcmFpc2UgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICJlcnJvciBmb3IgZmlsZSBwYXRocyBjb250YWluaW5nIG51bGwgY2hhcmFjdGVycyIpCisgICAgZGVmIHRlc3RfYWRkcGFja2FnZV9pbXBvcnRfYmFkX3B0aF9maWxlKHNlbGYpOgorICAgICAgICAjIElzc3VlIDUyNTgKKyAgICAgICAgcHRoX2RpciwgcHRoX2ZuID0gc2VsZi5tYWtlX3B0aCgiYWJjXHgwMGRlZlxuIikKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9vdXRwdXQoInN0ZGVyciIpIGFzIGVycl9vdXQ6CisgICAgICAgICAgICBzaXRlLmFkZHBhY2thZ2UocHRoX2RpciwgcHRoX2ZuLCBzZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKGVycl9vdXQuZ2V0dmFsdWUoKSwgImxpbmUgMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhlcnJfb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICByZS5lc2NhcGUob3MucGF0aC5qb2luKHB0aF9kaXIsIHB0aF9mbikpKQorICAgICAgICAjIFhYWDogZGl0dG8gcHJldmlvdXMgWFhYIGNvbW1lbnQuCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhlcnJfb3V0LmdldHZhbHVlKCksICdUcmFjZWJhY2snKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMoZXJyX291dC5nZXR2YWx1ZSgpLCAnVHlwZUVycm9yJykKKworICAgIGRlZiB0ZXN0X2FkZHNpdGVkaXIoc2VsZik6CisgICAgICAgICMgU2FtZSB0ZXN0cyBmb3IgdGVzdF9hZGRwYWNrYWdlIHNpbmNlIGFkZHNpdGVkaXIoKSBlc3NlbnRpYWxseSBqdXN0CisgICAgICAgICMgY2FsbHMgYWRkcGFja2FnZSgpIGZvciBldmVyeSAucHRoIGZpbGUgaW4gdGhlIGRpcmVjdG9yeQorICAgICAgICBwdGhfZmlsZSA9IFB0aEZpbGUoKQorICAgICAgICBwdGhfZmlsZS5jbGVhbnVwKHByZXA9VHJ1ZSkgIyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIGlzIHByZS1leGlzdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGF0IGlzIHRlc3RlZCBmb3IKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHRoX2ZpbGUuY3JlYXRlKCkKKyAgICAgICAgICAgIHNpdGUuYWRkc2l0ZWRpcihwdGhfZmlsZS5iYXNlX2Rpciwgc2V0KCkpCisgICAgICAgICAgICBzZWxmLnB0aF9maWxlX3Rlc3RzKHB0aF9maWxlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcHRoX2ZpbGUuY2xlYW51cCgpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzaXRlLkVOQUJMRV9VU0VSX1NJVEUsICJyZXF1aXJlcyBhY2Nlc3MgdG8gUEVQIDM3MCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VyLXNpdGUgKHNpdGUuRU5BQkxFX1VTRVJfU0lURSkiKQorICAgIGRlZiB0ZXN0X3Nfb3B0aW9uKHNlbGYpOgorICAgICAgICB1c2Vyc2l0ZSA9IHNpdGUuVVNFUl9TSVRFCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odXNlcnNpdGUsIHN5cy5wYXRoKQorCisgICAgICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgJy1jJywKKyAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuZXhpdCglciBpbiBzeXMucGF0aCknICUgdXNlcnNpdGVdLAorICAgICAgICAgICAgZW52PWVudikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgMSwgIiVyIGlzIG5vdCBpbiBzeXMucGF0aCAoc3lzLmV4aXQgcmV0dXJuZWQgJXIpIgorICAgICAgICAgICAgICAgICUgKHVzZXJzaXRlLCByYykpCisKKyAgICAgICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgcmMgPSBzdWJwcm9jZXNzLmNhbGwoW3N5cy5leGVjdXRhYmxlLCAnLXMnLCAnLWMnLAorICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IHN5cy5leGl0KCVyIGluIHN5cy5wYXRoKScgJSB1c2Vyc2l0ZV0sCisgICAgICAgICAgICBlbnY9ZW52KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCAwKQorCisgICAgICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIGVudlsiUFlUSE9OTk9VU0VSU0lURSJdID0gIjEiCisgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgJy1jJywKKyAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuZXhpdCglciBpbiBzeXMucGF0aCknICUgdXNlcnNpdGVdLAorICAgICAgICAgICAgZW52PWVudikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgMCkKKworICAgICAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBlbnZbIlBZVEhPTlVTRVJCQVNFIl0gPSAiL3RtcCIKKyAgICAgICAgcmMgPSBzdWJwcm9jZXNzLmNhbGwoW3N5cy5leGVjdXRhYmxlLCAnLWMnLAorICAgICAgICAgICAgJ2ltcG9ydCBzeXMsIHNpdGU7IHN5cy5leGl0KHNpdGUuVVNFUl9CQVNFLnN0YXJ0c3dpdGgoIi90bXAiKSknXSwKKyAgICAgICAgICAgIGVudj1lbnYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDEpCisKKyAgICBkZWYgdGVzdF9nZXR1c2VyYmFzZShzZWxmKToKKyAgICAgICAgc2l0ZS5VU0VSX0JBU0UgPSBOb25lCisgICAgICAgIHVzZXJfYmFzZSA9IHNpdGUuZ2V0dXNlcmJhc2UoKQorCisgICAgICAgICMgdGhlIGNhbGwgc2V0cyBzaXRlLlVTRVJfQkFTRQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpdGUuVVNFUl9CQVNFLCB1c2VyX2Jhc2UpCisKKyAgICAgICAgIyBsZXQncyBzZXQgUFlUSE9OVVNFUkJBU0UgYW5kIHNlZSBpZiBpdCB1c2VzIGl0CisgICAgICAgIHNpdGUuVVNFUl9CQVNFID0gTm9uZQorICAgICAgICBpbXBvcnQgc3lzY29uZmlnCisgICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMgPSBOb25lCisKKyAgICAgICAgd2l0aCBFbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52aXJvbjoKKyAgICAgICAgICAgIGVudmlyb25bJ1BZVEhPTlVTRVJCQVNFJ10gPSAneG94bycKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaXRlLmdldHVzZXJiYXNlKCkuc3RhcnRzd2l0aCgneG94bycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpdGUuZ2V0dXNlcmJhc2UoKSkKKworICAgIGRlZiB0ZXN0X2dldHVzZXJzaXRlcGFja2FnZXMoc2VsZik6CisgICAgICAgIHNpdGUuVVNFUl9TSVRFID0gTm9uZQorICAgICAgICBzaXRlLlVTRVJfQkFTRSA9IE5vbmUKKyAgICAgICAgdXNlcl9zaXRlID0gc2l0ZS5nZXR1c2Vyc2l0ZXBhY2thZ2VzKCkKKworICAgICAgICAjIHRoZSBjYWxsIHNldHMgVVNFUl9CQVNFICphbmQqIFVTRVJfU0lURQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpdGUuVVNFUl9TSVRFLCB1c2VyX3NpdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX3NpdGUuc3RhcnRzd2l0aChzaXRlLlVTRVJfQkFTRSksIHVzZXJfc2l0ZSkKKworICAgIGRlZiB0ZXN0X2dldHNpdGVwYWNrYWdlcyhzZWxmKToKKyAgICAgICAgc2l0ZS5QUkVGSVhFUyA9IFsneG94byddCisgICAgICAgIGRpcnMgPSBzaXRlLmdldHNpdGVwYWNrYWdlcygpCisKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnb3MyZW14JywgJ3Jpc2NvcycpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGlycyksIDEpCisgICAgICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oJ3hveG8nLCAnTGliJywgJ3NpdGUtcGFja2FnZXMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXJzWzBdLCB3YW50ZWQpCisgICAgICAgIGVsaWYgKHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIiBhbmQKKyAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiUFlUSE9ORlJBTUVXT1JLIikpOgorICAgICAgICAgICAgIyBPUyBYIGZyYW1ld29yayBidWlsZHMKKyAgICAgICAgICAgIHNpdGUuUFJFRklYRVMgPSBbJ1B5dGhvbi5mcmFtZXdvcmsnXQorICAgICAgICAgICAgZGlycyA9IHNpdGUuZ2V0c2l0ZXBhY2thZ2VzKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpcnMpLCAzKQorICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCcvTGlicmFyeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJQWVRIT05GUkFNRVdPUksiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbls6M10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUtcGFja2FnZXMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXJzWzJdLCB3YW50ZWQpCisgICAgICAgIGVsaWYgb3Muc2VwID09ICcvJzoKKyAgICAgICAgICAgICMgT1MgWCBub24tZnJhbXdld29yayBidWlsZHMsIExpbnV4LCBGcmVlQlNELCBldGMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpcnMpLCAyKQorICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCd4b3hvJywgJ2xpYicsICdweXRob24nICsgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaXRlLXBhY2thZ2VzJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyc1swXSwgd2FudGVkKQorICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCd4b3hvJywgJ2xpYicsICdzaXRlLXB5dGhvbicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcnNbMV0sIHdhbnRlZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgb3RoZXIgcGxhdGZvcm1zCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaXJzKSwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyc1swXSwgJ3hveG8nKQorICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCd4b3hvJywgJ2xpYicsICdzaXRlLXBhY2thZ2VzJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyc1sxXSwgd2FudGVkKQorCitjbGFzcyBQdGhGaWxlKG9iamVjdCk6CisgICAgIiIiSGVscGVyIGNsYXNzIGZvciBoYW5kbGluZyB0ZXN0aW5nIG9mIC5wdGggZmlsZXMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZV9iYXNlPVRFU1RGTiwgaW1wb3J0ZWQ9InRpbWUiLAorICAgICAgICAgICAgICAgICAgICBnb29kX2Rpcm5hbWU9Il9fdGVzdGRpcl9fIiwgYmFkX2Rpcm5hbWU9Il9fYmFkIik6CisgICAgICAgICIiIkluaXRpYWxpemUgaW5zdGFuY2UgdmFyaWFibGVzIiIiCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZV9iYXNlICsgIi5wdGgiCisgICAgICAgIHNlbGYuYmFzZV9kaXIgPSBvcy5wYXRoLmFic3BhdGgoJycpCisgICAgICAgIHNlbGYuZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuYmFzZV9kaXIsIHNlbGYuZmlsZW5hbWUpCisgICAgICAgIHNlbGYuaW1wb3J0ZWQgPSBpbXBvcnRlZAorICAgICAgICBzZWxmLmdvb2RfZGlybmFtZSA9IGdvb2RfZGlybmFtZQorICAgICAgICBzZWxmLmJhZF9kaXJuYW1lID0gYmFkX2Rpcm5hbWUKKyAgICAgICAgc2VsZi5nb29kX2Rpcl9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuYmFzZV9kaXIsIHNlbGYuZ29vZF9kaXJuYW1lKQorICAgICAgICBzZWxmLmJhZF9kaXJfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmJhc2VfZGlyLCBzZWxmLmJhZF9kaXJuYW1lKQorCisgICAgZGVmIGNyZWF0ZShzZWxmKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgLnB0aCBmaWxlIHdpdGggYSBjb21tZW50LCBibGFuayBsaW5lcywgYW4gYGBpbXBvcnQKKyAgICAgICAgPHNlbGYuaW1wb3J0ZWQ+YGAsIGEgbGluZSB3aXRoIHNlbGYuZ29vZF9kaXJuYW1lLCBhbmQgYSBsaW5lIHdpdGgKKyAgICAgICAgc2VsZi5iYWRfZGlybmFtZS4KKworICAgICAgICBDcmVhdGlvbiBvZiB0aGUgZGlyZWN0b3J5IGZvciBzZWxmLmdvb2RfZGlyX3BhdGggKGJhc2VkIG9mZiBvZgorICAgICAgICBzZWxmLmdvb2RfZGlybmFtZSkgaXMgYWxzbyBwZXJmb3JtZWQuCisKKyAgICAgICAgTWFrZSBzdXJlIHRvIGNhbGwgc2VsZi5jbGVhbnVwKCkgdG8gdW5kbyBhbnl0aGluZyBkb25lIGJ5IHRoaXMgbWV0aG9kLgorCisgICAgICAgICIiIgorICAgICAgICBGSUxFID0gb3BlbihzZWxmLmZpbGVfcGF0aCwgJ3cnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmludD4+RklMRSwgIiNpbXBvcnQgQGJhZCBtb2R1bGUgbmFtZSIKKyAgICAgICAgICAgIHByaW50Pj5GSUxFLCAiXG4iCisgICAgICAgICAgICBwcmludD4+RklMRSwgImltcG9ydCAlcyIgJSBzZWxmLmltcG9ydGVkCisgICAgICAgICAgICBwcmludD4+RklMRSwgc2VsZi5nb29kX2Rpcm5hbWUKKyAgICAgICAgICAgIHByaW50Pj5GSUxFLCBzZWxmLmJhZF9kaXJuYW1lCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBGSUxFLmNsb3NlKCkKKyAgICAgICAgb3MubWtkaXIoc2VsZi5nb29kX2Rpcl9wYXRoKQorCisgICAgZGVmIGNsZWFudXAoc2VsZiwgcHJlcD1GYWxzZSk6CisgICAgICAgICIiIk1ha2Ugc3VyZSB0aGF0IHRoZSAucHRoIGZpbGUgaXMgZGVsZXRlZCwgc2VsZi5pbXBvcnRlZCBpcyBub3QgaW4KKyAgICAgICAgc3lzLm1vZHVsZXMsIGFuZCB0aGF0IGJvdGggc2VsZi5nb29kX2Rpcm5hbWUgYW5kIHNlbGYuYmFkX2Rpcm5hbWUgYXJlCisgICAgICAgIG5vdCBleGlzdGluZyBkaXJlY3Rvcmllcy4iIiIKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5maWxlX3BhdGgpOgorICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuZmlsZV9wYXRoKQorICAgICAgICBpZiBwcmVwOgorICAgICAgICAgICAgc2VsZi5pbXBvcnRlZF9tb2R1bGUgPSBzeXMubW9kdWxlcy5nZXQoc2VsZi5pbXBvcnRlZCkKKyAgICAgICAgICAgIGlmIHNlbGYuaW1wb3J0ZWRfbW9kdWxlOgorICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tzZWxmLmltcG9ydGVkXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5pbXBvcnRlZF9tb2R1bGU6CisgICAgICAgICAgICAgICAgc3lzLm1vZHVsZXNbc2VsZi5pbXBvcnRlZF0gPSBzZWxmLmltcG9ydGVkX21vZHVsZQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmdvb2RfZGlyX3BhdGgpOgorICAgICAgICAgICAgb3Mucm1kaXIoc2VsZi5nb29kX2Rpcl9wYXRoKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmJhZF9kaXJfcGF0aCk6CisgICAgICAgICAgICBvcy5ybWRpcihzZWxmLmJhZF9kaXJfcGF0aCkKKworY2xhc3MgSW1wb3J0U2lkZUVmZmVjdFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHNpZGUtZWZmZWN0cyBmcm9tIGltcG9ydGluZyAnc2l0ZScuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIk1ha2UgYSBjb3B5IG9mIHN5cy5wYXRoIiIiCisgICAgICAgIHNlbGYuc3lzX3BhdGggPSBzeXMucGF0aFs6XQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAiIiJSZXN0b3JlIHN5cy5wYXRoIiIiCisgICAgICAgIHN5cy5wYXRoWzpdID0gc2VsZi5zeXNfcGF0aAorCisgICAgZGVmIHRlc3RfYWJzX19maWxlX18oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGFsbCBpbXBvcnRlZCBtb2R1bGVzIGhhdmUgdGhlaXIgX19maWxlX18gYXR0cmlidXRlCisgICAgICAgICMgYXMgYW4gYWJzb2x1dGUgcGF0aC4KKyAgICAgICAgIyBIYW5kbGVkIGJ5IGFic19fZmlsZV9fKCkKKyAgICAgICAgc2l0ZS5hYnNfX2ZpbGVfXygpCisgICAgICAgIGZvciBtb2R1bGUgaW4gKHN5cywgb3MsIF9fYnVpbHRpbl9fKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2Ficyhtb2R1bGUuX19maWxlX18pLCByZXByKG1vZHVsZSkpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgIyBXZSBjb3VsZCB0cnkgZXZlcnl0aGluZyBpbiBzeXMubW9kdWxlczsgaG93ZXZlciwgd2hlbiByZWdydGVzdC5weQorICAgICAgICAjIHJ1bnMgc29tZXRoaW5nIGxpa2UgdGVzdF9mcm96ZW4gYmVmb3JlIHRlc3Rfc2l0ZSwgdGhlbiB3ZSB3aWxsCisgICAgICAgICMgYmUgdGVzdGluZyB0aGluZ3MgbG9hZGVkICphZnRlciogdGVzdF9zaXRlIGRpZCBwYXRoIG5vcm1hbGl6YXRpb24KKworICAgIGRlZiB0ZXN0X25vX2R1cGxpY2F0ZV9wYXRocyhzZWxmKToKKyAgICAgICAgIyBObyBkdXBsaWNhdGUgcGF0aHMgc2hvdWxkIGV4aXN0IGluIHN5cy5wYXRoCisgICAgICAgICMgSGFuZGxlZCBieSByZW1vdmVkdXBwYXRocygpCisgICAgICAgIHNpdGUucmVtb3ZlZHVwcGF0aHMoKQorICAgICAgICBzZWVuX3BhdGhzID0gc2V0KCkKKyAgICAgICAgZm9yIHBhdGggaW4gc3lzLnBhdGg6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKHBhdGgsIHNlZW5fcGF0aHMpCisgICAgICAgICAgICBzZWVuX3BhdGhzLmFkZChwYXRoKQorCisgICAgZGVmIHRlc3RfYWRkX2J1aWxkX2RpcihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgdGhlIGJ1aWxkIGRpcmVjdG9yeSdzIE1vZHVsZXMgZGlyZWN0b3J5IGlzIHVzZWQgd2hlbiBpdAorICAgICAgICAjIHNob3VsZCBiZS4KKyAgICAgICAgIyBYWFg6IGltcGxlbWVudAorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9zZXR0aW5nX3F1aXQoc2VsZik6CisgICAgICAgICMgJ3F1aXQnIGFuZCAnZXhpdCcgc2hvdWxkIGJlIGluamVjdGVkIGludG8gX19idWlsdGluX18KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoX19idWlsdGluX18sICJxdWl0IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKF9fYnVpbHRpbl9fLCAiZXhpdCIpKQorCisgICAgZGVmIHRlc3Rfc2V0dGluZ19jb3B5cmlnaHQoc2VsZik6CisgICAgICAgICMgJ2NvcHlyaWdodCcgYW5kICdjcmVkaXRzJyBzaG91bGQgYmUgaW4gX19idWlsdGluX18KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoX19idWlsdGluX18sICJjb3B5cmlnaHQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoX19idWlsdGluX18sICJjcmVkaXRzIikpCisKKyAgICBkZWYgdGVzdF9zZXR0aW5nX2hlbHAoc2VsZik6CisgICAgICAgICMgJ2hlbHAnIHNob3VsZCBiZSBzZXQgaW4gX19idWlsdGluX18KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoX19idWlsdGluX18sICJoZWxwIikpCisKKyAgICBkZWYgdGVzdF9hbGlhc2luZ19tYmNzKHNlbGYpOgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICAgICAgICAgIGltcG9ydCBsb2NhbGUKKyAgICAgICAgICAgIGlmIGxvY2FsZS5nZXRkZWZhdWx0bG9jYWxlKClbMV0uc3RhcnRzd2l0aCgnY3AnKToKKyAgICAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gZW5jb2RpbmdzLmFsaWFzZXMuYWxpYXNlcy5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlID09ICJtYmNzIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJkaWQgbm90IGFsaWFzIG1iY3MiKQorCisgICAgZGVmIHRlc3Rfc2V0ZGVmYXVsdGVuY29kaW5nX3JlbW92ZWQoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHN5cy5zZXRkZWZhdWx0ZW5jb2RpbmcgaXMgZ29uZQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoc3lzLCAic2V0ZGVmYXVsdGVuY29kaW5nIikpCisKKyAgICBkZWYgdGVzdF9zaXRlY3VzdG9taXplX2V4ZWN1dGVkKHNlbGYpOgorICAgICAgICAjIElmIHNpdGVjdXN0b21pemUgaXMgYXZhaWxhYmxlLCBpdCBzaG91bGQgaGF2ZSBiZWVuIGltcG9ydGVkLgorICAgICAgICBpZiAic2l0ZWN1c3RvbWl6ZSIgbm90IGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBzaXRlY3VzdG9taXplCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNpdGVjdXN0b21pemUgbm90IGltcG9ydGVkIGF1dG9tYXRpY2FsbHkiKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEhlbHBlckZ1bmN0aW9uc1Rlc3RzLCBJbXBvcnRTaWRlRWZmZWN0VGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NpdGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2l0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyN2Y2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NpdGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2l0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMyN2Y2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NsaWNlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2xpY2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMwNGQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NsaWNlLnB5CkBAIC0wLDAgKzEsMTM0IEBACisjIHRlc3RzIGZvciBzbGljZSBvYmplY3RzOyBpbiBwYXJ0aWN1bGFyIHRoZSBpbmRpY2VzIG1ldGhvZC4KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSBjUGlja2xlIGltcG9ydCBsb2FkcywgZHVtcHMKKworaW1wb3J0IHN5cworCitjbGFzcyBTbGljZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2xpY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2xpY2UsIDEsIDIsIDMsIDQpCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoc2xpY2UoMSwgMiwgMykpLCAic2xpY2UoMSwgMiwgMykiKQorCisgICAgZGVmIHRlc3RfaGFzaChzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgY2xlYXJpbmcgb2YgU0YgYnVnICM4MDA3OTYKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBzbGljZSg1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzbGljZSg1KS5fX2hhc2hfXykKKworICAgIGRlZiB0ZXN0X2NtcChzZWxmKToKKyAgICAgICAgczEgPSBzbGljZSgxLCAyLCAzKQorICAgICAgICBzMiA9IHNsaWNlKDEsIDIsIDMpCisgICAgICAgIHMzID0gc2xpY2UoMSwgMiwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMSwgczIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoczEsIHMzKQorCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEJhZENtcChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjCisgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgIyBTaWxlbmNlIFB5M2sgd2FybmluZworCisgICAgICAgIHMxID0gc2xpY2UoQmFkQ21wKCkpCisgICAgICAgIHMyID0gc2xpY2UoQmFkQ21wKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgY21wLCBzMSwgczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczEsIHMxKQorCisgICAgICAgIHMxID0gc2xpY2UoMSwgQmFkQ21wKCkpCisgICAgICAgIHMyID0gc2xpY2UoMSwgQmFkQ21wKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczEsIHMxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGNtcCwgczEsIHMyKQorCisgICAgICAgIHMxID0gc2xpY2UoMSwgMiwgQmFkQ21wKCkpCisgICAgICAgIHMyID0gc2xpY2UoMSwgMiwgQmFkQ21wKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczEsIHMxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGNtcCwgczEsIHMyKQorCisgICAgZGVmIHRlc3RfbWVtYmVycyhzZWxmKToKKyAgICAgICAgcyA9IHNsaWNlKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdGFydCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN0b3AsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdGVwLCBOb25lKQorCisgICAgICAgIHMgPSBzbGljZSgxLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RhcnQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdG9wLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RlcCwgTm9uZSkKKworICAgICAgICBzID0gc2xpY2UoMSwgMiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN0YXJ0LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RvcCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN0ZXAsIDMpCisKKyAgICAgICAgY2xhc3MgQW55Q2xhc3M6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgb2JqID0gQW55Q2xhc3MoKQorICAgICAgICBzID0gc2xpY2Uob2JqKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdG9wIGlzIG9iaikKKworICAgIGRlZiB0ZXN0X2luZGljZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoTm9uZSAgICAgICAgICAgKS5pbmRpY2VzKDEwKSwgKDAsIDEwLCAgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoTm9uZSwgIE5vbmUsICAyKS5pbmRpY2VzKDEwKSwgKDAsIDEwLCAgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoMSwgICAgIE5vbmUsICAyKS5pbmRpY2VzKDEwKSwgKDEsIDEwLCAgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoTm9uZSwgIE5vbmUsIC0xKS5pbmRpY2VzKDEwKSwgKDksIC0xLCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoTm9uZSwgIE5vbmUsIC0yKS5pbmRpY2VzKDEwKSwgKDksIC0xLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoMywgICAgIE5vbmUsIC0yKS5pbmRpY2VzKDEwKSwgKDMsIC0xLCAtMikpCisgICAgICAgICMgaXNzdWUgMzAwNCB0ZXN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKE5vbmUsIC05KS5pbmRpY2VzKDEwKSwgKDAsIDEsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKE5vbmUsIC0xMCkuaW5kaWNlcygxMCksICgwLCAwLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGljZShOb25lLCAtMTEpLmluZGljZXMoMTApLCAoMCwgMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoTm9uZSwgLTEwLCAtMSkuaW5kaWNlcygxMCksICg5LCAwLCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoTm9uZSwgLTExLCAtMSkuaW5kaWNlcygxMCksICg5LCAtMSwgLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKE5vbmUsIC0xMiwgLTEpLmluZGljZXMoMTApLCAoOSwgLTEsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGljZShOb25lLCA5KS5pbmRpY2VzKDEwKSwgKDAsIDksIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKE5vbmUsIDEwKS5pbmRpY2VzKDEwKSwgKDAsIDEwLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGljZShOb25lLCAxMSkuaW5kaWNlcygxMCksICgwLCAxMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoTm9uZSwgOCwgLTEpLmluZGljZXMoMTApLCAoOSwgOCwgLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKE5vbmUsIDksIC0xKS5pbmRpY2VzKDEwKSwgKDksIDksIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGljZShOb25lLCAxMCwgLTEpLmluZGljZXMoMTApLCAoOSwgOSwgLTEpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzbGljZSgtMTAwLCAgMTAwICAgICApLmluZGljZXMoMTApLAorICAgICAgICAgICAgc2xpY2UoTm9uZSkuaW5kaWNlcygxMCkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2xpY2UoMTAwLCAgLTEwMCwgIC0xKS5pbmRpY2VzKDEwKSwKKyAgICAgICAgICAgIHNsaWNlKE5vbmUsIE5vbmUsIC0xKS5pbmRpY2VzKDEwKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoLTEwMEwsIDEwMEwsIDJMKS5pbmRpY2VzKDEwKSwgKDAsIDEwLCAgMikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZSgxMClbOjpzeXMubWF4aW50IC0gMV0sIFswXSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzbGljZShOb25lKS5pbmRpY2VzLCAxTDw8MTAwKQorCisgICAgZGVmIHRlc3Rfc2V0c2xpY2Vfd2l0aG91dF9nZXRzbGljZShzZWxmKToKKyAgICAgICAgdG1wID0gW10KKyAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fc2V0c2xpY2VfXyhzZWxmLCBpLCBqLCBrKToKKyAgICAgICAgICAgICAgICB0bXAuYXBwZW5kKChpLCBqLCBrKSkKKworICAgICAgICB4ID0gWCgpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHhbMToyXSA9IDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG1wLCBbKDEsIDIsIDQyKV0pCisKKyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CisgICAgICAgIHMgPSBzbGljZSgxMCwgMjAsIDMpCisgICAgICAgIGZvciBwcm90b2NvbCBpbiAoMCwxLDIpOgorICAgICAgICAgICAgdCA9IGxvYWRzKGR1bXBzKHMsIHByb3RvY29sKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5pbmRpY2VzKDE1KSwgdC5pbmRpY2VzKDE1KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQocyksIGlkKHQpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTbGljZVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NsaWNlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NsaWNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM2NWYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2xpY2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NsaWNlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NsaWNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM2NWYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2xpY2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NtdHBsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxODA2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbGliLnB5CkBAIC0wLDAgKzEsNTE3IEBACitpbXBvcnQgYXN5bmNvcmUKK2ltcG9ydCBlbWFpbC51dGlscworaW1wb3J0IHNvY2tldAoraW1wb3J0IHNtdHBkCitpbXBvcnQgc210cGxpYgoraW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHNlbGVjdAorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkaW5nID0gTm9uZQorCitIT1NUID0gdGVzdF9zdXBwb3J0LkhPU1QKKworZGVmIHNlcnZlcihldnQsIGJ1Ziwgc2Vydik6CisgICAgc2Vydi5saXN0ZW4oNSkKKyAgICBldnQuc2V0KCkKKyAgICB0cnk6CisgICAgICAgIGNvbm4sIGFkZHIgPSBzZXJ2LmFjY2VwdCgpCisgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgbiA9IDUwMAorICAgICAgICB3aGlsZSBidWYgYW5kIG4gPiAwOgorICAgICAgICAgICAgciwgdywgZSA9IHNlbGVjdC5zZWxlY3QoW10sIFtjb25uXSwgW10pCisgICAgICAgICAgICBpZiB3OgorICAgICAgICAgICAgICAgIHNlbnQgPSBjb25uLnNlbmQoYnVmKQorICAgICAgICAgICAgICAgIGJ1ZiA9IGJ1ZltzZW50Ol0KKworICAgICAgICAgICAgbiAtPSAxCisKKyAgICAgICAgY29ubi5jbG9zZSgpCisgICAgZmluYWxseToKKyAgICAgICAgc2Vydi5jbG9zZSgpCisgICAgICAgIGV2dC5zZXQoKQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgR2VuZXJhbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fdGhyZWFkcyA9IHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQorICAgICAgICBzZWxmLmV2dCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoMTUpCisgICAgICAgIHNlbGYucG9ydCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zb2NrKQorICAgICAgICBzZXJ2YXJncyA9IChzZWxmLmV2dCwgIjIyMCBIb2xhIG11bmRvXG4iLCBzZWxmLnNvY2spCisgICAgICAgIHNlbGYudGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VydmVyLCBhcmdzPXNlcnZhcmdzKQorICAgICAgICBzZWxmLnRocmVhZC5zdGFydCgpCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorICAgICAgICBzZWxmLmV2dC5jbGVhcigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorICAgICAgICBzZWxmLnRocmVhZC5qb2luKCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnRocmVhZGluZ19jbGVhbnVwKCpzZWxmLl90aHJlYWRzKQorCisgICAgZGVmIHRlc3RCYXNpYzEoc2VsZik6CisgICAgICAgICMgY29ubmVjdHMKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNtdHAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RCYXNpYzIoc2VsZik6CisgICAgICAgICMgY29ubmVjdHMsIGluY2x1ZGUgcG9ydCBpbiBob3N0IG5hbWUKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUCgiJXM6JXMiICUgKEhPU1QsIHNlbGYucG9ydCkpCisgICAgICAgIHNtdHAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RMb2NhbEhvc3ROYW1lKHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgc3VwcGxpZWQgbG9jYWxfaG9zdG5hbWUgaXMgdXNlZAorICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgbG9jYWxfaG9zdG5hbWU9InRlc3Rob3N0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbXRwLmxvY2FsX2hvc3RuYW1lLCAidGVzdGhvc3QiKQorICAgICAgICBzbXRwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc210cC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisgICAgICAgIHNtdHAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RUaW1lb3V0Tm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQsIHRpbWVvdXQ9Tm9uZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc210cC5zb2NrLmdldHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzbXRwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dFZhbHVlKHNlbGYpOgorICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgdGltZW91dD0zMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbXRwLnNvY2suZ2V0dGltZW91dCgpLCAzMCkKKyAgICAgICAgc210cC5jbG9zZSgpCisKKworIyBUZXN0IHNlcnZlciB0aHJlYWQgdXNpbmcgdGhlIHNwZWNpZmllZCBTTVRQIHNlcnZlciBjbGFzcworZGVmIGRlYnVnZ2luZ19zZXJ2ZXIoc2Vydiwgc2Vydl9ldnQsIGNsaWVudF9ldnQpOgorICAgIHNlcnZfZXZ0LnNldCgpCisKKyAgICB0cnk6CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZWN0LCAncG9sbCcpOgorICAgICAgICAgICAgcG9sbF9mdW4gPSBhc3luY29yZS5wb2xsMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcG9sbF9mdW4gPSBhc3luY29yZS5wb2xsCisKKyAgICAgICAgbiA9IDEwMDAKKyAgICAgICAgd2hpbGUgYXN5bmNvcmUuc29ja2V0X21hcCBhbmQgbiA+IDA6CisgICAgICAgICAgICBwb2xsX2Z1bigwLjAxLCBhc3luY29yZS5zb2NrZXRfbWFwKQorCisgICAgICAgICAgICAjIHdoZW4gdGhlIGNsaWVudCBjb252ZXJzYXRpb24gaXMgZmluaXNoZWQsIGl0IHdpbGwKKyAgICAgICAgICAgICMgc2V0IGNsaWVudF9ldnQsIGFuZCBpdCdzIHRoZW4gb2sgdG8ga2lsbCB0aGUgc2VydmVyCisgICAgICAgICAgICBpZiBjbGllbnRfZXZ0LmlzX3NldCgpOgorICAgICAgICAgICAgICAgIHNlcnYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIG4gLT0gMQorCisgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICBwYXNzCisgICAgZmluYWxseToKKyAgICAgICAgaWYgbm90IGNsaWVudF9ldnQuaXNfc2V0KCk6CisgICAgICAgICAgICAjIGFsbG93IHNvbWUgdGltZSBmb3IgdGhlIGNsaWVudCB0byByZWFkIHRoZSByZXN1bHQKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC41KQorICAgICAgICAgICAgc2Vydi5jbG9zZSgpCisgICAgICAgIGFzeW5jb3JlLmNsb3NlX2FsbCgpCisgICAgICAgIHNlcnZfZXZ0LnNldCgpCisKK01TR19CRUdJTiA9ICctLS0tLS0tLS0tIE1FU1NBR0UgRk9MTE9XUyAtLS0tLS0tLS0tXG4nCitNU0dfRU5EID0gJy0tLS0tLS0tLS0tLSBFTkQgTUVTU0FHRSAtLS0tLS0tLS0tLS1cbicKKworIyBOT1RFOiBTb21lIFNNVFAgb2JqZWN0cyBpbiB0aGUgdGVzdHMgYmVsb3cgYXJlIGNyZWF0ZWQgd2l0aCBhIG5vbi1kZWZhdWx0CisjIGxvY2FsX2hvc3RuYW1lIGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3Rvciwgc2luY2UgKG9uIHNvbWUgc3lzdGVtcykgdGhlIEZRRE4KKyMgbG9va3VwIGNhdXNlZCBieSB0aGUgZGVmYXVsdCBsb2NhbF9ob3N0bmFtZSBzb21ldGltZXMgdGFrZXMgc28gbG9uZyB0aGF0IHRoZQorIyB0ZXN0IHNlcnZlciB0aW1lcyBvdXQsIGNhdXNpbmcgdGhlIHRlc3QgdG8gZmFpbC4KKworIyBUZXN0IGJlaGF2aW9yIG9mIHNtdHBkLkRlYnVnZ2luZ1NlcnZlcgorQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIERlYnVnZ2luZ1NlcnZlclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyB0ZW1wb3JhcmlseSByZXBsYWNlIHN5cy5zdGRvdXQgdG8gY2FwdHVyZSBEZWJ1Z2dpbmdTZXJ2ZXIgb3V0cHV0CisgICAgICAgIHNlbGYub2xkX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5vdXRwdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLm91dHB1dAorCisgICAgICAgIHNlbGYuX3RocmVhZHMgPSB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKyAgICAgICAgc2VsZi5zZXJ2X2V2dCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuY2xpZW50X2V2dCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgICMgUGljayBhIHJhbmRvbSB1bnVzZWQgcG9ydCBieSBwYXNzaW5nIDAgZm9yIHRoZSBwb3J0IG51bWJlcgorICAgICAgICBzZWxmLnNlcnYgPSBzbXRwZC5EZWJ1Z2dpbmdTZXJ2ZXIoKEhPU1QsIDApLCAoJ25vd2hlcmUnLCAtMSkpCisgICAgICAgICMgS2VlcCBhIG5vdGUgb2Ygd2hhdCBwb3J0IHdhcyBhc3NpZ25lZAorICAgICAgICBzZWxmLnBvcnQgPSBzZWxmLnNlcnYuc29ja2V0LmdldHNvY2tuYW1lKClbMV0KKyAgICAgICAgc2Vydl9hcmdzID0gKHNlbGYuc2Vydiwgc2VsZi5zZXJ2X2V2dCwgc2VsZi5jbGllbnRfZXZ0KQorICAgICAgICBzZWxmLnRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWRlYnVnZ2luZ19zZXJ2ZXIsIGFyZ3M9c2Vydl9hcmdzKQorICAgICAgICBzZWxmLnRocmVhZC5zdGFydCgpCisKKyAgICAgICAgIyB3YWl0IHVudGlsIHNlcnZlciB0aHJlYWQgaGFzIGFzc2lnbmVkIGEgcG9ydCBudW1iZXIKKyAgICAgICAgc2VsZi5zZXJ2X2V2dC53YWl0KCkKKyAgICAgICAgc2VsZi5zZXJ2X2V2dC5jbGVhcigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICMgaW5kaWNhdGUgdGhhdCB0aGUgY2xpZW50IGlzIGZpbmlzaGVkCisgICAgICAgIHNlbGYuY2xpZW50X2V2dC5zZXQoKQorICAgICAgICAjIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdGhyZWFkIHRvIHRlcm1pbmF0ZQorICAgICAgICBzZWxmLnNlcnZfZXZ0LndhaXQoKQorICAgICAgICBzZWxmLnRocmVhZC5qb2luKCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnRocmVhZGluZ19jbGVhbnVwKCpzZWxmLl90aHJlYWRzKQorICAgICAgICAjIHJlc3RvcmUgc3lzLnN0ZG91dAorICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5vbGRfc3Rkb3V0CisKKyAgICBkZWYgdGVzdEJhc2ljKHNlbGYpOgorICAgICAgICAjIGNvbm5lY3QKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQsIGxvY2FsX2hvc3RuYW1lPSdsb2NhbGhvc3QnLCB0aW1lb3V0PTMpCisgICAgICAgIHNtdHAucXVpdCgpCisKKyAgICBkZWYgdGVzdE5PT1Aoc2VsZik6CisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0LCBsb2NhbF9ob3N0bmFtZT0nbG9jYWxob3N0JywgdGltZW91dD0zKQorICAgICAgICBleHBlY3RlZCA9ICgyNTAsICdPaycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc210cC5ub29wKCksIGV4cGVjdGVkKQorICAgICAgICBzbXRwLnF1aXQoKQorCisgICAgZGVmIHRlc3RSU0VUKHNlbGYpOgorICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgbG9jYWxfaG9zdG5hbWU9J2xvY2FsaG9zdCcsIHRpbWVvdXQ9MykKKyAgICAgICAgZXhwZWN0ZWQgPSAoMjUwLCAnT2snKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAucnNldCgpLCBleHBlY3RlZCkKKyAgICAgICAgc210cC5xdWl0KCkKKworICAgIGRlZiB0ZXN0Tm90SW1wbGVtZW50ZWQoc2VsZik6CisgICAgICAgICMgRUhMTyBpc24ndCBpbXBsZW1lbnRlZCBpbiBEZWJ1Z2dpbmdTZXJ2ZXIKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQsIGxvY2FsX2hvc3RuYW1lPSdsb2NhbGhvc3QnLCB0aW1lb3V0PTMpCisgICAgICAgIGV4cGVjdGVkID0gKDUwMiwgJ0Vycm9yOiBjb21tYW5kICJFSExPIiBub3QgaW1wbGVtZW50ZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAuZWhsbygpLCBleHBlY3RlZCkKKyAgICAgICAgc210cC5xdWl0KCkKKworICAgIGRlZiB0ZXN0VlJGWShzZWxmKToKKyAgICAgICAgIyBWUkZZIGlzbid0IGltcGxlbWVudGVkIGluIERlYnVnZ2luZ1NlcnZlcgorICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgbG9jYWxfaG9zdG5hbWU9J2xvY2FsaG9zdCcsIHRpbWVvdXQ9MykKKyAgICAgICAgZXhwZWN0ZWQgPSAoNTAyLCAnRXJyb3I6IGNvbW1hbmQgIlZSRlkiIG5vdCBpbXBsZW1lbnRlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc210cC52cmZ5KCdub2JvZHlAbm93aGVyZS5jb20nKSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc210cC52ZXJpZnkoJ25vYm9keUBub3doZXJlLmNvbScpLCBleHBlY3RlZCkKKyAgICAgICAgc210cC5xdWl0KCkKKworICAgIGRlZiB0ZXN0U2Vjb25kSEVMTyhzZWxmKToKKyAgICAgICAgIyBjaGVjayB0aGF0IGEgc2Vjb25kIEhFTE8gcmV0dXJucyBhIG1lc3NhZ2UgdGhhdCBpdCdzIGEgZHVwbGljYXRlCisgICAgICAgICMgKHRoaXMgYmVoYXZpb3IgaXMgc3BlY2lmaWMgdG8gc210cGQuU01UUENoYW5uZWwpCisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0LCBsb2NhbF9ob3N0bmFtZT0nbG9jYWxob3N0JywgdGltZW91dD0zKQorICAgICAgICBzbXRwLmhlbG8oKQorICAgICAgICBleHBlY3RlZCA9ICg1MDMsICdEdXBsaWNhdGUgSEVMTy9FSExPJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbXRwLmhlbG8oKSwgZXhwZWN0ZWQpCisgICAgICAgIHNtdHAucXVpdCgpCisKKyAgICBkZWYgdGVzdEhFTFAoc2VsZik6CisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0LCBsb2NhbF9ob3N0bmFtZT0nbG9jYWxob3N0JywgdGltZW91dD0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAuaGVscCgpLCAnRXJyb3I6IGNvbW1hbmQgIkhFTFAiIG5vdCBpbXBsZW1lbnRlZCcpCisgICAgICAgIHNtdHAucXVpdCgpCisKKyAgICBkZWYgdGVzdFNlbmQoc2VsZik6CisgICAgICAgICMgY29ubmVjdCBhbmQgc2VuZCBtYWlsCisgICAgICAgIG0gPSAnQSB0ZXN0IG1lc3NhZ2UnCisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0LCBsb2NhbF9ob3N0bmFtZT0nbG9jYWxob3N0JywgdGltZW91dD0zKQorICAgICAgICBzbXRwLnNlbmRtYWlsKCdKb2huJywgJ1NhbGx5JywgbSkKKyAgICAgICAgIyBYWFgobm5vcndpdHopOiB0aGlzIHRlc3QgaXMgZmxha3kgYW5kIGRpZXMgd2l0aCBhIGJhZCBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgIyBpbiBhc3luY29yZS4gIFRoaXMgc2xlZXAgbWlnaHQgaGVscCwgYnV0IHNob3VsZCByZWFsbHkgYmUgZml4ZWQKKyAgICAgICAgIyBwcm9wZXJseSBieSB1c2luZyBhbiBFdmVudCB2YXJpYWJsZS4KKyAgICAgICAgdGltZS5zbGVlcCgwLjAxKQorICAgICAgICBzbXRwLnF1aXQoKQorCisgICAgICAgIHNlbGYuY2xpZW50X2V2dC5zZXQoKQorICAgICAgICBzZWxmLnNlcnZfZXZ0LndhaXQoKQorICAgICAgICBzZWxmLm91dHB1dC5mbHVzaCgpCisgICAgICAgIG1leHBlY3QgPSAnJXMlc1xuJXMnICUgKE1TR19CRUdJTiwgbSwgTVNHX0VORCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm91dHB1dC5nZXR2YWx1ZSgpLCBtZXhwZWN0KQorCisKK2NsYXNzIE5vbkNvbm5lY3RpbmdUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdE5vdENvbm5lY3RlZChzZWxmKToKKyAgICAgICAgIyBUZXN0IHZhcmlvdXMgb3BlcmF0aW9ucyBvbiBhbiB1bmNvbm5lY3RlZCBTTVRQIG9iamVjdCB0aGF0CisgICAgICAgICMgc2hvdWxkIHJhaXNlIGV4Y2VwdGlvbnMgKGF0IHByZXNlbnQgdGhlIGF0dGVtcHQgaW4gU01UUC5zZW5kCisgICAgICAgICMgdG8gcmVmZXJlbmNlIHRoZSBub25leGlzdGVudCAnc29jaycgYXR0cmlidXRlIG9mIHRoZSBTTVRQIG9iamVjdAorICAgICAgICAjIGNhdXNlcyBhbiBBdHRyaWJ1dGVFcnJvcikKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNtdHBsaWIuU01UUFNlcnZlckRpc2Nvbm5lY3RlZCwgc210cC5laGxvKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzbXRwbGliLlNNVFBTZXJ2ZXJEaXNjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNtdHAuc2VuZCwgJ3Rlc3QgbXNnJykKKworICAgIGRlZiB0ZXN0Tm9ubnVtZXJpY1BvcnQoc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCBub24tbnVtZXJpYyBwb3J0IHJhaXNlcyBzb2NrZXQuZXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzbXRwbGliLlNNVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbGhvc3QiLCAiYm9ndXMiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNtdHBsaWIuU01UUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsaG9zdDpib2d1cyIpCisKKworIyB0ZXN0IHJlc3BvbnNlIG9mIGNsaWVudCB0byBhIG5vbi1zdWNjZXNzZnVsIEhFTE8gbWVzc2FnZQorQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIEJhZEhFTE9TZXJ2ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYub2xkX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5vdXRwdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLm91dHB1dAorCisgICAgICAgIHNlbGYuX3RocmVhZHMgPSB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKyAgICAgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDE1KQorICAgICAgICBzZWxmLnBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc29jaykKKyAgICAgICAgc2VydmFyZ3MgPSAoc2VsZi5ldnQsICIxOTkgbm8gaGVsbG8gZm9yIHlvdSFcbiIsIHNlbGYuc29jaykKKyAgICAgICAgc2VsZi50aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZXJ2ZXIsIGFyZ3M9c2VydmFyZ3MpCisgICAgICAgIHNlbGYudGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5ldnQud2FpdCgpCisgICAgICAgIHNlbGYuZXZ0LmNsZWFyKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5ldnQud2FpdCgpCisgICAgICAgIHNlbGYudGhyZWFkLmpvaW4oKQorICAgICAgICB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX2NsZWFudXAoKnNlbGYuX3RocmVhZHMpCisgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLm9sZF9zdGRvdXQKKworICAgIGRlZiB0ZXN0RmFpbGluZ0hFTE8oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNtdHBsaWIuU01UUENvbm5lY3RFcnJvciwgc210cGxpYi5TTVRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhPU1QsIHNlbGYucG9ydCwgJ2xvY2FsaG9zdCcsIDMpCisKKworc2ltX3VzZXJzID0geydNci5BQHNvbWV3aGVyZS5jb20nOidKb2huIEEnLAorICAgICAgICAgICAgICdNcy5CQHNvbWV3aGVyZS5jb20nOidTYWxseSBCJywKKyAgICAgICAgICAgICAnTXJzLkNAc29tZXdoZXJlZXNsZS5jb20nOidSdXRoIEMnLAorICAgICAgICAgICAgfQorCitzaW1fYXV0aCA9ICgnTXIuQUBzb21ld2hlcmUuY29tJywgJ3NvbWVwYXNzd29yZCcpCitzaW1fY3JhbV9tZDVfY2hhbGxlbmdlID0gKCdQRU5DZVV4RlJFSm9VME5uYm1oTldpdE9Nak5HTm4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICdkQVpXeDNiMjlrTG1sdWJtOXpiMlowTG1OdmJUND0nKQorc2ltX2F1dGhfY3JlZGVudGlhbHMgPSB7CisgICAgJ2xvZ2luJzogJ1RYSXVRVUJ6YjIxbGQyaGxjbVV1WTI5dCcsCisgICAgJ3BsYWluJzogJ0FFMXlMa0ZBYzI5dFpYZG9aWEpsTG1OdmJRQnpiMjFsY0dGemMzZHZjbVE9JywKKyAgICAnY3JhbS1tZDUnOiAoJ1RYSVVRVUJaQjIxTEQySExDTVVVWTI5VElERzRPV1EwTUonCisgICAgICAgICAgICAgICAgICdLV1pHUTRPRE5NTkRBNE5UR1hNRFJMWldNWVpKRE1PREcxJyksCisgICAgfQorc2ltX2F1dGhfbG9naW5fcGFzc3dvcmQgPSAnQzI5VFpYQkhDM04zQjNKSycKKworc2ltX2xpc3RzID0geydsaXN0LTEnOlsnTXIuQUBzb21ld2hlcmUuY29tJywnTXJzLkNAc29tZXdoZXJlZXNsZS5jb20nXSwKKyAgICAgICAgICAgICAnbGlzdC0yJzpbJ01zLkJAc29tZXdoZXJlLmNvbScsXSwKKyAgICAgICAgICAgIH0KKworIyBTaW11bGF0ZWQgU01UUCBjaGFubmVsICYgc2VydmVyCitjbGFzcyBTaW1TTVRQQ2hhbm5lbChzbXRwZC5TTVRQQ2hhbm5lbCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXh0cmFfZmVhdHVyZXMsICphcmdzLCAqKmt3KToKKyAgICAgICAgc2VsZi5fZXh0cmFmZWF0dXJlcyA9ICcnLmpvaW4oCisgICAgICAgICAgICBbICIyNTAtezB9XHJcbiIuZm9ybWF0KHgpIGZvciB4IGluIGV4dHJhX2ZlYXR1cmVzIF0pCisgICAgICAgIHNtdHBkLlNNVFBDaGFubmVsLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KQorCisgICAgZGVmIHNtdHBfRUhMTyhzZWxmLCBhcmcpOgorICAgICAgICByZXNwID0gKCcyNTAtdGVzdGhvc3RcclxuJworICAgICAgICAgICAgICAgICcyNTAtRVhQTlxyXG4nCisgICAgICAgICAgICAgICAgJzI1MC1TSVpFIDIwMDAwMDAwXHJcbicKKyAgICAgICAgICAgICAgICAnMjUwLVNUQVJUVExTXHJcbicKKyAgICAgICAgICAgICAgICAnMjUwLURFTElWRVJCWVxyXG4nKQorICAgICAgICByZXNwID0gcmVzcCArIHNlbGYuX2V4dHJhZmVhdHVyZXMgKyAnMjUwIEhFTFAnCisgICAgICAgIHNlbGYucHVzaChyZXNwKQorCisgICAgZGVmIHNtdHBfVlJGWShzZWxmLCBhcmcpOgorICAgICAgICAjIEZvciBtYXggY29tcGF0aWJpbGl0eSBzbXRwbGliIHNob3VsZCBiZSBzZW5kaW5nIHRoZSByYXcgYWRkcmVzcy4KKyAgICAgICAgaWYgYXJnIGluIHNpbV91c2VyczoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnMjUwICVzICVzJyAlIChzaW1fdXNlcnNbYXJnXSwgc210cGxpYi5xdW90ZWFkZHIoYXJnKSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnB1c2goJzU1MCBObyBzdWNoIHVzZXI6ICVzJyAlIGFyZykKKworICAgIGRlZiBzbXRwX0VYUE4oc2VsZiwgYXJnKToKKyAgICAgICAgbGlzdF9uYW1lID0gYXJnLmxvd2VyKCkKKyAgICAgICAgaWYgbGlzdF9uYW1lIGluIHNpbV9saXN0czoKKyAgICAgICAgICAgIHVzZXJfbGlzdCA9IHNpbV9saXN0c1tsaXN0X25hbWVdCisgICAgICAgICAgICBmb3IgbiwgdXNlcl9lbWFpbCBpbiBlbnVtZXJhdGUodXNlcl9saXN0KToKKyAgICAgICAgICAgICAgICBxdW90ZWRfYWRkciA9IHNtdHBsaWIucXVvdGVhZGRyKHVzZXJfZW1haWwpCisgICAgICAgICAgICAgICAgaWYgbiA8IGxlbih1c2VyX2xpc3QpIC0gMToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wdXNoKCcyNTAtJXMgJXMnICUgKHNpbV91c2Vyc1t1c2VyX2VtYWlsXSwgcXVvdGVkX2FkZHIpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaCgnMjUwICVzICVzJyAlIChzaW1fdXNlcnNbdXNlcl9lbWFpbF0sIHF1b3RlZF9hZGRyKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTUwIE5vIGFjY2VzcyBmb3IgeW91IScpCisKKyAgICBkZWYgc210cF9BVVRIKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIGFyZy5zdHJpcCgpLmxvd2VyKCk9PSdjcmFtLW1kNSc6CisgICAgICAgICAgICBzZWxmLnB1c2goJzMzNCB7MH0nLmZvcm1hdChzaW1fY3JhbV9tZDVfY2hhbGxlbmdlKSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtZWNoLCBhdXRoID0gYXJnLnNwbGl0KCkKKyAgICAgICAgbWVjaCA9IG1lY2gubG93ZXIoKQorICAgICAgICBpZiBtZWNoIG5vdCBpbiBzaW1fYXV0aF9jcmVkZW50aWFsczoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTA0IGF1dGggdHlwZSB1bmltcGxlbWVudGVkJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBtZWNoID09ICdwbGFpbicgYW5kIGF1dGg9PXNpbV9hdXRoX2NyZWRlbnRpYWxzWydwbGFpbiddOgorICAgICAgICAgICAgc2VsZi5wdXNoKCcyMzUgcGxhaW4gYXV0aCBvaycpCisgICAgICAgIGVsaWYgbWVjaD09J2xvZ2luJyBhbmQgYXV0aD09c2ltX2F1dGhfY3JlZGVudGlhbHNbJ2xvZ2luJ106CisgICAgICAgICAgICBzZWxmLnB1c2goJzMzNCBQYXNzd29yZDonKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1NTAgTm8gYWNjZXNzIGZvciB5b3UhJykKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHJhaXNlCisKKworY2xhc3MgU2ltU01UUFNlcnZlcihzbXRwZC5TTVRQU2VydmVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgIHNlbGYuX2V4dHJhX2ZlYXR1cmVzID0gW10KKyAgICAgICAgc210cGQuU01UUFNlcnZlci5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKKworICAgIGRlZiBoYW5kbGVfYWNjZXB0KHNlbGYpOgorICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5hY2NlcHQoKQorICAgICAgICBzZWxmLl9TTVRQY2hhbm5lbCA9IFNpbVNNVFBDaGFubmVsKHNlbGYuX2V4dHJhX2ZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIGNvbm4sIGFkZHIpCisKKyAgICBkZWYgcHJvY2Vzc19tZXNzYWdlKHNlbGYsIHBlZXIsIG1haWxmcm9tLCByY3B0dG9zLCBkYXRhKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGFkZF9mZWF0dXJlKHNlbGYsIGZlYXR1cmUpOgorICAgICAgICBzZWxmLl9leHRyYV9mZWF0dXJlcy5hcHBlbmQoZmVhdHVyZSkKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHJhaXNlCisKKworIyBUZXN0IHZhcmlvdXMgU01UUCAmIEVTTVRQIGNvbW1hbmRzL2JlaGF2aW9ycyB0aGF0IHJlcXVpcmUgYSBzaW11bGF0ZWQgc2VydmVyCisjIChpLmUuLCBzb21ldGhpbmcgd2l0aCBtb3JlIGZlYXR1cmVzIHRoYW4gRGVidWdnaW5nU2VydmVyKQorQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIFNNVFBTaW1UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3RocmVhZHMgPSB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKyAgICAgICAgc2VsZi5zZXJ2X2V2dCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuY2xpZW50X2V2dCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgICMgUGljayBhIHJhbmRvbSB1bnVzZWQgcG9ydCBieSBwYXNzaW5nIDAgZm9yIHRoZSBwb3J0IG51bWJlcgorICAgICAgICBzZWxmLnNlcnYgPSBTaW1TTVRQU2VydmVyKChIT1NULCAwKSwgKCdub3doZXJlJywgLTEpKQorICAgICAgICAjIEtlZXAgYSBub3RlIG9mIHdoYXQgcG9ydCB3YXMgYXNzaWduZWQKKyAgICAgICAgc2VsZi5wb3J0ID0gc2VsZi5zZXJ2LnNvY2tldC5nZXRzb2NrbmFtZSgpWzFdCisgICAgICAgIHNlcnZfYXJncyA9IChzZWxmLnNlcnYsIHNlbGYuc2Vydl9ldnQsIHNlbGYuY2xpZW50X2V2dCkKKyAgICAgICAgc2VsZi50aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1kZWJ1Z2dpbmdfc2VydmVyLCBhcmdzPXNlcnZfYXJncykKKyAgICAgICAgc2VsZi50aHJlYWQuc3RhcnQoKQorCisgICAgICAgICMgd2FpdCB1bnRpbCBzZXJ2ZXIgdGhyZWFkIGhhcyBhc3NpZ25lZCBhIHBvcnQgbnVtYmVyCisgICAgICAgIHNlbGYuc2Vydl9ldnQud2FpdCgpCisgICAgICAgIHNlbGYuc2Vydl9ldnQuY2xlYXIoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjIGluZGljYXRlIHRoYXQgdGhlIGNsaWVudCBpcyBmaW5pc2hlZAorICAgICAgICBzZWxmLmNsaWVudF9ldnQuc2V0KCkKKyAgICAgICAgIyB3YWl0IGZvciB0aGUgc2VydmVyIHRocmVhZCB0byB0ZXJtaW5hdGUKKyAgICAgICAgc2VsZi5zZXJ2X2V2dC53YWl0KCkKKyAgICAgICAgc2VsZi50aHJlYWQuam9pbigpCisgICAgICAgIHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqc2VsZi5fdGhyZWFkcykKKworICAgIGRlZiB0ZXN0QmFzaWMoc2VsZik6CisgICAgICAgICMgc21va2UgdGVzdAorICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgbG9jYWxfaG9zdG5hbWU9J2xvY2FsaG9zdCcsIHRpbWVvdXQ9MTUpCisgICAgICAgIHNtdHAucXVpdCgpCisKKyAgICBkZWYgdGVzdEVITE8oc2VsZik6CisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0LCBsb2NhbF9ob3N0bmFtZT0nbG9jYWxob3N0JywgdGltZW91dD0xNSkKKworICAgICAgICAjIG5vIGZlYXR1cmVzIHNob3VsZCBiZSBwcmVzZW50IGJlZm9yZSB0aGUgRUhMTworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAuZXNtdHBfZmVhdHVyZXMsIHt9KQorCisgICAgICAgICMgZmVhdHVyZXMgZXhwZWN0ZWQgZnJvbSB0aGUgdGVzdCBzZXJ2ZXIKKyAgICAgICAgZXhwZWN0ZWRfZmVhdHVyZXMgPSB7J2V4cG4nOicnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZSc6ICcyMDAwMDAwMCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGFydHRscyc6ICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVsaXZlcmJ5JzogJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWxwJzogJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICBzbXRwLmVobG8oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAuZXNtdHBfZmVhdHVyZXMsIGV4cGVjdGVkX2ZlYXR1cmVzKQorICAgICAgICBmb3IgayBpbiBleHBlY3RlZF9mZWF0dXJlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzbXRwLmhhc19leHRuKGspKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNtdHAuaGFzX2V4dG4oJ3Vuc3VwcG9ydGVkLWZlYXR1cmUnKSkKKyAgICAgICAgc210cC5xdWl0KCkKKworICAgIGRlZiB0ZXN0VlJGWShzZWxmKToKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQsIGxvY2FsX2hvc3RuYW1lPSdsb2NhbGhvc3QnLCB0aW1lb3V0PTE1KQorCisgICAgICAgIGZvciBlbWFpbCwgbmFtZSBpbiBzaW1fdXNlcnMuaXRlbXMoKToKKyAgICAgICAgICAgIGV4cGVjdGVkX2tub3duID0gKDI1MCwgJyVzICVzJyAlIChuYW1lLCBzbXRwbGliLnF1b3RlYWRkcihlbWFpbCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbXRwLnZyZnkoZW1haWwpLCBleHBlY3RlZF9rbm93bikKKworICAgICAgICB1ID0gJ25vYm9keUBub3doZXJlLmNvbScKKyAgICAgICAgZXhwZWN0ZWRfdW5rbm93biA9ICg1NTAsICdObyBzdWNoIHVzZXI6ICVzJyAlIHUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc210cC52cmZ5KHUpLCBleHBlY3RlZF91bmtub3duKQorICAgICAgICBzbXRwLnF1aXQoKQorCisgICAgZGVmIHRlc3RFWFBOKHNlbGYpOgorICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgbG9jYWxfaG9zdG5hbWU9J2xvY2FsaG9zdCcsIHRpbWVvdXQ9MTUpCisKKyAgICAgICAgZm9yIGxpc3RuYW1lLCBtZW1iZXJzIGluIHNpbV9saXN0cy5pdGVtcygpOgorICAgICAgICAgICAgdXNlcnMgPSBbXQorICAgICAgICAgICAgZm9yIG0gaW4gbWVtYmVyczoKKyAgICAgICAgICAgICAgICB1c2Vycy5hcHBlbmQoJyVzICVzJyAlIChzaW1fdXNlcnNbbV0sIHNtdHBsaWIucXVvdGVhZGRyKG0pKSkKKyAgICAgICAgICAgIGV4cGVjdGVkX2tub3duID0gKDI1MCwgJ1xuJy5qb2luKHVzZXJzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc210cC5leHBuKGxpc3RuYW1lKSwgZXhwZWN0ZWRfa25vd24pCisKKyAgICAgICAgdSA9ICdQU1UtTWVtYmVycy1MaXN0JworICAgICAgICBleHBlY3RlZF91bmtub3duID0gKDU1MCwgJ05vIGFjY2VzcyBmb3IgeW91IScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc210cC5leHBuKHUpLCBleHBlY3RlZF91bmtub3duKQorICAgICAgICBzbXRwLnF1aXQoKQorCisgICAgZGVmIHRlc3RBVVRIX1BMQUlOKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnYuYWRkX2ZlYXR1cmUoIkFVVEggUExBSU4iKQorICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgbG9jYWxfaG9zdG5hbWU9J2xvY2FsaG9zdCcsIHRpbWVvdXQ9MTUpCisKKyAgICAgICAgZXhwZWN0ZWRfYXV0aF9vayA9ICgyMzUsIGIncGxhaW4gYXV0aCBvaycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc210cC5sb2dpbihzaW1fYXV0aFswXSwgc2ltX2F1dGhbMV0pLCBleHBlY3RlZF9hdXRoX29rKQorCisgICAgIyBTaW1TTVRQQ2hhbm5lbCBkb2Vzbid0IGZ1bGx5IHN1cHBvcnQgTE9HSU4gb3IgQ1JBTS1NRDUgYXV0aCBiZWNhdXNlIHRoZXkKKyAgICAjIHJlcXVpcmUgYSBzeW5jaHJvbm91cyByZWFkIHRvIG9idGFpbiB0aGUgY3JlZGVudGlhbHMuLi5zbyBpbnN0ZWFkIHNtdHBkCisgICAgIyBzZWVzIHRoZSBjcmVkZW50aWFsIHNlbnQgYnkgc210cGxpYidzIGxvZ2luIG1ldGhvZCBhcyBhbiB1bmtub3duIGNvbW1hbmQsCisgICAgIyB3aGljaCByZXN1bHRzIGluIHNtdHBsaWIgcmFpc2luZyBhbiBhdXRoIGVycm9yLiAgRm9ydHVuYXRlbHkgdGhlIGVycm9yCisgICAgIyBtZXNzYWdlIGNvbnRhaW5zIHRoZSBlbmNvZGVkIGNyZWRlbnRpYWwsIHNvIHdlIGNhbiBwYXJ0aWFsbHkgY2hlY2sgdGhhdCBpdAorICAgICMgd2FzIGdlbmVyYXRlZCBjb3JyZWN0bHkgKHBhcnRpYWxseSwgYmVjYXVzZSB0aGUgJ3dvcmQnIGlzIHVwcGVyY2FzZWQgaW4KKyAgICAjIHRoZSBlcnJvciBtZXNzYWdlKS4KKworICAgIGRlZiB0ZXN0QVVUSF9MT0dJTihzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2LmFkZF9mZWF0dXJlKCJBVVRIIExPR0lOIikKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQsIGxvY2FsX2hvc3RuYW1lPSdsb2NhbGhvc3QnLCB0aW1lb3V0PTE1KQorICAgICAgICB0cnk6IHNtdHAubG9naW4oc2ltX2F1dGhbMF0sIHNpbV9hdXRoWzFdKQorICAgICAgICBleGNlcHQgc210cGxpYi5TTVRQQXV0aGVudGljYXRpb25FcnJvciBhcyBlcnI6CisgICAgICAgICAgICBpZiBzaW1fYXV0aF9sb2dpbl9wYXNzd29yZCBub3QgaW4gc3RyKGVycik6CisgICAgICAgICAgICAgICAgcmFpc2UgImV4cGVjdGVkIGVuY29kZWQgcGFzc3dvcmQgbm90IGZvdW5kIGluIGVycm9yIG1lc3NhZ2UiCisKKyAgICBkZWYgdGVzdEFVVEhfQ1JBTV9NRDUoc2VsZik6CisgICAgICAgIHNlbGYuc2Vydi5hZGRfZmVhdHVyZSgiQVVUSCBDUkFNLU1ENSIpCisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0LCBsb2NhbF9ob3N0bmFtZT0nbG9jYWxob3N0JywgdGltZW91dD0xNSkKKworICAgICAgICB0cnk6IHNtdHAubG9naW4oc2ltX2F1dGhbMF0sIHNpbV9hdXRoWzFdKQorICAgICAgICBleGNlcHQgc210cGxpYi5TTVRQQXV0aGVudGljYXRpb25FcnJvciBhcyBlcnI6CisgICAgICAgICAgICBpZiBzaW1fYXV0aF9jcmVkZW50aWFsc1snY3JhbS1tZDUnXSBub3QgaW4gc3RyKGVycik6CisgICAgICAgICAgICAgICAgcmFpc2UgImV4cGVjdGVkIGVuY29kZWQgY3JlZGVudGlhbHMgbm90IGZvdW5kIGluIGVycm9yIG1lc3NhZ2UiCisKKyAgICAjVE9ETzogYWRkIHRlc3RzIGZvciBjb3JyZWN0IEFVVEggbWV0aG9kIGZhbGxiYWNrIG5vdyB0aGF0IHRoZQorICAgICN0ZXN0IGluZnJhc3RydWN0dXJlIGNhbiBzdXBwb3J0IGl0LgorCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEdlbmVyYWxUZXN0cywgRGVidWdnaW5nU2VydmVyVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25Db25uZWN0aW5nVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWRIRUxPU2VydmVyVGVzdHMsIFNNVFBTaW1UZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGIwZTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGIwZTRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cG5ldC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NtdHBuZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjMzllYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NtdHBuZXQucHkKQEAgLTAsMCArMSwzMSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBzbXRwbGliCisKK3Rlc3Rfc3VwcG9ydC5yZXF1aXJlcygibmV0d29yayIpCisKK2NsYXNzIFNtdHBTU0xUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICB0ZXN0U2VydmVyID0gJ3NtdHAuZ21haWwuY29tJworICAgIHJlbW90ZVBvcnQgPSA0NjUKKworICAgIGRlZiB0ZXN0X2Nvbm5lY3Qoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5nZXRfYXR0cmlidXRlKHNtdHBsaWIsICdTTVRQX1NTTCcpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChzZWxmLnRlc3RTZXJ2ZXIpOgorICAgICAgICAgICAgc2VydmVyID0gc210cGxpYi5TTVRQX1NTTChzZWxmLnRlc3RTZXJ2ZXIsIHNlbGYucmVtb3RlUG9ydCkKKyAgICAgICAgc2VydmVyLmVobG8oKQorICAgICAgICBzZXJ2ZXIucXVpdCgpCisKKyAgICBkZWYgdGVzdF9jb25uZWN0X2RlZmF1bHRfcG9ydChzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LmdldF9hdHRyaWJ1dGUoc210cGxpYiwgJ1NNVFBfU1NMJykKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHNlbGYudGVzdFNlcnZlcik6CisgICAgICAgICAgICBzZXJ2ZXIgPSBzbXRwbGliLlNNVFBfU1NMKHNlbGYudGVzdFNlcnZlcikKKyAgICAgICAgc2VydmVyLmVobG8oKQorICAgICAgICBzZXJ2ZXIucXVpdCgpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFNtdHBTU0xUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbmV0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NtdHBuZXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZmIzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbmV0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbmV0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NtdHBuZXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZmIzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbmV0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTExZTU1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvY2tldC5weQpAQCAtMCwwICsxLDE3MjQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2ltcG9ydCBlcnJubworaW1wb3J0IHNvY2tldAoraW1wb3J0IHNlbGVjdAoraW1wb3J0IF90ZXN0Y2FwaQoraW1wb3J0IHRpbWUKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCBRdWV1ZQoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgYXJyYXkKK2ltcG9ydCBjb250ZXh0bGliCitmcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5CitpbXBvcnQgc2lnbmFsCitpbXBvcnQgbWF0aAorCitkZWYgdHJ5X2FkZHJlc3MoaG9zdCwgcG9ydD0wLCBmYW1pbHk9c29ja2V0LkFGX0lORVQpOgorICAgICIiIlRyeSB0byBiaW5kIGEgc29ja2V0IG9uIHRoZSBnaXZlbiBob3N0OnBvcnQgYW5kIHJldHVybiBUcnVlCisgICAgaWYgdGhhdCBoYXMgYmVlbiBwb3NzaWJsZS4iIiIKKyAgICB0cnk6CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KGZhbWlseSwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzb2NrLmJpbmQoKGhvc3QsIHBvcnQpKQorICAgIGV4Y2VwdCAoc29ja2V0LmVycm9yLCBzb2NrZXQuZ2FpZXJyb3IpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBlbHNlOgorICAgICAgICBzb2NrLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIFRydWUKKworSE9TVCA9IHRlc3Rfc3VwcG9ydC5IT1NUCitNU0cgPSBiJ01pY2hhZWwgR2lsZml4IHdhcyBoZXJlXG4nCitTVVBQT1JUU19JUFY2ID0gc29ja2V0Lmhhc19pcHY2IGFuZCB0cnlfYWRkcmVzcygnOjoxJywgZmFtaWx5PXNvY2tldC5BRl9JTkVUNikKKwordHJ5OgorICAgIGltcG9ydCB0aHJlYWQKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkID0gTm9uZQorICAgIHRocmVhZGluZyA9IE5vbmUKKworSE9TVCA9IHRlc3Rfc3VwcG9ydC5IT1NUCitNU0cgPSAnTWljaGFlbCBHaWxmaXggd2FzIGhlcmVcbicKKworY2xhc3MgU29ja2V0VENQVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2VydiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5wb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZWxmLnNlcnYpCisgICAgICAgIHNlbGYuc2Vydi5saXN0ZW4oMSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2LmNsb3NlKCkKKyAgICAgICAgc2VsZi5zZXJ2ID0gTm9uZQorCitjbGFzcyBTb2NrZXRVRFBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCisgICAgICAgIHNlbGYucG9ydCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zZXJ2KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnYuY2xvc2UoKQorICAgICAgICBzZWxmLnNlcnYgPSBOb25lCisKK2NsYXNzIFRocmVhZGFibGVUZXN0OgorICAgICIiIlRocmVhZGFibGUgVGVzdCBjbGFzcworCisgICAgVGhlIFRocmVhZGFibGVUZXN0IGNsYXNzIG1ha2VzIGl0IGVhc3kgdG8gY3JlYXRlIGEgdGhyZWFkZWQKKyAgICBjbGllbnQvc2VydmVyIHBhaXIgZnJvbSBhbiBleGlzdGluZyB1bml0IHRlc3QuIFRvIGNyZWF0ZSBhCisgICAgbmV3IHRocmVhZGVkIGNsYXNzIGZyb20gYW4gZXhpc3RpbmcgdW5pdCB0ZXN0LCB1c2UgbXVsdGlwbGUKKyAgICBpbmhlcml0YW5jZToKKworICAgICAgICBjbGFzcyBOZXdDbGFzcyAoT2xkQ2xhc3MsIFRocmVhZGFibGVUZXN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgIFRoaXMgY2xhc3MgZGVmaW5lcyB0d28gbmV3IGZpeHR1cmUgZnVuY3Rpb25zIHdpdGggb2J2aW91cworICAgIHB1cnBvc2VzIGZvciBvdmVycmlkaW5nOgorCisgICAgICAgIGNsaWVudFNldFVwICgpCisgICAgICAgIGNsaWVudFRlYXJEb3duICgpCisKKyAgICBBbnkgbmV3IHRlc3QgZnVuY3Rpb25zIHdpdGhpbiB0aGUgY2xhc3MgbXVzdCB0aGVuIGRlZmluZQorICAgIHRlc3RzIGluIHBhaXJzLCB3aGVyZSB0aGUgdGVzdCBuYW1lIGlzIHByZWNlZWRlZCB3aXRoIGEKKyAgICAnXycgdG8gaW5kaWNhdGUgdGhlIGNsaWVudCBwb3J0aW9uIG9mIHRoZSB0ZXN0LiBFeDoKKworICAgICAgICBkZWYgdGVzdEZvbyhzZWxmKToKKyAgICAgICAgICAgICMgU2VydmVyIHBvcnRpb24KKworICAgICAgICBkZWYgX3Rlc3RGb28oc2VsZik6CisgICAgICAgICAgICAjIENsaWVudCBwb3J0aW9uCisKKyAgICBBbnkgZXhjZXB0aW9ucyByYWlzZWQgYnkgdGhlIGNsaWVudHMgZHVyaW5nIHRoZWlyIHRlc3RzCisgICAgYXJlIGNhdWdodCBhbmQgdHJhbnNmZXJyZWQgdG8gdGhlIG1haW4gdGhyZWFkIHRvIGFsZXJ0CisgICAgdGhlIHRlc3RpbmcgZnJhbWV3b3JrLgorCisgICAgTm90ZSwgdGhlIHNlcnZlciBzZXR1cCBmdW5jdGlvbiBjYW5ub3QgY2FsbCBhbnkgYmxvY2tpbmcKKyAgICBmdW5jdGlvbnMgdGhhdCByZWx5IG9uIHRoZSBjbGllbnQgdGhyZWFkIGR1cmluZyBzZXR1cCwKKyAgICB1bmxlc3Mgc2VydmVyRXhwbGljaXRSZWFkeSgpIGlzIGNhbGxlZCBqdXN0IGJlZm9yZQorICAgIHRoZSBibG9ja2luZyBjYWxsIChzdWNoIGFzIGluIHNldHRpbmcgdXAgYSBjbGllbnQvc2VydmVyCisgICAgY29ubmVjdGlvbiBhbmQgcGVyZm9ybWluZyB0aGUgYWNjZXB0KCkgaW4gc2V0VXAoKS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIyBTd2FwIHRoZSB0cnVlIHNldHVwIGZ1bmN0aW9uCisgICAgICAgIHNlbGYuX19zZXRVcCA9IHNlbGYuc2V0VXAKKyAgICAgICAgc2VsZi5fX3RlYXJEb3duID0gc2VsZi50ZWFyRG93bgorICAgICAgICBzZWxmLnNldFVwID0gc2VsZi5fc2V0VXAKKyAgICAgICAgc2VsZi50ZWFyRG93biA9IHNlbGYuX3RlYXJEb3duCisKKyAgICBkZWYgc2VydmVyRXhwbGljaXRSZWFkeShzZWxmKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gZXhwbGljaXRseSBpbmRpY2F0ZSB0aGF0CisgICAgICAgIGl0IHdhbnRzIHRoZSBjbGllbnQgdGhyZWFkIHRvIHByb2NlZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHRoZQorICAgICAgICBzZXJ2ZXIgaXMgYWJvdXQgdG8gZXhlY3V0ZSBhIGJsb2NraW5nIHJvdXRpbmUgdGhhdCBpcworICAgICAgICBkZXBlbmRlbnQgdXBvbiB0aGUgY2xpZW50IHRocmVhZCBkdXJpbmcgaXRzIHNldHVwIHJvdXRpbmUuIiIiCisgICAgICAgIHNlbGYuc2VydmVyX3JlYWR5LnNldCgpCisKKyAgICBkZWYgX3NldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlcl9yZWFkeSA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuY2xpZW50X3JlYWR5ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5kb25lID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5xdWV1ZSA9IFF1ZXVlLlF1ZXVlKDEpCisKKyAgICAgICAgIyBEbyBzb21lIG11bmdpbmcgdG8gc3RhcnQgdGhlIGNsaWVudCB0ZXN0LgorICAgICAgICBtZXRob2RuYW1lID0gc2VsZi5pZCgpCisgICAgICAgIGkgPSBtZXRob2RuYW1lLnJmaW5kKCcuJykKKyAgICAgICAgbWV0aG9kbmFtZSA9IG1ldGhvZG5hbWVbaSsxOl0KKyAgICAgICAgdGVzdF9tZXRob2QgPSBnZXRhdHRyKHNlbGYsICdfJyArIG1ldGhvZG5hbWUpCisgICAgICAgIHNlbGYuY2xpZW50X3RocmVhZCA9IHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKAorICAgICAgICAgICAgc2VsZi5jbGllbnRSdW4sICh0ZXN0X21ldGhvZCwpKQorCisgICAgICAgIHNlbGYuX19zZXRVcCgpCisgICAgICAgIGlmIG5vdCBzZWxmLnNlcnZlcl9yZWFkeS5pc19zZXQoKToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyX3JlYWR5LnNldCgpCisgICAgICAgIHNlbGYuY2xpZW50X3JlYWR5LndhaXQoKQorCisgICAgZGVmIF90ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5fX3RlYXJEb3duKCkKKyAgICAgICAgc2VsZi5kb25lLndhaXQoKQorCisgICAgICAgIGlmIG5vdCBzZWxmLnF1ZXVlLmVtcHR5KCk6CisgICAgICAgICAgICBtc2cgPSBzZWxmLnF1ZXVlLmdldCgpCisgICAgICAgICAgICBzZWxmLmZhaWwobXNnKQorCisgICAgZGVmIGNsaWVudFJ1bihzZWxmLCB0ZXN0X2Z1bmMpOgorICAgICAgICBzZWxmLnNlcnZlcl9yZWFkeS53YWl0KCkKKyAgICAgICAgc2VsZi5jbGllbnRTZXRVcCgpCisgICAgICAgIHNlbGYuY2xpZW50X3JlYWR5LnNldCgpCisgICAgICAgIGlmIG5vdCBjYWxsYWJsZSh0ZXN0X2Z1bmMpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ0ZXN0X2Z1bmMgbXVzdCBiZSBhIGNhbGxhYmxlIGZ1bmN0aW9uLiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3RfZnVuYygpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIHN0cmVycm9yOgorICAgICAgICAgICAgc2VsZi5xdWV1ZS5wdXQoc3RyZXJyb3IpCisgICAgICAgIHNlbGYuY2xpZW50VGVhckRvd24oKQorCisgICAgZGVmIGNsaWVudFNldFVwKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJjbGllbnRTZXRVcCBtdXN0IGJlIGltcGxlbWVudGVkLiIpCisKKyAgICBkZWYgY2xpZW50VGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZG9uZS5zZXQoKQorICAgICAgICB0aHJlYWQuZXhpdCgpCisKK2NsYXNzIFRocmVhZGVkVENQU29ja2V0VGVzdChTb2NrZXRUQ1BUZXN0LCBUaHJlYWRhYmxlVGVzdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT0ncnVuVGVzdCcpOgorICAgICAgICBTb2NrZXRUQ1BUZXN0Ll9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9bWV0aG9kTmFtZSkKKyAgICAgICAgVGhyZWFkYWJsZVRlc3QuX19pbml0X18oc2VsZikKKworICAgIGRlZiBjbGllbnRTZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jbGkgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisKKyAgICBkZWYgY2xpZW50VGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY2xpLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jbGkgPSBOb25lCisgICAgICAgIFRocmVhZGFibGVUZXN0LmNsaWVudFRlYXJEb3duKHNlbGYpCisKK2NsYXNzIFRocmVhZGVkVURQU29ja2V0VGVzdChTb2NrZXRVRFBUZXN0LCBUaHJlYWRhYmxlVGVzdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT0ncnVuVGVzdCcpOgorICAgICAgICBTb2NrZXRVRFBUZXN0Ll9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9bWV0aG9kTmFtZSkKKyAgICAgICAgVGhyZWFkYWJsZVRlc3QuX19pbml0X18oc2VsZikKKworICAgIGRlZiBjbGllbnRTZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jbGkgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKKworICAgIGRlZiBjbGllbnRUZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jbGkuY2xvc2UoKQorICAgICAgICBzZWxmLmNsaSA9IE5vbmUKKyAgICAgICAgVGhyZWFkYWJsZVRlc3QuY2xpZW50VGVhckRvd24oc2VsZikKKworY2xhc3MgU29ja2V0Q29ubmVjdGVkVGVzdChUaHJlYWRlZFRDUFNvY2tldFRlc3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9J3J1blRlc3QnKToKKyAgICAgICAgVGhyZWFkZWRUQ1BTb2NrZXRUZXN0Ll9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9bWV0aG9kTmFtZSkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgVGhyZWFkZWRUQ1BTb2NrZXRUZXN0LnNldFVwKHNlbGYpCisgICAgICAgICMgSW5kaWNhdGUgZXhwbGljaXRseSB3ZSdyZSByZWFkeSBmb3IgdGhlIGNsaWVudCB0aHJlYWQgdG8KKyAgICAgICAgIyBwcm9jZWVkIGFuZCB0aGVuIHBlcmZvcm0gdGhlIGJsb2NraW5nIGNhbGwgdG8gYWNjZXB0CisgICAgICAgIHNlbGYuc2VydmVyRXhwbGljaXRSZWFkeSgpCisgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLnNlcnYuYWNjZXB0KCkKKyAgICAgICAgc2VsZi5jbGlfY29ubiA9IGNvbm4KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jbGlfY29ubi5jbG9zZSgpCisgICAgICAgIHNlbGYuY2xpX2Nvbm4gPSBOb25lCisgICAgICAgIFRocmVhZGVkVENQU29ja2V0VGVzdC50ZWFyRG93bihzZWxmKQorCisgICAgZGVmIGNsaWVudFNldFVwKHNlbGYpOgorICAgICAgICBUaHJlYWRlZFRDUFNvY2tldFRlc3QuY2xpZW50U2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5jbGkuY29ubmVjdCgoSE9TVCwgc2VsZi5wb3J0KSkKKyAgICAgICAgc2VsZi5zZXJ2X2Nvbm4gPSBzZWxmLmNsaQorCisgICAgZGVmIGNsaWVudFRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZfY29ubi5jbG9zZSgpCisgICAgICAgIHNlbGYuc2Vydl9jb25uID0gTm9uZQorICAgICAgICBUaHJlYWRlZFRDUFNvY2tldFRlc3QuY2xpZW50VGVhckRvd24oc2VsZikKKworY2xhc3MgU29ja2V0UGFpclRlc3QodW5pdHRlc3QuVGVzdENhc2UsIFRocmVhZGFibGVUZXN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPSdydW5UZXN0Jyk6CisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9bWV0aG9kTmFtZSkKKyAgICAgICAgVGhyZWFkYWJsZVRlc3QuX19pbml0X18oc2VsZikKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2LCBzZWxmLmNsaSA9IHNvY2tldC5zb2NrZXRwYWlyKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2LmNsb3NlKCkKKyAgICAgICAgc2VsZi5zZXJ2ID0gTm9uZQorCisgICAgZGVmIGNsaWVudFNldFVwKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgY2xpZW50VGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY2xpLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jbGkgPSBOb25lCisgICAgICAgIFRocmVhZGFibGVUZXN0LmNsaWVudFRlYXJEb3duKHNlbGYpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIEJlZ2luIFRlc3RzCisKK2NsYXNzIEdlbmVyYWxNb2R1bGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF93ZWFrcmVmKHNlbGYpOgorICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBwID0gcHJveHkocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmZpbGVubygpLCBzLmZpbGVubygpKQorICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgcyA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcC5maWxlbm8oKQorICAgICAgICBleGNlcHQgUmVmZXJlbmNlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ1NvY2tldCBwcm94eSBzdGlsbCBleGlzdHMnKQorCisgICAgZGVmIHRlc3RTb2NrZXRFcnJvcihzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHNvY2tldCBtb2R1bGUgZXhjZXB0aW9ucworICAgICAgICBkZWYgcmFpc2VfZXJyb3IoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvcgorICAgICAgICBkZWYgcmFpc2VfaGVycm9yKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICByYWlzZSBzb2NrZXQuaGVycm9yCisgICAgICAgIGRlZiByYWlzZV9nYWllcnJvcigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmdhaWVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgcmFpc2VfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcmFpc2luZyBzb2NrZXQgZXhjZXB0aW9uLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgcmFpc2VfaGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJhaXNpbmcgc29ja2V0IGV4Y2VwdGlvbi4iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHJhaXNlX2dhaWVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJhaXNpbmcgc29ja2V0IGV4Y2VwdGlvbi4iKQorCisgICAgZGVmIHRlc3RTZW5kdG9FcnJvcnMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyB0aGF0IHNlbmR0byBkb2Vucyd0IG1hc2tzIGZhaWx1cmVzLiBTZWUgIzEwMTY5LgorICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICBzLmJpbmQoKCcnLCAwKSkKKyAgICAgICAgc29ja25hbWUgPSBzLmdldHNvY2tuYW1lKCkKKyAgICAgICAgIyAyIGFyZ3MKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IpOgorICAgICAgICAgICAgcy5zZW5kdG8odSdcdTI2MjAnLCBzb2NrbmFtZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgcy5zZW5kdG8oNWosIHNvY2tuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEluKCdub3QgY29tcGxleCcsIHN0cihjbS5leGNlcHRpb24pKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcikgYXMgY206CisgICAgICAgICAgICBzLnNlbmR0bygnZm9vJywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignbm90IE5vbmVUeXBlJywgc3RyKGNtLmV4Y2VwdGlvbikpCisgICAgICAgICMgMyBhcmdzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgIHMuc2VuZHRvKHUnXHUyNjIwJywgMCwgc29ja25hbWUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIHMuc2VuZHRvKDVqLCAwLCBzb2NrbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignbm90IGNvbXBsZXgnLCBzdHIoY20uZXhjZXB0aW9uKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgcy5zZW5kdG8oJ2ZvbycsIDAsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ25vdCBOb25lVHlwZScsIHN0cihjbS5leGNlcHRpb24pKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcikgYXMgY206CisgICAgICAgICAgICBzLnNlbmR0bygnZm9vJywgJ2JhcicsIHNvY2tuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEluKCdhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkJywgc3RyKGNtLmV4Y2VwdGlvbikpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIHMuc2VuZHRvKCdmb28nLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEluKCdhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkJywgc3RyKGNtLmV4Y2VwdGlvbikpCisgICAgICAgICMgd3JvbmcgbnVtYmVyIG9mIGFyZ3MKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgcy5zZW5kdG8oJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJygxIGdpdmVuKScsIHN0cihjbS5leGNlcHRpb24pKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcikgYXMgY206CisgICAgICAgICAgICBzLnNlbmR0bygnZm9vJywgMCwgc29ja25hbWUsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJyg0IGdpdmVuKScsIHN0cihjbS5leGNlcHRpb24pKQorCisKKyAgICBkZWYgdGVzdENydWNpYWxDb25zdGFudHMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBmb3IgbWlzc2lvbiBjcml0aWNhbCBjb25zdGFudHMKKyAgICAgICAgc29ja2V0LkFGX0lORVQKKyAgICAgICAgc29ja2V0LlNPQ0tfU1RSRUFNCisgICAgICAgIHNvY2tldC5TT0NLX0RHUkFNCisgICAgICAgIHNvY2tldC5TT0NLX1JBVworICAgICAgICBzb2NrZXQuU09DS19SRE0KKyAgICAgICAgc29ja2V0LlNPQ0tfU0VRUEFDS0VUCisgICAgICAgIHNvY2tldC5TT0xfU09DS0VUCisgICAgICAgIHNvY2tldC5TT19SRVVTRUFERFIKKworICAgIGRlZiB0ZXN0SG9zdG5hbWVSZXMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBob3N0bmFtZSByZXNvbHV0aW9uIG1lY2hhbmlzbXMKKyAgICAgICAgaG9zdG5hbWUgPSBzb2NrZXQuZ2V0aG9zdG5hbWUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpcCA9IHNvY2tldC5nZXRob3N0YnluYW1lKGhvc3RuYW1lKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgIyBQcm9iYWJseSBuYW1lIGxvb2t1cCB3YXNuJ3Qgc2V0IHVwIHJpZ2h0OyBza2lwIHRoaXMgdGVzdAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpcC5maW5kKCcuJykgPj0gMCwgIkVycm9yIHJlc29sdmluZyBob3N0IHRvIGlwLiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhuYW1lLCBhbGlhc2VzLCBpcGFkZHJzID0gc29ja2V0LmdldGhvc3RieWFkZHIoaXApCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAjIFByb2JhYmx5IGEgc2ltaWxhciBwcm9ibGVtIGFzIGFib3ZlOyBza2lwIHRoaXMgdGVzdAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGFsbF9ob3N0X25hbWVzID0gW2hvc3RuYW1lLCBobmFtZV0gKyBhbGlhc2VzCisgICAgICAgIGZxaG4gPSBzb2NrZXQuZ2V0ZnFkbihpcCkKKyAgICAgICAgaWYgbm90IGZxaG4gaW4gYWxsX2hvc3RfbmFtZXM6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkVycm9yIHRlc3RpbmcgaG9zdCByZXNvbHV0aW9uIG1lY2hhbmlzbXMuIChmcWRuOiAlcywgYWxsOiAlcykiICUgKGZxaG4sIHJlcHIoYWxsX2hvc3RfbmFtZXMpKSkKKworICAgIGRlZiB0ZXN0UmVmQ291bnRHZXROYW1lSW5mbyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHJlZmVyZW5jZSBjb3VudCBmb3IgZ2V0bmFtZWluZm8KKyAgICAgICAgaWYgaGFzYXR0cihzeXMsICJnZXRyZWZjb3VudCIpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgT24gc29tZSB2ZXJzaW9ucywgdGhpcyBsb3NlcyBhIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgIG9yaWcgPSBzeXMuZ2V0cmVmY291bnQoX19uYW1lX18pCisgICAgICAgICAgICAgICAgc29ja2V0LmdldG5hbWVpbmZvKF9fbmFtZV9fLDApCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHJlZmNvdW50KF9fbmFtZV9fKSwgb3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb2NrZXQuZ2V0bmFtZWluZm8gbG9zZXMgYSByZWZlcmVuY2UiKQorCisgICAgZGVmIHRlc3RJbnRlcnByZXRlckNyYXNoKHNlbGYpOgorICAgICAgICAjIE1ha2luZyBzdXJlIGdldG5hbWVpbmZvIGRvZXNuJ3QgY3Jhc2ggdGhlIGludGVycHJldGVyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgT24gc29tZSB2ZXJzaW9ucywgdGhpcyBjcmFzaGVzIHRoZSBpbnRlcnByZXRlci4KKyAgICAgICAgICAgIHNvY2tldC5nZXRuYW1laW5mbygoJ3gnLCAwLCAwLCAwKSwgMCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0TnRvSChzZWxmKToKKyAgICAgICAgIyBUaGlzIGp1c3QgY2hlY2tzIHRoYXQgaHRvbnMgZXRjLiBhcmUgdGhlaXIgb3duIGludmVyc2UsCisgICAgICAgICMgd2hlbiBsb29raW5nIGF0IHRoZSBsb3dlciAxNiBvciAzMiBiaXRzLgorICAgICAgICBzaXplcyA9IHtzb2NrZXQuaHRvbmw6IDMyLCBzb2NrZXQubnRvaGw6IDMyLAorICAgICAgICAgICAgICAgICBzb2NrZXQuaHRvbnM6IDE2LCBzb2NrZXQubnRvaHM6IDE2fQorICAgICAgICBmb3IgZnVuYywgc2l6ZSBpbiBzaXplcy5pdGVtcygpOgorICAgICAgICAgICAgbWFzayA9ICgxTDw8c2l6ZSkgLSAxCisgICAgICAgICAgICBmb3IgaSBpbiAoMCwgMSwgMHhmZmZmLCB+MHhmZmZmLCAyLCAweDAxMjM0NTY3LCAweDc2NTQzMjEwKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkgJiBtYXNrLCBmdW5jKGZ1bmMoaSZtYXNrKSkgJiBtYXNrKQorCisgICAgICAgICAgICBzd2FwcGVkID0gZnVuYyhtYXNrKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzd2FwcGVkICYgbWFzaywgbWFzaykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZ1bmMsIDFMPDwzNCkKKworICAgIGRlZiB0ZXN0TnRvSEVycm9ycyhzZWxmKToKKyAgICAgICAgZ29vZF92YWx1ZXMgPSBbIDEsIDIsIDMsIDFMLCAyTCwgM0wgXQorICAgICAgICBiYWRfdmFsdWVzID0gWyAtMSwgLTIsIC0zLCAtMUwsIC0yTCwgLTNMIF0KKyAgICAgICAgZm9yIGsgaW4gZ29vZF92YWx1ZXM6CisgICAgICAgICAgICBzb2NrZXQubnRvaGwoaykKKyAgICAgICAgICAgIHNvY2tldC5udG9ocyhrKQorICAgICAgICAgICAgc29ja2V0Lmh0b25sKGspCisgICAgICAgICAgICBzb2NrZXQuaHRvbnMoaykKKyAgICAgICAgZm9yIGsgaW4gYmFkX3ZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNvY2tldC5udG9obCwgaykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNvY2tldC5udG9ocywgaykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNvY2tldC5odG9ubCwgaykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNvY2tldC5odG9ucywgaykKKworICAgIGRlZiB0ZXN0R2V0U2VydkJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBGaW5kIG9uZSBzZXJ2aWNlIHRoYXQgZXhpc3RzLCB0aGVuIGNoZWNrIGFsbCB0aGUgcmVsYXRlZCBpbnRlcmZhY2VzLgorICAgICAgICAjIEkndmUgb3JkZXJlZCB0aGlzIGJ5IHByb3RvY29scyB0aGF0IGhhdmUgYm90aCBhIHRjcCBhbmQgdWRwCisgICAgICAgICMgcHJvdG9jb2wsIGF0IGxlYXN0IGZvciBtb2Rlcm4gTGludXhlcy4KKyAgICAgICAgaWYgKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdsaW51eCcpIG9yCisgICAgICAgICAgICBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnZnJlZWJzZCcpIG9yCisgICAgICAgICAgICBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnbmV0YnNkJykgb3IKKyAgICAgICAgICAgIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyk6CisgICAgICAgICAgICAjIGF2b2lkIHRoZSAnZWNobycgc2VydmljZSBvbiB0aGlzIHBsYXRmb3JtLCBhcyB0aGVyZSBpcyBhbgorICAgICAgICAgICAgIyBhc3N1bXB0aW9uIGJyZWFraW5nIG5vbi1zdGFuZGFyZCBwb3J0L3Byb3RvY29sIGVudHJ5CisgICAgICAgICAgICBzZXJ2aWNlcyA9ICgnZGF5dGltZScsICdxb3RkJywgJ2RvbWFpbicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXJ2aWNlcyA9ICgnZWNobycsICdkYXl0aW1lJywgJ2RvbWFpbicpCisgICAgICAgIGZvciBzZXJ2aWNlIGluIHNlcnZpY2VzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBvcnQgPSBzb2NrZXQuZ2V0c2VydmJ5bmFtZShzZXJ2aWNlLCAndGNwJykKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IKKyAgICAgICAgIyBUcnkgc2FtZSBjYWxsIHdpdGggb3B0aW9uYWwgcHJvdG9jb2wgb21pdHRlZAorICAgICAgICBwb3J0MiA9IHNvY2tldC5nZXRzZXJ2YnluYW1lKHNlcnZpY2UpCisgICAgICAgIGVxKHBvcnQsIHBvcnQyKQorICAgICAgICAjIFRyeSB1ZHAsIGJ1dCBkb24ndCBiYXJmIGlmIGl0IGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdWRwcG9ydCA9IHNvY2tldC5nZXRzZXJ2YnluYW1lKHNlcnZpY2UsICd1ZHAnKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgdWRwcG9ydCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVxKHVkcHBvcnQsIHBvcnQpCisgICAgICAgICMgTm93IG1ha2Ugc3VyZSB0aGUgbG9va3VwIGJ5IHBvcnQgcmV0dXJucyB0aGUgc2FtZSBzZXJ2aWNlIG5hbWUKKyAgICAgICAgZXEoc29ja2V0LmdldHNlcnZieXBvcnQocG9ydDIpLCBzZXJ2aWNlKQorICAgICAgICBlcShzb2NrZXQuZ2V0c2VydmJ5cG9ydChwb3J0LCAndGNwJyksIHNlcnZpY2UpCisgICAgICAgIGlmIHVkcHBvcnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBlcShzb2NrZXQuZ2V0c2VydmJ5cG9ydCh1ZHBwb3J0LCAndWRwJyksIHNlcnZpY2UpCisgICAgICAgICMgTWFrZSBzdXJlIGdldHNlcnZieXBvcnQgZG9lcyBub3QgYWNjZXB0IG91dCBvZiByYW5nZSBwb3J0cy4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc29ja2V0LmdldHNlcnZieXBvcnQsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzb2NrZXQuZ2V0c2VydmJ5cG9ydCwgNjU1MzYpCisKKyAgICBkZWYgdGVzdERlZmF1bHRUaW1lb3V0KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgZGVmYXVsdCB0aW1lb3V0CisgICAgICAgICMgVGhlIGRlZmF1bHQgdGltZW91dCBzaG91bGQgaW5pdGlhbGx5IGJlIE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSwgTm9uZSkKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dGltZW91dCgpLCBOb25lKQorICAgICAgICBzLmNsb3NlKCkKKworICAgICAgICAjIFNldCB0aGUgZGVmYXVsdCB0aW1lb3V0IHRvIDEwLCBhbmQgc2VlIGlmIGl0IHByb3BhZ2F0ZXMKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpLCAxMCkKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dGltZW91dCgpLCAxMCkKKyAgICAgICAgcy5jbG9zZSgpCisKKyAgICAgICAgIyBSZXNldCB0aGUgZGVmYXVsdCB0aW1lb3V0IHRvIE5vbmUsIGFuZCBzZWUgaWYgaXQgcHJvcGFnYXRlcworICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSwgTm9uZSkKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dGltZW91dCgpLCBOb25lKQorICAgICAgICBzLmNsb3NlKCkKKworICAgICAgICAjIENoZWNrIHRoYXQgc2V0dGluZyBpdCB0byBhbiBpbnZhbGlkIHZhbHVlIHJhaXNlcyBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCwgLTEpCisKKyAgICAgICAgIyBDaGVjayB0aGF0IHNldHRpbmcgaXQgdG8gYW4gaW52YWxpZCB0eXBlIHJhaXNlcyBUeXBlRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQsICJzcGFtIikKKworICAgIGRlZiB0ZXN0SVB2NF9pbmV0X2F0b25fZm91cmJ5dGVzKHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzb2NrZXQsICdpbmV0X2F0b24nKToKKyAgICAgICAgICAgIHJldHVybiAgIyBObyBpbmV0X2F0b24sIG5vdGhpbmcgdG8gY2hlY2sKKyAgICAgICAgIyBUZXN0IHRoYXQgaXNzdWUxMDA4MDg2IGFuZCBpc3N1ZTc2NzE1MCBhcmUgZml4ZWQuCisgICAgICAgICMgSXQgbXVzdCByZXR1cm4gNCBieXRlcy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHgwMCcqNCwgc29ja2V0LmluZXRfYXRvbignMC4wLjAuMCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceGZmJyo0LCBzb2NrZXQuaW5ldF9hdG9uKCcyNTUuMjU1LjI1NS4yNTUnKSkKKworICAgIGRlZiB0ZXN0SVB2NHRvU3RyaW5nKHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzb2NrZXQsICdpbmV0X3B0b24nKToKKyAgICAgICAgICAgIHJldHVybiAjIE5vIGluZXRfcHRvbigpIG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgZnJvbSBzb2NrZXQgaW1wb3J0IGluZXRfYXRvbiBhcyBmLCBpbmV0X3B0b24sIEFGX0lORVQKKyAgICAgICAgZyA9IGxhbWJkYSBhOiBpbmV0X3B0b24oQUZfSU5FVCwgYSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceDAwXHgwMFx4MDBceDAwJywgZignMC4wLjAuMCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceGZmXHgwMFx4ZmZceDAwJywgZignMjU1LjAuMjU1LjAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhhYVx4YWFceGFhXHhhYScsIGYoJzE3MC4xNzAuMTcwLjE3MCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceDAxXHgwMlx4MDNceDA0JywgZignMS4yLjMuNCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceGZmXHhmZlx4ZmZceGZmJywgZignMjU1LjI1NS4yNTUuMjU1JykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHgwMFx4MDBceDAwXHgwMCcsIGcoJzAuMC4wLjAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhmZlx4MDBceGZmXHgwMCcsIGcoJzI1NS4wLjI1NS4wJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4YWFceGFhXHhhYVx4YWEnLCBnKCcxNzAuMTcwLjE3MC4xNzAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhmZlx4ZmZceGZmXHhmZicsIGcoJzI1NS4yNTUuMjU1LjI1NScpKQorCisgICAgZGVmIHRlc3RJUHY2dG9TdHJpbmcoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNvY2tldCwgJ2luZXRfcHRvbicpOgorICAgICAgICAgICAgcmV0dXJuICMgTm8gaW5ldF9wdG9uKCkgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHNvY2tldCBpbXBvcnQgaW5ldF9wdG9uLCBBRl9JTkVUNiwgaGFzX2lwdjYKKyAgICAgICAgICAgIGlmIG5vdCBoYXNfaXB2NjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGYgPSBsYW1iZGEgYTogaW5ldF9wdG9uKEFGX0lORVQ2LCBhKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4MDAnICogMTYsIGYoJzo6JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4MDAnICogMTYsIGYoJzA6OjAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHgwMFx4MDEnICsgJ1x4MDAnICogMTQsIGYoJzE6OicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgJ1x4NDVceGVmXHg3Nlx4Y2JceDAwXHgxYVx4NTZceGVmXHhhZlx4ZWJceDBiXHhhY1x4MTlceDI0XHhhZVx4YWUnLAorICAgICAgICAgICAgZignNDVlZjo3NmNiOjFhOjU2ZWY6YWZlYjpiYWM6MTkyNDphZWFlJykKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RTdHJpbmdUb0lQdjQoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNvY2tldCwgJ2luZXRfbnRvcCcpOgorICAgICAgICAgICAgcmV0dXJuICMgTm8gaW5ldF9udG9wKCkgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgICBmcm9tIHNvY2tldCBpbXBvcnQgaW5ldF9udG9hIGFzIGYsIGluZXRfbnRvcCwgQUZfSU5FVAorICAgICAgICBnID0gbGFtYmRhIGE6IGluZXRfbnRvcChBRl9JTkVULCBhKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzEuMC4xLjAnLCBmKCdceDAxXHgwMFx4MDFceDAwJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzE3MC44NS4xNzAuODUnLCBmKCdceGFhXHg1NVx4YWFceDU1JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzI1NS4yNTUuMjU1LjI1NScsIGYoJ1x4ZmZceGZmXHhmZlx4ZmYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMS4yLjMuNCcsIGYoJ1x4MDFceDAyXHgwM1x4MDQnKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxLjAuMS4wJywgZygnXHgwMVx4MDBceDAxXHgwMCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxNzAuODUuMTcwLjg1JywgZygnXHhhYVx4NTVceGFhXHg1NScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcyNTUuMjU1LjI1NS4yNTUnLCBnKCdceGZmXHhmZlx4ZmZceGZmJykpCisKKyAgICBkZWYgdGVzdFN0cmluZ1RvSVB2NihzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc29ja2V0LCAnaW5ldF9udG9wJyk6CisgICAgICAgICAgICByZXR1cm4gIyBObyBpbmV0X250b3AoKSBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gc29ja2V0IGltcG9ydCBpbmV0X250b3AsIEFGX0lORVQ2LCBoYXNfaXB2NgorICAgICAgICAgICAgaWYgbm90IGhhc19pcHY2OgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZiA9IGxhbWJkYSBhOiBpbmV0X250b3AoQUZfSU5FVDYsIGEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnOjonLCBmKCdceDAwJyAqIDE2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnOjoxJywgZignXHgwMCcgKiAxNSArICdceDAxJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAnYWVmOmIwMTo1MDY6MTAwMTpmZmZmOjk5OTc6NTU6MTcwJywKKyAgICAgICAgICAgIGYoJ1x4MGFceGVmXHgwYlx4MDFceDA1XHgwNlx4MTBceDAxXHhmZlx4ZmZceDk5XHg5N1x4MDBceDU1XHgwMVx4NzAnKQorICAgICAgICApCisKKyAgICAjIFhYWCBUaGUgZm9sbG93aW5nIGRvbid0IHRlc3QgbW9kdWxlLWxldmVsIGZ1bmN0aW9uYWxpdHkuLi4KKworICAgIGRlZiBfZ2V0X3VudXNlZF9wb3J0KHNlbGYsIGJpbmRfYWRkcmVzcz0nMC4wLjAuMCcpOgorICAgICAgICAiIiJVc2UgYSB0ZW1wb3Jhcnkgc29ja2V0IHRvIGVsaWNpdCBhbiB1bnVzZWQgZXBoZW1lcmFsIHBvcnQuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIGJpbmRfYWRkcmVzczogSG9zdG5hbWUgb3IgSVAgYWRkcmVzcyB0byBzZWFyY2ggZm9yIGEgcG9ydCBvbi4KKworICAgICAgICBSZXR1cm5zOiBBIG1vc3QgbGlrZWx5IHRvIGJlIHVudXNlZCBwb3J0LgorICAgICAgICAiIiIKKyAgICAgICAgdGVtcHNvY2sgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgdGVtcHNvY2suYmluZCgoYmluZF9hZGRyZXNzLCAwKSkKKyAgICAgICAgaG9zdCwgcG9ydCA9IHRlbXBzb2NrLmdldHNvY2tuYW1lKCkKKyAgICAgICAgdGVtcHNvY2suY2xvc2UoKQorICAgICAgICByZXR1cm4gcG9ydAorCisgICAgZGVmIHRlc3RTb2NrTmFtZShzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGdldHNvY2tuYW1lKCkKKyAgICAgICAgcG9ydCA9IHNlbGYuX2dldF91bnVzZWRfcG9ydCgpCisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzb2NrLmNsb3NlKQorICAgICAgICBzb2NrLmJpbmQoKCIwLjAuMC4wIiwgcG9ydCkpCisgICAgICAgIG5hbWUgPSBzb2NrLmdldHNvY2tuYW1lKCkKKyAgICAgICAgIyBYWFgobm5vcndpdHopOiBodHRwOi8vdGlueXVybC5jb20vb3M1anogc2VlbXMgdG8gaW5kaWNhdGUKKyAgICAgICAgIyBpdCByZWFzb25hYmxlIHRvIGdldCB0aGUgaG9zdCdzIGFkZHIgaW4gYWRkaXRpb24gdG8gMC4wLjAuMC4KKyAgICAgICAgIyBBdCBsZWFzdCBmb3IgZUNvcy4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBTLzM5MCB0byBwYXNzLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBteV9pcF9hZGRyID0gc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAjIFByb2JhYmx5IG5hbWUgbG9va3VwIHdhc24ndCBzZXQgdXAgcmlnaHQ7IHNraXAgdGhpcyB0ZXN0CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hc3NlcnRJbihuYW1lWzBdLCAoIjAuMC4wLjAiLCBteV9pcF9hZGRyKSwgJyVzIGludmFsaWQnICUgbmFtZVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lWzFdLCBwb3J0KQorCisgICAgZGVmIHRlc3RHZXRTb2NrT3B0KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgZ2V0c29ja29wdCgpCisgICAgICAgICMgV2Uga25vdyBhIHNvY2tldCBzaG91bGQgc3RhcnQgd2l0aG91dCByZXVzZT09MAorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc29jay5jbG9zZSkKKyAgICAgICAgcmV1c2UgPSBzb2NrLmdldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmV1c2UgIT0gMCwgImluaXRpYWwgbW9kZSBpcyByZXVzZSIpCisKKyAgICBkZWYgdGVzdFNldFNvY2tPcHQoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBzZXRzb2Nrb3B0KCkKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNvY2suY2xvc2UpCisgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgcmV1c2UgPSBzb2NrLmdldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmV1c2UgPT0gMCwgImZhaWxlZCB0byBzZXQgcmV1c2UgbW9kZSIpCisKKyAgICBkZWYgdGVzdFNlbmRBZnRlckNsb3NlKHNlbGYpOgorICAgICAgICAjIHRlc3Rpbmcgc2VuZCgpIGFmdGVyIGNsb3NlKCkgd2l0aCB0aW1lb3V0CisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNvY2suc2V0dGltZW91dCgxKQorICAgICAgICBzb2NrLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzb2NrLnNlbmQsICJzcGFtIikKKworICAgIGRlZiB0ZXN0TmV3QXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0aW5nIC5mYW1pbHksIC50eXBlIGFuZCAucHJvdG9jb2wKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb2NrLmZhbWlseSwgc29ja2V0LkFGX0lORVQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29jay50eXBlLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29jay5wcm90bywgMCkKKyAgICAgICAgc29jay5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9nZXRzb2NrYWRkcmFyZyhzZWxmKToKKyAgICAgICAgaG9zdCA9ICcwLjAuMC4wJworICAgICAgICBwb3J0ID0gc2VsZi5fZ2V0X3VudXNlZF9wb3J0KGJpbmRfYWRkcmVzcz1ob3N0KQorICAgICAgICBiaWdfcG9ydCA9IHBvcnQgKyA2NTUzNgorICAgICAgICBuZWdfcG9ydCA9IHBvcnQgLSA2NTUzNgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNvY2suYmluZCwgKGhvc3QsIGJpZ19wb3J0KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNvY2suYmluZCwgKGhvc3QsIG5lZ19wb3J0KSkKKyAgICAgICAgICAgIHNvY2suYmluZCgoaG9zdCwgcG9ydCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrLmNsb3NlKCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gIm50IiwgIldpbmRvd3Mgc3BlY2lmaWMiKQorICAgIGRlZiB0ZXN0X3NvY2tfaW9jdGwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHNvY2tldC5zb2NrZXQsICdpb2N0bCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzb2NrZXQsICdTSU9fUkNWQUxMJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHNvY2tldCwgJ1JDVkFMTF9PTicpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzb2NrZXQsICdSQ1ZBTExfT0ZGJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHNvY2tldCwgJ1NJT19LRUVQQUxJVkVfVkFMUycpKQorICAgICAgICBzID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzLmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzLmlvY3RsLCAtMSwgTm9uZSkKKyAgICAgICAgcy5pb2N0bChzb2NrZXQuU0lPX0tFRVBBTElWRV9WQUxTLCAoMSwgMTAwLCAxMDApKQorCisgICAgZGVmIHRlc3RHZXRhZGRyaW5mbyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc29ja2V0LmdldGFkZHJpbmZvKCdsb2NhbGhvc3QnLCA4MCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5nYWllcnJvciBhcyBlcnI6CisgICAgICAgICAgICBpZiBlcnIuZXJybm8gPT0gc29ja2V0LkVBSV9TRVJWSUNFOgorICAgICAgICAgICAgICAgICMgc2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMjgyNjQ3CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiYnVnZ3kgbGliYyB2ZXJzaW9uIikKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgICMgbGVuIG9mIGV2ZXJ5IHNlcXVlbmNlIGlzIHN1cHBvc2VkIHRvIGJlID09IDUKKyAgICAgICAgZm9yIGluZm8gaW4gc29ja2V0LmdldGFkZHJpbmZvKEhPU1QsIE5vbmUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaW5mbyksIDUpCisgICAgICAgICMgaG9zdCBjYW4gYmUgYSBkb21haW4gbmFtZSwgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4KKyAgICAgICAgIyBJUHY0L3Y2IGFkZHJlc3Mgb3IgTm9uZQorICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oJ2xvY2FsaG9zdCcsIDgwKQorICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oJzEyNy4wLjAuMScsIDgwKQorICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oTm9uZSwgODApCisgICAgICAgIGlmIFNVUFBPUlRTX0lQVjY6CisgICAgICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oJzo6MScsIDgwKQorICAgICAgICAjIHBvcnQgY2FuIGJlIGEgc3RyaW5nIHNlcnZpY2UgbmFtZSBzdWNoIGFzICJodHRwIiwgYSBudW1lcmljCisgICAgICAgICMgcG9ydCBudW1iZXIgKGludCBvciBsb25nKSwgb3IgTm9uZQorICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oSE9TVCwgImh0dHAiKQorICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oSE9TVCwgODApCisgICAgICAgIHNvY2tldC5nZXRhZGRyaW5mbyhIT1NULCA4MEwpCisgICAgICAgIHNvY2tldC5nZXRhZGRyaW5mbyhIT1NULCBOb25lKQorICAgICAgICAjIHRlc3QgZmFtaWx5IGFuZCBzb2NrdHlwZSBmaWx0ZXJzCisgICAgICAgIGluZm9zID0gc29ja2V0LmdldGFkZHJpbmZvKEhPU1QsIE5vbmUsIHNvY2tldC5BRl9JTkVUKQorICAgICAgICBmb3IgZmFtaWx5LCBfLCBfLCBfLCBfIGluIGluZm9zOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmYW1pbHksIHNvY2tldC5BRl9JTkVUKQorICAgICAgICBpbmZvcyA9IHNvY2tldC5nZXRhZGRyaW5mbyhIT1NULCBOb25lLCAwLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIGZvciBfLCBzb2NrdHlwZSwgXywgXywgXyBpbiBpbmZvczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ja3R5cGUsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgIyB0ZXN0IHByb3RvIGFuZCBmbGFncyBhcmd1bWVudHMKKyAgICAgICAgc29ja2V0LmdldGFkZHJpbmZvKEhPU1QsIE5vbmUsIDAsIDAsIHNvY2tldC5TT0xfVENQKQorICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oSE9TVCwgTm9uZSwgMCwgMCwgMCwgc29ja2V0LkFJX1BBU1NJVkUpCisgICAgICAgICMgYSBzZXJ2ZXIgd2lsbGluZyB0byBzdXBwb3J0IGJvdGggSVB2NCBhbmQgSVB2NiB3aWxsCisgICAgICAgICMgdXN1YWxseSBkbyB0aGlzCisgICAgICAgIHNvY2tldC5nZXRhZGRyaW5mbyhOb25lLCAwLCBzb2NrZXQuQUZfVU5TUEVDLCBzb2NrZXQuU09DS19TVFJFQU0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuQUlfUEFTU0lWRSkKKworCisgICAgZGVmIGNoZWNrX3NlbmRhbGxfaW50ZXJydXB0ZWQoc2VsZiwgd2l0aF90aW1lb3V0KToKKyAgICAgICAgIyBzb2NrZXRwYWlyKCkgaXMgbm90IHN0cmljbHkgcmVxdWlyZWQsIGJ1dCBpdCBtYWtlcyB0aGluZ3MgZWFzaWVyLgorICAgICAgICBpZiBub3QgaGFzYXR0cihzaWduYWwsICdhbGFybScpIG9yIG5vdCBoYXNhdHRyKHNvY2tldCwgJ3NvY2tldHBhaXInKToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInNpZ25hbC5hbGFybSBhbmQgc29ja2V0LnNvY2tldHBhaXIgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdCIpCisgICAgICAgICMgT3VyIHNpZ25hbCBoYW5kbGVycyBjbG9iYmVyIHRoZSBDIGVycm5vIGJ5IGNhbGxpbmcgYSBtYXRoIGZ1bmN0aW9uCisgICAgICAgICMgd2l0aCBhbiBpbnZhbGlkIGRvbWFpbiB2YWx1ZS4KKyAgICAgICAgZGVmIG9rX2hhbmRsZXIoKmFyZ3MpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hY29zaCwgMCkKKyAgICAgICAgZGVmIHJhaXNpbmdfaGFuZGxlcigqYXJncyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFjb3NoLCAwKQorICAgICAgICAgICAgMSAvLyAwCisgICAgICAgIGMsIHMgPSBzb2NrZXQuc29ja2V0cGFpcigpCisgICAgICAgIG9sZF9hbGFybSA9IHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIHJhaXNpbmdfaGFuZGxlcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgd2l0aF90aW1lb3V0OgorICAgICAgICAgICAgICAgICMgSnVzdCBhYm92ZSB0aGUgb25lIHNlY29uZCBtaW5pbXVtIGZvciBzaWduYWwuYWxhcm0KKyAgICAgICAgICAgICAgICBjLnNldHRpbWVvdXQoMS41KQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgICAgICAgICAgYy5zZW5kYWxsKGIieCIgKiAoMTAyNCoqMikpCisgICAgICAgICAgICBpZiB3aXRoX3RpbWVvdXQ6CisgICAgICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgb2tfaGFuZGxlcikKKyAgICAgICAgICAgICAgICBzaWduYWwuYWxhcm0oMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQudGltZW91dCwgYy5zZW5kYWxsLCBiIngiICogKDEwMjQqKjIpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgb2xkX2FsYXJtKQorICAgICAgICAgICAgYy5jbG9zZSgpCisgICAgICAgICAgICBzLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3NlbmRhbGxfaW50ZXJydXB0ZWQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc2VuZGFsbF9pbnRlcnJ1cHRlZChGYWxzZSkKKworICAgIGRlZiB0ZXN0X3NlbmRhbGxfaW50ZXJydXB0ZWRfd2l0aF90aW1lb3V0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3NlbmRhbGxfaW50ZXJydXB0ZWQoVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2xpc3Rlbl9iYWNrbG9nKHNlbGYpOgorICAgICAgICBmb3IgYmFja2xvZyBpbiAwLCAtMToKKyAgICAgICAgICAgIHNydiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgIHNydi5iaW5kKChIT1NULCAwKSkKKyAgICAgICAgICAgIHNydi5saXN0ZW4oYmFja2xvZykKKyAgICAgICAgICAgIHNydi5jbG9zZSgpCisKKyAgICAgICAgIyBJc3N1ZSAxNTk4OQorICAgICAgICBzcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNydi5iaW5kKChIT1NULCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc3J2Lmxpc3RlbiwgX3Rlc3RjYXBpLklOVF9NQVggKyAxKQorICAgICAgICBzcnYuY2xvc2UoKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoU1VQUE9SVFNfSVBWNiwgJ0lQdjYgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIGRlZiB0ZXN0X2Zsb3dpbmZvKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzb2NrZXQuZ2V0bmFtZWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnOjoxJywwLCAweGZmZmZmZmZmKSwgMCkKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQ2LCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHMuYmluZCwgKCc6OjEnLCAwLCAtMTApKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcy5jbG9zZSgpCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIEJhc2ljVENQVGVzdChTb2NrZXRDb25uZWN0ZWRUZXN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPSdydW5UZXN0Jyk6CisgICAgICAgIFNvY2tldENvbm5lY3RlZFRlc3QuX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT1tZXRob2ROYW1lKQorCisgICAgZGVmIHRlc3RSZWN2KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgbGFyZ2UgcmVjZWl2ZSBvdmVyIFRDUAorICAgICAgICBtc2cgPSBzZWxmLmNsaV9jb25uLnJlY3YoMTAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworICAgIGRlZiBfdGVzdFJlY3Yoc2VsZik6CisgICAgICAgIHNlbGYuc2Vydl9jb25uLnNlbmQoTVNHKQorCisgICAgZGVmIHRlc3RPdmVyRmxvd1JlY3Yoc2VsZik6CisgICAgICAgICMgVGVzdGluZyByZWNlaXZlIGluIGNodW5rcyBvdmVyIFRDUAorICAgICAgICBzZWcxID0gc2VsZi5jbGlfY29ubi5yZWN2KGxlbihNU0cpIC0gMykKKyAgICAgICAgc2VnMiA9IHNlbGYuY2xpX2Nvbm4ucmVjdigxMDI0KQorICAgICAgICBtc2cgPSBzZWcxICsgc2VnMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCisgICAgZGVmIF90ZXN0T3ZlckZsb3dSZWN2KHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKE1TRykKKworICAgIGRlZiB0ZXN0UmVjdkZyb20oc2VsZik6CisgICAgICAgICMgVGVzdGluZyBsYXJnZSByZWN2ZnJvbSgpIG92ZXIgVENQCisgICAgICAgIG1zZywgYWRkciA9IHNlbGYuY2xpX2Nvbm4ucmVjdmZyb20oMTAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworICAgIGRlZiBfdGVzdFJlY3ZGcm9tKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKE1TRykKKworICAgIGRlZiB0ZXN0T3ZlckZsb3dSZWN2RnJvbShzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHJlY3Zmcm9tKCkgaW4gY2h1bmtzIG92ZXIgVENQCisgICAgICAgIHNlZzEsIGFkZHIgPSBzZWxmLmNsaV9jb25uLnJlY3Zmcm9tKGxlbihNU0cpLTMpCisgICAgICAgIHNlZzIsIGFkZHIgPSBzZWxmLmNsaV9jb25uLnJlY3Zmcm9tKDEwMjQpCisgICAgICAgIG1zZyA9IHNlZzEgKyBzZWcyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBkZWYgX3Rlc3RPdmVyRmxvd1JlY3ZGcm9tKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKE1TRykKKworICAgIGRlZiB0ZXN0U2VuZEFsbChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHNlbmRhbGwoKSB3aXRoIGEgMjA0OCBieXRlIHN0cmluZyBvdmVyIFRDUAorICAgICAgICBtc2cgPSAnJworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgcmVhZCA9IHNlbGYuY2xpX2Nvbm4ucmVjdigxMDI0KQorICAgICAgICAgICAgaWYgbm90IHJlYWQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG1zZyArPSByZWFkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCAnZicgKiAyMDQ4KQorCisgICAgZGVmIF90ZXN0U2VuZEFsbChzZWxmKToKKyAgICAgICAgYmlnX2NodW5rID0gJ2YnICogMjA0OAorICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kYWxsKGJpZ19jaHVuaykKKworICAgIGRlZiB0ZXN0RnJvbUZkKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgZnJvbWZkKCkKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc29ja2V0LCAiZnJvbWZkIik6CisgICAgICAgICAgICByZXR1cm4gIyBPbiBXaW5kb3dzLCB0aGlzIGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgZmQgPSBzZWxmLmNsaV9jb25uLmZpbGVubygpCisgICAgICAgIHNvY2sgPSBzb2NrZXQuZnJvbWZkKGZkLCBzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc29jay5jbG9zZSkKKyAgICAgICAgbXNnID0gc29jay5yZWN2KDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBkZWYgX3Rlc3RGcm9tRmQoc2VsZik6CisgICAgICAgIHNlbGYuc2Vydl9jb25uLnNlbmQoTVNHKQorCisgICAgZGVmIHRlc3REdXAoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBkdXAoKQorICAgICAgICBzb2NrID0gc2VsZi5jbGlfY29ubi5kdXAoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc29jay5jbG9zZSkKKyAgICAgICAgbXNnID0gc29jay5yZWN2KDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBkZWYgX3Rlc3REdXAoc2VsZik6CisgICAgICAgIHNlbGYuc2Vydl9jb25uLnNlbmQoTVNHKQorCisgICAgZGVmIHRlc3RTaHV0ZG93bihzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHNodXRkb3duKCkKKyAgICAgICAgbXNnID0gc2VsZi5jbGlfY29ubi5yZWN2KDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisgICAgICAgICMgd2FpdCBmb3IgX3Rlc3RTaHV0ZG93biB0byBmaW5pc2g6IG9uIE9TIFgsIHdoZW4gdGhlIHNlcnZlcgorICAgICAgICAjIGNsb3NlcyB0aGUgY29ubmVjdGlvbiB0aGUgY2xpZW50IGFsc28gYmVjb21lcyBkaXNjb25uZWN0ZWQsCisgICAgICAgICMgYW5kIHRoZSBjbGllbnQncyBzaHV0ZG93biBjYWxsIHdpbGwgZmFpbC4gKElzc3VlICM0Mzk3LikKKyAgICAgICAgc2VsZi5kb25lLndhaXQoKQorCisgICAgZGVmIF90ZXN0U2h1dGRvd24oc2VsZik6CisgICAgICAgIHNlbGYuc2Vydl9jb25uLnNlbmQoTVNHKQorICAgICAgICAjIElzc3VlIDE1OTg5CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNlbGYuc2Vydl9jb25uLnNodXRkb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfdGVzdGNhcGkuSU5UX01BWCArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNlbGYuc2Vydl9jb25uLnNodXRkb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyICsgKF90ZXN0Y2FwaS5VSU5UX01BWCArIDEpKQorICAgICAgICBzZWxmLnNlcnZfY29ubi5zaHV0ZG93bigyKQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWQsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgQmFzaWNVRFBUZXN0KFRocmVhZGVkVURQU29ja2V0VGVzdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT0ncnVuVGVzdCcpOgorICAgICAgICBUaHJlYWRlZFVEUFNvY2tldFRlc3QuX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT1tZXRob2ROYW1lKQorCisgICAgZGVmIHRlc3RTZW5kdG9BbmRSZWN2KHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgc2VuZHRvKCkgYW5kIFJlY3YoKSBvdmVyIFVEUAorICAgICAgICBtc2cgPSBzZWxmLnNlcnYucmVjdihsZW4oTVNHKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworICAgIGRlZiBfdGVzdFNlbmR0b0FuZFJlY3Yoc2VsZik6CisgICAgICAgIHNlbGYuY2xpLnNlbmR0byhNU0csIDAsIChIT1NULCBzZWxmLnBvcnQpKQorCisgICAgZGVmIHRlc3RSZWN2RnJvbShzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHJlY3Zmcm9tKCkgb3ZlciBVRFAKKyAgICAgICAgbXNnLCBhZGRyID0gc2VsZi5zZXJ2LnJlY3Zmcm9tKGxlbihNU0cpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCisgICAgZGVmIF90ZXN0UmVjdkZyb20oc2VsZik6CisgICAgICAgIHNlbGYuY2xpLnNlbmR0byhNU0csIDAsIChIT1NULCBzZWxmLnBvcnQpKQorCisgICAgZGVmIHRlc3RSZWN2RnJvbU5lZ2F0aXZlKHNlbGYpOgorICAgICAgICAjIE5lZ2F0aXZlIGxlbmd0aHMgcGFzc2VkIHRvIHJlY3Zmcm9tIHNob3VsZCBnaXZlIFZhbHVlRXJyb3IuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuc2Vydi5yZWN2ZnJvbSwgLTEpCisKKyAgICBkZWYgX3Rlc3RSZWN2RnJvbU5lZ2F0aXZlKHNlbGYpOgorICAgICAgICBzZWxmLmNsaS5zZW5kdG8oTVNHLCAwLCAoSE9TVCwgc2VsZi5wb3J0KSkKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIFRDUENsb3NlclRlc3QoVGhyZWFkZWRUQ1BTb2NrZXRUZXN0KToKKworICAgIGRlZiB0ZXN0Q2xvc2Uoc2VsZik6CisgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLnNlcnYuYWNjZXB0KCkKKyAgICAgICAgY29ubi5jbG9zZSgpCisKKyAgICAgICAgc2QgPSBzZWxmLmNsaQorICAgICAgICByZWFkLCB3cml0ZSwgZXJyID0gc2VsZWN0LnNlbGVjdChbc2RdLCBbXSwgW10sIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkLCBbc2RdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNkLnJlY3YoMSksICcnKQorCisgICAgZGVmIF90ZXN0Q2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2xpLmNvbm5lY3QoKEhPU1QsIHNlbGYucG9ydCkpCisgICAgICAgIHRpbWUuc2xlZXAoMS4wKQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWQsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgQmFzaWNTb2NrZXRQYWlyVGVzdChTb2NrZXRQYWlyVGVzdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT0ncnVuVGVzdCcpOgorICAgICAgICBTb2NrZXRQYWlyVGVzdC5fX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPW1ldGhvZE5hbWUpCisKKyAgICBkZWYgdGVzdFJlY3Yoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuc2Vydi5yZWN2KDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBkZWYgX3Rlc3RSZWN2KHNlbGYpOgorICAgICAgICBzZWxmLmNsaS5zZW5kKE1TRykKKworICAgIGRlZiB0ZXN0U2VuZChzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2LnNlbmQoTVNHKQorCisgICAgZGVmIF90ZXN0U2VuZChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5jbGkucmVjdigxMDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWQsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgTm9uQmxvY2tpbmdUQ1BUZXN0cyhUaHJlYWRlZFRDUFNvY2tldFRlc3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9J3J1blRlc3QnKToKKyAgICAgICAgVGhyZWFkZWRUQ1BTb2NrZXRUZXN0Ll9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9bWV0aG9kTmFtZSkKKworICAgIGRlZiB0ZXN0U2V0QmxvY2tpbmcoc2VsZik6CisgICAgICAgICMgVGVzdGluZyB3aGV0aGVyIHNldCBibG9ja2luZyB3b3JrcworICAgICAgICBzZWxmLnNlcnYuc2V0YmxvY2tpbmcoVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5zZXJ2LmdldHRpbWVvdXQoKSkKKyAgICAgICAgc2VsZi5zZXJ2LnNldGJsb2NraW5nKEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2Vydi5nZXR0aW1lb3V0KCksIDAuMCkKKyAgICAgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNlcnYuYWNjZXB0KCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZW5kID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChlbmQgLSBzdGFydCkgPCAxLjAsICJFcnJvciBzZXR0aW5nIG5vbi1ibG9ja2luZyBtb2RlLiIpCisgICAgICAgICMgSXNzdWUgMTU5ODkKKyAgICAgICAgaWYgX3Rlc3RjYXBpLlVJTlRfTUFYIDwgX3Rlc3RjYXBpLlVMT05HX01BWDoKKyAgICAgICAgICAgIHNlbGYuc2Vydi5zZXRibG9ja2luZyhfdGVzdGNhcGkuVUlOVF9NQVggKyAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2VsZi5zZXJ2LmdldHRpbWVvdXQoKSkKKworICAgIGRlZiBfdGVzdFNldEJsb2NraW5nKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdEFjY2VwdChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIG5vbi1ibG9ja2luZyBhY2NlcHQKKyAgICAgICAgc2VsZi5zZXJ2LnNldGJsb2NraW5nKDApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLnNlcnYuYWNjZXB0KCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRXJyb3IgdHJ5aW5nIHRvIGRvIG5vbi1ibG9ja2luZyBhY2NlcHQuIikKKyAgICAgICAgcmVhZCwgd3JpdGUsIGVyciA9IHNlbGVjdC5zZWxlY3QoW3NlbGYuc2Vydl0sIFtdLCBbXSkKKyAgICAgICAgaWYgc2VsZi5zZXJ2IGluIHJlYWQ6CisgICAgICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRXJyb3IgdHJ5aW5nIHRvIGRvIGFjY2VwdCBhZnRlciBzZWxlY3QuIikKKworICAgIGRlZiBfdGVzdEFjY2VwdChzZWxmKToKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgIHNlbGYuY2xpLmNvbm5lY3QoKEhPU1QsIHNlbGYucG9ydCkpCisKKyAgICBkZWYgdGVzdENvbm5lY3Qoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBub24tYmxvY2tpbmcgY29ubmVjdAorICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgZGVmIF90ZXN0Q29ubmVjdChzZWxmKToKKyAgICAgICAgc2VsZi5jbGkuc2V0dGltZW91dCgxMCkKKyAgICAgICAgc2VsZi5jbGkuY29ubmVjdCgoSE9TVCwgc2VsZi5wb3J0KSkKKworICAgIGRlZiB0ZXN0UmVjdihzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIG5vbi1ibG9ja2luZyByZWN2CisgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLnNlcnYuYWNjZXB0KCkKKyAgICAgICAgY29ubi5zZXRibG9ja2luZygwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBjb25uLnJlY3YobGVuKE1TRykpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkVycm9yIHRyeWluZyB0byBkbyBub24tYmxvY2tpbmcgcmVjdi4iKQorICAgICAgICByZWFkLCB3cml0ZSwgZXJyID0gc2VsZWN0LnNlbGVjdChbY29ubl0sIFtdLCBbXSkKKyAgICAgICAgaWYgY29ubiBpbiByZWFkOgorICAgICAgICAgICAgbXNnID0gY29ubi5yZWN2KGxlbihNU0cpKQorICAgICAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJFcnJvciBkdXJpbmcgc2VsZWN0IGNhbGwgdG8gbm9uLWJsb2NraW5nIHNvY2tldC4iKQorCisgICAgZGVmIF90ZXN0UmVjdihzZWxmKToKKyAgICAgICAgc2VsZi5jbGkuY29ubmVjdCgoSE9TVCwgc2VsZi5wb3J0KSkKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgIHNlbGYuY2xpLnNlbmQoTVNHKQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWQsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgRmlsZU9iamVjdENsYXNzVGVzdENhc2UoU29ja2V0Q29ubmVjdGVkVGVzdCk6CisKKyAgICBidWZzaXplID0gLTEgIyBVc2UgZGVmYXVsdCBidWZmZXIgc2l6ZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9J3J1blRlc3QnKToKKyAgICAgICAgU29ja2V0Q29ubmVjdGVkVGVzdC5fX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPW1ldGhvZE5hbWUpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIFNvY2tldENvbm5lY3RlZFRlc3Quc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5zZXJ2X2ZpbGUgPSBzZWxmLmNsaV9jb25uLm1ha2VmaWxlKCdyYicsIHNlbGYuYnVmc2l6ZSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2X2ZpbGUuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zZXJ2X2ZpbGUuY2xvc2VkKQorICAgICAgICBTb2NrZXRDb25uZWN0ZWRUZXN0LnRlYXJEb3duKHNlbGYpCisgICAgICAgIHNlbGYuc2Vydl9maWxlID0gTm9uZQorCisgICAgZGVmIGNsaWVudFNldFVwKHNlbGYpOgorICAgICAgICBTb2NrZXRDb25uZWN0ZWRUZXN0LmNsaWVudFNldFVwKHNlbGYpCisgICAgICAgIHNlbGYuY2xpX2ZpbGUgPSBzZWxmLnNlcnZfY29ubi5tYWtlZmlsZSgnd2InKQorCisgICAgZGVmIGNsaWVudFRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNsaV9maWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY2xpX2ZpbGUuY2xvc2VkKQorICAgICAgICBzZWxmLmNsaV9maWxlID0gTm9uZQorICAgICAgICBTb2NrZXRDb25uZWN0ZWRUZXN0LmNsaWVudFRlYXJEb3duKHNlbGYpCisKKyAgICBkZWYgdGVzdFNtYWxsUmVhZChzZWxmKToKKyAgICAgICAgIyBQZXJmb3JtaW5nIHNtYWxsIGZpbGUgcmVhZCB0ZXN0CisgICAgICAgIGZpcnN0X3NlZyA9IHNlbGYuc2Vydl9maWxlLnJlYWQobGVuKE1TRyktMykKKyAgICAgICAgc2Vjb25kX3NlZyA9IHNlbGYuc2Vydl9maWxlLnJlYWQoMykKKyAgICAgICAgbXNnID0gZmlyc3Rfc2VnICsgc2Vjb25kX3NlZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCisgICAgZGVmIF90ZXN0U21hbGxSZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmNsaV9maWxlLndyaXRlKE1TRykKKyAgICAgICAgc2VsZi5jbGlfZmlsZS5mbHVzaCgpCisKKyAgICBkZWYgdGVzdEZ1bGxSZWFkKHNlbGYpOgorICAgICAgICAjIHJlYWQgdW50aWwgRU9GCisgICAgICAgIG1zZyA9IHNlbGYuc2Vydl9maWxlLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCisgICAgZGVmIF90ZXN0RnVsbFJlYWQoc2VsZik6CisgICAgICAgIHNlbGYuY2xpX2ZpbGUud3JpdGUoTVNHKQorICAgICAgICBzZWxmLmNsaV9maWxlLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VW5idWZmZXJlZFJlYWQoc2VsZik6CisgICAgICAgICMgUGVyZm9ybWluZyB1bmJ1ZmZlcmVkIGZpbGUgcmVhZCB0ZXN0CisgICAgICAgIGJ1ZiA9ICcnCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBjaGFyID0gc2VsZi5zZXJ2X2ZpbGUucmVhZCgxKQorICAgICAgICAgICAgaWYgbm90IGNoYXI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGJ1ZiArPSBjaGFyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBNU0cpCisKKyAgICBkZWYgX3Rlc3RVbmJ1ZmZlcmVkUmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5jbGlfZmlsZS53cml0ZShNU0cpCisgICAgICAgIHNlbGYuY2xpX2ZpbGUuZmx1c2goKQorCisgICAgZGVmIHRlc3RSZWFkbGluZShzZWxmKToKKyAgICAgICAgIyBQZXJmb3JtaW5nIGZpbGUgcmVhZGxpbmUgdGVzdAorICAgICAgICBsaW5lID0gc2VsZi5zZXJ2X2ZpbGUucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIE1TRykKKworICAgIGRlZiBfdGVzdFJlYWRsaW5lKHNlbGYpOgorICAgICAgICBzZWxmLmNsaV9maWxlLndyaXRlKE1TRykKKyAgICAgICAgc2VsZi5jbGlfZmlsZS5mbHVzaCgpCisKKyAgICBkZWYgdGVzdFJlYWRsaW5lQWZ0ZXJSZWFkKHNlbGYpOgorICAgICAgICBhX2JhbG9vX2lzID0gc2VsZi5zZXJ2X2ZpbGUucmVhZChsZW4oIkEgYmFsb28gaXMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiQSBiYWxvbyBpcyIsIGFfYmFsb29faXMpCisgICAgICAgIF9hX2JlYXIgPSBzZWxmLnNlcnZfZmlsZS5yZWFkKGxlbigiIGEgYmVhciIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIgYSBiZWFyIiwgX2FfYmVhcikKKyAgICAgICAgbGluZSA9IHNlbGYuc2Vydl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXG4iLCBsaW5lKQorICAgICAgICBsaW5lID0gc2VsZi5zZXJ2X2ZpbGUucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJBIEJBTE9PIElTIEEgQkVBUi5cbiIsIGxpbmUpCisgICAgICAgIGxpbmUgPSBzZWxmLnNlcnZfZmlsZS5yZWFkbGluZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTVNHLCBsaW5lKQorCisgICAgZGVmIF90ZXN0UmVhZGxpbmVBZnRlclJlYWQoc2VsZik6CisgICAgICAgIHNlbGYuY2xpX2ZpbGUud3JpdGUoIkEgYmFsb28gaXMgYSBiZWFyXG4iKQorICAgICAgICBzZWxmLmNsaV9maWxlLndyaXRlKCJBIEJBTE9PIElTIEEgQkVBUi5cbiIpCisgICAgICAgIHNlbGYuY2xpX2ZpbGUud3JpdGUoTVNHKQorICAgICAgICBzZWxmLmNsaV9maWxlLmZsdXNoKCkKKworICAgIGRlZiB0ZXN0UmVhZGxpbmVBZnRlclJlYWROb05ld2xpbmUoc2VsZik6CisgICAgICAgIGVuZF9vZl8gPSBzZWxmLnNlcnZfZmlsZS5yZWFkKGxlbigiRW5kIE9mICIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJFbmQgT2YgIiwgZW5kX29mXykKKyAgICAgICAgbGluZSA9IHNlbGYuc2Vydl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiTGluZSIsIGxpbmUpCisKKyAgICBkZWYgX3Rlc3RSZWFkbGluZUFmdGVyUmVhZE5vTmV3bGluZShzZWxmKToKKyAgICAgICAgc2VsZi5jbGlfZmlsZS53cml0ZSgiRW5kIE9mIExpbmUiKQorCisgICAgZGVmIHRlc3RDbG9zZWRBdHRyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuc2Vydl9maWxlLmNsb3NlZCkKKworICAgIGRlZiBfdGVzdENsb3NlZEF0dHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc2VsZi5jbGlfZmlsZS5jbG9zZWQpCisKKworY2xhc3MgRmlsZU9iamVjdEludGVycnVwdGVkVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCB0aGUgZmlsZSBvYmplY3QgY29ycmVjdGx5IGhhbmRsZXMgRUlOVFIgaW50ZXJuYWxseS4iIiIKKworICAgIGNsYXNzIE1vY2tTb2NrZXQob2JqZWN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlY3ZfZnVuY3M9KCkpOgorICAgICAgICAgICAgIyBBIGdlbmVyYXRvciB0aGF0IHJldHVybnMgY2FsbGFibGVzIHRoYXQgd2UnbGwgY2FsbCBmb3IgZWFjaAorICAgICAgICAgICAgIyBjYWxsIHRvIHJlY3YoKS4KKyAgICAgICAgICAgIHNlbGYuX3JlY3Zfc3RlcCA9IGl0ZXIocmVjdl9mdW5jcykKKworICAgICAgICBkZWYgcmVjdihzZWxmLCBzaXplKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWN2X3N0ZXAubmV4dCgpKCkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX3JhaXNlX2VpbnRyKCk6CisgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvcihlcnJuby5FSU5UUikKKworICAgIGRlZiBfdGVzdF9yZWFkbGluZShzZWxmLCBzaXplPS0xLCAqKmt3YXJncyk6CisgICAgICAgIG1vY2tfc29jayA9IHNlbGYuTW9ja1NvY2tldChyZWN2X2Z1bmNzPVsKKyAgICAgICAgICAgICAgICBsYW1iZGEgOiAiVGhpcyBpcyB0aGUgZmlyc3QgbGluZVxuQW5kIHRoZSBzZWMiLAorICAgICAgICAgICAgICAgIHNlbGYuX3JhaXNlX2VpbnRyLAorICAgICAgICAgICAgICAgIGxhbWJkYSA6ICJvbmQgbGluZSBpcyBoZXJlXG4iLAorICAgICAgICAgICAgICAgIGxhbWJkYSA6ICIiLAorICAgICAgICAgICAgXSkKKyAgICAgICAgZm8gPSBzb2NrZXQuX2ZpbGVvYmplY3QobW9ja19zb2NrLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby5yZWFkbGluZShzaXplKSwgIlRoaXMgaXMgdGhlIGZpcnN0IGxpbmVcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm8ucmVhZGxpbmUoc2l6ZSksICJBbmQgdGhlIHNlY29uZCBsaW5lIGlzIGhlcmVcbiIpCisKKyAgICBkZWYgX3Rlc3RfcmVhZChzZWxmLCBzaXplPS0xLCAqKmt3YXJncyk6CisgICAgICAgIG1vY2tfc29jayA9IHNlbGYuTW9ja1NvY2tldChyZWN2X2Z1bmNzPVsKKyAgICAgICAgICAgICAgICBsYW1iZGEgOiAiVGhpcyBpcyB0aGUgZmlyc3QgbGluZVxuQW5kIHRoZSBzZWMiLAorICAgICAgICAgICAgICAgIHNlbGYuX3JhaXNlX2VpbnRyLAorICAgICAgICAgICAgICAgIGxhbWJkYSA6ICJvbmQgbGluZSBpcyBoZXJlXG4iLAorICAgICAgICAgICAgICAgIGxhbWJkYSA6ICIiLAorICAgICAgICAgICAgXSkKKyAgICAgICAgZm8gPSBzb2NrZXQuX2ZpbGVvYmplY3QobW9ja19zb2NrLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby5yZWFkKHNpemUpLCAiVGhpcyBpcyB0aGUgZmlyc3QgbGluZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiQW5kIHRoZSBzZWNvbmQgbGluZSBpcyBoZXJlXG4iKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkbGluZSgpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGxpbmUoc2l6ZT0xMDApCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZCgpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZChzaXplPTEwMCkKKworICAgIGRlZiB0ZXN0X3dpdGhfMWtfYnVmZmVyKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRsaW5lKGJ1ZnNpemU9MTAyNCkKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkbGluZShzaXplPTEwMCwgYnVmc2l6ZT0xMDI0KQorICAgICAgICBzZWxmLl90ZXN0X3JlYWQoYnVmc2l6ZT0xMDI0KQorICAgICAgICBzZWxmLl90ZXN0X3JlYWQoc2l6ZT0xMDAsIGJ1ZnNpemU9MTAyNCkKKworICAgIGRlZiBfdGVzdF9yZWFkbGluZV9ub19idWZmZXIoc2VsZiwgc2l6ZT0tMSk6CisgICAgICAgIG1vY2tfc29jayA9IHNlbGYuTW9ja1NvY2tldChyZWN2X2Z1bmNzPVsKKyAgICAgICAgICAgICAgICBsYW1iZGEgOiAiYWEiLAorICAgICAgICAgICAgICAgIGxhbWJkYSA6ICJcbiIsCisgICAgICAgICAgICAgICAgbGFtYmRhIDogIkJCIiwKKyAgICAgICAgICAgICAgICBzZWxmLl9yYWlzZV9laW50ciwKKyAgICAgICAgICAgICAgICBsYW1iZGEgOiAiYmIiLAorICAgICAgICAgICAgICAgIGxhbWJkYSA6ICIiLAorICAgICAgICAgICAgXSkKKyAgICAgICAgZm8gPSBzb2NrZXQuX2ZpbGVvYmplY3QobW9ja19zb2NrLCBidWZzaXplPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm8ucmVhZGxpbmUoc2l6ZSksICJhYVxuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby5yZWFkbGluZShzaXplKSwgIkJCYmIiKQorCisgICAgZGVmIHRlc3Rfbm9fYnVmZmVyKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRsaW5lX25vX2J1ZmZlcigpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGxpbmVfbm9fYnVmZmVyKHNpemU9NCkKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkKGJ1ZnNpemU9MCkKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkKHNpemU9MTAwLCBidWZzaXplPTApCisKKworY2xhc3MgVW5idWZmZXJlZEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlKEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlKToKKworICAgICIiIlJlcGVhdCB0aGUgdGVzdHMgZnJvbSBGaWxlT2JqZWN0Q2xhc3NUZXN0Q2FzZSB3aXRoIGJ1ZnNpemU9PTAuCisKKyAgICBJbiB0aGlzIGNhc2UgKGFuZCBpbiB0aGlzIGNhc2Ugb25seSksIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0bworICAgIGNyZWF0ZSBhIGZpbGUgb2JqZWN0LCByZWFkIGEgbGluZSBmcm9tIGl0LCBjcmVhdGUgYW5vdGhlciBmaWxlCisgICAgb2JqZWN0LCByZWFkIGFub3RoZXIgbGluZSBmcm9tIGl0LCB3aXRob3V0IGxvc3Mgb2YgZGF0YSBpbiB0aGUKKyAgICBmaXJzdCBmaWxlIG9iamVjdCdzIGJ1ZmZlci4gIE5vdGUgdGhhdCBodHRwbGliIHJlbGllcyBvbiB0aGlzCisgICAgd2hlbiByZWFkaW5nIG11bHRpcGxlIHJlcXVlc3RzIGZyb20gdGhlIHNhbWUgc29ja2V0LiIiIgorCisgICAgYnVmc2l6ZSA9IDAgIyBVc2UgdW5idWZmZXJlZCBtb2RlCisKKyAgICBkZWYgdGVzdFVuYnVmZmVyZWRSZWFkbGluZShzZWxmKToKKyAgICAgICAgIyBSZWFkIGEgbGluZSwgY3JlYXRlIGEgbmV3IGZpbGUgb2JqZWN0LCByZWFkIGFub3RoZXIgbGluZSB3aXRoIGl0CisgICAgICAgIGxpbmUgPSBzZWxmLnNlcnZfZmlsZS5yZWFkbGluZSgpICMgZmlyc3QgbGluZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsICJBLiAiICsgTVNHKSAjIGZpcnN0IGxpbmUKKyAgICAgICAgc2VsZi5zZXJ2X2ZpbGUgPSBzZWxmLmNsaV9jb25uLm1ha2VmaWxlKCdyYicsIDApCisgICAgICAgIGxpbmUgPSBzZWxmLnNlcnZfZmlsZS5yZWFkbGluZSgpICMgc2Vjb25kIGxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCAiQi4gIiArIE1TRykgIyBzZWNvbmQgbGluZQorCisgICAgZGVmIF90ZXN0VW5idWZmZXJlZFJlYWRsaW5lKHNlbGYpOgorICAgICAgICBzZWxmLmNsaV9maWxlLndyaXRlKCJBLiAiICsgTVNHKQorICAgICAgICBzZWxmLmNsaV9maWxlLndyaXRlKCJCLiAiICsgTVNHKQorICAgICAgICBzZWxmLmNsaV9maWxlLmZsdXNoKCkKKworY2xhc3MgTGluZUJ1ZmZlcmVkRmlsZU9iamVjdENsYXNzVGVzdENhc2UoRmlsZU9iamVjdENsYXNzVGVzdENhc2UpOgorCisgICAgYnVmc2l6ZSA9IDEgIyBEZWZhdWx0LWJ1ZmZlcmVkIGZvciByZWFkaW5nOyBsaW5lLWJ1ZmZlcmVkIGZvciB3cml0aW5nCisKKyAgICBjbGFzcyBTb2NrZXRNZW1vKG9iamVjdCk6CisgICAgICAgICIiIkEgd3JhcHBlciB0byBrZWVwIHRyYWNrIG9mIHNlbnQgZGF0YSwgbmVlZGVkIHRvIGV4YW1pbmUgd3JpdGUgYmVoYXZpb3VyIiIiCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NrKToKKyAgICAgICAgICAgIHNlbGYuX3NvY2sgPSBzb2NrCisgICAgICAgICAgICBzZWxmLnNlbnQgPSBbXQorCisgICAgICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEsIGZsYWdzPTApOgorICAgICAgICAgICAgbiA9IHNlbGYuX3NvY2suc2VuZChkYXRhLCBmbGFncykKKyAgICAgICAgICAgIHNlbGYuc2VudC5hcHBlbmQoZGF0YVs6bl0pCisgICAgICAgICAgICByZXR1cm4gbgorCisgICAgICAgIGRlZiBzZW5kYWxsKHNlbGYsIGRhdGEsIGZsYWdzPTApOgorICAgICAgICAgICAgc2VsZi5fc29jay5zZW5kYWxsKGRhdGEsIGZsYWdzKQorICAgICAgICAgICAgc2VsZi5zZW50LmFwcGVuZChkYXRhKQorCisgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX3NvY2ssIGF0dHIpCisKKyAgICAgICAgZGVmIGdldHNlbnQoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gW2UudG9ieXRlcygpIGlmIGlzaW5zdGFuY2UoZSwgbWVtb3J5dmlldykgZWxzZSBlIGZvciBlIGluIHNlbGYuc2VudF0KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgRmlsZU9iamVjdENsYXNzVGVzdENhc2Uuc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5zZXJ2X2ZpbGUuX3NvY2sgPSBzZWxmLlNvY2tldE1lbW8oc2VsZi5zZXJ2X2ZpbGUuX3NvY2spCisKKyAgICBkZWYgdGVzdExpbmVidWZmZXJlZFdyaXRlKHNlbGYpOgorICAgICAgICAjIFdyaXRlIHR3byBsaW5lcywgaW4gc21hbGwgY2h1bmtzCisgICAgICAgIG1zZyA9IE1TRy5zdHJpcCgpCisgICAgICAgIHByaW50ID4+IHNlbGYuc2Vydl9maWxlLCBtc2csCisgICAgICAgIHByaW50ID4+IHNlbGYuc2Vydl9maWxlLCBtc2cKKworICAgICAgICAjIHNlY29uZCBsaW5lOgorICAgICAgICBwcmludCA+PiBzZWxmLnNlcnZfZmlsZSwgbXNnLAorICAgICAgICBwcmludCA+PiBzZWxmLnNlcnZfZmlsZSwgbXNnLAorICAgICAgICBwcmludCA+PiBzZWxmLnNlcnZfZmlsZSwgbXNnCisKKyAgICAgICAgIyB0aGlyZCBsaW5lCisgICAgICAgIHByaW50ID4+IHNlbGYuc2Vydl9maWxlLCAnJworCisgICAgICAgIHNlbGYuc2Vydl9maWxlLmZsdXNoKCkKKworICAgICAgICBtc2cxID0gIiVzICVzXG4iJShtc2csIG1zZykKKyAgICAgICAgbXNnMiA9ICAiJXMgJXMgJXNcbiIlKG1zZywgbXNnLCBtc2cpCisgICAgICAgIG1zZzMgPSAgIlxuIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2Vydl9maWxlLl9zb2NrLmdldHNlbnQoKSwgW21zZzEsIG1zZzIsIG1zZzNdKQorCisgICAgZGVmIF90ZXN0TGluZWJ1ZmZlcmVkV3JpdGUoc2VsZik6CisgICAgICAgIG1zZyA9IE1TRy5zdHJpcCgpCisgICAgICAgIG1zZzEgPSAiJXMgJXNcbiIlKG1zZywgbXNnKQorICAgICAgICBtc2cyID0gICIlcyAlcyAlc1xuIiUobXNnLCBtc2csIG1zZykKKyAgICAgICAgbXNnMyA9ICAiXG4iCisgICAgICAgIGwxID0gc2VsZi5jbGlfZmlsZS5yZWFkbGluZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEsIG1zZzEpCisgICAgICAgIGwyID0gc2VsZi5jbGlfZmlsZS5yZWFkbGluZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDIsIG1zZzIpCisgICAgICAgIGwzID0gc2VsZi5jbGlfZmlsZS5yZWFkbGluZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDMsIG1zZzMpCisKKworY2xhc3MgU21hbGxCdWZmZXJlZEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlKEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlKToKKworICAgIGJ1ZnNpemUgPSAyICMgRXhlcmNpc2UgdGhlIGJ1ZmZlcmluZyBjb2RlCisKKworY2xhc3MgTmV0d29ya0Nvbm5lY3Rpb25UZXN0KG9iamVjdCk6CisgICAgIiIiUHJvdmUgbmV0d29yayBjb25uZWN0aW9uLiIiIgorICAgIGRlZiBjbGllbnRTZXRVcChzZWxmKToKKyAgICAgICAgIyBXZSdyZSBpbmhlcml0ZWQgYmVsb3cgYnkgQmFzaWNUQ1BUZXN0Miwgd2hpY2ggYWxzbyBpbmhlcml0cworICAgICAgICAjIEJhc2ljVENQVGVzdCwgd2hpY2ggZGVmaW5lcyBzZWxmLnBvcnQgcmVmZXJlbmNlZCBiZWxvdy4KKyAgICAgICAgc2VsZi5jbGkgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIHNlbGYucG9ydCkpCisgICAgICAgIHNlbGYuc2Vydl9jb25uID0gc2VsZi5jbGkKKworY2xhc3MgQmFzaWNUQ1BUZXN0MihOZXR3b3JrQ29ubmVjdGlvblRlc3QsIEJhc2ljVENQVGVzdCk6CisgICAgIiIiVGVzdHMgdGhhdCBOZXR3b3JrQ29ubmVjdGlvbiBkb2VzIG5vdCBicmVhayBleGlzdGluZyBUQ1AgZnVuY3Rpb25hbGl0eS4KKyAgICAiIiIKKworY2xhc3MgTmV0d29ya0Nvbm5lY3Rpb25Ob1NlcnZlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgY2xhc3MgTW9ja1NvY2tldChzb2NrZXQuc29ja2V0KToKKyAgICAgICAgZGVmIGNvbm5lY3Qoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgcmFpc2Ugc29ja2V0LnRpbWVvdXQoJ3RpbWVkIG91dCcpCisKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBtb2NrZWRfc29ja2V0X21vZHVsZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc29ja2V0IHdoaWNoIHRpbWVzIG91dCBvbiBjb25uZWN0IiIiCisgICAgICAgIG9sZF9zb2NrZXQgPSBzb2NrZXQuc29ja2V0CisgICAgICAgIHNvY2tldC5zb2NrZXQgPSBzZWxmLk1vY2tTb2NrZXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvY2tldC5zb2NrZXQgPSBvbGRfc29ja2V0CisKKyAgICBkZWYgdGVzdF9jb25uZWN0KHNlbGYpOgorICAgICAgICBwb3J0ID0gdGVzdF9zdXBwb3J0LmZpbmRfdW51c2VkX3BvcnQoKQorICAgICAgICBjbGkgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChjbGkuY2xvc2UpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIGNsaS5jb25uZWN0KChIT1NULCBwb3J0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbS5leGNlcHRpb24uZXJybm8sIGVycm5vLkVDT05OUkVGVVNFRCkKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV9jb25uZWN0aW9uKHNlbGYpOgorICAgICAgICAjIElzc3VlICM5NzkyOiBlcnJvcnMgcmFpc2VkIGJ5IGNyZWF0ZV9jb25uZWN0aW9uKCkgc2hvdWxkIGhhdmUKKyAgICAgICAgIyBhIHByb3BlciBlcnJubyBhdHRyaWJ1dGUuCisgICAgICAgIHBvcnQgPSB0ZXN0X3N1cHBvcnQuZmluZF91bnVzZWRfcG9ydCgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgcG9ydCkpCisKKyAgICAgICAgIyBJc3N1ZSAjMTYyNTc6IGNyZWF0ZV9jb25uZWN0aW9uKCkgY2FsbHMgZ2V0YWRkcmluZm8oKSBhZ2FpbnN0CisgICAgICAgICMgJ2xvY2FsaG9zdCcuICBUaGlzIG1heSByZXN1bHQgaW4gYW4gSVBWNiBhZGRyIGJlaW5nIHJldHVybmVkCisgICAgICAgICMgYXMgd2VsbCBhcyBhbiBJUFY0IG9uZToKKyAgICAgICAgIyAgID4+PiBzb2NrZXQuZ2V0YWRkcmluZm8oJ2xvY2FsaG9zdCcsIHBvcnQsIDAsIFNPQ0tfU1RSRUFNKQorICAgICAgICAjICAgPj4+IFsoMiwgIDIsIDAsICcnLCAoJzEyNy4wLjAuMScsIDQxMjMwKSksCisgICAgICAgICMgICAgICAgICgyNiwgMiwgMCwgJycsICgnOjoxJywgNDEyMzAsIDAsIDApKV0KKyAgICAgICAgIworICAgICAgICAjIGNyZWF0ZV9jb25uZWN0aW9uKCkgZW51bWVyYXRlcyB0aHJvdWdoIGFsbCB0aGUgYWRkcmVzc2VzIHJldHVybmVkCisgICAgICAgICMgYW5kIGlmIGl0IGRvZXNuJ3Qgc3VjY2Vzc2Z1bGx5IGJpbmQgdG8gYW55IG9mIHRoZW0sIGl0IHByb3BhZ2F0ZXMKKyAgICAgICAgIyB0aGUgbGFzdCBleGNlcHRpb24gaXQgZW5jb3VudGVyZWQuCisgICAgICAgICMKKyAgICAgICAgIyBPbiBTb2xhcmlzLCBFTkVUVU5SRUFDSCBpcyByZXR1cm5lZCBpbiB0aGlzIGNpcmN1bXN0YW5jZSBpbnN0ZWFkCisgICAgICAgICMgb2YgRUNPTk5SRUZVU0VELiAgU28sIGlmIHRoYXQgZXJybm8gZXhpc3RzLCBhZGQgaXQgdG8gb3VyIGxpc3Qgb2YKKyAgICAgICAgIyBleHBlY3RlZCBlcnJub3MuCisgICAgICAgIGV4cGVjdGVkX2Vycm5vcyA9IFsgZXJybm8uRUNPTk5SRUZVU0VELCBdCisgICAgICAgIGlmIGhhc2F0dHIoZXJybm8sICdFTkVUVU5SRUFDSCcpOgorICAgICAgICAgICAgZXhwZWN0ZWRfZXJybm9zLmFwcGVuZChlcnJuby5FTkVUVU5SRUFDSCkKKworICAgICAgICBzZWxmLmFzc2VydEluKGNtLmV4Y2VwdGlvbi5lcnJubywgZXhwZWN0ZWRfZXJybm9zKQorCisgICAgZGVmIHRlc3RfY3JlYXRlX2Nvbm5lY3Rpb25fdGltZW91dChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjOTc5MjogY3JlYXRlX2Nvbm5lY3Rpb24oKSBzaG91bGQgbm90IHJlY2FzdCB0aW1lb3V0IGVycm9ycworICAgICAgICAjIGFzIGdlbmVyaWMgc29ja2V0IGVycm9ycy4KKyAgICAgICAgd2l0aCBzZWxmLm1vY2tlZF9zb2NrZXRfbW9kdWxlKCk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC50aW1lb3V0KToKKyAgICAgICAgICAgICAgICBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIDEyMzQpKQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZCwgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCitjbGFzcyBOZXR3b3JrQ29ubmVjdGlvbkF0dHJpYnV0ZXNUZXN0KFNvY2tldFRDUFRlc3QsIFRocmVhZGFibGVUZXN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPSdydW5UZXN0Jyk6CisgICAgICAgIFNvY2tldFRDUFRlc3QuX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT1tZXRob2ROYW1lKQorICAgICAgICBUaHJlYWRhYmxlVGVzdC5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIGNsaWVudFNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNvdXJjZV9wb3J0ID0gdGVzdF9zdXBwb3J0LmZpbmRfdW51c2VkX3BvcnQoKQorCisgICAgZGVmIGNsaWVudFRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNsaS5jbG9zZSgpCisgICAgICAgIHNlbGYuY2xpID0gTm9uZQorICAgICAgICBUaHJlYWRhYmxlVGVzdC5jbGllbnRUZWFyRG93bihzZWxmKQorCisgICAgZGVmIF9qdXN0QWNjZXB0KHNlbGYpOgorICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgdGVzdEZhbWlseSA9IF9qdXN0QWNjZXB0CisgICAgZGVmIF90ZXN0RmFtaWx5KHNlbGYpOgorICAgICAgICBzZWxmLmNsaSA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgc2VsZi5wb3J0KSwgdGltZW91dD0zMCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlbGYuY2xpLmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpLmZhbWlseSwgMikKKworICAgIHRlc3RTb3VyY2VBZGRyZXNzID0gX2p1c3RBY2NlcHQKKyAgICBkZWYgX3Rlc3RTb3VyY2VBZGRyZXNzKHNlbGYpOgorICAgICAgICBzZWxmLmNsaSA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgc2VsZi5wb3J0KSwgdGltZW91dD0zMCwKKyAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzcz0oJycsIHNlbGYuc291cmNlX3BvcnQpKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VsZi5jbGkuY2xvc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGkuZ2V0c29ja25hbWUoKVsxXSwgc2VsZi5zb3VyY2VfcG9ydCkKKyAgICAgICAgIyBUaGUgcG9ydCBudW1iZXIgYmVpbmcgdXNlZCBpcyBzdWZmaWNpZW50IHRvIHNob3cgdGhhdCB0aGUgYmluZCgpCisgICAgICAgICMgY2FsbCBoYXBwZW5lZC4KKworICAgIHRlc3RUaW1lb3V0RGVmYXVsdCA9IF9qdXN0QWNjZXB0CisgICAgZGVmIF90ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CisgICAgICAgICMgcGFzc2luZyBubyBleHBsaWNpdCB0aW1lb3V0IHVzZXMgc29ja2V0J3MgZ2xvYmFsIGRlZmF1bHQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCg0MikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jbGkgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIHNlbGYucG9ydCkpCisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VsZi5jbGkuY2xvc2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaS5nZXR0aW1lb3V0KCksIDQyKQorCisgICAgdGVzdFRpbWVvdXROb25lID0gX2p1c3RBY2NlcHQKKyAgICBkZWYgX3Rlc3RUaW1lb3V0Tm9uZShzZWxmKToKKyAgICAgICAgIyBOb25lIHRpbWVvdXQgbWVhbnMgdGhlIHNhbWUgYXMgc29jay5zZXR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChIT1NULCBzZWxmLnBvcnQpLCB0aW1lb3V0PU5vbmUpCisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VsZi5jbGkuY2xvc2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaS5nZXR0aW1lb3V0KCksIE5vbmUpCisKKyAgICB0ZXN0VGltZW91dFZhbHVlTmFtZWQgPSBfanVzdEFjY2VwdAorICAgIGRlZiBfdGVzdFRpbWVvdXRWYWx1ZU5hbWVkKHNlbGYpOgorICAgICAgICBzZWxmLmNsaSA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgc2VsZi5wb3J0KSwgdGltZW91dD0zMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaS5nZXR0aW1lb3V0KCksIDMwKQorCisgICAgdGVzdFRpbWVvdXRWYWx1ZU5vbmFtZWQgPSBfanVzdEFjY2VwdAorICAgIGRlZiBfdGVzdFRpbWVvdXRWYWx1ZU5vbmFtZWQoc2VsZik6CisgICAgICAgIHNlbGYuY2xpID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChIT1NULCBzZWxmLnBvcnQpLCAzMCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlbGYuY2xpLmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpLmdldHRpbWVvdXQoKSwgMzApCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZCwgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCitjbGFzcyBOZXR3b3JrQ29ubmVjdGlvbkJlaGF2aW91clRlc3QoU29ja2V0VENQVGVzdCwgVGhyZWFkYWJsZVRlc3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9J3J1blRlc3QnKToKKyAgICAgICAgU29ja2V0VENQVGVzdC5fX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPW1ldGhvZE5hbWUpCisgICAgICAgIFRocmVhZGFibGVUZXN0Ll9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgY2xpZW50U2V0VXAoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBjbGllbnRUZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jbGkuY2xvc2UoKQorICAgICAgICBzZWxmLmNsaSA9IE5vbmUKKyAgICAgICAgVGhyZWFkYWJsZVRlc3QuY2xpZW50VGVhckRvd24oc2VsZikKKworICAgIGRlZiB0ZXN0SW5zaWRlVGltZW91dChzZWxmKToKKyAgICAgICAgY29ubiwgYWRkciA9IHNlbGYuc2Vydi5hY2NlcHQoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoY29ubi5jbG9zZSkKKyAgICAgICAgdGltZS5zbGVlcCgzKQorICAgICAgICBjb25uLnNlbmQoImRvbmUhIikKKyAgICB0ZXN0T3V0c2lkZVRpbWVvdXQgPSB0ZXN0SW5zaWRlVGltZW91dAorCisgICAgZGVmIF90ZXN0SW5zaWRlVGltZW91dChzZWxmKToKKyAgICAgICAgc2VsZi5jbGkgPSBzb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChIT1NULCBzZWxmLnBvcnQpKQorICAgICAgICBkYXRhID0gc29jay5yZWN2KDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgImRvbmUhIikKKworICAgIGRlZiBfdGVzdE91dHNpZGVUaW1lb3V0KHNlbGYpOgorICAgICAgICBzZWxmLmNsaSA9IHNvY2sgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIHNlbGYucG9ydCksIHRpbWVvdXQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LnRpbWVvdXQsIGxhbWJkYTogc29jay5yZWN2KDUpKQorCisKK2NsYXNzIFVybGxpYjJGaWxlb2JqZWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIHVybGxpYjIuSFRUUEhhbmRsZXIgaGFzICJib3Jyb3dlZCIgc29ja2V0Ll9maWxlb2JqZWN0LCBhbmQgcmVxdWlyZXMgdGhhdAorICAgICMgaXQgY2xvc2UgdGhlIHNvY2tldCBpZiB0aGUgY2xvc2UgYyd0b3IgYXJndW1lbnQgaXMgdHJ1ZQorCisgICAgZGVmIHRlc3RDbG9zZShzZWxmKToKKyAgICAgICAgY2xhc3MgTW9ja1NvY2tldDoKKyAgICAgICAgICAgIGNsb3NlZCA9IEZhbHNlCisgICAgICAgICAgICBkZWYgZmx1c2goc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBjbG9zZShzZWxmKTogc2VsZi5jbG9zZWQgPSBUcnVlCisKKyAgICAgICAgIyBtdXN0IG5vdCBjbG9zZSB1bmxlc3Mgd2UgcmVxdWVzdCBpdDogdGhlIG9yaWdpbmFsIHVzZSBvZiBfZmlsZW9iamVjdAorICAgICAgICAjIGJ5IG1vZHVsZSBzb2NrZXQgcmVxdWlyZXMgdGhhdCB0aGUgdW5kZXJseWluZyBzb2NrZXQgbm90IGJlIGNsb3NlZCB1bnRpbAorICAgICAgICAjIHRoZSBfc29ja2V0b2JqZWN0IHRoYXQgY3JlYXRlZCB0aGUgX2ZpbGVvYmplY3QgaXMgY2xvc2VkCisgICAgICAgIHMgPSBNb2NrU29ja2V0KCkKKyAgICAgICAgZiA9IHNvY2tldC5fZmlsZW9iamVjdChzKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzLmNsb3NlZCkKKworICAgICAgICBzID0gTW9ja1NvY2tldCgpCisgICAgICAgIGYgPSBzb2NrZXQuX2ZpbGVvYmplY3QocywgY2xvc2U9VHJ1ZSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmNsb3NlZCkKKworY2xhc3MgVENQVGltZW91dFRlc3QoU29ja2V0VENQVGVzdCk6CisKKyAgICBkZWYgdGVzdFRDUFRpbWVvdXQoc2VsZik6CisgICAgICAgIGRlZiByYWlzZV90aW1lb3V0KCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICBzZWxmLnNlcnYuc2V0dGltZW91dCgxLjApCisgICAgICAgICAgICBzZWxmLnNlcnYuYWNjZXB0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LnRpbWVvdXQsIHJhaXNlX3RpbWVvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZ2VuZXJhdGluZyBhIHRpbWVvdXQgZXhjZXB0aW9uIChUQ1ApIikKKworICAgIGRlZiB0ZXN0VGltZW91dFplcm8oc2VsZik6CisgICAgICAgIG9rID0gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXJ2LnNldHRpbWVvdXQoMC4wKQorICAgICAgICAgICAgZm9vID0gc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiY2F1Z2h0IHRpbWVvdXQgaW5zdGVhZCBvZiBlcnJvciAoVENQKSIpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBvayA9IFRydWUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJjYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gKFRDUCkiKQorICAgICAgICBpZiBub3Qgb2s6CisgICAgICAgICAgICBzZWxmLmZhaWwoImFjY2VwdCgpIHJldHVybmVkIHN1Y2Nlc3Mgd2hlbiB3ZSBkaWQgbm90IGV4cGVjdCBpdCIpCisKKyAgICBkZWYgdGVzdEludGVycnVwdGVkVGltZW91dChzZWxmKToKKyAgICAgICAgIyBYWFggSSBkb24ndCBrbm93IGhvdyB0byBkbyB0aGlzIHRlc3Qgb24gTVNXaW5kb3dzIG9yIGFueSBvdGhlcgorICAgICAgICAjIHBsYWZvcm0gdGhhdCBkb2Vzbid0IHN1cHBvcnQgc2lnbmFsLmFsYXJtKCkgb3Igb3Mua2lsbCgpLCB0aG91Z2gKKyAgICAgICAgIyB0aGUgYnVnIHNob3VsZCBoYXZlIGV4aXN0ZWQgb24gYWxsIHBsYXRmb3Jtcy4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2lnbmFsLCAiYWxhcm0iKToKKyAgICAgICAgICAgIHJldHVybiAgICAgICAgICAgICAgICAgICMgY2FuIG9ubHkgdGVzdCBvbiAqbml4CisgICAgICAgIHNlbGYuc2Vydi5zZXR0aW1lb3V0KDUuMCkgICAjIG11c3QgYmUgbG9uZ2VyIHRoYW4gYWxhcm0KKyAgICAgICAgY2xhc3MgQWxhcm0oRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIGFsYXJtX2hhbmRsZXIoc2lnbmFsLCBmcmFtZSk6CisgICAgICAgICAgICByYWlzZSBBbGFybQorICAgICAgICBvbGRfYWxhcm0gPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBhbGFybV9oYW5kbGVyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzaWduYWwuYWxhcm0oMikgICAgIyBQT1NJWCBhbGxvd3MgYWxhcm0gdG8gYmUgdXAgdG8gMSBzZWNvbmQgZWFybHkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb28gPSBzZWxmLnNlcnYuYWNjZXB0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImNhdWdodCB0aW1lb3V0IGluc3RlYWQgb2YgQWxhcm0iKQorICAgICAgICAgICAgZXhjZXB0IEFsYXJtOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImNhdWdodCBvdGhlciBleGNlcHRpb24gaW5zdGVhZCBvZiBBbGFybToiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgJXMoJXMpOlxuJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5cy5leGNfaW5mbygpWzoyXSArICh0cmFjZWJhY2suZm9ybWF0X2V4YygpLCkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm5vdGhpbmcgY2F1Z2h0IikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDApICAgICAgICAgIyBzaHV0IG9mZiBhbGFybQorICAgICAgICBleGNlcHQgQWxhcm06CisgICAgICAgICAgICBzZWxmLmZhaWwoImdvdCBBbGFybSBpbiB3cm9uZyBwbGFjZSIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAjIG5vIGFsYXJtIGNhbiBiZSBwZW5kaW5nLiAgU2FmZSB0byByZXN0b3JlIG9sZCBoYW5kbGVyLgorICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgb2xkX2FsYXJtKQorCitjbGFzcyBVRFBUaW1lb3V0VGVzdChTb2NrZXRVRFBUZXN0KToKKworICAgIGRlZiB0ZXN0VURQVGltZW91dChzZWxmKToKKyAgICAgICAgZGVmIHJhaXNlX3RpbWVvdXQoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHNlbGYuc2Vydi5zZXR0aW1lb3V0KDEuMCkKKyAgICAgICAgICAgIHNlbGYuc2Vydi5yZWN2KDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC50aW1lb3V0LCByYWlzZV90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGdlbmVyYXRpbmcgYSB0aW1lb3V0IGV4Y2VwdGlvbiAoVURQKSIpCisKKyAgICBkZWYgdGVzdFRpbWVvdXRaZXJvKHNlbGYpOgorICAgICAgICBvayA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2Vydi5zZXR0aW1lb3V0KDAuMCkKKyAgICAgICAgICAgIGZvbyA9IHNlbGYuc2Vydi5yZWN2KDEwMjQpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiY2F1Z2h0IHRpbWVvdXQgaW5zdGVhZCBvZiBlcnJvciAoVURQKSIpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBvayA9IFRydWUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJjYXVnaHQgdW5leHBlY3RlZCBleGNlcHRpb24gKFVEUCkiKQorICAgICAgICBpZiBub3Qgb2s6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJlY3YoKSByZXR1cm5lZCBzdWNjZXNzIHdoZW4gd2UgZGlkIG5vdCBleHBlY3QgaXQiKQorCitjbGFzcyBUZXN0RXhjZXB0aW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdEV4Y2VwdGlvblRyZWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNvY2tldC5lcnJvciwgRXhjZXB0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc29ja2V0LmhlcnJvciwgc29ja2V0LmVycm9yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc29ja2V0LmdhaWVycm9yLCBzb2NrZXQuZXJyb3IpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzb2NrZXQudGltZW91dCwgc29ja2V0LmVycm9yKSkKKworY2xhc3MgVGVzdExpbnV4QWJzdHJhY3ROYW1lc3BhY2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgVU5JWF9QQVRIX01BWCA9IDEwOAorCisgICAgZGVmIHRlc3RMaW51eEFic3RyYWN0TmFtZXNwYWNlKHNlbGYpOgorICAgICAgICBhZGRyZXNzID0gIlx4MDBweXRob24tdGVzdC1oZWxsb1x4MDBceGZmIgorICAgICAgICBzMSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgczEuYmluZChhZGRyZXNzKQorICAgICAgICBzMS5saXN0ZW4oMSkKKyAgICAgICAgczIgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHMyLmNvbm5lY3QoczEuZ2V0c29ja25hbWUoKSkKKyAgICAgICAgczEuYWNjZXB0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMS5nZXRzb2NrbmFtZSgpLCBhZGRyZXNzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMyLmdldHBlZXJuYW1lKCksIGFkZHJlc3MpCisKKyAgICBkZWYgdGVzdE1heE5hbWUoc2VsZik6CisgICAgICAgIGFkZHJlc3MgPSAiXHgwMCIgKyAiaCIgKiAoc2VsZi5VTklYX1BBVEhfTUFYIC0gMSkKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgcy5iaW5kKGFkZHJlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXRzb2NrbmFtZSgpLCBhZGRyZXNzKQorCisgICAgZGVmIHRlc3ROYW1lT3ZlcmZsb3coc2VsZik6CisgICAgICAgIGFkZHJlc3MgPSAiXHgwMCIgKyAiaCIgKiBzZWxmLlVOSVhfUEFUSF9NQVgKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzLmJpbmQsIGFkZHJlc3MpCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIEJ1ZmZlcklPVGVzdChTb2NrZXRDb25uZWN0ZWRUZXN0KToKKyAgICAiIiIKKyAgICBUZXN0IHRoZSBidWZmZXIgdmVyc2lvbnMgb2Ygc29ja2V0LnJlY3YoKSBhbmQgc29ja2V0LnNlbmQoKS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT0ncnVuVGVzdCcpOgorICAgICAgICBTb2NrZXRDb25uZWN0ZWRUZXN0Ll9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9bWV0aG9kTmFtZSkKKworICAgIGRlZiB0ZXN0UmVjdkludG9BcnJheShzZWxmKToKKyAgICAgICAgYnVmID0gYXJyYXkuYXJyYXkoJ2MnLCAnICcqMTAyNCkKKyAgICAgICAgbmJ5dGVzID0gc2VsZi5jbGlfY29ubi5yZWN2X2ludG8oYnVmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ieXRlcywgbGVuKE1TRykpCisgICAgICAgIG1zZyA9IGJ1Zi50b3N0cmluZygpWzpsZW4oTVNHKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworICAgIGRlZiBfdGVzdFJlY3ZJbnRvQXJyYXkoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIGJ1ZiA9IGJ1ZmZlcihNU0cpCisgICAgICAgIHNlbGYuc2Vydl9jb25uLnNlbmQoYnVmKQorCisgICAgZGVmIHRlc3RSZWN2SW50b0J5dGVhcnJheShzZWxmKToKKyAgICAgICAgYnVmID0gYnl0ZWFycmF5KDEwMjQpCisgICAgICAgIG5ieXRlcyA9IHNlbGYuY2xpX2Nvbm4ucmVjdl9pbnRvKGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYnl0ZXMsIGxlbihNU0cpKQorICAgICAgICBtc2cgPSBidWZbOmxlbihNU0cpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCisgICAgX3Rlc3RSZWN2SW50b0J5dGVhcnJheSA9IF90ZXN0UmVjdkludG9BcnJheQorCisgICAgZGVmIHRlc3RSZWN2SW50b01lbW9yeXZpZXcoc2VsZik6CisgICAgICAgIGJ1ZiA9IGJ5dGVhcnJheSgxMDI0KQorICAgICAgICBuYnl0ZXMgPSBzZWxmLmNsaV9jb25uLnJlY3ZfaW50byhtZW1vcnl2aWV3KGJ1ZikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmJ5dGVzLCBsZW4oTVNHKSkKKyAgICAgICAgbXNnID0gYnVmWzpsZW4oTVNHKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworICAgIF90ZXN0UmVjdkludG9NZW1vcnl2aWV3ID0gX3Rlc3RSZWN2SW50b0FycmF5CisKKyAgICBkZWYgdGVzdFJlY3ZGcm9tSW50b0FycmF5KHNlbGYpOgorICAgICAgICBidWYgPSBhcnJheS5hcnJheSgnYycsICcgJyoxMDI0KQorICAgICAgICBuYnl0ZXMsIGFkZHIgPSBzZWxmLmNsaV9jb25uLnJlY3Zmcm9tX2ludG8oYnVmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ieXRlcywgbGVuKE1TRykpCisgICAgICAgIG1zZyA9IGJ1Zi50b3N0cmluZygpWzpsZW4oTVNHKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworICAgIGRlZiBfdGVzdFJlY3ZGcm9tSW50b0FycmF5KHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBidWYgPSBidWZmZXIoTVNHKQorICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKGJ1ZikKKworICAgIGRlZiB0ZXN0UmVjdkZyb21JbnRvQnl0ZWFycmF5KHNlbGYpOgorICAgICAgICBidWYgPSBieXRlYXJyYXkoMTAyNCkKKyAgICAgICAgbmJ5dGVzLCBhZGRyID0gc2VsZi5jbGlfY29ubi5yZWN2ZnJvbV9pbnRvKGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYnl0ZXMsIGxlbihNU0cpKQorICAgICAgICBtc2cgPSBidWZbOmxlbihNU0cpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCisgICAgX3Rlc3RSZWN2RnJvbUludG9CeXRlYXJyYXkgPSBfdGVzdFJlY3ZGcm9tSW50b0FycmF5CisKKyAgICBkZWYgdGVzdFJlY3ZGcm9tSW50b01lbW9yeXZpZXcoc2VsZik6CisgICAgICAgIGJ1ZiA9IGJ5dGVhcnJheSgxMDI0KQorICAgICAgICBuYnl0ZXMsIGFkZHIgPSBzZWxmLmNsaV9jb25uLnJlY3Zmcm9tX2ludG8obWVtb3J5dmlldyhidWYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ieXRlcywgbGVuKE1TRykpCisgICAgICAgIG1zZyA9IGJ1Zls6bGVuKE1TRyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBfdGVzdFJlY3ZGcm9tSW50b01lbW9yeXZpZXcgPSBfdGVzdFJlY3ZGcm9tSW50b0FycmF5CisKKworVElQQ19TVFlQRSA9IDIwMDAKK1RJUENfTE9XRVIgPSAyMDAKK1RJUENfVVBQRVIgPSAyMTAKKworZGVmIGlzVGlwY0F2YWlsYWJsZSgpOgorICAgICIiIkNoZWNrIGlmIHRoZSBUSVBDIG1vZHVsZSBpcyBsb2FkZWQKKworICAgIFRoZSBUSVBDIG1vZHVsZSBpcyBub3QgbG9hZGVkIGF1dG9tYXRpY2FsbHkgb24gVWJ1bnR1IGFuZCBwcm9iYWJseQorICAgIG90aGVyIExpbnV4IGRpc3Ryb3MuCisgICAgIiIiCisgICAgaWYgbm90IGhhc2F0dHIoc29ja2V0LCAiQUZfVElQQyIpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoIi9wcm9jL21vZHVsZXMiKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgd2l0aCBvcGVuKCIvcHJvYy9tb2R1bGVzIikgYXMgZjoKKyAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgidGlwYyAiKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICBwcmludCAiVElQQyBtb2R1bGUgaXMgbm90IGxvYWRlZCwgcGxlYXNlICdzdWRvIG1vZHByb2JlIHRpcGMnIgorICAgIHJldHVybiBGYWxzZQorCitjbGFzcyBUSVBDVGVzdCAodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0UkRNKHNlbGYpOgorICAgICAgICBzcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9USVBDLCBzb2NrZXQuU09DS19SRE0pCisgICAgICAgIGNsaSA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1RJUEMsIHNvY2tldC5TT0NLX1JETSkKKworICAgICAgICBzcnYuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgc3J2YWRkciA9IChzb2NrZXQuVElQQ19BRERSX05BTUVTRVEsIFRJUENfU1RZUEUsCisgICAgICAgICAgICAgICAgVElQQ19MT1dFUiwgVElQQ19VUFBFUikKKyAgICAgICAgc3J2LmJpbmQoc3J2YWRkcikKKworICAgICAgICBzZW5kYWRkciA9IChzb2NrZXQuVElQQ19BRERSX05BTUUsIFRJUENfU1RZUEUsCisgICAgICAgICAgICAgICAgVElQQ19MT1dFUiArIChUSVBDX1VQUEVSIC0gVElQQ19MT1dFUikgLyAyLCAwKQorICAgICAgICBjbGkuc2VuZHRvKE1TRywgc2VuZGFkZHIpCisKKyAgICAgICAgbXNnLCByZWN2YWRkciA9IHNydi5yZWN2ZnJvbSgxMDI0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xpLmdldHNvY2tuYW1lKCksIHJlY3ZhZGRyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCisKK2NsYXNzIFRJUENUaHJlYWRhYmxlVGVzdCAodW5pdHRlc3QuVGVzdENhc2UsIFRocmVhZGFibGVUZXN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZSA9ICdydW5UZXN0Jyk6CisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWUgPSBtZXRob2ROYW1lKQorICAgICAgICBUaHJlYWRhYmxlVGVzdC5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNydiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1RJUEMsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5zcnYuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgc3J2YWRkciA9IChzb2NrZXQuVElQQ19BRERSX05BTUVTRVEsIFRJUENfU1RZUEUsCisgICAgICAgICAgICAgICAgVElQQ19MT1dFUiwgVElQQ19VUFBFUikKKyAgICAgICAgc2VsZi5zcnYuYmluZChzcnZhZGRyKQorICAgICAgICBzZWxmLnNydi5saXN0ZW4oNSkKKyAgICAgICAgc2VsZi5zZXJ2ZXJFeHBsaWNpdFJlYWR5KCkKKyAgICAgICAgc2VsZi5jb25uLCBzZWxmLmNvbm5hZGRyID0gc2VsZi5zcnYuYWNjZXB0KCkKKworICAgIGRlZiBjbGllbnRTZXRVcChzZWxmKToKKyAgICAgICAgIyBUaGUgaXMgYSBoaXR0YWJsZSByYWNlIGJldHdlZW4gc2VydmVyRXhwbGljaXRSZWFkeSgpIGFuZCB0aGUKKyAgICAgICAgIyBhY2NlcHQoKSBjYWxsOyBzbGVlcCBhIGxpdHRsZSB3aGlsZSB0byBhdm9pZCBpdCwgb3RoZXJ3aXNlCisgICAgICAgICMgd2UgY291bGQgZ2V0IGFuIGV4Y2VwdGlvbgorICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAgICAgc2VsZi5jbGkgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9USVBDLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIGFkZHIgPSAoc29ja2V0LlRJUENfQUREUl9OQU1FLCBUSVBDX1NUWVBFLAorICAgICAgICAgICAgICAgIFRJUENfTE9XRVIgKyAoVElQQ19VUFBFUiAtIFRJUENfTE9XRVIpIC8gMiwgMCkKKyAgICAgICAgc2VsZi5jbGkuY29ubmVjdChhZGRyKQorICAgICAgICBzZWxmLmNsaWFkZHIgPSBzZWxmLmNsaS5nZXRzb2NrbmFtZSgpCisKKyAgICBkZWYgdGVzdFN0cmVhbShzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5jb25uLnJlY3YoMTAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWFkZHIsIHNlbGYuY29ubmFkZHIpCisKKyAgICBkZWYgX3Rlc3RTdHJlYW0oc2VsZik6CisgICAgICAgIHNlbGYuY2xpLnNlbmQoTVNHKQorICAgICAgICBzZWxmLmNsaS5jbG9zZSgpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3RzID0gW0dlbmVyYWxNb2R1bGVUZXN0cywgQmFzaWNUQ1BUZXN0LCBUQ1BDbG9zZXJUZXN0LCBUQ1BUaW1lb3V0VGVzdCwKKyAgICAgICAgICAgICBUZXN0RXhjZXB0aW9ucywgQnVmZmVySU9UZXN0LCBCYXNpY1RDUFRlc3QyLCBCYXNpY1VEUFRlc3QsCisgICAgICAgICAgICAgVURQVGltZW91dFRlc3QgXQorCisgICAgdGVzdHMuZXh0ZW5kKFsKKyAgICAgICAgTm9uQmxvY2tpbmdUQ1BUZXN0cywKKyAgICAgICAgRmlsZU9iamVjdENsYXNzVGVzdENhc2UsCisgICAgICAgIEZpbGVPYmplY3RJbnRlcnJ1cHRlZFRlc3RDYXNlLAorICAgICAgICBVbmJ1ZmZlcmVkRmlsZU9iamVjdENsYXNzVGVzdENhc2UsCisgICAgICAgIExpbmVCdWZmZXJlZEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlLAorICAgICAgICBTbWFsbEJ1ZmZlcmVkRmlsZU9iamVjdENsYXNzVGVzdENhc2UsCisgICAgICAgIFVybGxpYjJGaWxlb2JqZWN0VGVzdCwKKyAgICAgICAgTmV0d29ya0Nvbm5lY3Rpb25Ob1NlcnZlciwKKyAgICAgICAgTmV0d29ya0Nvbm5lY3Rpb25BdHRyaWJ1dGVzVGVzdCwKKyAgICAgICAgTmV0d29ya0Nvbm5lY3Rpb25CZWhhdmlvdXJUZXN0LAorICAgIF0pCisgICAgaWYgaGFzYXR0cihzb2NrZXQsICJzb2NrZXRwYWlyIik6CisgICAgICAgIHRlc3RzLmFwcGVuZChCYXNpY1NvY2tldFBhaXJUZXN0KQorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnbGludXgyJzoKKyAgICAgICAgdGVzdHMuYXBwZW5kKFRlc3RMaW51eEFic3RyYWN0TmFtZXNwYWNlKQorICAgIGlmIGlzVGlwY0F2YWlsYWJsZSgpOgorICAgICAgICB0ZXN0cy5hcHBlbmQoVElQQ1Rlc3QpCisgICAgICAgIHRlc3RzLmFwcGVuZChUSVBDVGhyZWFkYWJsZVRlc3QpCisKKyAgICB0aHJlYWRfaW5mbyA9IHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorICAgIHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqdGhyZWFkX2luZm8pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvY2tldC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGMwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvY2tldC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNGMwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGJiOGUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5CkBAIC0wLDAgKzEsMzE5IEBACisiIiIKK1Rlc3Qgc3VpdGUgZm9yIFNvY2tldFNlcnZlci5weS4KKyIiIgorCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IGltcAoraW1wb3J0IG9zCitpbXBvcnQgc2VsZWN0CitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc2VsZWN0CitpbXBvcnQgZXJybm8KK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgU29ja2V0U2VydmVyCisKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcmVhcF9jaGlsZHJlbiwgcmVhcF90aHJlYWRzLCB2ZXJib3NlCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKKwordGVzdC50ZXN0X3N1cHBvcnQucmVxdWlyZXMoIm5ldHdvcmsiKQorCitURVNUX1NUUiA9ICJoZWxsbyB3b3JsZFxuIgorSE9TVCA9IHRlc3QudGVzdF9zdXBwb3J0LkhPU1QKKworSEFWRV9VTklYX1NPQ0tFVFMgPSBoYXNhdHRyKHNvY2tldCwgIkFGX1VOSVgiKQorSEFWRV9GT1JLSU5HID0gaGFzYXR0cihvcywgImZvcmsiKSBhbmQgb3MubmFtZSAhPSAib3MyIgorCitkZWYgc2lnbmFsX2FsYXJtKG4pOgorICAgICIiIkNhbGwgc2lnbmFsLmFsYXJtIHdoZW4gaXQgZXhpc3RzIChpLmUuIG5vdCBvbiBXaW5kb3dzKS4iIiIKKyAgICBpZiBoYXNhdHRyKHNpZ25hbCwgJ2FsYXJtJyk6CisgICAgICAgIHNpZ25hbC5hbGFybShuKQorCisjIFJlbWVtYmVyIHJlYWwgc2VsZWN0KCkgdG8gYXZvaWQgaW50ZXJmZXJlbmNlcyB3aXRoIG1vY2tpbmcKK19yZWFsX3NlbGVjdCA9IHNlbGVjdC5zZWxlY3QKKworZGVmIHJlY2VpdmUoc29jaywgbiwgdGltZW91dD0yMCk6CisgICAgciwgdywgeCA9IF9yZWFsX3NlbGVjdChbc29ja10sIFtdLCBbXSwgdGltZW91dCkKKyAgICBpZiBzb2NrIGluIHI6CisgICAgICAgIHJldHVybiBzb2NrLnJlY3YobikKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJ0aW1lZCBvdXQgb24gJXIiICUgKHNvY2ssKQorCitpZiBIQVZFX1VOSVhfU09DS0VUUzoKKyAgICBjbGFzcyBGb3JraW5nVW5peFN0cmVhbVNlcnZlcihTb2NrZXRTZXJ2ZXIuRm9ya2luZ01peEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5Vbml4U3RyZWFtU2VydmVyKToKKyAgICAgICAgcGFzcworCisgICAgY2xhc3MgRm9ya2luZ1VuaXhEYXRhZ3JhbVNlcnZlcihTb2NrZXRTZXJ2ZXIuRm9ya2luZ01peEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLlVuaXhEYXRhZ3JhbVNlcnZlcik6CisgICAgICAgIHBhc3MKKworCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIHNpbXBsZV9zdWJwcm9jZXNzKHRlc3RjYXNlKToKKyAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICBpZiBwaWQgPT0gMDoKKyAgICAgICAgIyBEb24ndCByYWlzZSBhbiBleGNlcHRpb247IGl0IHdvdWxkIGJlIGNhdWdodCBieSB0aGUgdGVzdCBoYXJuZXNzLgorICAgICAgICBvcy5fZXhpdCg3MikKKyAgICB5aWVsZCBOb25lCisgICAgcGlkMiwgc3RhdHVzID0gb3Mud2FpdHBpZChwaWQsIDApCisgICAgdGVzdGNhc2UuYXNzZXJ0RXF1YWwocGlkMiwgcGlkKQorICAgIHRlc3RjYXNlLmFzc2VydEVxdWFsKDcyIDw8IDgsIHN0YXR1cykKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgU29ja2V0U2VydmVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhbGwgc29ja2V0IHNlcnZlcnMuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNpZ25hbF9hbGFybSg2MCkgICMgS2lsbCBkZWFkbG9ja3MgYWZ0ZXIgNjAgc2Vjb25kcy4KKyAgICAgICAgc2VsZi5wb3J0X3NlZWQgPSAwCisgICAgICAgIHNlbGYudGVzdF9maWxlcyA9IFtdCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNpZ25hbF9hbGFybSgwKSAgIyBEaWRuJ3QgZGVhZGxvY2suCisgICAgICAgIHJlYXBfY2hpbGRyZW4oKQorCisgICAgICAgIGZvciBmbiBpbiBzZWxmLnRlc3RfZmlsZXM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGZuKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi50ZXN0X2ZpbGVzWzpdID0gW10KKworICAgIGRlZiBwaWNrYWRkcihzZWxmLCBwcm90byk6CisgICAgICAgIGlmIHByb3RvID09IHNvY2tldC5BRl9JTkVUOgorICAgICAgICAgICAgcmV0dXJuIChIT1NULCAwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBYWFg6IFdlIG5lZWQgYSB3YXkgdG8gdGVsbCBBRl9VTklYIHRvIHBpY2sgaXRzIG93biBuYW1lCisgICAgICAgICAgICAjIGxpa2UgQUZfSU5FVCBwcm92aWRlcyBwb3J0PT0wLgorICAgICAgICAgICAgZGlyID0gTm9uZQorICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAnb3MyJzoKKyAgICAgICAgICAgICAgICBkaXIgPSAnXHNvY2tldCcKKyAgICAgICAgICAgIGZuID0gdGVtcGZpbGUubWt0ZW1wKHByZWZpeD0ndW5peF9zb2NrZXQuJywgZGlyPWRpcikKKyAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ29zMic6CisgICAgICAgICAgICAgICAgIyBBRl9VTklYIHNvY2tldCBuYW1lcyBvbiBPUy8yIHJlcXVpcmUgYSBzcGVjaWZpYyBwcmVmaXgKKyAgICAgICAgICAgICAgICAjIHdoaWNoIGNhbid0IGluY2x1ZGUgYSBkcml2ZSBsZXR0ZXIgYW5kIG11c3QgYWxzbyB1c2UKKyAgICAgICAgICAgICAgICAjIGJhY2tzbGFzaGVzIGFzIGRpcmVjdG9yeSBzZXBhcmF0b3JzCisgICAgICAgICAgICAgICAgaWYgZm5bMV0gPT0gJzonOgorICAgICAgICAgICAgICAgICAgICBmbiA9IGZuWzI6XQorICAgICAgICAgICAgICAgIGlmIGZuWzBdIGluIChvcy5zZXAsIG9zLmFsdHNlcCk6CisgICAgICAgICAgICAgICAgICAgIGZuID0gZm5bMTpdCisgICAgICAgICAgICAgICAgaWYgb3Muc2VwID09ICcvJzoKKyAgICAgICAgICAgICAgICAgICAgZm4gPSBmbi5yZXBsYWNlKG9zLnNlcCwgb3MuYWx0c2VwKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZuID0gZm4ucmVwbGFjZShvcy5hbHRzZXAsIG9zLnNlcCkKKyAgICAgICAgICAgIHNlbGYudGVzdF9maWxlcy5hcHBlbmQoZm4pCisgICAgICAgICAgICByZXR1cm4gZm4KKworICAgIGRlZiBtYWtlX3NlcnZlcihzZWxmLCBhZGRyLCBzdnJjbHMsIGhkbHJiYXNlKToKKyAgICAgICAgY2xhc3MgTXlTZXJ2ZXIoc3ZyY2xzKToKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX2Nsb3NlKCkKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIGNsYXNzIE15SGFuZGxlcihoZGxyYmFzZSk6CisgICAgICAgICAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKGxpbmUpCisKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgImNyZWF0aW5nIHNlcnZlciIKKyAgICAgICAgc2VydmVyID0gTXlTZXJ2ZXIoYWRkciwgTXlIYW5kbGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlci5zZXJ2ZXJfYWRkcmVzcywgc2VydmVyLnNvY2tldC5nZXRzb2NrbmFtZSgpKQorICAgICAgICByZXR1cm4gc2VydmVyCisKKyAgICBAcmVhcF90aHJlYWRzCisgICAgZGVmIHJ1bl9zZXJ2ZXIoc2VsZiwgc3ZyY2xzLCBoZGxyYmFzZSwgdGVzdGZ1bmMpOgorICAgICAgICBzZXJ2ZXIgPSBzZWxmLm1ha2Vfc2VydmVyKHNlbGYucGlja2FkZHIoc3ZyY2xzLmFkZHJlc3NfZmFtaWx5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdnJjbHMsIGhkbHJiYXNlKQorICAgICAgICAjIFdlIGhhZCB0aGUgT1MgcGljayBhIHBvcnQsIHNvIHB1bGwgdGhlIHJlYWwgYWRkcmVzcyBvdXQgb2YKKyAgICAgICAgIyB0aGUgc2VydmVyLgorICAgICAgICBhZGRyID0gc2VydmVyLnNlcnZlcl9hZGRyZXNzCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAic2VydmVyIGNyZWF0ZWQiCisgICAgICAgICAgICBwcmludCAiQUREUiA9IiwgYWRkcgorICAgICAgICAgICAgcHJpbnQgIkNMQVNTID0iLCBzdnJjbHMKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQoCisgICAgICAgICAgICBuYW1lPSclcyBzZXJ2aW5nJyAlIHN2cmNscywKKyAgICAgICAgICAgIHRhcmdldD1zZXJ2ZXIuc2VydmVfZm9yZXZlciwKKyAgICAgICAgICAgICMgU2hvcnQgcG9sbCBpbnRlcnZhbCB0byBtYWtlIHRoZSB0ZXN0IGZpbmlzaCBxdWlja2x5LgorICAgICAgICAgICAgIyBUaW1lIGJldHdlZW4gcmVxdWVzdHMgaXMgc2hvcnQgZW5vdWdoIHRoYXQgd2Ugd29uJ3Qgd2FrZQorICAgICAgICAgICAgIyB1cCBzcHVyaW91c2x5IHRvbyBtYW55IHRpbWVzLgorICAgICAgICAgICAga3dhcmdzPXsncG9sbF9pbnRlcnZhbCc6MC4wMX0pCisgICAgICAgIHQuZGFlbW9uID0gVHJ1ZSAgIyBJbiBjYXNlIHRoaXMgZnVuY3Rpb24gcmFpc2VzLgorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgInNlcnZlciBydW5uaW5nIgorICAgICAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJ0ZXN0IGNsaWVudCIsIGkKKyAgICAgICAgICAgIHRlc3RmdW5jKHN2cmNscy5hZGRyZXNzX2ZhbWlseSwgYWRkcikKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIndhaXRpbmcgZm9yIHNlcnZlciIKKyAgICAgICAgc2VydmVyLnNodXRkb3duKCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgImRvbmUiCisKKyAgICBkZWYgc3RyZWFtX2V4YW1pbmUoc2VsZiwgcHJvdG8sIGFkZHIpOgorICAgICAgICBzID0gc29ja2V0LnNvY2tldChwcm90bywgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzLmNvbm5lY3QoYWRkcikKKyAgICAgICAgcy5zZW5kYWxsKFRFU1RfU1RSKQorICAgICAgICBidWYgPSBkYXRhID0gcmVjZWl2ZShzLCAxMDApCisgICAgICAgIHdoaWxlIGRhdGEgYW5kICdcbicgbm90IGluIGJ1ZjoKKyAgICAgICAgICAgIGRhdGEgPSByZWNlaXZlKHMsIDEwMCkKKyAgICAgICAgICAgIGJ1ZiArPSBkYXRhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBURVNUX1NUUikKKyAgICAgICAgcy5jbG9zZSgpCisKKyAgICBkZWYgZGdyYW1fZXhhbWluZShzZWxmLCBwcm90bywgYWRkcik6CisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHByb3RvLCBzb2NrZXQuU09DS19ER1JBTSkKKyAgICAgICAgcy5zZW5kdG8oVEVTVF9TVFIsIGFkZHIpCisgICAgICAgIGJ1ZiA9IGRhdGEgPSByZWNlaXZlKHMsIDEwMCkKKyAgICAgICAgd2hpbGUgZGF0YSBhbmQgJ1xuJyBub3QgaW4gYnVmOgorICAgICAgICAgICAgZGF0YSA9IHJlY2VpdmUocywgMTAwKQorICAgICAgICAgICAgYnVmICs9IGRhdGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIFRFU1RfU1RSKQorICAgICAgICBzLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X1RDUFNlcnZlcihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5UQ1BTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9leGFtaW5lKQorCisgICAgZGVmIHRlc3RfVGhyZWFkaW5nVENQU2VydmVyKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLlRocmVhZGluZ1RDUFNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtX2V4YW1pbmUpCisKKyAgICBpZiBIQVZFX0ZPUktJTkc6CisgICAgICAgIGRlZiB0ZXN0X0ZvcmtpbmdUQ1BTZXJ2ZXIoc2VsZik6CisgICAgICAgICAgICB3aXRoIHNpbXBsZV9zdWJwcm9jZXNzKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYucnVuX3NlcnZlcihTb2NrZXRTZXJ2ZXIuRm9ya2luZ1RDUFNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9leGFtaW5lKQorCisgICAgaWYgSEFWRV9VTklYX1NPQ0tFVFM6CisgICAgICAgIGRlZiB0ZXN0X1VuaXhTdHJlYW1TZXJ2ZXIoc2VsZik6CisgICAgICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLlVuaXhTdHJlYW1TZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtX2V4YW1pbmUpCisKKyAgICAgICAgZGVmIHRlc3RfVGhyZWFkaW5nVW5peFN0cmVhbVNlcnZlcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYucnVuX3NlcnZlcihTb2NrZXRTZXJ2ZXIuVGhyZWFkaW5nVW5peFN0cmVhbVNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW1fZXhhbWluZSkKKworICAgICAgICBpZiBIQVZFX0ZPUktJTkc6CisgICAgICAgICAgICBkZWYgdGVzdF9Gb3JraW5nVW5peFN0cmVhbVNlcnZlcihzZWxmKToKKyAgICAgICAgICAgICAgICB3aXRoIHNpbXBsZV9zdWJwcm9jZXNzKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoRm9ya2luZ1VuaXhTdHJlYW1TZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9leGFtaW5lKQorCisgICAgZGVmIHRlc3RfVURQU2VydmVyKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLlVEUFNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5EYXRhZ3JhbVJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZ3JhbV9leGFtaW5lKQorCisgICAgZGVmIHRlc3RfVGhyZWFkaW5nVURQU2VydmVyKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLlRocmVhZGluZ1VEUFNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5EYXRhZ3JhbVJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZ3JhbV9leGFtaW5lKQorCisgICAgaWYgSEFWRV9GT1JLSU5HOgorICAgICAgICBkZWYgdGVzdF9Gb3JraW5nVURQU2VydmVyKHNlbGYpOgorICAgICAgICAgICAgd2l0aCBzaW1wbGVfc3VicHJvY2VzcyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLkZvcmtpbmdVRFBTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5EYXRhZ3JhbVJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRncmFtX2V4YW1pbmUpCisKKyAgICBAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorICAgIGRlZiBtb2NrZWRfc2VsZWN0X21vZHVsZShzZWxmKToKKyAgICAgICAgIiIiTW9ja3MgdGhlIHNlbGVjdC5zZWxlY3QoKSBjYWxsIHRvIHJhaXNlIEVJTlRSIGZvciBmaXJzdCBjYWxsIiIiCisgICAgICAgIG9sZF9zZWxlY3QgPSBzZWxlY3Quc2VsZWN0CisKKyAgICAgICAgY2xhc3MgTW9ja1NlbGVjdDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZCA9IDAKKworICAgICAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZCArPSAxCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jYWxsZWQgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgIyByYWlzZSB0aGUgZXhjZXB0aW9uIG9uIGZpcnN0IGNhbGwKKyAgICAgICAgICAgICAgICAgICAgcmFpc2Ugc2VsZWN0LmVycm9yKGVycm5vLkVJTlRSLCBvcy5zdHJlcnJvcihlcnJuby5FSU5UUikpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBSZXR1cm4gcmVhbCBzZWxlY3QgdmFsdWUgZm9yIGNvbnNlY3V0aXZlIGNhbGxzCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbGRfc2VsZWN0KCphcmdzKQorCisgICAgICAgIHNlbGVjdC5zZWxlY3QgPSBNb2NrU2VsZWN0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQgc2VsZWN0LnNlbGVjdAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZWN0LnNlbGVjdCA9IG9sZF9zZWxlY3QKKworICAgIGRlZiB0ZXN0X0ludGVycnVwdFNlcnZlclNlbGVjdENhbGwoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5tb2NrZWRfc2VsZWN0X21vZHVsZSgpIGFzIG1vY2tfc2VsZWN0OgorICAgICAgICAgICAgcGlkID0gc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5UQ1BTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtX2V4YW1pbmUpCisgICAgICAgICAgICAjIE1ha2Ugc3VyZSBzZWxlY3Qgd2FzIGNhbGxlZCBhZ2FpbjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihtb2NrX3NlbGVjdC5jYWxsZWQsIDEpCisKKyAgICAjIEFsYXMsIG9uIExpbnV4IChhdCBsZWFzdCkgcmVjdmZyb20oKSBkb2Vzbid0IHJldHVybiBhIG1lYW5pbmdmdWwKKyAgICAjIGNsaWVudCBhZGRyZXNzIHNvIHRoaXMgY2Fubm90IHdvcms6CisKKyAgICAjIGlmIEhBVkVfVU5JWF9TT0NLRVRTOgorICAgICMgICAgIGRlZiB0ZXN0X1VuaXhEYXRhZ3JhbVNlcnZlcihzZWxmKToKKyAgICAjICAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5Vbml4RGF0YWdyYW1TZXJ2ZXIsCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZXJ2ZXIuRGF0YWdyYW1SZXF1ZXN0SGFuZGxlciwKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGdyYW1fZXhhbWluZSkKKyAgICAjCisgICAgIyAgICAgZGVmIHRlc3RfVGhyZWFkaW5nVW5peERhdGFncmFtU2VydmVyKHNlbGYpOgorICAgICMgICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLlRocmVhZGluZ1VuaXhEYXRhZ3JhbVNlcnZlciwKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5EYXRhZ3JhbVJlcXVlc3RIYW5kbGVyLAorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZ3JhbV9leGFtaW5lKQorICAgICMKKyAgICAjICAgICBpZiBIQVZFX0ZPUktJTkc6CisgICAgIyAgICAgICAgIGRlZiB0ZXN0X0ZvcmtpbmdVbml4RGF0YWdyYW1TZXJ2ZXIoc2VsZik6CisgICAgIyAgICAgICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLkZvcmtpbmdVbml4RGF0YWdyYW1TZXJ2ZXIsCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLkRhdGFncmFtUmVxdWVzdEhhbmRsZXIsCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZ3JhbV9leGFtaW5lKQorCisgICAgQHJlYXBfdGhyZWFkcworICAgIGRlZiB0ZXN0X3NodXRkb3duKHNlbGYpOgorICAgICAgICAjIElzc3VlICMyMzAyOiBzaHV0ZG93bigpIHNob3VsZCBhbHdheXMgc3VjY2VlZCBpbiBtYWtpbmcgYW4KKyAgICAgICAgIyBvdGhlciB0aHJlYWQgbGVhdmUgc2VydmVfZm9yZXZlcigpLgorICAgICAgICBjbGFzcyBNeVNlcnZlcihTb2NrZXRTZXJ2ZXIuVENQU2VydmVyKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBNeUhhbmRsZXIoU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0aHJlYWRzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjApOgorICAgICAgICAgICAgcyA9IE15U2VydmVyKChIT1NULCAwKSwgTXlIYW5kbGVyKQorICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQoCisgICAgICAgICAgICAgICAgbmFtZT0nTXlTZXJ2ZXIgc2VydmluZycsCisgICAgICAgICAgICAgICAgdGFyZ2V0PXMuc2VydmVfZm9yZXZlciwKKyAgICAgICAgICAgICAgICBrd2FyZ3M9eydwb2xsX2ludGVydmFsJzowLjAxfSkKKyAgICAgICAgICAgIHQuZGFlbW9uID0gVHJ1ZSAgIyBJbiBjYXNlIHRoaXMgZnVuY3Rpb24gcmFpc2VzLgorICAgICAgICAgICAgdGhyZWFkcy5hcHBlbmQoKHQsIHMpKQorICAgICAgICBmb3IgdCwgcyBpbiB0aHJlYWRzOgorICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBzLnNodXRkb3duKCkKKyAgICAgICAgZm9yIHQsIHMgaW4gdGhyZWFkczoKKyAgICAgICAgICAgIHQuam9pbigpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGlmIGltcC5sb2NrX2hlbGQoKToKKyAgICAgICAgIyBJZiB0aGUgaW1wb3J0IGxvY2sgaXMgaGVsZCwgdGhlIHRocmVhZHMgd2lsbCBoYW5nCisgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJjYW4ndCBydW4gd2hlbiBpbXBvcnQgbG9jayBpcyBoZWxkIikKKworICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTb2NrZXRTZXJ2ZXJUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjhhM2VkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjhhM2VkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2Z0c3BhY2UucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2Z0c3BhY2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5YTAzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvZnRzcGFjZS5weQpAQCAtMCwwICsxLDIzIEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IFN0cmluZ0lPCisKK2NsYXNzIFNvZnRzcGFjZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9idWdfNDgwMjE1KHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyA0ODAyMTU6ICBzb2Z0c3BhY2UgY29uZnVzZWQgaW4gbmVzdGVkIHByaW50CisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBwcmludCA+PiBmLCAnYScKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2InCisKKyAgICAgICAgcHJpbnQgPj4gZiwgQygpLCAnYyAnLCAnZFx0JywgJ2UnCisgICAgICAgIHByaW50ID4+IGYsICdmJywgJ2cnCisgICAgICAgICMgSW4gMi4yICYgZWFybGllciwgdGhpcyBwcmludGVkICcgYVxuYmMgIGRcdGVcbmYgZ1xuJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0dmFsdWUoKSwgJ2FcbmIgYyAgZFx0ZVxuZiBnXG4nKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFNvZnRzcGFjZVRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2Z0c3BhY2UucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29mdHNwYWNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjA2MGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29mdHNwYWNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2Z0c3BhY2UucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29mdHNwYWNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjA2MGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29mdHNwYWNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb3J0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzVhYmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ydC5weQpAQCAtMCwwICsxLDI5MiBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCit2ZXJib3NlID0gdGVzdF9zdXBwb3J0LnZlcmJvc2UKK25lcnJvcnMgPSAwCisKK2RlZiBjaGVjayh0YWcsIGV4cGVjdGVkLCByYXcsIGNvbXBhcmU9Tm9uZSk6CisgICAgZ2xvYmFsIG5lcnJvcnMKKworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICIgICAgY2hlY2tpbmciLCB0YWcKKworICAgIG9yaWcgPSByYXdbOl0gICAjIHNhdmUgaW5wdXQgaW4gY2FzZSBvZiBlcnJvcgorICAgIGlmIGNvbXBhcmU6CisgICAgICAgIHJhdy5zb3J0KGNvbXBhcmUpCisgICAgZWxzZToKKyAgICAgICAgcmF3LnNvcnQoKQorCisgICAgaWYgbGVuKGV4cGVjdGVkKSAhPSBsZW4ocmF3KToKKyAgICAgICAgcHJpbnQgImVycm9yIGluIiwgdGFnCisgICAgICAgIHByaW50ICJsZW5ndGggbWlzbWF0Y2g7IiwgbGVuKGV4cGVjdGVkKSwgbGVuKHJhdykKKyAgICAgICAgcHJpbnQgZXhwZWN0ZWQKKyAgICAgICAgcHJpbnQgb3JpZworICAgICAgICBwcmludCByYXcKKyAgICAgICAgbmVycm9ycyArPSAxCisgICAgICAgIHJldHVybgorCisgICAgZm9yIGksIGdvb2QgaW4gZW51bWVyYXRlKGV4cGVjdGVkKToKKyAgICAgICAgbWF5YmUgPSByYXdbaV0KKyAgICAgICAgaWYgZ29vZCBpcyBub3QgbWF5YmU6CisgICAgICAgICAgICBwcmludCAiZXJyb3IgaW4iLCB0YWcKKyAgICAgICAgICAgIHByaW50ICJvdXQgb2Ygb3JkZXIgYXQgaW5kZXgiLCBpLCBnb29kLCBtYXliZQorICAgICAgICAgICAgcHJpbnQgZXhwZWN0ZWQKKyAgICAgICAgICAgIHByaW50IG9yaWcKKyAgICAgICAgICAgIHByaW50IHJhdworICAgICAgICAgICAgbmVycm9ycyArPSAxCisgICAgICAgICAgICByZXR1cm4KKworY2xhc3MgVGVzdEJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0U3RyZXNzZnVsbHkoc2VsZik6CisgICAgICAgICMgVHJ5IGEgdmFyaWV0eSBvZiBzaXplcyBhdCBhbmQgYXJvdW5kIHBvd2VycyBvZiAyLCBhbmQgYXQgcG93ZXJzIG9mIDEwLgorICAgICAgICBzaXplcyA9IFswXQorICAgICAgICBmb3IgcG93ZXIgaW4gcmFuZ2UoMSwgMTApOgorICAgICAgICAgICAgbiA9IDIgKiogcG93ZXIKKyAgICAgICAgICAgIHNpemVzLmV4dGVuZChyYW5nZShuLTEsIG4rMikpCisgICAgICAgIHNpemVzLmV4dGVuZChbMTAsIDEwMCwgMTAwMF0pCisKKyAgICAgICAgY2xhc3MgQ29tcGxhaW5zKG9iamVjdCk6CisgICAgICAgICAgICBtYXliZV9jb21wbGFpbiA9IFRydWUKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIHNlbGYuaSA9IGkKKworICAgICAgICAgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgaWYgQ29tcGxhaW5zLm1heWJlX2NvbXBsYWluIGFuZCByYW5kb20ucmFuZG9tKCkgPCAwLjAwMToKKyAgICAgICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICIgICAgICAgIGNvbXBsYWluaW5nIGF0Iiwgc2VsZiwgb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaSA8IG90aGVyLmkKKworICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQ29tcGxhaW5zKCVkKSIgJSBzZWxmLmkKKworICAgICAgICBjbGFzcyBTdGFibGUob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXksIGkpOgorICAgICAgICAgICAgICAgIHNlbGYua2V5ID0ga2V5CisgICAgICAgICAgICAgICAgc2VsZi5pbmRleCA9IGkKKworICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5rZXksIG90aGVyLmtleSkKKyAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIlN0YWJsZSglZCwgJWQpIiAlIChzZWxmLmtleSwgc2VsZi5pbmRleCkKKworICAgICAgICBmb3IgbiBpbiBzaXplczoKKyAgICAgICAgICAgIHggPSByYW5nZShuKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiVGVzdGluZyBzaXplIiwgbgorCisgICAgICAgICAgICBzID0geFs6XQorICAgICAgICAgICAgY2hlY2soImlkZW50aXR5IiwgeCwgcykKKworICAgICAgICAgICAgcyA9IHhbOl0KKyAgICAgICAgICAgIHMucmV2ZXJzZSgpCisgICAgICAgICAgICBjaGVjaygicmV2ZXJzZWQiLCB4LCBzKQorCisgICAgICAgICAgICBzID0geFs6XQorICAgICAgICAgICAgcmFuZG9tLnNodWZmbGUocykKKyAgICAgICAgICAgIGNoZWNrKCJyYW5kb20gcGVybXV0YXRpb24iLCB4LCBzKQorCisgICAgICAgICAgICB5ID0geFs6XQorICAgICAgICAgICAgeS5yZXZlcnNlKCkKKyAgICAgICAgICAgIHMgPSB4WzpdCisgICAgICAgICAgICBjaGVjaygicmV2ZXJzZWQgdmlhIGZ1bmN0aW9uIiwgeSwgcywgbGFtYmRhIGEsIGI6IGNtcChiLCBhKSkKKworICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiICAgIENoZWNraW5nIGFnYWluc3QgYW4gaW5zYW5lIGNvbXBhcmlzb24gZnVuY3Rpb24uIgorICAgICAgICAgICAgICAgIHByaW50ICIgICAgICAgIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBpc24ndCBjYXJlZnVsLCB0aGlzIG1heSBzZWdmYXVsdC4iCisgICAgICAgICAgICBzID0geFs6XQorICAgICAgICAgICAgcy5zb3J0KGxhbWJkYSBhLCBiOiAgaW50KHJhbmRvbS5yYW5kb20oKSAqIDMpIC0gMSkKKyAgICAgICAgICAgIGNoZWNrKCJhbiBpbnNhbmUgZnVuY3Rpb24gbGVmdCBzb21lIHBlcm11dGF0aW9uIiwgeCwgcykKKworICAgICAgICAgICAgeCA9IFtDb21wbGFpbnMoaSkgZm9yIGkgaW4geF0KKyAgICAgICAgICAgIHMgPSB4WzpdCisgICAgICAgICAgICByYW5kb20uc2h1ZmZsZShzKQorICAgICAgICAgICAgQ29tcGxhaW5zLm1heWJlX2NvbXBsYWluID0gVHJ1ZQorICAgICAgICAgICAgaXRfY29tcGxhaW5lZCA9IEZhbHNlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcy5zb3J0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgaXRfY29tcGxhaW5lZCA9IFRydWUKKyAgICAgICAgICAgIGlmIGl0X2NvbXBsYWluZWQ6CisgICAgICAgICAgICAgICAgQ29tcGxhaW5zLm1heWJlX2NvbXBsYWluID0gRmFsc2UKKyAgICAgICAgICAgICAgICBjaGVjaygiZXhjZXB0aW9uIGR1cmluZyBzb3J0IGxlZnQgc29tZSBwZXJtdXRhdGlvbiIsIHgsIHMpCisKKyAgICAgICAgICAgIHMgPSBbU3RhYmxlKHJhbmRvbS5yYW5kcmFuZ2UoMTApLCBpKSBmb3IgaSBpbiB4cmFuZ2UobildCisgICAgICAgICAgICBhdWdtZW50ZWQgPSBbKGUsIGUuaW5kZXgpIGZvciBlIGluIHNdCisgICAgICAgICAgICBhdWdtZW50ZWQuc29ydCgpICAgICMgZm9yY2VkIHN0YWJsZSBiZWNhdXNlIHRpZXMgYnJva2VuIGJ5IGluZGV4CisgICAgICAgICAgICB4ID0gW2UgZm9yIGUsIGkgaW4gYXVnbWVudGVkXSAjIGEgc3RhYmxlIHNvcnQgb2YgcworICAgICAgICAgICAgY2hlY2soInN0YWJpbGl0eSIsIHgsIHMpCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEJ1Z3ModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYnVnNDUzNTIzKHNlbGYpOgorICAgICAgICAjIGJ1ZyA0NTM1MjMgLS0gbGlzdC5zb3J0KCkgY3Jhc2hlci4KKyAgICAgICAgIyBJZiB0aGlzIGZhaWxzLCB0aGUgbW9zdCBsaWtlbHkgb3V0Y29tZSBpcyBhIGNvcmUgZHVtcC4KKyAgICAgICAgIyBNdXRhdGlvbnMgZHVyaW5nIGEgbGlzdCBzb3J0IHNob3VsZCByYWlzZSBhIFZhbHVlRXJyb3IuCisKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIGlmIEwgYW5kIHJhbmRvbS5yYW5kb20oKSA8IDAuNzU6CisgICAgICAgICAgICAgICAgICAgIEwucG9wKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBMLmFwcGVuZCgzKQorICAgICAgICAgICAgICAgIHJldHVybiByYW5kb20ucmFuZG9tKCkgPCAwLjUKKworICAgICAgICBMID0gW0MoKSBmb3IgaSBpbiByYW5nZSg1MCldCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEwuc29ydCkKKworICAgIGRlZiB0ZXN0X2NtcE5vbmUoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBOb25lIGFzIGEgY29tcGFyaXNvbiBmdW5jdGlvbi4KKworICAgICAgICBMID0gcmFuZ2UoNTApCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKEwpCisgICAgICAgIEwuc29ydChOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwsIHJhbmdlKDUwKSkKKworICAgIGRlZiB0ZXN0X3VuZGV0ZWN0ZWRfbXV0YXRpb24oc2VsZik6CisgICAgICAgICMgUHl0aG9uIDIuNGExIGRpZCBub3QgYWx3YXlzIGRldGVjdCBtdXRhdGlvbgorICAgICAgICBtZW1vcnl3YXN0ZXIgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyMCk6CisgICAgICAgICAgICBkZWYgbXV0YXRpbmdfY21wKHgsIHkpOgorICAgICAgICAgICAgICAgIEwuYXBwZW5kKDMpCisgICAgICAgICAgICAgICAgTC5wb3AoKQorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoeCwgeSkKKyAgICAgICAgICAgIEwgPSBbMSwyXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgTC5zb3J0LCBtdXRhdGluZ19jbXApCisgICAgICAgICAgICBkZWYgbXV0YXRpbmdfY21wKHgsIHkpOgorICAgICAgICAgICAgICAgIEwuYXBwZW5kKDMpCisgICAgICAgICAgICAgICAgZGVsIExbOl0KKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHgsIHkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBMLnNvcnQsIG11dGF0aW5nX2NtcCkKKyAgICAgICAgICAgIG1lbW9yeXdhc3RlciA9IFttZW1vcnl3YXN0ZXJdCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdERlY29yYXRlU29ydFVuZGVjb3JhdGUodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZGVjb3JhdGVkKHNlbGYpOgorICAgICAgICBkYXRhID0gJ1RoZSBxdWljayBCcm93biBmb3ggSnVtcGVkIG92ZXIgVGhlIGxhenkgRG9nJy5zcGxpdCgpCisgICAgICAgIGNvcHkgPSBkYXRhWzpdCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKGRhdGEpCisgICAgICAgIGRhdGEuc29ydChrZXk9c3RyLmxvd2VyKQorICAgICAgICBjb3B5LnNvcnQoY21wPWxhbWJkYSB4LHk6IGNtcCh4Lmxvd2VyKCksIHkubG93ZXIoKSkpCisKKyAgICBkZWYgdGVzdF9iYWRkZWNvcmF0b3Ioc2VsZik6CisgICAgICAgIGRhdGEgPSAnVGhlIHF1aWNrIEJyb3duIGZveCBKdW1wZWQgb3ZlciBUaGUgbGF6eSBEb2cnLnNwbGl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkYXRhLnNvcnQsIE5vbmUsIGxhbWJkYSB4LHk6IDApCisKKyAgICBkZWYgdGVzdF9zdGFiaWxpdHkoc2VsZik6CisgICAgICAgIGRhdGEgPSBbKHJhbmRvbS5yYW5kcmFuZ2UoMTAwKSwgaSkgZm9yIGkgaW4geHJhbmdlKDIwMCldCisgICAgICAgIGNvcHkgPSBkYXRhWzpdCisgICAgICAgIGRhdGEuc29ydChrZXk9bGFtYmRhIHg6IHhbMF0pICAgIyBzb3J0IG9uIHRoZSByYW5kb20gZmlyc3QgZmllbGQKKyAgICAgICAgY29weS5zb3J0KCkgICAgICAgICAgICAgICAgICAgICAjIHNvcnQgdXNpbmcgYm90aCBmaWVsZHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBjb3B5KSAgICAjIHNob3VsZCBnZXQgdGhlIHNhbWUgcmVzdWx0CisKKyAgICBkZWYgdGVzdF9jbXBfYW5kX2tleV9jb21iaW5hdGlvbihzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgd3JhcHBlciBoYXMgYmVlbiByZW1vdmVkCisgICAgICAgIGRlZiBjb21wYXJlKHgsIHkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHgpLCBzdHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoeCksIHN0cikKKyAgICAgICAgICAgIHJldHVybiBjbXAoeCwgeSkKKyAgICAgICAgZGF0YSA9ICdUaGUgcXVpY2sgQnJvd24gZm94IEp1bXBlZCBvdmVyIFRoZSBsYXp5IERvZycuc3BsaXQoKQorICAgICAgICBkYXRhLnNvcnQoY21wPWNvbXBhcmUsIGtleT1zdHIubG93ZXIpCisKKyAgICBkZWYgdGVzdF9iYWRjbXBfd2l0aF9rZXkoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIHdyYXBwZXIgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAgICBkYXRhID0gJ1RoZSBxdWljayBCcm93biBmb3ggSnVtcGVkIG92ZXIgVGhlIGxhenkgRG9nJy5zcGxpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGF0YS5zb3J0LCAiYmFkIiwgc3RyLmxvd2VyKQorCisgICAgZGVmIHRlc3Rfa2V5X3dpdGhfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSB3cmFwcGVyIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgZGF0YSA9IHJhbmdlKC0yLDIpCisgICAgICAgIGR1cCA9IGRhdGFbOl0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGRhdGEuc29ydCwgTm9uZSwgbGFtYmRhIHg6IDEgLy8geCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBkdXApCisKKyAgICBkZWYgdGVzdF9rZXlfd2l0aF9tdXRhdGlvbihzZWxmKToKKyAgICAgICAgZGF0YSA9IHJhbmdlKDEwKQorICAgICAgICBkZWYgayh4KToKKyAgICAgICAgICAgIGRlbCBkYXRhWzpdCisgICAgICAgICAgICBkYXRhWzpdID0gcmFuZ2UoMjApCisgICAgICAgICAgICByZXR1cm4geAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkYXRhLnNvcnQsIGtleT1rKQorCisgICAgZGVmIHRlc3Rfa2V5X3dpdGhfbXV0YXRpbmdfZGVsKHNlbGYpOgorICAgICAgICBkYXRhID0gcmFuZ2UoMTApCisgICAgICAgIGNsYXNzIFNvcnRLaWxsZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBkZWwgZGF0YVs6XQorICAgICAgICAgICAgICAgIGRhdGFbOl0gPSByYW5nZSgyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZGF0YS5zb3J0LCBrZXk9U29ydEtpbGxlcikKKworICAgIGRlZiB0ZXN0X2tleV93aXRoX211dGF0aW5nX2RlbF9hbmRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBkYXRhID0gcmFuZ2UoMTApCisgICAgICAgICMjIGR1cCA9IGRhdGFbOl0KKyAgICAgICAgY2xhc3MgU29ydEtpbGxlcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIGlmIHggPiAyOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGRlbCBkYXRhWzpdCisgICAgICAgICAgICAgICAgZGF0YVs6XSA9IHJhbmdlKDIwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGRhdGEuc29ydCwga2V5PVNvcnRLaWxsZXIpCisgICAgICAgICMjIG1ham9yIGhvbmtpbmcgc3VidGxldHk6IHdlICpjYW4ndCogZG86CisgICAgICAgICMjCisgICAgICAgICMjIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZHVwKQorICAgICAgICAjIworICAgICAgICAjIyBiZWNhdXNlIHRoZXJlIGlzIGEgcmVmZXJlbmNlIHRvIGEgU29ydEtpbGxlciBpbiB0aGUKKyAgICAgICAgIyMgdHJhY2ViYWNrIGFuZCBieSB0aGUgdGltZSBpdCBkaWVzIHdlJ3JlIG91dHNpZGUgdGhlIGNhbGwgdG8KKyAgICAgICAgIyMgLnNvcnQoKSBhbmQgc28gdGhlIGxpc3QgcHJvdGVjdGlvbiBnaW1taWNrcyBhcmUgb3V0IG9mCisgICAgICAgICMjIGRhdGUgKHRoaXMgY29zdCBzb21lIGJyYWluIGNlbGxzIHRvIGZpZ3VyZSBvdXQuLi4pLgorCisgICAgZGVmIHRlc3RfcmV2ZXJzZShzZWxmKToKKyAgICAgICAgZGF0YSA9IHJhbmdlKDEwMCkKKyAgICAgICAgcmFuZG9tLnNodWZmbGUoZGF0YSkKKyAgICAgICAgZGF0YS5zb3J0KHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCByYW5nZSg5OSwtMSwtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGF0YS5zb3J0LCAid3JvbmcgdHlwZSIpCisKKyAgICBkZWYgdGVzdF9yZXZlcnNlX3N0YWJpbGl0eShzZWxmKToKKyAgICAgICAgZGF0YSA9IFsocmFuZG9tLnJhbmRyYW5nZSgxMDApLCBpKSBmb3IgaSBpbiB4cmFuZ2UoMjAwKV0KKyAgICAgICAgY29weTEgPSBkYXRhWzpdCisgICAgICAgIGNvcHkyID0gZGF0YVs6XQorICAgICAgICBkYXRhLnNvcnQoY21wPWxhbWJkYSB4LHk6IGNtcCh4WzBdLHlbMF0pLCByZXZlcnNlPVRydWUpCisgICAgICAgIGNvcHkxLnNvcnQoY21wPWxhbWJkYSB4LHk6IGNtcCh5WzBdLHhbMF0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGNvcHkxKQorICAgICAgICBjb3B5Mi5zb3J0KGtleT1sYW1iZGEgeDogeFswXSwgcmV2ZXJzZT1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGNvcHkyKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X2NsYXNzZXMgPSAoCisgICAgICAgIFRlc3RCYXNlLAorICAgICAgICBUZXN0RGVjb3JhdGVTb3J0VW5kZWNvcmF0ZSwKKyAgICAgICAgVGVzdEJ1Z3MsCisgICAgKQorCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgidGhlIGNtcCBhcmd1bWVudCBpcyBub3Qgc3VwcG9ydGVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKworICAgICAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICAgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgIHByaW50IGNvdW50cworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb3J0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Y2M4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb3J0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Y2M4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zcWxpdGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zcWxpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyNzMzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NxbGl0ZS5weQpAQCAtMCwwICsxLDE2IEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUKKworIyBTa2lwIHRlc3QgaWYgX3NxbGl0ZTMgbW9kdWxlIHdhcyBub3QgYnVpbHQuCitpbXBvcnRfbW9kdWxlKCdfc3FsaXRlMycpCisKK2Zyb20gc3FsaXRlMy50ZXN0IGltcG9ydCAoZGJhcGksIHR5cGVzLCB1c2VyZnVuY3Rpb25zLCBweTI1dGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnksIHRyYW5zYWN0aW9ucywgaG9va3MsIHJlZ3Jlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXApCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoZGJhcGkuc3VpdGUoKSwgdHlwZXMuc3VpdGUoKSwgdXNlcmZ1bmN0aW9ucy5zdWl0ZSgpLAorICAgICAgICAgICAgICAgICBweTI1dGVzdHMuc3VpdGUoKSwgZmFjdG9yeS5zdWl0ZSgpLCB0cmFuc2FjdGlvbnMuc3VpdGUoKSwKKyAgICAgICAgICAgICAgICAgaG9va3Muc3VpdGUoKSwgcmVncmVzc2lvbi5zdWl0ZSgpLCBkdW1wLnN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NxbGl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zcWxpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjc1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zcWxpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NxbGl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zcWxpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMjc1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zcWxpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NzbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NzbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTUyMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3NsLnB5CkBAIC0wLDAgKzEsMTM5NCBAQAorIyBUZXN0IHRoZSBzdXBwb3J0IGZvciBTU0wgYW5kIHNvY2tldHMKKworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IGFzeW5jb3JlCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc2VsZWN0CitpbXBvcnQgdGltZQoraW1wb3J0IGdjCitpbXBvcnQgb3MKK2ltcG9ydCBlcnJubworaW1wb3J0IHBwcmludAoraW1wb3J0IHVybGxpYiwgdXJscGFyc2UKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCB3ZWFrcmVmCitpbXBvcnQgZnVuY3Rvb2xzCitpbXBvcnQgcGxhdGZvcm0KKworZnJvbSBCYXNlSFRUUFNlcnZlciBpbXBvcnQgSFRUUFNlcnZlcgorZnJvbSBTaW1wbGVIVFRQU2VydmVyIGltcG9ydCBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIKKworc3NsID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoInNzbCIpCisKK0hPU1QgPSB0ZXN0X3N1cHBvcnQuSE9TVAorQ0VSVEZJTEUgPSBOb25lCitTVk5fUFlUSE9OX09SR19ST09UX0NFUlQgPSBOb25lCisKK2RlZiBoYW5kbGVfZXJyb3IocHJlZml4KToKKyAgICBleGNfZm9ybWF0ID0gJyAnLmpvaW4odHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb24oKnN5cy5leGNfaW5mbygpKSkKKyAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZShwcmVmaXggKyBleGNfZm9ybWF0KQorCisKK2NsYXNzIEJhc2ljVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc3Nsd3JhcF9zaW1wbGUoc2VsZik6CisgICAgICAgICMgQSBjcnVkZSB0ZXN0IGZvciB0aGUgbGVnYWN5IEFQSQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzc2wuc3Nsd3JhcF9zaW1wbGUoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSAzMjogIyBicm9rZW4gcGlwZSB3aGVuIHNzbF9zb2NrLmRvX2hhbmRzaGFrZSgpLCB0aGlzIHRlc3QgZG9lc24ndCBjYXJlIGFib3V0IHRoYXQKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNzbC5zc2x3cmFwX3NpbXBsZShzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKS5fc29jaykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vID09IDMyOiAjIGJyb2tlbiBwaXBlIHdoZW4gc3NsX3NvY2suZG9faGFuZHNoYWtlKCksIHRoaXMgdGVzdCBkb2Vzbid0IGNhcmUgYWJvdXQgdGhhdAorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKworIyBJc3N1ZSAjOTQxNTogVWJ1bnR1IGhpamFja3MgdGhlaXIgT3BlblNTTCBhbmQgZm9yY2VmdWxseSBkaXNhYmxlcyBTU0x2MgorZGVmIHNraXBfaWZfYnJva2VuX3VidW50dV9zc2woZnVuYyk6CisgICAgaWYgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9TU0x2MicpOgorICAgICAgICAjIFdlIG5lZWQgdG8gYWNjZXNzIHRoZSBsb3dlci1sZXZlbCB3cmFwcGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhbgorICAgICAgICAjIGltcGxpY2l0IFNTTCBjb250ZXh0IHdpdGhvdXQgdHJ5aW5nIHRvIGNvbm5lY3Qgb3IgbGlzdGVuLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgX3NzbAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAjIFRoZSByZXR1cm5lZCBmdW5jdGlvbiB3b24ndCBnZXQgZXhlY3V0ZWQsIGp1c3QgaWdub3JlIHRoZSBlcnJvcgorICAgICAgICAgICAgcGFzcworICAgICAgICBAZnVuY3Rvb2xzLndyYXBzKGZ1bmMpCisgICAgICAgIGRlZiBmKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgICAgICAgICAgX3NzbC5zc2x3cmFwKHMuX3NvY2ssIDAsIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC5DRVJUX05PTkUsIHNzbC5QUk9UT0NPTF9TU0x2MiwgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBpZiAoc3NsLk9QRU5TU0xfVkVSU0lPTl9JTkZPID09ICgwLCA5LCA4LCAxNSwgMTUpIGFuZAorICAgICAgICAgICAgICAgICAgICBwbGF0Zm9ybS5saW51eF9kaXN0cmlidXRpb24oKSA9PSAoJ2RlYmlhbicsICdzcXVlZXplL3NpZCcsICcnKQorICAgICAgICAgICAgICAgICAgICBhbmQgJ0ludmFsaWQgU1NMIHByb3RvY29sIHZhcmlhbnQgc3BlY2lmaWVkJyBpbiBzdHIoZSkpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiUGF0Y2hlZCBVYnVudHUgT3BlblNTTCBicmVha3MgYmVoYXZpb3VyIikKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgcmV0dXJuIGYKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gZnVuYworCisKK2NsYXNzIEJhc2ljU29ja2V0VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY29uc3RhbnRzKHNlbGYpOgorICAgICAgICAjc3NsLlBST1RPQ09MX1NTTHYyCisgICAgICAgIHNzbC5QUk9UT0NPTF9TU0x2MjMKKyAgICAgICAgc3NsLlBST1RPQ09MX1NTTHYzCisgICAgICAgIHNzbC5QUk9UT0NPTF9UTFN2MQorICAgICAgICBzc2wuQ0VSVF9OT05FCisgICAgICAgIHNzbC5DRVJUX09QVElPTkFMCisgICAgICAgIHNzbC5DRVJUX1JFUVVJUkVECisKKyAgICBkZWYgdGVzdF9yYW5kb20oc2VsZik6CisgICAgICAgIHYgPSBzc2wuUkFORF9zdGF0dXMoKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuIFJBTkRfc3RhdHVzIGlzICVkICglcylcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodiwgKHYgYW5kICJzdWZmaWNpZW50IHJhbmRvbW5lc3MiKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdWZmaWNpZW50IHJhbmRvbW5lc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzc2wuUkFORF9lZ2QsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3NsLlJBTkRfZWdkLCAnZm9vJywgMSkKKyAgICAgICAgc3NsLlJBTkRfYWRkKCJ0aGlzIGlzIGEgcmFuZG9tIHN0cmluZyIsIDc1LjApCisKKyAgICBkZWYgdGVzdF9wYXJzZV9jZXJ0KHNlbGYpOgorICAgICAgICAjIG5vdGUgdGhhdCB0aGlzIHVzZXMgYW4gJ3Vub2ZmaWNpYWwnIGZ1bmN0aW9uIGluIF9zc2wuYywKKyAgICAgICAgIyBwcm92aWRlZCBzb2xlbHkgZm9yIHRoaXMgdGVzdCwgdG8gZXhlcmNpc2UgdGhlIGNlcnRpZmljYXRlCisgICAgICAgICMgcGFyc2luZyBjb2RlCisgICAgICAgIHAgPSBzc2wuX3NzbC5fdGVzdF9kZWNvZGVfY2VydChDRVJURklMRSwgRmFsc2UpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iICsgcHByaW50LnBmb3JtYXQocCkgKyAiXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbJ3N1YmplY3QnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCgnY291bnRyeU5hbWUnLCAnWFknKSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKCdsb2NhbGl0eU5hbWUnLCAnQ2FzdGxlIEFudGhyYXgnKSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKCdvcmdhbml6YXRpb25OYW1lJywgJ1B5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uJyksKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCgnY29tbW9uTmFtZScsICdsb2NhbGhvc3QnKSwpKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbJ3N1YmplY3RBbHROYW1lJ10sICgoJ0ROUycsICdsb2NhbGhvc3QnKSwpKQorICAgICAgICAjIElzc3VlICMxMzAzNDogdGhlIHN1YmplY3RBbHROYW1lIGluIHNvbWUgY2VydGlmaWNhdGVzCisgICAgICAgICMgKG5vdGFibHkgcHJvamVjdHMuZGV2ZWxvcGVyLm5va2lhLmNvbTo0NDMpIHdhc24ndCBwYXJzZWQKKyAgICAgICAgcCA9IHNzbC5fc3NsLl90ZXN0X2RlY29kZV9jZXJ0KE5PS0lBQ0VSVCkKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiIgKyBwcHJpbnQucGZvcm1hdChwKSArICJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFsnc3ViamVjdEFsdE5hbWUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKCdETlMnLCAncHJvamVjdHMuZGV2ZWxvcGVyLm5va2lhLmNvbScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0ROUycsICdwcm9qZWN0cy5mb3J1bS5ub2tpYS5jb20nKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X0RFUl90b19QRU0oc2VsZik6CisgICAgICAgIHdpdGggb3BlbihTVk5fUFlUSE9OX09SR19ST09UX0NFUlQsICdyJykgYXMgZjoKKyAgICAgICAgICAgIHBlbSA9IGYucmVhZCgpCisgICAgICAgIGQxID0gc3NsLlBFTV9jZXJ0X3RvX0RFUl9jZXJ0KHBlbSkKKyAgICAgICAgcDIgPSBzc2wuREVSX2NlcnRfdG9fUEVNX2NlcnQoZDEpCisgICAgICAgIGQyID0gc3NsLlBFTV9jZXJ0X3RvX0RFUl9jZXJ0KHAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCBkMikKKyAgICAgICAgaWYgbm90IHAyLnN0YXJ0c3dpdGgoc3NsLlBFTV9IRUFERVIgKyAnXG4nKToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiREVSLXRvLVBFTSBkaWRuJ3QgaW5jbHVkZSBjb3JyZWN0IGhlYWRlcjpcbiVyXG4iICUgcDIpCisgICAgICAgIGlmIG5vdCBwMi5lbmRzd2l0aCgnXG4nICsgc3NsLlBFTV9GT09URVIgKyAnXG4nKToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiREVSLXRvLVBFTSBkaWRuJ3QgaW5jbHVkZSBjb3JyZWN0IGZvb3RlcjpcbiVyXG4iICUgcDIpCisKKyAgICBkZWYgdGVzdF9vcGVuc3NsX3ZlcnNpb24oc2VsZik6CisgICAgICAgIG4gPSBzc2wuT1BFTlNTTF9WRVJTSU9OX05VTUJFUgorICAgICAgICB0ID0gc3NsLk9QRU5TU0xfVkVSU0lPTl9JTkZPCisgICAgICAgIHMgPSBzc2wuT1BFTlNTTF9WRVJTSU9OCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShuLCAoaW50LCBsb25nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHQsIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocywgc3RyKQorICAgICAgICAjIFNvbWUgc2FuaXR5IGNoZWNrcyBmb2xsb3cKKyAgICAgICAgIyA+PSAwLjkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobiwgMHg5MDAwMDApCisgICAgICAgICMgPCAyLjAKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKG4sIDB4MjAwMDAwMDApCisgICAgICAgIG1ham9yLCBtaW5vciwgZml4LCBwYXRjaCwgc3RhdHVzID0gdAorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChtYWpvciwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKG1ham9yLCAyKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChtaW5vciwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKG1pbm9yLCAyNTYpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGZpeCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKGZpeCwgMjU2KQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChwYXRjaCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwocGF0Y2gsIDI2KQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChzdGF0dXMsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHN0YXR1cywgMTUpCisgICAgICAgICMgVmVyc2lvbiBzdHJpbmcgYXMgcmV0dXJuZWQgYnkgT3BlblNTTCwgdGhlIGZvcm1hdCBtaWdodCBjaGFuZ2UKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgiT3BlblNTTCB7OmR9Lns6ZH0uezpkfSIuZm9ybWF0KG1ham9yLCBtaW5vciwgZml4KSksCisgICAgICAgICAgICAgICAgICAgICAgICAocywgdCkpCisKKyAgICBkZWYgdGVzdF9jaXBoZXJzKHNlbGYpOgorICAgICAgICBpZiBub3QgdGVzdF9zdXBwb3J0LmlzX3Jlc291cmNlX2VuYWJsZWQoJ25ldHdvcmsnKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByZW1vdGUgPSAoInN2bi5weXRob24ub3JnIiwgNDQzKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQocmVtb3RlWzBdKToKKyAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJBTEwiKQorICAgICAgICAgICAgcy5jb25uZWN0KHJlbW90ZSkKKyAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJERUZBVUxUIikKKyAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCisgICAgICAgICAgICAjIEVycm9yIGNoZWNraW5nIG9jY3VycyB3aGVuIGNvbm5lY3RpbmcsIGJlY2F1c2UgdGhlIFNTTCBjb250ZXh0CisgICAgICAgICAgICAjIGlzbid0IGNyZWF0ZWQgYmVmb3JlLgorICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsIGNpcGhlcnM9Il4kOiw7PyonZG9yb3RoeXgiKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChzc2wuU1NMRXJyb3IsICJObyBjaXBoZXIgY2FuIGJlIHNlbGVjdGVkIik6CisgICAgICAgICAgICAgICAgcy5jb25uZWN0KHJlbW90ZSkKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfcmVmY3ljbGUoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzc5NDM6IGFuIFNTTCBvYmplY3QgZG9lc24ndCBjcmVhdGUgcmVmZXJlbmNlIGN5Y2xlcyB3aXRoCisgICAgICAgICMgaXRzZWxmLgorICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgc3MgPSBzc2wud3JhcF9zb2NrZXQocykKKyAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZihzcykKKyAgICAgICAgZGVsIHNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3IoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3dyYXBwZWRfdW5jb25uZWN0ZWQoc2VsZik6CisgICAgICAgICMgVGhlIF9kZWxlZ2F0ZV9tZXRob2RzIGluIHNvY2tldC5weSBhcmUgY29ycmVjdGx5IGRlbGVnYXRlZCB0byBieSBhbgorICAgICAgICAjIHVuY29ubmVjdGVkIFNTTFNvY2tldCwgc28gdGhleSB3aWxsIHJhaXNlIGEgc29ja2V0LmVycm9yIHJhdGhlciB0aGFuCisgICAgICAgICMgc29tZXRoaW5nIHVuZXhwZWN0ZWQgbGlrZSBUeXBlRXJyb3IuCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQorICAgICAgICBzcyA9IHNzbC53cmFwX3NvY2tldChzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNzLnJlY3YsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc3MucmVjdl9pbnRvLCBieXRlYXJyYXkoYid4JykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc3MucmVjdmZyb20sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc3MucmVjdmZyb21faW50bywgYnl0ZWFycmF5KGIneCcpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNzLnNlbmQsIGIneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc3Muc2VuZHRvLCBiJ3gnLCAoJzAuMC4wLjAnLCAwKSkKKworCitjbGFzcyBOZXR3b3JrZWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jb25uZWN0KHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoInN2bi5weXRob24ub3JnIik6CisgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSkKKyAgICAgICAgICAgIHMuY29ubmVjdCgoInN2bi5weXRob24ub3JnIiwgNDQzKSkKKyAgICAgICAgICAgIGMgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgIGlmIGM6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJQZWVyIGNlcnQgJXMgc2hvdWxkbid0IGJlIGhlcmUhIikKKyAgICAgICAgICAgIHMuY2xvc2UoKQorCisgICAgICAgICAgICAjIHRoaXMgc2hvdWxkIGZhaWwgYmVjYXVzZSB3ZSBoYXZlIG5vIHZlcmlmaWNhdGlvbiBjZXJ0cworICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoInN2bi5weXRob24ub3JnIiwgNDQzKSkKKyAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKworICAgICAgICAgICAgIyB0aGlzIHNob3VsZCBzdWNjZWVkIGJlY2F1c2Ugd2Ugc3BlY2lmeSB0aGUgcm9vdCBjZXJ0CisgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVNWTl9QWVRIT05fT1JHX1JPT1RfQ0VSVCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MykpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfY29ubmVjdF9leChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTEzMjY6IGNoZWNrIGNvbm5lY3RfZXgoKSBpbXBsZW1lbnRhdGlvbgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoInN2bi5weXRob24ub3JnIik6CisgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVNWTl9QWVRIT05fT1JHX1JPT1RfQ0VSVCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHMuY29ubmVjdF9leCgoInN2bi5weXRob24ub3JnIiwgNDQzKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9ub25fYmxvY2tpbmdfY29ubmVjdF9leChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTEzMjY6IG5vbi1ibG9ja2luZyBjb25uZWN0X2V4KCkgc2hvdWxkIGFsbG93IGhhbmRzaGFrZQorICAgICAgICAjIHRvIHByb2NlZWQgYWZ0ZXIgdGhlIHNvY2tldCBnZXRzIHJlYWR5LgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoInN2bi5weXRob24ub3JnIik6CisgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVNWTl9QWVRIT05fT1JHX1JPT1RfQ0VSVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9RmFsc2UpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcy5zZXRibG9ja2luZyhGYWxzZSkKKyAgICAgICAgICAgICAgICByYyA9IHMuY29ubmVjdF9leCgoJ3N2bi5weXRob24ub3JnJywgNDQzKSkKKyAgICAgICAgICAgICAgICAjIEVXT1VMREJMT0NLIHVuZGVyIFdpbmRvd3MsIEVJTlBST0dSRVNTIGVsc2V3aGVyZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsICgwLCBlcnJuby5FSU5QUk9HUkVTUywgZXJybm8uRVdPVUxEQkxPQ0spKQorICAgICAgICAgICAgICAgICMgV2FpdCBmb3IgY29ubmVjdCB0byBmaW5pc2gKKyAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtdLCBbc10sIFtdLCA1LjApCisgICAgICAgICAgICAgICAgIyBOb24tYmxvY2tpbmcgaGFuZHNoYWtlCisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xFcnJvciBhcyBlcnI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcnIuYXJnc1swXSA9PSBzc2wuU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtzXSwgW10sIFtdLCA1LjApCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGVyci5hcmdzWzBdID09IHNzbC5TU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtdLCBbc10sIFtdLCA1LjApCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgIyBTU0wgZXN0YWJsaXNoZWQKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5nZXRwZWVyY2VydCgpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3RpbWVvdXRfY29ubmVjdF9leChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTIwNjU6IG9uIGEgdGltZW91dCwgY29ubmVjdF9leCgpIHNob3VsZCByZXR1cm4gdGhlIG9yaWdpbmFsCisgICAgICAgICMgZXJybm8gKG1pbWlja2luZyB0aGUgYmVoYXZpb3VyIG9mIG5vbi1TU0wgc29ja2V0cykuCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgic3ZuLnB5dGhvbi5vcmciKToKKyAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9U1ZOX1BZVEhPTl9PUkdfUk9PVF9DRVJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzLnNldHRpbWVvdXQoMC4wMDAwMDAxKQorICAgICAgICAgICAgICAgIHJjID0gcy5jb25uZWN0X2V4KCgnc3ZuLnB5dGhvbi5vcmcnLCA0NDMpKQorICAgICAgICAgICAgICAgIGlmIHJjID09IDA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInN2bi5weXRob24ub3JnIHJlc3BvbmRlZCB0b28gcXVpY2tseSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihyYywgKGVycm5vLkVBR0FJTiwgZXJybm8uRVdPVUxEQkxPQ0spKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2Nvbm5lY3RfZXhfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgic3ZuLnB5dGhvbi5vcmciKToKKyAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9U1ZOX1BZVEhPTl9PUkdfUk9PVF9DRVJUKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJybm8uRUNPTk5SRUZVU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jb25uZWN0X2V4KCgic3ZuLnB5dGhvbi5vcmciLCA0NDQpKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKG9zLm5hbWUgPT0gIm50IiwgIkNhbid0IHVzZSBhIHNvY2tldCBhcyBhIGZpbGUgdW5kZXIgV2luZG93cyIpCisgICAgZGVmIHRlc3RfbWFrZWZpbGVfY2xvc2Uoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzUyMzg6IGNyZWF0aW5nIGEgZmlsZS1saWtlIG9iamVjdCB3aXRoIG1ha2VmaWxlKCkgc2hvdWxkbid0CisgICAgICAgICMgZGVsYXkgY2xvc2luZyB0aGUgdW5kZXJseWluZyAicmVhbCBzb2NrZXQiIChoZXJlIHRlc3RlZCB3aXRoIGl0cworICAgICAgICAjIGZpbGUgZGVzY3JpcHRvciwgaGVuY2Ugc2tpcHBpbmcgdGhlIHRlc3QgdW5kZXIgV2luZG93cykuCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgic3ZuLnB5dGhvbi5vcmciKToKKyAgICAgICAgICAgIHNzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQorICAgICAgICAgICAgc3MuY29ubmVjdCgoInN2bi5weXRob24ub3JnIiwgNDQzKSkKKyAgICAgICAgICAgIGZkID0gc3MuZmlsZW5vKCkKKyAgICAgICAgICAgIGYgPSBzcy5tYWtlZmlsZSgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICMgVGhlIGZkIGlzIHN0aWxsIG9wZW4KKyAgICAgICAgICAgIG9zLnJlYWQoZmQsIDApCisgICAgICAgICAgICAjIENsb3NpbmcgdGhlIFNTTCBzb2NrZXQgc2hvdWxkIGNsb3NlIHRoZSBmZCB0b28KKyAgICAgICAgICAgIHNzLmNsb3NlKCkKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBlOgorICAgICAgICAgICAgICAgIG9zLnJlYWQoZmQsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FQkFERikKKworICAgIGRlZiB0ZXN0X25vbl9ibG9ja2luZ19oYW5kc2hha2Uoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgic3ZuLnB5dGhvbi5vcmciKToKKyAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQorICAgICAgICAgICAgcy5jb25uZWN0KCgic3ZuLnB5dGhvbi5vcmciLCA0NDMpKQorICAgICAgICAgICAgcy5zZXRibG9ja2luZyhGYWxzZSkKKyAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQorICAgICAgICAgICAgY291bnQgPSAwCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgICAgICAgICBzLmRvX2hhbmRzaGFrZSgpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgICAgICBpZiBlcnIuYXJnc1swXSA9PSBzc2wuU1NMX0VSUk9SX1dBTlRfUkVBRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QoW3NdLCBbXSwgW10pCisgICAgICAgICAgICAgICAgICAgIGVsaWYgZXJyLmFyZ3NbMF0gPT0gc3NsLlNTTF9FUlJPUl9XQU5UX1dSSVRFOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbXSwgW3NdLCBbXSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuTmVlZGVkICVkIGNhbGxzIHRvIGRvX2hhbmRzaGFrZSgpIHRvIGVzdGFibGlzaCBzZXNzaW9uLlxuIiAlIGNvdW50KQorCisgICAgZGVmIHRlc3RfZ2V0X3NlcnZlcl9jZXJ0aWZpY2F0ZShzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCJzdm4ucHl0aG9uLm9yZyIpOgorICAgICAgICAgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MykpCisgICAgICAgICAgICBpZiBub3QgcGVtOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gc2VydmVyIGNlcnRpZmljYXRlIG9uIHN2bi5weXRob24ub3JnOjQ0MyEiKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MyksIGNhX2NlcnRzPUNFUlRGSUxFKQorICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xFcnJvcjoKKyAgICAgICAgICAgICAgICAjc2hvdWxkIGZhaWwKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiR290IHNlcnZlciBjZXJ0aWZpY2F0ZSAlcyBmb3Igc3ZuLnB5dGhvbi5vcmchIiAlIHBlbSkKKworICAgICAgICAgICAgcGVtID0gc3NsLmdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MyksIGNhX2NlcnRzPVNWTl9QWVRIT05fT1JHX1JPT1RfQ0VSVCkKKyAgICAgICAgICAgIGlmIG5vdCBwZW06CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBzZXJ2ZXIgY2VydGlmaWNhdGUgb24gc3ZuLnB5dGhvbi5vcmc6NDQzISIpCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcblZlcmlmaWVkIGNlcnRpZmljYXRlIGZvciBzdm4ucHl0aG9uLm9yZzo0NDMgaXNcbiVzXG4iICUgcGVtKQorCisgICAgZGVmIHRlc3RfYWxnb3JpdGhtcyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjODQ4NDogYWxsIGFsZ29yaXRobXMgc2hvdWxkIGJlIGF2YWlsYWJsZSB3aGVuIHZlcmlmeWluZyBhCisgICAgICAgICMgY2VydGlmaWNhdGUuCisgICAgICAgICMgU0hBMjU2IHdhcyBhZGRlZCBpbiBPcGVuU1NMIDAuOS44CisgICAgICAgIGlmIHNzbC5PUEVOU1NMX1ZFUlNJT05fSU5GTyA8ICgwLCA5LCA4LCAwLCAxNSk6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJTSEEyNTYgbm90IGF2YWlsYWJsZSBvbiAlciIgJSBzc2wuT1BFTlNTTF9WRVJTSU9OKQorICAgICAgICBzZWxmLnNraXBUZXN0KCJyZW1vdGUgaG9zdCBuZWVkcyBTTkksIG9ubHkgYXZhaWxhYmxlIG9uIFB5dGhvbiAzLjIrIikKKyAgICAgICAgIyBOT1RFOiBodHRwczovL3NoYTIuaGJvZWNrLmRlIGlzIGFub3RoZXIgcG9zc2libGUgdGVzdCBob3N0CisgICAgICAgIHJlbW90ZSA9ICgic2hhMjU2LnRicy1pbnRlcm5ldC5jb20iLCA0NDMpCisgICAgICAgIHNoYTI1Nl9jZXJ0ID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJzaGEyNTYucGVtIikKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCJzaGEyNTYudGJzLWludGVybmV0LmNvbSIpOgorICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1zaGEyNTZfY2VydCwpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcy5jb25uZWN0KHJlbW90ZSkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5DaXBoZXIgd2l0aCAlciBpcyAlclxuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW90ZSwgcy5jaXBoZXIoKSkpCisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIkNlcnRpZmljYXRlIGlzOlxuJXNcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwcmludC5wZm9ybWF0KHMuZ2V0cGVlcmNlcnQoKSkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorCisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX2hhdmVfdGhyZWFkcyA9IEZhbHNlCitlbHNlOgorICAgIF9oYXZlX3RocmVhZHMgPSBUcnVlCisKKyAgICBjbGFzcyBUaHJlYWRlZEVjaG9TZXJ2ZXIodGhyZWFkaW5nLlRocmVhZCk6CisKKyAgICAgICAgY2xhc3MgQ29ubmVjdGlvbkhhbmRsZXIodGhyZWFkaW5nLlRocmVhZCk6CisKKyAgICAgICAgICAgICIiIkEgbWlsZGx5IGNvbXBsaWNhdGVkIGNsYXNzLCBiZWNhdXNlIHdlIHdhbnQgaXQgdG8gd29yayBib3RoCisgICAgICAgICAgICB3aXRoIGFuZCB3aXRob3V0IHRoZSBTU0wgd3JhcHBlciBhcm91bmQgdGhlIHNvY2tldCBjb25uZWN0aW9uLCBzbworICAgICAgICAgICAgdGhhdCB3ZSBjYW4gdGVzdCB0aGUgU1RBUlRUTFMgZnVuY3Rpb25hbGl0eS4iIiIKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlciwgY29ubnNvY2spOgorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyID0gc2VydmVyCisgICAgICAgICAgICAgICAgc2VsZi5ydW5uaW5nID0gRmFsc2UKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBjb25uc29jaworICAgICAgICAgICAgICAgIHNlbGYuc29jay5zZXRibG9ja2luZygxKQorICAgICAgICAgICAgICAgIHNlbGYuc3NsY29ubiA9IE5vbmUKKyAgICAgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5kYWVtb24gPSBUcnVlCisKKyAgICAgICAgICAgIGRlZiBzaG93X2Nvbm5fZGV0YWlscyhzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNlcnZlci5jZXJ0cmVxcyA9PSBzc2wuQ0VSVF9SRVFVSVJFRDoKKyAgICAgICAgICAgICAgICAgICAgY2VydCA9IHNlbGYuc3NsY29ubi5nZXRwZWVyY2VydCgpCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlIGFuZCBzZWxmLnNlcnZlci5jaGF0dHk6CisgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgY2xpZW50IGNlcnQgaXMgIiArIHBwcmludC5wZm9ybWF0KGNlcnQpICsgIlxuIikKKyAgICAgICAgICAgICAgICAgICAgY2VydF9iaW5hcnkgPSBzZWxmLnNzbGNvbm4uZ2V0cGVlcmNlcnQoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2UgYW5kIHNlbGYuc2VydmVyLmNoYXR0eToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiBjZXJ0IGJpbmFyeSBpcyAiICsgc3RyKGxlbihjZXJ0X2JpbmFyeSkpICsgIiBieXRlc1xuIikKKyAgICAgICAgICAgICAgICBjaXBoZXIgPSBzZWxmLnNzbGNvbm4uY2lwaGVyKCkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZSBhbmQgc2VsZi5zZXJ2ZXIuY2hhdHR5OgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgc2VydmVyOiBjb25uZWN0aW9uIGNpcGhlciBpcyBub3cgIiArIHN0cihjaXBoZXIpICsgIlxuIikKKworICAgICAgICAgICAgZGVmIHdyYXBfY29ubihzZWxmKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsY29ubiA9IHNzbC53cmFwX3NvY2tldChzZWxmLnNvY2ssIHNlcnZlcl9zaWRlPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0ZmlsZT1zZWxmLnNlcnZlci5jZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNlbGYuc2VydmVyLnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9c2VsZi5zZXJ2ZXIuY2FjZXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zZWxmLnNlcnZlci5jZXJ0cmVxcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9c2VsZi5zZXJ2ZXIuY2lwaGVycykKKyAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICMgWFhYIFZhcmlvdXMgZXJyb3JzIGNhbiBoYXZlIGhhcHBlbmVkIGhlcmUsIGZvciBleGFtcGxlCisgICAgICAgICAgICAgICAgICAgICMgYSBtaXNtYXRjaGluZyBwcm90b2NvbCB2ZXJzaW9uLCBhbiBpbnZhbGlkIGNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAjIG9yIGEgbG93LWxldmVsIGJ1Zy4gVGhpcyBzaG91bGQgYmUgbWFkZSBtb3JlIGRpc2NyaW1pbmF0aW5nLgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5jb25uX2Vycm9ycy5hcHBlbmQoZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zZXJ2ZXIuY2hhdHR5OgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlX2Vycm9yKCJcbiBzZXJ2ZXI6ICBiYWQgY29ubmVjdGlvbiBhdHRlbXB0IGZyb20gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKHNlbGYuc29jay5nZXRwZWVybmFtZSgpKSArICI6XG4iKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5ydW5uaW5nID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgIGRlZiByZWFkKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3NsY29ubjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3NsY29ubi5yZWFkKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zb2NrLnJlY3YoMTAyNCkKKworICAgICAgICAgICAgZGVmIHdyaXRlKHNlbGYsIGJ5dGVzKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNzbGNvbm46CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNzbGNvbm4ud3JpdGUoYnl0ZXMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc29jay5zZW5kKGJ5dGVzKQorCisgICAgICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zc2xjb25uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNzbGNvbm4uY2xvc2UoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc29jay5fc29jay5jbG9zZSgpCisKKyAgICAgICAgICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5ydW5uaW5nID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnNlcnZlci5zdGFydHRsc19zZXJ2ZXI6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5zb2NrLCBzc2wuU1NMU29ja2V0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsY29ubiA9IHNlbGYuc29jaworICAgICAgICAgICAgICAgICAgICBlbGlmIG5vdCBzZWxmLndyYXBfY29ubigpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2hvd19jb25uX2RldGFpbHMoKQorICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYucnVubmluZzoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gc2VsZi5yZWFkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtc2c6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBlb2YsIHNvIHF1aXQgdGhpcyBoYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ydW5uaW5nID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbXNnLnN0cmlwKCkgPT0gJ292ZXInOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlIGFuZCBzZWxmLnNlcnZlci5jb25uZWN0aW9uY2hhdHR5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgc2VydmVyOiBjbGllbnQgY2xvc2VkIGNvbm5lY3Rpb25cbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYuc2VydmVyLnN0YXJ0dGxzX3NlcnZlciBhbmQgbXNnLnN0cmlwKCkgPT0gJ1NUQVJUVExTJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZSBhbmQgc2VsZi5zZXJ2ZXIuY29ubmVjdGlvbmNoYXR0eToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIHNlcnZlcjogcmVhZCBTVEFSVFRMUyBmcm9tIGNsaWVudCwgc2VuZGluZyBPSy4uLlxuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCJPS1xuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi53cmFwX2Nvbm4oKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYuc2VydmVyLnN0YXJ0dGxzX3NlcnZlciBhbmQgc2VsZi5zc2xjb25uIGFuZCBtc2cuc3RyaXAoKSA9PSAnRU5EVExTJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZSBhbmQgc2VsZi5zZXJ2ZXIuY29ubmVjdGlvbmNoYXR0eToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIHNlcnZlcjogcmVhZCBFTkRUTFMgZnJvbSBjbGllbnQsIHNlbmRpbmcgT0suLi5cbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiT0tcbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xjb25uLnVud3JhcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xjb25uID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlIGFuZCBzZWxmLnNlcnZlci5jb25uZWN0aW9uY2hhdHR5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgc2VydmVyOiBjb25uZWN0aW9uIGlzIG5vdyB1bmVuY3J5cHRlZC4uLlxuIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlc3Rfc3VwcG9ydC52ZXJib3NlIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5jb25uZWN0aW9uY2hhdHR5KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGUgPSAoc2VsZi5zc2xjb25uIGFuZCAiZW5jcnlwdGVkIikgb3IgInVuZW5jcnlwdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgc2VydmVyOiByZWFkICVzICglcyksIHNlbmRpbmcgYmFjayAlcyAoJXMpLi4uXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAocmVwcihtc2cpLCBjdHlwZSwgcmVwcihtc2cubG93ZXIoKSksIGN0eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKG1zZy5sb3dlcigpKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zZXJ2ZXIuY2hhdHR5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9lcnJvcigiVGVzdCBzZXJ2ZXIgZmFpbHVyZTpcbiIpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnVubmluZyA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAjIG5vcm1hbGx5LCB3ZSdkIGp1c3Qgc3RvcCBoZXJlLCBidXQgZm9yIHRoZSB0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAjIGhhcm5lc3MsIHdlIHdhbnQgdG8gc3RvcCB0aGUgc2VydmVyCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY2VydGlmaWNhdGUsIHNzbF92ZXJzaW9uPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBjZXJ0cmVxcz1Ob25lLCBjYWNlcnRzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBjaGF0dHk9VHJ1ZSwgY29ubmVjdGlvbmNoYXR0eT1GYWxzZSwgc3RhcnR0bHNfc2VydmVyPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgd3JhcF9hY2NlcHRpbmdfc29ja2V0PUZhbHNlLCBjaXBoZXJzPU5vbmUpOgorCisgICAgICAgICAgICBpZiBzc2xfdmVyc2lvbiBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uID0gc3NsLlBST1RPQ09MX1RMU3YxCisgICAgICAgICAgICBpZiBjZXJ0cmVxcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNlcnRyZXFzID0gc3NsLkNFUlRfTk9ORQorICAgICAgICAgICAgc2VsZi5jZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlCisgICAgICAgICAgICBzZWxmLnByb3RvY29sID0gc3NsX3ZlcnNpb24KKyAgICAgICAgICAgIHNlbGYuY2VydHJlcXMgPSBjZXJ0cmVxcworICAgICAgICAgICAgc2VsZi5jYWNlcnRzID0gY2FjZXJ0cworICAgICAgICAgICAgc2VsZi5jaXBoZXJzID0gY2lwaGVycworICAgICAgICAgICAgc2VsZi5jaGF0dHkgPSBjaGF0dHkKKyAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbmNoYXR0eSA9IGNvbm5lY3Rpb25jaGF0dHkKKyAgICAgICAgICAgIHNlbGYuc3RhcnR0bHNfc2VydmVyID0gc3RhcnR0bHNfc2VydmVyCisgICAgICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgICAgIHNlbGYuZmxhZyA9IE5vbmUKKyAgICAgICAgICAgIGlmIHdyYXBfYWNjZXB0aW5nX3NvY2tldDoKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBzc2wud3JhcF9zb2NrZXQoc2VsZi5zb2NrLCBzZXJ2ZXJfc2lkZT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0ZmlsZT1zZWxmLmNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXMgPSBzZWxmLmNlcnRyZXFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cyA9IHNlbGYuY2FjZXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb24gPSBzZWxmLnByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJzID0gc2VsZi5jaXBoZXJzKQorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlIGFuZCBzZWxmLmNoYXR0eToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnIHNlcnZlcjogIHdyYXBwZWQgc2VydmVyIHNvY2tldCBhcyAlc1xuJyAlIHN0cihzZWxmLnNvY2spKQorICAgICAgICAgICAgc2VsZi5wb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZWxmLnNvY2spCisgICAgICAgICAgICBzZWxmLmFjdGl2ZSA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLmNvbm5fZXJyb3JzID0gW10KKyAgICAgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgIHNlbGYuZGFlbW9uID0gVHJ1ZQorCisgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICBzZWxmLnN0YXJ0KHRocmVhZGluZy5FdmVudCgpKQorICAgICAgICAgICAgc2VsZi5mbGFnLndhaXQoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgc2VsZi5zdG9wKCkKKyAgICAgICAgICAgIHNlbGYuam9pbigpCisKKyAgICAgICAgZGVmIHN0YXJ0KHNlbGYsIGZsYWc9Tm9uZSk6CisgICAgICAgICAgICBzZWxmLmZsYWcgPSBmbGFnCisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLnN0YXJ0KHNlbGYpCisKKyAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDAuMDUpCisgICAgICAgICAgICBzZWxmLnNvY2subGlzdGVuKDUpCisgICAgICAgICAgICBzZWxmLmFjdGl2ZSA9IFRydWUKKyAgICAgICAgICAgIGlmIHNlbGYuZmxhZzoKKyAgICAgICAgICAgICAgICAjIHNpZ25hbCBhbiBldmVudAorICAgICAgICAgICAgICAgIHNlbGYuZmxhZy5zZXQoKQorICAgICAgICAgICAgd2hpbGUgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBuZXdjb25uLCBjb25uYWRkciA9IHNlbGYuc29jay5hY2NlcHQoKQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZSBhbmQgc2VsZi5jaGF0dHk6CisgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCcgc2VydmVyOiAgbmV3IGNvbm5lY3Rpb24gZnJvbSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc3RyKGNvbm5hZGRyKSArICdcbicpCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBzZWxmLkNvbm5lY3Rpb25IYW5kbGVyKHNlbGYsIG5ld2Nvbm4pCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuc3RhcnQoKQorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLmpvaW4oKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdG9wKCkKKyAgICAgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCisKKyAgICAgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZSA9IEZhbHNlCisKKyAgICBjbGFzcyBBc3luY29yZUVjaG9TZXJ2ZXIodGhyZWFkaW5nLlRocmVhZCk6CisKKyAgICAgICAgY2xhc3MgRWNob1NlcnZlcihhc3luY29yZS5kaXNwYXRjaGVyKToKKworICAgICAgICAgICAgY2xhc3MgQ29ubmVjdGlvbkhhbmRsZXIoYXN5bmNvcmUuZGlzcGF0Y2hlcl93aXRoX3NlbmQpOgorCisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4sIGNlcnRmaWxlKToKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNvcmUuZGlzcGF0Y2hlcl93aXRoX3NlbmQuX19pbml0X18oc2VsZiwgY29ubikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQgPSBzc2wud3JhcF9zb2NrZXQoY29ubiwgc2VydmVyX3NpZGU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9Y2VydGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zc2xfYWNjZXB0aW5nID0gVHJ1ZQorCisgICAgICAgICAgICAgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuc29ja2V0LCBzc2wuU1NMU29ja2V0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYuc29ja2V0LnBlbmRpbmcoKSA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfcmVhZF9ldmVudCgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgICAgICBkZWYgX2RvX3NzbF9oYW5kc2hha2Uoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0LmRvX2hhbmRzaGFrZSgpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdIGluIChzc2wuU1NMX0VSUk9SX1dBTlRfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wuU1NMX0VSUk9SX1dBTlRfV1JJVEUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBlcnIuYXJnc1swXSA9PSBzc2wuU1NMX0VSUk9SX0VPRjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGVfY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXJyLmFyZ3NbMF0gPT0gZXJybm8uRUNPTk5BQk9SVEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZV9jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zc2xfYWNjZXB0aW5nID0gRmFsc2UKKworICAgICAgICAgICAgICAgIGRlZiBoYW5kbGVfcmVhZChzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fc3NsX2FjY2VwdGluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RvX3NzbF9oYW5kc2hha2UoKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYucmVjdigxMDI0KQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGF0YSBhbmQgZGF0YS5zdHJpcCgpICE9ICdvdmVyJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmQoZGF0YS5sb3dlcigpKQorCisgICAgICAgICAgICAgICAgZGVmIGhhbmRsZV9jbG9zZShzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIHNlcnZlcjogIGNsb3NlZCBjb25uZWN0aW9uICVzXG4iICUgc2VsZi5zb2NrZXQpCisKKyAgICAgICAgICAgICAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY2VydGZpbGUpOgorICAgICAgICAgICAgICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0ZmlsZQorICAgICAgICAgICAgICAgIGFzeW5jb3JlLmRpc3BhdGNoZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZV9zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgICAgICBzZWxmLnBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc29ja2V0KQorICAgICAgICAgICAgICAgIHNlbGYubGlzdGVuKDUpCisKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfYWNjZXB0KHNlbGYpOgorICAgICAgICAgICAgICAgIHNvY2tfb2JqLCBhZGRyID0gc2VsZi5hY2NlcHQoKQorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgc2VydmVyOiAgbmV3IGNvbm5lY3Rpb24gZnJvbSAlczolc1xuIiAlYWRkcikKKyAgICAgICAgICAgICAgICBzZWxmLkNvbm5lY3Rpb25IYW5kbGVyKHNvY2tfb2JqLCBzZWxmLmNlcnRmaWxlKQorCisgICAgICAgICAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNlcnRmaWxlKToKKyAgICAgICAgICAgIHNlbGYuZmxhZyA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuc2VydmVyID0gc2VsZi5FY2hvU2VydmVyKGNlcnRmaWxlKQorICAgICAgICAgICAgc2VsZi5wb3J0ID0gc2VsZi5zZXJ2ZXIucG9ydAorICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAgICAgICAgICAgc2VsZi5kYWVtb24gPSBUcnVlCisKKyAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gIjwlcyAlcz4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLnNlcnZlcikKKworICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5zdGFydCh0aHJlYWRpbmcuRXZlbnQoKSkKKyAgICAgICAgICAgIHNlbGYuZmxhZy53YWl0KCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiBjbGVhbnVwOiBzdG9wcGluZyBzZXJ2ZXIuXG4iKQorICAgICAgICAgICAgc2VsZi5zdG9wKCkKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiBjbGVhbnVwOiBqb2luaW5nIHNlcnZlciB0aHJlYWQuXG4iKQorICAgICAgICAgICAgc2VsZi5qb2luKCkKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiBjbGVhbnVwOiBzdWNjZXNzZnVsbHkgam9pbmVkLlxuIikKKworICAgICAgICBkZWYgc3RhcnQoc2VsZiwgZmxhZz1Ob25lKToKKyAgICAgICAgICAgIHNlbGYuZmxhZyA9IGZsYWcKKyAgICAgICAgICAgIHRocmVhZGluZy5UaHJlYWQuc3RhcnQoc2VsZikKKworICAgICAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUgPSBUcnVlCisgICAgICAgICAgICBpZiBzZWxmLmZsYWc6CisgICAgICAgICAgICAgICAgc2VsZi5mbGFnLnNldCgpCisgICAgICAgICAgICB3aGlsZSBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgICAgICBhc3luY29yZS5sb29wKDAuMDUpCisKKyAgICAgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZSA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLnNlcnZlci5jbG9zZSgpCisKKyAgICBjbGFzcyBTb2NrZXRTZXJ2ZXJIVFRQU1NlcnZlcih0aHJlYWRpbmcuVGhyZWFkKToKKworICAgICAgICBjbGFzcyBIVFRQU1NlcnZlcihIVFRQU2VydmVyKToKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzLCBjZXJ0ZmlsZSk6CisgICAgICAgICAgICAgICAgSFRUUFNlcnZlci5fX2luaXRfXyhzZWxmLCBzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRsZXJDbGFzcykKKyAgICAgICAgICAgICAgICAjIHdlIGFzc3VtZSB0aGUgY2VydGZpbGUgY29udGFpbnMgYm90aCBwcml2YXRlIGtleSBhbmQgY2VydGlmaWNhdGUKKyAgICAgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLmFsbG93X3JldXNlX2FkZHJlc3MgPSBUcnVlCisKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoJzwlcyAlczolcz4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX3BvcnQpKQorCisgICAgICAgICAgICBkZWYgZ2V0X3JlcXVlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgIyBvdmVycmlkZSB0aGlzIHRvIHdyYXAgc29ja2V0IHdpdGggU1NMCisgICAgICAgICAgICAgICAgc29jaywgYWRkciA9IHNlbGYuc29ja2V0LmFjY2VwdCgpCisgICAgICAgICAgICAgICAgc3NsY29ubiA9IHNzbC53cmFwX3NvY2tldChzb2NrLCBzZXJ2ZXJfc2lkZT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9c2VsZi5jZXJ0ZmlsZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3NsY29ubiwgYWRkcgorCisgICAgICAgIGNsYXNzIFJvb3RlZEhUVFBSZXF1ZXN0SGFuZGxlcihTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICAgICAgIyBuZWVkIHRvIG92ZXJyaWRlIHRyYW5zbGF0ZV9wYXRoIHRvIGdldCBhIGtub3duIHJvb3QsCisgICAgICAgICAgICAjIGluc3RlYWQgb2YgdXNpbmcgb3MuY3VyZGlyLCBzaW5jZSB0aGUgdGVzdCBjb3VsZCBiZQorICAgICAgICAgICAgIyBydW4gZnJvbSBhbnl3aGVyZQorCisgICAgICAgICAgICBzZXJ2ZXJfdmVyc2lvbiA9ICJUZXN0SFRUUFMvMS4wIgorCisgICAgICAgICAgICByb290ID0gTm9uZQorCisgICAgICAgICAgICBkZWYgdHJhbnNsYXRlX3BhdGgoc2VsZiwgcGF0aCk6CisgICAgICAgICAgICAgICAgIiIiVHJhbnNsYXRlIGEgLy1zZXBhcmF0ZWQgUEFUSCB0byB0aGUgbG9jYWwgZmlsZW5hbWUgc3ludGF4LgorCisgICAgICAgICAgICAgICAgQ29tcG9uZW50cyB0aGF0IG1lYW4gc3BlY2lhbCB0aGluZ3MgdG8gdGhlIGxvY2FsIGZpbGUgc3lzdGVtCisgICAgICAgICAgICAgICAgKGUuZy4gZHJpdmUgb3IgZGlyZWN0b3J5IG5hbWVzKSBhcmUgaWdub3JlZC4gIChYWFggVGhleSBzaG91bGQKKyAgICAgICAgICAgICAgICBwcm9iYWJseSBiZSBkaWFnbm9zZWQuKQorCisgICAgICAgICAgICAgICAgIiIiCisgICAgICAgICAgICAgICAgIyBhYmFuZG9uIHF1ZXJ5IHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICBwYXRoID0gdXJscGFyc2UudXJscGFyc2UocGF0aClbMl0KKyAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aCh1cmxsaWIudW5xdW90ZShwYXRoKSkKKyAgICAgICAgICAgICAgICB3b3JkcyA9IHBhdGguc3BsaXQoJy8nKQorICAgICAgICAgICAgICAgIHdvcmRzID0gZmlsdGVyKE5vbmUsIHdvcmRzKQorICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLnJvb3QKKyAgICAgICAgICAgICAgICBmb3Igd29yZCBpbiB3b3JkczoKKyAgICAgICAgICAgICAgICAgICAgZHJpdmUsIHdvcmQgPSBvcy5wYXRoLnNwbGl0ZHJpdmUod29yZCkKKyAgICAgICAgICAgICAgICAgICAgaGVhZCwgd29yZCA9IG9zLnBhdGguc3BsaXQod29yZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgd29yZCBpbiBzZWxmLnJvb3Q6IGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgd29yZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcGF0aAorCisgICAgICAgICAgICBkZWYgbG9nX21lc3NhZ2Uoc2VsZiwgZm9ybWF0LCAqYXJncyk6CisKKyAgICAgICAgICAgICAgICAjIHdlIG92ZXJyaWRlIHRoaXMgdG8gc3VwcHJlc3MgbG9nZ2luZyB1bmxlc3MgInZlcmJvc2UiCisKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIHNlcnZlciAoJXM6JWQgJXMpOlxuICAgWyVzXSAlc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuc2VydmVyLnNlcnZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5zZXJ2ZXJfcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXF1ZXN0LmNpcGhlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvZ19kYXRlX3RpbWVfc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCVhcmdzKSkKKworCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjZXJ0ZmlsZSk6CisgICAgICAgICAgICBzZWxmLmZsYWcgPSBOb25lCisgICAgICAgICAgICBzZWxmLlJvb3RlZEhUVFBSZXF1ZXN0SGFuZGxlci5yb290ID0gb3MucGF0aC5zcGxpdChDRVJURklMRSlbMF0KKyAgICAgICAgICAgIHNlbGYuc2VydmVyID0gc2VsZi5IVFRQU1NlcnZlcigKKyAgICAgICAgICAgICAgICAoSE9TVCwgMCksIHNlbGYuUm9vdGVkSFRUUFJlcXVlc3RIYW5kbGVyLCBjZXJ0ZmlsZSkKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IHNlbGYuc2VydmVyLnNlcnZlcl9wb3J0CisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICBzZWxmLmRhZW1vbiA9IFRydWUKKworICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAiPCVzICVzPiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuc2VydmVyKQorCisgICAgICAgIGRlZiBzdGFydChzZWxmLCBmbGFnPU5vbmUpOgorICAgICAgICAgICAgc2VsZi5mbGFnID0gZmxhZworICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5zdGFydChzZWxmKQorCisgICAgICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLmZsYWc6CisgICAgICAgICAgICAgICAgc2VsZi5mbGFnLnNldCgpCisgICAgICAgICAgICBzZWxmLnNlcnZlci5zZXJ2ZV9mb3JldmVyKDAuMDUpCisKKyAgICAgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zaHV0ZG93bigpCisKKworICAgIGRlZiBiYWRfY2VydF90ZXN0KGNlcnRmaWxlKToKKyAgICAgICAgIiIiCisgICAgICAgIExhdW5jaCBhIHNlcnZlciB3aXRoIENFUlRfUkVRVUlSRUQsIGFuZCBjaGVjayB0aGF0IHRyeWluZyB0bworICAgICAgICBjb25uZWN0IHRvIGl0IHdpdGggdGhlIGdpdmVuIGNsaWVudCBjZXJ0aWZpY2F0ZSBmYWlscy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlcnZlciA9IFRocmVhZGVkRWNob1NlcnZlcihDRVJURklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRyZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjZXJ0cz1DRVJURklMRSwgY2hhdHR5PUZhbHNlKQorICAgICAgICB3aXRoIHNlcnZlcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRmaWxlPWNlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxKQorICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoSE9TVCwgc2VydmVyLnBvcnQpKQorICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xFcnJvciwgeDoKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5TU0xFcnJvciBpcyAlc1xuIiAlIHhbMV0pCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCB4OgorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbnNvY2tldC5lcnJvciBpcyAlc1xuIiAlIHhbMV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJVc2Ugb2YgaW52YWxpZCBjZXJ0IHNob3VsZCBoYXZlIGZhaWxlZCEiKQorCisgICAgZGVmIHNlcnZlcl9wYXJhbXNfdGVzdChjZXJ0ZmlsZSwgcHJvdG9jb2wsIGNlcnRyZXFzLCBjYWNlcnRzZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9jZXJ0ZmlsZSwgY2xpZW50X3Byb3RvY29sPU5vbmUsIGluZGF0YT0iRk9PXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVycz1Ob25lLCBjaGF0dHk9VHJ1ZSwgY29ubmVjdGlvbmNoYXR0eT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBfYWNjZXB0aW5nX3NvY2tldD1GYWxzZSk6CisgICAgICAgICIiIgorICAgICAgICBMYXVuY2ggYSBzZXJ2ZXIsIGNvbm5lY3QgYSBjbGllbnQgdG8gaXQgYW5kIHRyeSB2YXJpb3VzIHJlYWRzCisgICAgICAgIGFuZCB3cml0ZXMuCisgICAgICAgICIiIgorICAgICAgICBzZXJ2ZXIgPSBUaHJlYWRlZEVjaG9TZXJ2ZXIoY2VydGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0cmVxcz1jZXJ0cmVxcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjZXJ0cz1jYWNlcnRzZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9Y2lwaGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXR0eT1jaGF0dHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uY2hhdHR5PWNvbm5lY3Rpb25jaGF0dHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX2FjY2VwdGluZ19zb2NrZXQ9d3JhcF9hY2NlcHRpbmdfc29ja2V0KQorICAgICAgICB3aXRoIHNlcnZlcjoKKyAgICAgICAgICAgICMgdHJ5IHRvIGNvbm5lY3QKKyAgICAgICAgICAgIGlmIGNsaWVudF9wcm90b2NvbCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNsaWVudF9wcm90b2NvbCA9IHByb3RvY29sCisgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9Y2xpZW50X2NlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1jYWNlcnRzZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVycz1jaXBoZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9Y2VydHJlcXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPWNsaWVudF9wcm90b2NvbCkKKyAgICAgICAgICAgIHMuY29ubmVjdCgoSE9TVCwgc2VydmVyLnBvcnQpKQorICAgICAgICAgICAgZm9yIGFyZyBpbiBbaW5kYXRhLCBieXRlYXJyYXkoaW5kYXRhKSwgbWVtb3J5dmlldyhpbmRhdGEpXToKKyAgICAgICAgICAgICAgICBpZiBjb25uZWN0aW9uY2hhdHR5OgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjbGllbnQ6ICBzZW5kaW5nICVzLi4uXG4iICUgKHJlcHIoYXJnKSkpCisgICAgICAgICAgICAgICAgcy53cml0ZShhcmcpCisgICAgICAgICAgICAgICAgb3V0ZGF0YSA9IHMucmVhZCgpCisgICAgICAgICAgICAgICAgaWYgY29ubmVjdGlvbmNoYXR0eToKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgY2xpZW50OiAgcmVhZCAlc1xuIiAlIHJlcHIob3V0ZGF0YSkpCisgICAgICAgICAgICAgICAgaWYgb3V0ZGF0YSAhPSBpbmRhdGEubG93ZXIoKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIGRhdGEgPDwlcz4+ICglZCkgcmVjZWl2ZWQ7IGV4cGVjdGVkIDw8JXM+PiAoJWQpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAlIChvdXRkYXRhWzptaW4obGVuKG91dGRhdGEpLDIwKV0sIGxlbihvdXRkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGF0YVs6bWluKGxlbihpbmRhdGEpLDIwKV0ubG93ZXIoKSwgbGVuKGluZGF0YSkpKQorICAgICAgICAgICAgcy53cml0ZSgib3ZlclxuIikKKyAgICAgICAgICAgIGlmIGNvbm5lY3Rpb25jaGF0dHk6CisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiBjbGllbnQ6ICBjbG9zaW5nIGNvbm5lY3Rpb24uXG4iKQorICAgICAgICAgICAgcy5jbG9zZSgpCisKKyAgICBkZWYgdHJ5X3Byb3RvY29sX2NvbWJvKHNlcnZlcl9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdF9zdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydHNyZXFzPU5vbmUpOgorICAgICAgICBpZiBjZXJ0c3JlcXMgaXMgTm9uZToKKyAgICAgICAgICAgIGNlcnRzcmVxcyA9IHNzbC5DRVJUX05PTkUKKyAgICAgICAgY2VydHR5cGUgPSB7CisgICAgICAgICAgICBzc2wuQ0VSVF9OT05FOiAiQ0VSVF9OT05FIiwKKyAgICAgICAgICAgIHNzbC5DRVJUX09QVElPTkFMOiAiQ0VSVF9PUFRJT05BTCIsCisgICAgICAgICAgICBzc2wuQ0VSVF9SRVFVSVJFRDogIkNFUlRfUkVRVUlSRUQiLAorICAgICAgICB9W2NlcnRzcmVxc10KKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBmb3JtYXRzdHIgPSAoZXhwZWN0X3N1Y2Nlc3MgYW5kICIgJXMtPiVzICVzXG4iKSBvciAiIHslcy0+JXN9ICVzXG4iCisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGZvcm1hdHN0ciAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzc2wuZ2V0X3Byb3RvY29sX25hbWUoY2xpZW50X3Byb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC5nZXRfcHJvdG9jb2xfbmFtZShzZXJ2ZXJfcHJvdG9jb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydHR5cGUpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIE5PVEU6IHdlIG11c3QgZW5hYmxlICJBTEwiIGNpcGhlcnMsIG90aGVyd2lzZSBhbiBTU0x2MjMgY2xpZW50CisgICAgICAgICAgICAjIHdpbGwgc2VuZCBhbiBTU0x2MyBoZWxsbyAocmF0aGVyIHRoYW4gU1NMdjIpIHN0YXJ0aW5nIGZyb20KKyAgICAgICAgICAgICMgT3BlblNTTCAxLjAuMCAoc2VlIGlzc3VlICM4MzIyKS4KKyAgICAgICAgICAgIHNlcnZlcl9wYXJhbXNfdGVzdChDRVJURklMRSwgc2VydmVyX3Byb3RvY29sLCBjZXJ0c3JlcXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VSVEZJTEUsIENFUlRGSUxFLCBjbGllbnRfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVycz0iQUxMIiwgY2hhdHR5PUZhbHNlKQorICAgICAgICAjIFByb3RvY29sIG1pc21hdGNoIGNhbiByZXN1bHQgaW4gZWl0aGVyIGFuIFNTTEVycm9yLCBvciBhCisgICAgICAgICMgIkNvbm5lY3Rpb24gcmVzZXQgYnkgcGVlciIgZXJyb3IuCisgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3I6CisgICAgICAgICAgICBpZiBleHBlY3Rfc3VjY2VzczoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6CisgICAgICAgICAgICBpZiBleHBlY3Rfc3VjY2VzcyBvciBlLmVycm5vICE9IGVycm5vLkVDT05OUkVTRVQ6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBleHBlY3Rfc3VjY2VzczoKKyAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIkNsaWVudCBwcm90b2NvbCAlcyBzdWNjZWVkZWQgd2l0aCBzZXJ2ZXIgcHJvdG9jb2wgJXMhIgorICAgICAgICAgICAgICAgICAgICAlIChzc2wuZ2V0X3Byb3RvY29sX25hbWUoY2xpZW50X3Byb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3NsLmdldF9wcm90b2NvbF9uYW1lKHNlcnZlcl9wcm90b2NvbCkpKQorCisKKyAgICBjbGFzcyBUaHJlYWRlZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICAgICBkZWYgdGVzdF9ydWRlX3NodXRkb3duKHNlbGYpOgorICAgICAgICAgICAgIiIiQSBicnV0YWwgc2h1dGRvd24gb2YgYW4gU1NMIHNlcnZlciBzaG91bGQgcmFpc2UgYW4gSU9FcnJvcgorICAgICAgICAgICAgaW4gdGhlIGNsaWVudCB3aGVuIGF0dGVtcHRpbmcgaGFuZHNoYWtlLgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBsaXN0ZW5lcl9yZWFkeSA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgICAgICBsaXN0ZW5lcl9nb25lID0gdGhyZWFkaW5nLkV2ZW50KCkKKworICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICAgICAgcG9ydCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQocywgSE9TVCkKKworICAgICAgICAgICAgIyBgbGlzdGVuZXJgIHJ1bnMgaW4gYSB0aHJlYWQuICBJdCBzaXRzIGluIGFuIGFjY2VwdCgpIHVudGlsCisgICAgICAgICAgICAjIHRoZSBtYWluIHRocmVhZCBjb25uZWN0cy4gIFRoZW4gaXQgcnVkZWx5IGNsb3NlcyB0aGUgc29ja2V0LAorICAgICAgICAgICAgIyBhbmQgc2V0cyBFdmVudCBgbGlzdGVuZXJfZ29uZWAgdG8gbGV0IHRoZSBtYWluIHRocmVhZCBrbm93CisgICAgICAgICAgICAjIHRoZSBzb2NrZXQgaXMgZ29uZS4KKyAgICAgICAgICAgIGRlZiBsaXN0ZW5lcigpOgorICAgICAgICAgICAgICAgIHMubGlzdGVuKDUpCisgICAgICAgICAgICAgICAgbGlzdGVuZXJfcmVhZHkuc2V0KCkKKyAgICAgICAgICAgICAgICBzLmFjY2VwdCgpCisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgICAgICAgICAgbGlzdGVuZXJfZ29uZS5zZXQoKQorCisgICAgICAgICAgICBkZWYgY29ubmVjdG9yKCk6CisgICAgICAgICAgICAgICAgbGlzdGVuZXJfcmVhZHkud2FpdCgpCisgICAgICAgICAgICAgICAgYyA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICAgICAgICAgIGMuY29ubmVjdCgoSE9TVCwgcG9ydCkpCisgICAgICAgICAgICAgICAgbGlzdGVuZXJfZ29uZS53YWl0KCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNzbF9zb2NrID0gc3NsLndyYXBfc29ja2V0KGMpCisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ2Nvbm5lY3RpbmcgdG8gY2xvc2VkIFNTTCBzb2NrZXQgc2hvdWxkIGhhdmUgZmFpbGVkJykKKworICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWxpc3RlbmVyKQorICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29ubmVjdG9yKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdC5qb2luKCkKKworICAgICAgICBAc2tpcF9pZl9icm9rZW5fdWJ1bnR1X3NzbAorICAgICAgICBkZWYgdGVzdF9lY2hvKHNlbGYpOgorICAgICAgICAgICAgIiIiQmFzaWMgdGVzdCBvZiBhbiBTU0wgY2xpZW50IGNvbm5lY3RpbmcgdG8gYSBzZXJ2ZXIiIiIKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuIikKKyAgICAgICAgICAgIHNlcnZlcl9wYXJhbXNfdGVzdChDRVJURklMRSwgc3NsLlBST1RPQ09MX1RMU3YxLCBzc2wuQ0VSVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFUlRGSUxFLCBDRVJURklMRSwgc3NsLlBST1RPQ09MX1RMU3YxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXR0eT1UcnVlLCBjb25uZWN0aW9uY2hhdHR5PVRydWUpCisKKyAgICAgICAgZGVmIHRlc3RfZ2V0cGVlcmNlcnQoc2VsZik6CisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiIpCisgICAgICAgICAgICBzMiA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICAgICAgc2VydmVyID0gVGhyZWFkZWRFY2hvU2VydmVyKENFUlRGSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRyZXFzPXNzbC5DRVJUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNlcnRzPUNFUlRGSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXR0eT1GYWxzZSkKKyAgICAgICAgICAgIHdpdGggc2VydmVyOgorICAgICAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9Q0VSVEZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1DRVJURklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MjMpCisgICAgICAgICAgICAgICAgcy5jb25uZWN0KChIT1NULCBzZXJ2ZXIucG9ydCkpCisgICAgICAgICAgICAgICAgY2VydCA9IHMuZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZXJ0LCAiQ2FuJ3QgZ2V0IHBlZXIgY2VydGlmaWNhdGUuIikKKyAgICAgICAgICAgICAgICBjaXBoZXIgPSBzLmNpcGhlcigpCisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUocHByaW50LnBmb3JtYXQoY2VydCkgKyAnXG4nKQorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJDb25uZWN0aW9uIGNpcGhlciBpcyAiICsgc3RyKGNpcGhlcikgKyAnLlxuJykKKyAgICAgICAgICAgICAgICBpZiAnc3ViamVjdCcgbm90IGluIGNlcnQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gc3ViamVjdCBmaWVsZCBpbiBjZXJ0aWZpY2F0ZTogJXMuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHJpbnQucGZvcm1hdChjZXJ0KSkKKyAgICAgICAgICAgICAgICBpZiAoKCgnb3JnYW5pemF0aW9uTmFtZScsICdQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbicpLCkKKyAgICAgICAgICAgICAgICAgICAgbm90IGluIGNlcnRbJ3N1YmplY3QnXSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIG9yIGludmFsaWQgJ29yZ2FuaXphdGlvbk5hbWUnIGZpZWxkIGluIGNlcnRpZmljYXRlIHN1YmplY3Q7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgYmUgJ1B5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uJy4iKQorICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorCisgICAgICAgIGRlZiB0ZXN0X2VtcHR5X2NlcnQoc2VsZik6CisgICAgICAgICAgICAiIiJDb25uZWN0aW5nIHdpdGggYW4gZW1wdHkgY2VydCBmaWxlIiIiCisgICAgICAgICAgICBiYWRfY2VydF90ZXN0KG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm51bGxjZXJ0LnBlbSIpKQorICAgICAgICBkZWYgdGVzdF9tYWxmb3JtZWRfY2VydChzZWxmKToKKyAgICAgICAgICAgICIiIkNvbm5lY3Rpbmcgd2l0aCBhIGJhZGx5IGZvcm1hdHRlZCBjZXJ0aWZpY2F0ZSAoc3ludGF4IGVycm9yKSIiIgorICAgICAgICAgICAgYmFkX2NlcnRfdGVzdChvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSBvciBvcy5jdXJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkY2VydC5wZW0iKSkKKyAgICAgICAgZGVmIHRlc3Rfbm9uZXhpc3RpbmdfY2VydChzZWxmKToKKyAgICAgICAgICAgICIiIkNvbm5lY3Rpbmcgd2l0aCBhIG5vbi1leGlzdGluZyBjZXJ0IGZpbGUiIiIKKyAgICAgICAgICAgIGJhZF9jZXJ0X3Rlc3Qob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3Igb3MuY3VyZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nY2VydC5wZW0iKSkKKyAgICAgICAgZGVmIHRlc3RfbWFsZm9ybWVkX2tleShzZWxmKToKKyAgICAgICAgICAgICIiIkNvbm5lY3Rpbmcgd2l0aCBhIGJhZGx5IGZvcm1hdHRlZCBrZXkgKHN5bnRheCBlcnJvcikiIiIKKyAgICAgICAgICAgIGJhZF9jZXJ0X3Rlc3Qob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3Igb3MuY3VyZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhZGtleS5wZW0iKSkKKworICAgICAgICBAc2tpcF9pZl9icm9rZW5fdWJ1bnR1X3NzbAorICAgICAgICBkZWYgdGVzdF9wcm90b2NvbF9zc2x2MihzZWxmKToKKyAgICAgICAgICAgICIiIkNvbm5lY3RpbmcgdG8gYW4gU1NMdjIgc2VydmVyIHdpdGggdmFyaW91cyBjbGllbnQgb3B0aW9ucyIiIgorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfU1NMdjInKToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJQUk9UT0NPTF9TU0x2MiBuZWVkZWQiKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2Miwgc3NsLlBST1RPQ09MX1NTTHYyLCBUcnVlKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2Miwgc3NsLlBST1RPQ09MX1NTTHYyLCBUcnVlLCBzc2wuQ0VSVF9PUFRJT05BTCkKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjIsIHNzbC5QUk9UT0NPTF9TU0x2MiwgVHJ1ZSwgc3NsLkNFUlRfUkVRVUlSRUQpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYyLCBzc2wuUFJPVE9DT0xfU1NMdjIzLCBUcnVlKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2Miwgc3NsLlBST1RPQ09MX1NTTHYzLCBGYWxzZSkKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjIsIHNzbC5QUk9UT0NPTF9UTFN2MSwgRmFsc2UpCisKKyAgICAgICAgQHNraXBfaWZfYnJva2VuX3VidW50dV9zc2wKKyAgICAgICAgZGVmIHRlc3RfcHJvdG9jb2xfc3NsdjIzKHNlbGYpOgorICAgICAgICAgICAgIiIiQ29ubmVjdGluZyB0byBhbiBTU0x2MjMgc2VydmVyIHdpdGggdmFyaW91cyBjbGllbnQgb3B0aW9ucyIiIgorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2MjMsIHNzbC5QUk9UT0NPTF9TU0x2MywgVHJ1ZSkKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjIzLCBzc2wuUFJPVE9DT0xfU1NMdjIzLCBUcnVlKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2MjMsIHNzbC5QUk9UT0NPTF9UTFN2MSwgVHJ1ZSkKKworICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2MjMsIHNzbC5QUk9UT0NPTF9TU0x2MywgVHJ1ZSwgc3NsLkNFUlRfT1BUSU9OQUwpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYyMywgc3NsLlBST1RPQ09MX1NTTHYyMywgVHJ1ZSwgc3NsLkNFUlRfT1BUSU9OQUwpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYyMywgc3NsLlBST1RPQ09MX1RMU3YxLCBUcnVlLCBzc2wuQ0VSVF9PUFRJT05BTCkKKworICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2MjMsIHNzbC5QUk9UT0NPTF9TU0x2MywgVHJ1ZSwgc3NsLkNFUlRfUkVRVUlSRUQpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYyMywgc3NsLlBST1RPQ09MX1NTTHYyMywgVHJ1ZSwgc3NsLkNFUlRfUkVRVUlSRUQpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYyMywgc3NsLlBST1RPQ09MX1RMU3YxLCBUcnVlLCBzc2wuQ0VSVF9SRVFVSVJFRCkKKworICAgICAgICBAc2tpcF9pZl9icm9rZW5fdWJ1bnR1X3NzbAorICAgICAgICBkZWYgdGVzdF9wcm90b2NvbF9zc2x2MyhzZWxmKToKKyAgICAgICAgICAgICIiIkNvbm5lY3RpbmcgdG8gYW4gU1NMdjMgc2VydmVyIHdpdGggdmFyaW91cyBjbGllbnQgb3B0aW9ucyIiIgorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2Mywgc3NsLlBST1RPQ09MX1NTTHYzLCBUcnVlKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2Mywgc3NsLlBST1RPQ09MX1NTTHYzLCBUcnVlLCBzc2wuQ0VSVF9PUFRJT05BTCkKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjMsIHNzbC5QUk9UT0NPTF9TU0x2MywgVHJ1ZSwgc3NsLkNFUlRfUkVRVUlSRUQpCisgICAgICAgICAgICBpZiBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1NTTHYyJyk6CisgICAgICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2Mywgc3NsLlBST1RPQ09MX1NTTHYyLCBGYWxzZSkKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjMsIHNzbC5QUk9UT0NPTF9UTFN2MSwgRmFsc2UpCisKKyAgICAgICAgQHNraXBfaWZfYnJva2VuX3VidW50dV9zc2wKKyAgICAgICAgZGVmIHRlc3RfcHJvdG9jb2xfdGxzdjEoc2VsZik6CisgICAgICAgICAgICAiIiJDb25uZWN0aW5nIHRvIGEgVExTdjEgc2VydmVyIHdpdGggdmFyaW91cyBjbGllbnQgb3B0aW9ucyIiIgorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9UTFN2MSwgc3NsLlBST1RPQ09MX1RMU3YxLCBUcnVlKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9UTFN2MSwgc3NsLlBST1RPQ09MX1RMU3YxLCBUcnVlLCBzc2wuQ0VSVF9PUFRJT05BTCkKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfVExTdjEsIHNzbC5QUk9UT0NPTF9UTFN2MSwgVHJ1ZSwgc3NsLkNFUlRfUkVRVUlSRUQpCisgICAgICAgICAgICBpZiBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1NTTHYyJyk6CisgICAgICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9UTFN2MSwgc3NsLlBST1RPQ09MX1NTTHYyLCBGYWxzZSkKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfVExTdjEsIHNzbC5QUk9UT0NPTF9TU0x2MywgRmFsc2UpCisKKyAgICAgICAgZGVmIHRlc3Rfc3RhcnR0bHMoc2VsZik6CisgICAgICAgICAgICAiIiJTd2l0Y2hpbmcgZnJvbSBjbGVhciB0ZXh0IHRvIGVuY3J5cHRlZCBhbmQgYmFjayBhZ2Fpbi4iIiIKKyAgICAgICAgICAgIG1zZ3MgPSAoIm1zZyAxIiwgIk1TRyAyIiwgIlNUQVJUVExTIiwgIk1TRyAzIiwgIm1zZyA0IiwgIkVORFRMUyIsICJtc2cgNSIsICJtc2cgNiIpCisKKyAgICAgICAgICAgIHNlcnZlciA9IFRocmVhZGVkRWNob1NlcnZlcihDRVJURklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR0bHNfc2VydmVyPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhdHR5PVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbmNoYXR0eT1UcnVlKQorICAgICAgICAgICAgd3JhcHBlZCA9IEZhbHNlCisgICAgICAgICAgICB3aXRoIHNlcnZlcjoKKyAgICAgICAgICAgICAgICBzID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgICAgICAgICAgcy5zZXRibG9ja2luZygxKQorICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoSE9TVCwgc2VydmVyLnBvcnQpKQorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiIpCisgICAgICAgICAgICAgICAgZm9yIGluZGF0YSBpbiBtc2dzOgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjbGllbnQ6ICBzZW5kaW5nICVzLi4uXG4iICUgcmVwcihpbmRhdGEpKQorICAgICAgICAgICAgICAgICAgICBpZiB3cmFwcGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgY29ubi53cml0ZShpbmRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRkYXRhID0gY29ubi5yZWFkKCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VuZChpbmRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRkYXRhID0gcy5yZWN2KDEwMjQpCisgICAgICAgICAgICAgICAgICAgIGlmIChpbmRhdGEgPT0gIlNUQVJUVExTIiBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGRhdGEuc3RyaXAoKS5sb3dlcigpLnN0YXJ0c3dpdGgoIm9rIikpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBTVEFSVFRMUyBvaywgc3dpdGNoIHRvIHNlY3VyZSBtb2RlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNsaWVudDogIHJlYWQgJXMgZnJvbSBzZXJ2ZXIsIHN0YXJ0aW5nIFRMUy4uLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHJlcHIob3V0ZGF0YSkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25uID0gc3NsLndyYXBfc29ja2V0KHMsIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGVsaWYgKGluZGF0YSA9PSAiRU5EVExTIiBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGRhdGEuc3RyaXAoKS5sb3dlcigpLnN0YXJ0c3dpdGgoIm9rIikpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBFTkRUTFMgb2ssIHN3aXRjaCBiYWNrIHRvIGNsZWFyIHRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2xpZW50OiAgcmVhZCAlcyBmcm9tIHNlcnZlciwgZW5kaW5nIFRMUy4uLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHJlcHIob3V0ZGF0YSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzID0gY29ubi51bndyYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNsaWVudDogIHJlYWQgJXMgZnJvbSBzZXJ2ZXJcbiIgJSByZXByKG91dGRhdGEpKQorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgY2xpZW50OiAgY2xvc2luZyBjb25uZWN0aW9uLlxuIikKKyAgICAgICAgICAgICAgICBpZiB3cmFwcGVkOgorICAgICAgICAgICAgICAgICAgICBjb25uLndyaXRlKCJvdmVyXG4iKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHMuc2VuZCgib3ZlclxuIikKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKworICAgICAgICBkZWYgdGVzdF9zb2NrZXRzZXJ2ZXIoc2VsZik6CisgICAgICAgICAgICAiIiJVc2luZyBhIFNvY2tldFNlcnZlciB0byBjcmVhdGUgYW5kIG1hbmFnZSBTU0wgY29ubmVjdGlvbnMuIiIiCisgICAgICAgICAgICBzZXJ2ZXIgPSBTb2NrZXRTZXJ2ZXJIVFRQU1NlcnZlcihDRVJURklMRSkKKyAgICAgICAgICAgIGZsYWcgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICAgICAgc2VydmVyLnN0YXJ0KGZsYWcpCisgICAgICAgICAgICAjIHdhaXQgZm9yIGl0IHRvIHN0YXJ0CisgICAgICAgICAgICBmbGFnLndhaXQoKQorICAgICAgICAgICAgIyB0cnkgdG8gY29ubmVjdAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKENFUlRGSUxFLCAncmInKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICBkMSA9IGYucmVhZCgpCisgICAgICAgICAgICAgICAgZDIgPSAnJworICAgICAgICAgICAgICAgICMgbm93IGZldGNoIHRoZSBzYW1lIGRhdGEgZnJvbSB0aGUgSFRUUFMgc2VydmVyCisgICAgICAgICAgICAgICAgdXJsID0gJ2h0dHBzOi8vMTI3LjAuMC4xOiVkLyVzJyAlICgKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnBvcnQsIG9zLnBhdGguc3BsaXQoQ0VSVEZJTEUpWzFdKQorICAgICAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgICAgICAgICAgZiA9IHVybGxpYi51cmxvcGVuKHVybCkKKyAgICAgICAgICAgICAgICBkbGVuID0gZi5pbmZvKCkuZ2V0aGVhZGVyKCJjb250ZW50LWxlbmd0aCIpCisgICAgICAgICAgICAgICAgaWYgZGxlbiBhbmQgKGludChkbGVuKSA+IDApOgorICAgICAgICAgICAgICAgICAgICBkMiA9IGYucmVhZChpbnQoZGxlbikpCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNsaWVudDogcmVhZCAlZCBieXRlcyBmcm9tIHJlbW90ZSBzZXJ2ZXIgJyVzJ1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGxlbihkMiksIHNlcnZlcikpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgZDIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlcnZlci5zdG9wKCkKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuam9pbigpCisKKyAgICAgICAgZGVmIHRlc3Rfd3JhcHBlZF9hY2NlcHQoc2VsZik6CisgICAgICAgICAgICAiIiJDaGVjayB0aGUgYWNjZXB0KCkgbWV0aG9kIG9uIFNTTCBzb2NrZXRzLiIiIgorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQorICAgICAgICAgICAgc2VydmVyX3BhcmFtc190ZXN0KENFUlRGSUxFLCBzc2wuUFJPVE9DT0xfU1NMdjIzLCBzc2wuQ0VSVF9SRVFVSVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRVJURklMRSwgQ0VSVEZJTEUsIHNzbC5QUk9UT0NPTF9TU0x2MjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhdHR5PVRydWUsIGNvbm5lY3Rpb25jaGF0dHk9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX2FjY2VwdGluZ19zb2NrZXQ9VHJ1ZSkKKworICAgICAgICBkZWYgdGVzdF9hc3luY29yZV9zZXJ2ZXIoc2VsZik6CisgICAgICAgICAgICAiIiJDaGVjayB0aGUgZXhhbXBsZSBhc3luY29yZSBpbnRlZ3JhdGlvbi4iIiIKKyAgICAgICAgICAgIGluZGF0YSA9ICJURVNUIE1FU1NBR0Ugb2YgbWl4ZWQgY2FzZVxuIgorCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiIpCisgICAgICAgICAgICBzZXJ2ZXIgPSBBc3luY29yZUVjaG9TZXJ2ZXIoQ0VSVEZJTEUpCisgICAgICAgICAgICB3aXRoIHNlcnZlcjoKKyAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoKSkKKyAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKCcxMjcuMC4wLjEnLCBzZXJ2ZXIucG9ydCkpCisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAiIGNsaWVudDogIHNlbmRpbmcgJXMuLi5cbiIgJSAocmVwcihpbmRhdGEpKSkKKyAgICAgICAgICAgICAgICBzLndyaXRlKGluZGF0YSkKKyAgICAgICAgICAgICAgICBvdXRkYXRhID0gcy5yZWFkKCkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIGNsaWVudDogIHJlYWQgJXNcbiIgJSByZXByKG91dGRhdGEpKQorICAgICAgICAgICAgICAgIGlmIG91dGRhdGEgIT0gaW5kYXRhLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgZGF0YSA8PCVzPj4gKCVkKSByZWNlaXZlZDsgZXhwZWN0ZWQgPDwlcz4+ICglZClcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICUgKG91dGRhdGFbOm1pbihsZW4ob3V0ZGF0YSksMjApXSwgbGVuKG91dGRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kYXRhWzptaW4obGVuKGluZGF0YSksMjApXS5sb3dlcigpLCBsZW4oaW5kYXRhKSkpCisgICAgICAgICAgICAgICAgcy53cml0ZSgib3ZlclxuIikKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIGNsaWVudDogIGNsb3NpbmcgY29ubmVjdGlvbi5cbiIpCisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKKyAgICAgICAgZGVmIHRlc3RfcmVjdl9zZW5kKHNlbGYpOgorICAgICAgICAgICAgIiIiVGVzdCByZWN2KCksIHNlbmQoKSBhbmQgZnJpZW5kcy4iIiIKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuIikKKworICAgICAgICAgICAgc2VydmVyID0gVGhyZWFkZWRFY2hvU2VydmVyKENFUlRGSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRyZXFzPXNzbC5DRVJUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2VydHM9Q0VSVEZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhdHR5PVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbmNoYXR0eT1GYWxzZSkKKyAgICAgICAgICAgIHdpdGggc2VydmVyOgorICAgICAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX3NpZGU9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0ZmlsZT1DRVJURklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPUNFUlRGSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjEpCisgICAgICAgICAgICAgICAgcy5jb25uZWN0KChIT1NULCBzZXJ2ZXIucG9ydCkpCisgICAgICAgICAgICAgICAgIyBoZWxwZXIgbWV0aG9kcyBmb3Igc3RhbmRhcmRpc2luZyByZWN2KiBtZXRob2Qgc2lnbmF0dXJlcworICAgICAgICAgICAgICAgIGRlZiBfcmVjdl9pbnRvKCk6CisgICAgICAgICAgICAgICAgICAgIGIgPSBieXRlYXJyYXkoIlwwIioxMDApCisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gcy5yZWN2X2ludG8oYikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJbOmNvdW50XQorCisgICAgICAgICAgICAgICAgZGVmIF9yZWN2ZnJvbV9pbnRvKCk6CisgICAgICAgICAgICAgICAgICAgIGIgPSBieXRlYXJyYXkoIlwwIioxMDApCisgICAgICAgICAgICAgICAgICAgIGNvdW50LCBhZGRyID0gcy5yZWN2ZnJvbV9pbnRvKGIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiWzpjb3VudF0KKworICAgICAgICAgICAgICAgICMgKG5hbWUsIG1ldGhvZCwgd2hldGhlciB0byBleHBlY3Qgc3VjY2VzcywgKmFyZ3MpCisgICAgICAgICAgICAgICAgc2VuZF9tZXRob2RzID0gWworICAgICAgICAgICAgICAgICAgICAoJ3NlbmQnLCBzLnNlbmQsIFRydWUsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgKCdzZW5kdG8nLCBzLnNlbmR0bywgRmFsc2UsIFsic29tZS5hZGRyZXNzIl0pLAorICAgICAgICAgICAgICAgICAgICAoJ3NlbmRhbGwnLCBzLnNlbmRhbGwsIFRydWUsIFtdKSwKKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgcmVjdl9tZXRob2RzID0gWworICAgICAgICAgICAgICAgICAgICAoJ3JlY3YnLCBzLnJlY3YsIFRydWUsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgKCdyZWN2ZnJvbScsIHMucmVjdmZyb20sIEZhbHNlLCBbInNvbWUuYWRkcmVzcyJdKSwKKyAgICAgICAgICAgICAgICAgICAgKCdyZWN2X2ludG8nLCBfcmVjdl9pbnRvLCBUcnVlLCBbXSksCisgICAgICAgICAgICAgICAgICAgICgncmVjdmZyb21faW50bycsIF9yZWN2ZnJvbV9pbnRvLCBGYWxzZSwgW10pLAorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICBkYXRhX3ByZWZpeCA9IHUiUFJFRklYXyIKKworICAgICAgICAgICAgICAgIGZvciBtZXRoX25hbWUsIHNlbmRfbWV0aCwgZXhwZWN0X3N1Y2Nlc3MsIGFyZ3MgaW4gc2VuZF9tZXRob2RzOgorICAgICAgICAgICAgICAgICAgICBpbmRhdGEgPSBkYXRhX3ByZWZpeCArIG1ldGhfbmFtZQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX21ldGgoaW5kYXRhLmVuY29kZSgnQVNDSUknLCAnc3RyaWN0JyksICphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0YSA9IHMucmVhZCgpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRkYXRhID0gb3V0ZGF0YS5kZWNvZGUoJ0FTQ0lJJywgJ3N0cmljdCcpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBvdXRkYXRhICE9IGluZGF0YS5sb3dlcigpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldoaWxlIHNlbmRpbmcgd2l0aCA8PCVzPj4gYmFkIGRhdGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPDwlcj4+ICglZCkgcmVjZWl2ZWQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIDw8JXI+PiAoJWQpXG4iICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aF9uYW1lLCBvdXRkYXRhWzoyMF0sIGxlbihvdXRkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGF0YVs6MjBdLCBsZW4oaW5kYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXhwZWN0X3N1Y2Nlc3M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNlbmQgd2l0aCBtZXRob2QgPDwlcz4+OyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCB0byBzdWNjZWVkLlxuIiAlIChtZXRoX25hbWUsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzdHIoZSkuc3RhcnRzd2l0aChtZXRoX25hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCA8PCVzPj4gZmFpbGVkIHdpdGggdW5leHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb24gbWVzc2FnZTogJXNcbiIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRoX25hbWUsIGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICAgICAgICAgIGZvciBtZXRoX25hbWUsIHJlY3ZfbWV0aCwgZXhwZWN0X3N1Y2Nlc3MsIGFyZ3MgaW4gcmVjdl9tZXRob2RzOgorICAgICAgICAgICAgICAgICAgICBpbmRhdGEgPSBkYXRhX3ByZWZpeCArIG1ldGhfbmFtZQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzLnNlbmQoaW5kYXRhLmVuY29kZSgnQVNDSUknLCAnc3RyaWN0JykpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRkYXRhID0gcmVjdl9tZXRoKCphcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0YSA9IG91dGRhdGEuZGVjb2RlKCdBU0NJSScsICdzdHJpY3QnKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3V0ZGF0YSAhPSBpbmRhdGEubG93ZXIoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGlsZSByZWNlaXZpbmcgd2l0aCA8PCVzPj4gYmFkIGRhdGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPDwlcj4+ICglZCkgcmVjZWl2ZWQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIDw8JXI+PiAoJWQpXG4iICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aF9uYW1lLCBvdXRkYXRhWzoyMF0sIGxlbihvdXRkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGF0YVs6MjBdLCBsZW4oaW5kYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXhwZWN0X3N1Y2Nlc3M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlY2VpdmUgd2l0aCBtZXRob2QgPDwlcz4+OyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCB0byBzdWNjZWVkLlxuIiAlIChtZXRoX25hbWUsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzdHIoZSkuc3RhcnRzd2l0aChtZXRoX25hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCA8PCVzPj4gZmFpbGVkIHdpdGggdW5leHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGNlcHRpb24gbWVzc2FnZTogJXNcbiIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRoX25hbWUsIGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY29uc3VtZSBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICBzLnJlYWQoKQorCisgICAgICAgICAgICAgICAgcy53cml0ZSgib3ZlclxuIi5lbmNvZGUoIkFTQ0lJIiwgInN0cmljdCIpKQorICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorCisgICAgICAgIGRlZiB0ZXN0X2hhbmRzaGFrZV90aW1lb3V0KHNlbGYpOgorICAgICAgICAgICAgIyBJc3N1ZSAjNTEwMzogU1NMIGhhbmRzaGFrZSBtdXN0IHJlc3BlY3QgdGhlIHNvY2tldCB0aW1lb3V0CisgICAgICAgICAgICBzZXJ2ZXIgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQorICAgICAgICAgICAgaG9zdCA9ICIxMjcuMC4wLjEiCisgICAgICAgICAgICBwb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZXJ2ZXIpCisgICAgICAgICAgICBzdGFydGVkID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgICAgIGZpbmlzaCA9IEZhbHNlCisKKyAgICAgICAgICAgIGRlZiBzZXJ2ZSgpOgorICAgICAgICAgICAgICAgIHNlcnZlci5saXN0ZW4oNSkKKyAgICAgICAgICAgICAgICBzdGFydGVkLnNldCgpCisgICAgICAgICAgICAgICAgY29ubnMgPSBbXQorICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBmaW5pc2g6CisgICAgICAgICAgICAgICAgICAgIHIsIHcsIGUgPSBzZWxlY3Quc2VsZWN0KFtzZXJ2ZXJdLCBbXSwgW10sIDAuMSkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VydmVyIGluIHI6CisgICAgICAgICAgICAgICAgICAgICAgICAjIExldCB0aGUgc29ja2V0IGhhbmcgYXJvdW5kIHJhdGhlciB0aGFuIGhhdmluZworICAgICAgICAgICAgICAgICAgICAgICAgIyBpdCBjbG9zZWQgYnkgZ2FyYmFnZSBjb2xsZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgY29ubnMuYXBwZW5kKHNlcnZlci5hY2NlcHQoKVswXSkKKworICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlcnZlKQorICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBzdGFydGVkLndhaXQoKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgICAgICAgICAgICAgYy5zZXR0aW1lb3V0KDAuMikKKyAgICAgICAgICAgICAgICAgICAgYy5jb25uZWN0KChob3N0LCBwb3J0KSkKKyAgICAgICAgICAgICAgICAgICAgIyBXaWxsIGF0dGVtcHQgaGFuZHNoYWtlIGFuZCB0aW1lIG91dAorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChzc2wuU1NMRXJyb3IsICJ0aW1lZCBvdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wud3JhcF9zb2NrZXQsIGMpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgICAgICAgICAgICAgYy5zZXR0aW1lb3V0KDAuMikKKyAgICAgICAgICAgICAgICAgICAgYyA9IHNzbC53cmFwX3NvY2tldChjKQorICAgICAgICAgICAgICAgICAgICAjIFdpbGwgYXR0ZW1wdCBoYW5kc2hha2UgYW5kIHRpbWUgb3V0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKHNzbC5TU0xFcnJvciwgInRpbWVkIG91dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuY29ubmVjdCwgKGhvc3QsIHBvcnQpKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmaW5pc2ggPSBUcnVlCisgICAgICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuY2xvc2UoKQorCisgICAgICAgIGRlZiB0ZXN0X2RlZmF1bHRfY2lwaGVycyhzZWxmKToKKyAgICAgICAgICAgIHdpdGggVGhyZWFkZWRFY2hvU2VydmVyKENFUlRGSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXR0eT1GYWxzZSkgYXMgc2VydmVyOgorICAgICAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgRm9yY2UgYSBzZXQgb2Ygd2VhayBjaXBoZXJzIG9uIG91ciBjbGllbnQgc29ja2V0CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1NTTHYyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVycz0iREVTIikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIm5vIERFUyBjaXBoZXIgYXZhaWxhYmxlIikKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcygoT1NFcnJvciwgc3NsLlNTTEVycm9yKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKEhPU1QsIHNlcnZlci5wb3J0KSkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBzb2NrLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm5vIHNoYXJlZCBjaXBoZXIiLCBzdHIoc2VydmVyLmNvbm5fZXJyb3JzWzBdKSkKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9RmFsc2UpOgorICAgIGdsb2JhbCBDRVJURklMRSwgU1ZOX1BZVEhPTl9PUkdfUk9PVF9DRVJULCBOT0tJQUNFUlQKKyAgICBDRVJURklMRSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5Y2VydC5wZW0iKQorICAgIFNWTl9QWVRIT05fT1JHX1JPT1RfQ0VSVCA9IG9zLnBhdGguam9pbigKKyAgICAgICAgb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSBvciBvcy5jdXJkaXIsCisgICAgICAgICJodHRwc19zdm5fcHl0aG9uX29yZ19yb290LnBlbSIpCisgICAgTk9LSUFDRVJUID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3Igb3MuY3VyZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9raWEucGVtIikKKworICAgIGlmIChub3Qgb3MucGF0aC5leGlzdHMoQ0VSVEZJTEUpIG9yCisgICAgICAgIG5vdCBvcy5wYXRoLmV4aXN0cyhTVk5fUFlUSE9OX09SR19ST09UX0NFUlQpIG9yCisgICAgICAgIG5vdCBvcy5wYXRoLmV4aXN0cyhOT0tJQUNFUlQpKToKKyAgICAgICAgcmFpc2UgdGVzdF9zdXBwb3J0LlRlc3RGYWlsZWQoIkNhbid0IHJlYWQgY2VydGlmaWNhdGUgZmlsZXMhIikKKworICAgIHRlc3RzID0gW0Jhc2ljVGVzdHMsIEJhc2ljU29ja2V0VGVzdHNdCisKKyAgICBpZiB0ZXN0X3N1cHBvcnQuaXNfcmVzb3VyY2VfZW5hYmxlZCgnbmV0d29yaycpOgorICAgICAgICB0ZXN0cy5hcHBlbmQoTmV0d29ya2VkVGVzdHMpCisKKyAgICBpZiBfaGF2ZV90aHJlYWRzOgorICAgICAgICB0aHJlYWRfaW5mbyA9IHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQorICAgICAgICBpZiB0aHJlYWRfaW5mbyBhbmQgdGVzdF9zdXBwb3J0LmlzX3Jlc291cmNlX2VuYWJsZWQoJ25ldHdvcmsnKToKKyAgICAgICAgICAgIHRlc3RzLmFwcGVuZChUaHJlYWRlZFRlc3RzKQorCisgICAgdHJ5OgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBfaGF2ZV90aHJlYWRzOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnRocmVhZGluZ19jbGVhbnVwKCp0aHJlYWRfaW5mbykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3NsLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NzbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiYWM3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NzbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3NsLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NzbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiYWM3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NzbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RhcnRmaWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RhcnRmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkY2U4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdGFydGZpbGUucHkKQEAgLTAsMCArMSw0NSBAQAorIyBSaWRpY3Vsb3VzbHkgc2ltcGxlIHRlc3Qgb2YgdGhlIG9zLnN0YXJ0ZmlsZSBmdW5jdGlvbiBmb3IgV2luZG93cy4KKyMKKyMgZW1wdHkudmJzIGlzIGFuIGVtcHR5IGZpbGUgKGV4Y2VwdCBmb3IgYSBjb21tZW50KSwgd2hpY2ggZG9lcworIyBub3RoaW5nIHdoZW4gcnVuIHdpdGggY3NjcmlwdCBvciB3c2NyaXB0LgorIworIyBBIHBvc3NpYmxlIGltcHJvdmVtZW50IHdvdWxkIGJlIHRvIGhhdmUgZW1wdHkudmJzIGRvIHNvbWV0aGluZyB0aGF0CisjIHdlIGNhbiBkZXRlY3QgaGVyZSwgdG8gbWFrZSBzdXJlIHRoYXQgbm90IG9ubHkgdGhlIG9zLnN0YXJ0ZmlsZSgpCisjIGNhbGwgc3VjY2VlZGVkLCBidXQgYWxzbyB0aGUgdGhlIHNjcmlwdCBhY3R1YWxseSBoYXMgcnVuLgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgb3MKK2Zyb20gb3MgaW1wb3J0IHBhdGgKK2Zyb20gdGltZSBpbXBvcnQgc2xlZXAKKworc3RhcnRmaWxlID0gdGVzdF9zdXBwb3J0LmdldF9hdHRyaWJ1dGUob3MsICdzdGFydGZpbGUnKQorCisKK2NsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9ub25leGlzdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgc3RhcnRmaWxlLCAibm9uZXhpc3RpbmcudmJzIikKKworICAgIGRlZiB0ZXN0X25vbmV4aXN0aW5nX3Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIHN0YXJ0ZmlsZSwgdSJub25leGlzdGluZy52YnMiKQorCisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIGVtcHR5ID0gcGF0aC5qb2luKHBhdGguZGlybmFtZShfX2ZpbGVfXyksICJlbXB0eS52YnMiKQorICAgICAgICBzdGFydGZpbGUoZW1wdHkpCisgICAgICAgIHN0YXJ0ZmlsZShlbXB0eSwgIm9wZW4iKQorICAgICAgICAjIEdpdmUgdGhlIGNoaWxkIHByb2Nlc3Mgc29tZSB0aW1lIHRvIGV4aXQgYmVmb3JlIHdlIGZpbmlzaC4KKyAgICAgICAgIyBPdGhlcndpc2UgdGhlIGNsZWFudXAgY29kZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGRlbGV0ZSB0aGUgY3dkLAorICAgICAgICAjIGJlY2F1c2UgaXQgaXMgc3RpbGwgaW4gdXNlLgorICAgICAgICBzbGVlcCgwLjEpCisKKyAgICBkZWYgdGVzdF9lbXB0eV91KHNlbGYpOgorICAgICAgICBlbXB0eSA9IHBhdGguam9pbihwYXRoLmRpcm5hbWUoX19maWxlX18pLCAiZW1wdHkudmJzIikKKyAgICAgICAgc3RhcnRmaWxlKHVuaWNvZGUoZW1wdHksICJtYmNzIikpCisgICAgICAgIHN0YXJ0ZmlsZSh1bmljb2RlKGVtcHR5LCAibWJjcyIpLCAib3BlbiIpCisgICAgICAgIHNsZWVwKDAuMSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fPT0iX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdGFydGZpbGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RhcnRmaWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODJlNWM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RhcnRmaWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdGFydGZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RhcnRmaWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODJlNWM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RhcnRmaWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3MDRlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0ci5weQpAQCAtMCwwICsxLDQ2MSBAQAorCitpbXBvcnQgc3RydWN0CitpbXBvcnQgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgc3RyaW5nX3Rlc3RzCisKKworY2xhc3MgU3RyVGVzdCgKKyAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdCwKKyAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVbmljb2RlVXNlclN0cmluZ1Rlc3QsCisgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyVXNlclN0cmluZ1Rlc3QsCisgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyVW5pY29kZVRlc3QsCisgICAgKToKKworICAgIHR5cGUydGVzdCA9IHN0cgorCisgICAgIyBXZSBkb24ndCBuZWVkIHRvIHByb3BhZ2F0ZSB0byBzdHIKKyAgICBkZWYgZml4dHlwZShzZWxmLCBvYmopOgorICAgICAgICByZXR1cm4gb2JqCisKKyAgICBkZWYgdGVzdF9iYXNpY19jcmVhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoJycpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoMCksICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoMEwpLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKCgpKSwgJygpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoW10pLCAnW10nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih7fSksICd7fScpCisgICAgICAgIGEgPSBbXQorICAgICAgICBhLmFwcGVuZChhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihhKSwgJ1tbLi4uXV0nKQorICAgICAgICBhID0ge30KKyAgICAgICAgYVswXSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYSksICd7MDogey4uLn19JykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdHRpbmcoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clVuaWNvZGVVc2VyU3RyaW5nVGVzdC50ZXN0X2Zvcm1hdHRpbmcoc2VsZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgJyVjJy5fX21vZF9fLCAweDEyMzQpCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X2Zvcm1hdHRpbmdfaHVnZV9wcmVjaXNpb24oc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBJTlRfTUFYCisgICAgICAgIGZvcm1hdF9zdHJpbmcgPSAiJS57fWYiLmZvcm1hdChJTlRfTUFYICsgMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdF9zdHJpbmcgJSAyLjM0CisKKyAgICBkZWYgdGVzdF9mb3JtYXR0aW5nX2h1Z2Vfd2lkdGgoc2VsZik6CisgICAgICAgIGZvcm1hdF9zdHJpbmcgPSAiJXt9ZiIuZm9ybWF0KHN5cy5tYXhzaXplICsgMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdF9zdHJpbmcgJSAyLjM0CisKKyAgICBkZWYgdGVzdF9jb252ZXJzaW9uKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBfX3N0cl9fKCkgYmVoYXZlcyBwcm9wZXJseQorICAgICAgICBjbGFzcyBGb28wOgorICAgICAgICAgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1ImZvbyIKKworICAgICAgICBjbGFzcyBGb28xOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJmb28iCisKKyAgICAgICAgY2xhc3MgRm9vMihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJmb28iCisKKyAgICAgICAgY2xhc3MgRm9vMyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUiZm9vIgorCisgICAgICAgIGNsYXNzIEZvbzQodW5pY29kZSk6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdSJmb28iCisKKyAgICAgICAgY2xhc3MgRm9vNShzdHIpOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUiZm9vIgorCisgICAgICAgIGNsYXNzIEZvbzYoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiZm9vcyIKKworICAgICAgICAgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1ImZvb3UiCisKKyAgICAgICAgY2xhc3MgRm9vNyh1bmljb2RlKToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiZm9vcyIKKyAgICAgICAgICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdSJmb291IgorCisgICAgICAgIGNsYXNzIEZvbzgoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgY29udGVudD0iIik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5fX25ld19fKGNscywgMipjb250ZW50KQorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBjbGFzcyBGb285KHN0cik6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gInN0cmluZyIKKyAgICAgICAgICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5vdCB1bmljb2RlIgorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIoRm9vMCgpKS5zdGFydHN3aXRoKCI8IikpICMgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBfX3VuaWNvZGVfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGb28xKCkpLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRm9vMigpKSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKEZvbzMoKSksICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGb280KCJiYXIiKSksICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGb281KCJiYXIiKSksICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGb282KCJiYXIiKSksICJmb29zIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRm9vNygiYmFyIikpLCAiZm9vcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKEZvbzgoImZvbyIpKSwgImZvb2ZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKEZvbzkoImZvbyIpKSwgInN0cmluZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShGb285KCJmb28iKSksIHUibm90IHVuaWNvZGUiKQorCisgICAgZGVmIHRlc3RfZXhwYW5kdGFic19vdmVyZmxvd3NfZ3JhY2VmdWxseShzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3Qgb25seSBhZmZlY3RzIDMyLWJpdCBwbGF0Zm9ybXMgYmVjYXVzZSBleHBhbmR0YWJzIGNhbiBvbmx5IHRha2UKKyAgICAgICAgIyBhbiBpbnQgYXMgdGhlIG1heCB2YWx1ZSwgbm90IGEgNjQtYml0IEMgbG9uZy4gIElmIGV4cGFuZHRhYnMgaXMgY2hhbmdlZAorICAgICAgICAjIHRvIHRha2UgYSA2NC1iaXQgbG9uZywgdGhpcyB0ZXN0IHNob3VsZCBhcHBseSB0byBhbGwgcGxhdGZvcm1zLgorICAgICAgICBpZiBzeXMubWF4aW50ID4gKDEgPDwgMzIpIG9yIHN0cnVjdC5jYWxjc2l6ZSgnUCcpICE9IDQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgJ3RcdHRcdCcuZXhwYW5kdGFicywgc3lzLm1heGludCkKKworICAgIGRlZiB0ZXN0X19mb3JtYXRfXyhzZWxmKToKKyAgICAgICAgZGVmIHRlc3QodmFsdWUsIGZvcm1hdCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgIyB0ZXN0IGJvdGggd2l0aCBhbmQgd2l0aG91dCB0aGUgdHJhaWxpbmcgJ3MnCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLl9fZm9ybWF0X18oZm9ybWF0KSwgZXhwZWN0ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLl9fZm9ybWF0X18oZm9ybWF0ICsgJ3MnKSwgZXhwZWN0ZWQpCisKKyAgICAgICAgdGVzdCgnJywgJycsICcnKQorICAgICAgICB0ZXN0KCdhYmMnLCAnJywgJ2FiYycpCisgICAgICAgIHRlc3QoJ2FiYycsICcuMycsICdhYmMnKQorICAgICAgICB0ZXN0KCdhYicsICcuMycsICdhYicpCisgICAgICAgIHRlc3QoJ2FiY2RlZicsICcuMycsICdhYmMnKQorICAgICAgICB0ZXN0KCdhYmNkZWYnLCAnLjAnLCAnJykKKyAgICAgICAgdGVzdCgnYWJjJywgJzMuMycsICdhYmMnKQorICAgICAgICB0ZXN0KCdhYmMnLCAnMi4zJywgJ2FiYycpCisgICAgICAgIHRlc3QoJ2FiYycsICcyLjInLCAnYWInKQorICAgICAgICB0ZXN0KCdhYmMnLCAnMy4yJywgJ2FiICcpCisgICAgICAgIHRlc3QoJ3Jlc3VsdCcsICd4PDAnLCAncmVzdWx0JykKKyAgICAgICAgdGVzdCgncmVzdWx0JywgJ3g8NScsICdyZXN1bHQnKQorICAgICAgICB0ZXN0KCdyZXN1bHQnLCAneDw2JywgJ3Jlc3VsdCcpCisgICAgICAgIHRlc3QoJ3Jlc3VsdCcsICd4PDcnLCAncmVzdWx0eCcpCisgICAgICAgIHRlc3QoJ3Jlc3VsdCcsICd4PDgnLCAncmVzdWx0eHgnKQorICAgICAgICB0ZXN0KCdyZXN1bHQnLCAnIDw3JywgJ3Jlc3VsdCAnKQorICAgICAgICB0ZXN0KCdyZXN1bHQnLCAnPDcnLCAncmVzdWx0ICcpCisgICAgICAgIHRlc3QoJ3Jlc3VsdCcsICc+NycsICcgcmVzdWx0JykKKyAgICAgICAgdGVzdCgncmVzdWx0JywgJz44JywgJyAgcmVzdWx0JykKKyAgICAgICAgdGVzdCgncmVzdWx0JywgJ144JywgJyByZXN1bHQgJykKKyAgICAgICAgdGVzdCgncmVzdWx0JywgJ145JywgJyByZXN1bHQgICcpCisgICAgICAgIHRlc3QoJ3Jlc3VsdCcsICdeMTAnLCAnICByZXN1bHQgICcpCisgICAgICAgIHRlc3QoJ2EnLCAnMTAwMDAnLCAnYScgKyAnICcgKiA5OTk5KQorICAgICAgICB0ZXN0KCcnLCAnMTAwMDAnLCAnICcgKiAxMDAwMCkKKyAgICAgICAgdGVzdCgnJywgJzEwMDAwMDAwJywgJyAnICogMTAwMDAwMDApCisKKyAgICBkZWYgdGVzdF9mb3JtYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuZm9ybWF0KCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhJy5mb3JtYXQoKSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYicuZm9ybWF0KCksICdhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2F7eycuZm9ybWF0KCksICdheycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2F9fScuZm9ybWF0KCksICdhfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t7YicuZm9ybWF0KCksICd7YicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ319YicuZm9ybWF0KCksICd9YicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2F7e2InLmZvcm1hdCgpLCAnYXtiJykKKworICAgICAgICAjIGV4YW1wbGVzIGZyb20gdGhlIFBFUDoKKyAgICAgICAgaW1wb3J0IGRhdGV0aW1lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIk15IG5hbWUgaXMgezB9Ii5mb3JtYXQoJ0ZyZWQnKSwgIk15IG5hbWUgaXMgRnJlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIk15IG5hbWUgaXMgezBbbmFtZV19Ii5mb3JtYXQoZGljdChuYW1lPSdGcmVkJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJNeSBuYW1lIGlzIEZyZWQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJNeSBuYW1lIGlzIHswfSA6LXt7fX0iLmZvcm1hdCgnRnJlZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJNeSBuYW1lIGlzIEZyZWQgOi17fSIpCisKKyAgICAgICAgZCA9IGRhdGV0aW1lLmRhdGUoMjAwNywgOCwgMTgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIlRoZSB5ZWFyIGlzIHswLnllYXJ9Ii5mb3JtYXQoZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB5ZWFyIGlzIDIwMDciKQorCisgICAgICAgICMgY2xhc3NlcyB3ZSdsbCB1c2UgZm9yIHRlc3RpbmcKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4PTEwMCk6CisgICAgICAgICAgICAgICAgc2VsZi5feCA9IHgKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjCisKKyAgICAgICAgY2xhc3MgRDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBzcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYueCkKKworICAgICAgICAjIGNsYXNzIHdpdGggX19zdHJfXywgYnV0IG5vIF9fZm9ybWF0X18KKyAgICAgICAgY2xhc3MgRToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ0UoJyArIHNlbGYueCArICcpJworCisgICAgICAgICMgY2xhc3Mgd2l0aCBfX3JlcHJfXywgYnV0IG5vIF9fZm9ybWF0X18gb3IgX19zdHJfXworICAgICAgICBjbGFzcyBGOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ0YoJyArIHNlbGYueCArICcpJworCisgICAgICAgICMgY2xhc3Mgd2l0aCBfX2Zvcm1hdF9fIHRoYXQgZm9yd2FyZHMgdG8gc3RyaW5nLCBmb3Igc29tZSBmb3JtYXRfc3BlYydzCisgICAgICAgIGNsYXNzIEc6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmcgaXMgIiArIHNlbGYueAorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgIGlmIGZvcm1hdF9zcGVjID09ICdkJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdHKCcgKyBzZWxmLnggKyAnKScKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpCisKKyAgICAgICAgIyBjbGFzcyB0aGF0IHJldHVybnMgYSBiYWQgdHlwZSBmcm9tIF9fZm9ybWF0X18KKyAgICAgICAgY2xhc3MgSDoKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMS4wCisKKyAgICAgICAgY2xhc3MgSShkYXRldGltZS5kYXRlKToKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zdHJmdGltZShmb3JtYXRfc3BlYykKKworICAgICAgICBjbGFzcyBKKGludCk6CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGludC5fX2Zvcm1hdF9fKHNlbGYgKiAyLCBmb3JtYXRfc3BlYykKKworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuZm9ybWF0KCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmMnLmZvcm1hdCgpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezB9Jy5mb3JtYXQoJ2FiYycpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6fScuZm9ybWF0KCdhYmMnKSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1h7MH0nLmZvcm1hdCgnYWJjJyksICdYYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezB9WCcuZm9ybWF0KCdhYmMnKSwgJ2FiY1gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdYezB9WScuZm9ybWF0KCdhYmMnKSwgJ1hhYmNZJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezF9Jy5mb3JtYXQoMSwgJ2FiYycpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnWHsxfScuZm9ybWF0KDEsICdhYmMnKSwgJ1hhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MX1YJy5mb3JtYXQoMSwgJ2FiYycpLCAnYWJjWCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1h7MX1ZJy5mb3JtYXQoMSwgJ2FiYycpLCAnWGFiY1knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MH0nLmZvcm1hdCgtMTUpLCAnLTE1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezB9ezF9Jy5mb3JtYXQoLTE1LCAnYWJjJyksICctMTVhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MH1YezF9Jy5mb3JtYXQoLTE1LCAnYWJjJyksICctMTVYYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3snLmZvcm1hdCgpLCAneycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ319Jy5mb3JtYXQoKSwgJ30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7e319Jy5mb3JtYXQoKSwgJ3t9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3t4fX0nLmZvcm1hdCgpLCAne3h9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3t7MH19fScuZm9ybWF0KDEyMyksICd7MTIzfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t7e3swfX19fScuZm9ybWF0KCksICd7ezB9fScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ319e3snLmZvcm1hdCgpLCAnfXsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd9fXh7eycuZm9ybWF0KCksICd9eHsnKQorCisgICAgICAgICMgd2VpcmQgZmllbGQgbmFtZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiezBbZm9vLWJhcl19Ii5mb3JtYXQoeydmb28tYmFyJzonYmF6J30pLCAnYmF6JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiezBbZm9vIGJhcl19Ii5mb3JtYXQoeydmb28gYmFyJzonYmF6J30pLCAnYmF6JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiezBbIF19Ii5mb3JtYXQoeycgJzozfSksICczJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7Zm9vLl94fScuZm9ybWF0KGZvbz1DKDIwKSksICcyMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3sxfXswfScuZm9ybWF0KEQoMTApLCBEKDIwKSksICcyMDEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezAuX3gueH0nLmZvcm1hdChDKEQoJ2FiYycpKSksICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MFswXX0nLmZvcm1hdChbJ2FiYycsICdkZWYnXSksICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MFsxXX0nLmZvcm1hdChbJ2FiYycsICdkZWYnXSksICdkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MFsxXVswXX0nLmZvcm1hdChbJ2FiYycsIFsnZGVmJ11dKSwgJ2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swWzFdWzBdLnh9Jy5mb3JtYXQoWydhYmMnLCBbRCgnZGVmJyldXSksICdkZWYnKQorCisgICAgICAgICMgc3RyaW5ncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDouM3N9Jy5mb3JtYXQoJ2FiYycpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6LjNzfScuZm9ybWF0KCdhYicpLCAnYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDouM3N9Jy5mb3JtYXQoJ2FiY2RlZicpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6LjBzfScuZm9ybWF0KCdhYmNkZWYnKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOjMuM3N9Jy5mb3JtYXQoJ2FiYycpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Mi4zc30nLmZvcm1hdCgnYWJjJyksICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDoyLjJzfScuZm9ybWF0KCdhYmMnKSwgJ2FiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6My4yc30nLmZvcm1hdCgnYWJjJyksICdhYiAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDp4PDBzfScuZm9ybWF0KCdyZXN1bHQnKSwgJ3Jlc3VsdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOng8NXN9Jy5mb3JtYXQoJ3Jlc3VsdCcpLCAncmVzdWx0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6eDw2c30nLmZvcm1hdCgncmVzdWx0JyksICdyZXN1bHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDp4PDdzfScuZm9ybWF0KCdyZXN1bHQnKSwgJ3Jlc3VsdHgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDp4PDhzfScuZm9ybWF0KCdyZXN1bHQnKSwgJ3Jlc3VsdHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6IDw3c30nLmZvcm1hdCgncmVzdWx0JyksICdyZXN1bHQgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6PDdzfScuZm9ybWF0KCdyZXN1bHQnKSwgJ3Jlc3VsdCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDo+N3N9Jy5mb3JtYXQoJ3Jlc3VsdCcpLCAnIHJlc3VsdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOj44c30nLmZvcm1hdCgncmVzdWx0JyksICcgIHJlc3VsdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOl44c30nLmZvcm1hdCgncmVzdWx0JyksICcgcmVzdWx0ICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOl45c30nLmZvcm1hdCgncmVzdWx0JyksICcgcmVzdWx0ICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpeMTBzfScuZm9ybWF0KCdyZXN1bHQnKSwgJyAgcmVzdWx0ICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDoxMDAwMH0nLmZvcm1hdCgnYScpLCAnYScgKyAnICcgKiA5OTk5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDoxMDAwMH0nLmZvcm1hdCgnJyksICcgJyAqIDEwMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDoxMDAwMDAwMH0nLmZvcm1hdCgnJyksICcgJyAqIDEwMDAwMDAwKQorCisgICAgICAgICMgZm9ybWF0IHNwZWNpZmllcnMgZm9yIHVzZXIgZGVmaW5lZCB0eXBlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOmFiY30nLmZvcm1hdChDKCkpLCAnYWJjJykKKworICAgICAgICAjICFyIGFuZCAhcyBjb2VyY2lvbnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezAhc30nLmZvcm1hdCgnSGVsbG8nKSwgJ0hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezAhczp9Jy5mb3JtYXQoJ0hlbGxvJyksICdIZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swIXM6MTV9Jy5mb3JtYXQoJ0hlbGxvJyksICdIZWxsbyAgICAgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MCFzOjE1c30nLmZvcm1hdCgnSGVsbG8nKSwgJ0hlbGxvICAgICAgICAgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swIXJ9Jy5mb3JtYXQoJ0hlbGxvJyksICInSGVsbG8nIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezAhcjp9Jy5mb3JtYXQoJ0hlbGxvJyksICInSGVsbG8nIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezAhcn0nLmZvcm1hdChGKCdIZWxsbycpKSwgJ0YoSGVsbG8pJykKKworICAgICAgICAjIHRlc3QgZmFsbGJhY2sgdG8gb2JqZWN0Ll9fZm9ybWF0X18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezB9Jy5mb3JtYXQoe30pLCAne30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MH0nLmZvcm1hdChbXSksICdbXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swfScuZm9ybWF0KFsxXSksICdbMV0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MH0nLmZvcm1hdChFKCdkYXRhJykpLCAnRShkYXRhKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOmR9Jy5mb3JtYXQoRygnZGF0YScpKSwgJ0coZGF0YSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MCFzfScuZm9ybWF0KEcoJ2RhdGEnKSksICdzdHJpbmcgaXMgZGF0YScpCisKKyAgICAgICAgbXNnID0gJ29iamVjdC5fX2Zvcm1hdF9fIHdpdGggYSBub24tZW1wdHkgZm9ybWF0IHN0cmluZyBpcyBkZXByZWNhdGVkJworICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygobXNnLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpeMTB9Jy5mb3JtYXQoRSgnZGF0YScpKSwgJyBFKGRhdGEpICAnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6XjEwc30nLmZvcm1hdChFKCdkYXRhJykpLCAnIEUoZGF0YSkgICcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDo+MTVzfScuZm9ybWF0KEcoJ2RhdGEnKSksICcgc3RyaW5nIGlzIGRhdGEnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInswOmRhdGU6ICVZLSVtLSVkfSIuZm9ybWF0KEkoeWVhcj0yMDA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoPTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5PTI3KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGU6IDIwMDctMDgtMjciKQorCisgICAgICAgICMgdGVzdCBkZXJpdmluZyBmcm9tIGEgYnVpbHRpbiB0eXBlIGFuZCBvdmVycmlkaW5nIF9fZm9ybWF0X18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiezB9Ii5mb3JtYXQoSigxMCkpLCAiMjAiKQorCisKKyAgICAgICAgIyBzdHJpbmcgZm9ybWF0IHNwZWNpZmllcnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6fScuZm9ybWF0KCdhJyksICdhJykKKworICAgICAgICAjIGNvbXB1dGVkIGZvcm1hdCBzcGVjaWZpZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInswOi57MX19Ii5mb3JtYXQoJ2hlbGxvIHdvcmxkJywgNSksICdoZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInswOi57MX1zfSIuZm9ybWF0KCdoZWxsbyB3b3JsZCcsIDUpLCAnaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ7MDoue3ByZWNpc2lvbn1zfSIuZm9ybWF0KCdoZWxsbyB3b3JsZCcsIHByZWNpc2lvbj01KSwgJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiezA6e3dpZHRofS57cHJlY2lzaW9ufXN9Ii5mb3JtYXQoJ2hlbGxvIHdvcmxkJywgd2lkdGg9MTAsIHByZWNpc2lvbj01KSwgJ2hlbGxvICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ7MDp7d2lkdGh9LntwcmVjaXNpb259c30iLmZvcm1hdCgnaGVsbG8gd29ybGQnLCB3aWR0aD0nMTAnLCBwcmVjaXNpb249JzUnKSwgJ2hlbGxvICAgICAnKQorCisgICAgICAgICMgdGVzdCB2YXJpb3VzIGVycm9ycworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAneycuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAnfScuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAnYXsnLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgJ2F9Jy5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICd7YScuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAnfWEnLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgJ3swfScuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCAnezF9Jy5mb3JtYXQsICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgICAne3h9Jy5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ9eyIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAieyIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAifSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiYWJjezA6e30iLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInswIi5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsICJ7MC59Ii5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7MC59Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsICJ7MFt9Ii5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7MFt9Ii5mb3JtYXQsIFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgICAiezBdfSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezAuW119Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7MC4uZm9vfSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezBbMH0iLmZvcm1hdCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInswWzA6Zm9vfSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgICAie2NdfSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAie3sge3t7MH19Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7MH19Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCAgICJ7Zm9vfSIuZm9ybWF0LCBiYXI9MykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInswIXh9Ii5mb3JtYXQsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7MCF9Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7MCFyc30iLmZvcm1hdCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInshfSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCAiezp9Ii5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsICJ7OnN9Ii5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsICJ7fSIuZm9ybWF0KQorCisgICAgICAgICMgaXNzdWUgNjA4OQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezBbMF14fSIuZm9ybWF0LCBbTm9uZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7MFswXSgxMCl9Ii5mb3JtYXQsIFtOb25lXSkKKworICAgICAgICAjIGNhbid0IGhhdmUgYSByZXBsYWNlbWVudCBvbiB0aGUgZmllbGQgbmFtZSBwb3J0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgJ3swW3sxfV19Jy5mb3JtYXQsICdhYmNkZWZnJywgNCkKKworICAgICAgICAjIGV4Y2VlZCBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezA6ezE6ezJ9fX0iLmZvcm1hdCwgJ2FiYycsICdzJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7MDp7MTp7Mjp7Mzp7NDp7NTp7Nn19fX19fX0iLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNykKKworICAgICAgICAjIHN0cmluZyBmb3JtYXQgc3BlYyBlcnJvcnMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInswOi1zfSIuZm9ybWF0LCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAiIiwgIi0iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezA6PXN9Ii5mb3JtYXQsICcnKQorCisgICAgZGVmIHRlc3RfZm9ybWF0X2h1Z2VfcHJlY2lzaW9uKHNlbGYpOgorICAgICAgICBmb3JtYXRfc3RyaW5nID0gIi57fWYiLmZvcm1hdChzeXMubWF4c2l6ZSArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXQoMi4zNCwgZm9ybWF0X3N0cmluZykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9odWdlX3dpZHRoKHNlbGYpOgorICAgICAgICBmb3JtYXRfc3RyaW5nID0gInt9ZiIuZm9ybWF0KHN5cy5tYXhzaXplICsgMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdCgyLjM0LCBmb3JtYXRfc3RyaW5nKQorCisgICAgZGVmIHRlc3RfZm9ybWF0X2h1Z2VfaXRlbV9udW1iZXIoc2VsZik6CisgICAgICAgIGZvcm1hdF9zdHJpbmcgPSAie3t7fTouNmZ9fSIuZm9ybWF0KHN5cy5tYXhzaXplICsgMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdF9zdHJpbmcuZm9ybWF0KDIuMzQpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfYXV0b19udW1iZXJpbmcoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeD0xMDApOgorICAgICAgICAgICAgICAgIHNlbGYuX3ggPSB4CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBzcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlYworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t9Jy5mb3JtYXQoMTApLCAnMTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7OjV9Jy5mb3JtYXQoJ3MnKSwgJ3MgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgneyFyfScuZm9ybWF0KCdzJyksICIncyciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7Ll94fScuZm9ybWF0KEMoMTApKSwgJzEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne1sxXX0nLmZvcm1hdChbMSwgMl0pLCAnMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3tbYV19Jy5mb3JtYXQoeydhJzo0LCAnYic6Mn0pLCAnNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2F7fWJ7fWMnLmZvcm1hdCgwLCAxKSwgJ2EwYjFjJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhezp7fX1iJy5mb3JtYXQoJ3gnLCAnXjEwJyksICdhICAgIHggICAgIGInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhezp7fXh9YicuZm9ybWF0KDIwLCAnIycpLCAnYTB4MTRiJykKKworICAgICAgICAjIGNhbid0IG1peCBhbmQgbWF0Y2ggbnVtYmVyaW5nIGFuZCBhdXRvLW51bWJlcmluZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAne317MX0nLmZvcm1hdCwgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgJ3sxfXt9Jy5mb3JtYXQsIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICd7OnsxfX0nLmZvcm1hdCwgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgJ3swOnt9fScuZm9ybWF0LCAxLCAyKQorCisgICAgICAgICMgY2FuIG1peCBhbmQgbWF0Y2ggYXV0by1udW1iZXJpbmcgYW5kIG5hbWVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3tmfXt9Jy5mb3JtYXQoNCwgZj0ndGVzdCcpLCAndGVzdDQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7fXtmfScuZm9ybWF0KDQsIGY9J3Rlc3QnKSwgJzR0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezp7Zn19e2d9e30nLmZvcm1hdCgxLCAzLCBnPSdnJywgZj0yKSwgJyAxZzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7Zjp7fX17fXtnfScuZm9ybWF0KDIsIDQsIGY9MSwgZz0nZycpLCAnIDE0ZycpCisKKyAgICBkZWYgdGVzdF9idWZmZXJfaXNfcmVhZG9ubHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLnN0ZGluLnJlYWRpbnRvLCBiIiIpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfYW5kX2RlY29kZV9rd2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiY2RlJy5lbmNvZGUoJ2FzY2lpJywgJ3JlcGxhY2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYWJjZGUnLmVuY29kZSgnYXNjaWknLCBlcnJvcnM9J3JlcGxhY2UnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjZGUnLmVuY29kZSgnYXNjaWknLCAnaWdub3JlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FiY2RlJy5lbmNvZGUoZW5jb2Rpbmc9J2FzY2lpJywgZXJyb3JzPSdpZ25vcmUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnQW5kclwyMDIgeCcuZGVjb2RlKCdhc2NpaScsICdpZ25vcmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnQW5kclwyMDIgeCcuZGVjb2RlKCdhc2NpaScsIGVycm9ycz0naWdub3JlJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0FuZHJcMjAyIHgnLmRlY29kZSgnYXNjaWknLCAncmVwbGFjZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdBbmRyXDIwMiB4Jy5kZWNvZGUoZW5jb2Rpbmc9J2FzY2lpJywgZXJyb3JzPSdyZXBsYWNlJykpCisKKyAgICBkZWYgdGVzdF9zdGFydHN3aXRoX2VuZHN3aXRoX2Vycm9ycyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IpOgorICAgICAgICAgICAgJ1x4ZmYnLnN0YXJ0c3dpdGgodSd4JykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IpOgorICAgICAgICAgICAgJ1x4ZmYnLmVuZHN3aXRoKHUneCcpCisgICAgICAgIGZvciBtZXRoIGluICgnZm9vJy5zdGFydHN3aXRoLCAnZm9vJy5lbmRzd2l0aCk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcikgYXMgY206CisgICAgICAgICAgICAgICAgbWV0aChbJ2YnXSkKKyAgICAgICAgICAgIGV4YyA9IHN0cihjbS5leGNlcHRpb24pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCd1bmljb2RlJywgZXhjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignc3RyJywgZXhjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigndHVwbGUnLCBleGMpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFN0clRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0ci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1N2QwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0ci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1N2QwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmZ0aW1lLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyZnRpbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2ZWJlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmZ0aW1lLnB5CkBAIC0wLDAgKzEsMTg1IEBACisiIiIKK1VuaXR0ZXN0IGZvciB0aW1lLnN0cmZ0aW1lCisiIiIKKworaW1wb3J0IGNhbGVuZGFyCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKKworIyBoZWxwZXIgZnVuY3Rpb25zCitkZWYgZml4YXNjdGltZShzKToKKyAgICBpZiBzWzhdID09ICcgJzoKKyAgICAgICAgcyA9IHNbOjhdICsgJzAnICsgc1s5Ol0KKyAgICByZXR1cm4gcworCitkZWYgZXNjYXBlc3RyKHRleHQsIGFtcG0pOgorICAgICIiIgorICAgIEVzY2FwZSB0ZXh0IHRvIGRlYWwgd2l0aCBwb3NzaWJsZSBsb2NhbGUgdmFsdWVzIHRoYXQgaGF2ZSByZWdleAorICAgIHN5bnRheCB3aGlsZSBhbGxvd2luZyByZWdleCBzeW50YXggdXNlZCBmb3IgY29tcGFyaXNvbi4KKyAgICAiIiIKKyAgICBuZXdfdGV4dCA9IHJlLmVzY2FwZSh0ZXh0KQorICAgIG5ld190ZXh0ID0gbmV3X3RleHQucmVwbGFjZShyZS5lc2NhcGUoYW1wbSksIGFtcG0pCisgICAgbmV3X3RleHQgPSBuZXdfdGV4dC5yZXBsYWNlKCdcJScsICclJykKKyAgICBuZXdfdGV4dCA9IG5ld190ZXh0LnJlcGxhY2UoJ1w6JywgJzonKQorICAgIG5ld190ZXh0ID0gbmV3X3RleHQucmVwbGFjZSgnXD8nLCAnPycpCisgICAgcmV0dXJuIG5ld190ZXh0CisKK2NsYXNzIFN0cmZ0aW1lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmssICoqa3cpOgorICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5fX2luaXRfXyhzZWxmLCAqaywgKiprdykKKworICAgIGRlZiBfdXBkYXRlX3ZhcmlhYmxlcyhzZWxmLCBub3cpOgorICAgICAgICAjIHdlIG11c3QgdXBkYXRlIHRoZSBsb2NhbCB2YXJpYWJsZXMgb24gZXZlcnkgY3ljbGUKKyAgICAgICAgc2VsZi5nbXQgPSB0aW1lLmdtdGltZShub3cpCisgICAgICAgIG5vdyA9IHRpbWUubG9jYWx0aW1lKG5vdykKKworICAgICAgICBpZiBub3dbM10gPCAxMjogc2VsZi5hbXBtPScoQU18YW0pJworICAgICAgICBlbHNlOiBzZWxmLmFtcG09JyhQTXxwbSknCisKKyAgICAgICAgc2VsZi5qYW4xID0gdGltZS5sb2NhbHRpbWUodGltZS5ta3RpbWUoKG5vd1swXSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgMCkpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vd1s4XTogc2VsZi50eiA9IHRpbWUudHpuYW1lWzFdCisgICAgICAgICAgICBlbHNlOiBzZWxmLnR6ID0gdGltZS50em5hbWVbMF0KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc2VsZi50eiA9ICcnCisKKyAgICAgICAgaWYgbm93WzNdID4gMTI6IHNlbGYuY2xvY2sxMiA9IG5vd1szXSAtIDEyCisgICAgICAgIGVsaWYgbm93WzNdID4gMDogc2VsZi5jbG9jazEyID0gbm93WzNdCisgICAgICAgIGVsc2U6IHNlbGYuY2xvY2sxMiA9IDEyCisKKyAgICAgICAgc2VsZi5ub3cgPSBub3cKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGphdmEKKyAgICAgICAgICAgIGphdmEudXRpbC5Mb2NhbGUuc2V0RGVmYXVsdChqYXZhLnV0aWwuTG9jYWxlLlVTKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpbXBvcnQgbG9jYWxlCisgICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19USU1FLCAnQycpCisKKyAgICBkZWYgdGVzdF9zdHJmdGltZShzZWxmKToKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5fdXBkYXRlX3ZhcmlhYmxlcyhub3cpCisgICAgICAgIHNlbGYuc3RyZnRlc3QxKG5vdykKKyAgICAgICAgc2VsZi5zdHJmdGVzdDIobm93KQorCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIlN0cmZ0aW1lIHRlc3QsIHBsYXRmb3JtOiAlcywgUHl0aG9uIHZlcnNpb246ICVzIiAlIFwKKyAgICAgICAgICAgICAgICAgIChzeXMucGxhdGZvcm0sIHN5cy52ZXJzaW9uLnNwbGl0KClbMF0pCisKKyAgICAgICAgZm9yIGogaW4gcmFuZ2UoLTUsIDUpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjUpOgorICAgICAgICAgICAgICAgIGFyZyA9IG5vdyArIChpK2oqMTAwKSoyMyozNjAzCisgICAgICAgICAgICAgICAgc2VsZi5fdXBkYXRlX3ZhcmlhYmxlcyhhcmcpCisgICAgICAgICAgICAgICAgc2VsZi5zdHJmdGVzdDEoYXJnKQorICAgICAgICAgICAgICAgIHNlbGYuc3RyZnRlc3QyKGFyZykKKworICAgIGRlZiBzdHJmdGVzdDEoc2VsZiwgbm93KToKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAic3RyZnRpbWUgdGVzdCBmb3IiLCB0aW1lLmN0aW1lKG5vdykKKyAgICAgICAgbm93ID0gc2VsZi5ub3cKKyAgICAgICAgIyBNYWtlIHN1cmUgYW55IGNoYXJhY3RlcnMgdGhhdCBjb3VsZCBiZSB0YWtlbiBhcyByZWdleCBzeW50YXggaXMKKyAgICAgICAgIyBlc2NhcGVkIGluIGVzY2FwZXN0cigpCisgICAgICAgIGV4cGVjdGF0aW9ucyA9ICgKKyAgICAgICAgICAgICgnJWEnLCBjYWxlbmRhci5kYXlfYWJicltub3dbNl1dLCAnYWJicmV2aWF0ZWQgd2Vla2RheSBuYW1lJyksCisgICAgICAgICAgICAoJyVBJywgY2FsZW5kYXIuZGF5X25hbWVbbm93WzZdXSwgJ2Z1bGwgd2Vla2RheSBuYW1lJyksCisgICAgICAgICAgICAoJyViJywgY2FsZW5kYXIubW9udGhfYWJicltub3dbMV1dLCAnYWJicmV2aWF0ZWQgbW9udGggbmFtZScpLAorICAgICAgICAgICAgKCclQicsIGNhbGVuZGFyLm1vbnRoX25hbWVbbm93WzFdXSwgJ2Z1bGwgbW9udGggbmFtZScpLAorICAgICAgICAgICAgIyAlYyBzZWUgYmVsb3cKKyAgICAgICAgICAgICgnJWQnLCAnJTAyZCcgJSBub3dbMl0sICdkYXkgb2YgbW9udGggYXMgbnVtYmVyICgwMC0zMSknKSwKKyAgICAgICAgICAgICgnJUgnLCAnJTAyZCcgJSBub3dbM10sICdob3VyICgwMC0yMyknKSwKKyAgICAgICAgICAgICgnJUknLCAnJTAyZCcgJSBzZWxmLmNsb2NrMTIsICdob3VyICgwMS0xMiknKSwKKyAgICAgICAgICAgICgnJWonLCAnJTAzZCcgJSBub3dbN10sICdqdWxpYW4gZGF5ICgwMDEtMzY2KScpLAorICAgICAgICAgICAgKCclbScsICclMDJkJyAlIG5vd1sxXSwgJ21vbnRoIGFzIG51bWJlciAoMDEtMTIpJyksCisgICAgICAgICAgICAoJyVNJywgJyUwMmQnICUgbm93WzRdLCAnbWludXRlLCAoMDAtNTkpJyksCisgICAgICAgICAgICAoJyVwJywgc2VsZi5hbXBtLCAnQU0gb3IgUE0gYXMgYXBwcm9wcmlhdGUnKSwKKyAgICAgICAgICAgICgnJVMnLCAnJTAyZCcgJSBub3dbNV0sICdzZWNvbmRzIG9mIGN1cnJlbnQgdGltZSAoMDAtNjApJyksCisgICAgICAgICAgICAoJyVVJywgJyUwMmQnICUgKChub3dbN10gKyBzZWxmLmphbjFbNl0pLy83KSwKKyAgICAgICAgICAgICAnd2VlayBudW1iZXIgb2YgdGhlIHllYXIgKFN1biAxc3QpJyksCisgICAgICAgICAgICAoJyV3JywgJzA/JWQnICUgKCgxK25vd1s2XSkgJSA3KSwgJ3dlZWtkYXkgYXMgYSBudW1iZXIgKFN1biAxc3QpJyksCisgICAgICAgICAgICAoJyVXJywgJyUwMmQnICUgKChub3dbN10gKyAoc2VsZi5qYW4xWzZdIC0gMSklNykvLzcpLAorICAgICAgICAgICAgJ3dlZWsgbnVtYmVyIG9mIHRoZSB5ZWFyIChNb24gMXN0KScpLAorICAgICAgICAgICAgIyAleCBzZWUgYmVsb3cKKyAgICAgICAgICAgICgnJVgnLCAnJTAyZDolMDJkOiUwMmQnICUgKG5vd1szXSwgbm93WzRdLCBub3dbNV0pLCAnJUg6JU06JVMnKSwKKyAgICAgICAgICAgICgnJXknLCAnJTAyZCcgJSAobm93WzBdJTEwMCksICd5ZWFyIHdpdGhvdXQgY2VudHVyeScpLAorICAgICAgICAgICAgKCclWScsICclZCcgJSBub3dbMF0sICd5ZWFyIHdpdGggY2VudHVyeScpLAorICAgICAgICAgICAgIyAlWiBzZWUgYmVsb3cKKyAgICAgICAgICAgICgnJSUnLCAnJScsICdzaW5nbGUgcGVyY2VudCBzaWduJyksCisgICAgICAgICkKKworICAgICAgICBmb3IgZSBpbiBleHBlY3RhdGlvbnM6CisgICAgICAgICAgICAjIG11c24ndCByYWlzZSBhIHZhbHVlIGVycm9yCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGltZS5zdHJmdGltZShlWzBdLCBub3cpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgZXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzdHJmdGltZSAnJXMnIGZvcm1hdCBnYXZlIGVycm9yOiAlcyIgJSAoZVswXSwgZXJyb3IpKQorICAgICAgICAgICAgaWYgcmUubWF0Y2goZXNjYXBlc3RyKGVbMV0sIHNlbGYuYW1wbSksIHJlc3VsdCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5vdCByZXN1bHQgb3IgcmVzdWx0WzBdID09ICclJzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInN0cmZ0aW1lIGRvZXMgbm90IHN1cHBvcnQgc3RhbmRhcmQgJyVzJyBmb3JtYXQgKCVzKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZVswXSwgZVsyXSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiQ29uZmxpY3QgZm9yICVzICglcyk6IGV4cGVjdGVkICVzLCBidXQgZ290ICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAlIChlWzBdLCBlWzJdLCBlWzFdLCByZXN1bHQpKQorCisgICAgZGVmIHN0cmZ0ZXN0MihzZWxmLCBub3cpOgorICAgICAgICBub3dzZWNzID0gc3RyKGxvbmcobm93KSlbOi0xXQorICAgICAgICBub3cgPSBzZWxmLm5vdworCisgICAgICAgIG5vbnN0YW5kYXJkX2V4cGVjdGF0aW9ucyA9ICgKKyAgICAgICAgIyBUaGVzZSBhcmUgc3RhbmRhcmQgYnV0IGRvbid0IGhhdmUgcHJlZGljdGFibGUgb3V0cHV0CisgICAgICAgICAgICAoJyVjJywgZml4YXNjdGltZSh0aW1lLmFzY3RpbWUobm93KSksICduZWFyLWFzY3RpbWUoKSBmb3JtYXQnKSwKKyAgICAgICAgICAgICgnJXgnLCAnJTAyZC8lMDJkLyUwMmQnICUgKG5vd1sxXSwgbm93WzJdLCAobm93WzBdJTEwMCkpLAorICAgICAgICAgICAgJyVtLyVkLyV5ICVIOiVNOiVTJyksCisgICAgICAgICAgICAoJyVaJywgJyVzJyAlIHNlbGYudHosICd0aW1lIHpvbmUgbmFtZScpLAorCisgICAgICAgICAgICAjIFRoZXNlIGFyZSBzb21lIHBsYXRmb3JtIHNwZWNpZmljIGV4dGVuc2lvbnMKKyAgICAgICAgICAgICgnJUQnLCAnJTAyZC8lMDJkLyUwMmQnICUgKG5vd1sxXSwgbm93WzJdLCAobm93WzBdJTEwMCkpLCAnbW0vZGQveXknKSwKKyAgICAgICAgICAgICgnJWUnLCAnJTJkJyAlIG5vd1syXSwgJ2RheSBvZiBtb250aCBhcyBudW1iZXIsIGJsYW5rIHBhZGRlZCAoIDAtMzEpJyksCisgICAgICAgICAgICAoJyVoJywgY2FsZW5kYXIubW9udGhfYWJicltub3dbMV1dLCAnYWJicmV2aWF0ZWQgbW9udGggbmFtZScpLAorICAgICAgICAgICAgKCclaycsICclMmQnICUgbm93WzNdLCAnaG91ciwgYmxhbmsgcGFkZGVkICggMC0yMyknKSwKKyAgICAgICAgICAgICgnJW4nLCAnXG4nLCAnbmV3bGluZSBjaGFyYWN0ZXInKSwKKyAgICAgICAgICAgICgnJXInLCAnJTAyZDolMDJkOiUwMmQgJXMnICUgKHNlbGYuY2xvY2sxMiwgbm93WzRdLCBub3dbNV0sIHNlbGYuYW1wbSksCisgICAgICAgICAgICAnJUk6JU06JVMgJXAnKSwKKyAgICAgICAgICAgICgnJVInLCAnJTAyZDolMDJkJyAlIChub3dbM10sIG5vd1s0XSksICclSDolTScpLAorICAgICAgICAgICAgKCclcycsIG5vd3NlY3MsICdzZWNvbmRzIHNpbmNlIHRoZSBFcG9jaCBpbiBVQ1QnKSwKKyAgICAgICAgICAgICgnJXQnLCAnXHQnLCAndGFiIGNoYXJhY3RlcicpLAorICAgICAgICAgICAgKCclVCcsICclMDJkOiUwMmQ6JTAyZCcgJSAobm93WzNdLCBub3dbNF0sIG5vd1s1XSksICclSDolTTolUycpLAorICAgICAgICAgICAgKCclM3knLCAnJTAzZCcgJSAobm93WzBdJTEwMCksCisgICAgICAgICAgICAneWVhciB3aXRob3V0IGNlbnR1cnkgcmVuZGVyZWQgdXNpbmcgZmllbGR3aWR0aCcpLAorICAgICAgICApCisKKyAgICAgICAgZm9yIGUgaW4gbm9uc3RhbmRhcmRfZXhwZWN0YXRpb25zOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRpbWUuc3RyZnRpbWUoZVswXSwgbm93KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIHJlc3VsdDoKKyAgICAgICAgICAgICAgICBtc2cgPSAiRXJyb3IgZm9yIG5vbnN0YW5kYXJkICclcycgZm9ybWF0ICglcyk6ICVzIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAoZVswXSwgZVsyXSwgc3RyKHJlc3VsdCkpCisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50IG1zZworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIHJlLm1hdGNoKGVzY2FwZXN0cihlWzFdLCBzZWxmLmFtcG0pLCByZXN1bHQpOgorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiU3VwcG9ydHMgbm9uc3RhbmRhcmQgJyVzJyBmb3JtYXQgKCVzKSIgJSAoZVswXSwgZVsyXSkKKyAgICAgICAgICAgIGVsaWYgbm90IHJlc3VsdCBvciByZXN1bHRbMF0gPT0gJyUnOgorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiRG9lcyBub3QgYXBwZWFyIHRvIHN1cHBvcnQgJyVzJyBmb3JtYXQgKCVzKSIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZVswXSwgZVsyXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJDb25mbGljdCBmb3Igbm9uc3RhbmRhcmQgJyVzJyBmb3JtYXQgKCVzKToiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVbMF0sIGVbMl0pCisgICAgICAgICAgICAgICAgICAgIHByaW50ICIgIEV4cGVjdGVkICVzLCBidXQgZ290ICVzIiAlIChlWzFdLCByZXN1bHQpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFN0cmZ0aW1lVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyZnRpbWUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyZnRpbWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NmFiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJmdGltZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyZnRpbWUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyZnRpbWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NmFiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJmdGltZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5nLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMDdiOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJpbmcucHkKQEAgLTAsMCArMSwyMTcgQEAKK2ltcG9ydCB1bml0dGVzdCwgc3RyaW5nCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgc3RyaW5nX3Rlc3RzCitmcm9tIFVzZXJMaXN0IGltcG9ydCBVc2VyTGlzdAorCitjbGFzcyBTdHJpbmdUZXN0KAorICAgIHN0cmluZ190ZXN0cy5Db21tb25UZXN0LAorICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clN0cmluZ1VzZXJTdHJpbmdUZXN0CisgICAgKToKKworICAgIHR5cGUydGVzdCA9IHN0cgorCisgICAgZGVmIGNoZWNrZXF1YWwoc2VsZiwgcmVzdWx0LCBvYmplY3QsIG1ldGhvZG5hbWUsICphcmdzKToKKyAgICAgICAgcmVhbHJlc3VsdCA9IGdldGF0dHIoc3RyaW5nLCBtZXRob2RuYW1lKShvYmplY3QsICphcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcmVzdWx0LAorICAgICAgICAgICAgcmVhbHJlc3VsdAorICAgICAgICApCisKKyAgICBkZWYgY2hlY2tyYWlzZXMoc2VsZiwgZXhjLCBvYmplY3QsIG1ldGhvZG5hbWUsICphcmdzKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBleGMsCisgICAgICAgICAgICBnZXRhdHRyKHN0cmluZywgbWV0aG9kbmFtZSksCisgICAgICAgICAgICBvYmplY3QsCisgICAgICAgICAgICAqYXJncworICAgICAgICApCisKKyAgICBkZWYgY2hlY2tjYWxsKHNlbGYsIG9iamVjdCwgbWV0aG9kbmFtZSwgKmFyZ3MpOgorICAgICAgICBnZXRhdHRyKHN0cmluZywgbWV0aG9kbmFtZSkob2JqZWN0LCAqYXJncykKKworICAgIGRlZiB0ZXN0X2pvaW4oc2VsZik6CisgICAgICAgICMgVGhlc2UgYXJlIHRoZSBzYW1lIGNoZWNrcyBhcyBpbiBzdHJpbmdfdGVzdC5PYmplY3RUZXN0LnRlc3Rfam9pbgorICAgICAgICAjIGJ1dCB0aGUgYXJndW1lbnQgb3JkZXIgaXN0IGRpZmZlcmVudAorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2EgYiBjIGQnLCBbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2pvaW4nLCAnICcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjZCcsICgnYScsICdiJywgJ2MnLCAnZCcpLCAnam9pbicsICcnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3cgeCB5IHonLCBzdHJpbmdfdGVzdHMuU2VxdWVuY2UoKSwgJ2pvaW4nLCAnICcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjJywgKCdhYmMnLCksICdqb2luJywgJ2EnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3onLCBVc2VyTGlzdChbJ3onXSksICdqb2luJywgJ2EnKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKHVuaWNvZGUoJ2EuYi5jJyksIFsnYScsICdiJywgJ2MnXSwgJ2pvaW4nLCB1bmljb2RlKCcuJykpCisgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwodW5pY29kZSgnYS5iLmMnKSwgW3VuaWNvZGUoJ2EnKSwgJ2InLCAnYyddLCAnam9pbicsICcuJykKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1bmljb2RlKCdhLmIuYycpLCBbJ2EnLCB1bmljb2RlKCdiJyksICdjJ10sICdqb2luJywgJy4nKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKHVuaWNvZGUoJ2EuYi5jJyksIFsnYScsICdiJywgdW5pY29kZSgnYycpXSwgJ2pvaW4nLCAnLicpCisgICAgICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgWydhJywgdW5pY29kZSgnYicpLCAzXSwgJ2pvaW4nLCAnLicpCisgICAgICAgIGZvciBpIGluIFs1LCAyNSwgMTI1XToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgKKyAgICAgICAgICAgICAgICAoKCgnYScgKiBpKSArICctJykgKiBpKVs6LTFdLAorICAgICAgICAgICAgICAgIFsnYScgKiBpXSAqIGksICdqb2luJywgJy0nKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKAorICAgICAgICAgICAgICAgICgoKCdhJyAqIGkpICsgJy0nKSAqIGkpWzotMV0sCisgICAgICAgICAgICAgICAgKCdhJyAqIGksKSAqIGksICdqb2luJywgJy0nKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCBzdHJpbmdfdGVzdHMuQmFkU2VxMSgpLCAnam9pbicsICcgJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhIGIgYycsIHN0cmluZ190ZXN0cy5CYWRTZXEyKCksICdqb2luJywgJyAnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgIHlpZWxkIDQgKyAiIgorICAgICAgICAgICAgc2VsZi5maXh0eXBlKCcgJykuam9pbihmKCkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGU6CisgICAgICAgICAgICBpZiAnKycgbm90IGluIHN0cihlKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ2pvaW4oKSBhdGUgZXhjZXB0aW9uIG1lc3NhZ2UnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdleGNlcHRpb24gbm90IHJhaXNlZCcpCisKKworCisKK2NsYXNzIE1vZHVsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYXR0cnMoc2VsZik6CisgICAgICAgIHN0cmluZy53aGl0ZXNwYWNlCisgICAgICAgIHN0cmluZy5sb3dlcmNhc2UKKyAgICAgICAgc3RyaW5nLnVwcGVyY2FzZQorICAgICAgICBzdHJpbmcubGV0dGVycworICAgICAgICBzdHJpbmcuZGlnaXRzCisgICAgICAgIHN0cmluZy5oZXhkaWdpdHMKKyAgICAgICAgc3RyaW5nLm9jdGRpZ2l0cworICAgICAgICBzdHJpbmcucHVuY3R1YXRpb24KKyAgICAgICAgc3RyaW5nLnByaW50YWJsZQorCisgICAgZGVmIHRlc3RfYXRvaShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmcuYXRvaSgiIDEgIiksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cmluZy5hdG9pLCAiIDF4IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3RyaW5nLmF0b2ksICIgeDEgIikKKworICAgIGRlZiB0ZXN0X2F0b2woc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLmF0b2woIiAgMSAgIiksIDFMKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJpbmcuYXRvbCwgIiAgMXggIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3RyaW5nLmF0b2wsICIgIHgxICIpCisKKyAgICBkZWYgdGVzdF9hdG9mKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHN0cmluZy5hdG9mKCIgIDEgICIpLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cmluZy5hdG9mLCAiICAxeCAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJpbmcuYXRvZiwgIiAgeDEgIikKKworICAgIGRlZiB0ZXN0X21ha2V0cmFucyhzZWxmKToKKyAgICAgICAgdHJhbnN0YWJsZSA9ICdcMDAwXDAwMVwwMDJcMDAzXDAwNFwwMDVcMDA2XDAwN1wwMTBcMDExXDAxMlwwMTNcMDE0XDAxNVwwMTZcMDE3XDAyMFwwMjFcMDIyXDAyM1wwMjRcMDI1XDAyNlwwMjdcMDMwXDAzMVwwMzJcMDMzXDAzNFwwMzVcMDM2XDAzNyAhIiMkJSZcJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXF1eX2B4eXpkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cMTc3XDIwMFwyMDFcMjAyXDIwM1wyMDRcMjA1XDIwNlwyMDdcMjEwXDIxMVwyMTJcMjEzXDIxNFwyMTVcMjE2XDIxN1wyMjBcMjIxXDIyMlwyMjNcMjI0XDIyNVwyMjZcMjI3XDIzMFwyMzFcMjMyXDIzM1wyMzRcMjM1XDIzNlwyMzdcMjQwXDI0MVwyNDJcMjQzXDI0NFwyNDVcMjQ2XDI0N1wyNTBcMjUxXDI1MlwyNTNcMjU0XDI1NVwyNTZcMjU3XDI2MFwyNjFcMjYyXDI2M1wyNjRcMjY1XDI2NlwyNjdcMjcwXDI3MVwyNzJcMjczXDI3NFwyNzVcMjc2XDI3N1wzMDBcMzAxXDMwMlwzMDNcMzA0XDMwNVwzMDZcMzA3XDMxMFwzMTFcMzEyXDMxM1wzMTRcMzE1XDMxNlwzMTdcMzIwXDMyMVwzMjJcMzIzXDMyNFwzMjVcMzI2XDMyN1wzMzBcMzMxXDMzMlwzMzNcMzM0XDMzNVwzMzZcMzM3XDM0MFwzNDFcMzQyXDM0M1wzNDRcMzQ1XDM0NlwzNDdcMzUwXDM1MVwzNTJcMzUzXDM1NFwzNTVcMzU2XDM1N1wzNjBcMzYxXDM2MlwzNjNcMzY0XDM2NVwzNjZcMzY3XDM3MFwzNzFcMzcyXDM3M1wzNzRcMzc1XDM3NlwzNzcnCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmcubWFrZXRyYW5zKCdhYmMnLCAneHl6JyksIHRyYW5zdGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cmluZy5tYWtldHJhbnMsICdhYmMnLCAneHl6cScpCisKKyAgICBkZWYgdGVzdF9jYXB3b3JkcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmcuY2Fwd29yZHMoJ2FiYyBkZWYgZ2hpJyksICdBYmMgRGVmIEdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLmNhcHdvcmRzKCdhYmNcdGRlZlxuZ2hpJyksICdBYmMgRGVmIEdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLmNhcHdvcmRzKCdhYmNcdCAgIGRlZiAgXG5naGknKSwgJ0FiYyBEZWYgR2hpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmcuY2Fwd29yZHMoJ0FCQyBERUYgR0hJJyksICdBYmMgRGVmIEdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLmNhcHdvcmRzKCdBQkMtREVGLUdISScsICctJyksICdBYmMtRGVmLUdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLmNhcHdvcmRzKCdBQkMtZGVmIERFRi1naGkgR0hJJyksICdBYmMtZGVmIERlZi1naGkgR2hpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmcuY2Fwd29yZHMoJyAgIGFCYyAgRGVGICAgJyksICdBYmMgRGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmcuY2Fwd29yZHMoJ1x0YUJjXHREZUZcdCcpLCAnQWJjIERlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLmNhcHdvcmRzKCdcdGFCY1x0RGVGXHQnLCAnXHQnKSwgJ1x0QWJjXHREZWZcdCcpCisKKyAgICBkZWYgdGVzdF9mb3JtYXR0ZXIoc2VsZik6CisgICAgICAgIGZtdCA9IHN0cmluZy5Gb3JtYXR0ZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdC5mb3JtYXQoImZvbyIpLCAiZm9vIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdC5mb3JtYXQoImZvb3swfSIsICJiYXIiKSwgImZvb2JhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10LmZvcm1hdCgiZm9vezF9ezB9LXsxfSIsICJiYXIiLCA2KSwgImZvbzZiYXItNiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10LmZvcm1hdCgiLXthcmchcn0tIiwgYXJnPSd0ZXN0JyksICItJ3Rlc3QnLSIpCisKKyAgICAgICAgIyBvdmVycmlkZSBnZXRfdmFsdWUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgY2xhc3MgTmFtZXNwYWNlRm9ybWF0dGVyKHN0cmluZy5Gb3JtYXR0ZXIpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWVzcGFjZT17fSk6CisgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdHRlci5fX2luaXRfXyhzZWxmKQorICAgICAgICAgICAgICAgIHNlbGYubmFtZXNwYWNlID0gbmFtZXNwYWNlCisKKyAgICAgICAgICAgIGRlZiBnZXRfdmFsdWUoc2VsZiwga2V5LCBhcmdzLCBrd2RzKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgc3RyKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayBleHBsaWNpdGx5IHBhc3NlZCBhcmd1bWVudHMgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrd2RzW2tleV0KKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZXNwYWNlW2tleV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0dGVyLmdldF92YWx1ZShrZXksIGFyZ3MsIGt3ZHMpCisKKyAgICAgICAgZm10ID0gTmFtZXNwYWNlRm9ybWF0dGVyKHsnZ3JlZXRpbmcnOidoZWxsbyd9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdC5mb3JtYXQoIntncmVldGluZ30sIHdvcmxkISIpLCAnaGVsbG8sIHdvcmxkIScpCisKKworICAgICAgICAjIG92ZXJyaWRlIGZvcm1hdF9maWVsZCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICBjbGFzcyBDYWxsRm9ybWF0dGVyKHN0cmluZy5Gb3JtYXR0ZXIpOgorICAgICAgICAgICAgZGVmIGZvcm1hdF9maWVsZChzZWxmLCB2YWx1ZSwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXQodmFsdWUoKSwgZm9ybWF0X3NwZWMpCisKKyAgICAgICAgZm10ID0gQ2FsbEZvcm1hdHRlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10LmZvcm1hdCgnKnswfSonLCBsYW1iZGEgOiAncmVzdWx0JyksICcqcmVzdWx0KicpCisKKworICAgICAgICAjIG92ZXJyaWRlIGNvbnZlcnRfZmllbGQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICBjbGFzcyBYRm9ybWF0dGVyKHN0cmluZy5Gb3JtYXR0ZXIpOgorICAgICAgICAgICAgZGVmIGNvbnZlcnRfZmllbGQoc2VsZiwgdmFsdWUsIGNvbnZlcnNpb24pOgorICAgICAgICAgICAgICAgIGlmIGNvbnZlcnNpb24gPT0gJ3gnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlcihYRm9ybWF0dGVyLCBzZWxmKS5jb252ZXJ0X2ZpZWxkKHZhbHVlLCBjb252ZXJzaW9uKQorCisgICAgICAgIGZtdCA9IFhGb3JtYXR0ZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdC5mb3JtYXQoInswIXJ9OnswIXh9IiwgJ2ZvbycsICdmb28nKSwgIidmb28nOk5vbmUiKQorCisKKyAgICAgICAgIyBvdmVycmlkZSBwYXJzZSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgY2xhc3MgQmFyRm9ybWF0dGVyKHN0cmluZy5Gb3JtYXR0ZXIpOgorICAgICAgICAgICAgIyByZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgY29udGFpbnMgdHVwbGVzIG9mIHRoZSBmb3JtOgorICAgICAgICAgICAgIyAobGl0ZXJhbF90ZXh0LCBmaWVsZF9uYW1lLCBmb3JtYXRfc3BlYywgY29udmVyc2lvbikKKyAgICAgICAgICAgIGRlZiBwYXJzZShzZWxmLCBmb3JtYXRfc3RyaW5nKToKKyAgICAgICAgICAgICAgICBmb3IgZmllbGQgaW4gZm9ybWF0X3N0cmluZy5zcGxpdCgnfCcpOgorICAgICAgICAgICAgICAgICAgICBpZiBmaWVsZFswXSA9PSAnKyc6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGl0J3MgbWFya3VwCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lLCBfLCBmb3JtYXRfc3BlYyA9IGZpZWxkWzE6XS5wYXJ0aXRpb24oJzonKQorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgJycsIGZpZWxkX25hbWUsIGZvcm1hdF9zcGVjLCBOb25lCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBmaWVsZCwgTm9uZSwgTm9uZSwgTm9uZQorCisgICAgICAgIGZtdCA9IEJhckZvcm1hdHRlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10LmZvcm1hdCgnKnwrMDpeMTBzfConLCAnZm9vJyksICcqICAgZm9vICAgIConKQorCisgICAgICAgICMgdGVzdCBhbGwgcGFyYW1ldGVycyB1c2VkCisgICAgICAgIGNsYXNzIENoZWNrQWxsVXNlZEZvcm1hdHRlcihzdHJpbmcuRm9ybWF0dGVyKToKKyAgICAgICAgICAgIGRlZiBjaGVja191bnVzZWRfYXJncyhzZWxmLCB1c2VkX2FyZ3MsIGFyZ3MsIGt3YXJncyk6CisgICAgICAgICAgICAgICAgIyBUcmFjayB3aGljaCBhcmd1bWVudHMgYWN0dWFsbHkgZ290IHVzZWQKKyAgICAgICAgICAgICAgICB1bnVzZWRfYXJncyA9IHNldChrd2FyZ3Mua2V5cygpKQorICAgICAgICAgICAgICAgIHVudXNlZF9hcmdzLnVwZGF0ZShyYW5nZSgwLCBsZW4oYXJncykpKQorCisgICAgICAgICAgICAgICAgZm9yIGFyZyBpbiB1c2VkX2FyZ3M6CisgICAgICAgICAgICAgICAgICAgIHVudXNlZF9hcmdzLnJlbW92ZShhcmcpCisKKyAgICAgICAgICAgICAgICBpZiB1bnVzZWRfYXJnczoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW51c2VkIGFyZ3VtZW50cyIpCisKKyAgICAgICAgZm10ID0gQ2hlY2tBbGxVc2VkRm9ybWF0dGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQuZm9ybWF0KCJ7MH0iLCAxMCksICIxMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10LmZvcm1hdCgiezB9e2l9IiwgMTAsIGk9MTAwKSwgIjEwMTAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQuZm9ybWF0KCJ7MH17aX17MX0iLCAxMCwgMjAsIGk9MTAwKSwgIjEwMTAwMjAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbXQuZm9ybWF0LCAiezB9e2l9ezF9IiwgMTAsIDIwLCBpPTEwMCwgaj0wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbXQuZm9ybWF0LCAiezB9IiwgMTAsIDIwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbXQuZm9ybWF0LCAiezB9IiwgMTAsIDIwLCBpPTEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm10LmZvcm1hdCwgIntpfSIsIDEwLCAyMCwgaT0xMDApCisKKyAgICAgICAgIyBBbHRlcm5hdGUgZm9ybWF0dGluZyBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgJycsICcjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAnJywgJyMyMCcpCisKK2NsYXNzIEJ5dGVzQWxpYXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2J1aWx0aW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIgaXMgYnl0ZXMpCisKKyAgICBkZWYgdGVzdF9zeW50YXgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJzcGFtIiwgInNwYW0iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJyImVnZ1xmb28iLCAiZWdnXFxmb28iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiIiIpLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGJyIiIpLCBzdHIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFN0cmluZ1Rlc3QsIE1vZHVsZVRlc3QsIEJ5dGVzQWxpYXNUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJpbmcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjllZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJpbmcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjllZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJpbmdwcmVwLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5ncHJlcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJkZjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5ncHJlcC5weQpAQCAtMCwwICsxLDk2IEBACisjIFRvIGZ1bGx5IHRlc3QgdGhpcyBtb2R1bGUsIHdlIHdvdWxkIG5lZWQgYSBjb3B5IG9mIHRoZSBzdHJpbmdwcmVwIHRhYmxlcy4KKyMgU2luY2Ugd2UgZG9uJ3QgaGF2ZSB0aGVtLCB0aGlzIHRlc3QgY2hlY2tzIG9ubHkgYSBmZXcgY29kZXBvaW50cy4KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitmcm9tIHN0cmluZ3ByZXAgaW1wb3J0ICoKKworY2xhc3MgU3RyaW5ncHJlcFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2ExKHUiXHUwMjIxIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYTEodSJcdTAyMjIiKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYjEodSJcdTAwYWQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9iMSh1Ilx1MDBhZSIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXBfdGFibGVfYjIodSJcdTAwNDEiKSwgdSJcdTAwNjEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWFwX3RhYmxlX2IyKHUiXHUwMDYxIiksIHUiXHUwMDYxIikKKworICAgICAgICBzZWxmLmFzc2VydFRydWUobWFwX3RhYmxlX2IzKHUiXHUwMDQxIiksIHUiXHUwMDYxIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hcF90YWJsZV9iMyh1Ilx1MDA2MSIpLCB1Ilx1MDA2MSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2MxMSh1Ilx1MDAyMCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2MxMSh1Ilx1MDAyMSIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jMTIodSJcdTAwYTAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMTIodSJcdTAwYTEiKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzEyKHUiXHUwMGEwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzEyKHUiXHUwMGExIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2MxMV9jMTIodSJcdTAwYTAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMTFfYzEyKHUiXHUwMGExIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2MyMSh1Ilx1MDAxZiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2MyMSh1Ilx1MDAyMCIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jMjIodSJcdTAwOWYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMjIodSJcdTAwYTAiKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzIxX2MyMih1Ilx1MDA5ZiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2MyMV9jMjIodSJcdTAwYTAiKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzModSJcdWUwMDAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMyh1Ilx1ZjkwMCIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jNCh1Ilx1ZmZmZiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2M0KHUiXHUwMDAwIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2M1KHUiXHVkODAwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzUodSJcdWQ3ZmYiKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzYodSJcdWZmZjkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jNih1Ilx1ZmZmZSIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jNyh1Ilx1MmZmMCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2M3KHUiXHUyZmZjIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2M4KHUiXHUwMzQwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzgodSJcdTAzNDIiKSkKKworICAgICAgICAjIEMuOSBpcyBub3QgaW4gdGhlIGJtcAorICAgICAgICAjIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jOSh1IlxVMDAwRTAwMDEiKSkKKyAgICAgICAgIyBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2M4KHUiXFUwMDBFMDAwMiIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9kMSh1Ilx1MDViZSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2QxKHUiXHUwNWJmIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2QyKHUiXHUwMDQxIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfZDIodSJcdTAwNDAiKSkKKworICAgICAgICAjIFRoaXMgd291bGQgZ2VuZXJhdGUgYSBoYXNoIG9mIGFsbCBwcmVkaWNhdGVzLiBIb3dldmVyLCBydW5uaW5nCisgICAgICAgICMgaXQgaXMgcXVpdGUgZXhwZW5zaXZlLCBhbmQgb25seSBzZXJ2ZXMgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gdGhlCisgICAgICAgICMgdW5pY29kZSBkYXRhYmFzZS4gSW5zdGVhZCwgc3RyaW5ncHJlcC5weSBhc3NlcnRzIHRoZSB2ZXJzaW9uIG9mCisgICAgICAgICMgdGhlIGRhdGFiYXNlLgorCisgICAgICAgICMgaW1wb3J0IGhhc2hsaWIKKyAgICAgICAgIyBwcmVkaWNhdGVzID0gW2sgZm9yIGsgaW4gZGlyKHN0cmluZ3ByZXApIGlmIGsuc3RhcnRzd2l0aCgiaW5fdGFibGUiKV0KKyAgICAgICAgIyBwcmVkaWNhdGVzLnNvcnQoKQorICAgICAgICAjIGZvciBwIGluIHByZWRpY2F0ZXM6CisgICAgICAgICMgICAgIGYgPSBnZXRhdHRyKHN0cmluZ3ByZXAsIHApCisgICAgICAgICMgICAgICMgQ29sbGVjdCBhbGwgQk1QIGNvZGUgcG9pbnRzCisgICAgICAgICMgICAgIGRhdGEgPSBbIjAiXSAqIDB4MTAwMDAKKyAgICAgICAgIyAgICAgZm9yIGkgaW4gcmFuZ2UoMHgxMDAwMCk6CisgICAgICAgICMgICAgICAgICBpZiBmKHVuaWNocihpKSk6CisgICAgICAgICMgICAgICAgICAgICAgZGF0YVtpXSA9ICIxIgorICAgICAgICAjICAgICBkYXRhID0gIiIuam9pbihkYXRhKQorICAgICAgICAjICAgICBoID0gaGFzaGxpYi5zaGExKCkKKyAgICAgICAgIyAgICAgaC51cGRhdGUoZGF0YSkKKyAgICAgICAgIyAgICAgcHJpbnQgcCwgaC5oZXhkaWdlc3QoKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTdHJpbmdwcmVwVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5ncHJlcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlNTJiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5ncHJlcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlNTJiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cm9wLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3Ryb3AucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlMjllZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cm9wLnB5CkBAIC0wLDAgKzEsMTUzIEBACitpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAic3Ryb3AgZnVuY3Rpb25zIGFyZSBvYnNvbGV0ZTsiLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgcid0ZXN0LnRlc3Rfc3Ryb3B8dW5pdHRlc3QnKQoraW1wb3J0IHN0cm9wCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKworY2xhc3MgU3Ryb3BGdW5jdGlvblRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2F0b2koc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5hdG9pKCIgMSAiKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJvcC5hdG9pLCAiIDF4IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3Ryb3AuYXRvaSwgIiB4MSAiKQorCisgICAgZGVmIHRlc3RfYXRvbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmF0b2woIiAxICIpID09IDFMKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJvcC5hdG9sLCAiIDF4IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3Ryb3AuYXRvbCwgIiB4MSAiKQorCisgICAgZGVmIHRlc3RfYXRvZihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmF0b2YoIiAxICIpID09IDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3Ryb3AuYXRvZiwgIiAxeCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cm9wLmF0b2YsICIgeDEgIikKKworICAgIGRlZiB0ZXN0X2NhcGl0YWxpemUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5jYXBpdGFsaXplKCIgaGVsbG8gIikgPT0gIiBoZWxsbyAiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AuY2FwaXRhbGl6ZSgiaGVsbG8gIikgPT0gIkhlbGxvICIpCisKKyAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AuZmluZCgiYWJjZGVmZ2hpYWJjIiwgImFiYyIpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5maW5kKCJhYmNkZWZnaGlhYmMiLCAiYWJjIiwgMSkgPT0gOSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmZpbmQoImFiY2RlZmdoaWFiYyIsICJkZWYiLCA0KSA9PSAtMSkKKworICAgIGRlZiB0ZXN0X3JmaW5kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AucmZpbmQoImFiY2RlZmdoaWFiYyIsICJhYmMiKSA9PSA5KQorCisgICAgZGVmIHRlc3RfbG93ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5sb3dlcigiSGVMTG8iKSA9PSAiaGVsbG8iKQorCisgICAgZGVmIHRlc3RfdXBwZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC51cHBlcigiSGVMTG8iKSA9PSAiSEVMTE8iKQorCisgICAgZGVmIHRlc3Rfc3dhcGNhc2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5zd2FwY2FzZSgiSGVMTG8gY09tcFV0ZVJzIikgPT0gImhFbGxPIENvTVB1VEVyUyIpCisKKyAgICBkZWYgdGVzdF9zdHJpcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLnN0cmlwKCIgXHRcbiBoZWxsbyBcdFxuICIpID09ICJoZWxsbyIpCisKKyAgICBkZWYgdGVzdF9sc3RyaXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5sc3RyaXAoIiBcdFxuIGhlbGxvIFx0XG4gIikgPT0gImhlbGxvIFx0XG4gIikKKworICAgIGRlZiB0ZXN0X3JzdHJpcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLnJzdHJpcCgiIFx0XG4gaGVsbG8gXHRcbiAiKSA9PSAiIFx0XG4gaGVsbG8iKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKKyAgICAgICAgcmVwbGFjZSA9IHN0cm9wLnJlcGxhY2UKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJyEnLCAnQCcsIDEpCisgICAgICAgICAgICAgICAgICAgICA9PSAib25lQHR3byF0aHJlZSEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAnIScsICdAJywgMikKKyAgICAgICAgICAgICAgICAgICAgID09ICJvbmVAdHdvQHRocmVlISIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCAzKQorICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZUB0d29AdGhyZWVAIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJyEnLCAnQCcsIDQpCisgICAgICAgICAgICAgICAgICAgICA9PSAib25lQHR3b0B0aHJlZUAiKQorCisgICAgICAgICMgQ0FVVElPTjogYSByZXBsYWNlIGNvdW50IG9mIDAgbWVhbnMgaW5maW5pdHkgb25seSB0byBzdHJvcCwKKyAgICAgICAgIyBub3QgdG8gdGhlIHN0cmluZyAucmVwbGFjZSgpIG1ldGhvZCBvciB0byB0aGUKKyAgICAgICAgIyBzdHJpbmcucmVwbGFjZSgpIGZ1bmN0aW9uLgorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCAwKQorICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZUB0d29AdGhyZWVAIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJyEnLCAnQCcpCisgICAgICAgICAgICAgICAgICAgICA9PSAib25lQHR3b0B0aHJlZUAiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAneCcsICdAJykKKyAgICAgICAgICAgICAgICAgICAgID09ICJvbmUhdHdvIXRocmVlISIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICd4JywgJ0AnLCAyKQorICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZSF0d28hdGhyZWUhIikKKworICAgIGRlZiB0ZXN0X3NwbGl0KHNlbGYpOgorICAgICAgICBzcGxpdCA9IHN0cm9wLnNwbGl0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGxpdCgidGhpcyBpcyB0aGUgc3BsaXQgZnVuY3Rpb24iKQorICAgICAgICAgICAgICAgICAgICAgPT0gWyd0aGlzJywgJ2lzJywgJ3RoZScsICdzcGxpdCcsICdmdW5jdGlvbiddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoImF8YnxjfGQiLCAnfCcpID09IFsnYScsICdiJywgJ2MnLCAnZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoImF8YnxjfGQiLCAnfCcsIDIpID09IFsnYScsICdiJywgJ2N8ZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoImEgYiBjIGQiLCBOb25lLCAxKSA9PSBbJ2EnLCAnYiBjIGQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNwbGl0KCJhIGIgYyBkIiwgTm9uZSwgMikgPT0gWydhJywgJ2InLCAnYyBkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGxpdCgiYSBiIGMgZCIsIE5vbmUsIDMpID09IFsnYScsICdiJywgJ2MnLCAnZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoImEgYiBjIGQiLCBOb25lLCA0KSA9PSBbJ2EnLCAnYicsICdjJywgJ2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNwbGl0KCJhIGIgYyBkIiwgTm9uZSwgMCkgPT0gWydhJywgJ2InLCAnYycsICdkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGxpdCgiYSAgYiAgYyAgZCIsIE5vbmUsIDIpID09ICBbJ2EnLCAnYicsICdjICBkJ10pCisKKyAgICBkZWYgdGVzdF9qb2luKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3Auam9pbihbJ2EnLCAnYicsICdjJywgJ2QnXSkgPT0gJ2EgYiBjIGQnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3Auam9pbigoJ2EnLCAnYicsICdjJywgJ2QnKSwgJycpID09ICdhYmNkJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmpvaW4oU2VxdWVuY2UoKSkgPT0gJ3cgeCB5IHonKQorCisgICAgICAgICMgdHJ5IGEgZmV3IGxvbmcgb25lcworICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3Auam9pbihbJ3gnICogMTAwXSAqIDEwMCwgJzonKQorICAgICAgICAgICAgICAgICAgICAgPT0gKCgneCcgKiAxMDApICsgIjoiKSAqIDk5ICsgIngiICogMTAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3Auam9pbigoJ3gnICogMTAwLCkgKiAxMDAsICc6JykKKyAgICAgICAgICAgICAgICAgICAgID09ICgoJ3gnICogMTAwKSArICI6IikgKiA5OSArICJ4IiAqIDEwMCkKKworICAgIGRlZiB0ZXN0X21ha2V0cmFucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLm1ha2V0cmFucygiYWJjIiwgInh5eiIpID09IHRyYW5zdGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cm9wLm1ha2V0cmFucywgImFiYyIsICJ4eXpxIikKKworICAgIGRlZiB0ZXN0X3RyYW5zbGF0ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLnRyYW5zbGF0ZSgieHl6YWJjZGVmIiwgdHJhbnN0YWJsZSwgImRlZiIpCisgICAgICAgICAgICAgICAgICAgICA9PSAieHl6eHl6IikKKworICAgIGRlZiB0ZXN0X2RhdGFfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgc3Ryb3AubG93ZXJjYXNlCisgICAgICAgIHN0cm9wLnVwcGVyY2FzZQorICAgICAgICBzdHJvcC53aGl0ZXNwYWNlCisKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT10ZXN0X3N1cHBvcnQuXzJHIC0gMSwgbWVtdXNlPTUpCisgICAgZGVmIHRlc3Rfc3Ryb3Bqb2luX2h1Z2VfbGlzdChzZWxmLCBzaXplKToKKyAgICAgICAgYSA9ICJBIiAqIHNpemUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgciA9IHN0cm9wLmpvaW4oW2EsIGFdLCBhKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHIpLCBsZW4oYSkgKiAzKQorCisgICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9dGVzdF9zdXBwb3J0Ll8yRyAtIDEsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X3N0cm9wam9pbl9odWdlX3R1cChzZWxmLCBzaXplKToKKyAgICAgICAgYSA9ICJBIiAqIHNpemUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgciA9IHN0cm9wLmpvaW4oKGEsIGEpLCBhKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHBhc3MgIyBhY2NlcHRhYmxlIG9uIDMyLWJpdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ociksIGxlbihhKSAqIDMpCisKK3RyYW5zdGFibGUgPSAnXDAwMFwwMDFcMDAyXDAwM1wwMDRcMDA1XDAwNlwwMDdcMDEwXDAxMVwwMTJcMDEzXDAxNFwwMTVcMDE2XDAxN1wwMjBcMDIxXDAyMlwwMjNcMDI0XDAyNVwwMjZcMDI3XDAzMFwwMzFcMDMyXDAzM1wwMzRcMDM1XDAzNlwwMzcgISIjJCUmXCcoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXl9geHl6ZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+XDE3N1wyMDBcMjAxXDIwMlwyMDNcMjA0XDIwNVwyMDZcMjA3XDIxMFwyMTFcMjEyXDIxM1wyMTRcMjE1XDIxNlwyMTdcMjIwXDIyMVwyMjJcMjIzXDIyNFwyMjVcMjI2XDIyN1wyMzBcMjMxXDIzMlwyMzNcMjM0XDIzNVwyMzZcMjM3XDI0MFwyNDFcMjQyXDI0M1wyNDRcMjQ1XDI0NlwyNDdcMjUwXDI1MVwyNTJcMjUzXDI1NFwyNTVcMjU2XDI1N1wyNjBcMjYxXDI2MlwyNjNcMjY0XDI2NVwyNjZcMjY3XDI3MFwyNzFcMjcyXDI3M1wyNzRcMjc1XDI3NlwyNzdcMzAwXDMwMVwzMDJcMzAzXDMwNFwzMDVcMzA2XDMwN1wzMTBcMzExXDMxMlwzMTNcMzE0XDMxNVwzMTZcMzE3XDMyMFwzMjFcMzIyXDMyM1wzMjRcMzI1XDMyNlwzMjdcMzMwXDMzMVwzMzJcMzMzXDMzNFwzMzVcMzM2XDMzN1wzNDBcMzQxXDM0MlwzNDNcMzQ0XDM0NVwzNDZcMzQ3XDM1MFwzNTFcMzUyXDM1M1wzNTRcMzU1XDM1NlwzNTdcMzYwXDM2MVwzNjJcMzYzXDM2NFwzNjVcMzY2XDM2N1wzNzBcMzcxXDM3MlwzNzNcMzc0XDM3NVwzNzZcMzc3JworCisKKyMgam9pbigpIG5vdyB3b3JrcyB3aXRoIGFueSBzZXF1ZW5jZSB0eXBlLgorY2xhc3MgU2VxdWVuY2U6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLnNlcSA9ICd3eHl6JworICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuc2VxKQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKTogcmV0dXJuIHNlbGYuc2VxW2ldCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3Ryb3BGdW5jdGlvblRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cm9wLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cm9wLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWNkYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3Ryb3AucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cm9wLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cm9wLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWNkYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3Ryb3AucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnB0aW1lLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RycHRpbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlNDMwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnB0aW1lLnB5CkBAIC0wLDAgKzEsNTY3IEBACisiIiJQeVVuaXQgdGVzdGluZyBhZ2FpbnN0IHN0cnB0aW1lIiIiCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRpbWUKK2ltcG9ydCBsb2NhbGUKK2ltcG9ydCByZQoraW1wb3J0IHN5cworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGUgYXMgZGF0ZXRpbWVfZGF0ZQorCitpbXBvcnQgX3N0cnB0aW1lCisKK2NsYXNzIGdldGxhbmdfVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgX2dldGxhbmciIiIKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfc3RycHRpbWUuX2dldGxhbmcoKSwgbG9jYWxlLmdldGxvY2FsZShsb2NhbGUuTENfVElNRSkpCisKK2NsYXNzIExvY2FsZVRpbWVfVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciBfc3RycHRpbWUuTG9jYWxlVGltZS4KKworICAgIEFsbCB2YWx1ZXMgYXJlIGxvd2VyLWNhc2VkIHdoZW4gc3RvcmVkIGluIExvY2FsZVRpbWUsIHNvIG1ha2Ugc3VyZSB0bworICAgIGNvbXBhcmUgdmFsdWVzIGFmdGVyIHJ1bm5pbmcgYGBsb3dlcmBgIG9uIHRoZW0uCisKKyAgICAiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIiIiQ3JlYXRlIHRpbWUgdHVwbGUgYmFzZWQgb24gY3VycmVudCB0aW1lLiIiIgorICAgICAgICBzZWxmLnRpbWVfdHVwbGUgPSB0aW1lLmxvY2FsdGltZSgpCisgICAgICAgIHNlbGYuTFRfaW5zID0gX3N0cnB0aW1lLkxvY2FsZVRpbWUoKQorCisgICAgZGVmIGNvbXBhcmVfYWdhaW5zdF90aW1lKHNlbGYsIHRlc3RpbmcsIGRpcmVjdGl2ZSwgdHVwbGVfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX21zZyk6CisgICAgICAgICIiIkhlbHBlciBtZXRob2QgdGhhdCB0ZXN0cyB0ZXN0aW5nIGFnYWluc3QgZGlyZWN0aXZlIGJhc2VkIG9uIHRoZQorICAgICAgICB0dXBsZV9wb3NpdGlvbiBvZiB0aW1lX3R1cGxlLiAgVXNlcyBlcnJvcl9tc2cgYXMgZXJyb3IgbWVzc2FnZS4KKworICAgICAgICAiIiIKKyAgICAgICAgc3RyZnRpbWVfb3V0cHV0ID0gdGltZS5zdHJmdGltZShkaXJlY3RpdmUsIHNlbGYudGltZV90dXBsZSkubG93ZXIoKQorICAgICAgICBjb21wYXJpc29uID0gdGVzdGluZ1tzZWxmLnRpbWVfdHVwbGVbdHVwbGVfcG9zaXRpb25dXQorICAgICAgICBzZWxmLmFzc2VydEluKHN0cmZ0aW1lX291dHB1dCwgdGVzdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAiJXM6IG5vdCBmb3VuZCBpbiB0dXBsZSIgJSBlcnJvcl9tc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGFyaXNvbiwgc3RyZnRpbWVfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICIlczogcG9zaXRpb24gd2l0aGluIHR1cGxlIGluY29ycmVjdDsgJXMgIT0gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3JfbXNnLCBjb21wYXJpc29uLCBzdHJmdGltZV9vdXRwdXQpKQorCisgICAgZGVmIHRlc3Rfd2Vla2RheShzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBmdWxsIGFuZCBhYmJyZXZpYXRlZCB3ZWVrZGF5IG5hbWVzIGFyZSBjb3JyZWN0IGluCisgICAgICAgICMgYm90aCBzdHJpbmcgYW5kIHBvc2l0aW9uIHdpdGggdHVwbGUKKyAgICAgICAgc2VsZi5jb21wYXJlX2FnYWluc3RfdGltZShzZWxmLkxUX2lucy5mX3dlZWtkYXksICclQScsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3Rpbmcgb2YgZnVsbCB3ZWVrZGF5IG5hbWUgZmFpbGVkIikKKyAgICAgICAgc2VsZi5jb21wYXJlX2FnYWluc3RfdGltZShzZWxmLkxUX2lucy5hX3dlZWtkYXksICclYScsIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3Rpbmcgb2YgYWJicmV2aWF0ZWQgd2Vla2RheSBuYW1lIGZhaWxlZCIpCisKKyAgICBkZWYgdGVzdF9tb250aChzZWxmKToKKyAgICAgICAgIyBUZXN0IGZ1bGwgYW5kIGFiYnJldmlhdGVkIG1vbnRoIG5hbWVzOyBib3RoIHN0cmluZyBhbmQgcG9zaXRpb24KKyAgICAgICAgIyB3aXRoaW4gdGhlIHR1cGxlCisgICAgICAgIHNlbGYuY29tcGFyZV9hZ2FpbnN0X3RpbWUoc2VsZi5MVF9pbnMuZl9tb250aCwgJyVCJywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVzdGluZyBhZ2FpbnN0IGZ1bGwgbW9udGggbmFtZSBmYWlsZWQiKQorICAgICAgICBzZWxmLmNvbXBhcmVfYWdhaW5zdF90aW1lKHNlbGYuTFRfaW5zLmFfbW9udGgsICclYicsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RpbmcgYWdhaW5zdCBhYmJyZXZpYXRlZCBtb250aCBuYW1lIGZhaWxlZCIpCisKKyAgICBkZWYgdGVzdF9hbV9wbShzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgQU0vUE0gcmVwcmVzZW50YXRpb24gZG9uZSBwcm9wZXJseQorICAgICAgICBzdHJmdGltZV9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIlcCIsIHNlbGYudGltZV90dXBsZSkubG93ZXIoKQorICAgICAgICBzZWxmLmFzc2VydEluKHN0cmZ0aW1lX291dHB1dCwgc2VsZi5MVF9pbnMuYW1fcG0sCisgICAgICAgICAgICAgICAgICAgICAgIkFNL1BNIHJlcHJlc2VudGF0aW9uIG5vdCBpbiB0dXBsZSIpCisgICAgICAgIGlmIHNlbGYudGltZV90dXBsZVszXSA8IDEyOiBwb3NpdGlvbiA9IDAKKyAgICAgICAgZWxzZTogcG9zaXRpb24gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5MVF9pbnMuYW1fcG1bcG9zaXRpb25dLCBzdHJmdGltZV9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkFNL1BNIHJlcHJlc2VudGF0aW9uIGluIHRoZSB3cm9uZyBwb3NpdGlvbiB3aXRoaW4gdGhlIHR1cGxlIikKKworICAgIGRlZiB0ZXN0X3RpbWV6b25lKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aW1lem9uZSBpcyBjb3JyZWN0CisgICAgICAgIHRpbWV6b25lID0gdGltZS5zdHJmdGltZSgiJVoiLCBzZWxmLnRpbWVfdHVwbGUpLmxvd2VyKCkKKyAgICAgICAgaWYgdGltZXpvbmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZXpvbmUgaW4gc2VsZi5MVF9pbnMudGltZXpvbmVbMF0gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lem9uZSBpbiBzZWxmLkxUX2lucy50aW1lem9uZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXpvbmUgJXMgbm90IGZvdW5kIGluICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWV6b25lLCBzZWxmLkxUX2lucy50aW1lem9uZSkpCisKKyAgICBkZWYgdGVzdF9kYXRlX3RpbWUoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBMQ19kYXRlX3RpbWUsIExDX2RhdGUsIGFuZCBMQ190aW1lIGFyZSBjb3JyZWN0CisgICAgICAgICMgdGhlIG1hZ2ljIGRhdGUgaXMgdXNlZCBzbyBhcyB0byBub3QgaGF2ZSBpc3N1ZXMgd2l0aCAlYyB3aGVuIGRheSBvZgorICAgICAgICAjICB0aGUgbW9udGggaXMgYSBzaW5nbGUgZGlnaXQgYW5kIGhhcyBhIGxlYWRpbmcgc3BhY2UuICBUaGlzIGlzIG5vdCBhbgorICAgICAgICAjICBpc3N1ZSBzaW5jZSBzdHJwdGltZSBzdGlsbCBwYXJzZXMgaXQgY29ycmVjdGx5LiAgVGhlIHByb2JsZW0gaXMKKyAgICAgICAgIyAgdGVzdGluZyB0aGVzZSBkaXJlY3RpdmVzIGZvciBjb3JyZWN0bmVzcyBieSBjb21wYXJpbmcgc3RyZnRpbWUKKyAgICAgICAgIyAgb3V0cHV0LgorICAgICAgICBtYWdpY19kYXRlID0gKDE5OTksIDMsIDE3LCAyMiwgNDQsIDU1LCAyLCA3NiwgMCkKKyAgICAgICAgc3RyZnRpbWVfb3V0cHV0ID0gdGltZS5zdHJmdGltZSgiJWMiLCBtYWdpY19kYXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUuc3RyZnRpbWUoc2VsZi5MVF9pbnMuTENfZGF0ZV90aW1lLCBtYWdpY19kYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJmdGltZV9vdXRwdXQsICJMQ19kYXRlX3RpbWUgaW5jb3JyZWN0IikKKyAgICAgICAgc3RyZnRpbWVfb3V0cHV0ID0gdGltZS5zdHJmdGltZSgiJXgiLCBtYWdpY19kYXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUuc3RyZnRpbWUoc2VsZi5MVF9pbnMuTENfZGF0ZSwgbWFnaWNfZGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZnRpbWVfb3V0cHV0LCAiTENfZGF0ZSBpbmNvcnJlY3QiKQorICAgICAgICBzdHJmdGltZV9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIlWCIsIG1hZ2ljX2RhdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5zdHJmdGltZShzZWxmLkxUX2lucy5MQ190aW1lLCBtYWdpY19kYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJmdGltZV9vdXRwdXQsICJMQ190aW1lIGluY29ycmVjdCIpCisgICAgICAgIExUID0gX3N0cnB0aW1lLkxvY2FsZVRpbWUoKQorICAgICAgICBMVC5hbV9wbSA9ICgnJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShMVC5MQ190aW1lLCAiTG9jYWxlVGltZSdzIExDIGRpcmVjdGl2ZXMgY2Fubm90IGhhbmRsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW1wdHkgc3RyaW5ncyIpCisKKyAgICBkZWYgdGVzdF9sYW5nKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBsYW5nIGlzIHNldCB0byB3aGF0IF9nZXRsYW5nKCkgcmV0dXJucworICAgICAgICAjIEFzc3VtaW5nIGxvY2FsZSBoYXMgbm90IGNoYW5nZWQgYmV0d2VlbiBub3cgYW5kIHdoZW4gc2VsZi5MVF9pbnMgd2FzIGNyZWF0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLkxUX2lucy5sYW5nLCBfc3RycHRpbWUuX2dldGxhbmcoKSkKKworCitjbGFzcyBUaW1lUkVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIFRpbWVSRS4iIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGdlbmVyaWMgVGltZVJFIG9iamVjdC4iIiIKKyAgICAgICAgc2VsZi50aW1lX3JlID0gX3N0cnB0aW1lLlRpbWVSRSgpCisgICAgICAgIHNlbGYubG9jYWxlX3RpbWUgPSBfc3RycHRpbWUuTG9jYWxlVGltZSgpCisKKyAgICBkZWYgdGVzdF9wYXR0ZXJuKHNlbGYpOgorICAgICAgICAjIFRlc3QgVGltZVJFLnBhdHRlcm4KKyAgICAgICAgcGF0dGVybl9zdHJpbmcgPSBzZWxmLnRpbWVfcmUucGF0dGVybihyIiVhICVBICVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhdHRlcm5fc3RyaW5nLmZpbmQoc2VsZi5sb2NhbGVfdGltZS5hX3dlZWtkYXlbMl0pICE9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgImRpZCBub3QgZmluZCBhYmJyZXZpYXRlZCB3ZWVrZGF5IGluIHBhdHRlcm4gc3RyaW5nICclcyciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3N0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhdHRlcm5fc3RyaW5nLmZpbmQoc2VsZi5sb2NhbGVfdGltZS5mX3dlZWtkYXlbNF0pICE9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgImRpZCBub3QgZmluZCBmdWxsIHdlZWtkYXkgaW4gcGF0dGVybiBzdHJpbmcgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocGF0dGVybl9zdHJpbmcuZmluZChzZWxmLnRpbWVfcmVbJ2QnXSkgIT0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAiZGlkIG5vdCBmaW5kICdkJyBkaXJlY3RpdmUgcGF0dGVybiBzdHJpbmcgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fc3RyaW5nKQorCisgICAgZGVmIHRlc3RfcGF0dGVybl9lc2NhcGluZyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgYW55IGNoYXJhY3RlcnMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgdGhhdCBtaWdodCBiZSB0YWtlbiBhcworICAgICAgICAjIHJlZ2V4IHN5bnRheCBpcyBlc2NhcGVkLgorICAgICAgICBwYXR0ZXJuX3N0cmluZyA9IHNlbGYudGltZV9yZS5wYXR0ZXJuKCJcZCsiKQorICAgICAgICBzZWxmLmFzc2VydEluKHIiXFxkXCsiLCBwYXR0ZXJuX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAiJXMgZG9lcyBub3QgaGF2ZSByZSBjaGFyYWN0ZXJzIGVzY2FwZWQgcHJvcGVybHkiICUKKyAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3N0cmluZykKKworICAgIGRlZiB0ZXN0X2NvbXBpbGUoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBjb21waWxlZCByZWdleCBpcyBjb3JyZWN0CisgICAgICAgIGZvdW5kID0gc2VsZi50aW1lX3JlLmNvbXBpbGUociIlQSIpLm1hdGNoKHNlbGYubG9jYWxlX3RpbWUuZl93ZWVrZGF5WzZdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm91bmQgYW5kIGZvdW5kLmdyb3VwKCdBJykgPT0gc2VsZi5sb2NhbGVfdGltZS5mX3dlZWtkYXlbNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAicmUgb2JqZWN0IGZvciAnJUEnIGZhaWxlZCIpCisgICAgICAgIGNvbXBpbGVkID0gc2VsZi50aW1lX3JlLmNvbXBpbGUociIlYSAlYiIpCisgICAgICAgIGZvdW5kID0gY29tcGlsZWQubWF0Y2goIiVzICVzIiAlIChzZWxmLmxvY2FsZV90aW1lLmFfd2Vla2RheVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvY2FsZV90aW1lLmFfbW9udGhbNF0pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm91bmQsCisgICAgICAgICAgICAiTWF0Y2ggZmFpbGVkIHdpdGggJyVzJyByZWdleCBhbmQgJyVzJyBzdHJpbmciICUKKyAgICAgICAgICAgICAoY29tcGlsZWQucGF0dGVybiwgIiVzICVzIiAlIChzZWxmLmxvY2FsZV90aW1lLmFfd2Vla2RheVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvY2FsZV90aW1lLmFfbW9udGhbNF0pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kLmdyb3VwKCdhJykgPT0gc2VsZi5sb2NhbGVfdGltZS5hX3dlZWtkYXlbNF0gYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQuZ3JvdXAoJ2InKSA9PSBzZWxmLmxvY2FsZV90aW1lLmFfbW9udGhbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAicmUgb2JqZWN0IGNvdWxkbid0IGZpbmQgdGhlIGFiYnJldmlhdGVkIHdlZWtkYXkgbW9udGggaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIHVzaW5nICclcyc7IGdyb3VwICdhJyA9ICclcycsIGdyb3VwICdiJyA9ICVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChmb3VuZC5zdHJpbmcsIGZvdW5kLnJlLnBhdHRlcm4sIGZvdW5kLmdyb3VwKCdhJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLmdyb3VwKCdiJykpKQorICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnYScsJ0EnLCdiJywnQicsJ2MnLCdkJywnSCcsJ0knLCdqJywnbScsJ00nLCdwJywnUycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdVJywndycsJ1cnLCd4JywnWCcsJ3knLCdZJywnWicsJyUnKToKKyAgICAgICAgICAgIGNvbXBpbGVkID0gc2VsZi50aW1lX3JlLmNvbXBpbGUoIiUiICsgZGlyZWN0aXZlKQorICAgICAgICAgICAgZm91bmQgPSBjb21waWxlZC5tYXRjaCh0aW1lLnN0cmZ0aW1lKCIlIiArIGRpcmVjdGl2ZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZm91bmQsICJNYXRjaGluZyBmYWlsZWQgb24gJyVzJyB1c2luZyAnJXMnIHJlZ2V4IiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGltZS5zdHJmdGltZSgiJSIgKyBkaXJlY3RpdmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkLnBhdHRlcm4pKQorCisgICAgZGVmIHRlc3RfYmxhbmtwYXR0ZXJuKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB3aGVuIHR1cGxlIG9yIHNvbWV0aGluZyBoYXMgbm8gdmFsdWVzIG5vIHJlZ2V4IGlzIGdlbmVyYXRlZC4KKyAgICAgICAgIyBGaXhlcyBidWcgIzY2MTM1NAorICAgICAgICB0ZXN0X2xvY2FsZSA9IF9zdHJwdGltZS5Mb2NhbGVUaW1lKCkKKyAgICAgICAgdGVzdF9sb2NhbGUudGltZXpvbmUgPSAoZnJvemVuc2V0KCksIGZyb3plbnNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9zdHJwdGltZS5UaW1lUkUodGVzdF9sb2NhbGUpLnBhdHRlcm4oIiVaIiksICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHRpbWV6b25lID09ICgnJywnJyksIFRpbWVSRSgpLnBhdHRlcm4oJyVaJykgIT0gJyciKQorCisgICAgZGVmIHRlc3RfbWF0Y2hpbmdfd2l0aF9lc2NhcGVzKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBhIGZvcm1hdCB0aGF0IHJlcXVpcmVzIGVzY2FwaW5nIG9mIGNoYXJhY3RlcnMgd29ya3MKKyAgICAgICAgY29tcGlsZWRfcmUgPSBzZWxmLnRpbWVfcmUuY29tcGlsZSgiXHcrICVtIikKKyAgICAgICAgZm91bmQgPSBjb21waWxlZF9yZS5tYXRjaCgiXHcrIDEwIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kLCAiRXNjYXBpbmcgZmFpbGVkIG9mIGZvcm1hdCAnXHcrIDEwJyIpCisKKyAgICBkZWYgdGVzdF9sb2NhbGVfZGF0YV93X3JlZ2V4X21ldGFjaGFyYWN0ZXJzKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgaWYgbG9jYWxlIGRhdGEgY29udGFpbnMgcmVnZXggbWV0YWNoYXJhY3RlcnMgdGhleSBhcmUKKyAgICAgICAgIyBlc2NhcGVkIHByb3Blcmx5LgorICAgICAgICAjIERpc2NvdmVyZWQgYnkgYnVnICMxMDM5MjcwIC4KKyAgICAgICAgbG9jYWxlX3RpbWUgPSBfc3RycHRpbWUuTG9jYWxlVGltZSgpCisgICAgICAgIGxvY2FsZV90aW1lLnRpbWV6b25lID0gKGZyb3plbnNldCgoInV0YyIsICJnbXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9reW8gKHN0YW5kYXJkIHRpbWUpIikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoIlRva3lvIChkYXlsaWdodCB0aW1lKSIpKQorICAgICAgICB0aW1lX3JlID0gX3N0cnB0aW1lLlRpbWVSRShsb2NhbGVfdGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWVfcmUuY29tcGlsZSgiJVoiKS5tYXRjaCgiVG9reW8gKHN0YW5kYXJkIHRpbWUpIiksCisgICAgICAgICAgICAgICAgICAgICAgICAibG9jYWxlIGRhdGEgdGhhdCBjb250YWlucyByZWdleCBtZXRhY2hhcmFjdGVycyBpcyBub3QiCisgICAgICAgICAgICAgICAgICAgICAgICAiIHByb3Blcmx5IGVzY2FwZWQiKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9zdWJzdGl0dXRpb24oc2VsZik6CisgICAgICAgICMgV2hlbiBwYXR0ZXJuIGNvbnRhaW5zIHdoaXRlc3BhY2UsIG1ha2Ugc3VyZSBpdCBpcyB0YWtlbiBpbnRvIGFjY291bnQKKyAgICAgICAgIyBzbyBhcyB0byBub3QgYWxsb3cgdG8gc3VicGF0dGVybnMgdG8gZW5kIHVwIG5leHQgdG8gZWFjaCBvdGhlciBhbmQKKyAgICAgICAgIyAic3RlYWwiIGNoYXJhY3RlcnMgZnJvbSBlYWNoIG90aGVyLgorICAgICAgICBwYXR0ZXJuID0gc2VsZi50aW1lX3JlLnBhdHRlcm4oJyVqICVIJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZS5tYXRjaChwYXR0ZXJuLCAiMTgwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChwYXR0ZXJuLCAiMTggMCIpKQorCisKK2NsYXNzIFN0cnB0aW1lVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciBfc3RycHRpbWUuc3RycHRpbWUuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIkNyZWF0ZSB0ZXN0aW5nIHRpbWUgdHVwbGUuIiIiCisgICAgICAgIHNlbGYudGltZV90dXBsZSA9IHRpbWUuZ210aW1lKCkKKworICAgIGRlZiB0ZXN0X1ZhbHVlRXJyb3Ioc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIFZhbHVlRXJyb3IgaXMgcmFpc2VkIHdoZW4gbWF0Y2ggZmFpbHMgb3IgZm9ybWF0IGlzIGJhZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUsIGRhdGFfc3RyaW5nPSIlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdD0iJUEiKQorICAgICAgICBmb3IgYmFkX2Zvcm1hdCBpbiAoIiUiLCAiJSAiLCAiJWUiKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoIjIwMDUiLCBiYWRfZm9ybWF0KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGVycjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiclcycgcmFpc2VkICVzLCBub3QgVmFsdWVFcnJvciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYWRfZm9ybWF0LCBlcnIuX19jbGFzc19fLl9fbmFtZV9fKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCInJXMnIGRpZCBub3QgcmFpc2UgVmFsdWVFcnJvciIgJSBiYWRfZm9ybWF0KQorCisgICAgZGVmIHRlc3RfdW5jb252ZXJ0ZWRkYXRhKHNlbGYpOgorICAgICAgICAjIENoZWNrIFZhbHVlRXJyb3IgaXMgcmFpc2VkIHdoZW4gdGhlcmUgaXMgdW5jb252ZXJ0ZWQgZGF0YQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUsICIxMCAxMiIsICIlbSIpCisKKyAgICBkZWYgaGVscGVyKHNlbGYsIGRpcmVjdGl2ZSwgcG9zaXRpb24pOgorICAgICAgICAiIiJIZWxwZXIgZnhuIGluIHRlc3RpbmcuIiIiCisgICAgICAgIHN0cmZfb3V0cHV0ID0gdGltZS5zdHJmdGltZSgiJSIgKyBkaXJlY3RpdmUsIHNlbGYudGltZV90dXBsZSkKKyAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RyZl9vdXRwdXQsICIlIiArIGRpcmVjdGl2ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cnBfb3V0cHV0W3Bvc2l0aW9uXSA9PSBzZWxmLnRpbWVfdHVwbGVbcG9zaXRpb25dLAorICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Rpbmcgb2YgJyVzJyBkaXJlY3RpdmUgZmFpbGVkOyAnJXMnIC0+ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSwgc3RyZl9vdXRwdXQsIHN0cnBfb3V0cHV0W3Bvc2l0aW9uXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aW1lX3R1cGxlW3Bvc2l0aW9uXSkpCisKKyAgICBkZWYgdGVzdF95ZWFyKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB0aGUgeWVhciBpcyBoYW5kbGVkIHByb3Blcmx5CisgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCd5JywgJ1knKToKKyAgICAgICAgICAgIHNlbGYuaGVscGVyKGRpcmVjdGl2ZSwgMCkKKyAgICAgICAgIyBNdXN0IGFsc28gbWFrZSBzdXJlICV5IHZhbHVlcyBhcmUgY29ycmVjdCBmb3IgYm91bmRzIHNldCBieSBPcGVuIEdyb3VwCisgICAgICAgIGZvciBjZW50dXJ5LCBib3VuZHMgaW4gKCgxOTAwLCAoJzY5JywgJzk5JykpLCAoMjAwMCwgKCcwMCcsICc2OCcpKSk6CisgICAgICAgICAgICBmb3IgYm91bmQgaW4gYm91bmRzOgorICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKGJvdW5kLCAnJXknKQorICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jlc3VsdCA9IGNlbnR1cnkgKyBpbnQoYm91bmQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cnBfb3V0cHV0WzBdID09IGV4cGVjdGVkX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIid5JyB0ZXN0IGZhaWxlZDsgcGFzc2VkIGluICclcycgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHJldHVybmVkICclcyciICUgKGJvdW5kLCBzdHJwX291dHB1dFswXSkpCisKKyAgICBkZWYgdGVzdF9tb250aChzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBtb250aCBkaXJlY3RpdmVzCisgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdCJywgJ2InLCAnbScpOgorICAgICAgICAgICAgc2VsZi5oZWxwZXIoZGlyZWN0aXZlLCAxKQorCisgICAgZGVmIHRlc3RfZGF5KHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGRheSBkaXJlY3RpdmVzCisgICAgICAgIHNlbGYuaGVscGVyKCdkJywgMikKKworICAgIGRlZiB0ZXN0X2hvdXIoc2VsZik6CisgICAgICAgICMgVGVzdCBob3VyIGRpcmVjdGl2ZXMKKyAgICAgICAgc2VsZi5oZWxwZXIoJ0gnLCAzKQorICAgICAgICBzdHJmX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiVJICVwIiwgc2VsZi50aW1lX3R1cGxlKQorICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJmX291dHB1dCwgIiVJICVwIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cnBfb3V0cHV0WzNdID09IHNlbGYudGltZV90dXBsZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0aW5nIG9mICclJUkgJSVwJyBkaXJlY3RpdmUgZmFpbGVkOyAnJXMnIC0+ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmZfb3V0cHV0LCBzdHJwX291dHB1dFszXSwgc2VsZi50aW1lX3R1cGxlWzNdKSkKKworICAgIGRlZiB0ZXN0X21pbnV0ZShzZWxmKToKKyAgICAgICAgIyBUZXN0IG1pbnV0ZSBkaXJlY3RpdmVzCisgICAgICAgIHNlbGYuaGVscGVyKCdNJywgNCkKKworICAgIGRlZiB0ZXN0X3NlY29uZChzZWxmKToKKyAgICAgICAgIyBUZXN0IHNlY29uZCBkaXJlY3RpdmVzCisgICAgICAgIHNlbGYuaGVscGVyKCdTJywgNSkKKworICAgIGRlZiB0ZXN0X2ZyYWN0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgbWljcm9zZWNvbmRzCisgICAgICAgIGltcG9ydCBkYXRldGltZQorICAgICAgICBkID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMiwgMTIsIDIwLCAxMiwgMzQsIDU2LCA3ODk4NykKKyAgICAgICAgdHVwLCBmcmFjID0gX3N0cnB0aW1lLl9zdHJwdGltZShzdHIoZCksIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMuJWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyYWMsIGQubWljcm9zZWNvbmQpCisKKyAgICBkZWYgdGVzdF93ZWVrZGF5KHNlbGYpOgorICAgICAgICAjIFRlc3Qgd2Vla2RheSBkaXJlY3RpdmVzCisgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdBJywgJ2EnLCAndycpOgorICAgICAgICAgICAgc2VsZi5oZWxwZXIoZGlyZWN0aXZlLDYpCisKKyAgICBkZWYgdGVzdF9qdWxpYW4oc2VsZik6CisgICAgICAgICMgVGVzdCBqdWxpYW4gZGlyZWN0aXZlcworICAgICAgICBzZWxmLmhlbHBlcignaicsIDcpCisKKyAgICBkZWYgdGVzdF90aW1lem9uZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHRpbWV6b25lIGRpcmVjdGl2ZXMuCisgICAgICAgICMgV2hlbiBnbXRpbWUoKSBpcyB1c2VkIHdpdGggJVosIGVudGlyZSByZXN1bHQgb2Ygc3RyZnRpbWUoKSBpcyBlbXB0eS4KKyAgICAgICAgIyBDaGVjayBmb3IgZXF1YWwgdGltZXpvbmUgbmFtZXMgZGVhbHMgd2l0aCBiYWQgbG9jYWxlIGluZm8gd2hlbiB0aGlzCisgICAgICAgICMgb2NjdXJzOyBmaXJzdCBmb3VuZCBpbiBGcmVlQlNEIDQuNC4KKyAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoIlVUQyIsICIlWiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RycF9vdXRwdXQudG1faXNkc3QsIDApCisgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKCJHTVQiLCAiJVoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cnBfb3V0cHV0LnRtX2lzZHN0LCAwKQorICAgICAgICB0aW1lX3R1cGxlID0gdGltZS5sb2NhbHRpbWUoKQorICAgICAgICBzdHJmX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiVaIikgICNVVEMgZG9lcyBub3QgaGF2ZSBhIHRpbWV6b25lCisgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0LCAiJVoiKQorICAgICAgICBsb2NhbGVfdGltZSA9IF9zdHJwdGltZS5Mb2NhbGVUaW1lKCkKKyAgICAgICAgaWYgdGltZS50em5hbWVbMF0gIT0gdGltZS50em5hbWVbMV0gb3Igbm90IHRpbWUuZGF5bGlnaHQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RycF9vdXRwdXRbOF0gPT0gdGltZV90dXBsZVs4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXpvbmUgY2hlY2sgZmFpbGVkOyAnJXMnIC0+ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJmX291dHB1dCwgc3RycF9vdXRwdXRbOF0sIHRpbWVfdHVwbGVbOF0pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cnBfb3V0cHV0WzhdID09IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb2NhbGVUaW1lKCkudGltZXpvbmUgaGFzIGR1cGxpY2F0ZSB2YWx1ZXMgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWUuZGF5bGlnaHQgYnV0IHRpbWV6b25lIHZhbHVlIG5vdCBzZXQgdG8gLTEiKQorCisgICAgZGVmIHRlc3RfYmFkX3RpbWV6b25lKHNlbGYpOgorICAgICAgICAjIEV4cGxpY2l0bHkgdGVzdCBwb3NzaWJpbGl0eSBvZiBiYWQgdGltZXpvbmU7CisgICAgICAgICMgd2hlbiB0aW1lLnR6bmFtZVswXSA9PSB0aW1lLnR6bmFtZVsxXSBhbmQgdGltZS5kYXlsaWdodAorICAgICAgICB0el9uYW1lID0gdGltZS50em5hbWVbMF0KKyAgICAgICAgaWYgdHpfbmFtZS51cHBlcigpIGluICgiVVRDIiwgIkdNVCIpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9yaWdpbmFsX3R6bmFtZSA9IHRpbWUudHpuYW1lCisgICAgICAgICAgICBvcmlnaW5hbF9kYXlsaWdodCA9IHRpbWUuZGF5bGlnaHQKKyAgICAgICAgICAgIHRpbWUudHpuYW1lID0gKHR6X25hbWUsIHR6X25hbWUpCisgICAgICAgICAgICB0aW1lLmRheWxpZ2h0ID0gMQorICAgICAgICAgICAgdHpfdmFsdWUgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUodHpfbmFtZSwgIiVaIilbOF0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHpfdmFsdWUsIC0xLAorICAgICAgICAgICAgICAgICAgICAiJXMgbGVhZCB0byBhIHRpbWV6b25lIHZhbHVlIG9mICVzIGluc3RlYWQgb2YgLTEgd2hlbiAiCisgICAgICAgICAgICAgICAgICAgICJ0aW1lLmRheWxpZ2h0IHNldCB0byAlcyBhbmQgcGFzc2luZyBpbiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAodGltZS50em5hbWUsIHR6X3ZhbHVlLCB0aW1lLmRheWxpZ2h0LCB0el9uYW1lKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRpbWUudHpuYW1lID0gb3JpZ2luYWxfdHpuYW1lCisgICAgICAgICAgICB0aW1lLmRheWxpZ2h0ID0gb3JpZ2luYWxfZGF5bGlnaHQKKworICAgIGRlZiB0ZXN0X2RhdGVfdGltZShzZWxmKToKKyAgICAgICAgIyBUZXN0ICVjIGRpcmVjdGl2ZQorICAgICAgICBmb3IgcG9zaXRpb24gaW4gcmFuZ2UoNik6CisgICAgICAgICAgICBzZWxmLmhlbHBlcignYycsIHBvc2l0aW9uKQorCisgICAgZGVmIHRlc3RfZGF0ZShzZWxmKToKKyAgICAgICAgIyBUZXN0ICV4IGRpcmVjdGl2ZQorICAgICAgICBmb3IgcG9zaXRpb24gaW4gcmFuZ2UoMCwzKToKKyAgICAgICAgICAgIHNlbGYuaGVscGVyKCd4JywgcG9zaXRpb24pCisKKyAgICBkZWYgdGVzdF90aW1lKHNlbGYpOgorICAgICAgICAjIFRlc3QgJVggZGlyZWN0aXZlCisgICAgICAgIGZvciBwb3NpdGlvbiBpbiByYW5nZSgzLDYpOgorICAgICAgICAgICAgc2VsZi5oZWxwZXIoJ1gnLCBwb3NpdGlvbikKKworICAgIGRlZiB0ZXN0X3BlcmNlbnQoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlICUgc2lnbnMgYXJlIGhhbmRsZWQgcHJvcGVybHkKKyAgICAgICAgc3RyZl9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIlbSAlJSAlWSIsIHNlbGYudGltZV90dXBsZSkKKyAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RyZl9vdXRwdXQsICIlbSAlJSAlWSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFswXSA9PSBzZWxmLnRpbWVfdHVwbGVbMF0gYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXRbMV0gPT0gc2VsZi50aW1lX3R1cGxlWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsaW5nIG9mIHBlcmNlbnQgc2lnbiBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfY2FzZWluc2Vuc2l0aXZlKHNlbGYpOgorICAgICAgICAjIFNob3VsZCBoYW5kbGUgbmFtZXMgY2FzZS1pbnNlbnNpdGl2ZWx5LgorICAgICAgICBzdHJmX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiVCIiwgc2VsZi50aW1lX3R1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0LnVwcGVyKCksICIlQiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cnB0aW1lIGRvZXMgbm90IGhhbmRsZSBBTEwtQ0FQUyBuYW1lcyBwcm9wZXJseSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RyZl9vdXRwdXQubG93ZXIoKSwgIiVCIiksCisgICAgICAgICAgICAgICAgICAgICAgICAic3RycHRpbWUgZG9lcyBub3QgaGFuZGxlIGxvd2VyY2FzZSBuYW1lcyBwcm9wZXJseSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RyZl9vdXRwdXQuY2FwaXRhbGl6ZSgpLCAiJUIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJwdGltZSBkb2VzIG5vdCBoYW5kbGUgY2Fwd29yZCBuYW1lcyBwcm9wZXJseSIpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0cyhzZWxmKToKKyAgICAgICAgIyBEZWZhdWx0IHJldHVybiB2YWx1ZSBzaG91bGQgYmUgKDE5MDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDApCisgICAgICAgIGRlZmF1bHRzID0gKDE5MDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC0xKQorICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSgnMScsICclbScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dCA9PSBkZWZhdWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICJEZWZhdWx0IHZhbHVlcyBmb3Igc3RycHRpbWUoKSBhcmUgaW5jb3JyZWN0OyIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgIT0gJXMiICUgKHN0cnBfb3V0cHV0LCBkZWZhdWx0cykpCisKKyAgICBkZWYgdGVzdF9lc2NhcGluZyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgYWxsIGNoYXJhY3RlcnMgdGhhdCBoYXZlIHJlZ2V4IHNpZ25pZmljYW5jZSBhcmUgZXNjYXBlZC4KKyAgICAgICAgIyBQYXJlbnRoZXNlcyBhcmUgaW4gYSBwdXJwb3NlZnVsIG9yZGVyOyB3aWxsIGNhdXNlIGFuIGVycm9yIG9mCisgICAgICAgICMgdW5iYWxhbmNlZCBwYXJlbnRoZXNlcyB3aGVuIHRoZSByZWdleCBpcyBjb21waWxlZCBpZiB0aGV5IGFyZSBub3QKKyAgICAgICAgIyBlc2NhcGVkLgorICAgICAgICAjIFRlc3QgaW5zdGlnYXRlZCBieSBidWcgIzc5NjE0OSAuCisgICAgICAgIG5lZWRfZXNjYXBpbmcgPSAiLl4kKis/e31cW118KSgiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUobmVlZF9lc2NhcGluZywgbmVlZF9lc2NhcGluZykpCisKKyAgICBkZWYgdGVzdF9mZWIyOV9vbl9sZWFwX3llYXJfd2l0aG91dF95ZWFyKHNlbGYpOgorICAgICAgICB0aW1lLnN0cnB0aW1lKCJGZWIgMjkiLCAiJWIgJWQiKQorCisgICAgZGVmIHRlc3RfbWFyMV9jb21lc19hZnRlcl9mZWIyOV9ldmVuX3doZW5fb21pdHRpbmdfdGhlX3llYXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcygKKyAgICAgICAgICAgICAgICB0aW1lLnN0cnB0aW1lKCJGZWIgMjkiLCAiJWIgJWQiKSwKKyAgICAgICAgICAgICAgICB0aW1lLnN0cnB0aW1lKCJNYXIgMSIsICIlYiAlZCIpKQorCitjbGFzcyBTdHJwdGltZTEyQU1QTVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgX3N0cnB0aW1lIHJlZ3Jlc3Npb24gaW4gJyVJICVwJyBhdCAxMiBub29uICgxMiBQTSkiIiIKKworICAgIGRlZiB0ZXN0X3R3ZWx2ZV9ub29uX21pZG5pZ2h0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEodGltZS5zdHJwdGltZSgnMTIgUE0nLCAnJUkgJXAnKVszXSwgMTIpCisgICAgICAgIGVxKHRpbWUuc3RycHRpbWUoJzEyIEFNJywgJyVJICVwJylbM10sIDApCisgICAgICAgIGVxKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSgnMTIgUE0nLCAnJUkgJXAnKVszXSwgMTIpCisgICAgICAgIGVxKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSgnMTIgQU0nLCAnJUkgJXAnKVszXSwgMCkKKworCitjbGFzcyBKdWxpYW5UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIF9zdHJwdGltZSByZWdyZXNzaW9uIHRoYXQgYWxsIGp1bGlhbiAoMS0zNjYpIGFyZSBhY2NlcHRlZCIiIgorCisgICAgZGVmIHRlc3RfYWxsX2p1bGlhbl9kYXlzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgMzY3KToKKyAgICAgICAgICAgICMgdXNlIDIwMDQsIHNpbmNlIGl0IGlzIGEgbGVhcCB5ZWFyLCB3ZSBoYXZlIDM2NiBkYXlzCisgICAgICAgICAgICBlcShfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoJyVkIDIwMDQnICUgaSwgJyVqICVZJylbN10sIGkpCisKK2NsYXNzIENhbGN1bGF0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCBzdHJwdGltZSgpIGZpbGxzIGluIG1pc3NpbmcgaW5mbyBjb3JyZWN0bHkiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50aW1lX3R1cGxlID0gdGltZS5nbXRpbWUoKQorCisgICAgZGVmIHRlc3RfanVsaWFuX2NhbGN1bGF0aW9uKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdoZW4gSnVsaWFuIGlzIG1pc3NpbmcgdGhhdCBpdCBpcyBjYWxjdWxhdGVkCisgICAgICAgIGZvcm1hdF9zdHJpbmcgPSAiJVkgJW0gJWQgJUggJU0gJVMgJXcgJVoiCisgICAgICAgIHJlc3VsdCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSh0aW1lLnN0cmZ0aW1lKGZvcm1hdF9zdHJpbmcsIHNlbGYudGltZV90dXBsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRfc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LnRtX3lkYXkgPT0gc2VsZi50aW1lX3R1cGxlLnRtX3lkYXksCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FsY3VsYXRpb24gb2YgdG1feWRheSBmYWlsZWQ7ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC50bV95ZGF5LCBzZWxmLnRpbWVfdHVwbGUudG1feWRheSkpCisKKyAgICBkZWYgdGVzdF9ncmVnb3JpYW5fY2FsY3VsYXRpb24oc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IEdyZWdvcmlhbiBkYXRlIGNhbiBiZSBjYWxjdWxhdGVkIGZyb20gSnVsaWFuIGRheQorICAgICAgICBmb3JtYXRfc3RyaW5nID0gIiVZICVIICVNICVTICV3ICVqICVaIgorICAgICAgICByZXN1bHQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUodGltZS5zdHJmdGltZShmb3JtYXRfc3RyaW5nLCBzZWxmLnRpbWVfdHVwbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3N0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC50bV95ZWFyID09IHNlbGYudGltZV90dXBsZS50bV95ZWFyIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50bV9tb24gPT0gc2VsZi50aW1lX3R1cGxlLnRtX21vbiBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQudG1fbWRheSA9PSBzZWxmLnRpbWVfdHVwbGUudG1fbWRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYWxjdWxhdGlvbiBvZiBHcmVnb3JpYW4gZGF0ZSBmYWlsZWQ7IgorICAgICAgICAgICAgICAgICAgICAgICAgICIlcy0lcy0lcyAhPSAlcy0lcy0lcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQudG1feWVhciwgcmVzdWx0LnRtX21vbiwgcmVzdWx0LnRtX21kYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGltZV90dXBsZS50bV95ZWFyLCBzZWxmLnRpbWVfdHVwbGUudG1fbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRpbWVfdHVwbGUudG1fbWRheSkpCisKKyAgICBkZWYgdGVzdF9kYXlfb2Zfd2Vla19jYWxjdWxhdGlvbihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgdGhlIGRheSBvZiB0aGUgd2VlayBpcyBjYWxjdWxhdGVkIGFzIG5lZWRlZAorICAgICAgICBmb3JtYXRfc3RyaW5nID0gIiVZICVtICVkICVIICVTICVqICVaIgorICAgICAgICByZXN1bHQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUodGltZS5zdHJmdGltZShmb3JtYXRfc3RyaW5nLCBzZWxmLnRpbWVfdHVwbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3N0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC50bV93ZGF5ID09IHNlbGYudGltZV90dXBsZS50bV93ZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGN1bGF0aW9uIG9mIGRheSBvZiB0aGUgd2VlayBmYWlsZWQ7IgorICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAhPSAlcyIgJSAocmVzdWx0LnRtX3dkYXksIHNlbGYudGltZV90dXBsZS50bV93ZGF5KSkKKworICAgIGRlZiB0ZXN0X3dlZWtfb2ZfeWVhcl9hbmRfZGF5X29mX3dlZWtfY2FsY3VsYXRpb24oc2VsZik6CisgICAgICAgICMgU2hvdWxkIGJlIGFibGUgdG8gaW5mZXIgZGF0ZSBpZiBnaXZlbiB5ZWFyLCB3ZWVrIG9mIHllYXIgKCVVIG9yICVXKQorICAgICAgICAjIGFuZCBkYXkgb2YgdGhlIHdlZWsKKyAgICAgICAgZGVmIHRlc3RfaGVscGVyKHltZF90dXBsZSwgdGVzdF9yZWFzb24pOgorICAgICAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ1cnLCAnVScpOgorICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcgPSAiJSVZICUlJXMgJSV3IiAlIGRpcmVjdGl2ZQorICAgICAgICAgICAgICAgIGR0X2RhdGUgPSBkYXRldGltZV9kYXRlKCp5bWRfdHVwbGUpCisgICAgICAgICAgICAgICAgc3RycF9pbnB1dCA9IGR0X2RhdGUuc3RyZnRpbWUoZm9ybWF0X3N0cmluZykKKyAgICAgICAgICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJwX2lucHV0LCBmb3JtYXRfc3RyaW5nKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFs6M10gPT0geW1kX3R1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVzKSB0ZXN0IGZhaWxlZCB3LyAnJXMnOiAlcyAhPSAlcyAoJXMgIT0gJXMpIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RfcmVhc29uLCBkaXJlY3RpdmUsIHN0cnBfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0WzozXSwgeW1kX3R1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX291dHB1dFs3XSwgZHRfZGF0ZS50aW1ldHVwbGUoKVs3XSkpCisgICAgICAgIHRlc3RfaGVscGVyKCgxOTAxLCAxLCAzKSwgIndlZWsgMCIpCisgICAgICAgIHRlc3RfaGVscGVyKCgxOTAxLCAxLCA4KSwgImNvbW1vbiBjYXNlIikKKyAgICAgICAgdGVzdF9oZWxwZXIoKDE5MDEsIDEsIDEzKSwgImRheSBvbiBTdW5kYXkiKQorICAgICAgICB0ZXN0X2hlbHBlcigoMTkwMSwgMSwgMTQpLCAiZGF5IG9uIE1vbmRheSIpCisgICAgICAgIHRlc3RfaGVscGVyKCgxOTA1LCAxLCAxKSwgIkphbiAxIG9uIFN1bmRheSIpCisgICAgICAgIHRlc3RfaGVscGVyKCgxOTA2LCAxLCAxKSwgIkphbiAxIG9uIE1vbmRheSIpCisgICAgICAgIHRlc3RfaGVscGVyKCgxOTA2LCAxLCA3KSwgImZpcnN0IFN1bmRheSBpbiBhIHllYXIgc3RhcnRpbmcgb24gTW9uZGF5IikKKyAgICAgICAgdGVzdF9oZWxwZXIoKDE5MDUsIDEyLCAzMSksICJEZWMgMzEgb24gU3VuZGF5IikKKyAgICAgICAgdGVzdF9oZWxwZXIoKDE5MDYsIDEyLCAzMSksICJEZWMgMzEgb24gTW9uZGF5IikKKyAgICAgICAgdGVzdF9oZWxwZXIoKDIwMDgsIDEyLCAyOSksICJNb25kYXkgaW4gdGhlIGxhc3Qgd2VlayBvZiB0aGUgeWVhciIpCisgICAgICAgIHRlc3RfaGVscGVyKCgyMDA4LCAxMiwgMjIpLCAiTW9uZGF5IGluIHRoZSBzZWNvbmQtdG8tbGFzdCB3ZWVrIG9mIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVhciIpCisgICAgICAgIHRlc3RfaGVscGVyKCgxOTc4LCAxMCwgMjMpLCAicmFuZG9tbHkgY2hvc2VuIGRhdGUiKQorICAgICAgICB0ZXN0X2hlbHBlcigoMjAwNCwgMTIsIDE4KSwgInJhbmRvbWx5IGNob3NlbiBkYXRlIikKKyAgICAgICAgdGVzdF9oZWxwZXIoKDE5NzgsIDEwLCAyMyksICJ5ZWFyIHN0YXJ0aW5nIGFuZCBlbmRpbmcgb24gTW9uZGF5IHdoaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0ZSBub3Qgb24gU3VuZGF5IG9yIE1vbmRheSIpCisgICAgICAgIHRlc3RfaGVscGVyKCgxOTE3LCAxMiwgMTcpLCAieWVhciBzdGFydGluZyBhbmQgZW5kaW5nIG9uIE1vbmRheSB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBNb25kYXkgbm90IGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2YgdGhlIHllYXIiKQorICAgICAgICB0ZXN0X2hlbHBlcigoMTkxNywgMTIsIDMxKSwgIkRlYyAzMSBvbiBNb25kYXkgd2l0aCB5ZWFyIHN0YXJ0aW5nIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuZGluZyBvbiBNb25kYXkiKQorICAgICAgICB0ZXN0X2hlbHBlcigoMjAwNywgMDEsIDA3KSwgIkZpcnN0IFN1bmRheSBvZiAyMDA3IikKKyAgICAgICAgdGVzdF9oZWxwZXIoKDIwMDcsIDAxLCAxNCksICJTZWNvbmQgU3VuZGF5IG9mIDIwMDciKQorICAgICAgICB0ZXN0X2hlbHBlcigoMjAwNiwgMTIsIDMxKSwgIkxhc3QgU3VuZGF5IG9mIDIwMDYiKQorICAgICAgICB0ZXN0X2hlbHBlcigoMjAwNiwgMTIsIDI0KSwgIlNlY29uZCB0byBsYXN0IFN1bmRheSBvZiAyMDA2IikKKworCitjbGFzcyBDYWNoZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgY2FjaGluZyB3b3JrcyBwcm9wZXJseS4iIiIKKworICAgIGRlZiB0ZXN0X3RpbWVfcmVfcmVjcmVhdGlvbihzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgY2FjaGUgaXMgcmVjcmVhdGVkIHdoZW4gY3VycmVudCBsb2NhbGUgZG9lcyBub3QgbWF0Y2ggd2hhdAorICAgICAgICAjIGNhY2hlZCBvYmplY3Qgd2FzIGNyZWF0ZWQgd2l0aC4KKyAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKCIxMCIsICIlZCIpCisgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSgiMjAwNSIsICIlWSIpCisgICAgICAgIF9zdHJwdGltZS5fVGltZVJFX2NhY2hlLmxvY2FsZV90aW1lLmxhbmcgPSAiTmkiCisgICAgICAgIG9yaWdpbmFsX3RpbWVfcmUgPSBfc3RycHRpbWUuX1RpbWVSRV9jYWNoZQorICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoIjEwIiwgIiVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChvcmlnaW5hbF90aW1lX3JlLCBfc3RycHRpbWUuX1RpbWVSRV9jYWNoZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oX3N0cnB0aW1lLl9yZWdleF9jYWNoZSksIDEpCisKKyAgICBkZWYgdGVzdF9yZWdleF9jbGVhbnVwKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBjYWNoZWQgcmVnZXhlcyBhcmUgZGlzY2FyZGVkIHdoZW4gY2FjaGUgYmVjb21lcyAiZnVsbCIuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBfc3RycHRpbWUuX3JlZ2V4X2NhY2hlWyclZCddCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYm9ndXNfa2V5ID0gMAorICAgICAgICB3aGlsZSBsZW4oX3N0cnB0aW1lLl9yZWdleF9jYWNoZSkgPD0gX3N0cnB0aW1lLl9DQUNIRV9NQVhfU0laRToKKyAgICAgICAgICAgIF9zdHJwdGltZS5fcmVnZXhfY2FjaGVbYm9ndXNfa2V5XSA9IE5vbmUKKyAgICAgICAgICAgIGJvZ3VzX2tleSArPSAxCisgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSgiMTAiLCAiJWQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihfc3RycHRpbWUuX3JlZ2V4X2NhY2hlKSwgMSkKKworICAgIGRlZiB0ZXN0X25ld19sb2NhbGV0aW1lKHNlbGYpOgorICAgICAgICAjIEEgbmV3IExvY2FsZVRpbWUgaW5zdGFuY2Ugc2hvdWxkIGJlIGNyZWF0ZWQgd2hlbiBhIG5ldyBUaW1lUkUgb2JqZWN0CisgICAgICAgICMgaXMgY3JlYXRlZC4KKyAgICAgICAgbG9jYWxlX3RpbWVfaWQgPSBfc3RycHRpbWUuX1RpbWVSRV9jYWNoZS5sb2NhbGVfdGltZQorICAgICAgICBfc3RycHRpbWUuX1RpbWVSRV9jYWNoZS5sb2NhbGVfdGltZS5sYW5nID0gIk5pIgorICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoIjEwIiwgIiVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChsb2NhbGVfdGltZV9pZCwgX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUubG9jYWxlX3RpbWUpCisKKyAgICBkZWYgdGVzdF9UaW1lUkVfcmVjcmVhdGlvbihzZWxmKToKKyAgICAgICAgIyBUaGUgVGltZVJFIGluc3RhbmNlIHNob3VsZCBiZSByZWNyZWF0ZWQgdXBvbiBjaGFuZ2luZyB0aGUgbG9jYWxlLgorICAgICAgICBsb2NhbGVfaW5mbyA9IGxvY2FsZS5nZXRsb2NhbGUobG9jYWxlLkxDX1RJTUUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX1RJTUUsICgnZW5fVVMnLCAnVVRGOCcpKQorICAgICAgICBleGNlcHQgbG9jYWxlLkVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSgnMTAnLCAnJWQnKQorICAgICAgICAgICAgIyBHZXQgaWQgb2YgY3VycmVudCBjYWNoZSBvYmplY3QuCisgICAgICAgICAgICBmaXJzdF90aW1lX3JlID0gX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIENoYW5nZSB0aGUgbG9jYWxlIGFuZCBmb3JjZSBhIHJlY3JlYXRpb24gb2YgdGhlIGNhY2hlLgorICAgICAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX1RJTUUsICgnZGVfREUnLCAnVVRGOCcpKQorICAgICAgICAgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSgnMTAnLCAnJWQnKQorICAgICAgICAgICAgICAgICMgR2V0IHRoZSBuZXcgY2FjaGUgb2JqZWN0J3MgaWQuCisgICAgICAgICAgICAgICAgc2Vjb25kX3RpbWVfcmUgPSBfc3RycHRpbWUuX1RpbWVSRV9jYWNoZQorICAgICAgICAgICAgICAgICMgVGhleSBzaG91bGQgbm90IGJlIGVxdWFsLgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoZmlyc3RfdGltZV9yZSwgc2Vjb25kX3RpbWVfcmUpCisgICAgICAgICAgICAjIFBvc3NpYmxlIHRlc3QgbG9jYWxlIGlzIG5vdCBzdXBwb3J0ZWQgd2hpbGUgaW5pdGlhbCBsb2NhbGUgaXMuCisgICAgICAgICAgICAjIElmIHRoaXMgaXMgdGhlIGNhc2UganVzdCBzdXBwcmVzcyB0aGUgZXhjZXB0aW9uIGFuZCBmYWxsLXRocm91Z2gKKyAgICAgICAgICAgICMgdG8gdGhlIHJlc2V0dGluZyB0byB0aGUgb3JpZ2luYWwgbG9jYWxlLgorICAgICAgICAgICAgZXhjZXB0IGxvY2FsZS5FcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICMgTWFrZSBzdXJlIHdlIGRvbid0IHRyYW1wbGUgb24gdGhlIGxvY2FsZSBzZXR0aW5nIG9uY2Ugd2UgbGVhdmUgdGhlCisgICAgICAgICMgdGVzdC4KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX1RJTUUsIGxvY2FsZV9pbmZvKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBnZXRsYW5nX1Rlc3RzLAorICAgICAgICBMb2NhbGVUaW1lX1Rlc3RzLAorICAgICAgICBUaW1lUkVUZXN0cywKKyAgICAgICAgU3RycHRpbWVUZXN0cywKKyAgICAgICAgU3RycHRpbWUxMkFNUE1UZXN0cywKKyAgICAgICAgSnVsaWFuVGVzdHMsCisgICAgICAgIENhbGN1bGF0aW9uVGVzdHMsCisgICAgICAgIENhY2hlVGVzdHMKKyAgICApCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RycHRpbWUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RycHRpbWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTdkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJwdGltZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RycHRpbWUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RycHRpbWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTdkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJwdGltZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydG9kLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydG9kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzU5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ0b2QucHkKQEAgLTAsMCArMSwzOTkgQEAKKyMgVGVzdHMgZm9yIHRoZSBjb3JyZWN0bHktcm91bmRlZCBzdHJpbmcgLT4gZmxvYXQgY29udmVyc2lvbnMKKyMgaW50cm9kdWNlZCBpbiBQeXRob24gMi43IGFuZCAzLjEuCisKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitpZiBnZXRhdHRyKHN5cywgJ2Zsb2F0X3JlcHJfc3R5bGUnLCAnJykgIT0gJ3Nob3J0JzoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgnY29ycmVjdGx5LXJvdW5kZWQgc3RyaW5nLT5mbG9hdCBjb252ZXJzaW9ucyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vdCBhdmFpbGFibGUgb24gdGhpcyBzeXN0ZW0nKQorCisjIENvcnJlY3RseSByb3VuZGVkIHN0ciAtPiBmbG9hdCBpbiBwdXJlIFB5dGhvbiwgZm9yIGNvbXBhcmlzb24uCisKK3N0cnRvZF9wYXJzZXIgPSByZS5jb21waWxlKHIiIiIgICAgIyBBIG51bWVyaWMgc3RyaW5nIGNvbnNpc3RzIG9mOgorICAgICg/UDxzaWduPlstK10pPyAgICAgICAgICAjIGFuIG9wdGlvbmFsIHNpZ24sIGZvbGxvd2VkIGJ5CisgICAgKD89XGR8XC5cZCkgICAgICAgICAgICAgICMgYSBudW1iZXIgd2l0aCBhdCBsZWFzdCBvbmUgZGlnaXQKKyAgICAoP1A8aW50PlxkKikgICAgICAgICAgICAgIyBoYXZpbmcgYSAocG9zc2libHkgZW1wdHkpIGludGVnZXIgcGFydAorICAgICg/OlwuKD9QPGZyYWM+XGQqKSk/ICAgICAjIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIGZyYWN0aW9uYWwgcGFydAorICAgICg/OkUoP1A8ZXhwPlstK10/XGQrKSk/ICAjIGFuZCBhbiBvcHRpb25hbCBleHBvbmVudAorICAgIFxaCisiIiIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKS5tYXRjaAorCisjIFB1cmUgUHl0aG9uIHZlcnNpb24gb2YgY29ycmVjdGx5IHJvdW5kZWQgc3RyaW5nLT5mbG9hdCBjb252ZXJzaW9uLgorIyBBdm9pZHMgYW55IHVzZSBvZiBmbG9hdGluZy1wb2ludCBieSByZXR1cm5pbmcgdGhlIHJlc3VsdCBhcyBhIGhleCBzdHJpbmcuCitkZWYgc3RydG9kKHMsIG1hbnRfZGlnPTUzLCBtaW5fZXhwID0gLTEwMjEsIG1heF9leHAgPSAxMDI0KToKKyAgICAiIiJDb252ZXJ0IGEgZmluaXRlIGRlY2ltYWwgc3RyaW5nIHRvIGEgaGV4IHN0cmluZyByZXByZXNlbnRpbmcgYW4KKyAgICBJRUVFIDc1NCBiaW5hcnk2NCBmbG9hdC4gIFJldHVybiAnaW5mJyBvciAnLWluZicgb24gb3ZlcmZsb3cuCisgICAgVGhpcyBmdW5jdGlvbiBtYWtlcyBubyB1c2Ugb2YgZmxvYXRpbmctcG9pbnQgYXJpdGhtZXRpYyBhdCBhbnkKKyAgICBzdGFnZS4iIiIKKworICAgICMgcGFyc2Ugc3RyaW5nIGludG8gYSBwYWlyIG9mIGludGVnZXJzICdhJyBhbmQgJ2InIHN1Y2ggdGhhdAorICAgICMgYWJzKGRlY2ltYWwgdmFsdWUpID0gYS9iLCBhbG9uZyB3aXRoIGEgYm9vbGVhbiAnbmVnYXRpdmUnLgorICAgIG0gPSBzdHJ0b2RfcGFyc2VyKHMpCisgICAgaWYgbSBpcyBOb25lOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnZhbGlkIG51bWVyaWMgc3RyaW5nJykKKyAgICBmcmFjdGlvbiA9IG0uZ3JvdXAoJ2ZyYWMnKSBvciAnJworICAgIGludHBhcnQgPSBpbnQobS5ncm91cCgnaW50JykgKyBmcmFjdGlvbikKKyAgICBleHAgPSBpbnQobS5ncm91cCgnZXhwJykgb3IgJzAnKSAtIGxlbihmcmFjdGlvbikKKyAgICBuZWdhdGl2ZSA9IG0uZ3JvdXAoJ3NpZ24nKSA9PSAnLScKKyAgICBhLCBiID0gaW50cGFydCoxMCoqbWF4KGV4cCwgMCksIDEwKiptYXgoMCwgLWV4cCkKKworICAgICMgcXVpY2sgcmV0dXJuIGZvciB6ZXJvcworICAgIGlmIG5vdCBhOgorICAgICAgICByZXR1cm4gJy0weDAuMHArMCcgaWYgbmVnYXRpdmUgZWxzZSAnMHgwLjBwKzAnCisKKyAgICAjIGNvbXB1dGUgZXhwb25lbnQgZSBmb3IgcmVzdWx0OyBtYXkgYmUgb25lIHRvbyBzbWFsbCBpbiB0aGUgY2FzZQorICAgICMgdGhhdCB0aGUgcm91bmRlZCB2YWx1ZSBvZiBhL2IgbGllcyBpbiBhIGRpZmZlcmVudCBiaW5hZGUgZnJvbSBhL2IKKyAgICBkID0gYS5iaXRfbGVuZ3RoKCkgLSBiLmJpdF9sZW5ndGgoKQorICAgIGQgKz0gKGEgPj4gZCBpZiBkID49IDAgZWxzZSBhIDw8IC1kKSA+PSBiCisgICAgZSA9IG1heChkLCBtaW5fZXhwKSAtIG1hbnRfZGlnCisKKyAgICAjIGFwcHJveGltYXRlIGEvYiBieSBudW1iZXIgb2YgdGhlIGZvcm0gcSAqIDIqKmU7IGFkanVzdCBlIGlmIG5lY2Vzc2FyeQorICAgIGEsIGIgPSBhIDw8IG1heCgtZSwgMCksIGIgPDwgbWF4KGUsIDApCisgICAgcSwgciA9IGRpdm1vZChhLCBiKQorICAgIGlmIDIqciA+IGIgb3IgMipyID09IGIgYW5kIHEgJiAxOgorICAgICAgICBxICs9IDEKKyAgICAgICAgaWYgcS5iaXRfbGVuZ3RoKCkgPT0gbWFudF9kaWcrMToKKyAgICAgICAgICAgIHEgLy89IDIKKyAgICAgICAgICAgIGUgKz0gMQorCisgICAgIyBkb3VibGUgY2hlY2sgdGhhdCAocSwgZSkgaGFzIHRoZSByaWdodCBmb3JtCisgICAgYXNzZXJ0IHEuYml0X2xlbmd0aCgpIDw9IG1hbnRfZGlnIGFuZCBlID49IG1pbl9leHAgLSBtYW50X2RpZworICAgIGFzc2VydCBxLmJpdF9sZW5ndGgoKSA9PSBtYW50X2RpZyBvciBlID09IG1pbl9leHAgLSBtYW50X2RpZworCisgICAgIyBjaGVjayBmb3Igb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdworICAgIGlmIGUgKyBxLmJpdF9sZW5ndGgoKSA+IG1heF9leHA6CisgICAgICAgIHJldHVybiAnLWluZicgaWYgbmVnYXRpdmUgZWxzZSAnaW5mJworICAgIGlmIG5vdCBxOgorICAgICAgICByZXR1cm4gJy0weDAuMHArMCcgaWYgbmVnYXRpdmUgZWxzZSAnMHgwLjBwKzAnCisKKyAgICAjIGZvciBoZXggcmVwcmVzZW50YXRpb24sIHNoaWZ0IHNvICMgYml0cyBhZnRlciBwb2ludCBpcyBhIG11bHRpcGxlIG9mIDQKKyAgICBoZXhkaWdzID0gMSArIChtYW50X2RpZy0yKS8vNAorICAgIHNoaWZ0ID0gMyAtIChtYW50X2RpZy0yKSU0CisgICAgcSwgZSA9IHEgPDwgc2hpZnQsIGUgLSBzaGlmdAorICAgIHJldHVybiAne30weHs6eH0uezowe314fXB7OitkfScuZm9ybWF0KAorICAgICAgICAnLScgaWYgbmVnYXRpdmUgZWxzZSAnJywKKyAgICAgICAgcSAvLyAxNioqaGV4ZGlncywKKyAgICAgICAgcSAlIDE2KipoZXhkaWdzLAorICAgICAgICBoZXhkaWdzLAorICAgICAgICBlICsgNCpoZXhkaWdzKQorCitURVNUX1NJWkUgPSAxMAorCitjbGFzcyBTdHJ0b2RUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGNoZWNrX3N0cnRvZChzZWxmLCBzKToKKyAgICAgICAgIiIiQ29tcGFyZSB0aGUgcmVzdWx0IG9mIFB5dGhvbidzIGJ1aWx0aW4gY29ycmVjdGx5IHJvdW5kZWQKKyAgICAgICAgc3RyaW5nLT5mbG9hdCBjb252ZXJzaW9uICh1c2luZyBmbG9hdCkgdG8gYSBwdXJlIFB5dGhvbgorICAgICAgICBjb3JyZWN0bHkgcm91bmRlZCBzdHJpbmctPmZsb2F0IGltcGxlbWVudGF0aW9uLiAgRmFpbCBpZiB0aGUKKyAgICAgICAgdHdvIG1ldGhvZHMgZ2l2ZSBkaWZmZXJlbnQgcmVzdWx0cy4iIiIKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmcyA9IGZsb2F0KHMpCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgZ290ID0gJy1pbmYnIGlmIHNbMF0gPT0gJy0nIGVsc2UgJ2luZicKKyAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgICAgICAgICAgZ290ID0gJ21lbW9yeSBlcnJvcicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGdvdCA9IGZzLmhleCgpCisgICAgICAgIGV4cGVjdGVkID0gc3RydG9kKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0bHkgcm91bmRlZCBzdHItPmZsb2F0IGNvbnZlcnNpb24gZm9yIHt9OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHt9LCBnb3Qge30iLmZvcm1hdChzLCBleHBlY3RlZCwgZ290KSkKKworICAgIGRlZiB0ZXN0X3Nob3J0X2hhbGZ3YXlfY2FzZXMoc2VsZik6CisgICAgICAgICMgZXhhY3QgaGFsZndheSBjYXNlcyB3aXRoIGEgc21hbGwgbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cworICAgICAgICBmb3IgayBpbiAwLCA1LCAxMCwgMTUsIDIwOgorICAgICAgICAgICAgIyB1cHBlciA9IHNtYWxsZXN0IGludGVnZXIgPj0gMioqNTQvNSoqaworICAgICAgICAgICAgdXBwZXIgPSAtKC0yKio1NC8vNSoqaykKKyAgICAgICAgICAgICMgbG93ZXIgPSBzbWFsbGVzdCBvZGQgbnVtYmVyID49IDIqKjUzLzUqKmsKKyAgICAgICAgICAgIGxvd2VyID0gLSgtMioqNTMvLzUqKmspCisgICAgICAgICAgICBpZiBsb3dlciAlIDIgPT0gMDoKKyAgICAgICAgICAgICAgICBsb3dlciArPSAxCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoVEVTVF9TSVpFKToKKyAgICAgICAgICAgICAgICAjIFNlbGVjdCBhIHJhbmRvbSBvZGQgbiBpbiBbMioqNTMvNSoqaywKKyAgICAgICAgICAgICAgICAjIDIqKjU0LzUqKmspLiBUaGVuIG4gKiAxMCoqayBnaXZlcyBhIGhhbGZ3YXkgY2FzZQorICAgICAgICAgICAgICAgICMgd2l0aCBzbWFsbCBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzLgorICAgICAgICAgICAgICAgIG4sIGUgPSByYW5kb20ucmFuZHJhbmdlKGxvd2VyLCB1cHBlciwgMiksIGsKKworICAgICAgICAgICAgICAgICMgUmVtb3ZlIGFueSBhZGRpdGlvbmFsIHBvd2VycyBvZiA1LgorICAgICAgICAgICAgICAgIHdoaWxlIG4gJSA1ID09IDA6CisgICAgICAgICAgICAgICAgICAgIG4sIGUgPSBuIC8vIDUsIGUgKyAxCisgICAgICAgICAgICAgICAgYXNzZXJ0IG4gJSAxMCBpbiAoMSwgMywgNywgOSkKKworICAgICAgICAgICAgICAgICMgVHJ5IG51bWJlcnMgb2YgdGhlIGZvcm0gbiAqIDIqKnAyICogMTAqKmUsIHAyID49IDAsCisgICAgICAgICAgICAgICAgIyB1bnRpbCBuICogMioqcDIgaGFzIG1vcmUgdGhhbiAyMCBzaWduaWZpY2FudCBkaWdpdHMuCisgICAgICAgICAgICAgICAgZGlnaXRzLCBleHBvbmVudCA9IG4sIGUKKyAgICAgICAgICAgICAgICB3aGlsZSBkaWdpdHMgPCAxMCoqMjA6CisgICAgICAgICAgICAgICAgICAgIHMgPSAne31le30nLmZvcm1hdChkaWdpdHMsIGV4cG9uZW50KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3N0cnRvZChzKQorICAgICAgICAgICAgICAgICAgICAjIFNhbWUgYWdhaW4sIGJ1dCB3aXRoIGV4dHJhIHRyYWlsaW5nIHplcm9zLgorICAgICAgICAgICAgICAgICAgICBzID0gJ3t9ZXt9Jy5mb3JtYXQoZGlnaXRzICogMTAqKjQwLCBleHBvbmVudCAtIDQwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3N0cnRvZChzKQorICAgICAgICAgICAgICAgICAgICBkaWdpdHMgKj0gMgorCisgICAgICAgICAgICAgICAgIyBUcnkgbnVtYmVycyBvZiB0aGUgZm9ybSBuICogNSoqcDIgKiAxMCoqKGUgLSBwNSksIHA1CisgICAgICAgICAgICAgICAgIyA+PSAwLCB3aXRoIG4gKiA1KipwNSA8IDEwKioyMC4KKyAgICAgICAgICAgICAgICBkaWdpdHMsIGV4cG9uZW50ID0gbiwgZQorICAgICAgICAgICAgICAgIHdoaWxlIGRpZ2l0cyA8IDEwKioyMDoKKyAgICAgICAgICAgICAgICAgICAgcyA9ICd7fWV7fScuZm9ybWF0KGRpZ2l0cywgZXhwb25lbnQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RydG9kKHMpCisgICAgICAgICAgICAgICAgICAgICMgU2FtZSBhZ2FpbiwgYnV0IHdpdGggZXh0cmEgdHJhaWxpbmcgemVyb3MuCisgICAgICAgICAgICAgICAgICAgIHMgPSAne31le30nLmZvcm1hdChkaWdpdHMgKiAxMCoqNDAsIGV4cG9uZW50IC0gNDApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RydG9kKHMpCisgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyAqPSA1CisgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50IC09IDEKKworICAgIGRlZiB0ZXN0X2hhbGZ3YXlfY2FzZXMoc2VsZik6CisgICAgICAgICMgdGVzdCBoYWxmd2F5IGNhc2VzIGZvciB0aGUgcm91bmQtaGFsZi10by1ldmVuIHJ1bGUKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCAqIFRFU1RfU0laRSk6CisgICAgICAgICAgICAjIGJpdCBwYXR0ZXJuIGZvciBhIHJhbmRvbSBmaW5pdGUgcG9zaXRpdmUgKG9yICswLjApIGZsb2F0CisgICAgICAgICAgICBiaXRzID0gcmFuZG9tLnJhbmRyYW5nZSgyMDQ3KjIqKjUyKQorCisgICAgICAgICAgICAjIGNvbnZlcnQgYml0IHBhdHRlcm4gdG8gYSBudW1iZXIgb2YgdGhlIGZvcm0gbSAqIDIqKmUKKyAgICAgICAgICAgIGUsIG0gPSBkaXZtb2QoYml0cywgMioqNTIpCisgICAgICAgICAgICBpZiBlOgorICAgICAgICAgICAgICAgIG0sIGUgPSBtICsgMioqNTIsIGUgLSAxCisgICAgICAgICAgICBlIC09IDEwNzQKKworICAgICAgICAgICAgIyBhZGQgMC41IHVscHMKKyAgICAgICAgICAgIG0sIGUgPSAyKm0gKyAxLCBlIC0gMQorCisgICAgICAgICAgICAjIGNvbnZlcnQgdG8gYSBkZWNpbWFsIHN0cmluZworICAgICAgICAgICAgaWYgZSA+PSAwOgorICAgICAgICAgICAgICAgIGRpZ2l0cyA9IG0gPDwgZQorICAgICAgICAgICAgICAgIGV4cG9uZW50ID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIG0gKiAyKiplID0gKG0gKiA1KiotZSkgKiAxMCoqZQorICAgICAgICAgICAgICAgIGRpZ2l0cyA9IG0gKiA1KiotZQorICAgICAgICAgICAgICAgIGV4cG9uZW50ID0gZQorICAgICAgICAgICAgcyA9ICd7fWV7fScuZm9ybWF0KGRpZ2l0cywgZXhwb25lbnQpCisgICAgICAgICAgICBzZWxmLmNoZWNrX3N0cnRvZChzKQorCisgICAgZGVmIHRlc3RfYm91bmRhcmllcyhzZWxmKToKKyAgICAgICAgIyBib3VuZGFyaWVzIGV4cHJlc3NlZCBhcyB0cmlwbGVzIChuLCBlLCB1KSwgd2hlcmUKKyAgICAgICAgIyBuKjEwKiplIGlzIGFuIGFwcHJveGltYXRpb24gdG8gdGhlIGJvdW5kYXJ5IHZhbHVlIGFuZAorICAgICAgICAjIHUqMTAqKmUgaXMgMXVscAorICAgICAgICBib3VuZGFyaWVzID0gWworICAgICAgICAgICAgKDEwMDAwMDAwMDAwMDAwMDAwMDAwLCAtMTksIDExMTApLCAgICMgYSBwb3dlciBvZiAyIGJvdW5kYXJ5ICgxLjApCisgICAgICAgICAgICAoMTc5NzY5MzEzNDg2MjMxNTkwNzcsIDI4OSwgMTk5NSksICAgIyBvdmVyZmxvdyBib3VuZGFyeSAoMi4qKjEwMjQpCisgICAgICAgICAgICAoMjIyNTA3Mzg1ODUwNzIwMTM4MzEsIC0zMjcsIDQ5NDEpLCAgIyBub3JtYWwvc3Vibm9ybWFsICgyLioqLTEwMjIpCisgICAgICAgICAgICAoMCwgLTMyNywgNDk0MSksICAgICAgICAgICAgICAgICAgICAgIyB6ZXJvCisgICAgICAgICAgICBdCisgICAgICAgIGZvciBuLCBlLCB1IGluIGJvdW5kYXJpZXM6CisgICAgICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoMTAwMCk6CisgICAgICAgICAgICAgICAgZGlnaXRzID0gbiArIHJhbmRvbS5yYW5kcmFuZ2UoLTMqdSwgMyp1KQorICAgICAgICAgICAgICAgIGV4cG9uZW50ID0gZQorICAgICAgICAgICAgICAgIHMgPSAne31le30nLmZvcm1hdChkaWdpdHMsIGV4cG9uZW50KQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RydG9kKHMpCisgICAgICAgICAgICAgICAgbiAqPSAxMAorICAgICAgICAgICAgICAgIHUgKj0gMTAKKyAgICAgICAgICAgICAgICBlIC09IDEKKworICAgIGRlZiB0ZXN0X3VuZGVyZmxvd19ib3VuZGFyeShzZWxmKToKKyAgICAgICAgIyB0ZXN0IHZhbHVlcyBjbG9zZSB0byAyKiotMTA3NSwgdGhlIHVuZGVyZmxvdyBib3VuZGFyeTsgc2ltaWxhcgorICAgICAgICAjIHRvIGJvdW5kYXJ5X3Rlc3RzLCBleGNlcHQgdGhhdCB0aGUgcmFuZG9tIGVycm9yIGRvZXNuJ3Qgc2NhbGUKKyAgICAgICAgIyB3aXRoIG4KKyAgICAgICAgZm9yIGV4cG9uZW50IGluIHhyYW5nZSgtNDAwLCAtMzIwKToKKyAgICAgICAgICAgIGJhc2UgPSAxMCoqLWV4cG9uZW50IC8vIDIqKjEwNzUKKyAgICAgICAgICAgIGZvciBqIGluIHhyYW5nZShURVNUX1NJWkUpOgorICAgICAgICAgICAgICAgIGRpZ2l0cyA9IGJhc2UgKyByYW5kb20ucmFuZHJhbmdlKC0xMDAwLCAxMDAwKQorICAgICAgICAgICAgICAgIHMgPSAne31le30nLmZvcm1hdChkaWdpdHMsIGV4cG9uZW50KQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RydG9kKHMpCisKKyAgICBkZWYgdGVzdF9iaWdjb21wKHNlbGYpOgorICAgICAgICBmb3IgbmRpZ3MgaW4gNSwgMTAsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCA0MCwgNDEsIDUwOgorICAgICAgICAgICAgZGlnMTAgPSAxMCoqbmRpZ3MKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMCAqIFRFU1RfU0laRSk6CisgICAgICAgICAgICAgICAgZGlnaXRzID0gcmFuZG9tLnJhbmRyYW5nZShkaWcxMCkKKyAgICAgICAgICAgICAgICBleHBvbmVudCA9IHJhbmRvbS5yYW5kcmFuZ2UoLTQwMCwgNDAwKQorICAgICAgICAgICAgICAgIHMgPSAne31le30nLmZvcm1hdChkaWdpdHMsIGV4cG9uZW50KQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RydG9kKHMpCisKKyAgICBkZWYgdGVzdF9wYXJzaW5nKHNlbGYpOgorICAgICAgICAjIG1ha2UgJzAnIG1vcmUgbGlrZWx5IHRvIGJlIGNob3NlbiB0aGFuIG90aGVyIGRpZ2l0cworICAgICAgICBkaWdpdHMgPSAnMDAwMDAwMTIzNDU2Nzg5JworICAgICAgICBzaWducyA9ICgnKycsICctJywgJycpCisKKyAgICAgICAgIyBwdXQgdG9nZXRoZXIgcmFuZG9tIHNob3J0IHZhbGlkIHN0cmluZ3MKKyAgICAgICAgIyBcZCpbLlxkKl0/ZQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwMCk6CisgICAgICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoVEVTVF9TSVpFKToKKyAgICAgICAgICAgICAgICBzID0gcmFuZG9tLmNob2ljZShzaWducykKKyAgICAgICAgICAgICAgICBpbnRwYXJ0X2xlbiA9IHJhbmRvbS5yYW5kcmFuZ2UoNSkKKyAgICAgICAgICAgICAgICBzICs9ICcnLmpvaW4ocmFuZG9tLmNob2ljZShkaWdpdHMpIGZvciBfIGluIHhyYW5nZShpbnRwYXJ0X2xlbikpCisgICAgICAgICAgICAgICAgaWYgcmFuZG9tLmNob2ljZShbVHJ1ZSwgRmFsc2VdKToKKyAgICAgICAgICAgICAgICAgICAgcyArPSAnLicKKyAgICAgICAgICAgICAgICAgICAgZnJhY3BhcnRfbGVuID0gcmFuZG9tLnJhbmRyYW5nZSg1KQorICAgICAgICAgICAgICAgICAgICBzICs9ICcnLmpvaW4ocmFuZG9tLmNob2ljZShkaWdpdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgXyBpbiB4cmFuZ2UoZnJhY3BhcnRfbGVuKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmcmFjcGFydF9sZW4gPSAwCisgICAgICAgICAgICAgICAgaWYgcmFuZG9tLmNob2ljZShbVHJ1ZSwgRmFsc2VdKToKKyAgICAgICAgICAgICAgICAgICAgcyArPSByYW5kb20uY2hvaWNlKFsnZScsICdFJ10pCisgICAgICAgICAgICAgICAgICAgIHMgKz0gcmFuZG9tLmNob2ljZShzaWducykKKyAgICAgICAgICAgICAgICAgICAgZXhwb25lbnRfbGVuID0gcmFuZG9tLnJhbmRyYW5nZSgxLCA0KQorICAgICAgICAgICAgICAgICAgICBzICs9ICcnLmpvaW4ocmFuZG9tLmNob2ljZShkaWdpdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgXyBpbiB4cmFuZ2UoZXhwb25lbnRfbGVuKSkKKworICAgICAgICAgICAgICAgIGlmIGludHBhcnRfbGVuICsgZnJhY3BhcnRfbGVuOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3N0cnRvZChzKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KHMpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiZXhwZWN0ZWQgVmFsdWVFcnJvciIKKworICAgIGRlZiB0ZXN0X3BhcnRpY3VsYXIoc2VsZik6CisgICAgICAgICMgaW5wdXRzIHRoYXQgcHJvZHVjZWQgY3Jhc2hlcyBvciBpbmNvcnJlY3RseSByb3VuZGVkIHJlc3VsdHMgd2l0aAorICAgICAgICAjIHByZXZpb3VzIHZlcnNpb25zIG9mIGR0b2EuYywgZm9yIHZhcmlvdXMgcmVhc29ucworICAgICAgICB0ZXN0X3N0cmluZ3MgPSBbCisgICAgICAgICAgICAjIGlzc3VlIDc2MzIgYnVnIDEsIG9yaWdpbmFsbHkgcmVwb3J0ZWQgZmFpbGluZyBjYXNlCisgICAgICAgICAgICAnMjE4MzE2NzAxMjMxMjExMjMxMjMxMi4yMzUzODAyMDM3NDQyMDQ0NjE5MmUtMzcwJywKKyAgICAgICAgICAgICMgNSBpbnN0YW5jZXMgb2YgaXNzdWUgNzYzMiBidWcgMgorICAgICAgICAgICAgJzEyNTc5ODE2MDQ5MDA4MzA1NTQ2OTc0MzkxNzY4OTk2MzY5NDY0OTYzMDI0NjYzMTA0ZS0zNTcnLAorICAgICAgICAgICAgJzE3NDg5NjI4NTY1MjAyMTE3MjYzMTQ1MzY3NTk2MDI4Mzg5MzQ4OTIyOTgxODU3MDEzZS0zNTcnLAorICAgICAgICAgICAgJzE4NDg3Mzk4Nzg1OTkxOTk0NjM0MTgyOTE2NjM4NTQyNjgwNzU5NjEzNTkwNDgyMjczZS0zNTcnLAorICAgICAgICAgICAgJzMyMDAyODY0MjAwNTgxMDMzMTM0MzU4NzI0Njc1MTk4MDQ0NTI3NDY5MzY2NzczOTI4ZS0zNTgnLAorICAgICAgICAgICAgJzk0MzkzNDMxMTkzMTgwNjk2OTQyODQxODM3MDg1MDMzNjQ3OTEzMjI0MTQ4NTM5ODU0ZS0zNTgnLAorICAgICAgICAgICAgJzczNjA4Mjc4OTk4OTY2OTY5MzQ1ODI0NjUzNTAwMTM2Nzg3ODc2NDM2MDA1OTU3OTUzZS0zNTgnLAorICAgICAgICAgICAgJzY0Nzc0NDc4ODM2NDE3Mjk5NDkxNzE4NDM1MjM0NjExMjk5MzM2Mjg4MDgyMTM2MDU0ZS0zNTgnLAorICAgICAgICAgICAgJzEzNzA0OTQwMTM0MTI2NTc0NTM0ODc4NjQxODc2OTQ3OTgwODc4ODI0Njg4NDUxMTY5ZS0zNTcnLAorICAgICAgICAgICAgJzQ2Njk3NDQ1Nzc0MDQ3MDYwOTYwNjI0NDk3OTY0NDI1NDE2NjEwNDgwNTI0NzYwNDcxZS0zNTgnLAorICAgICAgICAgICAgIyBmYWlsaW5nIGNhc2UgZm9yIGJ1ZyBpbnRyb2R1Y2VkIGJ5IE1FVEQgaW4gcjc3NDUxIChhdHRlbXB0ZWQKKyAgICAgICAgICAgICMgZml4IGZvciBpc3N1ZSA3NjMyLCBidWcgMiksIGFuZCBmaXhlZCBpbiByNzc0ODIuCisgICAgICAgICAgICAnMjg2MzkwOTcxNzgyNjE3NjMxNzg0ODk3NTkxMDczMjEzOTI3NDUxMDg0OTE4MjUzMDNlLTMxMScsCisgICAgICAgICAgICAjIHR3byBudW1iZXJzIGRlbW9uc3RyYXRpbmcgYSBmbGF3IGluIHRoZSBiaWdjb21wICdkaWcgPT0gMCcKKyAgICAgICAgICAgICMgY29ycmVjdGlvbiBibG9jayAoaXNzdWUgNzYzMiwgYnVnIDMpCisgICAgICAgICAgICAnMS4wMDAwMDAwMDAwMDAwMDAwMWU0NCcsCisgICAgICAgICAgICAnMS4wMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxZTQ0JywKKyAgICAgICAgICAgICMgZHRvYS5jIGJ1ZyBmb3IgbnVtYmVycyBqdXN0IHNtYWxsZXIgdGhhbiBhIHBvd2VyIG9mIDIgKGlzc3VlCisgICAgICAgICAgICAjIDc2MzIsIGJ1ZyA0KQorICAgICAgICAgICAgJzk5OTk5OTk5OTk5OTk5OTk0NDg3NjY1NDY1NTU0NzYwNzE3MDM5NTMyNTc4NTQ2ZS00NycsCisgICAgICAgICAgICAjIGZhaWxpbmcgY2FzZSBmb3Igb2ZmLWJ5LW9uZSBlcnJvciBpbnRyb2R1Y2VkIGJ5IE1FVEQgaW4KKyAgICAgICAgICAgICMgcjc3NDgzIChkdG9hLmMgY2xlYW51cCksIGZpeGVkIGluIHI3NzQ5MAorICAgICAgICAgICAgJzk2NTQzNzE3NjMzMzY1NDkzMTc5OTAzNTUxMzY3MTk5NzExODM0NTU3MDA0NTkxNDQ2OScgIy4uLgorICAgICAgICAgICAgJzYyMTM0MTMzNTA4MjE0MTYzMTIxOTQ0MjAwMDc5OTEzMDY5MDg0NzAxNDczMjIwMjAxMjEwMTgzNjhlMCcsCisgICAgICAgICAgICAjIGluY29ycmVjdCBsc2IgZGV0ZWN0aW9uIGZvciByb3VuZC1oYWxmLXRvLWV2ZW4gd2hlbgorICAgICAgICAgICAgIyBiYy0+c2NhbGUgIT0gMCAoaXNzdWUgNzYzMiwgYnVnIDYpLgorICAgICAgICAgICAgJzEwNDMwODQ4NTI0MTk4Mzk5MDY2NjcxMzQwMTcwODA3MjE3NTc3MzE2NTAzNDI3ODY4NScgIy4uLgorICAgICAgICAgICAgJzY4MjY0NjExMTc2MjI5MjQwOTMzMDkyODczOTc1MTcwMjQwNDY1ODE5Nzg3MjMxOTEyOScgIy4uLgorICAgICAgICAgICAgJzAzNjUxOTk0NzQzNTMxOTQxODM4NzgzOTc1ODk5MDQ3ODU0OTQ3Nzc3NzU4NjY3MzA3NScgIy4uLgorICAgICAgICAgICAgJzk0NTg0NDg5NTk4MTAxMjAyNDM4Nzk5MjEzNTYxNzA2NDUzMjE0MTQ4OTI3ODgxNTIzOScgIy4uLgorICAgICAgICAgICAgJzg0OTEwODEwNTk1MTYxOTk5NzgyOTE1MzYzMzUzNTMxNDg0OTk5OTY3NDI2NjE2OTI1OCcgIy4uLgorICAgICAgICAgICAgJzkyODk0MDY5MjIzOTY4NDc3MTU5MDA2NTAyNzAyNTgzNTgwNDg2MzU4NTQ1NDg3MjQ5OScgIy4uLgorICAgICAgICAgICAgJzMyMDUwMDAyMzEyNjE0MjU1MzkzMjY1NDM3MDM2MjAyNDEwNDQ2MjI1NTI0NDAzNDA1MycgIy4uLgorICAgICAgICAgICAgJzIwMzk5ODk2NDM2MDg4MjQ4NzM3ODMzNDg2MDE5NzcyNTEzOTE1MTI2NTU5MDgzMjg4NycgIy4uLgorICAgICAgICAgICAgJzQzMzczNjE4OTQ2ODg1ODYxNDUyMTcwODU2NzY0Njc0MzQ1NTYwMTkwNTkzNTU5NTM4MScgIy4uLgorICAgICAgICAgICAgJzg1MjcyMzcyMzY0NTc5OTg2NjY3MjU1ODU3Njk5Mzk3ODAyNTAzMzU5MDcyODY4NzIwNicgIy4uLgorICAgICAgICAgICAgJzI5NjM3OTgwMTM2MzAyNDA5NDA0ODMyNzI3MzkxMzA3OTYxMjQ2OTk4MjU4NTY3NDgyNCcgIy4uLgorICAgICAgICAgICAgJzE1NjAwMDc4MzE2Nzk2MzA4MTYxNjIxNDcxMDY5MTc1OTg2NDMzMjMzOTIzOTY4ODczNCcgIy4uLgorICAgICAgICAgICAgJzY1NjU0ODc5MDY1NjQ4NjY0NjEwNjk4MzQ1MDgwOTA3Mzc1MDUzNTYyNDg5NDI5NjI0MicgIy4uLgorICAgICAgICAgICAgJzA3MjAxMDE5NTcxMDI3NjA3MzA0MjAzNjQyNTU3OTg1MjQ1OTU1NjE4MzU0MTE5OTAxMicgIy4uLgorICAgICAgICAgICAgJzY1MjU3MTEyMzg5ODk5NjU3NDU2MzgyNDQyNDMzMDk2MDAyNzg3MzUxNjA4Mjc2MzY3MTg3NWUtMTA3NScsCisgICAgICAgICAgICAjIGRlbW9uc3RyYXRpb24gdGhhdCBvcmlnaW5hbCBmaXggZm9yIGlzc3VlIDc2MzIgYnVnIDEgd2FzCisgICAgICAgICAgICAjIGJ1Z2d5OyB0aGUgZXhpdCBjb25kaXRpb24gd2FzIHRvbyBzdHJvbmcKKyAgICAgICAgICAgICcyNDcwMzI4MjI5MjA2MjMyOTVlLTM0MScsCisgICAgICAgICAgICAjIGRlbW9uc3RyYXRlIHNpbWlsYXIgcHJvYmxlbSB0byBpc3N1ZSA3NjMyIGJ1ZzE6IGNyYXNoCisgICAgICAgICAgICAjIHdpdGggJ292ZXJzaXplZCBxdW90aWVudCBpbiBxdW9yZW0nIG1lc3NhZ2UuCisgICAgICAgICAgICAnOTkwMzc0ODU3MDAyNDU2ODMxMDI4MDUwNDM0MzczNDY5NjUyNDgwMjk2MDEyODY0MzFlLTM3MycsCisgICAgICAgICAgICAnOTk2MTc2Mzk4MzM3NDM4NjMxNjExMDk5NjExNjI4ODEwMjc0MDY3Njk1MTA1NTg0NTdlLTM3MycsCisgICAgICAgICAgICAnOTg4NTI5MTUwMjU3NjkzNDUyOTU3NDkyNzgzNTE1NjMxNzk4NDAxMzA1NjU1OTE0NjJlLTM3MicsCisgICAgICAgICAgICAnOTkwNTk5NDQ4Mjc2OTM1Njk2NTkxNTMwNDI3Njk2OTA5MzA5MDUxNDgwMTU4NzY3ODhlLTM3MycsCisgICAgICAgICAgICAnOTg5MTQ5NzkyMDUwNjkzNjgyNzA0MjE4Mjk4ODkwNzgzNTYyNTQwNTk3NjAzMjcxMDFlLTM3MicsCisgICAgICAgICAgICAjIGlzc3VlIDc2MzIgYnVnIDU6IHRoZSBmb2xsb3dpbmcgMiBzdHJpbmdzIGNvbnZlcnQgZGlmZmVyZW50bHkKKyAgICAgICAgICAgICcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZS0xNicsCisgICAgICAgICAgICAnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBlLTE3JywKKyAgICAgICAgICAgICMgaXNzdWUgNzYzMiBidWcgNworICAgICAgICAgICAgJzk5MTYzMzc5MzE4OTE1MDcyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGUtMzMnLAorICAgICAgICAgICAgIyBBbmQgYW5vdGhlciwgc2ltaWxhciwgZmFpbGluZyBoYWxmd2F5IGNhc2UKKyAgICAgICAgICAgICc0MTA2MjUwMTk4MDM5NDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZS0zOCcsCisgICAgICAgICAgICAjIGlzc3VlIDc2MzIgYnVnIDg6ICB0aGUgZm9sbG93aW5nIHByb2R1Y2VkIDEwLjAKKyAgICAgICAgICAgICcxMC45MDAwMDAwMDAwMDAwMDAwMTIzNDU2Nzg5MTIzNDU2Nzg5MTIzNDUnLAorCisgICAgICAgICAgICAjIHR3byBodW1vbmdvdXMgdmFsdWVzIGZyb20gaXNzdWUgNzc0MworICAgICAgICAgICAgJzExNjUxMjg3NDk0MDU5NDE5NTYzODYxNzkwNzA5MjU2OTg4MTUxOTAzNDc5MzIyOTM4NScgIy4uLgorICAgICAgICAgICAgJzIyODU2OTE2NTE5MTU0MTg5MDg0NjU2NDY2OTc3MTcxNDg5NjkxNjA4NDg4Mzk4NzkyMCcgIy4uLgorICAgICAgICAgICAgJzQ3MzMyMTI2ODEwMDI5Njg1NzYzNjIwMDkyNjA2NTM0MDc2OTY4Mjg2MzM0OTIwNTM2MycgIy4uLgorICAgICAgICAgICAgJzM0OTI0NzYzNzY2MDY3MTc4MzIwOTkwNzk0OTI3MzY4MzA0MDM5Nzk3OTk4NDEwNzgwNicgIy4uLgorICAgICAgICAgICAgJzQ2MTgyMjY5MzMzMjcxMjgyODM5NzYxNzk0NjAzNjIzOTU4MTYzMjk3NjU4NTEwMDYzMycgIy4uLgorICAgICAgICAgICAgJzUyMDI2MDc3MDc2MTA2MDcyNTQwMzkwNDEyMzE0NDM4NDU3MTYxMjA3MzczMjc1NDc3NCcgIy4uLgorICAgICAgICAgICAgJzU4ODIxMTk0NDQwNjQ2NTU3MjU5MTAyMjA4MTk3MzgyODQ0ODkyNzMzODYwMjU1NjI4NycgIy4uLgorICAgICAgICAgICAgJzg1MTgzMTc0NTQxOTM5NzQzMzAxMjQ5MTg4NDg2OTQ1NDQ2MjQ0MDUzNjg5NTA0NzQ5OScgIy4uLgorICAgICAgICAgICAgJzQzNjU1MTk3NDY0OTczMTkxNzE3MDA5OTM4Nzc2Mjg3MTAyMDQwMzU4Mjk5NDE5MzQzOScgIy4uLgorICAgICAgICAgICAgJzc2MTkzMzQxMjE2NjgyMTQ4NDAxNTg4MzYzMTYyMjUzOTMxNDIwMzc5OTAzNDQ5Nzk4MicgIy4uLgorICAgICAgICAgICAgJzEzMDAzODc0MTc0MTcyNzkwNzQyOTU3NTY3MzMwMjQ2MTM4MDM4NjU5NjUwMTE4NzQ4MicgIy4uLgorICAgICAgICAgICAgJzAwNjI1NzUyNzcwOTg0MjE3OTMzNjQ4ODM4MTY3MjgxODc5ODQ1MDIyOTMzOTEyMzUyNycgIy4uLgorICAgICAgICAgICAgJzg1ODg0NDQ0ODMzNjgxNTkxMjAyMDQ1MjI5NDYyNDkxNjk5MzU0NjM4ODk1NjU2MTUyMicgIy4uLgorICAgICAgICAgICAgJzE2MTg3NTM1MjU3MjU5MDQyMDgyMzYwNzQ3ODc4ODM5OTQ2MDE2MjIyODMwODY5Mzc0MicgIy4uLgorICAgICAgICAgICAgJzA1Mjg3NjYzNDQxNDAzNTMzOTQ4MjA0MDg1MzkwODk4Mzk5MDU1MDA0MTE5ODczMDQ2ODc1ZS0xMDc1JywKKworICAgICAgICAgICAgJzUyNTQ0MDY1MzM1Mjk1NTI2NjEwOTY2MTA2MDM1ODIwMjgxOTU2MTI1ODk4NDk2NDkxMycgIy4uLgorICAgICAgICAgICAgJzg5MjI1NjUyNzg0OTc1ODk1NjA0NTIxODI1NzA1OTcxMzc2NTg3NDI1MTQzNjE5MzYxOScgIy4uLgorICAgICAgICAgICAgJzQ0MzI0ODIwNTk5ODg3MDAwMTYzMzg2NTY1NzUxNzQ0NzM1NTk5MjIyNTg1Mjk0NTkxMicgIy4uLgorICAgICAgICAgICAgJzAxNjY2ODY2MDAwMDIxMDI4MzgwNzIwOTg1MDY2MjIyNDQxNzUwNDc1MjI2NDk5NTM2MCcgIy4uLgorICAgICAgICAgICAgJzYzMTUxMjAwNzc1Mzg1NTgwMTA3NTM3MzA1NzYzMjE1NzczODc1MjgwMDg0MDMwMjU5NicgIy4uLgorICAgICAgICAgICAgJzIzNzA1MDI0NzkxMDUzMDUzODI1MDAwODY4MjI3Mjc4MzY2MDc3ODE4MTYyODA0MDczMycgIy4uLgorICAgICAgICAgICAgJzY1MzEyMTQ5MjQzNjQwODgxMjY2ODAyMzQ3ODAwMTIwODUyOTE5MDM1OTI1NDMyMjM0MCcgIy4uLgorICAgICAgICAgICAgJzM5NzU3NTE4NTI0ODg0NDc4ODUxNTQxMDcyMjk1ODc4NDY0MDkyNjUyODU0NDA0MzA5MCcgIy4uLgorICAgICAgICAgICAgJzExNTM1MjUxMzY0MDg4NDk4ODAxNzM0MjQ2OTI3NTAwNjk5OTEwNDUxOTYyMDk0NjQzMCcgIy4uLgorICAgICAgICAgICAgJzgxODc2NzE0Nzk2NjQ5NTQ4NTQwNjU3NzcwMzk3MjY4NzgzODE3Njc3ODk5MzQ3Mjk4OScgIy4uLgorICAgICAgICAgICAgJzU2MTk1OTAwMDA0NzAzNjYzODkzODM5NjMzMzE0NjY4NTEzNzkwMzAxODM3NjQ5NjQwOCcgIy4uLgorICAgICAgICAgICAgJzMxOTcwNTMzMzg2ODQ3NjkyNTI5NzMxNzEzNjUxMzk3MDE4OTA3MzY5MzMxNDcxMDMxOCcgIy4uLgorICAgICAgICAgICAgJzk5MTI1MjgxMTA1MDUwMTQ0ODMyNjg3NTIzMjg1MDYwMDQ1MTc3NjA5MTMwMzA0MzcxNScgIy4uLgorICAgICAgICAgICAgJzE1NzE5MTI5MjgyNzYxNDA0Njg3Njk1MDIyNTcxNDc0MzExODI5MTAzNDc4MDQ2NjMyNScgIy4uLgorICAgICAgICAgICAgJzA4NTE0MTM0MzczNDU2NDkxNTE5MzQyNjk5NDU4NzIwNjQzMjY5NzMzNzExODIxMTUyNycgIy4uLgorICAgICAgICAgICAgJzI3ODk2ODczMTI5NDYzOTM1MzM1NDc3NDc4ODYwMjQ2Nzc5NTE2Nzg3NTExNzQ4MTY2MCcgIy4uLgorICAgICAgICAgICAgJzQ3Mzg3OTEyNTY4NTM2NzU2OTA1NDM2NjMyODM3ODIyMTU4NjY4MjVlLTExODAnLAorCisgICAgICAgICAgICAjIGV4ZXJjaXNlIGV4aXQgY29uZGl0aW9ucyBpbiBiaWdjb21wIGNvbXBhcmlzb24gbG9vcAorICAgICAgICAgICAgJzI2MDIxMjkyOTg0MDQ5NjMwODM4MzM4NTM0NzkxMTM1NzcyNTMxMDU5Mzk5OTU2ODhlMicsCisgICAgICAgICAgICAnMjYwMjEyOTI5ODQwNDk2MzA4MzgzMzg1MzQ3OTExMzU3NzI1MzEwNTkzOTk5NTY4ODk2ZTAnLAorICAgICAgICAgICAgJzI2MDIxMjkyOTg0MDQ5NjMwODM4MzM4NTM0NzkxMTM1NzcyNTMxMDU5Mzk5OTU2ODg5NjAxZS0yJywKKyAgICAgICAgICAgICcyNjAyMTI5Mjk4NDA0OTYzMDgzODMzODUzNDc5MTEzNTc3MjUzMTA1OTM5OTk1Njg4OTVlMCcsCisgICAgICAgICAgICAnMjYwMjEyOTI5ODQwNDk2MzA4MzgzMzg1MzQ3OTExMzU3NzI1MzEwNTkzOTk5NTY4ODk3ZTAnLAorICAgICAgICAgICAgJzI2MDIxMjkyOTg0MDQ5NjMwODM4MzM4NTM0NzkxMTM1NzcyNTMxMDU5Mzk5OTU2ODk5NmUwJywKKyAgICAgICAgICAgICcyNjAyMTI5Mjk4NDA0OTYzMDgzODMzODUzNDc5MTEzNTc3MjUzMTA1OTM5OTk1Njg4NjZlMCcsCisgICAgICAgICAgICAjIDIqKjUzCisgICAgICAgICAgICAnOTAwNzE5OTI1NDc0MDk5Mi4wMCcsCisgICAgICAgICAgICAjIDIqKjEwMjQgLSAyKio5NzA6ICBleGFjdCBvdmVyZmxvdyBib3VuZGFyeS4gIEFsbCB2YWx1ZXMKKyAgICAgICAgICAgICMgc21hbGxlciB0aGFuIHRoaXMgc2hvdWxkIHJvdW5kIHRvIHNvbWV0aGluZyBmaW5pdGU7ICBhbnkgdmFsdWUKKyAgICAgICAgICAgICMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgb25lIG92ZXJmbG93cy4KKyAgICAgICAgICAgICcxNzk3NjkzMTM0ODYyMzE1ODA3OTM3Mjg5NzE0MDUzMDM0MTUwNzk5MzQxMzI3MTAwMzcnICMuLi4KKyAgICAgICAgICAgICc4MjY5MzYxNzM3Nzg5ODA0NDQ5NjgyOTI3NjQ3NTA5NDY2NDkwMTc5Nzc1ODcyMDcwOTYnICMuLi4KKyAgICAgICAgICAgICczMzAyODY0MTY2OTI4ODc5MTA5NDY1NTU1NDc4NTE5NDA0MDI2MzA2NTc0ODg2NzE1MDUnICMuLi4KKyAgICAgICAgICAgICc4MjA2ODE5MDg5MDIwMDA3MDgzODM2NzYyNzM4NTQ4NDU4MTc3MTE1MzE3NjQ0NzU3MzAnICMuLi4KKyAgICAgICAgICAgICcyNzAwNjk4NTU1NzEzNjY5NTk2MjI4NDI5MTQ4MTk4NjA4MzQ5MzY0NzUyOTI3MTkwNzQnICMuLi4KKyAgICAgICAgICAgICcxNjg0NDQzNjU1MTA3MDQzNDI3MTE1NTk2OTk1MDgwOTMwNDI4ODAxNzc5MDQxNzQ0OTc3OTInLAorICAgICAgICAgICAgIyAyKioxMDI0IC0gMioqOTcwIC0gdGlueQorICAgICAgICAgICAgJzE3OTc2OTMxMzQ4NjIzMTU4MDc5MzcyODk3MTQwNTMwMzQxNTA3OTkzNDEzMjcxMDAzNycgIy4uLgorICAgICAgICAgICAgJzgyNjkzNjE3Mzc3ODk4MDQ0NDk2ODI5Mjc2NDc1MDk0NjY0OTAxNzk3NzU4NzIwNzA5NicgIy4uLgorICAgICAgICAgICAgJzMzMDI4NjQxNjY5Mjg4NzkxMDk0NjU1NTU0Nzg1MTk0MDQwMjYzMDY1NzQ4ODY3MTUwNScgIy4uLgorICAgICAgICAgICAgJzgyMDY4MTkwODkwMjAwMDcwODM4MzY3NjI3Mzg1NDg0NTgxNzcxMTUzMTc2NDQ3NTczMCcgIy4uLgorICAgICAgICAgICAgJzI3MDA2OTg1NTU3MTM2Njk1OTYyMjg0MjkxNDgxOTg2MDgzNDkzNjQ3NTI5MjcxOTA3NCcgIy4uLgorICAgICAgICAgICAgJzE2ODQ0NDM2NTUxMDcwNDM0MjcxMTU1OTY5OTUwODA5MzA0Mjg4MDE3NzkwNDE3NDQ5Nzc5MS45OTknLAorICAgICAgICAgICAgIyAyKioxMDI0IC0gMioqOTcwICsgdGlueQorICAgICAgICAgICAgJzE3OTc2OTMxMzQ4NjIzMTU4MDc5MzcyODk3MTQwNTMwMzQxNTA3OTkzNDEzMjcxMDAzNycgIy4uLgorICAgICAgICAgICAgJzgyNjkzNjE3Mzc3ODk4MDQ0NDk2ODI5Mjc2NDc1MDk0NjY0OTAxNzk3NzU4NzIwNzA5NicgIy4uLgorICAgICAgICAgICAgJzMzMDI4NjQxNjY5Mjg4NzkxMDk0NjU1NTU0Nzg1MTk0MDQwMjYzMDY1NzQ4ODY3MTUwNScgIy4uLgorICAgICAgICAgICAgJzgyMDY4MTkwODkwMjAwMDcwODM4MzY3NjI3Mzg1NDg0NTgxNzcxMTUzMTc2NDQ3NTczMCcgIy4uLgorICAgICAgICAgICAgJzI3MDA2OTg1NTU3MTM2Njk1OTYyMjg0MjkxNDgxOTg2MDgzNDkzNjQ3NTI5MjcxOTA3NCcgIy4uLgorICAgICAgICAgICAgJzE2ODQ0NDM2NTUxMDcwNDM0MjcxMTU1OTY5OTUwODA5MzA0Mjg4MDE3NzkwNDE3NDQ5Nzc5Mi4wMDEnLAorICAgICAgICAgICAgIyAxIC0gMioqLTU0LCArLXRpbnkKKyAgICAgICAgICAgICc5OTk5OTk5OTk5OTk5OTk5NDQ0ODg4NDg3Njg3NDIxNzI5Nzg4MTg0MTY1OTU0NTg5ODQzNzVlLTU0JywKKyAgICAgICAgICAgICc5OTk5OTk5OTk5OTk5OTk5NDQ0ODg4NDg3Njg3NDIxNzI5Nzg4MTg0MTY1OTU0NTg5ODQzNzQ5OTk5OTk5ZS01NCcsCisgICAgICAgICAgICAnOTk5OTk5OTk5OTk5OTk5OTQ0NDg4ODQ4NzY4NzQyMTcyOTc4ODE4NDE2NTk1NDU4OTg0Mzc1MDAwMDAwMWUtNTQnLAorICAgICAgICAgICAgXQorICAgICAgICBmb3IgcyBpbiB0ZXN0X3N0cmluZ3M6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3N0cnRvZChzKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTdHJ0b2RUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydG9kLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnRvZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzNTU5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnRvZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydG9kLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnRvZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiNGRjYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnRvZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjEzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3QucHkKQEAgLTAsMCArMSw1ODEgQEAKK2ltcG9ydCBvcworaW1wb3J0IGFycmF5CitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBpbnNwZWN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAoY2hlY2tfd2FybmluZ3MsIGNoZWNrX3B5M2tfd2FybmluZ3MpCisKK2ltcG9ydCBzeXMKK0lTQklHRU5ESUFOID0gc3lzLmJ5dGVvcmRlciA9PSAiYmlnIgorSVMzMkJJVCA9IHN5cy5tYXhzaXplID09IDB4N2ZmZmZmZmYKKworaW50ZWdlcl9jb2RlcyA9ICdiJywgJ0InLCAnaCcsICdIJywgJ2knLCAnSScsICdsJywgJ0wnLCAncScsICdRJworCit0ZXN0bW9kX2ZpbGVuYW1lID0gb3MucGF0aC5zcGxpdGV4dChfX2ZpbGVfXylbMF0gKyAnLnB5JworIyBOYXRpdmUgJ3EnIHBhY2tpbmcgaXNuJ3QgYXZhaWxhYmxlIG9uIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIHRoZSBDCisjIGxvbmcgbG9uZyB0eXBlLgordHJ5OgorICAgIHN0cnVjdC5wYWNrKCdxJywgNSkKK2V4Y2VwdCBzdHJ1Y3QuZXJyb3I6CisgICAgSEFWRV9MT05HX0xPTkcgPSBGYWxzZQorZWxzZToKKyAgICBIQVZFX0xPTkdfTE9ORyA9IFRydWUKKworZGVmIHN0cmluZ19yZXZlcnNlKHMpOgorICAgIHJldHVybiAiIi5qb2luKHJldmVyc2VkKHMpKQorCitkZWYgYmlnZW5kaWFuX3RvX25hdGl2ZSh2YWx1ZSk6CisgICAgaWYgSVNCSUdFTkRJQU46CisgICAgICAgIHJldHVybiB2YWx1ZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBzdHJpbmdfcmV2ZXJzZSh2YWx1ZSkKKworY2xhc3MgU3RydWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2tfZmxvYXRfY29lcmNlKHNlbGYsIGZvcm1hdCwgbnVtYmVyKToKKyAgICAgICAgIyBTRiBidWcgMTUzMDU1OS4gc3RydWN0LnBhY2sgcmFpc2VzIFR5cGVFcnJvciB3aGVyZSBpdCB1c2VkCisgICAgICAgICMgdG8gY29udmVydC4KKyAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygoIi4qaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IGZsb2F0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSkgYXMgdzoKKyAgICAgICAgICAgIGdvdCA9IHN0cnVjdC5wYWNrKGZvcm1hdCwgbnVtYmVyKQorICAgICAgICBsaW5lbm8gPSBpbnNwZWN0LmN1cnJlbnRmcmFtZSgpLmZfbGluZW5vIC0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcuZmlsZW5hbWUsIHRlc3Rtb2RfZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwody5saW5lbm8sIGxpbmVubykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDEpCisgICAgICAgIGV4cGVjdGVkID0gc3RydWN0LnBhY2soZm9ybWF0LCBpbnQobnVtYmVyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfaXNiaWdlbmRpYW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHN0cnVjdC5wYWNrKCc9aScsIDEpWzBdID09IGNocigwKSksIElTQklHRU5ESUFOKQorCisgICAgZGVmIHRlc3RfY29uc2lzdGVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHN0cnVjdC5lcnJvciwgc3RydWN0LmNhbGNzaXplLCAnWicpCisKKyAgICAgICAgc3ogPSBzdHJ1Y3QuY2FsY3NpemUoJ2knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6ICogMywgc3RydWN0LmNhbGNzaXplKCdpaWknKSkKKworICAgICAgICBmbXQgPSAnY2J4eHh4eHhoaGhoaWlsbGZmZD8nCisgICAgICAgIGZtdDMgPSAnM2MzYjE4eDEyaDZpNmw2ZjNkMz8nCisgICAgICAgIHN6ID0gc3RydWN0LmNhbGNzaXplKGZtdCkKKyAgICAgICAgc3ozID0gc3RydWN0LmNhbGNzaXplKGZtdDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3ogKiAzLCBzejMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc3RydWN0LmVycm9yLCBzdHJ1Y3QucGFjaywgJ2lpaScsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHN0cnVjdC5lcnJvciwgc3RydWN0LnBhY2ssICdpJywgMywgMywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgc3RydWN0LmVycm9yKSwgc3RydWN0LnBhY2ssICdpJywgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIHN0cnVjdC5lcnJvciksIHN0cnVjdC5wYWNrLCAnUCcsICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzdHJ1Y3QuZXJyb3IsIHN0cnVjdC51bnBhY2ssICdkJywgJ2ZsYXAnKQorICAgICAgICBzID0gc3RydWN0LnBhY2soJ2lpJywgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc3RydWN0LmVycm9yLCBzdHJ1Y3QudW5wYWNrLCAnaWlpJywgcykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc3RydWN0LmVycm9yLCBzdHJ1Y3QudW5wYWNrLCAnaScsIHMpCisKKyAgICBkZWYgdGVzdF90cmFuc2l0aXZlbmVzcyhzZWxmKToKKyAgICAgICAgYyA9ICdhJworICAgICAgICBiID0gMQorICAgICAgICBoID0gMjU1CisgICAgICAgIGkgPSA2NTUzNQorICAgICAgICBsID0gNjU1MzYKKyAgICAgICAgZiA9IDMuMTQxNQorICAgICAgICBkID0gMy4xNDE1CisgICAgICAgIHQgPSBUcnVlCisKKyAgICAgICAgZm9yIHByZWZpeCBpbiAoJycsICdAJywgJzwnLCAnPicsICc9JywgJyEnKToKKyAgICAgICAgICAgIGZvciBmb3JtYXQgaW4gKCd4Y2JoaWxmZD8nLCAneGNCSElMZmQ/Jyk6CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gcHJlZml4ICsgZm9ybWF0CisgICAgICAgICAgICAgICAgcyA9IHN0cnVjdC5wYWNrKGZvcm1hdCwgYywgYiwgaCwgaSwgbCwgZiwgZCwgdCkKKyAgICAgICAgICAgICAgICBjcCwgYnAsIGhwLCBpcCwgbHAsIGZwLCBkcCwgdHAgPSBzdHJ1Y3QudW5wYWNrKGZvcm1hdCwgcykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNwLCBjKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnAsIGIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChocCwgaCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlwLCBpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHAsIGwpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoMTAwICogZnApLCBpbnQoMTAwICogZikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoMTAwICogZHApLCBpbnQoMTAwICogZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cCwgdCkKKworICAgIGRlZiB0ZXN0X25ld19mZWF0dXJlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHNvbWUgb2YgdGhlIG5ldyBmZWF0dXJlcyBpbiBkZXRhaWwKKyAgICAgICAgIyAoZm9ybWF0LCBhcmd1bWVudCwgYmlnLWVuZGlhbiByZXN1bHQsIGxpdHRsZS1lbmRpYW4gcmVzdWx0LCBhc3ltbWV0cmljKQorICAgICAgICB0ZXN0cyA9IFsKKyAgICAgICAgICAgICgnYycsICdhJywgJ2EnLCAnYScsIDApLAorICAgICAgICAgICAgKCd4YycsICdhJywgJ1wwYScsICdcMGEnLCAwKSwKKyAgICAgICAgICAgICgnY3gnLCAnYScsICdhXDAnLCAnYVwwJywgMCksCisgICAgICAgICAgICAoJ3MnLCAnYScsICdhJywgJ2EnLCAwKSwKKyAgICAgICAgICAgICgnMHMnLCAnaGVsbG93b3JsZCcsICcnLCAnJywgMSksCisgICAgICAgICAgICAoJzFzJywgJ2hlbGxvd29ybGQnLCAnaCcsICdoJywgMSksCisgICAgICAgICAgICAoJzlzJywgJ2hlbGxvd29ybGQnLCAnaGVsbG93b3JsJywgJ2hlbGxvd29ybCcsIDEpLAorICAgICAgICAgICAgKCcxMHMnLCAnaGVsbG93b3JsZCcsICdoZWxsb3dvcmxkJywgJ2hlbGxvd29ybGQnLCAwKSwKKyAgICAgICAgICAgICgnMTFzJywgJ2hlbGxvd29ybGQnLCAnaGVsbG93b3JsZFwwJywgJ2hlbGxvd29ybGRcMCcsIDEpLAorICAgICAgICAgICAgKCcyMHMnLCAnaGVsbG93b3JsZCcsICdoZWxsb3dvcmxkJysxMConXDAnLCAnaGVsbG93b3JsZCcrMTAqJ1wwJywgMSksCisgICAgICAgICAgICAoJ2InLCA3LCAnXDcnLCAnXDcnLCAwKSwKKyAgICAgICAgICAgICgnYicsIC03LCAnXDM3MScsICdcMzcxJywgMCksCisgICAgICAgICAgICAoJ0InLCA3LCAnXDcnLCAnXDcnLCAwKSwKKyAgICAgICAgICAgICgnQicsIDI0OSwgJ1wzNzEnLCAnXDM3MScsIDApLAorICAgICAgICAgICAgKCdoJywgNzAwLCAnXDAwMlwyNzQnLCAnXDI3NFwwMDInLCAwKSwKKyAgICAgICAgICAgICgnaCcsIC03MDAsICdcMzc1RCcsICdEXDM3NScsIDApLAorICAgICAgICAgICAgKCdIJywgNzAwLCAnXDAwMlwyNzQnLCAnXDI3NFwwMDInLCAwKSwKKyAgICAgICAgICAgICgnSCcsIDB4MTAwMDAtNzAwLCAnXDM3NUQnLCAnRFwzNzUnLCAwKSwKKyAgICAgICAgICAgICgnaScsIDcwMDAwMDAwLCAnXDAwNCxcMDM1XDIwMCcsICdcMjAwXDAzNSxcMDA0JywgMCksCisgICAgICAgICAgICAoJ2knLCAtNzAwMDAwMDAsICdcMzczXDMyM1wzNDJcMjAwJywgJ1wyMDBcMzQyXDMyM1wzNzMnLCAwKSwKKyAgICAgICAgICAgICgnSScsIDcwMDAwMDAwTCwgJ1wwMDQsXDAzNVwyMDAnLCAnXDIwMFwwMzUsXDAwNCcsIDApLAorICAgICAgICAgICAgKCdJJywgMHgxMDAwMDAwMDBMLTcwMDAwMDAwLCAnXDM3M1wzMjNcMzQyXDIwMCcsICdcMjAwXDM0MlwzMjNcMzczJywgMCksCisgICAgICAgICAgICAoJ2wnLCA3MDAwMDAwMCwgJ1wwMDQsXDAzNVwyMDAnLCAnXDIwMFwwMzUsXDAwNCcsIDApLAorICAgICAgICAgICAgKCdsJywgLTcwMDAwMDAwLCAnXDM3M1wzMjNcMzQyXDIwMCcsICdcMjAwXDM0MlwzMjNcMzczJywgMCksCisgICAgICAgICAgICAoJ0wnLCA3MDAwMDAwMEwsICdcMDA0LFwwMzVcMjAwJywgJ1wyMDBcMDM1LFwwMDQnLCAwKSwKKyAgICAgICAgICAgICgnTCcsIDB4MTAwMDAwMDAwTC03MDAwMDAwMCwgJ1wzNzNcMzIzXDM0MlwyMDAnLCAnXDIwMFwzNDJcMzIzXDM3MycsIDApLAorICAgICAgICAgICAgKCdmJywgMi4wLCAnQFwwMDBcMDAwXDAwMCcsICdcMDAwXDAwMFwwMDBAJywgMCksCisgICAgICAgICAgICAoJ2QnLCAyLjAsICdAXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCcsCisgICAgICAgICAgICAgICAgICAgICAgICdcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwQCcsIDApLAorICAgICAgICAgICAgKCdmJywgLTIuMCwgJ1wzMDBcMDAwXDAwMFwwMDAnLCAnXDAwMFwwMDBcMDAwXDMwMCcsIDApLAorICAgICAgICAgICAgKCdkJywgLTIuMCwgJ1wzMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ1wwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMzAwJywgMCksCisgICAgICAgICAgICAgICAgKCc/JywgMCwgJ1wwJywgJ1wwJywgMCksCisgICAgICAgICAgICAgICAgKCc/JywgMywgJ1wxJywgJ1wxJywgMSksCisgICAgICAgICAgICAgICAgKCc/JywgVHJ1ZSwgJ1wxJywgJ1wxJywgMCksCisgICAgICAgICAgICAgICAgKCc/JywgW10sICdcMCcsICdcMCcsIDEpLAorICAgICAgICAgICAgICAgICgnPycsICgxLCksICdcMScsICdcMScsIDEpLAorICAgICAgICBdCisKKyAgICAgICAgZm9yIGZtdCwgYXJnLCBiaWcsIGxpbCwgYXN5IGluIHRlc3RzOgorICAgICAgICAgICAgZm9yICh4Zm10LCBleHApIGluIFsoJz4nK2ZtdCwgYmlnKSwgKCchJytmbXQsIGJpZyksICgnPCcrZm10LCBsaWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJz0nK2ZtdCwgSVNCSUdFTkRJQU4gYW5kIGJpZyBvciBsaWwpXToKKyAgICAgICAgICAgICAgICByZXMgPSBzdHJ1Y3QucGFjayh4Zm10LCBhcmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIGV4cCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cnVjdC5jYWxjc2l6ZSh4Zm10KSwgbGVuKHJlcykpCisgICAgICAgICAgICAgICAgcmV2ID0gc3RydWN0LnVucGFjayh4Zm10LCByZXMpWzBdCisgICAgICAgICAgICAgICAgaWYgcmV2ICE9IGFyZzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFzeSkKKworICAgIGRlZiB0ZXN0X2NhbGNzaXplKHNlbGYpOgorICAgICAgICBleHBlY3RlZF9zaXplID0geworICAgICAgICAgICAgJ2InOiAxLCAnQic6IDEsCisgICAgICAgICAgICAnaCc6IDIsICdIJzogMiwKKyAgICAgICAgICAgICdpJzogNCwgJ0knOiA0LAorICAgICAgICAgICAgJ2wnOiA0LCAnTCc6IDQsCisgICAgICAgICAgICAncSc6IDgsICdRJzogOCwKKyAgICAgICAgICAgIH0KKworICAgICAgICAjIHN0YW5kYXJkIGludGVnZXIgc2l6ZXMKKyAgICAgICAgZm9yIGNvZGUgaW4gaW50ZWdlcl9jb2RlczoKKyAgICAgICAgICAgIGZvciBieXRlb3JkZXIgaW4gKCc9JywgJzwnLCAnPicsICchJyk6CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gYnl0ZW9yZGVyK2NvZGUKKyAgICAgICAgICAgICAgICBzaXplID0gc3RydWN0LmNhbGNzaXplKGZvcm1hdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemUsIGV4cGVjdGVkX3NpemVbY29kZV0pCisKKyAgICAgICAgIyBuYXRpdmUgaW50ZWdlciBzaXplcywgZXhjZXB0ICdxJyBhbmQgJ1EnCisgICAgICAgIGZvciBmb3JtYXRfcGFpciBpbiAoJ2JCJywgJ2hIJywgJ2lJJywgJ2xMJyk6CisgICAgICAgICAgICBmb3IgYnl0ZW9yZGVyIGluIFsnJywgJ0AnXToKKyAgICAgICAgICAgICAgICBzaWduZWRfc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZShieXRlb3JkZXIgKyBmb3JtYXRfcGFpclswXSkKKyAgICAgICAgICAgICAgICB1bnNpZ25lZF9zaXplID0gc3RydWN0LmNhbGNzaXplKGJ5dGVvcmRlciArIGZvcm1hdF9wYWlyWzFdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmVkX3NpemUsIHVuc2lnbmVkX3NpemUpCisKKyAgICAgICAgIyBib3VuZHMgZm9yIG5hdGl2ZSBpbnRlZ2VyIHNpemVzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydWN0LmNhbGNzaXplKCdiJyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKDIsIHN0cnVjdC5jYWxjc2l6ZSgnaCcpKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCg0LCBzdHJ1Y3QuY2FsY3NpemUoJ2wnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoc3RydWN0LmNhbGNzaXplKCdoJyksIHN0cnVjdC5jYWxjc2l6ZSgnaScpKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChzdHJ1Y3QuY2FsY3NpemUoJ2knKSwgc3RydWN0LmNhbGNzaXplKCdsJykpCisKKyAgICAgICAgIyB0ZXN0cyBmb3IgbmF0aXZlICdxJyBhbmQgJ1EnIHdoZW4gYXBwbGljYWJsZQorICAgICAgICBpZiBIQVZFX0xPTkdfTE9ORzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydWN0LmNhbGNzaXplKCdxJyksIHN0cnVjdC5jYWxjc2l6ZSgnUScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoOCwgc3RydWN0LmNhbGNzaXplKCdxJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChzdHJ1Y3QuY2FsY3NpemUoJ2wnKSwgc3RydWN0LmNhbGNzaXplKCdxJykpCisKKyAgICBkZWYgdGVzdF9pbnRlZ2VycyhzZWxmKToKKyAgICAgICAgIyBJbnRlZ2VyIHRlc3RzIChiQmhIaUlsTHFRKS4KKyAgICAgICAgaW1wb3J0IGJpbmFzY2lpCisKKyAgICAgICAgY2xhc3MgSW50VGVzdGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb3JtYXQpOgorICAgICAgICAgICAgICAgIHN1cGVyKEludFRlc3Rlciwgc2VsZikuX19pbml0X18obWV0aG9kTmFtZT0ndGVzdF9vbmUnKQorICAgICAgICAgICAgICAgIHNlbGYuZm9ybWF0ID0gZm9ybWF0CisgICAgICAgICAgICAgICAgc2VsZi5jb2RlID0gZm9ybWF0Wy0xXQorICAgICAgICAgICAgICAgIHNlbGYuZGlyZWN0aW9uID0gZm9ybWF0WzotMV0KKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kaXJlY3Rpb24gaW4gKCcnLCAnQCcsICc9JywgJzwnLCAnPicsICchJyk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVucmVjb2duaXplZCBwYWNraW5nIGRpcmVjdGlvbjogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpcmVjdGlvbikKKyAgICAgICAgICAgICAgICBzZWxmLmJ5dGVzaXplID0gc3RydWN0LmNhbGNzaXplKGZvcm1hdCkKKyAgICAgICAgICAgICAgICBzZWxmLmJpdHNpemUgPSBzZWxmLmJ5dGVzaXplICogOAorICAgICAgICAgICAgICAgIGlmIHNlbGYuY29kZSBpbiB0dXBsZSgnYmhpbHEnKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaWduZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYubWluX3ZhbHVlID0gLSgyTCoqKHNlbGYuYml0c2l6ZS0xKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXhfdmFsdWUgPSAyTCoqKHNlbGYuYml0c2l6ZS0xKSAtIDEKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuY29kZSBpbiB0dXBsZSgnQkhJTFEnKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaWduZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBzZWxmLm1pbl92YWx1ZSA9IDAKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXhfdmFsdWUgPSAyTCoqc2VsZi5iaXRzaXplIC0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVucmVjb2duaXplZCBmb3JtYXQgY29kZTogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvZGUpCisKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmLCB4LCBwYWNrPXN0cnVjdC5wYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucGFjaz1zdHJ1Y3QudW5wYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaGV4bGlmeT1iaW5hc2NpaS51bmhleGxpZnkpOgorCisgICAgICAgICAgICAgICAgZm9ybWF0ID0gc2VsZi5mb3JtYXQKKyAgICAgICAgICAgICAgICBpZiBzZWxmLm1pbl92YWx1ZSA8PSB4IDw9IHNlbGYubWF4X3ZhbHVlOgorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxvbmcoeCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zaWduZWQgYW5kIHggPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKz0gMUwgPDwgc2VsZi5iaXRzaXplCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGV4cGVjdGVkLCAwKQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9ICcleCcgJSBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oZXhwZWN0ZWQpICYgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gIjAiICsgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB1bmhleGxpZnkoZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gKCJceDAwIiAqIChzZWxmLmJ5dGVzaXplIC0gbGVuKGV4cGVjdGVkKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuZGlyZWN0aW9uID09ICc8JyBvcgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXJlY3Rpb24gaW4gKCcnLCAnQCcsICc9JykgYW5kIG5vdCBJU0JJR0VORElBTik6CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHN0cmluZ19yZXZlcnNlKGV4cGVjdGVkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihleHBlY3RlZCksIHNlbGYuYnl0ZXNpemUpCisKKyAgICAgICAgICAgICAgICAgICAgIyBQYWNrIHdvcms/CisgICAgICAgICAgICAgICAgICAgIGdvdCA9IHBhY2soZm9ybWF0LCB4KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgICAgICAgICAgICAgIyBVbnBhY2sgd29yaz8KKyAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVkID0gdW5wYWNrKGZvcm1hdCwgZ290KVswXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHJldHJpZXZlZCkKKworICAgICAgICAgICAgICAgICAgICAjIEFkZGluZyBhbnkgYnl0ZSBzaG91bGQgY2F1c2UgYSAidG9vIGJpZyIgZXJyb3IuCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChzdHJ1Y3QuZXJyb3IsIFR5cGVFcnJvciksIHVucGFjaywgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHgwMScgKyBnb3QpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyB4IGlzIG91dCBvZiByYW5nZSAtLSB2ZXJpZnkgcGFjayByZWFsaXplcyB0aGF0LgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoT3ZlcmZsb3dFcnJvciwgVmFsdWVFcnJvciwgc3RydWN0LmVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjaywgZm9ybWF0LCB4KQorCisgICAgICAgICAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAgICAgICAgIGZyb20gcmFuZG9tIGltcG9ydCByYW5kcmFuZ2UKKworICAgICAgICAgICAgICAgICMgQ3JlYXRlIGFsbCBpbnRlcmVzdGluZyBwb3dlcnMgb2YgMi4KKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBleHAgaW4gcmFuZ2Uoc2VsZi5iaXRzaXplICsgMyk6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoMUwgPDwgZXhwKQorCisgICAgICAgICAgICAgICAgIyBBZGQgc29tZSByYW5kb20gdmFsdWVzLgorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuYml0c2l6ZSk6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IDBMCisgICAgICAgICAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKHNlbGYuYnl0ZXNpemUpOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gKHZhbCA8PCA4KSB8IHJhbmRyYW5nZSgyNTYpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQodmFsKQorCisgICAgICAgICAgICAgICAgIyBWYWx1ZXMgYWJzb3JiZWQgZnJvbSBvdGhlciB0ZXN0cworICAgICAgICAgICAgICAgIHZhbHVlcy5leHRlbmQoWzMwMCwgNzAwMDAwLCBzeXMubWF4aW50KjRdKQorCisgICAgICAgICAgICAgICAgIyBUcnkgYWxsIHRob3NlLCBhbmQgdGhlaXIgbmVnYXRpb25zLCBhbmQgKy0xIGZyb20KKyAgICAgICAgICAgICAgICAjIHRoZW0uICBOb3RlIHRoYXQgdGhpcyB0ZXN0cyBhbGwgcG93ZXItb2YtMgorICAgICAgICAgICAgICAgICMgYm91bmRhcmllcyBpbiByYW5nZSwgYW5kIGEgZmV3IG91dCBvZiByYW5nZSwgcGx1cworICAgICAgICAgICAgICAgICMgKy0oMioqbiArLSAxKS4KKyAgICAgICAgICAgICAgICBmb3IgYmFzZSBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgIGZvciB2YWwgaW4gLWJhc2UsIGJhc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaW5jciBpbiAtMSwgMCwgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gdmFsICsgaW5jcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGVzdF9vbmUoaW50KHgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGVzdF9vbmUobG9uZyh4KSkKKworICAgICAgICAgICAgICAgICMgU29tZSBlcnJvciBjYXNlcy4KKyAgICAgICAgICAgICAgICBjbGFzcyBOb3RBbkludE5TKG9iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9fbG9uZ19fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE3MjlMCisKKyAgICAgICAgICAgICAgICBjbGFzcyBOb3RBbkludE9TOgorICAgICAgICAgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA4NQorCisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2xvbmdfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTYzTAorCisgICAgICAgICAgICAgICAgIyBPYmplY3RzIHdpdGggYW4gJ19faW5kZXhfXycgbWV0aG9kIHNob3VsZCBiZSBhbGxvd2VkCisgICAgICAgICAgICAgICAgIyB0byBwYWNrIGFzIGludGVnZXJzLiAgVGhhdCBpcyBhc3N1bWluZyB0aGUgaW1wbGVtZW50ZWQKKyAgICAgICAgICAgICAgICAjICdfX2luZGV4X18nIG1ldGhvZCByZXR1cm5zIGFuZCAnaW50JyBvciAnbG9uZycuCisgICAgICAgICAgICAgICAgY2xhc3MgSW5kZXhhYmxlKG9iamVjdCk6CisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCisKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl92YWx1ZQorCisgICAgICAgICAgICAgICAgIyBJZiB0aGUgJ19faW5kZXhfXycgbWV0aG9kIHJhaXNlcyBhIHR5cGUgZXJyb3IsIHRoZW4KKyAgICAgICAgICAgICAgICAjICdfX2ludF9fJyBzaG91bGQgYmUgdXNlZCB3aXRoIGEgZGVwcmVjYXRpb24gd2FybmluZy4KKyAgICAgICAgICAgICAgICBjbGFzcyBCYWRJbmRleChvYmplY3QpOgorICAgICAgICAgICAgICAgICAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCisKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDIKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIHN0cnVjdC5lcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LnBhY2ssIHNlbGYuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIHN0cmluZyIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgc3RydWN0LmVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QucGFjaywgc2VsZi5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZHJhbmdlKQorICAgICAgICAgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvdCBub24taW50ZWdlciIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIHN0cnVjdC5lcnJvcikpOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LnBhY2soc2VsZi5mb3JtYXQsIDMrNDJqKQorCisgICAgICAgICAgICAgICAgIyBhbiBhdHRlbXB0IHRvIGNvbnZlcnQgYSBub24taW50ZWdlciAod2l0aCBhbgorICAgICAgICAgICAgICAgICMgaW1wbGljaXQgY29udmVyc2lvbiB2aWEgX19pbnRfXykgc2hvdWxkIHN1Y2NlZWQsCisgICAgICAgICAgICAgICAgIyB3aXRoIGEgRGVwcmVjYXRpb25XYXJuaW5nCisgICAgICAgICAgICAgICAgZm9yIG5vbmludCBpbiBOb3RBbkludE5TKCksIE5vdEFuSW50T1MoKSwgQmFkSW5kZXgoKToKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygoIi4qaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgZ290IG5vbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1pbnRlZ2VyIiwgRGVwcmVjYXRpb25XYXJuaW5nKSkgYXMgdzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdCA9IHN0cnVjdC5wYWNrKHNlbGYuZm9ybWF0LCBub25pbnQpCisgICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGluc3BlY3QuY3VycmVudGZyYW1lKCkuZl9saW5lbm8gLSAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwody5maWxlbmFtZSwgdGVzdG1vZF9maWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3LmxpbmVubywgbGluZW5vKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMSkKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBzdHJ1Y3QucGFjayhzZWxmLmZvcm1hdCwgaW50KG5vbmludCkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBleHBlY3RlZCkKKworICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIGxlZ2l0aW1hdGUgdmFsdWVzIGZyb20gJ19faW5kZXhfXycuCisgICAgICAgICAgICAgICAgZm9yIG9iaiBpbiAoSW5kZXhhYmxlKDApLCBJbmRleGFibGUoMTApLCBJbmRleGFibGUoMTcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4YWJsZSg0MiksIEluZGV4YWJsZSgxMDApLCBJbmRleGFibGUoMTI3KSk6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5wYWNrKGZvcm1hdCwgb2JqKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImludGVnZXIgY29kZSBwYWNrIGZhaWxlZCBvbiBvYmplY3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoICdfX2luZGV4X18nIG1ldGhvZCIpCisKKyAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBib2d1cyB2YWx1ZXMgZnJvbSAnX19pbmRleF9fJy4KKyAgICAgICAgICAgICAgICBmb3Igb2JqIGluIChJbmRleGFibGUoJ2EnKSwgSW5kZXhhYmxlKHUnYicpLCBJbmRleGFibGUoTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXhhYmxlKHsnYSc6IDF9KSwgSW5kZXhhYmxlKFsxLCAyLCAzXSkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBzdHJ1Y3QuZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QucGFjaywgc2VsZi5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaikKKworICAgICAgICBieXRlb3JkZXJzID0gJycsICdAJywgJz0nLCAnPCcsICc+JywgJyEnCisgICAgICAgIGZvciBjb2RlIGluIGludGVnZXJfY29kZXM6CisgICAgICAgICAgICBmb3IgYnl0ZW9yZGVyIGluIGJ5dGVvcmRlcnM6CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVvcmRlciBpbiAoJycsICdAJykgYW5kIGNvZGUgaW4gKCdxJywgJ1EnKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgbm90IEhBVkVfTE9OR19MT05HKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBieXRlb3JkZXIrY29kZQorICAgICAgICAgICAgICAgIHQgPSBJbnRUZXN0ZXIoZm9ybWF0KQorICAgICAgICAgICAgICAgIHQucnVuKCkKKworICAgIGRlZiB0ZXN0X3BfY29kZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHAgKCJQYXNjYWwgc3RyaW5nIikgY29kZS4KKyAgICAgICAgZm9yIGNvZGUsIGlucHV0LCBleHBlY3RlZCwgZXhwZWN0ZWRiYWNrIGluIFsKKyAgICAgICAgICAgICAgICAoJ3AnLCdhYmMnLCAnXHgwMCcsICcnKSwKKyAgICAgICAgICAgICAgICAoJzFwJywgJ2FiYycsICdceDAwJywgJycpLAorICAgICAgICAgICAgICAgICgnMnAnLCAnYWJjJywgJ1x4MDFhJywgJ2EnKSwKKyAgICAgICAgICAgICAgICAoJzNwJywgJ2FiYycsICdceDAyYWInLCAnYWInKSwKKyAgICAgICAgICAgICAgICAoJzRwJywgJ2FiYycsICdceDAzYWJjJywgJ2FiYycpLAorICAgICAgICAgICAgICAgICgnNXAnLCAnYWJjJywgJ1x4MDNhYmNceDAwJywgJ2FiYycpLAorICAgICAgICAgICAgICAgICgnNnAnLCAnYWJjJywgJ1x4MDNhYmNceDAwXHgwMCcsICdhYmMnKSwKKyAgICAgICAgICAgICAgICAoJzEwMDBwJywgJ3gnKjEwMDAsICdceGZmJyArICd4Jyo5OTksICd4JyoyNTUpXToKKyAgICAgICAgICAgIGdvdCA9IHN0cnVjdC5wYWNrKGNvZGUsIGlucHV0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQorICAgICAgICAgICAgKGdvdCwpID0gc3RydWN0LnVucGFjayhjb2RlLCBnb3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWRiYWNrKQorCisgICAgZGVmIHRlc3RfNzA1ODM2KHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyA3MDU4MzYuICAiPGYiIGFuZCAiPmYiIGhhZCBhIHNldmVyZSByb3VuZGluZyBidWcsIHdoZXJlIGEgY2FycnkKKyAgICAgICAgIyBmcm9tIHRoZSBsb3ctb3JkZXIgZGlzY2FyZGVkIGJpdHMgY291bGQgcHJvcGFnYXRlIGludG8gdGhlIGV4cG9uZW50CisgICAgICAgICMgZmllbGQsIGNhdXNpbmcgdGhlIHJlc3VsdCB0byBiZSB3cm9uZyBieSBhIGZhY3RvciBvZiAyLgorICAgICAgICBpbXBvcnQgbWF0aAorCisgICAgICAgIGZvciBiYXNlIGluIHJhbmdlKDEsIDMzKToKKyAgICAgICAgICAgICMgc21hbGxlciA8LSBsYXJnZXN0IHJlcHJlc2VudGFibGUgZmxvYXQgbGVzcyB0aGFuIGJhc2UuCisgICAgICAgICAgICBkZWx0YSA9IDAuNQorICAgICAgICAgICAgd2hpbGUgYmFzZSAtIGRlbHRhIC8gMi4wICE9IGJhc2U6CisgICAgICAgICAgICAgICAgZGVsdGEgLz0gMi4wCisgICAgICAgICAgICBzbWFsbGVyID0gYmFzZSAtIGRlbHRhCisgICAgICAgICAgICAjIFBhY2tpbmcgdGhpcyByb3VuZHMgYXdheSBhIHNvbGlkIHN0cmluZyBvZiB0cmFpbGluZyAxIGJpdHMuCisgICAgICAgICAgICBwYWNrZWQgPSBzdHJ1Y3QucGFjaygiPGYiLCBzbWFsbGVyKQorICAgICAgICAgICAgdW5wYWNrZWQgPSBzdHJ1Y3QudW5wYWNrKCI8ZiIsIHBhY2tlZClbMF0KKyAgICAgICAgICAgICMgVGhpcyBmYWlsZWQgYXQgYmFzZSA9IDIsIDQsIGFuZCAzMiwgd2l0aCB1bnBhY2tlZCA9IDEsIDIsIGFuZAorICAgICAgICAgICAgIyAxNiwgcmVzcGVjdGl2ZWx5LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLCB1bnBhY2tlZCkKKyAgICAgICAgICAgIGJpZ3BhY2tlZCA9IHN0cnVjdC5wYWNrKCI+ZiIsIHNtYWxsZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpZ3BhY2tlZCwgc3RyaW5nX3JldmVyc2UocGFja2VkKSkKKyAgICAgICAgICAgIHVucGFja2VkID0gc3RydWN0LnVucGFjaygiPmYiLCBiaWdwYWNrZWQpWzBdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2UsIHVucGFja2VkKQorCisgICAgICAgICMgTGFyZ2VzdCBmaW5pdGUgSUVFRSBzaW5nbGUuCisgICAgICAgIGJpZyA9ICgxIDw8IDI0KSAtIDEKKyAgICAgICAgYmlnID0gbWF0aC5sZGV4cChiaWcsIDEyNyAtIDIzKQorICAgICAgICBwYWNrZWQgPSBzdHJ1Y3QucGFjaygiPmYiLCBiaWcpCisgICAgICAgIHVucGFja2VkID0gc3RydWN0LnVucGFjaygiPmYiLCBwYWNrZWQpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmlnLCB1bnBhY2tlZCkKKworICAgICAgICAjIFRoZSBzYW1lLCBidXQgdGFjayBvbiBhIDEgYml0IHNvIGl0IHJvdW5kcyB1cCB0byBpbmZpbml0eS4KKyAgICAgICAgYmlnID0gKDEgPDwgMjUpIC0gMQorICAgICAgICBiaWcgPSBtYXRoLmxkZXhwKGJpZywgMTI3IC0gMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHN0cnVjdC5wYWNrLCAiPmYiLCBiaWcpCisKKyAgICBkZWYgdGVzdF8xNTMwNTU5KHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyAxNTMwNTU5LiBzdHJ1Y3QucGFjayByYWlzZXMgVHlwZUVycm9yIHdoZXJlIGl0IHVzZWQgdG8gY29udmVydC4KKyAgICAgICAgZm9yIGVuZGlhbiBpbiAoJycsICc+JywgJzwnKToKKyAgICAgICAgICAgIGZvciBmbXQgaW4gaW50ZWdlcl9jb2RlczoKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2Zsb2F0X2NvZXJjZShlbmRpYW4gKyBmbXQsIDEuMCkKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2Zsb2F0X2NvZXJjZShlbmRpYW4gKyBmbXQsIDEuNSkKKworICAgIGRlZiB0ZXN0X3VucGFja19mcm9tKHNlbGYsIGNscz1zdHIpOgorICAgICAgICBkYXRhID0gY2xzKCdhYmNkMDEyMzQnKQorICAgICAgICBmbXQgPSAnNHMnCisgICAgICAgIHMgPSBzdHJ1Y3QuU3RydWN0KGZtdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudW5wYWNrX2Zyb20oZGF0YSksICgnYWJjZCcsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJ1Y3QudW5wYWNrX2Zyb20oZm10LCBkYXRhKSwgKCdhYmNkJywpKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudW5wYWNrX2Zyb20oZGF0YSwgaSksIChkYXRhW2k6aSs0XSwpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJ1Y3QudW5wYWNrX2Zyb20oZm10LCBkYXRhLCBpKSwgKGRhdGFbaTppKzRdLCkpCisgICAgICAgIGZvciBpIGluIHhyYW5nZSg2LCBsZW4oZGF0YSkgKyAxKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHN0cnVjdC5lcnJvciwgcy51bnBhY2tfZnJvbSwgZGF0YSwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHN0cnVjdC5lcnJvciwgc3RydWN0LnVucGFja19mcm9tLCBmbXQsIGRhdGEsIGkpCisKKyAgICBkZWYgdGVzdF9wYWNrX2ludG8oc2VsZik6CisgICAgICAgIHRlc3Rfc3RyaW5nID0gJ1JleWtqYXZpayByb2NrcywgZW93IScKKyAgICAgICAgd3JpdGFibGVfYnVmID0gYXJyYXkuYXJyYXkoJ2MnLCAnICcqMTAwKQorICAgICAgICBmbXQgPSAnMjFzJworICAgICAgICBzID0gc3RydWN0LlN0cnVjdChmbXQpCisKKyAgICAgICAgIyBUZXN0IHdpdGhvdXQgb2Zmc2V0CisgICAgICAgIHMucGFja19pbnRvKHdyaXRhYmxlX2J1ZiwgMCwgdGVzdF9zdHJpbmcpCisgICAgICAgIGZyb21fYnVmID0gd3JpdGFibGVfYnVmLnRvc3RyaW5nKClbOmxlbih0ZXN0X3N0cmluZyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnJvbV9idWYsIHRlc3Rfc3RyaW5nKQorCisgICAgICAgICMgVGVzdCB3aXRoIG9mZnNldC4KKyAgICAgICAgcy5wYWNrX2ludG8od3JpdGFibGVfYnVmLCAxMCwgdGVzdF9zdHJpbmcpCisgICAgICAgIGZyb21fYnVmID0gd3JpdGFibGVfYnVmLnRvc3RyaW5nKClbOmxlbih0ZXN0X3N0cmluZykrMTBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnJvbV9idWYsIHRlc3Rfc3RyaW5nWzoxMF0gKyB0ZXN0X3N0cmluZykKKworICAgICAgICAjIEdvIGJleW9uZCBib3VuZGFyaWVzLgorICAgICAgICBzbWFsbF9idWYgPSBhcnJheS5hcnJheSgnYycsICcgJyoxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFZhbHVlRXJyb3IsIHN0cnVjdC5lcnJvciksIHMucGFja19pbnRvLCBzbWFsbF9idWYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVmFsdWVFcnJvciwgc3RydWN0LmVycm9yKSwgcy5wYWNrX2ludG8sIHNtYWxsX2J1ZiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdHJpbmcpCisKKyAgICAgICAgIyBUZXN0IGJvZ3VzIG9mZnNldCAoaXNzdWUgMzY5NCkKKyAgICAgICAgc2IgPSBzbWFsbF9idWYKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgc3RydWN0LmVycm9yKSwgc3RydWN0LnBhY2tfaW50bywgYicnLCBzYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSkKKworICAgIGRlZiB0ZXN0X3BhY2tfaW50b19mbihzZWxmKToKKyAgICAgICAgdGVzdF9zdHJpbmcgPSAnUmV5a2phdmlrIHJvY2tzLCBlb3chJworICAgICAgICB3cml0YWJsZV9idWYgPSBhcnJheS5hcnJheSgnYycsICcgJyoxMDApCisgICAgICAgIGZtdCA9ICcyMXMnCisgICAgICAgIHBhY2tfaW50byA9IGxhbWJkYSAqYXJnczogc3RydWN0LnBhY2tfaW50byhmbXQsICphcmdzKQorCisgICAgICAgICMgVGVzdCB3aXRob3V0IG9mZnNldC4KKyAgICAgICAgcGFja19pbnRvKHdyaXRhYmxlX2J1ZiwgMCwgdGVzdF9zdHJpbmcpCisgICAgICAgIGZyb21fYnVmID0gd3JpdGFibGVfYnVmLnRvc3RyaW5nKClbOmxlbih0ZXN0X3N0cmluZyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnJvbV9idWYsIHRlc3Rfc3RyaW5nKQorCisgICAgICAgICMgVGVzdCB3aXRoIG9mZnNldC4KKyAgICAgICAgcGFja19pbnRvKHdyaXRhYmxlX2J1ZiwgMTAsIHRlc3Rfc3RyaW5nKQorICAgICAgICBmcm9tX2J1ZiA9IHdyaXRhYmxlX2J1Zi50b3N0cmluZygpWzpsZW4odGVzdF9zdHJpbmcpKzEwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyb21fYnVmLCB0ZXN0X3N0cmluZ1s6MTBdICsgdGVzdF9zdHJpbmcpCisKKyAgICAgICAgIyBHbyBiZXlvbmQgYm91bmRhcmllcy4KKyAgICAgICAgc21hbGxfYnVmID0gYXJyYXkuYXJyYXkoJ2MnLCAnICcqMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChWYWx1ZUVycm9yLCBzdHJ1Y3QuZXJyb3IpLCBwYWNrX2ludG8sIHNtYWxsX2J1ZiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChWYWx1ZUVycm9yLCBzdHJ1Y3QuZXJyb3IpLCBwYWNrX2ludG8sIHNtYWxsX2J1ZiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdHJpbmcpCisKKyAgICBkZWYgdGVzdF91bnBhY2tfd2l0aF9idWZmZXIoc2VsZik6CisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygoImJ1ZmZlci4uIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgICMgU0YgYnVnIDE1NjM3NTk6IHN0cnVjdC51bnBhY2sgZG9lc24ndCBzdXBwb3J0IGJ1ZmZlciBwcm90b2NvbCBvYmplY3RzCisgICAgICAgICAgICBkYXRhMSA9IGFycmF5LmFycmF5KCdCJywgJ1x4MTJceDM0XHg1Nlx4NzgnKQorICAgICAgICAgICAgZGF0YTIgPSBidWZmZXIoJy4uLi4uLlx4MTJceDM0XHg1Nlx4NzguLi4uLi4nLCA2LCA0KQorICAgICAgICAgICAgZm9yIGRhdGEgaW4gW2RhdGExLCBkYXRhMl06CisgICAgICAgICAgICAgICAgdmFsdWUsID0gc3RydWN0LnVucGFjaygnPkknLCBkYXRhKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsIDB4MTIzNDU2NzgpCisKKyAgICAgICAgICAgIHNlbGYudGVzdF91bnBhY2tfZnJvbShjbHM9YnVmZmVyKQorCisgICAgZGVmIHRlc3RfdW5wYWNrX3dpdGhfbWVtb3J5dmlldyhzZWxmKToKKyAgICAgICAgIyBCdWcgMTAyMTI6IHN0cnVjdC51bnBhY2sgZG9lc24ndCBzdXBwb3J0IG5ldyBidWZmZXIgcHJvdG9jb2wgb2JqZWN0cworICAgICAgICBkYXRhMSA9IG1lbW9yeXZpZXcoJ1x4MTJceDM0XHg1Nlx4NzgnKQorICAgICAgICBmb3IgZGF0YSBpbiBbZGF0YTEsXToKKyAgICAgICAgICAgIHZhbHVlLCA9IHN0cnVjdC51bnBhY2soJz5JJywgZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsIDB4MTIzNDU2NzgpCisgICAgICAgIHNlbGYudGVzdF91bnBhY2tfZnJvbShjbHM9bWVtb3J5dmlldykKKworICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CisgICAgICAgIGNsYXNzIEV4cGxvZGluZ0Jvb2wob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yCisgICAgICAgIGZvciBwcmVmaXggaW4gdHVwbGUoIjw+IT0iKSsoJycsKToKKyAgICAgICAgICAgIGZhbHNlID0gKCksIFtdLCBbXSwgJycsIDAKKyAgICAgICAgICAgIHRydWUgPSBbMV0sICd0ZXN0JywgNSwgLTEsIDB4ZmZmZmZmZmZMKzEsIDB4ZmZmZmZmZmYvLzIKKworICAgICAgICAgICAgZmFsc2VGb3JtYXQgPSBwcmVmaXggKyAnPycgKiBsZW4oZmFsc2UpCisgICAgICAgICAgICBwYWNrZWRGYWxzZSA9IHN0cnVjdC5wYWNrKGZhbHNlRm9ybWF0LCAqZmFsc2UpCisgICAgICAgICAgICB1bnBhY2tlZEZhbHNlID0gc3RydWN0LnVucGFjayhmYWxzZUZvcm1hdCwgcGFja2VkRmFsc2UpCisKKyAgICAgICAgICAgIHRydWVGb3JtYXQgPSBwcmVmaXggKyAnPycgKiBsZW4odHJ1ZSkKKyAgICAgICAgICAgIHBhY2tlZFRydWUgPSBzdHJ1Y3QucGFjayh0cnVlRm9ybWF0LCAqdHJ1ZSkKKyAgICAgICAgICAgIHVucGFja2VkVHJ1ZSA9IHN0cnVjdC51bnBhY2sodHJ1ZUZvcm1hdCwgcGFja2VkVHJ1ZSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odHJ1ZSksIGxlbih1bnBhY2tlZFRydWUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZmFsc2UpLCBsZW4odW5wYWNrZWRGYWxzZSkpCisKKyAgICAgICAgICAgIGZvciB0IGluIHVucGFja2VkRmFsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0KQorICAgICAgICAgICAgZm9yIHQgaW4gdW5wYWNrZWRUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0KQorCisgICAgICAgICAgICBwYWNrZWQgPSBzdHJ1Y3QucGFjayhwcmVmaXgrJz8nLCAxKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwYWNrZWQpLCBzdHJ1Y3QuY2FsY3NpemUocHJlZml4Kyc/JykpCisKKyAgICAgICAgICAgIGlmIGxlbihwYWNrZWQpICE9IDE6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwcmVmaXgsIG1zZz0nZW5jb2RlZCBib29sIGlzIG5vdCBvbmUgYnl0ZTogJXInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlcGFja2VkKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBzdHJ1Y3QucGFjaywgcHJlZml4ICsgJz8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwbG9kaW5nQm9vbCgpKQorCisgICAgICAgIGZvciBjIGluIFtiJ1x4MDEnLCBiJ1x4N2YnLCBiJ1x4ZmYnLCBiJ1x4MGYnLCBiJ1x4ZjAnXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJ1Y3QudW5wYWNrKCc+PycsIGMpWzBdKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoSVMzMkJJVCwgIlNwZWNpZmljIHRvIDMyYml0IG1hY2hpbmVzIikKKyAgICBkZWYgdGVzdF9jcmFzaGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhNZW1vcnlFcnJvciwgc3RydWN0LnBhY2ssICIzNTc5MTM5NDFjIiwgImEiKQorCisgICAgZGVmIHRlc3RfY291bnRfb3ZlcmZsb3coc2VsZik6CisgICAgICAgIGh1Z2Vjb3VudCA9ICd7fWInLmZvcm1hdChzeXMubWF4c2l6ZSsxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzdHJ1Y3QuZXJyb3IsIHN0cnVjdC5jYWxjc2l6ZSwgaHVnZWNvdW50KQorCisgICAgICAgIGh1Z2Vjb3VudDIgPSAne31ie31IJy5mb3JtYXQoc3lzLm1heHNpemUvLzIsIHN5cy5tYXhzaXplLy8yKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzdHJ1Y3QuZXJyb3IsIHN0cnVjdC5jYWxjc2l6ZSwgaHVnZWNvdW50MikKKworICAgIGRlZiBjaGVja19zaXplb2Yoc2VsZiwgZm9ybWF0X3N0ciwgbnVtYmVyX29mX2NvZGVzKToKKyAgICAgICAgIyBUaGUgc2l6ZSBvZiAnUHlTdHJ1Y3RPYmplY3QnCisgICAgICAgIHRvdGFsc2l6ZSA9IHN1cHBvcnQuY2FsY29ianNpemUoJzVQJykKKyAgICAgICAgIyBUaGUgc2l6ZSB0YWtlbiB1cCBieSB0aGUgJ2Zvcm1hdGNvZGUnIGR5bmFtaWMgYXJyYXkKKyAgICAgICAgdG90YWxzaXplICs9IHN0cnVjdC5jYWxjc2l6ZSgnM1AnKSAqIChudW1iZXJfb2ZfY29kZXMgKyAxKQorICAgICAgICBzdXBwb3J0LmNoZWNrX3NpemVvZihzZWxmLCBzdHJ1Y3QuU3RydWN0KGZvcm1hdF9zdHIpLCB0b3RhbHNpemUpCisKKyAgICBAc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9fc2l6ZW9mX18oc2VsZik6CisgICAgICAgIGZvciBjb2RlIGluIGludGVnZXJfY29kZXM6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3NpemVvZihjb2RlLCAxKQorICAgICAgICBzZWxmLmNoZWNrX3NpemVvZignQkhJTGZkc3BQJywgOSkKKyAgICAgICAgc2VsZi5jaGVja19zaXplb2YoJ0InICogMTIzNCwgMTIzNCkKKyAgICAgICAgc2VsZi5jaGVja19zaXplb2YoJ2ZkJywgMikKKyAgICAgICAgc2VsZi5jaGVja19zaXplb2YoJ3h4eHh4eHh4eHh4eHh4JywgMCkKKyAgICAgICAgc2VsZi5jaGVja19zaXplb2YoJzEwMEgnLCAxMDApCisgICAgICAgIHNlbGYuY2hlY2tfc2l6ZW9mKCcxODdzJywgMSkKKyAgICAgICAgc2VsZi5jaGVja19zaXplb2YoJzIwcCcsIDEpCisgICAgICAgIHNlbGYuY2hlY2tfc2l6ZW9mKCcwcycsIDEpCisgICAgICAgIHNlbGYuY2hlY2tfc2l6ZW9mKCcwYycsIDApCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChTdHJ1Y3RUZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGZhYjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGZhYjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3RtZW1iZXJzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M1OGMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weQpAQCAtMCwwICsxLDEwOCBAQAorZnJvbSBfdGVzdGNhcGkgaW1wb3J0IF90ZXN0X3N0cnVjdG1lbWJlcnNUeXBlLCBcCisgICAgQ0hBUl9NQVgsIENIQVJfTUlOLCBVQ0hBUl9NQVgsIFwKKyAgICBTSFJUX01BWCwgU0hSVF9NSU4sIFVTSFJUX01BWCwgXAorICAgIElOVF9NQVgsIElOVF9NSU4sIFVJTlRfTUFYLCBcCisgICAgTE9OR19NQVgsIExPTkdfTUlOLCBVTE9OR19NQVgsIFwKKyAgICBMTE9OR19NQVgsIExMT05HX01JTiwgVUxMT05HX01BWAorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK3RzPV90ZXN0X3N0cnVjdG1lbWJlcnNUeXBlKEZhbHNlLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICA5Ljk5OTk5LCAxMC4xMDEwMTAxMDEwLCAiaGkiKQorCitjbGFzcyBSZWFkV3JpdGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgorICAgICAgICB0cy5UX0JPT0wgPSBUcnVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMuVF9CT09MLCBUcnVlKQorICAgICAgICB0cy5UX0JPT0wgPSBGYWxzZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLlRfQk9PTCwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgdHMsICdUX0JPT0wnLCAxKQorCisgICAgZGVmIHRlc3RfYnl0ZShzZWxmKToKKyAgICAgICAgdHMuVF9CWVRFID0gQ0hBUl9NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX0JZVEUsIENIQVJfTUFYKQorICAgICAgICB0cy5UX0JZVEUgPSBDSEFSX01JTgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLlRfQllURSwgQ0hBUl9NSU4pCisgICAgICAgIHRzLlRfVUJZVEUgPSBVQ0hBUl9NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX1VCWVRFLCBVQ0hBUl9NQVgpCisKKyAgICBkZWYgdGVzdF9zaG9ydChzZWxmKToKKyAgICAgICAgdHMuVF9TSE9SVCA9IFNIUlRfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMuVF9TSE9SVCwgU0hSVF9NQVgpCisgICAgICAgIHRzLlRfU0hPUlQgPSBTSFJUX01JTgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLlRfU0hPUlQsIFNIUlRfTUlOKQorICAgICAgICB0cy5UX1VTSE9SVCA9IFVTSFJUX01BWAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLlRfVVNIT1JULCBVU0hSVF9NQVgpCisKKyAgICBkZWYgdGVzdF9pbnQoc2VsZik6CisgICAgICAgIHRzLlRfSU5UID0gSU5UX01BWAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLlRfSU5ULCBJTlRfTUFYKQorICAgICAgICB0cy5UX0lOVCA9IElOVF9NSU4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX0lOVCwgSU5UX01JTikKKyAgICAgICAgdHMuVF9VSU5UID0gVUlOVF9NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX1VJTlQsIFVJTlRfTUFYKQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgdHMuVF9MT05HID0gTE9OR19NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX0xPTkcsIExPTkdfTUFYKQorICAgICAgICB0cy5UX0xPTkcgPSBMT05HX01JTgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLlRfTE9ORywgTE9OR19NSU4pCisgICAgICAgIHRzLlRfVUxPTkcgPSBVTE9OR19NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX1VMT05HLCBVTE9OR19NQVgpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHRzLCAiVF9MT05HTE9ORyIpLCAibG9uZyBsb25nIG5vdCBwcmVzZW50IikKKyAgICBkZWYgdGVzdF9sb25nbG9uZyhzZWxmKToKKyAgICAgICAgdHMuVF9MT05HTE9ORyA9IExMT05HX01BWAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLlRfTE9OR0xPTkcsIExMT05HX01BWCkKKyAgICAgICAgdHMuVF9MT05HTE9ORyA9IExMT05HX01JTgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLlRfTE9OR0xPTkcsIExMT05HX01JTikKKworICAgICAgICB0cy5UX1VMT05HTE9ORyA9IFVMTE9OR19NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX1VMT05HTE9ORywgVUxMT05HX01BWCkKKworICAgICAgICAjIyBtYWtlIHN1cmUgdGhlc2Ugd2lsbCBhY2NlcHQgYSBwbGFpbiBpbnQgYXMgd2VsbCBhcyBhIGxvbmcKKyAgICAgICAgdHMuVF9MT05HTE9ORyA9IDMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX0xPTkdMT05HLCAzKQorICAgICAgICB0cy5UX1VMT05HTE9ORyA9IDQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX1VMT05HTE9ORywgNCkKKworICAgIGRlZiB0ZXN0X2lucGxhY2Vfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLlRfU1RSSU5HX0lOUExBQ0UsICJoaSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgdHMsICJUX1NUUklOR19JTlBMQUNFIiwgInMiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlbGF0dHIsIHRzLCAiVF9TVFJJTkdfSU5QTEFDRSIpCisKKworY2xhc3MgVGVzdFdhcm5pbmdzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2J5dGVfbWF4KHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygoJycsIFJ1bnRpbWVXYXJuaW5nKSk6CisgICAgICAgICAgICB0cy5UX0JZVEUgPSBDSEFSX01BWCsxCisKKyAgICBkZWYgdGVzdF9ieXRlX21pbihzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCcnLCBSdW50aW1lV2FybmluZykpOgorICAgICAgICAgICAgdHMuVF9CWVRFID0gQ0hBUl9NSU4tMQorCisgICAgZGVmIHRlc3RfdWJ5dGVfbWF4KHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygoJycsIFJ1bnRpbWVXYXJuaW5nKSk6CisgICAgICAgICAgICB0cy5UX1VCWVRFID0gVUNIQVJfTUFYKzEKKworICAgIGRlZiB0ZXN0X3Nob3J0X21heChzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCcnLCBSdW50aW1lV2FybmluZykpOgorICAgICAgICAgICAgdHMuVF9TSE9SVCA9IFNIUlRfTUFYKzEKKworICAgIGRlZiB0ZXN0X3Nob3J0X21pbihzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCcnLCBSdW50aW1lV2FybmluZykpOgorICAgICAgICAgICAgdHMuVF9TSE9SVCA9IFNIUlRfTUlOLTEKKworICAgIGRlZiB0ZXN0X3VzaG9ydF9tYXgoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnJywgUnVudGltZVdhcm5pbmcpKToKKyAgICAgICAgICAgIHRzLlRfVVNIT1JUID0gVVNIUlRfTUFYKzEKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3RtZW1iZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ0MTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3RtZW1iZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ0MTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0c2VxLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0c2VxLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYTEyYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3RzZXEucHkKQEAgLTAsMCArMSwxMjAgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworaW1wb3J0IHRpbWUKKworY2xhc3MgU3RydWN0U2VxVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF90dXBsZShzZWxmKToKKyAgICAgICAgdCA9IHRpbWUuZ210aW1lKCkKKyAgICAgICAgYXN0dXBsZSA9IHR1cGxlKHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHQpLCBsZW4oYXN0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgYXN0dXBsZSkKKworICAgICAgICAjIENoZWNrIHRoYXQgc2xpY2luZyB3b3JrcyB0aGUgc2FtZSB3YXk7IGF0IG9uZSBwb2ludCwgc2xpY2luZyB0W2k6al0gd2l0aAorICAgICAgICAjIDAgPCBpIDwgaiBjb3VsZCBwcm9kdWNlIE5VTExzIGluIHRoZSByZXN1bHQuCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgtbGVuKHQpLCBsZW4odCkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0W2k6XSwgYXN0dXBsZVtpOl0pCisgICAgICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoLWxlbih0KSwgbGVuKHQpKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRbaTpqXSwgYXN0dXBsZVtpOmpdKQorCisgICAgICAgIGZvciBqIGluIHhyYW5nZSgtbGVuKHQpLCBsZW4odCkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0WzpqXSwgYXN0dXBsZVs6al0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdC5fX2dldGl0ZW1fXywgLWxlbih0KS0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB0Ll9fZ2V0aXRlbV9fLCBsZW4odCkpCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgtbGVuKHQpLCBsZW4odCktMSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRbaV0sIGFzdHVwbGVbaV0pCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICB0ID0gdGltZS5nbXRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcih0KSkKKyAgICAgICAgdCA9IHRpbWUuZ210aW1lKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih0KSwKKyAgICAgICAgICAgICJ0aW1lLnN0cnVjdF90aW1lKHRtX3llYXI9MTk3MCwgdG1fbW9uPTEsIHRtX21kYXk9MSwgdG1faG91cj0wLCAiCisgICAgICAgICAgICAidG1fbWluPTAsIHRtX3NlYz0wLCB0bV93ZGF5PTMsIHRtX3lkYXk9MSwgdG1faXNkc3Q9MCkiKQorCisgICAgZGVmIHRlc3RfY29uY2F0KHNlbGYpOgorICAgICAgICB0MSA9IHRpbWUuZ210aW1lKCkKKyAgICAgICAgdDIgPSB0MSArIHR1cGxlKHQxKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKHQxKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyW2ldLCB0MltpK2xlbih0MSldKQorCisgICAgZGVmIHRlc3RfcmVwZWF0KHNlbGYpOgorICAgICAgICB0MSA9IHRpbWUuZ210aW1lKCkKKyAgICAgICAgdDIgPSAzICogdDEKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbih0MSkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MltpXSwgdDJbaStsZW4odDEpXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDJbaV0sIHQyW2krMipsZW4odDEpXSkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgorICAgICAgICB0MSA9IHRpbWUuZ210aW1lKCkKKyAgICAgICAgZm9yIGl0ZW0gaW4gdDE6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGl0ZW0sIHQxKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKC00MiwgdDEpCisKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYpOgorICAgICAgICB0MSA9IHRpbWUuZ210aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHQxKSwgaGFzaCh0dXBsZSh0MSkpKQorCisgICAgZGVmIHRlc3RfY21wKHNlbGYpOgorICAgICAgICB0MSA9IHRpbWUuZ210aW1lKCkKKyAgICAgICAgdDIgPSB0eXBlKHQxKSh0MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHQxIDwgdDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHQxID4gdDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPj0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHQxICE9IHQyKSkKKworICAgIGRlZiB0ZXN0X2ZpZWxkcyhzZWxmKToKKyAgICAgICAgdCA9IHRpbWUuZ210aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odCksIHQubl9maWVsZHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5uX2ZpZWxkcywgdC5uX3NlcXVlbmNlX2ZpZWxkcyt0Lm5fdW5uYW1lZF9maWVsZHMpCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgdCA9IHRpbWUuc3RydWN0X3RpbWUKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LCAiMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LCAiMTIzIiwgZGljdD17fSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LCAiMTIzNDU2Nzg5IiwgZGljdD1Ob25lKQorCisgICAgICAgIHMgPSAiMTIzNDU2Nzg5IgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIiLmpvaW4odChzKSksIHMpCisKKyAgICBkZWYgdGVzdF9ldmlsdHVwbGUoc2VsZik6CisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgRGV2aW91cyBjb2RlIGNvdWxkIGNyYXNoIHN0cnVjdHNlcXMnIGNvbnRydWN0b3JzCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gOQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgdGltZS5zdHJ1Y3RfdGltZSwgQygpKQorCisgICAgZGVmIHRlc3RfcmVkdWNlKHNlbGYpOgorICAgICAgICB0ID0gdGltZS5nbXRpbWUoKQorICAgICAgICB4ID0gdC5fX3JlZHVjZV9fKCkKKworICAgIGRlZiB0ZXN0X2V4dGVuZGVkX2dldHNsaWNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZXh0ZW5kZWQgc2xpY2luZyBieSBjb21wYXJpbmcgd2l0aCBsaXN0IHNsaWNpbmcuCisgICAgICAgIHQgPSB0aW1lLmdtdGltZSgpCisgICAgICAgIEwgPSBsaXN0KHQpCisgICAgICAgIGluZGljZXMgPSAoMCwgTm9uZSwgMSwgMywgMTksIDMwMCwgLTEsIC0yLCAtMzEsIC0zMDApCisgICAgICAgIGZvciBzdGFydCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgZm9yIHN0b3AgaW4gaW5kaWNlczoKKyAgICAgICAgICAgICAgICAjIFNraXAgc3RlcCAwIChpbnZhbGlkKQorICAgICAgICAgICAgICAgIGZvciBzdGVwIGluIGluZGljZXNbMTpdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QodFtzdGFydDpzdG9wOnN0ZXBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMW3N0YXJ0OnN0b3A6c3RlcF0pCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFN0cnVjdFNlcVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdHNlcS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3RzZXEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNDJiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3RzZXEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdHNlcS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3RzZXEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNDJiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3RzZXEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OWQ4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CkBAIC0wLDAgKzEsMTM5NyBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBvcworaW1wb3J0IGVycm5vCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCitpbXBvcnQgcmUKK2ltcG9ydCBzeXNjb25maWcKKwordHJ5OgorICAgIGltcG9ydCByZXNvdXJjZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHJlc291cmNlID0gTm9uZQorCittc3dpbmRvd3MgPSAoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIpCisKKyMKKyMgRGVwZW5kcyBvbiB0aGUgZm9sbG93aW5nIGV4dGVybmFsIHByb2dyYW1zOiBQeXRob24KKyMKKworaWYgbXN3aW5kb3dzOgorICAgIFNFVEJJTkFSWSA9ICgnaW1wb3J0IG1zdmNydDsgbXN2Y3J0LnNldG1vZGUoc3lzLnN0ZG91dC5maWxlbm8oKSwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29zLk9fQklOQVJZKTsnKQorZWxzZToKKyAgICBTRVRCSU5BUlkgPSAnJworCisKK3RyeToKKyAgICBta3N0ZW1wID0gdGVtcGZpbGUubWtzdGVtcAorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICMgdGVtcGZpbGUubWtzdGVtcCBpcyBub3QgYXZhaWxhYmxlCisgICAgZGVmIG1rc3RlbXAoKToKKyAgICAgICAgIiIiUmVwbGFjZW1lbnQgZm9yIG1rc3RlbXAsIGNhbGxpbmcgbWt0ZW1wLiIiIgorICAgICAgICBmbmFtZSA9IHRlbXBmaWxlLm1rdGVtcCgpCisgICAgICAgIHJldHVybiBvcy5vcGVuKGZuYW1lLCBvcy5PX1JEV1J8b3MuT19DUkVBVCksIGZuYW1lCisKKworY2xhc3MgQmFzZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgVHJ5IHRvIG1pbmltaXplIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gd2UgaGF2ZSBzbyB0aGlzIHRlc3QKKyAgICAgICAgIyBkb2Vzbid0IGNyYXNoIG9uIHNvbWUgYnVpbGRib3RzIChBbHBoYXMgaW4gcGFydGljdWxhcikuCisgICAgICAgIHRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIGluc3QgaW4gc3VicHJvY2Vzcy5fYWN0aXZlOgorICAgICAgICAgICAgaW5zdC53YWl0KCkKKyAgICAgICAgc3VicHJvY2Vzcy5fY2xlYW51cCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3VicHJvY2Vzcy5fYWN0aXZlLCAic3VicHJvY2Vzcy5fYWN0aXZlIG5vdCBlbXB0eSIpCisKKyAgICBkZWYgYXNzZXJ0U3RkZXJyRXF1YWwoc2VsZiwgc3RkZXJyLCBleHBlY3RlZCwgbXNnPU5vbmUpOgorICAgICAgICAjIEluIGEgZGVidWcgYnVpbGQsIHN0dWZmIGxpa2UgIls2NTgwIHJlZnNdIiBpcyBwcmludGVkIHRvIHN0ZGVyciBhdAorICAgICAgICAjIHNodXRkb3duIHRpbWUuICBUaGF0IGZydXN0cmF0ZXMgdGVzdHMgdHJ5aW5nIHRvIGNoZWNrIHN0ZGVyciBwcm9kdWNlZAorICAgICAgICAjIGZyb20gYSBzcGF3bmVkIFB5dGhvbiBwcm9jZXNzLgorICAgICAgICBhY3R1YWwgPSByZS5zdWIociJcW1xkKyByZWZzXF1ccj9cbj8kIiwgIiIsIHN0ZGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtc2cpCisKKworY2xhc3MgUG9wZW5UZXN0RXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIFBvcGVuRXhlY3V0ZUNoaWxkUmFpc2VzKHN1YnByb2Nlc3MuUG9wZW4pOgorICAgICIiIlBvcGVuIHN1YmNsYXNzIGZvciB0ZXN0aW5nIGNsZWFudXAgb2Ygc3VicHJvY2Vzcy5QSVBFIGZpbGVoYW5kbGVzIHdoZW4KKyAgICBfZXhlY3V0ZV9jaGlsZCBmYWlscy4KKyAgICAiIiIKKyAgICBkZWYgX2V4ZWN1dGVfY2hpbGQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmFpc2UgUG9wZW5UZXN0RXhjZXB0aW9uKCJGb3JjZWQgRXhjZXB0aW9uIGZvciBUZXN0IikKKworCitjbGFzcyBQcm9jZXNzVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NhbGxfc2VxKHNlbGYpOgorICAgICAgICAjIGNhbGwoKSBmdW5jdGlvbiB3aXRoIHNlcXVlbmNlIGFyZ3VtZW50CisgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBzeXMuZXhpdCg0NykiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgNDcpCisKKyAgICBkZWYgdGVzdF9jaGVja19jYWxsX3plcm8oc2VsZik6CisgICAgICAgICMgY2hlY2tfY2FsbCgpIGZ1bmN0aW9uIHdpdGggemVybyByZXR1cm4gY29kZQorICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHN5czsgc3lzLmV4aXQoMCkiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgMCkKKworICAgIGRlZiB0ZXN0X2NoZWNrX2NhbGxfbm9uemVybyhzZWxmKToKKyAgICAgICAgIyBjaGVja19jYWxsKCkgZnVuY3Rpb24gd2l0aCBub24temVybyByZXR1cm4gY29kZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yKSBhcyBjOgorICAgICAgICAgICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBzeXM7IHN5cy5leGl0KDQ3KSJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZXhjZXB0aW9uLnJldHVybmNvZGUsIDQ3KQorCisgICAgZGVmIHRlc3RfY2hlY2tfb3V0cHV0KHNlbGYpOgorICAgICAgICAjIGNoZWNrX291dHB1dCgpIGZ1bmN0aW9uIHdpdGggemVybyByZXR1cm4gY29kZQorICAgICAgICBvdXRwdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCgKKyAgICAgICAgICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICItYyIsICJwcmludCAnQkRGTCciXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQkRGTCcsIG91dHB1dCkKKworICAgIGRlZiB0ZXN0X2NoZWNrX291dHB1dF9ub256ZXJvKHNlbGYpOgorICAgICAgICAjIGNoZWNrX2NhbGwoKSBmdW5jdGlvbiB3aXRoIG5vbi16ZXJvIHJldHVybiBjb2RlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IpIGFzIGM6CisgICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAiaW1wb3J0IHN5czsgc3lzLmV4aXQoNSkiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmV4Y2VwdGlvbi5yZXR1cm5jb2RlLCA1KQorCisgICAgZGVmIHRlc3RfY2hlY2tfb3V0cHV0X3N0ZGVycihzZWxmKToKKyAgICAgICAgIyBjaGVja19vdXRwdXQoKSBmdW5jdGlvbiBzdGRlcnIgcmVkaXJlY3RlZCB0byBzdGRvdXQKKyAgICAgICAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoCisgICAgICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAiaW1wb3J0IHN5czsgc3lzLnN0ZGVyci53cml0ZSgnQkRGTCcpIl0sCisgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorICAgICAgICBzZWxmLmFzc2VydEluKCdCREZMJywgb3V0cHV0KQorCisgICAgZGVmIHRlc3RfY2hlY2tfb3V0cHV0X3N0ZG91dF9hcmcoc2VsZik6CisgICAgICAgICMgY2hlY2tfb3V0cHV0KCkgZnVuY3Rpb24gc3RkZXJyIHJlZGlyZWN0ZWQgdG8gc3Rkb3V0CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcikgYXMgYzoKKyAgICAgICAgICAgIG91dHB1dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAorICAgICAgICAgICAgICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICItYyIsICJwcmludCAnd2lsbCBub3QgYmUgcnVuJyJdLAorICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3lzLnN0ZG91dCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRXhwZWN0ZWQgVmFsdWVFcnJvciB3aGVuIHN0ZG91dCBhcmcgc3VwcGxpZWQuIikKKyAgICAgICAgc2VsZi5hc3NlcnRJbignc3Rkb3V0JywgYy5leGNlcHRpb24uYXJnc1swXSkKKworICAgIGRlZiB0ZXN0X2NhbGxfa3dhcmdzKHNlbGYpOgorICAgICAgICAjIGNhbGwoKSBmdW5jdGlvbiB3aXRoIGtleXdvcmQgYXJncworICAgICAgICBuZXdlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBuZXdlbnZbIkZSVUlUIl0gPSAiYmFuYW5hIgorICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2FsbChbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5cywgb3M7JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5leGl0KG9zLmdldGVudigiRlJVSVQiKT09ImJhbmFuYSIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1uZXdlbnYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDEpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2FyZ3Moc2VsZik6CisgICAgICAgICMgUG9wZW4oKSBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50cyBzaG91bGQgcmFpc2UgVHlwZUVycm9yCisgICAgICAgICMgYnV0IFBvcGVuLl9fZGVsX18gc2hvdWxkIG5vdCBjb21wbGFpbiAoaXNzdWUgIzEyMDg1KQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jYXB0dXJlZF9zdGRlcnIoKSBhcyBzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdWJwcm9jZXNzLlBvcGVuLCBpbnZhbGlkX2FyZ19uYW1lPTEpCisgICAgICAgICAgICBhcmdjb3VudCA9IHN1YnByb2Nlc3MuUG9wZW4uX19pbml0X18uX19jb2RlX18uY29fYXJnY291bnQKKyAgICAgICAgICAgIHRvb19tYW55X2FyZ3MgPSBbMF0gKiAoYXJnY291bnQgKyAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdWJwcm9jZXNzLlBvcGVuLCAqdG9vX21hbnlfYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcnKQorCisgICAgZGVmIHRlc3Rfc3RkaW5fbm9uZShzZWxmKToKKyAgICAgICAgIyAuc3RkaW4gaXMgTm9uZSB3aGVuIG5vdCByZWRpcmVjdGVkCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgJ3ByaW50ICJiYW5hbmEiJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCisgICAgICAgIHAud2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRpbiwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3N0ZG91dF9ub25lKHNlbGYpOgorICAgICAgICAjIC5zdGRvdXQgaXMgTm9uZSB3aGVuIG5vdCByZWRpcmVjdGVkLCBhbmQgdGhlIGNoaWxkJ3Mgc3Rkb3V0IHdpbGwKKyAgICAgICAgIyBiZSBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50LiAgSW4gb3JkZXIgdG8gdGVzdCB0aGlzIHdlIHJ1biBhCisgICAgICAgICMgc3VicHJvY2VzcyBpbiBhIHN1YnByb2Nlc3M6CisgICAgICAgICMgdGhpc190ZXN0CisgICAgICAgICMgICBcLS0gc3VicHJvY2VzcyBjcmVhdGVkIGJ5IHRoaXMgdGVzdCAocGFyZW50KQorICAgICAgICAjICAgICAgICAgIFwtLSBzdWJwcm9jZXNzIGNyZWF0ZWQgYnkgdGhlIHBhcmVudCBzdWJwcm9jZXNzIChjaGlsZCkKKyAgICAgICAgIyBUaGUgcGFyZW50IGRvZXNuJ3Qgc3BlY2lmeSBzdGRvdXQsIHNvIHRoZSBjaGlsZCB3aWxsIHVzZSB0aGUKKyAgICAgICAgIyBwYXJlbnQncyBzdGRvdXQuICBUaGlzIHRlc3QgY2hlY2tzIHRoYXQgdGhlIG1lc3NhZ2UgcHJpbnRlZCBieSB0aGUKKyAgICAgICAgIyBjaGlsZCBnb2VzIHRvIHRoZSBwYXJlbnQgc3Rkb3V0LiAgVGhlIHBhcmVudCBhbHNvIGNoZWNrcyB0aGF0IHRoZQorICAgICAgICAjIGNoaWxkJ3Mgc3Rkb3V0IGlzIE5vbmUuICBTZWUgIzExOTYzLgorICAgICAgICBjb2RlID0gKCdpbXBvcnQgc3lzOyBmcm9tIHN1YnByb2Nlc3MgaW1wb3J0IFBvcGVuLCBQSVBFOycKKyAgICAgICAgICAgICAgICAncCA9IFBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgInByaW50IFwndGVzdF9zdGRvdXRfbm9uZVwnIl0sJworICAgICAgICAgICAgICAgICcgICAgICAgICAgc3RkaW49UElQRSwgc3RkZXJyPVBJUEUpOycKKyAgICAgICAgICAgICAgICAncC53YWl0KCk7IGFzc2VydCBwLnN0ZG91dCBpcyBOb25lOycpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgY29kZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQorICAgICAgICBvdXQsIGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucmV0dXJuY29kZSwgMCwgZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5yc3RyaXAoKSwgJ3Rlc3Rfc3Rkb3V0X25vbmUnKQorCisgICAgZGVmIHRlc3Rfc3RkZXJyX25vbmUoc2VsZik6CisgICAgICAgICMgLnN0ZGVyciBpcyBOb25lIHdoZW4gbm90IHJlZGlyZWN0ZWQKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAncHJpbnQgImJhbmFuYSInXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkaW4uY2xvc2UpCisgICAgICAgIHAud2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRlcnIsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9leGVjdXRhYmxlX3dpdGhfY3dkKHNlbGYpOgorICAgICAgICBweXRob25fZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoc3lzLmV4ZWN1dGFibGUpKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbInNvbWV0aGluZ3lvdWRvbnRoYXZlIiwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBzeXMuZXhpdCg0NykiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZT1zeXMuZXhlY3V0YWJsZSwgY3dkPXB5dGhvbl9kaXIpCisgICAgICAgIHAud2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5yZXR1cm5jb2RlLCA0NykKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpLAorICAgICAgICAgICAgICAgICAgICAgIm5lZWQgYW4gaW5zdGFsbGVkIFB5dGhvbi4gU2VlICM3Nzc0IikKKyAgICBkZWYgdGVzdF9leGVjdXRhYmxlX3dpdGhvdXRfY3dkKHNlbGYpOgorICAgICAgICAjIEZvciBhIG5vcm1hbCBpbnN0YWxsYXRpb24sIGl0IHNob3VsZCB3b3JrIHdpdGhvdXQgJ2N3ZCcKKyAgICAgICAgIyBhcmd1bWVudC4gIEZvciB0ZXN0IHJ1bnMgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSwgc2VlICM3Nzc0LgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbInNvbWV0aGluZ3lvdWRvbnRoYXZlIiwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBzeXMuZXhpdCg0NykiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZT1zeXMuZXhlY3V0YWJsZSkKKyAgICAgICAgcC53YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnJldHVybmNvZGUsIDQ3KQorCisgICAgZGVmIHRlc3Rfc3RkaW5fcGlwZShzZWxmKToKKyAgICAgICAgIyBzdGRpbiByZWRpcmVjdGlvbgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IHN5cy5leGl0KHN5cy5zdGRpbi5yZWFkKCkgPT0gInBlYXIiKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBwLnN0ZGluLndyaXRlKCJwZWFyIikKKyAgICAgICAgcC5zdGRpbi5jbG9zZSgpCisgICAgICAgIHAud2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5yZXR1cm5jb2RlLCAxKQorCisgICAgZGVmIHRlc3Rfc3RkaW5fZmlsZWRlcyhzZWxmKToKKyAgICAgICAgIyBzdGRpbiBpcyBzZXQgdG8gb3BlbiBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgdGYgPSB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCkKKyAgICAgICAgZCA9IHRmLmZpbGVubygpCisgICAgICAgIG9zLndyaXRlKGQsICJwZWFyIikKKyAgICAgICAgb3MubHNlZWsoZCwgMCwgMCkKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuZXhpdChzeXMuc3RkaW4ucmVhZCgpID09ICJwZWFyIiknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1kKQorICAgICAgICBwLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucmV0dXJuY29kZSwgMSkKKworICAgIGRlZiB0ZXN0X3N0ZGluX2ZpbGVvYmooc2VsZik6CisgICAgICAgICMgc3RkaW4gaXMgc2V0IHRvIG9wZW4gZmlsZSBvYmplY3QKKyAgICAgICAgdGYgPSB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCkKKyAgICAgICAgdGYud3JpdGUoInBlYXIiKQorICAgICAgICB0Zi5zZWVrKDApCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5czsgc3lzLmV4aXQoc3lzLnN0ZGluLnJlYWQoKSA9PSAicGVhciIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49dGYpCisgICAgICAgIHAud2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5yZXR1cm5jb2RlLCAxKQorCisgICAgZGVmIHRlc3Rfc3Rkb3V0X3BpcGUoc2VsZik6CisgICAgICAgICMgc3Rkb3V0IHJlZGlyZWN0aW9uCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IHN5cy5zdGRvdXQud3JpdGUoIm9yYW5nZSIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwgIm9yYW5nZSIpCisKKyAgICBkZWYgdGVzdF9zdGRvdXRfZmlsZWRlcyhzZWxmKToKKyAgICAgICAgIyBzdGRvdXQgaXMgc2V0IHRvIG9wZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgICAgIHRmID0gdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSgpCisgICAgICAgIGQgPSB0Zi5maWxlbm8oKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuc3Rkb3V0LndyaXRlKCJvcmFuZ2UiKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1kKQorICAgICAgICBwLndhaXQoKQorICAgICAgICBvcy5sc2VlayhkLCAwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnJlYWQoZCwgMTAyNCksICJvcmFuZ2UiKQorCisgICAgZGVmIHRlc3Rfc3Rkb3V0X2ZpbGVvYmooc2VsZik6CisgICAgICAgICMgc3Rkb3V0IGlzIHNldCB0byBvcGVuIGZpbGUgb2JqZWN0CisgICAgICAgIHRmID0gdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSgpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IHN5cy5zdGRvdXQud3JpdGUoIm9yYW5nZSIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXRmKQorICAgICAgICBwLndhaXQoKQorICAgICAgICB0Zi5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGYucmVhZCgpLCAib3JhbmdlIikKKworICAgIGRlZiB0ZXN0X3N0ZGVycl9waXBlKHNlbGYpOgorICAgICAgICAjIHN0ZGVyciByZWRpcmVjdGlvbgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuc3RkZXJyLndyaXRlKCJzdHJhd2JlcnJ5IiknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwocC5zdGRlcnIucmVhZCgpLCAic3RyYXdiZXJyeSIpCisKKyAgICBkZWYgdGVzdF9zdGRlcnJfZmlsZWRlcyhzZWxmKToKKyAgICAgICAgIyBzdGRlcnIgaXMgc2V0IHRvIG9wZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgICAgIHRmID0gdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSgpCisgICAgICAgIGQgPSB0Zi5maWxlbm8oKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuc3RkZXJyLndyaXRlKCJzdHJhd2JlcnJ5IiknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9ZCkKKyAgICAgICAgcC53YWl0KCkKKyAgICAgICAgb3MubHNlZWsoZCwgMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChvcy5yZWFkKGQsIDEwMjQpLCAic3RyYXdiZXJyeSIpCisKKyAgICBkZWYgdGVzdF9zdGRlcnJfZmlsZW9iaihzZWxmKToKKyAgICAgICAgIyBzdGRlcnIgaXMgc2V0IHRvIG9wZW4gZmlsZSBvYmplY3QKKyAgICAgICAgdGYgPSB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCkKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5czsgc3lzLnN0ZGVyci53cml0ZSgic3RyYXdiZXJyeSIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXRmKQorICAgICAgICBwLndhaXQoKQorICAgICAgICB0Zi5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwodGYucmVhZCgpLCAic3RyYXdiZXJyeSIpCisKKyAgICBkZWYgdGVzdF9zdGRvdXRfc3RkZXJyX3BpcGUoc2VsZik6CisgICAgICAgICMgY2FwdHVyZSBzdGRvdXQgYW5kIHN0ZGVyciB0byB0aGUgc2FtZSBwaXBlCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgiYXBwbGUiKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LmZsdXNoKCk7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZGVyci53cml0ZSgib3JhbmdlIiknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwgImFwcGxlb3JhbmdlIikKKworICAgIGRlZiB0ZXN0X3N0ZG91dF9zdGRlcnJfZmlsZShzZWxmKToKKyAgICAgICAgIyBjYXB0dXJlIHN0ZG91dCBhbmQgc3RkZXJyIHRvIHRoZSBzYW1lIG9wZW4gZmlsZQorICAgICAgICB0ZiA9IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQud3JpdGUoImFwcGxlIik7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC5mbHVzaCgpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRlcnIud3JpdGUoIm9yYW5nZSIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXRmLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj10ZikKKyAgICAgICAgcC53YWl0KCkKKyAgICAgICAgdGYuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHRmLnJlYWQoKSwgImFwcGxlb3JhbmdlIikKKworICAgIGRlZiB0ZXN0X3N0ZG91dF9maWxlZGVzX29mX3N0ZG91dChzZWxmKToKKyAgICAgICAgIyBzdGRvdXQgaXMgc2V0IHRvIDEgKCMxNTMxODYyKS4KKyAgICAgICAgIyBUbyBhdm9pZCBwcmludGluZyB0aGUgdGV4dCBvbiBzdGRvdXQsIHdlIGRvIHNvbWV0aGluZyBzaW1pbGFyIHRvCisgICAgICAgICMgdGVzdF9zdGRvdXRfbm9uZSAoc2VlIGFib3ZlKS4gIFRoZSBwYXJlbnQgc3VicHJvY2VzcyBjYWxscyB0aGUgY2hpbGQKKyAgICAgICAgIyBzdWJwcm9jZXNzIHBhc3Npbmcgc3Rkb3V0PTEsIGFuZCB0aGlzIHRlc3QgdXNlcyBzdGRvdXQ9UElQRSBpbgorICAgICAgICAjIG9yZGVyIHRvIGNhcHR1cmUgYW5kIGNoZWNrIHRoZSBvdXRwdXQgb2YgdGhlIHBhcmVudC4gU2VlICMxMTk2My4KKyAgICAgICAgY29kZSA9ICgnaW1wb3J0IHN5cywgc3VicHJvY2VzczsgJworICAgICAgICAgICAgICAgICdyYyA9IHN1YnByb2Nlc3MuY2FsbChbc3lzLmV4ZWN1dGFibGUsICItYyIsICcKKyAgICAgICAgICAgICAgICAnICAgICJpbXBvcnQgb3MsIHN5czsgc3lzLmV4aXQob3Mud3JpdGUoc3lzLnN0ZG91dC5maWxlbm8oKSwgJworICAgICAgICAgICAgICAgICAgICAgJ1wndGVzdCB3aXRoIHN0ZG91dD0xXCcpKSJdLCBzdGRvdXQ9MSk7ICcKKyAgICAgICAgICAgICAgICAnYXNzZXJ0IHJjID09IDE4JykKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCBjb2RlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCisgICAgICAgIG91dCwgZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5yZXR1cm5jb2RlLCAwLCBlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnJzdHJpcCgpLCAndGVzdCB3aXRoIHN0ZG91dD0xJykKKworICAgIGRlZiB0ZXN0X2N3ZChzZWxmKToKKyAgICAgICAgdG1wZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisgICAgICAgICMgV2UgY2Fubm90IHVzZSBvcy5wYXRoLnJlYWxwYXRoIHRvIGNhbm9uaWNhbGl6ZSB0aGUgcGF0aCwKKyAgICAgICAgIyBzaW5jZSBpdCBkb2Vzbid0IGV4cGFuZCBUcnU2NCB7bWVtYn0gc3RyaW5ncy4gU2VlIGJ1ZyAxMDYzNTcxLgorICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcih0bXBkaXIpCisgICAgICAgIHRtcGRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKGN3ZCkKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5cyxvczsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKG9zLmdldGN3ZCgpKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3dkPXRtcGRpcikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBub3JtY2FzZSA9IG9zLnBhdGgubm9ybWNhc2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtY2FzZShwLnN0ZG91dC5yZWFkKCkpLCBub3JtY2FzZSh0bXBkaXIpKQorCisgICAgZGVmIHRlc3RfZW52KHNlbGYpOgorICAgICAgICBuZXdlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBuZXdlbnZbIkZSVUlUIl0gPSAib3JhbmdlIgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzLG9zOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQud3JpdGUob3MuZ2V0ZW52KCJGUlVJVCIpKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW52PW5ld2VudikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKSwgIm9yYW5nZSIpCisKKyAgICBkZWYgdGVzdF9jb21tdW5pY2F0ZV9zdGRpbihzZWxmKToKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5leGl0KHN5cy5zdGRpbi5yZWFkKCkgPT0gInBlYXIiKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHAuY29tbXVuaWNhdGUoInBlYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucmV0dXJuY29kZSwgMSkKKworICAgIGRlZiB0ZXN0X2NvbW11bmljYXRlX3N0ZG91dChzZWxmKToKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IHN5cy5zdGRvdXQud3JpdGUoInBpbmVhcHBsZSIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIChzdGRvdXQsIHN0ZGVycikgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsICJwaW5lYXBwbGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZGVyciwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2NvbW11bmljYXRlX3N0ZGVycihzZWxmKToKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IHN5cy5zdGRlcnIud3JpdGUoInBpbmVhcHBsZSIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIChzdGRvdXQsIHN0ZGVycikgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwoc3RkZXJyLCAicGluZWFwcGxlIikKKworICAgIGRlZiB0ZXN0X2NvbW11bmljYXRlKHNlbGYpOgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzLG9zOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRlcnIud3JpdGUoInBpbmVhcHBsZSIpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQud3JpdGUoc3lzLnN0ZGluLnJlYWQoKSknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkaW4uY2xvc2UpCisgICAgICAgIChzdGRvdXQsIHN0ZGVycikgPSBwLmNvbW11bmljYXRlKCJiYW5hbmEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dCwgImJhbmFuYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwoc3RkZXJyLCAicGluZWFwcGxlIikKKworICAgICMgVGhpcyB0ZXN0IGlzIExpbnV4IHNwZWNpZmljIGZvciBzaW1wbGljaXR5IHRvIGF0IGxlYXN0IGhhdmUKKyAgICAjIHNvbWUgY292ZXJhZ2UuICBJdCBpcyBub3QgYSBwbGF0Zm9ybSBzcGVjaWZpYyBidWcuCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MucGF0aC5pc2RpcignL3Byb2MvJWQvZmQnICUgb3MuZ2V0cGlkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJMaW51eCBzcGVjaWZpYyIpCisgICAgIyBUZXN0IGZvciB0aGUgZmQgbGVhayByZXBvcnRlZCBpbiBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjc5MS4KKyAgICBkZWYgdGVzdF9jb21tdW5pY2F0ZV9waXBlX2ZkX2xlYWsoc2VsZik6CisgICAgICAgIGZkX2RpcmVjdG9yeSA9ICcvcHJvYy8lZC9mZCcgJSBvcy5nZXRwaWQoKQorICAgICAgICBudW1fZmRzX2JlZm9yZV9wb3BlbiA9IGxlbihvcy5saXN0ZGlyKGZkX2RpcmVjdG9yeSkpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgInByaW50KCkiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIG51bV9mZHNfYWZ0ZXJfY29tbXVuaWNhdGUgPSBsZW4ob3MubGlzdGRpcihmZF9kaXJlY3RvcnkpKQorICAgICAgICBkZWwgcAorICAgICAgICBudW1fZmRzX2FmdGVyX2Rlc3RydWN0aW9uID0gbGVuKG9zLmxpc3RkaXIoZmRfZGlyZWN0b3J5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW1fZmRzX2JlZm9yZV9wb3BlbiwgbnVtX2Zkc19hZnRlcl9kZXN0cnVjdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW1fZmRzX2JlZm9yZV9wb3BlbiwgbnVtX2Zkc19hZnRlcl9jb21tdW5pY2F0ZSkKKworICAgIGRlZiB0ZXN0X2NvbW11bmljYXRlX3JldHVybnMoc2VsZik6CisgICAgICAgICMgY29tbXVuaWNhdGUoKSBzaG91bGQgcmV0dXJuIE5vbmUgaWYgbm8gcmVkaXJlY3Rpb24gaXMgYWN0aXZlCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBzeXMuZXhpdCg0NykiXSkKKyAgICAgICAgKHN0ZG91dCwgc3RkZXJyKSA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRlcnIsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9jb21tdW5pY2F0ZV9waXBlX2J1ZihzZWxmKToKKyAgICAgICAgIyBjb21tdW5pY2F0ZSgpIHdpdGggd3JpdGVzIGxhcmdlciB0aGFuIHBpcGVfYnVmCisgICAgICAgICMgVGhpcyB0ZXN0IHdpbGwgcHJvYmFibHkgZGVhZGxvY2sgcmF0aGVyIHRoYW4gZmFpbCwgaWYKKyAgICAgICAgIyBjb21tdW5pY2F0ZSgpIGRvZXMgbm90IHdvcmsgcHJvcGVybHkuCisgICAgICAgIHgsIHkgPSBvcy5waXBlKCkKKyAgICAgICAgaWYgbXN3aW5kb3dzOgorICAgICAgICAgICAgcGlwZV9idWYgPSA1MTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBpcGVfYnVmID0gb3MuZnBhdGhjb25mKHgsICJQQ19QSVBFX0JVRiIpCisgICAgICAgIG9zLmNsb3NlKHgpCisgICAgICAgIG9zLmNsb3NlKHkpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXMsb3M7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZShzeXMuc3RkaW4ucmVhZCg0NykpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRlcnIud3JpdGUoInh5eiIqJWQpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQud3JpdGUoc3lzLnN0ZGluLnJlYWQoKSknICUgcGlwZV9idWZdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRpbi5jbG9zZSkKKyAgICAgICAgc3RyaW5nX3RvX3dyaXRlID0gImFiYyIqcGlwZV9idWYKKyAgICAgICAgKHN0ZG91dCwgc3RkZXJyKSA9IHAuY29tbXVuaWNhdGUoc3RyaW5nX3RvX3dyaXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dCwgc3RyaW5nX3RvX3dyaXRlKQorCisgICAgZGVmIHRlc3Rfd3JpdGVzX2JlZm9yZV9jb21tdW5pY2F0ZShzZWxmKToKKyAgICAgICAgIyBzdGRpbi53cml0ZSBiZWZvcmUgY29tbXVuaWNhdGUoKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzLG9zOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQud3JpdGUoc3lzLnN0ZGluLnJlYWQoKSknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkaW4uY2xvc2UpCisgICAgICAgIHAuc3RkaW4ud3JpdGUoImJhbmFuYSIpCisgICAgICAgIChzdGRvdXQsIHN0ZGVycikgPSBwLmNvbW11bmljYXRlKCJzcGxpdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LCAiYmFuYW5hc3BsaXQiKQorICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyciwgIiIpCisKKyAgICBkZWYgdGVzdF91bml2ZXJzYWxfbmV3bGluZXMoc2VsZik6CisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXMsb3M7JyArIFNFVEJJTkFSWSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJsaW5lMVxcbiIpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJsaW5lMlxcciIpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJsaW5lM1xcclxcbiIpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJsaW5lNFxcciIpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJcXG5saW5lNSIpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJcXG5saW5lNiIpOyddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPTEpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc3Rkb3V0ID0gcC5zdGRvdXQucmVhZCgpCisgICAgICAgIGlmIGhhc2F0dHIoZmlsZSwgJ25ld2xpbmVzJyk6CisgICAgICAgICAgICAjIEludGVycHJldGVyIHdpdGggdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lMVxubGluZTJcbmxpbmUzXG5saW5lNFxubGluZTVcbmxpbmU2IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgSW50ZXJwcmV0ZXIgd2l0aG91dCB1bml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUxXG5saW5lMlxybGluZTNcclxubGluZTRcclxubGluZTVcbmxpbmU2IikKKworICAgIGRlZiB0ZXN0X3VuaXZlcnNhbF9uZXdsaW5lc19jb21tdW5pY2F0ZShzZWxmKToKKyAgICAgICAgIyB1bml2ZXJzYWwgbmV3bGluZXMgdGhyb3VnaCBjb21tdW5pY2F0ZSgpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXMsb3M7JyArIFNFVEJJTkFSWSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJsaW5lMVxcbiIpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJsaW5lMlxcciIpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJsaW5lM1xcclxcbiIpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJsaW5lNFxcciIpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJcXG5saW5lNSIpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJcXG5saW5lNiIpOyddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPTEpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQorICAgICAgICAoc3Rkb3V0LCBzdGRlcnIpID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIGlmIGhhc2F0dHIoZmlsZSwgJ25ld2xpbmVzJyk6CisgICAgICAgICAgICAjIEludGVycHJldGVyIHdpdGggdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lMVxubGluZTJcbmxpbmUzXG5saW5lNFxubGluZTVcbmxpbmU2IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgSW50ZXJwcmV0ZXIgd2l0aG91dCB1bml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUxXG5saW5lMlxybGluZTNcclxubGluZTRcclxubGluZTVcbmxpbmU2IikKKworICAgIGRlZiB0ZXN0X25vX2xlYWtpbmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHdlIGxlYWsgbm8gcmVzb3VyY2VzCisgICAgICAgIGlmIG5vdCBtc3dpbmRvd3M6CisgICAgICAgICAgICBtYXhfaGFuZGxlcyA9IDEwMjYgIyB0b28gbXVjaCBmb3IgbW9zdCBVTklYIHN5c3RlbXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1heF9oYW5kbGVzID0gMjA1MCAjIHRvbyBtdWNoIGZvciAoYXQgbGVhc3Qgc29tZSkgV2luZG93cyBzZXR1cHMKKyAgICAgICAgaGFuZGxlcyA9IFtdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG1heF9oYW5kbGVzKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMuYXBwZW5kKG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX1dST05MWSB8IG9zLk9fQ1JFQVQpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRU1GSUxFOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiZmFpbGVkIHRvIHJlYWNoIHRoZSBmaWxlIGRlc2NyaXB0b3IgbGltaXQgIgorICAgICAgICAgICAgICAgICAgICAiKHRyaWVkICVkKSIgJSBtYXhfaGFuZGxlcykKKyAgICAgICAgICAgICMgQ2xvc2UgYSBjb3VwbGUgb2YgdGhlbSAoc2hvdWxkIGJlIGVub3VnaCBmb3IgYSBzdWJwcm9jZXNzKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgICAgIG9zLmNsb3NlKGhhbmRsZXMucG9wKCkpCisgICAgICAgICAgICAjIExvb3AgY3JlYXRpbmcgc29tZSBzdWJwcm9jZXNzZXMuIElmIG9uZSBvZiB0aGVtIGxlYWtzIHNvbWUgZmRzLAorICAgICAgICAgICAgIyB0aGUgbmV4dCBsb29wIGl0ZXJhdGlvbiB3aWxsIGZhaWwgYnkgcmVhY2hpbmcgdGhlIG1heCBmZCBsaW1pdC4KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDE1KToKKyAgICAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5cy5zdGRvdXQud3JpdGUoc3lzLnN0ZGluLnJlYWQoKSkiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAgICAgICAgIGRhdGEgPSBwLmNvbW11bmljYXRlKGIibGltZSIpWzBdCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBiImxpbWUiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm9yIGggaW4gaGFuZGxlczoKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShoKQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfbGlzdDJjbWRsaW5lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKFsnYSBiIGMnLCAnZCcsICdlJ10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICciYSBiIGMiIGQgZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoWydhYiJjJywgJ1xcJywgJ2QnXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FiXFwiYyBcXCBkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWJwcm9jZXNzLmxpc3QyY21kbGluZShbJ2FiImMnLCAnIFxcJywgJ2QnXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FiXFwiYyAiIFxcXFwiIGQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKFsnYVxcXFxcXGInLCAnZGUgZmcnLCAnaCddKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYVxcXFxcXGIgImRlIGZnIiBoJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWJwcm9jZXNzLmxpc3QyY21kbGluZShbJ2FcXCJiJywgJ2MnLCAnZCddKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYVxcXFxcXCJiIGMgZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoWydhXFxcXGIgYycsICdkJywgJ2UnXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJyJhXFxcXGIgYyIgZCBlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWJwcm9jZXNzLmxpc3QyY21kbGluZShbJ2FcXFxcYlxcIGMnLCAnZCcsICdlJ10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICciYVxcXFxiXFwgYyIgZCBlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWJwcm9jZXNzLmxpc3QyY21kbGluZShbJ2FiJywgJyddKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYWIgIiInKQorCisKKyAgICBkZWYgdGVzdF9wb2xsKHNlbGYpOgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICItYyIsICJpbXBvcnQgdGltZTsgdGltZS5zbGVlcCgxKSJdKQorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgd2hpbGUgcC5wb2xsKCkgaXMgTm9uZToKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAjIFdlIGV4cGVjdCB0aGF0IHRoZSBwb2xsIGxvb3AgcHJvYmFibHkgd2VudCBhcm91bmQgYWJvdXQgMTAgdGltZXMsCisgICAgICAgICMgYnV0LCBiYXNlZCBvbiBzeXN0ZW0gc2NoZWR1bGluZyB3ZSBjYW4ndCBjb250cm9sLCBpdCdzIHBvc3NpYmxlCisgICAgICAgICMgcG9sbCgpIG5ldmVyIHJldHVybmVkIE5vbmUuICBJdCAic2hvdWxkIGJlIiB2ZXJ5IHJhcmUgdGhhdCBpdAorICAgICAgICAjIGRpZG4ndCBnbyBhcm91bmQgYXQgbGVhc3QgdHdpY2UuCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGNvdW50LCAyKQorICAgICAgICAjIFN1YnNlcXVlbnQgaW52b2NhdGlvbnMgc2hvdWxkIGp1c3QgcmV0dXJuIHRoZSByZXR1cm5jb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb2xsKCksIDApCisKKworICAgIGRlZiB0ZXN0X3dhaXQoc2VsZik6CisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi1jIiwgImltcG9ydCB0aW1lOyB0aW1lLnNsZWVwKDIpIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC53YWl0KCksIDApCisgICAgICAgICMgU3Vic2VxdWVudCBpbnZvY2F0aW9ucyBzaG91bGQganVzdCByZXR1cm4gdGhlIHJldHVybmNvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLndhaXQoKSwgMCkKKworCisgICAgZGVmIHRlc3RfaW52YWxpZF9idWZzaXplKHNlbGYpOgorICAgICAgICAjIGFuIGludmFsaWQgdHlwZSBvZiB0aGUgYnVmc2l6ZSBhcmd1bWVudCBzaG91bGQgcmFpc2UKKyAgICAgICAgIyBUeXBlRXJyb3IuCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAicGFzcyJdLCAib3JhbmdlIikKKworICAgIGRlZiB0ZXN0X2xlYWtpbmdfZmRzX29uX2Vycm9yKHNlbGYpOgorICAgICAgICAjIHNlZSBidWcgIzUxNzk6IFBvcGVuIGxlYWtzIGZpbGUgZGVzY3JpcHRvcnMgdG8gUElQRXMgaWYKKyAgICAgICAgIyB0aGUgY2hpbGQgZmFpbHMgdG8gZXhlY3V0ZTsgdGhpcyB3aWxsIGV2ZW50dWFsbHkgZXhoYXVzdAorICAgICAgICAjIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvcGVuIGZkcy4gMTAyNCBzZWVtcyBhIHZlcnkgY29tbW9uCisgICAgICAgICMgdmFsdWUgZm9yIHRoYXQgbGltaXQsIGJ1dCBXaW5kb3dzIGhhcyAyMDQ4LCBzbyB3ZSBsb29wCisgICAgICAgICMgMTAyNCB0aW1lcyAoZWFjaCBjYWxsIGxlYWtlZCB0d28gZmRzKS4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAyNCk6CisgICAgICAgICAgICAjIFdpbmRvd3MgcmFpc2VzIElPRXJyb3IuICBPdGhlcnMgcmFpc2UgT1NFcnJvci4KKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoRW52aXJvbm1lbnRFcnJvcikgYXMgYzoKKyAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLlBvcGVuKFsnbm9uZXhpc3RpbmdfaV9ob3BlJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgICAgICMgaWdub3JlIGVycm9ycyB0aGF0IGluZGljYXRlIHRoZSBjb21tYW5kIHdhcyBub3QgZm91bmQKKyAgICAgICAgICAgIGlmIGMuZXhjZXB0aW9uLmVycm5vIG5vdCBpbiAoZXJybm8uRU5PRU5ULCBlcnJuby5FQUNDRVMpOgorICAgICAgICAgICAgICAgIHJhaXNlIGMuZXhjZXB0aW9uCisKKyAgICBkZWYgdGVzdF9oYW5kbGVzX2Nsb3NlZF9vbl9leGNlcHRpb24oc2VsZik6CisgICAgICAgICMgSWYgQ3JlYXRlUHJvY2VzcyBleGl0cyB3aXRoIGFuIGVycm9yLCBlbnN1cmUgdGhlCisgICAgICAgICMgZHVwbGljYXRlIG91dHB1dCBoYW5kbGVzIGFyZSByZWxlYXNlZAorICAgICAgICBpZmhhbmRsZSwgaWZuYW1lID0gbWtzdGVtcCgpCisgICAgICAgIG9maGFuZGxlLCBvZm5hbWUgPSBta3N0ZW1wKCkKKyAgICAgICAgZWZoYW5kbGUsIGVmbmFtZSA9IG1rc3RlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdWJwcm9jZXNzLlBvcGVuIChbIioiXSwgc3RkaW49aWZoYW5kbGUsIHN0ZG91dD1vZmhhbmRsZSwKKyAgICAgICAgICAgICAgc3RkZXJyPWVmaGFuZGxlKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIG9zLmNsb3NlKGlmaGFuZGxlKQorICAgICAgICAgICAgb3MucmVtb3ZlKGlmbmFtZSkKKyAgICAgICAgICAgIG9zLmNsb3NlKG9maGFuZGxlKQorICAgICAgICAgICAgb3MucmVtb3ZlKG9mbmFtZSkKKyAgICAgICAgICAgIG9zLmNsb3NlKGVmaGFuZGxlKQorICAgICAgICAgICAgb3MucmVtb3ZlKGVmbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhpZm5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKG9mbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoZWZuYW1lKSkKKworICAgIGRlZiB0ZXN0X2NvbW11bmljYXRlX2VwaXBlKHNlbGYpOgorICAgICAgICAjIElzc3VlIDEwOTYzOiBjb21tdW5pY2F0ZSgpIHNob3VsZCBoaWRlIEVQSVBFCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgJ3Bhc3MnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkaW4uY2xvc2UpCisgICAgICAgIHAuY29tbXVuaWNhdGUoIngiICogMioqMjApCisKKyAgICBkZWYgdGVzdF9jb21tdW5pY2F0ZV9lcGlwZV9vbmx5X3N0ZGluKHNlbGYpOgorICAgICAgICAjIElzc3VlIDEwOTYzOiBjb21tdW5pY2F0ZSgpIHNob3VsZCBoaWRlIEVQSVBFCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgJ3Bhc3MnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRpbi5jbG9zZSkKKyAgICAgICAgdGltZS5zbGVlcCgyKQorICAgICAgICBwLmNvbW11bmljYXRlKCJ4IiAqIDIqKjIwKQorCisgICAgIyBUaGlzIHRlc3QgaXMgTGludXgtaXNoIHNwZWNpZmljIGZvciBzaW1wbGljaXR5IHRvIGF0IGxlYXN0IGhhdmUKKyAgICAjIHNvbWUgY292ZXJhZ2UuICBJdCBpcyBub3QgYSBwbGF0Zm9ybSBzcGVjaWZpYyBidWcuCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MucGF0aC5pc2RpcignL3Byb2MvJWQvZmQnICUgb3MuZ2V0cGlkKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJMaW51eCBzcGVjaWZpYyIpCisgICAgZGVmIHRlc3RfZmFpbGVkX2NoaWxkX2V4ZWN1dGVfZmRfbGVhayhzZWxmKToKKyAgICAgICAgIiIiVGVzdCBmb3IgdGhlIGZvcmsoKSBmYWlsdXJlIGZkIGxlYWsgcmVwb3J0ZWQgaW4gaXNzdWUxNjMyNy4iIiIKKyAgICAgICAgZmRfZGlyZWN0b3J5ID0gJy9wcm9jLyVkL2ZkJyAlIG9zLmdldHBpZCgpCisgICAgICAgIGZkc19iZWZvcmVfcG9wZW4gPSBvcy5saXN0ZGlyKGZkX2RpcmVjdG9yeSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhQb3BlblRlc3RFeGNlcHRpb24pOgorICAgICAgICAgICAgUG9wZW5FeGVjdXRlQ2hpbGRSYWlzZXMoCisgICAgICAgICAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgJ3Bhc3MnXSwgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorCisgICAgICAgICMgTk9URTogVGhpcyB0ZXN0IGRvZXNuJ3QgdmVyaWZ5IHRoYXQgdGhlIHJlYWwgX2V4ZWN1dGVfY2hpbGQKKyAgICAgICAgIyBkb2VzIG5vdCBjbG9zZSB0aGUgZmlsZSBkZXNjcmlwdG9ycyBpdHNlbGYgb24gdGhlIHdheSBvdXQKKyAgICAgICAgIyBkdXJpbmcgYW4gZXhjZXB0aW9uLiAgQ29kZSBpbnNwZWN0aW9uIGhhcyBjb25maXJtZWQgdGhhdC4KKworICAgICAgICBmZHNfYWZ0ZXJfZXhjZXB0aW9uID0gb3MubGlzdGRpcihmZF9kaXJlY3RvcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmRzX2JlZm9yZV9wb3BlbiwgZmRzX2FmdGVyX2V4Y2VwdGlvbikKKworCisjIGNvbnRleHQgbWFuYWdlcgorY2xhc3MgX1N1cHByZXNzQ29yZUZpbGVzKG9iamVjdCk6CisgICAgIiIiVHJ5IHRvIHByZXZlbnQgY29yZSBmaWxlcyBmcm9tIGJlaW5nIGNyZWF0ZWQuIiIiCisgICAgb2xkX2xpbWl0ID0gTm9uZQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgIiIiVHJ5IHRvIHNhdmUgcHJldmlvdXMgdWxpbWl0LCB0aGVuIHNldCBpdCB0byAoMCwgMCkuIiIiCisgICAgICAgIGlmIHJlc291cmNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYub2xkX2xpbWl0ID0gcmVzb3VyY2UuZ2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9DT1JFKQorICAgICAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfQ09SRSwgKDAsIDApKQorICAgICAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCByZXNvdXJjZS5lcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlICdDcmFzaCBSZXBvcnRlcicgb24gT1NYIHdhcyBjb25maWd1cmVkCisgICAgICAgICAgICAjIGluICdEZXZlbG9wZXInIG1vZGUgYW5kIHdhcm4gdGhhdCBpdCB3aWxsIGdldCB0cmlnZ2VyZWQKKyAgICAgICAgICAgICMgd2hlbiBpdCBpcy4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhpcyBhc3N1bWVzIHRoYXQgdGhpcyBjb250ZXh0IG1hbmFnZXIgaXMgdXNlZCBpbiB0ZXN0cworICAgICAgICAgICAgIyB0aGF0IG1pZ2h0IHRyaWdnZXIgdGhlIG5leHQgbWFuYWdlci4KKyAgICAgICAgICAgIHZhbHVlID0gc3VicHJvY2Vzcy5Qb3BlbihbJy91c3IvYmluL2RlZmF1bHRzJywgJ3JlYWQnLAorICAgICAgICAgICAgICAgICAgICAnY29tLmFwcGxlLkNyYXNoUmVwb3J0ZXInLCAnRGlhbG9nVHlwZSddLAorICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpWzBdCisgICAgICAgICAgICBpZiB2YWx1ZS5zdHJpcCgpID09IGInZGV2ZWxvcGVyJzoKKyAgICAgICAgICAgICAgICBwcmludCAidGhpcyB0ZXN0cyB0cmlnZ2VycyB0aGUgQ3Jhc2ggUmVwb3J0ZXIsIHRoYXQgaXMgaW50ZW50aW9uYWwiCisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJSZXR1cm4gY29yZSBmaWxlIGJlaGF2aW9yIHRvIGRlZmF1bHQuIiIiCisgICAgICAgIGlmIHNlbGYub2xkX2xpbWl0IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgcmVzb3VyY2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9DT1JFLCBzZWxmLm9sZF9saW1pdCkKKyAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgcmVzb3VyY2UuZXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoc2lnbmFsLCAnU0lHQUxSTScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJSZXF1aXJlcyBzaWduYWwuU0lHQUxSTSIpCisgICAgZGVmIHRlc3RfY29tbXVuaWNhdGVfZWludHIoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEyNDkzOiBjb21tdW5pY2F0ZSgpIHNob3VsZCBoYW5kbGUgRUlOVFIKKyAgICAgICAgZGVmIGhhbmRsZXIoc2lnbnVtLCBmcmFtZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG9sZF9oYW5kbGVyID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgaGFuZGxlcikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNpZ25hbC5zaWduYWwsIHNpZ25hbC5TSUdBTFJNLCBvbGRfaGFuZGxlcikKKworICAgICAgICAjIHRoZSBwcm9jZXNzIGlzIHJ1bm5pbmcgZm9yIDIgc2Vjb25kcworICAgICAgICBhcmdzID0gW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAnaW1wb3J0IHRpbWU7IHRpbWUuc2xlZXAoMiknXQorICAgICAgICBmb3Igc3RyZWFtIGluICgnc3Rkb3V0JywgJ3N0ZGVycicpOgorICAgICAgICAgICAga3cgPSB7c3RyZWFtOiBzdWJwcm9jZXNzLlBJUEV9CisgICAgICAgICAgICB3aXRoIHN1YnByb2Nlc3MuUG9wZW4oYXJncywgKiprdykgYXMgcHJvY2VzczoKKyAgICAgICAgICAgICAgICBzaWduYWwuYWxhcm0oMSkKKyAgICAgICAgICAgICAgICAjIGNvbW11bmljYXRlKCkgd2lsbCBiZSBpbnRlcnJ1cHRlZCBieSBTSUdBTFJNCisgICAgICAgICAgICAgICAgcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisKKworQHVuaXR0ZXN0LnNraXBJZihtc3dpbmRvd3MsICJQT1NJWCBzcGVjaWZpYyB0ZXN0cyIpCitjbGFzcyBQT1NJWFByb2Nlc3NUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgIyBjYXVnaHQgJiByZS1yYWlzZWQgZXhjZXB0aW9ucworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IpIGFzIGM6CisgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICIiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD0iL3RoaXMvcGF0aC9kb2VzL25vdC9leGlzdCIpCisgICAgICAgICMgVGhlIGF0dHJpYnV0ZSBjaGlsZF90cmFjZWJhY2sgc2hvdWxkIGNvbnRhaW4gIm9zLmNoZGlyIiBzb21ld2hlcmUuCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm9zLmNoZGlyIiwgYy5leGNlcHRpb24uY2hpbGRfdHJhY2ViYWNrKQorCisgICAgZGVmIHRlc3RfcnVuX2Fib3J0KHNlbGYpOgorICAgICAgICAjIHJldHVybmNvZGUgaGFuZGxlcyBzaWduYWwgdGVybWluYXRpb24KKyAgICAgICAgd2l0aCBfU3VwcHJlc3NDb3JlRmlsZXMoKToKKyAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IG9zOyBvcy5hYm9ydCgpIl0pCisgICAgICAgICAgICBwLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC1wLnJldHVybmNvZGUsIHNpZ25hbC5TSUdBQlJUKQorCisgICAgZGVmIHRlc3RfcHJlZXhlYyhzZWxmKToKKyAgICAgICAgIyBwcmVleGVjIGZ1bmN0aW9uCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzLCBvczsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzLnN0ZG91dC53cml0ZShvcy5nZXRlbnYoJ0ZSVUlUJykpIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWV4ZWNfZm49bGFtYmRhOiBvcy5wdXRlbnYoIkZSVUlUIiwgImFwcGxlIikpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCksICJhcHBsZSIpCisKKyAgICBjbGFzcyBfVGVzdEV4ZWN1dGVDaGlsZFBvcGVuKHN1YnByb2Nlc3MuUG9wZW4pOgorICAgICAgICAiIiJVc2VkIHRvIHRlc3QgYmVoYXZpb3IgYXQgdGhlIGVuZCBvZiBfZXhlY3V0ZV9jaGlsZC4iIiIKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RjYXNlLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgc2VsZi5fdGVzdGNhc2UgPSB0ZXN0Y2FzZQorICAgICAgICAgICAgc3VicHJvY2Vzcy5Qb3Blbi5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgZGVmIF9leGVjdXRlX2NoaWxkKAorICAgICAgICAgICAgICAgIHNlbGYsIGFyZ3MsIGV4ZWN1dGFibGUsIHByZWV4ZWNfZm4sIGNsb3NlX2ZkcywgY3dkLCBlbnYsCisgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzLCBzdGFydHVwaW5mbywgY3JlYXRpb25mbGFncywgc2hlbGwsCisgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCisgICAgICAgICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MuUG9wZW4uX2V4ZWN1dGVfY2hpbGQoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBhcmdzLCBleGVjdXRhYmxlLCBwcmVleGVjX2ZuLCBjbG9zZV9mZHMsCisgICAgICAgICAgICAgICAgICAgICAgICBjd2QsIGVudiwgdW5pdmVyc2FsX25ld2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8sIGNyZWF0aW9uZmxhZ3MsIHNoZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAjIE9wZW4gYSBidW5jaCBvZiBmaWxlIGRlc2NyaXB0b3JzIGFuZCB2ZXJpZnkgdGhhdAorICAgICAgICAgICAgICAgICMgbm9uZSBvZiB0aGVtIGFyZSB0aGUgc2FtZSBhcyB0aGUgb25lcyB0aGUgUG9wZW4KKyAgICAgICAgICAgICAgICAjIGluc3RhbmNlIGlzIHVzaW5nIGZvciBzdGRpbi9zdGRvdXQvc3RkZXJyLgorICAgICAgICAgICAgICAgIGRldnplcm9fZmRzID0gW29zLm9wZW4oIi9kZXYvemVybyIsIG9zLk9fUkRPTkxZKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKDgpXQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGZkIGluIGRldnplcm9fZmRzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVzdGNhc2UuYXNzZXJ0Tm90SW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLCAocDJjd3JpdGUsIGMycHJlYWQsIGVycnJlYWQpKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIG1hcChvcy5jbG9zZSwgZGV2emVyb19mZHMpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKG5vdCBvcy5wYXRoLmV4aXN0cygiL2Rldi96ZXJvIiksICIvZGV2L3plcm8gcmVxdWlyZWQuIikKKyAgICBkZWYgdGVzdF9wcmVleGVjX2VycnBpcGVfZG9lc19ub3RfZG91YmxlX2Nsb3NlX3BpcGVzKHNlbGYpOgorICAgICAgICAiIiJJc3N1ZTE2MTQwOiBEb24ndCBkb3VibGUgY2xvc2UgcGlwZXMgb24gcHJlZXhlYyBlcnJvci4iIiIKKworICAgICAgICBkZWYgcmFpc2VfaXQoKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiZm9yY2UgdGhlIF9leGVjdXRlX2NoaWxkKCkgZXJycGlwZV9kYXRhIHBhdGguIikKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLl9UZXN0RXhlY3V0ZUNoaWxkUG9wZW4oCisgICAgICAgICAgICAgICAgICAgIHNlbGYsIFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgInBhc3MiXSwKKyAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLCBwcmVleGVjX2ZuPXJhaXNlX2l0KQorCisgICAgZGVmIHRlc3RfYXJnc19zdHJpbmcoc2VsZik6CisgICAgICAgICMgYXJncyBpcyBhIHN0cmluZworICAgICAgICBmLCBmbmFtZSA9IG1rc3RlbXAoKQorICAgICAgICBvcy53cml0ZShmLCAiIyEvYmluL3NoXG4iKQorICAgICAgICBvcy53cml0ZShmLCAiZXhlYyAnJXMnIC1jICdpbXBvcnQgc3lzOyBzeXMuZXhpdCg0NyknXG4iICUKKyAgICAgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUpCisgICAgICAgIG9zLmNsb3NlKGYpCisgICAgICAgIG9zLmNobW9kKGZuYW1lLCAwbzcwMCkKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oZm5hbWUpCisgICAgICAgIHAud2FpdCgpCisgICAgICAgIG9zLnJlbW92ZShmbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnJldHVybmNvZGUsIDQ3KQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9hcmdzKHNlbGYpOgorICAgICAgICAjIGludmFsaWQgYXJndW1lbnRzIHNob3VsZCByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN1YnByb2Nlc3MuY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBzeXM7IHN5cy5leGl0KDQ3KSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHVwaW5mbz00NykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3VicHJvY2Vzcy5jYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHN5czsgc3lzLmV4aXQoNDcpIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uZmxhZ3M9NDcpCisKKyAgICBkZWYgdGVzdF9zaGVsbF9zZXF1ZW5jZShzZWxmKToKKyAgICAgICAgIyBSdW4gY29tbWFuZCB0aHJvdWdoIHRoZSBzaGVsbCAoc2VxdWVuY2UpCisgICAgICAgIG5ld2VudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIG5ld2VudlsiRlJVSVQiXSA9ICJhcHBsZSIKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWyJlY2hvICRGUlVJVCJdLCBzaGVsbD0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9bmV3ZW52KQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKCksICJhcHBsZSIpCisKKyAgICBkZWYgdGVzdF9zaGVsbF9zdHJpbmcoc2VsZik6CisgICAgICAgICMgUnVuIGNvbW1hbmQgdGhyb3VnaCB0aGUgc2hlbGwgKHN0cmluZykKKyAgICAgICAgbmV3ZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgbmV3ZW52WyJGUlVJVCJdID0gImFwcGxlIgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbigiZWNobyAkRlJVSVQiLCBzaGVsbD0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9bmV3ZW52KQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKCksICJhcHBsZSIpCisKKyAgICBkZWYgdGVzdF9jYWxsX3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBjYWxsKCkgZnVuY3Rpb24gd2l0aCBzdHJpbmcgYXJndW1lbnQgb24gVU5JWAorICAgICAgICBmLCBmbmFtZSA9IG1rc3RlbXAoKQorICAgICAgICBvcy53cml0ZShmLCAiIyEvYmluL3NoXG4iKQorICAgICAgICBvcy53cml0ZShmLCAiZXhlYyAnJXMnIC1jICdpbXBvcnQgc3lzOyBzeXMuZXhpdCg0NyknXG4iICUKKyAgICAgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUpCisgICAgICAgIG9zLmNsb3NlKGYpCisgICAgICAgIG9zLmNobW9kKGZuYW1lLCAwNzAwKQorICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2FsbChmbmFtZSkKKyAgICAgICAgb3MucmVtb3ZlKGZuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCA0NykKKworICAgIGRlZiB0ZXN0X3NwZWNpZmljX3NoZWxsKHNlbGYpOgorICAgICAgICAjIElzc3VlICM5MjY1OiBJbmNvcnJlY3QgbmFtZSBwYXNzZWQgYXMgYXJnWzBdLgorICAgICAgICBzaGVsbHMgPSBbXQorICAgICAgICBmb3IgcHJlZml4IGluIFsnL2JpbicsICcvdXNyL2Jpbi8nLCAnL3Vzci9sb2NhbC9iaW4nXToKKyAgICAgICAgICAgIGZvciBuYW1lIGluIFsnYmFzaCcsICdrc2gnXToKKyAgICAgICAgICAgICAgICBzaCA9IG9zLnBhdGguam9pbihwcmVmaXgsIG5hbWUpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2gpOgorICAgICAgICAgICAgICAgICAgICBzaGVsbHMuYXBwZW5kKHNoKQorICAgICAgICBpZiBub3Qgc2hlbGxzOiAjIFdpbGwgcHJvYmFibHkgd29yayBmb3IgYW55IHNoZWxsIGJ1dCBjc2guCisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJiYXNoIG9yIGtzaCByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0IikKKyAgICAgICAgc2ggPSAnL2Jpbi9zaCcKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoc2gpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoc2gpOgorICAgICAgICAgICAgIyBUZXN0IHdpbGwgZmFpbCBpZiAvYmluL3NoIGlzIGEgc3ltbGluayB0byBjc2guCisgICAgICAgICAgICBzaGVsbHMuYXBwZW5kKHNoKQorICAgICAgICBmb3Igc2ggaW4gc2hlbGxzOgorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oImVjaG8gJDAiLCBleGVjdXRhYmxlPXNoLCBzaGVsbD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLnN0cmlwKCksIHNoKQorCisgICAgZGVmIF9raWxsX3Byb2Nlc3Moc2VsZiwgbWV0aG9kLCAqYXJncyk6CisgICAgICAgICMgRG8gbm90IGluaGVyaXQgZmlsZSBoYW5kbGVzIGZyb20gdGhlIHBhcmVudC4KKyAgICAgICAgIyBJdCBzaG91bGQgZml4IGZhaWx1cmVzIG9uIHNvbWUgcGxhdGZvcm1zLgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICIiImlmIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBzeXMsIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgneFxcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDMwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV9mZHM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAjIFdhaXQgZm9yIHRoZSBpbnRlcnByZXRlciB0byBiZSBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGJlZm9yZQorICAgICAgICAjIHNlbmRpbmcgYW55IHNpZ25hbC4KKyAgICAgICAgcC5zdGRvdXQucmVhZCgxKQorICAgICAgICBnZXRhdHRyKHAsIG1ldGhvZCkoKmFyZ3MpCisgICAgICAgIHJldHVybiBwCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCgnbmV0YnNkJywgJ29wZW5ic2QnKSksCisgICAgICAgICAgICAgICAgICAgICAiRHVlIHRvIGtub3duIE9TIGJ1ZyAoaXNzdWUgIzE2NzYyKSIpCisgICAgZGVmIF9raWxsX2RlYWRfcHJvY2VzcyhzZWxmLCBtZXRob2QsICphcmdzKToKKyAgICAgICAgIyBEbyBub3QgaW5oZXJpdCBmaWxlIGhhbmRsZXMgZnJvbSB0aGUgcGFyZW50LgorICAgICAgICAjIEl0IHNob3VsZCBmaXggZmFpbHVyZXMgb24gc29tZSBwbGF0Zm9ybXMuCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgIiIiaWYgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHN5cywgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCd4XFxuJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgICMgV2FpdCBmb3IgdGhlIGludGVycHJldGVyIHRvIGJlIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYmVmb3JlCisgICAgICAgICMgc2VuZGluZyBhbnkgc2lnbmFsLgorICAgICAgICBwLnN0ZG91dC5yZWFkKDEpCisgICAgICAgICMgVGhlIHByb2Nlc3Mgc2hvdWxkIGVuZCBhZnRlciB0aGlzCisgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgIyBUaGlzIHNob3VsZG4ndCByYWlzZSBldmVuIHRob3VnaCB0aGUgY2hpbGQgaXMgbm93IGRlYWQKKyAgICAgICAgZ2V0YXR0cihwLCBtZXRob2QpKCphcmdzKQorICAgICAgICBwLmNvbW11bmljYXRlKCkKKworICAgIGRlZiB0ZXN0X3NlbmRfc2lnbmFsKHNlbGYpOgorICAgICAgICBwID0gc2VsZi5fa2lsbF9wcm9jZXNzKCdzZW5kX3NpZ25hbCcsIHNpZ25hbC5TSUdJTlQpCisgICAgICAgIF8sIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEluKCdLZXlib2FyZEludGVycnVwdCcsIHN0ZGVycikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwLndhaXQoKSwgMCkKKworICAgIGRlZiB0ZXN0X2tpbGwoc2VsZik6CisgICAgICAgIHAgPSBzZWxmLl9raWxsX3Byb2Nlc3MoJ2tpbGwnKQorICAgICAgICBfLCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChzdGRlcnIsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAud2FpdCgpLCAtc2lnbmFsLlNJR0tJTEwpCisKKyAgICBkZWYgdGVzdF90ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIHAgPSBzZWxmLl9raWxsX3Byb2Nlc3MoJ3Rlcm1pbmF0ZScpCisgICAgICAgIF8sIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyciwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC53YWl0KCksIC1zaWduYWwuU0lHVEVSTSkKKworICAgIGRlZiB0ZXN0X3NlbmRfc2lnbmFsX2RlYWQoc2VsZik6CisgICAgICAgICMgU2VuZGluZyBhIHNpZ25hbCB0byBhIGRlYWQgcHJvY2VzcworICAgICAgICBzZWxmLl9raWxsX2RlYWRfcHJvY2Vzcygnc2VuZF9zaWduYWwnLCBzaWduYWwuU0lHSU5UKQorCisgICAgZGVmIHRlc3Rfa2lsbF9kZWFkKHNlbGYpOgorICAgICAgICAjIEtpbGxpbmcgYSBkZWFkIHByb2Nlc3MKKyAgICAgICAgc2VsZi5fa2lsbF9kZWFkX3Byb2Nlc3MoJ2tpbGwnKQorCisgICAgZGVmIHRlc3RfdGVybWluYXRlX2RlYWQoc2VsZik6CisgICAgICAgICMgVGVybWluYXRpbmcgYSBkZWFkIHByb2Nlc3MKKyAgICAgICAgc2VsZi5fa2lsbF9kZWFkX3Byb2Nlc3MoJ3Rlcm1pbmF0ZScpCisKKyAgICBkZWYgY2hlY2tfY2xvc2Vfc3RkX2ZkcyhzZWxmLCBmZHMpOgorICAgICAgICAjIElzc3VlICM5OTA1OiB0ZXN0IHRoYXQgc3VicHJvY2VzcyBwaXBlcyBzdGlsbCB3b3JrIHByb3Blcmx5IHdpdGgKKyAgICAgICAgIyBzb21lIHN0YW5kYXJkIGZkcyBjbG9zZWQKKyAgICAgICAgc3RkaW4gPSAwCisgICAgICAgIG5ld2ZkcyA9IFtdCisgICAgICAgIGZvciBhIGluIGZkczoKKyAgICAgICAgICAgIGIgPSBvcy5kdXAoYSkKKyAgICAgICAgICAgIG5ld2Zkcy5hcHBlbmQoYikKKyAgICAgICAgICAgIGlmIGEgPT0gMDoKKyAgICAgICAgICAgICAgICBzdGRpbiA9IGIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGZkIGluIGZkczoKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgICAgIG91dCwgZXJyID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5czsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgiYXBwbGUiKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC5mbHVzaCgpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3RkZXJyLndyaXRlKCJvcmFuZ2UiKSddLAorICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdGRpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkuY29tbXVuaWNhdGUoKQorICAgICAgICAgICAgZXJyID0gdGVzdF9zdXBwb3J0LnN0cmlwX3B5dGhvbl9zdGRlcnIoZXJyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgob3V0LCBlcnIpLCAoYidhcHBsZScsIGInb3JhbmdlJykpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmb3IgYiwgYSBpbiB6aXAobmV3ZmRzLCBmZHMpOgorICAgICAgICAgICAgICAgIG9zLmR1cDIoYiwgYSkKKyAgICAgICAgICAgIGZvciBiIGluIG5ld2ZkczoKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShiKQorCisgICAgZGVmIHRlc3RfY2xvc2VfZmRfMChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19jbG9zZV9zdGRfZmRzKFswXSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlX2ZkXzEoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfY2xvc2Vfc3RkX2ZkcyhbMV0pCisKKyAgICBkZWYgdGVzdF9jbG9zZV9mZF8yKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Nsb3NlX3N0ZF9mZHMoWzJdKQorCisgICAgZGVmIHRlc3RfY2xvc2VfZmRzXzBfMShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19jbG9zZV9zdGRfZmRzKFswLCAxXSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlX2Zkc18wXzIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfY2xvc2Vfc3RkX2ZkcyhbMCwgMl0pCisKKyAgICBkZWYgdGVzdF9jbG9zZV9mZHNfMV8yKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Nsb3NlX3N0ZF9mZHMoWzEsIDJdKQorCisgICAgZGVmIHRlc3RfY2xvc2VfZmRzXzBfMV8yKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMDgwNjogdGVzdCB0aGF0IHN1YnByb2Nlc3MgcGlwZXMgc3RpbGwgd29yayBwcm9wZXJseSB3aXRoCisgICAgICAgICMgYWxsIHN0YW5kYXJkIGZkcyBjbG9zZWQuCisgICAgICAgIHNlbGYuY2hlY2tfY2xvc2Vfc3RkX2ZkcyhbMCwgMSwgMl0pCisKKyAgICBkZWYgY2hlY2tfc3dhcF9mZHMoc2VsZiwgc3RkaW5fbm8sIHN0ZG91dF9ubywgc3RkZXJyX25vKToKKyAgICAgICAgIyBvcGVuIHVwIHNvbWUgdGVtcG9yYXJ5IGZpbGVzCisgICAgICAgIHRlbXBzID0gW21rc3RlbXAoKSBmb3IgaSBpbiByYW5nZSgzKV0KKyAgICAgICAgdGVtcF9mZHMgPSBbZmQgZm9yIGZkLCBmbmFtZSBpbiB0ZW1wc10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyB1bmxpbmsgdGhlIGZpbGVzIC0tIHdlIHdvbid0IG5lZWQgdG8gcmVvcGVuIHRoZW0KKyAgICAgICAgICAgIGZvciBmZCwgZm5hbWUgaW4gdGVtcHM6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGZuYW1lKQorCisgICAgICAgICAgICAjIHNhdmUgYSBjb3B5IG9mIHRoZSBzdGFuZGFyZCBmaWxlIGRlc2NyaXB0b3JzCisgICAgICAgICAgICBzYXZlZF9mZHMgPSBbb3MuZHVwKGZkKSBmb3IgZmQgaW4gcmFuZ2UoMyldCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBkdXBsaWNhdGUgdGhlIHRlbXAgZmlsZXMgb3ZlciB0aGUgc3RhbmRhcmQgZmQncyAwLCAxLCAyCisgICAgICAgICAgICAgICAgZm9yIGZkLCB0ZW1wX2ZkIGluIGVudW1lcmF0ZSh0ZW1wX2Zkcyk6CisgICAgICAgICAgICAgICAgICAgIG9zLmR1cDIodGVtcF9mZCwgZmQpCisKKyAgICAgICAgICAgICAgICAjIHdyaXRlIHNvbWUgZGF0YSB0byB3aGF0IHdpbGwgYmVjb21lIHN0ZGluLCBhbmQgcmV3aW5kCisgICAgICAgICAgICAgICAgb3Mud3JpdGUoc3RkaW5fbm8sIGIiU1RESU4iKQorICAgICAgICAgICAgICAgIG9zLmxzZWVrKHN0ZGluX25vLCAwLCAwKQorCisgICAgICAgICAgICAgICAgIyBub3cgdXNlIHRob3NlIGZpbGVzIGluIHRoZSBnaXZlbiBvcmRlciwgc28gdGhhdCBzdWJwcm9jZXNzCisgICAgICAgICAgICAgICAgIyBoYXMgdG8gcmVhcnJhbmdlIHRoZW0gaW4gdGhlIGNoaWxkCisgICAgICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5czsgZ290ID0gc3lzLnN0ZGluLnJlYWQoKTsnCisgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJnb3QgJXMiJWdvdCk7IHN5cy5zdGRlcnIud3JpdGUoImVyciIpJ10sCisgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN0ZGluX25vLAorICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3Rkb3V0X25vLAorICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3RkZXJyX25vKQorICAgICAgICAgICAgICAgIHAud2FpdCgpCisKKyAgICAgICAgICAgICAgICBmb3IgZmQgaW4gdGVtcF9mZHM6CisgICAgICAgICAgICAgICAgICAgIG9zLmxzZWVrKGZkLCAwLCAwKQorCisgICAgICAgICAgICAgICAgb3V0ID0gb3MucmVhZChzdGRvdXRfbm8sIDEwMjQpCisgICAgICAgICAgICAgICAgZXJyID0gdGVzdF9zdXBwb3J0LnN0cmlwX3B5dGhvbl9zdGRlcnIob3MucmVhZChzdGRlcnJfbm8sIDEwMjQpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmb3Igc3RkLCBzYXZlZCBpbiBlbnVtZXJhdGUoc2F2ZWRfZmRzKToKKyAgICAgICAgICAgICAgICAgICAgb3MuZHVwMihzYXZlZCwgc3RkKQorICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShzYXZlZCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQsIGIiZ290IFNURElOIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBiImVyciIpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZvciBmZCBpbiB0ZW1wX2ZkczoKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKKworICAgICMgV2hlbiBkdXBpbmcgZmRzLCBpZiB0aGVyZSBhcmlzZXMgYSBzaXR1YXRpb24gd2hlcmUgb25lIG9mIHRoZSBmZHMgaXMKKyAgICAjIGVpdGhlciAwLCAxIG9yIDIsIGl0IGlzIHBvc3NpYmxlIHRoYXQgaXQgaXMgb3ZlcndyaXR0ZW4gKCMxMjYwNykuCisgICAgIyBUaGlzIHRlc3RzIGFsbCBjb21iaW5hdGlvbnMgb2YgdGhpcy4KKyAgICBkZWYgdGVzdF9zd2FwX2ZkcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zd2FwX2ZkcygwLCAxLCAyKQorICAgICAgICBzZWxmLmNoZWNrX3N3YXBfZmRzKDAsIDIsIDEpCisgICAgICAgIHNlbGYuY2hlY2tfc3dhcF9mZHMoMSwgMCwgMikKKyAgICAgICAgc2VsZi5jaGVja19zd2FwX2ZkcygxLCAyLCAwKQorICAgICAgICBzZWxmLmNoZWNrX3N3YXBfZmRzKDIsIDAsIDEpCisgICAgICAgIHNlbGYuY2hlY2tfc3dhcF9mZHMoMiwgMSwgMCkKKworICAgIGRlZiB0ZXN0X3dhaXRfd2hlbl9zaWdjaGlsZF9pZ25vcmVkKHNlbGYpOgorICAgICAgICAjIE5PVEU6IHNpZ2NoaWxkX2lnbm9yZS5weSBtYXkgbm90IGJlIGFuIGVmZmVjdGl2ZSB0ZXN0IG9uIGFsbCBPU2VzLgorICAgICAgICBzaWdjaGlsZF9pZ25vcmUgPSB0ZXN0X3N1cHBvcnQuZmluZGZpbGUoInNpZ2NoaWxkX2lnbm9yZS5weSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJkaXI9InN1YnByb2Nlc3NkYXRhIikKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCBzaWdjaGlsZF9pZ25vcmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHAucmV0dXJuY29kZSwgInNpZ2NoaWxkX2lnbm9yZS5weSBleGl0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiBub24temVybyB3aXRoIHRoaXMgZXJyb3I6XG4lcyIgJSBzdGRlcnIpCisKKyAgICBkZWYgdGVzdF96b21iaWVfZmFzdF9wcm9jZXNzX2RlbChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTI2NTA6IG9uIFVuaXgsIGlmIFBvcGVuLl9fZGVsX18oKSB3YXMgY2FsbGVkIGJlZm9yZSB0aGUKKyAgICAgICAgIyBwcm9jZXNzIGV4aXRlZCwgaXQgd291bGRuJ3QgYmUgYWRkZWQgdG8gc3VicHJvY2Vzcy5fYWN0aXZlLCBhbmQgd291bGQKKyAgICAgICAgIyByZW1haW4gYSB6b21iaWUuCisgICAgICAgICMgc3Bhd24gYSBQb3BlbiwgYW5kIGRlbGV0ZSBpdHMgcmVmZXJlbmNlIGJlZm9yZSBpdCBleGl0cworICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5cywgdGltZTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGltZS5zbGVlcCgwLjIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQorICAgICAgICBpZGVudCA9IGlkKHApCisgICAgICAgIHBpZCA9IHAucGlkCisgICAgICAgIGRlbCBwCisgICAgICAgICMgY2hlY2sgdGhhdCBwIGlzIGluIHRoZSBhY3RpdmUgcHJvY2Vzc2VzIGxpc3QKKyAgICAgICAgc2VsZi5hc3NlcnRJbihpZGVudCwgW2lkKG8pIGZvciBvIGluIHN1YnByb2Nlc3MuX2FjdGl2ZV0pCisKKyAgICBkZWYgdGVzdF9sZWFrX2Zhc3RfcHJvY2Vzc19kZWxfa2lsbGVkKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMjY1MDogb24gVW5peCwgaWYgUG9wZW4uX19kZWxfXygpIHdhcyBjYWxsZWQgYmVmb3JlIHRoZQorICAgICAgICAjIHByb2Nlc3MgZXhpdGVkLCBhbmQgdGhlIHByb2Nlc3MgZ290IGtpbGxlZCBieSBhIHNpZ25hbCwgaXQgd291bGQgbmV2ZXIKKyAgICAgICAgIyBiZSByZW1vdmVkIGZyb20gc3VicHJvY2Vzcy5fYWN0aXZlLCB3aGljaCB0cmlnZ2VyZWQgYSBGRCBhbmQgbWVtb3J5CisgICAgICAgICMgbGVhay4KKyAgICAgICAgIyBzcGF3biBhIFBvcGVuLCBkZWxldGUgaXRzIHJlZmVyZW5jZSBhbmQga2lsbCBpdAorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHRpbWU7JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWUuc2xlZXAoMyknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCisgICAgICAgIGlkZW50ID0gaWQocCkKKyAgICAgICAgcGlkID0gcC5waWQKKyAgICAgICAgZGVsIHAKKyAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdLSUxMKQorICAgICAgICAjIGNoZWNrIHRoYXQgcCBpcyBpbiB0aGUgYWN0aXZlIHByb2Nlc3NlcyBsaXN0CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oaWRlbnQsIFtpZChvKSBmb3IgbyBpbiBzdWJwcm9jZXNzLl9hY3RpdmVdKQorCisgICAgICAgICMgbGV0IHNvbWUgdGltZSBmb3IgdGhlIHByb2Nlc3MgdG8gZXhpdCwgYW5kIGNyZWF0ZSBhIG5ldyBQb3BlbjogdGhpcworICAgICAgICAjIHNob3VsZCB0cmlnZ2VyIHRoZSB3YWl0KCkgb2YgcAorICAgICAgICB0aW1lLnNsZWVwKDAuMikKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhFbnZpcm9ubWVudEVycm9yKSBhcyBjOgorICAgICAgICAgICAgd2l0aCBzdWJwcm9jZXNzLlBvcGVuKFsnbm9uZXhpc3RpbmdfaV9ob3BlJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKSBhcyBwcm9jOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBwIHNob3VsZCBoYXZlIGJlZW4gd2FpdCgpZWQgb24sIGFuZCByZW1vdmVkIGZyb20gdGhlIF9hY3RpdmUgbGlzdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy53YWl0cGlkLCBwaWQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oaWRlbnQsIFtpZChvKSBmb3IgbyBpbiBzdWJwcm9jZXNzLl9hY3RpdmVdKQorCisgICAgZGVmIHRlc3RfcGlwZV9jbG9leGVjKHNlbGYpOgorICAgICAgICAjIElzc3VlIDEyNzg2OiBjaGVjayB0aGF0IHRoZSBjb21tdW5pY2F0aW9uIHBpcGVzJyBGRHMgYXJlIHNldCBDTE9FWEVDLAorICAgICAgICAjIGFuZCBhcmUgbm90IGluaGVyaXRlZCBieSBhbm90aGVyIGNoaWxkIHByb2Nlc3MuCisgICAgICAgIHAxID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBvczsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29zLnJlYWQoMCwgMSknCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKworICAgICAgICBwMiA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAiIiJpZiBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBvcywgZXJybm8sIHN5cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmZCBpbiAlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVCQURGOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiICUgW2YuZmlsZW5vKCkgZm9yIGYgaW4gKHAxLnN0ZGluLCBwMS5zdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAxLnN0ZGVycildCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwgY2xvc2VfZmRzPUZhbHNlKQorICAgICAgICBwMS5jb21tdW5pY2F0ZSgnZm9vJykKKyAgICAgICAgXywgc3RkZXJyID0gcDIuY29tbXVuaWNhdGUoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDIucmV0dXJuY29kZSwgMCwgIlVuZXhwZWN0ZWQgZXJyb3I6ICIgKyByZXByKHN0ZGVycikpCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3MobXN3aW5kb3dzLCAiV2luZG93cyBzcGVjaWZpYyB0ZXN0cyIpCitjbGFzcyBXaW4zMlByb2Nlc3NUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc3RhcnR1cGluZm8oc2VsZik6CisgICAgICAgICMgc3RhcnR1cGluZm8gYXJndW1lbnQKKyAgICAgICAgIyBXZSB1c2VzIGhhcmRjb2RlZCBjb25zdGFudHMsIGJlY2F1c2Ugd2UgZG8gbm90IHdhbnQgdG8KKyAgICAgICAgIyBkZXBlbmQgb24gd2luMzJhbGwuCisgICAgICAgIFNUQVJURl9VU0VTSE9XV0lORE9XID0gMQorICAgICAgICBTV19NQVhJTUlaRSA9IDMKKyAgICAgICAgc3RhcnR1cGluZm8gPSBzdWJwcm9jZXNzLlNUQVJUVVBJTkZPKCkKKyAgICAgICAgc3RhcnR1cGluZm8uZHdGbGFncyA9IFNUQVJURl9VU0VTSE9XV0lORE9XCisgICAgICAgIHN0YXJ0dXBpbmZvLndTaG93V2luZG93ID0gU1dfTUFYSU1JWkUKKyAgICAgICAgIyBTaW5jZSBQeXRob24gaXMgYSBjb25zb2xlIHByb2Nlc3MsIGl0IHdvbid0IGJlIGFmZmVjdGVkCisgICAgICAgICMgYnkgd1Nob3dXaW5kb3csIGJ1dCB0aGUgYXJndW1lbnQgc2hvdWxkIGJlIHNpbGVudGx5CisgICAgICAgICMgaWdub3JlZAorICAgICAgICBzdWJwcm9jZXNzLmNhbGwoW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAiaW1wb3J0IHN5czsgc3lzLmV4aXQoMCkiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvPXN0YXJ0dXBpbmZvKQorCisgICAgZGVmIHRlc3RfY3JlYXRpb25mbGFncyhzZWxmKToKKyAgICAgICAgIyBjcmVhdGlvbmZsYWdzIGFyZ3VtZW50CisgICAgICAgIENSRUFURV9ORVdfQ09OU09MRSA9IDE2CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIiAgICBhIERPUyBib3ggc2hvdWxkIGZsYXNoIGJyaWVmbHkgLi4uXG4iKQorICAgICAgICBzdWJwcm9jZXNzLmNhbGwoc3lzLmV4ZWN1dGFibGUgKworICAgICAgICAgICAgICAgICAgICAgICAgJyAtYyAiaW1wb3J0IHRpbWU7IHRpbWUuc2xlZXAoMC4yNSkiJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0aW9uZmxhZ3M9Q1JFQVRFX05FV19DT05TT0xFKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9hcmdzKHNlbGYpOgorICAgICAgICAjIGludmFsaWQgYXJndW1lbnRzIHNob3VsZCByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN1YnByb2Nlc3MuY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBzeXM7IHN5cy5leGl0KDQ3KSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVleGVjX2ZuPWxhbWJkYTogMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3VicHJvY2Vzcy5jYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHN5czsgc3lzLmV4aXQoNDcpIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz1UcnVlKQorCisgICAgZGVmIHRlc3RfY2xvc2VfZmRzKHNlbGYpOgorICAgICAgICAjIGNsb3NlIGZpbGUgZGVzY3JpcHRvcnMKKyAgICAgICAgcmMgPSBzdWJwcm9jZXNzLmNhbGwoW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBzeXM7IHN5cy5leGl0KDQ3KSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VfZmRzPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDQ3KQorCisgICAgZGVmIHRlc3Rfc2hlbGxfc2VxdWVuY2Uoc2VsZik6CisgICAgICAgICMgUnVuIGNvbW1hbmQgdGhyb3VnaCB0aGUgc2hlbGwgKHNlcXVlbmNlKQorICAgICAgICBuZXdlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBuZXdlbnZbIkZSVUlUIl0gPSAicGh5c2FsaXMiCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsic2V0Il0sIHNoZWxsPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1uZXdlbnYpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigicGh5c2FsaXMiLCBwLnN0ZG91dC5yZWFkKCkpCisKKyAgICBkZWYgdGVzdF9zaGVsbF9zdHJpbmcoc2VsZik6CisgICAgICAgICMgUnVuIGNvbW1hbmQgdGhyb3VnaCB0aGUgc2hlbGwgKHN0cmluZykKKyAgICAgICAgbmV3ZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgbmV3ZW52WyJGUlVJVCJdID0gInBoeXNhbGlzIgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbigic2V0Iiwgc2hlbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PW5ld2VudikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydEluKCJwaHlzYWxpcyIsIHAuc3Rkb3V0LnJlYWQoKSkKKworICAgIGRlZiB0ZXN0X2NhbGxfc3RyaW5nKHNlbGYpOgorICAgICAgICAjIGNhbGwoKSBmdW5jdGlvbiB3aXRoIHN0cmluZyBhcmd1bWVudCBvbiBXaW5kb3dzCisgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKHN5cy5leGVjdXRhYmxlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAtYyAiaW1wb3J0IHN5czsgc3lzLmV4aXQoNDcpIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDQ3KQorCisgICAgZGVmIF9raWxsX3Byb2Nlc3Moc2VsZiwgbWV0aG9kLCAqYXJncyk6CisgICAgICAgICMgU29tZSB3aW4zMiBidWlsZGJvdCByYWlzZXMgRU9GRXJyb3IgaWYgc3RkaW4gaXMgaW5oZXJpdGVkCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgIiIiaWYgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHN5cywgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCd4XFxuJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMzApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGluLmNsb3NlKQorICAgICAgICAjIFdhaXQgZm9yIHRoZSBpbnRlcnByZXRlciB0byBiZSBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGJlZm9yZQorICAgICAgICAjIHNlbmRpbmcgYW55IHNpZ25hbC4KKyAgICAgICAgcC5zdGRvdXQucmVhZCgxKQorICAgICAgICBnZXRhdHRyKHAsIG1ldGhvZCkoKmFyZ3MpCisgICAgICAgIF8sIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyciwgJycpCisgICAgICAgIHJldHVybmNvZGUgPSBwLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJldHVybmNvZGUsIDApCisKKyAgICBkZWYgX2tpbGxfZGVhZF9wcm9jZXNzKHNlbGYsIG1ldGhvZCwgKmFyZ3MpOgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICIiImlmIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBzeXMsIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgneFxcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuZXhpdCg0MikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkaW4uY2xvc2UpCisgICAgICAgICMgV2FpdCBmb3IgdGhlIGludGVycHJldGVyIHRvIGJlIGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgYmVmb3JlCisgICAgICAgICMgc2VuZGluZyBhbnkgc2lnbmFsLgorICAgICAgICBwLnN0ZG91dC5yZWFkKDEpCisgICAgICAgICMgVGhlIHByb2Nlc3Mgc2hvdWxkIGVuZCBhZnRlciB0aGlzCisgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgIyBUaGlzIHNob3VsZG4ndCByYWlzZSBldmVuIHRob3VnaCB0aGUgY2hpbGQgaXMgbm93IGRlYWQKKyAgICAgICAgZ2V0YXR0cihwLCBtZXRob2QpKCphcmdzKQorICAgICAgICBfLCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChzdGRlcnIsIGInJykKKyAgICAgICAgcmMgPSBwLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCA0MikKKworICAgIGRlZiB0ZXN0X3NlbmRfc2lnbmFsKHNlbGYpOgorICAgICAgICBzZWxmLl9raWxsX3Byb2Nlc3MoJ3NlbmRfc2lnbmFsJywgc2lnbmFsLlNJR1RFUk0pCisKKyAgICBkZWYgdGVzdF9raWxsKHNlbGYpOgorICAgICAgICBzZWxmLl9raWxsX3Byb2Nlc3MoJ2tpbGwnKQorCisgICAgZGVmIHRlc3RfdGVybWluYXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9raWxsX3Byb2Nlc3MoJ3Rlcm1pbmF0ZScpCisKKyAgICBkZWYgdGVzdF9zZW5kX3NpZ25hbF9kZWFkKHNlbGYpOgorICAgICAgICBzZWxmLl9raWxsX2RlYWRfcHJvY2Vzcygnc2VuZF9zaWduYWwnLCBzaWduYWwuU0lHVEVSTSkKKworICAgIGRlZiB0ZXN0X2tpbGxfZGVhZChzZWxmKToKKyAgICAgICAgc2VsZi5fa2lsbF9kZWFkX3Byb2Nlc3MoJ2tpbGwnKQorCisgICAgZGVmIHRlc3RfdGVybWluYXRlX2RlYWQoc2VsZik6CisgICAgICAgIHNlbGYuX2tpbGxfZGVhZF9wcm9jZXNzKCd0ZXJtaW5hdGUnKQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKGdldGF0dHIoc3VicHJvY2VzcywgJ19oYXNfcG9sbCcsIEZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICJwb2xsIHN5c3RlbSBjYWxsIG5vdCBzdXBwb3J0ZWQiKQorY2xhc3MgUHJvY2Vzc1Rlc3RDYXNlTm9Qb2xsKFByb2Nlc3NUZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdWJwcm9jZXNzLl9oYXNfcG9sbCA9IEZhbHNlCisgICAgICAgIFByb2Nlc3NUZXN0Q2FzZS5zZXRVcChzZWxmKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzdWJwcm9jZXNzLl9oYXNfcG9sbCA9IFRydWUKKyAgICAgICAgUHJvY2Vzc1Rlc3RDYXNlLnRlYXJEb3duKHNlbGYpCisKKworY2xhc3MgSGVscGVyRnVuY3Rpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgQHVuaXR0ZXN0LnNraXBJZihtc3dpbmRvd3MsICJlcnJubyBhbmQgRUlOVFIgbWFrZSBubyBzZW5zZSBvbiB3aW5kb3dzIikKKyAgICBkZWYgdGVzdF9laW50cl9yZXRyeV9jYWxsKHNlbGYpOgorICAgICAgICByZWNvcmRfY2FsbHMgPSBbXQorICAgICAgICBkZWYgZmFrZV9vc19mdW5jKCphcmdzKToKKyAgICAgICAgICAgIHJlY29yZF9jYWxscy5hcHBlbmQoYXJncykKKyAgICAgICAgICAgIGlmIGxlbihyZWNvcmRfY2FsbHMpID09IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgT1NFcnJvcihlcnJuby5FSU5UUiwgImZha2UgaW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwiKQorICAgICAgICAgICAgcmV0dXJuIHR1cGxlKHJldmVyc2VkKGFyZ3MpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDk5OSwgMjU2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLl9laW50cl9yZXRyeV9jYWxsKGZha2Vfb3NfZnVuYywgMjU2LCA5OTkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoMjU2LCA5OTkpXSwgcmVjb3JkX2NhbGxzKQorICAgICAgICAjIFRoaXMgdGltZSB0aGVyZSB3aWxsIGJlIGFuIEVJTlRSIHNvIGl0IHdpbGwgbG9vcCBvbmNlLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2NjYsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLl9laW50cl9yZXRyeV9jYWxsKGZha2Vfb3NfZnVuYywgNjY2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKDI1NiwgOTk5KSwgKDY2NiwpLCAoNjY2LCldLCByZWNvcmRfY2FsbHMpCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKG1zd2luZG93cywgIm1zd2luZG93cyBvbmx5IikKK2NsYXNzIENvbW1hbmRzV2l0aFNwYWNlcyAoQmFzZVRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoQ29tbWFuZHNXaXRoU3BhY2VzLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIGYsIGZuYW1lID0gbWtzdGVtcCgiLnB5IiwgInRlIHN0IikKKyAgICAgICAgc2VsZi5mbmFtZSA9IGZuYW1lLmxvd2VyICgpCisgICAgICAgIG9zLndyaXRlKGYsIGIiaW1wb3J0IHN5czsiCisgICAgICAgICAgICAgICAgICAgIGIic3lzLnN0ZG91dC53cml0ZSgnJWQgJXMnICUgKGxlbihzeXMuYXJndiksIFthLmxvd2VyICgpIGZvciBhIGluIHN5cy5hcmd2XSkpIgorICAgICAgICApCisgICAgICAgIG9zLmNsb3NlKGYpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIG9zLnJlbW92ZShzZWxmLmZuYW1lKQorICAgICAgICBzdXBlcihDb21tYW5kc1dpdGhTcGFjZXMsIHNlbGYpLnRlYXJEb3duKCkKKworICAgIGRlZiB3aXRoX3NwYWNlcyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBrd2FyZ3NbJ3N0ZG91dCddID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgIHAuc3Rkb3V0LnJlYWQgKCkuZGVjb2RlKCJtYmNzIiksCisgICAgICAgICAgIjIgWyVyLCAnYWIgY2QnXSIgJSBzZWxmLmZuYW1lCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X3NoZWxsX3N0cmluZ193aXRoX3NwYWNlcyhzZWxmKToKKyAgICAgICAgIyBjYWxsKCkgZnVuY3Rpb24gd2l0aCBzdHJpbmcgYXJndW1lbnQgd2l0aCBzcGFjZXMgb24gV2luZG93cworICAgICAgICBzZWxmLndpdGhfc3BhY2VzKCciJXMiICIlcyIgIiVzIicgJSAoc3lzLmV4ZWN1dGFibGUsIHNlbGYuZm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWIgY2QiKSwgc2hlbGw9MSkKKworICAgIGRlZiB0ZXN0X3NoZWxsX3NlcXVlbmNlX3dpdGhfc3BhY2VzKHNlbGYpOgorICAgICAgICAjIGNhbGwoKSBmdW5jdGlvbiB3aXRoIHNlcXVlbmNlIGFyZ3VtZW50IHdpdGggc3BhY2VzIG9uIFdpbmRvd3MKKyAgICAgICAgc2VsZi53aXRoX3NwYWNlcyhbc3lzLmV4ZWN1dGFibGUsIHNlbGYuZm5hbWUsICJhYiBjZCJdLCBzaGVsbD0xKQorCisgICAgZGVmIHRlc3Rfbm9zaGVsbF9zdHJpbmdfd2l0aF9zcGFjZXMoc2VsZik6CisgICAgICAgICMgY2FsbCgpIGZ1bmN0aW9uIHdpdGggc3RyaW5nIGFyZ3VtZW50IHdpdGggc3BhY2VzIG9uIFdpbmRvd3MKKyAgICAgICAgc2VsZi53aXRoX3NwYWNlcygnIiVzIiAiJXMiICIlcyInICUgKHN5cy5leGVjdXRhYmxlLCBzZWxmLmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWIgY2QiKSkKKworICAgIGRlZiB0ZXN0X25vc2hlbGxfc2VxdWVuY2Vfd2l0aF9zcGFjZXMoc2VsZik6CisgICAgICAgICMgY2FsbCgpIGZ1bmN0aW9uIHdpdGggc2VxdWVuY2UgYXJndW1lbnQgd2l0aCBzcGFjZXMgb24gV2luZG93cworICAgICAgICBzZWxmLndpdGhfc3BhY2VzKFtzeXMuZXhlY3V0YWJsZSwgc2VsZi5mbmFtZSwgImFiIGNkIl0pCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB1bml0X3Rlc3RzID0gKFByb2Nlc3NUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgIFBPU0lYUHJvY2Vzc1Rlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgV2luMzJQcm9jZXNzVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICBQcm9jZXNzVGVzdENhc2VOb1BvbGwsCisgICAgICAgICAgICAgICAgICBIZWxwZXJGdW5jdGlvblRlc3RzLAorICAgICAgICAgICAgICAgICAgQ29tbWFuZHNXaXRoU3BhY2VzKQorCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdW5pdF90ZXN0cykKKyAgICB0ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3OTIyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA3OTIyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmF1ZGlvZGV2LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VuYXVkaW9kZXYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2ZjcxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmF1ZGlvZGV2LnB5CkBAIC0wLDAgKzEsMzMgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGZpbmRmaWxlLCBUZXN0RmFpbGVkLCBpbXBvcnRfbW9kdWxlCitpbXBvcnQgdW5pdHRlc3QKK3N1bmF1ZGlvZGV2ID0gaW1wb3J0X21vZHVsZSgnc3VuYXVkaW9kZXYnLCBkZXByZWNhdGVkPVRydWUpCitpbXBvcnQgb3MKKwordHJ5OgorICAgIGF1ZGlvZGV2ID0gb3MuZW52aXJvblsiQVVESU9ERVYiXQorZXhjZXB0IEtleUVycm9yOgorICAgIGF1ZGlvZGV2ID0gIi9kZXYvYXVkaW8iCisKK2lmIG5vdCBvcy5wYXRoLmV4aXN0cyhhdWRpb2Rldik6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIm5vIGF1ZGlvIGRldmljZSBmb3VuZCEiKQorCitkZWYgcGxheV9zb3VuZF9maWxlKHBhdGgpOgorICAgIGZwID0gb3BlbihwYXRoLCAncicpCisgICAgZGF0YSA9IGZwLnJlYWQoKQorICAgIGZwLmNsb3NlKCkKKyAgICB0cnk6CisgICAgICAgIGEgPSBzdW5hdWRpb2Rldi5vcGVuKCd3JykKKyAgICBleGNlcHQgc3VuYXVkaW9kZXYuZXJyb3IsIG1zZzoKKyAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgbXNnCisgICAgZWxzZToKKyAgICAgICAgYS53cml0ZShkYXRhKQorICAgICAgICBhLmNsb3NlKCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcGxheV9zb3VuZF9maWxlKGZpbmRmaWxlKCdhdWRpb3Rlc3QuYXUnKSkKKworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmF1ZGlvZGV2LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmF1ZGlvZGV2LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDlkNmRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VuYXVkaW9kZXYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmF1ZGlvZGV2LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmF1ZGlvZGV2LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDlkNmRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VuYXVkaW9kZXYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmRyeS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmRyeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTBlZjhlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VuZHJ5LnB5CkBAIC0wLDAgKzEsMTAwIEBACisiIiJEbyBhIG1pbmltYWwgdGVzdCBvZiBhbGwgdGhlIG1vZHVsZXMgdGhhdCBhcmVuJ3Qgb3RoZXJ3aXNlIHRlc3RlZC4iIiIKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFRlc3RVbnRlc3RlZE1vZHVsZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2F0X2xlYXN0X2ltcG9ydF91bnRlc3RlZF9tb2R1bGVzKHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncyhxdWlldD1UcnVlKToKKyAgICAgICAgICAgIGltcG9ydCBDR0lIVFRQU2VydmVyCisgICAgICAgICAgICBpbXBvcnQgYXVkaW9kZXYKKyAgICAgICAgICAgIGltcG9ydCBiZGIKKyAgICAgICAgICAgIGltcG9ydCBjZ2l0YgorICAgICAgICAgICAgaW1wb3J0IGNvZGUKKyAgICAgICAgICAgIGltcG9ydCBjb21waWxlYWxsCisKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuYmNwcGNvbXBpbGVyCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNjb21waWxlcgorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jeWd3aW5jY29tcGlsZXIKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuZW14Y2NvbXBpbGVyCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmZpbGVsaXN0CisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyk6CisgICAgICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5tc3ZjY29tcGlsZXIKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMudGV4dF9maWxlCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLnVuaXhjY29tcGlsZXIKKworICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X2R1bWIKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9tc2kgIyBpZiBtc2kgbW9kdWxlIGlzIG5vdCBidWlsZAorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAic2tpcHBpbmcgYmRpc3RfbXNpIgorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJkaXN0CisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcnBtCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3Rfd2luaW5zdAorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2NsaWIKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5idWlsZAorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmNsZWFuCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuY29uZmlnCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9kYXRhCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9lZ2dfaW5mbworICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfaGVhZGVycworICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfbGliCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQucmVnaXN0ZXIKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5zZGlzdAorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLnVwbG9hZAorCisgICAgICAgICAgICBpbXBvcnQgZW5jb2RpbmdzCisgICAgICAgICAgICBpbXBvcnQgZm9ybWF0dGVyCisgICAgICAgICAgICBpbXBvcnQgZ2V0cGFzcworICAgICAgICAgICAgaW1wb3J0IGh0bWxlbnRpdHlkZWZzCisgICAgICAgICAgICBpbXBvcnQgaWhvb2tzCisgICAgICAgICAgICBpbXBvcnQgaW1naGRyCisgICAgICAgICAgICBpbXBvcnQgaW1wdXRpbAorICAgICAgICAgICAgaW1wb3J0IGtleXdvcmQKKyAgICAgICAgICAgIGltcG9ydCBsaW5lY2FjaGUKKyAgICAgICAgICAgIGltcG9ydCBtYWN1cmwycGF0aAorICAgICAgICAgICAgaW1wb3J0IG1haWxjYXAKKyAgICAgICAgICAgIGltcG9ydCBtaW1pZnkKKyAgICAgICAgICAgIGltcG9ydCBubnRwbGliCisgICAgICAgICAgICBpbXBvcnQgbnR1cmwycGF0aAorICAgICAgICAgICAgaW1wb3J0IG9wY29kZQorICAgICAgICAgICAgaW1wb3J0IG9zMmVteHBhdGgKKyAgICAgICAgICAgIGltcG9ydCBwZGIKKyAgICAgICAgICAgIGltcG9ydCBwb3NpeGZpbGUKKyAgICAgICAgICAgIGltcG9ydCBwc3RhdHMKKyAgICAgICAgICAgIGltcG9ydCBweV9jb21waWxlCisgICAgICAgICAgICBpbXBvcnQgcmV4ZWMKKyAgICAgICAgICAgIGltcG9ydCBzY2hlZAorICAgICAgICAgICAgaW1wb3J0IHNuZGhkcgorICAgICAgICAgICAgaW1wb3J0IHN0YXR2ZnMKKyAgICAgICAgICAgIGltcG9ydCBzdHJpbmdvbGQKKyAgICAgICAgICAgIGltcG9ydCBzdW5hdQorICAgICAgICAgICAgaW1wb3J0IHN1bmF1ZGlvCisgICAgICAgICAgICBpbXBvcnQgc3ltYm9sCisgICAgICAgICAgICBpbXBvcnQgdGFibmFubnkKKyAgICAgICAgICAgIGltcG9ydCB0aW1laXQKKyAgICAgICAgICAgIGltcG9ydCB0b2FpZmYKKyAgICAgICAgICAgIGltcG9ydCB0b2tlbgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCB0dHkgICAgICMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJza2lwcGluZyB0dHkiCisKKyAgICAgICAgICAgICMgQ2FuJ3QgdGVzdCB0aGUgInVzZXIiIG1vZHVsZSAtLSBpZiB0aGUgdXNlciBoYXMgYSB+Ly5weXRob25yYy5weSwgaXQKKyAgICAgICAgICAgICMgY2FuIHNjcmV3IHVwIGFsbCBzb3J0cyBvZiB0aGluZ3MgKGVzcC4gaWYgaXQgcHJpbnRzISkuCisgICAgICAgICAgICAjaW1wb3J0IHVzZXIKKyAgICAgICAgICAgIGltcG9ydCB3ZWJicm93c2VyCisgICAgICAgICAgICBpbXBvcnQgeG1sCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdFVudGVzdGVkTW9kdWxlcykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VuZHJ5LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmRyeS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2OTZmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmRyeS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VuZHJ5LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmRyeS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ2OTZmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmRyeS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VwcG9ydC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1cHBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExY2FjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1cHBvcnQucHkKQEAgLTAsMCArMSwxMzY3IEBACisiIiJTdXBwb3J0aW5nIGRlZmluaXRpb25zIGZvciB0aGUgUHl0aG9uIHJlZ3Jlc3Npb24gdGVzdHMuIiIiCisKK2lmIF9fbmFtZV9fICE9ICd0ZXN0LnRlc3Rfc3VwcG9ydCc6CisgICAgcmFpc2UgSW1wb3J0RXJyb3IoJ3Rlc3Rfc3VwcG9ydCBtdXN0IGJlIGltcG9ydGVkIGZyb20gdGhlIHRlc3QgcGFja2FnZScpCisKK2ltcG9ydCBjb250ZXh0bGliCitpbXBvcnQgZXJybm8KK2ltcG9ydCBmdW5jdG9vbHMKK2ltcG9ydCBnYworaW1wb3J0IHNvY2tldAoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCB3YXJuaW5ncworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgaW1wb3J0bGliCitpbXBvcnQgVXNlckRpY3QKK2ltcG9ydCByZQoraW1wb3J0IHRpbWUKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBfdGVzdGNhcGkKK2ltcG9ydCBzeXNjb25maWcKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkID0gTm9uZQorCitfX2FsbF9fID0gWyJFcnJvciIsICJUZXN0RmFpbGVkIiwgIlJlc291cmNlRGVuaWVkIiwgImltcG9ydF9tb2R1bGUiLAorICAgICAgICAgICAidmVyYm9zZSIsICJ1c2VfcmVzb3VyY2VzIiwgIm1heF9tZW11c2UiLCAicmVjb3JkX29yaWdpbmFsX3N0ZG91dCIsCisgICAgICAgICAgICJnZXRfb3JpZ2luYWxfc3Rkb3V0IiwgInVubG9hZCIsICJ1bmxpbmsiLCAicm10cmVlIiwgImZvcmdldCIsCisgICAgICAgICAgICJpc19yZXNvdXJjZV9lbmFibGVkIiwgInJlcXVpcmVzIiwgImZpbmRfdW51c2VkX3BvcnQiLCAiYmluZF9wb3J0IiwKKyAgICAgICAgICAgImZjbXAiLCAiaGF2ZV91bmljb2RlIiwgImlzX2p5dGhvbiIsICJURVNURk4iLCAiSE9TVCIsICJGVVpaIiwKKyAgICAgICAgICAgIlNBVkVEQ1dEIiwgInRlbXBfY3dkIiwgImZpbmRmaWxlIiwgInNvcnRkaWN0IiwgImNoZWNrX3N5bnRheF9lcnJvciIsCisgICAgICAgICAgICJvcGVuX3VybHJlc291cmNlIiwgImNoZWNrX3dhcm5pbmdzIiwgImNoZWNrX3B5M2tfd2FybmluZ3MiLAorICAgICAgICAgICAiQ2xlYW5JbXBvcnQiLCAiRW52aXJvbm1lbnRWYXJHdWFyZCIsICJjYXB0dXJlZF9vdXRwdXQiLAorICAgICAgICAgICAiY2FwdHVyZWRfc3Rkb3V0IiwgIlRyYW5zaWVudFJlc291cmNlIiwgInRyYW5zaWVudF9pbnRlcm5ldCIsCisgICAgICAgICAgICJydW5fd2l0aF9sb2NhbGUiLCAic2V0X21lbWxpbWl0IiwgImJpZ21lbXRlc3QiLCAiYmlnYWRkcnNwYWNldGVzdCIsCisgICAgICAgICAgICJCYXNpY1Rlc3RSdW5uZXIiLCAicnVuX3VuaXR0ZXN0IiwgInJ1bl9kb2N0ZXN0IiwgInRocmVhZGluZ19zZXR1cCIsCisgICAgICAgICAgICJ0aHJlYWRpbmdfY2xlYW51cCIsICJyZWFwX2NoaWxkcmVuIiwgImNweXRob25fb25seSIsCisgICAgICAgICAgICJjaGVja19pbXBsX2RldGFpbCIsICJnZXRfYXR0cmlidXRlIiwgInB5M2tfYnl0ZXMiLAorICAgICAgICAgICAiaW1wb3J0X2ZyZXNoX21vZHVsZSIsICJ0aHJlYWRpbmdfY2xlYW51cCIsICJyZWFwX2NoaWxkcmVuIiwKKyAgICAgICAgICAgInN0cmlwX3B5dGhvbl9zdGRlcnIiXQorCitjbGFzcyBFcnJvcihFeGNlcHRpb24pOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIHJlZ3Jlc3Npb24gdGVzdCBleGNlcHRpb25zLiIiIgorCitjbGFzcyBUZXN0RmFpbGVkKEVycm9yKToKKyAgICAiIiJUZXN0IGZhaWxlZC4iIiIKKworY2xhc3MgUmVzb3VyY2VEZW5pZWQodW5pdHRlc3QuU2tpcFRlc3QpOgorICAgICIiIlRlc3Qgc2tpcHBlZCBiZWNhdXNlIGl0IHJlcXVlc3RlZCBhIGRpc2FsbG93ZWQgcmVzb3VyY2UuCisKKyAgICBUaGlzIGlzIHJhaXNlZCB3aGVuIGEgdGVzdCBjYWxscyByZXF1aXJlcygpIGZvciBhIHJlc291cmNlIHRoYXQKKyAgICBoYXMgbm90IGJlZW4gZW5hYmxlZC4gIEl0IGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBleHBlY3RlZAorICAgIGFuZCB1bmV4cGVjdGVkIHNraXBzLgorICAgICIiIgorCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIF9pZ25vcmVfZGVwcmVjYXRlZF9pbXBvcnRzKGlnbm9yZT1UcnVlKToKKyAgICAiIiJDb250ZXh0IG1hbmFnZXIgdG8gc3VwcHJlc3MgcGFja2FnZSBhbmQgbW9kdWxlIGRlcHJlY2F0aW9uCisgICAgd2FybmluZ3Mgd2hlbiBpbXBvcnRpbmcgdGhlbS4KKworICAgIElmIGlnbm9yZSBpcyBGYWxzZSwgdGhpcyBjb250ZXh0IG1hbmFnZXIgaGFzIG5vIGVmZmVjdC4iIiIKKyAgICBpZiBpZ25vcmU6CisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLisgKG1vZHVsZXxwYWNrYWdlKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICB5aWVsZAorICAgIGVsc2U6CisgICAgICAgIHlpZWxkCisKKworZGVmIGltcG9ydF9tb2R1bGUobmFtZSwgZGVwcmVjYXRlZD1GYWxzZSk6CisgICAgIiIiSW1wb3J0IGFuZCByZXR1cm4gdGhlIG1vZHVsZSB0byBiZSB0ZXN0ZWQsIHJhaXNpbmcgU2tpcFRlc3QgaWYKKyAgICBpdCBpcyBub3QgYXZhaWxhYmxlLgorCisgICAgSWYgZGVwcmVjYXRlZCBpcyBUcnVlLCBhbnkgbW9kdWxlIG9yIHBhY2thZ2UgZGVwcmVjYXRpb24gbWVzc2FnZXMKKyAgICB3aWxsIGJlIHN1cHByZXNzZWQuIiIiCisgICAgd2l0aCBfaWdub3JlX2RlcHJlY2F0ZWRfaW1wb3J0cyhkZXByZWNhdGVkKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKG5hbWUpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgbXNnOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3Qoc3RyKG1zZykpCisKKworZGVmIF9zYXZlX2FuZF9yZW1vdmVfbW9kdWxlKG5hbWUsIG9yaWdfbW9kdWxlcyk6CisgICAgIiIiSGVscGVyIGZ1bmN0aW9uIHRvIHNhdmUgYW5kIHJlbW92ZSBhIG1vZHVsZSBmcm9tIHN5cy5tb2R1bGVzCisKKyAgICAgICBSYWlzZSBJbXBvcnRFcnJvciBpZiB0aGUgbW9kdWxlIGNhbid0IGJlIGltcG9ydGVkLiIiIgorICAgICMgdHJ5IHRvIGltcG9ydCB0aGUgbW9kdWxlIGFuZCByYWlzZSBhbiBlcnJvciBpZiBpdCBjYW4ndCBiZSBpbXBvcnRlZAorICAgIGlmIG5hbWUgbm90IGluIHN5cy5tb2R1bGVzOgorICAgICAgICBfX2ltcG9ydF9fKG5hbWUpCisgICAgICAgIGRlbCBzeXMubW9kdWxlc1tuYW1lXQorICAgIGZvciBtb2RuYW1lIGluIGxpc3Qoc3lzLm1vZHVsZXMpOgorICAgICAgICBpZiBtb2RuYW1lID09IG5hbWUgb3IgbW9kbmFtZS5zdGFydHN3aXRoKG5hbWUgKyAnLicpOgorICAgICAgICAgICAgb3JpZ19tb2R1bGVzW21vZG5hbWVdID0gc3lzLm1vZHVsZXNbbW9kbmFtZV0KKyAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1ttb2RuYW1lXQorCitkZWYgX3NhdmVfYW5kX2Jsb2NrX21vZHVsZShuYW1lLCBvcmlnX21vZHVsZXMpOgorICAgICIiIkhlbHBlciBmdW5jdGlvbiB0byBzYXZlIGFuZCBibG9jayBhIG1vZHVsZSBpbiBzeXMubW9kdWxlcworCisgICAgICAgUmV0dXJuIFRydWUgaWYgdGhlIG1vZHVsZSB3YXMgaW4gc3lzLm1vZHVsZXMsIEZhbHNlIG90aGVyd2lzZS4iIiIKKyAgICBzYXZlZCA9IFRydWUKKyAgICB0cnk6CisgICAgICAgIG9yaWdfbW9kdWxlc1tuYW1lXSA9IHN5cy5tb2R1bGVzW25hbWVdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBzYXZlZCA9IEZhbHNlCisgICAgc3lzLm1vZHVsZXNbbmFtZV0gPSBOb25lCisgICAgcmV0dXJuIHNhdmVkCisKKworZGVmIGltcG9ydF9mcmVzaF9tb2R1bGUobmFtZSwgZnJlc2g9KCksIGJsb2NrZWQ9KCksIGRlcHJlY2F0ZWQ9RmFsc2UpOgorICAgICIiIkltcG9ydHMgYW5kIHJldHVybnMgYSBtb2R1bGUsIGRlbGliZXJhdGVseSBieXBhc3NpbmcgdGhlIHN5cy5tb2R1bGVzIGNhY2hlCisgICAgYW5kIGltcG9ydGluZyBhIGZyZXNoIGNvcHkgb2YgdGhlIG1vZHVsZS4gT25jZSB0aGUgaW1wb3J0IGlzIGNvbXBsZXRlLAorICAgIHRoZSBzeXMubW9kdWxlcyBjYWNoZSBpcyByZXN0b3JlZCB0byBpdHMgb3JpZ2luYWwgc3RhdGUuCisKKyAgICBNb2R1bGVzIG5hbWVkIGluIGZyZXNoIGFyZSBhbHNvIGltcG9ydGVkIGFuZXcgaWYgbmVlZGVkIGJ5IHRoZSBpbXBvcnQuCisgICAgSWYgb25lIG9mIHRoZXNlIG1vZHVsZXMgY2FuJ3QgYmUgaW1wb3J0ZWQsIE5vbmUgaXMgcmV0dXJuZWQuCisKKyAgICBJbXBvcnRpbmcgb2YgbW9kdWxlcyBuYW1lZCBpbiBibG9ja2VkIGlzIHByZXZlbnRlZCB3aGlsZSB0aGUgZnJlc2ggaW1wb3J0CisgICAgdGFrZXMgcGxhY2UuCisKKyAgICBJZiBkZXByZWNhdGVkIGlzIFRydWUsIGFueSBtb2R1bGUgb3IgcGFja2FnZSBkZXByZWNhdGlvbiBtZXNzYWdlcworICAgIHdpbGwgYmUgc3VwcHJlc3NlZC4iIiIKKyAgICAjIE5PVEU6IHRlc3RfaGVhcHEsIHRlc3RfanNvbiwgYW5kIHRlc3Rfd2FybmluZ3MgaW5jbHVkZSBleHRyYSBzYW5pdHkKKyAgICAjIGNoZWNrcyB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIHV0aWxpdHkgZnVuY3Rpb24gaXMgd29ya2luZyBhcyBleHBlY3RlZAorICAgIHdpdGggX2lnbm9yZV9kZXByZWNhdGVkX2ltcG9ydHMoZGVwcmVjYXRlZCk6CisgICAgICAgICMgS2VlcCB0cmFjayBvZiBtb2R1bGVzIHNhdmVkIGZvciBsYXRlciByZXN0b3JhdGlvbiBhcyB3ZWxsCisgICAgICAgICMgYXMgdGhvc2Ugd2hpY2gganVzdCBuZWVkIGEgYmxvY2tpbmcgZW50cnkgcmVtb3ZlZAorICAgICAgICBvcmlnX21vZHVsZXMgPSB7fQorICAgICAgICBuYW1lc190b19yZW1vdmUgPSBbXQorICAgICAgICBfc2F2ZV9hbmRfcmVtb3ZlX21vZHVsZShuYW1lLCBvcmlnX21vZHVsZXMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBmcmVzaF9uYW1lIGluIGZyZXNoOgorICAgICAgICAgICAgICAgIF9zYXZlX2FuZF9yZW1vdmVfbW9kdWxlKGZyZXNoX25hbWUsIG9yaWdfbW9kdWxlcykKKyAgICAgICAgICAgIGZvciBibG9ja2VkX25hbWUgaW4gYmxvY2tlZDoKKyAgICAgICAgICAgICAgICBpZiBub3QgX3NhdmVfYW5kX2Jsb2NrX21vZHVsZShibG9ja2VkX25hbWUsIG9yaWdfbW9kdWxlcyk6CisgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvX3JlbW92ZS5hcHBlbmQoYmxvY2tlZF9uYW1lKQorICAgICAgICAgICAgZnJlc2hfbW9kdWxlID0gaW1wb3J0bGliLmltcG9ydF9tb2R1bGUobmFtZSkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZnJlc2hfbW9kdWxlID0gTm9uZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm9yIG9yaWdfbmFtZSwgbW9kdWxlIGluIG9yaWdfbW9kdWxlcy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHN5cy5tb2R1bGVzW29yaWdfbmFtZV0gPSBtb2R1bGUKKyAgICAgICAgICAgIGZvciBuYW1lX3RvX3JlbW92ZSBpbiBuYW1lc190b19yZW1vdmU6CisgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW25hbWVfdG9fcmVtb3ZlXQorICAgICAgICByZXR1cm4gZnJlc2hfbW9kdWxlCisKKworZGVmIGdldF9hdHRyaWJ1dGUob2JqLCBuYW1lKToKKyAgICAiIiJHZXQgYW4gYXR0cmlidXRlLCByYWlzaW5nIFNraXBUZXN0IGlmIEF0dHJpYnV0ZUVycm9yIGlzIHJhaXNlZC4iIiIKKyAgICB0cnk6CisgICAgICAgIGF0dHJpYnV0ZSA9IGdldGF0dHIob2JqLCBuYW1lKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIm1vZHVsZSAlcyBoYXMgbm8gYXR0cmlidXRlICVzIiAlICgKKyAgICAgICAgICAgIG9iai5fX25hbWVfXywgbmFtZSkpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZQorCisKK3ZlcmJvc2UgPSAxICAgICAgICAgICAgICAjIEZsYWcgc2V0IHRvIDAgYnkgcmVncnRlc3QucHkKK3VzZV9yZXNvdXJjZXMgPSBOb25lICAgICAjIEZsYWcgc2V0IHRvIFtdIGJ5IHJlZ3J0ZXN0LnB5CittYXhfbWVtdXNlID0gMCAgICAgICAgICAgIyBEaXNhYmxlIGJpZ21lbSB0ZXN0cyAodGhleSB3aWxsIHN0aWxsIGJlIHJ1biB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgIyBzbWFsbCBzaXplcywgdG8gbWFrZSBzdXJlIHRoZXkgd29yay4pCityZWFsX21heF9tZW11c2UgPSAwCisKKyMgX29yaWdpbmFsX3N0ZG91dCBpcyBtZWFudCB0byBob2xkIHN0ZG91dCBhdCB0aGUgdGltZSByZWdydGVzdCBiZWdhbi4KKyMgVGhpcyBtYXkgYmUgInRoZSByZWFsIiBzdGRvdXQsIG9yIElETEUncyBlbXVsYXRpb24gb2Ygc3Rkb3V0LCBvciB3aGF0ZXZlci4KKyMgVGhlIHBvaW50IGlzIHRvIGhhdmUgc29tZSBmbGF2b3Igb2Ygc3Rkb3V0IHRoZSB1c2VyIGNhbiBhY3R1YWxseSBzZWUuCitfb3JpZ2luYWxfc3Rkb3V0ID0gTm9uZQorZGVmIHJlY29yZF9vcmlnaW5hbF9zdGRvdXQoc3Rkb3V0KToKKyAgICBnbG9iYWwgX29yaWdpbmFsX3N0ZG91dAorICAgIF9vcmlnaW5hbF9zdGRvdXQgPSBzdGRvdXQKKworZGVmIGdldF9vcmlnaW5hbF9zdGRvdXQoKToKKyAgICByZXR1cm4gX29yaWdpbmFsX3N0ZG91dCBvciBzeXMuc3Rkb3V0CisKK2RlZiB1bmxvYWQobmFtZSk6CisgICAgdHJ5OgorICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbmFtZV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHBhc3MKKworaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpOgorICAgIGRlZiBfd2FpdGZvcihmdW5jLCBwYXRobmFtZSwgd2FpdGFsbD1GYWxzZSk6CisgICAgICAgICMgUGVmb3JtIHRoZSBvcGVyYXRpb24KKyAgICAgICAgZnVuYyhwYXRobmFtZSkKKyAgICAgICAgIyBOb3cgc2V0dXAgdGhlIHdhaXQgbG9vcAorICAgICAgICBpZiB3YWl0YWxsOgorICAgICAgICAgICAgZGlybmFtZSA9IHBhdGhuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkaXJuYW1lLCBuYW1lID0gb3MucGF0aC5zcGxpdChwYXRobmFtZSkKKyAgICAgICAgICAgIGRpcm5hbWUgPSBkaXJuYW1lIG9yICcuJworICAgICAgICAjIENoZWNrIGZvciBgcGF0aG5hbWVgIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgZmlsZXN5c3RlbS4KKyAgICAgICAgIyBUaGUgZXhwb25lbnRpYWwgYmFja29mZiBvZiB0aGUgdGltZW91dCBhbW91bnRzIHRvIGEgdG90YWwKKyAgICAgICAgIyBvZiB+MSBzZWNvbmQgYWZ0ZXIgd2hpY2ggdGhlIGRlbGV0aW9uIGlzIHByb2JhYmx5IGFuIGVycm9yCisgICAgICAgICMgYW55d2F5LgorICAgICAgICAjIFRlc3Rpbmcgb24gYSBpN0A0LjNHSHogc2hvd3MgdGhhdCB1c3VhbGx5IG9ubHkgMSBpdGVyYXRpb24gaXMKKyAgICAgICAgIyByZXF1aXJlZCB3aGVuIGNvbnRlbnRpb24gb2NjdXJzLgorICAgICAgICB0aW1lb3V0ID0gMC4wMDEKKyAgICAgICAgd2hpbGUgdGltZW91dCA8IDEuMDoKKyAgICAgICAgICAgICMgTm90ZSB3ZSBhcmUgb25seSB0ZXN0aW5nIGZvciB0aGUgZXhpc3RhbmNlIG9mIHRoZSBmaWxlKHMpIGluCisgICAgICAgICAgICAjIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IHJlZ2FyZGxlc3Mgb2YgYW55IHNlY3VyaXR5IG9yCisgICAgICAgICAgICAjIGFjY2VzcyByaWdodHMuICBJZiB3ZSBoYXZlIG1hZGUgaXQgdGhpcyBmYXIsIHdlIGhhdmUgc3VmZmljaWVudAorICAgICAgICAgICAgIyBwZXJtaXNzaW9ucyB0byBkbyB0aGF0IG11Y2ggdXNpbmcgUHl0aG9uJ3MgZXF1aXZhbGVudCBvZiB0aGUKKyAgICAgICAgICAgICMgV2luZG93cyBBUEkgRmluZEZpcnN0RmlsZS4KKyAgICAgICAgICAgICMgT3RoZXIgV2luZG93cyBBUElzIGNhbiBmYWlsIG9yIGdpdmUgaW5jb3JyZWN0IHJlc3VsdHMgd2hlbgorICAgICAgICAgICAgIyBkZWFsaW5nIHdpdGggZmlsZXMgdGhhdCBhcmUgcGVuZGluZyBkZWxldGlvbi4KKyAgICAgICAgICAgIEwgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCisgICAgICAgICAgICBpZiBub3QgKEwgaWYgd2FpdGFsbCBlbHNlIG5hbWUgaW4gTCk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAjIEluY3JlYXNlIHRoZSB0aW1lb3V0IGFuZCB0cnkgYWdhaW4KKyAgICAgICAgICAgIHRpbWUuc2xlZXAodGltZW91dCkKKyAgICAgICAgICAgIHRpbWVvdXQgKj0gMgorICAgICAgICB3YXJuaW5ncy53YXJuKCd0ZXN0cyBtYXkgZmFpbCwgZGVsZXRlIHN0aWxsIHBlbmRpbmcgZm9yICcgKyBwYXRobmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lV2FybmluZywgc3RhY2tsZXZlbD00KQorCisgICAgZGVmIF91bmxpbmsoZmlsZW5hbWUpOgorICAgICAgICBfd2FpdGZvcihvcy51bmxpbmssIGZpbGVuYW1lKQorCisgICAgZGVmIF9ybWRpcihkaXJuYW1lKToKKyAgICAgICAgX3dhaXRmb3Iob3Mucm1kaXIsIGRpcm5hbWUpCisKKyAgICBkZWYgX3JtdHJlZShwYXRoKToKKyAgICAgICAgZGVmIF9ybXRyZWVfaW5uZXIocGF0aCk6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBvcy5saXN0ZGlyKHBhdGgpOgorICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHBhdGgsIG5hbWUpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIF93YWl0Zm9yKF9ybXRyZWVfaW5uZXIsIGZ1bGxuYW1lLCB3YWl0YWxsPVRydWUpCisgICAgICAgICAgICAgICAgICAgIG9zLnJtZGlyKGZ1bGxuYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmdWxsbmFtZSkKKyAgICAgICAgX3dhaXRmb3IoX3JtdHJlZV9pbm5lciwgcGF0aCwgd2FpdGFsbD1UcnVlKQorICAgICAgICBfd2FpdGZvcihvcy5ybWRpciwgcGF0aCkKK2Vsc2U6CisgICAgX3VubGluayA9IG9zLnVubGluaworICAgIF9ybWRpciA9IG9zLnJtZGlyCisgICAgX3JtdHJlZSA9IHNodXRpbC5ybXRyZWUKKworZGVmIHVubGluayhmaWxlbmFtZSk6CisgICAgdHJ5OgorICAgICAgICBfdW5saW5rKGZpbGVuYW1lKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBwYXNzCisKK2RlZiBybWRpcihkaXJuYW1lKToKKyAgICB0cnk6CisgICAgICAgIF9ybWRpcihkaXJuYW1lKQorICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGVycm9yOgorICAgICAgICAjIFRoZSBkaXJlY3RvcnkgbmVlZCBub3QgZXhpc3QuCisgICAgICAgIGlmIGVycm9yLmVycm5vICE9IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgIHJhaXNlCisKK2RlZiBybXRyZWUocGF0aCk6CisgICAgdHJ5OgorICAgICAgICBfcm10cmVlKHBhdGgpCisgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICMgVW5peCByZXR1cm5zIEVOT0VOVCwgV2luZG93cyByZXR1cm5zIEVTUkNILgorICAgICAgICBpZiBlLmVycm5vIG5vdCBpbiAoZXJybm8uRU5PRU5ULCBlcnJuby5FU1JDSCk6CisgICAgICAgICAgICByYWlzZQorCitkZWYgZm9yZ2V0KG1vZG5hbWUpOgorICAgICcnJyJGb3JnZXQiIGEgbW9kdWxlIHdhcyBldmVyIGltcG9ydGVkIGJ5IHJlbW92aW5nIGl0IGZyb20gc3lzLm1vZHVsZXMgYW5kCisgICAgZGVsZXRpbmcgYW55IC5weWMgYW5kIC5weW8gZmlsZXMuJycnCisgICAgdW5sb2FkKG1vZG5hbWUpCisgICAgZm9yIGRpcm5hbWUgaW4gc3lzLnBhdGg6CisgICAgICAgIHVubGluayhvcy5wYXRoLmpvaW4oZGlybmFtZSwgbW9kbmFtZSArIG9zLmV4dHNlcCArICdweWMnKSkKKyAgICAgICAgIyBEZWxldGluZyB0aGUgLnB5byBmaWxlIGNhbm5vdCBiZSB3aXRoaW4gdGhlICd0cnknIGZvciB0aGUgLnB5YyBzaW5jZQorICAgICAgICAjIHRoZSBjaGFuY2UgZXhpc3RzIHRoYXQgdGhlcmUgaXMgbm8gLnB5YyAoYW5kIHRodXMgdGhlICd0cnknIHN0YXRlbWVudAorICAgICAgICAjIGlzIGV4aXRlZCkgYnV0IHRoZXJlIGlzIGEgLnB5byBmaWxlLgorICAgICAgICB1bmxpbmsob3MucGF0aC5qb2luKGRpcm5hbWUsIG1vZG5hbWUgKyBvcy5leHRzZXAgKyAncHlvJykpCisKK2RlZiBpc19yZXNvdXJjZV9lbmFibGVkKHJlc291cmNlKToKKyAgICAiIiJUZXN0IHdoZXRoZXIgYSByZXNvdXJjZSBpcyBlbmFibGVkLiAgS25vd24gcmVzb3VyY2VzIGFyZSBzZXQgYnkKKyAgICByZWdydGVzdC5weS4iIiIKKyAgICByZXR1cm4gdXNlX3Jlc291cmNlcyBpcyBub3QgTm9uZSBhbmQgcmVzb3VyY2UgaW4gdXNlX3Jlc291cmNlcworCitkZWYgcmVxdWlyZXMocmVzb3VyY2UsIG1zZz1Ob25lKToKKyAgICAiIiJSYWlzZSBSZXNvdXJjZURlbmllZCBpZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGlzIG5vdCBhdmFpbGFibGUuCisKKyAgICBJZiB0aGUgY2FsbGVyJ3MgbW9kdWxlIGlzIF9fbWFpbl9fIHRoZW4gYXV0b21hdGljYWxseSByZXR1cm4gVHJ1ZS4gIFRoZQorICAgIHBvc3NpYmlsaXR5IG9mIEZhbHNlIGJlaW5nIHJldHVybmVkIG9jY3VycyB3aGVuIHJlZ3J0ZXN0LnB5IGlzIGV4ZWN1dGluZy4iIiIKKyAgICAjIHNlZSBpZiB0aGUgY2FsbGVyJ3MgbW9kdWxlIGlzIF9fbWFpbl9fIC0gaWYgc28sIHRyZWF0IGFzIGlmCisgICAgIyB0aGUgcmVzb3VyY2Ugd2FzIHNldAorICAgIGlmIHN5cy5fZ2V0ZnJhbWUoMSkuZl9nbG9iYWxzLmdldCgiX19uYW1lX18iKSA9PSAiX19tYWluX18iOgorICAgICAgICByZXR1cm4KKyAgICBpZiBub3QgaXNfcmVzb3VyY2VfZW5hYmxlZChyZXNvdXJjZSk6CisgICAgICAgIGlmIG1zZyBpcyBOb25lOgorICAgICAgICAgICAgbXNnID0gIlVzZSBvZiB0aGUgYCVzJyByZXNvdXJjZSBub3QgZW5hYmxlZCIgJSByZXNvdXJjZQorICAgICAgICByYWlzZSBSZXNvdXJjZURlbmllZChtc2cpCisKK0hPU1QgPSAnbG9jYWxob3N0JworCitkZWYgZmluZF91bnVzZWRfcG9ydChmYW1pbHk9c29ja2V0LkFGX0lORVQsIHNvY2t0eXBlPXNvY2tldC5TT0NLX1NUUkVBTSk6CisgICAgIiIiUmV0dXJucyBhbiB1bnVzZWQgcG9ydCB0aGF0IHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgYmluZGluZy4gIFRoaXMgaXMKKyAgICBhY2hpZXZlZCBieSBjcmVhdGluZyBhIHRlbXBvcmFyeSBzb2NrZXQgd2l0aCB0aGUgc2FtZSBmYW1pbHkgYW5kIHR5cGUgYXMKKyAgICB0aGUgJ3NvY2snIHBhcmFtZXRlciAoZGVmYXVsdCBpcyBBRl9JTkVULCBTT0NLX1NUUkVBTSksIGFuZCBiaW5kaW5nIGl0IHRvCisgICAgdGhlIHNwZWNpZmllZCBob3N0IGFkZHJlc3MgKGRlZmF1bHRzIHRvIDAuMC4wLjApIHdpdGggdGhlIHBvcnQgc2V0IHRvIDAsCisgICAgZWxpY2l0aW5nIGFuIHVudXNlZCBlcGhlbWVyYWwgcG9ydCBmcm9tIHRoZSBPUy4gIFRoZSB0ZW1wb3Jhcnkgc29ja2V0IGlzCisgICAgdGhlbiBjbG9zZWQgYW5kIGRlbGV0ZWQsIGFuZCB0aGUgZXBoZW1lcmFsIHBvcnQgaXMgcmV0dXJuZWQuCisKKyAgICBFaXRoZXIgdGhpcyBtZXRob2Qgb3IgYmluZF9wb3J0KCkgc2hvdWxkIGJlIHVzZWQgZm9yIGFueSB0ZXN0cyB3aGVyZSBhCisgICAgc2VydmVyIHNvY2tldCBuZWVkcyB0byBiZSBib3VuZCB0byBhIHBhcnRpY3VsYXIgcG9ydCBmb3IgdGhlIGR1cmF0aW9uIG9mCisgICAgdGhlIHRlc3QuICBXaGljaCBvbmUgdG8gdXNlIGRlcGVuZHMgb24gd2hldGhlciB0aGUgY2FsbGluZyBjb2RlIGlzIGNyZWF0aW5nCisgICAgYSBweXRob24gc29ja2V0LCBvciBpZiBhbiB1bnVzZWQgcG9ydCBuZWVkcyB0byBiZSBwcm92aWRlZCBpbiBhIGNvbnN0cnVjdG9yCisgICAgb3IgcGFzc2VkIHRvIGFuIGV4dGVybmFsIHByb2dyYW0gKGkuZS4gdGhlIC1hY2NlcHQgYXJndW1lbnQgdG8gb3BlbnNzbCdzCisgICAgc19zZXJ2ZXIgbW9kZSkuICBBbHdheXMgcHJlZmVyIGJpbmRfcG9ydCgpIG92ZXIgZmluZF91bnVzZWRfcG9ydCgpIHdoZXJlCisgICAgcG9zc2libGUuICBIYXJkIGNvZGVkIHBvcnRzIHNob3VsZCAqTkVWRVIqIGJlIHVzZWQuICBBcyBzb29uIGFzIGEgc2VydmVyCisgICAgc29ja2V0IGlzIGJvdW5kIHRvIGEgaGFyZCBjb2RlZCBwb3J0LCB0aGUgYWJpbGl0eSB0byBydW4gbXVsdGlwbGUgaW5zdGFuY2VzCisgICAgb2YgdGhlIHRlc3Qgc2ltdWx0YW5lb3VzbHkgb24gdGhlIHNhbWUgaG9zdCBpcyBjb21wcm9taXNlZCwgd2hpY2ggbWFrZXMgdGhlCisgICAgdGVzdCBhIHRpY2tpbmcgdGltZSBib21iIGluIGEgYnVpbGRib3QgZW52aXJvbm1lbnQuIE9uIFVuaXggYnVpbGRib3RzLCB0aGlzCisgICAgbWF5IHNpbXBseSBtYW5pZmVzdCBhcyBhIGZhaWxlZCB0ZXN0LCB3aGljaCBjYW4gYmUgcmVjb3ZlcmVkIGZyb20gd2l0aG91dAorICAgIGludGVydmVudGlvbiBpbiBtb3N0IGNhc2VzLCBidXQgb24gV2luZG93cywgdGhlIGVudGlyZSBweXRob24gcHJvY2VzcyBjYW4KKyAgICBjb21wbGV0ZWx5IGFuZCB1dHRlcmx5IHdlZGdlLCByZXF1aXJpbmcgc29tZW9uZSB0byBsb2cgaW4gdG8gdGhlIGJ1aWxkYm90CisgICAgYW5kIG1hbnVhbGx5IGtpbGwgdGhlIGFmZmVjdGVkIHByb2Nlc3MuCisKKyAgICAoVGhpcyBpcyBlYXN5IHRvIHJlcHJvZHVjZSBvbiBXaW5kb3dzLCB1bmZvcnR1bmF0ZWx5LCBhbmQgY2FuIGJlIHRyYWNlZCB0bworICAgIHRoZSBTT19SRVVTRUFERFIgc29ja2V0IG9wdGlvbiBoYXZpbmcgZGlmZmVyZW50IHNlbWFudGljcyBvbiBXaW5kb3dzIHZlcnN1cworICAgIFVuaXgvTGludXguICBPbiBVbml4LCB5b3UgY2FuJ3QgaGF2ZSB0d28gQUZfSU5FVCBTT0NLX1NUUkVBTSBzb2NrZXRzIGJpbmQsCisgICAgbGlzdGVuIGFuZCB0aGVuIGFjY2VwdCBjb25uZWN0aW9ucyBvbiBpZGVudGljYWwgaG9zdC9wb3J0cy4gIEFuIEVBRERSSU5VU0UKKyAgICBzb2NrZXQuZXJyb3Igd2lsbCBiZSByYWlzZWQgYXQgc29tZSBwb2ludCAoZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSBhbmQKKyAgICB0aGUgb3JkZXIgYmluZCBhbmQgbGlzdGVuIHdlcmUgY2FsbGVkIG9uIGVhY2ggc29ja2V0KS4KKworICAgIEhvd2V2ZXIsIG9uIFdpbmRvd3MsIGlmIFNPX1JFVVNFQUREUiBpcyBzZXQgb24gdGhlIHNvY2tldHMsIG5vIEVBRERSSU5VU0UKKyAgICB3aWxsIGV2ZXIgYmUgcmFpc2VkIHdoZW4gYXR0ZW1wdGluZyB0byBiaW5kIHR3byBpZGVudGljYWwgaG9zdC9wb3J0cy4gV2hlbgorICAgIGFjY2VwdCgpIGlzIGNhbGxlZCBvbiBlYWNoIHNvY2tldCwgdGhlIHNlY29uZCBjYWxsZXIncyBwcm9jZXNzIHdpbGwgc3RlYWwKKyAgICB0aGUgcG9ydCBmcm9tIHRoZSBmaXJzdCBjYWxsZXIsIGxlYXZpbmcgdGhlbSBib3RoIGluIGFuIGF3a3dhcmRseSB3ZWRnZWQKKyAgICBzdGF0ZSB3aGVyZSB0aGV5J2xsIG5vIGxvbmdlciByZXNwb25kIHRvIGFueSBzaWduYWxzIG9yIGdyYWNlZnVsIGtpbGxzLCBhbmQKKyAgICBtdXN0IGJlIGZvcmNpYmx5IGtpbGxlZCB2aWEgT3BlblByb2Nlc3MoKS9UZXJtaW5hdGVQcm9jZXNzKCkuCisKKyAgICBUaGUgc29sdXRpb24gb24gV2luZG93cyBpcyB0byB1c2UgdGhlIFNPX0VYQ0xVU0lWRUFERFJVU0Ugc29ja2V0IG9wdGlvbgorICAgIGluc3RlYWQgb2YgU09fUkVVU0VBRERSLCB3aGljaCBlZmZlY3RpdmVseSBhZmZvcmRzIHRoZSBzYW1lIHNlbWFudGljcyBhcworICAgIFNPX1JFVVNFQUREUiBvbiBVbml4LiAgR2l2ZW4gdGhlIHByb3BlbnNpdHkgb2YgVW5peCBkZXZlbG9wZXJzIGluIHRoZSBPcGVuCisgICAgU291cmNlIHdvcmxkIGNvbXBhcmVkIHRvIFdpbmRvd3Mgb25lcywgdGhpcyBpcyBhIGNvbW1vbiBtaXN0YWtlLiAgQSBxdWljaworICAgIGxvb2sgb3ZlciBPcGVuU1NMJ3MgMC45LjhnIHNvdXJjZSBzaG93cyB0aGF0IHRoZXkgdXNlIFNPX1JFVVNFQUREUiB3aGVuCisgICAgb3BlbnNzbC5leGUgaXMgY2FsbGVkIHdpdGggdGhlICdzX3NlcnZlcicgb3B0aW9uLCBmb3IgZXhhbXBsZS4gU2VlCisgICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI1NTAgZm9yIG1vcmUgaW5mby4gIFRoZSBmb2xsb3dpbmcgc2l0ZSBhbHNvCisgICAgaGFzIGEgdmVyeSB0aG9yb3VnaCBkZXNjcmlwdGlvbiBhYm91dCB0aGUgaW1wbGljYXRpb25zIG9mIGJvdGggUkVVU0VBRERSCisgICAgYW5kIEVYQ0xVU0lWRUFERFJVU0Ugb24gV2luZG93czoKKyAgICBodHRwOi8vbXNkbjIubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNzQwNjIxKFZTLjg1KS5hc3B4KQorCisgICAgWFhYOiBhbHRob3VnaCB0aGlzIGFwcHJvYWNoIGlzIGEgdmFzdCBpbXByb3ZlbWVudCBvbiBwcmV2aW91cyBhdHRlbXB0cyB0bworICAgIGVsaWNpdCB1bnVzZWQgcG9ydHMsIGl0IHJlc3RzIGhlYXZpbHkgb24gdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgZXBoZW1lcmFsCisgICAgcG9ydCByZXR1cm5lZCB0byB1cyBieSB0aGUgT1Mgd29uJ3QgaW1tZWRpYXRlbHkgYmUgZGlzaGVkIGJhY2sgb3V0IHRvIHNvbWUKKyAgICBvdGhlciBwcm9jZXNzIHdoZW4gd2UgY2xvc2UgYW5kIGRlbGV0ZSBvdXIgdGVtcG9yYXJ5IHNvY2tldCBidXQgYmVmb3JlIG91cgorICAgIGNhbGxpbmcgY29kZSBoYXMgYSBjaGFuY2UgdG8gYmluZCB0aGUgcmV0dXJuZWQgcG9ydC4gIFdlIGNhbiBkZWFsIHdpdGggdGhpcworICAgIGlzc3VlIGlmL3doZW4gd2UgY29tZSBhY3Jvc3MgaXQuIiIiCisgICAgdGVtcHNvY2sgPSBzb2NrZXQuc29ja2V0KGZhbWlseSwgc29ja3R5cGUpCisgICAgcG9ydCA9IGJpbmRfcG9ydCh0ZW1wc29jaykKKyAgICB0ZW1wc29jay5jbG9zZSgpCisgICAgZGVsIHRlbXBzb2NrCisgICAgcmV0dXJuIHBvcnQKKworZGVmIGJpbmRfcG9ydChzb2NrLCBob3N0PUhPU1QpOgorICAgICIiIkJpbmQgdGhlIHNvY2tldCB0byBhIGZyZWUgcG9ydCBhbmQgcmV0dXJuIHRoZSBwb3J0IG51bWJlci4gIFJlbGllcyBvbgorICAgIGVwaGVtZXJhbCBwb3J0cyBpbiBvcmRlciB0byBlbnN1cmUgd2UgYXJlIHVzaW5nIGFuIHVuYm91bmQgcG9ydC4gIFRoaXMgaXMKKyAgICBpbXBvcnRhbnQgYXMgbWFueSB0ZXN0cyBtYXkgYmUgcnVubmluZyBzaW11bHRhbmVvdXNseSwgZXNwZWNpYWxseSBpbiBhCisgICAgYnVpbGRib3QgZW52aXJvbm1lbnQuICBUaGlzIG1ldGhvZCByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHRoZSBzb2NrLmZhbWlseQorICAgIGlzIEFGX0lORVQgYW5kIHNvY2sudHlwZSBpcyBTT0NLX1NUUkVBTSwgKmFuZCogdGhlIHNvY2tldCBoYXMgU09fUkVVU0VBRERSCisgICAgb3IgU09fUkVVU0VQT1JUIHNldCBvbiBpdC4gIFRlc3RzIHNob3VsZCAqbmV2ZXIqIHNldCB0aGVzZSBzb2NrZXQgb3B0aW9ucworICAgIGZvciBUQ1AvSVAgc29ja2V0cy4gIFRoZSBvbmx5IGNhc2UgZm9yIHNldHRpbmcgdGhlc2Ugb3B0aW9ucyBpcyB0ZXN0aW5nCisgICAgbXVsdGljYXN0aW5nIHZpYSBtdWx0aXBsZSBVRFAgc29ja2V0cy4KKworICAgIEFkZGl0aW9uYWxseSwgaWYgdGhlIFNPX0VYQ0xVU0lWRUFERFJVU0Ugc29ja2V0IG9wdGlvbiBpcyBhdmFpbGFibGUgKGkuZS4KKyAgICBvbiBXaW5kb3dzKSwgaXQgd2lsbCBiZSBzZXQgb24gdGhlIHNvY2tldC4gIFRoaXMgd2lsbCBwcmV2ZW50IGFueW9uZSBlbHNlCisgICAgZnJvbSBiaW5kKCknaW5nIHRvIG91ciBob3N0L3BvcnQgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdGVzdC4KKyAgICAiIiIKKyAgICBpZiBzb2NrLmZhbWlseSA9PSBzb2NrZXQuQUZfSU5FVCBhbmQgc29jay50eXBlID09IHNvY2tldC5TT0NLX1NUUkVBTToKKyAgICAgICAgaWYgaGFzYXR0cihzb2NrZXQsICdTT19SRVVTRUFERFInKToKKyAgICAgICAgICAgIGlmIHNvY2suZ2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUikgPT0gMToKKyAgICAgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJ0ZXN0cyBzaG91bGQgbmV2ZXIgc2V0IHRoZSBTT19SRVVTRUFERFIgIiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb2NrZXQgb3B0aW9uIG9uIFRDUC9JUCBzb2NrZXRzISIpCisgICAgICAgIGlmIGhhc2F0dHIoc29ja2V0LCAnU09fUkVVU0VQT1JUJyk6CisgICAgICAgICAgICBpZiBzb2NrLmdldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRVBPUlQpID09IDE6CisgICAgICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgidGVzdHMgc2hvdWxkIG5ldmVyIHNldCB0aGUgU09fUkVVU0VQT1JUICIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29ja2V0IG9wdGlvbiBvbiBUQ1AvSVAgc29ja2V0cyEiKQorICAgICAgICBpZiBoYXNhdHRyKHNvY2tldCwgJ1NPX0VYQ0xVU0lWRUFERFJVU0UnKToKKyAgICAgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0VYQ0xVU0lWRUFERFJVU0UsIDEpCisKKyAgICBzb2NrLmJpbmQoKGhvc3QsIDApKQorICAgIHBvcnQgPSBzb2NrLmdldHNvY2tuYW1lKClbMV0KKyAgICByZXR1cm4gcG9ydAorCitGVVpaID0gMWUtNgorCitkZWYgZmNtcCh4LCB5KTogIyBmdXp6eSBjb21wYXJpc29uIGZ1bmN0aW9uCisgICAgaWYgaXNpbnN0YW5jZSh4LCBmbG9hdCkgb3IgaXNpbnN0YW5jZSh5LCBmbG9hdCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1enogPSAoYWJzKHgpICsgYWJzKHkpKSAqIEZVWloKKyAgICAgICAgICAgIGlmIGFicyh4LXkpIDw9IGZ1eno6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgIGVsaWYgdHlwZSh4KSA9PSB0eXBlKHkpIGFuZCBpc2luc3RhbmNlKHgsICh0dXBsZSwgbGlzdCkpOgorICAgICAgICBmb3IgaSBpbiByYW5nZShtaW4obGVuKHgpLCBsZW4oeSkpKToKKyAgICAgICAgICAgIG91dGNvbWUgPSBmY21wKHhbaV0sIHlbaV0pCisgICAgICAgICAgICBpZiBvdXRjb21lICE9IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIG91dGNvbWUKKyAgICAgICAgcmV0dXJuIChsZW4oeCkgPiBsZW4oeSkpIC0gKGxlbih4KSA8IGxlbih5KSkKKyAgICByZXR1cm4gKHggPiB5KSAtICh4IDwgeSkKKworCisjIEEgY29uc3RhbnQgbGlrZWx5IGxhcmdlciB0aGFuIHRoZSB1bmRlcmx5aW5nIE9TIHBpcGUgYnVmZmVyIHNpemUsIHRvCisjIG1ha2Ugd3JpdGVzIGJsb2NraW5nLgorIyBXaW5kb3dzIGxpbWl0IHNlZW1zIHRvIGJlIGFyb3VuZCA1MTIgQiwgYW5kIG1hbnkgVW5peCBrZXJuZWxzIGhhdmUgYQorIyA2NCBLaUIgcGlwZSBidWZmZXIgc2l6ZSBvciAxNiAqIFBBR0VfU0laRTogdGFrZSBhIGZldyBtZWdzIHRvIGJlIHN1cmUuCisjIChzZWUgaXNzdWUgIzE3ODM1IGZvciBhIGRpc2N1c3Npb24gb2YgdGhpcyBudW1iZXIpLgorUElQRV9NQVhfU0laRSA9IDQgKjEwMjQgKiAxMDI0ICsgMQorCisKK3RyeToKKyAgICB1bmljb2RlCisgICAgaGF2ZV91bmljb2RlID0gVHJ1ZQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBoYXZlX3VuaWNvZGUgPSBGYWxzZQorCitpc19qeXRob24gPSBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpCisKKyMgRmlsZW5hbWUgdXNlZCBmb3IgdGVzdGluZworaWYgb3MubmFtZSA9PSAnamF2YSc6CisgICAgIyBKeXRob24gZGlzYWxsb3dzIEAgaW4gbW9kdWxlIG5hbWVzCisgICAgVEVTVEZOID0gJyR0ZXN0JworZWxpZiBvcy5uYW1lID09ICdyaXNjb3MnOgorICAgIFRFU1RGTiA9ICd0ZXN0ZmlsZScKK2Vsc2U6CisgICAgVEVTVEZOID0gJ0B0ZXN0JworICAgICMgVW5pY29kZSBuYW1lIG9ubHkgdXNlZCBpZiBURVNUX0ZOX0VOQ09ESU5HIGV4aXN0cyBmb3IgdGhlIHBsYXRmb3JtLgorICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgIyBBc3N1bWluZyBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkhPXN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQorICAgICAgICAjIFRFU1RGTl9VTklDT0RFIGlzIGEgZmlsZW5hbWUgdGhhdCBjYW4gYmUgZW5jb2RlZCB1c2luZyB0aGUKKyAgICAgICAgIyBmaWxlIHN5c3RlbSBlbmNvZGluZywgYnV0ICpub3QqIHdpdGggdGhlIGRlZmF1bHQgKGFzY2lpKSBlbmNvZGluZworICAgICAgICBpZiBpc2luc3RhbmNlKCcnLCB1bmljb2RlKToKKyAgICAgICAgICAgICMgcHl0aG9uIC1VCisgICAgICAgICAgICAjIFhYWCBwZXJoYXBzIHVuaWNvZGUoKSBzaG91bGQgYWNjZXB0IFVuaWNvZGUgc3RyaW5ncz8KKyAgICAgICAgICAgIFRFU1RGTl9VTklDT0RFID0gIkB0ZXN0LVx4ZTBceGYyIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyAyIGxhdGluIGNoYXJhY3RlcnMuCisgICAgICAgICAgICBURVNURk5fVU5JQ09ERSA9IHVuaWNvZGUoIkB0ZXN0LVx4ZTBceGYyIiwgImxhdGluLTEiKQorICAgICAgICBURVNURk5fRU5DT0RJTkcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKKyAgICAgICAgIyBURVNURk5fVU5FTkNPREFCTEUgaXMgYSBmaWxlbmFtZSB0aGF0IHNob3VsZCAqbm90KiBiZQorICAgICAgICAjIGFibGUgdG8gYmUgZW5jb2RlZCBieSAqZWl0aGVyKiB0aGUgZGVmYXVsdCBvciBmaWxlc3lzdGVtIGVuY29kaW5nLgorICAgICAgICAjIFRoaXMgdGVzdCByZWFsbHkgb25seSBtYWtlcyBzZW5zZSBvbiBXaW5kb3dzIE5UIHBsYXRmb3JtcworICAgICAgICAjIHdoaWNoIGhhdmUgc3BlY2lhbCBVbmljb2RlIHN1cHBvcnQgaW4gcG9zaXhtb2R1bGUuCisgICAgICAgIGlmIChub3QgaGFzYXR0cihzeXMsICJnZXR3aW5kb3dzdmVyc2lvbiIpIG9yCisgICAgICAgICAgICAgICAgc3lzLmdldHdpbmRvd3N2ZXJzaW9uKClbM10gPCAyKTogIyAgMD13aW4zMnMgb3IgMT05eC9NRQorICAgICAgICAgICAgVEVTVEZOX1VORU5DT0RBQkxFID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBKYXBhbmVzZSBjaGFyYWN0ZXJzIChJIHRoaW5rIC0gZnJvbSBidWcgODQ2MTMzKQorICAgICAgICAgICAgVEVTVEZOX1VORU5DT0RBQkxFID0gZXZhbCgndSJAdGVzdC1cdTUxNzFcdTY3MDlcdTMwNTVcdTMwOGNcdTMwOGIiJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFhYWCAtIE5vdGUgLSBzaG91bGQgYmUgdXNpbmcgVEVTVEZOX0VOQ09ESU5HIGhlcmUgLSBidXQgZm9yCisgICAgICAgICAgICAgICAgIyBXaW5kb3dzLCAibWJjcyIgY3VycmVudGx5IGFsd2F5cyBvcGVyYXRlcyBhcyBpZiBpbgorICAgICAgICAgICAgICAgICMgZXJyb3JzPWlnbm9yZScgbW9kZSAtIGhlbmNlIHdlIGdldCAnPycgY2hhcmFjdGVycyByYXRoZXIgdGhhbgorICAgICAgICAgICAgICAgICMgdGhlIGV4Y2VwdGlvbi4gICdMYXRpbjEnIG9wZXJhdGVzIGFzIHdlIGV4cGVjdCAtIGllLCBmYWlscy4KKyAgICAgICAgICAgICAgICAjIFNlZSBbIDg1MDk5NyBdIG1iY3MgZW5jb2RpbmcgaWdub3JlcyBlcnJvcnMKKyAgICAgICAgICAgICAgICBURVNURk5fVU5FTkNPREFCTEUuZW5jb2RlKCJMYXRpbjEiKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50IFwKKyAgICAgICAgICAgICAgICAnV0FSTklORzogVGhlIGZpbGVuYW1lICVyIENBTiBiZSBlbmNvZGVkIGJ5IHRoZSBmaWxlc3lzdGVtLiAgJyBcCisgICAgICAgICAgICAgICAgJ1VuaWNvZGUgZmlsZW5hbWUgdGVzdHMgbWF5IG5vdCBiZSBlZmZlY3RpdmUnIFwKKyAgICAgICAgICAgICAgICAlIFRFU1RGTl9VTkVOQ09EQUJMRQorCisKKyMgRGlzYW1iaWd1YXRlIFRFU1RGTiBmb3IgcGFyYWxsZWwgdGVzdGluZywgd2hpbGUgbGV0dGluZyBpdCByZW1haW4gYSB2YWxpZAorIyBtb2R1bGUgbmFtZS4KK1RFU1RGTiA9ICJ7fV97fV90bXAiLmZvcm1hdChURVNURk4sIG9zLmdldHBpZCgpKQorCisjIFNhdmUgdGhlIGluaXRpYWwgY3dkCitTQVZFRENXRCA9IG9zLmdldGN3ZCgpCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgdGVtcF9jd2QobmFtZT0ndGVtcGN3ZCcsIHF1aWV0PUZhbHNlKToKKyAgICAiIiIKKyAgICBDb250ZXh0IG1hbmFnZXIgdGhhdCBjcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBhbmQgc2V0IGl0IGFzIENXRC4KKworICAgIFRoZSBuZXcgQ1dEIGlzIGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBpdCdzIG5hbWVkICpuYW1lKi4KKyAgICBJZiAqcXVpZXQqIGlzIEZhbHNlIChkZWZhdWx0KSBhbmQgaXQncyBub3QgcG9zc2libGUgdG8gY3JlYXRlIG9yIGNoYW5nZQorICAgIHRoZSBDV0QsIGFuIGVycm9yIGlzIHJhaXNlZC4gIElmIGl0J3MgVHJ1ZSwgb25seSBhIHdhcm5pbmcgaXMgcmFpc2VkCisgICAgYW5kIHRoZSBvcmlnaW5hbCBDV0QgaXMgdXNlZC4KKyAgICAiIiIKKyAgICBpZiBoYXZlX3VuaWNvZGUgYW5kIGlzaW5zdGFuY2UobmFtZSwgdW5pY29kZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLmVuY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkgb3IgJ2FzY2lpJykKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgICAgIGlmIG5vdCBxdWlldDoKKyAgICAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgndW5hYmxlIHRvIGVuY29kZSB0aGUgY3dkIG5hbWUgd2l0aCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoZSBmaWxlc3lzdGVtIGVuY29kaW5nLicpCisgICAgc2F2ZWRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICBpc190ZW1wb3JhcnkgPSBGYWxzZQorICAgIHRyeToKKyAgICAgICAgb3MubWtkaXIobmFtZSkKKyAgICAgICAgb3MuY2hkaXIobmFtZSkKKyAgICAgICAgaXNfdGVtcG9yYXJ5ID0gVHJ1ZQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICBpZiBub3QgcXVpZXQ6CisgICAgICAgICAgICByYWlzZQorICAgICAgICB3YXJuaW5ncy53YXJuKCd0ZXN0cyBtYXkgZmFpbCwgdW5hYmxlIHRvIGNoYW5nZSB0aGUgQ1dEIHRvICcgKyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nLCBzdGFja2xldmVsPTMpCisgICAgdHJ5OgorICAgICAgICB5aWVsZCBvcy5nZXRjd2QoKQorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLmNoZGlyKHNhdmVkX2RpcikKKyAgICAgICAgaWYgaXNfdGVtcG9yYXJ5OgorICAgICAgICAgICAgcm10cmVlKG5hbWUpCisKKworZGVmIGZpbmRmaWxlKGZpbGUsIGhlcmU9X19maWxlX18sIHN1YmRpcj1Ob25lKToKKyAgICAiIiJUcnkgdG8gZmluZCBhIGZpbGUgb24gc3lzLnBhdGggYW5kIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4gIElmIGl0IGlzIG5vdAorICAgIGZvdW5kIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uIGlzIHJldHVybmVkICh0aGlzIGRvZXMgbm90CisgICAgbmVjZXNzYXJpbHkgc2lnbmFsIGZhaWx1cmU7IGNvdWxkIHN0aWxsIGJlIHRoZSBsZWdpdGltYXRlIHBhdGgpLiIiIgorICAgIGlmIG9zLnBhdGguaXNhYnMoZmlsZSk6CisgICAgICAgIHJldHVybiBmaWxlCisgICAgaWYgc3ViZGlyIGlzIG5vdCBOb25lOgorICAgICAgICBmaWxlID0gb3MucGF0aC5qb2luKHN1YmRpciwgZmlsZSkKKyAgICBwYXRoID0gc3lzLnBhdGgKKyAgICBwYXRoID0gW29zLnBhdGguZGlybmFtZShoZXJlKV0gKyBwYXRoCisgICAgZm9yIGRuIGluIHBhdGg6CisgICAgICAgIGZuID0gb3MucGF0aC5qb2luKGRuLCBmaWxlKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbik6IHJldHVybiBmbgorICAgIHJldHVybiBmaWxlCisKK2RlZiBzb3J0ZGljdChkaWN0KToKKyAgICAiTGlrZSByZXByKGRpY3QpLCBidXQgaW4gc29ydGVkIG9yZGVyLiIKKyAgICBpdGVtcyA9IGRpY3QuaXRlbXMoKQorICAgIGl0ZW1zLnNvcnQoKQorICAgIHJlcHJwYWlycyA9IFsiJXI6ICVyIiAlIHBhaXIgZm9yIHBhaXIgaW4gaXRlbXNdCisgICAgd2l0aGNvbW1hcyA9ICIsICIuam9pbihyZXBycGFpcnMpCisgICAgcmV0dXJuICJ7JXN9IiAlIHdpdGhjb21tYXMKKworZGVmIG1ha2VfYmFkX2ZkKCk6CisgICAgIiIiCisgICAgQ3JlYXRlIGFuIGludmFsaWQgZmlsZSBkZXNjcmlwdG9yIGJ5IG9wZW5pbmcgYW5kIGNsb3NpbmcgYSBmaWxlIGFuZCByZXR1cm4KKyAgICBpdHMgZmQuCisgICAgIiIiCisgICAgZmlsZSA9IG9wZW4oVEVTVEZOLCAid2IiKQorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGZpbGUuZmlsZW5vKCkKKyAgICBmaW5hbGx5OgorICAgICAgICBmaWxlLmNsb3NlKCkKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKworZGVmIGNoZWNrX3N5bnRheF9lcnJvcih0ZXN0Y2FzZSwgc3RhdGVtZW50KToKKyAgICB0ZXN0Y2FzZS5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGUsIHN0YXRlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJzx0ZXN0IHN0cmluZz4nLCAnZXhlYycpCisKK2RlZiBvcGVuX3VybHJlc291cmNlKHVybCwgY2hlY2s9Tm9uZSk6CisgICAgaW1wb3J0IHVybHBhcnNlLCB1cmxsaWIyCisKKyAgICBmaWxlbmFtZSA9IHVybHBhcnNlLnVybHBhcnNlKHVybClbMl0uc3BsaXQoJy8nKVstMV0gIyAnLyc6IGl0J3MgVVJMIQorCisgICAgZm4gPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImRhdGEiLCBmaWxlbmFtZSkKKworICAgIGRlZiBjaGVja192YWxpZF9maWxlKGZuKToKKyAgICAgICAgZiA9IG9wZW4oZm4pCisgICAgICAgIGlmIGNoZWNrIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICBlbGlmIGNoZWNrKGYpOgorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICBmLmNsb3NlKCkKKworICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuKToKKyAgICAgICAgZiA9IGNoZWNrX3ZhbGlkX2ZpbGUoZm4pCisgICAgICAgIGlmIGYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICB1bmxpbmsoZm4pCisKKyAgICAjIFZlcmlmeSB0aGUgcmVxdWlyZW1lbnQgYmVmb3JlIGRvd25sb2FkaW5nIHRoZSBmaWxlCisgICAgcmVxdWlyZXMoJ3VybGZldGNoJykKKworICAgIHByaW50ID4+IGdldF9vcmlnaW5hbF9zdGRvdXQoKSwgJ1x0ZmV0Y2hpbmcgJXMgLi4uJyAlIHVybAorICAgIGYgPSB1cmxsaWIyLnVybG9wZW4odXJsLCB0aW1lb3V0PTE1KQorICAgIHRyeToKKyAgICAgICAgd2l0aCBvcGVuKGZuLCAid2IiKSBhcyBvdXQ6CisgICAgICAgICAgICBzID0gZi5yZWFkKCkKKyAgICAgICAgICAgIHdoaWxlIHM6CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKHMpCisgICAgICAgICAgICAgICAgcyA9IGYucmVhZCgpCisgICAgZmluYWxseToKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBmID0gY2hlY2tfdmFsaWRfZmlsZShmbikKKyAgICBpZiBmIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gZgorICAgIHJhaXNlIFRlc3RGYWlsZWQoJ2ludmFsaWQgcmVzb3VyY2UgIiVzIicgJSBmbikKKworCitjbGFzcyBXYXJuaW5nc1JlY29yZGVyKG9iamVjdCk6CisgICAgIiIiQ29udmVuaWVuY2Ugd3JhcHBlciBmb3IgdGhlIHdhcm5pbmdzIGxpc3QgcmV0dXJuZWQgb24KKyAgICAgICBlbnRyeSB0byB0aGUgd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKSBjb250ZXh0IG1hbmFnZXIuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdhcm5pbmdzX2xpc3QpOgorICAgICAgICBzZWxmLl93YXJuaW5ncyA9IHdhcm5pbmdzX2xpc3QKKyAgICAgICAgc2VsZi5fbGFzdCA9IDAKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX3dhcm5pbmdzKSA+IHNlbGYuX2xhc3Q6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl93YXJuaW5nc1stMV0sIGF0dHIpCisgICAgICAgIGVsaWYgYXR0ciBpbiB3YXJuaW5ncy5XYXJuaW5nTWVzc2FnZS5fV0FSTklOR19ERVRBSUxTOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIiVyIGhhcyBubyBhdHRyaWJ1dGUgJXIiICUgKHNlbGYsIGF0dHIpKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHdhcm5pbmdzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fd2FybmluZ3Nbc2VsZi5fbGFzdDpdCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuX2xhc3QgPSBsZW4oc2VsZi5fd2FybmluZ3MpCisKKworZGVmIF9maWx0ZXJ3YXJuaW5ncyhmaWx0ZXJzLCBxdWlldD1GYWxzZSk6CisgICAgIiIiQ2F0Y2ggdGhlIHdhcm5pbmdzLCB0aGVuIGNoZWNrIGlmIGFsbCB0aGUgZXhwZWN0ZWQKKyAgICB3YXJuaW5ncyBoYXZlIGJlZW4gcmFpc2VkIGFuZCByZS1yYWlzZSB1bmV4cGVjdGVkIHdhcm5pbmdzLgorICAgIElmICdxdWlldCcgaXMgVHJ1ZSwgb25seSByZS1yYWlzZSB0aGUgdW5leHBlY3RlZCB3YXJuaW5ncy4KKyAgICAiIiIKKyAgICAjIENsZWFyIHRoZSB3YXJuaW5nIHJlZ2lzdHJ5IG9mIHRoZSBjYWxsaW5nIG1vZHVsZQorICAgICMgaW4gb3JkZXIgdG8gcmUtcmFpc2UgdGhlIHdhcm5pbmdzLgorICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgyKQorICAgIHJlZ2lzdHJ5ID0gZnJhbWUuZl9nbG9iYWxzLmdldCgnX193YXJuaW5ncmVnaXN0cnlfXycpCisgICAgaWYgcmVnaXN0cnk6CisgICAgICAgIHJlZ2lzdHJ5LmNsZWFyKCkKKyAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlKSBhcyB3OgorICAgICAgICAjIFNldCBmaWx0ZXIgImFsd2F5cyIgdG8gcmVjb3JkIGFsbCB3YXJuaW5ncy4gIEJlY2F1c2UKKyAgICAgICAgIyB0ZXN0X3dhcm5pbmdzIHN3YXAgdGhlIG1vZHVsZSwgd2UgbmVlZCB0byBsb29rIHVwIGluCisgICAgICAgICMgdGhlIHN5cy5tb2R1bGVzIGRpY3Rpb25hcnkuCisgICAgICAgIHN5cy5tb2R1bGVzWyd3YXJuaW5ncyddLnNpbXBsZWZpbHRlcigiYWx3YXlzIikKKyAgICAgICAgeWllbGQgV2FybmluZ3NSZWNvcmRlcih3KQorICAgICMgRmlsdGVyIHRoZSByZWNvcmRlZCB3YXJuaW5ncworICAgIHJlcmFpc2UgPSBbd2FybmluZy5tZXNzYWdlIGZvciB3YXJuaW5nIGluIHddCisgICAgbWlzc2luZyA9IFtdCisgICAgZm9yIG1zZywgY2F0IGluIGZpbHRlcnM6CisgICAgICAgIHNlZW4gPSBGYWxzZQorICAgICAgICBmb3IgZXhjIGluIHJlcmFpc2VbOl06CisgICAgICAgICAgICBtZXNzYWdlID0gc3RyKGV4YykKKyAgICAgICAgICAgICMgRmlsdGVyIG91dCB0aGUgbWF0Y2hpbmcgbWVzc2FnZXMKKyAgICAgICAgICAgIGlmIChyZS5tYXRjaChtc2csIG1lc3NhZ2UsIHJlLkkpIGFuZAorICAgICAgICAgICAgICAgIGlzc3ViY2xhc3MoZXhjLl9fY2xhc3NfXywgY2F0KSk6CisgICAgICAgICAgICAgICAgc2VlbiA9IFRydWUKKyAgICAgICAgICAgICAgICByZXJhaXNlLnJlbW92ZShleGMpCisgICAgICAgIGlmIG5vdCBzZWVuIGFuZCBub3QgcXVpZXQ6CisgICAgICAgICAgICAjIFRoaXMgZmlsdGVyIGNhdWdodCBub3RoaW5nCisgICAgICAgICAgICBtaXNzaW5nLmFwcGVuZCgobXNnLCBjYXQuX19uYW1lX18pKQorICAgIGlmIHJlcmFpc2U6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJ1bmhhbmRsZWQgd2FybmluZyAlciIgJSByZXJhaXNlWzBdKQorICAgIGlmIG1pc3Npbmc6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJmaWx0ZXIgKCVyLCAlcykgZGlkIG5vdCBjYXRjaCBhbnkgd2FybmluZyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nWzBdKQorCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgY2hlY2tfd2FybmluZ3MoKmZpbHRlcnMsICoqa3dhcmdzKToKKyAgICAiIiJDb250ZXh0IG1hbmFnZXIgdG8gc2lsZW5jZSB3YXJuaW5ncy4KKworICAgIEFjY2VwdCAyLXR1cGxlcyBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgKCJtZXNzYWdlIHJlZ2V4cCIsIFdhcm5pbmdDYXRlZ29yeSkKKworICAgIE9wdGlvbmFsIGFyZ3VtZW50OgorICAgICAtIGlmICdxdWlldCcgaXMgVHJ1ZSwgaXQgZG9lcyBub3QgZmFpbCBpZiBhIGZpbHRlciBjYXRjaGVzIG5vdGhpbmcKKyAgICAgICAgKGRlZmF1bHQgVHJ1ZSB3aXRob3V0IGFyZ3VtZW50LAorICAgICAgICAgZGVmYXVsdCBGYWxzZSBpZiBzb21lIGZpbHRlcnMgYXJlIGRlZmluZWQpCisKKyAgICBXaXRob3V0IGFyZ3VtZW50LCBpdCBkZWZhdWx0cyB0bzoKKyAgICAgICAgY2hlY2tfd2FybmluZ3MoKCIiLCBXYXJuaW5nKSwgcXVpZXQ9VHJ1ZSkKKyAgICAiIiIKKyAgICBxdWlldCA9IGt3YXJncy5nZXQoJ3F1aWV0JykKKyAgICBpZiBub3QgZmlsdGVyczoKKyAgICAgICAgZmlsdGVycyA9ICgoIiIsIFdhcm5pbmcpLCkKKyAgICAgICAgIyBQcmVzZXJ2ZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgICAgIGlmIHF1aWV0IGlzIE5vbmU6CisgICAgICAgICAgICBxdWlldCA9IFRydWUKKyAgICByZXR1cm4gX2ZpbHRlcndhcm5pbmdzKGZpbHRlcnMsIHF1aWV0KQorCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgY2hlY2tfcHkza193YXJuaW5ncygqZmlsdGVycywgKiprd2FyZ3MpOgorICAgICIiIkNvbnRleHQgbWFuYWdlciB0byBzaWxlbmNlIHB5M2sgd2FybmluZ3MuCisKKyAgICBBY2NlcHQgMi10dXBsZXMgYXMgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICgibWVzc2FnZSByZWdleHAiLCBXYXJuaW5nQ2F0ZWdvcnkpCisKKyAgICBPcHRpb25hbCBhcmd1bWVudDoKKyAgICAgLSBpZiAncXVpZXQnIGlzIFRydWUsIGl0IGRvZXMgbm90IGZhaWwgaWYgYSBmaWx0ZXIgY2F0Y2hlcyBub3RoaW5nCisgICAgICAgIChkZWZhdWx0IEZhbHNlKQorCisgICAgV2l0aG91dCBhcmd1bWVudCwgaXQgZGVmYXVsdHMgdG86CisgICAgICAgIGNoZWNrX3B5M2tfd2FybmluZ3MoKCIiLCBEZXByZWNhdGlvbldhcm5pbmcpLCBxdWlldD1GYWxzZSkKKyAgICAiIiIKKyAgICBpZiBzeXMucHkza3dhcm5pbmc6CisgICAgICAgIGlmIG5vdCBmaWx0ZXJzOgorICAgICAgICAgICAgZmlsdGVycyA9ICgoIiIsIERlcHJlY2F0aW9uV2FybmluZyksKQorICAgIGVsc2U6CisgICAgICAgICMgSXQgc2hvdWxkIG5vdCByYWlzZSBhbnkgcHkzayB3YXJuaW5nCisgICAgICAgIGZpbHRlcnMgPSAoKQorICAgIHJldHVybiBfZmlsdGVyd2FybmluZ3MoZmlsdGVycywga3dhcmdzLmdldCgncXVpZXQnKSkKKworCitjbGFzcyBDbGVhbkltcG9ydChvYmplY3QpOgorICAgICIiIkNvbnRleHQgbWFuYWdlciB0byBmb3JjZSBpbXBvcnQgdG8gcmV0dXJuIGEgbmV3IG1vZHVsZSByZWZlcmVuY2UuCisKKyAgICBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZyBtb2R1bGUtbGV2ZWwgYmVoYXZpb3Vycywgc3VjaCBhcworICAgIHRoZSBlbWlzc2lvbiBvZiBhIERlcHJlY2F0aW9uV2FybmluZyBvbiBpbXBvcnQuCisKKyAgICBVc2UgbGlrZSB0aGlzOgorCisgICAgICAgIHdpdGggQ2xlYW5JbXBvcnQoImZvbyIpOgorICAgICAgICAgICAgaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoImZvbyIpICMgbmV3IHJlZmVyZW5jZQorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICptb2R1bGVfbmFtZXMpOgorICAgICAgICBzZWxmLm9yaWdpbmFsX21vZHVsZXMgPSBzeXMubW9kdWxlcy5jb3B5KCkKKyAgICAgICAgZm9yIG1vZHVsZV9uYW1lIGluIG1vZHVsZV9uYW1lczoKKyAgICAgICAgICAgIGlmIG1vZHVsZV9uYW1lIGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZV9uYW1lXQorICAgICAgICAgICAgICAgICMgSXQgaXMgcG9zc2libGUgdGhhdCBtb2R1bGVfbmFtZSBpcyBqdXN0IGFuIGFsaWFzIGZvcgorICAgICAgICAgICAgICAgICMgYW5vdGhlciBtb2R1bGUgKGUuZy4gc3R1YiBmb3IgbW9kdWxlcyByZW5hbWVkIGluIDMueCkuCisgICAgICAgICAgICAgICAgIyBJbiB0aGF0IGNhc2UsIHdlIGFsc28gbmVlZCBkZWxldGUgdGhlIHJlYWwgbW9kdWxlIHRvIGNsZWFyCisgICAgICAgICAgICAgICAgIyB0aGUgaW1wb3J0IGNhY2hlLgorICAgICAgICAgICAgICAgIGlmIG1vZHVsZS5fX25hbWVfXyAhPSBtb2R1bGVfbmFtZToKKyAgICAgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZHVsZS5fX25hbWVfX10KKyAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbW9kdWxlX25hbWVdCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICppZ25vcmVfZXhjKToKKyAgICAgICAgc3lzLm1vZHVsZXMudXBkYXRlKHNlbGYub3JpZ2luYWxfbW9kdWxlcykKKworCitjbGFzcyBFbnZpcm9ubWVudFZhckd1YXJkKFVzZXJEaWN0LkRpY3RNaXhpbik6CisKKyAgICAiIiJDbGFzcyB0byBoZWxwIHByb3RlY3QgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIHByb3Blcmx5LiAgQ2FuIGJlIHVzZWQgYXMKKyAgICBhIGNvbnRleHQgbWFuYWdlci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fZW52aXJvbiA9IG9zLmVudmlyb24KKyAgICAgICAgc2VsZi5fY2hhbmdlZCA9IHt9CisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgZW52dmFyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Vudmlyb25bZW52dmFyXQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGVudnZhciwgdmFsdWUpOgorICAgICAgICAjIFJlbWVtYmVyIHRoZSBpbml0aWFsIHZhbHVlIG9uIHRoZSBmaXJzdCBhY2Nlc3MKKyAgICAgICAgaWYgZW52dmFyIG5vdCBpbiBzZWxmLl9jaGFuZ2VkOgorICAgICAgICAgICAgc2VsZi5fY2hhbmdlZFtlbnZ2YXJdID0gc2VsZi5fZW52aXJvbi5nZXQoZW52dmFyKQorICAgICAgICBzZWxmLl9lbnZpcm9uW2VudnZhcl0gPSB2YWx1ZQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGVudnZhcik6CisgICAgICAgICMgUmVtZW1iZXIgdGhlIGluaXRpYWwgdmFsdWUgb24gdGhlIGZpcnN0IGFjY2VzcworICAgICAgICBpZiBlbnZ2YXIgbm90IGluIHNlbGYuX2NoYW5nZWQ6CisgICAgICAgICAgICBzZWxmLl9jaGFuZ2VkW2VudnZhcl0gPSBzZWxmLl9lbnZpcm9uLmdldChlbnZ2YXIpCisgICAgICAgIGlmIGVudnZhciBpbiBzZWxmLl9lbnZpcm9uOgorICAgICAgICAgICAgZGVsIHNlbGYuX2Vudmlyb25bZW52dmFyXQorCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9lbnZpcm9uLmtleXMoKQorCisgICAgZGVmIHNldChzZWxmLCBlbnZ2YXIsIHZhbHVlKToKKyAgICAgICAgc2VsZltlbnZ2YXJdID0gdmFsdWUKKworICAgIGRlZiB1bnNldChzZWxmLCBlbnZ2YXIpOgorICAgICAgICBkZWwgc2VsZltlbnZ2YXJdCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICppZ25vcmVfZXhjKToKKyAgICAgICAgZm9yIChrLCB2KSBpbiBzZWxmLl9jaGFuZ2VkLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB2IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgayBpbiBzZWxmLl9lbnZpcm9uOgorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5fZW52aXJvbltrXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9lbnZpcm9uW2tdID0gdgorICAgICAgICBvcy5lbnZpcm9uID0gc2VsZi5fZW52aXJvbgorCisKK2NsYXNzIERpcnNPblN5c1BhdGgob2JqZWN0KToKKyAgICAiIiJDb250ZXh0IG1hbmFnZXIgdG8gdGVtcG9yYXJpbHkgYWRkIGRpcmVjdG9yaWVzIHRvIHN5cy5wYXRoLgorCisgICAgVGhpcyBtYWtlcyBhIGNvcHkgb2Ygc3lzLnBhdGgsIGFwcGVuZHMgYW55IGRpcmVjdG9yaWVzIGdpdmVuCisgICAgYXMgcG9zaXRpb25hbCBhcmd1bWVudHMsIHRoZW4gcmV2ZXJ0cyBzeXMucGF0aCB0byB0aGUgY29waWVkCisgICAgc2V0dGluZ3Mgd2hlbiB0aGUgY29udGV4dCBlbmRzLgorCisgICAgTm90ZSB0aGF0ICphbGwqIHN5cy5wYXRoIG1vZGlmaWNhdGlvbnMgaW4gdGhlIGJvZHkgb2YgdGhlCisgICAgY29udGV4dCBtYW5hZ2VyLCBpbmNsdWRpbmcgcmVwbGFjZW1lbnQgb2YgdGhlIG9iamVjdCwKKyAgICB3aWxsIGJlIHJldmVydGVkIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICpwYXRocyk6CisgICAgICAgIHNlbGYub3JpZ2luYWxfdmFsdWUgPSBzeXMucGF0aFs6XQorICAgICAgICBzZWxmLm9yaWdpbmFsX29iamVjdCA9IHN5cy5wYXRoCisgICAgICAgIHN5cy5wYXRoLmV4dGVuZChwYXRocykKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmlnbm9yZV9leGMpOgorICAgICAgICBzeXMucGF0aCA9IHNlbGYub3JpZ2luYWxfb2JqZWN0CisgICAgICAgIHN5cy5wYXRoWzpdID0gc2VsZi5vcmlnaW5hbF92YWx1ZQorCisKK2NsYXNzIFRyYW5zaWVudFJlc291cmNlKG9iamVjdCk6CisKKyAgICAiIiJSYWlzZSBSZXNvdXJjZURlbmllZCBpZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkIHdoaWxlIHRoZSBjb250ZXh0IG1hbmFnZXIKKyAgICBpcyBpbiBlZmZlY3QgdGhhdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIGFuZCBhdHRyaWJ1dGVzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4YywgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmV4YyA9IGV4YworICAgICAgICBzZWxmLmF0dHJzID0ga3dhcmdzCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGVfPU5vbmUsIHZhbHVlPU5vbmUsIHRyYWNlYmFjaz1Ob25lKToKKyAgICAgICAgIiIiSWYgdHlwZV8gaXMgYSBzdWJjbGFzcyBvZiBzZWxmLmV4YyBhbmQgdmFsdWUgaGFzIGF0dHJpYnV0ZXMgbWF0Y2hpbmcKKyAgICAgICAgc2VsZi5hdHRycywgcmFpc2UgUmVzb3VyY2VEZW5pZWQuICBPdGhlcndpc2UgbGV0IHRoZSBleGNlcHRpb24KKyAgICAgICAgcHJvcGFnYXRlIChpZiBhbnkpLiIiIgorICAgICAgICBpZiB0eXBlXyBpcyBub3QgTm9uZSBhbmQgaXNzdWJjbGFzcyhzZWxmLmV4YywgdHlwZV8pOgorICAgICAgICAgICAgZm9yIGF0dHIsIGF0dHJfdmFsdWUgaW4gc2VsZi5hdHRycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBub3QgaGFzYXR0cih2YWx1ZSwgYXR0cik6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgZ2V0YXR0cih2YWx1ZSwgYXR0cikgIT0gYXR0cl92YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgUmVzb3VyY2VEZW5pZWQoImFuIG9wdGlvbmFsIHJlc291cmNlIGlzIG5vdCBhdmFpbGFibGUiKQorCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgdHJhbnNpZW50X2ludGVybmV0KHJlc291cmNlX25hbWUsIHRpbWVvdXQ9MzAuMCwgZXJybm9zPSgpKToKKyAgICAiIiJSZXR1cm4gYSBjb250ZXh0IG1hbmFnZXIgdGhhdCByYWlzZXMgUmVzb3VyY2VEZW5pZWQgd2hlbiB2YXJpb3VzIGlzc3VlcworICAgIHdpdGggdGhlIEludGVybmV0IGNvbm5lY3Rpb24gbWFuaWZlc3QgdGhlbXNlbHZlcyBhcyBleGNlcHRpb25zLiIiIgorICAgIGRlZmF1bHRfZXJybm9zID0gWworICAgICAgICAoJ0VDT05OUkVGVVNFRCcsIDExMSksCisgICAgICAgICgnRUNPTk5SRVNFVCcsIDEwNCksCisgICAgICAgICgnRUhPU1RVTlJFQUNIJywgMTEzKSwKKyAgICAgICAgKCdFTkVUVU5SRUFDSCcsIDEwMSksCisgICAgICAgICgnRVRJTUVET1VUJywgMTEwKSwKKyAgICBdCisgICAgZGVmYXVsdF9nYWlfZXJybm9zID0gWworICAgICAgICAoJ0VBSV9BR0FJTicsIC0zKSwKKyAgICAgICAgKCdFQUlfRkFJTCcsIC00KSwKKyAgICAgICAgKCdFQUlfTk9OQU1FJywgLTIpLAorICAgICAgICAoJ0VBSV9OT0RBVEEnLCAtNSksCisgICAgICAgICMgV2luZG93cyBkZWZpbmVzIEVBSV9OT0RBVEEgYXMgMTEwMDEgYnV0IGlkaW90aWMgZ2V0YWRkcmluZm8oKQorICAgICAgICAjIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IHJldHVybnMgV1NBTk9fREFUQSBpLmUuIDExMDA0LgorICAgICAgICAoJ1dTQU5PX0RBVEEnLCAxMTAwNCksCisgICAgXQorCisgICAgZGVuaWVkID0gUmVzb3VyY2VEZW5pZWQoIlJlc291cmNlICclcycgaXMgbm90IGF2YWlsYWJsZSIgJSByZXNvdXJjZV9uYW1lKQorICAgIGNhcHR1cmVkX2Vycm5vcyA9IGVycm5vcworICAgIGdhaV9lcnJub3MgPSBbXQorICAgIGlmIG5vdCBjYXB0dXJlZF9lcnJub3M6CisgICAgICAgIGNhcHR1cmVkX2Vycm5vcyA9IFtnZXRhdHRyKGVycm5vLCBuYW1lLCBudW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG5hbWUsIG51bSkgaW4gZGVmYXVsdF9lcnJub3NdCisgICAgICAgIGdhaV9lcnJub3MgPSBbZ2V0YXR0cihzb2NrZXQsIG5hbWUsIG51bSkKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKG5hbWUsIG51bSkgaW4gZGVmYXVsdF9nYWlfZXJybm9zXQorCisgICAgZGVmIGZpbHRlcl9lcnJvcihlcnIpOgorICAgICAgICBuID0gZ2V0YXR0cihlcnIsICdlcnJubycsIE5vbmUpCisgICAgICAgIGlmIChpc2luc3RhbmNlKGVyciwgc29ja2V0LnRpbWVvdXQpIG9yCisgICAgICAgICAgICAoaXNpbnN0YW5jZShlcnIsIHNvY2tldC5nYWllcnJvcikgYW5kIG4gaW4gZ2FpX2Vycm5vcykgb3IKKyAgICAgICAgICAgIG4gaW4gY2FwdHVyZWRfZXJybm9zKToKKyAgICAgICAgICAgIGlmIG5vdCB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZGVuaWVkLmFyZ3NbMF0gKyAiXG4iKQorICAgICAgICAgICAgcmFpc2UgZGVuaWVkCisKKyAgICBvbGRfdGltZW91dCA9IHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpCisgICAgdHJ5OgorICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KHRpbWVvdXQpCisgICAgICAgIHlpZWxkCisgICAgZXhjZXB0IElPRXJyb3IgYXMgZXJyOgorICAgICAgICAjIHVybGxpYiBjYW4gd3JhcCBvcmlnaW5hbCBzb2NrZXQgZXJyb3JzIG11bHRpcGxlIHRpbWVzICghKSwgd2UgbXVzdAorICAgICAgICAjIHVud3JhcCB0byBnZXQgYXQgdGhlIG9yaWdpbmFsIGVycm9yLgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgYSA9IGVyci5hcmdzCisgICAgICAgICAgICBpZiBsZW4oYSkgPj0gMSBhbmQgaXNpbnN0YW5jZShhWzBdLCBJT0Vycm9yKToKKyAgICAgICAgICAgICAgICBlcnIgPSBhWzBdCisgICAgICAgICAgICAjIFRoZSBlcnJvciBjYW4gYWxzbyBiZSB3cmFwcGVkIGFzIGFyZ3NbMV06CisgICAgICAgICAgICAjICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgbXNnOgorICAgICAgICAgICAgIyAgICAgICAgcmFpc2UgSU9FcnJvcignc29ja2V0IGVycm9yJywgbXNnKS53aXRoX3RyYWNlYmFjayhzeXMuZXhjX2luZm8oKVsyXSkKKyAgICAgICAgICAgIGVsaWYgbGVuKGEpID49IDIgYW5kIGlzaW5zdGFuY2UoYVsxXSwgSU9FcnJvcik6CisgICAgICAgICAgICAgICAgZXJyID0gYVsxXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBmaWx0ZXJfZXJyb3IoZXJyKQorICAgICAgICByYWlzZQorICAgICMgWFhYIHNob3VsZCB3ZSBjYXRjaCBnZW5lcmljIGV4Y2VwdGlvbnMgYW5kIGxvb2sgZm9yIHRoZWlyCisgICAgIyBfX2NhdXNlX18gb3IgX19jb250ZXh0X18/CisgICAgZmluYWxseToKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KG9sZF90aW1lb3V0KQorCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgY2FwdHVyZWRfb3V0cHV0KHN0cmVhbV9uYW1lKToKKyAgICAiIiJSZXR1cm4gYSBjb250ZXh0IG1hbmFnZXIgdXNlZCBieSBjYXB0dXJlZF9zdGRvdXQgYW5kIGNhcHR1cmVkX3N0ZGluCisgICAgdGhhdCB0ZW1wb3JhcmlseSByZXBsYWNlcyB0aGUgc3lzIHN0cmVhbSAqc3RyZWFtX25hbWUqIHdpdGggYSBTdHJpbmdJTy4iIiIKKyAgICBpbXBvcnQgU3RyaW5nSU8KKyAgICBvcmlnX3N0ZG91dCA9IGdldGF0dHIoc3lzLCBzdHJlYW1fbmFtZSkKKyAgICBzZXRhdHRyKHN5cywgc3RyZWFtX25hbWUsIFN0cmluZ0lPLlN0cmluZ0lPKCkpCisgICAgdHJ5OgorICAgICAgICB5aWVsZCBnZXRhdHRyKHN5cywgc3RyZWFtX25hbWUpCisgICAgZmluYWxseToKKyAgICAgICAgc2V0YXR0cihzeXMsIHN0cmVhbV9uYW1lLCBvcmlnX3N0ZG91dCkKKworZGVmIGNhcHR1cmVkX3N0ZG91dCgpOgorICAgICIiIkNhcHR1cmUgdGhlIG91dHB1dCBvZiBzeXMuc3Rkb3V0OgorCisgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzOgorICAgICAgICAgICBwcmludCAiaGVsbG8iCisgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICJoZWxsbyIpCisgICAgIiIiCisgICAgcmV0dXJuIGNhcHR1cmVkX291dHB1dCgic3Rkb3V0IikKKworZGVmIGNhcHR1cmVkX3N0ZGVycigpOgorICAgIHJldHVybiBjYXB0dXJlZF9vdXRwdXQoInN0ZGVyciIpCisKK2RlZiBjYXB0dXJlZF9zdGRpbigpOgorICAgIHJldHVybiBjYXB0dXJlZF9vdXRwdXQoInN0ZGluIikKKworZGVmIGdjX2NvbGxlY3QoKToKKyAgICAiIiJGb3JjZSBhcyBtYW55IG9iamVjdHMgYXMgcG9zc2libGUgdG8gYmUgY29sbGVjdGVkLgorCisgICAgSW4gbm9uLUNQeXRob24gaW1wbGVtZW50YXRpb25zIG9mIFB5dGhvbiwgdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aW1lbHkKKyAgICBkZWFsbG9jYXRpb24gaXMgbm90IGd1YXJhbnRlZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLiAgKEV2ZW4gaW4gQ1B5dGhvbgorICAgIHRoaXMgY2FuIGJlIHRoZSBjYXNlIGluIGNhc2Ugb2YgcmVmZXJlbmNlIGN5Y2xlcy4pICBUaGlzIG1lYW5zIHRoYXQgX19kZWxfXworICAgIG1ldGhvZHMgbWF5IGJlIGNhbGxlZCBsYXRlciB0aGFuIGV4cGVjdGVkIGFuZCB3ZWFrcmVmcyBtYXkgcmVtYWluIGFsaXZlIGZvcgorICAgIGxvbmdlciB0aGFuIGV4cGVjdGVkLiAgVGhpcyBmdW5jdGlvbiB0cmllcyBpdHMgYmVzdCB0byBmb3JjZSBhbGwgZ2FyYmFnZQorICAgIG9iamVjdHMgdG8gZGlzYXBwZWFyLgorICAgICIiIgorICAgIGdjLmNvbGxlY3QoKQorICAgIGlmIGlzX2p5dGhvbjoKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgZ2MuY29sbGVjdCgpCisgICAgZ2MuY29sbGVjdCgpCisKKworX2hlYWRlciA9ICcyUCcKK2lmIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgIF9oZWFkZXIgPSAnMlAnICsgX2hlYWRlcgorX3ZoZWFkZXIgPSBfaGVhZGVyICsgJ1AnCisKK2RlZiBjYWxjb2Jqc2l6ZShmbXQpOgorICAgIHJldHVybiBzdHJ1Y3QuY2FsY3NpemUoX2hlYWRlciArIGZtdCArICcwUCcpCisKK2RlZiBjYWxjdm9ianNpemUoZm10KToKKyAgICByZXR1cm4gc3RydWN0LmNhbGNzaXplKF92aGVhZGVyICsgZm10ICsgJzBQJykKKworCitfVFBGTEFHU19IQVZFX0dDID0gMTw8MTQKK19UUEZMQUdTX0hFQVBUWVBFID0gMTw8OQorCitkZWYgY2hlY2tfc2l6ZW9mKHRlc3QsIG8sIHNpemUpOgorICAgIHJlc3VsdCA9IHN5cy5nZXRzaXplb2YobykKKyAgICAjIGFkZCBHQyBoZWFkZXIgc2l6ZQorICAgIGlmICgodHlwZShvKSA9PSB0eXBlKSBhbmQgKG8uX19mbGFnc19fICYgX1RQRkxBR1NfSEVBUFRZUEUpIG9yXAorICAgICAgICAoKHR5cGUobykgIT0gdHlwZSkgYW5kICh0eXBlKG8pLl9fZmxhZ3NfXyAmIF9UUEZMQUdTX0hBVkVfR0MpKSk6CisgICAgICAgIHNpemUgKz0gX3Rlc3RjYXBpLlNJWkVPRl9QWUdDX0hFQUQKKyAgICBtc2cgPSAnd3Jvbmcgc2l6ZSBmb3IgJXM6IGdvdCAlZCwgZXhwZWN0ZWQgJWQnIFwKKyAgICAgICAgICAgICUgKHR5cGUobyksIHJlc3VsdCwgc2l6ZSkKKyAgICB0ZXN0LmFzc2VydEVxdWFsKHJlc3VsdCwgc2l6ZSwgbXNnKQorCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBEZWNvcmF0b3IgZm9yIHJ1bm5pbmcgYSBmdW5jdGlvbiBpbiBhIGRpZmZlcmVudCBsb2NhbGUsIGNvcnJlY3RseSByZXNldHRpbmcKKyMgaXQgYWZ0ZXJ3YXJkcy4KKworZGVmIHJ1bl93aXRoX2xvY2FsZShjYXRzdHIsICpsb2NhbGVzKToKKyAgICBkZWYgZGVjb3JhdG9yKGZ1bmMpOgorICAgICAgICBkZWYgaW5uZXIoKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IGxvY2FsZQorICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gZ2V0YXR0cihsb2NhbGUsIGNhdHN0cikKKyAgICAgICAgICAgICAgICBvcmlnX2xvY2FsZSA9IGxvY2FsZS5zZXRsb2NhbGUoY2F0ZWdvcnkpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBpZiB0aGUgdGVzdCBhdXRob3IgZ2l2ZXMgdXMgYW4gaW52YWxpZCBjYXRlZ29yeSBzdHJpbmcKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICMgY2Fubm90IHJldHJpZXZlIG9yaWdpbmFsIGxvY2FsZSwgc28gZG8gbm90aGluZworICAgICAgICAgICAgICAgIGxvY2FsZSA9IG9yaWdfbG9jYWxlID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgbG9jIGluIGxvY2FsZXM6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUoY2F0ZWdvcnksIGxvYykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgIyBub3cgcnVuIHRoZSBmdW5jdGlvbiwgcmVzZXR0aW5nIHRoZSBsb2NhbGUgb24gZXhjZXB0aW9ucworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3ZHMpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIGxvY2FsZSBhbmQgb3JpZ19sb2NhbGU6CisgICAgICAgICAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUoY2F0ZWdvcnksIG9yaWdfbG9jYWxlKQorICAgICAgICBpbm5lci5mdW5jX25hbWUgPSBmdW5jLmZ1bmNfbmFtZQorICAgICAgICBpbm5lci5fX2RvY19fID0gZnVuYy5fX2RvY19fCisgICAgICAgIHJldHVybiBpbm5lcgorICAgIHJldHVybiBkZWNvcmF0b3IKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEJpZy1tZW1vcnktdGVzdCBzdXBwb3J0LiBTZXBhcmF0ZSBmcm9tICdyZXNvdXJjZXMnIGJlY2F1c2UgbWVtb3J5IHVzZSBzaG91bGQgYmUgY29uZmlndXJhYmxlLgorCisjIFNvbWUgaGFuZHkgc2hvcnRoYW5kcy4gTm90ZSB0aGF0IHRoZXNlIGFyZSB1c2VkIGZvciBieXRlLWxpbWl0cyBhcyB3ZWxsCisjIGFzIHNpemUtbGltaXRzLCBpbiB0aGUgdmFyaW91cyBiaWdtZW0gdGVzdHMKK18xTSA9IDEwMjQqMTAyNAorXzFHID0gMTAyNCAqIF8xTQorXzJHID0gMiAqIF8xRworXzRHID0gNCAqIF8xRworCitNQVhfUHlfc3NpemVfdCA9IHN5cy5tYXhzaXplCisKK2RlZiBzZXRfbWVtbGltaXQobGltaXQpOgorICAgIGdsb2JhbCBtYXhfbWVtdXNlCisgICAgZ2xvYmFsIHJlYWxfbWF4X21lbXVzZQorICAgIHNpemVzID0geworICAgICAgICAnayc6IDEwMjQsCisgICAgICAgICdtJzogXzFNLAorICAgICAgICAnZyc6IF8xRywKKyAgICAgICAgJ3QnOiAxMDI0Kl8xRywKKyAgICB9CisgICAgbSA9IHJlLm1hdGNoKHInKFxkKyhcLlxkKyk/KSAoS3xNfEd8VCliPyQnLCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgcmUuSUdOT1JFQ0FTRSB8IHJlLlZFUkJPU0UpCisgICAgaWYgbSBpcyBOb25lOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkIG1lbW9yeSBsaW1pdCAlcicgJSAobGltaXQsKSkKKyAgICBtZW1saW1pdCA9IGludChmbG9hdChtLmdyb3VwKDEpKSAqIHNpemVzW20uZ3JvdXAoMykubG93ZXIoKV0pCisgICAgcmVhbF9tYXhfbWVtdXNlID0gbWVtbGltaXQKKyAgICBpZiBtZW1saW1pdCA+IE1BWF9QeV9zc2l6ZV90OgorICAgICAgICBtZW1saW1pdCA9IE1BWF9QeV9zc2l6ZV90CisgICAgaWYgbWVtbGltaXQgPCBfMkcgLSAxOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdNZW1vcnkgbGltaXQgJXIgdG9vIGxvdyB0byBiZSB1c2VmdWwnICUgKGxpbWl0LCkpCisgICAgbWF4X21lbXVzZSA9IG1lbWxpbWl0CisKK2RlZiBiaWdtZW10ZXN0KG1pbnNpemUsIG1lbXVzZSwgb3ZlcmhlYWQ9NSpfMU0pOgorICAgICIiIkRlY29yYXRvciBmb3IgYmlnbWVtIHRlc3RzLgorCisgICAgJ21pbnNpemUnIGlzIHRoZSBtaW5pbXVtIHVzZWZ1bCBzaXplIGZvciB0aGUgdGVzdCAoaW4gYXJiaXRyYXJ5LAorICAgIHRlc3QtaW50ZXJwcmV0ZWQgdW5pdHMuKSAnbWVtdXNlJyBpcyB0aGUgbnVtYmVyIG9mICdieXRlcyBwZXIgc2l6ZScgZm9yCisgICAgdGhlIHRlc3QsIG9yIGEgZ29vZCBlc3RpbWF0ZSBvZiBpdC4gJ292ZXJoZWFkJyBzcGVjaWZpZXMgZml4ZWQgb3ZlcmhlYWQsCisgICAgaW5kZXBlbmRlbnQgb2YgdGhlIHRlc3RzaXplLCBhbmQgZGVmYXVsdHMgdG8gNU1iLgorCisgICAgVGhlIGRlY29yYXRvciB0cmllcyB0byBndWVzcyBhIGdvb2QgdmFsdWUgZm9yICdzaXplJyBhbmQgcGFzc2VzIGl0IHRvCisgICAgdGhlIGRlY29yYXRlZCB0ZXN0IGZ1bmN0aW9uLiBJZiBtaW5zaXplICogbWVtdXNlIGlzIG1vcmUgdGhhbiB0aGUKKyAgICBhbGxvd2VkIG1lbW9yeSB1c2UgKGFzIGRlZmluZWQgYnkgbWF4X21lbXVzZSksIHRoZSB0ZXN0IGlzIHNraXBwZWQuCisgICAgT3RoZXJ3aXNlLCBtaW5zaXplIGlzIGFkanVzdGVkIHVwd2FyZCB0byB1c2UgdXAgdG8gbWF4X21lbXVzZS4KKyAgICAiIiIKKyAgICBkZWYgZGVjb3JhdG9yKGYpOgorICAgICAgICBkZWYgd3JhcHBlcihzZWxmKToKKyAgICAgICAgICAgIGlmIG5vdCBtYXhfbWVtdXNlOgorICAgICAgICAgICAgICAgICMgSWYgbWF4X21lbXVzZSBpcyAwICh0aGUgZGVmYXVsdCksCisgICAgICAgICAgICAgICAgIyB3ZSBzdGlsbCB3YW50IHRvIHJ1biB0aGUgdGVzdHMgd2l0aCBzaXplIHNldCB0byBhIGZldyBrYiwKKyAgICAgICAgICAgICAgICAjIHRvIG1ha2Ugc3VyZSB0aGV5IHdvcmsuIFdlIHN0aWxsIHdhbnQgdG8gYXZvaWQgdXNpbmcKKyAgICAgICAgICAgICAgICAjIHRvbyBtdWNoIG1lbW9yeSwgdGhvdWdoLCBidXQgd2UgZG8gdGhhdCBub2lzaWx5LgorICAgICAgICAgICAgICAgIG1heHNpemUgPSA1MTQ3CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtYXhzaXplICogbWVtdXNlICsgb3ZlcmhlYWQgPiAyMCAqIF8xTSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbWF4c2l6ZSA9IGludCgobWF4X21lbXVzZSAtIG92ZXJoZWFkKSAvIG1lbXVzZSkKKyAgICAgICAgICAgICAgICBpZiBtYXhzaXplIDwgbWluc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgIyBSZWFsbHkgb3VnaHQgdG8gcHJpbnQgJ3Rlc3Qgc2tpcHBlZCcgb3Igc29tZXRoaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJTa2lwcGluZyAlcyBiZWNhdXNlIG9mIG1lbW9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdHJhaW50XG4iICUgKGYuX19uYW1lX18sKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgIyBUcnkgdG8ga2VlcCBzb21lIGJyZWF0aGluZyByb29tIGluIG1lbW9yeSB1c2UKKyAgICAgICAgICAgICAgICBtYXhzaXplID0gbWF4KG1heHNpemUgLSA1MCAqIF8xTSwgbWluc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBmKHNlbGYsIG1heHNpemUpCisgICAgICAgIHdyYXBwZXIubWluc2l6ZSA9IG1pbnNpemUKKyAgICAgICAgd3JhcHBlci5tZW11c2UgPSBtZW11c2UKKyAgICAgICAgd3JhcHBlci5vdmVyaGVhZCA9IG92ZXJoZWFkCisgICAgICAgIHJldHVybiB3cmFwcGVyCisgICAgcmV0dXJuIGRlY29yYXRvcgorCitkZWYgcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplLCBtZW11c2UsIG92ZXJoZWFkPTUqXzFNLCBkcnlfcnVuPVRydWUpOgorICAgIGRlZiBkZWNvcmF0b3IoZik6CisgICAgICAgIGRlZiB3cmFwcGVyKHNlbGYpOgorICAgICAgICAgICAgaWYgbm90IHJlYWxfbWF4X21lbXVzZToKKyAgICAgICAgICAgICAgICBtYXhzaXplID0gNTE0NworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtYXhzaXplID0gc2l6ZQorCisgICAgICAgICAgICBpZiAoKHJlYWxfbWF4X21lbXVzZSBvciBub3QgZHJ5X3J1bikKKyAgICAgICAgICAgICAgICBhbmQgcmVhbF9tYXhfbWVtdXNlIDwgbWF4c2l6ZSAqIG1lbXVzZSk6CisgICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiU2tpcHBpbmcgJXMgYmVjYXVzZSBvZiBtZW1vcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdHJhaW50XG4iICUgKGYuX19uYW1lX18sKSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgcmV0dXJuIGYoc2VsZiwgbWF4c2l6ZSkKKyAgICAgICAgd3JhcHBlci5zaXplID0gc2l6ZQorICAgICAgICB3cmFwcGVyLm1lbXVzZSA9IG1lbXVzZQorICAgICAgICB3cmFwcGVyLm92ZXJoZWFkID0gb3ZlcmhlYWQKKyAgICAgICAgcmV0dXJuIHdyYXBwZXIKKyAgICByZXR1cm4gZGVjb3JhdG9yCisKK2RlZiBiaWdhZGRyc3BhY2V0ZXN0KGYpOgorICAgICIiIkRlY29yYXRvciBmb3IgdGVzdHMgdGhhdCBmaWxsIHRoZSBhZGRyZXNzIHNwYWNlLiIiIgorICAgIGRlZiB3cmFwcGVyKHNlbGYpOgorICAgICAgICBpZiBtYXhfbWVtdXNlIDwgTUFYX1B5X3NzaXplX3Q6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlNraXBwaW5nICVzIGJlY2F1c2Ugb2YgbWVtb3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdHJhaW50XG4iICUgKGYuX19uYW1lX18sKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBmKHNlbGYpCisgICAgcmV0dXJuIHdyYXBwZXIKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIHVuaXR0ZXN0IGludGVncmF0aW9uLgorCitjbGFzcyBCYXNpY1Rlc3RSdW5uZXI6CisgICAgZGVmIHJ1bihzZWxmLCB0ZXN0KToKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHRlc3QocmVzdWx0KQorICAgICAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBfaWQob2JqKToKKyAgICByZXR1cm4gb2JqCisKK2RlZiByZXF1aXJlc19yZXNvdXJjZShyZXNvdXJjZSk6CisgICAgaWYgaXNfcmVzb3VyY2VfZW5hYmxlZChyZXNvdXJjZSk6CisgICAgICAgIHJldHVybiBfaWQKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gdW5pdHRlc3Quc2tpcCgicmVzb3VyY2UgezAhcn0gaXMgbm90IGVuYWJsZWQiLmZvcm1hdChyZXNvdXJjZSkpCisKK2RlZiBjcHl0aG9uX29ubHkodGVzdCk6CisgICAgIiIiCisgICAgRGVjb3JhdG9yIGZvciB0ZXN0cyBvbmx5IGFwcGxpY2FibGUgb24gQ1B5dGhvbi4KKyAgICAiIiIKKyAgICByZXR1cm4gaW1wbF9kZXRhaWwoY3B5dGhvbj1UcnVlKSh0ZXN0KQorCitkZWYgaW1wbF9kZXRhaWwobXNnPU5vbmUsICoqZ3VhcmRzKToKKyAgICBpZiBjaGVja19pbXBsX2RldGFpbCgqKmd1YXJkcyk6CisgICAgICAgIHJldHVybiBfaWQKKyAgICBpZiBtc2cgaXMgTm9uZToKKyAgICAgICAgZ3VhcmRuYW1lcywgZGVmYXVsdCA9IF9wYXJzZV9ndWFyZHMoZ3VhcmRzKQorICAgICAgICBpZiBkZWZhdWx0OgorICAgICAgICAgICAgbXNnID0gImltcGxlbWVudGF0aW9uIGRldGFpbCBub3QgYXZhaWxhYmxlIG9uIHswfSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZyA9ICJpbXBsZW1lbnRhdGlvbiBkZXRhaWwgc3BlY2lmaWMgdG8gezB9IgorICAgICAgICBndWFyZG5hbWVzID0gc29ydGVkKGd1YXJkbmFtZXMua2V5cygpKQorICAgICAgICBtc2cgPSBtc2cuZm9ybWF0KCcgb3IgJy5qb2luKGd1YXJkbmFtZXMpKQorICAgIHJldHVybiB1bml0dGVzdC5za2lwKG1zZykKKworZGVmIF9wYXJzZV9ndWFyZHMoZ3VhcmRzKToKKyAgICAjIFJldHVybnMgYSB0dXBsZSAoe3BsYXRmb3JtX25hbWU6IHJ1bl9tZX0sIGRlZmF1bHRfdmFsdWUpCisgICAgaWYgbm90IGd1YXJkczoKKyAgICAgICAgcmV0dXJuICh7J2NweXRob24nOiBUcnVlfSwgRmFsc2UpCisgICAgaXNfdHJ1ZSA9IGd1YXJkcy52YWx1ZXMoKVswXQorICAgIGFzc2VydCBndWFyZHMudmFsdWVzKCkgPT0gW2lzX3RydWVdICogbGVuKGd1YXJkcykgICAjIGFsbCBUcnVlIG9yIGFsbCBGYWxzZQorICAgIHJldHVybiAoZ3VhcmRzLCBub3QgaXNfdHJ1ZSkKKworIyBVc2UgdGhlIGZvbGxvd2luZyBjaGVjayB0byBndWFyZCBDUHl0aG9uJ3MgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgdGVzdHMgLS0KKyMgb3IgdG8gcnVuIHRoZW0gb25seSBvbiB0aGUgaW1wbGVtZW50YXRpb24ocykgZ3VhcmRlZCBieSB0aGUgYXJndW1lbnRzLgorZGVmIGNoZWNrX2ltcGxfZGV0YWlsKCoqZ3VhcmRzKToKKyAgICAiIiJUaGlzIGZ1bmN0aW9uIHJldHVybnMgVHJ1ZSBvciBGYWxzZSBkZXBlbmRpbmcgb24gdGhlIGhvc3QgcGxhdGZvcm0uCisgICAgICAgRXhhbXBsZXM6CisgICAgICAgICAgaWYgY2hlY2tfaW1wbF9kZXRhaWwoKTogICAgICAgICAgICAgICAjIG9ubHkgb24gQ1B5dGhvbiAoZGVmYXVsdCkKKyAgICAgICAgICBpZiBjaGVja19pbXBsX2RldGFpbChqeXRob249VHJ1ZSk6ICAgICMgb25seSBvbiBKeXRob24KKyAgICAgICAgICBpZiBjaGVja19pbXBsX2RldGFpbChjcHl0aG9uPUZhbHNlKTogICMgZXZlcnl3aGVyZSBleGNlcHQgb24gQ1B5dGhvbgorICAgICIiIgorICAgIGd1YXJkcywgZGVmYXVsdCA9IF9wYXJzZV9ndWFyZHMoZ3VhcmRzKQorICAgIHJldHVybiBndWFyZHMuZ2V0KHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLmxvd2VyKCksIGRlZmF1bHQpCisKKworCitkZWYgX3J1bl9zdWl0ZShzdWl0ZSk6CisgICAgIiIiUnVuIHRlc3RzIGZyb20gYSB1bml0dGVzdC5UZXN0U3VpdGUtZGVyaXZlZCBjbGFzcy4iIiIKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcihzeXMuc3Rkb3V0LCB2ZXJib3NpdHk9MikKKyAgICBlbHNlOgorICAgICAgICBydW5uZXIgPSBCYXNpY1Rlc3RSdW5uZXIoKQorCisgICAgcmVzdWx0ID0gcnVubmVyLnJ1bihzdWl0ZSkKKyAgICBpZiBub3QgcmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKToKKyAgICAgICAgaWYgbGVuKHJlc3VsdC5lcnJvcnMpID09IDEgYW5kIG5vdCByZXN1bHQuZmFpbHVyZXM6CisgICAgICAgICAgICBlcnIgPSByZXN1bHQuZXJyb3JzWzBdWzFdCisgICAgICAgIGVsaWYgbGVuKHJlc3VsdC5mYWlsdXJlcykgPT0gMSBhbmQgbm90IHJlc3VsdC5lcnJvcnM6CisgICAgICAgICAgICBlcnIgPSByZXN1bHQuZmFpbHVyZXNbMF1bMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVyciA9ICJtdWx0aXBsZSBlcnJvcnMgb2NjdXJyZWQiCisgICAgICAgICAgICBpZiBub3QgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBlcnIgKz0gIjsgcnVuIGluIHZlcmJvc2UgbW9kZSBmb3IgZGV0YWlscyIKKyAgICAgICAgcmFpc2UgVGVzdEZhaWxlZChlcnIpCisKKworZGVmIHJ1bl91bml0dGVzdCgqY2xhc3Nlcyk6CisgICAgIiIiUnVuIHRlc3RzIGZyb20gdW5pdHRlc3QuVGVzdENhc2UtZGVyaXZlZCBjbGFzc2VzLiIiIgorICAgIHZhbGlkX3R5cGVzID0gKHVuaXR0ZXN0LlRlc3RTdWl0ZSwgdW5pdHRlc3QuVGVzdENhc2UpCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGZvciBjbHMgaW4gY2xhc3NlczoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShjbHMsIHN0cik6CisgICAgICAgICAgICBpZiBjbHMgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5maW5kVGVzdENhc2VzKHN5cy5tb2R1bGVzW2Nsc10pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdHIgYXJndW1lbnRzIG11c3QgYmUga2V5cyBpbiBzeXMubW9kdWxlcyIpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShjbHMsIHZhbGlkX3R5cGVzKToKKyAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QoY2xzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoY2xzKSkKKyAgICBfcnVuX3N1aXRlKHN1aXRlKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQ2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBkb2NzdHJpbmdzLgorCitIQVZFX0RPQ1NUUklOR1MgPSAoY2hlY2tfaW1wbF9kZXRhaWwoY3B5dGhvbj1GYWxzZSkgb3IKKyAgICAgICAgICAgICAgICAgICBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBvcgorICAgICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignV0lUSF9ET0NfU1RSSU5HUycpKQorCityZXF1aXJlc19kb2NzdHJpbmdzID0gdW5pdHRlc3Quc2tpcFVubGVzcyhIQVZFX0RPQ1NUUklOR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCByZXF1aXJlcyBkb2NzdHJpbmdzIikKKworCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgZG9jdGVzdCBkcml2ZXIuCisKK2RlZiBydW5fZG9jdGVzdChtb2R1bGUsIHZlcmJvc2l0eT1Ob25lKToKKyAgICAiIiJSdW4gZG9jdGVzdCBvbiB0aGUgZ2l2ZW4gbW9kdWxlLiAgUmV0dXJuICgjZmFpbHVyZXMsICN0ZXN0cykuCisKKyAgICBJZiBvcHRpb25hbCBhcmd1bWVudCB2ZXJib3NpdHkgaXMgbm90IHNwZWNpZmllZCAob3IgaXMgTm9uZSksIHBhc3MKKyAgICB0ZXN0X3N1cHBvcnQncyBiZWxpZWYgYWJvdXQgdmVyYm9zaXR5IG9uIHRvIGRvY3Rlc3QuICBFbHNlIGRvY3Rlc3QncworICAgIHVzdWFsIGJlaGF2aW9yIGlzIHVzZWQgKGl0IHNlYXJjaGVzIHN5cy5hcmd2IGZvciAtdikuCisgICAgIiIiCisKKyAgICBpbXBvcnQgZG9jdGVzdAorCisgICAgaWYgdmVyYm9zaXR5IGlzIE5vbmU6CisgICAgICAgIHZlcmJvc2l0eSA9IHZlcmJvc2UKKyAgICBlbHNlOgorICAgICAgICB2ZXJib3NpdHkgPSBOb25lCisKKyAgICAjIERpcmVjdCBkb2N0ZXN0IG91dHB1dCAobm9ybWFsbHkganVzdCBlcnJvcnMpIHRvIHJlYWwgc3Rkb3V0OyBkb2N0ZXN0CisgICAgIyBvdXRwdXQgc2hvdWxkbid0IGJlIGNvbXBhcmVkIGJ5IHJlZ3J0ZXN0LgorICAgIHNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgIHN5cy5zdGRvdXQgPSBnZXRfb3JpZ2luYWxfc3Rkb3V0KCkKKyAgICB0cnk6CisgICAgICAgIGYsIHQgPSBkb2N0ZXN0LnRlc3Rtb2QobW9kdWxlLCB2ZXJib3NlPXZlcmJvc2l0eSkKKyAgICAgICAgaWYgZjoKKyAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoIiVkIG9mICVkIGRvY3Rlc3RzIGZhaWxlZCIgJSAoZiwgdCkpCisgICAgZmluYWxseToKKyAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2RvY3Rlc3QgKCVzKSAuLi4gJWQgdGVzdHMgd2l0aCB6ZXJvIGZhaWx1cmVzJyAlIChtb2R1bGUuX19uYW1lX18sIHQpCisgICAgcmV0dXJuIGYsIHQKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFRocmVhZGluZyBzdXBwb3J0IHRvIHByZXZlbnQgcmVwb3J0aW5nIHJlZmxlYWtzIHdoZW4gcnVubmluZyByZWdydGVzdC5weSAtUgorCisjIE5PVEU6IHdlIHVzZSB0aHJlYWQuX2NvdW50KCkgcmF0aGVyIHRoYW4gdGhyZWFkaW5nLmVudW1lcmF0ZSgpIChvciB0aGUKKyMgbW9yYWwgZXF1aXZhbGVudCB0aGVyZW9mKSBiZWNhdXNlIGEgdGhyZWFkaW5nLlRocmVhZCBvYmplY3QgaXMgc3RpbGwgYWxpdmUKKyMgdW50aWwgaXRzIF9fYm9vdHN0cmFwKCkgbWV0aG9kIGhhcyByZXR1cm5lZCwgZXZlbiBhZnRlciBpdCBoYXMgYmVlbgorIyB1bnJlZ2lzdGVyZWQgZnJvbSB0aGUgdGhyZWFkaW5nIG1vZHVsZS4KKyMgdGhyZWFkLl9jb3VudCgpLCBvbiB0aGUgb3RoZXIgaGFuZCwgb25seSBnZXRzIGRlY3JlbWVudGVkICphZnRlciogdGhlCisjIF9fYm9vdHN0cmFwKCkgbWV0aG9kIGhhcyByZXR1cm5lZCwgd2hpY2ggZ2l2ZXMgdXMgcmVsaWFibGUgcmVmZXJlbmNlIGNvdW50cworIyBhdCB0aGUgZW5kIG9mIGEgdGVzdCBydW4uCisKK2RlZiB0aHJlYWRpbmdfc2V0dXAoKToKKyAgICBpZiB0aHJlYWQ6CisgICAgICAgIHJldHVybiB0aHJlYWQuX2NvdW50KCksCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIDEsCisKK2RlZiB0aHJlYWRpbmdfY2xlYW51cChuYl90aHJlYWRzKToKKyAgICBpZiBub3QgdGhyZWFkOgorICAgICAgICByZXR1cm4KKworICAgIF9NQVhfQ09VTlQgPSAxMAorICAgIGZvciBjb3VudCBpbiByYW5nZShfTUFYX0NPVU5UKToKKyAgICAgICAgbiA9IHRocmVhZC5fY291bnQoKQorICAgICAgICBpZiBuID09IG5iX3RocmVhZHM6CisgICAgICAgICAgICBicmVhaworICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAjIFhYWCBwcmludCBhIHdhcm5pbmcgaW4gY2FzZSBvZiBmYWlsdXJlPworCitkZWYgcmVhcF90aHJlYWRzKGZ1bmMpOgorICAgICIiIlVzZSB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhyZWFkcyBhcmUgYmVpbmcgdXNlZC4gIFRoaXMgd2lsbAorICAgIGVuc3VyZSB0aGF0IHRoZSB0aHJlYWRzIGFyZSBjbGVhbmVkIHVwIGV2ZW4gd2hlbiB0aGUgdGVzdCBmYWlscy4KKyAgICBJZiB0aHJlYWRpbmcgaXMgdW5hdmFpbGFibGUgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuCisgICAgIiIiCisgICAgaWYgbm90IHRocmVhZDoKKyAgICAgICAgcmV0dXJuIGZ1bmMKKworICAgIEBmdW5jdG9vbHMud3JhcHMoZnVuYykKKyAgICBkZWYgZGVjb3JhdG9yKCphcmdzKToKKyAgICAgICAga2V5ID0gdGhyZWFkaW5nX3NldHVwKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0aHJlYWRpbmdfY2xlYW51cCgqa2V5KQorICAgIHJldHVybiBkZWNvcmF0b3IKKworZGVmIHJlYXBfY2hpbGRyZW4oKToKKyAgICAiIiJVc2UgdGhpcyBmdW5jdGlvbiBhdCB0aGUgZW5kIG9mIHRlc3RfbWFpbigpIHdoZW5ldmVyIHN1Yi1wcm9jZXNzZXMKKyAgICBhcmUgc3RhcnRlZC4gIFRoaXMgd2lsbCBoZWxwIGVuc3VyZSB0aGF0IG5vIGV4dHJhIGNoaWxkcmVuICh6b21iaWVzKQorICAgIHN0aWNrIGFyb3VuZCB0byBob2cgcmVzb3VyY2VzIGFuZCBjcmVhdGUgcHJvYmxlbXMgd2hlbiBsb29raW5nCisgICAgZm9yIHJlZmxlYWtzLgorICAgICIiIgorCisgICAgIyBSZWFwIGFsbCBvdXIgZGVhZCBjaGlsZCBwcm9jZXNzZXMgc28gd2UgZG9uJ3QgbGVhdmUgem9tYmllcyBhcm91bmQuCisgICAgIyBUaGVzZSBob2cgcmVzb3VyY2VzIGFuZCBtaWdodCBiZSBjYXVzaW5nIHNvbWUgb2YgdGhlIGJ1aWxkYm90cyB0byBkaWUuCisgICAgaWYgaGFzYXR0cihvcywgJ3dhaXRwaWQnKToKKyAgICAgICAgYW55X3Byb2Nlc3MgPSAtMQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgVGhpcyB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBvbiBXaW5kb3dzLiAgVGhhdCdzIG9rLgorICAgICAgICAgICAgICAgIHBpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChhbnlfcHJvY2Vzcywgb3MuV05PSEFORykKKyAgICAgICAgICAgICAgICBpZiBwaWQgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBicmVhaworCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIHN3YXBfYXR0cihvYmosIGF0dHIsIG5ld192YWwpOgorICAgICIiIlRlbXBvcmFyeSBzd2FwIG91dCBhbiBhdHRyaWJ1dGUgd2l0aCBhIG5ldyBvYmplY3QuCisKKyAgICBVc2FnZToKKyAgICAgICAgd2l0aCBzd2FwX2F0dHIob2JqLCAiYXR0ciIsIDUpOgorICAgICAgICAgICAgLi4uCisKKyAgICAgICAgVGhpcyB3aWxsIHNldCBvYmouYXR0ciB0byA1IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHdpdGg6IGJsb2NrLAorICAgICAgICByZXN0b3JpbmcgdGhlIG9sZCB2YWx1ZSBhdCB0aGUgZW5kIG9mIHRoZSBibG9jay4gSWYgYGF0dHJgIGRvZXNuJ3QKKyAgICAgICAgZXhpc3Qgb24gYG9iamAsIGl0IHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlbiBkZWxldGVkIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAgIGJsb2NrLgorICAgICIiIgorICAgIGlmIGhhc2F0dHIob2JqLCBhdHRyKToKKyAgICAgICAgcmVhbF92YWwgPSBnZXRhdHRyKG9iaiwgYXR0cikKKyAgICAgICAgc2V0YXR0cihvYmosIGF0dHIsIG5ld192YWwpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZXRhdHRyKG9iaiwgYXR0ciwgcmVhbF92YWwpCisgICAgZWxzZToKKyAgICAgICAgc2V0YXR0cihvYmosIGF0dHIsIG5ld192YWwpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWxhdHRyKG9iaiwgYXR0cikKKworZGVmIHB5M2tfYnl0ZXMoYik6CisgICAgIiIiRW11bGF0ZSB0aGUgcHkzayBieXRlcygpIGNvbnN0cnVjdG9yLgorCisgICAgTk9URTogVGhpcyBpcyBvbmx5IGEgYmVzdCBlZmZvcnQgZnVuY3Rpb24uCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICAjIG1lbW9yeXZpZXc/CisgICAgICAgIHJldHVybiBiLnRvYnl0ZXMoKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBpdGVyYWJsZSBvZiBpbnRzPworICAgICAgICAgICAgcmV0dXJuIGIiIi5qb2luKGNocih4KSBmb3IgeCBpbiBiKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzKGIpCisKK2RlZiBhcmdzX2Zyb21faW50ZXJwcmV0ZXJfZmxhZ3MoKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgcmVwcm9kdWNpbmcgdGhlIGN1cnJlbnQKKyAgICBzZXR0aW5ncyBpbiBzeXMuZmxhZ3MuIiIiCisgICAgaW1wb3J0IHN1YnByb2Nlc3MKKyAgICByZXR1cm4gc3VicHJvY2Vzcy5fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkKKworZGVmIHN0cmlwX3B5dGhvbl9zdGRlcnIoc3RkZXJyKToKKyAgICAiIiJTdHJpcCB0aGUgc3RkZXJyIG9mIGEgUHl0aG9uIHByb2Nlc3MgZnJvbSBwb3RlbnRpYWwgZGVidWcgb3V0cHV0CisgICAgZW1pdHRlZCBieSB0aGUgaW50ZXJwcmV0ZXIuCisKKyAgICBUaGlzIHdpbGwgdHlwaWNhbGx5IGJlIHJ1biBvbiB0aGUgcmVzdWx0IG9mIHRoZSBjb21tdW5pY2F0ZSgpIG1ldGhvZAorICAgIG9mIGEgc3VicHJvY2Vzcy5Qb3BlbiBvYmplY3QuCisgICAgIiIiCisgICAgc3RkZXJyID0gcmUuc3ViKGJyIlxbXGQrIHJlZnNcXVxyP1xuPyQiLCBiIiIsIHN0ZGVycikuc3RyaXAoKQorICAgIHJldHVybiBzdGRlcnIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1cHBvcnQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VwcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2NDBlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1cHBvcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1cHBvcnQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VwcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiMDBlZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1cHBvcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5bXRhYmxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ltdGFibGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzN2U4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5bXRhYmxlLnB5CkBAIC0wLDAgKzEsMTg0IEBACisiIiIKK1Rlc3QgdGhlIEFQSSBvZiB0aGUgc3ltdGFibGUgbW9kdWxlLgorIiIiCitpbXBvcnQgc3ltdGFibGUKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK1RFU1RfQ09ERSA9ICIiIgoraW1wb3J0IHN5cworCitnbG9iID0gNDIKKworY2xhc3MgTWluZToKKyAgICBpbnN0YW5jZV92YXIgPSAyNAorICAgIGRlZiBhX21ldGhvZChwMSwgcDIpOgorICAgICAgICBwYXNzCisKK2RlZiBzcGFtKGEsIGIsICp2YXIsICoqa3cpOgorICAgIGdsb2JhbCBiYXIKKyAgICBiYXIgPSA0NworICAgIHggPSAyMworICAgIGdsb2IKKyAgICBkZWYgaW50ZXJuYWwoKToKKyAgICAgICAgcmV0dXJuIHgKKyAgICByZXR1cm4gaW50ZXJuYWwKKworZGVmIGZvbygpOgorICAgIGV4ZWMgJ20nCisgICAgZnJvbSBzeXMgaW1wb3J0ICoKKworZGVmIG5hbWVzcGFjZV90ZXN0KCk6IHBhc3MKK2RlZiBuYW1lc3BhY2VfdGVzdCgpOiBwYXNzCisiIiIKKworCitkZWYgZmluZF9ibG9jayhibG9jaywgbmFtZSk6CisgICAgZm9yIGNoIGluIGJsb2NrLmdldF9jaGlsZHJlbigpOgorICAgICAgICBpZiBjaC5nZXRfbmFtZSgpID09IG5hbWU6CisgICAgICAgICAgICByZXR1cm4gY2gKKworCitjbGFzcyBTeW10YWJsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoCisgICAgICAgICAgICAoImltcG9ydCBcKiBvbmx5IGFsbG93ZWQgYXQgbW9kdWxlIGxldmVsIiwgU3ludGF4V2FybmluZykpOgorICAgICAgICB0b3AgPSBzeW10YWJsZS5zeW10YWJsZShURVNUX0NPREUsICI/IiwgImV4ZWMiKQorICAgICMgVGhlc2UgY29ycmVzcG9uZCB0byBzY29wZXMgaW4gVEVTVF9DT0RFCisgICAgTWluZSA9IGZpbmRfYmxvY2sodG9wLCAiTWluZSIpCisgICAgYV9tZXRob2QgPSBmaW5kX2Jsb2NrKE1pbmUsICJhX21ldGhvZCIpCisgICAgc3BhbSA9IGZpbmRfYmxvY2sodG9wLCAic3BhbSIpCisgICAgaW50ZXJuYWwgPSBmaW5kX2Jsb2NrKHNwYW0sICJpbnRlcm5hbCIpCisgICAgZm9vID0gZmluZF9ibG9jayh0b3AsICJmb28iKQorCisgICAgZGVmIHRlc3RfdHlwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRvcC5nZXRfdHlwZSgpLCAibW9kdWxlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLk1pbmUuZ2V0X3R5cGUoKSwgImNsYXNzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmFfbWV0aG9kLmdldF90eXBlKCksICJmdW5jdGlvbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zcGFtLmdldF90eXBlKCksICJmdW5jdGlvbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5pbnRlcm5hbC5nZXRfdHlwZSgpLCAiZnVuY3Rpb24iKQorCisgICAgZGVmIHRlc3Rfb3B0aW1pemVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudG9wLmlzX29wdGltaXplZCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudG9wLmhhc19leGVjKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi50b3AuaGFzX2ltcG9ydF9zdGFyKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuc3BhbS5pc19vcHRpbWl6ZWQoKSkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZm9vLmlzX29wdGltaXplZCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5mb28uaGFzX2V4ZWMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZm9vLmhhc19pbXBvcnRfc3RhcigpKQorCisgICAgZGVmIHRlc3RfbmVzdGVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudG9wLmlzX25lc3RlZCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuTWluZS5pc19uZXN0ZWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnNwYW0uaXNfbmVzdGVkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmludGVybmFsLmlzX25lc3RlZCgpKQorCisgICAgZGVmIHRlc3RfY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRvcC5oYXNfY2hpbGRyZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuTWluZS5oYXNfY2hpbGRyZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZvby5oYXNfY2hpbGRyZW4oKSkKKworICAgIGRlZiB0ZXN0X2xpbmVubyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRvcC5nZXRfbGluZW5vKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zcGFtLmdldF9saW5lbm8oKSwgMTEpCisKKyAgICBkZWYgdGVzdF9mdW5jdGlvbl9pbmZvKHNlbGYpOgorICAgICAgICBmdW5jID0gc2VsZi5zcGFtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGZ1bmMuZ2V0X3BhcmFtZXRlcnMoKSksIFsiYSIsICJiIiwgImt3IiwgInZhciJdKQorICAgICAgICBleHBlY3RlZCA9IFsiYSIsICJiIiwgImludGVybmFsIiwgImt3IiwgInZhciIsICJ4Il0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoZnVuYy5nZXRfbG9jYWxzKCkpLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoZnVuYy5nZXRfZ2xvYmFscygpKSwgWyJiYXIiLCAiZ2xvYiJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaW50ZXJuYWwuZ2V0X2ZyZWVzKCksICgieCIsKSkKKworICAgIGRlZiB0ZXN0X2dsb2JhbHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnNwYW0ubG9va3VwKCJnbG9iIikuaXNfZ2xvYmFsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5zcGFtLmxvb2t1cCgiZ2xvYiIpLmlzX2RlY2xhcmVkX2dsb2JhbCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zcGFtLmxvb2t1cCgiYmFyIikuaXNfZ2xvYmFsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnNwYW0ubG9va3VwKCJiYXIiKS5pc19kZWNsYXJlZF9nbG9iYWwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmludGVybmFsLmxvb2t1cCgieCIpLmlzX2dsb2JhbCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuTWluZS5sb29rdXAoImluc3RhbmNlX3ZhciIpLmlzX2dsb2JhbCgpKQorCisgICAgZGVmIHRlc3RfbG9jYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnNwYW0ubG9va3VwKCJ4IikuaXNfbG9jYWwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmludGVybmFsLmxvb2t1cCgieCIpLmlzX2xvY2FsKCkpCisKKyAgICBkZWYgdGVzdF9yZWZlcmVuY2VkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pbnRlcm5hbC5sb29rdXAoIngiKS5pc19yZWZlcmVuY2VkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnNwYW0ubG9va3VwKCJpbnRlcm5hbCIpLmlzX3JlZmVyZW5jZWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnNwYW0ubG9va3VwKCJ4IikuaXNfcmVmZXJlbmNlZCgpKQorCisgICAgZGVmIHRlc3RfcGFyYW1ldGVycyhzZWxmKToKKyAgICAgICAgZm9yIHN5bSBpbiAoImEiLCAidmFyIiwgImt3Iik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zcGFtLmxvb2t1cChzeW0pLmlzX3BhcmFtZXRlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuc3BhbS5sb29rdXAoIngiKS5pc19wYXJhbWV0ZXIoKSkKKworICAgIGRlZiB0ZXN0X3N5bWJvbF9sb29rdXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYudG9wLmdldF9pZGVudGlmaWVycygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oc2VsZi50b3AuZ2V0X3N5bWJvbHMoKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHNlbGYudG9wLmxvb2t1cCwgIm5vdF9oZXJlIikKKworICAgIGRlZiB0ZXN0X25hbWVzcGFjZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRvcC5sb29rdXAoIk1pbmUiKS5pc19uYW1lc3BhY2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuTWluZS5sb29rdXAoImFfbWV0aG9kIikuaXNfbmFtZXNwYWNlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRvcC5sb29rdXAoInNwYW0iKS5pc19uYW1lc3BhY2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuc3BhbS5sb29rdXAoImludGVybmFsIikuaXNfbmFtZXNwYWNlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRvcC5sb29rdXAoIm5hbWVzcGFjZV90ZXN0IikuaXNfbmFtZXNwYWNlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5zcGFtLmxvb2t1cCgieCIpLmlzX25hbWVzcGFjZSgpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRvcC5sb29rdXAoInNwYW0iKS5nZXRfbmFtZXNwYWNlKCkgaXMgc2VsZi5zcGFtKQorICAgICAgICBuc190ZXN0ID0gc2VsZi50b3AubG9va3VwKCJuYW1lc3BhY2VfdGVzdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5zX3Rlc3QuZ2V0X25hbWVzcGFjZXMoKSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG5zX3Rlc3QuZ2V0X25hbWVzcGFjZSkKKworICAgIGRlZiB0ZXN0X2Fzc2lnbmVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zcGFtLmxvb2t1cCgieCIpLmlzX2Fzc2lnbmVkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnNwYW0ubG9va3VwKCJiYXIiKS5pc19hc3NpZ25lZCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50b3AubG9va3VwKCJzcGFtIikuaXNfYXNzaWduZWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuTWluZS5sb29rdXAoImFfbWV0aG9kIikuaXNfYXNzaWduZWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmludGVybmFsLmxvb2t1cCgieCIpLmlzX2Fzc2lnbmVkKCkpCisKKyAgICBkZWYgdGVzdF9pbXBvcnRlZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudG9wLmxvb2t1cCgic3lzIikuaXNfaW1wb3J0ZWQoKSkKKworICAgIGRlZiB0ZXN0X25hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50b3AuZ2V0X25hbWUoKSwgInRvcCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zcGFtLmdldF9uYW1lKCksICJzcGFtIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNwYW0ubG9va3VwKCJ4IikuZ2V0X25hbWUoKSwgIngiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuTWluZS5nZXRfbmFtZSgpLCAiTWluZSIpCisKKyAgICBkZWYgdGVzdF9jbGFzc19pbmZvKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuTWluZS5nZXRfbWV0aG9kcygpLCAoJ2FfbWV0aG9kJywpKQorCisgICAgZGVmIHRlc3RfZmlsZW5hbWVfY29ycmVjdChzZWxmKToKKyAgICAgICAgIyMjIEJ1ZyB0aWNrbGVyOiBTeW50YXhFcnJvciBmaWxlIG5hbWUgY29ycmVjdCB3aGV0aGVyIGVycm9yIHJhaXNlZAorICAgICAgICAjIyMgd2hpbGUgcGFyc2luZyBvciBidWlsZGluZyBzeW1ib2wgdGFibGUuCisgICAgICAgIGRlZiBjaGVja2ZpbGVuYW1lKGJyb2tlbmNvZGUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5bXRhYmxlLnN5bXRhYmxlKGJyb2tlbmNvZGUsICJzcGFtIiwgImV4ZWMiKQorICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmZpbGVuYW1lLCAic3BhbSIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gU3ludGF4RXJyb3IgZm9yICVyIiAlIChicm9rZW5jb2RlLCkpCisgICAgICAgIGNoZWNrZmlsZW5hbWUoImRlZiBmKHgpOiBmb28pKCIpICAjIHBhcnNlLXRpbWUKKyAgICAgICAgY2hlY2tmaWxlbmFtZSgiZGVmIGYoeCk6IGdsb2JhbCB4IikgICMgc3ltdGFibGUtYnVpbGQtdGltZQorCisgICAgZGVmIHRlc3RfZXZhbChzZWxmKToKKyAgICAgICAgc3ltYm9scyA9IHN5bXRhYmxlLnN5bXRhYmxlKCI0MiIsICI/IiwgImV2YWwiKQorCisgICAgZGVmIHRlc3Rfc2luZ2xlKHNlbGYpOgorICAgICAgICBzeW1ib2xzID0gc3ltdGFibGUuc3ltdGFibGUoIjQyIiwgIj8iLCAic2luZ2xlIikKKworICAgIGRlZiB0ZXN0X2V4ZWMoc2VsZik6CisgICAgICAgIHN5bWJvbHMgPSBzeW10YWJsZS5zeW10YWJsZSgiZGVmIGYoeCk6IHJldHVybiB4IiwgIj8iLCAiZXhlYyIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3ltdGFibGVUZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW10YWJsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW10YWJsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3Y2ViOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5bXRhYmxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW10YWJsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW10YWJsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3Y2ViOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5bXRhYmxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW50YXgucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW50YXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5NGZlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5bnRheC5weQpAQCAtMCwwICsxLDU3MiBAQAorIiIiVGhpcyBtb2R1bGUgdGVzdHMgU3ludGF4RXJyb3JzLgorCitIZXJlJ3MgYW4gZXhhbXBsZSBvZiB0aGUgc29ydCBvZiB0aGluZyB0aGF0IGlzIHRlc3RlZC4KKworPj4+IGRlZiBmKHgpOgorLi4uICAgICBnbG9iYWwgeAorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorU3ludGF4RXJyb3I6IG5hbWUgJ3gnIGlzIGxvY2FsIGFuZCBnbG9iYWwgKDxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMF0+LCBsaW5lIDEpCisKK1RoZSB0ZXN0cyBhcmUgYWxsIHJhaXNlIFN5bnRheEVycm9ycy4gIFRoZXkgd2VyZSBjcmVhdGVkIGJ5IGNoZWNraW5nCitlYWNoIEMgY2FsbCB0aGF0IHJhaXNlcyBTeW50YXhFcnJvci4gIFRoZXJlIGFyZSBzZXZlcmFsIG1vZHVsZXMgdGhhdAorcmFpc2UgdGhlc2UgZXhjZXB0aW9ucy0tIGFzdC5jLCBjb21waWxlLmMsIGZ1dHVyZS5jLCBweXRob25ydW4uYywgYW5kCitzeW10YWJsZS5jLgorCitUaGUgcGFyc2VyIGl0c2VsZiBvdXRsYXdzIGEgbG90IG9mIGludmFsaWQgc3ludGF4LiAgTm9uZSBvZiB0aGVzZQorZXJyb3JzIGFyZSB0ZXN0ZWQgaGVyZSBhdCB0aGUgbW9tZW50LiAgV2Ugc2hvdWxkIGFkZCBzb21lIHRlc3RzOyBzaW5jZQordGhlcmUgYXJlIGluZmluaXRlbHkgbWFueSBwcm9ncmFtcyB3aXRoIGludmFsaWQgc3ludGF4LCB3ZSB3b3VsZCBuZWVkCit0byBiZSBqdWRpY2lvdXMgaW4gc2VsZWN0aW5nIHNvbWUuCisKK1RoZSBjb21waWxlciBnZW5lcmF0ZXMgYSBzeW50aGV0aWMgbW9kdWxlIG5hbWUgZm9yIGNvZGUgZXhlY3V0ZWQgYnkKK2RvY3Rlc3QuICBTaW5jZSBhbGwgdGhlIGNvZGUgY29tZXMgZnJvbSB0aGUgc2FtZSBtb2R1bGUsIGEgc3VmZml4IGxpa2UKK1sxXSBpcyBhcHBlbmRlZCB0byB0aGUgbW9kdWxlIG5hbWUsIEFzIGEgY29uc2VxdWVuY2UsIGNoYW5naW5nIHRoZQorb3JkZXIgb2YgdGVzdHMgaW4gdGhpcyBtb2R1bGUgbWVhbnMgcmVudW1iZXJpbmcgYWxsIHRoZSBlcnJvcnMgYWZ0ZXIKK2l0LiAgKE1heWJlIHdlIHNob3VsZCBlbmFibGUgdGhlIGVsbGlwc2lzIG9wdGlvbiBmb3IgdGhlc2UgdGVzdHMuKQorCitJbiBhc3QuYywgc3ludGF4IGVycm9ycyBhcmUgcmFpc2VkIGJ5IGNhbGxpbmcgYXN0X2Vycm9yKCkuCisKK0Vycm9ycyBmcm9tIHNldF9jb250ZXh0KCk6CisKKz4+PiBvYmouTm9uZSA9IDEKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxXT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW5ub3QgYXNzaWduIHRvIE5vbmUKKworPj4+IE5vbmUgPSAxCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMl0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2Fubm90IGFzc2lnbiB0byBOb25lCisKK0l0J3MgYSBzeW50YXggZXJyb3IgdG8gYXNzaWduIHRvIHRoZSBlbXB0eSB0dXBsZS4gIFdoeSBpc24ndCBpdCBhbgorZXJyb3IgdG8gYXNzaWduIHRvIHRoZSBlbXB0eSBsaXN0PyAgSXQgd2lsbCBhbHdheXMgcmFpc2Ugc29tZSBlcnJvciBhdAorcnVudGltZS4KKworPj4+ICgpID0gMQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzNdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byAoKQorCis+Pj4gZigpID0gMQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzRdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBmdW5jdGlvbiBjYWxsCisKKz4+PiBkZWwgZigpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbNV0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2FuJ3QgZGVsZXRlIGZ1bmN0aW9uIGNhbGwKKworPj4+IGEgKyAxID0gMgorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzZdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBvcGVyYXRvcgorCis+Pj4gKHggZm9yIHggaW4geCkgPSAxCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbN10+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGdlbmVyYXRvciBleHByZXNzaW9uCisKKz4+PiAxID0gMQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzhdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBsaXRlcmFsCisKKz4+PiAiYWJjIiA9IDEKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs4XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gbGl0ZXJhbAorCis+Pj4gYDFgID0gMQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzEwXT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gcmVwcgorCitJZiB0aGUgbGVmdC1oYW5kIHNpZGUgb2YgYW4gYXNzaWdubWVudCBpcyBhIGxpc3Qgb3IgdHVwbGUsIGFuIGlsbGVnYWwKK2V4cHJlc3Npb24gaW5zaWRlIHRoYXQgY29udGFpbiBzaG91bGQgc3RpbGwgY2F1c2UgYSBzeW50YXggZXJyb3IuCitUaGlzIHRlc3QganVzdCBjaGVja3MgYSBjb3VwbGUgb2YgY2FzZXMgcmF0aGVyIHRoYW4gZW51bWVyYXRpbmcgYWxsIG9mCit0aGVtLgorCis+Pj4gKGEsICJiIiwgYykgPSAoMSwgMiwgMykKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxMV0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGxpdGVyYWwKKworPj4+IFthLCBiLCBjICsgMV0gPSBbMSwgMiwgM10KK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxMl0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIG9wZXJhdG9yCisKKz4+PiBhIGlmIDEgZWxzZSBiID0gMQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzEzXT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gY29uZGl0aW9uYWwgZXhwcmVzc2lvbgorCitGcm9tIGNvbXBpbGVyX2NvbXBsZXhfYXJncygpOgorCis+Pj4gZGVmIGYoTm9uZT0xKToKKy4uLiAgICAgcGFzcworVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzE0XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW5ub3QgYXNzaWduIHRvIE5vbmUKKworCitGcm9tIGFzdF9mb3JfYXJndW1lbnRzKCk6CisKKz4+PiBkZWYgZih4LCB5PTEsIHopOgorLi4uICAgICBwYXNzCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMTVdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IG5vbi1kZWZhdWx0IGFyZ3VtZW50IGZvbGxvd3MgZGVmYXVsdCBhcmd1bWVudAorCis+Pj4gZGVmIGYoeCwgTm9uZSk6CisuLi4gICAgIHBhc3MKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxNl0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2Fubm90IGFzc2lnbiB0byBOb25lCisKKz4+PiBkZWYgZigqTm9uZSk6CisuLi4gICAgIHBhc3MKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxN10+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2Fubm90IGFzc2lnbiB0byBOb25lCisKKz4+PiBkZWYgZigqKk5vbmUpOgorLi4uICAgICBwYXNzCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMThdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbm5vdCBhc3NpZ24gdG8gTm9uZQorCisKK0Zyb20gYXN0X2Zvcl9mdW5jZGVmKCk6CisKKz4+PiBkZWYgTm9uZSh4KToKKy4uLiAgICAgcGFzcworVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzE5XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW5ub3QgYXNzaWduIHRvIE5vbmUKKworCitGcm9tIGFzdF9mb3JfY2FsbCgpOgorCis+Pj4gZGVmIGYoaXQsICp2YXJhcmdzKToKKy4uLiAgICAgcmV0dXJuIGxpc3QoaXQpCis+Pj4gTCA9IHJhbmdlKDEwKQorPj4+IGYoeCBmb3IgeCBpbiBMKQorWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCis+Pj4gZih4IGZvciB4IGluIEwsIDEpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMjNdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IEdlbmVyYXRvciBleHByZXNzaW9uIG11c3QgYmUgcGFyZW50aGVzaXplZCBpZiBub3Qgc29sZSBhcmd1bWVudAorPj4+IGYoKHggZm9yIHggaW4gTCksIDEpCitbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KKworPj4+IGYoaTAsICBpMSwgIGkyLCAgaTMsICBpNCwgIGk1LCAgaTYsICBpNywgIGk4LCAgaTksICBpMTAsICBpMTEsCisuLi4gICBpMTIsICBpMTMsICBpMTQsICBpMTUsICBpMTYsICBpMTcsICBpMTgsICBpMTksICBpMjAsICBpMjEsICBpMjIsCisuLi4gICBpMjMsICBpMjQsICBpMjUsICBpMjYsICBpMjcsICBpMjgsICBpMjksICBpMzAsICBpMzEsICBpMzIsICBpMzMsCisuLi4gICBpMzQsICBpMzUsICBpMzYsICBpMzcsICBpMzgsICBpMzksICBpNDAsICBpNDEsICBpNDIsICBpNDMsICBpNDQsCisuLi4gICBpNDUsICBpNDYsICBpNDcsICBpNDgsICBpNDksICBpNTAsICBpNTEsICBpNTIsICBpNTMsICBpNTQsICBpNTUsCisuLi4gICBpNTYsICBpNTcsICBpNTgsICBpNTksICBpNjAsICBpNjEsICBpNjIsICBpNjMsICBpNjQsICBpNjUsICBpNjYsCisuLi4gICBpNjcsICBpNjgsICBpNjksICBpNzAsICBpNzEsICBpNzIsICBpNzMsICBpNzQsICBpNzUsICBpNzYsICBpNzcsCisuLi4gICBpNzgsICBpNzksICBpODAsICBpODEsICBpODIsICBpODMsICBpODQsICBpODUsICBpODYsICBpODcsICBpODgsCisuLi4gICBpODksICBpOTAsICBpOTEsICBpOTIsICBpOTMsICBpOTQsICBpOTUsICBpOTYsICBpOTcsICBpOTgsICBpOTksCisuLi4gICBpMTAwLCAgaTEwMSwgIGkxMDIsICBpMTAzLCAgaTEwNCwgIGkxMDUsICBpMTA2LCAgaTEwNywgIGkxMDgsCisuLi4gICBpMTA5LCAgaTExMCwgIGkxMTEsICBpMTEyLCAgaTExMywgIGkxMTQsICBpMTE1LCAgaTExNiwgIGkxMTcsCisuLi4gICBpMTE4LCAgaTExOSwgIGkxMjAsICBpMTIxLCAgaTEyMiwgIGkxMjMsICBpMTI0LCAgaTEyNSwgIGkxMjYsCisuLi4gICBpMTI3LCAgaTEyOCwgIGkxMjksICBpMTMwLCAgaTEzMSwgIGkxMzIsICBpMTMzLCAgaTEzNCwgIGkxMzUsCisuLi4gICBpMTM2LCAgaTEzNywgIGkxMzgsICBpMTM5LCAgaTE0MCwgIGkxNDEsICBpMTQyLCAgaTE0MywgIGkxNDQsCisuLi4gICBpMTQ1LCAgaTE0NiwgIGkxNDcsICBpMTQ4LCAgaTE0OSwgIGkxNTAsICBpMTUxLCAgaTE1MiwgIGkxNTMsCisuLi4gICBpMTU0LCAgaTE1NSwgIGkxNTYsICBpMTU3LCAgaTE1OCwgIGkxNTksICBpMTYwLCAgaTE2MSwgIGkxNjIsCisuLi4gICBpMTYzLCAgaTE2NCwgIGkxNjUsICBpMTY2LCAgaTE2NywgIGkxNjgsICBpMTY5LCAgaTE3MCwgIGkxNzEsCisuLi4gICBpMTcyLCAgaTE3MywgIGkxNzQsICBpMTc1LCAgaTE3NiwgIGkxNzcsICBpMTc4LCAgaTE3OSwgIGkxODAsCisuLi4gICBpMTgxLCAgaTE4MiwgIGkxODMsICBpMTg0LCAgaTE4NSwgIGkxODYsICBpMTg3LCAgaTE4OCwgIGkxODksCisuLi4gICBpMTkwLCAgaTE5MSwgIGkxOTIsICBpMTkzLCAgaTE5NCwgIGkxOTUsICBpMTk2LCAgaTE5NywgIGkxOTgsCisuLi4gICBpMTk5LCAgaTIwMCwgIGkyMDEsICBpMjAyLCAgaTIwMywgIGkyMDQsICBpMjA1LCAgaTIwNiwgIGkyMDcsCisuLi4gICBpMjA4LCAgaTIwOSwgIGkyMTAsICBpMjExLCAgaTIxMiwgIGkyMTMsICBpMjE0LCAgaTIxNSwgIGkyMTYsCisuLi4gICBpMjE3LCAgaTIxOCwgIGkyMTksICBpMjIwLCAgaTIyMSwgIGkyMjIsICBpMjIzLCAgaTIyNCwgIGkyMjUsCisuLi4gICBpMjI2LCAgaTIyNywgIGkyMjgsICBpMjI5LCAgaTIzMCwgIGkyMzEsICBpMjMyLCAgaTIzMywgIGkyMzQsCisuLi4gICBpMjM1LCAgaTIzNiwgIGkyMzcsICBpMjM4LCAgaTIzOSwgIGkyNDAsICBpMjQxLCAgaTI0MiwgIGkyNDMsCisuLi4gICBpMjQ0LCAgaTI0NSwgIGkyNDYsICBpMjQ3LCAgaTI0OCwgIGkyNDksICBpMjUwLCAgaTI1MSwgIGkyNTIsCisuLi4gICBpMjUzLCAgaTI1NCwgIGkyNTUpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMjVdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IG1vcmUgdGhhbiAyNTUgYXJndW1lbnRzCisKK1RoZSBhY3R1YWwgZXJyb3IgY2FzZXMgY291bnRzIHBvc2l0aW9uYWwgYXJndW1lbnRzLCBrZXl3b3JkIGFyZ3VtZW50cywKK2FuZCBnZW5lcmF0b3IgZXhwcmVzc2lvbiBhcmd1bWVudHMgc2VwYXJhdGVseS4gIFRoaXMgdGVzdCBjb21iaW5lcyB0aGUKK3RocmVlLgorCis+Pj4gZihpMCwgIGkxLCAgaTIsICBpMywgIGk0LCAgaTUsICBpNiwgIGk3LCAgaTgsICBpOSwgIGkxMCwgIGkxMSwKKy4uLiAgIGkxMiwgIGkxMywgIGkxNCwgIGkxNSwgIGkxNiwgIGkxNywgIGkxOCwgIGkxOSwgIGkyMCwgIGkyMSwgIGkyMiwKKy4uLiAgIGkyMywgIGkyNCwgIGkyNSwgIGkyNiwgIGkyNywgIGkyOCwgIGkyOSwgIGkzMCwgIGkzMSwgIGkzMiwgIGkzMywKKy4uLiAgIGkzNCwgIGkzNSwgIGkzNiwgIGkzNywgIGkzOCwgIGkzOSwgIGk0MCwgIGk0MSwgIGk0MiwgIGk0MywgIGk0NCwKKy4uLiAgIGk0NSwgIGk0NiwgIGk0NywgIGk0OCwgIGk0OSwgIGk1MCwgIGk1MSwgIGk1MiwgIGk1MywgIGk1NCwgIGk1NSwKKy4uLiAgIGk1NiwgIGk1NywgIGk1OCwgIGk1OSwgIGk2MCwgIGk2MSwgIGk2MiwgIGk2MywgIGk2NCwgIGk2NSwgIGk2NiwKKy4uLiAgIGk2NywgIGk2OCwgIGk2OSwgIGk3MCwgIGk3MSwgIGk3MiwgIGk3MywgIGk3NCwgIGk3NSwgIGk3NiwgIGk3NywKKy4uLiAgIGk3OCwgIGk3OSwgIGk4MCwgIGk4MSwgIGk4MiwgIGk4MywgIGk4NCwgIGk4NSwgIGk4NiwgIGk4NywgIGk4OCwKKy4uLiAgIGk4OSwgIGk5MCwgIGk5MSwgIGk5MiwgIGk5MywgIGk5NCwgIGk5NSwgIGk5NiwgIGk5NywgIGk5OCwgIGk5OSwKKy4uLiAgIGkxMDAsICBpMTAxLCAgaTEwMiwgIGkxMDMsICBpMTA0LCAgaTEwNSwgIGkxMDYsICBpMTA3LCAgaTEwOCwKKy4uLiAgIGkxMDksICBpMTEwLCAgaTExMSwgIGkxMTIsICBpMTEzLCAgaTExNCwgIGkxMTUsICBpMTE2LCAgaTExNywKKy4uLiAgIGkxMTgsICBpMTE5LCAgaTEyMCwgIGkxMjEsICBpMTIyLCAgaTEyMywgIGkxMjQsICBpMTI1LCAgaTEyNiwKKy4uLiAgIGkxMjcsICBpMTI4LCAgaTEyOSwgIGkxMzAsICBpMTMxLCAgaTEzMiwgIGkxMzMsICBpMTM0LCAgaTEzNSwKKy4uLiAgIGkxMzYsICBpMTM3LCAgaTEzOCwgIGkxMzksICBpMTQwLCAgaTE0MSwgIGkxNDIsICBpMTQzLCAgaTE0NCwKKy4uLiAgIGkxNDUsICBpMTQ2LCAgaTE0NywgIGkxNDgsICBpMTQ5LCAgaTE1MCwgIGkxNTEsICBpMTUyLCAgaTE1MywKKy4uLiAgIGkxNTQsICBpMTU1LCAgaTE1NiwgIGkxNTcsICBpMTU4LCAgaTE1OSwgIGkxNjAsICBpMTYxLCAgaTE2MiwKKy4uLiAgIGkxNjMsICBpMTY0LCAgaTE2NSwgIGkxNjYsICBpMTY3LCAgaTE2OCwgIGkxNjksICBpMTcwLCAgaTE3MSwKKy4uLiAgIGkxNzIsICBpMTczLCAgaTE3NCwgIGkxNzUsICBpMTc2LCAgaTE3NywgIGkxNzgsICBpMTc5LCAgaTE4MCwKKy4uLiAgIGkxODEsICBpMTgyLCAgaTE4MywgIGkxODQsICBpMTg1LCAgaTE4NiwgIGkxODcsICBpMTg4LCAgaTE4OSwKKy4uLiAgIGkxOTAsICBpMTkxLCAgaTE5MiwgIGkxOTMsICBpMTk0LCAgaTE5NSwgIGkxOTYsICBpMTk3LCAgaTE5OCwKKy4uLiAgIGkxOTksICBpMjAwLCAgaTIwMSwgIGkyMDIsICBpMjAzLCAgaTIwNCwgIGkyMDUsICBpMjA2LCAgaTIwNywKKy4uLiAgIGkyMDgsICBpMjA5LCAgaTIxMCwgIGkyMTEsICBpMjEyLCAgaTIxMywgIGkyMTQsICBpMjE1LCAgaTIxNiwKKy4uLiAgIGkyMTcsICBpMjE4LCAgaTIxOSwgIGkyMjAsICBpMjIxLCAgaTIyMiwgIGkyMjMsICBpMjI0LCAgaTIyNSwKKy4uLiAgIGkyMjYsICBpMjI3LCAgaTIyOCwgIGkyMjksICBpMjMwLCAgaTIzMSwgIGkyMzIsICBpMjMzLCAgaTIzNCwKKy4uLiAgIGkyMzUsIGkyMzYsICBpMjM3LCAgaTIzOCwgIGkyMzksICBpMjQwLCAgaTI0MSwgIGkyNDIsICBpMjQzLAorLi4uICAgKHggZm9yIHggaW4gaTI0NCksICBpMjQ1LCAgaTI0NiwgIGkyNDcsICBpMjQ4LCAgaTI0OSwgIGkyNTAsICBpMjUxLAorLi4uICAgIGkyNTI9MSwgaTI1Mz0xLCAgaTI1ND0xLCAgaTI1NT0xKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzI2XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBtb3JlIHRoYW4gMjU1IGFyZ3VtZW50cworCis+Pj4gZihsYW1iZGEgeDogeFswXSA9IDMpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMjddPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGxhbWJkYSBjYW5ub3QgY29udGFpbiBhc3NpZ25tZW50CisKK1RoZSBncmFtbWFyIGFjY2VwdHMgYW55IHRlc3QgKGJhc2ljYWxseSwgYW55IGV4cHJlc3Npb24pIGluIHRoZQora2V5d29yZCBzbG90IG9mIGEgY2FsbCBzaXRlLiAgVGVzdCBhIGZldyBkaWZmZXJlbnQgb3B0aW9ucy4KKworPj4+IGYoeCgpPTIpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMjhdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGtleXdvcmQgY2FuJ3QgYmUgYW4gZXhwcmVzc2lvbgorPj4+IGYoYSBvciBiPTEpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMjldPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGtleXdvcmQgY2FuJ3QgYmUgYW4gZXhwcmVzc2lvbgorPj4+IGYoeC55PTEpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzBdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGtleXdvcmQgY2FuJ3QgYmUgYW4gZXhwcmVzc2lvbgorCisKK01vcmUgc2V0X2NvbnRleHQoKToKKworPj4+ICh4IGZvciB4IGluIHgpICs9IDEKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFszMV0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGdlbmVyYXRvciBleHByZXNzaW9uCis+Pj4gTm9uZSArPSAxCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzJdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbm5vdCBhc3NpZ24gdG8gTm9uZQorPj4+IGYoKSArPSAxCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzNdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBmdW5jdGlvbiBjYWxsCisKKworVGVzdCBjb250aW51ZSBpbiBmaW5hbGx5IGluIHdlaXJkIGNvbWJpbmF0aW9ucy4KKworY29udGludWUgaW4gZm9yIGxvb3AgdW5kZXIgZmluYWxseSBzaG91bGQgYmUgb2suCisKKyAgICA+Pj4gZGVmIHRlc3QoKToKKyAgICAuLi4gICAgIHRyeToKKyAgICAuLi4gICAgICAgICBwYXNzCisgICAgLi4uICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgIGZvciBhYmMgaW4gcmFuZ2UoMTApOgorICAgIC4uLiAgICAgICAgICAgICBjb250aW51ZQorICAgIC4uLiAgICAgcHJpbnQgYWJjCisgICAgPj4+IHRlc3QoKQorICAgIDkKKworU3RhcnQgc2ltcGxlLCBhIGNvbnRpbnVlIGluIGEgZmluYWxseSBzaG91bGQgbm90IGJlIGFsbG93ZWQuCisKKyAgICA+Pj4gZGVmIHRlc3QoKToKKyAgICAuLi4gICAgZm9yIGFiYyBpbiByYW5nZSgxMCk6CisgICAgLi4uICAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICAgcGFzcworICAgIC4uLiAgICAgICAgZmluYWxseToKKyAgICAuLi4gICAgICAgICAgICBjb250aW51ZQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgICAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFszNl0+IiwgbGluZSA2CisgICAgU3ludGF4RXJyb3I6ICdjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZQorCitUaGlzIGlzIGVzc2VudGlhbGx5IGEgY29udGludWUgaW4gYSBmaW5hbGx5IHdoaWNoIHNob3VsZCBub3QgYmUgYWxsb3dlZC4KKworICAgID4+PiBkZWYgdGVzdCgpOgorICAgIC4uLiAgICBmb3IgYWJjIGluIHJhbmdlKDEwKToKKyAgICAuLi4gICAgICAgIHRyeToKKyAgICAuLi4gICAgICAgICAgICBwYXNzCisgICAgLi4uICAgICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgICAgIHRyeToKKyAgICAuLi4gICAgICAgICAgICAgICAgY29udGludWUKKyAgICAuLi4gICAgICAgICAgICBleGNlcHQ6CisgICAgLi4uICAgICAgICAgICAgICAgIHBhc3MKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICAgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzddPiIsIGxpbmUgNgorICAgIFN5bnRheEVycm9yOiAnY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UKKworICAgID4+PiBkZWYgZm9vKCk6CisgICAgLi4uICAgICB0cnk6CisgICAgLi4uICAgICAgICAgcGFzcworICAgIC4uLiAgICAgZmluYWxseToKKyAgICAuLi4gICAgICAgICBjb250aW51ZQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgICAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFszOF0+IiwgbGluZSA1CisgICAgU3ludGF4RXJyb3I6ICdjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZQorCisgICAgPj4+IGRlZiBmb28oKToKKyAgICAuLi4gICAgIGZvciBhIGluICgpOgorICAgIC4uLiAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICBwYXNzCisgICAgLi4uICAgICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgICBjb250aW51ZQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgICAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFszOV0+IiwgbGluZSA2CisgICAgU3ludGF4RXJyb3I6ICdjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZQorCisgICAgPj4+IGRlZiBmb28oKToKKyAgICAuLi4gICAgIGZvciBhIGluICgpOgorICAgIC4uLiAgICAgICAgIHRyeToKKyAgICAuLi4gICAgICAgICAgICAgcGFzcworICAgIC4uLiAgICAgICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgICAgIHRyeToKKyAgICAuLi4gICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgLi4uICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgICAgICAgICBwYXNzCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQwXT4iLCBsaW5lIDcKKyAgICBTeW50YXhFcnJvcjogJ2NvbnRpbnVlJyBub3Qgc3VwcG9ydGVkIGluc2lkZSAnZmluYWxseScgY2xhdXNlCisKKyAgICA+Pj4gZGVmIGZvbygpOgorICAgIC4uLiAgZm9yIGEgaW4gKCk6CisgICAgLi4uICAgdHJ5OiBwYXNzCisgICAgLi4uICAgZmluYWxseToKKyAgICAuLi4gICAgdHJ5OgorICAgIC4uLiAgICAgcGFzcworICAgIC4uLiAgICBleGNlcHQ6CisgICAgLi4uICAgICBjb250aW51ZQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgICAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0MV0+IiwgbGluZSA4CisgICAgU3ludGF4RXJyb3I6ICdjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZQorCitUaGVyZSBpcyBvbmUgdGVzdCBmb3IgYSBicmVhayB0aGF0IGlzIG5vdCBpbiBhIGxvb3AuICBUaGUgY29tcGlsZXIKK3VzZXMgYSBzaW5nbGUgZGF0YSBzdHJ1Y3R1cmUgdG8ga2VlcCB0cmFjayBvZiB0cnktZmluYWxseSBhbmQgbG9vcHMsCitzbyB3ZSBuZWVkIHRvIGJlIHN1cmUgdGhhdCBhIGJyZWFrIGlzIGFjdHVhbGx5IGluc2lkZSBhIGxvb3AuICBJZiBpdAoraXNuJ3QsIHRoZXJlIHNob3VsZCBiZSBhIHN5bnRheCBlcnJvci4KKworICAgPj4+IHRyeToKKyAgIC4uLiAgICAgcHJpbnQgMQorICAgLi4uICAgICBicmVhaworICAgLi4uICAgICBwcmludCAyCisgICAuLi4gZmluYWxseToKKyAgIC4uLiAgICAgcHJpbnQgMworICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAuLi4KKyAgICAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0Ml0+IiwgbGluZSAzCisgICBTeW50YXhFcnJvcjogJ2JyZWFrJyBvdXRzaWRlIGxvb3AKKworVGhpcyBzaG91bGQgcHJvYmFibHkgcmFpc2UgYSBiZXR0ZXIgZXJyb3IgdGhhbiBhIFN5c3RlbUVycm9yIChvciBub25lIGF0IGFsbCkuCitJbiAyLjUgdGhlcmUgd2FzIGEgbWlzc2luZyBleGNlcHRpb24gYW5kIGFuIGFzc2VydCB3YXMgdHJpZ2dlcmVkIGluIGEgZGVidWcKK2J1aWxkLiAgVGhlIG51bWJlciBvZiBibG9ja3MgbXVzdCBiZSBncmVhdGVyIHRoYW4gQ09fTUFYQkxPQ0tTLiAgU0YgIzE1NjU1MTQKKworICAgPj4+IHdoaWxlIDE6CisgICAuLi4gIHdoaWxlIDI6CisgICAuLi4gICB3aGlsZSAzOgorICAgLi4uICAgIHdoaWxlIDQ6CisgICAuLi4gICAgIHdoaWxlIDU6CisgICAuLi4gICAgICB3aGlsZSA2OgorICAgLi4uICAgICAgIHdoaWxlIDg6CisgICAuLi4gICAgICAgIHdoaWxlIDk6CisgICAuLi4gICAgICAgICB3aGlsZSAxMDoKKyAgIC4uLiAgICAgICAgICB3aGlsZSAxMToKKyAgIC4uLiAgICAgICAgICAgd2hpbGUgMTI6CisgICAuLi4gICAgICAgICAgICB3aGlsZSAxMzoKKyAgIC4uLiAgICAgICAgICAgICB3aGlsZSAxNDoKKyAgIC4uLiAgICAgICAgICAgICAgd2hpbGUgMTU6CisgICAuLi4gICAgICAgICAgICAgICB3aGlsZSAxNjoKKyAgIC4uLiAgICAgICAgICAgICAgICB3aGlsZSAxNzoKKyAgIC4uLiAgICAgICAgICAgICAgICAgd2hpbGUgMTg6CisgICAuLi4gICAgICAgICAgICAgICAgICB3aGlsZSAxOToKKyAgIC4uLiAgICAgICAgICAgICAgICAgICB3aGlsZSAyMDoKKyAgIC4uLiAgICAgICAgICAgICAgICAgICAgd2hpbGUgMjE6CisgICAuLi4gICAgICAgICAgICAgICAgICAgICB3aGlsZSAyMjoKKyAgIC4uLiAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAuLi4KKyAgIFN5c3RlbUVycm9yOiB0b28gbWFueSBzdGF0aWNhbGx5IG5lc3RlZCBibG9ja3MKKworVGhpcyB0ZXN0cyBhc3NpZ25tZW50LWNvbnRleHQ7IHRoZXJlIHdhcyBhIGJ1ZyBpbiBQeXRob24gMi41IHdoZXJlIGNvbXBpbGluZworYSBjb21wbGV4ICdpZicgKG9uZSB3aXRoICdlbGlmJykgd291bGQgZmFpbCB0byBub3RpY2UgYW4gaW52YWxpZCBzdWl0ZSwKK2xlYWRpbmcgdG8gc3B1cmlvdXMgZXJyb3JzLgorCisgICA+Pj4gaWYgMToKKyAgIC4uLiAgIHgoKSA9IDEKKyAgIC4uLiBlbGlmIDE6CisgICAuLi4gICBwYXNzCisgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgIC4uLgorICAgICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQ0XT4iLCBsaW5lIDIKKyAgIFN5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gZnVuY3Rpb24gY2FsbAorCisgICA+Pj4gaWYgMToKKyAgIC4uLiAgIHBhc3MKKyAgIC4uLiBlbGlmIDE6CisgICAuLi4gICB4KCkgPSAxCisgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgIC4uLgorICAgICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQ1XT4iLCBsaW5lIDQKKyAgIFN5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gZnVuY3Rpb24gY2FsbAorCisgICA+Pj4gaWYgMToKKyAgIC4uLiAgIHgoKSA9IDEKKyAgIC4uLiBlbGlmIDE6CisgICAuLi4gICBwYXNzCisgICAuLi4gZWxzZToKKyAgIC4uLiAgIHBhc3MKKyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgLi4uCisgICAgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbNDZdPiIsIGxpbmUgMgorICAgU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBmdW5jdGlvbiBjYWxsCisKKyAgID4+PiBpZiAxOgorICAgLi4uICAgcGFzcworICAgLi4uIGVsaWYgMToKKyAgIC4uLiAgIHgoKSA9IDEKKyAgIC4uLiBlbHNlOgorICAgLi4uICAgcGFzcworICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAuLi4KKyAgICAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0N10+IiwgbGluZSA0CisgICBTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGZ1bmN0aW9uIGNhbGwKKworICAgPj4+IGlmIDE6CisgICAuLi4gICBwYXNzCisgICAuLi4gZWxpZiAxOgorICAgLi4uICAgcGFzcworICAgLi4uIGVsc2U6CisgICAuLi4gICB4KCkgPSAxCisgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgIC4uLgorICAgICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQ4XT4iLCBsaW5lIDYKKyAgIFN5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gZnVuY3Rpb24gY2FsbAorCis+Pj4gZihhPTIzLCBhPTIzNCkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgIC4uLgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQ5XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBrZXl3b3JkIGFyZ3VtZW50IHJlcGVhdGVkCisKKz4+PiBkZWwgKCkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgIC4uLgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzUwXT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW4ndCBkZWxldGUgKCkKKworPj4+IHsxLCAyLCAzfSA9IDQyCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAuLi4KKyAgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbNTBdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBsaXRlcmFsCisKK0Nvcm5lci1jYXNlIHRoYXQgdXNlZCB0byBjcmFzaDoKKworICAgID4+PiBkZWYgZigqeHgsICoqX19kZWJ1Z19fKTogcGFzcworICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBTeW50YXhFcnJvcjogY2Fubm90IGFzc2lnbiB0byBfX2RlYnVnX18KKworIiIiCisKK2ltcG9ydCByZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgU3ludGF4VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9jaGVja19lcnJvcihzZWxmLCBjb2RlLCBlcnJ0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9Ijx0ZXN0Y2FzZT4iLCBtb2RlPSJleGVjIiwgc3ViY2xhc3M9Tm9uZSk6CisgICAgICAgICIiIkNoZWNrIHRoYXQgY29tcGlsaW5nIGNvZGUgcmFpc2VzIFN5bnRheEVycm9yIHdpdGggZXJydGV4dC4KKworICAgICAgICBlcnJ0ZXN0IGlzIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbXVzdCBiZSBwcmVzZW50IGluIHRoZQorICAgICAgICB0ZXN0IG9mIHRoZSBleGNlcHRpb24gcmFpc2VkLiAgSWYgc3ViY2xhc3MgaXMgc3BlY2lmaWVkIGl0CisgICAgICAgIGlzIHRoZSBleHBlY3RlZCBzdWJjbGFzcyBvZiBTeW50YXhFcnJvciAoZS5nLiBJbmRlbnRhdGlvbkVycm9yKS4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbXBpbGUoY29kZSwgZmlsZW5hbWUsIG1vZGUpCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgZXJyOgorICAgICAgICAgICAgaWYgc3ViY2xhc3MgYW5kIG5vdCBpc2luc3RhbmNlKGVyciwgc3ViY2xhc3MpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiU3ludGF4RXJyb3IgaXMgbm90IGEgJXMiICUgc3ViY2xhc3MuX19uYW1lX18pCisgICAgICAgICAgICBtbyA9IHJlLnNlYXJjaChlcnJ0ZXh0LCBzdHIoZXJyKSkKKyAgICAgICAgICAgIGlmIG1vIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlcyBkaWQgbm90IGNvbnRhaW4gJyVyJyIgJSAoZXJyLCBlcnJ0ZXh0LCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImNvbXBpbGUoKSBkaWQgbm90IHJhaXNlIFN5bnRheEVycm9yIikKKworICAgIGRlZiB0ZXN0X3BhcmVuX2FyZ193aXRoX2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX2Vycm9yKCJkZWYgZigoeCk9MjMpOiBwYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmVudGhlc2l6ZWQgYXJnIHdpdGggZGVmYXVsdCIpCisKKyAgICBkZWYgdGVzdF9hc3NpZ25fY2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfZXJyb3IoImYoKSA9IDEiLCAiYXNzaWduIikKKworICAgIGRlZiB0ZXN0X2Fzc2lnbl9kZWwoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX2Vycm9yKCJkZWwgZigpIiwgImRlbGV0ZSIpCisKKyAgICBkZWYgdGVzdF9nbG9iYWxfZXJyX3RoZW5fd2FybihzZWxmKToKKyAgICAgICAgIyBCdWcgdGlja2xlcjogIFRoZSBTeW50YXhFcnJvciByYWlzZWQgZm9yIG9uZSBnbG9iYWwgc3RhdGVtZW50CisgICAgICAgICMgc2hvdWxkbid0IGJlIGNsb2JiZXJlZCBieSBhIFN5bnRheFdhcm5pbmcgaXNzdWVkIGZvciBhIGxhdGVyIG9uZS4KKyAgICAgICAgc291cmNlID0gcmUuc3ViKCcoP20pXiAqOicsICcnLCAiIiJcCisgICAgICAgICAgICA6ZGVmIGVycm9yKGEpOgorICAgICAgICAgICAgOiAgICBnbG9iYWwgYSAgIyBTeW50YXhFcnJvcgorICAgICAgICAgICAgOmRlZiB3YXJuaW5nKCk6CisgICAgICAgICAgICA6ICAgIGIgPSAxCisgICAgICAgICAgICA6ICAgIGdsb2JhbCBiICAjIFN5bnRheFdhcm5pbmcKKyAgICAgICAgICAgIDoiIiIpCisgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKGFjdGlvbj0naWdub3JlJywgY2F0ZWdvcnk9U3ludGF4V2FybmluZykKKyAgICAgICAgc2VsZi5fY2hlY2tfZXJyb3Ioc291cmNlLCAiZ2xvYmFsIikKKyAgICAgICAgd2FybmluZ3MuZmlsdGVycy5wb3AoMCkKKworICAgIGRlZiB0ZXN0X2JyZWFrX291dHNpZGVfbG9vcChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfZXJyb3IoImJyZWFrIiwgIm91dHNpZGUgbG9vcCIpCisKKyAgICBkZWYgdGVzdF9kZWxldGVfZGVyZWYoc2VsZik6CisgICAgICAgIHNvdXJjZSA9IHJlLnN1YignKD9tKV4gKjonLCAnJywgIiIiXAorICAgICAgICAgICAgOmRlZiBmb28oeCk6CisgICAgICAgICAgICA6ICBkZWYgYmFyKCk6CisgICAgICAgICAgICA6ICAgIHByaW50IHgKKyAgICAgICAgICAgIDogIGRlbCB4CisgICAgICAgICAgICA6IiIiKQorICAgICAgICBzZWxmLl9jaGVja19lcnJvcihzb3VyY2UsICJuZXN0ZWQgc2NvcGUiKQorCisgICAgZGVmIHRlc3RfdW5leHBlY3RlZF9pbmRlbnQoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX2Vycm9yKCJmb28oKVxuIGJhcigpXG4iLCAidW5leHBlY3RlZCBpbmRlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJjbGFzcz1JbmRlbnRhdGlvbkVycm9yKQorCisgICAgZGVmIHRlc3Rfbm9faW5kZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19lcnJvcigiaWYgMTpcbmZvbygpIiwgImV4cGVjdGVkIGFuIGluZGVudGVkIGJsb2NrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2xhc3M9SW5kZW50YXRpb25FcnJvcikKKworICAgIGRlZiB0ZXN0X2JhZF9vdXRkZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19lcnJvcigiaWYgMTpcbiAgZm9vKClcbiBiYXIoKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmluZGVudCBkb2VzIG5vdCBtYXRjaCAuKiBsZXZlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNsYXNzPUluZGVudGF0aW9uRXJyb3IpCisKKyAgICBkZWYgdGVzdF9rd2FyZ3NfbGFzdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfZXJyb3IoImludChiYXNlPTEwLCAnMicpIiwgIm5vbi1rZXl3b3JkIGFyZyIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFN5bnRheFRlc3RDYXNlKQorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zeW50YXgKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCgiYmFja3F1b3RlIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9zeW50YXgsIHZlcmJvc2l0eT1UcnVlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW50YXgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ludGF4LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWRkMWMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ludGF4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW50YXgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ludGF4LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWRkMWMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ludGF4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlYTY1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5cy5weQpAQCAtMCwwICsxLDc3NiBAQAorIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQoraW1wb3J0IHVuaXR0ZXN0LCB0ZXN0LnRlc3Rfc3VwcG9ydAoraW1wb3J0IHN5cywgb3MsIGNTdHJpbmdJTworaW1wb3J0IHN0cnVjdAoraW1wb3J0IG9wZXJhdG9yCisKK2NsYXNzIFN5c01vZHVsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKKworICAgIGRlZiB0ZXN0X29yaWdpbmFsX2Rpc3BsYXlob29rKHNlbGYpOgorICAgICAgICBpbXBvcnQgX19idWlsdGluX18KKyAgICAgICAgc2F2ZXN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgb3V0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgc3lzLnN0ZG91dCA9IG91dAorCisgICAgICAgIGRoID0gc3lzLl9fZGlzcGxheWhvb2tfXworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGgpCisgICAgICAgIGlmIGhhc2F0dHIoX19idWlsdGluX18sICJfIik6CisgICAgICAgICAgICBkZWwgX19idWlsdGluX18uXworCisgICAgICAgIGRoKE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LmdldHZhbHVlKCksICIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoX19idWlsdGluX18sICJfIikpCisgICAgICAgIGRoKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLCAiNDJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX19idWlsdGluX18uXywgNDIpCisKKyAgICAgICAgZGVsIHN5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBkaCwgNDIpCisKKyAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVzdGRvdXQKKworICAgIGRlZiB0ZXN0X2xvc3RfZGlzcGxheWhvb2soc2VsZik6CisgICAgICAgIG9sZGRpc3BsYXlob29rID0gc3lzLmRpc3BsYXlob29rCisgICAgICAgIGRlbCBzeXMuZGlzcGxheWhvb2sKKyAgICAgICAgY29kZSA9IGNvbXBpbGUoIjQyIiwgIjxzdHJpbmc+IiwgInNpbmdsZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgZXZhbCwgY29kZSkKKyAgICAgICAgc3lzLmRpc3BsYXlob29rID0gb2xkZGlzcGxheWhvb2sKKworICAgIGRlZiB0ZXN0X2N1c3RvbV9kaXNwbGF5aG9vayhzZWxmKToKKyAgICAgICAgb2xkZGlzcGxheWhvb2sgPSBzeXMuZGlzcGxheWhvb2sKKyAgICAgICAgZGVmIGJhZGRpc3BsYXlob29rKG9iaik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHN5cy5kaXNwbGF5aG9vayA9IGJhZGRpc3BsYXlob29rCisgICAgICAgIGNvZGUgPSBjb21waWxlKCI0MiIsICI8c3RyaW5nPiIsICJzaW5nbGUiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBldmFsLCBjb2RlKQorICAgICAgICBzeXMuZGlzcGxheWhvb2sgPSBvbGRkaXNwbGF5aG9vaworCisgICAgZGVmIHRlc3Rfb3JpZ2luYWxfZXhjZXB0aG9vayhzZWxmKToKKyAgICAgICAgc2F2ZXN0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgZXJyID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgc3lzLnN0ZGVyciA9IGVycgorCisgICAgICAgIGVoID0gc3lzLl9fZXhjZXB0aG9va19fCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBlaCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcig0MikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGV4YzoKKyAgICAgICAgICAgIGVoKCpzeXMuZXhjX2luZm8oKSkKKworICAgICAgICBzeXMuc3RkZXJyID0gc2F2ZXN0ZGVycgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyLmdldHZhbHVlKCkuZW5kc3dpdGgoIlZhbHVlRXJyb3I6IDQyXG4iKSkKKworICAgICMgRklYTUU6IHRlc3RpbmcgdGhlIGNvZGUgZm9yIGEgbG9zdCBvciByZXBsYWNlZCBleGNlcHRob29rIGluCisgICAgIyBQeXRob24vcHl0aG9ucnVuLmM6OlB5RXJyX1ByaW50RXgoKSBpcyB0cmlja3kuCisKKyAgICBkZWYgdGVzdF9leGNfY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLmV4Y19jbGVhciwgNDIpCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBleGNfaW5mbyBpcyBwcmVzZW50IGFuZCBtYXRjaGVzIGV4YywgdGhlbiBjbGVhciBpdCwgYW5kCisgICAgICAgICMgY2hlY2sgdGhhdCBpdCB3b3JrZWQuCisgICAgICAgIGRlZiBjbGVhcl9jaGVjayhleGMpOgorICAgICAgICAgICAgdHlwLCB2YWx1ZSwgdHJhY2ViYWNrID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXAgaXMgbm90IE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUgaXMgZXhjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRyYWNlYmFjayBpcyBub3QgTm9uZSkKKworICAgICAgICAgICAgd2l0aCB0ZXN0LnRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAgc3lzLmV4Y19jbGVhcigpCisKKyAgICAgICAgICAgIHR5cCwgdmFsdWUsIHRyYWNlYmFjayA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwIGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cmFjZWJhY2sgaXMgTm9uZSkKKworICAgICAgICBkZWYgY2xlYXIoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCA0MgorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGV4YzoKKyAgICAgICAgICAgICAgICBjbGVhcl9jaGVjayhleGMpCisKKyAgICAgICAgIyBSYWlzZSBhbiBleGNlcHRpb24gYW5kIGNoZWNrIHRoYXQgaXQgY2FuIGJlIGNsZWFyZWQKKyAgICAgICAgY2xlYXIoKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgYSBmcmFtZSBjdXJyZW50bHkgaGFuZGxpbmcgYW4gZXhjZXB0aW9uIGlzCisgICAgICAgICMgdW5hZmZlY3RlZCBieSBjYWxsaW5nIGV4Y19jbGVhciBpbiBhIG5lc3RlZCBmcmFtZS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgMTMKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGV4YzoKKyAgICAgICAgICAgIHR5cDEsIHZhbHVlMSwgdHJhY2ViYWNrMSA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBjbGVhcigpCisgICAgICAgICAgICB0eXAyLCB2YWx1ZTIsIHRyYWNlYmFjazIgPSBzeXMuZXhjX2luZm8oKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwMSBpcyB0eXAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlMSBpcyBleGMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUxIGlzIHZhbHVlMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cmFjZWJhY2sxIGlzIHRyYWNlYmFjazIpCisKKyAgICAgICAgIyBDaGVjayB0aGF0IGFuIGV4Y2VwdGlvbiBjYW4gYmUgY2xlYXJlZCBvdXRzaWRlIG9mIGFuIGV4Y2VwdCBibG9jaworICAgICAgICBjbGVhcl9jaGVjayhleGMpCisKKyAgICBkZWYgdGVzdF9leGl0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5leGl0LCA0MiwgNDIpCisKKyAgICAgICAgIyBjYWxsIHdpdGhvdXQgYXJndW1lbnQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLmV4aXQoMCkKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQsIGV4YzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjLmNvZGUsIDApCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIikKKworICAgICAgICAjIGNhbGwgd2l0aCB0dXBsZSBhcmd1bWVudCB3aXRoIG9uZSBlbnRyeQorICAgICAgICAjIGVudHJ5IHdpbGwgYmUgdW5wYWNrZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLmV4aXQoNDIpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCBleGM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5jb2RlLCA0MikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyBleGNlcHRpb24iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQorCisgICAgICAgICMgY2FsbCB3aXRoIGludGVnZXIgYXJndW1lbnQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLmV4aXQoKDQyLCkpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCBleGM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5jb2RlLCA0MikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyBleGNlcHRpb24iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQorCisgICAgICAgICMgY2FsbCB3aXRoIHN0cmluZyBhcmd1bWVudAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuZXhpdCgiZXhpdCIpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCBleGM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5jb2RlLCAiZXhpdCIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIikKKworICAgICAgICAjIGNhbGwgd2l0aCB0dXBsZSBhcmd1bWVudCB3aXRoIHR3byBlbnRyaWVzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5leGl0KCgxNywgMjMpKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCwgZXhjOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGMuY29kZSwgKDE3LCAyMykpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIikKKworICAgICAgICAjIHRlc3QgdGhhdCB0aGUgZXhpdCBtYWNoaW5lcnkgaGFuZGxlcyBTeXN0ZW1FeGl0cyBwcm9wZXJseQorICAgICAgICBpbXBvcnQgc3VicHJvY2VzcworICAgICAgICAjIGJvdGggdW5ub3JtYWxpemVkLi4uCisgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYWlzZSBTeXN0ZW1FeGl0LCA0NiJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCA0NikKKyAgICAgICAgIyAuLi4gYW5kIG5vcm1hbGl6ZWQKKyAgICAgICAgcmMgPSBzdWJwcm9jZXNzLmNhbGwoW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhaXNlIFN5c3RlbUV4aXQoNDcpIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDQ3KQorCisgICAgICAgIGRlZiBjaGVja19leGl0X21lc3NhZ2UoY29kZSwgZXhwZWN0ZWQsIGVudj1Ob25lKToKKyAgICAgICAgICAgIHByb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgY29kZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLCBlbnY9ZW52KQorICAgICAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvY2Vzcy5yZXR1cm5jb2RlLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0ZGVyci5zdGFydHN3aXRoKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAiJXMgZG9lc24ndCBzdGFydCB3aXRoICVzIiAlIChyZXByKHN0ZGVyciksIHJlcHIoZXhwZWN0ZWQpKSkKKworICAgICAgICAjIHRlc3QgdGhhdCBzdGRlcnIgYnVmZmVyIGlmIGZsdXNoZWQgYmVmb3JlIHRoZSBleGl0IG1lc3NhZ2UgaXMgd3JpdHRlbgorICAgICAgICAjIGludG8gc3RkZXJyCisgICAgICAgIGNoZWNrX2V4aXRfbWVzc2FnZSgKKyAgICAgICAgICAgIHInaW1wb3J0IHN5czsgc3lzLnN0ZGVyci53cml0ZSgidW5mbHVzaGVkLCIpOyBzeXMuZXhpdCgibWVzc2FnZSIpJywKKyAgICAgICAgICAgIGIidW5mbHVzaGVkLG1lc3NhZ2UiKQorCisgICAgICAgICMgdGVzdCB0aGF0IHRoZSB1bmljb2RlIG1lc3NhZ2UgaXMgZW5jb2RlZCB0byB0aGUgc3RkZXJyIGVuY29kaW5nCisgICAgICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIGVudlsnUFlUSE9OSU9FTkNPRElORyddID0gJ2xhdGluLTEnCisgICAgICAgIGNoZWNrX2V4aXRfbWVzc2FnZSgKKyAgICAgICAgICAgIHInaW1wb3J0IHN5czsgc3lzLmV4aXQodSJoXHhlOSIpJywKKyAgICAgICAgICAgIGIiaFx4ZTkiLCBlbnY9ZW52KQorCisgICAgZGVmIHRlc3RfZ2V0ZGVmYXVsdGVuY29kaW5nKHNlbGYpOgorICAgICAgICBpZiB0ZXN0LnRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcsIDQyKQorICAgICAgICAgICAgIyBjYW4ndCBjaGVjayBtb3JlIHRoYW4gdGhlIHR5cGUsIGFzIHRoZSB1c2VyIG1pZ2h0IGhhdmUgY2hhbmdlZCBpdAorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSwgc3RyKQorCisgICAgIyB0ZXN0aW5nIHN5cy5zZXR0cmFjZSgpIGlzIGRvbmUgaW4gdGVzdF9zeXNfc2V0dHJhY2UucHkKKyAgICAjIHRlc3Rpbmcgc3lzLnNldHByb2ZpbGUoKSBpcyBkb25lIGluIHRlc3Rfc3lzX3NldHByb2ZpbGUucHkKKworICAgIGRlZiB0ZXN0X3NldGNoZWNraW50ZXJ2YWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLnNldGNoZWNraW50ZXJ2YWwpCisgICAgICAgIG9yaWcgPSBzeXMuZ2V0Y2hlY2tpbnRlcnZhbCgpCisgICAgICAgIGZvciBuIGluIDAsIDEwMCwgMTIwLCBvcmlnOiAjIG9yaWcgbGFzdCB0byByZXN0b3JlIHN0YXJ0aW5nIHN0YXRlCisgICAgICAgICAgICBzeXMuc2V0Y2hlY2tpbnRlcnZhbChuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0Y2hlY2tpbnRlcnZhbCgpLCBuKQorCisgICAgZGVmIHRlc3RfcmVjdXJzaW9ubGltaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLmdldHJlY3Vyc2lvbmxpbWl0LCA0MikKKyAgICAgICAgb2xkbGltaXQgPSBzeXMuZ2V0cmVjdXJzaW9ubGltaXQoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5zZXRyZWN1cnNpb25saW1pdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3lzLnNldHJlY3Vyc2lvbmxpbWl0LCAtNDIpCisgICAgICAgIHN5cy5zZXRyZWN1cnNpb25saW1pdCgxMDAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0cmVjdXJzaW9ubGltaXQoKSwgMTAwMDApCisgICAgICAgIHN5cy5zZXRyZWN1cnNpb25saW1pdChvbGRsaW1pdCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzeXMuc2V0cmVjdXJzaW9ubGltaXQsIDEgPDwgMzEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5zZXRyZWN1cnNpb25saW1pdCgoMSA8PCAzMSkgLSA1KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgaXNzdWUxMzU0NjogaXNpbnN0YW5jZShlLCBWYWx1ZUVycm9yKSB1c2VkIHRvIGZhaWwKKyAgICAgICAgICAgICAgICAjIHdoZW4gdGhlIHJlY3Vyc2lvbiBsaW1pdCBpcyBjbG9zZSB0byAxPDwzMQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnNldHJlY3Vyc2lvbmxpbWl0KG9sZGxpbWl0KQorCisgICAgZGVmIHRlc3RfZ2V0d2luZG93c3ZlcnNpb24oc2VsZik6CisgICAgICAgICMgUmFpc2UgU2tpcFRlc3QgaWYgc3lzIGRvZXNuJ3QgaGF2ZSBnZXR3aW5kb3dzdmVyc2lvbiBhdHRyaWJ1dGUKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQuZ2V0X2F0dHJpYnV0ZShzeXMsICJnZXR3aW5kb3dzdmVyc2lvbiIpCisgICAgICAgIHYgPSBzeXMuZ2V0d2luZG93c3ZlcnNpb24oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2KSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZbMF0sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZbMV0sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZbMl0sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZbM10sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZbNF0sIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgdiwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHYubWFqb3IsIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHYubWlub3IsIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHYuYnVpbGQsIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHYucGxhdGZvcm0sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHYuc2VydmljZV9wYWNrLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2LnNlcnZpY2VfcGFja19taW5vciwgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uodi5zZXJ2aWNlX3BhY2tfbWFqb3IsIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHYuc3VpdGVfbWFzaywgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uodi5wcm9kdWN0X3R5cGUsIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2WzBdLCB2Lm1ham9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZbMV0sIHYubWlub3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodlsyXSwgdi5idWlsZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2WzNdLCB2LnBsYXRmb3JtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZbNF0sIHYuc2VydmljZV9wYWNrKQorCisgICAgICAgICMgVGhpcyBpcyBob3cgcGxhdGZvcm0ucHkgY2FsbHMgaXQuIE1ha2Ugc3VyZSB0dXBsZQorICAgICAgICAjICBzdGlsbCBoYXMgNSBlbGVtZW50cworICAgICAgICBtYWosIG1pbiwgYnVpbGRubywgcGxhdCwgY3NkID0gc3lzLmdldHdpbmRvd3N2ZXJzaW9uKCkKKworICAgIGRlZiB0ZXN0X2Rsb3BlbmZsYWdzKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHN5cywgInNldGRsb3BlbmZsYWdzIik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzeXMsICJnZXRkbG9wZW5mbGFncyIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzeXMuZ2V0ZGxvcGVuZmxhZ3MsIDQyKQorICAgICAgICAgICAgb2xkZmxhZ3MgPSBzeXMuZ2V0ZGxvcGVuZmxhZ3MoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzeXMuc2V0ZGxvcGVuZmxhZ3MpCisgICAgICAgICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3Mob2xkZmxhZ3MrMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldGRsb3BlbmZsYWdzKCksIG9sZGZsYWdzKzEpCisgICAgICAgICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3Mob2xkZmxhZ3MpCisKKyAgICBkZWYgdGVzdF9yZWZjb3VudChzZWxmKToKKyAgICAgICAgIyBuIGhlcmUgbXVzdCBiZSBhIGdsb2JhbCBpbiBvcmRlciBmb3IgdGhpcyB0ZXN0IHRvIHBhc3Mgd2hpbGUKKyAgICAgICAgIyB0cmFjaW5nIHdpdGggYSBweXRob24gZnVuY3Rpb24uICBUcmFjaW5nIGNhbGxzIFB5RnJhbWVfRmFzdFRvTG9jYWxzCisgICAgICAgICMgd2hpY2ggd2lsbCBhZGQgYSBjb3B5IG9mIGFueSBsb2NhbHMgdG8gdGhlIGZyYW1lIG9iamVjdCwgY2F1c2luZworICAgICAgICAjIHRoZSByZWZlcmVuY2UgY291bnQgdG8gaW5jcmVhc2UgYnkgMiBpbnN0ZWFkIG9mIDEuCisgICAgICAgIGdsb2JhbCBuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLmdldHJlZmNvdW50KQorICAgICAgICBjID0gc3lzLmdldHJlZmNvdW50KE5vbmUpCisgICAgICAgIG4gPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHJlZmNvdW50KE5vbmUpLCBjKzEpCisgICAgICAgIGRlbCBuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHJlZmNvdW50KE5vbmUpLCBjKQorICAgICAgICBpZiBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzeXMuZ2V0dG90YWxyZWZjb3VudCgpLCBpbnQpCisKKyAgICBkZWYgdGVzdF9nZXRmcmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzeXMuX2dldGZyYW1lLCA0MiwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN5cy5fZ2V0ZnJhbWUsIDIwMDAwMDAwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIFN5c01vZHVsZVRlc3QudGVzdF9nZXRmcmFtZS5pbV9mdW5jLmZ1bmNfY29kZSBcCisgICAgICAgICAgICBpcyBzeXMuX2dldGZyYW1lKCkuZl9jb2RlCisgICAgICAgICkKKworICAgICMgc3lzLl9jdXJyZW50X2ZyYW1lcygpIGlzIGEgQ1B5dGhvbi1vbmx5IGdpbW1pY2suCisgICAgZGVmIHRlc3RfY3VycmVudF9mcmFtZXMoc2VsZik6CisgICAgICAgIGhhdmVfdGhyZWFkcyA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHRocmVhZAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBoYXZlX3RocmVhZHMgPSBGYWxzZQorCisgICAgICAgIGlmIGhhdmVfdGhyZWFkczoKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF9mcmFtZXNfd2l0aF90aHJlYWRzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF9mcmFtZXNfd2l0aG91dF90aHJlYWRzKCkKKworICAgICMgVGVzdCBzeXMuX2N1cnJlbnRfZnJhbWVzKCkgaW4gYSBXSVRIX1RIUkVBRFMgYnVpbGQuCisgICAgQHRlc3QudGVzdF9zdXBwb3J0LnJlYXBfdGhyZWFkcworICAgIGRlZiBjdXJyZW50X2ZyYW1lc193aXRoX3RocmVhZHMoc2VsZik6CisgICAgICAgIGltcG9ydCB0aHJlYWRpbmcsIHRocmVhZAorICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisKKyAgICAgICAgIyBTcGF3biBhIHRocmVhZCB0aGF0IGJsb2NrcyBhdCBhIGtub3duIHBsYWNlLiAgVGhlbiB0aGUgbWFpbgorICAgICAgICAjIHRocmVhZCBkb2VzIHN5cy5fY3VycmVudF9mcmFtZXMoKSwgYW5kIHZlcmlmaWVzIHRoYXQgdGhlIGZyYW1lcworICAgICAgICAjIHJldHVybmVkIG1ha2Ugc2Vuc2UuCisgICAgICAgIGVudGVyZWRfZyA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIGxlYXZlX2cgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICB0aHJlYWRfaW5mbyA9IFtdICAjIHRoZSB0aHJlYWQncyBpZAorCisgICAgICAgIGRlZiBmMTIzKCk6CisgICAgICAgICAgICBnNDU2KCkKKworICAgICAgICBkZWYgZzQ1NigpOgorICAgICAgICAgICAgdGhyZWFkX2luZm8uYXBwZW5kKHRocmVhZC5nZXRfaWRlbnQoKSkKKyAgICAgICAgICAgIGVudGVyZWRfZy5zZXQoKQorICAgICAgICAgICAgbGVhdmVfZy53YWl0KCkKKworICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZjEyMykKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIGVudGVyZWRfZy53YWl0KCkKKworICAgICAgICAjIEF0IHRoaXMgcG9pbnQsIHQgaGFzIGZpbmlzaGVkIGl0cyBlbnRlcmVkX2cuc2V0KCksIGFsdGhvdWdoIGl0J3MKKyAgICAgICAgIyBpbXBvc3NpYmxlIHRvIGd1ZXNzIHdoZXRoZXIgaXQncyBzdGlsbCBvbiB0aGF0IGxpbmUgb3IgaGFzIG1vdmVkIG9uCisgICAgICAgICMgdG8gaXRzIGxlYXZlX2cud2FpdCgpLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0aHJlYWRfaW5mbyksIDEpCisgICAgICAgIHRocmVhZF9pZCA9IHRocmVhZF9pbmZvWzBdCisKKyAgICAgICAgZCA9IHN5cy5fY3VycmVudF9mcmFtZXMoKQorCisgICAgICAgIG1haW5faWQgPSB0aHJlYWQuZ2V0X2lkZW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihtYWluX2lkLCBkKQorICAgICAgICBzZWxmLmFzc2VydEluKHRocmVhZF9pZCwgZCkKKworICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSBjYXB0dXJlZCBtYWluLXRocmVhZCBmcmFtZSBpcyBfdGhpc18gZnJhbWUuCisgICAgICAgIGZyYW1lID0gZC5wb3AobWFpbl9pZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZyYW1lIGlzIHN5cy5fZ2V0ZnJhbWUoKSkKKworICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSBjYXB0dXJlZCB0aHJlYWQgZnJhbWUgaXMgYmxvY2tlZCBpbiBnNDU2LCBjYWxsZWQKKyAgICAgICAgIyBmcm9tIGYxMjMuICBUaGlzIGlzIGEgbGl0dGUgdHJpY2t5LCBzaW5jZSB2YXJpb3VzIGJpdHMgb2YKKyAgICAgICAgIyB0aHJlYWRpbmcucHkgYXJlIGFsc28gaW4gdGhlIHRocmVhZCdzIGNhbGwgc3RhY2suCisgICAgICAgIGZyYW1lID0gZC5wb3AodGhyZWFkX2lkKQorICAgICAgICBzdGFjayA9IHRyYWNlYmFjay5leHRyYWN0X3N0YWNrKGZyYW1lKQorICAgICAgICBmb3IgaSwgKGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmNuYW1lLCBzb3VyY2VsaW5lKSBpbiBlbnVtZXJhdGUoc3RhY2spOgorICAgICAgICAgICAgaWYgZnVuY25hbWUgPT0gImYxMjMiOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImRpZG4ndCBmaW5kIGYxMjMoKSBvbiB0aHJlYWQncyBjYWxsIHN0YWNrIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXJjZWxpbmUsICJnNDU2KCkiKQorCisgICAgICAgICMgQW5kIHRoZSBuZXh0IHJlY29yZCBtdXN0IGJlIGZvciBnNDU2KCkuCisgICAgICAgIGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmNuYW1lLCBzb3VyY2VsaW5lID0gc3RhY2tbaSsxXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmNuYW1lLCAiZzQ1NiIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oc291cmNlbGluZSwgWyJsZWF2ZV9nLndhaXQoKSIsICJlbnRlcmVkX2cuc2V0KCkiXSkKKworICAgICAgICAjIFJlYXAgdGhlIHNwYXduZWQgdGhyZWFkLgorICAgICAgICBsZWF2ZV9nLnNldCgpCisgICAgICAgIHQuam9pbigpCisKKyAgICAjIFRlc3Qgc3lzLl9jdXJyZW50X2ZyYW1lcygpIHdoZW4gdGhyZWFkIHN1cHBvcnQgZG9lc24ndCBleGlzdC4KKyAgICBkZWYgY3VycmVudF9mcmFtZXNfd2l0aG91dF90aHJlYWRzKHNlbGYpOgorICAgICAgICAjIE5vdCBtdWNoIGhhcHBlbnMgaGVyZTogIHRoZXJlIGlzIG9ubHkgb25lIHRocmVhZCwgd2l0aCBhcnRpZmljaWFsCisgICAgICAgICMgInRocmVhZCBpZCIgMC4KKyAgICAgICAgZCA9IHN5cy5fY3VycmVudF9mcmFtZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigwLCBkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZFswXSBpcyBzeXMuX2dldGZyYW1lKCkpCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3lzLmFwaV92ZXJzaW9uLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzeXMuYXJndiwgbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzeXMuYnl0ZW9yZGVyLCAoImxpdHRsZSIsICJiaWciKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN5cy5idWlsdGluX21vZHVsZV9uYW1lcywgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzeXMuY29weXJpZ2h0LCBiYXNlc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3lzLmV4ZWNfcHJlZml4LCBiYXNlc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3lzLmV4ZWN1dGFibGUsIGJhc2VzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN5cy5mbG9hdF9pbmZvKSwgMTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmZsb2F0X2luZm8ucmFkaXgsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN5cy5sb25nX2luZm8pLCAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3lzLmxvbmdfaW5mby5iaXRzX3Blcl9kaWdpdCAlIDUgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN5cy5sb25nX2luZm8uc2l6ZW9mX2RpZ2l0ID49IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzeXMubG9uZ19pbmZvLmJpdHNfcGVyX2RpZ2l0KSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc3lzLmxvbmdfaW5mby5zaXplb2ZfZGlnaXQpLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzeXMuaGV4dmVyc2lvbiwgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3lzLm1heGludCwgaW50KQorICAgICAgICBpZiB0ZXN0LnRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3lzLm1heHVuaWNvZGUsIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN5cy5wbGF0Zm9ybSwgYmFzZXN0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN5cy5wcmVmaXgsIGJhc2VzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzeXMudmVyc2lvbiwgYmFzZXN0cmluZykKKyAgICAgICAgdmkgPSBzeXMudmVyc2lvbl9pbmZvCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2aVs6XSwgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZpKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZpWzBdLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2aVsxXSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmlbMl0sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbih2aVszXSwgKCJhbHBoYSIsICJiZXRhIiwgImNhbmRpZGF0ZSIsICJmaW5hbCIpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmlbNF0sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZpLm1ham9yLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2aS5taW5vciwgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmkubWljcm8sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbih2aS5yZWxlYXNlbGV2ZWwsICgiYWxwaGEiLCAiYmV0YSIsICJjYW5kaWRhdGUiLCAiZmluYWwiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZpLnNlcmlhbCwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpWzBdLCB2aS5tYWpvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aVsxXSwgdmkubWlub3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlbMl0sIHZpLm1pY3JvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpWzNdLCB2aS5yZWxlYXNlbGV2ZWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlbNF0sIHZpLnNlcmlhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpID4gKDEsMCwwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN5cy5mbG9hdF9yZXByX3N0eWxlLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oc3lzLmZsb2F0X3JlcHJfc3R5bGUsICgnc2hvcnQnLCAnbGVnYWN5JykpCisKKyAgICBkZWYgdGVzdF80MzU4MShzZWxmKToKKyAgICAgICAgIyBDYW4ndCB1c2Ugc3lzLnN0ZG91dCwgYXMgdGhpcyBpcyBhIGNTdHJpbmdJTyBvYmplY3Qgd2hlbgorICAgICAgICAjIHRoZSB0ZXN0IHJ1bnMgdW5kZXIgcmVncnRlc3QuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzeXMuX19zdGRvdXRfXy5lbmNvZGluZyA9PSBzeXMuX19zdGRlcnJfXy5lbmNvZGluZykKKworICAgIGRlZiB0ZXN0X3N5c19mbGFncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN5cy5mbGFncykKKyAgICAgICAgYXR0cnMgPSAoImRlYnVnIiwgInB5M2tfd2FybmluZyIsICJkaXZpc2lvbl93YXJuaW5nIiwgImRpdmlzaW9uX25ldyIsCisgICAgICAgICAgICAgICAgICJpbnNwZWN0IiwgImludGVyYWN0aXZlIiwgIm9wdGltaXplIiwgImRvbnRfd3JpdGVfYnl0ZWNvZGUiLAorICAgICAgICAgICAgICAgICAibm9fc2l0ZSIsICJpZ25vcmVfZW52aXJvbm1lbnQiLCAidGFiY2hlY2siLCAidmVyYm9zZSIsCisgICAgICAgICAgICAgICAgICJ1bmljb2RlIiwgImJ5dGVzX3dhcm5pbmciLCAiaGFzaF9yYW5kb21pemF0aW9uIikKKyAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzeXMuZmxhZ3MsIGF0dHIpLCBhdHRyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGdldGF0dHIoc3lzLmZsYWdzLCBhdHRyKSksIGludCwgYXR0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoc3lzLmZsYWdzKSkKKworICAgIGRlZiB0ZXN0X2NsZWFyX3R5cGVfY2FjaGUoc2VsZik6CisgICAgICAgIHN5cy5fY2xlYXJfdHlwZV9jYWNoZSgpCisKKyAgICBkZWYgdGVzdF9pb2VuY29kaW5nKHNlbGYpOgorICAgICAgICBpbXBvcnQgc3VicHJvY2VzcworICAgICAgICBlbnYgPSBkaWN0KG9zLmVudmlyb24pCisKKyAgICAgICAgIyBUZXN0IGNoYXJhY3RlcjogY2VudCBzaWduLCBlbmNvZGVkIGFzIDB4NEEgKEFTQ0lJIEopIGluIENQNDI0LAorICAgICAgICAjIG5vdCByZXByZXNlbnRhYmxlIGluIEFTQ0lJLgorCisgICAgICAgIGVudlsiUFlUSE9OSU9FTkNPRElORyJdID0gImNwNDI0IgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICdwcmludCB1bmljaHIoMHhhMiknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc3VicHJvY2Vzcy5QSVBFLCBlbnY9ZW52KQorICAgICAgICBvdXQgPSBwLmNvbW11bmljYXRlKClbMF0uc3RyaXAoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgdW5pY2hyKDB4YTIpLmVuY29kZSgiY3A0MjQiKSkKKworICAgICAgICBlbnZbIlBZVEhPTklPRU5DT0RJTkciXSA9ICJhc2NpaTpyZXBsYWNlIgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICdwcmludCB1bmljaHIoMHhhMiknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0ID0gc3VicHJvY2Vzcy5QSVBFLCBlbnY9ZW52KQorICAgICAgICBvdXQgPSBwLmNvbW11bmljYXRlKClbMF0uc3RyaXAoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgJz8nKQorCisgICAgZGVmIHRlc3RfY2FsbF90cmFjaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5jYWxsX3RyYWNpbmcoc3RyLCAoMiwpKSwgIjIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5jYWxsX3RyYWNpbmcsIHN0ciwgMikKKworICAgIGRlZiB0ZXN0X2V4ZWN1dGFibGUoc2VsZik6CisgICAgICAgICMgc3lzLmV4ZWN1dGFibGUgc2hvdWxkIGJlIGFic29sdXRlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5hYnNwYXRoKHN5cy5leGVjdXRhYmxlKSwgc3lzLmV4ZWN1dGFibGUpCisKKyAgICAgICAgIyBJc3N1ZSAjNzc3NDogRW5zdXJlIHRoYXQgc3lzLmV4ZWN1dGFibGUgaXMgYW4gZW1wdHkgc3RyaW5nIGlmIGFyZ3ZbMF0KKyAgICAgICAgIyBoYXMgYmVlbiBzZXQgdG8gYW4gbm9uIGV4aXN0ZW50IHByb2dyYW0gbmFtZSBhbmQgUHl0aG9uIGlzIHVuYWJsZSB0bworICAgICAgICAjIHJldHJpZXZlIHRoZSByZWFsIHByb2dyYW0gbmFtZQorICAgICAgICBpbXBvcnQgc3VicHJvY2VzcworICAgICAgICAjIEZvciBhIG5vcm1hbCBpbnN0YWxsYXRpb24sIGl0IHNob3VsZCB3b3JrIHdpdGhvdXQgJ2N3ZCcKKyAgICAgICAgIyBhcmd1bWVudC4gRm9yIHRlc3QgcnVucyBpbiB0aGUgYnVpbGQgZGlyZWN0b3J5LCBzZWUgIzc3NzQuCisgICAgICAgIHB5dGhvbl9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChzeXMuZXhlY3V0YWJsZSkpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKAorICAgICAgICAgICAgWyJub25leGlzdGVudCIsICItYyIsICdpbXBvcnQgc3lzOyBwcmludCByZXByKHN5cy5leGVjdXRhYmxlKSddLAorICAgICAgICAgICAgZXhlY3V0YWJsZT1zeXMuZXhlY3V0YWJsZSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgY3dkPXB5dGhvbl9kaXIpCisgICAgICAgIGV4ZWN1dGFibGUgPSBwLmNvbW11bmljYXRlKClbMF0uc3RyaXAoKQorICAgICAgICBwLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEluKGV4ZWN1dGFibGUsIFsiJyciLCByZXByKHN5cy5leGVjdXRhYmxlKV0pCisKK2NsYXNzIFNpemVvZlRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLlAgPSBzdHJ1Y3QuY2FsY3NpemUoJ1AnKQorICAgICAgICBzZWxmLmxvbmdkaWdpdCA9IHN5cy5sb25nX2luZm8uc2l6ZW9mX2RpZ2l0CisgICAgICAgIGltcG9ydCBfdGVzdGNhcGkKKyAgICAgICAgc2VsZi5nY19oZWFkc2l6ZSA9IF90ZXN0Y2FwaS5TSVpFT0ZfUFlHQ19IRUFECisgICAgICAgIHNlbGYuZmlsZSA9IG9wZW4odGVzdC50ZXN0X3N1cHBvcnQuVEVTVEZOLCAnd2InKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQorICAgICAgICB0ZXN0LnRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdC50ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgY2hlY2tfc2l6ZW9mID0gdGVzdC50ZXN0X3N1cHBvcnQuY2hlY2tfc2l6ZW9mCisKKyAgICBkZWYgdGVzdF9nY19oZWFkX3NpemUoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgZ2MgaGVhZGVyIHNpemUgaXMgYWRkZWQgdG8gb2JqZWN0cyB0cmFja2VkIGJ5IHRoZSBnYy4KKyAgICAgICAgc2l6ZSA9IHRlc3QudGVzdF9zdXBwb3J0LmNhbGNvYmpzaXplCisgICAgICAgIGdjX2hlYWRlcl9zaXplID0gc2VsZi5nY19oZWFkc2l6ZQorICAgICAgICAjIGJvb2wgb2JqZWN0cyBhcmUgbm90IGdjIHRyYWNrZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0c2l6ZW9mKFRydWUpLCBzaXplKCdsJykpCisgICAgICAgICMgYnV0IGxpc3RzIGFyZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRzaXplb2YoW10pLCBzaXplKCdQIFBQJykgKyBnY19oZWFkZXJfc2l6ZSkKKworICAgIGRlZiB0ZXN0X2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNpemUgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5jYWxjb2Jqc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRzaXplb2YoVHJ1ZSwgLTEpLCBzaXplKCdsJykpCisKKyAgICBkZWYgdGVzdF9vYmplY3R0eXBlcyhzZWxmKToKKyAgICAgICAgIyBjaGVjayBhbGwgdHlwZXMgZGVmaW5lZCBpbiBPYmplY3RzLworICAgICAgICBzaXplID0gdGVzdC50ZXN0X3N1cHBvcnQuY2FsY29ianNpemUKKyAgICAgICAgdnNpemUgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5jYWxjdm9ianNpemUKKyAgICAgICAgY2hlY2sgPSBzZWxmLmNoZWNrX3NpemVvZgorICAgICAgICAjIGJvb2wKKyAgICAgICAgY2hlY2soVHJ1ZSwgc2l6ZSgnbCcpKQorICAgICAgICAjIGJ1ZmZlcgorICAgICAgICB3aXRoIHRlc3QudGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIGNoZWNrKGJ1ZmZlcignJyksIHNpemUoJzJQMlBpbCcpKQorICAgICAgICAjIGJ1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kCisgICAgICAgIGNoZWNrKGxlbiwgc2l6ZSgnM1AnKSkKKyAgICAgICAgIyBieXRlYXJyYXkKKyAgICAgICAgc2FtcGxlcyA9IFsnJywgJ3UnKjEwMDAwMF0KKyAgICAgICAgZm9yIHNhbXBsZSBpbiBzYW1wbGVzOgorICAgICAgICAgICAgeCA9IGJ5dGVhcnJheShzYW1wbGUpCisgICAgICAgICAgICBjaGVjayh4LCB2c2l6ZSgnaVBQJykgKyB4Ll9fYWxsb2NfXygpKQorICAgICAgICAjIGJ5dGVhcnJheV9pdGVyYXRvcgorICAgICAgICBjaGVjayhpdGVyKGJ5dGVhcnJheSgpKSwgc2l6ZSgnUFAnKSkKKyAgICAgICAgIyBjZWxsCisgICAgICAgIGRlZiBnZXRfY2VsbCgpOgorICAgICAgICAgICAgeCA9IDQyCisgICAgICAgICAgICBkZWYgaW5uZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgcmV0dXJuIGlubmVyCisgICAgICAgIGNoZWNrKGdldF9jZWxsKCkuZnVuY19jbG9zdXJlWzBdLCBzaXplKCdQJykpCisgICAgICAgICMgY2xhc3NvYmogKG9sZC1zdHlsZSBjbGFzcykKKyAgICAgICAgY2xhc3MgY2xhc3Nfb2xkc3R5bGUoKToKKyAgICAgICAgICAgIGRlZiBtZXRob2QoKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGNoZWNrKGNsYXNzX29sZHN0eWxlLCBzaXplKCc3UCcpKQorICAgICAgICAjIGluc3RhbmNlIChvbGQtc3R5bGUgY2xhc3MpCisgICAgICAgIGNoZWNrKGNsYXNzX29sZHN0eWxlKCksIHNpemUoJzNQJykpCisgICAgICAgICMgaW5zdGFuY2VtZXRob2QgKG9sZC1zdHlsZSBjbGFzcykKKyAgICAgICAgY2hlY2soY2xhc3Nfb2xkc3R5bGUoKS5tZXRob2QsIHNpemUoJzRQJykpCisgICAgICAgICMgY29tcGxleAorICAgICAgICBjaGVjayhjb21wbGV4KDAsMSksIHNpemUoJzJkJykpCisgICAgICAgICMgY29kZQorICAgICAgICBjaGVjayhnZXRfY2VsbCgpLmZ1bmNfY29kZSwgc2l6ZSgnNGk4UGkzUCcpKQorICAgICAgICAjIEJhc2VFeGNlcHRpb24KKyAgICAgICAgY2hlY2soQmFzZUV4Y2VwdGlvbigpLCBzaXplKCczUCcpKQorICAgICAgICAjIFVuaWNvZGVFbmNvZGVFcnJvcgorICAgICAgICBjaGVjayhVbmljb2RlRW5jb2RlRXJyb3IoIiIsIHUiIiwgMCwgMCwgIiIpLCBzaXplKCc1UDJQUCcpKQorICAgICAgICAjIFVuaWNvZGVEZWNvZGVFcnJvcgorICAgICAgICBjaGVjayhVbmljb2RlRGVjb2RlRXJyb3IoIiIsICIiLCAwLCAwLCAiIiksIHNpemUoJzVQMlBQJykpCisgICAgICAgICMgVW5pY29kZVRyYW5zbGF0ZUVycm9yCisgICAgICAgIGNoZWNrKFVuaWNvZGVUcmFuc2xhdGVFcnJvcih1IiIsIDAsIDEsICIiKSwgc2l6ZSgnNVAyUFAnKSkKKyAgICAgICAgIyBtZXRob2RfZGVzY3JpcHRvciAoZGVzY3JpcHRvciBvYmplY3QpCisgICAgICAgIGNoZWNrKHN0ci5sb3dlciwgc2l6ZSgnMlBQJykpCisgICAgICAgICMgY2xhc3NtZXRob2RfZGVzY3JpcHRvciAoZGVzY3JpcHRvciBvYmplY3QpCisgICAgICAgICMgWFhYCisgICAgICAgICMgbWVtYmVyX2Rlc2NyaXB0b3IgKGRlc2NyaXB0b3Igb2JqZWN0KQorICAgICAgICBpbXBvcnQgZGF0ZXRpbWUKKyAgICAgICAgY2hlY2soZGF0ZXRpbWUudGltZWRlbHRhLmRheXMsIHNpemUoJzJQUCcpKQorICAgICAgICAjIGdldHNldF9kZXNjcmlwdG9yIChkZXNjcmlwdG9yIG9iamVjdCkKKyAgICAgICAgaW1wb3J0IF9fYnVpbHRpbl9fCisgICAgICAgIGNoZWNrKF9fYnVpbHRpbl9fLmZpbGUuY2xvc2VkLCBzaXplKCcyUFAnKSkKKyAgICAgICAgIyB3cmFwcGVyX2Rlc2NyaXB0b3IgKGRlc2NyaXB0b3Igb2JqZWN0KQorICAgICAgICBjaGVjayhpbnQuX19hZGRfXywgc2l6ZSgnMlAyUCcpKQorICAgICAgICAjIGRpY3Rwcm94eQorICAgICAgICBjbGFzcyBDKG9iamVjdCk6IHBhc3MKKyAgICAgICAgY2hlY2soQy5fX2RpY3RfXywgc2l6ZSgnUCcpKQorICAgICAgICAjIG1ldGhvZC13cmFwcGVyIChkZXNjcmlwdG9yIG9iamVjdCkKKyAgICAgICAgY2hlY2soe30uX19pdGVyX18sIHNpemUoJzJQJykpCisgICAgICAgICMgZGljdAorICAgICAgICBjaGVjayh7fSwgc2l6ZSgnM1AyUCcgKyA4KidQMlAnKSkKKyAgICAgICAgeCA9IHsxOjEsIDI6MiwgMzozLCA0OjQsIDU6NSwgNjo2LCA3OjcsIDg6OH0KKyAgICAgICAgY2hlY2soeCwgc2l6ZSgnM1AyUCcgKyA4KidQMlAnKSArIDE2KnN0cnVjdC5jYWxjc2l6ZSgnUDJQJykpCisgICAgICAgICMgZGljdGlvbmFyeS1rZXlpdGVyYXRvcgorICAgICAgICBjaGVjayh7fS5pdGVya2V5cygpLCBzaXplKCdQMlBQUCcpKQorICAgICAgICAjIGRpY3Rpb25hcnktdmFsdWVpdGVyYXRvcgorICAgICAgICBjaGVjayh7fS5pdGVydmFsdWVzKCksIHNpemUoJ1AyUFBQJykpCisgICAgICAgICMgZGljdGlvbmFyeS1pdGVtaXRlcmF0b3IKKyAgICAgICAgY2hlY2soe30uaXRlcml0ZW1zKCksIHNpemUoJ1AyUFBQJykpCisgICAgICAgICMgZWxsaXBzZXMKKyAgICAgICAgY2hlY2soRWxsaXBzaXMsIHNpemUoJycpKQorICAgICAgICAjIEVuY29kaW5nTWFwCisgICAgICAgIGltcG9ydCBjb2RlY3MsIGVuY29kaW5ncy5pc284ODU5XzMKKyAgICAgICAgeCA9IGNvZGVjcy5jaGFybWFwX2J1aWxkKGVuY29kaW5ncy5pc284ODU5XzMuZGVjb2RpbmdfdGFibGUpCisgICAgICAgIGNoZWNrKHgsIHNpemUoJzMyQjJpQicpKQorICAgICAgICAjIGVudW1lcmF0ZQorICAgICAgICBjaGVjayhlbnVtZXJhdGUoW10pLCBzaXplKCdsM1AnKSkKKyAgICAgICAgIyBmaWxlCisgICAgICAgIGNoZWNrKHNlbGYuZmlsZSwgc2l6ZSgnNFAyaTRQM2kzUDNpJykpCisgICAgICAgICMgZmxvYXQKKyAgICAgICAgY2hlY2soZmxvYXQoMCksIHNpemUoJ2QnKSkKKyAgICAgICAgIyBzeXMuZmxvYXRpbmZvCisgICAgICAgIGNoZWNrKHN5cy5mbG9hdF9pbmZvLCB2c2l6ZSgnJykgKyBzZWxmLlAgKiBsZW4oc3lzLmZsb2F0X2luZm8pKQorICAgICAgICAjIGZyYW1lCisgICAgICAgIGltcG9ydCBpbnNwZWN0CisgICAgICAgIENPX01BWEJMT0NLUyA9IDIwCisgICAgICAgIHggPSBpbnNwZWN0LmN1cnJlbnRmcmFtZSgpCisgICAgICAgIG5jZWxscyA9IGxlbih4LmZfY29kZS5jb19jZWxsdmFycykKKyAgICAgICAgbmZyZWVzID0gbGVuKHguZl9jb2RlLmNvX2ZyZWV2YXJzKQorICAgICAgICBleHRyYXMgPSB4LmZfY29kZS5jb19zdGFja3NpemUgKyB4LmZfY29kZS5jb19ubG9jYWxzICtcCisgICAgICAgICAgICAgICAgIG5jZWxscyArIG5mcmVlcyAtIDEKKyAgICAgICAgY2hlY2soeCwgdnNpemUoJzEyUDNpJyArIENPX01BWEJMT0NLUyonM2knICsgJ1AnICsgZXh0cmFzKidQJykpCisgICAgICAgICMgZnVuY3Rpb24KKyAgICAgICAgZGVmIGZ1bmMoKTogcGFzcworICAgICAgICBjaGVjayhmdW5jLCBzaXplKCc5UCcpKQorICAgICAgICBjbGFzcyBjKCk6CisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgYmFyKGNscyk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGNoZWNrKGZvbywgc2l6ZSgnUCcpKQorICAgICAgICAgICAgIyBjbGFzc21ldGhvZAorICAgICAgICAgICAgY2hlY2soYmFyLCBzaXplKCdQJykpCisgICAgICAgICMgZ2VuZXJhdG9yCisgICAgICAgIGRlZiBnZXRfZ2VuKCk6IHlpZWxkIDEKKyAgICAgICAgY2hlY2soZ2V0X2dlbigpLCBzaXplKCdQaTJQJykpCisgICAgICAgICMgaW50ZWdlcgorICAgICAgICBjaGVjaygxLCBzaXplKCdsJykpCisgICAgICAgIGNoZWNrKDEwMCwgc2l6ZSgnbCcpKQorICAgICAgICAjIGl0ZXJhdG9yCisgICAgICAgIGNoZWNrKGl0ZXIoJ2FiYycpLCBzaXplKCdsUCcpKQorICAgICAgICAjIGNhbGxhYmxlLWl0ZXJhdG9yCisgICAgICAgIGltcG9ydCByZQorICAgICAgICBjaGVjayhyZS5maW5kaXRlcignJywnJyksIHNpemUoJzJQJykpCisgICAgICAgICMgbGlzdAorICAgICAgICBzYW1wbGVzID0gW1tdLCBbMSwyLDNdLCBbJzEnLCAnMicsICczJ11dCisgICAgICAgIGZvciBzYW1wbGUgaW4gc2FtcGxlczoKKyAgICAgICAgICAgIGNoZWNrKHNhbXBsZSwgdnNpemUoJ1BQJykgKyBsZW4oc2FtcGxlKSpzZWxmLlApCisgICAgICAgICMgc29ydHdyYXBwZXIgKGxpc3QpCisgICAgICAgICMgWFhYCisgICAgICAgICMgY21wd3JhcHBlciAobGlzdCkKKyAgICAgICAgIyBYWFgKKyAgICAgICAgIyBsaXN0aXRlcmF0b3IgKGxpc3QpCisgICAgICAgIGNoZWNrKGl0ZXIoW10pLCBzaXplKCdsUCcpKQorICAgICAgICAjIGxpc3RyZXZlcnNlaXRlcmF0b3IgKGxpc3QpCisgICAgICAgIGNoZWNrKHJldmVyc2VkKFtdKSwgc2l6ZSgnbFAnKSkKKyAgICAgICAgIyBsb25nCisgICAgICAgIGNoZWNrKDBMLCB2c2l6ZSgnJykpCisgICAgICAgIGNoZWNrKDFMLCB2c2l6ZSgnJykgKyBzZWxmLmxvbmdkaWdpdCkKKyAgICAgICAgY2hlY2soLTFMLCB2c2l6ZSgnJykgKyBzZWxmLmxvbmdkaWdpdCkKKyAgICAgICAgUHlMb25nX0JBU0UgPSAyKipzeXMubG9uZ19pbmZvLmJpdHNfcGVyX2RpZ2l0CisgICAgICAgIGNoZWNrKGxvbmcoUHlMb25nX0JBU0UpLCB2c2l6ZSgnJykgKyAyKnNlbGYubG9uZ2RpZ2l0KQorICAgICAgICBjaGVjayhsb25nKFB5TG9uZ19CQVNFKioyLTEpLCB2c2l6ZSgnJykgKyAyKnNlbGYubG9uZ2RpZ2l0KQorICAgICAgICBjaGVjayhsb25nKFB5TG9uZ19CQVNFKioyKSwgdnNpemUoJycpICsgMypzZWxmLmxvbmdkaWdpdCkKKyAgICAgICAgIyBtb2R1bGUKKyAgICAgICAgY2hlY2sodW5pdHRlc3QsIHNpemUoJ1AnKSkKKyAgICAgICAgIyBOb25lCisgICAgICAgIGNoZWNrKE5vbmUsIHNpemUoJycpKQorICAgICAgICAjIG9iamVjdAorICAgICAgICBjaGVjayhvYmplY3QoKSwgc2l6ZSgnJykpCisgICAgICAgICMgcHJvcGVydHkgKGRlc2NyaXB0b3Igb2JqZWN0KQorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZ2V0eChzZWxmKTogcmV0dXJuIHNlbGYuX194CisgICAgICAgICAgICBkZWYgc2V0eChzZWxmLCB2YWx1ZSk6IHNlbGYuX194ID0gdmFsdWUKKyAgICAgICAgICAgIGRlZiBkZWx4KHNlbGYpOiBkZWwgc2VsZi5fX3gKKyAgICAgICAgICAgIHggPSBwcm9wZXJ0eShnZXR4LCBzZXR4LCBkZWx4LCAiIikKKyAgICAgICAgICAgIGNoZWNrKHgsIHNpemUoJzRQaScpKQorICAgICAgICAjIFB5Q09iamVjdAorICAgICAgICAjIFB5Q2Fwc3VsZQorICAgICAgICAjIFhYWAorICAgICAgICAjIHJhbmdlaXRlcmF0b3IKKyAgICAgICAgY2hlY2soaXRlcih4cmFuZ2UoMSkpLCBzaXplKCc0bCcpKQorICAgICAgICAjIHJldmVyc2UKKyAgICAgICAgY2hlY2socmV2ZXJzZWQoJycpLCBzaXplKCdQUCcpKQorICAgICAgICAjIHNldAorICAgICAgICAjIGZyb3plbnNldAorICAgICAgICBQeVNldF9NSU5TSVpFID0gOAorICAgICAgICBzYW1wbGVzID0gW1tdLCByYW5nZSgxMCksIHJhbmdlKDUwKV0KKyAgICAgICAgcyA9IHNpemUoJzNQMlAnICsgUHlTZXRfTUlOU0laRSonbFAnICsgJ2xQJykKKyAgICAgICAgZm9yIHNhbXBsZSBpbiBzYW1wbGVzOgorICAgICAgICAgICAgbWludXNlZCA9IGxlbihzYW1wbGUpCisgICAgICAgICAgICBpZiBtaW51c2VkID09IDA6IHRtcCA9IDEKKyAgICAgICAgICAgICMgdGhlIGNvbXB1dGF0aW9uIG9mIG1pbnVzZWQgaXMgYWN0dWFsbHkgYSBiaXQgbW9yZSBjb21wbGljYXRlZAorICAgICAgICAgICAgIyBidXQgdGhpcyBzdWZmaWNlcyBmb3IgdGhlIHNpemVvZiB0ZXN0CisgICAgICAgICAgICBtaW51c2VkID0gbWludXNlZCoyCisgICAgICAgICAgICBuZXdzaXplID0gUHlTZXRfTUlOU0laRQorICAgICAgICAgICAgd2hpbGUgbmV3c2l6ZSA8PSBtaW51c2VkOgorICAgICAgICAgICAgICAgIG5ld3NpemUgPSBuZXdzaXplIDw8IDEKKyAgICAgICAgICAgIGlmIG5ld3NpemUgPD0gODoKKyAgICAgICAgICAgICAgICBjaGVjayhzZXQoc2FtcGxlKSwgcykKKyAgICAgICAgICAgICAgICBjaGVjayhmcm96ZW5zZXQoc2FtcGxlKSwgcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY2hlY2soc2V0KHNhbXBsZSksIHMgKyBuZXdzaXplKnN0cnVjdC5jYWxjc2l6ZSgnbFAnKSkKKyAgICAgICAgICAgICAgICBjaGVjayhmcm96ZW5zZXQoc2FtcGxlKSwgcyArIG5ld3NpemUqc3RydWN0LmNhbGNzaXplKCdsUCcpKQorICAgICAgICAjIHNldGl0ZXJhdG9yCisgICAgICAgIGNoZWNrKGl0ZXIoc2V0KCkpLCBzaXplKCdQM1AnKSkKKyAgICAgICAgIyBzbGljZQorICAgICAgICBjaGVjayhzbGljZSgxKSwgc2l6ZSgnM1AnKSkKKyAgICAgICAgIyBzdHIKKyAgICAgICAgdmggPSB0ZXN0LnRlc3Rfc3VwcG9ydC5fdmhlYWRlcgorICAgICAgICBjaGVjaygnJywgc3RydWN0LmNhbGNzaXplKHZoICsgJ2xpYycpKQorICAgICAgICBjaGVjaygnYWJjJywgc3RydWN0LmNhbGNzaXplKHZoICsgJ2xpYycpICsgMykKKyAgICAgICAgIyBzdXBlcgorICAgICAgICBjaGVjayhzdXBlcihpbnQpLCBzaXplKCczUCcpKQorICAgICAgICAjIHR1cGxlCisgICAgICAgIGNoZWNrKCgpLCB2c2l6ZSgnJykpCisgICAgICAgIGNoZWNrKCgxLDIsMyksIHZzaXplKCcnKSArIDMqc2VsZi5QKQorICAgICAgICAjIHR1cGxlaXRlcmF0b3IKKyAgICAgICAgY2hlY2soaXRlcigoKSksIHNpemUoJ2xQJykpCisgICAgICAgICMgdHlwZQorICAgICAgICAjIChQeVR5cGVPYmplY3QgKyBQeU51bWJlck1ldGhvZHMgKyAgUHlNYXBwaW5nTWV0aG9kcyArCisgICAgICAgICMgIFB5U2VxdWVuY2VNZXRob2RzICsgUHlCdWZmZXJQcm9jcykKKyAgICAgICAgcyA9IHZzaXplKCdQMlAxNVBsNFBQOVBQMTFQSScpICsgc3RydWN0LmNhbGNzaXplKCc0MVAgMTBQIDNQIDZQJykKKyAgICAgICAgY2xhc3MgbmV3c3R5bGVjbGFzcyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjaGVjayhuZXdzdHlsZWNsYXNzLCBzKQorICAgICAgICAjIGJ1aWx0aW4gdHlwZQorICAgICAgICBjaGVjayhpbnQsIHMpCisgICAgICAgICMgTm90SW1wbGVtZW50ZWRUeXBlCisgICAgICAgIGltcG9ydCB0eXBlcworICAgICAgICBjaGVjayh0eXBlcy5Ob3RJbXBsZW1lbnRlZFR5cGUsIHMpCisgICAgICAgICMgdW5pY29kZQorICAgICAgICB1c2l6ZSA9IGxlbih1J1wwJy5lbmNvZGUoJ3VuaWNvZGUtaW50ZXJuYWwnKSkKKyAgICAgICAgc2FtcGxlcyA9IFt1JycsIHUnMScqMTAwXQorICAgICAgICAjIHdlIG5lZWQgdG8gdGVzdCBmb3IgYm90aCBzaXplcywgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIHRoZSBzdHJpbmcKKyAgICAgICAgIyBoYXMgYmVlbiBjYWNoZWQKKyAgICAgICAgZm9yIHMgaW4gc2FtcGxlczoKKyAgICAgICAgICAgIGNoZWNrKHMsIHNpemUoJ1BQbFAnKSArIHVzaXplICogKGxlbihzKSArIDEpKQorICAgICAgICAjIHdlYWtyZWYKKyAgICAgICAgaW1wb3J0IHdlYWtyZWYKKyAgICAgICAgY2hlY2sod2Vha3JlZi5yZWYoaW50KSwgc2l6ZSgnMlBsMlAnKSkKKyAgICAgICAgIyB3ZWFrcHJveHkKKyAgICAgICAgIyBYWFgKKyAgICAgICAgIyB3ZWFrY2FsbGFibGVwcm94eQorICAgICAgICBjaGVjayh3ZWFrcmVmLnByb3h5KGludCksIHNpemUoJzJQbDJQJykpCisgICAgICAgICMgeHJhbmdlCisgICAgICAgIGNoZWNrKHhyYW5nZSgxKSwgc2l6ZSgnM2wnKSkKKyAgICAgICAgY2hlY2soeHJhbmdlKDY2MDAwKSwgc2l6ZSgnM2wnKSkKKworICAgIGRlZiB0ZXN0X3B5dGhvbnR5cGVzKHNlbGYpOgorICAgICAgICAjIGNoZWNrIGFsbCB0eXBlcyBkZWZpbmVkIGluIFB5dGhvbi8KKyAgICAgICAgc2l6ZSA9IHRlc3QudGVzdF9zdXBwb3J0LmNhbGNvYmpzaXplCisgICAgICAgIHZzaXplID0gdGVzdC50ZXN0X3N1cHBvcnQuY2FsY3ZvYmpzaXplCisgICAgICAgIGNoZWNrID0gc2VsZi5jaGVja19zaXplb2YKKyAgICAgICAgIyBfYXN0LkFTVAorICAgICAgICBpbXBvcnQgX2FzdAorICAgICAgICBjaGVjayhfYXN0LkFTVCgpLCBzaXplKCcnKSkKKyAgICAgICAgIyBpbXAuTnVsbEltcG9ydGVyCisgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgY2hlY2soaW1wLk51bGxJbXBvcnRlcihzZWxmLmZpbGUubmFtZSksIHNpemUoJycpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbMl0KKyAgICAgICAgICAgICMgdHJhY2ViYWNrCisgICAgICAgICAgICBpZiB0YiAhPSBOb25lOgorICAgICAgICAgICAgICAgIGNoZWNrKHRiLCBzaXplKCcyUDJpJykpCisgICAgICAgICMgc3ltdGFibGUgZW50cnkKKyAgICAgICAgIyBYWFgKKyAgICAgICAgIyBzeXMuZmxhZ3MKKyAgICAgICAgY2hlY2soc3lzLmZsYWdzLCB2c2l6ZSgnJykgKyBzZWxmLlAgKiBsZW4oc3lzLmZsYWdzKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9jbGFzc2VzID0gKFN5c01vZHVsZVRlc3QsIFNpemVvZlRlc3QpCisKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3YTg5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc3YTg5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzX3NldHByb2ZpbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0cHJvZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODI1NTlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzX3NldHByb2ZpbGUucHkKQEAgLTAsMCArMSwzODYgQEAKK2ltcG9ydCBnYworaW1wb3J0IHBwcmludAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIFRlc3RHZXRQcm9maWxlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN5cy5zZXRwcm9maWxlKE5vbmUpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5zZXRwcm9maWxlKE5vbmUpCisKKyAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc3lzLmdldHByb2ZpbGUoKSkKKworICAgIGRlZiB0ZXN0X3NldGdldChzZWxmKToKKyAgICAgICAgZGVmIGZuKCphcmdzKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzeXMuc2V0cHJvZmlsZShmbikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzeXMuZ2V0cHJvZmlsZSgpLCBmbikKKworY2xhc3MgSG9va1dhdGNoZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmZyYW1lcyA9IFtdCisgICAgICAgIHNlbGYuZXZlbnRzID0gW10KKworICAgIGRlZiBjYWxsYmFjayhzZWxmLCBmcmFtZSwgZXZlbnQsIGFyZyk6CisgICAgICAgIGlmIChldmVudCA9PSAiY2FsbCIKKyAgICAgICAgICAgIG9yIGV2ZW50ID09ICJyZXR1cm4iCisgICAgICAgICAgICBvciBldmVudCA9PSAiZXhjZXB0aW9uIik6CisgICAgICAgICAgICBzZWxmLmFkZF9ldmVudChldmVudCwgZnJhbWUpCisKKyAgICBkZWYgYWRkX2V2ZW50KHNlbGYsIGV2ZW50LCBmcmFtZT1Ob25lKToKKyAgICAgICAgIiIiQWRkIGFuIGV2ZW50IHRvIHRoZSBsb2cuIiIiCisgICAgICAgIGlmIGZyYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoMSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmcmFtZW5vID0gc2VsZi5mcmFtZXMuaW5kZXgoZnJhbWUpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgZnJhbWVubyA9IGxlbihzZWxmLmZyYW1lcykKKyAgICAgICAgICAgIHNlbGYuZnJhbWVzLmFwcGVuZChmcmFtZSkKKworICAgICAgICBzZWxmLmV2ZW50cy5hcHBlbmQoKGZyYW1lbm8sIGV2ZW50LCBpZGVudChmcmFtZSkpKQorCisgICAgZGVmIGdldF9ldmVudHMoc2VsZik6CisgICAgICAgICIiIlJlbW92ZSBjYWxscyB0byBhZGRfZXZlbnQoKS4iIiIKKyAgICAgICAgZGlzYWxsb3dlZCA9IFtpZGVudChzZWxmLmFkZF9ldmVudC5pbV9mdW5jKSwgaWRlbnQoaWRlbnQpXQorICAgICAgICBzZWxmLmZyYW1lcyA9IE5vbmUKKworICAgICAgICByZXR1cm4gW2l0ZW0gZm9yIGl0ZW0gaW4gc2VsZi5ldmVudHMgaWYgaXRlbVsyXSBub3QgaW4gZGlzYWxsb3dlZF0KKworCitjbGFzcyBQcm9maWxlU2ltdWxhdG9yKEhvb2tXYXRjaGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdGNhc2UpOgorICAgICAgICBzZWxmLnRlc3RjYXNlID0gdGVzdGNhc2UKKyAgICAgICAgc2VsZi5zdGFjayA9IFtdCisgICAgICAgIEhvb2tXYXRjaGVyLl9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgY2FsbGJhY2soc2VsZiwgZnJhbWUsIGV2ZW50LCBhcmcpOgorICAgICAgICAjIENhbGxiYWNrIHJlZ2lzdGVyZWQgd2l0aCBzeXMuc2V0cHJvZmlsZSgpL3N5cy5zZXR0cmFjZSgpCisgICAgICAgIHNlbGYuZGlzcGF0Y2hbZXZlbnRdKHNlbGYsIGZyYW1lKQorCisgICAgZGVmIHRyYWNlX2NhbGwoc2VsZiwgZnJhbWUpOgorICAgICAgICBzZWxmLmFkZF9ldmVudCgnY2FsbCcsIGZyYW1lKQorICAgICAgICBzZWxmLnN0YWNrLmFwcGVuZChmcmFtZSkKKworICAgIGRlZiB0cmFjZV9yZXR1cm4oc2VsZiwgZnJhbWUpOgorICAgICAgICBzZWxmLmFkZF9ldmVudCgncmV0dXJuJywgZnJhbWUpCisgICAgICAgIHNlbGYuc3RhY2sucG9wKCkKKworICAgIGRlZiB0cmFjZV9leGNlcHRpb24oc2VsZiwgZnJhbWUpOgorICAgICAgICBzZWxmLnRlc3RjYXNlLmZhaWwoCisgICAgICAgICAgICAidGhlIHByb2ZpbGVyIHNob3VsZCBuZXZlciByZWNlaXZlIGV4Y2VwdGlvbiBldmVudHMiKQorCisgICAgZGVmIHRyYWNlX3Bhc3Moc2VsZiwgZnJhbWUpOgorICAgICAgICBwYXNzCisKKyAgICBkaXNwYXRjaCA9IHsKKyAgICAgICAgJ2NhbGwnOiB0cmFjZV9jYWxsLAorICAgICAgICAnZXhjZXB0aW9uJzogdHJhY2VfZXhjZXB0aW9uLAorICAgICAgICAncmV0dXJuJzogdHJhY2VfcmV0dXJuLAorICAgICAgICAnY19jYWxsJzogdHJhY2VfcGFzcywKKyAgICAgICAgJ2NfcmV0dXJuJzogdHJhY2VfcGFzcywKKyAgICAgICAgJ2NfZXhjZXB0aW9uJzogdHJhY2VfcGFzcywKKyAgICAgICAgfQorCisKK2NsYXNzIFRlc3RDYXNlQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGNoZWNrX2V2ZW50cyhzZWxmLCBjYWxsYWJsZSwgZXhwZWN0ZWQpOgorICAgICAgICBldmVudHMgPSBjYXB0dXJlX2V2ZW50cyhjYWxsYWJsZSwgc2VsZi5uZXdfd2F0Y2hlcigpKQorICAgICAgICBpZiBldmVudHMgIT0gZXhwZWN0ZWQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkIGV2ZW50czpcbiVzXG5SZWNlaXZlZCBldmVudHM6XG4lcyIKKyAgICAgICAgICAgICAgICAgICAgICAlIChwcHJpbnQucGZvcm1hdChleHBlY3RlZCksIHBwcmludC5wZm9ybWF0KGV2ZW50cykpKQorCisKK2NsYXNzIFByb2ZpbGVIb29rVGVzdENhc2UoVGVzdENhc2VCYXNlKToKKyAgICBkZWYgbmV3X3dhdGNoZXIoc2VsZik6CisgICAgICAgIHJldHVybiBIb29rV2F0Y2hlcigpCisKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIGRlZiBmKHApOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmX2lkZW50ID0gaWRlbnQoZikKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZiwgWygxLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb24oc2VsZik6CisgICAgICAgIGRlZiBmKHApOgorICAgICAgICAgICAgMS4vMAorICAgICAgICBmX2lkZW50ID0gaWRlbnQoZikKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZiwgWygxLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9jYXVnaHRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBkZWYgZihwKToKKyAgICAgICAgICAgIHRyeTogMS4vMAorICAgICAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgIGZfaWRlbnQgPSBpZGVudChmKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhmLCBbKDEsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2NhdWdodF9uZXN0ZWRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBkZWYgZihwKToKKyAgICAgICAgICAgIHRyeTogMS4vMAorICAgICAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgIGZfaWRlbnQgPSBpZGVudChmKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhmLCBbKDEsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF9leGNlcHRpb24oc2VsZik6CisgICAgICAgIGRlZiBmKHApOgorICAgICAgICAgICAgMS4vMAorICAgICAgICBmX2lkZW50ID0gaWRlbnQoZikKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZiwgWygxLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzbid0IHdoYXQgSSBleHBlY3RlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKDAsICdleGNlcHRpb24nLCBwcm90ZWN0X2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSSBleHBlY3RlZCB0aGlzIGFnYWluOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb25faW5fZXhjZXB0X2NsYXVzZShzZWxmKToKKyAgICAgICAgZGVmIGYocCk6CisgICAgICAgICAgICAxLi8wCisgICAgICAgIGRlZiBnKHApOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYocCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICB0cnk6IGYocCkKKyAgICAgICAgICAgICAgICBleGNlcHQ6IHBhc3MKKyAgICAgICAgZl9pZGVudCA9IGlkZW50KGYpCisgICAgICAgIGdfaWRlbnQgPSBpZGVudChnKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhnLCBbKDEsICdjYWxsJywgZ19pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ3JldHVybicsIGdfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbl9wcm9wb2dhdGlvbihzZWxmKToKKyAgICAgICAgZGVmIGYocCk6CisgICAgICAgICAgICAxLi8wCisgICAgICAgIGRlZiBnKHApOgorICAgICAgICAgICAgdHJ5OiBmKHApCisgICAgICAgICAgICBmaW5hbGx5OiBwLmFkZF9ldmVudCgiZmFsbGluZyB0aHJvdWdoIikKKyAgICAgICAgZl9pZGVudCA9IGlkZW50KGYpCisgICAgICAgIGdfaWRlbnQgPSBpZGVudChnKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhnLCBbKDEsICdjYWxsJywgZ19pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ2ZhbGxpbmcgdGhyb3VnaCcsIGdfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBnX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9yYWlzZV90d2ljZShzZWxmKToKKyAgICAgICAgZGVmIGYocCk6CisgICAgICAgICAgICB0cnk6IDEuLzAKKyAgICAgICAgICAgIGV4Y2VwdDogMS4vMAorICAgICAgICBmX2lkZW50ID0gaWRlbnQoZikKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZiwgWygxLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9yYWlzZV9yZXJhaXNlKHNlbGYpOgorICAgICAgICBkZWYgZihwKToKKyAgICAgICAgICAgIHRyeTogMS4vMAorICAgICAgICAgICAgZXhjZXB0OiByYWlzZQorICAgICAgICBmX2lkZW50ID0gaWRlbnQoZikKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZiwgWygxLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9yYWlzZShzZWxmKToKKyAgICAgICAgZGVmIGYocCk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oKQorICAgICAgICBmX2lkZW50ID0gaWRlbnQoZikKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZiwgWygxLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9kaXN0YW50X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIDEuLzAKKyAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgIGYoKQorICAgICAgICBkZWYgaCgpOgorICAgICAgICAgICAgZygpCisgICAgICAgIGRlZiBpKCk6CisgICAgICAgICAgICBoKCkKKyAgICAgICAgZGVmIGoocCk6CisgICAgICAgICAgICBpKCkKKyAgICAgICAgZl9pZGVudCA9IGlkZW50KGYpCisgICAgICAgIGdfaWRlbnQgPSBpZGVudChnKQorICAgICAgICBoX2lkZW50ID0gaWRlbnQoaCkKKyAgICAgICAgaV9pZGVudCA9IGlkZW50KGkpCisgICAgICAgIGpfaWRlbnQgPSBpZGVudChqKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhqLCBbKDEsICdjYWxsJywgal9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2NhbGwnLCBpX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnY2FsbCcsIGhfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdjYWxsJywgZ19pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNSwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ3JldHVybicsIGdfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdyZXR1cm4nLCBoX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAncmV0dXJuJywgaV9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ3JldHVybicsIGpfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2dlbmVyYXRvcihzZWxmKToKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDIpOgorICAgICAgICAgICAgICAgIHlpZWxkIGkKKyAgICAgICAgZGVmIGcocCk6CisgICAgICAgICAgICBmb3IgaSBpbiBmKCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBmX2lkZW50ID0gaWRlbnQoZikKKyAgICAgICAgZ19pZGVudCA9IGlkZW50KGcpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKGcsIFsoMSwgJ2NhbGwnLCBnX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2FsbCB0aGUgaXRlcmF0b3IgdHdpY2UgdG8gZ2VuZXJhdGUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9uY2UgbW9yZTsgcmV0dXJucyBlbmQtb2YtaXRlcmF0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWN0dWFsbHkgcmFpc2luZyBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJywgZ19pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3Rfc3RvcF9pdGVyYXRpb24oc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgyKToKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIGRlZiBnKHApOgorICAgICAgICAgICAgZm9yIGkgaW4gZigpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZl9pZGVudCA9IGlkZW50KGYpCisgICAgICAgIGdfaWRlbnQgPSBpZGVudChnKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhnLCBbKDEsICdjYWxsJywgZ19pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNhbGwgdGhlIGl0ZXJhdG9yIHR3aWNlIHRvIGdlbmVyYXRlIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmNlIG1vcmUgdG8gaGl0IHRoZSByYWlzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJywgZ19pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisKK2NsYXNzIFByb2ZpbGVTaW11bGF0b3JUZXN0Q2FzZShUZXN0Q2FzZUJhc2UpOgorICAgIGRlZiBuZXdfd2F0Y2hlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIFByb2ZpbGVTaW11bGF0b3Ioc2VsZikKKworICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgZGVmIGYocCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZfaWRlbnQgPSBpZGVudChmKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhmLCBbKDEsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZGVmIGYocCk6CisgICAgICAgICAgICAxLi8wCisgICAgICAgIGZfaWRlbnQgPSBpZGVudChmKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhmLCBbKDEsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2NhdWdodF9leGNlcHRpb24oc2VsZik6CisgICAgICAgIGRlZiBmKHApOgorICAgICAgICAgICAgdHJ5OiAxLi8wCisgICAgICAgICAgICBleGNlcHQ6IHBhc3MKKyAgICAgICAgZl9pZGVudCA9IGlkZW50KGYpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKGYsIFsoMSwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZGlzdGFudF9leGNlcHRpb24oc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAxLi8wCisgICAgICAgIGRlZiBnKCk6CisgICAgICAgICAgICBmKCkKKyAgICAgICAgZGVmIGgoKToKKyAgICAgICAgICAgIGcoKQorICAgICAgICBkZWYgaSgpOgorICAgICAgICAgICAgaCgpCisgICAgICAgIGRlZiBqKHApOgorICAgICAgICAgICAgaSgpCisgICAgICAgIGZfaWRlbnQgPSBpZGVudChmKQorICAgICAgICBnX2lkZW50ID0gaWRlbnQoZykKKyAgICAgICAgaF9pZGVudCA9IGlkZW50KGgpCisgICAgICAgIGlfaWRlbnQgPSBpZGVudChpKQorICAgICAgICBqX2lkZW50ID0gaWRlbnQoaikKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoaiwgWygxLCAnY2FsbCcsIGpfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdjYWxsJywgaV9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ2NhbGwnLCBoX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAnY2FsbCcsIGdfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNSwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdyZXR1cm4nLCBnX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAncmV0dXJuJywgaF9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ3JldHVybicsIGlfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBqX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKworZGVmIGlkZW50KGZ1bmN0aW9uKToKKyAgICBpZiBoYXNhdHRyKGZ1bmN0aW9uLCAiZl9jb2RlIik6CisgICAgICAgIGNvZGUgPSBmdW5jdGlvbi5mX2NvZGUKKyAgICBlbHNlOgorICAgICAgICBjb2RlID0gZnVuY3Rpb24uZnVuY19jb2RlCisgICAgcmV0dXJuIGNvZGUuY29fZmlyc3RsaW5lbm8sIGNvZGUuY29fbmFtZQorCisKK2RlZiBwcm90ZWN0KGYsIHApOgorICAgIHRyeTogZihwKQorICAgIGV4Y2VwdDogcGFzcworCitwcm90ZWN0X2lkZW50ID0gaWRlbnQocHJvdGVjdCkKKworCitkZWYgY2FwdHVyZV9ldmVudHMoY2FsbGFibGUsIHA9Tm9uZSk6CisgICAgaWYgcCBpcyBOb25lOgorICAgICAgICBwID0gSG9va1dhdGNoZXIoKQorICAgICMgRGlzYWJsZSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuIFRoaXMgcHJldmVudHMgX19kZWxfX3MgZnJvbSBzaG93aW5nIHVwIGluCisgICAgIyB0cmFjZXMuCisgICAgb2xkX2djID0gZ2MuaXNlbmFibGVkKCkKKyAgICBnYy5kaXNhYmxlKCkKKyAgICB0cnk6CisgICAgICAgIHN5cy5zZXRwcm9maWxlKHAuY2FsbGJhY2spCisgICAgICAgIHByb3RlY3QoY2FsbGFibGUsIHApCisgICAgICAgIHN5cy5zZXRwcm9maWxlKE5vbmUpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgb2xkX2djOgorICAgICAgICAgICAgZ2MuZW5hYmxlKCkKKyAgICByZXR1cm4gcC5nZXRfZXZlbnRzKClbMTotMV0KKworCitkZWYgc2hvd19ldmVudHMoY2FsbGFibGUpOgorICAgIGltcG9ydCBwcHJpbnQKKyAgICBwcHJpbnQucHByaW50KGNhcHR1cmVfZXZlbnRzKGNhbGxhYmxlKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgVGVzdEdldFByb2ZpbGUsCisgICAgICAgIFByb2ZpbGVIb29rVGVzdENhc2UsCisgICAgICAgIFByb2ZpbGVTaW11bGF0b3JUZXN0Q2FzZQorICAgICkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0cHJvZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0cHJvZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2YzRhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c19zZXRwcm9maWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0cHJvZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0cHJvZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2YzRhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c19zZXRwcm9maWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM3YmNlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c19zZXR0cmFjZS5weQpAQCAtMCwwICsxLDgwMCBAQAorIyBUZXN0aW5nIHRoZSBsaW5lIHRyYWNlIGZhY2lsaXR5LgorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCitpbXBvcnQgZGlmZmxpYgoraW1wb3J0IGdjCisKKyMgQSB2ZXJ5IGJhc2ljIGV4YW1wbGUuICBJZiB0aGlzIGZhaWxzLCB3ZSdyZSBpbiBkZWVwIHRyb3VibGUuCitkZWYgYmFzaWMoKToKKyAgICByZXR1cm4gMQorCitiYXNpYy5ldmVudHMgPSBbKDAsICdjYWxsJyksCisgICAgICAgICAgICAgICAgKDEsICdsaW5lJyksCisgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nKV0KKworIyBNYW55IG9mIHRoZSB0ZXN0cyBiZWxvdyBhcmUgdHJpY2t5IGJlY2F1c2UgdGhleSBpbnZvbHZlIHBhc3Mgc3RhdGVtZW50cy4KKyMgSWYgdGhlcmUgaXMgaW1wbGljaXQgY29udHJvbCBmbG93IGFyb3VuZCBhIHBhc3Mgc3RhdGVtZW50IChpbiBhbiBleGNlcHQKKyMgY2xhdXNlIG9yIGVsc2UgY2FsdXNlKSB1bmRlciB3aGF0IGNvbmRpdGlvbnMgZG8geW91IHNldCBhIGxpbmUgbnVtYmVyCisjIGZvbGxvd2luZyB0aGF0IGNsYXVzZT8KKworCisjIFRoZSBlbnRpcmUgIndoaWxlIDA6IiBzdGF0ZW1lbnQgaXMgb3B0aW1pemVkIGF3YXkuICBObyBjb2RlCisjIGV4aXN0cyBmb3IgaXQsIHNvIHRoZSBsaW5lIG51bWJlcnMgc2tpcCBkaXJlY3RseSBmcm9tICJkZWwgeCIKKyMgdG8gInggPSAxIi4KK2RlZiBhcmlnb19leGFtcGxlKCk6CisgICAgeCA9IDEKKyAgICBkZWwgeAorICAgIHdoaWxlIDA6CisgICAgICAgIHBhc3MKKyAgICB4ID0gMQorCithcmlnb19leGFtcGxlLmV2ZW50cyA9IFsoMCwgJ2NhbGwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoNSwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICg1LCAncmV0dXJuJyldCisKKyMgY2hlY2sgdGhhdCBsaW5lcyBjb25zaXN0aW5nIG9mIGp1c3Qgb25lIGluc3RydWN0aW9uIGdldCB0cmFjZWQ6CitkZWYgb25lX2luc3RyX2xpbmUoKToKKyAgICB4ID0gMQorICAgIGRlbCB4CisgICAgeCA9IDEKKworb25lX2luc3RyX2xpbmUuZXZlbnRzID0gWygwLCAnY2FsbCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAncmV0dXJuJyldCisKK2RlZiBub19wb3BfdG9wcygpOiAgICAgICMgMAorICAgIHggPSAxICAgICAgICAgICAgICAgIyAxCisgICAgZm9yIGEgaW4gcmFuZ2UoMik6ICAjIDIKKyAgICAgICAgaWYgYTogICAgICAgICAgICMgMworICAgICAgICAgICAgeCA9IDEgICAgICAgIyA0CisgICAgICAgIGVsc2U6ICAgICAgICAgICAjIDUKKyAgICAgICAgICAgIHggPSAxICAgICAgICMgNgorCitub19wb3BfdG9wcy5ldmVudHMgPSBbKDAsICdjYWxsJyksCisgICAgICAgICAgICAgICAgICAgICAgKDEsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgKDIsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgKDMsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgKDYsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgKDIsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgKDMsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgKDQsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgKDIsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgKDIsICdyZXR1cm4nKV0KKworZGVmIG5vX3BvcF9ibG9ja3MoKToKKyAgICB5ID0gMQorICAgIHdoaWxlIG5vdCB5OgorICAgICAgICBibGEKKyAgICB4ID0gMQorCitub19wb3BfYmxvY2tzLmV2ZW50cyA9IFsoMCwgJ2NhbGwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICg0LCAncmV0dXJuJyldCisKK2RlZiBjYWxsZWQoKTogIyBsaW5lIC0zCisgICAgeCA9IDEKKworZGVmIGNhbGwoKTogICAjIGxpbmUgMAorICAgIGNhbGxlZCgpCisKK2NhbGwuZXZlbnRzID0gWygwLCAnY2FsbCcpLAorICAgICAgICAgICAgICAgKDEsICdsaW5lJyksCisgICAgICAgICAgICAgICAoLTMsICdjYWxsJyksCisgICAgICAgICAgICAgICAoLTIsICdsaW5lJyksCisgICAgICAgICAgICAgICAoLTIsICdyZXR1cm4nKSwKKyAgICAgICAgICAgICAgICgxLCAncmV0dXJuJyldCisKK2RlZiByYWlzZXMoKToKKyAgICByYWlzZSBFeGNlcHRpb24KKworZGVmIHRlc3RfcmFpc2UoKToKKyAgICB0cnk6CisgICAgICAgIHJhaXNlcygpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZXhjOgorICAgICAgICB4ID0gMQorCit0ZXN0X3JhaXNlLmV2ZW50cyA9IFsoMCwgJ2NhbGwnKSwKKyAgICAgICAgICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgKDIsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAoLTMsICdjYWxsJyksCisgICAgICAgICAgICAgICAgICAgICAoLTIsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAoLTIsICdleGNlcHRpb24nKSwKKyAgICAgICAgICAgICAgICAgICAgICgtMiwgJ3JldHVybicpLAorICAgICAgICAgICAgICAgICAgICAgKDIsICdleGNlcHRpb24nKSwKKyAgICAgICAgICAgICAgICAgICAgICgzLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgKDQsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAoNCwgJ3JldHVybicpXQorCitkZWYgX3NldHRyYWNlX2FuZF9yZXR1cm4odHJhY2VmdW5jKToKKyAgICBzeXMuc2V0dHJhY2UodHJhY2VmdW5jKQorICAgIHN5cy5fZ2V0ZnJhbWUoKS5mX2JhY2suZl90cmFjZSA9IHRyYWNlZnVuYworZGVmIHNldHRyYWNlX2FuZF9yZXR1cm4odHJhY2VmdW5jKToKKyAgICBfc2V0dHJhY2VfYW5kX3JldHVybih0cmFjZWZ1bmMpCisKK3NldHRyYWNlX2FuZF9yZXR1cm4uZXZlbnRzID0gWygxLCAncmV0dXJuJyldCisKK2RlZiBfc2V0dHJhY2VfYW5kX3JhaXNlKHRyYWNlZnVuYyk6CisgICAgc3lzLnNldHRyYWNlKHRyYWNlZnVuYykKKyAgICBzeXMuX2dldGZyYW1lKCkuZl9iYWNrLmZfdHJhY2UgPSB0cmFjZWZ1bmMKKyAgICByYWlzZSBSdW50aW1lRXJyb3IKK2RlZiBzZXR0cmFjZV9hbmRfcmFpc2UodHJhY2VmdW5jKToKKyAgICB0cnk6CisgICAgICAgIF9zZXR0cmFjZV9hbmRfcmFpc2UodHJhY2VmdW5jKQorICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IsIGV4YzoKKyAgICAgICAgcGFzcworCitzZXR0cmFjZV9hbmRfcmFpc2UuZXZlbnRzID0gWygyLCAnZXhjZXB0aW9uJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdyZXR1cm4nKV0KKworIyBpbXBsaWNpdCByZXR1cm4gZXhhbXBsZQorIyBUaGlzIHRlc3QgaXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBvZiB0aGUgZWxzZTogcGFzcworIyBwYXJ0IG9mIHRoZSBjb2RlLiAgVGhlIGNvZGUgZ2VuZXJhdGUgZm9yIHRoZSB0cnVlCisjIHBhcnQgb2YgdGhlIGlmIGNvbnRhaW5zIGEganVtcCBwYXN0IHRoZSBlbHNlIGJyYW5jaC4KKyMgVGhlIGNvbXBpbGVyIHRoZW4gZ2VuZXJhdGVzIGFuIGltcGxpY2l0ICJyZXR1cm4gTm9uZSIKKyMgSW50ZXJuYWxseSwgdGhlIGNvbXBpbGVyIHZpc2l0cyB0aGUgcGFzcyBzdGF0ZW1lbnQKKyMgYW5kIHN0b3JlcyBpdHMgbGluZSBudW1iZXIgZm9yIHVzZSBvbiB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KKyMgVGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgdGhlIGltcGxpY2l0IHJldHVybiBOb25lLgorZGVmIGlyZXR1cm5fZXhhbXBsZSgpOgorICAgIGEgPSA1CisgICAgYiA9IDUKKyAgICBpZiBhID09IGI6CisgICAgICAgIGIgPSBhKzEKKyAgICBlbHNlOgorICAgICAgICBwYXNzCisKK2lyZXR1cm5fZXhhbXBsZS5ldmVudHMgPSBbKDAsICdjYWxsJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoNiwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDYsICdyZXR1cm4nKV0KKworIyBUaWdodCBsb29wIHdpdGggd2hpbGUoMSkgZXhhbXBsZSAoU0YgIzc2NTYyNCkKK2RlZiB0aWdodGxvb3BfZXhhbXBsZSgpOgorICAgIGl0ZW1zID0gcmFuZ2UoMCwgMykKKyAgICB0cnk6CisgICAgICAgIGkgPSAwCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBiID0gaXRlbXNbaV07IGkrPTEKKyAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgcGFzcworCit0aWdodGxvb3BfZXhhbXBsZS5ldmVudHMgPSBbKDAsICdjYWxsJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdleGNlcHRpb24nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNiwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNywgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNywgJ3JldHVybicpXQorCitkZWYgdGlnaHRlcmxvb3BfZXhhbXBsZSgpOgorICAgIGl0ZW1zID0gcmFuZ2UoMSwgNCkKKyAgICB0cnk6CisgICAgICAgIGkgPSAwCisgICAgICAgIHdoaWxlIDE6IGkgPSBpdGVtc1tpXQorICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICBwYXNzCisKK3RpZ2h0ZXJsb29wX2V4YW1wbGUuZXZlbnRzID0gWygwLCAnY2FsbCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAnZXhjZXB0aW9uJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYsICdyZXR1cm4nKV0KKworZGVmIGdlbmVyYXRvcl9mdW5jdGlvbigpOgorICAgIHRyeToKKyAgICAgICAgeWllbGQgVHJ1ZQorICAgICAgICAiY29udGludWVkIgorICAgIGZpbmFsbHk6CisgICAgICAgICJmaW5hbGx5IgorZGVmIGdlbmVyYXRvcl9leGFtcGxlKCk6CisgICAgIyBhbnkoKSB3aWxsIGxlYXZlIHRoZSBnZW5lcmF0b3IgYmVmb3JlIGl0cyBlbmQKKyAgICB4ID0gYW55KGdlbmVyYXRvcl9mdW5jdGlvbigpKQorCisgICAgIyB0aGUgZm9sbG93aW5nIGxpbmVzIHdlcmUgbm90IHRyYWNlZAorICAgIGZvciB4IGluIHJhbmdlKDEwKToKKyAgICAgICAgeSA9IHgKKworZ2VuZXJhdG9yX2V4YW1wbGUuZXZlbnRzID0gKFsoMCwgJ2NhbGwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNiwgJ2NhbGwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC01LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNCwgJ3JldHVybicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQsICdjYWxsJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNCwgJ2V4Y2VwdGlvbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMSwgJ3JldHVybicpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyg1LCAnbGluZScpLCAoNiwgJ2xpbmUnKV0gKiAxMCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyg1LCAnbGluZScpLCAoNSwgJ3JldHVybicpXSkKKworCitjbGFzcyBUcmFjZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmV2ZW50cyA9IFtdCisgICAgZGVmIHRyYWNlKHNlbGYsIGZyYW1lLCBldmVudCwgYXJnKToKKyAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKChmcmFtZS5mX2xpbmVubywgZXZlbnQpKQorICAgICAgICByZXR1cm4gc2VsZi50cmFjZQorICAgIGRlZiB0cmFjZVdpdGhHZW5leHAoc2VsZiwgZnJhbWUsIGV2ZW50LCBhcmcpOgorICAgICAgICAobyBmb3IgbyBpbiBbMV0pCisgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZCgoZnJhbWUuZl9saW5lbm8sIGV2ZW50KSkKKyAgICAgICAgcmV0dXJuIHNlbGYudHJhY2UKKworY2xhc3MgVHJhY2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIERpc2FibGUgZ2MgY29sbGVjdGlvbiB3aGVuIHRyYWNpbmcsIG90aGVyd2lzZSB0aGUKKyAgICAjIGRlYWxsb2NhdG9ycyBtYXkgYmUgdHJhY2VkIGFzIHdlbGwuCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnVzaW5nX2djID0gZ2MuaXNlbmFibGVkKCkKKyAgICAgICAgZ2MuZGlzYWJsZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYudXNpbmdfZ2M6CisgICAgICAgICAgICBnYy5lbmFibGUoKQorCisgICAgZGVmIGNvbXBhcmVfZXZlbnRzKHNlbGYsIGxpbmVfb2Zmc2V0LCBldmVudHMsIGV4cGVjdGVkX2V2ZW50cyk6CisgICAgICAgIGV2ZW50cyA9IFsobCAtIGxpbmVfb2Zmc2V0LCBlKSBmb3IgKGwsIGUpIGluIGV2ZW50c10KKyAgICAgICAgaWYgZXZlbnRzICE9IGV4cGVjdGVkX2V2ZW50czoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgKKyAgICAgICAgICAgICAgICAiZXZlbnRzIGRpZCBub3QgbWF0Y2ggZXhwZWN0YXRpb246XG4iICsKKyAgICAgICAgICAgICAgICAiXG4iLmpvaW4oZGlmZmxpYi5uZGlmZihbc3RyKHgpIGZvciB4IGluIGV4cGVjdGVkX2V2ZW50c10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0cih4KSBmb3IgeCBpbiBldmVudHNdKSkpCisKKyAgICBkZWYgcnVuX2FuZF9jb21wYXJlKHNlbGYsIGZ1bmMsIGV2ZW50cyk6CisgICAgICAgIHRyYWNlciA9IFRyYWNlcigpCisgICAgICAgIHN5cy5zZXR0cmFjZSh0cmFjZXIudHJhY2UpCisgICAgICAgIGZ1bmMoKQorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKyAgICAgICAgc2VsZi5jb21wYXJlX2V2ZW50cyhmdW5jLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZXIuZXZlbnRzLCBldmVudHMpCisKKyAgICBkZWYgcnVuX3Rlc3Qoc2VsZiwgZnVuYyk6CisgICAgICAgIHNlbGYucnVuX2FuZF9jb21wYXJlKGZ1bmMsIGZ1bmMuZXZlbnRzKQorCisgICAgZGVmIHJ1bl90ZXN0MihzZWxmLCBmdW5jKToKKyAgICAgICAgdHJhY2VyID0gVHJhY2VyKCkKKyAgICAgICAgZnVuYyh0cmFjZXIudHJhY2UpCisgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorICAgICAgICBzZWxmLmNvbXBhcmVfZXZlbnRzKGZ1bmMuZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlci5ldmVudHMsIGZ1bmMuZXZlbnRzKQorCisgICAgZGVmIHRlc3Rfc2V0X2FuZF9yZXRyaWV2ZV9ub25lKHNlbGYpOgorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKyAgICAgICAgYXNzZXJ0IHN5cy5nZXR0cmFjZSgpIGlzIE5vbmUKKworICAgIGRlZiB0ZXN0X3NldF9hbmRfcmV0cmlldmVfZnVuYyhzZWxmKToKKyAgICAgICAgZGVmIGZuKCphcmdzKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzeXMuc2V0dHJhY2UoZm4pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFzc2VydCBzeXMuZ2V0dHJhY2UoKSBpcyBmbgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCisKKyAgICBkZWYgdGVzdF8wMV9iYXNpYyhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChiYXNpYykKKyAgICBkZWYgdGVzdF8wMl9hcmlnbyhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChhcmlnb19leGFtcGxlKQorICAgIGRlZiB0ZXN0XzAzX29uZV9pbnN0cihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChvbmVfaW5zdHJfbGluZSkKKyAgICBkZWYgdGVzdF8wNF9ub19wb3BfYmxvY2tzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX3BvcF9ibG9ja3MpCisgICAgZGVmIHRlc3RfMDVfbm9fcG9wX3RvcHMoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fcG9wX3RvcHMpCisgICAgZGVmIHRlc3RfMDZfY2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChjYWxsKQorICAgIGRlZiB0ZXN0XzA3X3JhaXNlKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KHRlc3RfcmFpc2UpCisKKyAgICBkZWYgdGVzdF8wOF9zZXR0cmFjZV9hbmRfcmV0dXJuKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0MihzZXR0cmFjZV9hbmRfcmV0dXJuKQorICAgIGRlZiB0ZXN0XzA5X3NldHRyYWNlX2FuZF9yYWlzZShzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdDIoc2V0dHJhY2VfYW5kX3JhaXNlKQorICAgIGRlZiB0ZXN0XzEwX2lyZXR1cm4oc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QoaXJldHVybl9leGFtcGxlKQorICAgIGRlZiB0ZXN0XzExX3RpZ2h0bG9vcChzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdCh0aWdodGxvb3BfZXhhbXBsZSkKKyAgICBkZWYgdGVzdF8xMl90aWdodGVybG9vcChzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdCh0aWdodGVybG9vcF9leGFtcGxlKQorCisgICAgZGVmIHRlc3RfMTNfZ2VuZXhwKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KGdlbmVyYXRvcl9leGFtcGxlKQorICAgICAgICAjIGlzc3VlMTI2NTogaWYgdGhlIHRyYWNlIGZ1bmN0aW9uIGNvbnRhaW5zIGEgZ2VuZXJhdG9yLAorICAgICAgICAjIGFuZCBpZiB0aGUgdHJhY2VkIGZ1bmN0aW9uIGNvbnRhaW5zIGFub3RoZXIgZ2VuZXJhdG9yCisgICAgICAgICMgdGhhdCBpcyBub3QgY29tcGxldGVseSBleGhhdXN0ZWQsIHRoZSB0cmFjZSBzdG9wcGVkLgorICAgICAgICAjIFdvcnNlOiB0aGUgJ2ZpbmFsbHknIGNsYXVzZSB3YXMgbm90IGludm9rZWQuCisgICAgICAgIHRyYWNlciA9IFRyYWNlcigpCisgICAgICAgIHN5cy5zZXR0cmFjZSh0cmFjZXIudHJhY2VXaXRoR2VuZXhwKQorICAgICAgICBnZW5lcmF0b3JfZXhhbXBsZSgpCisgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorICAgICAgICBzZWxmLmNvbXBhcmVfZXZlbnRzKGdlbmVyYXRvcl9leGFtcGxlLl9fY29kZV9fLmNvX2ZpcnN0bGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlci5ldmVudHMsIGdlbmVyYXRvcl9leGFtcGxlLmV2ZW50cykKKworICAgIGRlZiB0ZXN0XzE0X29ubGluZXJfaWYoc2VsZik6CisgICAgICAgIGRlZiBvbmxpbmVycygpOgorICAgICAgICAgICAgaWYgVHJ1ZTogRmFsc2UKKyAgICAgICAgICAgIGVsc2U6IFRydWUKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHNlbGYucnVuX2FuZF9jb21wYXJlKAorICAgICAgICAgICAgb25saW5lcnMsCisgICAgICAgICAgICBbKDAsICdjYWxsJyksCisgICAgICAgICAgICAgKDEsICdsaW5lJyksCisgICAgICAgICAgICAgKDMsICdsaW5lJyksCisgICAgICAgICAgICAgKDMsICdyZXR1cm4nKV0pCisKKyAgICBkZWYgdGVzdF8xNV9sb29wcyhzZWxmKToKKyAgICAgICAgIyBpc3N1ZTE3NTAwNzY6ICJ3aGlsZSIgZXhwcmVzc2lvbiBpcyBza2lwcGVkIGJ5IGRlYnVnZ2VyCisgICAgICAgIGRlZiBmb3JfZXhhbXBsZSgpOgorICAgICAgICAgICAgZm9yIHggaW4gcmFuZ2UoMik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLnJ1bl9hbmRfY29tcGFyZSgKKyAgICAgICAgICAgIGZvcl9leGFtcGxlLAorICAgICAgICAgICAgWygwLCAnY2FsbCcpLAorICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICgxLCAncmV0dXJuJyldKQorCisgICAgICAgIGRlZiB3aGlsZV9leGFtcGxlKCk6CisgICAgICAgICAgICAjIFdoaWxlIGV4cHJlc3Npb24gc2hvdWxkIGJlIHRyYWNlZCBvbiBldmVyeSBsb29wCisgICAgICAgICAgICB4ID0gMgorICAgICAgICAgICAgd2hpbGUgeCA+IDA6CisgICAgICAgICAgICAgICAgeCAtPSAxCisgICAgICAgIHNlbGYucnVuX2FuZF9jb21wYXJlKAorICAgICAgICAgICAgd2hpbGVfZXhhbXBsZSwKKyAgICAgICAgICAgIFsoMCwgJ2NhbGwnKSwKKyAgICAgICAgICAgICAoMiwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAoMywgJ2xpbmUnKSwKKyAgICAgICAgICAgICAoNCwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAoMywgJ2xpbmUnKSwKKyAgICAgICAgICAgICAoNCwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAoMywgJ2xpbmUnKSwKKyAgICAgICAgICAgICAoMywgJ3JldHVybicpXSkKKworICAgIGRlZiB0ZXN0XzE2X2JsYW5rX2xpbmVzKHNlbGYpOgorICAgICAgICBleGVjKCJkZWYgZigpOlxuIiArICJcbiIgKiAyNTYgKyAiICAgIHBhc3MiKQorICAgICAgICBzZWxmLnJ1bl9hbmRfY29tcGFyZSgKKyAgICAgICAgICAgIGYsCisgICAgICAgICAgICBbKDAsICdjYWxsJyksCisgICAgICAgICAgICAgKDI1NywgJ2xpbmUnKSwKKyAgICAgICAgICAgICAoMjU3LCAncmV0dXJuJyldKQorCisKK2NsYXNzIFJhaXNpbmdUcmFjZUZ1bmNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRyYWNlKHNlbGYsIGZyYW1lLCBldmVudCwgYXJnKToKKyAgICAgICAgIiIiQSB0cmFjZSBmdW5jdGlvbiB0aGF0IHJhaXNlcyBhbiBleGNlcHRpb24gaW4gcmVzcG9uc2UgdG8gYQorICAgICAgICBzcGVjaWZpYyB0cmFjZSBldmVudC4iIiIKKyAgICAgICAgaWYgZXZlbnQgPT0gc2VsZi5yYWlzZU9uRXZlbnQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yICMganVzdCBzb21ldGhpbmcgdGhhdCBpc24ndCBSdW50aW1lRXJyb3IKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRyYWNlCisKKyAgICBkZWYgZihzZWxmKToKKyAgICAgICAgIiIiVGhlIGZ1bmN0aW9uIHRvIHRyYWNlOyByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHRoYXQncyB0aGUgY2FzZQorICAgICAgICB3ZSdyZSB0ZXN0aW5nLCBzbyB0aGF0IHRoZSAnZXhjZXB0aW9uJyB0cmFjZSBldmVudCBmaXJlcy4iIiIKKyAgICAgICAgaWYgc2VsZi5yYWlzZU9uRXZlbnQgPT0gJ2V4Y2VwdGlvbic6CisgICAgICAgICAgICB4ID0gMAorICAgICAgICAgICAgeSA9IDEgLy8geAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBydW5fdGVzdF9mb3JfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiJUZXN0cyB0aGF0IGFuIGV4Y2VwdGlvbiByYWlzZWQgaW4gcmVzcG9uc2UgdG8gdGhlIGdpdmVuIGV2ZW50IGlzCisgICAgICAgIGhhbmRsZWQgT0suIiIiCisgICAgICAgIHNlbGYucmFpc2VPbkV2ZW50ID0gZXZlbnQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHN5cy5nZXRyZWN1cnNpb25saW1pdCgpICsgMSk6CisgICAgICAgICAgICAgICAgc3lzLnNldHRyYWNlKHNlbGYudHJhY2UpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmYoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleGNlcHRpb24gbm90IHJhaXNlZCEiKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWN1cnNpb24gY291bnRlciBub3QgcmVzZXQiKQorCisgICAgIyBUZXN0IHRoZSBoYW5kbGluZyBvZiBleGNlcHRpb25zIHJhaXNlZCBieSBlYWNoIGtpbmQgb2YgdHJhY2UgZXZlbnQuCisgICAgZGVmIHRlc3RfY2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdF9mb3JfZXZlbnQoJ2NhbGwnKQorICAgIGRlZiB0ZXN0X2xpbmUoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3RfZm9yX2V2ZW50KCdsaW5lJykKKyAgICBkZWYgdGVzdF9yZXR1cm4oc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3RfZm9yX2V2ZW50KCdyZXR1cm4nKQorICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdF9mb3JfZXZlbnQoJ2V4Y2VwdGlvbicpCisKKyAgICBkZWYgdGVzdF90cmFzaF9zdGFjayhzZWxmKToKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgICAgIHByaW50IGkgICMgbGluZSB0cmFjaW5nIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIGF0IHRoaXMgbGluZQorCisgICAgICAgIGRlZiBnKGZyYW1lLCB3aHksIGV4dHJhKToKKyAgICAgICAgICAgIGlmICh3aHkgPT0gJ2xpbmUnIGFuZAorICAgICAgICAgICAgICAgIGZyYW1lLmZfbGluZW5vID09IGYuZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5vICsgMik6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiaSBhbSBjcmFzaGluZyIKKyAgICAgICAgICAgIHJldHVybiBnCisKKyAgICAgICAgc3lzLnNldHRyYWNlKGcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYoKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgIyB0aGUgdGVzdCBpcyByZWFsbHkgdGhhdCB0aGlzIGRvZXNuJ3Qgc2VnZmF1bHQ6CisgICAgICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleGNlcHRpb24gbm90IHByb3BhZ2F0ZWQiKQorCisKKyMgJ0p1bXAnIHRlc3RzOiBhc3NpZ25pbmcgdG8gZnJhbWUuZl9saW5lbm8gd2l0aGluIGEgdHJhY2UgZnVuY3Rpb24KKyMgbW92ZXMgdGhlIGV4ZWN1dGlvbiBwb3NpdGlvbiAtIGl0J3MgaG93IGRlYnVnZ2VycyBpbXBsZW1lbnQgYSBKdW1wCisjIGNvbW1hbmQgKGFrYS4gIlNldCBuZXh0IHN0YXRlbWVudCIpLgorCitjbGFzcyBKdW1wVHJhY2VyOgorICAgICIiIkRlZmluZXMgYSB0cmFjZSBmdW5jdGlvbiB0aGF0IGp1bXBzIGZyb20gb25lIHBsYWNlIHRvIGFub3RoZXIsCisgICAgd2l0aCB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBsaW5lcyBvZiB0aGUganVtcCBiZWluZyBkZWZpbmVkIGJ5CisgICAgdGhlICdqdW1wJyBwcm9wZXJ0eSBvZiB0aGUgZnVuY3Rpb24gdW5kZXIgdGVzdC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jdGlvbik6CisgICAgICAgIHNlbGYuZnVuY3Rpb24gPSBmdW5jdGlvbgorICAgICAgICBzZWxmLmp1bXBGcm9tID0gZnVuY3Rpb24uanVtcFswXQorICAgICAgICBzZWxmLmp1bXBUbyA9IGZ1bmN0aW9uLmp1bXBbMV0KKyAgICAgICAgc2VsZi5kb25lID0gRmFsc2UKKworICAgIGRlZiB0cmFjZShzZWxmLCBmcmFtZSwgZXZlbnQsIGFyZyk6CisgICAgICAgIGlmIG5vdCBzZWxmLmRvbmUgYW5kIGZyYW1lLmZfY29kZSA9PSBzZWxmLmZ1bmN0aW9uLmZ1bmNfY29kZToKKyAgICAgICAgICAgIGZpcnN0TGluZSA9IGZyYW1lLmZfY29kZS5jb19maXJzdGxpbmVubworICAgICAgICAgICAgaWYgZXZlbnQgPT0gJ2xpbmUnIGFuZCBmcmFtZS5mX2xpbmVubyA9PSBmaXJzdExpbmUgKyBzZWxmLmp1bXBGcm9tOgorICAgICAgICAgICAgICAgICMgQ29wZSB3aXRoIG5vbi1pbnRlZ2VyIHNlbGYuanVtcFRvIChiZWNhdXNlIG9mCisgICAgICAgICAgICAgICAgIyBub19qdW1wX3RvX25vbl9pbnRlZ2VycyBiZWxvdykuCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmcmFtZS5mX2xpbmVubyA9IGZpcnN0TGluZSArIHNlbGYuanVtcFRvCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUuZl9saW5lbm8gPSBzZWxmLmp1bXBUbworICAgICAgICAgICAgICAgIHNlbGYuZG9uZSA9IFRydWUKKyAgICAgICAgcmV0dXJuIHNlbGYudHJhY2UKKworIyBUaGUgZmlyc3Qgc2V0IG9mICdqdW1wJyB0ZXN0cyBhcmUgZm9yIHRoaW5ncyB0aGF0IGFyZSBhbGxvd2VkOgorCitkZWYganVtcF9zaW1wbGVfZm9yd2FyZHMob3V0cHV0KToKKyAgICBvdXRwdXQuYXBwZW5kKDEpCisgICAgb3V0cHV0LmFwcGVuZCgyKQorICAgIG91dHB1dC5hcHBlbmQoMykKKworanVtcF9zaW1wbGVfZm9yd2FyZHMuanVtcCA9ICgxLCAzKQoranVtcF9zaW1wbGVfZm9yd2FyZHMub3V0cHV0ID0gWzNdCisKK2RlZiBqdW1wX3NpbXBsZV9iYWNrd2FyZHMob3V0cHV0KToKKyAgICBvdXRwdXQuYXBwZW5kKDEpCisgICAgb3V0cHV0LmFwcGVuZCgyKQorCitqdW1wX3NpbXBsZV9iYWNrd2FyZHMuanVtcCA9ICgyLCAxKQoranVtcF9zaW1wbGVfYmFja3dhcmRzLm91dHB1dCA9IFsxLCAxLCAyXQorCitkZWYganVtcF9vdXRfb2ZfYmxvY2tfZm9yd2FyZHMob3V0cHV0KToKKyAgICBmb3IgaSBpbiAxLCAyOgorICAgICAgICBvdXRwdXQuYXBwZW5kKDIpCisgICAgICAgIGZvciBqIGluIFszXTogICMgQWxzbyB0ZXN0cyBqdW1waW5nIG92ZXIgYSBibG9jaworICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCg0KQorICAgIG91dHB1dC5hcHBlbmQoNSkKKworanVtcF9vdXRfb2ZfYmxvY2tfZm9yd2FyZHMuanVtcCA9ICgzLCA1KQoranVtcF9vdXRfb2ZfYmxvY2tfZm9yd2FyZHMub3V0cHV0ID0gWzIsIDVdCisKK2RlZiBqdW1wX291dF9vZl9ibG9ja19iYWNrd2FyZHMob3V0cHV0KToKKyAgICBvdXRwdXQuYXBwZW5kKDEpCisgICAgZm9yIGkgaW4gWzFdOgorICAgICAgICBvdXRwdXQuYXBwZW5kKDMpCisgICAgICAgIGZvciBqIGluIFsyXTogICMgQWxzbyB0ZXN0cyBqdW1waW5nIG92ZXIgYSBibG9jaworICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCg1KQorICAgICAgICBvdXRwdXQuYXBwZW5kKDYpCisgICAgb3V0cHV0LmFwcGVuZCg3KQorCitqdW1wX291dF9vZl9ibG9ja19iYWNrd2FyZHMuanVtcCA9ICg2LCAxKQoranVtcF9vdXRfb2ZfYmxvY2tfYmFja3dhcmRzLm91dHB1dCA9IFsxLCAzLCA1LCAxLCAzLCA1LCA2LCA3XQorCitkZWYganVtcF90b19jb2RlbGVzc19saW5lKG91dHB1dCk6CisgICAgb3V0cHV0LmFwcGVuZCgxKQorICAgICMgSnVtcGluZyB0byB0aGlzIGxpbmUgc2hvdWxkIHNraXAgdG8gdGhlIG5leHQgb25lLgorICAgIG91dHB1dC5hcHBlbmQoMykKKworanVtcF90b19jb2RlbGVzc19saW5lLmp1bXAgPSAoMSwgMikKK2p1bXBfdG9fY29kZWxlc3NfbGluZS5vdXRwdXQgPSBbM10KKworZGVmIGp1bXBfdG9fc2FtZV9saW5lKG91dHB1dCk6CisgICAgb3V0cHV0LmFwcGVuZCgxKQorICAgIG91dHB1dC5hcHBlbmQoMikKKyAgICBvdXRwdXQuYXBwZW5kKDMpCisKK2p1bXBfdG9fc2FtZV9saW5lLmp1bXAgPSAoMiwgMikKK2p1bXBfdG9fc2FtZV9saW5lLm91dHB1dCA9IFsxLCAyLCAzXQorCisjIFRlc3RzIGp1bXBpbmcgd2l0aGluIGEgZmluYWxseSBibG9jaywgYW5kIG92ZXIgb25lLgorZGVmIGp1bXBfaW5fbmVzdGVkX2ZpbmFsbHkob3V0cHV0KToKKyAgICB0cnk6CisgICAgICAgIG91dHB1dC5hcHBlbmQoMikKKyAgICBmaW5hbGx5OgorICAgICAgICBvdXRwdXQuYXBwZW5kKDQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoNikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoOCkKKyAgICAgICAgb3V0cHV0LmFwcGVuZCg5KQorCitqdW1wX2luX25lc3RlZF9maW5hbGx5Lmp1bXAgPSAoNCwgOSkKK2p1bXBfaW5fbmVzdGVkX2ZpbmFsbHkub3V0cHV0ID0gWzIsIDldCisKKyMgVGhlIHNlY29uZCBzZXQgb2YgJ2p1bXAnIHRlc3RzIGFyZSBmb3IgdGhpbmdzIHRoYXQgYXJlIG5vdCBhbGxvd2VkOgorCitkZWYgbm9fanVtcF90b29fZmFyX2ZvcndhcmRzKG91dHB1dCk6CisgICAgdHJ5OgorICAgICAgICBvdXRwdXQuYXBwZW5kKDIpCisgICAgICAgIG91dHB1dC5hcHBlbmQoMykKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnYWZ0ZXInIGluIHN0cihlKSkKKworbm9fanVtcF90b29fZmFyX2ZvcndhcmRzLmp1bXAgPSAoMywgNikKK25vX2p1bXBfdG9vX2Zhcl9mb3J3YXJkcy5vdXRwdXQgPSBbMiwgVHJ1ZV0KKworZGVmIG5vX2p1bXBfdG9vX2Zhcl9iYWNrd2FyZHMob3V0cHV0KToKKyAgICB0cnk6CisgICAgICAgIG91dHB1dC5hcHBlbmQoMikKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgzKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICBvdXRwdXQuYXBwZW5kKCdiZWZvcmUnIGluIHN0cihlKSkKKworbm9fanVtcF90b29fZmFyX2JhY2t3YXJkcy5qdW1wID0gKDMsIC0xKQorbm9fanVtcF90b29fZmFyX2JhY2t3YXJkcy5vdXRwdXQgPSBbMiwgVHJ1ZV0KKworIyBUZXN0IGVhY2gga2luZCBvZiAnZXhjZXB0JyBsaW5lLgorZGVmIG5vX2p1bXBfdG9fZXhjZXB0XzEob3V0cHV0KToKKyAgICB0cnk6CisgICAgICAgIG91dHB1dC5hcHBlbmQoMikKKyAgICBleGNlcHQ6CisgICAgICAgIGUgPSBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICBvdXRwdXQuYXBwZW5kKCdleGNlcHQnIGluIHN0cihlKSkKKworbm9fanVtcF90b19leGNlcHRfMS5qdW1wID0gKDIsIDMpCitub19qdW1wX3RvX2V4Y2VwdF8xLm91dHB1dCA9IFtUcnVlXQorCitkZWYgbm9fanVtcF90b19leGNlcHRfMihvdXRwdXQpOgorICAgIHRyeToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgyKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBlID0gc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnZXhjZXB0JyBpbiBzdHIoZSkpCisKK25vX2p1bXBfdG9fZXhjZXB0XzIuanVtcCA9ICgyLCAzKQorbm9fanVtcF90b19leGNlcHRfMi5vdXRwdXQgPSBbVHJ1ZV0KKworZGVmIG5vX2p1bXBfdG9fZXhjZXB0XzMob3V0cHV0KToKKyAgICB0cnk6CisgICAgICAgIG91dHB1dC5hcHBlbmQoMikKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnZXhjZXB0JyBpbiBzdHIoZSkpCisKK25vX2p1bXBfdG9fZXhjZXB0XzMuanVtcCA9ICgyLCAzKQorbm9fanVtcF90b19leGNlcHRfMy5vdXRwdXQgPSBbVHJ1ZV0KKworZGVmIG5vX2p1bXBfdG9fZXhjZXB0XzQob3V0cHV0KToKKyAgICB0cnk6CisgICAgICAgIG91dHB1dC5hcHBlbmQoMikKKyAgICBleGNlcHQgKFZhbHVlRXJyb3IsIFJ1bnRpbWVFcnJvciksIGU6CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ2V4Y2VwdCcgaW4gc3RyKGUpKQorCitub19qdW1wX3RvX2V4Y2VwdF80Lmp1bXAgPSAoMiwgMykKK25vX2p1bXBfdG9fZXhjZXB0XzQub3V0cHV0ID0gW1RydWVdCisKK2RlZiBub19qdW1wX2ZvcndhcmRzX2ludG9fYmxvY2sob3V0cHV0KToKKyAgICB0cnk6CisgICAgICAgIG91dHB1dC5hcHBlbmQoMikKKyAgICAgICAgZm9yIGkgaW4gMSwgMjoKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoNCkKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnaW50bycgaW4gc3RyKGUpKQorCitub19qdW1wX2ZvcndhcmRzX2ludG9fYmxvY2suanVtcCA9ICgyLCA0KQorbm9fanVtcF9mb3J3YXJkc19pbnRvX2Jsb2NrLm91dHB1dCA9IFtUcnVlXQorCitkZWYgbm9fanVtcF9iYWNrd2FyZHNfaW50b19ibG9jayhvdXRwdXQpOgorICAgIHRyeToKKyAgICAgICAgZm9yIGkgaW4gMSwgMjoKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoMykKKyAgICAgICAgb3V0cHV0LmFwcGVuZCg0KQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICBvdXRwdXQuYXBwZW5kKCdpbnRvJyBpbiBzdHIoZSkpCisKK25vX2p1bXBfYmFja3dhcmRzX2ludG9fYmxvY2suanVtcCA9ICg0LCAzKQorbm9fanVtcF9iYWNrd2FyZHNfaW50b19ibG9jay5vdXRwdXQgPSBbMywgMywgVHJ1ZV0KKworZGVmIG5vX2p1bXBfaW50b19maW5hbGx5X2Jsb2NrKG91dHB1dCk6CisgICAgdHJ5OgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKDMpCisgICAgICAgICAgICB4ID0gMQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCg2KQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICBvdXRwdXQuYXBwZW5kKCdmaW5hbGx5JyBpbiBzdHIoZSkpCisKK25vX2p1bXBfaW50b19maW5hbGx5X2Jsb2NrLmp1bXAgPSAoNCwgNikKK25vX2p1bXBfaW50b19maW5hbGx5X2Jsb2NrLm91dHB1dCA9IFszLCA2LCBUcnVlXSAgIyBUaGUgJ2ZpbmFsbHknIHN0aWxsIHJ1bnMKKworZGVmIG5vX2p1bXBfb3V0X29mX2ZpbmFsbHlfYmxvY2sob3V0cHV0KToKKyAgICB0cnk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoMykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoNSkKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoNikKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnZmluYWxseScgaW4gc3RyKGUpKQorCitub19qdW1wX291dF9vZl9maW5hbGx5X2Jsb2NrLmp1bXAgPSAoNSwgMSkKK25vX2p1bXBfb3V0X29mX2ZpbmFsbHlfYmxvY2sub3V0cHV0ID0gWzMsIFRydWVdCisKKyMgVGhpcyB2ZXJpZmllcyB0aGUgbGluZS1udW1iZXJzLW11c3QtYmUtaW50ZWdlcnMgcnVsZS4KK2RlZiBub19qdW1wX3RvX25vbl9pbnRlZ2VycyhvdXRwdXQpOgorICAgIHRyeToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgyKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICBvdXRwdXQuYXBwZW5kKCdpbnRlZ2VyJyBpbiBzdHIoZSkpCisKK25vX2p1bXBfdG9fbm9uX2ludGVnZXJzLmp1bXAgPSAoMiwgIlNwYW0iKQorbm9fanVtcF90b19ub25faW50ZWdlcnMub3V0cHV0ID0gW1RydWVdCisKK2RlZiBqdW1wX2Fjcm9zc193aXRoKG91dHB1dCk6CisgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGZwOgorICAgICAgICBwYXNzCisgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGZwOgorICAgICAgICBwYXNzCitqdW1wX2Fjcm9zc193aXRoLmp1bXAgPSAoMSwgMykKK2p1bXBfYWNyb3NzX3dpdGgub3V0cHV0ID0gW10KKworIyBUaGlzIHZlcmlmaWVzIHRoYXQgeW91IGNhbid0IHNldCBmX2xpbmVubyB2aWEgX2dldGZyYW1lIG9yIHNpbWlsYXIKKyMgdHJpY2tlcnkuCitkZWYgbm9fanVtcF93aXRob3V0X3RyYWNlX2Z1bmN0aW9uKCk6CisgICAgdHJ5OgorICAgICAgICBwcmV2aW91c19mcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoKS5mX2JhY2sKKyAgICAgICAgcHJldmlvdXNfZnJhbWUuZl9saW5lbm8gPSBwcmV2aW91c19mcmFtZS5mX2xpbmVubworICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICAjIFRoaXMgaXMgdGhlIGV4Y2VwdGlvbiB3ZSB3YW50ZWQ7IG1ha2Ugc3VyZSB0aGUgZXJyb3IgbWVzc2FnZQorICAgICAgICAjIHRhbGtzIGFib3V0IHRyYWNlIGZ1bmN0aW9ucy4KKyAgICAgICAgaWYgJ3RyYWNlJyBub3QgaW4gc3RyKGUpOgorICAgICAgICAgICAgcmFpc2UKKyAgICBlbHNlOgorICAgICAgICAjIFNvbWV0aGluZydzIHdyb25nIC0gdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiB3YXNuJ3QgcmFpc2VkLgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJUcmFjZS1mdW5jdGlvbi1sZXNzIGp1bXAgZmFpbGVkIHRvIGZhaWwiCisKKworY2xhc3MgSnVtcFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgY29tcGFyZV9qdW1wX291dHB1dChzZWxmLCBleHBlY3RlZCwgcmVjZWl2ZWQpOgorICAgICAgICBpZiByZWNlaXZlZCAhPSBleHBlY3RlZDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCggIk91dHB1dHMgZG9uJ3QgbWF0Y2g6XG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOiAiICsgcmVwcihleHBlY3RlZCkgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgIlJlY2VpdmVkOiAiICsgcmVwcihyZWNlaXZlZCkpCisKKyAgICBkZWYgcnVuX3Rlc3Qoc2VsZiwgZnVuYyk6CisgICAgICAgIHRyYWNlciA9IEp1bXBUcmFjZXIoZnVuYykKKyAgICAgICAgc3lzLnNldHRyYWNlKHRyYWNlci50cmFjZSkKKyAgICAgICAgb3V0cHV0ID0gW10KKyAgICAgICAgZnVuYyhvdXRwdXQpCisgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorICAgICAgICBzZWxmLmNvbXBhcmVfanVtcF9vdXRwdXQoZnVuYy5vdXRwdXQsIG91dHB1dCkKKworICAgIGRlZiB0ZXN0XzAxX2p1bXBfc2ltcGxlX2ZvcndhcmRzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KGp1bXBfc2ltcGxlX2ZvcndhcmRzKQorICAgIGRlZiB0ZXN0XzAyX2p1bXBfc2ltcGxlX2JhY2t3YXJkcyhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChqdW1wX3NpbXBsZV9iYWNrd2FyZHMpCisgICAgZGVmIHRlc3RfMDNfanVtcF9vdXRfb2ZfYmxvY2tfZm9yd2FyZHMoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QoanVtcF9vdXRfb2ZfYmxvY2tfZm9yd2FyZHMpCisgICAgZGVmIHRlc3RfMDRfanVtcF9vdXRfb2ZfYmxvY2tfYmFja3dhcmRzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KGp1bXBfb3V0X29mX2Jsb2NrX2JhY2t3YXJkcykKKyAgICBkZWYgdGVzdF8wNV9qdW1wX3RvX2NvZGVsZXNzX2xpbmUoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QoanVtcF90b19jb2RlbGVzc19saW5lKQorICAgIGRlZiB0ZXN0XzA2X2p1bXBfdG9fc2FtZV9saW5lKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KGp1bXBfdG9fc2FtZV9saW5lKQorICAgIGRlZiB0ZXN0XzA3X2p1bXBfaW5fbmVzdGVkX2ZpbmFsbHkoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QoanVtcF9pbl9uZXN0ZWRfZmluYWxseSkKKyAgICBkZWYgdGVzdF8wOF9ub19qdW1wX3Rvb19mYXJfZm9yd2FyZHMoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b29fZmFyX2ZvcndhcmRzKQorICAgIGRlZiB0ZXN0XzA5X25vX2p1bXBfdG9vX2Zhcl9iYWNrd2FyZHMoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b29fZmFyX2JhY2t3YXJkcykKKyAgICBkZWYgdGVzdF8xMF9ub19qdW1wX3RvX2V4Y2VwdF8xKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9fZXhjZXB0XzEpCisgICAgZGVmIHRlc3RfMTFfbm9fanVtcF90b19leGNlcHRfMihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX2V4Y2VwdF8yKQorICAgIGRlZiB0ZXN0XzEyX25vX2p1bXBfdG9fZXhjZXB0XzMoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b19leGNlcHRfMykKKyAgICBkZWYgdGVzdF8xM19ub19qdW1wX3RvX2V4Y2VwdF80KHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9fZXhjZXB0XzQpCisgICAgZGVmIHRlc3RfMTRfbm9fanVtcF9mb3J3YXJkc19pbnRvX2Jsb2NrKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfZm9yd2FyZHNfaW50b19ibG9jaykKKyAgICBkZWYgdGVzdF8xNV9ub19qdW1wX2JhY2t3YXJkc19pbnRvX2Jsb2NrKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfYmFja3dhcmRzX2ludG9fYmxvY2spCisgICAgZGVmIHRlc3RfMTZfbm9fanVtcF9pbnRvX2ZpbmFsbHlfYmxvY2soc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF9pbnRvX2ZpbmFsbHlfYmxvY2spCisgICAgZGVmIHRlc3RfMTdfbm9fanVtcF9vdXRfb2ZfZmluYWxseV9ibG9jayhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX291dF9vZl9maW5hbGx5X2Jsb2NrKQorICAgIGRlZiB0ZXN0XzE4X25vX2p1bXBfdG9fbm9uX2ludGVnZXJzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9fbm9uX2ludGVnZXJzKQorICAgIGRlZiB0ZXN0XzE5X25vX2p1bXBfd2l0aG91dF90cmFjZV9mdW5jdGlvbihzZWxmKToKKyAgICAgICAgbm9fanVtcF93aXRob3V0X3RyYWNlX2Z1bmN0aW9uKCkKKyAgICBkZWYgdGVzdF9qdW1wX2Fjcm9zc193aXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFkZENsZWFudXAodGVzdF9zdXBwb3J0LnVubGluaywgdGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5ydW5fdGVzdChqdW1wX2Fjcm9zc193aXRoKQorCisgICAgZGVmIHRlc3RfMjBfbGFyZ2VfZnVuY3Rpb24oc2VsZik6CisgICAgICAgIGQgPSB7fQorICAgICAgICBleGVjKCIiImRlZiBmKG91dHB1dCk6ICAgICAgICAjIGxpbmUgMAorICAgICAgICAgICAgeCA9IDAgICAgICAgICAgICAgICAgICAgICAjIGxpbmUgMQorICAgICAgICAgICAgeSA9IDEgICAgICAgICAgICAgICAgICAgICAjIGxpbmUgMgorICAgICAgICAgICAgJycnICAgICAgICAgICAgICAgICAgICAgICAjIGxpbmUgMworICAgICAgICAgICAgJXMgICAgICAgICAgICAgICAgICAgICAgICAjIGxpbmVzIDQtMTAwNAorICAgICAgICAgICAgJycnICAgICAgICAgICAgICAgICAgICAgICAjIGxpbmUgMTAwNQorICAgICAgICAgICAgeCArPSAxICAgICAgICAgICAgICAgICAgICAjIGxpbmUgMTAwNgorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCh4KSAgICAgICAgICAjIGxpbmUgMTAwNworICAgICAgICAgICAgcmV0dXJuIiIiICUgKCdcbicgKiAxMDAwLCksIGQpCisgICAgICAgIGYgPSBkWydmJ10KKworICAgICAgICBmLmp1bXAgPSAoMiwgMTAwNykKKyAgICAgICAgZi5vdXRwdXQgPSBbMF0KKyAgICAgICAgc2VsZi5ydW5fdGVzdChmKQorCisgICAgZGVmIHRlc3RfanVtcF90b19maXJzdGxpbmVubyhzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3RzIHRoYXQgUERCIGNhbiBqdW1wIGJhY2sgdG8gdGhlIGZpcnN0IGxpbmUgaW4gYQorICAgICAgICAjIGZpbGUuICBTZWUgaXNzdWUgIzE2ODk0NTguICBJdCBjYW4gb25seSBiZSB0cmlnZ2VyZWQgaW4gYQorICAgICAgICAjIGZ1bmN0aW9uIGNhbGwgaWYgdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQgb24gYSBzaW5nbGUgbGluZS4KKyAgICAgICAgY29kZSA9IGNvbXBpbGUoIiIiCisjIENvbW1lbnRzIGRvbid0IGNvdW50Lgorb3V0cHV0LmFwcGVuZCgyKSAgIyBmaXJzdGxpbmVubyBpcyBoZXJlLgorb3V0cHV0LmFwcGVuZCgzKQorb3V0cHV0LmFwcGVuZCg0KQorIiIiLCAiPGZha2UgbW9kdWxlPiIsICJleGVjIikKKyAgICAgICAgY2xhc3MgZmFrZV9mdW5jdGlvbjoKKyAgICAgICAgICAgIGZ1bmNfY29kZSA9IGNvZGUKKyAgICAgICAgICAgIGp1bXAgPSAoMiwgMCkKKyAgICAgICAgdHJhY2VyID0gSnVtcFRyYWNlcihmYWtlX2Z1bmN0aW9uKQorICAgICAgICBzeXMuc2V0dHJhY2UodHJhY2VyLnRyYWNlKQorICAgICAgICBuYW1lc3BhY2UgPSB7Im91dHB1dCI6IFtdfQorICAgICAgICBleGVjIGNvZGUgaW4gbmFtZXNwYWNlCisgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorICAgICAgICBzZWxmLmNvbXBhcmVfanVtcF9vdXRwdXQoWzIsIDMsIDIsIDMsIDRdLCBuYW1lc3BhY2VbIm91dHB1dCJdKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBUcmFjZVRlc3RDYXNlLAorICAgICAgICBSYWlzaW5nVHJhY2VGdW5jVGVzdENhc2UsCisgICAgICAgIEp1bXBUZXN0Q2FzZQorICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzX3NldHRyYWNlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c19zZXR0cmFjZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwMjZmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c19zZXR0cmFjZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzX3NldHRyYWNlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c19zZXR0cmFjZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3Mzk2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c19zZXR0cmFjZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzY29uZmlnLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzY29uZmlnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NWYzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNjb25maWcucHkKQEAgLTAsMCArMSwzMjggQEAKKyIiIlRlc3RzIGZvciBzeXNjb25maWcuIiIiCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3VicHJvY2VzcworZnJvbSBjb3B5IGltcG9ydCBjb3B5LCBkZWVwY29weQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIFRFU1RGTiwgdW5saW5rLCBnZXRfYXR0cmlidXRlCisKK2ltcG9ydCBzeXNjb25maWcKK2Zyb20gc3lzY29uZmlnIGltcG9ydCAoZ2V0X3BhdGhzLCBnZXRfcGxhdGZvcm0sIGdldF9jb25maWdfdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3BhdGgsIGdldF9wYXRoX25hbWVzLCBfSU5TVEFMTF9TQ0hFTUVTLAorICAgICAgICAgICAgICAgICAgICAgICBfZ2V0X2RlZmF1bHRfc2NoZW1lLCBfZXhwYW5kX3ZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGdldF9zY2hlbWVfbmFtZXMsIGdldF9jb25maWdfdmFyKQoraW1wb3J0IF9vc3hfc3VwcG9ydAorCitjbGFzcyBUZXN0U3lzQ29uZmlnKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIiIiTWFrZSBhIGNvcHkgb2Ygc3lzLnBhdGgiIiIKKyAgICAgICAgc3VwZXIoVGVzdFN5c0NvbmZpZywgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLnN5c19wYXRoID0gc3lzLnBhdGhbOl0KKyAgICAgICAgc2VsZi5tYWtlZmlsZSA9IE5vbmUKKyAgICAgICAgIyBwYXRjaGluZyBvcy51bmFtZQorICAgICAgICBpZiBoYXNhdHRyKG9zLCAndW5hbWUnKToKKyAgICAgICAgICAgIHNlbGYudW5hbWUgPSBvcy51bmFtZQorICAgICAgICAgICAgc2VsZi5fdW5hbWUgPSBvcy51bmFtZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnVuYW1lID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fdW5hbWUgPSBOb25lCisgICAgICAgIG9zLnVuYW1lID0gc2VsZi5fZ2V0X3VuYW1lCisgICAgICAgICMgc2F2aW5nIHRoZSBlbnZpcm9ubWVudAorICAgICAgICBzZWxmLm5hbWUgPSBvcy5uYW1lCisgICAgICAgIHNlbGYucGxhdGZvcm0gPSBzeXMucGxhdGZvcm0KKyAgICAgICAgc2VsZi52ZXJzaW9uID0gc3lzLnZlcnNpb24KKyAgICAgICAgc2VsZi5zZXAgPSBvcy5zZXAKKyAgICAgICAgc2VsZi5qb2luID0gb3MucGF0aC5qb2luCisgICAgICAgIHNlbGYuaXNhYnMgPSBvcy5wYXRoLmlzYWJzCisgICAgICAgIHNlbGYuc3BsaXRkcml2ZSA9IG9zLnBhdGguc3BsaXRkcml2ZQorICAgICAgICBzZWxmLl9jb25maWdfdmFycyA9IGNvcHkoc3lzY29uZmlnLl9DT05GSUdfVkFSUykKKyAgICAgICAgc2VsZi5vbGRfZW52aXJvbiA9IGRlZXBjb3B5KG9zLmVudmlyb24pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICIiIlJlc3RvcmUgc3lzLnBhdGgiIiIKKyAgICAgICAgc3lzLnBhdGhbOl0gPSBzZWxmLnN5c19wYXRoCisgICAgICAgIGlmIHNlbGYubWFrZWZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5tYWtlZmlsZSkKKyAgICAgICAgc2VsZi5fY2xlYW51cF90ZXN0Zm4oKQorICAgICAgICBpZiBzZWxmLnVuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3MudW5hbWUgPSBzZWxmLnVuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZWwgb3MudW5hbWUKKyAgICAgICAgb3MubmFtZSA9IHNlbGYubmFtZQorICAgICAgICBzeXMucGxhdGZvcm0gPSBzZWxmLnBsYXRmb3JtCisgICAgICAgIHN5cy52ZXJzaW9uID0gc2VsZi52ZXJzaW9uCisgICAgICAgIG9zLnNlcCA9IHNlbGYuc2VwCisgICAgICAgIG9zLnBhdGguam9pbiA9IHNlbGYuam9pbgorICAgICAgICBvcy5wYXRoLmlzYWJzID0gc2VsZi5pc2FicworICAgICAgICBvcy5wYXRoLnNwbGl0ZHJpdmUgPSBzZWxmLnNwbGl0ZHJpdmUKKyAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUyA9IGNvcHkoc2VsZi5fY29uZmlnX3ZhcnMpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYub2xkX2Vudmlyb24uaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG9zLmVudmlyb24uZ2V0KGtleSkgIT0gdmFsdWU6CisgICAgICAgICAgICAgICAgb3MuZW52aXJvbltrZXldID0gdmFsdWUKKworICAgICAgICBmb3Iga2V5IGluIG9zLmVudmlyb24ua2V5cygpOgorICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmLm9sZF9lbnZpcm9uOgorICAgICAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uW2tleV0KKworICAgICAgICBzdXBlcihUZXN0U3lzQ29uZmlnLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgX3NldF91bmFtZShzZWxmLCB1bmFtZSk6CisgICAgICAgIHNlbGYuX3VuYW1lID0gdW5hbWUKKworICAgIGRlZiBfZ2V0X3VuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdW5hbWUKKworICAgIGRlZiBfY2xlYW51cF90ZXN0Zm4oc2VsZik6CisgICAgICAgIHBhdGggPSBURVNURk4KKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CisgICAgICAgICAgICBvcy5yZW1vdmUocGF0aCkKKyAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShwYXRoKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhdGhfbmFtZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X3BhdGhfbmFtZXMoKSwgc3lzY29uZmlnLl9TQ0hFTUVfS0VZUykKKworICAgIGRlZiB0ZXN0X2dldF9wYXRocyhzZWxmKToKKyAgICAgICAgc2NoZW1lID0gZ2V0X3BhdGhzKCkKKyAgICAgICAgZGVmYXVsdF9zY2hlbWUgPSBfZ2V0X2RlZmF1bHRfc2NoZW1lKCkKKyAgICAgICAgd2FudGVkID0gX2V4cGFuZF92YXJzKGRlZmF1bHRfc2NoZW1lLCBOb25lKQorICAgICAgICB3YW50ZWQgPSB3YW50ZWQuaXRlbXMoKQorICAgICAgICB3YW50ZWQuc29ydCgpCisgICAgICAgIHNjaGVtZSA9IHNjaGVtZS5pdGVtcygpCisgICAgICAgIHNjaGVtZS5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzY2hlbWUsIHdhbnRlZCkKKworICAgIGRlZiB0ZXN0X2dldF9wYXRoKHNlbGYpOgorICAgICAgICAjIHh4eCBtYWtlIHJlYWwgdGVzdHMgaGVyZQorICAgICAgICBmb3Igc2NoZW1lIGluIF9JTlNUQUxMX1NDSEVNRVM6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBfSU5TVEFMTF9TQ0hFTUVTW3NjaGVtZV06CisgICAgICAgICAgICAgICAgcmVzID0gZ2V0X3BhdGgobmFtZSwgc2NoZW1lKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbmZpZ192YXJzKHNlbGYpOgorICAgICAgICBjdmFycyA9IGdldF9jb25maWdfdmFycygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShjdmFycywgZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGN2YXJzKQorCisgICAgZGVmIHRlc3RfZ2V0X3BsYXRmb3JtKHNlbGYpOgorICAgICAgICAjIHdpbmRvd3MgWFAsIDMyYml0cworICAgICAgICBvcy5uYW1lID0gJ250JworICAgICAgICBzeXMudmVyc2lvbiA9ICgnMi40LjQgKCM3MSwgT2N0IDE4IDIwMDYsIDA4OjM0OjQzKSAnCisgICAgICAgICAgICAgICAgICAgICAgICdbTVNDIHYuMTMxMCAzMiBiaXQgKEludGVsKV0nKQorICAgICAgICBzeXMucGxhdGZvcm0gPSAnd2luMzInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X3BsYXRmb3JtKCksICd3aW4zMicpCisKKyAgICAgICAgIyB3aW5kb3dzIFhQLCBhbWQ2NAorICAgICAgICBvcy5uYW1lID0gJ250JworICAgICAgICBzeXMudmVyc2lvbiA9ICgnMi40LjQgKCM3MSwgT2N0IDE4IDIwMDYsIDA4OjM0OjQzKSAnCisgICAgICAgICAgICAgICAgICAgICAgICdbTVNDIHYuMTMxMCAzMiBiaXQgKEFtZDY0KV0nKQorICAgICAgICBzeXMucGxhdGZvcm0gPSAnd2luMzInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X3BsYXRmb3JtKCksICd3aW4tYW1kNjQnKQorCisgICAgICAgICMgd2luZG93cyBYUCwgaXRhbml1bQorICAgICAgICBvcy5uYW1lID0gJ250JworICAgICAgICBzeXMudmVyc2lvbiA9ICgnMi40LjQgKCM3MSwgT2N0IDE4IDIwMDYsIDA4OjM0OjQzKSAnCisgICAgICAgICAgICAgICAgICAgICAgICdbTVNDIHYuMTMxMCAzMiBiaXQgKEl0YW5pdW0pXScpCisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICd3aW4zMicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ3dpbi1pYTY0JykKKworICAgICAgICAjIG1hY2Jvb2sKKyAgICAgICAgb3MubmFtZSA9ICdwb3NpeCcKKyAgICAgICAgc3lzLnZlcnNpb24gPSAoJzIuNSAocjI1OjUxOTE4LCBTZXAgMTkgMjAwNiwgMDg6NDk6MTMpICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ1xuW0dDQyA0LjAuMSAoQXBwbGUgQ29tcHV0ZXIsIEluYy4gYnVpbGQgNTM0MSldJykKKyAgICAgICAgc3lzLnBsYXRmb3JtID0gJ2RhcndpbicKKyAgICAgICAgc2VsZi5fc2V0X3VuYW1lKCgnRGFyd2luJywgJ21hY3ppYWRlJywgJzguMTEuMScsCisgICAgICAgICAgICAgICAgICAgKCdEYXJ3aW4gS2VybmVsIFZlcnNpb24gOC4xMS4xOiAnCisgICAgICAgICAgICAgICAgICAgICdXZWQgT2N0IDEwIDE4OjIzOjI4IFBEVCAyMDA3OyAnCisgICAgICAgICAgICAgICAgICAgICdyb290OnhudS03OTIuMjUuMjB+MS9SRUxFQVNFX0kzODYnKSwgJ1Bvd2VyUEMnKSkKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQorICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJ10gPSAnMTAuMycKKworICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnQ0ZMQUdTJ10gPSAoJy1mbm8tc3RyaWN0LWFsaWFzaW5nIC1ETkRFQlVHIC1nICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZndyYXB2IC1PMyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzJykKKworICAgICAgICBtYXhpbnQgPSBzeXMubWF4aW50CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5tYXhpbnQgPSAyMTQ3NDgzNjQ3CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9wbGF0Zm9ybSgpLCAnbWFjb3N4LTEwLjMtcHBjJykKKyAgICAgICAgICAgIHN5cy5tYXhpbnQgPSA5MjIzMzcyMDM2ODU0Nzc1ODA3CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9wbGF0Zm9ybSgpLCAnbWFjb3N4LTEwLjMtcHBjNjQnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLm1heGludCA9IG1heGludAorCisKKyAgICAgICAgc2VsZi5fc2V0X3VuYW1lKCgnRGFyd2luJywgJ21hY3ppYWRlJywgJzguMTEuMScsCisgICAgICAgICAgICAgICAgICAgKCdEYXJ3aW4gS2VybmVsIFZlcnNpb24gOC4xMS4xOiAnCisgICAgICAgICAgICAgICAgICAgICdXZWQgT2N0IDEwIDE4OjIzOjI4IFBEVCAyMDA3OyAnCisgICAgICAgICAgICAgICAgICAgICdyb290OnhudS03OTIuMjUuMjB+MS9SRUxFQVNFX0kzODYnKSwgJ2kzODYnKSkKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQorICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJ10gPSAnMTAuMycKKworICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnQ0ZMQUdTJ10gPSAoJy1mbm8tc3RyaWN0LWFsaWFzaW5nIC1ETkRFQlVHIC1nICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZndyYXB2IC1PMyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzJykKKworICAgICAgICBtYXhpbnQgPSBzeXMubWF4aW50CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5tYXhpbnQgPSAyMTQ3NDgzNjQ3CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9wbGF0Zm9ybSgpLCAnbWFjb3N4LTEwLjMtaTM4NicpCisgICAgICAgICAgICBzeXMubWF4aW50ID0gOTIyMzM3MjAzNjg1NDc3NTgwNworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC4zLXg4Nl82NCcpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMubWF4aW50ID0gbWF4aW50CisKKyAgICAgICAgIyBtYWNib29rIHdpdGggZmF0IGJpbmFyaWVzIChmYXQsIHVuaXZlcnNhbCBvciBmYXQ2NCkKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQorICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJ10gPSAnMTAuNCcKKyAgICAgICAgZ2V0X2NvbmZpZ192YXJzKClbJ0NGTEFHUyddID0gKCctYXJjaCBwcGMgLWFyY2ggaTM4NiAtaXN5c3Jvb3QgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWR5bmFtaWMgLUROREVCVUcgLWcgLU8zJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9wbGF0Zm9ybSgpLCAnbWFjb3N4LTEwLjQtZmF0JykKKworICAgICAgICBfb3N4X3N1cHBvcnQuX3JlbW92ZV9vcmlnaW5hbF92YWx1ZXMoZ2V0X2NvbmZpZ192YXJzKCkpCisgICAgICAgIGdldF9jb25maWdfdmFycygpWydDRkxBR1MnXSA9ICgnLWFyY2ggeDg2XzY0IC1hcmNoIGkzODYgLWlzeXNyb290ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrICAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1keW5hbWljIC1ETkRFQlVHIC1nIC1PMycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC40LWludGVsJykKKworICAgICAgICBfb3N4X3N1cHBvcnQuX3JlbW92ZV9vcmlnaW5hbF92YWx1ZXMoZ2V0X2NvbmZpZ192YXJzKCkpCisgICAgICAgIGdldF9jb25maWdfdmFycygpWydDRkxBR1MnXSA9ICgnLWFyY2ggeDg2XzY0IC1hcmNoIHBwYyAtYXJjaCBpMzg2IC1pc3lzcm9vdCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayAgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZHluYW1pYyAtRE5ERUJVRyAtZyAtTzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9wbGF0Zm9ybSgpLCAnbWFjb3N4LTEwLjQtZmF0MycpCisKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQorICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnQ0ZMQUdTJ10gPSAoJy1hcmNoIHBwYzY0IC1hcmNoIHg4Nl82NCAtYXJjaCBwcGMgLWFyY2ggaTM4NiAtaXN5c3Jvb3QgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWR5bmFtaWMgLUROREVCVUcgLWcgLU8zJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC40LXVuaXZlcnNhbCcpCisKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQorICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnQ0ZMQUdTJ10gPSAoJy1hcmNoIHg4Nl82NCAtYXJjaCBwcGM2NCAtaXN5c3Jvb3QgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWR5bmFtaWMgLUROREVCVUcgLWcgLU8zJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9wbGF0Zm9ybSgpLCAnbWFjb3N4LTEwLjQtZmF0NjQnKQorCisgICAgICAgIGZvciBhcmNoIGluICgncHBjJywgJ2kzODYnLCAneDg2XzY0JywgJ3BwYzY0Jyk6CisgICAgICAgICAgICBfb3N4X3N1cHBvcnQuX3JlbW92ZV9vcmlnaW5hbF92YWx1ZXMoZ2V0X2NvbmZpZ192YXJzKCkpCisgICAgICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnQ0ZMQUdTJ10gPSAoJy1hcmNoICVzIC1pc3lzcm9vdCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZHluYW1pYyAtRE5ERUJVRyAtZyAtTzMnJShhcmNoLCkpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X3BsYXRmb3JtKCksICdtYWNvc3gtMTAuNC0lcyclKGFyY2gsKSkKKworICAgICAgICAjIGxpbnV4IGRlYmlhbiBzYXJnZQorICAgICAgICBvcy5uYW1lID0gJ3Bvc2l4JworICAgICAgICBzeXMudmVyc2lvbiA9ICgnMi4zLjUgKCMxLCBKdWwgIDQgMjAwNywgMTc6Mjg6NTkpICcKKyAgICAgICAgICAgICAgICAgICAgICAgJ1xuW0dDQyA0LjEuMiAyMDA2MTExNSAocHJlcmVsZWFzZSkgKERlYmlhbiA0LjEuMS0yMSldJykKKyAgICAgICAgc3lzLnBsYXRmb3JtID0gJ2xpbnV4MicKKyAgICAgICAgc2VsZi5fc2V0X3VuYW1lKCgnTGludXgnLCAnYWdsYWUnLCAnMi42LjIxLjFkZWRpYm94LXI3JywKKyAgICAgICAgICAgICAgICAgICAgJyMxIE1vbiBBcHIgMzAgMTc6MjU6MzggQ0VTVCAyMDA3JywgJ2k2ODYnKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9wbGF0Zm9ybSgpLCAnbGludXgtaTY4NicpCisKKyAgICAgICAgIyBYWFggbW9yZSBwbGF0Zm9ybXMgdG8gdGVzdHMgaGVyZQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBjb25maWdfaCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX2hfZmlsZW5hbWUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoY29uZmlnX2gpLCBjb25maWdfaCkKKworICAgIGRlZiB0ZXN0X2dldF9zY2hlbWVfbmFtZXMoc2VsZik6CisgICAgICAgIHdhbnRlZCA9ICgnbnQnLCAnbnRfdXNlcicsICdvczInLCAnb3MyX2hvbWUnLCAnb3N4X2ZyYW1ld29ya191c2VyJywKKyAgICAgICAgICAgICAgICAgICdwb3NpeF9ob21lJywgJ3Bvc2l4X3ByZWZpeCcsICdwb3NpeF91c2VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfc2NoZW1lX25hbWVzKCksIHdhbnRlZCkKKworICAgIGRlZiB0ZXN0X3N5bWxpbmsoc2VsZik6CisgICAgICAgICMgSXNzdWUgNzg4MAorICAgICAgICBzeW1saW5rID0gZ2V0X2F0dHJpYnV0ZShvcywgInN5bWxpbmsiKQorICAgICAgICBkZWYgZ2V0KHB5dGhvbik6CisgICAgICAgICAgICBjbWQgPSBbcHl0aG9uLCAnLWMnLAorICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzY29uZmlnOyBwcmludCBzeXNjb25maWcuZ2V0X3BsYXRmb3JtKCknXQorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAgICAgcmV0dXJuIHAuY29tbXVuaWNhdGUoKQorICAgICAgICByZWFsID0gb3MucGF0aC5yZWFscGF0aChzeXMuZXhlY3V0YWJsZSkKKyAgICAgICAgbGluayA9IG9zLnBhdGguYWJzcGF0aChURVNURk4pCisgICAgICAgIHN5bWxpbmsocmVhbCwgbGluaykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXQocmVhbCksIGdldChsaW5rKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHVubGluayhsaW5rKQorCisgICAgZGVmIHRlc3RfdXNlcl9zaW1pbGFyKHNlbGYpOgorICAgICAgICAjIElzc3VlICM4NzU5OiBtYWtlIHN1cmUgdGhlIHBvc2l4IHNjaGVtZSBmb3IgdGhlIHVzZXJzCisgICAgICAgICMgaXMgc2ltaWxhciB0byB0aGUgZ2xvYmFsIHBvc2l4X3ByZWZpeCBvbmUKKyAgICAgICAgYmFzZSA9IGdldF9jb25maWdfdmFyKCdiYXNlJykKKyAgICAgICAgdXNlciA9IGdldF9jb25maWdfdmFyKCd1c2VyYmFzZScpCisgICAgICAgICMgdGhlIGdsb2JhbCBzY2hlbWUgbWlycm9ycyB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBwcmVmaXggYW5kCisgICAgICAgICMgZXhlYy1wcmVmaXggYnV0IG5vdCB0aGUgdXNlciBzY2hlbWUsIHNvIHdlIGhhdmUgdG8gYWRhcHQgdGhlIHBhdGhzCisgICAgICAgICMgYmVmb3JlIGNvbXBhcmluZyAoaXNzdWUgIzkxMDApCisgICAgICAgIGFkYXB0ID0gc3lzLnByZWZpeCAhPSBzeXMuZXhlY19wcmVmaXgKKyAgICAgICAgZm9yIG5hbWUgaW4gKCdzdGRsaWInLCAncGxhdHN0ZGxpYicsICdwdXJlbGliJywgJ3BsYXRsaWInKToKKyAgICAgICAgICAgIGdsb2JhbF9wYXRoID0gZ2V0X3BhdGgobmFtZSwgJ3Bvc2l4X3ByZWZpeCcpCisgICAgICAgICAgICBpZiBhZGFwdDoKKyAgICAgICAgICAgICAgICBnbG9iYWxfcGF0aCA9IGdsb2JhbF9wYXRoLnJlcGxhY2Uoc3lzLmV4ZWNfcHJlZml4LCBzeXMucHJlZml4KQorICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlLnJlcGxhY2Uoc3lzLmV4ZWNfcHJlZml4LCBzeXMucHJlZml4KQorICAgICAgICAgICAgdXNlcl9wYXRoID0gZ2V0X3BhdGgobmFtZSwgJ3Bvc2l4X3VzZXInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1c2VyX3BhdGgsIGdsb2JhbF9wYXRoLnJlcGxhY2UoYmFzZSwgdXNlciwgMSkpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gImRhcndpbiIsICJ0ZXN0IG9ubHkgcmVsZXZhbnQgb24gTWFjT1NYIikKKyAgICBkZWYgdGVzdF9wbGF0Zm9ybV9pbl9zdWJwcm9jZXNzKHNlbGYpOgorICAgICAgICBteV9wbGF0Zm9ybSA9IHN5c2NvbmZpZy5nZXRfcGxhdGZvcm0oKQorCisgICAgICAgICMgVGVzdCB3aXRob3V0IE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBpbiB0aGUgZW52aXJvbm1lbnQKKworICAgICAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBpZiAnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJyBpbiBlbnY6CisgICAgICAgICAgICBkZWwgZW52WydNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnXQorCisgICAgICAgIHdpdGggb3BlbignL2Rldi9udWxsJywgJ3cnKSBhcyBkZXZudWxsX2ZwOgorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWworICAgICAgICAgICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSwgJy1jJywKKyAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5c2NvbmZpZzsgcHJpbnQoc3lzY29uZmlnLmdldF9wbGF0Zm9ybSgpKScsCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgIHN0ZGVycj1kZXZudWxsX2ZwLAorICAgICAgICAgICAgICAgIGVudj1lbnYpCisgICAgICAgIHRlc3RfcGxhdGZvcm0gPSBwLmNvbW11bmljYXRlKClbMF0uc3RyaXAoKQorICAgICAgICB0ZXN0X3BsYXRmb3JtID0gdGVzdF9wbGF0Zm9ybS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgc3RhdHVzID0gcC53YWl0KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXR1cywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChteV9wbGF0Zm9ybSwgdGVzdF9wbGF0Zm9ybSkKKworCisgICAgICAgICMgVGVzdCB3aXRoIE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCBpbiB0aGUgZW52aXJvbm1lbnQsIGFuZAorICAgICAgICAjIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB1bmxpa2VseSB0byBiZSB0aGUgZGVmYXVsdCBvbmUuCisgICAgICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIGVudlsnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJ10gPSAnMTAuMScKKworICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbCisgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsICctYycsCisgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXNjb25maWc7IHByaW50KHN5c2NvbmZpZy5nZXRfcGxhdGZvcm0oKSknLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICBzdGRlcnI9b3BlbignL2Rldi9udWxsJyksCisgICAgICAgICAgICBlbnY9ZW52KQorICAgICAgICB0ZXN0X3BsYXRmb3JtID0gcC5jb21tdW5pY2F0ZSgpWzBdLnN0cmlwKCkKKyAgICAgICAgdGVzdF9wbGF0Zm9ybSA9IHRlc3RfcGxhdGZvcm0uZGVjb2RlKCd1dGYtOCcpCisgICAgICAgIHN0YXR1cyA9IHAud2FpdCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0dXMsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXlfcGxhdGZvcm0sIHRlc3RfcGxhdGZvcm0pCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdFN5c0NvbmZpZykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzY29uZmlnLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c2NvbmZpZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlNzFhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c2NvbmZpZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzY29uZmlnLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c2NvbmZpZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlNzFhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c2NvbmZpZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGFyZmlsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RhcmZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkMzQyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RhcmZpbGUucHkKQEAgLTAsMCArMSwxNjY3IEBACisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTE1IC0qLQorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBTdHJpbmdJTworZnJvbSBoYXNobGliIGltcG9ydCBtZDUKK2ltcG9ydCBlcnJubworCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0YXJmaWxlCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgQ2hlY2sgZm9yIG91ciBjb21wcmVzc2lvbiBtb2R1bGVzLgordHJ5OgorICAgIGltcG9ydCBnemlwCisgICAgZ3ppcC5HemlwRmlsZQorZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgIGd6aXAgPSBOb25lCit0cnk6CisgICAgaW1wb3J0IGJ6MgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGJ6MiA9IE5vbmUKKworZGVmIG1kNXN1bShkYXRhKToKKyAgICByZXR1cm4gbWQ1KGRhdGEpLmhleGRpZ2VzdCgpCisKK1RFTVBESVIgPSBvcy5wYXRoLmFic3BhdGgodGVzdF9zdXBwb3J0LlRFU1RGTikKK3Rhcm5hbWUgPSB0ZXN0X3N1cHBvcnQuZmluZGZpbGUoInRlc3R0YXIudGFyIikKK2d6aXBuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0dGFyLnRhci5neiIpCitiejJuYW1lID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0dGFyLnRhci5iejIiKQordG1wbmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidG1wLnRhciIpCisKK21kNV9yZWd0eXBlID0gIjY1ZjQ3N2M4MThhZDllMTVmN2ZlYWIwYzZkMzc3NDJmIgorbWQ1X3NwYXJzZSA9ICJhNTRmYmM0Y2E0ZjQzOTlhOTBlMWIyNzE2NDAxMmZjNiIKKworCitjbGFzcyBSZWFkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICB0YXJuYW1lID0gdGFybmFtZQorICAgIG1vZGUgPSAicjoiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgbW9kZT1zZWxmLm1vZGUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRhci5jbG9zZSgpCisKKworY2xhc3MgVXN0YXJSZWFkVGVzdChSZWFkVGVzdCk6CisKKyAgICBkZWYgdGVzdF9maWxlb2JqX3JlZ3VsYXJfZmlsZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCisgICAgICAgIGZvYmogPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQorICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChsZW4oZGF0YSksIG1kNXN1bShkYXRhKSkgPT0gKHRhcmluZm8uc2l6ZSwgbWQ1X3JlZ3R5cGUpLAorICAgICAgICAgICAgICAgICJyZWd1bGFyIGZpbGUgZXh0cmFjdGlvbiBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfZmlsZW9ial9yZWFkbGluZXMoc2VsZik6CisgICAgICAgIHNlbGYudGFyLmV4dHJhY3QoInVzdGFyL3JlZ3R5cGUiLCBURU1QRElSKQorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKKyAgICAgICAgZm9iajEgPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvcmVndHlwZSIpLCAiclUiKQorICAgICAgICBmb2JqMiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pCisKKyAgICAgICAgbGluZXMxID0gZm9iajEucmVhZGxpbmVzKCkKKyAgICAgICAgbGluZXMyID0gZm9iajIucmVhZGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzMSA9PSBsaW5lczIsCisgICAgICAgICAgICAgICAgImZpbGVvYmoucmVhZGxpbmVzKCkgZmFpbGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihsaW5lczIpID09IDExNCwKKyAgICAgICAgICAgICAgICAiZmlsZW9iai5yZWFkbGluZXMoKSBmYWlsZWQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGluZXMyWzgzXSA9PQorICAgICAgICAgICAgICAgICJJIHdpbGwgZ2xhZGx5IGFkbWl0IHRoYXQgUHl0aG9uIGlzIG5vdCB0aGUgZmFzdGVzdCBydW5uaW5nIHNjcmlwdGluZyBsYW5ndWFnZS5cbiIsCisgICAgICAgICAgICAgICAgImZpbGVvYmoucmVhZGxpbmVzKCkgZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X2ZpbGVvYmpfaXRlcihzZWxmKToKKyAgICAgICAgc2VsZi50YXIuZXh0cmFjdCgidXN0YXIvcmVndHlwZSIsIFRFTVBESVIpCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3JlZ3R5cGUiKQorICAgICAgICBmb2JqMSA9IG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9yZWd0eXBlIiksICJyVSIpCisgICAgICAgIGZvYmoyID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKKyAgICAgICAgbGluZXMxID0gZm9iajEucmVhZGxpbmVzKCkKKyAgICAgICAgbGluZXMyID0gW2xpbmUgZm9yIGxpbmUgaW4gZm9iajJdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5lczEgPT0gbGluZXMyLAorICAgICAgICAgICAgICAgICAgICAgImZpbGVvYmouX19pdGVyX18oKSBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfZmlsZW9ial9zZWVrKHNlbGYpOgorICAgICAgICBzZWxmLnRhci5leHRyYWN0KCJ1c3Rhci9yZWd0eXBlIiwgVEVNUERJUikKKyAgICAgICAgZm9iaiA9IG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9yZWd0eXBlIiksICJyYiIpCisgICAgICAgIGRhdGEgPSBmb2JqLnJlYWQoKQorICAgICAgICBmb2JqLmNsb3NlKCkKKworICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKKyAgICAgICAgZm9iaiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pCisKKyAgICAgICAgdGV4dCA9IGZvYmoucmVhZCgpCisgICAgICAgIGZvYmouc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gZmlsZSdzIHN0YXJ0IGZhaWxlZCIpCisgICAgICAgIGZvYmouc2VlaygyMDQ4LCAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMjA0OCA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gYWJzb2x1dGUgcG9zaXRpb24gZmFpbGVkIikKKyAgICAgICAgZm9iai5zZWVrKC0xMDI0LCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMTAyNCA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gbmVnYXRpdmUgcmVsYXRpdmUgcG9zaXRpb24gZmFpbGVkIikKKyAgICAgICAgZm9iai5zZWVrKDEwMjQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyMDQ4ID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBwb3NpdGl2ZSByZWxhdGl2ZSBwb3NpdGlvbiBmYWlsZWQiKQorICAgICAgICBzID0gZm9iai5yZWFkKDEwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocyA9PSBkYXRhWzIwNDg6MjA1OF0sCisgICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGFmdGVyIHNlZWsgZmFpbGVkIikKKyAgICAgICAgZm9iai5zZWVrKDAsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnNpemUgPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGZpbGUncyBlbmQgZmFpbGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmoucmVhZCgpID09ICIiLAorICAgICAgICAgICAgICAgICAgICAgInJlYWQoKSBhdCBmaWxlJ3MgZW5kIGRpZCBub3QgcmV0dXJuIGVtcHR5IHN0cmluZyIpCisgICAgICAgIGZvYmouc2VlaygtdGFyaW5mby5zaXplLCAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJyZWxhdGl2ZSBzZWVrKCkgdG8gZmlsZSdzIHN0YXJ0IGZhaWxlZCIpCisgICAgICAgIGZvYmouc2Vlayg1MTIpCisgICAgICAgIHMxID0gZm9iai5yZWFkbGluZXMoKQorICAgICAgICBmb2JqLnNlZWsoNTEyKQorICAgICAgICBzMiA9IGZvYmoucmVhZGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMxID09IHMyLAorICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lcygpIGFmdGVyIHNlZWsgZmFpbGVkIikKKyAgICAgICAgZm9iai5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZm9iai5yZWFkbGluZSgpKSA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJ0ZWxsKCkgYWZ0ZXIgcmVhZGxpbmUoKSBmYWlsZWQiKQorICAgICAgICBmb2JqLnNlZWsoNTEyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGZvYmoucmVhZGxpbmUoKSkgKyA1MTIgPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAidGVsbCgpIGFmdGVyIHNlZWsoKSBhbmQgcmVhZGxpbmUoKSBmYWlsZWQiKQorICAgICAgICBmb2JqLnNlZWsoMCkKKyAgICAgICAgbGluZSA9IGZvYmoucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9iai5yZWFkKCkgPT0gZGF0YVtsZW4obGluZSk6XSwKKyAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYWZ0ZXIgcmVhZGxpbmUoKSBmYWlsZWQiKQorICAgICAgICBmb2JqLmNsb3NlKCkKKworICAgICMgVGVzdCBpZiBzeW1ib2xpYyBhbmQgaGFyZCBsaW5rcyBhcmUgcmVzb2x2ZWQgYnkgZXh0cmFjdGZpbGUoKS4gIFRoZQorICAgICMgdGVzdCBsaW5rIG1lbWJlcnMgZWFjaCBwb2ludCB0byBhIHJlZ3VsYXIgbWVtYmVyIHdob3NlIGRhdGEgaXMKKyAgICAjIHN1cHBvc2VkIHRvIGJlIGV4cG9ydGVkLgorICAgIGRlZiBfdGVzdF9maWxlb2JqX2xpbmsoc2VsZiwgbG5rdHlwZSwgcmVndHlwZSk6CisgICAgICAgIGEgPSBzZWxmLnRhci5leHRyYWN0ZmlsZShsbmt0eXBlKQorICAgICAgICBiID0gc2VsZi50YXIuZXh0cmFjdGZpbGUocmVndHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm5hbWUsIGIubmFtZSkKKworICAgIGRlZiB0ZXN0X2ZpbGVvYmpfbGluazEoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZmlsZW9ial9saW5rKCJ1c3Rhci9sbmt0eXBlIiwgInVzdGFyL3JlZ3R5cGUiKQorCisgICAgZGVmIHRlc3RfZmlsZW9ial9saW5rMihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9maWxlb2JqX2xpbmsoIi4vdXN0YXIvbGlua3Rlc3QyL2xua3R5cGUiLCAidXN0YXIvbGlua3Rlc3QxL3JlZ3R5cGUiKQorCisgICAgZGVmIHRlc3RfZmlsZW9ial9zeW1saW5rMShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9maWxlb2JqX2xpbmsoInVzdGFyL3N5bXR5cGUiLCAidXN0YXIvcmVndHlwZSIpCisKKyAgICBkZWYgdGVzdF9maWxlb2JqX3N5bWxpbmsyKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2ZpbGVvYmpfbGluaygiLi91c3Rhci9saW5rdGVzdDIvc3ltdHlwZSIsICJ1c3Rhci9saW5rdGVzdDEvcmVndHlwZSIpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTE0MTYwKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2ZpbGVvYmpfbGluaygic3ltdHlwZTIiLCAidXN0YXIvcmVndHlwZSIpCisKKworY2xhc3MgQ29tbW9uUmVhZFRlc3QoUmVhZFRlc3QpOgorCisgICAgZGVmIHRlc3RfZW1wdHlfdGFyZmlsZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBpc3N1ZTYxMjM6IEFsbG93IG9wZW5pbmcgZW1wdHkgYXJjaGl2ZXMuCisgICAgICAgICMgVGhpcyB0ZXN0IGNoZWNrcyBpZiB0YXJmaWxlLm9wZW4oKSBpcyBhYmxlIHRvIG9wZW4gYW4gZW1wdHkgdGFyCisgICAgICAgICMgYXJjaGl2ZSBzdWNjZXNzZnVsbHkuIE5vdGUgdGhhdCBhbiBlbXB0eSB0YXIgYXJjaGl2ZSBpcyBub3QgdGhlCisgICAgICAgICMgc2FtZSBhcyBhbiBlbXB0eSBmaWxlIQorICAgICAgICB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlLnJlcGxhY2UoInIiLCAidyIpKS5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgICAgICB0YXIuZ2V0bmFtZXMoKQorICAgICAgICBleGNlcHQgdGFyZmlsZS5SZWFkRXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoInRhcmZpbGUub3BlbigpIGZhaWxlZCBvbiBlbXB0eSBhcmNoaXZlIikKKyAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwodGFyLmdldG1lbWJlcnMoKSwgW10pCisKKyAgICBkZWYgdGVzdF9udWxsX3RhcmZpbGUoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgaXNzdWU2MTIzOiBBbGxvdyBvcGVuaW5nIGVtcHR5IGFyY2hpdmVzLgorICAgICAgICAjIFRoaXMgdGVzdCBndWFyYW50ZWVzIHRoYXQgdGFyZmlsZS5vcGVuKCkgZG9lcyBub3QgdHJlYXQgYW4gZW1wdHkKKyAgICAgICAgIyBmaWxlIGFzIGFuIGVtcHR5IHRhciBhcmNoaXZlLgorICAgICAgICBvcGVuKHRtcG5hbWUsICJ3YiIpLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdG1wbmFtZSwgc2VsZi5tb2RlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lKQorCisgICAgZGVmIHRlc3RfaWdub3JlX3plcm9zKHNlbGYpOgorICAgICAgICAjIFRlc3QgVGFyRmlsZSdzIGlnbm9yZV96ZXJvcyBvcHRpb24uCisgICAgICAgIGlmIHNlbGYubW9kZS5lbmRzd2l0aCgiOmd6Iik6CisgICAgICAgICAgICBfb3BlbiA9IGd6aXAuR3ppcEZpbGUKKyAgICAgICAgZWxpZiBzZWxmLm1vZGUuZW5kc3dpdGgoIjpiejIiKToKKyAgICAgICAgICAgIF9vcGVuID0gYnoyLkJaMkZpbGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIF9vcGVuID0gb3BlbgorCisgICAgICAgIGZvciBjaGFyIGluICgnXDAnLCAnYScpOgorICAgICAgICAgICAgIyBUZXN0IGlmIEVPRkhlYWRlckVycm9yICgnXDAnKSBhbmQgSW52YWxpZEhlYWRlckVycm9yICgnYScpCisgICAgICAgICAgICAjIGFyZSBpZ25vcmVkIGNvcnJlY3RseS4KKyAgICAgICAgICAgIGZvYmogPSBfb3Blbih0bXBuYW1lLCAid2IiKQorICAgICAgICAgICAgZm9iai53cml0ZShjaGFyICogMTAyNCkKKyAgICAgICAgICAgIGZvYmoud3JpdGUodGFyZmlsZS5UYXJJbmZvKCJmb28iKS50b2J1ZigpKQorICAgICAgICAgICAgZm9iai5jbG9zZSgpCisKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBtb2RlPSJyIiwgaWdub3JlX3plcm9zPVRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbCh0YXIuZ2V0bmFtZXMoKSwgWyJmb28iXSwKKyAgICAgICAgICAgICAgICAgICAgImlnbm9yZV96ZXJvcz1UcnVlIHNob3VsZCBoYXZlIHNraXBwZWQgdGhlICVyLWJsb2NrcyIgJSBjaGFyKQorICAgICAgICAgICAgdGFyLmNsb3NlKCkKKworCitjbGFzcyBNaXNjUmVhZFRlc3QoQ29tbW9uUmVhZFRlc3QpOgorCisgICAgZGVmIHRlc3Rfbm9fbmFtZV9hcmd1bWVudChzZWxmKToKKyAgICAgICAgZm9iaiA9IG9wZW4oc2VsZi50YXJuYW1lLCAicmIiKQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oZmlsZW9iaj1mb2JqLCBtb2RlPXNlbGYubW9kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIubmFtZSwgb3MucGF0aC5hYnNwYXRoKGZvYmoubmFtZSkpCisKKyAgICBkZWYgdGVzdF9ub19uYW1lX2F0dHJpYnV0ZShzZWxmKToKKyAgICAgICAgZGF0YSA9IG9wZW4oc2VsZi50YXJuYW1lLCAicmIiKS5yZWFkKCkKKyAgICAgICAgZm9iaiA9IFN0cmluZ0lPLlN0cmluZ0lPKGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBnZXRhdHRyLCBmb2JqLCAibmFtZSIpCisgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihmaWxlb2JqPWZvYmosIG1vZGU9c2VsZi5tb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5uYW1lLCBOb25lKQorCisgICAgZGVmIHRlc3RfZW1wdHlfbmFtZV9hdHRyaWJ1dGUoc2VsZik6CisgICAgICAgIGRhdGEgPSBvcGVuKHNlbGYudGFybmFtZSwgInJiIikucmVhZCgpCisgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQorICAgICAgICBmb2JqLm5hbWUgPSAiIgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oZmlsZW9iaj1mb2JqLCBtb2RlPXNlbGYubW9kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIubmFtZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2ZpbGVvYmpfd2l0aF9vZmZzZXQoc2VsZik6CisgICAgICAgICMgU2tpcCB0aGUgZmlyc3QgbWVtYmVyIGFuZCBzdG9yZSB2YWx1ZXMgZnJvbSB0aGUgc2Vjb25kIG1lbWJlcgorICAgICAgICAjIG9mIHRoZSB0ZXN0dGFyLgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCBtb2RlPXNlbGYubW9kZSkKKyAgICAgICAgdGFyLm5leHQoKQorICAgICAgICB0ID0gdGFyLm5leHQoKQorICAgICAgICBuYW1lID0gdC5uYW1lCisgICAgICAgIG9mZnNldCA9IHQub2Zmc2V0CisgICAgICAgIGRhdGEgPSB0YXIuZXh0cmFjdGZpbGUodCkucmVhZCgpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgIyBPcGVuIHRoZSB0ZXN0dGFyIGFuZCBzZWVrIHRvIHRoZSBvZmZzZXQgb2YgdGhlIHNlY29uZCBtZW1iZXIuCisgICAgICAgIGlmIHNlbGYubW9kZS5lbmRzd2l0aCgiOmd6Iik6CisgICAgICAgICAgICBfb3BlbiA9IGd6aXAuR3ppcEZpbGUKKyAgICAgICAgZWxpZiBzZWxmLm1vZGUuZW5kc3dpdGgoIjpiejIiKToKKyAgICAgICAgICAgIF9vcGVuID0gYnoyLkJaMkZpbGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIF9vcGVuID0gb3BlbgorICAgICAgICBmb2JqID0gX29wZW4oc2VsZi50YXJuYW1lLCAicmIiKQorICAgICAgICBmb2JqLnNlZWsob2Zmc2V0KQorCisgICAgICAgICMgVGVzdCBpZiB0aGUgdGFyZmlsZSBzdGFydHMgd2l0aCB0aGUgc2Vjb25kIG1lbWJlci4KKyAgICAgICAgdGFyID0gdGFyLm9wZW4oc2VsZi50YXJuYW1lLCBtb2RlPSJyOiIsIGZpbGVvYmo9Zm9iaikKKyAgICAgICAgdCA9IHRhci5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm5hbWUsIG5hbWUpCisgICAgICAgICMgUmVhZCB0byB0aGUgZW5kIG9mIGZpbGVvYmogYW5kIHRlc3QgaWYgc2Vla2luZyBiYWNrIHRvIHRoZQorICAgICAgICAjIGJlZ2lubmluZyB3b3Jrcy4KKyAgICAgICAgdGFyLmdldG1lbWJlcnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5leHRyYWN0ZmlsZSh0KS5yZWFkKCksIGRhdGEsCisgICAgICAgICAgICAgICAgInNlZWsgYmFjayBkaWQgbm90IHdvcmsiKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZmFpbF9jb21wKHNlbGYpOgorICAgICAgICAjIEZvciBHemlwIGFuZCBCejIgVGVzdHM6IGZhaWwgd2l0aCBhIFJlYWRFcnJvciBvbiBhbiB1bmNvbXByZXNzZWQgZmlsZS4KKyAgICAgICAgaWYgc2VsZi5tb2RlID09ICJyOiI6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdGFybmFtZSwgc2VsZi5tb2RlKQorICAgICAgICBmb2JqID0gb3Blbih0YXJuYW1lLCAicmIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBmaWxlb2JqPWZvYmosIG1vZGU9c2VsZi5tb2RlKQorCisgICAgZGVmIHRlc3RfdjdfZGlydHlwZShzZWxmKToKKyAgICAgICAgIyBUZXN0IG9sZCBzdHlsZSBkaXJ0eXBlIG1lbWJlciAoYnVnICMxMzM2NjIzKToKKyAgICAgICAgIyBPbGQgVjcgdGFycyBjcmVhdGUgZGlyZWN0b3J5IG1lbWJlcnMgdXNpbmcgYW4gQVJFR1RZUEUKKyAgICAgICAgIyBoZWFkZXIgd2l0aCBhICIvIiBhcHBlbmRlZCB0byB0aGUgZmlsZW5hbWUgZmllbGQuCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoIm1pc2MvZGlydHlwZS1vbGQtdjciKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby50eXBlID09IHRhcmZpbGUuRElSVFlQRSwKKyAgICAgICAgICAgICAgICAidjcgZGlydHlwZSBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfeHN0YXJfdHlwZShzZWxmKToKKyAgICAgICAgIyBUaGUgeHN0YXIgZm9ybWF0IHN0b3JlcyBleHRyYSBhdGltZSBhbmQgY3RpbWUgZmllbGRzIGluc2lkZSB0aGUKKyAgICAgICAgIyBzcGFjZSByZXNlcnZlZCBmb3IgdGhlIHByZWZpeCBmaWVsZC4gVGhlIHByZWZpeCBmaWVsZCBtdXN0IGJlCisgICAgICAgICMgaWdub3JlZCBpbiB0aGlzIGNhc2UsIG90aGVyd2lzZSBpdCB3aWxsIG1lc3MgdXAgdGhlIG5hbWUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGFyLmdldG1lbWJlcigibWlzYy9yZWd0eXBlLXhzdGFyIikKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJmYWlsZWQgdG8gZmluZCBtaXNjL3JlZ3R5cGUteHN0YXIgKG1hbmdsZWQgcHJlZml4PykiKQorCisgICAgZGVmIHRlc3RfY2hlY2tfbWVtYmVycyhzZWxmKToKKyAgICAgICAgZm9yIHRhcmluZm8gaW4gc2VsZi50YXI6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KHRhcmluZm8ubXRpbWUpID09IDA3NjA2MTM2NjE3LAorICAgICAgICAgICAgICAgICAgICAid3JvbmcgbXRpbWUgZm9yICVzIiAlIHRhcmluZm8ubmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCB0YXJpbmZvLm5hbWUuc3RhcnRzd2l0aCgidXN0YXIvIik6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnVuYW1lID09ICJ0YXJmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIHVuYW1lIGZvciAlcyIgJSB0YXJpbmZvLm5hbWUpCisKKyAgICBkZWYgdGVzdF9maW5kX21lbWJlcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRhci5nZXRtZW1iZXJzKClbLTFdLm5hbWUgPT0gIm1pc2MvZW9mIiwKKyAgICAgICAgICAgICAgICAiY291bGQgbm90IGZpbmQgYWxsIG1lbWJlcnMiKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdF9oYXJkbGluayhzZWxmKToKKyAgICAgICAgIyBUZXN0IGhhcmRsaW5rIGV4dHJhY3Rpb24gKGUuZy4gYnVnICM4NTcyOTcpLgorICAgICAgICB3aXRoIHRhcmZpbGUub3Blbih0YXJuYW1lLCBlcnJvcmxldmVsPTEsIGVuY29kaW5nPSJpc284ODU5LTEiKSBhcyB0YXI6CisgICAgICAgICAgICB0YXIuZXh0cmFjdCgidXN0YXIvcmVndHlwZSIsIFRFTVBESVIpCisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAob3MucmVtb3ZlLCBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL3JlZ3R5cGUiKSkKKworICAgICAgICAgICAgdGFyLmV4dHJhY3QoInVzdGFyL2xua3R5cGUiLCBURU1QRElSKQorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJlbW92ZSwgb3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9sbmt0eXBlIikpCisgICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9sbmt0eXBlIiksICJyYiIpIGFzIGY6CisgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1kNXN1bShkYXRhKSwgbWQ1X3JlZ3R5cGUpCisKKyAgICAgICAgICAgIHRhci5leHRyYWN0KCJ1c3Rhci9zeW10eXBlIiwgVEVNUERJUikKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5yZW1vdmUsIG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvc3ltdHlwZSIpKQorICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvc3ltdHlwZSIpLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZDVzdW0oZGF0YSksIG1kNV9yZWd0eXBlKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdGFsbChzZWxmKToKKyAgICAgICAgIyBUZXN0IGlmIGV4dHJhY3RhbGwoKSBjb3JyZWN0bHkgcmVzdG9yZXMgZGlyZWN0b3J5IHBlcm1pc3Npb25zCisgICAgICAgICMgYW5kIHRpbWVzIChzZWUgaXNzdWUxNzM1KS4KKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgICAgICBkaXJlY3RvcmllcyA9IFt0IGZvciB0IGluIHRhciBpZiB0LmlzZGlyKCldCisgICAgICAgIHRhci5leHRyYWN0YWxsKFRFTVBESVIsIGRpcmVjdG9yaWVzKQorICAgICAgICBmb3IgdGFyaW5mbyBpbiBkaXJlY3RvcmllczoKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgdGFyaW5mby5uYW1lKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICJ3aW4zMiI6CisgICAgICAgICAgICAgICAgIyBXaW4zMiBoYXMgbm8gc3VwcG9ydCBmb3IgZmluZSBncmFpbmVkIHBlcm1pc3Npb25zLgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5tb2RlICYgMDc3Nywgb3Muc3RhdChwYXRoKS5zdF9tb2RlICYgMDc3NykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5tdGltZSwgb3MucGF0aC5nZXRtdGltZShwYXRoKSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2luaXRfY2xvc2VfZm9iaihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjNzM0MTogQ2xvc2UgdGhlIGludGVybmFsIGZpbGUgb2JqZWN0IGluIHRoZSBUYXJGaWxlCisgICAgICAgICMgY29uc3RydWN0b3IgaW4gY2FzZSBvZiBhbiBlcnJvci4gRm9yIHRoZSB0ZXN0IHdlIHJlbHkgb24KKyAgICAgICAgIyB0aGUgZmFjdCB0aGF0IG9wZW5pbmcgYW4gZW1wdHkgZmlsZSByYWlzZXMgYSBSZWFkRXJyb3IuCisgICAgICAgIGVtcHR5ID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJlbXB0eSIpCisgICAgICAgIG9wZW4oZW1wdHksICJ3YiIpLndyaXRlKCIiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhciA9IG9iamVjdC5fX25ld19fKHRhcmZpbGUuVGFyRmlsZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YXIuX19pbml0X18oZW1wdHkpCisgICAgICAgICAgICBleGNlcHQgdGFyZmlsZS5SZWFkRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5maWxlb2JqLmNsb3NlZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJSZWFkRXJyb3Igbm90IHJhaXNlZCIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5yZW1vdmUoZW1wdHkpCisKKyAgICBkZWYgdGVzdF9wYXJhbGxlbF9pdGVyYXRpb24oc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE2NjAxOiBSZXN0YXJ0aW5nIGl0ZXJhdGlvbiBvdmVyIHRhcmZpbGUgY29udGludWVkCisgICAgICAgICMgZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZi4KKyAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lKSBhcyB0YXI6CisgICAgICAgICAgICBmb3IgbTEsIG0yIGluIHppcCh0YXIsIHRhcik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMS5vZmZzZXQsIG0yLm9mZnNldCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0xLm5hbWUsIG0yLm5hbWUpCisKKworY2xhc3MgU3RyZWFtUmVhZFRlc3QoQ29tbW9uUmVhZFRlc3QpOgorCisgICAgbW9kZT0icnwiCisKKyAgICBkZWYgdGVzdF9maWxlb2JqX3JlZ3VsYXJfZmlsZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLm5leHQoKSAjIGdldCAicmVndHlwZSIgKGNhbid0IHVzZSBnZXRtZW1iZXIpCisgICAgICAgIGZvYmogPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQorICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChsZW4oZGF0YSksIG1kNXN1bShkYXRhKSkgPT0gKHRhcmluZm8uc2l6ZSwgbWQ1X3JlZ3R5cGUpLAorICAgICAgICAgICAgICAgICJyZWd1bGFyIGZpbGUgZXh0cmFjdGlvbiBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfcHJvdm9rZV9zdHJlYW1fZXJyb3Ioc2VsZik6CisgICAgICAgIHRhcmluZm9zID0gc2VsZi50YXIuZ2V0bWVtYmVycygpCisgICAgICAgIGYgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvc1swXSkgIyByZWFkIHRoZSBmaXJzdCBtZW1iZXIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5TdHJlYW1FcnJvciwgZi5yZWFkKQorCisgICAgZGVmIHRlc3RfY29tcGFyZV9tZW1iZXJzKHNlbGYpOgorICAgICAgICB0YXIxID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgICAgICB0YXIyID0gc2VsZi50YXIKKworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdDEgPSB0YXIxLm5leHQoKQorICAgICAgICAgICAgdDIgPSB0YXIyLm5leHQoKQorICAgICAgICAgICAgaWYgdDEgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyIGlzIG5vdCBOb25lLCAic3RyZWFtLm5leHQoKSBmYWlsZWQuIikKKworICAgICAgICAgICAgaWYgdDIuaXNsbmsoKSBvciB0Mi5pc3N5bSgpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuU3RyZWFtRXJyb3IsIHRhcjIuZXh0cmFjdGZpbGUsIHQyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHYxID0gdGFyMS5leHRyYWN0ZmlsZSh0MSkKKyAgICAgICAgICAgIHYyID0gdGFyMi5leHRyYWN0ZmlsZSh0MikKKyAgICAgICAgICAgIGlmIHYxIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2MiBpcyBub3QgTm9uZSwgInN0cmVhbS5leHRyYWN0ZmlsZSgpIGZhaWxlZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodjEucmVhZCgpID09IHYyLnJlYWQoKSwgInN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCIpCisKKyAgICAgICAgdGFyMS5jbG9zZSgpCisKKworY2xhc3MgRGV0ZWN0UmVhZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF90ZXN0ZnVuY19maWxlKHNlbGYsIG5hbWUsIG1vZGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXJmaWxlLm9wZW4obmFtZSwgbW9kZSkKKyAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKworICAgIGRlZiBfdGVzdGZ1bmNfZmlsZW9iaihzZWxmLCBuYW1lLCBtb2RlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFyZmlsZS5vcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmo9b3BlbihuYW1lLCAicmIiKSkKKyAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKworICAgIGRlZiBfdGVzdF9tb2RlcyhzZWxmLCB0ZXN0ZnVuYyk6CisgICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyIikKKyAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInI6IikKKyAgICAgICAgdGVzdGZ1bmModGFybmFtZSwgInI6KiIpCisgICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyfCIpCisgICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyfCoiKQorCisgICAgICAgIGlmIGd6aXA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBtb2RlPSJyOmd6IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRhcm5hbWUsIG1vZGU9InJ8Z3oiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgZ3ppcG5hbWUsIG1vZGU9InI6IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIGd6aXBuYW1lLCBtb2RlPSJyfCIpCisKKyAgICAgICAgICAgIHRlc3RmdW5jKGd6aXBuYW1lLCAiciIpCisgICAgICAgICAgICB0ZXN0ZnVuYyhnemlwbmFtZSwgInI6KiIpCisgICAgICAgICAgICB0ZXN0ZnVuYyhnemlwbmFtZSwgInI6Z3oiKQorICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyfCoiKQorICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyfGd6IikKKworICAgICAgICBpZiBiejI6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBtb2RlPSJyOmJ6MiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBtb2RlPSJyfGJ6MiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBiejJuYW1lLCBtb2RlPSJyOiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBiejJuYW1lLCBtb2RlPSJyfCIpCisKKyAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyIikKKyAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyOioiKQorICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInI6YnoyIikKKyAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyfCoiKQorICAgICAgICAgICAgdGVzdGZ1bmMoYnoybmFtZSwgInJ8YnoyIikKKworICAgIGRlZiB0ZXN0X2RldGVjdF9maWxlKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X21vZGVzKHNlbGYuX3Rlc3RmdW5jX2ZpbGUpCisKKyAgICBkZWYgdGVzdF9kZXRlY3RfZmlsZW9iaihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9tb2RlcyhzZWxmLl90ZXN0ZnVuY19maWxlb2JqKQorCisgICAgZGVmIHRlc3RfZGV0ZWN0X3N0cmVhbV9iejIoc2VsZik6CisgICAgICAgICMgT3JpZ2luYWxseSwgdGFyZmlsZSdzIHN0cmVhbSBkZXRlY3Rpb24gbG9va2VkIGZvciB0aGUgc3RyaW5nCisgICAgICAgICMgIkJaaDkxIiBhdCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuIFRoaXMgaXMgaW5jb3JyZWN0IGJlY2F1c2UKKyAgICAgICAgIyB0aGUgJzknIHJlcHJlc2VudHMgdGhlIGJsb2Nrc2l6ZSAoOTAwa0IpLiBJZiB0aGUgZmlsZSB3YXMKKyAgICAgICAgIyBjb21wcmVzc2VkIHVzaW5nIGFub3RoZXIgYmxvY2tzaXplIGF1dG9kZXRlY3Rpb24gZmFpbHMuCisgICAgICAgIGlmIG5vdCBiejI6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB3aXRoIG9wZW4odGFybmFtZSwgInJiIikgYXMgZm9iajoKKyAgICAgICAgICAgIGRhdGEgPSBmb2JqLnJlYWQoKQorCisgICAgICAgICMgQ29tcHJlc3Mgd2l0aCBibG9ja3NpemUgMTAwa0IsIHRoZSBmaWxlIHN0YXJ0cyB3aXRoICJCWmgxMSIuCisgICAgICAgIHdpdGggYnoyLkJaMkZpbGUodG1wbmFtZSwgIndiIiwgY29tcHJlc3NsZXZlbD0xKSBhcyBmb2JqOgorICAgICAgICAgICAgZm9iai53cml0ZShkYXRhKQorCisgICAgICAgIHNlbGYuX3Rlc3RmdW5jX2ZpbGUodG1wbmFtZSwgInJ8KiIpCisKKworY2xhc3MgTWVtYmVyUmVhZFRlc3QoUmVhZFRlc3QpOgorCisgICAgZGVmIF90ZXN0X21lbWJlcihzZWxmLCB0YXJpbmZvLCBjaGtzdW09Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICBpZiBjaGtzdW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWQ1c3VtKHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pLnJlYWQoKSkgPT0gY2hrc3VtLAorICAgICAgICAgICAgICAgICAgICAid3JvbmcgbWQ1c3VtIGZvciAlcyIgJSB0YXJpbmZvLm5hbWUpCisKKyAgICAgICAga3dhcmdzWyJtdGltZSJdID0gMDc2MDYxMzY2MTcKKyAgICAgICAga3dhcmdzWyJ1aWQiXSA9IDEwMDAKKyAgICAgICAga3dhcmdzWyJnaWQiXSA9IDEwMAorICAgICAgICBpZiAib2xkLXY3IiBub3QgaW4gdGFyaW5mby5uYW1lOgorICAgICAgICAgICAgIyBWNyB0YXIgY2FuJ3QgaGFuZGxlIGFscGhhYmV0aWMgb3duZXJzLgorICAgICAgICAgICAga3dhcmdzWyJ1bmFtZSJdID0gInRhcmZpbGUiCisgICAgICAgICAgICBrd2FyZ3NbImduYW1lIl0gPSAidGFyZmlsZSIKKyAgICAgICAgZm9yIGssIHYgaW4ga3dhcmdzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdldGF0dHIodGFyaW5mbywgaykgPT0gdiwKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIHZhbHVlIGluICVzIGZpZWxkIG9mICVzIiAlIChrLCB0YXJpbmZvLm5hbWUpKQorCisgICAgZGVmIHRlc3RfZmluZF9yZWd0eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT03MDExLCBjaGtzdW09bWQ1X3JlZ3R5cGUpCisKKyAgICBkZWYgdGVzdF9maW5kX2NvbnR0eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9jb250dHlwZSIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQorCisgICAgZGVmIHRlc3RfZmluZF9kaXJ0eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9kaXJ0eXBlIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wKQorCisgICAgZGVmIHRlc3RfZmluZF9kaXJ0eXBlX3dpdGhfc2l6ZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvZGlydHlwZS13aXRoLXNpemUiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTI1NSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfbG5rdHlwZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvbG5rdHlwZSIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCwgbGlua25hbWU9InVzdGFyL3JlZ3R5cGUiKQorCisgICAgZGVmIHRlc3RfZmluZF9zeW10eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9zeW10eXBlIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wLCBsaW5rbmFtZT0icmVndHlwZSIpCisKKyAgICBkZWYgdGVzdF9maW5kX2Jsa3R5cGUoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2Jsa3R5cGUiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTAsIGRldm1ham9yPTMsIGRldm1pbm9yPTApCisKKyAgICBkZWYgdGVzdF9maW5kX2NocnR5cGUoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2NocnR5cGUiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTAsIGRldm1ham9yPTEsIGRldm1pbm9yPTMpCisKKyAgICBkZWYgdGVzdF9maW5kX2ZpZm90eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9maWZvdHlwZSIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCkKKworICAgIGRlZiB0ZXN0X2ZpbmRfc3BhcnNlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9zcGFyc2UiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTg2MDE2LCBjaGtzdW09bWQ1X3NwYXJzZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfdW1sYXV0cyhzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvdW1sYXV0cy3E1tzk9vzfIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT03MDExLCBjaGtzdW09bWQ1X3JlZ3R5cGUpCisKKyAgICBkZWYgdGVzdF9maW5kX3VzdGFyX2xvbmduYW1lKHNlbGYpOgorICAgICAgICBuYW1lID0gInVzdGFyLyIgKyAiMTIzNDUvIiAqIDM5ICsgIjEyMzQ1NjcvbG9uZ25hbWUiCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obmFtZSwgc2VsZi50YXIuZ2V0bmFtZXMoKSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfcmVndHlwZV9vbGR2NyhzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigibWlzYy9yZWd0eXBlLW9sZC12NyIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQorCisgICAgZGVmIHRlc3RfZmluZF9wYXhfdW1sYXV0cyhzZWxmKToKKyAgICAgICAgc2VsZi50YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCBtb2RlPXNlbGYubW9kZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInBheC91bWxhdXRzLcTW3OT2/N8iKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTcwMTEsIGNoa3N1bT1tZDVfcmVndHlwZSkKKworCitjbGFzcyBMb25nbmFtZVRlc3QoUmVhZFRlc3QpOgorCisgICAgZGVmIHRlc3RfcmVhZF9sb25nbmFtZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHJlYWRpbmcgb2YgbG9uZ25hbWUgKGJ1ZyAjMTQ3MTQyNykuCisgICAgICAgIGxvbmduYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ25hbWUpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibG9uZ25hbWUgbm90IGZvdW5kIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udHlwZSAhPSB0YXJmaWxlLkRJUlRZUEUsICJyZWFkIGxvbmduYW1lIGFzIGRpcnR5cGUiKQorCisgICAgZGVmIHRlc3RfcmVhZF9sb25nbGluayhzZWxmKToKKyAgICAgICAgbG9uZ25hbWUgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbmFtZSIKKyAgICAgICAgbG9uZ2xpbmsgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbGluayIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihsb25nbGluaykKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJsb25nbGluayBub3QgZm91bmQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby5saW5rbmFtZSA9PSBsb25nbmFtZSwgImxpbmtuYW1lIHdyb25nIikKKworICAgIGRlZiB0ZXN0X3RydW5jYXRlZF9sb25nbmFtZShzZWxmKToKKyAgICAgICAgbG9uZ25hbWUgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbmFtZSIKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcihsb25nbmFtZSkKKyAgICAgICAgb2Zmc2V0ID0gdGFyaW5mby5vZmZzZXQKKyAgICAgICAgc2VsZi50YXIuZmlsZW9iai5zZWVrKG9mZnNldCkKKyAgICAgICAgZm9iaiA9IFN0cmluZ0lPLlN0cmluZ0lPKHNlbGYudGFyLmZpbGVvYmoucmVhZCgzICogNTEyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgbmFtZT0iZm9vLnRhciIsIGZpbGVvYmo9Zm9iaikKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9vZmZzZXQoc2VsZik6CisgICAgICAgICMgVGVzdCBpZiB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBUYXJJbmZvIG9iamVjdCBpbmNsdWRlcworICAgICAgICAjIHRoZSBwcmVjZWRpbmcgZXh0ZW5kZWQgaGVhZGVyLgorICAgICAgICBsb25nbmFtZSA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmduYW1lIgorICAgICAgICBvZmZzZXQgPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ25hbWUpLm9mZnNldAorICAgICAgICBmb2JqID0gb3Blbih0YXJuYW1lKQorICAgICAgICBmb2JqLnNlZWsob2Zmc2V0KQorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvLmZyb21idWYoZm9iai5yZWFkKDUxMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby50eXBlLCBzZWxmLmxvbmduYW1ldHlwZSkKKworCitjbGFzcyBHTlVSZWFkVGVzdChMb25nbmFtZVRlc3QpOgorCisgICAgc3ViZGlyID0gImdudSIKKyAgICBsb25nbmFtZXR5cGUgPSB0YXJmaWxlLkdOVVRZUEVfTE9OR05BTUUKKworICAgIGRlZiB0ZXN0X3NwYXJzZV9maWxlKHNlbGYpOgorICAgICAgICB0YXJpbmZvMSA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvc3BhcnNlIikKKyAgICAgICAgZm9iajEgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvMSkKKyAgICAgICAgdGFyaW5mbzIgPSBzZWxmLnRhci5nZXRtZW1iZXIoImdudS9zcGFyc2UiKQorICAgICAgICBmb2JqMiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9iajEucmVhZCgpID09IGZvYmoyLnJlYWQoKSwKKyAgICAgICAgICAgICAgICAic3BhcnNlIGZpbGUgZXh0cmFjdGlvbiBmYWlsZWQiKQorCisKK2NsYXNzIFBheFJlYWRUZXN0KExvbmduYW1lVGVzdCk6CisKKyAgICBzdWJkaXIgPSAicGF4IgorICAgIGxvbmduYW1ldHlwZSA9IHRhcmZpbGUuWEhEVFlQRQorCisgICAgZGVmIHRlc3RfcGF4X2dsb2JhbF9oZWFkZXJzKHNlbGYpOgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisKKyAgICAgICAgdGFyaW5mbyA9IHRhci5nZXRtZW1iZXIoInBheC9yZWd0eXBlMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51bmFtZSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5nbmFtZSwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksIHUixNbc5Pb83yIpCisKKyAgICAgICAgdGFyaW5mbyA9IHRhci5nZXRtZW1iZXIoInBheC9yZWd0eXBlMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51bmFtZSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5nbmFtZSwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksIHUixNbc5Pb83yIpCisKKyAgICAgICAgdGFyaW5mbyA9IHRhci5nZXRtZW1iZXIoInBheC9yZWd0eXBlMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51bmFtZSwgInRhcmZpbGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uZ25hbWUsICJ0YXJmaWxlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnBheF9oZWFkZXJzLmdldCgiVkVORE9SLnVtbGF1dHMiKSwgdSLE1tzk9vzfIikKKworICAgIGRlZiB0ZXN0X3BheF9udW1iZXJfZmllbGRzKHNlbGYpOgorICAgICAgICAjIEFsbCBmb2xsb3dpbmcgbnVtYmVyIGZpZWxkcyBhcmUgcmVhZCBmcm9tIHRoZSBwYXggaGVhZGVyLgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgNzAxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnVpZCwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uZ2lkLCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5tdGltZSwgMTA0MTgwODc4My4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodGFyaW5mby5tdGltZSksIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KHRhcmluZm8ucGF4X2hlYWRlcnNbImF0aW1lIl0pLCAxMDQxODA4NzgzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQodGFyaW5mby5wYXhfaGVhZGVyc1siY3RpbWUiXSksIDEwNDE4MDg3ODMuMCkKKworCitjbGFzcyBXcml0ZVRlc3RCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFB1dCBhbGwgd3JpdGUgdGVzdHMgaW4gaGVyZSB0aGF0IGFyZSBzdXBwb3NlZCB0byBiZSB0ZXN0ZWQKKyAgICAjIGluIGFsbCBwb3NzaWJsZSBtb2RlIGNvbWJpbmF0aW9ucy4KKworICAgIGRlZiB0ZXN0X2ZpbGVvYmpfbm9fY2xvc2Uoc2VsZik6CisgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihmaWxlb2JqPWZvYmosIG1vZGU9c2VsZi5tb2RlKQorICAgICAgICB0YXIuYWRkZmlsZSh0YXJmaWxlLlRhckluZm8oImZvbyIpKQorICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9iai5jbG9zZWQgaXMgRmFsc2UsICJleHRlcm5hbCBmaWxlb2JqcyBtdXN0IG5ldmVyIGNsb3NlZCIpCisKKworY2xhc3MgV3JpdGVUZXN0KFdyaXRlVGVzdEJhc2UpOgorCisgICAgbW9kZSA9ICJ3OiIKKworICAgIGRlZiB0ZXN0XzEwMF9jaGFyX25hbWUoc2VsZik6CisgICAgICAgICMgVGhlIG5hbWUgZmllbGQgaW4gYSB0YXIgaGVhZGVyIHN0b3JlcyBzdHJpbmdzIG9mIGF0IG1vc3QgMTAwIGNoYXJzLgorICAgICAgICAjIElmIGEgc3RyaW5nIGlzIHNob3J0ZXIgdGhhbiAxMDAgY2hhcnMgaXQgaGFzIHRvIGJlIHBhZGRlZCB3aXRoICdcMCcsCisgICAgICAgICMgd2hpY2ggaW1wbGllcyB0aGF0IGEgc3RyaW5nIG9mIGV4YWN0bHkgMTAwIGNoYXJzIGlzIHN0b3JlZCB3aXRob3V0CisgICAgICAgICMgYSB0cmFpbGluZyAnXDAnLgorICAgICAgICBuYW1lID0gIjAxMjM0NTY3ODkiICogMTAKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgdCA9IHRhcmZpbGUuVGFySW5mbyhuYW1lKQorICAgICAgICB0YXIuYWRkZmlsZSh0KQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLmdldG5hbWVzKClbMF0gPT0gbmFtZSwKKyAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHN0b3JlIDEwMCBjaGFyIGZpbGVuYW1lIikKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3Rhcl9zaXplKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTAxMzg4Mi4KKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZmlsZSIpCisgICAgICAgIGZvYmogPSBvcGVuKHBhdGgsICJ3YiIpCisgICAgICAgIGZvYmoud3JpdGUoImFhYSIpCisgICAgICAgIGZvYmouY2xvc2UoKQorICAgICAgICB0YXIuYWRkKHBhdGgpCisgICAgICAgIHRhci5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmdldHNpemUodG1wbmFtZSkgPiAwLAorICAgICAgICAgICAgICAgICJ0YXJmaWxlIGlzIGVtcHR5IikKKworICAgICMgVGhlIHRlc3RfKl9zaXplIHRlc3RzIHRlc3QgZm9yIGJ1ZyAjMTE2NzEyOC4KKyAgICBkZWYgdGVzdF9maWxlX3NpemUoc2VsZik6CisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZmlsZSIpCisgICAgICAgIGZvYmogPSBvcGVuKHBhdGgsICJ3YiIpCisgICAgICAgIGZvYmouY2xvc2UoKQorICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8ocGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDApCisKKyAgICAgICAgZm9iaiA9IG9wZW4ocGF0aCwgIndiIikKKyAgICAgICAgZm9iai53cml0ZSgiYWFhIikKKyAgICAgICAgZm9iai5jbG9zZSgpCisgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0dGFyaW5mbyhwYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMykKKworICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZGlyZWN0b3J5X3NpemUoc2VsZik6CisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImRpcmVjdG9yeSIpCisgICAgICAgIG9zLm1rZGlyKHBhdGgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8ocGF0aCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3Mucm1kaXIocGF0aCkKKworICAgIGRlZiB0ZXN0X2xpbmtfc2l6ZShzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihvcywgImxpbmsiKToKKyAgICAgICAgICAgIGxpbmsgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImxpbmsiKQorICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJsaW5rX3RhcmdldCIpCisgICAgICAgICAgICBmb2JqID0gb3Blbih0YXJnZXQsICJ3YiIpCisgICAgICAgICAgICBmb2JqLndyaXRlKCJhYWEiKQorICAgICAgICAgICAgZm9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy5saW5rKHRhcmdldCwgbGluaykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQorICAgICAgICAgICAgICAgICMgUmVjb3JkIHRoZSBsaW5rIHRhcmdldCBpbiB0aGUgaW5vZGVzIGxpc3QuCisgICAgICAgICAgICAgICAgdGFyLmdldHRhcmluZm8odGFyZ2V0KQorICAgICAgICAgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0dGFyaW5mbyhsaW5rKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUodGFyZ2V0KQorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShsaW5rKQorCisgICAgZGVmIHRlc3Rfc3ltbGlua19zaXplKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAic3ltbGluayIpOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihURU1QRElSLCAic3ltbGluayIpCisgICAgICAgICAgICBvcy5zeW1saW5rKCJsaW5rX3RhcmdldCIsIHBhdGgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8ocGF0aCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisKKyAgICBkZWYgdGVzdF9hZGRfc2VsZihzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciAjMTI1NzI1NS4KKyAgICAgICAgZHN0bmFtZSA9IG9zLnBhdGguYWJzcGF0aCh0bXBuYW1lKQorCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIubmFtZSA9PSBkc3RuYW1lLCAiYXJjaGl2ZSBuYW1lIG11c3QgYmUgYWJzb2x1dGUiKQorCisgICAgICAgIHRhci5hZGQoZHN0bmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5nZXRuYW1lcygpID09IFtdLCAiYWRkZWQgdGhlIGFyY2hpdmUgdG8gaXRzZWxmIikKKworICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcihURU1QRElSKQorICAgICAgICB0YXIuYWRkKGRzdG5hbWUpCisgICAgICAgIG9zLmNoZGlyKGN3ZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5nZXRuYW1lcygpID09IFtdLCAiYWRkZWQgdGhlIGFyY2hpdmUgdG8gaXRzZWxmIikKKworICAgIGRlZiB0ZXN0X2V4Y2x1ZGUoc2VsZik6CisgICAgICAgIHRlbXBkaXIgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImV4Y2x1ZGUiKQorICAgICAgICBvcy5ta2Rpcih0ZW1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiAoImZvbyIsICJiYXIiLCAiYmF6Iik6CisgICAgICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCBuYW1lKQorICAgICAgICAgICAgICAgIG9wZW4obmFtZSwgIndiIikuY2xvc2UoKQorCisgICAgICAgICAgICBleGNsdWRlID0gb3MucGF0aC5pc2ZpbGUKKworICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygoInVzZSB0aGUgZmlsdGVyIGFyZ3VtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgICAgICB0YXIuYWRkKHRlbXBkaXIsIGFyY25hbWU9ImVtcHR5X2RpciIsIGV4Y2x1ZGU9ZXhjbHVkZSkKKyAgICAgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAiciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0YXIuZ2V0bWVtYmVycygpKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG5hbWVzKClbMF0sICJlbXB0eV9kaXIiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQorCisgICAgZGVmIHRlc3RfZmlsdGVyKHNlbGYpOgorICAgICAgICB0ZW1wZGlyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJmaWx0ZXIiKQorICAgICAgICBvcy5ta2Rpcih0ZW1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiAoImZvbyIsICJiYXIiLCAiYmF6Iik6CisgICAgICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCBuYW1lKQorICAgICAgICAgICAgICAgIG9wZW4obmFtZSwgIndiIikuY2xvc2UoKQorCisgICAgICAgICAgICBkZWYgZmlsdGVyKHRhcmluZm8pOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguYmFzZW5hbWUodGFyaW5mby5uYW1lKSA9PSAiYmFyIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgdGFyaW5mby51aWQgPSAxMjMKKyAgICAgICAgICAgICAgICB0YXJpbmZvLnVuYW1lID0gImZvbyIKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFyaW5mbworCisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlLCBlbmNvZGluZz0iaXNvODg1OS0xIikKKyAgICAgICAgICAgIHRhci5hZGQodGVtcGRpciwgYXJjbmFtZT0iZW1wdHlfZGlyIiwgZmlsdGVyPWZpbHRlcikKKyAgICAgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAiciIpCisgICAgICAgICAgICBmb3IgdGFyaW5mbyBpbiB0YXI6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnVpZCwgMTIzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51bmFtZSwgImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0YXIuZ2V0bWVtYmVycygpKSwgMykKKyAgICAgICAgICAgIHRhci5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBkaXIpCisKKyAgICAjIEd1YXJhbnRlZSB0aGF0IHN0b3JlZCBwYXRobmFtZXMgYXJlIG5vdCBtb2RpZmllZC4gRG9uJ3QKKyAgICAjIHJlbW92ZSAuLyBvciAuLi8gb3IgZG91YmxlIHNsYXNoZXMuIFN0aWxsIG1ha2UgYWJzb2x1dGUKKyAgICAjIHBhdGhuYW1lcyByZWxhdGl2ZS4KKyAgICAjIEZvciBkZXRhaWxzIHNlZSBidWcgIzYwNTQuCisgICAgZGVmIF90ZXN0X3BhdGhuYW1lKHNlbGYsIHBhdGgsIGNtcF9wYXRoPU5vbmUsIGRpcj1GYWxzZSk6CisgICAgICAgICMgQ3JlYXRlIGEgdGFyZmlsZSB3aXRoIGFuIGVtcHR5IG1lbWJlciBuYW1lZCBwYXRoCisgICAgICAgICMgYW5kIGNvbXBhcmUgdGhlIHN0b3JlZCBuYW1lIHdpdGggdGhlIG9yaWdpbmFsLgorICAgICAgICBmb28gPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImZvbyIpCisgICAgICAgIGlmIG5vdCBkaXI6CisgICAgICAgICAgICBvcGVuKGZvbywgInciKS5jbG9zZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcy5ta2Rpcihmb28pCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgdGFyLmFkZChmb28sIGFyY25hbWU9cGF0aCkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInIiKQorICAgICAgICB0ID0gdGFyLm5leHQoKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgIGlmIG5vdCBkaXI6CisgICAgICAgICAgICBvcy5yZW1vdmUoZm9vKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3Mucm1kaXIoZm9vKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5uYW1lLCBjbXBfcGF0aCBvciBwYXRoLnJlcGxhY2Uob3Muc2VwLCAiLyIpKQorCisgICAgZGVmIHRlc3RfcGF0aG5hbWVzKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKCJmb28iKQorICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiZm9vIiwgIi4iLCAiYmFyIikpCisgICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCJmb28iLCAiLi4iLCAiYmFyIikpCisgICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCIuIiwgImZvbyIpKQorICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLiIsICJmb28iLCAiLiIpKQorICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLiIsICJmb28iLCAiLiIsICJiYXIiKSkKKyAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4iLCAiZm9vIiwgIi4uIiwgImJhciIpKQorICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLiIsICJmb28iLCAiLi4iLCAiYmFyIikpCisgICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCIuLiIsICJmb28iKSkKKyAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4uIiwgImZvbyIsICIuLiIpKQorICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLi4iLCAiZm9vIiwgIi4iLCAiYmFyIikpCisgICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCIuLiIsICJmb28iLCAiLi4iLCAiYmFyIikpCisKKyAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZSgiZm9vIiArIG9zLnNlcCArIG9zLnNlcCArICJiYXIiKQorICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKCJmb28iICsgb3Muc2VwICsgb3Muc2VwLCAiZm9vIiwgZGlyPVRydWUpCisKKyAgICBkZWYgdGVzdF9hYnNfcGF0aG5hbWVzKHNlbGYpOgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUoIkM6XFxmb28iLCAiZm9vIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUoIi9mb28iLCAiZm9vIikKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUoIi8vL2ZvbyIsICJmb28iKQorCisgICAgZGVmIHRlc3RfY3dkKHNlbGYpOgorICAgICAgICAjIFRlc3QgYWRkaW5nIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgorICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcihURU1QRElSKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcGVuKCJmb28iLCAidyIpLmNsb3NlKCkKKworICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgICAgIHRhci5hZGQoIi4iKQorICAgICAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJyIikKKyAgICAgICAgICAgIGZvciB0IGluIHRhcjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodC5uYW1lID09ICIuIiBvciB0Lm5hbWUuc3RhcnRzd2l0aCgiLi8iKSkKKyAgICAgICAgICAgIHRhci5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihjd2QpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnc3ltbGluaycpLCAibmVlZHMgb3Muc3ltbGluayIpCisgICAgZGVmIHRlc3RfZXh0cmFjdGFsbF9zeW1saW5rcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGlmIGV4dHJhY3RhbGwgd29ya3MgcHJvcGVybHkgd2hlbiB0YXJmaWxlIGNvbnRhaW5zIHN5bWxpbmtzCisgICAgICAgIHRlbXBkaXIgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRlc3RzeW1saW5rcyIpCisgICAgICAgIHRlbXBhcmNoaXZlID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0c3ltbGlua3MudGFyIikKKyAgICAgICAgb3MubWtkaXIodGVtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc291cmNlX2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwnc291cmNlJykKKyAgICAgICAgICAgIHRhcmdldF9maWxlID0gb3MucGF0aC5qb2luKHRlbXBkaXIsJ3N5bWxpbmsnKQorICAgICAgICAgICAgd2l0aCBvcGVuKHNvdXJjZV9maWxlLCd3JykgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKCdzb21ldGhpbmdcbicpCisgICAgICAgICAgICBvcy5zeW1saW5rKHNvdXJjZV9maWxlLCB0YXJnZXRfZmlsZSkKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0ZW1wYXJjaGl2ZSwndycpCisgICAgICAgICAgICB0YXIuYWRkKHNvdXJjZV9maWxlLCBhcmNuYW1lPW9zLnBhdGguYmFzZW5hbWUoc291cmNlX2ZpbGUpKQorICAgICAgICAgICAgdGFyLmFkZCh0YXJnZXRfZmlsZSwgYXJjbmFtZT1vcy5wYXRoLmJhc2VuYW1lKHRhcmdldF9maWxlKSkKKyAgICAgICAgICAgIHRhci5jbG9zZSgpCisgICAgICAgICAgICAjIExldCdzIGV4dHJhY3QgaXQgdG8gdGhlIGxvY2F0aW9uIHdoaWNoIGNvbnRhaW5zIHRoZSBzeW1saW5rCisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGVtcGFyY2hpdmUsJ3InKQorICAgICAgICAgICAgIyB0aGlzIHNob3VsZCBub3QgcmFpc2UgT1NFcnJvcjogW0Vycm5vIDE3XSBGaWxlIGV4aXN0cworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhci5leHRyYWN0YWxsKHBhdGg9dGVtcGRpcikKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXh0cmFjdGFsbCBmYWlsZWQgd2l0aCBzeW1saW5rZWQgZmlsZXMiKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKHRlbXBhcmNoaXZlKQorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3N5bWxpbmsnKSwgIm5lZWRzIG9zLnN5bWxpbmsiKQorICAgIGRlZiB0ZXN0X2V4dHJhY3RhbGxfYnJva2VuX3N5bWxpbmtzKHNlbGYpOgorICAgICAgICAjIFRlc3QgaWYgZXh0cmFjdGFsbCB3b3JrcyBwcm9wZXJseSB3aGVuIHRhcmZpbGUgY29udGFpbnMgYnJva2VuCisgICAgICAgICMgc3ltbGlua3MKKyAgICAgICAgdGVtcGRpciA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHN5bWxpbmtzIikKKyAgICAgICAgdGVtcGFyY2hpdmUgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRlc3RzeW1saW5rcy50YXIiKQorICAgICAgICBvcy5ta2Rpcih0ZW1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzb3VyY2VfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCdzb3VyY2UnKQorICAgICAgICAgICAgdGFyZ2V0X2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwnc3ltbGluaycpCisgICAgICAgICAgICB3aXRoIG9wZW4oc291cmNlX2ZpbGUsJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoJ3NvbWV0aGluZ1xuJykKKyAgICAgICAgICAgIG9zLnN5bWxpbmsoc291cmNlX2ZpbGUsIHRhcmdldF9maWxlKQorICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRlbXBhcmNoaXZlLCd3JykKKyAgICAgICAgICAgIHRhci5hZGQodGFyZ2V0X2ZpbGUsIGFyY25hbWU9b3MucGF0aC5iYXNlbmFtZSh0YXJnZXRfZmlsZSkpCisgICAgICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICAgICAgIyByZW1vdmUgdGhlIHJlYWwgZmlsZQorICAgICAgICAgICAgb3MudW5saW5rKHNvdXJjZV9maWxlKQorICAgICAgICAgICAgIyBMZXQncyBleHRyYWN0IGl0IHRvIHRoZSBsb2NhdGlvbiB3aGljaCBjb250YWlucyB0aGUgc3ltbGluaworICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRlbXBhcmNoaXZlLCdyJykKKyAgICAgICAgICAgICMgdGhpcyBzaG91bGQgbm90IHJhaXNlIE9TRXJyb3I6IFtFcnJubyAxN10gRmlsZSBleGlzdHMKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YXIuZXh0cmFjdGFsbChwYXRoPXRlbXBkaXIpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4dHJhY3RhbGwgZmFpbGVkIHdpdGggYnJva2VuIHN5bWxpbmtlZCBmaWxlcyIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRhci5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsodGVtcGFyY2hpdmUpCisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBkaXIpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnbGluaycpLCAibmVlZHMgb3MubGluayIpCisgICAgZGVmIHRlc3RfZXh0cmFjdGFsbF9oYXJkbGlua3Moc2VsZik6CisgICAgICAgICMgVGVzdCBpZiBleHRyYWN0YWxsIHdvcmtzIHByb3Blcmx5IHdoZW4gdGFyZmlsZSBjb250YWlucyBzeW1saW5rcworICAgICAgICB0ZW1wZGlyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0c3ltbGlua3MiKQorICAgICAgICB0ZW1wYXJjaGl2ZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHN5bWxpbmtzLnRhciIpCisgICAgICAgIG9zLm1rZGlyKHRlbXBkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvdXJjZV9maWxlID0gb3MucGF0aC5qb2luKHRlbXBkaXIsJ3NvdXJjZScpCisgICAgICAgICAgICB0YXJnZXRfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCdzeW1saW5rJykKKyAgICAgICAgICAgIHdpdGggb3Blbihzb3VyY2VfZmlsZSwndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgnc29tZXRoaW5nXG4nKQorICAgICAgICAgICAgb3MubGluayhzb3VyY2VfZmlsZSwgdGFyZ2V0X2ZpbGUpCisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGVtcGFyY2hpdmUsJ3cnKQorICAgICAgICAgICAgdGFyLmFkZChzb3VyY2VfZmlsZSwgYXJjbmFtZT1vcy5wYXRoLmJhc2VuYW1lKHNvdXJjZV9maWxlKSkKKyAgICAgICAgICAgIHRhci5hZGQodGFyZ2V0X2ZpbGUsIGFyY25hbWU9b3MucGF0aC5iYXNlbmFtZSh0YXJnZXRfZmlsZSkpCisgICAgICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICAgICAgIyBMZXQncyBleHRyYWN0IGl0IHRvIHRoZSBsb2NhdGlvbiB3aGljaCBjb250YWlucyB0aGUgc3ltbGluaworICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRlbXBhcmNoaXZlLCdyJykKKyAgICAgICAgICAgICMgdGhpcyBzaG91bGQgbm90IHJhaXNlIE9TRXJyb3I6IFtFcnJubyAxN10gRmlsZSBleGlzdHMKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YXIuZXh0cmFjdGFsbChwYXRoPXRlbXBkaXIpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4dHJhY3RhbGwgZmFpbGVkIHdpdGggbGlua2VkIGZpbGVzIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdGFyLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayh0ZW1wYXJjaGl2ZSkKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKKworY2xhc3MgU3RyZWFtV3JpdGVUZXN0KFdyaXRlVGVzdEJhc2UpOgorCisgICAgbW9kZSA9ICJ3fCIKKworICAgIGRlZiB0ZXN0X3N0cmVhbV9wYWRkaW5nKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTU0MzMwMy4KKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICBpZiBzZWxmLm1vZGUuZW5kc3dpdGgoImd6Iik6CisgICAgICAgICAgICBmb2JqID0gZ3ppcC5HemlwRmlsZSh0bXBuYW1lKQorICAgICAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCisgICAgICAgICAgICBmb2JqLmNsb3NlKCkKKyAgICAgICAgZWxpZiBzZWxmLm1vZGUuZW5kc3dpdGgoImJ6MiIpOgorICAgICAgICAgICAgZGVjID0gYnoyLkJaMkRlY29tcHJlc3NvcigpCisgICAgICAgICAgICBkYXRhID0gb3Blbih0bXBuYW1lLCAicmIiKS5yZWFkKCkKKyAgICAgICAgICAgIGRhdGEgPSBkZWMuZGVjb21wcmVzcyhkYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkZWMudW51c2VkX2RhdGEpID09IDAsCisgICAgICAgICAgICAgICAgICAgICJmb3VuZCB0cmFpbGluZyBkYXRhIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvYmogPSBvcGVuKHRtcG5hbWUsICJyYiIpCisgICAgICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKKyAgICAgICAgICAgIGZvYmouY2xvc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhLmNvdW50KCJcMCIpID09IHRhcmZpbGUuUkVDT1JEU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb3JyZWN0IHplcm8gcGFkZGluZyIpCisKKyAgICBkZWYgdGVzdF9maWxlX21vZGUoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgaXNzdWUgIzg0NjQ6IENyZWF0ZSBmaWxlcyB3aXRoIGNvcnJlY3QKKyAgICAgICAgIyBwZXJtaXNzaW9ucy4KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIgb3Igbm90IGhhc2F0dHIob3MsICJ1bWFzayIpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHModG1wbmFtZSk6CisgICAgICAgICAgICBvcy5yZW1vdmUodG1wbmFtZSkKKworICAgICAgICBvcmlnaW5hbF91bWFzayA9IG9zLnVtYXNrKDAwMjIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICAgICAgbW9kZSA9IG9zLnN0YXQodG1wbmFtZSkuc3RfbW9kZSAmIDA3NzcKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kZSwgMDY0NCwgIndyb25nIGZpbGUgcGVybWlzc2lvbnMiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW1hc2sob3JpZ2luYWxfdW1hc2spCisKKyAgICBkZWYgdGVzdF9pc3N1ZTEzNjM5KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHRhcmZpbGUub3Blbih1bmljb2RlKHRtcG5hbWUsIHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSksIHNlbGYubW9kZSk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJfU3RyZWFtIGZhaWxlZCB0byB3cml0ZSB1bmljb2RlIGZpbGVuYW1lIikKKworCitjbGFzcyBHTlVXcml0ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGhpcyB0ZXN0Y2FzZSBjaGVja3MgZm9yIGNvcnJlY3QgY3JlYXRpb24gb2YgR05VIExvbmduYW1lCisgICAgIyBhbmQgTG9uZ2xpbmsgZXh0ZW5kZWQgaGVhZGVycyAoY3AuIGJ1ZyAjODEyMzI1KS4KKworICAgIGRlZiBfbGVuZ3RoKHNlbGYsIHMpOgorICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChsZW4ocykgKyAxLCA1MTIpCisgICAgICAgIGlmIHJlbWFpbmRlcjoKKyAgICAgICAgICAgIGJsb2NrcyArPSAxCisgICAgICAgIHJldHVybiBibG9ja3MgKiA1MTIKKworICAgIGRlZiBfY2FsY19zaXplKHNlbGYsIG5hbWUsIGxpbms9Tm9uZSk6CisgICAgICAgICMgSW5pdGlhbCB0YXIgaGVhZGVyCisgICAgICAgIGNvdW50ID0gNTEyCisKKyAgICAgICAgaWYgbGVuKG5hbWUpID4gdGFyZmlsZS5MRU5HVEhfTkFNRToKKyAgICAgICAgICAgICMgR05VIGxvbmduYW1lIGV4dGVuZGVkIGhlYWRlciArIGxvbmduYW1lCisgICAgICAgICAgICBjb3VudCArPSA1MTIKKyAgICAgICAgICAgIGNvdW50ICs9IHNlbGYuX2xlbmd0aChuYW1lKQorICAgICAgICBpZiBsaW5rIGlzIG5vdCBOb25lIGFuZCBsZW4obGluaykgPiB0YXJmaWxlLkxFTkdUSF9MSU5LOgorICAgICAgICAgICAgIyBHTlUgbG9uZ2xpbmsgZXh0ZW5kZWQgaGVhZGVyICsgbG9uZ2xpbmsKKyAgICAgICAgICAgIGNvdW50ICs9IDUxMgorICAgICAgICAgICAgY291bnQgKz0gc2VsZi5fbGVuZ3RoKGxpbmspCisgICAgICAgIHJldHVybiBjb3VudAorCisgICAgZGVmIF90ZXN0KHNlbGYsIG5hbWUsIGxpbms9Tm9uZSk6CisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8obmFtZSkKKyAgICAgICAgaWYgbGluazoKKyAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBsaW5rCisgICAgICAgICAgICB0YXJpbmZvLnR5cGUgPSB0YXJmaWxlLkxOS1RZUEUKKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciKQorICAgICAgICB0YXIuZm9ybWF0ID0gdGFyZmlsZS5HTlVfRk9STUFUCisgICAgICAgIHRhci5hZGRmaWxlKHRhcmluZm8pCisKKyAgICAgICAgdjEgPSBzZWxmLl9jYWxjX3NpemUobmFtZSwgbGluaykKKyAgICAgICAgdjIgPSB0YXIub2Zmc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2MSA9PSB2MiwgIkdOVSBsb25nbmFtZS9sb25nbGluayBjcmVhdGlvbiBmYWlsZWQiKQorCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUpCisgICAgICAgIG1lbWJlciA9IHRhci5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUobWVtYmVyLAorICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gcmVhZCBsb25nbmFtZSBtZW1iZXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ubmFtZSwgbWVtYmVyLm5hbWUsCisgICAgICAgICAgICAgICAgInVuYWJsZSB0byByZWFkIGxvbmduYW1lIG1lbWJlciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5saW5rbmFtZSwgbWVtYmVyLmxpbmtuYW1lLAorICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gcmVhZCBsb25nbmFtZSBtZW1iZXIiKQorCisgICAgZGVmIHRlc3RfbG9uZ25hbWVfMTAyMyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdCgoImxvbmduYW0vIiAqIDEyNykgKyAibG9uZ25hbSIpCisKKyAgICBkZWYgdGVzdF9sb25nbmFtZV8xMDI0KHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtZSIpCisKKyAgICBkZWYgdGVzdF9sb25nbmFtZV8xMDI1KHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtZV8iKQorCisgICAgZGVmIHRlc3RfbG9uZ2xpbmtfMTAyMyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdCgibmFtZSIsICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbG5rIikKKworICAgIGRlZiB0ZXN0X2xvbmdsaW5rXzEwMjQoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3QoIm5hbWUiLCAoImxvbmdsbmsvIiAqIDEyNykgKyAibG9uZ2xpbmsiKQorCisgICAgZGVmIHRlc3RfbG9uZ2xpbmtfMTAyNShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdCgibmFtZSIsICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbGlua18iKQorCisgICAgZGVmIHRlc3RfbG9uZ25hbWVsaW5rXzEwMjMoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3QoKCJsb25nbmFtLyIgKiAxMjcpICsgImxvbmduYW0iLAorICAgICAgICAgICAgICAgICAgICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbG5rIikKKworICAgIGRlZiB0ZXN0X2xvbmduYW1lbGlua18xMDI0KHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtZSIsCisgICAgICAgICAgICAgICAgICAgKCJsb25nbG5rLyIgKiAxMjcpICsgImxvbmdsaW5rIikKKworICAgIGRlZiB0ZXN0X2xvbmduYW1lbGlua18xMDI1KHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtZV8iLAorICAgICAgICAgICAgICAgICAgICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbGlua18iKQorCisKK2NsYXNzIEhhcmRsaW5rVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUZXN0IHRoZSBjcmVhdGlvbiBvZiBMTktUWVBFIChoYXJkbGluaykgbWVtYmVycyBpbiBhbiBhcmNoaXZlLgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZvbyA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZm9vIikKKyAgICAgICAgc2VsZi5iYXIgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImJhciIpCisKKyAgICAgICAgZm9iaiA9IG9wZW4oc2VsZi5mb28sICJ3YiIpCisgICAgICAgIGZvYmoud3JpdGUoImZvbyIpCisgICAgICAgIGZvYmouY2xvc2UoKQorCisgICAgICAgIG9zLmxpbmsoc2VsZi5mb28sIHNlbGYuYmFyKQorCisgICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IikKKyAgICAgICAgc2VsZi50YXIuYWRkKHNlbGYuZm9vKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRhci5jbG9zZSgpCisgICAgICAgIG9zLnJlbW92ZShzZWxmLmZvbykKKyAgICAgICAgb3MucmVtb3ZlKHNlbGYuYmFyKQorCisgICAgZGVmIHRlc3RfYWRkX3R3aWNlKHNlbGYpOgorICAgICAgICAjIFRoZSBzYW1lIG5hbWUgd2lsbCBiZSBhZGRlZCBhcyBhIFJFR1RZUEUgZXZlcnkKKyAgICAgICAgIyB0aW1lIHJlZ2FyZGxlc3Mgb2Ygc3RfbmxpbmsuCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXR0YXJpbmZvKHNlbGYuZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby50eXBlID09IHRhcmZpbGUuUkVHVFlQRSwKKyAgICAgICAgICAgICAgICAiYWRkIGZpbGUgYXMgcmVndWxhciBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfYWRkX2hhcmRsaW5rKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0dGFyaW5mbyhzZWxmLmJhcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLkxOS1RZUEUsCisgICAgICAgICAgICAgICAgImFkZCBmaWxlIGFzIGhhcmRsaW5rIGZhaWxlZCIpCisKKyAgICBkZWYgdGVzdF9kZXJlZmVyZW5jZV9oYXJkbGluayhzZWxmKToKKyAgICAgICAgc2VsZi50YXIuZGVyZWZlcmVuY2UgPSBUcnVlCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXR0YXJpbmZvKHNlbGYuYmFyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby50eXBlID09IHRhcmZpbGUuUkVHVFlQRSwKKyAgICAgICAgICAgICAgICAiZGVyZWZlcmVuY2luZyBoYXJkbGluayBmYWlsZWQiKQorCisKK2NsYXNzIFBheFdyaXRlVGVzdChHTlVXcml0ZVRlc3QpOgorCisgICAgZGVmIF90ZXN0KHNlbGYsIG5hbWUsIGxpbms9Tm9uZSk6CisgICAgICAgICMgU2VlIEdOVVdyaXRlVGVzdC4KKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbyhuYW1lKQorICAgICAgICBpZiBsaW5rOgorICAgICAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9IGxpbmsKKyAgICAgICAgICAgIHRhcmluZm8udHlwZSA9IHRhcmZpbGUuTE5LVFlQRQorCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD10YXJmaWxlLlBBWF9GT1JNQVQpCisgICAgICAgIHRhci5hZGRmaWxlKHRhcmluZm8pCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUpCisgICAgICAgIGlmIGxpbms6CisgICAgICAgICAgICBsID0gdGFyLmdldG1lbWJlcnMoKVswXS5saW5rbmFtZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmsgPT0gbCwgIlBBWCBsb25nbGluayBjcmVhdGlvbiBmYWlsZWQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbiA9IHRhci5nZXRtZW1iZXJzKClbMF0ubmFtZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWUgPT0gbiwgIlBBWCBsb25nbmFtZSBjcmVhdGlvbiBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfcGF4X2dsb2JhbF9oZWFkZXIoc2VsZik6CisgICAgICAgIHBheF9oZWFkZXJzID0geworICAgICAgICAgICAgICAgIHUiZm9vIjogdSJiYXIiLAorICAgICAgICAgICAgICAgIHUidWlkIjogdSIwIiwKKyAgICAgICAgICAgICAgICB1Im10aW1lIjogdSIxLjIzIiwKKyAgICAgICAgICAgICAgICB1InRlc3QiOiB1IuT2/CIsCisgICAgICAgICAgICAgICAgdSLk9vwiOiB1InRlc3QifQorCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD10YXJmaWxlLlBBWF9GT1JNQVQsCisgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnM9cGF4X2hlYWRlcnMpCisgICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbygidGVzdCIpKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgICMgVGVzdCBpZiB0aGUgZ2xvYmFsIGhlYWRlciB3YXMgd3JpdHRlbiBjb3JyZWN0bHkuCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIucGF4X2hlYWRlcnMsIHBheF9oZWFkZXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRtZW1iZXJzKClbMF0ucGF4X2hlYWRlcnMsIHBheF9oZWFkZXJzKQorCisgICAgICAgICMgVGVzdCBpZiBhbGwgdGhlIGZpZWxkcyBhcmUgdW5pY29kZS4KKyAgICAgICAgZm9yIGtleSwgdmFsIGluIHRhci5wYXhfaGVhZGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGtleSkgaXMgdW5pY29kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHZhbCkgaXMgdW5pY29kZSkKKyAgICAgICAgICAgIGlmIGtleSBpbiB0YXJmaWxlLlBBWF9OVU1CRVJfRklFTERTOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdGFyZmlsZS5QQVhfTlVNQkVSX0ZJRUxEU1trZXldKHZhbCkKKyAgICAgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidW5hYmxlIHRvIGNvbnZlcnQgcGF4IGhlYWRlciBmaWVsZCIpCisKKyAgICBkZWYgdGVzdF9wYXhfZXh0ZW5kZWRfaGVhZGVyKHNlbGYpOgorICAgICAgICAjIFRoZSBmaWVsZHMgZnJvbSB0aGUgcGF4IGhlYWRlciBoYXZlIHByaW9yaXR5IG92ZXIgdGhlCisgICAgICAgICMgVGFySW5mby4KKyAgICAgICAgcGF4X2hlYWRlcnMgPSB7dSJwYXRoIjogdSJmb28iLCB1InVpZCI6IHUiMTIzIn0KKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFULCBlbmNvZGluZz0iaXNvODg1OS0xIikKKyAgICAgICAgdCA9IHRhcmZpbGUuVGFySW5mbygpCisgICAgICAgIHQubmFtZSA9IHUi5Pb8IiAgICAgIyBub24tQVNDSUkKKyAgICAgICAgdC51aWQgPSA4Kio4ICAgICAgICAjIHRvbyBsYXJnZQorICAgICAgICB0LnBheF9oZWFkZXJzID0gcGF4X2hlYWRlcnMKKyAgICAgICAgdGFyLmFkZGZpbGUodCkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgIHQgPSB0YXIuZ2V0bWVtYmVycygpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5wYXhfaGVhZGVycywgcGF4X2hlYWRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5uYW1lLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnVpZCwgMTIzKQorCisKK2NsYXNzIFVzdGFyVW5pY29kZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgQWxsICpVbmljb2RlVGVzdHMgRklYTUUKKworICAgIGZvcm1hdCA9IHRhcmZpbGUuVVNUQVJfRk9STUFUCisKKyAgICBkZWYgdGVzdF9pc284ODU5XzFfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfdW5pY29kZV9maWxlbmFtZSgiaXNvODg1OS0xIikKKworICAgIGRlZiB0ZXN0X3V0ZjdfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfdW5pY29kZV9maWxlbmFtZSgidXRmNyIpCisKKyAgICBkZWYgdGVzdF91dGY4X2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoInV0ZjgiKQorCisgICAgZGVmIF90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoc2VsZiwgZW5jb2RpbmcpOgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9c2VsZi5mb3JtYXQsIGVuY29kaW5nPWVuY29kaW5nLCBlcnJvcnM9InN0cmljdCIpCisgICAgICAgIG5hbWUgPSB1IuT2/CIKKyAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKG5hbWUpKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBlbmNvZGluZz1lbmNvZGluZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodGFyLmdldG5hbWVzKClbMF0pIGlzIG5vdCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRtZW1iZXJzKClbMF0ubmFtZSwgbmFtZS5lbmNvZGUoZW5jb2RpbmcpKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9maWxlbmFtZV9lcnJvcihzZWxmKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9InN0cmljdCIpCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oKQorCisgICAgICAgIHRhcmluZm8ubmFtZSA9ICLk9vwiCisgICAgICAgIGlmIHNlbGYuZm9ybWF0ID09IHRhcmZpbGUuUEFYX0ZPUk1BVDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdGFyLmFkZGZpbGUsIHRhcmluZm8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXIuYWRkZmlsZSh0YXJpbmZvKQorCisgICAgICAgIHRhcmluZm8ubmFtZSA9IHUi5Pb8IgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHRhci5hZGRmaWxlLCB0YXJpbmZvKQorCisgICAgICAgIHRhcmluZm8ubmFtZSA9ICJmb28iCisgICAgICAgIHRhcmluZm8udW5hbWUgPSB1IuT2/CIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB0YXIuYWRkZmlsZSwgdGFyaW5mbykKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfYXJndW1lbnQoc2VsZik6CisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCAiciIsIGVuY29kaW5nPSJpc284ODU5LTEiLCBlcnJvcnM9InN0cmljdCIpCisgICAgICAgIGZvciB0IGluIHRhcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHQubmFtZSkgaXMgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodC5saW5rbmFtZSkgaXMgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodC51bmFtZSkgaXMgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodC5nbmFtZSkgaXMgc3RyKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfdW5hbWVfdW5pY29kZShzZWxmKToKKyAgICAgICAgZm9yIG5hbWUgaW4gKHUi5Pb8IiwgIuT2/CIpOgorICAgICAgICAgICAgdCA9IHRhcmZpbGUuVGFySW5mbygiZm9vIikKKyAgICAgICAgICAgIHQudW5hbWUgPSBuYW1lCisgICAgICAgICAgICB0LmduYW1lID0gbmFtZQorCisgICAgICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKCJmb28udGFyIiwgbW9kZT0idyIsIGZpbGVvYmo9Zm9iaiwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz0iaXNvODg1OS0xIikKKyAgICAgICAgICAgIHRhci5hZGRmaWxlKHQpCisgICAgICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICAgICAgZm9iai5zZWVrKDApCisKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbigiZm9vLnRhciIsIGZpbGVvYmo9Zm9iaiwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgICAgICB0ID0gdGFyLmdldG1lbWJlcigiZm9vIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC51bmFtZSwgIuT2/CIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZ25hbWUsICLk9vwiKQorCisKK2NsYXNzIEdOVVVuaWNvZGVUZXN0KFVzdGFyVW5pY29kZVRlc3QpOgorCisgICAgZm9ybWF0ID0gdGFyZmlsZS5HTlVfRk9STUFUCisKKworY2xhc3MgUGF4VW5pY29kZVRlc3QoVXN0YXJVbmljb2RlVGVzdCk6CisKKyAgICBmb3JtYXQgPSB0YXJmaWxlLlBBWF9GT1JNQVQKKworICAgIGRlZiBfY3JlYXRlX3VuaWNvZGVfbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXNlbGYuZm9ybWF0KQorICAgICAgICB0ID0gdGFyZmlsZS5UYXJJbmZvKCkKKyAgICAgICAgdC5wYXhfaGVhZGVyc1sicGF0aCJdID0gbmFtZQorICAgICAgICB0YXIuYWRkZmlsZSh0KQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZXJyb3JfaGFuZGxlcnMoc2VsZik6CisgICAgICAgICMgVGVzdCBpZiB0aGUgdW5pY29kZSBlcnJvciBoYW5kbGVycyB3b3JrIGNvcnJlY3RseSBmb3IgY2hhcmFjdGVycworICAgICAgICAjIHRoYXQgY2Fubm90IGJlIGV4cHJlc3NlZCBpbiBhIGdpdmVuIGVuY29kaW5nLgorICAgICAgICBzZWxmLl9jcmVhdGVfdW5pY29kZV9uYW1lKHUi5Pb8IikKKworICAgICAgICBmb3IgaGFuZGxlciwgbmFtZSBpbiAoKCJ1dGYtOCIsIHUi5Pb8Ii5lbmNvZGUoInV0ZjgiKSksCisgICAgICAgICAgICAgICAgICAgICgicmVwbGFjZSIsICI/Pz8iKSwgKCJpZ25vcmUiLCAiIikpOgorICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGZvcm1hdD1zZWxmLmZvcm1hdCwgZW5jb2Rpbmc9ImFzY2lpIiwKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzPWhhbmRsZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRuYW1lcygpWzBdLCBuYW1lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdGFyZmlsZS5vcGVuLCB0bXBuYW1lLAorICAgICAgICAgICAgICAgIGVuY29kaW5nPSJhc2NpaSIsIGVycm9ycz0ic3RyaWN0IikKKworICAgIGRlZiB0ZXN0X2Vycm9yX2hhbmRsZXJfdXRmOChzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgYSBwYXRobmFtZSB0aGF0IGhhcyBvbmUgY29tcG9uZW50IHJlcHJlc2VudGFibGUgdXNpbmcKKyAgICAgICAgIyBpc284ODU5LTEgYW5kIHRoZSBvdGhlciBvbmx5IGluIGlzbzg4NTktMTUuCisgICAgICAgIHNlbGYuX2NyZWF0ZV91bmljb2RlX25hbWUodSLk9vwvpCIpCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGZvcm1hdD1zZWxmLmZvcm1hdCwgZW5jb2Rpbmc9Imlzbzg4NTktMSIsCisgICAgICAgICAgICAgICAgZXJyb3JzPSJ1dGYtOCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLmdldG5hbWVzKClbMF0sICLk9vwvIiArIHUipCIuZW5jb2RlKCJ1dGY4IikpCisKKworY2xhc3MgQXBwZW5kVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUZXN0IGFwcGVuZCBtb2RlIChjcC4gcGF0Y2ggIzE2NTI2ODEpLgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRhcm5hbWUgPSB0bXBuYW1lCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGFybmFtZSk6CisgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi50YXJuYW1lKQorCisgICAgZGVmIF9hZGRfdGVzdGZpbGUoc2VsZiwgZmlsZW9iaj1Ob25lKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgImEiLCBmaWxlb2JqPWZpbGVvYmopCisgICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbygiYmFyIikpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICBkZWYgX2NyZWF0ZV90ZXN0dGFyKHNlbGYsIG1vZGU9Inc6Iik6CisgICAgICAgIHNyYyA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikKKyAgICAgICAgdCA9IHNyYy5nZXRtZW1iZXIoInVzdGFyL3JlZ3R5cGUiKQorICAgICAgICB0Lm5hbWUgPSAiZm9vIgorICAgICAgICBmID0gc3JjLmV4dHJhY3RmaWxlKHQpCisgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsIG1vZGUpCisgICAgICAgIHRhci5hZGRmaWxlKHQsIGYpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICBkZWYgX3Rlc3Qoc2VsZiwgbmFtZXM9WyJiYXIiXSwgZmlsZW9iaj1Ob25lKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgZmlsZW9iaj1maWxlb2JqKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRuYW1lcygpLCBuYW1lcykKKworICAgIGRlZiB0ZXN0X25vbl9leGlzdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKCkKKyAgICAgICAgc2VsZi5fdGVzdCgpCisKKyAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKKyAgICAgICAgdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgInc6IikuY2xvc2UoKQorICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoKQorICAgICAgICBzZWxmLl90ZXN0KCkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2ZpbGVvYmooc2VsZik6CisgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTygiXDAiICogMTAyNCkKKyAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKGZvYmopCisgICAgICAgIGZvYmouc2VlaygwKQorICAgICAgICBzZWxmLl90ZXN0KGZpbGVvYmo9Zm9iaikKKworICAgIGRlZiB0ZXN0X2ZpbGVvYmooc2VsZik6CisgICAgICAgIHNlbGYuX2NyZWF0ZV90ZXN0dGFyKCkKKyAgICAgICAgZGF0YSA9IG9wZW4oc2VsZi50YXJuYW1lKS5yZWFkKCkKKyAgICAgICAgZm9iaiA9IFN0cmluZ0lPLlN0cmluZ0lPKGRhdGEpCisgICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZShmb2JqKQorICAgICAgICBmb2JqLnNlZWsoMCkKKyAgICAgICAgc2VsZi5fdGVzdChuYW1lcz1bImZvbyIsICJiYXIiXSwgZmlsZW9iaj1mb2JqKQorCisgICAgZGVmIHRlc3RfZXhpc3Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX2NyZWF0ZV90ZXN0dGFyKCkKKyAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKCkKKyAgICAgICAgc2VsZi5fdGVzdChuYW1lcz1bImZvbyIsICJiYXIiXSkKKworICAgIGRlZiB0ZXN0X2FwcGVuZF9neihzZWxmKToKKyAgICAgICAgaWYgZ3ppcCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2NyZWF0ZV90ZXN0dGFyKCJ3Omd6IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdG1wbmFtZSwgImEiKQorCisgICAgZGVmIHRlc3RfYXBwZW5kX2J6MihzZWxmKToKKyAgICAgICAgaWYgYnoyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fY3JlYXRlX3Rlc3R0YXIoInc6YnoyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdG1wbmFtZSwgImEiKQorCisgICAgIyBBcHBlbmQgbW9kZSBpcyBzdXBwb3NlZCB0byBmYWlsIGlmIHRoZSB0YXJmaWxlIHRvIGFwcGVuZCB0bworICAgICMgZG9lcyBub3QgZW5kIHdpdGggYSB6ZXJvIGJsb2NrLgorICAgIGRlZiBfdGVzdF9lcnJvcihzZWxmLCBkYXRhKToKKyAgICAgICAgb3BlbihzZWxmLnRhcm5hbWUsICJ3YiIpLndyaXRlKGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCBzZWxmLl9hZGRfdGVzdGZpbGUpCisKKyAgICBkZWYgdGVzdF9udWxsKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Vycm9yKCIiKQorCisgICAgZGVmIHRlc3RfaW5jb21wbGV0ZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9lcnJvcigiXDAiICogMTMpCisKKyAgICBkZWYgdGVzdF9wcmVtYXR1cmVfZW9mKHNlbGYpOgorICAgICAgICBkYXRhID0gdGFyZmlsZS5UYXJJbmZvKCJmb28iKS50b2J1ZigpCisgICAgICAgIHNlbGYuX3Rlc3RfZXJyb3IoZGF0YSkKKworICAgIGRlZiB0ZXN0X3RyYWlsaW5nX2dhcmJhZ2Uoc2VsZik6CisgICAgICAgIGRhdGEgPSB0YXJmaWxlLlRhckluZm8oImZvbyIpLnRvYnVmKCkKKyAgICAgICAgc2VsZi5fdGVzdF9lcnJvcihkYXRhICsgIlwwIiAqIDEzKQorCisgICAgZGVmIHRlc3RfaW52YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9lcnJvcigiYSIgKiA1MTIpCisKKworY2xhc3MgTGltaXRzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF91c3Rhcl9saW1pdHMoc2VsZik6CisgICAgICAgICMgMTAwIGNoYXIgbmFtZQorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIwMTIzNDU2Nzg5IiAqIDEwKQorICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuVVNUQVJfRk9STUFUKQorCisgICAgICAgICMgMTAxIGNoYXIgbmFtZSB0aGF0IGNhbm5vdCBiZSBzdG9yZWQKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMDEyMzQ1Njc4OSIgKiAxMCArICIwIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5VU1RBUl9GT1JNQVQpCisKKyAgICAgICAgIyAyNTYgY2hhciBuYW1lIHdpdGggYSBzbGFzaCBhdCBwb3MgMTU2CisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogNjIgKyAibG9uZ25hbWUiKQorICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuVVNUQVJfRk9STUFUKQorCisgICAgICAgICMgMjU2IGNoYXIgbmFtZSB0aGF0IGNhbm5vdCBiZSBzdG9yZWQKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzNDU2Ny8iICogMzEgKyAibG9uZ25hbWUiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKKworICAgICAgICAjIDUxMiBjaGFyIG5hbWUKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKKworICAgICAgICAjIDUxMiBjaGFyIGxpbmtuYW1lCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oImxvbmdsaW5rIikKKyAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9ICIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5VU1RBUl9GT1JNQVQpCisKKyAgICAgICAgIyB1aWQgPiA4IGRpZ2l0cworICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJuYW1lIikKKyAgICAgICAgdGFyaW5mby51aWQgPSAwMTAwMDAwMDAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5VU1RBUl9GT1JNQVQpCisKKyAgICBkZWYgdGVzdF9nbnVfbGltaXRzKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIpCisgICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5HTlVfRk9STUFUKQorCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oImxvbmdsaW5rIikKKyAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9ICIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIKKyAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLkdOVV9GT1JNQVQpCisKKyAgICAgICAgIyB1aWQgPj0gMjU2ICoqIDcKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibmFtZSIpCisgICAgICAgIHRhcmluZm8udWlkID0gMDQwMDAwMDAwMDAwMDAwMDAwMDBMCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuR05VX0ZPUk1BVCkKKworICAgIGRlZiB0ZXN0X3BheF9saW1pdHMoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogMTI2ICsgImxvbmduYW1lIikKKyAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLlBBWF9GT1JNQVQpCisKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibG9uZ2xpbmsiKQorICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gIjEyMy8iICogMTI2ICsgImxvbmduYW1lIgorICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuUEFYX0ZPUk1BVCkKKworICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJuYW1lIikKKyAgICAgICAgdGFyaW5mby51aWQgPSAwNDAwMDAwMDAwMDAwMDAwMDAwMEwKKyAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLlBBWF9GT1JNQVQpCisKKworY2xhc3MgQ29udGV4dE1hbmFnZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICB3aXRoIHRhcmZpbGUub3Blbih0YXJuYW1lKSBhcyB0YXI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHRhci5jbG9zZWQsICJjbG9zZWQgaW5zaWRlIHJ1bnRpbWUgY29udGV4dCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuY2xvc2VkLCAiY29udGV4dCBtYW5hZ2VyIGZhaWxlZCIpCisKKyAgICBkZWYgdGVzdF9jbG9zZWQoc2VsZik6CisgICAgICAgICMgVGhlIF9fZW50ZXJfXygpIG1ldGhvZCBpcyBzdXBwb3NlZCB0byByYWlzZSBJT0Vycm9yCisgICAgICAgICMgaWYgdGhlIFRhckZpbGUgb2JqZWN0IGlzIGFscmVhZHkgY2xvc2VkLgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yKToKKyAgICAgICAgICAgIHdpdGggdGFyOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgIyBUZXN0IGlmIHRoZSBJT0Vycm9yIGV4Y2VwdGlvbiBpcyBwYXNzZWQgdGhyb3VnaCBwcm9wZXJseS4KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24pIGFzIGV4YzoKKyAgICAgICAgICAgIHdpdGggdGFyZmlsZS5vcGVuKHRhcm5hbWUpIGFzIHRhcjoKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShleGMuZXhjZXB0aW9uLCBJT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIGV4Y2VwdGlvbiByYWlzZWQgaW4gY29udGV4dCBtYW5hZ2VyIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5jbG9zZWQsICJjb250ZXh0IG1hbmFnZXIgZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X25vX2VvZihzZWxmKToKKyAgICAgICAgIyBfX2V4aXRfXygpIG11c3Qgbm90IHdyaXRlIGVuZC1vZi1hcmNoaXZlIGJsb2NrcyBpZiBhbgorICAgICAgICAjIGV4Y2VwdGlvbiB3YXMgcmFpc2VkLgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIpIGFzIHRhcjoKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguZ2V0c2l6ZSh0bXBuYW1lKSwgMCwKKyAgICAgICAgICAgICAgICAiY29udGV4dCBtYW5hZ2VyIHdyb3RlIGFuIGVuZC1vZi1hcmNoaXZlIGJsb2NrIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5jbG9zZWQsICJjb250ZXh0IG1hbmFnZXIgZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X2VvZihzZWxmKToKKyAgICAgICAgIyBfX2V4aXRfXygpIG11c3Qgd3JpdGUgZW5kLW9mLWFyY2hpdmUgYmxvY2tzLCBpLmUuIGNhbGwKKyAgICAgICAgIyBUYXJGaWxlLmNsb3NlKCkgaWYgdGhlcmUgd2FzIG5vIGVycm9yLgorICAgICAgICB3aXRoIHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG9zLnBhdGguZ2V0c2l6ZSh0bXBuYW1lKSwgMCwKKyAgICAgICAgICAgICAgICAiY29udGV4dCBtYW5hZ2VyIHdyb3RlIG5vIGVuZC1vZi1hcmNoaXZlIGJsb2NrIikKKworICAgIGRlZiB0ZXN0X2ZpbGVvYmooc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IF9fZXhpdF9fKCkgZGlkIG5vdCBjbG9zZSB0aGUgZXh0ZXJuYWwgZmlsZQorICAgICAgICAjIG9iamVjdC4KKyAgICAgICAgZm9iaiA9IG9wZW4odG1wbmFtZSwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4oZmlsZW9iaj1mb2JqLCBtb2RlPSJ3IikgYXMgdGFyOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZm9iai5jbG9zZWQsICJleHRlcm5hbCBmaWxlIG9iamVjdCB3YXMgY2xvc2VkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5jbG9zZWQsICJjb250ZXh0IG1hbmFnZXIgZmFpbGVkIikKKyAgICAgICAgZm9iai5jbG9zZSgpCisKKworY2xhc3MgTGlua0VtdWxhdGlvblRlc3QoUmVhZFRlc3QpOgorCisgICAgIyBUZXN0IGZvciBpc3N1ZSAjODc0MSByZWdyZXNzaW9uLiBPbiBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydAorICAgICMgc3ltYm9saWMgb3IgaGFyZCBsaW5rcyB0YXJmaWxlIHRyaWVzIHRvIGV4dHJhY3QgdGhlc2UgdHlwZXMgb2YgbWVtYmVycyBhcworICAgICMgdGhlIHJlZ3VsYXIgZmlsZXMgdGhleSBwb2ludCB0by4KKyAgICBkZWYgX3Rlc3RfbGlua19leHRyYWN0aW9uKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLnRhci5leHRyYWN0KG5hbWUsIFRFTVBESVIpCisgICAgICAgIGRhdGEgPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCBuYW1lKSwgInJiIikucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWQ1c3VtKGRhdGEpLCBtZDVfcmVndHlwZSkKKworICAgIGRlZiB0ZXN0X2hhcmRsaW5rX2V4dHJhY3Rpb24xKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2xpbmtfZXh0cmFjdGlvbigidXN0YXIvbG5rdHlwZSIpCisKKyAgICBkZWYgdGVzdF9oYXJkbGlua19leHRyYWN0aW9uMihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9saW5rX2V4dHJhY3Rpb24oIi4vdXN0YXIvbGlua3Rlc3QyL2xua3R5cGUiKQorCisgICAgZGVmIHRlc3Rfc3ltbGlua19leHRyYWN0aW9uMShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9saW5rX2V4dHJhY3Rpb24oInVzdGFyL3N5bXR5cGUiKQorCisgICAgZGVmIHRlc3Rfc3ltbGlua19leHRyYWN0aW9uMihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9saW5rX2V4dHJhY3Rpb24oIi4vdXN0YXIvbGlua3Rlc3QyL3N5bXR5cGUiKQorCisKK2NsYXNzIEd6aXBNaXNjUmVhZFRlc3QoTWlzY1JlYWRUZXN0KToKKyAgICB0YXJuYW1lID0gZ3ppcG5hbWUKKyAgICBtb2RlID0gInI6Z3oiCitjbGFzcyBHemlwVXN0YXJSZWFkVGVzdChVc3RhclJlYWRUZXN0KToKKyAgICB0YXJuYW1lID0gZ3ppcG5hbWUKKyAgICBtb2RlID0gInI6Z3oiCitjbGFzcyBHemlwU3RyZWFtUmVhZFRlc3QoU3RyZWFtUmVhZFRlc3QpOgorICAgIHRhcm5hbWUgPSBnemlwbmFtZQorICAgIG1vZGUgPSAicnxneiIKK2NsYXNzIEd6aXBXcml0ZVRlc3QoV3JpdGVUZXN0KToKKyAgICBtb2RlID0gInc6Z3oiCitjbGFzcyBHemlwU3RyZWFtV3JpdGVUZXN0KFN0cmVhbVdyaXRlVGVzdCk6CisgICAgbW9kZSA9ICJ3fGd6IgorCisKK2NsYXNzIEJ6Mk1pc2NSZWFkVGVzdChNaXNjUmVhZFRlc3QpOgorICAgIHRhcm5hbWUgPSBiejJuYW1lCisgICAgbW9kZSA9ICJyOmJ6MiIKK2NsYXNzIEJ6MlVzdGFyUmVhZFRlc3QoVXN0YXJSZWFkVGVzdCk6CisgICAgdGFybmFtZSA9IGJ6Mm5hbWUKKyAgICBtb2RlID0gInI6YnoyIgorY2xhc3MgQnoyU3RyZWFtUmVhZFRlc3QoU3RyZWFtUmVhZFRlc3QpOgorICAgIHRhcm5hbWUgPSBiejJuYW1lCisgICAgbW9kZSA9ICJyfGJ6MiIKK2NsYXNzIEJ6MldyaXRlVGVzdChXcml0ZVRlc3QpOgorICAgIG1vZGUgPSAidzpiejIiCitjbGFzcyBCejJTdHJlYW1Xcml0ZVRlc3QoU3RyZWFtV3JpdGVUZXN0KToKKyAgICBtb2RlID0gInd8YnoyIgorCitjbGFzcyBCejJQYXJ0aWFsUmVhZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgSXNzdWU1MDY4OiBUaGUgX0JaMlByb3h5LnJlYWQoKSBtZXRob2QgbG9vcHMgZm9yZXZlcgorICAgICMgb24gYW4gZW1wdHkgb3IgcGFydGlhbCBiemlwcGVkIGZpbGUuCisKKyAgICBkZWYgX3Rlc3RfcGFydGlhbF9pbnB1dChzZWxmLCBtb2RlKToKKyAgICAgICAgY2xhc3MgTXlTdHJpbmdJTyhTdHJpbmdJTy5TdHJpbmdJTyk6CisgICAgICAgICAgICBoaXRfZW9mID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiByZWFkKHNlbGYsIG4pOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaGl0X2VvZjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoImluZmluaXRlIGxvb3AgZGV0ZWN0ZWQgaW4gdGFyZmlsZS5vcGVuKCkiKQorICAgICAgICAgICAgICAgIHNlbGYuaGl0X2VvZiA9IHNlbGYucG9zID09IHNlbGYubGVuCisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0lPLlN0cmluZ0lPLnJlYWQoc2VsZiwgbikKKyAgICAgICAgICAgIGRlZiBzZWVrKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBzZWxmLmhpdF9lb2YgPSBGYWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmdJTy5TdHJpbmdJTy5zZWVrKHNlbGYsICphcmdzKQorCisgICAgICAgIGRhdGEgPSBiejIuY29tcHJlc3ModGFyZmlsZS5UYXJJbmZvKCJmb28iKS50b2J1ZigpKQorICAgICAgICBmb3IgeCBpbiByYW5nZShsZW4oZGF0YSkgKyAxKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YXJmaWxlLm9wZW4oZmlsZW9iaj1NeVN0cmluZ0lPKGRhdGFbOnhdKSwgbW9kZT1tb2RlKQorICAgICAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MgIyB3ZSBoYXZlIG5vIGludGVyZXN0IGluIFJlYWRFcnJvcnMKKworICAgIGRlZiB0ZXN0X3BhcnRpYWxfaW5wdXQoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfcGFydGlhbF9pbnB1dCgiciIpCisKKyAgICBkZWYgdGVzdF9wYXJ0aWFsX2lucHV0X2J6MihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9wYXJ0aWFsX2lucHV0KCJyOmJ6MiIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIG9zLm1ha2VkaXJzKFRFTVBESVIpCisKKyAgICB0ZXN0cyA9IFsKKyAgICAgICAgVXN0YXJSZWFkVGVzdCwKKyAgICAgICAgTWlzY1JlYWRUZXN0LAorICAgICAgICBTdHJlYW1SZWFkVGVzdCwKKyAgICAgICAgRGV0ZWN0UmVhZFRlc3QsCisgICAgICAgIE1lbWJlclJlYWRUZXN0LAorICAgICAgICBHTlVSZWFkVGVzdCwKKyAgICAgICAgUGF4UmVhZFRlc3QsCisgICAgICAgIFdyaXRlVGVzdCwKKyAgICAgICAgU3RyZWFtV3JpdGVUZXN0LAorICAgICAgICBHTlVXcml0ZVRlc3QsCisgICAgICAgIFBheFdyaXRlVGVzdCwKKyAgICAgICAgVXN0YXJVbmljb2RlVGVzdCwKKyAgICAgICAgR05VVW5pY29kZVRlc3QsCisgICAgICAgIFBheFVuaWNvZGVUZXN0LAorICAgICAgICBBcHBlbmRUZXN0LAorICAgICAgICBMaW1pdHNUZXN0LAorICAgICAgICBDb250ZXh0TWFuYWdlclRlc3QsCisgICAgXQorCisgICAgaWYgaGFzYXR0cihvcywgImxpbmsiKToKKyAgICAgICAgdGVzdHMuYXBwZW5kKEhhcmRsaW5rVGVzdCkKKyAgICBlbHNlOgorICAgICAgICB0ZXN0cy5hcHBlbmQoTGlua0VtdWxhdGlvblRlc3QpCisKKyAgICBmb2JqID0gb3Blbih0YXJuYW1lLCAicmIiKQorICAgIGRhdGEgPSBmb2JqLnJlYWQoKQorICAgIGZvYmouY2xvc2UoKQorCisgICAgaWYgZ3ppcDoKKyAgICAgICAgIyBDcmVhdGUgdGVzdHRhci50YXIuZ3ogYW5kIGFkZCBnemlwLXNwZWNpZmljIHRlc3RzLgorICAgICAgICB0YXIgPSBnemlwLm9wZW4oZ3ppcG5hbWUsICJ3YiIpCisgICAgICAgIHRhci53cml0ZShkYXRhKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgIHRlc3RzICs9IFsKKyAgICAgICAgICAgIEd6aXBNaXNjUmVhZFRlc3QsCisgICAgICAgICAgICBHemlwVXN0YXJSZWFkVGVzdCwKKyAgICAgICAgICAgIEd6aXBTdHJlYW1SZWFkVGVzdCwKKyAgICAgICAgICAgIEd6aXBXcml0ZVRlc3QsCisgICAgICAgICAgICBHemlwU3RyZWFtV3JpdGVUZXN0LAorICAgICAgICBdCisKKyAgICBpZiBiejI6CisgICAgICAgICMgQ3JlYXRlIHRlc3R0YXIudGFyLmJ6MiBhbmQgYWRkIGJ6Mi1zcGVjaWZpYyB0ZXN0cy4KKyAgICAgICAgdGFyID0gYnoyLkJaMkZpbGUoYnoybmFtZSwgIndiIikKKyAgICAgICAgdGFyLndyaXRlKGRhdGEpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgdGVzdHMgKz0gWworICAgICAgICAgICAgQnoyTWlzY1JlYWRUZXN0LAorICAgICAgICAgICAgQnoyVXN0YXJSZWFkVGVzdCwKKyAgICAgICAgICAgIEJ6MlN0cmVhbVJlYWRUZXN0LAorICAgICAgICAgICAgQnoyV3JpdGVUZXN0LAorICAgICAgICAgICAgQnoyU3RyZWFtV3JpdGVUZXN0LAorICAgICAgICAgICAgQnoyUGFydGlhbFJlYWRUZXN0LAorICAgICAgICBdCisKKyAgICB0cnk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKFRFTVBESVIpOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURU1QRElSKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90YXJmaWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RhcmZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNGVjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90YXJmaWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90YXJmaWxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RhcmZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNGVjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90YXJmaWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90Y2wucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90Y2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlOWU2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RjbC5weQpAQCAtMCwwICsxLDE5MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworaW1wb3J0IG9zCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgUElQRQorCisjIFNraXAgdGhpcyB0ZXN0IGlmIHRoZSBfdGtpbnRlciBtb2R1bGUgd2Fzbid0IGJ1aWx0LgorX3RraW50ZXIgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnX3RraW50ZXInKQorCitmcm9tIFRraW50ZXIgaW1wb3J0IFRjbAorZnJvbSBfdGtpbnRlciBpbXBvcnQgVGNsRXJyb3IKKworCitjbGFzcyBUa2ludGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdEZsYXR0ZW5MZW4oc2VsZik6CisgICAgICAgICMgZmxhdHRlbig8b2JqZWN0IHdpdGggbm8gbGVuZ3RoPikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBfdGtpbnRlci5fZmxhdHRlbiwgVHJ1ZSkKKworCitjbGFzcyBUY2xUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5pbnRlcnAgPSBUY2woKQorCisgICAgZGVmIHRlc3RFdmFsKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICB0Y2wuZXZhbCgnc2V0IGEgMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ3NldCBhJyksJzEnKQorCisgICAgZGVmIHRlc3RFdmFsRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvcix0Y2wuZXZhbCwnc2V0IGEnKQorCisgICAgZGVmIHRlc3RFdmFsRXhjZXB0aW9uMihzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsdGNsLmV2YWwsJ3RoaXMgaXMgd3JvbmcnKQorCisgICAgZGVmIHRlc3RDYWxsKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICB0Y2wuY2FsbCgnc2V0JywnYScsJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5jYWxsKCdzZXQnLCdhJyksJzEnKQorCisgICAgZGVmIHRlc3RDYWxsRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvcix0Y2wuY2FsbCwnc2V0JywnYScpCisKKyAgICBkZWYgdGVzdENhbGxFeGNlcHRpb24yKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvcix0Y2wuY2FsbCwndGhpcycsJ2lzJywnd3JvbmcnKQorCisgICAgZGVmIHRlc3RTZXRWYXIoc2VsZik6CisgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCisgICAgICAgIHRjbC5zZXR2YXIoJ2EnLCcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2wuZXZhbCgnc2V0IGEnKSwnMScpCisKKyAgICBkZWYgdGVzdFNldFZhckFycmF5KHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICB0Y2wuc2V0dmFyKCdhKDEpJywnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ3NldCBhKDEpJyksJzEnKQorCisgICAgZGVmIHRlc3RHZXRWYXIoc2VsZik6CisgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCisgICAgICAgIHRjbC5ldmFsKCdzZXQgYSAxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2wuZ2V0dmFyKCdhJyksJzEnKQorCisgICAgZGVmIHRlc3RHZXRWYXJBcnJheShzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgdGNsLmV2YWwoJ3NldCBhKDEpIDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5nZXR2YXIoJ2EoMSknKSwnMScpCisKKyAgICBkZWYgdGVzdEdldFZhckV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsdGNsLmdldHZhciwnYScpCisKKyAgICBkZWYgdGVzdEdldFZhckFycmF5RXhjZXB0aW9uKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvcix0Y2wuZ2V0dmFyLCdhKDEpJykKKworICAgIGRlZiB0ZXN0VW5zZXRWYXIoc2VsZik6CisgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCisgICAgICAgIHRjbC5zZXR2YXIoJ2EnLDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ2luZm8gZXhpc3RzIGEnKSwnMScpCisgICAgICAgIHRjbC51bnNldHZhcignYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ2luZm8gZXhpc3RzIGEnKSwnMCcpCisKKyAgICBkZWYgdGVzdFVuc2V0VmFyQXJyYXkoc2VsZik6CisgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCisgICAgICAgIHRjbC5zZXR2YXIoJ2EoMSknLDEpCisgICAgICAgIHRjbC5zZXR2YXIoJ2EoMiknLDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ2luZm8gZXhpc3RzIGEoMSknKSwnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ2luZm8gZXhpc3RzIGEoMiknKSwnMScpCisgICAgICAgIHRjbC51bnNldHZhcignYSgxKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ2luZm8gZXhpc3RzIGEoMSknKSwnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ2luZm8gZXhpc3RzIGEoMiknKSwnMScpCisKKyAgICBkZWYgdGVzdFVuc2V0VmFyRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvcix0Y2wudW5zZXR2YXIsJ2EnKQorCisgICAgZGVmIHRlc3RFdmFsRmlsZShzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgZmlsZW5hbWUgPSAidGVzdEV2YWxGaWxlLnRjbCIKKyAgICAgICAgZmQgPSBvcGVuKGZpbGVuYW1lLCd3JykKKyAgICAgICAgc2NyaXB0ID0gIiIic2V0IGEgMQorICAgICAgICBzZXQgYiAyCisgICAgICAgIHNldCBjIFsgZXhwciAkYSArICRiIF0KKyAgICAgICAgIiIiCisgICAgICAgIGZkLndyaXRlKHNjcmlwdCkKKyAgICAgICAgZmQuY2xvc2UoKQorICAgICAgICB0Y2wuZXZhbGZpbGUoZmlsZW5hbWUpCisgICAgICAgIG9zLnJlbW92ZShmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2wuZXZhbCgnc2V0IGEnKSwnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ3NldCBiJyksJzInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5ldmFsKCdzZXQgYycpLCczJykKKworICAgIGRlZiB0ZXN0RXZhbEZpbGVFeGNlcHRpb24oc2VsZik6CisgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCisgICAgICAgIGZpbGVuYW1lID0gImRvZXNub3RleGlzdHMiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZShmaWxlbmFtZSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbixlOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvcix0Y2wuZXZhbGZpbGUsZmlsZW5hbWUpCisKKyAgICBkZWYgdGVzdFBhY2thZ2VSZXF1aXJlRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvcix0Y2wuZXZhbCwncGFja2FnZSByZXF1aXJlIERORScpCisKKyAgICBkZWYgdGVzdExvYWRXaXRoVU5DKHNlbGYpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnd2luMzInOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBCdWlsZCBhIFVOQyBwYXRoIGZyb20gdGhlIHJlZ3VsYXIgcGF0aC4KKyAgICAgICAgIyBTb21ldGhpbmcgbGlrZQorICAgICAgICAjICAgXFwlQ09NUFVURVJOQU1FJVxjJFxweXRob24yN1xweXRob24uZXhlCisKKyAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmFic3BhdGgoc3lzLmV4ZWN1dGFibGUpCisgICAgICAgIGlmIGZ1bGxuYW1lWzFdICE9ICc6JzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB1bmNfbmFtZSA9IHInXFwlc1wlcyRcJXMnICUgKG9zLmVudmlyb25bJ0NPTVBVVEVSTkFNRSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbG5hbWVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZVszOl0pCisKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudjoKKyAgICAgICAgICAgIGVudi51bnNldCgiVENMX0xJQlJBUlkiKQorICAgICAgICAgICAgY21kID0gJyVzIC1jICJpbXBvcnQgVGtpbnRlcjsgcHJpbnQgVGtpbnRlciInICUgKHVuY19uYW1lLCkKKworICAgICAgICAgICAgcCA9IFBvcGVuKGNtZCwgc3Rkb3V0PVBJUEUsIHN0ZGVycj1QSVBFKQorICAgICAgICAgICAgb3V0X2RhdGEsIGVycl9kYXRhID0gcC5jb21tdW5pY2F0ZSgpCisKKyAgICAgICAgICAgIG1zZyA9ICdcblxuJy5qb2luKFsnIlRraW50ZXIucHkiIG5vdCBpbiBvdXRwdXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb21tYW5kOicsIGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3Rkb3V0OicsIG91dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGRlcnI6JywgZXJyX2RhdGFdKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdUa2ludGVyLnB5Jywgb3V0X2RhdGEsIG1zZykKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLndhaXQoKSwgMCwgJ05vbi16ZXJvIGV4aXQgY29kZScpCisKKworICAgIGRlZiB0ZXN0X3Bhc3NpbmdfdmFsdWVzKHNlbGYpOgorICAgICAgICBkZWYgcGFzc1ZhbHVlKHZhbHVlKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmludGVycC5jYWxsKCdzZXQnLCAnXycsIHZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3NWYWx1ZShUcnVlKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUoRmFsc2UpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUoJ3N0cmluZycpLCAnc3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUoJ3N0cmluZ1x1MjBhYycpLCAnc3RyaW5nXHUyMGFjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUodSdzdHJpbmcnKSwgdSdzdHJpbmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3NWYWx1ZSh1J3N0cmluZ1x1MjBhYycpLCB1J3N0cmluZ1x1MjBhYycpCisgICAgICAgIGZvciBpIGluICgwLCAxLCAtMSwgaW50KDIqKjMxLTEpLCBpbnQoLTIqKjMxKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3NWYWx1ZShpKSwgaSkKKyAgICAgICAgZm9yIGYgaW4gKDAuMCwgMS4wLCAtMS4wLCAxLy8zLCAxLzMuMCwKKyAgICAgICAgICAgICAgICAgIHN5cy5mbG9hdF9pbmZvLm1pbiwgc3lzLmZsb2F0X2luZm8ubWF4LAorICAgICAgICAgICAgICAgICAgLXN5cy5mbG9hdF9pbmZvLm1pbiwgLXN5cy5mbG9hdF9pbmZvLm1heCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3NWYWx1ZShmKSwgZikKKyAgICAgICAgZm9yIGYgaW4gZmxvYXQoJ25hbicpLCBmbG9hdCgnaW5mJyksIC1mbG9hdCgnaW5mJyk6CisgICAgICAgICAgICBpZiBmICE9IGY6ICMgTmFOCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwYXNzVmFsdWUoZiksIGYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFzc1ZhbHVlKGYpLCBmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3NWYWx1ZSgoMSwgJzInLCAoMy40LCkpKSwgKDEsICcyJywgKDMuNCwpKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUY2xUZXN0LCBUa2ludGVyVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGNsLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RjbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2Zjc0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RjbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGNsLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RjbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI2Zjc0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RjbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZGI0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZWxuZXRsaWIucHkKQEAgLTAsMCArMSw0NTQgQEAKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCB0ZWxuZXRsaWIKK2ltcG9ydCB0aW1lCitpbXBvcnQgUXVldWUKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK3RocmVhZGluZyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQorCitIT1NUID0gdGVzdF9zdXBwb3J0LkhPU1QKK0VPRl9zaWdpbCA9IG9iamVjdCgpCisKK2RlZiBzZXJ2ZXIoZXZ0LCBzZXJ2LCBkYXRhcT1Ob25lKToKKyAgICAiIiIgT3BlbiBhIHRjcCBzZXJ2ZXIgaW4gdGhyZWUgc3RlcHMKKyAgICAgICAgMSkgc2V0IGV2dCB0byB0cnVlIHRvIGxldCB0aGUgcGFyZW50IGtub3cgd2UgYXJlIHJlYWR5CisgICAgICAgIDIpIFtvcHRpb25hbF0gaWYgaXMgbm90IEZhbHNlLCB3cml0ZSB0aGUgbGlzdCBvZiBkYXRhIGZyb20gZGF0YXEuZ2V0KCkKKyAgICAgICAgICAgdG8gdGhlIHNvY2tldC4KKyAgICAiIiIKKyAgICBzZXJ2Lmxpc3Rlbig1KQorICAgIGV2dC5zZXQoKQorICAgIHRyeToKKyAgICAgICAgY29ubiwgYWRkciA9IHNlcnYuYWNjZXB0KCkKKyAgICAgICAgaWYgZGF0YXE6CisgICAgICAgICAgICBkYXRhID0gJycKKyAgICAgICAgICAgIG5ld19kYXRhID0gZGF0YXEuZ2V0KFRydWUsIDAuNSkKKyAgICAgICAgICAgIGRhdGFxLnRhc2tfZG9uZSgpCisgICAgICAgICAgICBmb3IgaXRlbSBpbiBuZXdfZGF0YToKKyAgICAgICAgICAgICAgICBpZiBpdGVtID09IEVPRl9zaWdpbDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiB0eXBlKGl0ZW0pIGluIFtpbnQsIGZsb2F0XToKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcChpdGVtKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gaXRlbQorICAgICAgICAgICAgICAgIHdyaXR0ZW4gPSBjb25uLnNlbmQoZGF0YSkKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVt3cml0dGVuOl0KKyAgICAgICAgY29ubi5jbG9zZSgpCisgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICBwYXNzCisgICAgZmluYWxseToKKyAgICAgICAgc2Vydi5jbG9zZSgpCisKK2NsYXNzIEdlbmVyYWxUZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZXZ0ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dCg2MCkgICMgU2FmZXR5IG5ldC4gTG9vayBpc3N1ZSAxMTgxMgorICAgICAgICBzZWxmLnBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc29jaykKKyAgICAgICAgc2VsZi50aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZXJ2ZXIsIGFyZ3M9KHNlbGYuZXZ0LHNlbGYuc29jaykpCisgICAgICAgIHNlbGYudGhyZWFkLnNldERhZW1vbihUcnVlKQorICAgICAgICBzZWxmLnRocmVhZC5zdGFydCgpCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRocmVhZC5qb2luKCkKKworICAgIGRlZiB0ZXN0QmFzaWMoc2VsZik6CisgICAgICAgICMgY29ubmVjdHMKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHRlbG5ldC5zb2NrLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVsbmV0LnNvY2suZ2V0dGltZW91dCgpLCAzMCkKKyAgICAgICAgdGVsbmV0LnNvY2suY2xvc2UoKQorCisgICAgZGVmIHRlc3RUaW1lb3V0Tm9uZShzZWxmKToKKyAgICAgICAgIyBOb25lLCBoYXZpbmcgb3RoZXIgZGVmYXVsdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCwgdGltZW91dD1Ob25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZWxuZXQuc29jay5nZXR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgdGVsbmV0LnNvY2suY2xvc2UoKQorCisgICAgZGVmIHRlc3RUaW1lb3V0VmFsdWUoc2VsZik6CisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0LCB0aW1lb3V0PTMwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlbG5ldC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisgICAgICAgIHRlbG5ldC5zb2NrLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dE9wZW4oc2VsZik6CisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoKQorICAgICAgICB0ZWxuZXQub3BlbihIT1NULCBzZWxmLnBvcnQsIHRpbWVvdXQ9MzApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVsbmV0LnNvY2suZ2V0dGltZW91dCgpLCAzMCkKKyAgICAgICAgdGVsbmV0LnNvY2suY2xvc2UoKQorCitkZWYgX3JlYWRfc2V0VXAoc2VsZik6CisgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgIHNlbGYuZGF0YXEgPSBRdWV1ZS5RdWV1ZSgpCisgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDEwKQorICAgIHNlbGYucG9ydCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zb2NrKQorICAgIHNlbGYudGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VydmVyLCBhcmdzPShzZWxmLmV2dCxzZWxmLnNvY2ssIHNlbGYuZGF0YXEpKQorICAgIHNlbGYudGhyZWFkLnN0YXJ0KCkKKyAgICBzZWxmLmV2dC53YWl0KCkKKworZGVmIF9yZWFkX3RlYXJEb3duKHNlbGYpOgorICAgIHNlbGYudGhyZWFkLmpvaW4oKQorCitjbGFzcyBSZWFkVGVzdHMoVGVzdENhc2UpOgorICAgIHNldFVwID0gX3JlYWRfc2V0VXAKKyAgICB0ZWFyRG93biA9IF9yZWFkX3RlYXJEb3duCisKKyAgICAjIHVzZSBhIHNpbWlsYXIgYXBwcm9hY2ggdG8gdGVzdGluZyB0aW1lb3V0cyBhcyB0ZXN0X3RpbWVvdXQucHkKKyAgICAjIHRoZXNlIHdpbGwgbmV2ZXIgcGFzcyAxMDAlIGJ1dCBtYWtlIHRoZSBmdXp6IGJpZyBlbm91Z2ggdGhhdCBpdCBpcyByYXJlCisgICAgYmxvY2tfbG9uZyA9IDAuNgorICAgIGJsb2NrX3Nob3J0ID0gMC4zCisgICAgZGVmIHRlc3RfcmVhZF91bnRpbF9BKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgcmVhZF91bnRpbChleHBlY3RlZCwgW3RpbWVvdXRdKQorICAgICAgICAgIFJlYWQgdW50aWwgdGhlIGV4cGVjdGVkIHN0cmluZyBoYXMgYmVlbiBzZWVuLCBvciBhIHRpbWVvdXQgaXMKKyAgICAgICAgICBoaXQgKGRlZmF1bHQgaXMgbm8gdGltZW91dCk7IG1heSBibG9jay4KKyAgICAgICAgIiIiCisgICAgICAgIHdhbnQgPSBbJ3gnICogMTAsICdtYXRjaCcsICd5JyAqIDEwLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICBkYXRhID0gdGVsbmV0LnJlYWRfdW50aWwoJ21hdGNoJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAnJy5qb2luKHdhbnRbOi0yXSkpCisKKyAgICBkZWYgdGVzdF9yZWFkX3VudGlsX0Ioc2VsZik6CisgICAgICAgICMgdGVzdCB0aGUgdGltZW91dCAtIGl0IGRvZXMgTk9UIHJhaXNlIHNvY2tldC50aW1lb3V0CisgICAgICAgIHdhbnQgPSBbJ2hlbGxvJywgc2VsZi5ibG9ja19sb25nLCAnbm90IHNlZW4nLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICBkYXRhID0gdGVsbmV0LnJlYWRfdW50aWwoJ25vdCBzZWVuJywgc2VsZi5ibG9ja19zaG9ydCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCB3YW50WzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlbG5ldC5yZWFkX2FsbCgpLCAnbm90IHNlZW4nKQorCisgICAgZGVmIHRlc3RfcmVhZF91bnRpbF93aXRoX3BvbGwoc2VsZik6CisgICAgICAgICIiIlVzZSBzZWxlY3QucG9sbCgpIHRvIGltcGxlbWVudCB0ZWxuZXQucmVhZF91bnRpbCgpLiIiIgorICAgICAgICB3YW50ID0gWyd4JyAqIDEwLCAnbWF0Y2gnLCAneScgKiAxMCwgRU9GX3NpZ2lsXQorICAgICAgICBzZWxmLmRhdGFxLnB1dCh3YW50KQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgaWYgbm90IHRlbG5ldC5faGFzX3BvbGw6CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgnc2VsZWN0LnBvbGwoKSBpcyByZXF1aXJlZCcpCisgICAgICAgIHRlbG5ldC5faGFzX3BvbGwgPSBUcnVlCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIGRhdGEgPSB0ZWxuZXQucmVhZF91bnRpbCgnbWF0Y2gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICcnLmpvaW4od2FudFs6LTJdKSkKKworICAgIGRlZiB0ZXN0X3JlYWRfdW50aWxfd2l0aF9zZWxlY3Qoc2VsZik6CisgICAgICAgICIiIlVzZSBzZWxlY3Quc2VsZWN0KCkgdG8gaW1wbGVtZW50IHRlbG5ldC5yZWFkX3VudGlsKCkuIiIiCisgICAgICAgIHdhbnQgPSBbJ3gnICogMTAsICdtYXRjaCcsICd5JyAqIDEwLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICB0ZWxuZXQuX2hhc19wb2xsID0gRmFsc2UKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgZGF0YSA9IHRlbG5ldC5yZWFkX3VudGlsKCdtYXRjaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJycuam9pbih3YW50WzotMl0pKQorCisgICAgZGVmIHRlc3RfcmVhZF9hbGxfQShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIHJlYWRfYWxsKCkKKyAgICAgICAgICBSZWFkIGFsbCBkYXRhIHVudGlsIEVPRjsgbWF5IGJsb2NrLgorICAgICAgICAiIiIKKyAgICAgICAgd2FudCA9IFsneCcgKiA1MDAsICd5JyAqIDUwMCwgJ3onICogNTAwLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICBkYXRhID0gdGVsbmV0LnJlYWRfYWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAnJy5qb2luKHdhbnRbOi0xXSkpCisgICAgICAgIHJldHVybgorCisgICAgZGVmIF90ZXN0X2Jsb2NraW5nKHNlbGYsIGZ1bmMpOgorICAgICAgICBzZWxmLmRhdGFxLnB1dChbc2VsZi5ibG9ja19sb25nLCBFT0Zfc2lnaWxdKQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICBzdGFydCA9IHRpbWUudGltZSgpCisgICAgICAgIGRhdGEgPSBmdW5jKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuYmxvY2tfc2hvcnQgPD0gdGltZS50aW1lKCkgLSBzdGFydCkKKworICAgIGRlZiB0ZXN0X3JlYWRfYWxsX0Ioc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfYmxvY2tpbmcodGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpLnJlYWRfYWxsKQorCisgICAgZGVmIHRlc3RfcmVhZF9hbGxfQyhzZWxmKToKKyAgICAgICAgc2VsZi5kYXRhcS5wdXQoW0VPRl9zaWdpbF0pCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICB0ZWxuZXQucmVhZF9hbGwoKQorICAgICAgICB0ZWxuZXQucmVhZF9hbGwoKSAjIHNob3VsZG4ndCByYWlzZQorCisgICAgZGVmIHRlc3RfcmVhZF9zb21lX0Eoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICByZWFkX3NvbWUoKQorICAgICAgICAgIFJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUgb3IgRU9GOyBtYXkgYmxvY2suCisgICAgICAgICIiIgorICAgICAgICAjIHRlc3QgJ2F0IGxlYXN0IG9uZSBieXRlJworICAgICAgICB3YW50ID0gWyd4JyAqIDUwMCwgRU9GX3NpZ2lsXQorICAgICAgICBzZWxmLmRhdGFxLnB1dCh3YW50KQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgZGF0YSA9IHRlbG5ldC5yZWFkX2FsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGF0YSkgPj0gMSkKKworICAgIGRlZiB0ZXN0X3JlYWRfc29tZV9CKHNlbGYpOgorICAgICAgICAjIHRlc3QgRU9GCisgICAgICAgIHNlbGYuZGF0YXEucHV0KFtFT0Zfc2lnaWxdKQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgdGVsbmV0LnJlYWRfc29tZSgpKQorCisgICAgZGVmIHRlc3RfcmVhZF9zb21lX0Moc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfYmxvY2tpbmcodGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpLnJlYWRfc29tZSkKKworICAgIGRlZiBfdGVzdF9yZWFkX2FueV9lYWdlcl9BKHNlbGYsIGZ1bmNfbmFtZSk6CisgICAgICAgICIiIgorICAgICAgICByZWFkX3ZlcnlfZWFnZXIoKQorICAgICAgICAgIFJlYWQgYWxsIGRhdGEgYXZhaWxhYmxlIGFscmVhZHkgcXVldWVkIG9yIG9uIHRoZSBzb2NrZXQsCisgICAgICAgICAgd2l0aG91dCBibG9ja2luZy4KKyAgICAgICAgIiIiCisgICAgICAgIHdhbnQgPSBbc2VsZi5ibG9ja19sb25nLCAneCcgKiAxMDAsICd5JyAqIDEwMCwgRU9GX3NpZ2lsXQorICAgICAgICBleHBlY3RzID0gd2FudFsxXSArIHdhbnRbMl0KKyAgICAgICAgc2VsZi5kYXRhcS5wdXQod2FudCkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIGZ1bmMgPSBnZXRhdHRyKHRlbG5ldCwgZnVuY19uYW1lKQorICAgICAgICBkYXRhID0gJycKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkYXRhICs9IGZ1bmMoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHBlY3RzLnN0YXJ0c3dpdGgoZGF0YSkpCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RzLCBkYXRhKQorCisgICAgZGVmIF90ZXN0X3JlYWRfYW55X2VhZ2VyX0Ioc2VsZiwgZnVuY19uYW1lKToKKyAgICAgICAgIyB0ZXN0IEVPRgorICAgICAgICBzZWxmLmRhdGFxLnB1dChbRU9GX3NpZ2lsXSkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIHRpbWUuc2xlZXAoc2VsZi5ibG9ja19zaG9ydCkKKyAgICAgICAgZnVuYyA9IGdldGF0dHIodGVsbmV0LCBmdW5jX25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBmdW5jKQorCisgICAgIyByZWFkX2VhZ2VyIGFuZCByZWFkX3ZlcnlfZWFnZXIgbWFrZSB0aGUgc2FtZSBnYXVyYW50ZWVzCisgICAgIyAodGhleSBiZWhhdmUgZGlmZmVyZW50bHkgYnV0IHdlIG9ubHkgdGVzdCB0aGUgZ2F1cmFudGVlcykKKyAgICBkZWYgdGVzdF9yZWFkX3ZlcnlfZWFnZXJfQShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkX2FueV9lYWdlcl9BKCdyZWFkX3ZlcnlfZWFnZXInKQorICAgIGRlZiB0ZXN0X3JlYWRfdmVyeV9lYWdlcl9CKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRfYW55X2VhZ2VyX0IoJ3JlYWRfdmVyeV9lYWdlcicpCisgICAgZGVmIHRlc3RfcmVhZF9lYWdlcl9BKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRfYW55X2VhZ2VyX0EoJ3JlYWRfZWFnZXInKQorICAgIGRlZiB0ZXN0X3JlYWRfZWFnZXJfQihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkX2FueV9lYWdlcl9CKCdyZWFkX2VhZ2VyJykKKyAgICAjIE5CIC0tIHdlIG5lZWQgdG8gdGVzdCB0aGUgSUFDIGJsb2NrIHdoaWNoIGlzIG1lbnRpb25lZCBpbiB0aGUgZG9jc3RyaW5nCisgICAgIyBidXQgbm90IGluIHRoZSBtb2R1bGUgZG9jcworCisgICAgZGVmIF90ZXN0X3JlYWRfYW55X2xhenlfQihzZWxmLCBmdW5jX25hbWUpOgorICAgICAgICBzZWxmLmRhdGFxLnB1dChbRU9GX3NpZ2lsXSkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIGZ1bmMgPSBnZXRhdHRyKHRlbG5ldCwgZnVuY19uYW1lKQorICAgICAgICB0ZWxuZXQuZmlsbF9yYXdxKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGZ1bmMpCisKKyAgICBkZWYgdGVzdF9yZWFkX2xhenlfQShzZWxmKToKKyAgICAgICAgd2FudCA9IFsneCcgKiAxMDAsIEVPRl9zaWdpbF0KKyAgICAgICAgc2VsZi5kYXRhcS5wdXQod2FudCkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIHRpbWUuc2xlZXAoc2VsZi5ibG9ja19zaG9ydCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgdGVsbmV0LnJlYWRfbGF6eSgpKQorICAgICAgICBkYXRhID0gJycKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWFkX2RhdGEgPSB0ZWxuZXQucmVhZF9sYXp5KCkKKyAgICAgICAgICAgICAgICBkYXRhICs9IHJlYWRfZGF0YQorICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkX2RhdGE6CisgICAgICAgICAgICAgICAgICAgIHRlbG5ldC5maWxsX3Jhd3EoKQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod2FudFswXS5zdGFydHN3aXRoKGRhdGEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHdhbnRbMF0pCisKKyAgICBkZWYgdGVzdF9yZWFkX2xhenlfQihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkX2FueV9sYXp5X0IoJ3JlYWRfbGF6eScpCisKKyAgICBkZWYgdGVzdF9yZWFkX3ZlcnlfbGF6eV9BKHNlbGYpOgorICAgICAgICB3YW50ID0gWyd4JyAqIDEwMCwgRU9GX3NpZ2lsXQorICAgICAgICBzZWxmLmRhdGFxLnB1dCh3YW50KQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgdGltZS5zbGVlcChzZWxmLmJsb2NrX3Nob3J0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCB0ZWxuZXQucmVhZF92ZXJ5X2xhenkoKSkKKyAgICAgICAgZGF0YSA9ICcnCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVhZF9kYXRhID0gdGVsbmV0LnJlYWRfdmVyeV9sYXp5KCkKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZGF0YSArPSByZWFkX2RhdGEKKyAgICAgICAgICAgIGlmIG5vdCByZWFkX2RhdGE6CisgICAgICAgICAgICAgICAgdGVsbmV0LmZpbGxfcmF3cSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgdGVsbmV0LmNvb2tlZHEpCisgICAgICAgICAgICAgICAgdGVsbmV0LnByb2Nlc3NfcmF3cSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod2FudFswXS5zdGFydHN3aXRoKGRhdGEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHdhbnRbMF0pCisKKyAgICBkZWYgdGVzdF9yZWFkX3ZlcnlfbGF6eV9CKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRfYW55X2xhenlfQigncmVhZF92ZXJ5X2xhenknKQorCitjbGFzcyBuZWdvX2NvbGxlY3RvcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzYl9nZXR0ZXI9Tm9uZSk6CisgICAgICAgIHNlbGYuc2VlbiA9ICcnCisgICAgICAgIHNlbGYuc2JfZ2V0dGVyID0gc2JfZ2V0dGVyCisgICAgICAgIHNlbGYuc2Jfc2VlbiA9ICcnCisKKyAgICBkZWYgZG9fbmVnbyhzZWxmLCBzb2NrLCBjbWQsIG9wdCk6CisgICAgICAgIHNlbGYuc2VlbiArPSBjbWQgKyBvcHQKKyAgICAgICAgaWYgY21kID09IHRsLlNFIGFuZCBzZWxmLnNiX2dldHRlcjoKKyAgICAgICAgICAgIHNiX2RhdGEgPSBzZWxmLnNiX2dldHRlcigpCisgICAgICAgICAgICBzZWxmLnNiX3NlZW4gKz0gc2JfZGF0YQorCit0bCA9IHRlbG5ldGxpYgorY2xhc3MgT3B0aW9uVGVzdHMoVGVzdENhc2UpOgorICAgIHNldFVwID0gX3JlYWRfc2V0VXAKKyAgICB0ZWFyRG93biA9IF9yZWFkX3RlYXJEb3duCisgICAgIyBSRkMgODU0IGNvbW1hbmRzCisgICAgY21kcyA9IFt0bC5BTywgdGwuQVlULCB0bC5CUkssIHRsLkVDLCB0bC5FTCwgdGwuR0EsIHRsLklQLCB0bC5OT1BdCisKKyAgICBkZWYgX3Rlc3RfY29tbWFuZChzZWxmLCBkYXRhKToKKyAgICAgICAgIiIiIGhlbHBlciBmb3IgdGVzdGluZyBJQUMgKyBjbWQgIiIiCisgICAgICAgIHNlbGYuc2V0VXAoKQorICAgICAgICBzZWxmLmRhdGFxLnB1dChkYXRhKQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgbmVnbyA9IG5lZ29fY29sbGVjdG9yKCkKKyAgICAgICAgdGVsbmV0LnNldF9vcHRpb25fbmVnb3RpYXRpb25fY2FsbGJhY2sobmVnby5kb19uZWdvKQorICAgICAgICB0eHQgPSB0ZWxuZXQucmVhZF9hbGwoKQorICAgICAgICBjbWQgPSBuZWdvLnNlZW4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihjbWQpID4gMCkgIyB3ZSBleHBlY3QgYXQgbGVhc3Qgb25lIGNvbW1hbmQKKyAgICAgICAgc2VsZi5hc3NlcnRJbihjbWRbMF0sIHNlbGYuY21kcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWRbMV0sIHRsLk5PT1BUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbignJy5qb2luKGRhdGFbOi0xXSkpLCBsZW4odHh0ICsgY21kKSkKKyAgICAgICAgbmVnby5zYl9nZXR0ZXIgPSBOb25lICMgYnJlYWsgdGhlIG5lZ28gPT4gdGVsbmV0IGN5Y2xlCisgICAgICAgIHNlbGYudGVhckRvd24oKQorCisgICAgZGVmIHRlc3RfSUFDX2NvbW1hbmRzKHNlbGYpOgorICAgICAgICAjIHJlc2V0IG91ciBzZXR1cAorICAgICAgICBzZWxmLmRhdGFxLnB1dChbRU9GX3NpZ2lsXSkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIHNlbGYudGVhckRvd24oKQorCisgICAgICAgIGZvciBjbWQgaW4gc2VsZi5jbWRzOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9jb21tYW5kKFsneCcgKiAxMDAsIHRsLklBQyArIGNtZCwgJ3knKjEwMCwgRU9GX3NpZ2lsXSkKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfY29tbWFuZChbJ3gnICogMTAsIHRsLklBQyArIGNtZCwgJ3knKjEwLCBFT0Zfc2lnaWxdKQorICAgICAgICAgICAgc2VsZi5fdGVzdF9jb21tYW5kKFt0bC5JQUMgKyBjbWQsIEVPRl9zaWdpbF0pCisgICAgICAgICMgYWxsIGF0IG9uY2UKKyAgICAgICAgc2VsZi5fdGVzdF9jb21tYW5kKFt0bC5JQUMgKyBjbWQgZm9yIChjbWQpIGluIHNlbGYuY21kc10gKyBbRU9GX3NpZ2lsXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgdGVsbmV0LnJlYWRfc2JfZGF0YSgpKQorCisgICAgZGVmIHRlc3RfU0JfY29tbWFuZHMoc2VsZik6CisgICAgICAgICMgUkZDIDg1NSwgc3VibmVnb3RpYXRpb25zIHBvcnRpb24KKyAgICAgICAgc2VuZCA9IFt0bC5JQUMgKyB0bC5TQiArIHRsLklBQyArIHRsLlNFLAorICAgICAgICAgICAgICAgIHRsLklBQyArIHRsLlNCICsgdGwuSUFDICsgdGwuSUFDICsgdGwuSUFDICsgdGwuU0UsCisgICAgICAgICAgICAgICAgdGwuSUFDICsgdGwuU0IgKyB0bC5JQUMgKyB0bC5JQUMgKyAnYWEnICsgdGwuSUFDICsgdGwuU0UsCisgICAgICAgICAgICAgICAgdGwuSUFDICsgdGwuU0IgKyAnYmInICsgdGwuSUFDICsgdGwuSUFDICsgdGwuSUFDICsgdGwuU0UsCisgICAgICAgICAgICAgICAgdGwuSUFDICsgdGwuU0IgKyAnY2MnICsgdGwuSUFDICsgdGwuSUFDICsgJ2RkJyArIHRsLklBQyArIHRsLlNFLAorICAgICAgICAgICAgICAgIEVPRl9zaWdpbCwKKyAgICAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5kYXRhcS5wdXQoc2VuZCkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIG5lZ28gPSBuZWdvX2NvbGxlY3Rvcih0ZWxuZXQucmVhZF9zYl9kYXRhKQorICAgICAgICB0ZWxuZXQuc2V0X29wdGlvbl9uZWdvdGlhdGlvbl9jYWxsYmFjayhuZWdvLmRvX25lZ28pCisgICAgICAgIHR4dCA9IHRlbG5ldC5yZWFkX2FsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHh0LCAnJykKKyAgICAgICAgd2FudF9zYl9kYXRhID0gdGwuSUFDICsgdGwuSUFDICsgJ2FhYmInICsgdGwuSUFDICsgJ2NjJyArIHRsLklBQyArICdkZCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZWdvLnNiX3NlZW4sIHdhbnRfc2JfZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgdGVsbmV0LnJlYWRfc2JfZGF0YSgpKQorICAgICAgICBuZWdvLnNiX2dldHRlciA9IE5vbmUgIyBicmVhayB0aGUgbmVnbyA9PiB0ZWxuZXQgY3ljbGUKKworCitjbGFzcyBFeHBlY3RUZXN0cyhUZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmV2dCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuZGF0YXEgPSBRdWV1ZS5RdWV1ZSgpCisgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoMTApCisgICAgICAgIHNlbGYucG9ydCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zb2NrKQorICAgICAgICBzZWxmLnRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlcnZlciwgYXJncz0oc2VsZi5ldnQsc2VsZi5zb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhcSkpCisgICAgICAgIHNlbGYudGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5ldnQud2FpdCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGhyZWFkLmpvaW4oKQorCisgICAgIyB1c2UgYSBzaW1pbGFyIGFwcHJvYWNoIHRvIHRlc3RpbmcgdGltZW91dHMgYXMgdGVzdF90aW1lb3V0LnB5CisgICAgIyB0aGVzZSB3aWxsIG5ldmVyIHBhc3MgMTAwJSBidXQgbWFrZSB0aGUgZnV6eiBiaWcgZW5vdWdoIHRoYXQgaXQgaXMgcmFyZQorICAgIGJsb2NrX2xvbmcgPSAwLjYKKyAgICBibG9ja19zaG9ydCA9IDAuMworICAgIGRlZiB0ZXN0X2V4cGVjdF9BKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgZXhwZWN0KGV4cGVjdGVkLCBbdGltZW91dF0pCisgICAgICAgICAgUmVhZCB1bnRpbCB0aGUgZXhwZWN0ZWQgc3RyaW5nIGhhcyBiZWVuIHNlZW4sIG9yIGEgdGltZW91dCBpcworICAgICAgICAgIGhpdCAoZGVmYXVsdCBpcyBubyB0aW1lb3V0KTsgbWF5IGJsb2NrLgorICAgICAgICAiIiIKKyAgICAgICAgd2FudCA9IFsneCcgKiAxMCwgJ21hdGNoJywgJ3knICogMTAsIEVPRl9zaWdpbF0KKyAgICAgICAgc2VsZi5kYXRhcS5wdXQod2FudCkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIChfLF8sZGF0YSkgPSB0ZWxuZXQuZXhwZWN0KFsnbWF0Y2gnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAnJy5qb2luKHdhbnRbOi0yXSkpCisKKyAgICBkZWYgdGVzdF9leHBlY3RfQihzZWxmKToKKyAgICAgICAgIyB0ZXN0IHRoZSB0aW1lb3V0IC0gaXQgZG9lcyBOT1QgcmFpc2Ugc29ja2V0LnRpbWVvdXQKKyAgICAgICAgd2FudCA9IFsnaGVsbG8nLCBzZWxmLmJsb2NrX2xvbmcsICdub3Qgc2VlbicsIEVPRl9zaWdpbF0KKyAgICAgICAgc2VsZi5kYXRhcS5wdXQod2FudCkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIChfLF8sZGF0YSkgPSB0ZWxuZXQuZXhwZWN0KFsnbm90IHNlZW4nXSwgc2VsZi5ibG9ja19zaG9ydCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCB3YW50WzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlbG5ldC5yZWFkX2FsbCgpLCAnbm90IHNlZW4nKQorCisgICAgZGVmIHRlc3RfZXhwZWN0X3dpdGhfcG9sbChzZWxmKToKKyAgICAgICAgIiIiVXNlIHNlbGVjdC5wb2xsKCkgdG8gaW1wbGVtZW50IHRlbG5ldC5leHBlY3QoKS4iIiIKKyAgICAgICAgd2FudCA9IFsneCcgKiAxMCwgJ21hdGNoJywgJ3knICogMTAsIEVPRl9zaWdpbF0KKyAgICAgICAgc2VsZi5kYXRhcS5wdXQod2FudCkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIGlmIG5vdCB0ZWxuZXQuX2hhc19wb2xsOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ3NlbGVjdC5wb2xsKCkgaXMgcmVxdWlyZWQnKQorICAgICAgICB0ZWxuZXQuX2hhc19wb2xsID0gVHJ1ZQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICAoXyxfLGRhdGEpID0gdGVsbmV0LmV4cGVjdChbJ21hdGNoJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJycuam9pbih3YW50WzotMl0pKQorCisgICAgZGVmIHRlc3RfZXhwZWN0X3dpdGhfc2VsZWN0KHNlbGYpOgorICAgICAgICAiIiJVc2Ugc2VsZWN0LnNlbGVjdCgpIHRvIGltcGxlbWVudCB0ZWxuZXQuZXhwZWN0KCkuIiIiCisgICAgICAgIHdhbnQgPSBbJ3gnICogMTAsICdtYXRjaCcsICd5JyAqIDEwLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICB0ZWxuZXQuX2hhc19wb2xsID0gRmFsc2UKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgKF8sXyxkYXRhKSA9IHRlbG5ldC5leHBlY3QoWydtYXRjaCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICcnLmpvaW4od2FudFs6LTJdKSkKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChHZW5lcmFsVGVzdHMsIFJlYWRUZXN0cywgT3B0aW9uVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbG5ldGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3M2Y5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbG5ldGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbG5ldGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3M2Y5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbG5ldGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGVtcGZpbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZW1wZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGQyM2FkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGVtcGZpbGUucHkKQEAgLTAsMCArMSw5NjUgQEAKKyMgdGVtcGZpbGUucHkgdW5pdCB0ZXN0cy4KK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IGVycm5vCitpbXBvcnQgaW8KK2ltcG9ydCBvcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHNodXRpbAoraW1wb3J0IHN5cworaW1wb3J0IHJlCitpbXBvcnQgd2FybmluZ3MKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0CisKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9UnVudGltZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSJta3RlbXAiLCBtb2R1bGU9X19uYW1lX18pCisKK2lmIGhhc2F0dHIob3MsICdzdGF0Jyk6CisgICAgaW1wb3J0IHN0YXQKKyAgICBoYXNfc3RhdCA9IDEKK2Vsc2U6CisgICAgaGFzX3N0YXQgPSAwCisKK2hhc190ZXh0bW9kZSA9ICh0ZW1wZmlsZS5fdGV4dF9vcGVuZmxhZ3MgIT0gdGVtcGZpbGUuX2Jpbl9vcGVuZmxhZ3MpCitoYXNfc3Bhd25sID0gaGFzYXR0cihvcywgJ3NwYXdubCcpCisKKyMgVEVTVF9GSUxFUyBtYXkgbmVlZCB0byBiZSB0d2Vha2VkIGZvciBzeXN0ZW1zIGRlcGVuZGluZyBvbiB0aGUgbWF4aW11bQorIyBudW1iZXIgb2YgZmlsZXMgdGhhdCBjYW4gYmUgb3BlbmVkIGF0IG9uZSB0aW1lIChzZWUgdWxpbWl0IC1uKQoraWYgc3lzLnBsYXRmb3JtIGluICgnb3BlbmJzZDMnLCAnb3BlbmJzZDQnKToKKyAgICBURVNUX0ZJTEVTID0gNDgKK2Vsc2U6CisgICAgVEVTVF9GSUxFUyA9IDEwMAorCisjIFRoaXMgaXMgb3JnYW5pemVkIGFzIG9uZSB0ZXN0IGZvciBlYWNoIGNodW5rIG9mIGNvZGUgaW4gdGVtcGZpbGUucHksCisjIGluIG9yZGVyIG9mIHRoZWlyIGFwcGVhcmFuY2UgaW4gdGhlIGZpbGUuICBUZXN0aW5nIHdoaWNoIHJlcXVpcmVzCisjIHRocmVhZHMgaXMgbm90IGRvbmUgaGVyZS4KKworIyBDb21tb24gZnVuY3Rpb25hbGl0eS4KK2NsYXNzIFRDKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIHN0cl9jaGVjayA9IHJlLmNvbXBpbGUociJbYS16QS1aMC05Xy1dezZ9JCIpCisKKyAgICBkZWYgZmFpbE9uRXhjZXB0aW9uKHNlbGYsIHdoYXQsIGVpPU5vbmUpOgorICAgICAgICBpZiBlaSBpcyBOb25lOgorICAgICAgICAgICAgZWkgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICBzZWxmLmZhaWwoIiVzIHJhaXNlZCAlczogJXMiICUgKHdoYXQsIGVpWzBdLCBlaVsxXSkpCisKKyAgICBkZWYgbmFtZUNoZWNrKHNlbGYsIG5hbWUsIGRpciwgcHJlLCBzdWYpOgorICAgICAgICAobmRpciwgbmJhc2UpID0gb3MucGF0aC5zcGxpdChuYW1lKQorICAgICAgICBucHJlICA9IG5iYXNlWzpsZW4ocHJlKV0KKyAgICAgICAgbnN1ZiAgPSBuYmFzZVtsZW4obmJhc2UpLWxlbihzdWYpOl0KKworICAgICAgICAjIGNoZWNrIGZvciBlcXVhbGl0eSBvZiB0aGUgYWJzb2x1dGUgcGF0aHMhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5hYnNwYXRoKG5kaXIpLCBvcy5wYXRoLmFic3BhdGgoZGlyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSAnJXMnIG5vdCBpbiBkaXJlY3RvcnkgJyVzJyIgJSAobmFtZSwgZGlyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucHJlLCBwcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgJyVzJyBkb2VzIG5vdCBiZWdpbiB3aXRoICclcyciICUgKG5iYXNlLCBwcmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zdWYsIHN1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSAnJXMnIGRvZXMgbm90IGVuZCB3aXRoICclcyciICUgKG5iYXNlLCBzdWYpKQorCisgICAgICAgIG5iYXNlID0gbmJhc2VbbGVuKHByZSk6bGVuKG5iYXNlKS1sZW4oc3VmKV0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuc3RyX2NoZWNrLm1hdGNoKG5iYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICJyYW5kb20gc3RyaW5nICclcycgZG9lcyBub3QgbWF0Y2ggL15bYS16QS1aMC05Xy1dezZ9JC8iCisgICAgICAgICAgICAgICAgICAgICAlIG5iYXNlKQorCit0ZXN0X2NsYXNzZXMgPSBbXQorCitjbGFzcyB0ZXN0X2V4cG9ydHMoVEMpOgorICAgIGRlZiB0ZXN0X2V4cG9ydHMoc2VsZik6CisgICAgICAgICMgVGhlcmUgYXJlIG5vIHN1cnByaXNpbmcgc3ltYm9scyBpbiB0aGUgdGVtcGZpbGUgbW9kdWxlCisgICAgICAgIGRpY3QgPSB0ZW1wZmlsZS5fX2RpY3RfXworCisgICAgICAgIGV4cGVjdGVkID0geworICAgICAgICAgICAgIk5hbWVkVGVtcG9yYXJ5RmlsZSIgOiAxLAorICAgICAgICAgICAgIlRlbXBvcmFyeUZpbGUiIDogMSwKKyAgICAgICAgICAgICJta3N0ZW1wIiA6IDEsCisgICAgICAgICAgICAibWtkdGVtcCIgOiAxLAorICAgICAgICAgICAgIm1rdGVtcCIgOiAxLAorICAgICAgICAgICAgIlRNUF9NQVgiIDogMSwKKyAgICAgICAgICAgICJnZXR0ZW1wcHJlZml4IiA6IDEsCisgICAgICAgICAgICAiZ2V0dGVtcGRpciIgOiAxLAorICAgICAgICAgICAgInRlbXBkaXIiIDogMSwKKyAgICAgICAgICAgICJ0ZW1wbGF0ZSIgOiAxLAorICAgICAgICAgICAgIlNwb29sZWRUZW1wb3JhcnlGaWxlIiA6IDEKKyAgICAgICAgfQorCisgICAgICAgIHVuZXhwID0gW10KKyAgICAgICAgZm9yIGtleSBpbiBkaWN0OgorICAgICAgICAgICAgaWYga2V5WzBdICE9ICdfJyBhbmQga2V5IG5vdCBpbiBleHBlY3RlZDoKKyAgICAgICAgICAgICAgICB1bmV4cC5hcHBlbmQoa2V5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHVuZXhwKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQga2V5czogJXMiICUgdW5leHApCisKK3Rlc3RfY2xhc3Nlcy5hcHBlbmQodGVzdF9leHBvcnRzKQorCisKK2NsYXNzIHRlc3RfX1JhbmRvbU5hbWVTZXF1ZW5jZShUQyk6CisgICAgIiIiVGVzdCB0aGUgaW50ZXJuYWwgaXRlcmF0b3Igb2JqZWN0IF9SYW5kb21OYW1lU2VxdWVuY2UuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuciA9IHRlbXBmaWxlLl9SYW5kb21OYW1lU2VxdWVuY2UoKQorCisgICAgZGVmIHRlc3RfZ2V0X3NpeF9jaGFyX3N0cihzZWxmKToKKyAgICAgICAgIyBfUmFuZG9tTmFtZVNlcXVlbmNlIHJldHVybnMgYSBzaXgtY2hhcmFjdGVyIHN0cmluZworICAgICAgICBzID0gc2VsZi5yLm5leHQoKQorICAgICAgICBzZWxmLm5hbWVDaGVjayhzLCAnJywgJycsICcnKQorCisgICAgZGVmIHRlc3RfbWFueShzZWxmKToKKyAgICAgICAgIyBfUmFuZG9tTmFtZVNlcXVlbmNlIHJldHVybnMgbm8gZHVwbGljYXRlIHN0cmluZ3MgKHN0b2NoYXN0aWMpCisKKyAgICAgICAgZGljdCA9IHt9CisgICAgICAgIHIgPSBzZWxmLnIKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKFRFU1RfRklMRVMpOgorICAgICAgICAgICAgcyA9IHIubmV4dCgpCisgICAgICAgICAgICBzZWxmLm5hbWVDaGVjayhzLCAnJywgJycsICcnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihzLCBkaWN0KQorICAgICAgICAgICAgZGljdFtzXSA9IDEKKworICAgIGRlZiB0ZXN0X3N1cHBvcnRzX2l0ZXIoc2VsZik6CisgICAgICAgICMgX1JhbmRvbU5hbWVTZXF1ZW5jZSBzdXBwb3J0cyB0aGUgaXRlcmF0b3IgcHJvdG9jb2wKKworICAgICAgICBpID0gMAorICAgICAgICByID0gc2VsZi5yCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBzIGluIHI6CisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAgICAgaWYgaSA9PSAyMDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsT25FeGNlcHRpb24oIml0ZXJhdGlvbiIpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnZm9yaycpLAorICAgICAgICAib3MuZm9yayBpcyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0IikKKyAgICBkZWYgdGVzdF9wcm9jZXNzX2F3YXJlbmVzcyhzZWxmKToKKyAgICAgICAgIyBlbnN1cmUgdGhhdCB0aGUgcmFuZG9tIHNvdXJjZSBkaWZmZXJzIGJldHdlZW4KKyAgICAgICAgIyBjaGlsZCBhbmQgcGFyZW50LgorICAgICAgICByZWFkX2ZkLCB3cml0ZV9mZCA9IG9zLnBpcGUoKQorICAgICAgICBwaWQgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgaWYgbm90IHBpZDoKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShyZWFkX2ZkKQorICAgICAgICAgICAgICAgIG9zLndyaXRlKHdyaXRlX2ZkLCBuZXh0KHNlbGYucikuZW5jb2RlKCJhc2NpaSIpKQorICAgICAgICAgICAgICAgIG9zLmNsb3NlKHdyaXRlX2ZkKQorICAgICAgICAgICAgICAgICMgYnlwYXNzIHRoZSBub3JtYWwgZXhpdCBoYW5kbGVycy0gbGVhdmUgdGhvc2UgdG8KKyAgICAgICAgICAgICAgICAjIHRoZSBwYXJlbnQuCisgICAgICAgICAgICAgICAgb3MuX2V4aXQoMCkKKyAgICAgICAgICAgIHBhcmVudF92YWx1ZSA9IG5leHQoc2VsZi5yKQorICAgICAgICAgICAgY2hpbGRfdmFsdWUgPSBvcy5yZWFkKHJlYWRfZmQsIGxlbihwYXJlbnRfdmFsdWUpKS5kZWNvZGUoImFzY2lpIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHBpZDoKKyAgICAgICAgICAgICAgICAjIGJlc3QgZWZmb3J0IHRvIGVuc3VyZSB0aGUgcHJvY2VzcyBjYW4ndCBibGVlZCBvdXQKKyAgICAgICAgICAgICAgICAjIHZpYSBhbnkgYnVncyBhYm92ZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdLSUxMKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBvcy5jbG9zZShyZWFkX2ZkKQorICAgICAgICAgICAgb3MuY2xvc2Uod3JpdGVfZmQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoY2hpbGRfdmFsdWUsIHBhcmVudF92YWx1ZSkKKworCit0ZXN0X2NsYXNzZXMuYXBwZW5kKHRlc3RfX1JhbmRvbU5hbWVTZXF1ZW5jZSkKKworCitjbGFzcyB0ZXN0X19jYW5kaWRhdGVfdGVtcGRpcl9saXN0KFRDKToKKyAgICAiIiJUZXN0IHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBfY2FuZGlkYXRlX3RlbXBkaXJfbGlzdC4iIiIKKworICAgIGRlZiB0ZXN0X25vbmVtcHR5X2xpc3Qoc2VsZik6CisgICAgICAgICMgX2NhbmRpZGF0ZV90ZW1wZGlyX2xpc3QgcmV0dXJucyBhIG5vbmVtcHR5IGxpc3Qgb2Ygc3RyaW5ncworCisgICAgICAgIGNhbmQgPSB0ZW1wZmlsZS5fY2FuZGlkYXRlX3RlbXBkaXJfbGlzdCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsZW4oY2FuZCkgPT0gMCkKKyAgICAgICAgZm9yIGMgaW4gY2FuZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShjLCBiYXNlc3RyaW5nKQorCisgICAgZGVmIHRlc3Rfd2FudGVkX2RpcnMoc2VsZik6CisgICAgICAgICMgX2NhbmRpZGF0ZV90ZW1wZGlyX2xpc3QgY29udGFpbnMgdGhlIGV4cGVjdGVkIGRpcmVjdG9yaWVzCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGludGVyZXN0aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgYWxsIHNldC4KKyAgICAgICAgd2l0aCBzdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnY6CisgICAgICAgICAgICBmb3IgZW52bmFtZSBpbiAnVE1QRElSJywgJ1RFTVAnLCAnVE1QJzoKKyAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MuZ2V0ZW52KGVudm5hbWUpCisgICAgICAgICAgICAgICAgaWYgbm90IGRpcm5hbWU6CisgICAgICAgICAgICAgICAgICAgIGVudltlbnZuYW1lXSA9IG9zLnBhdGguYWJzcGF0aChlbnZuYW1lKQorCisgICAgICAgICAgICBjYW5kID0gdGVtcGZpbGUuX2NhbmRpZGF0ZV90ZW1wZGlyX2xpc3QoKQorCisgICAgICAgICAgICBmb3IgZW52bmFtZSBpbiAnVE1QRElSJywgJ1RFTVAnLCAnVE1QJzoKKyAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MuZ2V0ZW52KGVudm5hbWUpCisgICAgICAgICAgICAgICAgaWYgbm90IGRpcm5hbWU6IHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGRpcm5hbWUsIGNhbmQpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIG9zLmVycm9yKToKKyAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MuY3VyZGlyCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZGlybmFtZSwgY2FuZCkKKworICAgICAgICAgICAgIyBOb3QgcHJhY3RpY2FsIHRvIHRyeSB0byB2ZXJpZnkgdGhlIHByZXNlbmNlIG9mIE9TLXNwZWNpZmljCisgICAgICAgICAgICAjIHBhdGhzIGluIHRoaXMgbGlzdC4KKwordGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X19jYW5kaWRhdGVfdGVtcGRpcl9saXN0KQorCisjIFdlIHRlc3QgX2dldF9kZWZhdWx0X3RlbXBkaXIgc29tZSBtb3JlIGJ5IHRlc3RpbmcgZ2V0dGVtcGRpci4KKworY2xhc3MgVGVzdEdldERlZmF1bHRUZW1wZGlyKFRDKToKKyAgICAiIiJUZXN0IF9nZXRfZGVmYXVsdF90ZW1wZGlyKCkuIiIiCisKKyAgICBkZWYgdGVzdF9ub19maWxlc19sZWZ0X2JlaGluZChzZWxmKToKKyAgICAgICAgIyB1c2UgYSBwcml2YXRlIGVtcHR5IGRpcmVjdG9yeQorICAgICAgICBvdXJfdGVtcF9kaXJlY3RvcnkgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBmb3JjZSBfZ2V0X2RlZmF1bHRfdGVtcGRpcigpIHRvIGNvbnNpZGVyIG91ciBlbXB0eSBkaXJlY3RvcnkKKyAgICAgICAgICAgIGRlZiBvdXJfY2FuZGlkYXRlX2xpc3QoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gW291cl90ZW1wX2RpcmVjdG9yeV0KKworICAgICAgICAgICAgd2l0aCBzdXBwb3J0LnN3YXBfYXR0cih0ZW1wZmlsZSwgIl9jYW5kaWRhdGVfdGVtcGRpcl9saXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3VyX2NhbmRpZGF0ZV9saXN0KToKKyAgICAgICAgICAgICAgICAjIHZlcmlmeSBvdXIgZGlyZWN0b3J5IGlzIGVtcHR5IGFmdGVyIF9nZXRfZGVmYXVsdF90ZW1wZGlyKCkKKyAgICAgICAgICAgICAgICB0ZW1wZmlsZS5fZ2V0X2RlZmF1bHRfdGVtcGRpcigpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5saXN0ZGlyKG91cl90ZW1wX2RpcmVjdG9yeSksIFtdKQorCisgICAgICAgICAgICAgICAgZGVmIHJhaXNlX09TRXJyb3IoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgT1NFcnJvcigtMSkKKworICAgICAgICAgICAgICAgIHdpdGggc3VwcG9ydC5zd2FwX2F0dHIoaW8sICJvcGVuIiwgcmFpc2VfT1NFcnJvcik6CisgICAgICAgICAgICAgICAgICAgICMgdGVzdCBhZ2FpbiB3aXRoIGZhaWxpbmcgaW8ub3BlbigpCisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvcikgYXMgY206CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZmlsZS5fZ2V0X2RlZmF1bHRfdGVtcGRpcigpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FTk9FTlQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MubGlzdGRpcihvdXJfdGVtcF9kaXJlY3RvcnkpLCBbXSkKKworICAgICAgICAgICAgICAgIG9wZW4gPSBpby5vcGVuCisgICAgICAgICAgICAgICAgZGVmIGJhZF93cml0ZXIoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICAgICAgZnAgPSBvcGVuKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUgPSByYWlzZV9PU0Vycm9yCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcAorCisgICAgICAgICAgICAgICAgd2l0aCBzdXBwb3J0LnN3YXBfYXR0cihpbywgIm9wZW4iLCBiYWRfd3JpdGVyKToKKyAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IGFnYWluIHdpdGggZmFpbGluZyB3cml0ZSgpCisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvcikgYXMgY206CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZmlsZS5fZ2V0X2RlZmF1bHRfdGVtcGRpcigpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FTk9FTlQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MubGlzdGRpcihvdXJfdGVtcF9kaXJlY3RvcnkpLCBbXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUob3VyX3RlbXBfZGlyZWN0b3J5KQorCit0ZXN0X2NsYXNzZXMuYXBwZW5kKFRlc3RHZXREZWZhdWx0VGVtcGRpcikKKworCitjbGFzcyB0ZXN0X19nZXRfY2FuZGlkYXRlX25hbWVzKFRDKToKKyAgICAiIiJUZXN0IHRoZSBpbnRlcm5hbCBmdW5jdGlvbiBfZ2V0X2NhbmRpZGF0ZV9uYW1lcy4iIiIKKworICAgIGRlZiB0ZXN0X3JldHZhbChzZWxmKToKKyAgICAgICAgIyBfZ2V0X2NhbmRpZGF0ZV9uYW1lcyByZXR1cm5zIGEgX1JhbmRvbU5hbWVTZXF1ZW5jZSBvYmplY3QKKyAgICAgICAgb2JqID0gdGVtcGZpbGUuX2dldF9jYW5kaWRhdGVfbmFtZXMoKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uob2JqLCB0ZW1wZmlsZS5fUmFuZG9tTmFtZVNlcXVlbmNlKQorCisgICAgZGVmIHRlc3Rfc2FtZV90aGluZyhzZWxmKToKKyAgICAgICAgIyBfZ2V0X2NhbmRpZGF0ZV9uYW1lcyBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSBvYmplY3QKKyAgICAgICAgYSA9IHRlbXBmaWxlLl9nZXRfY2FuZGlkYXRlX25hbWVzKCkKKyAgICAgICAgYiA9IHRlbXBmaWxlLl9nZXRfY2FuZGlkYXRlX25hbWVzKCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKQorCit0ZXN0X2NsYXNzZXMuYXBwZW5kKHRlc3RfX2dldF9jYW5kaWRhdGVfbmFtZXMpCisKKworY2xhc3MgdGVzdF9fbWtzdGVtcF9pbm5lcihUQyk6CisgICAgIiIiVGVzdCB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gX21rc3RlbXBfaW5uZXIuIiIiCisKKyAgICBjbGFzcyBta3N0ZW1wZWQ6CisgICAgICAgIF9iZmxhZ3MgPSB0ZW1wZmlsZS5fYmluX29wZW5mbGFncworICAgICAgICBfdGZsYWdzID0gdGVtcGZpbGUuX3RleHRfb3BlbmZsYWdzCisgICAgICAgIF9jbG9zZSA9IG9zLmNsb3NlCisgICAgICAgIF91bmxpbmsgPSBvcy51bmxpbmsKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZGlyLCBwcmUsIHN1ZiwgYmluKToKKyAgICAgICAgICAgIGlmIGJpbjogZmxhZ3MgPSBzZWxmLl9iZmxhZ3MKKyAgICAgICAgICAgIGVsc2U6ICAgZmxhZ3MgPSBzZWxmLl90ZmxhZ3MKKworICAgICAgICAgICAgKHNlbGYuZmQsIHNlbGYubmFtZSkgPSB0ZW1wZmlsZS5fbWtzdGVtcF9pbm5lcihkaXIsIHByZSwgc3VmLCBmbGFncykKKworICAgICAgICBkZWYgd3JpdGUoc2VsZiwgc3RyKToKKyAgICAgICAgICAgIG9zLndyaXRlKHNlbGYuZmQsIHN0cikKKworICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX2Nsb3NlKHNlbGYuZmQpCisgICAgICAgICAgICBzZWxmLl91bmxpbmsoc2VsZi5uYW1lKQorCisgICAgZGVmIGRvX2NyZWF0ZShzZWxmLCBkaXI9Tm9uZSwgcHJlPSIiLCBzdWY9IiIsIGJpbj0xKToKKyAgICAgICAgaWYgZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBkaXIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSA9IHNlbGYubWtzdGVtcGVkKGRpciwgcHJlLCBzdWYsIGJpbikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsT25FeGNlcHRpb24oIl9ta3N0ZW1wX2lubmVyIikKKworICAgICAgICBzZWxmLm5hbWVDaGVjayhmaWxlLm5hbWUsIGRpciwgcHJlLCBzdWYpCisgICAgICAgIHJldHVybiBmaWxlCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBfbWtzdGVtcF9pbm5lciBjYW4gY3JlYXRlIGZpbGVzCisgICAgICAgIHNlbGYuZG9fY3JlYXRlKCkud3JpdGUoImJsYXQiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShwcmU9ImEiKS53cml0ZSgiYmxhdCIpCisgICAgICAgIHNlbGYuZG9fY3JlYXRlKHN1Zj0iYiIpLndyaXRlKCJibGF0IikKKyAgICAgICAgc2VsZi5kb19jcmVhdGUocHJlPSJhIiwgc3VmPSJiIikud3JpdGUoImJsYXQiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShwcmU9ImFhIiwgc3VmPSIudHh0Iikud3JpdGUoImJsYXQiKQorCisgICAgZGVmIHRlc3RfYmFzaWNfbWFueShzZWxmKToKKyAgICAgICAgIyBfbWtzdGVtcF9pbm5lciBjYW4gY3JlYXRlIG1hbnkgZmlsZXMgKHN0b2NoYXN0aWMpCisgICAgICAgIGV4dGFudCA9IHJhbmdlKFRFU1RfRklMRVMpCisgICAgICAgIGZvciBpIGluIGV4dGFudDoKKyAgICAgICAgICAgIGV4dGFudFtpXSA9IHNlbGYuZG9fY3JlYXRlKHByZT0iYWEiKQorCisgICAgZGVmIHRlc3RfY2hvb3NlX2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgIyBfbWtzdGVtcF9pbm5lciBjYW4gY3JlYXRlIGZpbGVzIGluIGEgdXNlci1zZWxlY3RlZCBkaXJlY3RvcnkKKyAgICAgICAgZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZG9fY3JlYXRlKGRpcj1kaXIpLndyaXRlKCJibGF0IikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJtZGlyKGRpcikKKworICAgIGRlZiB0ZXN0X2ZpbGVfbW9kZShzZWxmKToKKyAgICAgICAgIyBfbWtzdGVtcF9pbm5lciBjcmVhdGVzIGZpbGVzIHdpdGggdGhlIHByb3BlciBtb2RlCisgICAgICAgIGlmIG5vdCBoYXNfc3RhdDoKKyAgICAgICAgICAgIHJldHVybiAgICAgICAgICAgICMgdWdoLCBjYW4ndCB1c2UgU2tpcFRlc3QuCisKKyAgICAgICAgZmlsZSA9IHNlbGYuZG9fY3JlYXRlKCkKKyAgICAgICAgbW9kZSA9IHN0YXQuU19JTU9ERShvcy5zdGF0KGZpbGUubmFtZSkuc3RfbW9kZSkKKyAgICAgICAgZXhwZWN0ZWQgPSAwNjAwCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ3dpbjMyJywgJ29zMmVteCcpOgorICAgICAgICAgICAgIyBUaGVyZSdzIG5vIGRpc3RpbmN0aW9uIGFtb25nICd1c2VyJywgJ2dyb3VwJyBhbmQgJ3dvcmxkJzsKKyAgICAgICAgICAgICMgcmVwbGljYXRlIHRoZSAndXNlcicgYml0cy4KKyAgICAgICAgICAgIHVzZXIgPSBleHBlY3RlZCA+PiA2CisgICAgICAgICAgICBleHBlY3RlZCA9IHVzZXIgKiAoMSArIDggKyA2NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2RlLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X25vaW5oZXJpdChzZWxmKToKKyAgICAgICAgIyBfbWtzdGVtcF9pbm5lciBmaWxlIGhhbmRsZXMgYXJlIG5vdCBpbmhlcml0ZWQgYnkgY2hpbGQgcHJvY2Vzc2VzCisgICAgICAgIGlmIG5vdCBoYXNfc3Bhd25sOgorICAgICAgICAgICAgcmV0dXJuICAgICAgICAgICAgIyB1Z2gsIGNhbid0IHVzZSBTa2lwVGVzdC4KKworICAgICAgICBpZiBzdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICB2PSJ2IgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdj0icSIKKworICAgICAgICBmaWxlID0gc2VsZi5kb19jcmVhdGUoKQorICAgICAgICBmZCA9ICIlZCIgJSBmaWxlLmZkCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWUgPSBfX2ZpbGVfXworICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgbWUgPSBzeXMuYXJndlswXQorCisgICAgICAgICMgV2UgaGF2ZSB0byBleGVjIHNvbWV0aGluZywgc28gdGhhdCBGRF9DTE9FWEVDIHdpbGwgdGFrZQorICAgICAgICAjIGVmZmVjdC4gIFRoZSBjb3JlIG9mIHRoaXMgdGVzdCBpcyB0aGVyZWZvcmUgaW4KKyAgICAgICAgIyB0Zl9pbmhlcml0X2NoZWNrLnB5LCB3aGljaCBzZWUuCisgICAgICAgIHRlc3RlciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKG1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGZfaW5oZXJpdF9jaGVjay5weSIpCisKKyAgICAgICAgIyBPbiBXaW5kb3dzIGEgc3Bhd24qIC9wYXRoLyB3aXRoIGVtYmVkZGVkIHNwYWNlcyBzaG91bGRuJ3QgYmUgcXVvdGVkLAorICAgICAgICAjIGJ1dCBhbiBhcmcgd2l0aCBlbWJlZGRlZCBzcGFjZXMgc2hvdWxkIGJlIGRlY29yYXRlZCB3aXRoIGRvdWJsZQorICAgICAgICAjIHF1b3RlcyBvbiBlYWNoIGVuZAorICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCd3aW4zMicsKToKKyAgICAgICAgICAgIGRlY29yYXRlZCA9ICciJXMiJyAlIHN5cy5leGVjdXRhYmxlCisgICAgICAgICAgICB0ZXN0ZXIgPSAnIiVzIicgJSB0ZXN0ZXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlY29yYXRlZCA9IHN5cy5leGVjdXRhYmxlCisKKyAgICAgICAgcmV0dmFsID0gb3Muc3Bhd25sKG9zLlBfV0FJVCwgc3lzLmV4ZWN1dGFibGUsIGRlY29yYXRlZCwgdGVzdGVyLCB2LCBmZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXR2YWwgPCAwLAorICAgICAgICAgICAgICAgICAgICAiY2hpbGQgcHJvY2VzcyBjYXVnaHQgZmF0YWwgc2lnbmFsICVkIiAlIC1yZXR2YWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmV0dmFsID4gMCwgImNoaWxkIHByb2Nlc3MgcmVwb3J0cyBmYWlsdXJlICVkIiVyZXR2YWwpCisKKyAgICBkZWYgdGVzdF90ZXh0bW9kZShzZWxmKToKKyAgICAgICAgIyBfbWtzdGVtcF9pbm5lciBjYW4gY3JlYXRlIGZpbGVzIGluIHRleHQgbW9kZQorICAgICAgICBpZiBub3QgaGFzX3RleHRtb2RlOgorICAgICAgICAgICAgcmV0dXJuICAgICAgICAgICAgIyB1Z2gsIGNhbid0IHVzZSBTa2lwVGVzdC4KKworICAgICAgICBzZWxmLmRvX2NyZWF0ZShiaW49MCkud3JpdGUoImJsYXRcbiIpCisgICAgICAgICMgWFhYIHNob3VsZCB0ZXN0IHRoYXQgdGhlIGZpbGUgcmVhbGx5IGlzIGEgdGV4dCBmaWxlCisKK3Rlc3RfY2xhc3Nlcy5hcHBlbmQodGVzdF9fbWtzdGVtcF9pbm5lcikKKworCitjbGFzcyB0ZXN0X2dldHRlbXBwcmVmaXgoVEMpOgorICAgICIiIlRlc3QgZ2V0dGVtcHByZWZpeCgpLiIiIgorCisgICAgZGVmIHRlc3Rfc2FuZV90ZW1wbGF0ZShzZWxmKToKKyAgICAgICAgIyBnZXR0ZW1wcHJlZml4IHJldHVybnMgYSBub25lbXB0eSBwcmVmaXggc3RyaW5nCisgICAgICAgIHAgPSB0ZW1wZmlsZS5nZXR0ZW1wcHJlZml4KCkKKworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocCwgYmFzZXN0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihwKSA+IDApCisKKyAgICBkZWYgdGVzdF91c2FibGVfdGVtcGxhdGUoc2VsZik6CisgICAgICAgICMgZ2V0dGVtcHByZWZpeCByZXR1cm5zIGEgdXNhYmxlIHByZWZpeCBzdHJpbmcKKworICAgICAgICAjIENyZWF0ZSBhIHRlbXAgZGlyZWN0b3J5LCBhdm9pZGluZyB1c2Ugb2YgdGhlIHByZWZpeC4KKyAgICAgICAgIyBUaGVuIGF0dGVtcHQgdG8gY3JlYXRlIGEgZmlsZSB3aG9zZSBuYW1lIGlzCisgICAgICAgICMgcHJlZml4ICsgJ3h4eHh4eC54eHgnIGluIHRoYXQgZGlyZWN0b3J5LgorICAgICAgICBwID0gdGVtcGZpbGUuZ2V0dGVtcHByZWZpeCgpICsgInh4eHh4eC54eHgiCisgICAgICAgIGQgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0iIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IG9zLnBhdGguam9pbihkLCBwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZkID0gb3Mub3BlbihwLCBvcy5PX1JEV1IgfCBvcy5PX0NSRUFUKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbE9uRXhjZXB0aW9uKCJvcy5vcGVuIikKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICAgICAgb3MudW5saW5rKHApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5ybWRpcihkKQorCit0ZXN0X2NsYXNzZXMuYXBwZW5kKHRlc3RfZ2V0dGVtcHByZWZpeCkKKworCitjbGFzcyB0ZXN0X2dldHRlbXBkaXIoVEMpOgorICAgICIiIlRlc3QgZ2V0dGVtcGRpcigpLiIiIgorCisgICAgZGVmIHRlc3RfZGlyZWN0b3J5X2V4aXN0cyhzZWxmKToKKyAgICAgICAgIyBnZXR0ZW1wZGlyIHJldHVybnMgYSBkaXJlY3Rvcnkgd2hpY2ggZXhpc3RzCisKKyAgICAgICAgZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzYWJzKGRpcikgb3IgZGlyID09IG9zLmN1cmRpciwKKyAgICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aCIgJSBkaXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZGlyKGRpciksCisgICAgICAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgZGlyZWN0b3J5IiAlIGRpcikKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yeV93cml0YWJsZShzZWxmKToKKyAgICAgICAgIyBnZXR0ZW1wZGlyIHJldHVybnMgYSBkaXJlY3Rvcnkgd3JpdGFibGUgYnkgdGhlIHVzZXIKKworICAgICAgICAjIHNuZWFreToganVzdCBpbnN0YW50aWF0ZSBhIE5hbWVkVGVtcG9yYXJ5RmlsZSwgd2hpY2gKKyAgICAgICAgIyBkZWZhdWx0cyB0byB3cml0aW5nIGludG8gdGhlIGRpcmVjdG9yeSByZXR1cm5lZCBieQorICAgICAgICAjIGdldHRlbXBkaXIuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQorICAgICAgICAgICAgZmlsZS53cml0ZSgiYmxhdCIpCisgICAgICAgICAgICBmaWxlLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsT25FeGNlcHRpb24oImNyZWF0ZSBmaWxlIGluICVzIiAlIHRlbXBmaWxlLmdldHRlbXBkaXIoKSkKKworICAgIGRlZiB0ZXN0X3NhbWVfdGhpbmcoc2VsZik6CisgICAgICAgICMgZ2V0dGVtcGRpciBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSBvYmplY3QKKyAgICAgICAgYSA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQorICAgICAgICBiID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKKwordGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X2dldHRlbXBkaXIpCisKKworY2xhc3MgdGVzdF9ta3N0ZW1wKFRDKToKKyAgICAiIiJUZXN0IG1rc3RlbXAoKS4iIiIKKworICAgIGRlZiBkb19jcmVhdGUoc2VsZiwgZGlyPU5vbmUsIHByZT0iIiwgc3VmPSIiKToKKyAgICAgICAgaWYgZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBkaXIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgKGZkLCBuYW1lKSA9IHRlbXBmaWxlLm1rc3RlbXAoZGlyPWRpciwgcHJlZml4PXByZSwgc3VmZml4PXN1ZikKKyAgICAgICAgICAgIChuZGlyLCBuYmFzZSkgPSBvcy5wYXRoLnNwbGl0KG5hbWUpCisgICAgICAgICAgICBhZGlyID0gb3MucGF0aC5hYnNwYXRoKGRpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWRpciwgbmRpciwKKyAgICAgICAgICAgICAgICAiRGlyZWN0b3J5ICclcycgaW5jb3JyZWN0bHkgcmV0dXJuZWQgYXMgJyVzJyIgJSAoYWRpciwgbmRpcikpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbE9uRXhjZXB0aW9uKCJta3N0ZW1wIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLm5hbWVDaGVjayhuYW1lLCBkaXIsIHByZSwgc3VmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICAjIG1rc3RlbXAgY2FuIGNyZWF0ZSBmaWxlcworICAgICAgICBzZWxmLmRvX2NyZWF0ZSgpCisgICAgICAgIHNlbGYuZG9fY3JlYXRlKHByZT0iYSIpCisgICAgICAgIHNlbGYuZG9fY3JlYXRlKHN1Zj0iYiIpCisgICAgICAgIHNlbGYuZG9fY3JlYXRlKHByZT0iYSIsIHN1Zj0iYiIpCisgICAgICAgIHNlbGYuZG9fY3JlYXRlKHByZT0iYWEiLCBzdWY9Ii50eHQiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShkaXI9Ii4iKQorCisgICAgZGVmIHRlc3RfY2hvb3NlX2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgIyBta3N0ZW1wIGNhbiBjcmVhdGUgZGlyZWN0b3JpZXMgaW4gYSB1c2VyLXNlbGVjdGVkIGRpcmVjdG9yeQorICAgICAgICBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kb19jcmVhdGUoZGlyPWRpcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJtZGlyKGRpcikKKwordGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X21rc3RlbXApCisKKworY2xhc3MgdGVzdF9ta2R0ZW1wKFRDKToKKyAgICAiIiJUZXN0IG1rZHRlbXAoKS4iIiIKKworICAgIGRlZiBkb19jcmVhdGUoc2VsZiwgZGlyPU5vbmUsIHByZT0iIiwgc3VmPSIiKToKKyAgICAgICAgaWYgZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBkaXIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZSA9IHRlbXBmaWxlLm1rZHRlbXAoZGlyPWRpciwgcHJlZml4PXByZSwgc3VmZml4PXN1ZikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsT25FeGNlcHRpb24oIm1rZHRlbXAiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYubmFtZUNoZWNrKG5hbWUsIGRpciwgcHJlLCBzdWYpCisgICAgICAgICAgICByZXR1cm4gbmFtZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBvcy5ybWRpcihuYW1lKQorICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICAjIG1rZHRlbXAgY2FuIGNyZWF0ZSBkaXJlY3RvcmllcworICAgICAgICBvcy5ybWRpcihzZWxmLmRvX2NyZWF0ZSgpKQorICAgICAgICBvcy5ybWRpcihzZWxmLmRvX2NyZWF0ZShwcmU9ImEiKSkKKyAgICAgICAgb3Mucm1kaXIoc2VsZi5kb19jcmVhdGUoc3VmPSJiIikpCisgICAgICAgIG9zLnJtZGlyKHNlbGYuZG9fY3JlYXRlKHByZT0iYSIsIHN1Zj0iYiIpKQorICAgICAgICBvcy5ybWRpcihzZWxmLmRvX2NyZWF0ZShwcmU9ImFhIiwgc3VmPSIudHh0IikpCisKKyAgICBkZWYgdGVzdF9iYXNpY19tYW55KHNlbGYpOgorICAgICAgICAjIG1rZHRlbXAgY2FuIGNyZWF0ZSBtYW55IGRpcmVjdG9yaWVzIChzdG9jaGFzdGljKQorICAgICAgICBleHRhbnQgPSByYW5nZShURVNUX0ZJTEVTKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiBleHRhbnQ6CisgICAgICAgICAgICAgICAgZXh0YW50W2ldID0gc2VsZi5kb19jcmVhdGUocHJlPSJhYSIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmb3IgaSBpbiBleHRhbnQ6CisgICAgICAgICAgICAgICAgaWYoaXNpbnN0YW5jZShpLCBiYXNlc3RyaW5nKSk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJtZGlyKGkpCisKKyAgICBkZWYgdGVzdF9jaG9vc2VfZGlyZWN0b3J5KHNlbGYpOgorICAgICAgICAjIG1rZHRlbXAgY2FuIGNyZWF0ZSBkaXJlY3RvcmllcyBpbiBhIHVzZXItc2VsZWN0ZWQgZGlyZWN0b3J5CisgICAgICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5ybWRpcihzZWxmLmRvX2NyZWF0ZShkaXI9ZGlyKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJtZGlyKGRpcikKKworICAgIGRlZiB0ZXN0X21vZGUoc2VsZik6CisgICAgICAgICMgbWtkdGVtcCBjcmVhdGVzIGRpcmVjdG9yaWVzIHdpdGggdGhlIHByb3BlciBtb2RlCisgICAgICAgIGlmIG5vdCBoYXNfc3RhdDoKKyAgICAgICAgICAgIHJldHVybiAgICAgICAgICAgICMgdWdoLCBjYW4ndCB1c2UgU2tpcFRlc3QuCisKKyAgICAgICAgZGlyID0gc2VsZi5kb19jcmVhdGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2RlID0gc3RhdC5TX0lNT0RFKG9zLnN0YXQoZGlyKS5zdF9tb2RlKQorICAgICAgICAgICAgbW9kZSAmPSAwNzc3ICMgTWFzayBvZmYgc3RpY2t5IGJpdHMgaW5oZXJpdGVkIGZyb20gL3RtcAorICAgICAgICAgICAgZXhwZWN0ZWQgPSAwNzAwCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCd3aW4zMicsICdvczJlbXgnKToKKyAgICAgICAgICAgICAgICAjIFRoZXJlJ3Mgbm8gZGlzdGluY3Rpb24gYW1vbmcgJ3VzZXInLCAnZ3JvdXAnIGFuZCAnd29ybGQnOworICAgICAgICAgICAgICAgICMgcmVwbGljYXRlIHRoZSAndXNlcicgYml0cy4KKyAgICAgICAgICAgICAgICB1c2VyID0gZXhwZWN0ZWQgPj4gNgorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdXNlciAqICgxICsgOCArIDY0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2RlLCBleHBlY3RlZCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJtZGlyKGRpcikKKwordGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X21rZHRlbXApCisKKworY2xhc3MgdGVzdF9ta3RlbXAoVEMpOgorICAgICIiIlRlc3QgbWt0ZW1wKCkuIiIiCisKKyAgICAjIEZvciBzYWZldHksIGFsbCB1c2Ugb2YgbWt0ZW1wIG11c3Qgb2NjdXIgaW4gYSBwcml2YXRlIGRpcmVjdG9yeS4KKyAgICAjIFdlIG11c3QgYWxzbyBzdXBwcmVzcyB0aGUgUnVudGltZVdhcm5pbmcgaXQgZ2VuZXJhdGVzLgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kaXI6CisgICAgICAgICAgICBvcy5ybWRpcihzZWxmLmRpcikKKyAgICAgICAgICAgIHNlbGYuZGlyID0gTm9uZQorCisgICAgY2xhc3MgbWt0ZW1wZWQ6CisgICAgICAgIF91bmxpbmsgPSBvcy51bmxpbmsKKyAgICAgICAgX2JmbGFncyA9IHRlbXBmaWxlLl9iaW5fb3BlbmZsYWdzCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpciwgcHJlLCBzdWYpOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gdGVtcGZpbGUubWt0ZW1wKGRpcj1kaXIsIHByZWZpeD1wcmUsIHN1ZmZpeD1zdWYpCisgICAgICAgICAgICAjIENyZWF0ZSB0aGUgZmlsZS4gIFRoaXMgd2lsbCByYWlzZSBhbiBleGNlcHRpb24gaWYgaXQncworICAgICAgICAgICAgIyBteXN0ZXJpb3VzbHkgYXBwZWFyZWQgaW4gdGhlIG1lYW53aGlsZS4KKyAgICAgICAgICAgIG9zLmNsb3NlKG9zLm9wZW4oc2VsZi5uYW1lLCBzZWxmLl9iZmxhZ3MsIDA2MDApKQorCisgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fdW5saW5rKHNlbGYubmFtZSkKKworICAgIGRlZiBkb19jcmVhdGUoc2VsZiwgcHJlPSIiLCBzdWY9IiIpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlID0gc2VsZi5ta3RlbXBlZChzZWxmLmRpciwgcHJlLCBzdWYpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbE9uRXhjZXB0aW9uKCJta3RlbXAiKQorCisgICAgICAgIHNlbGYubmFtZUNoZWNrKGZpbGUubmFtZSwgc2VsZi5kaXIsIHByZSwgc3VmKQorICAgICAgICByZXR1cm4gZmlsZQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgICMgbWt0ZW1wIGNhbiBjaG9vc2UgdXNhYmxlIGZpbGUgbmFtZXMKKyAgICAgICAgc2VsZi5kb19jcmVhdGUoKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShwcmU9ImEiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShzdWY9ImIiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShwcmU9ImEiLCBzdWY9ImIiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShwcmU9ImFhIiwgc3VmPSIudHh0IikKKworICAgIGRlZiB0ZXN0X21hbnkoc2VsZik6CisgICAgICAgICMgbWt0ZW1wIGNhbiBjaG9vc2UgbWFueSB1c2FibGUgZmlsZSBuYW1lcyAoc3RvY2hhc3RpYykKKyAgICAgICAgZXh0YW50ID0gcmFuZ2UoVEVTVF9GSUxFUykKKyAgICAgICAgZm9yIGkgaW4gZXh0YW50OgorICAgICAgICAgICAgZXh0YW50W2ldID0gc2VsZi5kb19jcmVhdGUocHJlPSJhYSIpCisKKyMjICAgICBkZWYgdGVzdF93YXJuaW5nKHNlbGYpOgorIyMgICAgICAgICAjIG1rdGVtcCBpc3N1ZXMgYSB3YXJuaW5nIHdoZW4gdXNlZAorIyMgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLAorIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT1SdW50aW1lV2FybmluZywKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0ibWt0ZW1wIikKKyMjICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZVdhcm5pbmcsCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBmaWxlLm1rdGVtcCwgZGlyPXNlbGYuZGlyKQorCit0ZXN0X2NsYXNzZXMuYXBwZW5kKHRlc3RfbWt0ZW1wKQorCisKKyMgV2UgdGVzdCBfVGVtcG9yYXJ5RmlsZVdyYXBwZXIgYnkgdGVzdGluZyBOYW1lZFRlbXBvcmFyeUZpbGUuCisKKworY2xhc3MgdGVzdF9OYW1lZFRlbXBvcmFyeUZpbGUoVEMpOgorICAgICIiIlRlc3QgTmFtZWRUZW1wb3JhcnlGaWxlKCkuIiIiCisKKyAgICBkZWYgZG9fY3JlYXRlKHNlbGYsIGRpcj1Ob25lLCBwcmU9IiIsIHN1Zj0iIiwgZGVsZXRlPVRydWUpOgorICAgICAgICBpZiBkaXIgaXMgTm9uZToKKyAgICAgICAgICAgIGRpciA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKGRpcj1kaXIsIHByZWZpeD1wcmUsIHN1ZmZpeD1zdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZT1kZWxldGUpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbE9uRXhjZXB0aW9uKCJOYW1lZFRlbXBvcmFyeUZpbGUiKQorCisgICAgICAgIHNlbGYubmFtZUNoZWNrKGZpbGUubmFtZSwgZGlyLCBwcmUsIHN1ZikKKyAgICAgICAgcmV0dXJuIGZpbGUKKworCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgICMgTmFtZWRUZW1wb3JhcnlGaWxlIGNhbiBjcmVhdGUgZmlsZXMKKyAgICAgICAgc2VsZi5kb19jcmVhdGUoKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShwcmU9ImEiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShzdWY9ImIiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShwcmU9ImEiLCBzdWY9ImIiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShwcmU9ImFhIiwgc3VmPSIudHh0IikKKworICAgIGRlZiB0ZXN0X2NyZWF0ZXNfbmFtZWQoc2VsZik6CisgICAgICAgICMgTmFtZWRUZW1wb3JhcnlGaWxlIGNyZWF0ZXMgZmlsZXMgd2l0aCBuYW1lcworICAgICAgICBmID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGYubmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZWRUZW1wb3JhcnlGaWxlICVzIGRvZXMgbm90IGV4aXN0IiAlIGYubmFtZSkKKworICAgIGRlZiB0ZXN0X2RlbF9vbl9jbG9zZShzZWxmKToKKyAgICAgICAgIyBBIE5hbWVkVGVtcG9yYXJ5RmlsZSBpcyBkZWxldGVkIHdoZW4gY2xvc2VkCisgICAgICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKGRpcj1kaXIpCisgICAgICAgICAgICBmLndyaXRlKCdibGF0JykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhmLm5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVkVGVtcG9yYXJ5RmlsZSAlcyBleGlzdHMgYWZ0ZXIgY2xvc2UiICUgZi5uYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3Mucm1kaXIoZGlyKQorCisgICAgZGVmIHRlc3RfZGlzX2RlbF9vbl9jbG9zZShzZWxmKToKKyAgICAgICAgIyBUZXN0cyB0aGF0IGRlbGV0ZS1vbi1jbG9zZSBjYW4gYmUgZGlzYWJsZWQKKyAgICAgICAgZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHRtcCA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShkaXI9ZGlyLCBkZWxldGU9RmFsc2UpCisgICAgICAgICAgICB0bXAgPSBmLm5hbWUKKyAgICAgICAgICAgIGYud3JpdGUoJ2JsYXQnKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZi5uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lZFRlbXBvcmFyeUZpbGUgJXMgbWlzc2luZyBhZnRlciBjbG9zZSIgJSBmLm5hbWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiB0bXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHRtcCkKKyAgICAgICAgICAgIG9zLnJtZGlyKGRpcikKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX2Nsb3NlKHNlbGYpOgorICAgICAgICAjIEEgTmFtZWRUZW1wb3JhcnlGaWxlIGNhbiBiZSBjbG9zZWQgbWFueSB0aW1lcyB3aXRob3V0IGVycm9yCisgICAgICAgIGYgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQorICAgICAgICBmLndyaXRlKCdhYmNcbicpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWxPbkV4Y2VwdGlvbigiY2xvc2UiKQorCisgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyKHNlbGYpOgorICAgICAgICAjIEEgTmFtZWRUZW1wb3JhcnlGaWxlIGNhbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyCisgICAgICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhmLm5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKGYubmFtZSkpCisgICAgICAgIGRlZiB1c2VfY2xvc2VkKCk6CisgICAgICAgICAgICB3aXRoIGY6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1c2VfY2xvc2VkKQorCisgICAgIyBIb3cgdG8gdGVzdCB0aGUgbW9kZSBhbmQgYnVmc2l6ZSBwYXJhbWV0ZXJzPworCit0ZXN0X2NsYXNzZXMuYXBwZW5kKHRlc3RfTmFtZWRUZW1wb3JhcnlGaWxlKQorCitjbGFzcyB0ZXN0X1Nwb29sZWRUZW1wb3JhcnlGaWxlKFRDKToKKyAgICAiIiJUZXN0IFNwb29sZWRUZW1wb3JhcnlGaWxlKCkuIiIiCisKKyAgICBkZWYgZG9fY3JlYXRlKHNlbGYsIG1heF9zaXplPTAsIGRpcj1Ob25lLCBwcmU9IiIsIHN1Zj0iIik6CisgICAgICAgIGlmIGRpciBpcyBOb25lOgorICAgICAgICAgICAgZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGUgPSB0ZW1wZmlsZS5TcG9vbGVkVGVtcG9yYXJ5RmlsZShtYXhfc2l6ZT1tYXhfc2l6ZSwgZGlyPWRpciwgcHJlZml4PXByZSwgc3VmZml4PXN1ZikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsT25FeGNlcHRpb24oIlNwb29sZWRUZW1wb3JhcnlGaWxlIikKKworICAgICAgICByZXR1cm4gZmlsZQorCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBjYW4gY3JlYXRlIGZpbGVzCisgICAgICAgIGYgPSBzZWxmLmRvX2NyZWF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorICAgICAgICBmID0gc2VsZi5kb19jcmVhdGUobWF4X3NpemU9MTAwLCBwcmU9ImEiLCBzdWY9Ii50eHQiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKworICAgIGRlZiB0ZXN0X2RlbF9vbl9jbG9zZShzZWxmKToKKyAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIGlzIGRlbGV0ZWQgd2hlbiBjbG9zZWQKKyAgICAgICAgZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSB0ZW1wZmlsZS5TcG9vbGVkVGVtcG9yYXJ5RmlsZShtYXhfc2l6ZT0xMCwgZGlyPWRpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorICAgICAgICAgICAgZi53cml0ZSgnYmxhdCAnICogNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLl9yb2xsZWQpCisgICAgICAgICAgICBmaWxlbmFtZSA9IGYubmFtZQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJTcG9vbGVkVGVtcG9yYXJ5RmlsZSAlcyBleGlzdHMgYWZ0ZXIgY2xvc2UiICUgZmlsZW5hbWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5ybWRpcihkaXIpCisKKyAgICBkZWYgdGVzdF9yZXdyaXRlX3NtYWxsKHNlbGYpOgorICAgICAgICAjIEEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUgY2FuIGJlIHdyaXR0ZW4gdG8gbXVsdGlwbGUgd2l0aGluIHRoZSBtYXhfc2l6ZQorICAgICAgICBmID0gc2VsZi5kb19jcmVhdGUobWF4X3NpemU9MzApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgIGYuc2VlaygwLCAwKQorICAgICAgICAgICAgZi53cml0ZSgneCcgKiAyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCisKKyAgICBkZWYgdGVzdF93cml0ZV9zZXF1ZW50aWFsKHNlbGYpOgorICAgICAgICAjIEEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUgc2hvdWxkIGhvbGQgZXhhY3RseSBtYXhfc2l6ZSBieXRlcywgYW5kIHJvbGwKKyAgICAgICAgIyBvdmVyIGFmdGVyd2FyZAorICAgICAgICBmID0gc2VsZi5kb19jcmVhdGUobWF4X3NpemU9MzApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorICAgICAgICBmLndyaXRlKCd4JyAqIDIwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgZi53cml0ZSgneCcgKiAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCisgICAgICAgIGYud3JpdGUoJ3gnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQorCisgICAgZGVmIHRlc3Rfd3JpdGVsaW5lcyhzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgd3JpdGVsaW5lcyB3aXRoIGEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUKKyAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKCkKKyAgICAgICAgZi53cml0ZWxpbmVzKChiJ3gnLCBiJ3knLCBiJ3onKSkKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIGJ1ZiA9IGYucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBiJ3h5eicpCisKKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzX3NlcXVlbnRpYWwoc2VsZik6CisgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBzaG91bGQgaG9sZCBleGFjdGx5IG1heF9zaXplIGJ5dGVzLCBhbmQgcm9sbAorICAgICAgICAjIG92ZXIgYWZ0ZXJ3YXJkCisgICAgICAgIGYgPSBzZWxmLmRvX2NyZWF0ZShtYXhfc2l6ZT0zNSkKKyAgICAgICAgZi53cml0ZWxpbmVzKChiJ3gnICogMjAsIGIneCcgKiAxMCwgYid4JyAqIDUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgZi53cml0ZShiJ3gnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQorCisgICAgZGVmIHRlc3RfeHJlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKG1heF9zaXplPTIwKQorICAgICAgICBmLndyaXRlKGInYWJjXG4nICogNSkKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZi54cmVhZGxpbmVzKCkpLCBbYidhYmNcbiddICogNSkKKyAgICAgICAgZi53cml0ZShiJ3hcbnknKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGYueHJlYWRsaW5lcygpKSwgW2InYWJjXG4nXSAqIDUgKyBbYid4XG4nLCBiJ3knXSkKKworICAgIGRlZiB0ZXN0X3NwYXJzZShzZWxmKToKKyAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIHRoYXQgaXMgd3JpdHRlbiBsYXRlIGluIHRoZSBmaWxlIHdpbGwgZXh0ZW5kCisgICAgICAgICMgd2hlbiB0aGF0IG9jY3VycworICAgICAgICBmID0gc2VsZi5kb19jcmVhdGUobWF4X3NpemU9MzApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorICAgICAgICBmLnNlZWsoMTAwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgZi53cml0ZSgneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLl9yb2xsZWQpCisKKyAgICBkZWYgdGVzdF9maWxlbm8oc2VsZik6CisgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBzaG91bGQgcm9sbCBvdmVyIHRvIGEgcmVhbCBmaWxlIG9uIGZpbGVubygpCisgICAgICAgIGYgPSBzZWxmLmRvX2NyZWF0ZShtYXhfc2l6ZT0zMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmZpbGVubygpID4gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX2Nsb3NlX2JlZm9yZV9yb2xsb3ZlcihzZWxmKToKKyAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIGNhbiBiZSBjbG9zZWQgbWFueSB0aW1lcyB3aXRob3V0IGVycm9yCisgICAgICAgIGYgPSB0ZW1wZmlsZS5TcG9vbGVkVGVtcG9yYXJ5RmlsZSgpCisgICAgICAgIGYud3JpdGUoJ2FiY1xuJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWxPbkV4Y2VwdGlvbigiY2xvc2UiKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfY2xvc2VfYWZ0ZXJfcm9sbG92ZXIoc2VsZik6CisgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBjYW4gYmUgY2xvc2VkIG1hbnkgdGltZXMgd2l0aG91dCBlcnJvcgorICAgICAgICBmID0gdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUobWF4X3NpemU9MSkKKyAgICAgICAgZi53cml0ZSgnYWJjXG4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsT25FeGNlcHRpb24oImNsb3NlIikKKworICAgIGRlZiB0ZXN0X2JvdW5kX21ldGhvZHMoc2VsZik6CisgICAgICAgICMgSXQgc2hvdWxkIGJlIE9LIHRvIHN0ZWFsIGEgYm91bmQgbWV0aG9kIGZyb20gYSBTcG9vbGVkVGVtcG9yYXJ5RmlsZQorICAgICAgICAjIGFuZCB1c2UgaXQgaW5kZXBlbmRlbnRseTsgd2hlbiB0aGUgZmlsZSByb2xscyBvdmVyLCB0aG9zZSBib3VuZAorICAgICAgICAjIG1ldGhvZHMgc2hvdWxkIGNvbnRpbnVlIHRvIGZ1bmN0aW9uCisgICAgICAgIGYgPSBzZWxmLmRvX2NyZWF0ZShtYXhfc2l6ZT0zMCkKKyAgICAgICAgcmVhZCA9IGYucmVhZAorICAgICAgICB3cml0ZSA9IGYud3JpdGUKKyAgICAgICAgc2VlayA9IGYuc2VlaworCisgICAgICAgIHdyaXRlKCJhIiAqIDM1KQorICAgICAgICB3cml0ZSgiYiIgKiAzNSkKKyAgICAgICAgc2VlaygwLCAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVhZCg3MCkgPT0gJ2EnKjM1ICsgJ2InKjM1KQorCisgICAgZGVmIHRlc3RfcHJvcGVydGllcyhzZWxmKToKKyAgICAgICAgZiA9IHRlbXBmaWxlLlNwb29sZWRUZW1wb3JhcnlGaWxlKG1heF9zaXplPTEwKQorICAgICAgICBmLndyaXRlKGIneCcgKiAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5tb2RlLCAndytiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoZi5uYW1lKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIGYubmV3bGluZXMKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBmLmVuY29kaW5nCisKKyAgICAgICAgZi53cml0ZShiJ3gnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYubW9kZSwgJ3crYicpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGYubmFtZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBmLm5ld2xpbmVzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgZi5lbmNvZGluZworCisgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyX2JlZm9yZV9yb2xsb3ZlcihzZWxmKToKKyAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIGNhbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyCisgICAgICAgIHdpdGggdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUobWF4X3NpemU9MSkgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuY2xvc2VkKQorICAgICAgICBkZWYgdXNlX2Nsb3NlZCgpOgorICAgICAgICAgICAgd2l0aCBmOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdXNlX2Nsb3NlZCkKKworICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcl9kdXJpbmdfcm9sbG92ZXIoc2VsZik6CisgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBjYW4gYmUgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlcgorICAgICAgICB3aXRoIHRlbXBmaWxlLlNwb29sZWRUZW1wb3JhcnlGaWxlKG1heF9zaXplPTEpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgICAgIGYud3JpdGUoJ2FiY1xuJykKKyAgICAgICAgICAgIGYuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmNsb3NlZCkKKyAgICAgICAgZGVmIHVzZV9jbG9zZWQoKToKKyAgICAgICAgICAgIHdpdGggZjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHVzZV9jbG9zZWQpCisKKyAgICBkZWYgdGVzdF9jb250ZXh0X21hbmFnZXJfYWZ0ZXJfcm9sbG92ZXIoc2VsZik6CisgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBjYW4gYmUgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlcgorICAgICAgICBmID0gdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUobWF4X3NpemU9MSkKKyAgICAgICAgZi53cml0ZSgnYWJjXG4nKQorICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKKyAgICAgICAgd2l0aCBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuY2xvc2VkKQorICAgICAgICBkZWYgdXNlX2Nsb3NlZCgpOgorICAgICAgICAgICAgd2l0aCBmOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdXNlX2Nsb3NlZCkKKworCit0ZXN0X2NsYXNzZXMuYXBwZW5kKHRlc3RfU3Bvb2xlZFRlbXBvcmFyeUZpbGUpCisKKworY2xhc3MgdGVzdF9UZW1wb3JhcnlGaWxlKFRDKToKKyAgICAiIiJUZXN0IFRlbXBvcmFyeUZpbGUoKS4iIiIKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICAjIFRlbXBvcmFyeUZpbGUgY2FuIGNyZWF0ZSBmaWxlcworICAgICAgICAjIE5vIHBvaW50IGluIHRlc3RpbmcgdGhlIG5hbWUgcGFyYW1zIC0gdGhlIGZpbGUgaGFzIG5vIG5hbWUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWxPbkV4Y2VwdGlvbigiVGVtcG9yYXJ5RmlsZSIpCisKKyAgICBkZWYgdGVzdF9oYXNfbm9fbmFtZShzZWxmKToKKyAgICAgICAgIyBUZW1wb3JhcnlGaWxlIGNyZWF0ZXMgZmlsZXMgd2l0aCBubyBuYW1lcyAob24gdGhpcyBzeXN0ZW0pCisgICAgICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBmID0gdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZShkaXI9ZGlyKQorICAgICAgICBmLndyaXRlKCdibGF0JykKKworICAgICAgICAjIFNuZWFreTogYmVjYXVzZSB0aGlzIGZpbGUgaGFzIG5vIG5hbWUsIGl0IHNob3VsZCBub3QgcHJldmVudAorICAgICAgICAjIHVzIGZyb20gcmVtb3ZpbmcgdGhlIGRpcmVjdG9yeSBpdCB3YXMgY3JlYXRlZCBpbi4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3Mucm1kaXIoZGlyKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBlaSA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICAjIGNsZWFudXAKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgb3Mucm1kaXIoZGlyKQorICAgICAgICAgICAgc2VsZi5mYWlsT25FeGNlcHRpb24oInJtZGlyIiwgZWkpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9jbG9zZShzZWxmKToKKyAgICAgICAgIyBBIFRlbXBvcmFyeUZpbGUgY2FuIGJlIGNsb3NlZCBtYW55IHRpbWVzIHdpdGhvdXQgZXJyb3IKKyAgICAgICAgZiA9IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoKQorICAgICAgICBmLndyaXRlKCdhYmNcbicpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWxPbkV4Y2VwdGlvbigiY2xvc2UiKQorCisgICAgIyBIb3cgdG8gdGVzdCB0aGUgbW9kZSBhbmQgYnVmc2l6ZSBwYXJhbWV0ZXJzPworCisKK2lmIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSBpcyBub3QgdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZToKKyAgICB0ZXN0X2NsYXNzZXMuYXBwZW5kKHRlc3RfVGVtcG9yYXJ5RmlsZSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbXBmaWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbXBmaWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWU5MDllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGVtcGZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbXBmaWxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbXBmaWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWU5MDllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGVtcGZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RleHR3cmFwLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGV4dHdyYXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3MjY3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RleHR3cmFwLnB5CkBAIC0wLDAgKzEsNjU4IEBACisjCisjIFRlc3Qgc3VpdGUgZm9yIHRoZSB0ZXh0d3JhcCBtb2R1bGUuCisjCisjIE9yaWdpbmFsIHRlc3RzIHdyaXR0ZW4gYnkgR3JlZyBXYXJkIDxnd2FyZEBweXRob24ubmV0Pi4KKyMgQ29udmVydGVkIHRvIFB5VW5pdCBieSBQZXRlciBIYW5zZW4gPHBldGVyQGVuZ2NvcnAuY29tPi4KKyMgQ3VycmVudGx5IG1haW50YWluZWQgYnkgR3JlZyBXYXJkLgorIworIyAkSWQkCisjCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworZnJvbSB0ZXh0d3JhcCBpbXBvcnQgVGV4dFdyYXBwZXIsIHdyYXAsIGZpbGwsIGRlZGVudAorCisKK2NsYXNzIEJhc2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgJycnUGFyZW50IGNsYXNzIHdpdGggdXRpbGl0eSBtZXRob2RzIGZvciB0ZXh0d3JhcCB0ZXN0cy4nJycKKworICAgIGRlZiBzaG93KHNlbGYsIHRleHRpbik6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodGV4dGluLCBsaXN0KToKKyAgICAgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4odGV4dGluKSk6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAlZDogJXIiICUgKGksIHRleHRpbltpXSkpCisgICAgICAgICAgICByZXN1bHQgPSAnXG4nLmpvaW4ocmVzdWx0KQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodGV4dGluLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHJlc3VsdCA9ICIgICVzXG4iICUgcmVwcih0ZXh0aW4pCisgICAgICAgIHJldHVybiByZXN1bHQKKworCisgICAgZGVmIGNoZWNrKHNlbGYsIHJlc3VsdCwgZXhwZWN0KToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdCwKKyAgICAgICAgICAgICdleHBlY3RlZDpcbiVzXG5idXQgZ290OlxuJXMnICUgKAorICAgICAgICAgICAgICAgIHNlbGYuc2hvdyhleHBlY3QpLCBzZWxmLnNob3cocmVzdWx0KSkpCisKKyAgICBkZWYgY2hlY2tfd3JhcChzZWxmLCB0ZXh0LCB3aWR0aCwgZXhwZWN0LCAqKmt3YXJncyk6CisgICAgICAgIHJlc3VsdCA9IHdyYXAodGV4dCwgd2lkdGgsICoqa3dhcmdzKQorICAgICAgICBzZWxmLmNoZWNrKHJlc3VsdCwgZXhwZWN0KQorCisgICAgZGVmIGNoZWNrX3NwbGl0KHNlbGYsIHRleHQsIGV4cGVjdCk6CisgICAgICAgIHJlc3VsdCA9IHNlbGYud3JhcHBlci5fc3BsaXQodGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiXG5leHBlY3RlZCAlclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgZ290ICAlciIgJSAoZXhwZWN0LCByZXN1bHQpKQorCisKK2NsYXNzIFdyYXBUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLndyYXBwZXIgPSBUZXh0V3JhcHBlcih3aWR0aD00NSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgIyBTaW1wbGUgY2FzZToganVzdCB3b3Jkcywgc3BhY2VzLCBhbmQgYSBiaXQgb2YgcHVuY3R1YXRpb24KKworICAgICAgICB0ZXh0ID0gIkhlbGxvIHRoZXJlLCBob3cgYXJlIHlvdSB0aGlzIGZpbmUgZGF5PyAgSSdtIGdsYWQgdG8gaGVhciBpdCEiCisKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgWyJIZWxsbyB0aGVyZSwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJob3cgYXJlIHlvdSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgZmluZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImRheT8gIEknbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImdsYWQgdG8gaGVhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIml0ISJdKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgNDIsCisgICAgICAgICAgICAgICAgICAgICAgICBbIkhlbGxvIHRoZXJlLCBob3cgYXJlIHlvdSB0aGlzIGZpbmUgZGF5PyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkknbSBnbGFkIHRvIGhlYXIgaXQhIl0pCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCA4MCwgW3RleHRdKQorCisgICAgZGVmIHRlc3RfZW1wdHlfc3RyaW5nKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgd3JhcHBpbmcgdGhlIGVtcHR5IHN0cmluZyByZXR1cm5zIGFuIGVtcHR5IGxpc3QuCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCgiIiwgNiwgW10pCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCgiIiwgNiwgW10sIGRyb3Bfd2hpdGVzcGFjZT1GYWxzZSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X3N0cmluZ193aXRoX2luaXRpYWxfaW5kZW50KHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgdGhlIGVtcHR5IHN0cmluZyBpcyBub3QgaW5kZW50ZWQuCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCgiIiwgNiwgW10sIGluaXRpYWxfaW5kZW50PSIrKyIpCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCgiIiwgNiwgW10sIGluaXRpYWxfaW5kZW50PSIrKyIsIGRyb3Bfd2hpdGVzcGFjZT1GYWxzZSkKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgICMgV2hpdGVzcGFjZSBtdW5naW5nIGFuZCBlbmQtb2Ytc2VudGVuY2UgZGV0ZWN0aW9uCisKKyAgICAgICAgdGV4dCA9ICIiIlwKK1RoaXMgaXMgYSBwYXJhZ3JhcGggdGhhdCBhbHJlYWR5IGhhcworbGluZSBicmVha3MuICBCdXQgc29tZSBvZiBpdHMgbGluZXMgYXJlIG11Y2ggbG9uZ2VyIHRoYW4gdGhlIG90aGVycywKK3NvIGl0IG5lZWRzIHRvIGJlIHdyYXBwZWQuCitTb21lIGxpbmVzIGFyZSBcdHRhYmJlZCB0b28uCitXaGF0IGEgbWVzcyEKKyIiIgorCisgICAgICAgIGV4cGVjdCA9IFsiVGhpcyBpcyBhIHBhcmFncmFwaCB0aGF0IGFscmVhZHkgaGFzIGxpbmUiLAorICAgICAgICAgICAgICAgICAgImJyZWFrcy4gIEJ1dCBzb21lIG9mIGl0cyBsaW5lcyBhcmUgbXVjaCIsCisgICAgICAgICAgICAgICAgICAibG9uZ2VyIHRoYW4gdGhlIG90aGVycywgc28gaXQgbmVlZHMgdG8gYmUiLAorICAgICAgICAgICAgICAgICAgIndyYXBwZWQuICBTb21lIGxpbmVzIGFyZSAgdGFiYmVkIHRvby4gIFdoYXQgYSIsCisgICAgICAgICAgICAgICAgICAibWVzcyEiXQorCisgICAgICAgIHdyYXBwZXIgPSBUZXh0V3JhcHBlcig0NSwgZml4X3NlbnRlbmNlX2VuZGluZ3M9VHJ1ZSkKKyAgICAgICAgcmVzdWx0ID0gd3JhcHBlci53cmFwKHRleHQpCisgICAgICAgIHNlbGYuY2hlY2socmVzdWx0LCBleHBlY3QpCisKKyAgICAgICAgcmVzdWx0ID0gd3JhcHBlci5maWxsKHRleHQpCisgICAgICAgIHNlbGYuY2hlY2socmVzdWx0LCAnXG4nLmpvaW4oZXhwZWN0KSkKKworICAgIGRlZiB0ZXN0X2ZpeF9zZW50ZW5jZV9lbmRpbmdzKHNlbGYpOgorICAgICAgICB3cmFwcGVyID0gVGV4dFdyYXBwZXIoNjAsIGZpeF9zZW50ZW5jZV9lbmRpbmdzPVRydWUpCisKKyAgICAgICAgIyBTRiAjODQ3MzQ2OiBlbnN1cmUgdGhhdCBmaXhfc2VudGVuY2VfZW5kaW5ncz1UcnVlIGRvZXMgdGhlCisgICAgICAgICMgcmlnaHQgdGhpbmcgZXZlbiBvbiBpbnB1dCBzaG9ydCBlbm91Z2ggdGhhdCBpdCBkb2Vzbid0IG5lZWQgdG8KKyAgICAgICAgIyBiZSB3cmFwcGVkLgorICAgICAgICB0ZXh0ID0gIkEgc2hvcnQgbGluZS4gTm90ZSB0aGUgc2luZ2xlIHNwYWNlLiIKKyAgICAgICAgZXhwZWN0ID0gWyJBIHNob3J0IGxpbmUuICBOb3RlIHRoZSBzaW5nbGUgc3BhY2UuIl0KKyAgICAgICAgc2VsZi5jaGVjayh3cmFwcGVyLndyYXAodGV4dCksIGV4cGVjdCkKKworICAgICAgICAjIFRlc3Qgc29tZSBvZiB0aGUgaGFpcnkgZW5kIGNhc2VzIHRoYXQgX2ZpeF9zZW50ZW5jZV9lbmRpbmdzKCkKKyAgICAgICAgIyBpcyBzdXBwb3NlZCB0byBoYW5kbGUgKHRoZSBlYXN5IHN0dWZmIGlzIHRlc3RlZCBpbgorICAgICAgICAjIHRlc3Rfd2hpdGVzcGFjZSgpIGFib3ZlKS4KKyAgICAgICAgdGV4dCA9ICJXZWxsLCBEb2N0b3I/IFdoYXQgZG8geW91IHRoaW5rPyIKKyAgICAgICAgZXhwZWN0ID0gWyJXZWxsLCBEb2N0b3I/ICBXaGF0IGRvIHlvdSB0aGluaz8iXQorICAgICAgICBzZWxmLmNoZWNrKHdyYXBwZXIud3JhcCh0ZXh0KSwgZXhwZWN0KQorCisgICAgICAgIHRleHQgPSAiV2VsbCwgRG9jdG9yP1xuV2hhdCBkbyB5b3UgdGhpbms/IgorICAgICAgICBzZWxmLmNoZWNrKHdyYXBwZXIud3JhcCh0ZXh0KSwgZXhwZWN0KQorCisgICAgICAgIHRleHQgPSAnSSBzYXksIGNoYXBzISBBbnlvbmUgZm9yICJ0ZW5uaXM/IlxuSG1tcGghJworICAgICAgICBleHBlY3QgPSBbJ0kgc2F5LCBjaGFwcyEgIEFueW9uZSBmb3IgInRlbm5pcz8iICBIbW1waCEnXQorICAgICAgICBzZWxmLmNoZWNrKHdyYXBwZXIud3JhcCh0ZXh0KSwgZXhwZWN0KQorCisgICAgICAgIHdyYXBwZXIud2lkdGggPSAyMAorICAgICAgICBleHBlY3QgPSBbJ0kgc2F5LCBjaGFwcyEnLCAnQW55b25lIGZvciAidGVubmlzPyInLCAnSG1tcGghJ10KKyAgICAgICAgc2VsZi5jaGVjayh3cmFwcGVyLndyYXAodGV4dCksIGV4cGVjdCkKKworICAgICAgICB0ZXh0ID0gJ0FuZCBzaGUgc2FpZCwgIkdvIHRvIGhlbGwhIlxuQ2FuIHlvdSBiZWxpZXZlIHRoYXQ/JworICAgICAgICBleHBlY3QgPSBbJ0FuZCBzaGUgc2FpZCwgIkdvIHRvJywKKyAgICAgICAgICAgICAgICAgICdoZWxsISIgIENhbiB5b3UnLAorICAgICAgICAgICAgICAgICAgJ2JlbGlldmUgdGhhdD8nXQorICAgICAgICBzZWxmLmNoZWNrKHdyYXBwZXIud3JhcCh0ZXh0KSwgZXhwZWN0KQorCisgICAgICAgIHdyYXBwZXIud2lkdGggPSA2MAorICAgICAgICBleHBlY3QgPSBbJ0FuZCBzaGUgc2FpZCwgIkdvIHRvIGhlbGwhIiAgQ2FuIHlvdSBiZWxpZXZlIHRoYXQ/J10KKyAgICAgICAgc2VsZi5jaGVjayh3cmFwcGVyLndyYXAodGV4dCksIGV4cGVjdCkKKworICAgICAgICB0ZXh0ID0gJ0ZpbGUgc3RkaW8uaCBpcyBuaWNlLicKKyAgICAgICAgZXhwZWN0ID0gWydGaWxlIHN0ZGlvLmggaXMgbmljZS4nXQorICAgICAgICBzZWxmLmNoZWNrKHdyYXBwZXIud3JhcCh0ZXh0KSwgZXhwZWN0KQorCisgICAgZGVmIHRlc3Rfd3JhcF9zaG9ydChzZWxmKToKKyAgICAgICAgIyBXcmFwcGluZyB0byBtYWtlIHNob3J0IGxpbmVzIGxvbmdlcgorCisgICAgICAgIHRleHQgPSAiVGhpcyBpcyBhXG5zaG9ydCBwYXJhZ3JhcGguIgorCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAyMCwgWyJUaGlzIGlzIGEgc2hvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYWdyYXBoLiJdKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgNDAsIFsiVGhpcyBpcyBhIHNob3J0IHBhcmFncmFwaC4iXSkKKworCisgICAgZGVmIHRlc3Rfd3JhcF9zaG9ydF8xbGluZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGVuZGNhc2VzCisKKyAgICAgICAgdGV4dCA9ICJUaGlzIGlzIGEgc2hvcnQgbGluZS4iCisKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDMwLCBbIlRoaXMgaXMgYSBzaG9ydCBsaW5lLiJdKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMzAsIFsiKDEpIFRoaXMgaXMgYSBzaG9ydCBsaW5lLiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9pbmRlbnQ9IigxKSAiKQorCisKKyAgICBkZWYgdGVzdF9oeXBoZW5hdGVkKHNlbGYpOgorICAgICAgICAjIFRlc3QgYnJlYWtpbmcgaHlwaGVuYXRlZCB3b3JkcworCisgICAgICAgIHRleHQgPSAoInRoaXMtaXMtYS11c2VmdWwtZmVhdHVyZS1mb3ItIgorICAgICAgICAgICAgICAgICJyZWZvcm1hdHRpbmctcG9zdHMtZnJvbS10aW0tcGV0ZXJzJ2x5IikKKworICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgNDAsCisgICAgICAgICAgICAgICAgICAgICAgICBbInRoaXMtaXMtYS11c2VmdWwtZmVhdHVyZS1mb3ItIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVmb3JtYXR0aW5nLXBvc3RzLWZyb20tdGltLXBldGVycydseSJdKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgNDEsCisgICAgICAgICAgICAgICAgICAgICAgICBbInRoaXMtaXMtYS11c2VmdWwtZmVhdHVyZS1mb3ItIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVmb3JtYXR0aW5nLXBvc3RzLWZyb20tdGltLXBldGVycydseSJdKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgNDIsCisgICAgICAgICAgICAgICAgICAgICAgICBbInRoaXMtaXMtYS11c2VmdWwtZmVhdHVyZS1mb3ItcmVmb3JtYXR0aW5nLSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInBvc3RzLWZyb20tdGltLXBldGVycydseSJdKQorCisgICAgZGVmIHRlc3RfaHlwaGVuYXRlZF9udW1iZXJzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBoeXBoZW5hdGVkIG51bWJlcnMgKGVnLiBkYXRlcykgYXJlIG5vdCBicm9rZW4gbGlrZSB3b3Jkcy4KKyAgICAgICAgdGV4dCA9ICgiUHl0aG9uIDEuMC4wIHdhcyByZWxlYXNlZCBvbiAxOTk0LTAxLTI2LiAgUHl0aG9uIDEuMC4xIHdhc1xuIgorICAgICAgICAgICAgICAgICJyZWxlYXNlZCBvbiAxOTk0LTAyLTE1LiIpCisKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDM1LCBbJ1B5dGhvbiAxLjAuMCB3YXMgcmVsZWFzZWQgb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTk5NC0wMS0yNi4gIFB5dGhvbiAxLjAuMSB3YXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVsZWFzZWQgb24gMTk5NC0wMi0xNS4nXSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDQwLCBbJ1B5dGhvbiAxLjAuMCB3YXMgcmVsZWFzZWQgb24gMTk5NC0wMS0yNi4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uIDEuMC4xIHdhcyByZWxlYXNlZCBvbiAxOTk0LTAyLTE1LiddKQorCisgICAgICAgIHRleHQgPSAiSSBkbyBhbGwgbXkgc2hvcHBpbmcgYXQgNy0xMS4iCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAyNSwgWyJJIGRvIGFsbCBteSBzaG9wcGluZyBhdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3LTExLiJdKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMjcsIFsiSSBkbyBhbGwgbXkgc2hvcHBpbmcgYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNy0xMS4iXSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDI5LCBbIkkgZG8gYWxsIG15IHNob3BwaW5nIGF0IDctMTEuIl0pCisKKyAgICBkZWYgdGVzdF9lbV9kYXNoKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGV4dCB3aXRoIGVtLWRhc2hlcworICAgICAgICB0ZXh0ID0gIkVtLWRhc2hlcyBzaG91bGQgYmUgd3JpdHRlbiAtLSB0aHVzLiIKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgWyJFbS1kYXNoZXMgc2hvdWxkIGJlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdHRlbiAtLSB0aHVzLiJdKQorCisgICAgICAgICMgUHJvYmUgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHByb3Blcmx5IHdyaXR0ZW4gZW0tZGFzaCwKKyAgICAgICAgIyBpZS4gIiAtLSAiLgorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMjksCisgICAgICAgICAgICAgICAgICAgICAgICBbIkVtLWRhc2hlcyBzaG91bGQgYmUgd3JpdHRlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIi0tIHRodXMuIl0pCisgICAgICAgIGV4cGVjdCA9IFsiRW0tZGFzaGVzIHNob3VsZCBiZSB3cml0dGVuIC0tIiwKKyAgICAgICAgICAgICAgICAgICJ0aHVzLiJdCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAzMCwgZXhwZWN0KQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMzUsIGV4cGVjdCkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDM2LAorICAgICAgICAgICAgICAgICAgICAgICAgWyJFbS1kYXNoZXMgc2hvdWxkIGJlIHdyaXR0ZW4gLS0gdGh1cy4iXSkKKworICAgICAgICAjIFRoZSBpbXByb3Blcmx5IHdyaXR0ZW4gZW0tZGFzaCBpcyBoYW5kbGVkIHRvbywgYmVjYXVzZQorICAgICAgICAjIGl0J3MgYWRqYWNlbnQgdG8gbm9uLXdoaXRlc3BhY2Ugb24gYm90aCBzaWRlcy4KKyAgICAgICAgdGV4dCA9ICJZb3UgY2FuIGFsc28gZG8tLXRoaXMgb3IgZXZlbi0tLXRoaXMuIgorICAgICAgICBleHBlY3QgPSBbIllvdSBjYW4gYWxzbyBkbyIsCisgICAgICAgICAgICAgICAgICAiLS10aGlzIG9yIGV2ZW4iLAorICAgICAgICAgICAgICAgICAgIi0tLXRoaXMuIl0KKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDE1LCBleHBlY3QpCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAxNiwgZXhwZWN0KQorICAgICAgICBleHBlY3QgPSBbIllvdSBjYW4gYWxzbyBkby0tIiwKKyAgICAgICAgICAgICAgICAgICJ0aGlzIG9yIGV2ZW4tLS0iLAorICAgICAgICAgICAgICAgICAgInRoaXMuIl0KKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDE3LCBleHBlY3QpCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAxOSwgZXhwZWN0KQorICAgICAgICBleHBlY3QgPSBbIllvdSBjYW4gYWxzbyBkby0tdGhpcyBvciBldmVuIiwKKyAgICAgICAgICAgICAgICAgICItLS10aGlzLiJdCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAyOSwgZXhwZWN0KQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMzEsIGV4cGVjdCkKKyAgICAgICAgZXhwZWN0ID0gWyJZb3UgY2FuIGFsc28gZG8tLXRoaXMgb3IgZXZlbi0tLSIsCisgICAgICAgICAgICAgICAgICAidGhpcy4iXQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMzIsIGV4cGVjdCkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDM1LCBleHBlY3QpCisKKyAgICAgICAgIyBBbGwgb2YgdGhlIGFib3ZlIGJlaGF2aW91ciBjb3VsZCBiZSBkZWR1Y2VkIGJ5IHByb2JpbmcgdGhlCisgICAgICAgICMgX3NwbGl0KCkgbWV0aG9kLgorICAgICAgICB0ZXh0ID0gIkhlcmUncyBhbiAtLSBlbS1kYXNoIGFuZC0taGVyZSdzIGFub3RoZXItLS1hbmQgYW5vdGhlciEiCisgICAgICAgIGV4cGVjdCA9IFsiSGVyZSdzIiwgIiAiLCAiYW4iLCAiICIsICItLSIsICIgIiwgImVtLSIsICJkYXNoIiwgIiAiLAorICAgICAgICAgICAgICAgICAgImFuZCIsICItLSIsICJoZXJlJ3MiLCAiICIsICJhbm90aGVyIiwgIi0tLSIsCisgICAgICAgICAgICAgICAgICAiYW5kIiwgIiAiLCAiYW5vdGhlciEiXQorICAgICAgICBzZWxmLmNoZWNrX3NwbGl0KHRleHQsIGV4cGVjdCkKKworICAgICAgICB0ZXh0ID0gImFuZCB0aGVuLS1iYW0hLS1oZSB3YXMgZ29uZSIKKyAgICAgICAgZXhwZWN0ID0gWyJhbmQiLCAiICIsICJ0aGVuIiwgIi0tIiwgImJhbSEiLCAiLS0iLAorICAgICAgICAgICAgICAgICAgImhlIiwgIiAiLCAid2FzIiwgIiAiLCAiZ29uZSJdCisgICAgICAgIHNlbGYuY2hlY2tfc3BsaXQodGV4dCwgZXhwZWN0KQorCisKKyAgICBkZWYgdGVzdF91bml4X29wdGlvbnMgKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBVbml4LXN0eWxlIGNvbW1hbmQtbGluZSBvcHRpb25zIGFyZSB3cmFwcGVkIGNvcnJlY3RseS4KKyAgICAgICAgIyBCb3RoIE9wdGlrIChPcHRpb25QYXJzZXIpIGFuZCBEb2N1dGlscyByZWx5IG9uIHRoaXMgYmVoYXZpb3VyIQorCisgICAgICAgIHRleHQgPSAiWW91IHNob3VsZCB1c2UgdGhlIC1uIG9wdGlvbiwgb3IgLS1kcnktcnVuIGluIGl0cyBsb25nIGZvcm0uIgorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMjAsCisgICAgICAgICAgICAgICAgICAgICAgICBbIllvdSBzaG91bGQgdXNlIHRoZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIi1uIG9wdGlvbiwgb3IgLS1kcnktIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicnVuIGluIGl0cyBsb25nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZm9ybS4iXSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDIxLAorICAgICAgICAgICAgICAgICAgICAgICAgWyJZb3Ugc2hvdWxkIHVzZSB0aGUgLW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24sIG9yIC0tZHJ5LXJ1biIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImluIGl0cyBsb25nIGZvcm0uIl0pCisgICAgICAgIGV4cGVjdCA9IFsiWW91IHNob3VsZCB1c2UgdGhlIC1uIG9wdGlvbiwgb3IiLAorICAgICAgICAgICAgICAgICAgIi0tZHJ5LXJ1biBpbiBpdHMgbG9uZyBmb3JtLiJdCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAzMiwgZXhwZWN0KQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMzQsIGV4cGVjdCkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDM1LCBleHBlY3QpCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAzOCwgZXhwZWN0KQorICAgICAgICBleHBlY3QgPSBbIllvdSBzaG91bGQgdXNlIHRoZSAtbiBvcHRpb24sIG9yIC0tZHJ5LSIsCisgICAgICAgICAgICAgICAgICAicnVuIGluIGl0cyBsb25nIGZvcm0uIl0KKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDM5LCBleHBlY3QpCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCA0MSwgZXhwZWN0KQorICAgICAgICBleHBlY3QgPSBbIllvdSBzaG91bGQgdXNlIHRoZSAtbiBvcHRpb24sIG9yIC0tZHJ5LXJ1biIsCisgICAgICAgICAgICAgICAgICAiaW4gaXRzIGxvbmcgZm9ybS4iXQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgNDIsIGV4cGVjdCkKKworICAgICAgICAjIEFnYWluLCBhbGwgb2YgdGhlIGFib3ZlIGNhbiBiZSBkZWR1Y2VkIGZyb20gX3NwbGl0KCkuCisgICAgICAgIHRleHQgPSAidGhlIC1uIG9wdGlvbiwgb3IgLS1kcnktcnVuIG9yIC0tZHJ5cnVuIgorICAgICAgICBleHBlY3QgPSBbInRoZSIsICIgIiwgIi1uIiwgIiAiLCAib3B0aW9uLCIsICIgIiwgIm9yIiwgIiAiLAorICAgICAgICAgICAgICAgICAgIi0tZHJ5LSIsICJydW4iLCAiICIsICJvciIsICIgIiwgIi0tZHJ5cnVuIl0KKyAgICAgICAgc2VsZi5jaGVja19zcGxpdCh0ZXh0LCBleHBlY3QpCisKKyAgICBkZWYgdGVzdF9mdW5reV9oeXBoZW5zIChzZWxmKToKKyAgICAgICAgIyBTY3Jld3kgZWRnZSBjYXNlcyBjb29rZWQgdXAgYnkgRGF2aWQgR29vZGdlci4gIEFsbCByZXBvcnRlZAorICAgICAgICAjIGluIFNGIGJ1ZyAjNTk2NDM0LgorICAgICAgICBzZWxmLmNoZWNrX3NwbGl0KCJ3aGF0IHRoZS0taGV5ISIsIFsid2hhdCIsICIgIiwgInRoZSIsICItLSIsICJoZXkhIl0pCisgICAgICAgIHNlbGYuY2hlY2tfc3BsaXQoIndoYXQgdGhlLS0iLCBbIndoYXQiLCAiICIsICJ0aGUtLSJdKQorICAgICAgICBzZWxmLmNoZWNrX3NwbGl0KCJ3aGF0IHRoZS0tLiIsIFsid2hhdCIsICIgIiwgInRoZS0tLiJdKQorICAgICAgICBzZWxmLmNoZWNrX3NwbGl0KCItLXRleHQtLS4iLCBbIi0tdGV4dC0tLiJdKQorCisgICAgICAgICMgV2hlbiBJIGZpcnN0IHJlYWQgYnVnICM1OTY0MzQsIHRoaXMgaXMgd2hhdCBJIHRob3VnaHQgRGF2aWQKKyAgICAgICAgIyB3YXMgdGFsa2luZyBhYm91dC4gIEkgd2FzIHdyb25nOyB0aGVzZSBoYXZlIGFsd2F5cyB3b3JrZWQKKyAgICAgICAgIyBmaW5lLiAgVGhlIHJlYWwgcHJvYmxlbSBpcyB0ZXN0ZWQgaW4gdGVzdF9mdW5reV9wYXJlbnMoKQorICAgICAgICAjIGJlbG93Li4uCisgICAgICAgIHNlbGYuY2hlY2tfc3BsaXQoIi0tb3B0aW9uIiwgWyItLW9wdGlvbiJdKQorICAgICAgICBzZWxmLmNoZWNrX3NwbGl0KCItLW9wdGlvbi1vcHQiLCBbIi0tb3B0aW9uLSIsICJvcHQiXSkKKyAgICAgICAgc2VsZi5jaGVja19zcGxpdCgiZm9vIC0tb3B0aW9uLW9wdCBiYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsiZm9vIiwgIiAiLCAiLS1vcHRpb24tIiwgIm9wdCIsICIgIiwgImJhciJdKQorCisgICAgZGVmIHRlc3RfcHVuY3RfaHlwaGVucyhzZWxmKToKKyAgICAgICAgIyBPaCBib3RoZXIsIFNGICM5NjU0MjUgZm91bmQgYW5vdGhlciBwcm9ibGVtIHdpdGggaHlwaGVucyAtLQorICAgICAgICAjIGh5cGhlbmF0ZWQgd29yZHMgaW4gc2luZ2xlIHF1b3RlcyB3ZXJlbid0IGhhbmRsZWQgY29ycmVjdGx5LgorICAgICAgICAjIEluIGZhY3QsIHRoZSBidWcgaXMgdGhhdCAqYW55KiBwdW5jdHVhdGlvbiBhcm91bmQgYSBoeXBoZW5hdGVkCisgICAgICAgICMgd29yZCB3YXMgaGFuZGxlZCBpbmNvcnJlY3RseSwgZXhjZXB0IGZvciBhIGxlYWRpbmcgIi0tIiwgd2hpY2gKKyAgICAgICAgIyB3YXMgc3BlY2lhbC1jYXNlZCBmb3IgT3B0aWsgYW5kIERvY3V0aWxzLiAgU28gdGVzdCBhIHZhcmlldHkKKyAgICAgICAgIyBvZiBzdHlsZXMgb2YgcHVuY3R1YXRpb24gYXJvdW5kIGEgaHlwaGVuYXRlZCB3b3JkLgorICAgICAgICAjIChBY3R1YWxseSB0aGlzIGlzIGJhc2VkIG9uIGFuIE9wdGlrIGJ1ZyByZXBvcnQsICM4MTMwNzcpLgorICAgICAgICBzZWxmLmNoZWNrX3NwbGl0KCJ0aGUgJ3dpYmJsZS13b2JibGUnIHdpZGdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyd0aGUnLCAnICcsICInd2liYmxlLSIsICJ3b2JibGUnIiwgJyAnLCAnd2lkZ2V0J10pCisgICAgICAgIHNlbGYuY2hlY2tfc3BsaXQoJ3RoZSAid2liYmxlLXdvYmJsZSIgd2lkZ2V0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ3RoZScsICcgJywgJyJ3aWJibGUtJywgJ3dvYmJsZSInLCAnICcsICd3aWRnZXQnXSkKKyAgICAgICAgc2VsZi5jaGVja19zcGxpdCgidGhlICh3aWJibGUtd29iYmxlKSB3aWRnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsndGhlJywgJyAnLCAiKHdpYmJsZS0iLCAid29iYmxlKSIsICcgJywgJ3dpZGdldCddKQorICAgICAgICBzZWxmLmNoZWNrX3NwbGl0KCJ0aGUgWyd3aWJibGUtd29iYmxlJ10gd2lkZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ3RoZScsICcgJywgIlsnd2liYmxlLSIsICJ3b2JibGUnXSIsICcgJywgJ3dpZGdldCddKQorCisgICAgZGVmIHRlc3RfZnVua3lfcGFyZW5zIChzZWxmKToKKyAgICAgICAgIyBTZWNvbmQgcGFydCBvZiBTRiBidWcgIzU5NjQzNDogbG9uZyBvcHRpb24gc3RyaW5ncyBpbnNpZGUKKyAgICAgICAgIyBwYXJlbnRoZXNlcy4KKyAgICAgICAgc2VsZi5jaGVja19zcGxpdCgiZm9vICgtLW9wdGlvbikgYmFyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImZvbyIsICIgIiwgIigtLW9wdGlvbikiLCAiICIsICJiYXIiXSkKKworICAgICAgICAjIFJlbGF0ZWQgc3R1ZmYgLS0gbWFrZSBzdXJlIHBhcmVucyB3b3JrIGluIHNpbXBsZXIgY29udGV4dHMuCisgICAgICAgIHNlbGYuY2hlY2tfc3BsaXQoImZvbyAoYmFyKSBiYXoiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsiZm9vIiwgIiAiLCAiKGJhcikiLCAiICIsICJiYXoiXSkKKyAgICAgICAgc2VsZi5jaGVja19zcGxpdCgiYmxhaCAoZGluZyBkb25nKSwgd3ViYmEiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsiYmxhaCIsICIgIiwgIihkaW5nIiwgIiAiLCAiZG9uZyksIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiLCAid3ViYmEiXSkKKworICAgIGRlZiB0ZXN0X2Ryb3Bfd2hpdGVzcGFjZV9mYWxzZShzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGRyb3Bfd2hpdGVzcGFjZT1GYWxzZSBwcmVzZXJ2ZXMgd2hpdGVzcGFjZS4KKyAgICAgICAgIyBTRiBwYXRjaCAjMTU4MTA3MworICAgICAgICB0ZXh0ID0gIiBUaGlzIGlzIGEgICAgc2VudGVuY2Ugd2l0aCAgICAgbXVjaCB3aGl0ZXNwYWNlLiIKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgWyIgVGhpcyBpcyBhIiwgIiAgICAiLCAic2VudGVuY2UgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCAgICAgIiwgIm11Y2ggd2hpdGUiLCAic3BhY2UuIl0sCisgICAgICAgICAgICAgICAgICAgICAgICBkcm9wX3doaXRlc3BhY2U9RmFsc2UpCisKKyAgICBkZWYgdGVzdF9kcm9wX3doaXRlc3BhY2VfZmFsc2Vfd2hpdGVzcGFjZV9vbmx5KHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgZHJvcF93aGl0ZXNwYWNlPUZhbHNlIHByZXNlcnZlcyBhIHdoaXRlc3BhY2Utb25seSBzdHJpbmcuCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCgiICAgIiwgNiwgWyIgICAiXSwgZHJvcF93aGl0ZXNwYWNlPUZhbHNlKQorCisgICAgZGVmIHRlc3RfZHJvcF93aGl0ZXNwYWNlX2ZhbHNlX3doaXRlc3BhY2Vfb25seV93aXRoX2luZGVudChzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGEgd2hpdGVzcGFjZS1vbmx5IHN0cmluZyBnZXRzIGluZGVudGVkICh3aGVuCisgICAgICAgICMgZHJvcF93aGl0ZXNwYWNlIGlzIEZhbHNlKS4KKyAgICAgICAgc2VsZi5jaGVja193cmFwKCIgICAiLCA2LCBbIiAgICAgIl0sIGRyb3Bfd2hpdGVzcGFjZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfaW5kZW50PSIgICIpCisKKyAgICBkZWYgdGVzdF9kcm9wX3doaXRlc3BhY2Vfd2hpdGVzcGFjZV9vbmx5KHNlbGYpOgorICAgICAgICAjIENoZWNrIGRyb3Bfd2hpdGVzcGFjZSBvbiBhIHdoaXRlc3BhY2Utb25seSBzdHJpbmcuCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCgiICAiLCA2LCBbXSkKKworICAgIGRlZiB0ZXN0X2Ryb3Bfd2hpdGVzcGFjZV9sZWFkaW5nX3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBkcm9wX3doaXRlc3BhY2UgZG9lcyBub3QgZHJvcCBsZWFkaW5nIHdoaXRlc3BhY2UgKGlmCisgICAgICAgICMgZm9sbG93ZWQgYnkgbm9uLXdoaXRlc3BhY2UpLgorICAgICAgICAjIFNGIGJ1ZyAjNjIyODQ5IHJlcG9ydGVkIGluY29uc2lzdGVudCBoYW5kbGluZyBvZiBsZWFkaW5nCisgICAgICAgICMgd2hpdGVzcGFjZTsgbGV0J3MgdGVzdCB0aGF0IGEgYml0LCBzaGFsbCB3ZT8KKyAgICAgICAgdGV4dCA9ICIgVGhpcyBpcyBhIHNlbnRlbmNlIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlLiIKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgWyIgVGhpcyBpcyBhIHNlbnRlbmNlIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlLiJdKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMzAsCisgICAgICAgICAgICAgICAgICAgICAgICBbIiBUaGlzIGlzIGEgc2VudGVuY2Ugd2l0aCIsICJsZWFkaW5nIHdoaXRlc3BhY2UuIl0pCisKKyAgICBkZWYgdGVzdF9kcm9wX3doaXRlc3BhY2Vfd2hpdGVzcGFjZV9saW5lKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgZHJvcF93aGl0ZXNwYWNlIHNraXBzIHRoZSB3aG9sZSBsaW5lIGlmIGEgbm9uLWxlYWRpbmcKKyAgICAgICAgIyBsaW5lIGNvbnNpc3RzIG9ubHkgb2Ygd2hpdGVzcGFjZS4KKyAgICAgICAgdGV4dCA9ICJhYmNkICAgIGVmZ2giCisgICAgICAgICMgSW5jbHVkZSB0aGUgcmVzdWx0IGZvciBkcm9wX3doaXRlc3BhY2U9RmFsc2UgZm9yIGNvbXBhcmlzb24uCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCA2LCBbImFiY2QiLCAiICAgICIsICJlZmdoIl0sCisgICAgICAgICAgICAgICAgICAgICAgICBkcm9wX3doaXRlc3BhY2U9RmFsc2UpCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCA2LCBbImFiY2QiLCAiZWZnaCJdKQorCisgICAgZGVmIHRlc3RfZHJvcF93aGl0ZXNwYWNlX3doaXRlc3BhY2Vfb25seV93aXRoX2luZGVudChzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGluaXRpYWxfaW5kZW50IGlzIG5vdCBhcHBsaWVkIHRvIGEgd2hpdGVzcGFjZS1vbmx5CisgICAgICAgICMgc3RyaW5nLiAgVGhpcyBjaGVja3MgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIGZhY3QgdGhhdCBkcm9wcGluZworICAgICAgICAjIHdoaXRlc3BhY2Ugb2NjdXJzIGJlZm9yZSBpbmRlbnRpbmcuCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCgiICAiLCA2LCBbXSwgaW5pdGlhbF9pbmRlbnQ9IisrIikKKworICAgIGRlZiB0ZXN0X2Ryb3Bfd2hpdGVzcGFjZV93aGl0ZXNwYWNlX2luZGVudChzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGRyb3Bfd2hpdGVzcGFjZSBkb2VzIG5vdCBkcm9wIHdoaXRlc3BhY2UgaW5kZW50cy4KKyAgICAgICAgIyBUaGlzIGNoZWNrcyBhIHNwZWNpYWwgY2FzZSBvZiB0aGUgZmFjdCB0aGF0IGRyb3BwaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgIyBvY2N1cnMgYmVmb3JlIGluZGVudGluZy4KKyAgICAgICAgc2VsZi5jaGVja193cmFwKCJhYmNkIGVmZ2giLCA2LCBbIiAgYWJjZCIsICIgIGVmZ2giXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfaW5kZW50PSIgICIsIHN1YnNlcXVlbnRfaW5kZW50PSIgICIpCisKKyAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOgorICAgICAgICAgICAgIyAqVmVyeSogc2ltcGxlIHRlc3Qgb2Ygd3JhcHBpbmcgVW5pY29kZSBzdHJpbmdzLiAgSSdtIHN1cmUKKyAgICAgICAgICAgICMgdGhlcmUncyBtb3JlIHRvIGl0IHRoYW4gdGhpcywgYnV0IGxldCdzIGF0IGxlYXN0IG1ha2UKKyAgICAgICAgICAgICMgc3VyZSB0ZXh0d3JhcCBkb2Vzbid0IGNyYXNoIG9uIFVuaWNvZGUgaW5wdXQhCisgICAgICAgICAgICB0ZXh0ID0gdSJIZWxsbyB0aGVyZSwgaG93IGFyZSB5b3UgdG9kYXk/IgorICAgICAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDUwLCBbdSJIZWxsbyB0aGVyZSwgaG93IGFyZSB5b3UgdG9kYXk/Il0pCisgICAgICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMjAsIFt1IkhlbGxvIHRoZXJlLCBob3cgYXJlIiwgInlvdSB0b2RheT8iXSkKKyAgICAgICAgICAgIG9saW5lcyA9IHNlbGYud3JhcHBlci53cmFwKHRleHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uob2xpbmVzLCBsaXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG9saW5lc1swXSwgdW5pY29kZSkKKyAgICAgICAgICAgIG90ZXh0ID0gc2VsZi53cmFwcGVyLmZpbGwodGV4dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShvdGV4dCwgdW5pY29kZSkKKworICAgICAgICBkZWYgdGVzdF9ub19zcGxpdF9hdF91bWxhdXQoc2VsZik6CisgICAgICAgICAgICB0ZXh0ID0gdSJEaWUgRW1wZlx4ZTRuZ2VyLUF1c3dhaGwiCisgICAgICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMTMsIFt1IkRpZSIsIHUiRW1wZlx4ZTRuZ2VyLSIsIHUiQXVzd2FobCJdKQorCisgICAgICAgIGRlZiB0ZXN0X3VtbGF1dF9mb2xsb3dlZF9ieV9kYXNoKHNlbGYpOgorICAgICAgICAgICAgdGV4dCA9IHUiYWEgXHhlNFx4ZTQtXHhlNFx4ZTQiCisgICAgICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgNywgW3UiYWEgXHhlNFx4ZTQtIiwgdSJceGU0XHhlNCJdKQorCisgICAgZGVmIHRlc3Rfc3BsaXQoc2VsZik6CisgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIHN0YW5kYXJkIF9zcGxpdCgpIG1ldGhvZCB3b3JrcyBhcyBhZHZlcnRpc2VkCisgICAgICAgICMgaW4gdGhlIGNvbW1lbnRzCisKKyAgICAgICAgdGV4dCA9ICJIZWxsbyB0aGVyZSAtLSB5b3UgZ29vZi1iYWxsLCB1c2UgdGhlIC1iIG9wdGlvbiEiCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi53cmFwcGVyLl9zcGxpdCh0ZXh0KQorICAgICAgICBzZWxmLmNoZWNrKHJlc3VsdCwKKyAgICAgICAgICAgICBbIkhlbGxvIiwgIiAiLCAidGhlcmUiLCAiICIsICItLSIsICIgIiwgInlvdSIsICIgIiwgImdvb2YtIiwKKyAgICAgICAgICAgICAgImJhbGwsIiwgIiAiLCAidXNlIiwgIiAiLCAidGhlIiwgIiAiLCAiLWIiLCAiICIsICAib3B0aW9uISJdKQorCisgICAgZGVmIHRlc3RfYnJlYWtfb25faHlwaGVucyhzZWxmKToKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB0aGUgYnJlYWtfb25faHlwaGVucyBhdHRyaWJ1dGVzIHdvcmsKKyAgICAgICAgdGV4dCA9ICJ5YWJhIGRhYmEtZG9vIgorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMTAsIFsieWFiYSBkYWJhLSIsICJkb28iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrX29uX2h5cGhlbnM9VHJ1ZSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDEwLCBbInlhYmEiLCAiZGFiYS1kb28iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrX29uX2h5cGhlbnM9RmFsc2UpCisKKyAgICBkZWYgdGVzdF9iYWRfd2lkdGgoc2VsZik6CisgICAgICAgICMgRW5zdXJlIHRoYXQgd2lkdGggPD0gMCBpcyBjYXVnaHQuCisgICAgICAgIHRleHQgPSAiV2hhdGV2ZXIsIGl0IGRvZXNuJ3QgbWF0dGVyLiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgd3JhcCwgdGV4dCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgd3JhcCwgdGV4dCwgLTEpCisKKworY2xhc3MgTG9uZ1dvcmRUZXN0Q2FzZSAoQmFzZVRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYud3JhcHBlciA9IFRleHRXcmFwcGVyKCkKKyAgICAgICAgc2VsZi50ZXh0ID0gJycnXAorRGlkIHlvdSBzYXkgInN1cGVyY2FsaWZyYWdpbGlzdGljZXhwaWFsaWRvY2lvdXM/IgorSG93ICpkbyogeW91IHNwZWxsIHRoYXQgb2RkIHdvcmQsIGFueXdheXM/CisnJycKKworICAgIGRlZiB0ZXN0X2JyZWFrX2xvbmcoc2VsZik6CisgICAgICAgICMgV3JhcCB0ZXh0IHdpdGggbG9uZyB3b3JkcyBhbmQgbG90cyBvZiBwdW5jdHVhdGlvbgorCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcChzZWxmLnRleHQsIDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgWydEaWQgeW91IHNheSAic3VwZXJjYWxpZnJhZ2lsaXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0aWNleHBpYWxpZG9jaW91cz8iIEhvdyAqZG8qJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAneW91IHNwZWxsIHRoYXQgb2RkIHdvcmQsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYW55d2F5cz8nXSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHNlbGYudGV4dCwgNTAsCisgICAgICAgICAgICAgICAgICAgICAgICBbJ0RpZCB5b3Ugc2F5ICJzdXBlcmNhbGlmcmFnaWxpc3RpY2V4cGlhbGlkb2Npb3VzPyInLAorICAgICAgICAgICAgICAgICAgICAgICAgICdIb3cgKmRvKiB5b3Ugc3BlbGwgdGhhdCBvZGQgd29yZCwgYW55d2F5cz8nXSkKKworICAgICAgICAjIFNGIGJ1ZyA3OTc2NTAuICBQcmV2ZW50IGFuIGluZmluaXRlIGxvb3AgYnkgbWFraW5nIHN1cmUgdGhhdCBhdAorICAgICAgICAjIGxlYXN0IG9uZSBjaGFyYWN0ZXIgZ2V0cyBzcGxpdCBvZmYgb24gZXZlcnkgcGFzcy4KKyAgICAgICAgc2VsZi5jaGVja193cmFwKCctJyoxMCsnaGVsbG8nLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsnLS0tLS0tLS0tLScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgIGgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgIGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICBvJ10sCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50X2luZGVudCA9ICcgJyoxNSkKKworICAgICAgICAjIGJ1ZyAxMTQ2LiAgUHJldmVudCBhIGxvbmcgd29yZCB0byBiZSB3cm9uZ2x5IHdyYXBwZWQgd2hlbiB0aGUKKyAgICAgICAgIyBwcmVjZWRpbmcgd29yZCBpcyBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgc2hvcnRlciB0aGFuIHRoZSB3aWR0aAorICAgICAgICBzZWxmLmNoZWNrX3dyYXAoc2VsZi50ZXh0LCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsnRGlkIHlvdSBzYXkgJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnInN1cGVyY2FsaWZyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYWdpbGlzdGljZXhwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnaWFsaWRvY2lvdXM/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnIiBIb3cgKmRvKicsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3lvdSBzcGVsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoYXQgb2RkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnd29yZCwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICdhbnl3YXlzPyddKQorCisgICAgZGVmIHRlc3Rfbm9icmVha19sb25nKHNlbGYpOgorICAgICAgICAjIFRlc3Qgd2l0aCBicmVha19sb25nX3dvcmRzIGRpc2FibGVkCisgICAgICAgIHNlbGYud3JhcHBlci5icmVha19sb25nX3dvcmRzID0gMAorICAgICAgICBzZWxmLndyYXBwZXIud2lkdGggPSAzMAorICAgICAgICBleHBlY3QgPSBbJ0RpZCB5b3Ugc2F5JywKKyAgICAgICAgICAgICAgICAgICcic3VwZXJjYWxpZnJhZ2lsaXN0aWNleHBpYWxpZG9jaW91cz8iJywKKyAgICAgICAgICAgICAgICAgICdIb3cgKmRvKiB5b3Ugc3BlbGwgdGhhdCBvZGQnLAorICAgICAgICAgICAgICAgICAgJ3dvcmQsIGFueXdheXM/JworICAgICAgICAgICAgICAgICAgXQorICAgICAgICByZXN1bHQgPSBzZWxmLndyYXBwZXIud3JhcChzZWxmLnRleHQpCisgICAgICAgIHNlbGYuY2hlY2socmVzdWx0LCBleHBlY3QpCisKKyAgICAgICAgIyBTYW1lIHRoaW5nIHdpdGgga3dhcmdzIHBhc3NlZCB0byBzdGFuZGFsb25lIHdyYXAoKSBmdW5jdGlvbi4KKyAgICAgICAgcmVzdWx0ID0gd3JhcChzZWxmLnRleHQsIHdpZHRoPTMwLCBicmVha19sb25nX3dvcmRzPTApCisgICAgICAgIHNlbGYuY2hlY2socmVzdWx0LCBleHBlY3QpCisKKworY2xhc3MgSW5kZW50VGVzdENhc2VzKEJhc2VUZXN0Q2FzZSk6CisKKyAgICAjIGNhbGxlZCBiZWZvcmUgZWFjaCB0ZXN0IG1ldGhvZAorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZXh0ID0gJycnXAorVGhpcyBwYXJhZ3JhcGggd2lsbCBiZSBmaWxsZWQsIGZpcnN0IHdpdGhvdXQgYW55IGluZGVudGF0aW9uLAorYW5kIHRoZW4gd2l0aCBzb21lIChpbmNsdWRpbmcgYSBoYW5naW5nIGluZGVudCkuJycnCisKKworICAgIGRlZiB0ZXN0X2ZpbGwoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGUgZmlsbCgpIG1ldGhvZAorCisgICAgICAgIGV4cGVjdCA9ICcnJ1wKK1RoaXMgcGFyYWdyYXBoIHdpbGwgYmUgZmlsbGVkLCBmaXJzdAord2l0aG91dCBhbnkgaW5kZW50YXRpb24sIGFuZCB0aGVuIHdpdGgKK3NvbWUgKGluY2x1ZGluZyBhIGhhbmdpbmcgaW5kZW50KS4nJycKKworICAgICAgICByZXN1bHQgPSBmaWxsKHNlbGYudGV4dCwgNDApCisgICAgICAgIHNlbGYuY2hlY2socmVzdWx0LCBleHBlY3QpCisKKworICAgIGRlZiB0ZXN0X2luaXRpYWxfaW5kZW50KHNlbGYpOgorICAgICAgICAjIFRlc3QgaW5pdGlhbF9pbmRlbnQgcGFyYW1ldGVyCisKKyAgICAgICAgZXhwZWN0ID0gWyIgICAgIFRoaXMgcGFyYWdyYXBoIHdpbGwgYmUgZmlsbGVkLCIsCisgICAgICAgICAgICAgICAgICAiZmlyc3Qgd2l0aG91dCBhbnkgaW5kZW50YXRpb24sIGFuZCB0aGVuIiwKKyAgICAgICAgICAgICAgICAgICJ3aXRoIHNvbWUgKGluY2x1ZGluZyBhIGhhbmdpbmcgaW5kZW50KS4iXQorICAgICAgICByZXN1bHQgPSB3cmFwKHNlbGYudGV4dCwgNDAsIGluaXRpYWxfaW5kZW50PSIgICAgICIpCisgICAgICAgIHNlbGYuY2hlY2socmVzdWx0LCBleHBlY3QpCisKKyAgICAgICAgZXhwZWN0ID0gIlxuIi5qb2luKGV4cGVjdCkKKyAgICAgICAgcmVzdWx0ID0gZmlsbChzZWxmLnRleHQsIDQwLCBpbml0aWFsX2luZGVudD0iICAgICAiKQorICAgICAgICBzZWxmLmNoZWNrKHJlc3VsdCwgZXhwZWN0KQorCisKKyAgICBkZWYgdGVzdF9zdWJzZXF1ZW50X2luZGVudChzZWxmKToKKyAgICAgICAgIyBUZXN0IHN1YnNlcXVlbnRfaW5kZW50IHBhcmFtZXRlcgorCisgICAgICAgIGV4cGVjdCA9ICcnJ1wKKyAgKiBUaGlzIHBhcmFncmFwaCB3aWxsIGJlIGZpbGxlZCwgZmlyc3QKKyAgICB3aXRob3V0IGFueSBpbmRlbnRhdGlvbiwgYW5kIHRoZW4KKyAgICB3aXRoIHNvbWUgKGluY2x1ZGluZyBhIGhhbmdpbmcKKyAgICBpbmRlbnQpLicnJworCisgICAgICAgIHJlc3VsdCA9IGZpbGwoc2VsZi50ZXh0LCA0MCwKKyAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD0iICAqICIsIHN1YnNlcXVlbnRfaW5kZW50PSIgICAgIikKKyAgICAgICAgc2VsZi5jaGVjayhyZXN1bHQsIGV4cGVjdCkKKworCisjIERlc3BpdGUgdGhlIHNpbWlsYXIgbmFtZXMsIERlZGVudFRlc3RDYXNlIGlzICpub3QqIHRoZSBpbnZlcnNlCisjIG9mIEluZGVudFRlc3RDYXNlIQorY2xhc3MgRGVkZW50VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGFzc2VydFVuY2hhbmdlZChzZWxmLCB0ZXh0KToKKyAgICAgICAgIiIiYXNzZXJ0IHRoYXQgZGVkZW50KCkgaGFzIG5vIGVmZmVjdCBvbiAndGV4dCciIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBkZWRlbnQodGV4dCkpCisKKyAgICBkZWYgdGVzdF9kZWRlbnRfbm9tYXJnaW4oc2VsZik6CisgICAgICAgICMgTm8gbGluZXMgaW5kZW50ZWQuCisgICAgICAgIHRleHQgPSAiSGVsbG8gdGhlcmUuXG5Ib3cgYXJlIHlvdT9cbk9oIGdvb2QsIEknbSBnbGFkLiIKKyAgICAgICAgc2VsZi5hc3NlcnRVbmNoYW5nZWQodGV4dCkKKworICAgICAgICAjIFNpbWlsYXIsIHdpdGggYSBibGFuayBsaW5lLgorICAgICAgICB0ZXh0ID0gIkhlbGxvIHRoZXJlLlxuXG5Cb28hIgorICAgICAgICBzZWxmLmFzc2VydFVuY2hhbmdlZCh0ZXh0KQorCisgICAgICAgICMgU29tZSBsaW5lcyBpbmRlbnRlZCwgYnV0IG92ZXJhbGwgbWFyZ2luIGlzIHN0aWxsIHplcm8uCisgICAgICAgIHRleHQgPSAiSGVsbG8gdGhlcmUuXG4gIFRoaXMgaXMgaW5kZW50ZWQuIgorICAgICAgICBzZWxmLmFzc2VydFVuY2hhbmdlZCh0ZXh0KQorCisgICAgICAgICMgQWdhaW4sIGFkZCBhIGJsYW5rIGxpbmUuCisgICAgICAgIHRleHQgPSAiSGVsbG8gdGhlcmUuXG5cbiAgQm9vIVxuIgorICAgICAgICBzZWxmLmFzc2VydFVuY2hhbmdlZCh0ZXh0KQorCisgICAgZGVmIHRlc3RfZGVkZW50X2V2ZW4oc2VsZik6CisgICAgICAgICMgQWxsIGxpbmVzIGluZGVudGVkIGJ5IHR3byBzcGFjZXMuCisgICAgICAgIHRleHQgPSAiICBIZWxsbyB0aGVyZS5cbiAgSG93IGFyZSB5YT9cbiAgT2ggZ29vZC4iCisgICAgICAgIGV4cGVjdCA9ICJIZWxsbyB0aGVyZS5cbkhvdyBhcmUgeWE/XG5PaCBnb29kLiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGRlZGVudCh0ZXh0KSkKKworICAgICAgICAjIFNhbWUsIHdpdGggYmxhbmsgbGluZXMuCisgICAgICAgIHRleHQgPSAiICBIZWxsbyB0aGVyZS5cblxuICBIb3cgYXJlIHlhP1xuICBPaCBnb29kLlxuIgorICAgICAgICBleHBlY3QgPSAiSGVsbG8gdGhlcmUuXG5cbkhvdyBhcmUgeWE/XG5PaCBnb29kLlxuIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgZGVkZW50KHRleHQpKQorCisgICAgICAgICMgTm93IGluZGVudCBvbmUgb2YgdGhlIGJsYW5rIGxpbmVzLgorICAgICAgICB0ZXh0ID0gIiAgSGVsbG8gdGhlcmUuXG4gIFxuICBIb3cgYXJlIHlhP1xuICBPaCBnb29kLlxuIgorICAgICAgICBleHBlY3QgPSAiSGVsbG8gdGhlcmUuXG5cbkhvdyBhcmUgeWE/XG5PaCBnb29kLlxuIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgZGVkZW50KHRleHQpKQorCisgICAgZGVmIHRlc3RfZGVkZW50X3VuZXZlbihzZWxmKToKKyAgICAgICAgIyBMaW5lcyBpbmRlbnRlZCB1bmV2ZW5seS4KKyAgICAgICAgdGV4dCA9ICcnJ1wKKyAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICByZXR1cm4gZm9vCisgICAgICAgICcnJworICAgICAgICBleHBlY3QgPSAnJydcCitkZWYgZm9vKCk6CisgICAgd2hpbGUgMToKKyAgICAgICAgcmV0dXJuIGZvbworJycnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCBkZWRlbnQodGV4dCkpCisKKyAgICAgICAgIyBVbmV2ZW4gaW5kZW50YXRpb24gd2l0aCBhIGJsYW5rIGxpbmUuCisgICAgICAgIHRleHQgPSAiICBGb29cbiAgICBCYXJcblxuICAgQmF6XG4iCisgICAgICAgIGV4cGVjdCA9ICJGb29cbiAgQmFyXG5cbiBCYXpcbiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGRlZGVudCh0ZXh0KSkKKworICAgICAgICAjIFVuZXZlbiBpbmRlbnRhdGlvbiB3aXRoIGEgd2hpdGVzcGFjZS1vbmx5IGxpbmUuCisgICAgICAgIHRleHQgPSAiICBGb29cbiAgICBCYXJcbiBcbiAgIEJhelxuIgorICAgICAgICBleHBlY3QgPSAiRm9vXG4gIEJhclxuXG4gQmF6XG4iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCBkZWRlbnQodGV4dCkpCisKKyAgICAjIGRlZGVudCgpIHNob3VsZCBub3QgbWFuZ2xlIGludGVybmFsIHRhYnMKKyAgICBkZWYgdGVzdF9kZWRlbnRfcHJlc2VydmVfaW50ZXJuYWxfdGFicyhzZWxmKToKKyAgICAgICAgdGV4dCA9ICIgIGhlbGxvXHR0aGVyZVxuICBob3cgYXJlXHR5b3U/IgorICAgICAgICBleHBlY3QgPSAiaGVsbG9cdHRoZXJlXG5ob3cgYXJlXHR5b3U/IgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgZGVkZW50KHRleHQpKQorCisgICAgICAgICMgbWFrZSBzdXJlIHRoYXQgaXQgcHJlc2VydmVzIHRhYnMgd2hlbiBpdCdzIG5vdCBtYWtpbmcgYW55CisgICAgICAgICMgY2hhbmdlcyBhdCBhbGwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGRlZGVudChleHBlY3QpKQorCisgICAgIyBkZWRlbnQoKSBzaG91bGQgbm90IG1hbmdsZSB0YWJzIGluIHRoZSBtYXJnaW4gKGkuZS4KKyAgICAjIHRhYnMgYW5kIHNwYWNlcyBib3RoIGNvdW50IGFzIG1hcmdpbiwgYnV0IGFyZSAqbm90KgorICAgICMgY29uc2lkZXJlZCBlcXVpdmFsZW50KQorICAgIGRlZiB0ZXN0X2RlZGVudF9wcmVzZXJ2ZV9tYXJnaW5fdGFicyhzZWxmKToKKyAgICAgICAgdGV4dCA9ICIgIGhlbGxvIHRoZXJlXG5cdGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRVbmNoYW5nZWQodGV4dCkKKworICAgICAgICAjIHNhbWUgZWZmZWN0IGV2ZW4gaWYgd2UgaGF2ZSA4IHNwYWNlcworICAgICAgICB0ZXh0ID0gIiAgICAgICAgaGVsbG8gdGhlcmVcblx0aG93IGFyZSB5b3U/IgorICAgICAgICBzZWxmLmFzc2VydFVuY2hhbmdlZCh0ZXh0KQorCisgICAgICAgICMgZGVkZW50KCkgb25seSByZW1vdmVzIHdoaXRlc3BhY2UgdGhhdCBjYW4gYmUgdW5pZm9ybWx5IHJlbW92ZWQhCisgICAgICAgIHRleHQgPSAiXHRoZWxsbyB0aGVyZVxuXHRob3cgYXJlIHlvdT8iCisgICAgICAgIGV4cGVjdCA9ICJoZWxsbyB0aGVyZVxuaG93IGFyZSB5b3U/IgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgZGVkZW50KHRleHQpKQorCisgICAgICAgIHRleHQgPSAiICBcdGhlbGxvIHRoZXJlXG4gIFx0aG93IGFyZSB5b3U/IgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgZGVkZW50KHRleHQpKQorCisgICAgICAgIHRleHQgPSAiICBcdCAgaGVsbG8gdGhlcmVcbiAgXHQgIGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGRlZGVudCh0ZXh0KSkKKworICAgICAgICB0ZXh0ID0gIiAgXHRoZWxsbyB0aGVyZVxuICBcdCAgaG93IGFyZSB5b3U/IgorICAgICAgICBleHBlY3QgPSAiaGVsbG8gdGhlcmVcbiAgaG93IGFyZSB5b3U/IgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgZGVkZW50KHRleHQpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFdyYXBUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvbmdXb3JkVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRlbnRUZXN0Q2FzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWRlbnRUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGV4dHdyYXAucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGV4dHdyYXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYzQ1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZXh0d3JhcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGV4dHdyYXAucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGV4dHdyYXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYzQ1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZXh0d3JhcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMzg4OWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWQucHkKQEAgLTAsMCArMSwyNjUgQEAKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgcmFuZG9tCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAordGhyZWFkID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RocmVhZCcpCitpbXBvcnQgdGltZQoraW1wb3J0IHN5cworaW1wb3J0IHdlYWtyZWYKKworZnJvbSB0ZXN0IGltcG9ydCBsb2NrX3Rlc3RzCisKK05VTVRBU0tTID0gMTAKK05VTVRSSVBTID0gMworCisKK19wcmludF9tdXRleCA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKKworZGVmIHZlcmJvc2VfcHJpbnQoYXJnKToKKyAgICAiIiJIZWxwZXIgZnVuY3Rpb24gZm9yIHByaW50aW5nIG91dCBkZWJ1Z2dpbmcgb3V0cHV0LiIiIgorICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICB3aXRoIF9wcmludF9tdXRleDoKKyAgICAgICAgICAgIHByaW50IGFyZworCisKK2NsYXNzIEJhc2ljVGhyZWFkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZG9uZV9tdXRleCA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKKyAgICAgICAgc2VsZi5kb25lX211dGV4LmFjcXVpcmUoKQorICAgICAgICBzZWxmLnJ1bm5pbmdfbXV0ZXggPSB0aHJlYWQuYWxsb2NhdGVfbG9jaygpCisgICAgICAgIHNlbGYucmFuZG9tX211dGV4ID0gdGhyZWFkLmFsbG9jYXRlX2xvY2soKQorICAgICAgICBzZWxmLmNyZWF0ZWQgPSAwCisgICAgICAgIHNlbGYucnVubmluZyA9IDAKKyAgICAgICAgc2VsZi5uZXh0X2lkZW50ID0gMAorCisKK2NsYXNzIFRocmVhZFJ1bm5pbmdUZXN0cyhCYXNpY1RocmVhZFRlc3QpOgorCisgICAgZGVmIG5ld3Rhc2soc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5ydW5uaW5nX211dGV4OgorICAgICAgICAgICAgc2VsZi5uZXh0X2lkZW50ICs9IDEKKyAgICAgICAgICAgIHZlcmJvc2VfcHJpbnQoImNyZWF0aW5nIHRhc2sgJXMiICUgc2VsZi5uZXh0X2lkZW50KQorICAgICAgICAgICAgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoc2VsZi50YXNrLCAoc2VsZi5uZXh0X2lkZW50LCkpCisgICAgICAgICAgICBzZWxmLmNyZWF0ZWQgKz0gMQorICAgICAgICAgICAgc2VsZi5ydW5uaW5nICs9IDEKKworICAgIGRlZiB0YXNrKHNlbGYsIGlkZW50KToKKyAgICAgICAgd2l0aCBzZWxmLnJhbmRvbV9tdXRleDoKKyAgICAgICAgICAgIGRlbGF5ID0gcmFuZG9tLnJhbmRvbSgpIC8gMTAwMDAuMAorICAgICAgICB2ZXJib3NlX3ByaW50KCJ0YXNrICVzIHdpbGwgcnVuIGZvciAlc3VzIiAlIChpZGVudCwgcm91bmQoZGVsYXkqMWU2KSkpCisgICAgICAgIHRpbWUuc2xlZXAoZGVsYXkpCisgICAgICAgIHZlcmJvc2VfcHJpbnQoInRhc2sgJXMgZG9uZSIgJSBpZGVudCkKKyAgICAgICAgd2l0aCBzZWxmLnJ1bm5pbmdfbXV0ZXg6CisgICAgICAgICAgICBzZWxmLnJ1bm5pbmcgLT0gMQorICAgICAgICAgICAgaWYgc2VsZi5jcmVhdGVkID09IE5VTVRBU0tTIGFuZCBzZWxmLnJ1bm5pbmcgPT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLmRvbmVfbXV0ZXgucmVsZWFzZSgpCisKKyAgICBkZWYgdGVzdF9zdGFydGluZ190aHJlYWRzKHNlbGYpOgorICAgICAgICAjIEJhc2ljIHRlc3QgZm9yIHRocmVhZCBjcmVhdGlvbi4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTlVNVEFTS1MpOgorICAgICAgICAgICAgc2VsZi5uZXd0YXNrKCkKKyAgICAgICAgdmVyYm9zZV9wcmludCgid2FpdGluZyBmb3IgdGFza3MgdG8gY29tcGxldGUuLi4iKQorICAgICAgICBzZWxmLmRvbmVfbXV0ZXguYWNxdWlyZSgpCisgICAgICAgIHZlcmJvc2VfcHJpbnQoImFsbCB0YXNrcyBkb25lIikKKworICAgIGRlZiB0ZXN0X3N0YWNrX3NpemUoc2VsZik6CisgICAgICAgICMgVmFyaW91cyBzdGFjayBzaXplIHRlc3RzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRocmVhZC5zdGFja19zaXplKCksIDAsICJpbml0aWFsIHN0YWNrIHNpemUgaXMgbm90IDAiKQorCisgICAgICAgIHRocmVhZC5zdGFja19zaXplKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhyZWFkLnN0YWNrX3NpemUoKSwgMCwgInN0YWNrX3NpemUgbm90IHJlc2V0IHRvIGRlZmF1bHQiKQorCisgICAgICAgIGlmIG9zLm5hbWUgbm90IGluICgibnQiLCAib3MyIiwgInBvc2l4Iik6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0c3Nfc3VwcG9ydGVkID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0aHJlYWQuc3RhY2tfc2l6ZSg0MDk2KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHZlcmJvc2VfcHJpbnQoImNhdWdodCBleHBlY3RlZCBWYWx1ZUVycm9yIHNldHRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFja19zaXplKDQwOTYpIikKKyAgICAgICAgZXhjZXB0IHRocmVhZC5lcnJvcjoKKyAgICAgICAgICAgIHRzc19zdXBwb3J0ZWQgPSBGYWxzZQorICAgICAgICAgICAgdmVyYm9zZV9wcmludCgicGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aHJlYWQgc3RhY2sgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaXplIikKKworICAgICAgICBpZiB0c3Nfc3VwcG9ydGVkOgorICAgICAgICAgICAgZmFpbF9tc2cgPSAic3RhY2tfc2l6ZSglZCkgZmFpbGVkIC0gc2hvdWxkIHN1Y2NlZWQiCisgICAgICAgICAgICBmb3IgdHNzIGluICgyNjIxNDQsIDB4MTAwMDAwLCAwKToKKyAgICAgICAgICAgICAgICB0aHJlYWQuc3RhY2tfc2l6ZSh0c3MpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aHJlYWQuc3RhY2tfc2l6ZSgpLCB0c3MsIGZhaWxfbXNnICUgdHNzKQorICAgICAgICAgICAgICAgIHZlcmJvc2VfcHJpbnQoInN1Y2Nlc3NmdWxseSBzZXQgc3RhY2tfc2l6ZSglZCkiICUgdHNzKQorCisgICAgICAgICAgICBmb3IgdHNzIGluICgyNjIxNDQsIDB4MTAwMDAwKToKKyAgICAgICAgICAgICAgICB2ZXJib3NlX3ByaW50KCJ0cnlpbmcgc3RhY2tfc2l6ZSA9ICglZCkiICUgdHNzKQorICAgICAgICAgICAgICAgIHNlbGYubmV4dF9pZGVudCA9IDAKKyAgICAgICAgICAgICAgICBzZWxmLmNyZWF0ZWQgPSAwCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTlVNVEFTS1MpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm5ld3Rhc2soKQorCisgICAgICAgICAgICAgICAgdmVyYm9zZV9wcmludCgid2FpdGluZyBmb3IgYWxsIHRhc2tzIHRvIGNvbXBsZXRlIikKKyAgICAgICAgICAgICAgICBzZWxmLmRvbmVfbXV0ZXguYWNxdWlyZSgpCisgICAgICAgICAgICAgICAgdmVyYm9zZV9wcmludCgiYWxsIHRhc2tzIGRvbmUiKQorCisgICAgICAgICAgICB0aHJlYWQuc3RhY2tfc2l6ZSgwKQorCisgICAgZGVmIHRlc3RfX2NvdW50KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhlIF9jb3VudCgpIGZ1bmN0aW9uLgorICAgICAgICBvcmlnID0gdGhyZWFkLl9jb3VudCgpCisgICAgICAgIG11dCA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKKyAgICAgICAgbXV0LmFjcXVpcmUoKQorICAgICAgICBzdGFydGVkID0gW10KKyAgICAgICAgZGVmIHRhc2soKToKKyAgICAgICAgICAgIHN0YXJ0ZWQuYXBwZW5kKE5vbmUpCisgICAgICAgICAgICBtdXQuYWNxdWlyZSgpCisgICAgICAgICAgICBtdXQucmVsZWFzZSgpCisgICAgICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKHRhc2ssICgpKQorICAgICAgICB3aGlsZSBub3Qgc3RhcnRlZDoKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aHJlYWQuX2NvdW50KCksIG9yaWcgKyAxKQorICAgICAgICAjIEFsbG93IHRoZSB0YXNrIHRvIGZpbmlzaC4KKyAgICAgICAgbXV0LnJlbGVhc2UoKQorICAgICAgICAjIFRoZSBvbmx5IHJlbGlhYmxlIHdheSB0byBiZSBzdXJlIHRoYXQgdGhlIHRocmVhZCBlbmRlZCBmcm9tIHRoZQorICAgICAgICAjIGludGVycHJldGVyJ3MgcG9pbnQgb2YgdmlldyBpcyB0byB3YWl0IGZvciB0aGUgZnVuY3Rpb24gb2JqZWN0IHRvIGJlCisgICAgICAgICMgZGVzdHJveWVkLgorICAgICAgICBkb25lID0gW10KKyAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZih0YXNrLCBsYW1iZGEgXzogZG9uZS5hcHBlbmQoTm9uZSkpCisgICAgICAgIGRlbCB0YXNrCisgICAgICAgIHdoaWxlIG5vdCBkb25lOgorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRocmVhZC5fY291bnQoKSwgb3JpZykKKworICAgIGRlZiB0ZXN0X3NhdmVfZXhjZXB0aW9uX3N0YXRlX29uX2Vycm9yKHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAjMTQ0NzQKKyAgICAgICAgZGVmIHRhc2soKToKKyAgICAgICAgICAgIHN0YXJ0ZWQucmVsZWFzZSgpCisgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcgorICAgICAgICBkZWYgbXl3cml0ZShzZWxmLCAqYXJncyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcmVhbF93cml0ZShzZWxmLCAqYXJncykKKyAgICAgICAgYyA9IHRocmVhZC5fY291bnQoKQorICAgICAgICBzdGFydGVkID0gdGhyZWFkLmFsbG9jYXRlX2xvY2soKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jYXB0dXJlZF9vdXRwdXQoInN0ZGVyciIpIGFzIHN0ZGVycjoKKyAgICAgICAgICAgIHJlYWxfd3JpdGUgPSBzdGRlcnIud3JpdGUKKyAgICAgICAgICAgIHN0ZGVyci53cml0ZSA9IG15d3JpdGUKKyAgICAgICAgICAgIHN0YXJ0ZWQuYWNxdWlyZSgpCisgICAgICAgICAgICB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCh0YXNrLCAoKSkKKyAgICAgICAgICAgIHN0YXJ0ZWQuYWNxdWlyZSgpCisgICAgICAgICAgICB3aGlsZSB0aHJlYWQuX2NvdW50KCkgPiBjOgorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiVHJhY2ViYWNrIiwgc3RkZXJyLmdldHZhbHVlKCkpCisKKworY2xhc3MgQmFycmllcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbnVtX3RocmVhZHMpOgorICAgICAgICBzZWxmLm51bV90aHJlYWRzID0gbnVtX3RocmVhZHMKKyAgICAgICAgc2VsZi53YWl0aW5nID0gMAorICAgICAgICBzZWxmLmNoZWNraW5fbXV0ZXggID0gdGhyZWFkLmFsbG9jYXRlX2xvY2soKQorICAgICAgICBzZWxmLmNoZWNrb3V0X211dGV4ID0gdGhyZWFkLmFsbG9jYXRlX2xvY2soKQorICAgICAgICBzZWxmLmNoZWNrb3V0X211dGV4LmFjcXVpcmUoKQorCisgICAgZGVmIGVudGVyKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNraW5fbXV0ZXguYWNxdWlyZSgpCisgICAgICAgIHNlbGYud2FpdGluZyA9IHNlbGYud2FpdGluZyArIDEKKyAgICAgICAgaWYgc2VsZi53YWl0aW5nID09IHNlbGYubnVtX3RocmVhZHM6CisgICAgICAgICAgICBzZWxmLndhaXRpbmcgPSBzZWxmLm51bV90aHJlYWRzIC0gMQorICAgICAgICAgICAgc2VsZi5jaGVja291dF9tdXRleC5yZWxlYXNlKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmNoZWNraW5fbXV0ZXgucmVsZWFzZSgpCisKKyAgICAgICAgc2VsZi5jaGVja291dF9tdXRleC5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi53YWl0aW5nID0gc2VsZi53YWl0aW5nIC0gMQorICAgICAgICBpZiBzZWxmLndhaXRpbmcgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tpbl9tdXRleC5yZWxlYXNlKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmNoZWNrb3V0X211dGV4LnJlbGVhc2UoKQorCisKK2NsYXNzIEJhcnJpZXJUZXN0KEJhc2ljVGhyZWFkVGVzdCk6CisKKyAgICBkZWYgdGVzdF9iYXJyaWVyKHNlbGYpOgorICAgICAgICBzZWxmLmJhciA9IEJhcnJpZXIoTlVNVEFTS1MpCisgICAgICAgIHNlbGYucnVubmluZyA9IE5VTVRBU0tTCisgICAgICAgIGZvciBpIGluIHJhbmdlKE5VTVRBU0tTKToKKyAgICAgICAgICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKHNlbGYudGFzazIsIChpLCkpCisgICAgICAgIHZlcmJvc2VfcHJpbnQoIndhaXRpbmcgZm9yIHRhc2tzIHRvIGVuZCIpCisgICAgICAgIHNlbGYuZG9uZV9tdXRleC5hY3F1aXJlKCkKKyAgICAgICAgdmVyYm9zZV9wcmludCgidGFza3MgZG9uZSIpCisKKyAgICBkZWYgdGFzazIoc2VsZiwgaWRlbnQpOgorICAgICAgICBmb3IgaSBpbiByYW5nZShOVU1UUklQUyk6CisgICAgICAgICAgICBpZiBpZGVudCA9PSAwOgorICAgICAgICAgICAgICAgICMgZ2l2ZSBpdCBhIGdvb2QgY2hhbmNlIHRvIGVudGVyIHRoZSBuZXh0CisgICAgICAgICAgICAgICAgIyBiYXJyaWVyIGJlZm9yZSB0aGUgb3RoZXJzIGFyZSBhbGwgb3V0CisgICAgICAgICAgICAgICAgIyBvZiB0aGUgY3VycmVudCBvbmUKKyAgICAgICAgICAgICAgICBkZWxheSA9IDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLnJhbmRvbV9tdXRleDoKKyAgICAgICAgICAgICAgICAgICAgZGVsYXkgPSByYW5kb20ucmFuZG9tKCkgLyAxMDAwMC4wCisgICAgICAgICAgICB2ZXJib3NlX3ByaW50KCJ0YXNrICVzIHdpbGwgcnVuIGZvciAlc3VzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpZGVudCwgcm91bmQoZGVsYXkgKiAxZTYpKSkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoZGVsYXkpCisgICAgICAgICAgICB2ZXJib3NlX3ByaW50KCJ0YXNrICVzIGVudGVyaW5nICVzIiAlIChpZGVudCwgaSkpCisgICAgICAgICAgICBzZWxmLmJhci5lbnRlcigpCisgICAgICAgICAgICB2ZXJib3NlX3ByaW50KCJ0YXNrICVzIGxlYXZpbmcgYmFycmllciIgJSBpZGVudCkKKyAgICAgICAgd2l0aCBzZWxmLnJ1bm5pbmdfbXV0ZXg6CisgICAgICAgICAgICBzZWxmLnJ1bm5pbmcgLT0gMQorICAgICAgICAgICAgIyBNdXN0IHJlbGVhc2UgbXV0ZXggYmVmb3JlIHJlbGVhc2luZyBkb25lLCBlbHNlIHRoZSBtYWluIHRocmVhZCBjYW4KKyAgICAgICAgICAgICMgZXhpdCBhbmQgc2V0IG11dGV4IHRvIE5vbmUgYXMgcGFydCBvZiBnbG9iYWwgdGVhcmRvd247IHRoZW4KKyAgICAgICAgICAgICMgbXV0ZXgucmVsZWFzZSgpIHJhaXNlcyBBdHRyaWJ1dGVFcnJvci4KKyAgICAgICAgICAgIGZpbmlzaGVkID0gc2VsZi5ydW5uaW5nID09IDAKKyAgICAgICAgaWYgZmluaXNoZWQ6CisgICAgICAgICAgICBzZWxmLmRvbmVfbXV0ZXgucmVsZWFzZSgpCisKKworY2xhc3MgTG9ja1Rlc3RzKGxvY2tfdGVzdHMuTG9ja1Rlc3RzKToKKyAgICBsb2NrdHlwZSA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrCisKKworY2xhc3MgVGVzdEZvcmtJblRocmVhZCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRfZmQsIHNlbGYud3JpdGVfZmQgPSBvcy5waXBlKCkKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpLAorICAgICAgICAgICAgICAgICAgICAgIlRoaXMgdGVzdCBpcyBvbmx5IGFwcHJvcHJpYXRlIGZvciBQT1NJWC1saWtlIHN5c3RlbXMuIikKKyAgICBAdGVzdF9zdXBwb3J0LnJlYXBfdGhyZWFkcworICAgIGRlZiB0ZXN0X2ZvcmtpbnRocmVhZChzZWxmKToKKyAgICAgICAgZGVmIHRocmVhZDEoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwaWQgPSBvcy5mb3JrKCkgIyBmb3JrIGluIGEgdGhyZWFkCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIHN5cy5leGl0KDApICMgZXhpdCB0aGUgY2hpbGQKKworICAgICAgICAgICAgaWYgcGlkID09IDA6ICMgY2hpbGQKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShzZWxmLnJlYWRfZmQpCisgICAgICAgICAgICAgICAgb3Mud3JpdGUoc2VsZi53cml0ZV9mZCwgIk9LIikKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgwKQorICAgICAgICAgICAgZWxzZTogIyBwYXJlbnQKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShzZWxmLndyaXRlX2ZkKQorCisgICAgICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKHRocmVhZDEsICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnJlYWQoc2VsZi5yZWFkX2ZkLCAyKSwgIk9LIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGZvcmsoKSBpbiB0aHJlYWQiKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5jbG9zZShzZWxmLnJlYWRfZmQpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmNsb3NlKHNlbGYud3JpdGVfZmQpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRocmVhZFJ1bm5pbmdUZXN0cywgQmFycmllclRlc3QsIExvY2tUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RGb3JrSW5UaHJlYWQpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjljYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjljYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkX2ltcG9ydC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkX2ltcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFmZGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkZWRfaW1wb3J0LnB5CkBAIC0wLDAgKzEsNzYgQEAKKyMgVGhpcyBpcyBhIHZhcmlhbnQgb2YgdGhlIHZlcnkgb2xkIChlYXJseSA5MCdzKSBmaWxlCisjIERlbW8vdGhyZWFkcy9idWcucHkuICBJdCBzaW1wbHkgcHJvdm9rZXMgYSBudW1iZXIgb2YgdGhyZWFkcyBpbnRvCisjIHRyeWluZyB0byBpbXBvcnQgdGhlIHNhbWUgbW9kdWxlICJhdCB0aGUgc2FtZSB0aW1lIi4KKyMgVGhlcmUgYXJlIG5vIHBsZWFzYW50IGZhaWx1cmUgbW9kZXMgLS0gbW9zdCBsaWtlbHkgaXMgdGhhdCBQeXRob24KKyMgY29tcGxhaW5zIHNldmVyYWwgdGltZXMgYWJvdXQgbW9kdWxlIHJhbmRvbSBoYXZpbmcgbm8gYXR0cmlidXRlCisjIHJhbmRyYW5nZSwgYW5kIHRoZW4gUHl0aG9uIGhhbmdzLgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIFRlc3RGYWlsZWQsIGltcG9ydF9tb2R1bGUKK3RocmVhZCA9IGltcG9ydF9tb2R1bGUoJ3RocmVhZCcpCisKK2NyaXRpY2FsX3NlY3Rpb24gPSB0aHJlYWQuYWxsb2NhdGVfbG9jaygpCitkb25lID0gdGhyZWFkLmFsbG9jYXRlX2xvY2soKQorCitkZWYgdGFzaygpOgorICAgIGdsb2JhbCBOLCBjcml0aWNhbF9zZWN0aW9uLCBkb25lCisgICAgaW1wb3J0IHJhbmRvbQorICAgIHggPSByYW5kb20ucmFuZHJhbmdlKDEsIDMpCisgICAgY3JpdGljYWxfc2VjdGlvbi5hY3F1aXJlKCkKKyAgICBOIC09IDEKKyAgICAjIE11c3QgcmVsZWFzZSBjcml0aWNhbF9zZWN0aW9uIGJlZm9yZSByZWxlYXNpbmcgZG9uZSwgZWxzZSB0aGUgbWFpbgorICAgICMgdGhyZWFkIGNhbiBleGl0IGFuZCBzZXQgY3JpdGljYWxfc2VjdGlvbiB0byBOb25lIGFzIHBhcnQgb2YgZ2xvYmFsCisgICAgIyB0ZWFyZG93bjsgdGhlbiBjcml0aWNhbF9zZWN0aW9uLnJlbGVhc2UoKSByYWlzZXMgQXR0cmlidXRlRXJyb3IuCisgICAgZmluaXNoZWQgPSBOID09IDAKKyAgICBjcml0aWNhbF9zZWN0aW9uLnJlbGVhc2UoKQorICAgIGlmIGZpbmlzaGVkOgorICAgICAgICBkb25lLnJlbGVhc2UoKQorCitkZWYgdGVzdF9pbXBvcnRfaGFuZ2VycygpOgorICAgIGltcG9ydCBzeXMKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAidGVzdGluZyBpbXBvcnQgaGFuZ2VycyAuLi4iLAorCisgICAgaW1wb3J0IHRlc3QudGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMKKyAgICB0cnk6CisgICAgICAgIGlmIHRlc3QudGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMuZXJyb3JzOgorICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCh0ZXN0LnRocmVhZGVkX2ltcG9ydF9oYW5nZXJzLmVycm9ycykKKyAgICAgICAgZWxpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIk9LLiIKKyAgICBmaW5hbGx5OgorICAgICAgICAjIEluIGNhc2UgdGhpcyB0ZXN0IGlzIHJ1biBhZ2FpbiwgbWFrZSBzdXJlIHRoZSBoZWxwZXIgbW9kdWxlCisgICAgICAgICMgZ2V0cyBsb2FkZWQgZnJvbSBzY3JhdGNoIGFnYWluLgorICAgICAgICBkZWwgc3lzLm1vZHVsZXNbJ3Rlc3QudGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMnXQorCisjIFRyaWNreTogIFdoZW4gcmVncnRlc3QgaW1wb3J0cyB0aGlzIG1vZHVsZSwgdGhlIHRocmVhZCBydW5uaW5nIHJlZ3J0ZXN0CisjIGdyYWJzIHRoZSBpbXBvcnQgbG9jayBhbmQgd29uJ3QgbGV0IGdvIG9mIGl0IHVudGlsIHRoaXMgbW9kdWxlIHJldHVybnMuCisjIEFsbCBvdGhlciB0aHJlYWRzIGF0dGVtcHRpbmcgYW4gaW1wb3J0IGhhbmcgZm9yIHRoZSBkdXJhdGlvbi4gIFNpbmNlCisjIHRoaXMgdGVzdCBzcGF3bnMgdGhyZWFkcyB0aGF0IGRvIGxpdHRsZSAqYnV0KiBpbXBvcnQsIHdlIGNhbid0IGRvIHRoYXQKKyMgc3VjY2Vzc2Z1bGx5IHVudGlsIGFmdGVyIHRoaXMgbW9kdWxlIGZpbmlzaGVzIGltcG9ydGluZyBhbmQgcmVncnRlc3QKKyMgcmVnYWlucyBjb250cm9sLiAgVG8gbWFrZSB0aGlzIHdvcmssIGEgc3BlY2lhbCBjYXNlIHdhcyBhZGRlZCB0bworIyByZWdydGVzdCB0byBpbnZva2UgYSBtb2R1bGUncyAidGVzdF9tYWluIiBmdW5jdGlvbiAoaWYgYW55KSBhZnRlcgorIyBpbXBvcnRpbmcgaXQuCisKK2RlZiB0ZXN0X21haW4oKTogICAgICAgICMgbWFnaWMgbmFtZSEgIHNlZSBhYm92ZQorICAgIGdsb2JhbCBOLCBkb25lCisKKyAgICBpbXBvcnQgaW1wCisgICAgaWYgaW1wLmxvY2tfaGVsZCgpOgorICAgICAgICAjIFRoaXMgdHJpZ2dlcnMgb24sIGUuZy4sIGZyb20gdGVzdCBpbXBvcnQgYXV0b3Rlc3QuCisgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJjYW4ndCBydW4gd2hlbiBpbXBvcnQgbG9jayBpcyBoZWxkIikKKworICAgIGRvbmUuYWNxdWlyZSgpCisgICAgZm9yIE4gaW4gKDIwLCA1MCkgKiAzOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIlRyeWluZyIsIE4sICJ0aHJlYWRzIC4uLiIsCisgICAgICAgIGZvciBpIGluIHJhbmdlKE4pOgorICAgICAgICAgICAgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQodGFzaywgKCkpCisgICAgICAgIGRvbmUuYWNxdWlyZSgpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiT0suIgorICAgIGRvbmUucmVsZWFzZSgpCisKKyAgICB0ZXN0X2ltcG9ydF9oYW5nZXJzKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkZWRfaW1wb3J0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkX2ltcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzZjU5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkX2ltcG9ydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkZWRfaW1wb3J0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkX2ltcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzZjU5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkX2ltcG9ydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkZWR0ZW1wZmlsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkdGVtcGZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkOTY4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkdGVtcGZpbGUucHkKQEAgLTAsMCArMSw3OCBAQAorIiIiCitDcmVhdGUgYW5kIGRlbGV0ZSBGSUxFU19QRVJfVEhSRUFEIHRlbXAgZmlsZXMgKHZpYSB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKQoraW4gZWFjaCBvZiBOVU1fVEhSRUFEUyB0aHJlYWRzLCByZWNvcmRpbmcgdGhlIG51bWJlciBvZiBzdWNjZXNzZXMgYW5kCitmYWlsdXJlcy4gIEEgZmFpbHVyZSBpcyBhIGJ1ZyBpbiB0ZW1wZmlsZSwgYW5kIG1heSBiZSBkdWUgdG86CisKKysgVHJ5aW5nIHRvIGNyZWF0ZSBtb3JlIHRoYW4gb25lIHRlbXBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZS4KKysgVHJ5aW5nIHRvIGRlbGV0ZSBhIHRlbXBmaWxlIHRoYXQgZG9lc24ndCBzdGlsbCBleGlzdC4KKysgU29tZXRoaW5nIHdlJ3ZlIG5ldmVyIHNlZW4gYmVmb3JlLgorCitCeSBkZWZhdWx0LCBOVU1fVEhSRUFEUyA9PSAyMCBhbmQgRklMRVNfUEVSX1RIUkVBRCA9PSA1MC4gIFRoaXMgaXMgZW5vdWdoIHRvCitjcmVhdGUgYWJvdXQgMTUwIGZhaWx1cmVzIHBlciBydW4gdW5kZXIgV2luOThTRSBpbiAyLjAsIGFuZCBydW5zIHByZXR0eQorcXVpY2tseS4gR3VpZG8gcmVwb3J0cyBuZWVkaW5nIHRvIGJvb3N0IEZJTEVTX1BFUl9USFJFQUQgdG8gNTAwIGJlZm9yZQorcHJvdm9raW5nIGEgMi4wIGZhaWx1cmUgdW5kZXIgTGludXguCisiIiIKKworTlVNX1RIUkVBRFMgPSAyMAorRklMRVNfUEVSX1RIUkVBRCA9IDUwCisKK2ltcG9ydCB0ZW1wZmlsZQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB0aHJlYWRpbmdfc2V0dXAsIHRocmVhZGluZ19jbGVhbnVwLCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUKK3RocmVhZGluZyA9IGltcG9ydF9tb2R1bGUoJ3RocmVhZGluZycpCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBTdHJpbmdJTworZnJvbSB0cmFjZWJhY2sgaW1wb3J0IHByaW50X2V4YworCitzdGFydEV2ZW50ID0gdGhyZWFkaW5nLkV2ZW50KCkKKworY2xhc3MgVGVtcEZpbGVHcmVlZHkodGhyZWFkaW5nLlRocmVhZCk6CisgICAgZXJyb3JfY291bnQgPSAwCisgICAgb2tfY291bnQgPSAwCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLmVycm9ycyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgc3RhcnRFdmVudC53YWl0KCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoRklMRVNfUEVSX1RIUkVBRCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoIncrYiIpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9jb3VudCArPSAxCisgICAgICAgICAgICAgICAgcHJpbnRfZXhjKGZpbGU9c2VsZi5lcnJvcnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYub2tfY291bnQgKz0gMQorCisKK2NsYXNzIFRocmVhZGVkVGVtcEZpbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9tYWluKHNlbGYpOgorICAgICAgICB0aHJlYWRzID0gW10KKyAgICAgICAgdGhyZWFkX2luZm8gPSB0aHJlYWRpbmdfc2V0dXAoKQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKE5VTV9USFJFQURTKToKKyAgICAgICAgICAgIHQgPSBUZW1wRmlsZUdyZWVkeSgpCisgICAgICAgICAgICB0aHJlYWRzLmFwcGVuZCh0KQorICAgICAgICAgICAgdC5zdGFydCgpCisKKyAgICAgICAgc3RhcnRFdmVudC5zZXQoKQorCisgICAgICAgIG9rID0gMAorICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgICAgIG9rICs9IHQub2tfY291bnQKKyAgICAgICAgICAgIGlmIHQuZXJyb3JfY291bnQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChzdHIodC5nZXROYW1lKCkpICsgc3RyKHQuZXJyb3JzLmdldHZhbHVlKCkpKQorCisgICAgICAgIHRocmVhZGluZ19jbGVhbnVwKCp0aHJlYWRfaW5mbykKKworICAgICAgICBtc2cgPSAiRXJyb3JzOiBlcnJvcnMgJWQgb2sgJWRcbiVzIiAlIChsZW4oZXJyb3JzKSwgb2ssCisgICAgICAgICAgICAnXG4nLmpvaW4oZXJyb3JzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJvcnMsIFtdLCBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2ssIE5VTV9USFJFQURTICogRklMRVNfUEVSX1RIUkVBRCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUaHJlYWRlZFRlbXBGaWxlVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkZWR0ZW1wZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRlZHRlbXBmaWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmUyYmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkZWR0ZW1wZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkZWR0ZW1wZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRlZHRlbXBmaWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmUyYmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkZWR0ZW1wZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDRjZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKQEAgLTAsMCArMSw3NzggQEAKKyMgVmVyeSBydWRpbWVudGFyeSB0ZXN0IG9mIHRocmVhZGluZyBtb2R1bGUKKworaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlCitmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaworCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK3RocmVhZCA9IHRlc3QudGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RocmVhZCcpCit0aHJlYWRpbmcgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQoraW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdlYWtyZWYKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKKworZnJvbSB0ZXN0IGltcG9ydCBsb2NrX3Rlc3RzCisKKyMgQSB0cml2aWFsIG11dGFibGUgY291bnRlci4KK2NsYXNzIENvdW50ZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudmFsdWUgPSAwCisgICAgZGVmIGluYyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZSArPSAxCisgICAgZGVmIGRlYyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZSAtPSAxCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKKworY2xhc3MgVGVzdFRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgdGVzdGNhc2UsIHNlbWEsIG11dGV4LCBucnVubmluZyk6CisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZiwgbmFtZT1uYW1lKQorICAgICAgICBzZWxmLnRlc3RjYXNlID0gdGVzdGNhc2UKKyAgICAgICAgc2VsZi5zZW1hID0gc2VtYQorICAgICAgICBzZWxmLm11dGV4ID0gbXV0ZXgKKyAgICAgICAgc2VsZi5ucnVubmluZyA9IG5ydW5uaW5nCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBkZWxheSA9IHJhbmRvbS5yYW5kb20oKSAvIDEwMDAwLjAKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICd0YXNrICVzIHdpbGwgcnVuIGZvciAlLjFmIHVzZWMnICUgKAorICAgICAgICAgICAgICAgIHNlbGYubmFtZSwgZGVsYXkgKiAxZTYpCisKKyAgICAgICAgd2l0aCBzZWxmLnNlbWE6CisgICAgICAgICAgICB3aXRoIHNlbGYubXV0ZXg6CisgICAgICAgICAgICAgICAgc2VsZi5ucnVubmluZy5pbmMoKQorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50IHNlbGYubnJ1bm5pbmcuZ2V0KCksICd0YXNrcyBhcmUgcnVubmluZycKKyAgICAgICAgICAgICAgICBzZWxmLnRlc3RjYXNlLmFzc2VydFRydWUoc2VsZi5ucnVubmluZy5nZXQoKSA8PSAzKQorCisgICAgICAgICAgICB0aW1lLnNsZWVwKGRlbGF5KQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAndGFzaycsIHNlbGYubmFtZSwgJ2RvbmUnCisKKyAgICAgICAgICAgIHdpdGggc2VsZi5tdXRleDoKKyAgICAgICAgICAgICAgICBzZWxmLm5ydW5uaW5nLmRlYygpCisgICAgICAgICAgICAgICAgc2VsZi50ZXN0Y2FzZS5hc3NlcnRUcnVlKHNlbGYubnJ1bm5pbmcuZ2V0KCkgPj0gMCkKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnJXMgaXMgZmluaXNoZWQuICVkIHRhc2tzIGFyZSBydW5uaW5nJyAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi5ucnVubmluZy5nZXQoKSkKKworY2xhc3MgQmFzZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3RocmVhZHMgPSB0ZXN0LnRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0ZXN0LnRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqc2VsZi5fdGhyZWFkcykKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCisKKworY2xhc3MgVGhyZWFkVGVzdHMoQmFzZVRlc3RDYXNlKToKKworICAgICMgQ3JlYXRlIGEgYnVuY2ggb2YgdGhyZWFkcywgbGV0IGVhY2ggZG8gc29tZSB3b3JrLCB3YWl0IHVudGlsIGFsbCBhcmUKKyAgICAjIGRvbmUuCisgICAgZGVmIHRlc3RfdmFyaW91c19vcHMoc2VsZik6CisgICAgICAgICMgVGhpcyB0YWtlcyBhYm91dCBuLzMgc2Vjb25kcyB0byBydW4gKGFib3V0IG4vMyBjbHVtcHMgb2YgdGFza3MsCisgICAgICAgICMgdGltZXMgYWJvdXQgMSBzZWNvbmQgcGVyIGNsdW1wKS4KKyAgICAgICAgTlVNVEFTS1MgPSAxMAorCisgICAgICAgICMgbm8gbW9yZSB0aGFuIDMgb2YgdGhlIDEwIGNhbiBydW4gYXQgb25jZQorICAgICAgICBzZW1hID0gdGhyZWFkaW5nLkJvdW5kZWRTZW1hcGhvcmUodmFsdWU9MykKKyAgICAgICAgbXV0ZXggPSB0aHJlYWRpbmcuUkxvY2soKQorICAgICAgICBudW1ydW5uaW5nID0gQ291bnRlcigpCisKKyAgICAgICAgdGhyZWFkcyA9IFtdCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTlVNVEFTS1MpOgorICAgICAgICAgICAgdCA9IFRlc3RUaHJlYWQoIjx0aHJlYWQgJWQ+IiVpLCBzZWxmLCBzZW1hLCBtdXRleCwgbnVtcnVubmluZykKKyAgICAgICAgICAgIHRocmVhZHMuYXBwZW5kKHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaWRlbnQsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goJzxUZXN0VGhyZWFkXCguKiwgaW5pdGlhbFwpPicsIHJlcHIodCkpKQorICAgICAgICAgICAgdC5zdGFydCgpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICd3YWl0aW5nIGZvciBhbGwgdGFza3MgdG8gY29tcGxldGUnCisgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICB0LmpvaW4oTlVNVEFTS1MpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQuaXNfYWxpdmUoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodC5pZGVudCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodC5pZGVudCBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKCc8VGVzdFRocmVhZFwoLiosIFx3KyAtP1xkK1wpPicsIHJlcHIodCkpKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ2FsbCB0YXNrcyBkb25lJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG51bXJ1bm5pbmcuZ2V0KCksIDApCisKKyAgICBkZWYgdGVzdF9pZGVudF9vZl9ub190aHJlYWRpbmdfdGhyZWFkcyhzZWxmKToKKyAgICAgICAgIyBUaGUgaWRlbnQgc3RpbGwgbXVzdCB3b3JrIGZvciB0aGUgbWFpbiB0aHJlYWQgYW5kIGR1bW15IHRocmVhZHMuCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQoKS5pZGVudCBpcyBOb25lKQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgaWRlbnQuYXBwZW5kKHRocmVhZGluZy5jdXJyZW50VGhyZWFkKCkuaWRlbnQpCisgICAgICAgICAgICBkb25lLnNldCgpCisgICAgICAgIGRvbmUgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBpZGVudCA9IFtdCisgICAgICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKGYsICgpKQorICAgICAgICBkb25lLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlkZW50WzBdIGlzIE5vbmUpCisgICAgICAgICMgS2lsbCB0aGUgImltbW9ydGFsIiBfRHVtbXlUaHJlYWQKKyAgICAgICAgZGVsIHRocmVhZGluZy5fYWN0aXZlW2lkZW50WzBdXQorCisgICAgIyBydW4gd2l0aCBhIHNtYWxsKGlzaCkgdGhyZWFkIHN0YWNrIHNpemUgKDI1NmtCKQorICAgIGRlZiB0ZXN0X3ZhcmlvdXNfb3BzX3NtYWxsX3N0YWNrKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ3dpdGggMjU2a0IgdGhyZWFkIHN0YWNrIHNpemUuLi4nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRocmVhZGluZy5zdGFja19zaXplKDI2MjE0NCkKKyAgICAgICAgZXhjZXB0IHRocmVhZC5lcnJvcjoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3BsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhyZWFkIHN0YWNrIHNpemUnCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi50ZXN0X3ZhcmlvdXNfb3BzKCkKKyAgICAgICAgdGhyZWFkaW5nLnN0YWNrX3NpemUoMCkKKworICAgICMgcnVuIHdpdGggYSBsYXJnZSB0aHJlYWQgc3RhY2sgc2l6ZSAoMU1CKQorICAgIGRlZiB0ZXN0X3ZhcmlvdXNfb3BzX2xhcmdlX3N0YWNrKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ3dpdGggMU1CIHRocmVhZCBzdGFjayBzaXplLi4uJworICAgICAgICB0cnk6CisgICAgICAgICAgICB0aHJlYWRpbmcuc3RhY2tfc2l6ZSgweDEwMDAwMCkKKyAgICAgICAgZXhjZXB0IHRocmVhZC5lcnJvcjoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3BsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhyZWFkIHN0YWNrIHNpemUnCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi50ZXN0X3ZhcmlvdXNfb3BzKCkKKyAgICAgICAgdGhyZWFkaW5nLnN0YWNrX3NpemUoMCkKKworICAgIGRlZiB0ZXN0X2ZvcmVpZ25fdGhyZWFkKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgYSAiZm9yZWlnbiIgdGhyZWFkIGNhbiB1c2UgdGhlIHRocmVhZGluZyBtb2R1bGUuCisgICAgICAgIGRlZiBmKG11dGV4KToKKyAgICAgICAgICAgICMgQ2FsbGluZyBjdXJyZW50X3RocmVhZCgpIGZvcmNlcyBhbiBlbnRyeSBmb3IgdGhlIGZvcmVpZ24KKyAgICAgICAgICAgICMgdGhyZWFkIHRvIGdldCBtYWRlIGluIHRoZSB0aHJlYWRpbmcuX2FjdGl2ZSBtYXAuCisgICAgICAgICAgICB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKQorICAgICAgICAgICAgbXV0ZXgucmVsZWFzZSgpCisKKyAgICAgICAgbXV0ZXggPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIG11dGV4LmFjcXVpcmUoKQorICAgICAgICB0aWQgPSB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZChmLCAobXV0ZXgsKSkKKyAgICAgICAgIyBXYWl0IGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaC4KKyAgICAgICAgbXV0ZXguYWNxdWlyZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odGlkLCB0aHJlYWRpbmcuX2FjdGl2ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHRocmVhZGluZy5fYWN0aXZlW3RpZF0sIHRocmVhZGluZy5fRHVtbXlUaHJlYWQpCisgICAgICAgIGRlbCB0aHJlYWRpbmcuX2FjdGl2ZVt0aWRdCisKKyAgICAjIFB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMoKSBpcyBhIENQeXRob24tb25seSBnaW1taWNrLCBub3QgKGN1cnJlbnRseSkKKyAgICAjIGV4cG9zZWQgYXQgdGhlIFB5dGhvbiBsZXZlbC4gIFRoaXMgdGVzdCByZWxpZXMgb24gY3R5cGVzIHRvIGdldCBhdCBpdC4KKyAgICBkZWYgdGVzdF9QeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgY3R5cGVzCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgInRlc3RfUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4YyBjYW4ndCBpbXBvcnQgY3R5cGVzIgorICAgICAgICAgICAgcmV0dXJuICAjIGNhbid0IGRvIGFueXRoaW5nCisKKyAgICAgICAgc2V0X2FzeW5jX2V4YyA9IGN0eXBlcy5weXRob25hcGkuUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4YworCisgICAgICAgIGNsYXNzIEFzeW5jRXhjKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZXhjZXB0aW9uID0gY3R5cGVzLnB5X29iamVjdChBc3luY0V4YykKKworICAgICAgICAjIEZpcnN0IGNoZWNrIGl0IHdvcmtzIHdoZW4gc2V0dGluZyB0aGUgZXhjZXB0aW9uIGZyb20gdGhlIHNhbWUgdGhyZWFkLgorICAgICAgICB0aWQgPSB0aHJlYWQuZ2V0X2lkZW50KCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSBzZXRfYXN5bmNfZXhjKGN0eXBlcy5jX2xvbmcodGlkKSwgZXhjZXB0aW9uKQorICAgICAgICAgICAgIyBUaGUgZXhjZXB0aW9uIGlzIGFzeW5jLCBzbyB3ZSBtaWdodCBoYXZlIHRvIGtlZXAgdGhlIFZNIGJ1c3kgdW50aWwKKyAgICAgICAgICAgICMgaXQgbm90aWNlcy4KKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgQXN5bmNFeGM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRoaXMgY29kZSBpcyB1bnJlYWNoYWJsZSBidXQgaXQgcmVmbGVjdHMgdGhlIGludGVudC4gSWYgd2Ugd2FudGVkCisgICAgICAgICAgICAjIHRvIGJlIHNtYXJ0ZXIgdGhlIGFib3ZlIGxvb3Agd291bGRuJ3QgYmUgaW5maW5pdGUuCisgICAgICAgICAgICBzZWxmLmZhaWwoIkFzeW5jRXhjIG5vdCByYWlzZWQiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMSkgIyBvbmUgdGhyZWFkIHN0YXRlIG1vZGlmaWVkCisgICAgICAgIGV4Y2VwdCBVbmJvdW5kTG9jYWxFcnJvcjoKKyAgICAgICAgICAgICMgVGhlIGV4Y2VwdGlvbiB3YXMgcmFpc2VkIHRvbyBxdWlja2x5IGZvciB1cyB0byBnZXQgdGhlIHJlc3VsdC4KKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIGB3b3JrZXJfc3RhcnRlZGAgaXMgc2V0IGJ5IHRoZSB0aHJlYWQgd2hlbiBpdCdzIGluc2lkZSBhIHRyeS9leGNlcHQKKyAgICAgICAgIyBibG9jayB3YWl0aW5nIHRvIGNhdGNoIHRoZSBhc3luY2hyb25vdXNseSBzZXQgQXN5bmNFeGMgZXhjZXB0aW9uLgorICAgICAgICAjIGB3b3JrZXJfc2F3X2V4Y2VwdGlvbmAgaXMgc2V0IGJ5IHRoZSB0aHJlYWQgdXBvbiBjYXRjaGluZyB0aGF0CisgICAgICAgICMgZXhjZXB0aW9uLgorICAgICAgICB3b3JrZXJfc3RhcnRlZCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHdvcmtlcl9zYXdfZXhjZXB0aW9uID0gdGhyZWFkaW5nLkV2ZW50KCkKKworICAgICAgICBjbGFzcyBXb3JrZXIodGhyZWFkaW5nLlRocmVhZCk6CisgICAgICAgICAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuaWQgPSB0aHJlYWQuZ2V0X2lkZW50KCkKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaGVkID0gRmFsc2UKKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcl9zdGFydGVkLnNldCgpCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAgICAgICAgICAgICBleGNlcHQgQXN5bmNFeGM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHdvcmtlcl9zYXdfZXhjZXB0aW9uLnNldCgpCisKKyAgICAgICAgdCA9IFdvcmtlcigpCisgICAgICAgIHQuZGFlbW9uID0gVHJ1ZSAjIHNvIGlmIHRoaXMgZmFpbHMsIHdlIGRvbid0IGhhbmcgUHl0aG9uIGF0IHNodXRkb3duCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiAgICBzdGFydGVkIHdvcmtlciB0aHJlYWQiCisKKyAgICAgICAgIyBUcnkgYSB0aHJlYWQgaWQgdGhhdCBkb2Vzbid0IG1ha2Ugc2Vuc2UuCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiICAgIHRyeWluZyBub25zZW5zaWNhbCB0aHJlYWQgaWQiCisgICAgICAgIHJlc3VsdCA9IHNldF9hc3luY19leGMoY3R5cGVzLmNfbG9uZygtMSksIGV4Y2VwdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDApICAjIG5vIHRocmVhZCBzdGF0ZXMgbW9kaWZpZWQKKworICAgICAgICAjIE5vdyByYWlzZSBhbiBleGNlcHRpb24gaW4gdGhlIHdvcmtlciB0aHJlYWQuCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiICAgIHdhaXRpbmcgZm9yIHdvcmtlciB0aHJlYWQgdG8gZ2V0IHN0YXJ0ZWQiCisgICAgICAgIHJldCA9IHdvcmtlcl9zdGFydGVkLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmV0KQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiAgICB2ZXJpZnlpbmcgd29ya2VyIGhhc24ndCBleGl0ZWQiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdC5maW5pc2hlZCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIgICAgYXR0ZW1wdGluZyB0byByYWlzZSBhc3luY2ggZXhjZXB0aW9uIGluIHdvcmtlciIKKyAgICAgICAgcmVzdWx0ID0gc2V0X2FzeW5jX2V4YyhjdHlwZXMuY19sb25nKHQuaWQpLCBleGNlcHRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAxKSAjIG9uZSB0aHJlYWQgc3RhdGUgbW9kaWZpZWQKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIgICAgd2FpdGluZyBmb3Igd29ya2VyIHRvIHNheSBpdCBjYXVnaHQgdGhlIGV4Y2VwdGlvbiIKKyAgICAgICAgd29ya2VyX3Nhd19leGNlcHRpb24ud2FpdCh0aW1lb3V0PTEwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodC5maW5pc2hlZCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIgICAgYWxsIE9LIC0tIGpvaW5pbmcgd29ya2VyIgorICAgICAgICBpZiB0LmZpbmlzaGVkOgorICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgIyBlbHNlIHRoZSB0aHJlYWQgaXMgc3RpbGwgcnVubmluZywgYW5kIHdlIGhhdmUgbm8gd2F5IHRvIGtpbGwgaXQKKworICAgIGRlZiB0ZXN0X2xpbWJvX2NsZWFudXAoc2VsZik6CisgICAgICAgICMgSXNzdWUgNzQ4MTogRmFpbHVyZSB0byBzdGFydCB0aHJlYWQgc2hvdWxkIGNsZWFudXAgdGhlIGxpbWJvIG1hcC4KKyAgICAgICAgZGVmIGZhaWxfbmV3X3RocmVhZCgqYXJncyk6CisgICAgICAgICAgICByYWlzZSB0aHJlYWQuZXJyb3IoKQorICAgICAgICBfc3RhcnRfbmV3X3RocmVhZCA9IHRocmVhZGluZy5fc3RhcnRfbmV3X3RocmVhZAorICAgICAgICB0aHJlYWRpbmcuX3N0YXJ0X25ld190aHJlYWQgPSBmYWlsX25ld190aHJlYWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWxhbWJkYTogTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRocmVhZC5lcnJvciwgdC5zdGFydCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgICAgICAgICAgdCBpbiB0aHJlYWRpbmcuX2xpbWJvLAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY2xlYW51cCBfbGltYm8gbWFwIG9uIGZhaWx1cmUgb2YgVGhyZWFkLnN0YXJ0KCkuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRocmVhZGluZy5fc3RhcnRfbmV3X3RocmVhZCA9IF9zdGFydF9uZXdfdGhyZWFkCisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZV9ydW5ubmluZ190aHJlYWQoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTQwMjogdGhlIFB5R0lMU3RhdGVfRW5zdXJlIC8gX1JlbGVhc2UgZnVuY3Rpb25zIG1heSBiZSBjYWxsZWQKKyAgICAgICAgIyB2ZXJ5IGxhdGUgb24gcHl0aG9uIGV4aXQ6IG9uIGRlYWxsb2NhdGlvbiBvZiBhIHJ1bm5pbmcgdGhyZWFkIGZvcgorICAgICAgICAjIGV4YW1wbGUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBjdHlwZXMKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCgidGVzdF9maW5hbGl6ZV93aXRoX3J1bm5uaW5nX3RocmVhZCBjYW4ndCBpbXBvcnQgY3R5cGVzIikKKyAgICAgICAgICAgIHJldHVybiAgIyBjYW4ndCBkbyBhbnl0aGluZworCisgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgIiIiaWYgMToKKyAgICAgICAgICAgIGltcG9ydCBjdHlwZXMsIHN5cywgdGltZSwgdGhyZWFkCisKKyAgICAgICAgICAgICMgVGhpcyBsb2NrIGlzIHVzZWQgYXMgYSBzaW1wbGUgZXZlbnQgdmFyaWFibGUuCisgICAgICAgICAgICByZWFkeSA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKKyAgICAgICAgICAgIHJlYWR5LmFjcXVpcmUoKQorCisgICAgICAgICAgICAjIE1vZHVsZSBnbG9iYWxzIGFyZSBjbGVhcmVkIGJlZm9yZSBfX2RlbF9fIGlzIHJ1bgorICAgICAgICAgICAgIyBTbyB3ZSBzYXZlIHRoZSBmdW5jdGlvbnMgaW4gY2xhc3MgZGljdAorICAgICAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgICAgICBlbnN1cmUgPSBjdHlwZXMucHl0aG9uYXBpLlB5R0lMU3RhdGVfRW5zdXJlCisgICAgICAgICAgICAgICAgcmVsZWFzZSA9IGN0eXBlcy5weXRob25hcGkuUHlHSUxTdGF0ZV9SZWxlYXNlCisgICAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gc2VsZi5lbnN1cmUoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbGVhc2Uoc3RhdGUpCisKKyAgICAgICAgICAgIGRlZiB3YWl0aW5nVGhyZWFkKCk6CisgICAgICAgICAgICAgICAgeCA9IEMoKQorICAgICAgICAgICAgICAgIHJlYWR5LnJlbGVhc2UoKQorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMTAwKQorCisgICAgICAgICAgICB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCh3YWl0aW5nVGhyZWFkLCAoKSkKKyAgICAgICAgICAgIHJlYWR5LmFjcXVpcmUoKSAgIyBCZSBzdXJlIHRoZSBvdGhlciB0aHJlYWQgaXMgd2FpdGluZy4KKyAgICAgICAgICAgIHN5cy5leGl0KDQyKQorICAgICAgICAgICAgIiIiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgNDIpCisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZV93aXRoX3RyYWNlKHNlbGYpOgorICAgICAgICAjIElzc3VlMTczMzc1NworICAgICAgICAjIEF2b2lkIGEgZGVhZGxvY2sgd2hlbiBzeXMuc2V0dHJhY2Ugc3RlcHMgaW50byB0aHJlYWRpbmcuX3NodXRkb3duCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgIiIiaWYgMToKKyAgICAgICAgICAgIGltcG9ydCBzeXMsIHRocmVhZGluZworCisgICAgICAgICAgICAjIEEgZGVhZGxvY2sta2lsbGVyLCB0byBwcmV2ZW50IHRoZQorICAgICAgICAgICAgIyB0ZXN0c3VpdGUgdG8gaGFuZyBmb3JldmVyCisgICAgICAgICAgICBkZWYga2lsbGVyKCk6CisgICAgICAgICAgICAgICAgaW1wb3J0IG9zLCB0aW1lCisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgyKQorICAgICAgICAgICAgICAgIHByaW50ICdwcm9ncmFtIGJsb2NrZWQ7IGFib3J0aW5nJworICAgICAgICAgICAgICAgIG9zLl9leGl0KDIpCisgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9a2lsbGVyKQorICAgICAgICAgICAgdC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICB0LnN0YXJ0KCkKKworICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSB0cmFjZSBmdW5jdGlvbgorICAgICAgICAgICAgZGVmIGZ1bmMoZnJhbWUsIGV2ZW50LCBhcmcpOgorICAgICAgICAgICAgICAgIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMKKworICAgICAgICAgICAgc3lzLnNldHRyYWNlKGZ1bmMpCisgICAgICAgICAgICAiIiJdLAorICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQorICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICByYyA9IHAucmV0dXJuY29kZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJjID09IDIsICJpbnRlcnByZXRlZCB3YXMgYmxvY2tlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyYyA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgZXJyb3I6ICIgKyByZXByKHN0ZGVycikpCisKKyAgICBkZWYgdGVzdF9qb2luX25vbmRhZW1vbl9vbl9zaHV0ZG93bihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxNzIyMzQ0CisgICAgICAgICMgUmFpc2luZyBTeXN0ZW1FeGl0IHNraXBwZWQgdGhyZWFkaW5nLl9zaHV0ZG93bgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICIiImlmIDE6CisgICAgICAgICAgICAgICAgaW1wb3J0IHRocmVhZGluZworICAgICAgICAgICAgICAgIGZyb20gdGltZSBpbXBvcnQgc2xlZXAKKworICAgICAgICAgICAgICAgIGRlZiBjaGlsZCgpOgorICAgICAgICAgICAgICAgICAgICBzbGVlcCgxKQorICAgICAgICAgICAgICAgICAgICAjIEFzIGEgbm9uLWRhZW1vbiB0aHJlYWQgd2UgU0hPVUxEIHdha2UgdXAgYW5kIG5vdGhpbmcKKyAgICAgICAgICAgICAgICAgICAgIyBzaG91bGQgYmUgdG9ybiBkb3duIHlldAorICAgICAgICAgICAgICAgICAgICBwcmludCAiV29rZSB1cCwgc2xlZXAgZnVuY3Rpb24gaXM6Iiwgc2xlZXAKKworICAgICAgICAgICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWNoaWxkKS5zdGFydCgpCisgICAgICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdAorICAgICAgICAgICAgIiIiXSwKKyAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQuc3RyaXAoKSwKKyAgICAgICAgICAgICJXb2tlIHVwLCBzbGVlcCBmdW5jdGlvbiBpczogPGJ1aWx0LWluIGZ1bmN0aW9uIHNsZWVwPiIpCisgICAgICAgIHN0ZGVyciA9IHJlLnN1YihyIl5cW1xkKyByZWZzXF0iLCAiIiwgc3RkZXJyLCByZS5NVUxUSUxJTkUpLnN0cmlwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRlcnIsICIiKQorCisgICAgZGVmIHRlc3RfZW51bWVyYXRlX2FmdGVyX2pvaW4oc2VsZik6CisgICAgICAgICMgVHJ5IGhhcmQgdG8gdHJpZ2dlciAjMTcwMzQ0ODogYSB0aHJlYWQgaXMgc3RpbGwgcmV0dXJuZWQgaW4KKyAgICAgICAgIyB0aHJlYWRpbmcuZW51bWVyYXRlKCkgYWZ0ZXIgaXQgaGFzIGJlZW4gam9pbigpZWQuCisgICAgICAgIGVudW0gPSB0aHJlYWRpbmcuZW51bWVyYXRlCisgICAgICAgIG9sZF9pbnRlcnZhbCA9IHN5cy5nZXRjaGVja2ludGVydmFsKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEsIDEwMCk6CisgICAgICAgICAgICAgICAgIyBUcnkgYSBjb3VwbGUgdGltZXMgYXQgZWFjaCB0aHJlYWQtc3dpdGNoaW5nIGludGVydmFsCisgICAgICAgICAgICAgICAgIyB0byBnZXQgbW9yZSBpbnRlcmxlYXZpbmdzLgorICAgICAgICAgICAgICAgIHN5cy5zZXRjaGVja2ludGVydmFsKGkgLy8gNSkKKyAgICAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9bGFtYmRhOiBOb25lKQorICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgICAgICAgICAgbCA9IGVudW0oKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4odCwgbCwKKyAgICAgICAgICAgICAgICAgICAgIiMxNzAzNDQ4IHRyaWdnZXJlZCBhZnRlciAlZCB0cmlhbHM6ICVzIiAlIChpLCBsKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zZXRjaGVja2ludGVydmFsKG9sZF9pbnRlcnZhbCkKKworICAgIGRlZiB0ZXN0X25vX3JlZmN5Y2xlX3Rocm91Z2hfdGFyZ2V0KHNlbGYpOgorICAgICAgICBjbGFzcyBSdW5TZWxmRnVuY3Rpb24ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaG91bGRfcmFpc2UpOgorICAgICAgICAgICAgICAgICMgVGhlIGxpbmtzIGluIHRoaXMgcmVmY3ljbGUgZnJvbSBUaHJlYWQgYmFjayB0byBzZWxmCisgICAgICAgICAgICAgICAgIyBzaG91bGQgYmUgY2xlYW5lZCB1cCB3aGVuIHRoZSB0aHJlYWQgY29tcGxldGVzLgorICAgICAgICAgICAgICAgIHNlbGYuc2hvdWxkX3JhaXNlID0gc2hvdWxkX3JhaXNlCisgICAgICAgICAgICAgICAgc2VsZi50aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLl9ydW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHNlbGYsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dhcmdzPXsneWV0X2Fub3RoZXInOnNlbGZ9KQorICAgICAgICAgICAgICAgIHNlbGYudGhyZWFkLnN0YXJ0KCkKKworICAgICAgICAgICAgZGVmIF9ydW4oc2VsZiwgb3RoZXJfcmVmLCB5ZXRfYW5vdGhlcik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zaG91bGRfcmFpc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQKKworICAgICAgICBjeWNsaWNfb2JqZWN0ID0gUnVuU2VsZkZ1bmN0aW9uKHNob3VsZF9yYWlzZT1GYWxzZSkKKyAgICAgICAgd2Vha19jeWNsaWNfb2JqZWN0ID0gd2Vha3JlZi5yZWYoY3ljbGljX29iamVjdCkKKyAgICAgICAgY3ljbGljX29iamVjdC50aHJlYWQuam9pbigpCisgICAgICAgIGRlbCBjeWNsaWNfb2JqZWN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgd2Vha19jeWNsaWNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSgnJWQgcmVmZXJlbmNlcyBzdGlsbCBhcm91bmQnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5nZXRyZWZjb3VudCh3ZWFrX2N5Y2xpY19vYmplY3QoKSkpKQorCisgICAgICAgIHJhaXNpbmdfY3ljbGljX29iamVjdCA9IFJ1blNlbGZGdW5jdGlvbihzaG91bGRfcmFpc2U9VHJ1ZSkKKyAgICAgICAgd2Vha19yYWlzaW5nX2N5Y2xpY19vYmplY3QgPSB3ZWFrcmVmLnJlZihyYWlzaW5nX2N5Y2xpY19vYmplY3QpCisgICAgICAgIHJhaXNpbmdfY3ljbGljX29iamVjdC50aHJlYWQuam9pbigpCisgICAgICAgIGRlbCByYWlzaW5nX2N5Y2xpY19vYmplY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCB3ZWFrX3JhaXNpbmdfY3ljbGljX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0oJyVkIHJlZmVyZW5jZXMgc3RpbGwgYXJvdW5kJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuZ2V0cmVmY291bnQod2Vha19yYWlzaW5nX2N5Y2xpY19vYmplY3QoKSkpKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2ZvcmsnKSwgJ3Rlc3QgbmVlZHMgZm9yaygpJykKKyAgICBkZWYgdGVzdF9kdW1teV90aHJlYWRfYWZ0ZXJfZm9yayhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTQzMDg6IGEgZHVtbXkgdGhyZWFkIGluIHRoZSBhY3RpdmUgbGlzdCBkb2Vzbid0IG1lc3MgdXAKKyAgICAgICAgIyB0aGUgYWZ0ZXItZm9yayBtZWNoYW5pc20uCisgICAgICAgIGNvZGUgPSAiIiJpZiAxOgorICAgICAgICAgICAgaW1wb3J0IHRocmVhZCwgdGhyZWFkaW5nLCBvcywgdGltZQorCisgICAgICAgICAgICBkZWYgYmFja2dyb3VuZF90aHJlYWQoZXZ0KToKKyAgICAgICAgICAgICAgICAjIENyZWF0ZXMgYW5kIHJlZ2lzdGVycyB0aGUgX0R1bW15VGhyZWFkIGluc3RhbmNlCisgICAgICAgICAgICAgICAgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkKKyAgICAgICAgICAgICAgICBldnQuc2V0KCkKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDEwKQorCisgICAgICAgICAgICBldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICAgICAgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoYmFja2dyb3VuZF90aHJlYWQsIChldnQsKSkKKyAgICAgICAgICAgIGV2dC53YWl0KCkKKyAgICAgICAgICAgIGFzc2VydCB0aHJlYWRpbmcuYWN0aXZlX2NvdW50KCkgPT0gMiwgdGhyZWFkaW5nLmFjdGl2ZV9jb3VudCgpCisgICAgICAgICAgICBpZiBvcy5mb3JrKCkgPT0gMDoKKyAgICAgICAgICAgICAgICBhc3NlcnQgdGhyZWFkaW5nLmFjdGl2ZV9jb3VudCgpID09IDEsIHRocmVhZGluZy5hY3RpdmVfY291bnQoKQorICAgICAgICAgICAgICAgIG9zLl9leGl0KDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9zLndhaXQoKQorICAgICAgICAiIiIKKyAgICAgICAgXywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCItYyIsIGNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIsICcnKQorCisKK2NsYXNzIFRocmVhZEpvaW5PblNodXRkb3duKEJhc2VUZXN0Q2FzZSk6CisKKyAgICAjIEJldHdlZW4gZm9yaygpIGFuZCBleGVjKCksIG9ubHkgYXN5bmMtc2FmZSBmdW5jdGlvbnMgYXJlIGFsbG93ZWQgKGlzc3VlcworICAgICMgIzEyMzE2IGFuZCAjMTE4NzApLCBhbmQgZm9yaygpIGZyb20gYSB3b3JrZXIgdGhyZWFkIGlzIGtub3duIHRvIHRyaWdnZXIKKyAgICAjIHByb2JsZW1zIHdpdGggc29tZSBvcGVyYXRpbmcgc3lzdGVtcyAoaXNzdWUgIzM4NjMpOiBza2lwIHByb2JsZW1hdGljIHRlc3RzCisgICAgIyBvbiBwbGF0Zm9ybXMga25vd24gdG8gYmVoYXZlIGJhZGx5LgorICAgIHBsYXRmb3Jtc190b19za2lwID0gKCdmcmVlYnNkNCcsICdmcmVlYnNkNScsICdmcmVlYnNkNicsICduZXRic2Q1JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnb3MyZW14JykKKworICAgIGRlZiBfcnVuX2FuZF9qb2luKHNlbGYsIHNjcmlwdCk6CisgICAgICAgIHNjcmlwdCA9ICIiImlmIDE6CisgICAgICAgICAgICBpbXBvcnQgc3lzLCBvcywgdGltZSwgdGhyZWFkaW5nCisKKyAgICAgICAgICAgICMgYSB0aHJlYWQsIHdoaWNoIHdhaXRzIGZvciB0aGUgbWFpbiBwcm9ncmFtIHRvIHRlcm1pbmF0ZQorICAgICAgICAgICAgZGVmIGpvaW5pbmdmdW5jKG1haW50aHJlYWQpOgorICAgICAgICAgICAgICAgIG1haW50aHJlYWQuam9pbigpCisgICAgICAgICAgICAgICAgcHJpbnQgJ2VuZCBvZiB0aHJlYWQnCisgICAgICAgIFxuIiIiICsgc2NyaXB0CisKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCBzY3JpcHRdLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICByYyA9IHAud2FpdCgpCisgICAgICAgIGRhdGEgPSBwLnN0ZG91dC5yZWFkKCkucmVwbGFjZSgnXHInLCAnJykKKyAgICAgICAgcC5zdGRvdXQuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICJlbmQgb2YgbWFpblxuZW5kIG9mIHRocmVhZFxuIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyYyA9PSAyLCAiaW50ZXJwcmV0ZXIgd2FzIGJsb2NrZWQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmMgPT0gMCwgIlVuZXhwZWN0ZWQgZXJyb3IiKQorCisgICAgZGVmIHRlc3RfMV9qb2luX29uX3NodXRkb3duKHNlbGYpOgorICAgICAgICAjIFRoZSB1c3VhbCBjYXNlOiBvbiBleGl0LCB3YWl0IGZvciBhIG5vbi1kYWVtb24gdGhyZWFkCisgICAgICAgIHNjcmlwdCA9ICIiImlmIDE6CisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1qb2luaW5nZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLCkpCisgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICAgICAgcHJpbnQgJ2VuZCBvZiBtYWluJworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3J1bl9hbmRfam9pbihzY3JpcHQpCisKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdmb3JrJyksICJuZWVkcyBvcy5mb3JrKCkiKQorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtIGluIHBsYXRmb3Jtc190b19za2lwLCAiZHVlIHRvIGtub3duIE9TIGJ1ZyIpCisgICAgZGVmIHRlc3RfMl9qb2luX2luX2ZvcmtlZF9wcm9jZXNzKHNlbGYpOgorICAgICAgICAjIExpa2UgdGhlIHRlc3QgYWJvdmUsIGJ1dCBmcm9tIGEgZm9ya2VkIGludGVycHJldGVyCisgICAgICAgIHNjcmlwdCA9ICIiImlmIDE6CisgICAgICAgICAgICBjaGlsZHBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgaWYgY2hpbGRwaWQgIT0gMDoKKyAgICAgICAgICAgICAgICBvcy53YWl0cGlkKGNoaWxkcGlkLCAwKQorICAgICAgICAgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1qb2luaW5nZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLCkpCisgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIHByaW50ICdlbmQgb2YgbWFpbicKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLl9ydW5fYW5kX2pvaW4oc2NyaXB0KQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2ZvcmsnKSwgIm5lZWRzIG9zLmZvcmsoKSIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gaW4gcGxhdGZvcm1zX3RvX3NraXAsICJkdWUgdG8ga25vd24gT1MgYnVnIikKKyAgICBkZWYgdGVzdF8zX2pvaW5faW5fZm9ya2VkX2Zyb21fdGhyZWFkKHNlbGYpOgorICAgICAgICAjIExpa2UgdGhlIHRlc3QgYWJvdmUsIGJ1dCBmb3JrKCkgd2FzIGNhbGxlZCBmcm9tIGEgd29ya2VyIHRocmVhZAorICAgICAgICAjIEluIHRoZSBmb3JrZWQgcHJvY2VzcywgdGhlIG1haW4gVGhyZWFkIG9iamVjdCBtdXN0IGJlIG1hcmtlZCBhcyBzdG9wcGVkLgorICAgICAgICBzY3JpcHQgPSAiIiJpZiAxOgorICAgICAgICAgICAgbWFpbl90aHJlYWQgPSB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKQorICAgICAgICAgICAgZGVmIHdvcmtlcigpOgorICAgICAgICAgICAgICAgIGNoaWxkcGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICAgICAgaWYgY2hpbGRwaWQgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgb3Mud2FpdHBpZChjaGlsZHBpZCwgMCkKKyAgICAgICAgICAgICAgICAgICAgc3lzLmV4aXQoMCkKKworICAgICAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1qb2luaW5nZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShtYWluX3RocmVhZCwpKQorICAgICAgICAgICAgICAgIHByaW50ICdlbmQgb2YgbWFpbicKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgICAgICB0LmpvaW4oKSAjIFNob3VsZCBub3QgYmxvY2s6IG1haW5fdGhyZWFkIGlzIGFscmVhZHkgc3RvcHBlZAorCisgICAgICAgICAgICB3ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9d29ya2VyKQorICAgICAgICAgICAgdy5zdGFydCgpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fcnVuX2FuZF9qb2luKHNjcmlwdCkKKworICAgIGRlZiBhc3NlcnRTY3JpcHRIYXNPdXRwdXQoc2VsZiwgc2NyaXB0LCBleHBlY3RlZF9vdXRwdXQpOgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsIHNjcmlwdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHJjID0gcC53YWl0KCkKKyAgICAgICAgZGF0YSA9IHAuc3Rkb3V0LnJlYWQoKS5kZWNvZGUoKS5yZXBsYWNlKCdccicsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCAwLCAiVW5leHBlY3RlZCBlcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZXhwZWN0ZWRfb3V0cHV0KQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2ZvcmsnKSwgIm5lZWRzIG9zLmZvcmsoKSIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gaW4gcGxhdGZvcm1zX3RvX3NraXAsICJkdWUgdG8ga25vd24gT1MgYnVnIikKKyAgICBkZWYgdGVzdF80X2pvaW5pbmdfYWNyb3NzX2ZvcmtfaW5fd29ya2VyX3RocmVhZChzZWxmKToKKyAgICAgICAgIyBUaGVyZSB1c2VkIHRvIGJlIGEgcG9zc2libGUgZGVhZGxvY2sgd2hlbiBmb3JraW5nIGZyb20gYSBjaGlsZAorICAgICAgICAjIHRocmVhZC4gIFNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNjY0My4KKworICAgICAgICAjIFRoZSBzY3JpcHQgdGFrZXMgdGhlIGZvbGxvd2luZyBzdGVwczoKKyAgICAgICAgIyAtIFRoZSBtYWluIHRocmVhZCBpbiB0aGUgcGFyZW50IHByb2Nlc3Mgc3RhcnRzIGEgbmV3IHRocmVhZCBhbmQgdGhlbgorICAgICAgICAjICAgdHJpZXMgdG8gam9pbiBpdC4KKyAgICAgICAgIyAtIFRoZSBqb2luIG9wZXJhdGlvbiBhY3F1aXJlcyB0aGUgTG9jayBpbnNpZGUgdGhlIHRocmVhZCdzIF9ibG9jaworICAgICAgICAjICAgQ29uZGl0aW9uLiAgKFNlZSB0aHJlYWRpbmcucHk6VGhyZWFkLmpvaW4oKS4pCisgICAgICAgICMgLSBXZSBzdHViIG91dCB0aGUgYWNxdWlyZSBtZXRob2Qgb24gdGhlIGNvbmRpdGlvbiB0byBmb3JjZSBpdCB0byB3YWl0CisgICAgICAgICMgICB1bnRpbCB0aGUgY2hpbGQgdGhyZWFkIGZvcmtzLiAgKFNlZSBMT0NLIEFDUVVJUkVEIEhFUkUpCisgICAgICAgICMgLSBUaGUgY2hpbGQgdGhyZWFkIGZvcmtzLiAgKFNlZSBMT0NLIEhFTEQgYW5kIFdPUktFUiBUSFJFQUQgRk9SS1MKKyAgICAgICAgIyAgIEhFUkUpCisgICAgICAgICMgLSBUaGUgbWFpbiB0aHJlYWQgb2YgdGhlIHBhcmVudCBwcm9jZXNzIGVudGVycyBDb25kaXRpb24ud2FpdCgpLAorICAgICAgICAjICAgd2hpY2ggcmVsZWFzZXMgdGhlIGxvY2sgb24gdGhlIGNoaWxkIHRocmVhZC4KKyAgICAgICAgIyAtIFRoZSBjaGlsZCBwcm9jZXNzIHJldHVybnMuICBXaXRob3V0IHRoZSBuZWNlc3NhcnkgZml4LCB3aGVuIHRoZQorICAgICAgICAjICAgbWFpbiB0aHJlYWQgb2YgdGhlIGNoaWxkIHByb2Nlc3MgKHdoaWNoIHVzZWQgdG8gYmUgdGhlIGNoaWxkIHRocmVhZAorICAgICAgICAjICAgaW4gdGhlIHBhcmVudCBwcm9jZXNzKSBhdHRlbXB0cyB0byBleGl0LCBpdCB3aWxsIHRyeSB0byBhY3F1aXJlIHRoZQorICAgICAgICAjICAgbG9jayBpbiB0aGUgVGhyZWFkLl9ibG9jayBDb25kaXRpb24gb2JqZWN0IGFuZCBoYW5nLCBiZWNhdXNlIHRoZQorICAgICAgICAjICAgbG9jayB3YXMgaGVsZCBhY3Jvc3MgdGhlIGZvcmsuCisKKyAgICAgICAgc2NyaXB0ID0gIiIiaWYgMToKKyAgICAgICAgICAgIGltcG9ydCBvcywgdGltZSwgdGhyZWFkaW5nCisKKyAgICAgICAgICAgIGZpbmlzaF9qb2luID0gRmFsc2UKKyAgICAgICAgICAgIHN0YXJ0X2ZvcmsgPSBGYWxzZQorCisgICAgICAgICAgICBkZWYgd29ya2VyKCk6CisgICAgICAgICAgICAgICAgIyBXYWl0IHVudGlsIHRoaXMgdGhyZWFkJ3MgbG9jayBpcyBhY3F1aXJlZCBiZWZvcmUgZm9ya2luZyB0bworICAgICAgICAgICAgICAgICMgY3JlYXRlIHRoZSBkZWFkbG9jay4KKyAgICAgICAgICAgICAgICBnbG9iYWwgZmluaXNoX2pvaW4KKyAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc3RhcnRfZm9yazoKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAxKQorICAgICAgICAgICAgICAgICMgTE9DSyBIRUxEOiBNYWluIHRocmVhZCBob2xkcyBsb2NrIGFjcm9zcyB0aGlzIGNhbGwuCisgICAgICAgICAgICAgICAgY2hpbGRwaWQgPSBvcy5mb3JrKCkKKyAgICAgICAgICAgICAgICBmaW5pc2hfam9pbiA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBjaGlsZHBpZCAhPSAwOgorICAgICAgICAgICAgICAgICAgICAjIFBhcmVudCBwcm9jZXNzIGp1c3Qgd2FpdHMgZm9yIGNoaWxkLgorICAgICAgICAgICAgICAgICAgICBvcy53YWl0cGlkKGNoaWxkcGlkLCAwKQorICAgICAgICAgICAgICAgICMgQ2hpbGQgcHJvY2VzcyBzaG91bGQganVzdCByZXR1cm4uCisKKyAgICAgICAgICAgIHcgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD13b3JrZXIpCisKKyAgICAgICAgICAgICMgU3R1YiBvdXQgdGhlIHByaXZhdGUgY29uZGl0aW9uIHZhcmlhYmxlJ3MgbG9jayBhY3F1aXJlIG1ldGhvZC4KKyAgICAgICAgICAgICMgVGhpcyBhY3F1aXJlcyB0aGUgbG9jayBhbmQgdGhlbiB3YWl0cyB1bnRpbCB0aGUgY2hpbGQgaGFzIGZvcmtlZAorICAgICAgICAgICAgIyBiZWZvcmUgcmV0dXJuaW5nLCB3aGljaCB3aWxsIHJlbGVhc2UgdGhlIGxvY2sgc29vbiBhZnRlci4gIElmCisgICAgICAgICAgICAjIHNvbWVvbmUgZWxzZSB0cmllcyB0byBmaXggdGhpcyB0ZXN0IGNhc2UgYnkgYWNxdWlyaW5nIHRoaXMgbG9jaworICAgICAgICAgICAgIyBiZWZvcmUgZm9ya2luZyBpbnN0ZWFkIG9mIHJlc2V0dGluZyBpdCwgdGhlIHRlc3QgY2FzZSB3aWxsCisgICAgICAgICAgICAjIGRlYWRsb2NrIHdoZW4gaXQgc2hvdWxkbid0LgorICAgICAgICAgICAgY29uZGl0aW9uID0gdy5fYmxvY2sKKyAgICAgICAgICAgIG9yaWdfYWNxdWlyZSA9IGNvbmRpdGlvbi5hY3F1aXJlCisgICAgICAgICAgICBjYWxsX2NvdW50X2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgICAgICBjYWxsX2NvdW50ID0gMAorICAgICAgICAgICAgZGVmIG15X2FjcXVpcmUoKToKKyAgICAgICAgICAgICAgICBnbG9iYWwgY2FsbF9jb3VudAorICAgICAgICAgICAgICAgIGdsb2JhbCBzdGFydF9mb3JrCisgICAgICAgICAgICAgICAgb3JpZ19hY3F1aXJlKCkgICMgTE9DSyBBQ1FVSVJFRCBIRVJFCisgICAgICAgICAgICAgICAgc3RhcnRfZm9yayA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBjYWxsX2NvdW50ID09IDA6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBmaW5pc2hfam9pbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkgICMgV09SS0VSIFRIUkVBRCBGT1JLUyBIRVJFCisgICAgICAgICAgICAgICAgd2l0aCBjYWxsX2NvdW50X2xvY2s6CisgICAgICAgICAgICAgICAgICAgIGNhbGxfY291bnQgKz0gMQorICAgICAgICAgICAgY29uZGl0aW9uLmFjcXVpcmUgPSBteV9hY3F1aXJlCisKKyAgICAgICAgICAgIHcuc3RhcnQoKQorICAgICAgICAgICAgdy5qb2luKCkKKyAgICAgICAgICAgIHByaW50KCdlbmQgb2YgbWFpbicpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRTY3JpcHRIYXNPdXRwdXQoc2NyaXB0LCAiZW5kIG9mIG1haW5cbiIpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnZm9yaycpLCAibmVlZHMgb3MuZm9yaygpIikKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSBpbiBwbGF0Zm9ybXNfdG9fc2tpcCwgImR1ZSB0byBrbm93biBPUyBidWciKQorICAgIGRlZiB0ZXN0XzVfY2xlYXJfd2FpdGVyX2xvY2tzX3RvX2F2b2lkX2NyYXNoKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgYSBzcGF3bmVkIHRocmVhZCB0aGF0IGZvcmtzIGRvZXNuJ3Qgc2VnZmF1bHQgb24gY2VydGFpbgorICAgICAgICAjIHBsYXRmb3JtcywgbmFtZWx5IE9TIFguICBUaGlzIHVzZWQgdG8gaGFwcGVuIGlmIHRoZXJlIHdhcyBhIHdhaXRlcgorICAgICAgICAjIGxvY2sgaW4gdGhlIHRocmVhZCdzIGNvbmRpdGlvbiB2YXJpYWJsZSdzIHdhaXRlcnMgbGlzdC4gIEV2ZW4gdGhvdWdoCisgICAgICAgICMgd2Uga25vdyB0aGUgbG9jayB3aWxsIGJlIGhlbGQgYWNyb3NzIHRoZSBmb3JrLCBpdCBpcyBub3Qgc2FmZSB0bworICAgICAgICAjIHJlbGVhc2UgbG9ja3MgaGVsZCBhY3Jvc3MgZm9ya3Mgb24gYWxsIHBsYXRmb3Jtcywgc28gcmVsZWFzaW5nIHRoZQorICAgICAgICAjIHdhaXRlciBsb2NrIGNhdXNlZCBhIHNlZ2ZhdWx0IG9uIE9TIFguICBGdXJ0aGVybW9yZSwgc2luY2UgbG9ja3Mgb24KKyAgICAgICAgIyBPUyBYIGFyZSAoYXMgb2YgdGhpcyB3cml0aW5nKSBpbXBsZW1lbnRlZCB3aXRoIGEgbXV0ZXggKyBjb25kaXRpb24KKyAgICAgICAgIyB2YXJpYWJsZSBpbnN0ZWFkIG9mIGEgc2VtYXBob3JlLCB3aGlsZSB3ZSBrbm93IHRoYXQgdGhlIFB5dGhvbi1sZXZlbAorICAgICAgICAjIGxvY2sgd2lsbCBiZSBhY3F1aXJlZCwgd2UgY2FuJ3Qga25vdyBpZiB0aGUgaW50ZXJuYWwgbXV0ZXggd2lsbCBiZQorICAgICAgICAjIGFjcXVpcmVkIGF0IHRoZSB0aW1lIG9mIHRoZSBmb3JrLgorCisgICAgICAgIHNjcmlwdCA9ICIiImlmIFRydWU6CisgICAgICAgICAgICBpbXBvcnQgb3MsIHRpbWUsIHRocmVhZGluZworCisgICAgICAgICAgICBzdGFydF9mb3JrID0gRmFsc2UKKworICAgICAgICAgICAgZGVmIHdvcmtlcigpOgorICAgICAgICAgICAgICAgICMgV2FpdCB1bnRpbCB0aGUgbWFpbiB0aHJlYWQgaGFzIGF0dGVtcHRlZCB0byBqb2luIHRoaXMgdGhyZWFkCisgICAgICAgICAgICAgICAgIyBiZWZvcmUgY29udGludWluZy4KKyAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc3RhcnRfZm9yazoKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAxKQorICAgICAgICAgICAgICAgIGNoaWxkcGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICAgICAgaWYgY2hpbGRwaWQgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBQYXJlbnQgcHJvY2VzcyBqdXN0IHdhaXRzIGZvciBjaGlsZC4KKyAgICAgICAgICAgICAgICAgICAgKGNwaWQsIHJjKSA9IG9zLndhaXRwaWQoY2hpbGRwaWQsIDApCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBjcGlkID09IGNoaWxkcGlkCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCByYyA9PSAwCisgICAgICAgICAgICAgICAgICAgIHByaW50KCdlbmQgb2Ygd29ya2VyIHRocmVhZCcpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBDaGlsZCBwcm9jZXNzIHNob3VsZCBqdXN0IHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICB3ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9d29ya2VyKQorCisgICAgICAgICAgICAjIFN0dWIgb3V0IHRoZSBwcml2YXRlIGNvbmRpdGlvbiB2YXJpYWJsZSdzIF9yZWxlYXNlX3NhdmUgbWV0aG9kLgorICAgICAgICAgICAgIyBUaGlzIHJlbGVhc2VzIHRoZSBjb25kaXRpb24ncyBsb2NrIGFuZCBmbGlwcyB0aGUgZ2xvYmFsIHRoYXQKKyAgICAgICAgICAgICMgY2F1c2VzIHRoZSB3b3JrZXIgdG8gZm9yay4gIEF0IHRoaXMgcG9pbnQsIHRoZSBwcm9ibGVtYXRpYyB3YWl0ZXIKKyAgICAgICAgICAgICMgbG9jayBoYXMgYmVlbiBhY3F1aXJlZCBvbmNlIGJ5IHRoZSB3YWl0ZXIgYW5kIGhhcyBiZWVuIHB1dCBvbnRvCisgICAgICAgICAgICAjIHRoZSB3YWl0ZXJzIGxpc3QuCisgICAgICAgICAgICBjb25kaXRpb24gPSB3Ll9ibG9jaworICAgICAgICAgICAgb3JpZ19yZWxlYXNlX3NhdmUgPSBjb25kaXRpb24uX3JlbGVhc2Vfc2F2ZQorICAgICAgICAgICAgZGVmIG15X3JlbGVhc2Vfc2F2ZSgpOgorICAgICAgICAgICAgICAgIGdsb2JhbCBzdGFydF9mb3JrCisgICAgICAgICAgICAgICAgb3JpZ19yZWxlYXNlX3NhdmUoKQorICAgICAgICAgICAgICAgICMgV2FpdGVyIGxvY2sgaGVsZCBoZXJlLCBjb25kaXRpb24gbG9jayByZWxlYXNlZC4KKyAgICAgICAgICAgICAgICBzdGFydF9mb3JrID0gVHJ1ZQorICAgICAgICAgICAgY29uZGl0aW9uLl9yZWxlYXNlX3NhdmUgPSBteV9yZWxlYXNlX3NhdmUKKworICAgICAgICAgICAgdy5zdGFydCgpCisgICAgICAgICAgICB3LmpvaW4oKQorICAgICAgICAgICAgcHJpbnQoJ2VuZCBvZiBtYWluIHRocmVhZCcpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgb3V0cHV0ID0gImVuZCBvZiB3b3JrZXIgdGhyZWFkXG5lbmQgb2YgbWFpbiB0aHJlYWRcbiIKKyAgICAgICAgc2VsZi5hc3NlcnRTY3JpcHRIYXNPdXRwdXQoc2NyaXB0LCBvdXRwdXQpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnZm9yaycpLCAibmVlZHMgb3MuZm9yaygpIikKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSBpbiBwbGF0Zm9ybXNfdG9fc2tpcCwgImR1ZSB0byBrbm93biBPUyBidWciKQorICAgIGRlZiB0ZXN0X3JlaW5pdF90bHNfYWZ0ZXJfZm9yayhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTM4MTc6IGZvcmsoKSB3b3VsZCBkZWFkbG9jayBpbiBhIG11bHRpdGhyZWFkZWQgcHJvZ3JhbSB3aXRoCisgICAgICAgICMgdGhlIGFkLWhvYyBUTFMgaW1wbGVtZW50YXRpb24uCisKKyAgICAgICAgZGVmIGRvX2ZvcmtfYW5kX3dhaXQoKToKKyAgICAgICAgICAgICMganVzdCBmb3JrIGEgY2hpbGQgcHJvY2VzcyBhbmQgd2FpdCBpdAorICAgICAgICAgICAgcGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICBpZiBwaWQgPiAwOgorICAgICAgICAgICAgICAgIG9zLndhaXRwaWQocGlkLCAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgwKQorCisgICAgICAgICMgc3RhcnQgYSBidW5jaCBvZiB0aHJlYWRzIHRoYXQgd2lsbCBmb3JrKCkgY2hpbGQgcHJvY2Vzc2VzCisgICAgICAgIHRocmVhZHMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxNik6CisgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZG9fZm9ya19hbmRfd2FpdCkKKyAgICAgICAgICAgIHRocmVhZHMuYXBwZW5kKHQpCisgICAgICAgICAgICB0LnN0YXJ0KCkKKworICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgdC5qb2luKCkKKworCitjbGFzcyBUaHJlYWRpbmdFeGNlcHRpb25UZXN0cyhCYXNlVGVzdENhc2UpOgorICAgICMgQSBSdW50aW1lRXJyb3Igc2hvdWxkIGJlIHJhaXNlZCBpZiBUaHJlYWQuc3RhcnQoKSBpcyBjYWxsZWQKKyAgICAjIG11bHRpcGxlIHRpbWVzLgorICAgIGRlZiB0ZXN0X3N0YXJ0X3RocmVhZF9hZ2FpbihzZWxmKToKKyAgICAgICAgdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCgpCisgICAgICAgIHRocmVhZC5zdGFydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgdGhyZWFkLnN0YXJ0KQorCisgICAgZGVmIHRlc3Rfam9pbmluZ19jdXJyZW50X3RocmVhZChzZWxmKToKKyAgICAgICAgY3VycmVudF90aHJlYWQgPSB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGN1cnJlbnRfdGhyZWFkLmpvaW4pOworCisgICAgZGVmIHRlc3Rfam9pbmluZ19pbmFjdGl2ZV90aHJlYWQoc2VsZik6CisgICAgICAgIHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHRocmVhZC5qb2luKQorCisgICAgZGVmIHRlc3RfZGFlbW9uaXplX2FjdGl2ZV90aHJlYWQoc2VsZik6CisgICAgICAgIHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQoKQorICAgICAgICB0aHJlYWQuc3RhcnQoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNldGF0dHIsIHRocmVhZCwgImRhZW1vbiIsIFRydWUpCisKKworY2xhc3MgTG9ja1Rlc3RzKGxvY2tfdGVzdHMuTG9ja1Rlc3RzKToKKyAgICBsb2NrdHlwZSA9IHN0YXRpY21ldGhvZCh0aHJlYWRpbmcuTG9jaykKKworY2xhc3MgUkxvY2tUZXN0cyhsb2NrX3Rlc3RzLlJMb2NrVGVzdHMpOgorICAgIGxvY2t0eXBlID0gc3RhdGljbWV0aG9kKHRocmVhZGluZy5STG9jaykKKworY2xhc3MgRXZlbnRUZXN0cyhsb2NrX3Rlc3RzLkV2ZW50VGVzdHMpOgorICAgIGV2ZW50dHlwZSA9IHN0YXRpY21ldGhvZCh0aHJlYWRpbmcuRXZlbnQpCisKK2NsYXNzIENvbmRpdGlvbkFzUkxvY2tUZXN0cyhsb2NrX3Rlc3RzLlJMb2NrVGVzdHMpOgorICAgICMgQW4gQ29uZGl0aW9uIHVzZXMgYW4gUkxvY2sgYnkgZGVmYXVsdCBhbmQgZXhwb3J0cyBpdHMgQVBJLgorICAgIGxvY2t0eXBlID0gc3RhdGljbWV0aG9kKHRocmVhZGluZy5Db25kaXRpb24pCisKK2NsYXNzIENvbmRpdGlvblRlc3RzKGxvY2tfdGVzdHMuQ29uZGl0aW9uVGVzdHMpOgorICAgIGNvbmR0eXBlID0gc3RhdGljbWV0aG9kKHRocmVhZGluZy5Db25kaXRpb24pCisKK2NsYXNzIFNlbWFwaG9yZVRlc3RzKGxvY2tfdGVzdHMuU2VtYXBob3JlVGVzdHMpOgorICAgIHNlbXR5cGUgPSBzdGF0aWNtZXRob2QodGhyZWFkaW5nLlNlbWFwaG9yZSkKKworY2xhc3MgQm91bmRlZFNlbWFwaG9yZVRlc3RzKGxvY2tfdGVzdHMuQm91bmRlZFNlbWFwaG9yZVRlc3RzKToKKyAgICBzZW10eXBlID0gc3RhdGljbWV0aG9kKHRocmVhZGluZy5Cb3VuZGVkU2VtYXBob3JlKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nLCAndGVzdCBtYWNvc3ggcHJvYmxlbScpCisgICAgZGVmIHRlc3RfcmVjdXJzaW9uX2xpbWl0KHNlbGYpOgorICAgICAgICAjIElzc3VlIDk2NzAKKyAgICAgICAgIyB0ZXN0IHRoYXQgZXhjZXNzaXZlIHJlY3Vyc2lvbiB3aXRoaW4gYSBub24tbWFpbiB0aHJlYWQgY2F1c2VzCisgICAgICAgICMgYW4gZXhjZXB0aW9uIHJhdGhlciB0aGFuIGNyYXNoaW5nIHRoZSBpbnRlcnByZXRlciBvbiBwbGF0Zm9ybXMKKyAgICAgICAgIyBsaWtlIE1hYyBPUyBYIG9yIEZyZWVCU0Qgd2hpY2ggaGF2ZSBzbWFsbCBkZWZhdWx0IHN0YWNrIHNpemVzCisgICAgICAgICMgZm9yIHRocmVhZHMKKyAgICAgICAgc2NyaXB0ID0gIiIiaWYgVHJ1ZToKKyAgICAgICAgICAgIGltcG9ydCB0aHJlYWRpbmcKKworICAgICAgICAgICAgZGVmIHJlY3Vyc2UoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVjdXJzZSgpCisKKyAgICAgICAgICAgIGRlZiBvdXRlcigpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmVjdXJzZSgpCisgICAgICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICB3ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9b3V0ZXIpCisgICAgICAgICAgICB3LnN0YXJ0KCkKKyAgICAgICAgICAgIHcuam9pbigpCisgICAgICAgICAgICBwcmludCgnZW5kIG9mIG1haW4gdGhyZWFkJykKKyAgICAgICAgICAgICIiIgorICAgICAgICBleHBlY3RlZF9vdXRwdXQgPSAiZW5kIG9mIG1haW4gdGhyZWFkXG4iCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgc2NyaXB0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgZGF0YSA9IHN0ZG91dC5kZWNvZGUoKS5yZXBsYWNlKCdccicsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucmV0dXJuY29kZSwgMCwgIlVuZXhwZWN0ZWQgZXJyb3IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGV4cGVjdGVkX291dHB1dCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChMb2NrVGVzdHMsIFJMb2NrVGVzdHMsIEV2ZW50VGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbkFzUkxvY2tUZXN0cywgQ29uZGl0aW9uVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbWFwaG9yZVRlc3RzLCBCb3VuZGVkU2VtYXBob3JlVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZFRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRKb2luT25TaHV0ZG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkaW5nRXhjZXB0aW9uVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmYjM2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JmYjM2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkaW5nX2xvY2FsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkaW5nX2xvY2FsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOWYyOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRpbmdfbG9jYWwucHkKQEAgLTAsMCArMSwyMzQgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBkb2N0ZXN0IGltcG9ydCBEb2NUZXN0U3VpdGUKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgd2Vha3JlZgoraW1wb3J0IGdjCisKKyMgTW9kdWxlcyB1bmRlciB0ZXN0CitfdGhyZWFkID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RocmVhZCcpCit0aHJlYWRpbmcgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykKK2ltcG9ydCBfdGhyZWFkaW5nX2xvY2FsCisKKworY2xhc3MgV2VhayhvYmplY3QpOgorICAgIHBhc3MKKworZGVmIHRhcmdldChsb2NhbCwgd2Vha2xpc3QpOgorICAgIHdlYWsgPSBXZWFrKCkKKyAgICBsb2NhbC53ZWFrID0gd2VhaworICAgIHdlYWtsaXN0LmFwcGVuZCh3ZWFrcmVmLnJlZih3ZWFrKSkKKworY2xhc3MgQmFzZUxvY2FsVGVzdDoKKworICAgIGRlZiB0ZXN0X2xvY2FsX3JlZnMoc2VsZik6CisgICAgICAgIHNlbGYuX2xvY2FsX3JlZnMoMjApCisgICAgICAgIHNlbGYuX2xvY2FsX3JlZnMoNTApCisgICAgICAgIHNlbGYuX2xvY2FsX3JlZnMoMTAwKQorCisgICAgZGVmIF9sb2NhbF9yZWZzKHNlbGYsIG4pOgorICAgICAgICBsb2NhbCA9IHNlbGYuX2xvY2FsKCkKKyAgICAgICAgd2Vha2xpc3QgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZShuKToKKyAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD10YXJnZXQsIGFyZ3M9KGxvY2FsLCB3ZWFrbGlzdCkpCisgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgIGRlbCB0CisKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHdlYWtsaXN0KSwgbikKKworICAgICAgICAjIFhYWCBfdGhyZWFkaW5nX2xvY2FsIGtlZXBzIHRoZSBsb2NhbCBvZiB0aGUgbGFzdCBzdG9wcGVkIHRocmVhZCBhbGl2ZS4KKyAgICAgICAgZGVhZGxpc3QgPSBbd2VhayBmb3Igd2VhayBpbiB3ZWFrbGlzdCBpZiB3ZWFrKCkgaXMgTm9uZV0KKyAgICAgICAgc2VsZi5hc3NlcnRJbihsZW4oZGVhZGxpc3QpLCAobi0xLCBuKSkKKworICAgICAgICAjIEFzc2lnbm1lbnQgdG8gdGhlIHNhbWUgdGhyZWFkIGxvY2FsIGZyZWVzIGl0IHNvbWV0aW1lcyAoISkKKyAgICAgICAgbG9jYWwuc29tZW90aGVydmFyID0gTm9uZQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZGVhZGxpc3QgPSBbd2VhayBmb3Igd2VhayBpbiB3ZWFrbGlzdCBpZiB3ZWFrKCkgaXMgTm9uZV0KKyAgICAgICAgc2VsZi5hc3NlcnRJbihsZW4oZGVhZGxpc3QpLCAobi0xLCBuKSwgKG4sIGxlbihkZWFkbGlzdCkpKQorCisgICAgZGVmIHRlc3RfZGVyaXZlZChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAzMDg4OiBpZiB0aGVyZSBpcyBhIHRocmVhZHMgc3dpdGNoIGluc2lkZSB0aGUgX19pbml0X18KKyAgICAgICAgIyBvZiBhIHRocmVhZGluZy5sb2NhbCBkZXJpdmVkIGNsYXNzLCB0aGUgcGVyLXRocmVhZCBkaWN0aW9uYXJ5CisgICAgICAgICMgaXMgY3JlYXRlZCBidXQgbm90IGNvcnJlY3RseSBzZXQgb24gdGhlIG9iamVjdC4KKyAgICAgICAgIyBUaGUgZmlyc3QgbWVtYmVyIHNldCBtYXkgYmUgYm9ndXMuCisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIGNsYXNzIExvY2FsKHNlbGYuX2xvY2FsKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDEpCisgICAgICAgIGxvY2FsID0gTG9jYWwoKQorCisgICAgICAgIGRlZiBmKGkpOgorICAgICAgICAgICAgbG9jYWwueCA9IGkKKyAgICAgICAgICAgICMgU2ltcGx5IGNoZWNrIHRoYXQgdGhlIHZhcmlhYmxlIGlzIGNvcnJlY3RseSBzZXQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWwueCwgaSkKKworICAgICAgICB0aHJlYWRzPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZiwgYXJncz0oaSwpKQorICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICB0aHJlYWRzLmFwcGVuZCh0KQorCisgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICB0LmpvaW4oKQorCisgICAgZGVmIHRlc3RfZGVyaXZlZF9jeWNsZV9kZWFsbG9jKHNlbGYpOgorICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU2OTkwCisgICAgICAgIGNsYXNzIExvY2FsKHNlbGYuX2xvY2FsKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbG9jYWxzID0gTm9uZQorICAgICAgICBwYXNzZWQgPSBbRmFsc2VdCisgICAgICAgIGUxID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgZTIgPSB0aHJlYWRpbmcuRXZlbnQoKQorCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAjIDEpIEludm9sdmUgTG9jYWwgaW4gYSBjeWNsZQorICAgICAgICAgICAgY3ljbGUgPSBbTG9jYWwoKV0KKyAgICAgICAgICAgIGN5Y2xlLmFwcGVuZChjeWNsZSkKKyAgICAgICAgICAgIGN5Y2xlWzBdLmZvbyA9ICdiYXInCisKKyAgICAgICAgICAgICMgMikgR0MgdGhlIGN5Y2xlICh0cmlnZ2VycyB0aHJlYWRtb2R1bGUuYzo6bG9jYWxfY2xlYXIKKyAgICAgICAgICAgICMgYmVmb3JlIGxvY2FsX2RlYWxsb2MpCisgICAgICAgICAgICBkZWwgY3ljbGUKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgZTEuc2V0KCkKKyAgICAgICAgICAgIGUyLndhaXQoKQorCisgICAgICAgICAgICAjIDQpIE5ldyBMb2NhbHMgc2hvdWxkIGJlIGVtcHR5CisgICAgICAgICAgICBwYXNzZWRbMF0gPSBhbGwobm90IGhhc2F0dHIobG9jYWwsICdmb28nKSBmb3IgbG9jYWwgaW4gbG9jYWxzKQorCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1mKQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgZTEud2FpdCgpCisKKyAgICAgICAgIyAzKSBOZXcgTG9jYWxzIHNob3VsZCByZWN5Y2xlIHRoZSBvcmlnaW5hbCdzIGFkZHJlc3MuIENyZWF0aW5nCisgICAgICAgICMgdGhlbSBpbiB0aGUgdGhyZWFkIG92ZXJ3cml0ZXMgdGhlIHRocmVhZCBzdGF0ZSBhbmQgYXZvaWRzIHRoZQorICAgICAgICAjIGJ1ZworICAgICAgICBsb2NhbHMgPSBbTG9jYWwoKSBmb3IgaSBpbiByYW5nZSgxMCldCisgICAgICAgIGUyLnNldCgpCisgICAgICAgIHQuam9pbigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhc3NlZFswXSkKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50cyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxNTIyMjM3CisgICAgICAgIGZyb20gdGhyZWFkIGltcG9ydCBfbG9jYWwgYXMgbG9jYWwKKyAgICAgICAgZnJvbSBfdGhyZWFkaW5nX2xvY2FsIGltcG9ydCBsb2NhbCBhcyBweV9sb2NhbAorCisgICAgICAgIGZvciBjbHMgaW4gKGxvY2FsLCBweV9sb2NhbCk6CisgICAgICAgICAgICBjbGFzcyBNeUxvY2FsKGNscyk6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgTXlMb2NhbChhPTEpCisgICAgICAgICAgICBNeUxvY2FsKDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNscywgYT0xKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbHMsIDEpCisKKyAgICBkZWYgX3Rlc3Rfb25lX2NsYXNzKHNlbGYsIGMpOgorICAgICAgICBzZWxmLl9mYWlsZWQgPSAiTm8gZXJyb3IgbWVzc2FnZSBzZXQgb3IgY2xlYXJlZC4iCisgICAgICAgIG9iaiA9IGMoKQorICAgICAgICBlMSA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIGUyID0gdGhyZWFkaW5nLkV2ZW50KCkKKworICAgICAgICBkZWYgZjEoKToKKyAgICAgICAgICAgIG9iai54ID0gJ2ZvbycKKyAgICAgICAgICAgIG9iai55ID0gJ2JhcicKKyAgICAgICAgICAgIGRlbCBvYmoueQorICAgICAgICAgICAgZTEuc2V0KCkKKyAgICAgICAgICAgIGUyLndhaXQoKQorCisgICAgICAgIGRlZiBmMigpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZvbyA9IG9iai54CisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGV4cGVjdGVkIC0tIHdlIGhhdmVuJ3Qgc2V0IG9iai54IGluIHRoaXMgdGhyZWFkIHlldCEKKyAgICAgICAgICAgICAgICBzZWxmLl9mYWlsZWQgPSAiIiAgIyBwYXNzZWQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fZmFpbGVkID0gKCdJbmNvcnJlY3RseSBnb3QgdmFsdWUgJXIgZnJvbSBjbGFzcyAlclxuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb28sIGMpKQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoc2VsZi5fZmFpbGVkKQorCisgICAgICAgIHQxID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZjEpCisgICAgICAgIHQxLnN0YXJ0KCkKKyAgICAgICAgZTEud2FpdCgpCisgICAgICAgIHQyID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZjIpCisgICAgICAgIHQyLnN0YXJ0KCkKKyAgICAgICAgdDIuam9pbigpCisgICAgICAgICMgVGhlIHRlc3QgaXMgZG9uZTsganVzdCBsZXQgdDEga25vdyBpdCBjYW4gZXhpdCwgYW5kIHdhaXQgZm9yIGl0LgorICAgICAgICBlMi5zZXQoKQorICAgICAgICB0MS5qb2luKCkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuX2ZhaWxlZCwgc2VsZi5fZmFpbGVkKQorCisgICAgZGVmIHRlc3RfdGhyZWFkaW5nX2xvY2FsKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X29uZV9jbGFzcyhzZWxmLl9sb2NhbCkKKworICAgIGRlZiB0ZXN0X3RocmVhZGluZ19sb2NhbF9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgTG9jYWxTdWJjbGFzcyhzZWxmLl9sb2NhbCk6CisgICAgICAgICAgICAiIiJUbyB0ZXN0IHRoYXQgc3ViY2xhc3NlcyBiZWhhdmUgcHJvcGVybHkuIiIiCisgICAgICAgIHNlbGYuX3Rlc3Rfb25lX2NsYXNzKExvY2FsU3ViY2xhc3MpCisKKyAgICBkZWYgX3Rlc3RfZGljdF9hdHRyaWJ1dGUoc2VsZiwgY2xzKToKKyAgICAgICAgb2JqID0gY2xzKCkKKyAgICAgICAgb2JqLnggPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLl9fZGljdF9fLCB7J3gnOiA1fSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBvYmouX19kaWN0X18gPSB7fQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIGRlbCBvYmouX19kaWN0X18KKworICAgIGRlZiB0ZXN0X2RpY3RfYXR0cmlidXRlKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2RpY3RfYXR0cmlidXRlKHNlbGYuX2xvY2FsKQorCisgICAgZGVmIHRlc3RfZGljdF9hdHRyaWJ1dGVfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIExvY2FsU3ViY2xhc3Moc2VsZi5fbG9jYWwpOgorICAgICAgICAgICAgIiIiVG8gdGVzdCB0aGF0IHN1YmNsYXNzZXMgYmVoYXZlIHByb3Blcmx5LiIiIgorICAgICAgICBzZWxmLl90ZXN0X2RpY3RfYXR0cmlidXRlKExvY2FsU3ViY2xhc3MpCisKKworY2xhc3MgVGhyZWFkTG9jYWxUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlLCBCYXNlTG9jYWxUZXN0KToKKyAgICBfbG9jYWwgPSBfdGhyZWFkLl9sb2NhbAorCisgICAgIyBGYWlscyBmb3IgdGhlIHB1cmUgUHl0aG9uIGltcGxlbWVudGF0aW9uCisgICAgZGVmIHRlc3RfY3ljbGVfY29sbGVjdGlvbihzZWxmKToKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB4ID0gWCgpCisgICAgICAgIHgubG9jYWwgPSBzZWxmLl9sb2NhbCgpCisgICAgICAgIHgubG9jYWwueCA9IHgKKyAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZih4KQorICAgICAgICBkZWwgeAorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh3cigpLCBOb25lKQorCitjbGFzcyBQeVRocmVhZGluZ0xvY2FsVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwgQmFzZUxvY2FsVGVzdCk6CisgICAgX2xvY2FsID0gX3RocmVhZGluZ19sb2NhbC5sb2NhbAorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdChEb2NUZXN0U3VpdGUoJ190aHJlYWRpbmdfbG9jYWwnKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUaHJlYWRMb2NhbFRlc3QpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFB5VGhyZWFkaW5nTG9jYWxUZXN0KSkKKworICAgIHRyeToKKyAgICAgICAgZnJvbSB0aHJlYWQgaW1wb3J0IF9sb2NhbAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGltcG9ydCBfdGhyZWFkaW5nX2xvY2FsCisgICAgICAgIGxvY2FsX29yaWcgPSBfdGhyZWFkaW5nX2xvY2FsLmxvY2FsCisgICAgICAgIGRlZiBzZXRVcCh0ZXN0KToKKyAgICAgICAgICAgIF90aHJlYWRpbmdfbG9jYWwubG9jYWwgPSBfbG9jYWwKKyAgICAgICAgZGVmIHRlYXJEb3duKHRlc3QpOgorICAgICAgICAgICAgX3RocmVhZGluZ19sb2NhbC5sb2NhbCA9IGxvY2FsX29yaWcKKyAgICAgICAgc3VpdGUuYWRkVGVzdChEb2NUZXN0U3VpdGUoJ190aHJlYWRpbmdfbG9jYWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRVcD1zZXRVcCwgdGVhckRvd249dGVhckRvd24pCisgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChzdWl0ZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkaW5nX2xvY2FsLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZ19sb2NhbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1NDg5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZ19sb2NhbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkaW5nX2xvY2FsLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZ19sb2NhbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE1NDg5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZ19sb2NhbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkc2lnbmFscy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZHNpZ25hbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY3ZWI2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZHNpZ25hbHMucHkKQEAgLTAsMCArMSw4NSBAQAorIiIiUHlVbml0IHRlc3RpbmcgdGhhdCB0aHJlYWRzIGhvbm9yIG91ciBzaWduYWwgc2VtYW50aWNzIiIiCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNpZ25hbAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUsIHJlYXBfdGhyZWFkcwordGhyZWFkID0gaW1wb3J0X21vZHVsZSgndGhyZWFkJykKKworaWYgc3lzLnBsYXRmb3JtWzozXSBpbiAoJ3dpbicsICdvczInKSBvciBzeXMucGxhdGZvcm09PSdyaXNjb3MnOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0LCAiQ2FuJ3QgdGVzdCBzaWduYWwgb24gJXMiICUgc3lzLnBsYXRmb3JtCisKK3Byb2Nlc3NfcGlkID0gb3MuZ2V0cGlkKCkKK3NpZ25hbGxlZF9hbGw9dGhyZWFkLmFsbG9jYXRlX2xvY2soKQorCisKK2RlZiByZWdpc3RlclNpZ25hbHMoZm9yX3VzcjEsIGZvcl91c3IyLCBmb3JfYWxybSk6CisgICAgdXNyMSA9IHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjEsIGZvcl91c3IxKQorICAgIHVzcjIgPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IyLCBmb3JfdXNyMikKKyAgICBhbHJtID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgZm9yX2Fscm0pCisgICAgcmV0dXJuIHVzcjEsIHVzcjIsIGFscm0KKworCisjIFRoZSBzaWduYWwgaGFuZGxlci4gSnVzdCBub3RlIHRoYXQgdGhlIHNpZ25hbCBvY2N1cnJlZCBhbmQKKyMgZnJvbSB3aG8uCitkZWYgaGFuZGxlX3NpZ25hbHMoc2lnLGZyYW1lKToKKyAgICBzaWduYWxfYmxhY2tib2FyZFtzaWddWyd0cmlwcGVkJ10gKz0gMQorICAgIHNpZ25hbF9ibGFja2JvYXJkW3NpZ11bJ3RyaXBwZWRfYnknXSA9IHRocmVhZC5nZXRfaWRlbnQoKQorCisjIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHNwYXduZWQgYXMgYSBzZXBhcmF0ZSB0aHJlYWQuCitkZWYgc2VuZF9zaWduYWxzKCk6CisgICAgb3Mua2lsbChwcm9jZXNzX3BpZCwgc2lnbmFsLlNJR1VTUjEpCisgICAgb3Mua2lsbChwcm9jZXNzX3BpZCwgc2lnbmFsLlNJR1VTUjIpCisgICAgc2lnbmFsbGVkX2FsbC5yZWxlYXNlKCkKKworY2xhc3MgVGhyZWFkU2lnbmFscyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBzaWduYWwgaGFuZGxpbmcgc2VtYW50aWNzIG9mIHRocmVhZHMuCisgICAgICAgV2Ugc3Bhd24gYSB0aHJlYWQsIGhhdmUgdGhlIHRocmVhZCBzZW5kIHR3byBzaWduYWxzLCBhbmQKKyAgICAgICB3YWl0IGZvciBpdCB0byBmaW5pc2guIENoZWNrIHRoYXQgd2UgZ290IGJvdGggc2lnbmFscworICAgICAgIGFuZCB0aGF0IHRoZXkgd2VyZSBydW4gYnkgdGhlIG1haW4gdGhyZWFkLgorICAgICIiIgorICAgIEByZWFwX3RocmVhZHMKKyAgICBkZWYgdGVzdF9zaWduYWxzKHNlbGYpOgorICAgICAgICBzaWduYWxsZWRfYWxsLmFjcXVpcmUoKQorICAgICAgICBzZWxmLnNwYXduU2lnbmFsbGluZ1RocmVhZCgpCisgICAgICAgIHNpZ25hbGxlZF9hbGwuYWNxdWlyZSgpCisgICAgICAgICMgdGhlIHNpZ25hbHMgdGhhdCB3ZSBhc2tlZCB0aGUga2VybmVsIHRvIHNlbmQKKyAgICAgICAgIyB3aWxsIGNvbWUgYmFjaywgYnV0IHdlIGRvbid0IGtub3cgd2hlbi4KKyAgICAgICAgIyAoaXQgbWlnaHQgZXZlbiBiZSBhZnRlciB0aGUgdGhyZWFkIGV4aXRzCisgICAgICAgICMgYW5kIG1pZ2h0IGJlIG91dCBvZiBvcmRlci4pICBJZiB3ZSBoYXZlbid0IHNlZW4KKyAgICAgICAgIyB0aGUgc2lnbmFscyB5ZXQsIHNlbmQgeWV0IGFub3RoZXIgc2lnbmFsIGFuZAorICAgICAgICAjIHdhaXQgZm9yIGl0IHJldHVybi4KKyAgICAgICAgaWYgc2lnbmFsX2JsYWNrYm9hcmRbc2lnbmFsLlNJR1VTUjFdWyd0cmlwcGVkJ10gPT0gMCBcCisgICAgICAgICAgIG9yIHNpZ25hbF9ibGFja2JvYXJkW3NpZ25hbC5TSUdVU1IyXVsndHJpcHBlZCddID09IDA6CisgICAgICAgICAgICBzaWduYWwuYWxhcm0oMSkKKyAgICAgICAgICAgIHNpZ25hbC5wYXVzZSgpCisgICAgICAgICAgICBzaWduYWwuYWxhcm0oMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCBzaWduYWxfYmxhY2tib2FyZFtzaWduYWwuU0lHVVNSMV1bJ3RyaXBwZWQnXSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCggc2lnbmFsX2JsYWNrYm9hcmRbc2lnbmFsLlNJR1VTUjFdWyd0cmlwcGVkX2J5J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQuZ2V0X2lkZW50KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIHNpZ25hbF9ibGFja2JvYXJkW3NpZ25hbC5TSUdVU1IyXVsndHJpcHBlZCddLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCBzaWduYWxfYmxhY2tib2FyZFtzaWduYWwuU0lHVVNSMl1bJ3RyaXBwZWRfYnknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC5nZXRfaWRlbnQoKSkKKyAgICAgICAgc2lnbmFsbGVkX2FsbC5yZWxlYXNlKCkKKworICAgIGRlZiBzcGF3blNpZ25hbGxpbmdUaHJlYWQoc2VsZik6CisgICAgICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKHNlbmRfc2lnbmFscywgKCkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGdsb2JhbCBzaWduYWxfYmxhY2tib2FyZAorCisgICAgc2lnbmFsX2JsYWNrYm9hcmQgPSB7IHNpZ25hbC5TSUdVU1IxIDogeyd0cmlwcGVkJzogMCwgJ3RyaXBwZWRfYnknOiAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbC5TSUdVU1IyIDogeyd0cmlwcGVkJzogMCwgJ3RyaXBwZWRfYnknOiAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbC5TSUdBTFJNIDogeyd0cmlwcGVkJzogMCwgJ3RyaXBwZWRfYnknOiAwIH0gfQorCisgICAgb2xkc2lncyA9IHJlZ2lzdGVyU2lnbmFscyhoYW5kbGVfc2lnbmFscywgaGFuZGxlX3NpZ25hbHMsIGhhbmRsZV9zaWduYWxzKQorICAgIHRyeToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KFRocmVhZFNpZ25hbHMpCisgICAgZmluYWxseToKKyAgICAgICAgcmVnaXN0ZXJTaWduYWxzKCpvbGRzaWdzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRzaWduYWxzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZHNpZ25hbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZWZjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRzaWduYWxzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRzaWduYWxzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZHNpZ25hbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZWZjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRzaWduYWxzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aW1lLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTcxYzEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZS5weQpAQCAtMCwwICsxLDI1NSBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKKworCitjbGFzcyBUaW1lVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnQgPSB0aW1lLnRpbWUoKQorCisgICAgZGVmIHRlc3RfZGF0YV9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICB0aW1lLmFsdHpvbmUKKyAgICAgICAgdGltZS5kYXlsaWdodAorICAgICAgICB0aW1lLnRpbWV6b25lCisgICAgICAgIHRpbWUudHpuYW1lCisKKyAgICBkZWYgdGVzdF9jbG9jayhzZWxmKToKKyAgICAgICAgdGltZS5jbG9jaygpCisKKyAgICBkZWYgdGVzdF9jb252ZXJzaW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWUuY3RpbWUoc2VsZi50KQorICAgICAgICAgICAgICAgICAgICAgPT0gdGltZS5hc2N0aW1lKHRpbWUubG9jYWx0aW1lKHNlbGYudCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobG9uZyh0aW1lLm1rdGltZSh0aW1lLmxvY2FsdGltZShzZWxmLnQpKSkKKyAgICAgICAgICAgICAgICAgICAgID09IGxvbmcoc2VsZi50KSkKKworICAgIGRlZiB0ZXN0X3NsZWVwKHNlbGYpOgorICAgICAgICB0aW1lLnNsZWVwKDEuMikKKworICAgIGRlZiB0ZXN0X3N0cmZ0aW1lKHNlbGYpOgorICAgICAgICB0dCA9IHRpbWUuZ210aW1lKHNlbGYudCkKKyAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ2EnLCAnQScsICdiJywgJ0InLCAnYycsICdkJywgJ0gnLCAnSScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdqJywgJ20nLCAnTScsICdwJywgJ1MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnVScsICd3JywgJ1cnLCAneCcsICdYJywgJ3knLCAnWScsICdaJywgJyUnKToKKyAgICAgICAgICAgIGZvcm1hdCA9ICcgJScgKyBkaXJlY3RpdmUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0aW1lLnN0cmZ0aW1lKGZvcm1hdCwgdHQpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ2NvbnZlcnNpb24gc3BlY2lmaWVyOiAlciBmYWlsZWQuJyAlIGZvcm1hdCkKKworICAgICAgICAjIElzc3VlICMxMDc2MjogR3VhcmQgYWdhaW5zdCBpbnZhbGlkL25vbi1zdXBwb3J0ZWQgZm9ybWF0IHN0cmluZworICAgICAgICAjIHNvIHRoYXQgUHl0aG9uIGRvbid0IGNyYXNoIChXaW5kb3dzIGNyYXNoZXMgd2hlbiB0aGUgZm9ybWF0IHN0cmluZworICAgICAgICAjIGlucHV0IHRvIFt3XXN0cmZ0aW1lIGlzIG5vdCBrb3NoZXIuCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgdGltZS5zdHJmdGltZSgnJWYnKQorCisgICAgZGVmIHRlc3Rfc3RyZnRpbWVfYm91bmRzX2NoZWNraW5nKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHN0cmZ0aW1lKCkgY2hlY2tzIHRoZSBib3VuZHMgb2YgdGhlIHZhcmlvdXMgcGFydHMKKyAgICAgICAgI29mIHRoZSB0aW1lIHR1cGxlICgwIGlzIHZhbGlkIGZvciAqYWxsKiB2YWx1ZXMpLgorCisgICAgICAgICMgQ2hlY2sgeWVhciBbMTkwMCwgbWF4KGludCldCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxODk5LCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkpCisgICAgICAgIGlmIHRpbWUuYWNjZXB0MmR5ZWFyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLTEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC0xKSkKKyAgICAgICAgIyBDaGVjayBtb250aCBbMSwgMTJdICsgemVybyBzdXBwb3J0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAtMSwgMSwgMCwgMCwgMCwgMCwgMSwgLTEpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMTMsIDEsIDAsIDAsIDAsIDAsIDEsIC0xKSkKKyAgICAgICAgIyBDaGVjayBkYXkgb2YgbW9udGggWzEsIDMxXSArIHplcm8gc3VwcG9ydAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgLTEsIDAsIDAsIDAsIDAsIDEsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDMyLCAwLCAwLCAwLCAwLCAxLCAtMSkpCisgICAgICAgICMgQ2hlY2sgaG91ciBbMCwgMjNdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAtMSwgMCwgMCwgMCwgMSwgLTEpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMjQsIDAsIDAsIDAsIDEsIC0xKSkKKyAgICAgICAgIyBDaGVjayBtaW51dGUgWzAsIDU5XQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgLTEsIDAsIDAsIDEsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDAsIDYwLCAwLCAwLCAxLCAtMSkpCisgICAgICAgICMgQ2hlY2sgc2Vjb25kIFswLCA2MV0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDAsIDAsIC0xLCAwLCAxLCAtMSkpCisgICAgICAgICMgQzk5IG9ubHkgcmVxdWlyZXMgYWxsb3dpbmcgZm9yIG9uZSBsZWFwIHNlY29uZCwgYnV0IFB5dGhvbidzIGRvY3Mgc2F5CisgICAgICAgICMgYWxsb3cgdHdvIGxlYXAgc2Vjb25kcyAoMC4uNjEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAwLCA2MiwgMCwgMSwgLTEpKQorICAgICAgICAjIE5vIGNoZWNrIGZvciB1cHBlci1ib3VuZCBkYXkgb2Ygd2VlazsKKyAgICAgICAgIyAgdmFsdWUgZm9yY2VkIGludG8gcmFuZ2UgYnkgYSBgYCUgN2BgIGNhbGN1bGF0aW9uLgorICAgICAgICAjIFN0YXJ0IGNoZWNrIGF0IC0yIHNpbmNlIGdldHRtYXJnKCkgaW5jcmVtZW50cyB2YWx1ZSBiZWZvcmUgdGFraW5nCisgICAgICAgICMgIG1vZHVsby4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDAsIDAsIDAsIC0yLCAxLCAtMSkpCisgICAgICAgICMgQ2hlY2sgZGF5IG9mIHRoZSB5ZWFyIFsxLCAzNjZdICsgemVybyBzdXBwb3J0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAtMSwgLTEpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgMCwgMCwgMCwgMzY3LCAtMSkpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3ZhbHVlc19mb3JfemVybyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB1c2luZyBhbGwgemVyb3MgdXNlcyB0aGUgcHJvcGVyIGRlZmF1bHQgdmFsdWVzLgorICAgICAgICAjIE5vIHRlc3QgZm9yIGRheWxpZ2h0IHNhdmluZ3Mgc2luY2Ugc3RyZnRpbWUoKSBkb2VzIG5vdCBjaGFuZ2Ugb3V0cHV0CisgICAgICAgICMgYmFzZWQgb24gaXRzIHZhbHVlLgorICAgICAgICBleHBlY3RlZCA9ICIyMDAwIDAxIDAxIDAwIDAwIDAwIDEgMDAxIgorICAgICAgICByZXN1bHQgPSB0aW1lLnN0cmZ0aW1lKCIlWSAlbSAlZCAlSCAlTSAlUyAldyAlaiIsICgwLCkqOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgcmVzdWx0KQorCisgICAgZGVmIHRlc3Rfc3RycHRpbWUoc2VsZik6CisgICAgICAgICMgU2hvdWxkIGJlIGFibGUgdG8gZ28gcm91bmQtdHJpcCBmcm9tIHN0cmZ0aW1lIHRvIHN0cnB0aW1lIHdpdGhvdXQKKyAgICAgICAgIyByYWlzaW5nIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgdHQgPSB0aW1lLmdtdGltZShzZWxmLnQpCisgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdhJywgJ0EnLCAnYicsICdCJywgJ2MnLCAnZCcsICdIJywgJ0knLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaicsICdtJywgJ00nLCAncCcsICdTJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnLCAndycsICdXJywgJ3gnLCAnWCcsICd5JywgJ1knLCAnWicsICclJyk6CisgICAgICAgICAgICBmb3JtYXQgPSAnJScgKyBkaXJlY3RpdmUKKyAgICAgICAgICAgIHN0cmZfb3V0cHV0ID0gdGltZS5zdHJmdGltZShmb3JtYXQsIHR0KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRpbWUuc3RycHRpbWUoc3RyZl9vdXRwdXQsIGZvcm1hdCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiY29udmVyc2lvbiBzcGVjaWZpZXIgJXIgZmFpbGVkIHdpdGggJyVzJyBpbnB1dC4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdCwgc3RyZl9vdXRwdXQpKQorCisgICAgZGVmIHRlc3RfYXNjdGltZShzZWxmKToKKyAgICAgICAgdGltZS5hc2N0aW1lKHRpbWUuZ210aW1lKHNlbGYudCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGltZS5hc2N0aW1lLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRpbWUuYXNjdGltZSwgKCkpCisgICAgICAgICMgWFhYOiBQb3NpeCBjb21waWFudCBhc2N0aW1lIHNob3VsZCByZWZ1c2UgdG8gY29udmVydAorICAgICAgICAjIHllYXIgPiA5OTk5LCBidXQgTGludXggaW1wbGVtZW50YXRpb24gZG9lcyBub3QuCisgICAgICAgICMgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5hc2N0aW1lLAorICAgICAgICAjICAgICAgICAgICAgICAgICAgKDEyMzQ1LCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwKSkKKyAgICAgICAgIyBYWFg6IEZvciBub3csIGp1c3QgbWFrZSBzdXJlIHdlIGRvbid0IGhhdmUgYSBjcmFzaDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGltZS5hc2N0aW1lKCgxMjM0NSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgMCkpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgQHVuaXR0ZXN0LnNraXBJZihub3QgaGFzYXR0cih0aW1lLCAidHpzZXQiKSwKKyAgICAgICAgInRpbWUgbW9kdWxlIGhhcyBubyBhdHRyaWJ1dGUgdHpzZXQiKQorICAgIGRlZiB0ZXN0X3R6c2V0KHNlbGYpOgorCisgICAgICAgIGZyb20gb3MgaW1wb3J0IGVudmlyb24KKworICAgICAgICAjIEVwb2NoIHRpbWUgb2YgbWlkbmlnaHQgRGVjIDI1dGggMjAwMi4gTmV2ZXIgRFNUIGluIG5vcnRoZXJuCisgICAgICAgICMgaGVtaXNwaGVyZS4KKyAgICAgICAgeG1hczIwMDIgPSAxMDQwNzc0NDAwLjAKKworICAgICAgICAjIFRoZXNlIGZvcm1hdHMgYXJlIGNvcnJlY3QgZm9yIDIwMDIsIGFuZCBwb3NzaWJseSBmdXR1cmUgeWVhcnMKKyAgICAgICAgIyBUaGlzIGZvcm1hdCBpcyB0aGUgJ3N0YW5kYXJkJyBhcyBkb2N1bWVudGVkIGF0OgorICAgICAgICAjIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS9iYXNlZGVmcy94YmRfY2hhcDA4Lmh0bWwKKyAgICAgICAgIyBUaGV5IGFyZSBhbHNvIGRvY3VtZW50ZWQgaW4gdGhlIHR6c2V0KDMpIG1hbiBwYWdlIG9uIG1vc3QgVW5peAorICAgICAgICAjIHN5c3RlbXMuCisgICAgICAgIGVhc3Rlcm4gPSAnRVNUKzA1RURULE00LjEuMCxNMTAuNS4wJworICAgICAgICB2aWN0b3JpYSA9ICdBRVNULTEwQUVEVC0xMSxNMTAuNS4wLE0zLjUuMCcKKyAgICAgICAgdXRjPSdVVEMrMCcKKworICAgICAgICBvcmdfVFogPSBlbnZpcm9uLmdldCgnVFonLE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgTWFrZSBzdXJlIHdlIGNhbiBzd2l0Y2ggdG8gVVRDIHRpbWUgYW5kIHJlc3VsdHMgYXJlIGNvcnJlY3QKKyAgICAgICAgICAgICMgTm90ZSB0aGF0IHVua25vd24gdGltZXpvbmVzIGRlZmF1bHQgdG8gVVRDLgorICAgICAgICAgICAgIyBOb3RlIHRoYXQgYWx0em9uZSBpcyB1bmRlZmluZWQgaW4gVVRDLCBhcyB0aGVyZSBpcyBubyBEU1QKKyAgICAgICAgICAgIGVudmlyb25bJ1RaJ10gPSBlYXN0ZXJuCisgICAgICAgICAgICB0aW1lLnR6c2V0KCkKKyAgICAgICAgICAgIGVudmlyb25bJ1RaJ10gPSB1dGMKKyAgICAgICAgICAgIHRpbWUudHpzZXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICB0aW1lLmdtdGltZSh4bWFzMjAwMiksIHRpbWUubG9jYWx0aW1lKHhtYXMyMDAyKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5kYXlsaWdodCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS50aW1lem9uZSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5sb2NhbHRpbWUoeG1hczIwMDIpLnRtX2lzZHN0LCAwKQorCisgICAgICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBjYW4gc3dpdGNoIHRvIFVTL0Vhc3Rlcm4KKyAgICAgICAgICAgIGVudmlyb25bJ1RaJ10gPSBlYXN0ZXJuCisgICAgICAgICAgICB0aW1lLnR6c2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodGltZS5nbXRpbWUoeG1hczIwMDIpLCB0aW1lLmxvY2FsdGltZSh4bWFzMjAwMikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUudHpuYW1lLCAoJ0VTVCcsICdFRFQnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRpbWUudHpuYW1lKSwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5kYXlsaWdodCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS50aW1lem9uZSwgMTgwMDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUuYWx0em9uZSwgMTQ0MDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUubG9jYWx0aW1lKHhtYXMyMDAyKS50bV9pc2RzdCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRpbWUudHpuYW1lKSwgMikKKworICAgICAgICAgICAgIyBOb3cgZ28gdG8gdGhlIHNvdXRoZXJuIGhlbWlzcGhlcmUuCisgICAgICAgICAgICBlbnZpcm9uWydUWiddID0gdmljdG9yaWEKKyAgICAgICAgICAgIHRpbWUudHpzZXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh0aW1lLmdtdGltZSh4bWFzMjAwMiksIHRpbWUubG9jYWx0aW1lKHhtYXMyMDAyKSkKKworICAgICAgICAgICAgIyBJc3N1ZSAjMTE4ODY6IEF1c3RyYWxpYW4gRWFzdGVybiBTdGFuZGFyZCBUaW1lIChVVEMrMTApIGlzIGNhbGxlZAorICAgICAgICAgICAgIyAiRVNUIiAoYXMgRWFzdGVybiBTdGFuZGFyZCBUaW1lLCBVVEMtNSkgaW5zdGVhZCBvZiAiQUVTVCIgb24gc29tZQorICAgICAgICAgICAgIyBvcGVyYXRpbmcgc3lzdGVtcyAoZS5nLiBGcmVlQlNEKSwgd2hpY2ggaXMgd3JvbmcuIFNlZSBmb3IgZXhhbXBsZQorICAgICAgICAgICAgIyB0aGlzIGJ1ZzogaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTkzODEwCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHRpbWUudHpuYW1lWzBdLCAoJ0FFU1QnICdFU1QnKSwgdGltZS50em5hbWVbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZS50em5hbWVbMV0gPT0gJ0FFRFQnLCBzdHIodGltZS50em5hbWVbMV0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGltZS50em5hbWUpLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLmRheWxpZ2h0LCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLnRpbWV6b25lLCAtMzYwMDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUuYWx0em9uZSwgLTM5NjAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLmxvY2FsdGltZSh4bWFzMjAwMikudG1faXNkc3QsIDEpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICMgUmVwYWlyIFRaIGVudmlyb25tZW50IHZhcmlhYmxlIGluIGNhc2UgYW55IG90aGVyIHRlc3RzCisgICAgICAgICAgICAjIHJlbHkgb24gaXQuCisgICAgICAgICAgICBpZiBvcmdfVFogaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZW52aXJvblsnVFonXSA9IG9yZ19UWgorICAgICAgICAgICAgZWxpZiBlbnZpcm9uLmhhc19rZXkoJ1RaJyk6CisgICAgICAgICAgICAgICAgZGVsIGVudmlyb25bJ1RaJ10KKyAgICAgICAgICAgIHRpbWUudHpzZXQoKQorCisgICAgZGVmIHRlc3RfaW5zYW5lX3RpbWVzdGFtcHMoc2VsZik6CisgICAgICAgICMgSXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgcGxhdGZvcm0gbWFwcyB0aW1lX3QgdG8gZG91YmxlLAorICAgICAgICAjIGFuZCB0aGF0IHRoaXMgdGVzdCB3aWxsIGZhaWwgdGhlcmUuICBUaGlzIHRlc3Qgc2hvdWxkCisgICAgICAgICMgZXhlbXB0IHN1Y2ggcGxhdGZvcm1zIChwcm92aWRlZCB0aGV5IHJldHVybiByZWFzb25hYmxlCisgICAgICAgICMgcmVzdWx0cyEpLgorICAgICAgICBmb3IgZnVuYyBpbiB0aW1lLmN0aW1lLCB0aW1lLmdtdGltZSwgdGltZS5sb2NhbHRpbWU6CisgICAgICAgICAgICBmb3IgdW5yZWFzb25hYmxlIGluIC0xZTIwMCwgMWUyMDA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZnVuYywgdW5yZWFzb25hYmxlKQorCisgICAgZGVmIHRlc3RfY3RpbWVfd2l0aG91dF9hcmcoc2VsZik6CisgICAgICAgICMgTm90IHN1cmUgaG93IHRvIGNoZWNrIHRoZSB2YWx1ZXMsIHNpbmNlIHRoZSBjbG9jayBjb3VsZCB0aWNrCisgICAgICAgICMgYXQgYW55IHRpbWUuICBNYWtlIHN1cmUgdGhlc2UgYXJlIGF0IGxlYXN0IGFjY2VwdGVkIGFuZAorICAgICAgICAjIGRvbid0IHJhaXNlIGVycm9ycy4KKyAgICAgICAgdGltZS5jdGltZSgpCisgICAgICAgIHRpbWUuY3RpbWUoTm9uZSkKKworICAgIGRlZiB0ZXN0X2dtdGltZV93aXRob3V0X2FyZyhzZWxmKToKKyAgICAgICAgZ3QwID0gdGltZS5nbXRpbWUoKQorICAgICAgICBndDEgPSB0aW1lLmdtdGltZShOb25lKQorICAgICAgICB0MCA9IHRpbWUubWt0aW1lKGd0MCkKKyAgICAgICAgdDEgPSB0aW1lLm1rdGltZShndDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9ICh0MS10MCkgPCAwLjIpCisKKyAgICBkZWYgdGVzdF9sb2NhbHRpbWVfd2l0aG91dF9hcmcoc2VsZik6CisgICAgICAgIGx0MCA9IHRpbWUubG9jYWx0aW1lKCkKKyAgICAgICAgbHQxID0gdGltZS5sb2NhbHRpbWUoTm9uZSkKKyAgICAgICAgdDAgPSB0aW1lLm1rdGltZShsdDApCisgICAgICAgIHQxID0gdGltZS5ta3RpbWUobHQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSAodDEtdDApIDwgMC4yKQorCisgICAgZGVmIHRlc3RfbWt0aW1lKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNzI2Njg3CisgICAgICAgIGZvciB0IGluICgtMiwgLTEsIDAsIDEpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHR0ID0gdGltZS5sb2NhbHRpbWUodCkKKyAgICAgICAgICAgIGV4Y2VwdCAoT3ZlcmZsb3dFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUubWt0aW1lKHR0KSwgdCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUaW1lVGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aW1lLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZhNzAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aW1lLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZhNzAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZW91dC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RpbWVvdXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjMTI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RpbWVvdXQucHkKQEAgLTAsMCArMSwyMDIgQEAKKyIiIlVuaXQgdGVzdHMgZm9yIHNvY2tldCB0aW1lb3V0IGZlYXR1cmUuIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBUaGlzIHJlcXVpcmVzIHRoZSAnbmV0d29yaycgcmVzb3VyY2UgYXMgZ2l2ZW4gb24gdGhlIHJlZ3J0ZXN0IGNvbW1hbmQgbGluZS4KK3NraXBfZXhwZWN0ZWQgPSBub3QgdGVzdF9zdXBwb3J0LmlzX3Jlc291cmNlX2VuYWJsZWQoJ25ldHdvcmsnKQorCitpbXBvcnQgdGltZQoraW1wb3J0IHNvY2tldAorCisKK2NsYXNzIENyZWF0aW9uVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgY2FzZSBmb3Igc29ja2V0LmdldHRpbWVvdXQoKSBhbmQgc29ja2V0LnNldHRpbWVvdXQoKSIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCisKKyAgICBkZWYgdGVzdE9iamVjdENyZWF0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgU29ja2V0IGNyZWF0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zb2NrLmdldHRpbWVvdXQoKSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCBub3QgZGlzYWJsZWQgYnkgZGVmYXVsdCIpCisKKyAgICBkZWYgdGVzdEZsb2F0UmV0dXJuVmFsdWUoc2VsZik6CisgICAgICAgICMgVGVzdCByZXR1cm4gdmFsdWUgb2YgZ2V0dGltZW91dCgpCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDcuMzQ1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc29jay5nZXR0aW1lb3V0KCksIDcuMzQ1KQorCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zb2NrLmdldHRpbWVvdXQoKSwgMykKKworICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc29jay5nZXR0aW1lb3V0KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdFJldHVyblR5cGUoc2VsZik6CisgICAgICAgICMgVGVzdCByZXR1cm4gdHlwZSBvZiBnZXR0aW1lb3V0KCkKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHNlbGYuc29jay5nZXR0aW1lb3V0KCkpLCB0eXBlKDEuMCkpCisKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoMy45KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc2VsZi5zb2NrLmdldHRpbWVvdXQoKSksIHR5cGUoMS4wKSkKKworICAgIGRlZiB0ZXN0VHlwZUNoZWNrKHNlbGYpOgorICAgICAgICAjIFRlc3QgdHlwZSBjaGVja2luZyBieSBzZXR0aW1lb3V0KCkKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoMCkKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoMEwpCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDAuMCkKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnNvY2suc2V0dGltZW91dCwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zb2NrLnNldHRpbWVvdXQsIHUiIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnNvY2suc2V0dGltZW91dCwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zb2NrLnNldHRpbWVvdXQsIFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuc29jay5zZXR0aW1lb3V0LCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnNvY2suc2V0dGltZW91dCwgMGopCisKKyAgICBkZWYgdGVzdFJhbmdlQ2hlY2soc2VsZik6CisgICAgICAgICMgVGVzdCByYW5nZSBjaGVja2luZyBieSBzZXR0aW1lb3V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5zb2NrLnNldHRpbWVvdXQsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnNvY2suc2V0dGltZW91dCwgLTFMKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnNvY2suc2V0dGltZW91dCwgLTEuMCkKKworICAgIGRlZiB0ZXN0VGltZW91dFRoZW5CbG9ja2luZyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHNldHRpbWVvdXQoKSBmb2xsb3dlZCBieSBzZXRibG9ja2luZygpCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDEwKQorICAgICAgICBzZWxmLnNvY2suc2V0YmxvY2tpbmcoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNvY2suZ2V0dGltZW91dCgpLCBOb25lKQorICAgICAgICBzZWxmLnNvY2suc2V0YmxvY2tpbmcoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNvY2suZ2V0dGltZW91dCgpLCAwLjApCisKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoMTApCisgICAgICAgIHNlbGYuc29jay5zZXRibG9ja2luZygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc29jay5nZXR0aW1lb3V0KCksIDAuMCkKKyAgICAgICAgc2VsZi5zb2NrLnNldGJsb2NraW5nKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zb2NrLmdldHRpbWVvdXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0QmxvY2tpbmdUaGVuVGltZW91dChzZWxmKToKKyAgICAgICAgIyBUZXN0IHNldGJsb2NraW5nKCkgZm9sbG93ZWQgYnkgc2V0dGltZW91dCgpCisgICAgICAgIHNlbGYuc29jay5zZXRibG9ja2luZygwKQorICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dCgxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc29jay5nZXR0aW1lb3V0KCksIDEpCisKKyAgICAgICAgc2VsZi5zb2NrLnNldGJsb2NraW5nKDEpCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zb2NrLmdldHRpbWVvdXQoKSwgMSkKKworCitjbGFzcyBUaW1lb3V0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgY2FzZSBmb3Igc29ja2V0LnNvY2tldCgpIHRpbWVvdXQgZnVuY3Rpb25zIiIiCisKKyAgICAjIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0ZXN0cyBoZXJlIHRyeWluZyB0byBtYWtlIHN1cmUgdGhhdCBhbiBvcGVyYXRpb24KKyAgICAjIGRvZXNuJ3QgdGFrZSB0b28gbXVjaCBsb25nZXIgdGhhbiBleHBlY3RlZC4gIEJ1dCBjb21wZXRpbmcgbWFjaGluZQorICAgICMgYWN0aXZpdHkgbWFrZXMgaXQgaW5ldml0YWJsZSB0aGF0IHN1Y2ggdGVzdHMgd2lsbCBmYWlsIGF0IHRpbWVzLgorICAgICMgV2hlbiBmdXp6IHdhcyBhdCAxLjAsIEkgKHRpbSkgcm91dGluZWx5IHNhdyBib2d1cyBmYWlsdXJlcyBvbiBXaW4ySworICAgICMgYW5kIFdpbjk4U0UuICBCb29zdGluZyBpdCB0byAyLjAgaGVscGVkIGEgbG90LCBidXQgaXNuJ3QgYSByZWFsCisgICAgIyBzb2x1dGlvbi4KKyAgICBmdXp6ID0gMi4wCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5hZGRyX3JlbW90ZSA9ICgnd3d3LnB5dGhvbi5vcmcuJywgODApCisgICAgICAgIHNlbGYubG9jYWxob3N0ID0gJzEyNy4wLjAuMScKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0Q29ubmVjdFRpbWVvdXQoc2VsZik6CisgICAgICAgICMgQ2hvb3NlIGEgcHJpdmF0ZSBhZGRyZXNzIHRoYXQgaXMgdW5saWtlbHkgdG8gZXhpc3QgdG8gcHJldmVudAorICAgICAgICAjIGZhaWx1cmVzIGR1ZSB0byB0aGUgY29ubmVjdCBzdWNjZWVkaW5nIGJlZm9yZSB0aGUgdGltZW91dC4KKyAgICAgICAgIyBVc2UgYSBkb3R0ZWQgSVAgYWRkcmVzcyB0byBhdm9pZCBpbmNsdWRpbmcgdGhlIEROUyBsb29rdXAgdGltZQorICAgICAgICAjIHdpdGggdGhlIGNvbm5lY3QgdGltZS4gIFRoaXMgYXZvaWRzIGZhaWxpbmcgdGhlIGFzc2VydGlvbiB0aGF0CisgICAgICAgICMgdGhlIHRpbWVvdXQgb2NjdXJyZWQgZmFzdCBlbm91Z2guCisgICAgICAgIGFkZHIgPSAoJzEwLjAuMC4wJywgMTIzNDUpCisKKyAgICAgICAgIyBUZXN0IGNvbm5lY3QoKSB0aW1lb3V0CisgICAgICAgIF90aW1lb3V0ID0gMC4wMDEKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoX3RpbWVvdXQpCisKKyAgICAgICAgX3QxID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzZWxmLnNvY2suY29ubmVjdCwgYWRkcikKKyAgICAgICAgX3QyID0gdGltZS50aW1lKCkKKworICAgICAgICBfZGVsdGEgPSBhYnMoX3QxIC0gX3QyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2RlbHRhIDwgX3RpbWVvdXQgKyBzZWxmLmZ1enosCisgICAgICAgICAgICAgICAgICAgICAidGltZW91dCAoJWcpIGlzIG1vcmUgdGhhbiAlZyBzZWNvbmRzIG1vcmUgdGhhbiBleHBlY3RlZCAoJWcpIgorICAgICAgICAgICAgICAgICAgICAgJShfZGVsdGEsIHNlbGYuZnV6eiwgX3RpbWVvdXQpKQorCisgICAgZGVmIHRlc3RSZWN2VGltZW91dChzZWxmKToKKyAgICAgICAgIyBUZXN0IHJlY3YoKSB0aW1lb3V0CisgICAgICAgIF90aW1lb3V0ID0gMC4wMgorCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChzZWxmLmFkZHJfcmVtb3RlWzBdKToKKyAgICAgICAgICAgIHNlbGYuc29jay5jb25uZWN0KHNlbGYuYWRkcl9yZW1vdGUpCisgICAgICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dChfdGltZW91dCkKKworICAgICAgICAgICAgX3QxID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC50aW1lb3V0LCBzZWxmLnNvY2sucmVjdiwgMTAyNCkKKyAgICAgICAgICAgIF90MiA9IHRpbWUudGltZSgpCisKKyAgICAgICAgICAgIF9kZWx0YSA9IGFicyhfdDEgLSBfdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoX2RlbHRhIDwgX3RpbWVvdXQgKyBzZWxmLmZ1enosCisgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgKCVnKSBpcyAlZyBzZWNvbmRzIG1vcmUgdGhhbiBleHBlY3RlZCAoJWcpIgorICAgICAgICAgICAgICAgICAgICAgICAgICUoX2RlbHRhLCBzZWxmLmZ1enosIF90aW1lb3V0KSkKKworICAgIGRlZiB0ZXN0QWNjZXB0VGltZW91dChzZWxmKToKKyAgICAgICAgIyBUZXN0IGFjY2VwdCgpIHRpbWVvdXQKKyAgICAgICAgX3RpbWVvdXQgPSAyCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KF90aW1lb3V0KQorICAgICAgICAjIFByZXZlbnQgIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiIHNvY2tldCBleGNlcHRpb25zCisgICAgICAgIHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zb2NrLCBzZWxmLmxvY2FsaG9zdCkKKyAgICAgICAgc2VsZi5zb2NrLmxpc3Rlbig1KQorCisgICAgICAgIF90MSA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc2VsZi5zb2NrLmFjY2VwdCkKKyAgICAgICAgX3QyID0gdGltZS50aW1lKCkKKworICAgICAgICBfZGVsdGEgPSBhYnMoX3QxIC0gX3QyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2RlbHRhIDwgX3RpbWVvdXQgKyBzZWxmLmZ1enosCisgICAgICAgICAgICAgICAgICAgICAidGltZW91dCAoJWcpIGlzICVnIHNlY29uZHMgbW9yZSB0aGFuIGV4cGVjdGVkICglZykiCisgICAgICAgICAgICAgICAgICAgICAlKF9kZWx0YSwgc2VsZi5mdXp6LCBfdGltZW91dCkpCisKKyAgICBkZWYgdGVzdFJlY3Zmcm9tVGltZW91dChzZWxmKToKKyAgICAgICAgIyBUZXN0IHJlY3Zmcm9tKCkgdGltZW91dAorICAgICAgICBfdGltZW91dCA9IDIKKyAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KF90aW1lb3V0KQorICAgICAgICAjIFByZXZlbnQgIkFkZHJlc3MgYWxyZWFkeSBpbiB1c2UiIHNvY2tldCBleGNlcHRpb25zCisgICAgICAgIHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zb2NrLCBzZWxmLmxvY2FsaG9zdCkKKworICAgICAgICBfdDEgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNlbGYuc29jay5yZWN2ZnJvbSwgODE5MikKKyAgICAgICAgX3QyID0gdGltZS50aW1lKCkKKworICAgICAgICBfZGVsdGEgPSBhYnMoX3QxIC0gX3QyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2RlbHRhIDwgX3RpbWVvdXQgKyBzZWxmLmZ1enosCisgICAgICAgICAgICAgICAgICAgICAidGltZW91dCAoJWcpIGlzICVnIHNlY29uZHMgbW9yZSB0aGFuIGV4cGVjdGVkICglZykiCisgICAgICAgICAgICAgICAgICAgICAlKF9kZWx0YSwgc2VsZi5mdXp6LCBfdGltZW91dCkpCisKKyAgICBkZWYgdGVzdFNlbmQoc2VsZik6CisgICAgICAgICMgVGVzdCBzZW5kKCkgdGltZW91dAorICAgICAgICAjIGNvdWxkbid0IGZpZ3VyZSBvdXQgaG93IHRvIHRlc3QgaXQKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RTZW5kdG8oc2VsZik6CisgICAgICAgICMgVGVzdCBzZW5kdG8oKSB0aW1lb3V0CisgICAgICAgICMgY291bGRuJ3QgZmlndXJlIG91dCBob3cgdG8gdGVzdCBpdAorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdFNlbmRhbGwoc2VsZik6CisgICAgICAgICMgVGVzdCBzZW5kYWxsKCkgdGltZW91dAorICAgICAgICAjIGNvdWxkbid0IGZpZ3VyZSBvdXQgaG93IHRvIHRlc3QgaXQKKyAgICAgICAgcGFzcworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoJ25ldHdvcmsnKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ3JlYXRpb25UZXN0Q2FzZSwgVGltZW91dFRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aW1lb3V0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RpbWVvdXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NGVjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aW1lb3V0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aW1lb3V0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RpbWVvdXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NGVjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aW1lb3V0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ay5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MjVkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ay5weQpAQCAtMCwwICsxLDI5IEBACitpbXBvcnQgb3MKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgU2tpcCB0ZXN0IGlmIF90a2ludGVyIHdhc24ndCBidWlsdC4KK3Rlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdfdGtpbnRlcicpCisKK3RoaXNfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCitsaWJfdGtfdGVzdCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4odGhpc19kaXIsIG9zLnBhdGgucGFyZGlyLAorICAgICdsaWItdGsnLCAndGVzdCcpKQorCit3aXRoIHRlc3Rfc3VwcG9ydC5EaXJzT25TeXNQYXRoKGxpYl90a190ZXN0KToKKyAgICBpbXBvcnQgcnVudGt0ZXN0cworCisjIFNraXAgdGVzdCBpZiB0ayBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuCitydW50a3Rlc3RzLmNoZWNrX3RrX2F2YWlsYWJpbGl0eSgpCisKK2RlZiB0ZXN0X21haW4oZW5hYmxlX2d1aT1GYWxzZSk6CisgICAgaWYgZW5hYmxlX2d1aToKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51c2VfcmVzb3VyY2VzID0gWydndWknXQorICAgICAgICBlbGlmICdndWknIG5vdCBpbiB0ZXN0X3N1cHBvcnQudXNlX3Jlc291cmNlczoKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51c2VfcmVzb3VyY2VzLmFwcGVuZCgnZ3VpJykKKworICAgIHdpdGggdGVzdF9zdXBwb3J0LkRpcnNPblN5c1BhdGgobGliX3RrX3Rlc3QpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICAgICAgKnJ1bnRrdGVzdHMuZ2V0X3Rlc3RzKHRleHQ9RmFsc2UsIHBhY2thZ2VzPVsndGVzdF90a2ludGVyJ10pKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbihlbmFibGVfZ3VpPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ay5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ay5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiNDMwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ay5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ay5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiNDMwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90b2tlbml6ZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Rva2VuaXplLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OWY2OGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90b2tlbml6ZS5weQpAQCAtMCwwICsxLDYyNSBAQAorZG9jdGVzdHMgPSAiIiIKK1Rlc3RzIGZvciB0aGUgdG9rZW5pemUgbW9kdWxlLgorCisgICAgPj4+IGltcG9ydCBnbG9iLCByYW5kb20sIHN5cworCitUaGUgdGVzdHMgY2FuIGJlIHJlYWxseSBzaW1wbGUuIEdpdmVuIGEgc21hbGwgZnJhZ21lbnQgb2Ygc291cmNlCitjb2RlLCBwcmludCBvdXQgYSB0YWJsZSB3aXRoIHRva2Vucy4gVGhlIEVORE1BUksgaXMgb21pdHRlZCBmb3IKK2JyZXZpdHkuCisKKyAgICA+Pj4gZHVtcF90b2tlbnMoIjEgKyAxIikKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA0KSAoMSwgNSkKKworICAgID4+PiBkdW1wX3Rva2VucygiaWYgRmFsc2U6XFxuIgorICAgIC4uLiAgICAgICAgICAgICAiICAgICMgTkxcXG4iCisgICAgLi4uICAgICAgICAgICAgICIgICAgVHJ1ZSA9IEZhbHNlICMgTkVXTElORVxcbiIpCisgICAgTkFNRSAgICAgICAnaWYnICAgICAgICAgICgxLCAwKSAoMSwgMikKKyAgICBOQU1FICAgICAgICdGYWxzZScgICAgICAgKDEsIDMpICgxLCA4KQorICAgIE9QICAgICAgICAgJzonICAgICAgICAgICAoMSwgOCkgKDEsIDkpCisgICAgTkVXTElORSAgICAnXFxuJyAgICAgICAgICAoMSwgOSkgKDEsIDEwKQorICAgIENPTU1FTlQgICAgJyMgTkwnICAgICAgICAoMiwgNCkgKDIsIDgpCisgICAgTkwgICAgICAgICAnXFxuJyAgICAgICAgICAoMiwgOCkgKDIsIDkpCisgICAgSU5ERU5UICAgICAnICAgICcgICAgICAgICgzLCAwKSAoMywgNCkKKyAgICBOQU1FICAgICAgICdUcnVlJyAgICAgICAgKDMsIDQpICgzLCA4KQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMywgOSkgKDMsIDEwKQorICAgIE5BTUUgICAgICAgJ0ZhbHNlJyAgICAgICAoMywgMTEpICgzLCAxNikKKyAgICBDT01NRU5UICAgICcjIE5FV0xJTkUnICAgKDMsIDE3KSAoMywgMjYpCisgICAgTkVXTElORSAgICAnXFxuJyAgICAgICAgICAoMywgMjYpICgzLCAyNykKKyAgICBERURFTlQgICAgICcnICAgICAgICAgICAgKDQsIDApICg0LCAwKQorCisgICAgPj4+IGluZGVudF9lcnJvcl9maWxlID0gXCIiIgorICAgIC4uLiBkZWYgayh4KToKKyAgICAuLi4gICAgIHggKz0gMgorICAgIC4uLiAgIHggKz0gNQorICAgIC4uLiBcIiIiCisKKyAgICA+Pj4gZm9yIHRvayBpbiBnZW5lcmF0ZV90b2tlbnMoU3RyaW5nSU8oaW5kZW50X2Vycm9yX2ZpbGUpLnJlYWRsaW5lKTogcGFzcworICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgLi4uCisgICAgSW5kZW50YXRpb25FcnJvcjogdW5pbmRlbnQgZG9lcyBub3QgbWF0Y2ggYW55IG91dGVyIGluZGVudGF0aW9uIGxldmVsCisKK1Rlc3Qgcm91bmR0cmlwIGZvciBgdW50b2tlbml6ZWAuIGBmYCBpcyBhbiBvcGVuIGZpbGUgb3IgYSBzdHJpbmcuIFRoZSBzb3VyY2UKK2NvZGUgaW4gZiBpcyB0b2tlbml6ZWQsIGNvbnZlcnRlZCBiYWNrIHRvIHNvdXJjZSBjb2RlIHZpYSB0b2tlbml6ZS51bnRva2VuaXplKCksCithbmQgdG9rZW5pemVkIGFnYWluIGZyb20gdGhlIGxhdHRlci4gVGhlIHRlc3QgZmFpbHMgaWYgdGhlIHNlY29uZCB0b2tlbml6YXRpb24KK2RvZXNuJ3QgbWF0Y2ggdGhlIGZpcnN0LgorCisgICAgPj4+IGRlZiByb3VuZHRyaXAoZik6CisgICAgLi4uICAgICBpZiBpc2luc3RhbmNlKGYsIHN0cik6IGYgPSBTdHJpbmdJTyhmKQorICAgIC4uLiAgICAgdG9rZW5fbGlzdCA9IGxpc3QoZ2VuZXJhdGVfdG9rZW5zKGYucmVhZGxpbmUpKQorICAgIC4uLiAgICAgZi5jbG9zZSgpCisgICAgLi4uICAgICB0b2tlbnMxID0gW3Rva1s6Ml0gZm9yIHRvayBpbiB0b2tlbl9saXN0XQorICAgIC4uLiAgICAgbmV3X3RleHQgPSB1bnRva2VuaXplKHRva2VuczEpCisgICAgLi4uICAgICByZWFkbGluZSA9IGl0ZXIobmV3X3RleHQuc3BsaXRsaW5lcygxKSkubmV4dAorICAgIC4uLiAgICAgdG9rZW5zMiA9IFt0b2tbOjJdIGZvciB0b2sgaW4gZ2VuZXJhdGVfdG9rZW5zKHJlYWRsaW5lKV0KKyAgICAuLi4gICAgIHJldHVybiB0b2tlbnMxID09IHRva2VuczIKKyAgICAuLi4KKworVGhlcmUgYXJlIHNvbWUgc3RhbmRhcmQgZm9ybWF0dGluZyBwcmFjdGljZXMgdGhhdCBhcmUgZWFzeSB0byBnZXQgcmlnaHQuCisKKyAgICA+Pj4gcm91bmR0cmlwKCJpZiB4ID09IDE6XFxuIgorICAgIC4uLiAgICAgICAgICAgIiAgICBwcmludCB4XFxuIikKKyAgICBUcnVlCisKKyAgICA+Pj4gcm91bmR0cmlwKCIjIFRoaXMgaXMgYSBjb21tZW50XFxuIyBUaGlzIGFsc28iKQorICAgIFRydWUKKworU29tZSBwZW9wbGUgdXNlIGRpZmZlcmVudCBmb3JtYXR0aW5nIGNvbnZlbnRpb25zLCB3aGljaCBtYWtlcwordW50b2tlbml6ZSBhIGxpdHRsZSB0cmlja2llci4gTm90ZSB0aGF0IHRoaXMgdGVzdCBpbnZvbHZlcyB0cmFpbGluZword2hpdGVzcGFjZSBhZnRlciB0aGUgY29sb24uIE5vdGUgdGhhdCB3ZSB1c2UgaGV4IGVzY2FwZXMgdG8gbWFrZSB0aGUKK3R3byB0cmFpbGluZyBibGFua3MgYXBwZXJhbnQgaW4gdGhlIGV4cGVjdGVkIG91dHB1dC4KKworICAgID4+PiByb3VuZHRyaXAoImlmIHggPT0gMSA6IFxcbiIKKyAgICAuLi4gICAgICAgICAgICIgIHByaW50IHhcXG4iKQorICAgIFRydWUKKworICAgID4+PiBmID0gdGVzdF9zdXBwb3J0LmZpbmRmaWxlKCJ0b2tlbml6ZV90ZXN0cyIgKyBvcy5leHRzZXAgKyAidHh0IikKKyAgICA+Pj4gcm91bmR0cmlwKG9wZW4oZikpCisgICAgVHJ1ZQorCisgICAgPj4+IHJvdW5kdHJpcCgiaWYgeCA9PSAxOlxcbiIKKyAgICAuLi4gICAgICAgICAgICIgICAgIyBBIGNvbW1lbnQgYnkgaXRzZWxmLlxcbiIKKyAgICAuLi4gICAgICAgICAgICIgICAgcHJpbnQgeCAjIENvbW1lbnQgaGVyZSwgdG9vLlxcbiIKKyAgICAuLi4gICAgICAgICAgICIgICAgIyBBbm90aGVyIGNvbW1lbnQuXFxuIgorICAgIC4uLiAgICAgICAgICAgImFmdGVyX2lmID0gVHJ1ZVxcbiIpCisgICAgVHJ1ZQorCisgICAgPj4+IHJvdW5kdHJpcCgiaWYgKHggIyBUaGUgY29tbWVudHMgbmVlZCB0byBnbyBpbiB0aGUgcmlnaHQgcGxhY2VcXG4iCisgICAgLi4uICAgICAgICAgICAiICAgID09IDEpOlxcbiIKKyAgICAuLi4gICAgICAgICAgICIgICAgcHJpbnQgJ3g9PTEnXFxuIikKKyAgICBUcnVlCisKKyAgICA+Pj4gcm91bmR0cmlwKCJjbGFzcyBUZXN0OiAjIEEgY29tbWVudCBoZXJlXFxuIgorICAgIC4uLiAgICAgICAgICAgIiAgIyBBIGNvbW1lbnQgd2l0aCB3ZWlyZCBpbmRlbnRcXG4iCisgICAgLi4uICAgICAgICAgICAiICBhZnRlcl9jb20gPSA1XFxuIgorICAgIC4uLiAgICAgICAgICAgIiAgZGVmIHgobSk6IHJldHVybiBtKjUgIyBhIG9uZSBsaW5lclxcbiIKKyAgICAuLi4gICAgICAgICAgICIgIGRlZiB5KG0pOiAjIEEgd2hpdGVzcGFjZSBhZnRlciB0aGUgY29sb25cXG4iCisgICAgLi4uICAgICAgICAgICAiICAgICByZXR1cm4geSo0ICMgMy1zcGFjZSBpbmRlbnRcXG4iKQorICAgIFRydWUKKworU29tZSBlcnJvci1oYW5kbGluZyBjb2RlCisKKyAgICA+Pj4gcm91bmR0cmlwKCJ0cnk6IGltcG9ydCBzb21lbW9kdWxlXFxuIgorICAgIC4uLiAgICAgICAgICAgImV4Y2VwdCBJbXBvcnRFcnJvcjogIyBjb21tZW50XFxuIgorICAgIC4uLiAgICAgICAgICAgIiAgICBwcmludCAnQ2FuIG5vdCBpbXBvcnQnICMgY29tbWVudDJcXG4iCisgICAgLi4uICAgICAgICAgICAiZWxzZTogICBwcmludCAnTG9hZGVkJ1xcbiIpCisgICAgVHJ1ZQorCitCYWxhbmNpbmcgY29udGludWF0aW9uCisKKyAgICA+Pj4gcm91bmR0cmlwKCJhID0gKDMsNCwgXFxuIgorICAgIC4uLiAgICAgICAgICAgIjUsNilcXG4iCisgICAgLi4uICAgICAgICAgICAieSA9IFszLCA0LFxcbiIKKyAgICAuLi4gICAgICAgICAgICI1XVxcbiIKKyAgICAuLi4gICAgICAgICAgICJ6ID0geydhJzogNSxcXG4iCisgICAgLi4uICAgICAgICAgICAiJ2InOjE1LCAnYyc6VHJ1ZX1cXG4iCisgICAgLi4uICAgICAgICAgICAieCA9IGxlbih5KSArIDUgLSBhW1xcbiIKKyAgICAuLi4gICAgICAgICAgICIzXSAtIGFbMl1cXG4iCisgICAgLi4uICAgICAgICAgICAiKyBsZW4oeikgLSB6W1xcbiIKKyAgICAuLi4gICAgICAgICAgICInYiddXFxuIikKKyAgICBUcnVlCisKK09yZGluYXJ5IGludGVnZXJzIGFuZCBiaW5hcnkgb3BlcmF0b3JzCisKKyAgICA+Pj4gZHVtcF90b2tlbnMoIjB4ZmYgPD0gMjU1IikKKyAgICBOVU1CRVIgICAgICcweGZmJyAgICAgICAgKDEsIDApICgxLCA0KQorICAgIE9QICAgICAgICAgJzw9JyAgICAgICAgICAoMSwgNSkgKDEsIDcpCisgICAgTlVNQkVSICAgICAnMjU1JyAgICAgICAgICgxLCA4KSAoMSwgMTEpCisgICAgPj4+IGR1bXBfdG9rZW5zKCIwYjEwIDw9IDI1NSIpCisgICAgTlVNQkVSICAgICAnMGIxMCcgICAgICAgICgxLCAwKSAoMSwgNCkKKyAgICBPUCAgICAgICAgICc8PScgICAgICAgICAgKDEsIDUpICgxLCA3KQorICAgIE5VTUJFUiAgICAgJzI1NScgICAgICAgICAoMSwgOCkgKDEsIDExKQorICAgID4+PiBkdW1wX3Rva2VucygiMG8xMjMgPD0gMDEyMyIpCisgICAgTlVNQkVSICAgICAnMG8xMjMnICAgICAgICgxLCAwKSAoMSwgNSkKKyAgICBPUCAgICAgICAgICc8PScgICAgICAgICAgKDEsIDYpICgxLCA4KQorICAgIE5VTUJFUiAgICAgJzAxMjMnICAgICAgICAoMSwgOSkgKDEsIDEzKQorICAgID4+PiBkdW1wX3Rva2VucygiMDEyMzQ1NjcgPiB+MHgxNSIpCisgICAgTlVNQkVSICAgICAnMDEyMzQ1NjcnICAgICgxLCAwKSAoMSwgOCkKKyAgICBPUCAgICAgICAgICc+JyAgICAgICAgICAgKDEsIDkpICgxLCAxMCkKKyAgICBPUCAgICAgICAgICd+JyAgICAgICAgICAgKDEsIDExKSAoMSwgMTIpCisgICAgTlVNQkVSICAgICAnMHgxNScgICAgICAgICgxLCAxMikgKDEsIDE2KQorICAgID4+PiBkdW1wX3Rva2VucygiMjEzNDU2OCAhPSAwMTIzMTUxNSIpCisgICAgTlVNQkVSICAgICAnMjEzNDU2OCcgICAgICgxLCAwKSAoMSwgNykKKyAgICBPUCAgICAgICAgICchPScgICAgICAgICAgKDEsIDgpICgxLCAxMCkKKyAgICBOVU1CRVIgICAgICcwMTIzMTUxNScgICAgKDEsIDExKSAoMSwgMTkpCisgICAgPj4+IGR1bXBfdG9rZW5zKCIoLTEyNDU2MS0xKSAmIDAyMDAwMDAwMDAiKQorICAgIE9QICAgICAgICAgJygnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnLScgICAgICAgICAgICgxLCAxKSAoMSwgMikKKyAgICBOVU1CRVIgICAgICcxMjQ1NjEnICAgICAgKDEsIDIpICgxLCA4KQorICAgIE9QICAgICAgICAgJy0nICAgICAgICAgICAoMSwgOCkgKDEsIDkpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA5KSAoMSwgMTApCisgICAgT1AgICAgICAgICAnKScgICAgICAgICAgICgxLCAxMCkgKDEsIDExKQorICAgIE9QICAgICAgICAgJyYnICAgICAgICAgICAoMSwgMTIpICgxLCAxMykKKyAgICBOVU1CRVIgICAgICcwMjAwMDAwMDAwJyAgKDEsIDE0KSAoMSwgMjQpCisgICAgPj4+IGR1bXBfdG9rZW5zKCIweGRlYWRiZWVmICE9IC0xIikKKyAgICBOVU1CRVIgICAgICcweGRlYWRiZWVmJyAgKDEsIDApICgxLCAxMCkKKyAgICBPUCAgICAgICAgICchPScgICAgICAgICAgKDEsIDExKSAoMSwgMTMpCisgICAgT1AgICAgICAgICAnLScgICAgICAgICAgICgxLCAxNCkgKDEsIDE1KQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgMTUpICgxLCAxNikKKyAgICA+Pj4gZHVtcF90b2tlbnMoIjB4ZGVhZGMwZGUgJiAwMTIzNDUiKQorICAgIE5VTUJFUiAgICAgJzB4ZGVhZGMwZGUnICAoMSwgMCkgKDEsIDEwKQorICAgIE9QICAgICAgICAgJyYnICAgICAgICAgICAoMSwgMTEpICgxLCAxMikKKyAgICBOVU1CRVIgICAgICcwMTIzNDUnICAgICAgKDEsIDEzKSAoMSwgMTkpCisgICAgPj4+IGR1bXBfdG9rZW5zKCIweEZGICYgMHgxNSB8IDEyMzQiKQorICAgIE5VTUJFUiAgICAgJzB4RkYnICAgICAgICAoMSwgMCkgKDEsIDQpCisgICAgT1AgICAgICAgICAnJicgICAgICAgICAgICgxLCA1KSAoMSwgNikKKyAgICBOVU1CRVIgICAgICcweDE1JyAgICAgICAgKDEsIDcpICgxLCAxMSkKKyAgICBPUCAgICAgICAgICd8JyAgICAgICAgICAgKDEsIDEyKSAoMSwgMTMpCisgICAgTlVNQkVSICAgICAnMTIzNCcgICAgICAgICgxLCAxNCkgKDEsIDE4KQorCitMb25nIGludGVnZXJzCisKKyAgICA+Pj4gZHVtcF90b2tlbnMoInggPSAwTCIpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE5VTUJFUiAgICAgJzBMJyAgICAgICAgICAoMSwgNCkgKDEsIDYpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gMHhmZmZmZmZmZmZmZiIpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE5VTUJFUiAgICAgJzB4ZmZmZmZmZmZmZiAoMSwgNCkgKDEsIDE3KQorICAgID4+PiBkdW1wX3Rva2VucygieCA9IDEyMzE0MTI0MjE1MTI1MTYxNjExMGwiKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBOVU1CRVIgICAgICcxMjMxNDEyNDIxNTEgKDEsIDQpICgxLCAyNikKKyAgICA+Pj4gZHVtcF90b2tlbnMoInggPSAtMTU5MjE1OTAyMTUwMTI1OTFMIikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgT1AgICAgICAgICAnLScgICAgICAgICAgICgxLCA0KSAoMSwgNSkKKyAgICBOVU1CRVIgICAgICcxNTkyMTU5MDIxNTAgKDEsIDUpICgxLCAyMykKKworRmxvYXRpbmcgcG9pbnQgbnVtYmVycworCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gMy4xNDE1OSIpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE5VTUJFUiAgICAgJzMuMTQxNTknICAgICAoMSwgNCkgKDEsIDExKQorICAgID4+PiBkdW1wX3Rva2VucygieCA9IDMxNDE1OS4iKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBOVU1CRVIgICAgICczMTQxNTkuJyAgICAgKDEsIDQpICgxLCAxMSkKKyAgICA+Pj4gZHVtcF90b2tlbnMoInggPSAuMzE0MTU5IikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgTlVNQkVSICAgICAnLjMxNDE1OScgICAgICgxLCA0KSAoMSwgMTEpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gM2UxNDE1OSIpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE5VTUJFUiAgICAgJzNlMTQxNTknICAgICAoMSwgNCkgKDEsIDExKQorICAgID4+PiBkdW1wX3Rva2VucygieCA9IDNFMTIzIikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgTlVNQkVSICAgICAnM0UxMjMnICAgICAgICgxLCA0KSAoMSwgOSkKKyAgICA+Pj4gZHVtcF90b2tlbnMoIngreSA9IDNlLTEyMzAiKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAxKSAoMSwgMikKKyAgICBOQU1FICAgICAgICd5JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgNCkgKDEsIDUpCisgICAgTlVNQkVSICAgICAnM2UtMTIzMCcgICAgICgxLCA2KSAoMSwgMTMpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gMy4xNGUxNTkiKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBOVU1CRVIgICAgICczLjE0ZTE1OScgICAgKDEsIDQpICgxLCAxMikKKworU3RyaW5nIGxpdGVyYWxzCisKKyAgICA+Pj4gZHVtcF90b2tlbnMoInggPSAnJzsgeSA9IFxcXCJcXFwiIikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgU1RSSU5HICAgICAiJyciICAgICAgICAgICgxLCA0KSAoMSwgNikKKyAgICBPUCAgICAgICAgICc7JyAgICAgICAgICAgKDEsIDYpICgxLCA3KQorICAgIE5BTUUgICAgICAgJ3knICAgICAgICAgICAoMSwgOCkgKDEsIDkpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAxMCkgKDEsIDExKQorICAgIFNUUklORyAgICAgJyIiJyAgICAgICAgICAoMSwgMTIpICgxLCAxNCkKKyAgICA+Pj4gZHVtcF90b2tlbnMoInggPSAnXFxcIic7IHkgPSBcXFwiJ1xcXCIiKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBTVFJJTkcgICAgICdcXCciXFwnJyAgICAgICAoMSwgNCkgKDEsIDcpCisgICAgT1AgICAgICAgICAnOycgICAgICAgICAgICgxLCA3KSAoMSwgOCkKKyAgICBOQU1FICAgICAgICd5JyAgICAgICAgICAgKDEsIDkpICgxLCAxMCkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDExKSAoMSwgMTIpCisgICAgU1RSSU5HICAgICAnIlxcJyInICAgICAgICAoMSwgMTMpICgxLCAxNikKKyAgICA+Pj4gZHVtcF90b2tlbnMoInggPSBcXFwiZG9lc24ndCBcXFwic2hyaW5rXFxcIiwgZG9lcyBpdFxcXCIiKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBTVFJJTkcgICAgICciZG9lc25cXCd0ICInICgxLCA0KSAoMSwgMTQpCisgICAgTkFNRSAgICAgICAnc2hyaW5rJyAgICAgICgxLCAxNCkgKDEsIDIwKQorICAgIFNUUklORyAgICAgJyIsIGRvZXMgaXQiJyAoMSwgMjApICgxLCAzMSkKKyAgICA+Pj4gZHVtcF90b2tlbnMoInggPSB1J2FiYycgKyBVJ0FCQyciKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBTVFJJTkcgICAgICJ1J2FiYyciICAgICAgKDEsIDQpICgxLCAxMCkKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDExKSAoMSwgMTIpCisgICAgU1RSSU5HICAgICAiVSdBQkMnIiAgICAgICgxLCAxMykgKDEsIDE5KQorICAgID4+PiBkdW1wX3Rva2VucygneSA9IHUiQUJDIiArIFUiQUJDIicpCisgICAgTkFNRSAgICAgICAneScgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIFNUUklORyAgICAgJ3UiQUJDIicgICAgICAoMSwgNCkgKDEsIDEwKQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMTEpICgxLCAxMikKKyAgICBTVFJJTkcgICAgICdVIkFCQyInICAgICAgKDEsIDEzKSAoMSwgMTkpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gdXInYWJjJyArIFVyJ0FCQycgKyB1UidBQkMnICsgVVInQUJDJyIpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIFNUUklORyAgICAgInVyJ2FiYyciICAgICAoMSwgNCkgKDEsIDExKQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMTIpICgxLCAxMykKKyAgICBTVFJJTkcgICAgICJVcidBQkMnIiAgICAgKDEsIDE0KSAoMSwgMjEpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAyMikgKDEsIDIzKQorICAgIFNUUklORyAgICAgInVSJ0FCQyciICAgICAoMSwgMjQpICgxLCAzMSkKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDMyKSAoMSwgMzMpCisgICAgU1RSSU5HICAgICAiVVInQUJDJyIgICAgICgxLCAzNCkgKDEsIDQxKQorICAgID4+PiBkdW1wX3Rva2VucygneSA9IHVyImFiYyIgKyBVciJBQkMiICsgdVIiQUJDIiArIFVSIkFCQyInKQorICAgIE5BTUUgICAgICAgJ3knICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBTVFJJTkcgICAgICd1ciJhYmMiJyAgICAgKDEsIDQpICgxLCAxMSkKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDEyKSAoMSwgMTMpCisgICAgU1RSSU5HICAgICAnVXIiQUJDIicgICAgICgxLCAxNCkgKDEsIDIxKQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMjIpICgxLCAyMykKKyAgICBTVFJJTkcgICAgICd1UiJBQkMiJyAgICAgKDEsIDI0KSAoMSwgMzEpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAzMikgKDEsIDMzKQorICAgIFNUUklORyAgICAgJ1VSIkFCQyInICAgICAoMSwgMzQpICgxLCA0MSkKKworICAgID4+PiBkdW1wX3Rva2VucygiYidhYmMnICsgQidhYmMnIikKKyAgICBTVFJJTkcgICAgICJiJ2FiYyciICAgICAgKDEsIDApICgxLCA2KQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgNykgKDEsIDgpCisgICAgU1RSSU5HICAgICAiQidhYmMnIiAgICAgICgxLCA5KSAoMSwgMTUpCisgICAgPj4+IGR1bXBfdG9rZW5zKCdiImFiYyIgKyBCImFiYyInKQorICAgIFNUUklORyAgICAgJ2IiYWJjIicgICAgICAoMSwgMCkgKDEsIDYpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCA3KSAoMSwgOCkKKyAgICBTVFJJTkcgICAgICdCImFiYyInICAgICAgKDEsIDkpICgxLCAxNSkKKyAgICA+Pj4gZHVtcF90b2tlbnMoImJyJ2FiYycgKyBiUidhYmMnICsgQnInYWJjJyArIEJSJ2FiYyciKQorICAgIFNUUklORyAgICAgImJyJ2FiYyciICAgICAoMSwgMCkgKDEsIDcpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCA4KSAoMSwgOSkKKyAgICBTVFJJTkcgICAgICJiUidhYmMnIiAgICAgKDEsIDEwKSAoMSwgMTcpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAxOCkgKDEsIDE5KQorICAgIFNUUklORyAgICAgIkJyJ2FiYyciICAgICAoMSwgMjApICgxLCAyNykKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDI4KSAoMSwgMjkpCisgICAgU1RSSU5HICAgICAiQlInYWJjJyIgICAgICgxLCAzMCkgKDEsIDM3KQorICAgID4+PiBkdW1wX3Rva2VucygnYnIiYWJjIiArIGJSImFiYyIgKyBCciJhYmMiICsgQlIiYWJjIicpCisgICAgU1RSSU5HICAgICAnYnIiYWJjIicgICAgICgxLCAwKSAoMSwgNykKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDgpICgxLCA5KQorICAgIFNUUklORyAgICAgJ2JSImFiYyInICAgICAoMSwgMTApICgxLCAxNykKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDE4KSAoMSwgMTkpCisgICAgU1RSSU5HICAgICAnQnIiYWJjIicgICAgICgxLCAyMCkgKDEsIDI3KQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMjgpICgxLCAyOSkKKyAgICBTVFJJTkcgICAgICdCUiJhYmMiJyAgICAgKDEsIDMwKSAoMSwgMzcpCisKK09wZXJhdG9ycworCisgICAgPj4+IGR1bXBfdG9rZW5zKCJkZWYgZDIyKGEsIGIsIGM9MiwgZD0yLCAqayk6IHBhc3MiKQorICAgIE5BTUUgICAgICAgJ2RlZicgICAgICAgICAoMSwgMCkgKDEsIDMpCisgICAgTkFNRSAgICAgICAnZDIyJyAgICAgICAgICgxLCA0KSAoMSwgNykKKyAgICBPUCAgICAgICAgICcoJyAgICAgICAgICAgKDEsIDcpICgxLCA4KQorICAgIE5BTUUgICAgICAgJ2EnICAgICAgICAgICAoMSwgOCkgKDEsIDkpCisgICAgT1AgICAgICAgICAnLCcgICAgICAgICAgICgxLCA5KSAoMSwgMTApCisgICAgTkFNRSAgICAgICAnYicgICAgICAgICAgICgxLCAxMSkgKDEsIDEyKQorICAgIE9QICAgICAgICAgJywnICAgICAgICAgICAoMSwgMTIpICgxLCAxMykKKyAgICBOQU1FICAgICAgICdjJyAgICAgICAgICAgKDEsIDE0KSAoMSwgMTUpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAxNSkgKDEsIDE2KQorICAgIE5VTUJFUiAgICAgJzInICAgICAgICAgICAoMSwgMTYpICgxLCAxNykKKyAgICBPUCAgICAgICAgICcsJyAgICAgICAgICAgKDEsIDE3KSAoMSwgMTgpCisgICAgTkFNRSAgICAgICAnZCcgICAgICAgICAgICgxLCAxOSkgKDEsIDIwKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMjApICgxLCAyMSkKKyAgICBOVU1CRVIgICAgICcyJyAgICAgICAgICAgKDEsIDIxKSAoMSwgMjIpCisgICAgT1AgICAgICAgICAnLCcgICAgICAgICAgICgxLCAyMikgKDEsIDIzKQorICAgIE9QICAgICAgICAgJyonICAgICAgICAgICAoMSwgMjQpICgxLCAyNSkKKyAgICBOQU1FICAgICAgICdrJyAgICAgICAgICAgKDEsIDI1KSAoMSwgMjYpCisgICAgT1AgICAgICAgICAnKScgICAgICAgICAgICgxLCAyNikgKDEsIDI3KQorICAgIE9QICAgICAgICAgJzonICAgICAgICAgICAoMSwgMjcpICgxLCAyOCkKKyAgICBOQU1FICAgICAgICdwYXNzJyAgICAgICAgKDEsIDI5KSAoMSwgMzMpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJkZWYgZDAxdl8oYT0xLCAqaywgKip3KTogcGFzcyIpCisgICAgTkFNRSAgICAgICAnZGVmJyAgICAgICAgICgxLCAwKSAoMSwgMykKKyAgICBOQU1FICAgICAgICdkMDF2XycgICAgICAgKDEsIDQpICgxLCA5KQorICAgIE9QICAgICAgICAgJygnICAgICAgICAgICAoMSwgOSkgKDEsIDEwKQorICAgIE5BTUUgICAgICAgJ2EnICAgICAgICAgICAoMSwgMTApICgxLCAxMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDExKSAoMSwgMTIpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCAxMikgKDEsIDEzKQorICAgIE9QICAgICAgICAgJywnICAgICAgICAgICAoMSwgMTMpICgxLCAxNCkKKyAgICBPUCAgICAgICAgICcqJyAgICAgICAgICAgKDEsIDE1KSAoMSwgMTYpCisgICAgTkFNRSAgICAgICAnaycgICAgICAgICAgICgxLCAxNikgKDEsIDE3KQorICAgIE9QICAgICAgICAgJywnICAgICAgICAgICAoMSwgMTcpICgxLCAxOCkKKyAgICBPUCAgICAgICAgICcqKicgICAgICAgICAgKDEsIDE5KSAoMSwgMjEpCisgICAgTkFNRSAgICAgICAndycgICAgICAgICAgICgxLCAyMSkgKDEsIDIyKQorICAgIE9QICAgICAgICAgJyknICAgICAgICAgICAoMSwgMjIpICgxLCAyMykKKyAgICBPUCAgICAgICAgICc6JyAgICAgICAgICAgKDEsIDIzKSAoMSwgMjQpCisgICAgTkFNRSAgICAgICAncGFzcycgICAgICAgICgxLCAyNSkgKDEsIDI5KQorCitDb21wYXJpc29uCisKKyAgICA+Pj4gZHVtcF90b2tlbnMoImlmIDEgPCAxID4gMSA9PSAxID49IDUgPD0gMHgxNSA8PSAweDEyICE9ICIgKworICAgIC4uLiAgICAgICAgICAgICAiMSBhbmQgNSBpbiAxIG5vdCBpbiAxIGlzIDEgb3IgNSBpcyBub3QgMTogcGFzcyIpCisgICAgTkFNRSAgICAgICAnaWYnICAgICAgICAgICgxLCAwKSAoMSwgMikKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDMpICgxLCA0KQorICAgIE9QICAgICAgICAgJzwnICAgICAgICAgICAoMSwgNSkgKDEsIDYpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA3KSAoMSwgOCkKKyAgICBPUCAgICAgICAgICc+JyAgICAgICAgICAgKDEsIDkpICgxLCAxMCkKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDExKSAoMSwgMTIpCisgICAgT1AgICAgICAgICAnPT0nICAgICAgICAgICgxLCAxMykgKDEsIDE1KQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgMTYpICgxLCAxNykKKyAgICBPUCAgICAgICAgICc+PScgICAgICAgICAgKDEsIDE4KSAoMSwgMjApCisgICAgTlVNQkVSICAgICAnNScgICAgICAgICAgICgxLCAyMSkgKDEsIDIyKQorICAgIE9QICAgICAgICAgJzw9JyAgICAgICAgICAoMSwgMjMpICgxLCAyNSkKKyAgICBOVU1CRVIgICAgICcweDE1JyAgICAgICAgKDEsIDI2KSAoMSwgMzApCisgICAgT1AgICAgICAgICAnPD0nICAgICAgICAgICgxLCAzMSkgKDEsIDMzKQorICAgIE5VTUJFUiAgICAgJzB4MTInICAgICAgICAoMSwgMzQpICgxLCAzOCkKKyAgICBPUCAgICAgICAgICchPScgICAgICAgICAgKDEsIDM5KSAoMSwgNDEpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA0MikgKDEsIDQzKQorICAgIE5BTUUgICAgICAgJ2FuZCcgICAgICAgICAoMSwgNDQpICgxLCA0NykKKyAgICBOVU1CRVIgICAgICc1JyAgICAgICAgICAgKDEsIDQ4KSAoMSwgNDkpCisgICAgTkFNRSAgICAgICAnaW4nICAgICAgICAgICgxLCA1MCkgKDEsIDUyKQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgNTMpICgxLCA1NCkKKyAgICBOQU1FICAgICAgICdub3QnICAgICAgICAgKDEsIDU1KSAoMSwgNTgpCisgICAgTkFNRSAgICAgICAnaW4nICAgICAgICAgICgxLCA1OSkgKDEsIDYxKQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgNjIpICgxLCA2MykKKyAgICBOQU1FICAgICAgICdpcycgICAgICAgICAgKDEsIDY0KSAoMSwgNjYpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA2NykgKDEsIDY4KQorICAgIE5BTUUgICAgICAgJ29yJyAgICAgICAgICAoMSwgNjkpICgxLCA3MSkKKyAgICBOVU1CRVIgICAgICc1JyAgICAgICAgICAgKDEsIDcyKSAoMSwgNzMpCisgICAgTkFNRSAgICAgICAnaXMnICAgICAgICAgICgxLCA3NCkgKDEsIDc2KQorICAgIE5BTUUgICAgICAgJ25vdCcgICAgICAgICAoMSwgNzcpICgxLCA4MCkKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDgxKSAoMSwgODIpCisgICAgT1AgICAgICAgICAnOicgICAgICAgICAgICgxLCA4MikgKDEsIDgzKQorICAgIE5BTUUgICAgICAgJ3Bhc3MnICAgICAgICAoMSwgODQpICgxLCA4OCkKKworU2hpZnQKKworICAgID4+PiBkdW1wX3Rva2VucygieCA9IDEgPDwgMSA+PiA1IikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA0KSAoMSwgNSkKKyAgICBPUCAgICAgICAgICc8PCcgICAgICAgICAgKDEsIDYpICgxLCA4KQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgOSkgKDEsIDEwKQorICAgIE9QICAgICAgICAgJz4+JyAgICAgICAgICAoMSwgMTEpICgxLCAxMykKKyAgICBOVU1CRVIgICAgICc1JyAgICAgICAgICAgKDEsIDE0KSAoMSwgMTUpCisKK0FkZGl0aXZlCisKKyAgICA+Pj4gZHVtcF90b2tlbnMoInggPSAxIC0geSArIDE1IC0gMDEgKyAweDEyNCArIHogKyBhWzVdIikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA0KSAoMSwgNSkKKyAgICBPUCAgICAgICAgICctJyAgICAgICAgICAgKDEsIDYpICgxLCA3KQorICAgIE5BTUUgICAgICAgJ3knICAgICAgICAgICAoMSwgOCkgKDEsIDkpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAxMCkgKDEsIDExKQorICAgIE5VTUJFUiAgICAgJzE1JyAgICAgICAgICAoMSwgMTIpICgxLCAxNCkKKyAgICBPUCAgICAgICAgICctJyAgICAgICAgICAgKDEsIDE1KSAoMSwgMTYpCisgICAgTlVNQkVSICAgICAnMDEnICAgICAgICAgICgxLCAxNykgKDEsIDE5KQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMjApICgxLCAyMSkKKyAgICBOVU1CRVIgICAgICcweDEyNCcgICAgICAgKDEsIDIyKSAoMSwgMjcpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAyOCkgKDEsIDI5KQorICAgIE5BTUUgICAgICAgJ3onICAgICAgICAgICAoMSwgMzApICgxLCAzMSkKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDMyKSAoMSwgMzMpCisgICAgTkFNRSAgICAgICAnYScgICAgICAgICAgICgxLCAzNCkgKDEsIDM1KQorICAgIE9QICAgICAgICAgJ1snICAgICAgICAgICAoMSwgMzUpICgxLCAzNikKKyAgICBOVU1CRVIgICAgICc1JyAgICAgICAgICAgKDEsIDM2KSAoMSwgMzcpCisgICAgT1AgICAgICAgICAnXScgICAgICAgICAgICgxLCAzNykgKDEsIDM4KQorCitNdWx0aXBsaWNhdGl2ZQorCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gMS8vMSoxLzUqMTIlMHgxMiIpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgNCkgKDEsIDUpCisgICAgT1AgICAgICAgICAnLy8nICAgICAgICAgICgxLCA1KSAoMSwgNykKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDcpICgxLCA4KQorICAgIE9QICAgICAgICAgJyonICAgICAgICAgICAoMSwgOCkgKDEsIDkpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA5KSAoMSwgMTApCisgICAgT1AgICAgICAgICAnLycgICAgICAgICAgICgxLCAxMCkgKDEsIDExKQorICAgIE5VTUJFUiAgICAgJzUnICAgICAgICAgICAoMSwgMTEpICgxLCAxMikKKyAgICBPUCAgICAgICAgICcqJyAgICAgICAgICAgKDEsIDEyKSAoMSwgMTMpCisgICAgTlVNQkVSICAgICAnMTInICAgICAgICAgICgxLCAxMykgKDEsIDE1KQorICAgIE9QICAgICAgICAgJyUnICAgICAgICAgICAoMSwgMTUpICgxLCAxNikKKyAgICBOVU1CRVIgICAgICcweDEyJyAgICAgICAgKDEsIDE2KSAoMSwgMjApCisKK1VuYXJ5CisKKyAgICA+Pj4gZHVtcF90b2tlbnMoIn4xIF4gMSAmIDEgfDEgXiAtMSIpCisgICAgT1AgICAgICAgICAnficgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDEpICgxLCAyKQorICAgIE9QICAgICAgICAgJ14nICAgICAgICAgICAoMSwgMykgKDEsIDQpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA1KSAoMSwgNikKKyAgICBPUCAgICAgICAgICcmJyAgICAgICAgICAgKDEsIDcpICgxLCA4KQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgOSkgKDEsIDEwKQorICAgIE9QICAgICAgICAgJ3wnICAgICAgICAgICAoMSwgMTEpICgxLCAxMikKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDEyKSAoMSwgMTMpCisgICAgT1AgICAgICAgICAnXicgICAgICAgICAgICgxLCAxNCkgKDEsIDE1KQorICAgIE9QICAgICAgICAgJy0nICAgICAgICAgICAoMSwgMTYpICgxLCAxNykKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDE3KSAoMSwgMTgpCisgICAgPj4+IGR1bXBfdG9rZW5zKCItMSoxLzErMSoxLy8xIC0gLS0tMSoqMSIpCisgICAgT1AgICAgICAgICAnLScgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDEpICgxLCAyKQorICAgIE9QICAgICAgICAgJyonICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCAzKSAoMSwgNCkKKyAgICBPUCAgICAgICAgICcvJyAgICAgICAgICAgKDEsIDQpICgxLCA1KQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgNSkgKDEsIDYpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCA2KSAoMSwgNykKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDcpICgxLCA4KQorICAgIE9QICAgICAgICAgJyonICAgICAgICAgICAoMSwgOCkgKDEsIDkpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA5KSAoMSwgMTApCisgICAgT1AgICAgICAgICAnLy8nICAgICAgICAgICgxLCAxMCkgKDEsIDEyKQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgMTIpICgxLCAxMykKKyAgICBPUCAgICAgICAgICctJyAgICAgICAgICAgKDEsIDE0KSAoMSwgMTUpCisgICAgT1AgICAgICAgICAnLScgICAgICAgICAgICgxLCAxNikgKDEsIDE3KQorICAgIE9QICAgICAgICAgJy0nICAgICAgICAgICAoMSwgMTcpICgxLCAxOCkKKyAgICBPUCAgICAgICAgICctJyAgICAgICAgICAgKDEsIDE4KSAoMSwgMTkpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCAxOSkgKDEsIDIwKQorICAgIE9QICAgICAgICAgJyoqJyAgICAgICAgICAoMSwgMjApICgxLCAyMikKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDIyKSAoMSwgMjMpCisKK1NlbGVjdG9yCisKKyAgICA+Pj4gZHVtcF90b2tlbnMoImltcG9ydCBzeXMsIHRpbWVcXG54ID0gc3lzLm1vZHVsZXNbJ3RpbWUnXS50aW1lKCkiKQorICAgIE5BTUUgICAgICAgJ2ltcG9ydCcgICAgICAoMSwgMCkgKDEsIDYpCisgICAgTkFNRSAgICAgICAnc3lzJyAgICAgICAgICgxLCA3KSAoMSwgMTApCisgICAgT1AgICAgICAgICAnLCcgICAgICAgICAgICgxLCAxMCkgKDEsIDExKQorICAgIE5BTUUgICAgICAgJ3RpbWUnICAgICAgICAoMSwgMTIpICgxLCAxNikKKyAgICBORVdMSU5FICAgICdcXG4nICAgICAgICAgICgxLCAxNikgKDEsIDE3KQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMiwgMCkgKDIsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgyLCAyKSAoMiwgMykKKyAgICBOQU1FICAgICAgICdzeXMnICAgICAgICAgKDIsIDQpICgyLCA3KQorICAgIE9QICAgICAgICAgJy4nICAgICAgICAgICAoMiwgNykgKDIsIDgpCisgICAgTkFNRSAgICAgICAnbW9kdWxlcycgICAgICgyLCA4KSAoMiwgMTUpCisgICAgT1AgICAgICAgICAnWycgICAgICAgICAgICgyLCAxNSkgKDIsIDE2KQorICAgIFNUUklORyAgICAgIid0aW1lJyIgICAgICAoMiwgMTYpICgyLCAyMikKKyAgICBPUCAgICAgICAgICddJyAgICAgICAgICAgKDIsIDIyKSAoMiwgMjMpCisgICAgT1AgICAgICAgICAnLicgICAgICAgICAgICgyLCAyMykgKDIsIDI0KQorICAgIE5BTUUgICAgICAgJ3RpbWUnICAgICAgICAoMiwgMjQpICgyLCAyOCkKKyAgICBPUCAgICAgICAgICcoJyAgICAgICAgICAgKDIsIDI4KSAoMiwgMjkpCisgICAgT1AgICAgICAgICAnKScgICAgICAgICAgICgyLCAyOSkgKDIsIDMwKQorCitNZXRob2RzCisKKyAgICA+Pj4gZHVtcF90b2tlbnMoIkBzdGF0aWNtZXRob2RcXG5kZWYgZm9vKHgseSk6IHBhc3MiKQorICAgIE9QICAgICAgICAgJ0AnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgTkFNRSAgICAgICAnc3RhdGljbWV0aG9kICgxLCAxKSAoMSwgMTMpCisgICAgTkVXTElORSAgICAnXFxuJyAgICAgICAgICAoMSwgMTMpICgxLCAxNCkKKyAgICBOQU1FICAgICAgICdkZWYnICAgICAgICAgKDIsIDApICgyLCAzKQorICAgIE5BTUUgICAgICAgJ2ZvbycgICAgICAgICAoMiwgNCkgKDIsIDcpCisgICAgT1AgICAgICAgICAnKCcgICAgICAgICAgICgyLCA3KSAoMiwgOCkKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDIsIDgpICgyLCA5KQorICAgIE9QICAgICAgICAgJywnICAgICAgICAgICAoMiwgOSkgKDIsIDEwKQorICAgIE5BTUUgICAgICAgJ3knICAgICAgICAgICAoMiwgMTApICgyLCAxMSkKKyAgICBPUCAgICAgICAgICcpJyAgICAgICAgICAgKDIsIDExKSAoMiwgMTIpCisgICAgT1AgICAgICAgICAnOicgICAgICAgICAgICgyLCAxMikgKDIsIDEzKQorICAgIE5BTUUgICAgICAgJ3Bhc3MnICAgICAgICAoMiwgMTQpICgyLCAxOCkKKworQmFja3NsYXNoIG1lYW5zIGxpbmUgY29udGludWF0aW9uLCBleGNlcHQgZm9yIGNvbW1lbnRzCisKKyAgICA+Pj4gcm91bmR0cmlwKCJ4PTErXFxcXG4iCisgICAgLi4uICAgICAgICAgICAiMVxcbiIKKyAgICAuLi4gICAgICAgICAgICIjIFRoaXMgaXMgYSBjb21tZW50XFxcXG4iCisgICAgLi4uICAgICAgICAgICAiIyBUaGlzIGFsc29cXG4iKQorICAgIFRydWUKKyAgICA+Pj4gcm91bmR0cmlwKCIjIENvbW1lbnQgXFxcXG54ID0gMCIpCisgICAgVHJ1ZQorCitUd28gc3RyaW5nIGxpdGVyYWxzIG9uIHRoZSBzYW1lIGxpbmUKKworICAgID4+PiByb3VuZHRyaXAoIicnICcnIikKKyAgICBUcnVlCisKK1Rlc3Qgcm91bmR0cmlwIG9uIHJhbmRvbSBweXRob24gbW9kdWxlcy4KK3Bhc3MgdGhlICctdWNwdScgb3B0aW9uIHRvIHByb2Nlc3MgdGhlIGZ1bGwgZGlyZWN0b3J5LgorCisgICAgPj4+CisgICAgPj4+IHRlbXBkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZikgb3Igb3MuY3VyZGlyCisgICAgPj4+IHRlc3RmaWxlcyA9IGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4odGVtcGRpciwgInRlc3QqLnB5IikpCisKKyAgICA+Pj4gaWYgbm90IHRlc3Rfc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCJjcHUiKToKKyAgICAuLi4gICAgIHRlc3RmaWxlcyA9IHJhbmRvbS5zYW1wbGUodGVzdGZpbGVzLCAxMCkKKyAgICAuLi4KKyAgICA+Pj4gZm9yIHRlc3RmaWxlIGluIHRlc3RmaWxlczoKKyAgICAuLi4gICAgIGlmIG5vdCByb3VuZHRyaXAob3Blbih0ZXN0ZmlsZSkpOgorICAgIC4uLiAgICAgICAgIHByaW50ICJSb3VuZHRyaXAgZmFpbGVkIGZvciBmaWxlICVzIiAlIHRlc3RmaWxlCisgICAgLi4uICAgICAgICAgYnJlYWsKKyAgICAuLi4gZWxzZTogVHJ1ZQorICAgIFRydWUKKworRXZpbCB0YWJzCisgICAgPj4+IGR1bXBfdG9rZW5zKCJkZWYgZigpOlxcblxcdGlmIHhcXG4gICAgICAgIFxcdHBhc3MiKQorICAgIE5BTUUgICAgICAgJ2RlZicgICAgICAgICAoMSwgMCkgKDEsIDMpCisgICAgTkFNRSAgICAgICAnZicgICAgICAgICAgICgxLCA0KSAoMSwgNSkKKyAgICBPUCAgICAgICAgICcoJyAgICAgICAgICAgKDEsIDUpICgxLCA2KQorICAgIE9QICAgICAgICAgJyknICAgICAgICAgICAoMSwgNikgKDEsIDcpCisgICAgT1AgICAgICAgICAnOicgICAgICAgICAgICgxLCA3KSAoMSwgOCkKKyAgICBORVdMSU5FICAgICdcXG4nICAgICAgICAgICgxLCA4KSAoMSwgOSkKKyAgICBJTkRFTlQgICAgICdcXHQnICAgICAgICAgICgyLCAwKSAoMiwgMSkKKyAgICBOQU1FICAgICAgICdpZicgICAgICAgICAgKDIsIDEpICgyLCAzKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMiwgNCkgKDIsIDUpCisgICAgTkVXTElORSAgICAnXFxuJyAgICAgICAgICAoMiwgNSkgKDIsIDYpCisgICAgSU5ERU5UICAgICAnICAgICAgICBcXHQnICAoMywgMCkgKDMsIDkpCisgICAgTkFNRSAgICAgICAncGFzcycgICAgICAgICgzLCA5KSAoMywgMTMpCisgICAgREVERU5UICAgICAnJyAgICAgICAgICAgICg0LCAwKSAoNCwgMCkKKyAgICBERURFTlQgICAgICcnICAgICAgICAgICAgKDQsIDApICg0LCAwKQorCitQYXRob2xvZ2ljYWwgd2hpdGVzcGFjZSAoaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE2MTUyKQorICAgID4+PiBkdW1wX3Rva2VucygiQCAgICAgICAgICAiKQorICAgIE9QICAgICAgICAgJ0AnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisiIiIKKworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0b2tlbml6ZSBpbXBvcnQgKHVudG9rZW5pemUsIGdlbmVyYXRlX3Rva2VucywgTlVNQkVSLCBOQU1FLCBPUCwKKyAgICAgICAgICAgICAgICAgICAgIFNUUklORywgRU5ETUFSS0VSLCB0b2tfbmFtZSkKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgb3MKKworZGVmIGR1bXBfdG9rZW5zKHMpOgorICAgICIiIlByaW50IG91dCB0aGUgdG9rZW5zIGluIHMgaW4gYSB0YWJsZSBmb3JtYXQuCisKKyAgICBUaGUgRU5ETUFSS0VSIGlzIG9taXR0ZWQuCisgICAgIiIiCisgICAgZiA9IFN0cmluZ0lPKHMpCisgICAgZm9yIHR5cGUsIHRva2VuLCBzdGFydCwgZW5kLCBsaW5lIGluIGdlbmVyYXRlX3Rva2VucyhmLnJlYWRsaW5lKToKKyAgICAgICAgaWYgdHlwZSA9PSBFTkRNQVJLRVI6CisgICAgICAgICAgICBicmVhaworICAgICAgICB0eXBlID0gdG9rX25hbWVbdHlwZV0KKyAgICAgICAgcHJpbnQoIiUodHlwZSktMTAuMTBzICUodG9rZW4pLTEzLjEzciAlKHN0YXJ0KXMgJShlbmQpcyIgJSBsb2NhbHMoKSkKKworIyBUaGlzIGlzIGFuIGV4YW1wbGUgZnJvbSB0aGUgZG9jcywgc2V0IHVwIGFzIGEgZG9jdGVzdC4KK2RlZiBkZWNpc3RtdChzKToKKyAgICAiIiJTdWJzdGl0dXRlIERlY2ltYWxzIGZvciBmbG9hdHMgaW4gYSBzdHJpbmcgb2Ygc3RhdGVtZW50cy4KKworICAgID4+PiBmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKKyAgICA+Pj4gcyA9ICdwcmludCArMjEuM2UtNSotLjEyMzQvODEuNycKKyAgICA+Pj4gZGVjaXN0bXQocykKKyAgICAicHJpbnQgK0RlY2ltYWwgKCcyMS4zZS01JykqLURlY2ltYWwgKCcuMTIzNCcpL0RlY2ltYWwgKCc4MS43JykiCisKKyAgICBUaGUgZm9ybWF0IG9mIHRoZSBleHBvbmVudCBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgcGxhdGZvcm0gQyBsaWJyYXJ5LgorICAgIEtub3duIGNhc2VzIGFyZSAiZS0wMDciIChXaW5kb3dzKSBhbmQgImUtMDciIChub3QgV2luZG93cykuICBTaW5jZQorICAgIHdlJ3JlIG9ubHkgc2hvd2luZyAxMiBkaWdpdHMsIGFuZCB0aGUgMTN0aCBpc24ndCBjbG9zZSB0byA1LCB0aGUKKyAgICByZXN0IG9mIHRoZSBvdXRwdXQgc2hvdWxkIGJlIHBsYXRmb3JtLWluZGVwZW5kZW50LgorCisgICAgPj4+IGV4ZWMocykgI2RvY3Rlc3Q6ICtFTExJUFNJUworICAgIC0zLjIxNzE2MDM0MjcyZS0wLi4uNworCisgICAgT3V0cHV0IGZyb20gY2FsY3VsYXRpb25zIHdpdGggRGVjaW1hbCBzaG91bGQgYmUgaWRlbnRpY2FsIGFjcm9zcyBhbGwKKyAgICBwbGF0Zm9ybXMuCisKKyAgICA+Pj4gZXhlYyhkZWNpc3RtdChzKSkKKyAgICAtMy4yMTcxNjAzNDI3MTcyNTgyNjE5MzM5MDQ1MjlFLTcKKyAgICAiIiIKKworICAgIHJlc3VsdCA9IFtdCisgICAgZyA9IGdlbmVyYXRlX3Rva2VucyhTdHJpbmdJTyhzKS5yZWFkbGluZSkgICAjIHRva2VuaXplIHRoZSBzdHJpbmcKKyAgICBmb3IgdG9rbnVtLCB0b2t2YWwsIF8sIF8sIF8gIGluIGc6CisgICAgICAgIGlmIHRva251bSA9PSBOVU1CRVIgYW5kICcuJyBpbiB0b2t2YWw6ICAjIHJlcGxhY2UgTlVNQkVSIHRva2VucworICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChbCisgICAgICAgICAgICAgICAgKE5BTUUsICdEZWNpbWFsJyksCisgICAgICAgICAgICAgICAgKE9QLCAnKCcpLAorICAgICAgICAgICAgICAgIChTVFJJTkcsIHJlcHIodG9rdmFsKSksCisgICAgICAgICAgICAgICAgKE9QLCAnKScpCisgICAgICAgICAgICBdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgodG9rbnVtLCB0b2t2YWwpKQorICAgIHJldHVybiB1bnRva2VuaXplKHJlc3VsdCkKKworCitfX3Rlc3RfXyA9IHsiZG9jdGVzdHMiIDogZG9jdGVzdHMsICdkZWNpc3RtdCc6IGRlY2lzdG10fQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfdG9rZW5pemUKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF90b2tlbml6ZSwgVHJ1ZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9rZW5pemUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9rZW5pemUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjM4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90b2tlbml6ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9rZW5pemUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9rZW5pemUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjM4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90b2tlbml6ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9vbHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90b29scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjBiNGM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9vbHMucHkKQEAgLTAsMCArMSwzNjggQEAKKyIiIlRlc3RzIGZvciBzY3JpcHRzIGluIHRoZSBUb29scyBkaXJlY3RvcnkuCisKK1RoaXMgZmlsZSBjb250YWlucyByZWdyZXNzaW9uIHRlc3RzIGZvciBzb21lIG9mIHRoZSBzY3JpcHRzIGZvdW5kIGluIHRoZQorVG9vbHMgZGlyZWN0b3J5IG9mIGEgUHl0aG9uIGNoZWNrb3V0IG9yIHRhcmJhbGwsIHN1Y2ggYXMgcmVpbmRlbnQucHkuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzY29uZmlnCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0ZXh0d3JhcAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCBhc3NlcnRfcHl0aG9uX29rLCB0ZW1wX2RpcgorCitpZiBub3Qgc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpOgorICAgICMgWFhYIHNvbWUgaW5zdGFsbGVycyBkbyBjb250YWluIHRoZSB0b29scywgc2hvdWxkIHdlIGRldGVjdCB0aGF0CisgICAgIyBhbmQgcnVuIHRoZSB0ZXN0cyBpbiB0aGF0IGNhc2UgdG9vPworICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCd0ZXN0IGlycmVsZXZhbnQgZm9yIGFuIGluc3RhbGxlZCBQeXRob24nKQorCitiYXNlcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdUb29scycpCitzY3JpcHRzZGlyID0gb3MucGF0aC5qb2luKGJhc2VwYXRoLCAnc2NyaXB0cycpCisKKworY2xhc3MgUmVpbmRlbnRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKHNjcmlwdHNkaXIsICdyZWluZGVudC5weScpCisKKyAgICBkZWYgdGVzdF9ub2FyZ3Moc2VsZik6CisgICAgICAgIGFzc2VydF9weXRob25fb2soc2VsZi5zY3JpcHQpCisKKyAgICBkZWYgdGVzdF9oZWxwKHNlbGYpOgorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKHNlbGYuc2NyaXB0LCAnLWgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgYicnKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoZXJyLCBiJycpCisKKworY2xhc3MgUGluZGVudFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBzY3JpcHQgPSBvcy5wYXRoLmpvaW4oc2NyaXB0c2RpciwgJ3BpbmRlbnQucHknKQorCisgICAgZGVmIGFzc2VydEZpbGVFcXVhbChzZWxmLCBmbjEsIGZuMik6CisgICAgICAgIHdpdGggb3BlbihmbjEpIGFzIGYxLCBvcGVuKGZuMikgYXMgZjI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYxLnJlYWRsaW5lcygpLCBmMi5yZWFkbGluZXMoKSkKKworICAgIGRlZiBwaW5kZW50KHNlbGYsIHNvdXJjZSwgKmFyZ3MpOgorICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbigKKyAgICAgICAgICAgICAgICAoc3lzLmV4ZWN1dGFibGUsIHNlbGYuc2NyaXB0KSArIGFyZ3MsCisgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlKQorICAgICAgICBvdXQsIGVyciA9IHByb2MuY29tbXVuaWNhdGUoc291cmNlKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShlcnIpCisgICAgICAgIHJldHVybiBvdXQKKworICAgIGRlZiBsc3RyaXBsaW5lcyhzZWxmLCBkYXRhKToKKyAgICAgICAgcmV0dXJuICdcbicuam9pbihsaW5lLmxzdHJpcCgpIGZvciBsaW5lIGluIGRhdGEuc3BsaXRsaW5lcygpKSArICdcbicKKworICAgIGRlZiB0ZXN0X3NlbGZ0ZXN0KHNlbGYpOgorICAgICAgICBzZWxmLm1heERpZmYgPSBOb25lCisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBkaXJlY3Rvcnk6CisgICAgICAgICAgICBkYXRhX3BhdGggPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCAnX3Rlc3QucHknKQorICAgICAgICAgICAgd2l0aCBvcGVuKHNlbGYuc2NyaXB0KSBhcyBmOgorICAgICAgICAgICAgICAgIGNsb3NlZCA9IGYucmVhZCgpCisgICAgICAgICAgICB3aXRoIG9wZW4oZGF0YV9wYXRoLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZShjbG9zZWQpCisKKyAgICAgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soc2VsZi5zY3JpcHQsICctZCcsIGRhdGFfcGF0aCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LCBiJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgYicnKQorICAgICAgICAgICAgYmFja3VwID0gZGF0YV9wYXRoICsgJ34nCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoYmFja3VwKSkKKyAgICAgICAgICAgIHdpdGggb3BlbihiYWNrdXApIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgY2xvc2VkKQorICAgICAgICAgICAgd2l0aCBvcGVuKGRhdGFfcGF0aCkgYXMgZjoKKyAgICAgICAgICAgICAgICBjbGVhbiA9IGYucmVhZCgpCisgICAgICAgICAgICBjb21waWxlKGNsZWFuLCAnX3Rlc3QucHknLCAnZXhlYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChjbGVhbiwgJy1jJyksIGNsb3NlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5waW5kZW50KGNsb3NlZCwgJy1kJyksIGNsZWFuKQorCisgICAgICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKHNlbGYuc2NyaXB0LCAnLWMnLCBkYXRhX3BhdGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgYicnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIsIGInJykKKyAgICAgICAgICAgIHdpdGggb3BlbihiYWNrdXApIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgY2xlYW4pCisgICAgICAgICAgICB3aXRoIG9wZW4oZGF0YV9wYXRoKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGNsb3NlZCkKKworICAgICAgICAgICAgYnJva2VuID0gc2VsZi5sc3RyaXBsaW5lcyhjbG9zZWQpCisgICAgICAgICAgICB3aXRoIG9wZW4oZGF0YV9wYXRoLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZShicm9rZW4pCisgICAgICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKHNlbGYuc2NyaXB0LCAnLXInLCBkYXRhX3BhdGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgYicnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIsIGInJykKKyAgICAgICAgICAgIHdpdGggb3BlbihiYWNrdXApIGFzIGY6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYnJva2VuKQorICAgICAgICAgICAgd2l0aCBvcGVuKGRhdGFfcGF0aCkgYXMgZjoKKyAgICAgICAgICAgICAgICBpbmRlbnRlZCA9IGYucmVhZCgpCisgICAgICAgICAgICBjb21waWxlKGluZGVudGVkLCAnX3Rlc3QucHknLCAnZXhlYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChicm9rZW4sICctcicpLCBpbmRlbnRlZCkKKworICAgIGRlZiBwaW5kZW50X3Rlc3Qoc2VsZiwgY2xlYW4sIGNsb3NlZCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5waW5kZW50KGNsZWFuLCAnLWMnKSwgY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChjbG9zZWQsICctZCcpLCBjbGVhbikKKyAgICAgICAgYnJva2VuID0gc2VsZi5sc3RyaXBsaW5lcyhjbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5waW5kZW50KGJyb2tlbiwgJy1yJywgJy1lJywgJy1zJywgJzQnKSwgY2xvc2VkKQorCisgICAgZGVmIHRlc3Rfc3RhdGVtZW50cyhzZWxmKToKKyAgICAgICAgY2xlYW4gPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgd2hpbGUgYToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICB3aGlsZSBhOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZm9yIGkgaW4gYToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBmb3IgaSBpbiBhOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHdpdGggYToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIikKKworICAgICAgICBjbG9zZWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIGVuZCBpZgorCisgICAgICAgICAgICBpZiBhOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgaWYKKworICAgICAgICAgICAgaWYgYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgaWYKKworICAgICAgICAgICAgd2hpbGUgYToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIyBlbmQgd2hpbGUKKworICAgICAgICAgICAgd2hpbGUgYToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIGVuZCB3aGlsZQorCisgICAgICAgICAgICBmb3IgaSBpbiBhOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAjIGVuZCBmb3IKKworICAgICAgICAgICAgZm9yIGkgaW4gYToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIGVuZCBmb3IKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgdHJ5CisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgdHJ5CisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgdHJ5CisKKyAgICAgICAgICAgIHdpdGggYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIGVuZCB3aXRoCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgY2xhc3MgQQorCisgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgZW5kIGRlZiBmCisgICAgICAgICAgICAiIiIpCisgICAgICAgIHNlbGYucGluZGVudF90ZXN0KGNsZWFuLCBjbG9zZWQpCisKKyAgICBkZWYgdGVzdF9tdWx0aWxldmVsKHNlbGYpOgorICAgICAgICBjbGVhbiA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBkZWYgZm9vYmFyKGEsIGIpOgorICAgICAgICAgICAgICAgIGlmIGEgPT0gYjoKKyAgICAgICAgICAgICAgICAgICAgYSA9IGErMQorICAgICAgICAgICAgICAgIGVsaWYgYSA8IGI6CisgICAgICAgICAgICAgICAgICAgIGIgPSBiLTEKKyAgICAgICAgICAgICAgICAgICAgaWYgYiA+IGE6IGEgPSBhLTEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnb29wcyEnCisgICAgICAgICAgICAiIiIpCisgICAgICAgIGNsb3NlZCA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBkZWYgZm9vYmFyKGEsIGIpOgorICAgICAgICAgICAgICAgIGlmIGEgPT0gYjoKKyAgICAgICAgICAgICAgICAgICAgYSA9IGErMQorICAgICAgICAgICAgICAgIGVsaWYgYSA8IGI6CisgICAgICAgICAgICAgICAgICAgIGIgPSBiLTEKKyAgICAgICAgICAgICAgICAgICAgaWYgYiA+IGE6IGEgPSBhLTEKKyAgICAgICAgICAgICAgICAgICAgIyBlbmQgaWYKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnb29wcyEnCisgICAgICAgICAgICAgICAgIyBlbmQgaWYKKyAgICAgICAgICAgICMgZW5kIGRlZiBmb29iYXIKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgc2VsZi5waW5kZW50X3Rlc3QoY2xlYW4sIGNsb3NlZCkKKworICAgIGRlZiB0ZXN0X3ByZXNlcnZlX2luZGVudHMoc2VsZik6CisgICAgICAgIGNsZWFuID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICAgICAgICAgICBpZiBiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiKQorICAgICAgICBjbG9zZWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYToKKyAgICAgICAgICAgICAgICAgICAgIGlmIGI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICAjIGVuZCBpZgorICAgICAgICAgICAgIyBlbmQgaWYKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoY2xlYW4sICctYycpLCBjbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5waW5kZW50KGNsb3NlZCwgJy1kJyksIGNsZWFuKQorICAgICAgICBicm9rZW4gPSBzZWxmLmxzdHJpcGxpbmVzKGNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoYnJva2VuLCAnLXInLCAnLWUnLCAnLXMnLCAnOScpLCBjbG9zZWQpCisgICAgICAgIGNsZWFuID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICBcdGlmIGI6CisgICAgICAgICAgICBcdFx0cGFzcworICAgICAgICAgICAgIiIiKQorICAgICAgICBjbG9zZWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYToKKyAgICAgICAgICAgIFx0aWYgYjoKKyAgICAgICAgICAgIFx0XHRwYXNzCisgICAgICAgICAgICBcdCMgZW5kIGlmCisgICAgICAgICAgICAjIGVuZCBpZgorICAgICAgICAgICAgIiIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChjbGVhbiwgJy1jJyksIGNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoY2xvc2VkLCAnLWQnKSwgY2xlYW4pCisgICAgICAgIGJyb2tlbiA9IHNlbGYubHN0cmlwbGluZXMoY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChicm9rZW4sICctcicpLCBjbG9zZWQpCisKKyAgICBkZWYgdGVzdF9lc2NhcGVkX25ld2xpbmUoc2VsZik6CisgICAgICAgIGNsZWFuID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGNsYXNzXFwKKyAgICAgICAgICAgIFxcCisgICAgICAgICAgICAgQToKKyAgICAgICAgICAgICAgIGRlZlwKKyAgICAgICAgICAgIFxcCisgICAgICAgICAgICBmOgorICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiKQorICAgICAgICBjbG9zZWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgY2xhc3NcXAorICAgICAgICAgICAgXFwKKyAgICAgICAgICAgICBBOgorICAgICAgICAgICAgICAgZGVmXAorICAgICAgICAgICAgXFwKKyAgICAgICAgICAgIGY6CisgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAjIGVuZCBkZWYgZgorICAgICAgICAgICAgIyBlbmQgY2xhc3MgQQorICAgICAgICAgICAgIiIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChjbGVhbiwgJy1jJyksIGNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoY2xvc2VkLCAnLWQnKSwgY2xlYW4pCisKKyAgICBkZWYgdGVzdF9lbXB0eV9saW5lKHNlbGYpOgorICAgICAgICBjbGVhbiA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBpZiBhOgorCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiKQorICAgICAgICBjbG9zZWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYToKKworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgZW5kIGlmCisgICAgICAgICAgICAiIiIpCisgICAgICAgIHNlbGYucGluZGVudF90ZXN0KGNsZWFuLCBjbG9zZWQpCisKKyAgICBkZWYgdGVzdF9vbmVsaW5lKHNlbGYpOgorICAgICAgICBjbGVhbiA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBpZiBhOiBwYXNzCisgICAgICAgICAgICAiIiIpCisgICAgICAgIGNsb3NlZCA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBpZiBhOiBwYXNzCisgICAgICAgICAgICAjIGVuZCBpZgorICAgICAgICAgICAgIiIiKQorICAgICAgICBzZWxmLnBpbmRlbnRfdGVzdChjbGVhbiwgY2xvc2VkKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCpbb2JqIGZvciBvYmogaW4gZ2xvYmFscygpLnZhbHVlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgdHlwZSldKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90b29scy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90b29scy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwYzQzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Rvb2xzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90b29scy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90b29scy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwYzQzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Rvb2xzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYWNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTJhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZS5weQpAQCAtMCwwICsxLDM0MSBAQAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAocnVuX3VuaXR0ZXN0LCBURVNURk4sIHJtdHJlZSwgdW5saW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVkX3N0ZG91dCkKK2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgdHJhY2UKK2Zyb20gdHJhY2UgaW1wb3J0IENvdmVyYWdlUmVzdWx0cywgVHJhY2UKKworZnJvbSB0ZXN0LnRyYWNlZG1vZHVsZXMgaW1wb3J0IHRlc3Rtb2QKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVdGlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisKK2RlZiBmaXhfZXh0X3B5KGZpbGVuYW1lKToKKyAgICAiIiJHaXZlbiBhIC5weWMvLnB5byBmaWxlbmFtZSBjb252ZXJ0cyBpdCB0byB0aGUgYXBwcm9wcmlhdGUgLnB5IiIiCisgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoKCcucHljJywgJy5weW8nKSk6CisgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi0xXQorICAgIHJldHVybiBmaWxlbmFtZQorCitkZWYgbXlfZmlsZV9hbmRfbW9kbmFtZSgpOgorICAgICIiIlRoZSAucHkgZmlsZSBhbmQgbW9kdWxlIG5hbWUgb2YgdGhpcyBmaWxlIChfX2ZpbGVfXykiIiIKKyAgICBtb2RuYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKF9fZmlsZV9fKSlbMF0KKyAgICByZXR1cm4gZml4X2V4dF9weShfX2ZpbGVfXyksIG1vZG5hbWUKKworZGVmIGdldF9maXJzdGxpbmVubyhmdW5jKToKKyAgICByZXR1cm4gZnVuYy5fX2NvZGVfXy5jb19maXJzdGxpbmVubworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGFyZ2V0IGZ1bmN0aW9ucyBmb3IgdHJhY2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisjCisjIFRoZSByZWxhdGl2ZSBsaW5lIG51bWJlcnMgb2YgbGluZXMgaW4gdGhlc2UgZnVuY3Rpb25zIG1hdHRlciBmb3IgdmVyaWZ5aW5nCisjIHRyYWNpbmcuIFBsZWFzZSBtb2RpZnkgdGhlIGFwcHJvcHJpYXRlIHRlc3RzIGlmIHlvdSBjaGFuZ2Ugb25lIG9mIHRoZQorIyBmdW5jdGlvbnMuIEFic29sdXRlIGxpbmUgbnVtYmVycyBkb24ndCBtYXR0ZXIuCisjCisKK2RlZiB0cmFjZWRfZnVuY19saW5lYXIoeCwgeSk6CisgICAgYSA9IHgKKyAgICBiID0geQorICAgIGMgPSBhICsgYgorICAgIHJldHVybiBjCisKK2RlZiB0cmFjZWRfZnVuY19sb29wKHgsIHkpOgorICAgIGMgPSB4CisgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgIGMgKz0geQorICAgIHJldHVybiBjCisKK2RlZiB0cmFjZWRfZnVuY19pbXBvcnRpbmcoeCwgeSk6CisgICAgcmV0dXJuIHggKyB5ICsgdGVzdG1vZC5mdW5jKDEpCisKK2RlZiB0cmFjZWRfZnVuY19zaW1wbGVfY2FsbGVyKHgpOgorICAgIGMgPSB0cmFjZWRfZnVuY19saW5lYXIoeCwgeCkKKyAgICByZXR1cm4gYyArIHgKKworZGVmIHRyYWNlZF9mdW5jX2ltcG9ydGluZ19jYWxsZXIoeCk6CisgICAgayA9IHRyYWNlZF9mdW5jX3NpbXBsZV9jYWxsZXIoeCkKKyAgICBrICs9IHRyYWNlZF9mdW5jX2ltcG9ydGluZyhrLCB4KQorICAgIHJldHVybiBrCisKK2RlZiB0cmFjZWRfZnVuY19nZW5lcmF0b3IobnVtKToKKyAgICBjID0gNSAgICAgICAjIGV4ZWN1dGVkIG9uY2UKKyAgICBmb3IgaSBpbiByYW5nZShudW0pOgorICAgICAgICB5aWVsZCBpICsgYworCitkZWYgdHJhY2VkX2Z1bmNfY2FsbGluZ19nZW5lcmF0b3IoKToKKyAgICBrID0gMAorICAgIGZvciBpIGluIHRyYWNlZF9mdW5jX2dlbmVyYXRvcigxMCk6CisgICAgICAgIGsgKz0gaQorCitkZWYgdHJhY2VkX2RvdWJsZXIobnVtKToKKyAgICByZXR1cm4gbnVtICogMgorCitkZWYgdHJhY2VkX2NhbGxlcl9saXN0X2NvbXByZWhlbnNpb24oKToKKyAgICBrID0gMTAKKyAgICBteWxpc3QgPSBbdHJhY2VkX2RvdWJsZXIoaSkgZm9yIGkgaW4gcmFuZ2UoayldCisgICAgcmV0dXJuIG15bGlzdAorCisKK2NsYXNzIFRyYWNlZENsYXNzKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICBzZWxmLmEgPSB4CisKKyAgICBkZWYgaW5zdF9tZXRob2RfbGluZWFyKHNlbGYsIHkpOgorICAgICAgICByZXR1cm4gc2VsZi5hICsgeQorCisgICAgZGVmIGluc3RfbWV0aG9kX2NhbGxpbmcoc2VsZiwgeCk6CisgICAgICAgIGMgPSBzZWxmLmluc3RfbWV0aG9kX2xpbmVhcih4KQorICAgICAgICByZXR1cm4gYyArIHRyYWNlZF9mdW5jX2xpbmVhcih4LCBjKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGNsYXNzX21ldGhvZF9saW5lYXIoY2xzLCB5KToKKyAgICAgICAgcmV0dXJuIHkgKiAyCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHN0YXRpY19tZXRob2RfbGluZWFyKHkpOgorICAgICAgICByZXR1cm4geSAqIDIKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRlc3QgY2FzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisKKworY2xhc3MgVGVzdExpbmVDb3VudHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIldoaXRlLWJveCB0ZXN0aW5nIG9mIGxpbmUtY291bnRpbmcsIHZpYSBydW5mdW5jIiIiCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRyYWNlciA9IFRyYWNlKGNvdW50PTEsIHRyYWNlPTAsIGNvdW50ZnVuY3M9MCwgY291bnRjYWxsZXJzPTApCisgICAgICAgIHNlbGYubXlfcHlfZmlsZW5hbWUgPSBmaXhfZXh0X3B5KF9fZmlsZV9fKQorCisgICAgZGVmIHRlc3RfdHJhY2VkX2Z1bmNfbGluZWFyKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnRyYWNlci5ydW5mdW5jKHRyYWNlZF9mdW5jX2xpbmVhciwgMiwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDcpCisKKyAgICAgICAgIyBhbGwgbGluZXMgYXJlIGV4ZWN1dGVkIG9uY2UKKyAgICAgICAgZXhwZWN0ZWQgPSB7fQorICAgICAgICBmaXJzdGxpbmVubyA9IGdldF9maXJzdGxpbmVubyh0cmFjZWRfZnVuY19saW5lYXIpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIDUpOgorICAgICAgICAgICAgZXhwZWN0ZWRbKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vICsgIGkpXSA9IDEKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHJhY2VyLnJlc3VsdHMoKS5jb3VudHMsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfdHJhY2VkX2Z1bmNfbG9vcChzZWxmKToKKyAgICAgICAgc2VsZi50cmFjZXIucnVuZnVuYyh0cmFjZWRfZnVuY19sb29wLCAyLCAzKQorCisgICAgICAgIGZpcnN0bGluZW5vID0gZ2V0X2ZpcnN0bGluZW5vKHRyYWNlZF9mdW5jX2xvb3ApCisgICAgICAgIGV4cGVjdGVkID0geworICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vICsgMSk6IDEsCisgICAgICAgICAgICAoc2VsZi5teV9weV9maWxlbmFtZSwgZmlyc3RsaW5lbm8gKyAyKTogNiwKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVubyArIDMpOiA1LAorICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vICsgNCk6IDEsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyYWNlci5yZXN1bHRzKCkuY291bnRzLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3RyYWNlZF9mdW5jX2ltcG9ydGluZyhzZWxmKToKKyAgICAgICAgc2VsZi50cmFjZXIucnVuZnVuYyh0cmFjZWRfZnVuY19pbXBvcnRpbmcsIDIsIDUpCisKKyAgICAgICAgZmlyc3RsaW5lbm8gPSBnZXRfZmlyc3RsaW5lbm8odHJhY2VkX2Z1bmNfaW1wb3J0aW5nKQorICAgICAgICBleHBlY3RlZCA9IHsKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVubyArIDEpOiAxLAorICAgICAgICAgICAgKGZpeF9leHRfcHkodGVzdG1vZC5fX2ZpbGVfXyksIDIpOiAxLAorICAgICAgICAgICAgKGZpeF9leHRfcHkodGVzdG1vZC5fX2ZpbGVfXyksIDMpOiAxLAorICAgICAgICB9CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyYWNlci5yZXN1bHRzKCkuY291bnRzLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3RyYWNlX2Z1bmNfZ2VuZXJhdG9yKHNlbGYpOgorICAgICAgICBzZWxmLnRyYWNlci5ydW5mdW5jKHRyYWNlZF9mdW5jX2NhbGxpbmdfZ2VuZXJhdG9yKQorCisgICAgICAgIGZpcnN0bGluZW5vX2NhbGxpbmcgPSBnZXRfZmlyc3RsaW5lbm8odHJhY2VkX2Z1bmNfY2FsbGluZ19nZW5lcmF0b3IpCisgICAgICAgIGZpcnN0bGluZW5vX2dlbiA9IGdldF9maXJzdGxpbmVubyh0cmFjZWRfZnVuY19nZW5lcmF0b3IpCisgICAgICAgIGV4cGVjdGVkID0geworICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vX2NhbGxpbmcgKyAxKTogMSwKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVub19jYWxsaW5nICsgMik6IDExLAorICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vX2NhbGxpbmcgKyAzKTogMTAsCisgICAgICAgICAgICAoc2VsZi5teV9weV9maWxlbmFtZSwgZmlyc3RsaW5lbm9fZ2VuICsgMSk6IDEsCisgICAgICAgICAgICAoc2VsZi5teV9weV9maWxlbmFtZSwgZmlyc3RsaW5lbm9fZ2VuICsgMik6IDExLAorICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vX2dlbiArIDMpOiAxMCwKKyAgICAgICAgfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHJhY2VyLnJlc3VsdHMoKS5jb3VudHMsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfdHJhY2VfbGlzdF9jb21wcmVoZW5zaW9uKHNlbGYpOgorICAgICAgICBzZWxmLnRyYWNlci5ydW5mdW5jKHRyYWNlZF9jYWxsZXJfbGlzdF9jb21wcmVoZW5zaW9uKQorCisgICAgICAgIGZpcnN0bGluZW5vX2NhbGxpbmcgPSBnZXRfZmlyc3RsaW5lbm8odHJhY2VkX2NhbGxlcl9saXN0X2NvbXByZWhlbnNpb24pCisgICAgICAgIGZpcnN0bGluZW5vX2NhbGxlZCA9IGdldF9maXJzdGxpbmVubyh0cmFjZWRfZG91YmxlcikKKyAgICAgICAgZXhwZWN0ZWQgPSB7CisgICAgICAgICAgICAoc2VsZi5teV9weV9maWxlbmFtZSwgZmlyc3RsaW5lbm9fY2FsbGluZyArIDEpOiAxLAorICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vX2NhbGxpbmcgKyAyKTogMTEsCisgICAgICAgICAgICAoc2VsZi5teV9weV9maWxlbmFtZSwgZmlyc3RsaW5lbm9fY2FsbGluZyArIDMpOiAxLAorICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vX2NhbGxlZCArIDEpOiAxMCwKKyAgICAgICAgfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHJhY2VyLnJlc3VsdHMoKS5jb3VudHMsIGV4cGVjdGVkKQorCisKKyAgICBkZWYgdGVzdF9saW5lYXJfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgIyBYWFggdG9kbzogbGF0ZXIgYWRkICdzdGF0aWNfbWV0aG9kX2xpbmVhcicgYW5kICdjbGFzc19tZXRob2RfbGluZWFyJworICAgICAgICAjIGhlcmUsIG9uY2UgaXNzdWUxNzY0Mjg2IGlzIHJlc29sdmVkCisgICAgICAgICMKKyAgICAgICAgZm9yIG1ldGhuYW1lIGluIFsnaW5zdF9tZXRob2RfbGluZWFyJyxdOgorICAgICAgICAgICAgdHJhY2VyID0gVHJhY2UoY291bnQ9MSwgdHJhY2U9MCwgY291bnRmdW5jcz0wLCBjb3VudGNhbGxlcnM9MCkKKyAgICAgICAgICAgIHRyYWNlZF9vYmogPSBUcmFjZWRDbGFzcygyNSkKKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIodHJhY2VkX29iaiwgbWV0aG5hbWUpCisgICAgICAgICAgICB0cmFjZXIucnVuZnVuYyhtZXRob2QsIDIwKQorCisgICAgICAgICAgICBmaXJzdGxpbmVubyA9IGdldF9maXJzdGxpbmVubyhtZXRob2QpCisgICAgICAgICAgICBleHBlY3RlZCA9IHsKKyAgICAgICAgICAgICAgICAoc2VsZi5teV9weV9maWxlbmFtZSwgZmlyc3RsaW5lbm8gKyAxKTogMSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2VyLnJlc3VsdHMoKS5jb3VudHMsIGV4cGVjdGVkKQorCitjbGFzcyBUZXN0UnVuRXhlY0NvdW50cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiQSBzaW1wbGUgc2FuaXR5IHRlc3Qgb2YgbGluZS1jb3VudGluZywgdmlhIHJ1bmN0eCAoZXhlYykiIiIKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubXlfcHlfZmlsZW5hbWUgPSBmaXhfZXh0X3B5KF9fZmlsZV9fKQorCisgICAgZGVmIHRlc3RfZXhlY19jb3VudHMoc2VsZik6CisgICAgICAgIHNlbGYudHJhY2VyID0gVHJhY2UoY291bnQ9MSwgdHJhY2U9MCwgY291bnRmdW5jcz0wLCBjb3VudGNhbGxlcnM9MCkKKyAgICAgICAgY29kZSA9IHInJyd0cmFjZWRfZnVuY19sb29wKDIsIDUpJycnCisgICAgICAgIGNvZGUgPSBjb21waWxlKGNvZGUsIF9fZmlsZV9fLCAnZXhlYycpCisgICAgICAgIHNlbGYudHJhY2VyLnJ1bmN0eChjb2RlLCBnbG9iYWxzKCksIHZhcnMoKSkKKworICAgICAgICBmaXJzdGxpbmVubyA9IGdldF9maXJzdGxpbmVubyh0cmFjZWRfZnVuY19sb29wKQorICAgICAgICBleHBlY3RlZCA9IHsKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVubyArIDEpOiAxLAorICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vICsgMik6IDYsCisgICAgICAgICAgICAoc2VsZi5teV9weV9maWxlbmFtZSwgZmlyc3RsaW5lbm8gKyAzKTogNSwKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVubyArIDQpOiAxLAorICAgICAgICB9CisKKyAgICAgICAgIyBXaGVuIHVzZWQgdGhyb3VnaCAncnVuJywgc29tZSBvdGhlciBzcHVyaW91cyBjb3VudHMgYXJlIHByb2R1Y2VkLCBsaWtlCisgICAgICAgICMgdGhlIHNldHRyYWNlIG9mIHRocmVhZGluZywgd2hpY2ggd2UgaWdub3JlLCBqdXN0IG1ha2luZyBzdXJlIHRoYXQgdGhlCisgICAgICAgICMgY291bnRzIGZvIHRyYWNlZF9mdW5jX2xvb3Agd2VyZSByaWdodC4KKyAgICAgICAgIworICAgICAgICBmb3IgayBpbiBleHBlY3RlZC5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHJhY2VyLnJlc3VsdHMoKS5jb3VudHNba10sIGV4cGVjdGVkW2tdKQorCisKK2NsYXNzIFRlc3RGdW5jcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiV2hpdGUtYm94IHRlc3Rpbmcgb2YgZnVuY3MgdHJhY2luZyIiIgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50cmFjZXIgPSBUcmFjZShjb3VudD0wLCB0cmFjZT0wLCBjb3VudGZ1bmNzPTEpCisgICAgICAgIHNlbGYuZmlsZW1vZCA9IG15X2ZpbGVfYW5kX21vZG5hbWUoKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX2NhbGxlcihzZWxmKToKKyAgICAgICAgc2VsZi50cmFjZXIucnVuZnVuYyh0cmFjZWRfZnVuY19zaW1wbGVfY2FsbGVyLCAxKQorCisgICAgICAgIGV4cGVjdGVkID0geworICAgICAgICAgICAgc2VsZi5maWxlbW9kICsgKCd0cmFjZWRfZnVuY19zaW1wbGVfY2FsbGVyJywpOiAxLAorICAgICAgICAgICAgc2VsZi5maWxlbW9kICsgKCd0cmFjZWRfZnVuY19saW5lYXInLCk6IDEsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyYWNlci5yZXN1bHRzKCkuY2FsbGVkZnVuY3MsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfbG9vcF9jYWxsZXJfaW1wb3J0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLnRyYWNlci5ydW5mdW5jKHRyYWNlZF9mdW5jX2ltcG9ydGluZ19jYWxsZXIsIDEpCisKKyAgICAgICAgZXhwZWN0ZWQgPSB7CisgICAgICAgICAgICBzZWxmLmZpbGVtb2QgKyAoJ3RyYWNlZF9mdW5jX3NpbXBsZV9jYWxsZXInLCk6IDEsCisgICAgICAgICAgICBzZWxmLmZpbGVtb2QgKyAoJ3RyYWNlZF9mdW5jX2xpbmVhcicsKTogMSwKKyAgICAgICAgICAgIHNlbGYuZmlsZW1vZCArICgndHJhY2VkX2Z1bmNfaW1wb3J0aW5nX2NhbGxlcicsKTogMSwKKyAgICAgICAgICAgIHNlbGYuZmlsZW1vZCArICgndHJhY2VkX2Z1bmNfaW1wb3J0aW5nJywpOiAxLAorICAgICAgICAgICAgKGZpeF9leHRfcHkodGVzdG1vZC5fX2ZpbGVfXyksICd0ZXN0bW9kJywgJ2Z1bmMnKTogMSwKKyAgICAgICAgfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHJhY2VyLnJlc3VsdHMoKS5jYWxsZWRmdW5jcywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9pbnN0X21ldGhvZF9jYWxsaW5nKHNlbGYpOgorICAgICAgICBvYmogPSBUcmFjZWRDbGFzcygyMCkKKyAgICAgICAgc2VsZi50cmFjZXIucnVuZnVuYyhvYmouaW5zdF9tZXRob2RfY2FsbGluZywgMSkKKworICAgICAgICBleHBlY3RlZCA9IHsKKyAgICAgICAgICAgIHNlbGYuZmlsZW1vZCArICgnVHJhY2VkQ2xhc3MuaW5zdF9tZXRob2RfY2FsbGluZycsKTogMSwKKyAgICAgICAgICAgIHNlbGYuZmlsZW1vZCArICgnVHJhY2VkQ2xhc3MuaW5zdF9tZXRob2RfbGluZWFyJywpOiAxLAorICAgICAgICAgICAgc2VsZi5maWxlbW9kICsgKCd0cmFjZWRfZnVuY19saW5lYXInLCk6IDEsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyYWNlci5yZXN1bHRzKCkuY2FsbGVkZnVuY3MsIGV4cGVjdGVkKQorCisKK2NsYXNzIFRlc3RDYWxsZXJzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJXaGl0ZS1ib3ggdGVzdGluZyBvZiBjYWxsZXJzIHRyYWNpbmciIiIKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudHJhY2VyID0gVHJhY2UoY291bnQ9MCwgdHJhY2U9MCwgY291bnRjYWxsZXJzPTEpCisgICAgICAgIHNlbGYuZmlsZW1vZCA9IG15X2ZpbGVfYW5kX21vZG5hbWUoKQorCisgICAgZGVmIHRlc3RfbG9vcF9jYWxsZXJfaW1wb3J0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLnRyYWNlci5ydW5mdW5jKHRyYWNlZF9mdW5jX2ltcG9ydGluZ19jYWxsZXIsIDEpCisKKyAgICAgICAgZXhwZWN0ZWQgPSB7CisgICAgICAgICAgICAoKG9zLnBhdGguc3BsaXRleHQodHJhY2UuX19maWxlX18pWzBdICsgJy5weScsICd0cmFjZScsICdUcmFjZS5ydW5mdW5jJyksCisgICAgICAgICAgICAgICAgKHNlbGYuZmlsZW1vZCArICgndHJhY2VkX2Z1bmNfaW1wb3J0aW5nX2NhbGxlcicsKSkpOiAxLAorICAgICAgICAgICAgKChzZWxmLmZpbGVtb2QgKyAoJ3RyYWNlZF9mdW5jX3NpbXBsZV9jYWxsZXInLCkpLAorICAgICAgICAgICAgICAgIChzZWxmLmZpbGVtb2QgKyAoJ3RyYWNlZF9mdW5jX2xpbmVhcicsKSkpOiAxLAorICAgICAgICAgICAgKChzZWxmLmZpbGVtb2QgKyAoJ3RyYWNlZF9mdW5jX2ltcG9ydGluZ19jYWxsZXInLCkpLAorICAgICAgICAgICAgICAgIChzZWxmLmZpbGVtb2QgKyAoJ3RyYWNlZF9mdW5jX3NpbXBsZV9jYWxsZXInLCkpKTogMSwKKyAgICAgICAgICAgICgoc2VsZi5maWxlbW9kICsgKCd0cmFjZWRfZnVuY19pbXBvcnRpbmdfY2FsbGVyJywpKSwKKyAgICAgICAgICAgICAgICAoc2VsZi5maWxlbW9kICsgKCd0cmFjZWRfZnVuY19pbXBvcnRpbmcnLCkpKTogMSwKKyAgICAgICAgICAgICgoc2VsZi5maWxlbW9kICsgKCd0cmFjZWRfZnVuY19pbXBvcnRpbmcnLCkpLAorICAgICAgICAgICAgICAgIChmaXhfZXh0X3B5KHRlc3Rtb2QuX19maWxlX18pLCAndGVzdG1vZCcsICdmdW5jJykpOiAxLAorICAgICAgICB9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50cmFjZXIucmVzdWx0cygpLmNhbGxlcnMsIGV4cGVjdGVkKQorCisKKyMgQ3JlYXRlZCBzZXBhcmF0ZWx5IGZvciBpc3N1ZSAjMzgyMQorY2xhc3MgVGVzdENvdmVyYWdlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHJtdHJlZShURVNURk4pCisgICAgICAgIHVubGluayhURVNURk4pCisKKyAgICBkZWYgX2NvdmVyYWdlKHNlbGYsIHRyYWNlciwKKyAgICAgICAgICAgICAgICAgIGNtZD0nZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3BwcmludDsgdGVzdF9wcHJpbnQudGVzdF9tYWluKCknKToKKyAgICAgICAgdHJhY2VyLnJ1bihjbWQpCisgICAgICAgIHIgPSB0cmFjZXIucmVzdWx0cygpCisgICAgICAgIHIud3JpdGVfcmVzdWx0cyhzaG93X21pc3Npbmc9VHJ1ZSwgc3VtbWFyeT1UcnVlLCBjb3ZlcmRpcj1URVNURk4pCisKKyAgICBkZWYgdGVzdF9jb3ZlcmFnZShzZWxmKToKKyAgICAgICAgdHJhY2VyID0gdHJhY2UuVHJhY2UodHJhY2U9MCwgY291bnQ9MSkKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CisgICAgICAgICAgICBzZWxmLl9jb3ZlcmFnZSh0cmFjZXIpCisgICAgICAgIHN0ZG91dCA9IHN0ZG91dC5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgicHByaW50LnB5IiBpbiBzdGRvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiY2FzZS5weSIgaW4gc3Rkb3V0KSAgICMgZnJvbSB1bml0dGVzdAorICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIoVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInBwcmludC5jb3ZlciIgaW4gZmlsZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgidW5pdHRlc3QuY2FzZS5jb3ZlciIgaW4gZmlsZXMpCisKKyAgICBkZWYgdGVzdF9jb3ZlcmFnZV9pZ25vcmUoc2VsZik6CisgICAgICAgICMgSWdub3JlIGFsbCBmaWxlcywgbm90aGluZyBzaG91bGQgYmUgdHJhY2VkIG5vciBwcmludGVkCisgICAgICAgIGxpYnBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguZGlybmFtZShvcy5fX2ZpbGVfXykpCisgICAgICAgICMgc3lzLnByZWZpeCBkb2VzIG5vdCB3b3JrIHdoZW4gcnVubmluZyBmcm9tIGEgY2hlY2tvdXQKKyAgICAgICAgdHJhY2VyID0gdHJhY2UuVHJhY2UoaWdub3JlZGlycz1bc3lzLnByZWZpeCwgc3lzLmV4ZWNfcHJlZml4LCBsaWJwYXRoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2U9MCwgY291bnQ9MSkKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CisgICAgICAgICAgICBzZWxmLl9jb3ZlcmFnZSh0cmFjZXIpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKFRFU1RGTik6CisgICAgICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIoVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlcywgW10pCisKKyAgICBkZWYgdGVzdF9pc3N1ZTk5MzYoc2VsZik6CisgICAgICAgIHRyYWNlciA9IHRyYWNlLlRyYWNlKHRyYWNlPTAsIGNvdW50PTEpCisgICAgICAgIG1vZG5hbWUgPSAndGVzdC50cmFjZWRtb2R1bGVzLnRlc3Rtb2QnCisgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIG1vZHVsZSBpcyBleGVjdXRlZCBpbiBpbXBvcnQKKyAgICAgICAgaWYgbW9kbmFtZSBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1ttb2RuYW1lXQorICAgICAgICBjbWQgPSAoImltcG9ydCB0ZXN0LnRyYWNlZG1vZHVsZXMudGVzdG1vZCBhcyB0OyIKKyAgICAgICAgICAgICAgICJ0LmZ1bmMoMCk7IHQuZnVuYzIoKTsiKQorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKKyAgICAgICAgICAgIHNlbGYuX2NvdmVyYWdlKHRyYWNlciwgY21kKQorICAgICAgICBzdGRvdXQuc2VlaygwKQorICAgICAgICBzdGRvdXQucmVhZGxpbmUoKQorICAgICAgICBjb3ZlcmFnZSA9IHt9CisgICAgICAgIGZvciBsaW5lIGluIHN0ZG91dDoKKyAgICAgICAgICAgIGxpbmVzLCBjb3YsIG1vZHVsZSA9IGxpbmUuc3BsaXQoKVs6M10KKyAgICAgICAgICAgIGNvdmVyYWdlW21vZHVsZV0gPSAoaW50KGxpbmVzKSwgaW50KGNvdls6LTFdKSkKKyAgICAgICAgIyBYWFggVGhpcyBpcyBuZWVkZWQgdG8gcnVuIHJlZ3J0ZXN0LnB5IGFzIGEgc2NyaXB0CisgICAgICAgIG1vZG5hbWUgPSB0cmFjZS5mdWxsbW9kbmFtZShzeXMubW9kdWxlc1ttb2RuYW1lXS5fX2ZpbGVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihtb2RuYW1lLCBjb3ZlcmFnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3ZlcmFnZVttb2RuYW1lXSwgKDUsIDEwMCkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChfX25hbWVfXykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0YzllZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYWNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0YzllZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYWNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZWJhY2sucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA3NmJlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYWNlYmFjay5weQpAQCAtMCwwICsxLDIwNCBAQAorIiIiVGVzdCBjYXNlcyBmb3IgdHJhY2ViYWNrIG1vZHVsZSIiIgorCitmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgdHJhY2ViYWNrX3ByaW50Citmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGltcCBpbXBvcnQgcmVsb2FkCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGlzX2p5dGhvbiwgRXJyb3IKKworaW1wb3J0IHRyYWNlYmFjaworCisKK2NsYXNzIFRyYWNlYmFja0Nhc2VzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIEZvciBub3csIGEgdmVyeSBtaW5pbWFsIHNldCBvZiB0ZXN0cy4gIEkgd2FudCB0byBiZSBzdXJlIHRoYXQKKyAgICAjIGZvcm1hdHRpbmcgb2YgU3ludGF4RXJyb3JzIHdvcmtzIGJhc2VkIG9uIGNoYW5nZXMgZm9yIDIuMS4KKworICAgIGRlZiBnZXRfZXhjZXB0aW9uX2Zvcm1hdChzZWxmLCBmdW5jLCBleGMpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmdW5jKCkKKyAgICAgICAgZXhjZXB0IGV4YywgdmFsdWU6CisgICAgICAgICAgICByZXR1cm4gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShleGMsIHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImNhbGwgZGlkIG5vdCByYWlzZSBleGNlcHRpb24iCisKKyAgICBkZWYgc3ludGF4X2Vycm9yX3dpdGhfY2FyZXQoc2VsZik6CisgICAgICAgIGNvbXBpbGUoImRlZiBmYWN0KHgpOlxuXHRyZXR1cm4geCFcbiIsICI/IiwgImV4ZWMiKQorCisgICAgZGVmIHN5bnRheF9lcnJvcl93aXRoX2NhcmV0XzIoc2VsZik6CisgICAgICAgIGNvbXBpbGUoIjEgK1xuIiwgIj8iLCAiZXhlYyIpCisKKyAgICBkZWYgc3ludGF4X2Vycm9yX3dpdGhvdXRfY2FyZXQoc2VsZik6CisgICAgICAgICMgWFhYIHdoeSBkb2Vzbid0IGNvbXBpbGUgcmFpc2UgdGhlIHNhbWUgdHJhY2ViYWNrPworICAgICAgICBpbXBvcnQgdGVzdC5iYWRzeW50YXhfbm9jYXJldAorCisgICAgZGVmIHN5bnRheF9lcnJvcl9iYWRfaW5kZW50YXRpb24oc2VsZik6CisgICAgICAgIGNvbXBpbGUoImRlZiBzcGFtKCk6XG4gIHByaW50IDFcbiBwcmludCAyIiwgIj8iLCAiZXhlYyIpCisKKyAgICBkZWYgdGVzdF9jYXJldChzZWxmKToKKyAgICAgICAgZXJyID0gc2VsZi5nZXRfZXhjZXB0aW9uX2Zvcm1hdChzZWxmLnN5bnRheF9lcnJvcl93aXRoX2NhcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheEVycm9yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGVycikgPT0gNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVyclsxXS5zdHJpcCgpID09ICJyZXR1cm4geCEiKQorICAgICAgICBzZWxmLmFzc2VydEluKCJeIiwgZXJyWzJdKSAjIHRoaXJkIGxpbmUgaGFzIGNhcmV0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnJbMV0uZmluZCgiISIpID09IGVyclsyXS5maW5kKCJeIikpICMgaW4gdGhlIHJpZ2h0IHBsYWNlCisKKyAgICAgICAgZXJyID0gc2VsZi5nZXRfZXhjZXB0aW9uX2Zvcm1hdChzZWxmLnN5bnRheF9lcnJvcl93aXRoX2NhcmV0XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4RXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIl4iLCBlcnJbMl0pICMgdGhpcmQgbGluZSBoYXMgY2FyZXQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVyclsyXS5jb3VudCgnXG4nKSA9PSAxKSAjIGFuZCBubyBhZGRpdGlvbmFsIG5ld2xpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVyclsxXS5maW5kKCIrIikgPT0gZXJyWzJdLmZpbmQoIl4iKSkgIyBpbiB0aGUgcmlnaHQgcGxhY2UKKworICAgIGRlZiB0ZXN0X25vY2FyZXQoc2VsZik6CisgICAgICAgIGlmIGlzX2p5dGhvbjoKKyAgICAgICAgICAgICMganl0aG9uIGFkZHMgYSBjYXJldCBpbiB0aGlzIGNhc2UgKHdoeSBzaG91bGRuJ3QgaXQ/KQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVyciA9IHNlbGYuZ2V0X2V4Y2VwdGlvbl9mb3JtYXQoc2VsZi5zeW50YXhfZXJyb3Jfd2l0aG91dF9jYXJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihlcnIpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnJbMV0uc3RyaXAoKSA9PSAiW3ggZm9yIHggaW4geF0gPSB4IikKKworICAgIGRlZiB0ZXN0X2JhZF9pbmRlbnRhdGlvbihzZWxmKToKKyAgICAgICAgZXJyID0gc2VsZi5nZXRfZXhjZXB0aW9uX2Zvcm1hdChzZWxmLnN5bnRheF9lcnJvcl9iYWRfaW5kZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZW50YXRpb25FcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihlcnIpID09IDQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnJbMV0uc3RyaXAoKSA9PSAicHJpbnQgMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIl4iLCBlcnJbMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnJbMV0uZmluZCgiMiIpID09IGVyclsyXS5maW5kKCJeIikpCisKKyAgICBkZWYgdGVzdF9idWc3Mzc0NzMoc2VsZik6CisgICAgICAgIGltcG9ydCBvcywgdGVtcGZpbGUsIHRpbWUKKworICAgICAgICBzYXZlZHBhdGggPSBzeXMucGF0aFs6XQorICAgICAgICB0ZXN0ZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCB0ZXN0ZGlyKQorICAgICAgICAgICAgdGVzdGZpbGUgPSBvcy5wYXRoLmpvaW4odGVzdGRpciwgJ3Rlc3RfYnVnNzM3NDczLnB5JykKKyAgICAgICAgICAgIHByaW50ID4+IG9wZW4odGVzdGZpbGUsICd3JyksICIiIgorZGVmIHRlc3QoKToKKyAgICByYWlzZSBWYWx1ZUVycm9yIiIiCisKKyAgICAgICAgICAgIGlmICd0ZXN0X2J1ZzczNzQ3MycgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzWyd0ZXN0X2J1ZzczNzQ3MyddCisgICAgICAgICAgICBpbXBvcnQgdGVzdF9idWc3Mzc0NzMKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRlc3RfYnVnNzM3NDczLnRlc3QoKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgIyB0aGlzIGxvYWRzIHNvdXJjZSBjb2RlIHRvIGxpbmVjYWNoZQorICAgICAgICAgICAgICAgIHRyYWNlYmFjay5leHRyYWN0X3RiKHN5cy5leGNfdHJhY2ViYWNrKQorCisgICAgICAgICAgICAjIElmIHRoaXMgdGVzdCBydW5zIHRvbyBxdWlja2x5LCB0ZXN0X2J1ZzczNzQ3My5weSdzIG10aW1lCisgICAgICAgICAgICAjIGF0dHJpYnV0ZSB3aWxsIHJlbWFpbiB1bmNoYW5nZWQgZXZlbiBpZiB0aGUgZmlsZSBpcyByZXdyaXR0ZW4uCisgICAgICAgICAgICAjIENvbnNlcXVlbnRseSwgdGhlIGZpbGUgd291bGQgbm90IHJlbG9hZC4gIFNvLCBhZGRlZCBhIHNsZWVwKCkKKyAgICAgICAgICAgICMgZGVsYXkgdG8gYXNzdXJlIHRoYXQgYSBuZXcsIGRpc3RpbmN0IHRpbWVzdGFtcCBpcyB3cml0dGVuLgorICAgICAgICAgICAgIyBTaW5jZSBXaW5NRSB3aXRoIEZBVDMyIGhhcyBtdWx0aXNlY29uZCByZXNvbHV0aW9uLCBtb3JlIHRoYW4KKyAgICAgICAgICAgICMgdGhyZWUgc2Vjb25kcyBhcmUgbmVlZGVkIGZvciB0aGlzIHRlc3QgdG8gcGFzcyByZWxpYWJseSA6LSgKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoNCkKKworICAgICAgICAgICAgcHJpbnQgPj4gb3Blbih0ZXN0ZmlsZSwgJ3cnKSwgIiIiCitkZWYgdGVzdCgpOgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IiIiIKKyAgICAgICAgICAgIHJlbG9hZCh0ZXN0X2J1ZzczNzQ3MykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ZXN0X2J1ZzczNzQ3My50ZXN0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgorICAgICAgICAgICAgICAgIHNyYyA9IHRyYWNlYmFjay5leHRyYWN0X3RiKHN5cy5leGNfdHJhY2ViYWNrKVstMV1bLTFdCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcmMsICdyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZWRwYXRoCisgICAgICAgICAgICBmb3IgZiBpbiBvcy5saXN0ZGlyKHRlc3RkaXIpOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4odGVzdGRpciwgZikpCisgICAgICAgICAgICBvcy5ybWRpcih0ZXN0ZGlyKQorCisgICAgZGVmIHRlc3RfYmFzZV9leGNlcHRpb24oc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGV4Y2VwdGlvbnMgZGVyaXZlZCBmcm9tIEJhc2VFeGNlcHRpb24gYXJlIGZvcm1hdHRlZCByaWdodAorICAgICAgICBlID0gS2V5Ym9hcmRJbnRlcnJ1cHQoKQorICAgICAgICBsc3QgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KGUuX19jbGFzc19fLCBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgWydLZXlib2FyZEludGVycnVwdFxuJ10pCisKKyAgICAjIFN0cmluZyBleGNlcHRpb25zIGFyZSBkZXByZWNhdGVkLCBidXQgbGVnYWwuICBUaGUgcXVpcmt5IGZvcm0gd2l0aAorICAgICMgc2VwYXJhdGUgInR5cGUiIGFuZCAidmFsdWUiIHRlbmRzIHRvIGJyZWFrIHRoaW5ncywgYmVjYXVzZQorICAgICMgICAgIG5vdCBpc2luc3RhbmNlKHZhbHVlLCB0eXBlKQorICAgICMgYW5kIGEgc3RyaW5nIGNhbm5vdCBiZSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gaXNzdWJjbGFzcy4KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgc3lzLmxhc3RfdHlwZSBhbmQgc3lzLmxhc3RfdmFsdWUgZG8gbm90IGdldCBzZXQgaWYgYW4KKyAgICAjIGV4Y2VwdGlvbiBpcyBjYXVnaHQsIHNvIHdlIHNvcnQgb2YgY2hlYXQgYW5kIGp1c3QgZW11bGF0ZSB0aGVtLgorICAgICMKKyAgICAjIHRlc3Rfc3RyaW5nX2V4Y2VwdGlvbjEgaXMgZXF1aXZhbGVudCB0bworICAgICMKKyAgICAjID4+PiByYWlzZSAiU3RyaW5nIEV4Y2VwdGlvbiIKKyAgICAjCisgICAgIyB0ZXN0X3N0cmluZ19leGNlcHRpb24yIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAjCisgICAgIyA+Pj4gcmFpc2UgIlN0cmluZyBFeGNlcHRpb24iLCAiU3RyaW5nIFZhbHVlIgorICAgICMKKyAgICBkZWYgdGVzdF9zdHJpbmdfZXhjZXB0aW9uMShzZWxmKToKKyAgICAgICAgc3RyX3R5cGUgPSAiU3RyaW5nIEV4Y2VwdGlvbiIKKyAgICAgICAgZXJyID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShzdHJfdHlwZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXJyKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJbMF0sIHN0cl90eXBlICsgJ1xuJykKKworICAgIGRlZiB0ZXN0X3N0cmluZ19leGNlcHRpb24yKHNlbGYpOgorICAgICAgICBzdHJfdHlwZSA9ICJTdHJpbmcgRXhjZXB0aW9uIgorICAgICAgICBzdHJfdmFsdWUgPSAiU3RyaW5nIFZhbHVlIgorICAgICAgICBlcnIgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KHN0cl90eXBlLCBzdHJfdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVyciksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyWzBdLCBzdHJfdHlwZSArICc6ICcgKyBzdHJfdmFsdWUgKyAnXG4nKQorCisgICAgZGVmIHRlc3RfZm9ybWF0X2V4Y2VwdGlvbl9vbmx5X2JhZF9fc3RyX18oc2VsZik6CisgICAgICAgIGNsYXNzIFgoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIDEgLy8gMAorICAgICAgICBlcnIgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KFgsIFgoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXJyKSwgMSkKKyAgICAgICAgc3RyX3ZhbHVlID0gJzx1bnByaW50YWJsZSAlcyBvYmplY3Q+JyAlIFguX19uYW1lX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJbMF0sIFguX19uYW1lX18gKyAnOiAnICsgc3RyX3ZhbHVlICsgJ1xuJykKKworICAgIGRlZiB0ZXN0X3dpdGhvdXRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBlcnIgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBbJ05vbmVcbiddKQorCisgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKKyAgICAgICAgZXJyID0gQXNzZXJ0aW9uRXJyb3IoJ1x4ZmYnKQorICAgICAgICBsaW5lcyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkodHlwZShlcnIpLCBlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMsIFsnQXNzZXJ0aW9uRXJyb3I6IFx4ZmZcbiddKQorCisgICAgICAgIGVyciA9IEFzc2VydGlvbkVycm9yKHUnXHhlOScpCisgICAgICAgIGxpbmVzID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seSh0eXBlKGVyciksIGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lcywgWydBc3NlcnRpb25FcnJvcjogXFx4ZTlcbiddKQorCisKK2NsYXNzIFRyYWNlYmFja0Zvcm1hdFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3RyYWNlYmFja19mb3JtYXQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdibGFoJykKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgdHlwZV8sIHZhbHVlLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICB0cmFjZWJhY2tfZm10ID0gJ1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbicgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycuam9pbih0cmFjZWJhY2suZm9ybWF0X3RiKHRiKSkKKyAgICAgICAgICAgIGZpbGVfID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgdHJhY2ViYWNrX3ByaW50KHRiLCBmaWxlXykKKyAgICAgICAgICAgIHB5dGhvbl9mbXQgID0gZmlsZV8uZ2V0dmFsdWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IoInVuYWJsZSB0byBjcmVhdGUgdGVzdCB0cmFjZWJhY2sgc3RyaW5nIikKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IFB5dGhvbiBhbmQgdGhlIHRyYWNlYmFjayBtb2R1bGUgZm9ybWF0IHRoZSBzYW1lIHRoaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHJhY2ViYWNrX2ZtdCwgcHl0aG9uX2ZtdCkKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSB0cmFjZWJhY2sgaXMgcHJvcGVybHkgaW5kZW50ZWQuCisgICAgICAgIHRiX2xpbmVzID0gcHl0aG9uX2ZtdC5zcGxpdGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGJfbGluZXMpLCAzKQorICAgICAgICBiYW5uZXIsIGxvY2F0aW9uLCBzb3VyY2VfbGluZSA9IHRiX2xpbmVzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYW5uZXIuc3RhcnRzd2l0aCgnVHJhY2ViYWNrJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2NhdGlvbi5zdGFydHN3aXRoKCcgIEZpbGUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvdXJjZV9saW5lLnN0YXJ0c3dpdGgoJyAgICByYWlzZScpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVHJhY2ViYWNrQ2FzZXMsIFRyYWNlYmFja0Zvcm1hdFRlc3RzKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYWNlYmFjay5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZWJhY2sucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNTY3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZWJhY2sucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYWNlYmFjay5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZWJhY2sucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNTY3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZWJhY2sucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYW5zZm9ybWVyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhbnNmb3JtZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg5MWFjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYW5zZm9ybWVyLnB5CkBAIC0wLDAgKzEsMzggQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBTaWxlbmNlIFB5M2sgd2FybmluZwordGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2NvbXBpbGVyJywgZGVwcmVjYXRlZD1UcnVlKQorZnJvbSBjb21waWxlciBpbXBvcnQgdHJhbnNmb3JtZXIsIGFzdAorZnJvbSBjb21waWxlciBpbXBvcnQgY29tcGlsZQorCitjbGFzcyBUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdE11bHRpcGxlTEhTKHNlbGYpOgorICAgICAgICAiIiIgVGVzdCBtdWx0aXBsZSB0YXJnZXRzIG9uIHRoZSBsZWZ0IGhhbmQgc2lkZS4gIiIiCisKKyAgICAgICAgc25pcHBldHMgPSBbJ2EsIGIgPSAxLCAyJywKKyAgICAgICAgICAgICAgICAgICAgJyhhLCBiKSA9IDEsIDInLAorICAgICAgICAgICAgICAgICAgICAnKChhLCBiKSwgYykgPSAoMSwgMiksIDMnXQorCisgICAgICAgIGZvciBzIGluIHNuaXBwZXRzOgorICAgICAgICAgICAgYSA9IHRyYW5zZm9ybWVyLnBhcnNlKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYSwgYXN0Lk1vZHVsZSkKKyAgICAgICAgICAgIGNoaWxkMSA9IGEuZ2V0Q2hpbGROb2RlcygpWzBdCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoY2hpbGQxLCBhc3QuU3RtdCkKKyAgICAgICAgICAgIGNoaWxkMiA9IGNoaWxkMS5nZXRDaGlsZE5vZGVzKClbMF0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShjaGlsZDIsIGFzdC5Bc3NpZ24pCisKKyAgICAgICAgICAgICMgVGhpcyBhY3R1YWxseSB0ZXN0cyB0aGUgY29tcGlsZXIsIGJ1dCBpdCdzIGEgd2F5IHRvIGFzc3VyZSB0aGUgYXN0CisgICAgICAgICAgICAjIGlzIGNvcnJlY3QKKyAgICAgICAgICAgIGMgPSBjb21waWxlKHMsICc8c3RyaW5nPicsICdzaW5nbGUnKQorICAgICAgICAgICAgdmFscyA9IHt9CisgICAgICAgICAgICBleGVjIGMgaW4gdmFscworICAgICAgICAgICAgYXNzZXJ0IHZhbHNbJ2EnXSA9PSAxCisgICAgICAgICAgICBhc3NlcnQgdmFsc1snYiddID09IDIKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYW5zZm9ybWVyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYW5zZm9ybWVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTRhZTRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhbnNmb3JtZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYW5zZm9ybWVyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYW5zZm9ybWVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjIzOWRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhbnNmb3JtZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHRrX2d1aW9ubHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAzNjhiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5CkBAIC0wLDAgKzEsNDMgQEAKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisjIFNraXAgdGhpcyB0ZXN0IGlmIF90a2ludGVyIHdhc24ndCBidWlsdC4KK3Rlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdfdGtpbnRlcicpCisKK3RoaXNfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCitsaWJfdGtfdGVzdCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4odGhpc19kaXIsIG9zLnBhdGgucGFyZGlyLAorICAgICdsaWItdGsnLCAndGVzdCcpKQorCit3aXRoIHRlc3Rfc3VwcG9ydC5EaXJzT25TeXNQYXRoKGxpYl90a190ZXN0KToKKyAgICBpbXBvcnQgcnVudGt0ZXN0cworCisjIFNraXAgdGVzdCBpZiB0ayBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuCitydW50a3Rlc3RzLmNoZWNrX3RrX2F2YWlsYWJpbGl0eSgpCisKK2ltcG9ydCB0dGsKK2Zyb20gX3RraW50ZXIgaW1wb3J0IFRjbEVycm9yCisKK3RyeToKKyAgICB0dGsuQnV0dG9uKCkKK2V4Y2VwdCBUY2xFcnJvciwgbXNnOgorICAgICMgYXNzdW1pbmcgdHRrIGlzIG5vdCBhdmFpbGFibGUKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgidHRrIG5vdCBhdmFpbGFibGU6ICVzIiAlIG1zZykKKworZGVmIHRlc3RfbWFpbihlbmFibGVfZ3VpPUZhbHNlKToKKyAgICBpZiBlbmFibGVfZ3VpOgorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudXNlX3Jlc291cmNlcyBpcyBOb25lOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBbJ2d1aSddCisgICAgICAgIGVsaWYgJ2d1aScgbm90IGluIHRlc3Rfc3VwcG9ydC51c2VfcmVzb3VyY2VzOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXMuYXBwZW5kKCdndWknKQorCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRGlyc09uU3lzUGF0aChsaWJfdGtfdGVzdCk6CisgICAgICAgIGZyb20gdGVzdF90dGsuc3VwcG9ydCBpbXBvcnQgZ2V0X3RrX3Jvb3QKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgICAgICAgICAqcnVudGt0ZXN0cy5nZXRfdGVzdHModGV4dD1GYWxzZSwgcGFja2FnZXM9Wyd0ZXN0X3R0ayddKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGdldF90a19yb290KCkuZGVzdHJveSgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKGVuYWJsZV9ndWk9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTkyOGVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHRrX2d1aW9ubHkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTkyOGVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHRrX2d1aW9ubHkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a190ZXh0b25seS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a190ZXh0b25seS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDkyMDQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5CkBAIC0wLDAgKzEsMTkgQEAKK2ltcG9ydCBvcworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBTa2lwIHRoaXMgdGVzdCBpZiBfdGtpbnRlciBkb2VzIG5vdCBleGlzdC4KK3Rlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdfdGtpbnRlcicpCisKK3RoaXNfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykpCitsaWJfdGtfdGVzdCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4odGhpc19kaXIsICcuLicsICdsaWItdGsnLCAndGVzdCcpKQorCit3aXRoIHRlc3Rfc3VwcG9ydC5EaXJzT25TeXNQYXRoKGxpYl90a190ZXN0KToKKyAgICBpbXBvcnQgcnVudGt0ZXN0cworCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRGlyc09uU3lzUGF0aChsaWJfdGtfdGVzdCk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgICAgICAqcnVudGt0ZXN0cy5nZXRfdGVzdHMoZ3VpPUZhbHNlLCBwYWNrYWdlcz1bJ3Rlc3RfdHRrJ10pKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dGtfdGV4dG9ubHkucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmE1NDhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dGtfdGV4dG9ubHkucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmE1NDhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dXBsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R1cGxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMzA4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dXBsZS5weQpAQCAtMCwwICsxLDE2MSBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQsIHNlcV90ZXN0cworCitpbXBvcnQgZ2MKKworY2xhc3MgVHVwbGVUZXN0KHNlcV90ZXN0cy5Db21tb25UZXN0KToKKyAgICB0eXBlMnRlc3QgPSB0dXBsZQorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3JzKHNlbGYpOgorICAgICAgICBzdXBlcihUdXBsZVRlc3QsIHNlbGYpLnRlc3RfY29uc3RydWN0b3JzKCkKKyAgICAgICAgIyBjYWxsaW5nIGJ1aWx0LWluIHR5cGVzIHdpdGhvdXQgYXJndW1lbnQgbXVzdCByZXR1cm4gZW1wdHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZSgpLCAoKSkKKyAgICAgICAgdDBfMyA9ICgwLCAxLCAyLCAzKQorICAgICAgICB0MF8zX2JpcyA9IHR1cGxlKHQwXzMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MF8zIGlzIHQwXzNfYmlzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKFtdKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoWzAsIDEsIDIsIDNdKSwgKDAsIDEsIDIsIDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKCcnKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoJ3NwYW0nKSwgKCdzJywgJ3AnLCAnYScsICdtJykpCisKKyAgICBkZWYgdGVzdF90cnV0aChzZWxmKToKKyAgICAgICAgc3VwZXIoVHVwbGVUZXN0LCBzZWxmKS50ZXN0X3RydXRoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCg0MiwgKSkKKworICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgc3VwZXIoVHVwbGVUZXN0LCBzZWxmKS50ZXN0X2xlbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKCgpKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oKDAsKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKCgwLCAxLCAyKSksIDMpCisKKyAgICBkZWYgdGVzdF9pYWRkKHNlbGYpOgorICAgICAgICBzdXBlcihUdXBsZVRlc3QsIHNlbGYpLnRlc3RfaWFkZCgpCisgICAgICAgIHUgPSAoMCwgMSkKKyAgICAgICAgdTIgPSB1CisgICAgICAgIHUgKz0gKDIsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1IGlzIG5vdCB1MikKKworICAgIGRlZiB0ZXN0X2ltdWwoc2VsZik6CisgICAgICAgIHN1cGVyKFR1cGxlVGVzdCwgc2VsZikudGVzdF9pbXVsKCkKKyAgICAgICAgdSA9ICgwLCAxKQorICAgICAgICB1MiA9IHUKKyAgICAgICAgdSAqPSAzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1IGlzIG5vdCB1MikKKworICAgIGRlZiB0ZXN0X3R1cGxlcmVzaXplYnVnKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgYSBzcGVjaWZpYyBidWcgaW4gX1B5VHVwbGVfUmVzaXplKCkgaXMgc3F1YXNoZWQuCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDAwKToKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh0dXBsZShmKCkpKSwgcmFuZ2UoMTAwMCkpCisKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYpOgorICAgICAgICAjIFNlZSBTRiBidWcgOTQyOTUyOiAgV2Vha25lc3MgaW4gdHVwbGUgaGFzaAorICAgICAgICAjIFRoZSBoYXNoIHNob3VsZDoKKyAgICAgICAgIyAgICAgIGJlIG5vbi1jb21tdXRhdGl2ZQorICAgICAgICAjICAgICAgc2hvdWxkIHNwcmVhZC1vdXQgY2xvc2VseSBzcGFjZWQgdmFsdWVzCisgICAgICAgICMgICAgICBzaG91bGQgbm90IGV4aGliaXQgY2FuY2VsbGF0aW9uIGluIHR1cGxlcyBsaWtlICh4LCh4LHkpKQorICAgICAgICAjICAgICAgc2hvdWxkIGJlIGRpc3RpbmN0IGZyb20gZWxlbWVudCBoYXNoZXM6ICBoYXNoKHgpIT1oYXNoKCh4LCkpCisgICAgICAgICMgVGhpcyB0ZXN0IGV4ZXJjaXNlcyB0aG9zZSBjYXNlcy4KKyAgICAgICAgIyBGb3IgYSBwdXJlIHJhbmRvbSBoYXNoIGFuZCBOPTUwLCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIG9jY3VwaWVkCisgICAgICAgICMgICAgICBidWNrZXRzIHdoZW4gdG9zc2luZyAyNTIsNjAwIGJhbGxzIGludG8gMioqMzIgYnVja2V0cworICAgICAgICAjICAgICAgaXMgMjUyLDU5Mi42LCBvciBhYm91dCA3LjQgZXhwZWN0ZWQgY29sbGlzaW9ucy4gIFRoZQorICAgICAgICAjICAgICAgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDIuNzMuICBPbiBhIGJveCB3aXRoIDY0LWJpdCBoYXNoCisgICAgICAgICMgICAgICBjb2Rlcywgbm8gY29sbGlzaW9ucyBhcmUgZXhwZWN0ZWQuICBIZXJlIHdlIGFjY2VwdCBubworICAgICAgICAjICAgICAgbW9yZSB0aGFuIDE1IGNvbGxpc2lvbnMuICBBbnkgd29yc2UgYW5kIHRoZSBoYXNoIGZ1bmN0aW9uCisgICAgICAgICMgICAgICBpcyBzb3JlbHkgc3VzcGVjdC4KKworICAgICAgICBOPTUwCisgICAgICAgIGJhc2UgPSByYW5nZShOKQorICAgICAgICB4cCA9IFsoaSwgaikgZm9yIGkgaW4gYmFzZSBmb3IgaiBpbiBiYXNlXQorICAgICAgICBpbnBzID0gYmFzZSArIFsoaSwgaikgZm9yIGkgaW4gYmFzZSBmb3IgaiBpbiB4cF0gKyBcCisgICAgICAgICAgICAgICAgICAgICBbKGksIGopIGZvciBpIGluIHhwIGZvciBqIGluIGJhc2VdICsgeHAgKyB6aXAoYmFzZSkKKyAgICAgICAgY29sbGlzaW9ucyA9IGxlbihpbnBzKSAtIGxlbihzZXQobWFwKGhhc2gsIGlucHMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbGxpc2lvbnMgPD0gMTUpCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBsMCA9IHR1cGxlKCkKKyAgICAgICAgbDIgPSAoMCwgMSwgMikKKyAgICAgICAgYTAgPSBzZWxmLnR5cGUydGVzdChsMCkKKyAgICAgICAgYTIgPSBzZWxmLnR5cGUydGVzdChsMikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihhMCksIHJlcHIobDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihhMiksIHJlcHIobDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYTApLCAiKCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYTIpLCAiKDAsIDEsIDIpIikKKworICAgIGRlZiBfbm90X3RyYWNrZWQoc2VsZiwgdCk6CisgICAgICAgICMgTmVzdGVkIHR1cGxlcyBjYW4gdGFrZSBzZXZlcmFsIGNvbGxlY3Rpb25zIHRvIHVudHJhY2sKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdjLmlzX3RyYWNrZWQodCksIHQpCisKKyAgICBkZWYgX3RyYWNrZWQoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnYy5pc190cmFja2VkKHQpLCB0KQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnYy5pc190cmFja2VkKHQpLCB0KQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF90cmFja19saXRlcmFscyhzZWxmKToKKyAgICAgICAgIyBUZXN0IEdDLW9wdGltaXphdGlvbiBvZiB0dXBsZSBsaXRlcmFscworICAgICAgICB4LCB5LCB6ID0gMS41LCAiYSIsIFtdCisKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoKCkpCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKCgxLCkpCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKCgxLCAyKSkKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoKDEsIDIsICJhIikpCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKCgxLCAyLCAoTm9uZSwgVHJ1ZSwgRmFsc2UsICgpKSwgaW50KSkKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoKG9iamVjdCgpLCkpCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKCgoMSwgeCksIHksICgyLCAzKSkpCisKKyAgICAgICAgIyBUdXBsZXMgd2l0aCBtdXRhYmxlIGVsZW1lbnRzIGFyZSBhbHdheXMgdHJhY2tlZCwgZXZlbiBpZiB0aG9zZQorICAgICAgICAjIGVsZW1lbnRzIGFyZSBub3QgdHJhY2tlZCByaWdodCBub3cuCisgICAgICAgIHNlbGYuX3RyYWNrZWQoKFtdLCkpCisgICAgICAgIHNlbGYuX3RyYWNrZWQoKFsxXSwpKQorICAgICAgICBzZWxmLl90cmFja2VkKCh7fSwpKQorICAgICAgICBzZWxmLl90cmFja2VkKChzZXQoKSwpKQorICAgICAgICBzZWxmLl90cmFja2VkKCh4LCB5LCB6KSkKKworICAgIGRlZiBjaGVja190cmFja19keW5hbWljKHNlbGYsIHRwLCBhbHdheXNfdHJhY2spOgorICAgICAgICB4LCB5LCB6ID0gMS41LCAiYSIsIFtdCisKKyAgICAgICAgY2hlY2sgPSBzZWxmLl90cmFja2VkIGlmIGFsd2F5c190cmFjayBlbHNlIHNlbGYuX25vdF90cmFja2VkCisgICAgICAgIGNoZWNrKHRwKCkpCisgICAgICAgIGNoZWNrKHRwKFtdKSkKKyAgICAgICAgY2hlY2sodHAoc2V0KCkpKQorICAgICAgICBjaGVjayh0cChbMSwgeCwgeV0pKQorICAgICAgICBjaGVjayh0cChvYmogZm9yIG9iaiBpbiBbMSwgeCwgeV0pKQorICAgICAgICBjaGVjayh0cChzZXQoWzEsIHgsIHldKSkpCisgICAgICAgIGNoZWNrKHRwKHR1cGxlKFtvYmpdKSBmb3Igb2JqIGluIFsxLCB4LCB5XSkpCisgICAgICAgIGNoZWNrKHR1cGxlKHRwKFtvYmpdKSBmb3Igb2JqIGluIFsxLCB4LCB5XSkpCisKKyAgICAgICAgc2VsZi5fdHJhY2tlZCh0cChbel0pKQorICAgICAgICBzZWxmLl90cmFja2VkKHRwKFtbeCwgeV1dKSkKKyAgICAgICAgc2VsZi5fdHJhY2tlZCh0cChbe3g6IHl9XSkpCisgICAgICAgIHNlbGYuX3RyYWNrZWQodHAob2JqIGZvciBvYmogaW4gW3gsIHksIHpdKSkKKyAgICAgICAgc2VsZi5fdHJhY2tlZCh0cCh0dXBsZShbb2JqXSkgZm9yIG9iaiBpbiBbeCwgeSwgel0pKQorICAgICAgICBzZWxmLl90cmFja2VkKHR1cGxlKHRwKFtvYmpdKSBmb3Igb2JqIGluIFt4LCB5LCB6XSkpCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3RyYWNrX2R5bmFtaWMoc2VsZik6CisgICAgICAgICMgVGVzdCBHQy1vcHRpbWl6YXRpb24gb2YgZHluYW1pY2FsbHkgY29uc3RydWN0ZWQgdHVwbGVzLgorICAgICAgICBzZWxmLmNoZWNrX3RyYWNrX2R5bmFtaWModHVwbGUsIEZhbHNlKQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF90cmFja19zdWJ0eXBlcyhzZWxmKToKKyAgICAgICAgIyBUdXBsZSBzdWJ0eXBlcyBtdXN0IGFsd2F5cyBiZSB0cmFja2VkCisgICAgICAgIGNsYXNzIE15VHVwbGUodHVwbGUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmNoZWNrX3RyYWNrX2R5bmFtaWMoTXlUdXBsZSwgVHJ1ZSkKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfYnVnNzQ2NihzZWxmKToKKyAgICAgICAgIyBUcnlpbmcgdG8gdW50cmFjayBhbiB1bmZpbmlzaGVkIHR1cGxlIGNvdWxkIGNyYXNoIFB5dGhvbgorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZCh0dXBsZShnYy5jb2xsZWN0KCkgZm9yIGkgaW4gcmFuZ2UoMTAxKSkpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFR1cGxlVGVzdCkKKworaWYgX19uYW1lX189PSJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R1cGxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R1cGxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQ1N2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHVwbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R1cGxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R1cGxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQ1N2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHVwbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R5cGVjaGVja3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlY2hlY2tzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjAxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlY2hlY2tzLnB5CkBAIC0wLDAgKzEsOTMgQEAKKyIiIlVuaXQgdGVzdHMgZm9yIF9faW5zdGFuY2VjaGVja19fIGFuZCBfX3N1YmNsYXNzY2hlY2tfXy4iIiIKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK2NsYXNzIEFCQyh0eXBlKToKKworICAgIGRlZiBfX2luc3RhbmNlY2hlY2tfXyhjbHMsIGluc3QpOgorICAgICAgICAiIiJJbXBsZW1lbnQgaXNpbnN0YW5jZShpbnN0LCBjbHMpLiIiIgorICAgICAgICByZXR1cm4gYW55KGNscy5fX3N1YmNsYXNzY2hlY2tfXyhjKQorICAgICAgICAgICAgICAgICAgIGZvciBjIGluIHNldChbdHlwZShpbnN0KSwgaW5zdC5fX2NsYXNzX19dKSkKKworICAgIGRlZiBfX3N1YmNsYXNzY2hlY2tfXyhjbHMsIHN1Yik6CisgICAgICAgICIiIkltcGxlbWVudCBpc3N1YmNsYXNzKHN1YiwgY2xzKS4iIiIKKyAgICAgICAgY2FuZGlkYXRlcyA9IGNscy5fX2RpY3RfXy5nZXQoIl9fc3ViY2xhc3NfXyIsIHNldCgpKSB8IHNldChbY2xzXSkKKyAgICAgICAgcmV0dXJuIGFueShjIGluIGNhbmRpZGF0ZXMgZm9yIGMgaW4gc3ViLm1ybygpKQorCisKK2NsYXNzIEludGVnZXI6CisKKyAgICBfX21ldGFjbGFzc19fID0gQUJDCisKKyAgICBfX3N1YmNsYXNzX18gPSBzZXQoW2ludF0pCisKKworY2xhc3MgU3ViSW50KEludGVnZXIpOgorCisgICAgcGFzcworCisKK2NsYXNzIFR5cGVDaGVja3NUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0SXNTdWJjbGFzc0ludGVybmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEludGVnZXIuX19zdWJjbGFzc2NoZWNrX18oaW50KSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChJbnRlZ2VyLl9fc3ViY2xhc3NjaGVja19fKGZsb2F0KSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdElzU3ViY2xhc3NCdWlsdGluKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzc3ViY2xhc3MoaW50LCBJbnRlZ2VyKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc3N1YmNsYXNzKGludCwgKEludGVnZXIsKSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNzdWJjbGFzcyhmbG9hdCwgSW50ZWdlciksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzc3ViY2xhc3MoZmxvYXQsIChJbnRlZ2VyLCkpLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0SXNJbnN0YW5jZUJ1aWx0aW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNpbnN0YW5jZSg0MiwgSW50ZWdlciksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNpbnN0YW5jZSg0MiwgKEludGVnZXIsKSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNpbnN0YW5jZSgzLjE0LCBJbnRlZ2VyKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNpbnN0YW5jZSgzLjE0LCAoSW50ZWdlciwpKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdElzSW5zdGFuY2VBY3R1YWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNpbnN0YW5jZShJbnRlZ2VyKCksIEludGVnZXIpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzaW5zdGFuY2UoSW50ZWdlcigpLCAoSW50ZWdlciwpKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0SXNTdWJjbGFzc0FjdHVhbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc3N1YmNsYXNzKEludGVnZXIsIEludGVnZXIpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzc3ViY2xhc3MoSW50ZWdlciwgKEludGVnZXIsKSksIFRydWUpCisKKyAgICBkZWYgdGVzdFN1YmNsYXNzQmVoYXZpb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNzdWJjbGFzcyhTdWJJbnQsIEludGVnZXIpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzc3ViY2xhc3MoU3ViSW50LCAoSW50ZWdlciwpKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc3N1YmNsYXNzKFN1YkludCwgU3ViSW50KSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc3N1YmNsYXNzKFN1YkludCwgKFN1YkludCwpKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc3N1YmNsYXNzKEludGVnZXIsIFN1YkludCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzc3ViY2xhc3MoSW50ZWdlciwgKFN1YkludCwpKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNzdWJjbGFzcyhpbnQsIFN1YkludCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzc3ViY2xhc3MoaW50LCAoU3ViSW50LCkpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc2luc3RhbmNlKFN1YkludCgpLCBJbnRlZ2VyKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc2luc3RhbmNlKFN1YkludCgpLCAoSW50ZWdlciwpKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc2luc3RhbmNlKFN1YkludCgpLCBTdWJJbnQpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzaW5zdGFuY2UoU3ViSW50KCksIChTdWJJbnQsKSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNpbnN0YW5jZSg0MiwgU3ViSW50KSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNpbnN0YW5jZSg0MiwgKFN1YkludCwpKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9vbGRzdHlsZShzZWxmKToKKyAgICAgICAgIyBUaGVzZSBzaG91bGQganVzdCBiZSBpZ25vcmVkLgorICAgICAgICBjbGFzcyBYOgorICAgICAgICAgICAgZGVmIF9faW5zdGFuY2VjaGVja19fKHNlbGYsIGluc3QpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBkZWYgX19zdWJjbGFzc2NoZWNrX18oc2VsZiwgY2xzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBjbGFzcyBTdWIoWCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKDMsIFgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShYKCksIFgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhpbnQsIFgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhTdWIsIFgpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFR5cGVDaGVja3NUZXN0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlY2hlY2tzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R5cGVjaGVja3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDM5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlY2hlY2tzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlY2hlY2tzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R5cGVjaGVja3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDM5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlY2hlY2tzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZjZkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlcy5weQpAQCAtMCwwICsxLDc1NiBAQAorIyBQeXRob24gdGVzdCBzZXQgLS0gcGFydCA2LCBidWlsdC1pbiB0eXBlcworCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGhhdmVfdW5pY29kZSwgcnVuX3dpdGhfbG9jYWxlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19weTNrX3dhcm5pbmdzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBsb2NhbGUKKworY2xhc3MgVHlwZXNUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF90cnV0aF92YWx1ZXMoc2VsZik6CisgICAgICAgIGlmIE5vbmU6IHNlbGYuZmFpbCgnTm9uZSBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnKQorICAgICAgICBpZiAwOiBzZWxmLmZhaWwoJzAgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJykKKyAgICAgICAgaWYgMEw6IHNlbGYuZmFpbCgnMEwgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJykKKyAgICAgICAgaWYgMC4wOiBzZWxmLmZhaWwoJzAuMCBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnKQorICAgICAgICBpZiAnJzogc2VsZi5mYWlsKCdcJ1wnIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScpCisgICAgICAgIGlmIG5vdCAxOiBzZWxmLmZhaWwoJzEgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgaWYgbm90IDFMOiBzZWxmLmZhaWwoJzFMIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCAxLjA6IHNlbGYuZmFpbCgnMS4wIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCAneCc6IHNlbGYuZmFpbCgnXCd4XCcgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgaWYgbm90IHsneCc6IDF9OiBzZWxmLmZhaWwoJ3tcJ3hcJzogMX0gaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgZGVmIGYoKTogcGFzcworICAgICAgICBjbGFzcyBDOiBwYXNzCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgaWYgbm90IGY6IHNlbGYuZmFpbCgnZiBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3QgQzogc2VsZi5mYWlsKCdDIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCBzeXM6IHNlbGYuZmFpbCgnc3lzIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCB4OiBzZWxmLmZhaWwoJ3ggaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKworICAgIGRlZiB0ZXN0X2Jvb2xlYW5fb3BzKHNlbGYpOgorICAgICAgICBpZiAwIG9yIDA6IHNlbGYuZmFpbCgnMCBvciAwIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScpCisgICAgICAgIGlmIDEgYW5kIDE6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCcxIGFuZCAxIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCAxOiBzZWxmLmZhaWwoJ25vdCAxIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScpCisKKyAgICBkZWYgdGVzdF9jb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgaWYgMCA8IDEgPD0gMSA9PSAxID49IDEgPiAwICE9IDE6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdpbnQgY29tcGFyaXNvbnMgZmFpbGVkJykKKyAgICAgICAgaWYgMEwgPCAxTCA8PSAxTCA9PSAxTCA+PSAxTCA+IDBMICE9IDFMOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnbG9uZyBpbnQgY29tcGFyaXNvbnMgZmFpbGVkJykKKyAgICAgICAgaWYgMC4wIDwgMS4wIDw9IDEuMCA9PSAxLjAgPj0gMS4wID4gMC4wICE9IDEuMDogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2Zsb2F0IGNvbXBhcmlzb25zIGZhaWxlZCcpCisgICAgICAgIGlmICcnIDwgJ2EnIDw9ICdhJyA9PSAnYScgPCAnYWJjJyA8ICdhYmQnIDwgJ2InOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnc3RyaW5nIGNvbXBhcmlzb25zIGZhaWxlZCcpCisgICAgICAgIGlmIE5vbmUgaXMgTm9uZTogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2lkZW50aXR5IHRlc3QgZmFpbGVkJykKKworICAgIGRlZiB0ZXN0X2Zsb2F0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAnNVwwJykKKworICAgIGRlZiB0ZXN0X3plcm9fZGl2aXNpb24oc2VsZik6CisgICAgICAgIHRyeTogNS4wIC8gMC4wCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIjUuMCAvIDAuMCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQorCisgICAgICAgIHRyeTogNS4wIC8vIDAuMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCI1LjAgLy8gMC4wIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCisKKyAgICAgICAgdHJ5OiA1LjAgJSAwLjAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiNS4wICUgMC4wIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCisKKyAgICAgICAgdHJ5OiA1IC8gMEwKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiNSAvIDBMIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCisKKyAgICAgICAgdHJ5OiA1IC8vIDBMCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIjUgLy8gMEwgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKKworICAgICAgICB0cnk6IDUgJSAwTAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCI1ICUgMEwgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKKworICAgIGRlZiB0ZXN0X251bWVyaWNfdHlwZXMoc2VsZik6CisgICAgICAgIGlmIDAgIT0gMEwgb3IgMCAhPSAwLjAgb3IgMEwgIT0gMC4wOiBzZWxmLmZhaWwoJ21peGVkIGNvbXBhcmlzb25zJykKKyAgICAgICAgaWYgMSAhPSAxTCBvciAxICE9IDEuMCBvciAxTCAhPSAxLjA6IHNlbGYuZmFpbCgnbWl4ZWQgY29tcGFyaXNvbnMnKQorICAgICAgICBpZiAtMSAhPSAtMUwgb3IgLTEgIT0gLTEuMCBvciAtMUwgIT0gLTEuMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnaW50L2xvbmcvZmxvYXQgdmFsdWUgbm90IGVxdWFsJykKKyAgICAgICAgIyBjYWxsaW5nIGJ1aWx0LWluIHR5cGVzIHdpdGhvdXQgYXJndW1lbnQgbXVzdCByZXR1cm4gMAorICAgICAgICBpZiBpbnQoKSAhPSAwOiBzZWxmLmZhaWwoJ2ludCgpIGRvZXMgbm90IHJldHVybiAwJykKKyAgICAgICAgaWYgbG9uZygpICE9IDBMOiBzZWxmLmZhaWwoJ2xvbmcoKSBkb2VzIG5vdCByZXR1cm4gMEwnKQorICAgICAgICBpZiBmbG9hdCgpICE9IDAuMDogc2VsZi5mYWlsKCdmbG9hdCgpIGRvZXMgbm90IHJldHVybiAwLjAnKQorICAgICAgICBpZiBpbnQoMS45KSA9PSAxID09IGludCgxLjEpIGFuZCBpbnQoLTEuMSkgPT0gLTEgPT0gaW50KC0xLjkpOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnaW50KCkgZG9lcyBub3Qgcm91bmQgcHJvcGVybHknKQorICAgICAgICBpZiBsb25nKDEuOSkgPT0gMUwgPT0gbG9uZygxLjEpIGFuZCBsb25nKC0xLjEpID09IC0xTCA9PSBsb25nKC0xLjkpOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnbG9uZygpIGRvZXMgbm90IHJvdW5kIHByb3Blcmx5JykKKyAgICAgICAgaWYgZmxvYXQoMSkgPT0gMS4wIGFuZCBmbG9hdCgtMSkgPT0gLTEuMCBhbmQgZmxvYXQoMCkgPT0gMC4wOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnZmxvYXQoKSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5JykKKworICAgIGRlZiB0ZXN0X2Zsb2F0X3RvX3N0cmluZyhzZWxmKToKKyAgICAgICAgZGVmIHRlc3QoZiwgcmVzdWx0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5fX2Zvcm1hdF9fKCdlJyksIHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyVlJyAlIGYsIHJlc3VsdCkKKworICAgICAgICAjIHRlc3QgYWxsIDIgZGlnaXQgZXhwb25lbnRzLCBib3RoIHdpdGggX19mb3JtYXRfXyBhbmQgd2l0aAorICAgICAgICAjICAnJScgZm9ybWF0dGluZworICAgICAgICBmb3IgaSBpbiByYW5nZSgtOTksIDEwMCk6CisgICAgICAgICAgICB0ZXN0KGZsb2F0KCcxLjVlJytzdHIoaSkpLCAnMS41MDAwMDBlezA6KzAzZH0nLmZvcm1hdChpKSkKKworICAgICAgICAjIHRlc3Qgc29tZSAzIGRpZ2l0IGV4cG9uZW50cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEuNWUxMDAuX19mb3JtYXRfXygnZScpLCAnMS41MDAwMDBlKzEwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyVlJyAlIDEuNWUxMDAsICcxLjUwMDAwMGUrMTAwJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEuNWUxMDEuX19mb3JtYXRfXygnZScpLCAnMS41MDAwMDBlKzEwMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyVlJyAlIDEuNWUxMDEsICcxLjUwMDAwMGUrMTAxJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEuNWUtMTAwLl9fZm9ybWF0X18oJ2UnKSwgJzEuNTAwMDAwZS0xMDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclZScgJSAxLjVlLTEwMCwgJzEuNTAwMDAwZS0xMDAnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMS41ZS0xMDEuX19mb3JtYXRfXygnZScpLCAnMS41MDAwMDBlLTEwMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyVlJyAlIDEuNWUtMTAxLCAnMS41MDAwMDBlLTEwMScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJWcnICUgMS4wLCAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyUjZycgJSAxLjAsICcxLjAwMDAwJykKKworICAgIGRlZiB0ZXN0X25vcm1hbF9pbnRlZ2VycyhzZWxmKToKKyAgICAgICAgIyBFbnN1cmUgdGhlIGZpcnN0IDI1NiBpbnRlZ2VycyBhcmUgc2hhcmVkCisgICAgICAgIGEgPSAyNTYKKyAgICAgICAgYiA9IDEyOCoyCisgICAgICAgIGlmIGEgaXMgbm90IGI6IHNlbGYuZmFpbCgnMjU2IGlzIG5vdCBzaGFyZWQnKQorICAgICAgICBpZiAxMiArIDI0ICE9IDM2OiBzZWxmLmZhaWwoJ2ludCBvcCcpCisgICAgICAgIGlmIDEyICsgKC0yNCkgIT0gLTEyOiBzZWxmLmZhaWwoJ2ludCBvcCcpCisgICAgICAgIGlmICgtMTIpICsgMjQgIT0gMTI6IHNlbGYuZmFpbCgnaW50IG9wJykKKyAgICAgICAgaWYgKC0xMikgKyAoLTI0KSAhPSAtMzY6IHNlbGYuZmFpbCgnaW50IG9wJykKKyAgICAgICAgaWYgbm90IDEyIDwgMjQ6IHNlbGYuZmFpbCgnaW50IG9wJykKKyAgICAgICAgaWYgbm90IC0yNCA8IC0xMjogc2VsZi5mYWlsKCdpbnQgb3AnKQorICAgICAgICAjIFRlc3QgZm9yIGEgcGFydGljdWxhciBidWcgaW4gaW50ZWdlciBtdWx0aXBseQorICAgICAgICB4c2l6ZSwgeXNpemUsIHpzaXplID0gMjM4LCAzNTYsIDQKKyAgICAgICAgaWYgbm90ICh4c2l6ZSp5c2l6ZSp6c2l6ZSA9PSB6c2l6ZSp4c2l6ZSp5c2l6ZSA9PSAzMzg5MTIpOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdpbnQgbXVsIGNvbW11dGF0aXZpdHknKQorICAgICAgICAjIEFuZCBhbm90aGVyLgorICAgICAgICBtID0gLXN5cy5tYXhpbnQgLSAxCisgICAgICAgIGZvciBkaXZpc29yIGluIDEsIDIsIDQsIDgsIDE2LCAzMjoKKyAgICAgICAgICAgIGogPSBtIC8vIGRpdmlzb3IKKyAgICAgICAgICAgIHByb2QgPSBkaXZpc29yICogagorICAgICAgICAgICAgaWYgcHJvZCAhPSBtOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXIgKiAlciA9PSAlciAhPSAlciIgJSAoZGl2aXNvciwgaiwgcHJvZCwgbSkpCisgICAgICAgICAgICBpZiB0eXBlKHByb2QpIGlzIG5vdCBpbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCB0eXBlKHByb2QpIHRvIGJlIGludCwgbm90ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUocHJvZCkpCisgICAgICAgICMgQ2hlY2sgZm9yIGV4cGVjdGVkICogb3ZlcmZsb3cgdG8gbG9uZy4KKyAgICAgICAgZm9yIGRpdmlzb3IgaW4gMSwgMiwgNCwgOCwgMTYsIDMyOgorICAgICAgICAgICAgaiA9IG0gLy8gZGl2aXNvciAtIDEKKyAgICAgICAgICAgIHByb2QgPSBkaXZpc29yICogagorICAgICAgICAgICAgaWYgdHlwZShwcm9kKSBpcyBub3QgbG9uZzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIHR5cGUoJXIpIHRvIGJlIGxvbmcsIG5vdCAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZCwgdHlwZShwcm9kKSkpCisgICAgICAgICMgQ2hlY2sgZm9yIGV4cGVjdGVkICogb3ZlcmZsb3cgdG8gbG9uZy4KKyAgICAgICAgbSA9IHN5cy5tYXhpbnQKKyAgICAgICAgZm9yIGRpdmlzb3IgaW4gMSwgMiwgNCwgOCwgMTYsIDMyOgorICAgICAgICAgICAgaiA9IG0gLy8gZGl2aXNvciArIDEKKyAgICAgICAgICAgIHByb2QgPSBkaXZpc29yICogagorICAgICAgICAgICAgaWYgdHlwZShwcm9kKSBpcyBub3QgbG9uZzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIHR5cGUoJXIpIHRvIGJlIGxvbmcsIG5vdCAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvZCwgdHlwZShwcm9kKSkpCisKKyAgICBkZWYgdGVzdF9sb25nX2ludGVnZXJzKHNlbGYpOgorICAgICAgICBpZiAxMkwgKyAyNEwgIT0gMzZMOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICBpZiAxMkwgKyAoLTI0TCkgIT0gLTEyTDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgaWYgKC0xMkwpICsgMjRMICE9IDEyTDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgaWYgKC0xMkwpICsgKC0yNEwpICE9IC0zNkw6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIGlmIG5vdCAxMkwgPCAyNEw6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIGlmIG5vdCAtMjRMIDwgLTEyTDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgeCA9IHN5cy5tYXhpbnQKKyAgICAgICAgaWYgaW50KGxvbmcoeCkpICE9IHg6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIHRyeTogeSA9IGludChsb25nKHgpKzFMKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoeSwgbG9uZyk6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIHggPSAteAorICAgICAgICBpZiBpbnQobG9uZyh4KSkgIT0geDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgeCA9IHgtMQorICAgICAgICBpZiBpbnQobG9uZyh4KSkgIT0geDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgdHJ5OiB5ID0gaW50KGxvbmcoeCktMUwpCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh5LCBsb25nKTogc2VsZi5mYWlsKCdsb25nIG9wJykKKworICAgICAgICB0cnk6IDUgPDwgLTUKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdpbnQgbmVnYXRpdmUgc2hpZnQgPDwnKQorCisgICAgICAgIHRyeTogNUwgPDwgLTVMCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnbG9uZyBuZWdhdGl2ZSBzaGlmdCA8PCcpCisKKyAgICAgICAgdHJ5OiA1ID4+IC01CisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnaW50IG5lZ2F0aXZlIHNoaWZ0ID4+JykKKworICAgICAgICB0cnk6IDVMID4+IC01TAorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2xvbmcgbmVnYXRpdmUgc2hpZnQgPj4nKQorCisgICAgZGVmIHRlc3RfZmxvYXRzKHNlbGYpOgorICAgICAgICBpZiAxMi4wICsgMjQuMCAhPSAzNi4wOiBzZWxmLmZhaWwoJ2Zsb2F0IG9wJykKKyAgICAgICAgaWYgMTIuMCArICgtMjQuMCkgIT0gLTEyLjA6IHNlbGYuZmFpbCgnZmxvYXQgb3AnKQorICAgICAgICBpZiAoLTEyLjApICsgMjQuMCAhPSAxMi4wOiBzZWxmLmZhaWwoJ2Zsb2F0IG9wJykKKyAgICAgICAgaWYgKC0xMi4wKSArICgtMjQuMCkgIT0gLTM2LjA6IHNlbGYuZmFpbCgnZmxvYXQgb3AnKQorICAgICAgICBpZiBub3QgMTIuMCA8IDI0LjA6IHNlbGYuZmFpbCgnZmxvYXQgb3AnKQorICAgICAgICBpZiBub3QgLTI0LjAgPCAtMTIuMDogc2VsZi5mYWlsKCdmbG9hdCBvcCcpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdzKHNlbGYpOgorICAgICAgICBpZiBsZW4oJycpICE9IDA6IHNlbGYuZmFpbCgnbGVuKFwnXCcpJykKKyAgICAgICAgaWYgbGVuKCdhJykgIT0gMTogc2VsZi5mYWlsKCdsZW4oXCdhXCcpJykKKyAgICAgICAgaWYgbGVuKCdhYmNkZWYnKSAhPSA2OiBzZWxmLmZhaWwoJ2xlbihcJ2FiY2RlZlwnKScpCisgICAgICAgIGlmICd4eXonICsgJ2FiY2RlJyAhPSAneHl6YWJjZGUnOiBzZWxmLmZhaWwoJ3N0cmluZyBjb25jYXRlbmF0aW9uJykKKyAgICAgICAgaWYgJ3h5eicqMyAhPSAneHl6eHl6eHl6Jzogc2VsZi5mYWlsKCdzdHJpbmcgcmVwZXRpdGlvbiAqMycpCisgICAgICAgIGlmIDAqJ2FiY2RlJyAhPSAnJzogc2VsZi5mYWlsKCdzdHJpbmcgcmVwZXRpdGlvbiAwKicpCisgICAgICAgIGlmIG1pbignYWJjJykgIT0gJ2EnIG9yIG1heCgnYWJjJykgIT0gJ2MnOiBzZWxmLmZhaWwoJ21pbi9tYXggc3RyaW5nJykKKyAgICAgICAgaWYgJ2EnIGluICdhYmMnIGFuZCAnYicgaW4gJ2FiYycgYW5kICdjJyBpbiAnYWJjJyBhbmQgJ2QnIG5vdCBpbiAnYWJjJzogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2luL25vdCBpbiBzdHJpbmcnKQorICAgICAgICB4ID0gJ3gnKjEwMworICAgICAgICBpZiAnJXMhJyV4ICE9IHgrJyEnOiBzZWxmLmZhaWwoJ25hc3R5IHN0cmluZyBmb3JtYXR0aW5nIGJ1ZycpCisKKyAgICAgICAgI2V4dGVuZGVkIHNsaWNlcyBmb3Igc3RyaW5ncworICAgICAgICBhID0gJzAxMjM0NTY3ODknCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6Ol0sIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6OjJdLCAnMDI0NjgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMTo6Ml0sICcxMzU3OScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6Oi0xXSwnOTg3NjU0MzIxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6Oi0yXSwgJzk3NTMxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzM6Oi0yXSwgJzMxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xMDA6MTAwOl0sIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxMDA6LTEwMDotMV0sIGFbOjotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstMTAwTDoxMDBMOjJMXSwgJzAyNDY4JykKKworICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBhID0gdW5pY29kZSgnMDEyMzQ1Njc4OScsICdhc2NpaScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjpdLCBhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6Ml0sIHVuaWNvZGUoJzAyNDY4JywgJ2FzY2lpJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMTo6Ml0sIHVuaWNvZGUoJzEzNTc5JywgJ2FzY2lpJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjotMV0sIHVuaWNvZGUoJzk4NzY1NDMyMTAnLCAnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6Oi0yXSwgdW5pY29kZSgnOTc1MzEnLCAnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVszOjotMl0sIHVuaWNvZGUoJzMxJywgJ2FzY2lpJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTEwMDoxMDA6XSwgYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxMDA6LTEwMDotMV0sIGFbOjotMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTEwMEw6MTAwTDoyTF0sIHVuaWNvZGUoJzAyNDY4JywgJ2FzY2lpJykpCisKKworICAgIGRlZiB0ZXN0X3R5cGVfZnVuY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHlwZSwgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0eXBlLCAxLCAyLCAzLCA0KQorCisgICAgZGVmIHRlc3RfYnVmZmVycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmZmVyLCAnYXNkZicsIC0xKQorICAgICAgICBjbXAoYnVmZmVyKCJhYmMiKSwgYnVmZmVyKCJkZWYiKSkgIyB1c2VkIHRvIHJhaXNlIGEgd2FybmluZzogdHBfY29tcGFyZSBkaWRuJ3QgcmV0dXJuIC0xLCAwLCBvciAxCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBidWZmZXIsIE5vbmUpCisKKyAgICAgICAgYSA9IGJ1ZmZlcignYXNkZicpCisgICAgICAgIGhhc2goYSkKKyAgICAgICAgYiA9IGEgKiA1CisgICAgICAgIGlmIGEgPT0gYjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnYnVmZmVycyBzaG91bGQgbm90IGJlIGVxdWFsJykKKyAgICAgICAgaWYgc3RyKGIpICE9ICgnYXNkZicgKiA1KToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgncmVwZWF0ZWQgYnVmZmVyIGhhcyB3cm9uZyBjb250ZW50JykKKyAgICAgICAgaWYgc3RyKGEgKiAwKSAhPSAnJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgncmVwZWF0ZWQgYnVmZmVyIHplcm8gdGltZXMgaGFzIHdyb25nIGNvbnRlbnQnKQorICAgICAgICBpZiBzdHIoYSArIGJ1ZmZlcignZGVmJykpICE9ICdhc2RmZGVmJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnY29uY2F0ZW5hdGlvbiBvZiBidWZmZXJzIHlpZWxkcyB3cm9uZyBjb250ZW50JykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihhKSkgIT0gJ2FzZGYnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdjb21wb3NpbmcgYnVmZmVycyBmYWlsZWQnKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGEsIDIpKSAhPSAnZGYnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdzcGVjaWZ5aW5nIGJ1ZmZlciBvZmZzZXQgZmFpbGVkJykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihhLCAwLCAyKSkgIT0gJ2FzJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnc3BlY2lmeWluZyBidWZmZXIgc2l6ZSBmYWlsZWQnKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGEsIDEsIDIpKSAhPSAnc2QnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdzcGVjaWZ5aW5nIGJ1ZmZlciBvZmZzZXQgYW5kIHNpemUgZmFpbGVkJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmZmVyLCBidWZmZXIoJ2FzZGYnLCAxKSwgLTEpCisgICAgICAgIGlmIHN0cihidWZmZXIoYnVmZmVyKCdhc2RmJywgMCwgMiksIDApKSAhPSAnYXMnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdjb21wb3NpbmcgbGVuZ3RoLXNwZWNpZmllZCBidWZmZXIgZmFpbGVkJykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAwLCAyKSwgMCwgNTAwMCkpICE9ICdhcyc6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2NvbXBvc2luZyBsZW5ndGgtc3BlY2lmaWVkIGJ1ZmZlciBmYWlsZWQnKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGJ1ZmZlcignYXNkZicsIDAsIDIpLCAwLCAtMSkpICE9ICdhcyc6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2NvbXBvc2luZyBsZW5ndGgtc3BlY2lmaWVkIGJ1ZmZlciBmYWlsZWQnKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGJ1ZmZlcignYXNkZicsIDAsIDIpLCAxLCAyKSkgIT0gJ3MnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdjb21wb3NpbmcgbGVuZ3RoLXNwZWNpZmllZCBidWZmZXIgZmFpbGVkJykKKworICAgICAgICB0cnk6IGFbMV0gPSAnZycKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoImJ1ZmZlciBhc3NpZ25tZW50IHNob3VsZCByYWlzZSBUeXBlRXJyb3IiKQorCisgICAgICAgIHRyeTogYVswOjFdID0gJ2cnCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCJidWZmZXIgc2xpY2UgYXNzaWdubWVudCBzaG91bGQgcmFpc2UgVHlwZUVycm9yIikKKworICAgICAgICAjIGFycmF5LmFycmF5KCkgcmV0dXJucyBhbiBvYmplY3QgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgYSBjaGFyIGJ1ZmZlciwKKyAgICAgICAgIyBzb21ldGhpbmcgd2hpY2ggaW50KCkgdXNlcyBmb3IgY29udmVyc2lvbi4KKyAgICAgICAgaW1wb3J0IGFycmF5CisgICAgICAgIHRyeTogaW50KGJ1ZmZlcihhcnJheS5hcnJheSgnYycpKSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoImNoYXIgYnVmZmVyIChhdCBDIGxldmVsKSBub3Qgd29ya2luZyIpCisKKyAgICBkZWYgdGVzdF9pbnRfX2Zvcm1hdF9fKHNlbGYpOgorICAgICAgICBkZWYgdGVzdChpLCBmb3JtYXRfc3BlYywgcmVzdWx0KToKKyAgICAgICAgICAgICMganVzdCBtYWtlIHN1cmUgSSdtIG5vdCBhY2NpZGVudGFsbHkgY2hlY2tpbmcgbG9uZ3MKKyAgICAgICAgICAgIGFzc2VydCB0eXBlKGkpID09IGludAorICAgICAgICAgICAgYXNzZXJ0IHR5cGUoZm9ybWF0X3NwZWMpID09IHN0cgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLl9fZm9ybWF0X18oZm9ybWF0X3NwZWMpLCByZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkuX19mb3JtYXRfXyh1bmljb2RlKGZvcm1hdF9zcGVjKSksIHJlc3VsdCkKKworICAgICAgICB0ZXN0KDEyMzQ1Njc4OSwgJ2QnLCAnMTIzNDU2Nzg5JykKKyAgICAgICAgdGVzdCgxMjM0NTY3ODksICdkJywgJzEyMzQ1Njc4OScpCisKKyAgICAgICAgdGVzdCgxLCAnYycsICdcMDEnKQorCisgICAgICAgICMgc2lnbiBhbmQgYWxpZ25pbmcgYXJlIGludGVyZGVwZW5kZW50CisgICAgICAgIHRlc3QoMSwgIi0iLCAnMScpCisgICAgICAgIHRlc3QoLTEsICItIiwgJy0xJykKKyAgICAgICAgdGVzdCgxLCAiLTMiLCAnICAxJykKKyAgICAgICAgdGVzdCgtMSwgIi0zIiwgJyAtMScpCisgICAgICAgIHRlc3QoMSwgIiszIiwgJyArMScpCisgICAgICAgIHRlc3QoLTEsICIrMyIsICcgLTEnKQorICAgICAgICB0ZXN0KDEsICIgMyIsICcgIDEnKQorICAgICAgICB0ZXN0KC0xLCAiIDMiLCAnIC0xJykKKyAgICAgICAgdGVzdCgxLCAiICIsICcgMScpCisgICAgICAgIHRlc3QoLTEsICIgIiwgJy0xJykKKworICAgICAgICAjIGhleAorICAgICAgICB0ZXN0KDMsICJ4IiwgIjMiKQorICAgICAgICB0ZXN0KDMsICJYIiwgIjMiKQorICAgICAgICB0ZXN0KDEyMzQsICJ4IiwgIjRkMiIpCisgICAgICAgIHRlc3QoLTEyMzQsICJ4IiwgIi00ZDIiKQorICAgICAgICB0ZXN0KDEyMzQsICI4eCIsICIgICAgIDRkMiIpCisgICAgICAgIHRlc3QoLTEyMzQsICI4eCIsICIgICAgLTRkMiIpCisgICAgICAgIHRlc3QoMTIzNCwgIngiLCAiNGQyIikKKyAgICAgICAgdGVzdCgtMTIzNCwgIngiLCAiLTRkMiIpCisgICAgICAgIHRlc3QoLTMsICJ4IiwgIi0zIikKKyAgICAgICAgdGVzdCgtMywgIlgiLCAiLTMiKQorICAgICAgICB0ZXN0KGludCgnYmUnLCAxNiksICJ4IiwgImJlIikKKyAgICAgICAgdGVzdChpbnQoJ2JlJywgMTYpLCAiWCIsICJCRSIpCisgICAgICAgIHRlc3QoLWludCgnYmUnLCAxNiksICJ4IiwgIi1iZSIpCisgICAgICAgIHRlc3QoLWludCgnYmUnLCAxNiksICJYIiwgIi1CRSIpCisKKyAgICAgICAgIyBvY3RhbAorICAgICAgICB0ZXN0KDMsICJvIiwgIjMiKQorICAgICAgICB0ZXN0KC0zLCAibyIsICItMyIpCisgICAgICAgIHRlc3QoNjUsICJvIiwgIjEwMSIpCisgICAgICAgIHRlc3QoLTY1LCAibyIsICItMTAxIikKKyAgICAgICAgdGVzdCgxMjM0LCAibyIsICIyMzIyIikKKyAgICAgICAgdGVzdCgtMTIzNCwgIm8iLCAiLTIzMjIiKQorICAgICAgICB0ZXN0KDEyMzQsICItbyIsICIyMzIyIikKKyAgICAgICAgdGVzdCgtMTIzNCwgIi1vIiwgIi0yMzIyIikKKyAgICAgICAgdGVzdCgxMjM0LCAiIG8iLCAiIDIzMjIiKQorICAgICAgICB0ZXN0KC0xMjM0LCAiIG8iLCAiLTIzMjIiKQorICAgICAgICB0ZXN0KDEyMzQsICIrbyIsICIrMjMyMiIpCisgICAgICAgIHRlc3QoLTEyMzQsICIrbyIsICItMjMyMiIpCisKKyAgICAgICAgIyBiaW5hcnkKKyAgICAgICAgdGVzdCgzLCAiYiIsICIxMSIpCisgICAgICAgIHRlc3QoLTMsICJiIiwgIi0xMSIpCisgICAgICAgIHRlc3QoMTIzNCwgImIiLCAiMTAwMTEwMTAwMTAiKQorICAgICAgICB0ZXN0KC0xMjM0LCAiYiIsICItMTAwMTEwMTAwMTAiKQorICAgICAgICB0ZXN0KDEyMzQsICItYiIsICIxMDAxMTAxMDAxMCIpCisgICAgICAgIHRlc3QoLTEyMzQsICItYiIsICItMTAwMTEwMTAwMTAiKQorICAgICAgICB0ZXN0KDEyMzQsICIgYiIsICIgMTAwMTEwMTAwMTAiKQorICAgICAgICB0ZXN0KC0xMjM0LCAiIGIiLCAiLTEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgxMjM0LCAiK2IiLCAiKzEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgtMTIzNCwgIitiIiwgIi0xMDAxMTAxMDAxMCIpCisKKyAgICAgICAgIyBhbHRlcm5hdGUgKCMpIGZvcm1hdHRpbmcKKyAgICAgICAgdGVzdCgwLCAiI2IiLCAnMGIwJykKKyAgICAgICAgdGVzdCgwLCAiLSNiIiwgJzBiMCcpCisgICAgICAgIHRlc3QoMSwgIi0jYiIsICcwYjEnKQorICAgICAgICB0ZXN0KC0xLCAiLSNiIiwgJy0wYjEnKQorICAgICAgICB0ZXN0KC0xLCAiLSM1YiIsICcgLTBiMScpCisgICAgICAgIHRlc3QoMSwgIisjNWIiLCAnICswYjEnKQorICAgICAgICB0ZXN0KDEwMCwgIisjYiIsICcrMGIxMTAwMTAwJykKKyAgICAgICAgdGVzdCgxMDAsICIjMDEyYiIsICcwYjAwMDExMDAxMDAnKQorICAgICAgICB0ZXN0KC0xMDAsICIjMDEyYiIsICctMGIwMDExMDAxMDAnKQorCisgICAgICAgIHRlc3QoMCwgIiNvIiwgJzBvMCcpCisgICAgICAgIHRlc3QoMCwgIi0jbyIsICcwbzAnKQorICAgICAgICB0ZXN0KDEsICItI28iLCAnMG8xJykKKyAgICAgICAgdGVzdCgtMSwgIi0jbyIsICctMG8xJykKKyAgICAgICAgdGVzdCgtMSwgIi0jNW8iLCAnIC0wbzEnKQorICAgICAgICB0ZXN0KDEsICIrIzVvIiwgJyArMG8xJykKKyAgICAgICAgdGVzdCgxMDAsICIrI28iLCAnKzBvMTQ0JykKKyAgICAgICAgdGVzdCgxMDAsICIjMDEybyIsICcwbzAwMDAwMDAxNDQnKQorICAgICAgICB0ZXN0KC0xMDAsICIjMDEybyIsICctMG8wMDAwMDAxNDQnKQorCisgICAgICAgIHRlc3QoMCwgIiN4IiwgJzB4MCcpCisgICAgICAgIHRlc3QoMCwgIi0jeCIsICcweDAnKQorICAgICAgICB0ZXN0KDEsICItI3giLCAnMHgxJykKKyAgICAgICAgdGVzdCgtMSwgIi0jeCIsICctMHgxJykKKyAgICAgICAgdGVzdCgtMSwgIi0jNXgiLCAnIC0weDEnKQorICAgICAgICB0ZXN0KDEsICIrIzV4IiwgJyArMHgxJykKKyAgICAgICAgdGVzdCgxMDAsICIrI3giLCAnKzB4NjQnKQorICAgICAgICB0ZXN0KDEwMCwgIiMwMTJ4IiwgJzB4MDAwMDAwMDA2NCcpCisgICAgICAgIHRlc3QoLTEwMCwgIiMwMTJ4IiwgJy0weDAwMDAwMDA2NCcpCisgICAgICAgIHRlc3QoMTIzNDU2LCAiIzAxMngiLCAnMHgwMDAwMDFlMjQwJykKKyAgICAgICAgdGVzdCgtMTIzNDU2LCAiIzAxMngiLCAnLTB4MDAwMDFlMjQwJykKKworICAgICAgICB0ZXN0KDAsICIjWCIsICcwWDAnKQorICAgICAgICB0ZXN0KDAsICItI1giLCAnMFgwJykKKyAgICAgICAgdGVzdCgxLCAiLSNYIiwgJzBYMScpCisgICAgICAgIHRlc3QoLTEsICItI1giLCAnLTBYMScpCisgICAgICAgIHRlc3QoLTEsICItIzVYIiwgJyAtMFgxJykKKyAgICAgICAgdGVzdCgxLCAiKyM1WCIsICcgKzBYMScpCisgICAgICAgIHRlc3QoMTAwLCAiKyNYIiwgJyswWDY0JykKKyAgICAgICAgdGVzdCgxMDAsICIjMDEyWCIsICcwWDAwMDAwMDAwNjQnKQorICAgICAgICB0ZXN0KC0xMDAsICIjMDEyWCIsICctMFgwMDAwMDAwNjQnKQorICAgICAgICB0ZXN0KDEyMzQ1NiwgIiMwMTJYIiwgJzBYMDAwMDAxRTI0MCcpCisgICAgICAgIHRlc3QoLTEyMzQ1NiwgIiMwMTJYIiwgJy0wWDAwMDAxRTI0MCcpCisKKyAgICAgICAgIyBpc3N1ZSA1NzgyLCBjb21tYXMgd2l0aCBubyBzcGVjaWZpZXIgdHlwZQorICAgICAgICB0ZXN0KDEyMzQsICcwMTAsJywgJzAwLDAwMSwyMzQnKQorCisgICAgICAgICMgbWFrZSBzdXJlIHRoZXNlIGFyZSBlcnJvcnMKKworICAgICAgICAjIHByZWNpc2lvbiBkaXNhbGxvd2VkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIDMgLl9fZm9ybWF0X18sICIxLjMiKQorICAgICAgICAjIHNpZ24gbm90IGFsbG93ZWQgd2l0aCAnYycKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgMyAuX19mb3JtYXRfXywgIitjIikKKyAgICAgICAgIyBmb3JtYXQgc3BlYyBtdXN0IGJlIHN0cmluZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIDMgLl9fZm9ybWF0X18sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgMyAuX19mb3JtYXRfXywgMCkKKworICAgICAgICAjIGNhbid0IGhhdmUgJywnIHdpdGggJ2MnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIDMgLl9fZm9ybWF0X18sICIsYyIpCisKKyAgICAgICAgIyBlbnN1cmUgdGhhdCBvbmx5IGludCBhbmQgZmxvYXQgdHlwZSBzcGVjaWZpZXJzIHdvcmsKKyAgICAgICAgZm9yIGZvcm1hdF9zcGVjIGluIChbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnYScpLCBvcmQoJ3onKSsxKV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaHIoeCkgZm9yIHggaW4gcmFuZ2Uob3JkKCdBJyksIG9yZCgnWicpKzEpXSk6CisgICAgICAgICAgICBpZiBub3QgZm9ybWF0X3NwZWMgaW4gJ2JjZG94WGVFZkZnR24lJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAwIC5fX2Zvcm1hdF9fLCBmb3JtYXRfc3BlYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAxIC5fX2Zvcm1hdF9fLCBmb3JtYXRfc3BlYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAoLTEpIC5fX2Zvcm1hdF9fLCBmb3JtYXRfc3BlYykKKworICAgICAgICAjIGVuc3VyZSB0aGF0IGZsb2F0IHR5cGUgc3BlY2lmaWVycyB3b3JrOyBmb3JtYXQgY29udmVydHMKKyAgICAgICAgIyAgdGhlIGludCB0byBhIGZsb2F0CisgICAgICAgIGZvciBmb3JtYXRfc3BlYyBpbiAnZUVmRmdHJSc6CisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gWzAsIDEsIC0xLCAxMDAsIC0xMDAsIDEyMzQ1Njc4OTAsIC0xMjM0NTY3ODkwXToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLl9fZm9ybWF0X18oZm9ybWF0X3NwZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQodmFsdWUpLl9fZm9ybWF0X18oZm9ybWF0X3NwZWMpKQorCisgICAgICAgICMgSXNzdWUgNjkwMgorICAgICAgICB0ZXN0KDEyMzQ1NiwgIjA8MjAiLCAnMTIzNDU2MDAwMDAwMDAwMDAwMDAnKQorICAgICAgICB0ZXN0KDEyMzQ1NiwgIjE8MjAiLCAnMTIzNDU2MTExMTExMTExMTExMTEnKQorICAgICAgICB0ZXN0KDEyMzQ1NiwgIio8MjAiLCAnMTIzNDU2KioqKioqKioqKioqKionKQorICAgICAgICB0ZXN0KDEyMzQ1NiwgIjA+MjAiLCAnMDAwMDAwMDAwMDAwMDAxMjM0NTYnKQorICAgICAgICB0ZXN0KDEyMzQ1NiwgIjE+MjAiLCAnMTExMTExMTExMTExMTExMjM0NTYnKQorICAgICAgICB0ZXN0KDEyMzQ1NiwgIio+MjAiLCAnKioqKioqKioqKioqKioxMjM0NTYnKQorICAgICAgICB0ZXN0KDEyMzQ1NiwgIjA9MjAiLCAnMDAwMDAwMDAwMDAwMDAxMjM0NTYnKQorICAgICAgICB0ZXN0KDEyMzQ1NiwgIjE9MjAiLCAnMTExMTExMTExMTExMTExMjM0NTYnKQorICAgICAgICB0ZXN0KDEyMzQ1NiwgIio9MjAiLCAnKioqKioqKioqKioqKioxMjM0NTYnKQorCisgICAgZGVmIHRlc3RfbG9uZ19fZm9ybWF0X18oc2VsZik6CisgICAgICAgIGRlZiB0ZXN0KGksIGZvcm1hdF9zcGVjLCByZXN1bHQpOgorICAgICAgICAgICAgIyBtYWtlIHN1cmUgd2UncmUgbm90IGFjY2lkZW50YWxseSBjaGVja2luZyBpbnRzCisgICAgICAgICAgICBhc3NlcnQgdHlwZShpKSA9PSBsb25nCisgICAgICAgICAgICBhc3NlcnQgdHlwZShmb3JtYXRfc3BlYykgPT0gc3RyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkuX19mb3JtYXRfXyhmb3JtYXRfc3BlYyksIHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5fX2Zvcm1hdF9fKHVuaWNvZGUoZm9ybWF0X3NwZWMpKSwgcmVzdWx0KQorCisgICAgICAgIHRlc3QoMTAqKjEwMCwgJ2QnLCAnMScgKyAnMCcgKiAxMDApCisgICAgICAgIHRlc3QoMTAqKjEwMCsxMDAsICdkJywgJzEnICsgJzAnICogOTcgKyAnMTAwJykKKworICAgICAgICB0ZXN0KDEyMzQ1Njc4OUwsICdkJywgJzEyMzQ1Njc4OScpCisgICAgICAgIHRlc3QoMTIzNDU2Nzg5TCwgJ2QnLCAnMTIzNDU2Nzg5JykKKworICAgICAgICAjIHNpZ24gYW5kIGFsaWduaW5nIGFyZSBpbnRlcmRlcGVuZGVudAorICAgICAgICB0ZXN0KDFMLCAiLSIsICcxJykKKyAgICAgICAgdGVzdCgtMUwsICItIiwgJy0xJykKKyAgICAgICAgdGVzdCgxTCwgIi0zIiwgJyAgMScpCisgICAgICAgIHRlc3QoLTFMLCAiLTMiLCAnIC0xJykKKyAgICAgICAgdGVzdCgxTCwgIiszIiwgJyArMScpCisgICAgICAgIHRlc3QoLTFMLCAiKzMiLCAnIC0xJykKKyAgICAgICAgdGVzdCgxTCwgIiAzIiwgJyAgMScpCisgICAgICAgIHRlc3QoLTFMLCAiIDMiLCAnIC0xJykKKyAgICAgICAgdGVzdCgxTCwgIiAiLCAnIDEnKQorICAgICAgICB0ZXN0KC0xTCwgIiAiLCAnLTEnKQorCisgICAgICAgIHRlc3QoMUwsICdjJywgJ1wwMScpCisKKyAgICAgICAgIyBoZXgKKyAgICAgICAgdGVzdCgzTCwgIngiLCAiMyIpCisgICAgICAgIHRlc3QoM0wsICJYIiwgIjMiKQorICAgICAgICB0ZXN0KDEyMzRMLCAieCIsICI0ZDIiKQorICAgICAgICB0ZXN0KC0xMjM0TCwgIngiLCAiLTRkMiIpCisgICAgICAgIHRlc3QoMTIzNEwsICI4eCIsICIgICAgIDRkMiIpCisgICAgICAgIHRlc3QoLTEyMzRMLCAiOHgiLCAiICAgIC00ZDIiKQorICAgICAgICB0ZXN0KDEyMzRMLCAieCIsICI0ZDIiKQorICAgICAgICB0ZXN0KC0xMjM0TCwgIngiLCAiLTRkMiIpCisgICAgICAgIHRlc3QoLTNMLCAieCIsICItMyIpCisgICAgICAgIHRlc3QoLTNMLCAiWCIsICItMyIpCisgICAgICAgIHRlc3QobG9uZygnYmUnLCAxNiksICJ4IiwgImJlIikKKyAgICAgICAgdGVzdChsb25nKCdiZScsIDE2KSwgIlgiLCAiQkUiKQorICAgICAgICB0ZXN0KC1sb25nKCdiZScsIDE2KSwgIngiLCAiLWJlIikKKyAgICAgICAgdGVzdCgtbG9uZygnYmUnLCAxNiksICJYIiwgIi1CRSIpCisKKyAgICAgICAgIyBvY3RhbAorICAgICAgICB0ZXN0KDNMLCAibyIsICIzIikKKyAgICAgICAgdGVzdCgtM0wsICJvIiwgIi0zIikKKyAgICAgICAgdGVzdCg2NUwsICJvIiwgIjEwMSIpCisgICAgICAgIHRlc3QoLTY1TCwgIm8iLCAiLTEwMSIpCisgICAgICAgIHRlc3QoMTIzNEwsICJvIiwgIjIzMjIiKQorICAgICAgICB0ZXN0KC0xMjM0TCwgIm8iLCAiLTIzMjIiKQorICAgICAgICB0ZXN0KDEyMzRMLCAiLW8iLCAiMjMyMiIpCisgICAgICAgIHRlc3QoLTEyMzRMLCAiLW8iLCAiLTIzMjIiKQorICAgICAgICB0ZXN0KDEyMzRMLCAiIG8iLCAiIDIzMjIiKQorICAgICAgICB0ZXN0KC0xMjM0TCwgIiBvIiwgIi0yMzIyIikKKyAgICAgICAgdGVzdCgxMjM0TCwgIitvIiwgIisyMzIyIikKKyAgICAgICAgdGVzdCgtMTIzNEwsICIrbyIsICItMjMyMiIpCisKKyAgICAgICAgIyBiaW5hcnkKKyAgICAgICAgdGVzdCgzTCwgImIiLCAiMTEiKQorICAgICAgICB0ZXN0KC0zTCwgImIiLCAiLTExIikKKyAgICAgICAgdGVzdCgxMjM0TCwgImIiLCAiMTAwMTEwMTAwMTAiKQorICAgICAgICB0ZXN0KC0xMjM0TCwgImIiLCAiLTEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgxMjM0TCwgIi1iIiwgIjEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgtMTIzNEwsICItYiIsICItMTAwMTEwMTAwMTAiKQorICAgICAgICB0ZXN0KDEyMzRMLCAiIGIiLCAiIDEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgtMTIzNEwsICIgYiIsICItMTAwMTEwMTAwMTAiKQorICAgICAgICB0ZXN0KDEyMzRMLCAiK2IiLCAiKzEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgtMTIzNEwsICIrYiIsICItMTAwMTEwMTAwMTAiKQorCisgICAgICAgICMgbWFrZSBzdXJlIHRoZXNlIGFyZSBlcnJvcnMKKworICAgICAgICAjIHByZWNpc2lvbiBkaXNhbGxvd2VkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIDNMIC5fX2Zvcm1hdF9fLCAiMS4zIikKKyAgICAgICAgIyBzaWduIG5vdCBhbGxvd2VkIHdpdGggJ2MnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIDNMIC5fX2Zvcm1hdF9fLCAiK2MiKQorICAgICAgICAjIGZvcm1hdCBzcGVjIG11c3QgYmUgc3RyaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgM0wgLl9fZm9ybWF0X18sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgM0wgLl9fZm9ybWF0X18sIDApCisgICAgICAgICMgYWx0ZXJuYXRlIHNwZWNpZmllciBpbiB3cm9uZyBwbGFjZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAxTCAuX19mb3JtYXRfXywgIiMrNXgiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAxTCAuX19mb3JtYXRfXywgIis1I3giKQorCisgICAgICAgICMgZW5zdXJlIHRoYXQgb25seSBpbnQgYW5kIGZsb2F0IHR5cGUgc3BlY2lmaWVycyB3b3JrCisgICAgICAgIGZvciBmb3JtYXRfc3BlYyBpbiAoW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJ2EnKSwgb3JkKCd6JykrMSldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnQScpLCBvcmQoJ1onKSsxKV0pOgorICAgICAgICAgICAgaWYgbm90IGZvcm1hdF9zcGVjIGluICdiY2RveFhlRWZGZ0duJSc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgMEwgLl9fZm9ybWF0X18sIGZvcm1hdF9zcGVjKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIDFMIC5fX2Zvcm1hdF9fLCBmb3JtYXRfc3BlYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAoLTFMKSAuX19mb3JtYXRfXywgZm9ybWF0X3NwZWMpCisKKyAgICAgICAgIyBlbnN1cmUgdGhhdCBmbG9hdCB0eXBlIHNwZWNpZmllcnMgd29yazsgZm9ybWF0IGNvbnZlcnRzCisgICAgICAgICMgIHRoZSBsb25nIHRvIGEgZmxvYXQKKyAgICAgICAgZm9yIGZvcm1hdF9zcGVjIGluICdlRWZGZ0clJzoKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiBbMEwsIDFMLCAtMUwsIDEwMEwsIC0xMDBMLCAxMjM0NTY3ODkwTCwgLTEyMzQ1Njc4OTBMXToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLl9fZm9ybWF0X18oZm9ybWF0X3NwZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQodmFsdWUpLl9fZm9ybWF0X18oZm9ybWF0X3NwZWMpKQorICAgICAgICAjIElzc3VlIDY5MDIKKyAgICAgICAgdGVzdCgxMjM0NTZMLCAiMDwyMCIsICcxMjM0NTYwMDAwMDAwMDAwMDAwMCcpCisgICAgICAgIHRlc3QoMTIzNDU2TCwgIjE8MjAiLCAnMTIzNDU2MTExMTExMTExMTExMTEnKQorICAgICAgICB0ZXN0KDEyMzQ1NkwsICIqPDIwIiwgJzEyMzQ1NioqKioqKioqKioqKioqJykKKyAgICAgICAgdGVzdCgxMjM0NTZMLCAiMD4yMCIsICcwMDAwMDAwMDAwMDAwMDEyMzQ1NicpCisgICAgICAgIHRlc3QoMTIzNDU2TCwgIjE+MjAiLCAnMTExMTExMTExMTExMTExMjM0NTYnKQorICAgICAgICB0ZXN0KDEyMzQ1NkwsICIqPjIwIiwgJyoqKioqKioqKioqKioqMTIzNDU2JykKKyAgICAgICAgdGVzdCgxMjM0NTZMLCAiMD0yMCIsICcwMDAwMDAwMDAwMDAwMDEyMzQ1NicpCisgICAgICAgIHRlc3QoMTIzNDU2TCwgIjE9MjAiLCAnMTExMTExMTExMTExMTExMjM0NTYnKQorICAgICAgICB0ZXN0KDEyMzQ1NkwsICIqPTIwIiwgJyoqKioqKioqKioqKioqMTIzNDU2JykKKworICAgIEBydW5fd2l0aF9sb2NhbGUoJ0xDX05VTUVSSUMnLCAnZW5fVVMuVVRGOCcpCisgICAgZGVmIHRlc3RfZmxvYXRfX2Zvcm1hdF9fbG9jYWxlKHNlbGYpOgorICAgICAgICAjIHRlc3QgbG9jYWxlIHN1cHBvcnQgZm9yIF9fZm9ybWF0X18gY29kZSAnbicKKworICAgICAgICBmb3IgaSBpbiByYW5nZSgtMTAsIDEwKToKKyAgICAgICAgICAgIHggPSAxMjM0NTY3ODkwLjAgKiAoMTAuMCAqKiBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NhbGUuZm9ybWF0KCclZycsIHgsIGdyb3VwaW5nPVRydWUpLCBmb3JtYXQoeCwgJ24nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWxlLmZvcm1hdCgnJS4xMGcnLCB4LCBncm91cGluZz1UcnVlKSwgZm9ybWF0KHgsICcuMTBuJykpCisKKyAgICBAcnVuX3dpdGhfbG9jYWxlKCdMQ19OVU1FUklDJywgJ2VuX1VTLlVURjgnKQorICAgIGRlZiB0ZXN0X2ludF9fZm9ybWF0X19sb2NhbGUoc2VsZik6CisgICAgICAgICMgdGVzdCBsb2NhbGUgc3VwcG9ydCBmb3IgX19mb3JtYXRfXyBjb2RlICduJyBmb3IgaW50ZWdlcnMKKworICAgICAgICB4ID0gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIDMwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWxlLmZvcm1hdCgnJWQnLCB4LCBncm91cGluZz1UcnVlKSwgZm9ybWF0KHgsICduJykpCisKKyAgICAgICAgICAgICMgbW92ZSB0byB0aGUgbmV4dCBpbnRlZ2VyIHRvIHRlc3QKKyAgICAgICAgICAgIHggPSB4IC8vIDEwCisKKyAgICAgICAgcmZtdCA9ICI+MjBuIgorICAgICAgICBsZm10ID0gIjwyMG4iCisgICAgICAgIGNmbXQgPSAiXjIwbiIKKyAgICAgICAgZm9yIHggaW4gKDEyMzQsIDEyMzQ1LCAxMjM0NTYsIDEyMzQ1NjcsIDEyMzQ1Njc4LCAxMjM0NTY3ODksIDEyMzQ1Njc4OTAsIDEyMzQ1Njc4OTAwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGZvcm1hdCgwLCByZm10KSksIGxlbihmb3JtYXQoeCwgcmZtdCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZm9ybWF0KDAsIGxmbXQpKSwgbGVuKGZvcm1hdCh4LCBsZm10KSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmb3JtYXQoMCwgY2ZtdCkpLCBsZW4oZm9ybWF0KHgsIGNmbXQpKSkKKworICAgIGRlZiB0ZXN0X2Zsb2F0X19mb3JtYXRfXyhzZWxmKToKKyAgICAgICAgIyB0aGVzZSBzaG91bGQgYmUgcmV3cml0dGVuIHRvIHVzZSBib3RoIGZvcm1hdCh4LCBzcGVjKSBhbmQKKyAgICAgICAgIyB4Ll9fZm9ybWF0X18oc3BlYykKKworICAgICAgICBkZWYgdGVzdChmLCBmb3JtYXRfc3BlYywgcmVzdWx0KToKKyAgICAgICAgICAgIGFzc2VydCB0eXBlKGYpID09IGZsb2F0CisgICAgICAgICAgICBhc3NlcnQgdHlwZShmb3JtYXRfc3BlYykgPT0gc3RyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuX19mb3JtYXRfXyhmb3JtYXRfc3BlYyksIHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5fX2Zvcm1hdF9fKHVuaWNvZGUoZm9ybWF0X3NwZWMpKSwgcmVzdWx0KQorCisgICAgICAgIHRlc3QoMC4wLCAnZicsICcwLjAwMDAwMCcpCisKKyAgICAgICAgIyB0aGUgZGVmYXVsdCBpcyAnZycsIGV4Y2VwdCBmb3IgZW1wdHkgZm9ybWF0IHNwZWMKKyAgICAgICAgdGVzdCgwLjAsICcnLCAnMC4wJykKKyAgICAgICAgdGVzdCgwLjAxLCAnJywgJzAuMDEnKQorICAgICAgICB0ZXN0KDAuMDEsICdnJywgJzAuMDEnKQorCisgICAgICAgICMgdGVzdCBmb3IgaXNzdWUgMzQxMQorICAgICAgICB0ZXN0KDEuMjMsICcxJywgJzEuMjMnKQorICAgICAgICB0ZXN0KC0xLjIzLCAnMScsICctMS4yMycpCisgICAgICAgIHRlc3QoMS4yMywgJzFnJywgJzEuMjMnKQorICAgICAgICB0ZXN0KC0xLjIzLCAnMWcnLCAnLTEuMjMnKQorCisgICAgICAgIHRlc3QoIDEuMCwgJyBnJywgJyAxJykKKyAgICAgICAgdGVzdCgtMS4wLCAnIGcnLCAnLTEnKQorICAgICAgICB0ZXN0KCAxLjAsICcrZycsICcrMScpCisgICAgICAgIHRlc3QoLTEuMCwgJytnJywgJy0xJykKKyAgICAgICAgdGVzdCgxLjEyMzRlMjAwLCAnZycsICcxLjEyMzRlKzIwMCcpCisgICAgICAgIHRlc3QoMS4xMjM0ZTIwMCwgJ0cnLCAnMS4xMjM0RSsyMDAnKQorCisKKyAgICAgICAgdGVzdCgxLjAsICdmJywgJzEuMDAwMDAwJykKKworICAgICAgICB0ZXN0KC0xLjAsICdmJywgJy0xLjAwMDAwMCcpCisKKyAgICAgICAgdGVzdCggMS4wLCAnIGYnLCAnIDEuMDAwMDAwJykKKyAgICAgICAgdGVzdCgtMS4wLCAnIGYnLCAnLTEuMDAwMDAwJykKKyAgICAgICAgdGVzdCggMS4wLCAnK2YnLCAnKzEuMDAwMDAwJykKKyAgICAgICAgdGVzdCgtMS4wLCAnK2YnLCAnLTEuMDAwMDAwJykKKworICAgICAgICAjIFB5dGhvbiB2ZXJzaW9ucyA8PSAyLjYgc3dpdGNoZWQgZnJvbSAnZicgdG8gJ2cnIGZvcm1hdHRpbmcgZm9yCisgICAgICAgICMgdmFsdWVzIGxhcmdlciB0aGFuIDFlNTAuICBObyBsb25nZXIuCisgICAgICAgIGYgPSAxLjEyMzRlOTAKKyAgICAgICAgZm9yIGZtdCBpbiAnZicsICdGJzoKKyAgICAgICAgICAgICMgZG9uJ3QgZG8gYSBkaXJlY3QgZXF1YWxpdHkgY2hlY2ssIHNpbmNlIG9uIHNvbWUKKyAgICAgICAgICAgICMgcGxhdGZvcm1zIG9ubHkgdGhlIGZpcnN0IGZldyBkaWdpdHMgb2YgZHRvYQorICAgICAgICAgICAgIyB3aWxsIGJlIHJlbGlhYmxlCisgICAgICAgICAgICByZXN1bHQgPSBmLl9fZm9ybWF0X18oZm10KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgOTgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFstN10sICcuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmVzdWx0WzoxMl0sICgnMTEyMzQwMDAwMDAwJywgJzExMjMzOTk5OTk5OScpKQorICAgICAgICBmID0gMS4xMjM0ZTIwMAorICAgICAgICBmb3IgZm10IGluICdmJywgJ0YnOgorICAgICAgICAgICAgcmVzdWx0ID0gZi5fX2Zvcm1hdF9fKGZtdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdCksIDIwOCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0Wy03XSwgJy4nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihyZXN1bHRbOjEyXSwgKCcxMTIzNDAwMDAwMDAnLCAnMTEyMzM5OTk5OTk5JykpCisKKworICAgICAgICB0ZXN0KCAxLjAsICdlJywgJzEuMDAwMDAwZSswMCcpCisgICAgICAgIHRlc3QoLTEuMCwgJ2UnLCAnLTEuMDAwMDAwZSswMCcpCisgICAgICAgIHRlc3QoIDEuMCwgJ0UnLCAnMS4wMDAwMDBFKzAwJykKKyAgICAgICAgdGVzdCgtMS4wLCAnRScsICctMS4wMDAwMDBFKzAwJykKKyAgICAgICAgdGVzdCgxLjEyMzRlMjAsICdlJywgJzEuMTIzNDAwZSsyMCcpCisgICAgICAgIHRlc3QoMS4xMjM0ZTIwLCAnRScsICcxLjEyMzQwMEUrMjAnKQorCisgICAgICAgICMgTm8gZm9ybWF0IGNvZGUgbWVhbnMgdXNlIGcsIGJ1dCBtdXN0IGhhdmUgYSBkZWNpbWFsCisgICAgICAgICMgYW5kIGEgbnVtYmVyIGFmdGVyIHRoZSBkZWNpbWFsLiAgVGhpcyBpcyB0cmlja3ksIGJlY2F1c2UKKyAgICAgICAgIyBhIHRvdGFseSBlbXB0eSBmb3JtYXQgc3BlY2lmaWVyIG1lYW5zIHNvbWV0aGluZyBlbHNlLgorICAgICAgICAjIFNvLCBqdXN0IHVzZSBhIHNpZ24gZmxhZworICAgICAgICB0ZXN0KDFlMjAwLCAnK2cnLCAnKzFlKzIwMCcpCisgICAgICAgIHRlc3QoMWUyMDAsICcrJywgJysxZSsyMDAnKQorICAgICAgICB0ZXN0KDEuMWUyMDAsICcrZycsICcrMS4xZSsyMDAnKQorICAgICAgICB0ZXN0KDEuMWUyMDAsICcrJywgJysxLjFlKzIwMCcpCisKKyAgICAgICAgdGVzdCgxLjFlMjAwLCAnK2cnLCAnKzEuMWUrMjAwJykKKyAgICAgICAgdGVzdCgxLjFlMjAwLCAnKycsICcrMS4xZSsyMDAnKQorCisgICAgICAgICMgMCBwYWRkaW5nCisgICAgICAgIHRlc3QoMTIzNC4sICcwMTBmJywgJzEyMzQuMDAwMDAwJykKKyAgICAgICAgdGVzdCgxMjM0LiwgJzAxMWYnLCAnMTIzNC4wMDAwMDAnKQorICAgICAgICB0ZXN0KDEyMzQuLCAnMDEyZicsICcwMTIzNC4wMDAwMDAnKQorICAgICAgICB0ZXN0KC0xMjM0LiwgJzAxMWYnLCAnLTEyMzQuMDAwMDAwJykKKyAgICAgICAgdGVzdCgtMTIzNC4sICcwMTJmJywgJy0xMjM0LjAwMDAwMCcpCisgICAgICAgIHRlc3QoLTEyMzQuLCAnMDEzZicsICctMDEyMzQuMDAwMDAwJykKKyAgICAgICAgdGVzdCgtMTIzNC4xMjM0MTIzNCwgJzAxM2YnLCAnLTAxMjM0LjEyMzQxMicpCisgICAgICAgIHRlc3QoLTEyMzQ1Ni4xMjM0MTIzNCwgJzAxMS4yZicsICctMDEyMzQ1Ni4xMicpCisKKyAgICAgICAgIyBpc3N1ZSA1NzgyLCBjb21tYXMgd2l0aCBubyBzcGVjaWZpZXIgdHlwZQorICAgICAgICB0ZXN0KDEuMiwgJzAxMCwuMicsICcwLDAwMCwwMDEuMicpCisKKyAgICAgICAgIyAwIHBhZGRpbmcgd2l0aCBjb21tYXMKKyAgICAgICAgdGVzdCgxMjM0LiwgJzAxMSxmJywgJzEsMjM0LjAwMDAwMCcpCisgICAgICAgIHRlc3QoMTIzNC4sICcwMTIsZicsICcxLDIzNC4wMDAwMDAnKQorICAgICAgICB0ZXN0KDEyMzQuLCAnMDEzLGYnLCAnMDEsMjM0LjAwMDAwMCcpCisgICAgICAgIHRlc3QoLTEyMzQuLCAnMDEyLGYnLCAnLTEsMjM0LjAwMDAwMCcpCisgICAgICAgIHRlc3QoLTEyMzQuLCAnMDEzLGYnLCAnLTEsMjM0LjAwMDAwMCcpCisgICAgICAgIHRlc3QoLTEyMzQuLCAnMDE0LGYnLCAnLTAxLDIzNC4wMDAwMDAnKQorICAgICAgICB0ZXN0KC0xMjM0NS4sICcwMTUsZicsICctMDEyLDM0NS4wMDAwMDAnKQorICAgICAgICB0ZXN0KC0xMjM0NTYuLCAnMDE2LGYnLCAnLTAsMTIzLDQ1Ni4wMDAwMDAnKQorICAgICAgICB0ZXN0KC0xMjM0NTYuLCAnMDE3LGYnLCAnLTAsMTIzLDQ1Ni4wMDAwMDAnKQorICAgICAgICB0ZXN0KC0xMjM0NTYuMTIzNDEyMzQsICcwMTcsZicsICctMCwxMjMsNDU2LjEyMzQxMicpCisgICAgICAgIHRlc3QoLTEyMzQ1Ni4xMjM0MTIzNCwgJzAxMywuMmYnLCAnLTAsMTIzLDQ1Ni4xMicpCisKKyAgICAgICAgICMgJSBmb3JtYXR0aW5nCisgICAgICAgIHRlc3QoLTEuMCwgJyUnLCAnLTEwMC4wMDAwMDAlJykKKworICAgICAgICAjIGZvcm1hdCBzcGVjIG11c3QgYmUgc3RyaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgMy4wLl9fZm9ybWF0X18sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgMy4wLl9fZm9ybWF0X18sIDApCisKKyAgICAgICAgIyBvdGhlciBmb3JtYXQgc3BlY2lmaWVycyBzaG91bGRuJ3Qgd29yayBvbiBmbG9hdHMsCisgICAgICAgICMgIGluIHBhcnRpY3VsYXIgaW50IHNwZWNpZmllcnMKKyAgICAgICAgZm9yIGZvcm1hdF9zcGVjIGluIChbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnYScpLCBvcmQoJ3onKSsxKV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjaHIoeCkgZm9yIHggaW4gcmFuZ2Uob3JkKCdBJyksIG9yZCgnWicpKzEpXSk6CisgICAgICAgICAgICBpZiBub3QgZm9ybWF0X3NwZWMgaW4gJ2VFZkZnR24lJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIDAuMCwgZm9ybWF0X3NwZWMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAxLjAsIGZvcm1hdF9zcGVjKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgLTEuMCwgZm9ybWF0X3NwZWMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAxZTEwMCwgZm9ybWF0X3NwZWMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAtMWUxMDAsIGZvcm1hdF9zcGVjKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgMWUtMTAwLCBmb3JtYXRfc3BlYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIC0xZS0xMDAsIGZvcm1hdF9zcGVjKQorCisgICAgICAgICMgQWx0ZXJuYXRlIGZvcm1hdHRpbmcgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIDAuMCwgJyMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIDAuMCwgJyMyMGYnKQorCisgICAgICAgICMgSXNzdWUgNjkwMgorICAgICAgICB0ZXN0KDEyMzQ1LjYsICIwPDIwIiwgJzEyMzQ1LjYwMDAwMDAwMDAwMDAwJykKKyAgICAgICAgdGVzdCgxMjM0NS42LCAiMTwyMCIsICcxMjM0NS42MTExMTExMTExMTExMScpCisgICAgICAgIHRlc3QoMTIzNDUuNiwgIio8MjAiLCAnMTIzNDUuNioqKioqKioqKioqKionKQorICAgICAgICB0ZXN0KDEyMzQ1LjYsICIwPjIwIiwgJzAwMDAwMDAwMDAwMDAxMjM0NS42JykKKyAgICAgICAgdGVzdCgxMjM0NS42LCAiMT4yMCIsICcxMTExMTExMTExMTExMTIzNDUuNicpCisgICAgICAgIHRlc3QoMTIzNDUuNiwgIio+MjAiLCAnKioqKioqKioqKioqKjEyMzQ1LjYnKQorICAgICAgICB0ZXN0KDEyMzQ1LjYsICIwPTIwIiwgJzAwMDAwMDAwMDAwMDAxMjM0NS42JykKKyAgICAgICAgdGVzdCgxMjM0NS42LCAiMT0yMCIsICcxMTExMTExMTExMTExMTIzNDUuNicpCisgICAgICAgIHRlc3QoMTIzNDUuNiwgIio9MjAiLCAnKioqKioqKioqKioqKjEyMzQ1LjYnKQorCisgICAgZGVmIHRlc3RfZm9ybWF0X3NwZWNfZXJyb3JzKHNlbGYpOgorICAgICAgICAjIGludCwgZmxvYXQsIGFuZCBzdHJpbmcgYWxsIHNoYXJlIHRoZSBzYW1lIGZvcm1hdCBzcGVjCisgICAgICAgICMgbWluaS1sYW5ndWFnZSBwYXJzZXIuCisKKyAgICAgICAgIyBDaGVjayB0aGF0IHdlIGNhbid0IGFzayBmb3IgdG9vIG1hbnkgZGlnaXRzLiBUaGlzIGlzCisgICAgICAgICMgcHJvYmFibHkgYSBDUHl0aG9uIHNwZWNpZmljIHRlc3QuIEl0IHRyaWVzIHRvIHB1dCB0aGUgd2lkdGgKKyAgICAgICAgIyBpbnRvIGEgQyBsb25nLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIDAsICcxJyoxMDAwMCArICdkJykKKworICAgICAgICAjIFNpbWlsYXIgd2l0aCB0aGUgcHJlY2lzaW9uLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIDAsICcuJyArICcxJyoxMDAwMCArICdkJykKKworICAgICAgICAjIEFuZCBtYXkgYXMgd2VsbCB0ZXN0IGJvdGguCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgMCwgJzEnKjEwMDAgKyAnLicgKyAnMScqMTAwMDAgKyAnZCcpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgY29tbWFzIGFyZW4ndCBhbGxvd2VkIHdpdGggdmFyaW91cyB0eXBlIGNvZGVzCisgICAgICAgIGZvciBjb2RlIGluICd4WG9ibnMnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAwLCAnLCcgKyBjb2RlKQorCisgICAgZGVmIHRlc3RfaW50ZXJuYWxfc2l6ZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihvYmplY3QuX19iYXNpY3NpemVfXywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKHR1cGxlLl9faXRlbXNpemVfXywgMCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgKCJidWZmZXIuLiBub3Qgc3VwcG9ydGVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICgiY2xhc3NpYyBsb25nIGRpdmlzaW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHJ1bl91bml0dGVzdChUeXBlc1Rlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhOGYzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R5cGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRmZjE1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R5cGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91Y24ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91Y24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhNGYwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Vjbi5weQpAQCAtMCwwICsxLDE2NyBAQAorIiIiIFRlc3Qgc2NyaXB0IGZvciB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbi4KKworV3JpdHRlbiBieSBCaWxsIFR1dHQuCitNb2RpZmllZCBmb3IgUHl0aG9uIDIuMCBieSBGcmVkcmlrIEx1bmRoIChmcmVkcmlrQHB5dGhvbndhcmUuY29tKQorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIjIgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBfdGVzdGNhcGkKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgVW5pY29kZU5hbWVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2tsZXR0ZXIoc2VsZiwgbmFtZSwgY29kZSk6CisgICAgICAgICMgSGVscGVyIHRoYXQgcHV0IGFsbCBcTiBlc2NhcGVzIGluc2lkZSBldmFsJ2QgcmF3IHN0cmluZ3MsCisgICAgICAgICMgdG8gbWFrZSBzdXJlIHRoaXMgc2NyaXB0IHJ1bnMgZXZlbiBpZiB0aGUgY29tcGlsZXIKKyAgICAgICAgIyBjaG9rZXMgb24gXE4gZXNjYXBlcworICAgICAgICByZXMgPSBldmFsKHVyJ3UiXE57JXN9IicgJSBuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgY29kZSkKKyAgICAgICAgcmV0dXJuIHJlcworCisgICAgZGVmIHRlc3RfZ2VuZXJhbChzZWxmKToKKyAgICAgICAgIyBHZW5lcmFsIGFuZCBjYXNlIGluc2Vuc2l0aXZpdHkgdGVzdDoKKyAgICAgICAgY2hhcnMgPSBbCisgICAgICAgICAgICAiTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCIsCisgICAgICAgICAgICAiTEFUSU4gU01BTEwgTEVUVEVSIEgiLAorICAgICAgICAgICAgIkxBVElOIFNNQUxMIExFVFRFUiBFIiwKKyAgICAgICAgICAgICJTUEFDRSIsCisgICAgICAgICAgICAiTEFUSU4gU01BTEwgTEVUVEVSIFIiLAorICAgICAgICAgICAgIkxBVElOIENBUElUQUwgTEVUVEVSIEUiLAorICAgICAgICAgICAgIkxBVElOIFNNQUxMIExFVFRFUiBEIiwKKyAgICAgICAgICAgICJTUEFDRSIsCisgICAgICAgICAgICAiTEFUSU4gU01BTEwgTEVUVEVSIGYiLAorICAgICAgICAgICAgIkxBVElOIENBUElUQUwgTGVUdEVyIG8iLAorICAgICAgICAgICAgIkxBVElOIFNNYUxsIExFVFRFUiB4IiwKKyAgICAgICAgICAgICJTUEFDRSIsCisgICAgICAgICAgICAiTEFUSU4gU01BTEwgTEVUVEVSIEEiLAorICAgICAgICAgICAgIkxBVElOIFNNQUxMIExFVFRFUiBUIiwKKyAgICAgICAgICAgICJMQVRJTiBTTUFMTCBMRVRURVIgRSIsCisgICAgICAgICAgICAiU1BBQ0UiLAorICAgICAgICAgICAgIkxBVElOIFNNQUxMIExFVFRFUiBUIiwKKyAgICAgICAgICAgICJMQVRJTiBTTUFMTCBMRVRURVIgSCIsCisgICAgICAgICAgICAiTEFUSU4gU01BTEwgTEVUVEVSIEUiLAorICAgICAgICAgICAgIlNwQWNFIiwKKyAgICAgICAgICAgICJMQVRJTiBTTUFMTCBMRVRURVIgUyIsCisgICAgICAgICAgICAiTEFUSU4gU01BTEwgTEVUVEVSIEgiLAorICAgICAgICAgICAgIkxBVElOIHNtYWxsIExFVFRFUiBlIiwKKyAgICAgICAgICAgICJMQVRJTiBzbWFsbCBMRVRURVIgZSIsCisgICAgICAgICAgICAiTEFUSU4gU01BTEwgTEVUVEVSIFAiLAorICAgICAgICAgICAgIkZVTEwgU1RPUCIKKyAgICAgICAgXQorICAgICAgICBzdHJpbmcgPSB1IlRoZSByRWQgZk94IGF0ZSB0aGUgc2hlZXAuIgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1IiIuam9pbihbc2VsZi5jaGVja2xldHRlcigqYXJncykgZm9yIGFyZ3MgaW4gemlwKGNoYXJzLCBzdHJpbmcpXSksCisgICAgICAgICAgICBzdHJpbmcKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYXNjaWlfbGV0dGVycyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHVuaWNvZGVkYXRhCisKKyAgICAgICAgZm9yIGNoYXIgaW4gIiIuam9pbihtYXAoY2hyLCB4cmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKSkpOgorICAgICAgICAgICAgbmFtZSA9ICJMQVRJTiBTTUFMTCBMRVRURVIgJXMiICUgY2hhci51cHBlcigpCisgICAgICAgICAgICBjb2RlID0gdW5pY29kZWRhdGEubG9va3VwKG5hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGVkYXRhLm5hbWUoY29kZSksIG5hbWUpCisKKyAgICBkZWYgdGVzdF9oYW5ndWxfc3lsbGFibGVzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJIQU5HVUwgU1lMTEFCTEUgR0EiLCB1Ilx1YWMwMCIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkhBTkdVTCBTWUxMQUJMRSBHR1dFT1NTIiwgdSJcdWFmZTgiKQorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJIQU5HVUwgU1lMTEFCTEUgRE9MUyIsIHUiXHViM2QwIikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiSEFOR1VMIFNZTExBQkxFIFJZQU4iLCB1Ilx1YjdiOCIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkhBTkdVTCBTWUxMQUJMRSBNV0lLIiwgdSJcdWJiYTAiKQorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJIQU5HVUwgU1lMTEFCTEUgQkJXQUVNIiwgdSJcdWJmODgiKQorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJIQU5HVUwgU1lMTEFCTEUgU1NFT0wiLCB1Ilx1YzM3MCIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkhBTkdVTCBTWUxMQUJMRSBZSSIsIHUiXHVjNzU4IikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiSEFOR1VMIFNZTExBQkxFIEpKWU9TUyIsIHUiXHVjYjQwIikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiSEFOR1VMIFNZTExBQkxFIEtZRU9MUyIsIHUiXHVjZjI4IikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiSEFOR1VMIFNZTExBQkxFIFBBTiIsIHUiXHVkMzEwIikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiSEFOR1VMIFNZTExBQkxFIEhXRU9LIiwgdSJcdWQ2ZjgiKQorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJIQU5HVUwgU1lMTEFCTEUgSElIIiwgdSJcdWQ3YTMiKQorCisgICAgICAgIGltcG9ydCB1bmljb2RlZGF0YQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1bmljb2RlZGF0YS5uYW1lLCB1Ilx1ZDdhNCIpCisKKyAgICBkZWYgdGVzdF9jamtfdW5pZmllZF9pZGVvZ3JhcGhzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJDSksgVU5JRklFRCBJREVPR1JBUEgtMzQwMCIsIHUiXHUzNDAwIikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiQ0pLIFVOSUZJRUQgSURFT0dSQVBILTREQjUiLCB1Ilx1NGRiNSIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkNKSyBVTklGSUVEIElERU9HUkFQSC00RTAwIiwgdSJcdTRlMDAiKQorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJDSksgVU5JRklFRCBJREVPR1JBUEgtOUZBNSIsIHUiXHU5ZmE1IikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiQ0pLIFVOSUZJRUQgSURFT0dSQVBILTIwMDAwIiwgdSJcVTAwMDIwMDAwIikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiQ0pLIFVOSUZJRUQgSURFT0dSQVBILTJBNkQ2IiwgdSJcVTAwMDJhNmQ2IikKKworICAgIGRlZiB0ZXN0X2JtcF9jaGFyYWN0ZXJzKHNlbGYpOgorICAgICAgICBpbXBvcnQgdW5pY29kZWRhdGEKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGZvciBjb2RlIGluIHhyYW5nZSgweDEwMDAwKToKKyAgICAgICAgICAgIGNoYXIgPSB1bmljaHIoY29kZSkKKyAgICAgICAgICAgIG5hbWUgPSB1bmljb2RlZGF0YS5uYW1lKGNoYXIsIE5vbmUpCisgICAgICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZWRhdGEubG9va3VwKG5hbWUpLCBjaGFyKQorICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKworICAgIGRlZiB0ZXN0X21pc2Nfc3ltYm9scyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiUElMQ1JPVyBTSUdOIiwgdSJcdTAwYjYiKQorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJSRVBMQUNFTUVOVCBDSEFSQUNURVIiLCB1Ilx1RkZGRCIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkhBTEZXSURUSCBLQVRBS0FOQSBTRU1JLVZPSUNFRCBTT1VORCBNQVJLIiwgdSJcdUZGOUYiKQorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJGVUxMV0lEVEggTEFUSU4gU01BTEwgTEVUVEVSIEEiLCB1Ilx1RkY0MSIpCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIGltcG9ydCB1bmljb2RlZGF0YQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHVuaWNvZGVkYXRhLm5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdW5pY29kZWRhdGEubmFtZSwgdSd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdW5pY29kZWRhdGEubG9va3VwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgdW5pY29kZWRhdGEubG9va3VwLCB1J3Vua25vd24nKQorCisgICAgZGVmIHRlc3Rfc3RyaWN0X2Vyb3JfaGFuZGxpbmcoc2VsZik6CisgICAgICAgICMgYm9ndXMgY2hhcmFjdGVyIG5hbWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBVbmljb2RlRXJyb3IsCisgICAgICAgICAgICB1bmljb2RlLCAiXFxOe2JsYWh9IiwgJ3VuaWNvZGUtZXNjYXBlJywgJ3N0cmljdCcKKyAgICAgICAgKQorICAgICAgICAjIGxvbmcgYm9ndXMgY2hhcmFjdGVyIG5hbWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBVbmljb2RlRXJyb3IsCisgICAgICAgICAgICB1bmljb2RlLCAiXFxOeyVzfSIgJSAoIngiICogMTAwMDAwKSwgJ3VuaWNvZGUtZXNjYXBlJywgJ3N0cmljdCcKKyAgICAgICAgKQorICAgICAgICAjIG1pc3NpbmcgY2xvc2luZyBicmFjZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFVuaWNvZGVFcnJvciwKKyAgICAgICAgICAgIHVuaWNvZGUsICJcXE57U1BBQ0UiLCAndW5pY29kZS1lc2NhcGUnLCAnc3RyaWN0JworICAgICAgICApCisgICAgICAgICMgbWlzc2luZyBvcGVuaW5nIGJyYWNlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgVW5pY29kZUVycm9yLAorICAgICAgICAgICAgdW5pY29kZSwgIlxcTlNQQUNFIiwgJ3VuaWNvZGUtZXNjYXBlJywgJ3N0cmljdCcKKyAgICAgICAgKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoX3Rlc3RjYXBpLklOVF9NQVggPCBfdGVzdGNhcGkuUFlfU1NJWkVfVF9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWRzIFVJTlRfTUFYIDwgU0laRV9NQVgiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKF90ZXN0Y2FwaS5VSU5UX01BWCA8IHN5cy5tYXhpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5lZWRzIFVJTlRfTUFYIDwgc3lzLm1heGludCIpCisgICAgQHRlc3Rfc3VwcG9ydC5iaWdtZW10ZXN0KG1pbnNpemU9X3Rlc3RjYXBpLlVJTlRfTUFYICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtdXNlPTIgKyA0IC8vIGxlbih1J1xVMDAwMTAwMDAnKSkKKyAgICBkZWYgdGVzdF9pc3N1ZTE2MzM1KHNlbGYsIHNpemUpOgorICAgICAgICBmdW5jID0gc2VsZi50ZXN0X2lzc3VlMTYzMzUKKyAgICAgICAgaWYgc2l6ZSA8IGZ1bmMubWluc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJub3QgZW5vdWdoIG1lbW9yeTogJS4xZkcgbWluaW11bSBuZWVkZWQiICUKKyAgICAgICAgICAgICAgICAgICAgKGZ1bmMubWluc2l6ZSAqIGZ1bmMubWVtdXNlIC8gZmxvYXQoMTAyNCoqMyksKSkKKyAgICAgICAgIyB2ZXJ5IHZlcnkgbG9uZyBib2d1cyBjaGFyYWN0ZXIgbmFtZQorICAgICAgICB4ID0gYidcXE57U1BBQ0UnICsgYid4JyAqIGludChfdGVzdGNhcGkuVUlOVF9NQVggKyAxKSArIGInfScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oeCksIGxlbihiJ1xcTntTUEFDRX0nKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX3Rlc3RjYXBpLlVJTlRfTUFYICsgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFVuaWNvZGVFcnJvciwKKyAgICAgICAgICAgICd1bmtub3duIFVuaWNvZGUgY2hhcmFjdGVyIG5hbWUnLAorICAgICAgICAgICAgeC5kZWNvZGUsICd1bmljb2RlLWVzY2FwZScKKyAgICAgICAgKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFVuaWNvZGVOYW1lc1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Vjbi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91Y24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjVhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91Y24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Vjbi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91Y24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMjVhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91Y24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuYXJ5LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5hcnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4ZmNhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuYXJ5LnB5CkBAIC0wLDAgKzEsNTkgQEAKKyIiIlRlc3QgY29tcGlsZXIgY2hhbmdlcyBmb3IgdW5hcnkgb3BzICgrLCAtLCB+KSBpbnRyb2R1Y2VkIGluIFB5dGhvbiAyLjIiIiIKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGhhdmVfdW5pY29kZQorCitjbGFzcyBVbmFyeU9wVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbmVnYXRpdmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMiA9PSAwIC0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC0wID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtLTIgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC0yTCA9PSAwIC0gMkwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMi4wID09IDAgLSAyLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMmogPT0gMCAtIDJqKQorCisgICAgZGVmIHRlc3RfcG9zaXRpdmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgrMiA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKzAgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCsrMiA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKzJMID09IDJMKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKzIuMCA9PSAyLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgrMmogPT0gMmopCisKKyAgICBkZWYgdGVzdF9pbnZlcnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMiA9PSAwIC0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC0wID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtLTIgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC0yTCA9PSAwIC0gMkwpCisKKyAgICBkZWYgdGVzdF9ub19vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgbmluZXMgPSAiOSIgKiAzMgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXZhbCgiKyIgKyBuaW5lcykgPT0gZXZhbCgiKyIgKyBuaW5lcyArICJMIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldmFsKCItIiArIG5pbmVzKSA9PSBldmFsKCItIiArIG5pbmVzICsgIkwiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoIn4iICsgbmluZXMpID09IGV2YWwoIn4iICsgbmluZXMgKyAiTCIpKQorCisgICAgZGVmIHRlc3RfbmVnYXRpb25fb2ZfZXhwb25lbnRpYXRpb24oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlICcqKicgZG9lcyB0aGUgcmlnaHQgdGhpbmc7IHRoZXNlIGZvcm0gYQorICAgICAgICAjIHJlZ3Jlc3Npb24gdGVzdCBmb3IgU291cmNlRm9yZ2UgYnVnICM0NTY3NTYuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTIgKiogMywgLTgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC0yKSAqKiAzLCAtOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMiAqKiA0LCAtMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC0yKSAqKiA0LCAxNikKKworICAgIGRlZiB0ZXN0X2JhZF90eXBlcyhzZWxmKToKKyAgICAgICAgZm9yIG9wIGluICcrJywgJy0nLCAnfic6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsIG9wICsgIidhJyIpCisgICAgICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCBvcCArICJ1J2EnIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICJ+MmoiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICJ+Mi4wIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFVuYXJ5T3BUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmFyeS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmFyeS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiZGU4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuYXJ5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmFyeS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmFyeS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiZGU4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuYXJ5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmRvY3VtZW50ZWRfZGV0YWlscy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuZG9jdW1lbnRlZF9kZXRhaWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmMyODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmRvY3VtZW50ZWRfZGV0YWlscy5weQpAQCAtMCwwICsxLDM5IEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNoZWNrX3B5M2tfd2FybmluZ3MKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBUZXN0SW1wbGVtZW50YXRpb25Db21wYXJpc29ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF90eXBlX2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyIDwgaW50IG9yIHN0ciA+IGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludCA8PSBzdHIgb3IgaW50ID49IHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtcChpbnQsIHN0cikgIT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludCBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIgPT0gc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50ICE9IHN0cikKKworICAgIGRlZiB0ZXN0X2NlbGxfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgaWYgeDoKKyAgICAgICAgICAgICAgICB5ID0gMQorICAgICAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgZGVmIGgoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geQorICAgICAgICAgICAgcmV0dXJuIGcsIGgKKyAgICAgICAgZywgaCA9IGYoMCkKKyAgICAgICAgZ19jZWxsLCA9IGcuZnVuY19jbG9zdXJlCisgICAgICAgIGhfY2VsbCwgPSBoLmZ1bmNfY2xvc3VyZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaF9jZWxsIDwgZ19jZWxsKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ19jZWxsID49IGhfY2VsbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZ19jZWxsLCBoX2NlbGwpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ19jZWxsIGlzIGdfY2VsbCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdfY2VsbCA9PSBnX2NlbGwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoX2NlbGwgPT0gaF9jZWxsKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ19jZWxsICE9IGhfY2VsbCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICBydW5fdW5pdHRlc3QoVGVzdEltcGxlbWVudGF0aW9uQ29tcGFyaXNvbnMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuZG9jdW1lbnRlZF9kZXRhaWxzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuZG9jdW1lbnRlZF9kZXRhaWxzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDUzNDQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5kb2N1bWVudGVkX2RldGFpbHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuZG9jdW1lbnRlZF9kZXRhaWxzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuZG9jdW1lbnRlZF9kZXRhaWxzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDUzNDQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5kb2N1bWVudGVkX2RldGFpbHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NGZlMDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlLnB5CkBAIC0wLDAgKzEsMTY2NiBAQAorIiIiIFRlc3Qgc2NyaXB0IGZvciB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbi4KKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisKKyIiIiMiCitpbXBvcnQgc3lzCitpbXBvcnQgc3RydWN0CitpbXBvcnQgY29kZWNzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCBzdHJpbmdfdGVzdHMKKworIyBkZWNvcmF0b3IgdG8gc2tpcCB0ZXN0cyBvbiBuYXJyb3cgYnVpbGRzCityZXF1aXJlc193aWRlX2J1aWxkID0gdW5pdHRlc3Quc2tpcElmKHN5cy5tYXh1bmljb2RlID09IDY1NTM1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVxdWlyZXMgd2lkZSBidWlsZCcpCisKKyMgRXJyb3IgaGFuZGxpbmcgKGJhZCBkZWNvZGVyIHJldHVybikKK2RlZiBzZWFyY2hfZnVuY3Rpb24oZW5jb2RpbmcpOgorICAgIGRlZiBkZWNvZGUxKGlucHV0LCBlcnJvcnM9InN0cmljdCIpOgorICAgICAgICByZXR1cm4gNDIgIyBub3QgYSB0dXBsZQorICAgIGRlZiBlbmNvZGUxKGlucHV0LCBlcnJvcnM9InN0cmljdCIpOgorICAgICAgICByZXR1cm4gNDIgIyBub3QgYSB0dXBsZQorICAgIGRlZiBlbmNvZGUyKGlucHV0LCBlcnJvcnM9InN0cmljdCIpOgorICAgICAgICByZXR1cm4gKDQyLCA0MikgIyBubyB1bmljb2RlCisgICAgZGVmIGRlY29kZTIoaW5wdXQsIGVycm9ycz0ic3RyaWN0Iik6CisgICAgICAgIHJldHVybiAoNDIsIDQyKSAjIG5vIHVuaWNvZGUKKyAgICBpZiBlbmNvZGluZz09InRlc3QudW5pY29kZTEiOgorICAgICAgICByZXR1cm4gKGVuY29kZTEsIGRlY29kZTEsIE5vbmUsIE5vbmUpCisgICAgZWxpZiBlbmNvZGluZz09InRlc3QudW5pY29kZTIiOgorICAgICAgICByZXR1cm4gKGVuY29kZTIsIGRlY29kZTIsIE5vbmUsIE5vbmUpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUKK2NvZGVjcy5yZWdpc3RlcihzZWFyY2hfZnVuY3Rpb24pCisKK2NsYXNzIFVuaWNvZGVUZXN0KAorICAgIHN0cmluZ190ZXN0cy5Db21tb25UZXN0LAorICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clVuaWNvZGVVc2VyU3RyaW5nVGVzdCwKKyAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVbmljb2RlVGVzdCwKKyAgICApOgorICAgIHR5cGUydGVzdCA9IHVuaWNvZGUKKworICAgIGRlZiBhc3NlcnRFcXVhbChzZWxmLCBmaXJzdCwgc2Vjb25kLCBtc2c9Tm9uZSk6CisgICAgICAgICMgc3RyaWN0IGFzc2VydEVxdWFsIG1ldGhvZDogcmVqZWN0IGltcGxpY2l0IGJ5dGVzL3VuaWNvZGUgZXF1YWxpdHkKKyAgICAgICAgc3VwZXIoVW5pY29kZVRlc3QsIHNlbGYpLmFzc2VydEVxdWFsKGZpcnN0LCBzZWNvbmQsIG1zZykKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmaXJzdCwgdW5pY29kZSkgb3IgaXNpbnN0YW5jZShzZWNvbmQsIHVuaWNvZGUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpcnN0LCB1bmljb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlY29uZCwgdW5pY29kZSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGZpcnN0LCBzdHIpIG9yIGlzaW5zdGFuY2Uoc2Vjb25kLCBzdHIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpcnN0LCBzdHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2Vjb25kLCBzdHIpCisKKyAgICBkZWYgY2hlY2tlcXVhbG5vZml4KHNlbGYsIHJlc3VsdCwgb2JqZWN0LCBtZXRob2RuYW1lLCAqYXJncyk6CisgICAgICAgIG1ldGhvZCA9IGdldGF0dHIob2JqZWN0LCBtZXRob2RuYW1lKQorICAgICAgICByZWFscmVzdWx0ID0gbWV0aG9kKCphcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxyZXN1bHQsIHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocmVhbHJlc3VsdCkgaXMgdHlwZShyZXN1bHQpKQorCisgICAgICAgICMgaWYgdGhlIG9yaWdpbmFsIGlzIHJldHVybmVkIG1ha2Ugc3VyZSB0aGF0CisgICAgICAgICMgdGhpcyBkb2Vzbid0IGhhcHBlbiB3aXRoIHN1YmNsYXNzZXMKKyAgICAgICAgaWYgcmVhbHJlc3VsdCBpcyBvYmplY3Q6CisgICAgICAgICAgICBjbGFzcyB1c3ViKHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd1c3ViKCVyKScgJSB1bmljb2RlLl9fcmVwcl9fKHNlbGYpCisgICAgICAgICAgICBvYmplY3QgPSB1c3ViKG9iamVjdCkKKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIob2JqZWN0LCBtZXRob2RuYW1lKQorICAgICAgICAgICAgcmVhbHJlc3VsdCA9IG1ldGhvZCgqYXJncykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHJlc3VsdCwgcmVzdWx0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9iamVjdCBpcyBub3QgcmVhbHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X2xpdGVyYWxzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHhmZicsIHUnXHUwMGZmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1ZmZmZicsIHUnXFUwMDAwZmZmZicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAndVwnXFxVZmZmZmZmZmVcJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAndVwnXFxVZmZmZmZmZmZcJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAndVwnXFxVJTA4eFwnJyAlIDB4MTEwMDAwKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgICAgICAgICAjIFRlc3QgYmFzaWMgc2FuaXR5IG9mIHJlcHIoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUnYWJjJyksICJ1J2FiYyciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUnYWJcXGMnKSwgInUnYWJcXFxcYyciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUnYWJcXCcpLCAidSdhYlxcXFwnIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1J1xcYycpLCAidSdcXFxcYyciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUnXFwnKSwgInUnXFxcXCciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUnXG4nKSwgInUnXFxuJyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodSdccicpLCAidSdcXHInIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1J1x0JyksICJ1J1xcdCciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUnXGInKSwgInUnXFx4MDgnIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1IidcIiIpLCAiIiJ1J1xcJyInIiIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUiJ1wiIiksICIiInUnXFwnIiciIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodSInIiksICcnJ3UiJyInJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodSciJyksICIiInUnIiciIiIpCisgICAgICAgICAgICBsYXRpbjFyZXByID0gKAorICAgICAgICAgICAgICAgICJ1J1xceDAwXFx4MDFcXHgwMlxceDAzXFx4MDRcXHgwNVxceDA2XFx4MDdcXHgwOFxcdFxcblxceDBiXFx4MGNcXHIiCisgICAgICAgICAgICAgICAgIlxceDBlXFx4MGZcXHgxMFxceDExXFx4MTJcXHgxM1xceDE0XFx4MTVcXHgxNlxceDE3XFx4MThcXHgxOVxceDFhIgorICAgICAgICAgICAgICAgICJcXHgxYlxceDFjXFx4MWRcXHgxZVxceDFmICFcIiMkJSZcXCcoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJIgorICAgICAgICAgICAgICAgICJKS0xNTk9QUVJTVFVWV1hZWltcXFxcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9flxceDdmIgorICAgICAgICAgICAgICAgICJcXHg4MFxceDgxXFx4ODJcXHg4M1xceDg0XFx4ODVcXHg4NlxceDg3XFx4ODhcXHg4OVxceDhhXFx4OGJcXHg4Y1xceDhkIgorICAgICAgICAgICAgICAgICJcXHg4ZVxceDhmXFx4OTBcXHg5MVxceDkyXFx4OTNcXHg5NFxceDk1XFx4OTZcXHg5N1xceDk4XFx4OTlcXHg5YVxceDliIgorICAgICAgICAgICAgICAgICJcXHg5Y1xceDlkXFx4OWVcXHg5ZlxceGEwXFx4YTFcXHhhMlxceGEzXFx4YTRcXHhhNVxceGE2XFx4YTdcXHhhOFxceGE5IgorICAgICAgICAgICAgICAgICJcXHhhYVxceGFiXFx4YWNcXHhhZFxceGFlXFx4YWZcXHhiMFxceGIxXFx4YjJcXHhiM1xceGI0XFx4YjVcXHhiNlxceGI3IgorICAgICAgICAgICAgICAgICJcXHhiOFxceGI5XFx4YmFcXHhiYlxceGJjXFx4YmRcXHhiZVxceGJmXFx4YzBcXHhjMVxceGMyXFx4YzNcXHhjNFxceGM1IgorICAgICAgICAgICAgICAgICJcXHhjNlxceGM3XFx4YzhcXHhjOVxceGNhXFx4Y2JcXHhjY1xceGNkXFx4Y2VcXHhjZlxceGQwXFx4ZDFcXHhkMlxceGQzIgorICAgICAgICAgICAgICAgICJcXHhkNFxceGQ1XFx4ZDZcXHhkN1xceGQ4XFx4ZDlcXHhkYVxceGRiXFx4ZGNcXHhkZFxceGRlXFx4ZGZcXHhlMFxceGUxIgorICAgICAgICAgICAgICAgICJcXHhlMlxceGUzXFx4ZTRcXHhlNVxceGU2XFx4ZTdcXHhlOFxceGU5XFx4ZWFcXHhlYlxceGVjXFx4ZWRcXHhlZVxceGVmIgorICAgICAgICAgICAgICAgICJcXHhmMFxceGYxXFx4ZjJcXHhmM1xceGY0XFx4ZjVcXHhmNlxceGY3XFx4ZjhcXHhmOVxceGZhXFx4ZmJcXHhmY1xceGZkIgorICAgICAgICAgICAgICAgICJcXHhmZVxceGZmJyIpCisgICAgICAgICAgICB0ZXN0cmVwciA9IHJlcHIodScnLmpvaW4obWFwKHVuaWNociwgeHJhbmdlKDI1NikpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdHJlcHIsIGxhdGluMXJlcHIpCisgICAgICAgICAgICAjIFRlc3QgcmVwciB3b3JrcyBvbiB3aWRlIHVuaWNvZGUgZXNjYXBlcyB3aXRob3V0IG92ZXJmbG93LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUiXFUwMDAxMDAwMCIgKiAzOSArIHUiXHVmZmZmIiAqIDQwOTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByKHUiXFUwMDAxMDAwMCIgKiAzOSArIHUiXHVmZmZmIiAqIDQwOTYpKQorCisKKyAgICBkZWYgdGVzdF9jb3VudChzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLkNvbW1vblRlc3QudGVzdF9jb3VudChzZWxmKQorICAgICAgICAjIGNoZWNrIG1peGVkIGFyZ3VtZW50IHR5cGVzCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDMsICAnYWFhJywgJ2NvdW50JywgdSdhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMCwgICdhYWEnLCAnY291bnQnLCB1J2InKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCgzLCB1J2FhYScsICdjb3VudCcsICAnYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDAsIHUnYWFhJywgJ2NvdW50JywgICdiJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMCwgdSdhYWEnLCAnY291bnQnLCAgJ2InKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCgxLCB1J2FhYScsICdjb3VudCcsICAnYScsIC0xKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCgzLCB1J2FhYScsICdjb3VudCcsICAnYScsIC0xMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMiwgdSdhYWEnLCAnY291bnQnLCAgJ2EnLCAwLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMCwgdSdhYWEnLCAnY291bnQnLCAgJ2EnLCAwLCAtMTApCisKKyAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCgwLCAgdSdhYmNkZWZnaGlhYmMnLCAnZmluZCcsIHUnYWJjJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoOSwgIHUnYWJjZGVmZ2hpYWJjJywgJ2ZpbmQnLCB1J2FiYycsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KC0xLCB1J2FiY2RlZmdoaWFiYycsICdmaW5kJywgdSdkZWYnLCA0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdSdoZWxsbycuZmluZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1J2hlbGxvJy5maW5kLCA0MikKKworICAgIGRlZiB0ZXN0X3JmaW5kKHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdC50ZXN0X3JmaW5kKHNlbGYpCisgICAgICAgICMgY2hlY2sgbWl4ZWQgYXJndW1lbnQgdHlwZXMKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoOSwgICAnYWJjZGVmZ2hpYWJjJywgJ3JmaW5kJywgdSdhYmMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCgxMiwgICdhYmNkZWZnaGlhYmMnLCAncmZpbmQnLCB1JycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDEyLCB1J2FiY2RlZmdoaWFiYycsICdyZmluZCcsICAnJykKKworICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdC50ZXN0X2luZGV4KHNlbGYpCisgICAgICAgICMgY2hlY2sgbWl4ZWQgYXJndW1lbnQgdHlwZXMKKyAgICAgICAgZm9yICh0MSwgdDIpIGluICgoc3RyLCB1bmljb2RlKSwgKHVuaWNvZGUsIHN0cikpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMCwgdDEoJ2FiY2RlZmdoaWFiYycpLCAnaW5kZXgnLCAgdDIoJycpKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMywgdDEoJ2FiY2RlZmdoaWFiYycpLCAnaW5kZXgnLCAgdDIoJ2RlZicpKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMCwgdDEoJ2FiY2RlZmdoaWFiYycpLCAnaW5kZXgnLCAgdDIoJ2FiYycpKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoOSwgdDEoJ2FiY2RlZmdoaWFiYycpLCAnaW5kZXgnLCAgdDIoJ2FiYycpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdDEoJ2FiY2RlZmdoaWFiYycpLmluZGV4LCB0MignaGliJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0MSgnYWJjZGVmZ2hpYWInKS5pbmRleCwgIHQyKCdhYmMnKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQxKCdhYmNkZWZnaGknKS5pbmRleCwgIHQyKCdnaGknKSwgOCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQxKCdhYmNkZWZnaGknKS5pbmRleCwgIHQyKCdnaGknKSwgLTEpCisKKyAgICBkZWYgdGVzdF9yaW5kZXgoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5Db21tb25UZXN0LnRlc3RfcmluZGV4KHNlbGYpCisgICAgICAgICMgY2hlY2sgbWl4ZWQgYXJndW1lbnQgdHlwZXMKKyAgICAgICAgZm9yICh0MSwgdDIpIGluICgoc3RyLCB1bmljb2RlKSwgKHVuaWNvZGUsIHN0cikpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMTIsIHQxKCdhYmNkZWZnaGlhYmMnKSwgJ3JpbmRleCcsICB0MignJykpCisgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCgzLCAgdDEoJ2FiY2RlZmdoaWFiYycpLCAncmluZGV4JywgIHQyKCdkZWYnKSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDksICB0MSgnYWJjZGVmZ2hpYWJjJyksICdyaW5kZXgnLCAgdDIoJ2FiYycpKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMCwgIHQxKCdhYmNkZWZnaGlhYmMnKSwgJ3JpbmRleCcsICB0MignYWJjJyksIDAsIC0xKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0MSgnYWJjZGVmZ2hpYWJjJykucmluZGV4LCAgdDIoJ2hpYicpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdDEoJ2RlZmdoaWFiYycpLnJpbmRleCwgIHQyKCdkZWYnKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQxKCdkZWZnaGlhYmMnKS5yaW5kZXgsICB0MignYWJjJyksIDAsIC0xKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdDEoJ2FiY2RlZmdoaScpLnJpbmRleCwgIHQyKCdnaGknKSwgMCwgOCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQxKCdhYmNkZWZnaGknKS5yaW5kZXgsICB0MignZ2hpJyksIDAsIC0xKQorCisgICAgZGVmIHRlc3RfdHJhbnNsYXRlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCh1J2JiYmMnLCB1J2FiYWJhYmMnLCAndHJhbnNsYXRlJywge29yZCgnYScpOk5vbmV9KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCh1J2lpaWMnLCB1J2FiYWJhYmMnLCAndHJhbnNsYXRlJywge29yZCgnYScpOk5vbmUsIG9yZCgnYicpOm9yZCgnaScpfSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgodSdpaWl4JywgdSdhYmFiYWJjJywgJ3RyYW5zbGF0ZScsIHtvcmQoJ2EnKTpOb25lLCBvcmQoJ2InKTpvcmQoJ2knKSwgb3JkKCdjJyk6dSd4J30pCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KHUnPGk+PGk+PGk+YycsIHUnYWJhYmFiYycsICd0cmFuc2xhdGUnLCB7b3JkKCdhJyk6Tm9uZSwgb3JkKCdiJyk6dSc8aT4nfSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgodSdjJywgdSdhYmFiYWJjJywgJ3RyYW5zbGF0ZScsIHtvcmQoJ2EnKTpOb25lLCBvcmQoJ2InKTp1Jyd9KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCh1J3h5eXgnLCB1J3h6eCcsICd0cmFuc2xhdGUnLCB7b3JkKCd6Jyk6dSd5eSd9KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdSdoZWxsbycudHJhbnNsYXRlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUnYWJhYmFiYycudHJhbnNsYXRlLCB7b3JkKCdhJyk6Jyd9KQorCisgICAgZGVmIHRlc3Rfc3BsaXQoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5Db21tb25UZXN0LnRlc3Rfc3BsaXQoc2VsZikKKworICAgICAgICAjIE1peGVkIGFyZ3VtZW50cworICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChbdSdhJywgdSdiJywgdSdjJywgdSdkJ10sIHUnYS8vYi8vYy8vZCcsICdzcGxpdCcsICcvLycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KFt1J2EnLCB1J2InLCB1J2MnLCB1J2QnXSwgJ2EvL2IvL2MvL2QnLCAnc3BsaXQnLCB1Jy8vJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoW3UnZW5kY2FzZSAnLCB1JyddLCB1J2VuZGNhc2UgdGVzdCcsICdzcGxpdCcsICd0ZXN0JykKKworICAgIGRlZiB0ZXN0X2pvaW4oc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clVuaWNvZGVVc2VyU3RyaW5nVGVzdC50ZXN0X2pvaW4oc2VsZikKKworICAgICAgICAjIG1peGVkIGFyZ3VtZW50cworICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCh1J2EgYiBjIGQnLCB1JyAnLCAnam9pbicsIFsnYScsICdiJywgdSdjJywgdSdkJ10pCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KHUnYWJjZCcsIHUnJywgJ2pvaW4nLCAodSdhJywgdSdiJywgdSdjJywgdSdkJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KHUndyB4IHkgeicsIHUnICcsICdqb2luJywgc3RyaW5nX3Rlc3RzLlNlcXVlbmNlKCd3eHl6JykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KHUnYSBiIGMgZCcsICcgJywgJ2pvaW4nLCBbdSdhJywgdSdiJywgdSdjJywgdSdkJ10pCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KHUnYSBiIGMgZCcsICcgJywgJ2pvaW4nLCBbJ2EnLCAnYicsIHUnYycsIHUnZCddKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCh1J2FiY2QnLCAnJywgJ2pvaW4nLCAodSdhJywgdSdiJywgdSdjJywgdSdkJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KHUndyB4IHkgeicsICcgJywgJ2pvaW4nLCBzdHJpbmdfdGVzdHMuU2VxdWVuY2UodSd3eHl6JykpCisKKyAgICBkZWYgdGVzdF9zdHJpcChzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLkNvbW1vblRlc3QudGVzdF9zdHJpcChzZWxmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHUiaGVsbG8iLnN0cmlwLCAiXHhmZiIpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdC50ZXN0X3JlcGxhY2Uoc2VsZikKKworICAgICAgICAjIG1ldGhvZCBjYWxsIGZvcndhcmRlZCBmcm9tIHN0ciBpbXBsZW1lbnRhdGlvbiBiZWNhdXNlIG9mIHVuaWNvZGUgYXJndW1lbnQKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgodSdvbmVAdHdvIXRocmVlIScsICdvbmUhdHdvIXRocmVlIScsICdyZXBsYWNlJywgdSchJywgdSdAJywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCAncmVwbGFjZScucmVwbGFjZSwgdSJyIiwgNDIpCisKKyAgICBkZWYgdGVzdF9jb21wYXJpc29uKHNlbGYpOgorICAgICAgICAjIENvbXBhcmlzb25zOgorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhYmMnID09ICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2FiYycgPT0gdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhYmMnID09IHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYWJjZCcgPiAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhYmNkJyA+IHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYWJjZCcgPiB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FiYycgPCAnYWJjZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYWJjJyA8IHUnYWJjZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FiYycgPCB1J2FiY2QnKQorCisgICAgICAgIGlmIDA6CisgICAgICAgICAgICAjIE1vdmUgdGhlc2UgdGVzdHMgdG8gYSBVbmljb2RlIGNvbGxhdGlvbiBtb2R1bGUgdGVzdC4uLgorICAgICAgICAgICAgIyBUZXN0aW5nIFVURi0xNiBjb2RlIHBvaW50IG9yZGVyIGNvbXBhcmlzb25zLi4uCisKKyAgICAgICAgICAgICMgTm8gc3Vycm9nYXRlcywgbm8gZml4dXAgcmVxdWlyZWQuCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcdTAwNjEnIDwgdSdcdTIwYWMnKQorICAgICAgICAgICAgIyBOb24gc3Vycm9nYXRlIGJlbG93IHN1cnJvZ2F0ZSB2YWx1ZSwgbm8gZml4dXAgcmVxdWlyZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1x1MDA2MScgPCB1J1x1ZDgwMFx1ZGMwMicpCisKKyAgICAgICAgICAgICMgTm9uIHN1cnJvZ2F0ZSBhYm92ZSBzdXJyb2dhdGUgdmFsdWUsIGZpeHVwIHJlcXVpcmVkCisgICAgICAgICAgICBkZWYgdGVzdF9sZWNtcChzLCBzMik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPCBzMikKKworICAgICAgICAgICAgZGVmIHRlc3RfZml4dXAocyk6CisgICAgICAgICAgICAgICAgczIgPSB1J1x1ZDgwMFx1ZGMwMScKKyAgICAgICAgICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgICAgICAgICAgIHMyID0gdSdcdWQ5MDBcdWRjMDEnCisgICAgICAgICAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgICAgICAgICAgICBzMiA9IHUnXHVkYTAwXHVkYzAxJworICAgICAgICAgICAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICAgICAgICAgICAgczIgPSB1J1x1ZGIwMFx1ZGMwMScKKyAgICAgICAgICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgICAgICAgICAgIHMyID0gdSdcdWQ4MDBcdWRkMDEnCisgICAgICAgICAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgICAgICAgICAgICBzMiA9IHUnXHVkOTAwXHVkZDAxJworICAgICAgICAgICAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICAgICAgICAgICAgczIgPSB1J1x1ZGEwMFx1ZGQwMScKKyAgICAgICAgICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgICAgICAgICAgIHMyID0gdSdcdWRiMDBcdWRkMDEnCisgICAgICAgICAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgICAgICAgICAgICBzMiA9IHUnXHVkODAwXHVkZTAxJworICAgICAgICAgICAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICAgICAgICAgICAgczIgPSB1J1x1ZDkwMFx1ZGUwMScKKyAgICAgICAgICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgICAgICAgICAgIHMyID0gdSdcdWRhMDBcdWRlMDEnCisgICAgICAgICAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgICAgICAgICAgICBzMiA9IHUnXHVkYjAwXHVkZTAxJworICAgICAgICAgICAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICAgICAgICAgICAgczIgPSB1J1x1ZDgwMFx1ZGZmZicKKyAgICAgICAgICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgICAgICAgICAgIHMyID0gdSdcdWQ5MDBcdWRmZmYnCisgICAgICAgICAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgICAgICAgICAgICBzMiA9IHUnXHVkYTAwXHVkZmZmJworICAgICAgICAgICAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICAgICAgICAgICAgczIgPSB1J1x1ZGIwMFx1ZGZmZicKKyAgICAgICAgICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorCisgICAgICAgICAgICAgICAgdGVzdF9maXh1cCh1J1x1ZTAwMCcpCisgICAgICAgICAgICAgICAgdGVzdF9maXh1cCh1J1x1ZmY2MScpCisKKyAgICAgICAgIyBTdXJyb2dhdGVzIG9uIGJvdGggc2lkZXMsIG5vIGZpeHVwIHJlcXVpcmVkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1x1ZDgwMFx1ZGMwMicgPCB1J1x1ZDg0ZFx1ZGM1NicpCisKKyAgICBkZWYgdGVzdF9jYXBpdGFsaXplKHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdC50ZXN0X2NhcGl0YWxpemUoc2VsZikKKyAgICAgICAgIyBjaGVjayB0aGF0IHRpdGxlY2FzZWQgY2hhcnMgYXJlIGxvd2VyZWQgY29ycmVjdGx5CisgICAgICAgICMgXHUxZmZjIGlzIHRoZSB0aXRsZWNhc2VkIGNoYXIKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKHUnXHUxZmZjXHUxZmYzXHUxZmYzXHUxZmYzJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHUnXHUxZmYzXHUxZmYzXHUxZmZjXHUxZmZjJywgJ2NhcGl0YWxpemUnKQorICAgICAgICAjIGNoZWNrIHdpdGggY2FzZWQgbm9uLWxldHRlciBjaGFycworICAgICAgICBzZWxmLmNoZWNrZXF1YWwodSdcdTI0YzVcdTI0ZThcdTI0ZTNcdTI0ZDdcdTI0ZGVcdTI0ZGQnLAorICAgICAgICAgICAgICAgICAgICAgICAgdSdcdTI0YzVcdTI0Y2VcdTI0YzlcdTI0YmRcdTI0YzRcdTI0YzMnLCAnY2FwaXRhbGl6ZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1J1x1MjRjNVx1MjRlOFx1MjRlM1x1MjRkN1x1MjRkZVx1MjRkZCcsCisgICAgICAgICAgICAgICAgICAgICAgICB1J1x1MjRkZlx1MjRlOFx1MjRlM1x1MjRkN1x1MjRkZVx1MjRkZCcsICdjYXBpdGFsaXplJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKHUnXHUyMTYwXHUyMTcxXHUyMTcyJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHUnXHUyMTYwXHUyMTYxXHUyMTYyJywgJ2NhcGl0YWxpemUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwodSdcdTIxNjBcdTIxNzFcdTIxNzInLAorICAgICAgICAgICAgICAgICAgICAgICAgdSdcdTIxNzBcdTIxNzFcdTIxNzInLCAnY2FwaXRhbGl6ZScpCisgICAgICAgICMgY2hlY2sgd2l0aCBMbCBjaGFycyB3aXRoIG5vIHVwcGVyIC0gbm90aGluZyBjaGFuZ2VzIGhlcmUKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKHUnXHUwMTliXHUxZDAwXHUxZDg2XHUwMjIxXHUxZmI3JywKKyAgICAgICAgICAgICAgICAgICAgICAgIHUnXHUwMTliXHUxZDAwXHUxZDg2XHUwMjIxXHUxZmI3JywgJ2NhcGl0YWxpemUnKQorCisgICAgZGVmIHRlc3RfaXNsb3dlcihzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyVW5pY29kZVVzZXJTdHJpbmdUZXN0LnRlc3RfaXNsb3dlcihzZWxmKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChGYWxzZSwgdSdcdTFGRmMnLCAnaXNsb3dlcicpCisKKyAgICBAcmVxdWlyZXNfd2lkZV9idWlsZAorICAgIGRlZiB0ZXN0X2lzbG93ZXJfbm9uX2JtcChzZWxmKToKKyAgICAgICAgIyBub24tQk1QLCB1cHBlcmNhc2UKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh1J1xVMDAwMTA0MDEnLmlzbG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh1J1xVMDAwMTA0MjcnLmlzbG93ZXIoKSkKKyAgICAgICAgIyBub24tQk1QLCBsb3dlcmNhc2UKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXFUwMDAxMDQyOScuaXNsb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcVTAwMDEwNDRFJy5pc2xvd2VyKCkpCisgICAgICAgICMgbm9uLUJNUCwgbm9uLWNhc2VkCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodSdcVTAwMDFGNDBEJy5pc2xvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodSdcVTAwMDFGNDZGJy5pc2xvd2VyKCkpCisKKyAgICBkZWYgdGVzdF9pc3VwcGVyKHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVbmljb2RlVXNlclN0cmluZ1Rlc3QudGVzdF9pc3VwcGVyKHNlbGYpCisgICAgICAgIGlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoRmFsc2UsIHUnXHUxRkZjJywgJ2lzdXBwZXInKQorCisgICAgQHJlcXVpcmVzX3dpZGVfYnVpbGQKKyAgICBkZWYgdGVzdF9pc3VwcGVyX25vbl9ibXAoc2VsZik6CisgICAgICAgICMgbm9uLUJNUCwgdXBwZXJjYXNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1xVMDAwMTA0MDEnLmlzdXBwZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXFUwMDAxMDQyNycuaXN1cHBlcigpKQorICAgICAgICAjIG5vbi1CTVAsIGxvd2VyY2FzZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHUnXFUwMDAxMDQyOScuaXN1cHBlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHUnXFUwMDAxMDQ0RScuaXN1cHBlcigpKQorICAgICAgICAjIG5vbi1CTVAsIG5vbi1jYXNlZAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHUnXFUwMDAxRjQwRCcuaXN1cHBlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHUnXFUwMDAxRjQ2RicuaXN1cHBlcigpKQorCisgICAgZGVmIHRlc3RfaXN0aXRsZShzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyVW5pY29kZVVzZXJTdHJpbmdUZXN0LnRlc3RfaXN0aXRsZShzZWxmKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChUcnVlLCB1J1x1MUZGYycsICdpc3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoVHJ1ZSwgdSdHcmVlayBcdTFGRmNpdGxlY2FzZXMgLi4uJywgJ2lzdGl0bGUnKQorCisgICAgQHJlcXVpcmVzX3dpZGVfYnVpbGQKKyAgICBkZWYgdGVzdF9pc3RpdGxlX25vbl9ibXAoc2VsZik6CisgICAgICAgICMgbm9uLUJNUCwgdXBwZXJjYXNlICsgbG93ZXJjYXNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1xVMDAwMTA0MDFcVTAwMDEwNDI5Jy5pc3RpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1xVMDAwMTA0MjdcVTAwMDEwNDRFJy5pc3RpdGxlKCkpCisgICAgICAgICMgYXBwYXJlbnRseSB0aGVyZSBhcmUgbm8gdGl0bGVjYXNlZCAoTHQpIG5vbi1CTVAgY2hhcnMgaW4gVW5pY29kZSA2CisgICAgICAgIGZvciBjaCBpbiBbdSdcVTAwMDEwNDI5JywgdSdcVTAwMDEwNDRFJywgdSdcVTAwMDFGNDBEJywgdSdcVTAwMDFGNDZGJ106CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNoLmlzdGl0bGUoKSwgJ3shcn0gaXMgbm90IHRpdGxlJy5mb3JtYXQoY2gpKQorCisgICAgZGVmIHRlc3RfaXNzcGFjZShzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyVW5pY29kZVVzZXJTdHJpbmdUZXN0LnRlc3RfaXNzcGFjZShzZWxmKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChUcnVlLCB1J1x1MjAwMCcsICdpc3NwYWNlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoVHJ1ZSwgdSdcdTIwMGEnLCAnaXNzcGFjZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KEZhbHNlLCB1J1x1MjAxNCcsICdpc3NwYWNlJykKKworICAgIEByZXF1aXJlc193aWRlX2J1aWxkCisgICAgZGVmIHRlc3RfaXNzcGFjZV9ub25fYm1wKHNlbGYpOgorICAgICAgICAjIGFwcGFyZW50bHkgdGhlcmUgYXJlIG5vIG5vbi1CTVAgc3BhY2VzIGNoYXJzIGluIFVuaWNvZGUgNgorICAgICAgICBmb3IgY2ggaW4gW3UnXFUwMDAxMDQwMScsIHUnXFUwMDAxMDQyNycsIHUnXFUwMDAxMDQyOScsIHUnXFUwMDAxMDQ0RScsCisgICAgICAgICAgICAgICAgICAgdSdcVTAwMDFGNDBEJywgdSdcVTAwMDFGNDZGJ106CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNoLmlzc3BhY2UoKSwgJ3shcn0gaXMgbm90IHNwYWNlLicuZm9ybWF0KGNoKSkKKworICAgIEByZXF1aXJlc193aWRlX2J1aWxkCisgICAgZGVmIHRlc3RfaXNhbG51bV9ub25fYm1wKHNlbGYpOgorICAgICAgICBmb3IgY2ggaW4gW3UnXFUwMDAxMDQwMScsIHUnXFUwMDAxMDQyNycsIHUnXFUwMDAxMDQyOScsIHUnXFUwMDAxMDQ0RScsCisgICAgICAgICAgICAgICAgICAgdSdcVTAwMDFEN0Y2JywgdSdcVTAwMDEwNEEwJywgdSdcVTAwMDEwNEEwJywgdSdcVTAwMDFGMTA3J106CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2guaXNhbG51bSgpLCAneyFyfSBpcyBhbG51bS4nLmZvcm1hdChjaCkpCisKKyAgICBkZWYgdGVzdF9pc2FscGhhKHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVbmljb2RlVXNlclN0cmluZ1Rlc3QudGVzdF9pc2FscGhhKHNlbGYpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KFRydWUsIHUnXHUxRkZjJywgJ2lzYWxwaGEnKQorCisgICAgQHJlcXVpcmVzX3dpZGVfYnVpbGQKKyAgICBkZWYgdGVzdF9pc2FscGhhX25vbl9ibXAoc2VsZik6CisgICAgICAgICMgbm9uLUJNUCwgY2FzZWQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXFUwMDAxMDQwMScuaXNhbHBoYSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcVTAwMDEwNDI3Jy5pc2FscGhhKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1xVMDAwMTA0MjknLmlzYWxwaGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXFUwMDAxMDQ0RScuaXNhbHBoYSgpKQorICAgICAgICAjIG5vbi1CTVAsIG5vbi1jYXNlZAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHUnXFUwMDAxRjQwRCcuaXNhbHBoYSgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHUnXFUwMDAxRjQ2RicuaXNhbHBoYSgpKQorCisgICAgZGVmIHRlc3RfaXNkZWNpbWFsKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChGYWxzZSwgdScnLCAnaXNkZWNpbWFsJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoRmFsc2UsIHUnYScsICdpc2RlY2ltYWwnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChUcnVlLCB1JzAnLCAnaXNkZWNpbWFsJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoRmFsc2UsIHUnXHUyNDYwJywgJ2lzZGVjaW1hbCcpICMgQ0lSQ0xFRCBESUdJVCBPTkUKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoRmFsc2UsIHUnXHhiYycsICdpc2RlY2ltYWwnKSAjIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChUcnVlLCB1J1x1MDY2MCcsICdpc2RlY2ltYWwnKSAjIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KFRydWUsIHUnMDEyMzQ1Njc4OScsICdpc2RlY2ltYWwnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChGYWxzZSwgdScwMTIzNDU2Nzg5YScsICdpc2RlY2ltYWwnKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnYWJjJywgJ2lzZGVjaW1hbCcsIDQyKQorCisgICAgQHJlcXVpcmVzX3dpZGVfYnVpbGQKKyAgICBkZWYgdGVzdF9pc2RlY2ltYWxfbm9uX2JtcChzZWxmKToKKyAgICAgICAgZm9yIGNoIGluIFt1J1xVMDAwMTA0MDEnLCB1J1xVMDAwMTA0MjcnLCB1J1xVMDAwMTA0MjknLCB1J1xVMDAwMTA0NEUnLAorICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxRjQwRCcsIHUnXFUwMDAxRjQ2RicsIHUnXFUwMDAxMTA2NScsIHUnXFUwMDAxRjEwNyddOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjaC5pc2RlY2ltYWwoKSwgJ3shcn0gaXMgbm90IGRlY2ltYWwuJy5mb3JtYXQoY2gpKQorICAgICAgICBmb3IgY2ggaW4gW3UnXFUwMDAxRDdGNicsIHUnXFUwMDAxMDRBMCcsIHUnXFUwMDAxMDRBMCddOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoLmlzZGVjaW1hbCgpLCAneyFyfSBpcyBkZWNpbWFsLicuZm9ybWF0KGNoKSkKKworICAgIGRlZiB0ZXN0X2lzZGlnaXQoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clVuaWNvZGVVc2VyU3RyaW5nVGVzdC50ZXN0X2lzZGlnaXQoc2VsZikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoVHJ1ZSwgdSdcdTI0NjAnLCAnaXNkaWdpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KEZhbHNlLCB1J1x4YmMnLCAnaXNkaWdpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KFRydWUsIHUnXHUwNjYwJywgJ2lzZGlnaXQnKQorCisgICAgQHJlcXVpcmVzX3dpZGVfYnVpbGQKKyAgICBkZWYgdGVzdF9pc2RpZ2l0X25vbl9ibXAoc2VsZik6CisgICAgICAgIGZvciBjaCBpbiBbdSdcVTAwMDEwNDAxJywgdSdcVTAwMDEwNDI3JywgdSdcVTAwMDEwNDI5JywgdSdcVTAwMDEwNDRFJywKKyAgICAgICAgICAgICAgICAgICB1J1xVMDAwMUY0MEQnLCB1J1xVMDAwMUY0NkYnLCB1J1xVMDAwMTEwNjUnXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2guaXNkaWdpdCgpLCAneyFyfSBpcyBub3QgYSBkaWdpdC4nLmZvcm1hdChjaCkpCisgICAgICAgIGZvciBjaCBpbiBbdSdcVTAwMDFEN0Y2JywgdSdcVTAwMDEwNEEwJywgdSdcVTAwMDEwNEEwJywgdSdcVTAwMDFGMTA3J106CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2guaXNkaWdpdCgpLCAneyFyfSBpcyBhIGRpZ2l0LicuZm9ybWF0KGNoKSkKKworICAgIGRlZiB0ZXN0X2lzbnVtZXJpYyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoRmFsc2UsIHUnJywgJ2lzbnVtZXJpYycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KEZhbHNlLCB1J2EnLCAnaXNudW1lcmljJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoVHJ1ZSwgdScwJywgJ2lzbnVtZXJpYycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KFRydWUsIHUnXHUyNDYwJywgJ2lzbnVtZXJpYycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KFRydWUsIHUnXHhiYycsICdpc251bWVyaWMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChUcnVlLCB1J1x1MDY2MCcsICdpc251bWVyaWMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChUcnVlLCB1JzAxMjM0NTY3ODknLCAnaXNudW1lcmljJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoRmFsc2UsIHUnMDEyMzQ1Njc4OWEnLCAnaXNudW1lcmljJykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUiYWJjIi5pc251bWVyaWMsIDQyKQorCisgICAgQHJlcXVpcmVzX3dpZGVfYnVpbGQKKyAgICBkZWYgdGVzdF9pc251bWVyaWNfbm9uX2JtcChzZWxmKToKKyAgICAgICAgZm9yIGNoIGluIFt1J1xVMDAwMTA0MDEnLCB1J1xVMDAwMTA0MjcnLCB1J1xVMDAwMTA0MjknLCB1J1xVMDAwMTA0NEUnLAorICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxRjQwRCcsIHUnXFUwMDAxRjQ2RiddOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjaC5pc251bWVyaWMoKSwgJ3shcn0gaXMgbm90IG51bWVyaWMuJy5mb3JtYXQoY2gpKQorICAgICAgICBmb3IgY2ggaW4gW3UnXFUwMDAxMDEwNycsIHUnXFUwMDAxRDdGNicsIHUnXFUwMDAyM2IxYicsCisgICAgICAgICAgICAgICAgICAgdSdcVTAwMDEwNEEwJywgdSdcVTAwMDFGMTA3J106CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2guaXNudW1lcmljKCksICd7IXJ9IGlzIG51bWVyaWMuJy5mb3JtYXQoY2gpKQorCisgICAgQHJlcXVpcmVzX3dpZGVfYnVpbGQKKyAgICBkZWYgdGVzdF9zdXJyb2dhdGVzKHNlbGYpOgorICAgICAgICAjIHRoaXMgdGVzdCBhY3R1YWxseSBwYXNzZXMgb24gbmFycm93IHRvbywgYnV0IGl0J3MganVzdCBieSBhY2NpZGVudC4KKyAgICAgICAgIyBTdXJyb2dhdGVzIGFyZSBzZWVuIGFzIG5vbi1jYXNlZCBjaGFycywgc28gdSdYXHVEODAwWCcgaXMgYXMKKyAgICAgICAgIyB1cHBlcmNhc2UgYXMgJ1ggWCcKKyAgICAgICAgZm9yIHMgaW4gKHUnYVx1RDgwMGJcdURGRkYnLCB1J2FcdURGRkZiXHVEODAwJywKKyAgICAgICAgICAgICAgICAgIHUnYVx1RDgwMGJcdURGRkZhJywgdSdhXHVERkZGYlx1RDgwMGEnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmlzbG93ZXIoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocy5pc3VwcGVyKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXN0aXRsZSgpKQorICAgICAgICBmb3IgcyBpbiAodSdBXHVEODAwQlx1REZGRicsIHUnQVx1REZGRkJcdUQ4MDAnLAorICAgICAgICAgICAgICAgICAgdSdBXHVEODAwQlx1REZGRkEnLCB1J0FcdURGRkZCXHVEODAwQScpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmlzbG93ZXIoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmlzdXBwZXIoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmlzdGl0bGUoKSkKKworICAgICAgICBmb3IgbWV0aF9uYW1lIGluICgnaXNsb3dlcicsICdpc3VwcGVyJywgJ2lzdGl0bGUnKToKKyAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHVuaWNvZGUsIG1ldGhfbmFtZSkKKyAgICAgICAgICAgIGZvciBzIGluICh1J1x1RDgwMCcsIHUnXHVERkZGJywgdSdcdUQ4MDBcdUQ4MDAnLCB1J1x1REZGRlx1REZGRicpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWV0aChzKSwgJyVyLiVzKCkgaXMgRmFsc2UnICUgKHMsIG1ldGhfbmFtZSkpCisKKyAgICAgICAgZm9yIG1ldGhfbmFtZSBpbiAoJ2lzYWxwaGEnLCAnaXNhbG51bScsICdpc2RpZ2l0JywgJ2lzc3BhY2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNkZWNpbWFsJywgJ2lzbnVtZXJpYycpOgorICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIodW5pY29kZSwgbWV0aF9uYW1lKQorICAgICAgICAgICAgZm9yIHMgaW4gKHUnXHVEODAwJywgdSdcdURGRkYnLCB1J1x1RDgwMFx1RDgwMCcsIHUnXHVERkZGXHVERkZGJywKKyAgICAgICAgICAgICAgICAgICAgICB1J2FcdUQ4MDBiXHVERkZGJywgdSdhXHVERkZGYlx1RDgwMCcsCisgICAgICAgICAgICAgICAgICAgICAgdSdhXHVEODAwYlx1REZGRmEnLCB1J2FcdURGRkZiXHVEODAwYScpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWV0aChzKSwgJyVyLiVzKCkgaXMgRmFsc2UnICUgKHMsIG1ldGhfbmFtZSkpCisKKworICAgIEByZXF1aXJlc193aWRlX2J1aWxkCisgICAgZGVmIHRlc3RfbG93ZXIoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5Db21tb25UZXN0LnRlc3RfbG93ZXIoc2VsZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0MjcnLmxvd2VyKCksIHUnXFUwMDAxMDQ0RicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDI3XFUwMDAxMDQyNycubG93ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1xVMDAwMTA0NEZcVTAwMDEwNDRGJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0MjdcVTAwMDEwNDRGJy5sb3dlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxMDQ0RlxVMDAwMTA0NEYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnWFxVMDAwMTA0Mjd4XFUwMDAxMDQ0RicubG93ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J3hcVTAwMDEwNDRGeFxVMDAwMTA0NEYnKQorCisgICAgQHJlcXVpcmVzX3dpZGVfYnVpbGQKKyAgICBkZWYgdGVzdF91cHBlcihzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLkNvbW1vblRlc3QudGVzdF91cHBlcihzZWxmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDQ0RicudXBwZXIoKSwgdSdcVTAwMDEwNDI3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0NEZcVTAwMDEwNDRGJy51cHBlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxMDQyN1xVMDAwMTA0MjcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDQyN1xVMDAwMTA0NEYnLnVwcGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdcVTAwMDEwNDI3XFUwMDAxMDQyNycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdYXFUwMDAxMDQyN3hcVTAwMDEwNDRGJy51cHBlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnWFxVMDAwMTA0MjdYXFUwMDAxMDQyNycpCisKKyAgICBAcmVxdWlyZXNfd2lkZV9idWlsZAorICAgIGRlZiB0ZXN0X2NhcGl0YWxpemUoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5Db21tb25UZXN0LnRlc3RfY2FwaXRhbGl6ZShzZWxmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDQ0RicuY2FwaXRhbGl6ZSgpLCB1J1xVMDAwMTA0MjcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDQ0RlxVMDAwMTA0NEYnLmNhcGl0YWxpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1xVMDAwMTA0MjdcVTAwMDEwNDRGJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0MjdcVTAwMDEwNDRGJy5jYXBpdGFsaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdcVTAwMDEwNDI3XFUwMDAxMDQ0RicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDRGXFUwMDAxMDQyNycuY2FwaXRhbGl6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxMDQyN1xVMDAwMTA0NEYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnWFxVMDAwMTA0Mjd4XFUwMDAxMDQ0RicuY2FwaXRhbGl6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnWFxVMDAwMTA0NEZ4XFUwMDAxMDQ0RicpCisKKyAgICBAcmVxdWlyZXNfd2lkZV9idWlsZAorICAgIGRlZiB0ZXN0X3RpdGxlKHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVbmljb2RlVXNlclN0cmluZ1Rlc3QudGVzdF90aXRsZShzZWxmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDQ0RicudGl0bGUoKSwgdSdcVTAwMDEwNDI3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0NEZcVTAwMDEwNDRGJy50aXRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxMDQyN1xVMDAwMTA0NEYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDQ0RlxVMDAwMTA0NEYgXFUwMDAxMDQ0RlxVMDAwMTA0NEYnLnRpdGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdcVTAwMDEwNDI3XFUwMDAxMDQ0RiBcVTAwMDEwNDI3XFUwMDAxMDQ0RicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDI3XFUwMDAxMDQ0RiBcVTAwMDEwNDI3XFUwMDAxMDQ0RicudGl0bGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1xVMDAwMTA0MjdcVTAwMDEwNDRGIFxVMDAwMTA0MjdcVTAwMDEwNDRGJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0NEZcVTAwMDEwNDI3IFxVMDAwMTA0NEZcVTAwMDEwNDI3Jy50aXRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxMDQyN1xVMDAwMTA0NEYgXFUwMDAxMDQyN1xVMDAwMTA0NEYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnWFxVMDAwMTA0Mjd4XFUwMDAxMDQ0RiBYXFUwMDAxMDQyN3hcVTAwMDEwNDRGJy50aXRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnWFxVMDAwMTA0NEZ4XFUwMDAxMDQ0RiBYXFUwMDAxMDQ0RnhcVTAwMDEwNDRGJykKKworICAgIEByZXF1aXJlc193aWRlX2J1aWxkCisgICAgZGVmIHRlc3Rfc3dhcGNhc2Uoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5Db21tb25UZXN0LnRlc3Rfc3dhcGNhc2Uoc2VsZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0NEYnLnN3YXBjYXNlKCksIHUnXFUwMDAxMDQyNycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDI3Jy5zd2FwY2FzZSgpLCB1J1xVMDAwMTA0NEYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDQ0RlxVMDAwMTA0NEYnLnN3YXBjYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdcVTAwMDEwNDI3XFUwMDAxMDQyNycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDI3XFUwMDAxMDQ0Ricuc3dhcGNhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1xVMDAwMTA0NEZcVTAwMDEwNDI3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0NEZcVTAwMDEwNDI3Jy5zd2FwY2FzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxMDQyN1xVMDAwMTA0NEYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnWFxVMDAwMTA0Mjd4XFUwMDAxMDQ0Ricuc3dhcGNhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J3hcVTAwMDEwNDRGWFxVMDAwMTA0MjcnKQorCisgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBVbmljb2RlIGNvbnRhaW5zIG1ldGhvZAorICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgdSdhYmRiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYScsIHUnYmRhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCB1J2JkYWJhJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYScsIHUnYmRiYScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCB1J2JkYmEnKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnYScsIHUnYmRiYScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4odSdhJywgdSdiZGInKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHUnYScsICdiZGInKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnYScsICdiZGJhJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1J2EnLCAoJ2EnLDEsTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odSdhJywgKDEsTm9uZSwnYScpKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnYScsICgxLE5vbmUsdSdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCAoJ2EnLDEsTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCAoMSxOb25lLCdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCAoMSxOb25lLHUnYScpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdhJywgKCd4JywxLHUneScpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdhJywgKCd4JywxLE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHUnYWJjZCcsIHUnYWJjeHh4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odSdhYicsIHUnYWJjZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2FiJywgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnYWInLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1J2FiJywgKDEsTm9uZSx1J2FiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odScnLCB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJycsIHUnYWJjJykKKworICAgICAgICAjIElmIHRoZSBmb2xsb3dpbmcgZmFpbHMgZWl0aGVyCisgICAgICAgICMgdGhlIGNvbnRhaW5zIG9wZXJhdG9yIGRvZXMgbm90IHByb3BhZ2F0ZSBVbmljb2RlRXJyb3JzIG9yCisgICAgICAgICMgc29tZW9uZSBoYXMgY2hhbmdlZCB0aGUgZGVmYXVsdCBlbmNvZGluZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsICdnXHhlMnRlYXUnLl9fY29udGFpbnNfXywgdSdceGUyJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCB1J2dceGUydGVhdScuX19jb250YWluc19fLCAnXHhlMicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1JycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEluKCcnLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odScnLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odScnLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignJywgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnJywgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHUnXDAnLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignXDAnLCB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4odSdcMCcsIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1J1wwJywgJ1wwYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignXDAnLCB1J1wwYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1J1wwJywgdSdcMGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odSdcMCcsICdhYmNcMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1wwJywgdSdhYmNcMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odSdcMCcsIHUnYWJjXDAnKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnYScsICdcMGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCB1J1wwYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1J2EnLCB1J1wwYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1J2FzZGYnLCAnYXNkZicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2FzZGYnLCB1J2FzZGYnKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnYXNkZicsIHUnYXNkZicpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4odSdhc2RmJywgJ2FzZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2FzZGYnLCB1J2FzZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4odSdhc2RmJywgdSdhc2QnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHUnYXNkZicsICcnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdhc2RmJywgdScnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHUnYXNkZicsIHUnJykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUiYWJjIi5fX2NvbnRhaW5zX18pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdSJhYmMiLl9fY29udGFpbnNfXywgb2JqZWN0KCkpCisKKyAgICBkZWYgdGVzdF9mb3JtYXR0aW5nKHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVbmljb2RlVXNlclN0cmluZ1Rlc3QudGVzdF9mb3JtYXR0aW5nKHNlbGYpCisgICAgICAgICMgVGVzdGluZyBVbmljb2RlIGZvcm1hdHRpbmcgc3RyaW5ncy4uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiJXMsICVzIiAlICh1ImFiYyIsICJhYmMiKSwgdSdhYmMsIGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIDEsIDIsIDMpLCB1J2FiYywgYWJjLCAxLCAyLjAwMDAwMCwgIDMuMDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiJXMsICVzLCAlaSwgJWYsICU1LjJmIiAlICh1ImFiYyIsICJhYmMiLCAxLCAtMiwgMyksIHUnYWJjLCBhYmMsIDEsIC0yLjAwMDAwMCwgIDMuMDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiJXMsICVzLCAlaSwgJWYsICU1LjJmIiAlICh1ImFiYyIsICJhYmMiLCAtMSwgLTIsIDMuNSksIHUnYWJjLCBhYmMsIC0xLCAtMi4wMDAwMDAsICAzLjUwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAzLjU3KSwgdSdhYmMsIGFiYywgLTEsIC0yLjAwMDAwMCwgIDMuNTcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiJXMsICVzLCAlaSwgJWYsICU1LjJmIiAlICh1ImFiYyIsICJhYmMiLCAtMSwgLTIsIDEwMDMuNTcpLCB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAxMDAzLjU3JykKKyAgICAgICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiJXIsICVyIiAlICh1ImFiYyIsICJhYmMiKSwgdSJ1J2FiYycsICdhYmMnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IiUoeClzLCAlKHkpcyIgJSB7J3gnOnUiYWJjIiwgJ3knOiJkZWYifSwgdSdhYmMsIGRlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIlKHgpcywgJShceGZjKXMiICUgeyd4Jzp1ImFiYyIsIHUnXHhmYyc6ImRlZiJ9LCB1J2FiYywgZGVmJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnJWMnICUgMHgxMjM0LCB1J1x1MTIzNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHUiJWMiLl9fbW9kX18sIChzeXMubWF4dW5pY29kZSsxLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUiJS4xXHUxMDMyZiIuX19tb2RfXywgKDEuMC8zKSkKKworICAgICAgICBmb3IgbnVtIGluIHJhbmdlKDB4MDAsMHg4MCk6CisgICAgICAgICAgICBjaGFyID0gY2hyKG51bSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIlYyIgJSBjaGFyLCB1bmljb2RlKGNoYXIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IiVjIiAlIG51bSwgdW5pY29kZShjaGFyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjaGFyID09IHUiJWMiICUgY2hhcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjaGFyID09IHUiJWMiICUgbnVtKQorICAgICAgICAjIElzc3VlIDc2NDkKKyAgICAgICAgZm9yIG51bSBpbiByYW5nZSgweDgwLDB4MTAwKToKKyAgICAgICAgICAgIHVjaGFyID0gdW5pY2hyKG51bSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodWNoYXIsIHUiJWMiICUgbnVtKSAgICMgd29ya3Mgb25seSB3aXRoIGludHMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodWNoYXIsIHUiJWMiICUgdWNoYXIpICMgYW5kIHVuaWNvZGUgY2hhcnMKKyAgICAgICAgICAgICMgdGhlIGltcGxpY2l0IGRlY29kaW5nIHNob3VsZCBmYWlsIGZvciBub24tYXNjaWkgY2hhcnMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgdSIlYyIuX19tb2RfXywgY2hyKG51bSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIHUiJXMiLl9fbW9kX18sIGNocihudW0pKQorCisgICAgICAgICMgZm9ybWF0dGluZyBqb2JzIGRlbGVnYXRlZCBmcm9tIHRoZSBzdHJpbmcgaW1wbGVtZW50YXRpb246CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy4uLiUoZm9vKXMuLi4nICUgeydmb28nOnUiYWJjIn0sIHUnLi4uYWJjLi4uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnLi4uJShmb28pcy4uLicgJSB7J2Zvbyc6ImFiYyJ9LCAnLi4uYWJjLi4uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOiJhYmMifSwgJy4uLmFiYy4uLicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzp1ImFiYyJ9LCB1Jy4uLmFiYy4uLicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzp1ImFiYyIsJ2RlZic6MTIzfSwgIHUnLi4uYWJjLi4uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnLi4uJShmb28pcy4uLicgJSB7dSdmb28nOnUiYWJjIix1J2RlZic6MTIzfSwgdScuLi5hYmMuLi4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcuLi4lcy4uLiVzLi4uJXMuLi4lcy4uLicgJSAoMSwyLDMsdSJhYmMiKSwgdScuLi4xLi4uMi4uLjMuLi5hYmMuLi4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcuLi4lJS4uLiUlcy4uLiVzLi4uJXMuLi4lcy4uLiVzLi4uJyAlICgxLDIsMyx1ImFiYyIpLCB1Jy4uLiUuLi4lcy4uLjEuLi4yLi4uMy4uLmFiYy4uLicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy4uLiVzLi4uJyAlIHUiYWJjIiwgdScuLi5hYmMuLi4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclKnMnICUgKDUsdSdhYmMnLCksIHUnICBhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclKnMnICUgKC01LHUnYWJjJywpLCB1J2FiYyAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJSouKnMnICUgKDUsMix1J2FiYycsKSwgdScgICBhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyUqLipzJyAlICg1LDMsdSdhYmMnLCksIHUnICBhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclaSAlKi4qcycgJSAoMTAsIDUsMyx1J2FiYycsKSwgdScxMCAgIGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyVpJXMgJSouKnMnICUgKDEwLCAzLCA1LCAzLCB1J2FiYycsKSwgdScxMDMgICBhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclYycgJSB1J2EnLCB1J2EnKQorICAgICAgICBjbGFzcyBXcmFwcGVyOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUnXHUxMjM0JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclcycgJSBXcmFwcGVyKCksIHUnXHUxMjM0JykKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfZm9ybWF0dGluZ19odWdlX3ByZWNpc2lvbihzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IElOVF9NQVgKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9IHUiJS57fWYiLmZvcm1hdChJTlRfTUFYICsgMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdF9zdHJpbmcgJSAyLjM0CisKKyAgICBkZWYgdGVzdF9mb3JtYXR0aW5nX2h1Z2Vfd2lkdGgoc2VsZik6CisgICAgICAgIGZvcm1hdF9zdHJpbmcgPSB1IiV7fWYiLmZvcm1hdChzeXMubWF4c2l6ZSArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXRfc3RyaW5nICUgMi4zNAorCisgICAgZGVmIHRlc3Rfc3RhcnRzd2l0aF9lbmRzd2l0aF9lcnJvcnMoc2VsZik6CisgICAgICAgIGZvciBtZXRoIGluICh1J2Zvbycuc3RhcnRzd2l0aCwgdSdmb28nLmVuZHN3aXRoKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yKToKKyAgICAgICAgICAgICAgICBtZXRoKCdceGZmJykKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgICAgICBtZXRoKFsnZiddKQorICAgICAgICAgICAgZXhjID0gc3RyKGNtLmV4Y2VwdGlvbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VuaWNvZGUnLCBleGMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdzdHInLCBleGMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCd0dXBsZScsIGV4YykKKworICAgIEB0ZXN0X3N1cHBvcnQucnVuX3dpdGhfbG9jYWxlKCdMQ19BTEwnLCAnZGVfREUnLCAnZnJfRlInKQorICAgIGRlZiB0ZXN0X2Zvcm1hdF9mbG9hdChzZWxmKToKKyAgICAgICAgIyBzaG91bGQgbm90IGZvcm1hdCB3aXRoIGEgY29tbWEsIGJ1dCBhbHdheXMgd2l0aCBDIGxvY2FsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnMS4wJywgdSclLjFmJyAlIDEuMCkKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICAjIHVuaWNvZGUob2JqKSB0ZXN0cyAodGhpcyBtYXBzIHRvIFB5T2JqZWN0X1VuaWNvZGUoKSBhdCBDIGxldmVsKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1bmljb2RlKHUndW5pY29kZSByZW1haW5zIHVuaWNvZGUnKSwKKyAgICAgICAgICAgIHUndW5pY29kZSByZW1haW5zIHVuaWNvZGUnCisgICAgICAgICkKKworICAgICAgICBjbGFzcyBVbmljb2RlU3ViY2xhc3ModW5pY29kZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHVuaWNvZGUoVW5pY29kZVN1YmNsYXNzKCd1bmljb2RlIHN1YmNsYXNzIGJlY29tZXMgdW5pY29kZScpKSwKKyAgICAgICAgICAgIHUndW5pY29kZSBzdWJjbGFzcyBiZWNvbWVzIHVuaWNvZGUnCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdW5pY29kZSgnc3RyaW5ncyBhcmUgY29udmVydGVkIHRvIHVuaWNvZGUnKSwKKyAgICAgICAgICAgIHUnc3RyaW5ncyBhcmUgY29udmVydGVkIHRvIHVuaWNvZGUnCisgICAgICAgICkKKworICAgICAgICBjbGFzcyBVbmljb2RlQ29tcGF0OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi54CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHVuaWNvZGUoVW5pY29kZUNvbXBhdCgnX191bmljb2RlX18gY29tcGF0aWJsZSBvYmplY3RzIGFyZSByZWNvZ25pemVkJykpLAorICAgICAgICAgICAgdSdfX3VuaWNvZGVfXyBjb21wYXRpYmxlIG9iamVjdHMgYXJlIHJlY29nbml6ZWQnKQorCisgICAgICAgIGNsYXNzIFN0cmluZ0NvbXBhdDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi54CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHVuaWNvZGUoU3RyaW5nQ29tcGF0KCdfX3N0cl9fIGNvbXBhdGlibGUgb2JqZWN0cyBhcmUgcmVjb2duaXplZCcpKSwKKyAgICAgICAgICAgIHUnX19zdHJfXyBjb21wYXRpYmxlIG9iamVjdHMgYXJlIHJlY29nbml6ZWQnCisgICAgICAgICkKKworICAgICAgICAjIHVuaWNvZGUob2JqKSBpcyBjb21wYXRpYmxlIHRvIHN0cigpOgorCisgICAgICAgIG8gPSBTdHJpbmdDb21wYXQoJ3VuaWNvZGUob2JqKSBpcyBjb21wYXRpYmxlIHRvIHN0cigpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKG8pLCB1J3VuaWNvZGUob2JqKSBpcyBjb21wYXRpYmxlIHRvIHN0cigpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobyksICd1bmljb2RlKG9iaikgaXMgY29tcGF0aWJsZSB0byBzdHIoKScpCisKKyAgICAgICAgIyAlLWZvcm1hdHRpbmcgYW5kIC5fX3VuaWNvZGVfXygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSclcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVDb21wYXQodSJ1JyVzJyAlIG9iaiB1c2VzIG9iai5fX3VuaWNvZGVfXygpIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSJ1JyVzJyAlIG9iaiB1c2VzIG9iai5fX3VuaWNvZGVfXygpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1JyVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgVW5pY29kZUNvbXBhdCh1InUnJXMnICUgb2JqIGZhbGxzIGJhY2sgdG8gb2JqLl9fc3RyX18oKSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUidSclcycgJSBvYmogZmFsbHMgYmFjayB0byBvYmouX19zdHJfXygpIikKKworICAgICAgICBmb3Igb2JqIGluICgxMjMsIDEyMy40NSwgMTIzTCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUob2JqKSwgdW5pY29kZShzdHIob2JqKSkpCisKKyAgICAgICAgIyB1bmljb2RlKG9iaiwgZW5jb2RpbmcsIGVycm9yKSB0ZXN0cyAodGhpcyBtYXBzIHRvCisgICAgICAgICMgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KCkgYXQgQyBsZXZlbCkKKworICAgICAgICBpZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgIFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICB1bmljb2RlLAorICAgICAgICAgICAgICAgIHUnZGVjb2RpbmcgdW5pY29kZSBpcyBub3Qgc3VwcG9ydGVkJywKKyAgICAgICAgICAgICAgICAndXRmLTgnLAorICAgICAgICAgICAgICAgICdzdHJpY3QnCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHVuaWNvZGUoJ3N0cmluZ3MgYXJlIGRlY29kZWQgdG8gdW5pY29kZScsICd1dGYtOCcsICdzdHJpY3QnKSwKKyAgICAgICAgICAgIHUnc3RyaW5ncyBhcmUgZGVjb2RlZCB0byB1bmljb2RlJworICAgICAgICApCisKKyAgICAgICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAgYnVmID0gYnVmZmVyKCdjaGFyYWN0ZXIgYnVmZmVycyBhcmUgZGVjb2RlZCB0byB1bmljb2RlJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgdW5pY29kZSgKKyAgICAgICAgICAgICAgICAgICAgYnVmLAorICAgICAgICAgICAgICAgICAgICAndXRmLTgnLAorICAgICAgICAgICAgICAgICAgICAnc3RyaWN0JworICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgdSdjaGFyYWN0ZXIgYnVmZmVycyBhcmUgZGVjb2RlZCB0byB1bmljb2RlJworICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdW5pY29kZSwgNDIsIDQyLCA0MikKKworICAgIGRlZiB0ZXN0X2NvZGVjc191dGY3KHNlbGYpOgorICAgICAgICB1dGZUZXN0cyA9IFsKKyAgICAgICAgICAgICh1J0FcdTIyNjJcdTAzOTEuJywgJ0ErSW1JRGtRLicpLCAgICAgICAgICAgICAjIFJGQzIxNTIgZXhhbXBsZQorICAgICAgICAgICAgKHUnSGkgTW9tIC1cdTI2M2EtIScsICdIaSBNb20gLStKam8tLSEnKSwgICAgICMgUkZDMjE1MiBleGFtcGxlCisgICAgICAgICAgICAodSdcdTY1RTVcdTY3MkNcdThBOUUnLCAnK1plVm5MSXFlLScpLCAgICAgICAgIyBSRkMyMTUyIGV4YW1wbGUKKyAgICAgICAgICAgICh1J0l0ZW0gMyBpcyBcdTAwYTMxLicsICdJdGVtIDMgaXMgK0FLTS0xLicpLCAjIFJGQzIxNTIgZXhhbXBsZQorICAgICAgICAgICAgKHUnKycsICcrLScpLAorICAgICAgICAgICAgKHUnKy0nLCAnKy0tJyksCisgICAgICAgICAgICAodScrPycsICcrLT8nKSwKKyAgICAgICAgICAgICh1J1w/JywgJytBRnc/JyksCisgICAgICAgICAgICAodScrPycsICcrLT8nKSwKKyAgICAgICAgICAgICh1cidcXD8nLCAnK0FGd0FYQT8nKSwKKyAgICAgICAgICAgICh1cidcXFw/JywgJytBRndBWEFCYz8nKSwKKyAgICAgICAgICAgICh1cicrKy0tJywgJystKy0tLScpLAorICAgICAgICAgICAgKHUnXFUwMDBhYmNkZScsICcrMm0vYzNnLScpLCAgICAgICAgICAgICAgICAgICMgc3Vycm9nYXRlIHBhaXJzCisgICAgICAgICAgICAodScvJywgJy8nKSwKKyAgICAgICAgXQorCisgICAgICAgIGZvciAoeCwgeSkgaW4gdXRmVGVzdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZW5jb2RlKCd1dGYtNycpLCB5KQorCisgICAgICAgICMgVW5wYWlyZWQgc3Vycm9nYXRlcyBhcmUgcGFzc2VkIHRocm91Z2gKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1RDgwMScuZW5jb2RlKCd1dGYtNycpLCAnKzJBRS0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHVEODAxeCcuZW5jb2RlKCd1dGYtNycpLCAnKzJBRS14JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1REMwMScuZW5jb2RlKCd1dGYtNycpLCAnKzNBRS0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHVEQzAxeCcuZW5jb2RlKCd1dGYtNycpLCAnKzNBRS14JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnKzJBRS0nLmRlY29kZSgndXRmLTcnKSwgdSdcdUQ4MDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcrMkFFLXgnLmRlY29kZSgndXRmLTcnKSwgdSdcdUQ4MDF4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnKzNBRS0nLmRlY29kZSgndXRmLTcnKSwgdSdcdURDMDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcrM0FFLXgnLmRlY29kZSgndXRmLTcnKSwgdSdcdURDMDF4JykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHVEODAxXFUwMDBhYmNkZScuZW5jb2RlKCd1dGYtNycpLCAnKzJBSGFiOXplLScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJysyQUhhYjl6ZS0nLmRlY29kZSgndXRmLTcnKSwgdSdcdUQ4MDFcVTAwMGFiY2RlJykKKworICAgICAgICAjIERpcmVjdCBlbmNvZGVkIGNoYXJhY3RlcnMKKyAgICAgICAgc2V0X2QgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknKCksLS4vOj8iCisgICAgICAgICMgT3B0aW9uYWwgZGlyZWN0IGNoYXJhY3RlcnMKKyAgICAgICAgc2V0X28gPSAnISIjJCUmKjs8PT5AW11eX2B7fH0nCisgICAgICAgIGZvciBjIGluIHNldF9kOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmVuY29kZSgndXRmNycpLCBjLmVuY29kZSgnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5lbmNvZGUoJ2FzY2lpJykuZGVjb2RlKCd1dGY3JyksIHVuaWNvZGUoYykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYyA9PSBjLmVuY29kZSgnYXNjaWknKS5kZWNvZGUoJ3V0ZjcnKSkKKyAgICAgICAgZm9yIGMgaW4gc2V0X286CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZW5jb2RlKCdhc2NpaScpLmRlY29kZSgndXRmNycpLCB1bmljb2RlKGMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMgPT0gYy5lbmNvZGUoJ2FzY2lpJykuZGVjb2RlKCd1dGY3JykpCisKKyAgICBkZWYgdGVzdF9jb2RlY3NfdXRmOChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1JycuZW5jb2RlKCd1dGYtOCcpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1MjBhYycuZW5jb2RlKCd1dGYtOCcpLCAnXHhlMlx4ODJceGFjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1ZDgwMFx1ZGMwMicuZW5jb2RlKCd1dGYtOCcpLCAnXHhmMFx4OTBceDgwXHg4MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdWQ4NGRcdWRjNTYnLmVuY29kZSgndXRmLTgnKSwgJ1x4ZjBceGEzXHg5MVx4OTYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHVkODAwJy5lbmNvZGUoJ3V0Zi04JyksICdceGVkXHhhMFx4ODAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHVkYzAwJy5lbmNvZGUoJ3V0Zi04JyksICdceGVkXHhiMFx4ODAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgKHUnXHVkODAwXHVkYzAyJyoxMDAwKS5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICAnXHhmMFx4OTBceDgwXHg4MicqMTAwMAorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1J1x1NmI2M1x1NzhiYVx1MzA2Ylx1OGEwMFx1MzA0Nlx1MzA2OFx1N2ZmYlx1OGEzM1x1MzA2ZicKKyAgICAgICAgICAgIHUnXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXHU0ZTAwJworICAgICAgICAgICAgdSdcdTkwZThcdTMwNmZcdTMwYzlcdTMwYTRcdTMwYzRcdThhOWVcdTMwNjdcdTMwNTlcdTMwNGMnCisgICAgICAgICAgICB1J1x1MzAwMVx1MzA0Mlx1MzA2OFx1MzA2Zlx1MzA2N1x1MzA1Zlx1MzA4OVx1MzA4MVx1MzA2NycKKyAgICAgICAgICAgIHUnXHUzMDU5XHUzMDAyXHU1YjlmXHU5NjliXHUzMDZiXHUzMDZmXHUzMDBjV2VubiBpc3QgZGFzJworICAgICAgICAgICAgdScgTnVuc3R1Y2sgZ2l0IHVuZCcuZW5jb2RlKCd1dGYtOCcpLAorICAgICAgICAgICAgJ1x4ZTZceGFkXHhhM1x4ZTdceGEyXHhiYVx4ZTNceDgxXHhhYlx4ZThceGE4XHg4MFx4ZTNceDgxJworICAgICAgICAgICAgJ1x4ODZceGUzXHg4MVx4YThceGU3XHhiZlx4YmJceGU4XHhhOFx4YjNceGUzXHg4MVx4YWZceGUzJworICAgICAgICAgICAgJ1x4ODFceDk1XHhlM1x4ODJceDhjXHhlM1x4ODFceGE2XHhlM1x4ODFceDg0XHhlM1x4ODFceGJlJworICAgICAgICAgICAgJ1x4ZTNceDgxXHg5Ylx4ZTNceDgyXHg5M1x4ZTNceDgwXHg4Mlx4ZTRceGI4XHg4MFx4ZTlceDgzJworICAgICAgICAgICAgJ1x4YThceGUzXHg4MVx4YWZceGUzXHg4M1x4ODlceGUzXHg4Mlx4YTRceGUzXHg4M1x4ODRceGU4JworICAgICAgICAgICAgJ1x4YWFceDllXHhlM1x4ODFceGE3XHhlM1x4ODFceDk5XHhlM1x4ODFceDhjXHhlM1x4ODBceDgxJworICAgICAgICAgICAgJ1x4ZTNceDgxXHg4Mlx4ZTNceDgxXHhhOFx4ZTNceDgxXHhhZlx4ZTNceDgxXHhhN1x4ZTNceDgxJworICAgICAgICAgICAgJ1x4OWZceGUzXHg4Mlx4ODlceGUzXHg4Mlx4ODFceGUzXHg4MVx4YTdceGUzXHg4MVx4OTlceGUzJworICAgICAgICAgICAgJ1x4ODBceDgyXHhlNVx4YWVceDlmXHhlOVx4OWFceDliXHhlM1x4ODFceGFiXHhlM1x4ODFceGFmJworICAgICAgICAgICAgJ1x4ZTNceDgwXHg4Y1dlbm4gaXN0IGRhcyBOdW5zdHVjayBnaXQgdW5kJworICAgICAgICApCisKKyAgICAgICAgIyBVVEYtOCBzcGVjaWZpYyBkZWNvZGluZyB0ZXN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJ1x4ZjBceGEzXHg5MVx4OTYnLCAndXRmLTgnKSwgdSdcVTAwMDIzNDU2JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCdceGYwXHg5MFx4ODBceDgyJywgJ3V0Zi04JyksIHUnXFUwMDAxMDAwMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnXHhlMlx4ODJceGFjJywgJ3V0Zi04JyksIHUnXHUyMGFjJykKKworICAgICAgICAjIE90aGVyIHBvc3NpYmxlIHV0Zi04IHRlc3QgY2FzZXM6CisgICAgICAgICMgKiBzdHJpY3QgZGVjb2RpbmcgdGVzdGluZyBmb3IgYWxsIG9mIHRoZQorICAgICAgICAjICAgVVRGOF9FUlJPUiBjYXNlcyBpbiBQeVVuaWNvZGVfRGVjb2RlVVRGOAorCisgICAgZGVmIHRlc3RfdXRmOF9kZWNvZGVfdmFsaWRfc2VxdWVuY2VzKHNlbGYpOgorICAgICAgICBzZXF1ZW5jZXMgPSBbCisgICAgICAgICAgICAjIHNpbmdsZSBieXRlCisgICAgICAgICAgICAoJ1x4MDAnLCB1J1x4MDAnKSwgKCdhJywgdSdhJyksICgnXHg3ZicsIHUnXHg3ZicpLAorICAgICAgICAgICAgIyAyIGJ5dGVzCisgICAgICAgICAgICAoJ1x4YzJceDgwJywgdSdceDgwJyksICgnXHhkZlx4YmYnLCB1J1x1MDdmZicpLAorICAgICAgICAgICAgIyAzIGJ5dGVzCisgICAgICAgICAgICAoJ1x4ZTBceGEwXHg4MCcsIHUnXHUwODAwJyksICgnXHhlZFx4OWZceGJmJywgdSdcdWQ3ZmYnKSwKKyAgICAgICAgICAgICgnXHhlZVx4ODBceDgwJywgdSdcdUUwMDAnKSwgKCdceGVmXHhiZlx4YmYnLCB1J1x1ZmZmZicpLAorICAgICAgICAgICAgIyA0IGJ5dGVzCisgICAgICAgICAgICAoJ1x4RjBceDkwXHg4MFx4ODAnLCB1J1xVMDAwMTAwMDAnKSwKKyAgICAgICAgICAgICgnXHhmNFx4OGZceGJmXHhiZicsIHUnXFUwMDEwRkZGRicpCisgICAgICAgIF0KKyAgICAgICAgZm9yIHNlcSwgcmVzIGluIHNlcXVlbmNlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VxLmRlY29kZSgndXRmLTgnKSwgcmVzKQorCisgICAgICAgIGZvciBjaCBpbiBtYXAodW5pY2hyLCByYW5nZSgwLCBzeXMubWF4dW5pY29kZSkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaCwgY2guZW5jb2RlKCd1dGYtOCcpLmRlY29kZSgndXRmLTgnKSkKKworICAgIGRlZiB0ZXN0X3V0ZjhfZGVjb2RlX2ludmFsaWRfc2VxdWVuY2VzKHNlbGYpOgorICAgICAgICAjIGNvbnRpbnVhdGlvbiBieXRlcyBpbiBhIHNlcXVlbmNlIG9mIDIsIDMsIG9yIDQgYnl0ZXMKKyAgICAgICAgY29udGludWF0aW9uX2J5dGVzID0gbWFwKGNociwgcmFuZ2UoMHg4MCwgMHhDMCkpCisgICAgICAgICMgc3RhcnQgYnl0ZXMgb2YgYSAyLWJ5dGUgc2VxdWVuY2UgZXF1aXZhbGVudCB0byBjb2RlcG9pbnRzIDwgMHg3RgorICAgICAgICBpbnZhbGlkXzJCX3NlcV9zdGFydF9ieXRlcyA9IG1hcChjaHIsIHJhbmdlKDB4QzAsIDB4QzIpKQorICAgICAgICAjIHN0YXJ0IGJ5dGVzIG9mIGEgNC1ieXRlIHNlcXVlbmNlIGVxdWl2YWxlbnQgdG8gY29kZXBvaW50cyA+IDB4MTBGRkZGCisgICAgICAgIGludmFsaWRfNEJfc2VxX3N0YXJ0X2J5dGVzID0gbWFwKGNociwgcmFuZ2UoMHhGNSwgMHhGOCkpCisgICAgICAgIGludmFsaWRfc3RhcnRfYnl0ZXMgPSAoCisgICAgICAgICAgICBjb250aW51YXRpb25fYnl0ZXMgKyBpbnZhbGlkXzJCX3NlcV9zdGFydF9ieXRlcyArCisgICAgICAgICAgICBpbnZhbGlkXzRCX3NlcV9zdGFydF9ieXRlcyArIG1hcChjaHIsIHJhbmdlKDB4RjcsIDB4MTAwKSkKKyAgICAgICAgKQorCisgICAgICAgIGZvciBieXRlIGluIGludmFsaWRfc3RhcnRfYnl0ZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGJ5dGUuZGVjb2RlLCAndXRmLTgnKQorCisgICAgICAgIGZvciBzYiBpbiBpbnZhbGlkXzJCX3NlcV9zdGFydF9ieXRlczoKKyAgICAgICAgICAgIGZvciBjYiBpbiBjb250aW51YXRpb25fYnl0ZXM6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCAoc2IrY2IpLmRlY29kZSwgJ3V0Zi04JykKKworICAgICAgICBmb3Igc2IgaW4gaW52YWxpZF80Ql9zZXFfc3RhcnRfYnl0ZXM6CisgICAgICAgICAgICBmb3IgY2IxIGluIGNvbnRpbnVhdGlvbl9ieXRlc1s6M106CisgICAgICAgICAgICAgICAgZm9yIGNiMyBpbiBjb250aW51YXRpb25fYnl0ZXNbOjNdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYitjYjErJ1x4ODAnK2NiMykuZGVjb2RlLCAndXRmLTgnKQorCisgICAgICAgIGZvciBjYiBpbiBtYXAoY2hyLCByYW5nZSgweDgwLCAweEEwKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ1x4RTAnK2NiKydceDgwJykuZGVjb2RlLCAndXRmLTgnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdceEUwJytjYisnXHhCRicpLmRlY29kZSwgJ3V0Zi04JykKKyAgICAgICAgIyBYWFg6IHN1cnJvZ2F0ZXMgc2hvdWxkbid0IGJlIHZhbGlkIFVURi04IQorICAgICAgICAjIHNlZSBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3ZlcnNpb25zL1VuaWNvZGU1LjIuMC9jaDAzLnBkZgorICAgICAgICAjICh0YWJsZSAzLTcpIGFuZCBodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMzNjI5LnR4dAorICAgICAgICAjZm9yIGNiIGluIG1hcChjaHIsIHJhbmdlKDB4QTAsIDB4QzApKToKKyAgICAgICAgICAgICNzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjKCdceEVEJytjYisnXHg4MCcpLmRlY29kZSwgJ3V0Zi04JykKKyAgICAgICAgICAgICNzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjKCdceEVEJytjYisnXHhCRicpLmRlY29kZSwgJ3V0Zi04JykKKyAgICAgICAgIyBidXQgc2luY2UgdGhleSBhcmUgdmFsaWQgb24gUHl0aG9uIDIgYWRkIGEgdGVzdCBmb3IgdGhhdDoKKyAgICAgICAgZm9yIGNiLCBzdXJyb2dhdGUgaW4gemlwKG1hcChjaHIsIHJhbmdlKDB4QTAsIDB4QzApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCh1bmljaHIsIHJhbmdlKDB4ZDgwMCwgMHhlMDAwLCA2NCkpKToKKyAgICAgICAgICAgIGVuY29kZWQgPSAnXHhFRCcrY2IrJ1x4ODAnCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZWQuZGVjb2RlKCd1dGYtOCcpLCBzdXJyb2dhdGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1cnJvZ2F0ZS5lbmNvZGUoJ3V0Zi04JyksIGVuY29kZWQpCisKKyAgICAgICAgZm9yIGNiIGluIG1hcChjaHIsIHJhbmdlKDB4ODAsIDB4OTApKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnXHhGMCcrY2IrJ1x4ODBceDgwJykuZGVjb2RlLCAndXRmLTgnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdceEYwJytjYisnXHhCRlx4QkYnKS5kZWNvZGUsICd1dGYtOCcpCisgICAgICAgIGZvciBjYiBpbiBtYXAoY2hyLCByYW5nZSgweDkwLCAweEMwKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ1x4RjQnK2NiKydceDgwXHg4MCcpLmRlY29kZSwgJ3V0Zi04JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnXHhGNCcrY2IrJ1x4QkZceEJGJykuZGVjb2RlLCAndXRmLTgnKQorCisgICAgZGVmIHRlc3RfaXNzdWU4MjcxKHNlbGYpOgorICAgICAgICAjIElzc3VlICM4MjcxOiBkdXJpbmcgdGhlIGRlY29kaW5nIG9mIGFuIGludmFsaWQgVVRGLTggYnl0ZSBzZXF1ZW5jZSwKKyAgICAgICAgIyBvbmx5IHRoZSBzdGFydCBieXRlIGFuZCB0aGUgY29udGludWF0aW9uIGJ5dGUocykgYXJlIG5vdyBjb25zaWRlcmVkCisgICAgICAgICMgaW52YWxpZCwgaW5zdGVhZCBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNwZWNpZmllZCBieSB0aGUgc3RhcnQgYnl0ZS4KKyAgICAgICAgIyBTZWUgaHR0cDovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlNS4yLjAvY2gwMy5wZGYgKHBhZ2UgOTUsCisgICAgICAgICMgdGFibGUgMy04LCBSb3cgMikgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGFsZ29yaXRobSB1c2VkLgorICAgICAgICBGRkZEID0gdSdcdWZmZmQnCisgICAgICAgIHNlcXVlbmNlcyA9IFsKKyAgICAgICAgICAgICMgaW52YWxpZCBzdGFydCBieXRlcworICAgICAgICAgICAgKCdceDgwJywgRkZGRCksICMgY29udGludWF0aW9uIGJ5dGUKKyAgICAgICAgICAgICgnXHg4MFx4ODAnLCBGRkZEKjIpLCAjIDIgY29udGludWF0aW9uIGJ5dGVzCisgICAgICAgICAgICAoJ1x4YzAnLCBGRkZEKSwKKyAgICAgICAgICAgICgnXHhjMFx4YzAnLCBGRkZEKjIpLAorICAgICAgICAgICAgKCdceGMxJywgRkZGRCksCisgICAgICAgICAgICAoJ1x4YzFceGMwJywgRkZGRCoyKSwKKyAgICAgICAgICAgICgnXHhjMFx4YzEnLCBGRkZEKjIpLAorICAgICAgICAgICAgIyB3aXRoIHN0YXJ0IGJ5dGUgb2YgYSAyLWJ5dGUgc2VxdWVuY2UKKyAgICAgICAgICAgICgnXHhjMicsIEZGRkQpLCAjIG9ubHkgdGhlIHN0YXJ0IGJ5dGUKKyAgICAgICAgICAgICgnXHhjMlx4YzInLCBGRkZEKjIpLCAjIDIgc3RhcnQgYnl0ZXMKKyAgICAgICAgICAgICgnXHhjMlx4YzJceGMyJywgRkZGRCozKSwgIyAyIHN0YXJ0IGJ5dGVzCisgICAgICAgICAgICAoJ1x4YzJceDQxJywgRkZGRCsnQScpLCAjIGludmFsaWQgY29udGludWF0aW9uIGJ5dGUKKyAgICAgICAgICAgICMgd2l0aCBzdGFydCBieXRlIG9mIGEgMy1ieXRlIHNlcXVlbmNlCisgICAgICAgICAgICAoJ1x4ZTEnLCBGRkZEKSwgIyBvbmx5IHRoZSBzdGFydCBieXRlCisgICAgICAgICAgICAoJ1x4ZTFceGUxJywgRkZGRCoyKSwgIyAyIHN0YXJ0IGJ5dGVzCisgICAgICAgICAgICAoJ1x4ZTFceGUxXHhlMScsIEZGRkQqMyksICMgMyBzdGFydCBieXRlcworICAgICAgICAgICAgKCdceGUxXHhlMVx4ZTFceGUxJywgRkZGRCo0KSwgIyA0IHN0YXJ0IGJ5dGVzCisgICAgICAgICAgICAoJ1x4ZTFceDgwJywgRkZGRCksICMgb25seSAxIGNvbnRpbnVhdGlvbiBieXRlCisgICAgICAgICAgICAoJ1x4ZTFceDQxJywgRkZGRCsnQScpLCAjIGludmFsaWQgY29udGludWF0aW9uIGJ5dGUKKyAgICAgICAgICAgICgnXHhlMVx4NDFceDgwJywgRkZGRCsnQScrRkZGRCksICMgaW52YWxpZCBjYiBmb2xsb3dlZCBieSB2YWxpZCBjYgorICAgICAgICAgICAgKCdceGUxXHg0MVx4NDEnLCBGRkZEKydBQScpLCAjIDIgaW52YWxpZCBjb250aW51YXRpb24gYnl0ZXMKKyAgICAgICAgICAgICgnXHhlMVx4ODBceDQxJywgRkZGRCsnQScpLCAjIG9ubHkgMSB2YWxpZCBjb250aW51YXRpb24gYnl0ZQorICAgICAgICAgICAgKCdceGUxXHg4MFx4ZTFceDQxJywgRkZGRCoyKydBJyksICMgMSB2YWxpZCBhbmQgdGhlIG90aGVyIGludmFsaWQKKyAgICAgICAgICAgICgnXHhlMVx4NDFceGUxXHg4MCcsIEZGRkQrJ0EnK0ZGRkQpLCAjIDEgaW52YWxpZCBhbmQgdGhlIG90aGVyIHZhbGlkCisgICAgICAgICAgICAjIHdpdGggc3RhcnQgYnl0ZSBvZiBhIDQtYnl0ZSBzZXF1ZW5jZQorICAgICAgICAgICAgKCdceGYxJywgRkZGRCksICMgb25seSB0aGUgc3RhcnQgYnl0ZQorICAgICAgICAgICAgKCdceGYxXHhmMScsIEZGRkQqMiksICMgMiBzdGFydCBieXRlcworICAgICAgICAgICAgKCdceGYxXHhmMVx4ZjEnLCBGRkZEKjMpLCAjIDMgc3RhcnQgYnl0ZXMKKyAgICAgICAgICAgICgnXHhmMVx4ZjFceGYxXHhmMScsIEZGRkQqNCksICMgNCBzdGFydCBieXRlcworICAgICAgICAgICAgKCdceGYxXHhmMVx4ZjFceGYxXHhmMScsIEZGRkQqNSksICMgNSBzdGFydCBieXRlcworICAgICAgICAgICAgKCdceGYxXHg4MCcsIEZGRkQpLCAjIG9ubHkgMSBjb250aW51YXRpb24gYnl0ZXMKKyAgICAgICAgICAgICgnXHhmMVx4ODBceDgwJywgRkZGRCksICMgb25seSAyIGNvbnRpbnVhdGlvbiBieXRlcworICAgICAgICAgICAgKCdceGYxXHg4MFx4NDEnLCBGRkZEKydBJyksICMgMSB2YWxpZCBjYiBhbmQgMSBpbnZhbGlkCisgICAgICAgICAgICAoJ1x4ZjFceDgwXHg0MVx4NDEnLCBGRkZEKydBQScpLCAjIDEgdmFsaWQgY2IgYW5kIDEgaW52YWxpZAorICAgICAgICAgICAgKCdceGYxXHg4MFx4ODBceDQxJywgRkZGRCsnQScpLCAjIDIgdmFsaWQgY2IgYW5kIDEgaW52YWxpZAorICAgICAgICAgICAgKCdceGYxXHg0MVx4ODAnLCBGRkZEKydBJytGRkZEKSwgIyAxIGludmFsaWQgY3YgYW5kIDEgdmFsaWQKKyAgICAgICAgICAgICgnXHhmMVx4NDFceDgwXHg4MCcsIEZGRkQrJ0EnK0ZGRkQqMiksICMgMSBpbnZhbGlkIGNiIGFuZCAyIGludmFsaWQKKyAgICAgICAgICAgICgnXHhmMVx4NDFceDgwXHg0MScsIEZGRkQrJ0EnK0ZGRkQrJ0EnKSwgIyAyIGludmFsaWQgY2IgYW5kIDEgaW52YWxpZAorICAgICAgICAgICAgKCdceGYxXHg0MVx4NDFceDgwJywgRkZGRCsnQUEnK0ZGRkQpLCAjIDEgdmFsaWQgY2IgYW5kIDEgaW52YWxpZAorICAgICAgICAgICAgKCdceGYxXHg0MVx4ZjFceDgwJywgRkZGRCsnQScrRkZGRCksCisgICAgICAgICAgICAoJ1x4ZjFceDQxXHg4MFx4ZjEnLCBGRkZEKydBJytGRkZEKjIpLAorICAgICAgICAgICAgKCdceGYxXHhmMVx4ODBceDQxJywgRkZGRCoyKydBJyksCisgICAgICAgICAgICAoJ1x4ZjFceDQxXHhmMVx4ZjEnLCBGRkZEKydBJytGRkZEKjIpLAorICAgICAgICAgICAgIyB3aXRoIGludmFsaWQgc3RhcnQgYnl0ZSBvZiBhIDQtYnl0ZSBzZXF1ZW5jZSAocmZjMjI3OSkKKyAgICAgICAgICAgICgnXHhmNScsIEZGRkQpLCAjIG9ubHkgdGhlIHN0YXJ0IGJ5dGUKKyAgICAgICAgICAgICgnXHhmNVx4ZjUnLCBGRkZEKjIpLCAjIDIgc3RhcnQgYnl0ZXMKKyAgICAgICAgICAgICgnXHhmNVx4ODAnLCBGRkZEKjIpLCAjIG9ubHkgMSBjb250aW51YXRpb24gYnl0ZQorICAgICAgICAgICAgKCdceGY1XHg4MFx4ODAnLCBGRkZEKjMpLCAjIG9ubHkgMiBjb250aW51YXRpb24gYnl0ZQorICAgICAgICAgICAgKCdceGY1XHg4MFx4ODBceDgwJywgRkZGRCo0KSwgIyAzIGNvbnRpbnVhdGlvbiBieXRlcworICAgICAgICAgICAgKCdceGY1XHg4MFx4NDEnLCBGRkZEKjIrJ0EnKSwgIyAgMSB2YWxpZCBjYiBhbmQgMSBpbnZhbGlkCisgICAgICAgICAgICAoJ1x4ZjVceDgwXHg0MVx4ZjUnLCBGRkZEKjIrJ0EnK0ZGRkQpLAorICAgICAgICAgICAgKCdceGY1XHg0MVx4ODBceDgwXHg0MScsIEZGRkQrJ0EnK0ZGRkQqMisnQScpLAorICAgICAgICAgICAgIyB3aXRoIGludmFsaWQgc3RhcnQgYnl0ZSBvZiBhIDUtYnl0ZSBzZXF1ZW5jZSAocmZjMjI3OSkKKyAgICAgICAgICAgICgnXHhmOCcsIEZGRkQpLCAjIG9ubHkgdGhlIHN0YXJ0IGJ5dGUKKyAgICAgICAgICAgICgnXHhmOFx4ZjgnLCBGRkZEKjIpLCAjIDIgc3RhcnQgYnl0ZXMKKyAgICAgICAgICAgICgnXHhmOFx4ODAnLCBGRkZEKjIpLCAjIG9ubHkgb25lIGNvbnRpbnVhdGlvbiBieXRlCisgICAgICAgICAgICAoJ1x4ZjhceDgwXHg0MScsIEZGRkQqMiArICdBJyksICMgMSB2YWxpZCBjYiBhbmQgMSBpbnZhbGlkCisgICAgICAgICAgICAoJ1x4ZjhceDgwXHg4MFx4ODBceDgwJywgRkZGRCo1KSwgIyBpbnZhbGlkIDUgYnl0ZXMgc2VxIHdpdGggNSBieXRlcworICAgICAgICAgICAgIyB3aXRoIGludmFsaWQgc3RhcnQgYnl0ZSBvZiBhIDYtYnl0ZSBzZXF1ZW5jZSAocmZjMjI3OSkKKyAgICAgICAgICAgICgnXHhmYycsIEZGRkQpLCAjIG9ubHkgdGhlIHN0YXJ0IGJ5dGUKKyAgICAgICAgICAgICgnXHhmY1x4ZmMnLCBGRkZEKjIpLCAjIDIgc3RhcnQgYnl0ZXMKKyAgICAgICAgICAgICgnXHhmY1x4ODBceDgwJywgRkZGRCozKSwgIyBvbmx5IDIgY29udGludWF0aW9uIGJ5dGVzCisgICAgICAgICAgICAoJ1x4ZmNceDgwXHg4MFx4ODBceDgwXHg4MCcsIEZGRkQqNiksICMgNiBjb250aW51YXRpb24gYnl0ZXMKKyAgICAgICAgICAgICMgaW52YWxpZCBzdGFydCBieXRlCisgICAgICAgICAgICAoJ1x4ZmUnLCBGRkZEKSwKKyAgICAgICAgICAgICgnXHhmZVx4ODBceDgwJywgRkZGRCozKSwKKyAgICAgICAgICAgICMgb3RoZXIgc2VxdWVuY2VzCisgICAgICAgICAgICAoJ1x4ZjFceDgwXHg0MVx4NDJceDQzJywgdSdcdWZmZmRceDQxXHg0Mlx4NDMnKSwKKyAgICAgICAgICAgICgnXHhmMVx4ODBceGZmXHg0Mlx4NDMnLCB1J1x1ZmZmZFx1ZmZmZFx4NDJceDQzJyksCisgICAgICAgICAgICAoJ1x4ZjFceDgwXHhjMlx4ODFceDQzJywgdSdcdWZmZmRceDgxXHg0MycpLAorICAgICAgICAgICAgKCdceDYxXHhGMVx4ODBceDgwXHhFMVx4ODBceEMyXHg2Mlx4ODBceDYzXHg4MFx4QkZceDY0JywKKyAgICAgICAgICAgICB1J1x4NjFcdUZGRkRcdUZGRkRcdUZGRkRceDYyXHVGRkZEXHg2M1x1RkZGRFx1RkZGRFx4NjQnKSwKKyAgICAgICAgXQorICAgICAgICBmb3IgbiwgKHNlcSwgcmVzKSBpbiBlbnVtZXJhdGUoc2VxdWVuY2VzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgc2VxLmRlY29kZSwgJ3V0Zi04JywgJ3N0cmljdCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcS5kZWNvZGUoJ3V0Zi04JywgJ3JlcGxhY2UnKSwgcmVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoc2VxKydiJykuZGVjb2RlKCd1dGYtOCcsICdyZXBsYWNlJyksIHJlcysnYicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcS5kZWNvZGUoJ3V0Zi04JywgJ2lnbm9yZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMucmVwbGFjZSh1J1x1RkZGRCcsICcnKSkKKworICAgIGRlZiB0ZXN0X2NvZGVjc19pZG5hKHNlbGYpOgorICAgICAgICAjIFRlc3Qgd2hldGhlciB0cmFpbGluZyBkb3QgaXMgcHJlc2VydmVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJ3d3cucHl0aG9uLm9yZy4iLmVuY29kZSgiaWRuYSIpLCAid3d3LnB5dGhvbi5vcmcuIikKKworICAgIGRlZiB0ZXN0X2NvZGVjc19lcnJvcnMoc2VsZik6CisgICAgICAgICMgRXJyb3IgaGFuZGxpbmcgKGVuY29kaW5nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHUnQW5kclwyMDIgeCcuZW5jb2RlLCAnYXNjaWknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHUnQW5kclwyMDIgeCcuZW5jb2RlLCAnYXNjaWknLCdzdHJpY3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnQW5kclwyMDIgeCcuZW5jb2RlKCdhc2NpaScsJ2lnbm9yZScpLCAiQW5kciB4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J0FuZHJcMjAyIHgnLmVuY29kZSgnYXNjaWknLCdyZXBsYWNlJyksICJBbmRyPyB4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J0FuZHJcMjAyIHgnLmVuY29kZSgnYXNjaWknLCAncmVwbGFjZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnQW5kclwyMDIgeCcuZW5jb2RlKCdhc2NpaScsIGVycm9ycz0ncmVwbGFjZScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnQW5kclwyMDIgeCcuZW5jb2RlKCdhc2NpaScsICdpZ25vcmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J0FuZHJcMjAyIHgnLmVuY29kZShlbmNvZGluZz0nYXNjaWknLCBlcnJvcnM9J2lnbm9yZScpKQorCisgICAgICAgICMgRXJyb3IgaGFuZGxpbmcgKGRlY29kaW5nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHVuaWNvZGUsICdBbmRyXDIwMiB4JywgJ2FzY2lpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB1bmljb2RlLCAnQW5kclwyMDIgeCcsICdhc2NpaScsJ3N0cmljdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnQW5kclwyMDIgeCcsJ2FzY2lpJywnaWdub3JlJyksIHUiQW5kciB4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCdBbmRyXDIwMiB4JywnYXNjaWknLCdyZXBsYWNlJyksIHUnQW5kclx1RkZGRCB4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2FiY2RlJy5kZWNvZGUoJ2FzY2lpJywgJ2lnbm9yZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnYWJjZGUnLmRlY29kZSgnYXNjaWknLCBlcnJvcnM9J2lnbm9yZScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnYWJjZGUnLmRlY29kZSgnYXNjaWknLCAncmVwbGFjZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnYWJjZGUnLmRlY29kZShlbmNvZGluZz0nYXNjaWknLCBlcnJvcnM9J3JlcGxhY2UnKSkKKworICAgICAgICAjIEVycm9yIGhhbmRsaW5nICh1bmtub3duIGNoYXJhY3RlciBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXFxOe2Zvb314eCIuZGVjb2RlKCJ1bmljb2RlLWVzY2FwZSIsICJpZ25vcmUiKSwgdSJ4eCIpCisKKyAgICAgICAgIyBFcnJvciBoYW5kbGluZyAodHJ1bmNhdGVkIGVzY2FwZSBzZXF1ZW5jZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCAiXFwiLmRlY29kZSwgInVuaWNvZGUtZXNjYXBlIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsICJoZWxsbyIuZGVjb2RlLCAidGVzdC51bmljb2RlMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdW5pY29kZSwgImhlbGxvIiwgInRlc3QudW5pY29kZTIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUiaGVsbG8iLmVuY29kZSwgInRlc3QudW5pY29kZTEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUiaGVsbG8iLmVuY29kZSwgInRlc3QudW5pY29kZTIiKQorICAgICAgICAjIGV4ZWN1dGVzIFB5VW5pY29kZV9FbmNvZGUoKQorICAgICAgICBpbXBvcnQgaW1wCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgSW1wb3J0RXJyb3IsCisgICAgICAgICAgICBpbXAuZmluZF9tb2R1bGUsCisgICAgICAgICAgICAibm9uLWV4aXN0aW5nIG1vZHVsZSIsCisgICAgICAgICAgICBbdSJub24tZXhpc3RpbmcgZGlyIl0KKyAgICAgICAgKQorCisgICAgICAgICMgRXJyb3IgaGFuZGxpbmcgKHdyb25nIGFyZ3VtZW50cykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1ImhlbGxvIi5lbmNvZGUsIDQyLCA0MiwgNDIpCisKKyAgICAgICAgIyBFcnJvciBoYW5kbGluZyAoUHlVbmljb2RlX0VuY29kZURlY2ltYWwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBpbnQsIHUiXHUwMjAwIikKKworICAgIGRlZiB0ZXN0X2NvZGVjcyhzZWxmKToKKyAgICAgICAgIyBFbmNvZGluZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnaGVsbG8nLmVuY29kZSgnYXNjaWknKSwgJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2hlbGxvJy5lbmNvZGUoJ3V0Zi03JyksICdoZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdoZWxsbycuZW5jb2RlKCd1dGYtOCcpLCAnaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnaGVsbG8nLmVuY29kZSgndXRmOCcpLCAnaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnaGVsbG8nLmVuY29kZSgndXRmLTE2LWxlJyksICdoXDAwMGVcMDAwbFwwMDBsXDAwMG9cMDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2hlbGxvJy5lbmNvZGUoJ3V0Zi0xNi1iZScpLCAnXDAwMGhcMDAwZVwwMDBsXDAwMGxcMDAwbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdoZWxsbycuZW5jb2RlKCdsYXRpbi0xJyksICdoZWxsbycpCisKKyAgICAgICAgIyBSb3VuZHRyaXAgc2FmZXR5IGZvciBCTVAgKGp1c3QgdGhlIGZpcnN0IDEwMjQgY2hhcnMpCisgICAgICAgIGZvciBjIGluIHhyYW5nZSgxMDI0KToKKyAgICAgICAgICAgIHUgPSB1bmljaHIoYykKKyAgICAgICAgICAgIGZvciBlbmNvZGluZyBpbiAoJ3V0Zi03JywgJ3V0Zi04JywgJ3V0Zi0xNicsICd1dGYtMTYtbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXRmLTE2LWJlJywgJ3Jhd191bmljb2RlX2VzY2FwZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmljb2RlX2VzY2FwZScsICd1bmljb2RlX2ludGVybmFsJyk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKHUuZW5jb2RlKGVuY29kaW5nKSxlbmNvZGluZyksIHUpCisKKyAgICAgICAgIyBSb3VuZHRyaXAgc2FmZXR5IGZvciBCTVAgKGp1c3QgdGhlIGZpcnN0IDI1NiBjaGFycykKKyAgICAgICAgZm9yIGMgaW4geHJhbmdlKDI1Nik6CisgICAgICAgICAgICB1ID0gdW5pY2hyKGMpCisgICAgICAgICAgICBmb3IgZW5jb2RpbmcgaW4gKCdsYXRpbi0xJywpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpLCB1KQorCisgICAgICAgICMgUm91bmR0cmlwIHNhZmV0eSBmb3IgQk1QIChqdXN0IHRoZSBmaXJzdCAxMjggY2hhcnMpCisgICAgICAgIGZvciBjIGluIHhyYW5nZSgxMjgpOgorICAgICAgICAgICAgdSA9IHVuaWNocihjKQorICAgICAgICAgICAgZm9yIGVuY29kaW5nIGluICgnYXNjaWknLCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKHUuZW5jb2RlKGVuY29kaW5nKSxlbmNvZGluZyksIHUpCisKKyAgICAgICAgIyBSb3VuZHRyaXAgc2FmZXR5IGZvciBub24tQk1QIChqdXN0IGEgZmV3IGNoYXJzKQorICAgICAgICB1ID0gdSdcVTAwMDEwMDAxXFUwMDAyMDAwMlxVMDAwMzAwMDNcVTAwMDQwMDA0XFUwMDA1MDAwNScKKyAgICAgICAgZm9yIGVuY29kaW5nIGluICgndXRmLTgnLCAndXRmLTE2JywgJ3V0Zi0xNi1sZScsICd1dGYtMTYtYmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICMncmF3X3VuaWNvZGVfZXNjYXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAndW5pY29kZV9lc2NhcGUnLCAndW5pY29kZV9pbnRlcm5hbCcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKHUuZW5jb2RlKGVuY29kaW5nKSxlbmNvZGluZyksIHUpCisKKyAgICAgICAgIyBVVEYtOCBtdXN0IGJlIHJvdW5kdHJpcCBzYWZlIGZvciBhbGwgVUNTLTIgY29kZSBwb2ludHMKKyAgICAgICAgIyBUaGlzIGV4Y2x1ZGVzIHN1cnJvZ2F0ZXM6IGluIHRoZSBmdWxsIHJhbmdlLCB0aGVyZSB3b3VsZCBiZQorICAgICAgICAjIGEgc3Vycm9nYXRlIHBhaXIgKFx1ZGJmZlx1ZGMwMCksIHdoaWNoIGdldHMgY29udmVydGVkIGJhY2sKKyAgICAgICAgIyB0byBhIG5vbi1CTVAgY2hhcmFjdGVyIChcVTAwMTBmYzAwKQorICAgICAgICB1ID0gdScnLmpvaW4obWFwKHVuaWNociwgcmFuZ2UoMCwweGQ4MDApK3JhbmdlKDB4ZTAwMCwweDEwMDAwKSkpCisgICAgICAgIGZvciBlbmNvZGluZyBpbiAoJ3V0Zi04JywpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKHUuZW5jb2RlKGVuY29kaW5nKSxlbmNvZGluZyksIHUpCisKKyAgICBkZWYgdGVzdF9jb2RlY3NfY2hhcm1hcChzZWxmKToKKyAgICAgICAgIyAwLTEyNworICAgICAgICBzID0gJycuam9pbihtYXAoY2hyLCB4cmFuZ2UoMTI4KSkpCisgICAgICAgIGZvciBlbmNvZGluZyBpbiAoCisgICAgICAgICAgICAnY3AwMzcnLCAnY3AxMDI2JywKKyAgICAgICAgICAgICdjcDQzNycsICdjcDUwMCcsICdjcDcyMCcsICdjcDczNycsICdjcDc3NScsICdjcDg1MCcsCisgICAgICAgICAgICAnY3A4NTInLCAnY3A4NTUnLCAnY3A4NTgnLCAnY3A4NjAnLCAnY3A4NjEnLCAnY3A4NjInLAorICAgICAgICAgICAgJ2NwODYzJywgJ2NwODY1JywgJ2NwODY2JywKKyAgICAgICAgICAgICdpc284ODU5XzEwJywgJ2lzbzg4NTlfMTMnLCAnaXNvODg1OV8xNCcsICdpc284ODU5XzE1JywKKyAgICAgICAgICAgICdpc284ODU5XzInLCAnaXNvODg1OV8zJywgJ2lzbzg4NTlfNCcsICdpc284ODU5XzUnLCAnaXNvODg1OV82JywKKyAgICAgICAgICAgICdpc284ODU5XzcnLCAnaXNvODg1OV85JywgJ2tvaThfcicsICdsYXRpbl8xJywKKyAgICAgICAgICAgICdtYWNfY3lyaWxsaWMnLCAnbWFjX2xhdGluMicsCisKKyAgICAgICAgICAgICdjcDEyNTAnLCAnY3AxMjUxJywgJ2NwMTI1MicsICdjcDEyNTMnLCAnY3AxMjU0JywgJ2NwMTI1NScsCisgICAgICAgICAgICAnY3AxMjU2JywgJ2NwMTI1NycsICdjcDEyNTgnLAorICAgICAgICAgICAgJ2NwODU2JywgJ2NwODU3JywgJ2NwODY0JywgJ2NwODY5JywgJ2NwODc0JywKKworICAgICAgICAgICAgJ21hY19ncmVlaycsICdtYWNfaWNlbGFuZCcsJ21hY19yb21hbicsICdtYWNfdHVya2lzaCcsCisgICAgICAgICAgICAnY3AxMDA2JywgJ2lzbzg4NTlfOCcsCisKKyAgICAgICAgICAgICMjIyBUaGVzZSBoYXZlIHVuZGVmaW5lZCBtYXBwaW5nczoKKyAgICAgICAgICAgICMnY3A0MjQnLAorCisgICAgICAgICAgICAjIyMgVGhlc2UgZmFpbCB0aGUgcm91bmQtdHJpcDoKKyAgICAgICAgICAgICMnY3A4NzUnCisKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUocywgZW5jb2RpbmcpLmVuY29kZShlbmNvZGluZyksIHMpCisKKyAgICAgICAgIyAxMjgtMjU1CisgICAgICAgIHMgPSAnJy5qb2luKG1hcChjaHIsIHhyYW5nZSgxMjgsIDI1NikpKQorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gKAorICAgICAgICAgICAgJ2NwMDM3JywgJ2NwMTAyNicsCisgICAgICAgICAgICAnY3A0MzcnLCAnY3A1MDAnLCAnY3A3MjAnLCAnY3A3MzcnLCAnY3A3NzUnLCAnY3A4NTAnLAorICAgICAgICAgICAgJ2NwODUyJywgJ2NwODU1JywgJ2NwODU4JywgJ2NwODYwJywgJ2NwODYxJywgJ2NwODYyJywKKyAgICAgICAgICAgICdjcDg2MycsICdjcDg2NScsICdjcDg2NicsCisgICAgICAgICAgICAnaXNvODg1OV8xMCcsICdpc284ODU5XzEzJywgJ2lzbzg4NTlfMTQnLCAnaXNvODg1OV8xNScsCisgICAgICAgICAgICAnaXNvODg1OV8yJywgJ2lzbzg4NTlfNCcsICdpc284ODU5XzUnLAorICAgICAgICAgICAgJ2lzbzg4NTlfOScsICdrb2k4X3InLCAnbGF0aW5fMScsCisgICAgICAgICAgICAnbWFjX2N5cmlsbGljJywgJ21hY19sYXRpbjInLAorCisgICAgICAgICAgICAjIyMgVGhlc2UgaGF2ZSB1bmRlZmluZWQgbWFwcGluZ3M6CisgICAgICAgICAgICAjJ2NwMTI1MCcsICdjcDEyNTEnLCAnY3AxMjUyJywgJ2NwMTI1MycsICdjcDEyNTQnLCAnY3AxMjU1JywKKyAgICAgICAgICAgICMnY3AxMjU2JywgJ2NwMTI1NycsICdjcDEyNTgnLAorICAgICAgICAgICAgIydjcDQyNCcsICdjcDg1NicsICdjcDg1NycsICdjcDg2NCcsICdjcDg2OScsICdjcDg3NCcsCisgICAgICAgICAgICAjJ2lzbzg4NTlfMycsICdpc284ODU5XzYnLCAnaXNvODg1OV83JywKKyAgICAgICAgICAgICMnbWFjX2dyZWVrJywgJ21hY19pY2VsYW5kJywnbWFjX3JvbWFuJywgJ21hY190dXJraXNoJywKKworICAgICAgICAgICAgIyMjIFRoZXNlIGZhaWwgdGhlIHJvdW5kLXRyaXA6CisgICAgICAgICAgICAjJ2NwMTAwNicsICdjcDg3NScsICdpc284ODU5XzgnLAorCisgICAgICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKHMsIGVuY29kaW5nKS5lbmNvZGUoZW5jb2RpbmcpLCBzKQorCisgICAgZGVmIHRlc3RfY29uY2F0ZW5hdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgodSJhYmMiIHUiZGVmIiksIHUiYWJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoImFiYyIgdSJkZWYiKSwgdSJhYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh1ImFiYyIgImRlZiIpLCB1ImFiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHUiYWJjIiB1ImRlZiIgImdoaSIpLCB1ImFiY2RlZmdoaSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCJhYmMiICJkZWYiIHUiZ2hpIiksIHUiYWJjZGVmZ2hpIikKKworICAgIGRlZiB0ZXN0X3ByaW50aW5nKHNlbGYpOgorICAgICAgICBjbGFzcyBCaXRCdWNrZXQ6CisgICAgICAgICAgICBkZWYgd3JpdGUoc2VsZiwgdGV4dCk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIG91dCA9IEJpdEJ1Y2tldCgpCisgICAgICAgIHByaW50ID4+b3V0LCB1J2FiYycKKyAgICAgICAgcHJpbnQgPj5vdXQsIHUnYWJjJywgdSdkZWYnCisgICAgICAgIHByaW50ID4+b3V0LCB1J2FiYycsICdkZWYnCisgICAgICAgIHByaW50ID4+b3V0LCAnYWJjJywgdSdkZWYnCisgICAgICAgIHByaW50ID4+b3V0LCB1J2FiY1xuJworICAgICAgICBwcmludCA+Pm91dCwgdSdhYmNcbicsCisgICAgICAgIHByaW50ID4+b3V0LCB1J2FiY1xuJywKKyAgICAgICAgcHJpbnQgPj5vdXQsIHUnZGVmXG4nCisgICAgICAgIHByaW50ID4+b3V0LCB1J2RlZlxuJworCisgICAgZGVmIHRlc3RfdWNzNChzZWxmKToKKyAgICAgICAgeCA9IHUnXFUwMDEwMDAwMCcKKyAgICAgICAgeSA9IHguZW5jb2RlKCJyYXctdW5pY29kZS1lc2NhcGUiKS5kZWNvZGUoInJhdy11bmljb2RlLWVzY2FwZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKworICAgICAgICB5ID0gcidcVTAwMTAwMDAwJworICAgICAgICB4ID0geS5kZWNvZGUoInJhdy11bmljb2RlLWVzY2FwZSIpLmVuY29kZSgicmF3LXVuaWNvZGUtZXNjYXBlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICB5ID0gcidcVTAwMDEwMDAwJworICAgICAgICB4ID0geS5kZWNvZGUoInJhdy11bmljb2RlLWVzY2FwZSIpLmVuY29kZSgicmF3LXVuaWNvZGUtZXNjYXBlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICdcVTExMTExMTExJy5kZWNvZGUoInJhdy11bmljb2RlLWVzY2FwZSIpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5zdGFydCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lbmQsIDEwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgVW5pY29kZURlY29kZUVycm9yIikKKworICAgIGRlZiB0ZXN0X2NvbnZlcnNpb24oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIF9fdW5pY29kZV9fKCkgd29ya3MgcHJvcGVybHkKKyAgICAgICAgY2xhc3MgRm9vMDoKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIgorCisgICAgICAgIGNsYXNzIEZvbzE6CisgICAgICAgICAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUiZm9vIgorCisgICAgICAgIGNsYXNzIEZvbzIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdSJmb28iCisKKyAgICAgICAgY2xhc3MgRm9vMyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIgorCisgICAgICAgIGNsYXNzIEZvbzQoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvbyIKKworICAgICAgICBjbGFzcyBGb281KHVuaWNvZGUpOgorICAgICAgICAgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIgorCisgICAgICAgIGNsYXNzIEZvbzYoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiZm9vcyIKKworICAgICAgICAgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1ImZvb3UiCisKKyAgICAgICAgY2xhc3MgRm9vNyh1bmljb2RlKToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiZm9vcyIKKyAgICAgICAgICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdSJmb291IgorCisgICAgICAgIGNsYXNzIEZvbzgodW5pY29kZSk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIGNvbnRlbnQ9IiIpOgorICAgICAgICAgICAgICAgIHJldHVybiB1bmljb2RlLl9fbmV3X18oY2xzLCAyKmNvbnRlbnQpCisgICAgICAgICAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBjbGFzcyBGb285KHVuaWNvZGUpOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciCisgICAgICAgICAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJub3QgdW5pY29kZSIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoRm9vMCgpKSwgdSJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoRm9vMSgpKSwgdSJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoRm9vMigpKSwgdSJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoRm9vMygpKSwgdSJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoRm9vNCgiYmFyIikpLCB1ImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShGb281KCJiYXIiKSksIHUiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKEZvbzYoImJhciIpKSwgdSJmb291IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKEZvbzcoImJhciIpKSwgdSJmb291IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKEZvbzgoImZvbyIpKSwgdSJmb29mb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGb285KCJmb28iKSksICJzdHJpbmciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoRm9vOSgiZm9vIikpLCB1Im5vdCB1bmljb2RlIikKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfcmVwcihzZWxmKToKKyAgICAgICAgY2xhc3MgczE6CisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdcXG4nCisKKyAgICAgICAgY2xhc3MgczI6CisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUnXFxuJworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzMSgpKSwgJ1xcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzMigpKSwgJ1xcbicpCisKKyAgICBkZWYgdGVzdF9leHBhbmR0YWJzX292ZXJmbG93c19ncmFjZWZ1bGx5KHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdCBvbmx5IGFmZmVjdHMgMzItYml0IHBsYXRmb3JtcyBiZWNhdXNlIGV4cGFuZHRhYnMgY2FuIG9ubHkgdGFrZQorICAgICAgICAjIGFuIGludCBhcyB0aGUgbWF4IHZhbHVlLCBub3QgYSA2NC1iaXQgQyBsb25nLiAgSWYgZXhwYW5kdGFicyBpcyBjaGFuZ2VkCisgICAgICAgICMgdG8gdGFrZSBhIDY0LWJpdCBsb25nLCB0aGlzIHRlc3Qgc2hvdWxkIGFwcGx5IHRvIGFsbCBwbGF0Zm9ybXMuCisgICAgICAgIGlmIHN5cy5tYXhpbnQgPiAoMSA8PCAzMikgb3Igc3RydWN0LmNhbGNzaXplKCdQJykgIT0gNDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB1J3RcdHRcdCcuZXhwYW5kdGFicywgc3lzLm1heGludCkKKworICAgIGRlZiB0ZXN0X19mb3JtYXRfXyhzZWxmKToKKyAgICAgICAgZGVmIHRlc3QodmFsdWUsIGZvcm1hdCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgIyB0ZXN0IGJvdGggd2l0aCBhbmQgd2l0aG91dCB0aGUgdHJhaWxpbmcgJ3MnCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLl9fZm9ybWF0X18oZm9ybWF0KSwgZXhwZWN0ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLl9fZm9ybWF0X18oZm9ybWF0ICsgdSdzJyksIGV4cGVjdGVkKQorCisgICAgICAgIHRlc3QodScnLCB1JycsIHUnJykKKyAgICAgICAgdGVzdCh1J2FiYycsIHUnJywgdSdhYmMnKQorICAgICAgICB0ZXN0KHUnYWJjJywgdScuMycsIHUnYWJjJykKKyAgICAgICAgdGVzdCh1J2FiJywgdScuMycsIHUnYWInKQorICAgICAgICB0ZXN0KHUnYWJjZGVmJywgdScuMycsIHUnYWJjJykKKyAgICAgICAgdGVzdCh1J2FiY2RlZicsIHUnLjAnLCB1JycpCisgICAgICAgIHRlc3QodSdhYmMnLCB1JzMuMycsIHUnYWJjJykKKyAgICAgICAgdGVzdCh1J2FiYycsIHUnMi4zJywgdSdhYmMnKQorICAgICAgICB0ZXN0KHUnYWJjJywgdScyLjInLCB1J2FiJykKKyAgICAgICAgdGVzdCh1J2FiYycsIHUnMy4yJywgdSdhYiAnKQorICAgICAgICB0ZXN0KHUncmVzdWx0JywgdSd4PDAnLCB1J3Jlc3VsdCcpCisgICAgICAgIHRlc3QodSdyZXN1bHQnLCB1J3g8NScsIHUncmVzdWx0JykKKyAgICAgICAgdGVzdCh1J3Jlc3VsdCcsIHUneDw2JywgdSdyZXN1bHQnKQorICAgICAgICB0ZXN0KHUncmVzdWx0JywgdSd4PDcnLCB1J3Jlc3VsdHgnKQorICAgICAgICB0ZXN0KHUncmVzdWx0JywgdSd4PDgnLCB1J3Jlc3VsdHh4JykKKyAgICAgICAgdGVzdCh1J3Jlc3VsdCcsIHUnIDw3JywgdSdyZXN1bHQgJykKKyAgICAgICAgdGVzdCh1J3Jlc3VsdCcsIHUnPDcnLCB1J3Jlc3VsdCAnKQorICAgICAgICB0ZXN0KHUncmVzdWx0JywgdSc+NycsIHUnIHJlc3VsdCcpCisgICAgICAgIHRlc3QodSdyZXN1bHQnLCB1Jz44JywgdScgIHJlc3VsdCcpCisgICAgICAgIHRlc3QodSdyZXN1bHQnLCB1J144JywgdScgcmVzdWx0ICcpCisgICAgICAgIHRlc3QodSdyZXN1bHQnLCB1J145JywgdScgcmVzdWx0ICAnKQorICAgICAgICB0ZXN0KHUncmVzdWx0JywgdSdeMTAnLCB1JyAgcmVzdWx0ICAnKQorICAgICAgICB0ZXN0KHUnYScsIHUnMTAwMDAnLCB1J2EnICsgdScgJyAqIDk5OTkpCisgICAgICAgIHRlc3QodScnLCB1JzEwMDAwJywgdScgJyAqIDEwMDAwKQorICAgICAgICB0ZXN0KHUnJywgdScxMDAwMDAwMCcsIHUnICcgKiAxMDAwMDAwMCkKKworICAgICAgICAjIHRlc3QgbWl4aW5nIHVuaWNvZGUgYW5kIHN0cgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnYWJjJy5fX2Zvcm1hdF9fKCdzJyksIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2FiYycuX19mb3JtYXRfXygnLT4xMHMnKSwgdSctLS0tLS0tYWJjJykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1JycuZm9ybWF0KCksIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2EnLmZvcm1hdCgpLCB1J2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnYWInLmZvcm1hdCgpLCB1J2FiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2F7eycuZm9ybWF0KCksIHUnYXsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnYX19Jy5mb3JtYXQoKSwgdSdhfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7e2InLmZvcm1hdCgpLCB1J3tiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J319YicuZm9ybWF0KCksIHUnfWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnYXt7YicuZm9ybWF0KCksIHUnYXtiJykKKworICAgICAgICAjIGV4YW1wbGVzIGZyb20gdGhlIFBFUDoKKyAgICAgICAgaW1wb3J0IGRhdGV0aW1lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJNeSBuYW1lIGlzIHswfSIuZm9ybWF0KHUnRnJlZCcpLCB1Ik15IG5hbWUgaXMgRnJlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJNeSBuYW1lIGlzIHswW25hbWVdfSIuZm9ybWF0KGRpY3QobmFtZT11J0ZyZWQnKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSJNeSBuYW1lIGlzIEZyZWQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiTXkgbmFtZSBpcyB7MH0gOi17e319Ii5mb3JtYXQodSdGcmVkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSJNeSBuYW1lIGlzIEZyZWQgOi17fSIpCisKKyAgICAgICAgIyBkYXRldGltZS5fX2Zvcm1hdF9fIGRvZXNuJ3Qgd29yayB3aXRoIHVuaWNvZGUKKyAgICAgICAgI2QgPSBkYXRldGltZS5kYXRlKDIwMDcsIDgsIDE4KQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbCgiVGhlIHllYXIgaXMgezAueWVhcn0iLmZvcm1hdChkKSwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIlRoZSB5ZWFyIGlzIDIwMDciKQorCisgICAgICAgICMgY2xhc3NlcyB3ZSdsbCB1c2UgZm9yIHRlc3RpbmcKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4PTEwMCk6CisgICAgICAgICAgICAgICAgc2VsZi5feCA9IHgKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjCisKKyAgICAgICAgY2xhc3MgRDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBzcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYueCkKKworICAgICAgICAjIGNsYXNzIHdpdGggX19zdHJfXywgYnV0IG5vIF9fZm9ybWF0X18KKyAgICAgICAgY2xhc3MgRToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdSdFKCcgKyBzZWxmLnggKyB1JyknCisKKyAgICAgICAgIyBjbGFzcyB3aXRoIF9fcmVwcl9fLCBidXQgbm8gX19mb3JtYXRfXyBvciBfX3N0cl9fCisgICAgICAgIGNsYXNzIEY6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1J0YoJyArIHNlbGYueCArIHUnKScKKworICAgICAgICAjIGNsYXNzIHdpdGggX19mb3JtYXRfXyB0aGF0IGZvcndhcmRzIHRvIHN0cmluZywgZm9yIHNvbWUgZm9ybWF0X3NwZWMncworICAgICAgICBjbGFzcyBHOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1InN0cmluZyBpcyAiICsgc2VsZi54CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgaWYgZm9ybWF0X3NwZWMgPT0gJ2QnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdSdHKCcgKyBzZWxmLnggKyB1JyknCisgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKQorCisgICAgICAgICMgY2xhc3MgdGhhdCByZXR1cm5zIGEgYmFkIHR5cGUgZnJvbSBfX2Zvcm1hdF9fCisgICAgICAgIGNsYXNzIEg6CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEuMAorCisgICAgICAgIGNsYXNzIEkoZGF0ZXRpbWUuZGF0ZSk6CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RyZnRpbWUoZm9ybWF0X3NwZWMpCisKKyAgICAgICAgY2xhc3MgSihpbnQpOgorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQuX19mb3JtYXRfXyhzZWxmICogMiwgZm9ybWF0X3NwZWMpCisKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnJy5mb3JtYXQoKSwgdScnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnYWJjJy5mb3JtYXQoKSwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezB9Jy5mb3JtYXQodSdhYmMnKSwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6fScuZm9ybWF0KHUnYWJjJyksIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1h7MH0nLmZvcm1hdCh1J2FiYycpLCB1J1hhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezB9WCcuZm9ybWF0KHUnYWJjJyksIHUnYWJjWCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdYezB9WScuZm9ybWF0KHUnYWJjJyksIHUnWGFiY1knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezF9Jy5mb3JtYXQoMSwgdSdhYmMnKSwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnWHsxfScuZm9ybWF0KDEsIHUnYWJjJyksIHUnWGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MX1YJy5mb3JtYXQoMSwgdSdhYmMnKSwgdSdhYmNYJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1h7MX1ZJy5mb3JtYXQoMSwgdSdhYmMnKSwgdSdYYWJjWScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MH0nLmZvcm1hdCgtMTUpLCB1Jy0xNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MH17MX0nLmZvcm1hdCgtMTUsIHUnYWJjJyksIHUnLTE1YWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swfVh7MX0nLmZvcm1hdCgtMTUsIHUnYWJjJyksIHUnLTE1WGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7eycuZm9ybWF0KCksIHUneycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd9fScuZm9ybWF0KCksIHUnfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7e319Jy5mb3JtYXQoKSwgdSd7fScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7e3h9fScuZm9ybWF0KCksIHUne3h9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3t7ezB9fX0nLmZvcm1hdCgxMjMpLCB1J3sxMjN9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3t7e3swfX19fScuZm9ybWF0KCksIHUne3swfX0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnfX17eycuZm9ybWF0KCksIHUnfXsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnfX14e3snLmZvcm1hdCgpLCB1J314eycpCisKKyAgICAgICAgIyB3ZWlyZCBmaWVsZCBuYW1lcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiezBbZm9vLWJhcl19Ii5mb3JtYXQoe3UnZm9vLWJhcic6dSdiYXonfSksIHUnYmF6JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1InswW2ZvbyBiYXJdfSIuZm9ybWF0KHt1J2ZvbyBiYXInOnUnYmF6J30pLCB1J2JheicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJ7MFsgXX0iLmZvcm1hdCh7dScgJzozfSksIHUnMycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3tmb28uX3h9Jy5mb3JtYXQoZm9vPUMoMjApKSwgdScyMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MX17MH0nLmZvcm1hdChEKDEwKSwgRCgyMCkpLCB1JzIwMTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezAuX3gueH0nLmZvcm1hdChDKEQodSdhYmMnKSkpLCB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MFswXX0nLmZvcm1hdChbdSdhYmMnLCB1J2RlZiddKSwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezBbMV19Jy5mb3JtYXQoW3UnYWJjJywgdSdkZWYnXSksIHUnZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swWzFdWzBdfScuZm9ybWF0KFt1J2FiYycsIFt1J2RlZiddXSksIHUnZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swWzFdWzBdLnh9Jy5mb3JtYXQoWydhYmMnLCBbRCh1J2RlZicpXV0pLCB1J2RlZicpCisKKyAgICAgICAgIyBzdHJpbmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDouM3N9Jy5mb3JtYXQodSdhYmMnKSwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6LjNzfScuZm9ybWF0KHUnYWInKSwgdSdhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDouM3N9Jy5mb3JtYXQodSdhYmNkZWYnKSwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6LjBzfScuZm9ybWF0KHUnYWJjZGVmJyksIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOjMuM3N9Jy5mb3JtYXQodSdhYmMnKSwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6Mi4zc30nLmZvcm1hdCh1J2FiYycpLCB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDoyLjJzfScuZm9ybWF0KHUnYWJjJyksIHUnYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6My4yc30nLmZvcm1hdCh1J2FiYycpLCB1J2FiICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDp4PDBzfScuZm9ybWF0KHUncmVzdWx0JyksIHUncmVzdWx0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOng8NXN9Jy5mb3JtYXQodSdyZXN1bHQnKSwgdSdyZXN1bHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6eDw2c30nLmZvcm1hdCh1J3Jlc3VsdCcpLCB1J3Jlc3VsdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDp4PDdzfScuZm9ybWF0KHUncmVzdWx0JyksIHUncmVzdWx0eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDp4PDhzfScuZm9ybWF0KHUncmVzdWx0JyksIHUncmVzdWx0eHgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6IDw3c30nLmZvcm1hdCh1J3Jlc3VsdCcpLCB1J3Jlc3VsdCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6PDdzfScuZm9ybWF0KHUncmVzdWx0JyksIHUncmVzdWx0ICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDo+N3N9Jy5mb3JtYXQodSdyZXN1bHQnKSwgdScgcmVzdWx0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOj44c30nLmZvcm1hdCh1J3Jlc3VsdCcpLCB1JyAgcmVzdWx0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOl44c30nLmZvcm1hdCh1J3Jlc3VsdCcpLCB1JyByZXN1bHQgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOl45c30nLmZvcm1hdCh1J3Jlc3VsdCcpLCB1JyByZXN1bHQgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDpeMTBzfScuZm9ybWF0KHUncmVzdWx0JyksIHUnICByZXN1bHQgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDoxMDAwMH0nLmZvcm1hdCh1J2EnKSwgdSdhJyArIHUnICcgKiA5OTk5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6MTAwMDB9Jy5mb3JtYXQodScnKSwgdScgJyAqIDEwMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6MTAwMDAwMDB9Jy5mb3JtYXQodScnKSwgdScgJyAqIDEwMDAwMDAwKQorCisgICAgICAgICMgZm9ybWF0IHNwZWNpZmllcnMgZm9yIHVzZXIgZGVmaW5lZCB0eXBlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDphYmN9Jy5mb3JtYXQoQygpKSwgdSdhYmMnKQorCisgICAgICAgICMgIXIgYW5kICFzIGNvZXJjaW9ucworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezAhc30nLmZvcm1hdCh1J0hlbGxvJyksIHUnSGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezAhczp9Jy5mb3JtYXQodSdIZWxsbycpLCB1J0hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swIXM6MTV9Jy5mb3JtYXQodSdIZWxsbycpLCB1J0hlbGxvICAgICAgICAgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MCFzOjE1c30nLmZvcm1hdCh1J0hlbGxvJyksIHUnSGVsbG8gICAgICAgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swIXJ9Jy5mb3JtYXQodSdIZWxsbycpLCB1InUnSGVsbG8nIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swIXI6fScuZm9ybWF0KHUnSGVsbG8nKSwgdSJ1J0hlbGxvJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MCFyfScuZm9ybWF0KEYodSdIZWxsbycpKSwgdSdGKEhlbGxvKScpCisKKyAgICAgICAgIyB0ZXN0IGZhbGxiYWNrIHRvIG9iamVjdC5fX2Zvcm1hdF9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MH0nLmZvcm1hdCh7fSksIHUne30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezB9Jy5mb3JtYXQoW10pLCB1J1tdJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swfScuZm9ybWF0KFsxXSksIHUnWzFdJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swfScuZm9ybWF0KEUodSdkYXRhJykpLCB1J0UoZGF0YSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6ZH0nLmZvcm1hdChHKHUnZGF0YScpKSwgdSdHKGRhdGEpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swIXN9Jy5mb3JtYXQoRyh1J2RhdGEnKSksIHUnc3RyaW5nIGlzIGRhdGEnKQorCisgICAgICAgIG1zZyA9ICdvYmplY3QuX19mb3JtYXRfXyB3aXRoIGEgbm9uLWVtcHR5IGZvcm1hdCBzdHJpbmcgaXMgZGVwcmVjYXRlZCcKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKG1zZywgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOl4xMH0nLmZvcm1hdChFKHUnZGF0YScpKSwgdScgRShkYXRhKSAgJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDpeMTBzfScuZm9ybWF0KEUodSdkYXRhJykpLCB1JyBFKGRhdGEpICAnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOj4xNXN9Jy5mb3JtYXQoRyh1J2RhdGEnKSksIHUnIHN0cmluZyBpcyBkYXRhJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiezA6ZGF0ZTogJVktJW0tJWR9Ii5mb3JtYXQoSSh5ZWFyPTIwMDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoPTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheT0yNykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUiZGF0ZTogMjAwNy0wOC0yNyIpCisKKyAgICAgICAgIyB0ZXN0IGRlcml2aW5nIGZyb20gYSBidWlsdGluIHR5cGUgYW5kIG92ZXJyaWRpbmcgX19mb3JtYXRfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiezB9Ii5mb3JtYXQoSigxMCkpLCB1IjIwIikKKworCisgICAgICAgICMgc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDp9Jy5mb3JtYXQoJ2EnKSwgdSdhJykKKworICAgICAgICAjIGNvbXB1dGVkIGZvcm1hdCBzcGVjaWZpZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJ7MDouezF9fSIuZm9ybWF0KHUnaGVsbG8gd29ybGQnLCA1KSwgdSdoZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJ7MDouezF9c30iLmZvcm1hdCh1J2hlbGxvIHdvcmxkJywgNSksIHUnaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiezA6LntwcmVjaXNpb259c30iLmZvcm1hdCgnaGVsbG8gd29ybGQnLCBwcmVjaXNpb249NSksIHUnaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiezA6e3dpZHRofS57cHJlY2lzaW9ufXN9Ii5mb3JtYXQoJ2hlbGxvIHdvcmxkJywgd2lkdGg9MTAsIHByZWNpc2lvbj01KSwgdSdoZWxsbyAgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1InswOnt3aWR0aH0ue3ByZWNpc2lvbn1zfSIuZm9ybWF0KCdoZWxsbyB3b3JsZCcsIHdpZHRoPScxMCcsIHByZWNpc2lvbj0nNScpLCB1J2hlbGxvICAgICAnKQorCisgICAgICAgICMgdGVzdCB2YXJpb3VzIGVycm9ycworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1J3snLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSd9Jy5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUnYXsnLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSdhfScuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1J3thJy5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUnfWEnLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdSd7MH0nLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdSd7MX0nLmZvcm1hdCwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgICB1J3t4fScuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1In17Ii5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUieyIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1In0iLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJhYmN7MDp7fSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswIi5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHUiezAufSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswLn0iLmZvcm1hdCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdSJ7MFt9Ii5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUiezBbfSIuZm9ybWF0LCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsICAgdSJ7MF19Ii5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUiezAuW119Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUiezAuLmZvb30iLmZvcm1hdCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ7MFswfSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswWzA6Zm9vfSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgICB1IntjXX0iLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ7eyB7e3swfX0iLmZvcm1hdCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ7MH19Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCAgIHUie2Zvb30iLmZvcm1hdCwgYmFyPTMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUiezAheH0iLmZvcm1hdCwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ7MCF9Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUiezAhcnN9Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUieyF9Ii5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHUiezp9Ii5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHUiezpzfSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB1Int9Ii5mb3JtYXQpCisgICAgICAgIGJpZyA9IHUiMjMwOTg0NzUwMjkzODQ3MDI5ODM0NzYwOTgyMzA3NTQ5NzMyMDk0ODI1NzMiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICh1InsiICsgYmlnICsgdSJ9IikuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAodSJ7WyIgKyBiaWcgKyB1Il19IikuZm9ybWF0LCBbMF0pCisKKyAgICAgICAgIyBpc3N1ZSA2MDg5CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUiezBbMF14fSIuZm9ybWF0LCBbTm9uZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUiezBbMF0oMTApfSIuZm9ybWF0LCBbTm9uZV0pCisKKyAgICAgICAgIyBjYW4ndCBoYXZlIGEgcmVwbGFjZW1lbnQgb24gdGhlIGZpZWxkIG5hbWUgcG9ydGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUnezBbezF9XX0nLmZvcm1hdCwgdSdhYmNkZWZnJywgNCkKKworICAgICAgICAjIGV4Y2VlZCBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswOnsxOnsyfX19Ii5mb3JtYXQsIHUnYWJjJywgdSdzJywgdScnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswOnsxOnsyOnszOns0Ons1Ons2fX19fX19fSIuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3KQorCisgICAgICAgICMgc3RyaW5nIGZvcm1hdCBzcGVjIGVycm9ycworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswOi1zfSIuZm9ybWF0LCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgdSIiLCB1Ii0iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswOj1zfSIuZm9ybWF0LCB1JycpCisKKyAgICAgICAgIyB0ZXN0IGNvbWJpbmluZyBzdHJpbmcgYW5kIHVuaWNvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ImZvb3swfSIuZm9ybWF0KCdiYXInKSwgdSdmb29iYXInKQorICAgICAgICAjIFRoaXMgd2lsbCB0cnkgdG8gY29udmVydCB0aGUgYXJndW1lbnQgZnJvbSB1bmljb2RlIHRvIHN0ciwgd2hpY2gKKyAgICAgICAgIyAgd2lsbCBzdWNjZWVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImZvb3swfSIuZm9ybWF0KHUnYmFyJyksICdmb29iYXInKQorICAgICAgICAjIFRoaXMgd2lsbCB0cnkgdG8gY29udmVydCB0aGUgYXJndW1lbnQgZnJvbSB1bmljb2RlIHRvIHN0ciwgd2hpY2gKKyAgICAgICAgIyAgd2lsbCBmYWlsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgImZvb3swfSIuZm9ybWF0LCB1J1x1MTAwMGJhcicpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfaHVnZV9wcmVjaXNpb24oc2VsZik6CisgICAgICAgIGZvcm1hdF9zdHJpbmcgPSB1Ii57fWYiLmZvcm1hdChzeXMubWF4c2l6ZSArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXQoMi4zNCwgZm9ybWF0X3N0cmluZykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9odWdlX3dpZHRoKHNlbGYpOgorICAgICAgICBmb3JtYXRfc3RyaW5nID0gdSJ7fWYiLmZvcm1hdChzeXMubWF4c2l6ZSArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXQoMi4zNCwgZm9ybWF0X3N0cmluZykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9odWdlX2l0ZW1fbnVtYmVyKHNlbGYpOgorICAgICAgICBmb3JtYXRfc3RyaW5nID0gdSJ7e3t9Oi42Zn19Ii5mb3JtYXQoc3lzLm1heHNpemUgKyAxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0X3N0cmluZy5mb3JtYXQoMi4zNCkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9hdXRvX251bWJlcmluZyhzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4PTEwMCk6CisgICAgICAgICAgICAgICAgc2VsZi5feCA9IHgKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3t9Jy5mb3JtYXQoMTApLCB1JzEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3s6NX0nLmZvcm1hdCgncycpLCB1J3MgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3shcn0nLmZvcm1hdCgncycpLCB1IidzJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7Ll94fScuZm9ybWF0KEMoMTApKSwgdScxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7WzFdfScuZm9ybWF0KFsxLCAyXSksIHUnMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7W2FdfScuZm9ybWF0KHsnYSc6NCwgJ2InOjJ9KSwgdSc0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2F7fWJ7fWMnLmZvcm1hdCgwLCAxKSwgdSdhMGIxYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2F7Ont9fWInLmZvcm1hdCgneCcsICdeMTAnKSwgdSdhICAgIHggICAgIGInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnYXs6e314fWInLmZvcm1hdCgyMCwgJyMnKSwgdSdhMHgxNGInKQorCisgICAgICAgICMgY2FuJ3QgbWl4IGFuZCBtYXRjaCBudW1iZXJpbmcgYW5kIGF1dG8tbnVtYmVyaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUne317MX0nLmZvcm1hdCwgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSd7MX17fScuZm9ybWF0LCAxLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1J3s6ezF9fScuZm9ybWF0LCAxLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1J3swOnt9fScuZm9ybWF0LCAxLCAyKQorCisgICAgICAgICMgY2FuIG1peCBhbmQgbWF0Y2ggYXV0by1udW1iZXJpbmcgYW5kIG5hbWVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7Zn17fScuZm9ybWF0KDQsIGY9J3Rlc3QnKSwgdSd0ZXN0NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7fXtmfScuZm9ybWF0KDQsIGY9J3Rlc3QnKSwgdSc0dGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7OntmfX17Z317fScuZm9ybWF0KDEsIDMsIGc9J2cnLCBmPTIpLCB1JyAxZzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUne2Y6e319e317Z30nLmZvcm1hdCgyLCA0LCBmPTEsIGc9J2cnKSwgdScgMTRnJykKKworICAgIGRlZiB0ZXN0X3JhaXNlTWVtRXJyb3Ioc2VsZik6CisgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIGZyZWVsaXN0IGNvbnRhaW5zIGEgY29uc2lzdGVudCBvYmplY3QsIGV2ZW4KKyAgICAgICAgIyB3aGVuIGEgc3RyaW5nIGFsbG9jYXRpb24gZmFpbHMgd2l0aCBhIE1lbW9yeUVycm9yLgorICAgICAgICAjIFRoaXMgdXNlZCB0byBjcmFzaCB0aGUgaW50ZXJwcmV0ZXIsCisgICAgICAgICMgb3IgbGVhayByZWZlcmVuY2VzIHdoZW4gdGhlIG51bWJlciB3YXMgc21hbGxlci4KKyAgICAgICAgY2hhcndpZHRoID0gNCBpZiBzeXMubWF4dW5pY29kZSA+PSAweDEwMDAwIGVsc2UgMgorICAgICAgICAjIE5vdGU6IHN5cy5tYXhzaXplIGlzIGhhbGYgb2YgdGhlIGFjdHVhbCBtYXggYWxsb2NhdGlvbiBiZWNhdXNlIG9mCisgICAgICAgICMgdGhlIHNpZ25lZG5lc3Mgb2YgUHlfc3NpemVfdC4KKyAgICAgICAgYWxsb2MgPSBsYW1iZGE6IHUiYSIgKiAoc3lzLm1heHNpemUgLy8gY2hhcndpZHRoICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTWVtb3J5RXJyb3IsIGFsbG9jKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhNZW1vcnlFcnJvciwgYWxsb2MpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIFUodW5pY29kZSk6CisgICAgICAgICAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUnX191bmljb2RlX18gb3ZlcnJpZGRlbicKKyAgICAgICAgdSA9IFUodSd4eHgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIlcyIgJSB1LCB1J19fdW5pY29kZV9fIG92ZXJyaWRkZW4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ7fSIuZm9ybWF0KHUpLCAnX191bmljb2RlX18gb3ZlcnJpZGRlbicpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfZGVjaW1hbChzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHVuaWNvZGVfZW5jb2RlZGVjaW1hbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGVfZW5jb2RlZGVjaW1hbCh1JzEyMycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInMTIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlX2VuY29kZWRlY2ltYWwodSdcdTA2NjMuXHUwNjYxXHUwNjY0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgYiczLjE0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlX2VuY29kZWRlY2ltYWwodSJcTntFTSBTUEFDRX0zLjE0XE57RU4gU1BBQ0V9IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgYicgMy4xNCAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVfZW5jb2RlZGVjaW1hbCwgdSIxMjNcdTIwYWMiLCAic3RyaWN0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlX2VuY29kZWRlY2ltYWwodSIxMjNcdTIwYWMiLCAicmVwbGFjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInMTIzPycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZV9lbmNvZGVkZWNpbWFsKHUiMTIzXHUyMGFjIiwgImlnbm9yZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInMTIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlX2VuY29kZWRlY2ltYWwodSIxMjNcdTIwYWMiLCAieG1sY2hhcnJlZnJlcGxhY2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJzEyMyYjODM2NDsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGVfZW5jb2RlZGVjaW1hbCh1IjEyM1x1MjBhYyIsICJiYWNrc2xhc2hyZXBsYWNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgYicxMjNcXHUyMGFjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlX2VuY29kZWRlY2ltYWwodSIxMjNcdTIwYWNcTntFTSBTUEFDRX0iLCAicmVwbGFjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInMTIzPyAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGVfZW5jb2RlZGVjaW1hbCh1IjEyM1x1MjBhY1x1MjBhYyIsICJyZXBsYWNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgYicxMjM/PycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZV9lbmNvZGVkZWNpbWFsKHUiMTIzXHUyMGFjXHUwNjYwIiwgInJlcGxhY2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJzEyMz8wJykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDUzZWNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDUzZWNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZV9maWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZV9maWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNGJhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlX2ZpbGUucHkKQEAgLTAsMCArMSwyMDAgQEAKKyMgVGVzdCBzb21lIFVuaWNvZGUgZmlsZSBuYW1lIHNlbWFudGljcworIyBXZSBkb250IHRlc3QgbWFueSBvcGVyYXRpb25zIG9uIGZpbGVzIG90aGVyIHRoYW4KKyMgdGhhdCB0aGVpciBuYW1lcyBjYW4gYmUgdXNlZCB3aXRoIFVuaWNvZGUgY2hhcmFjdGVycy4KK2ltcG9ydCBvcywgZ2xvYiwgdGltZSwgc2h1dGlsCitpbXBvcnQgdW5pY29kZWRhdGEKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIFRFU1RGTl9VTklDT0RFCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk5fRU5DT0RJTkcsIFRFU1RGTl9VTkVOQ09EQUJMRQordHJ5OgorICAgIFRFU1RGTl9FTkNPREVEID0gVEVTVEZOX1VOSUNPREUuZW5jb2RlKFRFU1RGTl9FTkNPRElORykKK2V4Y2VwdCAoVW5pY29kZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICMgRWl0aGVyIHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZyBpcyBOb25lLCBvciB0aGUgZmlsZSBuYW1lCisgICAgIyBjYW5ub3QgYmUgZW5jb2RlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcuCisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIk5vIFVuaWNvZGUgZmlsZXN5c3RlbSBzZW1hbnRpY3Mgb24gdGhpcyBwbGF0Zm9ybS4iKQorCitpZiBURVNURk5fRU5DT0RFRC5kZWNvZGUoVEVTVEZOX0VOQ09ESU5HKSAhPSBURVNURk5fVU5JQ09ERToKKyAgICAjIFRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZyBkb2VzIG5vdCBzdXBwb3J0IExhdGluLTEKKyAgICAjICh3aGljaCB0ZXN0X3N1cHBvcnQgYXNzdW1lcyksIHNvIHRyeSB0aGUgZmlsZSBzeXN0ZW0KKyAgICAjIGVuY29kaW5nIGluc3RlYWQuCisgICAgaW1wb3J0IHN5cworICAgIHRyeToKKyAgICAgICAgVEVTVEZOX1VOSUNPREUgPSB1bmljb2RlKCJAdGVzdC1ceGUwXHhmMiIsIHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKKyAgICAgICAgVEVTVEZOX0VOQ09ERUQgPSBURVNURk5fVU5JQ09ERS5lbmNvZGUoVEVTVEZOX0VOQ09ESU5HKQorICAgICAgICBpZiAnPycgaW4gVEVTVEZOX0VOQ09ERUQ6CisgICAgICAgICAgICAjIE1CQ1Mgd2lsbCBub3QgcmVwb3J0IHRoZSBlcnJvciBwcm9wZXJseQorICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAibWJjcyBlbmNvZGluZyBwcm9ibGVtIgorICAgIGV4Y2VwdCAoVW5pY29kZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiQ2Fubm90IGZpbmQgYSBzdWl0ZWFibGUgZmlsZW5hbWUuIikKKworaWYgVEVTVEZOX0VOQ09ERUQuZGVjb2RlKFRFU1RGTl9FTkNPRElORykgIT0gVEVTVEZOX1VOSUNPREU6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIkNhbm5vdCBmaW5kIGEgc3VpdGFibGUgZmlsZW5hbWUuIikKKworZGVmIHJlbW92ZV9pZl9leGlzdHMoZmlsZW5hbWUpOgorICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKKyAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorCitjbGFzcyBUZXN0VW5pY29kZUZpbGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoZSAnZG9fJyBmdW5jdGlvbnMgYXJlIHRoZSBhY3R1YWwgdGVzdHMuICBUaGV5IGdlbmVyYWxseSBhc3N1bWUgdGhlCisgICAgIyBmaWxlIGFscmVhZHkgZXhpc3RzIGV0Yy4KKworICAgICMgRG8gYWxsIHRoZSB0ZXN0cyB3ZSBjYW4gZ2l2ZW4gb25seSBhIHNpbmdsZSBmaWxlbmFtZS4gIFRoZSBmaWxlIHNob3VsZAorICAgICMgZXhpc3QuCisgICAgZGVmIF9kb19zaW5nbGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZmlsZW5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MuYWNjZXNzKGZpbGVuYW1lLCBvcy5SX09LKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUob3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5hY2Nlc3Mob3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKSwgb3MuUl9PSykpCisgICAgICAgIG9zLmNobW9kKGZpbGVuYW1lLCAwNzc3KQorICAgICAgICBvcy51dGltZShmaWxlbmFtZSwgTm9uZSkKKyAgICAgICAgb3MudXRpbWUoZmlsZW5hbWUsICh0aW1lLnRpbWUoKSwgdGltZS50aW1lKCkpKQorICAgICAgICAjIENvcHkvcmVuYW1lIGV0YyB0ZXN0cyB1c2luZyB0aGUgc2FtZSBmaWxlbmFtZQorICAgICAgICBzZWxmLl9kb19jb3B5aXNoKGZpbGVuYW1lLCBmaWxlbmFtZSkKKyAgICAgICAgIyBGaWxlbmFtZSBzaG91bGQgYXBwZWFyIGluIGdsb2Igb3V0cHV0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSk9PW9zLnBhdGguYWJzcGF0aChnbG9iLmdsb2IoZmlsZW5hbWUpWzBdKSkKKyAgICAgICAgIyBiYXNlbmFtZSBzaG91bGQgYXBwZWFyIGluIGxpc3RkaXIuCisgICAgICAgIHBhdGgsIGJhc2UgPSBvcy5wYXRoLnNwbGl0KG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSkpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYmFzZSwgc3RyKToKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlLmRlY29kZShURVNURk5fRU5DT0RJTkcpCisgICAgICAgIGZpbGVfbGlzdCA9IG9zLmxpc3RkaXIocGF0aCkKKyAgICAgICAgIyBsaXN0ZGlyKCkgd2l0aCBhIHVuaWNvZGUgYXJnIG1heSBvciBtYXkgbm90IHJldHVybiBVbmljb2RlCisgICAgICAgICMgb2JqZWN0cywgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KKyAgICAgICAgaWYgZmlsZV9saXN0IGFuZCBpc2luc3RhbmNlKGZpbGVfbGlzdFswXSwgc3RyKToKKyAgICAgICAgICAgIGZpbGVfbGlzdCA9IFtmLmRlY29kZShURVNURk5fRU5DT0RJTkcpIGZvciBmIGluIGZpbGVfbGlzdF0KKworICAgICAgICAjIE5vcm1hbGl6ZSB0aGUgdW5pY29kZSBzdHJpbmdzLCBhcyByb3VuZC10cmlwcGluZyB0aGUgbmFtZSB2aWEgdGhlIE9TCisgICAgICAgICMgbWF5IHJldHVybiBhIGRpZmZlcmVudCAoYnV0IGVxdWl2YWxlbnQpIHZhbHVlLgorICAgICAgICBiYXNlID0gdW5pY29kZWRhdGEubm9ybWFsaXplKCJORkQiLCBiYXNlKQorICAgICAgICBmaWxlX2xpc3QgPSBbdW5pY29kZWRhdGEubm9ybWFsaXplKCJORkQiLCBmKSBmb3IgZiBpbiBmaWxlX2xpc3RdCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiYXNlLCBmaWxlX2xpc3QpCisKKyAgICAjIERvIGFzIG1hbnkgImVxdWl2YWxhbmN5JyB0ZXN0cyBhcyB3ZSBjYW4gLSBpZSwgY2hlY2sgdGhhdCBhbHRob3VnaCB3ZQorICAgICMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMgZm9yIHRoZSBmaWxlbmFtZSwgdGhleSByZWZlciB0byB0aGUgc2FtZSBmaWxlLgorICAgIGRlZiBfZG9fZXF1aXZhbGVudChzZWxmLCBmaWxlbmFtZTEsIGZpbGVuYW1lMik6CisgICAgICAgICMgTm90ZSB3ZSBvbmx5IGNoZWNrICJmaWxlbmFtZTEgYWdhaW5zdCBmaWxlbmFtZTIiIC0gd2UgZG9uJ3QgYm90aGVyCisgICAgICAgICMgY2hlY2tpbmcgImZpbGVuYW1lMiBhZ2FpbnN0IDEiLCBhcyB3ZSBhc3N1bWUgd2UgYXJlIGNhbGxlZCBhZ2FpbiB3aXRoCisgICAgICAgICMgdGhlIGFyZ3MgcmV2ZXJzZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGZpbGVuYW1lMSkhPXR5cGUoZmlsZW5hbWUyKSwKKyAgICAgICAgICAgICAgICAgICAgIk5vIHBvaW50IGNoZWNraW5nIGVxdWl2YWxlbnQgZmlsZW5hbWVzIG9mIHRoZSBzYW1lIHR5cGUiKQorICAgICAgICAjIHN0YXQgYW5kIGxzdGF0IHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0cy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KGZpbGVuYW1lMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQoZmlsZW5hbWUyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5sc3RhdChmaWxlbmFtZTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5sc3RhdChmaWxlbmFtZTIpKQorICAgICAgICAjIENvcHkvcmVuYW1lIGV0YyB0ZXN0cyB1c2luZyBlcXVpdmFsZW50IGZpbGVuYW1lCisgICAgICAgIHNlbGYuX2RvX2NvcHlpc2goZmlsZW5hbWUxLCBmaWxlbmFtZTIpCisKKyAgICAjIFRlc3RzIHRoYXQgY29weSwgbW92ZSwgZXRjIG9uZSBmaWxlIHRvIGFub3RoZXIuCisgICAgZGVmIF9kb19jb3B5aXNoKHNlbGYsIGZpbGVuYW1lMSwgZmlsZW5hbWUyKToKKyAgICAgICAgIyBTaG91bGQgYmUgYWJsZSB0byByZW5hbWUgdGhlIGZpbGUgdXNpbmcgZWl0aGVyIG5hbWUuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShmaWxlbmFtZTEpKSAjIG11c3QgZXhpc3QuCisgICAgICAgIG9zLnJlbmFtZShmaWxlbmFtZTEsIGZpbGVuYW1lMiArICIubmV3IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lMSsiLm5ldyIpKQorICAgICAgICBvcy5yZW5hbWUoZmlsZW5hbWUxICsgIi5uZXciLCBmaWxlbmFtZTIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShmaWxlbmFtZTIpKQorCisgICAgICAgIHNodXRpbC5jb3B5KGZpbGVuYW1lMSwgZmlsZW5hbWUyICsgIi5uZXciKQorICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUxICsgIi5uZXciKSAjIHJlbW92ZSB1c2luZyBlcXVpdiBuYW1lLgorICAgICAgICAjIEFuZCBhIGNvdXBsZSBvZiBtb3Zlcywgb25lIHVzaW5nIGVhY2ggbmFtZS4KKyAgICAgICAgc2h1dGlsLm1vdmUoZmlsZW5hbWUxLCBmaWxlbmFtZTIgKyAiLm5ldyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUyKSkKKyAgICAgICAgc2h1dGlsLm1vdmUoZmlsZW5hbWUxICsgIi5uZXciLCBmaWxlbmFtZTIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZTEpKQorICAgICAgICAjIE5vdGUgLSBkdWUgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHNodXRpbC5tb3ZlLAorICAgICAgICAjIGl0IHRyaWVzIGEgcmVuYW1lIGZpcnN0LiAgVGhpcyBvbmx5IGZhaWxzIG9uIFdpbmRvd3Mgd2hlbiBvbgorICAgICAgICAjIGRpZmZlcmVudCBmaWxlIHN5c3RlbXMgLSBhbmQgdGhpcyB0ZXN0IGNhbid0IGVuc3VyZSB0aGF0LgorICAgICAgICAjIFNvIHdlIHRlc3QgdGhlIHNodXRpbC5jb3B5MiBmdW5jdGlvbiwgd2hpY2ggaXMgdGhlIHRoaW5nIG1vc3QKKyAgICAgICAgIyBsaWtlbHkgdG8gZmFpbC4KKyAgICAgICAgc2h1dGlsLmNvcHkyKGZpbGVuYW1lMSwgZmlsZW5hbWUyICsgIi5uZXciKQorICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUxICsgIi5uZXciKQorCisgICAgZGVmIF9kb19kaXJlY3Rvcnkoc2VsZiwgbWFrZV9uYW1lLCBjaGRpcl9uYW1lLCBlbmNvZGVkKToKKyAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihtYWtlX25hbWUpOgorICAgICAgICAgICAgb3Mucm1kaXIobWFrZV9uYW1lKQorICAgICAgICBvcy5ta2RpcihtYWtlX25hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmNoZGlyKGNoZGlyX25hbWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgbm90IGVuY29kZWQ6CisgICAgICAgICAgICAgICAgICAgIGN3ZF9yZXN1bHQgPSBvcy5nZXRjd2R1KCkKKyAgICAgICAgICAgICAgICAgICAgbmFtZV9yZXN1bHQgPSBtYWtlX25hbWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjd2RfcmVzdWx0ID0gb3MuZ2V0Y3dkKCkuZGVjb2RlKFRFU1RGTl9FTkNPRElORykKKyAgICAgICAgICAgICAgICAgICAgbmFtZV9yZXN1bHQgPSBtYWtlX25hbWUuZGVjb2RlKFRFU1RGTl9FTkNPRElORykKKworICAgICAgICAgICAgICAgIGN3ZF9yZXN1bHQgPSB1bmljb2RlZGF0YS5ub3JtYWxpemUoIk5GRCIsIGN3ZF9yZXN1bHQpCisgICAgICAgICAgICAgICAgbmFtZV9yZXN1bHQgPSB1bmljb2RlZGF0YS5ub3JtYWxpemUoIk5GRCIsIG5hbWVfcmVzdWx0KQorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmJhc2VuYW1lKGN3ZF9yZXN1bHQpLG5hbWVfcmVzdWx0KQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5jaGRpcihjd2QpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5ybWRpcihtYWtlX25hbWUpCisKKyAgICAjIFRoZSAnX3Rlc3QnIGZ1bmN0aW9ucyAnZW50cnkgcG9pbnRzIHdpdGggcGFyYW1zJyAtIGllLCB3aGF0IHRoZQorICAgICMgdG9wLWxldmVsICd0ZXN0JyBmdW5jdGlvbnMgd291bGQgYmUgaWYgdGhleSBjb3VsZCB0YWtlIHBhcmFtcworICAgIGRlZiBfdGVzdF9zaW5nbGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZW1vdmVfaWZfZXhpc3RzKGZpbGVuYW1lKQorICAgICAgICBmID0gZmlsZShmaWxlbmFtZSwgInciKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fZG9fc2luZ2xlKGZpbGVuYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSkKKyAgICAgICAgIyBhbmQgYWdhaW4gd2l0aCBvcy5vcGVuLgorICAgICAgICBmID0gb3Mub3BlbihmaWxlbmFtZSwgb3MuT19DUkVBVCkKKyAgICAgICAgb3MuY2xvc2UoZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fZG9fc2luZ2xlKGZpbGVuYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorCisgICAgZGVmIF90ZXN0X2VxdWl2YWxlbnQoc2VsZiwgZmlsZW5hbWUxLCBmaWxlbmFtZTIpOgorICAgICAgICByZW1vdmVfaWZfZXhpc3RzKGZpbGVuYW1lMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZTIpKQorICAgICAgICBmID0gZmlsZShmaWxlbmFtZTEsICJ3IikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2RvX2VxdWl2YWxlbnQoZmlsZW5hbWUxLCBmaWxlbmFtZTIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUxKQorCisgICAgIyBUaGUgJ3Rlc3QnIGZ1bmN0aW9ucyBhcmUgdW5pdHRlc3QgZW50cnkgcG9pbnRzLCBhbmQgc2ltcGx5IGNhbGwgb3VyCisgICAgIyBfdGVzdCBmdW5jdGlvbnMgd2l0aCBlYWNoIG9mIHRoZSBmaWxlbmFtZSBjb21iaW5hdGlvbnMgd2Ugd2lzaCB0byB0ZXN0CisgICAgZGVmIHRlc3Rfc2luZ2xlX2ZpbGVzKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3NpbmdsZShURVNURk5fRU5DT0RFRCkKKyAgICAgICAgc2VsZi5fdGVzdF9zaW5nbGUoVEVTVEZOX1VOSUNPREUpCisgICAgICAgIGlmIFRFU1RGTl9VTkVOQ09EQUJMRSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3Rlc3Rfc2luZ2xlKFRFU1RGTl9VTkVOQ09EQUJMRSkKKworICAgIGRlZiB0ZXN0X2VxdWl2YWxlbnRfZmlsZXMoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZXF1aXZhbGVudChURVNURk5fRU5DT0RFRCwgVEVTVEZOX1VOSUNPREUpCisgICAgICAgIHNlbGYuX3Rlc3RfZXF1aXZhbGVudChURVNURk5fVU5JQ09ERSwgVEVTVEZOX0VOQ09ERUQpCisKKyAgICBkZWYgdGVzdF9kaXJlY3RvcmllcyhzZWxmKToKKyAgICAgICAgIyBGb3IgYWxsICdlcXVpdmFsZW50JyBjb21iaW5hdGlvbnM6CisgICAgICAgICMgIE1ha2UgZGlyIHdpdGggZW5jb2RlZCwgY2hkaXIgd2l0aCB1bmljb2RlLCBjaGVja2RpciB3aXRoIGVuY29kZWQKKyAgICAgICAgIyAgKG9yIHVuaWNvZGUvZW5jb2RlZC91bmljb2RlLCBldGMKKyAgICAgICAgZXh0ID0gIi5kaXIiCisgICAgICAgIHNlbGYuX2RvX2RpcmVjdG9yeShURVNURk5fRU5DT0RFRCtleHQsIFRFU1RGTl9FTkNPREVEK2V4dCwgVHJ1ZSkKKyAgICAgICAgc2VsZi5fZG9fZGlyZWN0b3J5KFRFU1RGTl9FTkNPREVEK2V4dCwgVEVTVEZOX1VOSUNPREUrZXh0LCBUcnVlKQorICAgICAgICBzZWxmLl9kb19kaXJlY3RvcnkoVEVTVEZOX1VOSUNPREUrZXh0LCBURVNURk5fRU5DT0RFRCtleHQsIEZhbHNlKQorICAgICAgICBzZWxmLl9kb19kaXJlY3RvcnkoVEVTVEZOX1VOSUNPREUrZXh0LCBURVNURk5fVU5JQ09ERStleHQsIEZhbHNlKQorICAgICAgICAjIE91ciBkaXJlY3RvcnkgbmFtZSB0aGF0IGNhbid0IHVzZSBhIG5vbi11bmljb2RlIG5hbWUuCisgICAgICAgIGlmIFRFU1RGTl9VTkVOQ09EQUJMRSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2RvX2RpcmVjdG9yeShURVNURk5fVU5FTkNPREFCTEUrZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RGTl9VTkVOQ09EQUJMRStleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGVfZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlX2ZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjhhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlX2ZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGVfZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlX2ZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjhhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlX2ZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGVkYXRhLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZWRhdGEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwZWNmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGVkYXRhLnB5CkBAIC0wLDAgKzEsMzE3IEBACisiIiIgVGVzdCBzY3JpcHQgZm9yIHRoZSB1bmljb2RlZGF0YSBtb2R1bGUuCisKKyAgICBXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworICAgIChjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisKKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBoYXNobGliCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0CisKK2VuY29kaW5nID0gJ3V0Zi04JworCisKKyMjIyBSdW4gdGVzdHMKKworY2xhc3MgVW5pY29kZU1ldGhvZHNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICMgdXBkYXRlIHRoaXMsIGlmIHRoZSBkYXRhYmFzZSBjaGFuZ2VzCisgICAgZXhwZWN0ZWRjaGVja3N1bSA9ICc0NTA0ZGZmZDAzNWJhZWEwMmM1YjlkZTgyYmViYzNkNjVlMGUwYmFmJworCisgICAgZGVmIHRlc3RfbWV0aG9kX2NoZWNrc3VtKHNlbGYpOgorICAgICAgICBoID0gaGFzaGxpYi5zaGExKCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMHgxMDAwMCk6CisgICAgICAgICAgICBjaGFyID0gdW5pY2hyKGkpCisgICAgICAgICAgICBkYXRhID0gWworICAgICAgICAgICAgICAgICMgUHJlZGljYXRlcyAoc2luZ2xlIGNoYXIpCisgICAgICAgICAgICAgICAgdSIwMSJbY2hhci5pc2FsbnVtKCldLAorICAgICAgICAgICAgICAgIHUiMDEiW2NoYXIuaXNhbHBoYSgpXSwKKyAgICAgICAgICAgICAgICB1IjAxIltjaGFyLmlzZGVjaW1hbCgpXSwKKyAgICAgICAgICAgICAgICB1IjAxIltjaGFyLmlzZGlnaXQoKV0sCisgICAgICAgICAgICAgICAgdSIwMSJbY2hhci5pc2xvd2VyKCldLAorICAgICAgICAgICAgICAgIHUiMDEiW2NoYXIuaXNudW1lcmljKCldLAorICAgICAgICAgICAgICAgIHUiMDEiW2NoYXIuaXNzcGFjZSgpXSwKKyAgICAgICAgICAgICAgICB1IjAxIltjaGFyLmlzdGl0bGUoKV0sCisgICAgICAgICAgICAgICAgdSIwMSJbY2hhci5pc3VwcGVyKCldLAorCisgICAgICAgICAgICAgICAgIyBQcmVkaWNhdGVzIChtdWx0aXBsZSBjaGFycykKKyAgICAgICAgICAgICAgICB1IjAxIlsoY2hhciArIHUnYWJjJykuaXNhbG51bSgpXSwKKyAgICAgICAgICAgICAgICB1IjAxIlsoY2hhciArIHUnYWJjJykuaXNhbHBoYSgpXSwKKyAgICAgICAgICAgICAgICB1IjAxIlsoY2hhciArIHUnMTIzJykuaXNkZWNpbWFsKCldLAorICAgICAgICAgICAgICAgIHUiMDEiWyhjaGFyICsgdScxMjMnKS5pc2RpZ2l0KCldLAorICAgICAgICAgICAgICAgIHUiMDEiWyhjaGFyICsgdSdhYmMnKS5pc2xvd2VyKCldLAorICAgICAgICAgICAgICAgIHUiMDEiWyhjaGFyICsgdScxMjMnKS5pc251bWVyaWMoKV0sCisgICAgICAgICAgICAgICAgdSIwMSJbKGNoYXIgKyB1JyBcdCcpLmlzc3BhY2UoKV0sCisgICAgICAgICAgICAgICAgdSIwMSJbKGNoYXIgKyB1J2FiYycpLmlzdGl0bGUoKV0sCisgICAgICAgICAgICAgICAgdSIwMSJbKGNoYXIgKyB1J0FCQycpLmlzdXBwZXIoKV0sCisKKyAgICAgICAgICAgICAgICAjIE1hcHBpbmdzIChzaW5nbGUgY2hhcikKKyAgICAgICAgICAgICAgICBjaGFyLmxvd2VyKCksCisgICAgICAgICAgICAgICAgY2hhci51cHBlcigpLAorICAgICAgICAgICAgICAgIGNoYXIudGl0bGUoKSwKKworICAgICAgICAgICAgICAgICMgTWFwcGluZ3MgKG11bHRpcGxlIGNoYXJzKQorICAgICAgICAgICAgICAgIChjaGFyICsgdSdhYmMnKS5sb3dlcigpLAorICAgICAgICAgICAgICAgIChjaGFyICsgdSdBQkMnKS51cHBlcigpLAorICAgICAgICAgICAgICAgIChjaGFyICsgdSdhYmMnKS50aXRsZSgpLAorICAgICAgICAgICAgICAgIChjaGFyICsgdSdBQkMnKS50aXRsZSgpLAorCisgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgaC51cGRhdGUodScnLmpvaW4oZGF0YSkuZW5jb2RlKGVuY29kaW5nKSkKKyAgICAgICAgcmVzdWx0ID0gaC5oZXhkaWdlc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2VsZi5leHBlY3RlZGNoZWNrc3VtKQorCitjbGFzcyBVbmljb2RlRGF0YWJhc2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBJbiBjYXNlIHVuaWNvZGVkYXRhIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgd2lsbCByYWlzZSBhbiBJbXBvcnRFcnJvciwKKyAgICAgICAgIyBidXQgdGhlIG90aGVyIHRlc3QgY2FzZXMgd2lsbCBzdGlsbCBiZSBydW4KKyAgICAgICAgaW1wb3J0IHVuaWNvZGVkYXRhCisgICAgICAgIHNlbGYuZGIgPSB1bmljb2RlZGF0YQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBkZWwgc2VsZi5kYgorCitjbGFzcyBVbmljb2RlRnVuY3Rpb25zVGVzdChVbmljb2RlRGF0YWJhc2VUZXN0KToKKworICAgICMgdXBkYXRlIHRoaXMsIGlmIHRoZSBkYXRhYmFzZSBjaGFuZ2VzCisgICAgZXhwZWN0ZWRjaGVja3N1bSA9ICc2Y2NmMWIxYTM2NDYwZDI2OTRmOWIwYjBmMDMyNDk0MmZlNzBlZGU2JworCisgICAgZGVmIHRlc3RfZnVuY3Rpb25fY2hlY2tzdW0oc2VsZik6CisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICBoID0gaGFzaGxpYi5zaGExKCkKKworICAgICAgICBmb3IgaSBpbiByYW5nZSgweDEwMDAwKToKKyAgICAgICAgICAgIGNoYXIgPSB1bmljaHIoaSkKKyAgICAgICAgICAgIGRhdGEgPSBbCisgICAgICAgICAgICAgICAgIyBQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgc3RyKHNlbGYuZGIuZGlnaXQoY2hhciwgLTEpKSwKKyAgICAgICAgICAgICAgICBzdHIoc2VsZi5kYi5udW1lcmljKGNoYXIsIC0xKSksCisgICAgICAgICAgICAgICAgc3RyKHNlbGYuZGIuZGVjaW1hbChjaGFyLCAtMSkpLAorICAgICAgICAgICAgICAgIHNlbGYuZGIuY2F0ZWdvcnkoY2hhciksCisgICAgICAgICAgICAgICAgc2VsZi5kYi5iaWRpcmVjdGlvbmFsKGNoYXIpLAorICAgICAgICAgICAgICAgIHNlbGYuZGIuZGVjb21wb3NpdGlvbihjaGFyKSwKKyAgICAgICAgICAgICAgICBzdHIoc2VsZi5kYi5taXJyb3JlZChjaGFyKSksCisgICAgICAgICAgICAgICAgc3RyKHNlbGYuZGIuY29tYmluaW5nKGNoYXIpKSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgIGgudXBkYXRlKCcnLmpvaW4oZGF0YSkpCisgICAgICAgIHJlc3VsdCA9IGguaGV4ZGlnZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuZXhwZWN0ZWRjaGVja3N1bSkKKworICAgIGRlZiB0ZXN0X2RpZ2l0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuZGlnaXQodSdBJywgTm9uZSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5kaWdpdCh1JzknKSwgOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmRpZ2l0KHUnXHUyMTViJywgTm9uZSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5kaWdpdCh1J1x1MjQ2OCcpLCA5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuZGlnaXQodSdcVTAwMDIwMDAwJywgTm9uZSksIE5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmRiLmRpZ2l0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZGIuZGlnaXQsIHUneHgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmRiLmRpZ2l0LCB1J3gnKQorCisgICAgZGVmIHRlc3RfbnVtZXJpYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLm51bWVyaWModSdBJyxOb25lKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLm51bWVyaWModSc5JyksIDkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5udW1lcmljKHUnXHUyMTViJyksIDAuMTI1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubnVtZXJpYyh1J1x1MjQ2OCcpLCA5LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5udW1lcmljKHUnXHVhNjI3JyksIDcuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLm51bWVyaWModSdcVTAwMDIwMDAwJywgTm9uZSksIE5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmRiLm51bWVyaWMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5kYi5udW1lcmljLCB1J3h4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5kYi5udW1lcmljLCB1J3gnKQorCisgICAgZGVmIHRlc3RfZGVjaW1hbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmRlY2ltYWwodSdBJyxOb25lKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmRlY2ltYWwodSc5JyksIDkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5kZWNpbWFsKHUnXHUyMTViJywgTm9uZSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5kZWNpbWFsKHUnXHUyNDY4JywgTm9uZSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5kZWNpbWFsKHUnXFUwMDAyMDAwMCcsIE5vbmUpLCBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5kYi5kZWNpbWFsKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZGIuZGVjaW1hbCwgdSd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZGIuZGVjaW1hbCwgdSd4JykKKworICAgIGRlZiB0ZXN0X2NhdGVnb3J5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuY2F0ZWdvcnkodSdcdUZGRkUnKSwgJ0NuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmNhdGVnb3J5KHUnYScpLCAnTGwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuY2F0ZWdvcnkodSdBJyksICdMdScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5jYXRlZ29yeSh1J1xVMDAwMjAwMDAnKSwgJ0xvJykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZGIuY2F0ZWdvcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5kYi5jYXRlZ29yeSwgdSd4eCcpCisKKyAgICBkZWYgdGVzdF9iaWRpcmVjdGlvbmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuYmlkaXJlY3Rpb25hbCh1J1x1RkZGRScpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmJpZGlyZWN0aW9uYWwodScgJyksICdXUycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5iaWRpcmVjdGlvbmFsKHUnQScpLCAnTCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5iaWRpcmVjdGlvbmFsKHUnXFUwMDAyMDAwMCcpLCAnTCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmRiLmJpZGlyZWN0aW9uYWwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5kYi5iaWRpcmVjdGlvbmFsLCB1J3h4JykKKworICAgIGRlZiB0ZXN0X2RlY29tcG9zaXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5kZWNvbXBvc2l0aW9uKHUnXHVGRkZFJyksJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5kZWNvbXBvc2l0aW9uKHUnXHUwMGJjJyksICc8ZnJhY3Rpb24+IDAwMzEgMjA0NCAwMDM0JykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZGIuZGVjb21wb3NpdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmRiLmRlY29tcG9zaXRpb24sIHUneHgnKQorCisgICAgZGVmIHRlc3RfbWlycm9yZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5taXJyb3JlZCh1J1x1RkZGRScpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubWlycm9yZWQodSdhJyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5taXJyb3JlZCh1J1x1MjIwMScpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubWlycm9yZWQodSdcVTAwMDIwMDAwJyksIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmRiLm1pcnJvcmVkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZGIubWlycm9yZWQsIHUneHgnKQorCisgICAgZGVmIHRlc3RfY29tYmluaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuY29tYmluaW5nKHUnXHVGRkZFJyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5jb21iaW5pbmcodSdhJyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5jb21iaW5pbmcodSdcdTIwZTEnKSwgMjMwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuY29tYmluaW5nKHUnXFUwMDAyMDAwMCcpLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5kYi5jb21iaW5pbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5kYi5jb21iaW5pbmcsIHUneHgnKQorCisgICAgZGVmIHRlc3Rfbm9ybWFsaXplKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZGIubm9ybWFsaXplKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmRiLm5vcm1hbGl6ZSwgJ3Vua25vd24nLCB1J3h4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLm5vcm1hbGl6ZSgnTkZLQycsIHUnJyksIHUnJykKKyAgICAgICAgIyBUaGUgcmVzdCBjYW4gYmUgZm91bmQgaW4gdGVzdF9ub3JtYWxpemF0aW9uLnB5CisgICAgICAgICMgd2hpY2ggcmVxdWlyZXMgYW4gZXh0ZXJuYWwgZmlsZS4KKworICAgIGRlZiB0ZXN0X3ByMjkoc2VsZik6CisgICAgICAgICMgaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXZpZXcvcHItMjkuaHRtbAorICAgICAgICAjIFNlZSBpc3N1ZXMgIzEwNTQ5NDMgYW5kICMxMDI1NC4KKyAgICAgICAgY29tcG9zZWQgPSAodSJcdTBiNDdcdTAzMDBcdTBiM2UiLCB1Ilx1MTEwMFx1MDMwMFx1MTE2MSIsCisgICAgICAgICAgICAgICAgICAgIHUnTGlcdTAzMGR0LXNcdTFlNzNcdTAzMDEnLAorICAgICAgICAgICAgICAgICAgICB1J1x1MDkyZVx1MDkzZVx1MDkzMFx1MDk0ZFx1MDkxNSBcdTA5MWNcdTA5M2MnCisgICAgICAgICAgICAgICAgICAgICsgdSdcdTA5NDFcdTA5MTVcdTA5NDdcdTA5MzBcdTA5MmNcdTA5MzBcdTA5NGRcdTA5MTcnLAorICAgICAgICAgICAgICAgICAgICB1J1x1MDkxNVx1MDkzZlx1MDkzMFx1MDk0ZFx1MDkxN1x1MDkzZlx1MDkxY1x1MDkzYycKKyAgICAgICAgICAgICAgICAgICAgKyAndVx1MDkzOFx1MDk0ZFx1MDkyNFx1MDkzZVx1MDkyOCcpCisgICAgICAgIGZvciB0ZXh0IGluIGNvbXBvc2VkOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLm5vcm1hbGl6ZSgnTkZDJywgdGV4dCksIHRleHQpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTEwMjU0KHNlbGYpOgorICAgICAgICAjIENyYXNoIHJlcG9ydGVkIGluICMxMDI1NAorICAgICAgICBhID0gdSdDXHUwMzM4JyAqIDIwICArIHUnQ1x1MDMyNycKKyAgICAgICAgYiA9IHUnQ1x1MDMzOCcgKiAyMCAgKyB1J1x4QzcnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5ub3JtYWxpemUoJ05GQycsIGEpLCBiKQorCisgICAgZGVmIHRlc3RfZWFzdF9hc2lhbl93aWR0aChzZWxmKToKKyAgICAgICAgZWF3ID0gc2VsZi5kYi5lYXN0X2FzaWFuX3dpZHRoCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZWF3LCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZWF3LCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZWF3LCB1J3JhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlYXcodSdceDFlJyksICdOJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlYXcodSdceDIwJyksICdOYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWF3KHUnXHVDODk0JyksICdXJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlYXcodSdcdUZGNjYnKSwgJ0gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVhdyh1J1x1RkYxRicpLCAnRicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWF3KHUnXHUyMDEwJyksICdBJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlYXcodSdcVTAwMDIwMDAwJyksICdXJykKKworY2xhc3MgVW5pY29kZU1pc2NUZXN0KFVuaWNvZGVEYXRhYmFzZVRlc3QpOgorCisgICAgZGVmIHRlc3RfZmFpbGVkX2ltcG9ydF9kdXJpbmdfY29tcGlsaW5nKHNlbGYpOgorICAgICAgICAjIElzc3VlIDQzNjcKKyAgICAgICAgIyBEZWNvZGluZyBcTiBlc2NhcGVzIHJlcXVpcmVzIHRoZSB1bmljb2RlZGF0YSBtb2R1bGUuIElmIGl0IGNhbid0IGJlCisgICAgICAgICMgaW1wb3J0ZWQsIHdlIHNob3VsZG4ndCBzZWdmYXVsdC4KKworICAgICAgICAjIFRoaXMgcHJvZ3JhbSBzaG91bGQgcmFpc2UgYSBTeW50YXhFcnJvciBpbiB0aGUgZXZhbC4KKyAgICAgICAgY29kZSA9ICJpbXBvcnQgc3lzOyIgXAorICAgICAgICAgICAgInN5cy5tb2R1bGVzWyd1bmljb2RlZGF0YSddID0gTm9uZTsiIFwKKyAgICAgICAgICAgICIiImV2YWwoInUnXE57U09GVCBIWVBIRU59JyIpIiIiCisgICAgICAgIGFyZ3MgPSBbc3lzLmV4ZWN1dGFibGUsICItYyIsIGNvZGVdCisgICAgICAgICMgV2UgdXNlIGEgc3VicHJvY2VzcyBiZWNhdXNlIHRoZSB1bmljb2RlZGF0YSBtb2R1bGUgbWF5IGFscmVhZHkgaGF2ZQorICAgICAgICAjIGJlZW4gbG9hZGVkIGluIHRoaXMgcHJvY2Vzcy4KKyAgICAgICAgcG9wZW4gPSBzdWJwcm9jZXNzLlBvcGVuKGFyZ3MsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHBvcGVuLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvcGVuLnJldHVybmNvZGUsIDEpCisgICAgICAgIGVycm9yID0gIlN5bnRheEVycm9yOiAodW5pY29kZSBlcnJvcikgXE4gZXNjYXBlcyBub3Qgc3VwcG9ydGVkICIgXAorICAgICAgICAgICAgIihjYW4ndCBsb2FkIHVuaWNvZGVkYXRhIG1vZHVsZSkiCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oZXJyb3IsIHBvcGVuLnN0ZGVyci5yZWFkKCkpCisKKyAgICBkZWYgdGVzdF9kZWNpbWFsX251bWVyaWNfY29uc2lzdGVudChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgZGVjaW1hbCBhbmQgbnVtZXJpYyBhcmUgY29uc2lzdGVudCwKKyAgICAgICAgIyBpLmUuIGlmIGEgY2hhcmFjdGVyIGhhcyBhIGRlY2ltYWwgdmFsdWUsCisgICAgICAgICMgaXRzIG51bWVyaWMgdmFsdWUgc2hvdWxkIGJlIHRoZSBzYW1lLgorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDB4MTAwMDApOgorICAgICAgICAgICAgYyA9IHVuaWNocihpKQorICAgICAgICAgICAgZGVjID0gc2VsZi5kYi5kZWNpbWFsKGMsIC0xKQorICAgICAgICAgICAgaWYgZGVjICE9IC0xOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjLCBzZWxmLmRiLm51bWVyaWMoYykpCisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY291bnQgPj0gMTApICMgc2hvdWxkIGhhdmUgdGVzdGVkIGF0IGxlYXN0IHRoZSBBU0NJSSBkaWdpdHMKKworICAgIGRlZiB0ZXN0X2RpZ2l0X251bWVyaWNfY29uc2lzdGVudChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgZGlnaXQgYW5kIG51bWVyaWMgYXJlIGNvbnNpc3RlbnQsCisgICAgICAgICMgaS5lLiBpZiBhIGNoYXJhY3RlciBoYXMgYSBkaWdpdCB2YWx1ZSwKKyAgICAgICAgIyBpdHMgbnVtZXJpYyB2YWx1ZSBzaG91bGQgYmUgdGhlIHNhbWUuCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMHgxMDAwMCk6CisgICAgICAgICAgICBjID0gdW5pY2hyKGkpCisgICAgICAgICAgICBkZWMgPSBzZWxmLmRiLmRpZ2l0KGMsIC0xKQorICAgICAgICAgICAgaWYgZGVjICE9IC0xOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjLCBzZWxmLmRiLm51bWVyaWMoYykpCisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY291bnQgPj0gMTApICMgc2hvdWxkIGhhdmUgdGVzdGVkIGF0IGxlYXN0IHRoZSBBU0NJSSBkaWdpdHMKKworICAgIGRlZiB0ZXN0X2J1Z18xNzA0NzkzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubG9va3VwKCJHT1RISUMgTEVUVEVSIEZBSUhVIiksIHUnXFUwMDAxMDM0NicpCisKKyAgICBkZWYgdGVzdF91Y2RfNTEwKHNlbGYpOgorICAgICAgICBpbXBvcnQgdW5pY29kZWRhdGEKKyAgICAgICAgIyBJbiBVQ0QgNS4xLjAsIGEgbWlycm9yZWQgcHJvcGVydHkgY2hhbmdlZCB3cnQuIFVDRCAzLjIuMAorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZWRhdGEubWlycm9yZWQodSJcdTBmM2EiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1bmljb2RlZGF0YS51Y2RfM18yXzAubWlycm9yZWQodSJcdTBmM2EiKSkKKyAgICAgICAgIyBBbHNvLCB3ZSBub3cgaGF2ZSB0d28gd2F5cyBvZiByZXByZXNlbnRpbmcKKyAgICAgICAgIyB0aGUgdXBwZXItY2FzZSBtYXBwaW5nOiBhcyBkZWx0YSwgb3IgYXMgYWJzb2x1dGUgdmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUiYSIudXBwZXIoKT09dSdBJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUiXHUxZDc5Ii51cHBlcigpPT11J1x1YTc3ZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1Ii4iLnVwcGVyKCk9PXUiLiIpCisKKyAgICBkZWYgdGVzdF9idWdfNTgyOChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Ilx1MWQ3OSIubG93ZXIoKSwgdSJcdTFkNzkiKQorICAgICAgICAjIE9ubHkgVSswMDAwIHNob3VsZCBoYXZlIFUrMDAwMCBhcyBpdHMgdXBwZXIvbG93ZXIvdGl0bGVjYXNlIHZhcmlhbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICBjIGZvciBjIGluIHJhbmdlKHN5cy5tYXh1bmljb2RlKzEpCisgICAgICAgICAgICAgICAgaWYgdSJceDAwIiBpbiB1bmljaHIoYykubG93ZXIoKSt1bmljaHIoYykudXBwZXIoKSt1bmljaHIoYykudGl0bGUoKQorICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIFswXQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9idWdfNDk3MShzZWxmKToKKyAgICAgICAgIyBMRVRURVIgRFogV0lUSCBDQVJPTjogRFosIER6LCBkegorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiXHUwMWM0Ii50aXRsZSgpLCB1Ilx1MDFjNSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJcdTAxYzUiLnRpdGxlKCksIHUiXHUwMWM1IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Ilx1MDFjNiIudGl0bGUoKSwgdSJcdTAxYzUiKQorCisgICAgZGVmIHRlc3RfbGluZWJyZWFrXzc2NDMoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDB4MTAwMDApOgorICAgICAgICAgICAgbGluZXMgPSAodW5pY2hyKGkpICsgdSdBJykuc3BsaXRsaW5lcygpCisgICAgICAgICAgICBpZiBpIGluICgweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDg1LAorICAgICAgICAgICAgICAgICAgICAgMHgxYywgMHgxZCwgMHgxZSwgMHgyMDI4LCAweDIwMjkpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmVzKSwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiXHUlLjR4IHNob3VsZCBiZSBhIGxpbmVicmVhayIgJSBpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaW5lcyksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIlx1JS40eCBzaG91bGQgbm90IGJlIGEgbGluZWJyZWFrIiAlIGkpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFVuaWNvZGVNaXNjVGVzdCwKKyAgICAgICAgVW5pY29kZU1ldGhvZHNUZXN0LAorICAgICAgICBVbmljb2RlRnVuY3Rpb25zVGVzdAorICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZWRhdGEucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZWRhdGEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTY2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlZGF0YS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZWRhdGEucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZWRhdGEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTY2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlZGF0YS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdHRlc3QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml0dGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE5OThiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdHRlc3QucHkKQEAgLTAsMCArMSwxMiBAQAoraW1wb3J0IHVuaXR0ZXN0LnRlc3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCh1bml0dGVzdC50ZXN0LnN1aXRlKCkpCisgICAgdGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXR0ZXN0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXR0ZXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2I1YTMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdHRlc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXR0ZXN0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXR0ZXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2I1YTMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdHRlc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXZuZXdsaW5lcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXZuZXdsaW5lcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGE5MDkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzLnB5CkBAIC0wLDAgKzEsMTM1IEBACisjIFRlc3RzIHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQgZm9yIGJvdGggcmVhZGluZyBhbmQgcGFyc2luZyBmaWxlcy4KKworIyBOT1RFOiB0aGlzIGZpbGUgdGVzdHMgdGhlIG5ldyBgaW9gIGxpYnJhcnkgYmFja3BvcnRlZCBmcm9tIFB5dGhvbiAzLnguCisjIFNpbWlsYXIgdGVzdHMgZm9yIHRoZSBidWlsdGluIGZpbGUgb2JqZWN0IGNhbiBiZSBmb3VuZCBpbiB0ZXN0X3VuaXZuZXdsaW5lczJrLnB5LgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKKworaW1wb3J0IGlvCitpbXBvcnQgX3B5aW8gYXMgcHlpbworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0IGFzIHN1cHBvcnQKKworaWYgbm90IGhhc2F0dHIoc3lzLnN0ZGluLCAnbmV3bGluZXMnKToKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgKKyAgICAgICAgIlRoaXMgUHl0aG9uIGRvZXMgbm90IGhhdmUgdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydCIpCisKK0ZBVFggPSAneCcgKiAoMioqMTQpCisKK0RBVEFfVEVNUExBVEUgPSBbCisgICAgImxpbmUxPTEiLAorICAgICJsaW5lMj0ndGhpcyBpcyBhIHZlcnkgbG9uZyBsaW5lIGRlc2lnbmVkIHRvIGdvIHBhc3QgYW55IGRlZmF1bHQgIiArCisgICAgICAgICJidWZmZXIgbGltaXRzIHRoYXQgZXhpc3QgaW4gaW8ucHkgYnV0IHdlIGFsc28gd2FudCB0byB0ZXN0ICIgKworICAgICAgICAidGhlIHVuY29tbW9uIGNhc2UsIG5hdHVyYWxseS4nIiwKKyAgICAiZGVmIGxpbmUzKCk6cGFzcyIsCisgICAgImxpbmU0ID0gJyVzJyIgJSBGQVRYLAorICAgIF0KKworREFUQV9MRiA9ICJcbiIuam9pbihEQVRBX1RFTVBMQVRFKSArICJcbiIKK0RBVEFfQ1IgPSAiXHIiLmpvaW4oREFUQV9URU1QTEFURSkgKyAiXHIiCitEQVRBX0NSTEYgPSAiXHJcbiIuam9pbihEQVRBX1RFTVBMQVRFKSArICJcclxuIgorCisjIE5vdGUgdGhhdCBEQVRBX01JWEVEIGFsc28gdGVzdHMgdGhlIGFiaWxpdHkgdG8gcmVjb2duaXplIGEgbG9uZSBccgorIyBiZWZvcmUgZW5kLW9mLWZpbGUuCitEQVRBX01JWEVEID0gIlxuIi5qb2luKERBVEFfVEVNUExBVEUpICsgIlxyIgorREFUQV9TUExJVCA9IFt4ICsgIlxuIiBmb3IgeCBpbiBEQVRBX1RFTVBMQVRFXQorCitjbGFzcyBUZXN0R2VuZXJpY1VuaXZOZXdsaW5lcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyB1c2UgYSBjbGFzcyB2YXJpYWJsZSBEQVRBIHRvIGRlZmluZSB0aGUgZGF0YSB0byB3cml0ZSB0byB0aGUgZmlsZQorICAgICMgYW5kIGEgY2xhc3MgdmFyaWFibGUgTkVXTElORSB0byBzZXQgdGhlIGV4cGVjdGVkIG5ld2xpbmVzIHZhbHVlCisgICAgUkVBRE1PREUgPSAncicKKyAgICBXUklURU1PREUgPSAnd2InCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGRhdGEgPSBzZWxmLkRBVEEKKyAgICAgICAgaWYgImIiIGluIHNlbGYuV1JJVEVNT0RFOgorICAgICAgICAgICAgZGF0YSA9IGRhdGEuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCBzZWxmLldSSVRFTU9ERSkgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZShkYXRhKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51bmxpbmsoc3VwcG9ydC5URVNURk4pCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCBzZWxmLlJFQURNT0RFKSBhcyBmcDoKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBEQVRBX0xGKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChmcC5uZXdsaW5lcyksIHNldChzZWxmLk5FV0xJTkUpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgc2VsZi5SRUFETU9ERSkgYXMgZnA6CisgICAgICAgICAgICBkYXRhID0gZnAucmVhZGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBEQVRBX1NQTElUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChmcC5uZXdsaW5lcyksIHNldChzZWxmLk5FV0xJTkUpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmUoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCBzZWxmLlJFQURNT0RFKSBhcyBmcDoKKyAgICAgICAgICAgIGRhdGEgPSBbXQorICAgICAgICAgICAgZCA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHdoaWxlIGQ6CisgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQoZCkKKyAgICAgICAgICAgICAgICBkID0gZnAucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIERBVEFfU1BMSVQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGZwLm5ld2xpbmVzKSwgc2V0KHNlbGYuTkVXTElORSkpCisKKyAgICBkZWYgdGVzdF9zZWVrKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgc2VsZi5SRUFETU9ERSkgYXMgZnA6CisgICAgICAgICAgICBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICBwb3MgPSBmcC50ZWxsKCkKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkbGluZXMoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBEQVRBX1NQTElUWzE6XSkKKyAgICAgICAgICAgIGZwLnNlZWsocG9zKQorICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgREFUQV9TUExJVFsxOl0pCisKKworY2xhc3MgVGVzdENSTmV3bGluZXMoVGVzdEdlbmVyaWNVbml2TmV3bGluZXMpOgorICAgIE5FV0xJTkUgPSAnXHInCisgICAgREFUQSA9IERBVEFfQ1IKKworY2xhc3MgVGVzdExGTmV3bGluZXMoVGVzdEdlbmVyaWNVbml2TmV3bGluZXMpOgorICAgIE5FV0xJTkUgPSAnXG4nCisgICAgREFUQSA9IERBVEFfTEYKKworY2xhc3MgVGVzdENSTEZOZXdsaW5lcyhUZXN0R2VuZXJpY1VuaXZOZXdsaW5lcyk6CisgICAgTkVXTElORSA9ICdcclxuJworICAgIERBVEEgPSBEQVRBX0NSTEYKKworICAgIGRlZiB0ZXN0X3RlbGwoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCBzZWxmLlJFQURNT0RFKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmcC5uZXdsaW5lcyksIHJlcHIoTm9uZSkpCisgICAgICAgICAgICBkYXRhID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgcG9zID0gZnAudGVsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmcC5uZXdsaW5lcyksIHJlcHIoc2VsZi5ORVdMSU5FKSkKKworY2xhc3MgVGVzdE1peGVkTmV3bGluZXMoVGVzdEdlbmVyaWNVbml2TmV3bGluZXMpOgorICAgIE5FV0xJTkUgPSAoJ1xyJywgJ1xuJykKKyAgICBEQVRBID0gREFUQV9NSVhFRAorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBiYXNlX3Rlc3RzID0gKFRlc3RDUk5ld2xpbmVzLAorICAgICAgICAgICAgICAgICAgVGVzdExGTmV3bGluZXMsCisgICAgICAgICAgICAgICAgICBUZXN0Q1JMRk5ld2xpbmVzLAorICAgICAgICAgICAgICAgICAgVGVzdE1peGVkTmV3bGluZXMpCisgICAgdGVzdHMgPSBbXQorICAgICMgVGVzdCB0aGUgQyBhbmQgUHl0aG9uIGltcGxlbWVudGF0aW9ucy4KKyAgICBmb3IgdGVzdCBpbiBiYXNlX3Rlc3RzOgorICAgICAgICBjbGFzcyBDVGVzdCh0ZXN0KToKKyAgICAgICAgICAgIG9wZW4gPSBpby5vcGVuCisgICAgICAgIENUZXN0Ll9fbmFtZV9fID0gc3RyKCJDIiArIHRlc3QuX19uYW1lX18pCisgICAgICAgIGNsYXNzIFB5VGVzdCh0ZXN0KToKKyAgICAgICAgICAgIG9wZW4gPSBzdGF0aWNtZXRob2QocHlpby5vcGVuKQorICAgICAgICBQeVRlc3QuX19uYW1lX18gPSBzdHIoIlB5IiArIHRlc3QuX19uYW1lX18pCisgICAgICAgIHRlc3RzLmFwcGVuZChDVGVzdCkKKyAgICAgICAgdGVzdHMuYXBwZW5kKFB5VGVzdCkKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXZuZXdsaW5lcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOGNmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXZuZXdsaW5lcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOGNmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXZuZXdsaW5lczJrLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzMmsucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjYTMxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXZuZXdsaW5lczJrLnB5CkBAIC0wLDAgKzEsMTMwIEBACisjIFRlc3RzIHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQgZm9yIGJvdGggcmVhZGluZyBhbmQgcGFyc2luZyBmaWxlcy4KK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitpZiBub3QgaGFzYXR0cihzeXMuc3RkaW4sICduZXdsaW5lcycpOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0LCBcCisgICAgICAgICJUaGlzIFB5dGhvbiBkb2VzIG5vdCBoYXZlIHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQiCisKK0ZBVFggPSAneCcgKiAoMioqMTQpCisKK0RBVEFfVEVNUExBVEUgPSBbCisgICAgImxpbmUxPTEiLAorICAgICJsaW5lMj0ndGhpcyBpcyBhIHZlcnkgbG9uZyBsaW5lIGRlc2lnbmVkIHRvIGdvIHBhc3QgdGhlIG1hZ2ljICIgKworICAgICAgICAiaHVuZHJlZCBjaGFyYWN0ZXIgbGltaXQgdGhhdCBpcyBpbnNpZGUgZmlsZW9iamVjdC5jIGFuZCB3aGljaCAiICsKKyAgICAgICAgImlzIG1lYW50IHRvIHNwZWVkIHVwIHRoZSBjb21tb24gY2FzZSwgYnV0IHdlIGFsc28gd2FudCB0byB0ZXN0ICIgKworICAgICAgICAidGhlIHVuY29tbW9uIGNhc2UsIG5hdHVyYWxseS4nIiwKKyAgICAiZGVmIGxpbmUzKCk6cGFzcyIsCisgICAgImxpbmU0ID0gJyVzJyIgJSBGQVRYLAorICAgIF0KKworREFUQV9MRiA9ICJcbiIuam9pbihEQVRBX1RFTVBMQVRFKSArICJcbiIKK0RBVEFfQ1IgPSAiXHIiLmpvaW4oREFUQV9URU1QTEFURSkgKyAiXHIiCitEQVRBX0NSTEYgPSAiXHJcbiIuam9pbihEQVRBX1RFTVBMQVRFKSArICJcclxuIgorCisjIE5vdGUgdGhhdCBEQVRBX01JWEVEIGFsc28gdGVzdHMgdGhlIGFiaWxpdHkgdG8gcmVjb2duaXplIGEgbG9uZSBccgorIyBiZWZvcmUgZW5kLW9mLWZpbGUuCitEQVRBX01JWEVEID0gIlxuIi5qb2luKERBVEFfVEVNUExBVEUpICsgIlxyIgorREFUQV9TUExJVCA9IFt4ICsgIlxuIiBmb3IgeCBpbiBEQVRBX1RFTVBMQVRFXQorZGVsIHgKKworY2xhc3MgVGVzdEdlbmVyaWNVbml2TmV3bGluZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgdXNlIGEgY2xhc3MgdmFyaWFibGUgREFUQSB0byBkZWZpbmUgdGhlIGRhdGEgdG8gd3JpdGUgdG8gdGhlIGZpbGUKKyAgICAjIGFuZCBhIGNsYXNzIHZhcmlhYmxlIE5FV0xJTkUgdG8gc2V0IHRoZSBleHBlY3RlZCBuZXdsaW5lcyB2YWx1ZQorICAgIFJFQURNT0RFID0gJ1UnCisgICAgV1JJVEVNT0RFID0gJ3diJworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgc2VsZi5XUklURU1PREUpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5EQVRBKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sIHNlbGYuUkVBRE1PREUpIGFzIGZwOgorICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIERBVEFfTEYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmcC5uZXdsaW5lcyksIHJlcHIoc2VsZi5ORVdMSU5FKSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sIHNlbGYuUkVBRE1PREUpIGFzIGZwOgorICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgREFUQV9TUExJVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZwLm5ld2xpbmVzKSwgcmVwcihzZWxmLk5FV0xJTkUpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmUoc2VsZik6CisgICAgICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCBzZWxmLlJFQURNT0RFKSBhcyBmcDoKKyAgICAgICAgICAgIGRhdGEgPSBbXQorICAgICAgICAgICAgZCA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHdoaWxlIGQ6CisgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQoZCkKKyAgICAgICAgICAgICAgICBkID0gZnAucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIERBVEFfU1BMSVQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmcC5uZXdsaW5lcyksIHJlcHIoc2VsZi5ORVdMSU5FKSkKKworICAgIGRlZiB0ZXN0X3NlZWsoc2VsZik6CisgICAgICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCBzZWxmLlJFQURNT0RFKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHBvcyA9IGZwLnRlbGwoKQorICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIERBVEFfU1BMSVRbMTpdKQorICAgICAgICAgICAgZnAuc2Vlayhwb3MpCisgICAgICAgICAgICBkYXRhID0gZnAucmVhZGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBEQVRBX1NQTElUWzE6XSkKKworICAgIGRlZiB0ZXN0X2V4ZWNmaWxlKHNlbGYpOgorICAgICAgICBuYW1lc3BhY2UgPSB7fQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBleGVjZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCBuYW1lc3BhY2UpCisgICAgICAgIGZ1bmMgPSBuYW1lc3BhY2VbJ2xpbmUzJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lc3BhY2VbJ2xpbmU0J10sIEZBVFgpCisKKworY2xhc3MgVGVzdE5hdGl2ZU5ld2xpbmVzKFRlc3RHZW5lcmljVW5pdk5ld2xpbmVzKToKKyAgICBORVdMSU5FID0gTm9uZQorICAgIERBVEEgPSBEQVRBX0xGCisgICAgUkVBRE1PREUgPSAncicKKyAgICBXUklURU1PREUgPSAndycKKworY2xhc3MgVGVzdENSTmV3bGluZXMoVGVzdEdlbmVyaWNVbml2TmV3bGluZXMpOgorICAgIE5FV0xJTkUgPSAnXHInCisgICAgREFUQSA9IERBVEFfQ1IKKworY2xhc3MgVGVzdExGTmV3bGluZXMoVGVzdEdlbmVyaWNVbml2TmV3bGluZXMpOgorICAgIE5FV0xJTkUgPSAnXG4nCisgICAgREFUQSA9IERBVEFfTEYKKworY2xhc3MgVGVzdENSTEZOZXdsaW5lcyhUZXN0R2VuZXJpY1VuaXZOZXdsaW5lcyk6CisgICAgTkVXTElORSA9ICdcclxuJworICAgIERBVEEgPSBEQVRBX0NSTEYKKworICAgIGRlZiB0ZXN0X3RlbGwoc2VsZik6CisgICAgICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCBzZWxmLlJFQURNT0RFKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmcC5uZXdsaW5lcyksIHJlcHIoTm9uZSkpCisgICAgICAgICAgICBkYXRhID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgcG9zID0gZnAudGVsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmcC5uZXdsaW5lcyksIHJlcHIoc2VsZi5ORVdMSU5FKSkKKworY2xhc3MgVGVzdE1peGVkTmV3bGluZXMoVGVzdEdlbmVyaWNVbml2TmV3bGluZXMpOgorICAgIE5FV0xJTkUgPSAoJ1xyJywgJ1xuJykKKyAgICBEQVRBID0gREFUQV9NSVhFRAorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBUZXN0TmF0aXZlTmV3bGluZXMsCisgICAgICAgIFRlc3RDUk5ld2xpbmVzLAorICAgICAgICBUZXN0TEZOZXdsaW5lcywKKyAgICAgICAgVGVzdENSTEZOZXdsaW5lcywKKyAgICAgICAgVGVzdE1peGVkTmV3bGluZXMKKyAgICAgKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMyay5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMyay5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1Y2NkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXZuZXdsaW5lczJrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMyay5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMyay5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1Y2NkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXZuZXdsaW5lczJrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bnBhY2sucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bnBhY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkYmM2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VucGFjay5weQpAQCAtMCwwICsxLDEzMCBAQAorZG9jdGVzdHMgPSAiIiIKKworVW5wYWNrIHR1cGxlCisKKyAgICA+Pj4gdCA9ICgxLCAyLCAzKQorICAgID4+PiBhLCBiLCBjID0gdAorICAgID4+PiBhID09IDEgYW5kIGIgPT0gMiBhbmQgYyA9PSAzCisgICAgVHJ1ZQorCitVbnBhY2sgbGlzdAorCisgICAgPj4+IGwgPSBbNCwgNSwgNl0KKyAgICA+Pj4gYSwgYiwgYyA9IGwKKyAgICA+Pj4gYSA9PSA0IGFuZCBiID09IDUgYW5kIGMgPT0gNgorICAgIFRydWUKKworVW5wYWNrIGltcGxpZWQgdHVwbGUKKworICAgID4+PiBhLCBiLCBjID0gNywgOCwgOQorICAgID4+PiBhID09IDcgYW5kIGIgPT0gOCBhbmQgYyA9PSA5CisgICAgVHJ1ZQorCitVbnBhY2sgc3RyaW5nLi4uIGZ1biEKKworICAgID4+PiBhLCBiLCBjID0gJ29uZScKKyAgICA+Pj4gYSA9PSAnbycgYW5kIGIgPT0gJ24nIGFuZCBjID09ICdlJworICAgIFRydWUKKworVW5wYWNrIGdlbmVyaWMgc2VxdWVuY2UKKworICAgID4+PiBjbGFzcyBTZXE6CisgICAgLi4uICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgLi4uICAgICAgICAgaWYgaSA+PSAwIGFuZCBpIDwgMzogcmV0dXJuIGkKKyAgICAuLi4gICAgICAgICByYWlzZSBJbmRleEVycm9yCisgICAgLi4uCisgICAgPj4+IGEsIGIsIGMgPSBTZXEoKQorICAgID4+PiBhID09IDAgYW5kIGIgPT0gMSBhbmQgYyA9PSAyCisgICAgVHJ1ZQorCitTaW5nbGUgZWxlbWVudCB1bnBhY2tpbmcsIHdpdGggZXh0cmEgc3ludGF4CisKKyAgICA+Pj4gc3QgPSAoOTksKQorICAgID4+PiBzbCA9IFsxMDBdCisgICAgPj4+IGEsID0gc3QKKyAgICA+Pj4gYQorICAgIDk5CisgICAgPj4+IGIsID0gc2wKKyAgICA+Pj4gYgorICAgIDEwMAorCitOb3cgZm9yIHNvbWUgZmFpbHVyZXMKKworVW5wYWNraW5nIG5vbi1zZXF1ZW5jZQorCisgICAgPj4+IGEsIGIsIGMgPSA3CisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiAnaW50JyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlCisKK1VucGFja2luZyB0dXBsZSBvZiB3cm9uZyBzaXplCisKKyAgICA+Pj4gYSwgYiA9IHQKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBWYWx1ZUVycm9yOiB0b28gbWFueSB2YWx1ZXMgdG8gdW5wYWNrCisKK1VucGFja2luZyB0dXBsZSBvZiB3cm9uZyBzaXplCisKKyAgICA+Pj4gYSwgYiA9IGwKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBWYWx1ZUVycm9yOiB0b28gbWFueSB2YWx1ZXMgdG8gdW5wYWNrCisKK1VucGFja2luZyBzZXF1ZW5jZSB0b28gc2hvcnQKKworICAgID4+PiBhLCBiLCBjLCBkID0gU2VxKCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBWYWx1ZUVycm9yOiBuZWVkIG1vcmUgdGhhbiAzIHZhbHVlcyB0byB1bnBhY2sKKworVW5wYWNraW5nIHNlcXVlbmNlIHRvbyBsb25nCisKKyAgICA+Pj4gYSwgYiA9IFNlcSgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVmFsdWVFcnJvcjogdG9vIG1hbnkgdmFsdWVzIHRvIHVucGFjaworCitVbnBhY2tpbmcgYSBzZXF1ZW5jZSB3aGVyZSB0aGUgdGVzdCBmb3IgdG9vIGxvbmcgcmFpc2VzIGEgZGlmZmVyZW50IGtpbmQgb2YKK2Vycm9yCisKKyAgICA+Pj4gY2xhc3MgQm96b0Vycm9yKEV4Y2VwdGlvbik6CisgICAgLi4uICAgICBwYXNzCisgICAgLi4uCisgICAgPj4+IGNsYXNzIEJhZFNlcToKKyAgICAuLi4gICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAuLi4gICAgICAgICBpZiBpID49IDAgYW5kIGkgPCAzOgorICAgIC4uLiAgICAgICAgICAgICByZXR1cm4gaQorICAgIC4uLiAgICAgICAgIGVsaWYgaSA9PSAzOgorICAgIC4uLiAgICAgICAgICAgICByYWlzZSBCb3pvRXJyb3IKKyAgICAuLi4gICAgICAgICBlbHNlOgorICAgIC4uLiAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCisgICAgLi4uCisKK1RyaWdnZXIgY29kZSB3aGlsZSBub3QgZXhwZWN0aW5nIGFuIEluZGV4RXJyb3IgKHVucGFjayBzZXF1ZW5jZSB0b28gbG9uZywgd3JvbmcKK2Vycm9yKQorCisgICAgPj4+IGEsIGIsIGMsIGQsIGUgPSBCYWRTZXEoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIEJvem9FcnJvcgorCitUcmlnZ2VyIGNvZGUgd2hpbGUgZXhwZWN0aW5nIGFuIEluZGV4RXJyb3IgKHVucGFjayBzZXF1ZW5jZSB0b28gc2hvcnQsIHdyb25nCitlcnJvcikKKworICAgID4+PiBhLCBiLCBjID0gQmFkU2VxKCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBCb3pvRXJyb3IKKworIiIiCisKK19fdGVzdF9fID0geydkb2N0ZXN0cycgOiBkb2N0ZXN0c30KKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPUZhbHNlKToKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF91bnBhY2sKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF91bnBhY2ssIHZlcmJvc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VucGFjay5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bnBhY2sucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMWFjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bnBhY2sucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VucGFjay5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bnBhY2sucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMWFjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bnBhY2sucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTI3M2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliLnB5CkBAIC0wLDAgKzEsOTEzIEBACisiIiJSZWdyZXNzc2lvbiB0ZXN0cyBmb3IgdXJsbGliIiIiCisKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCBodHRwbGliCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IG1pbWV0b29scworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgU3RyaW5nSU8KKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gYmFzZTY0IGltcG9ydCBiNjRlbmNvZGUKKworCitkZWYgaGV4ZXNjYXBlKGNoYXIpOgorICAgICIiIkVzY2FwZSBjaGFyIGFzIFJGQyAyMzk2IHNwZWNpZmllcyIiIgorICAgIGhleF9yZXByID0gaGV4KG9yZChjaGFyKSlbMjpdLnVwcGVyKCkKKyAgICBpZiBsZW4oaGV4X3JlcHIpID09IDE6CisgICAgICAgIGhleF9yZXByID0gIjAlcyIgJSBoZXhfcmVwcgorICAgIHJldHVybiAiJSIgKyBoZXhfcmVwcgorCisKK2NsYXNzIEZha2VIVFRQTWl4aW4ob2JqZWN0KToKKyAgICBkZWYgZmFrZWh0dHAoc2VsZiwgZmFrZWRhdGEpOgorICAgICAgICBjbGFzcyBGYWtlU29ja2V0KFN0cmluZ0lPLlN0cmluZ0lPKToKKworICAgICAgICAgICAgZGVmIHNlbmRhbGwoc2VsZiwgZGF0YSk6CisgICAgICAgICAgICAgICAgRmFrZUhUVFBDb25uZWN0aW9uLmJ1ZiA9IGRhdGEKKworICAgICAgICAgICAgZGVmIG1ha2VmaWxlKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiByZWFkKHNlbGYsIGFtdD1Ob25lKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0lPLlN0cmluZ0lPLnJlYWQoc2VsZiwgYW10KQorCisgICAgICAgICAgICBkZWYgcmVhZGxpbmUoc2VsZiwgbGVuZ3RoPU5vbmUpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nSU8uU3RyaW5nSU8ucmVhZGxpbmUoc2VsZiwgbGVuZ3RoKQorCisgICAgICAgIGNsYXNzIEZha2VIVFRQQ29ubmVjdGlvbihodHRwbGliLkhUVFBDb25uZWN0aW9uKToKKworICAgICAgICAgICAgIyBidWZmZXIgdG8gc3RvcmUgZGF0YSBmb3IgdmVyaWZpY2F0aW9uIGluIHVybG9wZW4gdGVzdHMuCisgICAgICAgICAgICBidWYgPSAiIgorCisgICAgICAgICAgICBkZWYgY29ubmVjdChzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBGYWtlU29ja2V0KGZha2VkYXRhKQorCisgICAgICAgIGFzc2VydCBodHRwbGliLkhUVFAuX2Nvbm5lY3Rpb25fY2xhc3MgPT0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbgorCisgICAgICAgIGh0dHBsaWIuSFRUUC5fY29ubmVjdGlvbl9jbGFzcyA9IEZha2VIVFRQQ29ubmVjdGlvbgorCisgICAgZGVmIHVuZmFrZWh0dHAoc2VsZik6CisgICAgICAgIGh0dHBsaWIuSFRUUC5fY29ubmVjdGlvbl9jbGFzcyA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24KKworCitjbGFzcyB1cmxvcGVuX0ZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB1cmxvcGVuKCkgb3BlbmluZyBhIHRlbXBvcmFyeSBmaWxlLgorCisgICAgVHJ5IHRvIHRlc3QgYXMgbXVjaCBmdW5jdGlvbmFsaXR5IGFzIHBvc3NpYmxlIHNvIGFzIHRvIGN1dCBkb3duIG9uIHJlbGlhbmNlCisgICAgb24gY29ubmVjdGluZyB0byB0aGUgTmV0IGZvciB0ZXN0aW5nLgorCisgICAgIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIlNldHVwIG9mIGEgdGVtcCBmaWxlIHRvIHVzZSBmb3IgdGVzdGluZyIiIgorICAgICAgICBzZWxmLnRleHQgPSAidGVzdF91cmxsaWI6ICVzXG4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgRklMRSA9IGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3diJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgRklMRS53cml0ZShzZWxmLnRleHQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBGSUxFLmNsb3NlKCkKKyAgICAgICAgc2VsZi5wYXRobmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5yZXR1cm5lZF9vYmogPSB1cmxsaWIudXJsb3BlbigiZmlsZTolcyIgJSBzZWxmLnBhdGhuYW1lKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAiIiJTaHV0IGRvd24gdGhlIG9wZW4gb2JqZWN0IiIiCisgICAgICAgIHNlbGYucmV0dXJuZWRfb2JqLmNsb3NlKCkKKyAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9pbnRlcmZhY2Uoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIG9iamVjdCByZXR1cm5lZCBieSB1cmxvcGVuKCkgaGFzIHRoZSBzcGVjaWZpZWQgbWV0aG9kcworICAgICAgICBmb3IgYXR0ciBpbiAoInJlYWQiLCAicmVhZGxpbmUiLCAicmVhZGxpbmVzIiwgImZpbGVubyIsCisgICAgICAgICAgICAgICAgICAgICAiY2xvc2UiLCAiaW5mbyIsICJnZXR1cmwiLCAiZ2V0Y29kZSIsICJfX2l0ZXJfXyIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc2VsZi5yZXR1cm5lZF9vYmosIGF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgcmV0dXJuZWQgYnkgdXJsb3BlbigpIGxhY2tzICVzIGF0dHJpYnV0ZSIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIpCisKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGV4dCwgc2VsZi5yZXR1cm5lZF9vYmoucmVhZCgpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ZXh0LCBzZWxmLnJldHVybmVkX29iai5yZWFkbGluZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBzZWxmLnJldHVybmVkX29iai5yZWFkbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsaW5nIHJlYWRsaW5lKCkgYWZ0ZXIgZXhoYXVzdGluZyB0aGUgZmlsZSBkaWQgbm90IgorICAgICAgICAgICAgICAgICAgICAgICAgICIgcmV0dXJuIGFuIGVtcHR5IHN0cmluZyIpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6CisgICAgICAgIGxpbmVzX2xpc3QgPSBzZWxmLnJldHVybmVkX29iai5yZWFkbGluZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaW5lc19saXN0KSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmVzKCkgcmV0dXJuZWQgdGhlIHdyb25nIG51bWJlciBvZiBsaW5lcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXNfbGlzdFswXSwgc2VsZi50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZXMoKSByZXR1cm5lZCBpbXByb3BlciB0ZXh0IikKKworICAgIGRlZiB0ZXN0X2ZpbGVubyhzZWxmKToKKyAgICAgICAgZmlsZV9udW0gPSBzZWxmLnJldHVybmVkX29iai5maWxlbm8oKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmlsZV9udW0sIGludCwgImZpbGVubygpIGRpZCBub3QgcmV0dXJuIGFuIGludCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucmVhZChmaWxlX251bSwgbGVuKHNlbGYudGV4dCkpLCBzZWxmLnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWRpbmcgb24gdGhlIGZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSBmaWxlbm8oKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImRpZCBub3QgcmV0dXJuIHRoZSBleHBlY3RlZCB0ZXh0IikKKworICAgIGRlZiB0ZXN0X2Nsb3NlKHNlbGYpOgorICAgICAgICAjIFRlc3QgY2xvc2UoKSBieSBjYWxsaW5nIGl0IGhlYXIgYW5kIHRoZW4gaGF2aW5nIGl0IGJlIGNhbGxlZCBhZ2FpbgorICAgICAgICAjIGJ5IHRoZSB0ZWFyRG93bigpIG1ldGhvZCBmb3IgdGhlIHRlc3QKKyAgICAgICAgc2VsZi5yZXR1cm5lZF9vYmouY2xvc2UoKQorCisgICAgZGVmIHRlc3RfaW5mbyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYucmV0dXJuZWRfb2JqLmluZm8oKSwgbWltZXRvb2xzLk1lc3NhZ2UpCisKKyAgICBkZWYgdGVzdF9nZXR1cmwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZXR1cm5lZF9vYmouZ2V0dXJsKCksIHNlbGYucGF0aG5hbWUpCisKKyAgICBkZWYgdGVzdF9nZXRjb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucmV0dXJuZWRfb2JqLmdldGNvZGUoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2l0ZXIoc2VsZik6CisgICAgICAgICMgVGVzdCBpdGVyYXRvcgorICAgICAgICAjIERvbid0IG5lZWQgdG8gY291bnQgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgc2luY2UgdGVzdCB3b3VsZCBmYWlsIHRoZQorICAgICAgICAjIGluc3RhbnQgaXQgcmV0dXJuZWQgYW55dGhpbmcgYmV5b25kIHRoZSBmaXJzdCBsaW5lIGZyb20gdGhlCisgICAgICAgICMgY29tcGFyaXNvbgorICAgICAgICBmb3IgbGluZSBpbiBzZWxmLnJldHVybmVkX29iai5fX2l0ZXJfXygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBzZWxmLnRleHQpCisKKyAgICBkZWYgdGVzdF9yZWxhdGl2ZWxvY2FsZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcix1cmxsaWIudXJsb3BlbiwnLi8nICsgc2VsZi5wYXRobmFtZSkKKworY2xhc3MgUHJveHlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgUmVjb3JkcyBjaGFuZ2VzIHRvIGVudiB2YXJzCisgICAgICAgIHNlbGYuZW52ID0gdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKQorICAgICAgICAjIERlbGV0ZSBhbGwgcHJveHkgcmVsYXRlZCBlbnYgdmFycworICAgICAgICBmb3IgayBpbiBvcy5lbnZpcm9uLmtleXMoKToKKyAgICAgICAgICAgIGlmICdwcm94eScgaW4gay5sb3dlcigpOgorICAgICAgICAgICAgICAgIHNlbGYuZW52LnVuc2V0KGspCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICMgUmVzdG9yZSBhbGwgcHJveHkgcmVsYXRlZCBlbnYgdmFycworICAgICAgICBzZWxmLmVudi5fX2V4aXRfXygpCisgICAgICAgIGRlbCBzZWxmLmVudgorCisgICAgZGVmIHRlc3RfZ2V0cHJveGllc19lbnZpcm9ubWVudF9rZWVwX25vX3Byb3hpZXMoc2VsZik6CisgICAgICAgIHNlbGYuZW52LnNldCgnTk9fUFJPWFknLCAnbG9jYWxob3N0JykKKyAgICAgICAgcHJveGllcyA9IHVybGxpYi5nZXRwcm94aWVzX2Vudmlyb25tZW50KCkKKyAgICAgICAgIyBnZXRwcm94aWVzX2Vudmlyb25tZW50IHVzZSBsb3dlcmVkIGNhc2UgdHJ1bmNhdGVkIChubyAnX3Byb3h5Jykga2V5cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdsb2NhbGhvc3QnLCBwcm94aWVzWydubyddKQorICAgICAgICAjIExpc3Qgb2Ygbm9fcHJveGllcyB3aXRoIHNwYWNlLgorICAgICAgICBzZWxmLmVudi5zZXQoJ05PX1BST1hZJywgJ2xvY2FsaG9zdCwgYW5vdGhlcmRvbWFpbi5jb20sIG5ld2RvbWFpbi5jb20nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXJsbGliLnByb3h5X2J5cGFzc19lbnZpcm9ubWVudCgnYW5vdGhlcmRvbWFpbi5jb20nKSkKKworCitjbGFzcyB1cmxvcGVuX0h0dHBUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSwgRmFrZUhUVFBNaXhpbik6CisgICAgIiIiVGVzdCB1cmxvcGVuKCkgb3BlbmluZyBhIGZha2UgaHR0cCBjb25uZWN0aW9uLiIiIgorCisgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5mYWtlaHR0cCgnSGVsbG8hJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnAgPSB1cmxsaWIudXJsb3BlbigiaHR0cDovL3B5dGhvbi5vcmcvIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAucmVhZGxpbmUoKSwgJ0hlbGxvIScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLnJlYWRsaW5lKCksICcnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5nZXR1cmwoKSwgJ2h0dHA6Ly9weXRob24ub3JnLycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLmdldGNvZGUoKSwgMjAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi51bmZha2VodHRwKCkKKworICAgIGRlZiB0ZXN0X3VybF9mcmFnbWVudChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTE3MDM6IGdldHVybCgpIG9taXRzIGZyYWdtZW50cyBpbiB0aGUgb3JpZ2luYWwgVVJMLgorICAgICAgICB1cmwgPSAnaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3VybGxpYi5odG1sI09LJworICAgICAgICBzZWxmLmZha2VodHRwKCdIZWxsbyEnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcCA9IHVybGxpYi51cmxvcGVuKHVybCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAuZ2V0dXJsKCksIHVybCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYudW5mYWtlaHR0cCgpCisKKyAgICBkZWYgdGVzdF9yZWFkX2JvZ3VzKHNlbGYpOgorICAgICAgICAjIHVybG9wZW4oKSBzaG91bGQgcmFpc2UgSU9FcnJvciBmb3IgbWFueSBlcnJvciBjb2Rlcy4KKyAgICAgICAgc2VsZi5mYWtlaHR0cCgnJydIVFRQLzEuMSA0MDEgQXV0aGVudGljYXRpb24gUmVxdWlyZWQKK0RhdGU6IFdlZCwgMDIgSmFuIDIwMDggMDM6MDM6NTQgR01UCitTZXJ2ZXI6IEFwYWNoZS8xLjMuMzMgKERlYmlhbiBHTlUvTGludXgpIG1vZF9zc2wvMi44LjIyIE9wZW5TU0wvMC45LjdlCitDb25uZWN0aW9uOiBjbG9zZQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMQorJycnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB1cmxsaWIudXJsb3BlbiwgImh0dHA6Ly9weXRob24ub3JnLyIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnVuZmFrZWh0dHAoKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9yZWRpcmVjdChzZWxmKToKKyAgICAgICAgIyB1cmxvcGVuKCkgc2hvdWxkIHJhaXNlIElPRXJyb3IgZm9yIG1hbnkgZXJyb3IgY29kZXMuCisgICAgICAgIHNlbGYuZmFrZWh0dHAoIiIiSFRUUC8xLjEgMzAyIEZvdW5kCitEYXRlOiBXZWQsIDAyIEphbiAyMDA4IDAzOjAzOjU0IEdNVAorU2VydmVyOiBBcGFjaGUvMS4zLjMzIChEZWJpYW4gR05VL0xpbnV4KSBtb2Rfc3NsLzIuOC4yMiBPcGVuU1NMLzAuOS43ZQorTG9jYXRpb246IGZpbGU6UkVBRE1FCitDb25uZWN0aW9uOiBjbG9zZQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMQorIiIiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB1cmxsaWIudXJsb3BlbiwgImh0dHA6Ly9weXRob24ub3JnLyIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnVuZmFrZWh0dHAoKQorCisgICAgZGVmIHRlc3RfZW1wdHlfc29ja2V0KHNlbGYpOgorICAgICAgICAjIHVybG9wZW4oKSByYWlzZXMgSU9FcnJvciBpZiB0aGUgdW5kZXJseWluZyBzb2NrZXQgZG9lcyBub3Qgc2VuZCBhbnkKKyAgICAgICAgIyBkYXRhLiAoIzE2ODAyMzApCisgICAgICAgIHNlbGYuZmFrZWh0dHAoJycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHVybGxpYi51cmxvcGVuLCAnaHR0cDovL3NvbWV0aGluZycpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnVuZmFrZWh0dHAoKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19sb2NhbGZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHVybGxpYi51cmxvcGVuLAorICAgICAgICAgICAgICAgICdmaWxlOi8vbG9jYWxob3N0L2EvbWlzc2luZy9maWxlLnB5JykKKyAgICAgICAgZmQsIHRtcF9maWxlID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIHRtcF9maWxldXJsID0gJ2ZpbGU6Ly9sb2NhbGhvc3QvJyArIHRtcF9maWxlLnJlcGxhY2Uob3MucGF0aC5zZXAsICcvJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHRtcF9maWxlKSkKKyAgICAgICAgICAgIGZwID0gdXJsbGliLnVybG9wZW4odG1wX2ZpbGV1cmwpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgb3MudW5saW5rKHRtcF9maWxlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHModG1wX2ZpbGUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB1cmxsaWIudXJsb3BlbiwgdG1wX2ZpbGV1cmwpCisKKyAgICBkZWYgdGVzdF9mdHBfbm9uZXhpc3Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHVybGxpYi51cmxvcGVuLAorICAgICAgICAgICAgICAgICdmdHA6Ly9sb2NhbGhvc3Qvbm90L2V4aXN0aW5nL2ZpbGUucHknKQorCisKKyAgICBkZWYgdGVzdF91c2VycGFzc19pbnVybChzZWxmKToKKyAgICAgICAgc2VsZi5mYWtlaHR0cCgnSGVsbG8hJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmFrZWh0dHBfd3JhcHBlciA9IGh0dHBsaWIuSFRUUC5fY29ubmVjdGlvbl9jbGFzcworICAgICAgICAgICAgZnAgPSB1cmxsaWIudXJsb3BlbigiaHR0cDovL3VzZXI6cGFzc0BweXRob24ub3JnLyIpCisgICAgICAgICAgICBhdXRob3JpemF0aW9uID0gKCJBdXRob3JpemF0aW9uOiBCYXNpYyAlc1xyXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiNjRlbmNvZGUoJ3VzZXI6cGFzcycpKQorICAgICAgICAgICAgIyBUaGUgYXV0aG9yaXphdGlvbiBoZWFkZXIgbXVzdCBiZSBpbiBwbGFjZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihhdXRob3JpemF0aW9uLCBmYWtlaHR0cF93cmFwcGVyLmJ1ZikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAucmVhZGxpbmUoKSwgIkhlbGxvISIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLnJlYWRsaW5lKCksICIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5nZXR1cmwoKSwgJ2h0dHA6Ly91c2VyOnBhc3NAcHl0aG9uLm9yZy8nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5nZXRjb2RlKCksIDIwMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYudW5mYWtlaHR0cCgpCisKKyAgICBkZWYgdGVzdF91c2VycGFzc193aXRoX3NwYWNlc19pbnVybChzZWxmKToKKyAgICAgICAgc2VsZi5mYWtlaHR0cCgnSGVsbG8hJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdXJsID0gImh0dHA6Ly9hIGI6YyBkQHB5dGhvbi5vcmcvIgorICAgICAgICAgICAgZmFrZWh0dHBfd3JhcHBlciA9IGh0dHBsaWIuSFRUUC5fY29ubmVjdGlvbl9jbGFzcworICAgICAgICAgICAgYXV0aG9yaXphdGlvbiA9ICgiQXV0aG9yaXphdGlvbjogQmFzaWMgJXNcclxuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGI2NGVuY29kZSgnYSBiOmMgZCcpKQorICAgICAgICAgICAgZnAgPSB1cmxsaWIudXJsb3Blbih1cmwpCisgICAgICAgICAgICAjIFRoZSBhdXRob3JpemF0aW9uIGhlYWRlciBtdXN0IGJlIGluIHBsYWNlCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGF1dGhvcml6YXRpb24sIGZha2VodHRwX3dyYXBwZXIuYnVmKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5yZWFkbGluZSgpLCAiSGVsbG8hIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAucmVhZGxpbmUoKSwgIiIpCisgICAgICAgICAgICAjIHRoZSBzcGFjZXMgYXJlIHF1b3RlZCBpbiBVUkwgc28gbm8gbWF0Y2gKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZnAuZ2V0dXJsKCksIHVybCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAuZ2V0Y29kZSgpLCAyMDApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnVuZmFrZWh0dHAoKQorCisKK2NsYXNzIHVybHJldHJpZXZlX0ZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB1cmxsaWIudXJscmV0cmlldmUoKSBvbiBsb2NhbCBmaWxlcyIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIENyZWF0ZSBhIGxpc3Qgb2YgdGVtcG9yYXJ5IGZpbGVzLiBFYWNoIGl0ZW0gaW4gdGhlIGxpc3QgaXMgYSBmaWxlCisgICAgICAgICMgbmFtZSAoYWJzb2x1dGUgcGF0aCBvciByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSkuCisgICAgICAgICMgQWxsIGZpbGVzIGluIHRoaXMgbGlzdCB3aWxsIGJlIGRlbGV0ZWQgaW4gdGhlIHRlYXJEb3duIG1ldGhvZC4gTm90ZSwKKyAgICAgICAgIyB0aGlzIG9ubHkgaGVscHMgdG8gbWFrZXMgc3VyZSB0ZW1wb3JhcnkgZmlsZXMgZ2V0IGRlbGV0ZWQsIGJ1dCBpdAorICAgICAgICAjIGRvZXMgbm90aGluZyBhYm91dCB0cnlpbmcgdG8gY2xvc2UgZmlsZXMgdGhhdCBtYXkgc3RpbGwgYmUgb3Blbi4gSXQKKyAgICAgICAgIyBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGRldmVsb3BlciB0byBwcm9wZXJseSBjbG9zZSBmaWxlcyBldmVuCisgICAgICAgICMgd2hlbiBleGNlcHRpb25hbCBjb25kaXRpb25zIG9jY3VyLgorICAgICAgICBzZWxmLnRlbXBGaWxlcyA9IFtdCisKKyAgICAgICAgIyBDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZS4KKyAgICAgICAgc2VsZi5yZWdpc3RlckZpbGVGb3JDbGVhblVwKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYudGV4dCA9ICd0ZXN0aW5nIHVybGxpYi51cmxyZXRyaWV2ZScKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgRklMRSA9IGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3diJykKKyAgICAgICAgICAgIEZJTEUud3JpdGUoc2VsZi50ZXh0KQorICAgICAgICAgICAgRklMRS5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6IEZJTEUuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0OiBwYXNzCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICMgRGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZXMuCisgICAgICAgIGZvciBlYWNoIGluIHNlbGYudGVtcEZpbGVzOgorICAgICAgICAgICAgdHJ5OiBvcy5yZW1vdmUoZWFjaCkKKyAgICAgICAgICAgIGV4Y2VwdDogcGFzcworCisgICAgZGVmIGNvbnN0cnVjdExvY2FsRmlsZVVybChzZWxmLCBmaWxlUGF0aCk6CisgICAgICAgIHJldHVybiAiZmlsZTovLyVzIiAlIHVybGxpYi5wYXRobmFtZTJ1cmwob3MucGF0aC5hYnNwYXRoKGZpbGVQYXRoKSkKKworICAgIGRlZiBjcmVhdGVOZXdUZW1wRmlsZShzZWxmLCBkYXRhPSIiKToKKyAgICAgICAgIiIiQ3JlYXRlcyBhIG5ldyB0ZW1wb3JhcnkgZmlsZSBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgZGF0YSwKKyAgICAgICAgcmVnaXN0ZXJzIHRoZSBmaWxlIGZvciBkZWxldGlvbiBkdXJpbmcgdGhlIHRlc3QgZml4dHVyZSB0ZWFyIGRvd24sIGFuZAorICAgICAgICByZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlLiIiIgorCisgICAgICAgIG5ld0ZkLCBuZXdGaWxlUGF0aCA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnJlZ2lzdGVyRmlsZUZvckNsZWFuVXAobmV3RmlsZVBhdGgpCisgICAgICAgICAgICBuZXdGaWxlID0gb3MuZmRvcGVuKG5ld0ZkLCAid2IiKQorICAgICAgICAgICAgbmV3RmlsZS53cml0ZShkYXRhKQorICAgICAgICAgICAgbmV3RmlsZS5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6IG5ld0ZpbGUuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgIHJldHVybiBuZXdGaWxlUGF0aAorCisgICAgZGVmIHJlZ2lzdGVyRmlsZUZvckNsZWFuVXAoc2VsZiwgZmlsZU5hbWUpOgorICAgICAgICBzZWxmLnRlbXBGaWxlcy5hcHBlbmQoZmlsZU5hbWUpCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBhIGxvY2FsIGZpbGUganVzdCBnZXRzIGl0cyBvd24gbG9jYXRpb24gcmV0dXJuZWQgYW5kCisgICAgICAgICMgYSBoZWFkZXJzIHZhbHVlIGlzIHJldHVybmVkLgorICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJscmV0cmlldmUoImZpbGU6JXMiICUgdGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMF0sIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyZXN1bHRbMV0sIG1pbWV0b29scy5NZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpZCBub3QgZ2V0IGEgbWltZXRvb2xzLk1lc3NhZ2UgaW5zdGFuY2UgYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlY29uZCByZXR1cm5lZCB2YWx1ZSIpCisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBzZXR0aW5nIHRoZSBmaWxlbmFtZSBhcmd1bWVudCB3b3Jrcy4KKyAgICAgICAgc2Vjb25kX3RlbXAgPSAiJXMuMiIgJSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYucmVnaXN0ZXJGaWxlRm9yQ2xlYW5VcChzZWNvbmRfdGVtcCkKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybHJldHJpZXZlKHNlbGYuY29uc3RydWN0TG9jYWxGaWxlVXJsKAorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiksIHNlY29uZF90ZW1wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlY29uZF90ZW1wLCByZXN1bHRbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWNvbmRfdGVtcCksICJjb3B5IG9mIHRoZSBmaWxlIHdhcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFkZSIpCisgICAgICAgIEZJTEUgPSBmaWxlKHNlY29uZF90ZW1wLCAncmInKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gRklMRS5yZWFkKCkKKyAgICAgICAgICAgIEZJTEUuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OiBGSUxFLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGV4dCwgdGV4dCkKKworICAgIGRlZiB0ZXN0X3JlcG9ydGhvb2soc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgdGhlIHJlcG9ydGhvb2sgd29ya3MuCisgICAgICAgIGRlZiBob29rdGVzdGVyKGNvdW50LCBibG9ja19zaXplLCB0b3RhbF9zaXplLCBjb3VudF9ob2xkZXI9WzBdKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShjb3VudCwgaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGJsb2NrX3NpemUsIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh0b3RhbF9zaXplLCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBjb3VudF9ob2xkZXJbMF0pCisgICAgICAgICAgICBjb3VudF9ob2xkZXJbMF0gPSBjb3VudF9ob2xkZXJbMF0gKyAxCisgICAgICAgIHNlY29uZF90ZW1wID0gIiVzLjIiICUgdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLnJlZ2lzdGVyRmlsZUZvckNsZWFuVXAoc2Vjb25kX3RlbXApCisgICAgICAgIHVybGxpYi51cmxyZXRyaWV2ZShzZWxmLmNvbnN0cnVjdExvY2FsRmlsZVVybCh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwKKyAgICAgICAgICAgIHNlY29uZF90ZW1wLCBob29rdGVzdGVyKQorCisgICAgZGVmIHRlc3RfcmVwb3J0aG9va18wX2J5dGVzKHNlbGYpOgorICAgICAgICAjIFRlc3Qgb24gemVybyBsZW5ndGggZmlsZS4gU2hvdWxkIGNhbGwgcmVwb3J0aG9vayBvbmx5IDEgdGltZS4KKyAgICAgICAgcmVwb3J0ID0gW10KKyAgICAgICAgZGVmIGhvb2t0ZXN0ZXIoY291bnQsIGJsb2NrX3NpemUsIHRvdGFsX3NpemUsIF9yZXBvcnQ9cmVwb3J0KToKKyAgICAgICAgICAgIF9yZXBvcnQuYXBwZW5kKChjb3VudCwgYmxvY2tfc2l6ZSwgdG90YWxfc2l6ZSkpCisgICAgICAgIHNyY0ZpbGVOYW1lID0gc2VsZi5jcmVhdGVOZXdUZW1wRmlsZSgpCisgICAgICAgIHVybGxpYi51cmxyZXRyaWV2ZShzZWxmLmNvbnN0cnVjdExvY2FsRmlsZVVybChzcmNGaWxlTmFtZSksCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOLCBob29rdGVzdGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXBvcnQpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcG9ydFswXVsyXSwgMCkKKworICAgIGRlZiB0ZXN0X3JlcG9ydGhvb2tfNV9ieXRlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IG9uIDUgYnl0ZSBmaWxlLiBTaG91bGQgY2FsbCByZXBvcnRob29rIG9ubHkgMiB0aW1lcyAob25jZSB3aGVuCisgICAgICAgICMgdGhlICJuZXR3b3JrIGNvbm5lY3Rpb24iIGlzIGVzdGFibGlzaGVkIGFuZCBvbmNlIHdoZW4gdGhlIGJsb2NrIGlzCisgICAgICAgICMgcmVhZCkuIFNpbmNlIHRoZSBibG9jayBzaXplIGlzIDgxOTIgYnl0ZXMsIG9ubHkgb25lIGJsb2NrIHJlYWQgaXMKKyAgICAgICAgIyByZXF1aXJlZCB0byByZWFkIHRoZSBlbnRpcmUgZmlsZS4KKyAgICAgICAgcmVwb3J0ID0gW10KKyAgICAgICAgZGVmIGhvb2t0ZXN0ZXIoY291bnQsIGJsb2NrX3NpemUsIHRvdGFsX3NpemUsIF9yZXBvcnQ9cmVwb3J0KToKKyAgICAgICAgICAgIF9yZXBvcnQuYXBwZW5kKChjb3VudCwgYmxvY2tfc2l6ZSwgdG90YWxfc2l6ZSkpCisgICAgICAgIHNyY0ZpbGVOYW1lID0gc2VsZi5jcmVhdGVOZXdUZW1wRmlsZSgieCIgKiA1KQorICAgICAgICB1cmxsaWIudXJscmV0cmlldmUoc2VsZi5jb25zdHJ1Y3RMb2NhbEZpbGVVcmwoc3JjRmlsZU5hbWUpLAorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiwgaG9va3Rlc3RlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVwb3J0KSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXBvcnRbMF1bMV0sIDgxOTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwb3J0WzBdWzJdLCA1KQorCisgICAgZGVmIHRlc3RfcmVwb3J0aG9va184MTkzX2J5dGVzKHNlbGYpOgorICAgICAgICAjIFRlc3Qgb24gODE5MyBieXRlIGZpbGUuIFNob3VsZCBjYWxsIHJlcG9ydGhvb2sgb25seSAzIHRpbWVzIChvbmNlCisgICAgICAgICMgd2hlbiB0aGUgIm5ldHdvcmsgY29ubmVjdGlvbiIgaXMgZXN0YWJsaXNoZWQsIG9uY2UgZm9yIHRoZSBuZXh0IDgxOTIKKyAgICAgICAgIyBieXRlcywgYW5kIG9uY2UgZm9yIHRoZSBsYXN0IGJ5dGUpLgorICAgICAgICByZXBvcnQgPSBbXQorICAgICAgICBkZWYgaG9va3Rlc3Rlcihjb3VudCwgYmxvY2tfc2l6ZSwgdG90YWxfc2l6ZSwgX3JlcG9ydD1yZXBvcnQpOgorICAgICAgICAgICAgX3JlcG9ydC5hcHBlbmQoKGNvdW50LCBibG9ja19zaXplLCB0b3RhbF9zaXplKSkKKyAgICAgICAgc3JjRmlsZU5hbWUgPSBzZWxmLmNyZWF0ZU5ld1RlbXBGaWxlKCJ4IiAqIDgxOTMpCisgICAgICAgIHVybGxpYi51cmxyZXRyaWV2ZShzZWxmLmNvbnN0cnVjdExvY2FsRmlsZVVybChzcmNGaWxlTmFtZSksCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOLCBob29rdGVzdGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXBvcnQpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcG9ydFswXVsxXSwgODE5MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXBvcnRbMF1bMl0sIDgxOTMpCisKKworY2xhc3MgdXJscmV0cmlldmVfSHR0cFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlLCBGYWtlSFRUUE1peGluKToKKyAgICAiIiJUZXN0IHVybGxpYi51cmxyZXRyaWV2ZSgpIHVzaW5nIGZha2UgaHR0cCBjb25uZWN0aW9ucyIiIgorCisgICAgZGVmIHRlc3Rfc2hvcnRfY29udGVudF9yYWlzZXNfQ29udGVudFRvb1Nob3J0RXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuZmFrZWh0dHAoJycnSFRUUC8xLjEgMjAwIE9LCitEYXRlOiBXZWQsIDAyIEphbiAyMDA4IDAzOjAzOjU0IEdNVAorU2VydmVyOiBBcGFjaGUvMS4zLjMzIChEZWJpYW4gR05VL0xpbnV4KSBtb2Rfc3NsLzIuOC4yMiBPcGVuU1NMLzAuOS43ZQorQ29ubmVjdGlvbjogY2xvc2UKK0NvbnRlbnQtTGVuZ3RoOiAxMDAKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEKKworRkYKKycnJykKKworICAgICAgICBkZWYgX3JlcG9ydGhvb2socGFyMSwgcGFyMiwgcGFyMyk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXJsbGliLkNvbnRlbnRUb29TaG9ydEVycm9yLCB1cmxsaWIudXJscmV0cmlldmUsCisgICAgICAgICAgICAgICAgICAgICdodHRwOi8vZXhhbXBsZS5jb20nLCByZXBvcnRob29rPV9yZXBvcnRob29rKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi51bmZha2VodHRwKCkKKworICAgIGRlZiB0ZXN0X3Nob3J0X2NvbnRlbnRfcmFpc2VzX0NvbnRlbnRUb29TaG9ydEVycm9yX3dpdGhvdXRfcmVwb3J0aG9vayhzZWxmKToKKyAgICAgICAgc2VsZi5mYWtlaHR0cCgnJydIVFRQLzEuMSAyMDAgT0sKK0RhdGU6IFdlZCwgMDIgSmFuIDIwMDggMDM6MDM6NTQgR01UCitTZXJ2ZXI6IEFwYWNoZS8xLjMuMzMgKERlYmlhbiBHTlUvTGludXgpIG1vZF9zc2wvMi44LjIyIE9wZW5TU0wvMC45LjdlCitDb25uZWN0aW9uOiBjbG9zZQorQ29udGVudC1MZW5ndGg6IDEwMAorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMQorCitGRgorJycnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh1cmxsaWIuQ29udGVudFRvb1Nob3J0RXJyb3IsIHVybGxpYi51cmxyZXRyaWV2ZSwgJ2h0dHA6Ly9leGFtcGxlLmNvbS8nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi51bmZha2VodHRwKCkKKworY2xhc3MgUXVvdGluZ1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgdXJsbGliLnF1b3RlKCkgYW5kIHVybGxpYi5xdW90ZV9wbHVzKCkKKworICAgIEFjY29yZGluZyB0byBSRkMgMjM5NiAoIlVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMpLCB0byBlc2NhcGUgYQorICAgIGNoYXJhY3RlciB5b3Ugd3JpdGUgaXQgYXMgJyUnICsgPDIgY2hhcmFjdGVyIFVTLUFTQ0lJIGhleCB2YWx1ZT4uICBUaGUgUHl0aG9uCisgICAgY29kZSBvZiBgYCclJyArIGhleChvcmQoPGNoYXJhY3Rlcj4pKVsyOl1gYCBlc2NhcGVzIGEgY2hhcmFjdGVyIHByb3Blcmx5LgorICAgIENhc2UgZG9lcyBub3QgbWF0dGVyIG9uIHRoZSBoZXggbGV0dGVycy4KKworICAgIFRoZSB2YXJpb3VzIGNoYXJhY3RlciBzZXRzIHNwZWNpZmllZCBhcmU6CisKKyAgICBSZXNlcnZlZCBjaGFyYWN0ZXJzIDogIjsvPzpAJj0rJCwiCisgICAgICAgIEhhdmUgc3BlY2lhbCBtZWFuaW5nIGluIFVSSXMgYW5kIG11c3QgYmUgZXNjYXBlZCBpZiBub3QgYmVpbmcgdXNlZCBmb3IKKyAgICAgICAgdGhlaXIgc3BlY2lhbCBtZWFuaW5nCisgICAgRGF0YSBjaGFyYWN0ZXJzIDogbGV0dGVycywgZGlnaXRzLCBhbmQgIi1fLiF+KicoKSIKKyAgICAgICAgVW5yZXNlcnZlZCBhbmQgZG8gbm90IG5lZWQgdG8gYmUgZXNjYXBlZDsgY2FuIGJlLCB0aG91Z2gsIGlmIGRlc2lyZWQKKyAgICBDb250cm9sIGNoYXJhY3RlcnMgOiAweDAwIC0gMHgxRiwgMHg3RgorICAgICAgICBIYXZlIG5vIHVzZSBpbiBVUklzIHNvIG11c3QgYmUgZXNjYXBlZAorICAgIHNwYWNlIDogMHgyMAorICAgICAgICBNdXN0IGJlIGVzY2FwZWQKKyAgICBEZWxpbWl0ZXJzIDogJzw+IyUiJworICAgICAgICBNdXN0IGJlIGVzY2FwZWQKKyAgICBVbndpc2UgOiAie318XF5bXWAiCisgICAgICAgIE11c3QgYmUgZXNjYXBlZAorCisgICAgIiIiCisKKyAgICBkZWYgdGVzdF9uZXZlcl9xdW90ZShzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgcXVvdGUoKSBkb2VzIG5vdCBxdW90ZSBsZXR0ZXJzLCBkaWdpdHMsIGFuZCAiXywuLSIKKyAgICAgICAgZG9fbm90X3F1b3RlID0gJycgLmpvaW4oWyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAxMjM0NTY3ODkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl8uLSJdKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIucXVvdGUoZG9fbm90X3F1b3RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvX25vdF9xdW90ZSwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBxdW90ZSgpOiAlcyAhPSAlcyIgJSAoZG9fbm90X3F1b3RlLCByZXN1bHQpKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIucXVvdGVfcGx1cyhkb19ub3RfcXVvdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZG9fbm90X3F1b3RlLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgcXVvdGVfcGx1cygpOiAlcyAhPSAlcyIgJSAoZG9fbm90X3F1b3RlLCByZXN1bHQpKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9zYWZlKHNlbGYpOgorICAgICAgICAjIFRlc3QgJy8nIGlzIGRlZmF1bHQgdmFsdWUgZm9yICdzYWZlJyBwYXJhbWV0ZXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxsaWIucXVvdGUuZnVuY19kZWZhdWx0c1swXSwgJy8nKQorCisgICAgZGVmIHRlc3Rfc2FmZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHNldHRpbmcgJ3NhZmUnIHBhcmFtZXRlciBkb2VzIHdoYXQgaXQgc2hvdWxkIGRvCisgICAgICAgIHF1b3RlX2J5X2RlZmF1bHQgPSAiPD4iCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi5xdW90ZShxdW90ZV9ieV9kZWZhdWx0LCBzYWZlPXF1b3RlX2J5X2RlZmF1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVvdGVfYnlfZGVmYXVsdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBxdW90ZSgpOiAlcyAhPSAlcyIgJSAocXVvdGVfYnlfZGVmYXVsdCwgcmVzdWx0KSkKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnF1b3RlX3BsdXMocXVvdGVfYnlfZGVmYXVsdCwgc2FmZT1xdW90ZV9ieV9kZWZhdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1b3RlX2J5X2RlZmF1bHQsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgcXVvdGVfcGx1cygpOiAlcyAhPSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChxdW90ZV9ieV9kZWZhdWx0LCByZXN1bHQpKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9xdW90aW5nKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBhbGwgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBiZSBxdW90ZWQgYXJlIGJ5IGRlZmF1bHQgc2FucworICAgICAgICAjIHNwYWNlIChzZXBhcmF0ZSB0ZXN0IGZvciB0aGF0KS4KKyAgICAgICAgc2hvdWxkX3F1b3RlID0gW2NocihudW0pIGZvciBudW0gaW4gcmFuZ2UoMzIpXSAjIEZvciAweDAwIC0gMHgxRgorICAgICAgICBzaG91bGRfcXVvdGUuYXBwZW5kKCc8PiMlInt9fFxeW11gJykKKyAgICAgICAgc2hvdWxkX3F1b3RlLmFwcGVuZChjaHIoMTI3KSkgIyBGb3IgMHg3RgorICAgICAgICBzaG91bGRfcXVvdGUgPSAnJy5qb2luKHNob3VsZF9xdW90ZSkKKyAgICAgICAgZm9yIGNoYXIgaW4gc2hvdWxkX3F1b3RlOgorICAgICAgICAgICAgcmVzdWx0ID0gdXJsbGliLnF1b3RlKGNoYXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleGVzY2FwZShjaGFyKSwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgcXVvdGUoKTogJXMgc2hvdWxkIGJlIGVzY2FwZWQgdG8gJXMsIG5vdCAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciwgaGV4ZXNjYXBlKGNoYXIpLCByZXN1bHQpKQorICAgICAgICAgICAgcmVzdWx0ID0gdXJsbGliLnF1b3RlX3BsdXMoY2hhcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4ZXNjYXBlKGNoYXIpLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBxdW90ZV9wbHVzKCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIHNob3VsZCBiZSBlc2NhcGVzIHRvICVzLCBub3QgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIsIGhleGVzY2FwZShjaGFyKSwgcmVzdWx0KSkKKyAgICAgICAgZGVsIHNob3VsZF9xdW90ZQorICAgICAgICBwYXJ0aWFsX3F1b3RlID0gImFiW11jZCIKKyAgICAgICAgZXhwZWN0ZWQgPSAiYWIlNUIlNURjZCIKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnF1b3RlKHBhcnRpYWxfcXVvdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgcXVvdGUoKTogJXMgIT0gJXMiICUgKGV4cGVjdGVkLCByZXN1bHQpKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIucXVvdGVfcGx1cyhwYXJ0aWFsX3F1b3RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHF1b3RlX3BsdXMoKTogJXMgIT0gJXMiICUgKGV4cGVjdGVkLCByZXN1bHQpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHVybGxpYi5xdW90ZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3F1b3Rpbmdfc3BhY2Uoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHF1b3RlKCkgYW5kIHF1b3RlX3BsdXMoKSBoYW5kbGUgc3BhY2VzIGFzIHNwZWNpZmllZCBpbgorICAgICAgICAjIHRoZWlyIHVuaXF1ZSB3YXkKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnF1b3RlKCcgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGhleGVzY2FwZSgnICcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBxdW90ZSgpOiAlcyAhPSAlcyIgJSAocmVzdWx0LCBoZXhlc2NhcGUoJyAnKSkpCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi5xdW90ZV9wbHVzKCcgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsICcrJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgcXVvdGVfcGx1cygpOiAlcyAhPSArIiAlIHJlc3VsdCkKKyAgICAgICAgZ2l2ZW4gPSAiYSBiIGNkIGUgZiIKKyAgICAgICAgZXhwZWN0ID0gZ2l2ZW4ucmVwbGFjZSgnICcsIGhleGVzY2FwZSgnICcpKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIucXVvdGUoZ2l2ZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHF1b3RlKCk6ICVzICE9ICVzIiAlIChleHBlY3QsIHJlc3VsdCkpCisgICAgICAgIGV4cGVjdCA9IGdpdmVuLnJlcGxhY2UoJyAnLCAnKycpCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi5xdW90ZV9wbHVzKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBxdW90ZV9wbHVzKCk6ICVzICE9ICVzIiAlIChleHBlY3QsIHJlc3VsdCkpCisKKyAgICBkZWYgdGVzdF9xdW90aW5nX3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJsbGliLnF1b3RlX3BsdXMoJ2FscGhhK2JldGEgZ2FtbWEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYWxwaGElMkJiZXRhK2dhbW1hJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxsaWIucXVvdGVfcGx1cygnYWxwaGErYmV0YSBnYW1tYScsICcrJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FscGhhK2JldGErZ2FtbWEnKQorCitjbGFzcyBVbnF1b3RpbmdUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIHVucXVvdGUoKSBhbmQgdW5xdW90ZV9wbHVzKCkKKworICAgIFNlZSB0aGUgZG9jIHN0cmluZyBmb3IgcXVvdGluZ19UZXN0cyBmb3IgZGV0YWlscyBvbiBxdW90aW5nIGFuZCBzdWNoLgorCisgICAgIiIiCisKKyAgICBkZWYgdGVzdF91bnF1b3Rpbmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHVucXVvdGluZyBvZiBhbGwgQVNDSUkgdmFsdWVzIHdvcmtzCisgICAgICAgIGVzY2FwZV9saXN0ID0gW10KKyAgICAgICAgZm9yIG51bSBpbiByYW5nZSgxMjgpOgorICAgICAgICAgICAgZ2l2ZW4gPSBoZXhlc2NhcGUoY2hyKG51bSkpCisgICAgICAgICAgICBleHBlY3QgPSBjaHIobnVtKQorICAgICAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVucXVvdGUoZ2l2ZW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgdW5xdW90ZSgpOiAlcyAhPSAlcyIgJSAoZXhwZWN0LCByZXN1bHQpKQorICAgICAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVucXVvdGVfcGx1cyhnaXZlbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyB1bnF1b3RlX3BsdXMoKTogJXMgIT0gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGVjdCwgcmVzdWx0KSkKKyAgICAgICAgICAgIGVzY2FwZV9saXN0LmFwcGVuZChnaXZlbikKKyAgICAgICAgZXNjYXBlX3N0cmluZyA9ICcnLmpvaW4oZXNjYXBlX2xpc3QpCisgICAgICAgIGRlbCBlc2NhcGVfbGlzdAorICAgICAgICByZXN1bHQgPSB1cmxsaWIudW5xdW90ZShlc2NhcGVfc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5jb3VudCgnJScpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBxdW90ZSgpOiBub3QgYWxsIGNoYXJhY3RlcnMgZXNjYXBlZDsgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi51bnF1b3RlKGVzY2FwZV9zdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvdW50KCclJyksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHVucXVvdGUoKTogbm90IGFsbCBjaGFyYWN0ZXJzIGVzY2FwZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMiICUgcmVzdWx0KQorCisgICAgZGVmIHRlc3RfdW5xdW90aW5nX2JhZHBlcmNlbnQoc2VsZik6CisgICAgICAgICMgVGVzdCB1bnF1b3Rpbmcgb24gYmFkIHBlcmNlbnQtZXNjYXBlcworICAgICAgICBnaXZlbiA9ICcleGFiJworICAgICAgICBleHBlY3QgPSBnaXZlbgorICAgICAgICByZXN1bHQgPSB1cmxsaWIudW5xdW90ZShnaXZlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCwgInVzaW5nIHVucXVvdGUoKTogJXIgIT0gJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZXhwZWN0LCByZXN1bHQpKQorICAgICAgICBnaXZlbiA9ICcleCcKKyAgICAgICAgZXhwZWN0ID0gZ2l2ZW4KKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVucXVvdGUoZ2l2ZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQsICJ1c2luZyB1bnF1b3RlKCk6ICVyICE9ICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICUgKGV4cGVjdCwgcmVzdWx0KSkKKyAgICAgICAgZ2l2ZW4gPSAnJScKKyAgICAgICAgZXhwZWN0ID0gZ2l2ZW4KKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVucXVvdGUoZ2l2ZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQsICJ1c2luZyB1bnF1b3RlKCk6ICVyICE9ICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICUgKGV4cGVjdCwgcmVzdWx0KSkKKworICAgIGRlZiB0ZXN0X3VucXVvdGluZ19taXhlZF9jYXNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgdW5xdW90aW5nIG9uIG1peGVkLWNhc2UgaGV4IGRpZ2l0cyBpbiB0aGUgcGVyY2VudC1lc2NhcGVzCisgICAgICAgIGdpdmVuID0gJyVBYiVlQScKKyAgICAgICAgZXhwZWN0ID0gJ1x4YWJceGVhJworICAgICAgICByZXN1bHQgPSB1cmxsaWIudW5xdW90ZShnaXZlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCwgInVzaW5nIHVucXVvdGUoKTogJXIgIT0gJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZXhwZWN0LCByZXN1bHQpKQorCisgICAgZGVmIHRlc3RfdW5xdW90aW5nX3BhcnRzKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB1bnF1b3Rpbmcgd29ya3Mgd2hlbiBoYXZlIG5vbi1xdW90ZWQgY2hhcmFjdGVycworICAgICAgICAjIGludGVyc3BlcnNlZAorICAgICAgICBnaXZlbiA9ICdhYiVzZCcgJSBoZXhlc2NhcGUoJ2MnKQorICAgICAgICBleHBlY3QgPSAiYWJjZCIKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVucXVvdGUoZ2l2ZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHF1b3RlKCk6ICVzICE9ICVzIiAlIChleHBlY3QsIHJlc3VsdCkpCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi51bnF1b3RlX3BsdXMoZ2l2ZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHVucXVvdGVfcGx1cygpOiAlcyAhPSAlcyIgJSAoZXhwZWN0LCByZXN1bHQpKQorCisgICAgZGVmIHRlc3RfdW5xdW90aW5nX3BsdXMoc2VsZik6CisgICAgICAgICMgVGVzdCBkaWZmZXJlbmNlIGJldHdlZW4gdW5xdW90ZSgpIGFuZCB1bnF1b3RlX3BsdXMoKQorICAgICAgICBnaXZlbiA9ICJhcmUrdGhlcmUrc3BhY2VzLi4uIgorICAgICAgICBleHBlY3QgPSBnaXZlbgorICAgICAgICByZXN1bHQgPSB1cmxsaWIudW5xdW90ZShnaXZlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgdW5xdW90ZSgpOiAlcyAhPSAlcyIgJSAoZXhwZWN0LCByZXN1bHQpKQorICAgICAgICBleHBlY3QgPSBnaXZlbi5yZXBsYWNlKCcrJywgJyAnKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIudW5xdW90ZV9wbHVzKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyB1bnF1b3RlX3BsdXMoKTogJXMgIT0gJXMiICUgKGV4cGVjdCwgcmVzdWx0KSkKKworICAgIGRlZiB0ZXN0X3VucXVvdGVfd2l0aF91bmljb2RlKHNlbGYpOgorICAgICAgICByID0gdXJsbGliLnVucXVvdGUodSdiciVDMyVCQ2NrbmVyX3NhcHBvcm9fMjAwNTA5MzAuZG9jJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB1J2JyXHhjM1x4YmNja25lcl9zYXBwb3JvXzIwMDUwOTMwLmRvYycpCisKK2NsYXNzIHVybGVuY29kZV9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIHVybGVuY29kZSgpIiIiCisKKyAgICBkZWYgaGVscF9pbnB1dHR5cGUoc2VsZiwgZ2l2ZW4sIHRlc3RfdHlwZSk6CisgICAgICAgICIiIkhlbHBlciBtZXRob2QgZm9yIHRlc3RpbmcgZGlmZmVyZW50IGlucHV0IHR5cGVzLgorCisgICAgICAgICdnaXZlbicgbXVzdCBsZWFkIHRvIG9ubHkgdGhlIHBhaXJzOgorICAgICAgICAgICAgKiAxc3QsIDEKKyAgICAgICAgICAgICogMm5kLCAyCisgICAgICAgICAgICAqIDNyZCwgMworCisgICAgICAgIFRlc3QgY2Fubm90IGFzc3VtZSBhbnl0aGluZyBhYm91dCBvcmRlci4gIERvY3MgbWFrZSBubyBndWFyYW50ZWUgYW5kCisgICAgICAgIGhhdmUgcG9zc2libGUgZGljdGlvbmFyeSBpbnB1dC4KKworICAgICAgICAiIiIKKyAgICAgICAgZXhwZWN0X3NvbWV3aGVyZSA9IFsiMXN0PTEiLCAiMm5kPTIiLCAiM3JkPTMiXQorICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJsZW5jb2RlKGdpdmVuKQorICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gZXhwZWN0X3NvbWV3aGVyZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZXhwZWN0ZWQsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdGluZyAlczogJXMgbm90IGZvdW5kIGluICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RfdHlwZSwgZXhwZWN0ZWQsIHJlc3VsdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvdW50KCcmJyksIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RpbmcgJXM6IGV4cGVjdGVkIDIgJyYnczsgZ290ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RfdHlwZSwgcmVzdWx0LmNvdW50KCcmJykpKQorICAgICAgICBhbXBfbG9jYXRpb24gPSByZXN1bHQuaW5kZXgoJyYnKQorICAgICAgICBvbl9hbXBfbGVmdCA9IHJlc3VsdFthbXBfbG9jYXRpb24gLSAxXQorICAgICAgICBvbl9hbXBfcmlnaHQgPSByZXN1bHRbYW1wX2xvY2F0aW9uICsgMV0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9uX2FtcF9sZWZ0LmlzZGlnaXQoKSBhbmQgb25fYW1wX3JpZ2h0LmlzZGlnaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJ0ZXN0aW5nICVzOiAnJicgbm90IGxvY2F0ZWQgaW4gcHJvcGVyIHBsYWNlIGluICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAodGVzdF90eXBlLCByZXN1bHQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQpLCAoNSAqIDMpICsgMiwgIzUgY2hhcnMgcGVyIHRoaW5nIGFuZCBhbXBzCisgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RpbmcgJXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBudW1iZXIgb2YgY2hhcmFjdGVyczogJXMgIT0gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAodGVzdF90eXBlLCBsZW4ocmVzdWx0KSwgKDUgKiAzKSArIDIpKQorCisgICAgZGVmIHRlc3RfdXNpbmdfbWFwcGluZyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHBhc3NpbmcgaW4gYSBtYXBwaW5nIG9iamVjdCBhcyBhbiBhcmd1bWVudC4KKyAgICAgICAgc2VsZi5oZWxwX2lucHV0dHlwZSh7IjFzdCI6JzEnLCAiMm5kIjonMicsICIzcmQiOiczJ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIGRpY3QgYXMgaW5wdXQgdHlwZSIpCisKKyAgICBkZWYgdGVzdF91c2luZ19zZXF1ZW5jZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHBhc3NpbmcgaW4gYSBzZXF1ZW5jZSBvZiB0d28taXRlbSBzZXF1ZW5jZXMgYXMgYW4gYXJndW1lbnQuCisgICAgICAgIHNlbGYuaGVscF9pbnB1dHR5cGUoWygnMXN0JywgJzEnKSwgKCcybmQnLCAnMicpLCAoJzNyZCcsICczJyldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBzZXF1ZW5jZSBvZiB0d28taXRlbSB0dXBsZXMgYXMgaW5wdXQiKQorCisgICAgZGVmIHRlc3RfcXVvdGluZyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUga2V5cyBhbmQgdmFsdWVzIGFyZSBxdW90ZWQgdXNpbmcgcXVvdGVfcGx1cygpCisgICAgICAgIGdpdmVuID0geyImIjoiPSJ9CisgICAgICAgIGV4cGVjdCA9ICIlcz0lcyIgJSAoaGV4ZXNjYXBlKCcmJyksIGhleGVzY2FwZSgnPScpKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJsZW5jb2RlKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0KQorICAgICAgICBnaXZlbiA9IHsia2V5IG5hbWUiOiJBIGJ1bmNoIG9mIHBsdXNlcyJ9CisgICAgICAgIGV4cGVjdCA9ICJrZXkrbmFtZT1BK2J1bmNoK29mK3BsdXNlcyIKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybGVuY29kZShnaXZlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X2Rvc2VxKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBwYXNzaW5nIFRydWUgZm9yICdkb3NlcScgcGFyYW1ldGVyIHdvcmtzIGNvcnJlY3RseQorICAgICAgICBnaXZlbiA9IHsnc2VxdWVuY2UnOlsnMScsICcyJywgJzMnXX0KKyAgICAgICAgZXhwZWN0ID0gInNlcXVlbmNlPSVzIiAlIHVybGxpYi5xdW90ZV9wbHVzKHN0cihbJzEnLCAnMicsICczJ10pKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJsZW5jb2RlKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0KQorICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJsZW5jb2RlKGdpdmVuLCBUcnVlKQorICAgICAgICBmb3IgdmFsdWUgaW4gZ2l2ZW5bInNlcXVlbmNlIl06CisgICAgICAgICAgICBleHBlY3QgPSAic2VxdWVuY2U9JXMiICUgdmFsdWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZXhwZWN0LCByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvdW50KCcmJyksIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIDIgJyYncywgZ290ICVzIiAlIHJlc3VsdC5jb3VudCgnJicpKQorCitjbGFzcyBQYXRobmFtZV9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBwYXRobmFtZTJ1cmwoKSBhbmQgdXJsMnBhdGhuYW1lKCkiIiIKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBzaW1wbGUgdGVzdHMgcGFzcworICAgICAgICBleHBlY3RlZF9wYXRoID0gb3MucGF0aC5qb2luKCJwYXJ0cyIsICJvZiIsICJhIiwgInBhdGgiKQorICAgICAgICBleHBlY3RlZF91cmwgPSAicGFydHMvb2YvYS9wYXRoIgorICAgICAgICByZXN1bHQgPSB1cmxsaWIucGF0aG5hbWUydXJsKGV4cGVjdGVkX3BhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdXJsLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGhuYW1lMnVybCgpIGZhaWxlZDsgJXMgIT0gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0LCBleHBlY3RlZF91cmwpKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJsMnBhdGhuYW1lKGV4cGVjdGVkX3VybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9wYXRoLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVybDJwYXRoYW1lKCkgZmFpbGVkOyAlcyAhPSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQsIGV4cGVjdGVkX3BhdGgpKQorCisgICAgZGVmIHRlc3RfcXVvdGluZyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGF1dG9tYXRpYyBxdW90aW5nIGFuZCB1bnF1b3Rpbmcgd29ya3MgZm9yIHBhdGhuYW0ydXJsKCkgYW5kCisgICAgICAgICMgdXJsMnBhdGhuYW1lKCkgcmVzcGVjdGl2ZWx5CisgICAgICAgIGdpdmVuID0gb3MucGF0aC5qb2luKCJuZWVkcyIsICJxdW90PWluZyIsICJoZXJlIikKKyAgICAgICAgZXhwZWN0ID0gIm5lZWRzLyVzL2hlcmUiICUgdXJsbGliLnF1b3RlKCJxdW90PWluZyIpCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi5wYXRobmFtZTJ1cmwoZ2l2ZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInBhdGhuYW1lMnVybCgpIGZhaWxlZDsgJXMgIT0gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0LCByZXN1bHQpKQorICAgICAgICBleHBlY3QgPSBnaXZlbgorICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJsMnBhdGhuYW1lKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidXJsMnBhdGhuYW1lKCkgZmFpbGVkOyAlcyAhPSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChleHBlY3QsIHJlc3VsdCkpCisgICAgICAgIGdpdmVuID0gb3MucGF0aC5qb2luKCJtYWtlIHN1cmUiLCAidXNpbmdfcXVvdGUiKQorICAgICAgICBleHBlY3QgPSAiJXMvdXNpbmdfcXVvdGUiICUgdXJsbGliLnF1b3RlKCJtYWtlIHN1cmUiKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIucGF0aG5hbWUydXJsKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRobmFtZTJ1cmwoKSBmYWlsZWQ7ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGVjdCwgcmVzdWx0KSkKKyAgICAgICAgZ2l2ZW4gPSAibWFrZStzdXJlL3VzaW5nX3VucXVvdGUiCisgICAgICAgIGV4cGVjdCA9IG9zLnBhdGguam9pbigibWFrZStzdXJlIiwgInVzaW5nX3VucXVvdGUiKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJsMnBhdGhuYW1lKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmwycGF0aG5hbWUoKSBmYWlsZWQ7ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGVjdCwgcmVzdWx0KSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IHNwZWNpZmljIHRvIHRoZSBudHVybDJwYXRoIGxpYnJhcnknKQorICAgIGRlZiB0ZXN0X250cGF0aChzZWxmKToKKyAgICAgICAgZ2l2ZW4gPSAoJy9DOi8nLCAnLy8vQzovJywgJy9DfC8vJykKKyAgICAgICAgZXhwZWN0ID0gJ0M6XFwnCisgICAgICAgIGZvciB1cmwgaW4gZ2l2ZW46CisgICAgICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJsMnBhdGhuYW1lKHVybCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdudHVybDJwYXRoLnVybDJwYXRobmFtZSgpIGZhaWxlZDsgJXMgIT0gJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGVjdCwgcmVzdWx0KSkKKyAgICAgICAgZ2l2ZW4gPSAnLy8vQ3wvcGF0aCcKKyAgICAgICAgZXhwZWN0ID0gJ0M6XFxwYXRoJworICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJsMnBhdGhuYW1lKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICdudHVybDJwYXRoLnVybDJwYXRobmFtZSgpIGZhaWxlZDsgJXMgIT0gJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0LCByZXN1bHQpKQorCitjbGFzcyBVdGlsaXR5X1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0Y2FzZSB0byB0ZXN0IHRoZSB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGluIHRoZSB1cmxsaWIuIiIiCisKKyAgICBkZWYgdGVzdF9zcGxpdHBhc3N3ZChzZWxmKToKKyAgICAgICAgIiIiU29tZSBvZiB0aGUgcGFzc3dvcmQgZXhhbXBsZXMgYXJlIG5vdCBzZW5zaWJsZSwgYnV0IGl0IGlzIGFkZGVkIHRvCisgICAgICAgIGNvbmZpcm1pbmcgdG8gUkZDMjYxNyBhbmQgYWRkcmVzc2luZyBpc3N1ZTQ2NzUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgndXNlcicsICdhYicpLHVybGxpYi5zcGxpdHBhc3N3ZCgndXNlcjphYicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgndXNlcicsICdhXG5iJyksdXJsbGliLnNwbGl0cGFzc3dkKCd1c2VyOmFcbmInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ3VzZXInLCAnYVx0YicpLHVybGxpYi5zcGxpdHBhc3N3ZCgndXNlcjphXHRiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyJywgJ2FccmInKSx1cmxsaWIuc3BsaXRwYXNzd2QoJ3VzZXI6YVxyYicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgndXNlcicsICdhXGZiJyksdXJsbGliLnNwbGl0cGFzc3dkKCd1c2VyOmFcZmInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ3VzZXInLCAnYVx2YicpLHVybGxpYi5zcGxpdHBhc3N3ZCgndXNlcjphXHZiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyJywgJ2E6YicpLHVybGxpYi5zcGxpdHBhc3N3ZCgndXNlcjphOmInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ3VzZXInLCAnYSBiJyksdXJsbGliLnNwbGl0cGFzc3dkKCd1c2VyOmEgYicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgndXNlciAyJywgJ2FiJyksdXJsbGliLnNwbGl0cGFzc3dkKCd1c2VyIDI6YWInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ3VzZXIrMScsICdhK2InKSx1cmxsaWIuc3BsaXRwYXNzd2QoJ3VzZXIrMTphK2InKSkKKworCitjbGFzcyBVUkxvcGVuZXJfVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RjYXNlIHRvIHRlc3QgdGhlIG9wZW4gbWV0aG9kIG9mIFVSTG9wZW5lciBjbGFzcy4iIiIKKworICAgIGRlZiB0ZXN0X3F1b3RlZF9vcGVuKHNlbGYpOgorICAgICAgICBjbGFzcyBEdW1teVVSTG9wZW5lcih1cmxsaWIuVVJMb3BlbmVyKToKKyAgICAgICAgICAgIGRlZiBvcGVuX3NwYW0oc2VsZiwgdXJsKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdXJsCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEdW1teVVSTG9wZW5lcigpLm9wZW4oCisgICAgICAgICAgICAnc3BhbTovL2V4YW1wbGUvIC8nKSwnLy9leGFtcGxlLyUyMC8nKQorCisgICAgICAgICMgdGVzdCB0aGUgc2FmZSBjaGFyYWN0ZXJzIGFyZSBub3QgcXVvdGVkIGJ5IHVybG9wZW4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEdW1teVVSTG9wZW5lcigpLm9wZW4oCisgICAgICAgICAgICAic3BhbTovL2M6fHdpbmRvd3MlLzo9Jj9+IyshJCw7J0AoKSpbXXwvcGF0aC8iKSwKKyAgICAgICAgICAgICIvL2M6fHdpbmRvd3MlLzo9Jj9+IyshJCw7J0AoKSpbXXwvcGF0aC8iKQorCisKKyMgSnVzdCBjb21tZW50ZWQgdGhlbSBvdXQuCisjIENhbid0IHJlYWxseSB0ZWxsIHdoeSBrZWVwIGZhaWxpbmcgaW4gd2luZG93cyBhbmQgc3BhcmMuCisjIEV2ZXJ5d2hlcmUgZWxzZSB0aGV5IHdvcmsgb2ssIGJ1dCBvbiB0aG9zZSBtYWNoaW5lcywgc29tZXRpbWVzCisjIGZhaWwgaW4gb25lIG9mIHRoZSB0ZXN0cywgc29tZXRpbWVzIGluIG90aGVyLiBJIGhhdmUgYSBsaW51eCwgYW5kCisjIHRoZSB0ZXN0cyBnbyBvay4KKyMgSWYgYW55Ym9keSBoYXMgb25lIG9mIHRoZSBwcm9ibGVtYXRpYyBlbnZpcm9tZW50cywgcGxlYXNlIGhlbHAhCisjIC4gICBGYWN1bmRvCisjCisjIGRlZiBzZXJ2ZXIoZXZ0KToKKyMgICAgIGltcG9ydCBzb2NrZXQsIHRpbWUKKyMgICAgIHNlcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisjICAgICBzZXJ2LnNldHRpbWVvdXQoMykKKyMgICAgIHNlcnYuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyMgICAgIHNlcnYuYmluZCgoIiIsIDkwOTMpKQorIyAgICAgc2Vydi5saXN0ZW4oNSkKKyMgICAgIHRyeToKKyMgICAgICAgICBjb25uLCBhZGRyID0gc2Vydi5hY2NlcHQoKQorIyAgICAgICAgIGNvbm4uc2VuZCgiMSBIb2xhIG11bmRvXG4iKQorIyAgICAgICAgIGNhbnRkYXRhID0gMAorIyAgICAgICAgIHdoaWxlIGNhbnRkYXRhIDwgMTM6CisjICAgICAgICAgICAgIGRhdGEgPSBjb25uLnJlY3YoMTMtY2FudGRhdGEpCisjICAgICAgICAgICAgIGNhbnRkYXRhICs9IGxlbihkYXRhKQorIyAgICAgICAgICAgICB0aW1lLnNsZWVwKC4zKQorIyAgICAgICAgIGNvbm4uc2VuZCgiMiBObyBtb3JlIGxpbmVzXG4iKQorIyAgICAgICAgIGNvbm4uY2xvc2UoKQorIyAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorIyAgICAgICAgIHBhc3MKKyMgICAgIGZpbmFsbHk6CisjICAgICAgICAgc2Vydi5jbG9zZSgpCisjICAgICAgICAgZXZ0LnNldCgpCisjCisjIGNsYXNzIEZUUFdyYXBwZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisjCisjICAgICBkZWYgc2V0VXAoc2VsZik6CisjICAgICAgICAgaW1wb3J0IGZ0cGxpYiwgdGltZSwgdGhyZWFkaW5nCisjICAgICAgICAgZnRwbGliLkZUUC5wb3J0ID0gOTA5MworIyAgICAgICAgIHNlbGYuZXZ0ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyMgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZXJ2ZXIsIGFyZ3M9KHNlbGYuZXZ0LCkpLnN0YXJ0KCkKKyMgICAgICAgICB0aW1lLnNsZWVwKC4xKQorIworIyAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorIyAgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorIworIyAgICAgZGVmIHRlc3RCYXNpYyhzZWxmKToKKyMgICAgICAgICAjIGNvbm5lY3RzCisjICAgICAgICAgZnRwID0gdXJsbGliLmZ0cHdyYXBwZXIoIm15dXNlciIsICJteXBhc3MiLCAibG9jYWxob3N0IiwgOTA5MywgW10pCisjICAgICAgICAgZnRwLmNsb3NlKCkKKyMKKyMgICAgIGRlZiB0ZXN0VGltZW91dE5vbmUoc2VsZik6CisjICAgICAgICAgIyBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IGlzIGlnbm9yZWQKKyMgICAgICAgICBpbXBvcnQgc29ja2V0CisjICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisjICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQorIyAgICAgICAgIHRyeToKKyMgICAgICAgICAgICAgZnRwID0gdXJsbGliLmZ0cHdyYXBwZXIoIm15dXNlciIsICJteXBhc3MiLCAibG9jYWxob3N0IiwgOTA5MywgW10pCisjICAgICAgICAgZmluYWxseToKKyMgICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisjICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdHAuZnRwLnNvY2suZ2V0dGltZW91dCgpLCAzMCkKKyMgICAgICAgICBmdHAuY2xvc2UoKQorIworIyAgICAgZGVmIHRlc3RUaW1lb3V0RGVmYXVsdChzZWxmKToKKyMgICAgICAgICAjIGdsb2JhbCBkZWZhdWx0IHRpbWVvdXQgaXMgdXNlZAorIyAgICAgICAgIGltcG9ydCBzb2NrZXQKKyMgICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyMgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCisjICAgICAgICAgdHJ5OgorIyAgICAgICAgICAgICBmdHAgPSB1cmxsaWIuZnRwd3JhcHBlcigibXl1c2VyIiwgIm15cGFzcyIsICJsb2NhbGhvc3QiLCA5MDkzLCBbXSkKKyMgICAgICAgICBmaW5hbGx5OgorIyAgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKyMgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ0cC5mdHAuc29jay5nZXR0aW1lb3V0KCksIDMwKQorIyAgICAgICAgIGZ0cC5jbG9zZSgpCisjCisjICAgICBkZWYgdGVzdFRpbWVvdXRWYWx1ZShzZWxmKToKKyMgICAgICAgICBmdHAgPSB1cmxsaWIuZnRwd3JhcHBlcigibXl1c2VyIiwgIm15cGFzcyIsICJsb2NhbGhvc3QiLCA5MDkzLCBbXSwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PTMwKQorIyAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnRwLmZ0cC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisjICAgICAgICAgZnRwLmNsb3NlKCkKKworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBpbXBvcnQgd2FybmluZ3MKKyAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnLCAiLip1cmxsaWJcLnVybG9wZW4uKlB5dGhvbiAzLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgICAgICB1cmxvcGVuX0ZpbGVUZXN0cywKKyAgICAgICAgICAgIHVybG9wZW5fSHR0cFRlc3RzLAorICAgICAgICAgICAgdXJscmV0cmlldmVfRmlsZVRlc3RzLAorICAgICAgICAgICAgdXJscmV0cmlldmVfSHR0cFRlc3RzLAorICAgICAgICAgICAgUHJveHlUZXN0cywKKyAgICAgICAgICAgIFF1b3RpbmdUZXN0cywKKyAgICAgICAgICAgIFVucXVvdGluZ1Rlc3RzLAorICAgICAgICAgICAgdXJsZW5jb2RlX1Rlc3RzLAorICAgICAgICAgICAgUGF0aG5hbWVfVGVzdHMsCisgICAgICAgICAgICBVdGlsaXR5X1Rlc3RzLAorICAgICAgICAgICAgVVJMb3BlbmVyX1Rlc3RzLAorICAgICAgICAgICAgI0ZUUFdyYXBwZXJUZXN0cywKKyAgICAgICAgKQorCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiYzMzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEyYjQwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFjOTk1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjIucHkKQEAgLTAsMCArMSwxMzc4IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2ltcG9ydCBvcworaW1wb3J0IHNvY2tldAoraW1wb3J0IFN0cmluZ0lPCisKK2ltcG9ydCB1cmxsaWIyCitmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QsIE9wZW5lckRpcmVjdG9yCisKKyMgWFhYCisjIFJlcXVlc3QKKyMgQ2FjaGVGVFBIYW5kbGVyIChoYXJkIHRvIHdyaXRlKQorIyBwYXJzZV9rZXF2X2xpc3QsIHBhcnNlX2h0dHBfbGlzdCwgSFRUUERpZ2VzdEF1dGhIYW5kbGVyCisKK2NsYXNzIFRyaXZpYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfdHJpdmlhbChzZWxmKToKKyAgICAgICAgIyBBIGNvdXBsZSB0cml2aWFsIHRlc3RzCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdXJsbGliMi51cmxvcGVuLCAnYm9ndXMgdXJsJykKKworICAgICAgICAjIFhYWCBOYW1lIGhhY2tpbmcgdG8gZ2V0IHRoaXMgdG8gd29yayBvbiBXaW5kb3dzLgorICAgICAgICBmbmFtZSA9IG9zLnBhdGguYWJzcGF0aCh1cmxsaWIyLl9fZmlsZV9fKS5yZXBsYWNlKCdcXCcsICcvJykKKworICAgICAgICAjIEFuZCBtb3JlIGhhY2tpbmcgdG8gZ2V0IGl0IHRvIHdvcmsgb24gTWFjT1MuIFRoaXMgYXNzdW1lcworICAgICAgICAjIHVybGxpYi5wYXRobmFtZTJ1cmwgd29ya3MsIHVuZm9ydHVuYXRlbHkuLi4KKyAgICAgICAgaWYgb3MubmFtZSA9PSAncmlzY29zJzoKKyAgICAgICAgICAgIGltcG9ydCBzdHJpbmcKKyAgICAgICAgICAgIGZuYW1lID0gb3MuZXhwYW5kKGZuYW1lKQorICAgICAgICAgICAgZm5hbWUgPSBmbmFtZS50cmFuc2xhdGUoc3RyaW5nLm1ha2V0cmFucygiLy4iLCAiLi8iKSkKKworICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgICAgICAgICBmaWxlX3VybCA9ICJmaWxlOi8vLyVzIiAlIGZuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlX3VybCA9ICJmaWxlOi8vJXMiICUgZm5hbWUKKworICAgICAgICBmID0gdXJsbGliMi51cmxvcGVuKGZpbGVfdXJsKQorCisgICAgICAgIGJ1ZiA9IGYucmVhZCgpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfcGFyc2VfaHR0cF9saXN0KHNlbGYpOgorICAgICAgICB0ZXN0cyA9IFsoJ2EsYixjJywgWydhJywgJ2InLCAnYyddKSwKKyAgICAgICAgICAgICAgICAgKCdwYXRoIm8sbCJvZyJpImNhbCwgZXhhbXBsZScsIFsncGF0aCJvLGwib2ciaSJjYWwnLCAnZXhhbXBsZSddKSwKKyAgICAgICAgICAgICAgICAgKCdhLCBiLCAiYyIsICJkIiwgImUsZiIsIGcsIGgnLCBbJ2EnLCAnYicsICciYyInLCAnImQiJywgJyJlLGYiJywgJ2cnLCAnaCddKSwKKyAgICAgICAgICAgICAgICAgKCdhPSJiXFwiYyIsIGQ9ImVcXCxmIiwgZz0iaFxcXFxpIicsIFsnYT0iYiJjIicsICdkPSJlLGYiJywgJ2c9ImhcXGkiJ10pXQorICAgICAgICBmb3Igc3RyaW5nLCBsaXN0IGluIHRlc3RzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxsaWIyLnBhcnNlX2h0dHBfbGlzdChzdHJpbmcpLCBsaXN0KQorCisKK2RlZiB0ZXN0X3JlcXVlc3RfaGVhZGVyc19kaWN0KCk6CisgICAgIiIiCisgICAgVGhlIFJlcXVlc3QuaGVhZGVycyBkaWN0aW9uYXJ5IGlzIG5vdCBhIGRvY3VtZW50ZWQgaW50ZXJmYWNlLiAgSXQgc2hvdWxkCisgICAgc3RheSB0aGF0IHdheSwgYmVjYXVzZSB0aGUgY29tcGxldGUgc2V0IG9mIGhlYWRlcnMgYXJlIG9ubHkgYWNjZXNzaWJsZQorICAgIHRocm91Z2ggdGhlIC5nZXRfaGVhZGVyKCksIC5oYXNfaGVhZGVyKCksIC5oZWFkZXJfaXRlbXMoKSBpbnRlcmZhY2UuCisgICAgSG93ZXZlciwgLmhlYWRlcnMgcHJlLWRhdGVzIHRob3NlIG1ldGhvZHMsIGFuZCBzbyByZWFsIGNvZGUgd2lsbCBiZSB1c2luZworICAgIHRoZSBkaWN0aW9uYXJ5LgorCisgICAgVGhlIGludHJvZHVjdGlvbiBpbiAyLjQgb2YgdGhvc2UgbWV0aG9kcyB3YXMgYSBtaXN0YWtlIGZvciB0aGUgc2FtZSByZWFzb246CisgICAgY29kZSB0aGF0IHByZXZpb3VzbHkgc2F3IGFsbCAodXJsbGliMiB1c2VyKS1wcm92aWRlZCBoZWFkZXJzIGluIC5oZWFkZXJzCisgICAgbm93IHNlZXMgb25seSBhIHN1YnNldCAoYW5kIHRoZSBmdW5jdGlvbiBpbnRlcmZhY2UgaXMgdWdseSBhbmQgaW5jb21wbGV0ZSkuCisgICAgQSBiZXR0ZXIgY2hhbmdlIHdvdWxkIGhhdmUgYmVlbiB0byByZXBsYWNlIC5oZWFkZXJzIGRpY3Qgd2l0aCBhIGRpY3QKKyAgICBzdWJjbGFzcyAob3IgVXNlckRpY3QuRGljdE1peGluIGluc3RhbmNlPykgIHRoYXQgcHJlc2VydmVkIHRoZSAuaGVhZGVycworICAgIGludGVyZmFjZSBhbmQgYWxzbyBwcm92aWRlZCBhY2Nlc3MgdG8gdGhlICJ1bnJlZGlyZWN0ZWQiIGhlYWRlcnMuICBJdCdzCisgICAgcHJvYmFibHkgdG9vIGxhdGUgdG8gZml4IHRoYXQsIHRob3VnaC4KKworCisgICAgQ2hlY2sgLmNhcGl0YWxpemUoKSBjYXNlIG5vcm1hbGl6YXRpb246CisKKyAgICA+Pj4gdXJsID0gImh0dHA6Ly9leGFtcGxlLmNvbSIKKyAgICA+Pj4gUmVxdWVzdCh1cmwsIGhlYWRlcnM9eyJTcGFtLWVnZ3MiOiAiYmxhaCJ9KS5oZWFkZXJzWyJTcGFtLWVnZ3MiXQorICAgICdibGFoJworICAgID4+PiBSZXF1ZXN0KHVybCwgaGVhZGVycz17InNwYW0tRWdnUyI6ICJibGFoIn0pLmhlYWRlcnNbIlNwYW0tZWdncyJdCisgICAgJ2JsYWgnCisKKyAgICBDdXJyZW50bHksIFJlcXVlc3QodXJsLCAiU3BhbS1lZ2dzIikuaGVhZGVyc1siU3BhbS1FZ2dzIl0gcmFpc2VzIEtleUVycm9yLAorICAgIGJ1dCB0aGF0IGNvdWxkIGJlIGNoYW5nZWQgaW4gZnV0dXJlLgorCisgICAgIiIiCisKK2RlZiB0ZXN0X3JlcXVlc3RfaGVhZGVyc19tZXRob2RzKCk6CisgICAgIiIiCisgICAgTm90ZSB0aGUgY2FzZSBub3JtYWxpemF0aW9uIG9mIGhlYWRlciBuYW1lcyBoZXJlLCB0byAuY2FwaXRhbGl6ZSgpLWNhc2UuCisgICAgVGhpcyBzaG91bGQgYmUgcHJlc2VydmVkIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4gIChJbiB0aGUgSFRUUCBjYXNlLAorICAgIG5vcm1hbGl6YXRpb24gdG8gLnRpdGxlKCktY2FzZSBpcyBkb25lIGJ5IHVybGxpYjIgYmVmb3JlIHNlbmRpbmcgaGVhZGVycyB0bworICAgIGh0dHBsaWIpLgorCisgICAgPj4+IHVybCA9ICJodHRwOi8vZXhhbXBsZS5jb20iCisgICAgPj4+IHIgPSBSZXF1ZXN0KHVybCwgaGVhZGVycz17IlNwYW0tZWdncyI6ICJibGFoIn0pCisgICAgPj4+IHIuaGFzX2hlYWRlcigiU3BhbS1lZ2dzIikKKyAgICBUcnVlCisgICAgPj4+IHIuaGVhZGVyX2l0ZW1zKCkKKyAgICBbKCdTcGFtLWVnZ3MnLCAnYmxhaCcpXQorICAgID4+PiByLmFkZF9oZWFkZXIoIkZvby1CYXIiLCAiYmF6IikKKyAgICA+Pj4gaXRlbXMgPSByLmhlYWRlcl9pdGVtcygpCisgICAgPj4+IGl0ZW1zLnNvcnQoKQorICAgID4+PiBpdGVtcworICAgIFsoJ0Zvby1iYXInLCAnYmF6JyksICgnU3BhbS1lZ2dzJywgJ2JsYWgnKV0KKworICAgIE5vdGUgdGhhdCBlLmcuIHIuaGFzX2hlYWRlcigic3BhbS1FZ2dTIikgaXMgY3VycmVudGx5IEZhbHNlLCBhbmQKKyAgICByLmdldF9oZWFkZXIoInNwYW0tRWdnUyIpIHJldHVybnMgTm9uZSwgYnV0IHRoYXQgY291bGQgYmUgY2hhbmdlZCBpbgorICAgIGZ1dHVyZS4KKworICAgID4+PiByLmhhc19oZWFkZXIoIk5vdC10aGVyZSIpCisgICAgRmFsc2UKKyAgICA+Pj4gcHJpbnQgci5nZXRfaGVhZGVyKCJOb3QtdGhlcmUiKQorICAgIE5vbmUKKyAgICA+Pj4gci5nZXRfaGVhZGVyKCJOb3QtdGhlcmUiLCAiZGVmYXVsdCIpCisgICAgJ2RlZmF1bHQnCisKKyAgICAiIiIKKworCitkZWYgdGVzdF9wYXNzd29yZF9tYW5hZ2VyKHNlbGYpOgorICAgICIiIgorICAgID4+PiBtZ3IgPSB1cmxsaWIyLkhUVFBQYXNzd29yZE1ncigpCisgICAgPj4+IGFkZCA9IG1nci5hZGRfcGFzc3dvcmQKKyAgICA+Pj4gYWRkKCJTb21lIFJlYWxtIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iLCAiam9lIiwgInBhc3N3b3JkIikKKyAgICA+Pj4gYWRkKCJTb21lIFJlYWxtIiwgImh0dHA6Ly9leGFtcGxlLmNvbS9uaSIsICJuaSIsICJuaSIpCisgICAgPj4+IGFkZCgiYyIsICJodHRwOi8vZXhhbXBsZS5jb20vZm9vIiwgImZvbyIsICJuaSIpCisgICAgPj4+IGFkZCgiYyIsICJodHRwOi8vZXhhbXBsZS5jb20vYmFyIiwgImJhciIsICJuaW5pIikKKyAgICA+Pj4gYWRkKCJiIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iLCAiZmlyc3QiLCAiYmxhaCIpCisgICAgPj4+IGFkZCgiYiIsICJodHRwOi8vZXhhbXBsZS5jb20vIiwgInNlY29uZCIsICJzcGFtIikKKyAgICA+Pj4gYWRkKCJhIiwgImh0dHA6Ly9leGFtcGxlLmNvbSIsICIxIiwgImEiKQorICAgID4+PiBhZGQoIlNvbWUgUmVhbG0iLCAiaHR0cDovL2MuZXhhbXBsZS5jb206MzEyOCIsICIzIiwgImMiKQorICAgID4+PiBhZGQoIlNvbWUgUmVhbG0iLCAiZC5leGFtcGxlLmNvbSIsICI0IiwgImQiKQorICAgID4+PiBhZGQoIlNvbWUgUmVhbG0iLCAiZS5leGFtcGxlLmNvbTozMTI4IiwgIjUiLCAiZSIpCisKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJleGFtcGxlLmNvbSIpCisgICAgKCdqb2UnLCAncGFzc3dvcmQnKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJTb21lIFJlYWxtIiwgImh0dHA6Ly9leGFtcGxlLmNvbSIpCisgICAgKCdqb2UnLCAncGFzc3dvcmQnKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJTb21lIFJlYWxtIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICAgICgnam9lJywgJ3Bhc3N3b3JkJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJodHRwOi8vZXhhbXBsZS5jb20vc3BhbSIpCisgICAgKCdqb2UnLCAncGFzc3dvcmQnKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJTb21lIFJlYWxtIiwgImh0dHA6Ly9leGFtcGxlLmNvbS9zcGFtL3NwYW0iKQorICAgICgnam9lJywgJ3Bhc3N3b3JkJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiYyIsICJodHRwOi8vZXhhbXBsZS5jb20vZm9vIikKKyAgICAoJ2ZvbycsICduaScpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImMiLCAiaHR0cDovL2V4YW1wbGUuY29tL2JhciIpCisgICAgKCdiYXInLCAnbmluaScpCisKKyAgICBBY3R1YWxseSwgdGhpcyBpcyByZWFsbHkgdW5kZWZpbmVkIEFUTQorIyMgICAgIEN1cnJlbnRseSwgd2UgdXNlIHRoZSBoaWdoZXN0LWxldmVsIHBhdGggd2hlcmUgbW9yZSB0aGFuIG9uZSBtYXRjaDoKKworIyMgICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJTb21lIFJlYWxtIiwgImh0dHA6Ly9leGFtcGxlLmNvbS9uaSIpCisjIyAgICAgKCdqb2UnLCAncGFzc3dvcmQnKQorCisgICAgVXNlIGxhdGVzdCBhZGRfcGFzc3dvcmQoKSBpbiBjYXNlIG9mIGNvbmZsaWN0OgorCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImIiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgICAgKCdzZWNvbmQnLCAnc3BhbScpCisKKyAgICBObyBzcGVjaWFsIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEuZXhhbXBsZS5jb20gYW5kIGV4YW1wbGUuY29tOgorCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImEiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgICAgKCcxJywgJ2EnKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJhIiwgImh0dHA6Ly9hLmV4YW1wbGUuY29tLyIpCisgICAgKE5vbmUsIE5vbmUpCisKKyAgICBQb3J0czoKKworICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJTb21lIFJlYWxtIiwgImMuZXhhbXBsZS5jb20iKQorICAgIChOb25lLCBOb25lKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJTb21lIFJlYWxtIiwgImMuZXhhbXBsZS5jb206MzEyOCIpCisgICAgKCczJywgJ2MnKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJTb21lIFJlYWxtIiwgImh0dHA6Ly9jLmV4YW1wbGUuY29tOjMxMjgiKQorICAgICgnMycsICdjJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJkLmV4YW1wbGUuY29tIikKKyAgICAoJzQnLCAnZCcpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoIlNvbWUgUmVhbG0iLCAiZS5leGFtcGxlLmNvbTozMTI4IikKKyAgICAoJzUnLCAnZScpCisKKyAgICAiIiIKKyAgICBwYXNzCisKKworZGVmIHRlc3RfcGFzc3dvcmRfbWFuYWdlcl9kZWZhdWx0X3BvcnQoc2VsZik6CisgICAgIiIiCisgICAgPj4+IG1nciA9IHVybGxpYjIuSFRUUFBhc3N3b3JkTWdyKCkKKyAgICA+Pj4gYWRkID0gbWdyLmFkZF9wYXNzd29yZAorCisgICAgVGhlIHBvaW50IHRvIG5vdGUgaGVyZSBpcyB0aGF0IHdlIGNhbid0IGd1ZXNzIHRoZSBkZWZhdWx0IHBvcnQgaWYgdGhlcmUncworICAgIG5vIHNjaGVtZS4gIFRoaXMgYXBwbGllcyB0byBib3RoIGFkZF9wYXNzd29yZCBhbmQgZmluZF91c2VyX3Bhc3N3b3JkLgorCisgICAgPj4+IGFkZCgiZiIsICJodHRwOi8vZy5leGFtcGxlLmNvbTo4MCIsICIxMCIsICJqIikKKyAgICA+Pj4gYWRkKCJnIiwgImh0dHA6Ly9oLmV4YW1wbGUuY29tIiwgIjExIiwgImsiKQorICAgID4+PiBhZGQoImgiLCAiaS5leGFtcGxlLmNvbTo4MCIsICIxMiIsICJsIikKKyAgICA+Pj4gYWRkKCJpIiwgImouZXhhbXBsZS5jb20iLCAiMTMiLCAibSIpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImYiLCAiZy5leGFtcGxlLmNvbToxMDAiKQorICAgIChOb25lLCBOb25lKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJmIiwgImcuZXhhbXBsZS5jb206ODAiKQorICAgICgnMTAnLCAnaicpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImYiLCAiZy5leGFtcGxlLmNvbSIpCisgICAgKE5vbmUsIE5vbmUpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImYiLCAiaHR0cDovL2cuZXhhbXBsZS5jb206MTAwIikKKyAgICAoTm9uZSwgTm9uZSkKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiZiIsICJodHRwOi8vZy5leGFtcGxlLmNvbTo4MCIpCisgICAgKCcxMCcsICdqJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiZiIsICJodHRwOi8vZy5leGFtcGxlLmNvbSIpCisgICAgKCcxMCcsICdqJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiZyIsICJoLmV4YW1wbGUuY29tIikKKyAgICAoJzExJywgJ2snKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJnIiwgImguZXhhbXBsZS5jb206ODAiKQorICAgICgnMTEnLCAnaycpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImciLCAiaHR0cDovL2guZXhhbXBsZS5jb206ODAiKQorICAgICgnMTEnLCAnaycpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImgiLCAiaS5leGFtcGxlLmNvbSIpCisgICAgKE5vbmUsIE5vbmUpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImgiLCAiaS5leGFtcGxlLmNvbTo4MCIpCisgICAgKCcxMicsICdsJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiaCIsICJodHRwOi8vaS5leGFtcGxlLmNvbTo4MCIpCisgICAgKCcxMicsICdsJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiaSIsICJqLmV4YW1wbGUuY29tIikKKyAgICAoJzEzJywgJ20nKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJpIiwgImouZXhhbXBsZS5jb206ODAiKQorICAgIChOb25lLCBOb25lKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJpIiwgImh0dHA6Ly9qLmV4YW1wbGUuY29tIikKKyAgICAoJzEzJywgJ20nKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJpIiwgImh0dHA6Ly9qLmV4YW1wbGUuY29tOjgwIikKKyAgICAoTm9uZSwgTm9uZSkKKworICAgICIiIgorCitjbGFzcyBNb2NrT3BlbmVyOgorICAgIGFkZGhlYWRlcnMgPSBbXQorICAgIGRlZiBvcGVuKHNlbGYsIHJlcSwgZGF0YT1Ob25lLHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VUKToKKyAgICAgICAgc2VsZi5yZXEsIHNlbGYuZGF0YSwgc2VsZi50aW1lb3V0ICA9IHJlcSwgZGF0YSwgdGltZW91dAorICAgIGRlZiBlcnJvcihzZWxmLCBwcm90bywgKmFyZ3MpOgorICAgICAgICBzZWxmLnByb3RvLCBzZWxmLmFyZ3MgPSBwcm90bywgYXJncworCitjbGFzcyBNb2NrRmlsZToKKyAgICBkZWYgcmVhZChzZWxmLCBjb3VudD1Ob25lKTogcGFzcworICAgIGRlZiByZWFkbGluZShzZWxmLCBjb3VudD1Ob25lKTogcGFzcworICAgIGRlZiBjbG9zZShzZWxmKTogcGFzcworCitjbGFzcyBNb2NrSGVhZGVycyhkaWN0KToKKyAgICBkZWYgZ2V0aGVhZGVycyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWVzKCkKKworY2xhc3MgTW9ja1Jlc3BvbnNlKFN0cmluZ0lPLlN0cmluZ0lPKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29kZSwgbXNnLCBoZWFkZXJzLCBkYXRhLCB1cmw9Tm9uZSk6CisgICAgICAgIFN0cmluZ0lPLlN0cmluZ0lPLl9faW5pdF9fKHNlbGYsIGRhdGEpCisgICAgICAgIHNlbGYuY29kZSwgc2VsZi5tc2csIHNlbGYuaGVhZGVycywgc2VsZi51cmwgPSBjb2RlLCBtc2csIGhlYWRlcnMsIHVybAorICAgIGRlZiBpbmZvKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5oZWFkZXJzCisgICAgZGVmIGdldHVybChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudXJsCisKK2NsYXNzIE1vY2tDb29raWVKYXI6CisgICAgZGVmIGFkZF9jb29raWVfaGVhZGVyKHNlbGYsIHJlcXVlc3QpOgorICAgICAgICBzZWxmLmFjaF9yZXEgPSByZXF1ZXN0CisgICAgZGVmIGV4dHJhY3RfY29va2llcyhzZWxmLCByZXNwb25zZSwgcmVxdWVzdCk6CisgICAgICAgIHNlbGYuZWNfcmVxLCBzZWxmLmVjX3IgPSByZXF1ZXN0LCByZXNwb25zZQorCitjbGFzcyBGYWtlTWV0aG9kOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRoX25hbWUsIGFjdGlvbiwgaGFuZGxlKToKKyAgICAgICAgc2VsZi5tZXRoX25hbWUgPSBtZXRoX25hbWUKKyAgICAgICAgc2VsZi5oYW5kbGUgPSBoYW5kbGUKKyAgICAgICAgc2VsZi5hY3Rpb24gPSBhY3Rpb24KKyAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGUoc2VsZi5tZXRoX25hbWUsIHNlbGYuYWN0aW9uLCAqYXJncykKKworY2xhc3MgTW9ja0hUVFBSZXNwb25zZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnAsIG1zZywgc3RhdHVzLCByZWFzb24pOgorICAgICAgICBzZWxmLmZwID0gZnAKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKyAgICAgICAgc2VsZi5zdGF0dXMgPSBzdGF0dXMKKyAgICAgICAgc2VsZi5yZWFzb24gPSByZWFzb24KKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgcmV0dXJuICcnCisKK2NsYXNzIE1vY2tIVFRQQ2xhc3M6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnJlcV9oZWFkZXJzID0gW10KKyAgICAgICAgc2VsZi5kYXRhID0gTm9uZQorICAgICAgICBzZWxmLnJhaXNlX29uX2VuZGhlYWRlcnMgPSBGYWxzZQorICAgICAgICBzZWxmLl90dW5uZWxfaGVhZGVycyA9IHt9CisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgaG9zdCwgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQpOgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBzZXRfZGVidWdsZXZlbChzZWxmLCBsZXZlbCk6CisgICAgICAgIHNlbGYubGV2ZWwgPSBsZXZlbAorCisgICAgZGVmIHNldF90dW5uZWwoc2VsZiwgaG9zdCwgcG9ydD1Ob25lLCBoZWFkZXJzPU5vbmUpOgorICAgICAgICBzZWxmLl90dW5uZWxfaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5fdHVubmVsX3BvcnQgPSBwb3J0CisgICAgICAgIGlmIGhlYWRlcnM6CisgICAgICAgICAgICBzZWxmLl90dW5uZWxfaGVhZGVycyA9IGhlYWRlcnMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3R1bm5lbF9oZWFkZXJzLmNsZWFyKCkKKworICAgIGRlZiByZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSk6CisgICAgICAgIHNlbGYubWV0aG9kID0gbWV0aG9kCisgICAgICAgIHNlbGYuc2VsZWN0b3IgPSB1cmwKKyAgICAgICAgaWYgaGVhZGVycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucmVxX2hlYWRlcnMgKz0gaGVhZGVycy5pdGVtcygpCisgICAgICAgIHNlbGYucmVxX2hlYWRlcnMuc29ydCgpCisgICAgICAgIGlmIGJvZHk6CisgICAgICAgICAgICBzZWxmLmRhdGEgPSBib2R5CisgICAgICAgIGlmIHNlbGYucmFpc2Vfb25fZW5kaGVhZGVyczoKKyAgICAgICAgICAgIGltcG9ydCBzb2NrZXQKKyAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvcigpCisKKyAgICBkZWYgZ2V0cmVzcG9uc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBNb2NrSFRUUFJlc3BvbnNlKE1vY2tGaWxlKCksIHt9LCAyMDAsICJPSyIpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKKworY2xhc3MgTW9ja0hhbmRsZXI6CisgICAgIyB1c2VmdWwgZm9yIHRlc3RpbmcgaGFuZGxlciBtYWNoaW5lcnkKKyAgICAjIHNlZSBhZGRfb3JkZXJlZF9tb2NrX2hhbmRsZXJzKCkgZG9jc3RyaW5nCisgICAgaGFuZGxlcl9vcmRlciA9IDUwMAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2RzKToKKyAgICAgICAgc2VsZi5fZGVmaW5lX21ldGhvZHMobWV0aG9kcykKKyAgICBkZWYgX2RlZmluZV9tZXRob2RzKHNlbGYsIG1ldGhvZHMpOgorICAgICAgICBmb3Igc3BlYyBpbiBtZXRob2RzOgorICAgICAgICAgICAgaWYgbGVuKHNwZWMpID09IDI6IG5hbWUsIGFjdGlvbiA9IHNwZWMKKyAgICAgICAgICAgIGVsc2U6IG5hbWUsIGFjdGlvbiA9IHNwZWMsIE5vbmUKKyAgICAgICAgICAgIG1ldGggPSBGYWtlTWV0aG9kKG5hbWUsIGFjdGlvbiwgc2VsZi5oYW5kbGUpCisgICAgICAgICAgICBzZXRhdHRyKHNlbGYuX19jbGFzc19fLCBuYW1lLCBtZXRoKQorICAgIGRlZiBoYW5kbGUoc2VsZiwgZm5fbmFtZSwgYWN0aW9uLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgc2VsZi5wYXJlbnQuY2FsbHMuYXBwZW5kKChzZWxmLCBmbl9uYW1lLCBhcmdzLCBrd2RzKSkKKyAgICAgICAgaWYgYWN0aW9uIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAicmV0dXJuIHNlbGYiOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gInJldHVybiByZXNwb25zZSI6CisgICAgICAgICAgICByZXMgPSBNb2NrUmVzcG9uc2UoMjAwLCAiT0siLCB7fSwgIiIpCisgICAgICAgICAgICByZXR1cm4gcmVzCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJyZXR1cm4gcmVxdWVzdCI6CisgICAgICAgICAgICByZXR1cm4gUmVxdWVzdCgiaHR0cDovL2JsYWgvIikKKyAgICAgICAgZWxpZiBhY3Rpb24uc3RhcnRzd2l0aCgiZXJyb3IiKToKKyAgICAgICAgICAgIGNvZGUgPSBhY3Rpb25bYWN0aW9uLnJmaW5kKCIgIikrMTpdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29kZSA9IGludChjb2RlKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcmVzID0gTW9ja1Jlc3BvbnNlKDIwMCwgIk9LIiwge30sICIiKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50LmVycm9yKCJodHRwIiwgYXJnc1swXSwgcmVzLCBjb2RlLCAiIiwge30pCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJyYWlzZSI6CisgICAgICAgICAgICByYWlzZSB1cmxsaWIyLlVSTEVycm9yKCJibGFoIikKKyAgICAgICAgYXNzZXJ0IEZhbHNlCisgICAgZGVmIGNsb3NlKHNlbGYpOiBwYXNzCisgICAgZGVmIGFkZF9wYXJlbnQoc2VsZiwgcGFyZW50KToKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi5wYXJlbnQuY2FsbHMgPSBbXQorICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihvdGhlciwgImhhbmRsZXJfb3JkZXIiKToKKyAgICAgICAgICAgICMgTm8gaGFuZGxlcl9vcmRlciwgbGVhdmUgaW4gb3JpZ2luYWwgb3JkZXIuICBZdWNrLgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlcl9vcmRlciA8IG90aGVyLmhhbmRsZXJfb3JkZXIKKworZGVmIGFkZF9vcmRlcmVkX21vY2tfaGFuZGxlcnMob3BlbmVyLCBtZXRoX3NwZWMpOgorICAgICIiIkNyZWF0ZSBNb2NrSGFuZGxlcnMgYW5kIGFkZCB0aGVtIHRvIGFuIE9wZW5lckRpcmVjdG9yLgorCisgICAgbWV0aF9zcGVjOiBsaXN0IG9mIGxpc3RzIG9mIHR1cGxlcyBhbmQgc3RyaW5ncyBkZWZpbmluZyBtZXRob2RzIHRvIGRlZmluZQorICAgIG9uIGhhbmRsZXJzLiAgZWc6CisKKyAgICBbWyJodHRwX2Vycm9yIiwgImZ0cF9vcGVuIl0sIFsiaHR0cF9vcGVuIl1dCisKKyAgICBkZWZpbmVzIG1ldGhvZHMgLmh0dHBfZXJyb3IoKSBhbmQgLmZ0cF9vcGVuKCkgb24gb25lIGhhbmRsZXIsIGFuZAorICAgIC5odHRwX29wZW4oKSBvbiBhbm90aGVyLiAgVGhlc2UgbWV0aG9kcyBqdXN0IHJlY29yZCB0aGVpciBhcmd1bWVudHMgYW5kCisgICAgcmV0dXJuIE5vbmUuICBVc2luZyBhIHR1cGxlIGluc3RlYWQgb2YgYSBzdHJpbmcgY2F1c2VzIHRoZSBtZXRob2QgdG8KKyAgICBwZXJmb3JtIHNvbWUgYWN0aW9uIChzZWUgTW9ja0hhbmRsZXIuaGFuZGxlKCkpLCBlZzoKKworICAgIFtbImh0dHBfZXJyb3IiXSwgWygiaHR0cF9vcGVuIiwgInJldHVybiByZXF1ZXN0IildXQorCisgICAgZGVmaW5lcyAuaHR0cF9lcnJvcigpIG9uIG9uZSBoYW5kbGVyICh3aGljaCBzaW1wbHkgcmV0dXJucyBOb25lKSwgYW5kCisgICAgLmh0dHBfb3BlbigpIG9uIGFub3RoZXIgaGFuZGxlciwgd2hpY2ggcmV0dXJucyBhIFJlcXVlc3Qgb2JqZWN0LgorCisgICAgIiIiCisgICAgaGFuZGxlcnMgPSBbXQorICAgIGNvdW50ID0gMAorICAgIGZvciBtZXRocyBpbiBtZXRoX3NwZWM6CisgICAgICAgIGNsYXNzIE1vY2tIYW5kbGVyU3ViY2xhc3MoTW9ja0hhbmRsZXIpOiBwYXNzCisgICAgICAgIGggPSBNb2NrSGFuZGxlclN1YmNsYXNzKG1ldGhzKQorICAgICAgICBoLmhhbmRsZXJfb3JkZXIgKz0gY291bnQKKyAgICAgICAgaC5hZGRfcGFyZW50KG9wZW5lcikKKyAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgaGFuZGxlcnMuYXBwZW5kKGgpCisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihoKQorICAgIHJldHVybiBoYW5kbGVycworCitkZWYgYnVpbGRfdGVzdF9vcGVuZXIoKmhhbmRsZXJfaW5zdGFuY2VzKToKKyAgICBvcGVuZXIgPSBPcGVuZXJEaXJlY3RvcigpCisgICAgZm9yIGggaW4gaGFuZGxlcl9pbnN0YW5jZXM6CisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihoKQorICAgIHJldHVybiBvcGVuZXIKKworY2xhc3MgTW9ja0hUVFBIYW5kbGVyKHVybGxpYjIuQmFzZUhhbmRsZXIpOgorICAgICMgdXNlZnVsIGZvciB0ZXN0aW5nIHJlZGlyZWN0aW9ucyBhbmQgYXV0aAorICAgICMgc2VuZHMgc3VwcGxpZWQgaGVhZGVycyBhbmQgY29kZSBhcyBmaXJzdCByZXNwb25zZQorICAgICMgc2VuZHMgMjAwIE9LIGFzIHNlY29uZCByZXNwb25zZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2RlLCBoZWFkZXJzKToKKyAgICAgICAgc2VsZi5jb2RlID0gY29kZQorICAgICAgICBzZWxmLmhlYWRlcnMgPSBoZWFkZXJzCisgICAgICAgIHNlbGYucmVzZXQoKQorICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5fY291bnQgPSAwCisgICAgICAgIHNlbGYucmVxdWVzdHMgPSBbXQorICAgIGRlZiBodHRwX29wZW4oc2VsZiwgcmVxKToKKyAgICAgICAgaW1wb3J0IG1pbWV0b29scywgaHR0cGxpYiwgY29weQorICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBzZWxmLnJlcXVlc3RzLmFwcGVuZChjb3B5LmRlZXBjb3B5KHJlcSkpCisgICAgICAgIGlmIHNlbGYuX2NvdW50ID09IDA6CisgICAgICAgICAgICBzZWxmLl9jb3VudCA9IHNlbGYuX2NvdW50ICsgMQorICAgICAgICAgICAgbmFtZSA9IGh0dHBsaWIucmVzcG9uc2VzW3NlbGYuY29kZV0KKyAgICAgICAgICAgIG1zZyA9IG1pbWV0b29scy5NZXNzYWdlKFN0cmluZ0lPKHNlbGYuaGVhZGVycykpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQuZXJyb3IoCisgICAgICAgICAgICAgICAgImh0dHAiLCByZXEsIE1vY2tGaWxlKCksIHNlbGYuY29kZSwgbmFtZSwgbXNnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yZXEgPSByZXEKKyAgICAgICAgICAgIG1zZyA9IG1pbWV0b29scy5NZXNzYWdlKFN0cmluZ0lPKCJcclxuXHJcbiIpKQorICAgICAgICAgICAgcmV0dXJuIE1vY2tSZXNwb25zZSgyMDAsICJPSyIsIG1zZywgIiIsIHJlcS5nZXRfZnVsbF91cmwoKSkKKworY2xhc3MgTW9ja0hUVFBTSGFuZGxlcih1cmxsaWIyLkFic3RyYWN0SFRUUEhhbmRsZXIpOgorICAgICMgVXNlZnVsIGZvciB0ZXN0aW5nIHRoZSBQcm94eS1BdXRob3JpemF0aW9uIHJlcXVlc3QgYnkgdmVyaWZ5aW5nIHRoZQorICAgICMgcHJvcGVydGllcyBvZiBodHRwY29uCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHVybGxpYjIuQWJzdHJhY3RIVFRQSGFuZGxlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmh0dHBjb25uID0gTW9ja0hUVFBDbGFzcygpCisKKyAgICBkZWYgaHR0cHNfb3BlbihzZWxmLCByZXEpOgorICAgICAgICByZXR1cm4gc2VsZi5kb19vcGVuKHNlbGYuaHR0cGNvbm4sIHJlcSkKKworY2xhc3MgTW9ja1Bhc3N3b3JkTWFuYWdlcjoKKyAgICBkZWYgYWRkX3Bhc3N3b3JkKHNlbGYsIHJlYWxtLCB1cmksIHVzZXIsIHBhc3N3b3JkKToKKyAgICAgICAgc2VsZi5yZWFsbSA9IHJlYWxtCisgICAgICAgIHNlbGYudXJsID0gdXJpCisgICAgICAgIHNlbGYudXNlciA9IHVzZXIKKyAgICAgICAgc2VsZi5wYXNzd29yZCA9IHBhc3N3b3JkCisgICAgZGVmIGZpbmRfdXNlcl9wYXNzd29yZChzZWxmLCByZWFsbSwgYXV0aHVyaSk6CisgICAgICAgIHNlbGYudGFyZ2V0X3JlYWxtID0gcmVhbG0KKyAgICAgICAgc2VsZi50YXJnZXRfdXJsID0gYXV0aHVyaQorICAgICAgICByZXR1cm4gc2VsZi51c2VyLCBzZWxmLnBhc3N3b3JkCisKKworY2xhc3MgT3BlbmVyRGlyZWN0b3JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hZGRfbm9uX2hhbmRsZXIoc2VsZik6CisgICAgICAgIGNsYXNzIE5vbkhhbmRsZXIob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuZXJEaXJlY3RvcigpLmFkZF9oYW5kbGVyLCBOb25IYW5kbGVyKCkpCisKKyAgICBkZWYgdGVzdF9iYWRseV9uYW1lZF9tZXRob2RzKHNlbGYpOgorICAgICAgICAjIHRlc3Qgd29yay1hcm91bmQgZm9yIHRocmVlIG1ldGhvZHMgdGhhdCBhY2NpZGVudGFsbHkgZm9sbG93IHRoZQorICAgICAgICAjIG5hbWluZyBjb252ZW50aW9ucyBmb3IgaGFuZGxlciBtZXRob2RzCisgICAgICAgICMgKCpfb3BlbigpIC8gKl9yZXF1ZXN0KCkgLyAqX3Jlc3BvbnNlKCkpCisKKyAgICAgICAgIyBUaGVzZSB1c2VkIHRvIGNhbGwgdGhlIGFjY2lkZW50YWxseS1uYW1lZCBtZXRob2RzLCBjYXVzaW5nIGEKKyAgICAgICAgIyBUeXBlRXJyb3IgaW4gcmVhbCBjb2RlOyBoZXJlLCByZXR1cm5pbmcgc2VsZiBmcm9tIHRoZXNlIG1vY2sKKyAgICAgICAgIyBtZXRob2RzIHdvdWxkIGVpdGhlciBjYXVzZSBubyBleGNlcHRpb24sIG9yIEF0dHJpYnV0ZUVycm9yLgorCisgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgVVJMRXJyb3IKKworICAgICAgICBvID0gT3BlbmVyRGlyZWN0b3IoKQorICAgICAgICBtZXRoX3NwZWMgPSBbCisgICAgICAgICAgICBbKCJkb19vcGVuIiwgInJldHVybiBzZWxmIiksICgicHJveHlfb3BlbiIsICJyZXR1cm4gc2VsZiIpXSwKKyAgICAgICAgICAgIFsoInJlZGlyZWN0X3JlcXVlc3QiLCAicmV0dXJuIHNlbGYiKV0sCisgICAgICAgICAgICBdCisgICAgICAgIGhhbmRsZXJzID0gYWRkX29yZGVyZWRfbW9ja19oYW5kbGVycyhvLCBtZXRoX3NwZWMpCisgICAgICAgIG8uYWRkX2hhbmRsZXIodXJsbGliMi5Vbmtub3duSGFuZGxlcigpKQorICAgICAgICBmb3Igc2NoZW1lIGluICJkbyIsICJwcm94eSIsICJyZWRpcmVjdCI6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVUkxFcnJvciwgby5vcGVuLCBzY2hlbWUrIjovL2V4YW1wbGUuY29tLyIpCisKKyAgICBkZWYgdGVzdF9oYW5kbGVkKHNlbGYpOgorICAgICAgICAjIGhhbmRsZXIgcmV0dXJuaW5nIG5vbi1Ob25lIG1lYW5zIG5vIG1vcmUgaGFuZGxlcnMgd2lsbCBiZSBjYWxsZWQKKyAgICAgICAgbyA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgbWV0aF9zcGVjID0gWworICAgICAgICAgICAgWyJodHRwX29wZW4iLCAiZnRwX29wZW4iLCAiaHR0cF9lcnJvcl8zMDIiXSwKKyAgICAgICAgICAgIFsiZnRwX29wZW4iXSwKKyAgICAgICAgICAgIFsoImh0dHBfb3BlbiIsICJyZXR1cm4gc2VsZiIpXSwKKyAgICAgICAgICAgIFsoImh0dHBfb3BlbiIsICJyZXR1cm4gc2VsZiIpXSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgaGFuZGxlcnMgPSBhZGRfb3JkZXJlZF9tb2NrX2hhbmRsZXJzKG8sIG1ldGhfc3BlYykKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICAgICAgciA9IG8ub3BlbihyZXEpCisgICAgICAgICMgU2Vjb25kIC5odHRwX29wZW4oKSBnZXRzIGNhbGxlZCwgdGhpcmQgZG9lc24ndCwgc2luY2Ugc2Vjb25kIHJldHVybmVkCisgICAgICAgICMgbm9uLU5vbmUuICBIYW5kbGVycyB3aXRob3V0IC5odHRwX29wZW4oKSBuZXZlciBnZXQgYW55IG1ldGhvZHMgY2FsbGVkCisgICAgICAgICMgb24gdGhlbS4KKyAgICAgICAgIyBJbiBmYWN0LCBzZWNvbmQgbW9jayBoYW5kbGVyIGRlZmluaW5nIC5odHRwX29wZW4oKSByZXR1cm5zIHNlbGYKKyAgICAgICAgIyAoaW5zdGVhZCBvZiByZXNwb25zZSksIHdoaWNoIGJlY29tZXMgdGhlIE9wZW5lckRpcmVjdG9yJ3MgcmV0dXJuCisgICAgICAgICMgdmFsdWUuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgaGFuZGxlcnNbMl0pCisgICAgICAgIGNhbGxzID0gWyhoYW5kbGVyc1swXSwgImh0dHBfb3BlbiIpLCAoaGFuZGxlcnNbMl0sICJodHRwX29wZW4iKV0KKyAgICAgICAgZm9yIGV4cGVjdGVkLCBnb3QgaW4gemlwKGNhbGxzLCBvLmNhbGxzKToKKyAgICAgICAgICAgIGhhbmRsZXIsIG5hbWUsIGFyZ3MsIGt3ZHMgPSBnb3QKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGhhbmRsZXIsIG5hbWUpLCBleHBlY3RlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgKHJlcSwpKQorCisgICAgZGVmIHRlc3RfaGFuZGxlcl9vcmRlcihzZWxmKToKKyAgICAgICAgbyA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgaGFuZGxlcnMgPSBbXQorICAgICAgICBmb3IgbWV0aHMsIGhhbmRsZXJfb3JkZXIgaW4gWworICAgICAgICAgICAgKFsoImh0dHBfb3BlbiIsICJyZXR1cm4gc2VsZiIpXSwgNTAwKSwKKyAgICAgICAgICAgIChbImh0dHBfb3BlbiJdLCAwKSwKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICBjbGFzcyBNb2NrSGFuZGxlclN1YmNsYXNzKE1vY2tIYW5kbGVyKTogcGFzcworICAgICAgICAgICAgaCA9IE1vY2tIYW5kbGVyU3ViY2xhc3MobWV0aHMpCisgICAgICAgICAgICBoLmhhbmRsZXJfb3JkZXIgPSBoYW5kbGVyX29yZGVyCisgICAgICAgICAgICBoYW5kbGVycy5hcHBlbmQoaCkKKyAgICAgICAgICAgIG8uYWRkX2hhbmRsZXIoaCkKKworICAgICAgICByID0gby5vcGVuKCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICAgICAgIyBoYW5kbGVycyBjYWxsZWQgaW4gcmV2ZXJzZSBvcmRlciwgdGhhbmtzIHRvIHRoZWlyIHNvcnQgb3JkZXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLmNhbGxzWzBdWzBdLCBoYW5kbGVyc1sxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLmNhbGxzWzFdWzBdLCBoYW5kbGVyc1swXSkKKworICAgIGRlZiB0ZXN0X3JhaXNlKHNlbGYpOgorICAgICAgICAjIHJhaXNpbmcgVVJMRXJyb3Igc3RvcHMgcHJvY2Vzc2luZyBvZiByZXF1ZXN0CisgICAgICAgIG8gPSBPcGVuZXJEaXJlY3RvcigpCisgICAgICAgIG1ldGhfc3BlYyA9IFsKKyAgICAgICAgICAgIFsoImh0dHBfb3BlbiIsICJyYWlzZSIpXSwKKyAgICAgICAgICAgIFsoImh0dHBfb3BlbiIsICJyZXR1cm4gc2VsZiIpXSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgaGFuZGxlcnMgPSBhZGRfb3JkZXJlZF9tb2NrX2hhbmRsZXJzKG8sIG1ldGhfc3BlYykKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXJsbGliMi5VUkxFcnJvciwgby5vcGVuLCByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5jYWxscywgWyhoYW5kbGVyc1swXSwgImh0dHBfb3BlbiIsIChyZXEsKSwge30pXSkKKworIyMgICAgIGRlZiB0ZXN0X2Vycm9yKHNlbGYpOgorIyMgICAgICAgICAjIFhYWCB0aGlzIGRvZXNuJ3QgYWN0dWFsbHkgc2VlbSB0byBiZSB1c2VkIGluIHN0YW5kYXJkIGxpYnJhcnksCisjIyAgICAgICAgICMgIGJ1dCBzaG91bGQgcmVhbGx5IGJlIHRlc3RlZCBhbnl3YXkuLi4KKworICAgIGRlZiB0ZXN0X2h0dHBfZXJyb3Ioc2VsZik6CisgICAgICAgICMgWFhYIGh0dHBfZXJyb3JfZGVmYXVsdAorICAgICAgICAjIGh0dHAgZXJyb3JzIGFyZSBhIHNwZWNpYWwgY2FzZQorICAgICAgICBvID0gT3BlbmVyRGlyZWN0b3IoKQorICAgICAgICBtZXRoX3NwZWMgPSBbCisgICAgICAgICAgICBbKCJodHRwX29wZW4iLCAiZXJyb3IgMzAyIildLAorICAgICAgICAgICAgWygiaHR0cF9lcnJvcl80MDAiLCAicmFpc2UiKSwgImh0dHBfb3BlbiJdLAorICAgICAgICAgICAgWygiaHR0cF9lcnJvcl8zMDIiLCAicmV0dXJuIHJlc3BvbnNlIiksICJodHRwX2Vycm9yXzMwMyIsCisgICAgICAgICAgICAgImh0dHBfZXJyb3IiXSwKKyAgICAgICAgICAgIFsoImh0dHBfZXJyb3JfMzAyIildLAorICAgICAgICAgICAgXQorICAgICAgICBoYW5kbGVycyA9IGFkZF9vcmRlcmVkX21vY2tfaGFuZGxlcnMobywgbWV0aF9zcGVjKQorCisgICAgICAgIGNsYXNzIFVua25vd246CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTogcmV0dXJuIFRydWUKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICAgICAgciA9IG8ub3BlbihyZXEpCisgICAgICAgIGFzc2VydCBsZW4oby5jYWxscykgPT0gMgorICAgICAgICBjYWxscyA9IFsoaGFuZGxlcnNbMF0sICJodHRwX29wZW4iLCAocmVxLCkpLAorICAgICAgICAgICAgICAgICAoaGFuZGxlcnNbMl0sICJodHRwX2Vycm9yXzMwMiIsCisgICAgICAgICAgICAgICAgICAocmVxLCBVbmtub3duKCksIDMwMiwgIiIsIHt9KSldCisgICAgICAgIGZvciBleHBlY3RlZCwgZ290IGluIHppcChjYWxscywgby5jYWxscyk6CisgICAgICAgICAgICBoYW5kbGVyLCBtZXRob2RfbmFtZSwgYXJncyA9IGV4cGVjdGVkCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChoYW5kbGVyLCBtZXRob2RfbmFtZSksIGdvdFs6Ml0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIGdvdFsyXSkKKworICAgIGRlZiB0ZXN0X3Byb2Nlc3NvcnMoc2VsZik6CisgICAgICAgICMgKl9yZXF1ZXN0IC8gKl9yZXNwb25zZSBtZXRob2RzIGdldCBjYWxsZWQgYXBwcm9wcmlhdGVseQorICAgICAgICBvID0gT3BlbmVyRGlyZWN0b3IoKQorICAgICAgICBtZXRoX3NwZWMgPSBbCisgICAgICAgICAgICBbKCJodHRwX3JlcXVlc3QiLCAicmV0dXJuIHJlcXVlc3QiKSwKKyAgICAgICAgICAgICAoImh0dHBfcmVzcG9uc2UiLCAicmV0dXJuIHJlc3BvbnNlIildLAorICAgICAgICAgICAgWygiaHR0cF9yZXF1ZXN0IiwgInJldHVybiByZXF1ZXN0IiksCisgICAgICAgICAgICAgKCJodHRwX3Jlc3BvbnNlIiwgInJldHVybiByZXNwb25zZSIpXSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgaGFuZGxlcnMgPSBhZGRfb3JkZXJlZF9tb2NrX2hhbmRsZXJzKG8sIG1ldGhfc3BlYykKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICAgICAgciA9IG8ub3BlbihyZXEpCisgICAgICAgICMgcHJvY2Vzc29yIG1ldGhvZHMgYXJlIGNhbGxlZCBvbiAqYWxsKiBoYW5kbGVycyB0aGF0IGRlZmluZSB0aGVtLAorICAgICAgICAjIG5vdCBqdXN0IHRoZSBmaXJzdCBoYW5kbGVyIHRoYXQgaGFuZGxlcyB0aGUgcmVxdWVzdAorICAgICAgICBjYWxscyA9IFsKKyAgICAgICAgICAgIChoYW5kbGVyc1swXSwgImh0dHBfcmVxdWVzdCIpLCAoaGFuZGxlcnNbMV0sICJodHRwX3JlcXVlc3QiKSwKKyAgICAgICAgICAgIChoYW5kbGVyc1swXSwgImh0dHBfcmVzcG9uc2UiKSwgKGhhbmRsZXJzWzFdLCAiaHR0cF9yZXNwb25zZSIpXQorCisgICAgICAgIGZvciBpLCAoaGFuZGxlciwgbmFtZSwgYXJncywga3dkcykgaW4gZW51bWVyYXRlKG8uY2FsbHMpOgorICAgICAgICAgICAgaWYgaSA8IDI6CisgICAgICAgICAgICAgICAgIyAqX3JlcXVlc3QKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChoYW5kbGVyLCBuYW1lKSwgY2FsbHNbaV0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYXJncyksIDEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGFyZ3NbMF0sIFJlcXVlc3QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgKl9yZXNwb25zZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGhhbmRsZXIsIG5hbWUpLCBjYWxsc1tpXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhcmdzKSwgMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYXJnc1swXSwgUmVxdWVzdCkKKyAgICAgICAgICAgICAgICAjIHJlc3BvbnNlIGZyb20gb3BlbmVyLm9wZW4gaXMgTm9uZSwgYmVjYXVzZSB0aGVyZSdzIG5vCisgICAgICAgICAgICAgICAgIyBoYW5kbGVyIHRoYXQgZGVmaW5lcyBodHRwX29wZW4gdG8gaGFuZGxlIGl0CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFyZ3NbMV0gaXMgTm9uZSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGFyZ3NbMV0sIE1vY2tSZXNwb25zZSkpCisKKworZGVmIHNhbmVwYXRobmFtZTJ1cmwocGF0aCk6CisgICAgaW1wb3J0IHVybGxpYgorICAgIHVybHBhdGggPSB1cmxsaWIucGF0aG5hbWUydXJsKHBhdGgpCisgICAgaWYgb3MubmFtZSA9PSAibnQiIGFuZCB1cmxwYXRoLnN0YXJ0c3dpdGgoIi8vLyIpOgorICAgICAgICB1cmxwYXRoID0gdXJscGF0aFsyOl0KKyAgICAjIFhYWCBkb24ndCBhc2sgbWUgYWJvdXQgdGhlIG1hYy4uLgorICAgIHJldHVybiB1cmxwYXRoCisKK2NsYXNzIEhhbmRsZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9mdHAoc2VsZik6CisgICAgICAgIGNsYXNzIE1vY2tGVFBXcmFwcGVyOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOiBzZWxmLmRhdGEgPSBkYXRhCisgICAgICAgICAgICBkZWYgcmV0cmZpbGUoc2VsZiwgZmlsZW5hbWUsIGZpbGV0eXBlKToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVuYW1lLCBzZWxmLmZpbGV0eXBlID0gZmlsZW5hbWUsIGZpbGV0eXBlCisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0lPLlN0cmluZ0lPKHNlbGYuZGF0YSksIGxlbihzZWxmLmRhdGEpCisgICAgICAgICAgICBkZWYgY2xvc2Uoc2VsZik6IHBhc3MKKworICAgICAgICBjbGFzcyBOdWxsRlRQSGFuZGxlcih1cmxsaWIyLkZUUEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOiBzZWxmLmRhdGEgPSBkYXRhCisgICAgICAgICAgICBkZWYgY29ubmVjdF9mdHAoc2VsZiwgdXNlciwgcGFzc3dkLCBob3N0LCBwb3J0LCBkaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VUKToKKyAgICAgICAgICAgICAgICBzZWxmLnVzZXIsIHNlbGYucGFzc3dkID0gdXNlciwgcGFzc3dkCisgICAgICAgICAgICAgICAgc2VsZi5ob3N0LCBzZWxmLnBvcnQgPSBob3N0LCBwb3J0CisgICAgICAgICAgICAgICAgc2VsZi5kaXJzID0gZGlycworICAgICAgICAgICAgICAgIHNlbGYuZnRwd3JhcHBlciA9IE1vY2tGVFBXcmFwcGVyKHNlbGYuZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5mdHB3cmFwcGVyCisKKyAgICAgICAgaW1wb3J0IGZ0cGxpYgorICAgICAgICBkYXRhID0gInJoZXVtIHJoYXBvbmljdW0iCisgICAgICAgIGggPSBOdWxsRlRQSGFuZGxlcihkYXRhKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKKworICAgICAgICBmb3IgdXJsLCBob3N0LCBwb3J0LCB1c2VyLCBwYXNzd2QsIHR5cGVfLCBkaXJzLCBmaWxlbmFtZSwgbWltZXR5cGUgaW4gWworICAgICAgICAgICAgKCJmdHA6Ly9sb2NhbGhvc3QvZm9vL2Jhci9iYXouaHRtbCIsCisgICAgICAgICAgICAgImxvY2FsaG9zdCIsIGZ0cGxpYi5GVFBfUE9SVCwgIiIsICIiLCAiSSIsCisgICAgICAgICAgICAgWyJmb28iLCAiYmFyIl0sICJiYXouaHRtbCIsICJ0ZXh0L2h0bWwiKSwKKyAgICAgICAgICAgICgiZnRwOi8vcGFycm90QGxvY2FsaG9zdC9mb28vYmFyL2Jhei5odG1sIiwKKyAgICAgICAgICAgICAibG9jYWxob3N0IiwgZnRwbGliLkZUUF9QT1JULCAicGFycm90IiwgIiIsICJJIiwKKyAgICAgICAgICAgICBbImZvbyIsICJiYXIiXSwgImJhei5odG1sIiwgInRleHQvaHRtbCIpLAorICAgICAgICAgICAgKCJmdHA6Ly8lMjVwYXJyb3RAbG9jYWxob3N0L2Zvby9iYXIvYmF6Lmh0bWwiLAorICAgICAgICAgICAgICJsb2NhbGhvc3QiLCBmdHBsaWIuRlRQX1BPUlQsICIlcGFycm90IiwgIiIsICJJIiwKKyAgICAgICAgICAgICBbImZvbyIsICJiYXIiXSwgImJhei5odG1sIiwgInRleHQvaHRtbCIpLAorICAgICAgICAgICAgKCJmdHA6Ly8lMjU0MnBhcnJvdEBsb2NhbGhvc3QvZm9vL2Jhci9iYXouaHRtbCIsCisgICAgICAgICAgICAgImxvY2FsaG9zdCIsIGZ0cGxpYi5GVFBfUE9SVCwgIiU0MnBhcnJvdCIsICIiLCAiSSIsCisgICAgICAgICAgICAgWyJmb28iLCAiYmFyIl0sICJiYXouaHRtbCIsICJ0ZXh0L2h0bWwiKSwKKyAgICAgICAgICAgICgiZnRwOi8vbG9jYWxob3N0OjgwL2Zvby9iYXIvIiwKKyAgICAgICAgICAgICAibG9jYWxob3N0IiwgODAsICIiLCAiIiwgIkQiLAorICAgICAgICAgICAgIFsiZm9vIiwgImJhciJdLCAiIiwgTm9uZSksCisgICAgICAgICAgICAoImZ0cDovL2xvY2FsaG9zdC9iYXouZ2lmO3R5cGU9YSIsCisgICAgICAgICAgICAgImxvY2FsaG9zdCIsIGZ0cGxpYi5GVFBfUE9SVCwgIiIsICIiLCAiQSIsCisgICAgICAgICAgICAgW10sICJiYXouZ2lmIiwgTm9uZSksICAjIFhYWCByZWFsbHkgdGhpcyBzaG91bGQgZ3Vlc3MgaW1hZ2UvZ2lmCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwpCisgICAgICAgICAgICByZXEudGltZW91dCA9IE5vbmUKKyAgICAgICAgICAgIHIgPSBoLmZ0cF9vcGVuKHJlcSkKKyAgICAgICAgICAgICMgZnRwIGF1dGhlbnRpY2F0aW9uIG5vdCB5ZXQgaW1wbGVtZW50ZWQgYnkgRlRQSGFuZGxlcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnVzZXIsIHVzZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgucGFzc3dkLCBwYXNzd2QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguaG9zdCwgc29ja2V0LmdldGhvc3RieW5hbWUoaG9zdCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgucG9ydCwgcG9ydCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5kaXJzLCBkaXJzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmZ0cHdyYXBwZXIuZmlsZW5hbWUsIGZpbGVuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmZ0cHdyYXBwZXIuZmlsZXR5cGUsIHR5cGVfKQorICAgICAgICAgICAgaGVhZGVycyA9IHIuaW5mbygpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYWRlcnMuZ2V0KCJDb250ZW50LXR5cGUiKSwgbWltZXR5cGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChoZWFkZXJzWyJDb250ZW50LWxlbmd0aCJdKSwgbGVuKGRhdGEpKQorCisgICAgZGVmIHRlc3RfZmlsZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHJmYzgyMiwgc29ja2V0CisgICAgICAgIGggPSB1cmxsaWIyLkZpbGVIYW5kbGVyKCkKKyAgICAgICAgbyA9IGgucGFyZW50ID0gTW9ja09wZW5lcigpCisKKyAgICAgICAgVEVTVEZOID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICB1cmxwYXRoID0gc2FuZXBhdGhuYW1lMnVybChvcy5wYXRoLmFic3BhdGgoVEVTVEZOKSkKKyAgICAgICAgdG93cml0ZSA9ICJoZWxsbywgd29ybGRcbiIKKyAgICAgICAgdXJscyA9IFsKKyAgICAgICAgICAgICJmaWxlOi8vbG9jYWxob3N0JXMiICUgdXJscGF0aCwKKyAgICAgICAgICAgICJmaWxlOi8vJXMiICUgdXJscGF0aCwKKyAgICAgICAgICAgICJmaWxlOi8vJXMlcyIgJSAoc29ja2V0LmdldGhvc3RieW5hbWUoJ2xvY2FsaG9zdCcpLCB1cmxwYXRoKSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9jYWxhZGRyID0gc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICBsb2NhbGFkZHIgPSAnJworICAgICAgICBpZiBsb2NhbGFkZHI6CisgICAgICAgICAgICB1cmxzLmFwcGVuZCgiZmlsZTovLyVzJXMiICUgKGxvY2FsYWRkciwgdXJscGF0aCkpCisKKyAgICAgICAgZm9yIHVybCBpbiB1cmxzOgorICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAid2IiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSh0b3dyaXRlKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICAgICAgciA9IGguZmlsZV9vcGVuKFJlcXVlc3QodXJsKSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByLnJlYWQoKQorICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gci5pbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgcmVzcHVybCA9IHIuZ2V0dXJsKCkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICByLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzdGF0cyA9IG9zLnN0YXQoVEVTVEZOKQorICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gcmZjODIyLmZvcm1hdGRhdGUoc3RhdHMuc3RfbXRpbWUpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHRvd3JpdGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYWRlcnNbIkNvbnRlbnQtdHlwZSJdLCAidGV4dC9wbGFpbiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYWRlcnNbIkNvbnRlbnQtbGVuZ3RoIl0sICIxMyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYWRlcnNbIkxhc3QtbW9kaWZpZWQiXSwgbW9kaWZpZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3B1cmwsIHVybCkKKworICAgICAgICBmb3IgdXJsIGluIFsKKyAgICAgICAgICAgICJmaWxlOi8vbG9jYWxob3N0OjgwJXMiICUgdXJscGF0aCwKKyAgICAgICAgICAgICJmaWxlOi8vL2ZpbGVfZG9lc19ub3RfZXhpc3QudHh0IiwKKyAgICAgICAgICAgICJmaWxlOi8vJXM6ODAlcy8lcyIgJSAoc29ja2V0LmdldGhvc3RieW5hbWUoJ2xvY2FsaG9zdCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5nZXRjd2QoKSwgVEVTVEZOKSwKKyAgICAgICAgICAgICJmaWxlOi8vc29tZXJhbmRvbWhvc3Qub250aGVpbnRlcm5ldC5jb20lcy8lcyIgJQorICAgICAgICAgICAgKG9zLmdldGN3ZCgpLCBURVNURk4pLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICJ3YiIpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKHRvd3JpdGUpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh1cmxsaWIyLlVSTEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGguZmlsZV9vcGVuLCBSZXF1ZXN0KHVybCkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShURVNURk4pCisKKyAgICAgICAgaCA9IHVybGxpYjIuRmlsZUhhbmRsZXIoKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKKyAgICAgICAgIyBYWFhYIHdoeSBkb2VzIC8vIG1lYW4gZnRwIChhbmQgLy8vIG1lYW4gbm90IGZ0cCEpLCBhbmQgd2hlcmUKKyAgICAgICAgIyAgaXMgZmlsZTogc2NoZW1lIHNwZWNpZmllZD8gIEkgdGhpbmsgdGhpcyBpcyByZWFsbHkgYSBidWcsIGFuZAorICAgICAgICAjICB3aGF0IHdhcyBpbnRlbmRlZCB3YXMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBVUkxzIGxpa2U6CisgICAgICAgICMgZmlsZTovYmxhaC50eHQgKGEgZmlsZSkKKyAgICAgICAgIyBmaWxlOi8vbG9jYWxob3N0L2JsYWgudHh0IChhIGZpbGUpCisgICAgICAgICMgZmlsZTovLy9ibGFoLnR4dCAoYSBmaWxlKQorICAgICAgICAjIGZpbGU6Ly9mdHAuZXhhbXBsZS5jb20vYmxhaC50eHQgKGFuIGZ0cCBVUkwpCisgICAgICAgIGZvciB1cmwsIGZ0cCBpbiBbCisgICAgICAgICAgICAoImZpbGU6Ly9mdHAuZXhhbXBsZS5jb20vL2Zvby50eHQiLCBUcnVlKSwKKyAgICAgICAgICAgICgiZmlsZTovL2Z0cC5leGFtcGxlLmNvbS8vL2Zvby50eHQiLCBGYWxzZSksCisjIFhYWFggYnVnOiBmYWlscyB3aXRoIE9TRXJyb3IsIHNob3VsZCBiZSBVUkxFcnJvcgorICAgICAgICAgICAgKCJmaWxlOi8vZnRwLmV4YW1wbGUuY29tL2Zvby50eHQiLCBGYWxzZSksCisgICAgICAgICAgICAoImZpbGU6Ly9zb21laG9zdC8vZm9vL3NvbWV0aGluZy50eHQiLCBUcnVlKSwKKyAgICAgICAgICAgICgiZmlsZTovL2xvY2FsaG9zdC8vZm9vL3NvbWV0aGluZy50eHQiLCBGYWxzZSksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaC5maWxlX29wZW4ocmVxKQorICAgICAgICAgICAgIyBYWFhYIHJlbW92ZSBPU0Vycm9yIHdoZW4gYnVnIGZpeGVkCisgICAgICAgICAgICBleGNlcHQgKHVybGxpYjIuVVJMRXJyb3IsIE9TRXJyb3IpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZnRwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoby5yZXEgaXMgcmVxKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnR5cGUsICJmdHAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudHlwZSA9PSAiZnRwIiwgZnRwKQorCisgICAgZGVmIHRlc3RfaHR0cChzZWxmKToKKworICAgICAgICBoID0gdXJsbGliMi5BYnN0cmFjdEhUVFBIYW5kbGVyKCkKKyAgICAgICAgbyA9IGgucGFyZW50ID0gTW9ja09wZW5lcigpCisKKyAgICAgICAgdXJsID0gImh0dHA6Ly9leGFtcGxlLmNvbS8iCisgICAgICAgIGZvciBtZXRob2QsIGRhdGEgaW4gWygiR0VUIiwgTm9uZSksICgiUE9TVCIsICJibGFoIildOgorICAgICAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwsIGRhdGEsIHsiRm9vIjogImJhciJ9KQorICAgICAgICAgICAgcmVxLnRpbWVvdXQgPSBOb25lCisgICAgICAgICAgICByZXEuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoIlNwYW0iLCAiZWdncyIpCisgICAgICAgICAgICBodHRwID0gTW9ja0hUVFBDbGFzcygpCisgICAgICAgICAgICByID0gaC5kb19vcGVuKGh0dHAsIHJlcSkKKworICAgICAgICAgICAgIyByZXN1bHQgYXR0cmlidXRlcworICAgICAgICAgICAgci5yZWFkOyByLnJlYWRsaW5lICAjIHdyYXBwZWQgTW9ja0ZpbGUgbWV0aG9kcworICAgICAgICAgICAgci5pbmZvOyByLmdldHVybCAgIyBhZGRpbmZvdXJsIG1ldGhvZHMKKyAgICAgICAgICAgIHIuY29kZSwgci5tc2cgPT0gMjAwLCAiT0siICAjIGFkZGVkIGZyb20gTW9ja0hUVFBDbGFzcy5nZXRyZXBseSgpCisgICAgICAgICAgICBoZHJzID0gci5pbmZvKCkKKyAgICAgICAgICAgIGhkcnMuZ2V0OyBoZHJzLmhhc19rZXkgICMgci5pbmZvKCkgZ2l2ZXMgZGljdCBmcm9tIC5nZXRyZXBseSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuZ2V0dXJsKCksIHVybCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodHRwLmhvc3QsICJleGFtcGxlLmNvbSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGh0dHAubGV2ZWwsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGh0dHAubWV0aG9kLCBtZXRob2QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGh0dHAuc2VsZWN0b3IsICIvIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHR0cC5yZXFfaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygiQ29ubmVjdGlvbiIsICJjbG9zZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJGb28iLCAiYmFyIiksICgiU3BhbSIsICJlZ2dzIildKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodHRwLmRhdGEsIGRhdGEpCisKKyAgICAgICAgIyBjaGVjayBzb2NrZXQuZXJyb3IgY29udmVydGVkIHRvIFVSTEVycm9yCisgICAgICAgIGh0dHAucmFpc2Vfb25fZW5kaGVhZGVycyA9IFRydWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXJsbGliMi5VUkxFcnJvciwgaC5kb19vcGVuLCBodHRwLCByZXEpCisKKyAgICAgICAgIyBjaGVjayBhZGRpbmcgb2Ygc3RhbmRhcmQgaGVhZGVycworICAgICAgICBvLmFkZGhlYWRlcnMgPSBbKCJTcGFtIiwgImVnZ3MiKV0KKyAgICAgICAgZm9yIGRhdGEgaW4gIiIsIE5vbmU6ICAjIFBPU1QsIEdFVAorICAgICAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2V4YW1wbGUuY29tLyIsIGRhdGEpCisgICAgICAgICAgICByID0gTW9ja1Jlc3BvbnNlKDIwMCwgIk9LIiwge30sICIiKQorICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0XyhyZXEpCisgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6ICAjIEdFVAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIkNvbnRlbnQtbGVuZ3RoIiwgcmVxLnVucmVkaXJlY3RlZF9oZHJzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIkNvbnRlbnQtdHlwZSIsIHJlcS51bnJlZGlyZWN0ZWRfaGRycykKKyAgICAgICAgICAgIGVsc2U6ICAjIFBPU1QKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC1sZW5ndGgiXSwgIjAiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LXR5cGUiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCisgICAgICAgICAgICAjIFhYWCB0aGUgZGV0YWlscyBvZiBIb3N0IGNvdWxkIGJlIGJldHRlciB0ZXN0ZWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJIb3N0Il0sICJleGFtcGxlLmNvbSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siU3BhbSJdLCAiZWdncyIpCisKKyAgICAgICAgICAgICMgZG9uJ3QgY2xvYmJlciBleGlzdGluZyBoZWFkZXJzCisgICAgICAgICAgICByZXEuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoIkNvbnRlbnQtbGVuZ3RoIiwgImZvbyIpCisgICAgICAgICAgICByZXEuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoIkNvbnRlbnQtdHlwZSIsICJiYXIiKQorICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJIb3N0IiwgImJheiIpCisgICAgICAgICAgICByZXEuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoIlNwYW0iLCAiZm9vIikKKyAgICAgICAgICAgIG5ld3JlcSA9IGguZG9fcmVxdWVzdF8ocmVxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkNvbnRlbnQtbGVuZ3RoIl0sICJmb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkNvbnRlbnQtdHlwZSJdLCAiYmFyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJIb3N0Il0sICJiYXoiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIlNwYW0iXSwgImZvbyIpCisKKyAgICBkZWYgdGVzdF9odHRwX2RvdWJsZXNsYXNoKHNlbGYpOgorICAgICAgICAjIENoZWNrcyB0aGF0IHRoZSBwcmVzZW5jZSBvZiBhbiB1bm5lY2Vzc2FyeSBkb3VibGUgc2xhc2ggaW4gYSB1cmwgZG9lc24ndCBicmVhayBhbnl0aGluZworICAgICAgICAjIFByZXZpb3VzbHksIGEgZG91YmxlIHNsYXNoIGRpcmVjdGx5IGFmdGVyIHRoZSBob3N0IGNvdWxkIGNhdXNlIGluY29ycmVjdCBwYXJzaW5nIG9mIHRoZSB1cmwKKyAgICAgICAgaCA9IHVybGxpYjIuQWJzdHJhY3RIVFRQSGFuZGxlcigpCisgICAgICAgIG8gPSBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorCisgICAgICAgIGRhdGEgPSAiIgorICAgICAgICBkc191cmxzID0gWworICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS9mb28vYmFyL2Jhei5odG1sIiwKKyAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vL2Zvby9iYXIvYmF6Lmh0bWwiLAorICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS9mb28vL2Jhci9iYXouaHRtbCIsCisgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUuY29tL2Zvby9iYXIvL2Jhei5odG1sIiwKKyAgICAgICAgXQorCisgICAgICAgIGZvciBkc191cmwgaW4gZHNfdXJsczoKKyAgICAgICAgICAgIGRzX3JlcSA9IFJlcXVlc3QoZHNfdXJsLCBkYXRhKQorCisgICAgICAgICAgICAjIENoZWNrIHdoZXRoZXIgaG9zdCBpcyBkZXRlcm1pbmVkIGNvcnJlY3RseSBpZiB0aGVyZSBpcyBubyBwcm94eQorICAgICAgICAgICAgbnBfZHNfcmVxID0gaC5kb19yZXF1ZXN0Xyhkc19yZXEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5wX2RzX3JlcS51bnJlZGlyZWN0ZWRfaGRyc1siSG9zdCJdLCJleGFtcGxlLmNvbSIpCisKKyAgICAgICAgICAgICMgQ2hlY2sgd2hldGhlciBob3N0IGlzIGRldGVybWluZWQgY29ycmVjdGx5IGlmIHRoZXJlIGlzIGEgcHJveHkKKyAgICAgICAgICAgIGRzX3JlcS5zZXRfcHJveHkoInNvbWVwcm94eTozMTI4IixOb25lKQorICAgICAgICAgICAgcF9kc19yZXEgPSBoLmRvX3JlcXVlc3RfKGRzX3JlcSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocF9kc19yZXEudW5yZWRpcmVjdGVkX2hkcnNbIkhvc3QiXSwiZXhhbXBsZS5jb20iKQorCisgICAgZGVmIHRlc3RfZml4cGF0aF9pbl93ZWlyZHVybHMoc2VsZik6CisgICAgICAgICMgSXNzdWU0NDkzOiB1cmxsaWIyIHRvIHN1cHBseSAnLycgd2hlbiB0byB1cmxzIHdoZXJlIHBhdGggZG9lcyBub3QKKyAgICAgICAgIyBzdGFydCB3aXRoJy8nCisKKyAgICAgICAgaCA9IHVybGxpYjIuQWJzdHJhY3RIVFRQSGFuZGxlcigpCisgICAgICAgIG8gPSBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorCisgICAgICAgIHdlaXJkX3VybCA9ICdodHRwOi8vd3d3LnB5dGhvbi5vcmc/Z2V0c3BhbScKKyAgICAgICAgcmVxID0gUmVxdWVzdCh3ZWlyZF91cmwpCisgICAgICAgIG5ld3JlcSA9IGguZG9fcmVxdWVzdF8ocmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld3JlcS5nZXRfaG9zdCgpLCd3d3cucHl0aG9uLm9yZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3cmVxLmdldF9zZWxlY3RvcigpLCcvP2dldHNwYW0nKQorCisgICAgICAgIHVybF93aXRob3V0X3BhdGggPSAnaHR0cDovL3d3dy5weXRob24ub3JnJworICAgICAgICByZXEgPSBSZXF1ZXN0KHVybF93aXRob3V0X3BhdGgpCisgICAgICAgIG5ld3JlcSA9IGguZG9fcmVxdWVzdF8ocmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld3JlcS5nZXRfaG9zdCgpLCd3d3cucHl0aG9uLm9yZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3cmVxLmdldF9zZWxlY3RvcigpLCcnKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBoID0gdXJsbGliMi5IVFRQRXJyb3JQcm9jZXNzb3IoKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKKworICAgICAgICB1cmwgPSAiaHR0cDovL2V4YW1wbGUuY29tLyIKKyAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwpCisgICAgICAgICMgYWxsIDJ4eCBhcmUgcGFzc2VkIHRocm91Z2gKKyAgICAgICAgciA9IE1vY2tSZXNwb25zZSgyMDAsICJPSyIsIHt9LCAiIiwgdXJsKQorICAgICAgICBuZXdyID0gaC5odHRwX3Jlc3BvbnNlKHJlcSwgcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIgaXMgbmV3cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKG8sICJwcm90byIpKSAgIyBvLmVycm9yIG5vdCBjYWxsZWQKKyAgICAgICAgciA9IE1vY2tSZXNwb25zZSgyMDIsICJBY2NlcHRlZCIsIHt9LCAiIiwgdXJsKQorICAgICAgICBuZXdyID0gaC5odHRwX3Jlc3BvbnNlKHJlcSwgcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIgaXMgbmV3cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKG8sICJwcm90byIpKSAgIyBvLmVycm9yIG5vdCBjYWxsZWQKKyAgICAgICAgciA9IE1vY2tSZXNwb25zZSgyMDYsICJQYXJ0aWFsIGNvbnRlbnQiLCB7fSwgIiIsIHVybCkKKyAgICAgICAgbmV3ciA9IGguaHR0cF9yZXNwb25zZShyZXEsIHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyIGlzIG5ld3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihvLCAicHJvdG8iKSkgICMgby5lcnJvciBub3QgY2FsbGVkCisgICAgICAgICMgYW55dGhpbmcgZWxzZSBjYWxscyBvLmVycm9yIChhbmQgTW9ja09wZW5lciByZXR1cm5zIE5vbmUsIGhlcmUpCisgICAgICAgIHIgPSBNb2NrUmVzcG9uc2UoNTAyLCAiQmFkIGdhdGV3YXkiLCB7fSwgIiIsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGguaHR0cF9yZXNwb25zZShyZXEsIHIpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5wcm90bywgImh0dHAiKSAgIyBvLmVycm9yIGNhbGxlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uYXJncywgKHJlcSwgciwgNTAyLCAiQmFkIGdhdGV3YXkiLCB7fSkpCisKKyAgICBkZWYgdGVzdF9jb29raWVzKHNlbGYpOgorICAgICAgICBjaiA9IE1vY2tDb29raWVKYXIoKQorICAgICAgICBoID0gdXJsbGliMi5IVFRQQ29va2llUHJvY2Vzc29yKGNqKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICAgICAgciA9IE1vY2tSZXNwb25zZSgyMDAsICJPSyIsIHt9LCAiIikKKyAgICAgICAgbmV3cmVxID0gaC5odHRwX3JlcXVlc3QocmVxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2ouYWNoX3JlcSBpcyByZXEgaXMgbmV3cmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfb3JpZ2luX3JlcV9ob3N0KCksICJleGFtcGxlLmNvbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcmVxLmlzX3VudmVyaWZpYWJsZSgpKQorICAgICAgICBuZXdyID0gaC5odHRwX3Jlc3BvbnNlKHJlcSwgcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNqLmVjX3JlcSBpcyByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjai5lY19yIGlzIHIgaXMgbmV3cikKKworICAgIGRlZiB0ZXN0X3JlZGlyZWN0KHNlbGYpOgorICAgICAgICBmcm9tX3VybCA9ICJodHRwOi8vZXhhbXBsZS5jb20vYS5odG1sIgorICAgICAgICB0b191cmwgPSAiaHR0cDovL2V4YW1wbGUuY29tL2IuaHRtbCIKKyAgICAgICAgaCA9IHVybGxpYjIuSFRUUFJlZGlyZWN0SGFuZGxlcigpCisgICAgICAgIG8gPSBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorCisgICAgICAgICMgb3JkaW5hcnkgcmVkaXJlY3QgYmVoYXZpb3VyCisgICAgICAgIGZvciBjb2RlIGluIDMwMSwgMzAyLCAzMDMsIDMwNzoKKyAgICAgICAgICAgIGZvciBkYXRhIGluIE5vbmUsICJibGFoXG5ibGFoXG4iOgorICAgICAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoaCwgImh0dHBfZXJyb3JfJXMiICUgY29kZSkKKyAgICAgICAgICAgICAgICByZXEgPSBSZXF1ZXN0KGZyb21fdXJsLCBkYXRhKQorICAgICAgICAgICAgICAgIHJlcS5hZGRfaGVhZGVyKCJOb25zZW5zZSIsICJ2aWtpbmc9d2l0aGhvbGQiKQorICAgICAgICAgICAgICAgIHJlcS50aW1lb3V0ID0gc29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VUCisgICAgICAgICAgICAgICAgaWYgZGF0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmVxLmFkZF9oZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgc3RyKGxlbihkYXRhKSkpCisgICAgICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJTcGFtIiwgInNwYW0iKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kKHJlcSwgTW9ja0ZpbGUoKSwgY29kZSwgIkJsYWgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9ja0hlYWRlcnMoeyJsb2NhdGlvbiI6IHRvX3VybH0pKQorICAgICAgICAgICAgICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyAzMDcgaW4gcmVzcG9uc2UgdG8gUE9TVCByZXF1aXJlcyB1c2VyIE9LCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2RlID09IDMwNyBhbmQgZGF0YSBpcyBub3QgTm9uZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8ucmVxLmdldF9mdWxsX3VybCgpLCB0b191cmwpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8ucmVxLmdldF9tZXRob2QoKSwgIkdFVCIpCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG8ucmVxLmhhc19kYXRhKCkpCisKKyAgICAgICAgICAgICAgICAjIG5vdyBpdCdzIGEgR0VULCB0aGVyZSBzaG91bGQgbm90IGJlIGhlYWRlcnMgcmVnYXJkaW5nIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAjIChwb3NzaWJseSBkcmFnZ2VkIGZyb20gYmVmb3JlIGJlaW5nIGEgUE9TVCkKKyAgICAgICAgICAgICAgICBoZWFkZXJzID0gW3gubG93ZXIoKSBmb3IgeCBpbiBvLnJlcS5oZWFkZXJzXQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oImNvbnRlbnQtbGVuZ3RoIiwgaGVhZGVycykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJjb250ZW50LXR5cGUiLCBoZWFkZXJzKQorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLnJlcS5oZWFkZXJzWyJOb25zZW5zZSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpa2luZz13aXRoaG9sZCIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiU3BhbSIsIG8ucmVxLmhlYWRlcnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiU3BhbSIsIG8ucmVxLnVucmVkaXJlY3RlZF9oZHJzKQorCisgICAgICAgICMgbG9vcCBkZXRlY3Rpb24KKyAgICAgICAgcmVxID0gUmVxdWVzdChmcm9tX3VybCkKKyAgICAgICAgcmVxLnRpbWVvdXQgPSBzb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQKKyAgICAgICAgZGVmIHJlZGlyZWN0KGgsIHJlcSwgdXJsPXRvX3VybCk6CisgICAgICAgICAgICBoLmh0dHBfZXJyb3JfMzAyKHJlcSwgTW9ja0ZpbGUoKSwgMzAyLCAiQmxhaCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vY2tIZWFkZXJzKHsibG9jYXRpb24iOiB1cmx9KSkKKyAgICAgICAgIyBOb3RlIHRoYXQgdGhlICpvcmlnaW5hbCogcmVxdWVzdCBzaGFyZXMgdGhlIHNhbWUgcmVjb3JkIG9mCisgICAgICAgICMgcmVkaXJlY3Rpb25zIHdpdGggdGhlIHN1Yi1yZXF1ZXN0cyBjYXVzZWQgYnkgdGhlIHJlZGlyZWN0aW9ucy4KKworICAgICAgICAjIGRldGVjdCBpbmZpbml0ZSBsb29wIHJlZGlyZWN0IG9mIGEgVVJMIHRvIGl0c2VsZgorICAgICAgICByZXEgPSBSZXF1ZXN0KGZyb21fdXJsLCBvcmlnaW5fcmVxX2hvc3Q9ImV4YW1wbGUuY29tIikKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHJlcS50aW1lb3V0ID0gc29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VUCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgcmVkaXJlY3QoaCwgcmVxLCAiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yOgorICAgICAgICAgICAgIyBkb24ndCBzdG9wIHVudGlsIG1heF9yZXBlYXRzLCBiZWNhdXNlIGNvb2tpZXMgbWF5IGludHJvZHVjZSBzdGF0ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgdXJsbGliMi5IVFRQUmVkaXJlY3RIYW5kbGVyLm1heF9yZXBlYXRzKQorCisgICAgICAgICMgZGV0ZWN0IGVuZGxlc3Mgbm9uLXJlcGVhdGluZyBjaGFpbiBvZiByZWRpcmVjdHMKKyAgICAgICAgcmVxID0gUmVxdWVzdChmcm9tX3VybCwgb3JpZ2luX3JlcV9ob3N0PSJleGFtcGxlLmNvbSIpCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICByZXEudGltZW91dCA9IHNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVAorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHJlZGlyZWN0KGgsIHJlcSwgImh0dHA6Ly9leGFtcGxlLmNvbS8lZCIgJSBjb3VudCkKKyAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3I6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxsaWIyLkhUVFBSZWRpcmVjdEhhbmRsZXIubWF4X3JlZGlyZWN0aW9ucykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfcmVkaXJlY3Qoc2VsZik6CisgICAgICAgIGZyb21fdXJsID0gImh0dHA6Ly9leGFtcGxlLmNvbS9hLmh0bWwiCisgICAgICAgIHZhbGlkX3NjaGVtZXMgPSBbJ2h0dHAnLCAnaHR0cHMnLCAnZnRwJ10KKyAgICAgICAgaW52YWxpZF9zY2hlbWVzID0gWydmaWxlJywgJ2ltYXAnLCAnbGRhcCddCisgICAgICAgIHNjaGVtZWxlc3NfdXJsID0gImV4YW1wbGUuY29tL2IuaHRtbCIKKyAgICAgICAgaCA9IHVybGxpYjIuSFRUUFJlZGlyZWN0SGFuZGxlcigpCisgICAgICAgIG8gPSBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorICAgICAgICByZXEgPSBSZXF1ZXN0KGZyb21fdXJsKQorICAgICAgICByZXEudGltZW91dCA9IHNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVAorCisgICAgICAgIGZvciBzY2hlbWUgaW4gaW52YWxpZF9zY2hlbWVzOgorICAgICAgICAgICAgaW52YWxpZF91cmwgPSBzY2hlbWUgKyAnOi8vJyArIHNjaGVtZWxlc3NfdXJsCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh1cmxsaWIyLkhUVFBFcnJvciwgaC5odHRwX2Vycm9yXzMwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcSwgTW9ja0ZpbGUoKSwgMzAyLCAiU2VjdXJpdHkgTG9vcGhvbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9ja0hlYWRlcnMoeyJsb2NhdGlvbiI6IGludmFsaWRfdXJsfSkpCisKKyAgICAgICAgZm9yIHNjaGVtZSBpbiB2YWxpZF9zY2hlbWVzOgorICAgICAgICAgICAgdmFsaWRfdXJsID0gc2NoZW1lICsgJzovLycgKyBzY2hlbWVsZXNzX3VybAorICAgICAgICAgICAgaC5odHRwX2Vycm9yXzMwMihyZXEsIE1vY2tGaWxlKCksIDMwMiwgIlRoYXQncyBmaW5lIiwKKyAgICAgICAgICAgICAgICBNb2NrSGVhZGVycyh7ImxvY2F0aW9uIjogdmFsaWRfdXJsfSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8ucmVxLmdldF9mdWxsX3VybCgpLCB2YWxpZF91cmwpCisKKyAgICBkZWYgdGVzdF9jb29raWVfcmVkaXJlY3Qoc2VsZik6CisgICAgICAgICMgY29va2llcyBzaG91bGRuJ3QgbGVhayBpbnRvIHJlZGlyZWN0ZWQgcmVxdWVzdHMKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgorCisgICAgICAgIGZyb20gdGVzdC50ZXN0X2Nvb2tpZWxpYiBpbXBvcnQgaW50ZXJhY3RfbmV0c2NhcGUKKworICAgICAgICBjaiA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGNqLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iLCAic3BhbT1lZ2dzIikKKyAgICAgICAgaGggPSBNb2NrSFRUUEhhbmRsZXIoMzAyLCAiTG9jYXRpb246IGh0dHA6Ly93d3cuY3JhY2tlci5jb20vXHJcblxyXG4iKQorICAgICAgICBoZGVoID0gdXJsbGliMi5IVFRQRGVmYXVsdEVycm9ySGFuZGxlcigpCisgICAgICAgIGhyaCA9IHVybGxpYjIuSFRUUFJlZGlyZWN0SGFuZGxlcigpCisgICAgICAgIGNwID0gdXJsbGliMi5IVFRQQ29va2llUHJvY2Vzc29yKGNqKQorICAgICAgICBvID0gYnVpbGRfdGVzdF9vcGVuZXIoaGgsIGhkZWgsIGhyaCwgY3ApCisgICAgICAgIG8ub3BlbigiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhoLnJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKKworICAgIGRlZiB0ZXN0X3JlZGlyZWN0X2ZyYWdtZW50KHNlbGYpOgorICAgICAgICByZWRpcmVjdGVkX3VybCA9ICdodHRwOi8vd3d3LmV4YW1wbGUuY29tL2luZGV4Lmh0bWwjT0tcclxuXHJcbicKKyAgICAgICAgaGggPSBNb2NrSFRUUEhhbmRsZXIoMzAyLCAnTG9jYXRpb246ICcgKyByZWRpcmVjdGVkX3VybCkKKyAgICAgICAgaGRlaCA9IHVybGxpYjIuSFRUUERlZmF1bHRFcnJvckhhbmRsZXIoKQorICAgICAgICBocmggPSB1cmxsaWIyLkhUVFBSZWRpcmVjdEhhbmRsZXIoKQorICAgICAgICBvID0gYnVpbGRfdGVzdF9vcGVuZXIoaGgsIGhkZWgsIGhyaCkKKyAgICAgICAgZnAgPSBvLm9wZW4oJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLmdldHVybCgpLCByZWRpcmVjdGVkX3VybC5zdHJpcCgpKQorCisgICAgZGVmIHRlc3RfcHJveHkoc2VsZik6CisgICAgICAgIG8gPSBPcGVuZXJEaXJlY3RvcigpCisgICAgICAgIHBoID0gdXJsbGliMi5Qcm94eUhhbmRsZXIoZGljdChodHRwPSJwcm94eS5leGFtcGxlLmNvbTozMTI4IikpCisgICAgICAgIG8uYWRkX2hhbmRsZXIocGgpCisgICAgICAgIG1ldGhfc3BlYyA9IFsKKyAgICAgICAgICAgIFsoImh0dHBfb3BlbiIsICJyZXR1cm4gcmVzcG9uc2UiKV0KKyAgICAgICAgICAgIF0KKyAgICAgICAgaGFuZGxlcnMgPSBhZGRfb3JkZXJlZF9tb2NrX2hhbmRsZXJzKG8sIG1ldGhfc3BlYykKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vYWNtZS5leGFtcGxlLmNvbS8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaG9zdCgpLCAiYWNtZS5leGFtcGxlLmNvbSIpCisgICAgICAgIHIgPSBvLm9wZW4ocmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaG9zdCgpLCAicHJveHkuZXhhbXBsZS5jb206MzEyOCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKGhhbmRsZXJzWzBdLCAiaHR0cF9vcGVuIildLAorICAgICAgICAgICAgICAgICAgICAgICAgIFt0dXBbMDoyXSBmb3IgdHVwIGluIG8uY2FsbHNdKQorCisgICAgZGVmIHRlc3RfcHJveHlfbm9fcHJveHkoc2VsZik6CisgICAgICAgIG9zLmVudmlyb25bJ25vX3Byb3h5J10gPSAncHl0aG9uLm9yZycKKyAgICAgICAgbyA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgcGggPSB1cmxsaWIyLlByb3h5SGFuZGxlcihkaWN0KGh0dHA9InByb3h5LmV4YW1wbGUuY29tIikpCisgICAgICAgIG8uYWRkX2hhbmRsZXIocGgpCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cucGVybC5vcmcvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hvc3QoKSwgInd3dy5wZXJsLm9yZyIpCisgICAgICAgIHIgPSBvLm9wZW4ocmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaG9zdCgpLCAicHJveHkuZXhhbXBsZS5jb20iKQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LnB5dGhvbi5vcmciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaG9zdCgpLCAid3d3LnB5dGhvbi5vcmciKQorICAgICAgICByID0gby5vcGVuKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hvc3QoKSwgInd3dy5weXRob24ub3JnIikKKyAgICAgICAgZGVsIG9zLmVudmlyb25bJ25vX3Byb3h5J10KKworCisgICAgZGVmIHRlc3RfcHJveHlfaHR0cHMoc2VsZik6CisgICAgICAgIG8gPSBPcGVuZXJEaXJlY3RvcigpCisgICAgICAgIHBoID0gdXJsbGliMi5Qcm94eUhhbmRsZXIoZGljdChodHRwcz0ncHJveHkuZXhhbXBsZS5jb206MzEyOCcpKQorICAgICAgICBvLmFkZF9oYW5kbGVyKHBoKQorICAgICAgICBtZXRoX3NwZWMgPSBbCisgICAgICAgICAgICBbKCJodHRwc19vcGVuIiwicmV0dXJuIHJlc3BvbnNlIildCisgICAgICAgIF0KKyAgICAgICAgaGFuZGxlcnMgPSBhZGRfb3JkZXJlZF9tb2NrX2hhbmRsZXJzKG8sIG1ldGhfc3BlYykKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hvc3QoKSwgInd3dy5leGFtcGxlLmNvbSIpCisgICAgICAgIHIgPSBvLm9wZW4ocmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaG9zdCgpLCAicHJveHkuZXhhbXBsZS5jb206MzEyOCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhoYW5kbGVyc1swXSwgImh0dHBzX29wZW4iKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgW3R1cFswOjJdIGZvciB0dXAgaW4gby5jYWxsc10pCisKKyAgICBkZWYgdGVzdF9wcm94eV9odHRwc19wcm94eV9hdXRob3JpemF0aW9uKHNlbGYpOgorICAgICAgICBvID0gT3BlbmVyRGlyZWN0b3IoKQorICAgICAgICBwaCA9IHVybGxpYjIuUHJveHlIYW5kbGVyKGRpY3QoaHR0cHM9J3Byb3h5LmV4YW1wbGUuY29tOjMxMjgnKSkKKyAgICAgICAgby5hZGRfaGFuZGxlcihwaCkKKyAgICAgICAgaHR0cHNfaGFuZGxlciA9IE1vY2tIVFRQU0hhbmRsZXIoKQorICAgICAgICBvLmFkZF9oYW5kbGVyKGh0dHBzX2hhbmRsZXIpCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tLyIpCisgICAgICAgIHJlcS5hZGRfaGVhZGVyKCJQcm94eS1BdXRob3JpemF0aW9uIiwiRm9vQmFyIikKKyAgICAgICAgcmVxLmFkZF9oZWFkZXIoIlVzZXItQWdlbnQiLCJHcmFpbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9ob3N0KCksICJ3d3cuZXhhbXBsZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZXEuX3R1bm5lbF9ob3N0KQorICAgICAgICByID0gby5vcGVuKHJlcSkKKyAgICAgICAgIyBWZXJpZnkgUHJveHktQXV0aG9yaXphdGlvbiBnZXRzIHR1bm5lbGVkIHRvIHJlcXVlc3QuCisgICAgICAgICMgaHR0cHNjb25uIHJlcV9oZWFkZXJzIGRvIG5vdCBoYXZlIHRoZSBQcm94eS1BdXRob3JpemF0aW9uIGhlYWRlciBidXQKKyAgICAgICAgIyB0aGUgcmVxIHdpbGwgaGF2ZS4KKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigoIlByb3h5LUF1dGhvcml6YXRpb24iLCJGb29CYXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBodHRwc19oYW5kbGVyLmh0dHBjb25uLnJlcV9oZWFkZXJzKQorICAgICAgICBzZWxmLmFzc2VydEluKCgiVXNlci1BZ2VudCIsIkdyYWlsIiksCisgICAgICAgICAgICAgICAgICAgICAgaHR0cHNfaGFuZGxlci5odHRwY29ubi5yZXFfaGVhZGVycykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUocmVxLl90dW5uZWxfaG9zdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hvc3QoKSwgInByb3h5LmV4YW1wbGUuY29tOjMxMjgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaGVhZGVyKCJQcm94eS1hdXRob3JpemF0aW9uIiksIkZvb0JhciIpCisKKyAgICBkZWYgdGVzdF9iYXNpY19hdXRoKHNlbGYsIHF1b3RlX2NoYXI9JyInKToKKyAgICAgICAgb3BlbmVyID0gT3BlbmVyRGlyZWN0b3IoKQorICAgICAgICBwYXNzd29yZF9tYW5hZ2VyID0gTW9ja1Bhc3N3b3JkTWFuYWdlcigpCisgICAgICAgIGF1dGhfaGFuZGxlciA9IHVybGxpYjIuSFRUUEJhc2ljQXV0aEhhbmRsZXIocGFzc3dvcmRfbWFuYWdlcikKKyAgICAgICAgcmVhbG0gPSAiQUNNRSBXaWRnZXQgU3RvcmUiCisgICAgICAgIGh0dHBfaGFuZGxlciA9IE1vY2tIVFRQSGFuZGxlcigKKyAgICAgICAgICAgIDQwMSwgJ1dXVy1BdXRoZW50aWNhdGU6IEJhc2ljIHJlYWxtPSVzJXMlc1xyXG5cclxuJyAlCisgICAgICAgICAgICAocXVvdGVfY2hhciwgcmVhbG0sIHF1b3RlX2NoYXIpICkKKyAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGF1dGhfaGFuZGxlcikKKyAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGh0dHBfaGFuZGxlcikKKyAgICAgICAgc2VsZi5fdGVzdF9iYXNpY19hdXRoKG9wZW5lciwgYXV0aF9oYW5kbGVyLCAiQXV0aG9yaXphdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsbSwgaHR0cF9oYW5kbGVyLCBwYXNzd29yZF9tYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9hY21lLmV4YW1wbGUuY29tL3Byb3RlY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2FjbWUuZXhhbXBsZS5jb20vcHJvdGVjdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9iYXNpY19hdXRoX3dpdGhfc2luZ2xlX3F1b3RlZF9yZWFsbShzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X2Jhc2ljX2F1dGgocXVvdGVfY2hhcj0iJyIpCisKKyAgICBkZWYgdGVzdF9iYXNpY19hdXRoX3dpdGhfdW5xdW90ZWRfcmVhbG0oc2VsZik6CisgICAgICAgIG9wZW5lciA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgcGFzc3dvcmRfbWFuYWdlciA9IE1vY2tQYXNzd29yZE1hbmFnZXIoKQorICAgICAgICBhdXRoX2hhbmRsZXIgPSB1cmxsaWIyLkhUVFBCYXNpY0F1dGhIYW5kbGVyKHBhc3N3b3JkX21hbmFnZXIpCisgICAgICAgIHJlYWxtID0gIkFDTUUgV2lkZ2V0IFN0b3JlIgorICAgICAgICBodHRwX2hhbmRsZXIgPSBNb2NrSFRUUEhhbmRsZXIoCisgICAgICAgICAgICA0MDEsICdXV1ctQXV0aGVudGljYXRlOiBCYXNpYyByZWFsbT0lc1xyXG5cclxuJyAlIHJlYWxtKQorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoYXV0aF9oYW5kbGVyKQorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoaHR0cF9oYW5kbGVyKQorICAgICAgICBtc2cgPSAiQmFzaWMgQXV0aCBSZWFsbSB3YXMgdW5xdW90ZWQiCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKChtc2csIFVzZXJXYXJuaW5nKSk6CisgICAgICAgICAgICBzZWxmLl90ZXN0X2Jhc2ljX2F1dGgob3BlbmVyLCBhdXRoX2hhbmRsZXIsICJBdXRob3JpemF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsbSwgaHR0cF9oYW5kbGVyLCBwYXNzd29yZF9tYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYWNtZS5leGFtcGxlLmNvbS9wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYWNtZS5leGFtcGxlLmNvbS9wcm90ZWN0ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKworICAgIGRlZiB0ZXN0X3Byb3h5X2Jhc2ljX2F1dGgoc2VsZik6CisgICAgICAgIG9wZW5lciA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgcGggPSB1cmxsaWIyLlByb3h5SGFuZGxlcihkaWN0KGh0dHA9InByb3h5LmV4YW1wbGUuY29tOjMxMjgiKSkKKyAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKHBoKQorICAgICAgICBwYXNzd29yZF9tYW5hZ2VyID0gTW9ja1Bhc3N3b3JkTWFuYWdlcigpCisgICAgICAgIGF1dGhfaGFuZGxlciA9IHVybGxpYjIuUHJveHlCYXNpY0F1dGhIYW5kbGVyKHBhc3N3b3JkX21hbmFnZXIpCisgICAgICAgIHJlYWxtID0gIkFDTUUgTmV0d29ya3MiCisgICAgICAgIGh0dHBfaGFuZGxlciA9IE1vY2tIVFRQSGFuZGxlcigKKyAgICAgICAgICAgIDQwNywgJ1Byb3h5LUF1dGhlbnRpY2F0ZTogQmFzaWMgcmVhbG09IiVzIlxyXG5cclxuJyAlIHJlYWxtKQorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoYXV0aF9oYW5kbGVyKQorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoaHR0cF9oYW5kbGVyKQorICAgICAgICBzZWxmLl90ZXN0X2Jhc2ljX2F1dGgob3BlbmVyLCBhdXRoX2hhbmRsZXIsICJQcm94eS1hdXRob3JpemF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxtLCBodHRwX2hhbmRsZXIsIHBhc3N3b3JkX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2FjbWUuZXhhbXBsZS5jb206MzEyOC9wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3h5LmV4YW1wbGUuY29tOjMxMjgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYmFzaWNfYW5kX2RpZ2VzdF9hdXRoX2hhbmRsZXJzKHNlbGYpOgorICAgICAgICAjIEhUVFBEaWdlc3RBdXRoSGFuZGxlciByYWlzZWQgYW4gZXhjZXB0aW9uIGlmIGl0IGNvdWxkbid0IGhhbmRsZSBhIDQwKgorICAgICAgICAjIHJlc3BvbnNlIChodHRwOi8vcHl0aG9uLm9yZy9zZi8xNDc5MzAyKSwgd2hlcmUgaXQgc2hvdWxkIGluc3RlYWQKKyAgICAgICAgIyByZXR1cm4gTm9uZSB0byBhbGxvdyBhbm90aGVyIGhhbmRsZXIgKGVzcGVjaWFsbHkKKyAgICAgICAgIyBIVFRQQmFzaWNBdXRoSGFuZGxlcikgdG8gaGFuZGxlIHRoZSByZXNwb25zZS4KKworICAgICAgICAjIEFsc28gKGh0dHA6Ly9weXRob24ub3JnL3NmLzE0Nzk3MDI3LCBSRkMgMjYxNyBzZWN0aW9uIDEuMiksIHdlIG11c3QKKyAgICAgICAgIyB0cnkgZGlnZXN0IGZpcnN0IChzaW5jZSBpdCdzIHRoZSBzdHJvbmdlc3QgYXV0aCBzY2hlbWUpLCBzbyB3ZSByZWNvcmQKKyAgICAgICAgIyBvcmRlciBvZiBjYWxscyBoZXJlIHRvIGNoZWNrIGRpZ2VzdCBjb21lcyBmaXJzdDoKKyAgICAgICAgY2xhc3MgUmVjb3JkaW5nT3BlbmVyRGlyZWN0b3IoT3BlbmVyRGlyZWN0b3IpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIE9wZW5lckRpcmVjdG9yLl9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5yZWNvcmRlZCA9IFtdCisgICAgICAgICAgICBkZWYgcmVjb3JkKHNlbGYsIGluZm8pOgorICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkZWQuYXBwZW5kKGluZm8pCisgICAgICAgIGNsYXNzIFRlc3REaWdlc3RBdXRoSGFuZGxlcih1cmxsaWIyLkhUVFBEaWdlc3RBdXRoSGFuZGxlcik6CisgICAgICAgICAgICBkZWYgaHR0cF9lcnJvcl80MDEoc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmVjb3JkKCJkaWdlc3QiKQorICAgICAgICAgICAgICAgIHVybGxpYjIuSFRUUERpZ2VzdEF1dGhIYW5kbGVyLmh0dHBfZXJyb3JfNDAxKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ3MsICoqa3dkcykKKyAgICAgICAgY2xhc3MgVGVzdEJhc2ljQXV0aEhhbmRsZXIodXJsbGliMi5IVFRQQmFzaWNBdXRoSGFuZGxlcik6CisgICAgICAgICAgICBkZWYgaHR0cF9lcnJvcl80MDEoc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQucmVjb3JkKCJiYXNpYyIpCisgICAgICAgICAgICAgICAgdXJsbGliMi5IVFRQQmFzaWNBdXRoSGFuZGxlci5odHRwX2Vycm9yXzQwMShzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFyZ3MsICoqa3dkcykKKworICAgICAgICBvcGVuZXIgPSBSZWNvcmRpbmdPcGVuZXJEaXJlY3RvcigpCisgICAgICAgIHBhc3N3b3JkX21hbmFnZXIgPSBNb2NrUGFzc3dvcmRNYW5hZ2VyKCkKKyAgICAgICAgZGlnZXN0X2hhbmRsZXIgPSBUZXN0RGlnZXN0QXV0aEhhbmRsZXIocGFzc3dvcmRfbWFuYWdlcikKKyAgICAgICAgYmFzaWNfaGFuZGxlciA9IFRlc3RCYXNpY0F1dGhIYW5kbGVyKHBhc3N3b3JkX21hbmFnZXIpCisgICAgICAgIHJlYWxtID0gIkFDTUUgTmV0d29ya3MiCisgICAgICAgIGh0dHBfaGFuZGxlciA9IE1vY2tIVFRQSGFuZGxlcigKKyAgICAgICAgICAgIDQwMSwgJ1dXVy1BdXRoZW50aWNhdGU6IEJhc2ljIHJlYWxtPSIlcyJcclxuXHJcbicgJSByZWFsbSkKKyAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGJhc2ljX2hhbmRsZXIpCisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihkaWdlc3RfaGFuZGxlcikKKyAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGh0dHBfaGFuZGxlcikKKworICAgICAgICAjIGNoZWNrIGJhc2ljIGF1dGggaXNuJ3QgYmxvY2tlZCBieSBkaWdlc3QgaGFuZGxlciBmYWlsaW5nCisgICAgICAgIHNlbGYuX3Rlc3RfYmFzaWNfYXV0aChvcGVuZXIsIGJhc2ljX2hhbmRsZXIsICJBdXRob3JpemF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxtLCBodHRwX2hhbmRsZXIsIHBhc3N3b3JkX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2FjbWUuZXhhbXBsZS5jb20vcHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYWNtZS5leGFtcGxlLmNvbS9wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAjIGNoZWNrIGRpZ2VzdCB3YXMgdHJpZWQgYmVmb3JlIGJhc2ljICh0d2ljZSwgYmVjYXVzZQorICAgICAgICAjIF90ZXN0X2Jhc2ljX2F1dGggY2FsbGVkIC5vcGVuKCkgdHdpY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlbmVyLnJlY29yZGVkLCBbImRpZ2VzdCIsICJiYXNpYyJdKjIpCisKKyAgICBkZWYgX3Rlc3RfYmFzaWNfYXV0aChzZWxmLCBvcGVuZXIsIGF1dGhfaGFuZGxlciwgYXV0aF9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0sIGh0dHBfaGFuZGxlciwgcGFzc3dvcmRfbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3VybCwgcHJvdGVjdGVkX3VybCk6CisgICAgICAgIGltcG9ydCBiYXNlNjQKKyAgICAgICAgdXNlciwgcGFzc3dvcmQgPSAid2lsZSIsICJjb3lvdGUiCisKKyAgICAgICAgIyAuYWRkX3Bhc3N3b3JkKCkgZmVkIHRocm91Z2ggdG8gcGFzc3dvcmQgbWFuYWdlcgorICAgICAgICBhdXRoX2hhbmRsZXIuYWRkX3Bhc3N3b3JkKHJlYWxtLCByZXF1ZXN0X3VybCwgdXNlciwgcGFzc3dvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbG0sIHBhc3N3b3JkX21hbmFnZXIucmVhbG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxdWVzdF91cmwsIHBhc3N3b3JkX21hbmFnZXIudXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVzZXIsIHBhc3N3b3JkX21hbmFnZXIudXNlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzd29yZCwgcGFzc3dvcmRfbWFuYWdlci5wYXNzd29yZCkKKworICAgICAgICByID0gb3BlbmVyLm9wZW4ocmVxdWVzdF91cmwpCisKKyAgICAgICAgIyBzaG91bGQgaGF2ZSBhc2tlZCB0aGUgcGFzc3dvcmQgbWFuYWdlciBmb3IgdGhlIHVzZXJuYW1lL3Bhc3N3b3JkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFzc3dvcmRfbWFuYWdlci50YXJnZXRfcmVhbG0sIHJlYWxtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3N3b3JkX21hbmFnZXIudGFyZ2V0X3VybCwgcHJvdGVjdGVkX3VybCkKKworICAgICAgICAjIGV4cGVjdCBvbmUgcmVxdWVzdCB3aXRob3V0IGF1dGhvcml6YXRpb24sIHRoZW4gb25lIHdpdGgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaHR0cF9oYW5kbGVyLnJlcXVlc3RzKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShodHRwX2hhbmRsZXIucmVxdWVzdHNbMF0uaGFzX2hlYWRlcihhdXRoX2hlYWRlcikpCisgICAgICAgIHVzZXJwYXNzID0gJyVzOiVzJyAlICh1c2VyLCBwYXNzd29yZCkKKyAgICAgICAgYXV0aF9oZHJfdmFsdWUgPSAnQmFzaWMgJytiYXNlNjQuZW5jb2Rlc3RyaW5nKHVzZXJwYXNzKS5zdHJpcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHR0cF9oYW5kbGVyLnJlcXVlc3RzWzFdLmdldF9oZWFkZXIoYXV0aF9oZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfaGRyX3ZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGh0dHBfaGFuZGxlci5yZXF1ZXN0c1sxXS51bnJlZGlyZWN0ZWRfaGRyc1thdXRoX2hlYWRlcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aF9oZHJfdmFsdWUpCisgICAgICAgICMgaWYgdGhlIHBhc3N3b3JkIG1hbmFnZXIgY2FuJ3QgZmluZCBhIHBhc3N3b3JkLCB0aGUgaGFuZGxlciB3b24ndAorICAgICAgICAjIGhhbmRsZSB0aGUgSFRUUCBhdXRoIGVycm9yCisgICAgICAgIHBhc3N3b3JkX21hbmFnZXIudXNlciA9IHBhc3N3b3JkX21hbmFnZXIucGFzc3dvcmQgPSBOb25lCisgICAgICAgIGh0dHBfaGFuZGxlci5yZXNldCgpCisgICAgICAgIHIgPSBvcGVuZXIub3BlbihyZXF1ZXN0X3VybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaHR0cF9oYW5kbGVyLnJlcXVlc3RzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShodHRwX2hhbmRsZXIucmVxdWVzdHNbMF0uaGFzX2hlYWRlcihhdXRoX2hlYWRlcikpCisKK2NsYXNzIE1pc2NUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9idWlsZF9vcGVuZXIoc2VsZik6CisgICAgICAgIGNsYXNzIE15SFRUUEhhbmRsZXIodXJsbGliMi5IVFRQSGFuZGxlcik6IHBhc3MKKyAgICAgICAgY2xhc3MgRm9vSGFuZGxlcih1cmxsaWIyLkJhc2VIYW5kbGVyKToKKyAgICAgICAgICAgIGRlZiBmb29fb3BlbihzZWxmKTogcGFzcworICAgICAgICBjbGFzcyBCYXJIYW5kbGVyKHVybGxpYjIuQmFzZUhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIGJhcl9vcGVuKHNlbGYpOiBwYXNzCisKKyAgICAgICAgYnVpbGRfb3BlbmVyID0gdXJsbGliMi5idWlsZF9vcGVuZXIKKworICAgICAgICBvID0gYnVpbGRfb3BlbmVyKEZvb0hhbmRsZXIsIEJhckhhbmRsZXIpCisgICAgICAgIHNlbGYub3BlbmVyX2hhc19oYW5kbGVyKG8sIEZvb0hhbmRsZXIpCisgICAgICAgIHNlbGYub3BlbmVyX2hhc19oYW5kbGVyKG8sIEJhckhhbmRsZXIpCisKKyAgICAgICAgIyBjYW4gdGFrZSBhIG1peCBvZiBjbGFzc2VzIGFuZCBpbnN0YW5jZXMKKyAgICAgICAgbyA9IGJ1aWxkX29wZW5lcihGb29IYW5kbGVyLCBCYXJIYW5kbGVyKCkpCisgICAgICAgIHNlbGYub3BlbmVyX2hhc19oYW5kbGVyKG8sIEZvb0hhbmRsZXIpCisgICAgICAgIHNlbGYub3BlbmVyX2hhc19oYW5kbGVyKG8sIEJhckhhbmRsZXIpCisKKyAgICAgICAgIyBzdWJjbGFzc2VzIG9mIGRlZmF1bHQgaGFuZGxlcnMgb3ZlcnJpZGUgZGVmYXVsdCBoYW5kbGVycworICAgICAgICBvID0gYnVpbGRfb3BlbmVyKE15SFRUUEhhbmRsZXIpCisgICAgICAgIHNlbGYub3BlbmVyX2hhc19oYW5kbGVyKG8sIE15SFRUUEhhbmRsZXIpCisKKyAgICAgICAgIyBhIHBhcnRpY3VsYXIgY2FzZSBvZiBvdmVycmlkaW5nOiBkZWZhdWx0IGhhbmRsZXJzIGNhbiBiZSBwYXNzZWQKKyAgICAgICAgIyBpbiBleHBsaWNpdGx5CisgICAgICAgIG8gPSBidWlsZF9vcGVuZXIoKQorICAgICAgICBzZWxmLm9wZW5lcl9oYXNfaGFuZGxlcihvLCB1cmxsaWIyLkhUVFBIYW5kbGVyKQorICAgICAgICBvID0gYnVpbGRfb3BlbmVyKHVybGxpYjIuSFRUUEhhbmRsZXIpCisgICAgICAgIHNlbGYub3BlbmVyX2hhc19oYW5kbGVyKG8sIHVybGxpYjIuSFRUUEhhbmRsZXIpCisgICAgICAgIG8gPSBidWlsZF9vcGVuZXIodXJsbGliMi5IVFRQSGFuZGxlcigpKQorICAgICAgICBzZWxmLm9wZW5lcl9oYXNfaGFuZGxlcihvLCB1cmxsaWIyLkhUVFBIYW5kbGVyKQorCisgICAgICAgICMgSXNzdWUyNjcwOiBtdWx0aXBsZSBoYW5kbGVycyBzaGFyaW5nIHRoZSBzYW1lIGJhc2UgY2xhc3MKKyAgICAgICAgY2xhc3MgTXlPdGhlckhUVFBIYW5kbGVyKHVybGxpYjIuSFRUUEhhbmRsZXIpOiBwYXNzCisgICAgICAgIG8gPSBidWlsZF9vcGVuZXIoTXlIVFRQSGFuZGxlciwgTXlPdGhlckhUVFBIYW5kbGVyKQorICAgICAgICBzZWxmLm9wZW5lcl9oYXNfaGFuZGxlcihvLCBNeUhUVFBIYW5kbGVyKQorICAgICAgICBzZWxmLm9wZW5lcl9oYXNfaGFuZGxlcihvLCBNeU90aGVySFRUUEhhbmRsZXIpCisKKyAgICBkZWYgb3BlbmVyX2hhc19oYW5kbGVyKHNlbGYsIG9wZW5lciwgaGFuZGxlcl9jbGFzcyk6CisgICAgICAgIGZvciBoIGluIG9wZW5lci5oYW5kbGVyczoKKyAgICAgICAgICAgIGlmIGguX19jbGFzc19fID09IGhhbmRsZXJfY2xhc3M6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGYWxzZSkKKworY2xhc3MgUmVxdWVzdFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5nZXQgPSB1cmxsaWIyLlJlcXVlc3QoImh0dHA6Ly93d3cucHl0aG9uLm9yZy9+amVyZW15LyIpCisgICAgICAgIHNlbGYucG9zdCA9IHVybGxpYjIuUmVxdWVzdCgiaHR0cDovL3d3dy5weXRob24ub3JnL35qZXJlbXkvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJYLVRlc3QiOiAidGVzdCJ9KQorCisgICAgZGVmIHRlc3RfbWV0aG9kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJQT1NUIiwgc2VsZi5wb3N0LmdldF9tZXRob2QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiR0VUIiwgc2VsZi5nZXQuZ2V0X21ldGhvZCgpKQorCisgICAgZGVmIHRlc3RfYWRkX2RhdGEoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc2VsZi5nZXQuaGFzX2RhdGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiR0VUIiwgc2VsZi5nZXQuZ2V0X21ldGhvZCgpKQorICAgICAgICBzZWxmLmdldC5hZGRfZGF0YSgic3BhbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmdldC5oYXNfZGF0YSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJQT1NUIiwgc2VsZi5nZXQuZ2V0X21ldGhvZCgpKQorCisgICAgZGVmIHRlc3RfZ2V0X2Z1bGxfdXJsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvfmplcmVteS8iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0LmdldF9mdWxsX3VybCgpKQorCisgICAgZGVmIHRlc3Rfc2VsZWN0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIi9+amVyZW15LyIsIHNlbGYuZ2V0LmdldF9zZWxlY3RvcigpKQorICAgICAgICByZXEgPSB1cmxsaWIyLlJlcXVlc3QoImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIvIiwgcmVxLmdldF9zZWxlY3RvcigpKQorCisgICAgZGVmIHRlc3RfZ2V0X3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImh0dHAiLCBzZWxmLmdldC5nZXRfdHlwZSgpKQorCisgICAgZGVmIHRlc3RfZ2V0X2hvc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInd3dy5weXRob24ub3JnIiwgc2VsZi5nZXQuZ2V0X2hvc3QoKSkKKworICAgIGRlZiB0ZXN0X2dldF9ob3N0X3VucXVvdGUoc2VsZik6CisgICAgICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdCgiaHR0cDovL3d3dy4lNzB5dGhvbi5vcmcvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgid3d3LnB5dGhvbi5vcmciLCByZXEuZ2V0X2hvc3QoKSkKKworICAgIGRlZiB0ZXN0X3Byb3h5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuZ2V0Lmhhc19wcm94eSgpKQorICAgICAgICBzZWxmLmdldC5zZXRfcHJveHkoInd3dy5wZXJsLm9yZyIsICJodHRwIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZ2V0Lmhhc19wcm94eSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ3d3cucHl0aG9uLm9yZyIsIHNlbGYuZ2V0LmdldF9vcmlnaW5fcmVxX2hvc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgid3d3LnBlcmwub3JnIiwgc2VsZi5nZXQuZ2V0X2hvc3QoKSkKKworICAgIGRlZiB0ZXN0X3dyYXBwZWRfdXJsKHNlbGYpOgorICAgICAgICByZXEgPSBSZXF1ZXN0KCI8VVJMOmh0dHA6Ly93d3cucHl0aG9uLm9yZz4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ3d3cucHl0aG9uLm9yZyIsIHJlcS5nZXRfaG9zdCgpKQorCisgICAgZGVmIHRlc3RfdXJsX2ZyYWdtZW50KHNlbGYpOgorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvP3FzPXF1ZXJ5I2ZyYWdtZW50PXRydWUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIvP3FzPXF1ZXJ5IiwgcmVxLmdldF9zZWxlY3RvcigpKQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvI2Z1bj10cnVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiLyIsIHJlcS5nZXRfc2VsZWN0b3IoKSkKKworICAgICAgICAjIElzc3VlIDExNzAzOiBnZXR1cmwoKSBvbWl0cyBmcmFnbWVudCBpbiB0aGUgb3JpZ2luYWwgVVJMLgorICAgICAgICB1cmwgPSAnaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3VybGxpYjIuaHRtbCNPSycKKyAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9mdWxsX3VybCgpLCB1cmwpCisKKyAgICBkZWYgdGVzdF9IVFRQRXJyb3JfaW50ZXJmYWNlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgSXNzdWUgMTMyMTEgcmV2ZWFscyB0aGF0IEhUVFBFcnJvciBkaWRuJ3QgaW1wbGVtZW50IHRoZSBVUkxFcnJvcgorICAgICAgICBpbnRlcmZhY2UgZXZlbiB0aG91Z2ggSFRUUEVycm9yIGlzIGEgc3ViY2xhc3Mgb2YgVVJMRXJyb3IuCisKKyAgICAgICAgPj4+IGVyciA9IHVybGxpYjIuSFRUUEVycm9yKG1zZz0nc29tZXRoaW5nIGJhZCBoYXBwZW5lZCcsIHVybD1Ob25lLCBjb2RlPU5vbmUsIGhkcnM9Tm9uZSwgZnA9Tm9uZSkKKyAgICAgICAgPj4+IGFzc2VydCBoYXNhdHRyKGVyciwgJ3JlYXNvbicpCisgICAgICAgID4+PiBlcnIucmVhc29uCisgICAgICAgICdzb21ldGhpbmcgYmFkIGhhcHBlbmVkJworICAgICAgICAiIiIKKworICAgIGRlZiB0ZXN0X0hUVFBFcnJvcl9pbnRlcmZhY2VfY2FsbChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIElzc3VlIDE1NzAxPSAtIEhUVFBFcnJvciBpbnRlcmZhY2UgaGFzIGluZm8gbWV0aG9kIGF2YWlsYWJsZSBmcm9tIFVSTEVycm9yLgorICAgICAgICAiIiIKKyAgICAgICAgZXJyID0gdXJsbGliMi5IVFRQRXJyb3IobXNnPSdzb21ldGhpbmcgYmFkIGhhcHBlbmVkJywgdXJsPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU9Tm9uZSwgaGRycz0nQ29udGVudC1MZW5ndGg6NDInLCBmcD1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlcnIsICdyZWFzb24nKSkKKyAgICAgICAgYXNzZXJ0IGhhc2F0dHIoZXJyLCAncmVhc29uJykKKyAgICAgICAgYXNzZXJ0IGhhc2F0dHIoZXJyLCAnaW5mbycpCisgICAgICAgIGFzc2VydCBjYWxsYWJsZShlcnIuaW5mbykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXJyLmluZm8oKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoImVyci5pbmZvKCkgZmFpbGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuaW5mbygpLCAiQ29udGVudC1MZW5ndGg6NDIiKQorCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3VybGxpYjIKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF91cmxsaWIyLCB2ZXJib3NlKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdCh1cmxsaWIyLCB2ZXJib3NlKQorICAgIHRlc3RzID0gKFRyaXZpYWxUZXN0cywKKyAgICAgICAgICAgICBPcGVuZXJEaXJlY3RvclRlc3RzLAorICAgICAgICAgICAgIEhhbmRsZXJUZXN0cywKKyAgICAgICAgICAgICBNaXNjVGVzdHMsCisgICAgICAgICAgICAgUmVxdWVzdFRlc3RzKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YjcxNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNDRjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODAyZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weQpAQCAtMCwwICsxLDU1MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCB1cmxwYXJzZQoraW1wb3J0IHVybGxpYjIKK2ltcG9ydCBCYXNlSFRUUFNlcnZlcgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgaGFzaGxpYgorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCittaW1ldG9vbHMgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnbWltZXRvb2xzJywgZGVwcmVjYXRlZD1UcnVlKQordGhyZWFkaW5nID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RocmVhZGluZycpCisKKyMgTG9vcGJhY2sgaHR0cCBzZXJ2ZXIgaW5mcmFzdHJ1Y3R1cmUKKworY2xhc3MgTG9vcGJhY2tIdHRwU2VydmVyKEJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIpOgorICAgICIiIkhUVFAgc2VydmVyIHcvIGEgZmV3IG1vZGlmaWNhdGlvbnMgdGhhdCBtYWtlIGl0IHVzZWZ1bCBmb3IKKyAgICBsb29wYmFjayB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzKToKKyAgICAgICAgQmFzZUhUVFBTZXJ2ZXIuSFRUUFNlcnZlci5fX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RIYW5kbGVyQ2xhc3MpCisKKyAgICAgICAgIyBTZXQgdGhlIHRpbWVvdXQgb2Ygb3VyIGxpc3RlbmluZyBzb2NrZXQgcmVhbGx5IGxvdyBzbworICAgICAgICAjIHRoYXQgd2UgY2FuIHN0b3AgdGhlIHNlcnZlciBlYXNpbHkuCisgICAgICAgIHNlbGYuc29ja2V0LnNldHRpbWVvdXQoMS4wKQorCisgICAgZGVmIGdldF9yZXF1ZXN0KHNlbGYpOgorICAgICAgICAiIiJCYXNlSFRUUFNlcnZlciBtZXRob2QsIG92ZXJyaWRkZW4uIiIiCisKKyAgICAgICAgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MgPSBzZWxmLnNvY2tldC5hY2NlcHQoKQorCisgICAgICAgICMgSXQncyBhIGxvb3BiYWNrIGNvbm5lY3Rpb24sIHNvIHNldHRpbmcgdGhlIHRpbWVvdXQKKyAgICAgICAgIyByZWFsbHkgbG93IHNob3VsZG4ndCBhZmZlY3QgYW55dGhpbmcsIGJ1dCBzaG91bGQgbWFrZQorICAgICAgICAjIGRlYWRsb2NrcyBsZXNzIGxpa2VseSB0byBvY2N1ci4KKyAgICAgICAgcmVxdWVzdC5zZXR0aW1lb3V0KDEwLjApCisKKyAgICAgICAgcmV0dXJuIChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKKworY2xhc3MgTG9vcGJhY2tIdHRwU2VydmVyVGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgorICAgICIiIlN0b3BwYWJsZSB0aHJlYWQgdGhhdCBydW5zIGEgbG9vcGJhY2sgaHR0cCBzZXJ2ZXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVxdWVzdF9oYW5kbGVyKToKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLl9zdG9wID0gRmFsc2UKKyAgICAgICAgc2VsZi5yZWFkeSA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHJlcXVlc3RfaGFuZGxlci5wcm90b2NvbF92ZXJzaW9uID0gIkhUVFAvMS4wIgorICAgICAgICBzZWxmLmh0dHBkID0gTG9vcGJhY2tIdHRwU2VydmVyKCgnMTI3LjAuMC4xJywgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyKQorICAgICAgICAjcHJpbnQgIlNlcnZpbmcgSFRUUCBvbiAlcyBwb3J0ICVzIiAlIChzZWxmLmh0dHBkLnNlcnZlcl9uYW1lLAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmh0dHBkLnNlcnZlcl9wb3J0KQorICAgICAgICBzZWxmLnBvcnQgPSBzZWxmLmh0dHBkLnNlcnZlcl9wb3J0CisKKyAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgIiIiU3RvcHMgdGhlIHdlYnNlcnZlciBpZiBpdCdzIGN1cnJlbnRseSBydW5uaW5nLiIiIgorCisgICAgICAgICMgU2V0IHRoZSBzdG9wIGZsYWcuCisgICAgICAgIHNlbGYuX3N0b3AgPSBUcnVlCisKKyAgICAgICAgc2VsZi5qb2luKCkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYucmVhZHkuc2V0KCkKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuX3N0b3A6CisgICAgICAgICAgICBzZWxmLmh0dHBkLmhhbmRsZV9yZXF1ZXN0KCkKKworIyBBdXRoZW50aWNhdGlvbiBpbmZyYXN0cnVjdHVyZQorCitjbGFzcyBEaWdlc3RBdXRoSGFuZGxlcjoKKyAgICAiIiJIYW5kbGVyIGZvciBwZXJmb3JtaW5nIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fcmVxdWVzdF9udW0gPSAwCisgICAgICAgIHNlbGYuX25vbmNlcyA9IFtdCisgICAgICAgIHNlbGYuX3VzZXJzID0ge30KKyAgICAgICAgc2VsZi5fcmVhbG1fbmFtZSA9ICJUZXN0IFJlYWxtIgorICAgICAgICBzZWxmLl9xb3AgPSAiYXV0aCIKKworICAgIGRlZiBzZXRfcW9wKHNlbGYsIHFvcCk6CisgICAgICAgIHNlbGYuX3FvcCA9IHFvcAorCisgICAgZGVmIHNldF91c2VycyhzZWxmLCB1c2Vycyk6CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHVzZXJzLCBkaWN0KQorICAgICAgICBzZWxmLl91c2VycyA9IHVzZXJzCisKKyAgICBkZWYgc2V0X3JlYWxtKHNlbGYsIHJlYWxtKToKKyAgICAgICAgc2VsZi5fcmVhbG1fbmFtZSA9IHJlYWxtCisKKyAgICBkZWYgX2dlbmVyYXRlX25vbmNlKHNlbGYpOgorICAgICAgICBzZWxmLl9yZXF1ZXN0X251bSArPSAxCisgICAgICAgIG5vbmNlID0gaGFzaGxpYi5tZDUoc3RyKHNlbGYuX3JlcXVlc3RfbnVtKSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgc2VsZi5fbm9uY2VzLmFwcGVuZChub25jZSkKKyAgICAgICAgcmV0dXJuIG5vbmNlCisKKyAgICBkZWYgX2NyZWF0ZV9hdXRoX2RpY3Qoc2VsZiwgYXV0aF9zdHIpOgorICAgICAgICBmaXJzdF9zcGFjZV9pbmRleCA9IGF1dGhfc3RyLmZpbmQoIiAiKQorICAgICAgICBhdXRoX3N0ciA9IGF1dGhfc3RyW2ZpcnN0X3NwYWNlX2luZGV4KzE6XQorCisgICAgICAgIHBhcnRzID0gYXV0aF9zdHIuc3BsaXQoIiwiKQorCisgICAgICAgIGF1dGhfZGljdCA9IHt9CisgICAgICAgIGZvciBwYXJ0IGluIHBhcnRzOgorICAgICAgICAgICAgbmFtZSwgdmFsdWUgPSBwYXJ0LnNwbGl0KCI9IikKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIHZhbHVlWzBdID09ICciJyBhbmQgdmFsdWVbLTFdID09ICciJzoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzE6LTFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3RyaXAoKQorICAgICAgICAgICAgYXV0aF9kaWN0W25hbWVdID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIGF1dGhfZGljdAorCisgICAgZGVmIF92YWxpZGF0ZV9hdXRoKHNlbGYsIGF1dGhfZGljdCwgcGFzc3dvcmQsIG1ldGhvZCwgdXJpKToKKyAgICAgICAgZmluYWxfZGljdCA9IHt9CisgICAgICAgIGZpbmFsX2RpY3QudXBkYXRlKGF1dGhfZGljdCkKKyAgICAgICAgZmluYWxfZGljdFsicGFzc3dvcmQiXSA9IHBhc3N3b3JkCisgICAgICAgIGZpbmFsX2RpY3RbIm1ldGhvZCJdID0gbWV0aG9kCisgICAgICAgIGZpbmFsX2RpY3RbInVyaSJdID0gdXJpCisgICAgICAgIEhBMV9zdHIgPSAiJSh1c2VybmFtZSlzOiUocmVhbG0pczolKHBhc3N3b3JkKXMiICUgZmluYWxfZGljdAorICAgICAgICBIQTEgPSBoYXNobGliLm1kNShIQTFfc3RyKS5oZXhkaWdlc3QoKQorICAgICAgICBIQTJfc3RyID0gIiUobWV0aG9kKXM6JSh1cmkpcyIgJSBmaW5hbF9kaWN0CisgICAgICAgIEhBMiA9IGhhc2hsaWIubWQ1KEhBMl9zdHIpLmhleGRpZ2VzdCgpCisgICAgICAgIGZpbmFsX2RpY3RbIkhBMSJdID0gSEExCisgICAgICAgIGZpbmFsX2RpY3RbIkhBMiJdID0gSEEyCisgICAgICAgIHJlc3BvbnNlX3N0ciA9ICIlKEhBMSlzOiUobm9uY2UpczolKG5jKXM6IiBcCisgICAgICAgICAgICAgICAgICAgICAgICIlKGNub25jZSlzOiUocW9wKXM6JShIQTIpcyIgJSBmaW5hbF9kaWN0CisgICAgICAgIHJlc3BvbnNlID0gaGFzaGxpYi5tZDUocmVzcG9uc2Vfc3RyKS5oZXhkaWdlc3QoKQorCisgICAgICAgIHJldHVybiByZXNwb25zZSA9PSBhdXRoX2RpY3RbInJlc3BvbnNlIl0KKworICAgIGRlZiBfcmV0dXJuX2F1dGhfY2hhbGxlbmdlKHNlbGYsIHJlcXVlc3RfaGFuZGxlcik6CisgICAgICAgIHJlcXVlc3RfaGFuZGxlci5zZW5kX3Jlc3BvbnNlKDQwNywgIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkIikKKyAgICAgICAgcmVxdWVzdF9oYW5kbGVyLnNlbmRfaGVhZGVyKCJDb250ZW50LVR5cGUiLCAidGV4dC9odG1sIikKKyAgICAgICAgcmVxdWVzdF9oYW5kbGVyLnNlbmRfaGVhZGVyKAorICAgICAgICAgICAgJ1Byb3h5LUF1dGhlbnRpY2F0ZScsICdEaWdlc3QgcmVhbG09IiVzIiwgJworICAgICAgICAgICAgJ3FvcD0iJXMiLCcKKyAgICAgICAgICAgICdub25jZT0iJXMiLCAnICUgXAorICAgICAgICAgICAgKHNlbGYuX3JlYWxtX25hbWUsIHNlbGYuX3FvcCwgc2VsZi5fZ2VuZXJhdGVfbm9uY2UoKSkpCisgICAgICAgICMgWFhYOiBOb3Qgc3VyZSBpZiB3ZSdyZSBzdXBwb3NlZCB0byBhZGQgdGhpcyBuZXh0IGhlYWRlciBvcgorICAgICAgICAjIG5vdC4KKyAgICAgICAgI3JlcXVlc3RfaGFuZGxlci5zZW5kX2hlYWRlcignQ29ubmVjdGlvbicsICdjbG9zZScpCisgICAgICAgIHJlcXVlc3RfaGFuZGxlci5lbmRfaGVhZGVycygpCisgICAgICAgIHJlcXVlc3RfaGFuZGxlci53ZmlsZS53cml0ZSgiUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQuIikKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgaGFuZGxlX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdF9oYW5kbGVyKToKKyAgICAgICAgIiIiUGVyZm9ybXMgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIG9uIHRoZSBnaXZlbiBIVFRQIHJlcXVlc3QKKyAgICAgICAgaGFuZGxlci4gIFJldHVybnMgVHJ1ZSBpZiBhdXRoZW50aWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgRmFsc2UKKyAgICAgICAgb3RoZXJ3aXNlLgorCisgICAgICAgIElmIG5vIHVzZXJzIGhhdmUgYmVlbiBzZXQsIHRoZW4gZGlnZXN0IGF1dGggaXMgZWZmZWN0aXZlbHkKKyAgICAgICAgZGlzYWJsZWQgYW5kIHRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiBUcnVlLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBsZW4oc2VsZi5fdXNlcnMpID09IDA6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIGlmICdQcm94eS1BdXRob3JpemF0aW9uJyBub3QgaW4gcmVxdWVzdF9oYW5kbGVyLmhlYWRlcnM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmV0dXJuX2F1dGhfY2hhbGxlbmdlKHJlcXVlc3RfaGFuZGxlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGF1dGhfZGljdCA9IHNlbGYuX2NyZWF0ZV9hdXRoX2RpY3QoCisgICAgICAgICAgICAgICAgcmVxdWVzdF9oYW5kbGVyLmhlYWRlcnNbJ1Byb3h5LUF1dGhvcml6YXRpb24nXQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGlmIGF1dGhfZGljdFsidXNlcm5hbWUiXSBpbiBzZWxmLl91c2VyczoKKyAgICAgICAgICAgICAgICBwYXNzd29yZCA9IHNlbGYuX3VzZXJzWyBhdXRoX2RpY3RbInVzZXJuYW1lIl0gXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmV0dXJuX2F1dGhfY2hhbGxlbmdlKHJlcXVlc3RfaGFuZGxlcikKKyAgICAgICAgICAgIGlmIG5vdCBhdXRoX2RpY3QuZ2V0KCJub25jZSIpIGluIHNlbGYuX25vbmNlczoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmV0dXJuX2F1dGhfY2hhbGxlbmdlKHJlcXVlc3RfaGFuZGxlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fbm9uY2VzLnJlbW92ZShhdXRoX2RpY3RbIm5vbmNlIl0pCisKKyAgICAgICAgICAgIGF1dGhfdmFsaWRhdGVkID0gRmFsc2UKKworICAgICAgICAgICAgIyBNU0lFIHVzZXMgc2hvcnRfcGF0aCBpbiBpdHMgdmFsaWRhdGlvbiwgYnV0IFB5dGhvbidzCisgICAgICAgICAgICAjIHVybGxpYjIgdXNlcyB0aGUgZnVsbCBwYXRoLCBzbyB3ZSdyZSBnb2luZyB0byBzZWUgaWYKKyAgICAgICAgICAgICMgZWl0aGVyIG9mIHRoZW0gd29ya3MgaGVyZS4KKworICAgICAgICAgICAgZm9yIHBhdGggaW4gW3JlcXVlc3RfaGFuZGxlci5wYXRoLCByZXF1ZXN0X2hhbmRsZXIuc2hvcnRfcGF0aF06CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fdmFsaWRhdGVfYXV0aChhdXRoX2RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfaGFuZGxlci5jb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCk6CisgICAgICAgICAgICAgICAgICAgIGF1dGhfdmFsaWRhdGVkID0gVHJ1ZQorCisgICAgICAgICAgICBpZiBub3QgYXV0aF92YWxpZGF0ZWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JldHVybl9hdXRoX2NoYWxsZW5nZShyZXF1ZXN0X2hhbmRsZXIpCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisjIFByb3h5IHRlc3QgaW5mcmFzdHJ1Y3R1cmUKKworY2xhc3MgRmFrZVByb3h5SGFuZGxlcihCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKKyAgICAiIiJUaGlzIGlzIGEgJ2Zha2UgcHJveHknIHRoYXQgbWFrZXMgaXQgbG9vayBsaWtlIHRoZSBlbnRpcmUKKyAgICBpbnRlcm5ldCBoYXMgZ29uZSBkb3duIGR1ZSB0byBhIHN1ZGRlbiB6b21iaWUgaW52YXNpb24uICBJdCBtYWluCisgICAgdXRpbGl0eSBpcyBpbiBwcm92aWRpbmcgdXMgd2l0aCBhdXRoZW50aWNhdGlvbiBzdXBwb3J0IGZvcgorICAgIHRlc3RpbmcuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGlnZXN0X2F1dGhfaGFuZGxlciwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIyBUaGlzIGhhcyB0byBiZSBzZXQgYmVmb3JlIGNhbGxpbmcgb3VyIHBhcmVudCdzIF9faW5pdF9fKCksIHdoaWNoIHdpbGwKKyAgICAgICAgIyB0cnkgdG8gY2FsbCBkb19HRVQoKS4KKyAgICAgICAgc2VsZi5kaWdlc3RfYXV0aF9oYW5kbGVyID0gZGlnZXN0X2F1dGhfaGFuZGxlcgorICAgICAgICBCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBsb2dfbWVzc2FnZShzZWxmLCBmb3JtYXQsICphcmdzKToKKyAgICAgICAgIyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSBmb3IgZGVidWdnaW5nLgorICAgICAgICAjc3lzLnN0ZGVyci53cml0ZShmb3JtYXQgJSBhcmdzKQorICAgICAgICBwYXNzCisKKyAgICBkZWYgZG9fR0VUKHNlbGYpOgorICAgICAgICAoc2NtLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50KSA9IHVybHBhcnNlLnVybHBhcnNlKAorICAgICAgICAgICAgc2VsZi5wYXRoLCAnaHR0cCcpCisgICAgICAgIHNlbGYuc2hvcnRfcGF0aCA9IHBhdGgKKyAgICAgICAgaWYgc2VsZi5kaWdlc3RfYXV0aF9oYW5kbGVyLmhhbmRsZV9yZXF1ZXN0KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCwgIk9LIikKKyAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L2h0bWwiKQorICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKCJZb3UndmUgcmVhY2hlZCAlcyE8QlI+IiAlIHNlbGYucGF0aCkKKyAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoIk91ciBhcG9sb2dpZXMsIGJ1dCBvdXIgc2VydmVyIGlzIGRvd24gZHVlIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhIHN1ZGRlbiB6b21iaWUgaW52YXNpb24uIikKKworIyBUZXN0IGNhc2VzCisKK2NsYXNzIEJhc2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl90aHJlYWRzID0gdGVzdF9zdXBwb3J0LnRocmVhZGluZ19zZXR1cCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqc2VsZi5fdGhyZWFkcykKKworCitjbGFzcyBQcm94eUF1dGhUZXN0cyhCYXNlVGVzdENhc2UpOgorICAgIFVSTCA9ICJodHRwOi8vbG9jYWxob3N0IgorCisgICAgVVNFUiA9ICJ0ZXN0ZXIiCisgICAgUEFTU1dEID0gInRlc3QxMjMiCisgICAgUkVBTE0gPSAiVGVzdFJlYWxtIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihQcm94eUF1dGhUZXN0cywgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLmRpZ2VzdF9hdXRoX2hhbmRsZXIgPSBEaWdlc3RBdXRoSGFuZGxlcigpCisgICAgICAgIHNlbGYuZGlnZXN0X2F1dGhfaGFuZGxlci5zZXRfdXNlcnMoe3NlbGYuVVNFUjogc2VsZi5QQVNTV0R9KQorICAgICAgICBzZWxmLmRpZ2VzdF9hdXRoX2hhbmRsZXIuc2V0X3JlYWxtKHNlbGYuUkVBTE0pCisgICAgICAgIGRlZiBjcmVhdGVfZmFrZV9wcm94eV9oYW5kbGVyKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICByZXR1cm4gRmFrZVByb3h5SGFuZGxlcihzZWxmLmRpZ2VzdF9hdXRoX2hhbmRsZXIsICphcmdzLCAqKmt3YXJncykKKworICAgICAgICBzZWxmLnNlcnZlciA9IExvb3BiYWNrSHR0cFNlcnZlclRocmVhZChjcmVhdGVfZmFrZV9wcm94eV9oYW5kbGVyKQorICAgICAgICBzZWxmLnNlcnZlci5zdGFydCgpCisgICAgICAgIHNlbGYuc2VydmVyLnJlYWR5LndhaXQoKQorICAgICAgICBwcm94eV91cmwgPSAiaHR0cDovLzEyNy4wLjAuMTolZCIgJSBzZWxmLnNlcnZlci5wb3J0CisgICAgICAgIGhhbmRsZXIgPSB1cmxsaWIyLlByb3h5SGFuZGxlcih7Imh0dHAiIDogcHJveHlfdXJsfSkKKyAgICAgICAgc2VsZi5wcm94eV9kaWdlc3RfaGFuZGxlciA9IHVybGxpYjIuUHJveHlEaWdlc3RBdXRoSGFuZGxlcigpCisgICAgICAgIHNlbGYub3BlbmVyID0gdXJsbGliMi5idWlsZF9vcGVuZXIoaGFuZGxlciwgc2VsZi5wcm94eV9kaWdlc3RfaGFuZGxlcikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisgICAgICAgIHN1cGVyKFByb3h5QXV0aFRlc3RzLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgdGVzdF9wcm94eV93aXRoX2JhZF9wYXNzd29yZF9yYWlzZXNfaHR0cGVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLnByb3h5X2RpZ2VzdF9oYW5kbGVyLmFkZF9wYXNzd29yZChzZWxmLlJFQUxNLCBzZWxmLlVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5VU0VSLCBzZWxmLlBBU1NXRCsiYmFkIikKKyAgICAgICAgc2VsZi5kaWdlc3RfYXV0aF9oYW5kbGVyLnNldF9xb3AoImF1dGgiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh1cmxsaWIyLkhUVFBFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcGVuZXIub3BlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5VUkwpCisKKyAgICBkZWYgdGVzdF9wcm94eV93aXRoX25vX3Bhc3N3b3JkX3JhaXNlc19odHRwZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuZGlnZXN0X2F1dGhfaGFuZGxlci5zZXRfcW9wKCJhdXRoIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXJsbGliMi5IVFRQRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3BlbmVyLm9wZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVVJMKQorCisgICAgZGVmIHRlc3RfcHJveHlfcW9wX2F1dGhfd29ya3Moc2VsZik6CisgICAgICAgIHNlbGYucHJveHlfZGlnZXN0X2hhbmRsZXIuYWRkX3Bhc3N3b3JkKHNlbGYuUkVBTE0sIHNlbGYuVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlVTRVIsIHNlbGYuUEFTU1dEKQorICAgICAgICBzZWxmLmRpZ2VzdF9hdXRoX2hhbmRsZXIuc2V0X3FvcCgiYXV0aCIpCisgICAgICAgIHJlc3VsdCA9IHNlbGYub3BlbmVyLm9wZW4oc2VsZi5VUkwpCisgICAgICAgIHdoaWxlIHJlc3VsdC5yZWFkKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHJlc3VsdC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9wcm94eV9xb3BfYXV0aF9pbnRfd29ya3Nfb3JfdGhyb3dzX3VybGVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLnByb3h5X2RpZ2VzdF9oYW5kbGVyLmFkZF9wYXNzd29yZChzZWxmLlJFQUxNLCBzZWxmLlVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5VU0VSLCBzZWxmLlBBU1NXRCkKKyAgICAgICAgc2VsZi5kaWdlc3RfYXV0aF9oYW5kbGVyLnNldF9xb3AoImF1dGgtaW50IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5vcGVuZXIub3BlbihzZWxmLlVSTCkKKyAgICAgICAgZXhjZXB0IHVybGxpYjIuVVJMRXJyb3I6CisgICAgICAgICAgICAjIEl0J3Mgb2theSBpZiB3ZSBkb24ndCBzdXBwb3J0IGF1dGgtaW50LCBidXQgd2UgY2VydGFpbmx5CisgICAgICAgICAgICAjIHNob3VsZG4ndCByZWNlaXZlIGFueSBraW5kIG9mIGV4Y2VwdGlvbiBoZXJlIG90aGVyIHRoYW4KKyAgICAgICAgICAgICMgYSBVUkxFcnJvci4KKyAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgd2hpbGUgcmVzdWx0LnJlYWQoKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICByZXN1bHQuY2xvc2UoKQorCisKK2RlZiBHZXRSZXF1ZXN0SGFuZGxlcihyZXNwb25zZXMpOgorCisgICAgY2xhc3MgRmFrZUhUVFBSZXF1ZXN0SGFuZGxlcihCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKKworICAgICAgICBzZXJ2ZXJfdmVyc2lvbiA9ICJUZXN0SFRUUC8iCisgICAgICAgIHJlcXVlc3RzID0gW10KKyAgICAgICAgaGVhZGVyc19yZWNlaXZlZCA9IFtdCisgICAgICAgIHBvcnQgPSA4MAorCisgICAgICAgIGRlZiBkb19HRVQoc2VsZik6CisgICAgICAgICAgICBib2R5ID0gc2VsZi5zZW5kX2hlYWQoKQorICAgICAgICAgICAgaWYgYm9keToKKyAgICAgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKGJvZHkpCisKKyAgICAgICAgZGVmIGRvX1BPU1Qoc2VsZik6CisgICAgICAgICAgICBjb250ZW50X2xlbmd0aCA9IHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXQorICAgICAgICAgICAgcG9zdF9kYXRhID0gc2VsZi5yZmlsZS5yZWFkKGludChjb250ZW50X2xlbmd0aCkpCisgICAgICAgICAgICBzZWxmLmRvX0dFVCgpCisgICAgICAgICAgICBzZWxmLnJlcXVlc3RzLmFwcGVuZChwb3N0X2RhdGEpCisKKyAgICAgICAgZGVmIHNlbmRfaGVhZChzZWxmKToKKyAgICAgICAgICAgIEZha2VIVFRQUmVxdWVzdEhhbmRsZXIuaGVhZGVyc19yZWNlaXZlZCA9IHNlbGYuaGVhZGVycworICAgICAgICAgICAgc2VsZi5yZXF1ZXN0cy5hcHBlbmQoc2VsZi5wYXRoKQorICAgICAgICAgICAgcmVzcG9uc2VfY29kZSwgaGVhZGVycywgYm9keSA9IHJlc3BvbnNlcy5wb3AoMCkKKworICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKHJlc3BvbnNlX2NvZGUpCisKKyAgICAgICAgICAgIGZvciAoaGVhZGVyLCB2YWx1ZSkgaW4gaGVhZGVyczoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKGhlYWRlciwgdmFsdWUgJSBzZWxmLnBvcnQpCisgICAgICAgICAgICBpZiBib2R5OgorICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L3BsYWluJykKKyAgICAgICAgICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gYm9keQorICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisKKyAgICAgICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgIHBhc3MKKworCisgICAgcmV0dXJuIEZha2VIVFRQUmVxdWVzdEhhbmRsZXIKKworCitjbGFzcyBUZXN0VXJsb3BlbihCYXNlVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHVybGxpYjIudXJsb3BlbiB1c2luZyB0aGUgbmV0d29yay4KKworICAgIFRoZXNlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gIEFzc3VtaW5nIHRoYXQgdGVzdGluZyB1c2luZyBmaWxlcyBkb2VzIGEKKyAgICBnb29kIGpvYiBvdmVyYWxsIG9mIHNvbWUgb2YgdGhlIGJhc2ljIGludGVyZmFjZSBmZWF0dXJlcy4gIFRoZXJlIGFyZSBubworICAgIHRlc3RzIGV4ZXJjaXNpbmcgdGhlIG9wdGlvbmFsICdkYXRhJyBhbmQgJ3Byb3hpZXMnIGFyZ3VtZW50cy4gIE5vIHRlc3RzCisgICAgZm9yIHRyYW5zcGFyZW50IHJlZGlyZWN0aW9uIGhhdmUgYmVlbiB3cml0dGVuLgorICAgICIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBwcm94eV9oYW5kbGVyID0gdXJsbGliMi5Qcm94eUhhbmRsZXIoe30pCisgICAgICAgIG9wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKHByb3h5X2hhbmRsZXIpCisgICAgICAgIHVybGxpYjIuaW5zdGFsbF9vcGVuZXIob3BlbmVyKQorICAgICAgICBzdXBlcihUZXN0VXJsb3Blbiwgc2VsZikuc2V0VXAoKQorCisgICAgZGVmIHN0YXJ0X3NlcnZlcihzZWxmLCByZXNwb25zZXMpOgorICAgICAgICBoYW5kbGVyID0gR2V0UmVxdWVzdEhhbmRsZXIocmVzcG9uc2VzKQorCisgICAgICAgIHNlbGYuc2VydmVyID0gTG9vcGJhY2tIdHRwU2VydmVyVGhyZWFkKGhhbmRsZXIpCisgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5zZXJ2ZXIucmVhZHkud2FpdCgpCisgICAgICAgIHBvcnQgPSBzZWxmLnNlcnZlci5wb3J0CisgICAgICAgIGhhbmRsZXIucG9ydCA9IHBvcnQKKyAgICAgICAgcmV0dXJuIGhhbmRsZXIKKworCisgICAgZGVmIHRlc3RfcmVkaXJlY3Rpb24oc2VsZik6CisgICAgICAgIGV4cGVjdGVkX3Jlc3BvbnNlID0gJ1dlIGdvdCBoZXJlLi4uJworICAgICAgICByZXNwb25zZXMgPSBbCisgICAgICAgICAgICAoMzAyLCBbKCdMb2NhdGlvbicsICdodHRwOi8vbG9jYWxob3N0OiVzL3NvbWV3aGVyZV9lbHNlJyldLCAnJyksCisgICAgICAgICAgICAoMjAwLCBbXSwgZXhwZWN0ZWRfcmVzcG9uc2UpCisgICAgICAgIF0KKworICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIocmVzcG9uc2VzKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSB1cmxsaWIyLnVybG9wZW4oJ2h0dHA6Ly9sb2NhbGhvc3Q6JXMvJyAlIGhhbmRsZXIucG9ydCkKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZXhwZWN0ZWRfcmVzcG9uc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhbmRsZXIucmVxdWVzdHMsIFsnLycsICcvc29tZXdoZXJlX2Vsc2UnXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQorCisKKyAgICBkZWYgdGVzdF80MDQoc2VsZik6CisgICAgICAgIGV4cGVjdGVkX3Jlc3BvbnNlID0gJ0JhZCBiYWQgYmFkLi4uJworICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoWyg0MDQsIFtdLCBleHBlY3RlZF9yZXNwb25zZSldKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1cmxsaWIyLnVybG9wZW4oJ2h0dHA6Ly9sb2NhbGhvc3Q6JXMvd2VlYmxlJyAlIGhhbmRsZXIucG9ydCkKKyAgICAgICAgICAgIGV4Y2VwdCB1cmxsaWIyLlVSTEVycm9yLCBmOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCc0MDQgc2hvdWxkIHJhaXNlIFVSTEVycm9yJykKKworICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBleHBlY3RlZF9yZXNwb25zZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFuZGxlci5yZXF1ZXN0cywgWycvd2VlYmxlJ10pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworCisgICAgZGVmIHRlc3RfMjAwKHNlbGYpOgorICAgICAgICBleHBlY3RlZF9yZXNwb25zZSA9ICdweWNvbiAyMDA4Li4uJworICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoWygyMDAsIFtdLCBleHBlY3RlZF9yZXNwb25zZSldKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSB1cmxsaWIyLnVybG9wZW4oJ2h0dHA6Ly9sb2NhbGhvc3Q6JXMvYml6YXJyZScgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGV4cGVjdGVkX3Jlc3BvbnNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW5kbGVyLnJlcXVlc3RzLCBbJy9iaXphcnJlJ10pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworICAgIGRlZiB0ZXN0XzIwMF93aXRoX3BhcmFtZXRlcnMoc2VsZik6CisgICAgICAgIGV4cGVjdGVkX3Jlc3BvbnNlID0gJ3B5Y29uIDIwMDguLi4nCisgICAgICAgIGhhbmRsZXIgPSBzZWxmLnN0YXJ0X3NlcnZlcihbKDIwMCwgW10sIGV4cGVjdGVkX3Jlc3BvbnNlKV0pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IHVybGxpYjIudXJsb3BlbignaHR0cDovL2xvY2FsaG9zdDolcy9iaXphcnJlJyAlIGhhbmRsZXIucG9ydCwgJ2dldD13aXRoX2ZlZWxpbmcnKQorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBleHBlY3RlZF9yZXNwb25zZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFuZGxlci5yZXF1ZXN0cywgWycvYml6YXJyZScsICdnZXQ9d2l0aF9mZWVsaW5nJ10pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworCisgICAgZGVmIHRlc3Rfc2VuZGluZ19oZWFkZXJzKHNlbGYpOgorICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoWygyMDAsIFtdLCAid2UgZG9uJ3QgY2FyZSIpXSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXEgPSB1cmxsaWIyLlJlcXVlc3QoImh0dHA6Ly9sb2NhbGhvc3Q6JXMvIiAlIGhhbmRsZXIucG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsnUmFuZ2UnOiAnYnl0ZXM9MjAtMzknfSkKKyAgICAgICAgICAgIHVybGxpYjIudXJsb3BlbihyZXEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhbmRsZXIuaGVhZGVyc19yZWNlaXZlZFsnUmFuZ2UnXSwgJ2J5dGVzPTIwLTM5JykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIGhhbmRsZXIgPSBzZWxmLnN0YXJ0X3NlcnZlcihbKDIwMCwgW10sICJ3ZSBkb24ndCBjYXJlIildKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wZW5fdXJsID0gdXJsbGliMi51cmxvcGVuKCJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKKyAgICAgICAgICAgIGZvciBhdHRyIGluICgicmVhZCIsICJjbG9zZSIsICJpbmZvIiwgImdldHVybCIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG9wZW5fdXJsLCBhdHRyKSwgIm9iamVjdCByZXR1cm5lZCBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVybG9wZW4gbGFja3MgdGhlICVzIGF0dHJpYnV0ZSIgJSBhdHRyKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVuX3VybC5yZWFkKCksICJjYWxsaW5nICdyZWFkJyBmYWlsZWQiKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcGVuX3VybC5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworICAgIGRlZiB0ZXN0X2luZm8oc2VsZik6CisgICAgICAgIGhhbmRsZXIgPSBzZWxmLnN0YXJ0X3NlcnZlcihbKDIwMCwgW10sICJ3ZSBkb24ndCBjYXJlIildKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wZW5fdXJsID0gdXJsbGliMi51cmxvcGVuKCJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKKyAgICAgICAgICAgIGluZm9fb2JqID0gb3Blbl91cmwuaW5mbygpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaW5mb19vYmosIG1pbWV0b29scy5NZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgcmV0dXJuZWQgYnkgJ2luZm8nIGlzIG5vdCBhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbmNlIG9mIG1pbWV0b29scy5NZXNzYWdlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb19vYmouZ2V0c3VidHlwZSgpLCAicGxhaW4iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKyAgICBkZWYgdGVzdF9nZXR1cmwoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHNhbWUgVVJMIGFzIG9wZW5lZCBpcyByZXR1cm5lZCBieSBnZXR1cmwuCisgICAgICAgIGhhbmRsZXIgPSBzZWxmLnN0YXJ0X3NlcnZlcihbKDIwMCwgW10sICJ3ZSBkb24ndCBjYXJlIildKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wZW5fdXJsID0gdXJsbGliMi51cmxvcGVuKCJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKKyAgICAgICAgICAgIHVybCA9IG9wZW5fdXJsLmdldHVybCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybCwgImh0dHA6Ly9sb2NhbGhvc3Q6JXMiICUgaGFuZGxlci5wb3J0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKworICAgIGRlZiB0ZXN0X2JhZF9hZGRyZXNzKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBwcm9wZXIgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIGNvbm5lY3RpbmcgdG8gYSBib2d1cworICAgICAgICAjIGFkZHJlc3MuCisKKyAgICAgICAgIyBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvbW1lbnQgYmVsb3csIHRoaXMgbWlnaHQgZmFpbCB3aXRoIHNvbWUgSVNQLAorICAgICAgICAjIHNvIHdlIHJ1biB0aGUgdGVzdCBvbmx5IHdoZW4gLXVuZXR3b3JrLy11YWxsIGlzIHNwZWNpZmllZCB0bworICAgICAgICAjIG1pdGlnYXRlIHRoZSBwcm9ibGVtIGEgYml0IChzZWUgIzE3NTY0KQorICAgICAgICB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoJ25ldHdvcmsnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAjIEdpdmVuIHRoYXQgYm90aCBWZXJpU2lnbiBhbmQgdmFyaW91cyBJU1BzIGhhdmUgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgcGFzdCBvciBhcmUgcHJlc2VudGx5IGhpamFja2luZyB2YXJpb3VzIGludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb21haW4gbmFtZSByZXF1ZXN0cyBpbiBhbiBhdHRlbXB0IHRvIGJvb3N0IHRyYWZmaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0byB0aGVpciBvd24gc2l0ZXMsIGZpbmRpbmcgYSBkb21haW4gbmFtZSB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3IgdGhpcyB0ZXN0IGlzIGRpZmZpY3VsdC4gIFJGQzI2MDYgbGVhZHMgb25lIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgYmVsaWV2ZSB0aGF0ICcuaW52YWxpZCcgc2hvdWxkIHdvcmssIGJ1dCBleHBlcmllbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2VlbWVkIHRvIGluZGljYXRlIG90aGVyd2lzZS4gIFNpbmdsZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUTERzIGFyZSBsaWtlbHkgdG8gcmVtYWluIGludmFsaWQsIHNvIHRoaXMgc2VlbXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBiZSB0aGUgYmVzdCBjaG9pY2UuIFRoZSB0cmFpbGluZyAnLicgcHJldmVudHMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJlbGF0ZWQgcHJvYmxlbTogVGhlIG5vcm1hbCBETlMgcmVzb2x2ZXIgYXBwZW5kcworICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBkb21haW4gbmFtZXMgZnJvbSB0aGUgc2VhcmNoIHBhdGggaWYgdGhlcmUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyAnLicgdGhlIGVuZCBhbmQsIGFuZCBpZiBvbmUgb2YgdGhvc2UgZG9tYWlucworICAgICAgICAgICAgICAgICAgICAgICAgICAjIGltcGxlbWVudHMgYSAnKicgcnVsZSBhIHJlc3VsdCBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBIb3dldmVyLCBub25lIG9mIHRoaXMgd2lsbCBwcmV2ZW50IHRoZSB0ZXN0IGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmYWlsaW5nIGlmIHRoZSBJU1AgaGlqYWNrcyBhbGwgaW52YWxpZCBkb21haW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXF1ZXN0cy4gIFRoZSByZWFsIHNvbHV0aW9uIHdvdWxkIGJlIHRvIGJlIGFibGUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwYXJhbWV0ZXJpemUgdGhlIGZyYW1ld29yayB3aXRoIGEgbW9jayByZXNvbHZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliMi51cmxvcGVuLCAiaHR0cDovL3NhZGZsa2pzYXNmLmkubnZhbGkuZC4vIikKKworICAgIGRlZiB0ZXN0X2l0ZXJhdGlvbihzZWxmKToKKyAgICAgICAgZXhwZWN0ZWRfcmVzcG9uc2UgPSAicHljb24gMjAwOC4uLiIKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKFsoMjAwLCBbXSwgZXhwZWN0ZWRfcmVzcG9uc2UpXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IHVybGxpYjIudXJsb3BlbigiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgICAgICBmb3IgbGluZSBpbiBkYXRhOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgZXhwZWN0ZWRfcmVzcG9uc2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworICAgIGRlZiB6dGVzdF9saW5lX2l0ZXJhdGlvbihzZWxmKToKKyAgICAgICAgbGluZXMgPSBbIldlXG4iLCAiZ290XG4iLCAiaGVyZVxuIiwgInZlcnlsb25nICIgKiA4MTkyICsgIlxuIl0KKyAgICAgICAgZXhwZWN0ZWRfcmVzcG9uc2UgPSAiIi5qb2luKGxpbmVzKQorICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoWygyMDAsIFtdLCBleHBlY3RlZF9yZXNwb25zZSldKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gdXJsbGliMi51cmxvcGVuKCJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKKyAgICAgICAgICAgIGZvciBpbmRleCwgbGluZSBpbiBlbnVtZXJhdGUoZGF0YSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBsaW5lc1tpbmRleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmV0Y2hlZCBsaW5lIG51bWJlciAlcyBkb2Vzbid0IG1hdGNoIGV4cGVjdGVkOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBFeHBlY3RlZCBsZW5ndGggd2FzICVzLCBnb3QgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmRleCwgbGVuKGxpbmVzW2luZGV4XSksIGxlbihsaW5lKSkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleCArIDEsIGxlbihsaW5lcykpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICAjIFdlIHdpbGwgTk9UIGRlcGVuZCBvbiB0aGUgbmV0d29yayByZXNvdXJjZSBmbGFnCisgICAgIyAoTGliL3Rlc3QvcmVncnRlc3QucHkgLXUgbmV0d29yaykgc2luY2UgYWxsIHRlc3RzIGhlcmUgYXJlIG9ubHkKKyAgICAjIGxvY2FsaG9zdC4gIEhvd2V2ZXIsIGlmIHRoaXMgaXMgYSBiYWQgcmF0aW9uYWxlLCB0aGVuIHVuY29tbWVudAorICAgICMgdGhlIG5leHQgbGluZS4KKyAgICAjdGVzdF9zdXBwb3J0LnJlcXVpcmVzKCJuZXR3b3JrIikKKworICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUHJveHlBdXRoVGVzdHMsIFRlc3RVcmxvcGVuKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZWI2NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTdlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDczYWMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weQpAQCAtMCwwICsxLDMzMiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3VybGxpYjIgaW1wb3J0IHNhbmVwYXRobmFtZTJ1cmwKKworaW1wb3J0IHNvY2tldAoraW1wb3J0IHVybGxpYjIKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitUSU1FT1VUID0gNjAgICMgc2Vjb25kcworCisKK2RlZiBfcmV0cnlfdGhyaWNlKGZ1bmMsIGV4YywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBleGNlcHQgZXhjLCBsYXN0X2V4YzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJhaXNlCisgICAgcmFpc2UgbGFzdF9leGMKKworZGVmIF93cmFwX3dpdGhfcmV0cnlfdGhyaWNlKGZ1bmMsIGV4Yyk6CisgICAgZGVmIHdyYXBwZWQoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIF9yZXRyeV90aHJpY2UoZnVuYywgZXhjLCAqYXJncywgKiprd2FyZ3MpCisgICAgcmV0dXJuIHdyYXBwZWQKKworIyBDb25uZWN0aW5nIHRvIHJlbW90ZSBob3N0cyBpcyBmbGFreS4gIE1ha2UgaXQgbW9yZSByb2J1c3QgYnkgcmV0cnlpbmcKKyMgdGhlIGNvbm5lY3Rpb24gc2V2ZXJhbCB0aW1lcy4KK191cmxvcGVuX3dpdGhfcmV0cnkgPSBfd3JhcF93aXRoX3JldHJ5X3RocmljZSh1cmxsaWIyLnVybG9wZW4sIHVybGxpYjIuVVJMRXJyb3IpCisKKworY2xhc3MgQXV0aFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyB1cmxsaWIyIGF1dGhlbnRpY2F0aW9uIGZlYXR1cmVzLiIiIgorCisjIyBEaXNhYmxlZCBhdCB0aGUgbW9tZW50IHNpbmNlIHRoZXJlIGlzIG5vIHBhZ2UgdW5kZXIgcHl0aG9uLm9yZyB3aGljaAorIyMgY291bGQgYmUgdXNlZCB0byBIVFRQIGF1dGhlbnRpY2F0aW9uLgorIworIyAgICBkZWYgdGVzdF9iYXNpY19hdXRoKHNlbGYpOgorIyAgICAgICAgaW1wb3J0IGh0dHBsaWIKKyMKKyMgICAgICAgIHRlc3RfdXJsID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy90ZXN0L3Rlc3RfdXJsbGliMi9iYXNpY19hdXRoIgorIyAgICAgICAgdGVzdF9ob3N0cG9ydCA9ICJ3d3cucHl0aG9uLm9yZyIKKyMgICAgICAgIHRlc3RfcmVhbG0gPSAnVGVzdCBSZWFsbScKKyMgICAgICAgIHRlc3RfdXNlciA9ICd0ZXN0LnRlc3RfdXJsbGliMm5ldCcKKyMgICAgICAgIHRlc3RfcGFzc3dvcmQgPSAnYmxhaCcKKyMKKyMgICAgICAgICMgZmFpbHVyZQorIyAgICAgICAgdHJ5OgorIyAgICAgICAgICAgIF91cmxvcGVuX3dpdGhfcmV0cnkodGVzdF91cmwpCisjICAgICAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3IsIGV4YzoKKyMgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5jb2RlLCA0MDEpCisjICAgICAgICBlbHNlOgorIyAgICAgICAgICAgIHNlbGYuZmFpbCgidXJsb3BlbigpIHNob3VsZCBoYXZlIGZhaWxlZCB3aXRoIDQwMSIpCisjCisjICAgICAgICAjIHN1Y2Nlc3MKKyMgICAgICAgIGF1dGhfaGFuZGxlciA9IHVybGxpYjIuSFRUUEJhc2ljQXV0aEhhbmRsZXIoKQorIyAgICAgICAgYXV0aF9oYW5kbGVyLmFkZF9wYXNzd29yZCh0ZXN0X3JlYWxtLCB0ZXN0X2hvc3Rwb3J0LAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3VzZXIsIHRlc3RfcGFzc3dvcmQpCisjICAgICAgICBvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcihhdXRoX2hhbmRsZXIpCisjICAgICAgICBmID0gb3BlbmVyLm9wZW4oJ2h0dHA6Ly9sb2NhbGhvc3QvJykKKyMgICAgICAgIHJlc3BvbnNlID0gX3VybG9wZW5fd2l0aF9yZXRyeSgiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCisjCisjICAgICAgICAjIFRoZSAndXNlcmluZm8nIFVSTCBjb21wb25lbnQgaXMgZGVwcmVjYXRlZCBieSBSRkMgMzk4NiBmb3Igc2VjdXJpdHkKKyMgICAgICAgICMgcmVhc29ucywgbGV0J3Mgbm90IGltcGxlbWVudCBpdCEgIChpdCdzIGFscmVhZHkgaW1wbGVtZW50ZWQgZm9yIHByb3h5CisjICAgICAgICAjIHNwZWNpZmljYXRpb24gc3RyaW5ncyAodGhhdCBpcywgVVJMcyBvciBhdXRob3JpdGllcyBzcGVjaWZ5aW5nIGEKKyMgICAgICAgICMgcHJveHkpLCBzbyB3ZSBtdXN0IGtlZXAgdGhhdCkKKyMgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGh0dHBsaWIuSW52YWxpZFVSTCwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgIHVybGxpYjIudXJsb3BlbiwgImh0dHA6Ly9ldmlsOnRoaW5nQGV4YW1wbGUuY29tIikKKworCitjbGFzcyBDbG9zZVNvY2tldFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY2xvc2Uoc2VsZik6CisgICAgICAgIGltcG9ydCBodHRwbGliCisKKyAgICAgICAgIyBjYWxsaW5nIC5jbG9zZSgpIG9uIHVybGxpYjIncyByZXNwb25zZSBvYmplY3RzIHNob3VsZCBjbG9zZSB0aGUKKyAgICAgICAgIyB1bmRlcmx5aW5nIHNvY2tldAorCisgICAgICAgICMgZGVsdmUgZGVlcCBpbnRvIHJlc3BvbnNlIHRvIGZldGNoIHNvY2tldC5fc29ja2V0b2JqZWN0CisgICAgICAgIHJlc3BvbnNlID0gX3VybG9wZW5fd2l0aF9yZXRyeSgiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCisgICAgICAgIGFidXNlZF9maWxlb2JqZWN0ID0gcmVzcG9uc2UuZnAKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFidXNlZF9maWxlb2JqZWN0Ll9fY2xhc3NfXyBpcyBzb2NrZXQuX2ZpbGVvYmplY3QpCisgICAgICAgIGh0dHByZXNwb25zZSA9IGFidXNlZF9maWxlb2JqZWN0Ll9zb2NrCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShodHRwcmVzcG9uc2UuX19jbGFzc19fIGlzIGh0dHBsaWIuSFRUUFJlc3BvbnNlKQorICAgICAgICBmaWxlb2JqZWN0ID0gaHR0cHJlc3BvbnNlLmZwCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlb2JqZWN0Ll9fY2xhc3NfXyBpcyBzb2NrZXQuX2ZpbGVvYmplY3QpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmaWxlb2JqZWN0LmNsb3NlZCkKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZW9iamVjdC5jbG9zZWQpCisKK2NsYXNzIE90aGVyTmV0d29ya1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIDA6ICAjIGZvciBkZWJ1Z2dpbmcKKyAgICAgICAgICAgIGltcG9ydCBsb2dnaW5nCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigidGVzdF91cmxsaWIybmV0IikKKyAgICAgICAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKGxvZ2dpbmcuU3RyZWFtSGFuZGxlcigpKQorCisgICAgIyBYWFggVGhlIHJlc3Qgb2YgdGhlc2UgdGVzdHMgYXJlbid0IHZlcnkgZ29vZCAtLSB0aGV5IGRvbid0IGNoZWNrIG11Y2guCisgICAgIyBUaGV5IGRvIHNvbWV0aW1lcyBjYXRjaCBzb21lIG1ham9yIGRpc2FzdGVycywgdGhvdWdoLgorCisgICAgZGVmIHRlc3RfZnRwKHNlbGYpOgorICAgICAgICB1cmxzID0gWworICAgICAgICAgICAgJ2Z0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9rZXJuZWwvUkVBRE1FJywKKyAgICAgICAgICAgICdmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL25vbi1leGlzdGVudC1maWxlJywKKyAgICAgICAgICAgICMnZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xlZW5veC9rZXJuZWwvdGVzdCcsCisgICAgICAgICAgICAnZnRwOi8vZ2F0ZWtlZXBlci5yZXNlYXJjaC5jb21wYXEuY29tL3B1Yi9ERUMvU1JDJworICAgICAgICAgICAgICAgICcvcmVzZWFyY2gtcmVwb3J0cy8wMFJFQURNRS1MZWdhbC1SdWxlcy1SZWdzJywKKyAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5fdGVzdF91cmxzKHVybHMsIHNlbGYuX2V4dHJhX2hhbmRsZXJzKCkpCisKKyAgICBkZWYgdGVzdF9maWxlKHNlbGYpOgorICAgICAgICBURVNURk4gPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3cnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCdoaSB0aGVyZVxuJykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdXJscyA9IFsKKyAgICAgICAgICAgICAgICAnZmlsZTonK3NhbmVwYXRobmFtZTJ1cmwob3MucGF0aC5hYnNwYXRoKFRFU1RGTikpLAorICAgICAgICAgICAgICAgICgnZmlsZTovLy9ub25zZW5zZW5hbWUvZXRjL3Bhc3N3ZCcsIE5vbmUsIHVybGxpYjIuVVJMRXJyb3IpLAorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfdXJscyh1cmxzLCBzZWxmLl9leHRyYV9oYW5kbGVycygpLCByZXRyeT1UcnVlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1cmxsaWIyLnVybG9wZW4sJy4vcmVsYXRpdmVfcGF0aC90by9maWxlJykKKworICAgICMgWFhYIEZvbGxvd2luZyB0ZXN0IGRlcGVuZHMgb24gbWFjaGluZSBjb25maWd1cmF0aW9ucyB0aGF0IGFyZSBpbnRlcm5hbAorICAgICMgdG8gQ05SSS4gIE5lZWQgdG8gc2V0IHVwIGEgcHVibGljIHNlcnZlciB3aXRoIHRoZSByaWdodCBhdXRoZW50aWNhdGlvbgorICAgICMgY29uZmlndXJhdGlvbiBmb3IgdGVzdCBwdXJwb3Nlcy4KKworIyMgICAgIGRlZiB0ZXN0X2Nucmkoc2VsZik6CisjIyAgICAgICAgIGlmIHNvY2tldC5nZXRob3N0bmFtZSgpID09ICdiaXRkaWRkbGUnOgorIyMgICAgICAgICAgICAgbG9jYWxob3N0ID0gJ2JpdGRpZGRsZS5jbnJpLnJlc3Rvbi52YS51cycKKyMjICAgICAgICAgZWxpZiBzb2NrZXQuZ2V0aG9zdG5hbWUoKSA9PSAnYml0ZGlkZGxlLmNvbmNlbnRyaWMubmV0JzoKKyMjICAgICAgICAgICAgIGxvY2FsaG9zdCA9ICdsb2NhbGhvc3QnCisjIyAgICAgICAgIGVsc2U6CisjIyAgICAgICAgICAgICBsb2NhbGhvc3QgPSBOb25lCisjIyAgICAgICAgIGlmIGxvY2FsaG9zdCBpcyBub3QgTm9uZToKKyMjICAgICAgICAgICAgIHVybHMgPSBbCisjIyAgICAgICAgICAgICAgICAgJ2ZpbGU6Ly8lcy9ldGMvcGFzc3dkJyAlIGxvY2FsaG9zdCwKKyMjICAgICAgICAgICAgICAgICAnaHR0cDovLyVzL3NpbXBsZS8nICUgbG9jYWxob3N0LAorIyMgICAgICAgICAgICAgICAgICdodHRwOi8vJXMvZGlnZXN0LycgJSBsb2NhbGhvc3QsCisjIyAgICAgICAgICAgICAgICAgJ2h0dHA6Ly8lcy9ub3QvZm91bmQuaCcgJSBsb2NhbGhvc3QsCisjIyAgICAgICAgICAgICAgICAgXQorCisjIyAgICAgICAgICAgICBiYXV0aCA9IEhUVFBCYXNpY0F1dGhIYW5kbGVyKCkKKyMjICAgICAgICAgICAgIGJhdXRoLmFkZF9wYXNzd29yZCgnYmFzaWNfdGVzdF9yZWFsbScsIGxvY2FsaG9zdCwgJ2poeWx0b24nLAorIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXNzd29yZCcpCisjIyAgICAgICAgICAgICBkYXV0aCA9IEhUVFBEaWdlc3RBdXRoSGFuZGxlcigpCisjIyAgICAgICAgICAgICBkYXV0aC5hZGRfcGFzc3dvcmQoJ2RpZ2VzdF90ZXN0X3JlYWxtJywgbG9jYWxob3N0LCAnamh5bHRvbicsCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJykKKworIyMgICAgICAgICAgICAgc2VsZi5fdGVzdF91cmxzKHVybHMsIHNlbGYuX2V4dHJhX2hhbmRsZXJzKCkrW2JhdXRoLCBkYXV0aF0pCisKKyAgICBkZWYgdGVzdF91cmx3aXRoZnJhZyhzZWxmKToKKyAgICAgICAgdXJsd2l0aF9mcmFnID0gImh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMi9nbG9zc2FyeS5odG1sI2dsb3NzYXJ5IgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQodXJsd2l0aF9mcmFnKToKKyAgICAgICAgICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdCh1cmx3aXRoX2ZyYWcpCisgICAgICAgICAgICByZXMgPSB1cmxsaWIyLnVybG9wZW4ocmVxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuZ2V0dXJsKCksCisgICAgICAgICAgICAgICAgICAgICJodHRwOi8vZG9jcy5weXRob24ub3JnLzIvZ2xvc3NhcnkuaHRtbCNnbG9zc2FyeSIpCisKKyAgICBkZWYgdGVzdF9maWxlbm8oc2VsZik6CisgICAgICAgIHJlcSA9IHVybGxpYjIuUmVxdWVzdCgiaHR0cDovL3d3dy5weXRob24ub3JnIikKKyAgICAgICAgb3BlbmVyID0gdXJsbGliMi5idWlsZF9vcGVuZXIoKQorICAgICAgICByZXMgPSBvcGVuZXIub3BlbihyZXEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlcy5maWxlbm8oKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkhUVFBSZXNwb25zZSBvYmplY3Qgc2hvdWxkIHJldHVybiBhIHZhbGlkIGZpbGVubyIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICByZXMuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfY3VzdG9tX2hlYWRlcnMoc2VsZik6CisgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LmV4YW1wbGUuY29tIgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQodXJsKToKKyAgICAgICAgICAgIG9wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKCkKKyAgICAgICAgICAgIHJlcXVlc3QgPSB1cmxsaWIyLlJlcXVlc3QodXJsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXF1ZXN0LmhlYWRlcl9pdGVtcygpKQorICAgICAgICAgICAgb3BlbmVyLm9wZW4ocmVxdWVzdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXF1ZXN0LmhlYWRlcl9pdGVtcygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcXVlc3QuaGFzX2hlYWRlcignVXNlci1hZ2VudCcpKQorICAgICAgICAgICAgcmVxdWVzdC5hZGRfaGVhZGVyKCdVc2VyLUFnZW50JywnVGVzdC1BZ2VudCcpCisgICAgICAgICAgICBvcGVuZXIub3BlbihyZXF1ZXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXF1ZXN0LmdldF9oZWFkZXIoJ1VzZXItYWdlbnQnKSwnVGVzdC1BZ2VudCcpCisKKyAgICBkZWYgdGVzdF9zaXRlc19ub19jb25uZWN0aW9uX2Nsb3NlKHNlbGYpOgorICAgICAgICAjIFNvbWUgc2l0ZXMgZG8gbm90IHNlbmQgQ29ubmVjdGlvbjogY2xvc2UgaGVhZGVyLgorICAgICAgICAjIFZlcmlmeSB0aGF0IHRob3NlIHdvcmsgcHJvcGVybHkuICgjaXNzdWUxMjU3NikKKworICAgICAgICBVUkwgPSAnaHR0cDovL3d3dy5pbWRiLmNvbScgIyBObyBDb25uZWN0aW9uOmNsb3NlCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChVUkwpOgorICAgICAgICAgICAgcmVxID0gdXJsbGliMi51cmxvcGVuKFVSTCkKKyAgICAgICAgICAgIHJlcyA9IHJlcS5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXMpCisKKyAgICBkZWYgX3Rlc3RfdXJscyhzZWxmLCB1cmxzLCBoYW5kbGVycywgcmV0cnk9VHJ1ZSk6CisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIGltcG9ydCBsb2dnaW5nCisgICAgICAgIGRlYnVnID0gbG9nZ2luZy5nZXRMb2dnZXIoInRlc3RfdXJsbGliMiIpLmRlYnVnCisKKyAgICAgICAgdXJsb3BlbiA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKCpoYW5kbGVycykub3BlbgorICAgICAgICBpZiByZXRyeToKKyAgICAgICAgICAgIHVybG9wZW4gPSBfd3JhcF93aXRoX3JldHJ5X3RocmljZSh1cmxvcGVuLCB1cmxsaWIyLlVSTEVycm9yKQorCisgICAgICAgIGZvciB1cmwgaW4gdXJsczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodXJsLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgdXJsLCByZXEsIGV4cGVjdGVkX2VyciA9IHVybAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXEgPSBleHBlY3RlZF9lcnIgPSBOb25lCisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQodXJsKToKKyAgICAgICAgICAgICAgICBkZWJ1Zyh1cmwpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmID0gdXJsb3Blbih1cmwsIHJlcSwgVElNRU9VVCkKKyAgICAgICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciBhcyBlcnI6CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKGVycikKKyAgICAgICAgICAgICAgICAgICAgaWYgZXhwZWN0ZWRfZXJyOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gKCJEaWRuJ3QgZ2V0IGV4cGVjdGVkIGVycm9yKHMpICVzIGZvciAlcyAlcywgZ290ICVzOiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHBlY3RlZF9lcnIsIHVybCwgcmVxLCB0eXBlKGVyciksIGVycikpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZXJyLCBleHBlY3RlZF9lcnIsIG1zZykKKyAgICAgICAgICAgICAgICBleGNlcHQgdXJsbGliMi5VUkxFcnJvciBhcyBlcnI6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXJyWzBdLCBzb2NrZXQudGltZW91dCk6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICI8dGltZW91dDogJXM+IiAlIHVybAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHVybCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gZi5yZWFkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZygicmVhZCAlZCBieXRlcyIgJSBsZW4oYnVmKSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiPHRpbWVvdXQ6ICVzPiIgJSB1cmwKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBkZWJ1ZygiKioqKioqKiogbmV4dCB1cmwgY29taW5nIHVwLi4uIikKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgZGVmIF9leHRyYV9oYW5kbGVycyhzZWxmKToKKyAgICAgICAgaGFuZGxlcnMgPSBbXQorCisgICAgICAgIGNmaCA9IHVybGxpYjIuQ2FjaGVGVFBIYW5kbGVyKCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGNmaC5jbGVhcl9jYWNoZSkKKyAgICAgICAgY2ZoLnNldFRpbWVvdXQoMSkKKyAgICAgICAgaGFuZGxlcnMuYXBwZW5kKGNmaCkKKworICAgICAgICByZXR1cm4gaGFuZGxlcnMKKworCitjbGFzcyBUaW1lb3V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfaHR0cF9iYXNpYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmciCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCh1cmwsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICAgICB1ID0gX3VybG9wZW5fd2l0aF9yZXRyeSh1cmwpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodS5mcC5fc29jay5mcC5fc29jay5nZXR0aW1lb3V0KCkgaXMgTm9uZSkKKworICAgIGRlZiB0ZXN0X2h0dHBfZGVmYXVsdF90aW1lb3V0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgdXJsID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZyIKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHVybCk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoNjApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdSA9IF91cmxvcGVuX3dpdGhfcmV0cnkodXJsKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5mcC5fc29jay5mcC5fc29jay5nZXR0aW1lb3V0KCksIDYwKQorCisgICAgZGVmIHRlc3RfaHR0cF9ub190aW1lb3V0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgdXJsID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZyIKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHVybCk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoNjApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdSA9IF91cmxvcGVuX3dpdGhfcmV0cnkodXJsLCB0aW1lb3V0PU5vbmUpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUuZnAuX3NvY2suZnAuX3NvY2suZ2V0dGltZW91dCgpIGlzIE5vbmUpCisKKyAgICBkZWYgdGVzdF9odHRwX3RpbWVvdXQoc2VsZik6CisgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmciCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCh1cmwpOgorICAgICAgICAgICAgdSA9IF91cmxvcGVuX3dpdGhfcmV0cnkodXJsLCB0aW1lb3V0PTEyMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5mcC5fc29jay5mcC5fc29jay5nZXR0aW1lb3V0KCksIDEyMCkKKworICAgIEZUUF9IT1NUID0gImZ0cDovL2Z0cC5taXJyb3IubmwvcHViL2dudS8iCisKKyAgICBkZWYgdGVzdF9mdHBfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoc2VsZi5GVFBfSE9TVCwgdGltZW91dD1Ob25lKToKKyAgICAgICAgICAgIHUgPSBfdXJsb3Blbl93aXRoX3JldHJ5KHNlbGYuRlRQX0hPU1QpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodS5mcC5mcC5fc29jay5nZXR0aW1lb3V0KCkgaXMgTm9uZSkKKworICAgIGRlZiB0ZXN0X2Z0cF9kZWZhdWx0X3RpbWVvdXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoc2VsZi5GVFBfSE9TVCk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoNjApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdSA9IF91cmxvcGVuX3dpdGhfcmV0cnkoc2VsZi5GVFBfSE9TVCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuZnAuZnAuX3NvY2suZ2V0dGltZW91dCgpLCA2MCkKKworICAgIGRlZiB0ZXN0X2Z0cF9ub190aW1lb3V0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHNlbGYuRlRQX0hPU1QpOgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDYwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHUgPSBfdXJsb3Blbl93aXRoX3JldHJ5KHNlbGYuRlRQX0hPU1QsIHRpbWVvdXQ9Tm9uZSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodS5mcC5mcC5fc29jay5nZXR0aW1lb3V0KCkgaXMgTm9uZSkKKworICAgIGRlZiB0ZXN0X2Z0cF90aW1lb3V0KHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoc2VsZi5GVFBfSE9TVCk6CisgICAgICAgICAgICB1ID0gX3VybG9wZW5fd2l0aF9yZXRyeShzZWxmLkZUUF9IT1NULCB0aW1lb3V0PTYwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmZwLmZwLl9zb2NrLmdldHRpbWVvdXQoKSwgNjApCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5yZXF1aXJlcygibmV0d29yayIpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChBdXRoVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlck5ldHdvcmtUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsb3NlU29ja2V0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXRUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjJuZXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYWM3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjJuZXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYWM3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWJuZXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWJuZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4ODMzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYm5ldC5weQpAQCAtMCwwICsxLDIxMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworaW1wb3J0IHNvY2tldAoraW1wb3J0IHVybGxpYgoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdGltZQorCittaW1ldG9vbHMgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgibWltZXRvb2xzIiwgZGVwcmVjYXRlZD1UcnVlKQorCisKK2RlZiBfb3Blbl93aXRoX3JldHJ5KGZ1bmMsIGhvc3QsICphcmdzLCAqKmt3YXJncyk6CisgICAgIyBDb25uZWN0aW5nIHRvIHJlbW90ZSBob3N0cyBpcyBmbGFreS4gIE1ha2UgaXQgbW9yZSByb2J1c3QKKyAgICAjIGJ5IHJldHJ5aW5nIHRoZSBjb25uZWN0aW9uIHNldmVyYWwgdGltZXMuCisgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBmdW5jKGhvc3QsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGxhc3RfZXhjOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmFpc2UKKyAgICByYWlzZSBsYXN0X2V4YworCisKK2NsYXNzIFVSTFRpbWVvdXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIFRJTUVPVVQgPSAxMC4wCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChzZWxmLlRJTUVPVVQpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorCisgICAgZGVmIHRlc3RVUkxyZWFkKHNlbGYpOgorICAgICAgICBmID0gX29wZW5fd2l0aF9yZXRyeSh1cmxsaWIudXJsb3BlbiwgImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQorICAgICAgICB4ID0gZi5yZWFkKCkKKworY2xhc3MgdXJsb3Blbk5ldHdvcmtUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgdXJsbGliLnVybG9wZW4gdXNpbmcgdGhlIG5ldHdvcmsuCisKKyAgICBUaGVzZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICBBc3N1bWluZyB0aGF0IHRlc3RpbmcgdXNpbmcgZmlsZXMgZG9lcyBhCisgICAgZ29vZCBqb2Igb3ZlcmFsbCBvZiBzb21lIG9mIHRoZSBiYXNpYyBpbnRlcmZhY2UgZmVhdHVyZXMuICBUaGVyZSBhcmUgbm8KKyAgICB0ZXN0cyBleGVyY2lzaW5nIHRoZSBvcHRpb25hbCAnZGF0YScgYW5kICdwcm94aWVzJyBhcmd1bWVudHMuICBObyB0ZXN0cworICAgIGZvciB0cmFuc3BhcmVudCByZWRpcmVjdGlvbiBoYXZlIGJlZW4gd3JpdHRlbi4KKworICAgIHNldFVwIGlzIG5vdCB1c2VkIGZvciBhbHdheXMgY29uc3RydWN0aW5nIGEgY29ubmVjdGlvbiB0bworICAgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8gc2luY2UgdGhlcmUgYSBmZXcgdGVzdHMgdGhhdCBkb24ndCB1c2UgdGhhdCBhZGRyZXNzCisgICAgYW5kIG1ha2luZyBhIGNvbm5lY3Rpb24gaXMgZXhwZW5zaXZlIGVub3VnaCB0byB3YXJyYW50IG1pbmltaXppbmcgdW5uZWVkZWQKKyAgICBjb25uZWN0aW9ucy4KKworICAgICIiIgorCisgICAgZGVmIHVybG9wZW4oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gX29wZW5fd2l0aF9yZXRyeSh1cmxsaWIudXJsb3BlbiwgKmFyZ3MpCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBTaW1wbGUgdGVzdCBleHBlY3RlZCB0byBwYXNzLgorICAgICAgICBvcGVuX3VybCA9IHNlbGYudXJsb3BlbigiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCisgICAgICAgIGZvciBhdHRyIGluICgicmVhZCIsICJyZWFkbGluZSIsICJyZWFkbGluZXMiLCAiZmlsZW5vIiwgImNsb3NlIiwKKyAgICAgICAgICAgICAgICAgICAgICJpbmZvIiwgImdldHVybCIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIob3Blbl91cmwsIGF0dHIpLCAib2JqZWN0IHJldHVybmVkIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmxvcGVuIGxhY2tzIHRoZSAlcyBhdHRyaWJ1dGUiICUgYXR0cikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZW5fdXJsLnJlYWQoKSwgImNhbGxpbmcgJ3JlYWQnIGZhaWxlZCIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcGVuX3VybC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6CisgICAgICAgICMgVGVzdCBib3RoIHJlYWRsaW5lIGFuZCByZWFkbGluZXMuCisgICAgICAgIG9wZW5fdXJsID0gc2VsZi51cmxvcGVuKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG9wZW5fdXJsLnJlYWRsaW5lKCksIGJhc2VzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lIGRpZCBub3QgcmV0dXJuIGEgc3RyaW5nIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShvcGVuX3VybC5yZWFkbGluZXMoKSwgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmVzIGRpZCBub3QgcmV0dXJuIGEgbGlzdCIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcGVuX3VybC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9pbmZvKHNlbGYpOgorICAgICAgICAjIFRlc3QgJ2luZm8nLgorICAgICAgICBvcGVuX3VybCA9IHNlbGYudXJsb3BlbigiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGluZm9fb2JqID0gb3Blbl91cmwuaW5mbygpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcGVuX3VybC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaW5mb19vYmosIG1pbWV0b29scy5NZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgcmV0dXJuZWQgYnkgJ2luZm8nIGlzIG5vdCBhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbmNlIG9mIG1pbWV0b29scy5NZXNzYWdlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb19vYmouZ2V0c3VidHlwZSgpLCAiaHRtbCIpCisKKyAgICBkZWYgdGVzdF9nZXR1cmwoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHNhbWUgVVJMIGFzIG9wZW5lZCBpcyByZXR1cm5lZCBieSBnZXR1cmwuCisgICAgICAgIFVSTCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIgorICAgICAgICBvcGVuX3VybCA9IHNlbGYudXJsb3BlbihVUkwpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdvdHRlbl91cmwgPSBvcGVuX3VybC5nZXR1cmwoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3Blbl91cmwuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdHRlbl91cmwsIFVSTCkKKworICAgIGRlZiB0ZXN0X2dldGNvZGUoc2VsZik6CisgICAgICAgICMgdGVzdCBnZXRjb2RlKCkgd2l0aCB0aGUgZmFuY3kgb3BlbmVyIHRvIGdldCA0MDQgZXJyb3IgY29kZXMKKyAgICAgICAgVVJMID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy9YWFhpbnZhbGlkWFhYIgorICAgICAgICBvcGVuX3VybCA9IHVybGxpYi5GYW5jeVVSTG9wZW5lcigpLm9wZW4oVVJMKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb2RlID0gb3Blbl91cmwuZ2V0Y29kZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcGVuX3VybC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZSwgNDA0KQorCisgICAgZGVmIHRlc3RfZmlsZW5vKHNlbGYpOgorICAgICAgICBpZiAoc3lzLnBsYXRmb3JtIGluICgnd2luMzInLCkgb3IKKyAgICAgICAgICAgICAgICBub3QgaGFzYXR0cihvcywgJ2Zkb3BlbicpKToKKyAgICAgICAgICAgICMgT24gV2luZG93cywgc29ja2V0IGhhbmRsZXMgYXJlIG5vdCBmaWxlIGRlc2NyaXB0b3JzOyB0aGlzCisgICAgICAgICAgICAjIHRlc3QgY2FuJ3QgcGFzcyBvbiBXaW5kb3dzLgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgTWFrZSBzdXJlIGZkIHJldHVybmVkIGJ5IGZpbGVubyBpcyB2YWxpZC4KKyAgICAgICAgb3Blbl91cmwgPSBzZWxmLnVybG9wZW4oImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQorICAgICAgICBmZCA9IG9wZW5fdXJsLmZpbGVubygpCisgICAgICAgIEZJTEUgPSBvcy5mZG9wZW4oZmQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGSUxFLnJlYWQoKSwgInJlYWRpbmcgZnJvbSBmaWxlIGNyZWF0ZWQgdXNpbmcgZmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgYnkgZmlsZW5vIGZhaWxlZCIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBGSUxFLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2JhZF9hZGRyZXNzKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBwcm9wZXIgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIGNvbm5lY3RpbmcgdG8gYSBib2d1cworICAgICAgICAjIGFkZHJlc3MuCisgICAgICAgIGJvZ3VzX2RvbWFpbiA9ICJzYWRmbGtqc2FzZi5pLm52YWxpLmQiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2tldC5nZXRob3N0YnluYW1lKGJvZ3VzX2RvbWFpbikKKyAgICAgICAgZXhjZXB0IHNvY2tldC5nYWllcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVGhpcyBoYXBwZW5zIHdpdGggc29tZSBvdmVyemVhbG91cyBETlMgcHJvdmlkZXJzIHN1Y2ggYXMgT3BlbkROUworICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiJXIgc2hvdWxkIG5vdCByZXNvbHZlIGZvciB0ZXN0IHRvIHdvcmsiICUgYm9ndXNfZG9tYWluKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNGIHBhdGNoIDgwOTkxNTogIEluIFNlcCAyMDAzLCBWZXJpU2lnbiBzdGFydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgaGlnaGphY2tpbmcgaW52YWxpZCAuY29tIGFuZCAubmV0IGFkZHJlc3NlcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAjIGJvb3N0IHRyYWZmaWMgdG8gdGhlaXIgb3duIHNpdGUuICBUaGlzIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFydGVkIGZhaWxpbmcgdGhlbi4gIE9uZSBob3BlcyB0aGUgLmludmFsaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb21haW4gd2lsbCBiZSBzcGFyZWQgdG8gc2VydmUgaXRzIGRlZmluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwdXJwb3NlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAjIHVybGxpYi51cmxvcGVuLCAiaHR0cDovL3d3dy5zYWRmbGtqc2FzYWRmLmNvbS8iKQorICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxsaWIudXJsb3BlbiwgImh0dHA6Ly9zYWRmbGtqc2FzZi5pLm52YWxpLmQvIikKKworY2xhc3MgdXJscmV0cmlldmVOZXR3b3JrVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHVybGxpYi51cmxyZXRyaWV2ZSB1c2luZyB0aGUgbmV0d29yay4iIiIKKworICAgIGRlZiB1cmxyZXRyaWV2ZShzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBfb3Blbl93aXRoX3JldHJ5KHVybGxpYi51cmxyZXRyaWV2ZSwgKmFyZ3MpCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGJhc2ljIGZ1bmN0aW9uYWxpdHkuCisgICAgICAgIGZpbGVfbG9jYXRpb24saW5mbyA9IHNlbGYudXJscmV0cmlldmUoImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZmlsZV9sb2NhdGlvbiksICJmaWxlIGxvY2F0aW9uIHJldHVybmVkIGJ5IgorICAgICAgICAgICAgICAgICAgICAgICAgIiB1cmxyZXRyaWV2ZSBpcyBub3QgYSB2YWxpZCBwYXRoIikKKyAgICAgICAgRklMRSA9IGZpbGUoZmlsZV9sb2NhdGlvbikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEZJTEUucmVhZCgpLCAicmVhZGluZyBmcm9tIHRoZSBmaWxlIGxvY2F0aW9uIHJldHVybmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgYnkgdXJscmV0cmlldmUgZmFpbGVkIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIEZJTEUuY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKGZpbGVfbG9jYXRpb24pCisKKyAgICBkZWYgdGVzdF9zcGVjaWZpZWRfcGF0aChzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBzcGVjaWZ5aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlsZSB0byB3cml0ZSB0byB3b3Jrcy4KKyAgICAgICAgZmlsZV9sb2NhdGlvbixpbmZvID0gc2VsZi51cmxyZXRyaWV2ZSgiaHR0cDovL3d3dy5weXRob24ub3JnLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xvY2F0aW9uLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZmlsZV9sb2NhdGlvbikpCisgICAgICAgIEZJTEUgPSBmaWxlKGZpbGVfbG9jYXRpb24pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGSUxFLnJlYWQoKSwgInJlYWRpbmcgZnJvbSB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgRklMRS5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsoZmlsZV9sb2NhdGlvbikKKworICAgIGRlZiB0ZXN0X2hlYWRlcihzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgaGVhZGVyIHJldHVybmVkIGFzIDJuZCB2YWx1ZSBmcm9tIHVybHJldHJpZXZlIGlzIGdvb2QuCisgICAgICAgIGZpbGVfbG9jYXRpb24sIGhlYWRlciA9IHNlbGYudXJscmV0cmlldmUoImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQorICAgICAgICBvcy51bmxpbmsoZmlsZV9sb2NhdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGhlYWRlciwgbWltZXRvb2xzLk1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBtaW1ldG9vbHMuTWVzc2FnZSIpCisKKyAgICBkZWYgdGVzdF9kYXRhX2hlYWRlcihzZWxmKToKKyAgICAgICAgbG9nbyA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvY29tbXVuaXR5L2xvZ29zL3B5dGhvbi1sb2dvLW1hc3Rlci12My1UTS5wbmciCisgICAgICAgIGZpbGVfbG9jYXRpb24sIGZpbGVoZWFkZXJzID0gc2VsZi51cmxyZXRyaWV2ZShsb2dvKQorICAgICAgICBvcy51bmxpbmsoZmlsZV9sb2NhdGlvbikKKyAgICAgICAgZGF0ZXZhbHVlID0gZmlsZWhlYWRlcnMuZ2V0aGVhZGVyKCdEYXRlJykKKyAgICAgICAgZGF0ZWZvcm1hdCA9ICclYSwgJWQgJWIgJVkgJUg6JU06JVMgR01UJworICAgICAgICB0cnk6CisgICAgICAgICAgICB0aW1lLnN0cnB0aW1lKGRhdGV2YWx1ZSwgZGF0ZWZvcm1hdCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ0RhdGUgdmFsdWUgbm90IGluICVyIGZvcm1hdCcsIGRhdGVmb3JtYXQpCisKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJlcXVpcmVzKCduZXR3b3JrJykKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgKCJ1cmxsaWIudXJsb3Blbi4uIGhhcyBiZWVuIHJlbW92ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChVUkxUaW1lb3V0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxvcGVuTmV0d29ya1Rlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybHJldHJpZXZlTmV0d29ya1Rlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWJuZXQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2E4ZGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWJuZXQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2E4ZGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxwYXJzZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybHBhcnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZWJmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxwYXJzZS5weQpAQCAtMCwwICsxLDU3MSBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdXJscGFyc2UKKworUkZDMTgwOF9CQVNFID0gImh0dHA6Ly9hL2IvYy9kO3A/cSNmIgorUkZDMjM5Nl9CQVNFID0gImh0dHA6Ly9hL2IvYy9kO3A/cSIKK1JGQzM5ODZfQkFTRSA9ICdodHRwOi8vYS9iL2MvZDtwP3EnCitTSU1QTEVfQkFTRSAgPSAnaHR0cDovL2EvYi9jL2QnCisKKyMgQSBsaXN0IG9mIHRlc3QgY2FzZXMuICBFYWNoIHRlc3QgY2FzZSBpcyBhIHR3by10dXBsZSB0aGF0IGNvbnRhaW5zCisjIGEgc3RyaW5nIHdpdGggdGhlIHF1ZXJ5IGFuZCBhIGRpY3Rpb25hcnkgd2l0aCB0aGUgZXhwZWN0ZWQgcmVzdWx0LgorCitwYXJzZV9xc2xfdGVzdF9jYXNlcyA9IFsKKyAgICAoIiIsIFtdKSwKKyAgICAoIiYiLCBbXSksCisgICAgKCImJiIsIFtdKSwKKyAgICAoIj0iLCBbKCcnLCAnJyldKSwKKyAgICAoIj1hIiwgWygnJywgJ2EnKV0pLAorICAgICgiYSIsIFsoJ2EnLCAnJyldKSwKKyAgICAoImE9IiwgWygnYScsICcnKV0pLAorICAgICgiYT0iLCBbKCdhJywgJycpXSksCisgICAgKCImYT1iIiwgWygnYScsICdiJyldKSwKKyAgICAoImE9YStiJmI9YitjIiwgWygnYScsICdhIGInKSwgKCdiJywgJ2IgYycpXSksCisgICAgKCJhPTEmYT0yIiwgWygnYScsICcxJyksICgnYScsICcyJyldKSwKK10KKworY2xhc3MgVXJsUGFyc2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2tSb3VuZHRyaXBzKHNlbGYsIHVybCwgcGFyc2VkLCBzcGxpdCk6CisgICAgICAgIHJlc3VsdCA9IHVybHBhcnNlLnVybHBhcnNlKHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHBhcnNlZCkKKyAgICAgICAgdCA9IChyZXN1bHQuc2NoZW1lLCByZXN1bHQubmV0bG9jLCByZXN1bHQucGF0aCwKKyAgICAgICAgICAgICByZXN1bHQucGFyYW1zLCByZXN1bHQucXVlcnksIHJlc3VsdC5mcmFnbWVudCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBwYXJzZWQpCisgICAgICAgICMgcHV0IGl0IGJhY2sgdG9nZXRoZXIgYW5kIGl0IHNob3VsZCBiZSB0aGUgc2FtZQorICAgICAgICByZXN1bHQyID0gdXJscGFyc2UudXJsdW5wYXJzZShyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0MiwgdXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDIsIHJlc3VsdC5nZXR1cmwoKSkKKworICAgICAgICAjIHRoZSByZXN1bHQgb2YgZ2V0dXJsKCkgaXMgYSBmaXhwb2ludDsgd2UgY2FuIGFsd2F5cyBwYXJzZSBpdAorICAgICAgICAjIGFnYWluIHRvIGdldCB0aGUgc2FtZSByZXN1bHQ6CisgICAgICAgIHJlc3VsdDMgPSB1cmxwYXJzZS51cmxwYXJzZShyZXN1bHQuZ2V0dXJsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5nZXR1cmwoKSwgcmVzdWx0LmdldHVybCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMsICAgICAgICAgIHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnNjaGVtZSwgICByZXN1bHQuc2NoZW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMubmV0bG9jLCAgIHJlc3VsdC5uZXRsb2MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5wYXRoLCAgICAgcmVzdWx0LnBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5wYXJhbXMsICAgcmVzdWx0LnBhcmFtcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnF1ZXJ5LCAgICByZXN1bHQucXVlcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5mcmFnbWVudCwgcmVzdWx0LmZyYWdtZW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMudXNlcm5hbWUsIHJlc3VsdC51c2VybmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnBhc3N3b3JkLCByZXN1bHQucGFzc3dvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5ob3N0bmFtZSwgcmVzdWx0Lmhvc3RuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucG9ydCwgICAgIHJlc3VsdC5wb3J0KQorCisgICAgICAgICMgY2hlY2sgdGhlIHJvdW5kdHJpcCB1c2luZyB1cmxzcGxpdCgpIGFzIHdlbGwKKyAgICAgICAgcmVzdWx0ID0gdXJscGFyc2UudXJsc3BsaXQodXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc3BsaXQpCisgICAgICAgIHQgPSAocmVzdWx0LnNjaGVtZSwgcmVzdWx0Lm5ldGxvYywgcmVzdWx0LnBhdGgsCisgICAgICAgICAgICAgcmVzdWx0LnF1ZXJ5LCByZXN1bHQuZnJhZ21lbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgc3BsaXQpCisgICAgICAgIHJlc3VsdDIgPSB1cmxwYXJzZS51cmx1bnNwbGl0KHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQyLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0MiwgcmVzdWx0LmdldHVybCgpKQorCisgICAgICAgICMgY2hlY2sgdGhlIGZpeHBvaW50IHByb3BlcnR5IG9mIHJlLXBhcnNpbmcgdGhlIHJlc3VsdCBvZiBnZXR1cmwoKQorICAgICAgICByZXN1bHQzID0gdXJscGFyc2UudXJsc3BsaXQocmVzdWx0LmdldHVybCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuZ2V0dXJsKCksIHJlc3VsdC5nZXR1cmwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLCAgICAgICAgICByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5zY2hlbWUsICAgcmVzdWx0LnNjaGVtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLm5ldGxvYywgICByZXN1bHQubmV0bG9jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucGF0aCwgICAgIHJlc3VsdC5wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucXVlcnksICAgIHJlc3VsdC5xdWVyeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLmZyYWdtZW50LCByZXN1bHQuZnJhZ21lbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My51c2VybmFtZSwgcmVzdWx0LnVzZXJuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucGFzc3dvcmQsIHJlc3VsdC5wYXNzd29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLmhvc3RuYW1lLCByZXN1bHQuaG9zdG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5wb3J0LCAgICAgcmVzdWx0LnBvcnQpCisKKyAgICBkZWYgdGVzdF9xc2woc2VsZik6CisgICAgICAgIGZvciBvcmlnLCBleHBlY3QgaW4gcGFyc2VfcXNsX3Rlc3RfY2FzZXM6CisgICAgICAgICAgICByZXN1bHQgPSB1cmxwYXJzZS5wYXJzZV9xc2wob3JpZywga2VlcF9ibGFua192YWx1ZXM9VHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3QsICJFcnJvciBwYXJzaW5nICVyIiAlIG9yaWcpCisgICAgICAgICAgICBleHBlY3Rfd2l0aG91dF9ibGFua3MgPSBbdiBmb3IgdiBpbiBleHBlY3QgaWYgbGVuKHZbMV0pXQorICAgICAgICAgICAgcmVzdWx0ID0gdXJscGFyc2UucGFyc2VfcXNsKG9yaWcsIGtlZXBfYmxhbmtfdmFsdWVzPUZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdF93aXRob3V0X2JsYW5rcywKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgJXIiICUgb3JpZykKKworCisgICAgZGVmIHRlc3Rfcm91bmR0cmlwcyhzZWxmKToKKyAgICAgICAgdGVzdGNhc2VzID0gWworICAgICAgICAgICAgKCdmaWxlOi8vL3RtcC9qdW5rLnR4dCcsCisgICAgICAgICAgICAgKCdmaWxlJywgJycsICcvdG1wL2p1bmsudHh0JywgJycsICcnLCAnJyksCisgICAgICAgICAgICAgKCdmaWxlJywgJycsICcvdG1wL2p1bmsudHh0JywgJycsICcnKSksCisgICAgICAgICAgICAoJ2ltYXA6Ly9tYWlsLnB5dGhvbi5vcmcvbWJveDEnLAorICAgICAgICAgICAgICgnaW1hcCcsICdtYWlsLnB5dGhvbi5vcmcnLCAnL21ib3gxJywgJycsICcnLCAnJyksCisgICAgICAgICAgICAgKCdpbWFwJywgJ21haWwucHl0aG9uLm9yZycsICcvbWJveDEnLCAnJywgJycpKSwKKyAgICAgICAgICAgICgnbW1zOi8vd21zLnN5cy5oaW5ldC5uZXQvY3RzL0RyYW1hLzA5MDA2MjUxMTAwLmFzZicsCisgICAgICAgICAgICAgKCdtbXMnLCAnd21zLnN5cy5oaW5ldC5uZXQnLCAnL2N0cy9EcmFtYS8wOTAwNjI1MTEwMC5hc2YnLAorICAgICAgICAgICAgICAnJywgJycsICcnKSwKKyAgICAgICAgICAgICAoJ21tcycsICd3bXMuc3lzLmhpbmV0Lm5ldCcsICcvY3RzL0RyYW1hLzA5MDA2MjUxMTAwLmFzZicsCisgICAgICAgICAgICAgICcnLCAnJykpLAorICAgICAgICAgICAgKCduZnM6Ly9zZXJ2ZXIvcGF0aC90by9maWxlLnR4dCcsCisgICAgICAgICAgICAgKCduZnMnLCAnc2VydmVyJywgJy9wYXRoL3RvL2ZpbGUudHh0JywgICcnLCAnJywgJycpLAorICAgICAgICAgICAgICgnbmZzJywgJ3NlcnZlcicsICcvcGF0aC90by9maWxlLnR4dCcsICcnLCAnJykpLAorICAgICAgICAgICAgKCdzdm4rc3NoOi8vc3ZuLnpvcGUub3JnL3JlcG9zL21haW4vWkNvbmZpZy90cnVuay8nLAorICAgICAgICAgICAgICgnc3ZuK3NzaCcsICdzdm4uem9wZS5vcmcnLCAnL3JlcG9zL21haW4vWkNvbmZpZy90cnVuay8nLAorICAgICAgICAgICAgICAnJywgJycsICcnKSwKKyAgICAgICAgICAgICAoJ3N2bitzc2gnLCAnc3ZuLnpvcGUub3JnJywgJy9yZXBvcy9tYWluL1pDb25maWcvdHJ1bmsvJywKKyAgICAgICAgICAgICAgJycsICcnKSksCisgICAgICAgICAgICAoJ2dpdCtzc2g6Ly9naXRAZ2l0aHViLmNvbS91c2VyL3Byb2plY3QuZ2l0JywKKyAgICAgICAgICAgICgnZ2l0K3NzaCcsICdnaXRAZ2l0aHViLmNvbScsJy91c2VyL3Byb2plY3QuZ2l0JywKKyAgICAgICAgICAgICAnJywnJywnJyksCisgICAgICAgICAgICAoJ2dpdCtzc2gnLCAnZ2l0QGdpdGh1Yi5jb20nLCcvdXNlci9wcm9qZWN0LmdpdCcsCisgICAgICAgICAgICAgJycsICcnKSkKKyAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHVybCwgcGFyc2VkLCBzcGxpdCBpbiB0ZXN0Y2FzZXM6CisgICAgICAgICAgICBzZWxmLmNoZWNrUm91bmR0cmlwcyh1cmwsIHBhcnNlZCwgc3BsaXQpCisKKyAgICBkZWYgdGVzdF9odHRwX3JvdW5kdHJpcHMoc2VsZik6CisgICAgICAgICMgdXJscGFyc2UudXJsc3BsaXQgdHJlYXRzICdodHRwOicgYXMgYW4gb3B0aW1pemVkIHNwZWNpYWwgY2FzZSwKKyAgICAgICAgIyBzbyB3ZSB0ZXN0IGJvdGggJ2h0dHA6JyBhbmQgJ2h0dHBzOicgaW4gYWxsIHRoZSBmb2xsb3dpbmcuCisgICAgICAgICMgVGhyZWUgY2hlZXJzIGZvciB3aGl0ZSBib3gga25vd2xlZGdlIQorICAgICAgICB0ZXN0Y2FzZXMgPSBbCisgICAgICAgICAgICAoJzovL3d3dy5weXRob24ub3JnJywKKyAgICAgICAgICAgICAoJ3d3dy5weXRob24ub3JnJywgJycsICcnLCAnJywgJycpLAorICAgICAgICAgICAgICgnd3d3LnB5dGhvbi5vcmcnLCAnJywgJycsICcnKSksCisgICAgICAgICAgICAoJzovL3d3dy5weXRob24ub3JnI2FiYycsCisgICAgICAgICAgICAgKCd3d3cucHl0aG9uLm9yZycsICcnLCAnJywgJycsICdhYmMnKSwKKyAgICAgICAgICAgICAoJ3d3dy5weXRob24ub3JnJywgJycsICcnLCAnYWJjJykpLAorICAgICAgICAgICAgKCc6Ly93d3cucHl0aG9uLm9yZz9xPWFiYycsCisgICAgICAgICAgICAgKCd3d3cucHl0aG9uLm9yZycsICcnLCAnJywgJ3E9YWJjJywgJycpLAorICAgICAgICAgICAgICgnd3d3LnB5dGhvbi5vcmcnLCAnJywgJ3E9YWJjJywgJycpKSwKKyAgICAgICAgICAgICgnOi8vd3d3LnB5dGhvbi5vcmcvI2FiYycsCisgICAgICAgICAgICAgKCd3d3cucHl0aG9uLm9yZycsICcvJywgJycsICcnLCAnYWJjJyksCisgICAgICAgICAgICAgKCd3d3cucHl0aG9uLm9yZycsICcvJywgJycsICdhYmMnKSksCisgICAgICAgICAgICAoJzovL2EvYi9jL2Q7cD9xI2YnLAorICAgICAgICAgICAgICgnYScsICcvYi9jL2QnLCAncCcsICdxJywgJ2YnKSwKKyAgICAgICAgICAgICAoJ2EnLCAnL2IvYy9kO3AnLCAncScsICdmJykpLAorICAgICAgICAgICAgXQorICAgICAgICBmb3Igc2NoZW1lIGluICgnaHR0cCcsICdodHRwcycpOgorICAgICAgICAgICAgZm9yIHVybCwgcGFyc2VkLCBzcGxpdCBpbiB0ZXN0Y2FzZXM6CisgICAgICAgICAgICAgICAgdXJsID0gc2NoZW1lICsgdXJsCisgICAgICAgICAgICAgICAgcGFyc2VkID0gKHNjaGVtZSwpICsgcGFyc2VkCisgICAgICAgICAgICAgICAgc3BsaXQgPSAoc2NoZW1lLCkgKyBzcGxpdAorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tSb3VuZHRyaXBzKHVybCwgcGFyc2VkLCBzcGxpdCkKKworICAgIGRlZiBjaGVja0pvaW4oc2VsZiwgYmFzZSwgcmVsdXJsLCBleHBlY3RlZCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJsam9pbihiYXNlLCByZWx1cmwpLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzZSwgcmVsdXJsLCBleHBlY3RlZCkpCisKKyAgICBkZWYgdGVzdF91bnBhcnNlX3BhcnNlKHNlbGYpOgorICAgICAgICBmb3IgdSBpbiBbJ1B5dGhvbicsICcuL1B5dGhvbicsJ3gtbmV3c2NoZW1lOi8vZm9vLmNvbS9zdHVmZicsJ3g6Ly95JywneDoveScsJ3g6LycsJy8nLF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybHBhcnNlLnVybHVuc3BsaXQodXJscGFyc2UudXJsc3BsaXQodSkpLCB1KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmx1bnBhcnNlKHVybHBhcnNlLnVybHBhcnNlKHUpKSwgdSkKKworICAgIGRlZiB0ZXN0X1JGQzE4MDgoc2VsZik6CisgICAgICAgICMgIm5vcm1hbCIgY2FzZXMgZnJvbSBSRkMgMTgwODoKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnZzpoJywgJ2c6aCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJ2cnLCAnaHR0cDovL2EvYi9jL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuL2cnLCAnaHR0cDovL2EvYi9jL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdnLycsICdodHRwOi8vYS9iL2MvZy8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcvZycsICdodHRwOi8vYS9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLy9nJywgJ2h0dHA6Ly9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnZz95JywgJ2h0dHA6Ly9hL2IvYy9nP3knKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdnP3kvLi94JywgJ2h0dHA6Ly9hL2IvYy9nP3kvLi94JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnI3MnLCAnaHR0cDovL2EvYi9jL2Q7cD9xI3MnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdnI3MnLCAnaHR0cDovL2EvYi9jL2cjcycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJ2cjcy8uL3gnLCAnaHR0cDovL2EvYi9jL2cjcy8uL3gnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdnP3kjcycsICdodHRwOi8vYS9iL2MvZz95I3MnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdnO3gnLCAnaHR0cDovL2EvYi9jL2c7eCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJ2c7eD95I3MnLCAnaHR0cDovL2EvYi9jL2c7eD95I3MnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuJywgJ2h0dHA6Ly9hL2IvYy8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuLycsICdodHRwOi8vYS9iL2MvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLi4nLCAnaHR0cDovL2EvYi8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuLi8nLCAnaHR0cDovL2EvYi8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuLi9nJywgJ2h0dHA6Ly9hL2IvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJy4uLy4uJywgJ2h0dHA6Ly9hLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJy4uLy4uLycsICdodHRwOi8vYS8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuLi8uLi9nJywgJ2h0dHA6Ly9hL2cnKQorCisgICAgICAgICMgImFibm9ybWFsIiBjYXNlcyBmcm9tIFJGQyAxODA4OgorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcnLCAnaHR0cDovL2EvYi9jL2Q7cD9xI2YnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuLi8uLi8uLi9nJywgJ2h0dHA6Ly9hLy4uL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuLi8uLi8uLi8uLi9nJywgJ2h0dHA6Ly9hLy4uLy4uL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcvLi9nJywgJ2h0dHA6Ly9hLy4vZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJy8uLi9nJywgJ2h0dHA6Ly9hLy4uL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdnLicsICdodHRwOi8vYS9iL2MvZy4nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuZycsICdodHRwOi8vYS9iL2MvLmcnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdnLi4nLCAnaHR0cDovL2EvYi9jL2cuLicpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJy4uZycsICdodHRwOi8vYS9iL2MvLi5nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLi8uLi9nJywgJ2h0dHA6Ly9hL2IvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJy4vZy8uJywgJ2h0dHA6Ly9hL2IvYy9nLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJ2cvLi9oJywgJ2h0dHA6Ly9hL2IvYy9nL2gnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdnLy4uL2gnLCAnaHR0cDovL2EvYi9jL2gnKQorCisgICAgICAgICMgUkZDIDE4MDggYW5kIFJGQyAxNjMwIGRpc2FncmVlIG9uIHRoZXNlIChhY2NvcmRpbmcgdG8gUkZDIDE4MDgpLAorICAgICAgICAjIHNvIHdlJ2xsIG5vdCBhY3R1YWxseSBydW4gdGhlc2UgdGVzdHMgKHdoaWNoIGV4cGVjdCAxODA4IGJlaGF2aW9yKS4KKyAgICAgICAgI3NlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJ2h0dHA6ZycsICdodHRwOmcnKQorICAgICAgICAjc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnaHR0cDonLCAnaHR0cDonKQorCisgICAgZGVmIHRlc3RfUkZDMjM2OChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxMTQ2NzogcGF0aCB0aGF0IHN0YXJ0cyB3aXRoIGEgbnVtYmVyIGlzIG5vdCBwYXJzZWQgY29ycmVjdGx5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoJ21haWx0bzoxMzM3QGV4YW1wbGUub3JnJyksCisgICAgICAgICAgICAgICAgKCdtYWlsdG8nLCAnJywgJzEzMzdAZXhhbXBsZS5vcmcnLCAnJywgJycsICcnKSkKKworICAgIGRlZiB0ZXN0X1JGQzIzOTYoc2VsZik6CisgICAgICAgICMgY2FzZXMgZnJvbSBSRkMgMjM5NgorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnOmgnLCAnZzpoJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnZycsICdodHRwOi8vYS9iL2MvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJy4vZycsICdodHRwOi8vYS9iL2MvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2cvJywgJ2h0dHA6Ly9hL2IvYy9nLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJy9nJywgJ2h0dHA6Ly9hL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcvL2cnLCAnaHR0cDovL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnP3knLCAnaHR0cDovL2EvYi9jL2c/eScpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJyNzJywgJ2h0dHA6Ly9hL2IvYy9kO3A/cSNzJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnZyNzJywgJ2h0dHA6Ly9hL2IvYy9nI3MnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnP3kjcycsICdodHRwOi8vYS9iL2MvZz95I3MnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnO3gnLCAnaHR0cDovL2EvYi9jL2c7eCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2c7eD95I3MnLCAnaHR0cDovL2EvYi9jL2c7eD95I3MnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcuJywgJ2h0dHA6Ly9hL2IvYy8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcuLycsICdodHRwOi8vYS9iL2MvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnLi4nLCAnaHR0cDovL2EvYi8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcuLi8nLCAnaHR0cDovL2EvYi8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcuLi9nJywgJ2h0dHA6Ly9hL2IvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJy4uLy4uJywgJ2h0dHA6Ly9hLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJy4uLy4uLycsICdodHRwOi8vYS8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcuLi8uLi9nJywgJ2h0dHA6Ly9hL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcnLCBSRkMyMzk2X0JBU0UpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJy4uLy4uLy4uL2cnLCAnaHR0cDovL2EvLi4vZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJy4uLy4uLy4uLy4uL2cnLCAnaHR0cDovL2EvLi4vLi4vZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJy8uL2cnLCAnaHR0cDovL2EvLi9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnLy4uL2cnLCAnaHR0cDovL2EvLi4vZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2cuJywgJ2h0dHA6Ly9hL2IvYy9nLicpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJy5nJywgJ2h0dHA6Ly9hL2IvYy8uZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2cuLicsICdodHRwOi8vYS9iL2MvZy4uJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnLi5nJywgJ2h0dHA6Ly9hL2IvYy8uLmcnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcuLy4uL2cnLCAnaHR0cDovL2EvYi9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnLi9nLy4nLCAnaHR0cDovL2EvYi9jL2cvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnZy8uL2gnLCAnaHR0cDovL2EvYi9jL2cvaCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2cvLi4vaCcsICdodHRwOi8vYS9iL2MvaCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2c7eD0xLy4veScsICdodHRwOi8vYS9iL2MvZzt4PTEveScpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2c7eD0xLy4uL3knLCAnaHR0cDovL2EvYi9jL3knKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnP3kvLi94JywgJ2h0dHA6Ly9hL2IvYy9nP3kvLi94JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnZz95Ly4uL3gnLCAnaHR0cDovL2EvYi9jL2c/eS8uLi94JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnZyNzLy4veCcsICdodHRwOi8vYS9iL2MvZyNzLy4veCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2cjcy8uLi94JywgJ2h0dHA6Ly9hL2IvYy9nI3MvLi4veCcpCisKKyAgICBkZWYgdGVzdF9SRkMzOTg2KHNlbGYpOgorICAgICAgICAjIFRlc3QgY2FzZXMgZnJvbSBSRkMzOTg2CisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJz95JywnaHR0cDovL2EvYi9jL2Q7cD95JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnO3gnLCAnaHR0cDovL2EvYi9jLzt4JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnZzpoJywnZzpoJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnZycsJ2h0dHA6Ly9hL2IvYy9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnLi9nJywnaHR0cDovL2EvYi9jL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICdnLycsJ2h0dHA6Ly9hL2IvYy9nLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy9nJywnaHR0cDovL2EvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy8vZycsJ2h0dHA6Ly9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnP3knLCdodHRwOi8vYS9iL2MvZDtwP3knKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICdnP3knLCdodHRwOi8vYS9iL2MvZz95JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnI3MnLCdodHRwOi8vYS9iL2MvZDtwP3EjcycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2cjcycsJ2h0dHA6Ly9hL2IvYy9nI3MnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICdnP3kjcycsJ2h0dHA6Ly9hL2IvYy9nP3kjcycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJzt4JywnaHR0cDovL2EvYi9jLzt4JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnZzt4JywnaHR0cDovL2EvYi9jL2c7eCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2c7eD95I3MnLCdodHRwOi8vYS9iL2MvZzt4P3kjcycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJycsJ2h0dHA6Ly9hL2IvYy9kO3A/cScpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy4nLCdodHRwOi8vYS9iL2MvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnLi8nLCdodHRwOi8vYS9iL2MvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnLi4nLCdodHRwOi8vYS9iLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy4uLycsJ2h0dHA6Ly9hL2IvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnLi4vZycsJ2h0dHA6Ly9hL2IvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy4uLy4uJywnaHR0cDovL2EvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnLi4vLi4vJywnaHR0cDovL2EvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnLi4vLi4vZycsJ2h0dHA6Ly9hL2cnKQorCisgICAgICAgICNBYm5vcm1hbCBFeGFtcGxlcworCisgICAgICAgICMgVGhlICdhYm5vcm1hbCBzY2VuYXJpb3MnIGFyZSBpbmNvbXBhdGlibGUgd2l0aCBSRkMyOTg2IHBhcnNpbmcKKyAgICAgICAgIyBUZXN0cyBhcmUgaGVyZSBmb3IgcmVmZXJlbmNlLgorCisgICAgICAgICNzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICcuLi8uLi8uLi9nJywnaHR0cDovL2EvZycpCisgICAgICAgICNzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICcuLi8uLi8uLi8uLi9nJywnaHR0cDovL2EvZycpCisgICAgICAgICNzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICcvLi9nJywnaHR0cDovL2EvZycpCisgICAgICAgICNzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICcvLi4vZycsJ2h0dHA6Ly9hL2cnKQorCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2cuJywnaHR0cDovL2EvYi9jL2cuJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnLmcnLCdodHRwOi8vYS9iL2MvLmcnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICdnLi4nLCdodHRwOi8vYS9iL2MvZy4uJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnLi5nJywnaHR0cDovL2EvYi9jLy4uZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy4vLi4vZycsJ2h0dHA6Ly9hL2IvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy4vZy8uJywnaHR0cDovL2EvYi9jL2cvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnZy8uL2gnLCdodHRwOi8vYS9iL2MvZy9oJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnZy8uLi9oJywnaHR0cDovL2EvYi9jL2gnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICdnO3g9MS8uL3knLCdodHRwOi8vYS9iL2MvZzt4PTEveScpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2c7eD0xLy4uL3knLCdodHRwOi8vYS9iL2MveScpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2c/eS8uL3gnLCdodHRwOi8vYS9iL2MvZz95Ly4veCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2c/eS8uLi94JywnaHR0cDovL2EvYi9jL2c/eS8uLi94JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnZyNzLy4veCcsJ2h0dHA6Ly9hL2IvYy9nI3MvLi94JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnZyNzLy4uL3gnLCdodHRwOi8vYS9iL2MvZyNzLy4uL3gnKQorICAgICAgICAjc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnaHR0cDpnJywnaHR0cDpnJykgIyBzdHJpY3QgcGFyc2VyCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2h0dHA6ZycsJ2h0dHA6Ly9hL2IvYy9nJykgIyByZWxheGVkIHBhcnNlcgorCisgICAgICAgICMgVGVzdCBmb3IgaXNzdWU5NzIxCisgICAgICAgIHNlbGYuY2hlY2tKb2luKCdodHRwOi8vYS9iL2MvZGUnLCAnO3gnLCdodHRwOi8vYS9iL2MvO3gnKQorCisgICAgZGVmIHRlc3RfdXJsam9pbnMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnZzpoJywnZzpoJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICdodHRwOmcnLCdodHRwOi8vYS9iL2MvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnaHR0cDonLCdodHRwOi8vYS9iL2MvZCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnZycsJ2h0dHA6Ly9hL2IvYy9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICcuL2cnLCdodHRwOi8vYS9iL2MvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnZy8nLCdodHRwOi8vYS9iL2MvZy8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJy9nJywnaHR0cDovL2EvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnLy9nJywnaHR0cDovL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJz95JywnaHR0cDovL2EvYi9jL2Q/eScpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnZz95JywnaHR0cDovL2EvYi9jL2c/eScpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnZz95Ly4veCcsJ2h0dHA6Ly9hL2IvYy9nP3kvLi94JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICcuJywnaHR0cDovL2EvYi9jLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnLi8nLCdodHRwOi8vYS9iL2MvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICcuLicsJ2h0dHA6Ly9hL2IvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICcuLi8nLCdodHRwOi8vYS9iLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnLi4vZycsJ2h0dHA6Ly9hL2IvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnLi4vLi4nLCdodHRwOi8vYS8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJy4uLy4uL2cnLCdodHRwOi8vYS9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICcuLi8uLi8uLi9nJywnaHR0cDovL2EvLi4vZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnLi8uLi9nJywnaHR0cDovL2EvYi9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICcuL2cvLicsJ2h0dHA6Ly9hL2IvYy9nLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnLy4vZycsJ2h0dHA6Ly9hLy4vZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnZy8uL2gnLCdodHRwOi8vYS9iL2MvZy9oJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICdnLy4uL2gnLCdodHRwOi8vYS9iL2MvaCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnaHR0cDpnJywnaHR0cDovL2EvYi9jL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJ2h0dHA6JywnaHR0cDovL2EvYi9jL2QnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJ2h0dHA6P3knLCdodHRwOi8vYS9iL2MvZD95JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICdodHRwOmc/eScsJ2h0dHA6Ly9hL2IvYy9nP3knKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJ2h0dHA6Zz95Ly4veCcsJ2h0dHA6Ly9hL2IvYy9nP3kvLi94JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oJ2h0dHA6Ly8vJywgJy4uJywnaHR0cDovLy8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbignJywgJ2h0dHA6Ly9hL2IvYy9nP3kvLi94JywnaHR0cDovL2EvYi9jL2c/eS8uL3gnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbignJywgJ2h0dHA6Ly9hLy4vZycsICdodHRwOi8vYS8uL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbignc3ZuOi8vcGF0aHRvcmVwby9kaXIxJywnZGlyMicsJ3N2bjovL3BhdGh0b3JlcG8vZGlyMicpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKCdzdm4rc3NoOi8vcGF0aHRvcmVwby9kaXIxJywnZGlyMicsJ3N2bitzc2g6Ly9wYXRodG9yZXBvL2RpcjInKQorCisgICAgZGVmIHRlc3RfUkZDMjczMihzZWxmKToKKyAgICAgICAgZm9yIHVybCwgaG9zdG5hbWUsIHBvcnQgaW4gWworICAgICAgICAgICAgKCdodHRwOi8vVGVzdC5weXRob24ub3JnOjU0MzIvZm9vLycsICd0ZXN0LnB5dGhvbi5vcmcnLCA1NDMyKSwKKyAgICAgICAgICAgICgnaHR0cDovLzEyLjM0LjU2Ljc4OjU0MzIvZm9vLycsICcxMi4zNC41Ni43OCcsIDU0MzIpLAorICAgICAgICAgICAgKCdodHRwOi8vWzo6MV06NTQzMi9mb28vJywgJzo6MScsIDU0MzIpLAorICAgICAgICAgICAgKCdodHRwOi8vW2RlYWQ6YmVlZjo6MV06NTQzMi9mb28vJywgJ2RlYWQ6YmVlZjo6MScsIDU0MzIpLAorICAgICAgICAgICAgKCdodHRwOi8vW2RlYWQ6YmVlZjo6XTo1NDMyL2Zvby8nLCAnZGVhZDpiZWVmOjonLCA1NDMyKSwKKyAgICAgICAgICAgICgnaHR0cDovL1tkZWFkOmJlZWY6Y2FmZTo1NDE3OmFmZmU6OEZBMzpkZWFmOmZlZWRdOjU0MzIvZm9vLycsCisgICAgICAgICAgICAgJ2RlYWQ6YmVlZjpjYWZlOjU0MTc6YWZmZTo4ZmEzOmRlYWY6ZmVlZCcsIDU0MzIpLAorICAgICAgICAgICAgKCdodHRwOi8vWzo6MTIuMzQuNTYuNzhdOjU0MzIvZm9vLycsICc6OjEyLjM0LjU2Ljc4JywgNTQzMiksCisgICAgICAgICAgICAoJ2h0dHA6Ly9bOjpmZmZmOjEyLjM0LjU2Ljc4XTo1NDMyL2Zvby8nLAorICAgICAgICAgICAgICc6OmZmZmY6MTIuMzQuNTYuNzgnLCA1NDMyKSwKKyAgICAgICAgICAgICgnaHR0cDovL1Rlc3QucHl0aG9uLm9yZy9mb28vJywgJ3Rlc3QucHl0aG9uLm9yZycsIE5vbmUpLAorICAgICAgICAgICAgKCdodHRwOi8vMTIuMzQuNTYuNzgvZm9vLycsICcxMi4zNC41Ni43OCcsIE5vbmUpLAorICAgICAgICAgICAgKCdodHRwOi8vWzo6MV0vZm9vLycsICc6OjEnLCBOb25lKSwKKyAgICAgICAgICAgICgnaHR0cDovL1tkZWFkOmJlZWY6OjFdL2Zvby8nLCAnZGVhZDpiZWVmOjoxJywgTm9uZSksCisgICAgICAgICAgICAoJ2h0dHA6Ly9bZGVhZDpiZWVmOjpdL2Zvby8nLCAnZGVhZDpiZWVmOjonLCBOb25lKSwKKyAgICAgICAgICAgICgnaHR0cDovL1tkZWFkOmJlZWY6Y2FmZTo1NDE3OmFmZmU6OEZBMzpkZWFmOmZlZWRdL2Zvby8nLAorICAgICAgICAgICAgICdkZWFkOmJlZWY6Y2FmZTo1NDE3OmFmZmU6OGZhMzpkZWFmOmZlZWQnLCBOb25lKSwKKyAgICAgICAgICAgICgnaHR0cDovL1s6OjEyLjM0LjU2Ljc4XS9mb28vJywgJzo6MTIuMzQuNTYuNzgnLCBOb25lKSwKKyAgICAgICAgICAgICgnaHR0cDovL1s6OmZmZmY6MTIuMzQuNTYuNzhdL2Zvby8nLAorICAgICAgICAgICAgICc6OmZmZmY6MTIuMzQuNTYuNzgnLCBOb25lKSwKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICB1cmxwYXJzZWQgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh1cmxwYXJzZWQuaG9zdG5hbWUsIHVybHBhcnNlZC5wb3J0KSAsIChob3N0bmFtZSwgcG9ydCkpCisKKyAgICAgICAgZm9yIGludmFsaWRfdXJsIGluIFsKKyAgICAgICAgICAgICAgICAnaHR0cDovLzo6MTIuMzQuNTYuNzhdLycsCisgICAgICAgICAgICAgICAgJ2h0dHA6Ly9bOjoxL2Zvby8nLAorICAgICAgICAgICAgICAgICdmdHA6Ly9bOjoxL2Zvby9iYWRdL2JhZCcsCisgICAgICAgICAgICAgICAgJ2h0dHA6Ly9bOjoxL2Zvby9iYWRdL2JhZCcsCisgICAgICAgICAgICAgICAgJ2h0dHA6Ly9bOjpmZmZmOjEyLjM0LjU2Ljc4J106CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1cmxwYXJzZS51cmxwYXJzZSwgaW52YWxpZF91cmwpCisKKyAgICBkZWYgdGVzdF91cmxkZWZyYWcoc2VsZik6CisgICAgICAgIGZvciB1cmwsIGRlZnJhZywgZnJhZyBpbiBbCisgICAgICAgICAgICAoJ2h0dHA6Ly9weXRob24ub3JnI2ZyYWcnLCAnaHR0cDovL3B5dGhvbi5vcmcnLCAnZnJhZycpLAorICAgICAgICAgICAgKCdodHRwOi8vcHl0aG9uLm9yZycsICdodHRwOi8vcHl0aG9uLm9yZycsICcnKSwKKyAgICAgICAgICAgICgnaHR0cDovL3B5dGhvbi5vcmcvI2ZyYWcnLCAnaHR0cDovL3B5dGhvbi5vcmcvJywgJ2ZyYWcnKSwKKyAgICAgICAgICAgICgnaHR0cDovL3B5dGhvbi5vcmcvJywgJ2h0dHA6Ly9weXRob24ub3JnLycsICcnKSwKKyAgICAgICAgICAgICgnaHR0cDovL3B5dGhvbi5vcmcvP3EjZnJhZycsICdodHRwOi8vcHl0aG9uLm9yZy8/cScsICdmcmFnJyksCisgICAgICAgICAgICAoJ2h0dHA6Ly9weXRob24ub3JnLz9xJywgJ2h0dHA6Ly9weXRob24ub3JnLz9xJywgJycpLAorICAgICAgICAgICAgKCdodHRwOi8vcHl0aG9uLm9yZy9wI2ZyYWcnLCAnaHR0cDovL3B5dGhvbi5vcmcvcCcsICdmcmFnJyksCisgICAgICAgICAgICAoJ2h0dHA6Ly9weXRob24ub3JnL3A/cScsICdodHRwOi8vcHl0aG9uLm9yZy9wP3EnLCAnJyksCisgICAgICAgICAgICAoUkZDMTgwOF9CQVNFLCAnaHR0cDovL2EvYi9jL2Q7cD9xJywgJ2YnKSwKKyAgICAgICAgICAgIChSRkMyMzk2X0JBU0UsICdodHRwOi8vYS9iL2MvZDtwP3EnLCAnJyksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmxkZWZyYWcodXJsKSwgKGRlZnJhZywgZnJhZykpCisKKyAgICBkZWYgdGVzdF91cmxzcGxpdF9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICB1cmwgPSAiSFRUUDovL1dXVy5QWVRIT04uT1JHL2RvYy8jZnJhZyIKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHNwbGl0KHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnNjaGVtZSwgImh0dHAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAiV1dXLlBZVEhPTi5PUkciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGF0aCwgIi9kb2MvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnF1ZXJ5LCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmZyYWdtZW50LCAiZnJhZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC51c2VybmFtZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBhc3N3b3JkLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuaG9zdG5hbWUsICJ3d3cucHl0aG9uLm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3J0LCBOb25lKQorICAgICAgICAjIGdldHVybCgpIHdvbid0IHJldHVybiBleGFjdGx5IHRoZSBvcmlnaW5hbCBVUkwgaW4gdGhpcyBjYXNlCisgICAgICAgICMgc2luY2UgdGhlIHNjaGVtZSBpcyBhbHdheXMgY2FzZS1ub3JtYWxpemVkCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKHAuZ2V0dXJsKCksIHVybCkKKworICAgICAgICB1cmwgPSAiaHR0cDovL1VzZXI6UGFzc0B3d3cucHl0aG9uLm9yZzowODAvZG9jLz9xdWVyeT15ZXMjZnJhZyIKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHNwbGl0KHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnNjaGVtZSwgImh0dHAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAiVXNlcjpQYXNzQHd3dy5weXRob24ub3JnOjA4MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wYXRoLCAiL2RvYy8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucXVlcnksICJxdWVyeT15ZXMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZnJhZ21lbnQsICJmcmFnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnVzZXJuYW1lLCAiVXNlciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wYXNzd29yZCwgIlBhc3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuaG9zdG5hbWUsICJ3d3cucHl0aG9uLm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3J0LCA4MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmdldHVybCgpLCB1cmwpCisKKyAgICAgICAgIyBBZGRyZXNzaW5nIGlzc3VlMTY5OCwgd2hpY2ggc3VnZ2VzdHMgVXNlcm5hbWUgY2FuIGNvbnRhaW4KKyAgICAgICAgIyAiQCIgY2hhcmFjdGVycy4gIFRob3VnaCBub3QgUkZDIGNvbXBsaWFudCwgbWFueSBmdHAgc2l0ZXMgYWxsb3cKKyAgICAgICAgIyBhbmQgcmVxdWVzdCBlbWFpbCBhZGRyZXNzZXMgYXMgdXNlcm5hbWVzLgorCisgICAgICAgIHVybCA9ICJodHRwOi8vVXNlckBleGFtcGxlLmNvbTpQYXNzQHd3dy5weXRob24ub3JnOjA4MC9kb2MvP3F1ZXJ5PXllcyNmcmFnIgorICAgICAgICBwID0gdXJscGFyc2UudXJsc3BsaXQodXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc2NoZW1lLCAiaHR0cCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJVc2VyQGV4YW1wbGUuY29tOlBhc3NAd3d3LnB5dGhvbi5vcmc6MDgwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBhdGgsICIvZG9jLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5xdWVyeSwgInF1ZXJ5PXllcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5mcmFnbWVudCwgImZyYWciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAudXNlcm5hbWUsICJVc2VyQGV4YW1wbGUuY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBhc3N3b3JkLCAiUGFzcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5ob3N0bmFtZSwgInd3dy5weXRob24ub3JnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIDgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0dXJsKCksIHVybCkKKworICAgICAgICAjIFZlcmlmeSBhbiBpbGxlZ2FsIHBvcnQgb2YgdmFsdWUgZ3JlYXRlciB0aGFuIDY1NTM1IGlzIHNldCBhcyBOb25lCisgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmc6NjU1MzYiCisgICAgICAgIHAgPSB1cmxwYXJzZS51cmxzcGxpdCh1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3J0LCBOb25lKQorCisgICAgZGVmIHRlc3RfaXNzdWUxNDA3MihzZWxmKToKKyAgICAgICAgcDEgPSB1cmxwYXJzZS51cmxzcGxpdCgndGVsOiszMS02NDEwNDQxNTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnNjaGVtZSwgJ3RlbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEucGF0aCwgJyszMS02NDEwNDQxNTMnKQorCisgICAgICAgIHAyID0gdXJscGFyc2UudXJsc3BsaXQoJ3RlbDorMzE2NDEwNDQxNTMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAyLnNjaGVtZSwgJ3RlbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDIucGF0aCwgJyszMTY0MTA0NDE1MycpCisKKyAgICAgICAgIyBBc3NlcnQgZm9yIHVybHBhcnNlCisgICAgICAgIHAxID0gdXJscGFyc2UudXJscGFyc2UoJ3RlbDorMzEtNjQxMDQ0MTUzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5zY2hlbWUsICd0ZWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhdGgsICcrMzEtNjQxMDQ0MTUzJykKKworICAgICAgICBwMiA9IHVybHBhcnNlLnVybHBhcnNlKCd0ZWw6KzMxNjQxMDQ0MTUzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMi5zY2hlbWUsICd0ZWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAyLnBhdGgsICcrMzE2NDEwNDQxNTMnKQorCisKKyAgICBkZWYgdGVzdF90ZWx1cmxfcGFyYW1zKHNlbGYpOgorICAgICAgICBwMSA9IHVybHBhcnNlLnVybHBhcnNlKCd0ZWw6MTIzLTQ7cGhvbmUtY29udGV4dD0rMS02NTAtNTE2JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5zY2hlbWUsICd0ZWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhdGgsICcxMjMtNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEucGFyYW1zLCAncGhvbmUtY29udGV4dD0rMS02NTAtNTE2JykKKworICAgICAgICBwMSA9IHVybHBhcnNlLnVybHBhcnNlKCd0ZWw6KzEtMjAxLTU1NS0wMTIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5zY2hlbWUsICd0ZWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhdGgsICcrMS0yMDEtNTU1LTAxMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhcmFtcywgJycpCisKKyAgICAgICAgcDEgPSB1cmxwYXJzZS51cmxwYXJzZSgndGVsOjcwNDI7cGhvbmUtY29udGV4dD1leGFtcGxlLmNvbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEuc2NoZW1lLCAndGVsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5wYXRoLCAnNzA0MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEucGFyYW1zLCAncGhvbmUtY29udGV4dD1leGFtcGxlLmNvbScpCisKKyAgICAgICAgcDEgPSB1cmxwYXJzZS51cmxwYXJzZSgndGVsOjg2My0xMjM0O3Bob25lLWNvbnRleHQ9KzEtOTE0LTU1NScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEuc2NoZW1lLCAndGVsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5wYXRoLCAnODYzLTEyMzQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhcmFtcywgJ3Bob25lLWNvbnRleHQ9KzEtOTE0LTU1NScpCisKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXNfYmFkX3BvcnQoc2VsZik6CisgICAgICAgICIiIkNoZWNrIGhhbmRsaW5nIG9mIG5vbi1pbnRlZ2VyIHBvcnRzLiIiIgorICAgICAgICBwID0gdXJscGFyc2UudXJsc3BsaXQoImh0dHA6Ly93d3cuZXhhbXBsZS5uZXQ6Zm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgInd3dy5leGFtcGxlLm5ldDpmb28iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IHAucG9ydCkKKworICAgICAgICBwID0gdXJscGFyc2UudXJscGFyc2UoImh0dHA6Ly93d3cuZXhhbXBsZS5uZXQ6Zm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgInd3dy5leGFtcGxlLm5ldDpmb28iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IHAucG9ydCkKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXNfd2l0aG91dF9uZXRsb2Moc2VsZik6CisgICAgICAgICMgVGhpcyBleGFtcGxlIGlzIHN0cmFpZ2h0IGZyb20gUkZDIDMyNjEuICBJdCBsb29rcyBsaWtlIGl0CisgICAgICAgICMgc2hvdWxkIGFsbG93IHRoZSB1c2VybmFtZSwgaG9zdG5hbWUsIGFuZCBwb3J0IHRvIGJlIGZpbGxlZAorICAgICAgICAjIGluLCBidXQgZG9lc24ndC4gIFNpbmNlIGl0J3MgYSBVUkkgYW5kIGRvZXNuJ3QgdXNlIHRoZQorICAgICAgICAjIHNjaGVtZTovL25ldGxvYyBzeW50YXgsIHRoZSBuZXRsb2MgYW5kIHJlbGF0ZWQgYXR0cmlidXRlcworICAgICAgICAjIHNob3VsZCBiZSBsZWZ0IGVtcHR5LgorICAgICAgICB1cmkgPSAic2lwOmFsaWNlQGF0bGFudGEuY29tO21hZGRyPTIzOS4yNTUuMjU1LjE7dHRsPTE1IgorICAgICAgICBwID0gdXJscGFyc2UudXJsc3BsaXQodXJpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnVzZXJuYW1lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGFzc3dvcmQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5ob3N0bmFtZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5nZXR1cmwoKSwgdXJpKQorCisgICAgICAgIHAgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAudXNlcm5hbWUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wYXNzd29yZCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmhvc3RuYW1lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9ydCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmdldHVybCgpLCB1cmkpCisKKyAgICBkZWYgdGVzdF9jYWNoaW5nKHNlbGYpOgorICAgICAgICAjIFRlc3QgY2FzZSBmb3IgYnVnICMxMzEzMTE5CisgICAgICAgIHVyaSA9ICJodHRwOi8vZXhhbXBsZS5jb20vZG9jLyIKKyAgICAgICAgdW5pY29kZV91cmkgPSB1bmljb2RlKHVyaSkKKworICAgICAgICB1cmxwYXJzZS51cmxwYXJzZSh1bmljb2RlX3VyaSkKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHBhcnNlKHVyaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHAuc2NoZW1lKSwgdHlwZSh1cmkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocC5ob3N0bmFtZSksIHR5cGUodXJpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHAucGF0aCksIHR5cGUodXJpKSkKKworICAgIGRlZiB0ZXN0X25vc2xhc2goc2VsZik6CisgICAgICAgICMgSXNzdWUgMTYzNzogaHR0cDovL2Zvby5jb20/cXVlcnkgaXMgbGVnYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmxwYXJzZSgiaHR0cDovL2V4YW1wbGUuY29tP2JsYWhibGFoPS9mb28iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2h0dHAnLCAnZXhhbXBsZS5jb20nLCAnJywgJycsICdibGFoYmxhaD0vZm9vJywgJycpKQorCisgICAgZGVmIHRlc3RfYW55c2NoZW1lKHNlbGYpOgorICAgICAgICAjIElzc3VlIDc5MDQ6IHMzOi8vZm9vLmNvbS9zdHVmZiBoYXMgbmV0bG9jICJmb28uY29tIi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmxwYXJzZSgiczM6Ly9mb28uY29tL3N0dWZmIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdzMycsJ2Zvby5jb20nLCcvc3R1ZmYnLCcnLCcnLCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmxwYXJzZSgieC1uZXdzY2hlbWU6Ly9mb28uY29tL3N0dWZmIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCd4LW5ld3NjaGVtZScsJ2Zvby5jb20nLCcvc3R1ZmYnLCcnLCcnLCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmxwYXJzZSgieC1uZXdzY2hlbWU6Ly9mb28uY29tL3N0dWZmP3F1ZXJ5I2ZyYWdtZW50IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCd4LW5ld3NjaGVtZScsJ2Zvby5jb20nLCcvc3R1ZmYnLCcnLCdxdWVyeScsJ2ZyYWdtZW50JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoIngtbmV3c2NoZW1lOi8vZm9vLmNvbS9zdHVmZj9xdWVyeSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgneC1uZXdzY2hlbWUnLCdmb28uY29tJywnL3N0dWZmJywnJywncXVlcnknLCcnKSkKKworICAgIGRlZiB0ZXN0X3dpdGhvdXRzY2hlbWUoc2VsZik6CisgICAgICAgICMgVGVzdCB1cmxwYXJzZSB3aXRob3V0IHNjaGVtZQorICAgICAgICAjIElzc3VlIDc1NDAxNjogdXJscGFyc2UgZ29lcyB3cm9uZyB3aXRoIElQOnBvcnQgd2l0aG91dCBzY2hlbWUKKyAgICAgICAgIyBSRkMgMTgwOCBzcGVjaWZpZXMgdGhhdCBuZXRsb2Mgc2hvdWxkIHN0YXJ0IHdpdGggLy8sIHVybHBhcnNlIGV4cGVjdHMKKyAgICAgICAgIyB0aGUgc2FtZSwgb3RoZXJ3aXNlIGl0IGNsYXNzaWZpZXMgdGhlIHBvcnRpb24gb2YgdXJsIGFzIHBhdGguCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoInBhdGgiKSwKKyAgICAgICAgICAgICAgICAoJycsJycsJ3BhdGgnLCcnLCcnLCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmxwYXJzZSgiLy93d3cucHl0aG9uLm9yZzo4MCIpLAorICAgICAgICAgICAgICAgICgnJywnd3d3LnB5dGhvbi5vcmc6ODAnLCcnLCcnLCcnLCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmxwYXJzZSgiaHR0cDovL3d3dy5weXRob24ub3JnOjgwIiksCisgICAgICAgICAgICAgICAgKCdodHRwJywnd3d3LnB5dGhvbi5vcmc6ODAnLCcnLCcnLCcnLCcnKSkKKworICAgIGRlZiB0ZXN0X3BvcnRzZXBhcmF0b3Ioc2VsZik6CisgICAgICAgICMgSXNzdWUgNzU0MDE2IG1ha2VzIGNoYW5nZXMgZm9yIHBvcnQgc2VwYXJhdG9yICc6JyBmcm9tIHNjaGVtZSBzZXBhcmF0b3IKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmxwYXJzZSgicGF0aDo4MCIpLAorICAgICAgICAgICAgICAgICgnJywnJywncGF0aDo4MCcsJycsJycsJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybHBhcnNlLnVybHBhcnNlKCJodHRwOiIpLCgnaHR0cCcsJycsJycsJycsJycsJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybHBhcnNlLnVybHBhcnNlKCJodHRwczoiKSwoJ2h0dHBzJywnJywnJywnJywnJywnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoImh0dHA6Ly93d3cucHl0aG9uLm9yZzo4MCIpLAorICAgICAgICAgICAgICAgICgnaHR0cCcsJ3d3dy5weXRob24ub3JnOjgwJywnJywnJywnJywnJykpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFVybFBhcnNlVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybHBhcnNlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybHBhcnNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmUwMzY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJscGFyc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybHBhcnNlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybHBhcnNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmUwMzY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJscGFyc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJkaWN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjZWNkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CkBAIC0wLDAgKzEsMzUwIEBACisjIENoZWNrIGV2ZXJ5IHBhdGggdGhyb3VnaCBldmVyeSBtZXRob2Qgb2YgVXNlckRpY3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQsIG1hcHBpbmdfdGVzdHMKK2ltcG9ydCBVc2VyRGljdAorCitkMCA9IHt9CitkMSA9IHsib25lIjogMX0KK2QyID0geyJvbmUiOiAxLCAidHdvIjogMn0KK2QzID0geyJvbmUiOiAxLCAidHdvIjogMywgInRocmVlIjogNX0KK2Q0ID0geyJvbmUiOiBOb25lLCAidHdvIjogTm9uZX0KK2Q1ID0geyJvbmUiOiAxLCAidHdvIjogMX0KKworY2xhc3MgVXNlckRpY3RUZXN0KG1hcHBpbmdfdGVzdHMuVGVzdEhhc2hNYXBwaW5nUHJvdG9jb2wpOgorICAgIHR5cGUydGVzdCA9IFVzZXJEaWN0Lkl0ZXJhYmxlVXNlckRpY3QKKworICAgIGRlZiB0ZXN0X2FsbChzZWxmKToKKyAgICAgICAgIyBUZXN0IGNvbnN0cnVjdG9ycworICAgICAgICB1ID0gVXNlckRpY3QuVXNlckRpY3QoKQorICAgICAgICB1MCA9IFVzZXJEaWN0LlVzZXJEaWN0KGQwKQorICAgICAgICB1MSA9IFVzZXJEaWN0LlVzZXJEaWN0KGQxKQorICAgICAgICB1MiA9IFVzZXJEaWN0Lkl0ZXJhYmxlVXNlckRpY3QoZDIpCisKKyAgICAgICAgdXUgPSBVc2VyRGljdC5Vc2VyRGljdCh1KQorICAgICAgICB1dTAgPSBVc2VyRGljdC5Vc2VyRGljdCh1MCkKKyAgICAgICAgdXUxID0gVXNlckRpY3QuVXNlckRpY3QodTEpCisgICAgICAgIHV1MiA9IFVzZXJEaWN0LlVzZXJEaWN0KHUyKQorCisgICAgICAgICMga2V5d29yZCBhcmcgY29uc3RydWN0b3IKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVc2VyRGljdC5Vc2VyRGljdChvbmU9MSwgdHdvPTIpLCBkMikKKyAgICAgICAgIyBpdGVtIHNlcXVlbmNlIGNvbnN0cnVjdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXNlckRpY3QuVXNlckRpY3QoWygnb25lJywxKSwgKCd0d28nLDIpXSksIGQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVzZXJEaWN0LlVzZXJEaWN0KGRpY3Q9Wygnb25lJywxKSwgKCd0d28nLDIpXSksIGQyKQorICAgICAgICAjIGJvdGggdG9nZXRoZXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVc2VyRGljdC5Vc2VyRGljdChbKCdvbmUnLDEpLCAoJ3R3bycsMildLCB0d289MywgdGhyZWU9NSksIGQzKQorCisgICAgICAgICMgYWx0ZXJuYXRlIGNvbnN0cnVjdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXNlckRpY3QuVXNlckRpY3QuZnJvbWtleXMoJ29uZSB0d28nLnNwbGl0KCkpLCBkNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVc2VyRGljdC5Vc2VyRGljdCgpLmZyb21rZXlzKCdvbmUgdHdvJy5zcGxpdCgpKSwgZDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXNlckRpY3QuVXNlckRpY3QuZnJvbWtleXMoJ29uZSB0d28nLnNwbGl0KCksIDEpLCBkNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVc2VyRGljdC5Vc2VyRGljdCgpLmZyb21rZXlzKCdvbmUgdHdvJy5zcGxpdCgpLCAxKSwgZDUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1MS5mcm9ta2V5cygnb25lIHR3bycuc3BsaXQoKSkgaXMgbm90IHUxKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodTEuZnJvbWtleXMoJ29uZSB0d28nLnNwbGl0KCkpLCBVc2VyRGljdC5Vc2VyRGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHUyLmZyb21rZXlzKCdvbmUgdHdvJy5zcGxpdCgpKSwgVXNlckRpY3QuSXRlcmFibGVVc2VyRGljdCkKKworICAgICAgICAjIFRlc3QgX19yZXByX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodTApLCBzdHIoZDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodTEpLCByZXByKGQxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUyKSwgcmVwcihkMikpCisKKyAgICAgICAgIyBUZXN0IF9fY21wX18gYW5kIF9fbGVuX18KKyAgICAgICAgYWxsID0gW2QwLCBkMSwgZDIsIHUsIHUwLCB1MSwgdTIsIHV1LCB1dTAsIHV1MSwgdXUyXQorICAgICAgICBmb3IgYSBpbiBhbGw6CisgICAgICAgICAgICBmb3IgYiBpbiBhbGw6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoYSwgYiksIGNtcChsZW4oYSksIGxlbihiKSkpCisKKyAgICAgICAgIyBUZXN0IF9fZ2V0aXRlbV9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTJbIm9uZSJdLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgdTEuX19nZXRpdGVtX18sICJ0d28iKQorCisgICAgICAgICMgVGVzdCBfX3NldGl0ZW1fXworICAgICAgICB1MyA9IFVzZXJEaWN0LlVzZXJEaWN0KHUyKQorICAgICAgICB1M1sidHdvIl0gPSAyCisgICAgICAgIHUzWyJ0aHJlZSJdID0gMworCisgICAgICAgICMgVGVzdCBfX2RlbGl0ZW1fXworICAgICAgICBkZWwgdTNbInRocmVlIl0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHUzLl9fZGVsaXRlbV9fLCAidGhyZWUiKQorCisgICAgICAgICMgVGVzdCBjbGVhcgorICAgICAgICB1My5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTMsIHt9KQorCisgICAgICAgICMgVGVzdCBjb3B5KCkKKyAgICAgICAgdTJhID0gdTIuY29weSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTJhLCB1MikKKyAgICAgICAgdTJiID0gVXNlckRpY3QuVXNlckRpY3QoeD00MiwgeT0yMykKKyAgICAgICAgdTJjID0gdTJiLmNvcHkoKSAjIG1ha2luZyBhIGNvcHkgb2YgYSBVc2VyRGljdCBpcyBzcGVjaWFsIGNhc2VkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTJiLCB1MmMpCisKKyAgICAgICAgY2xhc3MgTXlVc2VyRGljdChVc2VyRGljdC5Vc2VyRGljdCk6CisgICAgICAgICAgICBkZWYgZGlzcGxheShzZWxmKTogcHJpbnQgc2VsZgorCisgICAgICAgIG0yID0gTXlVc2VyRGljdCh1MikKKyAgICAgICAgbTJhID0gbTIuY29weSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTJhLCBtMikKKworICAgICAgICAjIFNGIGJ1ZyAjNDc2NjE2IC0tIGNvcHkoKSBvZiBVc2VyRGljdCBzdWJjbGFzcyBzaGFyZWQgZGF0YQorICAgICAgICBtMlsnZm9vJ10gPSAnYmFyJworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG0yYSwgbTIpCisKKyAgICAgICAgIyBUZXN0IGtleXMsIGl0ZW1zLCB2YWx1ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Mi5rZXlzKCksIGQyLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Mi5pdGVtcygpLCBkMi5pdGVtcygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUyLnZhbHVlcygpLCBkMi52YWx1ZXMoKSkKKworICAgICAgICAjIFRlc3QgaGFzX2tleSBhbmQgImluIi4KKyAgICAgICAgZm9yIGkgaW4gdTIua2V5cygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihpLCB1MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSBpbiB1MSwgaSBpbiBkMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSBpbiB1MCwgaSBpbiBkMCkKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodTIuaGFzX2tleShpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUxLmhhc19rZXkoaSksIGQxLmhhc19rZXkoaSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MC5oYXNfa2V5KGkpLCBkMC5oYXNfa2V5KGkpKQorCisgICAgICAgICMgVGVzdCB1cGRhdGUKKyAgICAgICAgdCA9IFVzZXJEaWN0LlVzZXJEaWN0KCkKKyAgICAgICAgdC51cGRhdGUodTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdTIpCisgICAgICAgIGNsYXNzIEl0ZW1zOgorICAgICAgICAgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoKCJ4IiwgNDIpLCAoInkiLCAyMykpCisgICAgICAgIHQgPSBVc2VyRGljdC5Vc2VyRGljdCgpCisgICAgICAgIHQudXBkYXRlKEl0ZW1zKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgeyJ4IjogNDIsICJ5IjogMjN9KQorCisgICAgICAgICMgVGVzdCBnZXQKKyAgICAgICAgZm9yIGkgaW4gdTIua2V5cygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Mi5nZXQoaSksIHUyW2ldKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MS5nZXQoaSksIGQxLmdldChpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTAuZ2V0KGkpLCBkMC5nZXQoaSkpCisKKyAgICAgICAgIyBUZXN0ICJpbiIgaXRlcmF0aW9uLgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjApOgorICAgICAgICAgICAgdTJbaV0gPSBzdHIoaSkKKyAgICAgICAgaWtleXMgPSBbXQorICAgICAgICBmb3IgayBpbiB1MjoKKyAgICAgICAgICAgIGlrZXlzLmFwcGVuZChrKQorICAgICAgICBrZXlzID0gdTIua2V5cygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGlrZXlzKSwgc2V0KGtleXMpKQorCisgICAgICAgICMgVGVzdCBzZXRkZWZhdWx0CisgICAgICAgIHQgPSBVc2VyRGljdC5Vc2VyRGljdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5zZXRkZWZhdWx0KCJ4IiwgNDIpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQuaGFzX2tleSgieCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc2V0ZGVmYXVsdCgieCIsIDIzKSwgNDIpCisKKyAgICAgICAgIyBUZXN0IHBvcAorICAgICAgICB0ID0gVXNlckRpY3QuVXNlckRpY3QoeD00MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnBvcCgieCIpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHQucG9wLCAieCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5wb3AoIngiLCAxKSwgMSkKKyAgICAgICAgdFsieCJdID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnBvcCgieCIsIDEpLCA0MikKKworICAgICAgICAjIFRlc3QgcG9waXRlbQorICAgICAgICB0ID0gVXNlckRpY3QuVXNlckRpY3QoeD00MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnBvcGl0ZW0oKSwgKCJ4IiwgNDIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgdC5wb3BpdGVtKQorCisgICAgZGVmIHRlc3RfbWlzc2luZyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgVXNlckRpY3QgZG9lc24ndCBoYXZlIGEgX19taXNzaW5nX18gbWV0aG9kCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzYXR0cihVc2VyRGljdCwgIl9fbWlzc2luZ19fIiksIEZhbHNlKQorICAgICAgICAjIFRlc3Qgc2V2ZXJhbCBjYXNlczoKKyAgICAgICAgIyAoRCkgc3ViY2xhc3MgZGVmaW5lcyBfX21pc3NpbmdfXyBtZXRob2QgcmV0dXJuaW5nIGEgdmFsdWUKKyAgICAgICAgIyAoRSkgc3ViY2xhc3MgZGVmaW5lcyBfX21pc3NpbmdfXyBtZXRob2QgcmFpc2luZyBSdW50aW1lRXJyb3IKKyAgICAgICAgIyAoRikgc3ViY2xhc3Mgc2V0cyBfX21pc3NpbmdfXyBpbnN0YW5jZSB2YXJpYWJsZSAobm8gZWZmZWN0KQorICAgICAgICAjIChHKSBzdWJjbGFzcyBkb2Vzbid0IGRlZmluZSBfX21pc3NpbmdfXyBhdCBhIGFsbAorICAgICAgICBjbGFzcyBEKFVzZXJEaWN0LlVzZXJEaWN0KToKKyAgICAgICAgICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorICAgICAgICBkID0gRCh7MTogMiwgMzogNH0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxXSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzNdLCA0KQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDIsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMiwgZC5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsyXSwgNDIpCisgICAgICAgIGNsYXNzIEUoVXNlckRpY3QuVXNlckRpY3QpOgorICAgICAgICAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKGtleSkKKyAgICAgICAgZSA9IEUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBlWzQyXQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yLCBlcnI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyci5hcmdzLCAoNDIsKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZVs0Ml0gZGlkbid0IHJhaXNlIFJ1bnRpbWVFcnJvciIpCisgICAgICAgIGNsYXNzIEYoVXNlckRpY3QuVXNlckRpY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICMgQW4gaW5zdGFuY2UgdmFyaWFibGUgX19taXNzaW5nX18gc2hvdWxkIGhhdmUgbm8gZWZmZWN0CisgICAgICAgICAgICAgICAgc2VsZi5fX21pc3NpbmdfXyA9IGxhbWJkYSBrZXk6IE5vbmUKKyAgICAgICAgICAgICAgICBVc2VyRGljdC5Vc2VyRGljdC5fX2luaXRfXyhzZWxmKQorICAgICAgICBmID0gRigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZbNDJdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuYXJncywgKDQyLCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImZbNDJdIGRpZG4ndCByYWlzZSBLZXlFcnJvciIpCisgICAgICAgIGNsYXNzIEcoVXNlckRpY3QuVXNlckRpY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBnID0gRygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdbNDJdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuYXJncywgKDQyLCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImdbNDJdIGRpZG4ndCByYWlzZSBLZXlFcnJvciIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFRlc3QgRGljdCBNaXhpbgorCitjbGFzcyBTZXFEaWN0KFVzZXJEaWN0LkRpY3RNaXhpbik6CisgICAgIiIiRGljdGlvbmFyeSBsb29rYWxpa2UgaW1wbGVtZW50ZWQgd2l0aCBsaXN0cy4KKworICAgIFVzZWQgdG8gdGVzdCBhbmQgZGVtb25zdHJhdGUgRGljdE1peGluCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG90aGVyPU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5rZXlsaXN0ID0gW10KKyAgICAgICAgc2VsZi52YWx1ZWxpc3QgPSBbXQorICAgICAgICBpZiBvdGhlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gb3RoZXI6CisgICAgICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKKyAgICAgICAgZm9yIChrZXksIHZhbHVlKSBpbiBrd2FyZ3MuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmW2tleV0gPSB2YWx1ZQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpID0gc2VsZi5rZXlsaXN0LmluZGV4KGtleSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZWxpc3RbaV0KKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGkgPSBzZWxmLmtleWxpc3QuaW5kZXgoa2V5KQorICAgICAgICAgICAgc2VsZi52YWx1ZWxpc3RbaV0gPSB2YWx1ZQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYua2V5bGlzdC5hcHBlbmQoa2V5KQorICAgICAgICAgICAgc2VsZi52YWx1ZWxpc3QuYXBwZW5kKHZhbHVlKQorICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpID0gc2VsZi5rZXlsaXN0LmluZGV4KGtleSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcgorICAgICAgICBzZWxmLmtleWxpc3QucG9wKGkpCisgICAgICAgIHNlbGYudmFsdWVsaXN0LnBvcChpKQorICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXR1cm4gbGlzdChzZWxmLmtleWxpc3QpCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLl9fY2xhc3NfXygpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gZAorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9ta2V5cyhjbHMsIGtleXMsIHZhbHVlPU5vbmUpOgorICAgICAgICBkID0gY2xzKCkKKyAgICAgICAgZm9yIGtleSBpbiBrZXlzOgorICAgICAgICAgICAgZFtrZXldID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIGQKKworY2xhc3MgVXNlckRpY3RNaXhpblRlc3QobWFwcGluZ190ZXN0cy5UZXN0TWFwcGluZ1Byb3RvY29sKToKKyAgICB0eXBlMnRlc3QgPSBTZXFEaWN0CisKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgICMjIFNldHVwIHRlc3QgYW5kIHZlcmlmeSB3b3JraW5nIG9mIHRoZSB0ZXN0IGNsYXNzCisKKyAgICAgICAgIyBjaGVjayBpbml0CisgICAgICAgIHMgPSBTZXFEaWN0KCkKKworICAgICAgICAjIGV4ZXJjaXNlIHNldGl0ZW0KKyAgICAgICAgc1sxMF0gPSAndGVuJworICAgICAgICBzWzIwXSA9ICd0d2VudHknCisgICAgICAgIHNbMzBdID0gJ3RoaXJ0eScKKworICAgICAgICAjIGV4ZXJjaXNlIGRlbGl0ZW0KKyAgICAgICAgZGVsIHNbMjBdCisgICAgICAgICMgY2hlY2sgZ2V0aXRlbSBhbmQgc2V0aXRlbQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbMTBdLCAndGVuJykKKyAgICAgICAgIyBjaGVjayBrZXlzKCkgYW5kIGRlbGl0ZW0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmtleXMoKSwgWzEwLCAzMF0pCisKKyAgICAgICAgIyMgTm93LCB0ZXN0IHRoZSBEaWN0TWl4aW4gbWV0aG9kcyBvbmUgYnkgb25lCisgICAgICAgICMgaGFzX2tleQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5oYXNfa2V5KDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzLmhhc19rZXkoMjApKQorCisgICAgICAgICMgX19jb250YWluc19fCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oMTAsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMjAsIHMpCisKKyAgICAgICAgIyBfX2l0ZXJfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtrIGZvciBrIGluIHNdLCBbMTAsIDMwXSkKKworICAgICAgICAjIF9fbGVuX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIDIpCisKKyAgICAgICAgIyBpdGVyaXRlbXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHMuaXRlcml0ZW1zKCkpLCBbKDEwLCd0ZW4nKSwgKDMwLCAndGhpcnR5JyldKQorCisgICAgICAgICMgaXRlcmtleXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHMuaXRlcmtleXMoKSksIFsxMCwgMzBdKQorCisgICAgICAgICMgaXRlcnZhbHVlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qocy5pdGVydmFsdWVzKCkpLCBbJ3RlbicsICd0aGlydHknXSkKKworICAgICAgICAjIHZhbHVlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWVzKCksIFsndGVuJywgJ3RoaXJ0eSddKQorCisgICAgICAgICMgaXRlbXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLml0ZW1zKCksIFsoMTAsJ3RlbicpLCAoMzAsICd0aGlydHknKV0pCisKKyAgICAgICAgIyBnZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldCgxMCksICd0ZW4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0KDE1LCdmaWZ0ZWVuJyksICdmaWZ0ZWVuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldCgxNSksIE5vbmUpCisKKyAgICAgICAgIyBzZXRkZWZhdWx0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zZXRkZWZhdWx0KDQwLCAnZm9ydHknKSwgJ2ZvcnR5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnNldGRlZmF1bHQoMTAsICdudWxsJyksICd0ZW4nKQorICAgICAgICBkZWwgc1s0MF0KKworICAgICAgICAjIHBvcAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucG9wKDEwKSwgJ3RlbicpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMTAsIHMpCisgICAgICAgIHNbMTBdID0gJ3RlbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnBvcCgieCIsIDEpLCAxKQorICAgICAgICBzWyJ4Il0gPSA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucG9wKCJ4IiwgMSksIDQyKQorCisgICAgICAgICMgcG9waXRlbQorICAgICAgICBrLCB2ID0gcy5wb3BpdGVtKCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihrLCBzKQorICAgICAgICBzW2tdID0gdgorCisgICAgICAgICMgY2xlYXIKKyAgICAgICAgcy5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCAwKQorCisgICAgICAgICMgZW1wdHkgcG9waXRlbQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgcy5wb3BpdGVtKQorCisgICAgICAgICMgdXBkYXRlCisgICAgICAgIHMudXBkYXRlKHsxMDogJ3RlbicsIDIwOid0d2VudHknfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWzEwXSwgJ3RlbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1syMF0sICd0d2VudHknKQorCisgICAgICAgICMgY21wCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgezEwOiAndGVuJywgMjA6J3R3ZW50eSd9KQorICAgICAgICB0ID0gU2VxRGljdCgpCisgICAgICAgIHRbMjBdID0gJ3R3ZW50eScKKyAgICAgICAgdFsxMF0gPSAndGVuJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHQpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBVc2VyRGljdFRlc3QsCisgICAgICAgIFVzZXJEaWN0TWl4aW5UZXN0CisgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VyZGljdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VyZGljdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlOTNmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJkaWN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VyZGljdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VyZGljdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlOTNmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJkaWN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VybGlzdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJsaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjAxYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VybGlzdC5weQpAQCAtMCwwICsxLDYxIEBACisjIENoZWNrIGV2ZXJ5IHBhdGggdGhyb3VnaCBldmVyeSBtZXRob2Qgb2YgVXNlckxpc3QKKworZnJvbSBVc2VyTGlzdCBpbXBvcnQgVXNlckxpc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCBsaXN0X3Rlc3RzCisKK2NsYXNzIFVzZXJMaXN0VGVzdChsaXN0X3Rlc3RzLkNvbW1vblRlc3QpOgorICAgIHR5cGUydGVzdCA9IFVzZXJMaXN0CisKKyAgICBkZWYgdGVzdF9nZXRzbGljZShzZWxmKToKKyAgICAgICAgc3VwZXIoVXNlckxpc3RUZXN0LCBzZWxmKS50ZXN0X2dldHNsaWNlKCkKKyAgICAgICAgbCA9IFswLCAxLCAyLCAzLCA0XQorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QobCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoLTMsIDYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzppXSwgbFs6aV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbaTpdLCBsW2k6XSkKKyAgICAgICAgICAgIGZvciBqIGluIHhyYW5nZSgtMywgNik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1W2k6al0sIGxbaTpqXSkKKworICAgIGRlZiB0ZXN0X2FkZF9zcGVjaWFscyhzZWxmKToKKyAgICAgICAgdSA9IFVzZXJMaXN0KCJzcGFtIikKKyAgICAgICAgdTIgPSB1ICsgImVnZ3MiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIsIGxpc3QoInNwYW1lZ2dzIikpCisKKyAgICBkZWYgdGVzdF9yYWRkX3NwZWNpYWxzKHNlbGYpOgorICAgICAgICB1ID0gVXNlckxpc3QoImVnZ3MiKQorICAgICAgICB1MiA9ICJzcGFtIiArIHUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MiwgbGlzdCgic3BhbWVnZ3MiKSkKKyAgICAgICAgdTIgPSB1Ll9fcmFkZF9fKFVzZXJMaXN0KCJzcGFtIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIsIGxpc3QoInNwYW1lZ2dzIikpCisKKyAgICBkZWYgdGVzdF9pYWRkKHNlbGYpOgorICAgICAgICBzdXBlcihVc2VyTGlzdFRlc3QsIHNlbGYpLnRlc3RfaWFkZCgpCisgICAgICAgIHUgPSBbMCwgMV0KKyAgICAgICAgdSArPSBVc2VyTGlzdChbMCwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgWzAsIDEsIDAsIDFdKQorCisgICAgZGVmIHRlc3RfbWl4ZWRjbXAoc2VsZik6CisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgWzAsIDFdKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHUsIFswXSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh1LCBbMCwgMl0pCisKKyAgICBkZWYgdGVzdF9taXhlZGFkZChzZWxmKToKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ICsgW10sIHUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSArIFsyXSwgWzAsIDEsIDJdKQorCisgICAgZGVmIHRlc3RfZ2V0aXRlbW92ZXJ3cml0ZWl0ZXIoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgX19nZXRpdGVtX18gb3ZlcnJpZGVzICphcmUqIHJlY29nbml6ZWQgYnkgX19pdGVyX18KKyAgICAgICAgY2xhc3MgVChzZWxmLnR5cGUydGVzdCk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKGtleSkgKyAnISEhJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZXIoVCgoMSwyKSkpLm5leHQoKSwgIjAhISEiKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgiLitfXyhnZXR8c2V0fGRlbClzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChVc2VyTGlzdFRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJsaXN0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJsaXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjQ4OTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcmxpc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJsaXN0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJsaXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjQ4OTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcmxpc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2MjU5ODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5CkBAIC0wLDAgKzEsMTQ3IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgVXNlclN0cmluZyBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBuYXRpdmUgYnVpbHRpbiBzdHJpbmcgdHlwZS4KKyMgVXNlclN0cmluZyBpbnN0YW5jZXMgc2hvdWxkIGJlaGF2ZSBzaW1pbGFyIHRvIGJ1aWx0aW4gc3RyaW5nIG9iamVjdHMuCisKK2ltcG9ydCBzdHJpbmcKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCBzdHJpbmdfdGVzdHMKK2Zyb20gVXNlclN0cmluZyBpbXBvcnQgVXNlclN0cmluZywgTXV0YWJsZVN0cmluZworaW1wb3J0IHdhcm5pbmdzCisKK2NsYXNzIFVzZXJTdHJpbmdUZXN0KAorICAgIHN0cmluZ190ZXN0cy5Db21tb25UZXN0LAorICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clVuaWNvZGVVc2VyU3RyaW5nVGVzdCwKKyAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJTdHJpbmdVc2VyU3RyaW5nVGVzdCwKKyAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVc2VyU3RyaW5nVGVzdAorICAgICk6CisKKyAgICB0eXBlMnRlc3QgPSBVc2VyU3RyaW5nCisKKyAgICAjIE92ZXJ3cml0ZSB0aGUgdGhyZWUgdGVzdGluZyBtZXRob2RzLCBiZWNhdXNlIFVzZXJTdHJpbmcKKyAgICAjIGNhbid0IGNvcGUgd2l0aCBhcmd1bWVudHMgcHJvcGFnYXRlZCB0byBVc2VyU3RyaW5nCisgICAgIyAoYW5kIHdlIGRvbid0IHRlc3Qgd2l0aCBzdWJjbGFzc2VzKQorICAgIGRlZiBjaGVja2VxdWFsKHNlbGYsIHJlc3VsdCwgb2JqZWN0LCBtZXRob2RuYW1lLCAqYXJncyk6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuZml4dHlwZShyZXN1bHQpCisgICAgICAgIG9iamVjdCA9IHNlbGYuZml4dHlwZShvYmplY3QpCisgICAgICAgICMgd2UgZG9uJ3QgZml4IHRoZSBhcmd1bWVudHMsIGJlY2F1c2UgVXNlclN0cmluZyBjYW4ndCBjb3BlIHdpdGggaXQKKyAgICAgICAgcmVhbHJlc3VsdCA9IGdldGF0dHIob2JqZWN0LCBtZXRob2RuYW1lKSgqYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHJlc3VsdCwKKyAgICAgICAgICAgIHJlYWxyZXN1bHQKKyAgICAgICAgKQorCisgICAgZGVmIGNoZWNrcmFpc2VzKHNlbGYsIGV4Yywgb2JqZWN0LCBtZXRob2RuYW1lLCAqYXJncyk6CisgICAgICAgIG9iamVjdCA9IHNlbGYuZml4dHlwZShvYmplY3QpCisgICAgICAgICMgd2UgZG9uJ3QgZml4IHRoZSBhcmd1bWVudHMsIGJlY2F1c2UgVXNlclN0cmluZyBjYW4ndCBjb3BlIHdpdGggaXQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBleGMsCisgICAgICAgICAgICBnZXRhdHRyKG9iamVjdCwgbWV0aG9kbmFtZSksCisgICAgICAgICAgICAqYXJncworICAgICAgICApCisKKyAgICBkZWYgY2hlY2tjYWxsKHNlbGYsIG9iamVjdCwgbWV0aG9kbmFtZSwgKmFyZ3MpOgorICAgICAgICBvYmplY3QgPSBzZWxmLmZpeHR5cGUob2JqZWN0KQorICAgICAgICAjIHdlIGRvbid0IGZpeCB0aGUgYXJndW1lbnRzLCBiZWNhdXNlIFVzZXJTdHJpbmcgY2FuJ3QgY29wZSB3aXRoIGl0CisgICAgICAgIGdldGF0dHIob2JqZWN0LCBtZXRob2RuYW1lKSgqYXJncykKKworY2xhc3MgTXV0YWJsZVN0cmluZ1Rlc3QoVXNlclN0cmluZ1Rlc3QpOgorICAgIHR5cGUydGVzdCA9IE11dGFibGVTdHJpbmcKKworICAgICMgTXV0YWJsZVN0cmluZ3MgY2FuIGJlIGhhc2hlZCA9PiBkZWFjdGl2YXRlIHRlc3QKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9zZXRpdGVtKHNlbGYpOgorICAgICAgICBzID0gc2VsZi50eXBlMnRlc3QoImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHMuX19zZXRpdGVtX18sIC00LCAiYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcy5fX3NldGl0ZW1fXywgMywgImJhciIpCisgICAgICAgIHNbLTFdID0gImJhciIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiZm9iYXIiKQorICAgICAgICBzWzBdID0gImJhciIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiYmFyb2JhciIpCisKKyAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgorICAgICAgICBzID0gc2VsZi50eXBlMnRlc3QoImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHMuX19kZWxpdGVtX18sIC00KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBzLl9fZGVsaXRlbV9fLCAzKQorICAgICAgICBkZWwgc1stMV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiZm8iKQorICAgICAgICBkZWwgc1swXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICJvIikKKyAgICAgICAgZGVsIHNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiIikKKworICAgIGRlZiB0ZXN0X3NldHNsaWNlKHNlbGYpOgorICAgICAgICBzID0gc2VsZi50eXBlMnRlc3QoImZvbyIpCisgICAgICAgIHNbOl0gPSAiYmFyIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICJiYXIiKQorICAgICAgICBzWzE6Ml0gPSAiZm9vIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICJiZm9vciIpCisgICAgICAgIHNbMTotMV0gPSBVc2VyU3RyaW5nKCJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiYmFyIikKKyAgICAgICAgc1swOjEwXSA9IDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgIjQyIikKKworICAgIGRlZiB0ZXN0X2RlbHNsaWNlKHNlbGYpOgorICAgICAgICBzID0gc2VsZi50eXBlMnRlc3QoImZvb2JhciIpCisgICAgICAgIGRlbCBzWzM6MTBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgImZvbyIpCisgICAgICAgIGRlbCBzWy0xOjEwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICJmbyIpCisKKyAgICBkZWYgdGVzdF9leHRlbmRlZF9zZXRfZGVsX3NsaWNlKHNlbGYpOgorICAgICAgICBpbmRpY2VzID0gKDAsIE5vbmUsIDEsIDMsIDE5LCAxMDAsIC0xLCAtMiwgLTMxLCAtMTAwKQorICAgICAgICBvcmlnID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzCisgICAgICAgIGZvciBzdGFydCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgZm9yIHN0b3AgaW4gaW5kaWNlczoKKyAgICAgICAgICAgICAgICAjIFVzZSBpbmRpY2VzWzE6XSB3aGVuIE11dGFibGVTdHJpbmcgY2FuIGhhbmRsZSByZWFsCisgICAgICAgICAgICAgICAgIyBleHRlbmRlZCBzbGljZXMKKyAgICAgICAgICAgICAgICBmb3Igc3RlcCBpbiAoTm9uZSwgMSwgLTEpOgorICAgICAgICAgICAgICAgICAgICBzID0gc2VsZi50eXBlMnRlc3Qob3JpZykKKyAgICAgICAgICAgICAgICAgICAgTCA9IGxpc3Qob3JpZykKKyAgICAgICAgICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHNsaWNlIG9mIGV4YWN0bHkgdGhlIHJpZ2h0IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIyBidXQgd2l0aCAoaG9wZWZ1bGx5KSBkaWZmZXJlbnQgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IExbc3RhcnQ6c3RvcDpzdGVwXQorICAgICAgICAgICAgICAgICAgICBkYXRhLnJldmVyc2UoKQorICAgICAgICAgICAgICAgICAgICBMW3N0YXJ0OnN0b3A6c3RlcF0gPSBkYXRhCisgICAgICAgICAgICAgICAgICAgIHNbc3RhcnQ6c3RvcDpzdGVwXSA9ICIiLmpvaW4oZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiIi5qb2luKEwpKQorCisgICAgICAgICAgICAgICAgICAgIGRlbCBMW3N0YXJ0OnN0b3A6c3RlcF0KKyAgICAgICAgICAgICAgICAgICAgZGVsIHNbc3RhcnQ6c3RvcDpzdGVwXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICIiLmpvaW4oTCkpCisKKyAgICBkZWYgdGVzdF9pbW11dGFibGUoc2VsZik6CisgICAgICAgIHMgPSBzZWxmLnR5cGUydGVzdCgiZm9vYmFyIikKKyAgICAgICAgczIgPSBzLmltbXV0YWJsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgczIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzMiwgVXNlclN0cmluZykKKworICAgIGRlZiB0ZXN0X2lhZGQoc2VsZik6CisgICAgICAgIHMgPSBzZWxmLnR5cGUydGVzdCgiZm9vIikKKyAgICAgICAgcyArPSAiYmFyIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICJmb29iYXIiKQorICAgICAgICBzICs9IFVzZXJTdHJpbmcoImJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgImZvb2JhcmJheiIpCisgICAgICAgIHMgKz0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiZm9vYmFyYmF6NDIiKQorCisgICAgZGVmIHRlc3RfaW11bChzZWxmKToKKyAgICAgICAgcyA9IHNlbGYudHlwZTJ0ZXN0KCJmb28iKQorICAgICAgICBzICo9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiZm9vIikKKyAgICAgICAgcyAqPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgImZvb2ZvbyIpCisgICAgICAgIHMgKj0gLTEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiIikKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuKk11dGFibGVTdHJpbmcgaGFzIGJlZW4gcmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuKl9fKGdldHxzZXR8ZGVsKXNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChVc2VyU3RyaW5nVGVzdCwgTXV0YWJsZVN0cmluZ1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwNDRkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcwNDRkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3V1LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwNDZiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3V1LnB5CkBAIC0wLDAgKzEsMjAxIEBACisiIiIKK1Rlc3RzIGZvciB1dSBtb2R1bGUuCitOaWNrIE1hdGhld3NvbgorIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworaW1wb3J0IHN5cywgb3MsIHV1LCBjU3RyaW5nSU8KK2ltcG9ydCB1dQorCitwbGFpbnRleHQgPSAiVGhlIHNtb290aC1zY2FsZWQgcHl0aG9uIGNyZXB0IG92ZXIgdGhlIHNsZWVwaW5nIGRvZ1xuIgorCitlbmNvZGVkdGV4dCA9ICIiIlwKK001JkFFKCctTTtWXVQ6XCJVUzhWJUw5NjBAPCdFVDomXU4oJi1SOTchVCgmXVY5NyhAPSZBRSgnLUw5NjVQCisoOjZZRygmMU85UEggIiIiCisKK2VuY29kZWR0ZXh0d3JhcHBlZCA9ICJiZWdpbiAlMDNvICVzXG4iICsgZW5jb2RlZHRleHQucmVwbGFjZSgiJSIsICIlJSIpICsgIlxuIFxuZW5kXG4iCisKK2NsYXNzIFVVVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGlucCA9IGNTdHJpbmdJTy5TdHJpbmdJTyhwbGFpbnRleHQpCisgICAgICAgIG91dCA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHV1LmVuY29kZShpbnAsIG91dCwgInQxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQuZ2V0dmFsdWUoKSwgZW5jb2RlZHRleHR3cmFwcGVkICUgKDA2NjYsICJ0MSIpKQorICAgICAgICBpbnAgPSBjU3RyaW5nSU8uU3RyaW5nSU8ocGxhaW50ZXh0KQorICAgICAgICBvdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICB1dS5lbmNvZGUoaW5wLCBvdXQsICJ0MSIsIDA2NDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LmdldHZhbHVlKCksIGVuY29kZWR0ZXh0d3JhcHBlZCAlICgwNjQ0LCAidDEiKSkKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgaW5wID0gY1N0cmluZ0lPLlN0cmluZ0lPKGVuY29kZWR0ZXh0d3JhcHBlZCAlICgwNjY2LCAidDEiKSkKKyAgICAgICAgb3V0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgdXUuZGVjb2RlKGlucCwgb3V0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLCBwbGFpbnRleHQpCisgICAgICAgIGlucCA9IGNTdHJpbmdJTy5TdHJpbmdJTygKKyAgICAgICAgICAgICJVVWVuY29kZWQgZmlsZXMgbWF5IGNvbnRhaW4gbWFueSBsaW5lcyxcbiIgKworICAgICAgICAgICAgImV2ZW4gc29tZSB0aGF0IGhhdmUgJ2JlZ2luJyBpbiB0aGVtLlxuIiArCisgICAgICAgICAgICBlbmNvZGVkdGV4dHdyYXBwZWQgJSAoMDY2NiwgInQxIikKKyAgICAgICAgKQorICAgICAgICBvdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICB1dS5kZWNvZGUoaW5wLCBvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LmdldHZhbHVlKCksIHBsYWludGV4dCkKKworICAgIGRlZiB0ZXN0X3RydW5jYXRlZGlucHV0KHNlbGYpOgorICAgICAgICBpbnAgPSBjU3RyaW5nSU8uU3RyaW5nSU8oImJlZ2luIDY0NCB0MVxuIiArIGVuY29kZWR0ZXh0KQorICAgICAgICBvdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB1dS5kZWNvZGUoaW5wLCBvdXQpCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQorICAgICAgICBleGNlcHQgdXUuRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIlRydW5jYXRlZCBpbnB1dCBmaWxlIikKKworICAgIGRlZiB0ZXN0X21pc3NpbmdiZWdpbihzZWxmKToKKyAgICAgICAgaW5wID0gY1N0cmluZ0lPLlN0cmluZ0lPKCIiKQorICAgICAgICBvdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB1dS5kZWNvZGUoaW5wLCBvdXQpCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQorICAgICAgICBleGNlcHQgdXUuRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIk5vIHZhbGlkIGJlZ2luIGxpbmUgZm91bmQgaW4gaW5wdXQgZmlsZSIpCisKK2NsYXNzIFVVU3RkSU9UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zdGRpbiA9IHN5cy5zdGRpbgorICAgICAgICBzZWxmLnN0ZG91dCA9IHN5cy5zdGRvdXQKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3lzLnN0ZGluID0gc2VsZi5zdGRpbgorICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5zdGRvdXQKKworICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgc3lzLnN0ZGluID0gY1N0cmluZ0lPLlN0cmluZ0lPKHBsYWludGV4dCkKKyAgICAgICAgc3lzLnN0ZG91dCA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHV1LmVuY29kZSgiLSIsICItIiwgInQxIiwgMDY2NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHN5cy5zdGRvdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgIGVuY29kZWR0ZXh0d3JhcHBlZCAlICgwNjY2LCAidDEiKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIHN5cy5zdGRpbiA9IGNTdHJpbmdJTy5TdHJpbmdJTyhlbmNvZGVkdGV4dHdyYXBwZWQgJSAoMDY2NiwgInQxIikpCisgICAgICAgIHN5cy5zdGRvdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICB1dS5kZWNvZGUoIi0iLCAiLSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLnN0ZG91dC5nZXR2YWx1ZSgpLCBwbGFpbnRleHQpCisKK2NsYXNzIFVVRmlsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9raWxsKHNlbGYsIGYpOgorICAgICAgICAjIGNsb3NlIGFuZCByZW1vdmUgZmlsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IChTeXN0ZW1FeGl0LCBLZXlib2FyZEludGVycnVwdCk6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnVubGluayhmLm5hbWUpCisgICAgICAgIGV4Y2VwdCAoU3lzdGVtRXhpdCwgS2V5Ym9hcmRJbnRlcnJ1cHQpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRtcGluICA9IHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiaSIKKyAgICAgICAgc2VsZi50bXBvdXQgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIm8iCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbCBzZWxmLnRtcGluCisgICAgICAgIGRlbCBzZWxmLnRtcG91dAorCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgorICAgICAgICBmaW4gPSBmb3V0ID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYudG1waW4pCisgICAgICAgICAgICBmaW4gPSBvcGVuKHNlbGYudG1waW4sICd3YicpCisgICAgICAgICAgICBmaW4ud3JpdGUocGxhaW50ZXh0KQorICAgICAgICAgICAgZmluLmNsb3NlKCkKKworICAgICAgICAgICAgZmluID0gb3BlbihzZWxmLnRtcGluLCAncmInKQorICAgICAgICAgICAgZm91dCA9IG9wZW4oc2VsZi50bXBvdXQsICd3JykKKyAgICAgICAgICAgIHV1LmVuY29kZShmaW4sIGZvdXQsIHNlbGYudG1waW4sIG1vZGU9MDY0NCkKKyAgICAgICAgICAgIGZpbi5jbG9zZSgpCisgICAgICAgICAgICBmb3V0LmNsb3NlKCkKKworICAgICAgICAgICAgZm91dCA9IG9wZW4oc2VsZi50bXBvdXQsICdyJykKKyAgICAgICAgICAgIHMgPSBmb3V0LnJlYWQoKQorICAgICAgICAgICAgZm91dC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIGVuY29kZWR0ZXh0d3JhcHBlZCAlICgwNjQ0LCBzZWxmLnRtcGluKSkKKworICAgICAgICAgICAgIyBpbl9maWxlIGFuZCBvdXRfZmlsZSBhcyBmaWxlbmFtZXMKKyAgICAgICAgICAgIHV1LmVuY29kZShzZWxmLnRtcGluLCBzZWxmLnRtcG91dCwgc2VsZi50bXBpbiwgbW9kZT0wNjQ0KQorICAgICAgICAgICAgZm91dCA9IG9wZW4oc2VsZi50bXBvdXQsICdyJykKKyAgICAgICAgICAgIHMgPSBmb3V0LnJlYWQoKQorICAgICAgICAgICAgZm91dC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIGVuY29kZWR0ZXh0d3JhcHBlZCAlICgwNjQ0LCBzZWxmLnRtcGluKSkKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fa2lsbChmaW4pCisgICAgICAgICAgICBzZWxmLl9raWxsKGZvdXQpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGYgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi50bXBpbikKKyAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYudG1waW4sICd3JykKKyAgICAgICAgICAgIGYud3JpdGUoZW5jb2RlZHRleHR3cmFwcGVkICUgKDA2NDQsIHNlbGYudG1wb3V0KSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBmID0gb3BlbihzZWxmLnRtcGluLCAncicpCisgICAgICAgICAgICB1dS5kZWNvZGUoZikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBmID0gb3BlbihzZWxmLnRtcG91dCwgJ3InKQorICAgICAgICAgICAgcyA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgcGxhaW50ZXh0KQorICAgICAgICAgICAgIyBYWFggaXMgdGhlcmUgYW4geHAgd2F5IHRvIHZlcmlmeSB0aGUgbW9kZT8KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2tpbGwoZikKKworICAgIGRlZiB0ZXN0X2RlY29kZV9maWxlbmFtZShzZWxmKToKKyAgICAgICAgZiA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhzZWxmLnRtcGluKQorICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi50bXBpbiwgJ3cnKQorICAgICAgICAgICAgZi53cml0ZShlbmNvZGVkdGV4dHdyYXBwZWQgJSAoMDY0NCwgc2VsZi50bXBvdXQpKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIHV1LmRlY29kZShzZWxmLnRtcGluKQorCisgICAgICAgICAgICBmID0gb3BlbihzZWxmLnRtcG91dCwgJ3InKQorICAgICAgICAgICAgcyA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgcGxhaW50ZXh0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fa2lsbChmKQorCisgICAgZGVmIHRlc3RfZGVjb2RldHdpY2Uoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgZGVjb2RlKCkgd2lsbCByZWZ1c2UgdG8gb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUKKyAgICAgICAgZiA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IGNTdHJpbmdJTy5TdHJpbmdJTyhlbmNvZGVkdGV4dHdyYXBwZWQgJSAoMDY0NCwgc2VsZi50bXBvdXQpKQorCisgICAgICAgICAgICBmID0gb3BlbihzZWxmLnRtcGluLCAncicpCisgICAgICAgICAgICB1dS5kZWNvZGUoZikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBmID0gb3BlbihzZWxmLnRtcGluLCAncicpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh1dS5FcnJvciwgdXUuZGVjb2RlLCBmKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9raWxsKGYpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFVVVGVzdCwgVVVTdGRJT1Rlc3QsIFVVRmlsZVRlc3QpCisKK2lmIF9fbmFtZV9fPT0iX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91dS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91dS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmOWE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3V1LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91dS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91dS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmOWE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3V1LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91dWlkLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXVpZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTAzMDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXVpZC5weQpAQCAtMCwwICsxLDQ4MiBAQAorZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdXVpZAorCitkZWYgaW1wb3J0YWJsZShuYW1lKToKKyAgICB0cnk6CisgICAgICAgIF9faW1wb3J0X18obmFtZSkKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBleGNlcHQ6CisgICAgICAgIHJldHVybiBGYWxzZQorCitjbGFzcyBUZXN0VVVJRChUZXN0Q2FzZSk6CisgICAgbGFzdF9ub2RlID0gTm9uZQorICAgIHNvdXJjZTJub2RlID0ge30KKworICAgIGRlZiB0ZXN0X1VVSUQoc2VsZik6CisgICAgICAgIGVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBhc2NlbmRpbmcgPSBbXQorICAgICAgICBmb3IgKHN0cmluZywgY3VybHksIGhleCwgYnl0ZXMsIGJ5dGVzX2xlLCBmaWVsZHMsIGludGVnZXIsIHVybiwKKyAgICAgICAgICAgICB0aW1lLCBjbG9ja19zZXEsIHZhcmlhbnQsIHZlcnNpb24pIGluIFsKKyAgICAgICAgICAgICgnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJywKKyAgICAgICAgICAgICAnezAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMH0nLAorICAgICAgICAgICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsCisgICAgICAgICAgICAgJ1wwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwJywKKyAgICAgICAgICAgICAnXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDAnLAorICAgICAgICAgICAgICgwLCAwLCAwLCAwLCAwLCAwKSwKKyAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICd1cm46dXVpZDowMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnLAorICAgICAgICAgICAgIDAsIDAsIHV1aWQuUkVTRVJWRURfTkNTLCBOb25lKSwKKyAgICAgICAgICAgICgnMDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmJywKKyAgICAgICAgICAgICAnezAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZn0nLAorICAgICAgICAgICAgICcwMDAxMDIwMzA0MDUwNjA3MDgwOTBhMGIwYzBkMGUwZicsCisgICAgICAgICAgICAgJ1wwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhcdFxuXHgwYlx4MGNceDBkXHgwZVx4MGYnLAorICAgICAgICAgICAgICdceDAzXHgwMlx4MDFcMFx4MDVceDA0XHgwN1x4MDZceDA4XHRcblx4MGJceDBjXHgwZFx4MGVceDBmJywKKyAgICAgICAgICAgICAoMHgwMDAxMDIwM0wsIDB4MDQwNSwgMHgwNjA3LCA4LCA5LCAweDBhMGIwYzBkMGUwZkwpLAorICAgICAgICAgICAgIDB4MDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGZMLAorICAgICAgICAgICAgICd1cm46dXVpZDowMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGYnLAorICAgICAgICAgICAgIDB4NjA3MDQwNTAwMDEwMjAzTCwgMHg4MDksIHV1aWQuUkVTRVJWRURfTkNTLCBOb25lKSwKKyAgICAgICAgICAgICgnMDJkOWU2ZDUtOTQ2Ny0zODJlLThmOWItOTMwMGE2NGFjM2NkJywKKyAgICAgICAgICAgICAnezAyZDllNmQ1LTk0NjctMzgyZS04ZjliLTkzMDBhNjRhYzNjZH0nLAorICAgICAgICAgICAgICcwMmQ5ZTZkNTk0NjczODJlOGY5YjkzMDBhNjRhYzNjZCcsCisgICAgICAgICAgICAgJ1x4MDJceGQ5XHhlNlx4ZDVceDk0XHg2N1x4MzhceDJlXHg4Zlx4OWJceDkzXHgwMFx4YTZceDRhXHhjM1x4Y2QnLAorICAgICAgICAgICAgICdceGQ1XHhlNlx4ZDlceDAyXHg2N1x4OTRceDJlXHgzOFx4OGZceDliXHg5M1x4MDBceGE2XHg0YVx4YzNceGNkJywKKyAgICAgICAgICAgICAoMHgwMmQ5ZTZkNUwsIDB4OTQ2NywgMHgzODJlLCAweDhmLCAweDliLCAweDkzMDBhNjRhYzNjZEwpLAorICAgICAgICAgICAgIDB4MDJkOWU2ZDU5NDY3MzgyZThmOWI5MzAwYTY0YWMzY2RMLAorICAgICAgICAgICAgICd1cm46dXVpZDowMmQ5ZTZkNS05NDY3LTM4MmUtOGY5Yi05MzAwYTY0YWMzY2QnLAorICAgICAgICAgICAgIDB4ODJlOTQ2NzAyZDllNmQ1TCwgMHhmOWIsIHV1aWQuUkZDXzQxMjIsIDMpLAorICAgICAgICAgICAgKCcxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgnLAorICAgICAgICAgICAgICd7MTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4fScsCisgICAgICAgICAgICAgJzEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4JywKKyAgICAgICAgICAgICAnXHgxMlx4MzRceDU2XHg3OCcqNCwKKyAgICAgICAgICAgICAnXHg3OFx4NTZceDM0XHgxMlx4MzRceDEyXHg3OFx4NTZceDEyXHgzNFx4NTZceDc4XHgxMlx4MzRceDU2XHg3OCcsCisgICAgICAgICAgICAgKDB4MTIzNDU2NzgsIDB4MTIzNCwgMHg1Njc4LCAweDEyLCAweDM0LCAweDU2NzgxMjM0NTY3OCksCisgICAgICAgICAgICAgMHgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3OCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6MTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4JywKKyAgICAgICAgICAgICAweDY3ODEyMzQxMjM0NTY3OEwsIDB4MTIzNCwgdXVpZC5SRVNFUlZFRF9OQ1MsIE5vbmUpLAorICAgICAgICAgICAgKCc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICd7NmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4fScsCisgICAgICAgICAgICAgJzZiYTdiODEwOWRhZDExZDE4MGI0MDBjMDRmZDQzMGM4JywKKyAgICAgICAgICAgICAnXHg2Ylx4YTdceGI4XHgxMFx4OWRceGFkXHgxMVx4ZDFceDgwXHhiNFx4MDBceGMwXHg0Zlx4ZDRceDMwXHhjOCcsCisgICAgICAgICAgICAgJ1x4MTBceGI4XHhhN1x4NmJceGFkXHg5ZFx4ZDFceDExXHg4MFx4YjRceDAwXHhjMFx4NGZceGQ0XHgzMFx4YzgnLAorICAgICAgICAgICAgICgweDZiYTdiODEwTCwgMHg5ZGFkLCAweDExZDEsIDB4ODAsIDB4YjQsIDB4MDBjMDRmZDQzMGM4TCksCisgICAgICAgICAgICAgMHg2YmE3YjgxMDlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOEwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgMHgxZDE5ZGFkNmJhN2I4MTBMLCAweGI0LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JywKKyAgICAgICAgICAgICAnezZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOH0nLAorICAgICAgICAgICAgICc2YmE3YjgxMTlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ1x4NmJceGE3XHhiOFx4MTFceDlkXHhhZFx4MTFceGQxXHg4MFx4YjRceDAwXHhjMFx4NGZceGQ0XHgzMFx4YzgnLAorICAgICAgICAgICAgICdceDExXHhiOFx4YTdceDZiXHhhZFx4OWRceGQxXHgxMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAoMHg2YmE3YjgxMUwsIDB4OWRhZCwgMHgxMWQxLCAweDgwLCAweGI0LCAweDAwYzA0ZmQ0MzBjOEwpLAorICAgICAgICAgICAgIDB4NmJhN2I4MTE5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzhMLAorICAgICAgICAgICAgICd1cm46dXVpZDo2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgIDB4MWQxOWRhZDZiYTdiODExTCwgMHhiNCwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJzZiYTdiODEyLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ3s2YmE3YjgxMi05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzh9JywKKyAgICAgICAgICAgICAnNmJhN2I4MTI5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICdceDZiXHhhN1x4YjhceDEyXHg5ZFx4YWRceDExXHhkMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAnXHgxMlx4YjhceGE3XHg2Ylx4YWRceDlkXHhkMVx4MTFceDgwXHhiNFx4MDBceGMwXHg0Zlx4ZDRceDMwXHhjOCcsCisgICAgICAgICAgICAgKDB4NmJhN2I4MTJMLCAweDlkYWQsIDB4MTFkMSwgMHg4MCwgMHhiNCwgMHgwMGMwNGZkNDMwYzhMKSwKKyAgICAgICAgICAgICAweDZiYTdiODEyOWRhZDExZDE4MGI0MDBjMDRmZDQzMGM4TCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6NmJhN2I4MTItOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JywKKyAgICAgICAgICAgICAweDFkMTlkYWQ2YmE3YjgxMkwsIDB4YjQsIHV1aWQuUkZDXzQxMjIsIDEpLAorICAgICAgICAgICAgKCc2YmE3YjgxNC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICd7NmJhN2I4MTQtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4fScsCisgICAgICAgICAgICAgJzZiYTdiODE0OWRhZDExZDE4MGI0MDBjMDRmZDQzMGM4JywKKyAgICAgICAgICAgICAnXHg2Ylx4YTdceGI4XHgxNFx4OWRceGFkXHgxMVx4ZDFceDgwXHhiNFx4MDBceGMwXHg0Zlx4ZDRceDMwXHhjOCcsCisgICAgICAgICAgICAgJ1x4MTRceGI4XHhhN1x4NmJceGFkXHg5ZFx4ZDFceDExXHg4MFx4YjRceDAwXHhjMFx4NGZceGQ0XHgzMFx4YzgnLAorICAgICAgICAgICAgICgweDZiYTdiODE0TCwgMHg5ZGFkLCAweDExZDEsIDB4ODAsIDB4YjQsIDB4MDBjMDRmZDQzMGM4TCksCisgICAgICAgICAgICAgMHg2YmE3YjgxNDlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOEwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjZiYTdiODE0LTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgMHgxZDE5ZGFkNmJhN2I4MTRMLCAweGI0LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnN2Q0NDQ4NDAtOWRjMC0xMWQxLWIyNDUtNWZmZGNlNzRmYWQyJywKKyAgICAgICAgICAgICAnezdkNDQ0ODQwLTlkYzAtMTFkMS1iMjQ1LTVmZmRjZTc0ZmFkMn0nLAorICAgICAgICAgICAgICc3ZDQ0NDg0MDlkYzAxMWQxYjI0NTVmZmRjZTc0ZmFkMicsCisgICAgICAgICAgICAgJ1x4N2RceDQ0XHg0OFx4NDBceDlkXHhjMFx4MTFceGQxXHhiMlx4NDVceDVmXHhmZFx4Y2VceDc0XHhmYVx4ZDInLAorICAgICAgICAgICAgICdceDQwXHg0OFx4NDRceDdkXHhjMFx4OWRceGQxXHgxMVx4YjJceDQ1XHg1Zlx4ZmRceGNlXHg3NFx4ZmFceGQyJywKKyAgICAgICAgICAgICAoMHg3ZDQ0NDg0MEwsIDB4OWRjMCwgMHgxMWQxLCAweGIyLCAweDQ1LCAweDVmZmRjZTc0ZmFkMkwpLAorICAgICAgICAgICAgIDB4N2Q0NDQ4NDA5ZGMwMTFkMWIyNDU1ZmZkY2U3NGZhZDJMLAorICAgICAgICAgICAgICd1cm46dXVpZDo3ZDQ0NDg0MC05ZGMwLTExZDEtYjI0NS01ZmZkY2U3NGZhZDInLAorICAgICAgICAgICAgIDB4MWQxOWRjMDdkNDQ0ODQwTCwgMHgzMjQ1LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnZTkwMjg5M2EtOWQyMi0zYzdlLWE3YjgtZDZlMzEzYjcxZDlmJywKKyAgICAgICAgICAgICAne2U5MDI4OTNhLTlkMjItM2M3ZS1hN2I4LWQ2ZTMxM2I3MWQ5Zn0nLAorICAgICAgICAgICAgICdlOTAyODkzYTlkMjIzYzdlYTdiOGQ2ZTMxM2I3MWQ5ZicsCisgICAgICAgICAgICAgJ1x4ZTlceDAyXHg4OVx4M2FceDlkXHgyMlx4M2NceDdlXHhhN1x4YjhceGQ2XHhlM1x4MTNceGI3XHgxZFx4OWYnLAorICAgICAgICAgICAgICdceDNhXHg4OVx4MDJceGU5XHgyMlx4OWRceDdlXHgzY1x4YTdceGI4XHhkNlx4ZTNceDEzXHhiN1x4MWRceDlmJywKKyAgICAgICAgICAgICAoMHhlOTAyODkzYUwsIDB4OWQyMiwgMHgzYzdlLCAweGE3LCAweGI4LCAweGQ2ZTMxM2I3MWQ5ZkwpLAorICAgICAgICAgICAgIDB4ZTkwMjg5M2E5ZDIyM2M3ZWE3YjhkNmUzMTNiNzFkOWZMLAorICAgICAgICAgICAgICd1cm46dXVpZDplOTAyODkzYS05ZDIyLTNjN2UtYTdiOC1kNmUzMTNiNzFkOWYnLAorICAgICAgICAgICAgIDB4YzdlOWQyMmU5MDI4OTNhTCwgMHgyN2I4LCB1dWlkLlJGQ180MTIyLCAzKSwKKyAgICAgICAgICAgICgnZWI0MjQwMjYtNmY1NC00ZWY4LWE0ZDAtYmI2NThhMWZjNmNmJywKKyAgICAgICAgICAgICAne2ViNDI0MDI2LTZmNTQtNGVmOC1hNGQwLWJiNjU4YTFmYzZjZn0nLAorICAgICAgICAgICAgICdlYjQyNDAyNjZmNTQ0ZWY4YTRkMGJiNjU4YTFmYzZjZicsCisgICAgICAgICAgICAgJ1x4ZWJceDQyXHg0MFx4MjZceDZmXHg1NFx4NGVceGY4XHhhNFx4ZDBceGJiXHg2NVx4OGFceDFmXHhjNlx4Y2YnLAorICAgICAgICAgICAgICdceDI2XHg0MFx4NDJceGViXHg1NFx4NmZceGY4XHg0ZVx4YTRceGQwXHhiYlx4NjVceDhhXHgxZlx4YzZceGNmJywKKyAgICAgICAgICAgICAoMHhlYjQyNDAyNkwsIDB4NmY1NCwgMHg0ZWY4LCAweGE0LCAweGQwLCAweGJiNjU4YTFmYzZjZkwpLAorICAgICAgICAgICAgIDB4ZWI0MjQwMjY2ZjU0NGVmOGE0ZDBiYjY1OGExZmM2Y2ZMLAorICAgICAgICAgICAgICd1cm46dXVpZDplYjQyNDAyNi02ZjU0LTRlZjgtYTRkMC1iYjY1OGExZmM2Y2YnLAorICAgICAgICAgICAgIDB4ZWY4NmY1NGViNDI0MDI2TCwgMHgyNGQwLCB1dWlkLlJGQ180MTIyLCA0KSwKKyAgICAgICAgICAgICgnZjgxZDRmYWUtN2RlYy0xMWQwLWE3NjUtMDBhMGM5MWU2YmY2JywKKyAgICAgICAgICAgICAne2Y4MWQ0ZmFlLTdkZWMtMTFkMC1hNzY1LTAwYTBjOTFlNmJmNn0nLAorICAgICAgICAgICAgICdmODFkNGZhZTdkZWMxMWQwYTc2NTAwYTBjOTFlNmJmNicsCisgICAgICAgICAgICAgJ1x4ZjhceDFkXHg0Zlx4YWVceDdkXHhlY1x4MTFceGQwXHhhN1x4NjVceDAwXHhhMFx4YzlceDFlXHg2Ylx4ZjYnLAorICAgICAgICAgICAgICdceGFlXHg0Zlx4MWRceGY4XHhlY1x4N2RceGQwXHgxMVx4YTdceDY1XHgwMFx4YTBceGM5XHgxZVx4NmJceGY2JywKKyAgICAgICAgICAgICAoMHhmODFkNGZhZUwsIDB4N2RlYywgMHgxMWQwLCAweGE3LCAweDY1LCAweDAwYTBjOTFlNmJmNkwpLAorICAgICAgICAgICAgIDB4ZjgxZDRmYWU3ZGVjMTFkMGE3NjUwMGEwYzkxZTZiZjZMLAorICAgICAgICAgICAgICd1cm46dXVpZDpmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjYnLAorICAgICAgICAgICAgIDB4MWQwN2RlY2Y4MWQ0ZmFlTCwgMHgyNzY1LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnZmZmZWZkZmMtZmZmZS1mZmZlLWZmZmUtZmZmZWZkZmNmYmZhJywKKyAgICAgICAgICAgICAne2ZmZmVmZGZjLWZmZmUtZmZmZS1mZmZlLWZmZmVmZGZjZmJmYX0nLAorICAgICAgICAgICAgICdmZmZlZmRmY2ZmZmVmZmZlZmZmZWZmZmVmZGZjZmJmYScsCisgICAgICAgICAgICAgJ1x4ZmZceGZlXHhmZFx4ZmNceGZmXHhmZVx4ZmZceGZlXHhmZlx4ZmVceGZmXHhmZVx4ZmRceGZjXHhmYlx4ZmEnLAorICAgICAgICAgICAgICdceGZjXHhmZFx4ZmVceGZmXHhmZVx4ZmZceGZlXHhmZlx4ZmZceGZlXHhmZlx4ZmVceGZkXHhmY1x4ZmJceGZhJywKKyAgICAgICAgICAgICAoMHhmZmZlZmRmY0wsIDB4ZmZmZSwgMHhmZmZlLCAweGZmLCAweGZlLCAweGZmZmVmZGZjZmJmYUwpLAorICAgICAgICAgICAgIDB4ZmZmZWZkZmNmZmZlZmZmZWZmZmVmZmZlZmRmY2ZiZmFMLAorICAgICAgICAgICAgICd1cm46dXVpZDpmZmZlZmRmYy1mZmZlLWZmZmUtZmZmZS1mZmZlZmRmY2ZiZmEnLAorICAgICAgICAgICAgIDB4ZmZlZmZmZWZmZmVmZGZjTCwgMHgzZmZlLCB1dWlkLlJFU0VSVkVEX0ZVVFVSRSwgTm9uZSksCisgICAgICAgICAgICAoJ2ZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZicsCisgICAgICAgICAgICAgJ3tmZmZmZmZmZi1mZmZmLWZmZmYtZmZmZi1mZmZmZmZmZmZmZmZ9JywKKyAgICAgICAgICAgICAnZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnLAorICAgICAgICAgICAgICdceGZmJyoxNiwKKyAgICAgICAgICAgICAnXHhmZicqMTYsCisgICAgICAgICAgICAgKDB4ZmZmZmZmZmZMLCAweGZmZmZMLCAweGZmZmZMLCAweGZmLCAweGZmLCAweGZmZmZmZmZmZmZmZkwpLAorICAgICAgICAgICAgIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMLAorICAgICAgICAgICAgICd1cm46dXVpZDpmZmZmZmZmZi1mZmZmLWZmZmYtZmZmZi1mZmZmZmZmZmZmZmYnLAorICAgICAgICAgICAgIDB4ZmZmZmZmZmZmZmZmZmZmTCwgMHgzZmZmLCB1dWlkLlJFU0VSVkVEX0ZVVFVSRSwgTm9uZSksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgZXF1aXZhbGVudHMgPSBbXQorICAgICAgICAgICAgIyBDb25zdHJ1Y3QgZWFjaCBVVUlEIGluIHNldmVyYWwgZGlmZmVyZW50IHdheXMuCisgICAgICAgICAgICBmb3IgdSBpbiBbdXVpZC5VVUlEKHN0cmluZyksIHV1aWQuVVVJRChjdXJseSksIHV1aWQuVVVJRChoZXgpLAorICAgICAgICAgICAgICAgICAgICAgIHV1aWQuVVVJRChieXRlcz1ieXRlcyksIHV1aWQuVVVJRChieXRlc19sZT1ieXRlc19sZSksCisgICAgICAgICAgICAgICAgICAgICAgdXVpZC5VVUlEKGZpZWxkcz1maWVsZHMpLCB1dWlkLlVVSUQoaW50PWludGVnZXIpLAorICAgICAgICAgICAgICAgICAgICAgIHV1aWQuVVVJRCh1cm4pXToKKyAgICAgICAgICAgICAgICAjIFRlc3QgYWxsIGNvbnZlcnNpb25zIGFuZCBwcm9wZXJ0aWVzIG9mIHRoZSBVVUlEIG9iamVjdC4KKyAgICAgICAgICAgICAgICBlcXVhbChzdHIodSksIHN0cmluZykKKyAgICAgICAgICAgICAgICBlcXVhbChpbnQodSksIGludGVnZXIpCisgICAgICAgICAgICAgICAgZXF1YWwodS5ieXRlcywgYnl0ZXMpCisgICAgICAgICAgICAgICAgZXF1YWwodS5ieXRlc19sZSwgYnl0ZXNfbGUpCisgICAgICAgICAgICAgICAgZXF1YWwodS5maWVsZHMsIGZpZWxkcykKKyAgICAgICAgICAgICAgICBlcXVhbCh1LnRpbWVfbG93LCBmaWVsZHNbMF0pCisgICAgICAgICAgICAgICAgZXF1YWwodS50aW1lX21pZCwgZmllbGRzWzFdKQorICAgICAgICAgICAgICAgIGVxdWFsKHUudGltZV9oaV92ZXJzaW9uLCBmaWVsZHNbMl0pCisgICAgICAgICAgICAgICAgZXF1YWwodS5jbG9ja19zZXFfaGlfdmFyaWFudCwgZmllbGRzWzNdKQorICAgICAgICAgICAgICAgIGVxdWFsKHUuY2xvY2tfc2VxX2xvdywgZmllbGRzWzRdKQorICAgICAgICAgICAgICAgIGVxdWFsKHUubm9kZSwgZmllbGRzWzVdKQorICAgICAgICAgICAgICAgIGVxdWFsKHUuaGV4LCBoZXgpCisgICAgICAgICAgICAgICAgZXF1YWwodS5pbnQsIGludGVnZXIpCisgICAgICAgICAgICAgICAgZXF1YWwodS51cm4sIHVybikKKyAgICAgICAgICAgICAgICBlcXVhbCh1LnRpbWUsIHRpbWUpCisgICAgICAgICAgICAgICAgZXF1YWwodS5jbG9ja19zZXEsIGNsb2NrX3NlcSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LnZhcmlhbnQsIHZhcmlhbnQpCisgICAgICAgICAgICAgICAgZXF1YWwodS52ZXJzaW9uLCB2ZXJzaW9uKQorICAgICAgICAgICAgICAgIGVxdWl2YWxlbnRzLmFwcGVuZCh1KQorCisgICAgICAgICAgICAjIERpZmZlcmVudCBjb25zdHJ1Y3Rpb24gbWV0aG9kcyBzaG91bGQgZ2l2ZSB0aGUgc2FtZSBVVUlELgorICAgICAgICAgICAgZm9yIHUgaW4gZXF1aXZhbGVudHM6CisgICAgICAgICAgICAgICAgZm9yIHYgaW4gZXF1aXZhbGVudHM6CisgICAgICAgICAgICAgICAgICAgIGVxdWFsKHUsIHYpCisgICAgICAgICAgICBhc2NlbmRpbmcuYXBwZW5kKHUpCisKKyAgICAgICAgIyBUZXN0IGNvbXBhcmlzb24gb2YgVVVJRHMuCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihhc2NlbmRpbmcpKToKKyAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGxlbihhc2NlbmRpbmcpKToKKyAgICAgICAgICAgICAgICBlcXVhbChjbXAoaSwgaiksIGNtcChhc2NlbmRpbmdbaV0sIGFzY2VuZGluZ1tqXSkpCisKKyAgICAgICAgIyBUZXN0IHNvcnRpbmcgb2YgVVVJRHMgKGFib3ZlIGxpc3QgaXMgaW4gYXNjZW5kaW5nIG9yZGVyKS4KKyAgICAgICAgcmVzb3J0ZWQgPSBhc2NlbmRpbmdbOl0KKyAgICAgICAgcmVzb3J0ZWQucmV2ZXJzZSgpCisgICAgICAgIHJlc29ydGVkLnNvcnQoKQorICAgICAgICBlcXVhbChhc2NlbmRpbmcsIHJlc29ydGVkKQorCisgICAgZGVmIHRlc3RfZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgYmFkdmFsdWUgPSBsYW1iZGEgZjogc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZikKKyAgICAgICAgYmFkdHlwZSA9IGxhbWJkYSBmOiBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYpCisKKyAgICAgICAgIyBCYWRseSBmb3JtZWQgaGV4IHN0cmluZ3MuCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCcnKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJ2FiYycpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRCgnMTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NycpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRCgnMTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2Nzg5JykpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCcxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2Nzh6MjM0NTY3OCcpKQorCisgICAgICAgICMgQmFkbHkgZm9ybWVkIGJ5dGVzLgorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChieXRlcz0nYWJjJykpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGJ5dGVzPSdcMCcqMTUpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChieXRlcz0nXDAnKjE3KSkKKworICAgICAgICAjIEJhZGx5IGZvcm1lZCBieXRlc19sZS4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoYnl0ZXNfbGU9J2FiYycpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChieXRlc19sZT0nXDAnKjE1KSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoYnl0ZXNfbGU9J1wwJyoxNykpCisKKyAgICAgICAgIyBCYWRseSBmb3JtZWQgZmllbGRzLgorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDEsKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMSwgMiwgMywgNCwgNSkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDEsIDIsIDMsIDQsIDUsIDYsIDcpKSkKKworICAgICAgICAjIEZpZWxkIHZhbHVlcyBvdXQgb2YgcmFuZ2UuCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oLTEsIDAsIDAsIDAsIDAsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgweDEwMDAwMDAwMEwsIDAsIDAsIDAsIDAsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAtMSwgMCwgMCwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDB4MTAwMDBMLCAwLCAwLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgLTEsIDAsIDAsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAwLCAweDEwMDAwTCwgMCwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIDAsIC0xLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMCwgMHgxMDBMLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMCwgMCwgLTEsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAwLCAwLCAwLCAweDEwMEwsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAwLCAwLCAwLCAwLCAtMSkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIDAsIDAsIDAsIDB4MTAwMDAwMDAwMDAwMEwpKSkKKworICAgICAgICAjIFZlcnNpb24gbnVtYmVyIG91dCBvZiByYW5nZS4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJzAwJyoxNiwgdmVyc2lvbj0wKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJzAwJyoxNiwgdmVyc2lvbj02KSkKKworICAgICAgICAjIEludGVnZXIgdmFsdWUgb3V0IG9mIHJhbmdlLgorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChpbnQ9LTEpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChpbnQ9MTw8MTI4TCkpCisKKyAgICAgICAgIyBNdXN0IHN1cHBseSBleGFjdGx5IG9uZSBvZiBoZXgsIGJ5dGVzLCBmaWVsZHMsIGludC4KKyAgICAgICAgaCwgYiwgZiwgaSA9ICcwMCcqMTYsICdcMCcqMTYsICgwLCAwLCAwLCAwLCAwLCAwKSwgMAorICAgICAgICB1dWlkLlVVSUQoaCkKKyAgICAgICAgdXVpZC5VVUlEKGhleD1oKQorICAgICAgICB1dWlkLlVVSUQoYnl0ZXM9YikKKyAgICAgICAgdXVpZC5VVUlEKGJ5dGVzX2xlPWIpCisgICAgICAgIHV1aWQuVVVJRChmaWVsZHM9ZikKKyAgICAgICAgdXVpZC5VVUlEKGludD1pKQorCisgICAgICAgICMgV3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyAocG9zaXRpb25hbCkuCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBiKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBiLCBiKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBiLCBiLCBmKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBiLCBiLCBmLCBpKSkKKworICAgICAgICAjIER1cGxpY2F0ZSBhcmd1bWVudHMuCisgICAgICAgIGZvciBoaCBpbiBbW10sIFsoJ2hleCcsIGgpXV06CisgICAgICAgICAgICBmb3IgYmIgaW4gW1tdLCBbKCdieXRlcycsIGIpXV06CisgICAgICAgICAgICAgICAgZm9yIGJibGUgaW4gW1tdLCBbKCdieXRlc19sZScsIGIpXV06CisgICAgICAgICAgICAgICAgICAgIGZvciBpaSBpbiBbW10sIFsoJ2ludCcsIGkpXV06CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZmYgaW4gW1tdLCBbKCdmaWVsZHMnLCBmKV1dOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBkaWN0KGhoICsgYmIgKyBiYmxlICsgaWkgKyBmZikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4oYXJncykgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCAqKmFyZ3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxlbihhcmdzKSAhPSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKCoqYXJncykpCisKKyAgICAgICAgIyBJbW11dGFiaWxpdHkuCisgICAgICAgIHUgPSB1dWlkLlVVSUQoaCkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHNldGF0dHIodSwgJ2hleCcsIGgpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogc2V0YXR0cih1LCAnYnl0ZXMnLCBiKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHNldGF0dHIodSwgJ2J5dGVzX2xlJywgYikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICdmaWVsZHMnLCBmKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHNldGF0dHIodSwgJ2ludCcsIGkpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogc2V0YXR0cih1LCAndGltZV9sb3cnLCAwKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHNldGF0dHIodSwgJ3RpbWVfbWlkJywgMCkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICd0aW1lX2hpX3ZlcnNpb24nLCAwKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHNldGF0dHIodSwgJ3RpbWVfaGlfdmVyc2lvbicsIDApKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogc2V0YXR0cih1LCAnY2xvY2tfc2VxX2hpX3ZhcmlhbnQnLCAwKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHNldGF0dHIodSwgJ2Nsb2NrX3NlcV9sb3cnLCAwKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHNldGF0dHIodSwgJ25vZGUnLCAwKSkKKworICAgIGRlZiBjaGVja19ub2RlKHNlbGYsIG5vZGUsIHNvdXJjZSk6CisgICAgICAgIG1lc3NhZ2UgPSAiJTAxMnggaXMgbm90IGFuIFJGQyA0MTIyIG5vZGUgSUQiICUgbm9kZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8IG5vZGUsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub2RlIDwgKDFMIDw8IDQ4KSwgbWVzc2FnZSkKKworICAgICAgICBUZXN0VVVJRC5zb3VyY2Uybm9kZVtzb3VyY2VdID0gbm9kZQorICAgICAgICBpZiBUZXN0VVVJRC5sYXN0X25vZGU6CisgICAgICAgICAgICBpZiBUZXN0VVVJRC5sYXN0X25vZGUgIT0gbm9kZToKKyAgICAgICAgICAgICAgICBtc2cgPSAiZGlmZmVyZW50IHNvdXJjZXMgZGlzYWdyZWUgb24gbm9kZTpcbiIKKyAgICAgICAgICAgICAgICBmb3IgcywgbiBpbiBUZXN0VVVJRC5zb3VyY2Uybm9kZS5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgbXNnICs9ICIgICAgZnJvbSBzb3VyY2UgJXIsIG5vZGUgd2FzICUwMTJ4XG4iICUgKHMsIG4pCisgICAgICAgICAgICAgICAgIyBUaGVyZSdzIGFjdHVhbGx5IG5vIHJlYXNvbiB0byBleHBlY3QgdGhlIE1BQyBhZGRyZXNzZXMKKyAgICAgICAgICAgICAgICAjIHRvIGFncmVlIGFjcm9zcyB2YXJpb3VzIG1ldGhvZHMgLS0gZS5nLiwgYSBib3ggbWF5IGhhdmUKKyAgICAgICAgICAgICAgICAjIG11bHRpcGxlIG5ldHdvcmsgaW50ZXJmYWNlcywgYW5kIGRpZmZlcmVudCB3YXlzIG9mIGdldHRpbmcKKyAgICAgICAgICAgICAgICAjIGEgTUFDIGFkZHJlc3MgbWF5IGZhdm9yIGRpZmZlcmVudCBIVy4KKyAgICAgICAgICAgICAgICAjI3NlbGYuZmFpbChtc2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBUZXN0VVVJRC5sYXN0X25vZGUgPSBub2RlCisKKyAgICBkZWYgdGVzdF9pZmNvbmZpZ19nZXRub2RlKHNlbGYpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGltcG9ydCBvcworICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICBub2RlID0gdXVpZC5faWZjb25maWdfZ2V0bm9kZSgpCisgICAgICAgICAgICBpZiBub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfbm9kZShub2RlLCAnaWZjb25maWcnKQorCisgICAgZGVmIHRlc3RfaXBjb25maWdfZ2V0bm9kZShzZWxmKToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgIG5vZGUgPSB1dWlkLl9pcGNvbmZpZ19nZXRub2RlKCkKKyAgICAgICAgICAgIGlmIG5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19ub2RlKG5vZGUsICdpcGNvbmZpZycpCisKKyAgICBkZWYgdGVzdF9uZXRiaW9zX2dldG5vZGUoc2VsZik6CisgICAgICAgIGlmIGltcG9ydGFibGUoJ3dpbjMyd25ldCcpIGFuZCBpbXBvcnRhYmxlKCduZXRiaW9zJyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX25vZGUodXVpZC5fbmV0Ymlvc19nZXRub2RlKCksICduZXRiaW9zJykKKworICAgIGRlZiB0ZXN0X3JhbmRvbV9nZXRub2RlKHNlbGYpOgorICAgICAgICBub2RlID0gdXVpZC5fcmFuZG9tX2dldG5vZGUoKQorICAgICAgICAjIExlYXN0IHNpZ25pZmljYW50IGJpdCBvZiBmaXJzdCBvY3RldCBtdXN0IGJlIHNldC4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vZGUgJiAweDAxMDAwMDAwMDAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vZGUgPCAoMUwgPDwgNDgpKQorCisgICAgZGVmIHRlc3RfdW5peGRsbF9nZXRub2RlKHNlbGYpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGltcG9ydCBvcworICAgICAgICBpZiBpbXBvcnRhYmxlKCdjdHlwZXMnKSBhbmQgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAgICAgdHJ5OiAjIElzc3VlcyAxNDgxLCAzNTgxOiBfdXVpZF9nZW5lcmF0ZV90aW1lKCkgbWlnaHQgYmUgTm9uZS4KKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX25vZGUodXVpZC5fdW5peGRsbF9nZXRub2RlKCksICd1bml4ZGxsJykKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3Rfd2luZGxsX2dldG5vZGUoc2VsZik6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBpZiBpbXBvcnRhYmxlKCdjdHlwZXMnKSBhbmQgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICAgICAgc2VsZi5jaGVja19ub2RlKHV1aWQuX3dpbmRsbF9nZXRub2RlKCksICd3aW5kbGwnKQorCisgICAgZGVmIHRlc3RfZ2V0bm9kZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBub2RlMSA9IHV1aWQuZ2V0bm9kZSgpCisgICAgICAgIHNlbGYuY2hlY2tfbm9kZShub2RlMSwgImdldG5vZGUxIikKKworICAgICAgICAjIFRlc3QgaXQgYWdhaW4gdG8gZW5zdXJlIGNvbnNpc3RlbmN5LgorICAgICAgICBub2RlMiA9IHV1aWQuZ2V0bm9kZSgpCisgICAgICAgIHNlbGYuY2hlY2tfbm9kZShub2RlMiwgImdldG5vZGUyIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vZGUxLCBub2RlMikKKworICAgIGRlZiB0ZXN0X3V1aWQxKHNlbGYpOgorICAgICAgICAjIHV1aWQxIHJlcXVpcmVzIGN0eXBlcy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGN0eXBlcworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBlcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICAjIE1ha2Ugc3VyZSB1dWlkMSgpIGdlbmVyYXRlcyBVVUlEcyB0aGF0IGFyZSBhY3R1YWxseSB2ZXJzaW9uIDEuCisgICAgICAgIGZvciB1IGluIFt1dWlkLnV1aWQxKCkgZm9yIGkgaW4gcmFuZ2UoMTApXToKKyAgICAgICAgICAgIGVxdWFsKHUudmFyaWFudCwgdXVpZC5SRkNfNDEyMikKKyAgICAgICAgICAgIGVxdWFsKHUudmVyc2lvbiwgMSkKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZ2VuZXJhdGVkIFVVSURzIGFyZSBhY3R1YWxseSB1bmlxdWUuCisgICAgICAgIHV1aWRzID0ge30KKyAgICAgICAgZm9yIHUgaW4gW3V1aWQudXVpZDEoKSBmb3IgaSBpbiByYW5nZSgxMDAwKV06CisgICAgICAgICAgICB1dWlkc1t1XSA9IDEKKyAgICAgICAgZXF1YWwobGVuKHV1aWRzLmtleXMoKSksIDEwMDApCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHN1cHBsaWVkIG5vZGUgSUQgYXBwZWFycyBpbiB0aGUgVVVJRC4KKyAgICAgICAgdSA9IHV1aWQudXVpZDEoMCkKKyAgICAgICAgZXF1YWwodS5ub2RlLCAwKQorICAgICAgICB1ID0gdXVpZC51dWlkMSgweDEyMzQ1Njc4OWFiYykKKyAgICAgICAgZXF1YWwodS5ub2RlLCAweDEyMzQ1Njc4OWFiYykKKyAgICAgICAgdSA9IHV1aWQudXVpZDEoMHhmZmZmZmZmZmZmZmYpCisgICAgICAgIGVxdWFsKHUubm9kZSwgMHhmZmZmZmZmZmZmZmYpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHN1cHBsaWVkIGNsb2NrIHNlcXVlbmNlIGFwcGVhcnMgaW4gdGhlIFVVSUQuCisgICAgICAgIHUgPSB1dWlkLnV1aWQxKDB4MTIzNDU2Nzg5YWJjLCAwKQorICAgICAgICBlcXVhbCh1Lm5vZGUsIDB4MTIzNDU2Nzg5YWJjKQorICAgICAgICBlcXVhbCgoKHUuY2xvY2tfc2VxX2hpX3ZhcmlhbnQgJiAweDNmKSA8PCA4KSB8IHUuY2xvY2tfc2VxX2xvdywgMCkKKyAgICAgICAgdSA9IHV1aWQudXVpZDEoMHgxMjM0NTY3ODlhYmMsIDB4MTIzNCkKKyAgICAgICAgZXF1YWwodS5ub2RlLCAweDEyMzQ1Njc4OWFiYykKKyAgICAgICAgZXF1YWwoKCh1LmNsb2NrX3NlcV9oaV92YXJpYW50ICYgMHgzZikgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIHUuY2xvY2tfc2VxX2xvdywgMHgxMjM0KQorICAgICAgICB1ID0gdXVpZC51dWlkMSgweDEyMzQ1Njc4OWFiYywgMHgzZmZmKQorICAgICAgICBlcXVhbCh1Lm5vZGUsIDB4MTIzNDU2Nzg5YWJjKQorICAgICAgICBlcXVhbCgoKHUuY2xvY2tfc2VxX2hpX3ZhcmlhbnQgJiAweDNmKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgdS5jbG9ja19zZXFfbG93LCAweDNmZmYpCisKKyAgICBkZWYgdGVzdF91dWlkMyhzZWxmKToKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgIyBUZXN0IHNvbWUga25vd24gdmVyc2lvbi0zIFVVSURzLgorICAgICAgICBmb3IgdSwgdiBpbiBbKHV1aWQudXVpZDModXVpZC5OQU1FU1BBQ0VfRE5TLCAncHl0aG9uLm9yZycpLAorICAgICAgICAgICAgICAgICAgICAgICc2ZmE0NTllYS1lZThhLTNjYTQtODk0ZS1kYjc3ZTE2MDM1NWUnKSwKKyAgICAgICAgICAgICAgICAgICAgICh1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX1VSTCwgJ2h0dHA6Ly9weXRob24ub3JnLycpLAorICAgICAgICAgICAgICAgICAgICAgICc5ZmU4ZThjNC1hYWE4LTMyYTktYTU1Yy00NTM1YTg4Yjc0OGQnKSwKKyAgICAgICAgICAgICAgICAgICAgICh1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX09JRCwgJzEuMy42LjEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnZGQxYTFjZWYtMTNkNS0zNjhhLWFkODItZWNhNzFhY2Q0Y2QxJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkMyh1dWlkLk5BTUVTUEFDRV9YNTAwLCAnYz1jYScpLAorICAgICAgICAgICAgICAgICAgICAgICc2NThkMzAwMi1kYjZiLTMwNDAtYTFkMS04ZGRkN2QxODlhNGQnKSwKKyAgICAgICAgICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGVxdWFsKHUudmFyaWFudCwgdXVpZC5SRkNfNDEyMikKKyAgICAgICAgICAgIGVxdWFsKHUudmVyc2lvbiwgMykKKyAgICAgICAgICAgIGVxdWFsKHUsIHV1aWQuVVVJRCh2KSkKKyAgICAgICAgICAgIGVxdWFsKHN0cih1KSwgdikKKworICAgIGRlZiB0ZXN0X3V1aWQ0KHNlbGYpOgorICAgICAgICAjIHV1aWQ0IHJlcXVpcmVzIGN0eXBlcy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGN0eXBlcworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBlcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICAjIE1ha2Ugc3VyZSB1dWlkNCgpIGdlbmVyYXRlcyBVVUlEcyB0aGF0IGFyZSBhY3R1YWxseSB2ZXJzaW9uIDQuCisgICAgICAgIGZvciB1IGluIFt1dWlkLnV1aWQ0KCkgZm9yIGkgaW4gcmFuZ2UoMTApXToKKyAgICAgICAgICAgIGVxdWFsKHUudmFyaWFudCwgdXVpZC5SRkNfNDEyMikKKyAgICAgICAgICAgIGVxdWFsKHUudmVyc2lvbiwgNCkKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZ2VuZXJhdGVkIFVVSURzIGFyZSBhY3R1YWxseSB1bmlxdWUuCisgICAgICAgIHV1aWRzID0ge30KKyAgICAgICAgZm9yIHUgaW4gW3V1aWQudXVpZDQoKSBmb3IgaSBpbiByYW5nZSgxMDAwKV06CisgICAgICAgICAgICB1dWlkc1t1XSA9IDEKKyAgICAgICAgZXF1YWwobGVuKHV1aWRzLmtleXMoKSksIDEwMDApCisKKyAgICBkZWYgdGVzdF91dWlkNShzZWxmKToKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgIyBUZXN0IHNvbWUga25vd24gdmVyc2lvbi01IFVVSURzLgorICAgICAgICBmb3IgdSwgdiBpbiBbKHV1aWQudXVpZDUodXVpZC5OQU1FU1BBQ0VfRE5TLCAncHl0aG9uLm9yZycpLAorICAgICAgICAgICAgICAgICAgICAgICc4ODYzMTNlMS0zYjhhLTUzNzItOWI5MC0wYzlhZWUxOTllNWQnKSwKKyAgICAgICAgICAgICAgICAgICAgICh1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX1VSTCwgJ2h0dHA6Ly9weXRob24ub3JnLycpLAorICAgICAgICAgICAgICAgICAgICAgICc0YzU2NWYwZC0zZjVhLTU4OTAtYjQxYi0yMGNmNDc3MDFjNWUnKSwKKyAgICAgICAgICAgICAgICAgICAgICh1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX09JRCwgJzEuMy42LjEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnMTQ0N2ZhNjEtNTI3Ny01ZmVmLWE5YjMtZmJjNmU0NGY0YWYzJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9YNTAwLCAnYz1jYScpLAorICAgICAgICAgICAgICAgICAgICAgICdjYzk1N2RkMS1hOTcyLTUzNDktOThjZC04NzQxOTAwMDI3OTgnKSwKKyAgICAgICAgICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGVxdWFsKHUudmFyaWFudCwgdXVpZC5SRkNfNDEyMikKKyAgICAgICAgICAgIGVxdWFsKHUudmVyc2lvbiwgNSkKKyAgICAgICAgICAgIGVxdWFsKHUsIHV1aWQuVVVJRCh2KSkKKyAgICAgICAgICAgIGVxdWFsKHN0cih1KSwgdikKKworICAgIGRlZiB0ZXN0SXNzdWU4NjIxKHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpZiBvcy5uYW1lICE9ICdwb3NpeCc6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIE9uIGF0IGxlYXN0IHNvbWUgdmVyc2lvbnMgb2YgT1NYIHV1aWQudXVpZDQgZ2VuZXJhdGVzCisgICAgICAgICMgdGhlIHNhbWUgc2VxdWVuY2Ugb2YgVVVJRHMgaW4gdGhlIHBhcmVudCBhbmQgYW55CisgICAgICAgICMgY2hpbGRyZW4gc3RhcnRlZCB1c2luZyBmb3JrLgorICAgICAgICBmZHMgPSBvcy5waXBlKCkKKyAgICAgICAgcGlkID0gb3MuZm9yaygpCisgICAgICAgIGlmIHBpZCA9PSAwOgorICAgICAgICAgICAgb3MuY2xvc2UoZmRzWzBdKQorICAgICAgICAgICAgdmFsdWUgPSB1dWlkLnV1aWQ0KCkKKyAgICAgICAgICAgIG9zLndyaXRlKGZkc1sxXSwgdmFsdWUuaGV4KQorICAgICAgICAgICAgb3MuX2V4aXQoMCkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3MuY2xvc2UoZmRzWzFdKQorICAgICAgICAgICAgcGFyZW50X3ZhbHVlID0gdXVpZC51dWlkNCgpLmhleAorICAgICAgICAgICAgb3Mud2FpdHBpZChwaWQsIDApCisgICAgICAgICAgICBjaGlsZF92YWx1ZSA9IG9zLnJlYWQoZmRzWzBdLCAxMDApCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocGFyZW50X3ZhbHVlLCBjaGlsZF92YWx1ZSkKKworCisKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0VVVJRCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXVpZC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91dWlkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGI5MzRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXVpZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXVpZC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91dWlkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGI5MzRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXVpZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YWl0My5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTA3ODNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDMucHkKQEAgLTAsMCArMSwzOSBAQAorIiIiVGhpcyB0ZXN0IGNoZWNrcyBmb3IgY29ycmVjdCB3YWl0MygpIGJlaGF2aW9yLgorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LmZvcmtfd2FpdCBpbXBvcnQgRm9ya1dhaXQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgcmVhcF9jaGlsZHJlbgorCit0cnk6CisgICAgb3MuZm9yaworZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0LCAib3MuZm9yayBub3QgZGVmaW5lZCAtLSBza2lwcGluZyB0ZXN0X3dhaXQzIgorCit0cnk6CisgICAgb3Mud2FpdDMKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCwgIm9zLndhaXQzIG5vdCBkZWZpbmVkIC0tIHNraXBwaW5nIHRlc3Rfd2FpdDMiCisKK2NsYXNzIFdhaXQzVGVzdChGb3JrV2FpdCk6CisgICAgZGVmIHdhaXRfaW1wbChzZWxmLCBjcGlkKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgIyB3YWl0MygpIHNob3VsZG4ndCBoYW5nLCBidXQgc29tZSBvZiB0aGUgYnVpbGRib3RzIHNlZW0gdG8gaGFuZworICAgICAgICAgICAgIyBpbiB0aGUgZm9ya2luZyB0ZXN0cy4gIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBmaXggdGhlIHByb2JsZW0uCisgICAgICAgICAgICBzcGlkLCBzdGF0dXMsIHJ1c2FnZSA9IG9zLndhaXQzKG9zLldOT0hBTkcpCisgICAgICAgICAgICBpZiBzcGlkID09IGNwaWQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMS4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BpZCwgY3BpZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0dXMsIDAsICJjYXVzZSA9ICVkLCBleGl0ID0gJWQiICUgKHN0YXR1cyYweGZmLCBzdGF0dXM+PjgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVzYWdlKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFdhaXQzVGVzdCkKKyAgICByZWFwX2NoaWxkcmVuKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MGFkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YWl0My5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MGFkYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YWl0My5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YWl0NC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDRhMTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDQucHkKQEAgLTAsMCArMSwzMiBAQAorIiIiVGhpcyB0ZXN0IGNoZWNrcyBmb3IgY29ycmVjdCB3YWl0NCgpIGJlaGF2aW9yLgorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHRpbWUKK2Zyb20gdGVzdC5mb3JrX3dhaXQgaW1wb3J0IEZvcmtXYWl0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIHJlYXBfY2hpbGRyZW4sIGdldF9hdHRyaWJ1dGUKKworIyBJZiBlaXRoZXIgb2YgdGhlc2UgZG8gbm90IGV4aXN0LCBza2lwIHRoaXMgdGVzdC4KK2dldF9hdHRyaWJ1dGUob3MsICdmb3JrJykKK2dldF9hdHRyaWJ1dGUob3MsICd3YWl0NCcpCisKKworY2xhc3MgV2FpdDRUZXN0KEZvcmtXYWl0KToKKyAgICBkZWYgd2FpdF9pbXBsKHNlbGYsIGNwaWQpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICAjIHdhaXQ0KCkgc2hvdWxkbid0IGhhbmcsIGJ1dCBzb21lIG9mIHRoZSBidWlsZGJvdHMgc2VlbSB0byBoYW5nCisgICAgICAgICAgICAjIGluIHRoZSBmb3JraW5nIHRlc3RzLiAgVGhpcyBpcyBhbiBhdHRlbXB0IHRvIGZpeCB0aGUgcHJvYmxlbS4KKyAgICAgICAgICAgIHNwaWQsIHN0YXR1cywgcnVzYWdlID0gb3Mud2FpdDQoY3BpZCwgb3MuV05PSEFORykKKyAgICAgICAgICAgIGlmIHNwaWQgPT0gY3BpZDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGltZS5zbGVlcCgxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BpZCwgY3BpZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0dXMsIDAsICJjYXVzZSA9ICVkLCBleGl0ID0gJWQiICUgKHN0YXR1cyYweGZmLCBzdGF0dXM+PjgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVzYWdlKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFdhaXQ0VGVzdCkKKyAgICByZWFwX2NoaWxkcmVuKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZDM5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YWl0NC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZDM5NzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YWl0NC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FybmluZ3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YXJuaW5ncy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTAyZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FybmluZ3MucHkKQEAgLTAsMCArMSw3NjEgQEAKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKK2ltcG9ydCBsaW5lY2FjaGUKK2ltcG9ydCBvcworaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzdWJwcm9jZXNzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2sKKworaW1wb3J0IHdhcm5pbmdfdGVzdHMKKworaW1wb3J0IHdhcm5pbmdzIGFzIG9yaWdpbmFsX3dhcm5pbmdzCisKK3B5X3dhcm5pbmdzID0gdGVzdF9zdXBwb3J0LmltcG9ydF9mcmVzaF9tb2R1bGUoJ3dhcm5pbmdzJywgYmxvY2tlZD1bJ193YXJuaW5ncyddKQorY193YXJuaW5ncyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfZnJlc2hfbW9kdWxlKCd3YXJuaW5ncycsIGZyZXNoPVsnX3dhcm5pbmdzJ10pCisKK0Bjb250ZXh0bWFuYWdlcgorZGVmIHdhcm5pbmdzX3N0YXRlKG1vZHVsZSk6CisgICAgIiIiVXNlIGEgc3BlY2lmaWMgd2FybmluZ3MgaW1wbGVtZW50YXRpb24gaW4gd2FybmluZ190ZXN0cy4iIiIKKyAgICBnbG9iYWwgX193YXJuaW5ncmVnaXN0cnlfXworICAgIGZvciB0b19jbGVhciBpbiAoc3lzLCB3YXJuaW5nX3Rlc3RzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdG9fY2xlYXIuX193YXJuaW5ncmVnaXN0cnlfXy5jbGVhcigpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICB0cnk6CisgICAgICAgIF9fd2FybmluZ3JlZ2lzdHJ5X18uY2xlYXIoKQorICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBvcmlnaW5hbF93YXJuaW5ncyA9IHdhcm5pbmdfdGVzdHMud2FybmluZ3MKKyAgICBvcmlnaW5hbF9maWx0ZXJzID0gbW9kdWxlLmZpbHRlcnMKKyAgICB0cnk6CisgICAgICAgIG1vZHVsZS5maWx0ZXJzID0gb3JpZ2luYWxfZmlsdGVyc1s6XQorICAgICAgICBtb2R1bGUuc2ltcGxlZmlsdGVyKCJvbmNlIikKKyAgICAgICAgd2FybmluZ190ZXN0cy53YXJuaW5ncyA9IG1vZHVsZQorICAgICAgICB5aWVsZAorICAgIGZpbmFsbHk6CisgICAgICAgIHdhcm5pbmdfdGVzdHMud2FybmluZ3MgPSBvcmlnaW5hbF93YXJuaW5ncworICAgICAgICBtb2R1bGUuZmlsdGVycyA9IG9yaWdpbmFsX2ZpbHRlcnMKKworCitjbGFzcyBCYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJCYXNpYyBib29ra2VlcGluZyByZXF1aXJlZCBmb3IgdGVzdGluZy4iIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBUaGUgX193YXJuaW5ncmVnaXN0cnlfXyBuZWVkcyB0byBiZSBpbiBhIHByaXN0aW5lIHN0YXRlIGZvciB0ZXN0cworICAgICAgICAjIHRvIHdvcmsgcHJvcGVybHkuCisgICAgICAgIGlmICdfX3dhcm5pbmdyZWdpc3RyeV9fJyBpbiBnbG9iYWxzKCk6CisgICAgICAgICAgICBkZWwgZ2xvYmFscygpWydfX3dhcm5pbmdyZWdpc3RyeV9fJ10KKyAgICAgICAgaWYgaGFzYXR0cih3YXJuaW5nX3Rlc3RzLCAnX193YXJuaW5ncmVnaXN0cnlfXycpOgorICAgICAgICAgICAgZGVsIHdhcm5pbmdfdGVzdHMuX193YXJuaW5ncmVnaXN0cnlfXworICAgICAgICBpZiBoYXNhdHRyKHN5cywgJ19fd2FybmluZ3JlZ2lzdHJ5X18nKToKKyAgICAgICAgICAgIGRlbCBzeXMuX193YXJuaW5ncmVnaXN0cnlfXworICAgICAgICAjIFRoZSAnd2FybmluZ3MnIG1vZHVsZSBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0IHNvIHRoYXQgdGhlIHByb3BlcgorICAgICAgICAjIGludGVyYWN0aW9uIGJldHdlZW4gX3dhcm5pbmdzIGFuZCAnd2FybmluZ3MnIGNhbiBiZSBjb250cm9sbGVkLgorICAgICAgICBzeXMubW9kdWxlc1snd2FybmluZ3MnXSA9IHNlbGYubW9kdWxlCisgICAgICAgIHN1cGVyKEJhc2VUZXN0LCBzZWxmKS5zZXRVcCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5tb2R1bGVzWyd3YXJuaW5ncyddID0gb3JpZ2luYWxfd2FybmluZ3MKKyAgICAgICAgc3VwZXIoQmFzZVRlc3QsIHNlbGYpLnRlYXJEb3duKCkKKworCitjbGFzcyBGaWx0ZXJUZXN0cyhvYmplY3QpOgorCisgICAgIiIiVGVzdGluZyB0aGUgZmlsdGVyaW5nIGZ1bmN0aW9uYWxpdHkuIiIiCisKKyAgICBkZWYgdGVzdF9lcnJvcihzZWxmKToKKyAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5yZXNldHdhcm5pbmdzKCkKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsIGNhdGVnb3J5PVVzZXJXYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVXNlcldhcm5pbmcsIHNlbGYubW9kdWxlLndhcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWx0ZXJUZXN0cy50ZXN0X2Vycm9yIikKKworICAgIGRlZiB0ZXN0X2lnbm9yZShzZWxmKToKKyAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5yZXNldHdhcm5pbmdzKCkKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4oIkZpbHRlclRlc3RzLnRlc3RfaWdub3JlIiwgVXNlcldhcm5pbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMCkKKworICAgIGRlZiB0ZXN0X2Fsd2F5cyhzZWxmKToKKyAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5yZXNldHdhcm5pbmdzKCkKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJhbHdheXMiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsdGVyVGVzdHMudGVzdF9hbHdheXMiCisgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKG1lc3NhZ2UsIFVzZXJXYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UsIHdbLTFdLm1lc3NhZ2UpCisgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKG1lc3NhZ2UsIFVzZXJXYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdbLTFdLm1lc3NhZ2UsIG1lc3NhZ2UpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0KHNlbGYpOgorICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlLAorICAgICAgICAgICAgICAgIG1vZHVsZT1zZWxmLm1vZHVsZSkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLnJlc2V0d2FybmluZ3MoKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoImRlZmF1bHQiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBVc2VyV2FybmluZygiRmlsdGVyVGVzdHMudGVzdF9kZWZhdWx0IikKKyAgICAgICAgICAgIGZvciB4IGluIHhyYW5nZSgyKToKKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKG1lc3NhZ2UsIFVzZXJXYXJuaW5nKQorICAgICAgICAgICAgICAgIGlmIHggPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Wy0xXS5tZXNzYWdlLCBtZXNzYWdlKQorICAgICAgICAgICAgICAgICAgICBkZWwgd1s6XQorICAgICAgICAgICAgICAgIGVsaWYgeCA9PSAxOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJsb29wIHZhcmlhbnQgdW5oYW5kbGVkIikKKworICAgIGRlZiB0ZXN0X21vZHVsZShzZWxmKToKKyAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5yZXNldHdhcm5pbmdzKCkKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJtb2R1bGUiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBVc2VyV2FybmluZygiRmlsdGVyVGVzdHMudGVzdF9tb2R1bGUiKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUud2FybihtZXNzYWdlLCBVc2VyV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod1stMV0ubWVzc2FnZSwgbWVzc2FnZSkKKyAgICAgICAgICAgIGRlbCB3WzpdCisgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKG1lc3NhZ2UsIFVzZXJXYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDApCisKKyAgICBkZWYgdGVzdF9vbmNlKHNlbGYpOgorICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlLAorICAgICAgICAgICAgICAgIG1vZHVsZT1zZWxmLm1vZHVsZSkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLnJlc2V0d2FybmluZ3MoKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoIm9uY2UiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKKyAgICAgICAgICAgIG1lc3NhZ2UgPSBVc2VyV2FybmluZygiRmlsdGVyVGVzdHMudGVzdF9vbmNlIikKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm5fZXhwbGljaXQobWVzc2FnZSwgVXNlcldhcm5pbmcsICJ0ZXN0X3dhcm5pbmdzLnB5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Wy0xXS5tZXNzYWdlLCBtZXNzYWdlKQorICAgICAgICAgICAgZGVsIHdbOl0KKyAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm5fZXhwbGljaXQobWVzc2FnZSwgVXNlcldhcm5pbmcsICJ0ZXN0X3dhcm5pbmdzLnB5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDApCisgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIFVzZXJXYXJuaW5nLCAidGVzdF93YXJuaW5nczIucHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMCkKKworICAgIGRlZiB0ZXN0X2luaGVyaXRhbmNlKHNlbGYpOgorICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLnJlc2V0d2FybmluZ3MoKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgY2F0ZWdvcnk9V2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVzZXJXYXJuaW5nLCBzZWxmLm1vZHVsZS53YXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsdGVyVGVzdHMudGVzdF9pbmhlcml0YW5jZSIsIFVzZXJXYXJuaW5nKQorCisgICAgZGVmIHRlc3Rfb3JkZXJpbmcoc2VsZik6CisgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgbW9kdWxlPXNlbGYubW9kdWxlKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5tb2R1bGUucmVzZXR3YXJuaW5ncygpCisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCBjYXRlZ29yeT1Vc2VyV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ9VHJ1ZSkKKyAgICAgICAgICAgIGRlbCB3WzpdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2FybigiRmlsdGVyVGVzdHMudGVzdF9vcmRlcmluZyIsIFVzZXJXYXJuaW5nKQorICAgICAgICAgICAgZXhjZXB0IFVzZXJXYXJuaW5nOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgib3JkZXIgaGFuZGxpbmcgZm9yIGFjdGlvbnMgZmFpbGVkIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAwKQorCisgICAgZGVmIHRlc3RfZmlsdGVyd2FybmluZ3Moc2VsZik6CisgICAgICAgICMgVGVzdCBmaWx0ZXJ3YXJuaW5ncygpLgorICAgICAgICAjIEltcGxpY2l0bHkgYWxzbyB0ZXN0cyByZXNldHdhcm5pbmdzKCkuCisgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgbW9kdWxlPXNlbGYubW9kdWxlKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgIiIsIFdhcm5pbmcsICIiLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVXNlcldhcm5pbmcsIHNlbGYubW9kdWxlLndhcm4sICdjb252ZXJ0IHRvIGVycm9yJykKKworICAgICAgICAgICAgc2VsZi5tb2R1bGUucmVzZXR3YXJuaW5ncygpCisgICAgICAgICAgICB0ZXh0ID0gJ2hhbmRsZSBub3JtYWxseScKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4odGV4dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHdbLTFdLm1lc3NhZ2UpLCB0ZXh0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdbLTFdLmNhdGVnb3J5IGlzIFVzZXJXYXJuaW5nKQorCisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgIiIsIFdhcm5pbmcsICIiLCAwKQorICAgICAgICAgICAgdGV4dCA9ICdmaWx0ZXJlZCBvdXQnCisgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKHRleHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHN0cih3Wy0xXS5tZXNzYWdlKSwgdGV4dCkKKworICAgICAgICAgICAgc2VsZi5tb2R1bGUucmVzZXR3YXJuaW5ncygpCisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCAiaGV4KiIsIFdhcm5pbmcsICIiLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVXNlcldhcm5pbmcsIHNlbGYubW9kdWxlLndhcm4sICdoZXgvb2N0JykKKyAgICAgICAgICAgIHRleHQgPSAnbm9ubWF0Y2hpbmcgdGV4dCcKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4odGV4dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHdbLTFdLm1lc3NhZ2UpLCB0ZXh0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdbLTFdLmNhdGVnb3J5IGlzIFVzZXJXYXJuaW5nKQorCitjbGFzcyBDRmlsdGVyVGVzdHMoQmFzZVRlc3QsIEZpbHRlclRlc3RzKToKKyAgICBtb2R1bGUgPSBjX3dhcm5pbmdzCisKK2NsYXNzIFB5RmlsdGVyVGVzdHMoQmFzZVRlc3QsIEZpbHRlclRlc3RzKToKKyAgICBtb2R1bGUgPSBweV93YXJuaW5ncworCisKK2NsYXNzIFdhcm5UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJUZXN0IHdhcm5pbmdzLndhcm4oKSBhbmQgd2FybmluZ3Mud2Fybl9leHBsaWNpdCgpLiIiIgorCisgICAgZGVmIHRlc3RfbWVzc2FnZShzZWxmKToKKyAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5zaW1wbGVmaWx0ZXIoIm9uY2UiKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNCk6CisgICAgICAgICAgICAgICAgdGV4dCA9ICdtdWx0aSAlZCcgJWkgICMgRGlmZmVyZW50IHRleHQgb24gZWFjaCBjYWxsLgorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4odGV4dCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3Wy0xXS5tZXNzYWdlKSwgdGV4dCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod1stMV0uY2F0ZWdvcnkgaXMgVXNlcldhcm5pbmcpCisKKyAgICBkZWYgdGVzdF9maWxlbmFtZShzZWxmKToKKyAgICAgICAgd2l0aCB3YXJuaW5nc19zdGF0ZShzZWxmLm1vZHVsZSk6CisgICAgICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlLAorICAgICAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICAgICAgd2FybmluZ190ZXN0cy5pbm5lcigic3BhbTEiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5iYXNlbmFtZSh3Wy0xXS5maWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybmluZ190ZXN0cy5weSIpCisgICAgICAgICAgICAgICAgd2FybmluZ190ZXN0cy5vdXRlcigic3BhbTIiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5iYXNlbmFtZSh3Wy0xXS5maWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybmluZ190ZXN0cy5weSIpCisKKyAgICBkZWYgdGVzdF9zdGFja2xldmVsKHNlbGYpOgorICAgICAgICAjIFRlc3Qgc3RhY2tsZXZlbCBhcmd1bWVudAorICAgICAgICAjIG1ha2Ugc3VyZSBhbGwgbWVzc2FnZXMgYXJlIGRpZmZlcmVudCwgc28gdGhlIHdhcm5pbmcgd29uJ3QgYmUgc2tpcHBlZAorICAgICAgICB3aXRoIHdhcm5pbmdzX3N0YXRlKHNlbGYubW9kdWxlKToKKyAgICAgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgICAgIG1vZHVsZT1zZWxmLm1vZHVsZSkgYXMgdzoKKyAgICAgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLmlubmVyKCJzcGFtMyIsIHN0YWNrbGV2ZWw9MSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguYmFzZW5hbWUod1stMV0uZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm5pbmdfdGVzdHMucHkiKQorICAgICAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMub3V0ZXIoInNwYW00Iiwgc3RhY2tsZXZlbD0xKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5iYXNlbmFtZSh3Wy0xXS5maWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybmluZ190ZXN0cy5weSIpCisKKyAgICAgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLmlubmVyKCJzcGFtNSIsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguYmFzZW5hbWUod1stMV0uZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Rfd2FybmluZ3MucHkiKQorICAgICAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMub3V0ZXIoInNwYW02Iiwgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5iYXNlbmFtZSh3Wy0xXS5maWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FybmluZ190ZXN0cy5weSIpCisgICAgICAgICAgICAgICAgd2FybmluZ190ZXN0cy5vdXRlcigic3BhbTYuNSIsIHN0YWNrbGV2ZWw9MykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguYmFzZW5hbWUod1stMV0uZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Rfd2FybmluZ3MucHkiKQorCisgICAgICAgICAgICAgICAgd2FybmluZ190ZXN0cy5pbm5lcigic3BhbTciLCBzdGFja2xldmVsPTk5OTkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmJhc2VuYW1lKHdbLTFdLmZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXMiKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19maWxlbmFtZV9ub3RfbWFpbihzZWxmKToKKyAgICAgICAgIyBJZiBfX2ZpbGVfXyBpcyBub3Qgc3BlY2lmaWVkIGFuZCBfX21haW5fXyBpcyBub3QgdGhlIG1vZHVsZSBuYW1lLAorICAgICAgICAjIHRoZW4gX19maWxlX18gc2hvdWxkIGJlIHNldCB0byB0aGUgbW9kdWxlIG5hbWUuCisgICAgICAgIGZpbGVuYW1lID0gd2FybmluZ190ZXN0cy5fX2ZpbGVfXworICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgd2FybmluZ190ZXN0cy5fX2ZpbGVfXworICAgICAgICAgICAgd2l0aCB3YXJuaW5nc19zdGF0ZShzZWxmLm1vZHVsZSk6CisgICAgICAgICAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZT1zZWxmLm1vZHVsZSkgYXMgdzoKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZ190ZXN0cy5pbm5lcigic3BhbTgiLCBzdGFja2xldmVsPTEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod1stMV0uZmlsZW5hbWUsIHdhcm5pbmdfdGVzdHMuX19uYW1lX18pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLl9fZmlsZV9fID0gZmlsZW5hbWUKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfZmlsZW5hbWVfbWFpbl93aXRoX2FyZ3Yoc2VsZik6CisgICAgICAgICMgSWYgX19maWxlX18gaXMgbm90IHNwZWNpZmllZCBhbmQgdGhlIGNhbGxlciBpcyBfX21haW5fXyBhbmQgc3lzLmFyZ3YKKyAgICAgICAgIyBleGlzdHMsIHRoZW4gdXNlIHN5cy5hcmd2WzBdIGFzIHRoZSBmaWxlLgorICAgICAgICBpZiBub3QgaGFzYXR0cihzeXMsICdhcmd2Jyk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZmlsZW5hbWUgPSB3YXJuaW5nX3Rlc3RzLl9fZmlsZV9fCisgICAgICAgIG1vZHVsZV9uYW1lID0gd2FybmluZ190ZXN0cy5fX25hbWVfXworICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgd2FybmluZ190ZXN0cy5fX2ZpbGVfXworICAgICAgICAgICAgd2FybmluZ190ZXN0cy5fX25hbWVfXyA9ICdfX21haW5fXycKKyAgICAgICAgICAgIHdpdGggd2FybmluZ3Nfc3RhdGUoc2VsZi5tb2R1bGUpOgorICAgICAgICAgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuaW5uZXIoJ3NwYW05Jywgc3RhY2tsZXZlbD0xKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdbLTFdLmZpbGVuYW1lLCBzeXMuYXJndlswXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuX19maWxlX18gPSBmaWxlbmFtZQorICAgICAgICAgICAgd2FybmluZ190ZXN0cy5fX25hbWVfXyA9IG1vZHVsZV9uYW1lCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2ZpbGVuYW1lX21haW5fd2l0aG91dF9hcmd2KHNlbGYpOgorICAgICAgICAjIElmIF9fZmlsZV9fIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjYWxsZXIgaXMgX19tYWluX18sIGFuZCBzeXMuYXJndgorICAgICAgICAjIGlzIG5vdCBzZXQsIHRoZW4gJ19fbWFpbl9fJyBpcyB0aGUgZmlsZSBuYW1lLgorICAgICAgICBmaWxlbmFtZSA9IHdhcm5pbmdfdGVzdHMuX19maWxlX18KKyAgICAgICAgbW9kdWxlX25hbWUgPSB3YXJuaW5nX3Rlc3RzLl9fbmFtZV9fCisgICAgICAgIGFyZ3YgPSBzeXMuYXJndgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgd2FybmluZ190ZXN0cy5fX2ZpbGVfXworICAgICAgICAgICAgd2FybmluZ190ZXN0cy5fX25hbWVfXyA9ICdfX21haW5fXycKKyAgICAgICAgICAgIGRlbCBzeXMuYXJndgorICAgICAgICAgICAgd2l0aCB3YXJuaW5nc19zdGF0ZShzZWxmLm1vZHVsZSk6CisgICAgICAgICAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZT1zZWxmLm1vZHVsZSkgYXMgdzoKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZ190ZXN0cy5pbm5lcignc3BhbTEwJywgc3RhY2tsZXZlbD0xKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdbLTFdLmZpbGVuYW1lLCAnX19tYWluX18nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgd2FybmluZ190ZXN0cy5fX2ZpbGVfXyA9IGZpbGVuYW1lCisgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLl9fbmFtZV9fID0gbW9kdWxlX25hbWUKKyAgICAgICAgICAgIHN5cy5hcmd2ID0gYXJndgorCisgICAgZGVmIHRlc3RfbWlzc2luZ19maWxlbmFtZV9tYWluX3dpdGhfYXJndl9lbXB0eV9zdHJpbmcoc2VsZik6CisgICAgICAgICMgSWYgX19maWxlX18gaXMgbm90IHNwZWNpZmllZCwgdGhlIGNhbGxlciBpcyBfX21haW5fXywgYW5kIHN5cy5hcmd2WzBdCisgICAgICAgICMgaXMgdGhlIGVtcHR5IHN0cmluZywgdGhlbiAnX19tYWluX18gaXMgdGhlIGZpbGUgbmFtZS4KKyAgICAgICAgIyBUZXN0cyBpc3N1ZSAyNzQzLgorICAgICAgICBmaWxlX25hbWUgPSB3YXJuaW5nX3Rlc3RzLl9fZmlsZV9fCisgICAgICAgIG1vZHVsZV9uYW1lID0gd2FybmluZ190ZXN0cy5fX25hbWVfXworICAgICAgICBhcmd2ID0gc3lzLmFyZ3YKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHdhcm5pbmdfdGVzdHMuX19maWxlX18KKyAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuX19uYW1lX18gPSAnX19tYWluX18nCisgICAgICAgICAgICBzeXMuYXJndiA9IFsnJ10KKyAgICAgICAgICAgIHdpdGggd2FybmluZ3Nfc3RhdGUoc2VsZi5tb2R1bGUpOgorICAgICAgICAgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuaW5uZXIoJ3NwYW0xMScsIHN0YWNrbGV2ZWw9MSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Wy0xXS5maWxlbmFtZSwgJ19fbWFpbl9fJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuX19maWxlX18gPSBmaWxlX25hbWUKKyAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuX19uYW1lX18gPSBtb2R1bGVfbmFtZQorICAgICAgICAgICAgc3lzLmFyZ3YgPSBhcmd2CisKKyAgICBkZWYgdGVzdF93YXJuX2V4cGxpY2l0X3R5cGVfZXJyb3JzKHNlbGYpOgorICAgICAgICAjIHdhcm5fZXhwbGljaXQoKSBzaG91bGQgZXJyb3Igb3V0IGdyYWNlZnVsbHkgaWYgaXQgaXMgZ2l2ZW4gb2JqZWN0cworICAgICAgICAjIG9mIHRoZSB3cm9uZyB0eXBlcy4KKyAgICAgICAgIyBsaW5lbm8gaXMgZXhwZWN0ZWQgdG8gYmUgYW4gaW50ZWdlci4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1vZHVsZS53YXJuX2V4cGxpY2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIFVzZXJXYXJuaW5nLCBOb25lLCBOb25lKQorICAgICAgICAjIEVpdGhlciAnbWVzc2FnZScgbmVlZHMgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgV2FybmluZyBvciAnY2F0ZWdvcnknCisgICAgICAgICMgbmVlZHMgdG8gYmUgYSBzdWJjbGFzcy4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1vZHVsZS53YXJuX2V4cGxpY2l0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUsIE5vbmUsIDEpCisgICAgICAgICMgJ3JlZ2lzdHJ5JyBtdXN0IGJlIGEgZGljdCBvciBOb25lLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybl9leHBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBXYXJuaW5nLCBOb25lLCAxLCByZWdpc3RyeT00MikKKworICAgIGRlZiB0ZXN0X2JhZF9zdHIoc2VsZik6CisgICAgICAgICMgaXNzdWUgNjQxNQorICAgICAgICAjIFdhcm5pbmdzIGluc3RhbmNlIHdpdGggYSBiYWQgZm9ybWF0IHN0cmluZyBmb3IgX19zdHJfXyBzaG91bGQgbm90CisgICAgICAgICMgdHJpZ2dlciBhIGJ1cyBlcnJvci4KKyAgICAgICAgY2xhc3MgQmFkU3RyV2FybmluZyhXYXJuaW5nKToKKyAgICAgICAgICAgICIiIldhcm5pbmcgd2l0aCBhIGJhZCBmb3JtYXQgc3RyaW5nIGZvciBfX3N0cl9fLiIiIgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiQSBiYWQgZm9ybWF0dGVkIHN0cmluZyAlKGVycikiICUKKyAgICAgICAgICAgICAgICAgICAgICAgIHsiZXJyIiA6ICJ0aGVyZSBpcyBubyAlKGVycilzIn0pCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4oQmFkU3RyV2FybmluZygpKQorCisKK2NsYXNzIENXYXJuVGVzdHMoQmFzZVRlc3QsIFdhcm5UZXN0cyk6CisgICAgbW9kdWxlID0gY193YXJuaW5ncworCisgICAgIyBBcyBhbiBlYXJseSBhZG9wdGVyLCB3ZSBzYW5pdHkgY2hlY2sgdGhlCisgICAgIyB0ZXN0X3N1cHBvcnQuaW1wb3J0X2ZyZXNoX21vZHVsZSB1dGlsaXR5IGZ1bmN0aW9uCisgICAgZGVmIHRlc3RfYWNjZWxlcmF0ZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3JpZ2luYWxfd2FybmluZ3MgaXMgc2VsZi5tb2R1bGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihzZWxmLm1vZHVsZS53YXJuLCAnZnVuY19jb2RlJykpCisKK2NsYXNzIFB5V2FyblRlc3RzKEJhc2VUZXN0LCBXYXJuVGVzdHMpOgorICAgIG1vZHVsZSA9IHB5X3dhcm5pbmdzCisKKyAgICAjIEFzIGFuIGVhcmx5IGFkb3B0ZXIsIHdlIHNhbml0eSBjaGVjayB0aGUKKyAgICAjIHRlc3Rfc3VwcG9ydC5pbXBvcnRfZnJlc2hfbW9kdWxlIHV0aWxpdHkgZnVuY3Rpb24KKyAgICBkZWYgdGVzdF9wdXJlX3B5dGhvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcmlnaW5hbF93YXJuaW5ncyBpcyBzZWxmLm1vZHVsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc2VsZi5tb2R1bGUud2FybiwgJ2Z1bmNfY29kZScpKQorCisKK2NsYXNzIFdDbWRMaW5lVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfaW1wcm9wZXJfaW5wdXQoc2VsZik6CisgICAgICAgICMgVXNlcyB0aGUgcHJpdmF0ZSBfc2V0b3B0aW9uKCkgZnVuY3Rpb24gdG8gdGVzdCB0aGUgcGFyc2luZworICAgICAgICAjIG9mIGNvbW1hbmQtbGluZSB3YXJuaW5nIGFyZ3VtZW50cworICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLm1vZHVsZS5fT3B0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5fc2V0b3B0aW9uLCAnMToyOjM6NDo1OjYnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5tb2R1bGUuX09wdGlvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuX3NldG9wdGlvbiwgJ2JvZ3VzOjpXYXJuaW5nJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYubW9kdWxlLl9PcHRpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLl9zZXRvcHRpb24sICdpZ25vcmU6Mjo6NDotNScpCisgICAgICAgICAgICBzZWxmLm1vZHVsZS5fc2V0b3B0aW9uKCdlcnJvcjo6V2FybmluZzo6MCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVc2VyV2FybmluZywgc2VsZi5tb2R1bGUud2FybiwgJ2NvbnZlcnQgdG8gZXJyb3InKQorCisgICAgZGVmIHRlc3RfaW1wcm9wZXJfb3B0aW9uKHNlbGYpOgorICAgICAgICAjIFNhbWUgYXMgYWJvdmUsIGJ1dCBjaGVjayB0aGF0IHRoZSBtZXNzYWdlIGlzIHByaW50ZWQgb3V0IHdoZW4KKyAgICAgICAgIyB0aGUgaW50ZXJwcmV0ZXIgaXMgZXhlY3V0ZWQuIFRoaXMgYWxzbyBjaGVja3MgdGhhdCBvcHRpb25zIGFyZQorICAgICAgICAjIGFjdHVhbGx5IHBhcnNlZCBhdCBhbGwuCisgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soIi1XeHh4IiwgIi1jIiwgInBhc3MiKQorICAgICAgICBzZWxmLmFzc2VydEluKGIiSW52YWxpZCAtVyBvcHRpb24gaWdub3JlZDogaW52YWxpZCBhY3Rpb246ICd4eHgnIiwgZXJyKQorCisgICAgZGVmIHRlc3Rfd2FybmluZ3NfYm9vdHN0cmFwKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgdGhlIHdhcm5pbmdzIG1vZHVsZSBkb2VzIGdldCBsb2FkZWQgd2hlbiAtVzxzb21lIG9wdGlvbj4KKyAgICAgICAgIyBpcyB1c2VkIChzZWUgaXNzdWUgIzEwMzcyIGZvciBhbiBleGFtcGxlIG9mIHNpbGVudCBib290c3RyYXAgZmFpbHVyZSkuCisgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soIi1XaSIsICItYyIsCisgICAgICAgICAgICAiaW1wb3J0IHN5czsgc3lzLm1vZHVsZXNbJ3dhcm5pbmdzJ10ud2FybignZm9vJywgUnVudGltZVdhcm5pbmcpIikKKyAgICAgICAgIyAnLVdpJyB3YXMgb2JzZXJ2ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvdXQuc3RyaXAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihiJ1J1bnRpbWVXYXJuaW5nJywgZXJyKQorCitjbGFzcyBDV0NtZExpbmVUZXN0cyhCYXNlVGVzdCwgV0NtZExpbmVUZXN0cyk6CisgICAgbW9kdWxlID0gY193YXJuaW5ncworCitjbGFzcyBQeVdDbWRMaW5lVGVzdHMoQmFzZVRlc3QsIFdDbWRMaW5lVGVzdHMpOgorICAgIG1vZHVsZSA9IHB5X3dhcm5pbmdzCisKKworY2xhc3MgX1dhcm5pbmdzVGVzdHMoQmFzZVRlc3QpOgorCisgICAgIiIiVGVzdHMgc3BlY2lmaWMgdG8gdGhlIF93YXJuaW5ncyBtb2R1bGUuIiIiCisKKyAgICBtb2R1bGUgPSBjX3dhcm5pbmdzCisKKyAgICBkZWYgdGVzdF9maWx0ZXIoc2VsZik6CisgICAgICAgICMgRXZlcnl0aGluZyBzaG91bGQgZnVuY3Rpb24gZXZlbiBpZiAnZmlsdGVycycgaXMgbm90IGluIHdhcm5pbmdzLgorICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsICIiLCBXYXJuaW5nLCAiIiwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVzZXJXYXJuaW5nLCBzZWxmLm1vZHVsZS53YXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udmVydCB0byBlcnJvcicpCisgICAgICAgICAgICBkZWwgc2VsZi5tb2R1bGUuZmlsdGVycworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVXNlcldhcm5pbmcsIHNlbGYubW9kdWxlLndhcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb252ZXJ0IHRvIGVycm9yJykKKworICAgIGRlZiB0ZXN0X29uY2VyZWdpc3RyeShzZWxmKToKKyAgICAgICAgIyBSZXBsYWNpbmcgb3IgcmVtb3ZpbmcgdGhlIG9uY2VyZWdpc3RyeSBzaG91bGQgYmUgb2theS4KKyAgICAgICAgZ2xvYmFsIF9fd2FybmluZ3JlZ2lzdHJ5X18KKyAgICAgICAgbWVzc2FnZSA9IFVzZXJXYXJuaW5nKCdvbmNlcmVnaXN0cnkgdGVzdCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9yaWdpbmFsX3JlZ2lzdHJ5ID0gc2VsZi5tb2R1bGUub25jZXJlZ2lzdHJ5CisgICAgICAgICAgICBfX3dhcm5pbmdyZWdpc3RyeV9fID0ge30KKyAgICAgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgICAgIG1vZHVsZT1zZWxmLm1vZHVsZSkgYXMgdzoKKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5yZXNldHdhcm5pbmdzKCkKKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygib25jZSIsIGNhdGVnb3J5PVVzZXJXYXJuaW5nKQorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm5fZXhwbGljaXQobWVzc2FnZSwgVXNlcldhcm5pbmcsICJmaWxlIiwgNDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Wy0xXS5tZXNzYWdlLCBtZXNzYWdlKQorICAgICAgICAgICAgICAgIGRlbCB3WzpdCisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybl9leHBsaWNpdChtZXNzYWdlLCBVc2VyV2FybmluZywgImZpbGUiLCA0MikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMCkKKyAgICAgICAgICAgICAgICAjIFRlc3QgdGhlIHJlc2V0dGluZyBvZiBvbmNlcmVnaXN0cnkuCisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUub25jZXJlZ2lzdHJ5ID0ge30KKyAgICAgICAgICAgICAgICBfX3dhcm5pbmdyZWdpc3RyeV9fID0ge30KKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKCdvbmNlcmVnaXN0cnkgdGVzdCcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Wy0xXS5tZXNzYWdlLmFyZ3MsIG1lc3NhZ2UuYXJncykKKyAgICAgICAgICAgICAgICAjIFJlbW92YWwgb2Ygb25jZXJlZ2lzdHJ5IGlzIG9rYXkuCisgICAgICAgICAgICAgICAgZGVsIHdbOl0KKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5tb2R1bGUub25jZXJlZ2lzdHJ5CisgICAgICAgICAgICAgICAgX193YXJuaW5ncmVnaXN0cnlfXyA9IHt9CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybl9leHBsaWNpdChtZXNzYWdlLCBVc2VyV2FybmluZywgImZpbGUiLCA0MikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLm9uY2VyZWdpc3RyeSA9IG9yaWdpbmFsX3JlZ2lzdHJ5CisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X2FjdGlvbihzZWxmKToKKyAgICAgICAgIyBSZXBsYWNpbmcgb3IgcmVtb3ZpbmcgZGVmYXVsdGFjdGlvbiBzaG91bGQgYmUgb2theS4KKyAgICAgICAgbWVzc2FnZSA9IFVzZXJXYXJuaW5nKCJkZWZhdWx0YWN0aW9uIHRlc3QiKQorICAgICAgICBvcmlnaW5hbCA9IHNlbGYubW9kdWxlLmRlZmF1bHRhY3Rpb24KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlPXNlbGYubW9kdWxlKSBhcyB3OgorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLnJlc2V0d2FybmluZ3MoKQorICAgICAgICAgICAgICAgIHJlZ2lzdHJ5ID0ge30KKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIFVzZXJXYXJuaW5nLCAiPHRlc3Q+IiwgNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5PXJlZ2lzdHJ5KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod1stMV0ubWVzc2FnZSwgbWVzc2FnZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZWdpc3RyeSksIDEpCisgICAgICAgICAgICAgICAgZGVsIHdbOl0KKyAgICAgICAgICAgICAgICAjIFRlc3QgcmVtb3ZhbC4KKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5tb2R1bGUuZGVmYXVsdGFjdGlvbgorICAgICAgICAgICAgICAgIF9fd2FybmluZ3JlZ2lzdHJ5X18gPSB7fQorICAgICAgICAgICAgICAgIHJlZ2lzdHJ5ID0ge30KKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIFVzZXJXYXJuaW5nLCAiPHRlc3Q+IiwgNDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJ5PXJlZ2lzdHJ5KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod1stMV0ubWVzc2FnZSwgbWVzc2FnZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZWdpc3RyeSksIDEpCisgICAgICAgICAgICAgICAgZGVsIHdbOl0KKyAgICAgICAgICAgICAgICAjIFRlc3Qgc2V0dGluZy4KKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5kZWZhdWx0YWN0aW9uID0gImlnbm9yZSIKKyAgICAgICAgICAgICAgICBfX3dhcm5pbmdyZWdpc3RyeV9fID0ge30KKyAgICAgICAgICAgICAgICByZWdpc3RyeSA9IHt9CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybl9leHBsaWNpdChtZXNzYWdlLCBVc2VyV2FybmluZywgIjx0ZXN0PiIsIDQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeT1yZWdpc3RyeSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmRlZmF1bHRhY3Rpb24gPSBvcmlnaW5hbAorCisgICAgZGVmIHRlc3Rfc2hvd3dhcm5pbmdfbWlzc2luZyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgc2hvd3dhcm5pbmcoKSBtaXNzaW5nIGlzIG9rYXkuCisgICAgICAgIHRleHQgPSAnZGVsIHNob3d3YXJuaW5nIHRlc3QnCisgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MobW9kdWxlPXNlbGYubW9kdWxlKToKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJhbHdheXMiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKKyAgICAgICAgICAgIGRlbCBzZWxmLm1vZHVsZS5zaG93d2FybmluZworICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCdzdGRlcnInKSBhcyBzdHJlYW06CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybih0ZXh0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cmVhbS5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odGV4dCwgcmVzdWx0KQorCisgICAgZGVmIHRlc3Rfc2hvd3dhcm5pbmdfbm90X2NhbGxhYmxlKHNlbGYpOgorICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSk6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiYWx3YXlzIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICBvbGRfc2hvd3dhcm5pbmcgPSBzZWxmLm1vZHVsZS5zaG93d2FybmluZworICAgICAgICAgICAgc2VsZi5tb2R1bGUuc2hvd3dhcm5pbmcgPSAyMworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tb2R1bGUud2FybiwgIldhcm5pbmchIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuc2hvd3dhcm5pbmcgPSBvbGRfc2hvd3dhcm5pbmcKKworICAgIGRlZiB0ZXN0X3Nob3dfd2FybmluZ19vdXRwdXQoc2VsZik6CisgICAgICAgICMgV2l0aCBzaG93YXJuaW5nKCkgbWlzc2luZywgbWFrZSBzdXJlIHRoYXQgb3V0cHV0IGlzIG9rYXkuCisgICAgICAgIHRleHQgPSAndGVzdCBzaG93X3dhcm5pbmcnCisgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MobW9kdWxlPXNlbGYubW9kdWxlKToKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJhbHdheXMiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKKyAgICAgICAgICAgIGRlbCBzZWxmLm1vZHVsZS5zaG93d2FybmluZworICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCdzdGRlcnInKSBhcyBzdHJlYW06CisgICAgICAgICAgICAgICAgd2FybmluZ190ZXN0cy5pbm5lcih0ZXh0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cmVhbS5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvdW50KCdcbicpLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG9vIG1hbnkgbmV3bGluZXMgaW4gJXIiICUgcmVzdWx0KQorICAgICAgICBmaXJzdF9saW5lLCBzZWNvbmRfbGluZSA9IHJlc3VsdC5zcGxpdCgnXG4nLCAxKQorICAgICAgICBleHBlY3RlZF9maWxlID0gb3MucGF0aC5zcGxpdGV4dCh3YXJuaW5nX3Rlc3RzLl9fZmlsZV9fKVswXSArICcucHknCisgICAgICAgIGZpcnN0X2xpbmVfcGFydHMgPSBmaXJzdF9saW5lLnJzcGxpdCgnOicsIDMpCisgICAgICAgIHBhdGgsIGxpbmUsIHdhcm5pbmdfY2xhc3MsIG1lc3NhZ2UgPSBmaXJzdF9saW5lX3BhcnRzCisgICAgICAgIGxpbmUgPSBpbnQobGluZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9maWxlLCBwYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdhcm5pbmdfY2xhc3MsICcgJyArIFVzZXJXYXJuaW5nLl9fbmFtZV9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsICcgJyArIHRleHQpCisgICAgICAgIGV4cGVjdGVkX2xpbmUgPSAnICAnICsgbGluZWNhY2hlLmdldGxpbmUocGF0aCwgbGluZSkuc3RyaXAoKSArICdcbicKKyAgICAgICAgYXNzZXJ0IGV4cGVjdGVkX2xpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWNvbmRfbGluZSwgZXhwZWN0ZWRfbGluZSkKKworICAgIGRlZiB0ZXN0X2ZpbGVuYW1lX25vbmUoc2VsZik6CisgICAgICAgICMgaXNzdWUgIzEyNDY3OiByYWNlIGNvbmRpdGlvbiBpZiBhIHdhcm5pbmcgaXMgZW1pdHRlZCBhdCBzaHV0ZG93bgorICAgICAgICBnbG9iYWxzX2RpY3QgPSBnbG9iYWxzKCkKKyAgICAgICAgb2xkZmlsZSA9IGdsb2JhbHNfZGljdFsnX19maWxlX18nXQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSkgYXMgdzoKKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiYWx3YXlzIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICAgICAgZ2xvYmFsc19kaWN0WydfX2ZpbGVfXyddID0gTm9uZQorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4oJ3Rlc3QnLCBVc2VyV2FybmluZykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGdsb2JhbHNfZGljdFsnX19maWxlX18nXSA9IG9sZGZpbGUKKworCitjbGFzcyBXYXJuaW5nc0Rpc3BsYXlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJUZXN0IHRoZSBkaXNwbGF5aW5nIG9mIHdhcm5pbmdzIGFuZCB0aGUgYWJpbGl0eSB0byBvdmVybG9hZCBmdW5jdGlvbnMKKyAgICByZWxhdGVkIHRvIGRpc3BsYXlpbmcgd2FybmluZ3MuIiIiCisKKyAgICBkZWYgdGVzdF9mb3JtYXR3YXJuaW5nKHNlbGYpOgorICAgICAgICBtZXNzYWdlID0gIm1zZyIKKyAgICAgICAgY2F0ZWdvcnkgPSBXYXJuaW5nCisgICAgICAgIGZpbGVfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQod2FybmluZ190ZXN0cy5fX2ZpbGVfXylbMF0gKyAnLnB5JworICAgICAgICBsaW5lX251bSA9IDMKKyAgICAgICAgZmlsZV9saW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZV9uYW1lLCBsaW5lX251bSkuc3RyaXAoKQorICAgICAgICBmb3JtYXQgPSAiJXM6JXM6ICVzOiAlc1xuICAlc1xuIgorICAgICAgICBleHBlY3QgPSBmb3JtYXQgJSAoZmlsZV9uYW1lLCBsaW5lX251bSwgY2F0ZWdvcnkuX19uYW1lX18sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9saW5lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgc2VsZi5tb2R1bGUuZm9ybWF0d2FybmluZyhtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnksIGZpbGVfbmFtZSwgbGluZV9udW0pKQorICAgICAgICAjIFRlc3QgdGhlICdsaW5lJyBhcmd1bWVudC4KKyAgICAgICAgZmlsZV9saW5lICs9ICIgZm9yIHRoZSB3aW4hIgorICAgICAgICBleHBlY3QgPSBmb3JtYXQgJSAoZmlsZV9uYW1lLCBsaW5lX251bSwgY2F0ZWdvcnkuX19uYW1lX18sIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9saW5lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgc2VsZi5tb2R1bGUuZm9ybWF0d2FybmluZyhtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnksIGZpbGVfbmFtZSwgbGluZV9udW0sIGZpbGVfbGluZSkpCisKKyAgICBkZWYgdGVzdF9zaG93d2FybmluZyhzZWxmKToKKyAgICAgICAgZmlsZV9uYW1lID0gb3MucGF0aC5zcGxpdGV4dCh3YXJuaW5nX3Rlc3RzLl9fZmlsZV9fKVswXSArICcucHknCisgICAgICAgIGxpbmVfbnVtID0gMworICAgICAgICBleHBlY3RlZF9maWxlX2xpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlX25hbWUsIGxpbmVfbnVtKS5zdHJpcCgpCisgICAgICAgIG1lc3NhZ2UgPSAnbXNnJworICAgICAgICBjYXRlZ29yeSA9IFdhcm5pbmcKKyAgICAgICAgZmlsZV9vYmplY3QgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGV4cGVjdCA9IHNlbGYubW9kdWxlLmZvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9udW0pCisgICAgICAgIHNlbGYubW9kdWxlLnNob3d3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlX25hbWUsIGxpbmVfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX29iamVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX29iamVjdC5nZXR2YWx1ZSgpLCBleHBlY3QpCisgICAgICAgICMgVGVzdCAnbGluZScgYXJndW1lbnQuCisgICAgICAgIGV4cGVjdGVkX2ZpbGVfbGluZSArPSAiZm9yIHRoZSB3aW4hIgorICAgICAgICBleHBlY3QgPSBzZWxmLm1vZHVsZS5mb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtLCBleHBlY3RlZF9maWxlX2xpbmUpCisgICAgICAgIGZpbGVfb2JqZWN0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBzZWxmLm1vZHVsZS5zaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZV9uYW1lLCBsaW5lX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9vYmplY3QsIGV4cGVjdGVkX2ZpbGVfbGluZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGZpbGVfb2JqZWN0LmdldHZhbHVlKCkpCisKK2NsYXNzIENXYXJuaW5nc0Rpc3BsYXlUZXN0cyhCYXNlVGVzdCwgV2FybmluZ3NEaXNwbGF5VGVzdHMpOgorICAgIG1vZHVsZSA9IGNfd2FybmluZ3MKKworY2xhc3MgUHlXYXJuaW5nc0Rpc3BsYXlUZXN0cyhCYXNlVGVzdCwgV2FybmluZ3NEaXNwbGF5VGVzdHMpOgorICAgIG1vZHVsZSA9IHB5X3dhcm5pbmdzCisKKworY2xhc3MgQ2F0Y2hXYXJuaW5nVGVzdHMoQmFzZVRlc3QpOgorCisgICAgIiIiVGVzdCBjYXRjaF93YXJuaW5ncygpLiIiIgorCisgICAgZGVmIHRlc3RfY2F0Y2hfd2FybmluZ3NfcmVzdG9yZShzZWxmKToKKyAgICAgICAgd21vZCA9IHNlbGYubW9kdWxlCisgICAgICAgIG9yaWdfZmlsdGVycyA9IHdtb2QuZmlsdGVycworICAgICAgICBvcmlnX3Nob3d3YXJuaW5nID0gd21vZC5zaG93d2FybmluZworICAgICAgICAjIEVuc3VyZSBib3RoIHNob3d3YXJuaW5nIGFuZCBmaWx0ZXJzIGFyZSByZXN0b3JlZCB3aGVuIHJlY29yZGluZworICAgICAgICB3aXRoIHdtb2QuY2F0Y2hfd2FybmluZ3MobW9kdWxlPXdtb2QsIHJlY29yZD1UcnVlKToKKyAgICAgICAgICAgIHdtb2QuZmlsdGVycyA9IHdtb2Quc2hvd3dhcm5pbmcgPSBvYmplY3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5maWx0ZXJzIGlzIG9yaWdfZmlsdGVycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2Quc2hvd3dhcm5pbmcgaXMgb3JpZ19zaG93d2FybmluZykKKyAgICAgICAgIyBTYW1lIHRlc3QsIGJ1dCB3aXRoIHJlY29yZGluZyBkaXNhYmxlZAorICAgICAgICB3aXRoIHdtb2QuY2F0Y2hfd2FybmluZ3MobW9kdWxlPXdtb2QsIHJlY29yZD1GYWxzZSk6CisgICAgICAgICAgICB3bW9kLmZpbHRlcnMgPSB3bW9kLnNob3d3YXJuaW5nID0gb2JqZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2QuZmlsdGVycyBpcyBvcmlnX2ZpbHRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCisKKyAgICBkZWYgdGVzdF9jYXRjaF93YXJuaW5nc19yZWNvcmRpbmcoc2VsZik6CisgICAgICAgIHdtb2QgPSBzZWxmLm1vZHVsZQorICAgICAgICAjIEVuc3VyZSB3YXJuaW5ncyBhcmUgcmVjb3JkZWQgd2hlbiByZXF1ZXN0ZWQKKyAgICAgICAgd2l0aCB3bW9kLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT13bW9kLCByZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodywgW10pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh3KSBpcyBsaXN0KQorICAgICAgICAgICAgd21vZC5zaW1wbGVmaWx0ZXIoImFsd2F5cyIpCisgICAgICAgICAgICB3bW9kLndhcm4oImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3Wy0xXS5tZXNzYWdlKSwgImZvbyIpCisgICAgICAgICAgICB3bW9kLndhcm4oImJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3Wy0xXS5tZXNzYWdlKSwgImJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3WzBdLm1lc3NhZ2UpLCAiZm9vIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHdbMV0ubWVzc2FnZSksICJiYXIiKQorICAgICAgICAgICAgZGVsIHdbOl0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodywgW10pCisgICAgICAgICMgRW5zdXJlIHdhcm5pbmdzIGFyZSBub3QgcmVjb3JkZWQgd2hlbiBub3QgcmVxdWVzdGVkCisgICAgICAgIG9yaWdfc2hvd3dhcm5pbmcgPSB3bW9kLnNob3d3YXJuaW5nCisgICAgICAgIHdpdGggd21vZC5jYXRjaF93YXJuaW5ncyhtb2R1bGU9d21vZCwgcmVjb3JkPUZhbHNlKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHcgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCisKKyAgICBkZWYgdGVzdF9jYXRjaF93YXJuaW5nc19yZWVudHJ5X2d1YXJkKHNlbGYpOgorICAgICAgICB3bW9kID0gc2VsZi5tb2R1bGUKKyAgICAgICAgIyBFbnN1cmUgY2F0Y2hfd2FybmluZ3MgaXMgcHJvdGVjdGVkIGFnYWluc3QgaW5jb3JyZWN0IHVzYWdlCisgICAgICAgIHggPSB3bW9kLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT13bW9kLCByZWNvcmQ9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB4Ll9fZXhpdF9fKQorICAgICAgICB3aXRoIHg6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHguX19lbnRlcl9fKQorICAgICAgICAjIFNhbWUgdGVzdCwgYnV0IHdpdGggcmVjb3JkaW5nIGRpc2FibGVkCisgICAgICAgIHggPSB3bW9kLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT13bW9kLCByZWNvcmQ9RmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgeC5fX2V4aXRfXykKKyAgICAgICAgd2l0aCB4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB4Ll9fZW50ZXJfXykKKworICAgIGRlZiB0ZXN0X2NhdGNoX3dhcm5pbmdzX2RlZmF1bHRzKHNlbGYpOgorICAgICAgICB3bW9kID0gc2VsZi5tb2R1bGUKKyAgICAgICAgb3JpZ19maWx0ZXJzID0gd21vZC5maWx0ZXJzCisgICAgICAgIG9yaWdfc2hvd3dhcm5pbmcgPSB3bW9kLnNob3d3YXJuaW5nCisgICAgICAgICMgRW5zdXJlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIG5vdCB0byByZWNvcmQgd2FybmluZ3MKKyAgICAgICAgd2l0aCB3bW9kLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT13bW9kKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHcgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5maWx0ZXJzIGlzIG5vdCBvcmlnX2ZpbHRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLmZpbHRlcnMgaXMgb3JpZ19maWx0ZXJzKQorICAgICAgICBpZiB3bW9kIGlzIHN5cy5tb2R1bGVzWyd3YXJuaW5ncyddOgorICAgICAgICAgICAgIyBFbnN1cmUgdGhlIGRlZmF1bHQgbW9kdWxlIGlzIHRoaXMgb25lCisgICAgICAgICAgICB3aXRoIHdtb2QuY2F0Y2hfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3IGlzIE5vbmUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2Quc2hvd3dhcm5pbmcgaXMgb3JpZ19zaG93d2FybmluZykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5maWx0ZXJzIGlzIG5vdCBvcmlnX2ZpbHRlcnMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5maWx0ZXJzIGlzIG9yaWdfZmlsdGVycykKKworICAgIGRlZiB0ZXN0X2NoZWNrX3dhcm5pbmdzKHNlbGYpOgorICAgICAgICAjIEV4cGxpY2l0IHRlc3RzIGZvciB0aGUgdGVzdF9zdXBwb3J0IGNvbnZlbmllbmNlIHdyYXBwZXIKKyAgICAgICAgd21vZCA9IHNlbGYubW9kdWxlCisgICAgICAgIGlmIHdtb2QgaXMgbm90IHN5cy5tb2R1bGVzWyd3YXJuaW5ncyddOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKHF1aWV0PUZhbHNlKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Lndhcm5pbmdzLCBbXSkKKyAgICAgICAgICAgIHdtb2Quc2ltcGxlZmlsdGVyKCJhbHdheXMiKQorICAgICAgICAgICAgd21vZC53YXJuKCJmb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIody5tZXNzYWdlKSwgImZvbyIpCisgICAgICAgICAgICB3bW9kLndhcm4oImJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3Lm1lc3NhZ2UpLCAiYmFyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHcud2FybmluZ3NbMF0ubWVzc2FnZSksICJmb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIody53YXJuaW5nc1sxXS5tZXNzYWdlKSwgImJhciIpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwody53YXJuaW5ncywgW10pCisKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgICMgZGVmYXVsdHMgdG8gcXVpZXQ9VHJ1ZSB3aXRob3V0IGFyZ3VtZW50CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnZm9vJywgVXNlcldhcm5pbmcpKToKKyAgICAgICAgICAgIHdtb2Qud2FybigiZm9vIikKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnJywgUnVudGltZVdhcm5pbmcpKToKKyAgICAgICAgICAgICAgICAjIGRlZmF1bHRzIHRvIHF1aWV0PUZhbHNlIHdpdGggYXJndW1lbnQKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCdmb28nLCBSdW50aW1lV2FybmluZykpOgorICAgICAgICAgICAgICAgIHdtb2Qud2FybigiZm9vIikKKworCitjbGFzcyBDQ2F0Y2hXYXJuaW5nVGVzdHMoQ2F0Y2hXYXJuaW5nVGVzdHMpOgorICAgIG1vZHVsZSA9IGNfd2FybmluZ3MKKworY2xhc3MgUHlDYXRjaFdhcm5pbmdUZXN0cyhDYXRjaFdhcm5pbmdUZXN0cyk6CisgICAgbW9kdWxlID0gcHlfd2FybmluZ3MKKworCitjbGFzcyBFbnZpcm9ubWVudFZhcmlhYmxlVGVzdHMoQmFzZVRlc3QpOgorCisgICAgZGVmIHRlc3Rfc2luZ2xlX3dhcm5pbmcoc2VsZik6CisgICAgICAgIG5ld2VudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIG5ld2VudlsiUFlUSE9OV0FSTklOR1MiXSA9ICJpZ25vcmU6OkRlcHJlY2F0aW9uV2FybmluZyIKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAorICAgICAgICAgICAgICAgICItYyIsICJpbXBvcnQgc3lzOyBzeXMuc3Rkb3V0LndyaXRlKHN0cihzeXMud2Fybm9wdGlvbnMpKSJdLAorICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIGVudj1uZXdlbnYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5jb21tdW5pY2F0ZSgpWzBdLCAiWydpZ25vcmU6OkRlcHJlY2F0aW9uV2FybmluZyddIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLndhaXQoKSwgMCkKKworICAgIGRlZiB0ZXN0X2NvbW1hX3NlcGFyYXRlZF93YXJuaW5ncyhzZWxmKToKKyAgICAgICAgbmV3ZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgbmV3ZW52WyJQWVRIT05XQVJOSU5HUyJdID0gKCJpZ25vcmU6OkRlcHJlY2F0aW9uV2FybmluZywiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlOjpVbmljb2RlV2FybmluZyIpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAiLWMiLCAiaW1wb3J0IHN5czsgc3lzLnN0ZG91dC53cml0ZShzdHIoc3lzLndhcm5vcHRpb25zKSkiXSwKKyAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBlbnY9bmV3ZW52KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuY29tbXVuaWNhdGUoKVswXSwKKyAgICAgICAgICAgICAgICAiWydpZ25vcmU6OkRlcHJlY2F0aW9uV2FybmluZycsICdpZ25vcmU6OlVuaWNvZGVXYXJuaW5nJ10iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAud2FpdCgpLCAwKQorCisgICAgZGVmIHRlc3RfZW52dmFyX2FuZF9jb21tYW5kX2xpbmUoc2VsZik6CisgICAgICAgIG5ld2VudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIG5ld2VudlsiUFlUSE9OV0FSTklOR1MiXSA9ICJpZ25vcmU6OkRlcHJlY2F0aW9uV2FybmluZyIKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLVciICJpZ25vcmU6OlVuaWNvZGVXYXJuaW5nIiwKKyAgICAgICAgICAgICAgICAiLWMiLCAiaW1wb3J0IHN5czsgc3lzLnN0ZG91dC53cml0ZShzdHIoc3lzLndhcm5vcHRpb25zKSkiXSwKKyAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBlbnY9bmV3ZW52KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuY29tbXVuaWNhdGUoKVswXSwKKyAgICAgICAgICAgICAgICAiWydpZ25vcmU6OlVuaWNvZGVXYXJuaW5nJywgJ2lnbm9yZTo6RGVwcmVjYXRpb25XYXJuaW5nJ10iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAud2FpdCgpLCAwKQorCitjbGFzcyBDRW52aXJvbm1lbnRWYXJpYWJsZVRlc3RzKEVudmlyb25tZW50VmFyaWFibGVUZXN0cyk6CisgICAgbW9kdWxlID0gY193YXJuaW5ncworCitjbGFzcyBQeUVudmlyb25tZW50VmFyaWFibGVUZXN0cyhFbnZpcm9ubWVudFZhcmlhYmxlVGVzdHMpOgorICAgIG1vZHVsZSA9IHB5X3dhcm5pbmdzCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHB5X3dhcm5pbmdzLm9uY2VyZWdpc3RyeS5jbGVhcigpCisgICAgY193YXJuaW5ncy5vbmNlcmVnaXN0cnkuY2xlYXIoKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ0ZpbHRlclRlc3RzLCBQeUZpbHRlclRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDV2FyblRlc3RzLCBQeVdhcm5UZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1dDbWRMaW5lVGVzdHMsIFB5V0NtZExpbmVUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1dhcm5pbmdzVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENXYXJuaW5nc0Rpc3BsYXlUZXN0cywgUHlXYXJuaW5nc0Rpc3BsYXlUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NhdGNoV2FybmluZ1Rlc3RzLCBQeUNhdGNoV2FybmluZ1Rlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRW52aXJvbm1lbnRWYXJpYWJsZVRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVudmlyb25tZW50VmFyaWFibGVUZXN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FybmluZ3MucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FybmluZ3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Y2I3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YXJuaW5ncy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FybmluZ3MucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FybmluZ3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Nzg5MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YXJuaW5ncy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2F2ZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhdmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmNWZhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhdmUucHkKQEAgLTAsMCArMSw0NSBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QKK2ltcG9ydCBvcworaW1wb3J0IHdhdmUKK2ltcG9ydCB1bml0dGVzdAorCituY2hhbm5lbHMgPSAyCitzYW1wd2lkdGggPSAyCitmcmFtZXJhdGUgPSA4MDAwCituZnJhbWVzID0gMTAwCisKK2NsYXNzIFRlc3RXYXZlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5mID0gTm9uZQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmUoVEVTVEZOKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2l0KHNlbGYpOgorICAgICAgICBzZWxmLmYgPSB3YXZlLm9wZW4oVEVTVEZOLCAnd2InKQorICAgICAgICBzZWxmLmYuc2V0bmNoYW5uZWxzKG5jaGFubmVscykKKyAgICAgICAgc2VsZi5mLnNldHNhbXB3aWR0aChzYW1wd2lkdGgpCisgICAgICAgIHNlbGYuZi5zZXRmcmFtZXJhdGUoZnJhbWVyYXRlKQorICAgICAgICBzZWxmLmYuc2V0bmZyYW1lcyhuZnJhbWVzKQorICAgICAgICBvdXRwdXQgPSAnXDAnICogbmZyYW1lcyAqIG5jaGFubmVscyAqIHNhbXB3aWR0aAorICAgICAgICBzZWxmLmYud3JpdGVmcmFtZXMob3V0cHV0KQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorCisgICAgICAgIHNlbGYuZiA9IHdhdmUub3BlbihURVNURk4sICdyYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmNoYW5uZWxzLCBzZWxmLmYuZ2V0bmNoYW5uZWxzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FtcHdpZHRoLCBzZWxmLmYuZ2V0c2FtcHdpZHRoKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnJhbWVyYXRlLCBzZWxmLmYuZ2V0ZnJhbWVyYXRlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmZyYW1lcywgc2VsZi5mLmdldG5mcmFtZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYucmVhZGZyYW1lcyhuZnJhbWVzKSwgb3V0cHV0KQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRlc3RXYXZlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YXZlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhdmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDk1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YXZlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YXZlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhdmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDk1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YXZlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrcmVmLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3JlZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDg2Y2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3JlZi5weQpAQCAtMCwwICsxLDEzOTUgQEAKK2ltcG9ydCBnYworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgVXNlckxpc3QKK2ltcG9ydCB3ZWFrcmVmCitpbXBvcnQgb3BlcmF0b3IKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBVc2VkIGluIFJlZmVyZW5jZXNUZXN0Q2FzZS50ZXN0X3JlZl9jcmVhdGVkX2R1cmluZ19kZWwoKSAuCityZWZfZnJvbV9kZWwgPSBOb25lCisKK2NsYXNzIEM6CisgICAgZGVmIG1ldGhvZChzZWxmKToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIENhbGxhYmxlOgorICAgIGJhciA9IE5vbmUKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCB4KToKKyAgICAgICAgc2VsZi5iYXIgPSB4CisKKworZGVmIGNyZWF0ZV9mdW5jdGlvbigpOgorICAgIGRlZiBmKCk6IHBhc3MKKyAgICByZXR1cm4gZgorCitkZWYgY3JlYXRlX2JvdW5kX21ldGhvZCgpOgorICAgIHJldHVybiBDKCkubWV0aG9kCisKK2RlZiBjcmVhdGVfdW5ib3VuZF9tZXRob2QoKToKKyAgICByZXR1cm4gQy5tZXRob2QKKworCitjbGFzcyBPYmplY3Q6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuYXJnID0gYXJnCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIjxPYmplY3QgJXI+IiAlIHNlbGYuYXJnCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE9iamVjdCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hcmcgPT0gb3RoZXIuYXJnCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBPYmplY3QpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXJnICE9IG90aGVyLmFyZworICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKHNlbGYuYXJnKQorCitjbGFzcyBSZWZDeWNsZToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY3ljbGUgPSBzZWxmCisKKworY2xhc3MgVGVzdEJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNiY2FsbGVkID0gMAorCisgICAgZGVmIGNhbGxiYWNrKHNlbGYsIHJlZik6CisgICAgICAgIHNlbGYuY2JjYWxsZWQgKz0gMQorCisKK2NsYXNzIFJlZmVyZW5jZXNUZXN0Q2FzZShUZXN0QmFzZSk6CisKKyAgICBkZWYgdGVzdF9iYXNpY19yZWYoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfYmFzaWNfcmVmKEMpCisgICAgICAgIHNlbGYuY2hlY2tfYmFzaWNfcmVmKGNyZWF0ZV9mdW5jdGlvbikKKyAgICAgICAgc2VsZi5jaGVja19iYXNpY19yZWYoY3JlYXRlX2JvdW5kX21ldGhvZCkKKyAgICAgICAgc2VsZi5jaGVja19iYXNpY19yZWYoY3JlYXRlX3VuYm91bmRfbWV0aG9kKQorCisgICAgICAgICMgSnVzdCBtYWtlIHN1cmUgdGhlIHRwX3JlcHIgaGFuZGxlciBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgIyBMaXZlIHJlZmVyZW5jZToKKyAgICAgICAgbyA9IEMoKQorICAgICAgICB3ciA9IHdlYWtyZWYucmVmKG8pCisgICAgICAgIHJlcHIod3IpCisgICAgICAgICMgRGVhZCByZWZlcmVuY2U6CisgICAgICAgIGRlbCBvCisgICAgICAgIHJlcHIod3IpCisKKyAgICBkZWYgdGVzdF9iYXNpY19jYWxsYmFjayhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19iYXNpY19jYWxsYmFjayhDKQorICAgICAgICBzZWxmLmNoZWNrX2Jhc2ljX2NhbGxiYWNrKGNyZWF0ZV9mdW5jdGlvbikKKyAgICAgICAgc2VsZi5jaGVja19iYXNpY19jYWxsYmFjayhjcmVhdGVfYm91bmRfbWV0aG9kKQorICAgICAgICBzZWxmLmNoZWNrX2Jhc2ljX2NhbGxiYWNrKGNyZWF0ZV91bmJvdW5kX21ldGhvZCkKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX2NhbGxiYWNrcyhzZWxmKToKKyAgICAgICAgbyA9IEMoKQorICAgICAgICByZWYxID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKKyAgICAgICAgcmVmMiA9IHdlYWtyZWYucmVmKG8sIHNlbGYuY2FsbGJhY2spCisgICAgICAgIGRlbCBvCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYxKCkgaXMgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCByZWZlcmVuY2UgdG8gYmUgaW52YWxpZGF0ZWQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmMigpIGlzIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgcmVmZXJlbmNlIHRvIGJlIGludmFsaWRhdGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY2JjYWxsZWQgPT0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayBub3QgY2FsbGVkIHRoZSByaWdodCBudW1iZXIgb2YgdGltZXMiKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfc2VsZnJlZl9jYWxsYmFja3Moc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGFsbCByZWZlcmVuY2VzIGFyZSBpbnZhbGlkYXRlZCBiZWZvcmUgY2FsbGJhY2tzIGFyZSBjYWxsZWQKKyAgICAgICAgIworICAgICAgICAjIFdoYXQncyBpbXBvcnRhbnQgaGVyZSBpcyB0aGF0IHdlJ3JlIHVzaW5nIHRoZSBmaXJzdAorICAgICAgICAjIHJlZmVyZW5jZSBpbiB0aGUgY2FsbGJhY2sgaW52b2tlZCBvbiB0aGUgc2Vjb25kIHJlZmVyZW5jZQorICAgICAgICAjICh0aGUgbW9zdCByZWNlbnRseSBjcmVhdGVkIHJlZiBpcyBjbGVhbmVkIHVwIGZpcnN0KS4gIFRoaXMKKyAgICAgICAgIyB0ZXN0cyB0aGF0IGFsbCByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3QgYXJlIGludmFsaWRhdGVkCisgICAgICAgICMgYmVmb3JlIGFueSBvZiB0aGUgY2FsbGJhY2tzIGFyZSBpbnZva2VkLCBzbyB0aGF0IHdlIG9ubHkKKyAgICAgICAgIyBoYXZlIG9uZSBpbnZvY2F0aW9uIG9mIF93ZWFrcmVmLmM6Y2xlYW51cF9oZWxwZXIoKSBhY3RpdmUKKyAgICAgICAgIyBmb3IgYSBwYXJ0aWN1bGFyIG9iamVjdCBhdCBhIHRpbWUuCisgICAgICAgICMKKyAgICAgICAgZGVmIGNhbGxiYWNrKG9iamVjdCwgc2VsZj1zZWxmKToKKyAgICAgICAgICAgIHNlbGYucmVmKCkKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBzZWxmLnJlZiA9IHdlYWtyZWYucmVmKGMsIGNhbGxiYWNrKQorICAgICAgICByZWYxID0gd2Vha3JlZi5yZWYoYywgY2FsbGJhY2spCisgICAgICAgIGRlbCBjCisKKyAgICBkZWYgdGVzdF9wcm94eV9yZWYoc2VsZik6CisgICAgICAgIG8gPSBDKCkKKyAgICAgICAgby5iYXIgPSAxCisgICAgICAgIHJlZjEgPSB3ZWFrcmVmLnByb3h5KG8sIHNlbGYuY2FsbGJhY2spCisgICAgICAgIHJlZjIgPSB3ZWFrcmVmLnByb3h5KG8sIHNlbGYuY2FsbGJhY2spCisgICAgICAgIGRlbCBvCisKKyAgICAgICAgZGVmIGNoZWNrKHByb3h5KToKKyAgICAgICAgICAgIHByb3h5LmJhcgorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHdlYWtyZWYuUmVmZXJlbmNlRXJyb3IsIGNoZWNrLCByZWYxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh3ZWFrcmVmLlJlZmVyZW5jZUVycm9yLCBjaGVjaywgcmVmMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMod2Vha3JlZi5SZWZlcmVuY2VFcnJvciwgYm9vbCwgd2Vha3JlZi5wcm94eShDKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5jYmNhbGxlZCA9PSAyKQorCisgICAgZGVmIGNoZWNrX2Jhc2ljX3JlZihzZWxmLCBmYWN0b3J5KToKKyAgICAgICAgbyA9IGZhY3RvcnkoKQorICAgICAgICByZWYgPSB3ZWFrcmVmLnJlZihvKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmKCkgaXMgbm90IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAid2VhayByZWZlcmVuY2UgdG8gbGl2ZSBvYmplY3Qgc2hvdWxkIGJlIGxpdmUiKQorICAgICAgICBvMiA9IHJlZigpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvIGlzIG8yLAorICAgICAgICAgICAgICAgICAgICAgIjxyZWY+KCkgc2hvdWxkIHJldHVybiBvcmlnaW5hbCBvYmplY3QgaWYgbGl2ZSIpCisKKyAgICBkZWYgY2hlY2tfYmFzaWNfY2FsbGJhY2soc2VsZiwgZmFjdG9yeSk6CisgICAgICAgIHNlbGYuY2JjYWxsZWQgPSAwCisgICAgICAgIG8gPSBmYWN0b3J5KCkKKyAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKKyAgICAgICAgZGVsIG8KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY2JjYWxsZWQgPT0gMSwKKyAgICAgICAgICAgICAgICAgICAgICJjYWxsYmFjayBkaWQgbm90IHByb3Blcmx5IHNldCAnY2JjYWxsZWQnIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZigpIGlzIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAicmVmMiBzaG91bGQgYmUgZGVhZCBhZnRlciBkZWxldGluZyBvYmplY3QgcmVmZXJlbmNlIikKKworICAgIGRlZiB0ZXN0X3JlZl9yZXVzZShzZWxmKToKKyAgICAgICAgbyA9IEMoKQorICAgICAgICByZWYxID0gd2Vha3JlZi5yZWYobykKKyAgICAgICAgIyBjcmVhdGUgYSBwcm94eSB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSdzIGFuIGludGVydmVuaW5nIGNyZWF0aW9uCisgICAgICAgICMgYmV0d2VlbiB0aGVzZSB0d287IGl0IHNob3VsZCBtYWtlIG5vIGRpZmZlcmVuY2UKKyAgICAgICAgcHJveHkgPSB3ZWFrcmVmLnByb3h5KG8pCisgICAgICAgIHJlZjIgPSB3ZWFrcmVmLnJlZihvKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmMSBpcyByZWYyLAorICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSBvYmplY3Qgdy9vdXQgY2FsbGJhY2sgc2hvdWxkIGJlIHJlLXVzZWQiKQorCisgICAgICAgIG8gPSBDKCkKKyAgICAgICAgcHJveHkgPSB3ZWFrcmVmLnByb3h5KG8pCisgICAgICAgIHJlZjEgPSB3ZWFrcmVmLnJlZihvKQorICAgICAgICByZWYyID0gd2Vha3JlZi5yZWYobykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZjEgaXMgcmVmMiwKKyAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2Ugb2JqZWN0IHcvb3V0IGNhbGxiYWNrIHNob3VsZCBiZSByZS11c2VkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDIsCisgICAgICAgICAgICAgICAgICAgICAid3Jvbmcgd2VhayByZWYgY291bnQgZm9yIG9iamVjdCIpCisgICAgICAgIGRlbCBwcm94eQorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMSwKKyAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB3ZWFrIHJlZiBjb3VudCBmb3Igb2JqZWN0IGFmdGVyIGRlbGV0aW5nIHByb3h5IikKKworICAgIGRlZiB0ZXN0X3Byb3h5X3JldXNlKHNlbGYpOgorICAgICAgICBvID0gQygpCisgICAgICAgIHByb3h5MSA9IHdlYWtyZWYucHJveHkobykKKyAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYobykKKyAgICAgICAgcHJveHkyID0gd2Vha3JlZi5wcm94eShvKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkxIGlzIHByb3h5MiwKKyAgICAgICAgICAgICAgICAgICAgICJwcm94eSBvYmplY3Qgdy9vdXQgY2FsbGJhY2sgc2hvdWxkIGhhdmUgYmVlbiByZS11c2VkIikKKworICAgIGRlZiB0ZXN0X2Jhc2ljX3Byb3h5KHNlbGYpOgorICAgICAgICBvID0gQygpCisgICAgICAgIHNlbGYuY2hlY2tfcHJveHkobywgd2Vha3JlZi5wcm94eShvKSkKKworICAgICAgICBMID0gVXNlckxpc3QuVXNlckxpc3QoKQorICAgICAgICBwID0gd2Vha3JlZi5wcm94eShMKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHAsICJwcm94eSBmb3IgZW1wdHkgVXNlckxpc3Qgc2hvdWxkIGJlIGZhbHNlIikKKyAgICAgICAgcC5hcHBlbmQoMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEwpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocCwgInByb3h5IGZvciBub24tZW1wdHkgVXNlckxpc3Qgc2hvdWxkIGJlIHRydWUiKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBwWzpdID0gWzIsIDNdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEwpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigzLCBwLCAicHJveHkgZGlkbid0IHN1cHBvcnQgX19jb250YWluc19fKCkgcHJvcGVybHkiKQorICAgICAgICBwWzFdID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExbMV0sIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFsxXSwgNSkKKyAgICAgICAgTDIgPSBVc2VyTGlzdC5Vc2VyTGlzdChMKQorICAgICAgICBwMiA9IHdlYWtyZWYucHJveHkoTDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgcDIpCisgICAgICAgICMjIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihMMiksIHJlcHIocDIpKQorICAgICAgICBMMyA9IFVzZXJMaXN0LlVzZXJMaXN0KHJhbmdlKDEwKSkKKyAgICAgICAgcDMgPSB3ZWFrcmVmLnByb3h5KEwzKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwzWzpdLCBwM1s6XSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTDNbNTpdLCBwM1s1Ol0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwzWzo1XSwgcDNbOjVdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMM1syOjVdLCBwM1syOjVdKQorCisgICAgZGVmIHRlc3RfcHJveHlfdW5pY29kZShzZWxmKToKKyAgICAgICAgIyBTZWUgYnVnIDUwMzcKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciCisgICAgICAgICAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUidW5pY29kZSIKKyAgICAgICAgaW5zdGFuY2UgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiX191bmljb2RlX18iLCBkaXIod2Vha3JlZi5wcm94eShpbnN0YW5jZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUod2Vha3JlZi5wcm94eShpbnN0YW5jZSkpLCB1InVuaWNvZGUiKQorCisgICAgZGVmIHRlc3RfcHJveHlfaW5kZXgoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAxMAorICAgICAgICBvID0gQygpCisgICAgICAgIHAgPSB3ZWFrcmVmLnByb3h5KG8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaW5kZXgocCksIDEwKQorCisgICAgZGVmIHRlc3RfcHJveHlfZGl2KHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgICAgICBkZWYgX19pZmxvb3JkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDIxCisgICAgICAgIG8gPSBDKCkKKyAgICAgICAgcCA9IHdlYWtyZWYucHJveHkobykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwIC8vIDUsIDQyKQorICAgICAgICBwIC8vPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgMjEpCisKKyAgICAjIFRoZSBQeVdlYWtyZWZfKiBDIEFQSSBpcyBkb2N1bWVudGVkIGFzIGFsbG93aW5nIGVpdGhlciBOVUxMIG9yCisgICAgIyBOb25lIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIGNhbGxiYWNrLCB3aGVyZSBlaXRoZXIgbWVhbnMgIm5vCisgICAgIyBjYWxsYmFjayIuICBUaGUgIm5vIGNhbGxiYWNrIiByZWYgYW5kIHByb3h5IG9iamVjdHMgYXJlIHN1cHBvc2VkCisgICAgIyB0byBiZSBzaGFyZWQgc28gbG9uZyBhcyB0aGV5IGV4aXN0IGJ5IGFsbCBjYWxsZXJzIHNvIGxvbmcgYXMKKyAgICAjIHRoZXkgYXJlIGFjdGl2ZS4gIEluIFB5dGhvbiAyLjMuMyBhbmQgZWFybGllciwgdGhpcyBndWFyYW50ZWUKKyAgICAjIHdhcyBub3QgaG9ub3JlZCwgYW5kIHdhcyBicm9rZW4gaW4gZGlmZmVyZW50IHdheXMgZm9yCisgICAgIyBQeVdlYWtyZWZfTmV3UmVmKCkgYW5kIFB5V2Vha3JlZl9OZXdQcm94eSgpLiAgKFR3byB0ZXN0cy4pCisKKyAgICBkZWYgdGVzdF9zaGFyZWRfcmVmX3dpdGhvdXRfY2FsbGJhY2soc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc2hhcmVkX3dpdGhvdXRfY2FsbGJhY2sod2Vha3JlZi5yZWYpCisKKyAgICBkZWYgdGVzdF9zaGFyZWRfcHJveHlfd2l0aG91dF9jYWxsYmFjayhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zaGFyZWRfd2l0aG91dF9jYWxsYmFjayh3ZWFrcmVmLnByb3h5KQorCisgICAgZGVmIGNoZWNrX3NoYXJlZF93aXRob3V0X2NhbGxiYWNrKHNlbGYsIG1ha2VyZWYpOgorICAgICAgICBvID0gT2JqZWN0KDEpCisgICAgICAgIHAxID0gbWFrZXJlZihvLCBOb25lKQorICAgICAgICBwMiA9IG1ha2VyZWYobywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAxIGlzIHAyLCAiYm90aCBjYWxsYmFja3Mgd2VyZSBOb25lIGluIHRoZSBDIEFQSSIpCisgICAgICAgIGRlbCBwMSwgcDIKKyAgICAgICAgcDEgPSBtYWtlcmVmKG8pCisgICAgICAgIHAyID0gbWFrZXJlZihvLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocDEgaXMgcDIsICJjYWxsYmFja3Mgd2VyZSBOVUxMLCBOb25lIGluIHRoZSBDIEFQSSIpCisgICAgICAgIGRlbCBwMSwgcDIKKyAgICAgICAgcDEgPSBtYWtlcmVmKG8pCisgICAgICAgIHAyID0gbWFrZXJlZihvKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocDEgaXMgcDIsICJib3RoIGNhbGxiYWNrcyB3ZXJlIE5VTEwgaW4gdGhlIEMgQVBJIikKKyAgICAgICAgZGVsIHAxLCBwMgorICAgICAgICBwMSA9IG1ha2VyZWYobywgTm9uZSkKKyAgICAgICAgcDIgPSBtYWtlcmVmKG8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwMSBpcyBwMiwgImNhbGxiYWNrcyB3ZXJlIE5vbmUsIE5VTEwgaW4gdGhlIEMgQVBJIikKKworICAgIGRlZiB0ZXN0X2NhbGxhYmxlX3Byb3h5KHNlbGYpOgorICAgICAgICBvID0gQ2FsbGFibGUoKQorICAgICAgICByZWYxID0gd2Vha3JlZi5wcm94eShvKQorCisgICAgICAgIHNlbGYuY2hlY2tfcHJveHkobywgcmVmMSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyZWYxKSBpcyB3ZWFrcmVmLkNhbGxhYmxlUHJveHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgInByb3h5IGlzIG5vdCBvZiBjYWxsYWJsZSB0eXBlIikKKyAgICAgICAgcmVmMSgndHdpbmtpZXMhJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG8uYmFyID09ICd0d2lua2llcyEnLAorICAgICAgICAgICAgICAgICAgICAgImNhbGwgdGhyb3VnaCBwcm94eSBub3QgcGFzc2VkIHRocm91Z2ggdG8gb3JpZ2luYWwiKQorICAgICAgICByZWYxKHg9J1NwbGF0LicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvLmJhciA9PSAnU3BsYXQuJywKKyAgICAgICAgICAgICAgICAgICAgICJjYWxsIHRocm91Z2ggcHJveHkgbm90IHBhc3NlZCB0aHJvdWdoIHRvIG9yaWdpbmFsIikKKworICAgICAgICAjIGV4cGVjdCBkdWUgdG8gdG9vIGZldyBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVmMSkKKworICAgICAgICAjIGV4cGVjdCBkdWUgdG8gdG9vIG1hbnkgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZjEsIDEsIDIsIDMpCisKKyAgICBkZWYgY2hlY2tfcHJveHkoc2VsZiwgbywgcHJveHkpOgorICAgICAgICBvLmZvbyA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LmZvbyA9PSAxLAorICAgICAgICAgICAgICAgICAgICAgInByb3h5IGRvZXMgbm90IHJlZmxlY3QgYXR0cmlidXRlIGFkZGl0aW9uIikKKyAgICAgICAgby5mb28gPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5mb28gPT0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJwcm94eSBkb2VzIG5vdCByZWZsZWN0IGF0dHJpYnV0ZSBtb2RpZmljYXRpb24iKQorICAgICAgICBkZWwgby5mb28KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKHByb3h5LCAnZm9vJyksCisgICAgICAgICAgICAgICAgICAgICAicHJveHkgZG9lcyBub3QgcmVmbGVjdCBhdHRyaWJ1dGUgcmVtb3ZhbCIpCisKKyAgICAgICAgcHJveHkuZm9vID0gMQorICAgICAgICBzZWxmLmFzc2VydFRydWUoby5mb28gPT0gMSwKKyAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgZG9lcyBub3QgcmVmbGVjdCBhdHRyaWJ1dGUgYWRkaXRpb24gdmlhIHByb3h5IikKKyAgICAgICAgcHJveHkuZm9vID0gMgorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBvLmZvbyA9PSAyLAorICAgICAgICAgICAgIm9iamVjdCBkb2VzIG5vdCByZWZsZWN0IGF0dHJpYnV0ZSBtb2RpZmljYXRpb24gdmlhIHByb3h5IikKKyAgICAgICAgZGVsIHByb3h5LmZvbworICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIobywgJ2ZvbycpLAorICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCBkb2VzIG5vdCByZWZsZWN0IGF0dHJpYnV0ZSByZW1vdmFsIHZpYSBwcm94eSIpCisKKyAgICBkZWYgdGVzdF9wcm94eV9kZWxldGlvbihzZWxmKToKKyAgICAgICAgIyBUZXN0IGNsZWFyaW5nIG9mIFNGIGJ1ZyAjNzYyODkxCisgICAgICAgIGNsYXNzIEZvbzoKKyAgICAgICAgICAgIHJlc3VsdCA9IE5vbmUKKyAgICAgICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBhY2Nlc3Nvcik6CisgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSBhY2Nlc3NvcgorICAgICAgICBnID0gRm9vKCkKKyAgICAgICAgZiA9IHdlYWtyZWYucHJveHkoZykKKyAgICAgICAgZGVsIGZbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlc3VsdCwgMCkKKworICAgIGRlZiB0ZXN0X3Byb3h5X2Jvb2woc2VsZik6CisgICAgICAgICMgVGVzdCBjbGVhcmluZyBvZiBTRiBidWcgIzExNzA3NjYKKyAgICAgICAgY2xhc3MgTGlzdChsaXN0KTogcGFzcworICAgICAgICBseXN0ID0gTGlzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm9vbCh3ZWFrcmVmLnByb3h5KGx5c3QpKSwgYm9vbChseXN0KSkKKworICAgIGRlZiB0ZXN0X2dldHdlYWtyZWZjb3VudChzZWxmKToKKyAgICAgICAgbyA9IEMoKQorICAgICAgICByZWYxID0gd2Vha3JlZi5yZWYobykKKyAgICAgICAgcmVmMiA9IHdlYWtyZWYucmVmKG8sIHNlbGYuY2FsbGJhY2spCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSAyLAorICAgICAgICAgICAgICAgICAgICAgImdvdCB3cm9uZyBudW1iZXIgb2Ygd2VhayByZWZlcmVuY2Ugb2JqZWN0cyIpCisKKyAgICAgICAgcHJveHkxID0gd2Vha3JlZi5wcm94eShvKQorICAgICAgICBwcm94eTIgPSB3ZWFrcmVmLnByb3h5KG8sIHNlbGYuY2FsbGJhY2spCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSA0LAorICAgICAgICAgICAgICAgICAgICAgImdvdCB3cm9uZyBudW1iZXIgb2Ygd2VhayByZWZlcmVuY2Ugb2JqZWN0cyIpCisKKyAgICAgICAgZGVsIHJlZjEsIHJlZjIsIHByb3h5MSwgcHJveHkyCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgIndlYWsgcmVmZXJlbmNlIG9iamVjdHMgbm90IHVubGlua2VkIGZyb20iCisgICAgICAgICAgICAgICAgICAgICAiIHJlZmVyZW50IHdoZW4gZGlzY2FyZGVkLiIpCisKKyAgICAgICAgIyBhc3N1bWVzIGludHMgZG8gbm90IHN1cHBvcnQgd2Vha3JlZnMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KDEpID09IDAsCisgICAgICAgICAgICAgICAgICAgICAiZ290IHdyb25nIG51bWJlciBvZiB3ZWFrIHJlZmVyZW5jZSBvYmplY3RzIGZvciBpbnQiKQorCisgICAgZGVmIHRlc3RfZ2V0d2Vha3JlZnMoc2VsZik6CisgICAgICAgIG8gPSBDKCkKKyAgICAgICAgcmVmMSA9IHdlYWtyZWYucmVmKG8sIHNlbGYuY2FsbGJhY2spCisgICAgICAgIHJlZjIgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQorICAgICAgICBkZWwgcmVmMQorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmcyhvKSA9PSBbcmVmMl0sCisgICAgICAgICAgICAgICAgICAgICAibGlzdCBvZiByZWZzIGRvZXMgbm90IG1hdGNoIikKKworICAgICAgICBvID0gQygpCisgICAgICAgIHJlZjEgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQorICAgICAgICByZWYyID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKKyAgICAgICAgZGVsIHJlZjIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZnMobykgPT0gW3JlZjFdLAorICAgICAgICAgICAgICAgICAgICAgImxpc3Qgb2YgcmVmcyBkb2VzIG5vdCBtYXRjaCIpCisKKyAgICAgICAgZGVsIHJlZjEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZnMobykgPT0gW10sCisgICAgICAgICAgICAgICAgICAgICAibGlzdCBvZiByZWZzIG5vdCBjbGVhcmVkIikKKworICAgICAgICAjIGFzc3VtZXMgaW50cyBkbyBub3Qgc3VwcG9ydCB3ZWFrcmVmcworICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmcygxKSA9PSBbXSwKKyAgICAgICAgICAgICAgICAgICAgICJsaXN0IG9mIHJlZnMgZG9lcyBub3QgbWF0Y2ggZm9yIGludCIpCisKKyAgICBkZWYgdGVzdF9uZXdzdHlsZV9udW1iZXJfb3BzKHNlbGYpOgorICAgICAgICBjbGFzcyBGKGZsb2F0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZiA9IEYoMi4wKQorICAgICAgICBwID0gd2Vha3JlZi5wcm94eShmKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocCArIDEuMCA9PSAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxLjAgKyBwID09IDMuMCkgICMgdGhpcyB1c2VkIHRvIFNFR1YKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrc19wcm90ZWN0ZWQoc2VsZik6CisgICAgICAgICMgQ2FsbGJhY2tzIHByb3RlY3RlZCBmcm9tIGFscmVhZHktc2V0IGV4Y2VwdGlvbnM/CisgICAgICAgICMgUmVncmVzc2lvbiB0ZXN0IGZvciBTRiBidWcgIzQ3ODUzNC4KKyAgICAgICAgY2xhc3MgQm9ndXNFcnJvcihFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkYXRhID0ge30KKyAgICAgICAgZGVmIHJlbW92ZShrKToKKyAgICAgICAgICAgIGRlbCBkYXRhW2tdCisgICAgICAgIGRlZiBlbmNhcHN1bGF0ZSgpOgorICAgICAgICAgICAgZiA9IGxhbWJkYSA6ICgpCisgICAgICAgICAgICBkYXRhW3dlYWtyZWYucmVmKGYsIHJlbW92ZSldID0gTm9uZQorICAgICAgICAgICAgcmFpc2UgQm9ndXNFcnJvcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBlbmNhcHN1bGF0ZSgpCisgICAgICAgIGV4Y2VwdCBCb2d1c0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleGNlcHRpb24gbm90IHByb3Blcmx5IHJlc3RvcmVkIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW5jYXBzdWxhdGUoKQorICAgICAgICBleGNlcHQgQm9ndXNFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhjZXB0aW9uIG5vdCBwcm9wZXJseSByZXN0b3JlZCIpCisKKyAgICBkZWYgdGVzdF9zZl9idWdfODQwODI5KHNlbGYpOgorICAgICAgICAjICJ3ZWFrcmVmIGNhbGxiYWNrcyBhbmQgZ2MgY29ycnVwdCBtZW1vcnkiCisgICAgICAgICMgc3VidHlwZV9kZWFsbG9jIGVycm9uZW91c2x5IGV4cG9zZWQgYSBuZXctc3R5bGUgaW5zdGFuY2UKKyAgICAgICAgIyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGdldHRpbmcgZGVhbGxvY2F0ZWQgdG8gZ2MsCisgICAgICAgICMgY2F1c2luZyBkb3VibGUtZGVhbGxvY2F0aW9uIGlmIHRoZSBpbnN0YW5jZSBoYWQgYSB3ZWFrcmVmCisgICAgICAgICMgY2FsbGJhY2sgdGhhdCB0cmlnZ2VyZWQgZ2MuCisgICAgICAgICMgSWYgdGhlIGJ1ZyBleGlzdHMsIHRoZXJlIHByb2JhYmx5IHdvbid0IGJlIGFuIG9idmlvdXMgc3ltcHRvbQorICAgICAgICAjIGluIGEgcmVsZWFzZSBidWlsZC4gIEluIGEgZGVidWcgYnVpbGQsIGEgc2VnZmF1bHQgd2lsbCBvY2N1cgorICAgICAgICAjIHdoZW4gdGhlIHNlY29uZCBhdHRlbXB0IHRvIHJlbW92ZSB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgImxpc3QKKyAgICAgICAgIyBvZiBhbGwgb2JqZWN0cyIgb2NjdXJzLgorCisgICAgICAgIGltcG9ydCBnYworCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjID0gQygpCisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoYywgbGFtYmRhIGlnbm9yZTogZ2MuY29sbGVjdCgpKQorICAgICAgICBkZWwgYworCisgICAgICAgICMgVGhlcmUgZW5kZXRoIHRoZSBmaXJzdCBwYXJ0LiAgSXQgZ2V0cyB3b3JzZS4KKyAgICAgICAgZGVsIHdyCisKKyAgICAgICAgYzEgPSBDKCkKKyAgICAgICAgYzEuaSA9IEMoKQorICAgICAgICB3ciA9IHdlYWtyZWYucmVmKGMxLmksIGxhbWJkYSBpZ25vcmU6IGdjLmNvbGxlY3QoKSkKKworICAgICAgICBjMiA9IEMoKQorICAgICAgICBjMi5jMSA9IGMxCisgICAgICAgIGRlbCBjMSAgIyBzdGlsbCBhbGl2ZSBiZWNhdXNlIGMyIHBvaW50cyB0byBpdAorCisgICAgICAgICMgTm93IHdoZW4gc3VidHlwZV9kZWFsbG9jIGdldHMgY2FsbGVkIG9uIGMyLCBpdCdzIG5vdCBlbm91Z2gganVzdAorICAgICAgICAjIHRoYXQgYzIgaXMgaW1tdW5lIGZyb20gZ2Mgd2hpbGUgdGhlIHdlYWtyZWYgY2FsbGJhY2tzIGFzc29jaWF0ZWQKKyAgICAgICAgIyB3aXRoIGMyIGV4ZWN1dGUgKHRoZXJlIGFyZSBub25lIGluIHRoaXMgMm5kIGhhbGYgb2YgdGhlIHRlc3QsIGJ0dykuCisgICAgICAgICMgc3VidHlwZV9kZWFsbG9jIGdvZXMgb24gdG8gY2FsbCB0aGUgYmFzZSBjbGFzc2VzJyBkZWFsbG9jcyB0b28sCisgICAgICAgICMgc28gYW55IGdjIHRyaWdnZXJlZCBieSB3ZWFrcmVmIGNhbGxiYWNrcyBhc3NvY2lhdGVkIHdpdGggYW55dGhpbmcKKyAgICAgICAgIyB0b3JuIGRvd24gYnkgYSBiYXNlIGNsYXNzIGRlYWxsb2MgY2FuIGFsc28gdHJpZ2dlciBkb3VibGUKKyAgICAgICAgIyBkZWFsbG9jYXRpb24gb2YgYzIuCisgICAgICAgIGRlbCBjMgorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfaW5fY3ljbGVfMShzZWxmKToKKyAgICAgICAgaW1wb3J0IGdjCisKKyAgICAgICAgY2xhc3MgSihvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIElJKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgYWNhbGxiYWNrKHNlbGYsIGlnbm9yZSk6CisgICAgICAgICAgICAgICAgc2VsZi5KCisKKyAgICAgICAgSSA9IElJKCkKKyAgICAgICAgSS5KID0gSgorICAgICAgICBJLndyID0gd2Vha3JlZi5yZWYoSiwgSS5hY2FsbGJhY2spCisKKyAgICAgICAgIyBOb3cgSiBhbmQgSUkgYXJlIGVhY2ggaW4gYSBzZWxmLWN5Y2xlIChhcyBhbGwgbmV3LXN0eWxlIGNsYXNzCisgICAgICAgICMgb2JqZWN0cyBhcmUsIHNpbmNlIHRoZWlyIF9fbXJvX18gcG9pbnRzIGJhY2sgdG8gdGhlbSkuICBJIGhvbGRzCisgICAgICAgICMgYm90aCBhIHdlYWsgcmVmZXJlbmNlIChJLndyKSBhbmQgYSBzdHJvbmcgcmVmZXJlbmNlIChJLkopIHRvIGNsYXNzCisgICAgICAgICMgSi4gIEkgaXMgYWxzbyBpbiBhIGN5Y2xlIChJLndyIHBvaW50cyB0byBhIHdlYWtyZWYgdGhhdCByZWZlcmVuY2VzCisgICAgICAgICMgSS5hY2FsbGJhY2spLiAgV2hlbiB3ZSBkZWwgdGhlc2UgdGhyZWUsIHRoZXkgYWxsIGJlY29tZSB0cmFzaCwgYnV0CisgICAgICAgICMgdGhlIGN5Y2xlcyBwcmV2ZW50IGFueSBvZiB0aGVtIGZyb20gZ2V0dGluZyBjbGVhbmVkIHVwIGltbWVkaWF0ZWx5LgorICAgICAgICAjIEluc3RlYWQgdGhleSBoYXZlIHRvIHdhaXQgZm9yIGN5Y2xpYyBnYyB0byBkZWR1Y2UgdGhhdCB0aGV5J3JlCisgICAgICAgICMgdHJhc2guCisgICAgICAgICMKKyAgICAgICAgIyBnYyB1c2VkIHRvIGNhbGwgdHBfY2xlYXIgb24gYWxsIG9mIHRoZW0sIGFuZCB0aGUgb3JkZXIgaW4gd2hpY2gKKyAgICAgICAgIyBpdCBkb2VzIHRoYXQgaXMgcHJldHR5IGFjY2lkZW50YWwuICBUaGUgZXhhY3Qgb3JkZXIgaW4gd2hpY2ggd2UKKyAgICAgICAgIyBidWlsdCB1cCB0aGVzZSB0aGluZ3MgbWFuYWdlcyB0byBwcm92b2tlIGdjIGludG8gcnVubmluZyB0cF9jbGVhcgorICAgICAgICAjIGluIGp1c3QgdGhlIHJpZ2h0IG9yZGVyIChJIGxhc3QpLiAgQ2FsbGluZyB0cF9jbGVhciBvbiBJSSBsZWF2ZXMKKyAgICAgICAgIyBiZWhpbmQgYW4gaW5zYW5lIGNsYXNzIG9iamVjdCAoaXRzIF9fbXJvX18gYmVjb21lcyBOVUxMKS4gIENhbGxpbmcKKyAgICAgICAgIyB0cF9jbGVhciBvbiBKIGJyZWFrcyBpdHMgc2VsZi1jeWNsZSwgYnV0IEogZG9lc24ndCBnZXQgZGVsZXRlZAorICAgICAgICAjIGp1c3QgdGhlbiBiZWNhdXNlIG9mIHRoZSBzdHJvbmcgcmVmZXJlbmNlIGZyb20gSS5KLiAgQ2FsbGluZworICAgICAgICAjIHRwX2NsZWFyIG9uIEkgc3RhcnRzIHRvIGNsZWFyIEkncyBfX2RpY3RfXywgYW5kIGp1c3QgaGFwcGVucyB0bworICAgICAgICAjIGNsZWFyIEkuSiBmaXJzdCAtLSBJLndyIGlzIHN0aWxsIGludGFjdC4gIFRoYXQgcmVtb3ZlcyB0aGUgbGFzdAorICAgICAgICAjIHJlZmVyZW5jZSB0byBKLCB3aGljaCB0cmlnZ2VycyB0aGUgd2Vha3JlZiBjYWxsYmFjay4gIFRoZSBjYWxsYmFjaworICAgICAgICAjIHRyaWVzIHRvIGRvICJzZWxmLkoiLCBhbmQgaW5zdGFuY2VzIG9mIG5ldy1zdHlsZSBjbGFzc2VzIGxvb2sgdXAKKyAgICAgICAgIyBhdHRyaWJ1dGVzICgiSiIpIGluIHRoZSBjbGFzcyBkaWN0IGZpcnN0LiAgVGhlIGNsYXNzIChJSSkgd2FudHMgdG8KKyAgICAgICAgIyBzZWFyY2ggSUkuX19tcm9fXywgYnV0IHRoYXQncyBOVUxMLiAgIFRoZSByZXN1bHQgd2FzIGEgc2VnZmF1bHQgaW4KKyAgICAgICAgIyBhIHJlbGVhc2UgYnVpbGQsIGFuZCBhbiBhc3NlcnQgZmFpbHVyZSBpbiBhIGRlYnVnIGJ1aWxkLgorICAgICAgICBkZWwgSSwgSiwgSUkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19pbl9jeWNsZV8yKHNlbGYpOgorICAgICAgICBpbXBvcnQgZ2MKKworICAgICAgICAjIFRoaXMgaXMganVzdCBsaWtlIHRlc3RfY2FsbGJhY2tfaW5fY3ljbGVfMSwgZXhjZXB0IHRoYXQgSUkgaXMgYW4KKyAgICAgICAgIyBvbGQtc3R5bGUgY2xhc3MuICBUaGUgc3ltcHRvbSBpcyBkaWZmZXJlbnQgdGhlbjogIGFuIGluc3RhbmNlIG9mIGFuCisgICAgICAgICMgb2xkLXN0eWxlIGNsYXNzIGxvb2tzIGluIGl0cyBvd24gX19kaWN0X18gZmlyc3QuICAnSicgaGFwcGVucyB0bworICAgICAgICAjIGdldCBjbGVhcmVkIGZyb20gSS5fX2RpY3RfXyBiZWZvcmUgJ3dyJywgYW5kICdKJyB3YXMgbmV2ZXIgaW4gSUkncworICAgICAgICAjIF9fZGljdF9fLCBzbyB0aGUgYXR0cmlidXRlIGlzbid0IGZvdW5kLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdAorICAgICAgICAjIHRoZSBvbGQtc3R5bGUgSUkgZG9lc24ndCBoYXZlIGEgTlVMTCBfX21yb19fIChpdCBkb2Vzbid0IGhhdmUgYW55CisgICAgICAgICMgX19tcm9fXyksIHNvIG5vIHNlZ2ZhdWx0IG9jY3Vycy4gIEluc3RlYWQgaXQgZ290OgorICAgICAgICAjICAgIHRlc3RfY2FsbGJhY2tfaW5fY3ljbGVfMiAoX19tYWluX18uUmVmZXJlbmNlc1Rlc3RDYXNlKSAuLi4KKyAgICAgICAgIyAgICBFeGNlcHRpb24gZXhjZXB0aW9ucy5BdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgIyAgICJJSSBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICdKJyIgaW4gPGJvdW5kIG1ldGhvZCBJSS5hY2FsbGJhY2sKKyAgICAgICAgIyAgICAgICBvZiA8Py5JSSBpbnN0YW5jZSBhdCAweDAwQjlCNEI4Pj4gaWdub3JlZAorCisgICAgICAgIGNsYXNzIEoob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBJSToKKyAgICAgICAgICAgIGRlZiBhY2FsbGJhY2soc2VsZiwgaWdub3JlKToKKyAgICAgICAgICAgICAgICBzZWxmLkoKKworICAgICAgICBJID0gSUkoKQorICAgICAgICBJLkogPSBKCisgICAgICAgIEkud3IgPSB3ZWFrcmVmLnJlZihKLCBJLmFjYWxsYmFjaykKKworICAgICAgICBkZWwgSSwgSiwgSUkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19pbl9jeWNsZV8zKHNlbGYpOgorICAgICAgICBpbXBvcnQgZ2MKKworICAgICAgICAjIFRoaXMgb25lIGJyb2tlIHRoZSBmaXJzdCBwYXRjaCB0aGF0IGZpeGVkIHRoZSBsYXN0IHR3by4gIEluIHRoaXMKKyAgICAgICAgIyBjYXNlLCB0aGUgb2JqZWN0cyByZWFjaGFibGUgZnJvbSB0aGUgY2FsbGJhY2sgYXJlbid0IGFsc28gcmVhY2hhYmxlCisgICAgICAgICMgZnJvbSB0aGUgb2JqZWN0IChjMSkgKnRyaWdnZXJpbmcqIHRoZSBjYWxsYmFjazogIHlvdSBjYW4gZ2V0IHRvCisgICAgICAgICMgYzEgZnJvbSBjMiwgYnV0IG5vdCB2aWNlLXZlcnNhLiAgVGhlIHJlc3VsdCB3YXMgdGhhdCBjMidzIF9fZGljdF9fCisgICAgICAgICMgZ290IHRwX2NsZWFyJ2VkIGJ5IHRoZSB0aW1lIHRoZSBjMi5jYiBjYWxsYmFjayBnb3QgaW52b2tlZC4KKworICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIGNiKHNlbGYsIGlnbm9yZSk6CisgICAgICAgICAgICAgICAgc2VsZi5tZQorICAgICAgICAgICAgICAgIHNlbGYuYzEKKyAgICAgICAgICAgICAgICBzZWxmLndyCisKKyAgICAgICAgYzEsIGMyID0gQygpLCBDKCkKKworICAgICAgICBjMi5tZSA9IGMyCisgICAgICAgIGMyLmMxID0gYzEKKyAgICAgICAgYzIud3IgPSB3ZWFrcmVmLnJlZihjMSwgYzIuY2IpCisKKyAgICAgICAgZGVsIGMxLCBjMgorICAgICAgICBnYy5jb2xsZWN0KCkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX2luX2N5Y2xlXzQoc2VsZik6CisgICAgICAgIGltcG9ydCBnYworCisgICAgICAgICMgTGlrZSB0ZXN0X2NhbGxiYWNrX2luX2N5Y2xlXzMsIGV4Y2VwdCBjMiBhbmQgYzEgaGF2ZSBkaWZmZXJlbnQKKyAgICAgICAgIyBjbGFzc2VzLiAgYzIncyBjbGFzcyAoQykgaXNuJ3QgcmVhY2hhYmxlIGZyb20gYzEgdGhlbiwgc28gcHJvdGVjdGluZworICAgICAgICAjIG9iamVjdHMgcmVhY2hhYmxlIGZyb20gdGhlIGR5aW5nIG9iamVjdCAoYzEpIGlzbid0IGVub3VnaCB0byBzdG9wCisgICAgICAgICMgYzIncyBjbGFzcyAoQykgZnJvbSBnZXR0aW5nIHRwX2NsZWFyJ2VkIGJlZm9yZSBjMi5jYiBpcyBpbnZva2VkLgorICAgICAgICAjIFRoZSByZXN1bHQgd2FzIGEgc2VnZmF1bHQgKEMuX19tcm9fXyB3YXMgTlVMTCB3aGVuIHRoZSBjYWxsYmFjaworICAgICAgICAjIHRyaWVkIHRvIGxvb2sgdXAgc2VsZi5tZSkuCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGNiKHNlbGYsIGlnbm9yZSk6CisgICAgICAgICAgICAgICAgc2VsZi5tZQorICAgICAgICAgICAgICAgIHNlbGYuYzEKKyAgICAgICAgICAgICAgICBzZWxmLndyCisKKyAgICAgICAgY2xhc3MgRDoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjMSwgYzIgPSBEKCksIEMoKQorCisgICAgICAgIGMyLm1lID0gYzIKKyAgICAgICAgYzIuYzEgPSBjMQorICAgICAgICBjMi53ciA9IHdlYWtyZWYucmVmKGMxLCBjMi5jYikKKworICAgICAgICBkZWwgYzEsIGMyLCBDLCBECisgICAgICAgIGdjLmNvbGxlY3QoKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfaW5fY3ljbGVfcmVzdXJyZWN0aW9uKHNlbGYpOgorICAgICAgICBpbXBvcnQgZ2MKKworICAgICAgICAjIERvIHNvbWV0aGluZyBuYXN0eSBpbiBhIHdlYWtyZWYgY2FsbGJhY2s6ICByZXN1cnJlY3Qgb2JqZWN0cworICAgICAgICAjIGZyb20gZGVhZCBjeWNsZXMuICBGb3IgdGhpcyB0byBiZSBhdHRlbXB0ZWQsIHRoZSB3ZWFrcmVmIGFuZAorICAgICAgICAjIGl0cyBjYWxsYmFjayBtdXN0IGFsc28gYmUgcGFydCBvZiB0aGUgY3ljbGljIHRyYXNoIChlbHNlIHRoZQorICAgICAgICAjIG9iamVjdHMgcmVhY2hhYmxlIHZpYSB0aGUgY2FsbGJhY2sgY291bGRuJ3QgYmUgaW4gY3ljbGljIHRyYXNoCisgICAgICAgICMgdG8gYmVnaW4gd2l0aCAtLSB0aGUgY2FsbGJhY2sgd291bGQgYWN0IGxpa2UgYW4gZXh0ZXJuYWwgcm9vdCkuCisgICAgICAgICMgQnV0IGdjIGNsZWFycyB0cmFzaCB3ZWFrcmVmcyB3aXRoIGNhbGxiYWNrcyBlYXJseSBub3csIHdoaWNoCisgICAgICAgICMgZGlzYWJsZXMgdGhlIGNhbGxiYWNrcywgc28gdGhlIGNhbGxiYWNrcyBzaG91bGRuJ3QgZ2V0IGNhbGxlZAorICAgICAgICAjIGF0IGFsbCAoYW5kIHNvIG5vdGhpbmcgYWN0dWFsbHkgZ2V0cyByZXN1cnJlY3RlZCkuCisKKyAgICAgICAgYWxpc3QgPSBbXQorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXR0cmlidXRlID0gdmFsdWUKKworICAgICAgICAgICAgZGVmIGFjYWxsYmFjayhzZWxmLCBpZ25vcmUpOgorICAgICAgICAgICAgICAgIGFsaXN0LmFwcGVuZChzZWxmLmMpCisKKyAgICAgICAgYzEsIGMyID0gQygxKSwgQygyKQorICAgICAgICBjMS5jID0gYzIKKyAgICAgICAgYzIuYyA9IGMxCisgICAgICAgIGMxLndyID0gd2Vha3JlZi5yZWYoYzIsIGMxLmFjYWxsYmFjaykKKyAgICAgICAgYzIud3IgPSB3ZWFrcmVmLnJlZihjMSwgYzIuYWNhbGxiYWNrKQorCisgICAgICAgIGRlZiBDX3dlbnRfYXdheShpZ25vcmUpOgorICAgICAgICAgICAgYWxpc3QuYXBwZW5kKCJDIHdlbnQgYXdheSIpCisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoQywgQ193ZW50X2F3YXkpCisKKyAgICAgICAgZGVsIGMxLCBjMiwgQyAgICMgbWFrZSB0aGVtIGFsbCB0cmFzaAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaXN0LCBbXSkgICMgZGVsIGlzbid0IGVub3VnaCB0byByZWNsYWltIGFueXRoaW5nCisKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICMgYzEud3IgYW5kIGMyLndyIHdlcmUgcGFydCBvZiB0aGUgY3ljbGljIHRyYXNoLCBzbyBzaG91bGQgaGF2ZQorICAgICAgICAjIGJlZW4gY2xlYXJlZCB3aXRob3V0IHRoZWlyIGNhbGxiYWNrcyBleGVjdXRpbmcuICBPVE9ILCB0aGUgd2Vha3JlZgorICAgICAgICAjIHRvIEMgaXMgYm91bmQgdG8gYSBmdW5jdGlvbiBsb2NhbCAod3IpLCBhbmQgd2Fzbid0IHRyYXNoLCBzbyB0aGF0CisgICAgICAgICMgY2FsbGJhY2sgc2hvdWxkIGhhdmUgYmVlbiBpbnZva2VkIHdoZW4gQyB3ZW50IGF3YXkuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxpc3QsIFsiQyB3ZW50IGF3YXkiXSkKKyAgICAgICAgIyBUaGUgcmVtYWluaW5nIHdlYWtyZWYgc2hvdWxkIGJlIGRlYWQgbm93IChpdHMgY2FsbGJhY2sgcmFuKS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cigpLCBOb25lKQorCisgICAgICAgIGRlbCBhbGlzdFs6XQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlzdCwgW10pCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja3Nfb25fY2FsbGJhY2soc2VsZik6CisgICAgICAgIGltcG9ydCBnYworCisgICAgICAgICMgU2V0IHVwIHdlYWtyZWYgY2FsbGJhY2tzICpvbiogd2Vha3JlZiBjYWxsYmFja3MuCisgICAgICAgIGFsaXN0ID0gW10KKyAgICAgICAgZGVmIHNhZmVfY2FsbGJhY2soaWdub3JlKToKKyAgICAgICAgICAgIGFsaXN0LmFwcGVuZCgic2FmZV9jYWxsYmFjayBjYWxsZWQiKQorCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBjYihzZWxmLCBpZ25vcmUpOgorICAgICAgICAgICAgICAgIGFsaXN0LmFwcGVuZCgiY2IgY2FsbGVkIikKKworICAgICAgICBjLCBkID0gQygpLCBDKCkKKyAgICAgICAgYy5vdGhlciA9IGQKKyAgICAgICAgZC5vdGhlciA9IGMKKyAgICAgICAgY2FsbGJhY2sgPSBjLmNiCisgICAgICAgIGMud3IgPSB3ZWFrcmVmLnJlZihkLCBjYWxsYmFjaykgICAgICMgdGhpcyB3b24ndCB0cmlnZ2VyCisgICAgICAgIGQud3IgPSB3ZWFrcmVmLnJlZihjYWxsYmFjaywgZC5jYikgICMgZGl0dG8KKyAgICAgICAgZXh0ZXJuYWxfd3IgPSB3ZWFrcmVmLnJlZihjYWxsYmFjaywgc2FmZV9jYWxsYmFjaykgICMgYnV0IHRoaXMgd2lsbAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXh0ZXJuYWxfd3IoKSBpcyBjYWxsYmFjaykKKworICAgICAgICAjIFRoZSB3ZWFrcmVmcyBhdHRhY2hlZCB0byBjIGFuZCBkIHNob3VsZCBnZXQgY2xlYXJlZCwgc28gdGhhdAorICAgICAgICAjIEMuY2IgaXMgbmV2ZXIgY2FsbGVkLiAgQnV0IGV4dGVybmFsX3dyIGlzbid0IHBhcnQgb2YgdGhlIGN5Y2xpYworICAgICAgICAjIHRyYXNoLCBhbmQgbm8gY3ljbGljIHRyYXNoIGlzIHJlYWNoYWJsZSBmcm9tIGl0LCBzbyBzYWZlX2NhbGxiYWNrCisgICAgICAgICMgc2hvdWxkIGdldCBpbnZva2VkIHdoZW4gdGhlIGJvdW5kIG1ldGhvZCBvYmplY3QgY2FsbGJhY2sgKGMuY2IpCisgICAgICAgICMgLS0gd2hpY2ggaXMgaXRzZWxmIGEgY2FsbGJhY2ssIGFuZCBhbHNvIHBhcnQgb2YgdGhlIGN5Y2xpYyB0cmFzaCAtLQorICAgICAgICAjIGdldHMgcmVjbGFpbWVkIGF0IHRoZSBlbmQgb2YgZ2MuCisKKyAgICAgICAgZGVsIGNhbGxiYWNrLCBjLCBkLCBDCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxpc3QsIFtdKSAgIyBkZWwgaXNuJ3QgZW5vdWdoIHRvIGNsZWFuIHVwIGN5Y2xlcworICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlzdCwgWyJzYWZlX2NhbGxiYWNrIGNhbGxlZCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4dGVybmFsX3dyKCksIE5vbmUpCisKKyAgICAgICAgZGVsIGFsaXN0WzpdCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaXN0LCBbXSkKKworICAgIGRlZiB0ZXN0X2djX2R1cmluZ19yZWZfY3JlYXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfZ2NfZHVyaW5nX2NyZWF0aW9uKHdlYWtyZWYucmVmKQorCisgICAgZGVmIHRlc3RfZ2NfZHVyaW5nX3Byb3h5X2NyZWF0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2djX2R1cmluZ19jcmVhdGlvbih3ZWFrcmVmLnByb3h5KQorCisgICAgZGVmIGNoZWNrX2djX2R1cmluZ19jcmVhdGlvbihzZWxmLCBtYWtlcmVmKToKKyAgICAgICAgdGhyZXNob2xkcyA9IGdjLmdldF90aHJlc2hvbGQoKQorICAgICAgICBnYy5zZXRfdGhyZXNob2xkKDEsIDEsIDEpCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBjYWxsYmFjaygqYXJncyk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmVmZXJlbmNlZCA9IEEoKQorCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgYS5hID0gYQorICAgICAgICBhLndyID0gbWFrZXJlZihyZWZlcmVuY2VkKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgbm93IG1ha2Ugc3VyZSB0aGUgb2JqZWN0IGFuZCB0aGUgcmVmIGdldCBsYWJlbGVkIGFzCisgICAgICAgICAgICAjIGN5Y2xpYyB0cmFzaDoKKyAgICAgICAgICAgIGEgPSBBKCkKKyAgICAgICAgICAgIHdlYWtyZWYucmVmKHJlZmVyZW5jZWQsIGNhbGxiYWNrKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBnYy5zZXRfdGhyZXNob2xkKCp0aHJlc2hvbGRzKQorCisgICAgZGVmIHRlc3RfcmVmX2NyZWF0ZWRfZHVyaW5nX2RlbChzZWxmKToKKyAgICAgICAgIyBCdWcgIzEzNzc4NTgKKyAgICAgICAgIyBBIHdlYWtyZWYgY3JlYXRlZCBpbiBhbiBvYmplY3QncyBfX2RlbF9fKCkgd291bGQgY3Jhc2ggdGhlCisgICAgICAgICMgaW50ZXJwcmV0ZXIgd2hlbiB0aGUgd2Vha3JlZiB3YXMgY2xlYW5lZCB1cCBzaW5jZSBpdCB3b3VsZCByZWZlciB0bworICAgICAgICAjIG5vbi1leGlzdGVudCBtZW1vcnkuICBUaGlzIHRlc3Qgc2hvdWxkIG5vdCBzZWdmYXVsdCB0aGUgaW50ZXJwcmV0ZXIuCisgICAgICAgIGNsYXNzIFRhcmdldChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgZ2xvYmFsIHJlZl9mcm9tX2RlbAorICAgICAgICAgICAgICAgIHJlZl9mcm9tX2RlbCA9IHdlYWtyZWYucmVmKHNlbGYpCisKKyAgICAgICAgdyA9IFRhcmdldCgpCisKKyAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgICAgICAjIElzc3VlIDM2MzQKKyAgICAgICAgIyA8d2Vha3JlZiB0byBjbGFzcz4uX19pbml0X18oKSBkb2Vzbid0IGNoZWNrIGVycm9ycyBjb3JyZWN0bHkKKyAgICAgICAgciA9IHdlYWtyZWYucmVmKEV4Y2VwdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByLl9faW5pdF9fLCAwLCAwLCAwLCAwLCAwKQorICAgICAgICAjIE5vIGV4Y2VwdGlvbiBzaG91bGQgYmUgcmFpc2VkIGhlcmUKKyAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICBkZWYgdGVzdF9jbGFzc2VzKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgYm90aCBvbGQtc3R5bGUgY2xhc3NlcyBhbmQgbmV3LXN0eWxlIGNsYXNzZXMKKyAgICAgICAgIyBhcmUgd2Vha3JlZmFibGUuCisgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgQjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbCA9IFtdCisgICAgICAgIHdlYWtyZWYucmVmKGludCkKKyAgICAgICAgYSA9IHdlYWtyZWYucmVmKEEsIGwuYXBwZW5kKQorICAgICAgICBBID0gTm9uZQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgW2FdKQorICAgICAgICBiID0gd2Vha3JlZi5yZWYoQiwgbC5hcHBlbmQpCisgICAgICAgIEIgPSBOb25lCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLCBbYSwgYl0pCisKKyAgICBkZWYgdGVzdF9lcXVhbGl0eShzZWxmKToKKyAgICAgICAgIyBBbGl2ZSB3ZWFrcmVmcyBkZWZlciBlcXVhbGl0eSB0ZXN0aW5nIHRvIHRoZWlyIHVuZGVybHlpbmcgb2JqZWN0LgorICAgICAgICB4ID0gT2JqZWN0KDEpCisgICAgICAgIHkgPSBPYmplY3QoMSkKKyAgICAgICAgeiA9IE9iamVjdCgyKQorICAgICAgICBhID0gd2Vha3JlZi5yZWYoeCkKKyAgICAgICAgYiA9IHdlYWtyZWYucmVmKHkpCisgICAgICAgIGMgPSB3ZWFrcmVmLnJlZih6KQorICAgICAgICBkID0gd2Vha3JlZi5yZWYoeCkKKyAgICAgICAgIyBOb3RlIGhvdyB3ZSBkaXJlY3RseSB0ZXN0IHRoZSBvcGVyYXRvcnMgaGVyZSwgdG8gc3RyZXNzIGJvdGgKKyAgICAgICAgIyBfX2VxX18gYW5kIF9fbmVfXy4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gYikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShhICE9IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYSA9PSBjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAhPSBjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGEgIT0gZCkKKyAgICAgICAgZGVsIHgsIHksIHoKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGZvciByIGluIGEsIGIsIGM6CisgICAgICAgICAgICAjIFNhbml0eSBjaGVjaworICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhyKCksIE5vbmUpCisgICAgICAgICMgRGVhZCB3ZWFrcmVmcyBjb21wYXJlIGJ5IGlkZW50aXR5OiB3aGV0aGVyIGBhYCBhbmQgYGRgIGFyZSB0aGUKKyAgICAgICAgIyBzYW1lIHdlYWtyZWYgb2JqZWN0IGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgc2luY2UgdGhleSBwb2ludGVkCisgICAgICAgICMgdG8gdGhlIHNhbWUgb3JpZ2luYWwgb2JqZWN0IGFuZCBkaWRuJ3QgaGF2ZSBhIGNhbGxiYWNrLgorICAgICAgICAjIChzZWUgaXNzdWUgIzE2NDUzKS4KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShhID09IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhICE9IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYSA9PSBjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAhPSBjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgPT0gZCwgYSBpcyBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgIT0gZCwgYSBpcyBub3QgZCkKKworICAgIGRlZiB0ZXN0X2hhc2hpbmcoc2VsZik6CisgICAgICAgICMgQWxpdmUgd2Vha3JlZnMgaGFzaCB0aGUgc2FtZSBhcyB0aGUgdW5kZXJseWluZyBvYmplY3QKKyAgICAgICAgeCA9IE9iamVjdCg0MikKKyAgICAgICAgeSA9IE9iamVjdCg0MikKKyAgICAgICAgYSA9IHdlYWtyZWYucmVmKHgpCisgICAgICAgIGIgPSB3ZWFrcmVmLnJlZih5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYSksIGhhc2goNDIpKQorICAgICAgICBkZWwgeCwgeQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgIyBEZWFkIHdlYWtyZWZzOgorICAgICAgICAjIC0gcmV0YWluIHRoZWlyIGhhc2ggaXMgdGhleSB3ZXJlIGhhc2hlZCB3aGVuIGFsaXZlOworICAgICAgICAjIC0gb3RoZXJ3aXNlLCBjYW5ub3QgYmUgaGFzaGVkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYSksIGhhc2goNDIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIGIpCisKKyAgICBkZWYgdGVzdF90cmFzaGNhbl8xNjYwMihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTY2MDI6IHdoZW4gYSB3ZWFrcmVmJ3MgdGFyZ2V0IHdhcyBwYXJ0IG9mIGEgbG9uZworICAgICAgICAjIGRlYWxsb2NhdGlvbiBjaGFpbiwgdGhlIHRyYXNoY2FuIG1lY2hhbmlzbSBjb3VsZCBkZWxheSBjbGVhcmluZworICAgICAgICAjIG9mIHRoZSB3ZWFrcmVmIGFuZCBtYWtlIHRoZSB0YXJnZXQgb2JqZWN0IHZpc2libGUgZnJvbSBvdXRzaWRlCisgICAgICAgICMgY29kZSBldmVuIHRob3VnaCBpdHMgcmVmY291bnQgaGFkIGRyb3BwZWQgdG8gMC4gIEEgY3Jhc2ggZW5zdWVkLgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50KToKKyAgICAgICAgICAgICAgICBpZiBub3QgcGFyZW50OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICB3c2VsZiA9IHdlYWtyZWYucmVmKHNlbGYpCisgICAgICAgICAgICAgICAgZGVmIGNiKHdwYXJlbnQpOgorICAgICAgICAgICAgICAgICAgICBvID0gd3NlbGYoKQorICAgICAgICAgICAgICAgIHNlbGYud3BhcmVudCA9IHdlYWtyZWYucmVmKHBhcmVudCwgY2IpCisKKyAgICAgICAgZCA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoKQorICAgICAgICByb290ID0gYyA9IEMoTm9uZSkKKyAgICAgICAgZm9yIG4gaW4gcmFuZ2UoMTAwKToKKyAgICAgICAgICAgIGRbY10gPSBjID0gQyhjKQorICAgICAgICBkZWwgcm9vdAorICAgICAgICBnYy5jb2xsZWN0KCkKKworCitjbGFzcyBTdWJjbGFzc2FibGVXZWFrcmVmVGVzdENhc2UoVGVzdEJhc2UpOgorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfcmVmcyhzZWxmKToKKyAgICAgICAgY2xhc3MgTXlSZWYod2Vha3JlZi5yZWYpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iLCBjYWxsYmFjaz1Ob25lLCB2YWx1ZT00Mik6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICAgICAgc3VwZXIoTXlSZWYsIHNlbGYpLl9faW5pdF9fKG9iLCBjYWxsYmFjaykKKyAgICAgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoTXlSZWYsIHNlbGYpLl9fY2FsbF9fKCkKKyAgICAgICAgbyA9IE9iamVjdCgiZm9vIikKKyAgICAgICAgbXIgPSBNeVJlZihvLCB2YWx1ZT0yNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1yKCkgaXMgbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1yLmNhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtci52YWx1ZSwgMjQpCisgICAgICAgIGRlbCBvCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtcigpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtci5jYWxsZWQpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc19yZWZzX2RvbnRfcmVwbGFjZV9zdGFuZGFyZF9yZWZzKHNlbGYpOgorICAgICAgICBjbGFzcyBNeVJlZih3ZWFrcmVmLnJlZik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG8gPSBPYmplY3QoNDIpCisgICAgICAgIHIxID0gTXlSZWYobykKKyAgICAgICAgcjIgPSB3ZWFrcmVmLnJlZihvKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocjEgaXMgbm90IHIyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdlYWtyZWYuZ2V0d2Vha3JlZnMobyksIFtyMiwgcjFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pLCAyKQorICAgICAgICByMyA9IE15UmVmKG8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobyksIDMpCisgICAgICAgIHJlZnMgPSB3ZWFrcmVmLmdldHdlYWtyZWZzKG8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlZnMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocjIgaXMgcmVmc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihyMSwgcmVmc1sxOl0pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocjMsIHJlZnNbMTpdKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfcmVmc19kb250X2NvbmZsYXRlX2NhbGxiYWNrcyhzZWxmKToKKyAgICAgICAgY2xhc3MgTXlSZWYod2Vha3JlZi5yZWYpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBvID0gT2JqZWN0KDQyKQorICAgICAgICByMSA9IE15UmVmKG8sIGlkKQorICAgICAgICByMiA9IE15UmVmKG8sIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIxIGlzIG5vdCByMikKKyAgICAgICAgcmVmcyA9IHdlYWtyZWYuZ2V0d2Vha3JlZnMobykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihyMSwgcmVmcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihyMiwgcmVmcykKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3JlZnNfd2l0aF9zbG90cyhzZWxmKToKKyAgICAgICAgY2xhc3MgTXlSZWYod2Vha3JlZi5yZWYpOgorICAgICAgICAgICAgX19zbG90c19fID0gInNsb3QxIiwgInNsb3QyIgorICAgICAgICAgICAgZGVmIF9fbmV3X18odHlwZSwgb2IsIGNhbGxiYWNrLCBzbG90MSwgc2xvdDIpOgorICAgICAgICAgICAgICAgIHJldHVybiB3ZWFrcmVmLnJlZi5fX25ld19fKHR5cGUsIG9iLCBjYWxsYmFjaykKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYiwgY2FsbGJhY2ssIHNsb3QxLCBzbG90Mik6CisgICAgICAgICAgICAgICAgc2VsZi5zbG90MSA9IHNsb3QxCisgICAgICAgICAgICAgICAgc2VsZi5zbG90MiA9IHNsb3QyCisgICAgICAgICAgICBkZWYgbWV0aChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zbG90MSArIHNlbGYuc2xvdDIKKyAgICAgICAgbyA9IE9iamVjdCg0MikKKyAgICAgICAgciA9IE15UmVmKG8sIE5vbmUsICJhYmMiLCAiZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLnNsb3QxLCAiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLnNsb3QyLCAiZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLm1ldGgoKSwgImFiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihyLCAiX19kaWN0X18iKSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3JlZnNfd2l0aF9jeWNsZShzZWxmKToKKyAgICAgICAgIyBCdWcgIzMxMTAKKyAgICAgICAgIyBBbiBpbnN0YW5jZSBvZiBhIHdlYWtyZWYgc3ViY2xhc3MgY2FuIGhhdmUgYXR0cmlidXRlcy4KKyAgICAgICAgIyBJZiBzdWNoIGEgd2Vha3JlZiBob2xkcyB0aGUgb25seSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QsCisgICAgICAgICMgZGVsZXRpbmcgdGhlIHdlYWtyZWYgd2lsbCBkZWxldGUgdGhlIG9iamVjdC4gSW4gdGhpcyBjYXNlLAorICAgICAgICAjIHRoZSBjYWxsYmFjayBtdXN0IG5vdCBiZSBjYWxsZWQsIGJlY2F1c2UgdGhlIHJlZiBvYmplY3QgaXMKKyAgICAgICAgIyBiZWluZyBkZWxldGVkLgorICAgICAgICBjbGFzcyBNeVJlZih3ZWFrcmVmLnJlZik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBVc2UgYSBsb2NhbCBjYWxsYmFjaywgZm9yICJyZWdydGVzdCAtUjo6IgorICAgICAgICAjIHRvIGRldGVjdCByZWZjb3VudGluZyBwcm9ibGVtcworICAgICAgICBkZWYgY2FsbGJhY2sodyk6CisgICAgICAgICAgICBzZWxmLmNiY2FsbGVkICs9IDEKKworICAgICAgICBvID0gQygpCisgICAgICAgIHIxID0gTXlSZWYobywgY2FsbGJhY2spCisgICAgICAgIHIxLm8gPSBvCisgICAgICAgIGRlbCBvCisKKyAgICAgICAgZGVsIHIxICMgVXNlZCB0byBjcmFzaCBoZXJlCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNiY2FsbGVkLCAwKQorCisgICAgICAgICMgU2FtZSB0ZXN0LCB3aXRoIHR3byB3ZWFrcmVmcyB0byB0aGUgc2FtZSBvYmplY3QKKyAgICAgICAgIyAoc2luY2UgY29kZSBwYXRocyBhcmUgZGlmZmVyZW50KQorICAgICAgICBvID0gQygpCisgICAgICAgIHIxID0gTXlSZWYobywgY2FsbGJhY2spCisgICAgICAgIHIyID0gTXlSZWYobywgY2FsbGJhY2spCisgICAgICAgIHIxLnIgPSByMgorICAgICAgICByMi5vID0gbworICAgICAgICBkZWwgbworICAgICAgICBkZWwgcjIKKworICAgICAgICBkZWwgcjEgIyBVc2VkIHRvIGNyYXNoIGhlcmUKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2JjYWxsZWQsIDApCisKKworY2xhc3MgTWFwcGluZ1Rlc3RDYXNlKFRlc3RCYXNlKToKKworICAgIENPVU5UID0gMTAKKworICAgIGRlZiBjaGVja19sZW5fY3ljbGVzKHNlbGYsIGRpY3RfdHlwZSwgY29ucyk6CisgICAgICAgIE4gPSAyMAorICAgICAgICBpdGVtcyA9IFtSZWZDeWNsZSgpIGZvciBpIGluIHJhbmdlKE4pXQorICAgICAgICBkY3QgPSBkaWN0X3R5cGUoY29ucyhvKSBmb3IgbyBpbiBpdGVtcykKKyAgICAgICAgIyBLZWVwIGFuIGl0ZXJhdG9yIGFsaXZlCisgICAgICAgIGl0ID0gZGN0Lml0ZXJpdGVtcygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHQoaXQpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWwgaXRlbXMKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIG4xID0gbGVuKGRjdCkKKyAgICAgICAgZGVsIGl0CisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBuMiA9IGxlbihkY3QpCisgICAgICAgICMgb25lIGl0ZW0gbWF5IGJlIGtlcHQgYWxpdmUgaW5zaWRlIHRoZSBpdGVyYXRvcgorICAgICAgICBzZWxmLmFzc2VydEluKG4xLCAoMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjIsIDApCisKKyAgICBkZWYgdGVzdF93ZWFrX2tleWVkX2xlbl9jeWNsZXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfbGVuX2N5Y2xlcyh3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5LCBsYW1iZGEgazogKGssIDEpKQorCisgICAgZGVmIHRlc3Rfd2Vha192YWx1ZWRfbGVuX2N5Y2xlcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19sZW5fY3ljbGVzKHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSwgbGFtYmRhIGs6ICgxLCBrKSkKKworICAgIGRlZiBjaGVja19sZW5fcmFjZShzZWxmLCBkaWN0X3R5cGUsIGNvbnMpOgorICAgICAgICAjIEV4dGVuZGVkIHNhbml0eSBjaGVja3MgZm9yIGxlbigpIGluIHRoZSBmYWNlIG9mIGN5Y2xpYyBjb2xsZWN0aW9uCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChnYy5zZXRfdGhyZXNob2xkLCAqZ2MuZ2V0X3RocmVzaG9sZCgpKQorICAgICAgICBmb3IgdGggaW4gcmFuZ2UoMSwgMTAwKToKKyAgICAgICAgICAgIE4gPSAyMAorICAgICAgICAgICAgZ2MuY29sbGVjdCgwKQorICAgICAgICAgICAgZ2Muc2V0X3RocmVzaG9sZCh0aCwgdGgsIHRoKQorICAgICAgICAgICAgaXRlbXMgPSBbUmVmQ3ljbGUoKSBmb3IgaSBpbiByYW5nZShOKV0KKyAgICAgICAgICAgIGRjdCA9IGRpY3RfdHlwZShjb25zKG8pIGZvciBvIGluIGl0ZW1zKQorICAgICAgICAgICAgZGVsIGl0ZW1zCisgICAgICAgICAgICAjIEFsbCBpdGVtcyB3aWxsIGJlIGNvbGxlY3RlZCBhdCBuZXh0IGdhcmJhZ2UgY29sbGVjdGlvbiBwYXNzCisgICAgICAgICAgICBpdCA9IGRjdC5pdGVyaXRlbXMoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG5leHQoaXQpCisgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBuMSA9IGxlbihkY3QpCisgICAgICAgICAgICBkZWwgaXQKKyAgICAgICAgICAgIG4yID0gbGVuKGRjdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKG4xLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobjEsIE4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChuMiwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKG4yLCBuMSkKKworICAgIGRlZiB0ZXN0X3dlYWtfa2V5ZWRfbGVuX3JhY2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfbGVuX3JhY2Uod2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSwgbGFtYmRhIGs6IChrLCAxKSkKKworICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVkX2xlbl9yYWNlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2xlbl9yYWNlKHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSwgbGFtYmRhIGs6ICgxLCBrKSkKKworICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVzKHNlbGYpOgorICAgICAgICAjCisgICAgICAgICMgIFRoaXMgZXhlcmNpc2VzIGQuY29weSgpLCBkLml0ZW1zKCksIGRbXSwgZGVsIGRbXSwgbGVuKGQpLgorICAgICAgICAjCisgICAgICAgIGRpY3QsIG9iamVjdHMgPSBzZWxmLm1ha2Vfd2Vha192YWx1ZWRfZGljdCgpCisgICAgICAgIGZvciBvIGluIG9iamVjdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgbnVtYmVyIG9mIHdlYWsgcmVmZXJlbmNlcyB0byAlciEiICUgbykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvIGlzIGRpY3Rbby5hcmddLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBvYmplY3QgcmV0dXJuZWQgYnkgd2VhayBkaWN0ISIpCisgICAgICAgIGl0ZW1zMSA9IGRpY3QuaXRlbXMoKQorICAgICAgICBpdGVtczIgPSBkaWN0LmNvcHkoKS5pdGVtcygpCisgICAgICAgIGl0ZW1zMS5zb3J0KCkKKyAgICAgICAgaXRlbXMyLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXRlbXMxID09IGl0ZW1zMiwKKyAgICAgICAgICAgICAgICAgICAgICJjbG9uaW5nIG9mIHdlYWstdmFsdWVkIGRpY3Rpb25hcnkgZGlkIG5vdCB3b3JrISIpCisgICAgICAgIGRlbCBpdGVtczEsIGl0ZW1zMgorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRpY3QpID09IHNlbGYuQ09VTlQpCisgICAgICAgIGRlbCBvYmplY3RzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gKHNlbGYuQ09VTlQgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICJkZWxldGluZyBvYmplY3QgZGlkIG5vdCBjYXVzZSBkaWN0aW9uYXJ5IHVwZGF0ZSIpCisgICAgICAgIGRlbCBvYmplY3RzLCBvCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICJkZWxldGluZyB0aGUgdmFsdWVzIGRpZCBub3QgY2xlYXIgdGhlIGRpY3Rpb25hcnkiKQorICAgICAgICAjIHJlZ3Jlc3Npb24gb24gU0YgYnVnICM0NDcxNTI6CisgICAgICAgIGRpY3QgPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZGljdC5fX2dldGl0ZW1fXywgMSkKKyAgICAgICAgZGljdFsyXSA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZGljdC5fX2dldGl0ZW1fXywgMikKKworICAgIGRlZiB0ZXN0X3dlYWtfa2V5cyhzZWxmKToKKyAgICAgICAgIworICAgICAgICAjICBUaGlzIGV4ZXJjaXNlcyBkLmNvcHkoKSwgZC5pdGVtcygpLCBkW10gPSB2LCBkW10sIGRlbCBkW10sCisgICAgICAgICMgIGxlbihkKSwgaW4gZC4KKyAgICAgICAgIworICAgICAgICBkaWN0LCBvYmplY3RzID0gc2VsZi5tYWtlX3dlYWtfa2V5ZWRfZGljdCgpCisgICAgICAgIGZvciBvIGluIG9iamVjdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgbnVtYmVyIG9mIHdlYWsgcmVmZXJlbmNlcyB0byAlciEiICUgbykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvLmFyZyBpcyBkaWN0W29dLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBvYmplY3QgcmV0dXJuZWQgYnkgd2VhayBkaWN0ISIpCisgICAgICAgIGl0ZW1zMSA9IGRpY3QuaXRlbXMoKQorICAgICAgICBpdGVtczIgPSBkaWN0LmNvcHkoKS5pdGVtcygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoaXRlbXMxKSA9PSBzZXQoaXRlbXMyKSwKKyAgICAgICAgICAgICAgICAgICAgICJjbG9uaW5nIG9mIHdlYWsta2V5ZWQgZGljdGlvbmFyeSBkaWQgbm90IHdvcmshIikKKyAgICAgICAgZGVsIGl0ZW1zMSwgaXRlbXMyCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gc2VsZi5DT1VOVCkKKyAgICAgICAgZGVsIG9iamVjdHNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkaWN0KSA9PSAoc2VsZi5DT1VOVCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgImRlbGV0aW5nIG9iamVjdCBkaWQgbm90IGNhdXNlIGRpY3Rpb25hcnkgdXBkYXRlIikKKyAgICAgICAgZGVsIG9iamVjdHMsIG8KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkaWN0KSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgImRlbGV0aW5nIHRoZSBrZXlzIGRpZCBub3QgY2xlYXIgdGhlIGRpY3Rpb25hcnkiKQorICAgICAgICBvID0gT2JqZWN0KDQyKQorICAgICAgICBkaWN0W29dID0gIldoYXQgaXMgdGhlIG1lYW5pbmcgb2YgdGhlIHVuaXZlcnNlPyIKKyAgICAgICAgc2VsZi5hc3NlcnRJbihvLCBkaWN0KQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDM0LCBkaWN0KQorCisgICAgZGVmIHRlc3Rfd2Vha19rZXllZF9pdGVycyhzZWxmKToKKyAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX2tleWVkX2RpY3QoKQorICAgICAgICBzZWxmLmNoZWNrX2l0ZXJzKGRpY3QpCisKKyAgICAgICAgIyBUZXN0IGtleXJlZnMoKQorICAgICAgICByZWZzID0gZGljdC5rZXlyZWZzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVmcyksIGxlbihvYmplY3RzKSkKKyAgICAgICAgb2JqZWN0czIgPSBsaXN0KG9iamVjdHMpCisgICAgICAgIGZvciB3ciBpbiByZWZzOgorICAgICAgICAgICAgb2IgPSB3cigpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKG9iLCBkaWN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYi5hcmcsIGRpY3Rbb2JdKQorICAgICAgICAgICAgb2JqZWN0czIucmVtb3ZlKG9iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvYmplY3RzMiksIDApCisKKyAgICAgICAgIyBUZXN0IGl0ZXJrZXlyZWZzKCkKKyAgICAgICAgb2JqZWN0czIgPSBsaXN0KG9iamVjdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpc3QoZGljdC5pdGVya2V5cmVmcygpKSksIGxlbihvYmplY3RzKSkKKyAgICAgICAgZm9yIHdyIGluIGRpY3QuaXRlcmtleXJlZnMoKToKKyAgICAgICAgICAgIG9iID0gd3IoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihvYiwgZGljdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2IuYXJnLCBkaWN0W29iXSkKKyAgICAgICAgICAgIG9iamVjdHMyLnJlbW92ZShvYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob2JqZWN0czIpLCAwKQorCisgICAgZGVmIHRlc3Rfd2Vha192YWx1ZWRfaXRlcnMoc2VsZik6CisgICAgICAgIGRpY3QsIG9iamVjdHMgPSBzZWxmLm1ha2Vfd2Vha192YWx1ZWRfZGljdCgpCisgICAgICAgIHNlbGYuY2hlY2tfaXRlcnMoZGljdCkKKworICAgICAgICAjIFRlc3QgdmFsdWVyZWZzKCkKKyAgICAgICAgcmVmcyA9IGRpY3QudmFsdWVyZWZzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVmcyksIGxlbihvYmplY3RzKSkKKyAgICAgICAgb2JqZWN0czIgPSBsaXN0KG9iamVjdHMpCisgICAgICAgIGZvciB3ciBpbiByZWZzOgorICAgICAgICAgICAgb2IgPSB3cigpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iLCBkaWN0W29iLmFyZ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iLmFyZywgZGljdFtvYi5hcmddLmFyZykKKyAgICAgICAgICAgIG9iamVjdHMyLnJlbW92ZShvYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob2JqZWN0czIpLCAwKQorCisgICAgICAgICMgVGVzdCBpdGVydmFsdWVyZWZzKCkKKyAgICAgICAgb2JqZWN0czIgPSBsaXN0KG9iamVjdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpc3QoZGljdC5pdGVydmFsdWVyZWZzKCkpKSwgbGVuKG9iamVjdHMpKQorICAgICAgICBmb3Igd3IgaW4gZGljdC5pdGVydmFsdWVyZWZzKCk6CisgICAgICAgICAgICBvYiA9IHdyKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2IsIGRpY3Rbb2IuYXJnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2IuYXJnLCBkaWN0W29iLmFyZ10uYXJnKQorICAgICAgICAgICAgb2JqZWN0czIucmVtb3ZlKG9iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvYmplY3RzMiksIDApCisKKyAgICBkZWYgY2hlY2tfaXRlcnMoc2VsZiwgZGljdCk6CisgICAgICAgICMgaXRlbSBpdGVyYXRvcjoKKyAgICAgICAgaXRlbXMgPSBkaWN0Lml0ZW1zKCkKKyAgICAgICAgZm9yIGl0ZW0gaW4gZGljdC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGl0ZW1zLnJlbW92ZShpdGVtKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGl0ZW1zKSA9PSAwLCAiaXRlcml0ZW1zKCkgZGlkIG5vdCB0b3VjaCBhbGwgaXRlbXMiKQorCisgICAgICAgICMga2V5IGl0ZXJhdG9yLCB2aWEgX19pdGVyX18oKToKKyAgICAgICAga2V5cyA9IGRpY3Qua2V5cygpCisgICAgICAgIGZvciBrIGluIGRpY3Q6CisgICAgICAgICAgICBrZXlzLnJlbW92ZShrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGtleXMpID09IDAsICJfX2l0ZXJfXygpIGRpZCBub3QgdG91Y2ggYWxsIGtleXMiKQorCisgICAgICAgICMga2V5IGl0ZXJhdG9yLCB2aWEgaXRlcmtleXMoKToKKyAgICAgICAga2V5cyA9IGRpY3Qua2V5cygpCisgICAgICAgIGZvciBrIGluIGRpY3QuaXRlcmtleXMoKToKKyAgICAgICAgICAgIGtleXMucmVtb3ZlKGspCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oa2V5cykgPT0gMCwgIml0ZXJrZXlzKCkgZGlkIG5vdCB0b3VjaCBhbGwga2V5cyIpCisKKyAgICAgICAgIyB2YWx1ZSBpdGVyYXRvcjoKKyAgICAgICAgdmFsdWVzID0gZGljdC52YWx1ZXMoKQorICAgICAgICBmb3IgdiBpbiBkaWN0Lml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgICAgIHZhbHVlcy5yZW1vdmUodikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih2YWx1ZXMpID09IDAsCisgICAgICAgICAgICAgICAgICAgICAiaXRlcnZhbHVlcygpIGRpZCBub3QgdG91Y2ggYWxsIHZhbHVlcyIpCisKKyAgICBkZWYgdGVzdF9tYWtlX3dlYWtfa2V5ZWRfZGljdF9mcm9tX2RpY3Qoc2VsZik6CisgICAgICAgIG8gPSBPYmplY3QoMykKKyAgICAgICAgZGljdCA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoe286MzY0fSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpY3Rbb10gPT0gMzY0KQorCisgICAgZGVmIHRlc3RfbWFrZV93ZWFrX2tleWVkX2RpY3RfZnJvbV93ZWFrX2tleWVkX2RpY3Qoc2VsZik6CisgICAgICAgIG8gPSBPYmplY3QoMykKKyAgICAgICAgZGljdCA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoe286MzY0fSkKKyAgICAgICAgZGljdDIgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0W29dID09IDM2NCkKKworICAgIGRlZiBtYWtlX3dlYWtfa2V5ZWRfZGljdChzZWxmKToKKyAgICAgICAgZGljdCA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoKQorICAgICAgICBvYmplY3RzID0gbWFwKE9iamVjdCwgcmFuZ2Uoc2VsZi5DT1VOVCkpCisgICAgICAgIGZvciBvIGluIG9iamVjdHM6CisgICAgICAgICAgICBkaWN0W29dID0gby5hcmcKKyAgICAgICAgcmV0dXJuIGRpY3QsIG9iamVjdHMKKworICAgIGRlZiBtYWtlX3dlYWtfdmFsdWVkX2RpY3Qoc2VsZik6CisgICAgICAgIGRpY3QgPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkoKQorICAgICAgICBvYmplY3RzID0gbWFwKE9iamVjdCwgcmFuZ2Uoc2VsZi5DT1VOVCkpCisgICAgICAgIGZvciBvIGluIG9iamVjdHM6CisgICAgICAgICAgICBkaWN0W28uYXJnXSA9IG8KKyAgICAgICAgcmV0dXJuIGRpY3QsIG9iamVjdHMKKworICAgIGRlZiBjaGVja19wb3BpdGVtKHNlbGYsIGtsYXNzLCBrZXkxLCB2YWx1ZTEsIGtleTIsIHZhbHVlMik6CisgICAgICAgIHdlYWtkaWN0ID0ga2xhc3MoKQorICAgICAgICB3ZWFrZGljdFtrZXkxXSA9IHZhbHVlMQorICAgICAgICB3ZWFrZGljdFtrZXkyXSA9IHZhbHVlMgorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHdlYWtkaWN0KSA9PSAyKQorICAgICAgICBrLCB2ID0gd2Vha2RpY3QucG9waXRlbSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4od2Vha2RpY3QpID09IDEpCisgICAgICAgIGlmIGsgaXMga2V5MToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHZhbHVlMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHZhbHVlMikKKyAgICAgICAgaywgdiA9IHdlYWtkaWN0LnBvcGl0ZW0oKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHdlYWtkaWN0KSA9PSAwKQorICAgICAgICBpZiBrIGlzIGtleTE6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB2YWx1ZTEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB2YWx1ZTIpCisKKyAgICBkZWYgdGVzdF93ZWFrX3ZhbHVlZF9kaWN0X3BvcGl0ZW0oc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcG9waXRlbSh3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5MSIsIEMoKSwgImtleTIiLCBDKCkpCisKKyAgICBkZWYgdGVzdF93ZWFrX2tleWVkX2RpY3RfcG9waXRlbShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19wb3BpdGVtKHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDKCksICJ2YWx1ZSAxIiwgQygpLCAidmFsdWUgMiIpCisKKyAgICBkZWYgY2hlY2tfc2V0ZGVmYXVsdChzZWxmLCBrbGFzcywga2V5LCB2YWx1ZTEsIHZhbHVlMik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWx1ZTEgaXMgbm90IHZhbHVlMiwKKyAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHRlc3QiCisgICAgICAgICAgICAgICAgICAgICAiIC0tIHZhbHVlIHBhcmFtZXRlcnMgbXVzdCBiZSBkaXN0aW5jdCBvYmplY3RzIikKKyAgICAgICAgd2Vha2RpY3QgPSBrbGFzcygpCisgICAgICAgIG8gPSB3ZWFrZGljdC5zZXRkZWZhdWx0KGtleSwgdmFsdWUxKQorICAgICAgICBzZWxmLmFzc2VydElzKG8sIHZhbHVlMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihrZXksIHdlYWtkaWN0KQorICAgICAgICBzZWxmLmFzc2VydElzKHdlYWtkaWN0LmdldChrZXkpLCB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMod2Vha2RpY3Rba2V5XSwgdmFsdWUxKQorCisgICAgICAgIG8gPSB3ZWFrZGljdC5zZXRkZWZhdWx0KGtleSwgdmFsdWUyKQorICAgICAgICBzZWxmLmFzc2VydElzKG8sIHZhbHVlMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihrZXksIHdlYWtkaWN0KQorICAgICAgICBzZWxmLmFzc2VydElzKHdlYWtkaWN0LmdldChrZXkpLCB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMod2Vha2RpY3Rba2V5XSwgdmFsdWUxKQorCisgICAgZGVmIHRlc3Rfd2Vha192YWx1ZWRfZGljdF9zZXRkZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3NldGRlZmF1bHQod2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleSIsIEMoKSwgQygpKQorCisgICAgZGVmIHRlc3Rfd2Vha19rZXllZF9kaWN0X3NldGRlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc2V0ZGVmYXVsdCh3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQygpLCAidmFsdWUgMSIsICJ2YWx1ZSAyIikKKworICAgIGRlZiBjaGVja191cGRhdGUoc2VsZiwga2xhc3MsIGRpY3QpOgorICAgICAgICAjCisgICAgICAgICMgIFRoaXMgZXhlcmNpc2VzIGQudXBkYXRlKCksIGxlbihkKSwgZC5rZXlzKCksIGluIGQsCisgICAgICAgICMgIGQuZ2V0KCksIGRbXS4KKyAgICAgICAgIworICAgICAgICB3ZWFrZGljdCA9IGtsYXNzKCkKKyAgICAgICAgd2Vha2RpY3QudXBkYXRlKGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHdlYWtkaWN0KSwgbGVuKGRpY3QpKQorICAgICAgICBmb3IgayBpbiB3ZWFrZGljdC5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGssIGRpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm15c3RlcmlvdXMgbmV3IGtleSBhcHBlYXJlZCBpbiB3ZWFrIGRpY3QiKQorICAgICAgICAgICAgdiA9IGRpY3QuZ2V0KGspCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHYsIHdlYWtkaWN0W2tdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2LCB3ZWFrZGljdC5nZXQoaykpCisgICAgICAgIGZvciBrIGluIGRpY3Qua2V5cygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihrLCB3ZWFrZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3JpZ2luYWwga2V5IGRpc2FwcGVhcmVkIGluIHdlYWsgZGljdCIpCisgICAgICAgICAgICB2ID0gZGljdFtrXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2LCB3ZWFrZGljdFtrXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModiwgd2Vha2RpY3QuZ2V0KGspKQorCisgICAgZGVmIHRlc3Rfd2Vha192YWx1ZWRfZGljdF91cGRhdGUoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdXBkYXRlKHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgezE6IEMoKSwgJ2EnOiBDKCksIEMoKTogQygpfSkKKworICAgIGRlZiB0ZXN0X3dlYWtfa2V5ZWRfZGljdF91cGRhdGUoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdXBkYXRlKHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHtDKCk6IDEsIEMoKTogMiwgQygpOiAzfSkKKworICAgIGRlZiB0ZXN0X3dlYWtfa2V5ZWRfZGVsaXRlbShzZWxmKToKKyAgICAgICAgZCA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoKQorICAgICAgICBvMSA9IE9iamVjdCgnMScpCisgICAgICAgIG8yID0gT2JqZWN0KCcyJykKKyAgICAgICAgZFtvMV0gPSAnc29tZXRoaW5nJworICAgICAgICBkW28yXSA9ICdzb21ldGhpbmcnCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZCkgPT0gMikKKyAgICAgICAgZGVsIGRbbzFdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZCkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQua2V5cygpID09IFtvMl0pCisKKyAgICBkZWYgdGVzdF93ZWFrX3ZhbHVlZF9kZWxpdGVtKHNlbGYpOgorICAgICAgICBkID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKKyAgICAgICAgbzEgPSBPYmplY3QoJzEnKQorICAgICAgICBvMiA9IE9iamVjdCgnMicpCisgICAgICAgIGRbJ3NvbWV0aGluZyddID0gbzEKKyAgICAgICAgZFsnc29tZXRoaW5nIGVsc2UnXSA9IG8yCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZCkgPT0gMikKKyAgICAgICAgZGVsIGRbJ3NvbWV0aGluZyddCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZCkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaXRlbXMoKSA9PSBbKCdzb21ldGhpbmcgZWxzZScsIG8yKV0pCisKKyAgICBkZWYgdGVzdF93ZWFrX2tleWVkX2JhZF9kZWxpdGVtKHNlbGYpOgorICAgICAgICBkID0gd2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSgpCisgICAgICAgIG8gPSBPYmplY3QoJzEnKQorICAgICAgICAjIEFuIGF0dGVtcHQgdG8gZGVsZXRlIGFuIG9iamVjdCB0aGF0IGlzbid0IHRoZXJlIHNob3VsZCByYWlzZQorICAgICAgICAjIEtleUVycm9yLiAgSXQgZGlkbid0IGJlZm9yZSAyLjMuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBkLl9fZGVsaXRlbV9fLCBvKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5fX2dldGl0ZW1fXywgbykKKworICAgICAgICAjIElmIGEga2V5IGlzbid0IG9mIGEgd2Vha2x5IHJlZmVyZW5jYWJsZSB0eXBlLCBfX2dldGl0ZW1fXyBhbmQKKyAgICAgICAgIyBfX3NldGl0ZW1fXyByYWlzZSBUeXBlRXJyb3IuICBfX2RlbGl0ZW1fXyBzaG91bGQgdG9vLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuX19kZWxpdGVtX18sICAxMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLl9fZ2V0aXRlbV9fLCAgMTMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5fX3NldGl0ZW1fXywgIDEzLCAxMykKKworICAgIGRlZiB0ZXN0X3dlYWtfa2V5ZWRfY2FzY2FkaW5nX2RlbGV0ZXMoc2VsZik6CisgICAgICAgICMgU0YgYnVnIDc0Mjg2MC4gIEZvciBzb21lIHJlYXNvbiwgYmVmb3JlIDIuMyBfX2RlbGl0ZW1fXyBpdGVyYXRlZAorICAgICAgICAjIG92ZXIgdGhlIGtleXMgdmlhIHNlbGYuZGF0YS5pdGVya2V5cygpLiAgSWYgdGhpbmdzIHZhbmlzaGVkIGZyb20KKyAgICAgICAgIyB0aGUgZGljdCBkdXJpbmcgdGhpcyAob3IgZ290IGFkZGVkKSwgdGhhdCBjYXVzZWQgYSBSdW50aW1lRXJyb3IuCisKKyAgICAgICAgZCA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoKQorICAgICAgICBtdXRhdGUgPSBGYWxzZQorCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlID0gaQorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBoYXNoKHNlbGYudmFsdWUpCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBpZiBtdXRhdGU6CisgICAgICAgICAgICAgICAgICAgICMgU2lkZSBlZmZlY3QgdGhhdCBtdXRhdGVzIHRoZSBkaWN0LCBieSByZW1vdmluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBsYXN0IHN0cm9uZyByZWZlcmVuY2UgdG8gYSBrZXkuCisgICAgICAgICAgICAgICAgICAgIGRlbCBvYmpzWy0xXQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlID09IG90aGVyLnZhbHVlCisKKyAgICAgICAgb2JqcyA9IFtDKGkpIGZvciBpIGluIHJhbmdlKDQpXQorICAgICAgICBmb3IgbyBpbiBvYmpzOgorICAgICAgICAgICAgZFtvXSA9IG8udmFsdWUKKyAgICAgICAgZGVsIG8gICAjIG5vdyB0aGUgb25seSBzdHJvbmcgcmVmZXJlbmNlcyB0byBrZXlzIGFyZSBpbiBvYmpzCisgICAgICAgICMgRmluZCB0aGUgb3JkZXIgaW4gd2hpY2ggaXRlcmtleXMgc2VlcyB0aGUga2V5cy4KKyAgICAgICAgb2JqcyA9IGQua2V5cygpCisgICAgICAgICMgUmV2ZXJzZSBpdCwgc28gdGhhdCB0aGUgaXRlcmF0aW9uIGltcGxlbWVudGF0aW9uIG9mIF9fZGVsaXRlbV9fCisgICAgICAgICMgaGFzIHRvIGtlZXAgbG9vcGluZyB0byBmaW5kIHRoZSBmaXJzdCBvYmplY3Qgd2UgZGVsZXRlLgorICAgICAgICBvYmpzLnJldmVyc2UoKQorCisgICAgICAgICMgVHVybiBvbiBtdXRhdGlvbiBpbiBDLl9fZXFfXy4gIFRoZSBmaXJzdCB0aW1lIHRocnUgdGhlIGxvb3AsCisgICAgICAgICMgdW5kZXIgdGhlIGl0ZXJrZXlzKCkgYnVzaW5lc3MgdGhlIGZpcnN0IGNvbXBhcmlzb24gd2lsbCBkZWxldGUKKyAgICAgICAgIyB0aGUgbGFzdCBpdGVtIGl0ZXJrZXlzKCkgd291bGQgc2VlLCBhbmQgdGhhdCBjYXVzZXMgYQorICAgICAgICAjICAgICBSdW50aW1lRXJyb3I6IGRpY3Rpb25hcnkgY2hhbmdlZCBzaXplIGR1cmluZyBpdGVyYXRpb24KKyAgICAgICAgIyB3aGVuIHRoZSBpdGVya2V5cygpIGxvb3AgZ29lcyBhcm91bmQgdG8gdHJ5IGNvbXBhcmluZyB0aGUgbmV4dAorICAgICAgICAjIGtleS4gIEFmdGVyIHRoaXMgd2FzIGZpeGVkLCBpdCBqdXN0IGRlbGV0ZXMgdGhlIGxhc3Qgb2JqZWN0ICpvdXIqCisgICAgICAgICMgImZvciBvIGluIG9iaiIgbG9vcCB3b3VsZCBoYXZlIGdvdHRlbiB0by4KKyAgICAgICAgbXV0YXRlID0gVHJ1ZQorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgZm9yIG8gaW4gb2JqczoKKyAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgIGRlbCBkW29dCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCAyKQorCitmcm9tIHRlc3QgaW1wb3J0IG1hcHBpbmdfdGVzdHMKKworY2xhc3MgV2Vha1ZhbHVlRGljdGlvbmFyeVRlc3RDYXNlKG1hcHBpbmdfdGVzdHMuQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sKToKKyAgICAiIiJDaGVjayB0aGF0IFdlYWtWYWx1ZURpY3Rpb25hcnkgY29uZm9ybXMgdG8gdGhlIG1hcHBpbmcgcHJvdG9jb2wiIiIKKyAgICBfX3JlZiA9IHsia2V5MSI6T2JqZWN0KDEpLCAia2V5MiI6T2JqZWN0KDIpLCAia2V5MyI6T2JqZWN0KDMpfQorICAgIHR5cGUydGVzdCA9IHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeQorICAgIGRlZiBfcmVmZXJlbmNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JlZi5jb3B5KCkKKworY2xhc3MgV2Vha0tleURpY3Rpb25hcnlUZXN0Q2FzZShtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CisgICAgIiIiQ2hlY2sgdGhhdCBXZWFrS2V5RGljdGlvbmFyeSBjb25mb3JtcyB0byB0aGUgbWFwcGluZyBwcm90b2NvbCIiIgorICAgIF9fcmVmID0ge09iamVjdCgia2V5MSIpOjEsIE9iamVjdCgia2V5MiIpOjIsIE9iamVjdCgia2V5MyIpOjN9CisgICAgdHlwZTJ0ZXN0ID0gd2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeQorICAgIGRlZiBfcmVmZXJlbmNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JlZi5jb3B5KCkKKworbGlicmVmdGVzdCA9ICIiIiBEb2N0ZXN0IGZvciBleGFtcGxlcyBpbiB0aGUgbGlicmFyeSByZWZlcmVuY2U6IHdlYWtyZWYucnN0CisKKz4+PiBpbXBvcnQgd2Vha3JlZgorPj4+IGNsYXNzIERpY3QoZGljdCk6CisuLi4gICAgIHBhc3MKKy4uLgorPj4+IG9iaiA9IERpY3QocmVkPTEsIGdyZWVuPTIsIGJsdWU9MykgICAjIHRoaXMgb2JqZWN0IGlzIHdlYWsgcmVmZXJlbmNhYmxlCis+Pj4gciA9IHdlYWtyZWYucmVmKG9iaikKKz4+PiBwcmludCByKCkgaXMgb2JqCitUcnVlCisKKz4+PiBpbXBvcnQgd2Vha3JlZgorPj4+IGNsYXNzIE9iamVjdDoKKy4uLiAgICAgcGFzcworLi4uCis+Pj4gbyA9IE9iamVjdCgpCis+Pj4gciA9IHdlYWtyZWYucmVmKG8pCis+Pj4gbzIgPSByKCkKKz4+PiBvIGlzIG8yCitUcnVlCis+Pj4gZGVsIG8sIG8yCis+Pj4gcHJpbnQgcigpCitOb25lCisKKz4+PiBpbXBvcnQgd2Vha3JlZgorPj4+IGNsYXNzIEV4dGVuZGVkUmVmKHdlYWtyZWYucmVmKToKKy4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iLCBjYWxsYmFjaz1Ob25lLCAqKmFubm90YXRpb25zKToKKy4uLiAgICAgICAgIHN1cGVyKEV4dGVuZGVkUmVmLCBzZWxmKS5fX2luaXRfXyhvYiwgY2FsbGJhY2spCisuLi4gICAgICAgICBzZWxmLl9fY291bnRlciA9IDAKKy4uLiAgICAgICAgIGZvciBrLCB2IGluIGFubm90YXRpb25zLml0ZXJpdGVtcygpOgorLi4uICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgaywgdikKKy4uLiAgICAgZGVmIF9fY2FsbF9fKHNlbGYpOgorLi4uICAgICAgICAgJycnUmV0dXJuIGEgcGFpciBjb250YWluaW5nIHRoZSByZWZlcmVudCBhbmQgdGhlIG51bWJlciBvZgorLi4uICAgICAgICAgdGltZXMgdGhlIHJlZmVyZW5jZSBoYXMgYmVlbiBjYWxsZWQuCisuLi4gICAgICAgICAnJycKKy4uLiAgICAgICAgIG9iID0gc3VwZXIoRXh0ZW5kZWRSZWYsIHNlbGYpLl9fY2FsbF9fKCkKKy4uLiAgICAgICAgIGlmIG9iIGlzIG5vdCBOb25lOgorLi4uICAgICAgICAgICAgIHNlbGYuX19jb3VudGVyICs9IDEKKy4uLiAgICAgICAgICAgICBvYiA9IChvYiwgc2VsZi5fX2NvdW50ZXIpCisuLi4gICAgICAgICByZXR1cm4gb2IKKy4uLgorPj4+IGNsYXNzIEE6ICAgIyBub3QgaW4gZG9jcyBmcm9tIGhlcmUsIGp1c3QgdGVzdGluZyB0aGUgRXh0ZW5kZWRSZWYKKy4uLiAgICAgcGFzcworLi4uCis+Pj4gYSA9IEEoKQorPj4+IHIgPSBFeHRlbmRlZFJlZihhLCBmb289MSwgYmFyPSJiYXoiKQorPj4+IHIuZm9vCisxCis+Pj4gci5iYXIKKydiYXonCis+Pj4gcigpWzFdCisxCis+Pj4gcigpWzFdCisyCis+Pj4gcigpWzBdIGlzIGEKK1RydWUKKworCis+Pj4gaW1wb3J0IHdlYWtyZWYKKz4+PiBfaWQyb2JqX2RpY3QgPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkoKQorPj4+IGRlZiByZW1lbWJlcihvYmopOgorLi4uICAgICBvaWQgPSBpZChvYmopCisuLi4gICAgIF9pZDJvYmpfZGljdFtvaWRdID0gb2JqCisuLi4gICAgIHJldHVybiBvaWQKKy4uLgorPj4+IGRlZiBpZDJvYmoob2lkKToKKy4uLiAgICAgcmV0dXJuIF9pZDJvYmpfZGljdFtvaWRdCisuLi4KKz4+PiBhID0gQSgpICAgICAgICAgICAgICMgZnJvbSBoZXJlLCBqdXN0IHRlc3RpbmcKKz4+PiBhX2lkID0gcmVtZW1iZXIoYSkKKz4+PiBpZDJvYmooYV9pZCkgaXMgYQorVHJ1ZQorPj4+IGRlbCBhCis+Pj4gdHJ5OgorLi4uICAgICBpZDJvYmooYV9pZCkKKy4uLiBleGNlcHQgS2V5RXJyb3I6CisuLi4gICAgIHByaW50ICdPSycKKy4uLiBlbHNlOgorLi4uICAgICBwcmludCAnV2Vha1ZhbHVlRGljdGlvbmFyeSBlcnJvcicKK09LCisKKyIiIgorCitfX3Rlc3RfXyA9IHsnbGlicmVmdGVzdCcgOiBsaWJyZWZ0ZXN0fQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgUmVmZXJlbmNlc1Rlc3RDYXNlLAorICAgICAgICBNYXBwaW5nVGVzdENhc2UsCisgICAgICAgIFdlYWtWYWx1ZURpY3Rpb25hcnlUZXN0Q2FzZSwKKyAgICAgICAgV2Vha0tleURpY3Rpb25hcnlUZXN0Q2FzZSwKKyAgICAgICAgU3ViY2xhc3NhYmxlV2Vha3JlZlRlc3RDYXNlLAorICAgICAgICApCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHN5cy5tb2R1bGVzW19fbmFtZV9fXSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrcmVmLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dlYWtyZWYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjU1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrcmVmLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrcmVmLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dlYWtyZWYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjU1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrcmVmLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrc2V0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3NldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWUwOTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3NldC5weQpAQCAtMCwwICsxLDQ1MCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB3ZWFrcmVmIGltcG9ydCBwcm94eSwgcmVmLCBXZWFrU2V0CitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBjb3B5CitpbXBvcnQgc3RyaW5nCitpbXBvcnQgb3MKK2Zyb20gcmFuZG9tIGltcG9ydCByYW5kcmFuZ2UsIHNodWZmbGUKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgZ2MKK2ltcG9ydCBjb250ZXh0bGliCisKKworY2xhc3MgRm9vOgorICAgIHBhc3MKKworY2xhc3MgU29tZUNsYXNzKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHR5cGUob3RoZXIpICE9IHR5cGUoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIG90aGVyLnZhbHVlID09IHNlbGYudmFsdWUKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYuX19lcV9fKG90aGVyKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaCgoU29tZUNsYXNzLCBzZWxmLnZhbHVlKSkKKworY2xhc3MgUmVmQ3ljbGUob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY3ljbGUgPSBzZWxmCisKK2NsYXNzIFRlc3RXZWFrU2V0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBuZWVkIHRvIGtlZXAgcmVmZXJlbmNlcyB0byB0aGVtCisgICAgICAgIHNlbGYuaXRlbXMgPSBbU29tZUNsYXNzKGMpIGZvciBjIGluICgnYScsICdiJywgJ2MnKV0KKyAgICAgICAgc2VsZi5pdGVtczIgPSBbU29tZUNsYXNzKGMpIGZvciBjIGluICgneCcsICd5JywgJ3onKV0KKyAgICAgICAgc2VsZi5sZXR0ZXJzID0gW1NvbWVDbGFzcyhjKSBmb3IgYyBpbiBzdHJpbmcuYXNjaWlfbGV0dGVyc10KKyAgICAgICAgc2VsZi5hYl9pdGVtcyA9IFtTb21lQ2xhc3MoYykgZm9yIGMgaW4gJ2FiJ10KKyAgICAgICAgc2VsZi5hYmNkZV9pdGVtcyA9IFtTb21lQ2xhc3MoYykgZm9yIGMgaW4gJ2FiY2RlJ10KKyAgICAgICAgc2VsZi5kZWZfaXRlbXMgPSBbU29tZUNsYXNzKGMpIGZvciBjIGluICdkZWYnXQorICAgICAgICBzZWxmLmFiX3dlYWtzZXQgPSBXZWFrU2V0KHNlbGYuYWJfaXRlbXMpCisgICAgICAgIHNlbGYuYWJjZGVfd2Vha3NldCA9IFdlYWtTZXQoc2VsZi5hYmNkZV9pdGVtcykKKyAgICAgICAgc2VsZi5kZWZfd2Vha3NldCA9IFdlYWtTZXQoc2VsZi5kZWZfaXRlbXMpCisgICAgICAgIHNlbGYucyA9IFdlYWtTZXQoc2VsZi5pdGVtcykKKyAgICAgICAgc2VsZi5kID0gZGljdC5mcm9ta2V5cyhzZWxmLml0ZW1zKQorICAgICAgICBzZWxmLm9iaiA9IFNvbWVDbGFzcygnRicpCisgICAgICAgIHNlbGYuZnMgPSBXZWFrU2V0KFtzZWxmLm9ial0pCisKKyAgICBkZWYgdGVzdF9tZXRob2RzKHNlbGYpOgorICAgICAgICB3ZWFrc2V0bWV0aG9kcyA9IGRpcihXZWFrU2V0KQorICAgICAgICBmb3IgbWV0aG9kIGluIGRpcihzZXQpOgorICAgICAgICAgICAgaWYgbWV0aG9kID09ICd0ZXN0X2NfYXBpJyBvciBtZXRob2Quc3RhcnRzd2l0aCgnXycpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKG1ldGhvZCwgd2Vha3NldG1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIldlYWtTZXQgbWlzc2luZyBtZXRob2QgIiArIG1ldGhvZCkKKworICAgIGRlZiB0ZXN0X25ld19vcl9pbml0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFdlYWtTZXQsIFtdLCAyKQorCisgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnMpLCBsZW4oc2VsZi5kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5mcyksIDEpCisgICAgICAgIGRlbCBzZWxmLm9iagorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLmZzKSwgMCkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgorICAgICAgICBmb3IgYyBpbiBzZWxmLmxldHRlcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMgaW4gc2VsZi5zLCBjIGluIHNlbGYuZCkKKyAgICAgICAgIyAxIGlzIG5vdCB3ZWFrcmVmJ2FibGUsIGJ1dCB0aGF0IFR5cGVFcnJvciBpcyBjYXVnaHQgYnkgX19jb250YWluc19fCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMSwgc2VsZi5zKQorICAgICAgICBzZWxmLmFzc2VydEluKHNlbGYub2JqLCBzZWxmLmZzKQorICAgICAgICBkZWwgc2VsZi5vYmoKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihTb21lQ2xhc3MoJ0YnKSwgc2VsZi5mcykKKworICAgIGRlZiB0ZXN0X3VuaW9uKHNlbGYpOgorICAgICAgICB1ID0gc2VsZi5zLnVuaW9uKHNlbGYuaXRlbXMyKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmxldHRlcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMgaW4gdSwgYyBpbiBzZWxmLmQgb3IgYyBpbiBzZWxmLml0ZW1zMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMsIFdlYWtTZXQoc2VsZi5pdGVtcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh1KSwgV2Vha1NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMudW5pb24sIFtbXV0pCisgICAgICAgIGZvciBDIGluIHNldCwgZnJvemVuc2V0LCBkaWN0LmZyb21rZXlzLCBsaXN0LCB0dXBsZToKKyAgICAgICAgICAgIHggPSBXZWFrU2V0KHNlbGYuaXRlbXMgKyBzZWxmLml0ZW1zMikKKyAgICAgICAgICAgIGMgPSBDKHNlbGYuaXRlbXMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMudW5pb24oYyksIHgpCisgICAgICAgICAgICBkZWwgYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih1KSwgbGVuKHNlbGYuaXRlbXMpICsgbGVuKHNlbGYuaXRlbXMyKSkKKyAgICAgICAgc2VsZi5pdGVtczIucG9wKCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHUpLCBsZW4oc2VsZi5pdGVtcykgKyBsZW4oc2VsZi5pdGVtczIpKQorCisgICAgZGVmIHRlc3Rfb3Ioc2VsZik6CisgICAgICAgIGkgPSBzZWxmLnMudW5pb24oc2VsZi5pdGVtczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zIHwgc2V0KHNlbGYuaXRlbXMyKSwgaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMgfCBmcm96ZW5zZXQoc2VsZi5pdGVtczIpLCBpKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uKHNlbGYpOgorICAgICAgICBzID0gV2Vha1NldChzZWxmLmxldHRlcnMpCisgICAgICAgIGkgPSBzLmludGVyc2VjdGlvbihzZWxmLml0ZW1zMikKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5sZXR0ZXJzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjIGluIGksIGMgaW4gc2VsZi5pdGVtczIgYW5kIGMgaW4gc2VsZi5sZXR0ZXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIFdlYWtTZXQoc2VsZi5sZXR0ZXJzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGkpLCBXZWFrU2V0KQorICAgICAgICBmb3IgQyBpbiBzZXQsIGZyb3plbnNldCwgZGljdC5mcm9ta2V5cywgbGlzdCwgdHVwbGU6CisgICAgICAgICAgICB4ID0gV2Vha1NldChbXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5pbnRlcnNlY3Rpb24oQyhzZWxmLml0ZW1zKSksIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGkpLCBsZW4oc2VsZi5pdGVtczIpKQorICAgICAgICBzZWxmLml0ZW1zMi5wb3AoKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaSksIGxlbihzZWxmLml0ZW1zMikpCisKKyAgICBkZWYgdGVzdF9pc2Rpc2pvaW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zLmlzZGlzam9pbnQoV2Vha1NldChzZWxmLml0ZW1zMikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYucy5pc2Rpc2pvaW50KFdlYWtTZXQoc2VsZi5sZXR0ZXJzKSkpCisKKyAgICBkZWYgdGVzdF9hbmQoc2VsZik6CisgICAgICAgIGkgPSBzZWxmLnMuaW50ZXJzZWN0aW9uKHNlbGYuaXRlbXMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyAmIHNldChzZWxmLml0ZW1zMiksIGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zICYgZnJvemVuc2V0KHNlbGYuaXRlbXMyKSwgaSkKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2Uoc2VsZik6CisgICAgICAgIGkgPSBzZWxmLnMuZGlmZmVyZW5jZShzZWxmLml0ZW1zMikKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5sZXR0ZXJzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjIGluIGksIGMgaW4gc2VsZi5kIGFuZCBjIG5vdCBpbiBzZWxmLml0ZW1zMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMsIFdlYWtTZXQoc2VsZi5pdGVtcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShpKSwgV2Vha1NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuZGlmZmVyZW5jZSwgW1tdXSkKKworICAgIGRlZiB0ZXN0X3N1YihzZWxmKToKKyAgICAgICAgaSA9IHNlbGYucy5kaWZmZXJlbmNlKHNlbGYuaXRlbXMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyAtIHNldChzZWxmLml0ZW1zMiksIGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zIC0gZnJvemVuc2V0KHNlbGYuaXRlbXMyKSwgaSkKKworICAgIGRlZiB0ZXN0X3N5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYuaXRlbXMyKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmxldHRlcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMgaW4gaSwgKGMgaW4gc2VsZi5kKSBeIChjIGluIHNlbGYuaXRlbXMyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMsIFdlYWtTZXQoc2VsZi5pdGVtcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShpKSwgV2Vha1NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuc3ltbWV0cmljX2RpZmZlcmVuY2UsIFtbXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGkpLCBsZW4oc2VsZi5pdGVtcykgKyBsZW4oc2VsZi5pdGVtczIpKQorICAgICAgICBzZWxmLml0ZW1zMi5wb3AoKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaSksIGxlbihzZWxmLml0ZW1zKSArIGxlbihzZWxmLml0ZW1zMikpCisKKyAgICBkZWYgdGVzdF94b3Ioc2VsZik6CisgICAgICAgIGkgPSBzZWxmLnMuc3ltbWV0cmljX2RpZmZlcmVuY2Uoc2VsZi5pdGVtczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zIF4gc2V0KHNlbGYuaXRlbXMyKSwgaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMgXiBmcm96ZW5zZXQoc2VsZi5pdGVtczIpLCBpKQorCisgICAgZGVmIHRlc3Rfc3ViX2FuZF9zdXBlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuYWJfd2Vha3NldCA8PSBzZWxmLmFiY2RlX3dlYWtzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmFiY2RlX3dlYWtzZXQgPD0gc2VsZi5hYmNkZV93ZWFrc2V0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5hYmNkZV93ZWFrc2V0ID49IHNlbGYuYWJfd2Vha3NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmFiY2RlX3dlYWtzZXQgPD0gc2VsZi5kZWZfd2Vha3NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmFiY2RlX3dlYWtzZXQgPj0gc2VsZi5kZWZfd2Vha3NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldCgnYScpLmlzc3Vic2V0KCdhYmMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldCgnYWJjJykuaXNzdXBlcnNldCgnYScpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNldCgnYScpLmlzc3Vic2V0KCdjYnMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZXQoJ2NicycpLmlzc3VwZXJzZXQoJ2EnKSkKKworICAgIGRlZiB0ZXN0X2x0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5hYl93ZWFrc2V0IDwgc2VsZi5hYmNkZV93ZWFrc2V0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuYWJjZGVfd2Vha3NldCA8IHNlbGYuZGVmX3dlYWtzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5hYl93ZWFrc2V0IDwgc2VsZi5hYl93ZWFrc2V0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFdlYWtTZXQoKSA8IFdlYWtTZXQoKSkKKworICAgIGRlZiB0ZXN0X2d0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5hYmNkZV93ZWFrc2V0ID4gc2VsZi5hYl93ZWFrc2V0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuYWJjZGVfd2Vha3NldCA+IHNlbGYuZGVmX3dlYWtzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5hYl93ZWFrc2V0ID4gc2VsZi5hYl93ZWFrc2V0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFdlYWtTZXQoKSA+IFdlYWtTZXQoKSkKKworICAgIGRlZiB0ZXN0X2djKHNlbGYpOgorICAgICAgICAjIENyZWF0ZSBhIG5lc3Qgb2YgY3ljbGVzIHRvIGV4ZXJjaXNlIG92ZXJhbGwgcmVmIGNvdW50IGNoZWNrCisgICAgICAgIHMgPSBXZWFrU2V0KEZvbygpIGZvciBpIGluIHJhbmdlKDEwMDApKQorICAgICAgICBmb3IgZWxlbSBpbiBzOgorICAgICAgICAgICAgZWxlbS5jeWNsZSA9IHMKKyAgICAgICAgICAgIGVsZW0uc3ViID0gZWxlbQorICAgICAgICAgICAgZWxlbS5zZXQgPSBXZWFrU2V0KFtlbGVtXSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3dpdGhfY3VzdG9tX2hhc2goc2VsZik6CisgICAgICAgICMgQnVnICMxMjU3NzMxCisgICAgICAgIGNsYXNzIEgoV2Vha1NldCk6CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGludChpZChzZWxmKSAmIDB4N2ZmZmZmZmYpCisgICAgICAgIHM9SCgpCisgICAgICAgIGY9c2V0KCkKKyAgICAgICAgZi5hZGQocykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzLCBmKQorICAgICAgICBmLnJlbW92ZShzKQorICAgICAgICBmLmFkZChzKQorICAgICAgICBmLmRpc2NhcmQocykKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgIHMgPSBXZWFrU2V0KCkKKyAgICAgICAgcy5fX2luaXRfXyhzZWxmLml0ZW1zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHNlbGYucykKKyAgICAgICAgcy5fX2luaXRfXyhzZWxmLml0ZW1zMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBXZWFrU2V0KHNlbGYuaXRlbXMyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzLl9faW5pdF9fLCBzLCAyKTsKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzLl9faW5pdF9fLCAxKTsKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yX2lkZW50aXR5KHNlbGYpOgorICAgICAgICBzID0gV2Vha1NldChzZWxmLml0ZW1zKQorICAgICAgICB0ID0gV2Vha1NldChzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKHMpLCBpZCh0KSkKKworICAgIGRlZiB0ZXN0X2hhc2goc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgc2VsZi5zKQorCisgICAgZGVmIHRlc3RfY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYucy5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLCBXZWFrU2V0KFtdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zKSwgMCkKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIGR1cCA9IHNlbGYucy5jb3B5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMsIGR1cCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChzZWxmLnMpLCBpZChkdXApKQorCisgICAgZGVmIHRlc3RfYWRkKHNlbGYpOgorICAgICAgICB4ID0gU29tZUNsYXNzKCdRJykKKyAgICAgICAgc2VsZi5zLmFkZCh4KQorICAgICAgICBzZWxmLmFzc2VydEluKHgsIHNlbGYucykKKyAgICAgICAgZHVwID0gc2VsZi5zLmNvcHkoKQorICAgICAgICBzZWxmLnMuYWRkKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLCBkdXApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLmFkZCwgW10pCisgICAgICAgIHNlbGYuZnMuYWRkKEZvbygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuZnMpID09IDEpCisgICAgICAgIHNlbGYuZnMuYWRkKHNlbGYub2JqKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuZnMpID09IDEpCisKKyAgICBkZWYgdGVzdF9yZW1vdmUoc2VsZik6CisgICAgICAgIHggPSBTb21lQ2xhc3MoJ2EnKQorICAgICAgICBzZWxmLnMucmVtb3ZlKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oeCwgc2VsZi5zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgc2VsZi5zLnJlbW92ZSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMucmVtb3ZlLCBbXSkKKworICAgIGRlZiB0ZXN0X2Rpc2NhcmQoc2VsZik6CisgICAgICAgIGEsIHEgPSBTb21lQ2xhc3MoJ2EnKSwgU29tZUNsYXNzKCdRJykKKyAgICAgICAgc2VsZi5zLmRpc2NhcmQoYSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihhLCBzZWxmLnMpCisgICAgICAgIHNlbGYucy5kaXNjYXJkKHEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLmRpc2NhcmQsIFtdKQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5zKSk6CisgICAgICAgICAgICBlbGVtID0gc2VsZi5zLnBvcCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGVsZW0sIHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHNlbGYucy5wb3ApCisKKyAgICBkZWYgdGVzdF91cGRhdGUoc2VsZik6CisgICAgICAgIHJldHZhbCA9IHNlbGYucy51cGRhdGUoc2VsZi5pdGVtczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0dmFsLCBOb25lKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi5pdGVtcyArIHNlbGYuaXRlbXMyKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy51cGRhdGUsIFtbXV0pCisKKyAgICBkZWYgdGVzdF91cGRhdGVfc2V0KHNlbGYpOgorICAgICAgICBzZWxmLnMudXBkYXRlKHNldChzZWxmLml0ZW1zMikpCisgICAgICAgIGZvciBjIGluIChzZWxmLml0ZW1zICsgc2VsZi5pdGVtczIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihjLCBzZWxmLnMpCisKKyAgICBkZWYgdGVzdF9pb3Ioc2VsZik6CisgICAgICAgIHNlbGYucyB8PSBzZXQoc2VsZi5pdGVtczIpCisgICAgICAgIGZvciBjIGluIChzZWxmLml0ZW1zICsgc2VsZi5pdGVtczIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihjLCBzZWxmLnMpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fdXBkYXRlKHNlbGYpOgorICAgICAgICByZXR2YWwgPSBzZWxmLnMuaW50ZXJzZWN0aW9uX3VwZGF0ZShzZWxmLml0ZW1zMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXR2YWwsIE5vbmUpCisgICAgICAgIGZvciBjIGluIChzZWxmLml0ZW1zICsgc2VsZi5pdGVtczIpOgorICAgICAgICAgICAgaWYgYyBpbiBzZWxmLml0ZW1zMiBhbmQgYyBpbiBzZWxmLml0ZW1zOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGMsIHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuaW50ZXJzZWN0aW9uX3VwZGF0ZSwgW1tdXSkKKworICAgIGRlZiB0ZXN0X2lhbmQoc2VsZik6CisgICAgICAgIHNlbGYucyAmPSBzZXQoc2VsZi5pdGVtczIpCisgICAgICAgIGZvciBjIGluIChzZWxmLml0ZW1zICsgc2VsZi5pdGVtczIpOgorICAgICAgICAgICAgaWYgYyBpbiBzZWxmLml0ZW1zMiBhbmQgYyBpbiBzZWxmLml0ZW1zOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGMsIHNlbGYucykKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2VfdXBkYXRlKHNlbGYpOgorICAgICAgICByZXR2YWwgPSBzZWxmLnMuZGlmZmVyZW5jZV91cGRhdGUoc2VsZi5pdGVtczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0dmFsLCBOb25lKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi5pdGVtcyArIHNlbGYuaXRlbXMyKToKKyAgICAgICAgICAgIGlmIGMgaW4gc2VsZi5pdGVtcyBhbmQgYyBub3QgaW4gc2VsZi5pdGVtczI6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihjLCBzZWxmLnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYywgc2VsZi5zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5kaWZmZXJlbmNlX3VwZGF0ZSwgW1tdXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlLCBbW11dKQorCisgICAgZGVmIHRlc3RfaXN1YihzZWxmKToKKyAgICAgICAgc2VsZi5zIC09IHNldChzZWxmLml0ZW1zMikKKyAgICAgICAgZm9yIGMgaW4gKHNlbGYuaXRlbXMgKyBzZWxmLml0ZW1zMik6CisgICAgICAgICAgICBpZiBjIGluIHNlbGYuaXRlbXMgYW5kIGMgbm90IGluIHNlbGYuaXRlbXMyOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGMsIHNlbGYucykKKworICAgIGRlZiB0ZXN0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShzZWxmKToKKyAgICAgICAgcmV0dmFsID0gc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShzZWxmLml0ZW1zMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXR2YWwsIE5vbmUpCisgICAgICAgIGZvciBjIGluIChzZWxmLml0ZW1zICsgc2VsZi5pdGVtczIpOgorICAgICAgICAgICAgaWYgKGMgaW4gc2VsZi5pdGVtcykgXiAoYyBpbiBzZWxmLml0ZW1zMik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihjLCBzZWxmLnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYywgc2VsZi5zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUsIFtbXV0pCisKKyAgICBkZWYgdGVzdF9peG9yKHNlbGYpOgorICAgICAgICBzZWxmLnMgXj0gc2V0KHNlbGYuaXRlbXMyKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi5pdGVtcyArIHNlbGYuaXRlbXMyKToKKyAgICAgICAgICAgIGlmIChjIGluIHNlbGYuaXRlbXMpIF4gKGMgaW4gc2VsZi5pdGVtczIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGMsIHNlbGYucykKKworICAgIGRlZiB0ZXN0X2lucGxhY2Vfb25fc2VsZihzZWxmKToKKyAgICAgICAgdCA9IHNlbGYucy5jb3B5KCkKKyAgICAgICAgdCB8PSB0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgc2VsZi5zKQorICAgICAgICB0ICY9IHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBzZWxmLnMpCisgICAgICAgIHQgLT0gdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIFdlYWtTZXQoKSkKKyAgICAgICAgdCA9IHNlbGYucy5jb3B5KCkKKyAgICAgICAgdCBePSB0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgV2Vha1NldCgpKQorCisgICAgZGVmIHRlc3RfZXEoc2VsZik6CisgICAgICAgICMgaXNzdWUgNTk2NAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zID09IHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucyA9PSBXZWFrU2V0KHNlbGYuaXRlbXMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucyA9PSBzZXQoc2VsZi5pdGVtcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5zID09IGxpc3Qoc2VsZi5pdGVtcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5zID09IHR1cGxlKHNlbGYuaXRlbXMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucyA9PSAxKQorCisgICAgZGVmIHRlc3Rfd2Vha19kZXN0cm95X3doaWxlX2l0ZXJhdGluZyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjNzEwNTogaXRlcmF0b3JzIHNob3VsZG4ndCBjcmFzaCB3aGVuIGEga2V5IGlzIGltcGxpY2l0bHkgcmVtb3ZlZAorICAgICAgICAjIENyZWF0ZSBuZXcgaXRlbXMgdG8gYmUgc3VyZSBuby1vbmUgZWxzZSBob2xkcyBhIHJlZmVyZW5jZQorICAgICAgICBpdGVtcyA9IFtTb21lQ2xhc3MoYykgZm9yIGMgaW4gKCdhJywgJ2InLCAnYycpXQorICAgICAgICBzID0gV2Vha1NldChpdGVtcykKKyAgICAgICAgaXQgPSBpdGVyKHMpCisgICAgICAgIG5leHQoaXQpICAgICAgICAgICAgICMgVHJpZ2dlciBpbnRlcm5hbCBpdGVyYXRpb24KKyAgICAgICAgIyBEZXN0cm95IGFuIGl0ZW0KKyAgICAgICAgZGVsIGl0ZW1zWy0xXQorICAgICAgICBnYy5jb2xsZWN0KCkgICAgIyBqdXN0IGluIGNhc2UKKyAgICAgICAgIyBXZSBoYXZlIHJlbW92ZWQgZWl0aGVyIHRoZSBmaXJzdCBjb25zdW1lZCBpdGVtcywgb3IgYW5vdGhlciBvbmUKKyAgICAgICAgc2VsZi5hc3NlcnRJbihsZW4obGlzdChpdCkpLCBbbGVuKGl0ZW1zKSwgbGVuKGl0ZW1zKSAtIDFdKQorICAgICAgICBkZWwgaXQKKyAgICAgICAgIyBUaGUgcmVtb3ZhbCBoYXMgYmVlbiBjb21taXR0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIGxlbihpdGVtcykpCisKKyAgICBkZWYgdGVzdF93ZWFrX2Rlc3Ryb3lfYW5kX211dGF0ZV93aGlsZV9pdGVyYXRpbmcoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzcxMDU6IGl0ZXJhdG9ycyBzaG91bGRuJ3QgY3Jhc2ggd2hlbiBhIGtleSBpcyBpbXBsaWNpdGx5IHJlbW92ZWQKKyAgICAgICAgaXRlbXMgPSBbU29tZUNsYXNzKGMpIGZvciBjIGluIHN0cmluZy5hc2NpaV9sZXR0ZXJzXQorICAgICAgICBzID0gV2Vha1NldChpdGVtcykKKyAgICAgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIHRlc3Rjb250ZXh0KCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXQgPSBpdGVyKHMpCisgICAgICAgICAgICAgICAgbmV4dChpdCkKKyAgICAgICAgICAgICAgICAjIFNjaGVkdWxlIGFuIGl0ZW0gZm9yIHJlbW92YWwgYW5kIHJlY3JlYXRlIGl0CisgICAgICAgICAgICAgICAgdSA9IFNvbWVDbGFzcyhzdHIoaXRlbXMucG9wKCkpKQorICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKSAgICAgICMganVzdCBpbiBjYXNlCisgICAgICAgICAgICAgICAgeWllbGQgdQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpdCA9IE5vbmUgICAgICAgICAgICMgc2hvdWxkIGNvbW1pdCBhbGwgcmVtb3ZhbHMKKworICAgICAgICB3aXRoIHRlc3Rjb250ZXh0KCkgYXMgdToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4odSwgcykKKyAgICAgICAgd2l0aCB0ZXN0Y29udGV4dCgpIGFzIHU6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgcy5yZW1vdmUsIHUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4odSwgcykKKyAgICAgICAgd2l0aCB0ZXN0Y29udGV4dCgpIGFzIHU6CisgICAgICAgICAgICBzLmFkZCh1KQorICAgICAgICBzZWxmLmFzc2VydEluKHUsIHMpCisgICAgICAgIHQgPSBzLmNvcHkoKQorICAgICAgICB3aXRoIHRlc3Rjb250ZXh0KCkgYXMgdToKKyAgICAgICAgICAgIHMudXBkYXRlKHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBsZW4odCkpCisgICAgICAgIHdpdGggdGVzdGNvbnRleHQoKSBhcyB1OgorICAgICAgICAgICAgcy5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCAwKQorCisgICAgZGVmIHRlc3RfbGVuX2N5Y2xlcyhzZWxmKToKKyAgICAgICAgTiA9IDIwCisgICAgICAgIGl0ZW1zID0gW1JlZkN5Y2xlKCkgZm9yIGkgaW4gcmFuZ2UoTildCisgICAgICAgIHMgPSBXZWFrU2V0KGl0ZW1zKQorICAgICAgICBkZWwgaXRlbXMKKyAgICAgICAgaXQgPSBpdGVyKHMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHQoaXQpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgbjEgPSBsZW4ocykKKyAgICAgICAgZGVsIGl0CisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBuMiA9IGxlbihzKQorICAgICAgICAjIG9uZSBpdGVtIG1heSBiZSBrZXB0IGFsaXZlIGluc2lkZSB0aGUgaXRlcmF0b3IKKyAgICAgICAgc2VsZi5hc3NlcnRJbihuMSwgKDAsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4yLCAwKQorCisgICAgZGVmIHRlc3RfbGVuX3JhY2Uoc2VsZik6CisgICAgICAgICMgRXh0ZW5kZWQgc2FuaXR5IGNoZWNrcyBmb3IgbGVuKCkgaW4gdGhlIGZhY2Ugb2YgY3ljbGljIGNvbGxlY3Rpb24KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGdjLnNldF90aHJlc2hvbGQsICpnYy5nZXRfdGhyZXNob2xkKCkpCisgICAgICAgIGZvciB0aCBpbiByYW5nZSgxLCAxMDApOgorICAgICAgICAgICAgTiA9IDIwCisgICAgICAgICAgICBnYy5jb2xsZWN0KDApCisgICAgICAgICAgICBnYy5zZXRfdGhyZXNob2xkKHRoLCB0aCwgdGgpCisgICAgICAgICAgICBpdGVtcyA9IFtSZWZDeWNsZSgpIGZvciBpIGluIHJhbmdlKE4pXQorICAgICAgICAgICAgcyA9IFdlYWtTZXQoaXRlbXMpCisgICAgICAgICAgICBkZWwgaXRlbXMKKyAgICAgICAgICAgICMgQWxsIGl0ZW1zIHdpbGwgYmUgY29sbGVjdGVkIGF0IG5leHQgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhc3MKKyAgICAgICAgICAgIGl0ID0gaXRlcihzKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG5leHQoaXQpCisgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBuMSA9IGxlbihzKQorICAgICAgICAgICAgZGVsIGl0CisgICAgICAgICAgICBuMiA9IGxlbihzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobjEsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChuMSwgTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKG4yLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobjIsIG4xKQorCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RXZWFrU2V0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrc2V0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dlYWtzZXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTdkODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrc2V0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrc2V0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dlYWtzZXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OTdkODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrc2V0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aGljaGRiLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2hpY2hkYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdlMzIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2hpY2hkYi5weQpAQCAtMCwwICsxLDY4IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJUZXN0IHNjcmlwdCBmb3IgdGhlIHdoaWNoZGIgbW9kdWxlCisgICBiYXNlZCBvbiB0ZXN0X2FueWRibS5weQorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3aGljaGRiCitpbXBvcnQgZ2xvYgorCitfZm5hbWUgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5URVNURk4KKworIyBTaWxlbmNlIFB5M2sgd2FybmluZworYW55ZGJtID0gdGVzdC50ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnYW55ZGJtJywgZGVwcmVjYXRlZD1UcnVlKQorCitkZWYgX2RlbGV0ZV9maWxlcygpOgorICAgICMgd2UgZG9uJ3Qga25vdyB0aGUgcHJlY2lzZSBuYW1lIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHVzZXMKKyAgICAjIHNvIHdlIHVzZSBnbG9iIHRvIGxvY2F0ZSBhbGwgbmFtZXMKKyAgICBmb3IgZiBpbiBnbG9iLmdsb2IoX2ZuYW1lICsgIioiKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKGYpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBXaGljaERCVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgQWN0dWFsIHRlc3QgbWV0aG9kcyBhcmUgYWRkZWQgdG8gbmFtZXNwYWNlCisgICAgIyBhZnRlciBjbGFzcyBkZWZpbml0aW9uLgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYsICphcmdzKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBfZGVsZXRlX2ZpbGVzKCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgX2RlbGV0ZV9maWxlcygpCisKK2ZvciBuYW1lIGluIGFueWRibS5fbmFtZXM6CisgICAgIyB3ZSBkZWZpbmUgYSBuZXcgdGVzdCBtZXRob2QgZm9yIGVhY2gKKyAgICAjIGNhbmRpZGF0ZSBkYXRhYmFzZSBtb2R1bGUuCisgICAgdHJ5OgorICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgIG1vZCA9IHRlc3QudGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUobmFtZSwgZGVwcmVjYXRlZD1UcnVlKQorICAgIGV4Y2VwdCB1bml0dGVzdC5Ta2lwVGVzdDoKKyAgICAgICAgY29udGludWUKKworICAgIGRlZiB0ZXN0X3doaWNoZGJfbmFtZShzZWxmLCBuYW1lPW5hbWUsIG1vZD1tb2QpOgorICAgICAgICAjIENoZWNrIHdoZXRoZXIgd2hpY2hkYiBjb3JyZWN0bHkgZ3Vlc3NlcyBtb2R1bGUgbmFtZQorICAgICAgICAjIGZvciBkYXRhYmFzZXMgb3BlbmVkIHdpdGggbW9kdWxlIG1vZC4KKyAgICAgICAgIyBUcnkgd2l0aCBlbXB0eSBmaWxlcyBmaXJzdAorICAgICAgICBmID0gbW9kLm9wZW4oX2ZuYW1lLCAnYycpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWUsIHdoaWNoZGIud2hpY2hkYihfZm5hbWUpKQorICAgICAgICAjIE5vdyBhZGQgYSBrZXkKKyAgICAgICAgZiA9IG1vZC5vcGVuKF9mbmFtZSwgJ3cnKQorICAgICAgICBmWyIxIl0gPSAiMSIKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZSwgd2hpY2hkYi53aGljaGRiKF9mbmFtZSkpCisgICAgc2V0YXR0cihXaGljaERCVGVzdENhc2UsInRlc3Rfd2hpY2hkYl8lcyIgJSBuYW1lLCB0ZXN0X3doaWNoZGJfbmFtZSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRyeToKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFdoaWNoREJUZXN0Q2FzZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBfZGVsZXRlX2ZpbGVzKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2hpY2hkYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aGljaGRiLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzAzY2NiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2hpY2hkYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2hpY2hkYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aGljaGRiLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzAzY2NiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2hpY2hkYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2lucmVnLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2lucmVnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNWQwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5yZWcucHkKQEAgLTAsMCArMSw0NTkgQEAKKyMgVGVzdCB0aGUgd2luZG93cyBzcGVjaWZpYyB3aW4zMnJlZyBtb2R1bGUuCisjIE9ubHkgd2luMzJyZWcgZnVuY3Rpb25zIG5vdCBoaXQgaGVyZTogRmx1c2hLZXksIExvYWRLZXkgYW5kIFNhdmVLZXkKKworaW1wb3J0IG9zLCBzeXMsIGVycm5vCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Cit0aHJlYWRpbmcgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgidGhyZWFkaW5nIikKK2Zyb20gcGxhdGZvcm0gaW1wb3J0IG1hY2hpbmUKKworIyBEbyB0aGlzIGZpcnN0IHNvIHRlc3Qgd2lsbCBiZSBza2lwcGVkIGlmIG1vZHVsZSBkb2Vzbid0IGV4aXN0Cit0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnX3dpbnJlZycpCisjIE5vdyBpbXBvcnQgZXZlcnl0aGluZworZnJvbSBfd2lucmVnIGltcG9ydCAqCisKK3RyeToKKyAgICBSRU1PVEVfTkFNRSA9IHN5cy5hcmd2W3N5cy5hcmd2LmluZGV4KCItLXJlbW90ZSIpKzFdCitleGNlcHQgKEluZGV4RXJyb3IsIFZhbHVlRXJyb3IpOgorICAgIFJFTU9URV9OQU1FID0gTm9uZQorCisjIHR1cGxlIG9mIChtYWpvciwgbWlub3IpCitXSU5fVkVSID0gc3lzLmdldHdpbmRvd3N2ZXJzaW9uKClbOjJdCisjIFNvbWUgdGVzdHMgc2hvdWxkIG9ubHkgcnVuIG9uIDY0LWJpdCBhcmNoaXRlY3R1cmVzIHdoZXJlIFdPVzY0IHdpbGwgYmUuCitXSU42NF9NQUNISU5FID0gVHJ1ZSBpZiBtYWNoaW5lKCkgPT0gIkFNRDY0IiBlbHNlIEZhbHNlCisKKyMgU3RhcnRpbmcgd2l0aCBXaW5kb3dzIDcgYW5kIFdpbmRvd3MgU2VydmVyIDIwMDggUjIsIFdPVzY0IG5vIGxvbmdlciB1c2VzCisjIHJlZ2lzdHJ5IHJlZmxlY3Rpb24gYW5kIGZvcm1lcmx5IHJlZmxlY3RlZCBrZXlzIGFyZSBzaGFyZWQgaW5zdGVhZC4KKyMgV2luZG93cyA3IGFuZCBXaW5kb3dzIFNlcnZlciAyMDA4IFIyIGFyZSB2ZXJzaW9uIDYuMS4gRHVlIHRvIHRoaXMsIHNvbWUKKyMgdGVzdHMgYXJlIG9ubHkgdmFsaWQgdXAgdW50aWwgNi4xCitIQVNfUkVGTEVDVElPTiA9IFRydWUgaWYgV0lOX1ZFUiA8ICg2LCAxKSBlbHNlIEZhbHNlCisKKyMgVXNlIGEgcGVyLXByb2Nlc3Mga2V5IHRvIHByZXZlbnQgY29uY3VycmVudCB0ZXN0IHJ1bnMgKGJ1aWxkYm90ISkgZnJvbQorIyBzdG9tcGluZyBvbiBlYWNoIG90aGVyLgordGVzdF9rZXlfYmFzZSA9ICJQeXRob24gVGVzdCBLZXkgWyVkXSAtIERlbGV0ZSBNZSIgJSAob3MuZ2V0cGlkKCksKQordGVzdF9rZXlfbmFtZSA9ICJTT0ZUV0FSRVxcIiArIHRlc3Rfa2V5X2Jhc2UKKyMgT24gT1MnZXMgdGhhdCBzdXBwb3J0IHJlZmxlY3Rpb24gd2Ugc2hvdWxkIHRlc3Qgd2l0aCBhIHJlZmxlY3RlZCBrZXkKK3Rlc3RfcmVmbGVjdF9rZXlfbmFtZSA9ICJTT0ZUV0FSRVxcQ2xhc3Nlc1xcIiArIHRlc3Rfa2V5X2Jhc2UKKwordGVzdF9kYXRhID0gWworICAgICgiSW50IFZhbHVlIiwgICAgIDQ1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX0RXT1JEKSwKKyAgICAoIlN0cmluZyBWYWwiLCAgICAiQSBzdHJpbmcgdmFsdWUiLCAgICAgICAgICAgICAgICAgICAgICAgIFJFR19TWiksCisgICAgKCJTdHJpbmdFeHBhbmQiLCAgIlRoZSBwYXRoIGlzICVwYXRoJSIsICAgICAgICAgICAgICAgICAgICBSRUdfRVhQQU5EX1NaKSwKKyAgICAoIk11bHRpLXN0cmluZyIsICBbIkxvdHMiLCAib2YiLCAic3RyaW5nIiwgInZhbHVlcyJdLCAgICAgIFJFR19NVUxUSV9TWiksCisgICAgKCJSYXcgRGF0YSIsICAgICAgKCJiaW5hcnkiK2NocigwKSsiZGF0YSIpLCAgICAgICAgICAgICAgICBSRUdfQklOQVJZKSwKKyAgICAoIkJpZyBTdHJpbmciLCAgICAieCIqKDIqKjE0LTEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19TWiksCisgICAgKCJCaWcgQmluYXJ5IiwgICAgIngiKigyKioxNCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfQklOQVJZKSwKK10KKworaWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICB0ZXN0X2RhdGEgKz0gWworICAgICAgICAodW5pY29kZSgiVW5pY29kZSBWYWwiKSwgIHVuaWNvZGUoIkEgVW5pY29kZSB2YWx1ZSIpLCBSRUdfU1osKSwKKyAgICAgICAgKCJVbmljb2RlRXhwYW5kIiwgdW5pY29kZSgiVGhlIHBhdGggaXMgJXBhdGglIiksIFJFR19FWFBBTkRfU1opLAorICAgICAgICAoIk11bHRpLXVuaWNvZGUiLCBbdW5pY29kZSgiTG90cyIpLCB1bmljb2RlKCJvZiIpLCB1bmljb2RlKCJ1bmljb2RlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlKCJ2YWx1ZXMiKV0sIFJFR19NVUxUSV9TWiksCisgICAgICAgICgiTXVsdGktbWl4ZWQiLCAgIFt1bmljb2RlKCJVbmljb2RlIiksIHVuaWNvZGUoImFuZCIpLCAic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZXMiXSwgUkVHX01VTFRJX1NaKSwKKyAgICBdCisKK2NsYXNzIEJhc2VXaW5yZWdUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgdGhlIHRlc3Qga2V5IGlzIGFic2VudCB3aGVuIHRoZSB0ZXN0CisgICAgICAgICMgc3RhcnRzLgorICAgICAgICBzZWxmLmRlbGV0ZV90cmVlKEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKQorCisgICAgZGVmIGRlbGV0ZV90cmVlKHNlbGYsIHJvb3QsIHN1YmtleSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhrZXkgPSBPcGVuS2V5KHJvb3QsIHN1YmtleSwgS0VZX0FMTF9BQ0NFU1MpCisgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3I6CisgICAgICAgICAgICAjIHN1YmtleSBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3Vic3Via2V5ID0gRW51bUtleShoa2V5LCAwKQorICAgICAgICAgICAgZXhjZXB0IFdpbmRvd3NFcnJvcjoKKyAgICAgICAgICAgICAgICAjIG5vIG1vcmUgc3Via2V5cworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzZWxmLmRlbGV0ZV90cmVlKGhrZXksIHN1YnN1YmtleSkKKyAgICAgICAgQ2xvc2VLZXkoaGtleSkKKyAgICAgICAgRGVsZXRlS2V5KHJvb3QsIHN1YmtleSkKKworICAgIGRlZiBfd3JpdGVfdGVzdF9kYXRhKHNlbGYsIHJvb3Rfa2V5LCBDcmVhdGVLZXk9Q3JlYXRlS2V5KToKKyAgICAgICAgIyBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMga2V5LgorICAgICAgICBTZXRWYWx1ZShyb290X2tleSwgdGVzdF9rZXlfbmFtZSwgUkVHX1NaLCAiRGVmYXVsdCB2YWx1ZSIpCisgICAgICAgIGtleSA9IENyZWF0ZUtleShyb290X2tleSwgdGVzdF9rZXlfbmFtZSkKKyAgICAgICAgIyBDcmVhdGUgYSBzdWIta2V5CisgICAgICAgIHN1Yl9rZXkgPSBDcmVhdGVLZXkoa2V5LCAic3ViX2tleSIpCisgICAgICAgICMgR2l2ZSB0aGUgc3ViLWtleSBzb21lIG5hbWVkIHZhbHVlcworCisgICAgICAgIGZvciB2YWx1ZV9uYW1lLCB2YWx1ZV9kYXRhLCB2YWx1ZV90eXBlIGluIHRlc3RfZGF0YToKKyAgICAgICAgICAgIFNldFZhbHVlRXgoc3ViX2tleSwgdmFsdWVfbmFtZSwgMCwgdmFsdWVfdHlwZSwgdmFsdWVfZGF0YSkKKworICAgICAgICAjIENoZWNrIHdlIHdyb3RlIGFzIG1hbnkgaXRlbXMgYXMgd2UgdGhvdWdodC4KKyAgICAgICAgbmtleXMsIG52YWx1ZXMsIHNpbmNlX21vZCA9IFF1ZXJ5SW5mb0tleShrZXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmtleXMsIDEsICJOb3QgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHN1YiBrZXlzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudmFsdWVzLCAxLCAiTm90IHRoZSBjb3JyZWN0IG51bWJlciBvZiB2YWx1ZXMiKQorICAgICAgICBua2V5cywgbnZhbHVlcywgc2luY2VfbW9kID0gUXVlcnlJbmZvS2V5KHN1Yl9rZXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmtleXMsIDAsICJOb3QgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHN1YiBrZXlzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudmFsdWVzLCBsZW4odGVzdF9kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCB0aGUgY29ycmVjdCBudW1iZXIgb2YgdmFsdWVzIikKKyAgICAgICAgIyBDbG9zZSB0aGlzIGtleSB0aGlzIHdheS4uLgorICAgICAgICAjIChidXQgYmVmb3JlIHdlIGRvLCBjb3B5IHRoZSBrZXkgYXMgYW4gaW50ZWdlciAtIHRoaXMgYWxsb3dzCisgICAgICAgICMgdXMgdG8gdGVzdCB0aGF0IHRoZSBrZXkgcmVhbGx5IGdldHMgY2xvc2VkKS4KKyAgICAgICAgaW50X3N1Yl9rZXkgPSBpbnQoc3ViX2tleSkKKyAgICAgICAgQ2xvc2VLZXkoc3ViX2tleSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgUXVlcnlJbmZvS2V5KGludF9zdWJfa2V5KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJJdCBhcHBlYXJzIHRoZSBDbG9zZUtleSgpIGZ1bmN0aW9uIGRvZXMgIgorICAgICAgICAgICAgICAgICAgICAgICJub3QgY2xvc2UgdGhlIGFjdHVhbCBrZXkhIikKKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgLi4uIGFuZCBjbG9zZSB0aGF0IGtleSB0aGF0IHdheSA6LSkKKyAgICAgICAgaW50X2tleSA9IGludChrZXkpCisgICAgICAgIGtleS5DbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFF1ZXJ5SW5mb0tleShpbnRfa2V5KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJJdCBhcHBlYXJzIHRoZSBrZXkuQ2xvc2UoKSBmdW5jdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgImRvZXMgbm90IGNsb3NlIHRoZSBhY3R1YWwga2V5ISIpCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF9yZWFkX3Rlc3RfZGF0YShzZWxmLCByb290X2tleSwgT3BlbktleT1PcGVuS2V5KToKKyAgICAgICAgIyBDaGVjayB3ZSBjYW4gZ2V0IGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMga2V5LgorICAgICAgICB2YWwgPSBRdWVyeVZhbHVlKHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgIkRlZmF1bHQgdmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpc3RyeSBkaWRuJ3QgZ2l2ZSBiYWNrIHRoZSBjb3JyZWN0IHZhbHVlIikKKworICAgICAgICBrZXkgPSBPcGVuS2V5KHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lKQorICAgICAgICAjIFJlYWQgdGhlIHN1Yi1rZXlzCisgICAgICAgIHdpdGggT3BlbktleShrZXksICJzdWJfa2V5IikgYXMgc3ViX2tleToKKyAgICAgICAgICAgICMgQ2hlY2sgSSBjYW4gZW51bWVyYXRlIG92ZXIgdGhlIHZhbHVlcy4KKyAgICAgICAgICAgIGluZGV4ID0gMAorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBFbnVtVmFsdWUoc3ViX2tleSwgaW5kZXgpCisgICAgICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihkYXRhLCB0ZXN0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlkbid0IHJlYWQgYmFjayB0aGUgY29ycmVjdCB0ZXN0IGRhdGEiKQorICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZGV4LCBsZW4odGVzdF9kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpZG4ndCByZWFkIHRoZSBjb3JyZWN0IG51bWJlciBvZiBpdGVtcyIpCisgICAgICAgICAgICAjIENoZWNrIEkgY2FuIGRpcmVjdGx5IGFjY2VzcyBlYWNoIGl0ZW0KKyAgICAgICAgICAgIGZvciB2YWx1ZV9uYW1lLCB2YWx1ZV9kYXRhLCB2YWx1ZV90eXBlIGluIHRlc3RfZGF0YToKKyAgICAgICAgICAgICAgICByZWFkX3ZhbCwgcmVhZF90eXAgPSBRdWVyeVZhbHVlRXgoc3ViX2tleSwgdmFsdWVfbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRfdmFsLCB2YWx1ZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkaXJlY3RseSByZWFkIHRoZSB2YWx1ZSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkX3R5cCwgdmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGlyZWN0bHkgcmVhZCB0aGUgdmFsdWUiKQorICAgICAgICBzdWJfa2V5LkNsb3NlKCkKKyAgICAgICAgIyBFbnVtZXJhdGUgb3VyIG1haW4ga2V5LgorICAgICAgICByZWFkX3ZhbCA9IEVudW1LZXkoa2V5LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRfdmFsLCAic3ViX2tleSIsICJSZWFkIHN1YmtleSB2YWx1ZSB3cm9uZyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEVudW1LZXkoa2V5LCAxKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJXYXMgYWJsZSB0byBnZXQgYSBzZWNvbmQga2V5IHdoZW4gSSBvbmx5IGhhdmUgb25lISIpCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGtleS5DbG9zZSgpCisKKyAgICBkZWYgX2RlbGV0ZV90ZXN0X2RhdGEoc2VsZiwgcm9vdF9rZXkpOgorICAgICAgICBrZXkgPSBPcGVuS2V5KHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lLCAwLCBLRVlfQUxMX0FDQ0VTUykKKyAgICAgICAgc3ViX2tleSA9IE9wZW5LZXkoa2V5LCAic3ViX2tleSIsIDAsIEtFWV9BTExfQUNDRVNTKQorICAgICAgICAjIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gZGVsZXRlIHRoZSB2YWx1ZXMgYmVmb3JlIGRlbGV0aW5nCisgICAgICAgICMgdGhlIGtleSAoYWx0aG91Z2ggc3Via2V5cyBtdXN0IG5vdCBleGlzdCkuICBXZSBkZWxldGUgdGhlbQorICAgICAgICAjIG1hbnVhbGx5IGp1c3QgdG8gcHJvdmUgd2UgY2FuIDotKQorICAgICAgICBmb3IgdmFsdWVfbmFtZSwgdmFsdWVfZGF0YSwgdmFsdWVfdHlwZSBpbiB0ZXN0X2RhdGE6CisgICAgICAgICAgICBEZWxldGVWYWx1ZShzdWJfa2V5LCB2YWx1ZV9uYW1lKQorCisgICAgICAgIG5rZXlzLCBudmFsdWVzLCBzaW5jZV9tb2QgPSBRdWVyeUluZm9LZXkoc3ViX2tleSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChua2V5cywgMCwgInN1YmtleSBub3QgZW1wdHkgYmVmb3JlIGRlbGV0ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnZhbHVlcywgMCwgInN1YmtleSBub3QgZW1wdHkgYmVmb3JlIGRlbGV0ZSIpCisgICAgICAgIHN1Yl9rZXkuQ2xvc2UoKQorICAgICAgICBEZWxldGVLZXkoa2V5LCAic3ViX2tleSIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBTaG91bGRudCBiZSBhYmxlIHRvIGRlbGV0ZSBpdCB0d2ljZSEKKyAgICAgICAgICAgIERlbGV0ZUtleShrZXksICJzdWJfa2V5IikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRGVsZXRpbmcgdGhlIGtleSB0d2ljZSBzdWNjZWVkZWQiKQorICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAga2V5LkNsb3NlKCkKKyAgICAgICAgRGVsZXRlS2V5KHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lKQorICAgICAgICAjIE9wZW5pbmcgc2hvdWxkIG5vdyBmYWlsIQorICAgICAgICB0cnk6CisgICAgICAgICAgICBrZXkgPSBPcGVuS2V5KHJvb3Rfa2V5LCB0ZXN0X2tleV9uYW1lKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJDb3VsZCBvcGVuIHRoZSBub24tZXhpc3RlbnQga2V5IikKKyAgICAgICAgZXhjZXB0IFdpbmRvd3NFcnJvcjogIyBVc2UgdGhpcyBlcnJvciBuYW1lIHRoaXMgdGltZQorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF90ZXN0X2FsbChzZWxmLCByb290X2tleSk6CisgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3RfZGF0YShyb290X2tleSkKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0X2RhdGEocm9vdF9rZXkpCisgICAgICAgIHNlbGYuX2RlbGV0ZV90ZXN0X2RhdGEocm9vdF9rZXkpCisKK2NsYXNzIExvY2FsV2lucmVnVGVzdHMoQmFzZVdpbnJlZ1Rlc3RzKToKKworICAgIGRlZiB0ZXN0X3JlZ2lzdHJ5X3dvcmtzKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2FsbChIS0VZX0NVUlJFTlRfVVNFUikKKworICAgIGRlZiB0ZXN0X3JlZ2lzdHJ5X3dvcmtzX2V4dGVuZGVkX2Z1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgIyBTdWJzdGl0dXRlIHRoZSByZWd1bGFyIENyZWF0ZUtleSBhbmQgT3BlbktleSBjYWxscyB3aXRoIHRoZWlyCisgICAgICAgICMgZXh0ZW5kZWQgY291bnRlcnBhcnRzLgorICAgICAgICAjIE5vdGU6IERlbGV0ZUtleUV4IGlzIG5vdCB1c2VkIGhlcmUgYmVjYXVzZSBpdCBpcyBwbGF0Zm9ybSBkZXBlbmRlbnQKKyAgICAgICAgY2tlID0gbGFtYmRhIGtleSwgc3ViX2tleTogQ3JlYXRlS2V5RXgoa2V5LCBzdWJfa2V5LCAwLCBLRVlfQUxMX0FDQ0VTUykKKyAgICAgICAgc2VsZi5fd3JpdGVfdGVzdF9kYXRhKEhLRVlfQ1VSUkVOVF9VU0VSLCBja2UpCisKKyAgICAgICAgb2tlID0gbGFtYmRhIGtleSwgc3ViX2tleTogT3BlbktleUV4KGtleSwgc3ViX2tleSwgMCwgS0VZX1JFQUQpCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdF9kYXRhKEhLRVlfQ1VSUkVOVF9VU0VSLCBva2UpCisKKyAgICAgICAgc2VsZi5fZGVsZXRlX3Rlc3RfZGF0YShIS0VZX0NVUlJFTlRfVVNFUikKKworICAgIGRlZiB0ZXN0X2Nvbm5lY3RfcmVnaXN0cnlfdG9fbG9jYWxfbWFjaGluZV93b3JrcyhzZWxmKToKKyAgICAgICAgIyBwZXJmb3JtIG1pbmltYWwgQ29ubmVjdFJlZ2lzdHJ5IHRlc3Qgd2hpY2gganVzdCBpbnZva2VzIGl0CisgICAgICAgIGggPSBDb25uZWN0UmVnaXN0cnkoTm9uZSwgSEtFWV9MT0NBTF9NQUNISU5FKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGguaGFuZGxlLCAwKQorICAgICAgICBoLkNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmhhbmRsZSwgMCkKKworICAgIGRlZiB0ZXN0X2luZXhpc3RhbnRfcmVtb3RlX3JlZ2lzdHJ5KHNlbGYpOgorICAgICAgICBjb25uZWN0ID0gbGFtYmRhOiBDb25uZWN0UmVnaXN0cnkoImFiY2RlZmdoaWprbCIsIEhLRVlfQ1VSUkVOVF9VU0VSKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsIGNvbm5lY3QpCisKKyAgICBkZWYgdGVzdF9leHBhbmRfZW52aXJvbm1lbnRfc3RyaW5ncyhzZWxmKToKKyAgICAgICAgciA9IEV4cGFuZEVudmlyb25tZW50U3RyaW5ncyh1IiV3aW5kaXIlXFx0ZXN0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHIpLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIG9zLmVudmlyb25bIndpbmRpciJdICsgIlxcdGVzdCIpCisKKyAgICBkZWYgdGVzdF9jb250ZXh0X21hbmFnZXIoc2VsZik6CisgICAgICAgICMgZW5zdXJlIHRoYXQgdGhlIGhhbmRsZSBpcyBjbG9zZWQgaWYgYW4gZXhjZXB0aW9uIG9jY3VycworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIENvbm5lY3RSZWdpc3RyeShOb25lLCBIS0VZX0xPQ0FMX01BQ0hJTkUpIGFzIGg6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChoLmhhbmRsZSwgMCkKKyAgICAgICAgICAgICAgICByYWlzZSBXaW5kb3dzRXJyb3IKKyAgICAgICAgZXhjZXB0IFdpbmRvd3NFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5oYW5kbGUsIDApCisKKyAgICBkZWYgdGVzdF9jaGFuZ2luZ192YWx1ZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZTI4MTA6IEEgcmFjZSBjb25kaXRpb24gaW4gMi42IGFuZCAzLjEgbWF5IGNhdXNlCisgICAgICAgICMgRW51bVZhbHVlIG9yIFF1ZXJ5VmFsdWUgdG8gcmFpc2UgIldpbmRvd3NFcnJvcjogTW9yZSBkYXRhIGlzCisgICAgICAgICMgYXZhaWxhYmxlIgorICAgICAgICBkb25lID0gRmFsc2UKKworICAgICAgICBjbGFzcyBWZXJ5QWN0aXZlVGhyZWFkKHRocmVhZGluZy5UaHJlYWQpOgorICAgICAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgICAgICB3aXRoIENyZWF0ZUtleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSkgYXMga2V5OgorICAgICAgICAgICAgICAgICAgICB1c2Vfc2hvcnQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGxvbmdfc3RyaW5nID0gJ3gnKjIwMDAKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgbm90IGRvbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gJ3gnIGlmIHVzZV9zaG9ydCBlbHNlIGxvbmdfc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICB1c2Vfc2hvcnQgPSBub3QgdXNlX3Nob3J0CisgICAgICAgICAgICAgICAgICAgICAgICBTZXRWYWx1ZShrZXksICdjaGFuZ2luZ192YWx1ZScsIFJFR19TWiwgcykKKworICAgICAgICB0aHJlYWQgPSBWZXJ5QWN0aXZlVGhyZWFkKCkKKyAgICAgICAgdGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBDcmVhdGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2tleV9uYW1lKydcXGNoYW5naW5nX3ZhbHVlJykgYXMga2V5OgorICAgICAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKDEwMDApOgorICAgICAgICAgICAgICAgICAgICBudW1fc3Via2V5cywgbnVtX3ZhbHVlcywgdCA9IFF1ZXJ5SW5mb0tleShrZXkpCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG51bV92YWx1ZXMpOgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IEVudW1WYWx1ZShrZXksIGkpCisgICAgICAgICAgICAgICAgICAgICAgICBRdWVyeVZhbHVlKGtleSwgbmFtZVswXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRvbmUgPSBUcnVlCisgICAgICAgICAgICB0aHJlYWQuam9pbigpCisgICAgICAgICAgICB3aXRoIE9wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3Rfa2V5X25hbWUsIDAsIEtFWV9BTExfQUNDRVNTKSBhcyBrZXk6CisgICAgICAgICAgICAgICAgRGVsZXRlS2V5KGtleSwgJ2NoYW5naW5nX3ZhbHVlJykKKyAgICAgICAgICAgIERlbGV0ZUtleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSkKKworICAgIGRlZiB0ZXN0X2xvbmdfa2V5KHNlbGYpOgorICAgICAgICAjIElzc3VlMjgxMCwgaW4gMi42IGFuZCAzLjEgd2hlbiB0aGUga2V5IG5hbWUgd2FzIGV4YWN0bHkgMjU2CisgICAgICAgICMgY2hhcmFjdGVycywgRW51bUtleSByYWlzZWQgIldpbmRvd3NFcnJvcjogTW9yZSBkYXRhIGlzCisgICAgICAgICMgYXZhaWxhYmxlIgorICAgICAgICBuYW1lID0gJ3gnKjI1NgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIENyZWF0ZUtleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSkgYXMga2V5OgorICAgICAgICAgICAgICAgIFNldFZhbHVlKGtleSwgbmFtZSwgUkVHX1NaLCAneCcpCisgICAgICAgICAgICAgICAgbnVtX3N1YmtleXMsIG51bV92YWx1ZXMsIHQgPSBRdWVyeUluZm9LZXkoa2V5KQorICAgICAgICAgICAgICAgIEVudW1LZXkoa2V5LCAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgd2l0aCBPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lLCAwLCBLRVlfQUxMX0FDQ0VTUykgYXMga2V5OgorICAgICAgICAgICAgICAgIERlbGV0ZUtleShrZXksIG5hbWUpCisgICAgICAgICAgICBEZWxldGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3Rfa2V5X25hbWUpCisKKyAgICBkZWYgdGVzdF9keW5hbWljX2tleShzZWxmKToKKyAgICAgICAgIyBJc3N1ZTI4MTAsIHdoZW4gdGhlIHZhbHVlIGlzIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCwgdGhlc2UKKyAgICAgICAgIyByYWlzZSAiV2luZG93c0Vycm9yOiBNb3JlIGRhdGEgaXMgYXZhaWxhYmxlIiBpbiAyLjYgYW5kIDMuMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBFbnVtVmFsdWUoSEtFWV9QRVJGT1JNQU5DRV9EQVRBLCAwKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyBpbiAoZXJybm8uRVBFUk0sIGVycm5vLkVBQ0NFUyk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiYWNjZXNzIGRlbmllZCB0byByZWdpc3RyeSBrZXkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihhcmUgeW91IHJ1bm5pbmcgaW4gYSBub24taW50ZXJhY3RpdmUgc2Vzc2lvbj8pIikKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIFF1ZXJ5VmFsdWVFeChIS0VZX1BFUkZPUk1BTkNFX0RBVEEsIE5vbmUpCisKKyAgICAjIFJlZmxlY3Rpb24gcmVxdWlyZXMgWFAgeDY0L1Zpc3RhIGF0IGEgbWluaW11bS4gWFAgZG9lc24ndCBoYXZlIHRoaXMgc3R1ZmYKKyAgICAjIG9yIERlbGV0ZUtleUV4IHNvIG1ha2Ugc3VyZSB0aGVpciB1c2UgcmFpc2VzIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhXSU5fVkVSIDwgKDUsIDIpLCAiUmVxdWlyZXMgV2luZG93cyBYUCIpCisgICAgZGVmIHRlc3RfcmVmbGVjdGlvbl91bnN1cHBvcnRlZChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBDcmVhdGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3Rfa2V5X25hbWUpIGFzIGNrOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoY2suaGFuZGxlLCAwKQorCisgICAgICAgICAgICBrZXkgPSBPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChrZXkuaGFuZGxlLCAwKQorCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IpOgorICAgICAgICAgICAgICAgIERpc2FibGVSZWZsZWN0aW9uS2V5KGtleSkKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvcik6CisgICAgICAgICAgICAgICAgRW5hYmxlUmVmbGVjdGlvbktleShrZXkpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IpOgorICAgICAgICAgICAgICAgIFF1ZXJ5UmVmbGVjdGlvbktleShrZXkpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IpOgorICAgICAgICAgICAgICAgIERlbGV0ZUtleUV4KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgRGVsZXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKQorCisgICAgZGVmIHRlc3Rfc2V0dmFsdWVleF92YWx1ZV9yYW5nZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBJc3N1ZSAjMTQ0MjAsIGFjY2VwdCBwcm9wZXIgcmFuZ2VzIGZvciBTZXRWYWx1ZUV4LgorICAgICAgICAjIFB5MlJlZywgd2hpY2ggZ2V0cyBjYWxsZWQgYnkgU2V0VmFsdWVFeCwgd2FzIHVzaW5nIFB5TG9uZ19Bc0xvbmcsCisgICAgICAgICMgdGh1cyByYWlzaW5nIE92ZXJmbG93RXJyb3IuIFRoZSBpbXBsZW1lbnRhdGlvbiBub3cgdXNlcworICAgICAgICAjIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyB0byBtYXRjaCBEV09SRCdzIHNpemUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggQ3JlYXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKSBhcyBjazoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGNrLmhhbmRsZSwgMCkKKyAgICAgICAgICAgICAgICBTZXRWYWx1ZUV4KGNrLCAidGVzdF9uYW1lIiwgTm9uZSwgUkVHX0RXT1JELCAweDgwMDAwMDAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgRGVsZXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKQorCisgICAgZGVmIHRlc3RfcXVlcnl2YWx1ZWV4X3JldHVybl92YWx1ZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBJc3N1ZSAjMTY3NTksIHJldHVybiB1bnNpZ25lZCBpbnQgZnJvbSBRdWVyeVZhbHVlRXguCisgICAgICAgICMgUmVnMlB5LCB3aGljaCBnZXRzIGNhbGxlZCBieSBRdWVyeVZhbHVlRXgsIHdhcyByZXR1cm5pbmcgYSB2YWx1ZQorICAgICAgICAjIGdlbmVyYXRlZCBieSBQeUxvbmdfRnJvbUxvbmcuIFRoZSBpbXBsbWVudGF0aW9uIG5vdyB1c2VzCisgICAgICAgICMgUHlMb25nX0Zyb21VbnNpZ25lZExvbmcgdG8gbWF0Y2ggRFdPUkQncyBzaXplLgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIENyZWF0ZUtleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSkgYXMgY2s6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChjay5oYW5kbGUsIDApCisgICAgICAgICAgICAgICAgdGVzdF92YWwgPSAweDgwMDAwMDAwCisgICAgICAgICAgICAgICAgU2V0VmFsdWVFeChjaywgInRlc3RfbmFtZSIsIE5vbmUsIFJFR19EV09SRCwgdGVzdF92YWwpCisgICAgICAgICAgICAgICAgcmV0X3ZhbCwgcmV0X3R5cGUgPSBRdWVyeVZhbHVlRXgoY2ssICJ0ZXN0X25hbWUiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0X3R5cGUsIFJFR19EV09SRCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldF92YWwsIHRlc3RfdmFsKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgRGVsZXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKQorCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3MoUkVNT1RFX05BTUUsICJTa2lwcGluZyByZW1vdGUgcmVnaXN0cnkgdGVzdHMiKQorY2xhc3MgUmVtb3RlV2lucmVnVGVzdHMoQmFzZVdpbnJlZ1Rlc3RzKToKKworICAgIGRlZiB0ZXN0X3JlbW90ZV9yZWdpc3RyeV93b3JrcyhzZWxmKToKKyAgICAgICAgcmVtb3RlX2tleSA9IENvbm5lY3RSZWdpc3RyeShSRU1PVEVfTkFNRSwgSEtFWV9DVVJSRU5UX1VTRVIpCisgICAgICAgIHNlbGYuX3Rlc3RfYWxsKHJlbW90ZV9rZXkpCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3MoV0lONjRfTUFDSElORSwgIng2NCBzcGVjaWZpYyByZWdpc3RyeSB0ZXN0cyIpCitjbGFzcyBXaW42NFdpbnJlZ1Rlc3RzKEJhc2VXaW5yZWdUZXN0cyk6CisKKyAgICBkZWYgdGVzdF9yZWZsZWN0aW9uX2Z1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgd2UgY2FuIGNhbGwgdGhlIHF1ZXJ5LCBlbmFibGUsIGFuZCBkaXNhYmxlIGZ1bmN0aW9ucworICAgICAgICAjIG9uIGEga2V5IHdoaWNoIGlzbid0IG9uIHRoZSByZWZsZWN0aW9uIGxpc3Qgd2l0aCBubyBjb25zZXF1ZW5jZXMuCisgICAgICAgIHdpdGggT3BlbktleShIS0VZX0xPQ0FMX01BQ0hJTkUsICJTb2Z0d2FyZSIpIGFzIGtleToKKyAgICAgICAgICAgICMgSEtMTVxTb2Z0d2FyZSBpcyByZWRpcmVjdGVkIGJ1dCBub3QgcmVmbGVjdGVkIGluIGFsbCBPU2VzCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoUXVlcnlSZWZsZWN0aW9uS2V5KGtleSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIEVuYWJsZVJlZmxlY3Rpb25LZXkoa2V5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgRGlzYWJsZVJlZmxlY3Rpb25LZXkoa2V5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShRdWVyeVJlZmxlY3Rpb25LZXkoa2V5KSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKEhBU19SRUZMRUNUSU9OLCAiT1MgZG9lc24ndCBzdXBwb3J0IHJlZmxlY3Rpb24iKQorICAgIGRlZiB0ZXN0X3JlZmxlY3Rpb24oc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHdlIGNhbiBjcmVhdGUsIG9wZW4sIGFuZCBkZWxldGUga2V5cyBpbiB0aGUgMzItYml0CisgICAgICAgICMgYXJlYS4gQmVjYXVzZSB3ZSBhcmUgZG9pbmcgdGhpcyBpbiBhIGtleSB3aGljaCBnZXRzIHJlZmxlY3RlZCwKKyAgICAgICAgIyB0ZXN0IHRoZSBkaWZmZXJlbmNlcyBvZiAzMiBhbmQgNjQtYml0IGtleXMgYmVmb3JlIGFuZCBhZnRlciB0aGUKKyAgICAgICAgIyByZWZsZWN0aW9uIG9jY3VycyAoaWUuIHdoZW4gdGhlIGNyZWF0ZWQga2V5IGlzIGNsb3NlZCkuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggQ3JlYXRlS2V5RXgoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3RfcmVmbGVjdF9rZXlfbmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX0FMTF9BQ0NFU1MgfCBLRVlfV09XNjRfMzJLRVkpIGFzIGNyZWF0ZWRfa2V5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoY3JlYXRlZF9rZXkuaGFuZGxlLCAwKQorCisgICAgICAgICAgICAgICAgIyBUaGUga2V5IHNob3VsZCBub3cgYmUgYXZhaWxhYmxlIGluIHRoZSAzMi1iaXQgYXJlYQorICAgICAgICAgICAgICAgIHdpdGggT3BlbktleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9yZWZsZWN0X2tleV9uYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfQUxMX0FDQ0VTUyB8IEtFWV9XT1c2NF8zMktFWSkgYXMga2V5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGtleS5oYW5kbGUsIDApCisKKyAgICAgICAgICAgICAgICAjIFdyaXRlIGEgdmFsdWUgdG8gd2hhdCBjdXJyZW50bHkgaXMgb25seSBpbiB0aGUgMzItYml0IGFyZWEKKyAgICAgICAgICAgICAgICBTZXRWYWx1ZUV4KGNyZWF0ZWRfa2V5LCAiIiwgMCwgUkVHX1NaLCAiMzJLRVkiKQorCisgICAgICAgICAgICAgICAgIyBUaGUga2V5IGlzIG5vdCByZWZsZWN0ZWQgdW50aWwgY3JlYXRlZF9rZXkgaXMgY2xvc2VkLgorICAgICAgICAgICAgICAgICMgVGhlIDY0LWJpdCB2ZXJzaW9uIG9mIHRoZSBrZXkgc2hvdWxkIG5vdCBiZSBhdmFpbGFibGUgeWV0LgorICAgICAgICAgICAgICAgIG9wZW5fZmFpbCA9IGxhbWJkYTogT3BlbktleShIS0VZX0NVUlJFTlRfVVNFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9yZWZsZWN0X2tleV9uYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfUkVBRCB8IEtFWV9XT1c2NF82NEtFWSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsIG9wZW5fZmFpbCkKKworICAgICAgICAgICAgIyBOb3cgZXhwbGljaXRseSBvcGVuIHRoZSA2NC1iaXQgdmVyc2lvbiBvZiB0aGUga2V5CisgICAgICAgICAgICB3aXRoIE9wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3RfcmVmbGVjdF9rZXlfbmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfQUxMX0FDQ0VTUyB8IEtFWV9XT1c2NF82NEtFWSkgYXMga2V5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoa2V5LmhhbmRsZSwgMCkKKyAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgb3JpZ2luYWwgdmFsdWUgd2Ugc2V0IGlzIHRoZXJlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMzJLRVkiLCBRdWVyeVZhbHVlKGtleSwgIiIpKQorICAgICAgICAgICAgICAgICMgU2V0IGEgbmV3IHZhbHVlLCB3aGljaCB3aWxsIGdldCByZWZsZWN0ZWQgdG8gMzItYml0CisgICAgICAgICAgICAgICAgU2V0VmFsdWVFeChrZXksICIiLCAwLCBSRUdfU1osICI2NEtFWSIpCisKKyAgICAgICAgICAgICMgUmVmbGVjdGlvbiB1c2VzIGEgImxhc3Qtd3JpdGVyIHdpbnMgcG9saWN5LCBzbyB0aGUgdmFsdWUgd2Ugc2V0CisgICAgICAgICAgICAjIG9uIHRoZSA2NC1iaXQga2V5IHNob3VsZCBiZSB0aGUgc2FtZSBvbiAzMi1iaXQKKyAgICAgICAgICAgIHdpdGggT3BlbktleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9yZWZsZWN0X2tleV9uYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9SRUFEIHwgS0VZX1dPVzY0XzMyS0VZKSBhcyBrZXk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiNjRLRVkiLCBRdWVyeVZhbHVlKGtleSwgIiIpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgRGVsZXRlS2V5RXgoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3RfcmVmbGVjdF9rZXlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9XT1c2NF8zMktFWSwgMCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKEhBU19SRUZMRUNUSU9OLCAiT1MgZG9lc24ndCBzdXBwb3J0IHJlZmxlY3Rpb24iKQorICAgIGRlZiB0ZXN0X2Rpc2FibGVfcmVmbGVjdGlvbihzZWxmKToKKyAgICAgICAgIyBNYWtlIHVzZSBvZiBhIGtleSB3aGljaCBnZXRzIHJlZGlyZWN0ZWQgYW5kIHJlZmxlY3RlZAorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIENyZWF0ZUtleUV4KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X3JlZmxlY3Rfa2V5X25hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9BTExfQUNDRVNTIHwgS0VZX1dPVzY0XzMyS0VZKSBhcyBjcmVhdGVkX2tleToKKyAgICAgICAgICAgICAgICAjIFF1ZXJ5UmVmbGVjdGlvbktleSByZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBrZXkgaXMgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICBkaXNhYmxlZCA9IFF1ZXJ5UmVmbGVjdGlvbktleShjcmVhdGVkX2tleSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZGlzYWJsZWQpLCBib29sKQorICAgICAgICAgICAgICAgICMgSEtDVVxTb2Z0d2FyZVxDbGFzc2VzIGlzIHJlZmxlY3RlZCBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkaXNhYmxlZCkKKworICAgICAgICAgICAgICAgIERpc2FibGVSZWZsZWN0aW9uS2V5KGNyZWF0ZWRfa2V5KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShRdWVyeVJlZmxlY3Rpb25LZXkoY3JlYXRlZF9rZXkpKQorCisgICAgICAgICAgICAjIFRoZSBrZXkgaXMgbm93IGNsb3NlZCBhbmQgd291bGQgbm9ybWFsbHkgYmUgcmVmbGVjdGVkIHRvIHRoZQorICAgICAgICAgICAgIyA2NC1iaXQgYXJlYSwgYnV0IGxldCdzIG1ha2Ugc3VyZSB0aGF0IGRpZG4ndCBoYXBwZW4uCisgICAgICAgICAgICBvcGVuX2ZhaWwgPSBsYW1iZGE6IE9wZW5LZXlFeChIS0VZX0NVUlJFTlRfVVNFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcmVmbGVjdF9rZXlfbmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9SRUFEIHwgS0VZX1dPVzY0XzY0S0VZKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCBvcGVuX2ZhaWwpCisKKyAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZSAzMi1iaXQga2V5IGlzIGFjdHVhbGx5IHRoZXJlCisgICAgICAgICAgICB3aXRoIE9wZW5LZXlFeChIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9yZWZsZWN0X2tleV9uYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1JFQUQgfCBLRVlfV09XNjRfMzJLRVkpIGFzIGtleToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGtleS5oYW5kbGUsIDApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBEZWxldGVLZXlFeChIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9yZWZsZWN0X2tleV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1dPVzY0XzMyS0VZLCAwKQorCisgICAgZGVmIHRlc3RfZXhjZXB0aW9uX251bWJlcnMoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yKSBhcyBjdHg6CisgICAgICAgICAgICBRdWVyeVZhbHVlKEhLRVlfQ0xBU1NFU19ST09ULCAnc29tZV92YWx1ZV90aGF0X2RvZXNfbm90X2V4aXN0JykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN0eC5leGNlcHRpb24uZXJybm8sIDIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KExvY2FsV2lucmVnVGVzdHMsIFJlbW90ZVdpbnJlZ1Rlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2luNjRXaW5yZWdUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBpZiBub3QgUkVNT1RFX05BTUU6CisgICAgICAgIHByaW50ICJSZW1vdGUgcmVnaXN0cnkgY2FsbHMgY2FuIGJlIHRlc3RlZCB1c2luZyIsCisgICAgICAgIHByaW50ICIndGVzdF93aW5yZWcucHkgLS1yZW1vdGUgXFxcXG1hY2hpbmVfbmFtZSciCisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpbnJlZy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5yZWcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOGEzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5yZWcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpbnJlZy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5yZWcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOGEzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5yZWcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpbnNvdW5kLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2luc291bmQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NkZWNkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpbnNvdW5kLnB5CkBAIC0wLDAgKzEsMjU2IEBACisjIFJpZGljdWxvdXNseSBzaW1wbGUgdGVzdCBvZiB0aGUgd2luc291bmQgbW9kdWxlIGZvciBXaW5kb3dzLgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Cit0ZXN0X3N1cHBvcnQucmVxdWlyZXMoJ2F1ZGlvJykKK2ltcG9ydCB0aW1lCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCisKK3dpbnNvdW5kID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3dpbnNvdW5kJykKK2N0eXBlcyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdjdHlwZXMnKQoraW1wb3J0IF93aW5yZWcKKworZGVmIGhhc19zb3VuZChzb3VuZCk6CisgICAgIiIiRmluZCBvdXQgaWYgYSBwYXJ0aWN1bGFyIGV2ZW50IGlzIGNvbmZpZ3VyZWQgd2l0aCBhIGRlZmF1bHQgc291bmQiIiIKKyAgICB0cnk6CisgICAgICAgICMgQXNrIHRoZSBtaXhlciBBUEkgZm9yIHRoZSBudW1iZXIgb2YgZGV2aWNlcyBpdCBrbm93cyBhYm91dC4KKyAgICAgICAgIyBXaGVuIHRoZXJlIGFyZSBubyBkZXZpY2VzLCBQbGF5U291bmQgd2lsbCBmYWlsLgorICAgICAgICBpZiBjdHlwZXMud2luZGxsLndpbm1tLm1peGVyR2V0TnVtRGV2cygpIGlzIDA6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBrZXkgPSBfd2lucmVnLk9wZW5LZXlFeChfd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAorICAgICAgICAgICAgICAgICJBcHBFdmVudHNcU2NoZW1lc1xBcHBzXC5EZWZhdWx0XHswfVwuRGVmYXVsdCIuZm9ybWF0KHNvdW5kKSkKKyAgICAgICAgdmFsdWUgPSBfd2lucmVnLkVudW1WYWx1ZShrZXksIDApWzFdCisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCB1IiI6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZXhjZXB0IFdpbmRvd3NFcnJvcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2NsYXNzIEJlZXBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIEFzIHdpdGggUGxheVNvdW5kVGVzdCwgaW5jb3Jwb3JhdGUgdGhlIF9oYXZlX3NvdW5kY2FyZCgpIGNoZWNrCisgICAgIyBpbnRvIG91ciB0ZXN0IG1ldGhvZHMuICBJZiB0aGVyZSdzIG5vIGF1ZGlvIGRldmljZSBwcmVzZW50LAorICAgICMgd2luc291bmQuQmVlcCByZXR1cm5zIDAgYW5kIEdldExhc3RFcnJvcigpIHJldHVybnMgMTI3LCB3aGljaAorICAgICMgaXM6IEVSUk9SX1BST0NfTk9UX0ZPVU5EICgiVGhlIHNwZWNpZmllZCBwcm9jZWR1cmUgY291bGQgbm90CisgICAgIyBiZSBmb3VuZCIpLiAgKEZXSVcsIHZpcnR1YWwvSHlwZXItViBzeXN0ZW1zIGZhbGwgdW5kZXIgdGhpcworICAgICMgc2NlbmFyaW8gYXMgdGhleSBoYXZlIG5vIHNvdW5kIGRldmljZXMgd2hhdHNvZXZlciAgKG5vdCBldmVuCisgICAgIyBhIGxlZ2FjeSBCZWVwIGRldmljZSkuKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHdpbnNvdW5kLkJlZXApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHdpbnNvdW5kLkJlZXAsIDM2LCA3NSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgd2luc291bmQuQmVlcCwgMzI3NjgsIDc1KQorCisgICAgZGVmIHRlc3RfZXh0cmVtZXMoc2VsZik6CisgICAgICAgIHNlbGYuX2JlZXAoMzcsIDc1KQorICAgICAgICBzZWxmLl9iZWVwKDMyNzY3LCA3NSkKKworICAgIGRlZiB0ZXN0X2luY3JlYXNpbmdmcmVxdWVuY3koc2VsZik6CisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDAsIDIwMDAsIDEwMCk6CisgICAgICAgICAgICBzZWxmLl9iZWVwKGksIDc1KQorCisgICAgZGVmIF9iZWVwKHNlbGYsICphcmdzKToKKyAgICAgICAgIyB0aGVzZSB0ZXN0cyB1c2VkIHRvIHVzZSBfaGF2ZV9zb3VuZGNhcmQoKSwgYnV0IGl0J3MgcXVpdGUKKyAgICAgICAgIyBwb3NzaWJsZSB0byBoYXZlIGEgc291bmRjYXJkLCBhbmQgeWV0IGhhdmUgdGhlIGJlZXAgZHJpdmVyCisgICAgICAgICMgZGlzYWJsZWQuIFNvIGJhc2ljYWxseSwgd2UgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyCisgICAgICAgICMgYSBiZWVwIHNob3VsZCBiZSBwcm9kdWNlZCBvciBub3QsIHNvIGN1cnJlbnRseSBpZiB0aGVzZQorICAgICAgICAjIHRlc3RzIGZhaWwgd2UncmUgaWdub3JpbmcgdGhlbQorICAgICAgICAjCisgICAgICAgICMgWFhYIHRoZSByaWdodCBmaXggZm9yIHRoaXMgaXMgdG8gZGVmaW5lIHNvbWV0aGluZyBsaWtlCisgICAgICAgICMgX2hhdmVfZW5hYmxlZF9iZWVwX2RyaXZlcigpIGFuZCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHRoZQorICAgICAgICAjIHRyeS9leGNlcHQgYmVsb3cKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2luc291bmQuQmVlcCgqYXJncykKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgTWVzc2FnZUJlZXBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdGltZS5zbGVlcCgwLjUpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHdpbnNvdW5kLk1lc3NhZ2VCZWVwLCAiYmFkIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aW5zb3VuZC5NZXNzYWdlQmVlcCwgNDIsIDQyKQorICAgICAgICB3aW5zb3VuZC5NZXNzYWdlQmVlcCgpCisKKyAgICBkZWYgdGVzdF9vayhzZWxmKToKKyAgICAgICAgd2luc291bmQuTWVzc2FnZUJlZXAod2luc291bmQuTUJfT0spCisKKyAgICBkZWYgdGVzdF9hc3RlcmlzayhzZWxmKToKKyAgICAgICAgd2luc291bmQuTWVzc2FnZUJlZXAod2luc291bmQuTUJfSUNPTkFTVEVSSVNLKQorCisgICAgZGVmIHRlc3RfZXhjbGFtYXRpb24oc2VsZik6CisgICAgICAgIHdpbnNvdW5kLk1lc3NhZ2VCZWVwKHdpbnNvdW5kLk1CX0lDT05FWENMQU1BVElPTikKKworICAgIGRlZiB0ZXN0X2hhbmQoc2VsZik6CisgICAgICAgIHdpbnNvdW5kLk1lc3NhZ2VCZWVwKHdpbnNvdW5kLk1CX0lDT05IQU5EKQorCisgICAgZGVmIHRlc3RfcXVlc3Rpb24oc2VsZik6CisgICAgICAgIHdpbnNvdW5kLk1lc3NhZ2VCZWVwKHdpbnNvdW5kLk1CX0lDT05RVUVTVElPTikKKworCitjbGFzcyBQbGF5U291bmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aW5zb3VuZC5QbGF5U291bmQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2luc291bmQuUGxheVNvdW5kLCAiYmFkIiwgImJhZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kLAorICAgICAgICAgICAgIm5vbmUiLCB3aW5zb3VuZC5TTkRfQVNZTkMgfCB3aW5zb3VuZC5TTkRfTUVNT1JZCisgICAgICAgICkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc19zb3VuZCgiU3lzdGVtQXN0ZXJpc2siKSwgIk5vIGRlZmF1bHQgU3lzdGVtQXN0ZXJpc2siKQorICAgIGRlZiB0ZXN0X2FsaWFzX2FzdGVyaXNrKHNlbGYpOgorICAgICAgICBpZiBfaGF2ZV9zb3VuZGNhcmQoKToKKyAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgnU3lzdGVtQXN0ZXJpc2snLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kLAorICAgICAgICAgICAgICAgICdTeXN0ZW1Bc3RlcmlzaycsIHdpbnNvdW5kLlNORF9BTElBUworICAgICAgICAgICAgKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzX3NvdW5kKCJTeXN0ZW1FeGNsYW1hdGlvbiIpLCAiTm8gZGVmYXVsdCBTeXN0ZW1FeGNsYW1hdGlvbiIpCisgICAgZGVmIHRlc3RfYWxpYXNfZXhjbGFtYXRpb24oc2VsZik6CisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1FeGNsYW1hdGlvbicsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQsCisgICAgICAgICAgICAgICAgJ1N5c3RlbUV4Y2xhbWF0aW9uJywgd2luc291bmQuU05EX0FMSUFTCisgICAgICAgICAgICApCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNfc291bmQoIlN5c3RlbUV4aXQiKSwgIk5vIGRlZmF1bHQgU3lzdGVtRXhpdCIpCisgICAgZGVmIHRlc3RfYWxpYXNfZXhpdChzZWxmKToKKyAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbUV4aXQnLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kLAorICAgICAgICAgICAgICAgICdTeXN0ZW1FeGl0Jywgd2luc291bmQuU05EX0FMSUFTCisgICAgICAgICAgICApCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNfc291bmQoIlN5c3RlbUhhbmQiKSwgIk5vIGRlZmF1bHQgU3lzdGVtSGFuZCIpCisgICAgZGVmIHRlc3RfYWxpYXNfaGFuZChzZWxmKToKKyAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbUhhbmQnLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kLAorICAgICAgICAgICAgICAgICdTeXN0ZW1IYW5kJywgd2luc291bmQuU05EX0FMSUFTCisgICAgICAgICAgICApCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNfc291bmQoIlN5c3RlbVF1ZXN0aW9uIiksICJObyBkZWZhdWx0IFN5c3RlbVF1ZXN0aW9uIikKKyAgICBkZWYgdGVzdF9hbGlhc19xdWVzdGlvbihzZWxmKToKKyAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbVF1ZXN0aW9uJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICAgICAnU3lzdGVtUXVlc3Rpb24nLCB3aW5zb3VuZC5TTkRfQUxJQVMKKyAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2FsaWFzX2ZhbGxiYWNrKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdCBjYW4ndCBiZSBleHBlY3RlZCB0byB3b3JrIG9uIGFsbCBzeXN0ZW1zLiAgVGhlIE1TCisgICAgICAgICMgUGxheVNvdW5kKCkgZG9jcyBzYXk6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgSWYgaXQgY2Fubm90IGZpbmQgdGhlIHNwZWNpZmllZCBzb3VuZCwgUGxheVNvdW5kIHVzZXMgdGhlCisgICAgICAgICMgICAgIGRlZmF1bHQgc3lzdGVtIGV2ZW50IHNvdW5kIGVudHJ5IGluc3RlYWQuICBJZiB0aGUgZnVuY3Rpb24KKyAgICAgICAgIyAgICAgY2FuIGZpbmQgbmVpdGhlciB0aGUgc3lzdGVtIGRlZmF1bHQgZW50cnkgbm9yIHRoZSBkZWZhdWx0CisgICAgICAgICMgICAgIHNvdW5kLCBpdCBtYWtlcyBubyBzb3VuZCBhbmQgcmV0dXJucyBGQUxTRS4KKyAgICAgICAgIworICAgICAgICAjIEl0J3Mga25vd24gdG8gcmV0dXJuIEZBTFNFIG9uIHNvbWUgcmVhbCBzeXN0ZW1zLgorCisgICAgICAgICMgd2luc291bmQuUGxheVNvdW5kKCchIiQlJi8oIysqJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiB0ZXN0X2FsaWFzX25vZmFsbGJhY2soc2VsZik6CisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgYXNzZXJ0aW5nIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgIyB3aWxsIGdldCByYWlzZWQ6ICB5b3UgY2Fubm90IGNvbnZlcnQgdGhpcyB0bworICAgICAgICAgICAgIyBzZWxmLmFzc2VydFJhaXNlcyguLi4pIGZvcm0uICBUaGUgYXR0ZW1wdCBtYXkgb3IgbWF5IG5vdAorICAgICAgICAgICAgIyByYWlzZSBSdW50aW1lRXJyb3IsIGJ1dCBpdCBzaG91bGRuJ3QgcmFpc2UgYW55dGhpbmcgb3RoZXIKKyAgICAgICAgICAgICMgdGhhbiBSdW50aW1lRXJyb3IsIGFuZCB0aGF0J3MgYWxsIHdlJ3JlIHRyeWluZyB0byB0ZXN0CisgICAgICAgICAgICAjIGhlcmUuICBUaGUgTVMgZG9jcyBhcmVuJ3QgY2xlYXIgYWJvdXQgd2hldGhlciB0aGUgU0RLCisgICAgICAgICAgICAjIFBsYXlTb3VuZCgpIHdpdGggU05EX0FMSUFTIGFuZCBTTkRfTk9ERUZBVUxUIHdpbGwgcmV0dXJuCisgICAgICAgICAgICAjIFRydWUgb3IgRmFsc2Ugd2hlbiB0aGUgYWxpYXMgaXMgdW5rbm93bi4gIE9uIFRpbSdzIFdpblhQCisgICAgICAgICAgICAjIGJveCB0b2RheSwgaXQgcmV0dXJucyBUcnVlIChubyBleGNlcHRpb24gaXMgcmFpc2VkKS4gIFdoYXQKKyAgICAgICAgICAgICMgd2UnZCByZWFsbHkgbGlrZSB0byB0ZXN0IGlzIHRoYXQgbm8gc291bmQgaXMgcGxheWVkLCBidXQKKyAgICAgICAgICAgICMgdGhhdCByZXF1aXJlcyBmaXJzdCB3aXJpbmcgYW4gZWFyZHJ1bSBjbGFzcyBpbnRvIHVuaXR0ZXN0CisgICAgICAgICAgICAjIDx3aW5rPi4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoCisgICAgICAgICAgICAgICAgICAgICchIiQlJi8oIysqJywKKyAgICAgICAgICAgICAgICAgICAgd2luc291bmQuU05EX0FMSUFTIHwgd2luc291bmQuU05EX05PREVGQVVMVAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICAgICAnISIkJSYvKCMrKicsIHdpbnNvdW5kLlNORF9BTElBUyB8IHdpbnNvdW5kLlNORF9OT0RFRkFVTFQKKyAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X3N0b3Bhc3luYyhzZWxmKToKKyAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoCisgICAgICAgICAgICAgICAgJ1N5c3RlbVF1ZXN0aW9uJywKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5TTkRfQUxJQVMgfCB3aW5zb3VuZC5TTkRfQVNZTkMgfCB3aW5zb3VuZC5TTkRfTE9PUAorICAgICAgICAgICAgKQorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKAorICAgICAgICAgICAgICAgICAgICAnU3lzdGVtUXVlc3Rpb24nLAorICAgICAgICAgICAgICAgICAgICB3aW5zb3VuZC5TTkRfQUxJQVMgfCB3aW5zb3VuZC5TTkRfTk9TVE9QCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOiAjIHRoZSBmaXJzdCBzb3VuZCBtaWdodCBhbHJlYWR5IGJlIGZpbmlzaGVkCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKE5vbmUsIHdpbnNvdW5kLlNORF9QVVJHRSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgSXNzdWUgODM2NzogUGxheVNvdW5kKE5vbmUsIHdpbnNvdW5kLlNORF9QVVJHRSkKKyAgICAgICAgICAgICMgZG9lcyBub3QgcmFpc2Ugb24gc3lzdGVtcyB3aXRob3V0IGEgc291bmQgY2FyZC4KKyAgICAgICAgICAgIHBhc3MKKworCitkZWYgX2dldF9jc2NyaXB0X3BhdGgoKToKKyAgICAiIiJSZXR1cm4gdGhlIGZ1bGwgcGF0aCB0byBjc2NyaXB0LmV4ZSBvciBOb25lLiIiIgorICAgIGZvciBkaXIgaW4gb3MuZW52aXJvbi5nZXQoIlBBVEgiLCAiIikuc3BsaXQob3MucGF0aHNlcCk6CisgICAgICAgIGNzY3JpcHRfcGF0aCA9IG9zLnBhdGguam9pbihkaXIsICJjc2NyaXB0LmV4ZSIpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNzY3JpcHRfcGF0aCk6CisgICAgICAgICAgICByZXR1cm4gY3NjcmlwdF9wYXRoCisKK19faGF2ZV9zb3VuZGNhcmRfY2FjaGUgPSBOb25lCitkZWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgIiIiUmV0dXJuIFRydWUgaWZmIHRoaXMgY29tcHV0ZXIgaGFzIGEgc291bmRjYXJkLiIiIgorICAgIGdsb2JhbCBfX2hhdmVfc291bmRjYXJkX2NhY2hlCisgICAgaWYgX19oYXZlX3NvdW5kY2FyZF9jYWNoZSBpcyBOb25lOgorICAgICAgICBjc2NyaXB0X3BhdGggPSBfZ2V0X2NzY3JpcHRfcGF0aCgpCisgICAgICAgIGlmIGNzY3JpcHRfcGF0aCBpcyBOb25lOgorICAgICAgICAgICAgIyBDb3VsZCBub3QgZmluZCBjc2NyaXB0LmV4ZSB0byBydW4gb3VyIFZCU2NyaXB0IGhlbHBlci4gRGVmYXVsdAorICAgICAgICAgICAgIyB0byBUcnVlOiBtb3N0IGNvbXB1dGVycyB0aGVzZSBkYXlzICpkbyogaGF2ZSBhIHNvdW5kY2FyZC4KKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgY2hlY2tfc2NyaXB0ID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hlY2tfc291bmRjYXJkLnZicyIpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtjc2NyaXB0X3BhdGgsIGNoZWNrX3NjcmlwdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIF9faGF2ZV9zb3VuZGNhcmRfY2FjaGUgPSBub3QgcC53YWl0KCkKKyAgICByZXR1cm4gX19oYXZlX3NvdW5kY2FyZF9jYWNoZQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEJlZXBUZXN0LCBNZXNzYWdlQmVlcFRlc3QsIFBsYXlTb3VuZFRlc3QpCisKK2lmIF9fbmFtZV9fPT0iX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5zb3VuZC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5zb3VuZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2MWM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpbnNvdW5kLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5zb3VuZC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5zb3VuZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2MWM3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpbnNvdW5kLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aXRoLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2l0aC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTY0NTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2l0aC5weQpAQCAtMCwwICsxLDc1MCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIlVuaXQgdGVzdHMgZm9yIHRoZSB3aXRoIHN0YXRlbWVudCBzcGVjaWZpZWQgaW4gUEVQIDM0My4iIiIKKworCitfX2F1dGhvcl9fID0gIk1pa2UgQmxhbmQiCitfX2VtYWlsX18gPSAibWJsYW5kIGF0IGFjbSBkb3Qgb3JnIgorCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IEdlbmVyYXRvckNvbnRleHRNYW5hZ2VyLCBjb250ZXh0bWFuYWdlcgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKKworY2xhc3MgTW9ja0NvbnRleHRNYW5hZ2VyKEdlbmVyYXRvckNvbnRleHRNYW5hZ2VyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZ2VuKToKKyAgICAgICAgR2VuZXJhdG9yQ29udGV4dE1hbmFnZXIuX19pbml0X18oc2VsZiwgZ2VuKQorICAgICAgICBzZWxmLmVudGVyX2NhbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuZXhpdF9jYWxsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmV4aXRfYXJncyA9IE5vbmUKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuZW50ZXJfY2FsbGVkID0gVHJ1ZQorICAgICAgICByZXR1cm4gR2VuZXJhdG9yQ29udGV4dE1hbmFnZXIuX19lbnRlcl9fKHNlbGYpCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgIHNlbGYuZXhpdF9jYWxsZWQgPSBUcnVlCisgICAgICAgIHNlbGYuZXhpdF9hcmdzID0gKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spCisgICAgICAgIHJldHVybiBHZW5lcmF0b3JDb250ZXh0TWFuYWdlci5fX2V4aXRfXyhzZWxmLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIHRyYWNlYmFjaykKKworCitkZWYgbW9ja19jb250ZXh0bWFuYWdlcihmdW5jKToKKyAgICBkZWYgaGVscGVyKCphcmdzLCAqKmt3ZHMpOgorICAgICAgICByZXR1cm4gTW9ja0NvbnRleHRNYW5hZ2VyKGZ1bmMoKmFyZ3MsICoqa3dkcykpCisgICAgcmV0dXJuIGhlbHBlcgorCisKK2NsYXNzIE1vY2tSZXNvdXJjZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi55aWVsZGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5zdG9wcGVkID0gRmFsc2UKKworCitAbW9ja19jb250ZXh0bWFuYWdlcgorZGVmIG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCk6CisgICAgbW9jayA9IE1vY2tSZXNvdXJjZSgpCisgICAgdHJ5OgorICAgICAgICBtb2NrLnlpZWxkZWQgPSBUcnVlCisgICAgICAgIHlpZWxkIG1vY2sKKyAgICBmaW5hbGx5OgorICAgICAgICBtb2NrLnN0b3BwZWQgPSBUcnVlCisKKworY2xhc3MgTmVzdGVkKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKm1hbmFnZXJzKToKKyAgICAgICAgc2VsZi5tYW5hZ2VycyA9IG1hbmFnZXJzCisgICAgICAgIHNlbGYuZW50ZXJlZCA9IE5vbmUKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuZW50ZXJlZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ29udGV4dCBpcyBub3QgcmVlbnRyYW50IikKKyAgICAgICAgc2VsZi5lbnRlcmVkID0gZGVxdWUoKQorICAgICAgICB2YXJzID0gW10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIG1nciBpbiBzZWxmLm1hbmFnZXJzOgorICAgICAgICAgICAgICAgIHZhcnMuYXBwZW5kKG1nci5fX2VudGVyX18oKSkKKyAgICAgICAgICAgICAgICBzZWxmLmVudGVyZWQuYXBwZW5kbGVmdChtZ3IpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9fZXhpdF9fKCpzeXMuZXhjX2luZm8oKSk6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIHZhcnMKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pOgorICAgICAgICAjIEJlaGF2ZSBsaWtlIG5lc3RlZCB3aXRoIHN0YXRlbWVudHMKKyAgICAgICAgIyBmaXJzdCBpbiwgbGFzdCBvdXQKKyAgICAgICAgIyBOZXcgZXhjZXB0aW9ucyBvdmVycmlkZSBvbGQgb25lcworICAgICAgICBleCA9IGV4Y19pbmZvCisgICAgICAgIGZvciBtZ3IgaW4gc2VsZi5lbnRlcmVkOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIG1nci5fX2V4aXRfXygqZXgpOgorICAgICAgICAgICAgICAgICAgICBleCA9IChOb25lLCBOb25lLCBOb25lKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGV4ID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgc2VsZi5lbnRlcmVkID0gTm9uZQorICAgICAgICBpZiBleCBpcyBub3QgZXhjX2luZm86CisgICAgICAgICAgICByYWlzZSBleFswXSwgZXhbMV0sIGV4WzJdCisKKworY2xhc3MgTW9ja05lc3RlZChOZXN0ZWQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqbWFuYWdlcnMpOgorICAgICAgICBOZXN0ZWQuX19pbml0X18oc2VsZiwgKm1hbmFnZXJzKQorICAgICAgICBzZWxmLmVudGVyX2NhbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuZXhpdF9jYWxsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmV4aXRfYXJncyA9IE5vbmUKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuZW50ZXJfY2FsbGVkID0gVHJ1ZQorICAgICAgICByZXR1cm4gTmVzdGVkLl9fZW50ZXJfXyhzZWxmKQorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfaW5mbyk6CisgICAgICAgIHNlbGYuZXhpdF9jYWxsZWQgPSBUcnVlCisgICAgICAgIHNlbGYuZXhpdF9hcmdzID0gZXhjX2luZm8KKyAgICAgICAgcmV0dXJuIE5lc3RlZC5fX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pCisKKworY2xhc3MgRmFpbHVyZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdE5hbWVFcnJvcihzZWxmKToKKyAgICAgICAgZGVmIGZvb05vdERlY2xhcmVkKCk6CisgICAgICAgICAgICB3aXRoIGZvbzogcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOYW1lRXJyb3IsIGZvb05vdERlY2xhcmVkKQorCisgICAgZGVmIHRlc3RFbnRlckF0dHJpYnV0ZUVycm9yKHNlbGYpOgorICAgICAgICBjbGFzcyBMYWNrc0VudGVyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBmb29MYWNrc0VudGVyKCk6CisgICAgICAgICAgICBmb28gPSBMYWNrc0VudGVyKCkKKyAgICAgICAgICAgIHdpdGggZm9vOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBmb29MYWNrc0VudGVyKQorCisgICAgZGVmIHRlc3RFeGl0QXR0cmlidXRlRXJyb3Ioc2VsZik6CisgICAgICAgIGNsYXNzIExhY2tzRXhpdChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIGZvb0xhY2tzRXhpdCgpOgorICAgICAgICAgICAgZm9vID0gTGFja3NFeGl0KCkKKyAgICAgICAgICAgIHdpdGggZm9vOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBmb29MYWNrc0V4aXQpCisKKyAgICBkZWYgYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3Ioc2VsZiwgY29kZXN0cik6CisgICAgICAgIGRlZiBzaG91bGRSYWlzZVN5bnRheEVycm9yKHMpOgorICAgICAgICAgICAgY29tcGlsZShzLCAnJywgJ3NpbmdsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBzaG91bGRSYWlzZVN5bnRheEVycm9yLCBjb2Rlc3RyKQorCisgICAgZGVmIHRlc3RBc3NpZ25tZW50VG9Ob25lRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoJ3dpdGggbW9jayBhcyBOb25lOlxuICBwYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNTeW50YXhFcnJvcigKKyAgICAgICAgICAgICd3aXRoIG1vY2sgYXMgKE5vbmUpOlxuJworICAgICAgICAgICAgJyAgcGFzcycpCisKKyAgICBkZWYgdGVzdEFzc2lnbm1lbnRUb0VtcHR5VHVwbGVFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNTeW50YXhFcnJvcigKKyAgICAgICAgICAgICd3aXRoIG1vY2sgYXMgKCk6XG4nCisgICAgICAgICAgICAnICBwYXNzJykKKworICAgIGRlZiB0ZXN0QXNzaWdubWVudFRvVHVwbGVPbmx5Q29udGFpbmluZ05vbmVFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNTeW50YXhFcnJvcignd2l0aCBtb2NrIGFzIE5vbmUsOlxuICBwYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNTeW50YXhFcnJvcigKKyAgICAgICAgICAgICd3aXRoIG1vY2sgYXMgKE5vbmUsKTpcbicKKyAgICAgICAgICAgICcgIHBhc3MnKQorCisgICAgZGVmIHRlc3RBc3NpZ25tZW50VG9UdXBsZUNvbnRhaW5pbmdOb25lRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoCisgICAgICAgICAgICAnd2l0aCBtb2NrIGFzIChmb28sIE5vbmUsIGJhcik6XG4nCisgICAgICAgICAgICAnICBwYXNzJykKKworICAgIGRlZiB0ZXN0RW50ZXJUaHJvd3Moc2VsZik6CisgICAgICAgIGNsYXNzIEVudGVyVGhyb3dzKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiRW50ZXIgdGhyZXciKQorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIHNob3VsZFRocm93KCk6CisgICAgICAgICAgICBjdCA9IEVudGVyVGhyb3dzKCkKKyAgICAgICAgICAgIHNlbGYuZm9vID0gTm9uZQorICAgICAgICAgICAgd2l0aCBjdCBhcyBzZWxmLmZvbzoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2hvdWxkVGhyb3cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mb28sIE5vbmUpCisKKyAgICBkZWYgdGVzdEV4aXRUaHJvd3Moc2VsZik6CisgICAgICAgIGNsYXNzIEV4aXRUaHJvd3Mob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcig0MikKKyAgICAgICAgZGVmIHNob3VsZFRocm93KCk6CisgICAgICAgICAgICB3aXRoIEV4aXRUaHJvd3MoKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2hvdWxkVGhyb3cpCisKK2NsYXNzIENvbnRleHRtYW5hZ2VyQXNzZXJ0aW9uTWl4aW4ob2JqZWN0KToKKyAgICBURVNUX0VYQ0VQVElPTiA9IFJ1bnRpbWVFcnJvcigidGVzdCBleGNlcHRpb24iKQorCisgICAgZGVmIGFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKHNlbGYsIG1vY2tfbWFuYWdlcik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2NrX21hbmFnZXIuZW50ZXJfY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1vY2tfbWFuYWdlci5leGl0X2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX21hbmFnZXIuZXhpdF9hcmdzLCBOb25lKQorCisgICAgZGVmIGFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzKHNlbGYsIG1vY2tfbWFuYWdlciwgZXhpdF9hcmdzKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1vY2tfbWFuYWdlci5lbnRlcl9jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2NrX21hbmFnZXIuZXhpdF9jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9ja19tYW5hZ2VyLmV4aXRfYXJncywgZXhpdF9hcmdzKQorCisgICAgZGVmIGFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzTm9FcnJvcihzZWxmLCBtb2NrX21hbmFnZXIpOgorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzKG1vY2tfbWFuYWdlciwKKyAgICAgICAgICAgIChOb25lLCBOb25lLCBOb25lKSkKKworICAgIGRlZiBhc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKHNlbGYsIG1vY2tfZ2VuZXJhdG9yKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1vY2tfZ2VuZXJhdG9yLnlpZWxkZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobW9ja19nZW5lcmF0b3Iuc3RvcHBlZCkKKworICAgIGRlZiBhc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzTm9FcnJvcihzZWxmLCBtb2NrX2dlbmVyYXRvcik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2NrX2dlbmVyYXRvci55aWVsZGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobW9ja19nZW5lcmF0b3Iuc3RvcHBlZCkKKworICAgIGRlZiByYWlzZVRlc3RFeGNlcHRpb24oc2VsZik6CisgICAgICAgIHJhaXNlIHNlbGYuVEVTVF9FWENFUFRJT04KKworICAgIGRlZiBhc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c1dpdGhFcnJvcihzZWxmLCBtb2NrX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y190eXBlPU5vbmUpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUobW9ja19tYW5hZ2VyLmVudGVyX2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1vY2tfbWFuYWdlci5leGl0X2NhbGxlZCkKKyAgICAgICAgaWYgZXhjX3R5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9ja19tYW5hZ2VyLmV4aXRfYXJnc1sxXSwgc2VsZi5URVNUX0VYQ0VQVElPTikKKyAgICAgICAgICAgIGV4Y190eXBlID0gdHlwZShzZWxmLlRFU1RfRVhDRVBUSU9OKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vY2tfbWFuYWdlci5leGl0X2FyZ3NbMF0sIGV4Y190eXBlKQorICAgICAgICAjIFRlc3QgdGhlIF9fZXhpdF9fIGFyZ3VtZW50cy4gSXNzdWUgIzc4NTMKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1vY2tfbWFuYWdlci5leGl0X2FyZ3NbMV0sIGV4Y190eXBlKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KG1vY2tfbWFuYWdlci5leGl0X2FyZ3NbMl0sIE5vbmUpCisKKyAgICBkZWYgYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c1dpdGhFcnJvcihzZWxmLCBtb2NrX2dlbmVyYXRvcik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2NrX2dlbmVyYXRvci55aWVsZGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobW9ja19nZW5lcmF0b3Iuc3RvcHBlZCkKKworCitjbGFzcyBOb25leGNlcHRpb25hbFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlLCBDb250ZXh0bWFuYWdlckFzc2VydGlvbk1peGluKToKKyAgICBkZWYgdGVzdElubGluZUdlbmVyYXRvclN5bnRheChzZWxmKToKKyAgICAgICAgd2l0aCBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RVbmJvdW5kR2VuZXJhdG9yKHNlbGYpOgorICAgICAgICBtb2NrID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICB3aXRoIG1vY2s6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNOb0Vycm9yKG1vY2spCisKKyAgICBkZWYgdGVzdElubGluZUdlbmVyYXRvckJvdW5kU3ludGF4KHNlbGYpOgorICAgICAgICB3aXRoIG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkgYXMgZm9vOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKGZvbykKKyAgICAgICAgIyBGSVhNRTogSW4gdGhlIGZ1dHVyZSwgd2UnbGwgdHJ5IHRvIGtlZXAgdGhlIGJvdW5kIG5hbWVzIGZyb20gbGVha2luZworICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNOb0Vycm9yKGZvbykKKworICAgIGRlZiB0ZXN0SW5saW5lR2VuZXJhdG9yQm91bmRUb0V4aXN0aW5nVmFyaWFibGUoc2VsZik6CisgICAgICAgIGZvbyA9IE5vbmUKKyAgICAgICAgd2l0aCBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpIGFzIGZvbzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhmb28pCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c05vRXJyb3IoZm9vKQorCisgICAgZGVmIHRlc3RJbmxpbmVHZW5lcmF0b3JCb3VuZFRvRG90dGVkVmFyaWFibGUoc2VsZik6CisgICAgICAgIHdpdGggbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKSBhcyBzZWxmLmZvbzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhzZWxmLmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzTm9FcnJvcihzZWxmLmZvbykKKworICAgIGRlZiB0ZXN0Qm91bmRHZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIG1vY2sgPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgIHdpdGggbW9jayBhcyBmb286CisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aEdlbmVyYXRvckludmFyaWFudHMoZm9vKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhtb2NrKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNOb0Vycm9yKGZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c05vRXJyb3IobW9jaykKKworICAgIGRlZiB0ZXN0TmVzdGVkU2luZ2xlU3RhdGVtZW50cyhzZWxmKToKKyAgICAgICAgbW9ja19hID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICB3aXRoIG1vY2tfYSBhcyBmb286CisgICAgICAgICAgICBtb2NrX2IgPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgICAgICB3aXRoIG1vY2tfYiBhcyBiYXI6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhtb2NrX2EpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhtb2NrX2IpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKGZvbykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aEdlbmVyYXRvckludmFyaWFudHMoYmFyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c05vRXJyb3IobW9ja19iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzTm9FcnJvcihiYXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKG1vY2tfYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhmb28pCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNOb0Vycm9yKG1vY2tfYSkKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzTm9FcnJvcihmb28pCisKKworY2xhc3MgTmVzdGVkTm9uZXhjZXB0aW9uYWxUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSwKKyAgICBDb250ZXh0bWFuYWdlckFzc2VydGlvbk1peGluKToKKyAgICBkZWYgdGVzdFNpbmdsZUFyZ0lubGluZUdlbmVyYXRvclN5bnRheChzZWxmKToKKyAgICAgICAgd2l0aCBOZXN0ZWQobW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdFNpbmdsZUFyZ0JvdW5kVG9Ob25UdXBsZShzZWxmKToKKyAgICAgICAgbSA9IG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkKKyAgICAgICAgIyBUaGlzIHdpbGwgYmluZCBhbGwgdGhlIGFyZ3VtZW50cyB0byBuZXN0ZWQoKSBpbnRvIGEgc2luZ2xlIGxpc3QKKyAgICAgICAgIyBhc3NpZ25lZCB0byBmb28uCisgICAgICAgIHdpdGggTmVzdGVkKG0pIGFzIGZvbzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobSkKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c05vRXJyb3IobSkKKworICAgIGRlZiB0ZXN0U2luZ2xlQXJnQm91bmRUb1NpbmdsZUVsZW1lbnRQYXJlbnRoZXNpemVkTGlzdChzZWxmKToKKyAgICAgICAgbSA9IG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkKKyAgICAgICAgIyBUaGlzIHdpbGwgYmluZCBhbGwgdGhlIGFyZ3VtZW50cyB0byBuZXN0ZWQoKSBpbnRvIGEgc2luZ2xlIGxpc3QKKyAgICAgICAgIyBhc3NpZ25lZCB0byBmb28uCisgICAgICAgIHdpdGggTmVzdGVkKG0pIGFzIChmb28pOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhtKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzTm9FcnJvcihtKQorCisgICAgZGVmIHRlc3RTaW5nbGVBcmdCb3VuZFRvTXVsdGlwbGVFbGVtZW50VHVwbGVFcnJvcihzZWxmKToKKyAgICAgICAgZGVmIHNob3VsZFRocm93VmFsdWVFcnJvcigpOgorICAgICAgICAgICAgd2l0aCBOZXN0ZWQobW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKSkgYXMgKGZvbywgYmFyKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNob3VsZFRocm93VmFsdWVFcnJvcikKKworICAgIGRlZiB0ZXN0U2luZ2xlQXJnVW5ib3VuZChzZWxmKToKKyAgICAgICAgbW9ja19jb250ZXh0bWFuYWdlciA9IG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkKKyAgICAgICAgbW9ja19uZXN0ZWQgPSBNb2NrTmVzdGVkKG1vY2tfY29udGV4dG1hbmFnZXIpCisgICAgICAgIHdpdGggbW9ja19uZXN0ZWQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKG1vY2tfY29udGV4dG1hbmFnZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKG1vY2tfbmVzdGVkKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzTm9FcnJvcihtb2NrX2NvbnRleHRtYW5hZ2VyKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzTm9FcnJvcihtb2NrX25lc3RlZCkKKworICAgIGRlZiB0ZXN0TXVsdGlwbGVBcmdVbmJvdW5kKHNlbGYpOgorICAgICAgICBtID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICBuID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICBvID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICBtb2NrX25lc3RlZCA9IE1vY2tOZXN0ZWQobSwgbiwgbykKKyAgICAgICAgd2l0aCBtb2NrX25lc3RlZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobW9ja19uZXN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNOb0Vycm9yKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNOb0Vycm9yKG4pCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNOb0Vycm9yKG8pCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNOb0Vycm9yKG1vY2tfbmVzdGVkKQorCisgICAgZGVmIHRlc3RNdWx0aXBsZUFyZ0JvdW5kKHNlbGYpOgorICAgICAgICBtb2NrX25lc3RlZCA9IE1vY2tOZXN0ZWQobW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKSwKKyAgICAgICAgICAgIG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCksIG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkpCisgICAgICAgIHdpdGggbW9ja19uZXN0ZWQgYXMgKG0sIG4sIG8pOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKG0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aEdlbmVyYXRvckludmFyaWFudHMobikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhvKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhtb2NrX25lc3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzTm9FcnJvcihtKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNOb0Vycm9yKG4pCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c05vRXJyb3IobykKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c05vRXJyb3IobW9ja19uZXN0ZWQpCisKKworY2xhc3MgRXhjZXB0aW9uYWxUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSwgQ29udGV4dG1hbmFnZXJBc3NlcnRpb25NaXhpbik6CisgICAgZGVmIHRlc3RTaW5nbGVSZXNvdXJjZShzZWxmKToKKyAgICAgICAgY20gPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgd2l0aCBjbSBhcyBzZWxmLnJlc291cmNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMoY20pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKHNlbGYucmVzb3VyY2UpCisgICAgICAgICAgICAgICAgc2VsZi5yYWlzZVRlc3RFeGNlcHRpb24oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNob3VsZFRocm93KQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzV2l0aEVycm9yKGNtKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNXaXRoRXJyb3Ioc2VsZi5yZXNvdXJjZSkKKworICAgIGRlZiB0ZXN0RXhjZXB0aW9uTm9ybWFsaXplZChzZWxmKToKKyAgICAgICAgY20gPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgd2l0aCBjbSBhcyBzZWxmLnJlc291cmNlOgorICAgICAgICAgICAgICAgICMgTm90ZSB0aGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IDEgLy8gMCBwcm9kdWNlcyBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAjIHRoYXQgaXMgbm90IG5vcm1hbGl6ZWQgaW1tZWRpYXRlbHkuCisgICAgICAgICAgICAgICAgMSAvLyAwCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBzaG91bGRUaHJvdykKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c1dpdGhFcnJvcihjbSwgWmVyb0RpdmlzaW9uRXJyb3IpCisKKyAgICBkZWYgdGVzdE5lc3RlZFNpbmdsZVN0YXRlbWVudHMoc2VsZik6CisgICAgICAgIG1vY2tfYSA9IG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkKKyAgICAgICAgbW9ja19iID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggbW9ja19hIGFzIHNlbGYuZm9vOgorICAgICAgICAgICAgICAgIHdpdGggbW9ja19iIGFzIHNlbGYuYmFyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKG1vY2tfYSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhtb2NrX2IpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhzZWxmLmZvbykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKHNlbGYuYmFyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJhaXNlVGVzdEV4Y2VwdGlvbigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2hvdWxkVGhyb3cpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNXaXRoRXJyb3IobW9ja19hKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzV2l0aEVycm9yKG1vY2tfYikKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzV2l0aEVycm9yKHNlbGYuZm9vKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNXaXRoRXJyb3Ioc2VsZi5iYXIpCisKKyAgICBkZWYgdGVzdE11bHRpcGxlUmVzb3VyY2VzSW5TaW5nbGVTdGF0ZW1lbnQoc2VsZik6CisgICAgICAgIGNtX2EgPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgIGNtX2IgPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgIG1vY2tfbmVzdGVkID0gTW9ja05lc3RlZChjbV9hLCBjbV9iKQorICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggbW9ja19uZXN0ZWQgYXMgKHNlbGYucmVzb3VyY2VfYSwgc2VsZi5yZXNvdXJjZV9iKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKGNtX2EpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhjbV9iKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobW9ja19uZXN0ZWQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKHNlbGYucmVzb3VyY2VfYSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aEdlbmVyYXRvckludmFyaWFudHMoc2VsZi5yZXNvdXJjZV9iKQorICAgICAgICAgICAgICAgIHNlbGYucmFpc2VUZXN0RXhjZXB0aW9uKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzaG91bGRUaHJvdykKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c1dpdGhFcnJvcihjbV9hKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzV2l0aEVycm9yKGNtX2IpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNXaXRoRXJyb3IobW9ja19uZXN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c1dpdGhFcnJvcihzZWxmLnJlc291cmNlX2EpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c1dpdGhFcnJvcihzZWxmLnJlc291cmNlX2IpCisKKyAgICBkZWYgdGVzdE5lc3RlZEV4Y2VwdGlvbkJlZm9yZUlubmVyU3RhdGVtZW50KHNlbGYpOgorICAgICAgICBtb2NrX2EgPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgIG1vY2tfYiA9IG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkKKyAgICAgICAgc2VsZi5iYXIgPSBOb25lCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgd2l0aCBtb2NrX2EgYXMgc2VsZi5mb286CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhtb2NrX2EpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKHNlbGYuZm9vKQorICAgICAgICAgICAgICAgIHNlbGYucmFpc2VUZXN0RXhjZXB0aW9uKCkKKyAgICAgICAgICAgICAgICB3aXRoIG1vY2tfYiBhcyBzZWxmLmJhcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNob3VsZFRocm93KQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzV2l0aEVycm9yKG1vY2tfYSkKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzV2l0aEVycm9yKHNlbGYuZm9vKQorCisgICAgICAgICMgVGhlIGlubmVyIHN0YXRlbWVudCBzdHVmZiBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIHRvdWNoZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmJhciwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtb2NrX2IuZW50ZXJfY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1vY2tfYi5leGl0X2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX2IuZXhpdF9hcmdzLCBOb25lKQorCisgICAgZGVmIHRlc3ROZXN0ZWRFeGNlcHRpb25BZnRlcklubmVyU3RhdGVtZW50KHNlbGYpOgorICAgICAgICBtb2NrX2EgPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgIG1vY2tfYiA9IG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkKKyAgICAgICAgZGVmIHNob3VsZFRocm93KCk6CisgICAgICAgICAgICB3aXRoIG1vY2tfYSBhcyBzZWxmLmZvbzoKKyAgICAgICAgICAgICAgICB3aXRoIG1vY2tfYiBhcyBzZWxmLmJhcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhtb2NrX2EpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobW9ja19iKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aEdlbmVyYXRvckludmFyaWFudHMoc2VsZi5mb28pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhzZWxmLmJhcikKKyAgICAgICAgICAgICAgICBzZWxmLnJhaXNlVGVzdEV4Y2VwdGlvbigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2hvdWxkVGhyb3cpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNXaXRoRXJyb3IobW9ja19hKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzTm9FcnJvcihtb2NrX2IpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c1dpdGhFcnJvcihzZWxmLmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzTm9FcnJvcihzZWxmLmJhcikKKworICAgIGRlZiB0ZXN0UmFpc2VkU3RvcEl0ZXJhdGlvbjEoc2VsZik6CisgICAgICAgICMgRnJvbSBidWcgMTQ2MjQ4NQorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIGNtKCk6CisgICAgICAgICAgICB5aWVsZAorCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgd2l0aCBjbSgpOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24oImZyb20gd2l0aCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgc2hvdWxkVGhyb3cpCisKKyAgICBkZWYgdGVzdFJhaXNlZFN0b3BJdGVyYXRpb24yKHNlbGYpOgorICAgICAgICAjIEZyb20gYnVnIDE0NjI0ODUKKyAgICAgICAgY2xhc3MgY20ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggY20oKToKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCJmcm9tIHdpdGgiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHNob3VsZFRocm93KQorCisgICAgZGVmIHRlc3RSYWlzZWRTdG9wSXRlcmF0aW9uMyhzZWxmKToKKyAgICAgICAgIyBBbm90aGVyIHZhcmlhbnQgd2hlcmUgdGhlIGV4Y2VwdGlvbiBoYXNuJ3QgYmVlbiBpbnN0YW50aWF0ZWQKKyAgICAgICAgIyBGcm9tIGJ1ZyAxNzA1MTcwCisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgY20oKToKKyAgICAgICAgICAgIHlpZWxkCisKKyAgICAgICAgZGVmIHNob3VsZFRocm93KCk6CisgICAgICAgICAgICB3aXRoIGNtKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgaXRlcihbXSkubmV4dCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgc2hvdWxkVGhyb3cpCisKKyAgICBkZWYgdGVzdFJhaXNlZEdlbmVyYXRvckV4aXQxKHNlbGYpOgorICAgICAgICAjIEZyb20gYnVnIDE0NjI0ODUKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBjbSgpOgorICAgICAgICAgICAgeWllbGQKKworICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggY20oKToKKyAgICAgICAgICAgICAgICByYWlzZSBHZW5lcmF0b3JFeGl0KCJmcm9tIHdpdGgiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEdlbmVyYXRvckV4aXQsIHNob3VsZFRocm93KQorCisgICAgZGVmIHRlc3RSYWlzZWRHZW5lcmF0b3JFeGl0MihzZWxmKToKKyAgICAgICAgIyBGcm9tIGJ1ZyAxNDYyNDg1CisgICAgICAgIGNsYXNzIGNtIChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgd2l0aCBjbSgpOgorICAgICAgICAgICAgICAgIHJhaXNlIEdlbmVyYXRvckV4aXQoImZyb20gd2l0aCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoR2VuZXJhdG9yRXhpdCwgc2hvdWxkVGhyb3cpCisKKyAgICBkZWYgdGVzdEVycm9yc0luQm9vbChzZWxmKToKKyAgICAgICAgIyBpc3N1ZTQ1ODk6IF9fZXhpdF9fIHJldHVybiBjb2RlIG1heSByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgICAgIyB3aGVuIGxvb2tpbmcgYXQgaXRzIHRydXRoIHZhbHVlLgorCisgICAgICAgIGNsYXNzIGNtKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYm9vbF9jb252ZXJzaW9uKToKKyAgICAgICAgICAgICAgICBjbGFzcyBCb29sOgorICAgICAgICAgICAgICAgICAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYm9vbF9jb252ZXJzaW9uKCkKKyAgICAgICAgICAgICAgICBzZWxmLmV4aXRfcmVzdWx0ID0gQm9vbCgpCisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAzCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgYSwgYiwgYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXhpdF9yZXN1bHQKKworICAgICAgICBkZWYgdHJ1ZUFzQm9vbCgpOgorICAgICAgICAgICAgd2l0aCBjbShsYW1iZGE6IFRydWUpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIE5PVCBzZWUgdGhpcyIpCisgICAgICAgIHRydWVBc0Jvb2woKQorCisgICAgICAgIGRlZiBmYWxzZUFzQm9vbCgpOgorICAgICAgICAgICAgd2l0aCBjbShsYW1iZGE6IEZhbHNlKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCByYWlzZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yLCBmYWxzZUFzQm9vbCkKKworICAgICAgICBkZWYgZmFpbEFzQm9vbCgpOgorICAgICAgICAgICAgd2l0aCBjbShsYW1iZGE6IDEgLy8gMCk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgTk9UIHNlZSB0aGlzIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGZhaWxBc0Jvb2wpCisKKworY2xhc3MgTm9uTG9jYWxGbG93Q29udHJvbFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0V2l0aEJyZWFrKHNlbGYpOgorICAgICAgICBjb3VudGVyID0gMAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgY291bnRlciArPSAxCisgICAgICAgICAgICB3aXRoIG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCk6CisgICAgICAgICAgICAgICAgY291bnRlciArPSAxMAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBjb3VudGVyICs9IDEwMCAjIE5vdCByZWFjaGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnRlciwgMTEpCisKKyAgICBkZWYgdGVzdFdpdGhDb250aW51ZShzZWxmKToKKyAgICAgICAgY291bnRlciA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNvdW50ZXIgKz0gMQorICAgICAgICAgICAgaWYgY291bnRlciA+IDI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHdpdGggbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKToKKyAgICAgICAgICAgICAgICBjb3VudGVyICs9IDEwCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGNvdW50ZXIgKz0gMTAwICMgTm90IHJlYWNoZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudGVyLCAxMikKKworICAgIGRlZiB0ZXN0V2l0aFJldHVybihzZWxmKToKKyAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgY291bnRlciA9IDAKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgY291bnRlciArPSAxCisgICAgICAgICAgICAgICAgd2l0aCBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpOgorICAgICAgICAgICAgICAgICAgICBjb3VudGVyICs9IDEwCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudGVyCisgICAgICAgICAgICAgICAgY291bnRlciArPSAxMDAgIyBOb3QgcmVhY2hlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvbygpLCAxMSkKKworICAgIGRlZiB0ZXN0V2l0aFlpZWxkKHNlbGYpOgorICAgICAgICBkZWYgZ2VuKCk6CisgICAgICAgICAgICB3aXRoIG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCk6CisgICAgICAgICAgICAgICAgeWllbGQgMTIKKyAgICAgICAgICAgICAgICB5aWVsZCAxMworICAgICAgICB4ID0gbGlzdChnZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBbMTIsIDEzXSkKKworICAgIGRlZiB0ZXN0V2l0aFJhaXNlKHNlbGYpOgorICAgICAgICBjb3VudGVyID0gMAorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb3VudGVyICs9IDEKKyAgICAgICAgICAgIHdpdGggbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKToKKyAgICAgICAgICAgICAgICBjb3VudGVyICs9IDEwCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgICAgICBjb3VudGVyICs9IDEwMCAjIE5vdCByZWFjaGVkCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50ZXIsIDExKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgcmFpc2UgUnVudGltZUVycm9yIikKKworCitjbGFzcyBBc3NpZ25tZW50VGFyZ2V0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RTaW5nbGVDb21wbGV4VGFyZ2V0KHNlbGYpOgorICAgICAgICB0YXJnZXRzID0gezE6IFswLCAxLCAyXX0KKyAgICAgICAgd2l0aCBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpIGFzIHRhcmdldHNbMV1bMF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmdldHMua2V5cygpLCBbMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmdldHNbMV1bMF0uX19jbGFzc19fLCBNb2NrUmVzb3VyY2UpCisgICAgICAgIHdpdGggbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKSBhcyB0YXJnZXRzLnZhbHVlcygpWzBdWzFdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJnZXRzLmtleXMoKSwgWzFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJnZXRzWzFdWzFdLl9fY2xhc3NfXywgTW9ja1Jlc291cmNlKQorICAgICAgICB3aXRoIG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkgYXMgdGFyZ2V0c1syXToKKyAgICAgICAgICAgIGtleXMgPSB0YXJnZXRzLmtleXMoKQorICAgICAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5cywgWzEsIDJdKQorICAgICAgICBjbGFzcyBDOiBwYXNzCisgICAgICAgIGJsYWggPSBDKCkKKyAgICAgICAgd2l0aCBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpIGFzIGJsYWguZm9vOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNhdHRyKGJsYWgsICJmb28iKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0TXVsdGlwbGVDb21wbGV4VGFyZ2V0cyhzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6IHJldHVybiAxLCAyLCAzCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgdCwgdiwgdGIpOiBwYXNzCisgICAgICAgIHRhcmdldHMgPSB7MTogWzAsIDEsIDJdfQorICAgICAgICB3aXRoIEMoKSBhcyAodGFyZ2V0c1sxXVswXSwgdGFyZ2V0c1sxXVsxXSwgdGFyZ2V0c1sxXVsyXSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmdldHMsIHsxOiBbMSwgMiwgM119KQorICAgICAgICB3aXRoIEMoKSBhcyAodGFyZ2V0cy52YWx1ZXMoKVswXVsyXSwgdGFyZ2V0cy52YWx1ZXMoKVswXVsxXSwgdGFyZ2V0cy52YWx1ZXMoKVswXVswXSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmdldHMsIHsxOiBbMywgMiwgMV19KQorICAgICAgICB3aXRoIEMoKSBhcyAodGFyZ2V0c1sxXSwgdGFyZ2V0c1syXSwgdGFyZ2V0c1szXSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmdldHMsIHsxOiAxLCAyOiAyLCAzOiAzfSkKKyAgICAgICAgY2xhc3MgQjogcGFzcworICAgICAgICBibGFoID0gQigpCisgICAgICAgIHdpdGggQygpIGFzIChibGFoLm9uZSwgYmxhaC50d28sIGJsYWgudGhyZWUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChibGFoLm9uZSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmxhaC50d28sIDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJsYWgudGhyZWUsIDMpCisKKworY2xhc3MgRXhpdFN3YWxsb3dzRXhjZXB0aW9uVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RFeGl0VHJ1ZVN3YWxsb3dzRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBjbGFzcyBBZnJpY2FuU3dhbGxvdzoKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0LCB2LCB0Yik6IHJldHVybiBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggQWZyaWNhblN3YWxsb3coKToKKyAgICAgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJaZXJvRGl2aXNpb25FcnJvciBzaG91bGQgaGF2ZSBiZWVuIHN3YWxsb3dlZCIpCisKKyAgICBkZWYgdGVzdEV4aXRGYWxzZURvZXNudFN3YWxsb3dFeGNlcHRpb24oc2VsZik6CisgICAgICAgIGNsYXNzIEV1cm9wZWFuU3dhbGxvdzoKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0LCB2LCB0Yik6IHJldHVybiBGYWxzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIEV1cm9wZWFuU3dhbGxvdygpOgorICAgICAgICAgICAgICAgIDEgLy8gMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlplcm9EaXZpc2lvbkVycm9yIHNob3VsZCBoYXZlIGJlZW4gcmFpc2VkIikKKworCitjbGFzcyBOZXN0ZWRXaXRoKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGNsYXNzIER1bW15KG9iamVjdCk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT1Ob25lLCBnb2JibGU9RmFsc2UpOgorICAgICAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYKKyAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgc2VsZi5nb2JibGUgPSBnb2JibGUKKyAgICAgICAgICAgIHNlbGYuZW50ZXJfY2FsbGVkID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuZXhpdF9jYWxsZWQgPSBGYWxzZQorCisgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICBzZWxmLmVudGVyX2NhbGxlZCA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCisKKyAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfaW5mbyk6CisgICAgICAgICAgICBzZWxmLmV4aXRfY2FsbGVkID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5leGNfaW5mbyA9IGV4Y19pbmZvCisgICAgICAgICAgICBpZiBzZWxmLmdvYmJsZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgY2xhc3MgSW5pdFJhaXNlcyhvYmplY3QpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZik6IHJhaXNlIFJ1bnRpbWVFcnJvcigpCisKKyAgICBjbGFzcyBFbnRlclJhaXNlcyhvYmplY3QpOgorICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOiByYWlzZSBSdW50aW1lRXJyb3IoKQorICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKTogcGFzcworCisgICAgY2xhc3MgRXhpdFJhaXNlcyhvYmplY3QpOgorICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOiBwYXNzCisgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pOiByYWlzZSBSdW50aW1lRXJyb3IoKQorCisgICAgZGVmIHRlc3ROb0V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5EdW1teSgpIGFzIGEsIHNlbGYuRHVtbXkoKSBhcyBiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEuZW50ZXJfY2FsbGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIuZW50ZXJfY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYS5leGl0X2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIuZXhpdF9jYWxsZWQpCisKKyAgICBkZWYgdGVzdEV4Y2VwdGlvbkluRXhwckxpc3Qoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggc2VsZi5EdW1teSgpIGFzIGEsIHNlbGYuSW5pdFJhaXNlcygpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFRydWUoYS5lbnRlcl9jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhLmV4aXRfY2FsbGVkKQorCisgICAgZGVmIHRlc3RFeGNlcHRpb25JbkVudGVyKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHNlbGYuRHVtbXkoKSBhcyBhLCBzZWxmLkVudGVyUmFpc2VzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdib2R5IG9mIGJhZCB3aXRoIGV4ZWN1dGVkJykKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnUnVudGltZUVycm9yIG5vdCByZXJhaXNlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhLmVudGVyX2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEuZXhpdF9jYWxsZWQpCisKKyAgICBkZWYgdGVzdEV4Y2VwdGlvbkluRXhpdChzZWxmKToKKyAgICAgICAgYm9keV9leGVjdXRlZCA9IEZhbHNlCisgICAgICAgIHdpdGggc2VsZi5EdW1teShnb2JibGU9VHJ1ZSkgYXMgYSwgc2VsZi5FeGl0UmFpc2VzKCk6CisgICAgICAgICAgICBib2R5X2V4ZWN1dGVkID0gVHJ1ZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYS5lbnRlcl9jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhLmV4aXRfY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYm9keV9leGVjdXRlZCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChhLmV4Y19pbmZvWzBdLCBOb25lKQorCisgICAgZGVmIHRlc3RFbnRlclJldHVybnNUdXBsZShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLkR1bW15KHZhbHVlPSgxLDIpKSBhcyAoYTEsIGEyKSwgXAorICAgICAgICAgICAgIHNlbGYuRHVtbXkodmFsdWU9KDEwLCAyMCkpIGFzIChiMSwgYjIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBhMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgYTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEwLCBiMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjAsIGIyKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEZhaWx1cmVUZXN0Q2FzZSwgTm9uZXhjZXB0aW9uYWxUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgTmVzdGVkTm9uZXhjZXB0aW9uYWxUZXN0Q2FzZSwgRXhjZXB0aW9uYWxUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgTm9uTG9jYWxGbG93Q29udHJvbFRlc3RDYXNlLAorICAgICAgICAgICAgICAgICBBc3NpZ25tZW50VGFyZ2V0VGVzdENhc2UsCisgICAgICAgICAgICAgICAgIEV4aXRTd2FsbG93c0V4Y2VwdGlvblRlc3RDYXNlLAorICAgICAgICAgICAgICAgICBOZXN0ZWRXaXRoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpdGgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2l0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmZWMwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpdGgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpdGgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2l0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmZWMwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpdGgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dzZ2lyZWYucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93c2dpcmVmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZDRjODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93c2dpcmVmLnB5CkBAIC0wLDAgKzEsNTYwIEBACitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMgICAgIyBCYWNrd2FyZCBjb21wYXQgZm9yIDIuMQorZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UKK2Zyb20gd3NnaXJlZi51dGlsIGltcG9ydCBzZXR1cF90ZXN0aW5nX2RlZmF1bHRzCitmcm9tIHdzZ2lyZWYuaGVhZGVycyBpbXBvcnQgSGVhZGVycworZnJvbSB3c2dpcmVmLmhhbmRsZXJzIGltcG9ydCBCYXNlSGFuZGxlciwgQmFzZUNHSUhhbmRsZXIKK2Zyb20gd3NnaXJlZiBpbXBvcnQgdXRpbAorZnJvbSB3c2dpcmVmLnZhbGlkYXRlIGltcG9ydCB2YWxpZGF0b3IKK2Zyb20gd3NnaXJlZi5zaW1wbGVfc2VydmVyIGltcG9ydCBXU0dJU2VydmVyLCBXU0dJUmVxdWVzdEhhbmRsZXIsIGRlbW9fYXBwCitmcm9tIHdzZ2lyZWYuc2ltcGxlX3NlcnZlciBpbXBvcnQgbWFrZV9zZXJ2ZXIKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIFNvY2tldFNlcnZlciBpbXBvcnQgQmFzZVNlcnZlcgoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgTW9ja1NlcnZlcihXU0dJU2VydmVyKToKKyAgICAiIiJOb24tc29ja2V0IEhUVFAgc2VydmVyIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kbGVyQ2xhc3MpOgorICAgICAgICBCYXNlU2VydmVyLl9faW5pdF9fKHNlbGYsIHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzKQorICAgICAgICBzZWxmLnNlcnZlcl9iaW5kKCkKKworICAgIGRlZiBzZXJ2ZXJfYmluZChzZWxmKToKKyAgICAgICAgaG9zdCwgcG9ydCA9IHNlbGYuc2VydmVyX2FkZHJlc3MKKyAgICAgICAgc2VsZi5zZXJ2ZXJfbmFtZSA9IGhvc3QKKyAgICAgICAgc2VsZi5zZXJ2ZXJfcG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5zZXR1cF9lbnZpcm9uKCkKKworCitjbGFzcyBNb2NrSGFuZGxlcihXU0dJUmVxdWVzdEhhbmRsZXIpOgorICAgICIiIk5vbi1zb2NrZXQgSFRUUCBoYW5kbGVyIiIiCisgICAgZGVmIHNldHVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBzZWxmLnJlcXVlc3QKKyAgICAgICAgc2VsZi5yZmlsZSwgc2VsZi53ZmlsZSA9IHNlbGYuY29ubmVjdGlvbgorCisgICAgZGVmIGZpbmlzaChzZWxmKToKKyAgICAgICAgcGFzcworCisKK2RlZiBoZWxsb19hcHAoZW52aXJvbixzdGFydF9yZXNwb25zZSk6CisgICAgc3RhcnRfcmVzcG9uc2UoIjIwMCBPSyIsIFsKKyAgICAgICAgKCdDb250ZW50LVR5cGUnLCd0ZXh0L3BsYWluJyksCisgICAgICAgICgnRGF0ZScsJ01vbiwgMDUgSnVuIDIwMDYgMTg6NDk6NTQgR01UJykKKyAgICBdKQorICAgIHJldHVybiBbIkhlbGxvLCB3b3JsZCEiXQorCitkZWYgcnVuX2Ftb2NrKGFwcD1oZWxsb19hcHAsIGRhdGE9IkdFVCAvIEhUVFAvMS4wXG5cbiIpOgorICAgIHNlcnZlciA9IG1ha2Vfc2VydmVyKCIiLCA4MCwgYXBwLCBNb2NrU2VydmVyLCBNb2NrSGFuZGxlcikKKyAgICBpbnAsIG91dCwgZXJyLCBvbGRlcnIgPSBTdHJpbmdJTyhkYXRhKSwgU3RyaW5nSU8oKSwgU3RyaW5nSU8oKSwgc3lzLnN0ZGVycgorICAgIHN5cy5zdGRlcnIgPSBlcnIKKworICAgIHRyeToKKyAgICAgICAgc2VydmVyLmZpbmlzaF9yZXF1ZXN0KChpbnAsb3V0KSwgKCIxMjcuMC4wLjEiLDg4ODgpKQorICAgIGZpbmFsbHk6CisgICAgICAgIHN5cy5zdGRlcnIgPSBvbGRlcnIKKworICAgIHJldHVybiBvdXQuZ2V0dmFsdWUoKSwgZXJyLmdldHZhbHVlKCkKKworCitkZWYgY29tcGFyZV9nZW5lcmljX2l0ZXIobWFrZV9pdCxtYXRjaCk6CisgICAgIiIiVXRpbGl0eSB0byBjb21wYXJlIGEgZ2VuZXJpYyAyLjEvMi4yKyBpdGVyYXRvciB3aXRoIGFuIGl0ZXJhYmxlCisKKyAgICBJZiBydW5uaW5nIHVuZGVyIFB5dGhvbiAyLjIrLCB0aGlzIHRlc3RzIHRoZSBpdGVyYXRvciB1c2luZyBpdGVyKCkvbmV4dCgpLAorICAgIGFzIHdlbGwgYXMgX19nZXRpdGVtX18uICAnbWFrZV9pdCcgbXVzdCBiZSBhIGZ1bmN0aW9uIHJldHVybmluZyBhIGZyZXNoCisgICAgaXRlcmF0b3IgdG8gYmUgdGVzdGVkIChzaW5jZSB0aGlzIG1heSB0ZXN0IHRoZSBpdGVyYXRvciB0d2ljZSkuIiIiCisKKyAgICBpdCA9IG1ha2VfaXQoKQorICAgIG4gPSAwCisgICAgZm9yIGl0ZW0gaW4gbWF0Y2g6CisgICAgICAgIGlmIG5vdCBpdFtuXT09aXRlbTogcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKyAgICAgICAgbis9MQorICAgIHRyeToKKyAgICAgICAgaXRbbl0KKyAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJUb28gbWFueSBpdGVtcyBmcm9tIF9fZ2V0aXRlbV9fIixpdCkKKworICAgIHRyeToKKyAgICAgICAgaXRlciwgU3RvcEl0ZXJhdGlvbgorICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICAjIE9ubHkgdGVzdCBpdGVyIG1vZGUgdW5kZXIgMi4yKworICAgICAgICBpdCA9IG1ha2VfaXQoKQorICAgICAgICBpZiBub3QgaXRlcihpdCkgaXMgaXQ6IHJhaXNlIEFzc2VydGlvbkVycm9yCisgICAgICAgIGZvciBpdGVtIGluIG1hdGNoOgorICAgICAgICAgICAgaWYgbm90IGl0Lm5leHQoKT09aXRlbTogcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaXQubmV4dCgpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlRvbyBtYW55IGl0ZW1zIGZyb20gLm5leHQoKSIsaXQpCisKKworY2xhc3MgSW50ZWdyYXRpb25UZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2tfaGVsbG8oc2VsZiwgb3V0LCBoYXNfbGVuZ3RoPVRydWUpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwKKyAgICAgICAgICAgICJIVFRQLzEuMCAyMDAgT0tcclxuIgorICAgICAgICAgICAgIlNlcnZlcjogV1NHSVNlcnZlci8wLjEgUHl0aG9uLyIrc3lzLnZlcnNpb24uc3BsaXQoKVswXSsiXHJcbiIKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW5cclxuIgorICAgICAgICAgICAgIkRhdGU6IE1vbiwgMDUgSnVuIDIwMDYgMTg6NDk6NTQgR01UXHJcbiIgKworICAgICAgICAgICAgKGhhc19sZW5ndGggYW5kICAiQ29udGVudC1MZW5ndGg6IDEzXHJcbiIgb3IgIiIpICsKKyAgICAgICAgICAgICJcclxuIgorICAgICAgICAgICAgIkhlbGxvLCB3b3JsZCEiCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X3BsYWluX2hlbGxvKHNlbGYpOgorICAgICAgICBvdXQsIGVyciA9IHJ1bl9hbW9jaygpCisgICAgICAgIHNlbGYuY2hlY2tfaGVsbG8ob3V0KQorCisgICAgZGVmIHRlc3RfdmFsaWRhdGVkX2hlbGxvKHNlbGYpOgorICAgICAgICBvdXQsIGVyciA9IHJ1bl9hbW9jayh2YWxpZGF0b3IoaGVsbG9fYXBwKSkKKyAgICAgICAgIyB0aGUgbWlkZGxld2FyZSBkb2Vzbid0IHN1cHBvcnQgbGVuKCksIHNvIGNvbnRlbnQtbGVuZ3RoIGlzbid0IHRoZXJlCisgICAgICAgIHNlbGYuY2hlY2tfaGVsbG8ob3V0LCBoYXNfbGVuZ3RoPUZhbHNlKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX3ZhbGlkYXRpb25fZXJyb3Ioc2VsZik6CisgICAgICAgIGRlZiBiYWRfYXBwKGVudmlyb24sc3RhcnRfcmVzcG9uc2UpOgorICAgICAgICAgICAgc3RhcnRfcmVzcG9uc2UoIjIwMCBPSyIsICgnQ29udGVudC1UeXBlJywndGV4dC9wbGFpbicpKQorICAgICAgICAgICAgcmV0dXJuIFsiSGVsbG8sIHdvcmxkISJdCisgICAgICAgIG91dCwgZXJyID0gcnVuX2Ftb2NrKHZhbGlkYXRvcihiYWRfYXBwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG91dC5lbmRzd2l0aCgKKyAgICAgICAgICAgICJBIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gIFBsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLiIKKyAgICAgICAgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGVyci5zcGxpdGxpbmVzKClbLTJdLAorICAgICAgICAgICAgIkFzc2VydGlvbkVycm9yOiBIZWFkZXJzICgoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L3BsYWluJykpIG11c3QiCisgICAgICAgICAgICAiIGJlIG9mIHR5cGUgbGlzdDogPHR5cGUgJ3R1cGxlJz4iCisgICAgICAgICkKKworCitjbGFzcyBVdGlsaXR5VGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrU2hpZnQoc2VsZixzbl9pbixwaV9pbixwYXJ0LHNuX291dCxwaV9vdXQpOgorICAgICAgICBlbnYgPSB7J1NDUklQVF9OQU1FJzpzbl9pbiwnUEFUSF9JTkZPJzpwaV9pbn0KKyAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGVudikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLnNoaWZ0X3BhdGhfaW5mbyhlbnYpLHBhcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW52WydQQVRIX0lORk8nXSxwaV9vdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW52WydTQ1JJUFRfTkFNRSddLHNuX291dCkKKyAgICAgICAgcmV0dXJuIGVudgorCisgICAgZGVmIGNoZWNrRGVmYXVsdChzZWxmLCBrZXksIHZhbHVlLCBhbHQ9Tm9uZSk6CisgICAgICAgICMgQ2hlY2sgZGVmYXVsdGluZyB3aGVuIGVtcHR5CisgICAgICAgIGVudiA9IHt9CisgICAgICAgIHV0aWwuc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhlbnYpCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIFN0cmluZ0lPKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlbnZba2V5XSwgU3RyaW5nSU8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudltrZXldLCB2YWx1ZSkKKworICAgICAgICAjIENoZWNrIGV4aXN0aW5nIHZhbHVlCisgICAgICAgIGVudiA9IHtrZXk6YWx0fQorICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoZW52KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZW52W2tleV0gaXMgYWx0KQorCisgICAgZGVmIGNoZWNrQ3Jvc3NEZWZhdWx0KHNlbGYsa2V5LHZhbHVlLCoqa3cpOgorICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoa3cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa3dba2V5XSx2YWx1ZSkKKworICAgIGRlZiBjaGVja0FwcFVSSShzZWxmLHVyaSwqKmt3KToKKyAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGt3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuYXBwbGljYXRpb25fdXJpKGt3KSx1cmkpCisKKyAgICBkZWYgY2hlY2tSZXFVUkkoc2VsZix1cmkscXVlcnk9MSwqKmt3KToKKyAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGt3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwucmVxdWVzdF91cmkoa3cscXVlcnkpLHVyaSkKKworICAgIGRlZiBjaGVja0ZXKHNlbGYsdGV4dCxzaXplLG1hdGNoKToKKworICAgICAgICBkZWYgbWFrZV9pdCh0ZXh0PXRleHQsc2l6ZT1zaXplKToKKyAgICAgICAgICAgIHJldHVybiB1dGlsLkZpbGVXcmFwcGVyKFN0cmluZ0lPKHRleHQpLHNpemUpCisKKyAgICAgICAgY29tcGFyZV9nZW5lcmljX2l0ZXIobWFrZV9pdCxtYXRjaCkKKworICAgICAgICBpdCA9IG1ha2VfaXQoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGl0LmZpbGVsaWtlLmNsb3NlZCkKKworICAgICAgICBmb3IgaXRlbSBpbiBpdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGl0LmZpbGVsaWtlLmNsb3NlZCkKKworICAgICAgICBpdC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpdC5maWxlbGlrZS5jbG9zZWQpCisKKyAgICBkZWYgdGVzdFNpbXBsZVNoaWZ0cyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcnLCcvJywgJycsICcvJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnJywnL3gnLCAneCcsICcveCcsICcnKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy8nLCcnLCBOb25lLCAnLycsICcnKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hJywnL3gveScsICd4JywgJy9hL3gnLCAnL3knKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hJywnL3gvJywgICd4JywgJy9hL3gnLCAnLycpCisKKyAgICBkZWYgdGVzdE5vcm1hbGl6ZWRTaGlmdHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLi4veScsICcuLicsICcvYScsICcveScpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnJywgJy8uLi95JywgJy4uJywgJycsICcveScpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvL3knLCAneScsICcvYS9iL3knLCAnJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYS9iJywgJy8veS8nLCAneScsICcvYS9iL3knLCAnLycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLi95JywgJ3knLCAnL2EvYi95JywgJycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLi95LycsICd5JywgJy9hL2IveScsICcvJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYS9iJywgJy8vLy4vLi4vL3kvLi8vJywgJy4uJywgJy9hJywgJy95LycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLy8nLCAnJywgJy9hL2IvJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLi8vJywgJycsICcvYS9iLycsICcnKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnL3gvLycsICd4JywgJy9hL2IveCcsICcvJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYS9iJywgJy8uJywgTm9uZSwgJy9hL2InLCAnJykKKworICAgIGRlZiB0ZXN0RGVmYXVsdHMoc2VsZik6CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIFsKKyAgICAgICAgICAgICgnU0VSVkVSX05BTUUnLCcxMjcuMC4wLjEnKSwKKyAgICAgICAgICAgICgnU0VSVkVSX1BPUlQnLCAnODAnKSwKKyAgICAgICAgICAgICgnU0VSVkVSX1BST1RPQ09MJywnSFRUUC8xLjAnKSwKKyAgICAgICAgICAgICgnSFRUUF9IT1NUJywnMTI3LjAuMC4xJyksCisgICAgICAgICAgICAoJ1JFUVVFU1RfTUVUSE9EJywnR0VUJyksCisgICAgICAgICAgICAoJ1NDUklQVF9OQU1FJywnJyksCisgICAgICAgICAgICAoJ1BBVEhfSU5GTycsJy8nKSwKKyAgICAgICAgICAgICgnd3NnaS52ZXJzaW9uJywgKDEsMCkpLAorICAgICAgICAgICAgKCd3c2dpLnJ1bl9vbmNlJywgMCksCisgICAgICAgICAgICAoJ3dzZ2kubXVsdGl0aHJlYWQnLCAwKSwKKyAgICAgICAgICAgICgnd3NnaS5tdWx0aXByb2Nlc3MnLCAwKSwKKyAgICAgICAgICAgICgnd3NnaS5pbnB1dCcsIFN0cmluZ0lPKCIiKSksCisgICAgICAgICAgICAoJ3dzZ2kuZXJyb3JzJywgU3RyaW5nSU8oKSksCisgICAgICAgICAgICAoJ3dzZ2kudXJsX3NjaGVtZScsJ2h0dHAnKSwKKyAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tEZWZhdWx0KGtleSx2YWx1ZSkKKworICAgIGRlZiB0ZXN0Q3Jvc3NEZWZhdWx0cyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja0Nyb3NzRGVmYXVsdCgnSFRUUF9IT1NUJywiZm9vLmJhciIsU0VSVkVSX05BTUU9ImZvby5iYXIiKQorICAgICAgICBzZWxmLmNoZWNrQ3Jvc3NEZWZhdWx0KCd3c2dpLnVybF9zY2hlbWUnLCJodHRwcyIsSFRUUFM9Im9uIikKKyAgICAgICAgc2VsZi5jaGVja0Nyb3NzRGVmYXVsdCgnd3NnaS51cmxfc2NoZW1lJywiaHR0cHMiLEhUVFBTPSIxIikKKyAgICAgICAgc2VsZi5jaGVja0Nyb3NzRGVmYXVsdCgnd3NnaS51cmxfc2NoZW1lJywiaHR0cHMiLEhUVFBTPSJ5ZXMiKQorICAgICAgICBzZWxmLmNoZWNrQ3Jvc3NEZWZhdWx0KCd3c2dpLnVybF9zY2hlbWUnLCJodHRwIixIVFRQUz0iZm9vIikKKyAgICAgICAgc2VsZi5jaGVja0Nyb3NzRGVmYXVsdCgnU0VSVkVSX1BPUlQnLCI4MCIsSFRUUFM9ImZvbyIpCisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ1NFUlZFUl9QT1JUJywiNDQzIixIVFRQUz0ib24iKQorCisgICAgZGVmIHRlc3RHdWVzc1NjaGVtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLmd1ZXNzX3NjaGVtZSh7fSksICJodHRwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLmd1ZXNzX3NjaGVtZSh7J0hUVFBTJzoiZm9vIn0pLCAiaHR0cCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5ndWVzc19zY2hlbWUoeydIVFRQUyc6Im9uIn0pLCAiaHR0cHMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuZ3Vlc3Nfc2NoZW1lKHsnSFRUUFMnOiJ5ZXMifSksICJodHRwcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5ndWVzc19zY2hlbWUoeydIVFRQUyc6IjEifSksICJodHRwcyIpCisKKyAgICBkZWYgdGVzdEFwcFVSSXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly8xMjcuMC4wLjEvIikKKyAgICAgICAgc2VsZi5jaGVja0FwcFVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtIiwgU0NSSVBUX05BTUU9Ii9zcGFtIikKKyAgICAgICAgc2VsZi5jaGVja0FwcFVSSSgiaHR0cDovL3NwYW0uZXhhbXBsZS5jb206MjA3MS8iLAorICAgICAgICAgICAgSFRUUF9IT1NUPSJzcGFtLmV4YW1wbGUuY29tOjIwNzEiLCBTRVJWRVJfUE9SVD0iMjA3MSIpCisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly9zcGFtLmV4YW1wbGUuY29tLyIsCisgICAgICAgICAgICBTRVJWRVJfTkFNRT0ic3BhbS5leGFtcGxlLmNvbSIpCisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly8xMjcuMC4wLjEvIiwKKyAgICAgICAgICAgIEhUVFBfSE9TVD0iMTI3LjAuMC4xIiwgU0VSVkVSX05BTUU9InNwYW0uZXhhbXBsZS5jb20iKQorICAgICAgICBzZWxmLmNoZWNrQXBwVVJJKCJodHRwczovLzEyNy4wLjAuMS8iLCBIVFRQUz0ib24iKQorICAgICAgICBzZWxmLmNoZWNrQXBwVVJJKCJodHRwOi8vMTI3LjAuMC4xOjgwMDAvIiwgU0VSVkVSX1BPUlQ9IjgwMDAiLAorICAgICAgICAgICAgSFRUUF9IT1NUPU5vbmUpCisKKyAgICBkZWYgdGVzdFJlcVVSSXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tSZXFVUkkoImh0dHA6Ly8xMjcuMC4wLjEvIikKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtIiwgU0NSSVBUX05BTUU9Ii9zcGFtIikKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtbWl0eS9zcGFtIiwKKyAgICAgICAgICAgIFNDUklQVF9OQU1FPSIvc3BhbW1pdHkiLCBQQVRIX0lORk89Ii9zcGFtIikKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtbWl0eS9zcGFtO2hhbSIsCisgICAgICAgICAgICBTQ1JJUFRfTkFNRT0iL3NwYW1taXR5IiwgUEFUSF9JTkZPPSIvc3BhbTtoYW0iKQorICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwYW1taXR5L3NwYW07Y29va2llPTEyMzQsNTY3OCIsCisgICAgICAgICAgICBTQ1JJUFRfTkFNRT0iL3NwYW1taXR5IiwgUEFUSF9JTkZPPSIvc3BhbTtjb29raWU9MTIzNCw1Njc4IikKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtbWl0eS9zcGFtP3NheT1uaSIsCisgICAgICAgICAgICBTQ1JJUFRfTkFNRT0iL3NwYW1taXR5IiwgUEFUSF9JTkZPPSIvc3BhbSIsUVVFUllfU1RSSU5HPSJzYXk9bmkiKQorICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwYW1taXR5L3NwYW0iLCAwLAorICAgICAgICAgICAgU0NSSVBUX05BTUU9Ii9zcGFtbWl0eSIsIFBBVEhfSU5GTz0iL3NwYW0iLFFVRVJZX1NUUklORz0ic2F5PW5pIikKKworICAgIGRlZiB0ZXN0RmlsZVdyYXBwZXIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tGVygieHl6Iio1MCwgMTIwLCBbInh5eiIqNDAsInh5eiIqMTBdKQorCisgICAgZGVmIHRlc3RIb3BCeUhvcChzZWxmKToKKyAgICAgICAgZm9yIGhvcCBpbiAoCisgICAgICAgICAgICAiQ29ubmVjdGlvbiBLZWVwLUFsaXZlIFByb3h5LUF1dGhlbnRpY2F0ZSBQcm94eS1BdXRob3JpemF0aW9uICIKKyAgICAgICAgICAgICJURSBUcmFpbGVycyBUcmFuc2Zlci1FbmNvZGluZyBVcGdyYWRlIgorICAgICAgICApLnNwbGl0KCk6CisgICAgICAgICAgICBmb3IgYWx0IGluIGhvcCwgaG9wLnRpdGxlKCksIGhvcC51cHBlcigpLCBob3AubG93ZXIoKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodXRpbC5pc19ob3BfYnlfaG9wKGFsdCkpCisKKyAgICAgICAgIyBOb3QgY29tcHJlaGVuc2l2ZSwganVzdCBhIGZldyByYW5kb20gaGVhZGVyIG5hbWVzCisgICAgICAgIGZvciBob3AgaW4gKAorICAgICAgICAgICAgIkFjY2VwdCBDYWNoZS1Db250cm9sIERhdGUgUHJhZ21hIFRyYWlsZXIgVmlhIFdhcm5pbmciCisgICAgICAgICkuc3BsaXQoKToKKyAgICAgICAgICAgIGZvciBhbHQgaW4gaG9wLCBob3AudGl0bGUoKSwgaG9wLnVwcGVyKCksIGhvcC5sb3dlcigpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodXRpbC5pc19ob3BfYnlfaG9wKGFsdCkpCisKK2NsYXNzIEhlYWRlclRlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0TWFwcGluZ0ludGVyZmFjZShzZWxmKToKKyAgICAgICAgdGVzdCA9IFsoJ3gnLCd5JyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEhlYWRlcnMoW10pKSwwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihIZWFkZXJzKHRlc3RbOl0pKSwxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEhlYWRlcnModGVzdFs6XSkua2V5cygpLCBbJ3gnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChIZWFkZXJzKHRlc3RbOl0pLnZhbHVlcygpLCBbJ3knXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChIZWFkZXJzKHRlc3RbOl0pLml0ZW1zKCksIHRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoSGVhZGVycyh0ZXN0KS5pdGVtcygpIGlzIHRlc3QpICAjIG11c3QgYmUgY29weSEKKworICAgICAgICBoPUhlYWRlcnMoW10pCisgICAgICAgIGRlbCBoWydmb28nXSAgICMgc2hvdWxkIG5vdCByYWlzZSBhbiBlcnJvcgorCisgICAgICAgIGhbJ0ZvbyddID0gJ2JhcicKKyAgICAgICAgZm9yIG0gaW4gaC5oYXNfa2V5LCBoLl9fY29udGFpbnNfXywgaC5nZXQsIGguZ2V0X2FsbCwgaC5fX2dldGl0ZW1fXzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtKCdmb28nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtKCdGb28nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtKCdGT08nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobSgnYmFyJykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWydmb28nXSwnYmFyJykKKyAgICAgICAgaFsnZm9vJ10gPSAnYmF6JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhbJ0ZPTyddLCdiYXonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZ2V0X2FsbCgnZm9vJyksWydiYXonXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZ2V0KCJmb28iLCJ3aGVlIiksICJiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZ2V0KCJ6b28iLCJ3aGVlIiksICJ3aGVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnNldGRlZmF1bHQoImZvbyIsIndoZWUiKSwgImJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zZXRkZWZhdWx0KCJ6b28iLCJ3aGVlIiksICJ3aGVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWyJmb28iXSwiYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWyJ6b28iXSwid2hlZSIpCisKKyAgICBkZWYgdGVzdFJlcXVpcmVMaXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEhlYWRlcnMsICJmb28iKQorCisKKyAgICBkZWYgdGVzdEV4dHJhcyhzZWxmKToKKyAgICAgICAgaCA9IEhlYWRlcnMoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGgpLCdcclxuJykKKworICAgICAgICBoLmFkZF9oZWFkZXIoJ2ZvbycsJ2JhcicsYmF6PSJzcGFtIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWydmb28nXSwgJ2JhcjsgYmF6PSJzcGFtIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGgpLCdmb286IGJhcjsgYmF6PSJzcGFtIlxyXG5cclxuJykKKworICAgICAgICBoLmFkZF9oZWFkZXIoJ0ZvbycsJ2JhcicsY2hlZXNlPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5nZXRfYWxsKCdmb28nKSwKKyAgICAgICAgICAgIFsnYmFyOyBiYXo9InNwYW0iJywgJ2JhcjsgY2hlZXNlJ10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoaCksCisgICAgICAgICAgICAnZm9vOiBiYXI7IGJhej0ic3BhbSJcclxuJworICAgICAgICAgICAgJ0ZvbzogYmFyOyBjaGVlc2VcclxuJworICAgICAgICAgICAgJ1xyXG4nCisgICAgICAgICkKKworCitjbGFzcyBFcnJvckhhbmRsZXIoQmFzZUNHSUhhbmRsZXIpOgorICAgICIiIlNpbXBsZSBoYW5kbGVyIHN1YmNsYXNzIGZvciB0ZXN0aW5nIEJhc2VIYW5kbGVyIiIiCisKKyAgICAjIEJhc2VIYW5kbGVyIHJlY29yZHMgdGhlIE9TIGVudmlyb25tZW50IGF0IGltcG9ydCB0aW1lLCBidXQgZW52dmFycworICAgICMgbWlnaHQgaGF2ZSBiZWVuIGNoYW5nZWQgbGF0ZXIgYnkgb3RoZXIgdGVzdHMsIHdoaWNoIHRyaXBzIHVwCisgICAgIyBIYW5kbGVyVGVzdHMudGVzdEVudmlyb24oKS4KKyAgICBvc19lbnZpcm9uID0gZGljdChvcy5lbnZpcm9uLml0ZW1zKCkpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwqKmt3KToKKyAgICAgICAgc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhrdykKKyAgICAgICAgQmFzZUNHSUhhbmRsZXIuX19pbml0X18oCisgICAgICAgICAgICBzZWxmLCBTdHJpbmdJTygnJyksIFN0cmluZ0lPKCksIFN0cmluZ0lPKCksIGt3LAorICAgICAgICAgICAgbXVsdGl0aHJlYWQ9VHJ1ZSwgbXVsdGlwcm9jZXNzPVRydWUKKyAgICAgICAgKQorCitjbGFzcyBUZXN0SGFuZGxlcihFcnJvckhhbmRsZXIpOgorICAgICIiIlNpbXBsZSBoYW5kbGVyIHN1YmNsYXNzIGZvciB0ZXN0aW5nIEJhc2VIYW5kbGVyLCB3L2Vycm9yIHBhc3N0aHJ1IiIiCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICByYWlzZSAgICMgZm9yIHRlc3RpbmcsIHdlIHdhbnQgdG8gc2VlIHdoYXQncyBoYXBwZW5pbmcKKworCitjbGFzcyBIYW5kbGVyVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrRW52aXJvbkF0dHJzKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICBlbnYgPSBoYW5kbGVyLmVudmlyb24KKyAgICAgICAgZm9yIGF0dHIgaW4gWworICAgICAgICAgICAgJ3ZlcnNpb24nLCdtdWx0aXRocmVhZCcsJ211bHRpcHJvY2VzcycsJ3J1bl9vbmNlJywnZmlsZV93cmFwcGVyJworICAgICAgICBdOgorICAgICAgICAgICAgaWYgYXR0cj09J2ZpbGVfd3JhcHBlcicgYW5kIGhhbmRsZXIud3NnaV9maWxlX3dyYXBwZXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKGhhbmRsZXIsJ3dzZ2lfJythdHRyKSxlbnZbJ3dzZ2kuJythdHRyXSkKKworICAgIGRlZiBjaGVja09TRW52aXJvbihzZWxmLGhhbmRsZXIpOgorICAgICAgICBlbXB0eSA9IHt9OyBzZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGVtcHR5KQorICAgICAgICBlbnYgPSBoYW5kbGVyLmVudmlyb24KKyAgICAgICAgZnJvbSBvcyBpbXBvcnQgZW52aXJvbgorICAgICAgICBmb3Igayx2IGluIGVudmlyb24uaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGsgbm90IGluIGVtcHR5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW52W2tdLHYpCisgICAgICAgIGZvciBrLHYgaW4gZW1wdHkuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaywgZW52KQorCisgICAgZGVmIHRlc3RFbnZpcm9uKHNlbGYpOgorICAgICAgICBoID0gVGVzdEhhbmRsZXIoWD0iWSIpCisgICAgICAgIGguc2V0dXBfZW52aXJvbigpCisgICAgICAgIHNlbGYuY2hlY2tFbnZpcm9uQXR0cnMoaCkKKyAgICAgICAgc2VsZi5jaGVja09TRW52aXJvbihoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZW52aXJvblsiWCJdLCJZIikKKworICAgIGRlZiB0ZXN0Q0dJRW52aXJvbihzZWxmKToKKyAgICAgICAgaCA9IEJhc2VDR0lIYW5kbGVyKE5vbmUsTm9uZSxOb25lLHt9KQorICAgICAgICBoLnNldHVwX2Vudmlyb24oKQorICAgICAgICBmb3Iga2V5IGluICd3c2dpLnVybF9zY2hlbWUnLCAnd3NnaS5pbnB1dCcsICd3c2dpLmVycm9ycyc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGtleSwgaC5lbnZpcm9uKQorCisgICAgZGVmIHRlc3RTY2hlbWUoc2VsZik6CisgICAgICAgIGg9VGVzdEhhbmRsZXIoSFRUUFM9Im9uIik7IGguc2V0dXBfZW52aXJvbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5lbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXSwnaHR0cHMnKQorICAgICAgICBoPVRlc3RIYW5kbGVyKCk7IGguc2V0dXBfZW52aXJvbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5lbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXSwnaHR0cCcpCisKKyAgICBkZWYgdGVzdEFic3RyYWN0TWV0aG9kcyhzZWxmKToKKyAgICAgICAgaCA9IEJhc2VIYW5kbGVyKCkKKyAgICAgICAgZm9yIG5hbWUgaW4gWworICAgICAgICAgICAgJ19mbHVzaCcsJ2dldF9zdGRpbicsJ2dldF9zdGRlcnInLCdhZGRfY2dpX3ZhcnMnCisgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBnZXRhdHRyKGgsbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGguX3dyaXRlLCAidGVzdCIpCisKKyAgICBkZWYgdGVzdENvbnRlbnRMZW5ndGgoc2VsZik6CisgICAgICAgICMgRGVtbyBvbmUgcmVhc29uIGl0ZXJhdGlvbiBpcyBiZXR0ZXIgdGhhbiB3cml0ZSgpLi4uICA7KQorCisgICAgICAgIGRlZiB0cml2aWFsX2FwcDEoZSxzKToKKyAgICAgICAgICAgIHMoJzIwMCBPSycsW10pCisgICAgICAgICAgICByZXR1cm4gW2VbJ3dzZ2kudXJsX3NjaGVtZSddXQorCisgICAgICAgIGRlZiB0cml2aWFsX2FwcDIoZSxzKToKKyAgICAgICAgICAgIHMoJzIwMCBPSycsW10pKGVbJ3dzZ2kudXJsX3NjaGVtZSddKQorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgZGVmIHRyaXZpYWxfYXBwNChlLHMpOgorICAgICAgICAgICAgIyBTaW11bGF0ZSBhIHJlc3BvbnNlIHRvIGEgSEVBRCByZXF1ZXN0CisgICAgICAgICAgICBzKCcyMDAgT0snLFsoJ0NvbnRlbnQtTGVuZ3RoJywgJzEyMzQ1JyldKQorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgaCA9IFRlc3RIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4odHJpdmlhbF9hcHAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICAiU3RhdHVzOiAyMDAgT0tcclxuIgorICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiA0XHJcbiIKKyAgICAgICAgICAgICJcclxuIgorICAgICAgICAgICAgImh0dHAiKQorCisgICAgICAgIGggPSBUZXN0SGFuZGxlcigpCisgICAgICAgIGgucnVuKHRyaXZpYWxfYXBwMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgIlN0YXR1czogMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJcclxuIgorICAgICAgICAgICAgImh0dHAiKQorCisKKyAgICAgICAgaCA9IFRlc3RIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4odHJpdmlhbF9hcHA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICBiJ1N0YXR1czogMjAwIE9LXHJcbicKKyAgICAgICAgICAgIGInQ29udGVudC1MZW5ndGg6IDEyMzQ1XHJcbicKKyAgICAgICAgICAgIGInXHJcbicpCisKKyAgICBkZWYgdGVzdEJhc2ljRXJyb3JPdXRwdXQoc2VsZik6CisKKyAgICAgICAgZGVmIG5vbl9lcnJvcl9hcHAoZSxzKToKKyAgICAgICAgICAgIHMoJzIwMCBPSycsW10pCisgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICBkZWYgZXJyb3JfYXBwKGUscyk6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiVGhpcyBzaG91bGQgYmUgY2F1Z2h0IGJ5IGhhbmRsZXIiKQorCisgICAgICAgIGggPSBFcnJvckhhbmRsZXIoKQorICAgICAgICBoLnJ1bihub25fZXJyb3JfYXBwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICAiU3RhdHVzOiAyMDAgT0tcclxuIgorICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAwXHJcbiIKKyAgICAgICAgICAgICJcclxuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZGVyci5nZXR2YWx1ZSgpLCIiKQorCisgICAgICAgIGggPSBFcnJvckhhbmRsZXIoKQorICAgICAgICBoLnJ1bihlcnJvcl9hcHApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRvdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICJTdGF0dXM6ICVzXHJcbiIKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW5cclxuIgorICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAlZFxyXG4iCisgICAgICAgICAgICAiXHJcbiVzIiAlIChoLmVycm9yX3N0YXR1cyxsZW4oaC5lcnJvcl9ib2R5KSxoLmVycm9yX2JvZHkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaC5zdGRlcnIuZ2V0dmFsdWUoKS5maW5kKCJBc3NlcnRpb25FcnJvciIpLCAtMSkKKworICAgIGRlZiB0ZXN0RXJyb3JBZnRlck91dHB1dChzZWxmKToKKyAgICAgICAgTVNHID0gIlNvbWUgb3V0cHV0IGhhcyBiZWVuIHNlbnQiCisgICAgICAgIGRlZiBlcnJvcl9hcHAoZSxzKToKKyAgICAgICAgICAgIHMoIjIwMCBPSyIsW10pKE1TRykKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJUaGlzIHNob3VsZCBiZSBjYXVnaHQgYnkgaGFuZGxlciIpCisKKyAgICAgICAgaCA9IEVycm9ySGFuZGxlcigpCisgICAgICAgIGgucnVuKGVycm9yX2FwcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgIlN0YXR1czogMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJcclxuIitNU0cpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaC5zdGRlcnIuZ2V0dmFsdWUoKS5maW5kKCJBc3NlcnRpb25FcnJvciIpLCAtMSkKKworICAgIGRlZiB0ZXN0SGVhZGVyRm9ybWF0cyhzZWxmKToKKworICAgICAgICBkZWYgbm9uX2Vycm9yX2FwcChlLHMpOgorICAgICAgICAgICAgcygnMjAwIE9LJyxbXSkKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgICAgIHN0ZHBhdCA9ICgKKyAgICAgICAgICAgIHIiSFRUUC8lcyAyMDAgT0tcclxuIgorICAgICAgICAgICAgciJEYXRlOiBcd3szfSwgWyAwMTIzXVxkIFx3ezN9IFxkezR9IFxkXGQ6XGRcZDpcZFxkIEdNVFxyXG4iCisgICAgICAgICAgICByIiVzIiByIkNvbnRlbnQtTGVuZ3RoOiAwXHJcbiIgciJcclxuIgorICAgICAgICApCisgICAgICAgIHNob3J0cGF0ID0gKAorICAgICAgICAgICAgIlN0YXR1czogMjAwIE9LXHJcbiIgIkNvbnRlbnQtTGVuZ3RoOiAwXHJcbiIgIlxyXG4iCisgICAgICAgICkKKworICAgICAgICBmb3Igc3N3IGluICJGb29CYXIvMS4wIiwgTm9uZToKKyAgICAgICAgICAgIHN3ID0gc3N3IGFuZCAiU2VydmVyOiAlc1xyXG4iICUgc3N3IG9yICIiCisKKyAgICAgICAgICAgIGZvciB2ZXJzaW9uIGluICIxLjAiLCAiMS4xIjoKKyAgICAgICAgICAgICAgICBmb3IgcHJvdG8gaW4gIkhUVFAvMC45IiwgIkhUVFAvMS4wIiwgIkhUVFAvMS4xIjoKKworICAgICAgICAgICAgICAgICAgICBoID0gVGVzdEhhbmRsZXIoU0VSVkVSX1BST1RPQ09MPXByb3RvKQorICAgICAgICAgICAgICAgICAgICBoLm9yaWdpbl9zZXJ2ZXIgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBoLmh0dHBfdmVyc2lvbiA9IHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgaC5zZXJ2ZXJfc29mdHdhcmUgPSBzc3cKKyAgICAgICAgICAgICAgICAgICAgaC5ydW4obm9uX2Vycm9yX2FwcCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG9ydHBhdCxoLnN0ZG91dC5nZXR2YWx1ZSgpKQorCisgICAgICAgICAgICAgICAgICAgIGggPSBUZXN0SGFuZGxlcihTRVJWRVJfUFJPVE9DT0w9cHJvdG8pCisgICAgICAgICAgICAgICAgICAgIGgub3JpZ2luX3NlcnZlciA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgaC5odHRwX3ZlcnNpb24gPSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIGguc2VydmVyX3NvZnR3YXJlID0gc3N3CisgICAgICAgICAgICAgICAgICAgIGgucnVuKG5vbl9lcnJvcl9hcHApCisgICAgICAgICAgICAgICAgICAgIGlmIHByb3RvPT0iSFRUUC8wLjkiOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLCIiKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLm1hdGNoKHN0ZHBhdCUodmVyc2lvbixzdyksIGguc3Rkb3V0LmdldHZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGRwYXQlKHZlcnNpb24sc3cpLCBoLnN0ZG91dC5nZXR2YWx1ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RDbG9zZU9uRXJyb3Ioc2VsZik6CisgICAgICAgIHNpZGVfZWZmZWN0cyA9IHsnY2xvc2VfY2FsbGVkJzogRmFsc2V9CisgICAgICAgIE1TRyA9IGIiU29tZSBvdXRwdXQgaGFzIGJlZW4gc2VudCIKKyAgICAgICAgZGVmIGVycm9yX2FwcChlLHMpOgorICAgICAgICAgICAgcygiMjAwIE9LIixbXSkoTVNHKQorICAgICAgICAgICAgY2xhc3MgQ3Jhc2h5SXRlcmFibGUob2JqZWN0KToKKyAgICAgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBiJ2JsYWgnCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiVGhpcyBzaG91bGQgYmUgY2F1Z2h0IGJ5IGhhbmRsZXIiKQorCisgICAgICAgICAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBzaWRlX2VmZmVjdHNbJ2Nsb3NlX2NhbGxlZCddID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIENyYXNoeUl0ZXJhYmxlKCkKKworICAgICAgICBoID0gRXJyb3JIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4oZXJyb3JfYXBwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZGVfZWZmZWN0c1snY2xvc2VfY2FsbGVkJ10sIFRydWUpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dzZ2lyZWYucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd3NnaXJlZi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3ODBmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dzZ2lyZWYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dzZ2lyZWYucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd3NnaXJlZi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I3ODBmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dzZ2lyZWYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hkcmxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hkcmxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmE4ODg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeGRybGliLnB5CkBAIC0wLDAgKzEsNTggQEAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IHhkcmxpYgorCitjbGFzcyBYRFJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3hkcihzZWxmKToKKyAgICAgICAgcCA9IHhkcmxpYi5QYWNrZXIoKQorCisgICAgICAgIHMgPSAnaGVsbG8gd29ybGQnCisgICAgICAgIGEgPSBbJ3doYXQnLCAnaXMnLCAnaGFwbmluJywgJ2RvY3RvciddCisKKyAgICAgICAgcC5wYWNrX2ludCg0MikKKyAgICAgICAgcC5wYWNrX2ludCgtMTcpCisgICAgICAgIHAucGFja191aW50KDkpCisgICAgICAgIHAucGFja19ib29sKFRydWUpCisgICAgICAgIHAucGFja19ib29sKEZhbHNlKQorICAgICAgICBwLnBhY2tfdWh5cGVyKDQ1TCkKKyAgICAgICAgcC5wYWNrX2Zsb2F0KDEuOSkKKyAgICAgICAgcC5wYWNrX2RvdWJsZSgxLjkpCisgICAgICAgIHAucGFja19zdHJpbmcocykKKyAgICAgICAgcC5wYWNrX2xpc3QocmFuZ2UoNSksIHAucGFja191aW50KQorICAgICAgICBwLnBhY2tfYXJyYXkoYSwgcC5wYWNrX3N0cmluZykKKworICAgICAgICAjIG5vdyB2ZXJpZnkKKyAgICAgICAgZGF0YSA9IHAuZ2V0X2J1ZmZlcigpCisgICAgICAgIHVwID0geGRybGliLlVucGFja2VyKGRhdGEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC5nZXRfcG9zaXRpb24oKSwgMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja19pbnQoKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX2ludCgpLCAtMTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX3VpbnQoKSwgOSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVwLnVucGFja19ib29sKCkgaXMgVHJ1ZSkKKworICAgICAgICAjIHJlbWVtYmVyIHBvc2l0aW9uCisgICAgICAgIHBvcyA9IHVwLmdldF9wb3NpdGlvbigpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1cC51bnBhY2tfYm9vbCgpIGlzIEZhbHNlKQorCisgICAgICAgICMgcmV3aW5kIGFuZCB1bnBhY2sgYWdhaW4KKyAgICAgICAgdXAuc2V0X3Bvc2l0aW9uKHBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVwLnVucGFja19ib29sKCkgaXMgRmFsc2UpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC51bnBhY2tfdWh5cGVyKCksIDQ1TCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCh1cC51bnBhY2tfZmxvYXQoKSwgMS45KQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHVwLnVucGFja19kb3VibGUoKSwgMS45KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja19zdHJpbmcoKSwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC51bnBhY2tfbGlzdCh1cC51bnBhY2tfdWludCksIHJhbmdlKDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja19hcnJheSh1cC51bnBhY2tfc3RyaW5nKSwgYSkKKyAgICAgICAgdXAuZG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCB1cC51bnBhY2tfdWludCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoWERSVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeGRybGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hkcmxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiNTMyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hkcmxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeGRybGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hkcmxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiNTMyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hkcmxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTYxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxfZXRyZWUucHkKQEAgLTAsMCArMSwxOTA3IEBACisjIHhtbC5ldHJlZSB0ZXN0LiAgVGhpcyBmaWxlIGNvbnRhaW5zIGVub3VnaCB0ZXN0cyB0byBtYWtlIHN1cmUgdGhhdAorIyBhbGwgaW5jbHVkZWQgY29tcG9uZW50cyB3b3JrIGFzIHRoZXkgc2hvdWxkLgorIyBMYXJnZSBwYXJ0cyBhcmUgZXh0cmFjdGVkIGZyb20gdGhlIHVwc3RyZWFtIHRlc3Qgc3VpdGUuCisKKyMgSU1QT1JUQU5UOiB0aGUgc2FtZSBkb2N0ZXN0cyBhcmUgcnVuIGZyb20gInRlc3RfeG1sX2V0cmVlX2MiIGluCisjIG9yZGVyIHRvIGVuc3VyZSBjb25zaXN0ZW5jeSBiZXR3ZWVuIHRoZSBDIGltcGxlbWVudGF0aW9uIGFuZCB0aGUKKyMgUHl0aG9uIGltcGxlbWVudGF0aW9uLgorIworIyBGb3IgdGhpcyBwdXJwb3NlLCB0aGUgbW9kdWxlLWxldmVsICJFVCIgc3ltYm9sIGlzIHRlbXBvcmFyaWx5CisjIG1vbmtleS1wYXRjaGVkIHdoZW4gcnVubmluZyB0aGUgInRlc3RfeG1sX2V0cmVlX2MiIHRlc3Qgc3VpdGUuCisjIERvbid0IHJlLWltcG9ydCAieG1sLmV0cmVlLkVsZW1lbnRUcmVlIiBtb2R1bGUgaW4gdGhlIGRvY3N0cmluZywKKyMgZXhjZXB0IGlmIHRoZSB0ZXN0IGlzIHNwZWNpZmljIHRvIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24uCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBjZ2kKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGZpbmRmaWxlCisKK2Zyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZSBhcyBFVAorCitTSU1QTEVfWE1MRklMRSA9IGZpbmRmaWxlKCJzaW1wbGUueG1sIiwgc3ViZGlyPSJ4bWx0ZXN0ZGF0YSIpCitTSU1QTEVfTlNfWE1MRklMRSA9IGZpbmRmaWxlKCJzaW1wbGUtbnMueG1sIiwgc3ViZGlyPSJ4bWx0ZXN0ZGF0YSIpCisKK1NBTVBMRV9YTUwgPSAiIiJcCis8Ym9keT4KKyAgPHRhZyBjbGFzcz0nYSc+dGV4dDwvdGFnPgorICA8dGFnIGNsYXNzPSdiJyAvPgorICA8c2VjdGlvbj4KKyAgICA8dGFnIGNsYXNzPSdiJyBpZD0naW5uZXInPnN1YnRleHQ8L3RhZz4KKyAgPC9zZWN0aW9uPgorPC9ib2R5PgorIiIiCisKK1NBTVBMRV9TRUNUSU9OID0gIiIiXAorPHNlY3Rpb24+CisgIDx0YWcgY2xhc3M9J2InIGlkPSdpbm5lcic+c3VidGV4dDwvdGFnPgorICA8bmV4dHRhZyAvPgorICA8bmV4dHNlY3Rpb24+CisgICAgPHRhZyAvPgorICA8L25leHRzZWN0aW9uPgorPC9zZWN0aW9uPgorIiIiCisKK1NBTVBMRV9YTUxfTlMgPSAiIiIKKzxib2R5IHhtbG5zPSJodHRwOi8vZWZmYm90Lm9yZy9ucyI+CisgIDx0YWc+dGV4dDwvdGFnPgorICA8dGFnIC8+CisgIDxzZWN0aW9uPgorICAgIDx0YWc+c3VidGV4dDwvdGFnPgorICA8L3NlY3Rpb24+Cis8L2JvZHk+CisiIiIKKworCitkZWYgc2FuaXR5KCk6CisgICAgIiIiCisgICAgSW1wb3J0IHNhbml0eS4KKworICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRJbmNsdWRlCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50UGF0aAorICAgICIiIgorCitkZWYgY2hlY2tfbWV0aG9kKG1ldGhvZCk6CisgICAgaWYgbm90IGhhc2F0dHIobWV0aG9kLCAnX19jYWxsX18nKToKKyAgICAgICAgcHJpbnQgbWV0aG9kLCAibm90IGNhbGxhYmxlIgorCitkZWYgc2VyaWFsaXplKGVsZW0sIHRvX3N0cmluZz1UcnVlLCAqKm9wdGlvbnMpOgorICAgIGltcG9ydCBTdHJpbmdJTworICAgIGZpbGUgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgdHJlZSA9IEVULkVsZW1lbnRUcmVlKGVsZW0pCisgICAgdHJlZS53cml0ZShmaWxlLCAqKm9wdGlvbnMpCisgICAgaWYgdG9fc3RyaW5nOgorICAgICAgICByZXR1cm4gZmlsZS5nZXR2YWx1ZSgpCisgICAgZWxzZToKKyAgICAgICAgZmlsZS5zZWVrKDApCisgICAgICAgIHJldHVybiBmaWxlCisKK2RlZiBzdW1tYXJpemUoZWxlbSk6CisgICAgaWYgZWxlbS50YWcgPT0gRVQuQ29tbWVudDoKKyAgICAgICAgcmV0dXJuICI8Q29tbWVudD4iCisgICAgcmV0dXJuIGVsZW0udGFnCisKK2RlZiBzdW1tYXJpemVfbGlzdChzZXEpOgorICAgIHJldHVybiBbc3VtbWFyaXplKGVsZW0pIGZvciBlbGVtIGluIHNlcV0KKworZGVmIG5vcm1hbGl6ZV9jcmxmKHRyZWUpOgorICAgIGZvciBlbGVtIGluIHRyZWUuaXRlcigpOgorICAgICAgICBpZiBlbGVtLnRleHQ6CisgICAgICAgICAgICBlbGVtLnRleHQgPSBlbGVtLnRleHQucmVwbGFjZSgiXHJcbiIsICJcbiIpCisgICAgICAgIGlmIGVsZW0udGFpbDoKKyAgICAgICAgICAgIGVsZW0udGFpbCA9IGVsZW0udGFpbC5yZXBsYWNlKCJcclxuIiwgIlxuIikKKworZGVmIGNoZWNrX3N0cmluZyhzdHJpbmcpOgorICAgIGxlbihzdHJpbmcpCisgICAgZm9yIGNoYXIgaW4gc3RyaW5nOgorICAgICAgICBpZiBsZW4oY2hhcikgIT0gMToKKyAgICAgICAgICAgIHByaW50ICJleHBlY3RlZCBvbmUtY2hhcmFjdGVyIHN0cmluZywgZ290ICVyIiAlIGNoYXIKKyAgICBuZXdfc3RyaW5nID0gc3RyaW5nICsgIiIKKyAgICBuZXdfc3RyaW5nID0gc3RyaW5nICsgIiAiCisgICAgc3RyaW5nWzowXQorCitkZWYgY2hlY2tfbWFwcGluZyhtYXBwaW5nKToKKyAgICBsZW4obWFwcGluZykKKyAgICBrZXlzID0gbWFwcGluZy5rZXlzKCkKKyAgICBpdGVtcyA9IG1hcHBpbmcuaXRlbXMoKQorICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgICAgaXRlbSA9IG1hcHBpbmdba2V5XQorICAgIG1hcHBpbmdbImtleSJdID0gInZhbHVlIgorICAgIGlmIG1hcHBpbmdbImtleSJdICE9ICJ2YWx1ZSI6CisgICAgICAgIHByaW50ICJleHBlY3RlZCB2YWx1ZSBzdHJpbmcsIGdvdCAlciIgJSBtYXBwaW5nWyJrZXkiXQorCitkZWYgY2hlY2tfZWxlbWVudChlbGVtZW50KToKKyAgICBpZiBub3QgRVQuaXNlbGVtZW50KGVsZW1lbnQpOgorICAgICAgICBwcmludCAibm90IGFuIGVsZW1lbnQiCisgICAgaWYgbm90IGhhc2F0dHIoZWxlbWVudCwgInRhZyIpOgorICAgICAgICBwcmludCAibm8gdGFnIG1lbWJlciIKKyAgICBpZiBub3QgaGFzYXR0cihlbGVtZW50LCAiYXR0cmliIik6CisgICAgICAgIHByaW50ICJubyBhdHRyaWIgbWVtYmVyIgorICAgIGlmIG5vdCBoYXNhdHRyKGVsZW1lbnQsICJ0ZXh0Iik6CisgICAgICAgIHByaW50ICJubyB0ZXh0IG1lbWJlciIKKyAgICBpZiBub3QgaGFzYXR0cihlbGVtZW50LCAidGFpbCIpOgorICAgICAgICBwcmludCAibm8gdGFpbCBtZW1iZXIiCisKKyAgICBjaGVja19zdHJpbmcoZWxlbWVudC50YWcpCisgICAgY2hlY2tfbWFwcGluZyhlbGVtZW50LmF0dHJpYikKKyAgICBpZiBlbGVtZW50LnRleHQgaXMgbm90IE5vbmU6CisgICAgICAgIGNoZWNrX3N0cmluZyhlbGVtZW50LnRleHQpCisgICAgaWYgZWxlbWVudC50YWlsIGlzIG5vdCBOb25lOgorICAgICAgICBjaGVja19zdHJpbmcoZWxlbWVudC50YWlsKQorICAgIGZvciBlbGVtIGluIGVsZW1lbnQ6CisgICAgICAgIGNoZWNrX2VsZW1lbnQoZWxlbSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBlbGVtZW50IHRyZWUgdGVzdHMKKworZGVmIGludGVyZmFjZSgpOgorICAgIHIiIiIKKyAgICBUZXN0IGVsZW1lbnQgdHJlZSBpbnRlcmZhY2UuCisKKyAgICA+Pj4gZWxlbWVudCA9IEVULkVsZW1lbnQoInRhZyIpCisgICAgPj4+IGNoZWNrX2VsZW1lbnQoZWxlbWVudCkKKyAgICA+Pj4gdHJlZSA9IEVULkVsZW1lbnRUcmVlKGVsZW1lbnQpCisgICAgPj4+IGNoZWNrX2VsZW1lbnQodHJlZS5nZXRyb290KCkpCisKKyAgICA+Pj4gZWxlbWVudCA9IEVULkVsZW1lbnQoInRceGU0ZyIsIGtleT0idmFsdWUiKQorICAgID4+PiB0cmVlID0gRVQuRWxlbWVudFRyZWUoZWxlbWVudCkKKyAgICA+Pj4gcmVwcihlbGVtZW50KSAgICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgIjxFbGVtZW50ICd0XFx4ZTRnJyBhdCAweC4uLj4iCisgICAgPj4+IGVsZW1lbnQgPSBFVC5FbGVtZW50KCJ0YWciLCBrZXk9InZhbHVlIikKKworICAgIE1ha2Ugc3VyZSBhbGwgc3RhbmRhcmQgZWxlbWVudCBtZXRob2RzIGV4aXN0LgorCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50LmFwcGVuZCkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuZXh0ZW5kKQorICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5pbnNlcnQpCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50LnJlbW92ZSkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuZ2V0Y2hpbGRyZW4pCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50LmZpbmQpCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50Lml0ZXJmaW5kKQorICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5maW5kYWxsKQorICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5maW5kdGV4dCkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuY2xlYXIpCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50LmdldCkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuc2V0KQorICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5rZXlzKQorICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5pdGVtcykKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuaXRlcikKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuaXRlcnRleHQpCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50LmdldGl0ZXJhdG9yKQorCisgICAgVGhlc2UgbWV0aG9kcyByZXR1cm4gYW4gaXRlcmFibGUuIFNlZSBidWcgNjQ3Mi4KKworICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5pdGVyKCJ0YWciKS5uZXh0KQorICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5pdGVyZmluZCgidGFnIikubmV4dCkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuaXRlcmZpbmQoIioiKS5uZXh0KQorICAgID4+PiBjaGVja19tZXRob2QodHJlZS5pdGVyKCJ0YWciKS5uZXh0KQorICAgID4+PiBjaGVja19tZXRob2QodHJlZS5pdGVyZmluZCgidGFnIikubmV4dCkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKHRyZWUuaXRlcmZpbmQoIioiKS5uZXh0KQorCisgICAgVGhlc2UgYWxpYXNlcyBhcmUgcHJvdmlkZWQ6CisKKyAgICA+Pj4gYXNzZXJ0IEVULlhNTCA9PSBFVC5mcm9tc3RyaW5nCisgICAgPj4+IGFzc2VydCBFVC5QSSA9PSBFVC5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KKyAgICA+Pj4gYXNzZXJ0IEVULlhNTFBhcnNlciA9PSBFVC5YTUxUcmVlQnVpbGRlcgorICAgICIiIgorCitkZWYgc2ltcGxlb3BzKCk6CisgICAgIiIiCisgICAgQmFzaWMgbWV0aG9kIHNhbml0eSBjaGVja3MuCisKKyAgICA+Pj4gZWxlbSA9IEVULlhNTCgiPGJvZHk+PHRhZy8+PC9ib2R5PiIpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKQorICAgICc8Ym9keT48dGFnIC8+PC9ib2R5PicKKyAgICA+Pj4gZSA9IEVULkVsZW1lbnQoInRhZzIiKQorICAgID4+PiBlbGVtLmFwcGVuZChlKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPGJvZHk+PHRhZyAvPjx0YWcyIC8+PC9ib2R5PicKKyAgICA+Pj4gZWxlbS5yZW1vdmUoZSkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJzxib2R5Pjx0YWcgLz48L2JvZHk+JworICAgID4+PiBlbGVtLmluc2VydCgwLCBlKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPGJvZHk+PHRhZzIgLz48dGFnIC8+PC9ib2R5PicKKyAgICA+Pj4gZWxlbS5yZW1vdmUoZSkKKyAgICA+Pj4gZWxlbS5leHRlbmQoW2VdKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPGJvZHk+PHRhZyAvPjx0YWcyIC8+PC9ib2R5PicKKyAgICA+Pj4gZWxlbS5yZW1vdmUoZSkKKworICAgID4+PiBlbGVtZW50ID0gRVQuRWxlbWVudCgidGFnIiwga2V5PSJ2YWx1ZSIpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtZW50KSAjIDEKKyAgICAnPHRhZyBrZXk9InZhbHVlIiAvPicKKyAgICA+Pj4gc3ViZWxlbWVudCA9IEVULkVsZW1lbnQoInN1YnRhZyIpCisgICAgPj4+IGVsZW1lbnQuYXBwZW5kKHN1YmVsZW1lbnQpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtZW50KSAjIDIKKyAgICAnPHRhZyBrZXk9InZhbHVlIj48c3VidGFnIC8+PC90YWc+JworICAgID4+PiBlbGVtZW50Lmluc2VydCgwLCBzdWJlbGVtZW50KQorICAgID4+PiBzZXJpYWxpemUoZWxlbWVudCkgIyAzCisgICAgJzx0YWcga2V5PSJ2YWx1ZSI+PHN1YnRhZyAvPjxzdWJ0YWcgLz48L3RhZz4nCisgICAgPj4+IGVsZW1lbnQucmVtb3ZlKHN1YmVsZW1lbnQpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtZW50KSAjIDQKKyAgICAnPHRhZyBrZXk9InZhbHVlIj48c3VidGFnIC8+PC90YWc+JworICAgID4+PiBlbGVtZW50LnJlbW92ZShzdWJlbGVtZW50KQorICAgID4+PiBzZXJpYWxpemUoZWxlbWVudCkgIyA1CisgICAgJzx0YWcga2V5PSJ2YWx1ZSIgLz4nCisgICAgPj4+IGVsZW1lbnQucmVtb3ZlKHN1YmVsZW1lbnQpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFZhbHVlRXJyb3I6IGxpc3QucmVtb3ZlKHgpOiB4IG5vdCBpbiBsaXN0CisgICAgPj4+IHNlcmlhbGl6ZShlbGVtZW50KSAjIDYKKyAgICAnPHRhZyBrZXk9InZhbHVlIiAvPicKKyAgICA+Pj4gZWxlbWVudFswOjBdID0gW3N1YmVsZW1lbnQsIHN1YmVsZW1lbnQsIHN1YmVsZW1lbnRdCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtZW50WzFdKQorICAgICc8c3VidGFnIC8+JworICAgID4+PiBlbGVtZW50WzE6OV0gPT0gW2VsZW1lbnRbMV0sIGVsZW1lbnRbMl1dCisgICAgVHJ1ZQorICAgID4+PiBlbGVtZW50Wzo5OjJdID09IFtlbGVtZW50WzBdLCBlbGVtZW50WzJdXQorICAgIFRydWUKKyAgICA+Pj4gZGVsIGVsZW1lbnRbMToyXQorICAgID4+PiBzZXJpYWxpemUoZWxlbWVudCkKKyAgICAnPHRhZyBrZXk9InZhbHVlIj48c3VidGFnIC8+PHN1YnRhZyAvPjwvdGFnPicKKyAgICAiIiIKKworZGVmIGNkYXRhKCk6CisgICAgIiIiCisgICAgVGVzdCBDREFUQSBoYW5kbGluZyAoZXRjKS4KKworICAgID4+PiBzZXJpYWxpemUoRVQuWE1MKCI8dGFnPmhlbGxvPC90YWc+IikpCisgICAgJzx0YWc+aGVsbG88L3RhZz4nCisgICAgPj4+IHNlcmlhbGl6ZShFVC5YTUwoIjx0YWc+JiMxMDQ7JiMxMDE7JiMxMDg7JiMxMDg7JiMxMTE7PC90YWc+IikpCisgICAgJzx0YWc+aGVsbG88L3RhZz4nCisgICAgPj4+IHNlcmlhbGl6ZShFVC5YTUwoIjx0YWc+PCFbQ0RBVEFbaGVsbG9dXT48L3RhZz4iKSkKKyAgICAnPHRhZz5oZWxsbzwvdGFnPicKKyAgICAiIiIKKworIyBPbmx5IHdpdGggUHl0aG9uIGltcGxlbWVudGF0aW9uCitkZWYgc2ltcGxlZmluZCgpOgorICAgICIiIgorICAgIFRlc3QgZmluZCBtZXRob2RzIHVzaW5nIHRoZSBlbGVtZW50cGF0aCBmYWxsYmFjay4KKworICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUKKworICAgID4+PiBDdXJyZW50RWxlbWVudFBhdGggPSBFbGVtZW50VHJlZS5FbGVtZW50UGF0aAorICAgID4+PiBFbGVtZW50VHJlZS5FbGVtZW50UGF0aCA9IEVsZW1lbnRUcmVlLl9TaW1wbGVFbGVtZW50UGF0aCgpCisgICAgPj4+IGVsZW0gPSBFbGVtZW50VHJlZS5YTUwoU0FNUExFX1hNTCkKKyAgICA+Pj4gZWxlbS5maW5kKCJ0YWciKS50YWcKKyAgICAndGFnJworICAgID4+PiBFbGVtZW50VHJlZS5FbGVtZW50VHJlZShlbGVtKS5maW5kKCJ0YWciKS50YWcKKyAgICAndGFnJworICAgID4+PiBlbGVtLmZpbmR0ZXh0KCJ0YWciKQorICAgICd0ZXh0JworICAgID4+PiBlbGVtLmZpbmR0ZXh0KCJ0b2ciKQorICAgID4+PiBlbGVtLmZpbmR0ZXh0KCJ0b2ciLCAiZGVmYXVsdCIpCisgICAgJ2RlZmF1bHQnCisgICAgPj4+IEVsZW1lbnRUcmVlLkVsZW1lbnRUcmVlKGVsZW0pLmZpbmR0ZXh0KCJ0YWciKQorICAgICd0ZXh0JworICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoInRhZyIpKQorICAgIFsndGFnJywgJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgiLi8vdGFnIikpCisgICAgWyd0YWcnLCAndGFnJywgJ3RhZyddCisKKyAgICBQYXRoIHN5bnRheCBkb2Vzbid0IHdvcmsgaW4gdGhpcyBjYXNlLgorCisgICAgPj4+IGVsZW0uZmluZCgic2VjdGlvbi90YWciKQorICAgID4+PiBlbGVtLmZpbmR0ZXh0KCJzZWN0aW9uL3RhZyIpCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgic2VjdGlvbi90YWciKSkKKyAgICBbXQorCisgICAgPj4+IEVsZW1lbnRUcmVlLkVsZW1lbnRQYXRoID0gQ3VycmVudEVsZW1lbnRQYXRoCisgICAgIiIiCisKK2RlZiBmaW5kKCk6CisgICAgIiIiCisgICAgVGVzdCBmaW5kIG1ldGhvZHMgKGluY2x1ZGluZyB4cGF0aCBzeW50YXgpLgorCisgICAgPj4+IGVsZW0gPSBFVC5YTUwoU0FNUExFX1hNTCkKKyAgICA+Pj4gZWxlbS5maW5kKCJ0YWciKS50YWcKKyAgICAndGFnJworICAgID4+PiBFVC5FbGVtZW50VHJlZShlbGVtKS5maW5kKCJ0YWciKS50YWcKKyAgICAndGFnJworICAgID4+PiBlbGVtLmZpbmQoInNlY3Rpb24vdGFnIikudGFnCisgICAgJ3RhZycKKyAgICA+Pj4gZWxlbS5maW5kKCIuL3RhZyIpLnRhZworICAgICd0YWcnCisgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmQoIi4vdGFnIikudGFnCisgICAgJ3RhZycKKyAgICA+Pj4gRVQuRWxlbWVudFRyZWUoZWxlbSkuZmluZCgiL3RhZyIpLnRhZworICAgICd0YWcnCisgICAgPj4+IGVsZW1bMl0gPSBFVC5YTUwoU0FNUExFX1NFQ1RJT04pCisgICAgPj4+IGVsZW0uZmluZCgic2VjdGlvbi9uZXh0dGFnIikudGFnCisgICAgJ25leHR0YWcnCisgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmQoInNlY3Rpb24vdGFnIikudGFnCisgICAgJ3RhZycKKyAgICA+Pj4gRVQuRWxlbWVudFRyZWUoZWxlbSkuZmluZCgidG9nIikKKyAgICA+Pj4gRVQuRWxlbWVudFRyZWUoZWxlbSkuZmluZCgidG9nL2ZvbyIpCisgICAgPj4+IGVsZW0uZmluZHRleHQoInRhZyIpCisgICAgJ3RleHQnCisgICAgPj4+IGVsZW0uZmluZHRleHQoInNlY3Rpb24vbmV4dHRhZyIpCisgICAgJycKKyAgICA+Pj4gZWxlbS5maW5kdGV4dCgic2VjdGlvbi9uZXh0dGFnIiwgImRlZmF1bHQiKQorICAgICcnCisgICAgPj4+IGVsZW0uZmluZHRleHQoInRvZyIpCisgICAgPj4+IGVsZW0uZmluZHRleHQoInRvZyIsICJkZWZhdWx0IikKKyAgICAnZGVmYXVsdCcKKyAgICA+Pj4gRVQuRWxlbWVudFRyZWUoZWxlbSkuZmluZHRleHQoInRhZyIpCisgICAgJ3RleHQnCisgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmR0ZXh0KCJ0b2cvZm9vIikKKyAgICA+Pj4gRVQuRWxlbWVudFRyZWUoZWxlbSkuZmluZHRleHQoInRvZy9mb28iLCAiZGVmYXVsdCIpCisgICAgJ2RlZmF1bHQnCisgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmR0ZXh0KCIuL3RhZyIpCisgICAgJ3RleHQnCisgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmR0ZXh0KCIvdGFnIikKKyAgICAndGV4dCcKKyAgICA+Pj4gZWxlbS5maW5kdGV4dCgic2VjdGlvbi90YWciKQorICAgICdzdWJ0ZXh0JworICAgID4+PiBFVC5FbGVtZW50VHJlZShlbGVtKS5maW5kdGV4dCgic2VjdGlvbi90YWciKQorICAgICdzdWJ0ZXh0JworICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIi4iKSkKKyAgICBbJ2JvZHknXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoInRhZyIpKQorICAgIFsndGFnJywgJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgidG9nIikpCisgICAgW10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCJ0b2cvZm9vIikpCisgICAgW10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCIqIikpCisgICAgWyd0YWcnLCAndGFnJywgJ3NlY3Rpb24nXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIi4vL3RhZyIpKQorICAgIFsndGFnJywgJ3RhZycsICd0YWcnLCAndGFnJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCJzZWN0aW9uL3RhZyIpKQorICAgIFsndGFnJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCJzZWN0aW9uLy90YWciKSkKKyAgICBbJ3RhZycsICd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoInNlY3Rpb24vKiIpKQorICAgIFsndGFnJywgJ25leHR0YWcnLCAnbmV4dHNlY3Rpb24nXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoInNlY3Rpb24vLyoiKSkKKyAgICBbJ3RhZycsICduZXh0dGFnJywgJ25leHRzZWN0aW9uJywgJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgic2VjdGlvbi8uLy8qIikpCisgICAgWyd0YWcnLCAnbmV4dHRhZycsICduZXh0c2VjdGlvbicsICd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIiovKiIpKQorICAgIFsndGFnJywgJ25leHR0YWcnLCAnbmV4dHNlY3Rpb24nXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIiovLyoiKSkKKyAgICBbJ3RhZycsICduZXh0dGFnJywgJ25leHRzZWN0aW9uJywgJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgiKi90YWciKSkKKyAgICBbJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgiKi8uL3RhZyIpKQorICAgIFsndGFnJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCIuL3RhZyIpKQorICAgIFsndGFnJywgJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgiLi8vdGFnIikpCisgICAgWyd0YWcnLCAndGFnJywgJ3RhZycsICd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIi4vLi90YWciKSkKKyAgICBbJ3RhZycsICd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIi4vL3RhZ1tAY2xhc3NdIikpCisgICAgWyd0YWcnLCAndGFnJywgJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgiLi8vdGFnW0BjbGFzcz0nYSddIikpCisgICAgWyd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIi4vL3RhZ1tAY2xhc3M9J2InXSIpKQorICAgIFsndGFnJywgJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgiLi8vdGFnW0BpZF0iKSkKKyAgICBbJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgiLi8vc2VjdGlvblt0YWddIikpCisgICAgWydzZWN0aW9uJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCIuLy9zZWN0aW9uW2VsZW1lbnRdIikpCisgICAgW10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCIuLi90YWciKSkKKyAgICBbXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoInNlY3Rpb24vLi4vdGFnIikpCisgICAgWyd0YWcnLCAndGFnJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoRVQuRWxlbWVudFRyZWUoZWxlbSkuZmluZGFsbCgiLi90YWciKSkKKyAgICBbJ3RhZycsICd0YWcnXQorCisgICAgRm9sbG93aW5nIGV4YW1wbGUgaXMgaW52YWxpZCBpbiAxLjIuCisgICAgQSBsZWFkaW5nICcqJyBpcyBhc3N1bWVkIGluIDEuMy4KKworICAgID4+PiBlbGVtLmZpbmRhbGwoInNlY3Rpb24vLyIpID09IGVsZW0uZmluZGFsbCgic2VjdGlvbi8vKiIpCisgICAgVHJ1ZQorCisgICAgRVQncyBQYXRoIG1vZHVsZSBoYW5kbGVzIHRoaXMgY2FzZSBpbmNvcnJlY3RseTsgdGhpcyBnaXZlcworICAgIGEgd2FybmluZyBpbiAxLjMsIGFuZCB0aGUgYmVoYXZpb3VyIHdpbGwgYmUgbW9kaWZpZWQgaW4gMS40LgorCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmRhbGwoIi90YWciKSkKKyAgICBbJ3RhZycsICd0YWcnXQorCisgICAgPj4+IGVsZW0gPSBFVC5YTUwoU0FNUExFX1hNTF9OUykKKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCJ0YWciKSkKKyAgICBbXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIntodHRwOi8vZWZmYm90Lm9yZy9uc310YWciKSkKKyAgICBbJ3todHRwOi8vZWZmYm90Lm9yZy9uc310YWcnLCAne2h0dHA6Ly9lZmZib3Qub3JnL25zfXRhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgiLi8ve2h0dHA6Ly9lZmZib3Qub3JnL25zfXRhZyIpKQorICAgIFsne2h0dHA6Ly9lZmZib3Qub3JnL25zfXRhZycsICd7aHR0cDovL2VmZmJvdC5vcmcvbnN9dGFnJywgJ3todHRwOi8vZWZmYm90Lm9yZy9uc310YWcnXQorICAgICIiIgorCitkZWYgZmlsZV9pbml0KCk6CisgICAgIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworCisgICAgPj4+IHN0cmluZ2ZpbGUgPSBTdHJpbmdJTy5TdHJpbmdJTyhTQU1QTEVfWE1MKQorICAgID4+PiB0cmVlID0gRVQuRWxlbWVudFRyZWUoZmlsZT1zdHJpbmdmaWxlKQorICAgID4+PiB0cmVlLmZpbmQoInRhZyIpLnRhZworICAgICd0YWcnCisgICAgPj4+IHRyZWUuZmluZCgic2VjdGlvbi90YWciKS50YWcKKyAgICAndGFnJworCisgICAgPj4+IHRyZWUgPSBFVC5FbGVtZW50VHJlZShmaWxlPVNJTVBMRV9YTUxGSUxFKQorICAgID4+PiB0cmVlLmZpbmQoImVsZW1lbnQiKS50YWcKKyAgICAnZWxlbWVudCcKKyAgICA+Pj4gdHJlZS5maW5kKCJlbGVtZW50Ly4uL2VtcHR5LWVsZW1lbnQiKS50YWcKKyAgICAnZW1wdHktZWxlbWVudCcKKyAgICAiIiIKKworZGVmIGJhZF9maW5kKCk6CisgICAgIiIiCisgICAgQ2hlY2sgYmFkIG9yIHVuc3VwcG9ydGVkIHBhdGggZXhwcmVzc2lvbnMuCisKKyAgICA+Pj4gZWxlbSA9IEVULlhNTChTQU1QTEVfWE1MKQorICAgID4+PiBlbGVtLmZpbmRhbGwoIi90YWciKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBTeW50YXhFcnJvcjogY2Fubm90IHVzZSBhYnNvbHV0ZSBwYXRoIG9uIGVsZW1lbnQKKyAgICAiIiIKKworZGVmIHBhdGhfY2FjaGUoKToKKyAgICAiIiIKKyAgICBDaGVjayB0aGF0IHRoZSBwYXRoIGNhY2hlIGJlaGF2ZXMgc2FuZWx5LgorCisgICAgPj4+IGVsZW0gPSBFVC5YTUwoU0FNUExFX1hNTCkKKyAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoMTApOiBFVC5FbGVtZW50VHJlZShlbGVtKS5maW5kKCcuLycrc3RyKGkpKQorICAgID4+PiBjYWNoZV9sZW5fMTAgPSBsZW4oRVQuRWxlbWVudFBhdGguX2NhY2hlKQorICAgID4+PiBmb3IgaSBpbiByYW5nZSgxMCk6IEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmQoJy4vJytzdHIoaSkpCisgICAgPj4+IGxlbihFVC5FbGVtZW50UGF0aC5fY2FjaGUpID09IGNhY2hlX2xlbl8xMAorICAgIFRydWUKKyAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoMjApOiBFVC5FbGVtZW50VHJlZShlbGVtKS5maW5kKCcuLycrc3RyKGkpKQorICAgID4+PiBsZW4oRVQuRWxlbWVudFBhdGguX2NhY2hlKSA+IGNhY2hlX2xlbl8xMAorICAgIFRydWUKKyAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoNjAwKTogRVQuRWxlbWVudFRyZWUoZWxlbSkuZmluZCgnLi8nK3N0cihpKSkKKyAgICA+Pj4gbGVuKEVULkVsZW1lbnRQYXRoLl9jYWNoZSkgPCA1MDAKKyAgICBUcnVlCisgICAgIiIiCisKK2RlZiBjb3B5KCk6CisgICAgIiIiCisgICAgVGVzdCBjb3B5IGhhbmRsaW5nIChldGMpLgorCisgICAgPj4+IGltcG9ydCBjb3B5CisgICAgPj4+IGUxID0gRVQuWE1MKCI8dGFnPmhlbGxvPGZvby8+PC90YWc+IikKKyAgICA+Pj4gZTIgPSBjb3B5LmNvcHkoZTEpCisgICAgPj4+IGUzID0gY29weS5kZWVwY29weShlMSkKKyAgICA+Pj4gZTEuZmluZCgiZm9vIikudGFnID0gImJhciIKKyAgICA+Pj4gc2VyaWFsaXplKGUxKQorICAgICc8dGFnPmhlbGxvPGJhciAvPjwvdGFnPicKKyAgICA+Pj4gc2VyaWFsaXplKGUyKQorICAgICc8dGFnPmhlbGxvPGJhciAvPjwvdGFnPicKKyAgICA+Pj4gc2VyaWFsaXplKGUzKQorICAgICc8dGFnPmhlbGxvPGZvbyAvPjwvdGFnPicKKworICAgICIiIgorCitkZWYgYXR0cmliKCk6CisgICAgIiIiCisgICAgVGVzdCBhdHRyaWJ1dGUgaGFuZGxpbmcuCisKKyAgICA+Pj4gZWxlbSA9IEVULkVsZW1lbnQoInRhZyIpCisgICAgPj4+IGVsZW0uZ2V0KCJrZXkiKSAjIDEuMQorICAgID4+PiBlbGVtLmdldCgia2V5IiwgImRlZmF1bHQiKSAjIDEuMgorICAgICdkZWZhdWx0JworICAgID4+PiBlbGVtLnNldCgia2V5IiwgInZhbHVlIikKKyAgICA+Pj4gZWxlbS5nZXQoImtleSIpICMgMS4zCisgICAgJ3ZhbHVlJworCisgICAgPj4+IGVsZW0gPSBFVC5FbGVtZW50KCJ0YWciLCBrZXk9InZhbHVlIikKKyAgICA+Pj4gZWxlbS5nZXQoImtleSIpICMgMi4xCisgICAgJ3ZhbHVlJworICAgID4+PiBlbGVtLmF0dHJpYiAjIDIuMgorICAgIHsna2V5JzogJ3ZhbHVlJ30KKworICAgID4+PiBhdHRyaWIgPSB7ImtleSI6ICJ2YWx1ZSJ9CisgICAgPj4+IGVsZW0gPSBFVC5FbGVtZW50KCJ0YWciLCBhdHRyaWIpCisgICAgPj4+IGF0dHJpYi5jbGVhcigpICMgY2hlY2sgZm9yIGFsaWFzaW5nIGlzc3VlcworICAgID4+PiBlbGVtLmdldCgia2V5IikgIyAzLjEKKyAgICAndmFsdWUnCisgICAgPj4+IGVsZW0uYXR0cmliICMgMy4yCisgICAgeydrZXknOiAndmFsdWUnfQorCisgICAgPj4+IGF0dHJpYiA9IHsia2V5IjogInZhbHVlIn0KKyAgICA+Pj4gZWxlbSA9IEVULkVsZW1lbnQoInRhZyIsICoqYXR0cmliKQorICAgID4+PiBhdHRyaWIuY2xlYXIoKSAjIGNoZWNrIGZvciBhbGlhc2luZyBpc3N1ZXMKKyAgICA+Pj4gZWxlbS5nZXQoImtleSIpICMgNC4xCisgICAgJ3ZhbHVlJworICAgID4+PiBlbGVtLmF0dHJpYiAjIDQuMgorICAgIHsna2V5JzogJ3ZhbHVlJ30KKworICAgID4+PiBlbGVtID0gRVQuRWxlbWVudCgidGFnIiwgeyJrZXkiOiAib3RoZXIifSwga2V5PSJ2YWx1ZSIpCisgICAgPj4+IGVsZW0uZ2V0KCJrZXkiKSAjIDUuMQorICAgICd2YWx1ZScKKyAgICA+Pj4gZWxlbS5hdHRyaWIgIyA1LjIKKyAgICB7J2tleSc6ICd2YWx1ZSd9CisKKyAgICA+Pj4gZWxlbSA9IEVULkVsZW1lbnQoJ3Rlc3QnKQorICAgID4+PiBlbGVtLnRleHQgPSAiYWEiCisgICAgPj4+IGVsZW0uc2V0KCd0ZXN0YScsICd0ZXN0dmFsJykKKyAgICA+Pj4gZWxlbS5zZXQoJ3Rlc3RiJywgJ3Rlc3QyJykKKyAgICA+Pj4gRVQudG9zdHJpbmcoZWxlbSkKKyAgICAnPHRlc3QgdGVzdGE9InRlc3R2YWwiIHRlc3RiPSJ0ZXN0MiI+YWE8L3Rlc3Q+JworICAgID4+PiBzb3J0ZWQoZWxlbS5rZXlzKCkpCisgICAgWyd0ZXN0YScsICd0ZXN0YiddCisgICAgPj4+IHNvcnRlZChlbGVtLml0ZW1zKCkpCisgICAgWygndGVzdGEnLCAndGVzdHZhbCcpLCAoJ3Rlc3RiJywgJ3Rlc3QyJyldCisgICAgPj4+IGVsZW0uYXR0cmliWyd0ZXN0YiddCisgICAgJ3Rlc3QyJworICAgID4+PiBlbGVtLmF0dHJpYlsndGVzdGInXSA9ICd0ZXN0MScKKyAgICA+Pj4gZWxlbS5hdHRyaWJbJ3Rlc3RjJ10gPSAndGVzdDInCisgICAgPj4+IEVULnRvc3RyaW5nKGVsZW0pCisgICAgJzx0ZXN0IHRlc3RhPSJ0ZXN0dmFsIiB0ZXN0Yj0idGVzdDEiIHRlc3RjPSJ0ZXN0MiI+YWE8L3Rlc3Q+JworICAgICIiIgorCitkZWYgbWFrZWVsZW1lbnQoKToKKyAgICAiIiIKKyAgICBUZXN0IG1ha2VlbGVtZW50IGhhbmRsaW5nLgorCisgICAgPj4+IGVsZW0gPSBFVC5FbGVtZW50KCJ0YWciKQorICAgID4+PiBhdHRyaWIgPSB7ImtleSI6ICJ2YWx1ZSJ9CisgICAgPj4+IHN1YmVsZW0gPSBlbGVtLm1ha2VlbGVtZW50KCJzdWJ0YWciLCBhdHRyaWIpCisgICAgPj4+IGlmIHN1YmVsZW0uYXR0cmliIGlzIGF0dHJpYjoKKyAgICAuLi4gICAgIHByaW50ICJhdHRyaWIgYWxpYXNpbmciCisgICAgPj4+IGVsZW0uYXBwZW5kKHN1YmVsZW0pCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKQorICAgICc8dGFnPjxzdWJ0YWcga2V5PSJ2YWx1ZSIgLz48L3RhZz4nCisKKyAgICA+Pj4gZWxlbS5jbGVhcigpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKQorICAgICc8dGFnIC8+JworICAgID4+PiBlbGVtLmFwcGVuZChzdWJlbGVtKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPHRhZz48c3VidGFnIGtleT0idmFsdWUiIC8+PC90YWc+JworICAgID4+PiBlbGVtLmV4dGVuZChbc3ViZWxlbSwgc3ViZWxlbV0pCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKQorICAgICc8dGFnPjxzdWJ0YWcga2V5PSJ2YWx1ZSIgLz48c3VidGFnIGtleT0idmFsdWUiIC8+PHN1YnRhZyBrZXk9InZhbHVlIiAvPjwvdGFnPicKKyAgICA+Pj4gZWxlbVs6XSA9IFtzdWJlbGVtXQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPHRhZz48c3VidGFnIGtleT0idmFsdWUiIC8+PC90YWc+JworICAgID4+PiBlbGVtWzpdID0gdHVwbGUoW3N1YmVsZW1dKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPHRhZz48c3VidGFnIGtleT0idmFsdWUiIC8+PC90YWc+JworCisgICAgIiIiCisKK2RlZiBwYXJzZWZpbGUoKToKKyAgICAiIiIKKyAgICBUZXN0IHBhcnNpbmcgZnJvbSBmaWxlLgorCisgICAgPj4+IHRyZWUgPSBFVC5wYXJzZShTSU1QTEVfWE1MRklMRSkKKyAgICA+Pj4gbm9ybWFsaXplX2NybGYodHJlZSkKKyAgICA+Pj4gdHJlZS53cml0ZShzeXMuc3Rkb3V0KQorICAgIDxyb290PgorICAgICAgIDxlbGVtZW50IGtleT0idmFsdWUiPnRleHQ8L2VsZW1lbnQ+CisgICAgICAgPGVsZW1lbnQ+dGV4dDwvZWxlbWVudD50YWlsCisgICAgICAgPGVtcHR5LWVsZW1lbnQgLz4KKyAgICA8L3Jvb3Q+CisgICAgPj4+IHRyZWUgPSBFVC5wYXJzZShTSU1QTEVfTlNfWE1MRklMRSkKKyAgICA+Pj4gbm9ybWFsaXplX2NybGYodHJlZSkKKyAgICA+Pj4gdHJlZS53cml0ZShzeXMuc3Rkb3V0KQorICAgIDxuczA6cm9vdCB4bWxuczpuczA9Im5hbWVzcGFjZSI+CisgICAgICAgPG5zMDplbGVtZW50IGtleT0idmFsdWUiPnRleHQ8L25zMDplbGVtZW50PgorICAgICAgIDxuczA6ZWxlbWVudD50ZXh0PC9uczA6ZWxlbWVudD50YWlsCisgICAgICAgPG5zMDplbXB0eS1lbGVtZW50IC8+CisgICAgPC9uczA6cm9vdD4KKworICAgID4+PiB3aXRoIG9wZW4oU0lNUExFX1hNTEZJTEUpIGFzIGY6CisgICAgLi4uICAgICBkYXRhID0gZi5yZWFkKCkKKworICAgID4+PiBwYXJzZXIgPSBFVC5YTUxQYXJzZXIoKQorICAgID4+PiBwYXJzZXIudmVyc2lvbiAgIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAnRXhwYXQgLi4uJworICAgID4+PiBwYXJzZXIuZmVlZChkYXRhKQorICAgID4+PiBwcmludCBzZXJpYWxpemUocGFyc2VyLmNsb3NlKCkpCisgICAgPHJvb3Q+CisgICAgICAgPGVsZW1lbnQga2V5PSJ2YWx1ZSI+dGV4dDwvZWxlbWVudD4KKyAgICAgICA8ZWxlbWVudD50ZXh0PC9lbGVtZW50PnRhaWwKKyAgICAgICA8ZW1wdHktZWxlbWVudCAvPgorICAgIDwvcm9vdD4KKworICAgID4+PiBwYXJzZXIgPSBFVC5YTUxUcmVlQnVpbGRlcigpICMgMS4yIGNvbXBhdGliaWxpdHkKKyAgICA+Pj4gcGFyc2VyLmZlZWQoZGF0YSkKKyAgICA+Pj4gcHJpbnQgc2VyaWFsaXplKHBhcnNlci5jbG9zZSgpKQorICAgIDxyb290PgorICAgICAgIDxlbGVtZW50IGtleT0idmFsdWUiPnRleHQ8L2VsZW1lbnQ+CisgICAgICAgPGVsZW1lbnQ+dGV4dDwvZWxlbWVudD50YWlsCisgICAgICAgPGVtcHR5LWVsZW1lbnQgLz4KKyAgICA8L3Jvb3Q+CisKKyAgICA+Pj4gdGFyZ2V0ID0gRVQuVHJlZUJ1aWxkZXIoKQorICAgID4+PiBwYXJzZXIgPSBFVC5YTUxQYXJzZXIodGFyZ2V0PXRhcmdldCkKKyAgICA+Pj4gcGFyc2VyLmZlZWQoZGF0YSkKKyAgICA+Pj4gcHJpbnQgc2VyaWFsaXplKHBhcnNlci5jbG9zZSgpKQorICAgIDxyb290PgorICAgICAgIDxlbGVtZW50IGtleT0idmFsdWUiPnRleHQ8L2VsZW1lbnQ+CisgICAgICAgPGVsZW1lbnQ+dGV4dDwvZWxlbWVudD50YWlsCisgICAgICAgPGVtcHR5LWVsZW1lbnQgLz4KKyAgICA8L3Jvb3Q+CisgICAgIiIiCisKK2RlZiBwYXJzZWxpdGVyYWwoKToKKyAgICAiIiIKKyAgICA+Pj4gZWxlbWVudCA9IEVULlhNTCgiPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+IikKKyAgICA+Pj4gRVQuRWxlbWVudFRyZWUoZWxlbWVudCkud3JpdGUoc3lzLnN0ZG91dCkKKyAgICA8aHRtbD48Ym9keT50ZXh0PC9ib2R5PjwvaHRtbD4KKyAgICA+Pj4gZWxlbWVudCA9IEVULmZyb21zdHJpbmcoIjxodG1sPjxib2R5PnRleHQ8L2JvZHk+PC9odG1sPiIpCisgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW1lbnQpLndyaXRlKHN5cy5zdGRvdXQpCisgICAgPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+CisgICAgPj4+IHNlcXVlbmNlID0gWyI8aHRtbD48Ym9keT4iLCAidGV4dDwvYm8iLCAiZHk+PC9odG1sPiJdCisgICAgPj4+IGVsZW1lbnQgPSBFVC5mcm9tc3RyaW5nbGlzdChzZXF1ZW5jZSkKKyAgICA+Pj4gcHJpbnQgRVQudG9zdHJpbmcoZWxlbWVudCkKKyAgICA8aHRtbD48Ym9keT50ZXh0PC9ib2R5PjwvaHRtbD4KKyAgICA+Pj4gcHJpbnQgIiIuam9pbihFVC50b3N0cmluZ2xpc3QoZWxlbWVudCkpCisgICAgPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+CisgICAgPj4+IEVULnRvc3RyaW5nKGVsZW1lbnQsICJhc2NpaSIpCisgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2FzY2lpJz8+XFxuPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+IgorICAgID4+PiBfLCBpZHMgPSBFVC5YTUxJRCgiPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+IikKKyAgICA+Pj4gbGVuKGlkcykKKyAgICAwCisgICAgPj4+IF8sIGlkcyA9IEVULlhNTElEKCI8aHRtbD48Ym9keSBpZD0nYm9keSc+dGV4dDwvYm9keT48L2h0bWw+IikKKyAgICA+Pj4gbGVuKGlkcykKKyAgICAxCisgICAgPj4+IGlkc1siYm9keSJdLnRhZworICAgICdib2R5JworICAgICIiIgorCitkZWYgaXRlcnBhcnNlKCk6CisgICAgIiIiCisgICAgVGVzdCBpdGVycGFyc2UgaW50ZXJmYWNlLgorCisgICAgPj4+IGl0ZXJwYXJzZSA9IEVULml0ZXJwYXJzZQorCisgICAgPj4+IGNvbnRleHQgPSBpdGVycGFyc2UoU0lNUExFX1hNTEZJTEUpCisgICAgPj4+IGFjdGlvbiwgZWxlbSA9IG5leHQoY29udGV4dCkKKyAgICA+Pj4gcHJpbnQgYWN0aW9uLCBlbGVtLnRhZworICAgIGVuZCBlbGVtZW50CisgICAgPj4+IGZvciBhY3Rpb24sIGVsZW0gaW4gY29udGV4dDoKKyAgICAuLi4gICBwcmludCBhY3Rpb24sIGVsZW0udGFnCisgICAgZW5kIGVsZW1lbnQKKyAgICBlbmQgZW1wdHktZWxlbWVudAorICAgIGVuZCByb290CisgICAgPj4+IGNvbnRleHQucm9vdC50YWcKKyAgICAncm9vdCcKKworICAgID4+PiBjb250ZXh0ID0gaXRlcnBhcnNlKFNJTVBMRV9OU19YTUxGSUxFKQorICAgID4+PiBmb3IgYWN0aW9uLCBlbGVtIGluIGNvbnRleHQ6CisgICAgLi4uICAgcHJpbnQgYWN0aW9uLCBlbGVtLnRhZworICAgIGVuZCB7bmFtZXNwYWNlfWVsZW1lbnQKKyAgICBlbmQge25hbWVzcGFjZX1lbGVtZW50CisgICAgZW5kIHtuYW1lc3BhY2V9ZW1wdHktZWxlbWVudAorICAgIGVuZCB7bmFtZXNwYWNlfXJvb3QKKworICAgID4+PiBldmVudHMgPSAoKQorICAgID4+PiBjb250ZXh0ID0gaXRlcnBhcnNlKFNJTVBMRV9YTUxGSUxFLCBldmVudHMpCisgICAgPj4+IGZvciBhY3Rpb24sIGVsZW0gaW4gY29udGV4dDoKKyAgICAuLi4gICBwcmludCBhY3Rpb24sIGVsZW0udGFnCisKKyAgICA+Pj4gZXZlbnRzID0gKCkKKyAgICA+Pj4gY29udGV4dCA9IGl0ZXJwYXJzZShTSU1QTEVfWE1MRklMRSwgZXZlbnRzPWV2ZW50cykKKyAgICA+Pj4gZm9yIGFjdGlvbiwgZWxlbSBpbiBjb250ZXh0OgorICAgIC4uLiAgIHByaW50IGFjdGlvbiwgZWxlbS50YWcKKworICAgID4+PiBldmVudHMgPSAoInN0YXJ0IiwgImVuZCIpCisgICAgPj4+IGNvbnRleHQgPSBpdGVycGFyc2UoU0lNUExFX1hNTEZJTEUsIGV2ZW50cykKKyAgICA+Pj4gZm9yIGFjdGlvbiwgZWxlbSBpbiBjb250ZXh0OgorICAgIC4uLiAgIHByaW50IGFjdGlvbiwgZWxlbS50YWcKKyAgICBzdGFydCByb290CisgICAgc3RhcnQgZWxlbWVudAorICAgIGVuZCBlbGVtZW50CisgICAgc3RhcnQgZWxlbWVudAorICAgIGVuZCBlbGVtZW50CisgICAgc3RhcnQgZW1wdHktZWxlbWVudAorICAgIGVuZCBlbXB0eS1lbGVtZW50CisgICAgZW5kIHJvb3QKKworICAgID4+PiBldmVudHMgPSAoInN0YXJ0IiwgImVuZCIsICJzdGFydC1ucyIsICJlbmQtbnMiKQorICAgID4+PiBjb250ZXh0ID0gaXRlcnBhcnNlKFNJTVBMRV9OU19YTUxGSUxFLCBldmVudHMpCisgICAgPj4+IGZvciBhY3Rpb24sIGVsZW0gaW4gY29udGV4dDoKKyAgICAuLi4gICBpZiBhY3Rpb24gaW4gKCJzdGFydCIsICJlbmQiKToKKyAgICAuLi4gICAgIHByaW50IGFjdGlvbiwgZWxlbS50YWcKKyAgICAuLi4gICBlbHNlOgorICAgIC4uLiAgICAgcHJpbnQgYWN0aW9uLCBlbGVtCisgICAgc3RhcnQtbnMgKCcnLCAnbmFtZXNwYWNlJykKKyAgICBzdGFydCB7bmFtZXNwYWNlfXJvb3QKKyAgICBzdGFydCB7bmFtZXNwYWNlfWVsZW1lbnQKKyAgICBlbmQge25hbWVzcGFjZX1lbGVtZW50CisgICAgc3RhcnQge25hbWVzcGFjZX1lbGVtZW50CisgICAgZW5kIHtuYW1lc3BhY2V9ZWxlbWVudAorICAgIHN0YXJ0IHtuYW1lc3BhY2V9ZW1wdHktZWxlbWVudAorICAgIGVuZCB7bmFtZXNwYWNlfWVtcHR5LWVsZW1lbnQKKyAgICBlbmQge25hbWVzcGFjZX1yb290CisgICAgZW5kLW5zIE5vbmUKKworICAgID4+PiBldmVudHMgPSAoInN0YXJ0IiwgImVuZCIsICJib2d1cyIpCisgICAgPj4+IHdpdGggb3BlbihTSU1QTEVfWE1MRklMRSwgInJiIikgYXMgZjoKKyAgICAuLi4gICAgIGl0ZXJwYXJzZShmLCBldmVudHMpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFZhbHVlRXJyb3I6IHVua25vd24gZXZlbnQgJ2JvZ3VzJworCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworCisgICAgPj4+IHNvdXJjZSA9IFN0cmluZ0lPLlN0cmluZ0lPKAorICAgIC4uLiAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz5cXG4iCisgICAgLi4uICAgICAiPGJvZHkgeG1sbnM9J2h0dHA6Ly8mIzIzMztmZmJvdC5vcmcvbnMnXFxuIgorICAgIC4uLiAgICAgIiAgICAgIHhtbG5zOmNsXFx4ZTk9J2h0dHA6Ly9lZmZib3Qub3JnL25zJz50ZXh0PC9ib2R5PlxcbiIpCisgICAgPj4+IGV2ZW50cyA9ICgic3RhcnQtbnMiLCkKKyAgICA+Pj4gY29udGV4dCA9IGl0ZXJwYXJzZShzb3VyY2UsIGV2ZW50cykKKyAgICA+Pj4gZm9yIGFjdGlvbiwgZWxlbSBpbiBjb250ZXh0OgorICAgIC4uLiAgICAgcHJpbnQgYWN0aW9uLCBlbGVtCisgICAgc3RhcnQtbnMgKCcnLCB1J2h0dHA6Ly9cXHhlOWZmYm90Lm9yZy9ucycpCisgICAgc3RhcnQtbnMgKHUnY2xcXHhlOScsICdodHRwOi8vZWZmYm90Lm9yZy9ucycpCisKKyAgICA+Pj4gc291cmNlID0gU3RyaW5nSU8uU3RyaW5nSU8oIjxkb2N1bWVudCAvPmp1bmsiKQorICAgID4+PiB0cnk6CisgICAgLi4uICAgZm9yIGFjdGlvbiwgZWxlbSBpbiBpdGVycGFyc2Uoc291cmNlKToKKyAgICAuLi4gICAgIHByaW50IGFjdGlvbiwgZWxlbS50YWcKKyAgICAuLi4gZXhjZXB0IEVULlBhcnNlRXJyb3IsIHY6CisgICAgLi4uICAgcHJpbnQgdgorICAgIGVuZCBkb2N1bWVudAorICAgIGp1bmsgYWZ0ZXIgZG9jdW1lbnQgZWxlbWVudDogbGluZSAxLCBjb2x1bW4gMTIKKyAgICAiIiIKKworZGVmIHdyaXRlZmlsZSgpOgorICAgICIiIgorICAgID4+PiBlbGVtID0gRVQuRWxlbWVudCgidGFnIikKKyAgICA+Pj4gZWxlbS50ZXh0ID0gInRleHQiCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKQorICAgICc8dGFnPnRleHQ8L3RhZz4nCisgICAgPj4+IEVULlN1YkVsZW1lbnQoZWxlbSwgInN1YnRhZyIpLnRleHQgPSAic3VidGV4dCIKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJzx0YWc+dGV4dDxzdWJ0YWc+c3VidGV4dDwvc3VidGFnPjwvdGFnPicKKworICAgIFRlc3QgdGFnIHN1cHByZXNzaW9uCisgICAgPj4+IGVsZW0udGFnID0gTm9uZQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAndGV4dDxzdWJ0YWc+c3VidGV4dDwvc3VidGFnPicKKyAgICA+Pj4gZWxlbS5pbnNlcnQoMCwgRVQuQ29tbWVudCgiY29tbWVudCIpKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkgICAgICMgYXNzdW1lcyAxLjMKKyAgICAndGV4dDwhLS1jb21tZW50LS0+PHN1YnRhZz5zdWJ0ZXh0PC9zdWJ0YWc+JworICAgID4+PiBlbGVtWzBdID0gRVQuUEkoImtleSIsICJ2YWx1ZSIpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKQorICAgICd0ZXh0PD9rZXkgdmFsdWU/PjxzdWJ0YWc+c3VidGV4dDwvc3VidGFnPicKKyAgICAiIiIKKworZGVmIGN1c3RvbV9idWlsZGVyKCk6CisgICAgIiIiCisgICAgVGVzdCBwYXJzZXIgdy4gY3VzdG9tIGJ1aWxkZXIuCisKKyAgICA+Pj4gd2l0aCBvcGVuKFNJTVBMRV9YTUxGSUxFKSBhcyBmOgorICAgIC4uLiAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgPj4+IGNsYXNzIEJ1aWxkZXI6CisgICAgLi4uICAgICBkZWYgc3RhcnQoc2VsZiwgdGFnLCBhdHRyaWIpOgorICAgIC4uLiAgICAgICAgIHByaW50ICJzdGFydCIsIHRhZworICAgIC4uLiAgICAgZGVmIGVuZChzZWxmLCB0YWcpOgorICAgIC4uLiAgICAgICAgIHByaW50ICJlbmQiLCB0YWcKKyAgICAuLi4gICAgIGRlZiBkYXRhKHNlbGYsIHRleHQpOgorICAgIC4uLiAgICAgICAgIHBhc3MKKyAgICA+Pj4gYnVpbGRlciA9IEJ1aWxkZXIoKQorICAgID4+PiBwYXJzZXIgPSBFVC5YTUxQYXJzZXIodGFyZ2V0PWJ1aWxkZXIpCisgICAgPj4+IHBhcnNlci5mZWVkKGRhdGEpCisgICAgc3RhcnQgcm9vdAorICAgIHN0YXJ0IGVsZW1lbnQKKyAgICBlbmQgZWxlbWVudAorICAgIHN0YXJ0IGVsZW1lbnQKKyAgICBlbmQgZWxlbWVudAorICAgIHN0YXJ0IGVtcHR5LWVsZW1lbnQKKyAgICBlbmQgZW1wdHktZWxlbWVudAorICAgIGVuZCByb290CisKKyAgICA+Pj4gd2l0aCBvcGVuKFNJTVBMRV9OU19YTUxGSUxFKSBhcyBmOgorICAgIC4uLiAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgPj4+IGNsYXNzIEJ1aWxkZXI6CisgICAgLi4uICAgICBkZWYgc3RhcnQoc2VsZiwgdGFnLCBhdHRyaWIpOgorICAgIC4uLiAgICAgICAgIHByaW50ICJzdGFydCIsIHRhZworICAgIC4uLiAgICAgZGVmIGVuZChzZWxmLCB0YWcpOgorICAgIC4uLiAgICAgICAgIHByaW50ICJlbmQiLCB0YWcKKyAgICAuLi4gICAgIGRlZiBkYXRhKHNlbGYsIHRleHQpOgorICAgIC4uLiAgICAgICAgIHBhc3MKKyAgICAuLi4gICAgIGRlZiBwaShzZWxmLCB0YXJnZXQsIGRhdGEpOgorICAgIC4uLiAgICAgICAgIHByaW50ICJwaSIsIHRhcmdldCwgcmVwcihkYXRhKQorICAgIC4uLiAgICAgZGVmIGNvbW1lbnQoc2VsZiwgZGF0YSk6CisgICAgLi4uICAgICAgICAgcHJpbnQgImNvbW1lbnQiLCByZXByKGRhdGEpCisgICAgPj4+IGJ1aWxkZXIgPSBCdWlsZGVyKCkKKyAgICA+Pj4gcGFyc2VyID0gRVQuWE1MUGFyc2VyKHRhcmdldD1idWlsZGVyKQorICAgID4+PiBwYXJzZXIuZmVlZChkYXRhKQorICAgIHBpIHBpICdkYXRhJworICAgIGNvbW1lbnQgJyBjb21tZW50ICcKKyAgICBzdGFydCB7bmFtZXNwYWNlfXJvb3QKKyAgICBzdGFydCB7bmFtZXNwYWNlfWVsZW1lbnQKKyAgICBlbmQge25hbWVzcGFjZX1lbGVtZW50CisgICAgc3RhcnQge25hbWVzcGFjZX1lbGVtZW50CisgICAgZW5kIHtuYW1lc3BhY2V9ZWxlbWVudAorICAgIHN0YXJ0IHtuYW1lc3BhY2V9ZW1wdHktZWxlbWVudAorICAgIGVuZCB7bmFtZXNwYWNlfWVtcHR5LWVsZW1lbnQKKyAgICBlbmQge25hbWVzcGFjZX1yb290CisKKyAgICAiIiIKKworZGVmIGdldGNoaWxkcmVuKCk6CisgICAgIiIiCisgICAgVGVzdCBFbGVtZW50LmdldGNoaWxkcmVuKCkKKworICAgID4+PiB3aXRoIG9wZW4oU0lNUExFX1hNTEZJTEUsICJyIikgYXMgZjoKKyAgICAuLi4gICAgIHRyZWUgPSBFVC5wYXJzZShmKQorICAgID4+PiBmb3IgZWxlbSBpbiB0cmVlLmdldHJvb3QoKS5pdGVyKCk6CisgICAgLi4uICAgICBzdW1tYXJpemVfbGlzdChlbGVtLmdldGNoaWxkcmVuKCkpCisgICAgWydlbGVtZW50JywgJ2VsZW1lbnQnLCAnZW1wdHktZWxlbWVudCddCisgICAgW10KKyAgICBbXQorICAgIFtdCisgICAgPj4+IGZvciBlbGVtIGluIHRyZWUuZ2V0aXRlcmF0b3IoKToKKyAgICAuLi4gICAgIHN1bW1hcml6ZV9saXN0KGVsZW0uZ2V0Y2hpbGRyZW4oKSkKKyAgICBbJ2VsZW1lbnQnLCAnZWxlbWVudCcsICdlbXB0eS1lbGVtZW50J10KKyAgICBbXQorICAgIFtdCisgICAgW10KKworICAgID4+PiBlbGVtID0gRVQuWE1MKFNBTVBMRV9YTUwpCisgICAgPj4+IGxlbihlbGVtLmdldGNoaWxkcmVuKCkpCisgICAgMworICAgID4+PiBsZW4oZWxlbVsyXS5nZXRjaGlsZHJlbigpKQorICAgIDEKKyAgICA+Pj4gZWxlbVs6XSA9PSBlbGVtLmdldGNoaWxkcmVuKCkKKyAgICBUcnVlCisgICAgPj4+IGNoaWxkMSA9IGVsZW1bMF0KKyAgICA+Pj4gY2hpbGQyID0gZWxlbVsyXQorICAgID4+PiBkZWwgZWxlbVsxOjJdCisgICAgPj4+IGxlbihlbGVtLmdldGNoaWxkcmVuKCkpCisgICAgMgorICAgID4+PiBjaGlsZDEgPT0gZWxlbVswXQorICAgIFRydWUKKyAgICA+Pj4gY2hpbGQyID09IGVsZW1bMV0KKyAgICBUcnVlCisgICAgPj4+IGVsZW1bMDoyXSA9IFtjaGlsZDIsIGNoaWxkMV0KKyAgICA+Pj4gY2hpbGQyID09IGVsZW1bMF0KKyAgICBUcnVlCisgICAgPj4+IGNoaWxkMSA9PSBlbGVtWzFdCisgICAgVHJ1ZQorICAgID4+PiBjaGlsZDEgPT0gZWxlbVswXQorICAgIEZhbHNlCisgICAgPj4+IGVsZW0uY2xlYXIoKQorICAgID4+PiBlbGVtLmdldGNoaWxkcmVuKCkKKyAgICBbXQorICAgICIiIgorCitkZWYgd3JpdGVzdHJpbmcoKToKKyAgICAiIiIKKyAgICA+Pj4gZWxlbSA9IEVULlhNTCgiPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+IikKKyAgICA+Pj4gRVQudG9zdHJpbmcoZWxlbSkKKyAgICAnPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+JworICAgID4+PiBlbGVtID0gRVQuZnJvbXN0cmluZygiPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+IikKKyAgICA+Pj4gRVQudG9zdHJpbmcoZWxlbSkKKyAgICAnPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+JworICAgICIiIgorCitkZWYgY2hlY2tfZW5jb2RpbmcoZW5jb2RpbmcpOgorICAgICIiIgorICAgID4+PiBjaGVja19lbmNvZGluZygiYXNjaWkiKQorICAgID4+PiBjaGVja19lbmNvZGluZygidXMtYXNjaWkiKQorICAgID4+PiBjaGVja19lbmNvZGluZygiaXNvLTg4NTktMSIpCisgICAgPj4+IGNoZWNrX2VuY29kaW5nKCJpc28tODg1OS0xNSIpCisgICAgPj4+IGNoZWNrX2VuY29kaW5nKCJjcDQzNyIpCisgICAgPj4+IGNoZWNrX2VuY29kaW5nKCJtYWMtcm9tYW4iKQorICAgICIiIgorICAgIEVULlhNTCgiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nJXMnPz48eG1sIC8+IiAlIGVuY29kaW5nKQorCitkZWYgZW5jb2RpbmcoKToKKyAgICByIiIiCisgICAgVGVzdCBlbmNvZGluZyBpc3N1ZXMuCisKKyAgICA+Pj4gZWxlbSA9IEVULkVsZW1lbnQoInRhZyIpCisgICAgPj4+IGVsZW0udGV4dCA9IHUiYWJjIgorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPHRhZz5hYmM8L3RhZz4nCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtLCBlbmNvZGluZz0idXRmLTgiKQorICAgICc8dGFnPmFiYzwvdGFnPicKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0sIGVuY29kaW5nPSJ1cy1hc2NpaSIpCisgICAgJzx0YWc+YWJjPC90YWc+JworICAgID4+PiBzZXJpYWxpemUoZWxlbSwgZW5jb2Rpbmc9Imlzby04ODU5LTEiKQorICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+XG48dGFnPmFiYzwvdGFnPiIKKworICAgID4+PiBlbGVtLnRleHQgPSAiPCZcIlwnPiIKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJzx0YWc+Jmx0OyZhbXA7IlwnJmd0OzwvdGFnPicKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0sIGVuY29kaW5nPSJ1dGYtOCIpCisgICAgJzx0YWc+Jmx0OyZhbXA7IlwnJmd0OzwvdGFnPicKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0sIGVuY29kaW5nPSJ1cy1hc2NpaSIpICMgY2RhdGEgY2hhcmFjdGVycworICAgICc8dGFnPiZsdDsmYW1wOyJcJyZndDs8L3RhZz4nCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtLCBlbmNvZGluZz0iaXNvLTg4NTktMSIpCisgICAgJzw/eG1sIHZlcnNpb249XCcxLjBcJyBlbmNvZGluZz1cJ2lzby04ODU5LTFcJz8+XG48dGFnPiZsdDsmYW1wOyJcJyZndDs8L3RhZz4nCisKKyAgICA+Pj4gZWxlbS5hdHRyaWJbImtleSJdID0gIjwmXCJcJz4iCisgICAgPj4+IGVsZW0udGV4dCA9IE5vbmUKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJzx0YWcga2V5PSImbHQ7JmFtcDsmcXVvdDtcJyZndDsiIC8+JworICAgID4+PiBzZXJpYWxpemUoZWxlbSwgZW5jb2Rpbmc9InV0Zi04IikKKyAgICAnPHRhZyBrZXk9IiZsdDsmYW1wOyZxdW90O1wnJmd0OyIgLz4nCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtLCBlbmNvZGluZz0idXMtYXNjaWkiKQorICAgICc8dGFnIGtleT0iJmx0OyZhbXA7JnF1b3Q7XCcmZ3Q7IiAvPicKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0sIGVuY29kaW5nPSJpc28tODg1OS0xIikKKyAgICAnPD94bWwgdmVyc2lvbj1cJzEuMFwnIGVuY29kaW5nPVwnaXNvLTg4NTktMVwnPz5cbjx0YWcga2V5PSImbHQ7JmFtcDsmcXVvdDtcJyZndDsiIC8+JworCisgICAgPj4+IGVsZW0udGV4dCA9IHUnXHhlNVx4ZjZceGY2PD4nCisgICAgPj4+IGVsZW0uYXR0cmliLmNsZWFyKCkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJzx0YWc+JiMyMjk7JiMyNDY7JiMyNDY7Jmx0OyZndDs8L3RhZz4nCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtLCBlbmNvZGluZz0idXRmLTgiKQorICAgICc8dGFnPlx4YzNceGE1XHhjM1x4YjZceGMzXHhiNiZsdDsmZ3Q7PC90YWc+JworICAgID4+PiBzZXJpYWxpemUoZWxlbSwgZW5jb2Rpbmc9InVzLWFzY2lpIikKKyAgICAnPHRhZz4mIzIyOTsmIzI0NjsmIzI0NjsmbHQ7Jmd0OzwvdGFnPicKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0sIGVuY29kaW5nPSJpc28tODg1OS0xIikKKyAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/PlxuPHRhZz5ceGU1XHhmNlx4ZjYmbHQ7Jmd0OzwvdGFnPiIKKworICAgID4+PiBlbGVtLmF0dHJpYlsia2V5Il0gPSB1J1x4ZTVceGY2XHhmNjw+JworICAgID4+PiBlbGVtLnRleHQgPSBOb25lCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKQorICAgICc8dGFnIGtleT0iJiMyMjk7JiMyNDY7JiMyNDY7Jmx0OyZndDsiIC8+JworICAgID4+PiBzZXJpYWxpemUoZWxlbSwgZW5jb2Rpbmc9InV0Zi04IikKKyAgICAnPHRhZyBrZXk9Ilx4YzNceGE1XHhjM1x4YjZceGMzXHhiNiZsdDsmZ3Q7IiAvPicKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0sIGVuY29kaW5nPSJ1cy1hc2NpaSIpCisgICAgJzx0YWcga2V5PSImIzIyOTsmIzI0NjsmIzI0NjsmbHQ7Jmd0OyIgLz4nCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtLCBlbmNvZGluZz0iaXNvLTg4NTktMSIpCisgICAgJzw/eG1sIHZlcnNpb249XCcxLjBcJyBlbmNvZGluZz1cJ2lzby04ODU5LTFcJz8+XG48dGFnIGtleT0iXHhlNVx4ZjZceGY2Jmx0OyZndDsiIC8+JworICAgICIiIgorCitkZWYgbWV0aG9kcygpOgorICAgIHIiIiIKKyAgICBUZXN0IHNlcmlhbGl6YXRpb24gbWV0aG9kcy4KKworICAgID4+PiBlID0gRVQuWE1MKCI8aHRtbD48bGluay8+PHNjcmlwdD4xICZsdDsgMjwvc2NyaXB0PjwvaHRtbD4iKQorICAgID4+PiBlLnRhaWwgPSAiXG4iCisgICAgPj4+IHNlcmlhbGl6ZShlKQorICAgICc8aHRtbD48bGluayAvPjxzY3JpcHQ+MSAmbHQ7IDI8L3NjcmlwdD48L2h0bWw+XG4nCisgICAgPj4+IHNlcmlhbGl6ZShlLCBtZXRob2Q9Tm9uZSkKKyAgICAnPGh0bWw+PGxpbmsgLz48c2NyaXB0PjEgJmx0OyAyPC9zY3JpcHQ+PC9odG1sPlxuJworICAgID4+PiBzZXJpYWxpemUoZSwgbWV0aG9kPSJ4bWwiKQorICAgICc8aHRtbD48bGluayAvPjxzY3JpcHQ+MSAmbHQ7IDI8L3NjcmlwdD48L2h0bWw+XG4nCisgICAgPj4+IHNlcmlhbGl6ZShlLCBtZXRob2Q9Imh0bWwiKQorICAgICc8aHRtbD48bGluaz48c2NyaXB0PjEgPCAyPC9zY3JpcHQ+PC9odG1sPlxuJworICAgID4+PiBzZXJpYWxpemUoZSwgbWV0aG9kPSJ0ZXh0IikKKyAgICAnMSA8IDJcbicKKyAgICAiIiIKKworZGVmIGl0ZXJhdG9ycygpOgorICAgICIiIgorICAgIFRlc3QgaXRlcmF0b3JzLgorCisgICAgPj4+IGUgPSBFVC5YTUwoIjxodG1sPjxib2R5PnRoaXMgaXMgYSA8aT5wYXJhZ3JhcGg8L2k+LjwvYm9keT4uLjwvaHRtbD4iKQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlLml0ZXIoKSkKKyAgICBbJ2h0bWwnLCAnYm9keScsICdpJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZS5maW5kKCJib2R5IikuaXRlcigpKQorICAgIFsnYm9keScsICdpJ10KKyAgICA+Pj4gc3VtbWFyaXplKG5leHQoZS5pdGVyKCkpKQorICAgICdodG1sJworICAgID4+PiAiIi5qb2luKGUuaXRlcnRleHQoKSkKKyAgICAndGhpcyBpcyBhIHBhcmFncmFwaC4uLicKKyAgICA+Pj4gIiIuam9pbihlLmZpbmQoImJvZHkiKS5pdGVydGV4dCgpKQorICAgICd0aGlzIGlzIGEgcGFyYWdyYXBoLicKKyAgICA+Pj4gbmV4dChlLml0ZXJ0ZXh0KCkpCisgICAgJ3RoaXMgaXMgYSAnCisKKyAgICBNZXRob2QgaXRlcnBhcnNlIHNob3VsZCByZXR1cm4gYW4gaXRlcmF0b3IuIFNlZSBidWcgNjQ3Mi4KKworICAgID4+PiBzb3VyY2VmaWxlID0gc2VyaWFsaXplKGUsIHRvX3N0cmluZz1GYWxzZSkKKyAgICA+Pj4gbmV4dChFVC5pdGVycGFyc2Uoc291cmNlZmlsZSkpICAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICgnZW5kJywgPEVsZW1lbnQgJ2knIGF0IDB4Li4uPikKKworICAgID4+PiB0cmVlID0gRVQuRWxlbWVudFRyZWUoTm9uZSkKKyAgICA+Pj4gdHJlZS5pdGVyKCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgQXR0cmlidXRlRXJyb3I6ICdOb25lVHlwZScgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ2l0ZXInCisgICAgIiIiCisKK0VOVElUWV9YTUwgPSAiIiJcCis8IURPQ1RZUEUgcG9pbnRzIFsKKzwhRU5USVRZICUgdXNlci1lbnRpdGllcyBTWVNURU0gJ3VzZXItZW50aXRpZXMueG1sJz4KKyV1c2VyLWVudGl0aWVzOworXT4KKzxkb2N1bWVudD4mZW50aXR5OzwvZG9jdW1lbnQ+CisiIiIKKworZGVmIGVudGl0eSgpOgorICAgICIiIgorICAgIFRlc3QgZW50aXR5IGhhbmRsaW5nLgorCisgICAgMSkgZ29vZCBlbnRpdGllcworCisgICAgPj4+IGUgPSBFVC5YTUwoIjxkb2N1bWVudCB0aXRsZT0nJiN4ODIzMDsnPnRlc3Q8L2RvY3VtZW50PiIpCisgICAgPj4+IHNlcmlhbGl6ZShlKQorICAgICc8ZG9jdW1lbnQgdGl0bGU9IiYjMzMzMjg7Ij50ZXN0PC9kb2N1bWVudD4nCisKKyAgICAyKSBiYWQgZW50aXRpZXMKKworICAgID4+PiBFVC5YTUwoIjxkb2N1bWVudD4mZW50aXR5OzwvZG9jdW1lbnQ+IikKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgUGFyc2VFcnJvcjogdW5kZWZpbmVkIGVudGl0eTogbGluZSAxLCBjb2x1bW4gMTAKKworICAgID4+PiBFVC5YTUwoRU5USVRZX1hNTCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgUGFyc2VFcnJvcjogdW5kZWZpbmVkIGVudGl0eSAmZW50aXR5OzogbGluZSA1LCBjb2x1bW4gMTAKKworICAgIDMpIGN1c3RvbSBlbnRpdHkKKworICAgID4+PiBwYXJzZXIgPSBFVC5YTUxQYXJzZXIoKQorICAgID4+PiBwYXJzZXIuZW50aXR5WyJlbnRpdHkiXSA9ICJ0ZXh0IgorICAgID4+PiBwYXJzZXIuZmVlZChFTlRJVFlfWE1MKQorICAgID4+PiByb290ID0gcGFyc2VyLmNsb3NlKCkKKyAgICA+Pj4gc2VyaWFsaXplKHJvb3QpCisgICAgJzxkb2N1bWVudD50ZXh0PC9kb2N1bWVudD4nCisgICAgIiIiCisKK2RlZiBlcnJvcih4bWwpOgorICAgICIiIgorCisgICAgVGVzdCBlcnJvciBoYW5kbGluZy4KKworICAgID4+PiBpc3N1YmNsYXNzKEVULlBhcnNlRXJyb3IsIFN5bnRheEVycm9yKQorICAgIFRydWUKKyAgICA+Pj4gZXJyb3IoImZvbyIpLnBvc2l0aW9uCisgICAgKDEsIDApCisgICAgPj4+IGVycm9yKCI8dGFnPiZmb287PC90YWc+IikucG9zaXRpb24KKyAgICAoMSwgNSkKKyAgICA+Pj4gZXJyb3IoImZvb2JhcjwiKS5wb3NpdGlvbgorICAgICgxLCA2KQorCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBFVC5YTUwoeG1sKQorICAgIGV4Y2VwdCBFVC5QYXJzZUVycm9yOgorICAgICAgICByZXR1cm4gc3lzLmV4Y192YWx1ZQorCitkZWYgbmFtZXNwYWNlKCk6CisgICAgIiIiCisgICAgVGVzdCBuYW1lc3BhY2UgaXNzdWVzLgorCisgICAgMSkgeG1sIG5hbWVzcGFjZQorCisgICAgPj4+IGVsZW0gPSBFVC5YTUwoIjx0YWcgeG1sOmxhbmc9J2VuJyAvPiIpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKSAjIDEuMQorICAgICc8dGFnIHhtbDpsYW5nPSJlbiIgLz4nCisKKyAgICAyKSBvdGhlciAid2VsbC1rbm93biIgbmFtZXNwYWNlcworCisgICAgPj4+IGVsZW0gPSBFVC5YTUwoIjxyZGY6UkRGIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIycgLz4iKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyAyLjEKKyAgICAnPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIiAvPicKKworICAgID4+PiBlbGVtID0gRVQuWE1MKCI8aHRtbDpodG1sIHhtbG5zOmh0bWw9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnIC8+IikKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgMi4yCisgICAgJzxodG1sOmh0bWwgeG1sbnM6aHRtbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgLz4nCisKKyAgICA+Pj4gZWxlbSA9IEVULlhNTCgiPHNvYXA6RW52ZWxvcGUgeG1sbnM6c29hcD0naHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZScgLz4iKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyAyLjMKKyAgICAnPG5zMDpFbnZlbG9wZSB4bWxuczpuczA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUiIC8+JworCisgICAgMykgdW5rbm93biBuYW1lc3BhY2VzCisgICAgPj4+IGVsZW0gPSBFVC5YTUwoU0FNUExFX1hNTF9OUykKKyAgICA+Pj4gcHJpbnQgc2VyaWFsaXplKGVsZW0pCisgICAgPG5zMDpib2R5IHhtbG5zOm5zMD0iaHR0cDovL2VmZmJvdC5vcmcvbnMiPgorICAgICAgPG5zMDp0YWc+dGV4dDwvbnMwOnRhZz4KKyAgICAgIDxuczA6dGFnIC8+CisgICAgICA8bnMwOnNlY3Rpb24+CisgICAgICAgIDxuczA6dGFnPnN1YnRleHQ8L25zMDp0YWc+CisgICAgICA8L25zMDpzZWN0aW9uPgorICAgIDwvbnMwOmJvZHk+CisgICAgIiIiCisKK2RlZiBxbmFtZSgpOgorICAgICIiIgorICAgIFRlc3QgUU5hbWUgaGFuZGxpbmcuCisKKyAgICAxKSBkZWNvcmF0ZWQgdGFncworCisgICAgPj4+IGVsZW0gPSBFVC5FbGVtZW50KCJ7dXJpfXRhZyIpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKSAjIDEuMQorICAgICc8bnMwOnRhZyB4bWxuczpuczA9InVyaSIgLz4nCisgICAgPj4+IGVsZW0gPSBFVC5FbGVtZW50KEVULlFOYW1lKCJ7dXJpfXRhZyIpKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyAxLjIKKyAgICAnPG5zMDp0YWcgeG1sbnM6bnMwPSJ1cmkiIC8+JworICAgID4+PiBlbGVtID0gRVQuRWxlbWVudChFVC5RTmFtZSgidXJpIiwgInRhZyIpKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyAxLjMKKyAgICAnPG5zMDp0YWcgeG1sbnM6bnMwPSJ1cmkiIC8+JworICAgID4+PiBlbGVtID0gRVQuRWxlbWVudChFVC5RTmFtZSgidXJpIiwgInRhZyIpKQorICAgID4+PiBzdWJlbGVtID0gRVQuU3ViRWxlbWVudChlbGVtLCBFVC5RTmFtZSgidXJpIiwgInRhZzEiKSkKKyAgICA+Pj4gc3ViZWxlbSA9IEVULlN1YkVsZW1lbnQoZWxlbSwgRVQuUU5hbWUoInVyaSIsICJ0YWcyIikpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKSAjIDEuNAorICAgICc8bnMwOnRhZyB4bWxuczpuczA9InVyaSI+PG5zMDp0YWcxIC8+PG5zMDp0YWcyIC8+PC9uczA6dGFnPicKKworICAgIDIpIGRlY29yYXRlZCBhdHRyaWJ1dGVzCisKKyAgICA+Pj4gZWxlbS5jbGVhcigpCisgICAgPj4+IGVsZW0uYXR0cmliWyJ7dXJpfWtleSJdID0gInZhbHVlIgorICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyAyLjEKKyAgICAnPG5zMDp0YWcgeG1sbnM6bnMwPSJ1cmkiIG5zMDprZXk9InZhbHVlIiAvPicKKworICAgID4+PiBlbGVtLmNsZWFyKCkKKyAgICA+Pj4gZWxlbS5hdHRyaWJbRVQuUU5hbWUoInt1cml9a2V5IildID0gInZhbHVlIgorICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyAyLjIKKyAgICAnPG5zMDp0YWcgeG1sbnM6bnMwPSJ1cmkiIG5zMDprZXk9InZhbHVlIiAvPicKKworICAgIDMpIGRlY29yYXRlZCB2YWx1ZXMgYXJlIG5vdCBjb252ZXJ0ZWQgYnkgZGVmYXVsdCwgYnV0IHRoZQorICAgICAgIFFOYW1lIHdyYXBwZXIgY2FuIGJlIHVzZWQgZm9yIHZhbHVlcworCisgICAgPj4+IGVsZW0uY2xlYXIoKQorICAgID4+PiBlbGVtLmF0dHJpYlsie3VyaX1rZXkiXSA9ICJ7dXJpfXZhbHVlIgorICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyAzLjEKKyAgICAnPG5zMDp0YWcgeG1sbnM6bnMwPSJ1cmkiIG5zMDprZXk9Int1cml9dmFsdWUiIC8+JworCisgICAgPj4+IGVsZW0uY2xlYXIoKQorICAgID4+PiBlbGVtLmF0dHJpYlsie3VyaX1rZXkiXSA9IEVULlFOYW1lKCJ7dXJpfXZhbHVlIikKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgMy4yCisgICAgJzxuczA6dGFnIHhtbG5zOm5zMD0idXJpIiBuczA6a2V5PSJuczA6dmFsdWUiIC8+JworCisgICAgPj4+IGVsZW0uY2xlYXIoKQorICAgID4+PiBzdWJlbGVtID0gRVQuRWxlbWVudCgidGFnIikKKyAgICA+Pj4gc3ViZWxlbS5hdHRyaWJbInt1cmkxfWtleSJdID0gRVQuUU5hbWUoInt1cmkyfXZhbHVlIikKKyAgICA+Pj4gZWxlbS5hcHBlbmQoc3ViZWxlbSkKKyAgICA+Pj4gZWxlbS5hcHBlbmQoc3ViZWxlbSkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgMy4zCisgICAgJzxuczA6dGFnIHhtbG5zOm5zMD0idXJpIiB4bWxuczpuczE9InVyaTEiIHhtbG5zOm5zMj0idXJpMiI+PHRhZyBuczE6a2V5PSJuczI6dmFsdWUiIC8+PHRhZyBuczE6a2V5PSJuczI6dmFsdWUiIC8+PC9uczA6dGFnPicKKworICAgIDQpIERpcmVjdCBRTmFtZSB0ZXN0cworCisgICAgPj4+IHN0cihFVC5RTmFtZSgnbnMnLCAndGFnJykpCisgICAgJ3tuc310YWcnCisgICAgPj4+IHN0cihFVC5RTmFtZSgne25zfXRhZycpKQorICAgICd7bnN9dGFnJworICAgID4+PiBxMSA9IEVULlFOYW1lKCducycsICd0YWcnKQorICAgID4+PiBxMiA9IEVULlFOYW1lKCducycsICd0YWcnKQorICAgID4+PiBxMSA9PSBxMgorICAgIFRydWUKKyAgICA+Pj4gcTIgPSBFVC5RTmFtZSgnbnMnLCAnb3RoZXItdGFnJykKKyAgICA+Pj4gcTEgPT0gcTIKKyAgICBGYWxzZQorICAgID4+PiBxMSA9PSAnbnM6dGFnJworICAgIEZhbHNlCisgICAgPj4+IHExID09ICd7bnN9dGFnJworICAgIFRydWUKKyAgICAiIiIKKworZGVmIGRvY3R5cGVfcHVibGljKCk6CisgICAgIiIiCisgICAgVGVzdCBQVUJMSUMgZG9jdHlwZS4KKworICAgID4+PiBlbGVtID0gRVQuWE1MKCc8IURPQ1RZUEUgaHRtbCBQVUJMSUMnCisgICAgLi4uICAgJyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iJworICAgIC4uLiAgICcgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPicKKyAgICAuLi4gICAnPGh0bWw+dGV4dDwvaHRtbD4nKQorCisgICAgIiIiCisKK2RlZiB4cGF0aF90b2tlbml6ZXIocCk6CisgICAgIiIiCisgICAgVGVzdCB0aGUgWFBhdGggdG9rZW5pemVyLgorCisgICAgPj4+ICMgdGVzdHMgZnJvbSB0aGUgeG1sIHNwZWNpZmljYXRpb24KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCIqIikKKyAgICBbJyonXQorICAgID4+PiB4cGF0aF90b2tlbml6ZXIoInRleHQoKSIpCisgICAgWyd0ZXh0JywgJygpJ10KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCJAbmFtZSIpCisgICAgWydAJywgJ25hbWUnXQorICAgID4+PiB4cGF0aF90b2tlbml6ZXIoIkAqIikKKyAgICBbJ0AnLCAnKiddCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigicGFyYVsxXSIpCisgICAgWydwYXJhJywgJ1snLCAnMScsICddJ10KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCJwYXJhW2xhc3QoKV0iKQorICAgIFsncGFyYScsICdbJywgJ2xhc3QnLCAnKCknLCAnXSddCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigiKi9wYXJhIikKKyAgICBbJyonLCAnLycsICdwYXJhJ10KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCIvZG9jL2NoYXB0ZXJbNV0vc2VjdGlvblsyXSIpCisgICAgWycvJywgJ2RvYycsICcvJywgJ2NoYXB0ZXInLCAnWycsICc1JywgJ10nLCAnLycsICdzZWN0aW9uJywgJ1snLCAnMicsICddJ10KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCJjaGFwdGVyLy9wYXJhIikKKyAgICBbJ2NoYXB0ZXInLCAnLy8nLCAncGFyYSddCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigiLy9wYXJhIikKKyAgICBbJy8vJywgJ3BhcmEnXQorICAgID4+PiB4cGF0aF90b2tlbml6ZXIoIi8vb2xpc3QvaXRlbSIpCisgICAgWycvLycsICdvbGlzdCcsICcvJywgJ2l0ZW0nXQorICAgID4+PiB4cGF0aF90b2tlbml6ZXIoIi4iKQorICAgIFsnLiddCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigiLi8vcGFyYSIpCisgICAgWycuJywgJy8vJywgJ3BhcmEnXQorICAgID4+PiB4cGF0aF90b2tlbml6ZXIoIi4uIikKKyAgICBbJy4uJ10KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCIuLi9AbGFuZyIpCisgICAgWycuLicsICcvJywgJ0AnLCAnbGFuZyddCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigiY2hhcHRlclt0aXRsZV0iKQorICAgIFsnY2hhcHRlcicsICdbJywgJ3RpdGxlJywgJ10nXQorICAgID4+PiB4cGF0aF90b2tlbml6ZXIoImVtcGxveWVlW0BzZWNyZXRhcnkgYW5kIEBhc3Npc3RhbnRdIikKKyAgICBbJ2VtcGxveWVlJywgJ1snLCAnQCcsICdzZWNyZXRhcnknLCAnJywgJ2FuZCcsICcnLCAnQCcsICdhc3Npc3RhbnQnLCAnXSddCisKKyAgICA+Pj4gIyBhZGRpdGlvbmFsIHRlc3RzCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigie2h0dHA6Ly9zcGFtfWVnZyIpCisgICAgWyd7aHR0cDovL3NwYW19ZWdnJ10KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCIuL3NwYW0uZWdnIikKKyAgICBbJy4nLCAnLycsICdzcGFtLmVnZyddCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigiLi8ve2h0dHA6Ly9zcGFtfWVnZyIpCisgICAgWycuJywgJy8vJywgJ3todHRwOi8vc3BhbX1lZ2cnXQorICAgICIiIgorICAgIGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50UGF0aAorICAgIG91dCA9IFtdCisgICAgZm9yIG9wLCB0YWcgaW4gRWxlbWVudFBhdGgueHBhdGhfdG9rZW5pemVyKHApOgorICAgICAgICBvdXQuYXBwZW5kKG9wIG9yIHRhZykKKyAgICByZXR1cm4gb3V0CisKK2RlZiBwcm9jZXNzaW5naW5zdHJ1Y3Rpb24oKToKKyAgICAiIiIKKyAgICBUZXN0IFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBkaXJlY3RseQorCisgICAgPj4+IEVULnRvc3RyaW5nKEVULlByb2Nlc3NpbmdJbnN0cnVjdGlvbigndGVzdCcsICdpbnN0cnVjdGlvbicpKQorICAgICc8P3Rlc3QgaW5zdHJ1Y3Rpb24/PicKKyAgICA+Pj4gRVQudG9zdHJpbmcoRVQuUEkoJ3Rlc3QnLCAnaW5zdHJ1Y3Rpb24nKSkKKyAgICAnPD90ZXN0IGluc3RydWN0aW9uPz4nCisKKyAgICBJc3N1ZSAjMjc0NgorCisgICAgPj4+IEVULnRvc3RyaW5nKEVULlBJKCd0ZXN0JywgJzx0ZXN0aW5nJj4nKSkKKyAgICAnPD90ZXN0IDx0ZXN0aW5nJj4/PicKKyAgICA+Pj4gRVQudG9zdHJpbmcoRVQuUEkoJ3Rlc3QnLCB1Jzx0ZXN0aW5nJj5ceGUzJyksICdsYXRpbjEnKQorICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdsYXRpbjEnPz5cXG48P3Rlc3QgPHRlc3RpbmcmPlxceGUzPz4iCisgICAgIiIiCisKKyMKKyMgeGluY2x1ZGUgdGVzdHMgKHNhbXBsZXMgZnJvbSBhcHBlbmRpeCBDIG9mIHRoZSB4aW5jbHVkZSBzcGVjaWZpY2F0aW9uKQorCitYSU5DTFVERSA9IHt9CisKK1hJTkNMVURFWyJDMS54bWwiXSA9ICIiIlwKKzw/eG1sIHZlcnNpb249JzEuMCc/PgorPGRvY3VtZW50IHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgPHA+MTIwIE16IGlzIGFkZXF1YXRlIGZvciBhbiBhdmVyYWdlIGhvbWUgdXNlci48L3A+CisgIDx4aTppbmNsdWRlIGhyZWY9ImRpc2NsYWltZXIueG1sIi8+Cis8L2RvY3VtZW50PgorIiIiCisKK1hJTkNMVURFWyJkaXNjbGFpbWVyLnhtbCJdID0gIiIiXAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8ZGlzY2xhaW1lcj4KKyAgPHA+VGhlIG9waW5pb25zIHJlcHJlc2VudGVkIGhlcmVpbiByZXByZXNlbnQgdGhvc2Ugb2YgdGhlIGluZGl2aWR1YWwKKyAgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgb2ZmaWNpYWwgcG9saWN5IGVuZG9yc2VkIGJ5IHRoaXMKKyAgb3JnYW5pemF0aW9uLjwvcD4KKzwvZGlzY2xhaW1lcj4KKyIiIgorCitYSU5DTFVERVsiQzIueG1sIl0gPSAiIiJcCis8P3htbCB2ZXJzaW9uPScxLjAnPz4KKzxkb2N1bWVudCB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgIDxwPlRoaXMgZG9jdW1lbnQgaGFzIGJlZW4gYWNjZXNzZWQKKyAgPHhpOmluY2x1ZGUgaHJlZj0iY291bnQudHh0IiBwYXJzZT0idGV4dCIvPiB0aW1lcy48L3A+Cis8L2RvY3VtZW50PgorIiIiCisKK1hJTkNMVURFWyJjb3VudC50eHQiXSA9ICIzMjQzODciCisKK1hJTkNMVURFWyJDMmIueG1sIl0gPSAiIiJcCis8P3htbCB2ZXJzaW9uPScxLjAnPz4KKzxkb2N1bWVudCB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgIDxwPlRoaXMgZG9jdW1lbnQgaGFzIGJlZW4gPGVtPmFjY2Vzc2VkPC9lbT4KKyAgPHhpOmluY2x1ZGUgaHJlZj0iY291bnQudHh0IiBwYXJzZT0idGV4dCIvPiB0aW1lcy48L3A+Cis8L2RvY3VtZW50PgorIiIiCisKK1hJTkNMVURFWyJDMy54bWwiXSA9ICIiIlwKKzw/eG1sIHZlcnNpb249JzEuMCc/PgorPGRvY3VtZW50IHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgPHA+VGhlIGZvbGxvd2luZyBpcyB0aGUgc291cmNlIG9mIHRoZSAiZGF0YS54bWwiIHJlc291cmNlOjwvcD4KKyAgPGV4YW1wbGU+PHhpOmluY2x1ZGUgaHJlZj0iZGF0YS54bWwiIHBhcnNlPSJ0ZXh0Ii8+PC9leGFtcGxlPgorPC9kb2N1bWVudD4KKyIiIgorCitYSU5DTFVERVsiZGF0YS54bWwiXSA9ICIiIlwKKzw/eG1sIHZlcnNpb249JzEuMCc/PgorPGRhdGE+CisgIDxpdGVtPjwhW0NEQVRBW0Jyb29rcyAmIFNoaWVsZHNdXT48L2l0ZW0+Cis8L2RhdGE+CisiIiIKKworWElOQ0xVREVbIkM1LnhtbCJdID0gIiIiXAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8ZGl2IHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgPHhpOmluY2x1ZGUgaHJlZj0iZXhhbXBsZS50eHQiIHBhcnNlPSJ0ZXh0Ij4KKyAgICA8eGk6ZmFsbGJhY2s+CisgICAgICA8eGk6aW5jbHVkZSBocmVmPSJmYWxsYmFjay1leGFtcGxlLnR4dCIgcGFyc2U9InRleHQiPgorICAgICAgICA8eGk6ZmFsbGJhY2s+PGEgaHJlZj0ibWFpbHRvOmJvYkBleGFtcGxlLm9yZyI+UmVwb3J0IGVycm9yPC9hPjwveGk6ZmFsbGJhY2s+CisgICAgICA8L3hpOmluY2x1ZGU+CisgICAgPC94aTpmYWxsYmFjaz4KKyAgPC94aTppbmNsdWRlPgorPC9kaXY+CisiIiIKKworWElOQ0xVREVbImRlZmF1bHQueG1sIl0gPSAiIiJcCis8P3htbCB2ZXJzaW9uPScxLjAnPz4KKzxkb2N1bWVudCB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgIDxwPkV4YW1wbGUuPC9wPgorICA8eGk6aW5jbHVkZSBocmVmPSJ7fSIvPgorPC9kb2N1bWVudD4KKyIiIi5mb3JtYXQoY2dpLmVzY2FwZShTSU1QTEVfWE1MRklMRSwgVHJ1ZSkpCisKK2RlZiB4aW5jbHVkZV9sb2FkZXIoaHJlZiwgcGFyc2U9InhtbCIsIGVuY29kaW5nPU5vbmUpOgorICAgIHRyeToKKyAgICAgICAgZGF0YSA9IFhJTkNMVURFW2hyZWZdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICByYWlzZSBJT0Vycm9yKCJyZXNvdXJjZSBub3QgZm91bmQiKQorICAgIGlmIHBhcnNlID09ICJ4bWwiOgorICAgICAgICBmcm9tIHhtbC5ldHJlZS5FbGVtZW50VHJlZSBpbXBvcnQgWE1MCisgICAgICAgIHJldHVybiBYTUwoZGF0YSkKKyAgICByZXR1cm4gZGF0YQorCitkZWYgeGluY2x1ZGUoKToKKyAgICByIiIiCisgICAgQmFzaWMgaW5jbHVzaW9uIGV4YW1wbGUgKFhJbmNsdWRlIEMuMSkKKworICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUgYXMgRVQKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRJbmNsdWRlCisKKyAgICA+Pj4gZG9jdW1lbnQgPSB4aW5jbHVkZV9sb2FkZXIoIkMxLnhtbCIpCisgICAgPj4+IEVsZW1lbnRJbmNsdWRlLmluY2x1ZGUoZG9jdW1lbnQsIHhpbmNsdWRlX2xvYWRlcikKKyAgICA+Pj4gcHJpbnQgc2VyaWFsaXplKGRvY3VtZW50KSAjIEMxCisgICAgPGRvY3VtZW50PgorICAgICAgPHA+MTIwIE16IGlzIGFkZXF1YXRlIGZvciBhbiBhdmVyYWdlIGhvbWUgdXNlci48L3A+CisgICAgICA8ZGlzY2xhaW1lcj4KKyAgICAgIDxwPlRoZSBvcGluaW9ucyByZXByZXNlbnRlZCBoZXJlaW4gcmVwcmVzZW50IHRob3NlIG9mIHRoZSBpbmRpdmlkdWFsCisgICAgICBhbmQgc2hvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBvZmZpY2lhbCBwb2xpY3kgZW5kb3JzZWQgYnkgdGhpcworICAgICAgb3JnYW5pemF0aW9uLjwvcD4KKyAgICA8L2Rpc2NsYWltZXI+CisgICAgPC9kb2N1bWVudD4KKworICAgIFRleHR1YWwgaW5jbHVzaW9uIGV4YW1wbGUgKFhJbmNsdWRlIEMuMikKKworICAgID4+PiBkb2N1bWVudCA9IHhpbmNsdWRlX2xvYWRlcigiQzIueG1sIikKKyAgICA+Pj4gRWxlbWVudEluY2x1ZGUuaW5jbHVkZShkb2N1bWVudCwgeGluY2x1ZGVfbG9hZGVyKQorICAgID4+PiBwcmludCBzZXJpYWxpemUoZG9jdW1lbnQpICMgQzIKKyAgICA8ZG9jdW1lbnQ+CisgICAgICA8cD5UaGlzIGRvY3VtZW50IGhhcyBiZWVuIGFjY2Vzc2VkCisgICAgICAzMjQzODcgdGltZXMuPC9wPgorICAgIDwvZG9jdW1lbnQ+CisKKyAgICBUZXh0dWFsIGluY2x1c2lvbiBhZnRlciBzaWJsaW5nIGVsZW1lbnQgKGJhc2VkIG9uIG1vZGlmaWVkIFhJbmNsdWRlIEMuMikKKworICAgID4+PiBkb2N1bWVudCA9IHhpbmNsdWRlX2xvYWRlcigiQzJiLnhtbCIpCisgICAgPj4+IEVsZW1lbnRJbmNsdWRlLmluY2x1ZGUoZG9jdW1lbnQsIHhpbmNsdWRlX2xvYWRlcikKKyAgICA+Pj4gcHJpbnQoc2VyaWFsaXplKGRvY3VtZW50KSkgIyBDMmIKKyAgICA8ZG9jdW1lbnQ+CisgICAgICA8cD5UaGlzIGRvY3VtZW50IGhhcyBiZWVuIDxlbT5hY2Nlc3NlZDwvZW0+CisgICAgICAzMjQzODcgdGltZXMuPC9wPgorICAgIDwvZG9jdW1lbnQ+CisKKyAgICBUZXh0dWFsIGluY2x1c2lvbiBvZiBYTUwgZXhhbXBsZSAoWEluY2x1ZGUgQy4zKQorCisgICAgPj4+IGRvY3VtZW50ID0geGluY2x1ZGVfbG9hZGVyKCJDMy54bWwiKQorICAgID4+PiBFbGVtZW50SW5jbHVkZS5pbmNsdWRlKGRvY3VtZW50LCB4aW5jbHVkZV9sb2FkZXIpCisgICAgPj4+IHByaW50IHNlcmlhbGl6ZShkb2N1bWVudCkgIyBDMworICAgIDxkb2N1bWVudD4KKyAgICAgIDxwPlRoZSBmb2xsb3dpbmcgaXMgdGhlIHNvdXJjZSBvZiB0aGUgImRhdGEueG1sIiByZXNvdXJjZTo8L3A+CisgICAgICA8ZXhhbXBsZT4mbHQ7P3htbCB2ZXJzaW9uPScxLjAnPyZndDsKKyAgICAmbHQ7ZGF0YSZndDsKKyAgICAgICZsdDtpdGVtJmd0OyZsdDshW0NEQVRBW0Jyb29rcyAmYW1wOyBTaGllbGRzXV0mZ3Q7Jmx0Oy9pdGVtJmd0OworICAgICZsdDsvZGF0YSZndDsKKyAgICA8L2V4YW1wbGU+CisgICAgPC9kb2N1bWVudD4KKworICAgIEZhbGxiYWNrIGV4YW1wbGUgKFhJbmNsdWRlIEMuNSkKKyAgICBOb3RlISBGYWxsYmFjayBzdXBwb3J0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKworICAgID4+PiBkb2N1bWVudCA9IHhpbmNsdWRlX2xvYWRlcigiQzUueG1sIikKKyAgICA+Pj4gRWxlbWVudEluY2x1ZGUuaW5jbHVkZShkb2N1bWVudCwgeGluY2x1ZGVfbG9hZGVyKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBJT0Vycm9yOiByZXNvdXJjZSBub3QgZm91bmQKKyAgICA+Pj4gIyBwcmludCBzZXJpYWxpemUoZG9jdW1lbnQpICMgQzUKKyAgICAiIiIKKworZGVmIHhpbmNsdWRlX2RlZmF1bHQoKToKKyAgICAiIiIKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRJbmNsdWRlCisKKyAgICA+Pj4gZG9jdW1lbnQgPSB4aW5jbHVkZV9sb2FkZXIoImRlZmF1bHQueG1sIikKKyAgICA+Pj4gRWxlbWVudEluY2x1ZGUuaW5jbHVkZShkb2N1bWVudCkKKyAgICA+Pj4gcHJpbnQgc2VyaWFsaXplKGRvY3VtZW50KSAjIGRlZmF1bHQKKyAgICA8ZG9jdW1lbnQ+CisgICAgICA8cD5FeGFtcGxlLjwvcD4KKyAgICAgIDxyb290PgorICAgICAgIDxlbGVtZW50IGtleT0idmFsdWUiPnRleHQ8L2VsZW1lbnQ+CisgICAgICAgPGVsZW1lbnQ+dGV4dDwvZWxlbWVudD50YWlsCisgICAgICAgPGVtcHR5LWVsZW1lbnQgLz4KKyAgICA8L3Jvb3Q+CisgICAgPC9kb2N1bWVudD4KKyAgICAiIiIKKworIworIyBiYWRseSBmb3JtYXR0ZWQgeGk6aW5jbHVkZSB0YWdzCisKK1hJTkNMVURFX0JBRCA9IHt9CisKK1hJTkNMVURFX0JBRFsiQjEueG1sIl0gPSAiIiJcCis8P3htbCB2ZXJzaW9uPScxLjAnPz4KKzxkb2N1bWVudCB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgIDxwPjEyMCBNeiBpcyBhZGVxdWF0ZSBmb3IgYW4gYXZlcmFnZSBob21lIHVzZXIuPC9wPgorICA8eGk6aW5jbHVkZSBocmVmPSJkaXNjbGFpbWVyLnhtbCIgcGFyc2U9IkJBRF9UWVBFIi8+Cis8L2RvY3VtZW50PgorIiIiCisKK1hJTkNMVURFX0JBRFsiQjIueG1sIl0gPSAiIiJcCis8P3htbCB2ZXJzaW9uPScxLjAnPz4KKzxkaXYgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICAgIDx4aTpmYWxsYmFjaz48L3hpOmZhbGxiYWNrPgorPC9kaXY+CisiIiIKKworZGVmIHhpbmNsdWRlX2ZhaWx1cmVzKCk6CisgICAgciIiIgorICAgIFRlc3QgZmFpbHVyZSB0byBsb2NhdGUgaW5jbHVkZWQgWE1MIGZpbGUuCisKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRJbmNsdWRlCisKKyAgICA+Pj4gZGVmIG5vbmVfbG9hZGVyKGhyZWYsIHBhcnNlciwgZW5jb2Rpbmc9Tm9uZSk6CisgICAgLi4uICAgICByZXR1cm4gTm9uZQorCisgICAgPj4+IGRvY3VtZW50ID0gRVQuWE1MKFhJTkNMVURFWyJDMS54bWwiXSkKKyAgICA+Pj4gRWxlbWVudEluY2x1ZGUuaW5jbHVkZShkb2N1bWVudCwgbG9hZGVyPW5vbmVfbG9hZGVyKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBGYXRhbEluY2x1ZGVFcnJvcjogY2Fubm90IGxvYWQgJ2Rpc2NsYWltZXIueG1sJyBhcyAneG1sJworCisgICAgVGVzdCBmYWlsdXJlIHRvIGxvY2F0ZSBpbmNsdWRlZCB0ZXh0IGZpbGUuCisKKyAgICA+Pj4gZG9jdW1lbnQgPSBFVC5YTUwoWElOQ0xVREVbIkMyLnhtbCJdKQorICAgID4+PiBFbGVtZW50SW5jbHVkZS5pbmNsdWRlKGRvY3VtZW50LCBsb2FkZXI9bm9uZV9sb2FkZXIpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIEZhdGFsSW5jbHVkZUVycm9yOiBjYW5ub3QgbG9hZCAnY291bnQudHh0JyBhcyAndGV4dCcKKworICAgIFRlc3QgYmFkIHBhcnNlIHR5cGUuCisKKyAgICA+Pj4gZG9jdW1lbnQgPSBFVC5YTUwoWElOQ0xVREVfQkFEWyJCMS54bWwiXSkKKyAgICA+Pj4gRWxlbWVudEluY2x1ZGUuaW5jbHVkZShkb2N1bWVudCwgbG9hZGVyPW5vbmVfbG9hZGVyKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBGYXRhbEluY2x1ZGVFcnJvcjogdW5rbm93biBwYXJzZSB0eXBlIGluIHhpOmluY2x1ZGUgdGFnICgnQkFEX1RZUEUnKQorCisgICAgVGVzdCB4aTpmYWxsYmFjayBvdXRzaWRlIHhpOmluY2x1ZGUuCisKKyAgICA+Pj4gZG9jdW1lbnQgPSBFVC5YTUwoWElOQ0xVREVfQkFEWyJCMi54bWwiXSkKKyAgICA+Pj4gRWxlbWVudEluY2x1ZGUuaW5jbHVkZShkb2N1bWVudCwgbG9hZGVyPW5vbmVfbG9hZGVyKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBGYXRhbEluY2x1ZGVFcnJvcjogeGk6ZmFsbGJhY2sgdGFnIG11c3QgYmUgY2hpbGQgb2YgeGk6aW5jbHVkZSAoJ3todHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlfWZhbGxiYWNrJykKKyAgICAiIiIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyByZXBvcnRlZCBidWdzCisKK2RlZiBidWdfeG1sdG9vbGtpdDIxKCk6CisgICAgIiIiCisKKyAgICBtYXJzaGFsbGVyIGdpdmVzIG9ic2N1cmUgZXJyb3JzIGZvciBub24tc3RyaW5nIHZhbHVlcworCisgICAgPj4+IGVsZW0gPSBFVC5FbGVtZW50KDEyMykKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgdGFnCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFR5cGVFcnJvcjogY2Fubm90IHNlcmlhbGl6ZSAxMjMgKHR5cGUgaW50KQorICAgID4+PiBlbGVtID0gRVQuRWxlbWVudCgiZWxlbSIpCisgICAgPj4+IGVsZW0udGV4dCA9IDEyMworICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyB0ZXh0CisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFR5cGVFcnJvcjogY2Fubm90IHNlcmlhbGl6ZSAxMjMgKHR5cGUgaW50KQorICAgID4+PiBlbGVtID0gRVQuRWxlbWVudCgiZWxlbSIpCisgICAgPj4+IGVsZW0udGFpbCA9IDEyMworICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyB0YWlsCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFR5cGVFcnJvcjogY2Fubm90IHNlcmlhbGl6ZSAxMjMgKHR5cGUgaW50KQorICAgID4+PiBlbGVtID0gRVQuRWxlbWVudCgiZWxlbSIpCisgICAgPj4+IGVsZW0uc2V0KDEyMywgIjEyMyIpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKSAjIGF0dHJpYnV0ZSBrZXkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgVHlwZUVycm9yOiBjYW5ub3Qgc2VyaWFsaXplIDEyMyAodHlwZSBpbnQpCisgICAgPj4+IGVsZW0gPSBFVC5FbGVtZW50KCJlbGVtIikKKyAgICA+Pj4gZWxlbS5zZXQoIjEyMyIsIDEyMykKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgYXR0cmlidXRlIHZhbHVlCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFR5cGVFcnJvcjogY2Fubm90IHNlcmlhbGl6ZSAxMjMgKHR5cGUgaW50KQorCisgICAgIiIiCisKK2RlZiBidWdfeG1sdG9vbGtpdDI1KCk6CisgICAgIiIiCisKKyAgICB0eXBvIGluIEVsZW1lbnRUcmVlLmZpbmR0ZXh0CisKKyAgICA+Pj4gZWxlbSA9IEVULlhNTChTQU1QTEVfWE1MKQorICAgID4+PiB0cmVlID0gRVQuRWxlbWVudFRyZWUoZWxlbSkKKyAgICA+Pj4gdHJlZS5maW5kdGV4dCgidGFnIikKKyAgICAndGV4dCcKKyAgICA+Pj4gdHJlZS5maW5kdGV4dCgic2VjdGlvbi90YWciKQorICAgICdzdWJ0ZXh0JworCisgICAgIiIiCisKK2RlZiBidWdfeG1sdG9vbGtpdDI4KCk6CisgICAgIiIiCisKKyAgICAuLy90YWcgY2F1c2VzIGV4Y2VwdGlvbnMKKworICAgID4+PiB0cmVlID0gRVQuWE1MKCI8ZG9jPjx0YWJsZT48dGJvZHkvPjwvdGFibGU+PC9kb2M+IikKKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QodHJlZS5maW5kYWxsKCIuLy90aGVhZCIpKQorICAgIFtdCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KHRyZWUuZmluZGFsbCgiLi8vdGJvZHkiKSkKKyAgICBbJ3Rib2R5J10KKworICAgICIiIgorCitkZWYgYnVnX3htbHRvb2xraXRYMSgpOgorICAgICIiIgorCisgICAgZHVtcCgpIGRvZXNuJ3QgZmx1c2ggdGhlIG91dHB1dCBidWZmZXIKKworICAgID4+PiB0cmVlID0gRVQuWE1MKCI8ZG9jPjx0YWJsZT48dGJvZHkvPjwvdGFibGU+PC9kb2M+IikKKyAgICA+Pj4gRVQuZHVtcCh0cmVlKTsgc3lzLnN0ZG91dC53cml0ZSgidGFpbCIpCisgICAgPGRvYz48dGFibGU+PHRib2R5IC8+PC90YWJsZT48L2RvYz4KKyAgICB0YWlsCisKKyAgICAiIiIKKworZGVmIGJ1Z194bWx0b29sa2l0MzkoKToKKyAgICAiIiIKKworICAgIG5vbi1hc2NpaSBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMgZG9lc24ndCB3b3JrCisKKyAgICA+Pj4gdHJlZSA9IEVULlhNTCgiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/Pjx0XHhlNGcgLz4iKQorICAgID4+PiBFVC50b3N0cmluZyh0cmVlLCAidXRmLTgiKQorICAgICc8dFxceGMzXFx4YTRnIC8+JworCisgICAgPj4+IHRyZWUgPSBFVC5YTUwoIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz48dGFnIFx4ZTR0dHI9J3YmIzIyODtsdWUnIC8+IikKKyAgICA+Pj4gdHJlZS5hdHRyaWIKKyAgICB7dSdcXHhlNHR0cic6IHUndlxceGU0bHVlJ30KKyAgICA+Pj4gRVQudG9zdHJpbmcodHJlZSwgInV0Zi04IikKKyAgICAnPHRhZyBcXHhjM1xceGE0dHRyPSJ2XFx4YzNcXHhhNGx1ZSIgLz4nCisKKyAgICA+Pj4gdHJlZSA9IEVULlhNTCgiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/Pjx0XHhlNGc+dGV4dDwvdFx4ZTRnPiIpCisgICAgPj4+IEVULnRvc3RyaW5nKHRyZWUsICJ1dGYtOCIpCisgICAgJzx0XFx4YzNcXHhhNGc+dGV4dDwvdFxceGMzXFx4YTRnPicKKworICAgID4+PiB0cmVlID0gRVQuRWxlbWVudCh1InRcdTAwZTRnIikKKyAgICA+Pj4gRVQudG9zdHJpbmcodHJlZSwgInV0Zi04IikKKyAgICAnPHRcXHhjM1xceGE0ZyAvPicKKworICAgID4+PiB0cmVlID0gRVQuRWxlbWVudCgidGFnIikKKyAgICA+Pj4gdHJlZS5zZXQodSJcdTAwZTR0dHIiLCB1InZcdTAwZTRsdWUiKQorICAgID4+PiBFVC50b3N0cmluZyh0cmVlLCAidXRmLTgiKQorICAgICc8dGFnIFxceGMzXFx4YTR0dHI9InZcXHhjM1xceGE0bHVlIiAvPicKKworICAgICIiIgorCitkZWYgYnVnX3htbHRvb2xraXQ1NCgpOgorICAgICIiIgorCisgICAgcHJvYmxlbXMgaGFuZGxpbmcgaW50ZXJuYWxseSBkZWZpbmVkIGVudGl0aWVzCisKKyAgICA+Pj4gZSA9IEVULlhNTCgiPCFET0NUWVBFIGRvYyBbPCFFTlRJVFkgbGRvdHMgJyYjeDgyMzA7Jz5dPjxkb2M+Jmxkb3RzOzwvZG9jPiIpCisgICAgPj4+IHNlcmlhbGl6ZShlKQorICAgICc8ZG9jPiYjMzMzMjg7PC9kb2M+JworCisgICAgIiIiCisKK2RlZiBidWdfeG1sdG9vbGtpdDU1KCk6CisgICAgIiIiCisKKyAgICBtYWtlIHN1cmUgd2UncmUgcmVwb3J0aW5nIHRoZSBmaXJzdCBlcnJvciwgbm90IHRoZSBsYXN0CisKKyAgICA+Pj4gZSA9IEVULlhNTCgiPCFET0NUWVBFIGRvYyBTWVNURU0gJ2RvYy5kdGQnPjxkb2M+Jmxkb3RzOyZuZG90czsmcmRvdHM7PC9kb2M+IikKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgUGFyc2VFcnJvcjogdW5kZWZpbmVkIGVudGl0eSAmbGRvdHM7OiBsaW5lIDEsIGNvbHVtbiAzNgorCisgICAgIiIiCisKK2NsYXNzIEV4Y2VwdGlvbkZpbGU6CisgICAgZGVmIHJlYWQoc2VsZiwgeCk6CisgICAgICAgIHJhaXNlIElPRXJyb3IKKworZGVmIHhtbHRvb2xraXQ2MCgpOgorICAgICIiIgorCisgICAgSGFuZGxlIGNyYXNoIGluIHN0cmVhbSBzb3VyY2UuCisgICAgPj4+IHRyZWUgPSBFVC5wYXJzZShFeGNlcHRpb25GaWxlKCkpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIElPRXJyb3IKKworICAgICIiIgorCitYTUxUT09MS0lUNjJfRE9DID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwYXRlbnQtYXBwbGljYXRpb24tcHVibGljYXRpb24gU1lTVEVNICJwYXAtdjE1LTIwMDEtMDEtMzEuZHRkIiBbXT4KKzxwYXRlbnQtYXBwbGljYXRpb24tcHVibGljYXRpb24+Cis8c3ViZG9jLWFic3RyYWN0PgorPHBhcmFncmFwaCBpZD0iQS0wMDAxIiBsdmw9IjAiPkEgbmV3IGN1bHRpdmFyIG9mIEJlZ29uaWEgcGxhbnQgbmFtZWQgJmxzcXVvO0JDVDk4MDFCRUcmcnNxdW87LjwvcGFyYWdyYXBoPgorPC9zdWJkb2MtYWJzdHJhY3Q+Cis8L3BhdGVudC1hcHBsaWNhdGlvbi1wdWJsaWNhdGlvbj4iIiIKKworCitkZWYgeG1sdG9vbGtpdDYyKCk6CisgICAgIiIiCisKKyAgICBEb24ndCBjcmFzaCB3aGVuIHVzaW5nIGN1c3RvbSBlbnRpdGllcy4KKworICAgID4+PiB4bWx0b29sa2l0NjIoKQorICAgIHUnQSBuZXcgY3VsdGl2YXIgb2YgQmVnb25pYSBwbGFudCBuYW1lZCBcdTIwMThCQ1Q5ODAxQkVHXHUyMDE5LicKKworICAgICIiIgorICAgIEVOVElUSUVTID0ge3UncnNxdW8nOiB1J1x1MjAxOScsIHUnbHNxdW8nOiB1J1x1MjAxOCd9CisgICAgcGFyc2VyID0gRVQuWE1MVHJlZUJ1aWxkZXIoKQorICAgIHBhcnNlci5lbnRpdHkudXBkYXRlKEVOVElUSUVTKQorICAgIHBhcnNlci5mZWVkKFhNTFRPT0xLSVQ2Ml9ET0MpCisgICAgdCA9IHBhcnNlci5jbG9zZSgpCisgICAgcmV0dXJuIHQuZmluZCgnLi8vcGFyYWdyYXBoJykudGV4dAorCitkZWYgeG1sdG9vbGtpdDYzKCk6CisgICAgIiIiCisKKyAgICBDaGVjayByZWZlcmVuY2UgbGVhay4KKyAgICA+Pj4geG1sdG9vbGtpdDYzKCkKKyAgICA+Pj4gY291bnQgPSBzeXMuZ2V0cmVmY291bnQoTm9uZSkKKyAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CisgICAgLi4uICAgICB4bWx0b29sa2l0NjMoKQorICAgID4+PiBzeXMuZ2V0cmVmY291bnQoTm9uZSkgLSBjb3VudAorICAgIDAKKworICAgICIiIgorICAgIHRyZWUgPSBFVC5UcmVlQnVpbGRlcigpCisgICAgdHJlZS5zdGFydCgidGFnIiwge30pCisgICAgdHJlZS5kYXRhKCJ0ZXh0IikKKyAgICB0cmVlLmVuZCgidGFnIikKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2RlZiBidWdfMjAwNzA4X25ld2xpbmUoKToKKyAgICByIiIiCisKKyAgICBQcmVzZXJ2ZSBuZXdsaW5lcyBpbiBhdHRyaWJ1dGVzLgorCisgICAgPj4+IGUgPSBFVC5FbGVtZW50KCdTb21lVGFnJywgdGV4dD0iZGVmIF9mKCk6XG4gIHJldHVybiAzXG4iKQorICAgID4+PiBFVC50b3N0cmluZyhlKQorICAgICc8U29tZVRhZyB0ZXh0PSJkZWYgX2YoKTomIzEwOyAgcmV0dXJuIDMmIzEwOyIgLz4nCisgICAgPj4+IEVULlhNTChFVC50b3N0cmluZyhlKSkuZ2V0KCJ0ZXh0IikKKyAgICAnZGVmIF9mKCk6XG4gIHJldHVybiAzXG4nCisgICAgPj4+IEVULnRvc3RyaW5nKEVULlhNTChFVC50b3N0cmluZyhlKSkpCisgICAgJzxTb21lVGFnIHRleHQ9ImRlZiBfZigpOiYjMTA7ICByZXR1cm4gMyYjMTA7IiAvPicKKworICAgICIiIgorCitkZWYgYnVnXzIwMDcwOF9jbG9zZSgpOgorICAgICIiIgorCisgICAgVGVzdCBkZWZhdWx0IGJ1aWxkZXIuCisgICAgPj4+IHBhcnNlciA9IEVULlhNTFBhcnNlcigpICMgZGVmYXVsdAorICAgID4+PiBwYXJzZXIuZmVlZCgiPGVsZW1lbnQ+c29tZSB0ZXh0PC9lbGVtZW50PiIpCisgICAgPj4+IHN1bW1hcml6ZShwYXJzZXIuY2xvc2UoKSkKKyAgICAnZWxlbWVudCcKKworICAgIFRlc3QgY3VzdG9tIGJ1aWxkZXIuCisgICAgPj4+IGNsYXNzIEVjaG9UYXJnZXQ6CisgICAgLi4uICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgLi4uICAgICAgICAgcmV0dXJuIEVULkVsZW1lbnQoImVsZW1lbnQiKSAjIHNpbXVsYXRlIHJvb3QKKyAgICA+Pj4gcGFyc2VyID0gRVQuWE1MUGFyc2VyKEVjaG9UYXJnZXQoKSkKKyAgICA+Pj4gcGFyc2VyLmZlZWQoIjxlbGVtZW50PnNvbWUgdGV4dDwvZWxlbWVudD4iKQorICAgID4+PiBzdW1tYXJpemUocGFyc2VyLmNsb3NlKCkpCisgICAgJ2VsZW1lbnQnCisKKyAgICAiIiIKKworZGVmIGJ1Z18yMDA3MDlfZGVmYXVsdF9uYW1lc3BhY2UoKToKKyAgICAiIiIKKworICAgID4+PiBlID0gRVQuRWxlbWVudCgie2RlZmF1bHR9ZWxlbSIpCisgICAgPj4+IHMgPSBFVC5TdWJFbGVtZW50KGUsICJ7ZGVmYXVsdH1lbGVtIikKKyAgICA+Pj4gc2VyaWFsaXplKGUsIGRlZmF1bHRfbmFtZXNwYWNlPSJkZWZhdWx0IikgIyAxCisgICAgJzxlbGVtIHhtbG5zPSJkZWZhdWx0Ij48ZWxlbSAvPjwvZWxlbT4nCisKKyAgICA+Pj4gZSA9IEVULkVsZW1lbnQoIntkZWZhdWx0fWVsZW0iKQorICAgID4+PiBzID0gRVQuU3ViRWxlbWVudChlLCAie2RlZmF1bHR9ZWxlbSIpCisgICAgPj4+IHMgPSBFVC5TdWJFbGVtZW50KGUsICJ7bm90LWRlZmF1bHR9ZWxlbSIpCisgICAgPj4+IHNlcmlhbGl6ZShlLCBkZWZhdWx0X25hbWVzcGFjZT0iZGVmYXVsdCIpICMgMgorICAgICc8ZWxlbSB4bWxucz0iZGVmYXVsdCIgeG1sbnM6bnMxPSJub3QtZGVmYXVsdCI+PGVsZW0gLz48bnMxOmVsZW0gLz48L2VsZW0+JworCisgICAgPj4+IGUgPSBFVC5FbGVtZW50KCJ7ZGVmYXVsdH1lbGVtIikKKyAgICA+Pj4gcyA9IEVULlN1YkVsZW1lbnQoZSwgIntkZWZhdWx0fWVsZW0iKQorICAgID4+PiBzID0gRVQuU3ViRWxlbWVudChlLCAiZWxlbSIpICMgdW5wcmVmaXhlZCBuYW1lCisgICAgPj4+IHNlcmlhbGl6ZShlLCBkZWZhdWx0X25hbWVzcGFjZT0iZGVmYXVsdCIpICMgMworICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBWYWx1ZUVycm9yOiBjYW5ub3QgdXNlIG5vbi1xdWFsaWZpZWQgbmFtZXMgd2l0aCBkZWZhdWx0X25hbWVzcGFjZSBvcHRpb24KKworICAgICIiIgorCitkZWYgYnVnXzIwMDcwOV9yZWdpc3Rlcl9uYW1lc3BhY2UoKToKKyAgICAiIiIKKworICAgID4+PiBFVC50b3N0cmluZyhFVC5FbGVtZW50KCJ7aHR0cDovL25hbWVzcGFjZS5pbnZhbGlkL2RvZXMvbm90L2V4aXN0L310aXRsZSIpKQorICAgICc8bnMwOnRpdGxlIHhtbG5zOm5zMD0iaHR0cDovL25hbWVzcGFjZS5pbnZhbGlkL2RvZXMvbm90L2V4aXN0LyIgLz4nCisgICAgPj4+IEVULnJlZ2lzdGVyX25hbWVzcGFjZSgiZm9vIiwgImh0dHA6Ly9uYW1lc3BhY2UuaW52YWxpZC9kb2VzL25vdC9leGlzdC8iKQorICAgID4+PiBFVC50b3N0cmluZyhFVC5FbGVtZW50KCJ7aHR0cDovL25hbWVzcGFjZS5pbnZhbGlkL2RvZXMvbm90L2V4aXN0L310aXRsZSIpKQorICAgICc8Zm9vOnRpdGxlIHhtbG5zOmZvbz0iaHR0cDovL25hbWVzcGFjZS5pbnZhbGlkL2RvZXMvbm90L2V4aXN0LyIgLz4nCisKKyAgICBBbmQgdGhlIER1YmxpbiBDb3JlIG5hbWVzcGFjZSBpcyBpbiB0aGUgZGVmYXVsdCBsaXN0OgorCisgICAgPj4+IEVULnRvc3RyaW5nKEVULkVsZW1lbnQoIntodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xL310aXRsZSIpKQorICAgICc8ZGM6dGl0bGUgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiAvPicKKworICAgICIiIgorCitkZWYgYnVnXzIwMDcwOV9lbGVtZW50X2NvbW1lbnQoKToKKyAgICAiIiIKKworICAgIE5vdCBzdXJlIGlmIHRoaXMgY2FuIGJlIGZpeGVkLCByZWFsbHkgKHNpbmNlIHRoZSBzZXJpYWxpemVyIG5lZWRzCisgICAgRVQuQ29tbWVudCwgbm90IGNFVC5jb21tZW50KS4KKworICAgID4+PiBhID0gRVQuRWxlbWVudCgnYScpCisgICAgPj4+IGEuYXBwZW5kKEVULkNvbW1lbnQoJ2ZvbycpKQorICAgID4+PiBhWzBdLnRhZyA9PSBFVC5Db21tZW50CisgICAgVHJ1ZQorCisgICAgPj4+IGEgPSBFVC5FbGVtZW50KCdhJykKKyAgICA+Pj4gYS5hcHBlbmQoRVQuUEkoJ2ZvbycpKQorICAgID4+PiBhWzBdLnRhZyA9PSBFVC5QSQorICAgIFRydWUKKworICAgICIiIgorCitkZWYgYnVnXzIwMDcwOV9lbGVtZW50X2luc2VydCgpOgorICAgICIiIgorCisgICAgPj4+IGEgPSBFVC5FbGVtZW50KCdhJykKKyAgICA+Pj4gYiA9IEVULlN1YkVsZW1lbnQoYSwgJ2InKQorICAgID4+PiBjID0gRVQuU3ViRWxlbWVudChhLCAnYycpCisgICAgPj4+IGQgPSBFVC5FbGVtZW50KCdkJykKKyAgICA+Pj4gYS5pbnNlcnQoMCwgZCkKKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoYSkKKyAgICBbJ2QnLCAnYicsICdjJ10KKyAgICA+Pj4gYS5pbnNlcnQoLTEsIGQpCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGEpCisgICAgWydkJywgJ2InLCAnZCcsICdjJ10KKworICAgICIiIgorCitkZWYgYnVnXzIwMDcwOV9pdGVyX2NvbW1lbnQoKToKKyAgICAiIiIKKworICAgID4+PiBhID0gRVQuRWxlbWVudCgnYScpCisgICAgPj4+IGIgPSBFVC5TdWJFbGVtZW50KGEsICdiJykKKyAgICA+Pj4gY29tbWVudF9iID0gRVQuQ29tbWVudCgiVEVTVC1iIikKKyAgICA+Pj4gYi5hcHBlbmQoY29tbWVudF9iKQorICAgID4+PiBzdW1tYXJpemVfbGlzdChhLml0ZXIoRVQuQ29tbWVudCkpCisgICAgWyc8Q29tbWVudD4nXQorCisgICAgIiIiCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcmVwb3J0ZWQgb24gYnVncy5weXRob24ub3JnCisKK2RlZiBidWdfMTUzNDYzMCgpOgorICAgICIiIgorCisgICAgPj4+IGJvYiA9IEVULlRyZWVCdWlsZGVyKCkKKyAgICA+Pj4gZSA9IGJvYi5kYXRhKCJkYXRhIikKKyAgICA+Pj4gZSA9IGJvYi5zdGFydCgidGFnIiwge30pCisgICAgPj4+IGUgPSBib2IuZW5kKCJ0YWciKQorICAgID4+PiBlID0gYm9iLmNsb3NlKCkKKyAgICA+Pj4gc2VyaWFsaXplKGUpCisgICAgJzx0YWcgLz4nCisKKyAgICAiIiIKKworZGVmIGNoZWNrX2lzc3VlNjIzMygpOgorICAgICIiIgorCisgICAgPj4+IGUgPSBFVC5YTUwoIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3V0Zi04Jz8+PGJvZHk+dFxceGMzXFx4YTNnPC9ib2R5PiIpCisgICAgPj4+IEVULnRvc3RyaW5nKGUsICdhc2NpaScpCisgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2FzY2lpJz8+XFxuPGJvZHk+dCYjMjI3O2c8L2JvZHk+IgorICAgID4+PiBlID0gRVQuWE1MKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+PGJvZHk+dFxceGUzZzwvYm9keT4iKQorICAgID4+PiBFVC50b3N0cmluZyhlLCAnYXNjaWknKQorICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdhc2NpaSc/Plxcbjxib2R5PnQmIzIyNztnPC9ib2R5PiIKKworICAgICIiIgorCitkZWYgY2hlY2tfaXNzdWUzMTUxKCk6CisgICAgIiIiCisKKyAgICA+Pj4gZSA9IEVULlhNTCgnPHByZWZpeDpsb2NhbG5hbWUgeG1sbnM6cHJlZml4PSIke3N0dWZmfSIvPicpCisgICAgPj4+IGUudGFnCisgICAgJ3ske3N0dWZmfX1sb2NhbG5hbWUnCisgICAgPj4+IHQgPSBFVC5FbGVtZW50VHJlZShlKQorICAgID4+PiBFVC50b3N0cmluZyhlKQorICAgICc8bnMwOmxvY2FsbmFtZSB4bWxuczpuczA9IiR7c3R1ZmZ9IiAvPicKKworICAgICIiIgorCitkZWYgY2hlY2tfaXNzdWU2NTY1KCk6CisgICAgIiIiCisKKyAgICA+Pj4gZWxlbSA9IEVULlhNTCgiPGJvZHk+PHRhZy8+PC9ib2R5PiIpCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0pCisgICAgWyd0YWcnXQorICAgID4+PiBuZXdlbGVtID0gRVQuWE1MKFNBTVBMRV9YTUwpCisgICAgPj4+IGVsZW1bOl0gPSBuZXdlbGVtWzpdCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0pCisgICAgWyd0YWcnLCAndGFnJywgJ3NlY3Rpb24nXQorCisgICAgIiIiCisKK2RlZiBjaGVja19odG1sX2VtcHR5X2VsZW1zX3NlcmlhbGl6YXRpb24oc2VsZik6CisgICAgIyBpc3N1ZSAxNTk3MAorICAgICMgZnJvbSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL2luZGV4L2VsZW1lbnRzLmh0bWwKKyAgICAiIiIKKworICAgID4+PiBlbXB0eV9lbGVtcyA9IFsnQVJFQScsICdCQVNFJywgJ0JBU0VGT05UJywgJ0JSJywgJ0NPTCcsICdGUkFNRScsICdIUicsCisgICAgLi4uICAgICAgICAgICAgICAgICdJTUcnLCAnSU5QVVQnLCAnSVNJTkRFWCcsICdMSU5LJywgJ01FVEEnLCAnUEFSQU0nXQorICAgID4+PiBlbGVtcyA9ICcnLmpvaW4oJzwlcyAvPicgJSBlbGVtIGZvciBlbGVtIGluIGVtcHR5X2VsZW1zKQorICAgID4+PiBzZXJpYWxpemUoRVQuWE1MKCc8aHRtbD4lczwvaHRtbD4nICUgZWxlbXMpLCBtZXRob2Q9J2h0bWwnKQorICAgICc8aHRtbD48QVJFQT48QkFTRT48QkFTRUZPTlQ+PEJSPjxDT0w+PEZSQU1FPjxIUj48SU1HPjxJTlBVVD48SVNJTkRFWD48TElOSz48TUVUQT48UEFSQU0+PC9odG1sPicKKyAgICA+Pj4gc2VyaWFsaXplKEVULlhNTCgnPGh0bWw+JXM8L2h0bWw+JyAlIGVsZW1zLmxvd2VyKCkpLCBtZXRob2Q9J2h0bWwnKQorICAgICc8aHRtbD48YXJlYT48YmFzZT48YmFzZWZvbnQ+PGJyPjxjb2w+PGZyYW1lPjxocj48aW1nPjxpbnB1dD48aXNpbmRleD48bGluaz48bWV0YT48cGFyYW0+PC9odG1sPicKKyAgICA+Pj4gZWxlbXMgPSAnJy5qb2luKCc8JXM+PC8lcz4nICUgKGVsZW0sIGVsZW0pIGZvciBlbGVtIGluIGVtcHR5X2VsZW1zKQorICAgID4+PiBzZXJpYWxpemUoRVQuWE1MKCc8aHRtbD4lczwvaHRtbD4nICUgZWxlbXMpLCBtZXRob2Q9J2h0bWwnKQorICAgICc8aHRtbD48QVJFQT48QkFTRT48QkFTRUZPTlQ+PEJSPjxDT0w+PEZSQU1FPjxIUj48SU1HPjxJTlBVVD48SVNJTkRFWD48TElOSz48TUVUQT48UEFSQU0+PC9odG1sPicKKyAgICA+Pj4gc2VyaWFsaXplKEVULlhNTCgnPGh0bWw+JXM8L2h0bWw+JyAlIGVsZW1zLmxvd2VyKCkpLCBtZXRob2Q9J2h0bWwnKQorICAgICc8aHRtbD48YXJlYT48YmFzZT48YmFzZWZvbnQ+PGJyPjxjb2w+PGZyYW1lPjxocj48aW1nPjxpbnB1dD48aXNpbmRleD48bGluaz48bWV0YT48cGFyYW0+PC9odG1sPicKKworICAgICIiIgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworY2xhc3MgQ2xlYW5Db250ZXh0KG9iamVjdCk6CisgICAgIiIiUHJvdmlkZSBkZWZhdWx0IG5hbWVzcGFjZSBtYXBwaW5nIGFuZCBwYXRoIGNhY2hlLiIiIgorICAgIGNoZWNrd2FybmluZ3MgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcXVpZXQ9RmFsc2UpOgorICAgICAgICBpZiBzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMjoKKyAgICAgICAgICAgICMgdW5kZXIgLU9PLCBkb2N0ZXN0cyBjYW5ub3QgYmUgcnVuIGFuZCB0aGVyZWZvcmUgbm90IGFsbCB3YXJuaW5ncworICAgICAgICAgICAgIyB3aWxsIGJlIGVtaXR0ZWQKKyAgICAgICAgICAgIHF1aWV0ID0gVHJ1ZQorICAgICAgICBkZXByZWNhdGlvbnMgPSAoCisgICAgICAgICAgICAjIFNlYXJjaCBiZWhhdmlvdXIgaXMgYnJva2VuIGlmIHNlYXJjaCBwYXRoIHN0YXJ0cyB3aXRoICIvIi4KKyAgICAgICAgICAgICgiVGhpcyBzZWFyY2ggaXMgYnJva2VuIGluIDEuMyBhbmQgZWFybGllciwgYW5kIHdpbGwgYmUgZml4ZWQgIgorICAgICAgICAgICAgICJpbiBhIGZ1dHVyZSB2ZXJzaW9uLiAgSWYgeW91IHJlbHkgb24gdGhlIGN1cnJlbnQgYmVoYXZpb3VyLCAiCisgICAgICAgICAgICAgImNoYW5nZSBpdCB0byAnLisnIiwgRnV0dXJlV2FybmluZyksCisgICAgICAgICAgICAjIEVsZW1lbnQuZ2V0Y2hpbGRyZW4oKSBhbmQgRWxlbWVudC5nZXRpdGVyYXRvcigpIGFyZSBkZXByZWNhdGVkLgorICAgICAgICAgICAgKCJUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLiAgIgorICAgICAgICAgICAgICJVc2UgLisgaW5zdGVhZC4iLCBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgKCJUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLiAgIgorICAgICAgICAgICAgICJVc2UgLisgaW5zdGVhZC4iLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICMgWE1MUGFyc2VyLmRvY3R5cGUoKSBpcyBkZXByZWNhdGVkLgorICAgICAgICAgICAgKCJUaGlzIG1ldGhvZCBvZiBYTUxQYXJzZXIgaXMgZGVwcmVjYXRlZC4gIERlZmluZSBkb2N0eXBlLi4gIgorICAgICAgICAgICAgICJtZXRob2Qgb24gdGhlIFRyZWVCdWlsZGVyIHRhcmdldC4iLCBEZXByZWNhdGlvbldhcm5pbmcpKQorICAgICAgICBzZWxmLmNoZWNrd2FybmluZ3MgPSB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKmRlcHJlY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0PXF1aWV0KQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlCisgICAgICAgIHNlbGYuX25zbWFwID0gRWxlbWVudFRyZWUuX25hbWVzcGFjZV9tYXAKKyAgICAgICAgc2VsZi5fcGF0aF9jYWNoZSA9IEVsZW1lbnRUcmVlLkVsZW1lbnRQYXRoLl9jYWNoZQorICAgICAgICAjIENvcHkgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIG1hcHBpbmcKKyAgICAgICAgRWxlbWVudFRyZWUuX25hbWVzcGFjZV9tYXAgPSBzZWxmLl9uc21hcC5jb3B5KCkKKyAgICAgICAgIyBDb3B5IHRoZSBwYXRoIGNhY2hlIChzaG91bGQgYmUgZW1wdHkpCisgICAgICAgIEVsZW1lbnRUcmVlLkVsZW1lbnRQYXRoLl9jYWNoZSA9IHNlbGYuX3BhdGhfY2FjaGUuY29weSgpCisgICAgICAgIHNlbGYuY2hlY2t3YXJuaW5ncy5fX2VudGVyX18oKQorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlCisgICAgICAgICMgUmVzdG9yZSBtYXBwaW5nIGFuZCBwYXRoIGNhY2hlCisgICAgICAgIEVsZW1lbnRUcmVlLl9uYW1lc3BhY2VfbWFwID0gc2VsZi5fbnNtYXAKKyAgICAgICAgRWxlbWVudFRyZWUuRWxlbWVudFBhdGguX2NhY2hlID0gc2VsZi5fcGF0aF9jYWNoZQorICAgICAgICBzZWxmLmNoZWNrd2FybmluZ3MuX19leGl0X18oKmFyZ3MpCisKKworZGVmIHRlc3RfbWFpbihtb2R1bGVfbmFtZT0neG1sLmV0cmVlLkVsZW1lbnRUcmVlJyk6CisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3htbF9ldHJlZQorCisgICAgdXNlX3B5X21vZHVsZSA9IChtb2R1bGVfbmFtZSA9PSAneG1sLmV0cmVlLkVsZW1lbnRUcmVlJykKKworICAgICMgVGhlIHNhbWUgZG9jdGVzdHMgYXJlIHVzZWQgZm9yIGJvdGggdGhlIFB5dGhvbiBhbmQgdGhlIEMgaW1wbGVtZW50YXRpb25zCisgICAgYXNzZXJ0IHRlc3RfeG1sX2V0cmVlLkVULl9fbmFtZV9fID09IG1vZHVsZV9uYW1lCisKKyAgICAjIFhYWCB0aGUgQyBtb2R1bGUgc2hvdWxkIGdpdmUgdGhlIHNhbWUgd2FybmluZ3MgYXMgdGhlIFB5dGhvbiBtb2R1bGUKKyAgICB3aXRoIENsZWFuQ29udGV4dChxdWlldD1ub3QgdXNlX3B5X21vZHVsZSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X3htbF9ldHJlZSwgdmVyYm9zaXR5PVRydWUpCisKKyAgICAjIFRoZSBtb2R1bGUgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGJ5IHRoZSB0ZXN0cworICAgIGFzc2VydCB0ZXN0X3htbF9ldHJlZS5FVC5fX25hbWVfXyA9PSBtb2R1bGVfbmFtZQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxfZXRyZWUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGZiMDcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxfZXRyZWUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTJkOGZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbF9ldHJlZV9jLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NGE0YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weQpAQCAtMCwwICsxLDU1IEBACisjIHhtbC5ldHJlZSB0ZXN0IGZvciBjRWxlbWVudFRyZWUKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHByZWNpc2lvbmJpZ21lbXRlc3QsIF8yRworaW1wb3J0IHVuaXR0ZXN0CisKK2NFVCA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd4bWwuZXRyZWUuY0VsZW1lbnRUcmVlJykKKworCisjIGNFbGVtZW50VHJlZSBzcGVjaWZpYyB0ZXN0cworCitkZWYgc2FuaXR5KCk6CisgICAgIiIiCisgICAgSW1wb3J0IHNhbml0eS4KKworICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgY0VsZW1lbnRUcmVlCisgICAgIiIiCisKKworY2xhc3MgTWlzY1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIElzc3VlICM4NjUxLgorICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzJHICsgMTAwLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9sZW5ndGhfb3ZlcmZsb3coc2VsZiwgc2l6ZSk6CisgICAgICAgIGlmIHNpemUgPCBfMkcgKyAxMDA6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJub3QgZW5vdWdoIGZyZWUgbWVtb3J5LCBuZWVkIGF0IGxlYXN0IDIgR0IiKQorICAgICAgICBkYXRhID0gYid4JyAqIHNpemUKKyAgICAgICAgcGFyc2VyID0gY0VULlhNTFBhcnNlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHBhcnNlci5mZWVkLCBkYXRhKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGF0YSA9IE5vbmUKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3htbF9ldHJlZSwgdGVzdF94bWxfZXRyZWVfYworCisgICAgIyBSdW4gdGhlIHRlc3RzIHNwZWNpZmljIHRvIHRoZSBDIGltcGxlbWVudGF0aW9uCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfeG1sX2V0cmVlX2MsIHZlcmJvc2l0eT1UcnVlKQorCisgICAgIyBBc3NpZ24gdGhlIEMgaW1wbGVtZW50YXRpb24gYmVmb3JlIHJ1bm5pbmcgdGhlIGRvY3Rlc3RzCisgICAgIyBQYXRjaCB0aGUgX19uYW1lX18sIHRvIHByZXZlbnQgY29uZnVzaW9uIHdpdGggdGhlIHB1cmUgUHl0aG9uIHRlc3QKKyAgICBweUVUID0gdGVzdF94bWxfZXRyZWUuRVQKKyAgICBweV9fbmFtZV9fID0gdGVzdF94bWxfZXRyZWUuX19uYW1lX18KKyAgICB0ZXN0X3htbF9ldHJlZS5FVCA9IGNFVAorICAgIGlmIF9fbmFtZV9fICE9ICdfX21haW5fXyc6CisgICAgICAgIHRlc3RfeG1sX2V0cmVlLl9fbmFtZV9fID0gX19uYW1lX18KKyAgICB0cnk6CisgICAgICAgICMgUnVuIHRoZSBzYW1lIHRlc3Qgc3VpdGUgYXMgeG1sLmV0cmVlLkVsZW1lbnRUcmVlCisgICAgICAgIHRlc3RfeG1sX2V0cmVlLnRlc3RfbWFpbihtb2R1bGVfbmFtZT0neG1sLmV0cmVlLmNFbGVtZW50VHJlZScpCisgICAgZmluYWxseToKKyAgICAgICAgdGVzdF94bWxfZXRyZWUuRVQgPSBweUVUCisgICAgICAgIHRlc3RfeG1sX2V0cmVlLl9fbmFtZV9fID0gcHlfX25hbWVfXworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExZmIxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbF9ldHJlZV9jLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExZmIxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbF9ldHJlZV9jLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2OTc4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbGxpYi5weQpAQCAtMCwwICsxLDQ4IEBACisnJydUZXN0IG1vZHVsZSB0byB0aGVzdCB0aGUgeG1sbGliIG1vZHVsZS4KKyAgIFNqb2VyZCBNdWxsZW5kZXIKKycnJworCit0ZXN0ZG9jID0gIiIiXAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9J3llcycgPz4KKzwhLS0gY29tbWVudHMgYXJlbid0IGFsbG93ZWQgYmVmb3JlIHRoZSA8P3htbD8+IHRhZywKKyAgICAgYnV0IHRoZXkgYXJlIGFsbG93ZWQgYmVmb3JlIHRoZSA8IURPQ1RZUEU+IHRhZyAtLT4KKzw/cHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgYXJlIGFsbG93ZWQgaW4gdGhlIHNhbWUgcGxhY2VzIGFzIGNvbW1lbnRzID8+Cis8IURPQ1RZUEUgZ3JlZXRpbmcgWworICA8IUVMRU1FTlQgZ3JlZXRpbmcgKCNQQ0RBVEEpPgorXT4KKzxncmVldGluZz5IZWxsbywgd29ybGQhPC9ncmVldGluZz4KKyIiIgorCituc2RvYyA9ICI8Zm9vIHhtbG5zPSdVUkknIGF0dHI9J3ZhbCcvPiIKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorIyBTaWxlbmNlIFB5M2sgd2FybmluZworeG1sbGliID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3htbGxpYicsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworY2xhc3MgWE1MUGFyc2VyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSB4bWxsaWIuWE1MUGFyc2VyKCkKKyAgICAgICAgZm9yIGMgaW4gdGVzdGRvYzoKKyAgICAgICAgICAgIHBhcnNlci5mZWVkKGMpCisgICAgICAgIHBhcnNlci5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X25hbWVzcGFjZShzZWxmKToKKyAgICAgICAgY2xhc3MgSCh4bWxsaWIuWE1MUGFyc2VyKToKKyAgICAgICAgICAgIGRlZiB1bmtub3duX3N0YXJ0dGFnKHNlbGYsIG5hbWUsIGF0dHIpOgorICAgICAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi5hdHRyID0gbmFtZSwgYXR0cgorICAgICAgICBoPUgoKQorICAgICAgICBoLmZlZWQobnNkb2MpCisgICAgICAgIGguY2xvc2UoKQorICAgICAgICAjIFRoZSBkZWZhdWx0IG5hbWVzcGFjZSBhcHBsaWVzIHRvIGVsZW1lbnRzLi4uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5uYW1lLCAiVVJJIGZvbyIpCisgICAgICAgICMgYnV0IG5vdCB0byBhdHRyaWJ1dGVzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5hdHRyLCB7J2F0dHInOid2YWwnfSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChYTUxQYXJzZXJUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sbGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2OWFhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sbGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2OWFhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1scnBjLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1scnBjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjVmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxycGMucHkKQEAgLTAsMCArMSwxMDI3IEBACitpbXBvcnQgYmFzZTY0CitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB4bWxycGNsaWIKK2ltcG9ydCBTaW1wbGVYTUxSUENTZXJ2ZXIKK2ltcG9ydCBtaW1ldG9vbHMKK2ltcG9ydCBodHRwbGliCitpbXBvcnQgc29ja2V0CitpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBvcworaW1wb3J0IHJlCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKKwordHJ5OgorICAgIHVuaWNvZGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgaGF2ZV91bmljb2RlID0gRmFsc2UKK2Vsc2U6CisgICAgaGF2ZV91bmljb2RlID0gVHJ1ZQorCithbGlzdCA9IFt7J2FzdHJpbmcnOiAnZm9vQGJhci5iYXouc3BhbScsCisgICAgICAgICAgJ2FmbG9hdCc6IDcyODMuNDMsCisgICAgICAgICAgJ2FuaW50JzogMioqMjAsCisgICAgICAgICAgJ2FzaG9ydGxvbmcnOiAyTCwKKyAgICAgICAgICAnYW5vdGhlcmxpc3QnOiBbJy56eXguNDEnXSwKKyAgICAgICAgICAnYWJhc2U2NCc6IHhtbHJwY2xpYi5CaW5hcnkoIm15IGRvZyBoYXMgZmxlYXMiKSwKKyAgICAgICAgICAnYm9vbGVhbic6IHhtbHJwY2xpYi5GYWxzZSwKKyAgICAgICAgICAndW5pY29kZSc6IHUnXHU0MDAwXHU2MDAwXHU4MDAwJywKKyAgICAgICAgICB1J3VrZXlcdTQwMDAnOiAncmVndWxhciB2YWx1ZScsCisgICAgICAgICAgJ2RhdGV0aW1lMSc6IHhtbHJwY2xpYi5EYXRlVGltZSgnMjAwNTAyMTBUMTE6NDE6MjMnKSwKKyAgICAgICAgICAnZGF0ZXRpbWUyJzogeG1scnBjbGliLkRhdGVUaW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgKDIwMDUsIDAyLCAxMCwgMTEsIDQxLCAyMywgMCwgMSwgLTEpKSwKKyAgICAgICAgICAnZGF0ZXRpbWUzJzogeG1scnBjbGliLkRhdGVUaW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwNSwgMDIsIDEwLCAxMSwgNDEsIDIzKSksCisgICAgICAgICAgfV0KKworY2xhc3MgWE1MUlBDVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZHVtcF9sb2FkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHhtbHJwY2xpYi5sb2Fkcyh4bWxycGNsaWIuZHVtcHMoKGFsaXN0LCkpKVswXVswXSkKKworICAgIGRlZiB0ZXN0X2R1bXBfYmFyZV9kYXRldGltZShzZWxmKToKKyAgICAgICAgIyBUaGlzIGNoZWNrcyB0aGF0IGFuIHVud3JhcHBlZCBkYXRldGltZS5kYXRlIG9iamVjdCBjYW4gYmUgaGFuZGxlZAorICAgICAgICAjIGJ5IHRoZSBtYXJzaGFsbGluZyBjb2RlLiAgVGhpcyBjYW4ndCBiZSBkb25lIHZpYSB0ZXN0X2R1bXBfbG9hZCgpCisgICAgICAgICMgc2luY2Ugd2l0aCB1c2VfZGF0ZXRpbWUgc2V0IHRvIDEgdGhlIHVubWFyc2hhbGxlciB3b3VsZCBjcmVhdGUKKyAgICAgICAgIyBkYXRldGltZSBvYmplY3RzIGZvciB0aGUgJ2RhdGV0aW1lWzEyM10nIGtleXMgYXMgd2VsbAorICAgICAgICBkdCA9IGRhdGV0aW1lLmRhdGV0aW1lKDIwMDUsIDAyLCAxMCwgMTEsIDQxLCAyMykKKyAgICAgICAgcyA9IHhtbHJwY2xpYi5kdW1wcygoZHQsKSkKKyAgICAgICAgKG5ld2R0LCksIG0gPSB4bWxycGNsaWIubG9hZHMocywgdXNlX2RhdGV0aW1lPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3ZHQsIGR0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0sIE5vbmUpCisKKyAgICAgICAgKG5ld2R0LCksIG0gPSB4bWxycGNsaWIubG9hZHMocywgdXNlX2RhdGV0aW1lPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3ZHQsIHhtbHJwY2xpYi5EYXRlVGltZSgnMjAwNTAyMTBUMTE6NDE6MjMnKSkKKworICAgIGRlZiB0ZXN0X2RhdGV0aW1lX2JlZm9yZV8xOTAwKHNlbGYpOgorICAgICAgICAjIHNhbWUgYXMgYmVmb3JlIGJ1dCB3aXRoIGEgZGF0ZSBiZWZvcmUgMTkwMAorICAgICAgICBkdCA9IGRhdGV0aW1lLmRhdGV0aW1lKDEsIDAyLCAxMCwgMTEsIDQxLCAyMykKKyAgICAgICAgcyA9IHhtbHJwY2xpYi5kdW1wcygoZHQsKSkKKyAgICAgICAgKG5ld2R0LCksIG0gPSB4bWxycGNsaWIubG9hZHMocywgdXNlX2RhdGV0aW1lPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3ZHQsIGR0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0sIE5vbmUpCisKKyAgICAgICAgKG5ld2R0LCksIG0gPSB4bWxycGNsaWIubG9hZHMocywgdXNlX2RhdGV0aW1lPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3ZHQsIHhtbHJwY2xpYi5EYXRlVGltZSgnMDAwMTAyMTBUMTE6NDE6MjMnKSkKKworICAgIGRlZiB0ZXN0X2NtcF9kYXRldGltZV9EYXRlVGltZShzZWxmKToKKyAgICAgICAgbm93ID0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkKKyAgICAgICAgZHQgPSB4bWxycGNsaWIuRGF0ZVRpbWUobm93LnRpbWV0dXBsZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZHQgPT0gbm93KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm93ID09IGR0KQorICAgICAgICB0aGVuID0gbm93ICsgZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9NCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRoZW4gPj0gZHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdCA8IHRoZW4pCisKKyAgICBkZWYgdGVzdF9idWdfMTE2NDkxMiAoc2VsZik6CisgICAgICAgIGQgPSB4bWxycGNsaWIuRGF0ZVRpbWUoKQorICAgICAgICAoKG5ld19kLCksIGR1bW15KSA9IHhtbHJwY2xpYi5sb2Fkcyh4bWxycGNsaWIuZHVtcHMoKGQsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcmVzcG9uc2U9VHJ1ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShuZXdfZC52YWx1ZSwgc3RyKQorCisgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgb3V0cHV0IG9mIGR1bXBzKCkgaXMgc3RpbGwgYW4gOC1iaXQgc3RyaW5nCisgICAgICAgIHMgPSB4bWxycGNsaWIuZHVtcHMoKG5ld19kLCksIG1ldGhvZHJlc3BvbnNlPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzLCBzdHIpCisKKyAgICBkZWYgdGVzdF9uZXdzdHlsZV9jbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgVChvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0ID0gVCgpCisgICAgICAgIHQueCA9IDEwMAorICAgICAgICB0LnkgPSAiSGVsbG8iCisgICAgICAgICgodDIsKSwgZHVtbXkpID0geG1scnBjbGliLmxvYWRzKHhtbHJwY2xpYi5kdW1wcygodCwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MiwgdC5fX2RpY3RfXykKKworICAgIGRlZiB0ZXN0X2R1bXBfYmlnX2xvbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHhtbHJwY2xpYi5kdW1wcywgKDJMKio5OSwpKQorCisgICAgZGVmIHRlc3RfZHVtcF9iYWRfZGljdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB4bWxycGNsaWIuZHVtcHMsICh7KDEsMiwzKTogMX0sKSkKKworICAgIGRlZiB0ZXN0X2R1bXBfcmVjdXJzaXZlX3NlcShzZWxmKToKKyAgICAgICAgbCA9IFsxLDIsM10KKyAgICAgICAgdCA9IFszLDQsNSxsXQorICAgICAgICBsLmFwcGVuZCh0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHhtbHJwY2xpYi5kdW1wcywgKGwsKSkKKworICAgIGRlZiB0ZXN0X2R1bXBfcmVjdXJzaXZlX2RpY3Qoc2VsZik6CisgICAgICAgIGQgPSB7JzEnOjEsICcyJzoxfQorICAgICAgICB0ID0geyczJzozLCAnZCc6ZH0KKyAgICAgICAgZFsndCddID0gdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHhtbHJwY2xpYi5kdW1wcywgKGQsKSkKKworICAgIGRlZiB0ZXN0X2R1bXBfYmlnX2ludChzZWxmKToKKyAgICAgICAgaWYgc3lzLm1heGludCA+IDJMKiozMS0xOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgeG1scnBjbGliLmR1bXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCgyTCoqMzQpLCkpCisKKyAgICAgICAgeG1scnBjbGliLmR1bXBzKCh4bWxycGNsaWIuTUFYSU5ULCB4bWxycGNsaWIuTUlOSU5UKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgeG1scnBjbGliLmR1bXBzLCAoeG1scnBjbGliLk1BWElOVCsxLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHhtbHJwY2xpYi5kdW1wcywgKHhtbHJwY2xpYi5NSU5JTlQtMSwpKQorCisgICAgICAgIGRlZiBkdW1teV93cml0ZShzKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBtID0geG1scnBjbGliLk1hcnNoYWxsZXIoKQorICAgICAgICBtLmR1bXBfaW50KHhtbHJwY2xpYi5NQVhJTlQsIGR1bW15X3dyaXRlKQorICAgICAgICBtLmR1bXBfaW50KHhtbHJwY2xpYi5NSU5JTlQsIGR1bW15X3dyaXRlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBtLmR1bXBfaW50LCB4bWxycGNsaWIuTUFYSU5UKzEsIGR1bW15X3dyaXRlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBtLmR1bXBfaW50LCB4bWxycGNsaWIuTUlOSU5ULTEsIGR1bW15X3dyaXRlKQorCisKKyAgICBkZWYgdGVzdF9kdW1wX25vbmUoc2VsZik6CisgICAgICAgIHZhbHVlID0gYWxpc3QgKyBbTm9uZV0KKyAgICAgICAgYXJnMSA9IChhbGlzdCArIFtOb25lXSwpCisgICAgICAgIHN0cmcgPSB4bWxycGNsaWIuZHVtcHMoYXJnMSwgYWxsb3dfbm9uZT1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHhtbHJwY2xpYi5sb2FkcyhzdHJnKVswXVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB4bWxycGNsaWIuZHVtcHMsIChhcmcxLCkpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X2VuY29kaW5nX2lzc3VlcyhzZWxmKToKKyAgICAgICAgIyBTRiBidWcgIzExMTU5ODk6IHdyb25nIGRlY29kaW5nIGluICdfc3RyaW5naWZ5JworICAgICAgICB1dGY4ID0gIiIiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/PgorICAgICAgICAgICAgICAgICAgPHBhcmFtcz4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmFtPjx2YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nPmFiYyBceDk1PC9zdHJpbmc+CisgICAgICAgICAgICAgICAgICAgICAgPC92YWx1ZT48L3BhcmFtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYW0+PHZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgIDxzdHJ1Y3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5kZWYgXHg5NjwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPjxzdHJpbmc+Z2hpIFx4OTc8L3N0cmluZz48L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3RydWN0PgorICAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+PC9wYXJhbT4KKyAgICAgICAgICAgICAgICAgIDwvcGFyYW1zPgorICAgICAgICAgICAgICAgICAgIiIiCisKKyAgICAgICAgIyBzeXMuc2V0ZGVmYXVsdGVuY29kaW5nKCkgbm9ybWFsbHkgZG9lc24ndCBleGlzdCBhZnRlciBzaXRlLnB5IGlzCisgICAgICAgICMgbG9hZGVkLiAgSW1wb3J0IGEgdGVtcG9yYXJ5IGZyZXNoIGNvcHkgdG8gZ2V0IGFjY2VzcyB0byBpdAorICAgICAgICAjIGJ1dCB0aGVuIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGNvcHkgdG8gYXZvaWQgbWVzc2luZyB3aXRoCisgICAgICAgICMgb3RoZXIgcG90ZW50aWFsbHkgbW9kaWZpZWQgc3lzIG1vZHVsZSBhdHRyaWJ1dGVzCisgICAgICAgIG9sZF9lbmNvZGluZyA9IHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5DbGVhbkltcG9ydCgnc3lzJyk6CisgICAgICAgICAgICBpbXBvcnQgc3lzIGFzIHRlbXBfc3lzCisgICAgICAgICAgICB0ZW1wX3N5cy5zZXRkZWZhdWx0ZW5jb2RpbmcoImlzby04ODU5LTEiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIChzLCBkKSwgbSA9IHhtbHJwY2xpYi5sb2Fkcyh1dGY4KQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0ZW1wX3N5cy5zZXRkZWZhdWx0ZW5jb2Rpbmcob2xkX2VuY29kaW5nKQorCisgICAgICAgIGl0ZW1zID0gZC5pdGVtcygpCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgdSJhYmMgXHg5NSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocywgdW5pY29kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIFsodSJkZWYgXHg5NiIsIHUiZ2hpIFx4OTciKV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaXRlbXNbMF1bMF0sIHVuaWNvZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaXRlbXNbMF1bMV0sIHVuaWNvZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICJhYmMgXHhjMlx4OTUiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtcywgWygiZGVmIFx4YzJceDk2IiwgImdoaSBceGMyXHg5NyIpXSkKKworCitjbGFzcyBIZWxwZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZXNjYXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhtbHJwY2xpYi5lc2NhcGUoImEmYiIpLCAiYSZhbXA7YiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeG1scnBjbGliLmVzY2FwZSgiYTxiIiksICJhJmx0O2IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhtbHJwY2xpYi5lc2NhcGUoImE+YiIpLCAiYSZndDtiIikKKworY2xhc3MgRmF1bHRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgZiA9IHhtbHJwY2xpYi5GYXVsdCg0MiwgJ1Rlc3QgRmF1bHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZiksICI8RmF1bHQgNDI6ICdUZXN0IEZhdWx0Jz4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZiksIHN0cihmKSkKKworICAgIGRlZiB0ZXN0X2R1bXBfZmF1bHQoc2VsZik6CisgICAgICAgIGYgPSB4bWxycGNsaWIuRmF1bHQoNDIsICdUZXN0IEZhdWx0JykKKyAgICAgICAgcyA9IHhtbHJwY2xpYi5kdW1wcygoZiwpKQorICAgICAgICAobmV3ZiwpLCBtID0geG1scnBjbGliLmxvYWRzKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3ZiwgeydmYXVsdENvZGUnOiA0MiwgJ2ZhdWx0U3RyaW5nJzogJ1Rlc3QgRmF1bHQnfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLCBOb25lKQorCisgICAgICAgIHMgPSB4bWxycGNsaWIuTWFyc2hhbGxlcigpLmR1bXBzKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbHJwY2xpYi5GYXVsdCwgeG1scnBjbGliLmxvYWRzLCBzKQorCisKK2NsYXNzIERhdGVUaW1lVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2RlZmF1bHQoc2VsZik6CisgICAgICAgIHQgPSB4bWxycGNsaWIuRGF0ZVRpbWUoKQorCisgICAgZGVmIHRlc3RfdGltZShzZWxmKToKKyAgICAgICAgZCA9IDExODEzOTk5MzAuMDM2OTUyCisgICAgICAgIHQgPSB4bWxycGNsaWIuRGF0ZVRpbWUoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodCksIHRpbWUuc3RyZnRpbWUoIiVZJW0lZFQlSDolTTolUyIsIHRpbWUubG9jYWx0aW1lKGQpKSkKKworICAgIGRlZiB0ZXN0X3RpbWVfdHVwbGUoc2VsZik6CisgICAgICAgIGQgPSAoMjAwNyw2LDksMTAsMzgsNTAsNSwxNjAsMCkKKyAgICAgICAgdCA9IHhtbHJwY2xpYi5EYXRlVGltZShkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0KSwgJzIwMDcwNjA5VDEwOjM4OjUwJykKKworICAgIGRlZiB0ZXN0X3RpbWVfc3RydWN0KHNlbGYpOgorICAgICAgICBkID0gdGltZS5sb2NhbHRpbWUoMTE4MTM5OTkzMC4wMzY5NTIpCisgICAgICAgIHQgPSB4bWxycGNsaWIuRGF0ZVRpbWUoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodCksICB0aW1lLnN0cmZ0aW1lKCIlWSVtJWRUJUg6JU06JVMiLCBkKSkKKworICAgIGRlZiB0ZXN0X2RhdGV0aW1lX2RhdGV0aW1lKHNlbGYpOgorICAgICAgICBkID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwNywxLDIsMyw0LDUpCisgICAgICAgIHQgPSB4bWxycGNsaWIuRGF0ZVRpbWUoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodCksICcyMDA3MDEwMlQwMzowNDowNScpCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBkID0gZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwNywxLDIsMyw0LDUpCisgICAgICAgIHQgPSB4bWxycGNsaWIuRGF0ZVRpbWUoZCkKKyAgICAgICAgdmFsID0iPERhdGVUaW1lICcyMDA3MDEwMlQwMzowNDowNScgYXQgJXg+IiAlIGlkKHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih0KSwgdmFsKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBkID0gJyAyMDA3MDkwOFQwNzoxMToxMyAgJworICAgICAgICB0MSA9IHhtbHJwY2xpYi5EYXRlVGltZSgpCisgICAgICAgIHQxLmRlY29kZShkKQorICAgICAgICB0cmVmID0geG1scnBjbGliLkRhdGVUaW1lKGRhdGV0aW1lLmRhdGV0aW1lKDIwMDcsOSw4LDcsMTEsMTMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLCB0cmVmKQorCisgICAgICAgIHQyID0geG1scnBjbGliLl9kYXRldGltZShkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLCB0cmVmKQorCitjbGFzcyBCaW5hcnlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKKyAgICAgICAgdCA9IHhtbHJwY2xpYi5CaW5hcnkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0KSwgJycpCisKKyAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CisgICAgICAgIGQgPSAnXHgwMVx4MDJceDAzYWJjMTIzXHhmZlx4ZmUnCisgICAgICAgIHQgPSB4bWxycGNsaWIuQmluYXJ5KGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCBkKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBkID0gJ1x4MDFceDAyXHgwM2FiYzEyM1x4ZmZceGZlJworICAgICAgICBkZSA9IGJhc2U2NC5lbmNvZGVzdHJpbmcoZCkKKyAgICAgICAgdDEgPSB4bWxycGNsaWIuQmluYXJ5KCkKKyAgICAgICAgdDEuZGVjb2RlKGRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0MSksIGQpCisKKyAgICAgICAgdDIgPSB4bWxycGNsaWIuX2JpbmFyeShkZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodDIpLCBkKQorCisKK0FERFIgPSBQT1JUID0gVVJMID0gTm9uZQorCisjIFRoZSBldnQgaXMgc2V0IHR3aWNlLiAgRmlyc3Qgd2hlbiB0aGUgc2VydmVyIGlzIHJlYWR5IHRvIHNlcnZlLgorIyBTZWNvbmQgd2hlbiB0aGUgc2VydmVyIGhhcyBiZWVuIHNodXRkb3duLiAgVGhlIHVzZXIgbXVzdCBjbGVhcgorIyB0aGUgZXZlbnQgYWZ0ZXIgaXQgaGFzIGJlZW4gc2V0IHRoZSBmaXJzdCB0aW1lIHRvIGNhdGNoIHRoZSBzZWNvbmQgc2V0LgorZGVmIGh0dHBfc2VydmVyKGV2dCwgbnVtcmVxdWVzdHMsIHJlcXVlc3RIYW5kbGVyPU5vbmUpOgorICAgIGNsYXNzIFRlc3RJbnN0YW5jZUNsYXNzOgorICAgICAgICBkZWYgZGl2KHNlbGYsIHgsIHkpOgorICAgICAgICAgICAgcmV0dXJuIHggLy8geQorCisgICAgICAgIGRlZiBfbWV0aG9kSGVscChzZWxmLCBuYW1lKToKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gJ2Rpdic6CisgICAgICAgICAgICAgICAgcmV0dXJuICdUaGlzIGlzIHRoZSBkaXYgZnVuY3Rpb24nCisKKyAgICBkZWYgbXlfZnVuY3Rpb24oKToKKyAgICAgICAgJycnVGhpcyBpcyBteSBmdW5jdGlvbicnJworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgY2xhc3MgTXlYTUxSUENTZXJ2ZXIoU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1NlcnZlcik6CisgICAgICAgIGRlZiBnZXRfcmVxdWVzdChzZWxmKToKKyAgICAgICAgICAgICMgRW5zdXJlIHRoZSBzb2NrZXQgaXMgYWx3YXlzIG5vbi1ibG9ja2luZy4gIE9uIExpbnV4LCBzb2NrZXQKKyAgICAgICAgICAgICMgYXR0cmlidXRlcyBhcmUgbm90IGluaGVyaXRlZCBsaWtlIHRoZXkgYXJlIG9uICpCU0QgYW5kIFdpbmRvd3MuCisgICAgICAgICAgICBzLCBwb3J0ID0gc2VsZi5zb2NrZXQuYWNjZXB0KCkKKyAgICAgICAgICAgIHMuc2V0YmxvY2tpbmcoVHJ1ZSkKKyAgICAgICAgICAgIHJldHVybiBzLCBwb3J0CisKKyAgICBpZiBub3QgcmVxdWVzdEhhbmRsZXI6CisgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyCisgICAgc2VydiA9IE15WE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgMCksIHJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dSZXF1ZXN0cz1GYWxzZSwgYmluZF9hbmRfYWN0aXZhdGU9RmFsc2UpCisgICAgdHJ5OgorICAgICAgICBzZXJ2LnNvY2tldC5zZXR0aW1lb3V0KDMpCisgICAgICAgIHNlcnYuc2VydmVyX2JpbmQoKQorICAgICAgICBnbG9iYWwgQUREUiwgUE9SVCwgVVJMCisgICAgICAgIEFERFIsIFBPUlQgPSBzZXJ2LnNvY2tldC5nZXRzb2NrbmFtZSgpCisgICAgICAgICNjb25uZWN0IHRvIElQIGFkZHJlc3MgZGlyZWN0bHkuICBUaGlzIGF2b2lkcyBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKQorICAgICAgICAjdHJ5aW5nIHRvIGNvbm5lY3QgdG8gImxvY2FsaG9zdCIgdXNpbmcgYWxsIGFkZHJlc3MgZmFtaWxpZXMsIHdoaWNoCisgICAgICAgICNjYXVzZXMgc2xvd2Rvd24gZS5nLiBvbiB2aXN0YSB3aGljaCBzdXBwb3J0cyBBRl9JTkVUNi4gIFRoZSBzZXJ2ZXIgbGlzdGVucworICAgICAgICAjb24gQUZfSU5FVCBvbmx5LgorICAgICAgICBVUkwgPSAiaHR0cDovLyVzOiVkIiUoQUREUiwgUE9SVCkKKyAgICAgICAgc2Vydi5zZXJ2ZXJfYWN0aXZhdGUoKQorICAgICAgICBzZXJ2LnJlZ2lzdGVyX2ludHJvc3BlY3Rpb25fZnVuY3Rpb25zKCkKKyAgICAgICAgc2Vydi5yZWdpc3Rlcl9tdWx0aWNhbGxfZnVuY3Rpb25zKCkKKyAgICAgICAgc2Vydi5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCisgICAgICAgIHNlcnYucmVnaXN0ZXJfZnVuY3Rpb24obGFtYmRhIHgseTogeCt5LCAnYWRkJykKKyAgICAgICAgc2Vydi5yZWdpc3Rlcl9mdW5jdGlvbihteV9mdW5jdGlvbikKKyAgICAgICAgc2Vydi5yZWdpc3Rlcl9pbnN0YW5jZShUZXN0SW5zdGFuY2VDbGFzcygpKQorICAgICAgICBldnQuc2V0KCkKKworICAgICAgICAjIGhhbmRsZSB1cCB0byAnbnVtcmVxdWVzdHMnIHJlcXVlc3RzCisgICAgICAgIHdoaWxlIG51bXJlcXVlc3RzID4gMDoKKyAgICAgICAgICAgIHNlcnYuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICAgICAgbnVtcmVxdWVzdHMgLT0gMQorCisgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICBwYXNzCisgICAgZmluYWxseToKKyAgICAgICAgc2Vydi5zb2NrZXQuY2xvc2UoKQorICAgICAgICBQT1JUID0gTm9uZQorICAgICAgICBldnQuc2V0KCkKKworZGVmIGh0dHBfbXVsdGlfc2VydmVyKGV2dCwgbnVtcmVxdWVzdHMsIHJlcXVlc3RIYW5kbGVyPU5vbmUpOgorICAgIGNsYXNzIFRlc3RJbnN0YW5jZUNsYXNzOgorICAgICAgICBkZWYgZGl2KHNlbGYsIHgsIHkpOgorICAgICAgICAgICAgcmV0dXJuIHggLy8geQorCisgICAgICAgIGRlZiBfbWV0aG9kSGVscChzZWxmLCBuYW1lKToKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gJ2Rpdic6CisgICAgICAgICAgICAgICAgcmV0dXJuICdUaGlzIGlzIHRoZSBkaXYgZnVuY3Rpb24nCisKKyAgICBkZWYgbXlfZnVuY3Rpb24oKToKKyAgICAgICAgJycnVGhpcyBpcyBteSBmdW5jdGlvbicnJworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgY2xhc3MgTXlYTUxSUENTZXJ2ZXIoU2ltcGxlWE1MUlBDU2VydmVyLk11bHRpUGF0aFhNTFJQQ1NlcnZlcik6CisgICAgICAgIGRlZiBnZXRfcmVxdWVzdChzZWxmKToKKyAgICAgICAgICAgICMgRW5zdXJlIHRoZSBzb2NrZXQgaXMgYWx3YXlzIG5vbi1ibG9ja2luZy4gIE9uIExpbnV4LCBzb2NrZXQKKyAgICAgICAgICAgICMgYXR0cmlidXRlcyBhcmUgbm90IGluaGVyaXRlZCBsaWtlIHRoZXkgYXJlIG9uICpCU0QgYW5kIFdpbmRvd3MuCisgICAgICAgICAgICBzLCBwb3J0ID0gc2VsZi5zb2NrZXQuYWNjZXB0KCkKKyAgICAgICAgICAgIHMuc2V0YmxvY2tpbmcoVHJ1ZSkKKyAgICAgICAgICAgIHJldHVybiBzLCBwb3J0CisKKyAgICBpZiBub3QgcmVxdWVzdEhhbmRsZXI6CisgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyCisgICAgY2xhc3MgTXlSZXF1ZXN0SGFuZGxlcihyZXF1ZXN0SGFuZGxlcik6CisgICAgICAgIHJwY19wYXRocyA9IFtdCisKKyAgICBzZXJ2ID0gTXlYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCAwKSwgTXlSZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nUmVxdWVzdHM9RmFsc2UsIGJpbmRfYW5kX2FjdGl2YXRlPUZhbHNlKQorICAgIHNlcnYuc29ja2V0LnNldHRpbWVvdXQoMykKKyAgICBzZXJ2LnNlcnZlcl9iaW5kKCkKKyAgICB0cnk6CisgICAgICAgIGdsb2JhbCBBRERSLCBQT1JULCBVUkwKKyAgICAgICAgQUREUiwgUE9SVCA9IHNlcnYuc29ja2V0LmdldHNvY2tuYW1lKCkKKyAgICAgICAgI2Nvbm5lY3QgdG8gSVAgYWRkcmVzcyBkaXJlY3RseS4gIFRoaXMgYXZvaWRzIHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigpCisgICAgICAgICN0cnlpbmcgdG8gY29ubmVjdCB0byAibG9jYWxob3N0IiB1c2luZyBhbGwgYWRkcmVzcyBmYW1pbGllcywgd2hpY2gKKyAgICAgICAgI2NhdXNlcyBzbG93ZG93biBlLmcuIG9uIHZpc3RhIHdoaWNoIHN1cHBvcnRzIEFGX0lORVQ2LiAgVGhlIHNlcnZlciBsaXN0ZW5zCisgICAgICAgICNvbiBBRl9JTkVUIG9ubHkuCisgICAgICAgIFVSTCA9ICJodHRwOi8vJXM6JWQiJShBRERSLCBQT1JUKQorICAgICAgICBzZXJ2LnNlcnZlcl9hY3RpdmF0ZSgpCisgICAgICAgIHBhdGhzID0gWyIvZm9vIiwgIi9mb28vYmFyIl0KKyAgICAgICAgZm9yIHBhdGggaW4gcGF0aHM6CisgICAgICAgICAgICBkID0gc2Vydi5hZGRfZGlzcGF0Y2hlcihwYXRoLCBTaW1wbGVYTUxSUENTZXJ2ZXIuU2ltcGxlWE1MUlBDRGlzcGF0Y2hlcigpKQorICAgICAgICAgICAgZC5yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2Z1bmN0aW9ucygpCisgICAgICAgICAgICBkLnJlZ2lzdGVyX211bHRpY2FsbF9mdW5jdGlvbnMoKQorICAgICAgICBzZXJ2LmdldF9kaXNwYXRjaGVyKHBhdGhzWzBdKS5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCisgICAgICAgIHNlcnYuZ2V0X2Rpc3BhdGNoZXIocGF0aHNbMV0pLnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCisgICAgICAgIGV2dC5zZXQoKQorCisgICAgICAgICMgaGFuZGxlIHVwIHRvICdudW1yZXF1ZXN0cycgcmVxdWVzdHMKKyAgICAgICAgd2hpbGUgbnVtcmVxdWVzdHMgPiAwOgorICAgICAgICAgICAgc2Vydi5oYW5kbGVfcmVxdWVzdCgpCisgICAgICAgICAgICBudW1yZXF1ZXN0cyAtPSAxCisKKyAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQ6CisgICAgICAgIHBhc3MKKyAgICBmaW5hbGx5OgorICAgICAgICBzZXJ2LnNvY2tldC5jbG9zZSgpCisgICAgICAgIFBPUlQgPSBOb25lCisgICAgICAgIGV2dC5zZXQoKQorCisjIFRoaXMgZnVuY3Rpb24gcHJldmVudHMgZXJyb3JzIGxpa2U6CisjICAgIDxQcm90b2NvbEVycm9yIGZvciBsb2NhbGhvc3Q6NTc1MjcvUlBDMjogNTAwIEludGVybmFsIFNlcnZlciBFcnJvcj4KK2RlZiBpc191bmF2YWlsYWJsZV9leGNlcHRpb24oZSk6CisgICAgJycnUmV0dXJucyBUcnVlIGlmIHRoZSBnaXZlbiBQcm90b2NvbEVycm9yIGlzIHRoZSBwcm9kdWN0IG9mIGEgc2VydmVyLXNpZGUKKyAgICAgICBleGNlcHRpb24gY2F1c2VkIGJ5IHRoZSAndGVtcG9yYXJpbHkgdW5hdmFpbGFibGUnIHJlc3BvbnNlIHNvbWV0aW1lcworICAgICAgIGdpdmVuIGJ5IG9wZXJhdGlvbnMgb24gbm9uLWJsb2NraW5nIHNvY2tldHMuJycnCisKKyAgICAjIHNvbWV0aW1lcyB3ZSBnZXQgYSAtMSBlcnJvciBjb2RlIGFuZC9vciBlbXB0eSBoZWFkZXJzCisgICAgdHJ5OgorICAgICAgICBpZiBlLmVycmNvZGUgPT0gLTEgb3IgZS5oZWFkZXJzIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBleGNfbWVzcyA9IGUuaGVhZGVycy5nZXQoJ1gtZXhjZXB0aW9uJykKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICMgSWdub3JlIHNvY2tldC5lcnJvcnMgaGVyZS4KKyAgICAgICAgZXhjX21lc3MgPSBzdHIoZSkKKworICAgIGlmIGV4Y19tZXNzIGFuZCAndGVtcG9yYXJpbHkgdW5hdmFpbGFibGUnIGluIGV4Y19tZXNzLmxvd2VyKCk6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICByZXR1cm4gRmFsc2UKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIEJhc2VTZXJ2ZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgcmVxdWVzdEhhbmRsZXIgPSBOb25lCisgICAgcmVxdWVzdF9jb3VudCA9IDEKKyAgICB0aHJlYWRGdW5jID0gc3RhdGljbWV0aG9kKGh0dHBfc2VydmVyKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIGVuYWJsZSB0cmFjZWJhY2sgcmVwb3J0aW5nCisgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENTZXJ2ZXIuX3NlbmRfdHJhY2ViYWNrX2hlYWRlciA9IFRydWUKKworICAgICAgICBzZWxmLmV2dCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgICMgc3RhcnQgc2VydmVyIHRocmVhZCB0byBoYW5kbGUgcmVxdWVzdHMKKyAgICAgICAgc2Vydl9hcmdzID0gKHNlbGYuZXZ0LCBzZWxmLnJlcXVlc3RfY291bnQsIHNlbGYucmVxdWVzdEhhbmRsZXIpCisgICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYudGhyZWFkRnVuYywgYXJncz1zZXJ2X2FyZ3MpLnN0YXJ0KCkKKworICAgICAgICAjIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gYmUgcmVhZHkKKyAgICAgICAgc2VsZi5ldnQud2FpdCgxMCkKKyAgICAgICAgc2VsZi5ldnQuY2xlYXIoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjIHdhaXQgb24gdGhlIHNlcnZlciB0aHJlYWQgdG8gdGVybWluYXRlCisgICAgICAgIHNlbGYuZXZ0LndhaXQoMTApCisKKyAgICAgICAgIyBkaXNhYmxlIHRyYWNlYmFjayByZXBvcnRpbmcKKyAgICAgICAgU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1NlcnZlci5fc2VuZF90cmFjZWJhY2tfaGVhZGVyID0gRmFsc2UKKworIyBOT1RFOiBUaGUgdGVzdHMgaW4gU2ltcGxlU2VydmVyVGVzdENhc2Ugd2lsbCBpZ25vcmUgZmFpbHVyZXMgY2F1c2VkIGJ5CisjICJ0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSIgZXhjZXB0aW9ucyByYWlzZWQgaW4gU2ltcGxlWE1MUlBDU2VydmVyLiAgVGhpcworIyBjb25kaXRpb24gb2NjdXJzIGluZnJlcXVlbnRseSBvbiBzb21lIHBsYXRmb3JtcywgZnJlcXVlbnRseSBvbiBvdGhlcnMsIGFuZAorIyBpcyBhcHBhcmVudGx5IGNhdXNlZCBieSB1c2luZyBTaW1wbGVYTUxSUENTZXJ2ZXIgd2l0aCBhIG5vbi1ibG9ja2luZyBzb2NrZXQKKyMgSWYgdGhlIHNlcnZlciBjbGFzcyBpcyB1cGRhdGVkIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byBoYW5kbGUgdGhpcworIyBzaXR1YXRpb24gbW9yZSBncmFjZWZ1bGx5LCB0aGVzZSB0ZXN0cyBzaG91bGQgYmUgbW9kaWZpZWQgYXBwcm9wcmlhdGVseS4KKworY2xhc3MgU2ltcGxlU2VydmVyVGVzdENhc2UoQmFzZVNlcnZlclRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9zaW1wbGUxKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKyAgICAgICAgZXhjZXB0ICh4bWxycGNsaWIuUHJvdG9jb2xFcnJvciwgc29ja2V0LmVycm9yKSwgZToKKyAgICAgICAgICAgICMgaWdub3JlIGZhaWx1cmVzIGR1ZSB0byBub24tYmxvY2tpbmcgc29ja2V0ICd1bmF2YWlsYWJsZScgZXJyb3JzCisgICAgICAgICAgICBpZiBub3QgaXNfdW5hdmFpbGFibGVfZXhjZXB0aW9uKGUpOgorICAgICAgICAgICAgICAgICMgcHJvdG9jb2wgZXJyb3I7IHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0ZXN0IG91dHB1dAorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXNcbiVzIiAlIChlLCBnZXRhdHRyKGUsICJoZWFkZXJzIiwgIiIpKSkKKworICAgIGRlZiB0ZXN0X25vbmFzY2lpKHNlbGYpOgorICAgICAgICBzdGFydF9zdHJpbmcgPSAnUFxOe0xBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQ0lSQ1VNRkxFWH10JworICAgICAgICBlbmRfc3RyaW5nID0gJ2hcTntMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk59bicKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5hZGQoc3RhcnRfc3RyaW5nLCBlbmRfc3RyaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfc3RyaW5nICsgZW5kX3N0cmluZykKKyAgICAgICAgZXhjZXB0ICh4bWxycGNsaWIuUHJvdG9jb2xFcnJvciwgc29ja2V0LmVycm9yKSBhcyBlOgorICAgICAgICAgICAgIyBpZ25vcmUgZmFpbHVyZXMgZHVlIHRvIG5vbi1ibG9ja2luZyBzb2NrZXQgdW5hdmFpbGFibGUgZXJyb3JzLgorICAgICAgICAgICAgaWYgbm90IGlzX3VuYXZhaWxhYmxlX2V4Y2VwdGlvbihlKToKKyAgICAgICAgICAgICAgICAjIHByb3RvY29sIGVycm9yOyBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGVzdCBvdXRwdXQKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzXG4lcyIgJSAoZSwgZ2V0YXR0cihlLCAiaGVhZGVycyIsICIiKSkpCisKKyAgICBkZWYgdGVzdF91bmljb2RlX2hvc3Qoc2VsZik6CisgICAgICAgIHNlcnZlciA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eSh1Imh0dHA6Ly8lczolZC9SUEMyIiUoQUREUiwgUE9SVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLmFkZCgiYSIsIHUiXHhlOSIpLCB1ImFceGU5IikKKworICAgICMgW2NoXSBUaGUgdGVzdCA0MDQgaXMgY2F1c2luZyBsb3RzIG9mIGZhbHNlIGFsYXJtcy4KKyAgICBkZWYgWFhYdGVzdF80MDQoc2VsZik6CisgICAgICAgICMgc2VuZCBQT1NUIHdpdGggaHR0cGxpYiwgaXQgc2hvdWxkIHJldHVybiA0MDQgaGVhZGVyIGFuZAorICAgICAgICAjICdOb3QgRm91bmQnIG1lc3NhZ2UuCisgICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKEFERFIsIFBPUlQpCisgICAgICAgIGNvbm4ucmVxdWVzdCgnUE9TVCcsICcvdGhpcy1pcy1ub3QtdmFsaWQnKQorICAgICAgICByZXNwb25zZSA9IGNvbm4uZ2V0cmVzcG9uc2UoKQorICAgICAgICBjb25uLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnN0YXR1cywgNDA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnJlYXNvbiwgJ05vdCBGb3VuZCcpCisKKyAgICBkZWYgdGVzdF9pbnRyb3NwZWN0aW9uMShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShVUkwpCisgICAgICAgICAgICBtZXRoID0gcC5zeXN0ZW0ubGlzdE1ldGhvZHMoKQorICAgICAgICAgICAgZXhwZWN0ZWRfbWV0aG9kcyA9IHNldChbJ3BvdycsICdkaXYnLCAnbXlfZnVuY3Rpb24nLCAnYWRkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXN0ZW0ubGlzdE1ldGhvZHMnLCAnc3lzdGVtLm1ldGhvZEhlbHAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5c3RlbS5tZXRob2RTaWduYXR1cmUnLCAnc3lzdGVtLm11bHRpY2FsbCddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobWV0aCksIGV4cGVjdGVkX21ldGhvZHMpCisgICAgICAgIGV4Y2VwdCAoeG1scnBjbGliLlByb3RvY29sRXJyb3IsIHNvY2tldC5lcnJvciksIGU6CisgICAgICAgICAgICAjIGlnbm9yZSBmYWlsdXJlcyBkdWUgdG8gbm9uLWJsb2NraW5nIHNvY2tldCAndW5hdmFpbGFibGUnIGVycm9ycworICAgICAgICAgICAgaWYgbm90IGlzX3VuYXZhaWxhYmxlX2V4Y2VwdGlvbihlKToKKyAgICAgICAgICAgICAgICAjIHByb3RvY29sIGVycm9yOyBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGVzdCBvdXRwdXQKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzXG4lcyIgJSAoZSwgZ2V0YXR0cihlLCAiaGVhZGVycyIsICIiKSkpCisKKyAgICBkZWYgdGVzdF9pbnRyb3NwZWN0aW9uMihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyB0ZXN0IF9tZXRob2RIZWxwKCkKKyAgICAgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMKQorICAgICAgICAgICAgZGl2aGVscCA9IHAuc3lzdGVtLm1ldGhvZEhlbHAoJ2RpdicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpdmhlbHAsICdUaGlzIGlzIHRoZSBkaXYgZnVuY3Rpb24nKQorICAgICAgICBleGNlcHQgKHhtbHJwY2xpYi5Qcm90b2NvbEVycm9yLCBzb2NrZXQuZXJyb3IpLCBlOgorICAgICAgICAgICAgIyBpZ25vcmUgZmFpbHVyZXMgZHVlIHRvIG5vbi1ibG9ja2luZyBzb2NrZXQgJ3VuYXZhaWxhYmxlJyBlcnJvcnMKKyAgICAgICAgICAgIGlmIG5vdCBpc191bmF2YWlsYWJsZV9leGNlcHRpb24oZSk6CisgICAgICAgICAgICAgICAgIyBwcm90b2NvbCBlcnJvcjsgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRlc3Qgb3V0cHV0CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlc1xuJXMiICUgKGUsIGdldGF0dHIoZSwgImhlYWRlcnMiLCAiIikpKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RfaW50cm9zcGVjdGlvbjMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgdGVzdCBuYXRpdmUgZG9jCisgICAgICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCkKKyAgICAgICAgICAgIG15ZnVuY3Rpb24gPSBwLnN5c3RlbS5tZXRob2RIZWxwKCdteV9mdW5jdGlvbicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG15ZnVuY3Rpb24sICdUaGlzIGlzIG15IGZ1bmN0aW9uJykKKyAgICAgICAgZXhjZXB0ICh4bWxycGNsaWIuUHJvdG9jb2xFcnJvciwgc29ja2V0LmVycm9yKSwgZToKKyAgICAgICAgICAgICMgaWdub3JlIGZhaWx1cmVzIGR1ZSB0byBub24tYmxvY2tpbmcgc29ja2V0ICd1bmF2YWlsYWJsZScgZXJyb3JzCisgICAgICAgICAgICBpZiBub3QgaXNfdW5hdmFpbGFibGVfZXhjZXB0aW9uKGUpOgorICAgICAgICAgICAgICAgICMgcHJvdG9jb2wgZXJyb3I7IHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0ZXN0IG91dHB1dAorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXNcbiVzIiAlIChlLCBnZXRhdHRyKGUsICJoZWFkZXJzIiwgIiIpKSkKKworICAgIGRlZiB0ZXN0X2ludHJvc3BlY3Rpb240KHNlbGYpOgorICAgICAgICAjIHRoZSBTaW1wbGVYTUxSUENTZXJ2ZXIgZG9lc24ndCBzdXBwb3J0IHNpZ25hdHVyZXMsIGJ1dAorICAgICAgICAjIGF0IGxlYXN0IGNoZWNrIHRoYXQgd2UgY2FuIHRyeSBtYWtpbmcgdGhlIGNhbGwKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShVUkwpCisgICAgICAgICAgICBkaXZzaWcgPSBwLnN5c3RlbS5tZXRob2RTaWduYXR1cmUoJ2RpdicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpdnNpZywgJ3NpZ25hdHVyZXMgbm90IHN1cHBvcnRlZCcpCisgICAgICAgIGV4Y2VwdCAoeG1scnBjbGliLlByb3RvY29sRXJyb3IsIHNvY2tldC5lcnJvciksIGU6CisgICAgICAgICAgICAjIGlnbm9yZSBmYWlsdXJlcyBkdWUgdG8gbm9uLWJsb2NraW5nIHNvY2tldCAndW5hdmFpbGFibGUnIGVycm9ycworICAgICAgICAgICAgaWYgbm90IGlzX3VuYXZhaWxhYmxlX2V4Y2VwdGlvbihlKToKKyAgICAgICAgICAgICAgICAjIHByb3RvY29sIGVycm9yOyBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGVzdCBvdXRwdXQKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzXG4lcyIgJSAoZSwgZ2V0YXR0cihlLCAiaGVhZGVycyIsICIiKSkpCisKKyAgICBkZWYgdGVzdF9tdWx0aWNhbGwoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMKQorICAgICAgICAgICAgbXVsdGljYWxsID0geG1scnBjbGliLk11bHRpQ2FsbChwKQorICAgICAgICAgICAgbXVsdGljYWxsLmFkZCgyLDMpCisgICAgICAgICAgICBtdWx0aWNhbGwucG93KDYsOCkKKyAgICAgICAgICAgIG11bHRpY2FsbC5kaXYoMTI3LDQyKQorICAgICAgICAgICAgYWRkX3Jlc3VsdCwgcG93X3Jlc3VsdCwgZGl2X3Jlc3VsdCA9IG11bHRpY2FsbCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkZF9yZXN1bHQsIDIrMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93X3Jlc3VsdCwgNioqOCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2X3Jlc3VsdCwgMTI3Ly80MikKKyAgICAgICAgZXhjZXB0ICh4bWxycGNsaWIuUHJvdG9jb2xFcnJvciwgc29ja2V0LmVycm9yKSwgZToKKyAgICAgICAgICAgICMgaWdub3JlIGZhaWx1cmVzIGR1ZSB0byBub24tYmxvY2tpbmcgc29ja2V0ICd1bmF2YWlsYWJsZScgZXJyb3JzCisgICAgICAgICAgICBpZiBub3QgaXNfdW5hdmFpbGFibGVfZXhjZXB0aW9uKGUpOgorICAgICAgICAgICAgICAgICMgcHJvdG9jb2wgZXJyb3I7IHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0ZXN0IG91dHB1dAorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXNcbiVzIiAlIChlLCBnZXRhdHRyKGUsICJoZWFkZXJzIiwgIiIpKSkKKworICAgIGRlZiB0ZXN0X25vbl9leGlzdGluZ19tdWx0aWNhbGwoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMKQorICAgICAgICAgICAgbXVsdGljYWxsID0geG1scnBjbGliLk11bHRpQ2FsbChwKQorICAgICAgICAgICAgbXVsdGljYWxsLnRoaXNfaXNfbm90X2V4aXN0cygpCisgICAgICAgICAgICByZXN1bHQgPSBtdWx0aWNhbGwoKQorCisgICAgICAgICAgICAjIHJlc3VsdC5yZXN1bHRzIGNvbnRhaW5zOworICAgICAgICAgICAgIyBbeydmYXVsdENvZGUnOiAxLCAnZmF1bHRTdHJpbmcnOiAnPHR5cGUgXCdleGNlcHRpb25zLkV4Y2VwdGlvblwnPjonCisgICAgICAgICAgICAjICAgJ21ldGhvZCAidGhpc19pc19ub3RfZXhpc3RzIiBpcyBub3Qgc3VwcG9ydGVkJz59XQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5yZXN1bHRzWzBdWydmYXVsdENvZGUnXSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnJlc3VsdHNbMF1bJ2ZhdWx0U3RyaW5nJ10sCisgICAgICAgICAgICAgICAgJzx0eXBlIFwnZXhjZXB0aW9ucy5FeGNlcHRpb25cJz46bWV0aG9kICJ0aGlzX2lzX25vdF9leGlzdHMiICcKKyAgICAgICAgICAgICAgICAnaXMgbm90IHN1cHBvcnRlZCcpCisgICAgICAgIGV4Y2VwdCAoeG1scnBjbGliLlByb3RvY29sRXJyb3IsIHNvY2tldC5lcnJvciksIGU6CisgICAgICAgICAgICAjIGlnbm9yZSBmYWlsdXJlcyBkdWUgdG8gbm9uLWJsb2NraW5nIHNvY2tldCAndW5hdmFpbGFibGUnIGVycm9ycworICAgICAgICAgICAgaWYgbm90IGlzX3VuYXZhaWxhYmxlX2V4Y2VwdGlvbihlKToKKyAgICAgICAgICAgICAgICAjIHByb3RvY29sIGVycm9yOyBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGVzdCBvdXRwdXQKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzXG4lcyIgJSAoZSwgZ2V0YXR0cihlLCAiaGVhZGVycyIsICIiKSkpCisKKyAgICBkZWYgdGVzdF9kb3R0ZWRfYXR0cmlidXRlKHNlbGYpOgorICAgICAgICAjIFJhaXNlcyBhbiBBdHRyaWJ1dGVFcnJvciBiZWNhdXNlIHByaXZhdGUgbWV0aG9kcyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIucmVzb2x2ZV9kb3R0ZWRfYXR0cmlidXRlLCBzdHIsICdfX2FkZCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFNpbXBsZVhNTFJQQ1NlcnZlci5yZXNvbHZlX2RvdHRlZF9hdHRyaWJ1dGUoc3RyLCAndGl0bGUnKSkKKyAgICAgICAgIyBHZXQgdGhlIHRlc3QgdG8gcnVuIGZhc3RlciBieSBzZW5kaW5nIGEgcmVxdWVzdCB3aXRoIHRlc3Rfc2ltcGxlMS4KKyAgICAgICAgIyBUaGlzIGF2b2lkcyB3YWl0aW5nIGZvciB0aGUgc29ja2V0IHRpbWVvdXQuCisgICAgICAgIHNlbGYudGVzdF9zaW1wbGUxKCkKKworICAgIGRlZiB0ZXN0X3BhcnRpYWxfcG9zdChzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGEgcGFydGlhbCBQT1NUIGRvZXNuJ3QgbWFrZSB0aGUgc2VydmVyIGxvb3A6IGlzc3VlICMxNDAwMS4KKyAgICAgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oQUREUiwgUE9SVCkKKyAgICAgICAgY29ubi5yZXF1ZXN0KCdQT1NUJywgJy9SUEMyIEhUVFAvMS4wXHJcbkNvbnRlbnQtTGVuZ3RoOiAxMDBcclxuXHJcbmJ5ZScpCisgICAgICAgIGNvbm4uY2xvc2UoKQorCitjbGFzcyBNdWx0aVBhdGhTZXJ2ZXJUZXN0Q2FzZShCYXNlU2VydmVyVGVzdENhc2UpOgorICAgIHRocmVhZEZ1bmMgPSBzdGF0aWNtZXRob2QoaHR0cF9tdWx0aV9zZXJ2ZXIpCisgICAgcmVxdWVzdF9jb3VudCA9IDIKKyAgICBkZWYgdGVzdF9wYXRoMShzZWxmKToKKyAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShVUkwrIi9mb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG93KDYsOCksIDYqKjgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbHJwY2xpYi5GYXVsdCwgcC5hZGQsIDYsIDgpCisgICAgZGVmIHRlc3RfcGF0aDIoc2VsZik6CisgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMKyIvZm9vL2JhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5hZGQoNiw4KSwgNis4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWxycGNsaWIuRmF1bHQsIHAucG93LCA2LCA4KQorCisjQSB0ZXN0IGNhc2UgdGhhdCB2ZXJpZmllcyB0aGF0IGEgc2VydmVyIHVzaW5nIHRoZSBIVFRQLzEuMSBrZWVwLWFsaXZlIG1lY2hhbmlzbQorI2RvZXMgaW5kZWVkIHNlcnZlIHN1YnNlcXVlbnQgcmVxdWVzdHMgb24gdGhlIHNhbWUgY29ubmVjdGlvbgorY2xhc3MgQmFzZUtlZXBhbGl2ZVNlcnZlclRlc3RDYXNlKEJhc2VTZXJ2ZXJUZXN0Q2FzZSk6CisgICAgI2EgcmVxdWVzdCBoYW5kbGVyIHRoYXQgc3VwcG9ydHMga2VlcC1hbGl2ZSBhbmQgbG9ncyByZXF1ZXN0cyBpbnRvIGEKKyAgICAjY2xhc3MgdmFyaWFibGUKKyAgICBjbGFzcyBSZXF1ZXN0SGFuZGxlcihTaW1wbGVYTUxSUENTZXJ2ZXIuU2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICBwYXJlbnRDbGFzcyA9IFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlcgorICAgICAgICBwcm90b2NvbF92ZXJzaW9uID0gJ0hUVFAvMS4xJworICAgICAgICBteVJlcXVlc3RzID0gW10KKyAgICAgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgICAgIHNlbGYubXlSZXF1ZXN0cy5hcHBlbmQoW10pCisgICAgICAgICAgICBzZWxmLnJlcWlkeCA9IGxlbihzZWxmLm15UmVxdWVzdHMpLTEKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudENsYXNzLmhhbmRsZShzZWxmKQorICAgICAgICBkZWYgaGFuZGxlX29uZV9yZXF1ZXN0KHNlbGYpOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5wYXJlbnRDbGFzcy5oYW5kbGVfb25lX3JlcXVlc3Qoc2VsZikKKyAgICAgICAgICAgIHNlbGYubXlSZXF1ZXN0c1tzZWxmLnJlcWlkeF0uYXBwZW5kKHNlbGYucmF3X3JlcXVlc3RsaW5lKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgcmVxdWVzdEhhbmRsZXIgPSBSZXF1ZXN0SGFuZGxlcgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgI2NsZWFyIHJlcXVlc3QgbG9nCisgICAgICAgIHNlbGYuUmVxdWVzdEhhbmRsZXIubXlSZXF1ZXN0cyA9IFtdCisgICAgICAgIHJldHVybiBCYXNlU2VydmVyVGVzdENhc2Uuc2V0VXAoc2VsZikKKworI0EgdGVzdCBjYXNlIHRoYXQgdmVyaWZpZXMgdGhhdCBhIHNlcnZlciB1c2luZyB0aGUgSFRUUC8xLjEga2VlcC1hbGl2ZSBtZWNoYW5pc20KKyNkb2VzIGluZGVlZCBzZXJ2ZSBzdWJzZXF1ZW50IHJlcXVlc3RzIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24KK2NsYXNzIEtlZXBhbGl2ZVNlcnZlclRlc3RDYXNlMShCYXNlS2VlcGFsaXZlU2VydmVyVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShVUkwpCisgICAgICAgICNkbyB0aHJlZSByZXF1ZXN0cy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG93KDYsOCksIDYqKjgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKworICAgICAgICAjdGhleSBzaG91bGQgaGF2ZSBhbGwgYmVlbiBoYW5kbGVkIGJ5IGEgc2luZ2xlIHJlcXVlc3QgaGFuZGxlcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLlJlcXVlc3RIYW5kbGVyLm15UmVxdWVzdHMpLCAxKQorCisgICAgICAgICNjaGVjayB0aGF0IHdlIGRpZCBhdCBsZWFzdCB0d28gKHRoZSB0aGlyZCBtYXkgYmUgcGVuZGluZyBhcHBlbmQKKyAgICAgICAgI2R1ZSB0byB0aHJlYWQgc2NoZWR1bGluZykKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobGVuKHNlbGYuUmVxdWVzdEhhbmRsZXIubXlSZXF1ZXN0c1stMV0pLCAyKQorCisjdGVzdCBzcGVjaWFsIGF0dHJpYnV0ZSBhY2Nlc3Mgb24gdGhlIHNlcnZlcnByb3h5LCB0aHJvdWdoIHRoZSBfX2NhbGxfXworI2Z1bmN0aW9uLgorY2xhc3MgS2VlcGFsaXZlU2VydmVyVGVzdENhc2UyKEJhc2VLZWVwYWxpdmVTZXJ2ZXJUZXN0Q2FzZSk6CisgICAgI2FzayBmb3IgdHdvIGtlZXBhbGl2ZSByZXF1ZXN0cyB0byBiZSBoYW5kbGVkLgorICAgIHJlcXVlc3RfY291bnQ9MgorCisgICAgZGVmIHRlc3RfY2xvc2Uoc2VsZik6CisgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMKQorICAgICAgICAjZG8gc29tZSByZXF1ZXN0cyB3aXRoIGNsb3NlLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG93KDYsOCksIDYqKjgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorICAgICAgICBwKCJjbG9zZSIpKCkgI3RoaXMgc2hvdWxkIHRyaWdnZXIgYSBuZXcga2VlcC1hbGl2ZSByZXF1ZXN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG93KDYsOCksIDYqKjgpCisKKyAgICAgICAgI3RoZXkgc2hvdWxkIGhhdmUgYWxsIGJlZW4gdHdvIHJlcXVlc3QgaGFuZGxlcnMsIGVhY2ggaGF2aW5nIGxvZ2dlZCBhdCBsZWFzdAorICAgICAgICAjdHdvIGNvbXBsZXRlIHJlcXVlc3RzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuUmVxdWVzdEhhbmRsZXIubXlSZXF1ZXN0cyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGxlbihzZWxmLlJlcXVlc3RIYW5kbGVyLm15UmVxdWVzdHNbLTFdKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobGVuKHNlbGYuUmVxdWVzdEhhbmRsZXIubXlSZXF1ZXN0c1stMl0pLCAyKQorCisgICAgZGVmIHRlc3RfdHJhbnNwb3J0KHNlbGYpOgorICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCkKKyAgICAgICAgI2RvIHNvbWUgcmVxdWVzdHMgd2l0aCBjbG9zZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorICAgICAgICBwKCJ0cmFuc3BvcnQiKS5jbG9zZSgpICNzYW1lIGFzIGFib3ZlLCByZWFsbHkuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5SZXF1ZXN0SGFuZGxlci5teVJlcXVlc3RzKSwgMikKKworI0EgdGVzdCBjYXNlIHRoYXQgdmVyaWZpZXMgdGhhdCBnemlwIGVuY29kaW5nIHdvcmtzIGluIGJvdGggZGlyZWN0aW9ucworIyhmb3IgYSByZXF1ZXN0IGFuZCB0aGUgcmVzcG9uc2UpCitjbGFzcyBHemlwU2VydmVyVGVzdENhc2UoQmFzZVNlcnZlclRlc3RDYXNlKToKKyAgICAjYSByZXF1ZXN0IGhhbmRsZXIgdGhhdCBzdXBwb3J0cyBrZWVwLWFsaXZlIGFuZCBsb2dzIHJlcXVlc3RzIGludG8gYQorICAgICNjbGFzcyB2YXJpYWJsZQorICAgIGNsYXNzIFJlcXVlc3RIYW5kbGVyKFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlcik6CisgICAgICAgIHBhcmVudENsYXNzID0gU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyCisgICAgICAgIHByb3RvY29sX3ZlcnNpb24gPSAnSFRUUC8xLjEnCisKKyAgICAgICAgZGVmIGRvX1BPU1Qoc2VsZik6CisgICAgICAgICAgICAjc3RvcmUgY29udGVudCBvZiBsYXN0IHJlcXVlc3QgaW4gY2xhc3MKKyAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLmNvbnRlbnRfbGVuZ3RoID0gaW50KHNlbGYuaGVhZGVyc1siY29udGVudC1sZW5ndGgiXSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudENsYXNzLmRvX1BPU1Qoc2VsZikKKyAgICByZXF1ZXN0SGFuZGxlciA9IFJlcXVlc3RIYW5kbGVyCisKKyAgICBjbGFzcyBUcmFuc3BvcnQoeG1scnBjbGliLlRyYW5zcG9ydCk6CisgICAgICAgICNjdXN0b20gdHJhbnNwb3J0LCBzdG9yZXMgdGhlIHJlc3BvbnNlIGxlbmd0aCBmb3Igb3VyIHBlcnVzYWwKKyAgICAgICAgZmFrZV9nemlwID0gRmFsc2UKKyAgICAgICAgZGVmIHBhcnNlX3Jlc3BvbnNlKHNlbGYsIHJlc3BvbnNlKToKKyAgICAgICAgICAgIHNlbGYucmVzcG9uc2VfbGVuZ3RoPWludChyZXNwb25zZS5nZXRoZWFkZXIoImNvbnRlbnQtbGVuZ3RoIiwgMCkpCisgICAgICAgICAgICByZXR1cm4geG1scnBjbGliLlRyYW5zcG9ydC5wYXJzZV9yZXNwb25zZShzZWxmLCByZXNwb25zZSkKKworICAgICAgICBkZWYgc2VuZF9jb250ZW50KHNlbGYsIGNvbm5lY3Rpb24sIGJvZHkpOgorICAgICAgICAgICAgaWYgc2VsZi5mYWtlX2d6aXA6CisgICAgICAgICAgICAgICAgI2FkZCBhIGxvbmUgZ3ppcCBoZWFkZXIgdG8gaW5kdWNlIGRlY29kZSBlcnJvciByZW1vdGVseQorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucHV0aGVhZGVyKCJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKQorICAgICAgICAgICAgcmV0dXJuIHhtbHJwY2xpYi5UcmFuc3BvcnQuc2VuZF9jb250ZW50KHNlbGYsIGNvbm5lY3Rpb24sIGJvZHkpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIEJhc2VTZXJ2ZXJUZXN0Q2FzZS5zZXRVcChzZWxmKQorCisgICAgZGVmIHRlc3RfZ3ppcF9yZXF1ZXN0KHNlbGYpOgorICAgICAgICB0ID0gc2VsZi5UcmFuc3BvcnQoKQorICAgICAgICB0LmVuY29kZV90aHJlc2hvbGQgPSBOb25lCisgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMLCB0cmFuc3BvcnQ9dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorICAgICAgICBhID0gc2VsZi5SZXF1ZXN0SGFuZGxlci5jb250ZW50X2xlbmd0aAorICAgICAgICB0LmVuY29kZV90aHJlc2hvbGQgPSAwICN0dXJuIG9uIHJlcXVlc3QgZW5jb2RpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorICAgICAgICBiID0gc2VsZi5SZXF1ZXN0SGFuZGxlci5jb250ZW50X2xlbmd0aAorICAgICAgICBzZWxmLmFzc2VydFRydWUoYT5iKQorCisgICAgZGVmIHRlc3RfYmFkX2d6aXBfcmVxdWVzdChzZWxmKToKKyAgICAgICAgdCA9IHNlbGYuVHJhbnNwb3J0KCkKKyAgICAgICAgdC5lbmNvZGVfdGhyZXNob2xkID0gTm9uZQorICAgICAgICB0LmZha2VfZ3ppcCA9IFRydWUKKyAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShVUkwsIHRyYW5zcG9ydD10KQorICAgICAgICBjbSA9IHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKHhtbHJwY2xpYi5Qcm90b2NvbEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLmNvbXBpbGUociJcYjQwMFxiIikpCisgICAgICAgIHdpdGggY206CisgICAgICAgICAgICBwLnBvdyg2LCA4KQorCisgICAgZGVmIHRlc3RfZ3NpcF9yZXNwb25zZShzZWxmKToKKyAgICAgICAgdCA9IHNlbGYuVHJhbnNwb3J0KCkKKyAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShVUkwsIHRyYW5zcG9ydD10KQorICAgICAgICBvbGQgPSBzZWxmLnJlcXVlc3RIYW5kbGVyLmVuY29kZV90aHJlc2hvbGQKKyAgICAgICAgc2VsZi5yZXF1ZXN0SGFuZGxlci5lbmNvZGVfdGhyZXNob2xkID0gTm9uZSAjbm8gZW5jb2RpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorICAgICAgICBhID0gdC5yZXNwb25zZV9sZW5ndGgKKyAgICAgICAgc2VsZi5yZXF1ZXN0SGFuZGxlci5lbmNvZGVfdGhyZXNob2xkID0gMCAjYWx3YXlzIGVuY29kZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG93KDYsOCksIDYqKjgpCisgICAgICAgIGIgPSB0LnJlc3BvbnNlX2xlbmd0aAorICAgICAgICBzZWxmLnJlcXVlc3RIYW5kbGVyLmVuY29kZV90aHJlc2hvbGQgPSBvbGQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGE+YikKKworI1Rlc3Qgc3BlY2lhbCBhdHRyaWJ1dGVzIG9mIHRoZSBTZXJ2ZXJQcm94eSBvYmplY3QKK2NsYXNzIFNlcnZlclByb3h5VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgdW5pdHRlc3QuVGVzdENhc2Uuc2V0VXAoc2VsZikKKyAgICAgICAgaWYgdGhyZWFkaW5nOgorICAgICAgICAgICAgc2VsZi51cmwgPSBVUkwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgV2l0aG91dCB0aHJlYWRpbmcsIGh0dHBfc2VydmVyKCkgYW5kIGh0dHBfbXVsdGlfc2VydmVyKCkgd2lsbCBub3QKKyAgICAgICAgICAgICMgYmUgZXhlY3V0ZWQgYW5kIFVSTCBpcyBzdGlsbCBlcXVhbCB0byBOb25lLiAnaHR0cDovLycgaXMgYSBqdXN0CisgICAgICAgICAgICAjIGVub3VnaCB0byBjaG9vc2UgdGhlIHNjaGVtZSAoSFRUUCkKKyAgICAgICAgICAgIHNlbGYudXJsID0gJ2h0dHA6Ly8nCisKKyAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKKyAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShzZWxmLnVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwKCdjbG9zZScpKCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF90cmFuc3BvcnQoc2VsZik6CisgICAgICAgIHQgPSB4bWxycGNsaWIuVHJhbnNwb3J0KCkKKyAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShzZWxmLnVybCwgdHJhbnNwb3J0PXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCgndHJhbnNwb3J0JyksIHQpCisKKyMgVGhpcyBpcyBhIGNvbnRyaXZlZCB3YXkgdG8gbWFrZSBhIGZhaWx1cmUgb2NjdXIgb24gdGhlIHNlcnZlciBzaWRlCisjIGluIG9yZGVyIHRvIHRlc3QgdGhlIF9zZW5kX3RyYWNlYmFja19oZWFkZXIgZmxhZyBvbiB0aGUgc2VydmVyCitjbGFzcyBGYWlsaW5nTWVzc2FnZUNsYXNzKG1pbWV0b29scy5NZXNzYWdlKToKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAga2V5ID0ga2V5Lmxvd2VyKCkKKyAgICAgICAgaWYga2V5ID09ICdjb250ZW50LWxlbmd0aCc6CisgICAgICAgICAgICByZXR1cm4gJ0kgYW0gYnJva2VuJworICAgICAgICByZXR1cm4gbWltZXRvb2xzLk1lc3NhZ2UuX19nZXRpdGVtX18oc2VsZiwga2V5KQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCitjbGFzcyBGYWlsaW5nU2VydmVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICAjIHN0YXJ0IHNlcnZlciB0aHJlYWQgdG8gaGFuZGxlIHJlcXVlc3RzCisgICAgICAgIHNlcnZfYXJncyA9IChzZWxmLmV2dCwgMSkKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9aHR0cF9zZXJ2ZXIsIGFyZ3M9c2Vydl9hcmdzKS5zdGFydCgpCisKKyAgICAgICAgIyB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGJlIHJlYWR5CisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorICAgICAgICBzZWxmLmV2dC5jbGVhcigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICMgd2FpdCBvbiB0aGUgc2VydmVyIHRocmVhZCB0byB0ZXJtaW5hdGUKKyAgICAgICAgc2VsZi5ldnQud2FpdCgpCisgICAgICAgICMgcmVzZXQgZmxhZworICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIuU2ltcGxlWE1MUlBDU2VydmVyLl9zZW5kX3RyYWNlYmFja19oZWFkZXIgPSBGYWxzZQorICAgICAgICAjIHJlc2V0IG1lc3NhZ2UgY2xhc3MKKyAgICAgICAgU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyLk1lc3NhZ2VDbGFzcyA9IG1pbWV0b29scy5NZXNzYWdlCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBjaGVjayB0aGF0IGZsYWcgaXMgZmFsc2UgYnkgZGVmYXVsdAorICAgICAgICBmbGFndmFsID0gU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1NlcnZlci5fc2VuZF90cmFjZWJhY2tfaGVhZGVyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhZ3ZhbCwgRmFsc2UpCisKKyAgICAgICAgIyBlbmFibGUgdHJhY2ViYWNrIHJlcG9ydGluZworICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIuU2ltcGxlWE1MUlBDU2VydmVyLl9zZW5kX3RyYWNlYmFja19oZWFkZXIgPSBUcnVlCisKKyAgICAgICAgIyB0ZXN0IGEgY2FsbCB0aGF0IHNob3VsZG4ndCBmYWlsIGp1c3QgYXMgYSBzbW9rZSB0ZXN0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorICAgICAgICBleGNlcHQgKHhtbHJwY2xpYi5Qcm90b2NvbEVycm9yLCBzb2NrZXQuZXJyb3IpLCBlOgorICAgICAgICAgICAgIyBpZ25vcmUgZmFpbHVyZXMgZHVlIHRvIG5vbi1ibG9ja2luZyBzb2NrZXQgJ3VuYXZhaWxhYmxlJyBlcnJvcnMKKyAgICAgICAgICAgIGlmIG5vdCBpc191bmF2YWlsYWJsZV9leGNlcHRpb24oZSk6CisgICAgICAgICAgICAgICAgIyBwcm90b2NvbCBlcnJvcjsgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRlc3Qgb3V0cHV0CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlc1xuJXMiICUgKGUsIGdldGF0dHIoZSwgImhlYWRlcnMiLCAiIikpKQorCisgICAgZGVmIHRlc3RfZmFpbF9ub19pbmZvKHNlbGYpOgorICAgICAgICAjIHVzZSB0aGUgYnJva2VuIG1lc3NhZ2UgY2xhc3MKKyAgICAgICAgU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyLk1lc3NhZ2VDbGFzcyA9IEZhaWxpbmdNZXNzYWdlQ2xhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCkKKyAgICAgICAgICAgIHAucG93KDYsOCkKKyAgICAgICAgZXhjZXB0ICh4bWxycGNsaWIuUHJvdG9jb2xFcnJvciwgc29ja2V0LmVycm9yKSwgZToKKyAgICAgICAgICAgICMgaWdub3JlIGZhaWx1cmVzIGR1ZSB0byBub24tYmxvY2tpbmcgc29ja2V0ICd1bmF2YWlsYWJsZScgZXJyb3JzCisgICAgICAgICAgICBpZiBub3QgaXNfdW5hdmFpbGFibGVfZXhjZXB0aW9uKGUpIGFuZCBoYXNhdHRyKGUsICJoZWFkZXJzIik6CisgICAgICAgICAgICAgICAgIyBUaGUgdHdvIHNlcnZlci1zaWRlIGVycm9yIGhlYWRlcnMgc2hvdWxkbid0IGJlIHNlbnQgYmFjayBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZS5oZWFkZXJzLmdldCgiWC1leGNlcHRpb24iKSBpcyBOb25lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlLmhlYWRlcnMuZ2V0KCJYLXRyYWNlYmFjayIpIGlzIE5vbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ1Byb3RvY29sRXJyb3Igbm90IHJhaXNlZCcpCisKKyAgICBkZWYgdGVzdF9mYWlsX3dpdGhfaW5mbyhzZWxmKToKKyAgICAgICAgIyB1c2UgdGhlIGJyb2tlbiBtZXNzYWdlIGNsYXNzCisgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlci5NZXNzYWdlQ2xhc3MgPSBGYWlsaW5nTWVzc2FnZUNsYXNzCisKKyAgICAgICAgIyBDaGVjayB0aGF0IGVycm9ycyBpbiB0aGUgc2VydmVyIHNlbmQgYmFjayBleGNlcHRpb24vdHJhY2ViYWNrCisgICAgICAgICMgaW5mbyB3aGVuIGZsYWcgaXMgc2V0CisgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENTZXJ2ZXIuX3NlbmRfdHJhY2ViYWNrX2hlYWRlciA9IFRydWUKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCkKKyAgICAgICAgICAgIHAucG93KDYsOCkKKyAgICAgICAgZXhjZXB0ICh4bWxycGNsaWIuUHJvdG9jb2xFcnJvciwgc29ja2V0LmVycm9yKSwgZToKKyAgICAgICAgICAgICMgaWdub3JlIGZhaWx1cmVzIGR1ZSB0byBub24tYmxvY2tpbmcgc29ja2V0ICd1bmF2YWlsYWJsZScgZXJyb3JzCisgICAgICAgICAgICBpZiBub3QgaXNfdW5hdmFpbGFibGVfZXhjZXB0aW9uKGUpIGFuZCBoYXNhdHRyKGUsICJoZWFkZXJzIik6CisgICAgICAgICAgICAgICAgIyBXZSBzaG91bGQgZ2V0IGVycm9yIGluZm8gaW4gdGhlIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZXJyID0gImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkgd2l0aCBiYXNlIDEwOiAnSSBhbSBicm9rZW4nIgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5oZWFkZXJzLmdldCgieC1leGNlcHRpb24iKSwgZXhwZWN0ZWRfZXJyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlLmhlYWRlcnMuZ2V0KCJ4LXRyYWNlYmFjayIpIGlzIG5vdCBOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdQcm90b2NvbEVycm9yIG5vdCByYWlzZWQnKQorCitjbGFzcyBDR0lIYW5kbGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jZ2kgPSBTaW1wbGVYTUxSUENTZXJ2ZXIuQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXIoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNnaSA9IE5vbmUKKworICAgIGRlZiB0ZXN0X2NnaV9nZXQoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnY6CisgICAgICAgICAgICBlbnZbJ1JFUVVFU1RfTUVUSE9EJ10gPSAnR0VUJworICAgICAgICAgICAgIyBpZiB0aGUgbWV0aG9kIGlzIEdFVCBhbmQgbm8gcmVxdWVzdF90ZXh0IGlzIGdpdmVuLCBpdCBydW5zIGhhbmRsZV9nZXQKKyAgICAgICAgICAgICMgZ2V0IHN5c291dCBvdXRwdXQKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNhcHR1cmVkX3N0ZG91dCgpIGFzIGRhdGFfb3V0OgorICAgICAgICAgICAgICAgIHNlbGYuY2dpLmhhbmRsZV9yZXF1ZXN0KCkKKworICAgICAgICAgICAgIyBwYXJzZSBTdGF0dXMgaGVhZGVyCisgICAgICAgICAgICBkYXRhX291dC5zZWVrKDApCisgICAgICAgICAgICBoYW5kbGUgPSBkYXRhX291dC5yZWFkKCkKKyAgICAgICAgICAgIHN0YXR1cyA9IGhhbmRsZS5zcGxpdCgpWzFdCisgICAgICAgICAgICBtZXNzYWdlID0gJyAnLmpvaW4oaGFuZGxlLnNwbGl0KClbMjo0XSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0dXMsICc0MDAnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCAnQmFkIFJlcXVlc3QnKQorCisKKyAgICBkZWYgdGVzdF9jZ2lfeG1scnBjX3Jlc3BvbnNlKHNlbGYpOgorICAgICAgICBkYXRhID0gIiIiPD94bWwgdmVyc2lvbj0nMS4wJz8+CisgICAgICAgIDxtZXRob2RDYWxsPgorICAgICAgICAgICAgPG1ldGhvZE5hbWU+dGVzdF9tZXRob2Q8L21ldGhvZE5hbWU+CisgICAgICAgICAgICA8cGFyYW1zPgorICAgICAgICAgICAgICAgIDxwYXJhbT4KKyAgICAgICAgICAgICAgICAgICAgPHZhbHVlPjxzdHJpbmc+Zm9vPC9zdHJpbmc+PC92YWx1ZT4KKyAgICAgICAgICAgICAgICA8L3BhcmFtPgorICAgICAgICAgICAgICAgIDxwYXJhbT4KKyAgICAgICAgICAgICAgICAgICAgPHZhbHVlPjxzdHJpbmc+YmFyPC9zdHJpbmc+PC92YWx1ZT4KKyAgICAgICAgICAgICAgICA8L3BhcmFtPgorICAgICAgICAgICAgPC9wYXJhbXM+CisgICAgICAgIDwvbWV0aG9kQ2FsbD4KKyAgICAgICAgIiIiCisKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudiwgXAorICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5jYXB0dXJlZF9zdGRvdXQoKSBhcyBkYXRhX291dCwgXAorICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5jYXB0dXJlZF9zdGRpbigpIGFzIGRhdGFfaW46CisgICAgICAgICAgICBkYXRhX2luLndyaXRlKGRhdGEpCisgICAgICAgICAgICBkYXRhX2luLnNlZWsoMCkKKyAgICAgICAgICAgIGVudlsnQ09OVEVOVF9MRU5HVEgnXSA9IHN0cihsZW4oZGF0YSkpCisgICAgICAgICAgICBzZWxmLmNnaS5oYW5kbGVfcmVxdWVzdCgpCisgICAgICAgIGRhdGFfb3V0LnNlZWsoMCkKKworICAgICAgICAjIHdpbGwgcmVzcG9uZCBleGNlcHRpb24sIGlmIHNvLCBvdXIgZ29hbCBpcyBhY2hpZXZlZCA7KQorICAgICAgICBoYW5kbGUgPSBkYXRhX291dC5yZWFkKCkKKworICAgICAgICAjIHN0YXJ0IHdpdGggNDR0aCBjaGFyIHNvIGFzIG5vdCB0byBnZXQgaHR0cCBoZWFkZXIsIHdlIGp1c3QgbmVlZCBvbmx5IHhtbAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWxycGNsaWIuRmF1bHQsIHhtbHJwY2xpYi5sb2FkcywgaGFuZGxlWzQ0Ol0pCisKKyAgICAgICAgIyBBbHNvIHRlc3QgdGhlIGNvbnRlbnQtbGVuZ3RoIHJldHVybmVkICBieSBoYW5kbGVfcmVxdWVzdAorICAgICAgICAjIFVzaW5nIHRoZSBzYW1lIHRlc3QgbWV0aG9kIGlub3JkZXIgdG8gYXZvaWQgYWxsIHRoZSBkYXRhcGFzc2luZworICAgICAgICAjIGJvaWxlcnBsYXRlIGNvZGUuCisgICAgICAgICMgVGVzdCBmb3IgYnVnOiBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNTA0MAorCisgICAgICAgIGNvbnRlbnQgPSBoYW5kbGVbaGFuZGxlLmZpbmQoIjw/eG1sIik6XQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBpbnQocmUuc2VhcmNoKCdDb250ZW50LUxlbmd0aDogKFxkKyknLCBoYW5kbGUpLmdyb3VwKDEpKSwKKyAgICAgICAgICAgIGxlbihjb250ZW50KSkKKworCitjbGFzcyBGYWtlU29ja2V0OgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmRhdGEgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisKKyAgICBkZWYgc2VuZChzZWxmLCBidWYpOgorICAgICAgICBzZWxmLmRhdGEud3JpdGUoYnVmKQorICAgICAgICByZXR1cm4gbGVuKGJ1ZikKKworICAgIGRlZiBzZW5kYWxsKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuZGF0YS53cml0ZShidWYpCisKKyAgICBkZWYgZ2V0dmFsdWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuZ2V0dmFsdWUoKQorCisgICAgZGVmIG1ha2VmaWxlKHNlbGYsIHg9J3InLCB5PS0xKToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKKworY2xhc3MgRmFrZVRyYW5zcG9ydCh4bWxycGNsaWIuVHJhbnNwb3J0KToKKyAgICAiIiJBIFRyYW5zcG9ydCBpbnN0YW5jZSB0aGF0IHJlY29yZHMgaW5zdGVhZCBvZiBzZW5kaW5nIGEgcmVxdWVzdC4KKworICAgIFRoaXMgY2xhc3MgcmVwbGFjZXMgdGhlIGFjdHVhbCBzb2NrZXQgdXNlZCBieSBodHRwbGliIHdpdGggYQorICAgIEZha2VTb2NrZXQgb2JqZWN0IHRoYXQgcmVjb3JkcyB0aGUgcmVxdWVzdC4gIEl0IGRvZXNuJ3QgcHJvdmlkZSBhCisgICAgcmVzcG9uc2UuCisgICAgIiIiCisKKyAgICBkZWYgbWFrZV9jb25uZWN0aW9uKHNlbGYsIGhvc3QpOgorICAgICAgICBjb25uID0geG1scnBjbGliLlRyYW5zcG9ydC5tYWtlX2Nvbm5lY3Rpb24oc2VsZiwgaG9zdCkKKyAgICAgICAgY29ubi5zb2NrID0gc2VsZi5mYWtlX3NvY2tldCA9IEZha2VTb2NrZXQoKQorICAgICAgICByZXR1cm4gY29ubgorCitjbGFzcyBUcmFuc3BvcnRTdWJjbGFzc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBpc3N1ZV9yZXF1ZXN0KHNlbGYsIHRyYW5zcG9ydF9jbGFzcyk6CisgICAgICAgICIiIlJldHVybiBhbiBIVFRQIHJlcXVlc3QgbWFkZSB2aWEgdHJhbnNwb3J0X2NsYXNzLiIiIgorICAgICAgICB0cmFuc3BvcnQgPSB0cmFuc3BvcnRfY2xhc3MoKQorICAgICAgICBwcm94eSA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eSgiaHR0cDovL2V4YW1wbGUuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydD10cmFuc3BvcnQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByb3h5LnBvdyg2LCA4KQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIHRyYW5zcG9ydC5mYWtlX3NvY2tldC5nZXR2YWx1ZSgpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgdGVzdF9jdXN0b21fdXNlcl9hZ2VudChzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdFRyYW5zcG9ydChGYWtlVHJhbnNwb3J0KToKKworICAgICAgICAgICAgZGVmIHNlbmRfdXNlcl9hZ2VudChzZWxmLCBjb25uKToKKyAgICAgICAgICAgICAgICB4bWxycGNsaWIuVHJhbnNwb3J0LnNlbmRfdXNlcl9hZ2VudChzZWxmLCBjb25uKQorICAgICAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCJYLVRlc3QiLCAidGVzdF9jdXN0b21fdXNlcl9hZ2VudCIpCisKKyAgICAgICAgcmVxID0gc2VsZi5pc3N1ZV9yZXF1ZXN0KFRlc3RUcmFuc3BvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlgtVGVzdDogdGVzdF9jdXN0b21fdXNlcl9hZ2VudFxyXG4iLCByZXEpCisKKyAgICBkZWYgdGVzdF9zZW5kX2hvc3Qoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3RUcmFuc3BvcnQoRmFrZVRyYW5zcG9ydCk6CisKKyAgICAgICAgICAgIGRlZiBzZW5kX2hvc3Qoc2VsZiwgY29ubiwgaG9zdCk6CisgICAgICAgICAgICAgICAgeG1scnBjbGliLlRyYW5zcG9ydC5zZW5kX2hvc3Qoc2VsZiwgY29ubiwgaG9zdCkKKyAgICAgICAgICAgICAgICBjb25uLnB1dGhlYWRlcigiWC1UZXN0IiwgInRlc3Rfc2VuZF9ob3N0IikKKworICAgICAgICByZXEgPSBzZWxmLmlzc3VlX3JlcXVlc3QoVGVzdFRyYW5zcG9ydCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiWC1UZXN0OiB0ZXN0X3NlbmRfaG9zdFxyXG4iLCByZXEpCisKKyAgICBkZWYgdGVzdF9zZW5kX3JlcXVlc3Qoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3RUcmFuc3BvcnQoRmFrZVRyYW5zcG9ydCk6CisKKyAgICAgICAgICAgIGRlZiBzZW5kX3JlcXVlc3Qoc2VsZiwgY29ubiwgdXJsLCBib2R5KToKKyAgICAgICAgICAgICAgICB4bWxycGNsaWIuVHJhbnNwb3J0LnNlbmRfcmVxdWVzdChzZWxmLCBjb25uLCB1cmwsIGJvZHkpCisgICAgICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoIlgtVGVzdCIsICJ0ZXN0X3NlbmRfcmVxdWVzdCIpCisKKyAgICAgICAgcmVxID0gc2VsZi5pc3N1ZV9yZXF1ZXN0KFRlc3RUcmFuc3BvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlgtVGVzdDogdGVzdF9zZW5kX3JlcXVlc3RcclxuIiwgcmVxKQorCisgICAgZGVmIHRlc3Rfc2VuZF9jb250ZW50KHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0VHJhbnNwb3J0KEZha2VUcmFuc3BvcnQpOgorCisgICAgICAgICAgICBkZWYgc2VuZF9jb250ZW50KHNlbGYsIGNvbm4sIGJvZHkpOgorICAgICAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCJYLVRlc3QiLCAidGVzdF9zZW5kX2NvbnRlbnQiKQorICAgICAgICAgICAgICAgIHhtbHJwY2xpYi5UcmFuc3BvcnQuc2VuZF9jb250ZW50KHNlbGYsIGNvbm4sIGJvZHkpCisKKyAgICAgICAgcmVxID0gc2VsZi5pc3N1ZV9yZXF1ZXN0KFRlc3RUcmFuc3BvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlgtVGVzdDogdGVzdF9zZW5kX2NvbnRlbnRcclxuIiwgcmVxKQorCitAdGVzdF9zdXBwb3J0LnJlYXBfdGhyZWFkcworZGVmIHRlc3RfbWFpbigpOgorICAgIHhtbHJwY190ZXN0cyA9IFtYTUxSUENUZXN0Q2FzZSwgSGVscGVyVGVzdENhc2UsIERhdGVUaW1lVGVzdENhc2UsCisgICAgICAgICBCaW5hcnlUZXN0Q2FzZSwgRmF1bHRUZXN0Q2FzZSwgVHJhbnNwb3J0U3ViY2xhc3NUZXN0Q2FzZV0KKyAgICB4bWxycGNfdGVzdHMuYXBwZW5kKFNpbXBsZVNlcnZlclRlc3RDYXNlKQorICAgIHhtbHJwY190ZXN0cy5hcHBlbmQoS2VlcGFsaXZlU2VydmVyVGVzdENhc2UxKQorICAgIHhtbHJwY190ZXN0cy5hcHBlbmQoS2VlcGFsaXZlU2VydmVyVGVzdENhc2UyKQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGd6aXAKKyAgICAgICAgeG1scnBjX3Rlc3RzLmFwcGVuZChHemlwU2VydmVyVGVzdENhc2UpCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzICNnemlwIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZAorICAgIHhtbHJwY190ZXN0cy5hcHBlbmQoTXVsdGlQYXRoU2VydmVyVGVzdENhc2UpCisgICAgeG1scnBjX3Rlc3RzLmFwcGVuZChTZXJ2ZXJQcm94eVRlc3RDYXNlKQorICAgIHhtbHJwY190ZXN0cy5hcHBlbmQoRmFpbGluZ1NlcnZlclRlc3RDYXNlKQorICAgIHhtbHJwY190ZXN0cy5hcHBlbmQoQ0dJSGFuZGxlclRlc3RDYXNlKQorCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqeG1scnBjX3Rlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxycGMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1scnBjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGU1YTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1scnBjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxycGMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1scnBjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGU1YTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1scnBjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cGlja2xlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeHBpY2tsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzNhMzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeHBpY2tsZS5weQpAQCAtMCwwICsxLDI2NCBAQAorIyB0ZXN0X3BpY2tsZSBkdW1wcyBhbmQgbG9hZHMgcGlja2xlcyB2aWEgcGlja2xlLnB5LgorIyB0ZXN0X2NwaWNrbGUgZG9lcyB0aGUgc2FtZSwgYnV0IHZpYSB0aGUgY1BpY2tsZSBtb2R1bGUuCisjIFRoaXMgdGVzdCBjb3ZlcnMgdGhlIG90aGVyIHR3byBjYXNlcywgbWFraW5nIHBpY2tsZXMgd2l0aCBvbmUgbW9kdWxlIGFuZAorIyBsb2FkaW5nIHRoZW0gdmlhIHRoZSBvdGhlci4gSXQgYWxzbyB0ZXN0cyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoCisjIHByZXZpb3VzIHZlcnNpb24gb2YgUHl0aG9uIGJ5IGJvdW5jaW5nIHBpY2tsZWQgb2JqZWN0cyB0aHJvdWdoIFB5dGhvbiAyLjQKKyMgYW5kIFB5dGhvbiAyLjUgcnVubmluZyB0aGlzIGZpbGUuCisKK2ltcG9ydCBjUGlja2xlCitpbXBvcnQgb3MKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgcGlja2xlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHR5cGVzCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBNb3N0IGRpc3Ryby1zdXBwbGllZCBQeXRob25zIGRvbid0IGluY2x1ZGUgdGhlIHRlc3RzCisjIG9yIHRlc3Qgc3VwcG9ydCBmaWxlcywgYW5kIHNvbWUgZG9uJ3QgaW5jbHVkZSBhIHdheSB0byBnZXQgdGhlc2UgYmFjayBldmVuIGlmCisjIHlvdSdyZSB3aWxsIHRvIGluc3RhbGwgZXh0cmEgcGFja2FnZXMgKGxpa2UgVWJ1bnR1KS4gRG9pbmcgdGhpbmdzIGxpa2UgdGhpcworIyAicHJvdmlkZXMiIGEgcGlja2xldGVzdGVyIG1vZHVsZSBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgUHl0aG9uIHRoYXQgbWF5IGJlCisjIGluc3RhbGxlZCB3aXRob3V0IGl0LiBOb3RlIHRoYXQgb25lIG90aGVyIGRlc2lnbiBmb3IgdGhpcyBpbnZvbHZlcyBtZXNzaW5nCisjIHdpdGggc3lzLnBhdGgsIHdoaWNoIGlzIGxlc3MgcHJlY2lzZS4KK21vZF9wYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwaWNrbGV0ZXN0ZXIucHkiKSkKK3BpY2tsZXRlc3RlciA9IHR5cGVzLk1vZHVsZVR5cGUoInRlc3QucGlja2xldGVzdGVyIikKK2V4ZWMgY29tcGlsZShvcGVuKG1vZF9wYXRoKS5yZWFkKCksIG1vZF9wYXRoLCAnZXhlYycpIGluIHBpY2tsZXRlc3Rlci5fX2RpY3RfXworQWJzdHJhY3RQaWNrbGVUZXN0cyA9IHBpY2tsZXRlc3Rlci5BYnN0cmFjdFBpY2tsZVRlc3RzCitpZiBwaWNrbGV0ZXN0ZXIuX19uYW1lX18gaW4gc3lzLm1vZHVsZXM6CisgICAgcmFpc2UgUnVudGltZUVycm9yKCJEaWQgbm90IGV4cGVjdCB0byBmaW5kIHRlc3QucGlja2xldGVzdGVyIGxvYWRlZCIpCitzeXMubW9kdWxlc1twaWNrbGV0ZXN0ZXIuX19uYW1lX19dID0gcGlja2xldGVzdGVyCisKKworY2xhc3MgRHVtcENQaWNrbGVfTG9hZFBpY2tsZShBYnN0cmFjdFBpY2tsZVRlc3RzKToKKworICAgIGVycm9yID0gS2V5RXJyb3IKKworICAgIGRlZiBkdW1wcyhzZWxmLCBhcmcsIHByb3RvPTAsIGZhc3Q9RmFsc2UpOgorICAgICAgICAjIElnbm9yZSBmYXN0CisgICAgICAgIHJldHVybiBjUGlja2xlLmR1bXBzKGFyZywgcHJvdG8pCisKKyAgICBkZWYgbG9hZHMoc2VsZiwgYnVmKToKKyAgICAgICAgIyBJZ25vcmUgZmFzdAorICAgICAgICByZXR1cm4gcGlja2xlLmxvYWRzKGJ1ZikKKworY2xhc3MgRHVtcFBpY2tsZV9Mb2FkQ1BpY2tsZShBYnN0cmFjdFBpY2tsZVRlc3RzKToKKworICAgIGVycm9yID0gY1BpY2tsZS5CYWRQaWNrbGVHZXQKKworICAgIGRlZiBkdW1wcyhzZWxmLCBhcmcsIHByb3RvPTAsIGZhc3Q9RmFsc2UpOgorICAgICAgICAjIElnbm9yZSBmYXN0CisgICAgICAgIHJldHVybiBwaWNrbGUuZHVtcHMoYXJnLCBwcm90bykKKworICAgIGRlZiBsb2FkcyhzZWxmLCBidWYpOgorICAgICAgICAjIElnbm9yZSBmYXN0CisgICAgICAgIHJldHVybiBjUGlja2xlLmxvYWRzKGJ1ZikKKworZGVmIGhhdmVfcHl0aG9uX3ZlcnNpb24obmFtZSk6CisgICAgIiIiQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gbmFtZSBpcyBhIHZhbGlkIFB5dGhvbiBiaW5hcnkgYW5kIGhhcworICAgIHRlc3QudGVzdF9zdXBwb3J0LgorCisgICAgVGhpcyByZXNwZWN0cyB5b3VyIFBBVEguCisKKyAgICBBcmdzOgorICAgICAgICBuYW1lOiBzaG9ydCBzdHJpbmcgbmFtZSBvZiBhIFB5dGhvbiBiaW5hcnkgc3VjaCBhcyAicHl0aG9uMi40Ii4KKworICAgIFJldHVybnM6CisgICAgICAgIFRydWUgaWYgdGhlIG5hbWUgaXMgdmFsaWQsIEZhbHNlIG90aGVyd2lzZS4KKyAgICAiIiIKKyAgICByZXR1cm4gb3Muc3lzdGVtKG5hbWUgKyAiIC1jICdpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQnIikgPT0gMAorCisKK2NsYXNzIEFic3RyYWN0Q29tcGF0VGVzdHMoQWJzdHJhY3RQaWNrbGVUZXN0cyk6CisKKyAgICBtb2R1bGUgPSBOb25lCisgICAgcHl0aG9uID0gTm9uZQorICAgIGVycm9yID0gTm9uZQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5weXRob24pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1vZHVsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZXJyb3IpCisKKyAgICBkZWYgc2VuZF90b193b3JrZXIoc2VsZiwgcHl0aG9uLCBvYmosIHByb3RvKToKKyAgICAgICAgIiIiQm91bmNlIGEgcGlja2xlZCBvYmplY3QgdGhyb3VnaCBhbm90aGVyIHZlcnNpb24gb2YgUHl0aG9uLgorCisgICAgICAgIFRoaXMgd2lsbCBwaWNrbGUgdGhlIG9iamVjdCwgc2VuZCBpdCB0byBhIGNoaWxkIHByb2Nlc3Mgd2hlcmUgaXQgd2lsbCBiZQorICAgICAgICB1bnBpY2tsZWQsIHRoZW4gcmVwaWNrbGVkIGFuZCBzZW50IGJhY2sgdG8gdGhlIHBhcmVudCBwcm9jZXNzLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBweXRob246IHRoZSBuYW1lIG9mIHRoZSBQeXRob24gYmluYXJ5IHRvIHN0YXJ0LgorICAgICAgICAgICAgb2JqOiBvYmplY3QgdG8gcGlja2xlLgorICAgICAgICAgICAgcHJvdG86IHBpY2tsZSBwcm90b2NvbCBudW1iZXIgdG8gdXNlLgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBUaGUgcGlja2xlZCBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGNoaWxkIHByb2Nlc3MuCisgICAgICAgICIiIgorICAgICAgICAjIFByZXZlbnQgdGhlIHN1YnByb2Nlc3MgZnJvbSBwaWNraW5nIHVwIGludmFsaWQgLnB5YyBmaWxlcy4KKyAgICAgICAgdGFyZ2V0ID0gX19maWxlX18KKyAgICAgICAgaWYgdGFyZ2V0Wy0xXSBpbiAoImMiLCAibyIpOgorICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0WzotMV0KKworICAgICAgICBkYXRhID0gc2VsZi5tb2R1bGUuZHVtcHMoKHByb3RvLCBvYmopLCBwcm90bykKKyAgICAgICAgd29ya2VyID0gc3VicHJvY2Vzcy5Qb3BlbihbcHl0aG9uLCB0YXJnZXQsICJ3b3JrZXIiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHdvcmtlci5jb21tdW5pY2F0ZShkYXRhKQorICAgICAgICBpZiB3b3JrZXIucmV0dXJuY29kZSAhPSAwOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKHN0ZGVycikKKyAgICAgICAgcmV0dXJuIHN0ZG91dAorCisgICAgZGVmIGR1bXBzKHNlbGYsIGFyZywgcHJvdG89MCwgZmFzdD1GYWxzZSk6CisgICAgICAgIHJldHVybiBzZWxmLnNlbmRfdG9fd29ya2VyKHNlbGYucHl0aG9uLCBhcmcsIHByb3RvKQorCisgICAgZGVmIGxvYWRzKHNlbGYsIGlucHV0KToKKyAgICAgICAgcmV0dXJuIHNlbGYubW9kdWxlLmxvYWRzKGlucHV0KQorCisgICAgIyBUaGVzZSB0ZXN0cyBhcmUgZGlzYWJsZWQgYmVjYXVzZSB0aGV5IHJlcXVpcmUgc29tZSBzcGVjaWFsIHNldHVwCisgICAgIyBvbiB0aGUgd29ya2VyIHRoYXQncyBoYXJkIHRvIGtlZXAgaW4gc3luYy4KKyAgICBkZWYgdGVzdF9nbG9iYWxfZXh0MShzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfZ2xvYmFsX2V4dDIoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2dsb2JhbF9leHQ0KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICAjIFRoaXMgaXMgYSBjdXQtZG93biB2ZXJzaW9uIG9mIHBpY2tsZXRlc3RlcidzIHRlc3RfZmxvYXQuIEJhY2t3YXJkcworICAgICMgY29tcGF0aWJpbGl0eSBmb3IgdGhlIHZhbHVlcyBpbiBmb3JfYmluX3Byb3RvcyB3YXMgZXhwbGljaXRseSBicm9rZW4gaW4KKyAgICAjIHI2ODkwMyB0byBmaXggYSBidWcuCisgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CisgICAgICAgIGZvcl9iaW5fcHJvdG9zID0gWzQuOTRlLTMyNCwgMWUtMzEwXQorICAgICAgICBuZWdfZm9yX2Jpbl9wcm90b3MgPSBbLXggZm9yIHggaW4gZm9yX2Jpbl9wcm90b3NdCisgICAgICAgIHRlc3RfdmFsdWVzID0gWzAuMCwgN2UtMzA4LCA2LjYyNmUtMzQsIDAuMSwgMC41LAorICAgICAgICAgICAgICAgICAgICAgICAzLjE0LCAyNjMuNDQ1ODIwNjIzNzQwNTMsIDYuMDIyZTIzLCAxZTMwXQorICAgICAgICB0ZXN0X3Byb3RvMF92YWx1ZXMgPSB0ZXN0X3ZhbHVlcyArIFsteCBmb3IgeCBpbiB0ZXN0X3ZhbHVlc10KKyAgICAgICAgdGVzdF92YWx1ZXMgPSB0ZXN0X3Byb3RvMF92YWx1ZXMgKyBmb3JfYmluX3Byb3RvcyArIG5lZ19mb3JfYmluX3Byb3RvcworCisgICAgICAgIGZvciB2YWx1ZSBpbiB0ZXN0X3Byb3RvMF92YWx1ZXM6CisgICAgICAgICAgICBwaWNrbGUgPSBzZWxmLmR1bXBzKHZhbHVlLCAwKQorICAgICAgICAgICAgZ290ID0gc2VsZi5sb2FkcyhwaWNrbGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCBnb3QpCisKKyAgICAgICAgZm9yIHByb3RvIGluIHBpY2tsZXRlc3Rlci5wcm90b2NvbHNbMTpdOgorICAgICAgICAgICAgZm9yIHZhbHVlIGluIHRlc3RfdmFsdWVzOgorICAgICAgICAgICAgICAgIHBpY2tsZSA9IHNlbGYuZHVtcHModmFsdWUsIHByb3RvKQorICAgICAgICAgICAgICAgIGdvdCA9IHNlbGYubG9hZHMocGlja2xlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsIGdvdCkKKworICAgICMgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2FzIGV4cGxpY2l0bHkgYnJva2VuIGluIHI2NzkzNCB0byBmaXggYSBidWcuCisgICAgZGVmIHRlc3RfdW5pY29kZV9oaWdoX3BsYW5lKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICAjIFRoaXMgdGVzdHMgYSBmaXggdGhhdCdzIGluIDIuNyBvbmx5CisgICAgZGVmIHRlc3RfZHluYW1pY19jbGFzcyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgaWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICAgICAgIyBUaGlzIGlzIGEgY3V0LWRvd24gdmVyc2lvbiBvZiBwaWNrbGV0ZXN0ZXIncyB0ZXN0X3VuaWNvZGUuIEJhY2t3YXJkcworICAgICAgICAjIGNvbXBhdGliaWxpdHkgd2FzIGV4cGxpY2l0bHkgYnJva2VuIGluIHI2NzkzNCB0byBmaXggYSBidWcuCisgICAgICAgIGRlZiB0ZXN0X3VuaWNvZGUoc2VsZik6CisgICAgICAgICAgICBlbmRjYXNlcyA9IFt1JycsIHUnPFxcdT4nLCB1JzxcXFx1MTIzND4nLCB1Jzxcbj4nLCB1JzxcXD4nXQorICAgICAgICAgICAgZm9yIHByb3RvIGluIHBpY2tsZXRlc3Rlci5wcm90b2NvbHM6CisgICAgICAgICAgICAgICAgZm9yIHUgaW4gZW5kY2FzZXM6CisgICAgICAgICAgICAgICAgICAgIHAgPSBzZWxmLmR1bXBzKHUsIHByb3RvKQorICAgICAgICAgICAgICAgICAgICB1MiA9IHNlbGYubG9hZHMocCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MiwgdSkKKworCitkZWYgcnVuX2NvbXBhdF90ZXN0KHB5dGhvbl9uYW1lKToKKyAgICByZXR1cm4gKHRlc3Rfc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCJ4cGlja2xlIikgYW5kCisgICAgICAgICAgICBoYXZlX3B5dGhvbl92ZXJzaW9uKHB5dGhvbl9uYW1lKSkKKworCisjIFRlc3QgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi40LgoraWYgbm90IHJ1bl9jb21wYXRfdGVzdCgicHl0aG9uMi40Iik6CisgICAgY2xhc3MgQ1BpY2tsZVB5dGhvbjI0Q29tcGF0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgcGFzcworZWxzZToKKyAgICBjbGFzcyBDUGlja2xlUHl0aG9uMjRDb21wYXQoQWJzdHJhY3RDb21wYXRUZXN0cyk6CisKKyAgICAgICAgbW9kdWxlID0gY1BpY2tsZQorICAgICAgICBweXRob24gPSAicHl0aG9uMi40IgorICAgICAgICBlcnJvciA9IGNQaWNrbGUuQmFkUGlja2xlR2V0CisKKyAgICAgICAgIyBEaXNhYmxlIHRoZXNlIHRlc3RzIGZvciBQeXRob24gMi40LiBNYWtpbmcgdGhlbSBwYXNzIHdvdWxkIHJlcXVpcmUKKyAgICAgICAgIyBub250cml2aWFsbHkgbW9ua2V5cGF0Y2hpbmcgdGhlIHBpY2tsZXRlc3RlciBtb2R1bGUgaW4gdGhlIHdvcmtlci4KKyAgICAgICAgZGVmIHRlc3RfcmVkdWNlX2NhbGxzX2Jhc2Uoc2VsZik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIHRlc3RfcmVkdWNlX2V4X2NhbGxzX2Jhc2Uoc2VsZik6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIFBpY2tsZVB5dGhvbjI0Q29tcGF0KENQaWNrbGVQeXRob24yNENvbXBhdCk6CisKKyAgICBtb2R1bGUgPSBwaWNrbGUKKyAgICBlcnJvciA9IEtleUVycm9yCisKKworIyBUZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggUHl0aG9uIDIuNS4KK2lmIG5vdCBydW5fY29tcGF0X3Rlc3QoInB5dGhvbjIuNSIpOgorICAgIGNsYXNzIENQaWNrbGVQeXRob24yNUNvbXBhdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3MgQ1BpY2tsZVB5dGhvbjI1Q29tcGF0KEFic3RyYWN0Q29tcGF0VGVzdHMpOgorCisgICAgICAgIG1vZHVsZSA9IGNQaWNrbGUKKyAgICAgICAgcHl0aG9uID0gInB5dGhvbjIuNSIKKyAgICAgICAgZXJyb3IgPSBjUGlja2xlLkJhZFBpY2tsZUdldAorCitjbGFzcyBQaWNrbGVQeXRob24yNUNvbXBhdChDUGlja2xlUHl0aG9uMjVDb21wYXQpOgorCisgICAgbW9kdWxlID0gcGlja2xlCisgICAgZXJyb3IgPSBLZXlFcnJvcgorCisKKyMgVGVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjYuCitpZiBub3QgcnVuX2NvbXBhdF90ZXN0KCJweXRob24yLjYiKToKKyAgICBjbGFzcyBDUGlja2xlUHl0aG9uMjZDb21wYXQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBwYXNzCitlbHNlOgorICAgIGNsYXNzIENQaWNrbGVQeXRob24yNkNvbXBhdChBYnN0cmFjdENvbXBhdFRlc3RzKToKKworICAgICAgICBtb2R1bGUgPSBjUGlja2xlCisgICAgICAgIHB5dGhvbiA9ICJweXRob24yLjYiCisgICAgICAgIGVycm9yID0gY1BpY2tsZS5CYWRQaWNrbGVHZXQKKworY2xhc3MgUGlja2xlUHl0aG9uMjZDb21wYXQoQ1BpY2tsZVB5dGhvbjI2Q29tcGF0KToKKworICAgIG1vZHVsZSA9IHBpY2tsZQorICAgIGVycm9yID0gS2V5RXJyb3IKKworCitkZWYgd29ya2VyX21haW4oaW5fc3RyZWFtLCBvdXRfc3RyZWFtKToKKyAgICBtZXNzYWdlID0gY1BpY2tsZS5sb2FkKGluX3N0cmVhbSkKKyAgICBwcm90b2NvbCwgb2JqID0gbWVzc2FnZQorICAgIGNQaWNrbGUuZHVtcChvYmosIG91dF9zdHJlYW0sIHByb3RvY29sKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBpZiBub3QgdGVzdF9zdXBwb3J0LmlzX3Jlc291cmNlX2VuYWJsZWQoInhwaWNrbGUiKToKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAidGVzdF94cGlja2xlIC0tIHNraXBwaW5nIGJhY2t3YXJkcyBjb21wYXQgdGVzdHMuIgorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJVc2UgJ3JlZ3J0ZXN0LnB5IC11IHhwaWNrbGUnIHRvIHJ1biB0aGVtLiIKKyAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCisKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBEdW1wQ1BpY2tsZV9Mb2FkUGlja2xlLAorICAgICAgICBEdW1wUGlja2xlX0xvYWRDUGlja2xlLAorICAgICAgICBDUGlja2xlUHl0aG9uMjRDb21wYXQsCisgICAgICAgIENQaWNrbGVQeXRob24yNUNvbXBhdCwKKyAgICAgICAgQ1BpY2tsZVB5dGhvbjI2Q29tcGF0LAorICAgICAgICBQaWNrbGVQeXRob24yNENvbXBhdCwKKyAgICAgICAgUGlja2xlUHl0aG9uMjVDb21wYXQsCisgICAgICAgIFBpY2tsZVB5dGhvbjI2Q29tcGF0LAorICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBpZiAid29ya2VyIiBpbiBzeXMuYXJndjoKKyAgICAgICAgd29ya2VyX21haW4oc3lzLnN0ZGluLCBzeXMuc3Rkb3V0KQorICAgIGVsc2U6CisgICAgICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cGlja2xlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hwaWNrbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTIxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cGlja2xlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cGlja2xlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hwaWNrbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTIxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cGlja2xlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cmFuZ2UucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cmFuZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjMGU0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hyYW5nZS5weQpAQCAtMCwwICsxLDIxOCBAQAorIyBQeXRob24gdGVzdCBzZXQgLS0gYnVpbHQtaW4gZnVuY3Rpb25zCisKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydCwgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBwaWNrbGUKK2ltcG9ydCBpdGVydG9vbHMKKworaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAidW5pdHRlc3QiKQorCisjIHB1cmUgUHl0aG9uIGltcGxlbWVudGF0aW9ucyAoMyBhcmdzIG9ubHkpLCBmb3IgY29tcGFyaXNvbgorZGVmIHB5cmFuZ2Uoc3RhcnQsIHN0b3AsIHN0ZXApOgorICAgIGlmIChzdGFydCAtIHN0b3ApIC8vIHN0ZXAgPCAwOgorICAgICAgICAjIHJlcGxhY2Ugc3RvcCB3aXRoIG5leHQgZWxlbWVudCBpbiB0aGUgc2VxdWVuY2Ugb2YgaW50ZWdlcnMKKyAgICAgICAgIyB0aGF0IGFyZSBjb25ncnVlbnQgdG8gc3RhcnQgbW9kdWxvIHN0ZXAuCisgICAgICAgIHN0b3AgKz0gKHN0YXJ0IC0gc3RvcCkgJSBzdGVwCisgICAgICAgIHdoaWxlIHN0YXJ0ICE9IHN0b3A6CisgICAgICAgICAgICB5aWVsZCBzdGFydAorICAgICAgICAgICAgc3RhcnQgKz0gc3RlcAorCitkZWYgcHlyYW5nZV9yZXZlcnNlZChzdGFydCwgc3RvcCwgc3RlcCk6CisgICAgc3RvcCArPSAoc3RhcnQgLSBzdG9wKSAlIHN0ZXAKKyAgICByZXR1cm4gcHlyYW5nZShzdG9wIC0gc3RlcCwgc3RhcnQgLSBzdGVwLCAtc3RlcCkKKworCitjbGFzcyBYcmFuZ2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgYXNzZXJ0X2l0ZXJhdG9yc19lcXVhbChzZWxmLCB4cywgeXMsIHRlc3RfaWQsIGxpbWl0PU5vbmUpOgorICAgICAgICAjIGNoZWNrIHRoYXQgYW4gaXRlcmF0b3IgeHMgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgcmVzdWx0cyB5cywKKyAgICAgICAgIyB1cCB0byBhIGdpdmVuIGxpbWl0LgorICAgICAgICBpZiBsaW1pdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHhzID0gaXRlcnRvb2xzLmlzbGljZSh4cywgbGltaXQpCisgICAgICAgICAgICB5cyA9IGl0ZXJ0b29scy5pc2xpY2UoeXMsIGxpbWl0KQorICAgICAgICBzZW50aW5lbCA9IG9iamVjdCgpCisgICAgICAgIHBhaXJzID0gaXRlcnRvb2xzLml6aXBfbG9uZ2VzdCh4cywgeXMsIGZpbGx2YWx1ZT1zZW50aW5lbCkKKyAgICAgICAgZm9yIGksICh4LCB5KSBpbiBlbnVtZXJhdGUocGFpcnMpOgorICAgICAgICAgICAgaWYgeCA9PSB5OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHggPT0gc2VudGluZWw6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCd7fTogaXRlcmF0b3IgZW5kZWQgdW5leHBlY3RlZGx5ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F0IHBvc2l0aW9uIHt9OyBleHBlY3RlZCB7fScuZm9ybWF0KHRlc3RfaWQsIGksIHkpKQorICAgICAgICAgICAgZWxpZiB5ID09IHNlbnRpbmVsOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgne306IHVuZXhwZWN0ZWQgZXhjZXNzIGVsZW1lbnQge30gYXQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAncG9zaXRpb24ge30nLmZvcm1hdCh0ZXN0X2lkLCB4LCBpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCd7fTogd3JvbmcgZWxlbWVudCBhdCBwb3NpdGlvbiB7fTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdleHBlY3RlZCB7fSwgZ290IHt9Jy5mb3JtYXQodGVzdF9pZCwgaSwgeSwgeCkpCisKKyAgICBkZWYgYXNzZXJ0X3hyYW5nZXNfZXF1aXZhbGVudChzZWxmLCB4LCB5KToKKyAgICAgICAgIyBDaGVjayB0aGF0IHR3byB4cmFuZ2Ugb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgaW4gdGhlIHNlbnNlIG9mIHRoZQorICAgICAgICAjIGFzc29jaWF0ZWQgc2VxdWVuY2VzIGJlaW5nIHRoZSBzYW1lLiAgV2Ugd2FudCB0byB1c2UgdGhpcyBmb3IgbGFyZ2UKKyAgICAgICAgIyB4cmFuZ2Ugb2JqZWN0cywgc28gaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRvIGxpc3RzIGFuZCBjb21wYXJpbmcKKyAgICAgICAgIyBkaXJlY3RseSB3ZSBkbyBhIG51bWJlciBvZiBpbmRpcmVjdCBjaGVja3MuCisgICAgICAgIGlmIGxlbih4KSAhPSBsZW4oeSk6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3t9IGFuZCB7fSBoYXZlIGRpZmZlcmVudCAnCisgICAgICAgICAgICAgICAgICAgICAgJ2xlbmd0aHM6IHt9IGFuZCB7fSAnLmZvcm1hdCh4LCB5LCBsZW4oeCksIGxlbih5KSkpCisgICAgICAgIGlmIGxlbih4KSA+PSAxOgorICAgICAgICAgICAgaWYgeFswXSAhPSB5WzBdOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgne30gYW5kIHt9IGhhdmUgZGlmZmVyZW50IGluaXRpYWwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudHM6IHt9IGFuZCB7fSAnLmZvcm1hdCh4LCB5LCB4WzBdLCB5WzBdKSkKKyAgICAgICAgICAgIGlmIHhbLTFdICE9IHlbLTFdOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgne30gYW5kIHt9IGhhdmUgZGlmZmVyZW50IGZpbmFsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRzOiB7fSBhbmQge30gJy5mb3JtYXQoeCwgeSwgeFstMV0sIHlbLTFdKSkKKyAgICAgICAgaWYgbGVuKHgpID49IDI6CisgICAgICAgICAgICB4X3N0ZXAgPSB4WzFdIC0geFswXQorICAgICAgICAgICAgeV9zdGVwID0geVsxXSAtIHlbMF0KKyAgICAgICAgICAgIGlmIHhfc3RlcCAhPSB5X3N0ZXA6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCd7fSBhbmQge30gaGF2ZSBkaWZmZXJlbnQgc3RlcDogJworICAgICAgICAgICAgICAgICAgICAgICAgICAne30gYW5kIHt9ICcuZm9ybWF0KHgsIHksIHhfc3RlcCwgeV9zdGVwKSkKKworICAgIGRlZiB0ZXN0X3hyYW5nZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHhyYW5nZSgzKSksIFswLCAxLCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHhyYW5nZSgxLCA1KSksIFsxLCAyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHhyYW5nZSgwKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeHJhbmdlKC0zKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeHJhbmdlKDEsIDEwLCAzKSksIFsxLCA0LCA3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHhyYW5nZSg1LCAtNSwgLTMpKSwgWzUsIDIsIC0xLCAtNF0pCisKKyAgICAgICAgYSA9IDEwCisgICAgICAgIGIgPSAxMDAKKyAgICAgICAgYyA9IDUwCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHhyYW5nZShhLCBhKzIpKSwgW2EsIGErMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4cmFuZ2UoYSsyLCBhLCAtMUwpKSwgW2ErMiwgYSsxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHhyYW5nZShhKzQsIGEsIC0yKSksIFthKzQsIGErMl0pCisKKyAgICAgICAgc2VxID0gbGlzdCh4cmFuZ2UoYSwgYiwgYykpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYSwgc2VxKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGIsIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VxKSwgMikKKworICAgICAgICBzZXEgPSBsaXN0KHhyYW5nZShiLCBhLCAtYykpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYiwgc2VxKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGEsIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VxKSwgMikKKworICAgICAgICBzZXEgPSBsaXN0KHhyYW5nZSgtYSwgLWIsIC1jKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigtYSwgc2VxKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKC1iLCBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlcSksIDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB4cmFuZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgeHJhbmdlLCAxLCAyLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB4cmFuZ2UsIDEsIDIsIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgeHJhbmdlLCAxMCoqMTAwLCAxMCoqMTAxLCAxMCoqMTAxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgeHJhbmdlLCAwLCAic3BhbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgeHJhbmdlLCAwLCA0MiwgInNwYW0iKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHhyYW5nZSgwLCBzeXMubWF4aW50LCBzeXMubWF4aW50LTEpKSwgMikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB4cmFuZ2UsIC1zeXMubWF4aW50LCBzeXMubWF4aW50KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB4cmFuZ2UsIDAsIDIqc3lzLm1heGludCkKKworICAgICAgICByID0geHJhbmdlKC1zeXMubWF4aW50LCBzeXMubWF4aW50LCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyKSwgc3lzLm1heGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgeHJhbmdlLCAtc3lzLm1heGludC0xLCBzeXMubWF4aW50LCAyKQorCisgICAgZGVmIHRlc3RfcGlja2xpbmcoc2VsZik6CisgICAgICAgIHRlc3RjYXNlcyA9IFsoMTMsKSwgKDAsIDExKSwgKC0yMiwgMTApLCAoMjAsIDMsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICgxMywgMjEsIDMpLCAoLTIsIDIsIDIpXQorICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgIGZvciB0IGluIHRlc3RjYXNlczoKKyAgICAgICAgICAgICAgICByID0geHJhbmdlKCp0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKHIsIHByb3RvKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChyKSkKKworICAgICAgICBNID0gbWluKHN5cy5tYXhpbnQsIHN5cy5tYXhzaXplKQorICAgICAgICBsYXJnZV90ZXN0Y2FzZXMgPSB0ZXN0Y2FzZXMgKyBbCisgICAgICAgICAgICAoMCwgTSwgMSksCisgICAgICAgICAgICAoTSwgMCwgLTEpLAorICAgICAgICAgICAgKDAsIE0sIE0gLSAxKSwKKyAgICAgICAgICAgIChNIC8vIDIsIE0sIDEpLAorICAgICAgICAgICAgKDAsIC1NLCAtMSksCisgICAgICAgICAgICAoMCwgLU0sIDEgLSBNKSwKKyAgICAgICAgICAgICgtTSwgTSwgMiksCisgICAgICAgICAgICAoLU0sIE0sIDEwMjQpLAorICAgICAgICAgICAgKC1NLCBNLCAxMDU4NSksCisgICAgICAgICAgICAoTSwgLU0sIC0yKSwKKyAgICAgICAgICAgIChNLCAtTSwgLTEwMjQpLAorICAgICAgICAgICAgKE0sIC1NLCAtMTA1ODUpLAorICAgICAgICAgICAgXQorICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgIGZvciB0IGluIGxhcmdlX3Rlc3RjYXNlczoKKyAgICAgICAgICAgICAgICByID0geHJhbmdlKCp0KQorICAgICAgICAgICAgICAgIHJfb3V0ID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhyLCBwcm90bykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfeHJhbmdlc19lcXVpdmFsZW50KHJfb3V0LCByKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IHJlcHIgb2YgYW4geHJhbmdlIGlzIGEgdmFsaWQgcmVwcmVzZW50YXRpb24KKyAgICAgICAgIyBvZiB0aGF0IHhyYW5nZS4KKworICAgICAgICAjIFZhbGlkIHhyYW5nZXMgaGF2ZSBhdCBtb3N0IG1pbihzeXMubWF4aW50LCBzeXMubWF4c2l6ZSkgZWxlbWVudHMuCisgICAgICAgIE0gPSBtaW4oc3lzLm1heGludCwgc3lzLm1heHNpemUpCisKKyAgICAgICAgdGVzdGNhc2VzID0gWworICAgICAgICAgICAgKDEzLCksCisgICAgICAgICAgICAoMCwgMTEpLAorICAgICAgICAgICAgKC0yMiwgMTApLAorICAgICAgICAgICAgKDIwLCAzLCAtMSksCisgICAgICAgICAgICAoMTMsIDIxLCAzKSwKKyAgICAgICAgICAgICgtMiwgMiwgMiksCisgICAgICAgICAgICAoMCwgTSwgMSksCisgICAgICAgICAgICAoTSwgMCwgLTEpLAorICAgICAgICAgICAgKDAsIE0sIE0gLSAxKSwKKyAgICAgICAgICAgIChNIC8vIDIsIE0sIDEpLAorICAgICAgICAgICAgKDAsIC1NLCAtMSksCisgICAgICAgICAgICAoMCwgLU0sIDEgLSBNKSwKKyAgICAgICAgICAgICgtTSwgTSwgMiksCisgICAgICAgICAgICAoLU0sIE0sIDEwMjQpLAorICAgICAgICAgICAgKC1NLCBNLCAxMDU4NSksCisgICAgICAgICAgICAoTSwgLU0sIC0yKSwKKyAgICAgICAgICAgIChNLCAtTSwgLTEwMjQpLAorICAgICAgICAgICAgKE0sIC1NLCAtMTA1ODUpLAorICAgICAgICAgICAgXQorICAgICAgICBmb3IgdCBpbiB0ZXN0Y2FzZXM6CisgICAgICAgICAgICByID0geHJhbmdlKCp0KQorICAgICAgICAgICAgcl9vdXQgPSBldmFsKHJlcHIocikpCisgICAgICAgICAgICBzZWxmLmFzc2VydF94cmFuZ2VzX2VxdWl2YWxlbnQociwgcl9vdXQpCisKKyAgICBkZWYgdGVzdF9yYW5nZV9pdGVyYXRvcnMoc2VsZik6CisgICAgICAgICMgc2VlIGlzc3VlIDcyOTgKKyAgICAgICAgbGltaXRzID0gW2Jhc2UgKyBqaWdnbGUKKyAgICAgICAgICAgICAgICAgIGZvciBNIGluICgyKiozMiwgMioqNjQpCisgICAgICAgICAgICAgICAgICBmb3IgYmFzZSBpbiAoLU0sIC1NLy8yLCAwLCBNLy8yLCBNKQorICAgICAgICAgICAgICAgICAgZm9yIGppZ2dsZSBpbiAoLTIsIC0xLCAwLCAxLCAyKV0KKyAgICAgICAgdGVzdF9yYW5nZXMgPSBbKHN0YXJ0LCBlbmQsIHN0ZXApCisgICAgICAgICAgICAgICAgICAgICAgIGZvciBzdGFydCBpbiBsaW1pdHMKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIGVuZCBpbiBsaW1pdHMKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHN0ZXAgaW4gKC0yKio2MywgLTIqKjMxLCAtMiwgLTEsIDEsIDIpXQorCisgICAgICAgIGZvciBzdGFydCwgZW5kLCBzdGVwIGluIHRlc3RfcmFuZ2VzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGl0ZXIxID0geHJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApCisgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGl0ZXIyID0gcHlyYW5nZShzdGFydCwgZW5kLCBzdGVwKQorICAgICAgICAgICAgICAgIHRlc3RfaWQgPSAieHJhbmdlKHt9LCB7fSwge30pIi5mb3JtYXQoc3RhcnQsIGVuZCwgc3RlcCkKKyAgICAgICAgICAgICAgICAjIGNoZWNrIGZpcnN0IDEwMCBlbnRyaWVzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfaXRlcmF0b3JzX2VxdWFsKGl0ZXIxLCBpdGVyMiwgdGVzdF9pZCwgbGltaXQ9MTAwKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXRlcjEgPSByZXZlcnNlZCh4cmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCkpCisgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGl0ZXIyID0gcHlyYW5nZV9yZXZlcnNlZChzdGFydCwgZW5kLCBzdGVwKQorICAgICAgICAgICAgICAgIHRlc3RfaWQgPSAicmV2ZXJzZWQoeHJhbmdlKHt9LCB7fSwge30pKSIuZm9ybWF0KHN0YXJ0LCBlbmQsIHN0ZXApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfaXRlcmF0b3JzX2VxdWFsKGl0ZXIxLCBpdGVyMiwgdGVzdF9pZCwgbGltaXQ9MTAwKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoWHJhbmdlVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeHJhbmdlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hyYW5nZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4YzA4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hyYW5nZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeHJhbmdlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hyYW5nZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4YzA4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hyYW5nZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwZmlsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzYTI4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGZpbGUucHkKQEAgLTAsMCArMSwxNTM4IEBACisjIFdlIGNhbiB0ZXN0IHBhcnQgb2YgdGhlIG1vZHVsZSB3aXRob3V0IHpsaWIuCit0cnk6CisgICAgaW1wb3J0IHpsaWIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB6bGliID0gTm9uZQorCitpbXBvcnQgb3MKK2ltcG9ydCBpbworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB6aXBmaWxlCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gdGVtcGZpbGUgaW1wb3J0IFRlbXBvcmFyeUZpbGUKK2Zyb20gcmFuZG9tIGltcG9ydCByYW5kaW50LCByYW5kb20KK2Zyb20gdW5pdHRlc3QgaW1wb3J0IHNraXBVbmxlc3MKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBURVNURk5fVU5JQ09ERSwgVEVTVEZOX0VOQ09ESU5HLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fdW5pdHRlc3QsIGZpbmRmaWxlLCB1bmxpbmsKK3RyeToKKyAgICBURVNURk5fVU5JQ09ERS5lbmNvZGUoVEVTVEZOX0VOQ09ESU5HKQorZXhjZXB0IChVbmljb2RlRXJyb3IsIFR5cGVFcnJvcik6CisgICAgIyBFaXRoZXIgdGhlIGZpbGUgc3lzdGVtIGVuY29kaW5nIGlzIE5vbmUsIG9yIHRoZSBmaWxlIG5hbWUKKyAgICAjIGNhbm5vdCBiZSBlbmNvZGVkIGluIHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZy4KKyAgICBURVNURk5fVU5JQ09ERSA9IE5vbmUKKworVEVTVEZOMiA9IFRFU1RGTiArICIyIgorVEVTVEZORElSID0gVEVTVEZOICsgImQiCitGSVhFRFRFU1RfU0laRSA9IDEwMDAKKworU01BTExfVEVTVF9EQVRBID0gWygnX3ppcHRlc3QxJywgJzFxMnczZTRyNXQnKSwKKyAgICAgICAgICAgICAgICAgICAoJ3ppcHRlc3QyZGlyL196aXB0ZXN0MicsICdxYXdzZWRyZnRnJyksCisgICAgICAgICAgICAgICAgICAgKCd6aXB0ZXN0MmRpci96aXB0ZXN0M2Rpci9femlwdGVzdDMnLCAnYXpzeGRjZnZnYicpLAorICAgICAgICAgICAgICAgICAgICgnemlwdGVzdDJkaXIvemlwdGVzdDNkaXIvemlwdGVzdDRkaXIvX3ppcHRlc3QzJywgJzZ5N3U4aTlvMHAnKV0KKworCitjbGFzcyBUZXN0c1dpdGhTb3VyY2VGaWxlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubGluZV9nZW4gPSBbIlppcGZpbGUgdGVzdCBsaW5lICVkLiByYW5kb20gZmxvYXQ6ICVmIiAlIChpLCByYW5kb20oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoRklYRURURVNUX1NJWkUpXQorICAgICAgICBzZWxmLmRhdGEgPSAnXG4nLmpvaW4oc2VsZi5saW5lX2dlbikgKyAnXG4nCisKKyAgICAgICAgIyBNYWtlIGEgc291cmNlIGZpbGUgd2l0aCBzb21lIGxpbmVzCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICJ3YiIpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5kYXRhKQorCisgICAgZGVmIG1ha2VfdGVzdF9hcmNoaXZlKHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgIyBDcmVhdGUgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJ3IiwgY29tcHJlc3Npb24pIGFzIHppcGZwOgorICAgICAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCAiYW5vdGhlci5uYW1lIikKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgVEVTVEZOKQorICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoInN0cmZpbGUiLCBzZWxmLmRhdGEpCisKKyAgICBkZWYgemlwX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiLCBjb21wcmVzc2lvbikgYXMgemlwZnA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoVEVTVEZOKSwgc2VsZi5kYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKCJhbm90aGVyLm5hbWUiKSwgc2VsZi5kYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKCJzdHJmaWxlIiksIHNlbGYuZGF0YSkKKworICAgICAgICAgICAgIyBQcmludCB0aGUgWklQIGRpcmVjdG9yeQorICAgICAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgICAgICBzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IGZwCisgICAgICAgICAgICAgICAgemlwZnAucHJpbnRkaXIoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3Rkb3V0CisKKyAgICAgICAgICAgIGRpcmVjdG9yeSA9IGZwLmdldHZhbHVlKCkKKyAgICAgICAgICAgIGxpbmVzID0gZGlyZWN0b3J5LnNwbGl0bGluZXMoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGluZXMpLCA0KSAjIE51bWJlciBvZiBmaWxlcyArIGhlYWRlcgorCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdGaWxlIE5hbWUnLCBsaW5lc1swXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ01vZGlmaWVkJywgbGluZXNbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdTaXplJywgbGluZXNbMF0pCisKKyAgICAgICAgICAgIGZuLCBkYXRlLCB0aW1lXywgc2l6ZSA9IGxpbmVzWzFdLnNwbGl0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm4sICdhbm90aGVyLm5hbWUnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWUuc3RycHRpbWUoZGF0ZSwgJyVZLSVtLSVkJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZS5zdHJwdGltZSh0aW1lXywgJyVIOiVNOiVTJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemUsIHN0cihsZW4oc2VsZi5kYXRhKSkpCisKKyAgICAgICAgICAgICMgQ2hlY2sgdGhlIG5hbWVsaXN0CisgICAgICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5hbWVzKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oVEVTVEZOLCBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImFub3RoZXIubmFtZSIsIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigic3RyZmlsZSIsIG5hbWVzKQorCisgICAgICAgICAgICAjIENoZWNrIGluZm9saXN0CisgICAgICAgICAgICBpbmZvcyA9IHppcGZwLmluZm9saXN0KCkKKyAgICAgICAgICAgIG5hbWVzID0gW2kuZmlsZW5hbWUgZm9yIGkgaW4gaW5mb3NdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuYW1lcyksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKFRFU1RGTiwgbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJhbm90aGVyLm5hbWUiLCBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oInN0cmZpbGUiLCBuYW1lcykKKyAgICAgICAgICAgIGZvciBpIGluIGluZm9zOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5maWxlX3NpemUsIGxlbihzZWxmLmRhdGEpKQorCisgICAgICAgICAgICAjIGNoZWNrIGdldGluZm8KKyAgICAgICAgICAgIGZvciBubSBpbiAoVEVTVEZOLCAiYW5vdGhlci5uYW1lIiwgInN0cmZpbGUiKToKKyAgICAgICAgICAgICAgICBpbmZvID0gemlwZnAuZ2V0aW5mbyhubSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm8uZmlsZW5hbWUsIG5tKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mby5maWxlX3NpemUsIGxlbihzZWxmLmRhdGEpKQorCisgICAgICAgICAgICAjIENoZWNrIHRoYXQgdGVzdHppcCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgemlwZnAudGVzdHppcCgpCisKKyAgICBkZWYgdGVzdF9zdG9yZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgemlwX29wZW5fdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIsIGNvbXByZXNzaW9uKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGRhdGExID0gW10KKyAgICAgICAgICAgIHdpdGggemlwZnAub3BlbihURVNURk4pIGFzIHppcG9wZW4xOgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHJlYWRfZGF0YSA9IHppcG9wZW4xLnJlYWQoMjU2KQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVhZF9kYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgemlwZGF0YTEuYXBwZW5kKHJlYWRfZGF0YSkKKworICAgICAgICAgICAgemlwZGF0YTIgPSBbXQorICAgICAgICAgICAgd2l0aCB6aXBmcC5vcGVuKCJhbm90aGVyLm5hbWUiKSBhcyB6aXBvcGVuMjoKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICByZWFkX2RhdGEgPSB6aXBvcGVuMi5yZWFkKDI1NikKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWRfZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHppcGRhdGEyLmFwcGVuZChyZWFkX2RhdGEpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuam9pbih6aXBkYXRhMSksIHNlbGYuZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuam9pbih6aXBkYXRhMiksIHNlbGYuZGF0YSkKKworICAgIGRlZiB0ZXN0X29wZW5fc3RvcmVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX29wZW5fdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgdGVzdF9vcGVuX3ZpYV96aXBfaW5mbyhzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCJuYW1lIiwgImZvbyIpCisgICAgICAgICAgICB6aXBmcC53cml0ZXN0cigibmFtZSIsICJiYXIiKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICBpbmZvcyA9IHppcGZwLmluZm9saXN0KCkKKyAgICAgICAgICAgIGRhdGEgPSAiIgorICAgICAgICAgICAgZm9yIGluZm8gaW4gaW5mb3M6CisgICAgICAgICAgICAgICAgd2l0aCB6aXBmcC5vcGVuKGluZm8pIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gZi5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhID09ICJmb29iYXIiIG9yIGRhdGEgPT0gImJhcmZvbyIpCisgICAgICAgICAgICBkYXRhID0gIiIKKyAgICAgICAgICAgIGZvciBpbmZvIGluIGluZm9zOgorICAgICAgICAgICAgICAgIGRhdGEgKz0gemlwZnAucmVhZChpbmZvKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhdGEgPT0gImZvb2JhciIgb3IgZGF0YSA9PSAiYmFyZm9vIikKKworICAgIGRlZiB6aXBfcmFuZG9tX29wZW5fdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIsIGNvbXByZXNzaW9uKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGRhdGExID0gW10KKyAgICAgICAgICAgIHdpdGggemlwZnAub3BlbihURVNURk4pIGFzIHppcG9wZW4xOgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHJlYWRfZGF0YSA9IHppcG9wZW4xLnJlYWQocmFuZGludCgxLCAxMDI0KSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWRfZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHppcGRhdGExLmFwcGVuZChyZWFkX2RhdGEpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuam9pbih6aXBkYXRhMSksIHNlbGYuZGF0YSkKKworICAgIGRlZiB0ZXN0X3JhbmRvbV9vcGVuX3N0b3JlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF9yYW5kb21fb3Blbl90ZXN0KGYsIHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgIGRlZiB0ZXN0X3VuaXZlcmFsX3JlYWRhaGVhZHMoc2VsZik6CisgICAgICAgIGYgPSBTdHJpbmdJTygpCisKKyAgICAgICAgZGF0YSA9ICdhXHJcbicgKiAxNiAqIDEwMjQKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgJ3cnLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGZwOgorICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoVEVTVEZOLCBkYXRhKQorCisgICAgICAgIGRhdGEyID0gJycKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgJ3InKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHdpdGggemlwZnAub3BlbihURVNURk4sICdyVScpIGFzIHppcG9wZW46CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gemlwb3BlbjoKKyAgICAgICAgICAgICAgICAgICAgZGF0YTIgKz0gbGluZQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZGF0YTIucmVwbGFjZSgnXG4nLCAnXHJcbicpKQorCisgICAgZGVmIHppcF9yZWFkbGluZV9yZWFkX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHdpdGggemlwZnAub3BlbihURVNURk4pIGFzIHppcG9wZW46CisgICAgICAgICAgICAgICAgZGF0YSA9ICcnCisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmVhZCA9IHppcG9wZW4ucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVhZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gcmVhZAorCisgICAgICAgICAgICAgICAgICAgIHJlYWQgPSB6aXBvcGVuLnJlYWQoMTAwKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVhZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gcmVhZAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgc2VsZi5kYXRhKQorCisgICAgZGVmIHppcF9yZWFkbGluZV90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKKworICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oVEVTVEZOKSBhcyB6aXBvcGVuOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYubGluZV9nZW46CisgICAgICAgICAgICAgICAgICAgIGxpbmVkYXRhID0gemlwb3Blbi5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZWRhdGEsIGxpbmUgKyAnXG4nKQorCisgICAgZGVmIHppcF9yZWFkbGluZXNfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIpIGFzIHppcGZwOgorICAgICAgICAgICAgd2l0aCB6aXBmcC5vcGVuKFRFU1RGTikgYXMgem86CisgICAgICAgICAgICAgICAgemlwbGluZXMgPSB6by5yZWFkbGluZXMoKQorICAgICAgICAgICAgICAgIGZvciBsaW5lLCB6aXBsaW5lIGluIHppcChzZWxmLmxpbmVfZ2VuLCB6aXBsaW5lcyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwbGluZSwgbGluZSArICdcbicpCisKKyAgICBkZWYgemlwX2l0ZXJsaW5lc190ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKKworICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICBmb3IgbGluZSwgemlwbGluZSBpbiB6aXAoc2VsZi5saW5lX2dlbiwgemlwZnAub3BlbihURVNURk4pKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGxpbmUsIGxpbmUgKyAnXG4nKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVfcmVhZF9zdG9yZWQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzc2MTA6IGNhbGxzIHRvIHJlYWRsaW5lKCkgaW50ZXJsZWF2ZWQgd2l0aCBjYWxscyB0byByZWFkKCkuCisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfcmVhZGxpbmVfcmVhZF90ZXN0KGYsIHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lX3N0b3JlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF9yZWFkbGluZV90ZXN0KGYsIHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lc19zdG9yZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfcmVhZGxpbmVzX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgZGVmIHRlc3RfaXRlcmxpbmVzX3N0b3JlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF9pdGVybGluZXNfdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfZGVmbGF0ZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfdGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9vcGVuX2RlZmxhdGVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX29wZW5fdGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9yYW5kb21fb3Blbl9kZWZsYXRlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF9yYW5kb21fb3Blbl90ZXN0KGYsIHppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3JlYWRsaW5lX3JlYWRfZGVmbGF0ZWQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzc2MTA6IGNhbGxzIHRvIHJlYWRsaW5lKCkgaW50ZXJsZWF2ZWQgd2l0aCBjYWxscyB0byByZWFkKCkuCisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfcmVhZGxpbmVfcmVhZF90ZXN0KGYsIHppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3JlYWRsaW5lX2RlZmxhdGVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX3JlYWRsaW5lX3Rlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzX2RlZmxhdGVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX3JlYWRsaW5lc190ZXN0KGYsIHppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X2l0ZXJsaW5lc19kZWZsYXRlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF9pdGVybGluZXNfdGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9sb3dfY29tcHJlc3Npb24oc2VsZik6CisgICAgICAgICIiIkNoZWNrIGZvciBjYXNlcyB3aGVyZSBjb21wcmVzc2VkIGRhdGEgaXMgbGFyZ2VyIHRoYW4gb3JpZ2luYWwuIiIiCisgICAgICAgICMgQ3JlYXRlIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIsIHppcGZpbGUuWklQX0RFRkxBVEVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCJzdHJmaWxlIiwgJzEyJykKKworICAgICAgICAjIEdldCBhbiBvcGVuIG9iamVjdCBmb3Igc3RyZmlsZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAiciIsIHppcGZpbGUuWklQX0RFRkxBVEVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHdpdGggemlwZnAub3Blbigic3RyZmlsZSIpIGFzIG9wZW5vYmo6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVub2JqLnJlYWQoMSksICcxJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZW5vYmoucmVhZCgxKSwgJzInKQorCisgICAgZGVmIHRlc3RfYWJzb2x1dGVfYXJjbmFtZXMoc2VsZik6CisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgIi9hYnNvbHV0ZSIpCisKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInIiLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGZwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5uYW1lbGlzdCgpLCBbImFic29sdXRlIl0pCisKKyAgICBkZWYgdGVzdF9hcHBlbmRfdG9femlwX2ZpbGUoc2VsZik6CisgICAgICAgICIiIlRlc3QgYXBwZW5kaW5nIHRvIGFuIGV4aXN0aW5nIHppcGZpbGUuIiIiCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgVEVTVEZOKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJhIiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCJzdHJmaWxlIiwgc2VsZi5kYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5uYW1lbGlzdCgpLCBbVEVTVEZOLCAic3RyZmlsZSJdKQorCisgICAgZGVmIHRlc3RfYXBwZW5kX3RvX25vbl96aXBfZmlsZShzZWxmKToKKyAgICAgICAgIiIiVGVzdCBhcHBlbmRpbmcgdG8gYW4gZXhpc3RpbmcgZmlsZSB0aGF0IGlzIG5vdCBhIHppcGZpbGUuIiIiCisgICAgICAgICMgTk9URTogdGhpcyB0ZXN0IGZhaWxzIGlmIGxlbihkKSA8IDIyIGJlY2F1c2Ugb2YgdGhlIGZpcnN0CisgICAgICAgICMgbGluZSAiZnBpbi5zZWVrKC0yMiwgMikiIGluIF9FbmRSZWNEYXRhCisgICAgICAgIGRhdGEgPSAnSSBhbSBub3QgYSBaaXBGaWxlIScqMTAKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTjIsICd3YicpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgImEiLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGZwOgorICAgICAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCBURVNURk4pCisKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTjIsICdyYicpIGFzIGY6CisgICAgICAgICAgICBmLnNlZWsobGVuKGRhdGEpKQorICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLm5hbWVsaXN0KCksIFtURVNURk5dKQorCisgICAgZGVmIHRlc3RfaWdub3Jlc19uZXdsaW5lX2F0X2VuZChzZWxmKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGZwOgorICAgICAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCBURVNURk4pCisgICAgICAgIHdpdGggb3BlbihURVNURk4yLCAnYScpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCJcclxuXDAwXDAwXDAwIikKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh6aXBmcCwgemlwZmlsZS5aaXBGaWxlKQorCisgICAgZGVmIHRlc3RfaWdub3Jlc19zdHVmZl9hcHBlbmRlZF9wYXN0X2NvbW1lbnRzKHNlbGYpOgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBmcC5jb21tZW50ID0gYiJ0aGlzIGlzIGEgY29tbWVudCIKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgVEVTVEZOKQorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ2EnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgiYWJjZGVmXHJcbiIpCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoemlwZnAsIHppcGZpbGUuWmlwRmlsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAuY29tbWVudCwgYiJ0aGlzIGlzIGEgY29tbWVudCIpCisKKyAgICBkZWYgdGVzdF93cml0ZV9kZWZhdWx0X25hbWUoc2VsZik6CisgICAgICAgICIiIkNoZWNrIHRoYXQgY2FsbGluZyBaaXBGaWxlLndyaXRlIHdpdGhvdXQgYXJjbmFtZSBzcGVjaWZpZWQKKyAgICAgICAgcHJvZHVjZXMgdGhlIGV4cGVjdGVkIHJlc3VsdC4iIiIKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZChURVNURk4pLCBvcGVuKFRFU1RGTikucmVhZCgpKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3Blcl9maWxlX2NvbXByZXNzaW9uKHNlbGYpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGZpbGVzIHdpdGhpbiBhIFppcCBhcmNoaXZlIGNhbiBoYXZlIGRpZmZlcmVudAorICAgICAgICBjb21wcmVzc2lvbiBvcHRpb25zLiIiIgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIpIGFzIHppcGZwOgorICAgICAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCAnc3RvcmVtZScsIHppcGZpbGUuWklQX1NUT1JFRCkKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgJ2RlZmxhdGVtZScsIHppcGZpbGUuWklQX0RFRkxBVEVEKQorICAgICAgICAgICAgc2luZm8gPSB6aXBmcC5nZXRpbmZvKCdzdG9yZW1lJykKKyAgICAgICAgICAgIGRpbmZvID0gemlwZnAuZ2V0aW5mbygnZGVmbGF0ZW1lJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2luZm8uY29tcHJlc3NfdHlwZSwgemlwZmlsZS5aSVBfU1RPUkVEKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaW5mby5jb21wcmVzc190eXBlLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIGRlZiB0ZXN0X3dyaXRlX3RvX3JlYWRvbmx5KHNlbGYpOgorICAgICAgICAiIiJDaGVjayB0aGF0IHRyeWluZyB0byBjYWxsIHdyaXRlKCkgb24gYSByZWFkb25seSBaaXBGaWxlIG9iamVjdAorICAgICAgICByYWlzZXMgYSBSdW50aW1lRXJyb3IuIiIiCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsIG1vZGU9InciKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCJzb21lZmlsZS50eHQiLCAiYm9ndXMiKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsIG1vZGU9InIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZnAud3JpdGUsIFRFU1RGTikKKworICAgIGRlZiB0ZXN0X2V4dHJhY3Qoc2VsZik6CisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZvciBmcGF0aCwgZmRhdGEgaW4gU01BTExfVEVTVF9EQVRBOgorICAgICAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKGZwYXRoLCBmZGF0YSkKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAiciIpIGFzIHppcGZwOgorICAgICAgICAgICAgZm9yIGZwYXRoLCBmZGF0YSBpbiBTTUFMTF9URVNUX0RBVEE6CisgICAgICAgICAgICAgICAgd3JpdHRlbmZpbGUgPSB6aXBmcC5leHRyYWN0KGZwYXRoKQorCisgICAgICAgICAgICAgICAgIyBtYWtlIHN1cmUgaXQgd2FzIHdyaXR0ZW4gdG8gdGhlIHJpZ2h0IHBsYWNlCisgICAgICAgICAgICAgICAgY29ycmVjdGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIGZwYXRoKQorICAgICAgICAgICAgICAgIGNvcnJlY3RmaWxlID0gb3MucGF0aC5ub3JtcGF0aChjb3JyZWN0ZmlsZSkKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JpdHRlbmZpbGUsIGNvcnJlY3RmaWxlKQorCisgICAgICAgICAgICAgICAgIyBtYWtlIHN1cmUgY29ycmVjdCBkYXRhIGlzIGluIGNvcnJlY3QgZmlsZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmRhdGEsIG9wZW4od3JpdHRlbmZpbGUsICJyYiIpLnJlYWQoKSkKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUod3JpdHRlbmZpbGUpCisKKyAgICAgICAgIyByZW1vdmUgdGhlIHRlc3QgZmlsZSBzdWJkaXJlY3RvcmllcworICAgICAgICBzaHV0aWwucm10cmVlKG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgJ3ppcHRlc3QyZGlyJykpCisKKyAgICBkZWYgdGVzdF9leHRyYWN0X2FsbChzZWxmKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGZwOgorICAgICAgICAgICAgZm9yIGZwYXRoLCBmZGF0YSBpbiBTTUFMTF9URVNUX0RBVEE6CisgICAgICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoZnBhdGgsIGZkYXRhKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBmcC5leHRyYWN0YWxsKCkKKyAgICAgICAgICAgIGZvciBmcGF0aCwgZmRhdGEgaW4gU01BTExfVEVTVF9EQVRBOgorICAgICAgICAgICAgICAgIG91dGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIGZwYXRoKQorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmZGF0YSwgb3BlbihvdXRmaWxlLCAicmIiKS5yZWFkKCkpCisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKG91dGZpbGUpCisKKyAgICAgICAgIyByZW1vdmUgdGhlIHRlc3QgZmlsZSBzdWJkaXJlY3RvcmllcworICAgICAgICBzaHV0aWwucm10cmVlKG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgJ3ppcHRlc3QyZGlyJykpCisKKyAgICBkZWYgY2hlY2tfZmlsZShzZWxmLCBmaWxlbmFtZSwgY29udGVudCk6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShmaWxlbmFtZSkpCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGNvbnRlbnQpCisKKyAgICBAc2tpcFVubGVzcyhURVNURk5fVU5JQ09ERSwgIk5vIFVuaWNvZGUgZmlsZXN5c3RlbSBzZW1hbnRpY3Mgb24gdGhpcyBwbGF0Zm9ybS4iKQorICAgIGRlZiB0ZXN0X2V4dHJhY3RfdW5pY29kZV9maWxlbmFtZXMoc2VsZik6CisgICAgICAgIGZuYW1lcyA9IFt1J2Zvby50eHQnLCBvcy5wYXRoLmJhc2VuYW1lKFRFU1RGTl9VTklDT0RFKV0KKyAgICAgICAgY29udGVudCA9ICdUZXN0IGZvciB1bmljb2RlIGZpbGVuYW1lJworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZnA6CisgICAgICAgICAgICBmb3IgZm5hbWUgaW4gZm5hbWVzOgorICAgICAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKGZuYW1lLCBjb250ZW50KQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICBmb3IgZm5hbWUgaW4gZm5hbWVzOgorICAgICAgICAgICAgICAgIHdyaXR0ZW5maWxlID0gemlwZnAuZXh0cmFjdChmbmFtZSkKKworICAgICAgICAgICAgICAgICMgbWFrZSBzdXJlIGl0IHdhcyB3cml0dGVuIHRvIHRoZSByaWdodCBwbGFjZQorICAgICAgICAgICAgICAgIGNvcnJlY3RmaWxlID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBmbmFtZSkKKyAgICAgICAgICAgICAgICBjb3JyZWN0ZmlsZSA9IG9zLnBhdGgubm9ybXBhdGgoY29ycmVjdGZpbGUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cml0dGVuZmlsZSwgY29ycmVjdGZpbGUpCisKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2ZpbGUod3JpdHRlbmZpbGUsIGNvbnRlbnQpCisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHdyaXR0ZW5maWxlKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdF9oYWNrZXJzX2FyY25hbWVzKHNlbGYpOgorICAgICAgICBoYWNrbmFtZXMgPSBbCisgICAgICAgICAgICAoJy4uL2Zvby9iYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgKCdmb28vLi4vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICgnZm9vLy4uLy4uL2JhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAoJ2Zvby9iYXIvLi4nLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgKCcuLy4uL2Zvby9iYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgKCcvZm9vL2JhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAoJy9mb28vLi4vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICgnL2Zvby8uLi8uLi9iYXInLCAnZm9vL2JhcicpLAorICAgICAgICBdCisgICAgICAgIGlmIG9zLnBhdGguc2VwID09ICdcXCc6CisgICAgICAgICAgICBoYWNrbmFtZXMuZXh0ZW5kKFsKKyAgICAgICAgICAgICAgICAocicuLlxmb29cYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocicuLlwvZm9vXC9iYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJ2Zvby9cLi5cL2JhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInZm9vXC8uLi9cYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocidDOmZvby9iYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJ0M6L2Zvby9iYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJ0M6Ly9mb28vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocidDOlxmb29cYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocicvL2Nvbmt5L21vdW50cG9pbnQvZm9vL2JhcicsICdjb25reS9tb3VudHBvaW50L2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocidcXGNvbmt5XG1vdW50cG9pbnRcZm9vXGJhcicsICdjb25reS9tb3VudHBvaW50L2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocicvLy9jb25reS9tb3VudHBvaW50L2Zvby9iYXInLCAnY29ua3kvbW91bnRwb2ludC9mb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInXFxcY29ua3lcbW91bnRwb2ludFxmb29cYmFyJywgJ2Nvbmt5L21vdW50cG9pbnQvZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJy8vY29ua3kvL21vdW50cG9pbnQvZm9vL2JhcicsICdjb25reS9tb3VudHBvaW50L2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocidcXGNvbmt5XFxtb3VudHBvaW50XGZvb1xiYXInLCAnY29ua3kvbW91bnRwb2ludC9mb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInLy8/L0M6L2Zvby9iYXInLCAnXy9DXy9mb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInXFw/XEM6XGZvb1xiYXInLCAnXy9DXy9mb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInQzovLi4vQzovZm9vL2JhcicsICdDXy9mb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInYTpiXGM8ZD5lfGYiZz9oKmknLCAnYi9jX2RfZV9mX2dfaF9pJyksCisgICAgICAgICAgICAgICAgKCcuLi8uLi9mb28uLi8uLi9iYS4ucicsICdmb28vYmEuLnInKSwKKyAgICAgICAgICAgIF0pCisgICAgICAgIGVsc2U6ICAjIFVuaXgKKyAgICAgICAgICAgIGhhY2tuYW1lcy5leHRlbmQoWworICAgICAgICAgICAgICAgICgnLy9mb28vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAoJy4uLy4uL2Zvby4uLy4uL2JhLi5yJywgJ2Zvby4uL2JhLi5yJyksCisgICAgICAgICAgICAgICAgKHInZm9vLy4uXGJhcicsIHInZm9vLy4uXGJhcicpLAorICAgICAgICAgICAgXSkKKworICAgICAgICBmb3IgYXJjbmFtZSwgZml4ZWRuYW1lIGluIGhhY2tuYW1lczoKKyAgICAgICAgICAgIGNvbnRlbnQgPSBiJ2Zvb2JhcicgKyBhcmNuYW1lLmVuY29kZSgpCisgICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAndycsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZnA6CisgICAgICAgICAgICAgICAgemluZm8gPSB6aXBmaWxlLlppcEluZm8oKQorICAgICAgICAgICAgICAgICMgcHJlc2VydmUgYmFja3NsYXNoZXMKKyAgICAgICAgICAgICAgICB6aW5mby5maWxlbmFtZSA9IGFyY25hbWUKKyAgICAgICAgICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyID0gMG82MDAgPDwgMTYKKyAgICAgICAgICAgICAgICB6aXBmcC53cml0ZXN0cih6aW5mbywgY29udGVudCkKKworICAgICAgICAgICAgYXJjbmFtZSA9IGFyY25hbWUucmVwbGFjZShvcy5zZXAsICIvIikKKyAgICAgICAgICAgIHRhcmdldHBhdGggPSBvcy5wYXRoLmpvaW4oJ3RhcmdldCcsICdzdWJkaXInLCAnc3Vic3ViJykKKyAgICAgICAgICAgIGNvcnJlY3RmaWxlID0gb3MucGF0aC5qb2luKHRhcmdldHBhdGgsICpmaXhlZG5hbWUuc3BsaXQoJy8nKSkKKworICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3InKSBhcyB6aXBmcDoKKyAgICAgICAgICAgICAgICB3cml0dGVuZmlsZSA9IHppcGZwLmV4dHJhY3QoYXJjbmFtZSwgdGFyZ2V0cGF0aCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyaXR0ZW5maWxlLCBjb3JyZWN0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0iZXh0cmFjdCAlciIgJSBhcmNuYW1lKQorICAgICAgICAgICAgc2VsZi5jaGVja19maWxlKGNvcnJlY3RmaWxlLCBjb250ZW50KQorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSgndGFyZ2V0JykKKworICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3InKSBhcyB6aXBmcDoKKyAgICAgICAgICAgICAgICB6aXBmcC5leHRyYWN0YWxsKHRhcmdldHBhdGgpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2ZpbGUoY29ycmVjdGZpbGUsIGNvbnRlbnQpCisgICAgICAgICAgICBzaHV0aWwucm10cmVlKCd0YXJnZXQnKQorCisgICAgICAgICAgICBjb3JyZWN0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgKmZpeGVkbmFtZS5zcGxpdCgnLycpKQorCisgICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAncicpIGFzIHppcGZwOgorICAgICAgICAgICAgICAgIHdyaXR0ZW5maWxlID0gemlwZnAuZXh0cmFjdChhcmNuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JpdHRlbmZpbGUsIGNvcnJlY3RmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSJleHRyYWN0ICVyIiAlIGFyY25hbWUpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2ZpbGUoY29ycmVjdGZpbGUsIGNvbnRlbnQpCisgICAgICAgICAgICBzaHV0aWwucm10cmVlKGZpeGVkbmFtZS5zcGxpdCgnLycpWzBdKQorCisgICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAncicpIGFzIHppcGZwOgorICAgICAgICAgICAgICAgIHppcGZwLmV4dHJhY3RhbGwoKQorICAgICAgICAgICAgc2VsZi5jaGVja19maWxlKGNvcnJlY3RmaWxlLCBjb250ZW50KQorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShmaXhlZG5hbWUuc3BsaXQoJy8nKVswXSkKKworICAgICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTjIpCisKKyAgICBkZWYgdGVzdF93cml0ZXN0cl9jb21wcmVzc2lvbihzZWxmKToKKyAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciKQorICAgICAgICB6aXBmcC53cml0ZXN0cigiYS50eHQiLCAiaGVsbG8gd29ybGQiLCBjb21wcmVzc190eXBlPXppcGZpbGUuWklQX1NUT1JFRCkKKyAgICAgICAgaWYgemxpYjoKKyAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCJiLnR4dCIsICJoZWxsbyB3b3JsZCIsIGNvbXByZXNzX3R5cGU9emlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICAgICAgaW5mbyA9IHppcGZwLmdldGluZm8oJ2EudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvLmNvbXByZXNzX3R5cGUsIHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgICAgICBpZiB6bGliOgorICAgICAgICAgICAgaW5mbyA9IHppcGZwLmdldGluZm8oJ2IudHh0JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mby5jb21wcmVzc190eXBlLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworCisgICAgZGVmIHppcF90ZXN0X3dyaXRlc3RyX3Blcm1pc3Npb25zKHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3cml0ZXN0ciBjcmVhdGVzIGZpbGVzIHdpdGggbW9kZSAwNjAwLAorICAgICAgICAjIHdoZW4gaXQgaXMgcGFzc2VkIGEgbmFtZSByYXRoZXIgdGhhbiBhIFppcEluZm8gaW5zdGFuY2UuCisKKyAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppbmZvID0gemlwZnAuZ2V0aW5mbygnc3RyZmlsZScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppbmZvLmV4dGVybmFsX2F0dHIsIDA2MDAgPDwgMTYpCisKKyAgICBkZWYgdGVzdF93cml0ZXN0cl9wZXJtaXNzaW9ucyhzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF90ZXN0X3dyaXRlc3RyX3Blcm1pc3Npb25zKGYsIHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgIGRlZiB0ZXN0X2Nsb3NlKHNlbGYpOgorICAgICAgICAiIiJDaGVjayB0aGF0IHRoZSB6aXBmaWxlIGlzIGNsb3NlZCBhZnRlciB0aGUgJ3dpdGgnIGJsb2NrLiIiIgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIpIGFzIHppcGZwOgorICAgICAgICAgICAgZm9yIGZwYXRoLCBmZGF0YSBpbiBTTUFMTF9URVNUX0RBVEE6CisgICAgICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoZnBhdGgsIGZkYXRhKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh6aXBmcC5mcCBpcyBub3QgTm9uZSwgJ3ppcGZwIGlzIG5vdCBvcGVuJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHppcGZwLmZwIGlzIE5vbmUsICd6aXBmcCBpcyBub3QgY2xvc2VkJykKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAiciIpIGFzIHppcGZwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHppcGZwLmZwIGlzIG5vdCBOb25lLCAnemlwZnAgaXMgbm90IG9wZW4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoemlwZnAuZnAgaXMgTm9uZSwgJ3ppcGZwIGlzIG5vdCBjbG9zZWQnKQorCisgICAgZGVmIHRlc3RfY2xvc2Vfb25fZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAiIiJDaGVjayB0aGF0IHRoZSB6aXBmaWxlIGlzIGNsb3NlZCBpZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGluIHRoZQorICAgICAgICAnd2l0aCcgYmxvY2suIiIiCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IikgYXMgemlwZnA6CisgICAgICAgICAgICBmb3IgZnBhdGgsIGZkYXRhIGluIFNNQUxMX1RFU1RfREFUQToKKyAgICAgICAgICAgICAgICB6aXBmcC53cml0ZXN0cihmcGF0aCwgZmRhdGEpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInIiKSBhcyB6aXBmcDI6CisgICAgICAgICAgICAgICAgcmFpc2UgemlwZmlsZS5CYWRaaXBmaWxlKCkKKyAgICAgICAgZXhjZXB0IHppcGZpbGUuQmFkWmlwZmlsZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh6aXBmcDIuZnAgaXMgTm9uZSwgJ3ppcGZwIGlzIG5vdCBjbG9zZWQnKQorCisgICAgZGVmIHRlc3RfYWRkX2ZpbGVfYmVmb3JlXzE5ODAoc2VsZik6CisgICAgICAgICMgU2V0IGF0aW1lIGFuZCBtdGltZSB0byAxOTcwLTAxLTAxCisgICAgICAgIG9zLnV0aW1lKFRFU1RGTiwgKDAsIDApKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIpIGFzIHppcGZwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgemlwZnAud3JpdGUsIFRFU1RGTikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKyAgICAgICAgdW5saW5rKFRFU1RGTjIpCisKKworY2xhc3MgVGVzdFppcDY0SW5TbWFsbEZpbGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoZXNlIHRlc3RzIHRlc3QgdGhlIFpJUDY0IGZ1bmN0aW9uYWxpdHkgd2l0aG91dCB1c2luZyBsYXJnZSBmaWxlcywKKyAgICAjIHNlZSB0ZXN0X3ppcGZpbGU2NCBmb3IgcHJvcGVyIHRlc3RzLgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9saW1pdCA9IHppcGZpbGUuWklQNjRfTElNSVQKKyAgICAgICAgemlwZmlsZS5aSVA2NF9MSU1JVCA9IDUKKworICAgICAgICBsaW5lX2dlbiA9ICgiVGVzdCBvZiB6aXBmaWxlIGxpbmUgJWQuIiAlIGkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgRklYRURURVNUX1NJWkUpKQorICAgICAgICBzZWxmLmRhdGEgPSAnXG4nLmpvaW4obGluZV9nZW4pCisKKyAgICAgICAgIyBNYWtlIGEgc291cmNlIGZpbGUgd2l0aCBzb21lIGxpbmVzCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICJ3YiIpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5kYXRhKQorCisgICAgZGVmIGxhcmdlX2ZpbGVfZXhjZXB0aW9uX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAidyIsIGNvbXByZXNzaW9uKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHppcGZpbGUuTGFyZ2VaaXBGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZnAud3JpdGUsIFRFU1RGTiwgImFub3RoZXIubmFtZSIpCisKKyAgICBkZWYgbGFyZ2VfZmlsZV9leGNlcHRpb25fdGVzdDIoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAidyIsIGNvbXByZXNzaW9uKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHppcGZpbGUuTGFyZ2VaaXBGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZnAud3JpdGVzdHIsICJhbm90aGVyLm5hbWUiLCBzZWxmLmRhdGEpCisKKyAgICBkZWYgdGVzdF9sYXJnZV9maWxlX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLmxhcmdlX2ZpbGVfZXhjZXB0aW9uX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorICAgICAgICAgICAgc2VsZi5sYXJnZV9maWxlX2V4Y2VwdGlvbl90ZXN0MihmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgemlwX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICAjIENyZWF0ZSB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbiwgYWxsb3daaXA2ND1UcnVlKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgImFub3RoZXIubmFtZSIpCisgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4sIFRFU1RGTikKKyAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCJzdHJmaWxlIiwgc2VsZi5kYXRhKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiLCBjb21wcmVzc2lvbikgYXMgemlwZnA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoVEVTVEZOKSwgc2VsZi5kYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKCJhbm90aGVyLm5hbWUiKSwgc2VsZi5kYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKCJzdHJmaWxlIiksIHNlbGYuZGF0YSkKKworICAgICAgICAgICAgIyBQcmludCB0aGUgWklQIGRpcmVjdG9yeQorICAgICAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgICAgICBzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IGZwCisgICAgICAgICAgICAgICAgemlwZnAucHJpbnRkaXIoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3Rkb3V0CisKKyAgICAgICAgICAgIGRpcmVjdG9yeSA9IGZwLmdldHZhbHVlKCkKKyAgICAgICAgICAgIGxpbmVzID0gZGlyZWN0b3J5LnNwbGl0bGluZXMoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGluZXMpLCA0KSAjIE51bWJlciBvZiBmaWxlcyArIGhlYWRlcgorCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdGaWxlIE5hbWUnLCBsaW5lc1swXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ01vZGlmaWVkJywgbGluZXNbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdTaXplJywgbGluZXNbMF0pCisKKyAgICAgICAgICAgIGZuLCBkYXRlLCB0aW1lXywgc2l6ZSA9IGxpbmVzWzFdLnNwbGl0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm4sICdhbm90aGVyLm5hbWUnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWUuc3RycHRpbWUoZGF0ZSwgJyVZLSVtLSVkJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZS5zdHJwdGltZSh0aW1lXywgJyVIOiVNOiVTJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemUsIHN0cihsZW4oc2VsZi5kYXRhKSkpCisKKyAgICAgICAgICAgICMgQ2hlY2sgdGhlIG5hbWVsaXN0CisgICAgICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5hbWVzKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oVEVTVEZOLCBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImFub3RoZXIubmFtZSIsIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigic3RyZmlsZSIsIG5hbWVzKQorCisgICAgICAgICAgICAjIENoZWNrIGluZm9saXN0CisgICAgICAgICAgICBpbmZvcyA9IHppcGZwLmluZm9saXN0KCkKKyAgICAgICAgICAgIG5hbWVzID0gW2kuZmlsZW5hbWUgZm9yIGkgaW4gaW5mb3NdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuYW1lcyksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKFRFU1RGTiwgbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJhbm90aGVyLm5hbWUiLCBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oInN0cmZpbGUiLCBuYW1lcykKKyAgICAgICAgICAgIGZvciBpIGluIGluZm9zOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5maWxlX3NpemUsIGxlbihzZWxmLmRhdGEpKQorCisgICAgICAgICAgICAjIGNoZWNrIGdldGluZm8KKyAgICAgICAgICAgIGZvciBubSBpbiAoVEVTVEZOLCAiYW5vdGhlci5uYW1lIiwgInN0cmZpbGUiKToKKyAgICAgICAgICAgICAgICBpbmZvID0gemlwZnAuZ2V0aW5mbyhubSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm8uZmlsZW5hbWUsIG5tKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mby5maWxlX3NpemUsIGxlbihzZWxmLmRhdGEpKQorCisgICAgICAgICAgICAjIENoZWNrIHRoYXQgdGVzdHppcCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgemlwZnAudGVzdHppcCgpCisKKyAgICBkZWYgdGVzdF9zdG9yZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfZGVmbGF0ZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfdGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIGRlZiB0ZXN0X2Fic29sdXRlX2FyY25hbWVzKHNlbGYpOgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIsIHppcGZpbGUuWklQX1NUT1JFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3daaXA2ND1UcnVlKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgIi9hYnNvbHV0ZSIpCisKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInIiLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGZwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5uYW1lbGlzdCgpLCBbImFic29sdXRlIl0pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHppcGZpbGUuWklQNjRfTElNSVQgPSBzZWxmLl9saW1pdAorICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgICAgICB1bmxpbmsoVEVTVEZOMikKKworCitjbGFzcyBQeVppcEZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfd3JpdGVfcHlmaWxlKHNlbGYpOgorICAgICAgICB3aXRoIHppcGZpbGUuUHlaaXBGaWxlKFRlbXBvcmFyeUZpbGUoKSwgInciKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZuID0gX19maWxlX18KKyAgICAgICAgICAgIGlmIGZuLmVuZHN3aXRoKCcucHljJykgb3IgZm4uZW5kc3dpdGgoJy5weW8nKToKKyAgICAgICAgICAgICAgICBmbiA9IGZuWzotMV0KKworICAgICAgICAgICAgemlwZnAud3JpdGVweShmbikKKworICAgICAgICAgICAgYm4gPSBvcy5wYXRoLmJhc2VuYW1lKGZuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihibiwgemlwZnAubmFtZWxpc3QoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShibiArICdvJyBpbiB6aXBmcC5uYW1lbGlzdCgpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm4gKyAnYycgaW4gemlwZnAubmFtZWxpc3QoKSkKKworICAgICAgICB3aXRoIHppcGZpbGUuUHlaaXBGaWxlKFRlbXBvcmFyeUZpbGUoKSwgInciKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZuID0gX19maWxlX18KKyAgICAgICAgICAgIGlmIGZuLmVuZHN3aXRoKCgnLnB5YycsICcucHlvJykpOgorICAgICAgICAgICAgICAgIGZuID0gZm5bOi0xXQorCisgICAgICAgICAgICB6aXBmcC53cml0ZXB5KGZuLCAidGVzdHBhY2thZ2UiKQorCisgICAgICAgICAgICBibiA9ICIlcy8lcyIgJSAoInRlc3RwYWNrYWdlIiwgb3MucGF0aC5iYXNlbmFtZShmbikpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGJuLCB6aXBmcC5uYW1lbGlzdCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJuICsgJ28nIGluIHppcGZwLm5hbWVsaXN0KCkgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBibiArICdjJyBpbiB6aXBmcC5uYW1lbGlzdCgpKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfcHl0aG9uX3BhY2thZ2Uoc2VsZik6CisgICAgICAgIGltcG9ydCBlbWFpbAorICAgICAgICBwYWNrYWdlZGlyID0gb3MucGF0aC5kaXJuYW1lKGVtYWlsLl9fZmlsZV9fKQorCisgICAgICAgIHdpdGggemlwZmlsZS5QeVppcEZpbGUoVGVtcG9yYXJ5RmlsZSgpLCAidyIpIGFzIHppcGZwOgorICAgICAgICAgICAgemlwZnAud3JpdGVweShwYWNrYWdlZGlyKQorCisgICAgICAgICAgICAjIENoZWNrIGZvciBhIGNvdXBsZSBvZiBtb2R1bGVzIGF0IGRpZmZlcmVudCBsZXZlbHMgb2YgdGhlCisgICAgICAgICAgICAjIGhpZXJhcmNoeQorICAgICAgICAgICAgbmFtZXMgPSB6aXBmcC5uYW1lbGlzdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2VtYWlsL19faW5pdF9fLnB5bycgaW4gbmFtZXMgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW1haWwvX19pbml0X18ucHljJyBpbiBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZW1haWwvbWltZS90ZXh0LnB5bycgaW4gbmFtZXMgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW1haWwvbWltZS90ZXh0LnB5YycgaW4gbmFtZXMpCisKKyAgICBkZWYgdGVzdF93cml0ZV9weXRob25fZGlyZWN0b3J5KHNlbGYpOgorICAgICAgICBvcy5ta2RpcihURVNURk4yKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKFRFU1RGTjIsICJtb2QxLnB5IiksICJ3IikgYXMgZnA6CisgICAgICAgICAgICAgICAgZnAud3JpdGUoInByaW50KDQyKVxuIikKKworICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihURVNURk4yLCAibW9kMi5weSIpLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKCJwcmludCg0MiAqIDQyKVxuIikKKworICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihURVNURk4yLCAibW9kMi50eHQiKSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBmcC53cml0ZSgiYmxhIGJsYSBibGFcbiIpCisKKyAgICAgICAgICAgIHppcGZwICA9IHppcGZpbGUuUHlaaXBGaWxlKFRlbXBvcmFyeUZpbGUoKSwgInciKQorICAgICAgICAgICAgemlwZnAud3JpdGVweShURVNURk4yKQorCisgICAgICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnbW9kMS5weWMnIGluIG5hbWVzIG9yICdtb2QxLnB5bycgaW4gbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ21vZDIucHljJyBpbiBuYW1lcyBvciAnbW9kMi5weW8nIGluIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbignbW9kMi50eHQnLCBuYW1lcykKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4yKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfbm9uX3B5ZmlsZShzZWxmKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlB5WmlwRmlsZShUZW1wb3JhcnlGaWxlKCksICJ3IikgYXMgemlwZnA6CisgICAgICAgICAgICBvcGVuKFRFU1RGTiwgJ3cnKS53cml0ZSgnbW9zdCBkZWZpbml0ZWx5IG5vdCBhIHB5dGhvbiBmaWxlJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZnAud3JpdGVweSwgVEVTVEZOKQorICAgICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKKworCitjbGFzcyBPdGhlclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICB6aXBzX3dpdGhfYmFkX2NyYyA9IHsKKyAgICAgICAgemlwZmlsZS5aSVBfU1RPUkVEOiAoCisgICAgICAgICAgICBiJ1BLXDAwM1wwMDRcMDI0XDBcMFwwXDBcMCBcMjEzXDIxMjs6cicKKyAgICAgICAgICAgIGInXDI1M1wzNzdcZlwwXDBcMFxmXDBcMFwwXDAwNVwwXDBcMDAwYWYnCisgICAgICAgICAgICBiJ2lsZWhlbGxvLEF3b3JsZFAnCisgICAgICAgICAgICBiJ0tcMDAxXDAwMlwwMjRcMDAzXDAyNFwwXDBcMFwwXDAgXDIxM1wyMTI7OicKKyAgICAgICAgICAgIGInclwyNTNcMzc3XGZcMFwwXDBcZlwwXDBcMFwwMDVcMFwwXDBcMCcKKyAgICAgICAgICAgIGInXDBcMFwwXDBcMFwwXDBcMjAwXDAwMVwwXDBcMFwwMDBhZmknCisgICAgICAgICAgICBiJ2xlUEtcMDA1XDAwNlwwXDBcMFwwXDAwMVwwXDAwMVwwMDAzXDAwMCcKKyAgICAgICAgICAgIGInXDBcMC9cMFwwXDBcMFwwJyksCisgICAgICAgIHppcGZpbGUuWklQX0RFRkxBVEVEOiAoCisgICAgICAgICAgICBiJ1BLXHgwM1x4MDRceDE0XHgwMFx4MDBceDAwXHgwOFx4MDBufVx4MGM9RkEnCisgICAgICAgICAgICBiJ0tFXHgxMFx4MDBceDAwXHgwMG5ceDAwXHgwMFx4MDBceDA1XHgwMFx4MDBceDAwYWYnCisgICAgICAgICAgICBiJ2lsZVx4Y2JIXHhjZFx4YzlceGM5VyhceGNmL1x4Y2FJXHhjOVx4YTAnCisgICAgICAgICAgICBiJz1ceDEzXHgwMFBLXHgwMVx4MDJceDE0XHgwM1x4MTRceDAwXHgwMFx4MDBceDA4XHgwMG4nCisgICAgICAgICAgICBiJ31ceDBjPUZBS0VceDEwXHgwMFx4MDBceDAwblx4MDBceDAwXHgwMFx4MDUnCisgICAgICAgICAgICBiJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHg4MFx4MDFceDAwXHgwMFx4MDAnCisgICAgICAgICAgICBiJ1x4MDBhZmlsZVBLXHgwNVx4MDZceDAwXHgwMFx4MDBceDAwXHgwMVx4MDAnCisgICAgICAgICAgICBiJ1x4MDFceDAwM1x4MDBceDAwXHgwMDNceDAwXHgwMFx4MDBceDAwXHgwMCcpLAorICAgIH0KKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfZmlsZW5hbWVzKHNlbGYpOgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sICJ3IikgYXMgemY6CisgICAgICAgICAgICB6Zi53cml0ZXN0cih1ImZvby50eHQiLCAiVGVzdCBmb3IgdW5pY29kZSBmaWxlbmFtZSIpCisgICAgICAgICAgICB6Zi53cml0ZXN0cih1Ilx4ZjYudHh0IiwgIlRlc3QgZm9yIHVuaWNvZGUgZmlsZW5hbWUiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHpmLmluZm9saXN0KClbMF0uZmlsZW5hbWUsIHVuaWNvZGUpCisKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCAiciIpIGFzIHpmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6Zi5maWxlbGlzdFswXS5maWxlbmFtZSwgImZvby50eHQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6Zi5maWxlbGlzdFsxXS5maWxlbmFtZSwgdSJceGY2LnR4dCIpCisKKyAgICBkZWYgdGVzdF9jcmVhdGVfbm9uX2V4aXN0ZW50X2ZpbGVfZm9yX2FwcGVuZChzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoVEVTVEZOKToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKKyAgICAgICAgZmlsZW5hbWUgPSAndGVzdGZpbGUudHh0JworICAgICAgICBjb250ZW50ID0gJ2hlbGxvLCB3b3JsZC4gdGhpcyBpcyBzb21lIGNvbnRlbnQuJworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgJ2EnKSBhcyB6ZjoKKyAgICAgICAgICAgICAgICB6Zi53cml0ZXN0cihmaWxlbmFtZSwgY29udGVudCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ0NvdWxkIG5vdCBhcHBlbmQgZGF0YSB0byBhIG5vbi1leGlzdGVudCB6aXAgZmlsZS4nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhURVNURk4pKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgJ3InKSBhcyB6ZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemYucmVhZChmaWxlbmFtZSksIGNvbnRlbnQpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9lcnJvbmVvdXNfZmlsZShzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3QgY2hlY2tzIHRoYXQgdGhlIFppcEZpbGUgY29uc3RydWN0b3IgY2xvc2VzIHRoZSBmaWxlIG9iamVjdAorICAgICAgICAjIGl0IG9wZW5zIGlmIHRoZXJlJ3MgYW4gZXJyb3IgaW4gdGhlIGZpbGUuICBJZiBpdCBkb2Vzbid0LCB0aGUKKyAgICAgICAgIyB0cmFjZWJhY2sgaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIFppcEZpbGUgb2JqZWN0IGFuZCwgaW5kaXJlY3RseSwKKyAgICAgICAgIyB0aGUgZmlsZSBvYmplY3QuCisgICAgICAgICMgT24gV2luZG93cywgdGhpcyBjYXVzZXMgdGhlIG9zLnVubGluaygpIGNhbGwgdG8gZmFpbCBiZWNhdXNlIHRoZQorICAgICAgICAjIHVuZGVybHlpbmcgZmlsZSBpcyBzdGlsbCBvcGVuLiAgVGhpcyBpcyBTRiBidWcgIzQxMjIxNC4KKyAgICAgICAgIworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoInRoaXMgaXMgbm90IGEgbGVnYWwgemlwIGZpbGVcbiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHpmID0gemlwZmlsZS5aaXBGaWxlKFRFU1RGTikKKyAgICAgICAgZXhjZXB0IHppcGZpbGUuQmFkWmlwZmlsZToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2lzX3ppcF9lcnJvbmVvdXNfZmlsZShzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBpc196aXBmaWxlKCkgY29ycmVjdGx5IGlkZW50aWZpZXMgbm9uLXppcCBmaWxlcy4iIiIKKyAgICAgICAgIyAtIHBhc3NpbmcgYSBmaWxlbmFtZQorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoInRoaXMgaXMgbm90IGEgbGVnYWwgemlwIGZpbGVcbiIpCisgICAgICAgIGNoayA9IHppcGZpbGUuaXNfemlwZmlsZShURVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2hrKQorICAgICAgICAjIC0gcGFzc2luZyBhIGZpbGUgb2JqZWN0CisgICAgICAgIHdpdGggb3BlbihURVNURk4sICJyYiIpIGFzIGZwOgorICAgICAgICAgICAgY2hrID0gemlwZmlsZS5pc196aXBmaWxlKGZwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjaGspCisgICAgICAgICMgLSBwYXNzaW5nIGEgZmlsZS1saWtlIG9iamVjdAorICAgICAgICBmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZnAud3JpdGUoInRoaXMgaXMgbm90IGEgbGVnYWwgemlwIGZpbGVcbiIpCisgICAgICAgIGNoayA9IHppcGZpbGUuaXNfemlwZmlsZShmcCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjaGspCisgICAgICAgIGZwLnNlZWsoMCwgMCkKKyAgICAgICAgY2hrID0gemlwZmlsZS5pc196aXBmaWxlKGZwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNoaykKKworICAgIGRlZiB0ZXN0X2RhbWFnZWRfemlwZmlsZShzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCB6aXBmaWxlcyB3aXRoIG1pc3NpbmcgYnl0ZXMgYXQgdGhlIGVuZCByYWlzZSBCYWRaaXBGaWxlLiIiIgorICAgICAgICAjIC0gQ3JlYXRlIGEgdmFsaWQgemlwIGZpbGUKKyAgICAgICAgZnAgPSBpby5CeXRlc0lPKCkKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZnAsIG1vZGU9InciKSBhcyB6aXBmOgorICAgICAgICAgICAgemlwZi53cml0ZXN0cigiZm9vLnR4dCIsIGIiTywgZm9yIGEgTXVzZSBvZiBGaXJlISIpCisgICAgICAgIHppcGZpbGVkYXRhID0gZnAuZ2V0dmFsdWUoKQorCisgICAgICAgICMgLSBOb3cgY3JlYXRlIGNvcGllcyBvZiBpdCBtaXNzaW5nIHRoZSBsYXN0IE4gYnl0ZXMgYW5kIG1ha2Ugc3VyZQorICAgICAgICAjICAgYSBCYWRaaXBGaWxlIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiB3ZSB0cnkgdG8gb3BlbiBpdAorICAgICAgICBmb3IgTiBpbiByYW5nZShsZW4oemlwZmlsZWRhdGEpKToKKyAgICAgICAgICAgIGZwID0gaW8uQnl0ZXNJTyh6aXBmaWxlZGF0YVs6Tl0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh6aXBmaWxlLkJhZFppcGZpbGUsIHppcGZpbGUuWmlwRmlsZSwgZnApCisKKyAgICBkZWYgdGVzdF9pc196aXBfdmFsaWRfZmlsZShzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBpc196aXBmaWxlKCkgY29ycmVjdGx5IGlkZW50aWZpZXMgemlwIGZpbGVzLiIiIgorICAgICAgICAjIC0gcGFzc2luZyBhIGZpbGVuYW1lCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0idyIpIGFzIHppcGY6CisgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorICAgICAgICBjaGsgPSB6aXBmaWxlLmlzX3ppcGZpbGUoVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2hrKQorICAgICAgICAjIC0gcGFzc2luZyBhIGZpbGUgb2JqZWN0CisgICAgICAgIHdpdGggb3BlbihURVNURk4sICJyYiIpIGFzIGZwOgorICAgICAgICAgICAgY2hrID0gemlwZmlsZS5pc196aXBmaWxlKGZwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoaykKKyAgICAgICAgICAgIGZwLnNlZWsoMCwgMCkKKyAgICAgICAgICAgIHppcF9jb250ZW50cyA9IGZwLnJlYWQoKQorICAgICAgICAjIC0gcGFzc2luZyBhIGZpbGUtbGlrZSBvYmplY3QKKyAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGZwLndyaXRlKHppcF9jb250ZW50cykKKyAgICAgICAgY2hrID0gemlwZmlsZS5pc196aXBmaWxlKGZwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2hrKQorICAgICAgICBmcC5zZWVrKDAsIDApCisgICAgICAgIGNoayA9IHppcGZpbGUuaXNfemlwZmlsZShmcCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoaykKKworICAgIGRlZiB0ZXN0X25vbl9leGlzdGVudF9maWxlX3JhaXNlc19JT0Vycm9yKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBkb24ndCByYWlzZSBhbiBBdHRyaWJ1dGVFcnJvciB3aGVuIGEgcGFydGlhbGx5LWNvbnN0cnVjdGVkCisgICAgICAgICMgWmlwRmlsZSBpbnN0YW5jZSBpcyBmaW5hbGl6ZWQ7IHRoaXMgdGVzdHMgZm9yIHJlZ3Jlc3Npb24gb24gU0YgdHJhY2tlcgorICAgICAgICAjIGJ1ZyAjNDAzODcxLgorCisgICAgICAgICMgVGhlIGJ1ZyB3ZSdyZSB0ZXN0aW5nIGZvciBjYXVzZWQgYW4gQXR0cmlidXRlRXJyb3IgdG8gYmUgcmFpc2VkCisgICAgICAgICMgd2hlbiBhIFppcEZpbGUgaW5zdGFuY2Ugd2FzIGNyZWF0ZWQgZm9yIGEgZmlsZSB0aGF0IGRpZCBub3QKKyAgICAgICAgIyBleGlzdDsgdGhlIC5mcCBtZW1iZXIgd2FzIG5vdCBpbml0aWFsaXplZCBidXQgd2FzIG5lZWRlZCBieSB0aGUKKyAgICAgICAgIyBfX2RlbF9fKCkgbWV0aG9kLiAgU2luY2UgdGhlIEF0dHJpYnV0ZUVycm9yIGlzIGluIHRoZSBfX2RlbF9fKCksCisgICAgICAgICMgaXQgaXMgaWdub3JlZCwgYnV0IHRoZSB1c2VyIHNob3VsZCBiZSBzdWZmaWNpZW50bHkgYW5ub3llZCBieQorICAgICAgICAjIHRoZSBtZXNzYWdlIG9uIHRoZSBvdXRwdXQgdGhhdCByZWdyZXNzaW9uIHdpbGwgYmUgbm90aWNlZAorICAgICAgICAjIHF1aWNrbHkuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHppcGZpbGUuWmlwRmlsZSwgVEVTVEZOKQorCisgICAgZGVmIHRlc3RfZW1wdHlfZmlsZV9yYWlzZXNfQmFkWmlwRmlsZShzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh6aXBmaWxlLkJhZFppcGZpbGUsIHppcGZpbGUuWmlwRmlsZSwgVEVTVEZOKQorCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3JykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZSgic2hvcnQgZmlsZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHppcGZpbGUuQmFkWmlwZmlsZSwgemlwZmlsZS5aaXBGaWxlLCBURVNURk4pCisKKyAgICBkZWYgdGVzdF9jbG9zZWRfemlwX3JhaXNlc19SdW50aW1lRXJyb3Ioc2VsZik6CisgICAgICAgICIiIlZlcmlmeSB0aGF0IHRlc3R6aXAoKSBkb2Vzbid0IHN3YWxsb3cgaW5hcHByb3ByaWF0ZSBleGNlcHRpb25zLiIiIgorICAgICAgICBkYXRhID0gU3RyaW5nSU8oKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShkYXRhLCBtb2RlPSJ3IikgYXMgemlwZjoKKyAgICAgICAgICAgIHppcGYud3JpdGVzdHIoImZvby50eHQiLCAiTywgZm9yIGEgTXVzZSBvZiBGaXJlISIpCisKKyAgICAgICAgIyBUaGlzIGlzIGNvcnJlY3Q7IGNhbGxpbmcgLnJlYWQgb24gYSBjbG9zZWQgWmlwRmlsZSBzaG91bGQgcmFpc2UKKyAgICAgICAgIyBhIFJ1bnRpbWVFcnJvciwgYW5kIHNvIHNob3VsZCBjYWxsaW5nIC50ZXN0emlwLiAgQW4gZWFybGllcgorICAgICAgICAjIHZlcnNpb24gb2YgLnRlc3R6aXAgd291bGQgc3dhbGxvdyB0aGlzIGV4Y2VwdGlvbiAoYW5kIGFueSBvdGhlcikKKyAgICAgICAgIyBhbmQgcmVwb3J0IHRoYXQgdGhlIGZpcnN0IGZpbGUgaW4gdGhlIGFyY2hpdmUgd2FzIGNvcnJ1cHQuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZi5yZWFkLCAiZm9vLnR4dCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZi5vcGVuLCAiZm9vLnR4dCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZi50ZXN0emlwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYud3JpdGVzdHIsICJib2d1cy50eHQiLCAiYm9ndXMiKQorICAgICAgICBvcGVuKFRFU1RGTiwgJ3cnKS53cml0ZSgnemlwZmlsZSB0ZXN0IGRhdGEnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYud3JpdGUsIFRFU1RGTikKKworICAgIGRlZiB0ZXN0X2JhZF9jb25zdHJ1Y3Rvcl9tb2RlKHNlbGYpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGJhZCBtb2RlcyBwYXNzZWQgdG8gWmlwRmlsZSBjb25zdHJ1Y3RvciBhcmUgY2F1Z2h0LiIiIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGZpbGUuWmlwRmlsZSwgVEVTVEZOLCAicSIpCisKKyAgICBkZWYgdGVzdF9iYWRfb3Blbl9tb2RlKHNlbGYpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGJhZCBtb2RlcyBwYXNzZWQgdG8gWmlwRmlsZS5vcGVuIGFyZSBjYXVnaHQuIiIiCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0idyIpIGFzIHppcGY6CisgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0iciIpIGFzIHppcGY6CisgICAgICAgICMgcmVhZCB0aGUgZGF0YSB0byBtYWtlIHN1cmUgdGhlIGZpbGUgaXMgdGhlcmUKKyAgICAgICAgICAgIHppcGYucmVhZCgiZm9vLnR4dCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYub3BlbiwgImZvby50eHQiLCAicSIpCisKKyAgICBkZWYgdGVzdF9yZWFkMChzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBjYWxsaW5nIHJlYWQoMCkgb24gYSBaaXBFeHRGaWxlIG9iamVjdCByZXR1cm5zIGFuIGVtcHR5CisgICAgICAgIHN0cmluZyBhbmQgZG9lc24ndCBhZHZhbmNlIGZpbGUgcG9pbnRlci4iIiIKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJ3IikgYXMgemlwZjoKKyAgICAgICAgICAgIHppcGYud3JpdGVzdHIoImZvby50eHQiLCAiTywgZm9yIGEgTXVzZSBvZiBGaXJlISIpCisgICAgICAgICAgICAjIHJlYWQgdGhlIGRhdGEgdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIHRoZXJlCisgICAgICAgICAgICB3aXRoIHppcGYub3BlbigiZm9vLnR4dCIpIGFzIGY6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKEZJWEVEVEVTVF9TSVpFKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoMCksICcnKQorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorCisgICAgZGVmIHRlc3Rfb3Blbl9ub25fZXhpc3RlbnRfaXRlbShzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBhdHRlbXB0aW5nIHRvIGNhbGwgb3BlbigpIGZvciBhbiBpdGVtIHRoYXQgZG9lc24ndAorICAgICAgICBleGlzdCBpbiB0aGUgYXJjaGl2ZSByYWlzZXMgYSBSdW50aW1lRXJyb3IuIiIiCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0idyIpIGFzIHppcGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgemlwZi5vcGVuLCAiZm9vLnR4dCIsICJyIikKKworICAgIGRlZiB0ZXN0X2JhZF9jb21wcmVzc2lvbl9tb2RlKHNlbGYpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGJhZCBjb21wcmVzc2lvbiBtZXRob2RzIHBhc3NlZCB0byBaaXBGaWxlLm9wZW4gYXJlCisgICAgICAgIGNhdWdodC4iIiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXBmaWxlLlppcEZpbGUsIFRFU1RGTiwgInciLCAtMSkKKworICAgIGRlZiB0ZXN0X3Vuc3VwcG9ydGVkX2NvbXByZXNzaW9uKHNlbGYpOgorICAgICAgICAjIGRhdGEgaXMgZGVjbGFyZWQgYXMgc2hydW5rLCBidXQgYWN0dWFsbHkgZGVmbGF0ZWQKKyAgICAgICAgZGF0YSA9IChiJ1BLXHgwM1x4MDQuXHgwMFx4MDBceDAwXHgwMVx4MDBceGU0Q1x4YTFAXHgwMFx4MDBceDAwJworICAgICAgICBiJ1x4MDBceDAyXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDFceDAwXHgwMFx4MDB4XHgwM1x4MDBQS1x4MDEnCisgICAgICAgIGInXHgwMi5ceDAzLlx4MDBceDAwXHgwMFx4MDFceDAwXHhlNENceGExQFx4MDBceDAwXHgwMFx4MDBceDAyXHgwMFx4MDAnCisgICAgICAgIGInXHgwMFx4MDBceDAwXHgwMFx4MDBceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCisgICAgICAgIGInXHg4MFx4MDFceDAwXHgwMFx4MDBceDAweFBLXHgwNVx4MDZceDAwXHgwMFx4MDBceDAwXHgwMVx4MDBceDAxXHgwMCcKKyAgICAgICAgYicvXHgwMFx4MDBceDAwIVx4MDBceDAwXHgwMFx4MDBceDAwJykKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW8uQnl0ZXNJTyhkYXRhKSwgJ3InKSBhcyB6aXBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgemlwZi5vcGVuLCAneCcpCisKKyAgICBkZWYgdGVzdF9udWxsX2J5dGVfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgICIiIkNoZWNrIHRoYXQgYSBmaWxlbmFtZSBjb250YWluaW5nIGEgbnVsbCBieXRlIGlzIHByb3Blcmx5CisgICAgICAgIHRlcm1pbmF0ZWQuIiIiCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0idyIpIGFzIHppcGY6CisgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0XHgwMHFxcSIsICJPLCBmb3IgYSBNdXNlIG9mIEZpcmUhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5uYW1lbGlzdCgpLCBbJ2Zvby50eHQnXSkKKworICAgIGRlZiB0ZXN0X3N0cnVjdF9zaXplcyhzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBaSVAgaW50ZXJuYWwgc3RydWN0dXJlIHNpemVzIGFyZSBjYWxjdWxhdGVkIGNvcnJlY3RseS4iIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmaWxlLnNpemVFbmRDZW50RGlyLCAyMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmaWxlLnNpemVDZW50cmFsRGlyLCA0NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmaWxlLnNpemVFbmRDZW50RGlyNjQsIDU2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZpbGUuc2l6ZUVuZENlbnREaXI2NExvY2F0b3IsIDIwKQorCisgICAgZGVmIHRlc3RfY29tbWVudHMoc2VsZik6CisgICAgICAgICIiIkNoZWNrIHRoYXQgY29tbWVudHMgb24gdGhlIGFyY2hpdmUgYXJlIGhhbmRsZWQgcHJvcGVybHkuIiIiCisKKyAgICAgICAgIyBjaGVjayBkZWZhdWx0IGNvbW1lbnQgaXMgZW1wdHkKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJ3IikgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5jb21tZW50LCAnJykKKyAgICAgICAgICAgIHppcGYud3JpdGVzdHIoImZvby50eHQiLCAiTywgZm9yIGEgTXVzZSBvZiBGaXJlISIpCisKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJyIikgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5jb21tZW50LCAnJykKKworICAgICAgICAjIGNoZWNrIGEgc2ltcGxlIHNob3J0IGNvbW1lbnQKKyAgICAgICAgY29tbWVudCA9ICdCcmF2ZWx5IHRha2luZyB0byBoaXMgZmVldCwgaGUgYmVhdCBhIHZlcnkgYnJhdmUgcmV0cmVhdC4nCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0idyIpIGFzIHppcGY6CisgICAgICAgICAgICB6aXBmLmNvbW1lbnQgPSBjb21tZW50CisgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InIiKSBhcyB6aXBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmLmNvbW1lbnQsIGNvbW1lbnQpCisKKyAgICAgICAgIyBjaGVjayBhIGNvbW1lbnQgb2YgbWF4IGxlbmd0aAorICAgICAgICBjb21tZW50MiA9ICcnLmpvaW4oWyclZCcgJSAoaSoqMyAlIDEwKSBmb3IgaSBpbiB4cmFuZ2UoKDEgPDwgMTYpLTEpXSkKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJ3IikgYXMgemlwZjoKKyAgICAgICAgICAgIHppcGYuY29tbWVudCA9IGNvbW1lbnQyCisgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0iciIpIGFzIHppcGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYuY29tbWVudCwgY29tbWVudDIpCisKKyAgICAgICAgIyBjaGVjayBhIGNvbW1lbnQgdGhhdCBpcyB0b28gbG9uZyBpcyB0cnVuY2F0ZWQKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJ3IikgYXMgemlwZjoKKyAgICAgICAgICAgIHppcGYuY29tbWVudCA9IGNvbW1lbnQyICsgJ29vcHMnCisgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InIiKSBhcyB6aXBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmLmNvbW1lbnQsIGNvbW1lbnQyKQorCisgICAgZGVmIHRlc3RfY2hhbmdlX2NvbW1lbnRfaW5fZW1wdHlfYXJjaGl2ZShzZWxmKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCAiYSIsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoemlwZi5maWxlbGlzdCkKKyAgICAgICAgICAgIHppcGYuY29tbWVudCA9IGIidGhpcyBpcyBhIGNvbW1lbnQiCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgInIiKSBhcyB6aXBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmLmNvbW1lbnQsIGIidGhpcyBpcyBhIGNvbW1lbnQiKQorCisgICAgZGVmIHRlc3RfY2hhbmdlX2NvbW1lbnRfaW5fbm9uZW1wdHlfYXJjaGl2ZShzZWxmKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCAidyIsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZjoKKyAgICAgICAgICAgIHppcGYud3JpdGVzdHIoImZvby50eHQiLCAiTywgZm9yIGEgTXVzZSBvZiBGaXJlISIpCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgImEiLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoemlwZi5maWxlbGlzdCkKKyAgICAgICAgICAgIHppcGYuY29tbWVudCA9IGIidGhpcyBpcyBhIGNvbW1lbnQiCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgInIiKSBhcyB6aXBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmLmNvbW1lbnQsIGIidGhpcyBpcyBhIGNvbW1lbnQiKQorCisgICAgZGVmIGNoZWNrX3Rlc3R6aXBfd2l0aF9iYWRfY3JjKHNlbGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgIiIiVGVzdHMgdGhhdCBmaWxlcyB3aXRoIGJhZCBDUkNzIHJldHVybiB0aGVpciBuYW1lIGZyb20gdGVzdHppcC4iIiIKKyAgICAgICAgemlwZGF0YSA9IHNlbGYuemlwc193aXRoX2JhZF9jcmNbY29tcHJlc3Npb25dCisKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW8uQnl0ZXNJTyh6aXBkYXRhKSwgbW9kZT0iciIpIGFzIHppcGY6CisgICAgICAgICAgICAjIHRlc3R6aXAgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgY29ycnVwdCBmaWxlLCBvciBOb25lCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhZmlsZScsIHppcGYudGVzdHppcCgpKQorCisgICAgZGVmIHRlc3RfdGVzdHppcF93aXRoX2JhZF9jcmNfc3RvcmVkKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3Rlc3R6aXBfd2l0aF9iYWRfY3JjKHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF90ZXN0emlwX3dpdGhfYmFkX2NyY19kZWZsYXRlZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190ZXN0emlwX3dpdGhfYmFkX2NyYyh6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIGRlZiBjaGVja19yZWFkX3dpdGhfYmFkX2NyYyhzZWxmLCBjb21wcmVzc2lvbik6CisgICAgICAgICIiIlRlc3RzIHRoYXQgZmlsZXMgd2l0aCBiYWQgQ1JDcyByYWlzZSBhIEJhZFppcGZpbGUgZXhjZXB0aW9uIHdoZW4gcmVhZC4iIiIKKyAgICAgICAgemlwZGF0YSA9IHNlbGYuemlwc193aXRoX2JhZF9jcmNbY29tcHJlc3Npb25dCisKKyAgICAgICAgIyBVc2luZyBaaXBGaWxlLnJlYWQoKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShpby5CeXRlc0lPKHppcGRhdGEpLCBtb2RlPSJyIikgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHppcGZpbGUuQmFkWmlwZmlsZSwgemlwZi5yZWFkLCAnYWZpbGUnKQorCisgICAgICAgICMgVXNpbmcgWmlwRXh0RmlsZS5yZWFkKCkKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW8uQnl0ZXNJTyh6aXBkYXRhKSwgbW9kZT0iciIpIGFzIHppcGY6CisgICAgICAgICAgICB3aXRoIHppcGYub3BlbignYWZpbGUnLCAncicpIGFzIGNvcnJ1cHRfZmlsZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh6aXBmaWxlLkJhZFppcGZpbGUsIGNvcnJ1cHRfZmlsZS5yZWFkKQorCisgICAgICAgICMgU2FtZSB3aXRoIHNtYWxsIHJlYWRzIChpbiBvcmRlciB0byBleGVyY2lzZSB0aGUgYnVmZmVyaW5nIGxvZ2ljKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShpby5CeXRlc0lPKHppcGRhdGEpLCBtb2RlPSJyIikgYXMgemlwZjoKKyAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCdhZmlsZScsICdyJykgYXMgY29ycnVwdF9maWxlOgorICAgICAgICAgICAgICAgIGNvcnJ1cHRfZmlsZS5NSU5fUkVBRF9TSVpFID0gMgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoemlwZmlsZS5CYWRaaXBmaWxlKToKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgY29ycnVwdF9maWxlLnJlYWQoMik6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9yZWFkX3dpdGhfYmFkX2NyY19zdG9yZWQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcmVhZF93aXRoX2JhZF9jcmMoemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3JlYWRfd2l0aF9iYWRfY3JjX2RlZmxhdGVkKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3JlYWRfd2l0aF9iYWRfY3JjKHppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgZGVmIGNoZWNrX3JlYWRfcmV0dXJuX3NpemUoc2VsZiwgY29tcHJlc3Npb24pOgorICAgICAgICAjIElzc3VlICM5ODM3OiBaaXBFeHRGaWxlLnJlYWQoKSBzaG91bGRuJ3QgcmV0dXJuIG1vcmUgYnl0ZXMKKyAgICAgICAgIyB0aGFuIHJlcXVlc3RlZC4KKyAgICAgICAgZm9yIHRlc3Rfc2l6ZSBpbiAoMSwgNDA5NSwgNDA5NiwgNDA5NywgMTYzODQpOgorICAgICAgICAgICAgZmlsZV9zaXplID0gdGVzdF9zaXplICsgMQorICAgICAgICAgICAganVuayA9IGInJy5qb2luKHN0cnVjdC5wYWNrKCdCJywgcmFuZGludCgwLCAyNTUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIHJhbmdlKGZpbGVfc2l6ZSkpCisgICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShpby5CeXRlc0lPKCksICJ3IiwgY29tcHJlc3Npb24pIGFzIHppcGY6CisgICAgICAgICAgICAgICAgemlwZi53cml0ZXN0cignZm9vJywganVuaykKKyAgICAgICAgICAgICAgICB3aXRoIHppcGYub3BlbignZm9vJywgJ3InKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgYnVmID0gZnAucmVhZCh0ZXN0X3NpemUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJ1ZiksIHRlc3Rfc2l6ZSkKKworICAgIGRlZiB0ZXN0X3JlYWRfcmV0dXJuX3NpemVfc3RvcmVkKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3JlYWRfcmV0dXJuX3NpemUoemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3JlYWRfcmV0dXJuX3NpemVfZGVmbGF0ZWQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcmVhZF9yZXR1cm5fc2l6ZSh6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIGRlZiB0ZXN0X2VtcHR5X3ppcGZpbGUoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBjcmVhdGluZyBhIGZpbGUgaW4gJ3cnIG9yICdhJyBtb2RlIGFuZCBjbG9zaW5nIHdpdGhvdXQKKyAgICAgICAgIyBhZGRpbmcgYW55IGZpbGVzIHRvIHRoZSBhcmNoaXZlcyBjcmVhdGVzIGEgdmFsaWQgZW1wdHkgWklQIGZpbGUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJ3IikgYXMgemlwZjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgemlwZiA9IHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InIiKQorICAgICAgICBleGNlcHQgemlwZmlsZS5CYWRaaXBmaWxlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJVbmFibGUgdG8gY3JlYXRlIGVtcHR5IFpJUCBmaWxlIGluICd3JyBtb2RlIikKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9ImEiKSBhcyB6aXBmOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICB6aXBmID0gemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0iciIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVW5hYmxlIHRvIGNyZWF0ZSBlbXB0eSBaSVAgZmlsZSBpbiAnYScgbW9kZSIpCisKKyAgICBkZWYgdGVzdF9vcGVuX2VtcHR5X2ZpbGUoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTcxMDcwMzogQ2hlY2sgdGhhdCBvcGVuaW5nIGEgZmlsZSB3aXRoIGxlc3MgdGhhbiAyMiBieXRlcworICAgICAgICAjIHJhaXNlcyBhIEJhZFppcGZpbGUgZXhjZXB0aW9uIChyYXRoZXIgdGhhbiB0aGUgcHJldmlvdXNseSB1bmhlbHBmdWwKKyAgICAgICAgIyBJT0Vycm9yKQorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpIGFzIGY6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHppcGZpbGUuQmFkWmlwZmlsZSwgemlwZmlsZS5aaXBGaWxlLCBURVNURk4sICdyJykKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV96aXBpbmZvX2JlZm9yZV8xOTgwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBmaWxlLlppcEluZm8sICdzZXZlbnRpZXMnLCAoMTk3OSwgMSwgMSwgMCwgMCwgMCkpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgIHVubGluayhURVNURk4yKQorCisKK2NsYXNzIERlY3J5cHRpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiQ2hlY2sgdGhhdCBaSVAgZGVjcnlwdGlvbiB3b3Jrcy4gU2luY2UgdGhlIGxpYnJhcnkgZG9lcyBub3QKKyAgICBzdXBwb3J0IGVuY3J5cHRpb24gYXQgdGhlIG1vbWVudCwgd2UgdXNlIGEgcHJlLWdlbmVyYXRlZCBlbmNyeXB0ZWQKKyAgICBaSVAgZmlsZS4iIiIKKworICAgIGRhdGEgPSAoCisgICAgJ1BLXHgwM1x4MDRceDE0XHgwMFx4MDFceDAwXHgwMFx4MDBuXHg5MmkuI3lceGVmPyZceDAwXHgwMFx4MDBceDFhXHgwMCcKKyAgICAnXHgwMFx4MDBceDA4XHgwMFx4MDBceDAwdGVzdC50eHRceGZhXHgxMFx4YTBnbHl8XHhmYS1ceGM1XHhjMD1ceGY5eScKKyAgICAnXHgxOFx4ZTBceGE4clx4YjNafUxnXHhiY1x4YWVceGY5fFx4OWJceDE5XHhlNFx4OGJceGJhXHhiYilceDhjXHhiMFx4ZGJsJworICAgICdQS1x4MDFceDAyXHgxNFx4MDBceDE0XHgwMFx4MDFceDAwXHgwMFx4MDBuXHg5MmkuI3lceGVmPyZceDAwXHgwMFx4MDAnCisgICAgJ1x4MWFceDAwXHgwMFx4MDBceDA4XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDFceDAwIFx4MDBceGI2XHg4MScKKyAgICAnXHgwMFx4MDBceDAwXHgwMHRlc3QudHh0UEtceDA1XHgwNlx4MDBceDAwXHgwMFx4MDBceDAxXHgwMFx4MDFceDAwNlx4MDAnCisgICAgJ1x4MDBceDAwTFx4MDBceDAwXHgwMFx4MDBceDAwJyApCisgICAgZGF0YTIgPSAoCisgICAgJ1BLXHgwM1x4MDRceDE0XHgwMFx0XHgwMFx4MDhceDAwXHhjZn0zOHh1XHhhYVx4YjJceDE0XHgwMFx4MDBceDAwXHgwMFx4MDInCisgICAgJ1x4MDBceDAwXHgwNFx4MDBceDE1XHgwMHplcm9VVFx0XHgwMFx4MDNceGQ2XHg4Ylx4OTJHXHhkYVx4OGJceDkyR1V4XHgwNCcKKyAgICAnXHgwMFx4ZThceDAzXHhlOFx4MDNceGM3PE1ceGI1YVx4Y2VYXHhhM1kmXHg4YntvRVx4ZDdceDlkXHg4Y1x4OThceDAyXHhjMCcKKyAgICAnUEtceDA3XHgwOHh1XHhhYVx4YjJceDE0XHgwMFx4MDBceDAwXHgwMFx4MDJceDAwXHgwMFBLXHgwMVx4MDJceDE3XHgwMycKKyAgICAnXHgxNFx4MDBcdFx4MDBceDA4XHgwMFx4Y2Z9Mzh4dVx4YWFceGIyXHgxNFx4MDBceDAwXHgwMFx4MDBceDAyXHgwMFx4MDAnCisgICAgJ1x4MDRceDAwXHJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGE0XHg4MVx4MDBceDAwXHgwMFx4MDB6ZScKKyAgICAncm9VVFx4MDVceDAwXHgwM1x4ZDZceDhiXHg5MkdVeFx4MDBceDAwUEtceDA1XHgwNlx4MDBceDAwXHgwMFx4MDBceDAxJworICAgICdceDAwXHgwMVx4MDA/XHgwMFx4MDBceDAwW1x4MDBceDAwXHgwMFx4MDBceDAwJyApCisKKyAgICBwbGFpbiA9ICd6aXBmaWxlLnB5IGVuY3J5cHRpb24gdGVzdCcKKyAgICBwbGFpbjIgPSAnXHgwMCcqNTEyCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHdpdGggb3BlbihURVNURk4sICJ3YiIpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5kYXRhKQorICAgICAgICBzZWxmLnppcCA9IHppcGZpbGUuWmlwRmlsZShURVNURk4sICJyIikKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTjIsICJ3YiIpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5kYXRhMikKKyAgICAgICAgc2VsZi56aXAyID0gemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJyIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi56aXAuY2xvc2UoKQorICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorICAgICAgICBzZWxmLnppcDIuY2xvc2UoKQorICAgICAgICBvcy51bmxpbmsoVEVTVEZOMikKKworICAgIGRlZiB0ZXN0X25vX3Bhc3N3b3JkKHNlbGYpOgorICAgICAgICAjIFJlYWRpbmcgdGhlIGVuY3J5cHRlZCBmaWxlIHdpdGhvdXQgcGFzc3dvcmQKKyAgICAgICAgIyBtdXN0IGdlbmVyYXRlIGEgUnVuVGltZSBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzZWxmLnppcC5yZWFkLCAidGVzdC50eHQiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNlbGYuemlwMi5yZWFkLCAiemVybyIpCisKKyAgICBkZWYgdGVzdF9iYWRfcGFzc3dvcmQoc2VsZik6CisgICAgICAgIHNlbGYuemlwLnNldHBhc3N3b3JkKCJwZXJsIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzZWxmLnppcC5yZWFkLCAidGVzdC50eHQiKQorICAgICAgICBzZWxmLnppcDIuc2V0cGFzc3dvcmQoInBlcmwiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNlbGYuemlwMi5yZWFkLCAiemVybyIpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfZ29vZF9wYXNzd29yZChzZWxmKToKKyAgICAgICAgc2VsZi56aXAuc2V0cGFzc3dvcmQoInB5dGhvbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi56aXAucmVhZCgidGVzdC50eHQiKSwgc2VsZi5wbGFpbikKKyAgICAgICAgc2VsZi56aXAyLnNldHBhc3N3b3JkKCIxMjM0NSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi56aXAyLnJlYWQoInplcm8iKSwgc2VsZi5wbGFpbjIpCisKKworY2xhc3MgVGVzdHNXaXRoUmFuZG9tQmluYXJ5RmlsZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZGF0YWNvdW50ID0gcmFuZGludCgxNiwgNjQpKjEwMjQgKyByYW5kaW50KDEsIDEwMjQpCisgICAgICAgIHNlbGYuZGF0YSA9ICcnLmpvaW4oc3RydWN0LnBhY2soJzxmJywgcmFuZG9tKCkqcmFuZGludCgtMTAwMCwgMTAwMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGRhdGFjb3VudCkpCisKKyAgICAgICAgIyBNYWtlIGEgc291cmNlIGZpbGUgd2l0aCBzb21lIGxpbmVzCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICJ3YiIpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoc2VsZi5kYXRhKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgICAgICB1bmxpbmsoVEVTVEZOMikKKworICAgIGRlZiBtYWtlX3Rlc3RfYXJjaGl2ZShzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgICMgQ3JlYXRlIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAidyIsIGNvbXByZXNzaW9uKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgImFub3RoZXIubmFtZSIpCisgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4sIFRFU1RGTikKKworICAgIGRlZiB6aXBfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIsIGNvbXByZXNzaW9uKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHRlc3RkYXRhID0gemlwZnAucmVhZChURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0ZXN0ZGF0YSksIGxlbihzZWxmLmRhdGEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0ZGF0YSwgc2VsZi5kYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKCJhbm90aGVyLm5hbWUiKSwgc2VsZi5kYXRhKQorCisgICAgZGVmIHRlc3Rfc3RvcmVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X2RlZmxhdGVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBpby5CeXRlc0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfdGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIGRlZiB6aXBfb3Blbl90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKKworICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIiwgY29tcHJlc3Npb24pIGFzIHppcGZwOgorICAgICAgICAgICAgemlwZGF0YTEgPSBbXQorICAgICAgICAgICAgd2l0aCB6aXBmcC5vcGVuKFRFU1RGTikgYXMgemlwb3BlbjE6CisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmVhZF9kYXRhID0gemlwb3BlbjEucmVhZCgyNTYpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkX2RhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICB6aXBkYXRhMS5hcHBlbmQocmVhZF9kYXRhKQorCisgICAgICAgICAgICB6aXBkYXRhMiA9IFtdCisgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oImFub3RoZXIubmFtZSIpIGFzIHppcG9wZW4yOgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHJlYWRfZGF0YSA9IHppcG9wZW4yLnJlYWQoMjU2KQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVhZF9kYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgemlwZGF0YTIuYXBwZW5kKHJlYWRfZGF0YSkKKworICAgICAgICAgICAgdGVzdGRhdGExID0gJycuam9pbih6aXBkYXRhMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRlc3RkYXRhMSksIGxlbihzZWxmLmRhdGEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0ZGF0YTEsIHNlbGYuZGF0YSkKKworICAgICAgICAgICAgdGVzdGRhdGEyID0gJycuam9pbih6aXBkYXRhMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRlc3RkYXRhMiksIGxlbihzZWxmLmRhdGEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0ZGF0YTIsIHNlbGYuZGF0YSkKKworICAgIGRlZiB0ZXN0X29wZW5fc3RvcmVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX29wZW5fdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3Rfb3Blbl9kZWZsYXRlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgaW8uQnl0ZXNJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX29wZW5fdGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIGRlZiB6aXBfcmFuZG9tX29wZW5fdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIsIGNvbXByZXNzaW9uKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGRhdGExID0gW10KKyAgICAgICAgICAgIHdpdGggemlwZnAub3BlbihURVNURk4pIGFzIHppcG9wZW4xOgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHJlYWRfZGF0YSA9IHppcG9wZW4xLnJlYWQocmFuZGludCgxLCAxMDI0KSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWRfZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHppcGRhdGExLmFwcGVuZChyZWFkX2RhdGEpCisKKyAgICAgICAgICAgIHRlc3RkYXRhID0gJycuam9pbih6aXBkYXRhMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRlc3RkYXRhKSwgbGVuKHNlbGYuZGF0YSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RkYXRhLCBzZWxmLmRhdGEpCisKKyAgICBkZWYgdGVzdF9yYW5kb21fb3Blbl9zdG9yZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfcmFuZG9tX29wZW5fdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfcmFuZG9tX29wZW5fZGVmbGF0ZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIGlvLkJ5dGVzSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF9yYW5kb21fb3Blbl90ZXN0KGYsIHppcGZpbGUuWklQX0RFRkxBVEVEKQorCisKK0Bza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKK2NsYXNzIFRlc3RzV2l0aE11bHRpcGxlT3BlbnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IiwgemlwZmlsZS5aSVBfREVGTEFURUQpIGFzIHppcGZwOgorICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoJ29uZXMnLCAnMScqRklYRURURVNUX1NJWkUpCisgICAgICAgICAgICB6aXBmcC53cml0ZXN0cigndHdvcycsICcyJypGSVhFRFRFU1RfU0laRSkKKworICAgIGRlZiB0ZXN0X3NhbWVfZmlsZShzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCAod2hlbiB0aGUgWmlwRmlsZSBpcyBpbiBjb250cm9sIG9mIGNyZWF0aW5nIGZpbGUgb2JqZWN0cykKKyAgICAgICAgIyBtdWx0aXBsZSBvcGVuKCkgY2FsbHMgY2FuIGJlIG1hZGUgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIuCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsIG1vZGU9InIiKSBhcyB6aXBmOgorICAgICAgICAgICAgem9wZW4xID0gemlwZi5vcGVuKCdvbmVzJykKKyAgICAgICAgICAgIHpvcGVuMiA9IHppcGYub3Blbignb25lcycpCisgICAgICAgICAgICBkYXRhMSA9IHpvcGVuMS5yZWFkKDUwMCkKKyAgICAgICAgICAgIGRhdGEyID0gem9wZW4yLnJlYWQoNTAwKQorICAgICAgICAgICAgZGF0YTEgKz0gem9wZW4xLnJlYWQoNTAwKQorICAgICAgICAgICAgZGF0YTIgKz0gem9wZW4yLnJlYWQoNTAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhMSwgZGF0YTIpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbnRfZmlsZShzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCAod2hlbiB0aGUgWmlwRmlsZSBpcyBpbiBjb250cm9sIG9mIGNyZWF0aW5nIGZpbGUgb2JqZWN0cykKKyAgICAgICAgIyBtdWx0aXBsZSBvcGVuKCkgY2FsbHMgY2FuIGJlIG1hZGUgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIGVhY2ggb3RoZXIuCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsIG1vZGU9InIiKSBhcyB6aXBmOgorICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ29uZXMnKSBhcyB6b3BlbjEsIHppcGYub3BlbigndHdvcycpIGFzIHpvcGVuMjoKKyAgICAgICAgICAgICAgICBkYXRhMSA9IHpvcGVuMS5yZWFkKDUwMCkKKyAgICAgICAgICAgICAgICBkYXRhMiA9IHpvcGVuMi5yZWFkKDUwMCkKKyAgICAgICAgICAgICAgICBkYXRhMSArPSB6b3BlbjEucmVhZCg1MDApCisgICAgICAgICAgICAgICAgZGF0YTIgKz0gem9wZW4yLnJlYWQoNTAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhMSwgJzEnKkZJWEVEVEVTVF9TSVpFKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhMiwgJzInKkZJWEVEVEVTVF9TSVpFKQorCisgICAgZGVmIHRlc3RfaW50ZXJsZWF2ZWQoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgKHdoZW4gdGhlIFppcEZpbGUgaXMgaW4gY29udHJvbCBvZiBjcmVhdGluZyBmaWxlIG9iamVjdHMpCisgICAgICAgICMgbXVsdGlwbGUgb3BlbigpIGNhbGxzIGNhbiBiZSBtYWRlIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCBtb2RlPSJyIikgYXMgemlwZjoKKyAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCdvbmVzJykgYXMgem9wZW4xLCB6aXBmLm9wZW4oJ3R3b3MnKSBhcyB6b3BlbjI6CisgICAgICAgICAgICAgICAgZGF0YTEgPSB6b3BlbjEucmVhZCg1MDApCisgICAgICAgICAgICAgICAgZGF0YTIgPSB6b3BlbjIucmVhZCg1MDApCisgICAgICAgICAgICAgICAgZGF0YTEgKz0gem9wZW4xLnJlYWQoNTAwKQorICAgICAgICAgICAgICAgIGRhdGEyICs9IHpvcGVuMi5yZWFkKDUwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YTEsICcxJypGSVhFRFRFU1RfU0laRSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YTIsICcyJypGSVhFRFRFU1RfU0laRSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdW5saW5rKFRFU1RGTjIpCisKKworY2xhc3MgVGVzdFdpdGhEaXJlY3RvcnkodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgb3MubWtkaXIoVEVTVEZOMikKKworICAgIGRlZiB0ZXN0X2V4dHJhY3RfZGlyKHNlbGYpOgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmaW5kZmlsZSgiemlwZGlyLnppcCIpKSBhcyB6aXBmOgorICAgICAgICAgICAgemlwZi5leHRyYWN0YWxsKFRFU1RGTjIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihURVNURk4yLCAiYSIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKFRFU1RGTjIsICJhIiwgImIiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oVEVTVEZOMiwgImEiLCAiYiIsICJjIikpKQorCisgICAgZGVmIHRlc3RfYnVnXzYwNTAoc2VsZik6CisgICAgICAgICMgRXh0cmFjdGlvbiBzaG91bGQgc3VjY2VlZCBpZiBkaXJlY3RvcmllcyBhbHJlYWR5IGV4aXN0CisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihURVNURk4yLCAiYSIpKQorICAgICAgICBzZWxmLnRlc3RfZXh0cmFjdF9kaXIoKQorCisgICAgZGVmIHRlc3Rfc3RvcmVfZGlyKHNlbGYpOgorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oVEVTVEZOMiwgIngiKSkKKyAgICAgICAgemlwZiA9IHppcGZpbGUuWmlwRmlsZShURVNURk4sICJ3IikKKyAgICAgICAgemlwZi53cml0ZShvcy5wYXRoLmpvaW4oVEVTVEZOMiwgIngiKSwgIngiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoemlwZi5maWxlbGlzdFswXS5maWxlbmFtZS5lbmRzd2l0aCgieC8iKSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4yKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhURVNURk4pOgorICAgICAgICAgICAgdW5saW5rKFRFU1RGTikKKworCitjbGFzcyBVbml2ZXJzYWxOZXdsaW5lVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5saW5lX2dlbiA9IFsiVGVzdCBvZiB6aXBmaWxlIGxpbmUgJWQuIiAlIGkKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoRklYRURURVNUX1NJWkUpXQorICAgICAgICBzZWxmLnNlcHMgPSAoJ1xyJywgJ1xyXG4nLCAnXG4nKQorICAgICAgICBzZWxmLmFyY2RhdGEsIHNlbGYuYXJjZmlsZXMgPSB7fSwge30KKyAgICAgICAgZm9yIG4sIHMgaW4gZW51bWVyYXRlKHNlbGYuc2Vwcyk6CisgICAgICAgICAgICBzZWxmLmFyY2RhdGFbc10gPSBzLmpvaW4oc2VsZi5saW5lX2dlbikgKyBzCisgICAgICAgICAgICBzZWxmLmFyY2ZpbGVzW3NdID0gJyVzLSVkJyAlIChURVNURk4sIG4pCisgICAgICAgICAgICBvcGVuKHNlbGYuYXJjZmlsZXNbc10sICJ3YiIpLndyaXRlKHNlbGYuYXJjZGF0YVtzXSkKKworICAgIGRlZiBtYWtlX3Rlc3RfYXJjaGl2ZShzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgICMgQ3JlYXRlIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAidyIsIGNvbXByZXNzaW9uKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZvciBmbiBpbiBzZWxmLmFyY2ZpbGVzLnZhbHVlcygpOgorICAgICAgICAgICAgICAgIHppcGZwLndyaXRlKGZuLCBmbikKKworICAgIGRlZiByZWFkX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZvciBzZXAsIGZuIGluIHNlbGYuYXJjZmlsZXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oZm4sICJyVSIpIGFzIGZwOgorICAgICAgICAgICAgICAgICAgICB6aXBkYXRhID0gZnAucmVhZCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmFyY2RhdGFbc2VwXSwgemlwZGF0YSkKKworICAgIGRlZiByZWFkbGluZV9yZWFkX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoZiwgInIiKQorICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6CisgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oZm4sICJyVSIpIGFzIHppcG9wZW46CisgICAgICAgICAgICAgICAgZGF0YSA9ICcnCisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmVhZCA9IHppcG9wZW4ucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVhZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gcmVhZAorCisgICAgICAgICAgICAgICAgICAgIHJlYWQgPSB6aXBvcGVuLnJlYWQoNSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHJlYWQKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzZWxmLmFyY2RhdGFbJ1xuJ10pCisKKyAgICAgICAgemlwZnAuY2xvc2UoKQorCisgICAgZGVmIHJlYWRsaW5lX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZvciBzZXAsIGZuIGluIHNlbGYuYXJjZmlsZXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oZm4sICJyVSIpIGFzIHppcG9wZW46CisgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYubGluZV9nZW46CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lZGF0YSA9IHppcG9wZW4ucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lZGF0YSwgbGluZSArICdcbicpCisKKyAgICBkZWYgcmVhZGxpbmVzX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZvciBzZXAsIGZuIGluIHNlbGYuYXJjZmlsZXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oZm4sICJyVSIpIGFzIGZwOgorICAgICAgICAgICAgICAgICAgICB6aXBsaW5lcyA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgICAgICAgICAgZm9yIGxpbmUsIHppcGxpbmUgaW4gemlwKHNlbGYubGluZV9nZW4sIHppcGxpbmVzKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBsaW5lLCBsaW5lICsgJ1xuJykKKworICAgIGRlZiBpdGVybGluZXNfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIpIGFzIHppcGZwOgorICAgICAgICAgICAgZm9yIHNlcCwgZm4gaW4gc2VsZi5hcmNmaWxlcy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGZvciBsaW5lLCB6aXBsaW5lIGluIHppcChzZWxmLmxpbmVfZ2VuLCB6aXBmcC5vcGVuKGZuLCAiclUiKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwbGluZSwgbGluZSArICdcbicpCisKKyAgICBkZWYgdGVzdF9yZWFkX3N0b3JlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnJlYWRfdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZV9yZWFkX3N0b3JlZChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjNzYxMDogY2FsbHMgdG8gcmVhZGxpbmUoKSBpbnRlcmxlYXZlZCB3aXRoIGNhbGxzIHRvIHJlYWQoKS4KKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnJlYWRsaW5lX3JlYWRfdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZV9zdG9yZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi5yZWFkbGluZV90ZXN0KGYsIHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lc19zdG9yZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi5yZWFkbGluZXNfdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgdGVzdF9pdGVybGluZXNfc3RvcmVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuaXRlcmxpbmVzX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3JlYWRfZGVmbGF0ZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi5yZWFkX3Rlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfcmVhZGxpbmVfcmVhZF9kZWZsYXRlZChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjNzYxMDogY2FsbHMgdG8gcmVhZGxpbmUoKSBpbnRlcmxlYXZlZCB3aXRoIGNhbGxzIHRvIHJlYWQoKS4KKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnJlYWRsaW5lX3JlYWRfdGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9yZWFkbGluZV9kZWZsYXRlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnJlYWRsaW5lX3Rlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzX2RlZmxhdGVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYucmVhZGxpbmVzX3Rlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfaXRlcmxpbmVzX2RlZmxhdGVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuaXRlcmxpbmVzX3Rlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciBzZXAsIGZuIGluIHNlbGYuYXJjZmlsZXMuaXRlbXMoKToKKyAgICAgICAgICAgIG9zLnJlbW92ZShmbikKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKyAgICAgICAgdW5saW5rKFRFU1RGTjIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUZXN0c1dpdGhTb3VyY2VGaWxlLCBUZXN0WmlwNjRJblNtYWxsRmlsZXMsIE90aGVyVGVzdHMsCisgICAgICAgICAgICAgICAgIFB5WmlwRmlsZVRlc3RzLCBEZWNyeXB0aW9uVGVzdHMsIFRlc3RzV2l0aE11bHRpcGxlT3BlbnMsCisgICAgICAgICAgICAgICAgIFRlc3RXaXRoRGlyZWN0b3J5LCBVbml2ZXJzYWxOZXdsaW5lVGVzdHMsCisgICAgICAgICAgICAgICAgIFRlc3RzV2l0aFJhbmRvbUJpbmFyeUZpbGVzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTZiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTZiMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlNjQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlNjQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmM2RjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGZpbGU2NC5weQpAQCAtMCwwICsxLDEyNCBAQAorIyBUZXN0cyBvZiB0aGUgZnVsbCBaSVA2NCBmdW5jdGlvbmFsaXR5IG9mIHppcGZpbGUKKyMgVGhlIHRlc3Rfc3VwcG9ydC5yZXF1aXJlcyBjYWxsIGlzIHRoZSBvbmx5IHJlYXNvbiBmb3Iga2VlcGluZyB0aGlzIHNlcGFyYXRlCisjIGZyb20gdGVzdF96aXBmaWxlCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisjIFhYWChubm9yd2l0eik6IGRpc2FibGUgdGhpcyB0ZXN0IGJ5IGxvb2tpbmcgZm9yIGV4dHJhIGxhcmdmaWxlIHJlc291cmNlCisjIHdoaWNoIGRvZXNuJ3QgZXhpc3QuICBUaGlzIHRlc3QgdGFrZXMgb3ZlciAzMCBtaW51dGVzIHRvIHJ1biBpbiBnZW5lcmFsCisjIGFuZCByZXF1aXJlcyBtb3JlIGRpc2sgc3BhY2UgdGhhbiBtb3N0IG9mIHRoZSBidWlsZGJvdHMuCit0ZXN0X3N1cHBvcnQucmVxdWlyZXMoCisgICAgICAgICdleHRyYWxhcmdlZmlsZScsCisgICAgICAgICd0ZXN0IHJlcXVpcmVzIGxvYWRzIG9mIGRpc2stc3BhY2UgYnl0ZXMgYW5kIGEgbG9uZyB0aW1lIHRvIHJ1bicKKyAgICApCisKKyMgV2UgY2FuIHRlc3QgcGFydCBvZiB0aGUgbW9kdWxlIHdpdGhvdXQgemxpYi4KK3RyeToKKyAgICBpbXBvcnQgemxpYgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHpsaWIgPSBOb25lCisKK2ltcG9ydCB6aXBmaWxlLCBvcywgdW5pdHRlc3QKK2ltcG9ydCB0aW1lCitpbXBvcnQgc3lzCisKK2Zyb20gdGVtcGZpbGUgaW1wb3J0IFRlbXBvcmFyeUZpbGUKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QKKworVEVTVEZOMiA9IFRFU1RGTiArICIyIgorCisjIEhvdyBtdWNoIHRpbWUgaW4gc2Vjb25kcyBjYW4gcGFzcyBiZWZvcmUgd2UgcHJpbnQgYSAnU3RpbGwgd29ya2luZycgbWVzc2FnZS4KK19QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTCA9IDUgKiA2MAorCitjbGFzcyBUZXN0c1dpdGhTb3VyY2VGaWxlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgQ3JlYXRlIHRlc3QgZGF0YS4KKyAgICAgICAgIyB4cmFuZ2UoKSBpcyBpbXBvcnRhbnQgaGVyZSAtLSBkb24ndCB3YW50IHRvIGNyZWF0ZSBpbW1vcnRhbCBzcGFjZQorICAgICAgICAjIGZvciBhIG1pbGxpb24gaW50cy4KKyAgICAgICAgbGluZV9nZW4gPSAoIlRlc3Qgb2YgemlwZmlsZSBsaW5lICVkLiIgJSBpIGZvciBpIGluIHhyYW5nZSgxMDAwMDAwKSkKKyAgICAgICAgc2VsZi5kYXRhID0gJ1xuJy5qb2luKGxpbmVfZ2VuKQorCisgICAgICAgICMgQW5kIHdyaXRlIGl0IHRvIGEgZmlsZS4KKyAgICAgICAgZnAgPSBvcGVuKFRFU1RGTiwgIndiIikKKyAgICAgICAgZnAud3JpdGUoc2VsZi5kYXRhKQorICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgemlwVGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgICMgQ3JlYXRlIHRoZSBaSVAgYXJjaGl2ZS4KKyAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbiwgYWxsb3daaXA2ND1UcnVlKQorCisgICAgICAgICMgSXQgd2lsbCBjb250YWluIGVub3VnaCBjb3BpZXMgb2Ygc2VsZi5kYXRhIHRvIHJlYWNoIGFib3V0IDZHQiBvZgorICAgICAgICAjIHJhdyBkYXRhIHRvIHN0b3JlLgorICAgICAgICBmaWxlY291bnQgPSA2KjEwMjQqKjMgLy8gbGVuKHNlbGYuZGF0YSkKKworICAgICAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAorICAgICAgICBmb3IgbnVtIGluIHJhbmdlKGZpbGVjb3VudCk6CisgICAgICAgICAgICB6aXBmcC53cml0ZXN0cigidGVzdGZuJWQiICUgbnVtLCBzZWxmLmRhdGEpCisgICAgICAgICAgICAjIFByaW50IHN0aWxsIHdvcmtpbmcgbWVzc2FnZSBzaW5jZSB0aGlzIHRlc3QgY2FuIGJlIHJlYWxseSBzbG93CisgICAgICAgICAgICBpZiBuZXh0X3RpbWUgPD0gdGltZS50aW1lKCk6CisgICAgICAgICAgICAgICAgbmV4dF90aW1lID0gdGltZS50aW1lKCkgKyBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwKKyAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5fX3N0ZG91dF9fLCAoCisgICAgICAgICAgICAgICAgICAgJyAgemlwVGVzdCBzdGlsbCB3cml0aW5nICVkIG9mICVkLCBiZSBwYXRpZW50Li4uJyAlCisgICAgICAgICAgICAgICAgICAgKG51bSwgZmlsZWNvdW50KSkKKyAgICAgICAgICAgICAgICBzeXMuX19zdGRvdXRfXy5mbHVzaCgpCisgICAgICAgIHppcGZwLmNsb3NlKCkKKworICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHppcGZwID0gemlwZmlsZS5aaXBGaWxlKGYsICJyIiwgY29tcHJlc3Npb24pCisgICAgICAgIGZvciBudW0gaW4gcmFuZ2UoZmlsZWNvdW50KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZCgidGVzdGZuJWQiICUgbnVtKSwgc2VsZi5kYXRhKQorICAgICAgICAgICAgIyBQcmludCBzdGlsbCB3b3JraW5nIG1lc3NhZ2Ugc2luY2UgdGhpcyB0ZXN0IGNhbiBiZSByZWFsbHkgc2xvdworICAgICAgICAgICAgaWYgbmV4dF90aW1lIDw9IHRpbWUudGltZSgpOgorICAgICAgICAgICAgICAgIG5leHRfdGltZSA9IHRpbWUudGltZSgpICsgX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgKAorICAgICAgICAgICAgICAgICAgICcgIHppcFRlc3Qgc3RpbGwgcmVhZGluZyAlZCBvZiAlZCwgYmUgcGF0aWVudC4uLicgJQorICAgICAgICAgICAgICAgICAgIChudW0sIGZpbGVjb3VudCkpCisgICAgICAgICAgICAgICAgc3lzLl9fc3Rkb3V0X18uZmx1c2goKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFN0b3JlZChzZWxmKToKKyAgICAgICAgIyBUcnkgdGhlIHRlbXAgZmlsZSBmaXJzdC4gIElmIHdlIGRvIFRFU1RGTjIgZmlyc3QsIHRoZW4gaXQgaG9ncworICAgICAgICAjIGdpZ2FieXRlcyBvZiBkaXNrIHNwYWNlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHRlc3QuCisgICAgICAgIGZvciBmIGluIFRlbXBvcmFyeUZpbGUoKSwgVEVTVEZOMjoKKyAgICAgICAgICAgIHNlbGYuemlwVGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBpZiB6bGliOgorICAgICAgICBkZWYgdGVzdERlZmxhdGVkKHNlbGYpOgorICAgICAgICAgICAgIyBUcnkgdGhlIHRlbXAgZmlsZSBmaXJzdC4gIElmIHdlIGRvIFRFU1RGTjIgZmlyc3QsIHRoZW4gaXQgaG9ncworICAgICAgICAgICAgIyBnaWdhYnl0ZXMgb2YgZGlzayBzcGFjZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB0ZXN0LgorICAgICAgICAgICAgZm9yIGYgaW4gVGVtcG9yYXJ5RmlsZSgpLCBURVNURk4yOgorICAgICAgICAgICAgICAgIHNlbGYuemlwVGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIGZuYW1lIGluIFRFU1RGTiwgVEVTVEZOMjoKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuYW1lKToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZm5hbWUpCisKKworY2xhc3MgT3RoZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RNb3JlVGhhbjY0a0ZpbGVzKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdCBjaGVja3MgdGhhdCBtb3JlIHRoYW4gNjRrIGZpbGVzIGNhbiBiZSBhZGRlZCB0byBhbiBhcmNoaXZlLAorICAgICAgICAjIGFuZCB0aGF0IHRoZSByZXN1bHRpbmcgYXJjaGl2ZSBjYW4gYmUgcmVhZCBwcm9wZXJseSBieSBaaXBGaWxlCisgICAgICAgIHppcGYgPSB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJ3IikKKyAgICAgICAgemlwZi5kZWJ1ZyA9IDEwMAorICAgICAgICBudW1maWxlcyA9ICgxIDw8IDE2KSAqIDMvMgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobnVtZmlsZXMpOgorICAgICAgICAgICAgemlwZi53cml0ZXN0cigiZm9vJTA4ZCIgJSBpLCAiJWQiICUgKGkqKjMgJSA1NykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHppcGYubmFtZWxpc3QoKSksIG51bWZpbGVzKQorICAgICAgICB6aXBmLmNsb3NlKCkKKworICAgICAgICB6aXBmMiA9IHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih6aXBmMi5uYW1lbGlzdCgpKSwgbnVtZmlsZXMpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShudW1maWxlcyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYyLnJlYWQoImZvbyUwOGQiICUgaSksICIlZCIgJSAoaSoqMyAlIDU3KSkKKyAgICAgICAgemlwZi5jbG9zZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoVEVTVEZOKQorICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKFRFU1RGTjIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdHNXaXRoU291cmNlRmlsZSwgT3RoZXJUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwZmlsZTY0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGZpbGU2NC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3NDdiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGZpbGU2NC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwZmlsZTY0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGZpbGU2NC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3NDdiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGZpbGU2NC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NjczOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKQEAgLTAsMCArMSw0NzIgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IG1hcnNoYWwKK2ltcG9ydCBpbXAKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X2ltcG9ydGhvb2tzIGltcG9ydCBJbXBvcnRIb29rc0Jhc2VUZXN0Q2FzZSwgdGVzdF9zcmMsIHRlc3RfY28KKworIyBzb21lIHRlc3RzIGNhbiBiZSByYW4gZXZlbiB3aXRob3V0IHpsaWIKK3RyeToKKyAgICBpbXBvcnQgemxpYgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHpsaWIgPSBOb25lCisKK2Zyb20gemlwZmlsZSBpbXBvcnQgWmlwRmlsZSwgWmlwSW5mbywgWklQX1NUT1JFRCwgWklQX0RFRkxBVEVECisKK2ltcG9ydCB6aXBpbXBvcnQKK2ltcG9ydCBsaW5lY2FjaGUKK2ltcG9ydCBkb2N0ZXN0CitpbXBvcnQgaW5zcGVjdAoraW1wb3J0IFN0cmluZ0lPCitmcm9tIHRyYWNlYmFjayBpbXBvcnQgZXh0cmFjdF90YiwgZXh0cmFjdF9zdGFjaywgcHJpbnRfdGIKK3JhaXNlX3NyYyA9ICdkZWYgZG9fcmFpc2UoKTogcmFpc2UgVHlwZUVycm9yXG4nCisKK2RlZiBtYWtlX3B5YyhjbywgbXRpbWUpOgorICAgIGRhdGEgPSBtYXJzaGFsLmR1bXBzKGNvKQorICAgIGlmIHR5cGUobXRpbWUpIGlzIHR5cGUoMC4wKToKKyAgICAgICAgIyBNYWMgbXRpbWVzIG5lZWQgYSBiaXQgb2Ygc3BlY2lhbCBjYXNpbmcKKyAgICAgICAgaWYgbXRpbWUgPCAweDdmZmZmZmZmOgorICAgICAgICAgICAgbXRpbWUgPSBpbnQobXRpbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtdGltZSA9IGludCgtMHgxMDAwMDAwMDBMICsgbG9uZyhtdGltZSkpCisgICAgcHljID0gaW1wLmdldF9tYWdpYygpICsgc3RydWN0LnBhY2soIjxpIiwgaW50KG10aW1lKSkgKyBkYXRhCisgICAgcmV0dXJuIHB5YworCitkZWYgbW9kdWxlX3BhdGhfdG9fZG90dGVkX25hbWUocGF0aCk6CisgICAgcmV0dXJuIHBhdGgucmVwbGFjZShvcy5zZXAsICcuJykKKworTk9XID0gdGltZS50aW1lKCkKK3Rlc3RfcHljID0gbWFrZV9weWModGVzdF9jbywgTk9XKQorCisKK2lmIF9fZGVidWdfXzoKKyAgICBweWNfZXh0ID0gIi5weWMiCitlbHNlOgorICAgIHB5Y19leHQgPSAiLnB5byIKKworCitURVNUTU9EID0gInppcHRlc3Rtb2R1bGUiCitURVNUUEFDSyA9ICJ6aXB0ZXN0cGFja2FnZSIKK1RFU1RQQUNLMiA9ICJ6aXB0ZXN0cGFja2FnZTIiCitURU1QX1pJUCA9IG9zLnBhdGguYWJzcGF0aCgianVuazk1MTQyIiArIG9zLmV4dHNlcCArICJ6aXAiKQorCisKK2NsYXNzIFVuY29tcHJlc3NlZFppcEltcG9ydFRlc3RDYXNlKEltcG9ydEhvb2tzQmFzZVRlc3RDYXNlKToKKworICAgIGNvbXByZXNzaW9uID0gWklQX1NUT1JFRAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIFdlJ3JlIHJldXNpbmcgdGhlIHppcCBhcmNoaXZlIHBhdGgsIHNvIHdlIG11c3QgY2xlYXIgdGhlCisgICAgICAgICMgY2FjaGVkIGRpcmVjdG9yeSBpbmZvIGFuZCBsaW5lY2FjaGUKKyAgICAgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY2xlYXIoKQorICAgICAgICBJbXBvcnRIb29rc0Jhc2VUZXN0Q2FzZS5zZXRVcChzZWxmKQorCisgICAgZGVmIGRvVGVzdChzZWxmLCBleHBlY3RlZF9leHQsIGZpbGVzLCAqbW9kdWxlcywgKiprdyk6CisgICAgICAgIHogPSBaaXBGaWxlKFRFTVBfWklQLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBuYW1lLCAobXRpbWUsIGRhdGEpIGluIGZpbGVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgemluZm8gPSBaaXBJbmZvKG5hbWUsIHRpbWUubG9jYWx0aW1lKG10aW1lKSkKKyAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gc2VsZi5jb21wcmVzc2lvbgorICAgICAgICAgICAgICAgIHoud3JpdGVzdHIoemluZm8sIGRhdGEpCisgICAgICAgICAgICB6LmNsb3NlKCkKKworICAgICAgICAgICAgc3R1ZmYgPSBrdy5nZXQoInN0dWZmIiwgTm9uZSkKKyAgICAgICAgICAgIGlmIHN0dWZmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgUHJlcGVuZCAnc3R1ZmYnIHRvIHRoZSBzdGFydCBvZiB0aGUgemlwZmlsZQorICAgICAgICAgICAgICAgIGYgPSBvcGVuKFRFTVBfWklQLCAicmIiKQorICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICAgICAgZiA9IG9wZW4oVEVNUF9aSVAsICJ3YiIpCisgICAgICAgICAgICAgICAgZi53cml0ZShzdHVmZikKKyAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBURU1QX1pJUCkKKworICAgICAgICAgICAgbW9kID0gX19pbXBvcnRfXygiLiIuam9pbihtb2R1bGVzKSwgZ2xvYmFscygpLCBsb2NhbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJfX2R1bW15X18iXSkKKworICAgICAgICAgICAgY2FsbCA9IGt3LmdldCgnY2FsbCcpCisgICAgICAgICAgICBpZiBjYWxsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGNhbGwobW9kKQorCisgICAgICAgICAgICBpZiBleHBlY3RlZF9leHQ6CisgICAgICAgICAgICAgICAgZmlsZSA9IG1vZC5nZXRfZmlsZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlLCBvcy5wYXRoLmpvaW4oVEVNUF9aSVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbW9kdWxlcykgKyBleHBlY3RlZF9leHQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB6LmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnJlbW92ZShURU1QX1pJUCkKKworICAgIGRlZiB0ZXN0QUZha2VabGliKHNlbGYpOgorICAgICAgICAjCisgICAgICAgICMgVGhpcyBjb3VsZCBjYXVzZSBhIHN0YWNrIG92ZXJmbG93IGJlZm9yZTogaW1wb3J0aW5nIHpsaWIucHkKKyAgICAgICAgIyBmcm9tIGEgY29tcHJlc3NlZCBhcmNoaXZlIHdvdWxkIGNhdXNlIHpsaWIgdG8gYmUgaW1wb3J0ZWQKKyAgICAgICAgIyB3aGljaCB3b3VsZCBmaW5kIHpsaWIucHkgaW4gdGhlIGFyY2hpdmUsIHdoaWNoIHdvdWxkLi4uIGV0Yy4KKyAgICAgICAgIworICAgICAgICAjIFRoaXMgdGVzdCAqbXVzdCogYmUgZXhlY3V0ZWQgZmlyc3Q6IGl0IG11c3QgYmUgdGhlIGZpcnN0IG9uZQorICAgICAgICAjIHRvIHRyaWdnZXIgemlwaW1wb3J0IHRvIGltcG9ydCB6bGliICh6aXBpbXBvcnQgY2FjaGVzIHRoZQorICAgICAgICAjIHpsaWIuZGVjb21wcmVzcyBmdW5jdGlvbiBvYmplY3QsIGFmdGVyIHdoaWNoIHRoZSBwcm9ibGVtIGJlaW5nCisgICAgICAgICMgdGVzdGVkIGhlcmUgd291bGRuJ3QgYmUgYSBwcm9ibGVtIGFueW1vcmUuLi4KKyAgICAgICAgIyAoSGVuY2UgdGhlICdBJyBpbiB0aGUgdGVzdCBtZXRob2QgbmFtZTogdG8gbWFrZSBpdCB0aGUgZmlyc3QKKyAgICAgICAgIyBpdGVtIGluIGEgbGlzdCBzb3J0ZWQgYnkgbmFtZSwgbGlrZSB1bml0dGVzdC5tYWtlU3VpdGUoKSBkb2VzLikKKyAgICAgICAgIworICAgICAgICAjIFRoaXMgdGVzdCBmYWlscyBvbiBwbGF0Zm9ybXMgb24gd2hpY2ggdGhlIHpsaWIgbW9kdWxlIGlzCisgICAgICAgICMgc3RhdGljYWxseSBsaW5rZWQsIGJ1dCB0aGUgcHJvYmxlbSBpdCB0ZXN0cyBmb3IgY2FuJ3QKKyAgICAgICAgIyBvY2N1ciBpbiB0aGF0IGNhc2UgKGJ1aWx0aW4gbW9kdWxlcyBhcmUgYWx3YXlzIGZvdW5kIGZpcnN0KSwKKyAgICAgICAgIyBzbyB3ZSdsbCBzaW1wbHkgc2tpcCBpdCB0aGVuLiBCdWcgIzc2NTQ1Ni4KKyAgICAgICAgIworICAgICAgICBpZiAiemxpYiIgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmICJ6bGliIiBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1siemxpYiJdCisgICAgICAgIGZpbGVzID0geyJ6bGliLnB5IjogKE5PVywgdGVzdF9zcmMpfQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRvVGVzdCgiLnB5IiwgZmlsZXMsICJ6bGliIikKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaWYgc2VsZi5jb21wcmVzc2lvbiAhPSBaSVBfREVGTEFURUQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCB0ZXN0IHRvIG5vdCByYWlzZSBJbXBvcnRFcnJvciIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLmNvbXByZXNzaW9uICE9IFpJUF9TVE9SRUQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCB0ZXN0IHRvIHJhaXNlIEltcG9ydEVycm9yIikKKworICAgIGRlZiB0ZXN0UHkoc2VsZik6CisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgdGVzdF9zcmMpfQorICAgICAgICBzZWxmLmRvVGVzdCgiLnB5IiwgZmlsZXMsIFRFU1RNT0QpCisKKyAgICBkZWYgdGVzdFB5YyhzZWxmKToKKyAgICAgICAgZmlsZXMgPSB7VEVTVE1PRCArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKX0KKyAgICAgICAgc2VsZi5kb1Rlc3QocHljX2V4dCwgZmlsZXMsIFRFU1RNT0QpCisKKyAgICBkZWYgdGVzdEJvdGgoc2VsZik6CisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgdGVzdF9zcmMpLAorICAgICAgICAgICAgICAgICBURVNUTU9EICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpfQorICAgICAgICBzZWxmLmRvVGVzdChweWNfZXh0LCBmaWxlcywgVEVTVE1PRCkKKworICAgIGRlZiB0ZXN0RW1wdHlQeShzZWxmKToKKyAgICAgICAgZmlsZXMgPSB7VEVTVE1PRCArICIucHkiOiAoTk9XLCAiIil9CisgICAgICAgIHNlbGYuZG9UZXN0KE5vbmUsIGZpbGVzLCBURVNUTU9EKQorCisgICAgZGVmIHRlc3RCYWRNYWdpYyhzZWxmKToKKyAgICAgICAgIyBtYWtlIHB5YyBtYWdpYyB3b3JkIGludmFsaWQsIGZvcmNpbmcgbG9hZGluZyBmcm9tIC5weQorICAgICAgICBtMCA9IG9yZCh0ZXN0X3B5Y1swXSkKKyAgICAgICAgbTAgXj0gMHgwNCAgIyBmbGlwIGFuIGFyYml0cmFyeSBiaXQKKyAgICAgICAgYmFkbWFnaWNfcHljID0gY2hyKG0wKSArIHRlc3RfcHljWzE6XQorICAgICAgICBmaWxlcyA9IHtURVNUTU9EICsgIi5weSI6IChOT1csIHRlc3Rfc3JjKSwKKyAgICAgICAgICAgICAgICAgVEVTVE1PRCArIHB5Y19leHQ6IChOT1csIGJhZG1hZ2ljX3B5Yyl9CisgICAgICAgIHNlbGYuZG9UZXN0KCIucHkiLCBmaWxlcywgVEVTVE1PRCkKKworICAgIGRlZiB0ZXN0QmFkTWFnaWMyKHNlbGYpOgorICAgICAgICAjIG1ha2UgcHljIG1hZ2ljIHdvcmQgaW52YWxpZCwgY2F1c2luZyBhbiBJbXBvcnRFcnJvcgorICAgICAgICBtMCA9IG9yZCh0ZXN0X3B5Y1swXSkKKyAgICAgICAgbTAgXj0gMHgwNCAgIyBmbGlwIGFuIGFyYml0cmFyeSBiaXQKKyAgICAgICAgYmFkbWFnaWNfcHljID0gY2hyKG0wKSArIHRlc3RfcHljWzE6XQorICAgICAgICBmaWxlcyA9IHtURVNUTU9EICsgcHljX2V4dDogKE5PVywgYmFkbWFnaWNfcHljKX0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kb1Rlc3QoIi5weSIsIGZpbGVzLCBURVNUTU9EKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIEltcG9ydEVycm9yOyBpbXBvcnQgZnJvbSBiYWQgcHljIikKKworICAgIGRlZiB0ZXN0QmFkTVRpbWUoc2VsZik6CisgICAgICAgIHQzID0gb3JkKHRlc3RfcHljWzddKQorICAgICAgICB0MyBePSAweDAyICAjIGZsaXAgdGhlIHNlY29uZCBiaXQgLS0gbm90IHRoZSBmaXJzdCBhcyB0aGF0IG9uZQorICAgICAgICAgICAgICAgICAgICAjIGlzbid0IHN0b3JlZCBpbiB0aGUgLnB5J3MgbXRpbWUgaW4gdGhlIHppcCBhcmNoaXZlLgorICAgICAgICBiYWR0aW1lX3B5YyA9IHRlc3RfcHljWzo3XSArIGNocih0MykgKyB0ZXN0X3B5Y1s4Ol0KKyAgICAgICAgZmlsZXMgPSB7VEVTVE1PRCArICIucHkiOiAoTk9XLCB0ZXN0X3NyYyksCisgICAgICAgICAgICAgICAgIFRFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCBiYWR0aW1lX3B5Yyl9CisgICAgICAgIHNlbGYuZG9UZXN0KCIucHkiLCBmaWxlcywgVEVTVE1PRCkKKworICAgIGRlZiB0ZXN0UGFja2FnZShzZWxmKToKKyAgICAgICAgcGFja2RpciA9IFRFU1RQQUNLICsgb3Muc2VwCisgICAgICAgIGZpbGVzID0ge3BhY2tkaXIgKyAiX19pbml0X18iICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpLAorICAgICAgICAgICAgICAgICBwYWNrZGlyICsgVEVTVE1PRCArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKX0KKyAgICAgICAgc2VsZi5kb1Rlc3QocHljX2V4dCwgZmlsZXMsIFRFU1RQQUNLLCBURVNUTU9EKQorCisgICAgZGVmIHRlc3REZWVwUGFja2FnZShzZWxmKToKKyAgICAgICAgcGFja2RpciA9IFRFU1RQQUNLICsgb3Muc2VwCisgICAgICAgIHBhY2tkaXIyID0gcGFja2RpciArIFRFU1RQQUNLMiArIG9zLnNlcAorICAgICAgICBmaWxlcyA9IHtwYWNrZGlyICsgIl9faW5pdF9fIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKKyAgICAgICAgICAgICAgICAgcGFja2RpcjIgKyAiX19pbml0X18iICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpLAorICAgICAgICAgICAgICAgICBwYWNrZGlyMiArIFRFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5Yyl9CisgICAgICAgIHNlbGYuZG9UZXN0KHB5Y19leHQsIGZpbGVzLCBURVNUUEFDSywgVEVTVFBBQ0syLCBURVNUTU9EKQorCisgICAgZGVmIHRlc3RaaXBJbXBvcnRlck1ldGhvZHMoc2VsZik6CisgICAgICAgIHBhY2tkaXIgPSBURVNUUEFDSyArIG9zLnNlcAorICAgICAgICBwYWNrZGlyMiA9IHBhY2tkaXIgKyBURVNUUEFDSzIgKyBvcy5zZXAKKyAgICAgICAgZmlsZXMgPSB7cGFja2RpciArICJfX2luaXRfXyIgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5YyksCisgICAgICAgICAgICAgICAgIHBhY2tkaXIyICsgIl9faW5pdF9fIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKKyAgICAgICAgICAgICAgICAgcGFja2RpcjIgKyBURVNUTU9EICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpfQorCisgICAgICAgIHogPSBaaXBGaWxlKFRFTVBfWklQLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBuYW1lLCAobXRpbWUsIGRhdGEpIGluIGZpbGVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgemluZm8gPSBaaXBJbmZvKG5hbWUsIHRpbWUubG9jYWx0aW1lKG10aW1lKSkKKyAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gc2VsZi5jb21wcmVzc2lvbgorICAgICAgICAgICAgICAgIHoud3JpdGVzdHIoemluZm8sIGRhdGEpCisgICAgICAgICAgICB6LmNsb3NlKCkKKworICAgICAgICAgICAgemkgPSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIoVEVNUF9aSVApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmFyY2hpdmUsIFRFTVBfWklQKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5pc19wYWNrYWdlKFRFU1RQQUNLKSwgVHJ1ZSkKKyAgICAgICAgICAgIG1vZCA9IHppLmxvYWRfbW9kdWxlKFRFU1RQQUNLKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5nZXRfZmlsZW5hbWUoVEVTVFBBQ0spLCBtb2QuX19maWxlX18pCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuaXNfcGFja2FnZShwYWNrZGlyICsgJ19faW5pdF9fJyksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5pc19wYWNrYWdlKHBhY2tkaXIgKyBURVNUUEFDSzIpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5pc19wYWNrYWdlKHBhY2tkaXIyICsgVEVTVE1PRCksIEZhbHNlKQorCisgICAgICAgICAgICBtb2RfcGF0aCA9IHBhY2tkaXIyICsgVEVTVE1PRAorICAgICAgICAgICAgbW9kX25hbWUgPSBtb2R1bGVfcGF0aF90b19kb3R0ZWRfbmFtZShtb2RfcGF0aCkKKyAgICAgICAgICAgIF9faW1wb3J0X18obW9kX25hbWUpCisgICAgICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1ttb2RfbmFtZV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuZ2V0X3NvdXJjZShURVNUUEFDSyksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmdldF9zb3VyY2UobW9kX3BhdGgpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5nZXRfZmlsZW5hbWUobW9kX3BhdGgpLCBtb2QuX19maWxlX18pCisgICAgICAgICAgICAjIFRvIHBhc3MgaW4gdGhlIG1vZHVsZSBuYW1lIGluc3RlYWQgb2YgdGhlIHBhdGgsIHdlIG11c3QgdXNlIHRoZSByaWdodCBpbXBvcnRlcgorICAgICAgICAgICAgbG9hZGVyID0gbW9kLl9fbG9hZGVyX18KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmdldF9zb3VyY2UobW9kX25hbWUpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIuZ2V0X2ZpbGVuYW1lKG1vZF9uYW1lKSwgbW9kLl9fZmlsZV9fKQorCisgICAgICAgICAgICAjIHRlc3QgcHJlZml4IGFuZCBhcmNoaXZlcGF0aCBtZW1iZXJzCisgICAgICAgICAgICB6aTIgPSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIoVEVNUF9aSVAgKyBvcy5zZXAgKyBURVNUUEFDSykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkyLmFyY2hpdmUsIFRFTVBfWklQKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aTIucHJlZml4LCBURVNUUEFDSyArIG9zLnNlcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHouY2xvc2UoKQorICAgICAgICAgICAgb3MucmVtb3ZlKFRFTVBfWklQKQorCisgICAgZGVmIHRlc3RaaXBJbXBvcnRlck1ldGhvZHNJblN1YkRpcmVjdG9yeShzZWxmKToKKyAgICAgICAgcGFja2RpciA9IFRFU1RQQUNLICsgb3Muc2VwCisgICAgICAgIHBhY2tkaXIyID0gcGFja2RpciArIFRFU1RQQUNLMiArIG9zLnNlcAorICAgICAgICBmaWxlcyA9IHtwYWNrZGlyMiArICJfX2luaXRfXyIgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5YyksCisgICAgICAgICAgICAgICAgIHBhY2tkaXIyICsgVEVTVE1PRCArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKX0KKworICAgICAgICB6ID0gWmlwRmlsZShURU1QX1pJUCwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbmFtZSwgKG10aW1lLCBkYXRhKSBpbiBmaWxlcy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHppbmZvID0gWmlwSW5mbyhuYW1lLCB0aW1lLmxvY2FsdGltZShtdGltZSkpCisgICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHNlbGYuY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICB6LndyaXRlc3RyKHppbmZvLCBkYXRhKQorICAgICAgICAgICAgei5jbG9zZSgpCisKKyAgICAgICAgICAgIHppID0gemlwaW1wb3J0LnppcGltcG9ydGVyKFRFTVBfWklQICsgb3Muc2VwICsgcGFja2RpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuYXJjaGl2ZSwgVEVNUF9aSVApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLnByZWZpeCwgcGFja2RpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuaXNfcGFja2FnZShURVNUUEFDSzIpLCBUcnVlKQorICAgICAgICAgICAgbW9kID0gemkubG9hZF9tb2R1bGUoVEVTVFBBQ0syKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5nZXRfZmlsZW5hbWUoVEVTVFBBQ0syKSwgbW9kLl9fZmlsZV9fKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmlzX3BhY2thZ2UoVEVTVFBBQ0syICsgb3Muc2VwICsgJ19faW5pdF9fJyksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5pc19wYWNrYWdlKFRFU1RQQUNLMiArIG9zLnNlcCArIFRFU1RNT0QpLCBGYWxzZSkKKworICAgICAgICAgICAgbW9kX3BhdGggPSBURVNUUEFDSzIgKyBvcy5zZXAgKyBURVNUTU9ECisgICAgICAgICAgICBtb2RfbmFtZSA9IG1vZHVsZV9wYXRoX3RvX2RvdHRlZF9uYW1lKG1vZF9wYXRoKQorICAgICAgICAgICAgX19pbXBvcnRfXyhtb2RfbmFtZSkKKyAgICAgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW21vZF9uYW1lXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5nZXRfc291cmNlKFRFU1RQQUNLMiksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmdldF9zb3VyY2UobW9kX3BhdGgpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5nZXRfZmlsZW5hbWUobW9kX3BhdGgpLCBtb2QuX19maWxlX18pCisgICAgICAgICAgICAjIFRvIHBhc3MgaW4gdGhlIG1vZHVsZSBuYW1lIGluc3RlYWQgb2YgdGhlIHBhdGgsIHdlIG11c3QgdXNlIHRoZSByaWdodCBpbXBvcnRlcgorICAgICAgICAgICAgbG9hZGVyID0gbW9kLl9fbG9hZGVyX18KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmdldF9zb3VyY2UobW9kX25hbWUpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIuZ2V0X2ZpbGVuYW1lKG1vZF9uYW1lKSwgbW9kLl9fZmlsZV9fKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgei5jbG9zZSgpCisgICAgICAgICAgICBvcy5yZW1vdmUoVEVNUF9aSVApCisKKyAgICBkZWYgdGVzdEdldERhdGEoc2VsZik6CisgICAgICAgIHogPSBaaXBGaWxlKFRFTVBfWklQLCAidyIpCisgICAgICAgIHouY29tcHJlc3Npb24gPSBzZWxmLmNvbXByZXNzaW9uCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWUgPSAidGVzdGRhdGEuZGF0IgorICAgICAgICAgICAgZGF0YSA9ICIiLmpvaW4oW2Nocih4KSBmb3IgeCBpbiByYW5nZSgyNTYpXSkgKiA1MDAKKyAgICAgICAgICAgIHoud3JpdGVzdHIobmFtZSwgZGF0YSkKKyAgICAgICAgICAgIHouY2xvc2UoKQorICAgICAgICAgICAgemkgPSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIoVEVNUF9aSVApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHppLmdldF9kYXRhKG5hbWUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignemlwaW1wb3J0ZXIgb2JqZWN0JywgcmVwcih6aSkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB6LmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnJlbW92ZShURU1QX1pJUCkKKworICAgIGRlZiB0ZXN0SW1wb3J0ZXJBdHRyKHNlbGYpOgorICAgICAgICBzcmMgPSAiIiJpZiAxOiAgIyBpbmRlbnQgaGFjaworICAgICAgICBkZWYgZ2V0X2ZpbGUoKToKKyAgICAgICAgICAgIHJldHVybiBfX2ZpbGVfXworICAgICAgICBpZiBfX2xvYWRlcl9fLmdldF9kYXRhKCJzb21lLmRhdGEiKSAhPSAic29tZSBkYXRhIjoKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCAiYmFkIGRhdGEiXG4iIiIKKyAgICAgICAgcHljID0gbWFrZV9weWMoY29tcGlsZShzcmMsICI8Pz8/PiIsICJleGVjIiksIE5PVykKKyAgICAgICAgZmlsZXMgPSB7VEVTVE1PRCArIHB5Y19leHQ6IChOT1csIHB5YyksCisgICAgICAgICAgICAgICAgICJzb21lLmRhdGEiOiAoTk9XLCAic29tZSBkYXRhIil9CisgICAgICAgIHNlbGYuZG9UZXN0KHB5Y19leHQsIGZpbGVzLCBURVNUTU9EKQorCisgICAgZGVmIHRlc3RJbXBvcnRfV2l0aFN0dWZmKHNlbGYpOgorICAgICAgICAjIHRyeSBpbXBvcnRpbmcgZnJvbSBhIHppcGZpbGUgd2hpY2ggY29udGFpbnMgYWRkaXRpb25hbAorICAgICAgICAjIHN0dWZmIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUKKyAgICAgICAgZmlsZXMgPSB7VEVTVE1PRCArICIucHkiOiAoTk9XLCB0ZXN0X3NyYyl9CisgICAgICAgIHNlbGYuZG9UZXN0KCIucHkiLCBmaWxlcywgVEVTVE1PRCwKKyAgICAgICAgICAgICAgICAgICAgc3R1ZmY9IlNvbWUgU3R1ZmYiKjMxKQorCisgICAgZGVmIGFzc2VydE1vZHVsZVNvdXJjZShzZWxmLCBtb2R1bGUpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0c291cmNlKG1vZHVsZSksIHRlc3Rfc3JjKQorCisgICAgZGVmIHRlc3RHZXRTb3VyY2Uoc2VsZik6CisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgdGVzdF9zcmMpfQorICAgICAgICBzZWxmLmRvVGVzdCgiLnB5IiwgZmlsZXMsIFRFU1RNT0QsIGNhbGw9c2VsZi5hc3NlcnRNb2R1bGVTb3VyY2UpCisKKyAgICBkZWYgdGVzdEdldENvbXBpbGVkU291cmNlKHNlbGYpOgorICAgICAgICBweWMgPSBtYWtlX3B5Yyhjb21waWxlKHRlc3Rfc3JjLCAiPD8/Pz4iLCAiZXhlYyIpLCBOT1cpCisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgdGVzdF9zcmMpLAorICAgICAgICAgICAgICAgICBURVNUTU9EICsgcHljX2V4dDogKE5PVywgcHljKX0KKyAgICAgICAgc2VsZi5kb1Rlc3QocHljX2V4dCwgZmlsZXMsIFRFU1RNT0QsIGNhbGw9c2VsZi5hc3NlcnRNb2R1bGVTb3VyY2UpCisKKyAgICBkZWYgcnVuRG9jdGVzdChzZWxmLCBjYWxsYmFjayk6CisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgdGVzdF9zcmMpLAorICAgICAgICAgICAgICAgICAieHl6LnR4dCI6IChOT1csICI+Pj4gbG9nLmFwcGVuZChUcnVlKVxuIil9CisgICAgICAgIHNlbGYuZG9UZXN0KCIucHkiLCBmaWxlcywgVEVTVE1PRCwgY2FsbD1jYWxsYmFjaykKKworICAgIGRlZiBkb0RvY3Rlc3RGaWxlKHNlbGYsIG1vZHVsZSk6CisgICAgICAgIGxvZyA9IFtdCisgICAgICAgIG9sZF9tYXN0ZXIsIGRvY3Rlc3QubWFzdGVyID0gZG9jdGVzdC5tYXN0ZXIsIE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZG9jdGVzdC50ZXN0ZmlsZSgKKyAgICAgICAgICAgICAgICAneHl6LnR4dCcsIHBhY2thZ2U9bW9kdWxlLCBtb2R1bGVfcmVsYXRpdmU9VHJ1ZSwKKyAgICAgICAgICAgICAgICBnbG9icz1sb2NhbHMoKQorICAgICAgICAgICAgKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZG9jdGVzdC5tYXN0ZXIgPSBvbGRfbWFzdGVyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nLFtUcnVlXSkKKworICAgIGRlZiB0ZXN0RG9jdGVzdEZpbGUoc2VsZik6CisgICAgICAgIHNlbGYucnVuRG9jdGVzdChzZWxmLmRvRG9jdGVzdEZpbGUpCisKKyAgICBkZWYgZG9Eb2N0ZXN0U3VpdGUoc2VsZiwgbW9kdWxlKToKKyAgICAgICAgbG9nID0gW10KKyAgICAgICAgZG9jdGVzdC5Eb2NGaWxlVGVzdCgKKyAgICAgICAgICAgICd4eXoudHh0JywgcGFja2FnZT1tb2R1bGUsIG1vZHVsZV9yZWxhdGl2ZT1UcnVlLAorICAgICAgICAgICAgZ2xvYnM9bG9jYWxzKCkKKyAgICAgICAgKS5ydW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZyxbVHJ1ZV0pCisKKyAgICBkZWYgdGVzdERvY3Rlc3RTdWl0ZShzZWxmKToKKyAgICAgICAgc2VsZi5ydW5Eb2N0ZXN0KHNlbGYuZG9Eb2N0ZXN0U3VpdGUpCisKKyAgICBkZWYgZG9UcmFjZWJhY2soc2VsZiwgbW9kdWxlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kdWxlLmRvX3JhaXNlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdGIgPSBzeXMuZXhjX2luZm8oKVsyXS50Yl9uZXh0CisKKyAgICAgICAgICAgIGYsbG5vLG4sbGluZSA9IGV4dHJhY3RfdGIodGIsIDEpWzBdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIHJhaXNlX3NyYy5zdHJpcCgpKQorCisgICAgICAgICAgICBmLGxubyxuLGxpbmUgPSBleHRyYWN0X3N0YWNrKHRiLnRiX2ZyYW1lLCAxKVswXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCByYWlzZV9zcmMuc3RyaXAoKSkKKworICAgICAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIHByaW50X3RiKHRiLCAxLCBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0dmFsdWUoKS5lbmRzd2l0aChyYWlzZV9zcmMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlRoaXMgb3VnaHQgdG8gYmUgaW1wb3NzaWJsZSIpCisKKyAgICBkZWYgdGVzdFRyYWNlYmFjayhzZWxmKToKKyAgICAgICAgZmlsZXMgPSB7VEVTVE1PRCArICIucHkiOiAoTk9XLCByYWlzZV9zcmMpfQorICAgICAgICBzZWxmLmRvVGVzdChOb25lLCBmaWxlcywgVEVTVE1PRCwgY2FsbD1zZWxmLmRvVHJhY2ViYWNrKQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKK2NsYXNzIENvbXByZXNzZWRaaXBJbXBvcnRUZXN0Q2FzZShVbmNvbXByZXNzZWRaaXBJbXBvcnRUZXN0Q2FzZSk6CisgICAgY29tcHJlc3Npb24gPSBaSVBfREVGTEFURUQKKworCitjbGFzcyBCYWRGaWxlWmlwSW1wb3J0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBhc3NlcnRaaXBGYWlsdXJlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoemlwaW1wb3J0LlppcEltcG9ydEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICB6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIGZpbGVuYW1lKQorCisgICAgZGVmIHRlc3ROb0ZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0WmlwRmFpbHVyZSgnQWRmamRrRkpLREZKamRrbGZqcycpCisKKyAgICBkZWYgdGVzdEVtcHR5RmlsZW5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0WmlwRmFpbHVyZSgnJykKKworICAgIGRlZiB0ZXN0QmFkQXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB6aXBpbXBvcnQuemlwaW1wb3J0ZXIsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgemlwaW1wb3J0LnppcGltcG9ydGVyLCBURVNUTU9ELCBrd2Q9Tm9uZSkKKworICAgIGRlZiB0ZXN0RmlsZW5hbWVUb29Mb25nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFppcEZhaWx1cmUoJ0EnICogMzMwMDApCisKKyAgICBkZWYgdGVzdEVtcHR5RmlsZShzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNUTU9EKQorICAgICAgICBvcGVuKFRFU1RNT0QsICd3KycpLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRaaXBGYWlsdXJlKFRFU1RNT0QpCisKKyAgICBkZWYgdGVzdEZpbGVVbnJlYWRhYmxlKHNlbGYpOgorICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKFRFU1RNT0QpCisgICAgICAgIGZkID0gb3Mub3BlbihURVNUTU9ELCBvcy5PX0NSRUFULCAwMDApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRaaXBGYWlsdXJlKFRFU1RNT0QpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAjIElmIHdlIGxlYXZlICJ0aGUgcmVhZC1vbmx5IGJpdCIgc2V0IG9uIFdpbmRvd3MsIG5vdGhpbmcgY2FuCisgICAgICAgICAgICAjIGRlbGV0ZSBURVNUTU9ELCBhbmQgbGF0ZXIgdGVzdHMgc3VmZmVyIGJvZ3VzIGZhaWx1cmVzLgorICAgICAgICAgICAgb3MuY2htb2QoVEVTVE1PRCwgMDY2NikKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoVEVTVE1PRCkKKworICAgIGRlZiB0ZXN0Tm90WmlwRmlsZShzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNUTU9EKQorICAgICAgICBmcCA9IG9wZW4oVEVTVE1PRCwgJ3crJykKKyAgICAgICAgZnAud3JpdGUoJ2EnICogMjIpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRaaXBGYWlsdXJlKFRFU1RNT0QpCisKKyAgICAjIFhYWDogZGlzYWJsZWQgdW50aWwgdGhpcyB3b3JrcyBvbiBCaWctZW5kaWFuIG1hY2hpbmVzCisgICAgZGVmIF90ZXN0Qm9ndXNaaXBGaWxlKHNlbGYpOgorICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKFRFU1RNT0QpCisgICAgICAgIGZwID0gb3BlbihURVNUTU9ELCAndysnKQorICAgICAgICBmcC53cml0ZShzdHJ1Y3QucGFjaygnPUknLCAweDA2MDU0QjUwKSkKKyAgICAgICAgZnAud3JpdGUoJ2EnICogMTgpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgeiA9IHppcGltcG9ydC56aXBpbXBvcnRlcihURVNUTU9EKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgei5maW5kX21vZHVsZSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgei5sb2FkX21vZHVsZSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgei5pc19wYWNrYWdlLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB6LmdldF9jb2RlLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB6LmdldF9kYXRhLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB6LmdldF9zb3VyY2UsIE5vbmUpCisKKyAgICAgICAgICAgIGVycm9yID0gemlwaW1wb3J0LlppcEltcG9ydEVycm9yCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHouZmluZF9tb2R1bGUoJ2FiYycpLCBOb25lKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhlcnJvciwgei5sb2FkX21vZHVsZSwgJ2FiYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhlcnJvciwgei5nZXRfY29kZSwgJ2FiYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB6LmdldF9kYXRhLCAnYWJjJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9yLCB6LmdldF9zb3VyY2UsICdhYmMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3IsIHouaXNfcGFja2FnZSwgJ2FiYycpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY2xlYXIoKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0cnk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgICAgICAgIFVuY29tcHJlc3NlZFppcEltcG9ydFRlc3RDYXNlLAorICAgICAgICAgICAgICBDb21wcmVzc2VkWmlwSW1wb3J0VGVzdENhc2UsCisgICAgICAgICAgICAgIEJhZEZpbGVaaXBJbXBvcnRUZXN0Q2FzZSwKKyAgICAgICAgICAgICkKKyAgICBmaW5hbGx5OgorICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKFRFU1RNT0QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGltcG9ydC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjYwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGltcG9ydC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhY2E1YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2MTdhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5CkBAIC0wLDAgKzEsMjUwIEBACisjIFRoaXMgdGVzdCBtb2R1bGUgY292ZXJzIHN1cHBvcnQgaW4gdmFyaW91cyBwYXJ0cyBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeQorIyBmb3Igd29ya2luZyB3aXRoIG1vZHVsZXMgbG9jYXRlZCBpbnNpZGUgemlwZmlsZXMKKyMgVGhlIHRlc3RzIGFyZSBjZW50cmFsaXNlZCBpbiB0aGlzIGZhc2hpb24gdG8gbWFrZSBpdCBlYXN5IHRvIGRyb3AgdGhlbQorIyBpZiBhIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydCB6aXBpbXBvcnQKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAoraW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHN5cworaW1wb3J0IHRleHR3cmFwCitpbXBvcnQgemlwZmlsZQoraW1wb3J0IHppcGltcG9ydAoraW1wb3J0IGRvY3Rlc3QKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgbGluZWNhY2hlCitpbXBvcnQgcGRiCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCAoc3Bhd25fcHl0aG9uLCBraWxsX3B5dGhvbiwgcnVuX3B5dGhvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9kaXIsIG1ha2Vfc2NyaXB0LCBtYWtlX3ppcF9zY3JpcHQpCisKK3ZlcmJvc2UgPSB0ZXN0LnRlc3Rfc3VwcG9ydC52ZXJib3NlCisKKyMgTGlicmFyeSBtb2R1bGVzIGNvdmVyZWQgYnkgdGhpcyB0ZXN0IHNldAorIyAgcGRiIChJc3N1ZSA0MjAxKQorIyAgaW5zcGVjdCAoSXNzdWUgNDIyMykKKyMgIGRvY3Rlc3QgKElzc3VlIDQxOTcpCisKKyMgT3RoZXIgdGVzdCBtb2R1bGVzIHdpdGggemlwaW1wb3J0IHJlbGF0ZWQgdGVzdHMKKyMgIHRlc3RfemlwaW1wb3J0IChvZiBjb3Vyc2UhKQorIyAgdGVzdF9jbWRfbGluZV9zY3JpcHQgKGNvdmVycyB0aGUgemlwaW1wb3J0IHN1cHBvcnQgaW4gcnVucHkpCisKKyMgUmV0cmlldmUgc29tZSBoZWxwZXJzIGZyb20gb3RoZXIgdGVzdCBjYXNlcworZnJvbSB0ZXN0IGltcG9ydCAodGVzdF9kb2N0ZXN0LCBzYW1wbGVfZG9jdGVzdCwgc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMsCisgICAgICAgICAgICAgICAgICBzYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzKQorZnJvbSB0ZXN0LnRlc3RfaW1wb3J0aG9va3MgaW1wb3J0IEltcG9ydEhvb2tzQmFzZVRlc3RDYXNlCisKKworZGVmIF9ydW5fb2JqZWN0X2RvY3Rlc3Qob2JqLCBtb2R1bGUpOgorICAgICMgRGlyZWN0IGRvY3Rlc3Qgb3V0cHV0IChub3JtYWxseSBqdXN0IGVycm9ycykgdG8gcmVhbCBzdGRvdXQ7IGRvY3Rlc3QKKyAgICAjIG91dHB1dCBzaG91bGRuJ3QgYmUgY29tcGFyZWQgYnkgcmVncnRlc3QuCisgICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgc3lzLnN0ZG91dCA9IHRlc3QudGVzdF9zdXBwb3J0LmdldF9vcmlnaW5hbF9zdGRvdXQoKQorICAgIHRyeToKKyAgICAgICAgZmluZGVyID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKHZlcmJvc2U9dmVyYm9zZSwgcmVjdXJzZT1GYWxzZSkKKyAgICAgICAgcnVubmVyID0gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9dmVyYm9zZSkKKyAgICAgICAgIyBVc2UgdGhlIG9iamVjdCdzIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGlmIGl0IGhhcyBvbmUKKyAgICAgICAgIyBPdGhlcndpc2UsIHVzZSB0aGUgbW9kdWxlJ3MgbmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lID0gIiVzLiVzIiAlIChvYmouX19tb2R1bGVfXywgb2JqLl9fbmFtZV9fKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBuYW1lID0gbW9kdWxlLl9fbmFtZV9fCisgICAgICAgIGZvciBleGFtcGxlIGluIGZpbmRlci5maW5kKG9iaiwgbmFtZSwgbW9kdWxlKToKKyAgICAgICAgICAgIHJ1bm5lci5ydW4oZXhhbXBsZSkKKyAgICAgICAgZiwgdCA9IHJ1bm5lci5mYWlsdXJlcywgcnVubmVyLnRyaWVzCisgICAgICAgIGlmIGY6CisgICAgICAgICAgICByYWlzZSB0ZXN0LnRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkKCIlZCBvZiAlZCBkb2N0ZXN0cyBmYWlsZWQiICUgKGYsIHQpKQorICAgIGZpbmFsbHk6CisgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlX3N0ZG91dAorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdkb2N0ZXN0ICglcykgLi4uICVkIHRlc3RzIHdpdGggemVybyBmYWlsdXJlcycgJSAobW9kdWxlLl9fbmFtZV9fLCB0KQorICAgIHJldHVybiBmLCB0CisKKworCitjbGFzcyBaaXBTdXBwb3J0VGVzdHMoSW1wb3J0SG9va3NCYXNlVGVzdENhc2UpOgorICAgICMgV2UgdXNlIHRoZSBJbXBvcnRIb29rc0Jhc2VUZXN0Q2FzZSB0byByZXN0b3JlCisgICAgIyB0aGUgc3RhdGUgb2YgdGhlIGltcG9ydCByZWxhdGVkIGluZm9ybWF0aW9uCisgICAgIyBpbiB0aGUgc3lzIG1vZHVsZSBhZnRlciBlYWNoIHRlc3QKKyAgICAjIFdlIGFsc28gY2xlYXIgdGhlIGxpbmVjYWNoZSBhbmQgemlwaW1wb3J0IGNhY2hlCisgICAgIyBqdXN0IHRvIGF2b2lkIGFueSBib2d1cyBlcnJvcnMgZHVlIHRvIG5hbWUgcmV1c2UgaW4gdGhlIHRlc3RzCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCisgICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jbGVhcigpCisgICAgICAgIEltcG9ydEhvb2tzQmFzZVRlc3RDYXNlLnNldFVwKHNlbGYpCisKKworICAgIGRlZiB0ZXN0X2luc3BlY3RfZ2V0c291cmNlX2lzc3VlNDIyMyhzZWxmKToKKyAgICAgICAgdGVzdF9zcmMgPSAiZGVmIGZvbygpOiBwYXNzXG4iCisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBkOgorICAgICAgICAgICAgaW5pdF9uYW1lID0gbWFrZV9zY3JpcHQoZCwgJ19faW5pdF9fJywgdGVzdF9zcmMpCisgICAgICAgICAgICBuYW1lX2luX3ppcCA9IG9zLnBhdGguam9pbignemlwX3BrZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKGluaXRfbmFtZSkpCisgICAgICAgICAgICB6aXBfbmFtZSwgcnVuX25hbWUgPSBtYWtlX3ppcF9zY3JpcHQoZCwgJ3Rlc3RfemlwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfbmFtZSwgbmFtZV9pbl96aXApCisgICAgICAgICAgICBvcy5yZW1vdmUoaW5pdF9uYW1lKQorICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHppcF9uYW1lKQorICAgICAgICAgICAgaW1wb3J0IHppcF9wa2cKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRzb3VyY2UoemlwX3BrZy5mb28pLCB0ZXN0X3NyYykKKworICAgIGRlZiB0ZXN0X2RvY3Rlc3RfaXNzdWU0MTk3KHNlbGYpOgorICAgICAgICAjIFRvIGF2b2lkIGhhdmluZyB0byBrZWVwIHR3byBjb3BpZXMgb2YgdGhlIGRvY3Rlc3QgbW9kdWxlJ3MKKyAgICAgICAgIyB1bml0IHRlc3RzIGluIHN5bmMsIHRoaXMgdGVzdCB3b3JrcyBieSB0YWtpbmcgdGhlIHNvdXJjZSBvZgorICAgICAgICAjIHRlc3RfZG9jdGVzdCBpdHNlbGYsIHJld3JpdGluZyBpdCBhIGJpdCB0byBjb3BlIHdpdGggYSBuZXcKKyAgICAgICAgIyBsb2NhdGlvbiwgYW5kIHRoZW4gdGhyb3dpbmcgaXQgaW4gYSB6aXAgZmlsZSB0byBtYWtlIHN1cmUKKyAgICAgICAgIyBldmVyeXRoaW5nIHN0aWxsIHdvcmtzIGNvcnJlY3RseQorICAgICAgICB0ZXN0X3NyYyA9IGluc3BlY3QuZ2V0c291cmNlKHRlc3RfZG9jdGVzdCkKKyAgICAgICAgdGVzdF9zcmMgPSB0ZXN0X3NyYy5yZXBsYWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIHRlc3QgaW1wb3J0IHRlc3RfZG9jdGVzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCB0ZXN0X3ppcHBlZF9kb2N0ZXN0IGFzIHRlc3RfZG9jdGVzdCIpCisgICAgICAgIHRlc3Rfc3JjID0gdGVzdF9zcmMucmVwbGFjZSgidGVzdC50ZXN0X2RvY3Rlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RfemlwcGVkX2RvY3Rlc3QiKQorICAgICAgICB0ZXN0X3NyYyA9IHRlc3Rfc3JjLnJlcGxhY2UoInRlc3Quc2FtcGxlX2RvY3Rlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsZV96aXBwZWRfZG9jdGVzdCIpCisgICAgICAgICMgVGhlIHNhbXBsZSBkb2N0ZXN0IGZpbGVzIHJld3JpdHRlbiB0byBpbmNsdWRlIGluIHRoZSB6aXBwZWQgdmVyc2lvbi4KKyAgICAgICAgc2FtcGxlX3NvdXJjZXMgPSB7fQorICAgICAgICBmb3IgbW9kIGluIFtzYW1wbGVfZG9jdGVzdCwgc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9kb2N0ZXN0X25vX2RvY3N0cmluZ3NdOgorICAgICAgICAgICAgc3JjID0gaW5zcGVjdC5nZXRzb3VyY2UobW9kKQorICAgICAgICAgICAgc3JjID0gc3JjLnJlcGxhY2UoInRlc3QudGVzdF9kb2N0ZXN0IiwgInRlc3RfemlwcGVkX2RvY3Rlc3QiKQorICAgICAgICAgICAgIyBSZXdyaXRlIHRoZSBtb2R1bGUgbmFtZSBzbyB0aGF0LCBmb3IgZXhhbXBsZSwKKyAgICAgICAgICAgICMgInRlc3Quc2FtcGxlX2RvY3Rlc3QiIGJlY29tZXMgInNhbXBsZV96aXBwZWRfZG9jdGVzdCIuCisgICAgICAgICAgICBtb2RfbmFtZSA9IG1vZC5fX25hbWVfXy5zcGxpdCgiLiIpWy0xXQorICAgICAgICAgICAgbW9kX25hbWUgPSBtb2RfbmFtZS5yZXBsYWNlKCJzYW1wbGVfIiwgInNhbXBsZV96aXBwZWRfIikKKyAgICAgICAgICAgIHNhbXBsZV9zb3VyY2VzW21vZF9uYW1lXSA9IHNyYworCisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBkOgorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBtYWtlX3NjcmlwdChkLCAndGVzdF96aXBwZWRfZG9jdGVzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3JjKQorICAgICAgICAgICAgemlwX25hbWUsIHJ1bl9uYW1lID0gbWFrZV96aXBfc2NyaXB0KGQsICd0ZXN0X3ppcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIHogPSB6aXBmaWxlLlppcEZpbGUoemlwX25hbWUsICdhJykKKyAgICAgICAgICAgIGZvciBtb2RfbmFtZSwgc3JjIGluIHNhbXBsZV9zb3VyY2VzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgei53cml0ZXN0cihtb2RfbmFtZSArICIucHkiLCBzcmMpCisgICAgICAgICAgICB6LmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgemlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUoemlwX25hbWUsICdyJykKKyAgICAgICAgICAgICAgICBwcmludCAnQ29udGVudHMgb2YgJXI6JyAlIHppcF9uYW1lCisgICAgICAgICAgICAgICAgemlwX2ZpbGUucHJpbnRkaXIoKQorICAgICAgICAgICAgICAgIHppcF9maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnJlbW92ZShzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCB6aXBfbmFtZSkKKyAgICAgICAgICAgIGltcG9ydCB0ZXN0X3ppcHBlZF9kb2N0ZXN0CisgICAgICAgICAgICAjIFNvbWUgb2YgdGhlIGRvYyB0ZXN0cyBkZXBlbmQgb24gdGhlIGNvbG9jYXRlZCB0ZXh0IGZpbGVzCisgICAgICAgICAgICAjIHdoaWNoIGFyZW4ndCBhdmFpbGFibGUgdG8gdGhlIHppcHBlZCB2ZXJzaW9uICh0aGUgZG9jdGVzdAorICAgICAgICAgICAgIyBtb2R1bGUgY3VycmVudGx5IHJlcXVpcmVzIHJlYWwgZmlsZW5hbWVzIGZvciBub24tZW1iZWRkZWQKKyAgICAgICAgICAgICMgdGVzdHMpLiBTbyB3ZSdyZSBmb3JjZWQgdG8gYmUgc2VsZWN0aXZlIGFib3V0IHdoaWNoIHRlc3RzCisgICAgICAgICAgICAjIHRvIHJ1bi4KKyAgICAgICAgICAgICMgZG9jdGVzdCBjb3VsZCByZWFsbHkgdXNlIHNvbWUgQVBJcyB3aGljaCB0YWtlIGEgdGV4dAorICAgICAgICAgICAgIyBzdHJpbmcgb3IgYSBmaWxlIG9iamVjdCBpbnN0ZWFkIG9mIGEgZmlsZW5hbWUuLi4KKyAgICAgICAgICAgIGtub3duX2dvb2RfdGVzdHMgPSBbCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5TYW1wbGVDbGFzcywKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LlNhbXBsZUNsYXNzLk5lc3RlZENsYXNzLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QuU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3MuX19pbml0X18sCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5TYW1wbGVDbGFzcy5fX2luaXRfXywKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LlNhbXBsZUNsYXNzLmFfY2xhc3NtZXRob2QsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5TYW1wbGVDbGFzcy5hX3Byb3BlcnR5LAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QuU2FtcGxlQ2xhc3MuYV9zdGF0aWNtZXRob2QsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5TYW1wbGVDbGFzcy5kb3VibGUsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5TYW1wbGVDbGFzcy5nZXQsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5TYW1wbGVOZXdTdHlsZUNsYXNzLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QuU2FtcGxlTmV3U3R5bGVDbGFzcy5fX2luaXRfXywKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LlNhbXBsZU5ld1N0eWxlQ2xhc3MuZG91YmxlLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QuU2FtcGxlTmV3U3R5bGVDbGFzcy5nZXQsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5vbGRfdGVzdDEsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5vbGRfdGVzdDIsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5vbGRfdGVzdDMsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5vbGRfdGVzdDQsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5zYW1wbGVfZnVuYywKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfRG9jVGVzdCwKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfRG9jVGVzdFBhcnNlciwKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfRG9jVGVzdFJ1bm5lci5iYXNpY3MsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X0RvY1Rlc3RSdW5uZXIuZXhjZXB0aW9ucywKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfRG9jVGVzdFJ1bm5lci5vcHRpb25fZGlyZWN0aXZlcywKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfRG9jVGVzdFJ1bm5lci5vcHRpb25mbGFncywKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfRG9jVGVzdFJ1bm5lci52ZXJib3NlX2ZsYWcsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X0V4YW1wbGUsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X2RlYnVnLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QudGVzdF9wZGJfc2V0X3RyYWNlLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QudGVzdF9wZGJfc2V0X3RyYWNlX25lc3RlZCwKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfdGVzdHNvdXJjZSwKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfdHJhaWxpbmdfc3BhY2VfaW5fdGVzdCwKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfRG9jVGVzdFN1aXRlLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QudGVzdF9Eb2NUZXN0RmluZGVyLAorICAgICAgICAgICAgXQorICAgICAgICAgICAgIyBUaGVzZSByZW1haW5pbmcgdGVzdHMgYXJlIHRoZSBvbmVzIHdoaWNoIG5lZWQgYWNjZXNzCisgICAgICAgICAgICAjIHRvIHRoZSBkYXRhIGZpbGVzLCBzbyB3ZSBkb24ndCBydW4gdGhlbQorICAgICAgICAgICAgZmFpbF9kdWVfdG9fbWlzc2luZ19kYXRhX2ZpbGVzID0gWworICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QudGVzdF9Eb2NGaWxlU3VpdGUsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X3Rlc3RmaWxlLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QudGVzdF91bml0dGVzdF9yZXBvcnRmbGFncywKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgICMgTmVlZGVkIGZvciB0ZXN0X0RvY1Rlc3RQYXJzZXIgYW5kIHRlc3RfZGVidWcKKyAgICAgICAgICAgIGRlcHJlY2F0aW9ucyA9IFtdCisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgIyBJZ25vcmUgYWxsIHdhcm5pbmdzIGFib3V0IHRoZSB1c2Ugb2YgY2xhc3MgVGVzdGVyIGluIHRoaXMgbW9kdWxlLgorICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9ucy5hcHBlbmQoKCJjbGFzcyBUZXN0ZXIgaXMgZGVwcmVjYXRlZCIsIERlcHJlY2F0aW9uV2FybmluZykpCisgICAgICAgICAgICBpZiBzeXMucHkza3dhcm5pbmc6CisgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25zICs9IFsKKyAgICAgICAgICAgICAgICAgICAgKCJiYWNrcXVvdGUgbm90IHN1cHBvcnRlZCIsIFN5bnRheFdhcm5pbmcpLAorICAgICAgICAgICAgICAgICAgICAoImV4ZWNmaWxlLi4gbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZyldCisgICAgICAgICAgICB3aXRoIHRlc3QudGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCpkZXByZWNhdGlvbnMpOgorICAgICAgICAgICAgICAgIGZvciBvYmogaW4ga25vd25fZ29vZF90ZXN0czoKKyAgICAgICAgICAgICAgICAgICAgX3J1bl9vYmplY3RfZG9jdGVzdChvYmosIHRlc3RfemlwcGVkX2RvY3Rlc3QpCisKKyAgICBkZWYgdGVzdF9kb2N0ZXN0X21haW5faXNzdWU0MTk3KHNlbGYpOgorICAgICAgICB0ZXN0X3NyYyA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICAgICAgICAgIGNsYXNzIFRlc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAiPj4+ICdsaW5lIDInIgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBkb2N0ZXN0CisgICAgICAgICAgICAgICAgICAgIGRvY3Rlc3QudGVzdG1vZCgpCisgICAgICAgICAgICAgICAgICAgICIiIikKKyAgICAgICAgcGF0dGVybiA9ICdGaWxlICIlcyIsIGxpbmUgMiwgaW4gJXMnCisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBkOgorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBtYWtlX3NjcmlwdChkLCAnc2NyaXB0JywgdGVzdF9zcmMpCisgICAgICAgICAgICBleGl0X2NvZGUsIGRhdGEgPSBydW5fcHl0aG9uKHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSBwYXR0ZXJuICUgKHNjcmlwdF9uYW1lLCAiX19tYWluX18uVGVzdCIpCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJFeHBlY3RlZCBsaW5lIiwgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICBwcmludCAiR290IHN0ZG91dDoiCisgICAgICAgICAgICAgICAgcHJpbnQgZGF0YQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihleHBlY3RlZCwgZGF0YSkKKyAgICAgICAgICAgIHppcF9uYW1lLCBydW5fbmFtZSA9IG1ha2VfemlwX3NjcmlwdChkLCAidGVzdF96aXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0X25hbWUsICdfX21haW5fXy5weScpCisgICAgICAgICAgICBleGl0X2NvZGUsIGRhdGEgPSBydW5fcHl0aG9uKHppcF9uYW1lKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSBwYXR0ZXJuICUgKHJ1bl9uYW1lLCAiX19tYWluX18uVGVzdCIpCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJFeHBlY3RlZCBsaW5lIiwgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICBwcmludCAiR290IHN0ZG91dDoiCisgICAgICAgICAgICAgICAgcHJpbnQgZGF0YQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihleHBlY3RlZCwgZGF0YSkKKworICAgIGRlZiB0ZXN0X3BkYl9pc3N1ZTQyMDEoc2VsZik6CisgICAgICAgIHRlc3Rfc3JjID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgICAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgICAgICAgICBpbXBvcnQgcGRiCisgICAgICAgICAgICAgICAgICAgIHBkYi5ydW5jYWxsKGYpCisgICAgICAgICAgICAgICAgICAgICIiIikKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIGQ6CisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IG1ha2Vfc2NyaXB0KGQsICdzY3JpcHQnLCB0ZXN0X3NyYykKKyAgICAgICAgICAgIHAgPSBzcGF3bl9weXRob24oc2NyaXB0X25hbWUpCisgICAgICAgICAgICBwLnN0ZGluLndyaXRlKCdsXG4nKQorICAgICAgICAgICAgZGF0YSA9IGtpbGxfcHl0aG9uKHApCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHNjcmlwdF9uYW1lLCBkYXRhKQorICAgICAgICAgICAgemlwX25hbWUsIHJ1bl9uYW1lID0gbWFrZV96aXBfc2NyaXB0KGQsICJ0ZXN0X3ppcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfbmFtZSwgJ19fbWFpbl9fLnB5JykKKyAgICAgICAgICAgIHAgPSBzcGF3bl9weXRob24oemlwX25hbWUpCisgICAgICAgICAgICBwLnN0ZGluLndyaXRlKCdsXG4nKQorICAgICAgICAgICAgZGF0YSA9IGtpbGxfcHl0aG9uKHApCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJ1bl9uYW1lLCBkYXRhKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoWmlwU3VwcG9ydFRlc3RzKQorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzN2E3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzNjMwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96bGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2RmZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemxpYi5weQpAQCAtMCwwICsxLDYwOSBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZSwgdW5saW5rLCByZXF1aXJlcworaW1wb3J0IGJpbmFzY2lpCitpbXBvcnQgcmFuZG9tCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBwcmVjaXNpb25iaWdtZW10ZXN0LCBfMUcsIF80RworaW1wb3J0IHN5cworCit0cnk6CisgICAgaW1wb3J0IG1tYXAKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBtbWFwID0gTm9uZQorCit6bGliID0gaW1wb3J0X21vZHVsZSgnemxpYicpCisKKworY2xhc3MgQ2hlY2tzdW1UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBjaGVja3N1bSB0ZXN0IGNhc2VzCisgICAgZGVmIHRlc3RfY3JjMzJzdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmNyYzMyKCIiKSwgemxpYi5jcmMzMigiIiwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh6bGliLmNyYzMyKCJhYmMiLCAweGZmZmZmZmZmKSkKKworICAgIGRlZiB0ZXN0X2NyYzMyZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5jcmMzMigiIiwgMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5jcmMzMigiIiwgMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5jcmMzMigiIiwgNDMyKSwgNDMyKQorCisgICAgZGVmIHRlc3RfYWRsZXIzMnN0YXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuYWRsZXIzMigiIiksIHpsaWIuYWRsZXIzMigiIiwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh6bGliLmFkbGVyMzIoImFiYyIsIDB4ZmZmZmZmZmYpKQorCisgICAgZGVmIHRlc3RfYWRsZXIzMmVtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuYWRsZXIzMigiIiwgMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5hZGxlcjMyKCIiLCAxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmFkbGVyMzIoIiIsIDQzMiksIDQzMikKKworICAgIGRlZiBhc3NlcnRFcXVhbDMyKHNlbGYsIHNlZW4sIGV4cGVjdGVkKToKKyAgICAgICAgIyAzMi1iaXQgdmFsdWVzIG1hc2tlZCAtLSBjaGVja3N1bXMgb24gMzItIHZzIDY0LSBiaXQgbWFjaGluZXMKKyAgICAgICAgIyBUaGlzIGlzIGltcG9ydGFudCBpZiBiaXQgMzEgKDB4MDgwMDAwMDBMKSBpcyBzZXQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VlbiAmIDB4MEZGRkZGRkZGTCwgZXhwZWN0ZWQgJiAweDBGRkZGRkZGRkwpCisKKyAgICBkZWYgdGVzdF9wZW5ndWlucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbDMyKHpsaWIuY3JjMzIoInBlbmd1aW4iLCAwKSwgMHgwZTVjMWExMjBMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsMzIoemxpYi5jcmMzMigicGVuZ3VpbiIsIDEpLCAweDQzYjZhYTk0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsMzIoemxpYi5hZGxlcjMyKCJwZW5ndWluIiwgMCksIDB4MGJjZjAyZjYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwzMih6bGliLmFkbGVyMzIoInBlbmd1aW4iLCAxKSwgMHgwYmQ2MDJmNykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuY3JjMzIoInBlbmd1aW4iKSwgemxpYi5jcmMzMigicGVuZ3VpbiIsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuYWRsZXIzMigicGVuZ3VpbiIpLHpsaWIuYWRsZXIzMigicGVuZ3VpbiIsMSkpCisKKyAgICBkZWYgdGVzdF9hYmNkZWZnaGlqa2xtbm9wKHNlbGYpOgorICAgICAgICAiIiJ0ZXN0IGlzc3VlMTIwMiBjb21wbGlhbmNlOiBzaWduZWQgY3JjMzIsIGFkbGVyMzIgaW4gMi54IiIiCisgICAgICAgIGZvbyA9ICdhYmNkZWZnaGlqa2xtbm9wJworICAgICAgICAjIGV4cGxpY2l0bHkgdGVzdCBzaWduZWQgYmVoYXZpb3IKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmNyYzMyKGZvbyksIC0xODA4MDg4OTQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuY3JjMzIoJ3NwYW0nKSwgMTEzODQyNTY2MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmFkbGVyMzIoZm9vK2ZvbyksIC03MjE0MTY5NDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5hZGxlcjMyKCdzcGFtJyksIDcyMjg2NjQyKQorCisgICAgZGVmIHRlc3Rfc2FtZV9hc19iaW5hc2NpaV9jcmMzMihzZWxmKToKKyAgICAgICAgZm9vID0gJ2FiY2RlZmdoaWprbG1ub3AnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuY3JjMzIoZm9vKSwgemxpYi5jcmMzMihmb28pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmNyYzMyKCdzcGFtJyksIHpsaWIuY3JjMzIoJ3NwYW0nKSkKKworICAgIGRlZiB0ZXN0X25lZ2F0aXZlX2NyY19pdl9pbnB1dChzZWxmKToKKyAgICAgICAgIyBUaGUgcmFuZ2Ugb2YgdmFsaWQgaW5wdXQgdmFsdWVzIGZvciB0aGUgY3JjIHN0YXRlIHNob3VsZCBiZQorICAgICAgICAjIC0yKiozMSB0aHJvdWdoIDIqKjMyLTEgdG8gYWxsb3cgaW5wdXRzIGFydGlmaWNhbGx5IGNvbnN0cmFpbmVkCisgICAgICAgICMgdG8gYSBzaWduZWQgMzItYml0IGludGVnZXIuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5jcmMzMignaGFtJywgLTEpLCB6bGliLmNyYzMyKCdoYW0nLCAweGZmZmZmZmZmTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5jcmMzMignc3BhbScsIC0zMTQxNTkzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB6bGliLmNyYzMyKCdzcGFtJywgIDB4ZmZkMDEwMjdMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmNyYzMyKCdzcGFtJywgLSgyKiozMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHpsaWIuY3JjMzIoJ3NwYW0nLCAgKDIqKjMxKSkpCisKKworY2xhc3MgRXhjZXB0aW9uVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgbWFrZSBzdXJlIHdlIGdlbmVyYXRlIHNvbWUgZXhwZWN0ZWQgZXJyb3JzCisgICAgZGVmIHRlc3RfYmFkbGV2ZWwoc2VsZik6CisgICAgICAgICMgc3BlY2lmeWluZyBjb21wcmVzc2lvbiBsZXZlbCBvdXQgb2YgcmFuZ2UgY2F1c2VzIGFuIGVycm9yCisgICAgICAgICMgKGJ1dCAtMSBpcyBaX0RFRkFVTFRfQ09NUFJFU1NJT04gYW5kIGFwcGFyZW50bHkgdGhlIHpsaWIKKyAgICAgICAgIyBhY2NlcHRzIDAgdG9vKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh6bGliLmVycm9yLCB6bGliLmNvbXByZXNzLCAnRVJST1InLCAxMCkKKworICAgIGRlZiB0ZXN0X2JhZGNvbXByZXNzb2JqKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSBmYWlsdXJlIG9uIGJ1aWxkaW5nIGNvbXByZXNzIG9iamVjdCB3aXRoIGJhZCBwYXJhbXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgemxpYi5jb21wcmVzc29iaiwgMSwgemxpYi5ERUZMQVRFRCwgMCkKKyAgICAgICAgIyBzcGVjaWZ5aW5nIHRvdGFsIGJpdHMgdG9vIGxhcmdlIGNhdXNlcyBhbiBlcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgIHpsaWIuY29tcHJlc3NvYmosIDEsIHpsaWIuREVGTEFURUQsIHpsaWIuTUFYX1dCSVRTICsgMSkKKworICAgIGRlZiB0ZXN0X2JhZGRlY29tcHJlc3NvYmooc2VsZik6CisgICAgICAgICMgdmVyaWZ5IGZhaWx1cmUgb24gYnVpbGRpbmcgZGVjb21wcmVzcyBvYmplY3Qgd2l0aCBiYWQgcGFyYW1zCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHpsaWIuZGVjb21wcmVzc29iaiwgLTEpCisKKyAgICBkZWYgdGVzdF9kZWNvbXByZXNzb2JqX2JhZGZsdXNoKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSBmYWlsdXJlIG9uIGNhbGxpbmcgZGVjb21wcmVzc29iai5mbHVzaCB3aXRoIGJhZCBwYXJhbXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgemxpYi5kZWNvbXByZXNzb2JqKCkuZmx1c2gsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHpsaWIuZGVjb21wcmVzc29iaigpLmZsdXNoLCAtMSkKKworCitjbGFzcyBCYXNlQ29tcHJlc3NUZXN0Q2FzZShvYmplY3QpOgorICAgIGRlZiBjaGVja19iaWdfY29tcHJlc3NfYnVmZmVyKHNlbGYsIHNpemUsIGNvbXByZXNzX2Z1bmMpOgorICAgICAgICBfMU0gPSAxMDI0ICogMTAyNAorICAgICAgICBmbXQgPSAiJSUwJWR4IiAlICgyICogXzFNKQorICAgICAgICAjIEdlbmVyYXRlIDEwTUIgd29ydGggb2YgcmFuZG9tLCBhbmQgZXhwYW5kIGl0IGJ5IHJlcGVhdGluZyBpdC4KKyAgICAgICAgIyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHpsaWIncyBtZW1vcnkgaXMgbm90IGJpZyBlbm91Z2ggdG8gZXhwbG9pdAorICAgICAgICAjIHN1Y2ggc3ByZWFkIG91dCByZWR1bmRhbmN5LgorICAgICAgICBkYXRhID0gJycuam9pbihbYmluYXNjaWkuYTJiX2hleChmbXQgJSByYW5kb20uZ2V0cmFuZGJpdHMoOCAqIF8xTSkpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCldKQorICAgICAgICBkYXRhID0gZGF0YSAqIChzaXplIC8vIGxlbihkYXRhKSArIDEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbXByZXNzX2Z1bmMoZGF0YSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICMgUmVsZWFzZSBtZW1vcnkKKyAgICAgICAgICAgIGRhdGEgPSBOb25lCisKKyAgICBkZWYgY2hlY2tfYmlnX2RlY29tcHJlc3NfYnVmZmVyKHNlbGYsIHNpemUsIGRlY29tcHJlc3NfZnVuYyk6CisgICAgICAgIGRhdGEgPSAneCcgKiBzaXplCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbXByZXNzZWQgPSB6bGliLmNvbXByZXNzKGRhdGEsIDEpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAjIFJlbGVhc2UgbWVtb3J5CisgICAgICAgICAgICBkYXRhID0gTm9uZQorICAgICAgICBkYXRhID0gZGVjb21wcmVzc19mdW5jKGNvbXByZXNzZWQpCisgICAgICAgICMgU2FuaXR5IGNoZWNrCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRhdGEpLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGF0YS5zdHJpcCgneCcpKSwgMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRhdGEgPSBOb25lCisKKworY2xhc3MgQ29tcHJlc3NUZXN0Q2FzZShCYXNlQ29tcHJlc3NUZXN0Q2FzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGVzdCBjb21wcmVzc2lvbiBpbiBvbmUgZ28gKHdob2xlIG1lc3NhZ2UgY29tcHJlc3Npb24pCisgICAgZGVmIHRlc3Rfc3BlZWNoKHNlbGYpOgorICAgICAgICB4ID0gemxpYi5jb21wcmVzcyhIQU1MRVRfU0NFTkUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5kZWNvbXByZXNzKHgpLCBIQU1MRVRfU0NFTkUpCisKKyAgICBkZWYgdGVzdF9zcGVlY2gxMjgoc2VsZik6CisgICAgICAgICMgY29tcHJlc3MgbW9yZSBkYXRhCisgICAgICAgIGRhdGEgPSBIQU1MRVRfU0NFTkUgKiAxMjgKKyAgICAgICAgeCA9IHpsaWIuY29tcHJlc3MoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoeCksIGRhdGEpCisKKyAgICBkZWYgdGVzdF9pbmNvbXBsZXRlX3N0cmVhbShzZWxmKToKKyAgICAgICAgIyBBbiB1c2VmdWwgZXJyb3IgbWVzc2FnZSBpcyBnaXZlbgorICAgICAgICB4ID0gemxpYi5jb21wcmVzcyhIQU1MRVRfU0NFTkUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKHpsaWIuZXJyb3IsCisgICAgICAgICAgICAiRXJyb3IgLTUgd2hpbGUgZGVjb21wcmVzc2luZyBkYXRhOiBpbmNvbXBsZXRlIG9yIHRydW5jYXRlZCBzdHJlYW0iLAorICAgICAgICAgICAgemxpYi5kZWNvbXByZXNzLCB4WzotMV0pCisKKyAgICAjIE1lbW9yeSB1c2Ugb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdGFrZXMgaW50byBhY2NvdW50IG92ZXJhbGxvY2F0aW9uCisKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV8xRyArIDEwMjQgKiAxMDI0LCBtZW11c2U9MykKKyAgICBkZWYgdGVzdF9iaWdfY29tcHJlc3NfYnVmZmVyKHNlbGYsIHNpemUpOgorICAgICAgICBjb21wcmVzcyA9IGxhbWJkYSBzOiB6bGliLmNvbXByZXNzKHMsIDEpCisgICAgICAgIHNlbGYuY2hlY2tfYmlnX2NvbXByZXNzX2J1ZmZlcihzaXplLCBjb21wcmVzcykKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzFHICsgMTAyNCAqIDEwMjQsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2JpZ19kZWNvbXByZXNzX2J1ZmZlcihzZWxmLCBzaXplKToKKyAgICAgICAgc2VsZi5jaGVja19iaWdfZGVjb21wcmVzc19idWZmZXIoc2l6ZSwgemxpYi5kZWNvbXByZXNzKQorCisKK2NsYXNzIENvbXByZXNzT2JqZWN0VGVzdENhc2UoQmFzZUNvbXByZXNzVGVzdENhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRlc3QgY29tcHJlc3Npb24gb2JqZWN0CisgICAgZGVmIHRlc3RfcGFpcihzZWxmKToKKyAgICAgICAgIyBzdHJhaWdodGZvcndhcmQgY29tcHJlc3MvZGVjb21wcmVzcyBvYmplY3RzCisgICAgICAgIGRhdGEgPSBIQU1MRVRfU0NFTkUgKiAxMjgKKyAgICAgICAgY28gPSB6bGliLmNvbXByZXNzb2JqKCkKKyAgICAgICAgeDEgPSBjby5jb21wcmVzcyhkYXRhKQorICAgICAgICB4MiA9IGNvLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoemxpYi5lcnJvciwgY28uZmx1c2gpICMgc2Vjb25kIGZsdXNoIHNob3VsZCBub3Qgd29yaworICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICB5MSA9IGRjby5kZWNvbXByZXNzKHgxICsgeDIpCisgICAgICAgIHkyID0gZGNvLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCB5MSArIHkyKQorCisgICAgZGVmIHRlc3RfY29tcHJlc3NvcHRpb25zKHNlbGYpOgorICAgICAgICAjIHNwZWNpZnkgbG90cyBvZiBvcHRpb25zIHRvIGNvbXByZXNzb2JqKCkKKyAgICAgICAgbGV2ZWwgPSAyCisgICAgICAgIG1ldGhvZCA9IHpsaWIuREVGTEFURUQKKyAgICAgICAgd2JpdHMgPSAtMTIKKyAgICAgICAgbWVtbGV2ZWwgPSA5CisgICAgICAgIHN0cmF0ZWd5ID0gemxpYi5aX0ZJTFRFUkVECisgICAgICAgIGNvID0gemxpYi5jb21wcmVzc29iaihsZXZlbCwgbWV0aG9kLCB3Yml0cywgbWVtbGV2ZWwsIHN0cmF0ZWd5KQorICAgICAgICB4MSA9IGNvLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkKKyAgICAgICAgeDIgPSBjby5mbHVzaCgpCisgICAgICAgIGRjbyA9IHpsaWIuZGVjb21wcmVzc29iaih3Yml0cykKKyAgICAgICAgeTEgPSBkY28uZGVjb21wcmVzcyh4MSArIHgyKQorICAgICAgICB5MiA9IGRjby5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSEFNTEVUX1NDRU5FLCB5MSArIHkyKQorCisgICAgZGVmIHRlc3RfY29tcHJlc3NpbmNyZW1lbnRhbChzZWxmKToKKyAgICAgICAgIyBjb21wcmVzcyBvYmplY3QgaW4gc3RlcHMsIGRlY29tcHJlc3Mgb2JqZWN0IGFzIG9uZS1zaG90CisgICAgICAgIGRhdGEgPSBIQU1MRVRfU0NFTkUgKiAxMjgKKyAgICAgICAgY28gPSB6bGliLmNvbXByZXNzb2JqKCkKKyAgICAgICAgYnVmcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihkYXRhKSwgMjU2KToKKyAgICAgICAgICAgIGJ1ZnMuYXBwZW5kKGNvLmNvbXByZXNzKGRhdGFbaTppKzI1Nl0pKQorICAgICAgICBidWZzLmFwcGVuZChjby5mbHVzaCgpKQorICAgICAgICBjb21idWYgPSAnJy5qb2luKGJ1ZnMpCisKKyAgICAgICAgZGNvID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgeTEgPSBkY28uZGVjb21wcmVzcygnJy5qb2luKGJ1ZnMpKQorICAgICAgICB5MiA9IGRjby5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgeTEgKyB5MikKKworICAgIGRlZiB0ZXN0X2RlY29tcGluYyhzZWxmLCBmbHVzaD1GYWxzZSwgc291cmNlPU5vbmUsIGN4PTI1NiwgZGN4PTY0KToKKyAgICAgICAgIyBjb21wcmVzcyBvYmplY3QgaW4gc3RlcHMsIGRlY29tcHJlc3Mgb2JqZWN0IGluIHN0ZXBzCisgICAgICAgIHNvdXJjZSA9IHNvdXJjZSBvciBIQU1MRVRfU0NFTkUKKyAgICAgICAgZGF0YSA9IHNvdXJjZSAqIDEyOAorICAgICAgICBjbyA9IHpsaWIuY29tcHJlc3NvYmooKQorICAgICAgICBidWZzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGRhdGEpLCBjeCk6CisgICAgICAgICAgICBidWZzLmFwcGVuZChjby5jb21wcmVzcyhkYXRhW2k6aStjeF0pKQorICAgICAgICBidWZzLmFwcGVuZChjby5mbHVzaCgpKQorICAgICAgICBjb21idWYgPSAnJy5qb2luKGJ1ZnMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCB6bGliLmRlY29tcHJlc3MoY29tYnVmKSkKKworICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICBidWZzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGNvbWJ1ZiksIGRjeCk6CisgICAgICAgICAgICBidWZzLmFwcGVuZChkY28uZGVjb21wcmVzcyhjb21idWZbaTppK2RjeF0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgZGNvLnVuY29uc3VtZWRfdGFpbCwgIyMjIyMjIyMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihBKSB1Y3Qgc2hvdWxkIGJlICcnOiBub3QgJWQgbG9uZyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGRjby51bmNvbnN1bWVkX3RhaWwpKQorICAgICAgICBpZiBmbHVzaDoKKyAgICAgICAgICAgIGJ1ZnMuYXBwZW5kKGRjby5mbHVzaCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBjaHVuayA9IGRjby5kZWNvbXByZXNzKCcnKQorICAgICAgICAgICAgICAgIGlmIGNodW5rOgorICAgICAgICAgICAgICAgICAgICBidWZzLmFwcGVuZChjaHVuaykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBkY28udW5jb25zdW1lZF90YWlsLCAjIyMjIyMjIworICAgICAgICAgICAgICAgICAgICAgICAgICIoQikgdWN0IHNob3VsZCBiZSAnJzogbm90ICVkIGxvbmciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbihkY28udW5jb25zdW1lZF90YWlsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAnJy5qb2luKGJ1ZnMpKQorICAgICAgICAjIEZhaWx1cmUgbWVhbnM6ICJkZWNvbXByZXNzb2JqIHdpdGggaW5pdCBvcHRpb25zIGZhaWxlZCIKKworICAgIGRlZiB0ZXN0X2RlY29tcGluY2ZsdXNoKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3RfZGVjb21waW5jKGZsdXNoPVRydWUpCisKKyAgICBkZWYgdGVzdF9kZWNvbXBpbWF4KHNlbGYsIHNvdXJjZT1Ob25lLCBjeD0yNTYsIGRjeD02NCk6CisgICAgICAgICMgY29tcHJlc3MgaW4gc3RlcHMsIGRlY29tcHJlc3MgaW4gbGVuZ3RoLXJlc3RyaWN0ZWQgc3RlcHMKKyAgICAgICAgc291cmNlID0gc291cmNlIG9yIEhBTUxFVF9TQ0VORQorICAgICAgICAjIENoZWNrIGEgZGVjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBtYXhfbGVuZ3RoIHNwZWNpZmllZAorICAgICAgICBkYXRhID0gc291cmNlICogMTI4CisgICAgICAgIGNvID0gemxpYi5jb21wcmVzc29iaigpCisgICAgICAgIGJ1ZnMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZGF0YSksIGN4KToKKyAgICAgICAgICAgIGJ1ZnMuYXBwZW5kKGNvLmNvbXByZXNzKGRhdGFbaTppK2N4XSkpCisgICAgICAgIGJ1ZnMuYXBwZW5kKGNvLmZsdXNoKCkpCisgICAgICAgIGNvbWJ1ZiA9ICcnLmpvaW4oYnVmcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCB6bGliLmRlY29tcHJlc3MoY29tYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcHJlc3NlZCBkYXRhIGZhaWx1cmUnKQorCisgICAgICAgIGRjbyA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgIGJ1ZnMgPSBbXQorICAgICAgICBjYiA9IGNvbWJ1ZgorICAgICAgICB3aGlsZSBjYjoKKyAgICAgICAgICAgICNtYXhfbGVuZ3RoID0gMSArIGxlbihjYikvLzEwCisgICAgICAgICAgICBjaHVuayA9IGRjby5kZWNvbXByZXNzKGNiLCBkY3gpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxlbihjaHVuaykgPiBkY3gsCisgICAgICAgICAgICAgICAgICAgICdjaHVuayB0b28gYmlnICglZD4lZCknICUgKGxlbihjaHVuayksIGRjeCkpCisgICAgICAgICAgICBidWZzLmFwcGVuZChjaHVuaykKKyAgICAgICAgICAgIGNiID0gZGNvLnVuY29uc3VtZWRfdGFpbAorICAgICAgICBidWZzLmFwcGVuZChkY28uZmx1c2goKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAnJy5qb2luKGJ1ZnMpLCAnV3JvbmcgZGF0YSByZXRyaWV2ZWQnKQorCisgICAgZGVmIHRlc3RfZGVjb21wcmVzc21heGxlbihzZWxmLCBmbHVzaD1GYWxzZSk6CisgICAgICAgICMgQ2hlY2sgYSBkZWNvbXByZXNzaW9uIG9iamVjdCB3aXRoIG1heF9sZW5ndGggc3BlY2lmaWVkCisgICAgICAgIGRhdGEgPSBIQU1MRVRfU0NFTkUgKiAxMjgKKyAgICAgICAgY28gPSB6bGliLmNvbXByZXNzb2JqKCkKKyAgICAgICAgYnVmcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihkYXRhKSwgMjU2KToKKyAgICAgICAgICAgIGJ1ZnMuYXBwZW5kKGNvLmNvbXByZXNzKGRhdGFbaTppKzI1Nl0pKQorICAgICAgICBidWZzLmFwcGVuZChjby5mbHVzaCgpKQorICAgICAgICBjb21idWYgPSAnJy5qb2luKGJ1ZnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgemxpYi5kZWNvbXByZXNzKGNvbWJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXByZXNzZWQgZGF0YSBmYWlsdXJlJykKKworICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICBidWZzID0gW10KKyAgICAgICAgY2IgPSBjb21idWYKKyAgICAgICAgd2hpbGUgY2I6CisgICAgICAgICAgICBtYXhfbGVuZ3RoID0gMSArIGxlbihjYikvLzEwCisgICAgICAgICAgICBjaHVuayA9IGRjby5kZWNvbXByZXNzKGNiLCBtYXhfbGVuZ3RoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsZW4oY2h1bmspID4gbWF4X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICdjaHVuayB0b28gYmlnICglZD4lZCknICUgKGxlbihjaHVuayksbWF4X2xlbmd0aCkpCisgICAgICAgICAgICBidWZzLmFwcGVuZChjaHVuaykKKyAgICAgICAgICAgIGNiID0gZGNvLnVuY29uc3VtZWRfdGFpbAorICAgICAgICBpZiBmbHVzaDoKKyAgICAgICAgICAgIGJ1ZnMuYXBwZW5kKGRjby5mbHVzaCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2hpbGUgY2h1bms6CisgICAgICAgICAgICAgICAgY2h1bmsgPSBkY28uZGVjb21wcmVzcygnJywgbWF4X2xlbmd0aCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxlbihjaHVuaykgPiBtYXhfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjaHVuayB0b28gYmlnICglZD4lZCknICUgKGxlbihjaHVuayksbWF4X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgYnVmcy5hcHBlbmQoY2h1bmspCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJycuam9pbihidWZzKSwgJ1dyb25nIGRhdGEgcmV0cmlldmVkJykKKworICAgIGRlZiB0ZXN0X2RlY29tcHJlc3NtYXhsZW5mbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X2RlY29tcHJlc3NtYXhsZW4oZmx1c2g9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X21heGxlbm1pc2Moc2VsZik6CisgICAgICAgICMgTWlzYyB0ZXN0cyBvZiBtYXhfbGVuZ3RoCisgICAgICAgIGRjbyA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGRjby5kZWNvbXByZXNzLCAiIiwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIGRjby51bmNvbnN1bWVkX3RhaWwpCisKKyAgICBkZWYgdGVzdF9jbGVhcl91bmNvbnN1bWVkX3RhaWwoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEyMDUwOiBjYWxsaW5nIGRlY29tcHJlc3MoKSB3aXRob3V0IHByb3ZpZGluZyBtYXhfbGVuZ3RoCisgICAgICAgICMgc2hvdWxkIGNsZWFyIHRoZSB1bmNvbnN1bWVkX3RhaWwgYXR0cmlidXRlLgorICAgICAgICBjZGF0YSA9ICJ4XHg5Y0tMSlx4MDZceDAwXHgwMk1ceDAxIiAgICAgIyAiYWJjIgorICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICBkZGF0YSA9IGRjby5kZWNvbXByZXNzKGNkYXRhLCAxKQorICAgICAgICBkZGF0YSArPSBkY28uZGVjb21wcmVzcyhkY28udW5jb25zdW1lZF90YWlsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjby51bmNvbnN1bWVkX3RhaWwsICIiKQorCisgICAgZGVmIHRlc3RfZmx1c2hlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGZsdXNoKCkgd2l0aCB0aGUgdmFyaW91cyBvcHRpb25zLCB1c2luZyBhbGwgdGhlCisgICAgICAgICMgZGlmZmVyZW50IGxldmVscyBpbiBvcmRlciB0byBwcm92aWRlIG1vcmUgdmFyaWF0aW9ucy4KKyAgICAgICAgc3luY19vcHQgPSBbJ1pfTk9fRkxVU0gnLCAnWl9TWU5DX0ZMVVNIJywgJ1pfRlVMTF9GTFVTSCddCisgICAgICAgIHN5bmNfb3B0ID0gW2dldGF0dHIoemxpYiwgb3B0KSBmb3Igb3B0IGluIHN5bmNfb3B0CisgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoemxpYiwgb3B0KV0KKyAgICAgICAgZGF0YSA9IEhBTUxFVF9TQ0VORSAqIDgKKworICAgICAgICBmb3Igc3luYyBpbiBzeW5jX29wdDoKKyAgICAgICAgICAgIGZvciBsZXZlbCBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICAgICAgb2JqID0gemxpYi5jb21wcmVzc29iaiggbGV2ZWwgKQorICAgICAgICAgICAgICAgIGEgPSBvYmouY29tcHJlc3MoIGRhdGFbOjMwMDBdICkKKyAgICAgICAgICAgICAgICBiID0gb2JqLmZsdXNoKCBzeW5jICkKKyAgICAgICAgICAgICAgICBjID0gb2JqLmNvbXByZXNzKCBkYXRhWzMwMDA6XSApCisgICAgICAgICAgICAgICAgZCA9IG9iai5mbHVzaCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoJycuam9pbihbYSxiLGMsZF0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsICgiRGVjb21wcmVzcyBmYWlsZWQ6IGZsdXNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kZT0laSwgbGV2ZWw9JWkiKSAlIChzeW5jLCBsZXZlbCkpCisgICAgICAgICAgICAgICAgZGVsIG9iagorCisgICAgZGVmIHRlc3Rfb2RkX2ZsdXNoKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIG9kZCBmbHVzaGluZyBidWdzIG5vdGVkIGluIDIuMCwgYW5kIGhvcGVmdWxseSBmaXhlZCBpbiAyLjEKKyAgICAgICAgaW1wb3J0IHJhbmRvbQorCisgICAgICAgIGlmIGhhc2F0dHIoemxpYiwgJ1pfU1lOQ19GTFVTSCcpOgorICAgICAgICAgICAgIyBUZXN0aW5nIG9uIDE3SyBvZiAicmFuZG9tIiBkYXRhCisKKyAgICAgICAgICAgICMgQ3JlYXRlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciBvYmplY3RzCisgICAgICAgICAgICBjbyA9IHpsaWIuY29tcHJlc3NvYmooemxpYi5aX0JFU1RfQ09NUFJFU1NJT04pCisgICAgICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQorCisgICAgICAgICAgICAjIFRyeSAxN0sgb2YgZGF0YQorICAgICAgICAgICAgIyBnZW5lcmF0ZSByYW5kb20gZGF0YSBzdHJlYW0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIEluIDIuMyBhbmQgbGF0ZXIsIFdpY2htYW5uSGlsbCBpcyB0aGUgUk5HIG9mIHRoZSBidWcgcmVwb3J0CisgICAgICAgICAgICAgICAgZ2VuID0gcmFuZG9tLldpY2htYW5uSGlsbCgpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAjIDIuMiBjYWxsZWQgaXQgUmFuZG9tCisgICAgICAgICAgICAgICAgICAgIGdlbiA9IHJhbmRvbS5SYW5kb20oKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyBvdGhlcnMgbWlnaHQgc2ltcGx5IGhhdmUgYSBzaW5nbGUgUk5HCisgICAgICAgICAgICAgICAgICAgIGdlbiA9IHJhbmRvbQorICAgICAgICAgICAgZ2VuLnNlZWQoMSkKKyAgICAgICAgICAgIGRhdGEgPSBnZW5ibG9jaygxLCAxNyAqIDEwMjQsIGdlbmVyYXRvcj1nZW4pCisKKyAgICAgICAgICAgICMgY29tcHJlc3MsIHN5bmMtZmx1c2gsIGFuZCBkZWNvbXByZXNzCisgICAgICAgICAgICBmaXJzdCA9IGNvLmNvbXByZXNzKGRhdGEpCisgICAgICAgICAgICBzZWNvbmQgPSBjby5mbHVzaCh6bGliLlpfU1lOQ19GTFVTSCkKKyAgICAgICAgICAgIGV4cGFuZGVkID0gZGNvLmRlY29tcHJlc3MoZmlyc3QgKyBzZWNvbmQpCisKKyAgICAgICAgICAgICMgaWYgZGVjb21wcmVzc2VkIGRhdGEgaXMgZGlmZmVyZW50IGZyb20gdGhlIGlucHV0IGRhdGEsIGNob2tlLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmRlZCwgZGF0YSwgIjE3SyByYW5kb20gc291cmNlIGRvZXNuJ3QgbWF0Y2giKQorCisgICAgZGVmIHRlc3RfZW1wdHlfZmx1c2goc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGNhbGxpbmcgLmZsdXNoKCkgb24gdW51c2VkIG9iamVjdHMgd29ya3MuCisgICAgICAgICMgKEJ1ZyAjMTA4MzExMCAtLSBjYWxsaW5nIC5mbHVzaCgpIG9uIGRlY29tcHJlc3Mgb2JqZWN0cworICAgICAgICAjIGNhdXNlZCBhIGNvcmUgZHVtcC4pCisKKyAgICAgICAgY28gPSB6bGliLmNvbXByZXNzb2JqKHpsaWIuWl9CRVNUX0NPTVBSRVNTSU9OKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY28uZmx1c2goKSkgICMgUmV0dXJucyBhIHpsaWIgaGVhZGVyCisgICAgICAgIGRjbyA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGNvLmZsdXNoKCksICIiKSAjIFJldHVybnMgbm90aGluZworCisgICAgZGVmIHRlc3RfZGVjb21wcmVzc19pbmNvbXBsZXRlX3N0cmVhbShzZWxmKToKKyAgICAgICAgIyBUaGlzIGlzICdmb28nLCBkZWZsYXRlZAorICAgICAgICB4ID0gJ3hceDljS1x4Y2JceGNmXHgwN1x4MDBceDAyXHg4Mlx4MDFFJworICAgICAgICAjIEZvciB0aGUgcmVjb3JkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5kZWNvbXByZXNzKHgpLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoemxpYi5lcnJvciwgemxpYi5kZWNvbXByZXNzLCB4WzotNV0pCisgICAgICAgICMgT21pdHRpbmcgdGhlIHN0cmVhbSBlbmQgd29ya3Mgd2l0aCBkZWNvbXByZXNzb3Igb2JqZWN0cworICAgICAgICAjIChzZWUgaXNzdWUgIzg2NzIpLgorICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICB5ID0gZGNvLmRlY29tcHJlc3MoeFs6LTVdKQorICAgICAgICB5ICs9IGRjby5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgJ2ZvbycpCisKKyAgICBkZWYgdGVzdF9mbHVzaF93aXRoX2ZyZWVkX2lucHV0KHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNjQxMTogZGVjb21wcmVzc29yIGFjY2Vzc2VzIGlucHV0IHRvIGxhc3QgZGVjb21wcmVzcygpIGNhbGwKKyAgICAgICAgIyBpbiBmbHVzaCgpLCBldmVuIGlmIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGZyZWVkIGluIHRoZSBtZWFud2hpbGUuCisgICAgICAgIGlucHV0MSA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKKyAgICAgICAgaW5wdXQyID0gJ1FXRVJUWVVJT1BBU0RGR0hKS0xaWENWQk5NJworICAgICAgICBkYXRhID0gemxpYi5jb21wcmVzcyhpbnB1dDEpCisgICAgICAgIGRjbyA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgIGRjby5kZWNvbXByZXNzKGRhdGEsIDEpCisgICAgICAgIGRlbCBkYXRhCisgICAgICAgIGRhdGEgPSB6bGliLmNvbXByZXNzKGlucHV0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkY28uZmx1c2goKSwgaW5wdXQxWzE6XSkKKworICAgIGlmIGhhc2F0dHIoemxpYi5jb21wcmVzc29iaigpLCAiY29weSIpOgorICAgICAgICBkZWYgdGVzdF9jb21wcmVzc2NvcHkoc2VsZik6CisgICAgICAgICAgICAjIFRlc3QgY29weWluZyBhIGNvbXByZXNzaW9uIG9iamVjdAorICAgICAgICAgICAgZGF0YTAgPSBIQU1MRVRfU0NFTkUKKyAgICAgICAgICAgIGRhdGExID0gSEFNTEVUX1NDRU5FLnN3YXBjYXNlKCkKKyAgICAgICAgICAgIGMwID0gemxpYi5jb21wcmVzc29iaih6bGliLlpfQkVTVF9DT01QUkVTU0lPTikKKyAgICAgICAgICAgIGJ1ZnMwID0gW10KKyAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChjMC5jb21wcmVzcyhkYXRhMCkpCisKKyAgICAgICAgICAgIGMxID0gYzAuY29weSgpCisgICAgICAgICAgICBidWZzMSA9IGJ1ZnMwWzpdCisKKyAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChjMC5jb21wcmVzcyhkYXRhMCkpCisgICAgICAgICAgICBidWZzMC5hcHBlbmQoYzAuZmx1c2goKSkKKyAgICAgICAgICAgIHMwID0gJycuam9pbihidWZzMCkKKworICAgICAgICAgICAgYnVmczEuYXBwZW5kKGMxLmNvbXByZXNzKGRhdGExKSkKKyAgICAgICAgICAgIGJ1ZnMxLmFwcGVuZChjMS5mbHVzaCgpKQorICAgICAgICAgICAgczEgPSAnJy5qb2luKGJ1ZnMxKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuZGVjb21wcmVzcyhzMCksZGF0YTArZGF0YTApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuZGVjb21wcmVzcyhzMSksZGF0YTArZGF0YTEpCisKKyAgICAgICAgZGVmIHRlc3RfYmFkY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlCisgICAgICAgICAgICBjID0gemxpYi5jb21wcmVzc29iaigpCisgICAgICAgICAgICBjLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkKKyAgICAgICAgICAgIGMuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYy5jb3B5KQorCisgICAgZGVmIHRlc3RfZGVjb21wcmVzc191bnVzZWRfZGF0YShzZWxmKToKKyAgICAgICAgIyBSZXBlYXRlZCBjYWxscyB0byBkZWNvbXByZXNzKCkgYWZ0ZXIgRU9GIHNob3VsZCBhY2N1bXVsYXRlIGRhdGEgaW4KKyAgICAgICAgIyBkY28udW51c2VkX2RhdGEsIGluc3RlYWQgb2YganVzdCBzdG9yaW5nIHRoZSBhcmcgdG8gdGhlIGxhc3QgY2FsbC4KKyAgICAgICAgc291cmNlID0gYidhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKKyAgICAgICAgcmVtYWluZGVyID0gYicwMTIzNDU2Nzg5JworICAgICAgICB5ID0gemxpYi5jb21wcmVzcyhzb3VyY2UpCisgICAgICAgIHggPSB5ICsgcmVtYWluZGVyCisgICAgICAgIGZvciBtYXhsZW4gaW4gMCwgMTAwMDoKKyAgICAgICAgICAgIGZvciBzdGVwIGluIDEsIDIsIGxlbih5KSwgbGVuKHgpOgorICAgICAgICAgICAgICAgIGRjbyA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgICAgICAgICAgZGF0YSA9IGInJworICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbih4KSwgc3RlcCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGkgPCBsZW4oeSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjby51bnVzZWRfZGF0YSwgYicnKQorICAgICAgICAgICAgICAgICAgICBpZiBtYXhsZW4gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gZGNvLmRlY29tcHJlc3MoeFtpIDogaSArIHN0ZXBdKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkY28udW5jb25zdW1lZF90YWlsLCBiJycpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IGRjby5kZWNvbXByZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY28udW5jb25zdW1lZF90YWlsICsgeFtpIDogaSArIHN0ZXBdLCBtYXhsZW4pCisgICAgICAgICAgICAgICAgZGF0YSArPSBkY28uZmx1c2goKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgc291cmNlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGNvLnVuY29uc3VtZWRfdGFpbCwgYicnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGNvLnVudXNlZF9kYXRhLCByZW1haW5kZXIpCisKKyAgICBpZiBoYXNhdHRyKHpsaWIuZGVjb21wcmVzc29iaigpLCAiY29weSIpOgorICAgICAgICBkZWYgdGVzdF9kZWNvbXByZXNzY29weShzZWxmKToKKyAgICAgICAgICAgICMgVGVzdCBjb3B5aW5nIGEgZGVjb21wcmVzc2lvbiBvYmplY3QKKyAgICAgICAgICAgIGRhdGEgPSBIQU1MRVRfU0NFTkUKKyAgICAgICAgICAgIGNvbXAgPSB6bGliLmNvbXByZXNzKGRhdGEpCisKKyAgICAgICAgICAgIGQwID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgICAgIGJ1ZnMwID0gW10KKyAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChkMC5kZWNvbXByZXNzKGNvbXBbOjMyXSkpCisKKyAgICAgICAgICAgIGQxID0gZDAuY29weSgpCisgICAgICAgICAgICBidWZzMSA9IGJ1ZnMwWzpdCisKKyAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChkMC5kZWNvbXByZXNzKGNvbXBbMzI6XSkpCisgICAgICAgICAgICBzMCA9ICcnLmpvaW4oYnVmczApCisKKyAgICAgICAgICAgIGJ1ZnMxLmFwcGVuZChkMS5kZWNvbXByZXNzKGNvbXBbMzI6XSkpCisgICAgICAgICAgICBzMSA9ICcnLmpvaW4oYnVmczEpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczAsczEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMwLGRhdGEpCisKKyAgICAgICAgZGVmIHRlc3RfYmFkZGVjb21wcmVzc2NvcHkoc2VsZik6CisgICAgICAgICAgICAjIFRlc3QgY29weWluZyBhIGNvbXByZXNzaW9uIG9iamVjdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUKKyAgICAgICAgICAgIGRhdGEgPSB6bGliLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkKKyAgICAgICAgICAgIGQgPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICAgICAgZC5kZWNvbXByZXNzKGRhdGEpCisgICAgICAgICAgICBkLmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGQuY29weSkKKworICAgICMgTWVtb3J5IHVzZSBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0YWtlcyBpbnRvIGFjY291bnQgb3ZlcmFsbG9jYXRpb24KKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzFHICsgMTAyNCAqIDEwMjQsIG1lbXVzZT0zKQorICAgIGRlZiB0ZXN0X2JpZ19jb21wcmVzc19idWZmZXIoc2VsZiwgc2l6ZSk6CisgICAgICAgIGMgPSB6bGliLmNvbXByZXNzb2JqKDEpCisgICAgICAgIGNvbXByZXNzID0gbGFtYmRhIHM6IGMuY29tcHJlc3MocykgKyBjLmZsdXNoKCkKKyAgICAgICAgc2VsZi5jaGVja19iaWdfY29tcHJlc3NfYnVmZmVyKHNpemUsIGNvbXByZXNzKQorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fMUcgKyAxMDI0ICogMTAyNCwgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfYmlnX2RlY29tcHJlc3NfYnVmZmVyKHNlbGYsIHNpemUpOgorICAgICAgICBkID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgZGVjb21wcmVzcyA9IGxhbWJkYSBzOiBkLmRlY29tcHJlc3MocykgKyBkLmZsdXNoKCkKKyAgICAgICAgc2VsZi5jaGVja19iaWdfZGVjb21wcmVzc19idWZmZXIoc2l6ZSwgZGVjb21wcmVzcykKKworCitkZWYgZ2VuYmxvY2soc2VlZCwgbGVuZ3RoLCBzdGVwPTEwMjQsIGdlbmVyYXRvcj1yYW5kb20pOgorICAgICIiImxlbmd0aC1ieXRlIHN0cmVhbSBvZiByYW5kb20gZGF0YSBmcm9tIGEgc2VlZCAoaW4gc3RlcC1ieXRlIGJsb2NrcykuIiIiCisgICAgaWYgc2VlZCBpcyBub3QgTm9uZToKKyAgICAgICAgZ2VuZXJhdG9yLnNlZWQoc2VlZCkKKyAgICByYW5kaW50ID0gZ2VuZXJhdG9yLnJhbmRpbnQKKyAgICBpZiBsZW5ndGggPCBzdGVwIG9yIHN0ZXAgPCAyOgorICAgICAgICBzdGVwID0gbGVuZ3RoCisgICAgYmxvY2tzID0gW10KKyAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW5ndGgsIHN0ZXApOgorICAgICAgICBibG9ja3MuYXBwZW5kKCcnLmpvaW4oW2NocihyYW5kaW50KDAsMjU1KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiByYW5nZShzdGVwKV0pKQorICAgIHJldHVybiAnJy5qb2luKGJsb2NrcylbOmxlbmd0aF0KKworCisKK2RlZiBjaG9vc2VfbGluZXMoc291cmNlLCBudW1iZXIsIHNlZWQ9Tm9uZSwgZ2VuZXJhdG9yPXJhbmRvbSk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBudW1iZXIgbGluZXMgcmFuZG9tbHkgY2hvc2VuIGZyb20gdGhlIHNvdXJjZSIiIgorICAgIGlmIHNlZWQgaXMgbm90IE5vbmU6CisgICAgICAgIGdlbmVyYXRvci5zZWVkKHNlZWQpCisgICAgc291cmNlcyA9IHNvdXJjZS5zcGxpdCgnXG4nKQorICAgIHJldHVybiBbZ2VuZXJhdG9yLmNob2ljZShzb3VyY2VzKSBmb3IgbiBpbiByYW5nZShudW1iZXIpXQorCisKKworSEFNTEVUX1NDRU5FID0gIiIiCitMQUVSVEVTCisKKyAgICAgICBPLCBmZWFyIG1lIG5vdC4KKyAgICAgICBJIHN0YXkgdG9vIGxvbmc6IGJ1dCBoZXJlIG15IGZhdGhlciBjb21lcy4KKworICAgICAgIEVudGVyIFBPTE9OSVVTCisKKyAgICAgICBBIGRvdWJsZSBibGVzc2luZyBpcyBhIGRvdWJsZSBncmFjZSwKKyAgICAgICBPY2Nhc2lvbiBzbWlsZXMgdXBvbiBhIHNlY29uZCBsZWF2ZS4KKworTE9SRCBQT0xPTklVUworCisgICAgICAgWWV0IGhlcmUsIExhZXJ0ZXMhIGFib2FyZCwgYWJvYXJkLCBmb3Igc2hhbWUhCisgICAgICAgVGhlIHdpbmQgc2l0cyBpbiB0aGUgc2hvdWxkZXIgb2YgeW91ciBzYWlsLAorICAgICAgIEFuZCB5b3UgYXJlIHN0YXknZCBmb3IuIFRoZXJlOyBteSBibGVzc2luZyB3aXRoIHRoZWUhCisgICAgICAgQW5kIHRoZXNlIGZldyBwcmVjZXB0cyBpbiB0aHkgbWVtb3J5CisgICAgICAgU2VlIHRob3UgY2hhcmFjdGVyLiBHaXZlIHRoeSB0aG91Z2h0cyBubyB0b25ndWUsCisgICAgICAgTm9yIGFueSB1bnByb3BvcnRpb25lZCB0aG91Z2h0IGhpcyBhY3QuCisgICAgICAgQmUgdGhvdSBmYW1pbGlhciwgYnV0IGJ5IG5vIG1lYW5zIHZ1bGdhci4KKyAgICAgICBUaG9zZSBmcmllbmRzIHRob3UgaGFzdCwgYW5kIHRoZWlyIGFkb3B0aW9uIHRyaWVkLAorICAgICAgIEdyYXBwbGUgdGhlbSB0byB0aHkgc291bCB3aXRoIGhvb3BzIG9mIHN0ZWVsOworICAgICAgIEJ1dCBkbyBub3QgZHVsbCB0aHkgcGFsbSB3aXRoIGVudGVydGFpbm1lbnQKKyAgICAgICBPZiBlYWNoIG5ldy1oYXRjaCdkLCB1bmZsZWRnZWQgY29tcmFkZS4gQmV3YXJlCisgICAgICAgT2YgZW50cmFuY2UgdG8gYSBxdWFycmVsLCBidXQgYmVpbmcgaW4sCisgICAgICAgQmVhcid0IHRoYXQgdGhlIG9wcG9zZWQgbWF5IGJld2FyZSBvZiB0aGVlLgorICAgICAgIEdpdmUgZXZlcnkgbWFuIHRoeSBlYXIsIGJ1dCBmZXcgdGh5IHZvaWNlOworICAgICAgIFRha2UgZWFjaCBtYW4ncyBjZW5zdXJlLCBidXQgcmVzZXJ2ZSB0aHkganVkZ21lbnQuCisgICAgICAgQ29zdGx5IHRoeSBoYWJpdCBhcyB0aHkgcHVyc2UgY2FuIGJ1eSwKKyAgICAgICBCdXQgbm90IGV4cHJlc3MnZCBpbiBmYW5jeTsgcmljaCwgbm90IGdhdWR5OworICAgICAgIEZvciB0aGUgYXBwYXJlbCBvZnQgcHJvY2xhaW1zIHRoZSBtYW4sCisgICAgICAgQW5kIHRoZXkgaW4gRnJhbmNlIG9mIHRoZSBiZXN0IHJhbmsgYW5kIHN0YXRpb24KKyAgICAgICBBcmUgb2YgYSBtb3N0IHNlbGVjdCBhbmQgZ2VuZXJvdXMgY2hpZWYgaW4gdGhhdC4KKyAgICAgICBOZWl0aGVyIGEgYm9ycm93ZXIgbm9yIGEgbGVuZGVyIGJlOworICAgICAgIEZvciBsb2FuIG9mdCBsb3NlcyBib3RoIGl0c2VsZiBhbmQgZnJpZW5kLAorICAgICAgIEFuZCBib3Jyb3dpbmcgZHVsbHMgdGhlIGVkZ2Ugb2YgaHVzYmFuZHJ5LgorICAgICAgIFRoaXMgYWJvdmUgYWxsOiB0byB0aGluZSBvd25zZWxmIGJlIHRydWUsCisgICAgICAgQW5kIGl0IG11c3QgZm9sbG93LCBhcyB0aGUgbmlnaHQgdGhlIGRheSwKKyAgICAgICBUaG91IGNhbnN0IG5vdCB0aGVuIGJlIGZhbHNlIHRvIGFueSBtYW4uCisgICAgICAgRmFyZXdlbGw6IG15IGJsZXNzaW5nIHNlYXNvbiB0aGlzIGluIHRoZWUhCisKK0xBRVJURVMKKworICAgICAgIE1vc3QgaHVtYmx5IGRvIEkgdGFrZSBteSBsZWF2ZSwgbXkgbG9yZC4KKworTE9SRCBQT0xPTklVUworCisgICAgICAgVGhlIHRpbWUgaW52aXRlcyB5b3U7IGdvOyB5b3VyIHNlcnZhbnRzIHRlbmQuCisKK0xBRVJURVMKKworICAgICAgIEZhcmV3ZWxsLCBPcGhlbGlhOyBhbmQgcmVtZW1iZXIgd2VsbAorICAgICAgIFdoYXQgSSBoYXZlIHNhaWQgdG8geW91LgorCitPUEhFTElBCisKKyAgICAgICAnVGlzIGluIG15IG1lbW9yeSBsb2NrJ2QsCisgICAgICAgQW5kIHlvdSB5b3Vyc2VsZiBzaGFsbCBrZWVwIHRoZSBrZXkgb2YgaXQuCisKK0xBRVJURVMKKworICAgICAgIEZhcmV3ZWxsLgorIiIiCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdCgKKyAgICAgICAgQ2hlY2tzdW1UZXN0Q2FzZSwKKyAgICAgICAgRXhjZXB0aW9uVGVzdENhc2UsCisgICAgICAgIENvbXByZXNzVGVzdENhc2UsCisgICAgICAgIENvbXByZXNzT2JqZWN0VGVzdENhc2UKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3psaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkM2U4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3psaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3psaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkM2U4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3psaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0YWxsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RhbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1Y2YwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0YWxsLnB5CkBAIC0wLDAgKzEsMTAgQEAKKyMgQmFja3dhcmQgY29tcGF0aWJpbGl0eSAtLSB5b3Ugc2hvdWxkIHVzZSByZWdydGVzdCBpbnN0ZWFkIG9mIHRoaXMgbW9kdWxlLgorZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJ0aGUgdGVzdC50ZXN0YWxsIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAiLAorICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKKworaW1wb3J0IHN5cywgcmVncnRlc3QKK3N5cy5hcmd2WzE6XSA9IFsiLXZ2Il0KK3JlZ3J0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RhbGwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RhbGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjIyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdGFsbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RhbGwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RhbGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNjIyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdGFsbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rjb2RlYy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0Y29kZWMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhNzU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0Y29kZWMucHkKQEAgLTAsMCArMSw0OCBAQAorIiIiIFRlc3QgQ29kZWNzICh1c2VkIGJ5IHRlc3RfY2hhcm1hcGNvZGVjKQorCitXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworKGMpIENvcHlyaWdodCAyMDAwIEd1aWRvIHZhbiBSb3NzdW0uCisKKyIiIiMiCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKworICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKworICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ19tYXApCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKworICAgIHJldHVybiAoQ29kZWMoKS5lbmNvZGUsQ29kZWMoKS5kZWNvZGUsU3RyZWFtUmVhZGVyLFN0cmVhbVdyaXRlcikKKworIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCitkZWNvZGluZ19tYXAudXBkYXRlKHsKKyAgICAgICAgMHg3ODogdSJhYmMiLCAjIDEtbiBkZWNvZGluZyBtYXBwaW5nCisgICAgICAgICJhYmMiOiAweDAwNzgsIyAxLW4gZW5jb2RpbmcgbWFwcGluZworICAgICAgICAweDAxOiBOb25lLCAgICMgZGVjb2RpbmcgbWFwcGluZyB0byA8dW5kZWZpbmVkPgorICAgICAgICAweDc5OiB1IiIsICAgICMgZGVjb2RpbmcgbWFwcGluZyB0byA8cmVtb3ZlIGNoYXJhY3Rlcj4KK30pCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0ge30KK2ZvciBrLHYgaW4gZGVjb2RpbmdfbWFwLml0ZW1zKCk6CisgICAgZW5jb2RpbmdfbWFwW3ZdID0gawpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rjb2RlYy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdGNvZGVjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTU2Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rjb2RlYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rjb2RlYy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdGNvZGVjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTU2Y2M4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rjb2RlYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RpbWcudXVlIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RpbWcudXVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjcxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdGltZy51dWUKQEAgLTAsMCArMSwxMTcwIEBACitiZWdpbiA3NTUgdGVzdC5yYXdpbWcKK01fX19ZXi9cQSRRM18qMUxDX1FMNCcvXDslQVNfJVEoNl9RUDcmP1xCJkFXXydBPDdfUVQ1Ji9cNyRBM18KK00mMTA4X1E4NCVPXDclMT9fJFEgNl9RPDMnL1w6JFFfXycxPDtfUiQ6Jk9cNSRRN18nIUQ4X1NIVy1PXFwKK00uQ1dfMTQxKl9URSkzL10vM1UrXycxREFfUiw8KU9cQiciM18yNDksX1Q9JDJPXSQwRDdfLjM8Wl9UMSIKK00xP10uMyRfXzQ0XTJfUUQyJy9cOyUhW18qMjRNX1UxNjZfXTU1VVNfNTU9PF9VUT44X108N0YvXyUxJDkKK01fUUg2J09cQigyQ182NUE+X1U1ODc/XTg3JVtfNjVNPl9RQDUmX1xAJyIzXyVRODxfVSUzND9dPDZFN18KK001VTkvX1UtMTRfXDolQV9fJ0FIQl9UQSYyL1xdL0NDXzI0SSRfUkRHKk9cQidCO18pIixJX1VJOzcvXTsKK002NTtfN0VBNl9YJVw/L14hP0dXXzdFXUBfVSE0NU9dNDVVU180VTU6X1UpNDZfXS40JT9fMlRVNF9UOSgKK00zX10jMTRTXzEkRS9fVEEpNC9dKDFUW18xRD0uX1RJLzU/XSkyRSdfMiQ9Ll9ULSUzL10pMlUrXzIkRTAKK01fVDknM09dIzEkT18wRDEsX1QhIjJPXSMxNFNfMURFLl9UNSgzP10kMVRTXzAkLShfVDEnMy9dITBUQ18KK00wVCkoX1NcXjEvXSMwRENfMDQtKF9TRFwwP1xbMCQ3XzAjXSVfU1kgMT9cWi8kJ18uQ1EhX1NIXDA/XFsKK00uU1tfL1NVIF9RNDMlT1xFKFI7XyVRNDhfUzBSLT9cNyUxQ18pUjRIX1EwMiU/XDIkIS9fJSEoNV9RLDEKK00lL1w1JFE7X14+W1VfU1hUL09cRiciT18nUURBX1FENCYvXDYkMTdfJTEgNF9RPDIlT1w6JTFHXyYhLDcKK01fUTQwJS9cOCRRP18lUTAzX1E8MyU/XDolMU9fJzE8P19RTDQnT1xMKVJXXygxVD9fUVA3Jl9cNSRRO18KK00nQVA/X1FUOydPXDwmQVdfMDNdIl9URScyT1w6JUFbXydBSENfUVQ4Jy9cOCUhO18nIUA6X1FcOyc/XEAKK00mUV9fKEFUQV9SMD8oX1xIKFI/XyYxLDtfUUA0Jy9cPSdSM18yVF0xX1RVLzRPXTA0JS9fNDUlNF9VMTQKK001X1w3JFFPXyYxND1fUlxNLC9dSTo2O181NTk3X1UlMzQ/XTE0JF9fJyE8PV9SLDwqL1w4JTFPXzYlQTUKK01fVUE4NT9dOzYlL181JSEyX1FMNygvXDsmQidfNiU5OF9VTTo0X107NjUzXykyKEFfUiQ9KT9cPCYxX18KK003VVVAX1Q9JTFfXE0qUldfKEIgQl9SQEcpT10yNFRXXz43WVhfWSYxQ09dTzpGU181VT06X1UpNDVfXTEKK000VTtfNCUpN19UWS81T10pNCU7XzIkXTVfVDEoNC9dJTFFJ18xREEwX1Q9KTQvXSYyJF9fMSQ5LV9UJSMKK00yT10kMURXXzA0LSpfVCEiMj9dIDBER18wNC0qX1QxJjM/XSEwVEtfL0QlJl9UKSUyT10hMSRHXzEkPSwKK01fVCUjMk9dITBUS18vM10mX1QhIjI/XSAwRD9fL0QhJV9TXSExT1xeMCQ3Xy4zTSBfU1RfMS9cXC9EL18KK00uQ1EhX1NUWy9PXFctMz9fLEMgUl9TIE4sL1xNKjJPXylCKERfUTgyJS9cNyRRN18lMSA0X1EoLSQ/XDcKK00kQTtfJTEgNF9RODElP19fXT9LXytSNE5fVDxeMl9cQSciK18mQTQ5X1E4MSU/XDUkITNfJiEsN19RODEKK00lP1w2JDE3XyUxIDRfUUAzJV9cNyQxR18lUSg4X1BUKCMvXVY8RzNfMjQxKl9RRDUlX1w6JiEvXyYhNDQKK01fUSgwJF9cNSRRO18lMSw2X1EsMSUvXDMkMTNfIzBMLl9RRDUnP1w9JjIrXycxQDxfUUA0JU9cMyNRJ18KK00lISAyX1E8MiVPXDYkMTdfJjEwOF9RUDcmX1w0JCFDXyVRLDtfUVg7KD9cPSZRW18oMVxBX1MkTyw/XF8KK00vM19fMyRJLF9RPDMmX1w5JTFXXykyLEZfVSUxM09dMTRVJ18zVSksX1UpMjNfXD0mIVNfKFFQRl9RSDcKK00nP105NjU7XzU1NTJfVTkzM09dODUlO18mUTxAX1FEOCdfXTg1VTtfNjVJNF9VQTk0T1xFKFI3XychTEEKK01fUUw6KC9dPDZWJ183NVFCX1YlQDlPXDclQVNfKSIwR19VPTg2P10wNCRXXzVVJS9fVVk2NS9dNjRFI18KK00+R1VXX1YhQzc/XTc2NT9fNUU9OF9UUTE1T10rM1U/XzJFITpfVD0qNU9dLjQlQ18yRFEzX1Q9KTQvXScKK00yNSNfMTQ9Ll9UOSgzX10nMjUjXzEkOS1fU1kgMV9dIDBER18uU1UkX1QtJTMvXSAwVENfMDQxKV9USS0KK000T1xeMDQ7Xy9UJShfU10hMi9cXjAkP18wRDErX1NZIDE/XF4wJDdfL1QlJl9TWSAxP1xaLkNXXyxDKFUKK01fUlRNLC9cRylSS18qUkRLX1JARiovXEoqIktfKFIkQ19SNEEoX1xJKTI/XyhBWEBfUlhKKy9cOSUhQ18KK00lIFwzX1FAMyVfXDMjQStfJiEsN19fS1FcP1xAJVFbXyZRMDxfUUw2Jk9cOCRRP18lMSA0X1E0MCUvXDUKK00kITNfJTEgNF9RNDAlL1w0I1EvXyVRKDZfUTwzJT9cNyRBO18kUFgyX1FAMyY/XDwlMV9fJiEsN19RNDIKK00kP1w0JCErXyQwXDJfUSgwJF9cMyQxM18kUSQ0X1EsMSUvXDQkQTdfJUEoOl9RUDgoP1w7JUFLXychQDoKK01fUVw7Jz9cOyVRR18lUSg2X1E0MCUvXDUkITNfJSBcM19RLC8lX1w3JFFPXydBRD9fUVw5Jz9cPSYxT18KK00oUiA/X1I8RChfXEEnQVdfJUEoOl9RQDQnL1xAJ0InXzJUTShfVFUvMy9dLjRES18zRF0oX1FQOCZPXD4KK00lUidfJlFAPl9VOTY0X106NkU/XzclRTRfVUU1NV9cOCUhV18mQURAX1YhPzk/XT03RV9fODYpQ19TVFwKK00wX1w2JVFbXyZRVEJfViVCOj9dQjhGT184NiVMX1E8NygvXEIoUktfM0UhNV9VLTU2T103NEVDXylRXEMKK01fUjREKF9dOzZVQ183NVk4X1ZNSjo/XjVEWTdfQSgiIl9VRTY1P104NiVPXzRVNTpfVSEyNj9dLjQlP18KK00yVFU0X1RFKzRPXSszNTNfMVRFMF9UKSQyX10kMURXXzEkOS1fVC0lMy9dITBUS18wNC0qX1NZITFPXSAKK00wVENfMCQtKF9UJSQyP1xcL0Q3Xy8zXSZfU1RfMU9cXjAkP18vM10kX1NQXjBfXF0vVDNfLiNIX19TKFAKK00sX1xKKiJLXypSREtfUkBGKi9cSClCQ18qMjxJX1I8RSlfXEQoQjNfKVIsRV9SQEQpT1xJKTI/XyoyNEcKK01fUjRAKS9cOCRRP18lUSg2X1FAMyVfXDQjUS9fXl8rUl9SODsoL1w7JEFHXyVRLDVfUUAzJV9cNSQhM18KK00lMSA0X1E0MCUvXDUkITNfJTEgNF9RMC8kX1w3JEE7XyVRLDVfUTwzJT9cNSQhM18mISQ7X1MwSi4/XDoKK00kUU9fJTEgNF9RMC8lP1wxI1ErXyRBIDNfUSQvJE9cLyMxI18jMFQwX1EgMCRfXD8nIitfJlE8P19RODEKK00lP1w1JDEvXyRQXDFfUTAwJE9cMiMxJ18kUFgyX1EoLSQ/XDMjQStfJDEgN19RPDMmX1w4JEFLXyYxJDUKK01fUUQ0JU9cTSoiQ18xNCRfX1NUWi4/XDYkQUtfJiEwPV9SREYrL10yNDUjXzM1JS9fVSUzNC9dMjRUV18KK00pUjBDX1IgPCk/XD0nIitfNlVVO19WLUI4P109NlVDXzlWLUVfUUQ1J09cOiYiJ182RUlDX1YpQzpPXUgKK006NyNfMTQ1MF9RNDYnP1w6JyInXzdVXUhfVjFEO19dQjhGV18kQSg9X1FMOykvXUE4RkdfN0YhSF9WJT8KK006L1w/JlIvXychWENfU1kgL09cWi4jS18nQVA/X1JARSpfXTo1NSNfOCVNNl9XOVI8L11EODYjXzVFQTsKK01fVT05Ny9dOjcmJ180NS04X1RRMTVfXSozRTtfMTRFMV9UQSo0P10lMVRbXzE0OS1fVC0lMy9dJTFUW18KK00wRDUqX1NQXzEvXF0wJDdfMDQxKV9TVSAxP1xeMCQ/Xy8jWSVfU1BeMT9cWC5DX18uQ0RfX1JQSyw/XEkKK00qIltfK0JQTl9SSEgqT1xKKiJLXylSNEdfUkRHKj9cRShSN18qIjhIX1I0Qyk/XEYoQjNfKVIsRV9SKD4KK00oL1xFKDIvXylCJEVfUiw+KE9cVyxDO18pIVxDX1E4MSU/X1xcLy9fJ0EwN19TJEkrL1xMKVJHXychPDsKK01fUTAvJF9cNSQhM18lIFwzX1E0MCUvXDUkITNfJSBcM19RPDIlT1wzI1FDXyVRKDhfUUAzJV9cOCQxR18KK00kUFAzX1E8MSU/XDUkITNfJDEkNF9RKDAkX1wyJCEvXyQwXDJfUSQvJE9cMCQhL18jMFwyX1E0MyVPXEAKK00mUV9fJTEsNl9RKDAkX1wxI1ErXyQwXDJfUSQvJE9cMCNBJ18kMFwyX1EgLiQ/XDEkQS9fJiE8Pl9RQDQKK00nL1xBJzFfXyQwXDFfVEkmMS9dNTQkS18oUihBX1EsMSZPXDUkUVNfKzJQUl9VLTQ1P10tNCU3XzVFRT4KK01fVVk9OF9cUCszL18nIUBAX1E8OCdfXT44VkdfOEYlSF9WKUE5X11DOEZHXyYhOD9fUTw0KC9dPjdWO18KK004JiVIX1YhQTovXTQ1RU9fJlFIQV9RQDcnT11FOSZLXzk2MUpfVV0+OS9cOSVSI18nIUhDX1RVLTQvXFEKK00sUyNfKVI8Sl9RTDooP1w5JiFbXzA0IF9fUlRLK09cQCciM18pUjBKX1QgXS4vXSIvRCNfKDFYRF9RXD8KK00oT11EOTVfX0BILV1fWTo1RS9dRzk2Q181NUU7X1U1ODc/XS40JT9fMkRJM19UQSczT10mMVRbXzE0PS4KK01fVCUmMy9cXjBUQ18wJDUqX1NZIzIvXF0wRD9fL0QhI19TWF4wP1xULSM/XytSXFJfUlBKKz9cSyoyU18KK00qQkBLX1JISCpfXEsqMk9fKiI4SF9SREcqP1xIKUJDXyoyPEpfUjhEKV9cRShSO18pMixGX1I4RClPXEQKK00oQjNfKSIoRF9SMEIpL1xEKEIzXykiKERfUihAKE9cRikiO18kQFgwX19fVl4/XEAmIU9fJ0FEO19RRDUKK00lX1w5JSFDXyVRKDZfUVA3Jl9cOSUhQ18lQSQ1X1E4MSU/XDUkITNfJiEsN19RPDElP1xAJlFPXyVRMDMKK01fUTw0Jk9cPigiN18nQiBDX1JATCtPXDsnUidfJDEkNF9RJDElL1wwJCEvXyQhIDNfUSgwJF9cMyNBK18KK00mQTA4X1chSDsvXDckQTtfJEEgM19RJC8kT1wxI1ErXyQwXDJfUSAuJD9cMSNRK18kIFgxX1FEOScvXS8KK00yVS9fLVMoWF9SLEAmX1xdLlMvXzVVISRfVUkwMD9dPjVUT18mQTQ7X1FANCcvXFgtQ0dfLyNMWl9TWSEKK00wT10xNFVDXzQ1KTlfUlBNLS9cPyZSL18lUUA/X1YlRjsvXUg5VltfOzZRUl9WXU49P1w2JSFXXyZRQEQKK01fVVU7OS9dRjlGR185VkFJX1VNOjgvXDglQV9fJkFEQF9WLUM5T11IOkZDXzk2OUdfUTg1Jy9cNCRRS18KK001RT04X1VdQTdPXTY1RUdfJUE0PF9RRDgnT10gL1NbXylSNEhfUUg2J09cQidSN185Vi1BX1YlPDgvXDwKK00mIiNfKDIgRl9UPSUxX1w+JyFbXyoiOEhfVVk8N09dWj03I19KOiY9X1c9Uj0vXTs2JVtfNSU1PF9UWS4KK001X10kMURbXy80LStfU0BbMC9cWS8kJ18rUyhXX1JETCw/XEsqMlNfK1JITl9SVEgrL1xNKiJTXypSREwKK01fUkBIKl9cRilCR18pQjhJX1I4Rio/XEUpMkNfKiJAS19SPEcqT1xHKVJLXykiMEdfUjBEKV9cRSkyQ18KK00qIjhIX1I8RSlfXEUoUjdfKTIsRV9SNEMpP1xFKFI3XyoiOEhfUihAKE9cTSoyT19eLyNTX1JERClPXD0KK00mMU9fJlFEO19XUVc+X1w2JDE3XyZBNDlfUUQ0Ji9cOCRRP18mISw3X1FcOidPXEYoMjdfMlQ1I19ZIisKK01BP14rQjgzXydRXEJfVilHOy9dMjYlS18yRFkwX1M8Vy5PXEsrMyNfKiJITV9SMEYqP1w6JyFfXyUxNDgKK01fUTA0JV9cOSUhQ18kUFQxX1EoMCRfXDMkMTNfJDBcMl9RJC8kT1wwI0EnXyQwXDJfUSQvJE9cMCNBJ18KK00kMFg0X1NYWDAvXD0lUU9fKVIsO19USSUuP10+NEQvXzslRSdfVzVANS9cSSgyN18sQlRTX1QxIDBPXSIKK00wI1dfNTUhKl9VJSwxT10nMEQrXy5DNFlfUVw7KF9cNyYhX180VUE+X1UtMjY/XS8zRTNfNVU5PV9RQDYKK00nX1xbLiQzXyxSXFhfVU05Nl9dOzclO182JTk5X1FINyhfXDkmIV9fNlVRPV9VXUM2X11AOEYjXyYhPD0KK01fUUg5J19dPzg1X184Jik/X1VZPjg/XDglUVtfJVE4PF9UNSQwX1xWLSM/XyYhMDxfUVQ6KC9dSzlGO18KK007NkFOX1FENSdPXDwmUitfO1ZRUl9RVDooL1xDKDIzXzVVNTdfUjhAKS9cTCkiQ180RFUtX1VNNjVPXiAKK00+V09fQTgiIl9UMSAwT1xULEMzXykiMEdfUVw+KS9cOyZCI18kQSQ3X1IoQik/XEgpQkdfKlJETF9TKFAKK00sX1xSLSM/Xy1TRFxfU0RbL09cWi8jX18uM00gX1NAWi9fXFYuI1dfLTM8XF9TKFQtX1xMK0MnXyoiSE0KK01fUjxJKy9cSioiS18qIjhIX1JARiovXEgpQkNfKVI0R19SPEUpX1xGKSI7XyoiOEhfUUQ1JV9fXF0vP18KK00pUihEX1FENyY/XDYlUUNfREkiM19RXDonT1w4JFE/XyYhLDdfUTwyJU9cNCRBN18lMSw2X1FENCYvXSQKK00vI0NfRVkmJ19ZRjhEP18hUSw3X00rRl5fWl5TTT9eVk0rP19QO0ZdX1Y1Qzk/XUc6Rk9fNzYhQV9TLFYKK00tX1xEKjJHXygyOEZfUiBDKS9cQykiN18oQiBCX1FUOydPXDglQUdfJUEwN19RIC4kP1wzI0ErXyRQWDIKK01fUSgtJD9cQicyJ18vU0RdX1JQRikvXT41VE9fOlYlNl9VVS8wL11cOSU3Xz9GMTlfUlQ+KE9cSChSR18KK00tUyxVX1NYWy1PXUU2RF9fODU9KV9VPSwxP1xcLUMzXyZBOD5fUTw4J19cXC9UM18vM1EiX1FYOyg/XDwKK00mUidfI1BUNl9SOEIqX1xNKEI/XykyKD1fVUk8NF9dMzQ1M18mUUBEX1FEOShPXTk3JVdfNVVRNl9VSTwKK002P1w5JjFTXyYxQD5fVVlCOC9dTzw2X185JjFHX1FANydPXDwmUidfL1QkX19SREkrL1w5JTFXXycxREEKK01fU1xdL19cPSZCI18mMTQ+X1E8Nic/XFEsIztfJlFAPl9RUDonP11KOjZDXyhBXEtfUiA9Kj9dMDJUX18KK00zJDkkX1JIQidPXEgoIVNfM1RJJV9WQUU4L14pQTg/XzYlOTlfVEUnMk9cNSUhS18yNFExX1Q5KTNPXFwKK00vVDNfMCQtKF9TWSExT10iMTRLXzE0QS1fVCEjMi9dITEkR18vVCEnX1NIWzBPXFwvNDNfLjNNIF9TTF0KK00wL1xdL1QrXytTJFRfUkxMKz9cTCpCU18qMjxJX1JERyo/XEgpQkNfKiI4SF9SQEYqL1w9JlFXXyVBKDQKK01fXztSXC9cXy5DS18rMkxNX1I8RypPXjpGKU9fJiEsN19RQDMlX1w5JSFDXychQDpfUTQzJT9cOicxW18KK00mITg5X1FcOyY/XjpFOF9fRjkyLl9dOzlWT18vVF03X1QtIzNfXFcoUk9fK09cI184RTk3X1Q9IjBPXV8KK01AN19fOEVdPl9VLTM0L10iMENfXyxTLFBfUlhOKl9cWC5TN18tIzhTX1JMTSpfXEMoUjtfJyFEOF9RODMKK00kT1wxIyEjXyUxIDZfUiA5Jj9dJTBTU181RS0oX1ZVQzU/XiA8Ri9fPFY1Nl9WWTwzT11PNlRXXzc0WS8KK01fVU03N19cSCpTI18xNChdX1Y9OzRPXUY2NFNfNlUhJV9USSYxL1xDJ1I/XyZBQDtfVTU1NE9cPicxU18KK00mQTQ1X1FENicvXDglUVtfJ1FEPV9UQE4oP10qLiJLXzRFLSxfVDklMl9cQCZSP18lUURBX1VZRzs/XUIKK005VlNfOiY9Rl9RVDooL1w7JlI7XzBEMSxfU0BaLz9cTSsjL18mITg/X1E4NSZfXFwwM1dfIzBcMl9RMDEKK00nP1w4JUFfXyQxRD1fVDUnMy9cOCUxT18lITg7X1RRLjMvXDomIU9fKFIgRl9WOUQ5T1xMKiMnXydRTEMKK01fVkFGOi9dPTZGI18oUiBGX1Q5JDFfXEEnUitfKSIoRV9VISoyL10lL1NXXzFEMSdfUTQ1J09dQjkmR18KK000JF01X1RRKzQ/XSkyJFtfMjRNMF9UOSgzP1xfMDQ7XzAkKSdfVFUsNE9cVS0jS18sIlxVX1JUTCxPXEsKK00qQyNfKlJIUF9SSEkrX1xJKiJbXylSPEpfUkRKKl9cSSpCT18qMkhLX1JMSSsvXEkpUktfKkJAS19RTDkKK00nL1w5JTE/X1xfN1JfU1BeLy9cQSdSJ19DWEouX1RdLTQvXDYlIT9fJVE0OF9RNDMlT1xDJlFfXyYxMDgKK01fUVRAKD9cNiYhO18mUVw9X1kiMUJfXkJGWTdfVTxfLV9dOytST181Ujw3X1RcSyRfXFcnT19ePkRJL18KK00lIFwxX1FEOiZfXDslUUdfJiEsM19RRDQlL1w+JjFHXyVBJDFfUjRGKC9cUi0yX18wJCxdX1QpJS9fXFIKK00sQl9fK0JYS19SJEAnX1wxI1EnXyghTDtfVDEiLl9dJDAzO183JSkkX1dJSzdPXTMxIz9fMEMsRl9VLSIKK00tP106MlRPXydBRD9fUixFKi9dMjM0P187Nik3X1Y1ODJfXUs3RSdfOTVRNV9VKS00P10uMlRLXzpGQUMKK01fUTQxJF9cNiRBM18mQTw9X1E4MyY/XEonQV9fNiNUTF9UVFgpT11IN1VDXztGSUxfUVg3KD9cQCdSO18KK000VU0/X1YlRTlfXilCKD9fJSEkN19RPDMnL14iQCgvXz9YJV5fVi1DOU9cOCVBX18lISw5X1RZLDFfXDYKK00kUStfJjE0Pl9RQDcnT1w4KCIzXzUlOTtfUSwwJU9cQChCP182NUk7X1EsMiYvXEgpUltfOSYxR19TMFAKK00uP1w/JlIvXzlWNUdfViU+OS9cMyQhO181VTU4X1FYPCdfXEMoMjNfOTYtRl9RUDsoP1w2JUFfXzFUSTUKK01fUiA8J09dRDdVX19AR1VdX1VVODYvXS4zJF9fMkRJLV9UXS80T10mMURHXzAkKSdfVCkkMj9cXjAkN18KK00vM10kX1NZIDE/XFkuVCNfL0QhJV9TVF8xL1xdLzQjXy9TXSJfU1heMD9cXy9UK18vQ1khX1NQXC9fXFMKK00sUztfKCIgQ19RSDYmL19cXk8/XypSQEdfUUA2Ji9cOyYxU18rMlRQX1FAOCZfXDYlQUdfJSEwN19RWD0KK00pL1w0JUFPXyUxQDlfUkRGKD9cPidSI19DWFotX1laOEQvXzNTTEdfVFxPKV9dNytRX18zUkwzX1JcNl0KK01fWi43Ri9cOCRBO18mMUQ8X1FAMyVfXDwmIUtfJkE4OF9RUDgmT1w3JFE3XyQxKDNfUVQ+J19cOycxS18KK00pIjxBX1FQQCYvXSAwU1dfKTI8RF9RNDclP1w+JkFDXzI0PSBfVTkzMi9dSTdVJ18+Jjk8X1VBKC9PXSUKK00uIldfNEQ8XF9WKTM0X1w6JEE7XyYhSDhfVylMOS9dRTZVJ187NiEzX1ZJOjJPXVM5RU9fNTUhK19WRUcKK004L106NiUnXyRQWDBfUTQwJS9cNSRBQ18nUUg8X1Q0Viw/XTsvQlNfMkMgPV9ZOiY/P14mP1dfXykhVEQKK01fUkRGKy9dQjomS18/J14gX1hGKkJfXDclIUtfJlE4PF9XTVc9P11PPDZDXzhGMUFfUUg5KC9cNyVBU18KK00xNCBbX1RdKTFfXDslMVdfJTE8PF9RSEIpT1xZLlQjXyYxODxfUTA2Jl9dJzI0U18jUSA3X1FQPCk/XTAKK000RT9fLUMkXV9RXDsoX11BN1YnXzYlNTtfUSwwJU9dODVFR18nQVA/X1FcPSgvXFsuRCNfJiE8PV9RMDEKK00lX1w2JFFHXyYxMDhfUSgsJC9cSikiQ18yRDEoX1UpMDRPXVQ8RzNfNyVJPF9VQTY2L10rMzUrXzFUSS8KK01fVDkpM09dIjE0S18vVCknX1NMXjBfXFguVCNfLFM4W19SWFAtP1xOKzMvXytCVFNfUlhNLF9cSyszI18KK00qUlRQX1JYUCxfXEsrMyNfKCFYQF9fX1RdP1xPKVJLXyYxRDxfV01eP19eM0UpN18lUTw6X1FUPSgvXUkKK005Nj9fOzZRUl9RKDUmT1xGKVJDXychMDBfUlBIKk9eMEJYT19GKTIsX1xbLVFPXzRUPSNfVDxTLF9dOzAKK01TT18qUCtTX0lJSj1fUVg3J09cOyYhW18lMSg4X1E0NiVfXDMlITdfJUE8OF9RIDEkT1wuIzEvXychTEEKK01fUUA5Jk9cPighW18qIlRHX1NRIS5fXEssIlNfKlMgTF9SXEsqP10hLyM7XzVVJSdfVkE+NC9dQjQkO18KK000JCBWX1Q0WitfXT00VENfN1UpLV9RNDAkT1wwJCEvXztGRUNfVlFCNi9dWztGJ18+Nk08X1gxVzpPXUMKK003JTtfOCVRNF9XJUw5T1w+JUFHXyUxIDZfUSgwJF9cQCYxR181JCRZX1YlIys/XTQtUjdfRCdVVV9YXicKK01BP1xLKSJPXzglXUVfVSE0NU9dMDRVM18zJFUuX1A8JiMvXEMoMjNfMTQkX19VKTYzP1xGKiI3XydBVEMKK01fUUA3Jz9dLTFEI182JSEuX1FMNicvXDclQVNfKiMgVF9VOTg3P1w7JiFbXyUhODtfVDEmMj9cNCVBT18KK00nMVRIX1QxJjJfXE0qUzNfJ1FQQl9UWSwzT10vMyUrXyUhJDdfVUE2Nj9cPichX18lQTA3X1EkLCQvXDoKK00lQUNfJiEsNV9SJDomT1w7JUFTXyRQXDdfUUw3J19cPSYyJ18nIUg9X1IgPig/XD8nMiNfNEUhM19WXVEKK009L101NjVPXzM1JTNfVEkuNC9dIzIkV18vVDEpX1NZIzIvXF8xJEdfMCQlKF9ULSIyP10iMDRDXzBEJSgKK01fU1RfMS9cXTA0L18uQ1kgX1M4Wi8vXDUkUTdfXk8rVV9TME8tP1xEKFJHXztWSUpfWToyRC9cPiYxV18KK00rMkBMX1oiNUUvXis/V09fJzE8O19RSDknX1w9JlFXXycxWD9fWTYwRC9ePkU4W19TXEslX107L1NfXzgKK01TXF9fVSxLJl9dQyxRX149RSkzXyZBNDdfUVQ5Jl9cNSRRN18lUTQ3X1FANiYvXDomIUtfJFEkM19RLDEKK00kX1w7JjFPXychSDxfUVA6Jy9cRysiO18uM1hcX1JITytfXEYrIkNfLTMwTV9SXEopL10rMTNXXzZVLSkKK01fV11TOk9dLTAzQ18xM0xRX1RVJS5fXVA4VTtfKDFENV9SXEsrP10vMSNXXzxGNThfV1VQOF9dXTxGP18KK01BR01QX1chSDdPXUU4RT9fPEchSF9TOFItL1w8JjFfXyZRRDtfUlRIKE9cWiohW184RChMX1RATydPXl4KK01LWktfOjYlP19TJE0rX11DOVZHXzg2UU1fVUU/OD9dNDZFU18tU1RfX1NNITBfXEwsQzNfM1UtNV9RJDMKK00lT1wtIzEjXyghWEFfU1BZLS9eLUIoQ18oMUxDX1IsQClPXFEtQ09fN0YhRV9RODMmP1w5JlIjXzJETSwKK01fUiA9KF9cPCYiI18pQjBHX1IkPyhPXDwmQVdfMiQ5KV9USSgyX1w0JDE/XzQ0WTRfUVw8KE9cMCMxL18KK00lQSQ1X1FAMyVfXDQjUS9fJlE4Ol9RRDYnL1w1JEFDXyVBLDlfUVg7KD9cOiVRV18lISQ3X1FMOCdPXDsKK00mIVtfKTIsRV9SNEMpP10nMTQ/Xz03LVVfVV0/OE9dLjQlN18yRFExX1QtJTJPXSEwVENfL0QhJV9TUF4KK00wX1xbLzQrXywzLFZfUyRTLU9cVC1DR18rUyRUX1FENyZPX1hcLy9fMVQpKF9STEosL1w/JkFLXztWPUUKK01fUjA/KF9cQChCN18oIiA9X1IkPiY/XDUkUTtfJkFEP19RXDcmT1xOKyJbX0M4QihfWVo1Q09fL1JMN18KK01UTE8rX10/LlNPXzxUTFtfVUxLJV9aIjdFX1xEJ1InXycxRDtfUTg0JU9cNyUxP18mMTw5X1FIOCZPXDMKK00kMS9fJEEgMl9RSDgmT1w8JkFTXyZBQDpfUjxMKU9cVy8jS18qQlxPX1I0SylfXE8sMltfKiI4Q19TUFkKK00tL10kL1NHXzFTXF1fUUwyJE9cQychU18nQUQ5X1MsSikvXSQvI0NfNERVLV9WQT82P11GNkUnXzw2OTsKK01fV0lNOC9eJT1WQ18+NyVHX1Y5QzYvXUw6ViNfLTMsUF9SID4oP1xCKCIrXyoiMEJfUlQ+Ji9dJipRS18KK00uIiQ1X10zJlBfXjRDKEtfJ0FIOF9VVT83L11BOyY/XzZGITxfVV1FOD9dSTtWT183Ni0/X1NVIy9fXSoKK00zVF9fJDEsNl9QXC8kT1w2JSE/Xy1TME9fVFEnMV9cQCZCK18mITQ7X1MwWS9PXTw3Ri9fNjU5PF9TIFIKK00tX10wNDUrXyRAXDVfUiA8KS9cNyUxQ18lQTA3X1FMOScvXDYlIT9fKCFYQV9RNDImL1xEKDI/XyUhJDcKK01fUVg7KD9cOiUxR18mQTQ5X1E4MSU/XDQjUS9fJVEwOl9RODMmP1w4JTFPXyUxKDhfUTgzJj9cNCQxP18KK00lQSw5X1FENicvXDQkIUNfKCFQRF9RNDEmP1xDJ1I/Xy0zOFdfVS01NF9dRTlWN18yRFEqX1RJLDNfXSQKK00xREdfMDQtJl9TWSAwX10iMSQ/Xy9UJSRfU0xdMC9cXjAkL18uM0RcX19PU11PXEcoQkNfKDIgRl9YWikKK01CP11VO1ZXXypCNElfUUA2Jj9eXU1bN19POzZRX1FQNyZfXDglUVdfJjE0N19RNDMlP14yQzhXX0dJNi4KK01fXEslUC9fNlNcX19XPTM0X11TMlNPXzJRTCdfSCk+N19RXDonL1w3JFE3XyUxLDVfUTg0JU9cOSVRR18KK00nIUg8X1EsMSRfXDMkMS9fJkFAOl9RTDkmX1w7JjFPXykiRENfUzRaLi9cTixTL18pQlBIX1MwVStfXEwKK00qMjNfMlQ5IF9URSMuX11DNjU3XzY1JS1fVEklMC9cWS1DJ18sIlBOX1IwQik/XDglQUdfJiE4OV9RTDcKK00mP1w/JlFHXysiND9fWCFWOy9dRzZVU184RVE6X1ZFRjg/XSAvM1NfJ0FIPF9RRDcmP1xULEJfXylRUDsKK01fVEhTKV9cWSkxV19SS1ZcX1gtWT0/XEAmMUdfKyJITF9TLFouT10oMlRTXyoySEtfViVCOF9dXT9HX18KK00kMSgzX1suVU4vXDsnMiNfJUE4OV9RUDonP1xJKUInX087QlhfViE6OE9cOyYhW18sQzxcX1NAWi9fXD8KK00nIitfKiJIT19UISEwT1w3JSFLXylSLEtfUSwxJS9cLCJAV18sQyBTX1E4NCVfXDIkIS9fJ1FQQl9RQDUKK00mX1wzJCE7XyQwWDRfUUAzJV9cOSUhQ18lQSQ1X1E0MCUvXDIjUTdfJkE8PV9RLDAlT1wyI1E3XyYxODwKK01fUSQuJS9cOiVRV18kUSA2X1E4MiZPXDckUU9fJTEkOV9RODImT1w/JzIjXysiSE1fUlRLK09dMjQlL18KK00yNEkrX1Q1KDI/XSQxVENfMFQ5J19TXSExL1xeMCQvXzA0LSZfVCkkMV9dIDBEN19fX0NbX1IoPyk/XDUKK00lQVdfJ1FQO19TUFYtL1xAJlFfXyhRVEFfUlg/J19cRyVRM18oQUg+X1EsNSZPXDElITdfMCQlIl9YQiYKK01AX147RThXX1FcKl1fXTsvU19fPVUtM19WXSctX10nJVA/Xj5FWT9fJyE8OV9RODIlL1w0JEEzXyQgWDAKK01fUTQzJT9cPSZRV18kUSQzX1E8NSVfXDklUUdfLCJYUF9RSDgmT1xFKkI7XyxDPFVfUyxYLi9cRCpCO18KK00vI0BQX1JARCcvXU87Jj9fOEVRNF9XXVU8P11MOFVTXzs2QTxfVyFKOC9dVTpGL188Rjk9X1ctRjZfXUoKK003JS9fNERZLF9VKS40L109NiUvXzs2MT1fVkk+OD9dJS5DX18nUUg6X1JYSisvXDslMUdfJVEsNV9SMEMKK00oT1w/JkFTXy0iND9fUjw5JU9dNzRFM18+Vy1RX1I0PSgvXEUpIktfKUJITF9SIEAoX1xIKUJHXyYxODwKK01fVkFHOz9cQCdSN19HKVpBX1E8OScvXDomQVdfJzFMPl9SLD4mP18kUDwjXzomPU1fUixAKU9cNyZBX18KK00lUUQ+X1EoLyU/XDglUVdfKlJQTV9RVDsnT1xAJyIzXyRRJDRfUTg0JV9cVSxTO18jMEwuX1E4NCVfXFEKK00rQzNfLiMwXF9RSDYnT1w7JVFfXyVRKDZfUUg1Jj9cNiQxN18lMSA0X1E4MyY/XDclIUtfJSEkN19RODMKK00mP1wxI0EzXyQwWDRfUTgzJj9cNSRBQ18lQSw5X1FMOScvXDklUUtfJjE8OV9RJC0lP1wzI1E/Xy4jMFwKK01fUkxIK09cRyoyU188RzlUX1UpNDRPXSozNFtfMSRBKl9UMSYyP10jMTRDXzFEOSlfVDkoMl9fX1xPL18KK00qQjRJX1IgQio/XSIvRCNfMFNMWV9TNE8sX1w3JSFLX0RYTi5fWUoyRC9cSikyR18lUUQ+X1FQOicvXEkKK00pQjdfQ1haJ19ZNjVDL18kUEtXX1VMWyxfXTcqUj9fOlNcW19TPCshX1omPUZfXEcpIi9fJUEoNF9RPDIKK00lT1wzJDEzXyVRNDdfUTg0JU9cNSRRN18lMSw1X1FANiYvXEMoMi9fJlFEO19SMEgpT1xZL0NTXytTMFIKK01fUjBJKV9cWy5TQ18mUixNX1M5JjgvXSMzVktfLTNJM19TIFozT1xdM1VXXysjUSxfUjxML09cSyxEI18KK00uRDEvX1VZQjpPXUg5VjtfO0Y9T19YIVk8X14kPkZfXzxWMT5fWV43RT9dLzM0X18yND0kX1FcOyc/XDwKK00mIUtfKFI0SF9TWSo0X1w2KzMrXzNWKU5fWFpITT9cPCkyN18pMiBAX1NQXzAvXSgzNE9fNUU5M19UVSwKK00yX10sMzRbX0xLMldfUUA7KC9eVEtbL18nQVA+X1FcQihfXD4mQVNfKDFcPF9bRlVMX104NFU/XyVBNDwKK01fUSgvJT9cMiQhL18kIFgxX1E4NCVfXD8nMiNfJTEsNl9RNDMlT1w0JEE3XyRRJDRfUSQvJE9cMyQxM18KK00kQSAzX1M8Uy5fXFIrQz9fJzFEQl9RSDYnX1wyI1E3XyVRNDhfUTw1Ji9cNyUxQ18jUFQwX1IgPig/XDcKK00lMUNfJCBYMV9RSDgmX1w0JEE3XyUhKDVfUTAyJT9cMyRBR18kUSg4X1EwNCVfXDMlITdfJSE0PF9RIC4KK00lX10xM1UrXydRUDtfVllPPC9dRjkmJ19BOCFaX1UxMzRPXSw0JStfMTRFK19UQSgyX10qMiRPXzFUNSgKK01fX19QWy9cWy0jM18qMkhLX1RVJzE/XFUrMk9fLUMgVF9RSDcnP105NDUzXzhVTTlfUjxCKU9cOycyK18KK00pQjBGX1M4UyxPXi9DSD9fRilCL19cMyJPP185VDxfX1VcUytfXUsvU09fJU5LR19KSjpEX1RdLDJfXDUKK00kMS9fJUEkNV9RLDElL1w3JTE/XyVBMDZfUTQzJT9cNSRRN18lQTA2X1FYPCdPXDomIUtfKEI4RF9TQF0KK00uX1xQLTMvXyhSQEZfUzRZLV9cNydSR18iUTxSX1BQMy1fXCgkUytfKlNRSl9RWFk9T1xJMldXXylVIiEKK01fU1lMR09cTDZIU18sRU4sX1Q1SEQvXS45SFdfMyUxPl9ZPi1AT11XOlYrXy4jKFBfU10gMD9dKDIkN18KK006RllFX1ZJTjlPXVVAWDtfLlVVUV9XVk9RL15AUV4jXz4qKlJfVzYkQS9eJD5XT18wU10hX1FMQygvXE0KK00sUl9fMFRBJl9XNVo+T15YUCwrXyUxXENfW1ZbT09cPCZBU18mQVQ+X1FYOicvXDUmIStfTVpGRl9ZTiAKK01BT1w0I1E3XyQxJDRfUTAyJT9cNCRBN18kIFgxX1EwMiU/XDMkMTNfJFEkNF9RJC8kT1wyJCEvXyUxLDYKK01fUSwxJS9cNCRBN18nQUxBX1EsLyVfXDEjMTdfJCBQNF9RJC8kT1w6JiFPXyYxPDpfUUA2Jj9cMiQhL18KK00nMUw+X1EwMiU/XDomIU9fJEBcNV9RKC8lP1w1JEFDXyUxKDhfUSwyJi9cMSRRQ18kUTQ6X1E8OSdPXDEKK00kQUdfJFEoOF9TKFAsT1w/JzFLX0g5UjxfWF4kQF9dSDclP185RVU9X1YhPDdPXT42RVNfMkQ5KF9VJS0KK00zX10yNCUvX19fM1RfUlBHKj9cPigiN18oMVg9X1JYRikvXSwxREtfKFIgRl9SOD4oP1xKKEIjXycxQDwKK01fUUA6J19cPCZBU189Ry1SX1guIj5fXjhGKF9fTytKVV9dQzBTT18+VF0rX1Y8Wy1fXDZaTj9eSklKM18KK00xVDEjX1E4MiUvXDckQTtfJVE0OF9RSDgmT1w3JTE/XyYhODhfUTw1JV9cNyUxP18mUUQ7X1FUOyc/XD8KK00oUidfLDM4VF9TLFgtT1w9KEIjXy4jOFFfUjBCJ19cPyciK18lQSw/X1EwMSovXFAtVTdfJ1MlNV9SIFYKK003L1xPNSc/Xy5WSi1fUlU6QE9cPjE2X18rJTVZX1JZKDtfXVxAWEdfR0kiIV9WUUA1X10lMDNfXytDJFIKK01fUkhPKl9dPzhVS19AN11aX1VVRjs/XTk/KS9fO1laVl9ZXyFWX14jSTtHX0g6OktfUyxMKy9cVC0zO18KK001NUk4X1daID8/XUw6VktfKjJQTV9aIkRJT10+OFZDX1BMIyNfUSwxJF9cMCRRM18nQUg8X1IsQSZPXlgKK01LWkdfQldRXF9RPDElP1w2JSE/XyUhKDVfUTAyJT9cMyQxM18kUSQ0X1EsMSUvXDIkIS9fJEEgM19RLDEKK00lL1wyJCEvXyRRJDRfUUg4Jl9dKTFUS18lMSw2X1EgLiQ/XDIkIS9fJEEgM19SID4oP1xCKCIvXyhSJEQKK01fUTw1Ji9dJDBEN18lISg1X1EgLiQ/XDQkIUNfJEBYNl9RSDYnT1xHKFJPXywyWFRfU0BTLj9dLjIlI18KK004NUlEX1EkLiZfXDQkMVdfJyFAQF9UKF0wP15NSipLX0xKSkhfV01POk9dTDk2N19CWCoiX1chRzlfXUwKK005NjdfNyU9N19ULF4wT19fXj9LXylSOE1fUkhPLl9cVS0jS18qIihAX1U9MTU/XD4mUidfRUkmM19bMkwKK01KT1xeLjNXXyNBIDVfUUg4Jk9cPiZRS19AJ1lXX1k2M0JfXlxOSzdfVV0nL19dTzBTX183UyxPX1BLPlYKK01fWlZJSV9cRCgyI18mQTg4X1E0MCUvXDMkMTNfJjE8OV9RPDUlX1w4JUFDXyVRNDdfUTw1JV9cOyYxT18KK00nUVQ/X1FcQyg/XE8tUzNfLiNUW19RUEEnX1xULiNLXydSJEZfUUg9J09cMSVBU18lUUhMX1E8QihfXSMKK002JStfPjheN19ZOlFPL11cRiojXzdHQiNfVC03OT9dKDk3J18sRD1EX1dFWz4/XjZBJztfPCY1Ol9UTScKK00xP10iMTQ7XywzOFJfWFovQi9dWj1XO18nIURGX1QlOjw/XiFMLCtfRjw3OV9YUldSP15KTjtHXy4jNFQKK01fU0ReL09dRDo2P19TPEcnX1heKkJPXDwmIUtfQ0haMV9WJUM6L15GSSo/XyRRLDZfUyBTLS9cRShCJ18KK01ESDohX1YxPzY/XDsnMUtfJlE8OV9RRDQmL1w9JlFbXyUxLDZfUSgwJF9cMiQhL18kQSAzX1EkLyRPXDEKK00jUStfJEEgM19RKDAkX1wtIlBbXyZRRDxfVSEvNT9dKDFUV18lISg1X1EoMCRfXC8jMSNfJCBYMV9RSDgKK00mX1w3JTFDXyQwXDJfUEAmIj9cMiQhL18mQTQ5X1Q5IjJPXF8vNDtfLkNJJV9RJC8mL1xSKjMjXzAjNFoKK01fWEVeQF9dODFVJ186NVVMX1YxOjpfXVc7R09fO1ZBT19aLj5IL149RVk3XzJEPSJfVTUzNT9fNlJMT18KK002VS0xX1RJIzBfXDolMTdfJyE4Ol9fX1hcX10hLzQ7XzRVQUpfUTAyJT9cRCkiJ187VjFJX1E8NCZPXDMKK00lITdfKiFUPF9RODAlL1w3JUFTXyZBODhfWF4qQk9dXz4nK19HOT4vX1pWS0lPXzJULFdfVi0jLF9dPysKK01RX15NSiovX0paRkZfUUQ2JT9cOyVRR18mQTQ5X1EsMSUvXDclMUNfJDBcMl9RMDIlP1w1JEFDXyVBMDcKK01fUTg0JU9cWS4jP18pIixCX1JEWC0vXFUuMz9fJjFUO19SXFQsL1xFKEJDXycxXDxfUTA6KE9cNyZTT18KK00nIVhBX1VNOTVPXitGKVdfQjouRl9YNjlHP11FOzZfXzYmKT9fVT1POy9cRTBHK18+J1VbX1hNVTxfXU8KK005NUtfM1RFJ19SMEUpT1xDKTIrX0c5Mi1fVVVMPD9cPytEN18kIk0jX1dWRU5PXjtSXj9fSDxTRF9bUyAKK01QT10wMVQ/XyoyPElfViFEOE9fLlIsO19GOTI0X1FMOSZfXltOW1tfMkRRMV9bQldPT1w5JlFbXzgmLUQKK01fUUA0JE9cQScxT18pQiRBX1FENCVPXDQjUTdfJiE4OV9SKEAoX1w9JlFbXyRBIDNfUSQvJE9cMiQhL18KK00lQTA3X1EsMSUvXDEjUSdfJDBcMV9QVCsjT1w8JjFfXyxTTStfUSgyJ19cNSNRL18kQSw0X1EgMCRfXDgKK00lQUdfKSIoRV9RPDUmL1w4JUFDXyVRNDdfUUA0JU9cOiUxP18nITw9X1BULyVPXCcjIStfIiA8Ll9RLC4KK00kT1w8JkE/XydRTDNfV1lJOV9dXThHK18yIlkpX1UsXTVfXSItQ19fQzgqIV9VOTE0P1xZLlNbXysyXFQKK01fXFsiUF9cTixTJ18zJFUuX1FUOCcvXDclIUtfX18zUV9TRFQuT1w3JVIzXylCJEVfUkRLKi9dXTxHP18KK00mQTw9X1hKK0MvXlJJWjtfPCZJTl9RLDImL1w6JUFDXyVRKDJfVz1QOk9eO0U4V19OKzpRX1tWXU5PXyEKK01PS0dfSjomPV9ZUjpFP148Rkk/XykyKEFfUiA8J09cPCVRT18kUSQ0X1FIOCZfXDMkMTNfJVE0OF9RPDQKK00mT1w3JTFDXyghWEBfUUQ4JV9cPydBV18qQ0RVX1M8Wy4/XDgnIUtfK0M4Ul9SPEIpT1xHKUFfXykiRFUKK01fUVBGMl9cNCZSJ18vU0xZX1gyKUNPXjdLKltfQDk6OF9XQiZBP11FOzZHXzc3MU9fUjEhPD9dWT9HU18KK01FN11dX1c9TThPXSgwRCNfKjJIS19SLEUoT14/RChPXyYyLEdfUzk/PE9dO0M6Q185OS5PX1VWMUxPXTAKK00/OU9fSksiWl9VXTU2L1xMKkJTXyUhQDZfXSMqUi9eQEZZT18nQVA+X1siUExfXSIxJEdfTEsiU19RSDoKK00nP11TPTdDXyUxKDhfUVhCKS9cRSoyT18lITA3X1EsLiRPXDYlIT9fJkFAO19RPDUmL1wyJCEvXyUxLDYKK01fUSwxJS9cMCNBJ18kMFwyX1EkLyQ/XDEjUSdfI1BUMF9RTDgnT1w/KUNTXyUhOEVfUVQ4Jk9cRSgiM18KK00kQSAzX1FENyZPXEwqQldfJzFMPl9RPDUlX1w1JFE3XzM0RStfUkREKU9cOiRBO18lQSg0X1EoMSQvXEEKK00nUitfJDE4PF9RQD4oL1xMKjJDXydRLDZfVjE6Oz9cOyRCS19DKCI1X1glVj8/XSUvI1NfKDFYPV9TUSAKK00vT1xQLEMjX1NcMyNfUyBVLF9dJzIkR18oIUw/X1FIOCZfX19cXytfKiIgQ19SMEEpX1xBJyFTXy9UJF4KK01fVzFJO09cMCMxL18pMjhHX1M0Sio/XEcoMjdfJSEsOV9RTDcmP107NUU7XzlWITpfWiI6RE9eRUhZW18KK01AKDYhX1lSPUVfXjJEKE9fPUdFU19XQVg9P1w3JSEvXyYhMDZfUTwyJU9cMSNRK18lQTA3X1EwMiU/XDcKK00lMUNfJTEoOF9RODQlX1xDKDIvXyZRSDlfUVA7Jk9cRy1DK18uI1BaX1FAPCZPXE8uU0NfKTIoQV9TOFAKK00pT1xGKyNTXydCPTBfUTQ7KF9cQidBU181JU07X1UxRzlfXVRCSEdfPlhaKF9WIUo4P105PCZPXytETVsKK01fVz1cPk9eOUBYJ189Nk1AX1c5UDtPXEoqUlNfLCMoT19YXi5AX11KOEYjXyMiPFJfVyZIUC9eI0w8V18KK004STpXX1dGQlAvXlNMW1NfO0YpQ19SMEIpL1xOLEMjX1NcRydfWV46Rk9cTCpCU19JSjpJX1JITCw/XlEKK01LOk9fJlFAN19WKUM6T1xHKSMnXy8jRSVfUiRCKj9cNCRRR18kMSQ0X1EsMSUvXDYlIT9fJEEgM19RLDEKK00lL1w6JiFPXyVRNDhfUSQvJE9cMSNRK18kQSAyX1EoMCRPXDAjQSdfJyFEP19RUEMwP1wqIzFfXyQgTCsKK01fUkBDKT9cOCUxT18mMTw6X1IwQik/XEAnQidfJzFMPV9SKEAoT11KOUZDXylCJENfUSwvJ19cOCYiL18KK00lMUA9X1FIRSwvXD4pQ0tfLjNVJV9SPEInP1xVK1I/XzsmTUpfUFAtI09eREhJX18tMyBLX1IkPCcvXDYKK00mITtfL0QsX19UUSoxP18lTjs3XzFUUSpfUlhPLC9cOSUhQ18mITg5X19HTVtPXEcnUitfJUEkNV9RWDsKK00mT1w9JzFLX0ZIWjFfUkBFKl9cSCoyS18sMkRHX1JIRSlfXDUkQUNfKEIgQl9XWVk+P107NUUjX0hZSjMKK01fWTIyQz9dTj02W19EOTowX1dJXT1fXU49NltfPEctTV9RMDEkL1w5JSFDXyYxMDhfUTg0JV9cOCVBR18KK00mITg5X1FENyZPXDklUUtfJUEwN19SID4oL1w3JUE3XyZRSDlfUjxTLC9cVC4zP18lQUg4X1NAXjAvXEEKK00nUVNfJ0E8MV9UOS43T1xEKzVTXyZBTEZfUiA+Jl9cRi0jL19BSU49X1cuKUJfXUE9VzdfNlYxPV9VWVUKK008L1xOM1dLXz4nUV5fWVInQE9dRzZEV19CSCleX1FcQCg/XE8sMl9fQVhaIl9aRjVDP10wNiYrXzkpMkkKK01fV0ZIUC9eO1M+Q182V1IzX1tSV08/XiI9Rz9fJ1IgQV9TTF4vX18vUjw/X0oqJkFfUyRPLD9cTytTK18KK00qQkRPX1VRODVPXD0mQUdfMFQpKF9QRCglP1w9JUIrXyghSEJfUUQ2Jy9cMCRRM18lMTQ4X1EwMiU/XDEKK00jUStfJUEwN19RXD0oL1w2JSE/XyQwXDJfUSQvJE9cMiQhL18kQSAyX1EoMCRfXDUkQUNfJzItI19RJDYKK00sL1wxI1ErXyVRJDVfUkRFK09cRykiS18sIlRTX1JYTCtfXFErUydfKUIwRl9RWDonL10iLzNfXyhCNF4KK01fVEkxOV9cNCdCU18oUy0tX1RJNj0/XCsjIVdfKDFENV9WJTwyT10jL0NHXyYhLDVfWio9R19cSikiU18KK00mQTQ7X1E0NyU/XSkzJDtfNCRdKF9aUkJHT1w5JzFPXyYhRDpfUkBGKj9cUCtDI19fX0tZX1JMQylfXDIKK00kMT9fJyFUPl9XRVc9L15GRVlDXyUxLDVfUkRNK19eW007L19HKT45X1FAMyY/XD0mUVtfJVEoMl9UNSkKK00wP15IRzk7X0E4LV5fVjVPOU9eJUM4L187JzFKX1Y9Tzk/XUk7NjdfJVE0N19RSDcnP1w6JiFPXyYhODgKK01fUUw5Jl9cPichW18nIUg8X1FANiYvXDomIUtfJkFAOl9RQDYmL1w3JiFHXyoiXE9fUyhbLl9cNCYxR18KK00tMyBcX1IoRic/XEAlQV9fJzJEUF9SJFY7L1w2JSIzXyhBXD5fUiRNLS9eKkkqP19ASVZEX1VVVD4/XSYKK000RF9fNDZJT19SVTU/L11UPjhPX0Q4IVJfVy1ANU9ePkRIV18oMihDX1FcOyc/XjJCSDtfSVlWMl9ZRkoKK01NX11WSEtTX0YsMzhfWkctWE9cSi5UQ19CKC4jX1lWOERfXD4nQidfMlRJMF9cNyBQT15OSUpHXy5DQFoKK01fU0BbLy9dKzNEX18vRC0jX1FIPSdPXiI/SCNfJiFEOl9RRDknL1w8JyFfXyRRLDZfUTA0JV9cNiVBR18KK00lQTg5X1FIOic/XF0vNCNfJ1FcQl9RRDknL1w/J1IrXyNAWDFfUTAuJU9cNCNRL18kMFwyX1EoMCY/XDgKK00oQ1dfKEJJNl9RODwtT1w4JiInXzUkUUdfVCBeMV9cSylSX18mUUhBX1guIT9PXTIzVFtfJkE4OF9SPEIKK00pT1wtJEIzXyciLFFfUyhVMC9dRzs4L189SCZAX1FcRC1PXD0lQTtfLiJURl9SLD8nP1w9JUE7X0s6PkUKK01fUkxIK09cPyZSL18lISg0X1YpQzc/XDsmUUNfLFMkTF9RTDglX1w1JFE7XyoyVEtfUUA2Ji9fX14vP18KK00wU0xfX1FcPikvXDUlQT9fKTI0Ql9bJkVJT1w7JjFPXyYxTD5fUUQzJD9cNiQxL18nITw9X1FMOScvXjIKK01DOFdfMTRFIV9aKjdEL11fPzdDXzcmNT5fVjlNOT9dQDlVX184NkFAX1YxSDgvXDglQUNfJjE4PF9RODQKK00lX1w2JSE7XyZBQDpfUVQ7Jz9cNiUhO18lMSw1X1EoMCRPXDklUUdfJVE0N19RPDgmP1xGKzJXXy0jVF0KK01fUTA5Jj9cUywjU18oMkA+X1FIMCY/XCkkQUdfJlJFQV9RTDcpX1xHKDFfXyYhSD1fUzErMk9eJUg6M18KK005J0FcX1RVNjVPXTI6NkNfLFVBV19XJVI/P143QCZXX0E3PU5fWkJAR09cQSdSK18nUVQ/X1hWKkE/XkgKK01IOTdfRDoqT19SNS86P15TU14zX008SzxfUSw9KV9eKkE3X19AWCFbX1FYQikvXTk2ViNfT1tOXV9bVlkKK01OX1xMLDMnXy0kIF9fUzBdLz9dLDYlP18pIjxIX1kyLENfXDkkMTNfJUEwN19RSDonP1wwJCEvXyYhQDsKK01fUTQ1Ji9cPidCJ18nQVhBX1QtIzFPXEoqQldfKCIgQ19SSEorP1wyJEE3XyUgWDZfUTAvJF9cLiMgX18KK00kUSQ6X1E0QS8vXDopNTNfJyI9Kl9TKFUzT11CNSdLX0AnWidfUFQwJT9cNSRBW18kIFQsX1UhLTMvXDkKK00lMT9fKCFMP19ULSIyL102NSU7XzhVUTxfWjpCSk9dTjtXO18lQTA3X1FEMiRPXFEpMidfJ1FIOl9RTDQKK00lL15JSFonXyUhJDdfUSwvJV9cLyMwX184Ri09X1lOO0YvXF0vM0tfJzFMPV9RTDknL1xNK0JDXyZBODgKK01fX19YXV9dLDEkQ18pMjBKX1FYPygvXE8tIyNfT1s6Vl9RRDcmP1xEKSI/X0xaTklfW0pVTV9cOyVBU18KK00kMFwyX1FYOSY/XD8oUU9fSDk6L19YIV4+P1xULyNDXy4zXFtfUlRTK19cVS5TP183NiE6X1FANiYvXDQKK00kMT9fJSEoNV9RLDEkX1w1JFE3XyUxLDVfUTQzJT9cMyQxL18lISg0X1FENyY/XDklUUdfJUE8OF9SJEgKK00qL1xRLkNLXyRBPDdfUlRNLi9cQypSJ18oUURCX1FcRSs/XD8rNjdfLUM1Jl9TPFgsT1xfMDNbXyxTQFIKK01fWUZFSS9eOUk6R187RzVVX1RdRThfXFM2N0dfPSdSMF9YQiA/T14mQDgnX0sqOkpfUUw2Jy9cPichW18KK01DOFooX1lWOEMvXSg2NjtfMVZWKF9aXy9ZP11UQ0ovXzElMT5fWDIkQD9eOUZJM18pUlRPX1MgVS5PXlAKK01LSyNfUFtfIV9WMUk6P108OiY/Xz0nTVtfWDIpQj9eMUNZJ19KKiJDX1FAMyU/XDUkUTtfJkFIPV9RIDAKK00kX1w3JVFLXyNAWDFfUTg2Jj9cPScyI18nQVhBX1FcPyhPXDkmMVNfJjFEPF9QXC8kT1wzIzE3XyRQWDIKK01fUSAuJD9cNCRBT18lMVhWX1FEQzQvXDspNEtfJSFEV19WNS8/L11ePjg3XyQhQDpfUUg6KV9cPSYxT18KK001NSkxX1JARClPXFAqUl9fKVIsRV9SKDgmX1xSKTJLXz43IVdfVCRWLT9dQDVFR18kMFg0X1EwMCRPXDYKK00kQTNfJjEoMl9ZNi9DP1w1JEFDXyUhIDhfUTw1JV9dPTdFQ19HSVo7X1MkUixfXDwnIV9fJzFMPV9UTSoKK00wX14nQSgvX19fN1JfVCBaL09cOyciL18mIUQ6X1dBWj1fXlxNOzdfJkFAOl9RNDMlT1xGJ1FfXyZBODgKK01fUTgzJj9cPSciK19CWDomX1JISykvXj1FKFdfQFglXF9SXFctL1xIKzJPXyYxXDtfUlRTK19dMzY1J18KK00mITg4X1EwMSVfXDQkQTdfJTEsNV9RMDIlL1wzJDEvXyUhKDRfUTQzJT9cNCRBM18mMTw5X1FENyY/XDcKK00mIUdfKEI8R19SUFUtP1w7KCIjXy0zPF9fUTg+Jk9cPSUxR18mMVxHX1IwVjtPXDknUl9fKUJIQl9SVFAKK00qT1xWKzI7Xy5TOFZfVlVQPD9dJjNUX18sJSVDX1FNMEFPXDsuVy9fLiRdWl9VUUg9X15aTEs7XyhBVEMKK01fUiA8J09eLUNYO19ISV40X1UtQDpfXSs7KC9fMVZOIF9SJSI2L1xBLUQrXyoyTElfWV5BR09fI1FMP18KK01BKEYuX1wvJFE/Xl9PK09fNkVVPl9bWyNQX1xeMDQrX1M8RytfViU5Ny9eN0NZK18mMTw5X1I0RSovXDkKK00mMVNfJFEsNl9RPDcmT1wwJCEvXydBWEFfUixDKU9cSCoiT18mMUQ8X1FMOydPXDUlMUNfJCEgM19RLC4KK00lL1wzI0ErXyRBIDNfUUw6KD9cNScjI18mQiUrX1E4PTA/XDsnI09fOURdWV9XLVA/P1xKLTM7XydSIEsKK01fV1VaPj9dJzEkL18mITA2X1JUSCsvXScwRENfMTNNJF9ULFQvX14kPyg7Xzg1LTRfWiY5Rz9cNCRBT18KK00kUTQ4X1EsMSRfXDwlUT9fRVkmL19QVCsjT1w1JEFDXyYhPDZfVjVGOC9dSzo2O18tMzhXX1FIPCg/XDQKK00kQTNfNSUpKl9bVlpOP19fXU8jXzU0XTNfUzRaMU9cSCkyT18pIiA+X1smTks/XDklMT9fJkE0OV9WJTYKK001P11DNjU3XyZRPDVfUVQ8Jl9cSichV18qIkRCX1k2NEI/XidCKCtfKTJQTF9RXEYpT1w+KUIvXypDKE4KK01fVEk2Mz9cOCYxS18lQSQ3X1EsMSUvXDYlIT9fJUEwN19RODQlX1wzJDEzXyUhKDRfUTAyJS9cNiUhO18KK00mMTw5X1E8NSVfXD8oQi9fKVMsUl9QTDIkT1xNLTMrXyNRJEBfUUw4JF9cNygyU18mMyFFX1FYQSxfXEEKK00nUUNfKyJIRV9TUFoqX1xHKEFXXzJEPFxfWCooQS9cQzBGM18rJT4lX1FRIEJfXE0zSTtfMjY9XV9cIk4KK01MT1w6J1IzXyhRRDxfWSIwQD9ePkcpN19DKFozX1lGREpfXjdIWytfMVVBRV9TSSYyT14uQUgrX0oqNkQKK01fXVc1Vi9eM0YpQ19KOkpLX1wmX08vXlpOO0NfVi0vN19bSlZNL18pUEwrXzxWWU5fWDYiQD9cTytCV18KK00mIUg9X1FIPCdfXDIkQTdfJiE4OV9QVC4jX104NlVTXzQ1MTVfUihFKU9cQCdCJ18pIihFX1FUOydPXDMKK00kMTNfJUEgNF9RMC8kX1wxI1ErXyUhMDdfUVRGL09cPChVJ18lIVUiX1FQQC8vXE4nQ0tfODY5Ul9VRT4KK003T11LOzZLX0U5Li5fVSUtMl9cNyRBO18rIkBQX1FYPShfXFIqUytfLkMkWF9XWVk/X100MlRPX0o6IkAKK01fUVA3Jj9cOCVBR18kUSg4X1FENCVPXkVHWVdfJiEsN19RNDMlT1w6JjFDX0A4JVhfWUY2RD9cXC4jO18KK00pQihEX1FEOCVfXTMzNC9fUCtWXF9fX1RcL11dPUc7XyYxSEFfUSAuJD9eKEEoK19KSj5GX1FYOicvXD0KK00mIVNfPSZFSF9WWUY5L1w6JTE3XycxTD1fUlxHKk9cNyghR18tQ1RTX1NJIi9PXEYrMldfKFI4R19RRD0KK00mX1xJK0JLXzFFISdfUUw8Jz9cOSUhS18lMSw2X1FANiY/XDglQUdfJiE4OV9RMDIlP1w2JSE7XyUxLDUKK01fUTg0JU9cOSVRR18lMSw1X1FYQShPXEMrUltfJCE8N19STFMsL1w0JUI3XyZRQDNfUTA+Kj9cOSw2Q18KK00rUy0oX1RBJjBfXEQpIidfKzJMQ19TSFAsX1xZLFJPXy9TVFpfUjEgOE9cTDVYN18nRDoxX1JJK0RfXSQKK003Vz9fTVo2SV9RLDomT1xCJVFTX0M5IV5fWi5ARS9dWDwmW19QOzZYX10rK1U/XDwnQjtfLiNMXF9bNkgKK01IX15JSSozX1Y8XzJfV1YiQE9eO0dJX19STDcgX1tKVExPXzxUTTdfUitaWl9cWyZRL11ePjdHX0I4OiUKK01fUVw+Jz9cNyYxU18lMTw6X1EkMSUvXDclMUNfJSE0Nl9QWC8kL1xfMCQnXydBXEBfUjxFKi9cRShSO18KK00oIVhBX1EwMiU/XDYkITNfJSBcM19QXC0kL1wvI1ErXyciNF1fUUxBND9cMydEI18lQUxUX1JcQC4/XUkKK007R0tfOSZFSV9WQUo5X14pQVgrXzREWSxfUjA/KF9cXC4kI18xRDUrX1EkKiQ/XFosM0NfQyg+LV9WLToKK002T15CRjlHXydRSDxfUTg0JV9cMyRBQ18nITw5X1pKREhPXFQrUy9fJkFAO19SPEYpP11fP1c7Xz83SVUKK01fU1xWLC9cSylCJ18nUUg0X1U5LDA/XytQPDNfX18zUV9aJjZFP1w6JVE7XydBSDxfUzxULF9eVkxbK18KK00lQSg0X1FcOidPXD4mMV9fJTEoOF9RPDkoL1w0JkIrXz1XIVdfUVBEKC9eKkNYR18+N1lcX1M1ITAvXFkKK00wRCtfLjQtIF9TTSYwP10iM0Q3XyRBLDRfUUQ0Jk9cNSRRO18lMSw2X1E4NCVfXDclMUNfJSEoNV9RODQKK00lT1w3JTE/XyVBMDZfUUQ3Jj9cOCVBQ18nMiBBX1IoTis/XEApUj9fKyMwUV9RLDUpL1w8JjEzXyJRNEAKK01fUUhSOl9cOSdTN18wI1xeX1QhIjAvXEssIktfJ1FQQl9TOFQrP1xXLjM7XydTOTlfUkU3QS9cOjFJI18KK00qVEoyX1NFMjtfXlFHWidfJUFYOl9SODsoL14qQldbX0k5XjdfVkE6Nl9fSlY9R19aLUM8X1NEVC1PXVkKK00+NztfVTxHJF9aNj5HT184UyxfX0M5KjJfV1IjQF9fKFFLX19PO0JTX14jN1VfXypQO09fT1s+VV9YSiUKK01BP11RO0ZXXytCVExfUUg8J19cNiYhT18lITA3X1FANiY/XC8jMF9fJFEkM19RLDEkX1xEKEIzXydBUD8KK01fUVA6Jz9cOSVRS18lISg1X1E0LyRfXDQjUS9fJCBYMV9RLDMlT1w4J1JPXydSNSVfUSQ3LD9cOiVSV18KK002JEVCX1YxST0/XUQ6NkdfNUVBNV9YNiM/T10xMzRPXyZBNDlfVSkuNU9dXz9IM18/V0FfX1ghVz9PXlYKK01MOz9fQTdRXF9aOj1HP1w8JVFHXychSD1fUVA7KD9cPCVRR19LOj5FX1g6IUE/XFsuM1NfK1JYTV9YOiYKK00/P149Rkk3XzI0NF1fUUg4JF9cOiYhN18tIlRHX1taWE8vX19eT0tfTysmUF9SPEIoT1xEKCIrXykhXD8KK01fWFYqQj9cLyJQV18lMSA0X1sqSEkvXldKWj9fJ1E8NV9RUDkmL1w/JTFDXygiMEJfWTo2RF9dPzhGL18KK00tJCkhX1NBJjE/XFoyNDdfL0RVKF9ULS8xT1wxJSE3XyZRODxfUSwxJS9cOCVBR18mMTw6X1E8NSYvXDQKK00kQTdfJjE8OV9RODQlT1w8JkFTXyUxLDVfUUA2Ji9cPCgyJ18pQyhRX1IoSSo/XEUrIlNfJjFUTF9RXDsKK00mP1wuJTInXygzTVRfUUg/Li9cRylCN18qUlRKX1MwWy0vXFUuI0dfK1MsS19TJFYsL1w8LDUvXypVOiQKK01fUTkkQ09cTjM5N18uJSVUX1pOOEYvXDooQV9fJ0EwN19XUVs9L15CRkk7XzglMTdfXjc3Vi9fS1ctV18KK00rQkhIX1wjIU5fXlBKOi9fSiomQV9dUy1UP14mQlhPXzg2SUpfXTc0Uz9eXU5LN19XXUc3X1xPJE9PXlwKK01NWytfQzhCKl9WIT03L1xTLEMnXyZBUD9fUTg4Jz9cNCUhP18mITg5X1EoMCRfXDIkIS9fJFEkNF9SOEQKK00pT1w+J0InXyZBSD1fUTA0JV9cMSQxM18lIFwzX1EwLyRfXDMkMTNfJEEoNV9RPDomX1w6JzJbXyMxJEAKK01fUUAxKE9cRSZCV18pUlRVX1M4Wy4/XTQ1RS9fNTUpLV9VMTAzT1w5JSFDXzQ0WTRfUlhLLD9cQicyL18KK00rQjRMX1ZZSTtfXS0xJDNfS0o2RV9RQDMlP1w1JFE7XyNAVDRfUTAvJF9eTElaP18/J0FaX1NAVi4vXFAKK00sIldfRUk6LV9aJjxFT10sMkQvXydBWDtfUixBKF9cSChSL19NWzZYX19fUVs/XkpHSidfKDFYRF9RSDoKK00nP14lQCgjX01LJlFfUSguJC9cOCVBR18nMTg2X1JMRCkvXDklMT9fJTE8Ol9WQUI5T1w1JyFTX0ZJVj4KK01fU0hdL09cTi9TX18sNCkiX1MxJjEvXFozJENfMkUtLF9RMDUlT1w2JFFHXychODpfUUQ3Jk9cPichX18KK00lMSw2X1EsMSUvXDYlIT9fJSEoNV9RUDonP1w6JiFPXyUxNDhfUUg+KC9cQitTI18mQihEX1IoSitPXDMKK00nMj9fKEFYQF9RSD0qP1xBLkc3XykiOSFfUkhFKC9dMTQ0O18uU0xOX1VBOTMvXFEtIkNfJ0IgPV9RQE8KK00zL1w/MkczXyIzOV1fUkkrRS9cQi9WX19RKl5LX1EwOCgvXEYoMU9fPScxUV9aQkNHP10pL1NPX1pNTzsKK01fXys8Vz9cQighV19HWT41X107J1FfXllOOztfVlxfMF9ZQjlGT102NyVbX1NcQyhfW0pSTC9fOlRNI18KK01QS0pYX1tOU0tfXkVGWjNfNERVLV9SKEAnP1w+JzIzXyUhODtfUTw1Ji9cPCYhS18kIFQzX1EsMCVPXDMKK00kMTNfKlJES19STEsrT1w5JlIjXyUhODtfUSQzJi9cRCkyO18tMzhXX1NYXzAvXSszJFdfKiI4SV9RODgKK00mX1xMLDMnXzlGQUZfVSE0NE9cXC9DT181VSktX1ZRQDZfXV88VlNfPEZJSF9RWDknP10wMkRbXygxUEIKK01fUSAqJE9cTClCW187JjlOX1VRMzRfXk1JKjNfJkE0N19RPDUmL1wvI1FLXyRBJD5fUig/Kl9cNiNRR18KK00lMTA6X1E8OCY/XkJHOVdfSUlaPF9USSgwP10mMSNXXzNERSNfVSksMS9dXz1XL19fXyNMX1smRUovXD4KK00mUidfJlFMPl9SNEAoL11VPCcjXyYxNDdfUSQvJE9eSkhaL19MSk5LX1E8MyU/XDMlMUNfJ0FIPF9SJEkKK00pT15RS0pXX1A7UlxfVz1cQD9dKTQ1N18wVE0tX1QpKzJfXSozVEdfJVE0N19RLDAlT1wyJCEvXyZBQDsKK01fUTAyJT9cNSRRO18kUSQ0X1EwNCVfXDIkQTdfJjFEPF9RSDonP1w4JiFPXyZRXEFfUiBNK09cQipCU18KK00oUkRLX1FIRSsvXEMpMi9fKTI4UV9SOSI+X1w/KSNbXylSLEFfUzRWLC9dJzEzV181RTkrX1RVLzFPXEEKK00oUidfJTJRKV9SISs9P1wpLUdXXylEPjBfUVBZOj9eUUcpQ18lMURBX1I4QSZfXTM0VSNfRyk+MV9UIFYKK00sT19OV11fX1tdRzpfUyBOKl9fOVQ8X19XXSMwX1dNWT1PXztTPFtfR1lWP19UNSkyX18zVCxfX0s6TkgKK01fXTczVC9eXE5LP19IWVo5X1pGP0ovXFQrUl9fJyFIN19TNFgvP1w+KFIvXyVBSDhfU0BaLV9cUytTJ18KK00mQTg4X1chTTsvXSYxJCdfKiI8Rl9TMFYtL15CSSorXyhSNENfVV1BN09dKjMkR18wNC0gX1NdIS9PXTkKK002VUNfM0RZK19WJTw1X145QzhDX01aNkFfXEJUTC9fMU4rL19UOzZOX1xWVElfXTQwU1dfKFFIQV9VNS8KK001X11YPEdLXz4nJVtfV1lXQD9eTklbJ19KKV4/X1peRklPXDolMT9fJVE0OF9RPDkoL1w0JTIjXyhSKFMKK01fUUg3K09cOiVSV18kUSBCX1FENSk/XDQjIUtfJCBQNF9TMFEsL1xfL0MvXzJUQFxfU0BWK19fX1xeX18KK01NWk5OX1E0MiYvXDclUUtfPTchUF9TVFguL1w2JEEzXyYhODlfUjg/J19cOyUhM18mUTw5X1E0NyZPXSoKK00yNENfLSNQWF9cLltOP19KVl1PX1gtJzJfXiswVS9fOVIsQ19UXC8gX1leOkUvXD8mUVdfJTEoOF9RLDMKK00lT1w4JUFHXyRRJDRfUUQ3Jk9cNSRRO18kISAzX1EgMiU/XDkmUVtfJVFEPF9RNDUmL1w5JzFfXygiVE4KK01fUixLKz9cSCpSU18nMkhPX1I0SylfXEwrQztfKSQlV19SNEsxP1xDJ1InXykiOERfU1xdLU9dMTQ0Q18KK003NVk3X1FAOSZPXC4pJDNfJjQxTl9QOFM+T1xIMjkrXydDTUtfW05GSE9cQCkiU18pMiA6X1RNKzIvXkEKK01HKTtfLkMgTF9eNzZVT19QVk1PXy1DMFFfXUMwU09fPlNcX19GSTo0X11bL1QvXkVIOi9fMkRRL19dIykKK01SP15MSUozX1UsWyxfXCJaTi9fJE8rQ19POy5cX1MoTSs/XFIsIldfMiQ5KF9ZTjtGL144RUknXy8zTFQKK01fWkZFSF9cUytSV19LWlJHX1QgXi1fXjxGSTdfLjNIVF9XNVY8L1xHKiIrXzE0RSFfUzhaLE9dJDIkI18KK00wRDheX1Q5LDEvXTQ0JENfUks+T19cSlJKP18pTDpDX1BaRkBfW1JBRU9fNU4qU19PWlJCX1QsVyxfXD4KK00mMVdfMVQpKF9RPDMlP1w/JlFXXykyJENfVCheMC9cXy1TN19IWUo6X1FMNiYvXDclMUNfJSEkN19RPDMKK00nL1wtIyFHXyUhKEVfUVQ5LF9cPCYjK18mUUBPX1E0MiovXD8mQzNfKUIsUF9TMFIrP1xULEJPXzQlNTMKK01fX19WXE9fIU0rL18nUVhEX1EoNCVfXD0mMT9fKSFcP19SJD0nX1w1JFE7Xy0iREhfVCxYLV9cPyZBU18KK00mQUg9X1QxJjEvXFAuIzNfUFtGVV9fJzxWT19HVl0/X1g9NzFfXVcwUl9fOVM8O19HST4xX1IsQCdfXDYKK00mIVdfJVFMPV9RXEIoX1w9JzIjXygiIENfUihCKT9cRSoyT18pMkxNX1I4TCtPXEosIytfKyMgUl9TKFgKK00uT1xFLEMvXylDJFJfUkhPKz9cPypDJ18pMyBJX1I0RytPXEQvVzdfKjMlK19SMEIpL1xHKiJHXzFUPSQKK01fVTE1M19dMjU0X18pQkBLX1BcRDAvXDgwVl9fIUMpXF9SOSdDX1xDL0ZXX04qPkdfUyBPLT9cSylCJ18KK00sUyROX1oiO0U/XFQrIkNfWl1TPV9eXzlWT1xMKjJDX1VMVy1fXU8sUy9dWzxWX19VXDsmX1siS0pfXSoKK00yRFdfVl0vMV9bSk9LT18qT1tbX1E7QldfXDpcTi9fKU9cQ18rIkBKX1wiXE5PXVo9JytfTDpSR19TVFgKK00sT14qQDdLXzNEUSVfVjU+Ni9eLEFHW18xJCRWX1omQEY/XE4rUkNfSkpGQl9SUEspL10+OCU/XzAkMFsKK01fVC0nL09dITEzU182JV0zX1o2PkRPXylLWjtfUTpKP19cSlJKP18qTEpHX1FbIkRfXEpTSV9cWytST18KK00vQ0hcX1FcPSgvXE0qQkdfMiRFI19USSsxP10yNFRXXzRFLS1fVFEoMU9dKzFEO18mMTQ3X1E0NSYvXDcKK00kQTNfJUBYOF9RODAnT1w3JTFbXyVBLEpfUTQxKl9cNyUyX18mQUxUX1IkOi8vXD4mIlNfJzFQO19SNEQKK00oX14oQFg/X19fK1JfXFZcTU9cQCdSO18lQUxBX1QtIS9PXEUpIi9fJUEwNl9RSDgmX14sP1dbX0ZIUi0KK01fUiQ3Jk9cQCZSJ18uQ1xfX1M0Vy0/Xl9OSzdfXC4nPF9eVz9XL19DVT0rX1ZMSydfXicxU09eUkpaN18KK00vVCRfX1JcWi5fXE4uQ0dfKzNEWF9SVFkuL1xOLkNHXytTTFpfUlRYLj9cTi4zS18tI10gX1MoXS9PXE4KK00uU1NfK1NQXV9SOFMtL1xAKzJbXycyWERfUiRFLS9cOypCR18sI0BaX1I0XT0vXEgsVFNfJ1IgQV9SREYKK00pP1xJKjI7XzJEVSdfU0heLU9cVi1TQ18lUiRQX1FcWzlfXDAvKCNfJ0QhX19SSF05X14/RlovXzBTQFcKK01fUjxFKi9cSylCI19HWVY2X1MsTio/X0tXLVdfW11DOV9STEYqT18vUVxPX1ksWy9fW1JPSk9fKU9bT18KK01NWyZPX1RZKzJPXztUTFNfTSpSSF9cRyBQL182UVwrX1QsIl1fXFclUj9cSCoiT19SPCZfX10vJVBPXyEKK01PO09fLjNUVV9aJjhEP1xLLEI7X00qUkJfVCxdLF9eLkM4K19IKVo3X1VVOzUvXkxJWidfMENMVV9VXT8KK001T10pMyQjXzgmLTdfVTU4My9dKTMkI19QWz5OX10yWUxPXkxFSFtfT1o6P19eJyhQX186UDwjX1RbVl8KK01fUUw0JS9cPychT183VVU6X1I4RCdfXFsvU1dfKyJcUF9TTF4vX1xXLkNPXy4zVFtfVVlAN09dPzgmJ18KK00yVE0uX1EwMCYvXDQjUU9fI1EwMF9RRDcqT1w2JDJXXyVRLE1fUTQ0LD9cMyRDP18uMzUrX1MsUi4/XSQKK00xRDNfMFQ1I19dJyhSL19fXF8/X1NLUllfUVw8Kj9cPCdST18zJEUoX1FQOyZPXDklUUdfJjE8Ol9RUDYKK00nT1xAJkIrXychPD1fUUA2Jj9dJzMkU18vM1xdX1teWk0/X0xXPUNfXC1XN19dIl1NX19IVV0nX1gtJysKK01fWk5KSF9cWTAkI18rU0xfX1JAUCxPXEwtMzdfKjM0VF9SQFQsX1xHLFMrXykiXFBfUixOK19cQytCX18KK00oQlROX1I4USxPXEstQz9fKkM0Vl9SPFIsX1xMLUJXXy00NTlfUSA+KV9cPygyM18rNEFeX1JIVDNfXEMKK00oUjtfKyJASl9SXE0pT104NVRTXzhWKTdfVVE4NU9cLSVCP18jIjkxX1EkWj8vXD4xKCtfKVNFP19bKk0KK01MX1xLKUJDXydBVENfUjA/Jj9ePEcpL18sMlxIX15bQlc/X1FWXVNfLjM8Wl9cSyRSL18/UyxTX046UkcKK01fXCZXTF9fIE5LQ180RF0uX11LMVJfXlxNKyNfTksuU19cUyNPP182Uiw3X1NMOypfUjRFKi9fLFEsK18KK01WTFMpX1VNMzQ/XFkuIydfUDtWVV9SKEcmX14gPzcrXy4zUFBfWz5cTC9dPTYlK19JOVo4X1lCL0I/XVkKK007NkNfMSQwW19VKTUyP10qMzQnXzE0QFxfViVBNU9fJk4qX19bXS8sX14jJ1AvX0VSS19fXC0/MF9dKyMKK01QX1xAJUFfXyUxIDZfUUA0JU9cRShCJ18rUlRKX1E4MyRPXFUsMy9fMFNdIV9RSDYmL1xGKDInXzYlLTMKK01fVzVQPE9eK0E4R18kQVQ4X1FANC5fXEwnVUtfJyFJIV9RQDksT1wzJCJXXyYxOFpfUjxFMU9cUiwkI18KK00pQjRLX1I8RypPXEgqMktfVixLK19fW09cL18mTSsjXy9DUSVfUjBILC9cOCVBL18mITw2X1E0MyU/XDUKK00kUTtfSElWP19aXkdKT1w5JSFDXyVBODlfUjRKKk9cVS1TN19NOyJLX11TLVIvX0BUPSdfQ1g6Jl9WSUUKK005P109NyVPXzI0XStfUkxWLV9cTi5DX18rQzhaX1JIUyxfXEotQzdfKUMoUV9SKE4rP1xGLDMrXyhCVE4KK01fUihNK09cQytCX18lQVhAX1FMQyk/XD0pMj9fKCJASl9SXFEqL1xEMCVPXyMhPE9fUiQ9J19cQC5XJ18KK00pIlUrX1FIOSdfXEMnQitfJ1FMOV9TRFcsL10qMiQjXzMkPSdfUTQ5K09cPCs1J18nMz1DX1JFIDpPXD8KK00qNDNfNkUxOF9SQEUqX1w/KCI/XydBSDxfUjBCKS9cSClCL19ZTVM4X15fPFcvXSMwVDtfOlY5Sl9dQykKK01SP15fTEpXX01aVklfXDJeTy9dMTNEV19UXEskX1tWU0tfXkhJOjNfUkw2X19bJkVIP18kTywjXysyVFAKK01fWz5PSz9fPlQsV18sUkBHX1omPEVPXTQ1JE9fOkZJP19cIlZLL1xWLlJfX0c6KjZfVCRfLi9eW05LL18KK00wM1xYX1paSUhfXTQ1JE9fLlNYUl9VOTkzP10yNTRHXzNEVSJfXT8nT09fVFU8X19aTF8oX106X05PXkkKK01FWS9fMiNcX19RLDAlT1w1JEFDXyYxMDhfUTwzJT9cUCsyU18lQSwyX1FUOSZfXEcoUjdfJiEwNl9RUDkKK00mL1xNKiJDXzNERStfWU41Rj9cLyJTX19JWissX1s6U09fXk5IXUNfJSEkXF9SID4vX1xJKUQvXzhGLU4KK01fU0hbLy9cRilCR18pIixKX1JQTCtfXzJSTENfX18rTV9YMVI6L1w2JSE/XyUhODtfVVk9NU9dKTFUM18KK00nIUA6X1FQNyZfXEIlMTNfJzEkLF9RTDYlT1w0JSE/XyRRQDhfUkRNKl9eS0lKO19XXSMrX1sqS0pfXFAKK00tIztfKkMoVF9STFguP1xKLUMvXytTUF1fUkhWLl9cSyxTP18qMyhSX1JEVS0vXEQsIl9fKSMgT19SSFIKK00tL1xKLEMzXygiQEpfUUBDKS9cOihCM18oIjhIX1JATiwvXEYrIltfKyJQQ19RUFs3P1wnJFJbXycxNDgKK01fUVRXPC9cRyxVK18pUjRIX1FYOSdfXEQnUi9fJ1FQO19SMEMoT1xIKUJHXyhRUENfUVQ7KS9cQyhSU18KK00oUiA/X1FQPSovXEgoUj9fKUI0S19SUEgsL1xTKyMvXytCRE1fUzxVLi9fNVMsU19aLTszX1haL0QvXjkKK01FKUNfVSw3JV9cPlhMX15OSSojX1FLWlxfVVk5Nj9fLFBLW19EKEooX1Q9KDI/XydRPCNfLEJISF9cUyQKK01SL1xEKSI/X04rIkxfXUMqUV9fLlA8I19BJ1VXX1IoRCZfXypRS1tfMiNQVV9aUkxIX15MSyovXywiXEgKK01fWk5MST9cVy5TL19EKSopX1NcXy0vXSQxM0NfPDclRF9WOUc2T14xQlgvX1YsNl9fXVsiT19eSUQ4W18KK00pUUA4X1JEPSgvXDIjMF9fJDBcLF9STEsnL1xSLTFfXywzMD1fUlxTJz9cTiwiV18sQyxUX1MkUixfXFEKK00sQy9fKkJESF9RNDMlP1w4JUFDXzNEUS9fUTQ4Ll9eQUcrO185RiU8X1o+Qk5PXDwmU19fKFIoX19VTTsKK007T1xTLiMrXy4zVFVfUiA/KT9cSyojM185NjFKX1xDIlAvX1RaTzNfNVQ5Jl9SNEEqP1w7JzI3XycxUDsKK01fUUQ3Jk9cOyYhW18mUTxAX1FQOCg/XDslUV9fJjE4PF9RRDcmT1xAJ0InXyZRSDlfUUg4JT9cUioiT18KK01WTFsqX1RFMjRPXFUvNCdfLTNUX19TJFwvP1xPLVNHXypDKFRfUjxPLD9cPylSR18mUixFX1FEQShfXDkKK00oMi9fKCIwRl9RUD4oP1w3JzFfXyYyJENfUUhFKU9cPioyS18oMlBNX1IkTCs/XE4tMkdfLVRFRV9RJDkKK00qP1w6JjFDXyhCUS5fUkxUMT9cQChCI18nQUhDX1FcQSlPXEIpMjtfKFI4R19SQE0rP1xQLTMvXyxDNFYKK01fUzBTLj9cXC4kJ18vQzhZX1VBMzNPXiY/R0tfTSpCS19cJlxPT15GRlkzXzFUMSpfXjM9Vz9fUlZdO18KK00+NzFUX11LMlU/XzlSLENfVCtOWV9YKVo9T18kTitHXylCJENfXCshUC9dMDNFJ18tIzhbX1teXU9fXT8KK003NV9fTysmWF9STEcqP15bTEpTX1dMWytfViU5NV9cVi0yW19SPDZdX1Y9RjdfXF8uQzNfUFtKVF9TRFcKK00sL15OSElXXzsmOT5fU0haK19dVD0mP186Nj04X1ghWzo/XVc7VU9fPSchQV9SWEkpL1xAJlFPXyRQWDIKK01fUSQwJU9cMyUhN18mITQ7X1FAMiVPXDckQFNfLVMkQV9TTFcoP1xULSInXy1DMExfUTw2JT9cRChCM18KK00pIihEX1IkPyg/XDclMUNfJEEgM19RLDMlT1w/KDIzXyFASFBfUzxOOF9eVEhdR18xM0FLX1UlLDkvXDwKK00mMjdfL0QlJl9RTEAnT1xNLDJfX0c5VkZfV01ZQj9cSipTK19RK15aX18jRltfXSIrQjtfLVJMRF9TMEsKK00pP1xcKzI/XzEzOFBfU0BLKC9dJC4iR18zQ1RQX1U1Ii1PXTkyI0NfOlVNKF9XOTwzT14jOVRTX0BWWTEKK01fWDVcPT9fQVNcU19STDsoX1M8WS9PXEMqMk9fKFJMTV9SUFItL1xHKzJfXykyTE1fUihIKk9cOigiK18KK00oUkRLX1BcNSVfXEMpMkNfI1EkNF9RTEEoX1w5KDIvXyZSLEVfUVxHKj9cQipCU18pMlRPX1JEXStPXUgKK007V09fKVIsU19RVEYrP1xAKjQnXykzLSpfUThBLE9cXS4jW18wU1xdX1chTDpPXkZHSVNfUltaXV9dNyoKK01SP19GVV0nX1s9Py9fXlszVE9fTVYtO19aPTssX11HKU9fXEcpIi9fKiJMUF9aIjdEL104NFU3X1ktTzsKK01fXlM0VD9dWj03N19UPEcsX11DJ1FfXzlRTDtfKFIgP19bXlpPL10uM0UnX0BYJVxfWUo2RS9eO0Y5T18KK01SXD8lX1c5Vzw/XyFOK0NfKkI4SF9bSlFKX19AVCxXX0wqQkZfXCcgTj9dSDklU18vIzxRX1pKSEg/XTMKK00zRENfLUMwTV9cIltNP1xSK0I7X1A7WlNfV0lXOl9dWz42S18/V0VJX1dRVjlPXFwuQy9fLSNEVV9QXDUKK00kP1xAKSIrXyZRUD1fUihAKE9cSClCQ18pUjhFX1JARig/XFctMyNfJzFINV9SMEAnT10qMVQ7XyRBIDMKK01fUSgwJF9cNyUxQ18kQSAzX1E4NCVfXDUkUTtfJDEkNF9RQDonP1xdMENbXyhSPFZfVVE+PF9ePUQ4U18KK007Ji09X1RJJTE/XjFFKTdfLFNQXF9UOSsyP14xRDlLXydBUExfUkBJLC9eMENYQ19fXl9CX1tSMjpPXlkKK01DVidfSzhFPF9aWiM1P15XQlVfX00oRTlfWzIrNV9eV0JVR19PKFk7X1s+KjUvXldCVS9fTzhFN19aRiAKK001T14xPjVbX1YsSltfXjMxUl9cTCsyW18kUTQ6X1EoNiYvXDYmQVNfJFE0OF9SQEorP1wwJEE3XylSREwKK01fUUQ7J09cRioiT18lITg5X1I0RypPXDEkUTtfJlIkQ19RSEIpL1w/KTI/XygyPElfUixJKl9cSStTJ18KK00rI0xaX1IgQio/XEArRD9fLkRFTF9SRFk5P10zN1gzX1NMQzZfXV8tUj9fSVQsT19cLTMxX183OVVPX1UKK01WPTtfXE07OV9fMzZVL19LVSxfX1hdTz9fWFYvR09fL1FcT18zQ1BYX1MoUS1fXDcoQkdfR0lCLl9XNUsKK005X19FVj1TX1wtQzVfV1VYPi9fKlBMN19WPEMoX11bKlFPXipBN19fU1w/I19XPVU8T18qUUtbXz9HPVEKK01fWFoqQi9fKE9bQ187Vl1GX1teV0xfXEMoIV9fTlsmTV9dWy5SX11fPVc3XzNUWSdfU0hWK09fIU5LM18KK00/N01UX1MkUCo/XlNLSkNfMzRRJV9XQVY7T14hPjZfXz1XKUZfV1laOl9dWz0mO187Jjk8X1FcPSdfXTAKK00zJEtfNFRNJ19SJDsmP1xAJlFPXytCRE1fU1BcLj9dMDRUV18tIzxYX1FcQyg/XDsnMitfJEBYNl9RUDgKK00mT1w7JjFTXyYxODxfUUg3Jz9cNiRRR18mITg5X1FANiY/XDYlQUdfJiFIPV9VISQ2P10lL0RDXzglWTkKK01fW0ZHTD9cTihSQ19HSU46X1leQEg/XEMpQj9fKiJQSl9YRilET1xHKTM3XylSQE9fUzBYLU9fX1wuL18KK01TKVVNX1xKOjlfXytHJjdfUFkxOl9cOjQ2X18iRCU/X1A4XThfXCIzNV9fIENVU19QOFE2X1taMDRfXkkKK00/NE9fMUJcOF9WJUM4P18sUTw3X1c9Jy1fUVhHKV9cMCUxS18nMVxEX1FQQChPXDgmQVdfKVJETF9RMDgKK00mT1xHKlJXXyYxVD9fUkRLK09cNSVRS18qIkhPX1EoNCY/XD0oIjdfJ0IoRF9SLEgqL1xMLDMnXyxDQFoKK01fUkxQLT9cXTBUT19IOipNX1JAXTZPXT05SF9fVjxTP19fIzlWT19VVTxPX1wtRzpfXyM6Vi9fUVY9O18KK01bTVM4X15fQFZfX01YPUNfWF1DN19VVUVBP1xeNDk/Xys0UVxfW1cjVF9dMDEkP18zRFE1X1FUSCtfXj8KK01GOF9fP0c1T19eNzlXL19MVF0rXzREXS5fVChdL19fOFI8R19ZTScsX1lKL0EvXytQOz9fKkJAQV9bXlkKK01LX14uQTdbXz1XKUxfXDpeTS9dPjdFJ19AJ0lSX1IoQCZfXlFKSjNfWCxbK19YMVk+L15ISFlXX007JkkKK01fUyhQKi9cVi0yW19PO1JVX1oyP0ZPXEMpIVdfRjk2LV9XJUU3L11VO0YrXzpWOTpfV0VUOi9cQCcxQ18KK00nMVxCX1FENyUvXF4vMztfLCMsTV9UVTMzX11HOTY/XzhGKT9fVDkrMT9cSStCW18oQkRJX1JITSxPXDgKK00lUVtfJlFEO19ZSjJFP15ARilPX0hZTj5fWlpGSj9eU0pKS19OWypSX1tSVU0/XyRPW19fUSxaXV9VTUAKK002T104NjYjX0pbLk9fUkxNLC9eNkRJS18sMlBQX1M4Ui0vXVc9Nz9fQjhGNF9SMEIsT1w9J0I3XyszLFUKK01fX19UW09fNEZWJ19TKVlRX1taJTBfXyJEVVdfT1khNl9cMjU2X18gRDU/X09ZJTdfW14sNV9fIUQ1K18KK01ERlElX1JUOyM/XTw0VS9fOCYhN19dKydQL189U0xfXypTJFNfUlRSLi9cXjAkN18pMkRLX1I4SCpfXE0KK00sUzdfKEJITF9SMEwrT1w2JyFbXysjIFJfUTA2Jj9cSSpTI18lISw5X1MwUy4/XEEnUitfJiFYQF9SLEsKK00rP1xGK0MrXypTIFZfU0BULU9fNFI8W19YLF83X15HN1UvX01WPSdfXD1LNV9fJzlVT19TVk1HX14tUzkKK01fXy83VF9fQVI8O19eLi8/X1ouOUU/XFYsVCNfKTUyLl9RWFNAP1xLNFhLX1A8Ky1fVT0wNV9cRyYiL18KK009J0FaX1leN0M/XidAR1dfVz0vNl9dWylTT1w5JzFfX0Y5PjlfXFsgUD9fOFFcP185RUU0X1xfKVA/XEgKK00pUjtfMTQoXV9YKVs9P1xeLyM3XzZVSTNfVCRcLV9cMyQwU18jIEgnX1pKQkgvXy5QXCtfUStSWF9VIS4KK00xX10gMSNPXzZFMSxfWzpKST9dKjBTV18rIlRGX1s+UEkvXiI+JktfRThOIF9ZMik/T11BNjRfXytSVEoKK01fU0BbMC9dQThWO184RjU/X1UtNDM/XFIsMktfMyRJI19SWEwqP1xSLSMrXyhSSEpfUUQ9J19cOycyI18KK00lUUQ8X1FcQSkvXE0rUytfRVhWKV9aJjRDX15DRUknX0ZYWilfWTYsQU9eMUIoK19DKC1dX1hSIz8/XiQKK00/Nz9fKkI4SF9WJUE6T15WTEtPXyxCWFZfWForRD9cNiUhP18kIFgwX1g1X0BfXVo9OCdfKkJEWl9SREkKK00sT10sNDU7X19fJ0tfXDYsNE9fIERGN19TWTk0X1wqMzc/XylGNitfUilBQV9cNjU3T18qRVU7X1IpRUkKK01fViElKC9cRiZBN18oQVBAX1IkPyovXS8zVFNfU1wuXF9ePzZVT1xPLFM3XyVRREBfUVQ8KE9cQylSR18KK00mUVRAX1IsSSpfXFAuI0tfKiJcT19RQD0nP1xLK0JfXyYhRDpfU0xcLU9dJjI0L18qMyBQX1FEQylfXDwKK00oUl9fKFI4UV9TOFMuP18xUixDX1otOzJfXlc6VS9fVlddS19eLV86X18rPFUvX1NXLT9fXV1POF9fOzcKK01VX19MVS0nX1FLJk9fUjQ5Jy9cTyozJ185RkFPX1EgNCo/XEE1WSdfKSNOKF9SLSxCL15dTzxTXzdVQT8KK01fVkE3OV9cPyhCP19ISUowX1kiK0FPXz1UXTtfVjxHLV9TSSEwP18lUEwnX1dMTytfXEZdT09cWi1TO18KK00nIVQ+X1FYOyg/XEcoQjtfKSIgQl9RUDonL1w5JkFPXyghVENfUUA4Jl9cNyUxQ188Nj1KX1hOI0FPXj4KK01GOUdfPSchTl9aTkhIX18uTytDXytCQEBfUlxSKT9fJ086W19HWF1cX1lOLj8/XjFCKCdfNzVRO19UWTEKK001T1xZMDRPXy0zXSpfU0ReMS9cSSwyW18rUzxTX1NZIy9fXFwvQ09fKFIoQV9SWFMsX1xHK1MnXyoyWFMKK01fUVRBKF9cQSlSR18nUjxJX1JMWC4/XUI5Jj9fPEchU19WVUs7T11IOUZHXzgmMUZfVUE+OC9dNDZFU18KK000JTk4X1UlMjRfXS8zRTdfOUY5VV9aXklNX11YPSdXX0IoNitfWDokQV9eSUlaR19CSDIoX1ddWkFPXEUKK00pIzdfLiNBIV9WUU48P19fXS5bX1VZWURfXFpAPF9fNkc1T19TOVVKX1xKOTkvXyxGVjtfUzlRR19bOi8KK003T11AL1NfXycxIENfUVxBJ19dNjQkQ186RjFIX1NdIC4/XzNRXCNfWV0vNV9TQFovP1w9JyIvXyYxODwKK01fUlRRLF9cVi4jT18pUlRPX1JEUSxfXE0sQytfJSFANl9TNFctP10lMSQvXytCXFBfUTA0JV9cOycyI18KK00qQlBPX1UtLjUvXy9RLEdfWl1DOF9fMz1WL19XVy03X11dVzJfXzs8VF9fWVc9S19cLT8yX15fOFRfX0oKK01VPSdfSUkyMV9XRVE9L1xTK0MzXysyXFdfVllUP09dTTtXK18nQiBPX1FBLEE/XEEvKEdfKSRSKl9bWl8KK01ST11cPVc/XyhRLEFfUSAzJi9eOkRIQ19BWCldX10jJlI/Xz9SPE9fRllWO19cRyVQX180USwnX1Y8SyUKK01fU0xTLU9cNSVRW18mIUA7X1I0QylPXD4nQidfKDIsRl9SRE0rX1xIKkMnXzNFJTZfUTQ2JV9eMUI4P18KK01UXCMgX10iXU8/XkRGKTNfMyQsXV9ULSQvP10zNVRbX0JIMVxfWVIrQT9dSThWJ182RUk9X1NRJDNPXFcKK00xJTdfLVQ9O19TJSI2P1xaMjVTXyxTUSNfUkhQLE9cQSlSR18tQ0hcX1E4OCZfXEcpUktfLENAWl9TLF8KK00wX1xLLENDXytDSF5fUlBXLi9cOSgyL18qIlBOX11LMlU/XztUTStfWD1DOF9dWzVVP19IVj1LX1ldNzcKK01fXkM2Vi9fR1U9P19dLi9DX10zKVNPXVg8V19fTCpWWV9XSVY/T14gPzgvX0xbJlRfWlZLSz9eIj8oI18KK01BJ14rX1I8Ri1fXEUpMltfOyZJTF9fX1JaP18/SiZbX1EpRU1fXVZGOU9fJ0ZWR19TSUlIX1wuMDZfXl8KK01ERkdfMCFcV19TJEIwP1wtJSEzXycxTD1fWUYpQC9eLUA3U18zRE0gX107KVEvX1FWXVNfLSM8WF9SID8KK00pP1w6JVFXXysjIFJfUSw1Jk9cQSkyP18nIixDX1MgVSw/XSQyNC9fLEMoT19RSDglP1xIKVJbXyZRPD8KK01fVllFOy9fPVNNK19dLVs8X19HP1cvX1hXLUNfX14jPF9fQzxWL19YV003X11dXzZfXyc4Vj9fUVVdM18KK007RUk2X1MkSChPXE0pUV9fKyJASl9SVEQnT1xKKDFLXy0zIEtfUkBCJk9cPCcyQ18nNFIiX1JBJkQvXEYKK00zOENfTzwrKF9ZOjRDP1xEJjIjXyYhSD9fWF4pP19eJ0EnX19SXCsiX11XJFE/XlxNOzdfUiwrIF9dJyQKK01PX185UStfXzY0UStfUkBMK09cQilSP18nUihDX1E8OiZfXD8pIjNfK1M4Vl9RLDgnP1wzJjFPXyUxRDcKK01fUzxSKy9fLlA7U19QO0ZVX1NEWyxPXVtBJz9fQ1hWKF9SWEAnP1w8JSErXyMxUDxfUl0gM09cVTE1N18KK00tVE1BX1MpJzhfXE4wVV9fLDQ5Pl9TJSI2P1xULyQ7XyVBQDtfUTA2Jz9cWi1TV18mMTg8X1E8OSdPXE8KK00tU09fJzJETV9SJEosP1xDLDMzXyhTIFFfUyBSLT9cSykyR19ZXS8vX18rO1VPX09WTTdfXV4rPV9fP0IKK01XT19aWT4nX10+IztfXz9CVz9fXVhNT19TW0ZaX1ZBQjpPXklKWyNfRDhWNV9XWVtAP15YTTtPX0laNkgKK01fVlVHOl9dWj1YL18oUjBVX1JASSwvXEkpUkdfX183S19dRkU7L18tSUdTX1ZKMUFfXEpBOC9fJUU1W18KK01POTFDX1FcLSAvXEAmI0tfLCJJJl9SSEksL1xcLyNHXzNUSSVfU0RUK09cXS0zJ19VLDMhX15XOVU/XFYKK00uU0dfKFJATV9SMEQpX1xNLEMrXyVBSDhfUyRTLD9cXy9DV18rMyhSX1IoRiovXEcqMlNfJzFAPl9WUUYKK005L18kTVsrX1tNOzNfXyc3VS9fVlc9Q19cXVs5X18nPlYvX1hXXUtfW01PM19fRzxWL19CVF0vXzRESS4KK01fUVQ7KS9cTC1UQ18nIihMX1ZNQjZfXEArJEdfKjIwRF9SPEkpT1xTLzUrXylSPFRfUUBNMU9cXTopU18KK00sVUI5X1JVK0BfXyRRTTdfR0laO19RVDUmL1w5JVFLX0BINVlfWD4lQE9fKU9bT19VTEMlX1tST00vXUoKK004Ji9fVDw3IV9cUl1OL11NOVY3XylCQEtfUihHKz9cVi4zW18pQkhMX1RJLjQvXFsvVCdfMVRRLF9TTF4KK00vX1xAKDIrXydRVD9fXTsqUz9fJk8rX18mQTg4X1FYOicvXFEtQ09fKkIwSF9ROD4oT1xOL1RXXywzXTgKK01fU0UjMz9cXTQmK18sJDFAX1I4UzFPXDElUV9fLkQ9OF9SWFkxL1w9JkFHXypTIFxfUlBMK19dQTg2M18KK00rIzBeX1M9ITE/XEArIk9fKyM0W19SMFEtT1xLLVNPXylCUE5fUlRLKz9fR1YtL19bXUs1X18rPVY/X1UKK01XXVdfXi4nQl9fO0BXT19WWD1XX14uJzxfX19HWC9fRlU9N188RyVYX1pWT00vXjlFKUtfPDZRUl9bIksKK01MP15ISFpHX0BHVV9fVUk8OS9cPylDM18sIyRYX1hOLEM/X11cLk9fWDpNUV9cWkM8X189SFVbX1ZKPUsKK01fWlYlOl9cSCZRO18mISw3X1EgKSU/XDgkUUdfLUMsTl9TRFQrX1xRKjI/XyZRPDVfUyBLKU9fK087S18KK01bPU84X1NEXi9PXDwoMj9fKCFcRV9TJFcrX10nMlQrXyxTME5fUVA5Ji9cSSkyP18pUiBAX1hVXz8vXzgKK01QW1tfW01DL19fPz1VL19bV10/X1xdVzRfX0M+VT9fVFdNN19cTis4X183QlYvX0FTXE9fViw3K19TUSQKK001L1xNMDU3Xy5UNTpfUj0hOy9cNygiW19HWS4kX1IgUTU/XTs3NjNfJVFYRF9RTFM2T1xDLCRHXyRCUS0KK01fUj02Qz9cTDY5R18sNFYmX1taXlM/Xk5MKldfMCNAW19RRDQmL14hQSdDX0AnWVtfXDpcTi9fNVFMJ18KK01OSlpRX1glWT8/XyZPO1dfUjtWXl9UMSAwT1wvJTE/XyYhSEFfUixHKj9cMyVRR18lIUA6X1FAPCdPXDEKK00lITdfJ0FcQF9TJE8sP1xZLTM/Xy1DJFdfU0BZMC9cVy40I18nIUxCX1I4TytfXEIoMj9fJzJIV19SVF4KK001T1xRL0UnXykySE9fUVhILV9dJTNWM19FSTY7X1paSUkvXVc/SEtfLCNJKF9bKk1LP1xZL1RHXzA0KSMKK01fXSctU19cUC0jU18tM1UhX1FMRCkvXEwsU0dfKCJUUl9TJF0wP1w4J0IjXyUxODdfXV8wUl9fUlc9Q18KK01dPU84X19HPFZfX1dWXVdfXU1XPl9fIzlWT19PVk1DX1tdRzdfWUouRD9eJEFIV19KKk5QX1oiO0dfXUYKK004NjdfSyo+S19aOkFJP11TO0cjXyQxKD1fUiBGLU9cTitDP19IOVY/X19TUFpfXz1JVldfUkohUl9cOjcKK003P15ORCdLXy4yKFNfUVg3LT9cSykkK18qIiRTX1FQNyc/XD8mQUtfKCFEOV9RSDMmT1w9JiFTXyoyNEMKK01fXFsiTz9fU1ctP18vU1RaX1NEVy4/XUE2RUtfLUNAVV9RUDwmP1xHKTIrXytSSEpfWUIsQT9eRkVIV18KK01UW1ZUX15fM1JfX0VTXDtfXC1DL19eVzFSP19MVUxXX1xNOzNfXispUi9eUkgpV19OKjpDX1Q4Wi1PXzYKK01TTUNfLSQ9OV9TMS43L1xbL0RHXy4lOiJfUVw/KE9eUUZHV18pM01CX1QtJTMvXFovU19fJyMlNF9ROEAKK00tL1xALERbXyVTQU1fUj0sQz9cTDAnS19OW0cpX1gqKkFPXEQoIitfJiEsN19XPVo7T11WPScnX006TkcKK01fXT8nT09eXkw7I184JU0/X1UpLTNfXlBKSltfQihKL19SJEYqX1w8J1IzXyYxVD9fUlRRLF9cUi1DQ18KK00pUkxNX1I0RilfXD4nIVtfJ1FMPV9ZRjRFT1xYLVNXXzFETTFfUlxULk9cNyRRT18oIjBCX1IkPikvXEEKK00rQ09fLCQhMF9TRFswX15JSEorX0gqKlFfVFU3OU9dWz5XW19ZTiM+X1kqOUlfXFYvVFdfUFtCV19TQF0KK00wX1xZL0NTX1MsQyZfUzxZMD9cWi9UM18mQiRBX1MgVS5fXDMmQiNfJ0IsSF9SUEorP1xJKDIzX1ldLy8KK01fXlc4VF9fS1Y9N19cTjNBX19LRFcvX1ZXPTtfXD1TN19dWyxSL19JVV1HXzI0LStfV1IlQy9eOEZaI18KK01JOi5FX1RJJjIvXkRIKitfSElaQF9XRVM9X1xHKVMzXyhSQFpfUlBMLV9eTUk6Q19fXytJX11GQzpPXyAKK01FVldfPzVQWF9RVDslT1wxI0FPXyUhJD5fUUQxKT9cVCtEK18kIFQ5X1E4NCVfXDgkUUdfJSBUNV9RKC8KK00lP1xLKiI/X1E7TldfXyM2Uz9eS0hJT186VjVDX1IsOSU/XEUoIjNfJjEwOl9RLC4kL1w8JVE/XyRAVC0KK01fUig9J19cPyYhX18oUVBEX1JIPydPXFQpIidfLiIsQV9SWDwmP1xHJjFLXyhBVD9fUVRCKC9dVT43P18KK00wVDUjX107MVRfXTo6V09fJkI4Sl9RODkpL1xGM0g7XyZBXEtfVylCNE9cPS0lW188Vy1cX1U5NTNPXEIKK00sJD9fNyYpTF9SRFAxT1wrJ1RTXyhDUVtfUkBaPS9eWE08P183Ni0/X1M8WC4/XDQkQTdfPSc5TV9VKTAKK00zP11HN1VPX1Q8KlxfW0pPS09dKjIkS19CKDYkX1hCI0FfXSozJSdfKyMkVl9SVFAtP1xFKjJPXyoyTE4KK01fUiRDKU9cMyVBP18mUVQ7X1FcPSdfXD8mUVdfQlgyJF9TLFMtT1xRLSNHXypSXFFfUUAzJV9cNCRAX18KK00oIUw/X1FQRiwvXEArIy9fTzs+W19eQztWT11cPzhbXy8kUTZfVyVYP09fP1ZNW18tU1UtX1M4XTJfXycKK01OWz9fMDQ5LF9TRF8uX184VE0jXyxDLFpfUyhVLk9cSytTJ18qUlRUX1JISixfXDsnMitfTysyWF9YMVgKK00+X19DU0xHX0Q3VVVfU1hVK19dJjEjX19cTic0X1leJz4vXkxGSFNfQFc9Tl9dXzBVL10hMCQ/Xzc2OU0KK01fVCEjMi9eO0Y5T18mMTQ3X1lKNkYvXkdIWjdfPCZNT19SKEIsP1xFKiNLXytSXFhfWlpGSk9fX1tNO18KK01RWU1TX1NYPiEvXDwlMTdfJjEwOF9RNDAlL1w3JEE7XyVBJDVfUSwxJS9cNiUhP18lMSw2X1E0MyVPXDQKK00kQTNfJSEsOV9RRDQmL15eTEpbX1otNy1fVkk9Ni9cRSchU18yRCBcX1RJJTE/XDklMT9fJUEoNF9RSDYKK00mL10xMlRfXy0yXFNfUjhAKS9cWSxTP18lQSQ1X1E8MiVPXDklIUNfJkE0OV9RTDknL1w1JjFPXy5EMSEKK01fVSU2NC9cUi1UL19bLU8uX1M1IzYvXEcoUidfJCE4Rl9TMTpDP1w7JlJLXzRUIFhfUVRJMU9cOSciW18KK00mQUg9X1E0PSw/XDspMyNfJzIgWV9RIDwuP1xDLVYzXygjVVdfWlZRUU9eMkM4X18rMlxUX1E4OSZPXVAKK008Rl9fLSM0T19UQSYvX18rTltDX0taNkhfUkRLKj9dIC5TN19OWy5PX1hGJEEvXV0/R19fKjJUT19RTD8KK00oP1w+JlInXylSKERfVEEjLz9cOSZBM18kMSQ0X1JERypPXiY/R1NfK1JUUF9RLDYmX1wwJFEzXypCWEwKK01fVj1GOT9cUCwzK18nMiBFX1NEXjEvXFUsUztfKzJQS19UISM1P1xRMDRLX0BJIi9fXVc5Vl9cUC0kR18KK00tRCEvX1teV0xfXFUuRCNfLyQkX19cVylRX1xPLDNDXy1DPF5fU1heMV9cRypDN18pMjRSX1FEQiovXicKK01ASDNfTTpaVV9dWzNSL14mPDY3XzRVKSdfUlRMKT9fP1QsT19DR0VNX1pGOEIvXUg5JVNfVEwrJl9TXSEKK00yL1xWLkQrXzBUKShfWUI2Ri9cQidCI19FOSYzX1k+M0U/XUo6Jk9fKTI0UF9SJEMsT1xULSM/X0s6Qk4KK01fX19NWC9cTCdQW18nUVBCX1FUOigvXEEnQVdfJ0FEPV9RRDQmL1w5JSFDXyVBMDdfUiA+KD9cTyszI18KK00tUzRYX1NEWzAvXF8wJD9fNUUlN19cOllNL19OVl0vX0JHUVlfVDRWLk9cSSVRR18lQFwvX1EsLyQ/XDgKK00lITtfNyVBOl9WTUU6P109NVVPXzIkKSZfVU01Nj9dNTQlM18lMSA0X1FYOSc/XDIjMSdfQzg+JV9aVkUKK01IX15dTisvX04rIkxfWjZESl9fIkw6M180RilcX1IsQCdfXDMmMi9fMUVOK19RRDsoX10+NFRDXyRRQFEKK01fUUg8Kl9cMiRBN18lQVRLX1JIUy5PXDUlUlNfI0E0SV9RIDsvP1xDMDdHX0haRl9fWEoiQU9cSSgyT18KK00lMSw2X1Y5RTkvXEIoQV9fLFMwTl9YWiU/X15CRylLXyVRNDdfUkhHKE9eKEAnU19DKDYlX1FcOicvXDkKK00lUUtfJUEwNl9RMDQlX1w4JTEzXywyOD9fVjU9Nj9dODRVP18tIyhVX1hCID9PXTU0NF9fQCgpX19YOigKK01BP1xXLyNDXyYhTEBfVi1DOU9dTjo2R19MKlJOX1tWWk4/XVc9VltfLlNZI19TQSMxL11cQig3X1ctQzoKK01fU0RdNE9cUS5US19PSzpSX1MsWC9PXF4wVCdfU1xPKV9TKFQuX10iMFRLXy1TPSBfUlRQLl9cRSojL18KK00oUlRRX1tSU0xfXlZKWyNfWC0vJl9YQU44L10yMjNPXzhFQS1fXyc8VV9eLz5GW19HKF1eX1ZFQzZfXzQKK01RLENfLiNJIV9TQFwxL1xeLzQvX0QoWjBfUiA8J09dPjZFU18tIyBSX1ZVSztPXEYpQydfKDIsUl9TLFMKK00tT15PSksjX14tP0hfUUA6Ji9cNiRBT18mIFg3X1EwMiUvXDUkITNfJFBYMl9RQDMlX1xZLVNLXy9TVSAKK01fVEkoMl9dJTBUO18wJCkpX1QtJTM/XScwRENfVCteWV9eVzdTX14kPTc7XyghQDxfUVA3Jj9cNyRRN18KK00mITA2X1JcSys/XSwyJEtfNlU1OV9UUSYyT1w0I0ErXyhRVEFfUyRMLC9dIC5TX18mQTQ5X1EwLyRfXloKK01LWkNfUTsmSV9aIilBL14gOyZDXzpWLUZfW0JGRi9cUzFGM18mIUQ6X1EoNycvXEMpRSNfJTFAPV9VUTgKK00yP1w6JiJPXycxVEhfUUg4Jk9cNiYiI18oUlBSX1E4Nik/XDQlQVtfJiFQUV9SKFo6X140RVpDX0kpTjsKK01fVCxeME9cPCVBS18wM1EgX1FIOCZPXDsnMUtfMkRBIF9aJj5GP1w6JUFDXysiTEpfVCEgLz9cUitSW18KK00kUFwxX1FINSY/XD4mUUtfKiJQSl9WRUk5T11CNERHX01aSkVfXCpaT09cRSgiM185VV09X1leN0RfX0IKK01XTVNfPDctUV9UTS80P1xWLiNXXzdVSTVfVik2ND9dLzM1I182JSk2X1RVLTBPXSsyREdfJjFQPV9XNV4KK00/T189Vj1PXy8kITVfUkhUMF9eX01bL18xJEUvX1NAXS5fXy9SXEdfKjJMUl9TVF4xP10gMCRHXypSWFkKK01fUjhMLS9cOSkiN19QOzpVX1wqUk1PX0NVLFtfPTVVNF9VISYuX107NDQvX1pdMy9fV11MOC9eK0BHJ18KK005RiE4X10zIlFPXSEwVEtfLkNZJl9UNSQyT11ePydbXyhRXEFfUVw7Jz9cQidCI186Nj1KX1FAOChfXDUKK00lUjtfMyRRL19bKk1MP19ZVi8/XyVBJDVfUiQxJT9cPSNRQ18lISg1X1E0MCUvXDgkUT9fJVEoOF9QWCkKK00jP1xVLCMzXzFEMSdfVSEtNF9dJjFVK181RUVEX1RRJzM/XyZNOl9fWV0rLl9YUV8/T1w7JjFPXyUxQDkKK01fUTQzJT9cOCUhO18mQTg4X1E4MiUvXDEiUF9fI0BALF9SIDonT1w7JTFHXyUgXDNfUiA7J19cNCNRL18KK00nQUQ9X1NcXixfXl1NKjtfUCsqSV9bUlZLT18nT1tPX0pJTi5fVEE7Pj9dMzQlO18mQVw/X1JMRjJPXDwKK00nQidfNiU5J19RWDgpT1w/JzI7XyYxPDpfUTA0Jz9cRSsjK18kUThCX1BQLSUvXDomQj9fIyFJIV9UOSYKK000P18gTjsvXylCQEZfUVg5Jz9cNiQxN18lQTg5X1EoNSVPXEUpQV9fNUUtLl9SLD8oP1xBKFInXykiREUKK01fU10kME9cPyhSJ180VSUzX1ZZTDo/XipCOENfJzFcPV9YTVg7T18oTSsjX1VMPytfUiw9KD9dOjUlK18KK01QW1ZbX14rOlc/XiE/SDNfKiJIUV9SIDsoP11ROTYnXz9HLUxfU0hcMD9cNyRBQ182JTkuX1MwUSwvXFoKK00uI09fOzclU19dRzZVP1xaL1UnXywzTSlfXCpaTU9dIDE0T18uM1hcX1xDI1BfXEcqUldfL0QhI19UOScKK00zT1xIKlM7XyxDOF5fUTxCKF9fI047N19RSzJWX10/LlIvXTIwU1dfMENYVl9VISgvT19MVS0nXzwmJTQKK01fVzlSNz9dQTZVL19VPC8nX1Q1KDM/XFkvNDdfLUMsWV9WXU08L1xFKDIvXydBSDxfUiA8J09dVTxXO18KK01AJ14sX1JQTS9PXFEsU0NfTCpOT19eVztaP1xCJiIrXyNRIDdfUSAyJV9cOiUxP18mMTA2X1E0MCRPXDkKK00lITtfKCFIOF9TKE4rL10qMTRHXy5TPF9fVE0oNS9dKTI1O18uMzReX1tGTEpfXUs3NVtfMlQsX19WXUoKK005L10/NlVHXyVRKDZfVDUgMS9eQ0dKK18mMTA4X1I0PyhfXSkwVD9fQSdaIl9WXUk7P11HODY3XzlWJUUKK01fWCFaP09cPiYhU18rUkhEX1pGP0U/Xi9AN0NfOlYtOV9XJUA2T14yQzhDXzAlLUVfUiQ5KV9cOSYxU18KK00oUiRUX1IgQSovXUY4NU9fJUEoOl9RXD8qT1w2JUInXydBWElfUjxKLU9cTSwjU18lITBBX1EwMygvXDcKK00mMltfJ1IkSV9YPiRAX1w2JiFXXyYxQD5fUjxFKi9cUCtDJ18nMUw+X1FYPScvXE0rIk9fLSMsUl9UKSEKK00wL1xOKzJTXypSVEpfV0FdPV9eQEdJP19DSEImX14jNVZPXDsnIVdfOzVRL19dVyhQX19NVT1LXywyRE0KK01fVCRcLy9eVU1bN19YTUM7X1g6JEFfXFIuQ1tfJzFMRF9WSUQ6L11IOTYjXzQ1OTBfVkVHOE9dJDAzU18KK004VV09X1I0Qig/XilCOFNfWF1XO19TUSAzX1xcMUUzX01bKk1fVCUmMy9cXTAkJ19IKVpBX1MgWi1fXSAKK00xRCtfMjRBLl9TOFkxL1xJKkM3XyhCSExfXDJZTi9fJE07R19WPFcoX1RVJC8/XSEuUy9fNEQ9IF9eMzMKK01UX108NERDXzlWMTNfVT0qMT9fNVAsO18xJD0sX1gmJEI/XVY8Nz9fNiUpOl9VNTA1L1w9JkFHXycxQD4KK01fVl1KO09dUTs3V18qIkUiX1JQTi1PXUk7JldfWE1DQV9SQEMpX1w+KCFbXyxTJExfUzxTLD9dIS8zT18KK00zVEklX1U1MDJPXSYwM09fMDNYWV9UOSQwP1xcLkNTXypCRFBfUyhTL09cWC1DX18sQkxLX103KFFfXkgKK01HWUdfPUchSF9WRUQ3X1w9JiFLXyghTD9fUSgtJD9dUDpWX18nMTw7X1QkWy9fXDslMUdfNjUtN19RODAKK00lL1xFJ1IvXzo2LUdfUVQ3Jl9cPSdBQ185Ni08X1kiKUBfXjtGSS9fQzdNWF9aOjxGL1xfNCVbXyUxLEMKK01fUUQ7J09cQCdDJ18mMURCX1I0QygvXE0qUzNfKzJUWF9STEstT1xFKTMjXygiJExfUjhHLE9cNCUhX18KK00kUSA8X1FANyovXDwnMkNfNlVVQF9SLEIqL1xEKEFfXy1DLE5fVDkjL09dIi9TS18vQ1BZX1FYPiZfXF8KK00vU1NfMFQtIF9SMEIpL1w/KDFfXy9UMSBfVj1EN19fLVIsL19aTU9AX1I8RypPXF0tMk9fVVw7IF9fLzsKK01YL1xHJ1IvXy0iXE9fW0JVTS9fQVU9Q19FWT46X1RNNTY/XDYmIV9fKVJASV9WVUw5P10rM1Q/XzhGLTwKK01fUkhLKT9dPzkmI180NUU2X1hKLkQvX0FWXUdfL1QtMl9TUSY1L15aTTsjXzA0OSxfVCEjMS9fK1I8U18KK00uJCUhX1QlJjFPXSoyNSNfLDMwX19SQEosT1xEKyJbX1BbQldfW1pPTF9fL1FMO18wU1xdX1NMWS1PXS4KK00yJDtfVi0jM19UPScxL10wNFRXXzI0OSVfXS8iUk9dMTUlR19NS0ZeX1ZFRDpPXkRHSjtfKUIkRV9WSUcKK005T15BRyorXzw2UVBfVz1TQF9cTCs0O18rQyBYX1YlQDdfX0dWTUdfL0NAVl9TOFUtL1xZLVNHXy8zXScKK01fUVhBKy9cOyZCI18oUVxBX1MoSypfXFUsIytfLlM8WV9TTFouP1xTLFM7XysyVFZfUzxZMD9cSioiT18KK006RVU8X1VJLzIvXVY7RjNfQUddWV9RWDkmX1w4JFE/XycxQDxfUVQ4Jy9cOyUxR183JTk6X1FYOCcvXDoKK00lIUNfJ0FAPF9SPEEpP1xGKCIzXyhBUEBfUTQuI09ePkQ5I18sUjBEX1IwOSYvXEcmMUtfM0Q9IV9TQSMKK00zT1w6JFIzXyUhNDZfUTw0KV9cSSsjP18sMyxWX1IwRCtfXD0nMkNfKDIkTF9RUDwpX1w0JUFbXyQhIDkKK01fUSwxJk9cMyNRQ18lQSxAX1E8Oik/XEgrMy9fLyNIXV9TXF0uT1xdLlM7Xy8zTFZfU1xdLi9cUStTJ18KK00nQVA/X1FIOCZfXDwmQVdfJyFIPV9RPDcmT1w4JlFTX0JYPiVfXSMoUS9fSVVdT18qMjhMX1M0UytPXzQKK01RXCtfW10/PF9SWEYqT1xRKyJTX01LJlFfXkc5Vz9eOEYpT182JjlJX1lSREtPXDMlQU9fM0RZK19XTV0KK00+T103NiVHXypSVFBfUkRTLV9cWDFUU19AWEItX11PNVRfXSAxJS9fLjQtMV9YTiZAP1xeMFRHXzFERSoKK01fXE8pUy9cUS4jW18wRDUqX1NYXTEvXEkrIz9fLTM8X19SQFAsT18hTUs3X09KXlNfXS8xU09dIzBUI18KK00wND0jX1VJOjVfXyxSTD9fM1UlLl9VQT02P107NzVLX1QrXyVfVEktNE9eVE1bU186RjVLX1lSNkdPXEYKK00oMjdfSUouQl9ZVjhHT11KOTZHXz03JiFfUkRKMF9cUi0jU19CODIoX11DMFdPXDMlQj9fLjQ9PF9RJD4KK00uX10hMyY3XyoiXSVfUUw9Ky9cPCciP18oMUhCX1JURis/XFAqUydfLFMkVF9TME8sX1xfMDQ7Xy1DQSAKK01fU0hYLl9fOFI8R19TK1ZXX1dFTjhfXVk7NkNfJkE0N19WITs3X10xMyUjXyVRKDZfUig8KC9cRSdSL18KK00zREEsX1VJNDYvXiA+R1tfLCJITl9RODAlL1xXLDM3XyYxPDlfUVA4Jk9cQicxX18nUVQ/X1EwMCRPXE4KK00qMi9fLzQ1L19RMComP1wzJDEzXyRRIEJfUiREK19cQCgyQ18nIVBFX1E8NygvXDwnIjdfJkFIQ19SKEIKK00qX1w7JlIzXyVBMD1fUTwzJy9cNSRBW18lITBBX1E0OSg/XSgyNEtfMjRNKV9SSE0rT1w8J1IjXyZBVD4KK01fUUA6J19cOCVRW18mQTg+X1FYPylPXEYpMk9fLiNIXV9RUEEoP1xaLlNTX08rRlRfXj81Vj9cRigiQ18KK00rQyhQX1wqVkw/X1VXPiNfKkIoRl9SXEoqT15TSypTX1YsTypfWio9SD9dNzpWX19GWipOX1k+OUg/XEcKK00pQlNfJ0FUQ19SKEYrT11FOUZXX0w7OyJfVDk9Oj9eIkJZJ19WXTczX1QtJjRPXFoxJStfTFpaSV9ULSUKK00zL1xbL0NfX09LUl9fUyRWLy9cWy80N18wI1knX1I8SyxfXE4sI0NfKTJUT19YJVk9X15bS1srX1csSyYKK01fXVsrUT9fPlM8P19XPEchX14rKVBPXzBOWztfViwzIF9dJlpNP18/UjxPXzRVOTtfWjZISz9dNzRFQ18KK01CSDouX1I0QCkvXkJHWVtfRlk6Ol9WNUA5L11QO0dbXylSQSFfUyxVLz9dTjxXR19ZXTNEX1IsPSpfXFAKK00uRENfJlIgUl9SJEYuL1w4JlJTXyUxNEBfUUw2Jy9cOSUxP18nIUA6X1I8Qyk/XFUsMy9fMFNQXF9TOFEKK00tX1xRLCM/XytCQExfVjU9Nl9dUDo2L18zJEReX1RZKzFPXEInMV9fJjEsN19RPDElP1w0I0ErXyYhKDYKK01fUiw9KD9cOSRRP18lQSA0X1FcNCY/XDcjUS9fJVEkNV9RSDUmP1w2JDEvXykhXEFfUjA/KD9cRCdSJ18KK00kQSAyX1FQNyRPXCwkMVdfI1EsQl9RKC4lX1w4JFFfXyVBJD1fUVA3KF9cPCZCL18lUTg9X1E4NScvXDkKK00mIV9fJzFURl9RTDspT1w7JlI7XyUxNEBfUSgwJj9cMyQxS18lQTQ7X1JQTStPXE4sIy9fJjFMPl9SLEUKK00qL1xGKiJPXygiQEpfUkhOLC9cTSszI18qUlxRX1JESipfXE8rUytfJ0IoRF9ULSgzP10lMkRDX1QrXyUKK01fUlxGKz9cSCoyS19LSio9X183PVgvXEkoMjdfKyI8SV9bUlBMX18yVDxLX0xaKk1fVElHPE9dUkFIS18KK00yNVFEX1ZZV0E/XTI0RV9fNSVRTF9TWSo0P11YREo3XzNGQVZfV0ogQE9fO1RcX186Jj1UX1MgWzFPXkAKK01HSTtfMCNdJl9TTSEwX15eTktTXysiXFRfU0RbME9dKzI1K18qUlhZX1I0SCxfXEMrUy9fQDdRXF9cPlwKK01QP15HRFhPX086LjZfWyI2Qi9fIUopP19SKyY/X1xWUkg/XyFJOT9fUjsqRl9dTydQX106NyVfX0tLIlgKK01fVUE1Nl9dVTw3R18pUihGX1lOOUVPXi9CWFdfNzVBOl9WTUs+T1xJKyQ3Xy0jMF1fVkE9OE9fTVY+L18KK00oQUBBX1FUPChfXD0nIi9fKjIsS19RQDImT1w4JFE/XydRVD9fUjBAKE9cPiZBU18nIUA6X1FINiYvXD4KK00lUT9fKTIgRl9TVFwwX1xGKCIzX0hZRjxfWzJOSy9eKUFIJ18rIkRIX1FYOCcvXDQjQStfS1pGTV9RTDUKK00mP11QOkZbXyoiKEZfVU01Nj9cVywzN19GOFozX1YxPDgvXiI/KCNfJFBYMl9RNDAkT1xGKDIvXylSKEQKK01fUVw6Jy9cLiNBJ18lQSg0X1EoPixfXEgtNStfJEEkPl9RKC8mX1w0JDFXXyVRMEBfUUw4KS9cPiZSP18KK00nUVBIX1FINyhfXEAnQj9fJ1FURl9RSDgoP1wyJCFHXyQxIDdfUSgxJi9cMyRBQ18lISw5X1IkQylPXD4KK00oIi9fLkNQX19TSFwvX1w0JkFTXy1TRFxfVSErM19eNEI4W186VjFLX1gpXUBfXSIwJC9fOFYlQ19aNkMKK01IL19JVk1PXypSNElfUlhOKl9fLVA7U19cTUs9X1I4PihPXEkpIjtfTCoiSF9cIyBPP15aSjtHXyxUUT0KK01fVjlVPl9dT0EpI187SDo5X1VFWEJPXVJEKjtfO1kiPF9WKi1HX1xILyRLX0BIMidfXUMwUy9dLjM1S18KK00uNDEvX1VRPjU/XFouVCtfLFM8WV9XKVM9L1xQLFNDXy8jWSVfVCRfMi9cUi00I18qUlBXX1IwTixPXlsKK01MSytfUzwjJV9cIkxJL15XRzkjX0xZRitfXC5KRj9fJEpJN19TOl46X1wuRERPXylMKV9fWCxHJF9XMVUKK009T15JSksnXzdVST5fVjlCOk9cRSgiM19FOS4wX1hSKEJPXUU4JitfPTc2JF9SVFAyP1xQLCNHX0taQkgKK01fXkc8WV9cOyQxS18pQVxGX1IgOydfXEInMi9fKSFcRV9SPEQqT1xNKkMjXyYhLDdfUVQ5Jl9cNyRRN18KK00lMSQzX1E8MCQvXDwlUVdfLzNRI19SMD4oT10iLENLXywyIEZfUiQ1JU9cRiZSI18nISw6X1FUNyZfXS0KK00xVE9fJkEwOF9RPDElP1w8JUFLXypCMEhfUVA2Jk9cPiRRQ18lIFAwX1FQNiZPXDckQTtfJUEkM19RVDgKK00mT1xHKEIzXydRSDxfUUw5Jy9cPiZBQ18kQUhKX1E4PSw/XDclUitfJlFMRl9RTDspT1w7JlI7XychSEMKK01fUVQ7KS9cPiciN18qMjxQX1JYSyw/XFArMy9fJVEwOl9RLDAlT1wzJFE7XyRBKDVfUTQ0Jl9cNCRBT18KK00oQjBJX1NZIDBfXEorIl9fKkJQT19SWE4sP100NUVHXzBUNShfUTwvJF9cNyRRT18tIyxaX1MkTCwvXSsKK00xRDtfSjoqPF9eTzhWL1xKKUJDXysySEVfXEZdTU9fS1RdO18rMjRJX1MoTStfXlNJKkdfPygpWl9bTlEKK01OX10gNSYrX0RYQi9fW1pdUk9dIjVWR18xVyokX1Q9XUFfXlRPXDtfOCVBTF9SWSMzX11OPjdLX1dNOzIKK01fVEUoNT9cTS4kL18rIzBKX1RVLjU/XFsvNCNfK1MoU19SPEwsP1xZLlQrXzJEQTFfUyhVMC9cSysjP18KK00mUixHX1lSMEQ/XyxPPCtfUFpeR19bWkRFX15dSFk3X09aOjVfXDpORl9fJUpZQ19RKjo2X1wyTUgvXz8KK01RTCdfPDchT19bLlNNT10xMyRbXzY1LTtfUjhBKT9eMENIT19CKDImX1Y5QThfXUY5RzdfKlJZJ19TKFIKK00uX15ISCovX1k9T0xfUzBMLU9cTSlSX18nQUxBX1JITCw/XEMpMlNfKDFcSF9SWEktP1w/JkIjXydBSDwKK01fUUAzJT9cOiVBQ18pQiRDX1I0QylPXSEwJDtfKVIsRV9RQDMmP1w3JTFDXyVBPDhfUTA2Jl9cMCJQX18KK00mQTA4X1FEMyVfXDkkUT9fJEBQMF9RSDQmL1wzIzEnXyZRNDlfUUwzJV9cMSIwV18kMEwvX1EkLCQvXDYKK00kMS9fJyE8OV9SLD4oL1xDJ0IjXycxQDpfUiw8JU9cPCdCL18qIixJX1FYOihPXD0nMjtfJzFURl9RUD0KK00qL1xMKlMrXyxDJFdfUiA/KT9cOCVRV18mQTw9X1FINyc/XDklQVNfJVEwOl9RPDcmT1w9JyIrXylCNEwKK01fUVQ6KU9cNyVBU183RVlBX1MgUCxfXSwzJF9fK0JITF9RVEAoP1xaMEQzXyYxTD5fUTQ3J19cPCciN18KK00kUTg3X1YtPzc/XyRPOz9fWk1LN19SSEYqL1xHKDFfX0xKOj9fXi8rU09cUCoiU18sIlBOX1wuV0xfXU4KK009VyNfTls2WV9TXTI3L14wRDkrX1BMMylfUzxdMz9cWTA1N18+SCYnX10zLFJPXUg6Jz9fLyQ5NV9TUSIKK00xL11UOyZDXzMkTThfUlhZMS9cMSZRK18oQjBJX1NAWi8/XDUmQUtfKUJMUF9TRFwwP10pMiRfXyxDOF4KK01fUzBVMC9cQCkyS19KWipCX1w6V08vXkxGWTdfSkkyK19aQjNBX14/QldXX0VYQVtfWT4lPl9dWzomI18KK01CR1FTX14/MlM/XUM4ViNfSlpOTl9USSUxP10oMTRPXyghTD9fWClfP09dSTk2P185JV1DX1VVPTsvXEMKK00pU1dfLyNVJF9ZNjBFT19EVD4/XyoyOExfUyBWMC9cVixTX18oUixMX1EsNCdfXDMlIV9fLlNRJ19STEQKK00rL1xOKyJbXy9TMFNfVUkyNU9dOTY1U18tIzxYX1JUUixPXEYpMjNfKEFUP19SNEAoT1xCJzFfXykyIEIKK01fUlBEKV9cRCchX18qMiREX1JMQylPXEkpIjtfKFFYQF9SQEMpP1xGKDIvXylCJEFfUiQ8Jy9cRCdRX18KK00pIVw/X1FINSU/XEInMVdfKVIoQl9SMD8nX1xCJkFbXyhRUDxfUiQ/KE9cOCgzK18kITxJX1FYPilfXEwKK00qMl9fKCIgSV9RWDspX1w2JDFXXyVRKD5fUTwyJ09cNiUhV18mMTxAX1FUOykvXD8nMjtfJkFIQ19RPDcKK00oL1w8JyI3XyxTLFxfVT00Nk9cSioiT18kIFgxX1FIOCZfXUA4JVdfPidJV19TUF8wL1w1JVFLXydCIEUKK01fVC0gMU9cOSlCP182NU0+X1w2UkxPX1JVPSdfLVI8T19SLEMpT14pQlgrX1JbPllfUzRKK19cUStTJ18KK01TTCpZX1ZdVUE/XyxQPCNfLlRBOV9ZIi5EP18qUTw3Xy0jWS1fUlxbMk9dWT9HW19WXTsxX1ZVTz9PXFIKK00wRTdfKzNMWl9VMTIyX10yNDVbXyxDUSpfUUQ9J19cNSYxT18sQzhYX1NIXjAvXFovVDdfLzNdIl9UUS4KK000P1xQLSNTXykyTFVfUiREKj9dSzomP19OWyJVX10vKFFfXy1QW19fVSxLJl9dUzJTT19FVj03X1otSzcKK01fXjc3VS9fSlctR19dTis+X1VRPjcvXUw7RydfKSIkQF9TTFkuX1w/JzIjXzFEMSdfUUg4Jl9dOzZGJ18KK00nQVxQX1IwRy4vXFQuI0tfQEgiIl9eJzNbX1xLKzM3XzIlJT9fUlhQL19cOicyQ18pQkhZX1FUQSwvXDAKK00lIi9fNVUhOl9WRUs7T15eTCsnX1ErRyBfVjVFO09dLjQlQ18xREUuX1JIRSlfXEUnQVtfKDFIOl9SLDwKK00nL1xDJyFTXyoiJEFfUiQ6Jk9cSShCK18rQjxHX1MkSipPXEYnUV9fKkIsQ19SVEYpT1xKKTI3XylSKEIKK01fUlRIKi9cSylCO18tIlxPX1JERCkvXEUoIiNfKDFQPF9RXEEnX10sL1NbXy8jNF9fVC1HQy9dNDsoV18KK00jMTBIX1E8NCgvXDclMVtfJiE0QV9RLDAnL1w4JTInXycxSEZfUUg3KS9cPyciR18mMThDX1IgPSpPXFQKK00sQ09fKjJAT19UQSczT1w/J0I3XydBUD9fUSwxJS9cLyMxI18iUEQsX1E8MiYvXSIuI09fJ0EwMF9RQDoKK00lX1w2JVEjXy1DNE5fUiRYLF9dLTdWL18vVCUoX10/KFBfXFIpUltfJyFcRF9TQSIuL11FNjVLXy0yXFMKK01fU0BULU9fKk9LN18pMkxbX1xfJFBfXFYwVTNfRjk+Ol9cVyhSL10gMkVHXy40NTRfVklTPF9dUzwmT18KK00/N14uX1MlIDRfXFQwI19fMVQ0Xl9VOTU4T1xCKyNLXy9EKSRfU0RdL19cXzBUN18vNCUjX1NRITFfXFcKK00uM1NfL0QhI19TIFQvL1xHKzM/XygyMElfUjRHKT9eQkcqI19ZTScvX19PQlc/X1hXXUtfXk4nPF9fV0YKK01YP19aWF1bX14uJzxfX0dCVz9fVFYtS187Nk1NX1I4Rio/XFgtMyNfRFkqMV9SNEMpP1xCKCIrXygxXEEKK01fVS0yNj9cTitUI18pIjxYX1M4Wi8vXS8zNF9fWE0nSV9TMFMuT101NyZDXyghXExfUVA7KE9cQigiR18KK00oMVxIX1IkPyovXFIrQz9fJlFYQ19dIyFRP185Ui0rXzclTUxfVFEvOC9cXy9UQ18qUixGX1JMQCdfXEwKK00pIitfKjIkP19STEMoP1xMKUIzXytSREdfUkRDKD9cRighW18pIVA6X1JURShfXE4pQjNfKzI0Q19SXEgKK00qL1xUK1JfXyhRWD5fUlRIKi9cVSwjI18nQUQ5X1JUSCovXEQnUV9fKSIoRF9YTV4+P10lLVNDXylDMTUKK01fUSg+Ll9cOCYyS18lQSw/X1E4NShPXD4nMktfJkFIRV9RWD4qP1w4JiIvXyUhLDpfUyhRLi9cPydCN18KK00oIVxGX1FYPCdfXD4nIV9fJyFIPV9SPEUqL1xJKVJLXyRRJDRfUiQ/KE9cRikiP18nIUxBX1YpNjRPXyMKK01MSlNfOFZFS19RWFkuT1wqKSI/XydEPSxfVjIlRD9dOj84S19IWlpJX1M4USxfXE0qIltfTUtKUl9cUloKK01PL10nLyQnXyoyPElfXEpeTT9dJDJFS19VPEspX1NBJTVPXitCOFNfUiwvI19UKSw2X1xXMFUrXypDOFUKK01fVFEqMT9eI0E5M18pIlkiX1I4Uiw/XSEvU0NfM1RZO19RTEUsX1xQLSM7XypCWFBfUlxTLT9cRypSV18KK00qMlhUX1JcUS0vXEsrMyNfKzMkWV9SSFAuT1xBKSJHXykiQEZfUzRVLi9fKE5LT19RSzJWX1wmT0w/Xl0KK01KWldfSzleQF9aJjVFT15BRTk7X0Y4Vi5fWS1YP09dKjE0R18tQzBWX1UtLjIvXU47Rk9fJkFEOF9SOEUKK00pL11CODYjXzYlPT5fUkBJLk9cRClTQ18tI0BaX1RBJjIvX0FTXi9fLDJQUF9SKEMqT1xSK0M7XykyIEIKK01fUTAvJF9cPiYxV18sMlBQX1QsXzFfXEgqQl9fUytfJF9dRyhUT104NUZHXzFERTtfVC0jM09cSSgyN18KK00qQVw+X1MwSSovXE4oUitfKlIgP19TIEgpL1xMKVIrXy0iXEpfUkBDJ09cUipCO18sQjxGX1JcRChfXE4KK00oUitfKjIoQl9SSEUpP1w8JVE/XyVRKDJfUVQ4Jk9cPSYhS18nMUA4X1JMRilPXD0lQVdfQTdJU19XOUkKK003L10nLiQvXyxCRFpfUjQ+Ki9cPiZCL18mQURGX1FEOik/XDgmIidfKjJEUl9TJFEuT1xLKyJXXyhSKEEKK01fUiQ/KD9cPycxX18nUVRAX1FQOic/XDclMUNfLTMwWl9RPDQmT1w1JTFDXydSIEFfUlxJKz9cQykiN18KK000VEkkX1g1VjwvXU09J0tfNVkmR19UQihJX1xQPChfXy5GOihfUkhQMU9dUDZFT18tUihHX1IwQSlfXlYKK01LWkdfVCtGWl9WJTQ2P1xPKzJfX1M8JlhfVklLPU9fOlQ9J18wNE06X1UhLjQ/XyBPTCNfMUUhP19TWSoKK002P1w3KFIrXzFEMSFfWDIiRE9cRCszW18rIzRVX1I0Qic/XSsyRT9fKyM1I19TRFwwP1xaL0QjXzE0RSsKK01fUyxZLl9cVy8kJ18sMyxWX1EkMyVPXFEtQ1NfKSI8Ul9SLEYqX1w7KCIjXywjLFRfWy5OS09fNVNMW18KK01WPF8yX10/MFQvX0BULTNfWS0rNl9cJlBNT15SSFo/X1tdNzhfXVszVi9dSzlGQ189Jl1JX1JQTipfXEcKK00pQjdfQDddWl9WTUk5L10mMTRPXyoyTFpfUUg9K09cUS0zP18xNDknX11bMVhfXEgoIktfKCFMP19SJD0KK00pP1xCJzIvXyZRODpfUVw6J09cSChSP18mUUA+X1FENSVfXkVHSVtfVkxfNl9ULSMzT1xcLyRPXzAjSSgKK01fUyRKLD9cRygiI18oUVA8X1JMRCkvXEYnUV9fKyIsQ19TNEwrL1xYK1JfXywiPEdfUyhLKl9cSykiM18KK00pUiBAX1JMRCkvXEsoUj9fJTEgNF9RNDUmL1w7JTFHXychNDxfUVA3Jl9cQCYhT18qUihCX1IsQShfXVIKK007Nj9fMVNUT19aJjNEL18yUT0jXzhFTUdfUUQ6KT9cPigyU18sUyhYX1I0QylPXEAnQidfJ0FQP19SLEAKK00nX1xBJ0FXXygxUEBfUiQ8KE9cRidSO18nQUQ9X1FQOyhPXE8sU09fRkkmOF9ZUkFIP1xWM1RbXzE1XUgKK01fU0hXMS9eM0BYT19OOkpOX1YlOjg/X0RXPj9fP0gmMl9UJSk3P1xOKkMrX0ZZOjpfXF8gTk9cVysjJ18KK00qUkBOX1s6SUkvXl1LSl9fPzcpWV9SQEMoX18lTjsjX0ZZJi1fXEMnU09dLDNFN18lQTA2X1deIUIvXSMKK00zNU9fLkQ5NV9RVEwqL10sM0UvX0NYSjxfUkBSMU9cPyhSN18yRE0sX1FYQCovXEgqU1NfLlNVJF9TMFgKK00uT10iMiRLXy5UJSNfUlhRLU9cTiwzO18qMlBRX1JITSxPXEYqUydfKiJMUF9TMFYuP1xEKTI7X1BLQk0KK01fWz5DRl9fQFI8M19CV0VPX1oiLUE/XltKWkNfOFVNOV9VLSswP19GVS0jX1hMVytfWTorQk9cVS5DS18KK00sU0BdX1IkPic/XjBCSCtfPldFUV9SOEYqP1xFKiMzXypSWF9fVS0yNi9eJUE4K19WLE89X1JYRiwvXFEKK00rIyNfJ1FMQ19RTDcnX1xCJ1I3XycxSEBfUyBNLF9cUSwzS18lUTA6X1M8UCwvX0NVLUdfLlNBJF9TXF8KK00zT1xeLiQ7XyxSUFNfUjg/J19cRygiI18rMjhGX1I4PydfXFYrQydfLEJITV9TOE4sP1xCJkFXXydBPDcKK01fUkhDKF9cSShCK18qMihCX1I0QCkvXD4mUidfJyFEP19RVDooL1xIKFJHXypSOEpfUkxDKU9cTSkiM18KK00pIixCX1Y9RTgvXUY4NU9fKiFUPF9bKkdLT11TOzc3XylCPE5fUVQ8KF9cQicyJ18oIUw/X1FYOSc/XEEKK00nIiNfKFFYRF9SKD0oX1w/JkIjXyZBMDxfUjQ/KF9cQSciI18pQjRMX1JMTy1fXkJGOUdfSVpGTF9XUjkKK01JP108QVlfXzAjTTVfVkUzOi9eT0dKR186JVlBX11TL1NPXi1DSTdfLlRNNV9TPSIwX14uQ1kjX1U8OyAKK01fU1hTLi9cRykiS19GKS4uX1leNERfXjZCSFdfJ0FEO19cOlpMX1xaLCJTX09bWyVfVCUjMk9dPjclW18KK00tIzhdX1NRJzRPXFwyVSdfJ1JEP19UNSgwT141RSlPXyoyXFlfVVE/OS9cOygiN18rQzkgX1FAQiwvXF0KK00xRFNfLSNIXF9UISIxP1w5JVFLXyVRRD5fUlRQLT9cSSsjJ18rQyRWX1IkRisvXEIpMktfK0MgU19TRFoKK00uX15eTSpHX0s5RjFfXisrUU9eLD5HI19GKEFeX1wiVEs/XV88VlNfSik2KV9ePzdVL18uT0wrXzEzSF8KK01fUlxSLV9dITFEO18wVCRcX1hWLUAvXUU5VVtfKkJESF9SVE0uL11XPSg7XzFDXSdfW05RTS9fQVUuO18KK00sQkhUX1I0QCkvXDYkQUtfJjFAP19RXD4pP1w9JyIvXyghXEZfUVg+Kl9cRyoiX185NVk+X11fMFQ/XFcKK00tM1tfLCMgX19UMF4zL10iLlQrXysyOEZfUjQ+J09cRSdBW18oQUw7X1MgSitPXDklIUNfJTEgNF9RPDIKK00lT1w6JEE3XyhBTDtfUkxEKS9cSykiM18tQyRRX1I0PSgvXV48RzdfODVFPF9SMD8oX1xBJyIjXypSLEYKK01fUlxGKU9cRylCN183NiU/X1dSID9PXjpEWS9fK1I0SF9RXDsnP1w5JkFPXydRSDxfUiA6J09cQiciI18KK00nUUQ9X1IsPSg/XDgkUT9fJyE8O19RVDomP100NERfX0NYSixfVF0qM09cPydCN18vNCUpX1U9PDYvXyAKK01QTDdfVF0nQV9bUldSP1xDJyJXXzI0LTFfXTcuVi9fSlc9U19aTTs4X1o+PEo/XSowRTtfLyIsVF9XPU4KK009P18jTSpbXzJUISVfUiQ+KS9dTDpWS18sIkxGX1lOLkM/XEkoUj9fTipWRl9SQD4mT11JOiZfXzEkOS0KK01fUUw/KV9cVzAkW18xRF1AX1NdIjNPXDAjMUtfIjAgMl9SKDcrT1wuIVFHXyoyMFBfUUw7KS9cUS0kI18KK00qIlxdX1IwRis/XDkmMVNfMjRFLF9RMDQlX1w7JzIrXyoyUFFfUlxSLV9cTiwzO18pIkRPX1IsRipfXEYKK00qIk9fLzNYX19bWlRKP15TR1k/X1lMXypfWS4hPV9eLj5XL19QOypNX1ZFPzZfXT40REdfW01fOl9eMzMKK01UX183UixHXzE0ISRfU0RaLl9cQygxW184NV06X1JMUCtPXEkrMk9fMVRFMV9TMFQxX1xUK1NPX1RMOy8KK01fXTMkVi9dJS9EO18oUiBGX1IkPyovXFctVCtfLjNJJV9VLTQ3X1xGKUJfXyoiQFNfUVw/Ki9dKDAkL18KK01XTF8vX1QsXzIvXSMwVStfLyNFJl9UIFswP1xEJyFfXyoyIEBfUyhJKj9cUypCS18mMSw3X1FINSZfXD4KK00mMV9fJzFAPF9RTDMlT1xAJjFHXykxWD5fUkBBKD9cUCoiM19EOEIiX10/KFBfXUo3RUtfKVIoRF9SJDsKK00nX1xIKCIvXywyQEhfUjBCJ19dPjhWL184RjlIX1hKJUE/XTAyJDtfKCFUPF9RXD0nX1xDJyFTXykxVEEKK01fUiQ7J19cRigiM18qQihFX1RdKTFfXjFDSEdfRyk+MV9bMlBKL1xWLDMnXywiTE9fV11eQT9cVC4kI18KK005JjlEX1tOVk5PXzxVTVtfVS0zMV9bVyNPX15LTDsvX1UtJzdfXlM7Vl9fUlctM19OOzZXX1NdMDVPXDUKK00pIjNfPVdBWV9bSk1KL109NFU7XydBUD9fUVQ8Jl9eMEJIQ18xM0RVX1IsPihPXkVGOTNfQEdFWV9SXFEKK00uP1xSLSNTXyszNSVfU0klNU9cKCNSL18pMVRYX1ZJREdPXTEzSSNfLiNBUV9RQDsyT1w6JEJXXytSRF8KK01fUTAxKS9cNyVSK18mISw3X1FMOCdPXEEoMjNfSipCS19STE4sX1xMK0MvXy1DRF5fUlBOLT9cQyoiW18KK00nQiRGX1I0RypPXFMsMy9fUCs6TF9bKj9FX18+UUwvX0RYJVdfWDVUO09eTUZZX187JklMX1gpWz0/X0QKK01VXTtfWFxbLF9bIj9HX15bTEsrXylSNEhfUlxKK09cVCwzI18oIjhIX1VdRjlPXEwtI1tfLEM9KV9TIFAKK00uX18zUl03X1U8R0JfVD0rMz9cRyxTU18lIVhNX1MgUC8/XD4nUktfJkFMRl9SMD0pX1w4JDFDXyYxLDsKK01fUlhHK19fRFU9R18xVCEqX1NUXTMvXFYtRC9fM1RJMF9SSD4pX1xJJyInXysyLD9fUlxDKS9cOiUhQ18KK00oQVBAX1IoPSdfXEooQjdfKVIgQF9SREIoT1xLKSIzXyoyKEJfUzBKKU9dRTlGI19YLS8yX1glTzw/XEUKK00nMiNfKTFUQF9SUEUpP1xKKSIrXypSPEVfVV0/OE9dOTdGL18nITw5X1xCXE4vXEUnQVtfKFIgRl9SKDwKK00oL1w1I0BbXyYxMDhfVkFDOV9cSCdBS19LWiI6X1wmX01fXyROKy9fUCsqT19TNFQsX1xDJ1InXyZRPD8KK01fUzxaMT9dLTQkS19SPC8nX14zN1hPX0ZVXUNfOTVdNV9WQUA3L19DVS1DX1xNXz9fXy89Vl9fJU8sL18KK00vJCUtX1I0RCpfXF4tQzNfNjUtMV9WUUc5X1xBJzFfXzw2PUNfUkxAJ19cRSdSL18nQVREX1kuJ0IvXFEKK00sIz9fMDRRPV9TRF0zL1xcMiRXXyFATEdfVjlDRi9cWS1GO18mISBMX1FMLCdPXD4kIUdfJ1E4PV9RTDkKK00sX103NVgjXzRFKVlfUFwvJ09cRSgiI18rQzBcX1QtITBfXztUTStfKkJEUF9SWE0tL1xWLiQjXypSWFkKK01fUjhKLE9cQSkiR18qUkRMX1NIVS1fXl9MKktfVUwuXV9eVzhVT14+QlgvX0E4IVRfXUMgU19dIDNFP18KK00rQVRDX1c5VkE/XzZRXD9fLiMgU19WXUw8T1xVLSNPXy0zIFJfW05TS19eMEVZI18wNDElX1VJPTovXFMKK00uJEtfK1JMVF9aMj1KP18mUD1HXyxDNFpfUVBAKi9cMyRBX18mUTw5X1EsMyVPXDYlUVtfJyE8Q19RUDcKK00nP1wyI0E7XypCMExfXSMkUV9dMzMlO18wJCEvX1QlITNPXTAyVSdfKyIoRV9STD8oT10sMDQjXy1SUEsKK01fVUEtMy9eN0NYV18tIlRNX1IwPyg/XEYnUV9fKlIwRF9STEQpL1xIKDInXyxCQERfWEYqQS9fQVUtL18KK01CV0VbX1IsOydPXEUnMiNfKlIwRF9SVEcpP1xNKjI/XzgmIUNfVS04Nz9cRyhCM19GWSYtX1IwPSc/XDoKK00lUVdfKFFYQl9ZQixBX15GRllLXzVVITBfUlBAJy9eXkxKW19AOC4hX1peRUovXzpTXTNfLEMgUl9SNEEKK00oX1w/JlIvXy1DRSRfU1hfLj9fKU9bT19YTS80X14vNlQ/XTEzVD9fLyNAVl9cUyFRT19HVi1TX109Xz0KK01fXFMjUk9cWC80R18mUUhBX1MoSiovXFcsMl9fMENUXV9RRDUlX1xBJkFLXykxWD5fUiA8J09cQCcyL18KK00+RylQX1NQXjE/XSc1Vj9fLlQ1M19TRSIwT1w7JUMrXzo1OiRfUTQsJz9cMyUhT18kQFg2X1E4MCYvXDQKK00kMVtfJVE4PV9QSCYlT1xRKlQnXyYxND5fUjQ8Jy9cXzBUT18yND0pX107MVQ/XEAnUjdfK0JUU19TJFMKK00uT1xOLENLXywjNFtfUjRIKz9cUCtDJ18oMVA+X1hNWzxPXyFLOjdfWj0zMF9ZQiU+X11ROzY3X1JbOywKK01fUTxJLV9cRidCQ18nUjRVX1w+X08/XE0qIktfMSNdJV9SVEksP1xYLDMnX0dZNitfWDYkPz9eLUJIR18KK005RjlPX1JITS9PXSUwNEdfUStXJ19dSyNYL1xFJyIvXyYhJDhfUiQwJk9cQSZCJ18mUUxEX1IoSCwvXE0KK00sI09fKTIwSl9SWE0tL101NDVHX1VMUy9fVChbMT9cWy5US180VS1AX1UtLjUvXFAqIjtfKDE0OF9SUEAKK00oP10uMTNfX09bLkxfXVMvUk9dJi9DU18qIihGX1IsOydPXEkoQitfKTFYPl9SREIoT1xTKjI3X0I4SiQKK01fXVsxVC9eQENJI18qIiBDX1I8PyhPXEgoMidfKyI4RF9TIEwqT10/N1YrXzc2KUdfUjRAKE9eUEhJR18KK005NUEzX1o6PkcvXkZHKUNfUFs+UF9ZWjZFL1xIKFI3XypCKEVfVT0oMi9eNERIX19XTSs1X14rM1YvXE8KK00rQldfKSIgQl9SKD4pT1xXLkQ3Xy80ISFfW1JUTE9fOlJcT19YTVs8X1U1OjUvXFUsUzdfOCVFQF9aLjgKK01HP19NVV1DX1NMNyxfU1EhMz9cPCZSK184RUk4X1U1LzM/XDolMTdfKFFcQV9SJD8oP1w8JkFTXydRVD8KK01fUVw9J19dODM0U18yJEUwX1Q5MzkvXSEyJTtfKVFUUF9TVEsrP15LREgnXz1FSTdfVUhdLy9eOD02W18KK01BNiU3X1gxQjdfXEsmIStfRUglX19aPjFEX1w0IUAvXy1SREZfVCkkMy9dKTJET19VPSsxX1FQPig/XEwKK00rMltfL1QpJ19TIFUuX1xMLDM/XykiPExfUVA6Jz9cPCVRR19CJzlMX1wmS0hPX0pVLFNfRTghVF9XPU8KK005P181Tz0rXyYiSFhfUlBFK19cQywjV19JKiI+X1JQSCpPXFwtU1dfK1JAUl9UIFgtT15ARSg3X0BHRVMKK01fWEVdP09dPzZWL18pQkRVX1NMWjAvXlxNW1dfUytTOF9SREosP1w0J1I7XyZRVERfUihCKz9cRSpDO18KK00vJDEuX1EsOigvXEUpIktfKlJIUF9TRFYvL1w/JiFDXy8zRSJfU0xbMk9dKjJFR180VSE2X1JMQyg/XFgKK00rIldfKkFYQV9STEQnT143QlgrX1YsUyVfVUUuMz9cSilCQ18oIUw9X1JIQyhfXEooUi9fKiIkQV9TIEYKK00oT14pQkgzX1dNJzBfWjIyRS9cSCgiL18pUVxCX1JIQyhfXEspMi9fK1JER19WVU47X11AOTZLXylCJEMKK01fWjIxQT9fIEs6N19RW05UX1w2WUwvXyhOWztfSkouQ19SQEUqX1xFKFI7XzFDQFVfWz5QSk9fP1QtI18KK01aTU88X1MwUSwvXEQoIitfJ0FIQl9TPFoxP10mM0UrXzlFWUFfXS8nUk9dWz43T18+R1VeX1c1Wz8/XUgKK005Nk9fS0ouSF9fL0FXT184Uz0zXzI0WTpfUUQ6KD9cSChCI18pQVw/X1I4QSg/XEEnMV9fJyFQP19SID4KK00oP1xBJ1InXydBTDpfVDhXLV9dIS5UL18xVF0/X1U5OzlfXSwzRTdfIzAsLF9STDQnX1xSKDI/XyUwSDcKK01fUiQ0J19cRyVRX18mMFQ2X1IkOihPXDgiUUNfKUFAR19SIDooT142QkhPXzEkKStfVD0oMj9fMVQsX18KK00rIlhRX1RRLjMvXDknIVdfKCI0Sl9TUSExX1xJK0MvXzIkLSdfXVs2Vj9eKT4mT19QOk5CX15HM1JfXjgKK01BJztfP1cxSV9dPltTX1w8K0NDXysiNExfUjhRLy9eMUQoX18qMjhFX1M4UC0vXEkoUk9fMVNcW19ZTisKK00+X14xQUdfX0Q4LiRfVEUkMk9cQikzI18oUixGX1paTEtPXz1TTjtfKVJMU19TTSk2L1xHKlMvXy1DOFMKK01fVCkgLz9cXy5TR18mUSwxX1JQTSlfXE0sUl9fNjYlPV9dNzJUP1xYLjQjXyszIFxfU0hXMS9dSTkmQ18KK00rIihFX1JYRClfXEYnUV9fKUIoQF9TVFwtP183Ulw/XzslTTtfUjg/J19cQSdBV18pUiBAX1JcRilPXE0KK00oMitfLTJAR19YWi5CX18+VD0jX0xaKkJfUkREKS9cRCdRX18qIixDX1JIRSk/XFgsIltfOTY9RV9WKUkKK006P1xCJzInX0Y4UiFfXC5STE9eIz8nO186Nj1CX143NlZPXk1IOitfKjI4RV9SNEAoL1xYLFJXX087Mk4KK01fXTMoUS9fRFctS18uIzRUX1IwQChPXEAnIjNfLEM1IF9TWSUxP18iTFsvX1MrXl5fXl9EWF9dUTpHO18KK00xVS08X1VZPThfXllKWlNfWj1LNF9eNzBVP10lMTUrXyYhSEFfUjA/KD9cRihCM18oUVxBX1IgPCdPXEAKK00nIVtfKDFUP19SKD4oL1w+JkFTXy0yPEhfVE0mMy9dNTgmT180NU1FX1Q9LTc/XEgqIz9fOCVVT19XKU4KK01FL1xDKENHXyQhID9fUFQtJk9cKiIxO18mUURaX1JQRzQ/XFktJTtfJ1IkSF9aPkVIT105NTVbXzBENSYKK01fXTszVE9cSyszI18uI0hYX1M0Vy0vXFItM0tfLCMkXF9SQFAtL18mTktPX1ldQz1fWTVfPU9fKUwqT18KK01ZPFMrX1laJj1fXVs8Nj9fVVwjM19SIFMvX1xBJlIvXytTNF9fVilGOi9cRSlSN18sMlBOX1IkQClfXS4KK00xRDNfQidFTF9YQV09T14xQEgvXzJUMStfUixFKy9cVS0zQ19IOVI8X1wzI1QvXD4nIUdfKFFMP19RPDsKK00mP1w/KTE/Xy9ELFdfU0UiLT9cTS5CV18oUlg7X1IpIis/XUlDWCNfUUw3JF9URSQyT10gL0Q/Xy0yXFcKK01fVCBZLj9cTihCL18pMUw+X1JMRCkvXEUoMV9fKCIwPF9cQyNPT14jPCcjXyxCMEVfUjA9Jz9cRygiI18KK00sUkhKX1JUQShPXFAoUitfQVg+JF9dSy1TL15fS0pbXyoyMERfUjA/J19cTSoiQ18sIkxLX1M4TisvXUUKK005VjdfN1Y5Rl9SLD4oT11WOyYnXzpFVTxfWFIqQF9eLENYR19ZXUM8X1siREk/XE8rIk9fKUIkQV9STEoKK00oX15NSUojX1IrSldfXk9AV19cUStCV18oUVxBX1FMNydfXFAsU1tfLyQtI19bXk5LT15fTCsjX1xON0QKK01fVllIPU9dKTVGJ181RT0+X1sqRko/X0FVPFtfWV0rN19TXF8zL1xAKEJHXykyIEJfUiw/KD9cQydSJ18KK00oIVA+X1IgPCdPXEEnMV9fKEFYQF9RWDonL1xLKFInXzI0TS5fVDkyNl9dOjk2U18xJF06X1NFIzNPXEoKK00sM19fLEMlLl9TIEc4X1xUKkZfXy9TOVxfVU0xRk9cOCU0R185NV4rX1QkXTc/XFkwNE9fRTkyM19VQTQKK003P10sM1UjX1Y9OzVfUyBSLV9cUCwzK18yNE0pX1MgUi4/XFEsQ1dfKVJcU19cLldOL19EVT1LXz9HJUwKK01fXCJLSj9fPFI8R19BRylOX1c9TjlfXzRPPSNfJSI8U19SND8pX1xXMCRbXy4zXSdfUiRDKU9cUCsjM18KK00oMjBPX1RRKDJPXVg6RidfPUZNRF9ZKiFAP10mLzQzXyhSMEtfU1hcL19eVkpaS19PXDMqX1NZKC1fXFYKK00wQy9fK1QgUF9UUUM0L1xZNSQvXyMiRDdfU1k/Mz9cUzNDV18vJUkqX1lCTUg/XzlUPFdfMlQ9L19TMFUKK00wL1xNKkM7XzBTWSBfUjg9Jz9cRSZRW18pUiBAX1I8Qyg/XS4zVENfVDw/I19ZUilCP1xGJzFXXyhBVD0KK01fUjxAKC9cTChSL18rQihDX1MoRSkvXVs+V0NfVVxLKV9cQldNX1xIKFIvXykyIEBfUjxCKE9cSSkiM18KK00rQjhEX1NUXy8/XT05JjNfJ1FIPl9XTVA5P11INjVHX0xKTkVfWU45RS9fRFU9R19NWk5MX1MsUCtfXEcKK00oQitfKDIoO19aWklIX15NR1lTX1k9QzdfUyxOK09cRSgyL18pIiBIX1NEXDFfXFkvQ1tfUCpWTV9aPjYKK01FT19OV11fXzhVVUtfU0EpNU9dIzFUX19KWiJFX14nNFNfX0ZUPTtfLzNVKl9SIEIqP1xIKFI3XylCKEQKK01fUjRBKF9cQidCI18oQVhAX1IoPigvXEInQiNfKEFYQF9SLDslX10xNCRfXy8kNSxfWEIqRD9eK0I4T18KK00yNF0xX1NNJzMvXSAyJStfPidJX19UOSczT1xIK0NDXyciNFNfVFE1NT9dWT5HT19RXCcpX1NEXjJPXisKK01COE9fM1RNNF9UKSUxT18pUUw3XytTIFdfUkRJKy9eOEY5S18vI1kmX1M8WDBfXE8tU09fT0sqU19eKzMKK01WL11XPEZTX1I7WldfXV8yUz9eOUNYT19GSTYvX11bJ1ZPXFUyJTNfKUIgSF9TSSIzL1xOLFNDXzomRUoKK01fVChdMD9cVS0jT180RFEqX1s2SUhPXT02JUNfRCgyJ19TSFUuX1xBKiJbXzBUNShfWkZESS9fJlIsX18KK00rRDRSX1RRTzVfXVVDV0tfKiNcTF9SIEwqX1xRLkMvXy1UMFlfUkBULz9cXzBFM19STCslX14/OFRPXFsKK00uVDNfLyQhL19UTSk2P10mMERLXytCMEdfUlRDKU9cRydBW18sIkhIX1YtPDVPXz5ULFdfSjlCOF9SOEMKK00oT1xBJ0FXXylSIEBfUlhFKT9cTihCL18sMjBDX1QxJS9fXzdSLENfUytOW19SQEMoX1xFKCIjXykhXD8KK01fUjhBKD9cTilSP18qUkRLX1NIXy9fXD8mQVtfO1VdNl9XXU87L14xQigrX0kpXjpfXkM5Vk9eWktKX18KK00rMkhJX1IsPidPXEQpMVtfS1pGQV9ZLidAX19CVT0zXy9DRFlfUiw/KD9cQygiO18xJD0yX1QxKDJPXlwKK01LKkdfRFgqIl9ePzhWL14jPzhPXy1UQTZfVV1COz9ePEUpQ19WTFspX147NFVPXFYtVCtfK0MgV19SQEQKK00pT1xHKFI3XyhBWEBfUiw/KD9cQidCI18oQVhAX1IkPSdfXEMnUidfKiFUPF9UPSMxP10xNCU7X1ArRyAKK01fXks5WF9dPTVGP18vNCk0X1QpKTZfXV09SCNfTTpGUl9ePz1bL100NEY3Xzg2JVBfWFIiQl9fQFRdQ18KK00vI10kX1haMENPXTAzRT9fMEQ1Jl9cWytST1xIKjMjXypSSFBfWEYoQ09cUy0jX18rQyBYX1JYVi5PXyQKK01OK0dfWU07Ol9dJyFOL18zTjpTX1VbPk9fXFJQSy9eOUM4O19WPDM3X1IsUTAvXEUoMkdfKUJMUV9XQVgKK009P149RikrX0QoTitfWCFbPl9eKEA3T185ViE6X1VRPTkvXjVEKTNfKiJITV9TPSMxX1xbMSQzXzlGTUsKK01fXVs7U19cTSpCR18sIlhXX1NAXi5PXV8/SE9fOUQuKl9aLVtLX10lKyRPX0pISl1fV004Ri9fM1BMU18KK01bLUswX1RJJjNfXF4vRE9fNFUpP19TVFwwX1xLKFInXytSLERfUyBEKT9cXi0jI188Rjk/X10/KFBfXkwKK01HOVdfKlIsRl9SIDsnP1xHJ1IrXyxSSEpfUlxEKF9cUSkyI19COD4gX11XK1IvXzJQPCdfKUIkQV9SMD8KK00nX1xIKFIvXypSOEZfUkBDKV9cSSkiQ18pQiRFX1FcOidPXVM4ViNfQyghW19XSVc8T15HSDlfX1g9LzAKK01fXEpfT09cTysiT18pMiBCX1JQSClPXyRNSj9fPTZVSV9ePz5XT1xaLTM3XylSLEVfUjBCKT9dMjU2I18KK00xJD0zX1tKS0k/XVU5VjNfWj1PPF9ZNilET10gMkVDXzclXUpfWi47R09eP0YpQ19aLU82X1QtIzNPXE4KK00sM1NfKkI4SF9SOEIpL1xDJ1InXykiIEJfUig+KC9cQidCI18oIVA+X1IoPigvXDckIUNfKjJYVF9cSyUKK01SX15cTStDX1ctLzNfVSU1OS9cQSozL18wJD0zX1ZRTj0/XjdDSFtfVyxXMl9UWTE3P11MO0c3Xz1WVVAKK01fXVcuVF9dJDFVK19BSE4rX1YlPzovXF4wNCtfUUwnIV9SPEYrP1xLKkMnX0RZJjpfUzxYMF9cVy5DX18KK00pQlBWX1tCS0pPXy1OO09fTVoqNl9cMkhGT15bR0krX1A6NjdfWU4qPk9fNFItP18rQlkhX1IkQypfXFkKK00tMz9fQzdRVl9dSyNNX10hLTM7XylSLEVfViE+Nj9eJEE3X19CKEIrX1kyL0RfXVA8NytfMkUtM19VNToKK002T14nQjhTX1orTz9fWEEuSC9eRjktJ19RWVMyX1VRKDQ/XFUmMy9fMVMgW19TNE4qL14pPzdHX0ZIRjQKK01fXTMoUS9fTVZNM180VF03X1M8VzEvXTQ0ViNfNlVJQV9SSEIoL1xLJ1IjXytSLERfU1RTK19eIz1XI18KK01VLDcgX1wyVU0/XEsoUjtfKCFMPV9SREEpL1xUKlJPXywyOEVfU1BQKl9eKkIoJ19XLEsnX10zI1BfXE4KK00qMkdfKUIkQV9SLD4nT1xKKTI3XylSKEZfUUg1Jj9cQSciI18nITw7X1UxJDA/XjZCSDdfOFYhO19aRkMKK01IP187UzxLX1U8SylfUyROKz9cSChSN18rMkRHX1w2V0ovXT41RStfWS1PO19TUFctX1xHKFI3XycxTD4KK01fVCEjM09cWy9ES19MKiY7X1VdMTNPX0RVTT9fSzomSl9UKS02L10zNVVfXzdFPTdfWCVaPk9fRFVdK18KK00zVF06X1JUUC5fXEQoIitfKTIkQ19SLD8oP1xEKCIrXyhBWEBfUiw/KD9cRihCM18oMVQ/X1JMQyg/XFMKK00sMlNfNzRZLl9aQj5GT183U1xXXzNVLUJfUkxTLz9dIDFVL183JVlFX1heJkFPX0ZVXVNfMjRROF9VKTQKK002X11DNjVTX1ZMTzBfU0hdMi9dXkBYL184NV1IX1RFLDM/Xz5WPUdfK1JYVV9SXE4tP140RElPXy8jVSgKK01fU1UgMT9cTi0jW19NSkZIX1wiTEtPXkpEOEtfSEhBXV9aSjRDL15ZR1kzX0NHXVJfXEsjU19cUCxTW18KK00oUjhHX1hVX0AvXjNAN1dfV0xPJV9USFwvP1w8JUFbXygxXEJfVVE+Nl9dSztWV189JyVQX1ddXj8/XVcKK00/J0tfOVZNSV9VVUA4P19GUT07XztEQUlfXVJVVi9fW1hNV181NEEtX1JEQisvXEkpQytfLTM1IF9XSVMKK005X141QzdXX1JbXlpfXjMwUy9dJzEkS18sUy0gX1NAVzEvXTY1NVNfKjIkP19TKEYpX1xTKVJDXy0iSEYKK01fWSYlP09fOVJMN19ROzpWX1JMQylPXEInMV9fKTFUQF9SWEUpP1xLKCFfXy1CSEVfWCogPj9fMlArV18KK01UTCchX1JERCkvXEUoIiNfKUIkQV9SKD0nP1w8JVFPXyVBJDVfUTwyJU9cOyVBS18xMzRSX1o+O0VPXS4KK00yVDtfSUoiPl9dVy9TL183UyxPXywiVExfUjhBKF9cUitCU19RKzpHX1U1LTI/X0JWPUdfLkM0VV9SOEIKK00pL1w6JiFPXyhSOFFfVCklND9eRkVZJ180RDEhX14nM1UvXldLKy9fLyRBMV9VOTs4P145RFknX0QoRikKK01fXkc8VV9dJjFFJ18uI00mX1I8Qyk/XEcoUjdfKTIkQ19SOEIpL1xNKjJPX0tKSkxfUiw/KD9cSCkiO18KK007NiE1X1gtWzpfXj5BV09fPCYtOF9dSzJUL10zNVY7XyszNF9fVDUsNi9dOjcmL18/NzFUX15HOldfXSUKK00yJTNfM1UlOF9WITY2P18+U10zXzEkPTJfWFozRF9dVDxHT18xNEEpX1xHJFEvXFQsU0tfKyJMUl9ZSjgKK01IP1xTLSNfXy4jTSBfUjBKLS9eS0dJV19LSUo8X1hZXT1fXVA5JVdfMENMVV9ZKiQ+X11bOiYjX1JbXygKK01fVCRfMD9cWCxSW185RU06X1NYXC4/XEorIktfLUMwVl9SID0oX1xWLVNDXz0nQVZfVklNPE9eOUVJN18KK006JjlDX1chVTw/XTQ1RS9fNSU1L19eQztVT107NDQ/X1ktPzJfXisuVV9dPjRFL18tIyRFX1JQSClPXSQKK00uVCtfPkZZRV9YWiU9X18pTytPX1c8RyVfVCRfMD9cUSwzW18xJDExX1RBJzNPXFAqQkNfKkFYP19TLEcKK00qL1xXK0JDX0YoViZfXUMpUS9fM1BMK18qQihFX1IsPigvXEYnQidfKzIwRF9SWEYpL1xWKzI/XztGRUMKK01fXUsoUT9fL09LW18qUjhGX1I0QCgvXEQnUV9fKiIsQ19RMC8kX1w0JCErXyVBJDVfUUAzJV9cUClCK18KK01MSjZAX1QtIS5PXlpMKlNfVFw/I19dUzFUL1xUK1JfXylSKERfU0BULE9eX0xaM18yM1xbX143OVZPXSIKK00vM19fKUIoRF9SIDsnX1xDKUMnXzBELS5fWkI8RV9cVCoiM19XTScwX1w6WU9PXFwyJSdfNUVVQ19ZNjAKK01CX147RSkzX1pdWzlfVSEwNl9cXTAkT18pQiRDX1I8Qyk/XEkpMj9fNUUpNF9WPUI5L10zM1UnXyhRWEIKK01fUkxHKj9cSilCM18xVD0kX1Y9ODcvXiRAOD9fVi0jM19VQUA6T10tNUVXXzIkXTtfVTU6OC9dVDpWT18KK01ZTUc+X1QtJjRPXTQ2VidfMUNZIV9dTy9UT10gMUUjXzwnLVRfVkVIO19dJzJET19HSUo8X1MwVi5fXE0KK00rIytfSUoqS19TOFkxL1xPLEM/XytDMF5fWV4yRD9eUUdaJ186VV06X1VRNzQ/XUg6Ni9fO0ZJQl9XVUsKK005X18jTEtDX1VMUyhfXSZfTy9dVjg1X19KSiZBX1IwQyo/XF8tU09fKUIwQV9YTi5CL11HOyZLXzQ1NT0KK01fVyVQO19dXj8nP181VUU2X1UhMTJfXTM0NEdfWF0vKl9WPTg0X19BVE0rX1k9IytfVlFAOD9cUSpDJ18KK00uMyxbX1NQWDA/XitAR09fP0c1Tl9bWlJLP19AUywzXzM0OS1fU0xdMy9dKTJVS18uQzhfX1MgSCpfXEwKK00pMjdfK1JIRV9SXEopL14vQlgvX1M8JlpfXSsgTz9cTikyN18pIVw/X1JEQihPXEooUi9fKiIkQV9SPEQKK00nX11ENlU3X1BLLk5fXFMgTl9cTSkyL18pQVw/X1IwPSc/XEooUi9fKFFEQ19SLDwnL1xAJjInXyoiJEsKK01fUVxEKC9eXUlKJ18+V01QX1wiS0lfXyZQO1NfVl0vMV9TME0rP1xEJ1InXy8zNFNfWkpERS9dNTI0N18KK01ZXUM5X1RJJDIvXEkoUj9fKEFQQF9SID4pX1xNK1MzX0IoNiRfVCBaLE9fQlUtJ19SO0MgX1RNNDhPXSQKK00yNTdfRTheLV9aLjxHL19GVS0jXzclNUFfU0hbMU9cTSlST18sIkhOX1pKRUlfXFstQztfQVdNXF9ZTjIKK01GP1xBJzI3XyhBUEBfUiw9Jl9cSysyS18tUlhOX1IgOydfXzBRPEtfNVYlRV9UTTc3T10pNCVTXzRVTT8KK01fVlVIOi9fPlRdQ18wJC0vX1NdKzUvXFQsQzNfUzw7Jl9TUSEzP10qMVQ7XzgmJUJfVC0oMz9dMDJUX18KK00rMyRTX1JUTSwvXkpJKlNfMDQ1LV9TTSAxP1xJLDNPXzZFKTBfXSMkUT9eKkM4W18/V14iX1lePUlPXTYKK003Ni9fK0M8Xl9TTF0wT1xOKVI/XywyQEhfWzJHSE9cSikyP18oIiBJX1RRJzI/XidBJ0dfSToyOV9WPUwKK006L11MPSdDXzhXOV5fWDooQz9eIkBHX18xVDUiX1VJNTQvXzhSK1tfPDYpPF9dVy9TL19GVExLXz1WSUkKK01fUzRNLD9cXy4jX18wU1UlX1Y9QDZPXU45VidfSyoqPl9dWytRP11NOUZbXzBUMTVfVTk3Oi9dJzBEW18KK00rMjRIX1JURilPXEspQidfLUMkS19WUUg4L18pTzs7X1UsKl9fUkxCKE9cRCdRX18pQVw/X1JURilPXEoKK00oUi9fKzI8RV9USSIvT1xKKCFTX1JbXltfUkxCKE9cRCcxV18oQUw7X1JMRCkvXEUlUV9fKFFMN19SKDsKK00oT1xOKUJHXygiJDpfXFpSS09dUzxGP19QWkZGX1tCU0tPXz1VPS9fLUJcT19SLD4oL1xfLVM3X0U4XV8KK01fVyFEOC9fOlJcU185NV1DX1JEQylfXEMnMidfKCFYR19TVF8xL10lMEQnX006XkdfXUMqUV9fMVAsQ18KK00wNEk4X1UxOTk/XjBCSENfSClGOV9eLzFTP11XPCdTXzFEPTJfUkBDKT9cSikyP19LKjZFX1kyLEJPXisKK00/R1dfRykmNl9SNEApT1xKKEI3Xz9XMVNfVUk8Nk9fJE87V19NSy5SX1tSTk1PXS01NV9fMERROl9URS4KK004L10nM0UzXzw2UUxfXis3Vy9dLDNVT18uNDUuX1gyIkEvXzpUXS9fLjNZKl9TVF4vX103NjVTXy8zXSYKK01fUkBHKz9cNCYhS18pIjBHX1tOVU8/XSIxRFtfMDQ5K19TJFkwX14xQjg/X1ddLzRfVT1JPV9cVzM2L18KK00pU1E1X1MhJTc/XSg3JyNfJVIkT19RVD8oT1xGKTIzXzQkNSpfUyBHK09cPyZBW19JOV43X1siRUdPXi4KK01BWCdfOzZdTV9WWVY+T102OihTXzIlJUJfVSE6Ml9dLDMkR180VFkuX10/KE5fXVo7Ji9fVjxXJl9eNzIKK01SL14gPEZfXypCJEFfVCRZLz9dKTBER186Ri09X1Y9Qjc/XS8xVDdfVFwyX19WJTw4L1xZLyQ/XzhWOVIKK01fVC0gMU9cTilSP18qUjBEX1JYSSkvXEgoUVdfPFZdR19bVlFKT182USwnXypSKEJfUiQ8Jy9cQychU18KK00qQixDX1JMRCkvXFMqQktfKDFQPF9SMD8nX18sUCwnXysyMERfUjQ+J09cRygiI18qIiRBX1JAPScvXEIKK00oMUtfJUE4Q19SREUrP1w8JzE/X1JKVklfVy1QOT9fLEwqV19MKkJEX11fN1U/XFYrUl9fKSFcQV9TIEgKK00pT11YPEYrX0EnQVRfXVsvVC9dTDlGS18qIihGX1I4QCkvXD0mUjNfL0QhJV9TUFkuL15VS1o/X1g9LzAKK01fXTckUy9dLDU2L18xJEU1X1gxXj8vXipAWC9fVUwzIF9YSiNDX10nMiUvXysiQEpfUlxIKi9eT0kqL18KK01KWVY6X1g9Vz0vXkJFST9fK1JETV9STEMoP15KREk3XzQ0RSxfXE5fUC9eX0wrI19OKj5NX1VBQTlfXSsKK001ViNfL1Q5NF9UPS80X10yMzRXX1ctJzZfVS02OE9dIzNVQ19BKCokX10zLVM/XF0wRFtfJzIsRV9SXFEKK00tT10vM1VDXylCPE5fU0kgME9cSCoiT19PS0MgX1RJLjVPXFItU1NfLDNFI19XVVU8X185UzxbXy0kLTAKK01fUjxbM19dITUmU18sM102X1YlQjxfXEMnIjtfK0I0RV9SQEEoP11ANiVTXyxCSE5fXEsiT09eQkVZI18KK01CSEIjX1RdMzQ/XF0wRCtfPFdNXV9TSSs2P11BOCY7XzY1UTBfVSEuMV9dQzZVJ19UTDpXX1ZFPTUvXzcKK01SLCtfWExfJV9YNVc9L1xMKFIvXyxSTE5fVDRfMF9dSDhVW18sMlRLX1I0PidPXzZSPDNfQUguIl9VSUAKK004T14vRVlPXzhGLURfUkxGKU9cTilSP18rMjRBX1JMRig/XUE3NTdfSFk+MF9dMyJPX1xJKCIjXyhBVD0KK01fUjA9Jz9cSykiM18rUkBIX1JYRSk/XEInQVNfM1RVKF9cTyBPX1xNKSIzXyhRUDxfUkxEKS9cTSlCO18KK00oMTQ+X1U1ODhfXEApJSdfLVMhP19RWDwnX18nSlo/XzxGSUBfXD5NSk9eNENYS19XLScwX1NATytfXEQKK00nUidfKkIoQF9VVTYyL11WOkY3X1ZcUy1fWDVdQC9cSChCO18oIUg+X1FEOShPXF4vVDtfLjNAV19bNk8KK01JX18zUUwnX1YsPy1fVC0tNi9dJTJVN18/RzlUX1VFNDUvXyhOOzNfQjguK19UXTI3P1xFKFI3XysiPEcKK01fWkY9Rj9eU0kpX19GSE4mX1pOPUdPXEQnIV9fKzI4Rl9TJEYqX10iMjRHX0dKKkBfWlZLSU9dQjZFQ18KK00zJUE3X1Q1MTVPXSEyJTNfMyUxOF9UKF8vT19FVj1TXzFERTVfVCksNU9dSzo2T19STC8jX1NAXTI/XEoKK00sMz9fJDEoOV9UQSg0P10pMlUrXzA0PSlfUkhKKz9eV0w7R18vJCEoX1JQUS1PXFAtQ1tfPlc1U19dSy4KK01TX1xDKTJLXyciJEdfVS02OE9cSSkjI18oQVRBX1IoQCc/XEQoQVdfKEI8RV9VSTk2L11NOTYvX1c9JywKK01fWypISS9dLDRVL18sQ1hdX1hGMEQvXT44NjtfPDdBTF9ZKig/T14yQUgnXz9HLUxfWlpCRF9fLFFbT18KK003JSUqX1o6MkNPX0FSPCNfRjhCKF9TJEkrL1xYLTNPXzEjVSVfUjhBKD9cQCdRW18rQlBOX1teVkwvXigKK01AWC9fLyQpJF9WOVI9T11PPDdDXytSSEpfUyRGKT9cSyghX18pIiA+X1VNOTRPXSIuMy9fVCwqX19TIEgKK00pT1xCJlFPXykxWD5fUyBJKj9cSCgyJ18qQixDX1JcSSg/XjBCN09fUjtWWF9STEQpL1xCJzFXXyoiLEMKK01fUkREKS9cSyhCR182Jik/X1IgSTYvXFwvJj9fJyFYPF9bVkhIX11CNERHX01aSkVfVzFROy9fPVMsU18KK00vQzRVX1IsQShfXEgoIi9fL0NAVl9TTFQrT11HNlVTX0UoTitfUkxEKS9cPiYxX18mQUhDX1NRIDIvXFwKK00uQ1NfSVlONl9cPllML187UjxXXzIlITpfVEUwN09dLzFUT18oQiRHX1UhJS9PXiE+V19fMEQpL19RVDsKK00nT1xHJzIjX0lJQjVfXSclT09eSkZJP19NSj5HX1MkSCovXEcoUjdfLUNQXl9UUTA0T104NSU7X0lJWjwKK01fUzRaLU9cQipST18yJSU4X1Q5Lzc/XTA0NVNfQVhGLF9eLzRWL10yNCYjXy1UJStfVV1AOD9eXk5bS18KK00tQ0UlX1JASy1fXF8wNEdfMURBL19UNSgzP10oM0UjXyoyRExfWlZJTD9dKTI1K18sM0BeX1MkVS1fXSsKK00yNDtfUlwrIl9SNEAoT1xCJkFXX046VlBfUkBDKT9cQCcyL18nIUxBX1E4NiY/XEUqIkdfTFpSRl9dQysKK01RT19CVU0rX05bPlVfVCknMV9dUD1HK180RUE0X1NEXjBfX0NVXS9fW11TNF9eUzlUP19TWC1DX15ePz8KK01fXDJbTT9dJS5TP18+RlFJX10yXk0/XjpCSD9fKzI4Rl9TXF0wL1xWK1M7XychVD5fU1BbLk9eNEQoW18KK01MOjZAX1chSDsvXEcpUzNfMERBOF9WOUQ9L1xFJzIjXytCLEJfUlRCKD9cRSgxX18pMiw+X1IgOCUvXy8KK01QTCdfKzI4Rl9RXDgmL1xCJlFPXyoyKEJfUlxIKi9cTSlCO18sIkhCX1kuLD9PXyxQK09fKlIwRF9SKD0KK00nP1xFKCIjXysyQEhfUkxCKE9dPzklW183RjVTX1VJOjk/XDsmMTNfUEpWSF9UPFksL15GRzk/Xzg1XToKK01fXVstUz9dJC5TT18oQiBCX1FYOSc/XE4qUktfLEJYTF9XPU88T15CRjlHXysyOEZfUiQ8KE9cPidCP18KK00wND0xX1Q9JzJPXjtEOFdfTTpGQl9dSyhST10yNkYzXzEkUUBfUVw+Kl9cNiZSI180VFEmX1Y1PzlfXEkKK00pIyNfKkIoRl9TQEkrP15MRVk3X1Y8QyJfWT4lQE9dWTpGS18qUihCX1I8Qyk/XE8sQz9fM0UlNl9TPFcKK00uT14mQDgvXychXEBfUFw1JV9dKzQ1R18wJD0zX1Q9KDRfXilCWFtfVlxTMF9UNSM0X1xXMDRPXyhCLEQKK01fU0BVLS9cTCtTT18vNCEsX1QpJDMvXSwzRTdfMlRZM19UKSgyT1xFKTJDX0w6VlVfVCUhMk9cTyxTT18KK00tQ0ReX1RFKzI/XjBCWFdfKDFUP19SXEgqL1xYK1JfXzBDVF1fVEEmMi9dSjk2N19EOEYnX1pGPUY/X0sKK01XLTtfVTxDI19VSTAzL11TOzZPXzomPUZfVF00NE9cXjFEL18zRSkwX1w+Uks/X1hXPTtfXj1bN19fW0MKK01XL19dWS1XX1ArKlNfUkxDKU9cQSZRR19LOUowX1o+OERfXFAqQkNfMDQgX19TOFEsX10lMlRXXzEkQSYKK01fWSYoQE9eOkMoR19DSC4oX1JQSi5PXSQxNVNfPDZVXV9STEMpT1xNKEInXywiNERfUVg6Ji9cPichP18KK00mQTAyX1xCX09fXEcoQjNfKEFUPV9SJDomT1xHKCIjXypSMERfUlhHKV9cTSlRX19BWCFSX1xfI09PXEgKK00oMidfKCFMO19SOEEoP1xGKDInXylCMEFfVVFAN09dRzsmS185Ji1CX1IoPicvXl1KKi9fLVJUQ19ZVjgKK01ET1xdLlM7X1dMVy1fViU4Ni9cQygyL18qIixFX1M4UytPXiA+VzdfMyQxIF9aSkJIL1xKKFIvXyghTEEKK01fUUQ5KE9cXTElI18vM1klX1heJ0E/XTkzNEdfWCxbMl9UMSw1T10gMiVDXytCRE9fVEkmMi9eIT4nK18KK00oMiRMX1M0Ui9PXEgoUjdfLDI8Sl9aJjFDT18gTDpPX0opOjNfWzZGSU9cTChSL18pQihEX1M8WTAvXS4KK000JT9fJiFIP19UWS40P1w+KCI3XzAkLShfVFEwNi9cWzA0T18zRSE4X1ZJTDtfXzRRPEdfLlNFKV9SRFMKK00vP10nMiRHXztWUUtfUjRILS9cUy1EK18vRCEoX1VRPjk/XSszRS9fLSNIXF9RUDwnX14+RkorXzFEOS8KK01fUlBPLl9cTiwjP18sMzBVX1RNKjQvXktJKjNfVlxbLV9eRzhWL19LV01XX1hNMzFfW15NSj9eNUEnW18KK009VjE8X14/MlM/X01WXT9fVFxPJ19dOytST18zU1xXXy9UKSNfVl1RO19fSlZdO19ePVs3X19fRFc/X18KK01ZPVtfX143Pl9fX0dYL15CRDk/XyhRTD9fUUQ0JS9eLD5WW19JKTIrX1I0QCgvXF4uU0tfMSNcX19TPSEKK00xP10kMjQ3X0NILVxfWF4hP09eSUgqI18vU1EoX1NZIDU/XTg0RiNfK0I8R19SVEEoT1xNKEInXypCNEAKK01fUVA6JT9dRzhFV19SW18gX1JIRSlfXEEnIVtfJ1FAOF9SPEAoL1xSKlJPXysiNEVfUlBIKC9eIT8nI18KK01RW05WX1JEQihPXEEnIVNfKFFYPl9SWEkqP1xIKiI3XzgmKUVfVjVLOV9dRDkmP18oQVQ9X1wqTklPXF8KK00tIldfQFgpW19RTDwlT186UlxTXzxGOUdfUkRFKV9cUCoiM180REkgX1dJUThfXTozVENfS1oyQ19TJEwKK00rL1w8JVFXXysiSFNfU0UjMz9cSSpDJ18/VzlWX1I4QCdPXzZSPFtfMkRVOF9UNSg0X14nPydPXzdFQTYKK01fUkBAJ09dLDNVS18uQ1EkX1FYOicvXEspQkNfRzkqMV9bKkdIL15cSko7X086Wk5fUlBDKF9cRihCM18KK00tMzhdX1U5ODgvXEAoQkdfJyFYQ19YUi1FL10qMyUvXzAkJShfVjlHPE9dJjI1M187RyFTX1peQ0kvXSUKK00wVS9fKiMgWl9WQUo7P1xaLiNPXykyQFRfUjhJLT9dIDBES181RUE/X1QtJTJPXFcvM19fKzJUUF9WRUUKK007P1xfMCQ/XywjJFxfUzRXL09dJjJEU18rUyRWX1dZUjtPXkBCWEdfVDtGVl9XNUI3L184Uk0rXzYkWTgKK01fUkBBKl9cQCZSJ19aPTMyX14nL1JfXSUvQ0NfM0Q5Il9UVS0yT11dPydPX1csXy5fX0M5VF9fX1o+J18KK01fXjs/X19fR1gvX19ZTV9fXz4zPV9ZUiRDP1xKJkIrXzAzTFlfV1VMN09dWzpWJ18pIVxDX1QkWS1fXSIKK00uQ0NfK1NAXl9TKFUtT14rQEdPXz42UUdfW1pUTC9cVi0zU18zVSlEX1RRKDYvXEsoUjtfKlIkRF9SXEMKK00pL1xMKDFLXypCMDxfV0FQOU9fMlFcI18sQkBLX1IgOidPXEEmMVNfK1I4Rl9SWEMoT1xOKTI3XylSLEEKK01fVk1KN19eWEtaR18qIiRBX1IkPCdPXEMnQVtfKyJARl9SUEMoX11COFYzXzhGTUtfViVEOT9cQCdBT18KK01OSkY7X1I0PSZfXVc+J0dfJiE8Nl9cMl1PP140QUg/XyoiID5fUjg+Jk9dOzQ0P185NVEuX1YpPjVPXlkKK01LKk9fKlJISV9SOD8pT1w5JTFbXy4kJShfUjxGKz9cUCpCW18pQkBGX1dNUzw/XF8uVDNfLTNNK19VMTUKK003L10vNDUzXzE0TTNfVFEyNy9cWi40I18nQUA8X1JMQylPXlFJWi9fSilWNl9bQkRHL15XSVozXysyKEcKK01fUjQ/KF9cUCtTN18zRF02X1IwRitPXUw7V0tfNzVZSV9VOT85P101NDVHXy1TNSVfVCEqNj9cVy8jU18KK00rMkxGX1NdIDJfXEcrU19fK1M5JF9TJFYwT1w8J0JXXyZBVEhfVDEmM09cXC9EL18tMzRYX1NQXzEvXEUKK00pIktfKkI8TV9TXSExT1xULiQjXy1DQF9fU0BaL19cRilCR19IKTonX1w2TUpPX0dULC9fSFktX19dLycKK01SL1xeLVNfXykxXEdfUkRCKE9fS1RdO19VPC8lX1QsXzA/XUg6RldfNFVVQV9bNlFLX19YWD1TX18uN0AKK01fX19HV09fX1k9U19fXjs9X19fRFc/X19aLidfTVlWQF9TJD8oP10pLzNHXz1GJTVfV11NOF9cQicyJ18KK00tQlhMX1NcVy0/XEQpQldfKSIoRF9XVVk8P11NODVTX0sqIjxfUyhOLU9dNjZWV18yNEU4X1MkTCtPXEgKK00nQidfLCIwRV9TLEgoP1xOKiIjXzs2NTtfXEZeTV9cUyoyU18oIUg+X1IkOScvXFApUj9fK1IwQ19SXEYKK00pT1xBJzFPXzdVWTNfWFolP19cRygiI18oUVhAX1FcOiZPXEopQjNfKzIwRF9VRTo2X106OFYvXzo2UU0KK01fUVg9KF9eUUk5W18nUTw6X1M8Vy5PXSMwI09fTzs2U19aLjdGL1xKKEI3XyoyLEFfVTUsMT9dLjFTT18KK007Nk1EX1w6WU4vXE4rMlNfKCFEQF9SREUrT10wMyVTXytCWFdfUTQ9Jj9dJC9TR187JiE8X1NAUy4/XSkKK000JVtfMTRZPF9UJSYzL10iMiUrXy9ENTFfVCEkMy9cPSZRV18pMVg+X1siREdfXjxDKC9fTSoiOF9bLkMKK01IL1xJJ0IvXykhWEJfUzhVLl9dNTVVW18qUyRZX1VZRjwvXT84Jk9fNzY5TF9VRTU3P1xPKzNXXy4kKSwKK01fU0RdLl9eSEo6L18pIkxRX1FYSC8/XEYrNCdfJzIoTl9RVEIpX1xQLUNDXy4zUSFfUUQ7J09cOiZBV18KK00tU0hfX1JISStfXEInUjdfLkNRIV9STE8tX1xSLSNPXytTJFZfUzxXLk9ePERYK19RSlZIX15DMFA/XkQKK01EV1NfUyteXl9TTFQuX1xBJ1JDXylCJEdfXjcwUy9fL1A7W182RVE/X1NEXS9fXiA+N0dfXD4jOl9fT0IKK01VP19fWS1HX19eN0FfX19DV19fX1k9W19fXjc8X19XRFc/XkZEOFdfK0IoPl9TXFgsT11ENDQ3Xz1GOTwKK01fUUg1Jj9dIC4jO18sIkBGX1JERSs/XEUoUjdfOiZBP19VTTIzL15YSko/XywiSFJfVFkxOF9dJjIlP18KK00sIkxNX1JMQSkvXFQqIkdfLCI0Pl9SQEImT14tQTdPX1FLTlRfUlhEKV9cPyYxV18nUTw6X1JQQyhfXE0KK00oQidfKyIsQ19SOEIoL1xaLjJbXzdVOTBfUjg/J19cPyZBU18qIixDX1IgPCZPXE0pIjNfNFUxNV9VWUcKK005X11COTY7XyghVENfWko5RF9cWCpSS182RTEyX1clSzhfXlRKSjtfSVlOPF9SOEApL1xGKFIrXzY1KSwKK01fVCxdLF9dVj0mX19SW1pdX1JESClfXEEmQidfKCFQRV9TRF4yT10gMEQ3X0BIIVhfWUIuQk9cQCcyL18KK002RVFEX1RBLzZfXS01VjdfMDQ1LV9ULSY0T10sNUYzXzM1NT9fUiBBKE9cTyoyP19KOVY2X1oqLEBfXkwKK01FSFtfSFkuMF9SRD4oX1xEJ0IrXypCUFFfVEUwNU9dKzUlT18yVTU/X1UhMTcvXTw5Nk9fTVsuW19UJF8KK00zX1xJK1NHX0VZLjtfUig/KT9cSy00I18pQlheX1FIPis/XEEoIjtfQTgiIF9UWTI0L1xVLkNDXyYxTD4KK01fU0RYL09dITEkR18nQVRDX1M0Ui4vXEEoUkNfKiJQVF9SNEcrT1xcL0QvXy9DWSFfWUYvPl9fIUlJX18KK01ZLE5aX1lGJjtPXzNQW0tfRUhCKV9TLE0sP1xHKEIzX1ldKyZfXDpdTV9dLzVVT184Nj1JX14nLFQ/X1YKK01XTU9fX04/O19fX0hXX19bV01XX1BaNkdfX1NAVy9fX1ldW19fXjs/X1suREdPXEYnQUtfLjMwTl9VPSoKK00vP11ROFVLXyYhKDZfUyhJKj9cRicxV18qIiRJX1FUOSZfXSszJDdfNDRBIV9cQlZMX1xIJ0I/Xzg2MVUKK01fVDUoNS9cWCxTL18pUVRAX1MsRypPXFMqIidfKlI0PV9WWUU3T15fTSpXXyxCRElfUiQ8J09cPyVRS18KK00qUihCX1MkRik/XEooMidfKVIkP19SSEgoL1xfLiMrXyghQDtfUiA7Jz9cRyhCK18pMiQ/X1JIQyhfXS8KK000JSdfNzY5Rl9WJUQ5P1xDJ0IrX0lZMipfVlk9NV9dPDQkP188Jjk7X1pKPkY/XlNJOjtfKVIoRl9SMEAKK00oT10pMSNfXyxCVEdfVy1RO09fK1ArX18rIkRIX1IsPSg/XEEnMjdfKFJcVl9TSFwuT11KNzVDXyhRWEAKK01fVDEpNT9dIzJFO18wNEUzX1QtLTYvXS80RVdfMlUhPF9UTTU5L10sNVYrXygyMEVfUlRIKF9eR0VYW18KK01OSjY5X1o2L0FfXSQtQy9fKVFUQF9SOEApL1xOK0MnXy8kLSlfVD0wNV9dQzlWX19ISipLX1UxPTkvXE4KK00qUydfLTMxIV9TNFoxT1w6JiJDXy4zPSdfUkhSME9cPCgiQ18oIiBDX1hSKEFPXUc2VTtfQkhaJl9YOisKK01BX11cPydfXy1TRF5fVFkxNU9cOycyK18qQjxNX1M4WC8/XD8oUk9fKzMoWF9TLFUuT1xfL1QrX0FXSUcKK01fW1pDRi9fNk5aS19AVyE4X1w2TUkvXkFESFdfLDJISl9SSEMoX19JUzxfX1FbSydfUzBZNE9cXy9VM18KK000JDE9X1VFMzlfXUA3JlNfOlY9V19XTUY8T14uPUdPX18uKz9fX19IVz9fX1pOJ19IWSoyX1JAPCc/XFgKK00sIltfMiNYVF9WOTo1P1w7JEErXypSLEZfUiw9KD9cSykyR18oQVhAX1NYWy1PXSMtUyNfUks2U19SWEYKK00qT10tM0VHXzlWMVBfUyRJKT9cTyhSM18qQVBEX1JMQicvXEUnQUNfOyYtPF9bLkhIP1xWKzJXXydRSDwKK01fUVA0JV9cTSkiM18rMihBX1JURCkvXEUnQVtfKDFYOV9STEooX1w2JEEzXydBRD1fUkRBKS9cRicxV18KK00qIjBCX1NdIS9fXUA6NkdfOFY9SV9SID4oP15AQzgnXzglISZfU0RNKU9dPzU0T19EKDFfX1s2SElfXEYKK00nQidfKUFQP19TNFAsT1xOKyJbXzg1VT9fXD5eT09cTikyN18oUVhAX1IkPyhPXDsnMitfLUM8Xl9UVTEKK002P1xeMSRbXytDKFpfVEUvNj9dIjI1N18xNFk8X1QhKjU/XSY0JU9fL0RBM19URTM3T1xBKFJDXyoyJD0KK01fWkI4Q09eWEk5T186RUk3X1g1WD1fXEImUU9fKSIoRF9SQEMoX1xULjNfXzBEQTJfWyJHSV9eRUgqI18KK00yNFk6X1RVKzM/XFguRCtfKDJMWl9TQSM1L1xILDQrXycxVEhfUkREKi9eQUc5T182JS0nX1o+PEQ/XikKK01CN1tfNzVNOF9dPzFWP1xZLyQnXzJUWTNfUiRDKi9cTStTM18rMlxUX1JITi1PXEssIztfLiNNIF9TXSEKK00xL11LN1UjX0s5QiZfW0pCRF9dQzREM19MWVI9X1JcQylPXEAoMitfKUIkQ19eUzBUX15bS0svXzlXKVkKK01fVD0oM19fRlYuI19aPUdBX15LOlhPX0ZVTVtfWU1HRF9dUyxVL19aWT4nX19eQztfX19GVl9eQ0UpN18KK00oUUQ8X1JcSCovXSAtUyNfOCU5Ml9RSDEkP1xGJ0InXyghSD5fUjA+KE9cPiZBU18rMkxIX1IsOyVfXyIKK01MWldfLjM0U19UKSczL11MPCcrXy1CWExfUlhCKF9cUSkyQ18sUkhEX1IwPSVfXFEqIidfRFhCIV9TRFAKK00sL1xBJyFbXydRPDpfUkhBKD9cUCkyM18rUjhGX1I0PidPXDglIStfJyFIN19RNDAlL1w7JUFLXylBWEEKK01fUkA/J19cSilCM18xND0lX1YtTDsvXUA5JjtfKCFcRV9YSVg7T10wMENHXypRXDtfVDRbLD9dVTo2M18KK01OSlZMX1JEQSkvXEYmUitfK1JAT19RUD4oP1wvJEEvXzQ0TSlfUkRAKC9cQSchW18oIVhBX1FMPShPXEkKK00qQydfLyQhKF9UOSw1T1xNLDNHXzZGIUpfU10mNE9dKTRGI18zNT1CX1QtLTYvXSIzJT9fNDVNRl9SJEMKK00qL1xKKEIjX0kpOi1fVEhcLF9eKT9HV18mIFwvX1IwPyg/XEEnIiNfNCQ9J19UKSQyP10lMlUvXzlVXT0KK01fVylNOz9cXTBEW18rUlRPX1NdITI/XSU0RjdfKyM5JV9SQEgsP10xMiRDX00rIk5fVjE7NS9eXUspX18KK01IWF4nX1U9ODQ/XUg7NkdfT1tXIF9TKFQuP10vNDU7XygyLEhfUyBSLV9cSyszK18oMixLX1JUTy1PXFoKK00vJCdfLUM4WV9WMTs1L14jPFZHXz9GWUVfV1FROk9cTigiJ18pMVRAX1IsQShfXEgoUjdfXC07M19cNlgKK01NX103NzVfXyxCVE1fX0c9Vj9fX1g9T19fXic7X19fQlcvX19ZTV9fX147Ql9fX0pYX19fWj4jX19eNz4KK01fWiIxRT9cQiZBW18qMjBGX1MoSyk/XTczNEdfJyEsM19SND0oL1w+JiFTXydBODpfUUw3Jj9cRCkyO18KK00nQUQ7X1tWUEpfXFErUlNfNjYlRV9YKidDL1xYLCMvXy0iQElfUlxEKF9cUSoiK18nQTgyX1QoWSxPXTMKK00yJCdfKlIoQl9SKD0nX1w+JUFHXypCJEFfUkg/J09cSyhSJ18pMVg+X1EwLyQ/XDckQTtfJTEgNl9RMC8KK00kX1xFJzIjXypSKEJfUkxHKT9cSisiS185VyFQX1ZFTTtfXD8nQjdfPyZRQ19VSS4xX1xRKUI3XzEjTFQKK01fVVEwMl9fIk07M18rIjBHX1I4PSkvXEMnMidfKjI8RF9XUVU7X11OOSYjXygxQDhfUVQ4Jk9cOCVBR18KK00nIVhDX1E4NydPXSAxJFNfNDU9QV9SKEYrT10sNEVTXy9UOTJfVD0wN09cXTFVK18xNF06X1QxLjY/XSkKK000VVtfKVI0Tl9SRD0nT104MyQ3X0EnTVVfUVg5Jj9cRyhSN18oUVhCX1IkPChPXVA4NidfQ0hGLV9UJSYKK00zL109NiUvX0hZXj1fU1EhMz9cTysyX18uQ1EkX1Q1LjcvXEoqUytfOCVJOF9aQj1HL107NUUjX1ArLkgKK01fWjYyQU9eL0BXS18wREkmX1UtOzVfXVA8RyNfLUM8Xl9UWS81T1xIKkJfXy5DUSFfUlBOLF9cPigiQ18KK00oIiRIX1NMWjAvXEQoQjdfJ0FIOF9UKFotT10wMTQzXygxVD9fUjRBKF9cQidCI18oUVxBX1I4QikvX0kKK01VLSNfSFlWO19WUVQ9T10yMzRfX109Xz1fX0tBWC9fW1hOJ19fTjdEX19fSVhPX19aPitfX15LQl9fX0sKK01ZT19fWl47X0U4Qi1fUiQ4J19cQSciI18qQjRAX1RJIjAvXDUjQFtfKSFQP19RVDcmX1xAJiFPXydBTDoKK01fUkBEKU9dMzMkU19NKj5GX1MoUCxPXUE6JltfMkRdNV9SXEcqX1xTKiI/XytCMEBfUlxFKD9cOyUxL18KK00rQkBAX1NcVys/XDskUSdfKjIwRl9RWDkmX1xLKEIrXywyOEVfUkRAKC9cSCgiL18lQSA0X1FQNidPXDMKK00jQTNfJSBcM19SJDwnT1xFJ0FbXypCNEVfU0BaLi9dSTxHK184Vj1JX1FMOig/XU44RUdfODU1MF9TIEcKK00pX1xbLVJfXy1SWEdfXD5ZTU9cUSoyU18pMiBCX1NMViw/XitAR09fOjVFL19RVDEjP1xJKCIjXypCNEcKK01fUzBSLT9cNyYxW18pIjRMX1RFLTU/XTY3JjtfMSRJNF9UXTQ4L1xaMDRXXzBETTlfVS06OU9dIzM1Q18KK00xRSU8X1RZNzk/XEInQj9fKyIoRV9XNUs5X1w7JUEnXylCKERfUiA+KD9cQSciI18nMTg9X1lKLUMvX0AKK01WLU9fL0QlJl9WITs1T144RSkrXy0zTSNfUyBQLF9dKzNVP18mQVxFX1hOKUFPXlFJWi9fOFVJOl9aSkQKK01HL146QldbX0lZQitfVjVFNy9cXDJER18qUzxUX1RdNDQvXSAwRD9fNEU1Ol9RTD0oT1xaLjNfXypCUFEKK01fUixEKl9cRylTI18wVCUkX1JMRyo/XEUoMi9fLjMoUl9cJllPL1xKKiJPXydBWEFfUiRAJ19cSChSL18KK00qMjBEX1tKS0pfXVM8Jl9fNzY1SV9SXEkrP19WWC1DX18+LzhfX19IVz9fX1peI19eXjM/X19fS1lfX18KK01aTjtfX15XR19fV0pZL14tPyg7XyghPD5fUVQ7J09cPyZBU18uMzBWX1E8MyU/XDwmIUtfJ0FIPF9SLD8KK00nP11TO0ZHX00qTkVfVSEjL09dMjJEQ18qMjxJX1QxLDNPXSMyJFdfLCJMTV9SSEMoX1xGJ1FfXyoyKEIKK01fUUAyJU9cQyghT18pMjQ4X1E4MiQvXEMnQitfJ0FIPF9STEQpL1xMKSIrXylSKERfUjxCKU9cNiQxN18KK00lMSA0X1EwMCRPXDwmIUtfKSIgQl9SMEAoT1xKKEI3XysyTE1fVkFRPD9dPTkmM18nQUxBX1U5LzBfXVIKK005JidfKEFUQV9TQF4uT1xDJ0FDX1ErPlJfUlxHKk9cQyghX18/NzVTX1IsNiU/XEUnMU9fKEFUQV9SMDwKK00nX1xIKDInXygxVEVfUUA4KD9cQSgyS18xVEEzX1RZMTc/XS00Vi9fMURZPl9UNS03P1xaMEUrXzZVXU4KK01fVF05OV9dJzVGL18zVUFGX1I8Ris/XEQnUi9fKCFMP19SMD8oX1xGKSI7XydBSDxfUUw3Jj9cNyRBM18KK01OSzpUX11bMVVPXSUxJEtfNkUpLl9ZPjFDX1xZLjNTXztXIVdfVSEwNj9dRTomR18/V11cX1ghWD0vXlwKK01KWjdfR1kyLV9ZPixBP11ENyVDXzFUVSlfUz0iMF9cSi0zO18tI0xbX1guKUE/XSkzVSdfKTIwSl9TKE8KK00tP1xBKFJDXylSVE9fUixEK19cWi8jR19ZLidAX1JMSCtPXEEnIVtfSUlOOl9SJDknL1w/JyIrXytCTEoKK01fWi5BRj9ePEY5M19VTEcoX1tGTUo/X0FVXS9fXi47Q19fT0JWX19fWV1bX19ePz5fX19IV19fX1pOK18KK01fXk9DX19bSlhPX19aXi9fX05PQ19XVUw9T1w+JTFTXyYhODlfUUAzJT9cTSoiS18mITA2X1FINiYvXDwKK00mIUtfNjUhKl9TQE8qP1xUK0JTXzAzUF5fVDUgME9cQigiL18wNEUtX1U5Ozg/XEgoUjdfKlIwRF9SOD8KK00nX1xMKTI3XyVBIDRfUUg3JU9cPCZBN18lMSQzX1E4MiUvXDslUUdfKUFcP19SWEYpL1xGJ1FfXykyIEIKK01fUTgxJF9cOyVBQ18pMiBAX1JERCkvXEYoMidfKUIkQV9SPD8oT1xGKSI7XzlXIVBfVi1KOk9cPiZSJ18KK00zRDxbX1ZdQTdPXDslQUtfMCQ1JV9RTDomP11HOEVTXylCMD9fUVg/KC9cNyRBO18oQUg+X1IkPyhPXEEKK00nQjNfKDFEPF9SKDsmX1w7JVFfXygiKEpfU0RbMF9cXzE0X18yRSU9X1QpKzY/XFowVSdfMURdPV9VOT8KK007P1xfMyVHXzIlNUJfVEU0N19dLTVWJ18tUzhcX1JAQylfXEAmUV9fKCFMP19YJVk/L1xJKDIzXychPDkKK01fUUw3Jj9ePkYpO19LSV5EX1QtJTJPXTc0RFdfRDhKKl9UQSIxT19DVT1XX1k9S0FfWSYvRi9dPDUlP18KK01PKlJDX1tSSUc/XV0+VzNfMjRRJl9TXSQwT1xZMVQ7XytDPFdfU0UiME9eLkU5N18rQzRVX1M8XS9fXFkKK00uI1tfJiE0O19TJFMuL1xVLlNXXypCTFZfVSEuMl9fPFU9N18pMjhNX1E4NyYvXFcsIyNfKVIkRV9RQDMKK00lX1w+KCFXXzlWSURfV0VWPD9fQFQsP19TS0JPX19TRFZfX1hXTTdfXy4rOV9fX0ZXP19fWV1bX19eQz8KK01fX19KWE9fX1peL19fTktCX19bSlhPX19aXi9fO0VVR19SJDgnX1wzJDEzXyYxMDZfUiA7Jz9cNSQxL18KK00mQTg4X1FINiYvXEQnIUtfKiFcP19ULF4vT1xdLyNPXzBTVSFfUVg7KD9dKTQlO18zRSk6X1M4UC0vXEkKK00oQitfKlIwRF9SSEMoX1w2JEEzXyUxLDVfUSwxJF9cNCRBM18kQFgwX1IgPCdPXEMnIVNfLSJQSl9SOD8KK00nX1xJKEIrXykhVD1fUkBBKD9cSShSJ18qMixBX1JEQyg/XEwpQjNfKkIoRV9SWEwrT11COlZPXzk2UUwKK01fUiA9KF9cWy0iQ19BR0FVX1FAMyVfXDclUTNfN1VVOF9VSTg0P1xDJyFTXyZBQDtfUig9KD9cQyZRX18KK00oIUw/X1IoPShfXEAmIU9fKjIoQl9SNEEqP1xEKUJbXytDMFxfU00jMz9cXDFFJ18wRFE3X1RJNDdfXSQKK00zRUdfMVUlPF9TWSg1T10hMiUzXzdFWUdfWSYzRi9dIS9UK18oQVRBX1JERCovXEUoIjNfM1QtJl9SQDkKK00nP1w+JUFHXydBSDxfXVM0VE9fUFdeN18wVDUqX1Y1QzdPXiJAKCtfOCVJPl9eQzZWT19JVz1bX1YtKzoKK01fXltAWD9eXUtKJ19CSClYX1RVLzM/XFgwNCdfLiQ9J19SXFkvP10lMkRLX0I5Ji5fUyBZLj9dITMkV18KK00vVD0rX1IsQiovXj9HKitfLFM0Wl9SUFQtT1xRLENXXzc1RTdfXjs4Vj9dKjA0Q19GKSowX1lGNENfXi8KK01DSFdfQzhOKF9WMUk5X109OSYzXzlGNT5fXlc9VF9fVlctJ19fXV81X19bQ1YvX19ZTVdfX147PV9fX0UKK01XL19fWi1fX19eT0NfX1NIWC9fWllNW19fTktCX19fSlhPXToyNS9fKDFAP19RTDknL1w9JiFLXyYhLDUKK01fUTQxJF9cNiRBM18lQSg0X1FUNic/XEUnUi9fLyM8V19UNSIvP1w8JSFDXyZBOD5fVFUzNl9dKDJVO18KK00vU0RdX1I8QCgvXEImUU9fKiIkQV9RNDIkP1wzJDEzXyYhODlfUSgwJE9cMyNRJ18nMUQ7X1I0PidPXFIKK00qQkNfKjIkP19TIEgpT1xKKEIjXysiMEJfUkBAJy9cTylSL18rQjhCX1JIQidPXEooUi9fKFIkQ19VSUMKK004X11DOkZLXykyKEhfUyBJJz9eOEJIP18tMyBUX1c1UDpPXSUwQz9fKFFMN19RUC0kT1xCJkFXXygxTDkKK01fUjw8Jl9cQScxT18nUUg+X1IsOydPXEUnQVtfKTIkSV9TMFYvT1xULkQrXzBUTTVfU1UnNE9cVS9UR18KK00wJEk0X1RdOThfXFgwRFNfLDNNKV9TWF4zP15LSDpPX0kpWkJfU0xWLk9cRigyN18oMVBAX1FQNyZfXTIKK00wVD9fLEIsR19SKDgmX1wvIzBfX0o5Wj1fXi8yVi9dOzc2K183JUk1X1clVj1PXUE3JiNfWS0rNF9eLzkKK01VP19IWC4zX05KVkhfWEFePC9dLDQ0T18uQ1xfX1NdJzI/XEErUytfNDU5PF9YQixCT1xWLyNDXzBUTS0KK01fU0kmMk9cWjBEO18nUVhEX11DNVZfXFYuI1dfK0M4WF9SXFAuX109NjU/X1o9PzlfVVUrMz9fQFQ8T18KK01HSTIpX1VdQDY/XT03JTdfNiVVPV9VOUI4P11PO0Y/X1stXzRfXz8/VU9fXVc9N19eXV83X19TQlY/X18KKz5ZTVdfX04zO19fX0dXT19fWk4rX15ePz9fX1tKWE9fXVo+J19fXkNBCisgCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0aW1nci51dWUgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdGltZ3IudXVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZTk0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdGltZ3IudXVlCkBAIC0wLDAgKzEsMTE3MCBAQAorYmVnaW4gNzU1IHRlc3QucmF3aW1nLnJldgorTV9VSSk0X1xBJiFfXyZRRDxfUVQ4Jk9cOCRRN18lMSQzX1E4MiUvXDYkQTNfJzE4PV9SND8oX1xcLVM/XworTTE0KF1fUVA0Ji9cOiVBW18zNS07X1RBKzVPXF8uM1dfKVIgQF9SKDsmX1xIKDInXyUxKDFfUSwxJS9cOAorTSVBR18kQSAyX1EsLyQ/XD0mMU9fKTFYPl9TKEoqL1xJKDFfXywiQEZfUkhCKC9cTCkiK18qIiA8X1JcRworTShfXE4pQitfKkIoPl9SSEMoX1xDKDIvXzZGLUNfVi1KOk9cRShCQ18sIkQ9X1lCKkFfXFUsIzNfPTchSgorTV9UNSItX1xDJlE/XycgVDJfUig6Jz9cQSZRR18pUVA7X1IkPSZfXD8mQVtfKFFMPl9SND4nT1xFKDJHXworTS0jOF5fUzBaME9dIzJVN18vND0yX1M0XzI/XSAyRTNfM1VFQ19TQSIzL1xRLlRHXy9DWS1fWk5BSl9eRAorTUdKK18uUzhaX1I4QSk/XEEnIiNfJyE8O19VKSMxX1xSKFI/XyhBQDtfUFwtI19eSUdJV19YXSs4X1VNPQorTThPXTw2RTdfPDc5Vl9WJTw4L19EVE0zX1hdRzVfXkNAWS9eWks6Q19CJ1lQX1RRMTJfXFovU19fL1Q9KQorTV9SJE8sT10xNUVTX0IoUipfUzhcLi9dIzJUV18uRDkqX1NJIjFPXD8nQjNfVi03O19TOFgvP1xOLUNDXworTStTIFtfVVU5NV9fSVVdR183NE0tX14jMVJfXj5FKEdfN1YhOV9VVTw1P104NzVXXzVGKUFfVl1OOV9fTAorTVddM19dXV82X19XPVU/X1tXXT9fXy4rOV9fX0ZXP19eWS1PX19ePz5fX19KWE9fW1ldX19fTktCX19XSQorTVg/X19aLidfO0VVR19SJDgnX1wzJDEzXyYxMDZfUiA7Jz9cNSQxL18mQTg4X1FINiYvXEQnIUtfKiFcPworTV9ULF4vT1xdLyNPXzBTVSFfUVg7KD9dKTQlO18zRSk6X1M4UC0vXEkoQitfKlIwRF9SSEMoX1w2JEEzXworTSUxLDVfUSwxJF9cNCRBM18kQFgwX1IgPCdPXEMnIVNfLSJQSl9SOD8nX1xJKEIrXykhVD1fUkBBKD9cSQorTShSJ18qMixBX1JEQyg/XEwpQjNfKkIoRV9SWEwrT11COlZPXzk2UUxfUiA9KF9cWy0iQ19BR0FVX1FAMworTSVfXDclUTNfN1VVOF9VSTg0P1xDJyFTXyZBQDtfUig9KD9cQyZRX18oIUw/X1IoPShfXEAmIU9fKjIoQgorTV9SNEEqP1xEKUJbXytDMFxfU00jMz9cXDFFJ18wRFE3X1RJNDdfXSQzRUdfMVUlPF9TWSg1T10hMiUzXworTTdFWUdfWSYzRi9dIS9UK18oQVRBX1JERCovXEUoIjNfM1QtJl9SQDknP1w+JUFHXydBSDxfXVM0VE9fUAorTVdeN18wVDUqX1Y1QzdPXiJAKCtfOCVJPl9eQzZWT19JVz1bX1YtKzpfXltAWD9eXUtKJ19CSClYX1RVLworTTM/XFgwNCdfLiQ9J19SXFkvP10lMkRLX0I5Ji5fUyBZLj9dITMkV18vVD0rX1IsQiovXj9HKitfLFM0WgorTV9SUFQtT1xRLENXXzc1RTdfXjs4Vj9dKjA0Q19GKSowX1lGNENfXi9DSFdfQzhOKF9WMUk5X109OSYzXworTTlGNT5fXlc9VF9fVlctJ19fXV81X19bQ1YvX19ZTVdfX147PV9fX0VXL19fWi1fX19eT0NfX1NIWC9fWgorTVlNW19fTktCX19fSlhPXV07JztfJ0E0PF9RQDYmP1w4JFE3XysyQEpfUUA0JU9cOiVBQ18nIUA6X1VFMAorTTJPXFgrUkdfLSJYTF9UJFwvT10lMCQrXyhCIENfVCUpMz9dNjZWJ18qIixFX1JMRCkvXEYnUV9fKyI0RQorTV9RODAlL1w6JVE7XychSDVfUTQxJF9cNiRBM18mUTw5X1I4PydfXE4pQjNfKUFcP19SNEAoT1w2JDEvXworTSZRODhfUjRAKC9cSSkiM18pQiRBX1I4QSg/XEcnUitfKUIwRl9WPVA8L11DOkZLXydBTEFfVFknLl9dTworTTg1W18mUTg6X1QhJTE/XDsmQUdfOVYpPF9SOEQnX1w+J1IjXyVRKDZfUig6J09cQSdSK18oMVhEX1IkOQorTScvXEImUU9fJlE8P19SIEIqT1xZLlQvXy9UNS9fVEkxNz9dIjJVR18uRC0xX1Q5Lzc/XTY3VldfL1RROQorTV9UQTU4T10pNSVfXzM1PUFfUzxWLy9cSChSP18oIUw/X1IgOydfXiE+N1NfKjIkRF9RUDcmP1w7JVFHXworTUdJQjZfWlo/SS9dIzE0S181VSktX1kmKkJPXSgwRDtfWF03PV9eNzpYP14xQ1lDXzclMTdfW1JMSF9eXAorTUo5V18/N01UX1RFLDFPXF8xJCtfLjQ9Jl9SWFctX1xZMEQrX0NJNjVfUlhVLT9cVy8zX18uM0BeX1FANQorTSZfXFEsU0NfLTNMXV9SSEstT10wM0RPX1ctNzVfUjRGKz9cNiVRQ18tUyBQX1I8QSk/XDgkUT9fJ0IgPQorTV9WPUo5L11ZPUcnX1gtIydfXFpYS19fXFktT19eLVs1X19TQlY/X19ZTVdfX14/Pl9fX0hXX19fWk4rXworTV9eT0NfX1tKWE9fXlpOK19fXk9DX1hVXEFPXEAlUVtfJzFMPl9RXDonL1xZLSM7XyVRLDVfUVA4Jk9cPgorTSZBU18oUVw9X1ctTjo/XlRKWjdfNCQsXl9VKSoyL1xJKVJHXzEkUS5fVC0oMz9cUCpSV18qQixDX1I4PworTSdfXEkoQitfJiEoNl9SLEAmX1xFKTFDXyVBKDBfUiw+KE9cPiZBU18qUjBEX1JQRChPXEcoQjNfKVIoRgorTV9RODElP1w1JCEzXyUhIDJfUVA4Jk9cRCgiK18pIiBCX1JIQik/XE0qUldfOiclUV9VVUQ5L1w+JlInXworTTVEXSNfVylEOD9cQicyJ18uI1haX1IsPiYvXyRNWytfK1I8Sl9SLEAnX11dPTcvXyhRODVfUjQ9Jl9cQgorTScyJ18pIVA/X1JAQSg/XEEnMjdfJiFAQV9SJEEqT10nMiUvXzNFJT1fVFUzOF9dJjNFW18xNFU9X1NJIgorTTRPXTs3VltfM1VFR19UPTY4X10vNiY7XylSOE1fUjA/KF9cQCZRX18pIVxDX1I4RClPXD4mQVNfJlE8OQorTV9RPDIlL15aTUszX1dNJzZfVDUkMk9dOjREW19FWSYvX1NEWS8vXU88Jz9fNCUhOV9WNUg6P11fP1dTXworTUAnQVRfW1JLST9eP0UoV19FWFIlX1YxPDYvXSczNEdfLVQpI19SSFUtT1xULlNPX0BYRiVfVEUvND9cRQorTSkiS18sQlxVX1IkQyovXEcrMl9fKFIwT19TSFwuP19EWD4jXypSQE5fUiQ8J09eRkZZS18oMUQ8X1FcPAorTShPXE4qUktfSFomOV9ZUjlFL182UjxDX046VklfXic3VF9fWFlOL19eXis7X19fR1dPX19ZXVtfX15DPworTV9fX0pYT19fWl4vX19OS0JfX19LWF9fXlpeL19FOEItX1IkOCdfXEEnIiNfKkI0QF9USSIwL1w1I0BbXworTSkhUD9fUVQ3Jl9cQCYhT18nQUw6X1JARClPXTMzJFNfTSo+Rl9TKFAsT11BOiZbXzJEXTVfUlxHKl9cUworTSoiP18rQjBAX1JcRSg/XDslMS9fK0JAQF9TXFcrP1w7JFEnXyoyMEZfUVg5Jl9cSyhCK18sMjhFX1JEQAorTSgvXEgoIi9fJUEgNF9RUDYnT1wzI0EzXyUgXDNfUiQ8J09cRSdBW18qQjRFX1NAWi4vXUk8RytfOFY9SQorTV9RTDooP11OOEVHXzg1NTBfUyBHKV9cWy1SX18tUlhHX1w+WU1PXFEqMlNfKTIgQl9TTFYsP14rQEdPXworTTo1RS9fUVQxIz9cSSgiI18qQjRHX1MwUi0/XDcmMVtfKSI0TF9URS01P102NyY7XzEkSTRfVF00OC9cWgorTTA0V18wRE05X1UtOjlPXSMzNUNfMUUlPF9UWTc5P1xCJ0I/XysiKEVfVzVLOV9cOyVBJ18pQihEX1IgPgorTSg/XEEnIiNfJzE4PV9ZSi1DL19AVi1PXy9EJSZfViE7NU9eOEUpK18tM00jX1MgUCxfXSszVT9fJkFcRQorTV9YTilBT15RSVovXzhVSTpfWkpERy9eOkJXW19JWUIrX1Y1RTcvXFwyREdfKlM8VF9UXTQ0L10gMEQ/XworTTRFNTpfUUw9KE9cWi4zX18qQlBRX1IsRCpfXEcpUyNfMFQlJF9STEcqP1xFKDIvXy4zKFJfXCZZTy9cSgorTSoiT18nQVhBX1IkQCdfXEgoUi9fKjIwRF9bSktKX11TPCZfXzc2NUlfUlxJKz9fVlgtQ19fPi84X19fSAorTVc/X19aXiNfXl4zP19fX0tZX19fWk47X19eV0dfX1dKWS9eQEQ5N18oQUg+X1JERClPXFIqUjdfNVRVKQorTV9RUDMkX1xFJzIjXydBQDxfUVg2Jk9cOyVRR18pIjRGX1FYOSZfXl1MKk9fLDJcTF9VRUE5P14iQVhTXworTS4jIFNfUzBIKj9cTykiL18sMkBCX1FYNiRPXSIuMytfNFRBIV9STEIoT1xCJzFfXydBODlfUkhBKD9cSgorTSdRW18qUixBX1I0PidPXDQjUSdfJVEoNl9RNDAlT1w0I1EvXykxVEBfUkxCKE9cSylSN18qQlBKX1Y9UAorTTwvXUk7Nl9fJ1FYRV9XUUw4X106M0Q/XywyOEVfVDBbLS9dPDQkT19QSzZUX1JQRClfXEYnMjNfKFFUQQorTV9SREcpL11cPTZfXztGMUBfUiQ4Ji9cPSYhS18mITg5X1FQPihfXDYlUVtfMCQxLF9VJTc4P1xCKUJbXworTTMlKTxfU10mNE9dJzQlW18vND0yX1Q1LzZPXSQzRUdfMjUtPl9SPEUrT1xJJzFbXzYkUSVfWDFbPT9cPgorTSYxR18pUixFX1IsPihPXEEnIitfPCYlQV9YWilDP10hMURTXzc1QTNfWi4/Rz9cXDA0V18rUlRPX1NIXAorTTEvXSUzRVNfKkJMUl9WITo2L15IRzlTXzZVOTBfXCJTSi9eRURIO19DWC1aX1QpKjFPXTM2VT9fPCcpUAorTV9TOFcvT10uM1U7XyoiSE9fU0hcMD9cTCtDL18nQiBIX1IgQSovXFsuRCNfKSIoRV9RWDomL10iLkM7XworTTQkNSRfUiQ9J19cRSgyL18oQVhAX1IsPyg/XEYoQjNfWj0zMF9aLj1GX11MPSc7XzREVS9fXzc/Vz9fWgorTVg+I19eXitBX19bRVkvX19aPitfX15HQl9fX0pYT19fWl47X19eT0ZfWi40RT9cQyYxU18rUkBIX1QgVworTSwvXUA1RStfJkEkMV9SOD4oP1xAJkFbXykhWEJfUVg6Jy9cTSpSQ18oUUw3X1wqU0s/XFktMy9fMEQ9LAorTV9WUVA8T1xWK0JTXytCKENfUyRFKi9cUypCM18pIVQ3X1MkSCg/XjNCKCdfLjMgUF9SJDwnT1w/JVFLXworTSpCJEFfUyBFKS9cTylCO18pMVg+X1FANCRPXDwmQT9fJTEgNF9RTDYmT1xGJ0InXyohXD9fUkhGKS9dJQorTTFUN184VlFMX1YhRDlPXEAnUjdfQkdBTl9VISIuP1xLJ1FPXzEzTFFfVzVJOS9eWks6U18qMiREX1I4OworTShPXE8qIl9fJyFYQV9QXDIkX10xMlRHXyoyIEBfUiQ8J09cQCdCJ18mUVRCX1JESiw/XFwwJENfMURRNgorTV9SVFEuP106OCZLXy9UOTJfVEUyOC9dLTVWK18wVFU4X1QpLDVfXTE2VjtfKDIsSF9SSEIoL15ERUhXXworTTJDUFNfWEVePz9cOCNQX18pIVxBX1IkPCgvXTAxVD9fMEQxKV9UNSs0X11HN1VXXzxGVU1fU1UiM09cTworTSsyX18vVCUpX1Q1Mjk/XEwtRDdfKiJAUV9VJSgyL15UTCpbXzklTTRfW1ZMR19eQ0NYP181VUExX1ZBTQorTTo/Xl9PPCNfLEMwWV9UXTE1T1xBKFJDXywjKFdfUkxNLE9cQShST18rMlxWX1NIXDA/XFYtQ0dfOSVNNAorTV9YLVM6P11eO0Y3Xz8nJUpfUlhAKD9cRScyI18oUiRDX1JAQyk/X1BVTS9fUTtCV19VPT03X1xSKzJXXworTV49VzlfX19BVl9fX1g9T19fXis8X19fRldfX19ZTitfX15LQ19fX0lYL19fWT1bX0hZKjJfUkA8Jz9cWAorTSwiW18yI1hUX1Y5OjU/XDskQStfKlIsRl9SLD0oP1xLKTJHXyhBWEBfU1hbLU9dIy1TI19SSzZTX1JYRgorTSpPXS0zRUdfOVYxUF9TJEkpP1xPKFIzXypBUERfUkxCJy9cRSdBQ187Ji08X1suSEg/XFYrMldfJ1FIPAorTV9RUDQlX1xNKSIzXysyKEFfUlREKS9cRSdBW18oMVg5X1JMSihfXDYkQTNfJ0FEPV9SREEpL1xGJzFXXworTSoiMEJfU10hL19dQDo2R184Vj1JX1IgPig/XkBDOCdfOCUhJl9TRE0pT10/NTRPX0QoMV9fWzZISV9cRgorTSdCJ18pQVA/X1M0UCxPXE4rIltfODVVP19cPl5PT1xOKTI3XyhRWEBfUiQ/KE9cOycyK18tQzxeX1RVMQorTTY/XF4xJFtfK0MoWl9URS82P10iMjU3XzE0WTxfVCEqNT9dJjQlT18vREEzX1RFMzdPXEEoUkNfKjIkPQorTV9aQjhDT15YSTlPXzpFSTdfWDVYPV9cQiZRT18pIihEX1JAQyhfXFQuM19fMERBMl9bIkdJX15FSCojXworTTI0WTpfVFUrMz9cWC5EK18oMkxaX1NBIzUvXEgsNCtfJzFUSF9SREQqL15BRzlPXzYlLSdfWj48RD9eKQorTUI3W183NU04X10/MVY/XFkvJCdfMlRZM19SJEMqL1xNK1MzXysyXFRfUkhOLU9cSywjO18uI00gX1NdIQorTTEvXUs3VSNfSzlCJl9bSkJEX11DNEQzX0xZUj1fUlxDKU9cQCgyK18pQiRDX15TMFRfXltLSy9fOVcpWQorTV9UPSgzX19GVi4jX1o9R0FfXks6WE9fRlVNW19ZTUdEX11TLFUvX1pZPidfX15DO19fX0ZWX15TSSlbXworTSlBWDpfU0RUK09dNzJDV188Ni06X1FAMiVPXFIqMkdfKUFUPV9SQEEqP1w9JjFPXzJUUSVfVSUoMD9fKAorTU1LL18qIVhHX1YlRD0/XSUyJTNfLiMsU19SPD0oL1xTKVJLXyxSQEFfUkxFJz9dTjk1W19PWzJNX1MoSQorTSo/XEEnIVtfJ1E8Ol9STEIoT1xRKUI3XypCJEFfUjxBJ19cSioiI18vU0BSX1IgOCZfXEAmUVdfKVIoQgorTV9SNEEnX1xKKFIvXzNVITFfVVVGOU9dQTkmN18oUVhCX1o+NEJPXU43NT9fNyUhJ19XIUY2X15KR0lHXworTUxaNkZfUjxCKU9cRCgiK18yNDBfX1MoTSlfXVM8NltfUlwiX19SUEkqL1xDJzInXygxVEVfUixPLU9cWgorTS8jS186RVU4X1IsPigvXSQyNTdfMFRJNl9UJSk0X10jMzVDXzNVKT1fVE0wNy9dKzU2M18zJT1CX1IkRAorTSk/XE0qIi9fSVk+Ll9bSkVGP15FQ1g/XzEjOFNfUjw9KC9cRigiM18rQlhRX1NRIzI/XSc0JT9fOFY9TworTV9aKkJKX100NzYzXytCTFFfUzRUMD9cVS5EO18mQUBIX1NEVzFfXEosRCtfJyIgSF9SIEAoX14sQig7XworTTlVTTZfWEouQU9eJkJYP18/J1FfX1M8WS9PXS40NTtfJlFUQl9SSEcrP1xWLiNXXydSLEtfUlRSLi9cUworTS0zS18vU10iX1g9WjlfXl5IWUNfVUtOSl9YLVA2L18lSzozX0g5Ki1fUyRKKk9cSihSL19aPFcvX1w+WgorTVFfXFQuNStfL1NdNF9VISQ3P105NFY/XzglUUxfVk1HPV9dWzlHK19DRzlbX19TQldfX19aLVdfX15LQQorTV9aOjFDP1xOKEFbXy9TQFJfVjExMT9dVjlFU18mQTQ5X1QgWC1PXFAqIjtfKjI0TV9SNEMpP11IOiVfXworTTZVKSxfW0JKSV9cUCpDK18zRSVDX1Q5KDVfXFAqUldfKlIkRF9TMEgqP1xQKTFbXyoiKDpfWFYlPl9fJgorTU5bM18rQjBHX1FcOSc/XD8lUUtfKyIsQ19SVEIoP1xMKFIvXylCKEBfU0hZK09dPzVFI18pQVw/X1FcOgorTScvXEgoUi9fKCFQOl9SVEQpL10zNSU3XzdGPUdfVilFOU9cQCcyL19KSUYzX1NASypPXTo1JStfPDZNQworTV9bMkpJT15HRllTXylCIERfUjhDKE9dOTREU18wU1RTX1c5VDtfXytPS1dfKjJAR19SJDooP1xAJyI3XworTS4zWSpfVCEiMT9eIkAnQ19GKFoqX1IgPShfXTo3JjNfMiRdO19UVTc5P10hMTRXXzBUOTJfVFE2OS9dLQorTTU1X18oIiRCX1JcSSlfXklHOTtfSEhSI19aUjZDT15DRFkjXyoxWENfUjA+KE9cSisjJ18yNSE2X1RNNAorTTZfXSs1NV9fNCUlPF9VUUU6X15XTFtPXzAzXS9fUkRPLj9eN0RZT18oQVxFX1JMVTAvXEYrQ1tfJkFYTQorTV9SJEApT14lQCgjXzNFKTBfUzRaLi9cOSZRW18uM0BeX1QlJDI/XD4nMi9fLTMoWF9SJEMqL1xIKyMzXworTSkyPE5fU1BeMF9cXi9EJ19GOF1bX1wmRkdfX0RSW0tfRjg5Tl9dLyNOT142QihHXyxSVFFfUjxCKS9fRworTVRMO19RS1ZXX1RdNzZfXUE5VkdfWDxTMV9fOz5WX19eWV1PX19eQz9fX08+Vz9fI0k6P19fLiM8X19fRworTVdPX19ZTV9fTVlWQF9TJD8oP10pLzNHXz1GJTVfV11NOF9cQicyJ18tQlhMX1NcVy0/XEQpQldfKSIoRAorTV9XVVk8P11NODVTX0sqIjxfUyhOLU9dNjZWV18yNEU4X1MkTCtPXEgnQidfLCIwRV9TLEgoP1xOKiIjXworTTs2NTtfXEZeTV9cUyoyU18oIUg+X1IkOScvXFApUj9fK1IwQ19SXEYpT1xBJzFPXzdVWTNfWFolP19cRworTSgiI18oUVhAX1FcOiZPXEopQjNfKzIwRF9VRTo2X106OFYvXzo2UU1fUVg9KF9eUUk5W18nUTw6X1M8VworTS5PXSMwI09fTzs2U19aLjdGL1xKKEI3XyoyLEFfVTUsMT9dLjFTT187Nk1EX1w6WU4vXE4rMlNfKCFEQAorTV9SREUrT10wMyVTXytCWFdfUTQ9Jj9dJC9TR187JiE8X1NAUy4/XSk0JVtfMTRZPF9UJSYzL10iMiUrXworTS9ENTFfVCEkMy9cPSZRV18pMVg+X1siREdfXjxDKC9fTSoiOF9bLkNIL1xJJ0IvXykhWEJfUzhVLl9dNQorTTVVW18qUyRZX1VZRjwvXT84Jk9fNzY5TF9VRTU3P1xPKzNXXy4kKSxfU0RdLl9eSEo6L18pIkxRX1FYSAorTS8/XEYrNCdfJzIoTl9RVEIpX1xQLUNDXy4zUSFfUUQ7J09cOiZBV18tU0hfX1JISStfXEInUjdfLkNRIQorTV9STE8tX1xSLSNPXytTJFZfUzxXLk9ePERYK19RSlZIX15DMFA/XkREV1NfUyteXl9TTFQuX1xBJ1JDXworTSlCJEdfXjcwUy9fL1A7W182RVE/X1NEXS9fXiA+N0dfXD4jOl9fT0JVP19fWS1HX19eN0FfX19DV19fXworTVk9W19fXjc8X19XRFc/XjxBKFdfKkFIQl9UJFsuP11dOyVbXz5WTUFfUjA/KF9dIS4zP18wQ0hYX1JcWAorTS9PXFItMztfQlgpW19XRUw5X15eTSsjXy1DNFxfVF0yOS9dLDIlQ18qUixGX1JMQSkvXE8oUjNfKyIkOgorTV9SSEQnL11YPCY7X1RMPyBfUyhIKl9cQCZBW18oMUQ8X1JcRilPXE4oUitfK0I0RV9SPEMoP11LOkVfXworTU4qXklfUkBBKD9cQSchW18oUVg+X1JQSClPXEwoUi9fOEYtRF9WKUs6X11BOSY3XyghWDtfW0pJRl9cRQorTScxT189V0FZX1FANyVPXyRPO1dfRSg6J19SQEAnT1xGJ0FLXzZVJSdfVjU8M09dQjdFO19OOlJLX1JMSgorTSo/XEYnUjtfJjE0Pl9TQSEyL1xHKUJXXywiSE5fUjhIKU9dWzxXJ18vU00kX1M0WzJfXTQ1NVNfM1UlNAorTV9UNSs0X10sNEVTXy5DRSBfUVg4Jy9cSyhSO19MOj5DX1pCPUVPXlhJKVNfTVo+RF9SVEIpX1xFJ1IvXworTSwiXFVfVFkvNU9cRClCW187Jl1aX1VVPjo/XTY3VjdfNTUlOV9TPFUxP10gMkVHXy1TUFxfUlRLKU9cXworTTAkT18pUlxfX1JcVjEvXFEtRCtfJyFYTV9RSD0qL10kMURbXy8jWSNfUzRVLi9cXC9UM18pMjBKX1JIRworTSs/XF8wNDtfLSNBIF9TOFgvX1xYLkNfXylCOElfWiI2QV9fJUs6S19ZXSMjX1ouMz9fXzNRXENfL0M8XworTV9SND8pX1xJKEIrX1pdLzZfXTcjUT9dIy9UJ186JklNX1UtPTg/XlVMOl9fXi4nPF9fU0VYL19fWV1bXworTV9eNzxfX19GVz9fX1ktV19fXkNBX1oqMUVfXEMmUV9fJjEwNF9YUVs7T15ERShPXykyIEBfU1hbLk9dJAorTS9TX18tVCUlX1QxKTE/Xi5AV1NfQ1glXl9aRkBIL1xfLyRDXy9EITVfVUEyOC9cTilSP18rMiRCX1JUQgorTSg/XEopMiNfJyFINV9WPUI3P18rT1wjXypCNEdfUiQ8J09cPyYhQ18pUiBAX1MoSypfXEwpMjdfKyJAQAorTV9YJVw8L18nTls7XyoyKEJfUiQ8Jy9cQydBW18rQkRJX1JASCk/XUA4RjdfOTZNR19WMUQ5X1xCJzFXXworTVBKWkZfU1xUKz9eI0BHT18mUVA2X11LK1MvXVI5Rj9fKjI0R19TIEgpL10yMkQjXz5HJUNfVUkvMi9eTworTUkqL18sMlBMX1FQNyc/XEwqQy9fLjQtLV9SREosP11fPUc7XylCID5fXTspU09dKjM1Q18xNEEzX1g9XAorTT5fXT42JTtfKiIgPl9UUS82T1xaLyQzXydBSDxfUkxGKi9ePURJJ19MSj5AX1tSSklPXl1LSltfKyIsQworTV9SOEIpL1xVLUNXXzVFQUBfUiBCKj9cPCdCL19DKFY0X1RJLDRfXSAwNENfOUY9Ul9UOSk1L11OPCcvXworTUtaLkRfVDUjNF9cSCwjS186JklNX1NIWC5fXEUqIzNfKUJEVV9UISIyT102NiVfXzBUNSpfUzxdL19cTQorTSszI186NjVNX1NdIDFfXFAsM1NfLTM8Xl9UOSozL1xPLDM7Xz9HKU5fWiIrQj9fMU47O189Nik8X11DKgorTVRPXTgzRUNfKiIkS19SIDsoP19JVS0rX1g8XytfVDReLi9dLjFEK18zNFUqX1dVXD5fXzxTXFtfXi1HMworTV9fX0lYP19fWU1fX19eP0BfX19GV19fXVktV19QKypTX1JMQylPXEEmUUdfSzlKMF9aPjhEX1xQKkJDXworTTA0IF9fUzhRLF9dJTJUV18xJEEmX1kmKEBPXjpDKEdfQ0guKF9SUEouT10kMTVTXzw2VV1fUkxDKU9cTQorTShCJ18sIjREX1FYOiYvXD4nIT9fJkEwMl9cQl9PX1xHKEIzXyhBVD1fUiQ6Jk9cRygiI18qUjBEX1JYRworTSlfXE0pUV9fQVghUl9cXyNPT1xIKDInXyghTDtfUjhBKD9cRigyJ18pQjBBX1VRQDdPXUc7JktfOSYtQgorTV9SKD4nL15dSiovXy1SVENfWVY4RE9cXS5TO19XTFctX1YlODYvXEMoMi9fKiIsRV9TOFMrT14gPlc3XworTTMkMSBfWkpCSC9cSihSL18oIUxBX1FEOShPXF0xJSNfLzNZJV9YXidBP105MzRHX1gsWzJfVDEsNU9dIAorTTIlQ18rQkRPX1RJJjIvXiE+JytfKDIkTF9TNFIvT1xIKFI3XywyPEpfWiYxQ09fIEw6T19KKTozX1s2RgorTUlPXEwoUi9fKUIoRF9TPFkwL10uNCU/XyYhSD9fVFkuND9cPigiN18wJC0oX1RRMDYvXFswNE9fM0UhOAorTV9WSUw7X180UTxHXy5TRSlfUkRTLz9dJzIkR187VlFLX1I0SC0vXFMtRCtfL0QhKF9VUT45P10rM0UvXworTS0jSFxfUVA8J19ePkZKK18xRDkvX1JQTy5fXE4sIz9fLDMwVV9UTSo0L15LSSozX1ZcWy1fXkc4Vi9fSworTVdNV19YTTMxX1teTUo/XjVBJ1tfPVYxPF9ePzJTP19NVl0/X1RcTydfXTsrUk9fM1NcV18vVCkjX1ZdUQorTTtfX0pWXTtfXj1bN19fX0RXP19fWT1bX19eNz5fX19HWC9fJE5bN18xM0xXX1dJTDo/XzRPSzdfRkhKJworTV9SVEYpT1xfLzQjXy1CXFZfUVA9J09cXC5TS19FKSIuX1smRUgvXVA6JlNfKVI8VF9UKSg2L11GOSczXworTSkxVEBfUlhDKE9cTShCJ18pMiQ/X1I0QydPXEAmITNfU1wrIV9SVEYpT1w/JiFDXyhBTDtfUkRCKE9cTworTSoiQ18rMjhGX1MgSihPXjNDJ1tfUywiW19STEQpL1xCJzFXXykyIEBfUlRIKi9cSyhCK183VjE+X1VZRQorTTxfXTo2RjdfJlFENF9cKk1KL10nLjMjX0lJVjdfViU/Nk9fPlM8V18xI0xbX1IoQChPXD4mMVdfK0JMSgorTV9TKE4rL11XO1crX0hJRjlfUlRGKU9cQSciK18nQVhHX1QlJzQ/XScxVEtfRlkmLV9bNklIT186UixLXworTTRFSURfVDEsOC9cPydCT18lQUxAX1UtLDFPXUU3Vj9fKjIwUF9SSEIpT1xYKjJXX0spPjVfXUcoUE9eNworTUE4K18+NklKX1JMQihPXEcoUjdfK1MoV19UWTE1T1xXLVNLX0FIJiNfUVA/KC9cLyUxP18yVSU5X1QhJworTTRfXScyJS9fQjhOLl9dTyxUL10lMFUvXy1UJStfUihDKS9cWC0zM18rIlxbX1NVIDMvXSIxJFNfMyRZNQorTV9UTS40X10iMiRLXykyNEhfWyZNTT9dITA0S18rUyxbX1M4WS9PXSkyVEdfRChOLV9SJD0nX1xPKiJDXworTS4iXE9fVChdLz9dKDFEQ186RjVFX1kmKUFfXklHOUdfWl1TNl9dNyhQX106NCRTXzxWVUtfVkFHOU9dLworTTUlK18vRDkjX1RZMjQvXydMSldfXi1XNl9fRz5VX19eWF1TX18+Mz1fXFMnTl9dPDQ0S19JSSouX14nKQorTVAvXjlCKENfLDJETF9TQFUuX10kLzQ3XylCJEFfUiA/J09cTisiW19PWzpQX1hCI0BfXFwwRDNfOUcpVgorTV9WXVE+L1xPKkJLXywyOEVfUkxAJ19cRCghW182VUUyX1QoWSxfXzBQS19fLCJARl9SKDsmX1xFJ0FbXworTSwiRElfUkBBKD9cSihSL18rUkRBX1kiKT5fXylPO0NfKlIwRF9SKD0nP1xIKFIvXyoyMERfUkxCKj9dOAorTThFX18oIkU4X1NQXDlfXDwnQVNfTzpCQ19WKTIyP15XSko3Xz0nJUxfXVcsUy9cXi0zN18oUiRDX1JAQAorTShfXF4uIztfLlMwTl9WPTs3L140QlhPXypSMERfUVg5J19cOiZCL18vJCEoX1NQWi8vXkdGWTtfUVtGUAorTV9dTylTP10oNCVLXzI1IT5fVF0nMl9cQigyP180JDReX1glWz9fXSIwRF9fJzFMPl9SPD0oL15GRik3XworTVQ8Nl5fWko6RV9eVklaP18sMkBIX1I8Qyk/XFYvI1tfMyUhMl9VQTQ1T15GR0lTXy0zSFZfUihLKl9dKAorTTQ1Q18xRF09X1UhMTcvXidCOFNfWF0zOF9VKTA4L1xXMDRPXzdWIUFfW1pbTk9cVi40N18qIkxXX1NdIQorTTI/XSYyJF9fMTRBLV9UQS40L1xJKjJTX0s6RlFfVEUpNE9cUS4jW18sMzRXX1RNKTFPXytQTCtfKTIgQgorTV9SKDonP15ZSzsjXyoiLEVfUiA9KF9cPCZSJ18lQTg5X1I0SCo/XlNLKjtfVixPJl9eKzZUT15bTVs3XworTTBEPSdfVyFWPE9dMjYlM18uM1kjX14vN1RfX09XLTNfWy1HMV9fL0BWL19bWV1fX1RMOldfVkU9NS9fNworTVIsK19YTF8lX1g1Vz0vXEwoUi9fLFJMTl9UNF8wX11IOFVbXywyVEtfUjQ+J09fNlI8M19BSC4iX1VJQAorTThPXi9FWU9fOEYtRF9STEYpT1xOKVI/XysyNEFfUkxGKD9dQTc1N19IWT4wX10zIk9fXEkoIiNfKEFUPQorTV9SMD0nP1xLKSIzXytSQEhfUlhFKT9cQidBU18zVFUoX1xPIE9fXE0pIjNfKFFQPF9STEQpL1xNKUI7XworTSgxND5fVTU4OF9cQCklJ18tUyE/X1FYPCdfXydKWj9fPEZJQF9cPk1KT140Q1hLX1ctJzBfU0BPK19cRAorTSdSJ18qQihAX1VVNjIvXVY6RjdfVlxTLV9YNV1AL1xIKEI7XyghSD5fUUQ5KE9cXi9UO18uM0BXX1s2TworTUlfXzNRTCdfViw/LV9ULS02L10lMlU3Xz9HOVRfVUU0NS9fKE47M19COC4rX1RdMjc/XEUoUjdfKyI8RworTV9aRj1GP15TSSlfX0ZITiZfWk49R09cRCchX18rMjhGX1MkRipfXSIyNEdfR0oqQF9aVktJT11CNkVDXworTTMlQTdfVDUxNU9dITIlM18zJTE4X1QoXy9PX0VWPVNfMURFNV9UKSw1T11LOjZPX1JMLyNfU0BdMj9cSgorTSwzP18kMSg5X1RBKDQ/XSkyVStfMDQ9KV9SSEorP15XTDtHXy8kIShfUlBRLU9cUC1DW18+VzVTX11LLgorTVNfXEMpMktfJyIkR19VLTY4T1xJKSMjXyhBVEFfUihAJz9cRChBV18oQjxFX1VJOTYvXU05Ni9fVz0nLAorTV9bKkhJL10sNFUvXyxDWF1fWEYwRC9dPjg2O188N0FMX1kqKD9PXjJBSCdfP0ctTF9aWkJEX183UitPXworTT5GUUNfXUctUU9fRVRMQ19AJylPX1JIQSg/XSEuM1dfMjQpKV9WSUM3P11HOEVXXzNUPSVfXS8kT19dQQorTTcmI18uM1EnX1YtRjxPXSMwJDtfK0I8R19STEQpL1xOKjIzXyoiLD1fVy1POV9eXUw6S19VTDMhX1JMQgorTShPXEEnIVNfKFFQPF9SSEMoX1xLKSIzXyxSSEpfUiQ8Jy9cRCdRX19TLCMhX1JURCkvXEUnQVtfKVIgQAorTV9SQEEoP1xIJzFTXyhCJDpfUTg2KF9cSSkyV18nIVQ3X1xKTUo/XVM8JjdfUysiTV9bIkhJL18/VV03XworTS1CXE9fUjA/KD9cUCoiO18+JylCX1gxWD0vXz5TXSNfOyY5Sl9SQEIpT1xGKCIzXycxTERfU1kgMT9cXAorTS4zQ19NOl5HX14nM1QvXzVRLFNfMyU1Q19UMSk1P14kP0dTX0JILiNfXTskUC9eKkBYX18xVEEzX1JQSAorTSpPXE8qIkNfS1oyQ19aTj1GT14nPVczX0hJOjdfUlxJKz9cSyhSJ19KSSo1X1UlKTMvXytPXCNfT1siUAorTV9bQkdLP104ODY/XzJVPUBfU10mNS9dJzNVL180RFUtX11TMVVPXTM1RitfMFRdOF9YMiJBL180UzxXXworTS80KS5fUVRDKT9cTywzO18zVF04X1I4RytPXFowJCtfKiJAS19bWlhQL10qM0U7XyxDPFxfUyRZMF9dXQorTT03L19WPFcuX1MxIzQvXEcuVF9fMDUxTF9TJF81T11BOEcvXyhRUEZfUlhFKT9cSCgyJ184JUE8X1MoSgorTStPXypQS1tfSEk+MF9YSihAX10vNFUnXy80KSJfVy1bPz9cWjJVR184NiFGX1VFPDQvXTAzRD9fOFVNMQorTV9dQyhPT11ROEVTX1c8XyxfXjsyUk9dVzpGR18tMlRRX1NcWC9fXSMvNDdfOVYhOl9WWUc4P15MSElbXworTVdMTyVfVlVGO09dIzElN181RT1IX1Q9IjNPXE0pMkNfKzI4Rl9STEYoP1xWLDJPXzsmQUBfXEZdTU9fNAorTVBLX18qUihCX1IwPydfXEYnUV9fKzI4Rl9SSEMoX1xNKVI3XzJEKF5fUkhAJy9fK09bT18qUihCX1IwPQorTSc/XEImUU9fKlIwRF9SNDcnX1xDJlE/XyhBTEJfUlhGKj9cQCgxS19TSypOX1ctUjlfXyNKOjtfTisuTgorTV9dVzVUX1xWK1JfXyhRWEBfU1xXLT9eNUNXX188JjFAX11LK1MvXUU3Vi9fKjIsR19SLD0oP1xAJ0I/XworTS8zXSRfVDUiMD9eVUtaP19WLEsnX10nIFIvXSEyRUNfNSVFRV9ZIipCL15ARjlHX1hdJy1fVz1QPy9dJgorTTFVK18qIixFX1JIRSlfXkxJOjdfRShSKl9YTV4/P148RDk7XykyIEZfUkhCKT9dXz0nL182RVE6X1wyXQorTU8/XlZMWytfTypaVl9UVTU3X10iMyVLXzI0WUBfVD0uNS9dUTsmU19YTT88X1RRLzZfXFkxNFtfQSgqJAorTV9dSzNUX1xZL0RLXy8zWF9fVT05Ny9cXS9UO18qIjxNX1EwOCZPXEQpIj9fTls2XV9UKSYzT10hMURPXworTSwzRSNfWSYpQV9fP1RdM181VkVXX1M9LThfXEcvJTdfLCQ1PV9UQTw8L1w3KDJfXycxXEJfUjhFKS9dMAorTTE0S18sIjxOX1FcOidPXkVHWT9fTCo2Pl9YWidAP11NO1ZXXztHOVpfVTlIQy9dKDQ2K180JUkrX1RRLAorTTI/XTMzRFtfWF0vKl9WPTg0X19BVE0rX1k9IytfVlFAOD9cUSpDJ18uMyxbX1NQWDA/XitAR09fP0c1TgorTV9bWlJLP19AUywzXzM0OS1fU0xdMy9dKTJVS18uQzhfX1MgSCpfXEwpMjdfK1JIRV9SXEopL14vQlgvXworTVM8JlpfXSsgTz9cTikyN18pIVw/X1JEQihPXEooUi9fKiIkQV9SPEQnX11ENlU3X1BLLk5fXFMgTl9cTQorTSkyL18pQVw/X1IwPSc/XEooUi9fKFFEQ19SLDwnL1xAJjInXyoiJEtfUVxEKC9eXUlKJ18+V01QX1wiSworTUlfXyZQO1NfVl0vMV9TME0rP1xEJ1InXy8zNFNfWkpERS9dNTI0N19ZXUM5X1RJJDIvXEkoUj9fKEFQQAorTV9SID4pX1xNK1MzX0IoNiRfVCBaLE9fQlUtJ19SO0MgX1RNNDhPXSQyNTdfRTheLV9aLjxHL19GVS0jXworTTclNUFfU0hbMU9cTSlST18sIkhOX1pKRUlfXFstQztfQVdNXF9ZTjJGP1xBJzI3XyhBUEBfUiw9Jl9cSworTSsyS18tUlhOX1IgOydfXzBRPEtfNVYlRV9UTTc3T10pNCVTXzRVTT9fVlVIOi9fPlRdQ18wJC0vX1NdKworTTUvXFQsQzNfUzw7Jl9TUSEzP10qMVQ7XzgmJUJfVC0oMz9dMDJUX18rMyRTX1JUTSwvXkpJKlNfMDQ1LQorTV9TTSAxP1xJLDNPXzZFKTBfXSMkUT9eKkM4W18/V14iX1lePUlPXTY3Ni9fK0M8Xl9TTF0wT1xOKVI/XworTSwyQEhfWzJHSE9cSikyP18oIiBJX1RRJzI/XidBJ0dfSToyOV9WPUw6L11MPSdDXzhXOV5fWDooQz9eIgorTUBHX18xVDUiX1VJNTQvX0hWXTtfNlUlJ19eMzdUT19CU00/XzdFKTNfUzBRKT9cTCoiO18xI00iX1dJTgorTTk/Xi5BNz9fUjtSW19dVylRP10hL1QnXywzJF5fVDEkND9dKDFUW18sIkhIX1JIPidfXFMpUkNfLVJYSAorTV9ZQi1BT184UjwzX1RcKyJfUkhCKT9cQydCI18pQVhBX1JURCkvXE4pQjNfLUJUR19WWUk4X186Uiw3XworTVNbWl5fUkxGKU9cRSgiI18pIVw/X1JAQyhfXDQjUS9fJSEgMl9RODElP1w4JFE/XywiOEJfWypFSC9dIworTTAzS19OSyJMX10vJ1BfXzxUPSNfLSJcT19SPEIpL1xYLSMrX09bLkRfVERfLl9fRVY9S18wQ1RfX1I4QgorTSkvXEAmUV9fKFI4UV9UKSMzT15IRyk/Xy0iQERfXVsxVC9fJk47W18vJEExX1U5PThfXjVEKE9fRlkyNAorTV9eTz5WP10wNCVPXy80IStfUjhBKF9cRyhSN18qMjRHX1U5MjUvXUc4RjNfNFRdMV9SLD4oT1xLKVJHXworTSpCOERfVD0nMS9dRzYlU19BKCYnX11DMFRfXTg4JktfMzU5PV9UQS82X101NkYjXz0mTUtfXjs5V09dIworTTFFK181JU1BX1Q4XjA/XztTXStfMCQ5MF9XIVM9L11JOiZfXzFUSStfWVo6Ry9cVC1DT18rMlBSX1o6QgorTUpfXFYuNDNfK1MoV19SWFQvT14/REknX0w5XkFfVk0/Nk9dPDVVJ186JkVDX1ZZSjhPXV06Vj9fUFsqWAorTV9dOyxSL18xT1tTXz1GJT9fWkpBSD9cRChSR18vUzxbX1I4RCg/XitDSENfOVZRSl9VJTU3P11RPCZfXworTT9HUVdfVT05NU9dMDQ0T180VSUpX147JVVPXU4yJkdfVys3OF9fT0JXP101MiRXXyoyKExfUkRGLE9cVQorTS00I18+Ry1HX1k2LT8/XytPW0tfWS0jLF9UPSQyT1xTLFQjXy4jPSRfVTk1Ny9cSSgxX18sQjhHX1MsRworTSovXFQqQjtfRDg1Xl9dRypRP18lTUs7XypSLEZfUig9J19cRScyI18rQjRFX1JMQCdfXFYqQjdfQEghWQorTV9dKyBPP18yUDwnXyoyMERfUjRAKC9cRigyJ18oQVQ9X1FQNyZfXDYkMTdfJVEoNl9RTDYmT10lLTMrXworTUlZTjZfVFkrMU9eRkgpW19XPF8sX10/LFJfXFArMlNfKUIkQ19TKE4rL18kTUo/XzU0VSlfXis5Vj9cWgorTS0zN18pQihEX1FIOCZfXEMpQydfMEQ1MV9aOjdEP10yMSQnX1g9LzRfWz5MTF9cXDIlJ181RU1BX1lGMworTUQ/XjBCOEdfWj1TN19UOSY0P1xYLlQ7XylSLEVfUjxDKT9cRSgyL18pQihEX1JUSSpfXk5KSlNfKFFcQQorTV9SQEQpT11NOCU3X0BXTUtfWVonPl9dUDhVQ19WTSswX1UtNzlPXE0tM19fMTRROF9VSTw4X11dPSczXworTVo9Sz9fVDUoNS9dLzQ1Q184JTk5X11bL1UvXSQxVStfQ0kuM19XMVI+X10lMiRHX1I8MyRfUzBTLk9cTAorTSpTK19GSUJBX1MsVC9fXFguVCNfKSJIVF9aTj5HP15ORklTX0NHVVdfVyFENz9dIi5TN19ESDFbX1dNSAorTTgvXytPXENfMDNdIV9TQFMrT11GNlVLXy9DUFlfUkhMKk9cVi0jO18oIVRDX1M4Vy4vXVQ+JztfOkZVUgorTV9ZRjZFP11IOUYvXzwnNVFfVTE2NF9dNDU0X19aK08/X1hBLkgvXkY5LSdfUVlTMl9VUSg0P1xVJjMvXworTTFTIFtfUzROKi9eKT83R19GSEY0X10zKFEvX01WTTNfNFRdN19TPFcxL100NFYjXzZVSUFfUkhCKC9cSworTSdSI18rUixEX1NUUytfXiM9VyNfVSw3IF9cMlVNP1xLKFI7XyghTD1fUkRBKS9cVCpST18sMjhFX1NQUAorTSpfXipCKCdfVyxLJ19dMyNQX1xOKjJHXylCJEFfUiw+J09cSikyN18pUihGX1FINSY/XEEnIiNfJyE8OworTV9VMSQwP142Qkg3XzhWITtfWkZDSD9fO1M8S19VPEspX1MkTis/XEgoUjdfKzJER19cNldKL10+NUUrXworTVktTztfU1BXLV9cRyhSN18nMUw+X1QhIzNPXFsvREtfTComO19VXTEzT19EVU0/X0s6JkpfVCktNi9dMworTTVVX183RT03X1glWj5PX0RVXStfM1RdOl9SVFAuX1xEKCIrXykyJENfUiw/KD9cRCgiK18oQVhAX1IsPworTSg/XEYoQjNfKDFUP19STEMoP1xTLDJTXzc0WS5fWkI+Rk9fN1NcV18zVS1CX1JMUy8/XSAxVS9fNyVZRQorTV9YXiZBT19GVV1TXzI0UThfVSk0Nl9dQzY1U19WTE8wX1NIXTIvXV5AWC9fODVdSF9URSwzP18+Vj1HXworTStSWFVfUlxOLT9eNERJT18vI1UoX1NVIDE/XE4tI1tfTUpGSF9cIkxLT15KRDhLX0hIQV1fWko0Qy9eWQorTUdZM19DR11SX1xLI1NfXFAsU1tfKFI4R19YVV9AL14zQDdXX1dMTyVfVEhcLz9cPCVBW18oMVxCX1VRPgorTTZfXUs7VldfPSclUF9XXV4/P11XPydLXzlWTUlfVVVAOD9fPlZcX18rMkhJX1MgTi1fXFgvQ0tfP1daKworTV9WOSNCT15DPlpfXzEyUStfWkoqTz9dWzYpQ19UXCssX15TOlQvXSoxRF9fL0NZK19VLTI3X1xdLyQvXworTSpSLEFfUlxDKS9cUCkiN18vQzBQX1cpRjdfXzdSLC9fSylWPV9STEMpT1xAJlFXXylRXEJfUyxKKk9cTworTSkiL18sMjRAX1hGJ0AvXz1SXENfVEwnIV9SOEEoP1xEJ1FfXyoiLENfUkxGKU9cSChSP18qMjBIX1I4QQorTSk/XD8mQVtfPFYtQF9YUiA+X11aPVcrX0laJj9fXiczVC9fKk9bW18rUlBLX1I0QChPXEwqIjtfUSs6RworTV9XNU06P19HV01bXy5DNFVfUjxDKT9cRChCN180RTVAX1QxJzRfXlpKWjdfPTY9RF9eRztXL141QjkrXworTTAkSThfVVE/Ok9eQ0ZZW19HWUI4X15DO1VPXSMwVFtfK0MkXF9SSEYqL1xGKEIzXyhRXEFfUjBAKE9cQgorTSdCI18oQVhAX1IgPCdPXEInQiNfJVEgOF9SRE4tL18qUTxPX08rMlhfXVMzVF9dMTU2M18oMkRTX1QhJworTTRfXUw7RzdfRVhaLl9dUy1UT10uNDVXXzsmWVVfVz1NPC9fPVNNL18xJD0yX1g6K0JfXUE3VkNfL0QlIgorTV9cOyFQP1xHKUJXXypSSFFfWS4xRk9cVy4kL18tU0hfX1I4TC1PXlhKWktfUztGW19bPkJFT18kSilLXworTU5ZWjJfXCZFRV9eO0JHS19VLEM3X1JYTjA/XEEoUk9fLjM0V19YVVw9T186UFs/XzAzNFZfUjxDKT9dQAorTTdFR19BKDVfX1hCKEJfXjRDWS9fPCclUl9USTM0X101NkVLX0FYRixfXDsoU19cTjEzK18zJl03X1c2LworTT5PXEgvUlNfKCJQS19TJFosX1xXMSNHXyojMF1fU10iNS9fKlBMN19ZXUMyX1NMWzEvXFwwJF9fMlRFOQorTV9UOSIyT1xOKSI/XysyLEZfUjw+J09cUCpCQ184VVE2X11bMFM/XklGKUNfKUIsQl9SJD4nP1xHKCIjXworTStCNEVfUlhCKF9cUSkiL18xJDRfX10/KFIvXyxOW09fKiIsQ19SNEAoL1xEJ1FfXylCJEFfUlhHKV9cSworTSoyT18uQ1xfX1FcOidPXU83VTtfP1ZdTF9ZJihAT15ER1lLX1otRzpfW0pOS19cTSpCR18oUVg+X1IwRQorTSdPXk9KOidfRFg+I19eKzVVL1xeLjNHXyhRXEFfUixAKU9dJDFVK18xJEEqX1tSTEo/XjNASCtfWV1DOAorTV9YLV1CX1xXMiU7XzdWKU1fWVI0Ri9fOlNMR19ZTTM2X1M4VzBPXE4sIz9fKiIwRl9SPEMpP1xCJ0IjXworTShRXEFfUig+KC9cQidCI18oMVQ/X1IsPyg/XEgnMVNfMVQtJV9VJTA1T18gTjwjX1pNR0NfVVU2OV9cXQorTTBFM18wREU7X1dVVkAvXlVKOytfWV1XTF9VMTI5P11BODcjX0MoKitfXiMzVi9cXC9UM19DSSIuX1UhLgorTTVfXSIxNDtfU0xPKl9SQEksL1xLKkMjX0I4Qi5fUyxUL19cTiwjQ18rQzhaX1wyWE4/X0ZVTUtfVDwmWAorTV9dLllLL183TVpfX1MrIkxfWUYtQU9fOVEtP18oUyUgX1I0QSo/XEYqUydfPidBVV9ZVjhET14wQlhPXworTUAnTVtfWEIhPl9dRzglS183JVVEX1k2MEUvXEgqQldfLVQtJ19TTSQxL11GOlZPX09cMypfU1koLV9cVgorTTBDL18rVCBQX1RRQzQvXFk1JC9fIyJEN19TWT8zP1xTM0NXXy8lSSpfWUJNSD9fOVQ8V18yVD0vX1MwVQorTTAvXE0qQztfMFNZIF9SOD0nP1xFJlFbXylSIEBfUjxDKD9dLjNUQ19UPD8jX1lSKUI/XEYnMVdfKEFUPQorTV9SPEAoL1xMKFIvXytCKENfUyhFKS9dWz5XQ19VXEspX1xCV01fXEgoUi9fKTIgQF9SPEIoT1xJKSIzXworTStCOERfU1RfLz9dPTkmM18nUUg+X1dNUDk/XUg2NUdfTEpORV9ZTjlFL19EVT1HX01aTkxfUyxQK19cRworTShCK18oMig7X1paSUhfXk1HWVNfWT1DN19TLE4rT1xFKDIvXykiIEhfU0RcMV9cWS9DW19QKlZNX1o+NgorTUVPX05XXV9fOFVVS19TQSk1T10jMVRfX0paIkVfXic0U19fRlQ9O18vM1UqX1IgQio/XEgoUjdfKUIoRAorTV9SNEEoX1xCJ0IjXyhBWEBfUig+KC9cQidCI18oQVhAX1IsOyVfXTE0JF9fLyQ1LF9YQipEP14rQjhPXworTTI0XTFfU00nMy9dIDIlK18+J0lfX1Q5JzNPXEgrQ0NfJyI0U19UUTU1P11ZPkdPX1FcJylfU0ReMk9eKworTUI4T18zVE00X1QpJTFPXylRTDdfK1MgV19SREkrL144RjlLXy8jWSZfUzxYMF9cTy1TT19PSypTX14rMworTVYvXVc8RlNfUjtaV19dXzJTP145Q1hPX0ZJNi9fXVsnVk9cVTIlM18pQiBIX1NJIjMvXE4sU0NfOiZFSgorTV9UKF0wP1xVLSNPXzREUSpfWzZJSE9dPTYlQ19EKDInX1NIVS5fXEEqIltfMFQ1KF9aRkRJL18kUF0jXworTSdBUDlfUiw7J19cNyZRR18nUjQ3X1NZIy1fXFkwQzdfKzNITV9SLE4mX1xCMEJXXzo4XiBfXDslUS9dKQorTTEkS18wI1knX1M0Ty1fXSAuM0dfK0IoQ19SNDsnT1xLKSIzXykyJD9fUiBEJy9fKFBbW19AVyFQX1MoRAorTSk/XEQnMVdfKVIgQF9TLEoqT1xNKDIrXywiLEJfWD4nQS9fOlM8U19PWlpOX1JERCkvXEQnUV9fKzJASAorTV9TIEsqX1xWK0JTXzk2PUVfVV1GOU9cQydCK189RlFBX1ZJPTcvXixCSC9fQyheKV9ePzhXL15QSSo3XworTStSUEtfUjhBKD9cSypCL19LOjpAX1xCWk1fX0tYLV9fLDJYTV9SLD8oP1w7JVFfXywjLF5fU1EjMF9eXworTUtKW19PWyJQX18rRVkvXU46JztfMjU5QV9VOTc3T15SSUpHX1g9Ny5fXj8yVV9cXy9UU18oIihJX1I0QAorTShPXEMnUidfKFFcQV9SIDwnT1xAJyFbXygxVD9fUig+KC9cPiZBU18qUixBX1RFKzNPXSY0RU9fNkY1TAorTV9UMS82T1xZMFRbXypDJF9fUyhRM09cUClWL18tIklPX1NcVj8vXTs0OUtfJiE1KV9WNT9CX10hLzVXXworTS40JStfWTY0RF9dODUlV18zJF0wX11HNlU/XFAsQz9fLCMkUl9URSsyP1xQLENHXywzKF1fUjxPLF9fIworTU1bQ19ZLTc6X1dZUTsvXyBKWkdfVyxHKV9YOVI7T11XO0Y/X1UrVzBfUTBHLF9cRSdSP18tVCEuX1NEXworTTFfXEEoUjtfLCJQVF9SJEQrX10sMiRLXz4mSUFfVzlLOS9eMkA4J18xQ1UkX1IsRCpfXF4vI19fTUpOSgorTV9dVy5ZT1xHKlMvXy5URThfUjxLLF9cVi1DL18wRCBdX1NcWy4/XDskUSdfKyJUR19SVFMrX105ODVXXworTVU9KzFfU0BZMC9cTSwjU18uQz0kX1ZFRDovXEwoQjdfK0IwR19SOD8nX1xGKEIjXy8zUFVfXT8rUV9dTAorTTZVT18pQVw/X1IkPic/XEcoIiNfK1I4Rl9SVEEoT1xVKiI/X0NIWitfXVsxVC9eU0hKK18qMjBEX1IwPworTSdfXEgoUi9fKkI0RV9TQFArT11FOVY3XzhGRUlfUig9KD9eOUMoJ19QWypSX1gtXD1PXUk5VitfWT07OgorTV9aVkFIT1xJKUI3XykyIEBfU0BTKz9eXU0qW19VLEMkX14zPFZPXFgtMzNfKSIgQl9SIDwpL1xSLTQjXworTS9ENSVfXCpTTF9fLE9bW19bXjNDX1clSj1PXSc0VVNfN0VVQ19bRktLL19JVk0zX1k9IzVfVDUlNE9cOAorTSZCJ18pIVxBX1I4QikvXEMnUidfKCFQPl9SIDwnT1xBJzFfXyhBWEBfUVg6Jy9cVSlSQ18yVDksX1U1QAorTTpfXTE2VjdfMVRVPV9SQEgtX11ANzZfXzxGWjRfUixCLj9cMCQhX18jMFQ6X1BIKSVPXDsmM0tfKyI9MQorTV9TRFQ1T1w/KDJDX0laNkJfVUU1N09dIjE0O19VTS8yX1JMTSwvXFguQ0NfLTM8VF9TKFUuT1xQLDNTXworTSojIFRfXDpaTl9fR1YtV19FN11WX1xGUEpfX0VTLE9fR0g5V19XTVE5X183UC0vXygjLF9fUiQ7KF9cTworTS0zX184RjlIX1I0Ryk/XFErIltfKDIgR19UWSYxL14oPjZTX0InVVZfWSYiQF9dKzEkT18oUjRMX1M0VQorTS4vXkFHKVNfUytTOF9SREosP1w0J1I7XyZRVERfUihCKz9cRSpDO18vJDEuX1EsOigvXEUpIktfKlJIUAorTV9TRFYvL1w/JiFDXy8zRSJfU0xbMk9dKjJFR180VSE2X1JMQyg/XFgrIldfKkFYQV9STEQnT143QlgrXworTVYsUyVfVUUuMz9cSilCQ18oIUw9X1JIQyhfXEooUi9fKiIkQV9TIEYoT14pQkgzX1dNJzBfWjIyRS9cSAorTSgiL18pUVxCX1JIQyhfXEspMi9fK1JER19WVU47X11AOTZLXylCJENfWjIxQT9fIEs6N19RW05UX1w2WQorTUwvXyhOWztfSkouQ19SQEUqX1xFKFI7XzFDQFVfWz5QSk9fP1QtI19aTU88X1MwUSwvXEQoIitfJ0FIQgorTV9TPFoxP10mM0UrXzlFWUFfXS8nUk9dWz43T18+R1VeX1c1Wz8/XUg5Nk9fS0ouSF9fL0FXT184Uz0zXworTTI0WTpfUUQ6KD9cSChCI18pQVw/X1I4QSg/XEEnMV9fJyFQP19SID4oP1xBJ1InXydBTDpfVDhXLV9dIQorTS5UL18xVF0/X1U5OzlfXSwzRTdfIzAsLF9STDQnX1xSKDI/XyUwSDdfUiQ0J19cRyVRX18mMFQ2X1IkOgorTShPXDgiUUNfKUFAR19SIDooT142QkhPXzEkKStfVD0oMj9fMVQsX18rIlhRX1RRLjMvXDknIVdfKCI0SgorTV9TUSExX1xJK0MvXzIkLSdfXVs2Vj9eKT4mT19QOk5CX15HM1JfXjhBJztfP1cxSV9dPltTX1w8K0NDXworTSsiNExfUjhRLy9eMUQoX18qMjhFX1M4UC0vXEkoUk9fMVNcW19ZTis+X14xQUdfX0Q4LiRfVEUkMk9cQgorTSkzI18oUixGX1paTEtPXzpQXiNfKTFQQ19RQDEmL1xBJCFLXygxSEFfUUw7KS9cQiojI18rMyBbX1I0RAorTSpPXE4rMzNfNTUlOV9dOyxTX10iLlQ3Xy5TTSpfVS0zOC9dMzNFM18sIkBGX1IkNSYvXEwoIidfM0Q0XworTV9bXlNLL188U1xLXzFDWFxfUkBCKU9cQyZRW18qMihCX1I0PidPXEkoQitfLFJERV9YRipBL18+VD0jXworTUgoWjBfUkBAKF9cRydSK18qIiRBX1JQRikvXFArIktfN1VdQl9VVUI5X1xFKCIrX0wqKjlfVjU4NF9eRgorTUdJU19JSVI4X1wuV0wvXj5FSTNfKiIsRV9SSEIpP103MiRDX0UpKi9fXVsyVT9fQlRdQ18rUlhNX1IwQAorTShPXEInQjtfLVNJJV9TVSAwP15cTSsrX1ZMTytfXis+Vy9dNTZFM18tMyxVX1YhOTgvXkNGKVdfWz0/OAorTV9cWyVTL1xcMDRXXychTEJfVik6Ni9dNTNUV18mQTQ1X1IsPyg/XEEnUidfJyFIPF9RXD0nX1w/JzFfXworTTYkVSxfVEEpNC9dJjRWM18wNEE2X1I8PSwvXF0qUldfSlkqIV9XOTo1X106LzNTX0YnNU5fWDVBNV9eJAorTThFX18qUUAyX1k6IT9fXkdEOS9fJSA4I19TPEkpT10iMSRTXzI0SStfXTcyVD9cPCdCJ18rIlROX1NdIgorTTFfXFAtM09fKyMkV19SMEcrL1w8JkFXXychPDlfWEFWOy9fIUpaK19aTTMsX1k2ID0vXVc7VjdfVTtXMgorTV9RQEouL1xMKTJfXyhTIF1fWjJAR09cTCoiS18vIzxdX1JcSCxPXSAuIztfSCkyJV9YKVk8X14pPzdbXworTTdVTUNfUjhJLT9cWy5EI19PKz5dX1w7IVY/XFItM0tfJyIgSF9RLDInX1w7JVFHXyRRLDZfUTg3J09cPAorTSVSL18nITw9X1EoLiVPXEopIlNfVCwzJ19VLSw1T10gMCRfXzA0JS5fVSErND9cTChCN18qUVxCX1RRIQorTTAvXFcrIk9fNiRVLF9ZPi9DP1xUKzJXXykhXEFfUjg/J19cSykiM18qUjBEX1JAQSg/XFIqIjNfQjhKJAorTV9eJzRUX14rPjdPXyhRTD5fUjQ9KC9cSykiM18rMjxFX1JUSSlfXUA4Ji9fNFVBPV9SPEIpL147RDhXXworTSkhVD1fUUg3Jz9cQydCK19GKFInX1o6O0ZPXTc0JSNfKyIgPF9bWlJLT14hQFgnX0taNkhfXUsvVS9cUgorTSwjK18pMiRDX1FcOyhfXFYuNDNfL0NcWV9cRl9OX19CVF0zX1hdOzFfVSUvMV9cXC4jO19TLCcmX14/OAorTVcvX1VXXVdfUywvKl9TQF0yP1w7JkInXyxCSEhfUzxRK19dIi8zV18mMTQ3X1IkOiZPXEUnQVtfKCFQPgorTV9SID0oX11aPEcjXy8jWSVfVD03OV9cWzE1L18uNCkiX1FMNixPXUk1SDNfJTBQPV9RLDQmX1wyI0E7XworTSVBIDhfUTAxJ09cNyVBV18iQDg2X1MkSzA/XDklMVtfKTFQPF9TXSMyX10pMVRHX1VNJzFfUiA/KT9cTgorTSszL18sMyxaX1JYUi5PXFAtM09fKTJATV9TIE4sP1xBJyFbX0JXTVJfXCZNST9fSVUtI19GKDVbX1clTQorTTk/XytNTFNfJVJEV19SOD4qL1w/KTM3X1FbXl1fUlRIKk9dJC9UN18rMkRRX1NAUSw/Xj9FOE9fQTgxXQorTV9YVipCP11GOUZfXypCVF5fVDUhMj9fJE88P19VPEdCX1Q9KzM/XEcsU1NfJSFYTV9TIFAvP1w+J1JLXworTSZBTEZfUjA9KV9cOCQxQ18mMSw7X1JYRytfX0RVPUdfMVQhKl9TVF0zL1xWLUQvXzNUSTBfUkg+KV9cSQorTSciJ18rMiw/X1JcQykvXDolIUNfKEFQQF9SKD0nX1xKKEI3XylSIEBfUkRCKE9cSykiM18qMihCX1MwSgorTSlPXUU5RiNfWC0vMl9YJU88P1xFJzIjXykxVEBfUlBFKT9cSikiK18qUjxFX1VdPzhPXTk3Ri9fJyE8OQorTV9cQlxOL1xFJ0FbXyhSIEZfUig8KC9cNSNAW18mMTA4X1ZBQzlfXEgnQUtfS1oiOl9cJl9NX18kTisvXworTVArKk9fUzRULF9cQydSJ18mUTw/X1M8WjE/XS00JEtfUjwvJ19eMzdYT19GVV1DXzk1XTVfVkFANy9fQworTVUtQ19cTV8/X18vPVZfXyVPLC9fLyQlLV9SNEQqX1xeLUMzXzY1LTFfVlFHOV9cQScxX188Nj1DX1JMQAorTSdfXEUnUi9fJ0FURF9ZLidCL1xRLCM/XzA0UT1fU0RdMy9cXDIkV18hQExHX1Y5Q0YvXFktRjtfJiEgTAorTV9RTCwnT1w+JCFHXydROD1fUUw5LF9dNzVYI180RSlZX1BcLydPXEUoIiNfK0MwXF9ULSEwX187VE0rXworTSpCRFBfUlhNLS9cVi4kI18qUlhZX1I4SixPXEEpIkdfKlJETF9TSFUtX15fTCpLX1VMLl1fXlc4VU9ePgorTUJYL19BOCFUX11DIFNfXSAzRT9fK0FUQ19XOVZBP182UVw/Xy4jIFNfVl1MPE9cVS0jT18tMyBSX1tOUworTUtfXjBFWSNfMDQxJV9VST06L1xTLiRLXytSTFRfWjI9Sj9fNFEtQ18xM1kmX1IsQClPXEEnUkNfLVM9IgorTV9TRFoxP10zNSVfXylCOE9fUkBILF9cPydSQ18yJCEjX11bL1NfXSMvVENfMFQtMl9TUFkxT10gLlQnXworTSkhUD9fUkRAKC9cUioyR18sUkhKX1FEMyVfXDolMU9fJ0FEP19RVDgnL1w7JFE7XyghRDlfUjQ+J09cSAorTSgyJ18sIkBEX1kmKEBPXzdSLC9fOkVZOl9SPEIpL1xBJlFfXyoiIENfUyRIKi9cRChBX183Ri1DX1YpRgorTTovXipBODdfNCRBJl9SID0nL1w/JzFfXyhRUDxfUjQ9KD9cQSZRX18pQiBEX1JIQik/XS8yND9fRDhaKQorTV9ZUjdEP15UTCpDXy1DJFFfUyBLK19dXz9IN18tI0EgX1YxRjkvXltNS0tfVy07Pl9dMzRUP15dUFtfXworTUpbJlNfXTMxVV9fTFZdT19cTVM0X1tGVU1fXF80JTtfJTIwRF9XPVg+P15aSzpDXzc1LTZfUVg8J19cPQorTSchT19EKEooX1Q0WS0/XEMnQitfSTlGNF9YKVk+P1xPLDNHXyxDMFxfUlRVMT9cWjE1O18iIFxDX1I0PQorTS4vXUo5KVtfNDRaMF9TQFg8P1w4JlRLXyZBKE1fUlxJL19cNCQyM18lUTxCX1FAMyVfXDsmIVtfKDIkRAorTV9aQkhKX1xLK0MvXysiWFNfUzhZL09cTCtDN18oUkBOX1FYQSlPXEUpUktfLFMkU19cIlZLL15SR1k/XworTVdMOyNfWS4hPV9eJT0mW19LOU4/X1ZRSjsvXiI+VzdfWS0/Nl9eLy5TL15QR1lfX05bKlJfUjxFKi9cTworTSpCW18tIyRQX1IgRiovXT85RjtfKyMwXl9TKFcyP1xQLCNPX1RcTzVfXic0WU9cUipDM18pMiBEX1E4MgorTSZPXDkmIV9fJ1FYRV9RVDwoX1xAJ1I7XydBWEtfUjxIK19dRTdFW19XXSMxX1M8VS9PXFAsI19fMSNZLAorTV9UKFswT1xNKUI7XykxWD5fUjQ+J09cQiZRT18sIkhOX1FENCYvXDUkITNfJVEoNl9RSDIlP1xCJlFPXworTSpSMERfUkxEKS9cViwzJ18pMVRAX1dZUj0/XUE2NVNfKSFcQ19SJDwoL1xLKFI7XytSOEZfUjxGKT9dPQorTTg1X18/KCFeX1lKM0RfXE8pMkNfJ1FMPV9RRDomX1w/JkFTXyghSD5fUig8KC9cPyYxV18oUVRBX1FAMworTSVfXDwlUU9fJzFIOV9VMTIzX14vQkhTXzNUSS5fUVw+KT9cXTA0R181VVE4X1wjIlE/XzNUPidfTys/KQorTV9SLDwrP10pMFUnX1U8WzhfXks9Vy9fSlVNQ19JWVJJX1RJIjVPXFwoUzNfPVZZVV9cLlRLT10rMCQ3XworTSgxWERfVlFLOk9cUCpSO19GWFotX1JEQylfXlhLOjtfKiFYOl9WRUg7X10kMURXXyZRXEdfUz0gM09dJgorTTNWI18vVCkuX1EgLSZPXCkgIStfKEE8Tl9QWCcmP1xJKSMjXyZRTERfUyRUMC9cSCtTV18pIjhNX1FEOQorTScvXSkyNFNfJSEwN19RTD0oT1xJKyMnXytTKFdfUlhRLU9cRCoyX18oUjhLX1I4SCpfXF0vQ19fT0sySQorTV9bLj9FX19GU1xLX0RYJVdfWFlbPF9fIUxKV186NV07X1VZMjI/X05XXUtfWS0vM19dPyhSP10lMCQzXworTS4zSFtfUixBJ09dQTdVS18qUyBOX1JETSpfXScyNSdfLSMxJ19TME8uX18yUUxfX1YsTz1fUlhGLC9cUQorTSsjI18nUUxDX1FMNydfXEInUjdfJzFIQF9TIE0sX1xRLDNLXyVRMDpfUzxQLC9fQ1UtR18uU0EkX1NcXworTTNPXF4uJDtfLFJQU19SOD8nX1xHKCIjXysyOEZfUjg/J19cVitDJ18sQkhNX1M4Tiw/XEImQVdfJ0E8NworTV9SSEMoX1xJKEIrXyoyKEJfUjRAKS9cPiZSJ18nIUQ/X1FUOigvXEgoUkdfKlI4Sl9STEMpT1xNKSIzXworTSkiLEJfVj1FOC9dRjg1T18qIVQ8X1sqR0tPXVM7NzdfKUI8Tl9RVDwoX1xCJzInXyghTD9fUVg5Jz9cQQorTSciI18oUVhEX1IoPShfXD8mQiNfJkEwPF9SND8oX1xBJyIjXylCNExfUkxPLV9eQkY5R19JWkZMX1dSOQorTUk/XTxBWV9fMCNNNV9WRTM6L15PR0pHXzolWUFfXVMvU09eLUNJN18uVE01X1M9IjBfXi5DWSNfVTw7IAorTV9TWFMuL1xHKSJLX0YpLi5fWV40RF9eNkJIV18nQUQ7X1w6WkxfXFosIlNfT1tbJV9UJSMyT10+NyVbXworTS0jOF1fU1EnNE9cXDJVJ18nUkQ/X1Q1KDBPXjVFKU9fKjJcWV9VUT85L1w7KCI3XytDOSBfUUBCLC9cXQorTTFEU18tI0hcX1QhIjE/XDklUUtfJVFEPl9SVFAtP1xJKyMnXytDJFZfUiRGKy9cQikyS18rQyBTX1NEWgorTS5fXl5NKkdfSzlGMV9eKytRT14sPkcjX0YoQV5fXCJUSz9dXzxWU19KKTYpX14/N1UvXy5PTCtfMTNIXworTV9SXFItX10hMUQ7XzBUJFxfWFYtQC9dRTlVW18qQkRIX1JUTS4vXVc9KDtfMUNdJ19bTlFNL18+VD4vXworTSoiIEpfUiA7J19cQScyN18oQVRDX1FMNiZPXD8mQVtfKiIsR19RTDgnT1w5JTE/X0k5Wj5fXUsvVU9dIworTTBUW18vI1ErX1QgWjIvXFEqQydfKVIgQF9SLDwnL1xLKSIzXylBXD9fUlBDKF9cVSsiU18uIlxPX1MgRworTSlfXFIqUk9fKlIwRF9SPEAoL1xLKSIzXypSLEdfUTQwJS9cNSUxQ18mUTQ5X1FQNScvXDwlUU9fKCFAOworTV9STEIoT1xDKDIvXzxGVUdfVDxdK19eQURZI19UTDcwX1YpOzlfXDkmQjdfJ0IkTF9TLFIuL1xFKFI7XworTSghWEFfUVg8J19cQyghX18oMVg9X1IkPCgvXEEnIitfKUFcRl9RWDknP1w8JlIrXytTLFtfWUoxRi9ePAorTUg6J18tRF0uX1Q1PzovXFotVDNfRFguK19bRkpLT11BNkYnX1ktV0dfV1ohRE9dITI1V18rQkhSX1lONgorTUZPXy9QK0tfLVJQUV9STEgrT15WSjozX086Wk9fV1VSPj9cSChSL19RO0ZQX1lOMUM/XyhRXFtfMyRZNQorTV9RODQlT11fQDhDXzBUVTtfU0kmNT9cPSsiQ18zJFkzX1heKkcvXEgsRDtfJ1IsRV9USSszL1w+KCJDXworTSoiTFxfU0xdMS9cVC4jS18wREEqX1NNITBfXE4sMztfK0MkVl9SREwsP1xKKzMrXylCTFFfUkBLLC9cVAorTS1DR18pIjRGX1wqWEs/XldIWU9fWCxHJF9YTVk7X15AQzg3X05aTkhfVi07Nj9dMzJUJ19ZTTMwX14rLQorTVJfXjZCWEtfLTNIWl9TLFgvP1xBJ0FXX0QoSiJfV01ZPD9cRilCR18pMkBUX1JMTi9fXTM0RUNfQTg2IgorTV9eJy9YX1xRKyMjXyhCLEpfUyhOLU9cRSgiK18lIFwzX1FYOSc/XFErIyNfMFNdJ19SQEorX18sT1wzXworTVY8QzJfVUE2Oj9dJjI1T18wVC0uX1JEQSk/XEonUVtfLSJESF9SWEMoT1xLKCFfXywiQERfUlBHKE9cVAorTStSS18qIiw+X1MoSilPXFIpUjtfK1IwQ19SWEMoT1xJKEIrXypCNEVfUVA3JV9cNyRBK18nMUA6X1FUOAorTSZPXD0mIUNfKlI4Rl9RVDYnP14lPkcvXz1GRTxfVDxYMF9cUiozS18pMVhIX1FYOihfXDomMjtfJjFIRQorTV9RQDgoP1xJKjMrXywzJFpfUkxMKz9cQyhCJ18oMVxBX1FcPSdfXD8nMiNfJyFIPV9RPDUmL1xVLSNLXworTSVRMDpfUTQ1Ji9cPygiJ18rUkRNX1IsRCk/XTMyRDNfQTc5UF9WVVQ+T103RDo/XzIoQkdfUyFQQ19cWgorTTlIQ18qQyEmX1chOjZfXFcoQj9fKSIkR19bOk9KP18wTjtLXzg1MTlfUlxNK19fLVA7Q186Rk1WX11LMQorTVQ/XSEyVUtfNCRZMV9cIl5QL10mNCVfXy9ESTlfUTxDKE9dJjEkJ19BKCoyX1IwTS9PXEwtMzdfKTIoPQorTV9UTSo1X1xMLTQvXy4zUSFfU0heMC9dJTI0T18sU0RbX1M8XDA/XFEsUztfJDEsNl9TJFYvL1xEKVMrXworTShSOEtfUUxAKC9cUCxTM19MWlpOX103LlNPXzlTXStfVV0jMF9eIzBVL19EVE07X1A7IlZfWypDSV9fTworTVU9Q19XTS84X1ZNRjovXVQ7VkdfKyJYS19SPEYpP14hP1dLXzpWRURfVDklMl9cSSpTS18mQVROX1MkVQorTS1fXSUxRD9fWE0nSV9TMFMuT101NyZDXyghXExfUVA7KE9cQigiR18oMVxIX1IkPyovXFIrQz9fJlFYQworTV9dIyFRP185Ui0rXzclTUxfVFEvOC9cXy9UQ18qUixGX1JMQCdfXEwpIitfKjIkP19STEMoP1xMKUIzXworTStSREdfUkRDKD9cRighW18pIVA6X1JURShfXE4pQjNfKzI0Q19SXEgqL1xUK1JfXyhRWD5fUlRIKi9cVQorTSwjI18nQUQ5X1JUSCovXEQnUV9fKSIoRF9YTV4+P10lLVNDXylDMTVfUSg+Ll9cOCYyS18lQSw/X1E4NQorTShPXD4nMktfJkFIRV9RWD4qP1w4JiIvXyUhLDpfUyhRLi9cPydCN18oIVxGX1FYPCdfXD4nIV9fJyFIPQorTV9SPEUqL1xJKVJLXyRRJDRfUiQ/KE9cRikiP18nIUxBX1YpNjRPXyNMSlNfOFZFS19RWFkuT1wqKSI/XworTSdEPSxfVjIlRD9dOj84S19IWlpJX1M4USxfXE0qIltfTUtKUl9cUlpPL10nLyQnXyoyPElfXEpeTT9dJAorTTJFS19VPEspX1NBJTVPXitCOFNfUiwvI19UKSw2X1xXMFUrXypDOFVfVFEqMT9eI0E5M18pIlkiX1I4UgorTSw/XSEvU0NfM1RZO19RTEUsX1xQLSM7XypCWFBfUlxTLT9cRypSV18qMlhUX1JcUS0vXEsrMyNfKzMkWQorTV9SSFAuT1xBKSJHXykiQEZfUzRVLi9fKE5LT19RSzJWX1wmT0w/Xl1KWldfSzleQF9aJjVFT15BRTk7XworTUY4Vi5fWS1YP09dKjE0R18tQzBWX1UtLjIvXU47Rk9fJkFEOF9SOEUpL11CODYjXzYlPT5fUkBJLk9cRAorTSlTQ18tI0BaX1RBJjIvX0FUXl9fKlJUVV9UQTE3X1xOLCNfXyZBVEhfUjhKLj9cPSgzI18kITBDX1U9MAorTTZPXUk6VltfT0siUV9cMllQL11FOTZbXzNFIThfVDkpM09cSikyP18pMVg+X1IkOiZPXEMnIVNfKFFQPAorTV9SQEEoP1xBJkFLXyoyKEJfUlhHKV9cUSpCS18pQVw/X1JIQyhfXE0pQjtfKkI0RV9SPEIoT1xNKiJDXworTSpSOEZfUzBPK19cSSkiM18pMiBAX1IkPCcvXD8oMV9fMyNcXl9TUFUvX10jOVhTXzUmUi1fUFQ0Ki9cNworTSUiI18lUTQ+X1FANSg/XDMkIVNfJiE0QV9RVDopT1w6JVIzXydRUElfUUQ2KF9cQCcyS18tIyhbX1JESAorTStfXSgxVFtfJ1FYRV9RWDwnX1wzJDEzXyNQVDBfUEwpIy9cNyRBQ18wQ0BbX1FYNCQvXDgmQT9fJUE8MAorTV9TOFUrT1xBLiMvXzM1XUNfU10hMi9fN1IsL18sQjxOX1FQPykvXFgwQ0NfOTVFOl9TNE8sX1xYLSM7XworTVJLWlVfUjRLLl9fL1EsL18tRC00X1lGN0ZPXy1SLENfMCRJOV9TRSU1L11KPFcvXzxXIUtfV1VfQ09cUQorTTAlL18tJCBfX1Q9JS9PXTY1NitfKEJQWl9TWSIxL1xZLzNfXy9ULSVfU1UhMF9cXDA0P18tU0RcX1NZIAorTTBfXFAtI1NfKVJUV19SJEQqP1xFKVI3X0hJUkBfXjsxU19fW1hNV19eLV86X19LQVcvX11ZTidfXk4vPgorTV9fQ0FXL19ZWE1XX10tQzpfVlVLOz9cRilCR18uIzRQX1kuMkQ/XEUoUjdfKEIgQl9SJD8oP10zNEVHXworTStCXSBfUjBHLi9cVi5DU18zVFUvX14zMVlfXEkpQlNfLCM5IF9TOFMvX1xDKFJTXyRRMD9fUSw0J19cWworTS8kP18qUjBMX1JYTCtPXF8tIy9fNkUpNl9VRTk3L1xULVNDXyszKFJfUjhFKS9cQicxX18pMiBCX1IoPQorTSdfXEUoIitfKyIwR19SMDwnX1xJKDIzXypSLEZfUkREKU9cQydCI18qIixFX1I4QShfXEYoMidfKDFQPAorTV9SMD8nX1xEJ1FfXyZBNDVfUig9Jz9cRyhCK18pIVw/X1IoOidPXEMnIVNfKDFcQl9RQEEsT1wwJVJHXworTSdBWEdfUlBJK19cQCgiR18nQUxHX1E4MSc/XDckQVtfJVEoPl9RODQnP1w5JVIjXycxTERfUVw9KU9cOgorTSZCL18lUTxAX1FQPCk/XFMsU1NfNVUxOl9SSEgqX1wwI0EnXyZBQDtfViFANz9dWD5HP18vI10gX1E0NworTSZPXD4oIjdfMFQhJl9RREYpX105NlVbX1E7KlJfXys1VD9cVylSX18oUixGX1hGK0BPXytNW0dfLTJITworTV9TJE8sP18uUEtHXztXNiVfXFMhUC9cWzIlR19EKFoxX1xLJVE/XFQvRFdfK1NNKl9XRV4/T187VU0nXworTTs2XV5fUykiNT9cTS5TS181JSkrX1UpMTdPXFIvJEtfJjFUP19RNDkmX1xSLUNDXy5DWSBfU0hfMT9cXQorTS9UK18zJFkxX1MgVC8vXEUqUzdfKDIwSV9WTUg5X15bTCs3X1RcQydfXFcjT19fNFJMO19XLSsuX143OQorTVU/X0hWTT9fWT0/NF9eSzxWP19WWE1bXzclWTxfVlFOPD9cRCgyI18uU0RbX1FcPSgvXSYxJD9fJkFAOworTV9VTTo4P1w+J1MjXykiPFhfUzBYLk9eIkAoK19ZPU9MX1MwTC1PXE0pUl9fJ0FMQV9SSEwsP1xDKTJTXworTSgxXEhfUlhJLT9cPyZCI18nQUg8X1FAMyU/XDolQUNfKUIkQ19SNEMpT10hMCQ7XylSLEVfUUAzJj9cNworTSUxQ18lQTw4X1EwNiZfXDAiUF9fJkEwOF9RRDMlX1w5JFE/XyRAUDBfUUg0Ji9cMyMxJ18mUTQ5X1FMMworTSVfXDEiMFdfJDBML19RJCwkL1w2JDEvXychPDlfUiw+KC9cQydCI18nMUA6X1IsPCVPXDwnQi9fKiIsSQorTV9RWDooT1w9JzI7XycxVEZfUVA9Ki9cTCpTK18sQyRXX1IgPyk/XDglUVdfJkE8PV9RSDcnP1w5JUFTXworTSVRMDpfUTw3Jk9cPSciK18pQjRMX1FUOilPXDclQVNfN0VZQV9TIFAsX10sMyRfXytCSExfUVRAKD9cWgorTTBEM18mMUw+X1E0NydfXDwnIjdfJFE4N19WLT83P18kTzs/X1pNSzdfUkhGKi9cRygxX19MSjo/X14vKworTVNPXFAqIlNfLCJQTl9cLldMX11OPVcjX05bNllfU10yNy9eMEQ5K19QTDMpX1M8XTM/XFkwNTdfPkgmJworTV9dMyxST11IOic/Xy8kOTVfU1EiMS9dVDsmQ18zJE04X1JYWTEvXDEmUStfKEIwSV9TQFovP1w1JkFLXworTSlCTFBfU0RcMD9dKTIkX18sQzheX1MwVTAvXEApMktfSloqQl9cOldPL15MRlk3X0pJMitfWkIzQV9ePworTUJXV19FWEFbX1k+JT5fXVs6JiNfQkdRU19ePzJTP11DOFYjX0paTk5fVEklMT9dKDE0T18oIUw/X1gpXworTT9PXUk5Nj9fOSVdQ19VVT07L1xDKVNXXy8jVSRfWTYwRU9fSVcuP18mUSQ6X1I4PylPXEAmUV9fKEFUQworTV9SMD8pP1xHKSJLXysySFBfUUAzJV9cPSYxT18lUSw1X1E0MSRfXDckISNfJyE8PV9TVFwwX1xEJ0IrXworTTBDKFpfUyRAKU9cQSUxO18pQUxAX1FQMyZPXD0lUU9fMzQ9K19RSDQmL1w3JDE3XychODpfUkhEKi9cPAorTSVBS18nQSw4X1EwLCQvXDwlQUtfJVEoNl9RODEkX1w9JiFLXylSKERfUVw6Jy9cOyYxU18nQUg4X1EoOgorTSpPXDYnMydfJVE8Ql9RTDspT1w7JlI7XyZRTEZfUVA6KF9cPSZSM18nQVBFX1JERywvXE4qUydfLCJUUworTV9RPDQmT1wzJCE7XyRRLDZfUSgyJT9cNSUhT18lISg7X1IoRCo/XF4wJC9fKkJQT19SSEwrX1xOK0MnXworTTUlOTlfVC0lMi9cNyNRL18lUSw7X1MwUy5PXFErIyNfMlQ5Jl9aRkJHL19LVi1DXypCOEhfUlRKKT9fKQorTU87O19aXS82X1JURSo/XFIrMl9fTFoySV9XUiI+T15bTDtPXzAlMUJfWS4oQ19eXk88S18wRT1JX1Q9UgorTUEvXSc/OD9fTStfJl9WITg7L1xOMFRfXztHRVpfXVs2VE9dKTIlN18rM0EjX1JQVCpPXS0zRTdfLlNVIAorTV9SXFIsX1xHKyMnXy4zTSJfVEkoND9cUi00I18qUlBXX1FMQylfXjxEKSdfUytXIl9cLk9JX15eSSk/XworTU86LjVfW15GRT9fJktJT19ROk44X1wyRkVPXyRLOiNfV1w7IV9XJVA7X15TTFs7XzQ0US5fVUUzNl9cRgorTSgyN19EKForX1hCJEFPXUY4Ni9fOUY5VV9STE4xX1xSLENPX0oqIkNfXlc5WF9cQiYiJ18nMVBDX1FUPAorTShfXEkoUk9fJiEoOl9RQDMlX1w/JzFfXykiIEJfUVg6Jy9cPCYhS18mQTg4X1FYNyVfXEUoIjtfLzNRIworTV9SOEApL15DRjlTX00qWkxfWEYmQD9cTCoyQ18nQUA8X1EwLiRPXk9KOldfJlE0OV9XIUo7T1xIKEI7XworTTZVNTlfUzxRLT9eOUNJL185JVFAX1gpXEAvXDMjQStfJTEgMl9SOEEoX1xHKEIzXydRSDxfUFguJD9cNgorTSRBM18kQVhTX1JAVTRPXDIkMVtfJEBcO19RMDEnP1w3JSIjXyZRQERfUVg7KV9cPyciQ18mQTxDX1IgPgorTSlfXD8nMjtfJkFAQV9RKDAmP1wxJCE/XyRBJDhfUSwyJi9cNCRRR18oMixGX1FYQChfXFovI19fLkNQXworTV9RMDonL1xXLjNTXzQkTS9fWTIpQ09dSzkmT19AR1YjX1QpIDBfXUM4Ni9fSTouQF9eRzpWX1xLKTJHXworTStCWEtfXFchTy9fUlZNV18pQVhCX1JERClPXlBIKkNfUCwiXV9bSklOP1xTMyVXXzlHNVtfVl4kRC9dTgorTUFJR182N0IqX1cqMElPXU9EKVNfOEhWP19SQFwyT14iQSg/X1YtIyxfVFktNk9cWTEkX183JVk1X1NIWworTTBPXFMtU0dfPEctVF9TIFMuL1xcL0Q3XzAzXShfUyhVMC9cSysjP18pIlhSX1tOUkxPXy1QLDdfUCpSRAorTV9bPj1EL15TRjhPX1BaSjlfXDJKRT9fLUtZS19QWjIyX1xGUEdfX0BSPDNfPSc1Vl9aRkpMP10/NkVbXworTTlGKUpfUjRAKS9eNURZI19DKEIqX1Y1QDhPXVU9ODNfKzMhKV9TIFAuP15PSipDX1ldM0RfUiw9Kl9cUAorTS5EQ18mUiBSX1IkRi4vXDgmUlNfJTE0QF9RTDYnL1w5JTE/XychQDpfUjxDKT9cVSwzL18wU1BcX1M4UQorTS1fXFEsIz9fK0JATF9WNT02X11QOjYvXzMkRF5fVFkrMU9cQicxX18mMSw3X1E8MSU/XDQjQStfJiEoNgorTV9SLD0oP1w5JFE/XyVBIDRfUVw0Jj9cNyNRL18lUSQ1X1FINSY/XDYkMS9fKSFcQV9SMD8oP1xEJ1InXworTSRBIDJfUVA3JE9cLCQxV18jUSxCX1EoLiVfXDgkUV9fJUEkPV9RUDcoX1w8JkIvXyVROD1fUTg1Jy9cOQorTSYhX18nMVRGX1FMOylPXDsmUjtfJTE0QF9RKDAmP1wzJDFLXyVBNDtfUlBNK09cTiwjL18mMUw+X1IsRQorTSovXEYqIk9fKCJASl9SSE4sL1xNKzMjXypSXFFfUkRKKl9cTytTK18nQihEX1QtKDM/XSUyRENfVCtfJQorTV9SXEYrP1xIKjJLX0tKKj1fXzc9WC9cSSgyN18rIjxJX1tSUExfXzJUPEtfTFoqTV9USUc8T11SQUhLXworTTI1UURfVllXQT9dMjRFX181JVFMX1NZKjQ/XVhESjdfM0ZBVl9XSiBAT187VFxfXzomPVRfUyBbMU9eQAorTUdJO18wI10mX1NNITBfXl5OS1NfKyJcVF9TRFswT10rMjUrXypSWFlfUjRILF9cQytTL19AN1FcX1w+XAorTVA/XkdEWE9fTzouNl9bIjZCL18hSik/X1IrJj9fXFZSSD9fIUk5P19SOypGX11PJ1BfXTo3JV9fS0siWAorTV9VQTU2X11VPDdHXylSKEZfWU45RU9eL0JYV183NUE6X1ZNSz5PXEkrJDdfLSMwXV9WQT04T184VC1bXworTSRROEdfU0UnNy9cMSdDT18wNFFFX1JATzE/XDsnMlNfJyFQR19SJDooT1xNKUJXXywiTFFfUyxRLS9cVAorTStTL18vVCUmX1M4WDAvXFouI09fVixHKV9cUl1NX11ZO0YvXz42VUhfUUg1JV9dQDZVX180NFEwX1E8MgorTSVPXEInIiNfKTFcQ19UWSgzL106NSVDX0AnSV5fUyBKK09cNiQhM18tUyRVX1FENyY/XDwmIUtfKEFUPworTV9RXD0nX1w0JCErXytCRENfU1UlM19cNCJBR18kUSQ0X1EsMChPXEEpIl9fKCIkSF9RUDwpP1w3JVIjXworTSchUEVfUUg6KF9cQihCT18mUUxEX1E4NCc/XDckUVNfJTEoPl9RMDQoP1w1JjInXzIkRSpfVEUrMj9cSgorTSsyW18nIVxAX1FIPSdPXDgmQV9fJiE8Pl9RSDYnT1w+J1I7XylCNEtfU0BaLz9cPCgyJ18uQ0xcX1tSWQorTU0vX0dVPUdfKUIgSF9SWFIsL18iTUsnX109V0BfUkhCKU9cTypCS19MWlJMX11DK1JPXkJHOidfNVZNTworTV9ZTkJLT143RjonXylSOExfUVg9KF9cQilCW185NjlNX1smVlBPXSY3NkdfQEhOMV9dTzVUX10jMUUrXworTS5EMTJfWy5OSj9dIzE0U18uU1hfX1taXE9fXFEtQ1NfLlNVJV9UIF4xX1xHKlMvXytDIFhfUjRNK19eIQorTT43P19OWl5SX11TKlFPXz5SXDdfV0xXJ19dVylQP19CUjwrX1QrTlZfXUMkUC9fMU5LN19XXEcrX1UtNgorTTZfXkVKKldfNVUpOF9YSiZDT1xFKCIzX0hJXj5fWU42Rk9dRTgmM188JlleX1I8SDA/XFMtM1dfO0ctWQorTV9ePzpWP1xeLiM7Xy1DNFRfU0RXLj9cXS9UP18nQiRMX1FMOigvXEMnUidfLEJMS19TNFAsT1xbLVNHXworTS5TSFlfUyxTLU9cTSszO18tU0UhX1JISCpfXUo3NVNfNkRdKF9XOU45L14mP1dHXydBRDtfUUAzJV9cPQorTSYhU18nMUA8X1FMNSY/XTw1RUtfJ0FAPF9RSDQmL1w+JiFTXylSJEVfUjhAKS9cQiciI18lMFguX1laMQorTUQvXFMpIjNfKSFEOF9SPDkmT10uMVQnXy4kLS5fUUgzKS9cNCUxO18lUTBHX1JETC1fXFEsUztfKSIwTworTV9RVD0qL1xBKDJTXychUEdfUTA2J09cMCQhR18kUSQ6X1EsLyYvXDYkUiNfJVFIRV9SQE0sX1xcLkNXXworTS9TVFpfU1RbLU9cXS5TO18vU1RYX1MkTyw/XD4nIV9fJkFAO19RUDonP1w8JkFXXyVRPDpfUUA7Jy9eKworTUFYN19ULEMkX15HN1ZfXEkpQlNfLTMsTl9dMydQT19PVV1TXytCOEpfUyRMKy9eVkw7J19aPUc9X1lCOAorTUZfXTg5RkdfRyoyTl9RLDYmX10uM0RPXz5XVVpfVT04Nj9cSyszI18qMyxXX1NBJzMvXiNCKFdfVl03MworTV9UISQ0X1xZMFUnX0JYOiFfU1kjMj9dJjI0S19SXEcsX1MkWC9PXSIxNEtfL0NVJF9SREwtX1xVLVNfXworTSojIFJfXCZWTT9eXktbL19UXScuX1QtIzAvXSExVC9fNkVJN19cUypRX10vNDRbXzYlVTlfVU09Nk9fMAorTU9cN18yRFUyX1syV08vXUo5Nk9fRyk6Pl9SOEEpP15GSForX0c5Qj5fVklFOj9dVTw4J18qMkkjX1MoVAorTS8vXilBKENfWE1DQV9SQEMpX1w+KCFbXyxTJExfUzxTLD9dIS8zT18zVEklX1U1MDJPXSYwM09fMDNYWQorTV9UOSQwP1xcLkNTXypCRFBfUyhTL09cWC1DX18sQkxLX103KFFfXkhHWUdfPUchSF9WRUQ3X1w9JiFLXworTSghTD9fUSgtJD9dUDpWX18nMTw7X1QkWy9fXDslMUdfNjUtN19RODAlL1xFJ1IvXzo2LUdfUVQ3Jl9cPQorTSdBQ185Ni08X1kiKUBfXjtGSS9fQzdNWF9aOjxGL1xfNCVbXyUxLENfUUQ7J09cQCdDJ18mMURCX1I0QworTSgvXE0qUzNfKzJUWF9STEstT1xFKTMjXygiJExfUjhHLE9cNCUhX18kUSA8X1FANyovXDwnMkNfNlVVQAorTV9SLEIqL1xEKEFfXy1DLE5fVDkjL09dIi9TS18vQ1BZX1FYPiZfXF8vU1NfMFQtIF9SMEIpL1w/KDFfXworTS9UMSBfVj1EN19fLVIsL19aTU9AX1I8RypPXF0tMk9fVVw7IF9fLztYL1xHJ1IvXy0iXE9fW0JVTS9fQQorTVU9Q19FWT46X1RNNTY/XDYmIV9fKVJASV9WVUw5P10rM1Q/XzhGLTxfUkhLKT9dPzkmI180NUU2X1hKLgorTUQvX0FWXUdfL1QtMl9TUSY1L15aTTsjXzA0OSxfVCEjMS9fK1I8U18uJCUhX1QlJjFPXSoyNSNfLDMwXworTV9SQEosT1xEKyJbX1BbQldfW1pPTF9fL1FMO18wU1xdX1NMWS1PXS4yJDtfVi0jM19UPScxL10wNFRXXworTTI0OSVfXS8iUk9dMTUlR19NS0ZeX1ZFRDpPXkRHSjtfKUIkRV9WSUc5T15BRyorXzw2UVBfVz1TQF9cTAorTSs0O18rQyBYX1YlQDdfX01WXkdfKEFAQl9QXDAlX1wwJEE/XyZBNDdfUUQ0JU9cNSQhK18mMTA2X1IgOgorTSYvXFIrQlNfMkQ1KV9TTFcvX10rMiUzXzI0RTZfU0RVL09eWUsqT186VVU+X1RNIy9fXU86RjNfN1VNOQorTV9RPDIlT10lMCQzX0hZWkJfUUQ0Ji9cRSdSL18yNC0nX1gxXkBPXU86NldfOVYlRV9WPUE5P14gPkdbXworTSdBQDxfUlxKKS9eSUdZN19DWCVYX1ZNQzY/XVE4JUtfREhWKF9UITM5P1xBJjI/XyYxRDxfUixBLS9cQAorTSgyQ185RiU7X1E4MiZPXD8nUktfJUE4QV9RWD4qP1xHKkM7XyszIFxfUTA0KD9cNCRSI18lUUROX1FcQQorTSo/XidBKC9fJUFAPV9RRDgnT1xHKTJDXywiWFFfUVQ7J09cPicxU18rMlBLX1MwUyxPXSIwNCNfK0JUTAorTV9STE0qT11YPzc/X0gpWjdfWFooQU9fQFU9S18mUVA9X1ZVPDNfXz1SLC9fWz03Ol9TJEkrP10hLyNTXworTU07PlVfXis4Vl9eJkEoP18sQ0heX1FUOykvXUo5JkNfOiY1QF9VJTY0L11JOVYrXzEkJFxfVi0/Nz9cRQorTShCJ19COEYsX14vPVZfXFwwJF9fLyQ5NF9bPlJLP10hMURTXy80ISFfWiI+SD9cUC5DP18wJDkiX1RFKAorTTNPXFYuNDNfKjJIVV9SKEorL18kTjtDX1ErNllfXUctUi9dLTEjV18wM0xTX1UpJzAvX0RUXS9fNyUpKAorTV9WPUQ0X103MkQ3X1U8IyZfVDEnMy9eIUEoR189RyVXX1VBMjZPXTU0JTNfJzFIOV9RVDgnT11POkZbXworTTw2VV1fUkBJME9cTCtDO186NlFNX19HOF1fXDYkMTdfKDEkNV9RVC8mL1w0JEE3XyUxIDRfUUAzJV9cNworTSRBQ18jQEQtX1M0UC0vXSYxJD9fNCRVM19UOSc0T102NjYzXzMkPS1fXDpVS19fR1RMW19DJ11eX1FMOQorTSZfXDUmIUdfJTEsNV9RQDQlT1w6JUFDXyVBKDRfUSQrI19cLiIgU18oIUg+X1FMNSY/XDQjUS9fKCFMPworTV9RMC8kX1w+JjFXXy9TWFNfW1ZUSU9fIExKR19PKzpOX1w+X05fXkpGWFtfMiVNWV9VLTA1T1w6J1FfXworTSpSOSpfUVA+KD9dODVEP18nQUBGX1FcPSlPXDklUUtfJSEwPV9SNEwsT1wzJUIrXyMgVDRfUUg6KV9cLAorTSZEJ18xRDkxX1wiWUxfXEYqIjtfJ0FEPV9RODElP1w2JUFHXyRBNDZfUjRGJ19dNjRUW18oUVxBX1IkQworTSg/XEQqMjdfL1QxIl9RXEMoP10zNDUvXztGUUlfWEopQi9cPSdRV19CV0FOX1xCVEwvXzZRXE9fKFFUQQorTV9VSTQ0T18jTztPX1hNSz1fWCVeQS9cSCpDJ18oIUxBX1clRTg/XV48VlNfLkNRIV9RPDImL104NURbXworTS0jJFBfU0hYLl9dTTw3L19WPTs1X1NIXzQ/XFEuVEdfUEtKVl9UISUyX1xZL0NTX1IsLyNfUjxLKz9cXgorTTAkL18xRD0uX1JASy1PXFItQ1tfJVIoQ19cLllNP18mTSs7X1VcWyhfVSkjLz9dIi9DO180JEBeX15TNAorTVQ/XVA4NTNfPUcpPV9WJTs0X181UFw/XzE0QS1fU0RdMT9cVixTR187VlVQX1I0QShfXD4mQVNfKCFQPgorTV9XNVM9T14gP1hTXysiVF5fUyRTLi9eUEpaX19eLT9IX1FAOiYvXDYkQU9fJiBYN19RMDIlL1w1JCEzXworTSRQWDJfUUAzJV9cWS1TS18vU1UgX1RJKDJfXSUwVDtfMCQpKV9ULSUzP10nMERDX1QrXllfXlc3U19eJAorTT03O18oIUA8X1FQNyY/XDckUTdfJiEwNl9SXEsrP10sMiRLXzZVNTlfVFEmMk9cNCNBK18oUVRBX1MkTAorTSwvXSAuU19fJkE0OV9RMC8kX15aS1pDX1E7JklfWiIpQS9eIDsmQ186Vi1GX1tCRkYvXFMxRjNfJiFEOgorTV9RKDcnL1xDKUUjXyUxQD1fVVE4Mj9cOiYiT18nMVRIX1FIOCZPXDYmIiNfKFJQUl9RODYpP1w0JUFbXworTSYhUFFfUihaOl9eNEVaQ19JKU47X1QsXjBPXDwlQUtfMDNRIF9RSDgmT1w7JzFLXzJEQSBfWiY+Rj9cOgorTSVBQ18rIkxKX1QhIC8/XFIrUltfJFBcMV9RSDUmP1w+JlFLXyoiUEpfVkVJOU9dQjRER19NWkpFX1wqWgorTU9PXEUoIjNfOVVdPV9ZXjdEX19CV01TXzw3LVFfVE0vND9cVi4jV183VUk1X1YpNjQ/XS8zNSNfNiUpNgorTV9UVS0wT10rMkRHXyYxUD1fVzVeP09fPVY9T18vJCE1X1JIVDBfXl9NWy9fMSRFL19TQF0uX18vUlxHXworTSoyTFJfU1ReMT9dIDAkR18qUlhZX1I4TC0vXDkpIjdfUDs6VV9cKlJNT19DVSxbXz01VTRfVSEmLl9dOworTTQ0L19aXTMvX1ddTDgvXitARydfOUYhOF9dMyJRT10hMFRLXy5DWSZfVDUkMk9dXj8nW18oUVxBX1FcOworTSc/XEInQiNfOjY9Sl9RQDgoX1w1JVI7XzMkUS9fWypNTD9fX1s+I18rIVwuX1FcPChPXD0mQiNfKDFYPQorTV9RWDknP1w5JSFDXyYxMDhfUTg0JV9cQCdCJ18rUlRQX1M8VS4vXFkuVCNfL1QhJ19VOTE1X18mTjszXworTVtNTzNfWElcPj9dJS1DS18qMTw5X1E4LyNfXDMjUSdfJiEwNl9VUTg2T11LOTZHXzc1PTtfVEEiMU9dOworTTU1R181NSE0X1E0MCUvXD4mMVdfJEBUMV9YVidBP15NSTovX087QlNfW0JQSy9eRUkqT19QSyZEX1UpQgorTT8vXEMoIV9fJFFEQ19UOTtCX1w5JlIvXzdFLShfUSw4LD9cOiciT18kQSg1X1E4PSpfXEosU0tfJTE8TAorTV9QWDUqP1wwJlNXXyhUJVlfWi5JT19eKkBIO18qMiRLX1E0MyVPXUY5NjNfKEIoP19TLFQrT14uQTdfXworTUhJUjpfUTw1JV9cSilSK19CKCFcX1hSJUE/XD8mQVNfJjE8Ol9RODQlT1w0JSE/XyYhNDRfUyRGJ19dRQorTTc1R182JS03X1MwUi0/XihAJ1tfNTUlL19YIiI/X14mQig3Xy1TUFhfUUA7KC9dQzhWO187RkVJX1siTAorTUtPXl1OS0dfPVc9Tl9TTF4wX1xYMFQzXz8oQiVfXVM4Vk9cWS81K18sM00qX1taVkxPXFMuI1tfL0QtIQorTV9cXytSP1xSLSNPXzBELSpfUzxXMC9cTSwjT18pMkBTX1IsTSw/XlxMWy9fTUpOUF9eIzNRT14oO0YjXworTTRERFtfVik4Mz9fUVctP19DV0lOX1lSLz9PXUk4VU9fVSwzKF9TQFowP1xYLyQzXy9DVSNfWSIuRC9cQAorTSchW183RUk8X1MwUCxPXU06VltfKUI4UV9SJEMsT1xTLFM7X0taSlBfX19OVU9fJ0ZXL18vQVgkX1FQNQorTSU/XDklIUNfJTEgNF9RPDIlT1w2JDE3XyRRJDRfUTg0JV9cNSRRO18lMSw2X1EwMiUvXDQkUUdfJjEwOAorTV9bWlJLT19IVTxXXzpFVThfUjQ8Jy9dKjAjU18yRDUlX1FENSVfXDYkQTNfJkE4OF9VJSszX1xVK1MvXworTSlCIERfU0RTLV9cNiQxN18lUSg2X1FENCYvXDolMUdfJlFEPF9RNDkmX1xaMSQnXzQ1OTBfUyhXMF9fTAorTVZcW18tNC04X1I8Qyg/XDAlQjtfLSVKLV9RTDsqT10zMCNDXycyRSZfUUQ8K09cOiZBV18lMVRRX1FMRQorTSwvXD0oI0dfJCFQWV9SLFc5L1xALzc/X0s7JyZfWSotQ19cTStTM18lQUQ6X1chUjtfXFQtMl9fMiQ4XworTV9cTltOL15PSTpDXyoyTElfVCBbLT9eW0xaX19CODIkX1dVXj9fXEkrMl9fJlFcQV9RWDsoP1xHKEIzXworTTIkLF1fUUQ6JS9cMSQxM18qMjxKX1g5Xj8vXE8rMyNfJFE4O19RIDMlL1xKK0JTXzlWOUVfUyBRLE9cPQorTSgiN18uM1kkX1M0Uy1PXE0rIk9fMCQtNV9TJSEyT14iRChfX1c9RztfUyBUMj9cVjAkX19PWz5TX1M0WgorTTAvXFwwM19fUzxHJ19SXFEuL1xWLVNbXy9DWSdfUjxKLT9cRSkzK18mMihIX1g+IkEvXlVLSzdfV00vKAorTV9YOVE5P10zNEQ/XysyUEVfXV8wUl9eLj42V19KOUIoX1ZBRDcvXzJQTDtfL1QlKF9TOFowT10jMERDXworTUYpOjhfUig+KC9eNUQ5L19FWS41X1ZJSDpfXEUpMyNfKDIsUl9TMFQtX15NSipbX19fK0lfXUZDOk9fIAorTUVWV18/NVBYX1FUOyVPXDEjQU9fJSEkPl9RRDEpP1xUK0QrXyQgVDlfUTg0JV9cOCRRR18lIFQ1X1EoLworTSU/XEsqIj9fUTtOV19fIzZTP15LSElPXzpWNUNfUiw5JT9cRSgiM18mMTA6X1EsLiQvXDwlUT9fJEBULQorTV9SKD0nX1w/JiFfXyhRUERfUkg/J09cVCkiJ18uIixBX1JYPCY/XEcmMUtfKEFUP19RVEIoL11VPjc/XworTTBUNSNfXTsxVF9dOjpXT18mQjhKX1E4OSkvXEYzSDtfJkFcS19XKUI0T1w9LSVbXzxXLVxfVTk1M09cQgorTSwkP183JilMX1JEUDFPXCsnVFNfKENRW19SQFo9L15YTTw/Xzc2LT9fUzxYLj9cNCRBN189JzlNX1UpMAorTTM/XUc3VU9fVDwqXF9bSk9LT10qMiRLX0IoNiRfWEIjQV9dKjMlJ18rIyRWX1JUUC0/XEUqMk9fKjJMTgorTV9SJEMpT1wzJUE/XyZRVDtfUVw9J19cPyZRV19CWDIkX1MsUy1PXFEtI0dfKlJcUV9RQDMlX1w0JEBfXworTSghTD9fUVBGLC9cQCsjL19POz5bX15DO1ZPXVw/OFtfLyRRNl9XJVg/T18/Vk1bXy1TVS1fUzhdMl9fJworTU5bP18wNDksX1NEXy5fXzhUTSNfLEMsWl9TKFUuT1xLK1MnXypSVFRfUkhKLF9cOycyK19PKzJYX1gxWAorTT5fX0NTTEdfRDdVVV9TWFUrX10mMSNfX1xOJzRfWV4nPi9eTEZIU19AVz1OX11fMFUvXSEwJD9fNzY5TQorTV9UISMyL147RjlPXyYxNDdfWUo2Ri9eR0haN188Jk1PX1IoQiw/XEUqI0tfK1JcWF9aWkZKT19cXC5PXworTVc6PU1fXEpAPE9fJkVVV19LSSFaX1NEQixfXD4lUzdfKlIxIl9SQEEsX1w8JVFXXydRSDpfUiA5Jj9cOgorTSRRS18nMUA8X1JERShfXy5QS1dfXF1TN19TXF0uT1xZLVNHXzg1STpfUzhYLT9cPCchR18pUjRCX1JcSgorTSpPXjhDKDdfSUk6LV9dLl1NL19PVFxPX1k8XyZfXyM4U19fTVQ8R19bLTstX18rNlRfX0JSPENfTEoiPQorTV9bQkZIX10mLkM7X1VMWzhfUzEnNj9cVDNFU18uU1kpX1NBNkBPXD8nUitfTDlJXV9SNFs4T10jMTRTXworTS5DXF9fUVBRNS9cNigjM18oIykuX1E8WDs/XEczKFdfKyQhWl9bTllSP14iQkg7XykiIEJfUUAzJV9dVworTT5GW189RzFRX1s2S0lfXzdRW1tfT0smUF9WITs3X10yMzRfX0wqSk5fWEIqQ19cQSlCT18nIVxEX1FEPQorTSdfXE0sMy9fLEM4WF9SPEsrP1xFKUI/XydBUD5fUVw7Jz9eOUUpO18uIzxdX1Q5KzQ/XE8tI0tfJVEsOworTV9SIEQoT1xBJ0IzXygyWFtfUyEgNC9cWS5UL19KOipCX1oiQkw/XS01VjtfPldNXl9eO0BXT14yRjo/XworTS1DXS1fXC5YTV9cWC80L18uM1hcX1xTKFFPXFcuNCdfLkNdJF9RSEEoP1xQLTNPXyRRSEBfUVhDKi9cTAorTSpCV18qMiREX14/M1NfX01WLS9fWl1HNV9fK0RYP19aWS1TX11NVzZfXyc8VV9fPlMsQ19aPT85X1RFIworTTJfXVxBOFNfRilOQF9aNkNJP10qMURDX0kqIkJfWio+SC9dWTxXP18pUjxUX1IsSC5PXEwrIz9fSzo2SAorTV9fV1BaX19BSlcnX1NKLVNfXVZDN09fOklWT19LODVLX1JAOyVPXDgkUT9fJCBENV9RQDMmP1xWLFJbXworTS4zME9fUyRJKV9cOyVRN18sIkxGX1xOXU5PX01WXUNfLjNYXl9RUEEpX1xAJ1I3XywzPE9fVD0rME9cUworTS0iW18nIUQ4X1JERSlfXEcoIiNfQzddXF9dQyNPT19OVixfX11dVzRfX08/VV9fU1c9M19eLVs1X18zPgorTVU/X1JYTUNfXT4rOF9eJy9SX184UTxPXy8kMTRfUlUhNT9cWzE1S18pVCVMX1E8QCtPXj9EWDNfKCMlNQorTV9VTT05L1w3J0IzXyZTLTpfUixQMj9cMiskV18pVTotX1JROUY/XFEzODtfT0tbLV9aWlBLP10gLiNPXworTSYxMDhfWCYkPi9eID9HT19RS1JYX103JlA/XlpLSydfQDdFXV9cOl1PP18pTztbXzEkISJfUFw1JV9cOAorTSZCJ18oUjxJX1EsNyY/XDQmIUtfJiFQPl9RJDQlP1w+J1IjXywyXFFfU0RVLV9cViwzP18uI0UgX1M8WQorTTAvXDwmUitfKUJcT19SKEEpX1w9KkM/XyszWTZfUyReND9cRSpCX18nQkBXX1Q1LzkvXjZFOU9fS0pGRAorTV9XPV5CT1xQLkRDX0xKVk1fU0RfMj9dITBEL19UPFcvX1MgVC8vXFUvNCdfJlIwRF9SUFMuP1xAKzMrXworTSwzVSFfUUA+KC9cNSVBP19XXSMrX18rPVYvX1VWXUNfXj1TO19fPztXP19WVz1bX1wtRzpfXl86Vi9fTworTVY9P19GSFoxX1gyJkM/XkhKWyNfSClOP19WOUE5P15MSVpPX0lKJkVfVy1OPC9cMSRBV18oIjhWX1JYTgorTS1fXkFHOV9fX183S19dRkU7L18tSUdTX1ZKMUFfXEpBOC9fJUU1W19POTFDX1FcLSAvXEAmI0tfLCJJJgorTV9SSEksL1xcLyNHXzNUSSVfU0RUK09cXS0zJ19VLDMhX15XOVU/XFYuU0dfKFJATV9SMEQpX1xNLEMrXworTSVBSDhfUyRTLD9cXy9DV18rMyhSX1IoRiovXEcqMlNfJzFAPl9WUUY5L18kTVsrX1tNOzNfXyc3VS9fVgorTVc9Q19cXVs5X18nPlYvX1hXXUtfW01PM19fRzxWL19CVF0vXzRESS5fUVQ7KS9cTC1UQ18nIihMX1ZNQgorTTZfXEArJEdfKjIwRF9SPEkpT1xTLzUrXylSPFRfUUBNMU9cXTopU18sVUI5X1JVK0BfXyRRTTdfR0laOworTV9RVDUmL1w5JVFLX0BINVlfWD4lQE9fKU9bT19VTEMlX1tST00vXUo4Ji9fVDw3IV9cUl1OL11NOVY3XworTSlCQEtfUihHKz9cVi4zW18pQkhMX1RJLjQvXFsvVCdfMVRRLF9TTF4vX1xAKDIrXydRVD9fXTsqUz9fJgorTU8rX18mQTg4X1FYOicvXFEtQ09fKkIwSF9ROD4oT1xOL1RXXywzXThfU0UjMz9cXTQmK18sJDFAX1I4UworTTFPXDElUV9fLkQ9OF9SWFkxL1w9JkFHXypTIFxfUlBMK19dQTg2M18rIzBeX1M9ITE/XEArIk9fKyM0WworTV9SMFEtT1xLLVNPXylCUE5fUlRLKz9fR1YtL19bXUs1X18rPVY/X1VXXVdfXi4nQl9fO0BXT19WWD1XXworTV4uJzxfX19HWC9fRlU9N188RyVYX1pWT00vXjlFKUtfPDZRUl9bIktMP15ISFpHX0BHVV9fVUk8OS9cPworTSlDM18sIyRYX1hOLEM/X19cTkdfV1pBTl9cMjk7P189SUY7X1FZTUlfXFo6Oi9fI0QlT19PWSlJX1QgPworTS1fXFEoRCdfIzEwNF9RVDsnP145QjgjX0M4JVxfVFkrMC9fNlI8M19cPU88X1MwVy4vXEAnUjdfJkE8PQorTV9SUFAsT1wzJTFLXygyNEdfUVBDKF9cUC0zJ18xJEUjX1MoUitfXDomITdfKiI8Tl9RTDcnX11OOTZTXworTVc8WzJfXzM+Vy9fWVddU19eLVM4X19fQFcvX1hXLUNfXi1bNV9fPz9VT19RVi1HX1w9PzRfVlk6NU9cUQorTSoiK18rMjw/X1JQSCpPXE0pIVtfKkIkOl9TNFAqX1xIKEFLXychVEhfUVUsQE9cSDFJI18pRFYoX1tXIgorTVIvXjZFKFdfKSFEQF9RQDonX14vQjdfX0FYMV9fXE8iUE9fPVEsN19PKzZVX1xDIlAvXzFRK19fVjwyXworTV9VRSwyX1xIKyJbXyhCPEdfUVxCKF9cNyZBT18nUjBEX1JcVi1PXDMmIVdfJFFEO19RNDklX1xXLEJTXworTVNMJlxfXCZZTT9cWS5TK18+WDFXX1heLUIvXE4oIVdfJyEwMl9QVDwnL1xPMCRbXy00NTVfUz0rOD9cUgorTTFWL18rRC0/X1MlJjdPXFEwRUdfLSNRJl9RODgmX1w0JUFXXy5DPF1fUUQ2Jy9cNyYxW18rUzxbX1FUSQorTSs/XEEqQydfKFMkVF9SLFAsP1xQLEM3XypSNElfXj8zU19fUlZdO19bXUs1X18/Qlc/X1dYTVtfXk43QQorTV9fN0BWX19XWE1XX18+KztfXF5ZTk9dSDhGS19KOk5QX1kmLUU/XV4+WCdfTis2W19aPkVKL11NOVZPXworTT5HPiNfUixELT9cSCozI18qMjxJX19fVFtPXzdHRjNfU0ohU19dOj02X18tRzZLX1JJRURfXFI7OU9fLQorTUcmP19NSF0+X1YgXy9fXD0kIi9fJ1IkP19VOTAyL11KOSZDXy9UIFlfXS8nUC9fR1RdN18uI0hdX1FUPAorTShfXDklQVNfKzMkU19TOFguX1xHKzJfXyozJFNfUlRSLE9cNCYhO18tMzxVX1Q1JDBfXE4rUyNfJSEwNworTV9RTD0oL1xKKyJfXzRUWTRfXF8kUj9fS1YtQ19dLVc4X18/PFU/X1dXPStfXU1TM19fRz1WT19QVV0rXworTVtdQzNfXks1VD9eRkUpJ18+NyVUX1MsTi0vXE0rUz9fO0cxXl9WVU88T1w+KCJfXyYkUiVfUiRcQj9cRAorTTMoS19PS18qX1dRVz1fXEMkUidfJCEsOF9ZSjJCL14nQEdXX1QsOylfXV8pUl9eO0c5T19SPDcjX10zJAorTVA/XzlSTDdfLlMsVl9RNDcnT1w4JiFPXykyLEZfUVg+KD9cQShSO18qMlRPX1JASiw/XS40NTtfJTE4NworTV9ZJilBX18zUCwjX1QrVl1fWjI4RS9dLDBTV18wVDBdX1UtNzNPXipBJ1NfRyhOJV9WRUM4P106NkVXXworTS8kMS5fUz0kNT9cVzFVT18sNCk5X1NJKTcvXFMvJC9fKkMgUl9SJEcqP1xWLkNTXyVBQDtfUjxHKk9cUgorTS4jS18sU10jX1JMUi4vXE4uQ1tfKyM8WF9RREEoX1xIKyJbX1ZNKzVfXU8yVE9fQVYtQ19XTTc1X15DOQorTVZPX0dVPT9fWi07OF9ePzVVX19UWF4vX1UsRy5fV0FTP19eUEs7R18+RzleX1ghXUBfXlNMOzNfSzpOTQorTV9YKVxAL14kP1hPXylSOFdfUjRFK09dTDpGU19fXydLX1w2LDRPXyBERjdfU1k5NF9cKjM3P18pRjYrXworTVIpQUFfXDY1N09fKkVVO19SKUVJX1YhJSgvXEYmQTdfKEFQQF9SJD8qL10vM1RTX1NcLlxfXj82VU9cTworTSxTN18lUURAX1FUPChPXEMpUkdfJlFUQF9SLEkqX1xQLiNLXyoiXE9fUUA9Jz9cSytCX18mIUQ6X1NMXAorTS1PXSYyNC9fKjMgUF9RREMpX1w8KFJfXyhSOFFfUzhTLj9fMVIsQ19aLTsyX15XOlUvX1ZXXUtfXi1fOgorTV9fKzxVL19TVy0/X11dTzhfXzs3VV9fTFUtJ19RSyZPX1I0OScvXE8qMydfOUZBT19RIDQqP1xBNVknXworTSkjTihfUi0sQi9eXU88U183VUE/X1ZBNzlfXD8oQj9fSElKMF9ZIitBT189VF07X1Y8Ry1fU0khMD9fJQorTVBMJ19XTE8rX1xGXU9PXFotUztfJyFUPl9RWDsoP1xHKEI7XykiIEJfUVA6Jy9cOSZBT18oIVRDX1FAOAorTSZfXDclMUNfPDY9Sl9YTiNBT14+RjlHXz0nIU5fWk5ISF9fLk8rQ18rQkBAX1JcUik/XydPOltfR1hdXAorTV9ZTi4/P14xQignXzc1UTtfVFkxNU9cWTA0T18tM10qX1NEXjEvXEksMltfK1M8U19TWSMvX1xcL0NPXworTShSKEFfUlhTLF9cRytTJ18qMlhTX1FUQShfXEEpUkdfJ1I8SV9STFguP11COSY/XzxHIVNfVlVLO09dSAorTTlGR184JjFGX1VBPjgvXTQ2RVNfNCU5OF9VJTI0X10vM0U3XzlGOVVfWl5JTV9dWD0nV19CKDYrX1g6JAorTUFfXklJWkdfQkgyKF9XXVpBT1xFKSM3Xy4jQSFfVlFOPD9fX10uW19VKU1BX1xSPjw/Xl5BNC9fUEktPQorTV9bXjA1T18kRTVPX1ApJTdfW14xNV9eX0MlP19QOSUyX1kpTDE/XE0mUFdfNyUtM19WIUA1X18yUVwjXworTVc8Wy9fUkxRLF9cTSxDQ18vRCElX1I0SSpfXEYqIk9fKzMsVV9SKEorL1xEKyJbXyVBUD5fUlBQLE9cNAorTSVBR18qMkxQX1EwMyY/XFQsU0dfKDFcQl9RQD4oL1xDKlJXXylCWFJfUkxQLU9cWC0jO19VLEcuX14jLworTVVfX0lVXTNfWz1HMV9fJzpVP19RVj07X1xdSzlfX0M8Vj9fU1VdL19YPEcmX19DQ1dfXkNGOTdfLUMtIAorTV9SNTRDT1w+LFgnXypVLipfXCciUz9dNzQlP18pUUBDX1cxWD5PXj9FWFdfQVgpXV9dVzNVT18+UjxbXworTSYxVD9fWUY3Rj9fLlAsJ19WLD8nX1Y5OTUvXy9SPCdfKiI8Rl9UNSIvP14iPlc3Xy9DUFVfVU06NF9dIQorTS8jP18kUSQsX1BQKiFfXkpISiNfU0wvIl9cMlxOL10wM0Q/XzAkMFtfVUk0My9eVkpKN18yRCxdX1JQTQorTSlPXldMKjNfQEdBSl9ZNitAL140QjdbXzg1RS9fUlxNKk9cWC5UI184Ni1GX1YpRTdfXTM1JFdfLEMkSgorTV9UUSowX1xOKyJHXyxDMFJfUixKKk9cOScxX18mUVRAX1E8OScvXD8oMjNfKzJcUl9ZPi1CP15BRShfXworTUhZOjFfWU4uQj9eNUMoO19EOEIiX1hSIz8/XixAV1dfQSdVV19SSEYqL11BODZLX01LKltfUyhOLU9eLgorTUJZJ18lQTA3X1EgLiQvXiU/WC9fPkc2IV9SSEkuT1xJKjMrXzMlJTZfX19QWF9fLEc2V19SSUlHX1xOPAorTTk/XyNFJUtfUUkxO19cKjA1X18hQ1VDX1ApLTdfXCIvNy9fIUMlO19PSSEzX1pFXTJfXSYrUUNfODYtQQorTV9cUyVRP189VDxXXydCPEdfUSA1Jk9cPSdSM18nIiBCX1FAOic/XEcqMlNfJSFAOl9SPEsrP1w5JzFfXworTSoyTE5fUTQ3Jk9cSCpCX18kQTA5X1FUQCk/XD4oQjNfKFJASF9SUFEsP1xSLiNLXypTIFVfU1UjMl9eQQorTUhKV18qI1U6X1VVRkNfXzlTLV9fXC1HOl9fNzVSX19QVj1LX1wtSzhfXyc5VU9fTlctQ19bXiM7X15XQQorTVYvX0NWLT9fNzY2JV9TWTFFX1xNMydTX088LzNfVSEkMV9dLjMlN18nMkBPX1leOUNfXV49Nl9fWT1HPAorTV9eUzNUT10yM1RbXzBDVF9fXUMpUj9fRlQ8U19GSF4kX1xPIU1fXEoqIidfT1tGT19YWiU/T11XPEZTXworTVFLWlRfVVk+ND9eID5HK18oQiA7X1smSkkvX0BTTE9fQSdFWF9aQkNHP15VTDpHXyxDIEhfUzhVK09eXQorTU8rN19JKV46X1IsRCc/XjlFOFdfPDY1PF9XNU44T11LOUVLXz43MUhfUiA9Ji9cPSdSK18mMTw0X1NYXQorTS1PXFAsUldfMzUtL19WPUU5X11COEVfXzFETSVfUkROK09cQioyR18qQlRSX1FANydPXDsmMU9fRkkqNQorTV9aIjhGX15DRllbX0tKOklfWy5KSk9eW0xLK19PKzZVX1wyX09fXyRTS1dfNlYhOl9VQTk4L15LTFpfXworTSpSVFBfWToyRk9cUSsjI18tQyhUX1c9VT1fXilCOTNfKSIoUl9RVD4pP1xNLFM3X19eX0JfW1IyOk9eWQorTUNWJ19LOEU8X1paIzU/XldCVV9fTShFOV9bMis1X15XQlVHX08oWTtfWz4qNS9eV0JVL19POEU3X1pGIAorTTVPXjE+NVtfVixKW19eMzFSX1xMKzJbXyRRNDpfUSg2Ji9cNiZBU18kUTQ4X1JASis/XDAkQTdfKVJETAorTV9RRDsnT1xGKiJPXyUhODlfUjRHKk9cMSRRO18mUiRDX1FIQikvXD8pMj9fKDI8SV9SLEkqX1xJK1MnXworTSsjTFpfUiBCKj9cQCtEP18uREVMX1JEWTk/XTM3WDNfU0xDNl9dXy1SP19JVCxPX1wtMzFfXzc5VU9fVQorTVY9O19cTTs5X18zNlUvX0tVLF9fWF1PP19YVi9HT18vUVxPXzNDUFhfUyhRLV9cNyhCR19HSUIuX1c1SworTTlfX0VWPVNfXC1DNV9XVVg+L18qUEw3X1Y8QyhfXVsqUU9eKkE3X19TXD8jX1c9VTxPXypRS1tfP0c9UQorTV9YWipCL18oT1tDXztWXUZfW15XTF9cQyghX19OWyZNX11bLlJfXV89VzdfM1RZJ19TSFYrT18hTkszXworTT83TVRfUyRQKj9eU0tKQ18zNFElX1dBVjtPXiE+Nl9fPVcpRl9XWVo6X11bPSY7XzsmOTxfUVw9J19dMAorTTMkS180VE0nX1IkOyY/XEAmUU9fK0JETV9TUFwuP10wNFRXXy0jPFhfUVxDKD9cOycyK18kQFg2X1FQOAorTSZPXDsmMVNfJjE4PF9RSDcnP1w2JFFHXyYhODlfUUA2Jj9cNiVBR18mIUg9X1UhJDY/XSUvRENfOCVZOQorTV9bRkdMP1xOKFJDX0dJTjpfWV5ASD9cQylCP18qIlBKX1hGKURPXEcpMzdfKVJAT19TMFgtT19QWU5fXworTTBCWEZfUzxLKS9cVCpSN18vIlRHX1Q0ViwvXFgqUiNfMSNASV9UWF0sL101MEM7XzY0QFhfVk07Mi9dVgorTTckW19AVj0sX1gtTjQ/XiU/JzdfWDxfLF9cSyZSL1xXLjNbXyhSREtfUixLKz9cTCxDM18pUlRPX1I0SworTSs/XEIqIktfJkIgQl9SLEkqX1wvJTE/XyhSNEhfUFwxJS9cOygyL18mMiRDX1FMQyk/XD8pUkdfKEJITAorTV9SNE0rX1xJLzJbXzomXVtfUjxDLF9cPSlCV18oIkUhX1I0UzJPXDYoMytfLzNAXl9ULF8vP11QOyZLXworTUlJWjxfXE5eTz9fNVJMR19ZTT8xX15XN1NfX05UXStfWz1DNl9eRzZTL185UjtfXylSMENfUkBLLC9eQAorTUVZI182JS01X14zO1ZfX0xVLSdfPkc1VV9dJylTL184UVw/X1Y8OyZfUixAJ19eX05LU18zRFkxX1guIQorTT8vXjpFSTNfRllGO19cTydRP11WPVcnX1A7QlhfUkhGKi9eWkw6T19YLSMtX1siSElPXyFQK0dfOiYxPAorTV9TUFcsP15KSionXzRUWShfUzhUKz9fIE5bN18sQlhGX1wmXkxfXVo9Vk9fPldFSl9XXVk6P11cPUY7XworTS8jSFNfUzBZLT9cLyUxJ18oIjBCX1FMPCc/XEIoIitfKiI4SF9SPEYpP1xIKUInXy1TNFBfUVQ6JT9cRAorTSghW18yRD0mX1EoMCRfXDIkIS9fJVE0OF9RKDAkX1w2JSE/XyUxLDZfUSQxJS9cOCZBV18vNCheX1IsRworTS1PXTw3Ry9fRzkmLF9WUUM3P10qMTQ3X0Q5MjVfUyxcLy9dJjJUR19EOSY6X1FYPCsvXEgqMyNfRCheKAorTV9fM0pdL103MUQ7XykyJElfUUw9KT9cPSchT18mMTw6X1FMOCdPXDslUiNfJyFAQV9RTDcnX1w5JUFTXworTSYxPDpfUiA+KD9cOyZBR18mQUA1X1MoSCpfXzpTTEtfMjUpMl9TNF0wP1xVLzNfXywzUF1fUlxXLj9cSgorTSxDM18pUlxRX1FcRyo/XDsoUjdfJjIkQ19RREEoX1xAKSI7XychWEFfUTw9J19cOSgyL18mQjRGX1FYSQorTSpPXEErIldfKDJQTV9SWFUqP1xXMjY3XyQxRElfUUg5Ji9cQiskW18qUzElX1IgQigvXD4mQi9fJ1IkRgorTV9SKEUpT1xDKUI/XyoiVE1fUyBVLF9cUi0zO18tIyxZX1NQWDA/XF4tQ0dfNiUtLl9YOV4+T15USipPXworTVA7Ul5fWjo7RS9dJzEkS19ZLVc9X18rO1VPXVk9JzNfVk0rNV9dRyhSL18wTltHX0BHSVZfXDJYTj9cRgorTSgyL19QTCcgX1UhLjQ/XFQtQ09fT1tWX19VXT03X15cTDtDXypSPElfW05SSy9fPlNMT184NUU3X1M4VQorTStPXylRO1dfOVY5P19TXFotL18jTkszXy4zPFBfWlpCRz9dTDlFW18uQ0hPX1cxVDlfXUk5VUNfQCdNSQorTV9XPU82X11UPCYnXytCRERfUiA7Jl9cMyNBK18kMSA2X1EsNCU/XDglMU9fJiEoNl9RPDIjL1xXLDInXworTS5TPEFfUzBUKD9cVi0iU18lUTg1X1IwQikvXEQoQjNfKDFcQV9RPDUmL1wyJCEvXyRRLDZfUVxBKS9cJgorTSJDI18tUllDX1syQ1Y/XSUuJk9fNDRRRF9RUDkpP1xeMDQ7XyZSID5fUlRRK19ePUc6O18+V0YpX1JISworTSxPXyRPW0tfX18rTV9YMVI6L1w2JSE/XyUhODtfVVk9NU9dKTFUM18nIUA6X1FQNyZfXEIlMTNfJzEkLAorTV9RTDYlT1w0JSE/XyRRQDhfUkRNKl9eS0lKO19XXSMrX1sqS0pfXFAtIztfKkMoVF9STFguP1xKLUMvXworTStTUF1fUkhWLl9cSyxTP18qMyhSX1JEVS0vXEQsIl9fKSMgT19SSFItL1xKLEMzXygiQEpfUUBDKS9cOgorTShCM18oIjhIX1JATiwvXEYrIltfKyJQQ19RUFs3P1wnJFJbXycxNDhfUVRXPC9cRyxVK18pUjRIX1FYOQorTSdfXEQnUi9fJ1FQO19SMEMoT1xIKUJHXyhRUENfUVQ7KS9cQyhSU18oUiA/X1FQPSovXEgoUj9fKUI0SworTV9SUEgsL1xTKyMvXytCRE1fUzxVLi9fNVMsU19aLTszX1haL0QvXjlFKUNfVSw3JV9cPlhMX15OSSojXworTVFLWlxfVVk5Nj9fLFBLW19EKEooX1Q9KDI/XydRPCNfLEJISF9cUyRSL1xEKSI/X04rIkxfXUMqUV9fLgorTVA8I19BJ1VXX1IoRCZfXypRS1tfMiNQVV9aUkxIX15MSyovXywiXEhfWk5MST9cVy5TL19EKSopX1NcXworTS0vXSQxM0NfPDclRF9WOUc2T14xQlgvX1YsNl9fXVsiT19eSUQ4W18pUUA4X1JEPSgvXDIjMF9fJDBcLAorTV9STEsnL1xSLTFfXywzMD1fUlxTJz9cTiwiV18sQyxUX1MkUixfXFEsQy9fKkJESF9RNDMlP1w4JUFDXworTTNEUS9fUTQ4Ll9eQUcrO185RiU8X1o+Qk5PXDwmU19fKFIoX19VTTs7T1xTLiMrXy4zVFVfUiA/KT9cSworTSojM185NjFKX1xDIlAvX15bXyNfUUsyUF9TWFwxP1xEKiMjXyYhODNfUUA3JU9cNSRRN18lMSw2X1oqPQorTUdfXk9JWktfJjEwOF9RODYmP1xFKkJLXy0zPFVfWzZQSl9fPFM8Q19YLScxX1heJkFPXUo5NjdfNzVROworTV9URS8yX1xLLUM/XytDSF9fUlhWLk9cSixTL18qQzhVX1I4Uiw/XEIrQldfKUMkUl9SKE0rT1xCKzJbXworTShSWE9fUTg+KC9cOyhSN18nMjRHX1IgSCpPXE8sMkNfKSQhO19QUDcrX1xBJzFfXygjTVFfUjBNMl9cOgorTSYxX18oUVhCX1FcOyY/XFktUyNfMkRBIF9UUScxX1w1JjJbXyciVTFfUVRXOF9cSTAmS18nUkUkX1VJNAorTTYvXEgpMk9fJ1IgR19RWDonL1xEKEIzXyoiOENfXjs8Vi9fT1ctU18wVC0mX1ZNRjpPXzhSPEdfT1sqTQorTV9bPk1KP18kT0tTXzQ0WS1fXS8qUS9eXUxaX19KKjZEX1xLJU9fXlFJOidfUStTIF9SVE0sL15XS1pXXworTVdNIy1fUyxIKV9eQUcpO181JTErX1ZJSjdfXyBNSlNfLUNMT19ZVkJFT10hL1NDX05bSlNfVCRfLi9eTgorTUo6L181JTErX1NMXixPXTY2NFdfNEU1KV9UWS0wT183UVtbX10tNy9fXksvUi9fNk9bS19KOT4zX1RAXworTS9fXDMkITtfJTEoOF9RRDQmL1w3JFE3XywiVExfUTgzJE9cPSYxT18pUixFX1FANCVPXDwmMUNfKzJASAorTV9UWSkyX147RTlHXyNQTF9fWj5CUy9eVkxbX19LSi84X1EwMS8vXEAnQ19fKjI5I19WKUM7T1xaLlNTXworTSlCOElfUjBDKk9cTCsiX19UTEsoX19fU11fXy5PK0dfJ1FQSV9RUD8qX10sMjRDXychTDpfUUQ3Jj9cOQorTSVRS18nITg+X1IgOihPXDwlUVdfJiE4OV9UPSwzL1xdL1NXX09bSlVfXlM9Vi9fUFc9P19UK1ZXX15DNworTVQ/X0BUPE9fSlpKQ19TRSAwL1xPLlNfXyojIFJfUlBVLT9cSS0zM18qIzBTX1I8UyxPXEQrUyNfKFJYTworTV9SLE4rX1xCKzJbXylDJFJfUkxWLV9cSi0zO18pUyhTX1JQVis/XFUxNUdfJCFYR19RXEEpL1xNMidbXworTSpDMS9fUixDKU9cTCoiS18rUlRGX1VBNzMvXUM4RT9fNyVBNl9QVDYpX1wsKUUnXyQzSVxfUVkkQE9cRworTS41X19MSlZTX1JMRiovXD4nMi9fKSFcOV9ZUjxEX1xRK1JDX1tOKz1fXyc7Vy9cWS1TS19STDMoX11fLAorTVMvXllLKj9fUDs+U19cIlpOL10yM1RbX1ZNJytfW1JUTC9eWkxbL19TLC5dX107KFE/Xy5RTEtfKTI0SAorTV9cUyRQT186UyxHXzZVLTFfU0RYLD9fIU87N18oQjw7X1ghXTxPXFkvIyNfTVtSUF9VVTg0T15FR0lDXworTUYoXilfV0VNOi9dJDEjT180RTUpX1RJLTA/XSUyI1NfODYlNl9cOlhLX19PVFxTX1gsPyBfXjcqT19fUAorTVVdI19UTC8jX1IgNidfXDUkITtfJiEwNl9SNEIoP1xPKzJLXyVBLDJfUzRRLF9dIy9UJ18mQTg4X1I4QQorTSg/XTg0VS9fPTchUl9YTiVCP1wyJzFDXyYhMFtfUlA/Nk9cPCZEJ18mIURSX1EsMCs/XDklQ0tfKVI1JgorTV9TKFAwL1xGKTJPXylSPEpfUkBJKk9fOFJMT19fXytSX1xWXE1PXEAnUjtfJUFMQV9ULSEvT1xFKSIvXworTSVBMDZfUUg4Jl9eLD9XW19GSFItX1IkNyZPXEAmUidfLkNcX19TNFctP15fTks3X1wuJzxfXlc/Vy9fQworTVU9K19WTEsnX14nMVNPXlJKWjdfL1QkX19SXFouX1xOLkNHXyszRFhfUlRZLi9cTi5DR18rU0xaX1JUWAorTS4/XE4uM0tfLSNdIF9TKF0vT1xOLlNTXytTUF1fUjhTLS9cQCsyW18nMlhEX1IkRS0vXDsqQkdfLCNAWgorTV9SNF09L1xILFRTXydSIEFfUkRGKT9cSSoyO18yRFUnX1NIXi1PXFYtU0NfJVIkUF9RXFs5X1wwLygjXworTSdEIV9fUkhdOV9eP0ZaL18wU0BXX1I8RSovXEspQiNfR1lWNl9TLE4qP19LVy1XX1tdQzlfUkxGKk9fLworTVFcT19ZLFsvX1tST0pPXylPW09fTVsmT19UWSsyT187VExTX00qUkhfXEcgUC9fNlFcK19ULCJdX1xXJQorTVI/XEgqIk9fUjwmX19dLyVQT18hTztPXy4zVFVfWiY4RD9cSyxCO19NKlJCX1QsXSxfXi5DOCtfSClaNworTV9VVTs1L15MSVonXzBDTFVfVV0/NU9dKTMkI184Ji03X1U1ODMvXSkzJCNfUFs+Tl9dMllMT15MRUhbXworTU9aOj9fXicoUF9fOlA8I19UW1ZfX1FMNCUvXD8nIU9fN1VVOl9SOEQnX1xbL1NXXysiXFBfU0xeL19cVworTS5DT18uM1RbX1VZQDdPXT84JidfMlRNLl9RMDAmL1w0I1FPXyNRMDBfUUQ3Kk9cNiQyV18lUSxNX1E0NAorTSw/XDMkQz9fLjM1K19TLFIuP10kMUQzXzBUNSNfXScoUi9fX11PK19QOzJTX1FcPikvXDIlIT9fJzFENworTV9SMD8nX1xBJzFfXyUxLDZfUzBJKi9dIy4jP18nUUg8X1FIOic/XSQxRDNfLCNAVF9cLllNP19RVy1LXworTVldTzdfXic1VD9fPVQsT19WPFcmX1laN0Q/XEMoIV9fJUFAPV9RPDsnP1w/KEIvXycxVEBfUiBAKF9cQgorTShCN18pMkRLX1I0Sys/XEYrIltfKkMgUl9SUFAsT1xSLiNLXykzKFNfUjhRLE9cSitSV18nUkhRX1I0UAorTSo/XEUpUltfKSNdVV9SRFEyX1xEKEIzXylSQElfVD0nMS9dNDU0X180RTUvX1I4SCpfXC8pJCNfJiQtTworTV9QOFI/L1xGMVhfXyhTWU1fW0JHSV9cUCtTN18qUjhBX1MsUStPXkBGWTdfLSJQSF9eTzxXP19PVj1LXworTSsiREhfXTstUz9fO1MsU18+Vy1PX10/JlFPXlBKWk9fMkRJLV9dTzNUP15aS1pbX1JLXl5fXDZYTV9fJgorTU8rQ19SO18oX1JQSCpPXyBPK0tfPkcxUl9bJkxJX1xdLiMrX0JIJVpfVFksMT9dRTdFQ19DKDleX1QxIQorTS1PXkFIKUdfK0JcSF9aSklIT1xMKlIzXzdGITdfVCEkLl9dIzFTW18wNDRcX1VBPzRfXkVHSStfUjpeRgorTV9cNkpHX18qTEpHX1JLKklfXD5QSS9fKkxaP18uUlxLX1NYWi8vXD8nMiNfKzJISV9UQSkwX10qMlQ3XworTTRFLS1fVSkzMz9dLDIkO18yVDkmX1FENSVfXDUlMUNfJVEoNF9ROC4mL1w2JCFbXyVRND5fUTgzKk9cNQorTSQyT18lUTRPX1FIOy0vXEEmQ1NfJ0FATF9RVDwmX1xFKSIvX0IoLidfX19TW19eV0paW18lMSg4X1E8NworTSZPXVU8JyNfLzNAWF9RODIlL1w4JUFHXylBXD9fUUw0JS9cOyVRR18lMTw6X1RJKTIvXFQvI0NfUFtOWQorTV9eSztWX19AVD0rX1hNIzRfXUcoUi9fM1BcI19HWUo0X1FcOyc/XDUkQUNfJFEsNl9RQDYmP1wzJDEzXworTSYxPDpfUTQzJU9cMCQhL18kISg1X1FEOydPXDcmMVNfJTE0OF9RRD0nX1xAKzJbXyhSTE1fUkBLKy9cPQorTSpCX18pMkxHX1JQTi1PXEQwNz9fKTJNJV9SLD8oP1xEKUIzXy9TVFZfVSUxMi9dPTdFP18mIUQ6X1BYRAorTTEvXDkxJltfIUMtWl9SQSlET1w+LlZPX05aOkJfUiBEKy9cRSghS18yVE0oX1omPEVPXFosIlNfWT07NgorTV9fIzpWX1xWLSMnX1YtIy5fXVsvU19eOkVJM19XTF8wX1o2QUhfXSozJF9fVCxHKV9aUkZJL180U0xTXworTVArSlhfXDJcTi9eXUxbU18sQlRNX1MoUCs/XSgxRENfRllOOF9ZQjZEP1xdLlMzX0o6NkNfUyxPKz9eTworTUsqP18wI1hXX1lSOkU/XFkuQzNfPTc5UF9SPEgoT10lMjQnXy1DSFJfVDEoMC9dIjFDW18xRFEkX1UxMAorTTIvXypNWl9fUksqSV9cRlFKL18jSjojX08qJjZfXTZYSy9eX0sqK18wUzxTX1FYOSc/XScwRENfJVEsNQorTV9RXDsnP1xFKDIvXzBDWSBfU1xXLT9eQ0ZJS18mUTg4X1E8NSYvXDQkMT9fJVEsPF9QVCwmP1w0JEI3XworTScxRFNfUVA4LE9cOyYiX18lMShIX1FcOi0vXEYoUyNfLSMoTV9TMFIqX10wNTUvX19fI0xfWyZFSi9cPgorTSZSJ18mUUw+X1I0QCgvXVU8JyNfJjE0N19RJC8kT15KSFovX0xKTktfUTwzJT9cMyUxQ18nQUg8X1IkSQorTSlPXlFLSldfUDtSXF9XPVxAP10pNDU3XzBUTS1fVCkrMl9dKjNUR18lUTQ3X1EsMCVPXDIkIS9fJkFAOworTV9RMDIlP1w1JFE7XyRRJDRfUTA0JV9cMiRBN18mMUQ8X1FIOic/XDgmIU9fJlFcQV9SIE0rT1xCKkJTXworTShSREtfUUhFKy9cQykyL18pMjhRX1I5Ij5fXD8pI1tfKVIsQV9TNFYsL10nMTNXXzVFOStfVFUvMU9cQQorTShSJ18lMlEpX1IhKz0/XCktR1dfKUQ+MF9RUFk6P15RRylDXyUxREFfUjhBJl9dMzRVI19HKT4xX1QgVgorTSxPX05XXV9fW11HOl9TIE4qX185VDxfX1ddIzBfV01ZPU9fO1M8W19HWVY/X1Q1KTJfXzNULF9fSzpOSAorTV9dNzNUL15cTks/X0hZWjlfWkY/Si9cVCtSX18nIUg3X1M0WC8/XD4oUi9fJUFIOF9TQFotX1xTK1MnXworTSZBODhfVyFNOy9dJjEkJ18qIjxGX1MwVi0vXkJJKitfKFI0Q19VXUE3T10qMyRHXzA0LSBfU10hL09dOQorTTZVQ18zRFkrX1YlPDVfXjlDOENfTVo2QV9cQlRML18xTisvX1Q7Nk5fXFZUSV9dNDBTV18oUUhBX1U1LworTTVfXVg8R0tfPiclW19XWVdAP15OSVsnX0opXj9fWl5GSU9cOiUxP18lUTQ4X1E8OSgvXDQlMiNfKFIoUworTV9RSDcrT1w6JVJXXyRRIEJfUUQ1KT9cNCMhS18kIFA0X1MwUSwvXF8vQy9fMlRAXF9TQFYrX19fXD5XXworTUpJWkFfUiQ+KS9cOiZBV19BOCIgX1s6UUw/XDIjQSNfJiE4OV9RVDYlT1xLKSIzXyYxNDdfUTQ3Jk9dSAorTThGO18lMVA8X1lKPUdPXFovM1tfK0NcX19TJSIwT1xUMUQzXy5EUShfVEkzMy9cNCUxO18lQSw5X1FQNgorTSZPXDklUUtfJ0FQP19RNDMlT1wzJDEzXyVBMDdfUTAyJT9cPCZBV18mQUA7X1E0NSYvXDonQiNfKEJcUAorTV9RSEIpL1xCKkJbXyRRVEdfUig+KC9cOicyR18oM0lVX1IwRjA/XEopMiNfNDUlJl9TTFsrT104NjRTXworTSwzMEhfUVhAJz9cOCtUU18nVElUX1BEVj8/XEoyWTNfKENdT19cMk9KX1w0JiIjXylCJDtfVzFUPD9eSAorTUhZV18yM1xbX15LO1ZfX1JXLVdfKEIgPV9ZXjdFP182UVw/X047RlZfXU8vVC9eOEY5S181RVE+X1xfKAorTVIvXlpMSyNfVk0rMF9cKlpOL15bTFpfX0k5TkRfVSktMz9cQighV18nQVREX1EwNiZfXDclMUNfJyFAOgorTV9RIC0kX1wzJCE7XyRRJDRfUkxJKl9cSypSW18mMUxAX1EwNiZfXDEkUUNfKSI0Rl9TNFYtX1xeL1QjXworTTJUUS1fUkBGKj9cNiYhT18rIyRRX1Y5SDlPXTA1JStfLyNYW19VPTIzP11MOCVPXz9XLUxfVylKOi9cPgorTSYxV180JEkuX1IkPChPXDAiQStfKyI4Tl9WUUY7T108NFUvX0s6MkRfUUg1JV9cNyUxQ18jUFw6X1EoMQorTSdPXEInUk9fJUBcOV9RNDQmT1w3JiFHX0hJVj1fWjo+Ry9dKjIkJ18xRDBdX1RZKTBfXTIzJDNfP1c9UworTV9fX1peT15cTDsjXylSKEJfUjBAKE9cRCdRX19DOEopX1BcKyM/XDUkITNfTEpCRF9bPktJX1w/JVE3XworTSchRDhfUVw1Ji9cQCkiK19FSTozX1VdQjhfXFQwRCdfLiQ5JV9TSSkxP1xeMzRDXzBUXSZfUSQ0JT9cOworTSVBU18kUSQ0X1FANiY/XDklUUtfJVE0OF9RMDIlP1w5JVFHXyVBMDZfUVA6Jy9cNSRRN18mITg4X1FQQQorTSg/XEYsQydfKEJESV9SNEwrL1w5JzJTXydRTDlfUFg1KD9cQS5XM18mQVxYX1I8Rik/XEsrMktfLSNMVAorTV9TNFguP1xPLFJPXywzOFBfUVBRNF9cSzVIM18lRDIuX1JZLUU/XFg0NzNfSllCOF9RSEInX1w+JSE/XworTT8nTVRfWio6RU9dQDUlP19ZPT84X15PPFc/XE4qQkNfUCwmW19bIklIX15ISDonX1csVzFfWDorQl9dQQorTTpGS19VPTMtX1tWWk0/Xz9WPT9fUlwyXl9bUldMT14tQihLXzglVTxfUyxSLD9cOichX18lQUA9X1EwNAorTSVfXDglQUdfJEEgM19RKDAkX1wzJDEzXylCMEZfUVg+KD9cOiZBV18lITA3X1EkMSUvXDQjUS9fJSBcMworTV9RLDElL1wyJEE3XyVRSDtfUUg9K09cLSQyI18mISRCX1I0Ois/XEcrMzdfLUNMWV9VMTY0X101NERXXworTTUlIS5fUUQ0Ji9dMTNFM18rQkxRX1IoPShfXE4pMlNfO0ZFT19UVSQxL15OSTo3XyYhLDVfUTQzJU9cLgorTSMxM18lIFwzX1pSR0lfXVw+J0tfLiM4WF9TIFArP142RUhXX0g5UjZfVFEqMF9cPidBT18oUiRDX1JAQworTShfXldNO0NfX18zUV9aJjZFP1w6JVE7XydBSDxfUzxULF9eVkxbK18lQSg0X1FcOidPXD4mMV9fJTEoOAorTV9RPDkoL1w0JkIrXz1XIVdfUVBEKC9eKkNYR18+N1lcX1M1ITAvXFkwRCtfLjQtIF9TTSYwP10iM0Q3XworTSRBLDRfUUQ0Jk9cNSRRO18lMSw2X1E4NCVfXDclMUNfJSEoNV9RODQlT1w3JTE/XyVBMDZfUUQ3Jj9cOAorTSVBQ18nMiBBX1IoTis/XEApUj9fKyMwUV9RLDUpL1w8JjEzXyJRNEBfUUhSOl9cOSdTN18wI1xeX1QhIgorTTAvXEssIktfJ1FQQl9TOFQrP1xXLjM7XydTOTlfUkU3QS9cOjFJI18qVEoyX1NFMjtfXlFHWidfJUFYOgorTV9SODsoL14qQldbX0k5XjdfVkE6Nl9fSlY9R19aLUM8X1NEVC1PXVk+NztfVTxHJF9aNj5HT184UyxfXworTUM5KjJfV1IjQF9fKFFLX19PO0JTX14jN1VfXypQO09fT1s+VV9YSiVBP11RO0ZXXytCVExfUUg8J19cNgorTSYhT18lITA3X1FANiY/XC8jMF9fJFEkM19RLDEkX1xEKEIzXydBUD9fUVA6Jz9cOSVRS18lISg1X1E0LworTSRfXDQjUS9fJCBYMV9RLDMlT1w4J1JPXydSNSVfUSQ3LD9cOiVSV182JEVCX1YxST0/XUQ6NkdfNUVBNQorTV9YNiM/T10xMzRPXyZBNDlfVSkuNU9dXz9IM18/V0FfX1ghVz9PXlZMOz9fQTdRXF9aOj1HP1w8JVFHXworTSchSD1fUVA7KD9cPCVRR19LOj5FX1g6IUE/XFsuM1NfK1JYTV9YOiY/P149Rkk3XzI0NF1fUUg4JF9cOgorTSYhN18tIlRHX1taWE8vX19dLyNfPzc5Vl9RRDooP1wwI0EnX0IoMiJfWkpHSU9cPiZBU18nMUA8X1cxSQorTTovXU45RjNfJkE0NV9RVDsnP1xPKVJLXyVSIDlfUzhdLF9cWjBDW18pQlRNX1IsRilfXDknMU9fKjJYSgorTV9UOTAxX1w7JyFXXyYxMDpfUTQzJU9cOCVBR18mITg5X1FANiY/XDQkQTdfJUEwNl9RNDMlP1w2JSE7XworTSYxPDlfUTQzJT9cPigyK18oUlxOX1EgNyVfXEssUyNfJSE4RV9RTDgkX1w0J0JHXyYzJUhfUlxTMi9dKAorTTFEL18pIjBBX1JUSyhfXFosIy9fLjMsS19TXF0uT1xEMCYrXyslPiVfUVkmRD9cSjJZL18xJV1XX1s+RQorTUo/XDMmQUtfKEE8PF9YVjA/T15DSCkzXz4nIU5fXCZVTi9fMlJdN18nIVhGX1NAWy8vXlVKKi9fSjoyRAorTV9dRy9UT11dQEgrX0ZZWj9fXEslUC9eWk0rK19XLSs1X1xCXk5PXy5RTDNfP0dFWV9YRiZBP1w/J0FXXworTSVRRDxfUTQ3Jk9cMSQxM18lUTQ4X1EwNSVPXC4jUSNfL1QhIV9RWD8oL1xHKTJDXykyLEZfUiA+KD9cNAorTSRBN18lQSA0X1EwLyRfXC8jMSNfI1BcMl9RUEUvP1w7KDUnXyRRWSBfUTg7LS9cTygjR186NllaX1YxSQorTTo/XUg6Rj9fQjg+Il9VKS4zL1xEJ1IvXy8jQSBfVDklMl9cMSJBJ18uQyRYX1hSJ0M/XUM2RUtfSElGOQorTV9RXDonL1w2JSE/XyRRKDhfUVA3Jj9eSkkqK18tIlxTX1FIOCZfXEcpQjdfP1ddVl9XVVo9P1xfLUMjXworTSpSOEFfUVw6JS9dNjMkJ19SXCckX19fVlwvXTUzVS9fLTNJJl9SQEUqX1xEKCFbX0w6Wk1fUUQ1JV9cOgorTSUxR184NTk1X1YtOTU/XDslUTdfJzFQO19SSDwnP1xIKjIrX0U5MilfWD4oQE9cRSsiU18nUjhGX1FYRgorTShfXEosQltfMkU5LV9RQDkmT1w2JDE/XyRRJDRfUTg0JV9cNiUhP18lQTA3X1EsMSUvXDQkQTNfJSEoNAorTV9RODQlT1w5JVFHXyVRNDdfUVxCKF9cRyxTK18iUSgyX1JUVSxPXC8kMiNfJlFAM19RPEErL1w5LCY3XworTSdCJFNfUiQ/Ji9cTCpCN18vI0hLX1I8Qic/XSoxU1NfQEhCJF9SLSI5L1xMNVg3XyckIitfUlUuRU9dKQorTTlXV19QKlpSX1FIPykvXEMmMVNfRCkiIV9ZWjxFP14sQ0kvX0Y6MktfWT5DTE9dJzYmN18uRDkqX1haJgorTUBPXkhJOjNfVz03OF9ZLjhGL15JSkpPX1A7XlxfW0pZTi9fOFRdP19OSzpUX1xHIlBPXVM7RltfQTgqIQorTV9SXE4rP1w4JkFXXyZBUD9fUSgyJT9cOCVBR18jMFgvX1VBOzcvXTE1JTdfKEI0Rl9SID4oP1xEKEI3XworTScxTD5fUSwxJS9cNiQhM18lIFwzX1EkLyRPXDQlIT9fJzI4Xl9RUEM0P1w0JzQrXyciIFxfUlg+Lk9dQQorTTlHK182NVk+X1ZNTTpPXjVEWFtfNDRVK19RPDIlT1xMKiMjXydBVENfUyhLLE9cWiwzQ18/R0VfX1UxKworTTJfXklIKiNfJyE8OV9RQDYmP1wzJEFDXyYxMDZfWjY/Rz9cOCRRP18lMSw2X1FIOSYvXiFAN0NfRjk6MQorTV9TUFgtT1xGKEIzXyYxQDdfVS0tMF9fIE87U19fXzdSX1QgWi9PXDsnIi9fJiFEOl9XQVo9X15cTTs3XworTSZBQDpfUTQzJU9cRidRX18mQTg4X1E4MyY/XD0nIitfQlg6Jl9SSEspL149RShXX0BYJVxfUlxXLS9cSAorTSsyT18mMVw7X1JUUytfXTM2NSdfJiE4OF9RMDElX1w0JEE3XyUxLDVfUTAyJS9cMyQxL18lISg0X1E0MworTSU/XDQkQTNfJjE8OV9RRDcmP1w3JiFHXyhCPEdfUlBVLT9cOygiI18tMzxfX1E4PiZPXD0lMUdfJjFcRworTV9SMFY7T1w5J1JfXylCSEJfUlRQKk9cVisyO18uUzhWX1ZVUDw/XSYzVF9fLCUlQ19RTTBBT1w7LlcvXworTS4kXVpfVVFIPV9eWkxLO18oQVRDX1IgPCdPXi1DWDtfSEleNF9VLUA6X10rOygvXzFWTiBfUiUiNi9cQQorTS1EK18qMkxJX1leQUdPXyNRTD9fQShGLl9cLyRRP15fTytPXzZFVT5fW1sjUF9cXjA0K19TPEcrX1YlOQorTTcvXjdDWStfJjE8OV9SNEUqL1w5JjFTXyRRLDZfUTw3Jk9cMCQhL18nQVhBX1IsQylPXEgqIk9fJjFEPAorTV9RTDsnT1w1JTFDXyQhIDNfUSwuJS9cMyNBK18kQSAzX1FMOig/XDUnIyNfJkIlK19ROD0wP1w7JyNPXworTTlEXVlfVy1QPz9cSi0zO18nUiBLX1dVWj4/XScxJC9fJiEwNl9SVEgrL10nMERDXzEzTSRfVCxUL19eJAorTT8oO184NS00X1omOUc/XDQkQU9fJFE0OF9RLDEkX1w8JVE/X0VZJi9fUFQrI09cNSRBQ18mITw2X1Y1RgorTTgvXUs6NjtfLTM4V19RSDwoP1w0JEEzXzUlKSpfW1ZaTj9fX14vP18zJDEoX1I0RCpPXD4nUiNfK1MwUAorTV9bXlZNT1w5JVFHXykiMEdfWy5LSj9eWk07P18mUTg8X1EkLyRPXD4mMUdfJ1IsO19aJjZDX14gP0dHXworTS0jUFhfU0RfLl9cTSxSX18tM0xXX1VVQDZPXDglQUNfJSEkN19RMDIlP1wzJDEvXyUxLDVfUTQzJT9cNQorTSRRN18kUSQzX1EwMiUvXDklUUdfJjE8OV9RODcmL1xBKiJDXywzSFpfUSg3JV9cTSszQ18oUkxBX1IsOQorTShPXD8pMldfJ1JVRV9TOFUxT1xXLiMrXy9UJF5fUyxYLE9eOUk6M19GOjZJX1ZZVT0/XS85Ni9fLFVFWQorTV9XMVxEL14oQCdbX0FIJiFfWlJGSk9cOyVBU18nQVA+X1hWLkIvXj1GKFNfMiVFRl9UPU1CL15PU143XworTT0oWkNfVDE0N09eJEEoJ19GOUo0X1I8TStfXFAtM0tfTCpaUF9cLl9QP11EOjZHXzcmQUdfVzFbPl9eJAorTUI4R19EOF4xX1pCQEhfXDgkUTdfJTEsNl9RSDonP1wwJCEvXyVRPDpfUFguJD9cNiVBR18nMVRAX1FYPgorTSg/XD8nUitfJjFEPF9RRDknL1wvI1ErXyRQVDVfUSwuJE9cMCNBJ18lISg7X1E0Pi1PXDkoVSNfJlI1KgorTV9RMDktX11FM1dTXz9HRiVfUSA4Jk9cOiZCP18nMUQ7X1U1MjQ/XEgpIjtfLCJMT19SPEMpP1xCJiFPXworTSxCNEpfV0VQPV9dIS1DN184JTk5X1EkLiUvXDQkIStfJUEoNF9RRDIkT141Q1hXXyUxKDhfUTAwJi9cNworTSUxP183NVk4X1laPkZfXFEsQy9fJyFQP19RVDsnP10rMkQvX0FYMiNfX19YXV9dIy5TX18nUVhEX1E0NgorTSVfXEUpMitfTDo2Rl9RTDkmX1w5JlFbXyYxLDFfUTgxJF9cPCVRV18mUUQ8X1kqLUM/XSUyNCdfSEk+MAorTV9XXV0+L108OTVbXzlGVUVfViFHN19dQTomI185JkFAX1FANiYvXDklQVNfJUEwN19RODQlT1w6JiFLXworTScxTD1fUTg0JU9cNSRRN18kQSAyX1FENyY/XDclMT9fJVFAOV9SOE0rP1xULzNXXyUhRDlfUyxQLy9cQQorTSohW18mQSA5X1BEMiY/XDsqNidfJlE8R19SPEEnX1w4JkFXXy0kTSpfWDZBSS9dRD4nU18zNTk2X1UpSQorTTovXFM2Jz9fPDcpXV9ZPiA7P14lPVZbX0oqIj5fUiQ/KE9cPycxX19DOEolX1pCQUU/XjFISl9fKTRdSQorTV9bLy9ZL15VUk1TXyRRVEdfWEolP19eI0AnT18nQihEX1VFOzgvXl9OW1dfTztGW19SUFEsP1xUMCNfXworTS0jVF1fVFE4NV9cRClSQ19FKFIvX1FEMSUvXDYlIT9fJkFIPV9RIDAkX1w4JiFPXyUxNDhfUVg+KD9cPgorTSdCJ18wVC0mX1JISis/XEAoIi9fKkJITV9RKDIlP1w0I0E7XyUgXDNfUFgsI19cMyQxS18lMiRcX1FIRQorTTUvXDwpVEtfLEM1Ll9WKTQ+T14gP0g/XyMxIDVfUTQyJ09cMCMwU180JFUsX1FENSVfXEAmUV9fMFQpKAorTV9VOTQ1T11DNyVTX0lKKkpfVllPPU9cNiUhP18mMSgyX1MkRSg/XD8mQUtfJlEwNF9aRkNIP1w0JDE/XworTSRQXDdfUFwtI19dQjhVV19GWU44X1NUXS5PXD0mUVdfJlFEPF9SVE4qL1w6JUFDX19fS1lfUkxDKV9cMgorTSQxP18nIVQ+X1dFVz0vXkZFWUNfJTEsNV9SRE0rX15bTTsvX0cpPjlfUUAzJj9cPSZRW18lUSgyX1Q1KQorTTA/XkhHOTtfQTgtXl9WNU85T14lQzgvXzsnMUpfVj1POT9dSTs2N18lUTQ3X1FINyc/XDomIU9fJiE4OAorTV9RTDkmX1w+JyFbXychSDxfUUA2Ji9cOiYhS18mQUA6X1FANiYvXDcmIUdfKiJcT19TKFsuX1w0JjFHXworTS0zIFxfUihGJz9cQCVBX18nMkRQX1IkVjsvXDYlIjNfKEFcPl9SJE0tL14qSSo/X0BJVkRfVVVUPj9dJgorTTREX180NklPX1JVNT8vXVQ+OE9fRDghUl9XLUA1T14+REhXXygyKENfUVw7Jz9eMkJIO19JWVYyX1lGSgorTU1fXVZIS1NfRiwzOF9aRy1YT1xKLlRDX0IoLiNfWVY4RF9cPidCJ18yVEkwX1w3IFBPXk5JSkdfLkNAWgorTV9TQFsvL10rM0RfXy9ELSNfUUg9J09eIj9II18mIUQ6X1FEOScvXDwnIV9fJFEsNl9RMDQlX1w2JUFHXworTSVBODlfUUg6Jz9cXS80I18nUVxCX1FEOScvXD8nUitfI0BYMV9RMC4lT1w0I1EvXyQwXDJfUSgwJj9cOAorTShDV18oQkk2X1E4PC1PXDgmIidfNSRRR19UIF4xX1xLKVJfXyZRSEFfWC4hP09dMjNUW18mQTg4X1I8QgorTSlPXC0kQjNfJyIsUV9TKFUwL11HOzgvXz1IJkBfUVxELU9cPSVBO18uIlRGX1IsPyc/XD0lQTtfSzo+RQorTV9STEgrT1w/JlIvXyUhKDRfVilDNz9cOyZRQ18sUyRMX1FMOCVfXDUkUTtfKjJUS19RQDYmL19ZWz5bXworTSlRXEJfUTgxJT9cPiZRS18nMVQ6X1lKLkQ/XEgpMk9fKiJESl9TJEkpX1xKKTI/XyUxKDhfUihAKE9dXgorTT43R182VTkwX1ouOkRfXjRESFdfO0c1Tl9ZJjZEL11aPzc/XztHNU5fVylTOz9cNCQxI18mMTA4X1FENAorTSYvXDYlIT9fJiE4OV9RQDYmP1w5JVFLXyYxPDpfUTg0JV9cQCdCI18lUTg1X1FMOiY/XEcsUyNfLSNEVworTV9RODomL1xYL0QjXygxXDxfUVg3JD9dJjNFW18pIlU8X1FIOylPXEAnQU9fKUMwU19YOjtHP11TQjhPXworTTg3PVVfVU1ENz9dPj03I18rRF1aX1dBXD9PXjxBWCtfOVVJLV9YSiI/T1w/KCInXytTJE9fWD4uQE9eSQorTUU4V180JUFCX1YyNEo/XVlKLCNfRlxXSF9VTVxEX15cTVtXX0BHOVdfUVxAKD9cWy9DX19TXEcnX1pCQQorTUg/XFErUydfK1JcUl9SSEkrX108NiU7XycxSDlfVC0iMi9cKSIhN18nMThCX1IgOihPXDklQVNfJCEsNAorTV9RNDUmL1w0JEE3XyQwXDJfUTg0JV9cPycyI18lQTA3X1EkLyRPXDEjUStfJEEgM19RKDAkT1wyJCEvXworTSUxKDhfUVRDMF9cMSVDI18kMFwyX1E8MSU/XEkpMltfKVIwSl9TIE0sX1xOKyJfXywyXFFfUjhEKU9cPgorTSZBU18wQ1RfX1IoRS9PXSo0Nj9fJSFYTF9SLFMzP10qNUc3XyJQUD1fUiQ5JT9dQTckS18wU1hZX1FAMworTSU/XkJHOV9fKkIwTF9RSDUmX1w1JVE3XzI0USZfVSEvMi9eTEhJW18mMVQ7X1FAOSZPXEgpQkdfLCJYUAorTV9fX1NcT1xIKCIvXykiJEdfUiQ8Jy9cXzAzW189JkVOX1EgLSRfXEUpQj9fLTJISV9SPEEpP1w0JFFHXworTSZRPDlfVU02NU9dRzglS19IKUoyX1o2Q0dPXiBBOCdfRylWN19ZKjBCX11WPjcvXz4nQVVfUTw0JF9cOAorTSUhO18lUSg2X1EkLyRPXDYlIT9fJSEoNV9RPDUmL1w1JEFDXyVBMDdfUixBKF9cOyZBR18nIUw6X1I8VgorTSxPXFgvI0tfJiFQOl9SXFsuL1xFKEInXy1DIEZfUjhMLy9cPilVI18lMUxDX1IoPicvXTQ2VU9fNSY9RworTV9XMipCP11bQ0hDXzgmSUFfVUVQOl9cTjJXT189V1FaX1lGI0A/XVU6ViNfPUchTl9SSEsrL1xQLEJfXworTUNYWiNfVklCOC9cLClTK188OkMgX1guUVM/XUJFSz9fPjorIF9bLlNPL11OOEYvXykiKERfUlhSLC9fLworTVI8P19HWUo6X1JQSisvXkZJSkdfKkJQUV9bJk1KX1w7JiE/XzhGLUpfUjxELD9cXC40N18oMihJX1EwMworTSY/XDEkMTNfJFEkNF9RODQlX1wyJCEvXyRRJDRfUUg4Jl9cNyUxQ18kMFwyX1EkLyRPXDIkIStfJEEgMgorTV9RIC4kP1w8JjFfXyciLSFfUEgtJ19cMCJQT18qIixFX1FANSZfXDklUUtfKSIoRV9SID4oP1w9JlFXXworTShCIEJfVklGOi9cRigyL18kUFw/X1FAOChfXDUmIVdfJkI0UF9RWEYuT1xZLzQ3XylSKD1fUzRPKV9dTAorTTpWS18jIFQuX1oyQkdfXFUsIk9fKDFQPF9RODglT1xeMFNfXzMkSSVfXDZZTT9dJzMkS18rQlxQX1FENAorTSYvXDglQUdfX18zUV9TRFQuT1w3JVIzXylCJEVfUkRLKi9dXTxHP18mQTw9X1hKK0MvXlJJWjtfPCZJTgorTV9RLDImL1w6JUFDXyVRKDJfVz1QOk9eO0U4V19OKzpRX1tWXU5PXyFPS0dfSjomPV9ZUjpFP148Rkk/XworTSkyKEFfUiA8J09cPCVRT18kUSQ0X1FIOCZfXDMkMTNfJVE0OF9RPDQmT1w3JTFDXyghWEBfUUQ4JV9cPworTSdBV18qQ0RVX1M8Wy4/XDgnIUtfK0M4Ul9SPEIpT1xHKUFfXykiRFVfUVBGMl9cNCZSJ18vU0xZX1gyKQorTUNPXjdLKltfQDk6OF9XQiZBP11FOzZHXzc3MU9fUjEhPD9dWT9HU19FN11dX1c9TThPXSgwRCNfKjJISworTV9SLEUoT14/RChPXyYyLEdfUzk/PE9dO0M6Q185OS5PX1VWMUxPXTA/OU9fSksiWl9VXTU2L1xMKkJTXworTSUhQDZfXSMqUi9eQEZZT18nQVA+X1siUExfXSIxJEdfTEsiU19RSDonP11TPTdDXyUxKDhfUVhCKS9cRQorTSoyT18lITA3X1EsLiRPXDYlIT9fJkFAO19RPDUmL1wyJCEvXyUxLDZfUSwxJS9cMCNBJ18kMFwyX1EkLworTSQ/XDEjUSdfI1BUMF9RTDgnT1w/KUNTXyUhOEVfUVQ4Jk9cRSgiM18kQSAzX1FENyZPXEwqQldfJzFMPgorTV9RPDUlX1w1JFE3XzM0RStfUkREKU9cOiRBO18lQSg0X1EoMSQvXEEnUitfJDE4PF9RQD4oL1xMKjJDXworTSdRLDZfVjE6Oz9cOyRCS19DKCI1X1glVj8/XSUvI1NfKDFYPV9TUSAvT1xQLEMjX1NcMyNfUyBVLF9dJworTTIkR18oIUw/X1FIOCZfX19eLy9fMDNVJl9VLTg6T1w0JEE3XykiMEFfVl1EOj9cNyUhS18kUTA1X1JAPQorTScvXDYkITNfJVE4PF9RSDYmL14vQkhLXz9XQVJfWVY3Q19eTUpaO19UTSMtX11DMFMvXzdSXD9fSzpCQworTV9aTklJT1w5JUE3XyZRPDlfUUg1Jj9cMyQxM18lUTQ4X1EkLyRPXDQkQTdfJTEoOF9RODQlX1w2JSE7XworTS4zQFdfUjBDKE9cSS4jM18tM0RXX1FEPSZfXE8tIyNfKTIoSF9RVD8nL1w0JkIrXyVRTFtfUVA+KD9dOworTTY1O19CWUI9X1hGQ0lPXiVGOVdfOTZVT19VQUI3X103O1ZTXyk0KVJfV0FdPl9eKz03L187VjU6X1RdKQorTTFfXEQpMjtfKFI0Ql9ZVjRDP109OycnXydSWSVfUSBLMF9dXUk7S19GXE9HX1onLFkvXlxQLCtfNCQ9JworTV9SREcqP11AOSYrX1NMQyZfWUY0RS9cOyYxT19OW05eX1RJLDQ/XlhNW1tfJjFMPl9WIUM5L1w4JSErXworTSgxVDtfUjhBKD9cOSUhO18lIFw1X1FANiY/XEIoIi9fJzFMPl9RKDAkX1wxI1ErXyRBIDNfUTg0JV9cMworTSQxM18kMFwxX1EkLyQ/XC0iUFtfJyFEP19TLFsyX1wyJEFfXyUwXDNfUSgzJS9cMCQhL18mITg5X1IwQgorTSk/XDclMUNfJiE4OF9RPDUlX1w4JSE7XyZBNDdfUVA3Jz9cLSNRO18hUFAyX1BAJyNPXDMjQStfJyFINworTV9RXDskX11eOjY/Xz82KVJfVEBOMj9dMy81P18wQzhfX1hWIkA/XTY0NSdfLjNMXl9SVE8tL18uUEwvXworTStDLFFfVFEtM09cPSYhU18lUTA6X19fWV5PXEcpQldfKkJcW19TNFQuT1xIKEIjXzVVJTVfUVg7KD9eNgorTUQ5L19NKlJKX1NYWS8/XC4kITdfJkFAOl9RWDsmT14gP0c/X0U5LitfW1JaTT9fN1Q8X19WXSMvX10/LAorTVJfXyJNWztfSzpGR19SMEEoL1w6JUFDXyUxIDRfUSwxJS9cOSVRR18lUTQ3X1FANiYvXDclMT9fJVE0NworTV9RTDkmX1w/JzFfXydSLEFfUlxXLS9cWC8zT18nIiQ/X1MwWC5PXD8oMjtfJkFUPl9RJDYnL1w3JkJTXworTSVSKENfVC04NE9dWUNZP19FSyZcX1dSOEgvXT4+KC9fMFU9RV9UQUU8P1xSMVYzXz43TVlfWTokPU9dUAorTTk1S18yVD0lX1QpJTFPXFEtQytfQ0heKF9XSVc9T1w8JjI7XzA1SVFfWCZQUE9eOVE9R19DKz8pX1pKWQorTU4/XFgtMzNfLjNYXl9WMUk5X18tUjw/X0NYSipfUVA4Jk9eLkNJJ184Ni1IX1o6RElfXDMkUTtfLCMsVAorTV9SNEIoP14yQUgnXzklXTlfUUw9Jk9cOyVRR18mMTA4X1FUOydPXDUkUTtfJEEgM19RKDAkX1wyJCEvXworTSQwXDJfUSQvJE9cMiQhL18kQSAzX1BUKyNPXDsmMVNfNCRdNV9UQSczP1w0JEE3XyRBIDNfUFwtJC9cMAorTSNBJ18mQUA7X1E8NSYvXDEjUStfIiA4KV9RKDAkX1w6JTFHXzFEKSpfU1xdMU9cWi5EN18kMFw4X1MoSQorTSwvXSAtM0tfQjdaI19VQSc0P11JNzZTXzklSUtfVz1OPl9dTzomX19IWVpAX1lWN0U/XSoxVCtfNTUtNQorTV9dOypSX107NFUnXzJELSNfUUg1JT9cPCVBS19fXzNUX1JQRyo/XD4oIjdfKDFYPV9SWEYpL10sMURLXworTShSIEZfUjg+KD9cSihCI18nMUA8X1FAOidfXDwmQVNfPUctUl9YLiI+X144RihfX08rSlVfXUMwU09fPgorTVRdK19WPFstX1w2Wk4/XkpJSjNfMVQxI19RODIlL1w3JEE7XyVRNDhfUUg4Jk9cNyUxP18mITg4X1E8NQorTSVfXDclMT9fJlFEO19RVDsnP1w/KFInXywzOFRfUyxYLU9cPShCI18uIzhRX1IwQidfXD8nIitfJUEsPworTV9RMDEqL1xQLVU3XydTJTVfUiBWNy9cTzUnP18uVkotX1JVOkBPXD4xNl9fKyU1WV9SWSg7X11cQFhHXworTUdJIiFfVlFANV9dJTAzX18rQyRSX1JITypfXT84VUtfQDddWl9VVUY7P105PykvXztZWlZfWV8hVl9eIworTUk7R19IOjpLX1MsTCsvXFQtMztfNTVJOF9XWiA/P11MOlZLXyoyUE1fWiJESU9dPjhWQ19QTCMjX1EsMQorTSRfXDAkUTNfJ0FIPF9SLEEmT15YS1pHX0JXUVxfUTwxJT9cNiUhP18lISg1X1EwMiU/XDMkMTNfJFEkNAorTV9RLDElL1wyJCEvXyRBIDNfUSwxJS9cMiQhL18kUSQ0X1FIOCZfXSkxVEtfJTEsNl9RIC4kP1wyJCEvXworTSRBIDNfUiA+KD9cQigiL18oUiREX1E8NSYvXSQwRDdfJSEoNV9RIC4kP1w0JCFDXyRAWDZfUUg2J09cRworTShST18sMlhUX1NAUy4/XS4yJSNfODVJRF9RJC4mX1w0JDFXXychQEBfVChdMD9eTUoqS19MSkpIX1dNTworTTpPXUw5NjdfQlgqIl9XIUc5X11MOTY3XzclPTdfVCxeME9fX1wuU18uUzBUX1JESipfXS0xVDdfLTJUSworTV9TOFAtL1w6JVFXXzY1JTRfVi07Nj9cRyhCO18mUVRCX1I4RClPXFYsUytfQ1haJ19ZQjhDX18kUEtXXworTVY9Jy9fXT8sUl9fOlNcW19RO0pZX1pKRkkvXS8zJE9fJTEkM19RODElP1wzJDEzXyVRNDdfUTg0JU9cNQorTSRRN18lMSw1X1E4NCVPXD4nIVtfJkFAOl9SKEYpL1xYLzNPXywjNFNfUixIKU9cVS4zP18lUVxJX1BMNworTSxPXCwkUz9fIiEsUl9STFw6T1w+Ljc7Xyo0TV1fUj0wQD9cXjspW18rJUosX1MpO0MvXSU6KSNfM0Y6LQorTV9UUTQ3T143QzgrXz1WTUJfU0BSLC9cXzAkJ18yJEElX1ZJTjk/XUo7RjtfPTguJl9TTT08P11dS1wzXworTUgsP0BfV0JCTE9dVUEoM19BJ01bX1QsXzA/XDsoUiNfKzMsT19ULSgxT11VPkdLX04sIyJfUTQ/KF9eXQorTU5bW18nIUg8X1FIPSdPXD4mQVNfJTFAMl9bPklJT147QCg7XyUgXDVfUSQxJS9cNCRBN18lISg1X1EgLgorTSQ/XDQkQTdfJFEkNF9RLDElL1wxI1ErXyRBIDNfUTQzJU9cMyQxM18lISg1X1FYOyg/XDMjUT9fJDBUNQorTV9RICwlL1wxI1ErXyZBQDtfUUQ3Jk9cOCVBR18kQSAzX1FUOydPXDQkQTdfJkFAO19RKC8lP1wyI1E3XworTSUxKDhfUTQyJi9cMyRBQ18kMSw4X1EsNSZPXDcmMVtfJDEoOV9RLDImL1xSLCMrXydRVDpfWiY8Ry9eLworTUEoL186JVE3X1Y5PTc/XUA3JVtfN0VJPF9USSYyL10xMzRfXzRFITNfX19SXF9cSikyR18oIihJX1QoXgorTTAvXSMuU0dfLTJcU19RPDQmT14zQlhbX0ZJKjBfUkhFKj9cNyYxW18nIUg8X1JERik/Xi9DSD9fRTk2LAorTV9cMyJPP182U0xTX1U8SylfXUsvU09fLVBMJ19IOVY7X1I8RChfXDYkQTNfJVEoNl9RLDElL1w3JTE/XworTSVBMDZfUTQzJT9cNSRRN18mITg4X1IsQShfXDsmMU9fKSJARl9TRF4vL1xPLSMrXykiREdfU0xbLi9cOworTShSV18tRDlAX1QtLzpPXFUuRS9fLCNJLl9TVS83P1xMLyRTXylSUF5fUkxSMC9cWjEkX183RilKX1ZBRworTTlPXU45Vl9fQCdFU19YMVo7X11TOSVbX0dZPjVfVF0tM19dKTFUM18nUUw9X1FQOCZPXEMpMkNfL0RJMworTV9ROE0sT10vOEZbX0NKQlVfUVBFKT9cRSgiI18vI10gX1RBLTJfXTY1RS9fMzRRK19UUS0zT15STSs/XworTSYhTEBfWzJPTF9cPichW18nUihDX1FYOicvXEEnUVNfTjs2U19VQTM1X1w2JTFTXyRAXDVfUSgwJF9cMAorTSNBJ18lQTA3X1FcPSgvXDUkUTtfJTEsNl9RMDIlP1wzJDEzXyQwXDJfUSwxJS9cMiQhL18tUyxbX1MoTgorTS1fXD0mMitfJkE4P19RKC8lP1w3JTFDXyVRNDhfUTw1Ji9cLyMxI18oIVhBX1E8NSYvXDAjQSdfJkFAOworTV9RMDIlP1w0JEE3XyUhKDVfUSwyJj9cMyRBQ18lITA3X1EsNCU/XDQlMVNfJCBYN19VJS80T1w/JyFPXworTTtGXVBfVjlEOD9eJUAnS181JS0yX1RRMDRPXSUyNE9fMiRBK19USSgyX10nMTRDX19fQ1tfUig/KT9cNQorTSVBV18nUVA7X1NQVi0vXEAmUV9fKFFUQV9SWD8nX1xHJVEzXyhBSD5fUSw1Jk9cMSUhN18wJCUiX1hCJgorTUBfXjtFOFdfUVwqXV9dOy9TX189VS0zX1ZdJy1fXSclUD9ePkVZP18nITw5X1E4MiUvXDQkQTNfJCBYMAorTV9RNDMlP1w9JlFXXyRRJDNfUTw1JV9cOSVRR18sIlhQX1FIOCZPXEUqQjtfLEM8VV9TLFguL1xEKkI7XworTS8jQFBfUkBEJy9dTzsmP184RVE0X1ddVTw/XUw4VVNfOzZBPF9XIUo4L11VOkYvXzxGOT1fVy1GNl9dSgorTTclL180RFksX1UpLjQvXT02JS9fOzYxPV9WST44P10lLkNfXydRSDpfUlhKKy9cOyUxR18lUSw1X1IwQworTShPXD8mQVNfLSI0P19SPDklT103NEUzXz5XLVFfUjQ9KC9cRSkiS18pQkhMX1IgQChfXEgpQkdfJjE4PAorTV9WQUc7P1xAJ1I3X0cpWkFfUTw5Jy9cOiZBV18nMUw+X1IsPiY/XyRQPCNfOiY9TV9SLEApT1w3JkFfXworTSVRRD5fUSgvJT9cOCVRV18qUlBNX1FUOydPXEAnIjNfJFEkNF9RODQlX1xVLFM7XyMwTC5fUTg0JV9cUQorTStDM18uIzBcX1FINidPXDslUV9fJVEoNl9RSDUmP1w2JDE3XyUxIDRfUTgzJj9cNyUhS18lISQ3X1E4MworTSY/XDEjQTNfJDBYNF9RODMmP1w1JEFDXyVBLDlfUUw5Jy9cOSVRS18mMTw5X1EkLSU/XDMjUT9fLiMwXAorTV9STEgrT1xHKjJTXzxHOVRfVSk0NE9dKjM0W18xJEEqX1QxJjI/XSMxNENfMUQ5KV9UOSgyX19bXF87XworTSlSKEhfUiRAKU9eLkI4R189Nl1NX1JIRSo/XDglQUdfTzs+VV9bVlVMP1w8JVFPXyYhPD1fUUQ1JV9cNQorTSRRN19ESFYtX1laNUNPXypRPCNfVUxfL19dVzRVL188VExbX1RMOyFfWiI3RV9cPyZBU18lUSw1X1E0MworTSU/XDYlITtfJjE8OV9RUDonL1wzJDEvXyRRJDNfUUg4Jk9cOyYxT18mUUQ7X1IwSShfXFUuQ0NfK0MsUworTV9SOEwqL1xULTJfXysiRERfVE0mMC9dKTBTT184VUU1X1VFMTM/XSoxNCNfLjM4UV9TIEwrT1xEKEI3XworTSYhODlfUUA2Jj9cOyVRR18nUUw5X1JQRSdfXiA9RlNfOVVNPF9WKTw2T11JOUYnXzAjVFxfUVg6Jy9cOQorTSVRR18tIyhPX1I8PCZfXSosUj9fLjI0PV9cSl1PL14jPjc3XyghRDlfUlBKKy9cUy5DS18yJE0sX1JESgorTSpfXUE4Ri9fPzdZX19RJDIkX15TTTtDXyZRVEBfUTg2Jj9cPCZBV18qMjhBX1tWWE4vXUA2RitfJlFAPgorTV9TKFcvL1xYLkNfXydRUEJfUkBKK19dIDA0K18lUTA6X1I8QypfXDMkMTNfIyBILV9TKFAsX1w2JSE/XworTSRBIDNfUVw8KE9cOCUxT18kUSA2X1EkLiUvXDgkUT9fJjEwOF9RODElP1w1JCEzXyRAXDVfUUg3Jz9cMworTSQhO18kQFw1X1FENicvXDEjQTNfJkE8PV9RLDAlT1w2JEFLXyVRLDtfUTQxJj9cNiRBS18nUVRAX1JQSgorTSs/XE0qUltfNEUhM19URSoyX10lMiRHXzEkPShfVC0mMV9cXzA0M18vRCEjX1QlIzFPXSIxJD9fMCQpJQorTV9fQ1BcX10nMERDXypSSFBfUVw6Jk9dTzlWN18pIVxDX1IgQik/XEAoIVdfKDFYOV9RNDMlT1w6JjFfXworTSdRPDpfUlhMK09eLUIoQ19HSTYuX1xfKlE/XzJSXE9fVVxbLl9dUzJTT182Ukw3X0gpPjdfUjA/KD9cPQorTSYxT18lQTA2X1E8NSVfXDklUUdfJkFAOl9RLDEkX1wyJCErXyZBQDpfUVA6Jy9cOiYhS18pUlBGX1M8XAorTS5PXEorUl9fKTJMR19SXFErT1xIKUIvXy8jRFRfVDBfLj9dJy9TV18mUSgyX1IsPCcvXD4mMUdfLFJIRAorTV9UMFwuL10yMzRXXzolXTlfVjk6ND9dUTlFT18+RlVAX1g1VzovXVk8Nj9fOUYtOF9WUUs4L1xVLFMjXworTSghWEFfUihAKE9cSCkiK18rMVg4X1Q4SyZPXFgoMTdfVSw7I19ZMixCT1w+JkFDXzc1XTxfViVMOV9dOgorTTglU183VjVBX1ZFTzpfXT04VV9fLzQsX19USS8zX1wxJFE7XyNQXDJfUTg0JV9cVy0iX18zJD0nX1IgOgorTShPXDglMU9fLSNEXl9VUT44X105NUVTXywjKFdfVSExNE9cMiNRN18oIVBEX1E8NSYvXDYlIT9fJlFEPAorTV9RODQlX1xAJ0InXyUxKDhfUjBBKV9cNCQxP18nQUxBX1FINSY/XDolMUdfJUEkNV9RMC8kX1w3JSFLXworTSVBLDlfUUA1Jl9cNSRBQ18lQSw5X1EwMSVfXDYkUUdfJjE4PF9RMDAmL1xAJyIzXyUxJDlfUiw/KV9cVQorTS1DP180VTUzX1Y1Rzk/XSozJEtfMkRRL19UMSYyP10hMFQ7Xy9EISNfVCkkMV9cXzA0M18uU1UgX1NZIAorTTBfXFkuM1NfXk8rVV9TME8tP1xEKFJHXztWSUpfWToyRC9cPiYxV18rMkBMX1oiNUUvXis/V09fJzE8OworTV9RSDknX1w9JlFXXycxWD9fWTYwRC9ePkU4W19TXEslX107L1NfXzhTXF9fVSxLJl9dQyxRX149RSkzXworTSZBNDdfUVQ5Jl9cNSRRN18lUTQ3X1FANiYvXDomIUtfJFEkM19RLDEkX1w7JjFPXychSDxfUVA6Jy9cRworTSsiO18uM1hcX1JITytfXEYrIkNfLTMwTV9SXEopL10rMTNXXzZVLSlfV11TOk9dLTAzQ18xM0xRX1RVJQorTS5fXVA4VTtfKDFENV9SXEsrP10vMSNXXzxGNThfV1VQOF9dXTxGP19BR01QX1chSDdPXUU4RT9fPEchSAorTV9TOFItL1w8JjFfXyZRRDtfUlRIKE9cWiohW184RChMX1RATydPXl5LWktfOjYlP19TJE0rX11DOVZHXworTTg2UU1fVUU/OD9dNDZFU18tU1RfX1NNITBfXEwsQzNfM1UtNV9RJDMlT1wtIzEjXyghWEFfU1BZLS9eLQorTUIoQ18oMUxDX1IsQClPXFEtQ09fN0YhRV9RODMmP1w5JlIjXzJETSxfUiA9KF9cPCYiI18pQjBHX1IkPworTShPXDwmQVdfMiQ5KV9USSgyX1w0JDE/XzQ0WTRfUVw8KE9cMCMxL18lQSQ1X1FAMyVfXDQjUS9fJlE4OgorTV9RRDYnL1w1JEFDXyVBLDlfUVg7KD9cOiVRV18lISQ3X1FMOCdPXDsmIVtfKTIsRV9SNEMpP10nMTQ/XworTT03LVVfVV0/OE9dLjQlN18yRFExX1QtJTJPXSEwVENfL0QhJV9TUF4wX1xbLzQrXywzLFZfUyRTLU9cVAorTS1DR18rUyRUX1FENyZPX19dLzdfK1I8Sl9RRDknL11bP0dfX0RZMjVfUTw3Jk9cPScyI186NjVHX1ZVTAorTTxPXDIlMUtfKUI8SF9RUDQkL1xMKiJLX0QoTitfWUI0Qy9fLlM8O19VLScwX10nLFMvXzZULFtfUkwiXAorTV9aOjpHP1w+JVFbXyZRQD5fUTQyJi9cNSVBP18kUTA1X1E4NyYvXDAkMStfI0BUM19RUDsoP1w4JjFLXworTSdCID5fUkBNKV9cXDAzT18qUyBMX1JMUCsvXE8qUkdfMDNQVl9VPTExX11IN0UjXzhFISZfVSEgLU9dJQorTS5CX183NS0oX1VdMjM/XDUkIStfJCEgM19WWUk4X11MOEVDXz5WWUFfV0VLNy9eJD1WS184VVE2X1YhPAorTTUvXVE7JjtfJ0E4OV9RNDAlT1wyJCEvXyghRDlfVTEhLj9dQTBSV181IzxFX1khXT0/Xi9BWDdfKlIwSworTV9WIT85P10wNSU7XzQlLTRfVFEtM09cJyFAU18oUiREX1Q1IS9fXTI1RFdfKUJARV9RWD0oX1w4JVFXXworTTM0OSBfVUEwM09cOyVBU18lUTg8X1JAUC0vXTY2JVdfJlFAPl9RMDYmX10kMURHXyUhODtfUVQ9Ki9dJAorTTFET18rMkxUX1FcPChPXS4zJFtfM1RRMl9RMDElX104NUVHXydBUD9fUTg0JV9cMSMhI18mQTg4X1FAMworTSU/XEEmQUtfJlE4PF9RLC8lX1w7JVFfXycxREFfUVA6Jz9cQCdCJ18nUVRAX1UpMDRfXU88NzNfNTVFOworTV9UVTE0X10qM0UjXzBUQS1fU10kMj9cXjBUQ18vVDEpX1QhITIvXSMwREdfMEQlKF9UKSEyL1xdL1QzXworTS80JSNfU0heMC9cVi5DU18lMSw1X19TWl1fXEsqIj9fJiE4OF9RTDknL1xNKzMjXyYhQDtfUTg2Jj9cNAorTSUhP18nQVREX1EwNiZfXDUmIUdfKjI4QV9RWD8oL14vQ0hXX0dJQjBfXS8uUj9fM1JcR19VPE8nX10vKgorTVEvXytRO1dfSFk+OF9RQDIlT1w5JjFTXyYhLDdfUVA4Jk9cOiVBQ18nIUA6X1E8MyU/XDEkQS9fJzFYPworTV9RTD0mT1xEKVInXyciIDhfVCEjLz9cRSlSM18lMTw1X1FYOiYvXSkxVCNfNUUtKF9WRT80P11YOUVTXworTTYkQF5fVDRYKz9dMjFTU184RS0zX1FIMiVPXDgmQUNfPEZRRF9WNTs0P11NOCUvXzpFSSpfVy1GNl9dNQorTTQkT186Nj1AX1VJODQ/XDMjQSNfJTEgNF9RNDImL1w/JkFTXzEzOFFfVUxeKy9dKiwhV19FSDldX1g5XworTT9fXEQnMjNfKjI4TF9WKUg6T11cP1gjX0I4SitfUTw0Jk9cOyVBU18+Vz1VX1ZdUTovXUI5JidfJkFEQAorTV9RPDYnL10lMCNPXzNURSdfUUw1Jz9cNSVRU18mQihGX1NEWzAvXDklQVNfJSE4O19UPSkzL1wvJCE/XworTSchUEVfVSEyNV9cViwzV18nUUxDX1YlPzg/XTg1NU9fJFEgNl9VQTY2P1w+JyFfXydRVEBfU0xaMC9cOAorTSVRV18lISQ3X1E4MyY/XDklIUNfJEBQMF9SSEQqL10qMSRDXzRFITJfVzFSPS9dPDZFU182JTk4X1RNLQorTTRPXScyRF9fMURFLl9UKSUyT1xfMEQ/Xy5TWSNfU0BbMC9cUy1DT18rQyBVX1JYTSxfXE4rMy9fK0JUUworTV9STE0sL1xLKzMjXytDIFNfUkxNLC9cQCdCI19cXzdSX1NQXi8vXEEnUidfQ1hKLl9UXS00L1w2JSE/XworTSVRNDhfUTQzJU9cQyZRX18mMTA4X1FUQCg/XDYmITtfJlFcPV9ZIjFCX15CRlk3X1U8Xy1fXTsrUk9fNQorTVI8N19UXEskX1xXJ09fXj5ESS9fJSBcMV9RRDomX1w7JVFHXyYhLDNfUUQ0JS9cPiYxR18lQSQxX1I0RgorTSgvXFItMl9fMCQsXV9UKSUvX1xSLEJfXytCWEtfUiRAJ19cMSNRJ18oIUw7X1QxIi5fXSQwMztfNyUpJAorTV9XSUs3T10zMSM/XzBDLEZfVS0iLT9dOjJUT18nQUQ/X1IsRSovXTIzND9fOzYpN19WNTgyX11LN0UnXworTTk1UTVfVSktND9dLjJUS186RkFDX1E0MSRfXDYkQTNfJkE8PV9RODMmP1xKJ0FfXzYjVExfVFRYKU9dSAorTTdVQ187RklMX1FYNyg/XEAnUjtfNFVNP19WJUU5X14pQig/XyUhJDdfUTwzJy9eIkAoL18/WCVeX1YtQworTTlPXDglQV9fJSEsOV9UWSwxX1w2JFErXyYxND5fUUA3J09cOCgiM181JTk7X1EsMCVPXEAoQj9fNjVJOworTV9RLDImL1xIKVJbXzkmMUdfUzBQLj9cPyZSL185VjVHX1YlPjkvXDMkITtfNVU1OF9RWDwnX1xDKDIzXworTTk2LUZfUVA7KD9cNiVBX18xVEk1X1IgPCdPXUQ3VV9fQEdVXV9VVTg2L10uMyRfXzJESS1fVF0vNE9dJgorTTFER18wJCknX1QpJDI/XF4wJDdfLzNdJF9TWSAxP1xZLlQjXy9EISVfU1RfMS9cXS80I18vU10iX1NYXgorTTA/XF8vVCtfL0NZIV9TUFwvX1xTLFM7XygiIENfUUg2Ji9fVlxPI18vU0haX1JUSys/XEcpUktfRklCOworTV9RQDMlX1w4JFE/XyYxMDhfUVA4Jk9cNSRRN18mQVQ+X1FANiY/XD8mUUdfRkk2L19ZRjRDT182Vj1LXworTVNdLzVfXSMwVF9fLVIsS19SW18gX1YpNjVfXScwRCtfP1glX19WKT83T10zNFUjXzBEKF9fUyxTLC9cTgorTStCT18uI0xVX1MwVixfXEsrMk9fKFIsRl9RUDkmL1w2JFErXyQwUDBfUTQwJU9cQCYxR18xNCxcX1U5MworTTIvXU04VTdfQCcpQ19XLUU1T11ONyRbXztVTS1fVVUuM19dOzVVX18qIkxQX1Q1Ii8/XUc2VStfOUVFLAorTV9VTTAxP10qMUQzXyhRXEdfUUg4Jl9dNTU1K18nQVQ8X1FINSU/XDklQVNfJiE8Pl9RXDknP10oK0InXworTTJDQEpfVSkzMy9dJjE0T18oIUxHX1E8OSg/XT45VldfOEY9TF9WQUc5T1w9JkIjXyZRTEZfVCkkMy9cWAorTS5DV18rMlBTX1FANidfXDYlMU9fLyQkXV9QVC8kT1w0JDFXXyYhOD9fUSQ5Jz9dJTFUU18mITQ7X1EwNgorTSZfXSwzRFNfJkFAO19SLEApT11GOSY7XysiQFFfUVw7KF9dSDlGQ183NUlAX1IsQClPXSYxJD9fKDFcQgorTV9SMEIpP10wMkRDXzEzXF1fVDkkMV9cNSUxW184RjFJX1UhLzU/XSwyVSdfMjRBLl9URSs0L10mMiRXXworTS9UJSZfVCEiMV9dLTMlK18tMzBaX1MgTy0/XE0rIytfKlJIUF9STEosL1xKKjJfXyoyQE5fUjxHKk9cSQorTSpCT18qMkhLX1JESipfXEsqMlNfKjI8Sl9SSEgqX1w7JjFTXyYxNDdfX1NUXV9cRyhCM18mMTw5X1E4NworTSYvXjJEKS9fJ1FIPl9RQDMlX1w4JFE/XyVRKDZfUTAyJT9cNSRRO18mMTA4X1QwXC4vXjdEOD9fRjlCMQorTV9cJyRRP15UTjtbX0tbLlVfWzpUTV9fIU47V185Ni1FX1Y9SjpfXT04JidfLFM4V19SMEkqP1xBKUI7XworTSgiLERfUixEKT9cQigiK18nMUw+X1FANiY/XDYlIT9fJCBYMV9RLC4kT1wzI0ErXyRAVDFfUig9KD9cXworTS4zV18rIjhEX1VZNzJfXUs4NTtfNzRdIF9XUUQ1P11eOSVHXysxWEJfUkBDKj9cVyxTN18vQ0xWX1Y1OgorTTNfXUE1VEdfNVRRJV9TUFYtL1w6JUFbXyVRQD9fU1BfMS9cXS8kK18nQUxBX1FQOyg/XC8jMTtfKUIoSworTV9SVEIpX1xFKEFXXzZFUTNfVS0xNS9cOyYiM18mMURCX1VFPDc/XTc3JTtfNkVROV9RRDknL1w5JiFbXworTTdGKUBfVl1RO19dRDkmP18mITw+X1FQOyg/XF8wM19fKjJETF9RRDUnP1w9JjInXy9TVF9fUVQ6KC9cOQorTSUxW18lUTg9X1MkUC1PXDsmIVtfJyFIPV9WSUk6L1xCJ1JPXyghVElfVSErM19dLDFEM18qQig+X1JAQAorTScvXS8yRDdfOiY1QF9YRiVBX104NUVHXzI0PSpfUTQ0Jk9dKTMlJ18xREUuX1NQXzEvXSAwVENfL0QlJgorTV9UKSUyT10lMiRXXzAkLShfVCUkMj9cXzAkP18uQ00iX1NQXTEvXFkuVCNfLlNVIF9TVF8wT1xPLDMzXworTSpSUE1fUlBKKy9cSSlSR18qMjxJX1JARiovXEgpQkNfKiI4SF9RVDsnP1w2JEEzX14vI1NfUkREKU9cPQorTSYxT18mUUQ7X1dRVz5fXDYkMTdfJkE0OV9RRDQmL1w4JFE/XyYhLDdfUVw6J09cRigyN18yVDUjX1kiKworTUE/XitCODNfJ1FcQl9WKUc7L10yNiVLXzJEWTBfUzxXLk9cSyszI18qIkhNX1IwRio/XDonIV9fJTE0OAorTV9RMDQlX1w5JSFDXyRQVDFfUSgwJF9cMyQxM18kMFwyX1EkLyRPXDAjQSdfJDBcMl9RJC8kT1wwI0EnXworTSQwWDRfU1hYMC9cPSVRT18pUiw7X1RJJS4/XT40RC9fOyVFJ19XNUA1L1xJKDI3XyxCVFNfVDEgME9dIgorTTAjV181NSEqX1UlLDFPXScwRCtfLkM0WV9RXDsoX1w3JiFfXzRVQT5fVS0yNj9dLzNFM181VTk9X1FANgorTSdfXFsuJDNfLFJcWF9VTTk2X107NyU7XzYlOTlfUUg3KF9cOSYhX182VVE9X1VdQzZfXUA4RiNfJiE8PQorTV9RSDknX10/ODVfXzgmKT9fVVk+OD9cOCVRW18lUTg8X1Q1JDBfXFYtIz9fJiEwPF9RVDooL11LOUY7XworTTs2QU5fUUQ1J09cPCZSK187VlFSX1FUOigvXEMoMjNfNVU1N19SOEApL1xMKSJDXzREVS1fVU02NU9eIAorTT5XT19BOCIiX1QxIDBPXFQsQzNfKSIwR19RXD4pL1w7JkIjXyRBJDdfUihCKT9cSClCR18qUkRMX1MoUAorTSxfXFItIz9fLVNEXF9TRFsvT1xaLyNfXy4zTSBfU0BaL19cVi4jV18tMzxcX1MoVC1fXEwrQydfKiJITQorTV9SPEkrL1xKKiJLXyoiOEhfUkBGKi9cSClCQ18pUjRHX1I8RSlfXEYpIjtfKiI4SF9RRDUlX19fXU9HXworTSghQDtfUVg5Jl9cOSUxP18mMTA4X1E8MiVPXDwlUU9fJjEwOF9RODElP1w2JDE3XyUxIDRfUUAzJV9cNworTSQxN18oIUw7X1E8NCRfXDclIUtfJ0IgRV9RWEAoX1xIKyJbXyZRXEFfUSQxJS9cMSQxM18kISAzX1EgMAorTSRfXDIkIS9fJFBYMl9RSDQmL11QOiZTXyVRKDZfUSgwJF9cMSNRK18kMFwyX1EkLyRPXDAjQSdfJDBcMgorTV9RIC4kP1w5JjFTXzNUTTNfUzxSLi9cQyghT18vM0xTX1U9MDEvXTo0JCdfN0U9K19RSDUmX1w4JSFTXworTS4jOFlfU1BbLk9cXjA0K180NS04X1UlMjY/XEwrMzNfJ1FMQ19RPDgnX11BOUZTXzomPU5fVlVMPE9dTworTTtHN18lQTA9X1FMOCkvXT02VjNfOUY5SV9WPUg6P107NkYjXyYhOD9fUUg5KC9dQzhWO186JklIX1Y1RgorTTlfXDYlMVNfJSEsOl9VOTc2L10/ODVbXzVFOTlfUTg1Jy9cOSYhW18wI1xeX1I8RSovXDolQVtfKEFcRQorTV9WPUM4P11BNyYjXychQEBfUiRAKU9dJzE0P18nQVA+X1JARiovXT43JVtfPkc1UF9aRkFHP11XPEczXworTTZVQT5fVTE1Ny9dLjNFP18xJDkuX1NVIzJfXFguVCNfLjNRIV9SXFItX1xJKyMnXypSRExfUlxKK09cTQorTSoiU18rMkBMX1JMSSsvXEgqIk9fKUI4SV9SOEYqP1xGKUJHXykyNEhfUkBIKl9cRylSS18pUjxKX1IwRAorTSlfXEQpIj9fKTI0SF9SQEYqL1xHKTI/XykyLEVfUjRDKT9cRShSN18pMixFX1JARiovXEIoIitfKzJESworTV9fU1BcX1w+JSE/XywyRExfUlBHKj9cPCVRT18lIFwzX1E0MCUvXDQjUS9fJTEgNF9RNDAlL1w0I1EvXworTSVRKDZfUSwvJi9cNyRBQ18mISw3X1FAMSY/XDMjIS9fJVEkNV9RNDAlL1wxJDEzXyRBIDNfUSgwJF9cMQorTSNRK18kMFwyX1EgMCRfXC0jUStfJTEsNl9SIDsnX1w1JFE7XyRBIDNfUSQvJE9cMSNRK18kMFwyX1EgLgorTSQ/XDEjUStfJCBYMV9RJDIkX1w4JVFbXyYhMDxfUiQ9J19cMSNRJ18yRDkkX1U1MDJPXEMoQidfJFEkOgorTV9RNDMnL1xNKyMrXzRVMTVfVFUwNT9dNjY1W183RVVDX1MgTSxfXDwmIiNfJVFAP19VWUM6P11CODZDXworTThGJUdfVi1COj9cOCVBX18lUTBAX1VZPzlPXUA4NkNfOCYlSF9VMTY2X1w7JkInXyYhPD5fVjVEOk9dRQorTTkmS183VVlEX1FENygvXDwmQi9fMzRVMF9TJFMsL1xHKVJLXyZRSEFfUUQ4J09dITAjX18rMkxOX1IgPAorTSkvXEcpIktfMCNUWF9UKF4wL1xBJ0IzXydRXEJfVjFFN19eIkBXV19FSTY0X1Y9RTovXTU2NU9fNTVBPQorTV9UWTA1X10qMkUvXzIkPS5fVDknM09dJTFUW18wNDksX1NZIzIvXSAxNEtfL0QtKF9TVSIxX1xeMCQvXworTS9DWSFfUzBULV9cTytTK18rIkhNX1JMSSsvXEoqIk9fKkJAS19STEkqX1xIKUJDXyoyPElfUkBGKi9cSQorTSlSS18pQjBHX1I0QylPXEUoUjtfKUIwRl9SMEIpL1xEKEIzXykiKERfUjBCKS9cRChCM18oQiBCX1I4RAorTSlPXDIjQSNfXl8rUl9SODsoL1w7JEFHXyVRLDVfUUAzJV9cNSQhM18lMSA0X1E0MCUvXDUkITNfJTEgNAorTV9RMC8kX1w3JEE7XyVRLDVfUTwzJT9cNSQhM18mISQ7X1MwSi4/XDokUU9fJTEgNF9RMC8lP1wxI1ErXworTSRBIDNfUSQvJE9cLyMxI18jMFQwX1EgMCRfXD8nIitfJlE8P19RODElP1w1JDEvXyRQXDFfUTAwJE9cMgorTSMxJ18kUFgyX1EoLSQ/XDMjQStfJDEgN19RPDMmX1w4JEFLXyYxJDVfUUQ0JU9cTSoiQ18xNCRfX1NUWgorTS4/XDYkQUtfJiEwPV9SREYrL10yNDUjXzM1JS9fVSUzNC9dMjRUV18pUjBDX1IgPCk/XD0nIitfNlVVOworTV9WLUI4P109NlVDXzlWLUVfUUQ1J09cOiYiJ182RUlDX1YpQzpPXUg6NyNfMTQ1MF9RNDYnP1w6JyInXworTTdVXUhfVjFEO19dQjhGV18kQSg9X1FMOykvXUE4RkdfN0YhSF9WJT86L1w/JlIvXychWENfU1kgL09cWgorTS4jS18nQVA/X1JARSpfXTo1NSNfOCVNNl9XOVI8L11EODYjXzVFQTtfVT05Ny9dOjcmJ180NS04X1RRMQorTTVfXSozRTtfMTRFMV9UQSo0P10lMVRbXzE0OS1fVC0lMy9dJTFUW18wRDUqX1NQXzEvXF0wJDdfMDQxKQorTV9TVSAxP1xeMCQ/Xy8jWSVfU1BeMT9cWC5DX18uQ0RfX1JQSyw/XEkqIltfK0JQTl9SSEgqT1xKKiJLXworTSlSNEdfUkRHKj9cRShSN18qIjhIX1I0Qyk/XEYoQjNfKVIsRV9SKD4oL1xFKDIvXylCJEVfUiw+KE9cVworTSxDO18pIVxDX1E4MSU/X1pcPydfKCE8Pl9RTDQnL1w7JUFLXyYhLDdfUTQwJS9cNSQhM18lMSA0X1E0MAorTSUvXDUkITNfJSBcM19RPDIlT1w3JFE3XyVRKDZfUSwuJE9cOCRRR18nITQ/X1FAMyVfXDUkQSdfJSEgMgorTV9RJC8kT1wyJCEvXyRRJDRfUSwxJS9cMyQxM18lISg1X1E4MiZPXDwmIidfJlE4Ol9RUDgmT1w/JlFXXworTSZRPDlfUTwyJU9cNSQhM18lMSA0X1EwLyRfXDMjUT9fJVEsO19RWDknX1w/JjFXXycxRDtfUixAJ19cRworTSkiL18oMVg9X1E4MiZPXDglIVNfKCFYQV9UTSsyL10tM1RTXzNFKSpfVFkvMi9cPCYhS18nQTxBX1FMOAorTSdPXTY1RS9fNkVJN19VUTk1L105NTU/XyYhMD1fUUg5KC9dQDdWN183NVk/X1YlQjhfXF0vJC9fJUE8PgorTV9RTD0oT11BOEZHXzhGKUtfViVBOy9cNyVSI18oQixKX1RZMDU/XTM1NUtfNVUpOF9SPD8oX1xFKSIvXworTTZVTThfVVU+Ni9dSzpGR19FOS41X1gyIEBPXTk1RTdfNiVBO19VLTU2T10wNEVHXzNFITdfVE0tNS9dKQorTTJVK18yVFU0X1Q9KTQvXSIxJE9fMSQ5LV9UMSYzP10jMTRTXzA0LSpfVCUjMk9cXjA0O18wJC0oX1QhIworTTIvXSExJEdfLyNZJV9TVF8xT1xdL1Q7Xy9EISdfU1RfMS9cXC9EL18vM10kX1NAWi9fXFIsIy9fKkJASgorTV9STEkqX1xIKUJDXyoiOEhfUkRHKj9cRykyP18pIihEX1I8Qyk/XEgpIjtfKjI0R19SREUpX1xFKCIzXworTSYhLDdfUTwyJU9cOCRRP18lIFwzX19fVV5PXE8pMltfMVNZK19SJDwoT1w6JTFHXyVBJDVfUTQwJS9cOAorTSRRP18lQSQ1X1E4MSU/XDUkITNfJiEsN19RPDEmP1w3JEFDXyMwQCxfVzlSPS9dKTEkS18mMTQ3X1FIOAorTSRfXDglMTNfJEEgM19RNDMlT1w1JFE7XyRRJDRfUSwxJS9cLSJQW18mMTQ9X1FUOShPXD0mIVNfJiEwNgorTV9RLC8kP1w0JCErXyVRKDZfUTgxJT9cOSUhQ18nITw7X1EwMCYvXDckUU9fJ0FMQV9RVDsnT1xBJ1InXworTSwyXFFfU1xdL19dLDJEU18lUSw7X1FENSc/XEUoUjtfNDUlLl9VJTM0P10vNERTXzRFKS9fUVQ4Jy9cQworTSciO18mQTw9X1VFOTVPXTU1NStfNUUtLl9VQTQ1T1w7JVIjXyYxQD9fVUE3NU9dOTZFM182JUUyX1I0QworTSk/XDwmUidfJlFIQF9VUTs4P109NyYrXzg2IUZfUTw2Jy9cRCkiP181VUE5X1UhMDM/XTc0NF9fN0U5NAorTV9VOTI0L11aPzc/XzgmLT1fVT05NV9dNjVVQ18zJSU2X1RNLzVfXSo0JUtfMVRJNl9UWTA2L10qMyUvXworTTFURTBfVD0pNC9dJTFUW18xREEvX1Q9KTQvXSQxRFdfL0QhJ19UISIyP1xbLzQzXzBUNSxfVCEjMi9dIQorTTEkR18yRFUyX1NZITFPXF8wNENfL1QlKF9TWSAxX10iMSRPXy9EISVfU1kgMT9cXzA0O18vRCElX1NIWgorTS8/XFIsQzdfKzJUUF9SPEcqT1xLKjJPXyoiOEhfUkhIKk9cQygyL18pMiRDX1JERSlfXEInQiNfK0JITAorTV9RRDQmL1w0I1EvXyYhLDdfUSwuJE9cOCRRP19ePltVX1NYVC9PXEYnIk9fJ1FEQV9RRDQmL1w2JDE3XworTSUxIDRfUTwyJU9cOiUxR18mISw3X1E0MCUvXDgkUT9fJVEwM19RPDMlP1w6JTFPXycxPD9fUUw0J09cTAorTSlSV18oMVQ/X1FQNyZfXDUkUTtfJ0FQP19RVDsnT1w8JkFXXzAzXSJfVEUnMk9cOiVBW18nQUhDX1FUOAorTScvXDglITtfJyFAOl9RXDsnP1xAJlFfXyhBVEFfUjA/KF9cSChSP18mMSw7X1FANCcvXD0nUjNfMlRdMQorTV9UVS80T10wNCUvXzQ1JTRfVTE0NV9cNyRRT18mMTQ9X1JcTSwvXUk6NjtfNTU5N19VJTM0P10xNCRfXworTSchPD1fUiw8Ki9cOCUxT182JUE1X1VBODU/XTs2JS9fNSUhMl9RTDcoL1w7JkInXzYlOThfVU06NF9dOworTTY1M18pMihBX1IkPSk/XDwmMV9fN1VVQF9UPSUxX1xNKlJXXyhCIEJfUkBHKU9dMjRUV18+N1lYX1kmMQorTUNPXU86RlNfNVU9Ol9VKTQ1X10xNFU7XzQlKTdfVFkvNU9dKTQlO18yJF01X1QxKDQvXSUxRSdfMURBMAorTV9UPSk0L10mMiRfXzEkOS1fVCUjMk9dJDFEV18wNC0qX1QhIjI/XSAwREdfMDQtKl9UMSYzP10hMFRLXworTS9EJSZfVCklMk9dITEkR18xJD0sX1QlIzJPXSEwVEtfLzNdJl9UISIyP10gMEQ/Xy9EISVfU10hMU9cXgorTTAkN18uM00gX1NUXzEvXFwvRC9fLkNRIV9TVFsvT1xXLTM/XyxDIFJfUyBOLC9cTSoyT18pQihEX1E4MgorTSUvXDckUTdfJTEgNF9RKC0kP1w3JEE7XyUxIDRfUTgxJT9fX14/Q18oMSw0X1JEOyhfXDslIVNfJlE4PAorTV9RPDIlT1w8JVFHXyhBSD1fUVg3JV9cPSUxQ18lUSg0X1FENCYvXDYlITtfJVE0N19RLDAlT1w3JFFTXworTSZBLD9fUVQ3Jl9cQSZBS18lMSw1X1FQOSYvXFotUztfLyNIXV9UNSQyT10pMjRTXzNUXTJfUVQ5KD9cQworTSciO18oQVBEX1RFJjMvXScxJEtfMSQpJV9TRFcuT10kMEQ3XzNEUS9fVSUvNE9cOSRBU18mUTA+X1JERQorTSs/XTQ1RU9fNTU9PF9VNTc3L108N0YvXzclWUNfUTQxJj9cOiVBW18oQiRIX1VFODdPXTU2JVdfNiVRPgorTV9VRTs3T1w4JTFPXyghUERfUTw2Jy9dMTRVJ183JUk1X1U9NjNfXTM0NS9fJkE4P19RWDooT10oMURDXworTS8zWFhfVEUqMS9cSSlSS18oQVhGX1IwQyo/XTo2VVNfNlVFNl9VWTg1T14hPydTX0A3WV1fVVk/OC9dMAorTTUlO181JT08X1UtNTZPXTI1JU9fM0UhN19UTS01L10mMiRfXzBUNSxfVDEpM19dKDI1I18yJD0uX1Q5JworTTNPXSozVTdfMjRJMV9UQSczT10jMTRTXzI0TTJfVEEpNC9dJjFUW18wVDErX1QpJDMvXSAwREtfMFQ1LAorTV9UOSkzT10lMiRXXzEkPSxfVCEjMi9dJDFUU18wNC0oX1QtIjIvXF8vRDNfMFQpKF9UJSMyL1xZLyQnXworTS5UISVfVCBfMT9cXjAkN18uQ1EhX1NIXDA/XFovJCdfLlNMXl9TXF0wL1w1JFE7XykyLEZfUTw1Ji9cVAorPixDN18lUTQ4X1I8RSovXDQkQTdfJEEgM19RMDIlP1wzJDEzXyUxLDYKKyAKK2VuZApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RyZ2IudXVlIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RyZ2IudXVlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODhlYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdHJnYi51dWUKQEAgLTAsMCArMSw5NzEgQEAKK2JlZ2luIDY0NCB0ZXN0LnJnYgorTSA9SCEgMCAjICdUIDowICMgICAgICAgICAvXCAgICAgM0ZFRT03PUUoJS1QOjY1Rzk2UVM9JylBODcwIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorTSAgICAgICAgICAgICAgICAgICAgICAgICAgTzggICAtNkAgICNNVCAgISFAICAgMVcwICAkVUggICEzNgorTSAgIDY1QCAgJV1EICAhRTkgICA6VyAgICclXCAgIVc/ICAgPzhAICAoLjQgICIpSCAgIENaQCAgKTZMIAorTSAiO0ogICBIOyAgICo+XCAgIk1SICAgTF0wICArR0AgICJfWiAgIFE/MCAgLFAgICAjMiMgICBWIUAgIAorTS1YRCAgI0QrICAgWkNAICAvISAgICNWMyAgIF8lQCAgMClEICAkKDwgICEjR1AgIDEyKCAgJDpFICAhKAorTSogICAyOkwgICRMTiAgISxMMCAgM0MsICAkXlYgICExLjAgIDRLUCAgJTBfICAhNVBAICA1VDQgICVDKAorTSAgIToyUCAgNlxYICAlVTEgICE+VSAgIDglPCAgJic6ICAhQzcwICA5LiAgICY5QyAgIUdZQCAgOjZEIAorTSAmS0wgICFMO1AgIDs/KCAgJl1VICAhUF4gICA8R0wgICcvXiAgIVVAMCAgPVAwICAnQicgICFaIkAgIAorTT5YVCAgJ1QwICAhXkRQICBAITggICgmOSAgIiMnICAgQSlEICAoODwgICInR1AgIEIyKCAgKEpDICAiLAorTSkgICBDOjwgIChcSiAgIjBLMCAgREMgICApLlMgICI1LUAgIEVLNCAgKUBVICAiOUxQICBGUyggIClSUworTSAgIj4tICAgR1ssICAqJE4gICJCSVAgIEkiQCAgKjZFICAiRylAICBKKiggICBROCAgIC1WUCAgI1VYIAorTSAhIz8gICAyNyAgICRdQCAgITU2ICAgNlVQICAmJUQgICFHOiAgIDs3MCAgJy4gICAhWUAgICA/WFAgIAorTSg2OCAgIitIICAgRDpQICApPkggICI9SiAgIEhbMCAgKkcgICAiT1MgICBNPUAgICtPQCAgIyFbICAgUQorTV9AICAsWCQgICM0JCAgIFZBUCAgLiBEICAjRiwgICBbI1AgIC8pJCAgI1g0ICAgX0VQICAwMUggICQqPQorTSAgISQoICAgMTosICAkPEYgICEoSjAgIDJCUCAgJE5PICAhLSwwICAzSzAgICUgVyAgITFOQCAgNFNUIAorTSAlMyAgICE2MFAgIDVcOCAgJUUpICAhOlMgICA3JFwgICVXMiAgIT81MCAgOC1AICAmKTsgICFDV0AgIAorTTk2JCAgJjtEICAhSDlQICA6PkggICZNTSAgIUxcICAgO0csICAmX1YgICFRPjAgIDxPUCAgJzFfICAhVgorTSBAICA9WDQgICdEKCAgIVpCUCAgPyBYICAnVjEgICFfJSAgIEApPCAgKCg6ICAiI0ZQICBBMUggICg6PQorTSAgIigoICAgQjosICAoTEQgICIsSTAgIENCQCAgKF5LICAiMStAICBESyQgICkwVCAgIjVNUCAgRVM4IAorTSApQlYgICI6LSAgIEZbLCAgKVRUICAiPkxQICBIIzAgIComTCAgIkMqICAgSSo8ICAqOEYgICJHSSAgIAorTUoyJCAgIFM5ICAgLjcgICAjXVwgICElPiAgIDJWUCAgJSU8ICAhNzYgICA3NiAgICYtRCAgIUk7ICAgOworTVdAICAnNVwgICFbQSAgIEA5ICAgKD48ICAiLUkgICBEWyAgIClGRCAgIj9LICAgSTtAICAqTyQgICJRVAorTSAgIE1dUCAgK1dEICAjI1wgICBSP1AgIC0gKCAgIzYlICAgVyIgICAuKEggICNILSAgIFtEICAgLzEoIAorTSAjWjUgICEgJiAgIDA5TCAgJCw+ICAhJEgwICAxQjAgICQ+RyAgISkqQCAgMkpUICAkUFAgICEtTEAgIAorTTNTNCAgJSJYICAhMi5QICA0W1ggICU1ISAgITZRICAgNiQ8ICAlRyogICE7MzAgIDctICAgJVkzICAhPworTVVAICA4NUQgICYrPCAgIUQ3UCAgOT4oICAmPUUgICFIWiAgIDpGTCAgJk9OICAhTTwwICA7TzAgICchVworTSAgIVFeQCAgPFdUICAnNCAgICFWQFAgID4gOCAgJ0YpICAhWyMgICA/KFwgICdYMiAgIV9FMCAgQDFAIAorTSAoKjsgICIkJkAgIEE5TCAgKDw+ICAiKEgwICBCQjAgIChOQyAgIi0pQCAgQ0pEICApIEwgICIxS1AgIAorTURTKCAgKTJVICAiNi4gICBFWzwgIClEVyAgIjpNMCAgRyMwICApVlUgICI/LSAgIEgrNCAgKihLICAiQworTUowICBJMjggICo6RyAgIkgoUCAgSjooICAgIiAgICAgQDAgICAoJCAgICFfICAgID9QICAgJ1ggICAiIAorTSAgICBAMCAgICggICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiICAgICBAMCAgICdcIAorTSAgIiAgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCAgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgIAorTSAoICAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIAorTUAwICAgKCQgICAiISAgICBAICAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiIQorTSAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkIAorTSAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgIAorTSAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICA/UCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIAorTUAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiIQorTSAgICA/UCAgICgkICAgIV4gICAgQDAgICAnXCAgICIhICAgID9AICAgJ1wgICAiISAgICBAMCAgICgkIAorTSAgIV8gICAgP1AgICAnXCAgICIgICAgIEAwICAgKCAgICAiISAgICBAMCAgICdcICAgIiEgICAgQDAgIAorTSAoJCAgICIhICAgIEAwICAgJ1wgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIAorTUAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiIQorTSAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkIAorTSAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgIAorTSAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIAorTUAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgID9QICAgKCQgICAiIQorTSAgICBAMCAgICgkICAgIV8gICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkIAorTSAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAhXyAgICBAMCAgICdcICAgIiEgICAgP1AgIAorTSAoJCAgICIhICAgIEAwICAgKCQgICAhXyAgICA/UCAgICdcICAgIiAgICAgQDAgICAoICAgICIhICAgIAorTUAwICAgKCAgICAiISAgICBAMCAgICgkICAgIiEgICAgP1AgICAoJCAgICIhICAgIEAwICAgKCQgICAiIQorTSAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAICAgICgkIAorTSAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgIAorTSAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIAorTUAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiIQorTSAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkIAorTSAgIiEgICAgP1AgICAoJCAgICIhICAgIEAwICAgJ1wgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgIAorTSAoJCAgICIhICAgID8wICAgJ1ggICAhXCAgICA/MCAgICdcICAgIV8gICAgP1AgICAnRCAgICFcICAgIAorTT9QICAgJ1wgICAhXyAgICA/UCAgICgnSl4hMEMnIVA2JjFUNyYhMDglQTw2JyFcOyZBNDgtQ1UqMyUoQQorTSlCMSwyRDRaMTRdMichWE02VVE8OFYsOSdCQT43NVk+JlIwPDQ1NS80UVxCMiNBJCpCOEk3JTk2PydVQAorTTVFUTo2VT00M1RRLzQkWS41NSUuMyUpMDNETSwyRFEuMzRRKDMkQSgxJEEoMDAtJSBUJisvRCA2KUFAVQorTSYiQDUkUTQhJSAkNiAuV1kkUUw0JUEoNyZBPDUkQTA0JTEgMyRRPDokUURXLkQxKTNRRDwnJDkkMEM9IgorTTMkXDIlIjU2NVU9PjdBJDYoNUE4NyVMNSchOTM2RTkxJUFJJi9ESEcnQi07NjVBXD9FXTQ1VTU0NCRVKAorTTE0RSkxVD0vMkQ9JTJURScxJDEiMTRFKDFULScwVCheMEQsXDAjXSAgU1IrLlNUMyhRNFIlMjQyJCEoIQorTSQwJDMgLldfKDJEOyZRPDwoQVg9JVFENiVRLDcmQVRBJTFQWi8kNSkzUVRDKERFJzEjRSQzRSQ5JlJFNAorTTU1NTw3ITQ6KEVFNTYlRDgoIT0xNyU9MyZBWSgvNERJKEIxOjZVWiFANVkwNSUtMjNETSYwVDEoMiQ5KgorTTI0QSMyNEEmMFQpIDBUOSUxJCEkMDQsXzBUJFkuVCBeIFNKKy5TXDUpMTxUJVI8NCRBMCEkUCQ1IC9PVQorTS9CTEEmITQ0JUFENyUhPDMlMUw/J0JUPyZROD8nQVUiMkFYQychODonMVxBKFI8OyciMTE0RS00NVFMPQorTSwmOTc0NFw9KiFNNTU1LTIoIiU4NFUwQSkxXUAxUlRCKURVWENGUTo1VTk3NUU5NTQlJTA0JF0tMkRVKgorTTI0RSozNEkmMkRFLDJESSYyND0lMUQ1IDEkLSEvQzxSLCJMRCUhNDQkMTghJSAkNSArO04tIVA5JSEkMAorTSRBNDMkISw0JFE0NyUiPD0lUSw8JlFIXzFRODomITA4JlFMPSdSLDMlIV0vM1UhMTUhLDUrNkU2NFUgNworTSchNCM2LCkwJVFJNjZFREInMUU9MTJMQClVLV5ENkk3NSUtMjNVIS8yJDkoMjRBJjBUOSMwRCkjMUQtIQorTTE0MScwVCxfMEQpIDA0IFsvU1hcLlM0UCtCREIkQSwwIzEoISQgJDEgL09ZL0I4PyYxODUlUUg4JTFANworTSVRSD0mUlBBJyE0PicxUSEyMUg+JzFAPCdSIEIpIkA5JiFVKzM1ITE1ITw5K1ZFNTQ1JDwoUUE4NiVNNAorTSZRTTg2VUxFKDFRPzFSVEIqJSlZRDZdNzRFJTAzREUoMSQ1JjFUOSQwNDEhMCQhITEkJF4wRCUkMDQkXQorTTAkIF4vU1hZLzNQWi8zPFIsIlRGJUE8NSRBPCElMCQ2IC9PWitETEImMTQ0JVE0NSUhPDkmIFFUMkE8MworTSUhLDYlQTA0I0FUQichODEkQTg1JiFMOCZSJD4oMyRfMyFMPSlEWTEzJFw8KUFVNjREWTYoIV02NSUoRQorTSgyIUE4Rjg8KVVFLTNVMTA9VVU3NiU5NzZFOTg0VSEwM0RdMDM0PSkxJFEoMjUpJjIkQScyVDUlMUQ0XQorTS0zIEoqUkBKKFIsRygiUDgkUTwhJEAkNyAuL1UpM1g8JTEkMCRRJDEkISwxJEBBUjEhNDglMSAzJFEkMQorTSJRNDkmITAvJCEoMSUhPDAkUUw7J1JcXTJBLDUoVSUzNEUoOCchPTk1NS00JVFBNzZFREMmUUk7NyYgNgorTSklQTA0NTkyPzYtOTVVJS80JEkwMyRFKTFUQSkxRCEiLzQ1IzEkVCMwOTUgMSQhIDA0IFosQlRHKjI4SAorTSgyJEUnQkg0I1EsISNAJDMgL09fK1Q8QSZBODUmITg2JTFANyVQVVYyMUQ6JiEoNSUxLDMjMUQ9JzFAMworTSUhPDYmMVA0JVFYPSgzJF8zITw5KTUlMTNVKD0oUUk5NTU5OCZRRTg2NUBFJyFNPDc2JDcpJT0wNVVZNgorTT5GITc1RFErMkQ9LjJEPScxNDknMSNZIC5ULSAwNEheL1NcXjBDWF4vU1haLEJURypSQEooUjRJKEJYOQorTSUhQCEkUCQ4ICg3USdBUDolUDQ0QyEsNiUxODImMVw3JDEoMiRQLDRYQTQ6KDFIOicxRDYlITAzJVFMPworTScxTD8oUVQ6JyIlKDMkSSgmQiQ+NFU9NDVRVEA5NV1DMFFYQjo2TUwoIkk1NkVAQyhVQTg6OTYiNTVNOgorTTY1PTQ0RTEwMlRVLTMkSSoxREEoMjQ1JjFEPSQwVDBfLFJISyoiQEkpUjBFKUI8RykhPDYgMTwhJFAiJQorTVwxPDQlQSwlJChQLyRBLDIjQSw1JFEoMCNRICMkOFQyJEFANiYhTDckQSAwI1BcMyBRRzIoIjA+JEEwPgorTTJUXTIzUUA3JiU5OjY1NDQmNV0+OENQNyc2KUI4MTxDNCU1MidSMTs3RkozQCU5ODU1KTAzNE0tMjQxJgorTTFENSMwVCUjMFQwXi9TXSAvU1hfLkMgSCoyOEYpUjRCKFIwRSkyIDMkQCQzIDBcIEE/SEAmUUw4ITE2IQorTSUgLDdCISw4JyFANSUhJDIgUS9CJSE4PCZRUD8mUTw1JTEwMyVRWD8nMixHKDE4OCgkTS0zRFg8J0FNNgorTTZFUTkmIUlANzYkXSVBTUE4RiQ3KERZMzVSPEU2VVVLRTgxOTYlLTAzRE0pMlQ9IjEkMSMwNCReMCQhIQorTS8jVF0vQ1RcLzNAUipCTEgqIkRHKSI8SCoyREUmITwhJiAkNCAoN1IoIUQ1JVA0NFwxLDYlMTQ0JlNEOworTSUhNDIkUSgwJCEsQidRNDMkMSgxJEEkMiVRTDolMThIL1NEOicyUTAzVSEtKFI0QjZWJTg5MVhBOFZJUAorTTQhVEE6Jl1NJzIxSTomQEMoU1haJ1JNMDVHIUA2VVFBNiU9NjQ1JS4zNFEuMkQxJTI0NScxNDRfL1MkTgorTStCSEopUkRFKiI0RCkyIEMpMihWIDIsISUwIiVcQUwyJFEsJSQvJC8kQSwzJCEkSiRRIC8jUSAvIzBUMAorTSchPDEkMFwwIzBYLSNBIDMkQSQ0KiQkWiRBMEY0NSUzNFIwPCclVUI2Viw1JiVJQzo0NDYnJV1EOEEoOworTThGIT8mUVkgLiFQRTU1TVI4NUE5NyUtMTNERSoxVDklMVQ0XzAkMSAwI1heLkNESyoiUEgqIjRHKFI4QworTShCLD4oMiQ+LEAkPyAxJCBBP0xGJlE8OCExNiElICw3WzE0OC0hSDUlISQyJDBcLSQhXDslQTQzJSEoMworTSRBLDElUUA5JjJVJS8xODgqNSktNDUoRyghVTs4VVVHJjFJOjhGQSUlMUk/OSYoMiZWJT44MVw8L0NIPgorTSolSUA9RjE2NVVJMTMkSSUyJDUlMFQ1Ii8jVSEvM1hcLyNAWisiRE4qQkhHKjI0SCkyOEcoQjRGKFM8IQorTSkgJDYgKVtTJVJQSSZRLDQkUTA0JFE4OCYhPDkkUTQ0JSEsMyRBKDMkQTg/JUEsIyRLTDEkQSQzJ0FQPworTSQ0MSooMUg8LEU1NTdGLFMoIV1JOiY9SSdSIUY6JkE7KDFZSjpGMEAoVSBQKkIkPi9SWEQqQ0EgKSIpPworTT85MUg2VVU3NFAtLkJUUSgyREEnMFQkVyxCVEwgUk4lKiJESCpCPCMpQDREQDIoISlAJDAgKVtQJSJERworTSVQXDAjUSAwI1EoLyRBLDEjISQwJDEgMCNQXDAjUSw7JFEgIyNbTC4jUFgyJVEwPSNUOTAoQSQzKyUxMAorTTY1VE0mIUFDODYlQiVBMT84NiU2JkE9RDklWDcmRFRTKVFIODAiTDwpI1ReJ0FdRUBZNUU2NUEwMkAtJworTUVEOSMxNC0iMCNYVCtSSEkqIkBJKUI8RilSMEMoUjAlKEgkQCAyMCEjQCI+XyFYUSshUDQlMTA1JTEwNworTSRRPDgmISw3JTEkMiRBJDEkIFQ1KCE0MiBRJzQkISQwJDFAOCgxJSo1MiwzJTJVMzM1OT4sIVA3N0YpQgorTThRQDc3RiFANSFMODk2NT8mMVEtLDI8OyY0JE0oIj0gMEIkPzkoKjY5VTU1M0RJKDFENSEvRCBeLzNYXgorTS0iXEwqUkhKKlJASSoiREYpMjRGITIyIShAJEYgMSggRU9EOyZRPDglQUw4JTE0NCVRNDskUUhFKFJYQQorTSUhMCMkWDQyJiZQNiRQLDJRMSQyJDFRMy4hTFMxJCUrJlFQWS5EKTg2MzBDJ1ZRTjxHND0pJjFJOjYgPworTSgmOUg5UVA6NiVZOSchWF4qIVhFODYgQClEPD4qJVlQRzcxPjclPS4yVCEhLVMkTCtALExAMkwjKjhESAorTSpSSEopUjxIKiI8JCk4JEggMighKlAiNl1BQDklMTAyJVEwMSQxIDMkMUw0JSIgQCshXDEkMCwwQTBYNAorTTohKDAgUF8pI0BcLiY0TFIoI00wNCU8NSUjOFswNS0yKzFMODlGPUw7QTA4NlY5SDZBODk4VklGJTEtNworTTg1ODUmI1xFJUFdQzchQEAxMVBGNyc2QTxFQTUzRDkjLlNQUisiREoqIkBJKiAsRkIyNEgpUjxEKSI0RgorTSkwMENAMjghKCAkSSApW18oIVg5JjE8PCYxODYlMUA3KCE8NydBWEgmUSQxJCEgMiRRSVAlUSgjJDxEMAorTSQxIDkzUzxDLzU9OjdBSDguI1BeNDUkTCdRPUE6JlVPJUFNPTlGPTsmIUlDOiY0NiUlOT81QTg5MCI8OgorTShGPUEnIiUnJ0JBPj5KRVc2VTEuMSNUWC4yXEkqUlxNKzJMSCBSOikpMkBHKVIwRCkyQEchIjYhKiAkQgorTSAyVCBdPyxGJlFNWyUxRDglUTw+KTQuJUEiKUw2RSBaLCJUSSdRQDcmISQzJSEoMiQxKDIkMTEgJlFMWQorTTBUPTQpMy0iLzRJJjBDREMnVVk5NSVUPzEjQTs1RURDJ1VVOzghVD83VV1BJ0FRIy1RUEA5Rlg+KEcoQAorTSklPEQqJFU2PlgpIi0iPEQoITxFKjJQUy1TUF4vVCBfLzNQVywyVEwqQCxIQFI8RylAJEggMTwgXT8gRAorTSYxRVckMTQ0JFEsOig0NitCMV1HNiRYVysySEYnITQ0JSBUMCQwXC8jQFwvI0BYWCVSLSU0RUVAKDJVIAorTTAlISwwQzQ7JiVBMjNFODYuIl05NyU4NyYlUUM4QTw5ODYpPiVROSQtITA6OUZANSZWUDooNTRAKSRVNgorTT5YISAsQjA+JkEkQilCRFAtI0RbLyNMWi4jPFQrQkhJKiAsRkBSNEUpICRGIDE0IF0/QEknMU1cJUFIOQorTSYhQD8pRE4wQlFdQjRESFcqUkBEJkE0NCYxLDIkUSQxJCEkMSQhJF4nMj0qN0ZRVSozKSQwRTUxMVNIPworTSVVLTMzVTw4LlMtOzZVQDomNU0/OCFAOjdWIT4mIT0lLUFAPTpWVDknJlw9KFU8RislKTtAKDUkLSIwPworTSZRKEIqIkxSLEM8WS5DRFgtQzRSKyJARypALEhAUjxHKUAkSCAxRCBeLzxEJjFCMydBPDclQTQ2JiNCJworTUQ8Nl5NOz5dOTZNQS1SREYpIjRCJ0FENyQxKDIkMiRdKSRNNjAlNTkoQkRVLURdKTEzMD4nVDEiKDIkNgorTSpSPD00VTBEKEVVNjYxUD44Jl1HJ0IkXyshVEEvUiA+JzM4Pic2QEsqNF0kJ0FRJTgoPTkyQUkxM0QxKAorTTFESS0yJEUnMEQxIDAkKFQrMlBJKjAsSCAxVCElICJAXSIoNyVZIDokUSwyJEEsNC8pJjhRK0ZTTStFQworTTpGIFYqMjhDKSIgOyVBMCMjSUAtJzNERjVWJS85JjA+KFMsWzZFPSwtQTg4L1NQOyZQVCMoSDE8NDFAOQorTSBVUlMmMUFCPDYwNyZUJEklMURdJkE0NiwhQDo6MVw9MlQ4QigkSUVBNTknJSRRKS9ULSExNEEjMSQgWworTS8zTF0vUyRMKkI8RyBSOCEmUCQyIC9DXClRRDZEQVw4JiE8NCUxRSRFWUchTSpeVlA2NUc3MyxEKDIgQworTShBVDglQSAzJFEoQi9SUT46VVVcP0JUSC1TWUU4NTxcJkE8XC8xWDwjUjhNKTVJMyZRRTk1VUg5JjVZTworTTkhQDwvUkQ5JzNcPSYxPFEmUVFKKEIhMDMiSEgzVkIpNiRENTI0OFwwI1kiMTQhIS9TSFwuM0xdK1JMTAorTSoyRCMqICQ9IDE4IF0/IForMko7JVE8OCZBND4mMUYvQ01LNVRcSyA1VClfN0UgXywiTFUsUkxGJiEoMAorTSVBRFwyJTVDNURZLTNVXFAvNSksMTQwRyZVKDwlMVA+JzIkSjMkTEcoNlVMOUIgRjMjVFMnUUxdJEFUPworTSc0UDsmVFA7KUY4UShWQUApRDxCKTRAXTFRWUk1NSUuNCRVJjFVKFotMyhQLCJcTipALEtAUlBKKlAkPAorTSAxPCBQTyhaKlI+OCRRLDQmISw9JUFONUUtRzNULEJfNUQqITdVLSIsUlhbLUJUQyYxLCwkIUUjNFYtUgorTTk1UTszRTxLMEVNOTQkOD8mJTQ9JTE4NyYyWFg0VDQ7JjAtR0whSDsxI0hMJUE1ISNRJDYmNDw1JURYOAorTSgmMEgmVjk6KCQwPyhESF8xITVEM1RNKDJUQSEwRFBUK1JQSipCREgpUCxKQFJERyogJDkgMTQgXT84XworTSsyPjomIUA5JyE0OiYhXjpGPTsvVCxXKzhEPV84RS0iLFJYWC0iTEMnITgxJTIhJTVGViA8VllPNzVMSAorTTE2PUY2VEhDJkU0PiZBRDgnVEEqNEQ4QCVVWUI6IVQ7MENATSYhOFwjMTA4JDQ0OCUkUDooVjhMJ1ZBPQorTShUOEEpJSElMUE1QjQkUSkyNDhfMCRUVSwiVEsqUkhJKVAsSUBSTEkqQCQ7IDFEIF5fKFwoOFkwJVFANgorTSdRQEElQVYrRTxXKlE8Ml9EUSQ7JjEsNCYxJEArU1RfK1JMPyQxTFstRDE+LVI4VTJRXEgxVT0rNDU1MQorTTJGLDMlIVQ5J1JQRjYmUEEpRV1HQVE8PEBXWUYnUUUnJEFYPiklTDYpVUw4K0Y8WShWPUQlRUA/KSY4QQorTSdVND43V1U4M1RVMjI0PSkxNDElMCQ1JDAkKSEwRCRfLUAkQyAxQCBeXzReJ1hJLSUhNDMmUTBAJiFeMQorTUZcXytSPEsnREBcOiVRLDQmMSRGLTQtJSxCWEAjUU0iMDUpSzEjLSIyUURFMzYpODdFUS0yVkAxJEE8MworTSdDVFg3Vkg3J1VNRUIhJDNAKCVDJUEtLCRRNDcoJTgwKEVIMilWMFAmVjU+JCU0PCg2LDslREg8N1dVOAorTTMkSS8xRCkkMCNdIC5UIF8vM1xeL1NYXCxQJEAgMTggXl8sXCg4XS8lQTw1KFFEPSVBTjBITTc2VT0vLQorTUdBMDkmUUA5J0E4RSxEISIsQlhBJDIhJDElUVo0VCkzNkFYQzRGVUU6VjUyM0ZINSVBSDYqRUEtOiZYPgorTSglLUFCMTA3QEddQyYhMS4lQUQ4JiUwMyglRDMqJjBUJ1Y9QSRVPD4oVjQ8JUQ8QDkoKT0zREkvMUQhIgorTS9DVF4uM1hdLzNcXi9TWFwsUCRAIDFIIF0/PEcmIVBQJlFENykhTDkoMiItRCxHKVFcMl1GITg8JVFIOAorTSZBNDMnUUhBJiNURCUxQSAyJSU8L0JUXDRRODg5JSUzMkVNKzglJDAlIUA8LDJQPT83XEQrJkogQlFIPAorTT02QUEoIVBbMVFUPClEIDwmVFA3KTU8XShWJTslRUQ/KCQgPSVRRDgkIkEoNEcxPDYlKS8zREknMFQgWworTS0wLFNAUyBQLFAkUCAyICBdP0hIJUFETSYhODQnMTg4KUFeLkYsWytSXEslRVEoOSRRQDYmISwyJ0FURworTSgkLEclUUknNFVdRjIjQSc0USg6OyVNQDZGOTA5VUAuJCEoOi1DWFBBR1w9KUZBX0JBMDY9VyVEJjE5IAorTTIxNDcoQ0w2JUREMCclKFEmVV01JCU4PCczSDckMSw0IyIxJDQnKTo1RFUqMjQ1Ii9DTFYsIDRNQDMgIQorTSswJD4gLzNcKlFAOysxQDYlIVg0JTJEPkNZWzNUXTczUlosOCYxQDwmQVA3JDFUOykhUSApMTQ+MjU5SQorTT4lQSU0Rig6JicpRTs2SVM1NkU6JFE0NSdUNTsySTomKSJFQj8oRDcmV01POEFINzE0XDslMUhZJjExJworTSNRUTAtQV1BNiEtOCdBXFsmITA2JjEoSjJFKVQ3JUErMVQ5Ii9TTFgsUDBOQFJMSytAJEsgMiAgXl80SgorTScnXjUmQiFHPEFISCQiSitDLDswUyxaXEcxWD4mITw1JiEoMygxSD4pU0xMKyJEVjFVISYtQl0oMzEoMworTThVQUE3Jkk2NSY4OSVBLDkuMlRFPTg0Szk1OTQzQFBEL1RURShRVSAzQVA8LSVUPiZURDsqJExUKERZMgorTSVVRD8lUSA4JTFIPCVRXEEnMiRANFcxOzRVIS0yNEEpMiRFKDIkMSMwICRcIDE0IF5fMEcmN1o0JVFVRQorTTshNEclIkIrRSxXMVMtIyBGQTw4JEE4NCVRJC0mUURAKzQkUCwiTFw0NVkwMCNJMzRBIDA6NilOOlc9PAorTTcmUDYkISA5MDQsVz84PEQ3VTEzMzA4QTA1OEgnMT0mNCE4NiwlQDglRDg2JzQ4SyckUSwkNTg8JSBQNgorTSRRSDYjUTw5JkFYPTQnJTk0NFkoMSQtJDA0KSEwM10hL0AkWiAxLCBeX1xPJjdOMyVRVUk7MShGJyJSMAorTUYsWzRUPTsqSUFYOyUxNDMlQSAuJyFAPiojUEsqUl0hNVZBQjQkNT03UTQwO0ZRWz44MUM4JyQ+JTEoQAorTTUmJTREKFxLOCUhMDMgPEMxNShGJ0FBLTYhTDcqJTg7JSQwNCc0ME0nVFkvJSVAPiVBJDomIiQ7JFFMPQorTSciID80Rl01MzRJIy9TWF8wJC0iMENUXS5AJFYgMTQgXl80VSo2SjAnMlI0PlFMPycxXjBDTDcvU1w7JworTUUhPDslMTw4JkEsMyZRUDwpQ1BPKiJURC80RUouIyRbNUE0TS81QUM5VyE+NVZAVCdRTEInQlA+SkVcTworTTo2VUE3I10jLSU0NiQiJFRCIixGLlY0OSgkUEMoIjxCJzRFKyVVMEIkUTQ3JFFIPCYhREEnMTw+J0I0RQorTTFXNUI1NSUqMiQ1IzBDOFYuMCRUIDFIIF5fKE8oVkoyJjJCNT9RPDkmUVowRTxLL1NcSyxFITQ5JFE0NgorTSYhJDEmMUg6KyNYTysjMEoxNS1TMDNNJThRREsxJjVQPEdNSDhHIFImMURIKiQoT0tWJE05VlE/NkNVIQorTSxFLDMjMVhZQiFMQC1GIDMmVEw9JiIwPyZEOSgkNFg8IzEkMyNRODYkQSw7JVEkOCYiLEMxNy0/NCRRJQorTTBUIF4vMyxTLUAkUSAxPCBeX0hUKSZeNidCVkBCUVQ6JzFWNUdMXzZWLTM4RzFIPSUxPDgmQSwzJlFQPAorTSlTREopQzRPMlVNXzM0NS08IiRPM1cpXT84OVA5NyhWJyFMTS5GKShPRkRROFYlOTUjPFsrJFwxIzIgXAorTUMyJEMsNVg2JjRIQCciOEEnJEEqJSUkPyQhODglIUw5JTE4PiZBMDsmUjRFMVc1PzNESSMwM1hcLlMkUQorTS0gJE8gMUQgXl8tKCwhSUUoUjQ9JjE4PyZCWihDTDcrU0xbJUVSJDslQTw5JkEsMiZBUDopQ0hPKVJYQworTS0jRF0kQVA5KSNBLTY1JTs4JkFHNiYgUCgyKEImIUg1UFhIODcmPTw4Nk0/L1RcNiRBPE8xUig7L0YtPAorTS1VKDUpIUA3JyE8QSYiPDcoMUQ5JTEsOiYxTDgmMTw5JyFARCYyPFc0VjUqM1RFJjBUPSQwICUjIDNQIAorTV5fISIqQUlHJ1IoQCdBLDklUlIoRTxLK1NNKypFUVw5JSE0NyYhJDAmIUg4KyNQTypTJEYuM1xfJEFQOQorTSpDUS03VUlGOzc9UThWTFMnQiBEJ0JMQVFIUDo3VlFAOTZdQzBUXDMjUTBUMVFINS41WTYsRSQvJyE0NAorTSYxMD4kQiQxJlE0NSQwXDQkUTQyJFEkMyVBIDwkMVxWNTY9LDMkOSMwJDEhLzAlICAzRCBeX0EnKlFdTworTSkiIEAoMTQ6J1JaLUdMXzJVXVM2SCIwPSVBPDkmQSwyJkFQOilTPEopMlxILyQxJyZSLD4sVDEyOiY5UQorTT5INVk5RlBVKCIoSCs0OFhVKTA+NzYlOjdWRT0vNEgxI1E4VzMiIDgtJVE5LCUgMighPDYmUThAJTIwNAorTSdBSDolQTA3JUFANSVBMDYmMTBAJTIsVTRWNSoyRDEhL0QoXy5QJF4gM0QgS084SClIRU0qMUZVTDFMPQorTSVRNi1DTCMvVSxbIUVRUDUlMTg5JyEsMyZBTDsoU0BTKiJcRDAjTTUzNCBRK0I0JCY8RD87JVE6ODNQPAorTSYyXDspUVZcPTFETC5EUEs4V1wzTiIgOScyJlg4QVhcL1IoTzBBSEslIFRTJVEsQiZRODQlUUA1JSE0PQorTSVBNDwlIVQ2JkFMOSZCIE0rRS0rMjRBJzEkLSYgNDwhMTAjW1xSKEBCNlxFJUs+VSVRPDUkWFY1UTxfNAorTVRMOjcmQSwzJSE8OiQxJDgmMURJLkMsTC0yRSYwVUUxMTM4TChBODYlUUxFPUVNPDlDVDolUyg8LFI2XQorTT4xREouRExKOEdYMk0xVDYmQjpYNkFAVy5BUEowMTBDJDBIUCUhIDwlMSAuJFEwMSQgXDckIFw2I0E8MAorTSRBLDEkQVRKKlUhKjIkPSYwNCEjIDQwITBAI1teUjxBQ0c0SiYrVl0nIUA5JTkqPlJNOz1XLSpAJ1E8NQorTSVBRDwkUSw6JlFMRC0yWEYtIlErMjYtOTJDRFApIUA4JlFcTEAmPUI6NCA+JjMwRzJDRypAUiBMLFRASQorTTg3VDFMUUw2JyJGXTghTFIuIVxIMCE8RyRQUFIlQSg/JiEsMSYhRDYlMSg6JFEoOSQxSDMlQTw1JUFcTAorTSs1KSkxNDEjL1NZISA0KCEwICNbXlI0PSZTMD8oMVw0J0FINTBILi1PPF80UzwmNyYxMDQkITQ9JFE8OQorTSwhSEYtM0BGLCFRRzUnJTw3JiFDNzVNMzMlITM3NiRfJkJQOSUyKDwnUTk0PDIgSisiLEknJlRFSDFQPQorTSdBRyA7Mjg/J0E0PSsxWEQlITxWI0E8VC8hWD8lQUQ1JSFEOiVRRDQlIUQ4JjFQOiYxNDcvIlhMPSUpLgorTTJERSggNEQhMlAjW14hXDYnIzg7JzFcNyZBNDQwODo1UExfNFQ8NjclUSgyI0EsOyQxNDcrQUBKLVNASgorTS4iMUw3JzVDOiZJSjlGOTwzRFk4OSVYWiZCSDUkUiw6KTFFMjxRVEQqQiBGJUY8P0dBRDomUVshOVIgOgorTSYwXDcrIUw8JDEwUyJRME4tITg3JEE0MSQhLDQkMSwuI0EsMiRRRDclUFQvLSJAST1FMS0yJDklIDQ4IQorTTIgI1tfUig1J1NQQChSWEcoQSwxMChCO1FdOz1WXSY+JyE4NCQhND0kUTw5LCFIRSxDLEQvIkFPOEddTAorTTs3IVU8Ry1KNEUpPTs2SSUnUlg7JVIwPy0iPTc+UjRFKUIgSCY2QEBHITw6JzIvJDoiLDclUSg4KlFUQAorTSRROFUjMThRLiFIOyVRSDYlMTg3JSE4MSQxODUlQUw5JjEkMy4iTEc8RSkqMSQxIyBEOCBYPyxJKjQgWQorTSxRSi5EIkQ+JyI2J0MrVyxSPFshRlIsNCVBMDclQTQ1JiIsOylDUFIpU0BNOCZJMzNFVSwvRCEvOkY5TworTTxWXT5FNF0kJzFISDRTKU5NMjRAMCRNMzJUWlcoKyw+KFFQPExVPDwlMSwxJVIgNiVBNDQkQTAzLlM8QgorTSdRNCMmKDQwKDFAMSZQLDVDMUQ4JVE0PCVVKDs8JiVaNEUoIzJQJSggLidSKTIoXi5SXDRCWShFJjFIRgorTUNJNyJTTEsvUElURCRBKDElMTAzJFE4QSYyQF4tIkRbKFQ5Ly5DSS8vIlBSMSYpRzlXRVo5KT0tMVFMOAorTSk0SE04SkBFKCNdLTVEUS1NIU5PJyIoOidbNTMlMFwwI0EwPSRRLDIkMFwxJCMsTiYxOC8gUTYlIzFYNQorTSNBQCUkSFQ0JSE0LjNRUU85KCEzNCRFKCA0QCExMCNBX1JIQDBELFUlWS46KkE8PCo4XjVRLTs1VkxWQQorTSlRODckUTw2JTE0OChRTEQuMlxELlFMVjBTNFAvMlBHKlNJPjomWiBBJy4/M1REPyciLF4lRF4uJyI0XAorTTIlOS0zKyg4TSFYPydCJlk2ITgyJEEgNidRNDUlISwxJFEoVyxBVDokQCw3QTBcQCVRIDogUTIvJFEsNAorTSRRMDA0MV1OOUg1NDMkNSggNEghMVAjSlsjMEsxMkxUJzUxOSlCKEYsSD4vTzxfK1NLRkQyUSw1JSE8NgorTSUxNDYnQUhELlMsRi1SRFItUylKPUdWIUdIUixEKFU+QEYoUDA0NUU5SDlRUS4iUkEnTSEoIl0mPkwoQworTU9BUD4nISpGQUE0NCUxNDElMTA0JEEsNiUhNEElUTQ0JEFMOiYxLD4lMUw1JTAwOEMxSD4mMUBSJklSIworTTVVVT43JEAhM1AlMyApO1AtIkknKzMgNzQ1TEInMjBTQ0lDIlQ8Uy9OSjksIFEnMSUxMDMkUTA8JiI4XQorTS0yQFknUTwzJFNQWTJVIUw2RU1IOUUyLTpTKSAyJllOQFVWT1FaKiQ+U1xDLFRBWlAhXlsmQVQ6JipGIAorTSNRJDIkQFgyJDEkLyQhLDEkQUwvIzBQLyYhPDYkIUwyJiBcLyBRKi4kUTQ5JEEoUCc5UiQ3JVU8NkQ4IQorTTMwJTAgL09fLlJFLS0zODo2NixHJlI4VkNZQyRWPT86UTpJLyUxODMlUTg1JTE4PiZCKFgsIixVJVBMLAorTSIiTD4qMjxeKyMpJTNEUjc9U0BfMiZJSj0zTV1IJ0FVQSQsOys0LVVOITZdJyFIPiU7PjslISQ0JSEgNAorTSRRLDEkQTQzJSFYMyQxIDEmQUQ4JEFUNCZBKDIlMTQzJDEsNyQxLFInWiYvOiY5QDdESCE0MCUyIC0vVAorTSoyND0pJEhGKDIgPCdRUVI+WF5VU00rLU46MSMlITg4JkE8OCVRPDsnMiRULUIgUSdSKD8qJTU1Nyc+LQorTUBGXVk7WEYhNVNcUipVSVo7OS5WVltGSysjOTg/NkhNSUZDIyRRMDwmSkVcJTE8NSUwLDRJMSwzJSEsNAorTSZUSDYkMSwzKDIsRCYkNDUkMUA2J0JMVC41IUQmUVRAMDpKSDpGNiI5VjQhNVAlIiAtL1QpUiA+KUQ4QAorTSdCKDgmQUlTQElCWlQtLy5OSjkkJEEoNSYhNDYlMTQ5JlIsVi4iKFYoQVAzJDM8US1FMUo2RDU1MiguMAorTTgkJFErVi1fOUdSPlA6NkYrIzU6QCZMTEkmLyAkMSw6KDpdXCQxMDIkQCwxSTEgMCQxIDEmJDwzI0EgMAorTSdCIEElNCgyI0EgLiVCLE4sVEE6I0EkOC86Qko7VjYiOVY0ITVQJF4gLS9fKyFYQStEUEMpQkg9JiFRVgorTUBZQlxWLVs5UTpJJyVBPDcmQTw4JVE8OycxXFEsUVRYKSFcNiUjID8oIlxbKzFYTCtHUj47JDROKkVeIQorTTc1RU9HWC5BLFMxNT9GUElIJVsiJFEgPihbQislUTg0JSAsM0kxKDIkUSgzJkRENSQhKDIoIihDJVQwNAorTSQhMDImQjxRLiRZQSQxMDwwSlZSPlZSKzwmUCE3ICUjIC0vWiszTFooJTRBRFpIXSUxSDo9WE5VU1xfKworTU1KPEAmITA0JjE8OCVRPDsnUiRULlFcWilBWDwrIi0yRVtSQEBWNVE5J0VWNkQ1JixIQVYpRyciVjxGWQorTS0jWUdRWEg6RDZCRyVDMEFANUQ6JjFAPiVALDNJMSgyJFEsLiclNS0lMSwwJDFMOCRARDMmNEkmMTFAUAorTS5ILTE7Jk1bO1oiNTBFNys0NCwhJTAkOiAtL1kpQlxUKEUkO0Q6UFkkIUA7P0kuWlQ9IyxNWkRBJUEgMQorTSVRNDYlMTQ5JzIsVy8yJFgoMVQ2JkIpOENbJjg+JT1FMVdOJDk0PSUtSF1XJjVKUFE7PlktM1lJUjhIOAorTUNGLkQkUyxCQUVcPSVRMDskUCwwSTBcLyQhICsmNF0nJEEgLSNBQDUjUDgwJTQoXS5AXEktN1knNzVJTgorTTopWjcxVS8qNFQsISUwJDYgLS9fKVJIVSolPD5FSzBeI0FIPkApNlxVXU83UEpURCZBNDMmMTw4JVE8OworTSdRXE8uIVBUJ1FIMSVRPSM+OTlcN0QtKCxHRjY8JE0iLDhZWickJiFGOFJKLiNFRFM4XDxDRiZGJFMgRQorTURGMDsmUUQ9JTAsMkkxJDEkQSgtJlUhKCUhKC8kIUg3JDBAMiZEOF8uQSRSMChFODo2MVc7Wi49MkU3NgorTTZUSCEmQCQ8IC9PUzFGSDUoNkQ6JTFQNCchQio8SF5GUzxTJ0haODUmMUQ0JiEoNSYhPDYtUihULVFMUAorTSohUEIuUiU2Rzo6PTtVXUw8R01TNkQ8RihIVVExNC5aWV4zIjFSRUJRSTA7T0UmXidGMDImUiQ2JTFEQworTSdBLDIkUTw0JDEkLidUTD8kUTAzJjI0OCYhPDYlUVQ2JEBYMiVRLUc8REU3L1glMS9DMyMsNFghJyAkOgorTSAvT1gvNUAyKSYwNCUhVDAlQToqPik+S1QtIytKKkQ2JVE0MSUwXDIkQTA0LiIsWC4xVFQoQVw6JlFZOQorTUYqLjk7NilPMEdVVTk0REUpOTFMK0JORVJcUyAxUj1EUikwOU5UUlcmViw0JzIkNCNROEAmUSAvJCEwMQorTSNQXCsmM0wyI1EsMCVCKDUlQTQ0JTE8LyMgPC4mQU1JOEJYXS1IKTEuUl8iLFRUISYgJDQgL09fMDUsNAorTSkmXDckUkA2JVFKLz9ZVk1UTUM3SzpMOSZRSDMlUSQ0JTE4Ni4yMEktMURPKTFUNCVRUTtCWEYlOTVBNworTSk3Qis7VFxEKFlVPSdRIV1GWiZcNCJFQFNJRDtOVEpYJjYgOCgyODklIUBCJzEoMSRBODMkMSQtJyMsMgorTSUxKDAmIjA3JiE8OCZBUC0hUEAzJyFdXj80QTMwSFU2LjJXLitEUCEnMCQ3IC9PUS5CMEUqJzw9Qyo5TgorTSYhQDI6SFZRTktGPUU5PEEnQUw0JlEwOCZBQEAlUVRVLjFIUilBXFUyUiRZQ0paOEE2RU88N1FdOEQgSworTShITEc8SkJPTElOWjYiUDZSKUw+TFRGUyc3QDgpIkw3JEE8OyYhLDYlISQyJDEkMCdDUEUmQjAzJkJUPgorTSVRNSspQTg0JCIoPCgiQDY7Mko1PzNQPS9DIyMsVEQhJ1AkOyAtP1QtITxBKlcoN0JaPUokQTgyPCk2VgorTU87WkFGSUhCJyE8MSYhJDUlITQ+JiFYWS5RUFYoQjhJKUFMW0I6UjZBRlVUMDdZXzs0KEopOSBDN1hWMworTUQ3VlA1Mkg4UklMPEwkMlAmRzQyKEJENCNBMDglMSAzJDBYIyNaJC0mIjg2JiIgMCVSSDslMS0pKSEoMgorTSQxXDYnQkQzNkEqID1DUD4wIyskLTRAISZQJDggKU9fLjE8Rio3VDpCSylQJFFINz1ZTlhPPCZJRylQRQorTSghUDMmQSwjJVtEQCYxXEotUUBOKVI8RCchMF9BKT4hPiY1PSknRjU9VEBJKFlcOS1FTUU3NSJKN1JQNAorTVQqID5MJCpSJkcsNSdCNDQkUTg6JVEoNSRRICMkOiQvJlFcNCcyNDImMlA9JVE1LSoxSDYkQiQxJiJQPworTTkhTixANDRBLyMjLywkPCEoICQ6IC07UihSPDwvRlgzKVJERSYxRTY2SSo+QDk+KzxXNDMlQTgyJVE0OAorTSYhPEMmMUhSLkFIWCgyOFw0Iiw8NlY+KUImJUs+V0ohOCZYTCtYLUAsTCMtTVwiXDhSMFBRWUhMSjMmSworTSVWSFExMkQ5JSEwNyRRMDsmIDAySDEkPzAxXCspMUw6KTIkPShGQEMnUiw9LCNJJScyPUojSVxLJyE4XworTTE7NSosICQ4IDFEIF5fLEAoMVEhOjBURipCJDMlVTlARkouJUc5IVk+ITA0JEBcNCRBNDIlIiQ6JlM4XAorTScjTEIsIlBHJlFZOzlYSi46RyErPygtSzwiTFJDRihHSismNkhLLUIoQyspRkJKRisqVDg4UjBZKEEsMQorTSQxMDAkMUA1I1BcMCQgWDkoUFQrKFE0NyhBWDsoJjhBI1FAOCkyOF0oQl1LIzooUCchQSMyS0UsK1AkNAorTSAxOCBeX1xIKSIkXz0hIEUtMjw0JlVNR0gqNiBHKSlWPiE8OCVRJDYlITw1JUIsOyciPFgmIlxFLUI4PgorTSUyKTQ1JzFbOCVETj1ZRVU9QkhQQ1ZILDw4LUI+Oy1OKSJbL0dSUkYqSyQ7OEI8XCgxMDEkUTgyJFFINworTSQxJDIkQSA8JyBIMCohQDkpIiA9KEZIRiRRQDUmQVhZKVM1TCMqMFUoMTheMyw1JytAJDkgMUAgXl5YQgorTSUxSDpEMkxKKVI8OChHRTBEWFVORCc9TjsxIDgmITw5JjFIOiVSIDUmMyBXJiQgPCQ1WTwpQUxTRzhNVQorTTc3IVo/SCktP0IkT0BIVUJKPCNIRFtVVygzXydIMyRSK1U4OTIhNEIoQVA0JiE0MiVSIDckQSgzJEEsOAorTTBTIDIlMlhKLFJcUSlBUF8vRjxMMzc0PSU0SFklOVxMJlE1JjIpWDsmQCRJIDMgIEVOVD8kMUw9Q0I0SQorTSoyNDIoJ0U2RkkpVUVHVVU8USQjJStcNiVBPDclIVg2JkMsWSZDWD8lVFhNJlFYVEZYRVc5JzUvPyg9OgorTUBCIFFDSTU4RSpDLT8rPVYoI1spSDJcTyo1QDowQEA2JkE4MyUxKC8lIVQ0I1BcIyQqIDIoUTgvJDI0RAorTSsyUE8pIUhdKTUkPixVOCwmNVBeJFlURCUxPSwzWig9JjAkRiAyWCBWL0RHJUFYPUZCQEgsMkg1KEdZOworTUhZMU5EN0lOPEEwOSYxODgmIUQ5JUIgNyZSPFQlQ0BBJ0Q4RCZCIEZBRy1BNlVYTj4pUUdCQVxPQVpFMAorTTknRjs2W1IiJ1NPL0ojJE8qRVA9MFBEPSghRDAlMTAxJUFcNiQxJCMkSiA1JzEkMSVSREcsIlhRKUFZIgorTShESDQoVEgrKDYlIyYqKEomQTUpNCpQOSYgJEggMyAgXl9ERyVRWVRGITRPTFlEOSdBKSFFR1lGQFZJRQorTTkxPD0mUUA7J0FQOCZBSDgmMlxbJjNQPSdTIUwpIVhUSVoxWTNWXVxCVyk2QzIsPUFJKldPLUNCMiguMworTSg1IyJKM0hcM1QsPkAhSDwnUTg3JjFEPTAiKDwoQSQ2JFEoOS81OFYoNj0nK1IlXjNBQEYpIyUgQFogVgorTSVCOD0lSjROKFExPSYiUDclQCRLIDFAIF5fSEMkMVVXRVEsTU05PDMmUSkpRzgtT0M3MU87MTQ3JiE4OQorTSchSDYmIUA2JiJcWyYzIEYlQkRWJSFcTUkpVVQ0Rkk1PjghQERCKDtCSVZKSEwzLS5YLjgnREsgSUNAWworTTNELD0/QUQ5JyEsNCVBODovMVw5J1BYLiNQXDAoQkg8JiRQXilRSiEzUThCJEIsVTs4JEQlQlQ/JUo8SAorTSZRKUMmUyQ4JFAkTSAxOCBeX1xLJEFRWUlBNElOWVA4JzE9JUooNUVBNlFHOjE8OiZBQDsnQVA4JkFIOAorTSVSQFIlIzRCKCFUQSVCKEFCSCk9MUUkTT0pJVNHQiQ/REo+OT1JQkkqSEI9J0RPJUtDSFgyU1g6QEFAOQorTSchLDQlQTg6LzFcOSdQWDQlISQyJiIoNiYlMSAqUU4jNEFIRyMxUFI5Vzg/JzNAQyc6VEsnUTFCJlMsOworTSUwJEkgMUAgXl88XykhPEJJQUw+JDEsPScoVSFEJ0E+OTVdQDghQDwlUTg6JzE4NSRBRDcmMlRdJjNQPgorTSYxRUEpUVw9MkoxXDVGQVc/NlVOR0IoP0E5Nk86PjM8KVddWykmIl1OUyRfLzU8SENRMDcnMSw7JiIkQQorTTFCVEMrMTQ2JFBcOi8lMSozR0onJTFYLDMhPD8yJTk8Skc4NyRCJDolKiQ3JVBdPUYjSD0nICRIIDFAIAorTV5fQFsnQThFSTFEOyRRJDcmOFUpRVdVRTs2PUg6ITg2JSEwOCZRMDMkITw1JiJUXSYzIEgkIShJJVIkOgorTTJaJVg1RkU4PEghV0ghXD1CSiZCM1xfKic4NiAoRU5bTjMlIC81QEdDISQ0JkEgOCUxWD4wUkhAKkEoLgorTSNQUDEoMjRHLTUxXiQhKC0zMTQ7MEUxPEhGXDQkQjQ6JSosMSNQVUNGU1Q7JjAkTiAxOCBeX10jJ1E0RQorTUwxTDkmMTg8JlkpJUhHXTw5RiFBOSFAOSVBODonMTg1JEFENyVSOFQlIyxBJkBEOyZSPDgtKDVEMzUoUworTTw5PiVKIiQ/QzpCMSk7LlUkWEojJ0VGX08yUFQtJFBERSFENiZBIDglMVg+MFJIQCpBKDQlIFgzJTFIPAorTSxGKiAjMTQwNCFEQDBVOUNJRlg2JjMkPyZaRDQkUF1CRlNUPSZQJE0gMUggRj89KCpCIFBNQURHSjs8PAorTSRBRDtDV0RYLlJcVzZBQDclMSwjJT1cMyUhRDkmIkBaJVNAQShCVUUxQyheLEoyST02LVlEJ1ohSkFQPgorTUIoUUZCLjZDN0gmNCtTSlBQNkVHPlhGMUhRNDYnMSw6JDFEQCgyKDwnISg1JEEkOy1FISotV1IlJkI8OworTTQyOE8pMUxKPVM1OSUhKDQkSFQ4JiE9OEZTLD8nMCUjIDgsIEY/QSQpIVxUTUE8REpbNDYjUURDRUdYXAorTS9TLFs4ITgxJEEkIyRYKDEkQCw3VkJAWiVSVEsmMjRNLTNBIS4qNkU9NjU5PygiIUlBODxDSUE5OzxeLgorTTUoMjorMzZOT1ZFSD5YRi9IISwzJkEgNyNBOD0nQVw5JjBcLSNAWDInQixFJjRdWSYhSDk0QjBLKFFARQorTTwjOTYjQSAyJEhcMiQhNT5HQyg8JlAlKiA4MCBGP10sKTFYT09RRERMW0g7JDFYP0g4IFQuMlRVNzFANAorTSUhLCMlPVwzJSFEOSVCJFEkQlRDKFFcPy1DPF8sWUY5O0RcUz0oQiZLIUw+QzlVKDFaXVQxKDI5KVMiUAorTVBWMTw9KDIxSiFANSZBIDcjQTg9J0FcOSYwXDMkUSA0JTFEOyUmNV4kIUg9NTJAUClSKFI+NCVAJDEwNgorTSY5NDUlIT09R0MkPCcwJSsgODwgR08oXihRSVdNMUg2J1FAOShIOERDN1BUKlFMTzQxQDclMTQ0JFEwNQorTSUgLDlWQjxVKCNcOiYyPU4rUihKKUM5UTNWLiY8V0lXTUIsPkFJMUtAWCE4MEJGPlFYWyVOVVsjMExNPAorTURBREgnITg6JFIkRipRUD4mISw0JEEsQSwkTSEuV0VdLUJNWTBROEwyJDBfQUUyPSZRQDMlWFwuJiE5QAorTTlDPEElICUqIDtEIF5fNFonIUVaTTFAMydRODMnKDhLRSgkVysxXFM2MTgxJEEsMiQxKDMkQTw3JiI8VQorTSgjPD4lMVxWJ1JIUCszOVAzVSUwLlRdSExBVDxDWV1AOyZNIi1CTkFRSEckTyVXIzA8RTlDUTxFJjEsNworTSQhWEMqIUQ7JTEgLiNBIDonIiQ9JyRdUC0yIVoxITBIMENMVD8lLjkkQTQxJVkkKyRBPUY6Mzg8JEAlMgorTSA7SCBeX10gJlFBWE8hSDUpQUg2JzhMSkc4LE8qIURNNFFANCUhNDQkUTA1JSFEOSVSKEwmUzQ2JzFERAorTSYyOE0tQ01NMUMgOyZTQTxOQihAQzopMzJUPEEoMkY/UFgzI09VSl4vTFVBRVFERSYxLDckIVhDKiFEOworTSUxIDMkUSg7JTFINiZWOVMqQV1dMVFATTFUNSNBJiZBJSEsMycpPC0lMUFFOlM0OiUgJTQgO1QgRi8hMworTTFCTD5LMTw5NTU0NSZRVEJCOChMKUIsTjMxSDclICw3IFEzPSVBRDcoUygyLEIgMysmNFMmIjRLJzNSJAorTTkoNitFR1ZSKSFSIUU5LktMRjUqQEozOEYqTlxOLT5UUEZaISsxVD8lMUQvNyU0RigyND4lITAzJEE8XgorTTQ0KFwuRyk+OkhZKyVDIEMsQ0FfMlogOSYxQDZHMTw2JidCMS1CMDcgNCwhTyAiOF1EXFopMiJOJTE1NgorTTYxPDwnIkY0QiJQRilDKTYmMSQxIFEzQCQxKDIlITw1KEMsMi0xJDgoMyBBJ1JIWihEPigwRT0gM0Y+TgorTSdRRjBHKFpESFVBJkFKNzVGKkpfTj0uVlBGWiIrQUg8JEE4LjZVMEUnQig7JDEgLyNRMEYoUVRAJ0Y5PgorTTs5LS0kQkA9KlMlWTJaIDclQSg0R1EsMyY4JjYuIig4IDRUIU8wIjhfVTRVKiIyUSYxSUE4UUw9KkJCNQorTUFSND8nQkkqJiE4MyBRO0AkUTA0JUFENydSPCsrMFw7JVFEPigyUFwpVEoiKFJQPCs0RyAmQi4wR0hSOQorTUVUPFpDSkM9RFpHIU5NQlpSNy4lK1FAOiRBQC02JSRCKCIwPSRRODQkMTA9JyEwPCtGJTk6WTUxJVJQPgorTSxDSV41KkQ8JiEsOUkxQDUmSCY5LyI4OSA1LCFQICI4XCc4QSQ4KkYnIVFIOSE0PSpBRFMvQlRHJlJJJworTScxSDYgUUdAJTE4NSVBRDUoQlg3LCI0Myo2QSgwUiRDLFJMWjhINjFEVz5JJkFRXkUmWlhVMjhcSFozMgorTUBJXyBMTTZaUSdGJScxUDolIUA2JCQkQCoiOEElMTAzJCEoXTQ0IFQuN0lJOVgpLChUISskM0ItNklEPAorTSVRQDlIQyw7KTc5VSwiJDQgNCQhUSAiOF0nODojSDJHJkFBSTlBNDspUiBdMEJURicyWTAnITAzIFE7QAorTSRBMDMlITwzKDJcNyxRODgnQyRTMUIwSywjLF0wJT0mMlVeRSZBPjBIJyJVUlFYW0oqMy9ASVslTS0qXgorTVFHRiYnQUQ3JDE0NSNUID8pMiw+JEEgLyMwXEUoMVg7KCZZSTpIPS4nU0ElIkMmJzZJRDolISg3SSJcOAorTSlHXVotQjg6IDRQIVAwIjhfV1Q5JChCSidBVVQ7QUg9K1E8Vi5COEMmMkUmJlFENSBRQ0AlITg1JUFENQorTSdCLDAqUTA7JSFETzIiME0uQ0RfKSJQPipEMlckUiotSFdDIVRBUFhNOkc5PzlPKk5NUyhTR1opJ1E8NQorTSQxPDQjQ1w+KVI0QCUhODQjUFw8JlEsNitWRUQ6KEUyKSNRJiQzSiw4Wig/JUEsPEpDMDopV11dL1JMPworTSA1OCFSUCNbXDk0NicjLlIlIVg/JiIgQj1SIik/JCEiMCQlJSUhSDYlQTw4JTE4NyVBRDgoMlRHLDIwNAorTSgmTFUvRCBKKEJUVjY4MjBERl5BJkIhXkVVTzlXIzlWUSlbL0RILl9MXT5bTTg1TSshXDslUUQvJFEsRAorTSdRVDolMSwzJDE4SzEzJE04RzVJNTdZKyY1OiQ/V1pXPylUOScyJDlJODRcKzdWNS8xLDUgMjwhTyAjWworTV0pODcmQzJTJEFIOSRBRDo8IjIvP0QlIjBUOS4kUTAzJFEwNSRBMDUlITw2KCJYRy0hNDklMyg/L1QoUAorTScjMFktRT0mMkUqPydBTitHVUs5ViMxWVI5WyxESC8mTi0/IU1YNU4rMVA4JSE4LSQxJEInIUg3JEBcLworTSNBLD8pMTw3MjZFSTYoLS0lNFlePic+UT8pVDcmQUw3SVgkWStIOjoxMUA4IDJUIU4gI05fWiQ6J0M+VgorTSVBXD4lMTw0PVFSKj4zNFkuM00iJEFENSUxODclITg3JUFEOCcyKEArISw8IlFIOTAkIEsnUzhXJ1JEOgorTSpTRlElQjoqSTZDSlojRVlVOjc4QzdTKE8+IypPWElRK0FINiUhQC8kUSxEJ0FQOSUhNDQkISw4J1EkOgorTTYmMUQ1SDUxJkUpXz9YIlZBOjgkJyhGTUFDTE9BSVUpJkFIIS0gJl4gL09aTCIoQidYRC0lKjJHJTFAOAorTShJLUMwNDUlMiQ4NSchMDkmQUA1JjE4PCUxQEEsMkRMKyFEQT0jQEUqQzBZKlMhM0EoWjU9KUA/JVcyNgorTTVdQz0qK05DSD0mKzpMVlVVW1pSQkVQUSdRVDcmMSwzJSI4QScxPDQkUSw0JTFMTigiKE0tM0UzMzRYOAorTTUjJEMrJl0kSTE0NiUhLkc+Q0BNQzk5IyZSLCEoUCZYIC9PWkwyKEAnWEgrJCpCSyVRRDUpKTlCMEQ5KQorTTM0XDQlQSQ2JVE0MiVRMDokUThBLEJETCcxTDUuUVxGKzNMWCxTOFE1RDEtNDlAQiUnTjo1LT88KkwmSQorTUg8Vis6TTJaVjwyV0IlVFInIUA0JUEgMCQyMD4mQTAxI1BcMSRBSD0kMSQ6KzNNNjRFIDQzQkw9KTZFJAorTUkxLDMjMF5HPiM4UEVJUSonQiQhKFAmVSAvT19PIjxEKShULyU7KlcnUVA/KCk5Py0jQFovRCwxJlEsOAorTSYxPDQmMTg8JTFAPClCKEUmMVwuKDFIRypTMFUrUyQ8KlE4Ti4qTDonR1JCOC43SytMIlBKLVImOD02XQorTVdcTlxDNiBTJkE4NCYhKDIkUjg+JkEwMSUhMDMkQTw6IzFARSlTOTQ1NTA5NDJYQitGWS1LQUA1I0EyTAorTT8jQFBFSiUsJ0IsISogJlcgL09NSDIwPUArJDAmMThEJVFJRicpWF4vVCkkMiRQNiYxSDonUTg0JVE0PQorTSZRQEAsIjBOKVIgST00JEAxQlksKiFVLD0nVjQ7WkxAJlcmPS5dTz0nOTcnTU0iOjdMQlBUK0JPSSRUPQorTSkhTDgmQSw2JSJMTighTDgpQz0gMzJEOyw2OTIuVFU7OyZAPTNCKDIrRlkzSSE8OCZBWEsmMUg5RzlRIQorTS80LCExICVTIC9PUUdBWDpAKyQuJUE4RCUxPUInKVRdL1QpJjMlLDUkUTg3JyEsMSUhKDomITQ+K1IoSgorTScxWD0uQjhFNDNNOS0iIE8yQzkrL1pcOCg3MkMvXU88KCk/J048Xjk3LEJSVEtKU0ZUVEAnMTg1JiBUMAorTSQyREsmUTgzKTM4XzMiODgsNkE0L0UpQDxWSDkyQVAqKUY5M0khNDUjUSQ/I1EwOEc5WSgxJEQhMyAlVworTSAvT19KQiQ6QTs4MiYhVEsmMTVIJTlIWitDJFQuREg0JUFQOSdBNDMlQTA8JkE0OihBSEIkUig6KDIwSgorTTQzTTgsMVg4J1BESihMMDQpRzJIMj5LUihJXzZOPU44NUxeWlZMKltJNShCJ0EwNychIDMkUkxLJjEwMQorTSkjNF4yUkA2KyY5MC8lPUw/Vyg+NCIkMCsmUTxLMUg3I1EoQiVBNDdISjkqMURYITRAJV8gL09MSiIkPgorTSgnIDckSi5LJTFAPClKVlxANTUtMlRENyVBLDslMTg0JVE0PCcxTEErQlBLKyIsUT5TWEEsI1UrMUIlKQorTT03VjA6OUBBJlUiMSxNXzoqXF8wPUxaPzJcXkhUKz45SiJcNy8yLDgtUyQ4OyQkRi0qKEM3REUgL0VBKworTTVYQkFMKy5OSVNUQTVXSVtAOyY/SUE8OCgiIFMrQlRCKTFINCwjLCEvICRPIC9PUEkxTDsoJyA1I1ouSworTSRRNDoqOlpcPyUlKzJUXDUkISA4JEEsMSUhKDkmQUA/KzJISSkyNEYwQjBDLUQ1NjNSLEwyUzknLjlQOQorTSg1LjctTV85K00nMD48Vj0yPSJLVFtKPkdSXDouIiw6LkJcNjs0MEctSjBFODRRIzA1TS43KFZFTStCVQorTU0kLDozVylRPVo+P0lBNDUmMTRCJVE8MCUwUCwsM1ghMiAkViAvT19MMVg7KTc0OSQ6SlIlUSw+KDsnIQorTT1URSMwREg3JFEoOiUhNDMlISg5JkFAOygiKEMmQixFKUFcRy00PTYzMiQ1KCBERicrJDUpRS48MC5bTworTSwtRz8+XU4/MT0uTVU7UkNKMzA8LTFYNi4jLDo8JDhILSooQzdUSSEvVUUuODlGV1ItJzFTNTBDNTdBWAorTT9KWkhLUUg3JVEwQyZBSDMmMTAwLSNcITJQJFggL09PS0FAOjwjQDQmMVw0JjFJKC4rRztUTTMoUCkwPQorTSYhODklIUg2JFE0PichQD8rQlRMK1I8Vj1UNEEpIzkoNVFJJDtHSjI6WihMJkRCNistOzssPFsvRS0iQworTTNcRkRTK0JYTyJUTTIpQjEtKixNSVM+NS0nIEIwMykgL0QxKEtaRkhIKTpMSEMsPTIhND0oVCBVRkFAOAorTSVRUDkpMyxSK1JAVCwiVCEqUCUzIC9PU0pRKDc8I0AyJUFcNCVRPSkvK087VD0jKFBZSDskQSw2JDE8MworTSQhKDsmMTQ9KzJMSypCTE4wMkw/KUNVMTdBREQxIy0pLlo4RCgkTjwsLTs6LS0jL0VMXkEzLEZGU0tKXAorTUxSVFAxSU42Llo0T0sjWjouRzhIMjNJKDFEUTBNWypRSjomWEsjPDkwQSw7KDNYV0ZBODUkMSwsJEFEOAorTSYhKDooUyghLEAlNSAvT19NUTQ3PTNUNiYiODsmUTUqLSwvSlguKzlUWVw/JTEsOCRRRDUkISA5JVE0OQorTSgiLEgnMjRMKSI0QykjXTE3MUAuJjA4SCdLTEApNE5BLk43UC1NQz5GTVpFMk0iTFUsIyRPMyhSMilOOAorTS86RFNLVCI8Ljc0RzEzOSQwRDk0UkxLKVBbUzVPVCw+MVE8Pyk0KF9IUUw3JSE8LSUhVDwmUTQ/KUMwIQorTS0gJTAgL09STFIwNyVRXD8lQkBXJyFVJC0rNzpVXScrUUkkPycxVEMoIixFKlJUTixDKFosUyhNLDJETgorTT00TEQqNDEvM1JNIDtXUi87OjxVKDJaNSotVzoqLFcsO1w6SzM9Jk5PSz5YUiJKWjxKPFI+RDU4P0M6OQorTSoqKEQ1U0xeLyUuMklJXklKOjJHKlNQQCo0LSUzNFUmMUE8OCUhQD4nQkhLK1MwXCshTCEoUCYnIC9PVgorTU0hWDQmMVw9JFJEWCZBSSYuK0c8Vl03MFM5PEAmIUxCJzIgQioyTEwsIyBYLEMkTypDIEcvUyRCKiQ9NQorTTUyQEQwUyknL0o8TylDJjsrLVM5KjxXLDxcOksyTS5PT1tCXE9SQlw9KlBYQDRRPkFEJkArWkRLOCQxJworTTE1Xj5LWkpSTEsiUytTSD0qREUrNFUtKDFBNDUkQFgwJTEsMSUxTDomIVAhKSAmIyAvT19QMVwyJzIwQQorTSUzMSMnUUkkLCwvUVleJz1WOVhDJUE8PycyIEIpMjRGKkJQUikyOEonUjRFKSJERClUPTQ0QjgvJiA4RgorTShbQFAqUy5ALS5PTystOzs+XT5QMk1OWlJMNyZSMlMgPkskXUJEWUVDJDJBK0pITDdEISMwNUJFUjw3KgorTVJMPyouU1g/KzRBKjRFKSwyUUQ1JVE4NiVRODUlUUhBJ0FUISkwJiggL09STUI4QS9CLDYmV1otJkIkXworTS07NzxXLSsnU0o0Xy5TRFguI0RaLjNJIC9DUF0tIlhELSJEWj0kUEEpMjknLUNAUDlYIV85WixXKiIiNgorTSo9VzkqTE8vSktOTzJMUkhQLCpdUjJOX1BLTFVEMjpCLFgqNzUqJFU1RCE3MyQiTkxIWj9QXCJfJSFNOgorTSdTVFAvU0xbN0YlLiYhTDAqQlRNLDM9Ky40MCEwUCcoIC9PUk8hXDswMjA0JideLCVRTF8tW0tBV103KgorTVQ6TSEuQ0hZLjNIWy4jRF8vM0xcLFJUTikySFgvMyxAKUJFLS9DPEEuU1EgLzlMWCkyOj0rTVM4KUw/LgorTUtbXlEyXSpMUCw/IFEyQyFRO1RdRiMqTC84Vj42WjxbN1RRQzYkUldOOTpGUiwmXSUhUT0pI1xPL0NIXQorTTgmISskIFw0JVEkMyUhKFUsRDghMTAnKCAvT19TMiA2MFI0NiZIUjooMiBaLTtfUFs+LzpYOyhfK1JYTQorTSsyWE8rMlhULEJYTylCID0oMUxQKTJAPyoyRSouQzg3J1EgPipJXSMpUk4/LF5PTypcX0RPLEZXM01OVAorTVI9OzBTMkMpVFwkWUgyTlQwWFpANzpRIjdURUA1NEcjVSpSX1g9SzMmUV0/KUNMTC5TPFk3RV0rJSEwLworTSYxODclMSxZLFQwITBQJzEgL09XTjJESzIhSDkmQVhCJzFFLC87NzhVWz8xUlotIC9TKFUtIyxSLCJcTworTStDKFctQyxNNjI8RD9EXEYqQjksNVU4RzQ3UiI3WyxIKFFGMyotVzwuTEMsSVsuWDNMTlBMW1clUkJDIgorTVI1JFFNMU1SLCshMkYoRUguVEUhLyU6T1MsIl9ULCw/JUE4QSpBKFMwMUBBNFcqKSYjTTowMyhNLkQ5IAorTSpSSCEqQCcrIC9PU08hUD8yMUw3JVE4OiVROSwvW0s9VztXN1Q6SSAuUyBVLTMwUytSWE4rMyRWLTMoVgorTTExWEEyIzBDKiJVNzhFQDYpQ0kkLjpURicxXjwrXis7LVwzLEsrPlozXSZUTFwvKFFCNyRTJSxYTzI9XQorTS8rUThHSF1NMSU1LTImJlhUXD8qVVwsNiQhMEIrMSxRL1E4QTRXIiUnMTA/JkFEMCVCNFApMjwhKjAnKgorTSAvT19TQVw8MyFQOSYxUEAnIUEnLztfTFwtI0hYKkxZK1JATCoyQEcpIixDKEI4SypCPEwtMSA/KzJIQworTSsiXTg4VVAtIyEkPilbKEsnQjI8LD5bUS48Sz9OPCcgNE1KXE5MUzZTQjcsVkVMWVAyKiAuOz09STlBWQorTTElKSoxNicmW14jRVwtKEAlMUBFK1E4VTBRSEY2JzYrJEFATCchQDMmMjxSKUI8ISogJzggL09QTCQ0UAorTSRRODUlSV5KJiFESi06TyhUODlFNlRMVy9TSFMtMyRNLEJYTitSIEUpUkhINlJcPzw0TD8oQURQMCQ8TgorTTQ2LUoxJUBLKVFQRChdQzwxRkspSzpGXDM8Mk9JK15BUCMiTVMyPjYyVV5MK1k4WExTQkMyUyktMjQqXgorTVNcQlpEU1w2JiFANSshKDspMTg4KiROOS9cUl9WI1BfMFZYXCoySCErUCcoIC9PT00jUEglQTwzJFlWRworTSUhOEotWyMtVDg5RTckXFYuQzhTLUMoTiwyVE0rQVhDKTJAUTAhPD0uUlQ5J0FMVzIkPDkrMz0gKjUwRQorTSghSEIpTVM8MFY7KUxKVl4zTEpTSTw2RU8iVk9UIkI8NSZKVi5aKF9OQ15JNSNZOTU0VydVPF5fRVNcMAorTSRBMDMrMSw5KFEwOSokRjUiWipTSFEkPilGLFspQiwhKyAnKiAvT15RQ1hEJiFANSU6Kk8mMThFLTs3PAorTVgoXUo3NERLK0JYSipCOEIpQihCKFE4OycyIE8pIFBBKCIwOihRXFkyRFA1JyFUSSdVSEgnUVhEKi47TworTTBWTzhPWz8kND0uXUosSlFRIlZXV0MuQTUmSyAtSVUhTlQmTjUjTTY0RFs3XS5LNko0QDMlMUQ3LCE4PQorTSlRQDwrNFo7I1o+VktBMEAqNihaKUIwISsgJzIgL09NOiE8OzVEMDomUTAsJUE8OCpaOytKUzhULjMsXQorTS5TPFItIlxPLSMwSikiMEgsIlhDNzJYODwlKEgnUiw7KEJEQykiUD8qIjxLLCMsTS4sUzNEKUMlTFoiXAorTTY7WigyPCBIUiI+TFFcIVcmW1hVSFosSEkzLiktI0FENkguX09YWDgoIFwsJyFcPScyVFQsUyxIJTFBLworTS5bOTxOQ1xfO0MoVSkzMCE6QCcgIC9PUjxBMDY3NDw4JVE0MSVBMDgrOjswSlMwUi4jOFwtQyxSLTMgUAorTSxDKEgoUihGK0JQTC5RLDUtUyxFJjFcPChSODwmUixAJzIsRSoiUEktPFM2Q1kzJU4qMl42PCoqMiw0SgorTVEiMlBSTCVdKSw4XEsqUE9LI04yL1Q1UTlYTyVQSSQ4JzBULypTNFQsUyBTLEMoSSRROSwmKVFBSEFMQgorTTZTQF0nUkAhOSAnIiAvT19BITg0N0REPCciKD0mUTAzKjpPP0xDIEoqUkhPKkJMSSoyMEQqQkhAJiFIQAorTSoiOEwnIDw9JzI8RydCMD8pIkBDJzIsQyciQEYrIyxOLV03SENJRzRRWlsmN0xSMDFcPFJTIjJYVixaJAorTShMSShLKlBQSlM+MC9UMVE5SSc4V0pERyoxKDEqUyhRK1JYUiwzJEolMUEuJTolRklRUEM2UyxZKCJMIQorTTkwJyggLjNUMUJERSZRSD4oIiQ/JyFIQSYxNEtSRSkhL1NUWS0jJEkpMixDKUIkPyhSOEorMlRJOTJEOAorTTNENEAoUjhGKVJUUy1DRSEuNFlaSltaNDJNVzY9LTcoTjc6WShcITEuW10/TiJGTFJVPE5PNVxUTSMiPQorTTdCXUc2JkU7ODIwOyRBODUmUTgsIFImNCshNEQpIiQ4JFE4RCwmLzk6VjBFMUFYT0lIRCEsQCZaIC9PSgorTTFCJD0nITw4JVFANyVBPD4mQUBIU0UoXS8zUFcsQlxHKFIkQSkhWD0oMjRJKyJQVTIxRDkrIzBCJkIkRQorTSlCVFUtMyxYLUUtXkorUjsxLVc7PS0rKE5XSlgoPCUuLUtVPUwyPlJTRURVUTY4Wk5DPkI5Q0lUOVdNTworTTwiRDsjQSA0JTEoMiwzPFQtIThCKEFcNSQhLEEiQlpDLiRQOTAyIFFHN0QhKlAmXyAvT1Q1UjQ7JzFEOworTSZRUDsmMURAJlFIUlZERFUtMyRPKkI8PyZRRDkoIVA3JjFIPigyJE4tUSQ6KEJMQCdBXEIoUkBQLEMwXAorTS9FQiZNLCZGMV4zUj49SzlUKCskKUwpMC0rXT9PIk5bV0YkVlI2PF9QU0ZOOyNJVDo4IVc9IlhAJFEkMworTSYhQDctU0xULUE8RCkiJDckQSw/IUM+VDE1JDwvQUxNRzdMISpAJyQgL09PKUIwRSlTIEAqMyBWLiRBLgorTTMlJVVTLEBeKlJUVCtSVEooQkw3KiEwQyhSNEkrIlxOPlMsTTA0SFIvQ1VKRytXKVQ8XzJVTFJfKFMiMAorTTU9TzE9PFMnUUFeXDQ3UjRGXDVRTiJCS1M6Olk3IyZBMiJWVSlLLUs6RkVGLFM0MShBVEIqIjRBLCE0PgorTTFBLDMmISw3JUEwPS9DOVNDJVUlRTNRKUZCUCEsICYoIC4nRitCTEsrMzhLLiNVIjIlTTw5VllcU1w4WQorTSoyTFIrMkxIKCJENSkxJEEoMixHKkJUXTtSLEYqMyxBLiNdTEdLWypVXT8zVi07KSkiTjc0XU80PTxHJworTVFCIlozSCY2Rjw9V04iOlFUKkMgOSM+SDNDMlsrS1lXPjdFVi5DRDUpIVBAIFI6Ny0xSEAxUSAwJTEgNAorTSRRJDowQj0+RDYtJUUjUStEMVAhKjAmLyAvT1AwQzxULyQ0WDEkWTU2Nk1WQFguJVg8SFcoUixMKVI0QgorTSZCLC8oUFw7JjFMPyhCNEk6Ijw9KCI0Ni80LVBJTE81WU5XTls+RzkpUkJANi4zTD5NJzhWMi5fM0guOgorTUZcTVZQMkpaWCsjITojUko0UzsgLEwlWj5XXVwvIzAvKCFMQioiPEgtUVREMkEoMiVRKDYlMSQ4LzItPAorTUc2USpEMy0mRDFYISogJjAgLk9COkYlPDU1XTk1VUU7NSUtNzVFWltSUlg6JiFQOCsxNEwnQkw5KkE4QworTSkiPEkqUyRaKjQ9TDk4MzZSPE8xVU07OVUsXz9HTExYLVJGLjldUzU+LDcoUUdfIzxLWVFCK0FGTFFeTQorTVJXNScrSzFUKjpBJTtGXUY6Vjk8J1RJJyYxTE0uNFRYKDIoNiZBUDwnMDA5QyFVOTIlRlEqKUpBKVJKMgorTS0wJE8gMzggWy5eMkNYRiNCWEYrQlhaKkJYRiA+PEsxKzE0NiZBNEokQkQ7KiE4RyRSJEIpMjxJK1NMQgorTStERFk3XEMtVC0zOVY9OzZVLU4vUVNQUShJQUtWPUFYUExDKkE8PVVRRz4qT1ZeVygrJy49VFhWTkdMUAorTUtEUVY+NylaPSY4PTMkTDsmUkRcNFM8QycwWDgmMTg3JFAsNkMhSSQvRVpHKFlOQClCUikpMCRIIDNAIAorTV5fXlxOOlZOTVsyVE1bUldNW1ZJRD1DRCshLDIlQSxIJCI8OSlBMEUkMUw6J1IkQyoyUEAoI0hJNFxbPworTVo/I1VdPytUWl4uLVNUWFIlWVlVWT8hXVJNRz5CTF1XUkdaLlImXl8oW08+P1RcWlA3VFFMVFVYQDc9XgorTT5WUD80JSxBKCJYXDQjMD8mUSg8JlFEOiVBQDglQUEwMTYiWStJWj8oUkIpKVAkRyAzMCBeXi1NOVY1OgorTTZVPTg1VVE2NFRMODg8Ny0pUUhEKEFUTCZCVD8rQUhPJjI0RCojJFotNE5NNkhfP1ZMTzpWLTs4Vl1DNworTUE5PVxUVD01K1hdT1ctKS4vXEcsQSs8QUtXWUxNJSVSJlozKz4pVkkqIlpVRkFWLTcmKTo6IUBCJSM4TQorTTNWPT8xMlhJLEFYO0U5Tj5KOkpSTTteXTZGIk8sKUhQLSc+NCxAJEUgMzQgXl8iPUZJUjRFKSIvRFheLAorTUQnVE84XDcxKVE0PyghSEkmIkw9KlE8SiUiIEIqIyRYLCQuQi82OyxWPTc5Vk1HPFguJzg5NSUsUFQxLAorTSopRVVWPS0vLzxHMUNcJEhOODVST0VZWigqSy4+Oi5RLCM2XEdSMjU5NllGPSFUPyVTVFM0VjVCMlJYSQorTSsxPDlESUI7SUpKUk07Xy44JUZTKzkoTCxHNikoQCQ+IDMsIF5fXyxSTE8jUUwrIVAsIyFPSkUmODxTPQorTSdBID0nIUBHJSI8OSoxNEgkQVQ+KFJQUipTVkEqJVc5XC83UFwvJ05bXldDNzNYTU81IS4nOV1eWT5RMgorTTBNQ0ZGTExKT1hZV1FFWiAoSydAQSpCVSxDOl1JIi45PDc1Sz4yID0mM1hQMzY9QjFCREIqQUA7RkoiQworTUtLLltPLDMkNlVCSypZOFEtRz4pKSAkPSAyVCBBXllBPDQtPTVFTCM1XyUyMTBVMzVcIy8sU0ElKlJMVQorTSsiWD4sQURQJjNEQigiVFItQzsuVV0zMVU9OzlWPS8mV1k1IENIJipTNTxDPkhVXVVMWD9GPCcnNSwkRgorTS83NFU0UzwsIVojIk4kPFszKjRdKUoxSkAnWS8qRCFGN1RUSjBSRFIqQVxAJyIwUkI4XjFCODoiPzdVVworTSomSlstSSQ3JCguIS5AJFIgNTggXl8yO0dINjNEKTYxRDhSMTshTTM4LD8uLDMpICoyQFMqQlA8LCE4SworTSRTLD8nQkxOLCMzKVNdPzlWTUc6Vy0/KVhZRFM1Iy0zUEUgOD4pPiJUXEQ9RVwjJzY8REcwR0xcNkNQMQorTSJKKyNPJFkkNSpJIys7IVhCWEU5KzNNQzk1MFEyQlBUKkFUPSYyJE9DOTI2Q0hSKEBYLV0pRiZSK0hMNAorTSNHXVUqMCRJIDUkIF5fXzRTK1siT1wzIE9bXyFEQlU8OC0rPSpSVF4pMjhNKEIwNishMEklIzBBJiIsRgorTSpTQzRYLkdNXD8nU14vL0FeKixWKTFYS1A1PEc9KV4nVz1YOUY8Wzg5TFxIMTgoXjZUJDMjKksuUSUhIAorTTZLOSorKz4iRTkxQStTQUE4RSxSMyJYUihRRDslUVxNRVomQ0ZZNjFDKFIkKkYmVixIWDYkKDVaKkAkSQorTSA0UCBeXk0yOTUxPThGJT41RkRAJTIgSDMrUzYtMiBCKjIgSy5CXD0rUUhWMFMgRytTJFlSLSs0Vk1LNAorTVVdQzdUOlw8LDZcSUQ4QihTJV1HKVkiJlVMVSFQPE5eLUFYQSlCKDwmUiw7JiZKJkY2WkNOIiBFS0dRXQorTUA1TTYyVEkkK0MsXy5SJFMsMyxDKjJEWTlXLU46NjlANyVBMzU3Nlc/OE4nSjhCJi0wJSEgNyQgXl8mLAorTURJOjNGOUI1RVlFJSZBUD8zXC82LFFEPClRVEkuIlw9K0FEXDIzIEMoUjhTUi07OlddXzxXLU83VSskOQorTSo2QDQ1U00sTzVBNyhJSitUXEUhUExOXS1RVDsoQiA6JkFUOCU2PiNGNyJITyJAUk84Xi5CJVExMDNcXgorTSwzPSMvQihTK1JYQSlSPFg5JyFLOUYxPjZFOTIzRjpJPSg2JElYMVopICRYIDZYIF5fXyVQLF8iUjxDJQorTVJMQUApQihBM1xfRytRPD0oUUxDLCJAOCpRQFsxQkQ5JyIsVlQ+Q01dT0NSXF8/VlssOEUrVjgwKDIwQworTU81XUgnWiowVz1EWlE9WykuQVA+KVIwPCYyIDglVyYrR0cyS1NCWE9RWV47RDVVLi4zNFkqMlxeLyIsTgorTSlSRD0oMVxLOEcpTTomITg1JSExM1Y6Tz4oQiZKOElfKTAkWCA2UCBeXllEPFVNSjkmOUc3Q1xDJ1RBSAorTS48IzUvMiw8LFNMTyxTKDYtNCxQJVIgTzUsRzhWLTcyVF1LMlRdJjE9IzBXP0coT0E4RipSRzxBJihBXQorTVI8TjtQXCclLUFYOylCJEYrUyU2JVg/IE85MF0vNFlcQTYlPTNFNTs2NVEjLEJEXCZSSFowU0BeLiIsTgorTVU9KzhVPUs3Vi0/Q1NHXlk/SC5USzgiKy1QJE4gNlAgXl8yPkgpVj1GOU48Q1NcMCg1IUQwLD8zLkFQNgorTSwzQE0sMyg4LVQwTyUhVEwzTDM4Vz1TPVctVzdWLTY0PDJYTz0mXEAzI1EsT1c8MyRZKiJRTEY9UTwzKgorTSxRPDgoUVhDKzJJMSVIRyBPOUEjMSU+JEJWLToxJDEnMEREXCwiPFomIjxYL1MoWi1SJExUTSs4VT1HNQorTVVNN0NSNy5NPUdWUUpXUV8pQCRFIDZIIF5fXzdTTTstUkxTLU1GID0nVTlKL10vRy4hVDkrMzhHKjJUNAorTS00NE4lIUxKNFxfS10vP1ddT0dQW15KRj4zLE07RlQ+JiIkRE9HUEMkKUonVC1eO1I9MzkuUTQ4KTFYQQorTSoyQS4lOSczVCoxLDBVLipHJkU6LyM8VywzSFMqQiRWJUI8UixSTE4rIURIVk1PQVdOQ0daLj9UVSdCUAorTT5IIlNLOCokKVAkRSA2UCBeXkVOOzY5STolTUktVCQ0JzghXDAsMzwuIjQ9LEFIRyhTJSMrUTROJ1ZTMgorTVctUzhXLUM1VU1HNDVCKD8qQVg6KlFISEBJIihSKFRAJ1ddX1BMNlVQK15fMlJYRyhRTEQtQVQ7JVJSXAorTU0zKVdCIVQyJyRZNTg2LT83RUUmJlFUXSchWFsrMyRULDM0SVNdOzVXPVtBVl1XO05GSlBFOCZbSiZOIworTS0wJFAgMkQgXl8qSEY6OjtGSSIyJ1IoNCZYRiEyXEc7LVFcNywhNEUoUzUpLEFARyVWNy5XTV88WC1TPgorTVddQzc2QkBHKiIwQSwiKD0zJDktUEkwOSZIRiRQTDJVUEwzJDMiUEcoQUhELUFAOSYzKyFOM04kQzIgNAorTSckISUyVD0jMUQoXCYhOFclQURXKjJIUSwjKEVUXU86WE4rRVguK0JONipLQzdOVUk2PVcpICRJIDI8IAorTV5fXz9RLVcnU0wuXzAjJC0nOUYtM007US0iIDorISxBJyMhJCxBSEgmVls9XS9HWF9fQ1hdXydRO0MkTQorTSsiVEotMkA8JzJARk85OEQmKF4nUl1WXFItJzk2MkBCJ1E8PytRLDMlMz8uUDNFW0NSWDwjMlxVLVMoTgorTSwzJFQlQTBaJjE8TycyJEMoUyBLWV8rT11fP1pdPz9dU1ZCSUQ3WlhJVlVaKFAkSCAyRCBeXk1MPyYlQAorTTdGLCAuRDhQLjQ0Tiw8JzUuMlRHLEFAUS8zKEgrIVlETE0vNFYtRzhWTS84VFRYRDIiUTsyMjBGNEMxJgorTUcpRiNVOUw4JkdGIk5cNlQ4XCZYOTJMTS9CUTAwNFBfKEFfLU9RQDwuUkBCMzVBLThGISYnVUEkJjNQTworTTkjWSUqU0xWLlJYTVRdNzlXPis+Vz1TQFU3QlRGRypRSjddRC0gJFggOFQgXl82RUlKMkFFOTAtJiJISQorTS8kSFQtPDM5LlJARCxBSFMvQyhGKjFBRk1dOzdXPVs+V11PPFRUSDstUilCKyIwSS8yPE06JUErUUlYNQorTSVYNiVPXEJPOCw2XTlSQEcuMkkuL1RQXigxVypPITg6LUIwPi9TXSM0JDBTJVQ8WSZDIEw4MzEhKyM0UQorTS1SUEtWLUs9V14nQFg+J0dVNyZPRSZSS0hXVTwpQCRRIDhQIF5fXzlTPUsqUTtUPygjIEovJFxZLz0zTQorTS1CLEQrMThRL1JUQilRVUxRLltRXU8vUV4uW1lYRSg9KyFRSygiREcsUjw4LzMsTVEpWD0mOConUj06XAorTTpNJyw7MjhCLUI5Ki5UPFsoIV82UUFIPiwySDYrQyRZLzMgRiQzSE4nMkxMODJQVygiUEQqUjhNWV5fUgorTV0/Q1ZdT0NfWUcqTUY3JlBKKCk6J1AkUCA4TCBeXk1RPFVZSzpRODclMUROK1I8NSlLSzgvQjxFK1QoTgorTSYiPEA/K1svVS0/NFU9NzhWLE8rNSU1OjsiWiQ1NjBENkRFLUM5RiZTOlRbJidBW04sJlE/O1ZeMEE8QQorTSoxRDonQTRALDM8VzAkIEIrUjxXNUUkTy1WMjtJKEkoSzRFI1NTUSEpI0RSMDIgN1JdQzhWXVc+Vk1DNworTUQ4VlBHVjZLSTcgPS1AJFcgOVwgXl8iS0haLkdBMUwzIjEsUy0iRDcqW1c7L0IkPy1UTFQmMjRAP1wvOAorTVc9Xz1XTVtCWExfJTEkJSUwMiIzLDVUPixTIEw1RUUtT0sgWCUoMV5PLDpOPjtWXTAhNDopUTw4JyEwPworTStTNFEuM0Q7K1IkSi9DWEoqJF41SjdYWkszXSJTMzBdKSMsTS8xWDZULVc7Vy1PPVY9SzlDSDpLRlYmRworTUg2WDIpQCROIDlUIF5fV0FTTVc6SzJAOCQhQFYuMyQ7LCxPTS4xUEAsNDxTJyJER0M9Q05dX09TXi8zUgorTV0+JzgvIlRbKVE+PyglTDcmUiwyKVJQUU9KWSAmOCYgUU02WkA8OykxIFw4KFEsNCYhJD4sM0RWLiM8PAorTSlCKD0rMyRFJ0Q2NktHPFBMQ0UhVDMgVSZSUEAsMUA1V18rVV4/P1ZcLl9PRkgySEgmOkxJRywxKCAkTgorTSA6JCBeXk1NPEVVWixTNSIsUVQ6JjFIPChbVzcuQ0U6LTFEQipINi1NLE8mU1xHLVRcQj1IUzs4NjVRKQorTUBCKV04RFBfNSMxLjs4VVpSODhCJVZZUUlbWlA3VF5OQ1JMRCdTLFgrMjw+Jzk4XTQzSDsoQjBbNCQuQgorTUw2OV5XSj0tTVQsXFFEJSQoM0xAKiJURFNdLzVYPVM2VVxDOTJYUkBJNEJCSCc8VC5AJFcgOkAgXl8iRworTUgpPjAoQTxEKDE8OiYxLDgpPCs8LzM9Oi4hUEUqSFI2Tz0vL1YtJzZVTEZASUNLLjFUWF41QV46LlQ0XworTSwyIFIuJFEgTjhIQCRXSVRKXD5RNlRWSkJCOD8nMyRWKlI4PCZZMFcyUzAzKSFYTjAjTkJIRT1bWClEXworTU4jVF5SI0RfKDM0OihSSEFUXUM5WS4zPVcsUzcwWDY7SFQ6QEdHLEcqICRMIDo0IF5fUz1STDpOLjFYSworTSohUD8oIUg9KjxbUy9TRUEtQVBHK1lCRlReX0VcLldMXE4qUk4kOzYtIzBbLiFeUSk0LFonIThAJVI8TAorTU5YKEQmJz1WTT0+XjglKlBCIiQ8JjJUUilSND4nWURYMUJcNygiJEEsI0ZJSCRVW1lJKFZQU0BZUyM8WgorTSZDIDMnQlBJWV5XS1xPS1ZcPVtJMjdSOEk0SkRIR0RHKFAkTCA6VCBeXkVKOzNANiZRWEUwQUQ3JjE0NQorTSlbPy1GViw1KSFIMCVQVD8nUjA+KDIkOSZBXEA9VC8zPlJIREFCTTI3R1EuMVZRJjMnTVRRVVxZJTZVLQorTTZbUk4ySDInNDM4VSpSWEYlUUw/JzgwVi4zJDcjUVxQLFtPOkNFOV5XRFUrTVRQW1QjSFosMzBTKEtBWworTVI3NE8vXTFYQyZbNDFWVShGUT44STZcUS5AJFggOkggXl8qQ0VVUDsjQSQxK0BUNCRQVC8qK082SEY0OQorTSghMC4lUFQ9JiFQPykiLDwmMVRCPjQ3MTpSODkzQV1CLSctNSwmKFAnU1BaTTYsWCRHOTA3XCpPMig2IworTTMjJFAqMkxDJUFUPSZYMFMtIlwzJEFMRisrPzs/NFFYVkNUXU5UOF9UQyxVK1JUSic7MVhTR1RVMS4mJworTUZHPzAwJjkjRjE2NkhWTEIqICRPIDo4IF5fXzlQJ1Q9JDEwOS0hIDYmITAyKlw3UEpWTEMpMUQzJyEoQgorTSdSLEotI0BOKVIoPT00LzY2QUg2KUFJUic3LTYoRVBJIlIoSE4lVFclJzEyOV0mWjJIQigyQlBNKTJEQQorTSRRTD8nWExTLDJMOCUiIDwoK1dIPyNRUVdTPFZRVCRZViMoUipSTEomW1IkWFkkXjFPKj9LKC8/MDVVIAorTUZRRjpJVyBCKTAkTyA6WCBeXTlTISE0OCUhODUlITw2JUEwOSYqWy02IVBcMTE8NCYkXFMpIzw1JUFAOQorTSchTSE0JC8uNiIkRkMySFgxQlg9LDMgWS42MVdRSFxUJkZcTy9bQkgqMzZPQSdcTygyJEQvMTA0KkdQUAorTSZRMEw5MyhFMSM4SzU0Si9WVEUvTFQgX1FTQF4xUzRSKigyVVImNScpPE1NQiVTJjIkKShGIiIzRTZMUAorTSxAJFcgOlggXl5aOydBNDQkISgxJDEwMyRRKDMlKys1NzFRIDExNDIlRExPKCMsMSRBMDUmMUUkNUM/OworTTBSLDY2QU0gKjFQOicyNEAnIzxdTDhUTyY3KFUxS05FKlNOU0EnWE0nUUxCMFFIMSlXWE0lQSxOOUMkQAorTS9DLEwwVCYwVjMxIE1TSSFSMyRXL0JIRShIKk5UVyUyKy0hWUYmMyIwM0kiRUFaMURWQEUoUCRUIDpAIAorTV5fXycvQVA5JTE8NiRRODUlMTA0JjtbSDpCNSoyQUQ2JkUkVSlDRDYlUUQ6JlE0WjQzK0wtMjwwLSFNMworTScxRDolMUw9JCIsQEs5KE0lRyBUMixOTyo0IltCN1RJJlFYRzIhRDEqODhPJFEgSjlTID0uMzRNMCMmIgorTVczIFZPUzRcUzJcVi9CPEUmOD5VV0g5Mys9Xi5KNkMyL1M5I0YiKjVFVkhFKDAkVCA6VCBeXiAuKEIgPQorTScxQDglUiRQLiQhJzVbMzM+M0g5I1EkNjZGRTsxRUU0JSFUMUE6LlNLKk5EPyFcQ0JSLSgsMkw1KlNITAorTSozVVlPWDhLJUYwPytHXjolUilcQTFQOiVBPDQnVUU3LTdZLz9YNFgoJjlJS0tFTjBUMiVWRSkqTENZIQorTVIzTSowI0xTLDsuUFFGIFszPT1OP0VPKDA0MSNEIVk8LEZYUSxAJFYgOyAgQU5UPychSD4mMCw0XEFYTQorTS0zTSA0O0c7PyM4NyNQXDQ2JjU3MEU1MCQhRC1BWjZYTCoyUThCIDk2UU0zJiFQMiczLDclMU0hSjgoQQorTSRWNEItKDY8JTI+IEExSDclITA1KUVVMyxIITFASEBcJlYtSUsrSVcvRC4oViNUW01DQSNSUzEjLVMgSAorTSs7LktUVlkpNi1RWkNWLyQuQ1BdQ0FROiwmTEYoUCRTIDpIIF5fXEwnUVRBJ0FEOSVCIE8tU0RfNUw7TgorTUJENEklQSw4NyZNPTIlTTUlMVgyQzpWXU4qNyI0QiwzMUFFPiRRSDIlQkg1I0EgQ0hYSEklNjhCLFhaQgorTSVSSihDIVw5JUEwOCw2NTgtKEE1QCg4VyYmLU5MK1VXLlNBXFcjRFFPQyxeU1MpIi1SVEUoW1JWWChBMgorTThPJi9HJkc0LiNAXkQiIT4tJlRGKDAkUyA6XCBeXkA4JlE8NCUhKDcuRCErMURFLTIrRy89QVA5JTE4TQorTTJFRSokQiRQL1FEM0oqRiQ6Jjo4OSFIPDQhVSkqUkA6KCMoRSdDJUtKKU0iJkQgOiZEIjkmIkhdK0EkOQorTSZCSUYyOjZeKSVWM1cnJTEvNTUxNCU5IjIxVV5WVTUjTFRcW1IzKSUyM0RUKTs2VlNFMFswXF1APDVDJgorTTJEOSo/QiQ9KCZIQylAJS8gOyQgXl08OiRAWDIkIFgzLVNVKDBUKSUwS183PTFANyRRMEsyJTUmI0FUTAorTS5RNC9LWyYpOyYuRjFBRDcpQUE4JiFUOCYiUDYlQVBaRVlMXiVDUDgnNEI+JUJNICtQXDUmUlFJNEpKWgorTSglXjdXRy0vLiVJNjM1KS0yQVFeVjQgVE1URF1SUkxeMCJYTCkrOlJVJVUmND0xTEBGIyIwU1kkPyFcOworTSdGPDglUCUsIDpUIF5fQDglQUA0JTEsOC4zXSoxNCEjMV0jTUEiIDwlUUBPMyVNLCUiLFEwIUg0Tkw2QAorTUAmTlgsUUAyKFE1PCZBVDolQiw2JSFAQkUqMSMnJCQ6JlRKQSZCUSAsQSw6J0JBSThLPyIpNj4/WEclKworTS1FXUIzVUEtMlFFVVczUEpPVDBYU1JEXTAiTEYmPCciWFc1MDZeTV9CVjs0MDNJJT9CLD8oRkQ4JTAlLAorTSA7KCBeXzw1JTFANSUhPDgjMzEnNFUpRDM6Xy4/QUw5JTE4OCUgXCwnQUQzJ1EsPSxaOklLS04uPjU4PworTTJCJScpQjg6JzMoQiUiPSE0OyxGJzE0OSVBXS4oMiRFMEIlMzo4QD07SyMrKDUqW1c4MFEoNiVMMDFBLgorTSwjTVNVNSUpTURMXFBSVSMzQzheKFs2VlIjVFYvTSU0NzUvJzM0NFk8Iiw8J0c6LC9AJFggOlwgXl1AMQorTSQwXDIkISwyIjMhJDM0PTkxWzcyP1FEOCRRMDYkQEwoJkE0LyZQXDkvSzJSTUteOzZVID8pQVk2JiFUNworTSUiUDYjMUg6MUtESCYxJDYlMjkzJ1IsSTEiLTE7KEQ/PiszJyc1Ml1WR1hKJlY1Uy8hKTYsM0FRVUNcWworTU5ENF5QUk0gMVJMVihLRlRTRCxeMi0xQTxFTyMyI1RTOzIkOicnLV8rMCRTIDpMIF5fRDYoMVQ0JTFANworTSNDNSY0JDk2Myw7R0MhTDUlMUA6JUEkLighTDQoITA+L1tXIE8sPkoyJSw6KlFROCdBXDklIjQzIyFILAorTTFMIEYnQTg2JEI1NihSJEQvUV0zO0hIPUJcQzYoVUsjWEgkSCgnJV4uQT04LSNJTVYzSFFQRCBZUiI8XgorTTFCQFIlXC8mVVUpIjQuUVA9Ric1MTNEVjtSND4oJzYgKyAkUSA7ICBATkRCIFE/ViVBKDYmIlEpL1UxNgorTS9KTT4vVjE5JUQyQiYiLSdARlVFOTdYPCkpNVg2NUooOTI8PC0iQTsmQkhBKjM4XCgyIE4qOCw9J0JAUQorTSdBUEssRCBMKkc+N0FNSD0zXC86KzNSVVZYPF4pJkFANCYoXDcyJixWVF00SzRRIUgzPSIzRDBVKytCWQorTVIjVFMwLS0oNFQ3JjMoRVc2RTA5J0ZZXTBAJFYgNlQgXl1MOCQhKDUlISA0JkJZJS1UQSktOlE9MFZJOworTSREIj4lIV0jP0ZFQTg3SDgqSV4hOFYiLTRRRDkoMiVBJEFcNidCSFAlISw5KDgwOCYiNE4mUVRMLFQkTQorTSs3Vj5CLTQ8NyxDNSozUldWKDBaJlYxRTVGPSE3UiopVzQhJkxEOSBHQ0kmMiNESipLRlVTNDBbMV0tMgorTTkkSyAxWDFRNEUgOiYmSU0qMCROIDZQIF5eVEIjUSA6JjE0OSgjKSouVE0pLjtFSzJWXT8lVDZDJjI1KQorTUEmXUc5WCA+K1pGLzpXJjIwIiQ5KFIhRiVBXDYnQjxNJSEwNydYPDYmMjxQJzFYTS0kKE4qV0JAQ04gOworTTs9V00sNCZVWEg4Uic2SUg0NkUkOFI2KVhTUFxNVCRdSCMhIDIzOEkoTDMkVjRVITROMTw5VT81MSglVgorTTYlND0nNl1RKiAkTCA2RCBeXiRHJ0JQUS5UNSouU0UhLyMgXi9STydGNkE/JkFcMTtRTF8mNTw0KFY8OworTSYlUiNEV0I4N0IsPiwyKEAtI0BWLCJQUidRUEgqJiBIJ1JYXi5DRDsvJCBEJ1QhP1BeIEoqXCNAKFJeVAorTVYpSTknUkVFMVVQRTglOjBWNSk0TCRRJFMkJSY0I1xSK0s+U1FDVFYxTS0kMzQ3KjY7WUpJQjVGSEciIworTTFAJFggNVwgXl1AQygjJFMvNEkwMDNZJC5CRFMtQk8oR1chRCYhTC06UTxbJTUsMCdWLDcnRi4pRkdOPAorTTQhLDsnQURDKlJUSykyJEclISA3JzVUQihDLSMvU1A+L1QsQig0MURSLUxHLTw7OydSXlVVOT01JiJBTAorTTNWLEs5JUYuVlQtJk00OSNSNCUmMjMwSisrQk9RQ1xZMi0hJzRUOyI1K0VER0IlR0cmUVMrMCRQIDYgIAorTV5eKEgnQyxXMDRdNTFEJSYvIkhSLiMrNUonOUknMiAyPCFVISZVRDYpNkQ9JzY2MEZYVkYvUTQ5KCFERQorTSsyVEspMiBGJSEsOCclTEMpIzkmMENYPi9ULEQnU11HUz5IRy89P1MpUzJYWDk9KyVCPU0yVihKN1UmKgorTVgzXFxORCUgUlNBITJDJEgpLC5eU1QsWzNNQSc0JEczNDs5SUkiOUpINyVXKyAkTiA2JCBeXURWLSNFJworTSsiIEEqUyhZLjM4VjAyTTwyJjFZJlE8PCchRTonIUA8KTIwQCNJIEQmIUkhM0IwNilTPFYrUkBMKVFYOQorTSZBQEApMyxdLkM4Vi4jJD8mUVQ9JkFSJVEtTEwrTCs8KkJSUVc5TUlLQU0rPkVEUC1UUi1UVS0xQDRFKgorTVMjWSoxIzxfLEs2U1NEISM1XD0uNjVLJTRLUUtHQjZCR0ZGITBQJFwgOEAgXl1IWC0zPF8oMUg/KlMgVworTS5DLE0uMkE9M1ZZXyYxLDgmITU2JiEwOCgyIDwjSSREJjFFJzBRLDUlIlBTKSFUQSchODAkMFwzJkJUWgorTS8zTFsvMlw8JiFIOiVRTidSLTxGLFw/NylCUlFWOUFGSSE5Lj81QE0sVD4oVTQxI0FELSlSM0ElLzJQVworTSwrOk9UNC0nNkxJMTc1Vl8zOz1FRUImQ0YmNVEqQCRUIDgwIF5ePF4tQ0RdJ0FMQyxDNFsuUyxNLVJJSgorTTZHOiYnQUA9JzFNPCdBSD4pUjhCJTlYUykiPS4uIUg0JVJEUSkhVEEnITAwJFEsNiVSQFwvU1RdL1MkPgorTSZBUDwlUUIrVC5ESS09M08rQyZWWjlBOEchLS4+VTxLKjNCI1ZUIFlCU1kmUlMlIi9CRFUqLCZeVFQtIQorTTZMUS82JU8wMksxSkciOkZHNklVKjAkUiA4RCBeXVhHNyNNRTEyUEcoQlRRLSMtJjAjTylNVi1IJVVdMAorTSVCIEMzJUFeK0EwVSYxSD8nUShDM1FENChCXEgpMiBFKFJMRCcxUD4oMiUqMjJYQCdBXD4nQjhLLzIkXAorTU0tREgsKydAKUJKTFJKJU9LSiRMKFJZTVBGRjFUVSkySjRQX09TUSUxUyxYK1c+UlFMNydQPCpWUCs3KworTTZaVThDQjI+RkYxXjAwJF0gN0QgXl0gNjFRWSwrUVQ8JkI4SywyXSEuI0MpTzZZTSU1TSwkQVA/MiUxWgorTSpBIFElUUA9JzEgSTEwSDEkIjBBJyE8PCZCKDslISwyJSFFKTJSVD8nMUg3JUFcRS5CJFtOPTRALEs7PQorTShCSkxSWVVLSElERicyOUZNRVYrVTQ5JEtENF5PIzhdL0JMUCs3Rk9STE8tUjxGW1ErSyk1SkEyQUIiPworTUVGIU4qICRVIDcsIF5dQDMuMSUhKiFMPCgyVFAsUzBfLUNLOFMnRVkmRiExJVIoRTNFSiAsIThXJjFQQgorTSdRME4vMTAzJFIkQCchPDwmQig7JUE8NSUhNSgyMkg8JkFAOCZBWEYuIVBaTy48RitMK1UqQl5TViopNworTUZZPEcnQilFTDQ6IlZULFpMVCxbT0MkWzAiPE4pOCZbVy1bPlc+KzBWLSc/NFo1N0JCNkJGVjVQKVAkUworTSA2WCBIPjBLMiMoWCsiIDwlUUhFLFNQVy1SUTs4U1kmJ1E8NSRBOEElUTA5JFE0OSRQLEFDISgyJzIoNworTSdRVEMoUVQ8J1AsRlIiIDkmQUxOLFFYSCpSSFAsIyRLLEIxLTIsNE0qSVdAKTJGU1JKVVJCRjIlN1ZRMQorTUk3OiJTVzEmRUQ5I08jMSI0Q0RTLFdTIUJZOihFWV5BRVo7IzdbQTs+Mjo2QzVJWjEwJF0gNiggSD0wPQorTS5CIEYmUTQ2JTFAQywzUFEsIkE9OjRFKycxLDEjQSg9JFEgNCNRJDUkMCw/VVEgNyQxLC4kUSQ3JkE4NQorTSYhVDsmUTQwJDE0TSwhTEUqIkBOKzJcSitSKSgyS1xGKjorPSgyPlBUOilHQUVRVzRFUSpERkIgVFY8WworTUdDXSFOQlxbMjJYSCtXUlxEWi42SismUkk7Kyc3KyE1PDIqOUJVQUsrICRUIDVUIEg+PEMsIUxBJiE0OworTSYxUEctNCxWLDJZRTwkUS4oQUQ3JSFAQyYxOD8lUTw6JUAsRFVRKDwjIFwyJiE4PCchPDYmMVQ7JlE0MgorTSRROEwrQURDKUIgSisyTEkrUVkjMT0gTyoqW1UqMlJcVEstKjxERU40RTBePiRZWlZWQFBIJCBbT0JQWQorTTJSTEUoWCcnSVtWUFA8Qy1QPEc7NkpZOD0yPjtDVVVLKjAkVCA2QCBeXixBKFIsSyZBPD8oQVA6JiE8RgorTTBSMjxLKCRIJyEqTSY2WEY2MzYzOCggMiRCLEQnISQ0LFUoPiZRVEApIjxIKFI8RigxRDcmIUA5KUIsXworTS9RUFwzWFlLQFQtQ0gtTEkqW1M9KEI6SE87RT0+WSI5Qko6PEdUSidTJUkvNTQoWT0jQSUyJCBXLEsrJQorTUkpIitGOTY6RElfJD1LJT46QjIwQkYqJDIwJFkgOkAgXl1EOCchUEMkQSw9KCFIOCVBPEAvIiI5S0g4SQorTSYgWkklNkhCNTMmLjcnUC4kIiRCJkBYMidDNDEjUSQ0JiFMPCVRWD0mISAwJDEoMyhSIFwvIUhZMlhFRAorTT80IUFIXUhFK0wnOidCMkBQKkUsPTgyJj4pIjBDM1IkVCRVJDdDTFc8UyxeL1M0TCtLKyBLKVY5SkpKTworTUkrIyk9Okk6OEIiM0ImIVUsICRQIDpAIF5eVEInMVRJJiFAPykhWDwmQVhFLzI6Q00oREwnQTJPJlcgSAorTTZTPjk5KCgzJTI4RydQWDYkQkAyJEEwNyZRWD8mQiA/JkEoMSRBLDQoMVhaLkEwVzQpMUtARClDST5ESworTStMV1IpQkZQUCtIUzlGXU42NylPOEJCIlYkWFk3I0hTPEMgXDAzKEspK08tUCs+U1BcMy1QXEdAPSpFPworTTlCNjVDJjVVKzAkUCA6XCBKPjw6KUFcQykySFAlUUw1JFEgPTBSKFopQThAJkFNKyYhNDoqIUg4JCFINgorTSRRSEQnIVA4KkMkQiBSOy8oUjBFLCMkUyZBODYlMUw7KjQsTytTJTkyISw7LkMhJkctQEgpOzs2KjJeSQorTT5LTUJDXElJQSg/JjskXVpURTUjKkU1ICxTJSI0NCBXKVknIklZPjVFOU44RUojITtbOS42UjYrQUYtVQorTTFQJFsgOiwgSj1QMSdRTD0nUjBKJFFEMyQxIDcvIVhSKCE0OyRRPSclISQ2KSE4MyMhODIkMUBCJkFEOgorTSZBVDcgUU8vJkFMPClSTE0lISAzJEEwMikkIEwrIlk2MTBcMyxSUSZITUBGKktXMykyVkRASyU0QitVNworTTxHVl82JC1ZVURAWC0kWF0sQlBbMiM0TChZIl1LWjJDSUpaS0lKVyY8Ky0sNFImLkEmJUYrQCRSIDogIAorTUo+RDspQiBCKSI8TSYhVDclMTw8LzIxIiwyJEYnIVUtJkE8PCpBUD4lIVA3JUFURydRTD4kQTg3IFFPLworTSchVD4qMlhQJVEsMyRBNDQoQ1hKKkJZNDBRPDctIyUrSj5MSis8R0srMypTPytNIERbWSIxVD5UOCJZTgorTVdERE0rJFRbK1I8WTJDKEsmWVMsUFtaXU9cOyVRLDM/PDstMTYyOjBCJjlGKlAkUiA6QCBLXlBWK1IkUQorTSsiQFUoIVA1JiIsRjFCNDkmIUA7I1FANyVRIDgkMUQ3IzBcMCRRREAoIUg2KFJEQilCOEgsQzxFIFFXKQorTSchSDooQlBGJyYkUzNSUEExIVg/KTE9PU1dPEgnWV8uKyJaUzwrRTxETEUtNTg/Kj1VNSQ6JUEkJEJEXQorTSZDISEzU1kgKkoqXEU4Tic/N01bOCcvLTgqWSUyUV1eOVYtTC8wJSQgOTggSj1MTClRTEwpMVxJJkFIMworTSVCJEMwIiwzJTE8NiJRMDMkUFA0IzE0MyIwTCwkMTw+J0FAPCdCLDogUVYjKlMkPyBRPyklQTA3JyI0OgorTSVFWFAzIkhAMEFMNychOT9PPUhGKDo7KyoiUlc9WzUyRDwwXTA4Jyw6JDkiOyRMWSZSMFomQkxcMiM4VQorTSk6KldGWTIzQlhCJTonUzI4Wk0lMTFNXzk1XT0pUCRdIDkgIEc+NFQrMVhKKFIkTidRWDgmQjhFMDI8OAorTSVRODQkIUg5JjEoOiRRTDsgUSc7JUFQQyhRVEMnIkA+JzFUPCsjKEAmIUg6JjE8NycyOD0lVVhQMyJYPQorTS5BRDUnIS1DUS5ISilbK0MsIyMjO0tMX0QsKFcuN0s0OiNQXD0kUE4kMihYJTI4WTIzKFQoKk8mSypKSAorTUdZPjc+WEtHOFpNKjIiIiI6NjE9KFAkXCA5NCBeXjxMMCNcTCdRXScrIlhTNUVQWCxCMD8oQVxCKVFcRAorTSlCOEApMixBJyFcPyUxVEInUVg8KEMoSSlSXEkpUVQ+J0FUQCkiOEMoIjRcNkJMMSZVVVcwIUhFMUI9PgorTUxNJE8pSCpZK1MmWUE8ITlEPDUtMkdbMT9FNFoyVVkqJ1FMWDAkNSI0M1BVKjY+VVFbXyZTTTc3VS1HPgorTTcnJEAuUiEnJlYkUC4gJFogOCggXl0kRi1DLEMlITBcKSJQVDRFRFcsQjQ9KCFUQCkhUEEoUjA+KFIkQQorTSchXD8lMVRCJ1FIPCdSJDcnQkRAJlEkMiRBMDcmUVQ6JVFQUzUiQC4mJiFaL1E8QDAiOTtMTTRHKFhOVworTSpCXyI9PCUoQ0w0Xi5XWzY7VChbNEUkXCcxRFYvQ1xfM0MwSykmQlBSLC8qVE1HOlVdU0I3RlhBLjFVJAorTSYlSD8pUCRYIDggIF5eMEksIzhDJFEsWypSWF82RURUKzI4QikyKEUrIjBJKlJEQyoiOEYoMjBEJkIoRworTSkiKEMoMUAwJ0JQQCdBODclUTg5JzFcOiVRUFM1UkgwJkYhWC8hND4wUUU5UT8oVyhYRystMycuO1xQWworTUQsSFQrV0c7OzMoTTUlKFImMTRSLkNIXTMjIEUoNk5bVFxXNFcuN0hZPktWNyZQRC5RXSYmRUw+KSAkVAorTSA4KCBeXlxVN1NcSC4zIEM2RlpRUCZZODNCPD4mQVA8KDFIQilSSD8oUjhFKEJARitSMEAnIVxeL1hSLQorTSoiID4oMVBBKUIwSShSSFsrVFhFJ1EwMCMhQFskITwwK0MtQzIsLE4pI0E6LFM6VS5cLTRGTEE5NSctSworTUNFLF8vRihaMSNdJTBUPFwwU1BXKjI2QFNdVzpXLic+Vy1XOjsyRFBEMjRCKDVFIC4gJFwgNFwgXl0sTQorTTQzID0qQiQ0NCZOUE42NTAyMjQ+JkFQPCgxSEIpUkg/KFI4RShCQEYrUjBAJyIkXy02PUwlITA1JTEgNQorTSZBPDwlQVRSKiQ8PichJC0iMShYJSFINy0zQT8wPEBHJ1QpOStTMl4qXDEjRVxBKjE3LVA/VCEgMTU0TAorTTBDVSMwNCRZMCMwTSkiPjxUPis/WD47Q1g+Kzg6UjhVREIsQCdVKE8pUCRaIDRUIF5eJEsyIlg6KUFUMAorTTVWRl5RJjUuMUJIRSgyLEMqIiRJK0MkRipCVEopUlRLLSJERSgxXSwvJC00IzE8NyYhLDgnMUg/JjIgVAorTSo0QD8nQSwvIlE9IidBQDYtQiUtL108UicjQUUtM0MqKTxcVkY8VSAuNklTPzMkVDFVOEIvQ0RfLzNQVworTS9DIEcoMjZCWU9PWF5PV1peL0dUOzI4WERSNEIoNSxOKSAkViA0XCBeXkRaOiJQQioyQEgtUi8lVEZRQAorTTIiOD8oQVxBKSI8QSdBSEMpIixIK1FYSCwhREgnUjFZLiU0WypBXEIqQjRJKFFIWCkyOD8nUVRIKkEwQgorTSlSJTJLJkxaKVRSMUJKRFMrSypcMDJGVTZMRTZDLC07NEM1JUUkKFEuJUxTLUMgVSszMFQsI0RaKjI4WAorTU5bOlFLOiI2RUhZXjIzOSg6UUBEOCVYWi4gJFogNEAgXl0kUzchXDsoIVw/K0FbIVIlTS8vUixAKSIkQworTSlCREMoIVBFKUI0SCtRWEgsIURIJ1IpXi1TMD4mMSw1JzFIPiYhLFEnQVw8JyFIRSlRJD8pIU02TEZEWQorTSkkPiU/OlhRKitKWi8iPl4yTEklQjwtLDBTOSpBMlhSL1RYRS0iWFMqUlhRKzMkUCkiQFVOSzJPSlleNQorTUU4VVgxMzEuO0FERTg1PEkpUCRYIDQ4IF5eKFQ1MiA8KEIkQSxBTzBWNVEsL1JMSysiREsrIlxJKUIwTQorTStCVE8tIixNLTFYTSkiMisxMjgyJiE4NidBSD4mITBSJ1IgPidBUEcqMSxBKUFRQlBWLD4iQVlENkosVgorTSs7OywxUkcqMS00WEJcQSItUkksQFIwRjA0XDssIkhPKVJETypSVEooMjBVUiw7IU86VkFIOUYzMkM5MworTTtBSEY4RUBIKSAkVCA0QCBeXixQKkM4QiRRVFAxUl8kVEZFOzNCND4qIig/KSIoSidCOEYoUihCKTE8MgorTSZBSDgpQVVTNyQsWioiLEYpMiRSLkJUQSgxXEAnMUBaJkFAQSsyNSQ8J0pHSVheKDFFTEcpWkZaNjJeWAorTT1NJTo0PCE/NjIpIURDWFUnNT0jMDQhKy5UJFYlQ1BSKlIgVEtMWzJULTM2TUo/OFYmQUkqUjVaOSRMWgorTStAJFcgNDwgSCxcTChSWEAjUURML1JKX1IlOSkwUiQ/KjIsQCoiPE8oUkhHKSIsQikxPDIgUUM4KUE5WgorTTozQEknQUg5JkFASSwyUEInUVQ9JkE0VCUhNEAqMjEqPUcyMUInIUYsJUhCKDpeWTUiVyE6XSUrM0tZMAorTTJCLSRAQlRVKERIVS8jWSkuM1BTJFM4RylCIFNLTFsvVC0jMkwqLzVUVjlPK0I5Xzo0NEsnMCRVIDQ4IAorTUguJFEoQyhFJSFYUTBSQyxWNUEmMFJESi0iWEssIlBUKiMoUitSWEkqQVA3IFFXOCpRViU9RDxSKTFYOgorTSYxQEksMkxDKDFcPychPFUlUTQ/K1ItM0E2VTcyIyBaKkcgVykrOzA4Ml8tOk1JITQsISYvQT0mQSIwTAorTSk0TEwuM0klLFM8USQzJEQoUUxQTF03OVVeI0RQOytPV0ZNVCsiPiE6VDhJJkAkUSA0NCBeXixKJ1I0QworTSZBWEcnQT4+VURZKzIjJEAnIjA/KFJQTylSTEQoIjBHJSFAOSchTDsoQi1HK1kjMDlSNEwuIjhBJ1FcPQorTSgiKEYnMihbRiolLjokMitLRidHREVUUkZLSFErSjJPPjIuUEM8WTUlSEE7NTJBM0ckOEUzIkBcMSNJKgorTTBTOFYsMyhRLCNERks5TyQ7WDZINjQnMFJYSFovMVYiPDJEVC9QJTggOCggR00kQCZRVD0lQUhDJiE2PgorTVNULFwuQkhAJyIwPyhSUE8pUkxEKCIwQyQgLDVWQTw4KEIlTS85LyU2UUhBLEIsPiciID4nIVA/JjFMUworTUQ6JS83Uz4jSkVLPUA0REpFTCBMKipGTjxCLllEPD0uJSglLTFCUS5CQyhDMlIgSy8zQSgwMyRRKyJUSworTSpTOEVOKi8pPjhWSzZUTzRTOExaLiFaKj4yOEgrQCUyIDg0IEw9WEgoIiRCJlFcSCZRRkVWRCxcMCMkRworTShSTEYrIzRYLCMoSylSTEslMTQ7JyFQQCpSLVIxWicyOEFEPixSNEAnQiwjKDw8RidBUE9GSVBWMTNKMworTU42J0Q/RCRORlxcVypbOl0/MkMlRlxBLCVHXSMuQVUsQ1JAPzJBWEguUzEiLlJYTioySEYqIzBEUEs/QAorTUJaIls4VS9GWEk4VSxSJjA+UjhFKlAlMyA4NCBeXVRQLCIsPykyIFMuQUhQVjQxLjFDLD8oIjg/LDJUUQorTScxPEMoQihEKDFcQCoySEYpIilANlFSTj0yWEMoMVw9KCIwQyghUEMoIlBXRjpSRUdVNUhKNicuRTU1IworTUQsIFgqSFozQzFOUyssNSo3Q1UyNDFdIkZTRUQpNCBQMyNRJSZBWFUsMzhMKkMsW0o5JyY8J1pNOyhHNAorTVBDXFcxQ1IgN0JAWEFAJScgOzAgXlxMRishTDcnUUhNLDEwUFUjQF8uIlA/KCI4PytCSE4mQTxDKEIoQAorTSZRRDooUjhDKSItRTgxVkc7Mjw8JzFMOSchWD0mQTA/JyI0T0Y6RjlBU00zR0VbL0NETSJDXDhTKSkuNAorTUJBRlosK1kjNyM5JzJSRShFIl0/KCM4QjFDSSIlUURQKyMkRikzIFpNKUcrPkhCVDxZNzdPQ0hSMUQmLQorTTlSRE09ICRfIDskIF5dQE4sMVw7KEFUUCwxPFdYU0xfL0MsRilSVEYtQyhWKEFYSioyREUnQVA9KiJMSworTSsyMUc5QkJSPFI4PShCID4oMixCJ1FIRSgyOEtISj1cNyQhSUtWQzxDM0xXQ000XilZQj9FQVsmLktdIQorTTdDMFwvIV0lRTJFPCZSWDgvMzEgJjE8TSoyWEEoQlhZT0pXQkMpQyA/WkNHU0Q0TzA0Li05MkhNPVAlJgorTSA7TCBeXjhUKSFIPykyLEYqUl0+VDNYXzMkKEYnQVg7K0FANCVBNDspIjBRKCc1PChSIEYpQjU/P0ksSAorTScxTDwnQiA9KDE8OyY0XiwzQjUpNiw3QVIyVTFWLVM4SjU4VD06WSUpJkhGQzI+RiZGXS0pVFlAM0FIMgorTStBRFApJCBdKzFRLCVSKFEtUzhPKlJMX0o5Pyo9Vy5NNlRHOlRcRSQuUVk6K0JNMTFQJFsgPFwgSk0wSgorTSghKDgnQVA/J0JBPlQjNFAvQ0xGJ0FYOypBMDAkQSg7KSIwUSc3KTknUVBDKUI5QUApLEUmUCw6U0FQOQorTScxLDcmRSoqMkFZITcsKzFNUVEjU01XNkckKEM7SzEgJ0ZMS0NCLk0nRkEmJ1QhLzBAVCAlUDxEJlMwTworTSlBRSklIVRMLEMkSSlCQF5NKV8vQDdOUjdVKz9UXEEgLkIlPywiVSktICRPIDw4IF5eJFIpMTg5J1FUQAorTSdCPUVXUzxQMSQoTSkyNEIsIUQ1JVFIQipSTFYpN1lBKSIkSytSPT0/KUhPJ1FEPygiKD8oUUA8JzUyLworTTNRXF01XCMzTyItKVU+S0pJVEhcPVwtKyg2UFBGUkZYKiZFJCZTPSYvUSApKEBYSSZTJEgpIUUpJSFMSQorTStSWEQoUjhdT0svRkRYWyE6NVtOWS09JS4yLUEqUkUnLSAkVCA9KCBeXUEmKUJBIjE1XE8sUkEjU1RBMgorTTFEJD8oIkRKJVFMPychODknQiREQEwtOikhXEMqIV1DOig1JichXDwoMVxEKTQ+KUQ6QFErWDUgOStLPgorTVQ7XlNVXU80TVU4RD46QTYnUU4oLTIqND4zRFwxNThDLilaMDw0SE0vUjBCJVFYREpTLFMvQzROKUJIUworTUspPyM9Vlo/Oyc3NlMpXlIqIlhQKiY4XjIwJFsgPTQgXlwwXighXFcuRTBGKiFdIFNTXSMuM0w8KCJESgorTSRRNDkmISw5J0IkSEIsQT4oQUxAKiIpQzlINSgnMVQ8JzFMQChERi5FWyBRKldYWDlLOzZVLC5RVD1PPAorTU01IEQ+KlUzJyFSKi4xWjk+MyRULTQ0Lyc2MS4uIUwyKjEkNyRRQEFKIlhOLjJYSCgyPFFNSV8mQDcyOworTTpHTzdTSV5SKTJIUSlGOFQtUCRQIDxMIF5dMSUoUiRXLjUsRiohXShXRC0jLyQgRCozKFMmMUg+JzFMQAorTSkyQFBEPT1KKVIkSCwyMT44SEkwKCFcQykyJEYqRF4xRyswViwnXFQ5K088VStWS1UuU1JOM1w1PVtJPQorTSdBVjAxMi5FQEJcUiszSCgpNkkxLiFAOitRMDcmIUxBSiJMTC1CUEMnQjRTUCsrPkRYNk07KCtEWFsiWworTSlSXFQoJVxMLEAkUCA9LCBeXiktLyJUXSpCOEcmIUxPVjRJLDBVIEcoMVxEJiIgPykyIEIpIihGOC0pUQorTSgiIEUoQjVCOFFGWCdCOEAjQUFHJklKV0xaXFMoMV0lMkw/QlYlNTxWLV87UFRUSy0lJUcnViw/KFIyKAorTS1VVSwzMj44OUJQPiYxVFNAJ0Q+KCNRI1RDIFQwI0RSKjJQV0pLVzZAVzMvNVIuJVFTLVIuUypPRCQ1SAorTTJAJFQgOkQgXlxFKyxRWFAnUUw9JDEsR1U0IF0tREg+JyIsQyUhUD0oQiBCKSIoSjlNLU8nMVRFKSI9PworTTdBPlwnQiA8I0ExQydKIl9OKyhUJ1E8WjQsLzdVVV1AVS1fPU8kJEQtRS1HJzY8QCdRVicsJFBdMiBNQworTS1BICwkITg5NVUoLygjMSFUQkRNLiJYSikiRFVMLC84QlgjIDNBVVZRUyFMLSMiU0VUMT0uICRLIDlUIAorTV5dNScpUTBQJ0FIRCYhRE5ZJDxdLURcSioyVE8mQihCKkI8SSpSRFQ5PiIhKTI0TCpCTT82MVMoKTIsQgorTSUxRUgqKl8hUSwgVShRTFczPEdEWUY1SFhfK1NRM1BFL0VFTCg3JEspMVozLDQkWS8gOUYuMUA7J0FcOworTTVVKC8pMlkjVlJITi1CTEYoMkxaT107TUdINzgwIllWVUNBTy0zNltEJCU6LFAkTyA6MCBeXURaKiFcOQorTSVBWEMnMThMUVU5LzNFJEUoRCBLMyhUTSgxXEQpIiREQS0tWydCIEQpMj1DNzIyLScxVEJBWUkwJypaIQorTUotMFIoUi0kLjtPNFQ0PFZRTVM9UkREQSoiXF0lUUg+J0ItUDE2PTMwQyokJzFMNiYhWD0lRCQ+JyRNKQorTVQyNFMuQ0hbKzMkPjxKNzA+VjcsLVJAVU8ySSUsMyYrPzhFTy9AJSkgPDwgQUwkVSghKDckUCw3XEBYRAorTVEkUSAwNExCJ1QkTDM4XE0nUVxEKSIkSEJNMVkmUVREKVJFQDYiKjEnMTw+QylNMCgrKiNJPFxQKDFMWQorTS9bXzNVRFxYUD1DP1BTVDoqQyRdJTFIPichVVIvRT0lMEE5NiMhMC4kISQ2IUJMNSckLSdUMVxNLFMoVQorTSoiWDw+Wlc0QTZWVioxWEVPUkBfKjMmNUEoSUYrMCUhIDtUIF5cOFInISw7JFE4PCchKEpUJS0gMDUgTAorTSpUUFc2KTxUKSI4SypSQFJCPiYrKFI0SysyVUA0Uj47KSFIQ0YqOTcrK1ohS11IUikxXFYvTEdCWFUkXAorTVMuP1VTI0A7LEM9IiYyJEUoIiFaLyQ8Wy4xTUklMSwyJUEwNyJDJDkpM10pVUIgTiwyWFApMyBBQlwnSQorTUYnJyslUjg/UVJVJCszQj9BOFVGKkAlJSA8MCBeXiBDJiFIQSkjIFsqQzE5U1Q1KjglMEYmIiRfSyxIXAorTSlBWEInQihFQS0iMChSKEEpIklCOVIqOTRZUjhMKTBFKTRCL1U9QE0oQjklMDsrK1clMFU4KVc4UyRUQgorTTYkVDUoMiQ8J1FdLDQmMTYsIlYhNVNRTjVVXDI/WSwjKURRK1QyJE4xU0xXKyFUOTsqKyw9JjcyLiJcXQorTUdCSF0sQzolPFdZQy0wJSAgO1QgXlwsPCQxIDomUkBQKSJVMVMjTFs0VFhIJTIhJUxcXF4oQUxCJ0IoSQorTUJNJi4oIVxBKUJRPzhCIkI2KVo8TVk4QyhEQjJUTSxOKCFYWjArMytXRUhTNjlDN1E0JDs2RFw1J1FcOgorTScxVS0yNS0oJzJOMjZDVVU4Nig4QDkkJio0MSpUQVhNMEM0USlRSDc9Sk80QCZeXSpCNFBIIkBXKiNCNAorTT43VTsqMCRaIDs8IF5dSEUmIiRBJlIoTSkyWTVVRChbNFUsUCgyUS5PXVEmKiIsSSkyRFNCPVpAKiI8SAorTSsjIT83MjZQOTo6RlBZWEgqRT40V04oTykiKFcvO1M6WEU0VTgqL01TQ1A8OEU0OihSJDwnUV04MiQ5IQorTSlTVks9RUo4QTgwS0VKPDQtVCkpVTFQTC9TIEwpIVA8QiwnSkU3PzUmIlBDSSJQXCtUIkBASEU/KUAkWworTSA7UCBeXUBRKUIwTS1EWEAqQyBcJiQpKjY1OEErMiQ+QEw1LSohVEMoUiRCQS0iNChSKEMoUj1POkIuJQorTUk7MlBNSixLKUM2SlQtUFAoQiklNEYnKj5XWV06WkM+VSVIQSghXEEnUVxBKDFIVzBVXUc1MFA/KVE8PworTSdROEImIjxCQlRNKVNTJSwnMkknLFQ/OTpaKys9RkcvLiJQXENSNFQqU01bP1gxKiwgJEYgOlggXltQSgorTSdRVEIqRDA6KSJIViYjRFsyRSBDKyFYREJcUS4pQUxDKFIkRkJNJjIoIVxDKTJFTjkyJjFLO05ZTlosRQorTShTQlBULUxRKCFIWjNFWyc+N1VbOTovQVM0WDooQVxBJzFQPidRTFcuVF07M0AsNCgwSDQlUFQ6IlFAOgorTUJEKShUIlkuJyI1IStELzY+Kk8zQScyWytCNFFEIjhQKFNeK0FILSQpMCRDIDpQIF5cUEklIUxCKTNQMworTSkyTFknU1RbMkUsSy4iSEtFXUE5KkIgSipCQFBCPVpEKiI8SipSXU04IjpEUCw/JVIqSEgpNDpXV15IVAorTSkhWFcxRjszPldJVToqW1NWJEQ5KiI4RigxUEAoMVkmMDQ9NjMgVEssQTRBKVFEQSYiOEBFRDEnVDJRLAorTSYyIFwqNEM+QjwnSUYnXzcnIlBGRDJEVio0PjtEOSUpKEAkQyA6WCBeXjhTNiMsUy8zRDEpUl09VDQgXAorTTEmQEUpUVxALTw9OydRVEApQihHQl0iQikhXEMpMllFOjImIUxHOUJWSihFKCJWTlEtSFQoQjEgMTsuXgorTVhXOTw4WlM0VTUoQSgyMEEnQVg/KCFQSDMmTUU3Mz1PRSNEPyZBOFo0NThISEVZJlRDIFgtI0hcLStPPQorTT1KTys9Vj8zL1IsXzoiNE4pVDFMPUgtKysgJFggOVAgXlxYSzIyTFYwI0wzKzMtQVRDRFAtVjBCKSFcQgorTS8sTTsnUVhAKUIkSENNJkIpIVxDKTMhRzoxVixMR1FHVUokRigjLlRSLVBVKCFQVTE7Ll9ZJkkzNzpPOgorTVQkNDonUig/JyFQPSdBSEcxRiE7MzJBPTtCKDAjMEQ5KVMwQUk1NSVUUlRaLVM0USwrSzg/WyMsQUcnIAorTSxRTFU5QjxMKCQ5WT84KSQpMCRVIDlQIF5dVEcuUjxWMENcOysiVTlVM0BNLkZETCtCOEYvPT1MKUIkRworTStSVFVDTVpTKjIwSCpDQUU4Qio5UFgtSVk6VEkpM0JdVS4wWCkiIFIvTCssW1clJzdLR0lZNDQ4KSI4QworTSgiIEEoQVhVMlU1MTFSQUA8QiwwIzBIOysjRD9JVUUiVUJMWC0zKFAqLDtHRTxHRUdHTzcoIiRPOEI0UQorTSg0WihCKSUrKFAkVSA6JCBeXSA5J1FENy1TNE0mUlYgUSRJJy1TREMnQjA/JytZUCkxVEAqQihCQSxSTgorTSkhXEgqUlFFOUIpQTcoLilXKjRLKDIuQE1dXE0oMVxeMFpaUFknOUE3SkcuVVRQSShCJEEnQVg/KCFQQQorTTNFTUw2RFhfM0YtTz8pSSlCVVUrRFVVMFUzPFIyM0RdLFtDOjsqRyk7Rj8wLFI9LjFSOFQrVElBOSglJAorTSpQJF8gOkggXlwsPCZRTEUwVChaK0QqL1E0MF4rU0RCJlIwQSksLVApIVRAKkIkQ0FcVk4pIVxIKlJZRworTTlBWUw3OEovViowTCgySkZOTiBOJ1E8UzBaWlBZNkE2NVo7NVRDXEIoIVw/JyFQPSdBSEMyVSlFM1QsUQorTSwyPEotRSQ1N1NVIUUlMS9VQyhRMlMoUitbPzU8Ok8pPEZaXSlRXSAvUixMKSRBSjpYJF0pICRcIDpMIAorTV5cMD4oUTw/L0NETShSKUlRREUgLTQgTikyTEUoLEIjLEIwRyxSVFBBXUpfKjIwTSwjOUU3Ui1WOkhSLAorTVlbIE8pQk5NUi5MUShRTFAvK15fXEZZKTVLK0FZU1xAKTIsQygiIEEoQVhLMjQ5OjEjREosQyBUL1VMOAorTTk0JFlFNUEsVjMgUDIzIFEpXC9EP0wjPEFHPzQlIjRXLjIkUCg0UVg9SSkmKFAkXiA7OCBRXEhXLFMhMAorTTBRPS0vNEpBUzRdIC1EID0nQiBBMiwuKScxVEAoUixEPixGVyhSIEIpIjBdOSFZRTY6NjRWOlBPKEFOQworTUctPE4oUkEnL0pWNldWTTYzWjcvVURISSkyMEMhMiJPJVRdLEQ4TTEzJSlfM0NAUzU3TykySE00MUw0VworTSspSSYwU05TViZSV1M4Ti9WRTBIMyNBSjAzTSpIRUInLlJYITIgJkQgLD8kMiQpIDhVMEk3VFk6Sz0lJworTS0ySF4nMUxAKFRfJ0IxVD0oIixCKTdPKk1SLEAoQjBGL1YwOjwlRktGPTZLLCIoQko5XzgrQiRALyNaTQorTUVNXT0yND5AVS0kXShCLEIoMDQ+S1FNMDE4SikzVD0oPkQ8Tik1NVpQM1opMlQ3JiwiRjkvQ0BXTE0tUgorTU9NKi9FPD0oKCQoUzozVFQzKkU4QSM0SCA0NCFJICMnT1NYVitUUFkjI1hTLylDOTJTME0wUjhFKVI9LgorTVQ5UEYoQjxMK0MpW1VcQEgpMjxJK0NVPSdXTUhMSU9ETVMsRyg6Wk1ZMyxFKSNEWVAqP044U0EjSl4nRgorTS8yIEgpQjQlKEpcQzQzUihCVERbMCdBJiohUSw+PDxZQlRdIlIyXElGI1BXK1tbQj1cRz9GOUs+LTI4WgorTStGQSItNSpVNzkgWigwJSMgOkQgXlxcUjVXSEwqUyxZLzUzJVREMS82NEhHKUFYSDVMVjgoQVRAKTIsQworTS9cQlsoUiA/KDI8Sy9RWTY7KCo6VkpcSSdBWkFAXTBZKDI5MjJKRiJWKE02OzlDKVVEKFcpQjRAKDIgQAorTSdSJDwxNTsgWFY9NDZYIlJbJjVQQl1BJENFPSZSQyBQQ0NcWC5LRzpOKlJPSyg7NzAiRFE9OSorPldNOgorTTkpME0xUCUkIDZMIF5cQSU7WFxfKyNJJC0kKyJWI00gMjQoRChRWEo3LSI4KFFYQCkyKEQxPEJbKFIgPworTSgyPEkvUUk/O1hCP1Y6WEonQjZJQV00WSdSIScyKlIiVidVKDhJMy5VIzxQKSIsPidRWD4nMVw9MFUiWQorTVY1OSIyNzpJVzUpQUBNLF9EJFklUlJESkIjMFAtS0M2UDtGV0woVyQsMiRLPilCKz5YJUA3OSBKMFAlJAorTSA2TCBeXDhOMyc0SCgjJFcqI18qWVNMXDJUOE4rMjxQOF1aSSlCJEcrQlhRMS0/LCoiNEQpQlhLLkFdTworTT9ZJkRaK0hNKFIyT0ReKF4oUi0kMStSM1lYLFc3WVM6WUM4TioiPEIoUihCKDIsSDFVJyBaRVRdMEdWVQorTVlVMUFDLiBcQ0UhIlNCQEtCMyxOK0wzRlQ9LzdTKUc5KFI0Rj4pVjBAKEFHNyk0SC1QJFsgNjggXlxcSQorTS1TSitCSl0rTzlDLFQkXSs3VCxBKSI0UDdcLj0pQVRCKkIsQEAsQyEoMVxDKUI8SCkxWUA+Vyo/VCtYSworTShCOkc6PVhVKTI1QDRaNURXKSk4OklaOFVEWFwqIjBBKEIgQCdCIDgtLE5YVFYwUzRXNi5URVVVPC0tMgorTUJWQSJQMlRRRkQsXy1KSltFSUoyRVdLNzAyTFc9SzxWKTVFX0JZLVI0UCU6IDhQIF5dTEorQ1leMFdMTAorTUJFQyJWRDheNENQQyhSMFQ5TEI9KFFMPypCMEVBXE8hKDFcQylCLEQoMUlDQCc+QVRbXEwoIkJWOz1YVQorTShSKTUxWk1HVlhFKjdZTjhWVCxRKUIoPyghWD4nIVgwK0w2VFRVNEkxVlouUzUlTjs8WSdCVV0hUDI4SgorTUQzQForKk5ZSEpCPkk4SygrQixVPywsVShVWiVCKF1RNFAlOiA4RCBeXVhNLCNBXzlKLSVKR08zWyRIXgorTTRTVEsrUyBePE0+TCpSIEcsUlxRQj1XMilCMEgqUkBJKUFdU0MnSkdYPEhPKTJTJD0+PFopUjEyMStJVQorTVo5NSA3Ki4/WiQsTipCOEMpIihCKCIoNyo8SlxXJSRBMCZSN1ckWUw9XVUkQUYkXlFCPEtEUzxXKUtDLQorTU1cMltQOU80K0IkWUM9SSEpViIkQikxUDJAJTUgODwgXl1eQFQ9KTEsU0xIPjkzJFUlPSQ4JiRAKCIwTworTTwsIlUpQVREKlI0S0A8PyMqMiQ+KTI4OSghTSFBNU5BUkxETSkyPkg0TUxXKTFZLjJJTS5VWkk4N1U9WgorTVRFSFsoQixBKEIgQSkhXEErJFo6UzYoXTRWNiZXJUE7Ny0hKEBWQS1WMzRVRlRBJS9KQk5CR1YsRScrLworTS9CPiA/PDRdJ0IpOzs3IV0+QCVJIDYkIF5bTS45KVEoJjMgTj84RyhWRFxXNFVIQidSLFM9XDZVKFFMQQorTSpSOFBCLEsjKjIkPikyKDUnIT0kQkYiQ1M8SE4oUkZXNU1MVyhRTSMvSiUxVUolLTVVPVpVVFxQKCIkPworTSghWD8oQVRDLDRaPlNVLFMxVVomVVRRNDY8TF1AVV0sVjJYTkRDVSAtKkZMRDhCNEdXXyMsUjlfQDxMXAorTSVBXT47VyVePyAlSyA2ICBeXkIoSUw9PC00PFVCOUs0WzUsVzUlTEoqUlxdQF0zJCpSIEktIyRcQk1TNAorTStCOEMqQjw6KDFRNEVGLklWXTRRKiJXJTdOMFwpUVUgLlshP1kqVSI0VVohWSRcTSkiNEMpIihDKUIkSworTSxVVkhVVFxLMCVSL1lERTI4XUhaP0YlKVdCXE9FI1BdK0s7IEpKKkpOOFsqLCIuLURdWSonIiU8OlcxXworTT1QJUcgNVQgXl05SVYtVS0rIykgOVdWWlMkSSAxJVA/KVJARj9MNlYpQVxAKTFcRT47VyEpIiBBJzFMNQorTSVBSFJFRDo+UyxMTChSUkcyPURVKSFMUTQ5JSFVKy0xODkmKVVVJSYpMjRDKSJOTCgyOTU6V004VCY4XworTTYmLVRXVTE4Nj0xMkRXTSlRI0hSSDNdIC0pVjw9VVRVPlYjKDAyWTouMkhWKFNBVjxJNUM8MCUzIDRcIAorTV5cNShNPikoKEI4VTxYVl9UJDBTLVU0QSlCPEpBPEpWKFFUPSkyIEpALCMhKSIgQScxPDEkQThVRlROQAorTVNcUE0oMlpWMz1EVShBQEYxOT0kVFpRKDZZLilXJDhbKFIsQShCRkonUjFAPlg9Q1RFPFUzJVFUVkRBMQorTTVMXSdEVykoUSMsS0YjMFsqSVo6PzYwW0EmQl8vUy07LyJQVCczPVg7OTlGPTAlNiA1NCBeXjlOVy9NNQorTSoyRFU+STcrWSQ8Uy4lOEksQyxURD1HJSpSKEUrQkxWQE0rMioyNEYoQVA2JVFNJUlUWkZXPTxQKUMrJAorTTU+KFopQUhDMEo5Mlg7PFw1SUYwWjQ4WClSPEUpQlZOKFJBTUBZWVBWRSxNMTVJXVo0NS84LVkkQ0cxJQorTVIzMExGQyxYKSpOTkNHISJER08rMDNBRi9CSFYoIzlUOklFSDwgKTQgL082MV0rNzRSNEYwRjVXTlw1IQorTS9FJS4qIVxIKig7JFBCNEAoMjBEKVYvJU9COEAnUiwzJEE0NyhKIFpLLC8wK1IwUkkjTzovUjA/LDRaNworTSktIl40Ni4rRS1FOzJSLEUpVTFENDIoSSkkMTxBXS1KNzVNQDpdWTI4NCcyNCcxTzJZUFssSk0kLVNaMQorTUg1STE4VilHTixCXDdaJEkuUiYoOkVVTz1VOCEyUCUpIC9POzQ9Py40QyRILlZaJU8sRF8sNDEnKkFYRworTStIVylQQig+J0IwRis2RyhPQjhAJ1IsLyQhJDMpSjUhTCw/MStSKFRMU185LzIoOylELjwqLSZZMiVWMAorTUUtWTAwIiRDKTUpQjNRWEcpRD04QD0hQDVEXTo6XUUmNlNbLzFHLUgySUhWKyooWSxDMjJHVV03OjZJSworTUxMUl84OiRDLVIyLjslNVA/JUQiNDAjW1olT0RYRVhUKyQxWkNMRz0wMyUkMiMgSixTPjhWLSxKKFI4TQorTStDOU5WTFxLKTIwSCUhMDYmIyJSMFtLM1cjMEcuK10pWTQoRigiLSJKIzM+UUNRNkU5T0s0I1RGKVJFNgorTTlVLEMqUkknOVgzODYkVSg1NzNGMFUxJlZUIVA6ND4+LSJWRi1CXE5HWyVLNyZBTj88LzZUNzpKKSNcRgorTUJWPTE8N1k3IDUgITRQI1tSRS8yUlYkUS5UJVs7SlckMzRROi9STEUpMjIjTktURSdSKEMoMV01S0tMQworTSdRVEMoUVBBKlIiQTwqPlxUMlRBLFkxJVY0QEcoIjxUQSMrMVAmKTVDOVMwODQ4SytKPFY/KURFKCFMSgorTStBXyo5NVk8N1ZDODNVMFRRRFUmOERVLyxTIkwzNDRbNCw2LkBKOUMvRChHKiooRyo0RVlGNkFYP0hVXworTSA0KCE0ICNbVFVDMlQmIEosU0IiPTsrLDFDVSstQkBFKkJKK1A8IEUnUihDKDIxO0xcIEUnUVRDJjFQOQorTSgyMkY+Wk8hVFJUPy06MSlWJDBDJyFYT0EzSzROJTEpQ1lTNDUzTEcqSjRWPlkoPSchVE0rQU8lODU9MAorTTZWQzMwVExSUUQlJzg0QSssMlZEMTQgUTRMMi0/WVU9LVNURyoqPEUoJD4kSSZRVD1IQiIgNDQhNTAjWworTVhWP0FZNlBRLjNSKz9LW0AzM00pLkMgTCtSXi9TPShOKSJESioiPURQTFBNKUIwSihSLEAqIV5dPlwjJgorTVZTMEQvOkk1WVRISShCIE1CJCNCUjRNJEU6L0Y3I0hNLCpIW0FZTEEoQixLLVIjMDVUTSk0Vlc+MCNcVAorTVMzUSo4JC0wKzJWSjAzTEk2TSIqP1ldNitDTE4sOzBKKCRSJ0k2PUw4WDoiIDQ8ITZAI1tPRVMsUkZEUQorTS9UNTo4OVslO0U1SDNCQEYoMk1ATUtcQidRXEYoUjReJytMQicxTEQnUTxCKjFKTjlaOk5UUlxALTddQAorTVMmLEcoMj0kMDo/J1IlQUVCKUctPyUoRSlaNio/OThGKTctOk87KlY3VUlANSZTPDZUWiRUVEhfNyQ4TQorTSZCPl0zRE0jQV0xVzhVNT08IlxCKSRITidJPj5ANlVaQyYpKyA0RCEzQCNbUiYrL1RGSE0uI1VAOVorKworTTlEMTcwQjRGKUMlSE88KEInUVxGKFI9IigrXEInMUxEJVFMOylCJlI8SkZTVTJcPi1YXURSVVxDJzFYXworTTBKXypQJEk5QklHMTwkPEMpOjYsP0kkQChHMTxPOy5ONTRRLjNGUzczVDYiVFNYXjYzXEcmIjJVMUQ4WQorTUI9LUkzM1ElNyIkPyk0NEcmSV5FQVZdVjolJTogNFAhM0AjW1YnJz1ZRzxVL1QtRztKUz47NC02MVJUTQorTSpTOUxSPTBLKSI4TSpCVSoqTExLKSIoSykyLEIrQiMuPFwuWFczOEMvWTVQVkY0SShSIF0xOzc4VDQlNAorTUQqI0M9VDhIKkpSNEJZUEUqR106USs6XDM0KSkxVydCMyNGJFZDRF01U1RIJSIyWzBEJFFEPV03LVI8UAorTTIhPD0pRSBQJ1o2UENGVU41REEwIDRQITRQI1tOVi8mUiZcQS80RT03NDZfOCQ9UjFCPEQpIVVHSkwkQgorTSchUEMpIkg8J1wkRCdCIEEnIUhDKzE+STk6VkRVMlxBKUYpVFQmSEYpIjElLio/MFMmLTU/KC8gQ1UsSgorTSoqLjo9KTxNKDk1LFArIk05ViE0NFRXNjhFQiRTNFhFLUVATjBCTyA1Q1EjPFxZMDNWUTY8UjhFKDVQTgorTU9JIiM0NCldNjY5MCA0PCE0MCNbUiZTLVRHKEEuNClDOEQ/JDcjUUYwIjxEKjItT0w8MEInIVBDKSJIPAorTSdcIEQnQiBBJzIkNikxVk08KyJIVVJcPyonKVhTVjhCKCFNIC46XzNRJTUpP0gvJEBUQEgqKjI9PVk4SQorTShZKSlPWyJHODU9JjNUVzE1RF4iUzQoQyw0XEcwIkJYM0M8WT08VSMuVTBfOEFQRSg1QEpQST4oNFQpWworTTJWITwgNFghNlAjW1VXSzlZOCBKMDRFSjlUXzM4M0VDMFJYSytCQVNPPThLKDIsSipTLEEpLFBNKTI8SAorTSoiKDYqMVMqPFxSUFdTOEQsJ0IkV0ZQSClBVF4vKzdBVTRRJEEoSzZCRDxMK1peS0FaKE8qWkkxUlteWAorTTYkTF8xVSs8NFQuJFUjVD0rVFxGLkJCXjJDKFE/PURUKVQkUTgyLE4qJiBSUkoqKjNTVVMuRiU5IDUgIQorTThQI1tNVTMiUTcwQytELT4qUVskQEYqOzkiOEcoMiU1RCtcQCcxVEQqIjQ8MitcRCciMEYnRi0xN1FeRworTTgqSipUIlxBKCRBRVM4IEYnQikmLVo/IVM1QTU9JTJUQlVURSlZRj9BSVg/KUJNKUgqOTg1VTk0NiNbPAorTTU1OUtQVERXJjUlMjIyVlkyIzhePFxcSilWKFAoMVQ9KTVBQ1MqMTMvOSFGOydaISA2UCFEUCNbUUVXKAorTVNXPEMqU11DKzFbKUBWIjc4UjhHKTI5PUVcKEAnMVREKiI0PjM8IEQnIjBGJTVARCwhUks6SlYvVDJcPworTShFOUpTJ1RCJkFEXy4qXyZRVFUrPUUyWUBVKEMpWVZEQllUPClCOSlISk06NiUlKDUjXzkyNFFJUFNUUQorTSREQSsxUkpRMCMkVj08WEUoNThEJzIgQilVRUVUOkEzL0khQT4oQiYgNywhSEAjW1RGRzdYSDRMLFQ1SAorTSwyNzZBRUovOEJMTisyTUFIXTBJKEIwSytSWEIzXExNKFJMTSg1NEAtUVsnPEw+NFcjQEQqRVVWVlg0SAorTSghRF4uOzczViQtJT9FRyhCNFxFKypGU0ZKTEQrMyUiR0pVQjMkNSEzJCtFMUQpS1JDQEokNEEpMDJKVworTS8iUFA+XUhDJyUsSShCKEQoRUlNVzspLCxIRT48OSoyIDdYIUtAI1tOVEouUChATC5UNEEnQlpQQFQxVgorTT4iSEUnUVkyLFtcRiZRWEkoMixBPltARCcyLEQqNV04OVFSQzI6NUxTIzRDKFM4TjcoTEQnUi0oLyk6UAorTVM1ST4yUjxeP1RcPigpNl5FWjxIKTNZMjVJUFYqVUE9NyhTODgkTUFORDRXMjRdLTQiUlE0Q1hXMUwoQgorTSc7IEUoUiQ5Kjo7JlRLNSc8RTEjVF0zMSA9QCFXUCNbUVUmMlI4QEktM1RBJ1JSVkBUKVI8MkhGKCIhOQorTS48KEgmUVhJKDIsSUI7VEQnMixEKEYoSS8hWkg0SklRUyM0QSgjQFQ2WExEJjFJIC5JTllSNSEwMVIlJQorTT5UKDsnOUMlRko8SChTUTA1KVhaKlUlLzQ4RzQ0JCVATlNESzA0QSgzQkZJMjNAVTI8KEAmSlRDJzFMNgorTSoqUytVSz0nPUVAXlVdUzkgPiAhWVAjW1MlUkZYOURRLiQwRigiWl9CI1FGO1JcUSpSMTswTSBQKEI0UAorTSoiSE9ELERLKEJASSpVQEAvIVJdOEs9VFczWEMqI1hbOVkwSydBSFwvKj8nVlRBKTNSKTBANCg9KVo7MQorTUpLOFEpUzksNio4VShEQSY0KD9DNEM9P09DOEgvVDklMiJGTTIzJFEyXExFKEtESCghUDYpOy84WEtNIgorTTwlKFlYXl9MID8sIV5QI1tNMz1JTTg8RjAjOD4uSFpAOyMxOD0iIEIoMVw+JSwkRiYhTEIqIjhCP0tMRAorTScyIEgoRVlTOTEySCwpPTpTM0xCJzJITDxJREYoQj0xMkhWQlJGMUAqUiEmOVMgRis5NyJARkhCKTM9NgorTS5ILEAlVUUzNFhbMDRUTEQtI00sMyU1MzJCQlUyQ0xeMjhUPyoiXF0yJjYnRj07IzMmTUY0RC0wSz07NworTSA9UCFXMCNbTlNNTE9ISEYvMlw9LlkiRToiPSg5IVRDKEIkQyYsKEYmIUxCKiI4SkMsIEQnMiBIKEYxRQorTTZBRk0uOVU/UzNMQCYyTE47WURGJyFZJzFZJklSJUksJ0FNLDdSMEIqOT8oQTZIQihTKTEtWCQ/JTUlJworTTIoTywwVCRDLTJdIDEkWS4yIjZNMDMsWTJYTD0qIlxdMUY2KUc9Uyg0JlVHNSQ5MkxNVz4gPiwhWSAjWworTVEkNVpVKUhNL1M4PC8pMlE8Ij0iOUI0TisyNEUoLFxNJ1IoSStSVFBEXFBLKEI0TSpVXT42QU8iMVo5QQorTVdEMEInQlhSPVooTSgxWSExWU5VVkUpJCdROTM5MkRKLipTOUVXREspUl0uLVg4PCNUTSAxWEc7MTM8QgorTS4iUF0wRFErMEI2UTAyXFYyOSBBK1NBIjImSjFKPk81NkctSDNTWS5RX0NZID9YIV8wIkJMUjg5RCksSAorTS9TLS0xSCopQiNJPD8yOEEpIUA3JEtcRCcxSEApIjw/PEtYQSZQLEFVRVlKOEFSQyhZKFZTNUBDKTJZVQorTTAqIEMoMikwMTg1KVRFOTgrVEFSKyNYRSpIWktEWjhDKSQhNydVJEUyJUErNiZfKTIzVSk6UzEiMiY1MworTS8hXkIzU0xXLTUiRFM9Qz1UOkVeNyxXN1FcSy0wVl82VV1XPiA9WCFYICNbTEIsO0ZJQEowIyUrMihCLAorTUBSSSU7MixCKTFIPCUrXEInMUhAKSI8R0AsLEEmUiRBKSYhTDhRWkgrOUBbUzVAQShTLVsxKihDJlFFJAorTS9IPS1TRFEoKjQ5WCgzKEMpWSZRRUo4QyhDRTAmRFhAMFUhITQmUyUuMy0oOyJAVjAlWS4uQVI6MUJcUAorTS0kSkRTTUM+VSpWJDktKztSXE8vMEcnO1dOM0UgPjQhWVAiQlAiTEFLOjxQMDM5JTEpJjpDQlEkPDJMTQorTSwhWD4mTEBHKEIkRypSWE1BXFxIKCAsRlUlUUc5IipdLVlUXVdGJEMqIzogMypISighRF0vOF05WCQxIAorTStESiEoMzRILDonIEorNEwpQz0uJiRYPjAkUFszRks0LlJFJztSNFMvRVErLSFSPjFCUE4sNE5LVl5HSworTVhLXjU9Xj9NVF07My9WX0peMDNfIC9ONydRMU5CUiBaL1Q1JT8nWkAyJTVAKVIoQSghNT1QIjw+JiIgSworTSkyIVBNQig8J0JERTk2PUcnOjhNPlE7LDlSPEQwJi0oSFJQPSxUVFE9QVsuNiUtWzVBWToxIVBIRDoiRgorTUtCLEQvNiBJKFkxMzInKTQ8WjEzLkZUWy0jNSo3VEhfLCZVJy8jWSwtRlopTUVTMjYiTEFUTExYMERJWworTVNNL0FXXiAhV1AnPSAvTjEmUTFbRSIgWy9UJSlAWCZALyQhMilSJEIpMUlCT1I0PCYiIEspMkFcTlIoPAorTSdCREg4Rk1EJzpYVEBBUys5QjRIMkclL0kiUDcqRCxKPUIjKTM0QVw2IiEvLyFIRkRKPkpLQixCLUVAQgorTSdIVSwwNj0pPCotIywmSFgqIkUiNiQ0XSs2NSAsMz0qLDcqK042KyozQiQ7VSxcXjFEVVxTXUdJWU48IQorTVlAJ0QgL0JCKFFGLEkiNF4xIz0kQ0heSS9TWTgrQlRNKkFRR1JSSEEnUjxSKyJSIVFSREEoUlhIOCY1RAorTShMKF9AUU86PEJEUDRHSTpLUyQ8KyNEST9SOzYyRDYnN0JBLC5BWEtHOypcTzJQRi01OEAnKFEqMCY5JgorTTtKXSUqJkBaKTI5IDVELFcrNkRfLCM1JitXWkBUNzc4NiJAQFo+JSUzRFVdVy9AJF9QJ10gL04tKENFPgorTTgyLFcuI1hWPlY+UC8mMTgpQjBEJkFRRlAiTD4nIjhCKTIlP0oyJD4nQjhDOSZNRSZZTDs+MTpdQVFYOgorTTFUWTZKUkRGJ0RATStCOVExJE08NSUtPDAhUEZIWTo8SSI8Qy01OE4+RkVFNjQ1OS8iOSsvVDEiKzJBLgorTTBTQSQqQlUmMCNcXyo4PkpQV18oL1I8QlVMNSE7NiZPVy4jPlctVCFXMCdBIC9OJCZDTUw6UVxZLkNAVQorTUBGUlQtNSkoKFIkQygyMVBRUkA6JjI4QykyLUpLUiQ8J0JAQzhWTUQnSkQ9PiE+XUFCID40NVE+SyJIPworTSU0JEYqQkFTLlNNNTQ0TTIuMUBDSVlWRElSKD8rVFxGO1VZPzQzNSovIk0gK1M4VidBVSYvQzRfKSI9IQorTS4jQFopSTpNVCkvJy1RXEJUXCxfOkVWUVg+N0dZPjghWSAnSCAvQjwqRCVdPlIxITBCXFJCV0ZeLURdLAorTSpSTE8rIklYVEMoQCgyXE4rQj1LTiJAQShSUEw4RilBKCtIRT1RQyRFIkBGNlY1Qk4yTEYmM0BHLCI5WworTS9TNTQzVDUsLkFYS0w6QlhNUlRFLCRYRDslVTY1Mz0gLVJUXylSXFEnIUkkLyM0XCkySF8tIzhYKUojJQorTVlaLzMvQjRJWl01IzolLlVeL1AlX1AjW0giJFk1NixBKyM0TSknJTxHIzlNNiJYQSkyJEA2WzxMJ0FQRworTShSODs0V1xAKCFIRCklTUM7Mi4+JkNIW0xZQEUoNDRbOStATCgiWTwtUURZNyNFPjckUTI0NFA9J0leIworTUYqIEMoQ00+LjchSzslVF0zI05DLDNVIStCPFgwMVg9L1JcRTAzPFstQ0oiSiwlXE9DTEgpXFJeN1NdWQorTVZNNzlYPV8+ID1QIVcwI1tHMVxdODZUPStDPEYoR0VBSCJZOzIyUD4pIkBIOTtYSSZBREcpIjg9N0g0QAorTSdBSEYpJUlDOyFWRSVTPSBNOTxCKFRRJzpbRE0mMjUsK0FUXzgjLTAzRDkoMTQwOydKMixIKiw+J0M1NworTSw2OUA5RTRNMENWSSpSQE0oQihWLyFMOi5CRD8vIlxULDM+M0s9IjNPUzA/KD0jITcjVVlYLitEWT4vRQorTSA+NCFZICNXTVMlKT1HXEItQ1xEKSdVTUsjKTYyMyRILCMsTjs8RFMoIiRQK1JcQTdYWEcoUVxKKzVFOgorTToxWlEnUz0jTzosSio1NS47PDhOKCJFMCtBNSQ7I0EpMTQlIi9EID0pOyI8TSssSSkjOTUqVVk/NzVETworTS4jRkgpIVhGJzFUUC4xRDotUkhCLkJMUitTPjxRTkJEUyNMQSlONy82Q0YgXD9MJV9QJ10gL04tJ0MpJQorTTchRFYpQlRFN1RSRyxGLTcrMjBJJ0FJW00iPD0mQixBKFIgTjQhXDwoUUhENTY9RihZLEo0Ri5GRyIwQgorTTMjLU9PMjxBKTRJJT4oSEM5JU1FMzUpRDdSKEdFSC4uRCIsQiw1OTs3VVFLTlRcWUZSNSAvQlRGQCUgWAorTSdDWSkoU0BILSJZIzA3Tj9ORlpaQjMkRFFLPTs6PSc7Vl1fPUldUCFXQCc/IC9OMShDQTE5QTRYKiI0QworTTolKkoqRSUoKlIkSCkyKiVOUjA5JVIsQihSKFk1QVw6KFFQRDUmPUUnOURLNSZOSkZSIEM0Q1VUT0JAOgorTScjWSJAKFg9NyRdNzE0OTY1MiRJRzhSNkRRWD4rJSE0NTUlRUxTXE9EUVxVK0FYQEAlKFomU0EkJzMoQworTSsiPF4vSF5GUlg7I0IiVEJUS1U3OVxTPlleQz5JPiAhWVAnRiAvTkYrQ11EPUFJICwiREU6JU5YLCRZJgorTSwiTFQsIkItUUJYPydSUE0rIjhaN1I4PyoiIE00VVlCKCpIWDZHJlRJUjhGNjQtVlJSREEoI0UgQElAQAorTTZEQS0wNC0sMzIgT0o6KkxIUkREKkRFKzJVITxNVCRJRVIoSylBSEFBNFhVJjNFISdDNEEqIjRcL0lHIQorTVkpRzNFQyxHWVw5Lzg+J1ZfT19bUF9QIl9QI1tHQUhOLzVINioxVEkmVDUhTFI9VTUjLEAqQiQ9N0pUSQorTSdBSEIpMiQ/KCMoOycyKD8oVSVGOTIqKjVUPTtGOjhGKENcRztLXEgoMjRWLkVAQDU1OTM2JVU8OSYoRQorTShYWjlBUyxAKSMlKTVWXks5IyUhMUJBJzBCQENBRTomQVdcXjVCKE0vMkxYLkQpR0YqSThJKFRKKFxfJworTTRFMT05VlFXPEdPPyA9VCFYMCNbSSFYVDJGLDIqMVRBJjRRKE1BWUQyIyw9KVJARTk7MEknITxCKUIkQQorTSojQDgmUihBKFUhRjkhWjQ3NSFGR0o0QigkME08PCBJJzFUTy8lVD4yNEkpMzUpMDU1PEQqKT5FQ1M4PQorTSgiWSM0Jj5CNzJMVC5BQFcsQiBAQiVOLkJXUFk0MVRHLiIsUi0zXVpIW01QSzkoSihcVlouM10kNFVRRworTTlHO0IgPkAhWkAjW0xSOFk1VyQ4LEI4SCc0TTFSIkFBMTNARyxTLEs7S1xSKDFcSywySEcqQ1xAKCI8RQorTSpEXT04Mi5HO0VRUEpLLEcpJERSPFxMTChSJEMuRkhDMSQtITBUXSsyVFBBKzo+Wkk0MEcpQlhcMVYuQgorTTUiWFUtMUhZKkFQQEMmPipBR1BXM0FMSi1BXE0sU14nT006I1E6JFEqTkcnLSNdMDY2IUs+WFtcIE9cIAorTV5ZKD0rQzE1JEI4QSoyIFYsKyxKNjcgRSkiMDwmJVJBKzFQNykiJEQnQURDJSFURCcyKF86NkRBQDQ4RgorTTJXXkcoMVxSK0VeXikyIEIoQ1k5M0NJOTU1UTU2VS0+KiFWLkZVPVcmUjBDL1UqR0glSS0wQ0k0MEJASAorTUZUPjE/RUM5MDUsSC0jMFYtRCEkNCg6MzEpVEYoQi8zTFdFL1guJ0JXTjM0WDArOyAvTjInIyBeNkEoQworTScyND4uUz5VKURZRCoyLDwoQVlDSiJUOiUiMEIpIVg+KkEoOSgxVEQwNkVHJ0hVMCs1NiRKIVg8LCJRPQorTU9CND4nUVRXNDQwUjNURS4yRSEoNFIsQUYqNTo+IUxCKFNFKElaIS4yU0hLMFMkPSkpVTNHKEU7VDNRLgorTShSXE8rQyBbMDVeOEhFKjwoUiRBVCpZUjItQzlWTTs5Uy40IVogJ0YgKUpDKiNBKDlBTEsoUkxCL0QvKgorTStEVUcsMlxKKlI1TExTOD8nICxNV0I0QSpROD4qMjhIL1YhQygqIUAuNV4wTTI4Ri0yWUFRUlhDKDFMVgorTTMzWE4yNCklMCQ4XjIyJElKK0FKQTIoRCojMSJMKjUpMzNAQS4iQD0qOiU4SVhFPVVTRSsoMlRNKkJMWAorTS9WTk1ORi5TK1IgRlsrTUcxXjtJWk47RlcvSCJfUCNbRTFQSCwlKDEoMVhCJyJAN0szLSw8QlBDKiIwNworTSg4JFAnQUhBKSI4PiRBPDQmQiQ/KSQ1TDlCNU4uMUxROSpQRChCXEEkVERAJ0IkQiw0QTYuNkkyOCYpOAorTTVWOEgoKFRTPzBcQSgkPSk0VVVNM0JdKTk0NFEyKlk0R1g9MTo8IFk1QkBXLEJMVjAzRTQ6NjVKKDIgQworTSk9Llc3Ulc5Vl1PPFdeK0MgPiAhV0AjW0UhREgtVTgxJ0FIPiZCTDtMUzUnPCJYQikySD0qKEBQJyE8QQorTSkyOD4lIUgwJUFYPylEPUw5IV1YMEFcWzo6VEEmUkA+JERMQCchWD0qRCEsLDYhJjRFPS0zJUxDKEk4XAorTT9AXD8nJD0kMlVdTTBCVSE0QzhIMishO0soXTg7O1RUNDIsUisyLE8vIzk7PFZZUSghVEEoXTpYNzJXPQorTVg+J0JZTjtKID5EIVkwI1VIUixPMCYgOilCIEQnQlRDUENFIjsjOE4sMyxELDksWSgxXEosIlxFJiFQNQorTSZSOEgqRDVDOCIiKjQiTSU9O0hJKUJcPCNVJEkoMiA7KjNRJis1SF8yNFUjMEUkQSpKMSpCMUBEKDUhIgorTTE2PVIvMlxfMTJQSDQ7MURPOi03OitcUjNSJFAqUiRNLkM5REBXWVwrQjRDKi8jJTVTK1kiL1wgXik0PgorTSlCNSkkUiA8JkFERiZaTEw5OFBTKjIsQiRDKSEoQVw5KDFYQSdBJDYlQSxAKEI0SjwmXEU4VDxFLSROVAorTSlSMEEpJl1AJiFIOShRWSw4Mlk8NEVZMjZFRT4rQVklPTFERShCKUFDNFEzRzRUTzElUFI2KVEwSig5WgorTTFFPVAvRThPMDMsSCokIEUmIzkkJ1IsQCgyMzBGVzkvVz4jQVkgL0IgTjggXlkkOikiTS0kUVQ4JUE8RQorTSY7IE84ODxQKiIwSCVDRSgoQVQ2KDFcQydAXDIkIFw9KEI8TDwmVD47JFhGLlUiVSkhVD0pVzVEJiFANgorTSdBPSQ1UjkyMUUhJzNUWTMpMVUsPlFEQydBUUFCNDk4R1QkTS8kWEs2SVU2TFkqIzJFTVItVFxKLyJYQAorTSgzSEImQ0klJzIkPidSKzRHNzEtV14nQlk+R0laQCtLIC9CQChCRFI1UVBFJ0FYOykhWl0sNUYiLiMwTworTSwxWSI0UkxCJ0JISipSNDQlUTQ0KTJMSypGPUknV1E6LDQxPFBCUEYoUkVcO0IkPSYhUDYwJSRCMyNdJworTS80NSQyMjxJNigwPilSLEE8KFkhNzosXCtTSSUqRiJINlwiRUNUKTM8IzkuKiNITCdCIFspIVkiNCIkRQorTShCLEZaOi1MNE83Wl5fWCVfUCNbQzFcQCgkIC4nUUw7JkI5LElDKU41MkxHKCIkMygiVDEpQUxCKTIgQworTSUhWDQkUVg+KTNBUjoyJTk0IjxPKVs4TChDJVszUFRAKVM0PislNUY1JiEtNjY5ODcmNEcpNjwxKSIkQAorTSc4UzsxRToyMFMtNyk4OkM2SVFeQlVRKS0lISc2QihfLDJMUDEiREMsS1BLKDFcQykqTU86Mlc4Vi1XQAorTVdeP0YgPjwhWSAjW0IhQDwpNCguJyE8OCZSMSxJUyFIM1I8SCkiNDUqIzwzKSFEQilCIEAkITguI1FQPgorTSkzSVI5UUlCNTI8VytLREkoIzoiNjEkQCkzKDkpNFU8MkUxITJVSS00NTw+KEZMNihBWDwlSFc4MDVONAorTS5TIS8nWEZHNkoyK0YmNSotVTEiNTFUWSsiMEcwMjxBLEtESCdCIEMpKk1QOTJHQFheQ0tZLk9KID5UIQorTVpAI1lFMiRBKkRINSkhVEAnQkEzTSMpQTJCXFMrQlw7K0NcOyoxWEssMkRIJUFQMyUiJEUqQ0FJOFFNTgorTTgzIFstXDxRKTNOKzoxVEkqQzA3KSRFNjEkXFowRS0jMURYQisnNDspQiBBJzlLQC9GIjgtMyErJkhOUQorTThaSjpJVjRcKlRdIDRBTFoqQixHMFJMRS48JEonQiRIKjtJUzcyX1ZfP19fXlAvXyA/VCBeWDg+J0FQVgorTSUxSDwnNkZFL0RASTNEVE0oUVxCJUFMOCQiKDwpIihEKUE0NCRBSEIoQjRNPDYwQTBWJEEuQUJSKkFdUworTSUxTEEnUiRFKDJJMzc2LT43NSlOOVYtRisyLD8oUjg8JjEyVFVESS5DU1FXNjZFXD0qNi1BNUEpMFM4WworTUE1JEotMkBPK1NHQCtBWjonIihKRjkzKEo9L0NWXVs+V14rQ1hAK0MgL01cJVFMOi0hLDgmQV1OSlQtKgorTSlUUSgqUiw/KEEoQCkxKD4mQjBEKEIoMSQhIDgoIiBCKlclRCZUXUQnM1g+TVI8QD0xOD0nMVBBJzFAQQorTTIlJTMzRFUiN1VFNjYiOD8mUVxEJkE8Mk1NJSQ0SSRZPCUhSD9XQktFKFE8MzQoVS5YRS8pIlxDKzIwXAorTVgyQDxGUUQ8KlomOVI6VzdZTitHWV5DSlpeSCJaUCNVQzIgPSdTRDcnIVhDPFsxMDRCRSQwUyBKKUJEOAorTShSNDYoUVhLKyI8RyVBNDQnIjBEKkJVSDcxWTY8QihYKFwwTyhXVEMpMihEKiIkOCg0PS4zNDklLkVNLworTTFUXEcpIiBEKUFYOyVbSz4xNUo3LjZdMDk3XiBPKV43OSQ8VypDMiMyMjRSKDI8Qy5OMEsoOjhBJ1JaQworTUctOllYP0NbIT9eIV9AJ18gP1ggXlc4PCYxNEolQUA6MkJETC9EKEMzNiRFKSFcRSUhODUkUTA5J1IwPworTShBLDgoIjBBKDIoRjwmSEEuVVg6MTFFPCdSIDYnQihEJyFMPypELS83NUUxNzZVOThFXUEvIjw/J1dQRAorTSYxRjZJJEktQkQ7PVg5QTdIWVVUMUQpJi1UKjUtM1xeJlNAXS1ETzUrMUBQKTE8PTknJydLXU81Vj1XPgorTVdeK0NYQCdCID4sIF5WUDUlQSxIJSE4ODQiXE4vJCBAMjVMQykhXEUkITw6JDEoNydSOD8oISQ2KCIwQQorTSgxXEQ8Jkg7MVYkNjExSUIpIVwyJkFcPiYxTDcoQ00lNDRNIzNVXSw1NTE3LUIsOyZXREElUT44R1Q1MgorTUJEKzVWSF00SypFWzMkMSctVCo1LTNUWCUzLFsqVFs1KUE8UCgxLEA6RzswTi4zPlhOO0daLktLWkAnSgorTSA+TCBMV1Q+JiFATSYhSDw2M0BUMDQ0QjA1OEgqUjhMJUFIPCUxODspQlhGKTE4OykyREYpQjxGOVYsPgorTTNGXDswIU1HKUFYNyhALEFPUig7KCNEXzJEKFoxRThfMiRFLS1SQEAoKCRJJyFOPktELTdENENDWTklPAorTU8rUV0yM1xZK0NGLitDPFkmIyRVKkUjPCkxOFcpUUA+OVdHQFNPU1hfIDdfQD9YIV9AJ18gKV1HJ1EwNgorTScxLDgmIUg/L0NNISg1OTotIihEKFEwNSRRMDAnQVBKJ1IoPSEiJzgpIjROOlZQQyonNDclJUExJyFMQQorTSdRXEMmUihJK0NRLTQ1PT82NVE2NSY+ODBCJEgpJDg9JjFTMlk0ST5ARVs6V01LQUg3QS0wNDxdMkhYWQorTTM0TEhIQ0hWLzU/OTIpIi9DOEFHOSVbM1Q9NzhXPVc8V14vQFdAK0IgKiE9JiEkNCZRJDYlQVA/L0NQXQorTSZVITIsIihEKFEoMyQxKC4nIVBMJ1IoPSgwLENWIjhCKyZNTCczMVgkUT09NiFQOCcxTDsnMUBCKDI4VAorTTBUOSw1JFkxMiRBPkRTXD0pIiEjJjE4OlUtXSU4WCE6VU1XMlgqWiIzVCUnLjRKMS40UScoSVBVLSMpOQorTVYkJjJFKForOjYxRVc9Uz9YXjtGWT5DS1ouOCJaQCJAO0IkMyYyIDUmQUhEKiQsXTBRWSkzQzhJKlJINgorTSUxLDQkQiBDLSI4SSkiQCMqPSRMKkJZQjkyIFtBQUA3N1VIQyZCKEMoIihAKjI0RCtDTFwwREkkMVNZIQorTTdJJSEoQkRFM1JAPidNU1AwVjYiOC5DSVYuWl1CRFRYLiJdJUIzISEvUi4/LFJQUTc+OSpGKUYvQzYxPQorTTlOV1ZfX1glX1grXF5AJ14gP1wgTSUsPychSDUkUTA0JzIsVy8xQD42VThdKCFMQSQxMDkkQSQ7J0JAPworTSlCIEInIixCJ0IsQzhWSEgnODxUOkM8NyRBVDkmUUwjJ0wwSS9EKTU0REU0OFRRKTM6TkIuQjRAJlQ8RworTSZQXj1WJik1PUYjNFU+Mkg8JExfMjMpPEJDQS0yRDhEVlNUWC5VPzkzPE4pNjU1PTg2PzRVTTc3Vj1XOworTVdOKz9YQCtBIC9NKSYhRDgkUSQyJEE4Py1UKDQlRS0rLjIgOygxKDElQSAvJjFYSigyQEIpIiBHKUIoQworTSg2LUooQkYqLCchIiZQVDomUVA9JkFMPigzOFoyVDxfMkVFIi5TWkFHQzhBJyE9IyhRQC1HTSk9Nkc5PAorTVRNR0BLN1kxL1Q8TzVIUFwyVDkiJ000WC1DITlVVE8xRSYhPDc2KU5XXV89V14rRlkuP0pZXkghWjAnSAorTSAvTTooMUw9JiE0NiVBVEUvJDQ8JkRVKC9SPEIqITQzJiEoMycyNFIqMyBKKyJATytCSEooVUlDKTMiOAorTS03NSUoUVBCKDI8QSdSLEUpMzBUMFNUVTAkXFgsM1pLSSNMRigxUTIsQigvSj4tOzcnJUFZLi9ITkhBLAorSC5DXEE0OEBWMFNIWiddQFYrQl09WjVXQEdFXT02JTlPWy8/XV5fU19fT19fXl9YIV8wJ18gICAgCisgCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0dGFyLnRhciBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0dGFyLnRhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDAxODJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3R0YXIudGFyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90Zl9pbmhlcml0X2NoZWNrLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3RmX2luaGVyaXRfY2hlY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThiODBkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90Zl9pbmhlcml0X2NoZWNrLnB5CkBAIC0wLDAgKzEsMjUgQEAKKyMgSGVscGVyIHNjcmlwdCBmb3IgdGVzdF90ZW1wZmlsZS5weS4gIGFyZ3ZbMl0gaXMgdGhlIG51bWJlciBvZiBhIGZpbGUKKyMgZGVzY3JpcHRvciB3aGljaCBzaG91bGQgX25vdF8gYmUgb3Blbi4gIENoZWNrIHRoaXMgYnkgYXR0ZW1wdGluZyB0bworIyB3cml0ZSB0byBpdCAtLSBpZiB3ZSBzdWNjZWVkLCBzb21ldGhpbmcgaXMgd3JvbmcuCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworCit2ZXJib3NlID0gKHN5cy5hcmd2WzFdID09ICd2JykKK3RyeToKKyAgICBmZCA9IGludChzeXMuYXJndlsyXSkKKworICAgIHRyeToKKyAgICAgICAgb3Mud3JpdGUoZmQsICJibGF0IikKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICMgU3VjY2VzcyAtLSBjb3VsZCBub3Qgd3JpdGUgdG8gZmQuCisgICAgICAgIHN5cy5leGl0KDApCisgICAgZWxzZToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImZkICVkIGlzIG9wZW4gaW4gY2hpbGQiICUgZmQpCisgICAgICAgIHN5cy5leGl0KDEpCisKK2V4Y2VwdCBTdGFuZGFyZEVycm9yOgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHJhaXNlCisgICAgc3lzLmV4aXQoMSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90Zl9pbmhlcml0X2NoZWNrLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90Zl9pbmhlcml0X2NoZWNrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmFkMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RmX2luaGVyaXRfY2hlY2sucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90Zl9pbmhlcml0X2NoZWNrLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90Zl9pbmhlcml0X2NoZWNrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmFkMmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RmX2luaGVyaXRfY2hlY2sucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90aHJlYWRlZF9pbXBvcnRfaGFuZ2Vycy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90aHJlYWRlZF9pbXBvcnRfaGFuZ2Vycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzUwODc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RocmVhZGVkX2ltcG9ydF9oYW5nZXJzLnB5CkBAIC0wLDAgKzEsNDIgQEAKKyMgVGhpcyBpcyBhIGhlbHBlciBtb2R1bGUgZm9yIHRlc3RfdGhyZWFkZWRfaW1wb3J0LiAgVGhlIHRlc3QgaW1wb3J0cyB0aGlzCisjIG1vZHVsZSwgYW5kIHRoaXMgbW9kdWxlIHRyaWVzIHRvIHJ1biB2YXJpb3VzIFB5dGhvbiBsaWJyYXJ5IGZ1bmN0aW9ucyBpbgorIyB0aGVpciBvd24gdGhyZWFkLCBhcyBhIHNpZGUgZWZmZWN0IG9mIGJlaW5nIGltcG9ydGVkLiAgSWYgdGhlIHNwYXduZWQKKyMgdGhyZWFkIGRvZXNuJ3QgY29tcGxldGUgaW4gVElNRU9VVCBzZWNvbmRzLCBhbiAiYXBwZWFyZWQgdG8gaGFuZyIgbWVzc2FnZQorIyBpcyBhcHBlbmRlZCB0byB0aGUgbW9kdWxlLWdsb2JhbCBgZXJyb3JzYCBsaXN0LiAgVGhhdCBsaXN0IHJlbWFpbnMgZW1wdHkKKyMgaWYgKGFuZCBvbmx5IGlmKSBhbGwgZnVuY3Rpb25zIHRlc3RlZCBjb21wbGV0ZS4KKworVElNRU9VVCA9IDEwCisKK2ltcG9ydCB0aHJlYWRpbmcKKworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgb3MucGF0aAorCitlcnJvcnMgPSBbXQorCisjIFRoaXMgY2xhc3MgbWVyZWx5IHJ1bnMgYSBmdW5jdGlvbiBpbiBpdHMgb3duIHRocmVhZCBULiAgVGhlIHRocmVhZCBpbXBvcnRpbmcKKyMgdGhpcyBtb2R1bGUgaG9sZHMgdGhlIGltcG9ydCBsb2NrLCBzbyBpZiB0aGUgZnVuY3Rpb24gY2FsbGVkIGJ5IFQgdHJpZXMKKyMgdG8gZG8gaXRzIG93biBpbXBvcnRzIGl0IHdpbGwgYmxvY2sgd2FpdGluZyBmb3IgdGhpcyBtb2R1bGUncyBpbXBvcnQKKyMgdG8gY29tcGxldGUuCitjbGFzcyBXb3JrZXIodGhyZWFkaW5nLlRocmVhZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmN0aW9uLCBhcmdzKToKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmZ1bmN0aW9uID0gZnVuY3Rpb24KKyAgICAgICAgc2VsZi5hcmdzID0gYXJncworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5mdW5jdGlvbigqc2VsZi5hcmdzKQorCitmb3IgbmFtZSwgZnVuYywgYXJncyBpbiBbCisgICAgICAgICMgQnVnIDE0NzM3NjogIFRlbXBvcmFyeUZpbGUgaHVuZyBvbiBXaW5kb3dzLCBzdGFydGluZyBpbiBQeXRob24gMi40LgorICAgICAgICAoInRlbXBmaWxlLlRlbXBvcmFyeUZpbGUiLCB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlLCAoKSksCisKKyAgICAgICAgIyBUaGUgcmVhbCBjYXVzZSBmb3IgYnVnIDE0NzM3NjogIG50cGF0aC5hYnNwYXRoKCkgY2F1c2VkIHRoZSBoYW5nLgorICAgICAgICAoIm9zLnBhdGguYWJzcGF0aCIsIG9zLnBhdGguYWJzcGF0aCwgKCcuJywpKSwKKyAgICAgICAgXToKKworICAgIHQgPSBXb3JrZXIoZnVuYywgYXJncykKKyAgICB0LnN0YXJ0KCkKKyAgICB0LmpvaW4oVElNRU9VVCkKKyAgICBpZiB0LmlzX2FsaXZlKCk6CisgICAgICAgIGVycm9ycy5hcHBlbmQoIiVzIGFwcGVhcmVkIHRvIGhhbmciICUgbmFtZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90aHJlYWRlZF9pbXBvcnRfaGFuZ2Vycy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxM2E3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90aHJlYWRlZF9pbXBvcnRfaGFuZ2Vycy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxM2E3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90aW1lX2hhc2hsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGltZV9oYXNobGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjcwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGltZV9oYXNobGliLnB5CkBAIC0wLDAgKzEsODcgQEAKKyMgSXQncyBpbnRlbmRlZCB0aGF0IHRoaXMgc2NyaXB0IGJlIHJ1biBieSBoYW5kLiAgSXQgcnVucyBzcGVlZCB0ZXN0cyBvbgorIyBoYXNobGliIGZ1bmN0aW9uczsgaXQgZG9lcyBub3QgdGVzdCBmb3IgY29ycmVjdG5lc3MuCisKK2ltcG9ydCBzeXMsIHRpbWUKK2ltcG9ydCBoYXNobGliCisKKworZGVmIGNyZWF0b3JGdW5jKCk6CisgICAgcmFpc2UgUnVudGltZUVycm9yLCAiZWVrLCBjcmVhdG9yRnVuYyBub3Qgb3ZlcnJpZGRlbiIKKworZGVmIHRlc3Rfc2NhbGVkX21zZyhzY2FsZSwgbmFtZSk6CisgICAgaXRlcmF0aW9ucyA9IDEwNjIwMS9zY2FsZSAqIDIwCisgICAgbG9uZ1N0ciA9ICdaJypzY2FsZQorCisgICAgbG9jYWxDRiA9IGNyZWF0b3JGdW5jCisgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQorICAgIGZvciBmIGluIHhyYW5nZShpdGVyYXRpb25zKToKKyAgICAgICAgeCA9IGxvY2FsQ0YobG9uZ1N0cikuZGlnZXN0KCkKKyAgICBlbmQgPSB0aW1lLnRpbWUoKQorCisgICAgcHJpbnQgKCclMi4yZicgJSAoZW5kLXN0YXJ0KSksICJzZWNvbmRzIiwgaXRlcmF0aW9ucywgIngiLCBsZW4obG9uZ1N0ciksICJieXRlcyIsIG5hbWUKKworZGVmIHRlc3RfY3JlYXRlKCk6CisgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQorICAgIGZvciBmIGluIHhyYW5nZSgyMDAwMCk6CisgICAgICAgIGQgPSBjcmVhdG9yRnVuYygpCisgICAgZW5kID0gdGltZS50aW1lKCkKKworICAgIHByaW50ICgnJTIuMmYnICUgKGVuZC1zdGFydCkpLCAic2Vjb25kcyIsICdbMjAwMDAgY3JlYXRpb25zXScKKworZGVmIHRlc3RfemVybygpOgorICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKKyAgICBmb3IgZiBpbiB4cmFuZ2UoMjAwMDApOgorICAgICAgICB4ID0gY3JlYXRvckZ1bmMoKS5kaWdlc3QoKQorICAgIGVuZCA9IHRpbWUudGltZSgpCisKKyAgICBwcmludCAoJyUyLjJmJyAlIChlbmQtc3RhcnQpKSwgInNlY29uZHMiLCAnWzIwMDAwICIiIGRpZ2VzdHNdJworCisKKworaE5hbWUgPSBzeXMuYXJndlsxXQorCisjCisjIHNldHVwIG91ciBjcmVhdG9yRnVuYyB0byB0ZXN0IHRoZSByZXF1ZXN0ZWQgaGFzaAorIworaWYgaE5hbWUgaW4gKCdfbWQ1JywgJ19zaGEnKToKKyAgICBleGVjICdpbXBvcnQgJytoTmFtZQorICAgIGV4ZWMgJ2NyZWF0b3JGdW5jID0gJytoTmFtZSsnLm5ldycKKyAgICBwcmludCAidGVzdGluZyBzcGVlZCBvZiBvbGQiLCBoTmFtZSwgImxlZ2FjeSBpbnRlcmZhY2UiCitlbGlmIGhOYW1lID09ICdfaGFzaGxpYicgYW5kIGxlbihzeXMuYXJndikgPiAzOgorICAgIGltcG9ydCBfaGFzaGxpYgorICAgIGV4ZWMgJ2NyZWF0b3JGdW5jID0gX2hhc2hsaWIuJXMnICUgc3lzLmFyZ3ZbMl0KKyAgICBwcmludCAidGVzdGluZyBzcGVlZCBvZiBfaGFzaGxpYi4lcyIgJSBzeXMuYXJndlsyXSwgZ2V0YXR0cihfaGFzaGxpYiwgc3lzLmFyZ3ZbMl0pCitlbGlmIGhOYW1lID09ICdfaGFzaGxpYicgYW5kIGxlbihzeXMuYXJndikgPT0gMzoKKyAgICBpbXBvcnQgX2hhc2hsaWIKKyAgICBleGVjICdjcmVhdG9yRnVuYyA9IGxhbWJkYSB4PV9oYXNobGliLm5ldyA6IHgoJXIpJyAlIHN5cy5hcmd2WzJdCisgICAgcHJpbnQgInRlc3Rpbmcgc3BlZWQgb2YgX2hhc2hsaWIubmV3KCVyKSIgJSBzeXMuYXJndlsyXQorZWxpZiBoYXNhdHRyKGhhc2hsaWIsIGhOYW1lKSBhbmQgY2FsbGFibGUoZ2V0YXR0cihoYXNobGliLCBoTmFtZSkpOgorICAgIGNyZWF0b3JGdW5jID0gZ2V0YXR0cihoYXNobGliLCBoTmFtZSkKKyAgICBwcmludCAidGVzdGluZyBzcGVlZCBvZiBoYXNobGliLiIraE5hbWUsIGdldGF0dHIoaGFzaGxpYiwgaE5hbWUpCitlbHNlOgorICAgIGV4ZWMgImNyZWF0b3JGdW5jID0gbGFtYmRhIHg9aGFzaGxpYi5uZXcgOiB4KCVyKSIgJSBoTmFtZQorICAgIHByaW50ICJ0ZXN0aW5nIHNwZWVkIG9mIGhhc2hsaWIubmV3KCVyKSIgJSBoTmFtZQorCit0cnk6CisgICAgdGVzdF9jcmVhdGUoKQorZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgcHJpbnQKKyAgICBwcmludCAicGFzcyBhcmd1bWVudChzKSBuYW1pbmcgdGhlIGhhc2ggdG8gcnVuIGEgc3BlZWQgdGVzdCBvbjoiCisgICAgcHJpbnQgIiAnX21kNScgYW5kICdfc2hhJyB0ZXN0IHRoZSBsZWdhY3kgYnVpbHRpbiBtZDUgYW5kIHNoYSIKKyAgICBwcmludCAiICdfaGFzaGxpYicgJ29wZW5zc2xfaE5hbWUnICdmYXN0JyB0ZXN0cyB0aGUgYnVpbHRpbiBfaGFzaGxpYiIKKyAgICBwcmludCAiICdfaGFzaGxpYicgJ2hOYW1lJyB0ZXN0cyBidWlsdGluIF9oYXNobGliLm5ldyhzaGFGT08pIgorICAgIHByaW50ICIgJ2hOYW1lJyB0ZXN0cyB0aGUgaGFzaGxpYi5oTmFtZSgpIGltcGxlbWVudGF0aW9uIGlmIGl0IGV4aXN0cyIKKyAgICBwcmludCAiICAgICAgICAgb3RoZXJ3aXNlIGl0IHVzZXMgaGFzaGxpYi5uZXcoaE5hbWUpLiIKKyAgICBwcmludAorICAgIHJhaXNlCisKK3Rlc3RfemVybygpCit0ZXN0X3NjYWxlZF9tc2coc2NhbGU9MTA2MjAxLCBuYW1lPSdbaHVnZSBkYXRhXScpCit0ZXN0X3NjYWxlZF9tc2coc2NhbGU9MTA2MjAsIG5hbWU9J1tsYXJnZSBkYXRhXScpCit0ZXN0X3NjYWxlZF9tc2coc2NhbGU9MTA2MiwgbmFtZT0nW21lZGl1bSBkYXRhXScpCit0ZXN0X3NjYWxlZF9tc2coc2NhbGU9NDI0LCBuYW1lPSdbNCpzbWFsbCBkYXRhXScpCit0ZXN0X3NjYWxlZF9tc2coc2NhbGU9MzM2LCBuYW1lPSdbMypzbWFsbCBkYXRhXScpCit0ZXN0X3NjYWxlZF9tc2coc2NhbGU9MjEyLCBuYW1lPSdbMipzbWFsbCBkYXRhXScpCit0ZXN0X3NjYWxlZF9tc2coc2NhbGU9MTA2LCBuYW1lPSdbc21hbGwgZGF0YV0nKQordGVzdF9zY2FsZWRfbXNnKHNjYWxlPWNyZWF0b3JGdW5jKCkuZGlnZXN0X3NpemUsIG5hbWU9J1tkaWdlc3Rfc2l6ZSBkYXRhXScpCit0ZXN0X3NjYWxlZF9tc2coc2NhbGU9MTAsIG5hbWU9J1t0aW55IGRhdGFdJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90aW1lX2hhc2hsaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RpbWVfaGFzaGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyNDhiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90aW1lX2hhc2hsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90aW1lX2hhc2hsaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RpbWVfaGFzaGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyNDhiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90aW1lX2hhc2hsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90b2tlbml6ZV90ZXN0cy50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvdG9rZW5pemVfdGVzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZjNiZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdG9rZW5pemVfdGVzdHMudHh0CkBAIC0wLDAgKzEsMTc4IEBACisjIFRlc3RzIGZvciB0aGUgJ3Rva2VuaXplJyBtb2R1bGUuCisjIExhcmdlIGJpdHMgc3RvbGVuIGZyb20gdGVzdF9ncmFtbWFyLnB5LiAKKworIyBDb21tZW50cworIiMiCisjJworIyIKKyNcCisgICAgICAgIworICAgICMgYWJjCisnJycjCisjJycnCisKK3ggPSAxICAjCisKKyMgQmFsYW5jaW5nIGNvbnRpbnVhdGlvbgorCithID0gKDMsIDQsCisgIDUsIDYpCit5ID0gWzMsIDQsCisgIDVdCit6ID0geydhJzo1LAorICAnYic6Nn0KK3ggPSAobGVuKGB5YCkgKyA1KnggLSBhWworICAgMyBdCisgICAtIHggKyBsZW4oeworICAgfQorICAgICkKKyAgKQorCisjIEJhY2tzbGFzaCBtZWFucyBsaW5lIGNvbnRpbnVhdGlvbjoKK3ggPSAxIFwKKysgMQorCisjIEJhY2tzbGFzaCBkb2VzIG5vdCBtZWFucyBjb250aW51YXRpb24gaW4gY29tbWVudHMgOlwKK3ggPSAwCisKKyMgT3JkaW5hcnkgaW50ZWdlcnMKKzB4ZmYgPD4gMjU1CiswMzc3IDw+IDI1NQorMjE0NzQ4MzY0NyAgICE9IDAxNzc3Nzc3Nzc3NworLTIxNDc0ODM2NDctMSAhPSAwMjAwMDAwMDAwMDAKKzAzNzc3Nzc3Nzc3NyAhPSAtMQorMHhmZmZmZmZmZiAhPSAtMQorCisjIExvbmcgaW50ZWdlcnMKK3ggPSAwTAoreCA9IDBsCit4ID0gMHhmZmZmZmZmZmZmZmZmZmZmTAoreCA9IDB4ZmZmZmZmZmZmZmZmZmZmZmwKK3ggPSAwNzc3Nzc3Nzc3Nzc3Nzc3NzdMCit4ID0gMDc3Nzc3Nzc3Nzc3Nzc3Nzc3bAoreCA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MEwKK3ggPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBsCisKKyMgRmxvYXRpbmctcG9pbnQgbnVtYmVycworeCA9IDMuMTQKK3ggPSAzMTQuCit4ID0gMC4zMTQKKyMgWFhYIHggPSAwMDAuMzE0Cit4ID0gLjMxNAoreCA9IDNlMTQKK3ggPSAzRTE0Cit4ID0gM2UtMTQKK3ggPSAzZSsxNAoreCA9IDMuZTE0Cit4ID0gLjNlMTQKK3ggPSAzLjFlNAorCisjIFN0cmluZyBsaXRlcmFscworeCA9ICcnOyB5ID0gIiI7Cit4ID0gJ1wnJzsgeSA9ICInIjsKK3ggPSAnIic7IHkgPSAiXCIiOworeCA9ICJkb2Vzbid0IFwic2hyaW5rXCIgZG9lcyBpdCIKK3kgPSAnZG9lc25cJ3QgInNocmluayIgZG9lcyBpdCcKK3ggPSAiZG9lcyBcInNocmlua1wiIGRvZXNuJ3QgaXQiCit5ID0gJ2RvZXMgInNocmluayIgZG9lc25cJ3QgaXQnCit4ID0gIiIiCitUaGUgInF1aWNrIgorYnJvd24gZm94CitqdW1wcyBvdmVyCit0aGUgJ2xhenknIGRvZy4KKyIiIgoreSA9ICdcblRoZSAicXVpY2siXG5icm93biBmb3hcbmp1bXBzIG92ZXJcbnRoZSBcJ2xhenlcJyBkb2cuXG4nCit5ID0gJycnCitUaGUgInF1aWNrIgorYnJvd24gZm94CitqdW1wcyBvdmVyCit0aGUgJ2xhenknIGRvZy4KKycnJzsKK3kgPSAiXG5cCitUaGUgXCJxdWlja1wiXG5cCiticm93biBmb3hcblwKK2p1bXBzIG92ZXJcblwKK3RoZSAnbGF6eScgZG9nLlxuXAorIjsKK3kgPSAnXG5cCitUaGUgXCJxdWlja1wiXG5cCiticm93biBmb3hcblwKK2p1bXBzIG92ZXJcblwKK3RoZSBcJ2xhenlcJyBkb2cuXG5cCisnOworeCA9IHInXFwnICsgUidcXCcKK3ggPSByJ1wnJyArICcnCit5ID0gcicnJworZm9vIGJhciBcXAorYmF6JycnICsgUicnJworZm9vJycnCit5ID0gciIiImZvbworYmFyIFxcIGJhegorIiIiICsgUicnJ3NwYW0KKycnJworeCA9IHUnYWJjJyArIFUnQUJDJworeSA9IHUiYWJjIiArIFUiQUJDIgoreCA9IHVyJ2FiYycgKyBVcidBQkMnICsgdVInQUJDJyArIFVSJ0FCQycKK3kgPSB1ciJhYmMiICsgVXIiQUJDIiArIHVSIkFCQyIgKyBVUiJBQkMiCit4ID0gdXInXFwnICsgVVInXFwnCit4ID0gdXInXCcnICsgJycKK3kgPSB1cicnJworZm9vIGJhciBcXAorYmF6JycnICsgVVInJycKK2ZvbycnJworeSA9IFVyIiIiZm9vCitiYXIgXFwgYmF6CisiIiIgKyB1UicnJ3NwYW0KKycnJworCisjIEluZGVudGF0aW9uCitpZiAxOgorICAgIHggPSAyCitpZiAxOgorICAgICAgICB4ID0gMgoraWYgMToKKyAgICB3aGlsZSAwOgorICAgICBpZiAwOgorICAgICAgICAgICB4ID0gMgorICAgICB4ID0gMgoraWYgMDoKKyAgaWYgMjoKKyAgIHdoaWxlIDA6CisgICAgICAgIGlmIDE6CisgICAgICAgICAgeCA9IDIKKworIyBPcGVyYXRvcnMKKworZGVmIGQyMihhLCBiLCBjPTEsIGQ9Mik6IHBhc3MKK2RlZiBkMDF2KGE9MSwgKnJlc3R0LCAqKnJlc3RkKTogcGFzcworCisoeCwgeSkgPD4gKHsnYSc6MX0sIHsnYic6Mn0pCisKKyMgY29tcGFyaXNvbgoraWYgMSA8IDEgPiAxID09IDEgPj0gMSA8PSAxIDw+IDEgIT0gMSBpbiAxIG5vdCBpbiAxIGlzIDEgaXMgbm90IDE6IHBhc3MKKworIyBiaW5hcnkKK3ggPSAxICYgMQoreCA9IDEgXiAxCit4ID0gMSB8IDEKKworIyBzaGlmdAoreCA9IDEgPDwgMSA+PiAxCisKKyMgYWRkaXRpdmUKK3ggPSAxIC0gMSArIDEgLSAxICsgMQorCisjIG11bHRpcGxpY2F0aXZlCit4ID0gMSAvIDEgKiAxICUgMQorCisjIHVuYXJ5Cit4ID0gfjEgXiAxICYgMSB8IDEgJiAxIF4gLTEKK3ggPSAtMSoxLzEgKyAxKjEgLSAtLS0xKjEKKworIyBzZWxlY3RvcgoraW1wb3J0IHN5cywgdGltZQoreCA9IHN5cy5tb2R1bGVzWyd0aW1lJ10udGltZSgpCisKK0BzdGF0aWNtZXRob2QKK2RlZiBmb28oKTogcGFzcworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90cmFjZWRtb2R1bGVzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZmE0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDQgQEAKKyIiIlRoaXMgcGFja2FnZSBjb250YWlucyBtb2R1bGVzIHRoYXQgaGVscCB0ZXN0aW5nIHRoZSB0cmFjZS5weSBtb2R1bGUuIE5vdGUKK3RoYXQgdGhlIGV4YWN0IGxvY2F0aW9uIG9mIGZ1bmN0aW9ucyBpbiB0aGVzZSBtb2R1bGVzIGlzIGltcG9ydGFudCwgYXMgdHJhY2UucHkKK3Rha2VzIHRoZSByZWFsIGxpbmUgbnVtYmVycyBpbnRvIGFjY291bnQuCisiIiIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90cmFjZWRtb2R1bGVzL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90cmFjZWRtb2R1bGVzL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzNhZTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RyYWNlZG1vZHVsZXMvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90cmFjZWRtb2R1bGVzL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90cmFjZWRtb2R1bGVzL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzNhZTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RyYWNlZG1vZHVsZXMvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90cmFjZWRtb2R1bGVzL3Rlc3Rtb2QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy90ZXN0bW9kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Mjc3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy90ZXN0bW9kLnB5CkBAIC0wLDAgKzEsOSBAQAorZGVmIGZ1bmMoeCk6CisgICAgYiA9IHggKyAxCisgICAgcmV0dXJuIGIgKyAyCisKK2RlZiBmdW5jMigpOgorICAgICIiIlRlc3QgZnVuY3Rpb24gZm9yIGlzc3VlIDk5MzYgIiIiCisgICAgcmV0dXJuICgxLAorICAgICAgICAgICAgMiwKKyAgICAgICAgICAgIDMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy90ZXN0bW9kLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90cmFjZWRtb2R1bGVzL3Rlc3Rtb2QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYzBlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy90ZXN0bW9kLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy90ZXN0bW9kLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90cmFjZWRtb2R1bGVzL3Rlc3Rtb2QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYzBlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy90ZXN0bW9kLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvd2FybmluZ190ZXN0cy5weSBiL2xpYi9weXRob24yLjcvdGVzdC93YXJuaW5nX3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNTE5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvd2FybmluZ190ZXN0cy5weQpAQCAtMCwwICsxLDkgQEAKKyMgSGVscGVyIG1vZHVsZSBmb3IgdGVzdGluZyB0aGUgc2tpcG1vZHVsZXMgYXJndW1lbnQgb2Ygd2FybmluZ3Mud2FybigpCisKK2ltcG9ydCB3YXJuaW5ncworCitkZWYgb3V0ZXIobWVzc2FnZSwgc3RhY2tsZXZlbD0xKToKKyAgICBpbm5lcihtZXNzYWdlLCBzdGFja2xldmVsKQorCitkZWYgaW5uZXIobWVzc2FnZSwgc3RhY2tsZXZlbD0xKToKKyAgICB3YXJuaW5ncy53YXJuKG1lc3NhZ2UsIHN0YWNrbGV2ZWw9c3RhY2tsZXZlbCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC93YXJuaW5nX3Rlc3RzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC93YXJuaW5nX3Rlc3RzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDMxOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3dhcm5pbmdfdGVzdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC93YXJuaW5nX3Rlc3RzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC93YXJuaW5nX3Rlc3RzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDMxOWEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3dhcm5pbmdfdGVzdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC93aW5fY29uc29sZV9oYW5kbGVyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3dpbl9jb25zb2xlX2hhbmRsZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmY2VlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC93aW5fY29uc29sZV9oYW5kbGVyLnB5CkBAIC0wLDAgKzEsNDkgQEAKKyIiIlNjcmlwdCB1c2VkIHRvIHRlc3Qgb3Mua2lsbCBvbiBXaW5kb3dzLCBmb3IgaXNzdWUgIzEyMjAyMTIKKworVGhpcyBzY3JpcHQgaXMgc3RhcnRlZCBhcyBhIHN1YnByb2Nlc3MgaW4gdGVzdF9vcyBhbmQgaXMgdXNlZCB0byB0ZXN0IHRoZQorQ1RSTF9DX0VWRU5UIGFuZCBDVFJMX0JSRUFLX0VWRU5UIHNpZ25hbHMsIHdoaWNoIHJlcXVpcmVzIGEgY3VzdG9tIGhhbmRsZXIKK3RvIGJlIHdyaXR0ZW4gaW50byB0aGUga2lsbCB0YXJnZXQuCisKK1NlZSBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM2ODUwNDklMjh2PVZTLjg1JTI5LmFzcHggZm9yIGEKK3NpbWlsYXIgZXhhbXBsZSBpbiBDLgorIiIiCisKK2Zyb20gY3R5cGVzIGltcG9ydCB3aW50eXBlcywgV0lORlVOQ1RZUEUKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBjdHlwZXMKK2ltcG9ydCBtbWFwCitpbXBvcnQgc3lzCisKKyMgRnVuY3Rpb24gcHJvdG90eXBlIGZvciB0aGUgaGFuZGxlciBmdW5jdGlvbi4gUmV0dXJucyBCT09MLCB0YWtlcyBhIERXT1JELgorSGFuZGxlclJvdXRpbmUgPSBXSU5GVU5DVFlQRSh3aW50eXBlcy5CT09MLCB3aW50eXBlcy5EV09SRCkKKworZGVmIF9jdHJsX2hhbmRsZXIoc2lnKToKKyAgICAiIiJIYW5kbGUgYSBzaWcgZXZlbnQgYW5kIHJldHVybiAwIHRvIHRlcm1pbmF0ZSB0aGUgcHJvY2VzcyIiIgorICAgIGlmIHNpZyA9PSBzaWduYWwuQ1RSTF9DX0VWRU5UOgorICAgICAgICBwYXNzCisgICAgZWxpZiBzaWcgPT0gc2lnbmFsLkNUUkxfQlJFQUtfRVZFTlQ6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBwcmludCgiVU5LTk9XTiBFVkVOVCIpCisgICAgcmV0dXJuIDAKKworY3RybF9oYW5kbGVyID0gSGFuZGxlclJvdXRpbmUoX2N0cmxfaGFuZGxlcikKKworCitTZXRDb25zb2xlQ3RybEhhbmRsZXIgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLlNldENvbnNvbGVDdHJsSGFuZGxlcgorU2V0Q29uc29sZUN0cmxIYW5kbGVyLmFyZ3R5cGVzID0gKEhhbmRsZXJSb3V0aW5lLCB3aW50eXBlcy5CT09MKQorU2V0Q29uc29sZUN0cmxIYW5kbGVyLnJlc3R5cGUgPSB3aW50eXBlcy5CT09MCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgIyBBZGQgb3VyIGNvbnNvbGUgY29udHJvbCBoYW5kbGluZyBmdW5jdGlvbiB3aXRoIHZhbHVlIDEKKyAgICBpZiBub3QgU2V0Q29uc29sZUN0cmxIYW5kbGVyKGN0cmxfaGFuZGxlciwgMSk6CisgICAgICAgIHByaW50KCJVbmFibGUgdG8gYWRkIFNldENvbnNvbGVDdHJsSGFuZGxlciIpCisgICAgICAgIGV4aXQoLTEpCisKKyAgICAjIEF3YWtlbiBtYWlsIHByb2Nlc3MKKyAgICBtID0gbW1hcC5tbWFwKC0xLCAxLCBzeXMuYXJndlsxXSkKKyAgICBtWzBdID0gJzEnCisKKyAgICAjIERvIG5vdGhpbmcgYnV0IHdhaXQgZm9yIHRoZSBzaWduYWwKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvd2luX2NvbnNvbGVfaGFuZGxlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3Qvd2luX2NvbnNvbGVfaGFuZGxlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3NzY3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC93aW5fY29uc29sZV9oYW5kbGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvd2luX2NvbnNvbGVfaGFuZGxlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3Qvd2luX2NvbnNvbGVfaGFuZGxlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY3NzY3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC93aW5fY29uc29sZV9oYW5kbGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvd3JvbmdjZXJ0LnBlbSBiL2xpYi9weXRob24yLjcvdGVzdC93cm9uZ2NlcnQucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOTJmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvd3JvbmdjZXJ0LnBlbQpAQCAtMCwwICsxLDMyIEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlDWEFJQkFBS0JnUUM4OVpOeGpUZ1dncTdaMWcwdEo2NXcrazdsTkFqNUlnakxiMTU1VWtVcnowWHNIRG5ICitGbGJzVlVnMlh0azYrYm8yVUVZSXpON2NJbTVJbXBteVcvMnowSjFJRFZEbHZSMnhKNjU5eHJFMHY1YzJjQjZUCitmOWxuTlR3cFNvZUsyNE5kN0p3cTRqOXZrOTVmTHJkcXNCcTAvS1Zsc0NYZWl4Uy9DYXFxZHVYZnZ3SURBUUFCCitBb0dBUUZrbzR1eUNnemZ4cjRFemI0TXA1cE4zTnBxbnk1K0pleTNyOEVqU0FYOU9nbitDTllnb0JjZHRGZ2JxCisxeWlmLzBzSzdvaEdCSlU5RlVDQXdycU5CSTlaSEI2cmN5N2R4K2dVTE9tUkJHY2tsbjFvNVMxK3NtVmRtT3NXCis3elVWTEJWQnlLdU5XcVRZRmx6ZlZkNnM0aWlYdEFFMmlIbjNHQ3lZZGxJQ3dyRUNRUURoTVFWeEhkM0VGYnpnCitTRm1KQlRBUmxaMkdLQTNjMWcvaDkvWGJrRVBROS9Sd0kzdm5qSjJSYVNuamxmb0xsOFRPY2YwdU9HYk9FeUZlCisxOVJ2Q0xYakFrRUExcytVRTV6aUYrWVZrVzNXb2xEQ1Eya1E1V0c5K2NjZk5lYmZoNmI2N0I3TG41aUcwU2JnCitreTljanNPM2piTUpRdGx6QVFuSDE4NTBvUkQ1R2k1MWRRSkFJYkhDRExEWlU5T2sxVEkrSTJCaFZ1QTZGNjY2CitsRVo3VGVaYUpTWXEzNE9hVVlVZHJ3RzlPZHF3WjlzeTlMVWF2NEVTenUybGhFUWNoQ0pyS01uMjNRSkFSZXFzCitaTEhVZVRqZlhrVms3ZEhoV1BXU2xVWjZBaG1JbEEvQVE3UGF5ZzIvOHdNL0prWkVKRVB2R1Z5a21zOWlQVXJ2CitmckFEUnIraEFHZTQzSWV3blFKQkFKV0tabGxQZ0t1RUJQd29FbGRITlM4blJ1NjFEN0h6eEV6UTJ4bmZqK05rCisyZmdmMU1BenpUUnNpa2ZHRU5oVnNWV2VxT2NpaldiNmc1Z3N5Q21sUnBjPQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ3NEQ0NBaG1nQXdJQkFnSUpBT3FZT1lGSmZFRW9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1FVXhDekFKQmdOVgorQkFZVEFrRlZNUk13RVFZRFZRUUlFd3BUYjIxbExWTjBZWFJsTVNFd0h3WURWUVFLRXhoSmJuUmxjbTVsZENCWAorYVdSbmFYUnpJRkIwZVNCTWRHUXdIaGNOTURnd05qSTJNVGd4TlRVeVdoY05NRGt3TmpJMk1UZ3hOVFV5V2pCRgorTVFzd0NRWURWUVFHRXdKQlZURVRNQkVHQTFVRUNCTUtVMjl0WlMxVGRHRjBaVEVoTUI4R0ExVUVDaE1ZU1c1MAorWlhKdVpYUWdWMmxrWjJsMGN5QlFkSGtnVEhSa01JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQgorZ1FDODlaTnhqVGdXZ3E3WjFnMHRKNjV3K2s3bE5BajVJZ2pMYjE1NVVrVXJ6MFhzSERuSEZsYnNWVWcyWHRrNgorK2JvMlVFWUl6TjdjSW01SW1wbXlXLzJ6MEoxSURWRGx2UjJ4SjY1OXhyRTB2NWMyY0I2VGY5bG5OVHdwU29lSworMjROZDdKd3E0ajl2azk1ZkxyZHFzQnEwL0tWbHNDWGVpeFMvQ2FxcWR1WGZ2d0lEQVFBQm80R25NSUdrTUIwRworQTFVZERnUVdCQlRjdE10STNFTzlPakxJMHg5Wm8yaWZrd0lpTmpCMUJnTlZIU01FYmpCc2dCVGN0TXRJM0VPOQorT2pMSTB4OVpvMmlma3dJaU5xRkpwRWN3UlRFTE1Ba0dBMVVFQmhNQ1FWVXhFekFSQmdOVkJBZ1RDbE52YldVdAorVTNSaGRHVXhJVEFmQmdOVkJBb1RHRWx1ZEdWeWJtVjBJRmRwWkdkcGRITWdVSFI1SUV4MFpJSUpBT3FZT1lGSgorZkVFb01Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnWUVBUXdhN2p5YS9EZmhhRG43RQordXNQa3BnSVg4V0NMMkIxU3FuUlRYRVpmQlBQVnEvY1VtRkd5RVZSVkFUeVNSdU13aThQWGJWY09oWFh1b2NBKworNDNXK2lJc0Q5cFhhcENaaGhPZXJDcTE4VEMxZFdLOTh2TFVzb0s4UE1qQjZlNUgvTzhicW9qdjBFZUMrZnlDdworZVNIajVqcEM4aVpLakNIQm4rbUFpNGNRNTE0PQorLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RkYXRhL3NpbXBsZS1ucy54bWwgYi9saWIvcHl0aG9uMi43L3Rlc3QveG1sdGVzdGRhdGEvc2ltcGxlLW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWYzNGIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RkYXRhL3NpbXBsZS1ucy54bWwKQEAgLTAsMCArMSw3IEBACis8P3BpIGRhdGE/PgorPCEtLSBjb21tZW50IC0tPgorPHJvb3QgeG1sbnM9J25hbWVzcGFjZSc+CisgICA8ZWxlbWVudCBrZXk9J3ZhbHVlJz50ZXh0PC9lbGVtZW50PgorICAgPGVsZW1lbnQ+dGV4dDwvZWxlbWVudD50YWlsCisgICA8ZW1wdHktZWxlbWVudC8+Cis8L3Jvb3Q+CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QveG1sdGVzdGRhdGEvc2ltcGxlLnhtbCBiL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0ZGF0YS9zaW1wbGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OGMyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QveG1sdGVzdGRhdGEvc2ltcGxlLnhtbApAQCAtMCwwICsxLDYgQEAKKzwhLS0gY29tbWVudCAtLT4KKzxyb290PgorICAgPGVsZW1lbnQga2V5PSd2YWx1ZSc+dGV4dDwvZWxlbWVudD4KKyAgIDxlbGVtZW50PnRleHQ8L2VsZW1lbnQ+dGFpbAorICAgPGVtcHR5LWVsZW1lbnQvPgorPC9yb290PgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RkYXRhL3Rlc3QueG1sIGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RkYXRhL3Rlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZjkyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QveG1sdGVzdGRhdGEvdGVzdC54bWwKQEAgLTAsMCArMSwxMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPEhUTUwgeG1sbnM6cHA9Imh0dHA6Ly93d3cuaXNvZ2VuLmNvbS9wYXVsL3Bvc3QtcHJvY2Vzc29yIj4KKzxUSVRMRT5JbnRyb2R1Y3Rpb24gdG8gWFNMPC9USVRMRT4KKzxIMT5JbnRyb2R1Y3Rpb24gdG8gWFNMPC9IMT4KKwkKKworCQorCQk8SFIvPgorCQk8SDI+T3ZlcnZpZXcKKzwvSDI+CisJCTxVTD4KKwkJCisJPExJPjEuSW50cm88L0xJPgorCisJPExJPjIuSGlzdG9yeTwvTEk+CisKKwk8TEk+My5YU0wgQmFzaWNzPC9MST4KKworCTxMST5MdW5jaDwvTEk+CisKKwk8TEk+NC5BbiBYTUwgRGF0YSBNb2RlbDwvTEk+CisKKwk8TEk+NS5YU0wgUGF0dGVybnM8L0xJPgorCisJPExJPjYuWFNMIFRlbXBsYXRlczwvTEk+CisKKwk8TEk+Ny5YU0wgRm9ybWF0dGluZyBNb2RlbAorPC9MST4KKworCQk8L1VMPgorCQorCisKKwkKKworCQorCQk8SFIvPgorCQk8SDI+SW50cm88L0gyPgorCQk8VUw+CisJCQorCTxMST5XaG8gYW0gST88L0xJPgorCisJPExJPldobyBhcmUgeW91PzwvTEk+CisKKwk8TEk+V2h5IGFyZSB3ZSBoZXJlPworPC9MST4KKworCQk8L1VMPgorCQorCisKKwkKKworCQorCQk8SFIvPgorCQk8SDI+SGlzdG9yeTogWE1MIGFuZCBTR01MPC9IMj4KKwkJPFVMPgorCQkKKwk8TEk+WE1MIGlzIGEgc3Vic2V0IG9mIFNHTUwuPC9MST4KKworCTxMST5TR01MIGFsbG93cyB0aGUgc2VwYXJhdGlvbiBvZiBhYnN0cmFjdCBjb250ZW50IGZyb20gZm9ybWF0dGluZy48L0xJPgorCisJPExJPkFsc28gb25lIG9mIFhNTCdzIHByaW1hcnkgdmlydHVlcyAoaW4gdGhlIGRvYyBwdWJsaXNoaW5nIGRvbWFpbikuCis8L0xJPgorCisJCTwvVUw+CisJCisKKworCQorCisJCisJCTxIUi8+CisJCTxIMj5IaXN0b3J5OiBXaGF0IGFyZSBzdHlsZXNoZWV0cz88L0gyPgorCQk8VUw+CisJCQorCTxMST5TdHlsZXNoZWV0cyBzcGVjaWZ5IHRoZSBmb3JtYXR0aW5nIG9mIFNHTUwvWE1MIGRvY3VtZW50cy48L0xJPgorCisJPExJPlN0eWxlc2hlZXRzIHB1dCB0aGUgJnF1b3Q7c3R5bGUmcXVvdDsgYmFjayBpbnRvIGRvY3VtZW50cy48L0xJPgorCisJPExJPk5ldyBZb3JrIFRpbWVzIGNvbnRlbnQrTllUIFN0eWxlc2hlZXQgPSBOWVQgcGFwZXIKKzwvTEk+CisKKwkJPC9VTD4KKwkKKworCisJCisKKwkKKwkJPEhSLz4KKwkJPEgyPkhpc3Rvcnk6IEZPU0k8L0gyPgorCQk8VUw+CisJCQorCTxMST5GT1NJOiAmcXVvdDtGb3JtYXR0ZWQgT3V0cHV0IFNwZWNpZmljYXRpb24gSW5zdGFuY2UmcXVvdDsKKzxVTD4KKwk8TEk+TUlMLVNURC0yODAwMQorCTwvTEk+CisKKwk8TEk+Rk9TSSdzIGFyZSBTR01MIGRvY3VtZW50cworCTwvTEk+CisKKwk8TEk+QSBzdHlsZXNoZWV0IGZvciBhbm90aGVyIGRvY3VtZW50CisJPC9MST4KKzwvVUw+PC9MST4KKworCTxMST5PYnNvbGV0ZSBidXQgaW1wbGVtZW50ZWQuLi4KKzwvTEk+CisKKwkJPC9VTD4KKwkKKworCisJCis8L0hUTUw+CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QveG1sdGVzdGRhdGEvdGVzdC54bWwub3V0IGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RkYXRhL3Rlc3QueG1sLm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGFiMWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RkYXRhL3Rlc3QueG1sLm91dApAQCAtMCwwICsxLDExNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PgorPEhUTUwgeG1sbnM6cHA9Imh0dHA6Ly93d3cuaXNvZ2VuLmNvbS9wYXVsL3Bvc3QtcHJvY2Vzc29yIj4KKzxUSVRMRT5JbnRyb2R1Y3Rpb24gdG8gWFNMPC9USVRMRT4KKzxIMT5JbnRyb2R1Y3Rpb24gdG8gWFNMPC9IMT4KKwkKKworCQorCQk8SFI+PC9IUj4KKwkJPEgyPk92ZXJ2aWV3Cis8L0gyPgorCQk8VUw+CisJCQorCTxMST4xLkludHJvPC9MST4KKworCTxMST4yLkhpc3Rvcnk8L0xJPgorCisJPExJPjMuWFNMIEJhc2ljczwvTEk+CisKKwk8TEk+THVuY2g8L0xJPgorCisJPExJPjQuQW4gWE1MIERhdGEgTW9kZWw8L0xJPgorCisJPExJPjUuWFNMIFBhdHRlcm5zPC9MST4KKworCTxMST42LlhTTCBUZW1wbGF0ZXM8L0xJPgorCisJPExJPjcuWFNMIEZvcm1hdHRpbmcgTW9kZWwKKzwvTEk+CisKKwkJPC9VTD4KKwkKKworCisJCisKKwkKKwkJPEhSPjwvSFI+CisJCTxIMj5JbnRybzwvSDI+CisJCTxVTD4KKwkJCisJPExJPldobyBhbSBJPzwvTEk+CisKKwk8TEk+V2hvIGFyZSB5b3U/PC9MST4KKworCTxMST5XaHkgYXJlIHdlIGhlcmU/Cis8L0xJPgorCisJCTwvVUw+CisJCisKKworCQorCisJCisJCTxIUj48L0hSPgorCQk8SDI+SGlzdG9yeTogWE1MIGFuZCBTR01MPC9IMj4KKwkJPFVMPgorCQkKKwk8TEk+WE1MIGlzIGEgc3Vic2V0IG9mIFNHTUwuPC9MST4KKworCTxMST5TR01MIGFsbG93cyB0aGUgc2VwYXJhdGlvbiBvZiBhYnN0cmFjdCBjb250ZW50IGZyb20gZm9ybWF0dGluZy48L0xJPgorCisJPExJPkFsc28gb25lIG9mIFhNTCdzIHByaW1hcnkgdmlydHVlcyAoaW4gdGhlIGRvYyBwdWJsaXNoaW5nIGRvbWFpbikuCis8L0xJPgorCisJCTwvVUw+CisJCisKKworCQorCisJCisJCTxIUj48L0hSPgorCQk8SDI+SGlzdG9yeTogV2hhdCBhcmUgc3R5bGVzaGVldHM/PC9IMj4KKwkJPFVMPgorCQkKKwk8TEk+U3R5bGVzaGVldHMgc3BlY2lmeSB0aGUgZm9ybWF0dGluZyBvZiBTR01ML1hNTCBkb2N1bWVudHMuPC9MST4KKworCTxMST5TdHlsZXNoZWV0cyBwdXQgdGhlICJzdHlsZSIgYmFjayBpbnRvIGRvY3VtZW50cy48L0xJPgorCisJPExJPk5ldyBZb3JrIFRpbWVzIGNvbnRlbnQrTllUIFN0eWxlc2hlZXQgPSBOWVQgcGFwZXIKKzwvTEk+CisKKwkJPC9VTD4KKwkKKworCisJCisKKwkKKwkJPEhSPjwvSFI+CisJCTxIMj5IaXN0b3J5OiBGT1NJPC9IMj4KKwkJPFVMPgorCQkKKwk8TEk+Rk9TSTogIkZvcm1hdHRlZCBPdXRwdXQgU3BlY2lmaWNhdGlvbiBJbnN0YW5jZSIKKzxVTD4KKwk8TEk+TUlMLVNURC0yODAwMQorCTwvTEk+CisKKwk8TEk+Rk9TSSdzIGFyZSBTR01MIGRvY3VtZW50cworCTwvTEk+CisKKwk8TEk+QSBzdHlsZXNoZWV0IGZvciBhbm90aGVyIGRvY3VtZW50CisJPC9MST4KKzwvVUw+PC9MST4KKworCTxMST5PYnNvbGV0ZSBidXQgaW1wbGVtZW50ZWQuLi4KKzwvTEk+CisKKwkJPC9VTD4KKwkKKworCisJCis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMDM3MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QveG1sdGVzdHMucHkKQEAgLTAsMCArMSwyMSBAQAorIyBDb252ZW5pZW5jZSB0ZXN0IG1vZHVsZSB0byBydW4gYWxsIG9mIHRoZSBYTUwtcmVsYXRlZCB0ZXN0cyBpbiB0aGUKKyMgc3RhbmRhcmQgbGlicmFyeS4KKworaW1wb3J0IHN5cworaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0CisKK3Rlc3QudGVzdF9zdXBwb3J0LnZlcmJvc2UgPSAwCisKK2RlZiBydW50ZXN0KG5hbWUpOgorICAgIF9faW1wb3J0X18obmFtZSkKKyAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1tuYW1lXQorICAgIGlmIGhhc2F0dHIobW9kdWxlLCAidGVzdF9tYWluIik6CisgICAgICAgIG1vZHVsZS50ZXN0X21haW4oKQorCitydW50ZXN0KCJ0ZXN0LnRlc3RfbWluaWRvbSIpCitydW50ZXN0KCJ0ZXN0LnRlc3RfcHlleHBhdCIpCitydW50ZXN0KCJ0ZXN0LnRlc3Rfc2F4IikKK3J1bnRlc3QoInRlc3QudGVzdF94bWxfZXRyZWUiKQorcnVudGVzdCgidGVzdC50ZXN0X3htbF9ldHJlZV9jIikKK3J1bnRlc3QoInRlc3QudGVzdF94bWxsaWIiKQorcnVudGVzdCgidGVzdC50ZXN0X3htbHJwYyIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QveG1sdGVzdHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTg0OWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QveG1sdGVzdHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTg0OWUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvemlwZGlyLnppcCBiL2xpYi9weXRob24yLjcvdGVzdC96aXBkaXIuemlwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjFkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvemlwZGlyLnppcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RleHR3cmFwLnB5IGIvbGliL3B5dGhvbjIuNy90ZXh0d3JhcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmVhMGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXh0d3JhcC5weQpAQCAtMCwwICsxLDQyNSBAQAorIiIiVGV4dCB3cmFwcGluZyBhbmQgZmlsbGluZy4KKyIiIgorCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDAxIEdyZWdvcnkgUC4gV2FyZC4KKyMgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIyBXcml0dGVuIGJ5IEdyZWcgV2FyZCA8Z3dhcmRAcHl0aG9uLm5ldD4KKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBzdHJpbmcsIHJlCisKK3RyeToKKyAgICBfdW5pY29kZSA9IHVuaWNvZGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgIyBJZiBQeXRob24gaXMgYnVpbHQgd2l0aG91dCBVbmljb2RlIHN1cHBvcnQsIHRoZSB1bmljb2RlIHR5cGUKKyAgICAjIHdpbGwgbm90IGV4aXN0LiBGYWtlIG9uZS4KKyAgICBjbGFzcyBfdW5pY29kZShvYmplY3QpOgorICAgICAgICBwYXNzCisKKyMgRG8gdGhlIHJpZ2h0IHRoaW5nIHdpdGggYm9vbGVhbiB2YWx1ZXMgZm9yIGFsbCBrbm93biBQeXRob24gdmVyc2lvbnMKKyMgKHNvIHRoaXMgbW9kdWxlIGNhbiBiZSBjb3BpZWQgdG8gcHJvamVjdHMgdGhhdCBkb24ndCBkZXBlbmQgb24gUHl0aG9uCisjIDIuMywgZS5nLiBPcHRpayBhbmQgRG9jdXRpbHMpIGJ5IHVuY29tbWVudGluZyB0aGUgYmxvY2sgb2YgY29kZSBiZWxvdy4KKyN0cnk6CisjICAgIFRydWUsIEZhbHNlCisjZXhjZXB0IE5hbWVFcnJvcjoKKyMgICAgKFRydWUsIEZhbHNlKSA9ICgxLCAwKQorCitfX2FsbF9fID0gWydUZXh0V3JhcHBlcicsICd3cmFwJywgJ2ZpbGwnLCAnZGVkZW50J10KKworIyBIYXJkY29kZSB0aGUgcmVjb2duaXplZCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gdGhlIFVTLUFTQ0lJCisjIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4gIFRoZSBtYWluIHJlYXNvbiBmb3IgZG9pbmcgdGhpcyBpcyB0aGF0IGluCisjIElTTy04ODU5LTEsIDB4YTAgaXMgbm9uLWJyZWFraW5nIHdoaXRlc3BhY2UsIHNvIGluIGNlcnRhaW4gbG9jYWxlcworIyB0aGF0IGNoYXJhY3RlciB3aW5kcyB1cCBpbiBzdHJpbmcud2hpdGVzcGFjZS4gIFJlc3BlY3RpbmcKKyMgc3RyaW5nLndoaXRlc3BhY2UgaW4gdGhvc2UgY2FzZXMgd291bGQgMSkgbWFrZSB0ZXh0d3JhcCB0cmVhdCAweGEwIHRoZQorIyBzYW1lIGFzIGFueSBvdGhlciB3aGl0ZXNwYWNlIGNoYXIsIHdoaWNoIGlzIGNsZWFybHkgd3JvbmcgKGl0J3MgYQorIyAqbm9uLWJyZWFraW5nKiBzcGFjZSksIDIpIHBvc3NpYmx5IGNhdXNlIHByb2JsZW1zIHdpdGggVW5pY29kZSwKKyMgc2luY2UgMHhhMCBpcyBub3QgaW4gcmFuZ2UoMTI4KS4KK193aGl0ZXNwYWNlID0gJ1x0XG5ceDBiXHgwY1xyICcKKworY2xhc3MgVGV4dFdyYXBwZXI6CisgICAgIiIiCisgICAgT2JqZWN0IGZvciB3cmFwcGluZy9maWxsaW5nIHRleHQuICBUaGUgcHVibGljIGludGVyZmFjZSBjb25zaXN0cyBvZgorICAgIHRoZSB3cmFwKCkgYW5kIGZpbGwoKSBtZXRob2RzOyB0aGUgb3RoZXIgbWV0aG9kcyBhcmUganVzdCB0aGVyZSBmb3IKKyAgICBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIGluIG9yZGVyIHRvIHR3ZWFrIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4KKyAgICBJZiB5b3Ugd2FudCB0byBjb21wbGV0ZWx5IHJlcGxhY2UgdGhlIG1haW4gd3JhcHBpbmcgYWxnb3JpdGhtLAorICAgIHlvdSdsbCBwcm9iYWJseSBoYXZlIHRvIG92ZXJyaWRlIF93cmFwX2NodW5rcygpLgorCisgICAgU2V2ZXJhbCBpbnN0YW5jZSBhdHRyaWJ1dGVzIGNvbnRyb2wgdmFyaW91cyBhc3BlY3RzIG9mIHdyYXBwaW5nOgorICAgICAgd2lkdGggKGRlZmF1bHQ6IDcwKQorICAgICAgICB0aGUgbWF4aW11bSB3aWR0aCBvZiB3cmFwcGVkIGxpbmVzICh1bmxlc3MgYnJlYWtfbG9uZ193b3JkcworICAgICAgICBpcyBmYWxzZSkKKyAgICAgIGluaXRpYWxfaW5kZW50IChkZWZhdWx0OiAiIikKKyAgICAgICAgc3RyaW5nIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gdGhlIGZpcnN0IGxpbmUgb2Ygd3JhcHBlZAorICAgICAgICBvdXRwdXQuICBDb3VudHMgdG93YXJkcyB0aGUgbGluZSdzIHdpZHRoLgorICAgICAgc3Vic2VxdWVudF9pbmRlbnQgKGRlZmF1bHQ6ICIiKQorICAgICAgICBzdHJpbmcgdGhhdCB3aWxsIGJlIHByZXBlbmRlZCB0byBhbGwgbGluZXMgc2F2ZSB0aGUgZmlyc3QKKyAgICAgICAgb2Ygd3JhcHBlZCBvdXRwdXQ7IGFsc28gY291bnRzIHRvd2FyZHMgZWFjaCBsaW5lJ3Mgd2lkdGguCisgICAgICBleHBhbmRfdGFicyAoZGVmYXVsdDogdHJ1ZSkKKyAgICAgICAgRXhwYW5kIHRhYnMgaW4gaW5wdXQgdGV4dCB0byBzcGFjZXMgYmVmb3JlIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgRWFjaCB0YWIgd2lsbCBiZWNvbWUgMSAuLiA4IHNwYWNlcywgZGVwZW5kaW5nIG9uIGl0cyBwb3NpdGlvbiBpbgorICAgICAgICBpdHMgbGluZS4gIElmIGZhbHNlLCBlYWNoIHRhYiBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIGNoYXJhY3Rlci4KKyAgICAgIHJlcGxhY2Vfd2hpdGVzcGFjZSAoZGVmYXVsdDogdHJ1ZSkKKyAgICAgICAgUmVwbGFjZSBhbGwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dCB0ZXh0IGJ5IHNwYWNlcworICAgICAgICBhZnRlciB0YWIgZXhwYW5zaW9uLiAgTm90ZSB0aGF0IGlmIGV4cGFuZF90YWJzIGlzIGZhbHNlIGFuZAorICAgICAgICByZXBsYWNlX3doaXRlc3BhY2UgaXMgdHJ1ZSwgZXZlcnkgdGFiIHdpbGwgYmUgY29udmVydGVkIHRvIGEKKyAgICAgICAgc2luZ2xlIHNwYWNlIQorICAgICAgZml4X3NlbnRlbmNlX2VuZGluZ3MgKGRlZmF1bHQ6IGZhbHNlKQorICAgICAgICBFbnN1cmUgdGhhdCBzZW50ZW5jZS1lbmRpbmcgcHVuY3R1YXRpb24gaXMgYWx3YXlzIGZvbGxvd2VkCisgICAgICAgIGJ5IHR3byBzcGFjZXMuICBPZmYgYnkgZGVmYXVsdCBiZWNhdXNlIHRoZSBhbGdvcml0aG0gaXMKKyAgICAgICAgKHVuYXZvaWRhYmx5KSBpbXBlcmZlY3QuCisgICAgICBicmVha19sb25nX3dvcmRzIChkZWZhdWx0OiB0cnVlKQorICAgICAgICBCcmVhayB3b3JkcyBsb25nZXIgdGhhbiAnd2lkdGgnLiAgSWYgZmFsc2UsIHRob3NlIHdvcmRzIHdpbGwgbm90CisgICAgICAgIGJlIGJyb2tlbiwgYW5kIHNvbWUgbGluZXMgbWlnaHQgYmUgbG9uZ2VyIHRoYW4gJ3dpZHRoJy4KKyAgICAgIGJyZWFrX29uX2h5cGhlbnMgKGRlZmF1bHQ6IHRydWUpCisgICAgICAgIEFsbG93IGJyZWFraW5nIGh5cGhlbmF0ZWQgd29yZHMuIElmIHRydWUsIHdyYXBwaW5nIHdpbGwgb2NjdXIKKyAgICAgICAgcHJlZmVyYWJseSBvbiB3aGl0ZXNwYWNlcyBhbmQgcmlnaHQgYWZ0ZXIgaHlwaGVucyBwYXJ0IG9mCisgICAgICAgIGNvbXBvdW5kIHdvcmRzLgorICAgICAgZHJvcF93aGl0ZXNwYWNlIChkZWZhdWx0OiB0cnVlKQorICAgICAgICBEcm9wIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBsaW5lcy4KKyAgICAiIiIKKworICAgIHdoaXRlc3BhY2VfdHJhbnMgPSBzdHJpbmcubWFrZXRyYW5zKF93aGl0ZXNwYWNlLCAnICcgKiBsZW4oX3doaXRlc3BhY2UpKQorCisgICAgdW5pY29kZV93aGl0ZXNwYWNlX3RyYW5zID0ge30KKyAgICB1c3BhY2UgPSBvcmQodScgJykKKyAgICBmb3IgeCBpbiBtYXAob3JkLCBfd2hpdGVzcGFjZSk6CisgICAgICAgIHVuaWNvZGVfd2hpdGVzcGFjZV90cmFuc1t4XSA9IHVzcGFjZQorCisgICAgIyBUaGlzIGZ1bmt5IGxpdHRsZSByZWdleCBpcyBqdXN0IHRoZSB0cmljayBmb3Igc3BsaXR0aW5nCisgICAgIyB0ZXh0IHVwIGludG8gd29yZC13cmFwcGFibGUgY2h1bmtzLiAgRS5nLgorICAgICMgICAiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hIgorICAgICMgc3BsaXRzIGludG8KKyAgICAjICAgSGVsbG8vIC90aGVyZS8gLy0tLyAveW91LyAvZ29vZi0vYmFsbCwvIC91c2UvIC90aGUvIC8tYi8gL29wdGlvbiEKKyAgICAjIChhZnRlciBzdHJpcHBpbmcgb3V0IGVtcHR5IHN0cmluZ3MpLgorICAgIHdvcmRzZXBfcmUgPSByZS5jb21waWxlKAorICAgICAgICByJyhccyt8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFueSB3aGl0ZXNwYWNlCisgICAgICAgIHInW15cc1x3XSpcdytbXjAtOVxXXS0oPz1cdytbXjAtOVxXXSl8JyAgICMgaHlwaGVuYXRlZCB3b3JkcworICAgICAgICByJyg/PD1bXHdcIVwiXCdcJlwuXCxcP10pLXsyLH0oPz1cdykpJykgICAjIGVtLWRhc2gKKworICAgICMgVGhpcyBsZXNzIGZ1bmt5IGxpdHRsZSByZWdleCBqdXN0IHNwbGl0IG9uIHJlY29nbml6ZWQgc3BhY2VzLiBFLmcuCisgICAgIyAgICJIZWxsbyB0aGVyZSAtLSB5b3UgZ29vZi1iYWxsLCB1c2UgdGhlIC1iIG9wdGlvbiEiCisgICAgIyBzcGxpdHMgaW50bworICAgICMgICBIZWxsby8gL3RoZXJlLyAvLS0vIC95b3UvIC9nb29mLWJhbGwsLyAvdXNlLyAvdGhlLyAvLWIvIC9vcHRpb24hLworICAgIHdvcmRzZXBfc2ltcGxlX3JlID0gcmUuY29tcGlsZShyJyhccyspJykKKworICAgICMgWFhYIHRoaXMgaXMgbm90IGxvY2FsZS0gb3IgY2hhcnNldC1hd2FyZSAtLSBzdHJpbmcubG93ZXJjYXNlCisgICAgIyBpcyBVUy1BU0NJSSBvbmx5IChhbmQgdGhlcmVmb3JlIEVuZ2xpc2gtb25seSkKKyAgICBzZW50ZW5jZV9lbmRfcmUgPSByZS5jb21waWxlKHInWyVzXScgICAgICAgICAgICAgICMgbG93ZXJjYXNlIGxldHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidbXC5cIVw/XScgICAgICAgICAgIyBzZW50ZW5jZS1lbmRpbmcgcHVuY3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1tcIlwnXT8nICAgICAgICAgICAjIG9wdGlvbmFsIGVuZC1vZi1xdW90ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidcWicgICAgICAgICAgICAgICAgIyBlbmQgb2YgY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc3RyaW5nLmxvd2VyY2FzZSkKKworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHdpZHRoPTcwLAorICAgICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD0iIiwKKyAgICAgICAgICAgICAgICAgc3Vic2VxdWVudF9pbmRlbnQ9IiIsCisgICAgICAgICAgICAgICAgIGV4cGFuZF90YWJzPVRydWUsCisgICAgICAgICAgICAgICAgIHJlcGxhY2Vfd2hpdGVzcGFjZT1UcnVlLAorICAgICAgICAgICAgICAgICBmaXhfc2VudGVuY2VfZW5kaW5ncz1GYWxzZSwKKyAgICAgICAgICAgICAgICAgYnJlYWtfbG9uZ193b3Jkcz1UcnVlLAorICAgICAgICAgICAgICAgICBkcm9wX3doaXRlc3BhY2U9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgYnJlYWtfb25faHlwaGVucz1UcnVlKToKKyAgICAgICAgc2VsZi53aWR0aCA9IHdpZHRoCisgICAgICAgIHNlbGYuaW5pdGlhbF9pbmRlbnQgPSBpbml0aWFsX2luZGVudAorICAgICAgICBzZWxmLnN1YnNlcXVlbnRfaW5kZW50ID0gc3Vic2VxdWVudF9pbmRlbnQKKyAgICAgICAgc2VsZi5leHBhbmRfdGFicyA9IGV4cGFuZF90YWJzCisgICAgICAgIHNlbGYucmVwbGFjZV93aGl0ZXNwYWNlID0gcmVwbGFjZV93aGl0ZXNwYWNlCisgICAgICAgIHNlbGYuZml4X3NlbnRlbmNlX2VuZGluZ3MgPSBmaXhfc2VudGVuY2VfZW5kaW5ncworICAgICAgICBzZWxmLmJyZWFrX2xvbmdfd29yZHMgPSBicmVha19sb25nX3dvcmRzCisgICAgICAgIHNlbGYuZHJvcF93aGl0ZXNwYWNlID0gZHJvcF93aGl0ZXNwYWNlCisgICAgICAgIHNlbGYuYnJlYWtfb25faHlwaGVucyA9IGJyZWFrX29uX2h5cGhlbnMKKworICAgICAgICAjIHJlY29tcGlsZSB0aGUgcmVnZXhlcyBmb3IgVW5pY29kZSBtb2RlIC0tIGRvbmUgaW4gdGhpcyBjbHVtc3kgd2F5IGZvcgorICAgICAgICAjIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGJlY2F1c2UgaXQncyByYXRoZXIgY29tbW9uIHRvIG1vbmtleS1wYXRjaAorICAgICAgICAjIHRoZSBUZXh0V3JhcHBlciBjbGFzcycgd29yZHNlcF9yZSBhdHRyaWJ1dGUuCisgICAgICAgIHNlbGYud29yZHNlcF9yZV91bmkgPSByZS5jb21waWxlKHNlbGYud29yZHNlcF9yZS5wYXR0ZXJuLCByZS5VKQorICAgICAgICBzZWxmLndvcmRzZXBfc2ltcGxlX3JlX3VuaSA9IHJlLmNvbXBpbGUoCisgICAgICAgICAgICBzZWxmLndvcmRzZXBfc2ltcGxlX3JlLnBhdHRlcm4sIHJlLlUpCisKKworICAgICMgLS0gUHJpdmF0ZSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAocG9zc2libHkgdXNlZnVsIGZvciBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlKQorCisgICAgZGVmIF9tdW5nZV93aGl0ZXNwYWNlKHNlbGYsIHRleHQpOgorICAgICAgICAiIiJfbXVuZ2Vfd2hpdGVzcGFjZSh0ZXh0IDogc3RyaW5nKSAtPiBzdHJpbmcKKworICAgICAgICBNdW5nZSB3aGl0ZXNwYWNlIGluIHRleHQ6IGV4cGFuZCB0YWJzIGFuZCBjb252ZXJ0IGFsbCBvdGhlcgorICAgICAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgdG8gc3BhY2VzLiAgRWcuICIgZm9vXHRiYXJcblxuYmF6IgorICAgICAgICBiZWNvbWVzICIgZm9vICAgIGJhciAgYmF6Ii4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZXhwYW5kX3RhYnM6CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5leHBhbmR0YWJzKCkKKyAgICAgICAgaWYgc2VsZi5yZXBsYWNlX3doaXRlc3BhY2U6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRleHQsIHN0cik6CisgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudHJhbnNsYXRlKHNlbGYud2hpdGVzcGFjZV90cmFucykKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0ZXh0LCBfdW5pY29kZSk6CisgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQudHJhbnNsYXRlKHNlbGYudW5pY29kZV93aGl0ZXNwYWNlX3RyYW5zKQorICAgICAgICByZXR1cm4gdGV4dAorCisKKyAgICBkZWYgX3NwbGl0KHNlbGYsIHRleHQpOgorICAgICAgICAiIiJfc3BsaXQodGV4dCA6IHN0cmluZykgLT4gW3N0cmluZ10KKworICAgICAgICBTcGxpdCB0aGUgdGV4dCB0byB3cmFwIGludG8gaW5kaXZpc2libGUgY2h1bmtzLiAgQ2h1bmtzIGFyZQorICAgICAgICBub3QgcXVpdGUgdGhlIHNhbWUgYXMgd29yZHM7IHNlZSBfd3JhcF9jaHVua3MoKSBmb3IgZnVsbAorICAgICAgICBkZXRhaWxzLiAgQXMgYW4gZXhhbXBsZSwgdGhlIHRleHQKKyAgICAgICAgICBMb29rLCBnb29mLWJhbGwgLS0gdXNlIHRoZSAtYiBvcHRpb24hCisgICAgICAgIGJyZWFrcyBpbnRvIHRoZSBmb2xsb3dpbmcgY2h1bmtzOgorICAgICAgICAgICdMb29rLCcsICcgJywgJ2dvb2YtJywgJ2JhbGwnLCAnICcsICctLScsICcgJywKKyAgICAgICAgICAndXNlJywgJyAnLCAndGhlJywgJyAnLCAnLWInLCAnICcsICdvcHRpb24hJworICAgICAgICBpZiBicmVha19vbl9oeXBoZW5zIGlzIFRydWUsIG9yIGluOgorICAgICAgICAgICdMb29rLCcsICcgJywgJ2dvb2YtYmFsbCcsICcgJywgJy0tJywgJyAnLAorICAgICAgICAgICd1c2UnLCAnICcsICd0aGUnLCAnICcsICctYicsICcgJywgb3B0aW9uIScKKyAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXh0LCBfdW5pY29kZSk6CisgICAgICAgICAgICBpZiBzZWxmLmJyZWFrX29uX2h5cGhlbnM6CisgICAgICAgICAgICAgICAgcGF0ID0gc2VsZi53b3Jkc2VwX3JlX3VuaQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXQgPSBzZWxmLndvcmRzZXBfc2ltcGxlX3JlX3VuaQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5icmVha19vbl9oeXBoZW5zOgorICAgICAgICAgICAgICAgIHBhdCA9IHNlbGYud29yZHNlcF9yZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXQgPSBzZWxmLndvcmRzZXBfc2ltcGxlX3JlCisgICAgICAgIGNodW5rcyA9IHBhdC5zcGxpdCh0ZXh0KQorICAgICAgICBjaHVua3MgPSBmaWx0ZXIoTm9uZSwgY2h1bmtzKSAgIyByZW1vdmUgZW1wdHkgY2h1bmtzCisgICAgICAgIHJldHVybiBjaHVua3MKKworICAgIGRlZiBfZml4X3NlbnRlbmNlX2VuZGluZ3Moc2VsZiwgY2h1bmtzKToKKyAgICAgICAgIiIiX2ZpeF9zZW50ZW5jZV9lbmRpbmdzKGNodW5rcyA6IFtzdHJpbmddKQorCisgICAgICAgIENvcnJlY3QgZm9yIHNlbnRlbmNlIGVuZGluZ3MgYnVyaWVkIGluICdjaHVua3MnLiAgRWcuIHdoZW4gdGhlCisgICAgICAgIG9yaWdpbmFsIHRleHQgY29udGFpbnMgIi4uLiBmb28uXG5CYXIgLi4uIiwgbXVuZ2Vfd2hpdGVzcGFjZSgpCisgICAgICAgIGFuZCBzcGxpdCgpIHdpbGwgY29udmVydCB0aGF0IHRvIFsuLi4sICJmb28uIiwgIiAiLCAiQmFyIiwgLi4uXQorICAgICAgICB3aGljaCBoYXMgb25lIHRvbyBmZXcgc3BhY2VzOyB0aGlzIG1ldGhvZCBzaW1wbHkgY2hhbmdlcyB0aGUgb25lCisgICAgICAgIHNwYWNlIHRvIHR3by4KKyAgICAgICAgIiIiCisgICAgICAgIGkgPSAwCisgICAgICAgIHBhdHNlYXJjaCA9IHNlbGYuc2VudGVuY2VfZW5kX3JlLnNlYXJjaAorICAgICAgICB3aGlsZSBpIDwgbGVuKGNodW5rcyktMToKKyAgICAgICAgICAgIGlmIGNodW5rc1tpKzFdID09ICIgIiBhbmQgcGF0c2VhcmNoKGNodW5rc1tpXSk6CisgICAgICAgICAgICAgICAgY2h1bmtzW2krMV0gPSAiICAiCisgICAgICAgICAgICAgICAgaSArPSAyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGkgKz0gMQorCisgICAgZGVmIF9oYW5kbGVfbG9uZ193b3JkKHNlbGYsIHJldmVyc2VkX2NodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdpZHRoKToKKyAgICAgICAgIiIiX2hhbmRsZV9sb25nX3dvcmQoY2h1bmtzIDogW3N0cmluZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9saW5lIDogW3N0cmluZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gOiBpbnQsIHdpZHRoIDogaW50KQorCisgICAgICAgIEhhbmRsZSBhIGNodW5rIG9mIHRleHQgKG1vc3QgbGlrZWx5IGEgd29yZCwgbm90IHdoaXRlc3BhY2UpIHRoYXQKKyAgICAgICAgaXMgdG9vIGxvbmcgdG8gZml0IGluIGFueSBsaW5lLgorICAgICAgICAiIiIKKyAgICAgICAgIyBGaWd1cmUgb3V0IHdoZW4gaW5kZW50IGlzIGxhcmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGFuZCBtYWtlCisgICAgICAgICMgc3VyZSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGlzIHN0cmlwcGVkIG9mZiBvbiBldmVyeSBwYXNzCisgICAgICAgIGlmIHdpZHRoIDwgMToKKyAgICAgICAgICAgIHNwYWNlX2xlZnQgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzcGFjZV9sZWZ0ID0gd2lkdGggLSBjdXJfbGVuCisKKyAgICAgICAgIyBJZiB3ZSdyZSBhbGxvd2VkIHRvIGJyZWFrIGxvbmcgd29yZHMsIHRoZW4gZG8gc286IHB1dCBhcyBtdWNoCisgICAgICAgICMgb2YgdGhlIG5leHQgY2h1bmsgb250byB0aGUgY3VycmVudCBsaW5lIGFzIHdpbGwgZml0LgorICAgICAgICBpZiBzZWxmLmJyZWFrX2xvbmdfd29yZHM6CisgICAgICAgICAgICBjdXJfbGluZS5hcHBlbmQocmV2ZXJzZWRfY2h1bmtzWy0xXVs6c3BhY2VfbGVmdF0pCisgICAgICAgICAgICByZXZlcnNlZF9jaHVua3NbLTFdID0gcmV2ZXJzZWRfY2h1bmtzWy0xXVtzcGFjZV9sZWZ0Ol0KKworICAgICAgICAjIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgbG9uZyB3b3JkIGludGFjdC4gIE9ubHkgYWRkCisgICAgICAgICMgaXQgdG8gdGhlIGN1cnJlbnQgbGluZSBpZiB0aGVyZSdzIG5vdGhpbmcgYWxyZWFkeSB0aGVyZSAtLQorICAgICAgICAjIHRoYXQgbWluaW1pemVzIGhvdyBtdWNoIHdlIHZpb2xhdGUgdGhlIHdpZHRoIGNvbnN0cmFpbnQuCisgICAgICAgIGVsaWYgbm90IGN1cl9saW5lOgorICAgICAgICAgICAgY3VyX2xpbmUuYXBwZW5kKHJldmVyc2VkX2NodW5rcy5wb3AoKSkKKworICAgICAgICAjIElmIHdlJ3JlIG5vdCBhbGxvd2VkIHRvIGJyZWFrIGxvbmcgd29yZHMsIGFuZCB0aGVyZSdzIGFscmVhZHkKKyAgICAgICAgIyB0ZXh0IG9uIHRoZSBjdXJyZW50IGxpbmUsIGRvIG5vdGhpbmcuICBOZXh0IHRpbWUgdGhyb3VnaCB0aGUKKyAgICAgICAgIyBtYWluIGxvb3Agb2YgX3dyYXBfY2h1bmtzKCksIHdlJ2xsIHdpbmQgdXAgaGVyZSBhZ2FpbiwgYnV0CisgICAgICAgICMgY3VyX2xlbiB3aWxsIGJlIHplcm8sIHNvIHRoZSBuZXh0IGxpbmUgd2lsbCBiZSBlbnRpcmVseQorICAgICAgICAjIGRldm90ZWQgdG8gdGhlIGxvbmcgd29yZCB0aGF0IHdlIGNhbid0IGhhbmRsZSByaWdodCBub3cuCisKKyAgICBkZWYgX3dyYXBfY2h1bmtzKHNlbGYsIGNodW5rcyk6CisgICAgICAgICIiIl93cmFwX2NodW5rcyhjaHVua3MgOiBbc3RyaW5nXSkgLT4gW3N0cmluZ10KKworICAgICAgICBXcmFwIGEgc2VxdWVuY2Ugb2YgdGV4dCBjaHVua3MgYW5kIHJldHVybiBhIGxpc3Qgb2YgbGluZXMgb2YKKyAgICAgICAgbGVuZ3RoICdzZWxmLndpZHRoJyBvciBsZXNzLiAgKElmICdicmVha19sb25nX3dvcmRzJyBpcyBmYWxzZSwKKyAgICAgICAgc29tZSBsaW5lcyBtYXkgYmUgbG9uZ2VyIHRoYW4gdGhpcy4pICBDaHVua3MgY29ycmVzcG9uZCByb3VnaGx5CisgICAgICAgIHRvIHdvcmRzIGFuZCB0aGUgd2hpdGVzcGFjZSBiZXR3ZWVuIHRoZW06IGVhY2ggY2h1bmsgaXMKKyAgICAgICAgaW5kaXZpc2libGUgKG1vZHVsbyAnYnJlYWtfbG9uZ193b3JkcycpLCBidXQgYSBsaW5lIGJyZWFrIGNhbgorICAgICAgICBjb21lIGJldHdlZW4gYW55IHR3byBjaHVua3MuICBDaHVua3Mgc2hvdWxkIG5vdCBoYXZlIGludGVybmFsCisgICAgICAgIHdoaXRlc3BhY2U7IGllLiBhIGNodW5rIGlzIGVpdGhlciBhbGwgd2hpdGVzcGFjZSBvciBhICJ3b3JkIi4KKyAgICAgICAgV2hpdGVzcGFjZSBjaHVua3Mgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mCisgICAgICAgIGxpbmVzLCBidXQgYXBhcnQgZnJvbSB0aGF0IHdoaXRlc3BhY2UgaXMgcHJlc2VydmVkLgorICAgICAgICAiIiIKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBpZiBzZWxmLndpZHRoIDw9IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIHdpZHRoICVyIChtdXN0IGJlID4gMCkiICUgc2VsZi53aWR0aCkKKworICAgICAgICAjIEFycmFuZ2UgaW4gcmV2ZXJzZSBvcmRlciBzbyBpdGVtcyBjYW4gYmUgZWZmaWNpZW50bHkgcG9wcGVkCisgICAgICAgICMgZnJvbSBhIHN0YWNrIG9mIGNodWNrcy4KKyAgICAgICAgY2h1bmtzLnJldmVyc2UoKQorCisgICAgICAgIHdoaWxlIGNodW5rczoKKworICAgICAgICAgICAgIyBTdGFydCB0aGUgbGlzdCBvZiBjaHVua3MgdGhhdCB3aWxsIG1ha2UgdXAgdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgICAgICMgY3VyX2xlbiBpcyBqdXN0IHRoZSBsZW5ndGggb2YgYWxsIHRoZSBjaHVua3MgaW4gY3VyX2xpbmUuCisgICAgICAgICAgICBjdXJfbGluZSA9IFtdCisgICAgICAgICAgICBjdXJfbGVuID0gMAorCisgICAgICAgICAgICAjIEZpZ3VyZSBvdXQgd2hpY2ggc3RhdGljIHN0cmluZyB3aWxsIHByZWZpeCB0aGlzIGxpbmUuCisgICAgICAgICAgICBpZiBsaW5lczoKKyAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLnN1YnNlcXVlbnRfaW5kZW50CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGluZGVudCA9IHNlbGYuaW5pdGlhbF9pbmRlbnQKKworICAgICAgICAgICAgIyBNYXhpbXVtIHdpZHRoIGZvciB0aGlzIGxpbmUuCisgICAgICAgICAgICB3aWR0aCA9IHNlbGYud2lkdGggLSBsZW4oaW5kZW50KQorCisgICAgICAgICAgICAjIEZpcnN0IGNodW5rIG9uIGxpbmUgaXMgd2hpdGVzcGFjZSAtLSBkcm9wIGl0LCB1bmxlc3MgdGhpcworICAgICAgICAgICAgIyBpcyB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIHRleHQgKGllLiBubyBsaW5lcyBzdGFydGVkIHlldCkuCisgICAgICAgICAgICBpZiBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmQgY2h1bmtzWy0xXS5zdHJpcCgpID09ICcnIGFuZCBsaW5lczoKKyAgICAgICAgICAgICAgICBkZWwgY2h1bmtzWy0xXQorCisgICAgICAgICAgICB3aGlsZSBjaHVua3M6CisgICAgICAgICAgICAgICAgbCA9IGxlbihjaHVua3NbLTFdKQorCisgICAgICAgICAgICAgICAgIyBDYW4gYXQgbGVhc3Qgc3F1ZWV6ZSB0aGlzIGNodW5rIG9udG8gdGhlIGN1cnJlbnQgbGluZS4KKyAgICAgICAgICAgICAgICBpZiBjdXJfbGVuICsgbCA8PSB3aWR0aDoKKyAgICAgICAgICAgICAgICAgICAgY3VyX2xpbmUuYXBwZW5kKGNodW5rcy5wb3AoKSkKKyAgICAgICAgICAgICAgICAgICAgY3VyX2xlbiArPSBsCisKKyAgICAgICAgICAgICAgICAjIE5vcGUsIHRoaXMgbGluZSBpcyBmdWxsLgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICMgVGhlIGN1cnJlbnQgbGluZSBpcyBmdWxsLCBhbmQgdGhlIG5leHQgY2h1bmsgaXMgdG9vIGJpZyB0bworICAgICAgICAgICAgIyBmaXQgb24gKmFueSogbGluZSAobm90IGp1c3QgdGhpcyBvbmUpLgorICAgICAgICAgICAgaWYgY2h1bmtzIGFuZCBsZW4oY2h1bmtzWy0xXSkgPiB3aWR0aDoKKyAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVfbG9uZ193b3JkKGNodW5rcywgY3VyX2xpbmUsIGN1cl9sZW4sIHdpZHRoKQorCisgICAgICAgICAgICAjIElmIHRoZSBsYXN0IGNodW5rIG9uIHRoaXMgbGluZSBpcyBhbGwgd2hpdGVzcGFjZSwgZHJvcCBpdC4KKyAgICAgICAgICAgIGlmIHNlbGYuZHJvcF93aGl0ZXNwYWNlIGFuZCBjdXJfbGluZSBhbmQgY3VyX2xpbmVbLTFdLnN0cmlwKCkgPT0gJyc6CisgICAgICAgICAgICAgICAgZGVsIGN1cl9saW5lWy0xXQorCisgICAgICAgICAgICAjIENvbnZlcnQgY3VycmVudCBsaW5lIGJhY2sgdG8gYSBzdHJpbmcgYW5kIHN0b3JlIGl0IGluIGxpc3QKKyAgICAgICAgICAgICMgb2YgYWxsIGxpbmVzIChyZXR1cm4gdmFsdWUpLgorICAgICAgICAgICAgaWYgY3VyX2xpbmU6CisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGluZGVudCArICcnLmpvaW4oY3VyX2xpbmUpKQorCisgICAgICAgIHJldHVybiBsaW5lcworCisKKyAgICAjIC0tIFB1YmxpYyBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHdyYXAoc2VsZiwgdGV4dCk6CisgICAgICAgICIiIndyYXAodGV4dCA6IHN0cmluZykgLT4gW3N0cmluZ10KKworICAgICAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgc28gaXQgZml0cyBpbiBsaW5lcyBvZgorICAgICAgICBubyBtb3JlIHRoYW4gJ3NlbGYud2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBsaXN0IG9mIHdyYXBwZWQKKyAgICAgICAgbGluZXMuICBUYWJzIGluICd0ZXh0JyBhcmUgZXhwYW5kZWQgd2l0aCBzdHJpbmcuZXhwYW5kdGFicygpLAorICAgICAgICBhbmQgYWxsIG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmUpIGFyZQorICAgICAgICBjb252ZXJ0ZWQgdG8gc3BhY2UuCisgICAgICAgICIiIgorICAgICAgICB0ZXh0ID0gc2VsZi5fbXVuZ2Vfd2hpdGVzcGFjZSh0ZXh0KQorICAgICAgICBjaHVua3MgPSBzZWxmLl9zcGxpdCh0ZXh0KQorICAgICAgICBpZiBzZWxmLmZpeF9zZW50ZW5jZV9lbmRpbmdzOgorICAgICAgICAgICAgc2VsZi5fZml4X3NlbnRlbmNlX2VuZGluZ3MoY2h1bmtzKQorICAgICAgICByZXR1cm4gc2VsZi5fd3JhcF9jaHVua3MoY2h1bmtzKQorCisgICAgZGVmIGZpbGwoc2VsZiwgdGV4dCk6CisgICAgICAgICIiImZpbGwodGV4dCA6IHN0cmluZykgLT4gc3RyaW5nCisKKyAgICAgICAgUmVmb3JtYXQgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gJ3RleHQnIHRvIGZpdCBpbiBsaW5lcyBvZiBubworICAgICAgICBtb3JlIHRoYW4gJ3NlbGYud2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBuZXcgc3RyaW5nCisgICAgICAgIGNvbnRhaW5pbmcgdGhlIGVudGlyZSB3cmFwcGVkIHBhcmFncmFwaC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4oc2VsZi53cmFwKHRleHQpKQorCisKKyMgLS0gQ29udmVuaWVuY2UgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgd3JhcCh0ZXh0LCB3aWR0aD03MCwgKiprd2FyZ3MpOgorICAgICIiIldyYXAgYSBzaW5nbGUgcGFyYWdyYXBoIG9mIHRleHQsIHJldHVybmluZyBhIGxpc3Qgb2Ygd3JhcHBlZCBsaW5lcy4KKworICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyBzbyBpdCBmaXRzIGluIGxpbmVzIG9mIG5vCisgICAgbW9yZSB0aGFuICd3aWR0aCcgY29sdW1ucywgYW5kIHJldHVybiBhIGxpc3Qgb2Ygd3JhcHBlZCBsaW5lcy4gIEJ5CisgICAgZGVmYXVsdCwgdGFicyBpbiAndGV4dCcgYXJlIGV4cGFuZGVkIHdpdGggc3RyaW5nLmV4cGFuZHRhYnMoKSwgYW5kCisgICAgYWxsIG90aGVyIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoaW5jbHVkaW5nIG5ld2xpbmUpIGFyZSBjb252ZXJ0ZWQgdG8KKyAgICBzcGFjZS4gIFNlZSBUZXh0V3JhcHBlciBjbGFzcyBmb3IgYXZhaWxhYmxlIGtleXdvcmQgYXJncyB0byBjdXN0b21pemUKKyAgICB3cmFwcGluZyBiZWhhdmlvdXIuCisgICAgIiIiCisgICAgdyA9IFRleHRXcmFwcGVyKHdpZHRoPXdpZHRoLCAqKmt3YXJncykKKyAgICByZXR1cm4gdy53cmFwKHRleHQpCisKK2RlZiBmaWxsKHRleHQsIHdpZHRoPTcwLCAqKmt3YXJncyk6CisgICAgIiIiRmlsbCBhIHNpbmdsZSBwYXJhZ3JhcGggb2YgdGV4dCwgcmV0dXJuaW5nIGEgbmV3IHN0cmluZy4KKworICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyB0byBmaXQgaW4gbGluZXMgb2Ygbm8gbW9yZQorICAgIHRoYW4gJ3dpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbmV3IHN0cmluZyBjb250YWluaW5nIHRoZSBlbnRpcmUKKyAgICB3cmFwcGVkIHBhcmFncmFwaC4gIEFzIHdpdGggd3JhcCgpLCB0YWJzIGFyZSBleHBhbmRlZCBhbmQgb3RoZXIKKyAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgY29udmVydGVkIHRvIHNwYWNlLiAgU2VlIFRleHRXcmFwcGVyIGNsYXNzIGZvcgorICAgIGF2YWlsYWJsZSBrZXl3b3JkIGFyZ3MgdG8gY3VzdG9taXplIHdyYXBwaW5nIGJlaGF2aW91ci4KKyAgICAiIiIKKyAgICB3ID0gVGV4dFdyYXBwZXIod2lkdGg9d2lkdGgsICoqa3dhcmdzKQorICAgIHJldHVybiB3LmZpbGwodGV4dCkKKworCisjIC0tIExvb3NlbHkgcmVsYXRlZCBmdW5jdGlvbmFsaXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworX3doaXRlc3BhY2Vfb25seV9yZSA9IHJlLmNvbXBpbGUoJ15bIFx0XSskJywgcmUuTVVMVElMSU5FKQorX2xlYWRpbmdfd2hpdGVzcGFjZV9yZSA9IHJlLmNvbXBpbGUoJyheWyBcdF0qKSg/OlteIFx0XG5dKScsIHJlLk1VTFRJTElORSkKKworZGVmIGRlZGVudCh0ZXh0KToKKyAgICAiIiJSZW1vdmUgYW55IGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lIGluIGB0ZXh0YC4KKworICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gbWFrZSB0cmlwbGUtcXVvdGVkIHN0cmluZ3MgbGluZSB1cCB3aXRoIHRoZSBsZWZ0CisgICAgZWRnZSBvZiB0aGUgZGlzcGxheSwgd2hpbGUgc3RpbGwgcHJlc2VudGluZyB0aGVtIGluIHRoZSBzb3VyY2UgY29kZQorICAgIGluIGluZGVudGVkIGZvcm0uCisKKyAgICBOb3RlIHRoYXQgdGFicyBhbmQgc3BhY2VzIGFyZSBib3RoIHRyZWF0ZWQgYXMgd2hpdGVzcGFjZSwgYnV0IHRoZXkKKyAgICBhcmUgbm90IGVxdWFsOiB0aGUgbGluZXMgIiAgaGVsbG8iIGFuZCAiXHRoZWxsbyIgYXJlCisgICAgY29uc2lkZXJlZCB0byBoYXZlIG5vIGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UuICAoVGhpcyBiZWhhdmlvdXIgaXMKKyAgICBuZXcgaW4gUHl0aG9uIDIuNTsgb2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBtb2R1bGUgaW5jb3JyZWN0bHkKKyAgICBleHBhbmRlZCB0YWJzIGJlZm9yZSBzZWFyY2hpbmcgZm9yIGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UuKQorICAgICIiIgorICAgICMgTG9vayBmb3IgdGhlIGxvbmdlc3QgbGVhZGluZyBzdHJpbmcgb2Ygc3BhY2VzIGFuZCB0YWJzIGNvbW1vbiB0bworICAgICMgYWxsIGxpbmVzLgorICAgIG1hcmdpbiA9IE5vbmUKKyAgICB0ZXh0ID0gX3doaXRlc3BhY2Vfb25seV9yZS5zdWIoJycsIHRleHQpCisgICAgaW5kZW50cyA9IF9sZWFkaW5nX3doaXRlc3BhY2VfcmUuZmluZGFsbCh0ZXh0KQorICAgIGZvciBpbmRlbnQgaW4gaW5kZW50czoKKyAgICAgICAgaWYgbWFyZ2luIGlzIE5vbmU6CisgICAgICAgICAgICBtYXJnaW4gPSBpbmRlbnQKKworICAgICAgICAjIEN1cnJlbnQgbGluZSBtb3JlIGRlZXBseSBpbmRlbnRlZCB0aGFuIHByZXZpb3VzIHdpbm5lcjoKKyAgICAgICAgIyBubyBjaGFuZ2UgKHByZXZpb3VzIHdpbm5lciBpcyBzdGlsbCBvbiB0b3ApLgorICAgICAgICBlbGlmIGluZGVudC5zdGFydHN3aXRoKG1hcmdpbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBDdXJyZW50IGxpbmUgY29uc2lzdGVudCB3aXRoIGFuZCBubyBkZWVwZXIgdGhhbiBwcmV2aW91cyB3aW5uZXI6CisgICAgICAgICMgaXQncyB0aGUgbmV3IHdpbm5lci4KKyAgICAgICAgZWxpZiBtYXJnaW4uc3RhcnRzd2l0aChpbmRlbnQpOgorICAgICAgICAgICAgbWFyZ2luID0gaW5kZW50CisKKyAgICAgICAgIyBDdXJyZW50IGxpbmUgYW5kIHByZXZpb3VzIHdpbm5lciBoYXZlIG5vIGNvbW1vbiB3aGl0ZXNwYWNlOgorICAgICAgICAjIHRoZXJlIGlzIG5vIG1hcmdpbi4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hcmdpbiA9ICIiCisgICAgICAgICAgICBicmVhaworCisgICAgIyBzYW5pdHkgY2hlY2sgKHRlc3RpbmcvZGVidWdnaW5nIG9ubHkpCisgICAgaWYgMCBhbmQgbWFyZ2luOgorICAgICAgICBmb3IgbGluZSBpbiB0ZXh0LnNwbGl0KCJcbiIpOgorICAgICAgICAgICAgYXNzZXJ0IG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aChtYXJnaW4pLCBcCisgICAgICAgICAgICAgICAgICAgImxpbmUgPSAlciwgbWFyZ2luID0gJXIiICUgKGxpbmUsIG1hcmdpbikKKworICAgIGlmIG1hcmdpbjoKKyAgICAgICAgdGV4dCA9IHJlLnN1YihyJyg/bSleJyArIG1hcmdpbiwgJycsIHRleHQpCisgICAgcmV0dXJuIHRleHQKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICAjcHJpbnQgZGVkZW50KCJcdGZvb1xuXHRiYXIiKQorICAgICNwcmludCBkZWRlbnQoIiAgXHRoZWxsbyB0aGVyZVxuICBcdCAgaG93IGFyZSB5b3U/IikKKyAgICBwcmludCBkZWRlbnQoIkhlbGxvIHRoZXJlLlxuICBUaGlzIGlzIGluZGVudGVkLiIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RleHR3cmFwLnB5YyBiL2xpYi9weXRob24yLjcvdGV4dHdyYXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNWExZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RleHR3cmFwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RleHR3cmFwLnB5byBiL2xpYi9weXRob24yLjcvdGV4dHdyYXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYTk3NGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RleHR3cmFwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RoaXMucHkgYi9saWIvcHl0aG9uMi43L3RoaXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc3NTRiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGhpcy5weQpAQCAtMCwwICsxLDI4IEBACitzID0gIiIiR3VyIE1yYSBicyBDbGd1YmEsIG9sIEd2eiBDcmdyZWYKKworT3JuaGd2c2h5IHZmIG9yZ2dyZSBndW5hIGh0eWwuCitSa2N5dnB2ZyB2ZiBvcmdncmUgZ3VuYSB2emN5dnB2Zy4KK0Z2emN5ciB2ZiBvcmdncmUgZ3VuYSBwYnpjeXJrLgorUGJ6Y3lyayB2ZiBvcmdncmUgZ3VuYSBwYnpjeXZwbmdycS4KK1N5bmcgdmYgb3JnZ3JlIGd1bmEgYXJmZ3JxLgorRmNuZWZyIHZmIG9yZ2dyZSBndW5hIHFyYWZyLgorRXJucW5vdnl2Z2wgcGJoYWdmLgorRmNycHZueSBwbmZyZiBuZXJhJ2cgZmNycHZueSByYWJodHUgZ2Igb2VybnggZ3VyIGVoeXJmLgorTnlndWJodHUgY2VucGd2cG55dmdsIG9ybmdmIGNoZXZnbC4KK1JlZWJlZiBmdWJoeXEgYXJpcmUgY25mZiBmdnlyYWd5bC4KK0hheXJmZiBya2N5dnB2Z3lsIGZ2eXJhcHJxLgorVmEgZ3VyIHNucHIgYnMgbnpvdnRodmdsLCBlcnNoZnIgZ3VyIGdyemNnbmd2YmEgZ2IgdGhyZmYuCitHdXJlciBmdWJoeXEgb3IgYmFyLS0gbmFxIGNlcnNyZW5veWwgYmF5bCBiYXIgLS1ib2l2YmhmIGpubCBnYiBxYiB2Zy4KK055Z3ViaHR1IGd1bmcgam5sIHpubCBhYmcgb3IgYm9pdmJoZiBuZyBzdmVmZyBoYXlyZmYgbGJoJ2VyIFFoZ3B1LgorQWJqIHZmIG9yZ2dyZSBndW5hIGFyaXJlLgorTnlndWJodHUgYXJpcmUgdmYgYnNncmEgb3JnZ3JlIGd1bmEgKmV2dHVnKiBhYmouCitWcyBndXIgdnpjeXJ6cmFnbmd2YmEgdmYgdW5lcSBnYiBya2N5bnZhLCB2ZydmIG4gb25xIHZxcm4uCitWcyBndXIgdnpjeXJ6cmFnbmd2YmEgdmYgcm5mbCBnYiBya2N5bnZhLCB2ZyB6bmwgb3IgbiB0YmJxIHZxcm4uCitBbnpyZmNucHJmIG5lciBiYXIgdWJheHZhdCB0ZXJuZyB2cXJuIC0tIHlyZydmIHFiIHpiZXIgYnMgZ3ViZnIhIiIiCisKK2QgPSB7fQorZm9yIGMgaW4gKDY1LCA5Nyk6CisgICAgZm9yIGkgaW4gcmFuZ2UoMjYpOgorICAgICAgICBkW2NocihpK2MpXSA9IGNocigoaSsxMykgJSAyNiArIGMpCisKK3ByaW50ICIiLmpvaW4oW2QuZ2V0KGMsIGMpIGZvciBjIGluIHNdKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90aGlzLnB5YyBiL2xpYi9weXRob24yLjcvdGhpcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwMzMwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGhpcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90aGlzLnB5byBiL2xpYi9weXRob24yLjcvdGhpcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwMzMwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGhpcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90aHJlYWRpbmcucHkgYi9saWIvcHl0aG9uMi43L3RocmVhZGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjU0NDhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90aHJlYWRpbmcucHkKQEAgLTAsMCArMSwxMzI5IEBACisiIiJUaHJlYWQgbW9kdWxlIGVtdWxhdGluZyBhIHN1YnNldCBvZiBKYXZhJ3MgdGhyZWFkaW5nIG1vZGVsLiIiIgorCitpbXBvcnQgc3lzIGFzIF9zeXMKKwordHJ5OgorICAgIGltcG9ydCB0aHJlYWQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBkZWwgX3N5cy5tb2R1bGVzW19fbmFtZV9fXQorICAgIHJhaXNlCisKK2ltcG9ydCB3YXJuaW5ncworCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZSBhcyBfZGVxdWUKK2Zyb20gdGltZSBpbXBvcnQgdGltZSBhcyBfdGltZSwgc2xlZXAgYXMgX3NsZWVwCitmcm9tIHRyYWNlYmFjayBpbXBvcnQgZm9ybWF0X2V4YyBhcyBfZm9ybWF0X2V4YworCisjIE5vdGUgcmVnYXJkaW5nIFBFUCA4IGNvbXBsaWFudCBhbGlhc2VzCisjICBUaGlzIHRocmVhZGluZyBtb2RlbCB3YXMgb3JpZ2luYWxseSBpbnNwaXJlZCBieSBKYXZhLCBhbmQgaW5oZXJpdGVkCisjIHRoZSBjb252ZW50aW9uIG9mIGNhbWVsQ2FzZSBmdW5jdGlvbiBhbmQgbWV0aG9kIG5hbWVzIGZyb20gdGhhdAorIyBsYW5ndWFnZS4gV2hpbGUgdGhvc2UgbmFtZXMgYXJlIG5vdCBpbiBhbnkgaW1taW5lbnQgZGFuZ2VyIG9mIGJlaW5nCisjIGRlcHJlY2F0ZWQsIHN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuNiwgdGhlIG1vZHVsZSBub3cgcHJvdmlkZXMgYQorIyBQRVAgOCBjb21wbGlhbnQgYWxpYXMgZm9yIGFueSBzdWNoIG1ldGhvZCBuYW1lLgorIyBVc2luZyB0aGUgbmV3IFBFUCA4IGNvbXBsaWFudCBuYW1lcyBhbHNvIGZhY2lsaXRhdGVzIHN1YnN0aXR1dGlvbgorIyB3aXRoIHRoZSBtdWx0aXByb2Nlc3NpbmcgbW9kdWxlLCB3aGljaCBkb2Vzbid0IHByb3ZpZGUgdGhlIG9sZAorIyBKYXZhIGluc3BpcmVkIG5hbWVzLgorCisKKyMgUmVuYW1lIHNvbWUgc3R1ZmYgc28gImZyb20gdGhyZWFkaW5nIGltcG9ydCAqIiBpcyBzYWZlCitfX2FsbF9fID0gWydhY3RpdmVDb3VudCcsICdhY3RpdmVfY291bnQnLCAnQ29uZGl0aW9uJywgJ2N1cnJlbnRUaHJlYWQnLAorICAgICAgICAgICAnY3VycmVudF90aHJlYWQnLCAnZW51bWVyYXRlJywgJ0V2ZW50JywKKyAgICAgICAgICAgJ0xvY2snLCAnUkxvY2snLCAnU2VtYXBob3JlJywgJ0JvdW5kZWRTZW1hcGhvcmUnLCAnVGhyZWFkJywKKyAgICAgICAgICAgJ1RpbWVyJywgJ3NldHByb2ZpbGUnLCAnc2V0dHJhY2UnLCAnbG9jYWwnLCAnc3RhY2tfc2l6ZSddCisKK19zdGFydF9uZXdfdGhyZWFkID0gdGhyZWFkLnN0YXJ0X25ld190aHJlYWQKK19hbGxvY2F0ZV9sb2NrID0gdGhyZWFkLmFsbG9jYXRlX2xvY2sKK19nZXRfaWRlbnQgPSB0aHJlYWQuZ2V0X2lkZW50CitUaHJlYWRFcnJvciA9IHRocmVhZC5lcnJvcgorZGVsIHRocmVhZAorCisKKyMgc3lzLmV4Y19jbGVhciBpcyB1c2VkIHRvIHdvcmsgYXJvdW5kIHRoZSBmYWN0IHRoYXQgZXhjZXB0IGJsb2NrcworIyBkb24ndCBmdWxseSBjbGVhciB0aGUgZXhjZXB0aW9uIHVudGlsIDMuMC4KK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnLCBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGU9J3RocmVhZGluZycsIG1lc3NhZ2U9J3N5cy5leGNfY2xlYXInKQorCisjIERlYnVnIHN1cHBvcnQgKGFkYXB0ZWQgZnJvbSBpaG9va3MucHkpLgorIyBBbGwgdGhlIG1ham9yIGNsYXNzZXMgaGVyZSBkZXJpdmUgZnJvbSBfVmVyYm9zZS4gIFdlIGZvcmNlIHRoYXQgdG8KKyMgYmUgYSBuZXctc3R5bGUgY2xhc3Mgc28gdGhhdCBhbGwgdGhlIG1ham9yIGNsYXNzZXMgaGVyZSBhcmUgbmV3LXN0eWxlLgorIyBUaGlzIGhlbHBzIGRlYnVnZ2luZyAodHlwZShpbnN0YW5jZSkgaXMgbW9yZSByZXZlYWxpbmcgZm9yIGluc3RhbmNlcworIyBvZiBuZXctc3R5bGUgY2xhc3NlcykuCisKK19WRVJCT1NFID0gRmFsc2UKKworaWYgX19kZWJ1Z19fOgorCisgICAgY2xhc3MgX1ZlcmJvc2Uob2JqZWN0KToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyYm9zZT1Ob25lKToKKyAgICAgICAgICAgIGlmIHZlcmJvc2UgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB2ZXJib3NlID0gX1ZFUkJPU0UKKyAgICAgICAgICAgIHNlbGYuX192ZXJib3NlID0gdmVyYm9zZQorCisgICAgICAgIGRlZiBfbm90ZShzZWxmLCBmb3JtYXQsICphcmdzKToKKyAgICAgICAgICAgIGlmIHNlbGYuX192ZXJib3NlOgorICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCAlIGFyZ3MKKyAgICAgICAgICAgICAgICAjIElzc3VlICM0MTg4OiBjYWxsaW5nIGN1cnJlbnRfdGhyZWFkKCkgY2FuIGluY3VyIGFuIGluZmluaXRlCisgICAgICAgICAgICAgICAgIyByZWN1cnNpb24gaWYgaXQgaGFzIHRvIGNyZWF0ZSBhIER1bW15VGhyZWFkIG9uIHRoZSBmbHkuCisgICAgICAgICAgICAgICAgaWRlbnQgPSBfZ2V0X2lkZW50KCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBfYWN0aXZlW2lkZW50XS5uYW1lCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gIjxPUyB0aHJlYWQgJWQ+IiAlIGlkZW50CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gIiVzOiAlc1xuIiAlIChuYW1lLCBmb3JtYXQpCisgICAgICAgICAgICAgICAgX3N5cy5zdGRlcnIud3JpdGUoZm9ybWF0KQorCitlbHNlOgorICAgICMgRGlzYWJsZSB0aGlzIHdoZW4gdXNpbmcgInB5dGhvbiAtTyIKKyAgICBjbGFzcyBfVmVyYm9zZShvYmplY3QpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyYm9zZT1Ob25lKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIF9ub3RlKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgIHBhc3MKKworIyBTdXBwb3J0IGZvciBwcm9maWxlIGFuZCB0cmFjZSBob29rcworCitfcHJvZmlsZV9ob29rID0gTm9uZQorX3RyYWNlX2hvb2sgPSBOb25lCisKK2RlZiBzZXRwcm9maWxlKGZ1bmMpOgorICAgICIiIlNldCBhIHByb2ZpbGUgZnVuY3Rpb24gZm9yIGFsbCB0aHJlYWRzIHN0YXJ0ZWQgZnJvbSB0aGUgdGhyZWFkaW5nIG1vZHVsZS4KKworICAgIFRoZSBmdW5jIHdpbGwgYmUgcGFzc2VkIHRvIHN5cy5zZXRwcm9maWxlKCkgZm9yIGVhY2ggdGhyZWFkLCBiZWZvcmUgaXRzCisgICAgcnVuKCkgbWV0aG9kIGlzIGNhbGxlZC4KKworICAgICIiIgorICAgIGdsb2JhbCBfcHJvZmlsZV9ob29rCisgICAgX3Byb2ZpbGVfaG9vayA9IGZ1bmMKKworZGVmIHNldHRyYWNlKGZ1bmMpOgorICAgICIiIlNldCBhIHRyYWNlIGZ1bmN0aW9uIGZvciBhbGwgdGhyZWFkcyBzdGFydGVkIGZyb20gdGhlIHRocmVhZGluZyBtb2R1bGUuCisKKyAgICBUaGUgZnVuYyB3aWxsIGJlIHBhc3NlZCB0byBzeXMuc2V0dHJhY2UoKSBmb3IgZWFjaCB0aHJlYWQsIGJlZm9yZSBpdHMgcnVuKCkKKyAgICBtZXRob2QgaXMgY2FsbGVkLgorCisgICAgIiIiCisgICAgZ2xvYmFsIF90cmFjZV9ob29rCisgICAgX3RyYWNlX2hvb2sgPSBmdW5jCisKKyMgU3luY2hyb25pemF0aW9uIGNsYXNzZXMKKworTG9jayA9IF9hbGxvY2F0ZV9sb2NrCisKK2RlZiBSTG9jaygqYXJncywgKiprd2FyZ3MpOgorICAgICIiIkZhY3RvcnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IHJlZW50cmFudCBsb2NrLgorCisgICAgQSByZWVudHJhbnQgbG9jayBtdXN0IGJlIHJlbGVhc2VkIGJ5IHRoZSB0aHJlYWQgdGhhdCBhY3F1aXJlZCBpdC4gT25jZSBhCisgICAgdGhyZWFkIGhhcyBhY3F1aXJlZCBhIHJlZW50cmFudCBsb2NrLCB0aGUgc2FtZSB0aHJlYWQgbWF5IGFjcXVpcmUgaXQgYWdhaW4KKyAgICB3aXRob3V0IGJsb2NraW5nOyB0aGUgdGhyZWFkIG11c3QgcmVsZWFzZSBpdCBvbmNlIGZvciBlYWNoIHRpbWUgaXQgaGFzCisgICAgYWNxdWlyZWQgaXQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX1JMb2NrKCphcmdzLCAqKmt3YXJncykKKworY2xhc3MgX1JMb2NrKF9WZXJib3NlKToKKyAgICAiIiJBIHJlZW50cmFudCBsb2NrIG11c3QgYmUgcmVsZWFzZWQgYnkgdGhlIHRocmVhZCB0aGF0IGFjcXVpcmVkIGl0LiBPbmNlIGEKKyAgICAgICB0aHJlYWQgaGFzIGFjcXVpcmVkIGEgcmVlbnRyYW50IGxvY2ssIHRoZSBzYW1lIHRocmVhZCBtYXkgYWNxdWlyZSBpdAorICAgICAgIGFnYWluIHdpdGhvdXQgYmxvY2tpbmc7IHRoZSB0aHJlYWQgbXVzdCByZWxlYXNlIGl0IG9uY2UgZm9yIGVhY2ggdGltZSBpdAorICAgICAgIGhhcyBhY3F1aXJlZCBpdC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJib3NlPU5vbmUpOgorICAgICAgICBfVmVyYm9zZS5fX2luaXRfXyhzZWxmLCB2ZXJib3NlKQorICAgICAgICBzZWxmLl9fYmxvY2sgPSBfYWxsb2NhdGVfbG9jaygpCisgICAgICAgIHNlbGYuX19vd25lciA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2NvdW50ID0gMAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBvd25lciA9IHNlbGYuX19vd25lcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvd25lciA9IF9hY3RpdmVbb3duZXJdLm5hbWUKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gIjwlcyBvd25lcj0lciBjb3VudD0lZD4iICUgKAorICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBvd25lciwgc2VsZi5fX2NvdW50KQorCisgICAgZGVmIGFjcXVpcmUoc2VsZiwgYmxvY2tpbmc9MSk6CisgICAgICAgICIiIkFjcXVpcmUgYSBsb2NrLCBibG9ja2luZyBvciBub24tYmxvY2tpbmcuCisKKyAgICAgICAgV2hlbiBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzOiBpZiB0aGlzIHRocmVhZCBhbHJlYWR5IG93bnMgdGhlIGxvY2ssCisgICAgICAgIGluY3JlbWVudCB0aGUgcmVjdXJzaW9uIGxldmVsIGJ5IG9uZSwgYW5kIHJldHVybiBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlLAorICAgICAgICBpZiBhbm90aGVyIHRocmVhZCBvd25zIHRoZSBsb2NrLCBibG9jayB1bnRpbCB0aGUgbG9jayBpcyB1bmxvY2tlZC4gT25jZQorICAgICAgICB0aGUgbG9jayBpcyB1bmxvY2tlZCAobm90IG93bmVkIGJ5IGFueSB0aHJlYWQpLCB0aGVuIGdyYWIgb3duZXJzaGlwLCBzZXQKKyAgICAgICAgdGhlIHJlY3Vyc2lvbiBsZXZlbCB0byBvbmUsIGFuZCByZXR1cm4uIElmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGlzCisgICAgICAgIGJsb2NrZWQgd2FpdGluZyB1bnRpbCB0aGUgbG9jayBpcyB1bmxvY2tlZCwgb25seSBvbmUgYXQgYSB0aW1lIHdpbGwgYmUKKyAgICAgICAgYWJsZSB0byBncmFiIG93bmVyc2hpcCBvZiB0aGUgbG9jay4gVGhlcmUgaXMgbm8gcmV0dXJuIHZhbHVlIGluIHRoaXMKKyAgICAgICAgY2FzZS4KKworICAgICAgICBXaGVuIGludm9rZWQgd2l0aCB0aGUgYmxvY2tpbmcgYXJndW1lbnQgc2V0IHRvIHRydWUsIGRvIHRoZSBzYW1lIHRoaW5nCisgICAgICAgIGFzIHdoZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLCBhbmQgcmV0dXJuIHRydWUuCisKKyAgICAgICAgV2hlbiBpbnZva2VkIHdpdGggdGhlIGJsb2NraW5nIGFyZ3VtZW50IHNldCB0byBmYWxzZSwgZG8gbm90IGJsb2NrLiBJZiBhCisgICAgICAgIGNhbGwgd2l0aG91dCBhbiBhcmd1bWVudCB3b3VsZCBibG9jaywgcmV0dXJuIGZhbHNlIGltbWVkaWF0ZWx5OworICAgICAgICBvdGhlcndpc2UsIGRvIHRoZSBzYW1lIHRoaW5nIGFzIHdoZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLCBhbmQKKyAgICAgICAgcmV0dXJuIHRydWUuCisKKyAgICAgICAgIiIiCisgICAgICAgIG1lID0gX2dldF9pZGVudCgpCisgICAgICAgIGlmIHNlbGYuX19vd25lciA9PSBtZToKKyAgICAgICAgICAgIHNlbGYuX19jb3VudCA9IHNlbGYuX19jb3VudCArIDEKKyAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5hY3F1aXJlKCVzKTogcmVjdXJzaXZlIHN1Y2Nlc3MiLCBzZWxmLCBibG9ja2luZykKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHJjID0gc2VsZi5fX2Jsb2NrLmFjcXVpcmUoYmxvY2tpbmcpCisgICAgICAgIGlmIHJjOgorICAgICAgICAgICAgc2VsZi5fX293bmVyID0gbWUKKyAgICAgICAgICAgIHNlbGYuX19jb3VudCA9IDEKKyAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5hY3F1aXJlKCVzKTogaW5pdGlhbCBzdWNjZXNzIiwgc2VsZiwgYmxvY2tpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuYWNxdWlyZSglcyk6IGZhaWx1cmUiLCBzZWxmLCBibG9ja2luZykKKyAgICAgICAgcmV0dXJuIHJjCisKKyAgICBfX2VudGVyX18gPSBhY3F1aXJlCisKKyAgICBkZWYgcmVsZWFzZShzZWxmKToKKyAgICAgICAgIiIiUmVsZWFzZSBhIGxvY2ssIGRlY3JlbWVudGluZyB0aGUgcmVjdXJzaW9uIGxldmVsLgorCisgICAgICAgIElmIGFmdGVyIHRoZSBkZWNyZW1lbnQgaXQgaXMgemVybywgcmVzZXQgdGhlIGxvY2sgdG8gdW5sb2NrZWQgKG5vdCBvd25lZAorICAgICAgICBieSBhbnkgdGhyZWFkKSwgYW5kIGlmIGFueSBvdGhlciB0aHJlYWRzIGFyZSBibG9ja2VkIHdhaXRpbmcgZm9yIHRoZQorICAgICAgICBsb2NrIHRvIGJlY29tZSB1bmxvY2tlZCwgYWxsb3cgZXhhY3RseSBvbmUgb2YgdGhlbSB0byBwcm9jZWVkLiBJZiBhZnRlcgorICAgICAgICB0aGUgZGVjcmVtZW50IHRoZSByZWN1cnNpb24gbGV2ZWwgaXMgc3RpbGwgbm9uemVybywgdGhlIGxvY2sgcmVtYWlucworICAgICAgICBsb2NrZWQgYW5kIG93bmVkIGJ5IHRoZSBjYWxsaW5nIHRocmVhZC4KKworICAgICAgICBPbmx5IGNhbGwgdGhpcyBtZXRob2Qgd2hlbiB0aGUgY2FsbGluZyB0aHJlYWQgb3ducyB0aGUgbG9jay4gQQorICAgICAgICBSdW50aW1lRXJyb3IgaXMgcmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBsb2NrIGlzCisgICAgICAgIHVubG9ja2VkLgorCisgICAgICAgIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fX293bmVyICE9IF9nZXRfaWRlbnQoKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiY2Fubm90IHJlbGVhc2UgdW4tYWNxdWlyZWQgbG9jayIpCisgICAgICAgIHNlbGYuX19jb3VudCA9IGNvdW50ID0gc2VsZi5fX2NvdW50IC0gMQorICAgICAgICBpZiBub3QgY291bnQ6CisgICAgICAgICAgICBzZWxmLl9fb3duZXIgPSBOb25lCisgICAgICAgICAgICBzZWxmLl9fYmxvY2sucmVsZWFzZSgpCisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMucmVsZWFzZSgpOiBmaW5hbCByZWxlYXNlIiwgc2VsZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5yZWxlYXNlKCk6IG5vbi1maW5hbCByZWxlYXNlIiwgc2VsZikKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0LCB2LCB0Yik6CisgICAgICAgIHNlbGYucmVsZWFzZSgpCisKKyAgICAjIEludGVybmFsIG1ldGhvZHMgdXNlZCBieSBjb25kaXRpb24gdmFyaWFibGVzCisKKyAgICBkZWYgX2FjcXVpcmVfcmVzdG9yZShzZWxmLCBjb3VudF9vd25lcik6CisgICAgICAgIGNvdW50LCBvd25lciA9IGNvdW50X293bmVyCisgICAgICAgIHNlbGYuX19ibG9jay5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5fX2NvdW50ID0gY291bnQKKyAgICAgICAgc2VsZi5fX293bmVyID0gb3duZXIKKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuX2FjcXVpcmVfcmVzdG9yZSgpIiwgc2VsZikKKworICAgIGRlZiBfcmVsZWFzZV9zYXZlKHNlbGYpOgorICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5fcmVsZWFzZV9zYXZlKCkiLCBzZWxmKQorICAgICAgICBjb3VudCA9IHNlbGYuX19jb3VudAorICAgICAgICBzZWxmLl9fY291bnQgPSAwCisgICAgICAgIG93bmVyID0gc2VsZi5fX293bmVyCisgICAgICAgIHNlbGYuX19vd25lciA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2Jsb2NrLnJlbGVhc2UoKQorICAgICAgICByZXR1cm4gKGNvdW50LCBvd25lcikKKworICAgIGRlZiBfaXNfb3duZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fb3duZXIgPT0gX2dldF9pZGVudCgpCisKKworZGVmIENvbmRpdGlvbigqYXJncywgKiprd2FyZ3MpOgorICAgICIiIkZhY3RvcnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IGNvbmRpdGlvbiB2YXJpYWJsZSBvYmplY3QuCisKKyAgICBBIGNvbmRpdGlvbiB2YXJpYWJsZSBhbGxvd3Mgb25lIG9yIG1vcmUgdGhyZWFkcyB0byB3YWl0IHVudGlsIHRoZXkgYXJlCisgICAgbm90aWZpZWQgYnkgYW5vdGhlciB0aHJlYWQuCisKKyAgICBJZiB0aGUgbG9jayBhcmd1bWVudCBpcyBnaXZlbiBhbmQgbm90IE5vbmUsIGl0IG11c3QgYmUgYSBMb2NrIG9yIFJMb2NrCisgICAgb2JqZWN0LCBhbmQgaXQgaXMgdXNlZCBhcyB0aGUgdW5kZXJseWluZyBsb2NrLiBPdGhlcndpc2UsIGEgbmV3IFJMb2NrIG9iamVjdAorICAgIGlzIGNyZWF0ZWQgYW5kIHVzZWQgYXMgdGhlIHVuZGVybHlpbmcgbG9jay4KKworICAgICIiIgorICAgIHJldHVybiBfQ29uZGl0aW9uKCphcmdzLCAqKmt3YXJncykKKworY2xhc3MgX0NvbmRpdGlvbihfVmVyYm9zZSk6CisgICAgIiIiQ29uZGl0aW9uIHZhcmlhYmxlcyBhbGxvdyBvbmUgb3IgbW9yZSB0aHJlYWRzIHRvIHdhaXQgdW50aWwgdGhleSBhcmUKKyAgICAgICBub3RpZmllZCBieSBhbm90aGVyIHRocmVhZC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2NrPU5vbmUsIHZlcmJvc2U9Tm9uZSk6CisgICAgICAgIF9WZXJib3NlLl9faW5pdF9fKHNlbGYsIHZlcmJvc2UpCisgICAgICAgIGlmIGxvY2sgaXMgTm9uZToKKyAgICAgICAgICAgIGxvY2sgPSBSTG9jaygpCisgICAgICAgIHNlbGYuX19sb2NrID0gbG9jaworICAgICAgICAjIEV4cG9ydCB0aGUgbG9jaydzIGFjcXVpcmUoKSBhbmQgcmVsZWFzZSgpIG1ldGhvZHMKKyAgICAgICAgc2VsZi5hY3F1aXJlID0gbG9jay5hY3F1aXJlCisgICAgICAgIHNlbGYucmVsZWFzZSA9IGxvY2sucmVsZWFzZQorICAgICAgICAjIElmIHRoZSBsb2NrIGRlZmluZXMgX3JlbGVhc2Vfc2F2ZSgpIGFuZC9vciBfYWNxdWlyZV9yZXN0b3JlKCksCisgICAgICAgICMgdGhlc2Ugb3ZlcnJpZGUgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zICh3aGljaCBqdXN0IGNhbGwKKyAgICAgICAgIyByZWxlYXNlKCkgYW5kIGFjcXVpcmUoKSBvbiB0aGUgbG9jaykuICBEaXR0byBmb3IgX2lzX293bmVkKCkuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3JlbGVhc2Vfc2F2ZSA9IGxvY2suX3JlbGVhc2Vfc2F2ZQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2FjcXVpcmVfcmVzdG9yZSA9IGxvY2suX2FjcXVpcmVfcmVzdG9yZQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2lzX293bmVkID0gbG9jay5faXNfb3duZWQKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLl9fd2FpdGVycyA9IFtdCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2xvY2suX19lbnRlcl9fKCkKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9fbG9jay5fX2V4aXRfXygqYXJncykKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8Q29uZGl0aW9uKCVzLCAlZCk+IiAlIChzZWxmLl9fbG9jaywgbGVuKHNlbGYuX193YWl0ZXJzKSkKKworICAgIGRlZiBfcmVsZWFzZV9zYXZlKHNlbGYpOgorICAgICAgICBzZWxmLl9fbG9jay5yZWxlYXNlKCkgICAgICAgICAgICMgTm8gc3RhdGUgdG8gc2F2ZQorCisgICAgZGVmIF9hY3F1aXJlX3Jlc3RvcmUoc2VsZiwgeCk6CisgICAgICAgIHNlbGYuX19sb2NrLmFjcXVpcmUoKSAgICAgICAgICAgIyBJZ25vcmUgc2F2ZWQgc3RhdGUKKworICAgIGRlZiBfaXNfb3duZWQoc2VsZik6CisgICAgICAgICMgUmV0dXJuIFRydWUgaWYgbG9jayBpcyBvd25lZCBieSBjdXJyZW50X3RocmVhZC4KKyAgICAgICAgIyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25seSBpZiBfX2xvY2sgZG9lc24ndCBoYXZlIF9pc19vd25lZCgpLgorICAgICAgICBpZiBzZWxmLl9fbG9jay5hY3F1aXJlKDApOgorICAgICAgICAgICAgc2VsZi5fX2xvY2sucmVsZWFzZSgpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgd2FpdChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiJXYWl0IHVudGlsIG5vdGlmaWVkIG9yIHVudGlsIGEgdGltZW91dCBvY2N1cnMuCisKKyAgICAgICAgSWYgdGhlIGNhbGxpbmcgdGhyZWFkIGhhcyBub3QgYWNxdWlyZWQgdGhlIGxvY2sgd2hlbiB0aGlzIG1ldGhvZCBpcworICAgICAgICBjYWxsZWQsIGEgUnVudGltZUVycm9yIGlzIHJhaXNlZC4KKworICAgICAgICBUaGlzIG1ldGhvZCByZWxlYXNlcyB0aGUgdW5kZXJseWluZyBsb2NrLCBhbmQgdGhlbiBibG9ja3MgdW50aWwgaXQgaXMKKyAgICAgICAgYXdha2VuZWQgYnkgYSBub3RpZnkoKSBvciBub3RpZnlBbGwoKSBjYWxsIGZvciB0aGUgc2FtZSBjb25kaXRpb24KKyAgICAgICAgdmFyaWFibGUgaW4gYW5vdGhlciB0aHJlYWQsIG9yIHVudGlsIHRoZSBvcHRpb25hbCB0aW1lb3V0IG9jY3Vycy4gT25jZQorICAgICAgICBhd2FrZW5lZCBvciB0aW1lZCBvdXQsIGl0IHJlLWFjcXVpcmVzIHRoZSBsb2NrIGFuZCByZXR1cm5zLgorCisgICAgICAgIFdoZW4gdGhlIHRpbWVvdXQgYXJndW1lbnQgaXMgcHJlc2VudCBhbmQgbm90IE5vbmUsIGl0IHNob3VsZCBiZSBhCisgICAgICAgIGZsb2F0aW5nIHBvaW50IG51bWJlciBzcGVjaWZ5aW5nIGEgdGltZW91dCBmb3IgdGhlIG9wZXJhdGlvbiBpbiBzZWNvbmRzCisgICAgICAgIChvciBmcmFjdGlvbnMgdGhlcmVvZikuCisKKyAgICAgICAgV2hlbiB0aGUgdW5kZXJseWluZyBsb2NrIGlzIGFuIFJMb2NrLCBpdCBpcyBub3QgcmVsZWFzZWQgdXNpbmcgaXRzCisgICAgICAgIHJlbGVhc2UoKSBtZXRob2QsIHNpbmNlIHRoaXMgbWF5IG5vdCBhY3R1YWxseSB1bmxvY2sgdGhlIGxvY2sgd2hlbiBpdAorICAgICAgICB3YXMgYWNxdWlyZWQgbXVsdGlwbGUgdGltZXMgcmVjdXJzaXZlbHkuIEluc3RlYWQsIGFuIGludGVybmFsIGludGVyZmFjZQorICAgICAgICBvZiB0aGUgUkxvY2sgY2xhc3MgaXMgdXNlZCwgd2hpY2ggcmVhbGx5IHVubG9ja3MgaXQgZXZlbiB3aGVuIGl0IGhhcworICAgICAgICBiZWVuIHJlY3Vyc2l2ZWx5IGFjcXVpcmVkIHNldmVyYWwgdGltZXMuIEFub3RoZXIgaW50ZXJuYWwgaW50ZXJmYWNlIGlzCisgICAgICAgIHRoZW4gdXNlZCB0byByZXN0b3JlIHRoZSByZWN1cnNpb24gbGV2ZWwgd2hlbiB0aGUgbG9jayBpcyByZWFjcXVpcmVkLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi5faXNfb3duZWQoKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiY2Fubm90IHdhaXQgb24gdW4tYWNxdWlyZWQgbG9jayIpCisgICAgICAgIHdhaXRlciA9IF9hbGxvY2F0ZV9sb2NrKCkKKyAgICAgICAgd2FpdGVyLmFjcXVpcmUoKQorICAgICAgICBzZWxmLl9fd2FpdGVycy5hcHBlbmQod2FpdGVyKQorICAgICAgICBzYXZlZF9zdGF0ZSA9IHNlbGYuX3JlbGVhc2Vfc2F2ZSgpCisgICAgICAgIHRyeTogICAgIyByZXN0b3JlIHN0YXRlIG5vIG1hdHRlciB3aGF0IChlLmcuLCBLZXlib2FyZEludGVycnVwdCkKKyAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB3YWl0ZXIuYWNxdWlyZSgpCisgICAgICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy53YWl0KCk6IGdvdCBpdCIsIHNlbGYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQmFsYW5jaW5nIGFjdDogIFdlIGNhbid0IGFmZm9yZCBhIHB1cmUgYnVzeSBsb29wLCBzbyB3ZQorICAgICAgICAgICAgICAgICMgaGF2ZSB0byBzbGVlcDsgYnV0IGlmIHdlIHNsZWVwIHRoZSB3aG9sZSB0aW1lb3V0IHRpbWUsCisgICAgICAgICAgICAgICAgIyB3ZSdsbCBiZSB1bnJlc3BvbnNpdmUuICBUaGUgc2NoZW1lIGhlcmUgc2xlZXBzIHZlcnkKKyAgICAgICAgICAgICAgICAjIGxpdHRsZSBhdCBmaXJzdCwgbG9uZ2VyIGFzIHRpbWUgZ29lcyBvbiwgYnV0IG5ldmVyIGxvbmdlcgorICAgICAgICAgICAgICAgICMgdGhhbiAyMCB0aW1lcyBwZXIgc2Vjb25kIChvciB0aGUgdGltZW91dCB0aW1lIHJlbWFpbmluZykuCisgICAgICAgICAgICAgICAgZW5kdGltZSA9IF90aW1lKCkgKyB0aW1lb3V0CisgICAgICAgICAgICAgICAgZGVsYXkgPSAwLjAwMDUgIyA1MDAgdXMgLT4gaW5pdGlhbCBkZWxheSBvZiAxIG1zCisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgZ290aXQgPSB3YWl0ZXIuYWNxdWlyZSgwKQorICAgICAgICAgICAgICAgICAgICBpZiBnb3RpdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IGVuZHRpbWUgLSBfdGltZSgpCisgICAgICAgICAgICAgICAgICAgIGlmIHJlbWFpbmluZyA8PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZGVsYXkgPSBtaW4oZGVsYXkgKiAyLCByZW1haW5pbmcsIC4wNSkKKyAgICAgICAgICAgICAgICAgICAgX3NsZWVwKGRlbGF5KQorICAgICAgICAgICAgICAgIGlmIG5vdCBnb3RpdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMud2FpdCglcyk6IHRpbWVkIG91dCIsIHNlbGYsIHRpbWVvdXQpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX193YWl0ZXJzLnJlbW92ZSh3YWl0ZXIpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLndhaXQoJXMpOiBnb3QgaXQiLCBzZWxmLCB0aW1lb3V0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fYWNxdWlyZV9yZXN0b3JlKHNhdmVkX3N0YXRlKQorCisgICAgZGVmIG5vdGlmeShzZWxmLCBuPTEpOgorICAgICAgICAiIiJXYWtlIHVwIG9uZSBvciBtb3JlIHRocmVhZHMgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbiwgaWYgYW55LgorCisgICAgICAgIElmIHRoZSBjYWxsaW5nIHRocmVhZCBoYXMgbm90IGFjcXVpcmVkIHRoZSBsb2NrIHdoZW4gdGhpcyBtZXRob2QgaXMKKyAgICAgICAgY2FsbGVkLCBhIFJ1bnRpbWVFcnJvciBpcyByYWlzZWQuCisKKyAgICAgICAgVGhpcyBtZXRob2Qgd2FrZXMgdXAgYXQgbW9zdCBuIG9mIHRoZSB0aHJlYWRzIHdhaXRpbmcgZm9yIHRoZSBjb25kaXRpb24KKyAgICAgICAgdmFyaWFibGU7IGl0IGlzIGEgbm8tb3AgaWYgbm8gdGhyZWFkcyBhcmUgd2FpdGluZy4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX2lzX293bmVkKCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImNhbm5vdCBub3RpZnkgb24gdW4tYWNxdWlyZWQgbG9jayIpCisgICAgICAgIF9fd2FpdGVycyA9IHNlbGYuX193YWl0ZXJzCisgICAgICAgIHdhaXRlcnMgPSBfX3dhaXRlcnNbOm5dCisgICAgICAgIGlmIG5vdCB3YWl0ZXJzOgorICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLm5vdGlmeSgpOiBubyB3YWl0ZXJzIiwgc2VsZikKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9ub3RlKCIlcy5ub3RpZnkoKTogbm90aWZ5aW5nICVkIHdhaXRlciVzIiwgc2VsZiwgbiwKKyAgICAgICAgICAgICAgICAgICBuIT0xIGFuZCAicyIgb3IgIiIpCisgICAgICAgIGZvciB3YWl0ZXIgaW4gd2FpdGVyczoKKyAgICAgICAgICAgIHdhaXRlci5yZWxlYXNlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfX3dhaXRlcnMucmVtb3ZlKHdhaXRlcikKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBub3RpZnlBbGwoc2VsZik6CisgICAgICAgICIiIldha2UgdXAgYWxsIHRocmVhZHMgd2FpdGluZyBvbiB0aGlzIGNvbmRpdGlvbi4KKworICAgICAgICBJZiB0aGUgY2FsbGluZyB0aHJlYWQgaGFzIG5vdCBhY3F1aXJlZCB0aGUgbG9jayB3aGVuIHRoaXMgbWV0aG9kCisgICAgICAgIGlzIGNhbGxlZCwgYSBSdW50aW1lRXJyb3IgaXMgcmFpc2VkLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm5vdGlmeShsZW4oc2VsZi5fX3dhaXRlcnMpKQorCisgICAgbm90aWZ5X2FsbCA9IG5vdGlmeUFsbAorCisKK2RlZiBTZW1hcGhvcmUoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiJBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IHNlbWFwaG9yZS4KKworICAgIFNlbWFwaG9yZXMgbWFuYWdlIGEgY291bnRlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiByZWxlYXNlKCkgY2FsbHMgbWludXMKKyAgICB0aGUgbnVtYmVyIG9mIGFjcXVpcmUoKSBjYWxscywgcGx1cyBhbiBpbml0aWFsIHZhbHVlLiBUaGUgYWNxdWlyZSgpIG1ldGhvZAorICAgIGJsb2NrcyBpZiBuZWNlc3NhcnkgdW50aWwgaXQgY2FuIHJldHVybiB3aXRob3V0IG1ha2luZyB0aGUgY291bnRlcgorICAgIG5lZ2F0aXZlLiBJZiBub3QgZ2l2ZW4sIHZhbHVlIGRlZmF1bHRzIHRvIDEuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX1NlbWFwaG9yZSgqYXJncywgKiprd2FyZ3MpCisKK2NsYXNzIF9TZW1hcGhvcmUoX1ZlcmJvc2UpOgorICAgICIiIlNlbWFwaG9yZXMgbWFuYWdlIGEgY291bnRlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiByZWxlYXNlKCkgY2FsbHMKKyAgICAgICBtaW51cyB0aGUgbnVtYmVyIG9mIGFjcXVpcmUoKSBjYWxscywgcGx1cyBhbiBpbml0aWFsIHZhbHVlLiBUaGUgYWNxdWlyZSgpCisgICAgICAgbWV0aG9kIGJsb2NrcyBpZiBuZWNlc3NhcnkgdW50aWwgaXQgY2FuIHJldHVybiB3aXRob3V0IG1ha2luZyB0aGUgY291bnRlcgorICAgICAgIG5lZ2F0aXZlLiBJZiBub3QgZ2l2ZW4sIHZhbHVlIGRlZmF1bHRzIHRvIDEuCisKKyAgICAiIiIKKworICAgICMgQWZ0ZXIgVGltIFBldGVycycgc2VtYXBob3JlIGNsYXNzLCBidXQgbm90IHF1aXRlIHRoZSBzYW1lIChubyBtYXhpbXVtKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlPTEsIHZlcmJvc2U9Tm9uZSk6CisgICAgICAgIGlmIHZhbHVlIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInNlbWFwaG9yZSBpbml0aWFsIHZhbHVlIG11c3QgYmUgPj0gMCIpCisgICAgICAgIF9WZXJib3NlLl9faW5pdF9fKHNlbGYsIHZlcmJvc2UpCisgICAgICAgIHNlbGYuX19jb25kID0gQ29uZGl0aW9uKExvY2soKSkKKyAgICAgICAgc2VsZi5fX3ZhbHVlID0gdmFsdWUKKworICAgIGRlZiBhY3F1aXJlKHNlbGYsIGJsb2NraW5nPTEpOgorICAgICAgICAiIiJBY3F1aXJlIGEgc2VtYXBob3JlLCBkZWNyZW1lbnRpbmcgdGhlIGludGVybmFsIGNvdW50ZXIgYnkgb25lLgorCisgICAgICAgIFdoZW4gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50czogaWYgdGhlIGludGVybmFsIGNvdW50ZXIgaXMgbGFyZ2VyIHRoYW4KKyAgICAgICAgemVybyBvbiBlbnRyeSwgZGVjcmVtZW50IGl0IGJ5IG9uZSBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5LiBJZiBpdCBpcyB6ZXJvCisgICAgICAgIG9uIGVudHJ5LCBibG9jaywgd2FpdGluZyB1bnRpbCBzb21lIG90aGVyIHRocmVhZCBoYXMgY2FsbGVkIHJlbGVhc2UoKSB0bworICAgICAgICBtYWtlIGl0IGxhcmdlciB0aGFuIHplcm8uIFRoaXMgaXMgZG9uZSB3aXRoIHByb3BlciBpbnRlcmxvY2tpbmcgc28gdGhhdAorICAgICAgICBpZiBtdWx0aXBsZSBhY3F1aXJlKCkgY2FsbHMgYXJlIGJsb2NrZWQsIHJlbGVhc2UoKSB3aWxsIHdha2UgZXhhY3RseSBvbmUKKyAgICAgICAgb2YgdGhlbSB1cC4gVGhlIGltcGxlbWVudGF0aW9uIG1heSBwaWNrIG9uZSBhdCByYW5kb20sIHNvIHRoZSBvcmRlciBpbgorICAgICAgICB3aGljaCBibG9ja2VkIHRocmVhZHMgYXJlIGF3YWtlbmVkIHNob3VsZCBub3QgYmUgcmVsaWVkIG9uLiBUaGVyZSBpcyBubworICAgICAgICByZXR1cm4gdmFsdWUgaW4gdGhpcyBjYXNlLgorCisgICAgICAgIFdoZW4gaW52b2tlZCB3aXRoIGJsb2NraW5nIHNldCB0byB0cnVlLCBkbyB0aGUgc2FtZSB0aGluZyBhcyB3aGVuIGNhbGxlZAorICAgICAgICB3aXRob3V0IGFyZ3VtZW50cywgYW5kIHJldHVybiB0cnVlLgorCisgICAgICAgIFdoZW4gaW52b2tlZCB3aXRoIGJsb2NraW5nIHNldCB0byBmYWxzZSwgZG8gbm90IGJsb2NrLiBJZiBhIGNhbGwgd2l0aG91dAorICAgICAgICBhbiBhcmd1bWVudCB3b3VsZCBibG9jaywgcmV0dXJuIGZhbHNlIGltbWVkaWF0ZWx5OyBvdGhlcndpc2UsIGRvIHRoZQorICAgICAgICBzYW1lIHRoaW5nIGFzIHdoZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLCBhbmQgcmV0dXJuIHRydWUuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJjID0gRmFsc2UKKyAgICAgICAgd2l0aCBzZWxmLl9fY29uZDoKKyAgICAgICAgICAgIHdoaWxlIHNlbGYuX192YWx1ZSA9PSAwOgorICAgICAgICAgICAgICAgIGlmIG5vdCBibG9ja2luZzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLmFjcXVpcmUoJXMpOiBibG9ja2VkIHdhaXRpbmcsIHZhbHVlPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBibG9ja2luZywgc2VsZi5fX3ZhbHVlKQorICAgICAgICAgICAgICAgIHNlbGYuX19jb25kLndhaXQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9fdmFsdWUgPSBzZWxmLl9fdmFsdWUgLSAxCisgICAgICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5hY3F1aXJlOiBzdWNjZXNzLCB2YWx1ZT0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgc2VsZi5fX3ZhbHVlKQorICAgICAgICAgICAgICAgIHJjID0gVHJ1ZQorICAgICAgICByZXR1cm4gcmMKKworICAgIF9fZW50ZXJfXyA9IGFjcXVpcmUKKworICAgIGRlZiByZWxlYXNlKHNlbGYpOgorICAgICAgICAiIiJSZWxlYXNlIGEgc2VtYXBob3JlLCBpbmNyZW1lbnRpbmcgdGhlIGludGVybmFsIGNvdW50ZXIgYnkgb25lLgorCisgICAgICAgIFdoZW4gdGhlIGNvdW50ZXIgaXMgemVybyBvbiBlbnRyeSBhbmQgYW5vdGhlciB0aHJlYWQgaXMgd2FpdGluZyBmb3IgaXQKKyAgICAgICAgdG8gYmVjb21lIGxhcmdlciB0aGFuIHplcm8gYWdhaW4sIHdha2UgdXAgdGhhdCB0aHJlYWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHdpdGggc2VsZi5fX2NvbmQ6CisgICAgICAgICAgICBzZWxmLl9fdmFsdWUgPSBzZWxmLl9fdmFsdWUgKyAxCisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMucmVsZWFzZTogc3VjY2VzcywgdmFsdWU9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgc2VsZi5fX3ZhbHVlKQorICAgICAgICAgICAgc2VsZi5fX2NvbmQubm90aWZ5KCkKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0LCB2LCB0Yik6CisgICAgICAgIHNlbGYucmVsZWFzZSgpCisKKworZGVmIEJvdW5kZWRTZW1hcGhvcmUoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiJBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IGJvdW5kZWQgc2VtYXBob3JlLgorCisgICAgQSBib3VuZGVkIHNlbWFwaG9yZSBjaGVja3MgdG8gbWFrZSBzdXJlIGl0cyBjdXJyZW50IHZhbHVlIGRvZXNuJ3QgZXhjZWVkIGl0cworICAgIGluaXRpYWwgdmFsdWUuIElmIGl0IGRvZXMsIFZhbHVlRXJyb3IgaXMgcmFpc2VkLiBJbiBtb3N0IHNpdHVhdGlvbnMKKyAgICBzZW1hcGhvcmVzIGFyZSB1c2VkIHRvIGd1YXJkIHJlc291cmNlcyB3aXRoIGxpbWl0ZWQgY2FwYWNpdHkuCisKKyAgICBJZiB0aGUgc2VtYXBob3JlIGlzIHJlbGVhc2VkIHRvbyBtYW55IHRpbWVzIGl0J3MgYSBzaWduIG9mIGEgYnVnLiBJZiBub3QKKyAgICBnaXZlbiwgdmFsdWUgZGVmYXVsdHMgdG8gMS4KKworICAgIExpa2UgcmVndWxhciBzZW1hcGhvcmVzLCBib3VuZGVkIHNlbWFwaG9yZXMgbWFuYWdlIGEgY291bnRlciByZXByZXNlbnRpbmcKKyAgICB0aGUgbnVtYmVyIG9mIHJlbGVhc2UoKSBjYWxscyBtaW51cyB0aGUgbnVtYmVyIG9mIGFjcXVpcmUoKSBjYWxscywgcGx1cyBhbgorICAgIGluaXRpYWwgdmFsdWUuIFRoZSBhY3F1aXJlKCkgbWV0aG9kIGJsb2NrcyBpZiBuZWNlc3NhcnkgdW50aWwgaXQgY2FuIHJldHVybgorICAgIHdpdGhvdXQgbWFraW5nIHRoZSBjb3VudGVyIG5lZ2F0aXZlLiBJZiBub3QgZ2l2ZW4sIHZhbHVlIGRlZmF1bHRzIHRvIDEuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX0JvdW5kZWRTZW1hcGhvcmUoKmFyZ3MsICoqa3dhcmdzKQorCitjbGFzcyBfQm91bmRlZFNlbWFwaG9yZShfU2VtYXBob3JlKToKKyAgICAiIiJBIGJvdW5kZWQgc2VtYXBob3JlIGNoZWNrcyB0byBtYWtlIHN1cmUgaXRzIGN1cnJlbnQgdmFsdWUgZG9lc24ndCBleGNlZWQKKyAgICAgICBpdHMgaW5pdGlhbCB2YWx1ZS4gSWYgaXQgZG9lcywgVmFsdWVFcnJvciBpcyByYWlzZWQuIEluIG1vc3Qgc2l0dWF0aW9ucworICAgICAgIHNlbWFwaG9yZXMgYXJlIHVzZWQgdG8gZ3VhcmQgcmVzb3VyY2VzIHdpdGggbGltaXRlZCBjYXBhY2l0eS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT0xLCB2ZXJib3NlPU5vbmUpOgorICAgICAgICBfU2VtYXBob3JlLl9faW5pdF9fKHNlbGYsIHZhbHVlLCB2ZXJib3NlKQorICAgICAgICBzZWxmLl9pbml0aWFsX3ZhbHVlID0gdmFsdWUKKworICAgIGRlZiByZWxlYXNlKHNlbGYpOgorICAgICAgICAiIiJSZWxlYXNlIGEgc2VtYXBob3JlLCBpbmNyZW1lbnRpbmcgdGhlIGludGVybmFsIGNvdW50ZXIgYnkgb25lLgorCisgICAgICAgIFdoZW4gdGhlIGNvdW50ZXIgaXMgemVybyBvbiBlbnRyeSBhbmQgYW5vdGhlciB0aHJlYWQgaXMgd2FpdGluZyBmb3IgaXQKKyAgICAgICAgdG8gYmVjb21lIGxhcmdlciB0aGFuIHplcm8gYWdhaW4sIHdha2UgdXAgdGhhdCB0aHJlYWQuCisKKyAgICAgICAgSWYgdGhlIG51bWJlciBvZiByZWxlYXNlcyBleGNlZWRzIHRoZSBudW1iZXIgb2YgYWNxdWlyZXMsCisgICAgICAgIHJhaXNlIGEgVmFsdWVFcnJvci4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fU2VtYXBob3JlX192YWx1ZSA+PSBzZWxmLl9pbml0aWFsX3ZhbHVlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiU2VtYXBob3JlIHJlbGVhc2VkIHRvbyBtYW55IHRpbWVzIikKKyAgICAgICAgcmV0dXJuIF9TZW1hcGhvcmUucmVsZWFzZShzZWxmKQorCisKK2RlZiBFdmVudCgqYXJncywgKiprd2FyZ3MpOgorICAgICIiIkEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBuZXcgZXZlbnQuCisKKyAgICBFdmVudHMgbWFuYWdlIGEgZmxhZyB0aGF0IGNhbiBiZSBzZXQgdG8gdHJ1ZSB3aXRoIHRoZSBzZXQoKSBtZXRob2QgYW5kIHJlc2V0CisgICAgdG8gZmFsc2Ugd2l0aCB0aGUgY2xlYXIoKSBtZXRob2QuIFRoZSB3YWl0KCkgbWV0aG9kIGJsb2NrcyB1bnRpbCB0aGUgZmxhZyBpcworICAgIHRydWUuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX0V2ZW50KCphcmdzLCAqKmt3YXJncykKKworY2xhc3MgX0V2ZW50KF9WZXJib3NlKToKKyAgICAiIiJBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IGV2ZW50IG9iamVjdC4gQW4gZXZlbnQgbWFuYWdlcyBhCisgICAgICAgZmxhZyB0aGF0IGNhbiBiZSBzZXQgdG8gdHJ1ZSB3aXRoIHRoZSBzZXQoKSBtZXRob2QgYW5kIHJlc2V0IHRvIGZhbHNlCisgICAgICAgd2l0aCB0aGUgY2xlYXIoKSBtZXRob2QuIFRoZSB3YWl0KCkgbWV0aG9kIGJsb2NrcyB1bnRpbCB0aGUgZmxhZyBpcyB0cnVlLgorCisgICAgIiIiCisKKyAgICAjIEFmdGVyIFRpbSBQZXRlcnMnIGV2ZW50IGNsYXNzICh3aXRob3V0IGlzX3Bvc3RlZCgpKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcmJvc2U9Tm9uZSk6CisgICAgICAgIF9WZXJib3NlLl9faW5pdF9fKHNlbGYsIHZlcmJvc2UpCisgICAgICAgIHNlbGYuX19jb25kID0gQ29uZGl0aW9uKExvY2soKSkKKyAgICAgICAgc2VsZi5fX2ZsYWcgPSBGYWxzZQorCisgICAgZGVmIF9yZXNldF9pbnRlcm5hbF9sb2NrcyhzZWxmKToKKyAgICAgICAgIyBwcml2YXRlISAgY2FsbGVkIGJ5IFRocmVhZC5fcmVzZXRfaW50ZXJuYWxfbG9ja3MgYnkgX2FmdGVyX2ZvcmsoKQorICAgICAgICBzZWxmLl9fY29uZC5fX2luaXRfXygpCisKKyAgICBkZWYgaXNTZXQoc2VsZik6CisgICAgICAgICdSZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgaW50ZXJuYWwgZmxhZyBpcyB0cnVlLicKKyAgICAgICAgcmV0dXJuIHNlbGYuX19mbGFnCisKKyAgICBpc19zZXQgPSBpc1NldAorCisgICAgZGVmIHNldChzZWxmKToKKyAgICAgICAgIiIiU2V0IHRoZSBpbnRlcm5hbCBmbGFnIHRvIHRydWUuCisKKyAgICAgICAgQWxsIHRocmVhZHMgd2FpdGluZyBmb3IgdGhlIGZsYWcgdG8gYmVjb21lIHRydWUgYXJlIGF3YWtlbmVkLiBUaHJlYWRzCisgICAgICAgIHRoYXQgY2FsbCB3YWl0KCkgb25jZSB0aGUgZmxhZyBpcyB0cnVlIHdpbGwgbm90IGJsb2NrIGF0IGFsbC4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX2NvbmQuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX19mbGFnID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5fX2NvbmQubm90aWZ5X2FsbCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9fY29uZC5yZWxlYXNlKCkKKworICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgIiIiUmVzZXQgdGhlIGludGVybmFsIGZsYWcgdG8gZmFsc2UuCisKKyAgICAgICAgU3Vic2VxdWVudGx5LCB0aHJlYWRzIGNhbGxpbmcgd2FpdCgpIHdpbGwgYmxvY2sgdW50aWwgc2V0KCkgaXMgY2FsbGVkIHRvCisgICAgICAgIHNldCB0aGUgaW50ZXJuYWwgZmxhZyB0byB0cnVlIGFnYWluLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9fY29uZC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fX2ZsYWcgPSBGYWxzZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fX2NvbmQucmVsZWFzZSgpCisKKyAgICBkZWYgd2FpdChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiJCbG9jayB1bnRpbCB0aGUgaW50ZXJuYWwgZmxhZyBpcyB0cnVlLgorCisgICAgICAgIElmIHRoZSBpbnRlcm5hbCBmbGFnIGlzIHRydWUgb24gZW50cnksIHJldHVybiBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlLAorICAgICAgICBibG9jayB1bnRpbCBhbm90aGVyIHRocmVhZCBjYWxscyBzZXQoKSB0byBzZXQgdGhlIGZsYWcgdG8gdHJ1ZSwgb3IgdW50aWwKKyAgICAgICAgdGhlIG9wdGlvbmFsIHRpbWVvdXQgb2NjdXJzLgorCisgICAgICAgIFdoZW4gdGhlIHRpbWVvdXQgYXJndW1lbnQgaXMgcHJlc2VudCBhbmQgbm90IE5vbmUsIGl0IHNob3VsZCBiZSBhCisgICAgICAgIGZsb2F0aW5nIHBvaW50IG51bWJlciBzcGVjaWZ5aW5nIGEgdGltZW91dCBmb3IgdGhlIG9wZXJhdGlvbiBpbiBzZWNvbmRzCisgICAgICAgIChvciBmcmFjdGlvbnMgdGhlcmVvZikuCisKKyAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgaW50ZXJuYWwgZmxhZyBvbiBleGl0LCBzbyBpdCB3aWxsIGFsd2F5cyByZXR1cm4KKyAgICAgICAgVHJ1ZSBleGNlcHQgaWYgYSB0aW1lb3V0IGlzIGdpdmVuIGFuZCB0aGUgb3BlcmF0aW9uIHRpbWVzIG91dC4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX2NvbmQuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9fZmxhZzoKKyAgICAgICAgICAgICAgICBzZWxmLl9fY29uZC53YWl0KHRpbWVvdXQpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2ZsYWcKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX19jb25kLnJlbGVhc2UoKQorCisjIEhlbHBlciB0byBnZW5lcmF0ZSBuZXcgdGhyZWFkIG5hbWVzCitfY291bnRlciA9IDAKK2RlZiBfbmV3bmFtZSh0ZW1wbGF0ZT0iVGhyZWFkLSVkIik6CisgICAgZ2xvYmFsIF9jb3VudGVyCisgICAgX2NvdW50ZXIgPSBfY291bnRlciArIDEKKyAgICByZXR1cm4gdGVtcGxhdGUgJSBfY291bnRlcgorCisjIEFjdGl2ZSB0aHJlYWQgYWRtaW5pc3RyYXRpb24KK19hY3RpdmVfbGltYm9fbG9jayA9IF9hbGxvY2F0ZV9sb2NrKCkKK19hY3RpdmUgPSB7fSAgICAjIG1hcHMgdGhyZWFkIGlkIHRvIFRocmVhZCBvYmplY3QKK19saW1ibyA9IHt9CisKKworIyBNYWluIGNsYXNzIGZvciB0aHJlYWRzCisKK2NsYXNzIFRocmVhZChfVmVyYm9zZSk6CisgICAgIiIiQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSB0aHJlYWQgb2YgY29udHJvbC4KKworICAgIFRoaXMgY2xhc3MgY2FuIGJlIHNhZmVseSBzdWJjbGFzc2VkIGluIGEgbGltaXRlZCBmYXNoaW9uLgorCisgICAgIiIiCisgICAgX19pbml0aWFsaXplZCA9IEZhbHNlCisgICAgIyBOZWVkIHRvIHN0b3JlIGEgcmVmZXJlbmNlIHRvIHN5cy5leGNfaW5mbyBmb3IgcHJpbnRpbmcKKyAgICAjIG91dCBleGNlcHRpb25zIHdoZW4gYSB0aHJlYWQgdHJpZXMgdG8gdXNlIGEgZ2xvYmFsIHZhci4gZHVyaW5nIGludGVycC4KKyAgICAjIHNodXRkb3duIGFuZCB0aHVzIHJhaXNlcyBhbiBleGNlcHRpb24gYWJvdXQgdHJ5aW5nIHRvIHBlcmZvcm0gc29tZQorICAgICMgb3BlcmF0aW9uIG9uL3dpdGggYSBOb25lVHlwZQorICAgIF9fZXhjX2luZm8gPSBfc3lzLmV4Y19pbmZvCisgICAgIyBLZWVwIHN5cy5leGNfY2xlYXIgdG9vIHRvIGNsZWFyIHRoZSBleGNlcHRpb24ganVzdCBiZWZvcmUKKyAgICAjIGFsbG93aW5nIC5qb2luKCkgdG8gcmV0dXJuLgorICAgIF9fZXhjX2NsZWFyID0gX3N5cy5leGNfY2xlYXIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncm91cD1Ob25lLCB0YXJnZXQ9Tm9uZSwgbmFtZT1Ob25lLAorICAgICAgICAgICAgICAgICBhcmdzPSgpLCBrd2FyZ3M9Tm9uZSwgdmVyYm9zZT1Ob25lKToKKyAgICAgICAgIiIiVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIGtleXdvcmQgYXJndW1lbnRzLiBBcmd1bWVudHMgYXJlOgorCisgICAgICAgICpncm91cCogc2hvdWxkIGJlIE5vbmU7IHJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9uIHdoZW4gYSBUaHJlYWRHcm91cAorICAgICAgICBjbGFzcyBpcyBpbXBsZW1lbnRlZC4KKworICAgICAgICAqdGFyZ2V0KiBpcyB0aGUgY2FsbGFibGUgb2JqZWN0IHRvIGJlIGludm9rZWQgYnkgdGhlIHJ1bigpCisgICAgICAgIG1ldGhvZC4gRGVmYXVsdHMgdG8gTm9uZSwgbWVhbmluZyBub3RoaW5nIGlzIGNhbGxlZC4KKworICAgICAgICAqbmFtZSogaXMgdGhlIHRocmVhZCBuYW1lLiBCeSBkZWZhdWx0LCBhIHVuaXF1ZSBuYW1lIGlzIGNvbnN0cnVjdGVkIG9mCisgICAgICAgIHRoZSBmb3JtICJUaHJlYWQtTiIgd2hlcmUgTiBpcyBhIHNtYWxsIGRlY2ltYWwgbnVtYmVyLgorCisgICAgICAgICphcmdzKiBpcyB0aGUgYXJndW1lbnQgdHVwbGUgZm9yIHRoZSB0YXJnZXQgaW52b2NhdGlvbi4gRGVmYXVsdHMgdG8gKCkuCisKKyAgICAgICAgKmt3YXJncyogaXMgYSBkaWN0aW9uYXJ5IG9mIGtleXdvcmQgYXJndW1lbnRzIGZvciB0aGUgdGFyZ2V0CisgICAgICAgIGludm9jYXRpb24uIERlZmF1bHRzIHRvIHt9LgorCisgICAgICAgIElmIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSBjb25zdHJ1Y3RvciwgaXQgbXVzdCBtYWtlIHN1cmUgdG8gaW52b2tlCisgICAgICAgIHRoZSBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yIChUaHJlYWQuX19pbml0X18oKSkgYmVmb3JlIGRvaW5nIGFueXRoaW5nCisgICAgICAgIGVsc2UgdG8gdGhlIHRocmVhZC4KKworIiIiCisgICAgICAgIGFzc2VydCBncm91cCBpcyBOb25lLCAiZ3JvdXAgYXJndW1lbnQgbXVzdCBiZSBOb25lIGZvciBub3ciCisgICAgICAgIF9WZXJib3NlLl9faW5pdF9fKHNlbGYsIHZlcmJvc2UpCisgICAgICAgIGlmIGt3YXJncyBpcyBOb25lOgorICAgICAgICAgICAga3dhcmdzID0ge30KKyAgICAgICAgc2VsZi5fX3RhcmdldCA9IHRhcmdldAorICAgICAgICBzZWxmLl9fbmFtZSA9IHN0cihuYW1lIG9yIF9uZXduYW1lKCkpCisgICAgICAgIHNlbGYuX19hcmdzID0gYXJncworICAgICAgICBzZWxmLl9fa3dhcmdzID0ga3dhcmdzCisgICAgICAgIHNlbGYuX19kYWVtb25pYyA9IHNlbGYuX3NldF9kYWVtb24oKQorICAgICAgICBzZWxmLl9faWRlbnQgPSBOb25lCisgICAgICAgIHNlbGYuX19zdGFydGVkID0gRXZlbnQoKQorICAgICAgICBzZWxmLl9fc3RvcHBlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuX19ibG9jayA9IENvbmRpdGlvbihMb2NrKCkpCisgICAgICAgIHNlbGYuX19pbml0aWFsaXplZCA9IFRydWUKKyAgICAgICAgIyBzeXMuc3RkZXJyIGlzIG5vdCBzdG9yZWQgaW4gdGhlIGNsYXNzIGxpa2UKKyAgICAgICAgIyBzeXMuZXhjX2luZm8gc2luY2UgaXQgY2FuIGJlIGNoYW5nZWQgYmV0d2VlbiBpbnN0YW5jZXMKKyAgICAgICAgc2VsZi5fX3N0ZGVyciA9IF9zeXMuc3RkZXJyCisKKyAgICBkZWYgX3Jlc2V0X2ludGVybmFsX2xvY2tzKHNlbGYpOgorICAgICAgICAjIHByaXZhdGUhICBDYWxsZWQgYnkgX2FmdGVyX2ZvcmsoKSB0byByZXNldCBvdXIgaW50ZXJuYWwgbG9ja3MgYXMKKyAgICAgICAgIyB0aGV5IG1heSBiZSBpbiBhbiBpbnZhbGlkIHN0YXRlIGxlYWRpbmcgdG8gYSBkZWFkbG9jayBvciBjcmFzaC4KKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnX1RocmVhZF9fYmxvY2snKTogICMgRHVtbXlUaHJlYWQgZGVsZXRlcyBzZWxmLl9fYmxvY2sKKyAgICAgICAgICAgIHNlbGYuX19ibG9jay5fX2luaXRfXygpCisgICAgICAgIHNlbGYuX19zdGFydGVkLl9yZXNldF9pbnRlcm5hbF9sb2NrcygpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgX2Jsb2NrKHNlbGYpOgorICAgICAgICAjIHVzZWQgYnkgYSB1bml0dGVzdAorICAgICAgICByZXR1cm4gc2VsZi5fX2Jsb2NrCisKKyAgICBkZWYgX3NldF9kYWVtb24oc2VsZik6CisgICAgICAgICMgT3ZlcnJpZGRlbiBpbiBfTWFpblRocmVhZCBhbmQgX0R1bW15VGhyZWFkCisgICAgICAgIHJldHVybiBjdXJyZW50X3RocmVhZCgpLmRhZW1vbgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5fX2luaXRpYWxpemVkLCAiVGhyZWFkLl9faW5pdF9fKCkgd2FzIG5vdCBjYWxsZWQiCisgICAgICAgIHN0YXR1cyA9ICJpbml0aWFsIgorICAgICAgICBpZiBzZWxmLl9fc3RhcnRlZC5pc19zZXQoKToKKyAgICAgICAgICAgIHN0YXR1cyA9ICJzdGFydGVkIgorICAgICAgICBpZiBzZWxmLl9fc3RvcHBlZDoKKyAgICAgICAgICAgIHN0YXR1cyA9ICJzdG9wcGVkIgorICAgICAgICBpZiBzZWxmLl9fZGFlbW9uaWM6CisgICAgICAgICAgICBzdGF0dXMgKz0gIiBkYWVtb24iCisgICAgICAgIGlmIHNlbGYuX19pZGVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN0YXR1cyArPSAiICVzIiAlIHNlbGYuX19pZGVudAorICAgICAgICByZXR1cm4gIjwlcyglcywgJXMpPiIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX19uYW1lLCBzdGF0dXMpCisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgICIiIlN0YXJ0IHRoZSB0aHJlYWQncyBhY3Rpdml0eS4KKworICAgICAgICBJdCBtdXN0IGJlIGNhbGxlZCBhdCBtb3N0IG9uY2UgcGVyIHRocmVhZCBvYmplY3QuIEl0IGFycmFuZ2VzIGZvciB0aGUKKyAgICAgICAgb2JqZWN0J3MgcnVuKCkgbWV0aG9kIHRvIGJlIGludm9rZWQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQgb2YgY29udHJvbC4KKworICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIHJhaXNlIGEgUnVudGltZUVycm9yIGlmIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUKKyAgICAgICAgc2FtZSB0aHJlYWQgb2JqZWN0LgorCisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi5fX2luaXRpYWxpemVkOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ0aHJlYWQuX19pbml0X18oKSBub3QgY2FsbGVkIikKKyAgICAgICAgaWYgc2VsZi5fX3N0YXJ0ZWQuaXNfc2V0KCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoInRocmVhZHMgY2FuIG9ubHkgYmUgc3RhcnRlZCBvbmNlIikKKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuc3RhcnQoKTogc3RhcnRpbmcgdGhyZWFkIiwgc2VsZikKKyAgICAgICAgd2l0aCBfYWN0aXZlX2xpbWJvX2xvY2s6CisgICAgICAgICAgICBfbGltYm9bc2VsZl0gPSBzZWxmCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9zdGFydF9uZXdfdGhyZWFkKHNlbGYuX19ib290c3RyYXAsICgpKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgd2l0aCBfYWN0aXZlX2xpbWJvX2xvY2s6CisgICAgICAgICAgICAgICAgZGVsIF9saW1ib1tzZWxmXQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgc2VsZi5fX3N0YXJ0ZWQud2FpdCgpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAiIiJNZXRob2QgcmVwcmVzZW50aW5nIHRoZSB0aHJlYWQncyBhY3Rpdml0eS4KKworICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3MuIFRoZSBzdGFuZGFyZCBydW4oKSBtZXRob2QKKyAgICAgICAgaW52b2tlcyB0aGUgY2FsbGFibGUgb2JqZWN0IHBhc3NlZCB0byB0aGUgb2JqZWN0J3MgY29uc3RydWN0b3IgYXMgdGhlCisgICAgICAgIHRhcmdldCBhcmd1bWVudCwgaWYgYW55LCB3aXRoIHNlcXVlbnRpYWwgYW5kIGtleXdvcmQgYXJndW1lbnRzIHRha2VuCisgICAgICAgIGZyb20gdGhlIGFyZ3MgYW5kIGt3YXJncyBhcmd1bWVudHMsIHJlc3BlY3RpdmVseS4KKworICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fX3RhcmdldDoKKyAgICAgICAgICAgICAgICBzZWxmLl9fdGFyZ2V0KCpzZWxmLl9fYXJncywgKipzZWxmLl9fa3dhcmdzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgIyBBdm9pZCBhIHJlZmN5Y2xlIGlmIHRoZSB0aHJlYWQgaXMgcnVubmluZyBhIGZ1bmN0aW9uIHdpdGgKKyAgICAgICAgICAgICMgYW4gYXJndW1lbnQgdGhhdCBoYXMgYSBtZW1iZXIgdGhhdCBwb2ludHMgdG8gdGhlIHRocmVhZC4KKyAgICAgICAgICAgIGRlbCBzZWxmLl9fdGFyZ2V0LCBzZWxmLl9fYXJncywgc2VsZi5fX2t3YXJncworCisgICAgZGVmIF9fYm9vdHN0cmFwKHNlbGYpOgorICAgICAgICAjIFdyYXBwZXIgYXJvdW5kIHRoZSByZWFsIGJvb3RzdHJhcCBjb2RlIHRoYXQgaWdub3JlcworICAgICAgICAjIGV4Y2VwdGlvbnMgZHVyaW5nIGludGVycHJldGVyIGNsZWFudXAuICBUaG9zZSB0eXBpY2FsbHkKKyAgICAgICAgIyBoYXBwZW4gd2hlbiBhIGRhZW1vbiB0aHJlYWQgd2FrZXMgdXAgYXQgYW4gdW5mb3J0dW5hdGUKKyAgICAgICAgIyBtb21lbnQsIGZpbmRzIHRoZSB3b3JsZCBhcm91bmQgaXQgZGVzdHJveWVkLCBhbmQgcmFpc2VzIHNvbWUKKyAgICAgICAgIyByYW5kb20gZXhjZXB0aW9uICoqKiB3aGlsZSB0cnlpbmcgdG8gcmVwb3J0IHRoZSBleGNlcHRpb24gaW4KKyAgICAgICAgIyBfX2Jvb3RzdHJhcF9pbm5lcigpIGJlbG93ICoqKi4gIFRob3NlIHJhbmRvbSBleGNlcHRpb25zCisgICAgICAgICMgZG9uJ3QgaGVscCBhbnlib2R5LCBhbmQgdGhleSBjb25mdXNlIHVzZXJzLCBzbyB3ZSBzdXBwcmVzcworICAgICAgICAjIHRoZW0uICBXZSBzdXBwcmVzcyB0aGVtIG9ubHkgd2hlbiBpdCBhcHBlYXJzIHRoYXQgdGhlIHdvcmxkCisgICAgICAgICMgaW5kZWVkIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkLCBzbyB0aGF0IGV4Y2VwdGlvbnMgaW4KKyAgICAgICAgIyBfX2Jvb3RzdHJhcF9pbm5lcigpIGR1cmluZyBub3JtYWwgYnVzaW5lc3MgaG91cnMgYXJlIHByb3Blcmx5CisgICAgICAgICMgcmVwb3J0ZWQuICBBbHNvLCB3ZSBvbmx5IHN1cHByZXNzIHRoZW0gZm9yIGRhZW1vbmljIHRocmVhZHM7CisgICAgICAgICMgaWYgYSBub24tZGFlbW9uaWMgZW5jb3VudGVycyB0aGlzLCBzb21ldGhpbmcgZWxzZSBpcyB3cm9uZy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fX2Jvb3RzdHJhcF9pbm5lcigpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGlmIHNlbGYuX19kYWVtb25pYyBhbmQgX3N5cyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBfc2V0X2lkZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9faWRlbnQgPSBfZ2V0X2lkZW50KCkKKworICAgIGRlZiBfX2Jvb3RzdHJhcF9pbm5lcihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fc2V0X2lkZW50KCkKKyAgICAgICAgICAgIHNlbGYuX19zdGFydGVkLnNldCgpCisgICAgICAgICAgICB3aXRoIF9hY3RpdmVfbGltYm9fbG9jazoKKyAgICAgICAgICAgICAgICBfYWN0aXZlW3NlbGYuX19pZGVudF0gPSBzZWxmCisgICAgICAgICAgICAgICAgZGVsIF9saW1ib1tzZWxmXQorICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLl9fYm9vdHN0cmFwKCk6IHRocmVhZCBzdGFydGVkIiwgc2VsZikKKworICAgICAgICAgICAgaWYgX3RyYWNlX2hvb2s6CisgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuX19ib290c3RyYXAoKTogcmVnaXN0ZXJpbmcgdHJhY2UgaG9vayIsIHNlbGYpCisgICAgICAgICAgICAgICAgX3N5cy5zZXR0cmFjZShfdHJhY2VfaG9vaykKKyAgICAgICAgICAgIGlmIF9wcm9maWxlX2hvb2s6CisgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuX19ib290c3RyYXAoKTogcmVnaXN0ZXJpbmcgcHJvZmlsZSBob29rIiwgc2VsZikKKyAgICAgICAgICAgICAgICBfc3lzLnNldHByb2ZpbGUoX3Byb2ZpbGVfaG9vaykKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYucnVuKCkKKyAgICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuX19ib290c3RyYXAoKTogcmFpc2VkIFN5c3RlbUV4aXQiLCBzZWxmKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuX19ib290c3RyYXAoKTogdW5oYW5kbGVkIGV4Y2VwdGlvbiIsIHNlbGYpCisgICAgICAgICAgICAgICAgIyBJZiBzeXMuc3RkZXJyIGlzIG5vIG1vcmUgKG1vc3QgbGlrZWx5IGZyb20gaW50ZXJwcmV0ZXIKKyAgICAgICAgICAgICAgICAjIHNodXRkb3duKSB1c2Ugc2VsZi5fX3N0ZGVyci4gIE90aGVyd2lzZSBzdGlsbCB1c2Ugc3lzIChhcyBpbgorICAgICAgICAgICAgICAgICMgX3N5cykgaW4gY2FzZSBzeXMuc3RkZXJyIHdhcyByZWRlZmluZWQgc2luY2UgdGhlIGNyZWF0aW9uIG9mCisgICAgICAgICAgICAgICAgIyBzZWxmLgorICAgICAgICAgICAgICAgIGlmIF9zeXM6CisgICAgICAgICAgICAgICAgICAgIF9zeXMuc3RkZXJyLndyaXRlKCJFeGNlcHRpb24gaW4gdGhyZWFkICVzOlxuJXNcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5uYW1lLCBfZm9ybWF0X2V4YygpKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIERvIHRoZSBiZXN0IGpvYiBwb3NzaWJsZSB3L28gYSBodWdlIGFtdC4gb2YgY29kZSB0bworICAgICAgICAgICAgICAgICAgICAjIGFwcHJveGltYXRlIGEgdHJhY2ViYWNrIChjb2RlIGlkZWFzIGZyb20KKyAgICAgICAgICAgICAgICAgICAgIyBMaWIvdHJhY2ViYWNrLnB5KQorICAgICAgICAgICAgICAgICAgICBleGNfdHlwZSwgZXhjX3ZhbHVlLCBleGNfdGIgPSBzZWxmLl9fZXhjX2luZm8oKQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludD4+c2VsZi5fX3N0ZGVyciwgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gaW4gdGhyZWFkICIgKyBzZWxmLm5hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKG1vc3QgbGlrZWx5IHJhaXNlZCBkdXJpbmcgaW50ZXJwcmV0ZXIgc2h1dGRvd24pOiIpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludD4+c2VsZi5fX3N0ZGVyciwgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIGV4Y190YjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludD4+c2VsZi5fX3N0ZGVyciwgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICBGaWxlICIlcyIsIGxpbmUgJXMsIGluICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleGNfdGIudGJfZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjX3RiLnRiX2xpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y190Yi50Yl9mcmFtZS5mX2NvZGUuY29fbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjX3RiID0gZXhjX3RiLnRiX25leHQKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Pj5zZWxmLl9fc3RkZXJyLCAoIiVzOiAlcyIgJSAoZXhjX3R5cGUsIGV4Y192YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgZXhjX3RiIGdldHMgZGVsZXRlZCBzaW5jZSBpdCBpcyBhIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAjIGhvZzsgZGVsZXRpbmcgZXZlcnl0aGluZyBlbHNlIGlzIGp1c3QgZm9yIHRob3JvdWdobmVzcworICAgICAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190YgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLl9fYm9vdHN0cmFwKCk6IG5vcm1hbCByZXR1cm4iLCBzZWxmKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAjIFByZXZlbnQgYSByYWNlIGluCisgICAgICAgICAgICAgICAgIyB0ZXN0X3RocmVhZGluZy50ZXN0X25vX3JlZmN5Y2xlX3Rocm91Z2hfdGFyZ2V0IHdoZW4KKyAgICAgICAgICAgICAgICAjIHRoZSBleGNlcHRpb24ga2VlcHMgdGhlIHRhcmdldCBhbGl2ZSBwYXN0IHdoZW4gd2UKKyAgICAgICAgICAgICAgICAjIGFzc2VydCB0aGF0IGl0J3MgZGVhZC4KKyAgICAgICAgICAgICAgICBzZWxmLl9fZXhjX2NsZWFyKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHdpdGggX2FjdGl2ZV9saW1ib19sb2NrOgorICAgICAgICAgICAgICAgIHNlbGYuX19zdG9wKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgV2UgZG9uJ3QgY2FsbCBzZWxmLl9fZGVsZXRlKCkgYmVjYXVzZSBpdCBhbHNvCisgICAgICAgICAgICAgICAgICAgICMgZ3JhYnMgX2FjdGl2ZV9saW1ib19sb2NrLgorICAgICAgICAgICAgICAgICAgICBkZWwgX2FjdGl2ZVtfZ2V0X2lkZW50KCldCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgX19zdG9wKHNlbGYpOgorICAgICAgICAjIER1bW15VGhyZWFkcyBkZWxldGUgc2VsZi5fX2Jsb2NrLCBidXQgdGhleSBoYXZlIG5vIHdhaXRlcnMgdG8KKyAgICAgICAgIyBub3RpZnkgYW55d2F5IChqb2luKCkgaXMgZm9yYmlkZGVuIG9uIHRoZW0pLgorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnX1RocmVhZF9fYmxvY2snKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9fYmxvY2suYWNxdWlyZSgpCisgICAgICAgIHNlbGYuX19zdG9wcGVkID0gVHJ1ZQorICAgICAgICBzZWxmLl9fYmxvY2subm90aWZ5X2FsbCgpCisgICAgICAgIHNlbGYuX19ibG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBfX2RlbGV0ZShzZWxmKToKKyAgICAgICAgIlJlbW92ZSBjdXJyZW50IHRocmVhZCBmcm9tIHRoZSBkaWN0IG9mIGN1cnJlbnRseSBydW5uaW5nIHRocmVhZHMuIgorCisgICAgICAgICMgTm90ZXMgYWJvdXQgcnVubmluZyB3aXRoIGR1bW15X3RocmVhZDoKKyAgICAgICAgIworICAgICAgICAjIE11c3QgdGFrZSBjYXJlIHRvIG5vdCByYWlzZSBhbiBleGNlcHRpb24gaWYgZHVtbXlfdGhyZWFkIGlzIGJlaW5nCisgICAgICAgICMgdXNlZCAoYW5kIHRodXMgdGhpcyBtb2R1bGUgaXMgYmVpbmcgdXNlZCBhcyBhbiBpbnN0YW5jZSBvZgorICAgICAgICAjIGR1bW15X3RocmVhZGluZykuICBkdW1teV90aHJlYWQuZ2V0X2lkZW50KCkgYWx3YXlzIHJldHVybnMgLTEgc2luY2UKKyAgICAgICAgIyB0aGVyZSBpcyBvbmx5IG9uZSB0aHJlYWQgaWYgZHVtbXlfdGhyZWFkIGlzIGJlaW5nIHVzZWQuICBUaHVzCisgICAgICAgICMgbGVuKF9hY3RpdmUpIGlzIGFsd2F5cyA8PSAxIGhlcmUsIGFuZCBhbnkgVGhyZWFkIGluc3RhbmNlIGNyZWF0ZWQKKyAgICAgICAgIyBvdmVyd3JpdGVzIHRoZSAoaWYgYW55KSB0aHJlYWQgY3VycmVudGx5IHJlZ2lzdGVyZWQgaW4gX2FjdGl2ZS4KKyAgICAgICAgIworICAgICAgICAjIEFuIGluc3RhbmNlIG9mIF9NYWluVGhyZWFkIGlzIGFsd2F5cyBjcmVhdGVkIGJ5ICd0aHJlYWRpbmcnLiAgVGhpcworICAgICAgICAjIGdldHMgb3ZlcndyaXR0ZW4gdGhlIGluc3RhbnQgYW4gaW5zdGFuY2Ugb2YgVGhyZWFkIGlzIGNyZWF0ZWQ7IGJvdGgKKyAgICAgICAgIyB0aHJlYWRzIHJldHVybiAtMSBmcm9tIGR1bW15X3RocmVhZC5nZXRfaWRlbnQoKSBhbmQgdGh1cyBoYXZlIHRoZQorICAgICAgICAjIHNhbWUga2V5IGluIHRoZSBkaWN0LiAgU28gd2hlbiB0aGUgX01haW5UaHJlYWQgaW5zdGFuY2UgY3JlYXRlZCBieQorICAgICAgICAjICd0aHJlYWRpbmcnIHRyaWVzIHRvIGNsZWFuIGl0c2VsZiB1cCB3aGVuIGF0ZXhpdCBjYWxscyB0aGlzIG1ldGhvZAorICAgICAgICAjIGl0IGdldHMgYSBLZXlFcnJvciBpZiBhbm90aGVyIFRocmVhZCBpbnN0YW5jZSB3YXMgY3JlYXRlZC4KKyAgICAgICAgIworICAgICAgICAjIFRoaXMgYWxsIG1lYW5zIHRoYXQgS2V5RXJyb3IgZnJvbSB0cnlpbmcgdG8gZGVsZXRlIHNvbWV0aGluZyBmcm9tCisgICAgICAgICMgX2FjdGl2ZSBpZiBkdW1teV90aHJlYWRpbmcgaXMgYmVpbmcgdXNlZCBpcyBhIHJlZCBoZXJyaW5nLiAgQnV0CisgICAgICAgICMgc2luY2UgaXQgaXNuJ3QgaWYgZHVtbXlfdGhyZWFkaW5nIGlzICpub3QqIGJlaW5nIHVzZWQgdGhlbiBkb24ndAorICAgICAgICAjIGhpZGUgdGhlIGV4Y2VwdGlvbi4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIF9hY3RpdmVfbGltYm9fbG9jazoKKyAgICAgICAgICAgICAgICBkZWwgX2FjdGl2ZVtfZ2V0X2lkZW50KCldCisgICAgICAgICAgICAgICAgIyBUaGVyZSBtdXN0IG5vdCBiZSBhbnkgcHl0aG9uIGNvZGUgYmV0d2VlbiB0aGUgcHJldmlvdXMgbGluZQorICAgICAgICAgICAgICAgICMgYW5kIGFmdGVyIHRoZSBsb2NrIGlzIHJlbGVhc2VkLiAgT3RoZXJ3aXNlIGEgdHJhY2luZyBmdW5jdGlvbgorICAgICAgICAgICAgICAgICMgY291bGQgdHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2sgYWdhaW4gaW4gdGhlIHNhbWUgdGhyZWFkLCAoaW4KKyAgICAgICAgICAgICAgICAjIGN1cnJlbnRfdGhyZWFkKCkpLCBhbmQgd291bGQgYmxvY2suCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGlmICdkdW1teV90aHJlYWRpbmcnIG5vdCBpbiBfc3lzLm1vZHVsZXM6CisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBqb2luKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICIiIldhaXQgdW50aWwgdGhlIHRocmVhZCB0ZXJtaW5hdGVzLgorCisgICAgICAgIFRoaXMgYmxvY2tzIHRoZSBjYWxsaW5nIHRocmVhZCB1bnRpbCB0aGUgdGhyZWFkIHdob3NlIGpvaW4oKSBtZXRob2QgaXMKKyAgICAgICAgY2FsbGVkIHRlcm1pbmF0ZXMgLS0gZWl0aGVyIG5vcm1hbGx5IG9yIHRocm91Z2ggYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbgorICAgICAgICBvciB1bnRpbCB0aGUgb3B0aW9uYWwgdGltZW91dCBvY2N1cnMuCisKKyAgICAgICAgV2hlbiB0aGUgdGltZW91dCBhcmd1bWVudCBpcyBwcmVzZW50IGFuZCBub3QgTm9uZSwgaXQgc2hvdWxkIGJlIGEKKyAgICAgICAgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHNwZWNpZnlpbmcgYSB0aW1lb3V0IGZvciB0aGUgb3BlcmF0aW9uIGluIHNlY29uZHMKKyAgICAgICAgKG9yIGZyYWN0aW9ucyB0aGVyZW9mKS4gQXMgam9pbigpIGFsd2F5cyByZXR1cm5zIE5vbmUsIHlvdSBtdXN0IGNhbGwKKyAgICAgICAgaXNBbGl2ZSgpIGFmdGVyIGpvaW4oKSB0byBkZWNpZGUgd2hldGhlciBhIHRpbWVvdXQgaGFwcGVuZWQgLS0gaWYgdGhlCisgICAgICAgIHRocmVhZCBpcyBzdGlsbCBhbGl2ZSwgdGhlIGpvaW4oKSBjYWxsIHRpbWVkIG91dC4KKworICAgICAgICBXaGVuIHRoZSB0aW1lb3V0IGFyZ3VtZW50IGlzIG5vdCBwcmVzZW50IG9yIE5vbmUsIHRoZSBvcGVyYXRpb24gd2lsbAorICAgICAgICBibG9jayB1bnRpbCB0aGUgdGhyZWFkIHRlcm1pbmF0ZXMuCisKKyAgICAgICAgQSB0aHJlYWQgY2FuIGJlIGpvaW4oKWVkIG1hbnkgdGltZXMuCisKKyAgICAgICAgam9pbigpIHJhaXNlcyBhIFJ1bnRpbWVFcnJvciBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gam9pbiB0aGUgY3VycmVudAorICAgICAgICB0aHJlYWQgYXMgdGhhdCB3b3VsZCBjYXVzZSBhIGRlYWRsb2NrLiBJdCBpcyBhbHNvIGFuIGVycm9yIHRvIGpvaW4oKSBhCisgICAgICAgIHRocmVhZCBiZWZvcmUgaXQgaGFzIGJlZW4gc3RhcnRlZCBhbmQgYXR0ZW1wdHMgdG8gZG8gc28gcmFpc2VzIHRoZSBzYW1lCisgICAgICAgIGV4Y2VwdGlvbi4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX19pbml0aWFsaXplZDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiVGhyZWFkLl9faW5pdF9fKCkgbm90IGNhbGxlZCIpCisgICAgICAgIGlmIG5vdCBzZWxmLl9fc3RhcnRlZC5pc19zZXQoKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiY2Fubm90IGpvaW4gdGhyZWFkIGJlZm9yZSBpdCBpcyBzdGFydGVkIikKKyAgICAgICAgaWYgc2VsZiBpcyBjdXJyZW50X3RocmVhZCgpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJjYW5ub3Qgam9pbiBjdXJyZW50IHRocmVhZCIpCisKKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX19zdG9wcGVkOgorICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLmpvaW4oKTogd2FpdGluZyB1bnRpbCB0aHJlYWQgc3RvcHMiLCBzZWxmKQorICAgICAgICBzZWxmLl9fYmxvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5fX3N0b3BwZWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX19ibG9jay53YWl0KCkKKyAgICAgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLmpvaW4oKTogdGhyZWFkIHN0b3BwZWQiLCBzZWxmKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWFkbGluZSA9IF90aW1lKCkgKyB0aW1lb3V0CisgICAgICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYuX19zdG9wcGVkOgorICAgICAgICAgICAgICAgICAgICBkZWxheSA9IGRlYWRsaW5lIC0gX3RpbWUoKQorICAgICAgICAgICAgICAgICAgICBpZiBkZWxheSA8PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLmpvaW4oKTogdGltZWQgb3V0Iiwgc2VsZikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX19ibG9jay53YWl0KGRlbGF5KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLmpvaW4oKTogdGhyZWFkIHN0b3BwZWQiLCBzZWxmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fX2Jsb2NrLnJlbGVhc2UoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgICIiIkEgc3RyaW5nIHVzZWQgZm9yIGlkZW50aWZpY2F0aW9uIHB1cnBvc2VzIG9ubHkuCisKKyAgICAgICAgSXQgaGFzIG5vIHNlbWFudGljcy4gTXVsdGlwbGUgdGhyZWFkcyBtYXkgYmUgZ2l2ZW4gdGhlIHNhbWUgbmFtZS4gVGhlCisgICAgICAgIGluaXRpYWwgbmFtZSBpcyBzZXQgYnkgdGhlIGNvbnN0cnVjdG9yLgorCisgICAgICAgICIiIgorICAgICAgICBhc3NlcnQgc2VsZi5fX2luaXRpYWxpemVkLCAiVGhyZWFkLl9faW5pdF9fKCkgbm90IGNhbGxlZCIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lCisKKyAgICBAbmFtZS5zZXR0ZXIKKyAgICBkZWYgbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuX19pbml0aWFsaXplZCwgIlRocmVhZC5fX2luaXRfXygpIG5vdCBjYWxsZWQiCisgICAgICAgIHNlbGYuX19uYW1lID0gc3RyKG5hbWUpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgaWRlbnQoc2VsZik6CisgICAgICAgICIiIlRocmVhZCBpZGVudGlmaWVyIG9mIHRoaXMgdGhyZWFkIG9yIE5vbmUgaWYgaXQgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQuCisKKyAgICAgICAgVGhpcyBpcyBhIG5vbnplcm8gaW50ZWdlci4gU2VlIHRoZSB0aHJlYWQuZ2V0X2lkZW50KCkgZnVuY3Rpb24uIFRocmVhZAorICAgICAgICBpZGVudGlmaWVycyBtYXkgYmUgcmVjeWNsZWQgd2hlbiBhIHRocmVhZCBleGl0cyBhbmQgYW5vdGhlciB0aHJlYWQgaXMKKyAgICAgICAgY3JlYXRlZC4gVGhlIGlkZW50aWZpZXIgaXMgYXZhaWxhYmxlIGV2ZW4gYWZ0ZXIgdGhlIHRocmVhZCBoYXMgZXhpdGVkLgorCisgICAgICAgICIiIgorICAgICAgICBhc3NlcnQgc2VsZi5fX2luaXRpYWxpemVkLCAiVGhyZWFkLl9faW5pdF9fKCkgbm90IGNhbGxlZCIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19pZGVudAorCisgICAgZGVmIGlzQWxpdmUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB3aGV0aGVyIHRoZSB0aHJlYWQgaXMgYWxpdmUuCisKKyAgICAgICAgVGhpcyBtZXRob2QgcmV0dXJucyBUcnVlIGp1c3QgYmVmb3JlIHRoZSBydW4oKSBtZXRob2Qgc3RhcnRzIHVudGlsIGp1c3QKKyAgICAgICAgYWZ0ZXIgdGhlIHJ1bigpIG1ldGhvZCB0ZXJtaW5hdGVzLiBUaGUgbW9kdWxlIGZ1bmN0aW9uIGVudW1lcmF0ZSgpCisgICAgICAgIHJldHVybnMgYSBsaXN0IG9mIGFsbCBhbGl2ZSB0aHJlYWRzLgorCisgICAgICAgICIiIgorICAgICAgICBhc3NlcnQgc2VsZi5fX2luaXRpYWxpemVkLCAiVGhyZWFkLl9faW5pdF9fKCkgbm90IGNhbGxlZCIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19zdGFydGVkLmlzX3NldCgpIGFuZCBub3Qgc2VsZi5fX3N0b3BwZWQKKworICAgIGlzX2FsaXZlID0gaXNBbGl2ZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGRhZW1vbihzZWxmKToKKyAgICAgICAgIiIiQSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHRocmVhZCBpcyBhIGRhZW1vbiB0aHJlYWQgKFRydWUpIG9yIG5vdCAoRmFsc2UpLgorCisgICAgICAgIFRoaXMgbXVzdCBiZSBzZXQgYmVmb3JlIHN0YXJ0KCkgaXMgY2FsbGVkLCBvdGhlcndpc2UgUnVudGltZUVycm9yIGlzCisgICAgICAgIHJhaXNlZC4gSXRzIGluaXRpYWwgdmFsdWUgaXMgaW5oZXJpdGVkIGZyb20gdGhlIGNyZWF0aW5nIHRocmVhZDsgdGhlCisgICAgICAgIG1haW4gdGhyZWFkIGlzIG5vdCBhIGRhZW1vbiB0aHJlYWQgYW5kIHRoZXJlZm9yZSBhbGwgdGhyZWFkcyBjcmVhdGVkIGluCisgICAgICAgIHRoZSBtYWluIHRocmVhZCBkZWZhdWx0IHRvIGRhZW1vbiA9IEZhbHNlLgorCisgICAgICAgIFRoZSBlbnRpcmUgUHl0aG9uIHByb2dyYW0gZXhpdHMgd2hlbiBubyBhbGl2ZSBub24tZGFlbW9uIHRocmVhZHMgYXJlCisgICAgICAgIGxlZnQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGFzc2VydCBzZWxmLl9faW5pdGlhbGl6ZWQsICJUaHJlYWQuX19pbml0X18oKSBub3QgY2FsbGVkIgorICAgICAgICByZXR1cm4gc2VsZi5fX2RhZW1vbmljCisKKyAgICBAZGFlbW9uLnNldHRlcgorICAgIGRlZiBkYWVtb24oc2VsZiwgZGFlbW9uaWMpOgorICAgICAgICBpZiBub3Qgc2VsZi5fX2luaXRpYWxpemVkOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJUaHJlYWQuX19pbml0X18oKSBub3QgY2FsbGVkIikKKyAgICAgICAgaWYgc2VsZi5fX3N0YXJ0ZWQuaXNfc2V0KCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImNhbm5vdCBzZXQgZGFlbW9uIHN0YXR1cyBvZiBhY3RpdmUgdGhyZWFkIik7CisgICAgICAgIHNlbGYuX19kYWVtb25pYyA9IGRhZW1vbmljCisKKyAgICBkZWYgaXNEYWVtb24oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRhZW1vbgorCisgICAgZGVmIHNldERhZW1vbihzZWxmLCBkYWVtb25pYyk6CisgICAgICAgIHNlbGYuZGFlbW9uID0gZGFlbW9uaWMKKworICAgIGRlZiBnZXROYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lCisKKyAgICBkZWYgc2V0TmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorCisjIFRoZSB0aW1lciBjbGFzcyB3YXMgY29udHJpYnV0ZWQgYnkgSXRhbWFyIFNodHVsbC1UcmF1cmluZworCitkZWYgVGltZXIoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiJGYWN0b3J5IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIFRpbWVyIG9iamVjdC4KKworICAgIFRpbWVycyBjYWxsIGEgZnVuY3Rpb24gYWZ0ZXIgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY29uZHM6CisKKyAgICAgICAgdCA9IFRpbWVyKDMwLjAsIGYsIGFyZ3M9W10sIGt3YXJncz17fSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuY2FuY2VsKCkgICAgICMgc3RvcCB0aGUgdGltZXIncyBhY3Rpb24gaWYgaXQncyBzdGlsbCB3YWl0aW5nCisKKyAgICAiIiIKKyAgICByZXR1cm4gX1RpbWVyKCphcmdzLCAqKmt3YXJncykKKworY2xhc3MgX1RpbWVyKFRocmVhZCk6CisgICAgIiIiQ2FsbCBhIGZ1bmN0aW9uIGFmdGVyIGEgc3BlY2lmaWVkIG51bWJlciBvZiBzZWNvbmRzOgorCisgICAgICAgICAgICB0ID0gVGltZXIoMzAuMCwgZiwgYXJncz1bXSwga3dhcmdzPXt9KQorICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICB0LmNhbmNlbCgpICAgICAjIHN0b3AgdGhlIHRpbWVyJ3MgYWN0aW9uIGlmIGl0J3Mgc3RpbGwgd2FpdGluZworCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW50ZXJ2YWwsIGZ1bmN0aW9uLCBhcmdzPVtdLCBrd2FyZ3M9e30pOgorICAgICAgICBUaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5pbnRlcnZhbCA9IGludGVydmFsCisgICAgICAgIHNlbGYuZnVuY3Rpb24gPSBmdW5jdGlvbgorICAgICAgICBzZWxmLmFyZ3MgPSBhcmdzCisgICAgICAgIHNlbGYua3dhcmdzID0ga3dhcmdzCisgICAgICAgIHNlbGYuZmluaXNoZWQgPSBFdmVudCgpCisKKyAgICBkZWYgY2FuY2VsKHNlbGYpOgorICAgICAgICAiIiJTdG9wIHRoZSB0aW1lciBpZiBpdCBoYXNuJ3QgZmluaXNoZWQgeWV0IiIiCisgICAgICAgIHNlbGYuZmluaXNoZWQuc2V0KCkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuZmluaXNoZWQud2FpdChzZWxmLmludGVydmFsKQorICAgICAgICBpZiBub3Qgc2VsZi5maW5pc2hlZC5pc19zZXQoKToKKyAgICAgICAgICAgIHNlbGYuZnVuY3Rpb24oKnNlbGYuYXJncywgKipzZWxmLmt3YXJncykKKyAgICAgICAgc2VsZi5maW5pc2hlZC5zZXQoKQorCisjIFNwZWNpYWwgdGhyZWFkIGNsYXNzIHRvIHJlcHJlc2VudCB0aGUgbWFpbiB0aHJlYWQKKyMgVGhpcyBpcyBnYXJiYWdlIGNvbGxlY3RlZCB0aHJvdWdoIGFuIGV4aXQgaGFuZGxlcgorCitjbGFzcyBfTWFpblRocmVhZChUaHJlYWQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBUaHJlYWQuX19pbml0X18oc2VsZiwgbmFtZT0iTWFpblRocmVhZCIpCisgICAgICAgIHNlbGYuX1RocmVhZF9fc3RhcnRlZC5zZXQoKQorICAgICAgICBzZWxmLl9zZXRfaWRlbnQoKQorICAgICAgICB3aXRoIF9hY3RpdmVfbGltYm9fbG9jazoKKyAgICAgICAgICAgIF9hY3RpdmVbX2dldF9pZGVudCgpXSA9IHNlbGYKKworICAgIGRlZiBfc2V0X2RhZW1vbihzZWxmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX2V4aXRmdW5jKHNlbGYpOgorICAgICAgICBzZWxmLl9UaHJlYWRfX3N0b3AoKQorICAgICAgICB0ID0gX3BpY2tTb21lTm9uRGFlbW9uVGhyZWFkKCkKKyAgICAgICAgaWYgdDoKKyAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlczogd2FpdGluZyBmb3Igb3RoZXIgdGhyZWFkcyIsIHNlbGYpCisgICAgICAgIHdoaWxlIHQ6CisgICAgICAgICAgICB0LmpvaW4oKQorICAgICAgICAgICAgdCA9IF9waWNrU29tZU5vbkRhZW1vblRocmVhZCgpCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzOiBleGl0aW5nIiwgc2VsZikKKyAgICAgICAgc2VsZi5fVGhyZWFkX19kZWxldGUoKQorCitkZWYgX3BpY2tTb21lTm9uRGFlbW9uVGhyZWFkKCk6CisgICAgZm9yIHQgaW4gZW51bWVyYXRlKCk6CisgICAgICAgIGlmIG5vdCB0LmRhZW1vbiBhbmQgdC5pc19hbGl2ZSgpOgorICAgICAgICAgICAgcmV0dXJuIHQKKyAgICByZXR1cm4gTm9uZQorCisKKyMgRHVtbXkgdGhyZWFkIGNsYXNzIHRvIHJlcHJlc2VudCB0aHJlYWRzIG5vdCBzdGFydGVkIGhlcmUuCisjIFRoZXNlIGFyZW4ndCBnYXJiYWdlIGNvbGxlY3RlZCB3aGVuIHRoZXkgZGllLCBub3IgY2FuIHRoZXkgYmUgd2FpdGVkIGZvci4KKyMgSWYgdGhleSBpbnZva2UgYW55dGhpbmcgaW4gdGhyZWFkaW5nLnB5IHRoYXQgY2FsbHMgY3VycmVudF90aHJlYWQoKSwgdGhleQorIyBsZWF2ZSBhbiBlbnRyeSBpbiB0aGUgX2FjdGl2ZSBkaWN0IGZvcmV2ZXIgYWZ0ZXIuCisjIFRoZWlyIHB1cnBvc2UgaXMgdG8gcmV0dXJuICpzb21ldGhpbmcqIGZyb20gY3VycmVudF90aHJlYWQoKS4KKyMgVGhleSBhcmUgbWFya2VkIGFzIGRhZW1vbiB0aHJlYWRzIHNvIHdlIHdvbid0IHdhaXQgZm9yIHRoZW0KKyMgd2hlbiB3ZSBleGl0IChjb25mb3JtIHByZXZpb3VzIHNlbWFudGljcykuCisKK2NsYXNzIF9EdW1teVRocmVhZChUaHJlYWQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBUaHJlYWQuX19pbml0X18oc2VsZiwgbmFtZT1fbmV3bmFtZSgiRHVtbXktJWQiKSkKKworICAgICAgICAjIFRocmVhZC5fX2Jsb2NrIGNvbnN1bWVzIGFuIE9TLWxldmVsIGxvY2tpbmcgcHJpbWl0aXZlLCB3aGljaAorICAgICAgICAjIGNhbiBuZXZlciBiZSB1c2VkIGJ5IGEgX0R1bW15VGhyZWFkLiAgU2luY2UgYSBfRHVtbXlUaHJlYWQKKyAgICAgICAgIyBpbnN0YW5jZSBpcyBpbW1vcnRhbCwgdGhhdCdzIGJhZCwgc28gcmVsZWFzZSB0aGlzIHJlc291cmNlLgorICAgICAgICBkZWwgc2VsZi5fVGhyZWFkX19ibG9jaworCisgICAgICAgIHNlbGYuX1RocmVhZF9fc3RhcnRlZC5zZXQoKQorICAgICAgICBzZWxmLl9zZXRfaWRlbnQoKQorICAgICAgICB3aXRoIF9hY3RpdmVfbGltYm9fbG9jazoKKyAgICAgICAgICAgIF9hY3RpdmVbX2dldF9pZGVudCgpXSA9IHNlbGYKKworICAgIGRlZiBfc2V0X2RhZW1vbihzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBqb2luKHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIGFzc2VydCBGYWxzZSwgImNhbm5vdCBqb2luIGEgZHVtbXkgdGhyZWFkIgorCisKKyMgR2xvYmFsIEFQSSBmdW5jdGlvbnMKKworZGVmIGN1cnJlbnRUaHJlYWQoKToKKyAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgVGhyZWFkIG9iamVjdCwgY29ycmVzcG9uZGluZyB0byB0aGUgY2FsbGVyJ3MgdGhyZWFkIG9mIGNvbnRyb2wuCisKKyAgICBJZiB0aGUgY2FsbGVyJ3MgdGhyZWFkIG9mIGNvbnRyb2wgd2FzIG5vdCBjcmVhdGVkIHRocm91Z2ggdGhlIHRocmVhZGluZworICAgIG1vZHVsZSwgYSBkdW1teSB0aHJlYWQgb2JqZWN0IHdpdGggbGltaXRlZCBmdW5jdGlvbmFsaXR5IGlzIHJldHVybmVkLgorCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gX2FjdGl2ZVtfZ2V0X2lkZW50KCldCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAjI3ByaW50ICJjdXJyZW50X3RocmVhZCgpOiBubyBjdXJyZW50IHRocmVhZCBmb3IiLCBfZ2V0X2lkZW50KCkKKyAgICAgICAgcmV0dXJuIF9EdW1teVRocmVhZCgpCisKK2N1cnJlbnRfdGhyZWFkID0gY3VycmVudFRocmVhZAorCitkZWYgYWN0aXZlQ291bnQoKToKKyAgICAiIiJSZXR1cm4gdGhlIG51bWJlciBvZiBUaHJlYWQgb2JqZWN0cyBjdXJyZW50bHkgYWxpdmUuCisKKyAgICBUaGUgcmV0dXJuZWQgY291bnQgaXMgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGUgbGlzdCByZXR1cm5lZCBieQorICAgIGVudW1lcmF0ZSgpLgorCisgICAgIiIiCisgICAgd2l0aCBfYWN0aXZlX2xpbWJvX2xvY2s6CisgICAgICAgIHJldHVybiBsZW4oX2FjdGl2ZSkgKyBsZW4oX2xpbWJvKQorCithY3RpdmVfY291bnQgPSBhY3RpdmVDb3VudAorCitkZWYgX2VudW1lcmF0ZSgpOgorICAgICMgU2FtZSBhcyBlbnVtZXJhdGUoKSwgYnV0IHdpdGhvdXQgdGhlIGxvY2suIEludGVybmFsIHVzZSBvbmx5LgorICAgIHJldHVybiBfYWN0aXZlLnZhbHVlcygpICsgX2xpbWJvLnZhbHVlcygpCisKK2RlZiBlbnVtZXJhdGUoKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBUaHJlYWQgb2JqZWN0cyBjdXJyZW50bHkgYWxpdmUuCisKKyAgICBUaGUgbGlzdCBpbmNsdWRlcyBkYWVtb25pYyB0aHJlYWRzLCBkdW1teSB0aHJlYWQgb2JqZWN0cyBjcmVhdGVkIGJ5CisgICAgY3VycmVudF90aHJlYWQoKSwgYW5kIHRoZSBtYWluIHRocmVhZC4gSXQgZXhjbHVkZXMgdGVybWluYXRlZCB0aHJlYWRzIGFuZAorICAgIHRocmVhZHMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBzdGFydGVkLgorCisgICAgIiIiCisgICAgd2l0aCBfYWN0aXZlX2xpbWJvX2xvY2s6CisgICAgICAgIHJldHVybiBfYWN0aXZlLnZhbHVlcygpICsgX2xpbWJvLnZhbHVlcygpCisKK2Zyb20gdGhyZWFkIGltcG9ydCBzdGFja19zaXplCisKKyMgQ3JlYXRlIHRoZSBtYWluIHRocmVhZCBvYmplY3QsCisjIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIGludGVycHJldGVyCisjIChQeV9NYWluKSBhcyB0aHJlYWRpbmcuX3NodXRkb3duLgorCitfc2h1dGRvd24gPSBfTWFpblRocmVhZCgpLl9leGl0ZnVuYworCisjIGdldCB0aHJlYWQtbG9jYWwgaW1wbGVtZW50YXRpb24sIGVpdGhlciBmcm9tIHRoZSB0aHJlYWQKKyMgbW9kdWxlLCBvciBmcm9tIHRoZSBweXRob24gZmFsbGJhY2sKKwordHJ5OgorICAgIGZyb20gdGhyZWFkIGltcG9ydCBfbG9jYWwgYXMgbG9jYWwKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIF90aHJlYWRpbmdfbG9jYWwgaW1wb3J0IGxvY2FsCisKKworZGVmIF9hZnRlcl9mb3JrKCk6CisgICAgIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBQeXRob24vY2V2YWwuYzpQeUV2YWxfUmVJbml0VGhyZWFkcyB3aGljaAorICAgICMgaXMgY2FsbGVkIGZyb20gUHlPU19BZnRlckZvcmsuICBIZXJlIHdlIGNsZWFudXAgdGhyZWFkaW5nIG1vZHVsZSBzdGF0ZQorICAgICMgdGhhdCBzaG91bGQgbm90IGV4aXN0IGFmdGVyIGEgZm9yay4KKworICAgICMgUmVzZXQgX2FjdGl2ZV9saW1ib19sb2NrLCBpbiBjYXNlIHdlIGZvcmtlZCB3aGlsZSB0aGUgbG9jayB3YXMgaGVsZAorICAgICMgYnkgYW5vdGhlciAobm9uLWZvcmtlZCkgdGhyZWFkLiAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTg3NDkwMAorICAgIGdsb2JhbCBfYWN0aXZlX2xpbWJvX2xvY2sKKyAgICBfYWN0aXZlX2xpbWJvX2xvY2sgPSBfYWxsb2NhdGVfbG9jaygpCisKKyAgICAjIGZvcmsoKSBvbmx5IGNvcGllZCB0aGUgY3VycmVudCB0aHJlYWQ7IGNsZWFyIHJlZmVyZW5jZXMgdG8gb3RoZXJzLgorICAgIG5ld19hY3RpdmUgPSB7fQorICAgIGN1cnJlbnQgPSBjdXJyZW50X3RocmVhZCgpCisgICAgd2l0aCBfYWN0aXZlX2xpbWJvX2xvY2s6CisgICAgICAgIGZvciB0aHJlYWQgaW4gX2FjdGl2ZS5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICAjIEFueSBsb2NrL2NvbmRpdGlvbiB2YXJpYWJsZSBtYXkgYmUgY3VycmVudGx5IGxvY2tlZCBvciBpbiBhbgorICAgICAgICAgICAgIyBpbnZhbGlkIHN0YXRlLCBzbyB3ZSByZWluaXRpYWxpemUgdGhlbS4KKyAgICAgICAgICAgIGlmIGhhc2F0dHIodGhyZWFkLCAnX3Jlc2V0X2ludGVybmFsX2xvY2tzJyk6CisgICAgICAgICAgICAgICAgdGhyZWFkLl9yZXNldF9pbnRlcm5hbF9sb2NrcygpCisgICAgICAgICAgICBpZiB0aHJlYWQgaXMgY3VycmVudDoKKyAgICAgICAgICAgICAgICAjIFRoZXJlIGlzIG9ubHkgb25lIGFjdGl2ZSB0aHJlYWQuIFdlIHJlc2V0IHRoZSBpZGVudCB0bworICAgICAgICAgICAgICAgICMgaXRzIG5ldyB2YWx1ZSBzaW5jZSBpdCBjYW4gaGF2ZSBjaGFuZ2VkLgorICAgICAgICAgICAgICAgIGlkZW50ID0gX2dldF9pZGVudCgpCisgICAgICAgICAgICAgICAgdGhyZWFkLl9UaHJlYWRfX2lkZW50ID0gaWRlbnQKKyAgICAgICAgICAgICAgICBuZXdfYWN0aXZlW2lkZW50XSA9IHRocmVhZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEFsbCB0aGUgb3RoZXJzIGFyZSBhbHJlYWR5IHN0b3BwZWQuCisgICAgICAgICAgICAgICAgdGhyZWFkLl9UaHJlYWRfX3N0b3AoKQorCisgICAgICAgIF9saW1iby5jbGVhcigpCisgICAgICAgIF9hY3RpdmUuY2xlYXIoKQorICAgICAgICBfYWN0aXZlLnVwZGF0ZShuZXdfYWN0aXZlKQorICAgICAgICBhc3NlcnQgbGVuKF9hY3RpdmUpID09IDEKKworCisjIFNlbGYtdGVzdCBjb2RlCisKK2RlZiBfdGVzdCgpOgorCisgICAgY2xhc3MgQm91bmRlZFF1ZXVlKF9WZXJib3NlKToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbGltaXQpOgorICAgICAgICAgICAgX1ZlcmJvc2UuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgIHNlbGYubW9uID0gUkxvY2soKQorICAgICAgICAgICAgc2VsZi5yYyA9IENvbmRpdGlvbihzZWxmLm1vbikKKyAgICAgICAgICAgIHNlbGYud2MgPSBDb25kaXRpb24oc2VsZi5tb24pCisgICAgICAgICAgICBzZWxmLmxpbWl0ID0gbGltaXQKKyAgICAgICAgICAgIHNlbGYucXVldWUgPSBfZGVxdWUoKQorCisgICAgICAgIGRlZiBwdXQoc2VsZiwgaXRlbSk6CisgICAgICAgICAgICBzZWxmLm1vbi5hY3F1aXJlKCkKKyAgICAgICAgICAgIHdoaWxlIGxlbihzZWxmLnF1ZXVlKSA+PSBzZWxmLmxpbWl0OgorICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoInB1dCglcyk6IHF1ZXVlIGZ1bGwiLCBpdGVtKQorICAgICAgICAgICAgICAgIHNlbGYud2Mud2FpdCgpCisgICAgICAgICAgICBzZWxmLnF1ZXVlLmFwcGVuZChpdGVtKQorICAgICAgICAgICAgc2VsZi5fbm90ZSgicHV0KCVzKTogYXBwZW5kZWQsIGxlbmd0aCBub3cgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICBpdGVtLCBsZW4oc2VsZi5xdWV1ZSkpCisgICAgICAgICAgICBzZWxmLnJjLm5vdGlmeSgpCisgICAgICAgICAgICBzZWxmLm1vbi5yZWxlYXNlKCkKKworICAgICAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5tb24uYWNxdWlyZSgpCisgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWV1ZToKKyAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCJnZXQoKTogcXVldWUgZW1wdHkiKQorICAgICAgICAgICAgICAgIHNlbGYucmMud2FpdCgpCisgICAgICAgICAgICBpdGVtID0gc2VsZi5xdWV1ZS5wb3BsZWZ0KCkKKyAgICAgICAgICAgIHNlbGYuX25vdGUoImdldCgpOiBnb3QgJXMsICVkIGxlZnQiLCBpdGVtLCBsZW4oc2VsZi5xdWV1ZSkpCisgICAgICAgICAgICBzZWxmLndjLm5vdGlmeSgpCisgICAgICAgICAgICBzZWxmLm1vbi5yZWxlYXNlKCkKKyAgICAgICAgICAgIHJldHVybiBpdGVtCisKKyAgICBjbGFzcyBQcm9kdWNlclRocmVhZChUaHJlYWQpOgorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBxdWV1ZSwgcXVvdGEpOgorICAgICAgICAgICAgVGhyZWFkLl9faW5pdF9fKHNlbGYsIG5hbWU9IlByb2R1Y2VyIikKKyAgICAgICAgICAgIHNlbGYucXVldWUgPSBxdWV1ZQorICAgICAgICAgICAgc2VsZi5xdW90YSA9IHF1b3RhCisKKyAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgIGZyb20gcmFuZG9tIGltcG9ydCByYW5kb20KKyAgICAgICAgICAgIGNvdW50ZXIgPSAwCisgICAgICAgICAgICB3aGlsZSBjb3VudGVyIDwgc2VsZi5xdW90YToKKyAgICAgICAgICAgICAgICBjb3VudGVyID0gY291bnRlciArIDEKKyAgICAgICAgICAgICAgICBzZWxmLnF1ZXVlLnB1dCgiJXMuJWQiICUgKHNlbGYubmFtZSwgY291bnRlcikpCisgICAgICAgICAgICAgICAgX3NsZWVwKHJhbmRvbSgpICogMC4wMDAwMSkKKworCisgICAgY2xhc3MgQ29uc3VtZXJUaHJlYWQoVGhyZWFkKToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcXVldWUsIGNvdW50KToKKyAgICAgICAgICAgIFRocmVhZC5fX2luaXRfXyhzZWxmLCBuYW1lPSJDb25zdW1lciIpCisgICAgICAgICAgICBzZWxmLnF1ZXVlID0gcXVldWUKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBjb3VudAorCisgICAgICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICAgICB3aGlsZSBzZWxmLmNvdW50ID4gMDoKKyAgICAgICAgICAgICAgICBpdGVtID0gc2VsZi5xdWV1ZS5nZXQoKQorICAgICAgICAgICAgICAgIHByaW50IGl0ZW0KKyAgICAgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCAtIDEKKworICAgIE5QID0gMworICAgIFFMID0gNAorICAgIE5JID0gNQorCisgICAgUSA9IEJvdW5kZWRRdWV1ZShRTCkKKyAgICBQID0gW10KKyAgICBmb3IgaSBpbiByYW5nZShOUCk6CisgICAgICAgIHQgPSBQcm9kdWNlclRocmVhZChRLCBOSSkKKyAgICAgICAgdC5uYW1lID0gKCJQcm9kdWNlci0lZCIgJSAoaSsxKSkKKyAgICAgICAgUC5hcHBlbmQodCkKKyAgICBDID0gQ29uc3VtZXJUaHJlYWQoUSwgTkkqTlApCisgICAgZm9yIHQgaW4gUDoKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIF9zbGVlcCgwLjAwMDAwMSkKKyAgICBDLnN0YXJ0KCkKKyAgICBmb3IgdCBpbiBQOgorICAgICAgICB0LmpvaW4oKQorICAgIEMuam9pbigpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90aHJlYWRpbmcucHljIGIvbGliL3B5dGhvbjIuNy90aHJlYWRpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YjNkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RocmVhZGluZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90aHJlYWRpbmcucHlvIGIvbGliL3B5dGhvbjIuNy90aHJlYWRpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZWFmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RocmVhZGluZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90aW1laXQucHkgYi9saWIvcHl0aG9uMi43L3RpbWVpdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTllODE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90aW1laXQucHkKQEAgLTAsMCArMSwzMzAgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiVG9vbCBmb3IgbWVhc3VyaW5nIGV4ZWN1dGlvbiB0aW1lIG9mIHNtYWxsIGNvZGUgc25pcHBldHMuCisKK1RoaXMgbW9kdWxlIGF2b2lkcyBhIG51bWJlciBvZiBjb21tb24gdHJhcHMgZm9yIG1lYXN1cmluZyBleGVjdXRpb24KK3RpbWVzLiAgU2VlIGFsc28gVGltIFBldGVycycgaW50cm9kdWN0aW9uIHRvIHRoZSBBbGdvcml0aG1zIGNoYXB0ZXIgaW4KK3RoZSBQeXRob24gQ29va2Jvb2ssIHB1Ymxpc2hlZCBieSBPJ1JlaWxseS4KKworTGlicmFyeSB1c2FnZTogc2VlIHRoZSBUaW1lciBjbGFzcy4KKworQ29tbWFuZCBsaW5lIHVzYWdlOgorICAgIHB5dGhvbiB0aW1laXQucHkgWy1uIE5dIFstciBOXSBbLXMgU10gWy10XSBbLWNdIFstaF0gWy0tXSBbc3RhdGVtZW50XQorCitPcHRpb25zOgorICAtbi8tLW51bWJlciBOOiBob3cgbWFueSB0aW1lcyB0byBleGVjdXRlICdzdGF0ZW1lbnQnIChkZWZhdWx0OiBzZWUgYmVsb3cpCisgIC1yLy0tcmVwZWF0IE46IGhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCB0aGUgdGltZXIgKGRlZmF1bHQgMykKKyAgLXMvLS1zZXR1cCBTOiBzdGF0ZW1lbnQgdG8gYmUgZXhlY3V0ZWQgb25jZSBpbml0aWFsbHkgKGRlZmF1bHQgJ3Bhc3MnKQorICAtdC8tLXRpbWU6IHVzZSB0aW1lLnRpbWUoKSAoZGVmYXVsdCBvbiBVbml4KQorICAtYy8tLWNsb2NrOiB1c2UgdGltZS5jbG9jaygpIChkZWZhdWx0IG9uIFdpbmRvd3MpCisgIC12Ly0tdmVyYm9zZTogcHJpbnQgcmF3IHRpbWluZyByZXN1bHRzOyByZXBlYXQgZm9yIG1vcmUgZGlnaXRzIHByZWNpc2lvbgorICAtaC8tLWhlbHA6IHByaW50IHRoaXMgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdAorICAtLTogc2VwYXJhdGUgb3B0aW9ucyBmcm9tIHN0YXRlbWVudCwgdXNlIHdoZW4gc3RhdGVtZW50IHN0YXJ0cyB3aXRoIC0KKyAgc3RhdGVtZW50OiBzdGF0ZW1lbnQgdG8gYmUgdGltZWQgKGRlZmF1bHQgJ3Bhc3MnKQorCitBIG11bHRpLWxpbmUgc3RhdGVtZW50IG1heSBiZSBnaXZlbiBieSBzcGVjaWZ5aW5nIGVhY2ggbGluZSBhcyBhCitzZXBhcmF0ZSBhcmd1bWVudDsgaW5kZW50ZWQgbGluZXMgYXJlIHBvc3NpYmxlIGJ5IGVuY2xvc2luZyBhbgorYXJndW1lbnQgaW4gcXVvdGVzIGFuZCB1c2luZyBsZWFkaW5nIHNwYWNlcy4gIE11bHRpcGxlIC1zIG9wdGlvbnMgYXJlCit0cmVhdGVkIHNpbWlsYXJseS4KKworSWYgLW4gaXMgbm90IGdpdmVuLCBhIHN1aXRhYmxlIG51bWJlciBvZiBsb29wcyBpcyBjYWxjdWxhdGVkIGJ5IHRyeWluZworc3VjY2Vzc2l2ZSBwb3dlcnMgb2YgMTAgdW50aWwgdGhlIHRvdGFsIHRpbWUgaXMgYXQgbGVhc3QgMC4yIHNlY29uZHMuCisKK1RoZSBkaWZmZXJlbmNlIGluIGRlZmF1bHQgdGltZXIgZnVuY3Rpb24gaXMgYmVjYXVzZSBvbiBXaW5kb3dzLAorY2xvY2soKSBoYXMgbWljcm9zZWNvbmQgZ3JhbnVsYXJpdHkgYnV0IHRpbWUoKSdzIGdyYW51bGFyaXR5IGlzIDEvNjB0aAorb2YgYSBzZWNvbmQ7IG9uIFVuaXgsIGNsb2NrKCkgaGFzIDEvMTAwdGggb2YgYSBzZWNvbmQgZ3JhbnVsYXJpdHkgYW5kCit0aW1lKCkgaXMgbXVjaCBtb3JlIHByZWNpc2UuICBPbiBlaXRoZXIgcGxhdGZvcm0sIHRoZSBkZWZhdWx0IHRpbWVyCitmdW5jdGlvbnMgbWVhc3VyZSB3YWxsIGNsb2NrIHRpbWUsIG5vdCB0aGUgQ1BVIHRpbWUuICBUaGlzIG1lYW5zIHRoYXQKK290aGVyIHByb2Nlc3NlcyBydW5uaW5nIG9uIHRoZSBzYW1lIGNvbXB1dGVyIG1heSBpbnRlcmZlcmUgd2l0aCB0aGUKK3RpbWluZy4gIFRoZSBiZXN0IHRoaW5nIHRvIGRvIHdoZW4gYWNjdXJhdGUgdGltaW5nIGlzIG5lY2Vzc2FyeSBpcyB0bworcmVwZWF0IHRoZSB0aW1pbmcgYSBmZXcgdGltZXMgYW5kIHVzZSB0aGUgYmVzdCB0aW1lLiAgVGhlIC1yIG9wdGlvbiBpcworZ29vZCBmb3IgdGhpczsgdGhlIGRlZmF1bHQgb2YgMyByZXBldGl0aW9ucyBpcyBwcm9iYWJseSBlbm91Z2ggaW4gbW9zdAorY2FzZXMuICBPbiBVbml4LCB5b3UgY2FuIHVzZSBjbG9jaygpIHRvIG1lYXN1cmUgQ1BVIHRpbWUuCisKK05vdGU6IHRoZXJlIGlzIGEgY2VydGFpbiBiYXNlbGluZSBvdmVyaGVhZCBhc3NvY2lhdGVkIHdpdGggZXhlY3V0aW5nIGEKK3Bhc3Mgc3RhdGVtZW50LiAgVGhlIGNvZGUgaGVyZSBkb2Vzbid0IHRyeSB0byBoaWRlIGl0LCBidXQgeW91IHNob3VsZAorYmUgYXdhcmUgb2YgaXQuICBUaGUgYmFzZWxpbmUgb3ZlcmhlYWQgY2FuIGJlIG1lYXN1cmVkIGJ5IGludm9raW5nIHRoZQorcHJvZ3JhbSB3aXRob3V0IGFyZ3VtZW50cy4KKworVGhlIGJhc2VsaW5lIG92ZXJoZWFkIGRpZmZlcnMgYmV0d2VlbiBQeXRob24gdmVyc2lvbnMhICBBbHNvLCB0bworZmFpcmx5IGNvbXBhcmUgb2xkZXIgUHl0aG9uIHZlcnNpb25zIHRvIFB5dGhvbiAyLjMsIHlvdSBtYXkgd2FudCB0bwordXNlIHB5dGhvbiAtTyBmb3IgdGhlIG9sZGVyIHZlcnNpb25zIHRvIGF2b2lkIHRpbWluZyBTRVRfTElORU5PCitpbnN0cnVjdGlvbnMuCisiIiIKKworaW1wb3J0IGdjCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQordHJ5OgorICAgIGltcG9ydCBpdGVydG9vbHMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIE11c3QgYmUgYW4gb2xkZXIgUHl0aG9uIHZlcnNpb24gKHNlZSB0aW1laXQoKSBiZWxvdykKKyAgICBpdGVydG9vbHMgPSBOb25lCisKK19fYWxsX18gPSBbIlRpbWVyIl0KKworZHVtbXlfc3JjX25hbWUgPSAiPHRpbWVpdC1zcmM+IgorZGVmYXVsdF9udW1iZXIgPSAxMDAwMDAwCitkZWZhdWx0X3JlcGVhdCA9IDMKKworaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgIyBPbiBXaW5kb3dzLCB0aGUgYmVzdCB0aW1lciBpcyB0aW1lLmNsb2NrKCkKKyAgICBkZWZhdWx0X3RpbWVyID0gdGltZS5jbG9jaworZWxzZToKKyAgICAjIE9uIG1vc3Qgb3RoZXIgcGxhdGZvcm1zIHRoZSBiZXN0IHRpbWVyIGlzIHRpbWUudGltZSgpCisgICAgZGVmYXVsdF90aW1lciA9IHRpbWUudGltZQorCisjIERvbid0IGNoYW5nZSB0aGUgaW5kZW50YXRpb24gb2YgdGhlIHRlbXBsYXRlOyB0aGUgcmVpbmRlbnQoKSBjYWxscworIyBpbiBUaW1lci5fX2luaXRfXygpIGRlcGVuZCBvbiBzZXR1cCBiZWluZyBpbmRlbnRlZCA0IHNwYWNlcyBhbmQgc3RtdAorIyBiZWluZyBpbmRlbnRlZCA4IHNwYWNlcy4KK3RlbXBsYXRlID0gIiIiCitkZWYgaW5uZXIoX2l0LCBfdGltZXIpOgorICAgICUoc2V0dXApcworICAgIF90MCA9IF90aW1lcigpCisgICAgZm9yIF9pIGluIF9pdDoKKyAgICAgICAgJShzdG10KXMKKyAgICBfdDEgPSBfdGltZXIoKQorICAgIHJldHVybiBfdDEgLSBfdDAKKyIiIgorCitkZWYgcmVpbmRlbnQoc3JjLCBpbmRlbnQpOgorICAgICIiIkhlbHBlciB0byByZWluZGVudCBhIG11bHRpLWxpbmUgc3RhdGVtZW50LiIiIgorICAgIHJldHVybiBzcmMucmVwbGFjZSgiXG4iLCAiXG4iICsgIiAiKmluZGVudCkKKworZGVmIF90ZW1wbGF0ZV9mdW5jKHNldHVwLCBmdW5jKToKKyAgICAiIiJDcmVhdGUgYSB0aW1lciBmdW5jdGlvbi4gVXNlZCBpZiB0aGUgInN0YXRlbWVudCIgaXMgYSBjYWxsYWJsZS4iIiIKKyAgICBkZWYgaW5uZXIoX2l0LCBfdGltZXIsIF9mdW5jPWZ1bmMpOgorICAgICAgICBzZXR1cCgpCisgICAgICAgIF90MCA9IF90aW1lcigpCisgICAgICAgIGZvciBfaSBpbiBfaXQ6CisgICAgICAgICAgICBfZnVuYygpCisgICAgICAgIF90MSA9IF90aW1lcigpCisgICAgICAgIHJldHVybiBfdDEgLSBfdDAKKyAgICByZXR1cm4gaW5uZXIKKworY2xhc3MgVGltZXI6CisgICAgIiIiQ2xhc3MgZm9yIHRpbWluZyBleGVjdXRpb24gc3BlZWQgb2Ygc21hbGwgY29kZSBzbmlwcGV0cy4KKworICAgIFRoZSBjb25zdHJ1Y3RvciB0YWtlcyBhIHN0YXRlbWVudCB0byBiZSB0aW1lZCwgYW4gYWRkaXRpb25hbAorICAgIHN0YXRlbWVudCB1c2VkIGZvciBzZXR1cCwgYW5kIGEgdGltZXIgZnVuY3Rpb24uICBCb3RoIHN0YXRlbWVudHMKKyAgICBkZWZhdWx0IHRvICdwYXNzJzsgdGhlIHRpbWVyIGZ1bmN0aW9uIGlzIHBsYXRmb3JtLWRlcGVuZGVudCAoc2VlCisgICAgbW9kdWxlIGRvYyBzdHJpbmcpLgorCisgICAgVG8gbWVhc3VyZSB0aGUgZXhlY3V0aW9uIHRpbWUgb2YgdGhlIGZpcnN0IHN0YXRlbWVudCwgdXNlIHRoZQorICAgIHRpbWVpdCgpIG1ldGhvZC4gIFRoZSByZXBlYXQoKSBtZXRob2QgaXMgYSBjb252ZW5pZW5jZSB0byBjYWxsCisgICAgdGltZWl0KCkgbXVsdGlwbGUgdGltZXMgYW5kIHJldHVybiBhIGxpc3Qgb2YgcmVzdWx0cy4KKworICAgIFRoZSBzdGF0ZW1lbnRzIG1heSBjb250YWluIG5ld2xpbmVzLCBhcyBsb25nIGFzIHRoZXkgZG9uJ3QgY29udGFpbgorICAgIG11bHRpLWxpbmUgc3RyaW5nIGxpdGVyYWxzLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0bXQ9InBhc3MiLCBzZXR1cD0icGFzcyIsIHRpbWVyPWRlZmF1bHRfdGltZXIpOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4gIFNlZSBjbGFzcyBkb2Mgc3RyaW5nLiIiIgorICAgICAgICBzZWxmLnRpbWVyID0gdGltZXIKKyAgICAgICAgbnMgPSB7fQorICAgICAgICBpZiBpc2luc3RhbmNlKHN0bXQsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgc3RtdCA9IHJlaW5kZW50KHN0bXQsIDgpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNldHVwLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICBzZXR1cCA9IHJlaW5kZW50KHNldHVwLCA0KQorICAgICAgICAgICAgICAgIHNyYyA9IHRlbXBsYXRlICUgeydzdG10Jzogc3RtdCwgJ3NldHVwJzogc2V0dXB9CisgICAgICAgICAgICBlbGlmIGhhc2F0dHIoc2V0dXAsICdfX2NhbGxfXycpOgorICAgICAgICAgICAgICAgIHNyYyA9IHRlbXBsYXRlICUgeydzdG10Jzogc3RtdCwgJ3NldHVwJzogJ19zZXR1cCgpJ30KKyAgICAgICAgICAgICAgICBuc1snX3NldHVwJ10gPSBzZXR1cAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzZXR1cCBpcyBuZWl0aGVyIGEgc3RyaW5nIG5vciBjYWxsYWJsZSIpCisgICAgICAgICAgICBzZWxmLnNyYyA9IHNyYyAjIFNhdmUgZm9yIHRyYWNlYmFjayBkaXNwbGF5CisgICAgICAgICAgICBjb2RlID0gY29tcGlsZShzcmMsIGR1bW15X3NyY19uYW1lLCAiZXhlYyIpCisgICAgICAgICAgICBleGVjIGNvZGUgaW4gZ2xvYmFscygpLCBucworICAgICAgICAgICAgc2VsZi5pbm5lciA9IG5zWyJpbm5lciJdCisgICAgICAgIGVsaWYgaGFzYXR0cihzdG10LCAnX19jYWxsX18nKToKKyAgICAgICAgICAgIHNlbGYuc3JjID0gTm9uZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZXR1cCwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgX3NldHVwID0gc2V0dXAKKyAgICAgICAgICAgICAgICBkZWYgc2V0dXAoKToKKyAgICAgICAgICAgICAgICAgICAgZXhlYyBfc2V0dXAgaW4gZ2xvYmFscygpLCBucworICAgICAgICAgICAgZWxpZiBub3QgaGFzYXR0cihzZXR1cCwgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic2V0dXAgaXMgbmVpdGhlciBhIHN0cmluZyBub3IgY2FsbGFibGUiKQorICAgICAgICAgICAgc2VsZi5pbm5lciA9IF90ZW1wbGF0ZV9mdW5jKHNldHVwLCBzdG10KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3RtdCBpcyBuZWl0aGVyIGEgc3RyaW5nIG5vciBjYWxsYWJsZSIpCisKKyAgICBkZWYgcHJpbnRfZXhjKHNlbGYsIGZpbGU9Tm9uZSk6CisgICAgICAgICIiIkhlbHBlciB0byBwcmludCBhIHRyYWNlYmFjayBmcm9tIHRoZSB0aW1lZCBjb2RlLgorCisgICAgICAgIFR5cGljYWwgdXNlOgorCisgICAgICAgICAgICB0ID0gVGltZXIoLi4uKSAgICAgICAjIG91dHNpZGUgdGhlIHRyeS9leGNlcHQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0LnRpbWVpdCguLi4pICAgICMgb3IgdC5yZXBlYXQoLi4uKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHQucHJpbnRfZXhjKCkKKworICAgICAgICBUaGUgYWR2YW50YWdlIG92ZXIgdGhlIHN0YW5kYXJkIHRyYWNlYmFjayBpcyB0aGF0IHNvdXJjZSBsaW5lcworICAgICAgICBpbiB0aGUgY29tcGlsZWQgdGVtcGxhdGUgd2lsbCBiZSBkaXNwbGF5ZWQuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIGZpbGUgYXJndW1lbnQgZGlyZWN0cyB3aGVyZSB0aGUgdHJhY2ViYWNrIGlzCisgICAgICAgIHNlbnQ7IGl0IGRlZmF1bHRzIHRvIHN5cy5zdGRlcnIuCisgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgbGluZWNhY2hlLCB0cmFjZWJhY2sKKyAgICAgICAgaWYgc2VsZi5zcmMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaW5lY2FjaGUuY2FjaGVbZHVtbXlfc3JjX25hbWVdID0gKGxlbihzZWxmLnNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3JjLnNwbGl0KCJcbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1teV9zcmNfbmFtZSkKKyAgICAgICAgIyBlbHNlIHRoZSBzb3VyY2UgaXMgYWxyZWFkeSBzdG9yZWQgc29tZXdoZXJlIGVsc2UKKworICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKGZpbGU9ZmlsZSkKKworICAgIGRlZiB0aW1laXQoc2VsZiwgbnVtYmVyPWRlZmF1bHRfbnVtYmVyKToKKyAgICAgICAgIiIiVGltZSAnbnVtYmVyJyBleGVjdXRpb25zIG9mIHRoZSBtYWluIHN0YXRlbWVudC4KKworICAgICAgICBUbyBiZSBwcmVjaXNlLCB0aGlzIGV4ZWN1dGVzIHRoZSBzZXR1cCBzdGF0ZW1lbnQgb25jZSwgYW5kCisgICAgICAgIHRoZW4gcmV0dXJucyB0aGUgdGltZSBpdCB0YWtlcyB0byBleGVjdXRlIHRoZSBtYWluIHN0YXRlbWVudAorICAgICAgICBhIG51bWJlciBvZiB0aW1lcywgYXMgYSBmbG9hdCBtZWFzdXJlZCBpbiBzZWNvbmRzLiAgVGhlCisgICAgICAgIGFyZ3VtZW50IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhyb3VnaCB0aGUgbG9vcCwgZGVmYXVsdGluZworICAgICAgICB0byBvbmUgbWlsbGlvbi4gIFRoZSBtYWluIHN0YXRlbWVudCwgdGhlIHNldHVwIHN0YXRlbWVudCBhbmQKKyAgICAgICAgdGhlIHRpbWVyIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYXJlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCisgICAgICAgICIiIgorICAgICAgICBpZiBpdGVydG9vbHM6CisgICAgICAgICAgICBpdCA9IGl0ZXJ0b29scy5yZXBlYXQoTm9uZSwgbnVtYmVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaXQgPSBbTm9uZV0gKiBudW1iZXIKKyAgICAgICAgZ2NvbGQgPSBnYy5pc2VuYWJsZWQoKQorICAgICAgICBnYy5kaXNhYmxlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGltaW5nID0gc2VsZi5pbm5lcihpdCwgc2VsZi50aW1lcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGdjb2xkOgorICAgICAgICAgICAgICAgIGdjLmVuYWJsZSgpCisgICAgICAgIHJldHVybiB0aW1pbmcKKworICAgIGRlZiByZXBlYXQoc2VsZiwgcmVwZWF0PWRlZmF1bHRfcmVwZWF0LCBudW1iZXI9ZGVmYXVsdF9udW1iZXIpOgorICAgICAgICAiIiJDYWxsIHRpbWVpdCgpIGEgZmV3IHRpbWVzLgorCisgICAgICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSB0aW1laXQoKQorICAgICAgICByZXBlYXRlZGx5LCByZXR1cm5pbmcgYSBsaXN0IG9mIHJlc3VsdHMuICBUaGUgZmlyc3QgYXJndW1lbnQKKyAgICAgICAgc3BlY2lmaWVzIGhvdyBtYW55IHRpbWVzIHRvIGNhbGwgdGltZWl0KCksIGRlZmF1bHRpbmcgdG8gMzsKKyAgICAgICAgdGhlIHNlY29uZCBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHRpbWVyIGFyZ3VtZW50LCBkZWZhdWx0aW5nCisgICAgICAgIHRvIG9uZSBtaWxsaW9uLgorCisgICAgICAgIE5vdGU6IGl0J3MgdGVtcHRpbmcgdG8gY2FsY3VsYXRlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbgorICAgICAgICBmcm9tIHRoZSByZXN1bHQgdmVjdG9yIGFuZCByZXBvcnQgdGhlc2UuICBIb3dldmVyLCB0aGlzIGlzIG5vdAorICAgICAgICB2ZXJ5IHVzZWZ1bC4gIEluIGEgdHlwaWNhbCBjYXNlLCB0aGUgbG93ZXN0IHZhbHVlIGdpdmVzIGEKKyAgICAgICAgbG93ZXIgYm91bmQgZm9yIGhvdyBmYXN0IHlvdXIgbWFjaGluZSBjYW4gcnVuIHRoZSBnaXZlbiBjb2RlCisgICAgICAgIHNuaXBwZXQ7IGhpZ2hlciB2YWx1ZXMgaW4gdGhlIHJlc3VsdCB2ZWN0b3IgYXJlIHR5cGljYWxseSBub3QKKyAgICAgICAgY2F1c2VkIGJ5IHZhcmlhYmlsaXR5IGluIFB5dGhvbidzIHNwZWVkLCBidXQgYnkgb3RoZXIKKyAgICAgICAgcHJvY2Vzc2VzIGludGVyZmVyaW5nIHdpdGggeW91ciB0aW1pbmcgYWNjdXJhY3kuICBTbyB0aGUgbWluKCkKKyAgICAgICAgb2YgdGhlIHJlc3VsdCBpcyBwcm9iYWJseSB0aGUgb25seSBudW1iZXIgeW91IHNob3VsZCBiZQorICAgICAgICBpbnRlcmVzdGVkIGluLiAgQWZ0ZXIgdGhhdCwgeW91IHNob3VsZCBsb29rIGF0IHRoZSBlbnRpcmUKKyAgICAgICAgdmVjdG9yIGFuZCBhcHBseSBjb21tb24gc2Vuc2UgcmF0aGVyIHRoYW4gc3RhdGlzdGljcy4KKyAgICAgICAgIiIiCisgICAgICAgIHIgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZShyZXBlYXQpOgorICAgICAgICAgICAgdCA9IHNlbGYudGltZWl0KG51bWJlcikKKyAgICAgICAgICAgIHIuYXBwZW5kKHQpCisgICAgICAgIHJldHVybiByCisKK2RlZiB0aW1laXQoc3RtdD0icGFzcyIsIHNldHVwPSJwYXNzIiwgdGltZXI9ZGVmYXVsdF90aW1lciwKKyAgICAgICAgICAgbnVtYmVyPWRlZmF1bHRfbnVtYmVyKToKKyAgICAiIiJDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgVGltZXIgb2JqZWN0IGFuZCBjYWxsIHRpbWVpdCBtZXRob2QuIiIiCisgICAgcmV0dXJuIFRpbWVyKHN0bXQsIHNldHVwLCB0aW1lcikudGltZWl0KG51bWJlcikKKworZGVmIHJlcGVhdChzdG10PSJwYXNzIiwgc2V0dXA9InBhc3MiLCB0aW1lcj1kZWZhdWx0X3RpbWVyLAorICAgICAgICAgICByZXBlYXQ9ZGVmYXVsdF9yZXBlYXQsIG51bWJlcj1kZWZhdWx0X251bWJlcik6CisgICAgIiIiQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIFRpbWVyIG9iamVjdCBhbmQgY2FsbCByZXBlYXQgbWV0aG9kLiIiIgorICAgIHJldHVybiBUaW1lcihzdG10LCBzZXR1cCwgdGltZXIpLnJlcGVhdChyZXBlYXQsIG51bWJlcikKKworZGVmIG1haW4oYXJncz1Ob25lKToKKyAgICAiIiJNYWluIHByb2dyYW0sIHVzZWQgd2hlbiBydW4gYXMgYSBzY3JpcHQuCisKKyAgICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBjb21tYW5kIGxpbmUgdG8gYmUgcGFyc2VkLAorICAgIGRlZmF1bHRpbmcgdG8gc3lzLmFyZ3ZbMTpdLgorCisgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBleGl0IGNvZGUgdG8gYmUgcGFzc2VkIHRvIHN5cy5leGl0KCk7IGl0CisgICAgbWF5IGJlIE5vbmUgdG8gaW5kaWNhdGUgc3VjY2Vzcy4KKworICAgIFdoZW4gYW4gZXhjZXB0aW9uIGhhcHBlbnMgZHVyaW5nIHRpbWluZywgYSB0cmFjZWJhY2sgaXMgcHJpbnRlZCB0bworICAgIHN0ZGVyciBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyAxLiAgRXhjZXB0aW9ucyBhdCBvdGhlciB0aW1lcworICAgIChpbmNsdWRpbmcgdGhlIHRlbXBsYXRlIGNvbXBpbGF0aW9uKSBhcmUgbm90IGNhdWdodC4KKyAgICAiIiIKKyAgICBpZiBhcmdzIGlzIE5vbmU6CisgICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKyAgICBpbXBvcnQgZ2V0b3B0CisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmdzLCAibjpzOnI6dGN2aCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsibnVtYmVyPSIsICJzZXR1cD0iLCAicmVwZWF0PSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZSIsICJjbG9jayIsICJ2ZXJib3NlIiwgImhlbHAiXSkKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBlcnI6CisgICAgICAgIHByaW50IGVycgorICAgICAgICBwcmludCAidXNlIC1oLy0taGVscCBmb3IgY29tbWFuZCBsaW5lIGhlbHAiCisgICAgICAgIHJldHVybiAyCisgICAgdGltZXIgPSBkZWZhdWx0X3RpbWVyCisgICAgc3RtdCA9ICJcbiIuam9pbihhcmdzKSBvciAicGFzcyIKKyAgICBudW1iZXIgPSAwICMgYXV0by1kZXRlcm1pbmUKKyAgICBzZXR1cCA9IFtdCisgICAgcmVwZWF0ID0gZGVmYXVsdF9yZXBlYXQKKyAgICB2ZXJib3NlID0gMAorICAgIHByZWNpc2lvbiA9IDMKKyAgICBmb3IgbywgYSBpbiBvcHRzOgorICAgICAgICBpZiBvIGluICgiLW4iLCAiLS1udW1iZXIiKToKKyAgICAgICAgICAgIG51bWJlciA9IGludChhKQorICAgICAgICBpZiBvIGluICgiLXMiLCAiLS1zZXR1cCIpOgorICAgICAgICAgICAgc2V0dXAuYXBwZW5kKGEpCisgICAgICAgIGlmIG8gaW4gKCItciIsICItLXJlcGVhdCIpOgorICAgICAgICAgICAgcmVwZWF0ID0gaW50KGEpCisgICAgICAgICAgICBpZiByZXBlYXQgPD0gMDoKKyAgICAgICAgICAgICAgICByZXBlYXQgPSAxCisgICAgICAgIGlmIG8gaW4gKCItdCIsICItLXRpbWUiKToKKyAgICAgICAgICAgIHRpbWVyID0gdGltZS50aW1lCisgICAgICAgIGlmIG8gaW4gKCItYyIsICItLWNsb2NrIik6CisgICAgICAgICAgICB0aW1lciA9IHRpbWUuY2xvY2sKKyAgICAgICAgaWYgbyBpbiAoIi12IiwgIi0tdmVyYm9zZSIpOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmVjaXNpb24gKz0gMQorICAgICAgICAgICAgdmVyYm9zZSArPSAxCisgICAgICAgIGlmIG8gaW4gKCItaCIsICItLWhlbHAiKToKKyAgICAgICAgICAgIHByaW50IF9fZG9jX18sCisgICAgICAgICAgICByZXR1cm4gMAorICAgIHNldHVwID0gIlxuIi5qb2luKHNldHVwKSBvciAicGFzcyIKKyAgICAjIEluY2x1ZGUgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBzbyB0aGF0IGxvY2FsIGltcG9ydHMgd29yayAoc3lzLnBhdGgKKyAgICAjIGNvbnRhaW5zIHRoZSBkaXJlY3Rvcnkgb2YgdGhpcyBzY3JpcHQsIHJhdGhlciB0aGFuIHRoZSBjdXJyZW50CisgICAgIyBkaXJlY3RvcnkpCisgICAgaW1wb3J0IG9zCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKKyAgICB0ID0gVGltZXIoc3RtdCwgc2V0dXAsIHRpbWVyKQorICAgIGlmIG51bWJlciA9PSAwOgorICAgICAgICAjIGRldGVybWluZSBudW1iZXIgc28gdGhhdCAwLjIgPD0gdG90YWwgdGltZSA8IDIuMAorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCAxMCk6CisgICAgICAgICAgICBudW1iZXIgPSAxMCoqaQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHggPSB0LnRpbWVpdChudW1iZXIpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgdC5wcmludF9leGMoKQorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICIlZCBsb29wcyAtPiAlLipnIHNlY3MiICUgKG51bWJlciwgcHJlY2lzaW9uLCB4KQorICAgICAgICAgICAgaWYgeCA+PSAwLjI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICB0cnk6CisgICAgICAgIHIgPSB0LnJlcGVhdChyZXBlYXQsIG51bWJlcikKKyAgICBleGNlcHQ6CisgICAgICAgIHQucHJpbnRfZXhjKCkKKyAgICAgICAgcmV0dXJuIDEKKyAgICBiZXN0ID0gbWluKHIpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgInJhdyB0aW1lczoiLCAiICIuam9pbihbIiUuKmciICUgKHByZWNpc2lvbiwgeCkgZm9yIHggaW4gcl0pCisgICAgcHJpbnQgIiVkIGxvb3BzLCIgJSBudW1iZXIsCisgICAgdXNlYyA9IGJlc3QgKiAxZTYgLyBudW1iZXIKKyAgICBpZiB1c2VjIDwgMTAwMDoKKyAgICAgICAgcHJpbnQgImJlc3Qgb2YgJWQ6ICUuKmcgdXNlYyBwZXIgbG9vcCIgJSAocmVwZWF0LCBwcmVjaXNpb24sIHVzZWMpCisgICAgZWxzZToKKyAgICAgICAgbXNlYyA9IHVzZWMgLyAxMDAwCisgICAgICAgIGlmIG1zZWMgPCAxMDAwOgorICAgICAgICAgICAgcHJpbnQgImJlc3Qgb2YgJWQ6ICUuKmcgbXNlYyBwZXIgbG9vcCIgJSAocmVwZWF0LCBwcmVjaXNpb24sIG1zZWMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWMgPSBtc2VjIC8gMTAwMAorICAgICAgICAgICAgcHJpbnQgImJlc3Qgb2YgJWQ6ICUuKmcgc2VjIHBlciBsb29wIiAlIChyZXBlYXQsIHByZWNpc2lvbiwgc2VjKQorICAgIHJldHVybiBOb25lCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90aW1laXQucHljIGIvbGliL3B5dGhvbjIuNy90aW1laXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzYzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RpbWVpdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90aW1laXQucHlvIGIvbGliL3B5dGhvbjIuNy90aW1laXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzYzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RpbWVpdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90b2FpZmYucHkgYi9saWIvcHl0aG9uMi43L3RvYWlmZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTJiODBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90b2FpZmYucHkKQEAgLTAsMCArMSwxMTAgQEAKKyIiIkNvbnZlcnQgImFyYml0cmFyeSIgc291bmQgZmlsZXMgdG8gQUlGRiAoQXBwbGUgYW5kIFNHSSdzIGF1ZGlvIGZvcm1hdCkuCisKK0lucHV0IG1heSBiZSBjb21wcmVzc2VkLgorVW5jb21wcmVzc2VkIGZpbGUgdHlwZSBtYXkgYmUgQUlGRiwgV0FWLCBWT0MsIDhTVlgsIE5lWFQvU3VuLCBhbmQgb3RoZXJzLgorQW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpZiB0aGUgZmlsZSBpcyBub3Qgb2YgYSByZWNvZ25pemVkIHR5cGUuCitSZXR1cm5lZCBmaWxlbmFtZSBpcyBlaXRoZXIgdGhlIGlucHV0IGZpbGVuYW1lIG9yIGEgdGVtcG9yYXJ5IGZpbGVuYW1lOworaW4gdGhlIGxhdHRlciBjYXNlIHRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBpdCBpcyByZW1vdmVkLgorT3RoZXIgdGVtcG9yYXJ5IGZpbGVzIHVzZWQgYXJlIHJlbW92ZWQgYnkgdGhlIGZ1bmN0aW9uLgorIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSB0b2FpZmYgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCIsIHN0YWNrbGV2ZWw9MikKK2RlbCB3YXJucHkzaworCitpbXBvcnQgb3MKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHBpcGVzCitpbXBvcnQgc25kaGRyCisKK19fYWxsX18gPSBbImVycm9yIiwgInRvYWlmZiJdCisKK3RhYmxlID0ge30KKwordCA9IHBpcGVzLlRlbXBsYXRlKCkKK3QuYXBwZW5kKCdzb3ggLXQgYXUgLSAtdCBhaWZmIC1yIDgwMDAgLScsICctLScpCit0YWJsZVsnYXUnXSA9IHQKKworIyBYWFggVGhlIGZvbGxvd2luZyBpcyBhY3R1YWxseSBzdWItb3B0aW1hbC4KKyMgWFhYIFRoZSBIQ09NIHNhbXBsaW5nIHJhdGUgY2FuIGJlIDIyaywgMjJrLzIsIDIyay8zIG9yIDIyay80LgorIyBYWFggV2UgbXVzdCBmb3JjZSB0aGUgb3V0cHV0IHNhbXBsaW5nIHJhdGUgZWxzZSB0aGUgU0dJIHdvbid0IHBsYXkKKyMgWFhYIGZpbGVzIHNhbXBsZWQgYXQgNS41ayBvciA3LjMzM2s7IGhvd2V2ZXIgdGhpcyBtZWFucyB0aGF0IGZpbGVzCisjIFhYWCBzYW1wbGVkIGF0IDExayBhcmUgdW5uZWNlc3NhcmlseSBleHBhbmRlZC4KKyMgWFhYIFNpbWlsYXIgY29tbWVudHMgYXBwbHkgdG8gc29tZSBvdGhlciBmaWxlIHR5cGVzLgordCA9IHBpcGVzLlRlbXBsYXRlKCkKK3QuYXBwZW5kKCdzb3ggLXQgaGNvbSAtIC10IGFpZmYgLXIgMjIwNTAgLScsICctLScpCit0YWJsZVsnaGNvbSddID0gdAorCit0ID0gcGlwZXMuVGVtcGxhdGUoKQordC5hcHBlbmQoJ3NveCAtdCB2b2MgLSAtdCBhaWZmIC1yIDExMDI1IC0nLCAnLS0nKQordGFibGVbJ3ZvYyddID0gdAorCit0ID0gcGlwZXMuVGVtcGxhdGUoKQordC5hcHBlbmQoJ3NveCAtdCB3YXYgLSAtdCBhaWZmIC0nLCAnLS0nKQordGFibGVbJ3dhdiddID0gdAorCit0ID0gcGlwZXMuVGVtcGxhdGUoKQordC5hcHBlbmQoJ3NveCAtdCA4c3Z4IC0gLXQgYWlmZiAtciAxNjAwMCAtJywgJy0tJykKK3RhYmxlWyc4c3Z4J10gPSB0CisKK3QgPSBwaXBlcy5UZW1wbGF0ZSgpCit0LmFwcGVuZCgnc294IC10IHNuZHQgLSAtdCBhaWZmIC1yIDE2MDAwIC0nLCAnLS0nKQordGFibGVbJ3NuZHQnXSA9IHQKKwordCA9IHBpcGVzLlRlbXBsYXRlKCkKK3QuYXBwZW5kKCdzb3ggLXQgc25kciAtIC10IGFpZmYgLXIgMTYwMDAgLScsICctLScpCit0YWJsZVsnc25kciddID0gdAorCit1bmNvbXByZXNzID0gcGlwZXMuVGVtcGxhdGUoKQordW5jb21wcmVzcy5hcHBlbmQoJ3VuY29tcHJlc3MnLCAnLS0nKQorCisKK2NsYXNzIGVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitkZWYgdG9haWZmKGZpbGVuYW1lKToKKyAgICB0ZW1wcyA9IFtdCisgICAgcmV0ID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgcmV0ID0gX3RvYWlmZihmaWxlbmFtZSwgdGVtcHMpCisgICAgZmluYWxseToKKyAgICAgICAgZm9yIHRlbXAgaW4gdGVtcHNbOl06CisgICAgICAgICAgICBpZiB0ZW1wICE9IHJldDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayh0ZW1wKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHRlbXBzLnJlbW92ZSh0ZW1wKQorICAgIHJldHVybiByZXQKKworZGVmIF90b2FpZmYoZmlsZW5hbWUsIHRlbXBzKToKKyAgICBpZiBmaWxlbmFtZVstMjpdID09ICcuWic6CisgICAgICAgIChmZCwgZm5hbWUpID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICB0ZW1wcy5hcHBlbmQoZm5hbWUpCisgICAgICAgIHN0cyA9IHVuY29tcHJlc3MuY29weShmaWxlbmFtZSwgZm5hbWUpCisgICAgICAgIGlmIHN0czoKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCBmaWxlbmFtZSArICc6IHVuY29tcHJlc3MgZmFpbGVkJworICAgIGVsc2U6CisgICAgICAgIGZuYW1lID0gZmlsZW5hbWUKKyAgICB0cnk6CisgICAgICAgIGZ0eXBlID0gc25kaGRyLndoYXRoZHIoZm5hbWUpCisgICAgICAgIGlmIGZ0eXBlOgorICAgICAgICAgICAgZnR5cGUgPSBmdHlwZVswXSAjIEFsbCB3ZSdyZSBpbnRlcmVzdGVkIGluCisgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgaWYgdHlwZShtc2cpID09IHR5cGUoKCkpIGFuZCBsZW4obXNnKSA9PSAyIGFuZCBcCisgICAgICAgICAgICAgICAgdHlwZShtc2dbMF0pID09IHR5cGUoMCkgYW5kIHR5cGUobXNnWzFdKSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgIG1zZyA9IG1zZ1sxXQorICAgICAgICBpZiB0eXBlKG1zZykgIT0gdHlwZSgnJyk6CisgICAgICAgICAgICBtc2cgPSByZXByKG1zZykKKyAgICAgICAgcmFpc2UgZXJyb3IsIGZpbGVuYW1lICsgJzogJyArIG1zZworICAgIGlmIGZ0eXBlID09ICdhaWZmJzoKKyAgICAgICAgcmV0dXJuIGZuYW1lCisgICAgaWYgZnR5cGUgaXMgTm9uZSBvciBub3QgZnR5cGUgaW4gdGFibGU6CisgICAgICAgIHJhaXNlIGVycm9yLCAnJXM6IHVuc3VwcG9ydGVkIGF1ZGlvIGZpbGUgdHlwZSAlcicgJSAoZmlsZW5hbWUsIGZ0eXBlKQorICAgIChmZCwgdGVtcCkgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICBvcy5jbG9zZShmZCkKKyAgICB0ZW1wcy5hcHBlbmQodGVtcCkKKyAgICBzdHMgPSB0YWJsZVtmdHlwZV0uY29weShmbmFtZSwgdGVtcCkKKyAgICBpZiBzdHM6CisgICAgICAgIHJhaXNlIGVycm9yLCBmaWxlbmFtZSArICc6IGNvbnZlcnNpb24gdG8gYWlmZiBmYWlsZWQnCisgICAgcmV0dXJuIHRlbXAKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdG9haWZmLnB5YyBiL2xpYi9weXRob24yLjcvdG9haWZmLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGYyZjJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90b2FpZmYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdG9haWZmLnB5byBiL2xpYi9weXRob24yLjcvdG9haWZmLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGYyZjJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90b2FpZmYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdG9rZW4ucHkgYi9saWIvcHl0aG9uMi43L3Rva2VuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0YWJmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rva2VuLnB5CkBAIC0wLDAgKzEsMTQyIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIlRva2VuIGNvbnN0YW50cyAoZnJvbSAidG9rZW4uaCIpLiIiIgorCisjICBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQ7IHBsZWFzZSBkb24ndCBtdWNrIGl0IHVwIQorIworIyAgVG8gdXBkYXRlIHRoZSBzeW1ib2xzIGluIHRoaXMgZmlsZSwgJ2NkJyB0byB0aGUgdG9wIGRpcmVjdG9yeSBvZgorIyAgdGhlIHB5dGhvbiBzb3VyY2UgdHJlZSBhZnRlciBidWlsZGluZyB0aGUgaW50ZXJwcmV0ZXIgYW5kIHJ1bjoKKyMKKyMgICAgLi9weXRob24gTGliL3Rva2VuLnB5CisKKyMtLXN0YXJ0IGNvbnN0YW50cy0tCitFTkRNQVJLRVIgPSAwCitOQU1FID0gMQorTlVNQkVSID0gMgorU1RSSU5HID0gMworTkVXTElORSA9IDQKK0lOREVOVCA9IDUKK0RFREVOVCA9IDYKK0xQQVIgPSA3CitSUEFSID0gOAorTFNRQiA9IDkKK1JTUUIgPSAxMAorQ09MT04gPSAxMQorQ09NTUEgPSAxMgorU0VNSSA9IDEzCitQTFVTID0gMTQKK01JTlVTID0gMTUKK1NUQVIgPSAxNgorU0xBU0ggPSAxNworVkJBUiA9IDE4CitBTVBFUiA9IDE5CitMRVNTID0gMjAKK0dSRUFURVIgPSAyMQorRVFVQUwgPSAyMgorRE9UID0gMjMKK1BFUkNFTlQgPSAyNAorQkFDS1FVT1RFID0gMjUKK0xCUkFDRSA9IDI2CitSQlJBQ0UgPSAyNworRVFFUVVBTCA9IDI4CitOT1RFUVVBTCA9IDI5CitMRVNTRVFVQUwgPSAzMAorR1JFQVRFUkVRVUFMID0gMzEKK1RJTERFID0gMzIKK0NJUkNVTUZMRVggPSAzMworTEVGVFNISUZUID0gMzQKK1JJR0hUU0hJRlQgPSAzNQorRE9VQkxFU1RBUiA9IDM2CitQTFVTRVFVQUwgPSAzNworTUlORVFVQUwgPSAzOAorU1RBUkVRVUFMID0gMzkKK1NMQVNIRVFVQUwgPSA0MAorUEVSQ0VOVEVRVUFMID0gNDEKK0FNUEVSRVFVQUwgPSA0MgorVkJBUkVRVUFMID0gNDMKK0NJUkNVTUZMRVhFUVVBTCA9IDQ0CitMRUZUU0hJRlRFUVVBTCA9IDQ1CitSSUdIVFNISUZURVFVQUwgPSA0NgorRE9VQkxFU1RBUkVRVUFMID0gNDcKK0RPVUJMRVNMQVNIID0gNDgKK0RPVUJMRVNMQVNIRVFVQUwgPSA0OQorQVQgPSA1MAorT1AgPSA1MQorRVJST1JUT0tFTiA9IDUyCitOX1RPS0VOUyA9IDUzCitOVF9PRkZTRVQgPSAyNTYKKyMtLWVuZCBjb25zdGFudHMtLQorCit0b2tfbmFtZSA9IHt9Citmb3IgX25hbWUsIF92YWx1ZSBpbiBnbG9iYWxzKCkuaXRlbXMoKToKKyAgICBpZiB0eXBlKF92YWx1ZSkgaXMgdHlwZSgwKToKKyAgICAgICAgdG9rX25hbWVbX3ZhbHVlXSA9IF9uYW1lCitkZWwgX25hbWUsIF92YWx1ZQorCisKK2RlZiBJU1RFUk1JTkFMKHgpOgorICAgIHJldHVybiB4IDwgTlRfT0ZGU0VUCisKK2RlZiBJU05PTlRFUk1JTkFMKHgpOgorICAgIHJldHVybiB4ID49IE5UX09GRlNFVAorCitkZWYgSVNFT0YoeCk6CisgICAgcmV0dXJuIHggPT0gRU5ETUFSS0VSCisKKworZGVmIG1haW4oKToKKyAgICBpbXBvcnQgcmUKKyAgICBpbXBvcnQgc3lzCisgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorICAgIGluRmlsZU5hbWUgPSBhcmdzIGFuZCBhcmdzWzBdIG9yICJJbmNsdWRlL3Rva2VuLmgiCisgICAgb3V0RmlsZU5hbWUgPSAiTGliL3Rva2VuLnB5IgorICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgIG91dEZpbGVOYW1lID0gYXJnc1sxXQorICAgIHRyeToKKyAgICAgICAgZnAgPSBvcGVuKGluRmlsZU5hbWUpCisgICAgZXhjZXB0IElPRXJyb3IsIGVycjoKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiSS9PIGVycm9yOiAlc1xuIiAlIHN0cihlcnIpKQorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGxpbmVzID0gZnAucmVhZCgpLnNwbGl0KCJcbiIpCisgICAgZnAuY2xvc2UoKQorICAgIHByb2cgPSByZS5jb21waWxlKAorICAgICAgICAiI2RlZmluZVsgXHRdWyBcdF0qKFtBLVowLTldW0EtWjAtOV9dKilbIFx0XVsgXHRdKihbMC05XVswLTldKikiLAorICAgICAgICByZS5JR05PUkVDQVNFKQorICAgIHRva2VucyA9IHt9CisgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgIG1hdGNoID0gcHJvZy5tYXRjaChsaW5lKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIG5hbWUsIHZhbCA9IG1hdGNoLmdyb3VwKDEsIDIpCisgICAgICAgICAgICB2YWwgPSBpbnQodmFsKQorICAgICAgICAgICAgdG9rZW5zW3ZhbF0gPSBuYW1lICAgICAgICAgICMgcmV2ZXJzZSBzbyB3ZSBjYW4gc29ydCB0aGVtLi4uCisgICAga2V5cyA9IHRva2Vucy5rZXlzKCkKKyAgICBrZXlzLnNvcnQoKQorICAgICMgbG9hZCB0aGUgb3V0cHV0IHNrZWxldG9uIGZyb20gdGhlIHRhcmdldDoKKyAgICB0cnk6CisgICAgICAgIGZwID0gb3BlbihvdXRGaWxlTmFtZSkKKyAgICBleGNlcHQgSU9FcnJvciwgZXJyOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJJL08gZXJyb3I6ICVzXG4iICUgc3RyKGVycikpCisgICAgICAgIHN5cy5leGl0KDIpCisgICAgZm9ybWF0ID0gZnAucmVhZCgpLnNwbGl0KCJcbiIpCisgICAgZnAuY2xvc2UoKQorICAgIHRyeToKKyAgICAgICAgc3RhcnQgPSBmb3JtYXQuaW5kZXgoIiMtLXN0YXJ0IGNvbnN0YW50cy0tIikgKyAxCisgICAgICAgIGVuZCA9IGZvcm1hdC5pbmRleCgiIy0tZW5kIGNvbnN0YW50cy0tIikKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgidGFyZ2V0IGRvZXMgbm90IGNvbnRhaW4gZm9ybWF0IG1hcmtlcnMiKQorICAgICAgICBzeXMuZXhpdCgzKQorICAgIGxpbmVzID0gW10KKyAgICBmb3IgdmFsIGluIGtleXM6CisgICAgICAgIGxpbmVzLmFwcGVuZCgiJXMgPSAlZCIgJSAodG9rZW5zW3ZhbF0sIHZhbCkpCisgICAgZm9ybWF0W3N0YXJ0OmVuZF0gPSBsaW5lcworICAgIHRyeToKKyAgICAgICAgZnAgPSBvcGVuKG91dEZpbGVOYW1lLCAndycpCisgICAgZXhjZXB0IElPRXJyb3IsIGVycjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiSS9PIGVycm9yOiAlc1xuIiAlIHN0cihlcnIpKQorICAgICAgICBzeXMuZXhpdCg0KQorICAgIGZwLndyaXRlKCJcbiIuam9pbihmb3JtYXQpKQorICAgIGZwLmNsb3NlKCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90b2tlbi5weWMgYi9saWIvcHl0aG9uMi43L3Rva2VuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQyM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90b2tlbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90b2tlbi5weW8gYi9saWIvcHl0aG9uMi43L3Rva2VuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQyM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90b2tlbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90b2tlbml6ZS5weSBiL2xpYi9weXRob24yLjcvdG9rZW5pemUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3YjA3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdG9rZW5pemUucHkKQEAgLTAsMCArMSw0MjYgQEAKKyIiIlRva2VuaXphdGlvbiBoZWxwIGZvciBQeXRob24gcHJvZ3JhbXMuCisKK2dlbmVyYXRlX3Rva2VucyhyZWFkbGluZSkgaXMgYSBnZW5lcmF0b3IgdGhhdCBicmVha3MgYSBzdHJlYW0gb2YKK3RleHQgaW50byBQeXRob24gdG9rZW5zLiAgSXQgYWNjZXB0cyBhIHJlYWRsaW5lLWxpa2UgbWV0aG9kIHdoaWNoIGlzIGNhbGxlZAorcmVwZWF0ZWRseSB0byBnZXQgdGhlIG5leHQgbGluZSBvZiBpbnB1dCAob3IgIiIgZm9yIEVPRikuICBJdCBnZW5lcmF0ZXMKKzUtdHVwbGVzIHdpdGggdGhlc2UgbWVtYmVyczoKKworICAgIHRoZSB0b2tlbiB0eXBlIChzZWUgdG9rZW4ucHkpCisgICAgdGhlIHRva2VuIChhIHN0cmluZykKKyAgICB0aGUgc3RhcnRpbmcgKHJvdywgY29sdW1uKSBpbmRpY2VzIG9mIHRoZSB0b2tlbiAoYSAyLXR1cGxlIG9mIGludHMpCisgICAgdGhlIGVuZGluZyAocm93LCBjb2x1bW4pIGluZGljZXMgb2YgdGhlIHRva2VuIChhIDItdHVwbGUgb2YgaW50cykKKyAgICB0aGUgb3JpZ2luYWwgbGluZSAoc3RyaW5nKQorCitJdCBpcyBkZXNpZ25lZCB0byBtYXRjaCB0aGUgd29ya2luZyBvZiB0aGUgUHl0aG9uIHRva2VuaXplciBleGFjdGx5LCBleGNlcHQKK3RoYXQgaXQgcHJvZHVjZXMgQ09NTUVOVCB0b2tlbnMgZm9yIGNvbW1lbnRzIGFuZCBnaXZlcyB0eXBlIE9QIGZvciBhbGwKK29wZXJhdG9ycworCitPbGRlciBlbnRyeSBwb2ludHMKKyAgICB0b2tlbml6ZV9sb29wKHJlYWRsaW5lLCB0b2tlbmVhdGVyKQorICAgIHRva2VuaXplKHJlYWRsaW5lLCB0b2tlbmVhdGVyPXByaW50dG9rZW4pCithcmUgdGhlIHNhbWUsIGV4Y2VwdCBpbnN0ZWFkIG9mIGdlbmVyYXRpbmcgdG9rZW5zLCB0b2tlbmVhdGVyIGlzIGEgY2FsbGJhY2sKK2Z1bmN0aW9uIHRvIHdoaWNoIHRoZSA1IGZpZWxkcyBkZXNjcmliZWQgYWJvdmUgYXJlIHBhc3NlZCBhcyA1IGFyZ3VtZW50cywKK2VhY2ggdGltZSBhIG5ldyB0b2tlbiBpcyBmb3VuZC4iIiIKKworX19hdXRob3JfXyA9ICdLYS1QaW5nIFllZSA8cGluZ0BsZncub3JnPicKK19fY3JlZGl0c19fID0gKCdHdlIsIEVTUiwgVGltIFBldGVycywgVGhvbWFzIFdvdXRlcnMsIEZyZWQgRHJha2UsICcKKyAgICAgICAgICAgICAgICdTa2lwIE1vbnRhbmFybywgUmF5bW9uZCBIZXR0aW5nZXInKQorCitpbXBvcnQgc3RyaW5nLCByZQorZnJvbSB0b2tlbiBpbXBvcnQgKgorCitpbXBvcnQgdG9rZW4KK19fYWxsX18gPSBbeCBmb3IgeCBpbiBkaXIodG9rZW4pIGlmIG5vdCB4LnN0YXJ0c3dpdGgoIl8iKV0KK19fYWxsX18gKz0gWyJDT01NRU5UIiwgInRva2VuaXplIiwgImdlbmVyYXRlX3Rva2VucyIsICJOTCIsICJ1bnRva2VuaXplIl0KK2RlbCB4CitkZWwgdG9rZW4KKworQ09NTUVOVCA9IE5fVE9LRU5TCit0b2tfbmFtZVtDT01NRU5UXSA9ICdDT01NRU5UJworTkwgPSBOX1RPS0VOUyArIDEKK3Rva19uYW1lW05MXSA9ICdOTCcKK05fVE9LRU5TICs9IDIKKworZGVmIGdyb3VwKCpjaG9pY2VzKTogcmV0dXJuICcoJyArICd8Jy5qb2luKGNob2ljZXMpICsgJyknCitkZWYgYW55KCpjaG9pY2VzKTogcmV0dXJuIGdyb3VwKCpjaG9pY2VzKSArICcqJworZGVmIG1heWJlKCpjaG9pY2VzKTogcmV0dXJuIGdyb3VwKCpjaG9pY2VzKSArICc/JworCitXaGl0ZXNwYWNlID0gcidbIFxmXHRdKicKK0NvbW1lbnQgPSByJyNbXlxyXG5dKicKK0lnbm9yZSA9IFdoaXRlc3BhY2UgKyBhbnkocidcXFxyP1xuJyArIFdoaXRlc3BhY2UpICsgbWF5YmUoQ29tbWVudCkKK05hbWUgPSByJ1thLXpBLVpfXVx3KicKKworSGV4bnVtYmVyID0gcicwW3hYXVtcZGEtZkEtRl0rW2xMXT8nCitPY3RudW1iZXIgPSByJygwW29PXVswLTddKyl8KDBbMC03XSopW2xMXT8nCitCaW5udW1iZXIgPSByJzBbYkJdWzAxXStbbExdPycKK0RlY251bWJlciA9IHInWzEtOV1cZCpbbExdPycKK0ludG51bWJlciA9IGdyb3VwKEhleG51bWJlciwgQmlubnVtYmVyLCBPY3RudW1iZXIsIERlY251bWJlcikKK0V4cG9uZW50ID0gcidbZUVdWy0rXT9cZCsnCitQb2ludGZsb2F0ID0gZ3JvdXAocidcZCtcLlxkKicsIHInXC5cZCsnKSArIG1heWJlKEV4cG9uZW50KQorRXhwZmxvYXQgPSByJ1xkKycgKyBFeHBvbmVudAorRmxvYXRudW1iZXIgPSBncm91cChQb2ludGZsb2F0LCBFeHBmbG9hdCkKK0ltYWdudW1iZXIgPSBncm91cChyJ1xkK1tqSl0nLCBGbG9hdG51bWJlciArIHInW2pKXScpCitOdW1iZXIgPSBncm91cChJbWFnbnVtYmVyLCBGbG9hdG51bWJlciwgSW50bnVtYmVyKQorCisjIFRhaWwgZW5kIG9mICcgc3RyaW5nLgorU2luZ2xlID0gciJbXidcXF0qKD86XFwuW14nXFxdKikqJyIKKyMgVGFpbCBlbmQgb2YgIiBzdHJpbmcuCitEb3VibGUgPSByJ1teIlxcXSooPzpcXC5bXiJcXF0qKSoiJworIyBUYWlsIGVuZCBvZiAnJycgc3RyaW5nLgorU2luZ2xlMyA9IHIiW14nXFxdKig/Oig/OlxcLnwnKD8hJycpKVteJ1xcXSopKicnJyIKKyMgVGFpbCBlbmQgb2YgIiIiIHN0cmluZy4KK0RvdWJsZTMgPSByJ1teIlxcXSooPzooPzpcXC58Iig/ISIiKSlbXiJcXF0qKSoiIiInCitUcmlwbGUgPSBncm91cCgiW3VVYkJdP1tyUl0/JycnIiwgJ1t1VWJCXT9bclJdPyIiIicpCisjIFNpbmdsZS1saW5lICcgb3IgIiBzdHJpbmcuCitTdHJpbmcgPSBncm91cChyIlt1VWJCXT9bclJdPydbXlxuJ1xcXSooPzpcXC5bXlxuJ1xcXSopKiciLAorICAgICAgICAgICAgICAgcidbdVViQl0/W3JSXT8iW15cbiJcXF0qKD86XFwuW15cbiJcXF0qKSoiJykKKworIyBCZWNhdXNlIG9mIGxlZnRtb3N0LXRoZW4tbG9uZ2VzdCBtYXRjaCBzZW1hbnRpY3MsIGJlIHN1cmUgdG8gcHV0IHRoZQorIyBsb25nZXN0IG9wZXJhdG9ycyBmaXJzdCAoZS5nLiwgaWYgPSBjYW1lIGJlZm9yZSA9PSwgPT0gd291bGQgZ2V0CisjIHJlY29nbml6ZWQgYXMgdHdvIGluc3RhbmNlcyBvZiA9KS4KK09wZXJhdG9yID0gZ3JvdXAociJcKlwqPT8iLCByIj4+PT8iLCByIjw8PT8iLCByIjw+IiwgciIhPSIsCisgICAgICAgICAgICAgICAgIHIiLy89PyIsCisgICAgICAgICAgICAgICAgIHIiWytcLSovJSZ8Xj08Pl09PyIsCisgICAgICAgICAgICAgICAgIHIifiIpCisKK0JyYWNrZXQgPSAnW11bKCl7fV0nCitTcGVjaWFsID0gZ3JvdXAocidccj9cbicsIHInWzo7LixgQF0nKQorRnVubnkgPSBncm91cChPcGVyYXRvciwgQnJhY2tldCwgU3BlY2lhbCkKKworUGxhaW5Ub2tlbiA9IGdyb3VwKE51bWJlciwgRnVubnksIFN0cmluZywgTmFtZSkKK1Rva2VuID0gSWdub3JlICsgUGxhaW5Ub2tlbgorCisjIEZpcnN0IChvciBvbmx5KSBsaW5lIG9mICcgb3IgIiBzdHJpbmcuCitDb250U3RyID0gZ3JvdXAociJbdVViQl0/W3JSXT8nW15cbidcXF0qKD86XFwuW15cbidcXF0qKSoiICsKKyAgICAgICAgICAgICAgICBncm91cCgiJyIsIHInXFxccj9cbicpLAorICAgICAgICAgICAgICAgIHInW3VVYkJdP1tyUl0/IlteXG4iXFxdKig/OlxcLlteXG4iXFxdKikqJyArCisgICAgICAgICAgICAgICAgZ3JvdXAoJyInLCByJ1xcXHI/XG4nKSkKK1BzZXVkb0V4dHJhcyA9IGdyb3VwKHInXFxccj9cbnxcWicsIENvbW1lbnQsIFRyaXBsZSkKK1BzZXVkb1Rva2VuID0gV2hpdGVzcGFjZSArIGdyb3VwKFBzZXVkb0V4dHJhcywgTnVtYmVyLCBGdW5ueSwgQ29udFN0ciwgTmFtZSkKKwordG9rZW5wcm9nLCBwc2V1ZG9wcm9nLCBzaW5nbGUzcHJvZywgZG91YmxlM3Byb2cgPSBtYXAoCisgICAgcmUuY29tcGlsZSwgKFRva2VuLCBQc2V1ZG9Ub2tlbiwgU2luZ2xlMywgRG91YmxlMykpCitlbmRwcm9ncyA9IHsiJyI6IHJlLmNvbXBpbGUoU2luZ2xlKSwgJyInOiByZS5jb21waWxlKERvdWJsZSksCisgICAgICAgICAgICAiJycnIjogc2luZ2xlM3Byb2csICciIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJyJycnIjogc2luZ2xlM3Byb2csICdyIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAidScnJyI6IHNpbmdsZTNwcm9nLCAndSIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgInVyJycnIjogc2luZ2xlM3Byb2csICd1ciIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgIlInJyciOiBzaW5nbGUzcHJvZywgJ1IiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJVJycnIjogc2luZ2xlM3Byb2csICdVIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAidVInJyciOiBzaW5nbGUzcHJvZywgJ3VSIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiVXInJyciOiBzaW5nbGUzcHJvZywgJ1VyIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiVVInJyciOiBzaW5nbGUzcHJvZywgJ1VSIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiYicnJyI6IHNpbmdsZTNwcm9nLCAnYiIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgImJyJycnIjogc2luZ2xlM3Byb2csICdiciIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgIkInJyciOiBzaW5nbGUzcHJvZywgJ0IiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJiUicnJyI6IHNpbmdsZTNwcm9nLCAnYlIiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJCcicnJyI6IHNpbmdsZTNwcm9nLCAnQnIiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJCUicnJyI6IHNpbmdsZTNwcm9nLCAnQlIiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICdyJzogTm9uZSwgJ1InOiBOb25lLCAndSc6IE5vbmUsICdVJzogTm9uZSwKKyAgICAgICAgICAgICdiJzogTm9uZSwgJ0InOiBOb25lfQorCit0cmlwbGVfcXVvdGVkID0ge30KK2ZvciB0IGluICgiJycnIiwgJyIiIicsCisgICAgICAgICAgInInJyciLCAnciIiIicsICJSJycnIiwgJ1IiIiInLAorICAgICAgICAgICJ1JycnIiwgJ3UiIiInLCAiVScnJyIsICdVIiIiJywKKyAgICAgICAgICAidXInJyciLCAndXIiIiInLCAiVXInJyciLCAnVXIiIiInLAorICAgICAgICAgICJ1UicnJyIsICd1UiIiIicsICJVUicnJyIsICdVUiIiIicsCisgICAgICAgICAgImInJyciLCAnYiIiIicsICJCJycnIiwgJ0IiIiInLAorICAgICAgICAgICJicicnJyIsICdiciIiIicsICJCcicnJyIsICdCciIiIicsCisgICAgICAgICAgImJSJycnIiwgJ2JSIiIiJywgIkJSJycnIiwgJ0JSIiIiJyk6CisgICAgdHJpcGxlX3F1b3RlZFt0XSA9IHQKK3NpbmdsZV9xdW90ZWQgPSB7fQorZm9yIHQgaW4gKCInIiwgJyInLAorICAgICAgICAgICJyJyIsICdyIicsICJSJyIsICdSIicsCisgICAgICAgICAgInUnIiwgJ3UiJywgIlUnIiwgJ1UiJywKKyAgICAgICAgICAidXInIiwgJ3VyIicsICJVciciLCAnVXIiJywKKyAgICAgICAgICAidVInIiwgJ3VSIicsICJVUiciLCAnVVIiJywKKyAgICAgICAgICAiYiciLCAnYiInLCAiQiciLCAnQiInLAorICAgICAgICAgICJiciciLCAnYnIiJywgIkJyJyIsICdCciInLAorICAgICAgICAgICJiUiciLCAnYlIiJywgIkJSJyIsICdCUiInICk6CisgICAgc2luZ2xlX3F1b3RlZFt0XSA9IHQKKwordGFic2l6ZSA9IDgKKworY2xhc3MgVG9rZW5FcnJvcihFeGNlcHRpb24pOiBwYXNzCisKK2NsYXNzIFN0b3BUb2tlbml6aW5nKEV4Y2VwdGlvbik6IHBhc3MKKworZGVmIHByaW50dG9rZW4odHlwZSwgdG9rZW4sIHNyb3dfc2NvbCwgZXJvd19lY29sLCBsaW5lKTogIyBmb3IgdGVzdGluZworICAgIHNyb3csIHNjb2wgPSBzcm93X3Njb2wKKyAgICBlcm93LCBlY29sID0gZXJvd19lY29sCisgICAgcHJpbnQgIiVkLCVkLSVkLCVkOlx0JXNcdCVzIiAlIFwKKyAgICAgICAgKHNyb3csIHNjb2wsIGVyb3csIGVjb2wsIHRva19uYW1lW3R5cGVdLCByZXByKHRva2VuKSkKKworZGVmIHRva2VuaXplKHJlYWRsaW5lLCB0b2tlbmVhdGVyPXByaW50dG9rZW4pOgorICAgICIiIgorICAgIFRoZSB0b2tlbml6ZSgpIGZ1bmN0aW9uIGFjY2VwdHMgdHdvIHBhcmFtZXRlcnM6IG9uZSByZXByZXNlbnRpbmcgdGhlCisgICAgaW5wdXQgc3RyZWFtLCBhbmQgb25lIHByb3ZpZGluZyBhbiBvdXRwdXQgbWVjaGFuaXNtIGZvciB0b2tlbml6ZSgpLgorCisgICAgVGhlIGZpcnN0IHBhcmFtZXRlciwgcmVhZGxpbmUsIG11c3QgYmUgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcHJvdmlkZXMKKyAgICB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgdGhlIHJlYWRsaW5lKCkgbWV0aG9kIG9mIGJ1aWx0LWluIGZpbGUgb2JqZWN0cy4KKyAgICBFYWNoIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gb25lIGxpbmUgb2YgaW5wdXQgYXMgYSBzdHJpbmcuCisKKyAgICBUaGUgc2Vjb25kIHBhcmFtZXRlciwgdG9rZW5lYXRlciwgbXVzdCBhbHNvIGJlIGEgY2FsbGFibGUgb2JqZWN0LiBJdCBpcworICAgIGNhbGxlZCBvbmNlIGZvciBlYWNoIHRva2VuLCB3aXRoIGZpdmUgYXJndW1lbnRzLCBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgIHR1cGxlcyBnZW5lcmF0ZWQgYnkgZ2VuZXJhdGVfdG9rZW5zKCkuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICB0b2tlbml6ZV9sb29wKHJlYWRsaW5lLCB0b2tlbmVhdGVyKQorICAgIGV4Y2VwdCBTdG9wVG9rZW5pemluZzoKKyAgICAgICAgcGFzcworCisjIGJhY2t3YXJkcyBjb21wYXRpYmxlIGludGVyZmFjZQorZGVmIHRva2VuaXplX2xvb3AocmVhZGxpbmUsIHRva2VuZWF0ZXIpOgorICAgIGZvciB0b2tlbl9pbmZvIGluIGdlbmVyYXRlX3Rva2VucyhyZWFkbGluZSk6CisgICAgICAgIHRva2VuZWF0ZXIoKnRva2VuX2luZm8pCisKK2NsYXNzIFVudG9rZW5pemVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnRva2VucyA9IFtdCisgICAgICAgIHNlbGYucHJldl9yb3cgPSAxCisgICAgICAgIHNlbGYucHJldl9jb2wgPSAwCisKKyAgICBkZWYgYWRkX3doaXRlc3BhY2Uoc2VsZiwgc3RhcnQpOgorICAgICAgICByb3csIGNvbCA9IHN0YXJ0CisgICAgICAgIGFzc2VydCByb3cgPD0gc2VsZi5wcmV2X3JvdworICAgICAgICBjb2xfb2Zmc2V0ID0gY29sIC0gc2VsZi5wcmV2X2NvbAorICAgICAgICBpZiBjb2xfb2Zmc2V0OgorICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKCIgIiAqIGNvbF9vZmZzZXQpCisKKyAgICBkZWYgdW50b2tlbml6ZShzZWxmLCBpdGVyYWJsZSk6CisgICAgICAgIGZvciB0IGluIGl0ZXJhYmxlOgorICAgICAgICAgICAgaWYgbGVuKHQpID09IDI6CisgICAgICAgICAgICAgICAgc2VsZi5jb21wYXQodCwgaXRlcmFibGUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRva190eXBlLCB0b2tlbiwgc3RhcnQsIGVuZCwgbGluZSA9IHQKKyAgICAgICAgICAgIHNlbGYuYWRkX3doaXRlc3BhY2Uoc3RhcnQpCisgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQodG9rZW4pCisgICAgICAgICAgICBzZWxmLnByZXZfcm93LCBzZWxmLnByZXZfY29sID0gZW5kCisgICAgICAgICAgICBpZiB0b2tfdHlwZSBpbiAoTkVXTElORSwgTkwpOgorICAgICAgICAgICAgICAgIHNlbGYucHJldl9yb3cgKz0gMQorICAgICAgICAgICAgICAgIHNlbGYucHJldl9jb2wgPSAwCisgICAgICAgIHJldHVybiAiIi5qb2luKHNlbGYudG9rZW5zKQorCisgICAgZGVmIGNvbXBhdChzZWxmLCB0b2tlbiwgaXRlcmFibGUpOgorICAgICAgICBzdGFydGxpbmUgPSBGYWxzZQorICAgICAgICBpbmRlbnRzID0gW10KKyAgICAgICAgdG9rc19hcHBlbmQgPSBzZWxmLnRva2Vucy5hcHBlbmQKKyAgICAgICAgdG9rbnVtLCB0b2t2YWwgPSB0b2tlbgorICAgICAgICBpZiB0b2tudW0gaW4gKE5BTUUsIE5VTUJFUik6CisgICAgICAgICAgICB0b2t2YWwgKz0gJyAnCisgICAgICAgIGlmIHRva251bSBpbiAoTkVXTElORSwgTkwpOgorICAgICAgICAgICAgc3RhcnRsaW5lID0gVHJ1ZQorICAgICAgICBwcmV2c3RyaW5nID0gRmFsc2UKKyAgICAgICAgZm9yIHRvayBpbiBpdGVyYWJsZToKKyAgICAgICAgICAgIHRva251bSwgdG9rdmFsID0gdG9rWzoyXQorCisgICAgICAgICAgICBpZiB0b2tudW0gaW4gKE5BTUUsIE5VTUJFUik6CisgICAgICAgICAgICAgICAgdG9rdmFsICs9ICcgJworCisgICAgICAgICAgICAjIEluc2VydCBhIHNwYWNlIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIHN0cmluZ3MKKyAgICAgICAgICAgIGlmIHRva251bSA9PSBTVFJJTkc6CisgICAgICAgICAgICAgICAgaWYgcHJldnN0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgdG9rdmFsID0gJyAnICsgdG9rdmFsCisgICAgICAgICAgICAgICAgcHJldnN0cmluZyA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJldnN0cmluZyA9IEZhbHNlCisKKyAgICAgICAgICAgIGlmIHRva251bSA9PSBJTkRFTlQ6CisgICAgICAgICAgICAgICAgaW5kZW50cy5hcHBlbmQodG9rdmFsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRva251bSA9PSBERURFTlQ6CisgICAgICAgICAgICAgICAgaW5kZW50cy5wb3AoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRva251bSBpbiAoTkVXTElORSwgTkwpOgorICAgICAgICAgICAgICAgIHN0YXJ0bGluZSA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgc3RhcnRsaW5lIGFuZCBpbmRlbnRzOgorICAgICAgICAgICAgICAgIHRva3NfYXBwZW5kKGluZGVudHNbLTFdKQorICAgICAgICAgICAgICAgIHN0YXJ0bGluZSA9IEZhbHNlCisgICAgICAgICAgICB0b2tzX2FwcGVuZCh0b2t2YWwpCisKK2RlZiB1bnRva2VuaXplKGl0ZXJhYmxlKToKKyAgICAiIiJUcmFuc2Zvcm0gdG9rZW5zIGJhY2sgaW50byBQeXRob24gc291cmNlIGNvZGUuCisKKyAgICBFYWNoIGVsZW1lbnQgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlIG11c3QgYmUgYSB0b2tlbiBzZXF1ZW5jZQorICAgIHdpdGggYXQgbGVhc3QgdHdvIGVsZW1lbnRzLCBhIHRva2VuIG51bWJlciBhbmQgdG9rZW4gdmFsdWUuICBJZgorICAgIG9ubHkgdHdvIHRva2VucyBhcmUgcGFzc2VkLCB0aGUgcmVzdWx0aW5nIG91dHB1dCBpcyBwb29yLgorCisgICAgUm91bmQtdHJpcCBpbnZhcmlhbnQgZm9yIGZ1bGwgaW5wdXQ6CisgICAgICAgIFVudG9rZW5pemVkIHNvdXJjZSB3aWxsIG1hdGNoIGlucHV0IHNvdXJjZSBleGFjdGx5CisKKyAgICBSb3VuZC10cmlwIGludmFyaWFudCBmb3IgbGltaXRlZCBpbnRwdXQ6CisgICAgICAgICMgT3V0cHV0IHRleHQgd2lsbCB0b2tlbml6ZSB0aGUgYmFjayB0byB0aGUgaW5wdXQKKyAgICAgICAgdDEgPSBbdG9rWzoyXSBmb3IgdG9rIGluIGdlbmVyYXRlX3Rva2VucyhmLnJlYWRsaW5lKV0KKyAgICAgICAgbmV3Y29kZSA9IHVudG9rZW5pemUodDEpCisgICAgICAgIHJlYWRsaW5lID0gaXRlcihuZXdjb2RlLnNwbGl0bGluZXMoMSkpLm5leHQKKyAgICAgICAgdDIgPSBbdG9rWzoyXSBmb3IgdG9rIGluIGdlbmVyYXRlX3Rva2VucyhyZWFkbGluZSldCisgICAgICAgIGFzc2VydCB0MSA9PSB0MgorICAgICIiIgorICAgIHV0ID0gVW50b2tlbml6ZXIoKQorICAgIHJldHVybiB1dC51bnRva2VuaXplKGl0ZXJhYmxlKQorCitkZWYgZ2VuZXJhdGVfdG9rZW5zKHJlYWRsaW5lKToKKyAgICAiIiIKKyAgICBUaGUgZ2VuZXJhdGVfdG9rZW5zKCkgZ2VuZXJhdG9yIHJlcXVpcmVzIG9uZSBhcmdtZW50LCByZWFkbGluZSwgd2hpY2gKKyAgICBtdXN0IGJlIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUKKyAgICByZWFkbGluZSgpIG1ldGhvZCBvZiBidWlsdC1pbiBmaWxlIG9iamVjdHMuIEVhY2ggY2FsbCB0byB0aGUgZnVuY3Rpb24KKyAgICBzaG91bGQgcmV0dXJuIG9uZSBsaW5lIG9mIGlucHV0IGFzIGEgc3RyaW5nLiAgQWx0ZXJuYXRlbHksIHJlYWRsaW5lCisgICAgY2FuIGJlIGEgY2FsbGFibGUgZnVuY3Rpb24gdGVybWluYXRpbmcgd2l0aCBTdG9wSXRlcmF0aW9uOgorICAgICAgICByZWFkbGluZSA9IG9wZW4obXlmaWxlKS5uZXh0ICAgICMgRXhhbXBsZSBvZiBhbHRlcm5hdGUgcmVhZGxpbmUKKworICAgIFRoZSBnZW5lcmF0b3IgcHJvZHVjZXMgNS10dXBsZXMgd2l0aCB0aGVzZSBtZW1iZXJzOiB0aGUgdG9rZW4gdHlwZTsgdGhlCisgICAgdG9rZW4gc3RyaW5nOyBhIDItdHVwbGUgKHNyb3csIHNjb2wpIG9mIGludHMgc3BlY2lmeWluZyB0aGUgcm93IGFuZAorICAgIGNvbHVtbiB3aGVyZSB0aGUgdG9rZW4gYmVnaW5zIGluIHRoZSBzb3VyY2U7IGEgMi10dXBsZSAoZXJvdywgZWNvbCkgb2YKKyAgICBpbnRzIHNwZWNpZnlpbmcgdGhlIHJvdyBhbmQgY29sdW1uIHdoZXJlIHRoZSB0b2tlbiBlbmRzIGluIHRoZSBzb3VyY2U7CisgICAgYW5kIHRoZSBsaW5lIG9uIHdoaWNoIHRoZSB0b2tlbiB3YXMgZm91bmQuIFRoZSBsaW5lIHBhc3NlZCBpcyB0aGUKKyAgICBsb2dpY2FsIGxpbmU7IGNvbnRpbnVhdGlvbiBsaW5lcyBhcmUgaW5jbHVkZWQuCisgICAgIiIiCisgICAgbG51bSA9IHBhcmVubGV2ID0gY29udGludWVkID0gMAorICAgIG5hbWVjaGFycywgbnVtY2hhcnMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArICdfJywgJzAxMjM0NTY3ODknCisgICAgY29udHN0ciwgbmVlZGNvbnQgPSAnJywgMAorICAgIGNvbnRsaW5lID0gTm9uZQorICAgIGluZGVudHMgPSBbMF0KKworICAgIHdoaWxlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvb3Agb3ZlciBsaW5lcyBpbiBzdHJlYW0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGluZSA9IHJlYWRsaW5lKCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBsaW5lID0gJycKKyAgICAgICAgbG51bSArPSAxCisgICAgICAgIHBvcywgbWF4ID0gMCwgbGVuKGxpbmUpCisKKyAgICAgICAgaWYgY29udHN0cjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb250aW51ZWQgc3RyaW5nCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICByYWlzZSBUb2tlbkVycm9yLCAoIkVPRiBpbiBtdWx0aS1saW5lIHN0cmluZyIsIHN0cnN0YXJ0KQorICAgICAgICAgICAgZW5kbWF0Y2ggPSBlbmRwcm9nLm1hdGNoKGxpbmUpCisgICAgICAgICAgICBpZiBlbmRtYXRjaDoKKyAgICAgICAgICAgICAgICBwb3MgPSBlbmQgPSBlbmRtYXRjaC5lbmQoMCkKKyAgICAgICAgICAgICAgICB5aWVsZCAoU1RSSU5HLCBjb250c3RyICsgbGluZVs6ZW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RhcnQsIChsbnVtLCBlbmQpLCBjb250bGluZSArIGxpbmUpCisgICAgICAgICAgICAgICAgY29udHN0ciwgbmVlZGNvbnQgPSAnJywgMAorICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gTm9uZQorICAgICAgICAgICAgZWxpZiBuZWVkY29udCBhbmQgbGluZVstMjpdICE9ICdcXFxuJyBhbmQgbGluZVstMzpdICE9ICdcXFxyXG4nOgorICAgICAgICAgICAgICAgIHlpZWxkIChFUlJPUlRPS0VOLCBjb250c3RyICsgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0LCAobG51bSwgbGVuKGxpbmUpKSwgY29udGxpbmUpCisgICAgICAgICAgICAgICAgY29udHN0ciA9ICcnCisgICAgICAgICAgICAgICAgY29udGxpbmUgPSBOb25lCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29udHN0ciA9IGNvbnRzdHIgKyBsaW5lCisgICAgICAgICAgICAgICAgY29udGxpbmUgPSBjb250bGluZSArIGxpbmUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGVsaWYgcGFyZW5sZXYgPT0gMCBhbmQgbm90IGNvbnRpbnVlZDogICMgbmV3IHN0YXRlbWVudAorICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgICAgICBjb2x1bW4gPSAwCisgICAgICAgICAgICB3aGlsZSBwb3MgPCBtYXg6ICAgICAgICAgICAgICAgICAgICMgbWVhc3VyZSBsZWFkaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgICAgICAgICBpZiBsaW5lW3Bvc10gPT0gJyAnOgorICAgICAgICAgICAgICAgICAgICBjb2x1bW4gKz0gMQorICAgICAgICAgICAgICAgIGVsaWYgbGluZVtwb3NdID09ICdcdCc6CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IChjb2x1bW4vL3RhYnNpemUgKyAxKSp0YWJzaXplCisgICAgICAgICAgICAgICAgZWxpZiBsaW5lW3Bvc10gPT0gJ1xmJzoKKyAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcG9zICs9IDEKKyAgICAgICAgICAgIGlmIHBvcyA9PSBtYXg6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgaWYgbGluZVtwb3NdIGluICcjXHJcbic6ICAgICAgICAgICAjIHNraXAgY29tbWVudHMgb3IgYmxhbmsgbGluZXMKKyAgICAgICAgICAgICAgICBpZiBsaW5lW3Bvc10gPT0gJyMnOgorICAgICAgICAgICAgICAgICAgICBjb21tZW50X3Rva2VuID0gbGluZVtwb3M6XS5yc3RyaXAoJ1xyXG4nKQorICAgICAgICAgICAgICAgICAgICBubF9wb3MgPSBwb3MgKyBsZW4oY29tbWVudF90b2tlbikKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKENPTU1FTlQsIGNvbW1lbnRfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG51bSwgcG9zKSwgKGxudW0sIHBvcyArIGxlbihjb21tZW50X3Rva2VuKSksIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIChOTCwgbGluZVtubF9wb3M6XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsbnVtLCBubF9wb3MpLCAobG51bSwgbGVuKGxpbmUpKSwgbGluZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoKE5MLCBDT01NRU5UKVtsaW5lW3Bvc10gPT0gJyMnXSwgbGluZVtwb3M6XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsbnVtLCBwb3MpLCAobG51bSwgbGVuKGxpbmUpKSwgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBjb2x1bW4gPiBpbmRlbnRzWy0xXTogICAgICAgICAgICMgY291bnQgaW5kZW50cyBvciBkZWRlbnRzCisgICAgICAgICAgICAgICAgaW5kZW50cy5hcHBlbmQoY29sdW1uKQorICAgICAgICAgICAgICAgIHlpZWxkIChJTkRFTlQsIGxpbmVbOnBvc10sIChsbnVtLCAwKSwgKGxudW0sIHBvcyksIGxpbmUpCisgICAgICAgICAgICB3aGlsZSBjb2x1bW4gPCBpbmRlbnRzWy0xXToKKyAgICAgICAgICAgICAgICBpZiBjb2x1bW4gbm90IGluIGluZGVudHM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluZGVudGF0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAidW5pbmRlbnQgZG9lcyBub3QgbWF0Y2ggYW55IG91dGVyIGluZGVudGF0aW9uIGxldmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiPHRva2VuaXplPiIsIGxudW0sIHBvcywgbGluZSkpCisgICAgICAgICAgICAgICAgaW5kZW50cyA9IGluZGVudHNbOi0xXQorICAgICAgICAgICAgICAgIHlpZWxkIChERURFTlQsICcnLCAobG51bSwgcG9zKSwgKGxudW0sIHBvcyksIGxpbmUpCisKKyAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb250aW51ZWQgc3RhdGVtZW50CisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICByYWlzZSBUb2tlbkVycm9yLCAoIkVPRiBpbiBtdWx0aS1saW5lIHN0YXRlbWVudCIsIChsbnVtLCAwKSkKKyAgICAgICAgICAgIGNvbnRpbnVlZCA9IDAKKworICAgICAgICB3aGlsZSBwb3MgPCBtYXg6CisgICAgICAgICAgICBwc2V1ZG9tYXRjaCA9IHBzZXVkb3Byb2cubWF0Y2gobGluZSwgcG9zKQorICAgICAgICAgICAgaWYgcHNldWRvbWF0Y2g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNjYW4gZm9yIHRva2VucworICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBwc2V1ZG9tYXRjaC5zcGFuKDEpCisgICAgICAgICAgICAgICAgc3BvcywgZXBvcywgcG9zID0gKGxudW0sIHN0YXJ0KSwgKGxudW0sIGVuZCksIGVuZAorICAgICAgICAgICAgICAgIGlmIHN0YXJ0ID09IGVuZDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB0b2tlbiwgaW5pdGlhbCA9IGxpbmVbc3RhcnQ6ZW5kXSwgbGluZVtzdGFydF0KKworICAgICAgICAgICAgICAgIGlmIGluaXRpYWwgaW4gbnVtY2hhcnMgb3IgXAorICAgICAgICAgICAgICAgICAgIChpbml0aWFsID09ICcuJyBhbmQgdG9rZW4gIT0gJy4nKTogICAgICAjIG9yZGluYXJ5IG51bWJlcgorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoTlVNQkVSLCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKyAgICAgICAgICAgICAgICBlbGlmIGluaXRpYWwgaW4gJ1xyXG4nOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoTkwgaWYgcGFyZW5sZXYgPiAwIGVsc2UgTkVXTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCA9PSAnIyc6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBub3QgdG9rZW4uZW5kc3dpdGgoIlxuIikKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKENPTU1FTlQsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorICAgICAgICAgICAgICAgIGVsaWYgdG9rZW4gaW4gdHJpcGxlX3F1b3RlZDoKKyAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IGVuZHByb2dzW3Rva2VuXQorICAgICAgICAgICAgICAgICAgICBlbmRtYXRjaCA9IGVuZHByb2cubWF0Y2gobGluZSwgcG9zKQorICAgICAgICAgICAgICAgICAgICBpZiBlbmRtYXRjaDogICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFsbCBvbiBvbmUgbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gZW5kbWF0Y2guZW5kKDApCisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxpbmVbc3RhcnQ6cG9zXQorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgKFNUUklORywgdG9rZW4sIHNwb3MsIChsbnVtLCBwb3MpLCBsaW5lKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RhcnQgPSAobG51bSwgc3RhcnQpICAgICAgICAgICAjIG11bHRpcGxlIGxpbmVzCisgICAgICAgICAgICAgICAgICAgICAgICBjb250c3RyID0gbGluZVtzdGFydDpdCisgICAgICAgICAgICAgICAgICAgICAgICBjb250bGluZSA9IGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsIGluIHNpbmdsZV9xdW90ZWQgb3IgXAorICAgICAgICAgICAgICAgICAgICB0b2tlbls6Ml0gaW4gc2luZ2xlX3F1b3RlZCBvciBcCisgICAgICAgICAgICAgICAgICAgIHRva2VuWzozXSBpbiBzaW5nbGVfcXVvdGVkOgorICAgICAgICAgICAgICAgICAgICBpZiB0b2tlblstMV0gPT0gJ1xuJzogICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlZCBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0ID0gKGxudW0sIHN0YXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZyA9IChlbmRwcm9nc1tpbml0aWFsXSBvciBlbmRwcm9nc1t0b2tlblsxXV0gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcHJvZ3NbdG9rZW5bMl1dKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udHN0ciwgbmVlZGNvbnQgPSBsaW5lW3N0YXJ0Ol0sIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcmRpbmFyeSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIChTVFJJTkcsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCBpbiBuYW1lY2hhcnM6ICAgICAgICAgICAgICAgICAjIG9yZGluYXJ5IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKE5BTUUsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCA9PSAnXFwnOiAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRpbnVlZCBzdG10CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlZCA9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBpbml0aWFsIGluICcoW3snOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW5sZXYgKz0gMQorICAgICAgICAgICAgICAgICAgICBlbGlmIGluaXRpYWwgaW4gJyldfSc6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbmxldiAtPSAxCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIChPUCwgdG9rZW4sIHNwb3MsIGVwb3MsIGxpbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIChFUlJPUlRPS0VOLCBsaW5lW3Bvc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG51bSwgcG9zKSwgKGxudW0sIHBvcysxKSwgbGluZSkKKyAgICAgICAgICAgICAgICBwb3MgKz0gMQorCisgICAgZm9yIGluZGVudCBpbiBpbmRlbnRzWzE6XTogICAgICAgICAgICAgICAgICMgcG9wIHJlbWFpbmluZyBpbmRlbnQgbGV2ZWxzCisgICAgICAgIHlpZWxkIChERURFTlQsICcnLCAobG51bSwgMCksIChsbnVtLCAwKSwgJycpCisgICAgeWllbGQgKEVORE1BUktFUiwgJycsIChsbnVtLCAwKSwgKGxudW0sIDApLCAnJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzogICAgICAgICAgICAgICAgICAgICAjIHRlc3RpbmcKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgbGVuKHN5cy5hcmd2KSA+IDE6CisgICAgICAgIHRva2VuaXplKG9wZW4oc3lzLmFyZ3ZbMV0pLnJlYWRsaW5lKQorICAgIGVsc2U6CisgICAgICAgIHRva2VuaXplKHN5cy5zdGRpbi5yZWFkbGluZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdG9rZW5pemUucHljIGIvbGliL3B5dGhvbjIuNy90b2tlbml6ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3MWU1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdG9rZW5pemUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdG9rZW5pemUucHlvIGIvbGliL3B5dGhvbjIuNy90b2tlbml6ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFiMGUxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdG9rZW5pemUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdHJhY2UucHkgYi9saWIvcHl0aG9uMi43L3RyYWNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YTEzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RyYWNlLnB5CkBAIC0wLDAgKzEsODE5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIyBwb3J0aW9ucyBjb3B5cmlnaHQgMjAwMSwgQXV0b25vbW91cyBab25lcyBJbmR1c3RyaWVzLCBJbmMuLCBhbGwgcmlnaHRzLi4uCisjIGVyci4uLiAgcmVzZXJ2ZWQgYW5kIG9mZmVyZWQgdG8gdGhlIHB1YmxpYyB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisjIFB5dGhvbiAyLjIgbGljZW5zZS4KKyMgQXV0aG9yOiBab29rbyBPJ1doaWVsYWNyb254CisjIGh0dHA6Ly96b29rby5jb20vCisjIG1haWx0bzp6b29rb0B6b29rby5jb20KKyMKKyMgQ29weXJpZ2h0IDIwMDAsIE1vamFtIE1lZGlhLCBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorIyBBdXRob3I6IFNraXAgTW9udGFuYXJvCisjCisjIENvcHlyaWdodCAxOTk5LCBCaW9yZWFzb24sIEluYy4sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIEF1dGhvcjogQW5kcmV3IERhbGtlCisjCisjIENvcHlyaWdodCAxOTk1LTE5OTcsIEF1dG9tYXRyaXgsIEluYy4sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIEF1dGhvcjogU2tpcCBNb250YW5hcm8KKyMKKyMgQ29weXJpZ2h0IDE5OTEtMTk5NSwgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaCBDZW50cnVtLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorIworIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIFB5dGhvbiBzb2Z0d2FyZSBhbmQKKyMgaXRzIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2Ugd2l0aG91dCBmZWUgaXMgaGVyZWJ5CisjIGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwgY29waWVzLAorIyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyMgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBuZWl0aGVyIEF1dG9tYXRyaXgsCisjIEJpb3JlYXNvbiBvciBNb2phbSBNZWRpYSBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCisjIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorIworIiIicHJvZ3JhbS9tb2R1bGUgdG8gdHJhY2UgUHl0aG9uIHByb2dyYW0gb3IgZnVuY3Rpb24gZXhlY3V0aW9uCisKK1NhbXBsZSB1c2UsIGNvbW1hbmQgbGluZToKKyAgdHJhY2UucHkgLWMgLWYgY291bnRzIC0taWdub3JlLWRpciAnJHByZWZpeCcgc3BhbS5weSBlZ2dzCisgIHRyYWNlLnB5IC10IC0taWdub3JlLWRpciAnJHByZWZpeCcgc3BhbS5weSBlZ2dzCisgIHRyYWNlLnB5IC0tdHJhY2tjYWxscyBzcGFtLnB5IGVnZ3MKKworU2FtcGxlIHVzZSwgcHJvZ3JhbW1hdGljYWxseQorICBpbXBvcnQgc3lzCisKKyAgIyBjcmVhdGUgYSBUcmFjZSBvYmplY3QsIHRlbGxpbmcgaXQgd2hhdCB0byBpZ25vcmUsIGFuZCB3aGV0aGVyIHRvCisgICMgZG8gdHJhY2luZyBvciBsaW5lLWNvdW50aW5nIG9yIGJvdGguCisgIHRyYWNlciA9IHRyYWNlLlRyYWNlKGlnbm9yZWRpcnM9W3N5cy5wcmVmaXgsIHN5cy5leGVjX3ByZWZpeCxdLCB0cmFjZT0wLAorICAgICAgICAgICAgICAgICAgICBjb3VudD0xKQorICAjIHJ1biB0aGUgbmV3IGNvbW1hbmQgdXNpbmcgdGhlIGdpdmVuIHRyYWNlcgorICB0cmFjZXIucnVuKCdtYWluKCknKQorICAjIG1ha2UgYSByZXBvcnQsIHBsYWNpbmcgb3V0cHV0IGluIC90bXAKKyAgciA9IHRyYWNlci5yZXN1bHRzKCkKKyAgci53cml0ZV9yZXN1bHRzKHNob3dfbWlzc2luZz1UcnVlLCBjb3ZlcmRpcj0iL3RtcCIpCisiIiIKKworaW1wb3J0IGxpbmVjYWNoZQoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgdG9rZW4KK2ltcG9ydCB0b2tlbml6ZQoraW1wb3J0IGluc3BlY3QKK2ltcG9ydCBnYworaW1wb3J0IGRpcwordHJ5OgorICAgIGltcG9ydCBjUGlja2xlCisgICAgcGlja2xlID0gY1BpY2tsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBwaWNrbGUKKwordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBfc2V0dHJhY2UgPSBzeXMuc2V0dHJhY2UKKworICAgIGRlZiBfdW5zZXR0cmFjZSgpOgorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKK2Vsc2U6CisgICAgZGVmIF9zZXR0cmFjZShmdW5jKToKKyAgICAgICAgdGhyZWFkaW5nLnNldHRyYWNlKGZ1bmMpCisgICAgICAgIHN5cy5zZXR0cmFjZShmdW5jKQorCisgICAgZGVmIF91bnNldHRyYWNlKCk6CisgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorICAgICAgICB0aHJlYWRpbmcuc2V0dHJhY2UoTm9uZSkKKworZGVmIHVzYWdlKG91dGZpbGUpOgorICAgIG91dGZpbGUud3JpdGUoIiIiVXNhZ2U6ICVzIFtPUFRJT05TXSA8ZmlsZT4gW0FSR1NdCisKK01ldGEtb3B0aW9uczoKKy0taGVscCAgICAgICAgICAgICAgICBEaXNwbGF5IHRoaXMgaGVscCB0aGVuIGV4aXQuCistLXZlcnNpb24gICAgICAgICAgICAgT3V0cHV0IHZlcnNpb24gaW5mb3JtYXRpb24gdGhlbiBleGl0LgorCitPdGhlcndpc2UsIGV4YWN0bHkgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhyZWUgb3B0aW9ucyBtdXN0IGJlIGdpdmVuOgorLXQsIC0tdHJhY2UgICAgICAgICAgIFByaW50IGVhY2ggbGluZSB0byBzeXMuc3Rkb3V0IGJlZm9yZSBpdCBpcyBleGVjdXRlZC4KKy1jLCAtLWNvdW50ICAgICAgICAgICBDb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggbGluZSBpcyBleGVjdXRlZAorICAgICAgICAgICAgICAgICAgICAgIGFuZCB3cml0ZSB0aGUgY291bnRzIHRvIDxtb2R1bGU+LmNvdmVyIGZvciBlYWNoCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlIGV4ZWN1dGVkLCBpbiB0aGUgbW9kdWxlJ3MgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgICAgIFNlZSBhbHNvIGAtLWNvdmVyZGlyJywgYC0tZmlsZScsIGAtLW5vLXJlcG9ydCcgYmVsb3cuCistbCwgLS1saXN0ZnVuY3MgICAgICAgS2VlcCB0cmFjayBvZiB3aGljaCBmdW5jdGlvbnMgYXJlIGV4ZWN1dGVkIGF0IGxlYXN0CisgICAgICAgICAgICAgICAgICAgICAgb25jZSBhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gc3lzLnN0ZG91dCBhZnRlciB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIGV4aXRzLgorLVQsIC0tdHJhY2tjYWxscyAgICAgIEtlZXAgdHJhY2sgb2YgY2FsbGVyL2NhbGxlZCBwYWlycyBhbmQgd3JpdGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyB0byBzeXMuc3Rkb3V0IGFmdGVyIHRoZSBwcm9ncmFtIGV4aXRzLgorLXIsIC0tcmVwb3J0ICAgICAgICAgIEdlbmVyYXRlIGEgcmVwb3J0IGZyb20gYSBjb3VudHMgZmlsZTsgZG8gbm90IGV4ZWN1dGUKKyAgICAgICAgICAgICAgICAgICAgICBhbnkgY29kZS4gIGAtLWZpbGUnIG11c3Qgc3BlY2lmeSB0aGUgcmVzdWx0cyBmaWxlIHRvCisgICAgICAgICAgICAgICAgICAgICAgcmVhZCwgd2hpY2ggbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCBpbiBhIHByZXZpb3VzIHJ1bgorICAgICAgICAgICAgICAgICAgICAgIHdpdGggYC0tY291bnQgLS1maWxlPUZJTEUnLgorCitNb2RpZmllcnM6CistZiwgLS1maWxlPTxmaWxlPiAgICAgRmlsZSB0byBhY2N1bXVsYXRlIGNvdW50cyBvdmVyIHNldmVyYWwgcnVucy4KKy1SLCAtLW5vLXJlcG9ydCAgICAgICBEbyBub3QgZ2VuZXJhdGUgdGhlIGNvdmVyYWdlIHJlcG9ydCBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgICBVc2VmdWwgaWYgeW91IHdhbnQgdG8gYWNjdW11bGF0ZSBvdmVyIHNldmVyYWwgcnVucy4KKy1DLCAtLWNvdmVyZGlyPTxkaXI+ICBEaXJlY3Rvcnkgd2hlcmUgdGhlIHJlcG9ydCBmaWxlcy4gIFRoZSBjb3ZlcmFnZQorICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydCBmb3IgPHBhY2thZ2U+Ljxtb2R1bGU+IGlzIHdyaXR0ZW4gdG8gZmlsZQorICAgICAgICAgICAgICAgICAgICAgIDxkaXI+LzxwYWNrYWdlPi88bW9kdWxlPi5jb3Zlci4KKy1tLCAtLW1pc3NpbmcgICAgICAgICBBbm5vdGF0ZSBleGVjdXRhYmxlIGxpbmVzIHRoYXQgd2VyZSBub3QgZXhlY3V0ZWQKKyAgICAgICAgICAgICAgICAgICAgICB3aXRoICc+Pj4+Pj4gJy4KKy1zLCAtLXN1bW1hcnkgICAgICAgICBXcml0ZSBhIGJyaWVmIHN1bW1hcnkgb24gc3Rkb3V0IGZvciBlYWNoIGZpbGUuCisgICAgICAgICAgICAgICAgICAgICAgKENhbiBvbmx5IGJlIHVzZWQgd2l0aCAtLWNvdW50IG9yIC0tcmVwb3J0LikKKy1nLCAtLXRpbWluZyAgICAgICAgICBQcmVmaXggZWFjaCBsaW5lIHdpdGggdGhlIHRpbWUgc2luY2UgdGhlIHByb2dyYW0gc3RhcnRlZC4KKyAgICAgICAgICAgICAgICAgICAgICBPbmx5IHVzZWQgd2hpbGUgdHJhY2luZy4KKworRmlsdGVycywgbWF5IGJlIHJlcGVhdGVkIG11bHRpcGxlIHRpbWVzOgorLS1pZ25vcmUtbW9kdWxlPTxtb2Q+IElnbm9yZSB0aGUgZ2l2ZW4gbW9kdWxlKHMpIGFuZCBpdHMgc3VibW9kdWxlcworICAgICAgICAgICAgICAgICAgICAgIChpZiBpdCBpcyBhIHBhY2thZ2UpLiAgQWNjZXB0cyBjb21tYSBzZXBhcmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICBsaXN0IG9mIG1vZHVsZSBuYW1lcworLS1pZ25vcmUtZGlyPTxkaXI+ICAgIElnbm9yZSBmaWxlcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IChtdWx0aXBsZQorICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yaWVzIGNhbiBiZSBqb2luZWQgYnkgb3MucGF0aHNlcCkuCisiIiIgJSBzeXMuYXJndlswXSkKKworUFJBR01BX05PQ09WRVIgPSAiI3ByYWdtYSBOTyBDT1ZFUiIKKworIyBTaW1wbGUgcnggdG8gZmluZCBsaW5lcyB3aXRoIG5vIGNvZGUuCityeF9ibGFuayA9IHJlLmNvbXBpbGUocideXHMqKCMuKik/JCcpCisKK2NsYXNzIElnbm9yZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlcyA9IE5vbmUsIGRpcnMgPSBOb25lKToKKyAgICAgICAgc2VsZi5fbW9kcyA9IG1vZHVsZXMgb3IgW10KKyAgICAgICAgc2VsZi5fZGlycyA9IGRpcnMgb3IgW10KKworICAgICAgICBzZWxmLl9kaXJzID0gbWFwKG9zLnBhdGgubm9ybXBhdGgsIHNlbGYuX2RpcnMpCisgICAgICAgIHNlbGYuX2lnbm9yZSA9IHsgJzxzdHJpbmc+JzogMSB9CisKKyAgICBkZWYgbmFtZXMoc2VsZiwgZmlsZW5hbWUsIG1vZHVsZW5hbWUpOgorICAgICAgICBpZiBtb2R1bGVuYW1lIGluIHNlbGYuX2lnbm9yZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9pZ25vcmVbbW9kdWxlbmFtZV0KKworICAgICAgICAjIGhhdmVuJ3Qgc2VlbiB0aGlzIG9uZSBiZWZvcmUsIHNvIHNlZSBpZiB0aGUgbW9kdWxlIG5hbWUgaXMKKyAgICAgICAgIyBvbiB0aGUgaWdub3JlIGxpc3QuICBOZWVkIHRvIHRha2Ugc29tZSBjYXJlIHNpbmNlIGlnbm9yaW5nCisgICAgICAgICMgImNtcCIgbXVzbid0IG1lYW4gaWdub3JpbmcgImNtcGNhY2hlIiBidXQgaWdub3JpbmcKKyAgICAgICAgIyAiU3BhbSIgbXVzdCBhbHNvIG1lYW4gaWdub3JpbmcgIlNwYW0uRWdncyIuCisgICAgICAgIGZvciBtb2QgaW4gc2VsZi5fbW9kczoKKyAgICAgICAgICAgIGlmIG1vZCA9PSBtb2R1bGVuYW1lOiAgIyBJZGVudGljYWwgbmFtZXMsIHNvIGlnbm9yZQorICAgICAgICAgICAgICAgIHNlbGYuX2lnbm9yZVttb2R1bGVuYW1lXSA9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgbW9kdWxlIGlzIGEgcHJvcGVyIHN1Ym1vZHVsZSBvZiBzb21ldGhpbmcgb24KKyAgICAgICAgICAgICMgdGhlIGlnbm9yZSBsaXN0CisgICAgICAgICAgICBuID0gbGVuKG1vZCkKKyAgICAgICAgICAgICMgKHdpbGwgbm90IG92ZXJmbG93IHNpbmNlIGlmIHRoZSBmaXJzdCBuIGNoYXJhY3RlcnMgYXJlIHRoZQorICAgICAgICAgICAgIyBzYW1lIGFuZCB0aGUgbmFtZSBoYXMgbm90IGFscmVhZHkgb2NjdXJyZWQsIHRoZW4gdGhlIHNpemUKKyAgICAgICAgICAgICMgb2YgIm5hbWUiIGlzIGdyZWF0ZXIgdGhhbiB0aGF0IG9mICJtb2QiKQorICAgICAgICAgICAgaWYgbW9kID09IG1vZHVsZW5hbWVbOm5dIGFuZCBtb2R1bGVuYW1lW25dID09ICcuJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9pZ25vcmVbbW9kdWxlbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICAjIE5vdyBjaGVjayB0aGF0IF9fZmlsZV9fIGlzbid0IGluIG9uZSBvZiB0aGUgZGlyZWN0b3JpZXMKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICMgbXVzdCBiZSBhIGJ1aWx0LWluLCBzbyB3ZSBtdXN0IGlnbm9yZQorICAgICAgICAgICAgc2VsZi5faWdub3JlW21vZHVsZW5hbWVdID0gMQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICAjIElnbm9yZSBhIGZpbGUgd2hlbiBpdCBjb250YWlucyBvbmUgb2YgdGhlIGlnbm9yYWJsZSBwYXRocworICAgICAgICBmb3IgZCBpbiBzZWxmLl9kaXJzOgorICAgICAgICAgICAgIyBUaGUgJysgb3Muc2VwJyBpcyB0byBlbnN1cmUgdGhhdCBkIGlzIGEgcGFyZW50IGRpcmVjdG9yeSwKKyAgICAgICAgICAgICMgYXMgY29tcGFyZWQgdG8gY2FzZXMgbGlrZToKKyAgICAgICAgICAgICMgIGQgPSAiL3Vzci9sb2NhbCIKKyAgICAgICAgICAgICMgIGZpbGVuYW1lID0gIi91c3IvbG9jYWwucHkiCisgICAgICAgICAgICAjIG9yCisgICAgICAgICAgICAjICBkID0gIi91c3IvbG9jYWwucHkiCisgICAgICAgICAgICAjICBmaWxlbmFtZSA9ICIvdXNyL2xvY2FsLnB5IgorICAgICAgICAgICAgaWYgZmlsZW5hbWUuc3RhcnRzd2l0aChkICsgb3Muc2VwKToKKyAgICAgICAgICAgICAgICBzZWxmLl9pZ25vcmVbbW9kdWxlbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICAjIFRyaWVkIHRoZSBkaWZmZXJlbnQgd2F5cywgc28gd2UgZG9uJ3QgaWdub3JlIHRoaXMgbW9kdWxlCisgICAgICAgIHNlbGYuX2lnbm9yZVttb2R1bGVuYW1lXSA9IDAKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIG1vZG5hbWUocGF0aCk6CisgICAgIiIiUmV0dXJuIGEgcGxhdXNpYmxlIG1vZHVsZSBuYW1lIGZvciB0aGUgcGF0Y2guIiIiCisKKyAgICBiYXNlID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQorICAgIGZpbGVuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2UpCisgICAgcmV0dXJuIGZpbGVuYW1lCisKK2RlZiBmdWxsbW9kbmFtZShwYXRoKToKKyAgICAiIiJSZXR1cm4gYSBwbGF1c2libGUgbW9kdWxlIG5hbWUgZm9yIHRoZSBwYXRoLiIiIgorCisgICAgIyBJZiB0aGUgZmlsZSAncGF0aCcgaXMgcGFydCBvZiBhIHBhY2thZ2UsIHRoZW4gdGhlIGZpbGVuYW1lIGlzbid0CisgICAgIyBlbm91Z2ggdG8gdW5pcXVlbHkgaWRlbnRpZnkgaXQuICBUcnkgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nIGJ5CisgICAgIyBsb29raW5nIGluIHN5cy5wYXRoIGZvciB0aGUgbG9uZ2VzdCBtYXRjaGluZyBwcmVmaXguICBXZSdsbAorICAgICMgYXNzdW1lIHRoYXQgdGhlIHJlc3QgaXMgdGhlIHBhY2thZ2UgbmFtZS4KKworICAgIGNvbXBhcmVwYXRoID0gb3MucGF0aC5ub3JtY2FzZShwYXRoKQorICAgIGxvbmdlc3QgPSAiIgorICAgIGZvciBkaXIgaW4gc3lzLnBhdGg6CisgICAgICAgIGRpciA9IG9zLnBhdGgubm9ybWNhc2UoZGlyKQorICAgICAgICBpZiBjb21wYXJlcGF0aC5zdGFydHN3aXRoKGRpcikgYW5kIGNvbXBhcmVwYXRoW2xlbihkaXIpXSA9PSBvcy5zZXA6CisgICAgICAgICAgICBpZiBsZW4oZGlyKSA+IGxlbihsb25nZXN0KToKKyAgICAgICAgICAgICAgICBsb25nZXN0ID0gZGlyCisKKyAgICBpZiBsb25nZXN0OgorICAgICAgICBiYXNlID0gcGF0aFtsZW4obG9uZ2VzdCkgKyAxOl0KKyAgICBlbHNlOgorICAgICAgICBiYXNlID0gcGF0aAorICAgICMgdGhlIGRyaXZlIGxldHRlciBpcyBuZXZlciBwYXJ0IG9mIHRoZSBtb2R1bGUgbmFtZQorICAgIGRyaXZlLCBiYXNlID0gb3MucGF0aC5zcGxpdGRyaXZlKGJhc2UpCisgICAgYmFzZSA9IGJhc2UucmVwbGFjZShvcy5zZXAsICIuIikKKyAgICBpZiBvcy5hbHRzZXA6CisgICAgICAgIGJhc2UgPSBiYXNlLnJlcGxhY2Uob3MuYWx0c2VwLCAiLiIpCisgICAgZmlsZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoYmFzZSkKKyAgICByZXR1cm4gZmlsZW5hbWUubHN0cmlwKCIuIikKKworY2xhc3MgQ292ZXJhZ2VSZXN1bHRzOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb3VudHM9Tm9uZSwgY2FsbGVkZnVuY3M9Tm9uZSwgaW5maWxlPU5vbmUsCisgICAgICAgICAgICAgICAgIGNhbGxlcnM9Tm9uZSwgb3V0ZmlsZT1Ob25lKToKKyAgICAgICAgc2VsZi5jb3VudHMgPSBjb3VudHMKKyAgICAgICAgaWYgc2VsZi5jb3VudHMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY291bnRzID0ge30KKyAgICAgICAgc2VsZi5jb3VudGVyID0gc2VsZi5jb3VudHMuY29weSgpICMgbWFwIChmaWxlbmFtZSwgbGluZW5vKSB0byBjb3VudAorICAgICAgICBzZWxmLmNhbGxlZGZ1bmNzID0gY2FsbGVkZnVuY3MKKyAgICAgICAgaWYgc2VsZi5jYWxsZWRmdW5jcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jYWxsZWRmdW5jcyA9IHt9CisgICAgICAgIHNlbGYuY2FsbGVkZnVuY3MgPSBzZWxmLmNhbGxlZGZ1bmNzLmNvcHkoKQorICAgICAgICBzZWxmLmNhbGxlcnMgPSBjYWxsZXJzCisgICAgICAgIGlmIHNlbGYuY2FsbGVycyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jYWxsZXJzID0ge30KKyAgICAgICAgc2VsZi5jYWxsZXJzID0gc2VsZi5jYWxsZXJzLmNvcHkoKQorICAgICAgICBzZWxmLmluZmlsZSA9IGluZmlsZQorICAgICAgICBzZWxmLm91dGZpbGUgPSBvdXRmaWxlCisgICAgICAgIGlmIHNlbGYuaW5maWxlOgorICAgICAgICAgICAgIyBUcnkgdG8gbWVyZ2UgZXhpc3RpbmcgY291bnRzIGZpbGUuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY291bnRzLCBjYWxsZWRmdW5jcywgY2FsbGVycyA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5sb2FkKG9wZW4oc2VsZi5pbmZpbGUsICdyYicpKQorICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlKHNlbGYuX19jbGFzc19fKGNvdW50cywgY2FsbGVkZnVuY3MsIGNhbGxlcnMpKQorICAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBFT0ZFcnJvciwgVmFsdWVFcnJvciksIGVycjoKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAoIlNraXBwaW5nIGNvdW50cyBmaWxlICVyOiAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi5pbmZpbGUsIGVycikpCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiTWVyZ2UgaW4gdGhlIGRhdGEgZnJvbSBhbm90aGVyIENvdmVyYWdlUmVzdWx0cyIiIgorICAgICAgICBjb3VudHMgPSBzZWxmLmNvdW50cworICAgICAgICBjYWxsZWRmdW5jcyA9IHNlbGYuY2FsbGVkZnVuY3MKKyAgICAgICAgY2FsbGVycyA9IHNlbGYuY2FsbGVycworICAgICAgICBvdGhlcl9jb3VudHMgPSBvdGhlci5jb3VudHMKKyAgICAgICAgb3RoZXJfY2FsbGVkZnVuY3MgPSBvdGhlci5jYWxsZWRmdW5jcworICAgICAgICBvdGhlcl9jYWxsZXJzID0gb3RoZXIuY2FsbGVycworCisgICAgICAgIGZvciBrZXkgaW4gb3RoZXJfY291bnRzLmtleXMoKToKKyAgICAgICAgICAgIGNvdW50c1trZXldID0gY291bnRzLmdldChrZXksIDApICsgb3RoZXJfY291bnRzW2tleV0KKworICAgICAgICBmb3Iga2V5IGluIG90aGVyX2NhbGxlZGZ1bmNzLmtleXMoKToKKyAgICAgICAgICAgIGNhbGxlZGZ1bmNzW2tleV0gPSAxCisKKyAgICAgICAgZm9yIGtleSBpbiBvdGhlcl9jYWxsZXJzLmtleXMoKToKKyAgICAgICAgICAgIGNhbGxlcnNba2V5XSA9IDEKKworICAgIGRlZiB3cml0ZV9yZXN1bHRzKHNlbGYsIHNob3dfbWlzc2luZz1UcnVlLCBzdW1tYXJ5PUZhbHNlLCBjb3ZlcmRpcj1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEBwYXJhbSBjb3ZlcmRpcgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jYWxsZWRmdW5jczoKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAiZnVuY3Rpb25zIGNhbGxlZDoiCisgICAgICAgICAgICBjYWxscyA9IHNlbGYuY2FsbGVkZnVuY3Mua2V5cygpCisgICAgICAgICAgICBjYWxscy5zb3J0KCkKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSwgbW9kdWxlbmFtZSwgZnVuY25hbWUgaW4gY2FsbHM6CisgICAgICAgICAgICAgICAgcHJpbnQgKCJmaWxlbmFtZTogJXMsIG1vZHVsZW5hbWU6ICVzLCBmdW5jbmFtZTogJXMiCisgICAgICAgICAgICAgICAgICAgICAgICUgKGZpbGVuYW1lLCBtb2R1bGVuYW1lLCBmdW5jbmFtZSkpCisKKyAgICAgICAgaWYgc2VsZi5jYWxsZXJzOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICJjYWxsaW5nIHJlbGF0aW9uc2hpcHM6IgorICAgICAgICAgICAgY2FsbHMgPSBzZWxmLmNhbGxlcnMua2V5cygpCisgICAgICAgICAgICBjYWxscy5zb3J0KCkKKyAgICAgICAgICAgIGxhc3RmaWxlID0gbGFzdGNmaWxlID0gIiIKKyAgICAgICAgICAgIGZvciAoKHBmaWxlLCBwbW9kLCBwZnVuYyksIChjZmlsZSwgY21vZCwgY2Z1bmMpKSBpbiBjYWxsczoKKyAgICAgICAgICAgICAgICBpZiBwZmlsZSAhPSBsYXN0ZmlsZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIioqKiIsIHBmaWxlLCAiKioqIgorICAgICAgICAgICAgICAgICAgICBsYXN0ZmlsZSA9IHBmaWxlCisgICAgICAgICAgICAgICAgICAgIGxhc3RjZmlsZSA9ICIiCisgICAgICAgICAgICAgICAgaWYgY2ZpbGUgIT0gcGZpbGUgYW5kIGxhc3RjZmlsZSAhPSBjZmlsZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiAgLS0+IiwgY2ZpbGUKKyAgICAgICAgICAgICAgICAgICAgbGFzdGNmaWxlID0gY2ZpbGUKKyAgICAgICAgICAgICAgICBwcmludCAiICAgICVzLiVzIC0+ICVzLiVzIiAlIChwbW9kLCBwZnVuYywgY21vZCwgY2Z1bmMpCisKKyAgICAgICAgIyB0dXJuIHRoZSBjb3VudHMgZGF0YSAoIihmaWxlbmFtZSwgbGluZW5vKSA9IGNvdW50IikgaW50byBzb21ldGhpbmcKKyAgICAgICAgIyBhY2Nlc3NpYmxlIG9uIGEgcGVyLWZpbGUgYmFzaXMKKyAgICAgICAgcGVyX2ZpbGUgPSB7fQorICAgICAgICBmb3IgZmlsZW5hbWUsIGxpbmVubyBpbiBzZWxmLmNvdW50cy5rZXlzKCk6CisgICAgICAgICAgICBsaW5lc19oaXQgPSBwZXJfZmlsZVtmaWxlbmFtZV0gPSBwZXJfZmlsZS5nZXQoZmlsZW5hbWUsIHt9KQorICAgICAgICAgICAgbGluZXNfaGl0W2xpbmVub10gPSBzZWxmLmNvdW50c1soZmlsZW5hbWUsIGxpbmVubyldCisKKyAgICAgICAgIyBhY2N1bXVsYXRlIHN1bW1hcnkgaW5mbywgaWYgbmVlZGVkCisgICAgICAgIHN1bXMgPSB7fQorCisgICAgICAgIGZvciBmaWxlbmFtZSwgY291bnQgaW4gcGVyX2ZpbGUuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAjIHNraXAgc29tZSAiZmlsZXMiIHdlIGRvbid0IGNhcmUgYWJvdXQuLi4KKyAgICAgICAgICAgIGlmIGZpbGVuYW1lID09ICI8c3RyaW5nPiI6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lLnN0YXJ0c3dpdGgoIjxkb2N0ZXN0ICIpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCgiLnB5YyIsICIucHlvIikpOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi0xXQorCisgICAgICAgICAgICBpZiBjb3ZlcmRpciBpcyBOb25lOgorICAgICAgICAgICAgICAgIGRpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgIG1vZHVsZW5hbWUgPSBtb2RuYW1lKGZpbGVuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkaXIgPSBjb3ZlcmRpcgorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhkaXIpOgorICAgICAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhkaXIpCisgICAgICAgICAgICAgICAgbW9kdWxlbmFtZSA9IGZ1bGxtb2RuYW1lKGZpbGVuYW1lKQorCisgICAgICAgICAgICAjIElmIGRlc2lyZWQsIGdldCBhIGxpc3Qgb2YgdGhlIGxpbmUgbnVtYmVycyB3aGljaCByZXByZXNlbnQKKyAgICAgICAgICAgICMgZXhlY3V0YWJsZSBjb250ZW50IChyZXR1cm5lZCBhcyBhIGRpY3QgZm9yIGJldHRlciBsb29rdXAgc3BlZWQpCisgICAgICAgICAgICBpZiBzaG93X21pc3Npbmc6CisgICAgICAgICAgICAgICAgbG5vdGFiID0gZmluZF9leGVjdXRhYmxlX2xpbmVub3MoZmlsZW5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxub3RhYiA9IHt9CisKKyAgICAgICAgICAgIHNvdXJjZSA9IGxpbmVjYWNoZS5nZXRsaW5lcyhmaWxlbmFtZSkKKyAgICAgICAgICAgIGNvdmVycGF0aCA9IG9zLnBhdGguam9pbihkaXIsIG1vZHVsZW5hbWUgKyAiLmNvdmVyIikKKyAgICAgICAgICAgIG5faGl0cywgbl9saW5lcyA9IHNlbGYud3JpdGVfcmVzdWx0c19maWxlKGNvdmVycGF0aCwgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5vdGFiLCBjb3VudCkKKworICAgICAgICAgICAgaWYgc3VtbWFyeSBhbmQgbl9saW5lczoKKyAgICAgICAgICAgICAgICBwZXJjZW50ID0gMTAwICogbl9oaXRzIC8vIG5fbGluZXMKKyAgICAgICAgICAgICAgICBzdW1zW21vZHVsZW5hbWVdID0gbl9saW5lcywgcGVyY2VudCwgbW9kdWxlbmFtZSwgZmlsZW5hbWUKKworICAgICAgICBpZiBzdW1tYXJ5IGFuZCBzdW1zOgorICAgICAgICAgICAgbW9kcyA9IHN1bXMua2V5cygpCisgICAgICAgICAgICBtb2RzLnNvcnQoKQorICAgICAgICAgICAgcHJpbnQgImxpbmVzICAgY292JSAgIG1vZHVsZSAgIChwYXRoKSIKKyAgICAgICAgICAgIGZvciBtIGluIG1vZHM6CisgICAgICAgICAgICAgICAgbl9saW5lcywgcGVyY2VudCwgbW9kdWxlbmFtZSwgZmlsZW5hbWUgPSBzdW1zW21dCisgICAgICAgICAgICAgICAgcHJpbnQgIiU1ZCAgICUzZCUlICAgJXMgICAoJXMpIiAlIHN1bXNbbV0KKworICAgICAgICBpZiBzZWxmLm91dGZpbGU6CisgICAgICAgICAgICAjIHRyeSBhbmQgc3RvcmUgY291bnRzIGFuZCBtb2R1bGUgaW5mbyBpbnRvIHNlbGYub3V0ZmlsZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wKChzZWxmLmNvdW50cywgc2VsZi5jYWxsZWRmdW5jcywgc2VsZi5jYWxsZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuKHNlbGYub3V0ZmlsZSwgJ3diJyksIDEpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJDYW4ndCBzYXZlIGNvdW50cyBmaWxlcyBiZWNhdXNlICVzIiAlIGVycgorCisgICAgZGVmIHdyaXRlX3Jlc3VsdHNfZmlsZShzZWxmLCBwYXRoLCBsaW5lcywgbG5vdGFiLCBsaW5lc19oaXQpOgorICAgICAgICAiIiJSZXR1cm4gYSBjb3ZlcmFnZSByZXN1bHRzIGZpbGUgaW4gcGF0aC4iIiIKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBvdXRmaWxlID0gb3BlbihwYXRoLCAidyIpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlcnI6CisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAoInRyYWNlOiBDb3VsZCBub3Qgb3BlbiAlciBmb3Igd3JpdGluZzogJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gc2tpcHBpbmciICUgKHBhdGgsIGVycikpCisgICAgICAgICAgICByZXR1cm4gMCwgMAorCisgICAgICAgIG5fbGluZXMgPSAwCisgICAgICAgIG5faGl0cyA9IDAKKyAgICAgICAgZm9yIGksIGxpbmUgaW4gZW51bWVyYXRlKGxpbmVzKToKKyAgICAgICAgICAgIGxpbmVubyA9IGkgKyAxCisgICAgICAgICAgICAjIGRvIHRoZSBibGFuay9jb21tZW50IG1hdGNoIHRvIHRyeSB0byBtYXJrIG1vcmUgbGluZXMKKyAgICAgICAgICAgICMgKGhlbHAgdGhlIHJlYWRlciBmaW5kIHN0dWZmIHRoYXQgaGFzbid0IGJlZW4gY292ZXJlZCkKKyAgICAgICAgICAgIGlmIGxpbmVubyBpbiBsaW5lc19oaXQ6CisgICAgICAgICAgICAgICAgb3V0ZmlsZS53cml0ZSgiJTVkOiAiICUgbGluZXNfaGl0W2xpbmVub10pCisgICAgICAgICAgICAgICAgbl9oaXRzICs9IDEKKyAgICAgICAgICAgICAgICBuX2xpbmVzICs9IDEKKyAgICAgICAgICAgIGVsaWYgcnhfYmxhbmsubWF0Y2gobGluZSk6CisgICAgICAgICAgICAgICAgb3V0ZmlsZS53cml0ZSgiICAgICAgICIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgbGluZXMgcHJlY2VkZWQgYnkgbm8gbWFya3Mgd2VyZW4ndCBoaXQKKyAgICAgICAgICAgICAgICAjIEhpZ2hsaWdodCB0aGVtIGlmIHNvIGluZGljYXRlZCwgdW5sZXNzIHRoZSBsaW5lIGNvbnRhaW5zCisgICAgICAgICAgICAgICAgIyAjcHJhZ21hOiBOTyBDT1ZFUgorICAgICAgICAgICAgICAgIGlmIGxpbmVubyBpbiBsbm90YWIgYW5kIG5vdCBQUkFHTUFfTk9DT1ZFUiBpbiBsaW5lc1tpXToKKyAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZS53cml0ZSgiPj4+Pj4+ICIpCisgICAgICAgICAgICAgICAgICAgIG5fbGluZXMgKz0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG91dGZpbGUud3JpdGUoIiAgICAgICAiKQorICAgICAgICAgICAgb3V0ZmlsZS53cml0ZShsaW5lc1tpXS5leHBhbmR0YWJzKDgpKQorICAgICAgICBvdXRmaWxlLmNsb3NlKCkKKworICAgICAgICByZXR1cm4gbl9oaXRzLCBuX2xpbmVzCisKK2RlZiBmaW5kX2xpbmVzX2Zyb21fY29kZShjb2RlLCBzdHJzKToKKyAgICAiIiJSZXR1cm4gZGljdCB3aGVyZSBrZXlzIGFyZSBsaW5lcyBpbiB0aGUgbGluZSBudW1iZXIgdGFibGUuIiIiCisgICAgbGluZW5vcyA9IHt9CisKKyAgICBmb3IgXywgbGluZW5vIGluIGRpcy5maW5kbGluZXN0YXJ0cyhjb2RlKToKKyAgICAgICAgaWYgbGluZW5vIG5vdCBpbiBzdHJzOgorICAgICAgICAgICAgbGluZW5vc1tsaW5lbm9dID0gMQorCisgICAgcmV0dXJuIGxpbmVub3MKKworZGVmIGZpbmRfbGluZXMoY29kZSwgc3Rycyk6CisgICAgIiIiUmV0dXJuIGxpbmVubyBkaWN0IGZvciBhbGwgY29kZSBvYmplY3RzIHJlYWNoYWJsZSBmcm9tIGNvZGUuIiIiCisgICAgIyBnZXQgYWxsIG9mIHRoZSBsaW5lbm8gaW5mb3JtYXRpb24gZnJvbSB0aGUgY29kZSBvZiB0aGlzIHNjb3BlIGxldmVsCisgICAgbGluZW5vcyA9IGZpbmRfbGluZXNfZnJvbV9jb2RlKGNvZGUsIHN0cnMpCisKKyAgICAjIGFuZCBjaGVjayB0aGUgY29uc3RhbnRzIGZvciByZWZlcmVuY2VzIHRvIG90aGVyIGNvZGUgb2JqZWN0cworICAgIGZvciBjIGluIGNvZGUuY29fY29uc3RzOgorICAgICAgICBpZiBpbnNwZWN0LmlzY29kZShjKToKKyAgICAgICAgICAgICMgZmluZCBhbm90aGVyIGNvZGUgb2JqZWN0LCBzbyByZWN1cnNlIGludG8gaXQKKyAgICAgICAgICAgIGxpbmVub3MudXBkYXRlKGZpbmRfbGluZXMoYywgc3RycykpCisgICAgcmV0dXJuIGxpbmVub3MKKworZGVmIGZpbmRfc3RyaW5ncyhmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIGEgZGljdCBvZiBwb3NzaWJsZSBkb2NzdHJpbmcgcG9zaXRpb25zLgorCisgICAgVGhlIGRpY3QgbWFwcyBsaW5lIG51bWJlcnMgdG8gc3RyaW5ncy4gIFRoZXJlIGlzIGFuIGVudHJ5IGZvcgorICAgIGxpbmUgdGhhdCBjb250YWlucyBvbmx5IGEgc3RyaW5nIG9yIGEgcGFydCBvZiBhIHRyaXBsZS1xdW90ZWQKKyAgICBzdHJpbmcuCisgICAgIiIiCisgICAgZCA9IHt9CisgICAgIyBJZiB0aGUgZmlyc3QgdG9rZW4gaXMgYSBzdHJpbmcsIHRoZW4gaXQncyB0aGUgbW9kdWxlIGRvY3N0cmluZy4KKyAgICAjIEFkZCB0aGlzIHNwZWNpYWwgY2FzZSBzbyB0aGF0IHRoZSB0ZXN0IGluIHRoZSBsb29wIHBhc3Nlcy4KKyAgICBwcmV2X3R0eXBlID0gdG9rZW4uSU5ERU5UCisgICAgZiA9IG9wZW4oZmlsZW5hbWUpCisgICAgZm9yIHR0eXBlLCB0c3RyLCBzdGFydCwgZW5kLCBsaW5lIGluIHRva2VuaXplLmdlbmVyYXRlX3Rva2VucyhmLnJlYWRsaW5lKToKKyAgICAgICAgaWYgdHR5cGUgPT0gdG9rZW4uU1RSSU5HOgorICAgICAgICAgICAgaWYgcHJldl90dHlwZSA9PSB0b2tlbi5JTkRFTlQ6CisgICAgICAgICAgICAgICAgc2xpbmUsIHNjb2wgPSBzdGFydAorICAgICAgICAgICAgICAgIGVsaW5lLCBlY29sID0gZW5kCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2xpbmUsIGVsaW5lICsgMSk6CisgICAgICAgICAgICAgICAgICAgIGRbaV0gPSAxCisgICAgICAgIHByZXZfdHR5cGUgPSB0dHlwZQorICAgIGYuY2xvc2UoKQorICAgIHJldHVybiBkCisKK2RlZiBmaW5kX2V4ZWN1dGFibGVfbGluZW5vcyhmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIGRpY3Qgd2hlcmUga2V5cyBhcmUgbGluZSBudW1iZXJzIGluIHRoZSBsaW5lIG51bWJlciB0YWJsZS4iIiIKKyAgICB0cnk6CisgICAgICAgIHByb2cgPSBvcGVuKGZpbGVuYW1lLCAiclUiKS5yZWFkKCkKKyAgICBleGNlcHQgSU9FcnJvciwgZXJyOgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAoIk5vdCBwcmludGluZyBjb3ZlcmFnZSBkYXRhIGZvciAlcjogJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChmaWxlbmFtZSwgZXJyKSkKKyAgICAgICAgcmV0dXJuIHt9CisgICAgY29kZSA9IGNvbXBpbGUocHJvZywgZmlsZW5hbWUsICJleGVjIikKKyAgICBzdHJzID0gZmluZF9zdHJpbmdzKGZpbGVuYW1lKQorICAgIHJldHVybiBmaW5kX2xpbmVzKGNvZGUsIHN0cnMpCisKK2NsYXNzIFRyYWNlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb3VudD0xLCB0cmFjZT0xLCBjb3VudGZ1bmNzPTAsIGNvdW50Y2FsbGVycz0wLAorICAgICAgICAgICAgICAgICBpZ25vcmVtb2RzPSgpLCBpZ25vcmVkaXJzPSgpLCBpbmZpbGU9Tm9uZSwgb3V0ZmlsZT1Ob25lLAorICAgICAgICAgICAgICAgICB0aW1pbmc9RmFsc2UpOgorICAgICAgICAiIiIKKyAgICAgICAgQHBhcmFtIGNvdW50IHRydWUgaWZmIGl0IHNob3VsZCBjb3VudCBudW1iZXIgb2YgdGltZXMgZWFjaAorICAgICAgICAgICAgICAgICAgICAgbGluZSBpcyBleGVjdXRlZAorICAgICAgICBAcGFyYW0gdHJhY2UgdHJ1ZSBpZmYgaXQgc2hvdWxkIHByaW50IG91dCBlYWNoIGxpbmUgdGhhdCBpcworICAgICAgICAgICAgICAgICAgICAgYmVpbmcgY291bnRlZAorICAgICAgICBAcGFyYW0gY291bnRmdW5jcyB0cnVlIGlmZiBpdCBzaG91bGQganVzdCBvdXRwdXQgYSBsaXN0IG9mCisgICAgICAgICAgICAgICAgICAgICAoZmlsZW5hbWUsIG1vZHVsZW5hbWUsIGZ1bmNuYW1lLCkgZm9yIGZ1bmN0aW9ucworICAgICAgICAgICAgICAgICAgICAgdGhhdCB3ZXJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlOyAgVGhpcyBvdmVycmlkZXMKKyAgICAgICAgICAgICAgICAgICAgIGBjb3VudCcgYW5kIGB0cmFjZScKKyAgICAgICAgQHBhcmFtIGlnbm9yZW1vZHMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBtb2R1bGVzIHRvIGlnbm9yZQorICAgICAgICBAcGFyYW0gaWdub3JlZGlycyBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIGRpcmVjdG9yaWVzIHRvIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICAgYWxsIG9mIHRoZSAocmVjdXJzaXZlKSBjb250ZW50cyBvZgorICAgICAgICBAcGFyYW0gaW5maWxlIGZpbGUgZnJvbSB3aGljaCB0byByZWFkIHN0b3JlZCBjb3VudHMgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgIGFkZGVkIGludG8gdGhlIHJlc3VsdHMKKyAgICAgICAgQHBhcmFtIG91dGZpbGUgZmlsZSBpbiB3aGljaCB0byB3cml0ZSB0aGUgcmVzdWx0cworICAgICAgICBAcGFyYW0gdGltaW5nIHRydWUgaWZmIHRpbWluZyBpbmZvcm1hdGlvbiBiZSBkaXNwbGF5ZWQKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuaW5maWxlID0gaW5maWxlCisgICAgICAgIHNlbGYub3V0ZmlsZSA9IG91dGZpbGUKKyAgICAgICAgc2VsZi5pZ25vcmUgPSBJZ25vcmUoaWdub3JlbW9kcywgaWdub3JlZGlycykKKyAgICAgICAgc2VsZi5jb3VudHMgPSB7fSAgICMga2V5cyBhcmUgKGZpbGVuYW1lLCBsaW5lbnVtYmVyKQorICAgICAgICBzZWxmLmJsYWJiZWQgPSB7fSAjIGZvciBkZWJ1Z2dpbmcKKyAgICAgICAgc2VsZi5wYXRodG9iYXNlbmFtZSA9IHt9ICMgZm9yIG1lbW9pemluZyBvcy5wYXRoLmJhc2VuYW1lCisgICAgICAgIHNlbGYuZG9ub3RoaW5nID0gMAorICAgICAgICBzZWxmLnRyYWNlID0gdHJhY2UKKyAgICAgICAgc2VsZi5fY2FsbGVkZnVuY3MgPSB7fQorICAgICAgICBzZWxmLl9jYWxsZXJzID0ge30KKyAgICAgICAgc2VsZi5fY2FsbGVyX2NhY2hlID0ge30KKyAgICAgICAgc2VsZi5zdGFydF90aW1lID0gTm9uZQorICAgICAgICBpZiB0aW1pbmc6CisgICAgICAgICAgICBzZWxmLnN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICBpZiBjb3VudGNhbGxlcnM6CisgICAgICAgICAgICBzZWxmLmdsb2JhbHRyYWNlID0gc2VsZi5nbG9iYWx0cmFjZV90cmFja2NhbGxlcnMKKyAgICAgICAgZWxpZiBjb3VudGZ1bmNzOgorICAgICAgICAgICAgc2VsZi5nbG9iYWx0cmFjZSA9IHNlbGYuZ2xvYmFsdHJhY2VfY291bnRmdW5jcworICAgICAgICBlbGlmIHRyYWNlIGFuZCBjb3VudDoKKyAgICAgICAgICAgIHNlbGYuZ2xvYmFsdHJhY2UgPSBzZWxmLmdsb2JhbHRyYWNlX2x0CisgICAgICAgICAgICBzZWxmLmxvY2FsdHJhY2UgPSBzZWxmLmxvY2FsdHJhY2VfdHJhY2VfYW5kX2NvdW50CisgICAgICAgIGVsaWYgdHJhY2U6CisgICAgICAgICAgICBzZWxmLmdsb2JhbHRyYWNlID0gc2VsZi5nbG9iYWx0cmFjZV9sdAorICAgICAgICAgICAgc2VsZi5sb2NhbHRyYWNlID0gc2VsZi5sb2NhbHRyYWNlX3RyYWNlCisgICAgICAgIGVsaWYgY291bnQ6CisgICAgICAgICAgICBzZWxmLmdsb2JhbHRyYWNlID0gc2VsZi5nbG9iYWx0cmFjZV9sdAorICAgICAgICAgICAgc2VsZi5sb2NhbHRyYWNlID0gc2VsZi5sb2NhbHRyYWNlX2NvdW50CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEFoZW0gLS0gZG8gbm90aGluZz8gIE9rYXkuCisgICAgICAgICAgICBzZWxmLmRvbm90aGluZyA9IDEKKworICAgIGRlZiBydW4oc2VsZiwgY21kKToKKyAgICAgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgICAgIGRpY3QgPSBfX21haW5fXy5fX2RpY3RfXworICAgICAgICBzZWxmLnJ1bmN0eChjbWQsIGRpY3QsIGRpY3QpCisKKyAgICBkZWYgcnVuY3R4KHNlbGYsIGNtZCwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSk6CisgICAgICAgIGlmIGdsb2JhbHMgaXMgTm9uZTogZ2xvYmFscyA9IHt9CisgICAgICAgIGlmIGxvY2FscyBpcyBOb25lOiBsb2NhbHMgPSB7fQorICAgICAgICBpZiBub3Qgc2VsZi5kb25vdGhpbmc6CisgICAgICAgICAgICBfc2V0dHJhY2Uoc2VsZi5nbG9iYWx0cmFjZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYyBjbWQgaW4gZ2xvYmFscywgbG9jYWxzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5kb25vdGhpbmc6CisgICAgICAgICAgICAgICAgX3Vuc2V0dHJhY2UoKQorCisgICAgZGVmIHJ1bmZ1bmMoc2VsZiwgZnVuYywgKmFyZ3MsICoqa3cpOgorICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgIGlmIG5vdCBzZWxmLmRvbm90aGluZzoKKyAgICAgICAgICAgIHN5cy5zZXR0cmFjZShzZWxmLmdsb2JhbHRyYWNlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSBmdW5jKCphcmdzLCAqKmt3KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuZG9ub3RoaW5nOgorICAgICAgICAgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZmlsZV9tb2R1bGVfZnVuY3Rpb25fb2Yoc2VsZiwgZnJhbWUpOgorICAgICAgICBjb2RlID0gZnJhbWUuZl9jb2RlCisgICAgICAgIGZpbGVuYW1lID0gY29kZS5jb19maWxlbmFtZQorICAgICAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgICAgIG1vZHVsZW5hbWUgPSBtb2RuYW1lKGZpbGVuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbW9kdWxlbmFtZSA9IE5vbmUKKworICAgICAgICBmdW5jbmFtZSA9IGNvZGUuY29fbmFtZQorICAgICAgICBjbHNuYW1lID0gTm9uZQorICAgICAgICBpZiBjb2RlIGluIHNlbGYuX2NhbGxlcl9jYWNoZToKKyAgICAgICAgICAgIGlmIHNlbGYuX2NhbGxlcl9jYWNoZVtjb2RlXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjbHNuYW1lID0gc2VsZi5fY2FsbGVyX2NhY2hlW2NvZGVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9jYWxsZXJfY2FjaGVbY29kZV0gPSBOb25lCisgICAgICAgICAgICAjIyB1c2Ugb2YgZ2MuZ2V0X3JlZmVycmVycygpIHdhcyBzdWdnZXN0ZWQgYnkgTWljaGFlbCBIdWRzb24KKyAgICAgICAgICAgICMgYWxsIGZ1bmN0aW9ucyB3aGljaCByZWZlciB0byB0aGlzIGNvZGUgb2JqZWN0CisgICAgICAgICAgICBmdW5jcyA9IFtmIGZvciBmIGluIGdjLmdldF9yZWZlcnJlcnMoY29kZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbnNwZWN0LmlzZnVuY3Rpb24oZildCisgICAgICAgICAgICAjIHJlcXVpcmUgbGVuKGZ1bmMpID09IDEgdG8gYXZvaWQgYW1iaWd1aXR5IGNhdXNlZCBieSBjYWxscyB0bworICAgICAgICAgICAgIyBuZXcuZnVuY3Rpb24oKTogIkluIHRoZSBmYWNlIG9mIGFtYmlndWl0eSwgcmVmdXNlIHRoZQorICAgICAgICAgICAgIyB0ZW1wdGF0aW9uIHRvIGd1ZXNzLiIKKyAgICAgICAgICAgIGlmIGxlbihmdW5jcykgPT0gMToKKyAgICAgICAgICAgICAgICBkaWN0cyA9IFtkIGZvciBkIGluIGdjLmdldF9yZWZlcnJlcnMoZnVuY3NbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZCwgZGljdCldCisgICAgICAgICAgICAgICAgaWYgbGVuKGRpY3RzKSA9PSAxOgorICAgICAgICAgICAgICAgICAgICBjbGFzc2VzID0gW2MgZm9yIGMgaW4gZ2MuZ2V0X3JlZmVycmVycyhkaWN0c1swXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihjLCAiX19iYXNlc19fIildCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihjbGFzc2VzKSA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBkaXR0byBmb3IgbmV3LmNsYXNzb2JqKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsc25hbWUgPSBjbGFzc2VzWzBdLl9fbmFtZV9fCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNhY2hlIHRoZSByZXN1bHQgLSBhc3N1bXB0aW9uIGlzIHRoYXQgbmV3LiogaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbm90IGNhbGxlZCBsYXRlciB0byBkaXN0dXJiIHRoaXMgcmVsYXRpb25zaGlwCisgICAgICAgICAgICAgICAgICAgICAgICAjIF9jYWxsZXJfY2FjaGUgY291bGQgYmUgZmx1c2hlZCBpZiBmdW5jdGlvbnMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG5ldyBtb2R1bGUgZ2V0IGNhbGxlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbGxlcl9jYWNoZVtjb2RlXSA9IGNsc25hbWUKKyAgICAgICAgaWYgY2xzbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZ1bmNuYW1lID0gIiVzLiVzIiAlIChjbHNuYW1lLCBmdW5jbmFtZSkKKworICAgICAgICByZXR1cm4gZmlsZW5hbWUsIG1vZHVsZW5hbWUsIGZ1bmNuYW1lCisKKyAgICBkZWYgZ2xvYmFsdHJhY2VfdHJhY2tjYWxsZXJzKHNlbGYsIGZyYW1lLCB3aHksIGFyZyk6CisgICAgICAgICIiIkhhbmRsZXIgZm9yIGNhbGwgZXZlbnRzLgorCisgICAgICAgIEFkZHMgaW5mb3JtYXRpb24gYWJvdXQgd2hvIGNhbGxlZCB3aG8gdG8gdGhlIHNlbGYuX2NhbGxlcnMgZGljdC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHdoeSA9PSAnY2FsbCc6CisgICAgICAgICAgICAjIFhYWCBTaG91bGQgZG8gYSBiZXR0ZXIgam9iIG9mIGlkZW50aWZ5aW5nIG1ldGhvZHMKKyAgICAgICAgICAgIHRoaXNfZnVuYyA9IHNlbGYuZmlsZV9tb2R1bGVfZnVuY3Rpb25fb2YoZnJhbWUpCisgICAgICAgICAgICBwYXJlbnRfZnVuYyA9IHNlbGYuZmlsZV9tb2R1bGVfZnVuY3Rpb25fb2YoZnJhbWUuZl9iYWNrKQorICAgICAgICAgICAgc2VsZi5fY2FsbGVyc1socGFyZW50X2Z1bmMsIHRoaXNfZnVuYyldID0gMQorCisgICAgZGVmIGdsb2JhbHRyYWNlX2NvdW50ZnVuY3Moc2VsZiwgZnJhbWUsIHdoeSwgYXJnKToKKyAgICAgICAgIiIiSGFuZGxlciBmb3IgY2FsbCBldmVudHMuCisKKyAgICAgICAgQWRkcyAoZmlsZW5hbWUsIG1vZHVsZW5hbWUsIGZ1bmNuYW1lKSB0byB0aGUgc2VsZi5fY2FsbGVkZnVuY3MgZGljdC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHdoeSA9PSAnY2FsbCc6CisgICAgICAgICAgICB0aGlzX2Z1bmMgPSBzZWxmLmZpbGVfbW9kdWxlX2Z1bmN0aW9uX29mKGZyYW1lKQorICAgICAgICAgICAgc2VsZi5fY2FsbGVkZnVuY3NbdGhpc19mdW5jXSA9IDEKKworICAgIGRlZiBnbG9iYWx0cmFjZV9sdChzZWxmLCBmcmFtZSwgd2h5LCBhcmcpOgorICAgICAgICAiIiJIYW5kbGVyIGZvciBjYWxsIGV2ZW50cy4KKworICAgICAgICBJZiB0aGUgY29kZSBibG9jayBiZWluZyBlbnRlcmVkIGlzIHRvIGJlIGlnbm9yZWQsIHJldHVybnMgYE5vbmUnLAorICAgICAgICBlbHNlIHJldHVybnMgc2VsZi5sb2NhbHRyYWNlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgd2h5ID09ICdjYWxsJzoKKyAgICAgICAgICAgIGNvZGUgPSBmcmFtZS5mX2NvZGUKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZnJhbWUuZl9nbG9iYWxzLmdldCgnX19maWxlX18nLCBOb25lKQorICAgICAgICAgICAgaWYgZmlsZW5hbWU6CisgICAgICAgICAgICAgICAgIyBYWFggbW9kbmFtZSgpIGRvZXNuJ3Qgd29yayByaWdodCBmb3IgcGFja2FnZXMsIHNvCisgICAgICAgICAgICAgICAgIyB0aGUgaWdub3JlIHN1cHBvcnQgd29uJ3Qgd29yayByaWdodCBmb3IgcGFja2FnZXMKKyAgICAgICAgICAgICAgICBtb2R1bGVuYW1lID0gbW9kbmFtZShmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBtb2R1bGVuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBpZ25vcmVfaXQgPSBzZWxmLmlnbm9yZS5uYW1lcyhmaWxlbmFtZSwgbW9kdWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9pdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudHJhY2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgKCIgLS0tIG1vZHVsZW5hbWU6ICVzLCBmdW5jbmFtZTogJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKG1vZHVsZW5hbWUsIGNvZGUuY29fbmFtZSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5sb2NhbHRyYWNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgbG9jYWx0cmFjZV90cmFjZV9hbmRfY291bnQoc2VsZiwgZnJhbWUsIHdoeSwgYXJnKToKKyAgICAgICAgaWYgd2h5ID09ICJsaW5lIjoKKyAgICAgICAgICAgICMgcmVjb3JkIHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIG9mIGV2ZXJ5IHRyYWNlCisgICAgICAgICAgICBmaWxlbmFtZSA9IGZyYW1lLmZfY29kZS5jb19maWxlbmFtZQorICAgICAgICAgICAgbGluZW5vID0gZnJhbWUuZl9saW5lbm8KKyAgICAgICAgICAgIGtleSA9IGZpbGVuYW1lLCBsaW5lbm8KKyAgICAgICAgICAgIHNlbGYuY291bnRzW2tleV0gPSBzZWxmLmNvdW50cy5nZXQoa2V5LCAwKSArIDEKKworICAgICAgICAgICAgaWYgc2VsZi5zdGFydF90aW1lOgorICAgICAgICAgICAgICAgIHByaW50ICclLjJmJyAlICh0aW1lLnRpbWUoKSAtIHNlbGYuc3RhcnRfdGltZSksCisgICAgICAgICAgICBibmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCisgICAgICAgICAgICBwcmludCAiJXMoJWQpOiAlcyIgJSAoYm5hbWUsIGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKSksCisgICAgICAgIHJldHVybiBzZWxmLmxvY2FsdHJhY2UKKworICAgIGRlZiBsb2NhbHRyYWNlX3RyYWNlKHNlbGYsIGZyYW1lLCB3aHksIGFyZyk6CisgICAgICAgIGlmIHdoeSA9PSAibGluZSI6CisgICAgICAgICAgICAjIHJlY29yZCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBvZiBldmVyeSB0cmFjZQorICAgICAgICAgICAgZmlsZW5hbWUgPSBmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgICAgIGxpbmVubyA9IGZyYW1lLmZfbGluZW5vCisKKyAgICAgICAgICAgIGlmIHNlbGYuc3RhcnRfdGltZToKKyAgICAgICAgICAgICAgICBwcmludCAnJS4yZicgJSAodGltZS50aW1lKCkgLSBzZWxmLnN0YXJ0X3RpbWUpLAorICAgICAgICAgICAgYm5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQorICAgICAgICAgICAgcHJpbnQgIiVzKCVkKTogJXMiICUgKGJuYW1lLCBsaW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykpLAorICAgICAgICByZXR1cm4gc2VsZi5sb2NhbHRyYWNlCisKKyAgICBkZWYgbG9jYWx0cmFjZV9jb3VudChzZWxmLCBmcmFtZSwgd2h5LCBhcmcpOgorICAgICAgICBpZiB3aHkgPT0gImxpbmUiOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgICAgIGxpbmVubyA9IGZyYW1lLmZfbGluZW5vCisgICAgICAgICAgICBrZXkgPSBmaWxlbmFtZSwgbGluZW5vCisgICAgICAgICAgICBzZWxmLmNvdW50c1trZXldID0gc2VsZi5jb3VudHMuZ2V0KGtleSwgMCkgKyAxCisgICAgICAgIHJldHVybiBzZWxmLmxvY2FsdHJhY2UKKworICAgIGRlZiByZXN1bHRzKHNlbGYpOgorICAgICAgICByZXR1cm4gQ292ZXJhZ2VSZXN1bHRzKHNlbGYuY291bnRzLCBpbmZpbGU9c2VsZi5pbmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZT1zZWxmLm91dGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVkZnVuY3M9c2VsZi5fY2FsbGVkZnVuY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVycz1zZWxmLl9jYWxsZXJzKQorCitkZWYgX2Vycl9leGl0KG1zZyk6CisgICAgc3lzLnN0ZGVyci53cml0ZSgiJXM6ICVzXG4iICUgKHN5cy5hcmd2WzBdLCBtc2cpKQorICAgIHN5cy5leGl0KDEpCisKK2RlZiBtYWluKGFyZ3Y9Tm9uZSk6CisgICAgaW1wb3J0IGdldG9wdAorCisgICAgaWYgYXJndiBpcyBOb25lOgorICAgICAgICBhcmd2ID0gc3lzLmFyZ3YKKyAgICB0cnk6CisgICAgICAgIG9wdHMsIHByb2dfYXJndiA9IGdldG9wdC5nZXRvcHQoYXJndlsxOl0sICJ0Y3JSZjpkOm1zQzpsVGciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiaGVscCIsICJ2ZXJzaW9uIiwgInRyYWNlIiwgImNvdW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcG9ydCIsICJuby1yZXBvcnQiLCAic3VtbWFyeSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlPSIsICJtaXNzaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZS1tb2R1bGU9IiwgImlnbm9yZS1kaXI9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdmVyZGlyPSIsICJsaXN0ZnVuY3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJhY2tjYWxscyIsICJ0aW1pbmciXSkKKworICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiJXM6ICVzXG4iICUgKHN5cy5hcmd2WzBdLCBtc2cpKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJUcnkgYCVzIC0taGVscCcgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAlIHN5cy5hcmd2WzBdKQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgdHJhY2UgPSAwCisgICAgY291bnQgPSAwCisgICAgcmVwb3J0ID0gMAorICAgIG5vX3JlcG9ydCA9IDAKKyAgICBjb3VudHNfZmlsZSA9IE5vbmUKKyAgICBtaXNzaW5nID0gMAorICAgIGlnbm9yZV9tb2R1bGVzID0gW10KKyAgICBpZ25vcmVfZGlycyA9IFtdCisgICAgY292ZXJkaXIgPSBOb25lCisgICAgc3VtbWFyeSA9IDAKKyAgICBsaXN0ZnVuY3MgPSBGYWxzZQorICAgIGNvdW50Y2FsbGVycyA9IEZhbHNlCisgICAgdGltaW5nID0gRmFsc2UKKworICAgIGZvciBvcHQsIHZhbCBpbiBvcHRzOgorICAgICAgICBpZiBvcHQgPT0gIi0taGVscCI6CisgICAgICAgICAgICB1c2FnZShzeXMuc3Rkb3V0KQorICAgICAgICAgICAgc3lzLmV4aXQoMCkKKworICAgICAgICBpZiBvcHQgPT0gIi0tdmVyc2lvbiI6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJ0cmFjZSAyLjBcbiIpCisgICAgICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgICAgIGlmIG9wdCA9PSAiLVQiIG9yIG9wdCA9PSAiLS10cmFja2NhbGxzIjoKKyAgICAgICAgICAgIGNvdW50Y2FsbGVycyA9IFRydWUKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgb3B0ID09ICItbCIgb3Igb3B0ID09ICItLWxpc3RmdW5jcyI6CisgICAgICAgICAgICBsaXN0ZnVuY3MgPSBUcnVlCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIG9wdCA9PSAiLWciIG9yIG9wdCA9PSAiLS10aW1pbmciOgorICAgICAgICAgICAgdGltaW5nID0gVHJ1ZQorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcHQgPT0gIi10IiBvciBvcHQgPT0gIi0tdHJhY2UiOgorICAgICAgICAgICAgdHJhY2UgPSAxCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIG9wdCA9PSAiLWMiIG9yIG9wdCA9PSAiLS1jb3VudCI6CisgICAgICAgICAgICBjb3VudCA9IDEKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgb3B0ID09ICItciIgb3Igb3B0ID09ICItLXJlcG9ydCI6CisgICAgICAgICAgICByZXBvcnQgPSAxCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIG9wdCA9PSAiLVIiIG9yIG9wdCA9PSAiLS1uby1yZXBvcnQiOgorICAgICAgICAgICAgbm9fcmVwb3J0ID0gMQorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcHQgPT0gIi1mIiBvciBvcHQgPT0gIi0tZmlsZSI6CisgICAgICAgICAgICBjb3VudHNfZmlsZSA9IHZhbAorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcHQgPT0gIi1tIiBvciBvcHQgPT0gIi0tbWlzc2luZyI6CisgICAgICAgICAgICBtaXNzaW5nID0gMQorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcHQgPT0gIi1DIiBvciBvcHQgPT0gIi0tY292ZXJkaXIiOgorICAgICAgICAgICAgY292ZXJkaXIgPSB2YWwKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgb3B0ID09ICItcyIgb3Igb3B0ID09ICItLXN1bW1hcnkiOgorICAgICAgICAgICAgc3VtbWFyeSA9IDEKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgb3B0ID09ICItLWlnbm9yZS1tb2R1bGUiOgorICAgICAgICAgICAgZm9yIG1vZCBpbiB2YWwuc3BsaXQoIiwiKToKKyAgICAgICAgICAgICAgICBpZ25vcmVfbW9kdWxlcy5hcHBlbmQobW9kLnN0cmlwKCkpCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIG9wdCA9PSAiLS1pZ25vcmUtZGlyIjoKKyAgICAgICAgICAgIGZvciBzIGluIHZhbC5zcGxpdChvcy5wYXRoc2VwKToKKyAgICAgICAgICAgICAgICBzID0gb3MucGF0aC5leHBhbmR2YXJzKHMpCisgICAgICAgICAgICAgICAgIyBzaG91bGQgSSBhbHNvIGNhbGwgZXhwYW5kdXNlcj8gKGFmdGVyIGFsbCwgY291bGQgdXNlICRIT01FKQorCisgICAgICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgiJHByZWZpeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgImxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiIgKyBzeXMudmVyc2lvbls6M10pKQorICAgICAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoIiRleGVjX3ByZWZpeCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LCAibGliIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uIiArIHN5cy52ZXJzaW9uWzozXSkpCisgICAgICAgICAgICAgICAgcyA9IG9zLnBhdGgubm9ybXBhdGgocykKKyAgICAgICAgICAgICAgICBpZ25vcmVfZGlycy5hcHBlbmQocykKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgYXNzZXJ0IDAsICJTaG91bGQgbmV2ZXIgZ2V0IGhlcmUiCisKKyAgICBpZiBsaXN0ZnVuY3MgYW5kIChjb3VudCBvciB0cmFjZSk6CisgICAgICAgIF9lcnJfZXhpdCgiY2Fubm90IHNwZWNpZnkgYm90aCAtLWxpc3RmdW5jcyBhbmQgKC0tdHJhY2Ugb3IgLS1jb3VudCkiKQorCisgICAgaWYgbm90IChjb3VudCBvciB0cmFjZSBvciByZXBvcnQgb3IgbGlzdGZ1bmNzIG9yIGNvdW50Y2FsbGVycyk6CisgICAgICAgIF9lcnJfZXhpdCgibXVzdCBzcGVjaWZ5IG9uZSBvZiAtLXRyYWNlLCAtLWNvdW50LCAtLXJlcG9ydCwgIgorICAgICAgICAgICAgICAgICAgIi0tbGlzdGZ1bmNzLCBvciAtLXRyYWNrY2FsbHMiKQorCisgICAgaWYgcmVwb3J0IGFuZCBub19yZXBvcnQ6CisgICAgICAgIF9lcnJfZXhpdCgiY2Fubm90IHNwZWNpZnkgYm90aCAtLXJlcG9ydCBhbmQgLS1uby1yZXBvcnQiKQorCisgICAgaWYgcmVwb3J0IGFuZCBub3QgY291bnRzX2ZpbGU6CisgICAgICAgIF9lcnJfZXhpdCgiLS1yZXBvcnQgcmVxdWlyZXMgYSAtLWZpbGUiKQorCisgICAgaWYgbm9fcmVwb3J0IGFuZCBsZW4ocHJvZ19hcmd2KSA9PSAwOgorICAgICAgICBfZXJyX2V4aXQoIm1pc3NpbmcgbmFtZSBvZiBmaWxlIHRvIHJ1biIpCisKKyAgICAjIGV2ZXJ5dGhpbmcgaXMgcmVhZHkKKyAgICBpZiByZXBvcnQ6CisgICAgICAgIHJlc3VsdHMgPSBDb3ZlcmFnZVJlc3VsdHMoaW5maWxlPWNvdW50c19maWxlLCBvdXRmaWxlPWNvdW50c19maWxlKQorICAgICAgICByZXN1bHRzLndyaXRlX3Jlc3VsdHMobWlzc2luZywgc3VtbWFyeT1zdW1tYXJ5LCBjb3ZlcmRpcj1jb3ZlcmRpcikKKyAgICBlbHNlOgorICAgICAgICBzeXMuYXJndiA9IHByb2dfYXJndgorICAgICAgICBwcm9nbmFtZSA9IHByb2dfYXJndlswXQorICAgICAgICBzeXMucGF0aFswXSA9IG9zLnBhdGguc3BsaXQocHJvZ25hbWUpWzBdCisKKyAgICAgICAgdCA9IFRyYWNlKGNvdW50LCB0cmFjZSwgY291bnRmdW5jcz1saXN0ZnVuY3MsCisgICAgICAgICAgICAgICAgICBjb3VudGNhbGxlcnM9Y291bnRjYWxsZXJzLCBpZ25vcmVtb2RzPWlnbm9yZV9tb2R1bGVzLAorICAgICAgICAgICAgICAgICAgaWdub3JlZGlycz1pZ25vcmVfZGlycywgaW5maWxlPWNvdW50c19maWxlLAorICAgICAgICAgICAgICAgICAgb3V0ZmlsZT1jb3VudHNfZmlsZSwgdGltaW5nPXRpbWluZykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcGVuKHByb2duYW1lKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBjb2RlID0gY29tcGlsZShmcC5yZWFkKCksIHByb2duYW1lLCAnZXhlYycpCisgICAgICAgICAgICAjIHRyeSB0byBlbXVsYXRlIF9fbWFpbl9fIG5hbWVzcGFjZSBhcyBtdWNoIGFzIHBvc3NpYmxlCisgICAgICAgICAgICBnbG9icyA9IHsKKyAgICAgICAgICAgICAgICAnX19maWxlX18nOiBwcm9nbmFtZSwKKyAgICAgICAgICAgICAgICAnX19uYW1lX18nOiAnX19tYWluX18nLAorICAgICAgICAgICAgICAgICdfX3BhY2thZ2VfXyc6IE5vbmUsCisgICAgICAgICAgICAgICAgJ19fY2FjaGVkX18nOiBOb25lLAorICAgICAgICAgICAgfQorICAgICAgICAgICAgdC5ydW5jdHgoY29kZSwgZ2xvYnMsIGdsb2JzKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZXJyOgorICAgICAgICAgICAgX2Vycl9leGl0KCJDYW5ub3QgcnVuIGZpbGUgJXIgYmVjYXVzZTogJXMiICUgKHN5cy5hcmd2WzBdLCBlcnIpKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXN1bHRzID0gdC5yZXN1bHRzKCkKKworICAgICAgICBpZiBub3Qgbm9fcmVwb3J0OgorICAgICAgICAgICAgcmVzdWx0cy53cml0ZV9yZXN1bHRzKG1pc3NpbmcsIHN1bW1hcnk9c3VtbWFyeSwgY292ZXJkaXI9Y292ZXJkaXIpCisKK2lmIF9fbmFtZV9fPT0nX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90cmFjZS5weWMgYi9saWIvcHl0aG9uMi43L3RyYWNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDQ4YTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90cmFjZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90cmFjZS5weW8gYi9saWIvcHl0aG9uMi43L3RyYWNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDNjMjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90cmFjZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90cmFjZWJhY2sucHkgYi9saWIvcHl0aG9uMi43L3RyYWNlYmFjay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTE3ZDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90cmFjZWJhY2sucHkKQEAgLTAsMCArMSwzMTkgQEAKKyIiIkV4dHJhY3QsIGZvcm1hdCBhbmQgcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgUHl0aG9uIHN0YWNrIHRyYWNlcy4iIiIKKworaW1wb3J0IGxpbmVjYWNoZQoraW1wb3J0IHN5cworaW1wb3J0IHR5cGVzCisKK19fYWxsX18gPSBbJ2V4dHJhY3Rfc3RhY2snLCAnZXh0cmFjdF90YicsICdmb3JtYXRfZXhjZXB0aW9uJywKKyAgICAgICAgICAgJ2Zvcm1hdF9leGNlcHRpb25fb25seScsICdmb3JtYXRfbGlzdCcsICdmb3JtYXRfc3RhY2snLAorICAgICAgICAgICAnZm9ybWF0X3RiJywgJ3ByaW50X2V4YycsICdmb3JtYXRfZXhjJywgJ3ByaW50X2V4Y2VwdGlvbicsCisgICAgICAgICAgICdwcmludF9sYXN0JywgJ3ByaW50X3N0YWNrJywgJ3ByaW50X3RiJywgJ3RiX2xpbmVubyddCisKK2RlZiBfcHJpbnQoZmlsZSwgc3RyPScnLCB0ZXJtaW5hdG9yPSdcbicpOgorICAgIGZpbGUud3JpdGUoc3RyK3Rlcm1pbmF0b3IpCisKKworZGVmIHByaW50X2xpc3QoZXh0cmFjdGVkX2xpc3QsIGZpbGU9Tm9uZSk6CisgICAgIiIiUHJpbnQgdGhlIGxpc3Qgb2YgdHVwbGVzIGFzIHJldHVybmVkIGJ5IGV4dHJhY3RfdGIoKSBvcgorICAgIGV4dHJhY3Rfc3RhY2soKSBhcyBhIGZvcm1hdHRlZCBzdGFjayB0cmFjZSB0byB0aGUgZ2l2ZW4gZmlsZS4iIiIKKyAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCisgICAgZm9yIGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxpbmUgaW4gZXh0cmFjdGVkX2xpc3Q6CisgICAgICAgIF9wcmludChmaWxlLAorICAgICAgICAgICAgICAgJyAgRmlsZSAiJXMiLCBsaW5lICVkLCBpbiAlcycgJSAoZmlsZW5hbWUsbGluZW5vLG5hbWUpKQorICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgX3ByaW50KGZpbGUsICcgICAgJXMnICUgbGluZS5zdHJpcCgpKQorCitkZWYgZm9ybWF0X2xpc3QoZXh0cmFjdGVkX2xpc3QpOgorICAgICIiIkZvcm1hdCBhIGxpc3Qgb2YgdHJhY2ViYWNrIGVudHJ5IHR1cGxlcyBmb3IgcHJpbnRpbmcuCisKKyAgICBHaXZlbiBhIGxpc3Qgb2YgdHVwbGVzIGFzIHJldHVybmVkIGJ5IGV4dHJhY3RfdGIoKSBvcgorICAgIGV4dHJhY3Rfc3RhY2soKSwgcmV0dXJuIGEgbGlzdCBvZiBzdHJpbmdzIHJlYWR5IGZvciBwcmludGluZy4KKyAgICBFYWNoIHN0cmluZyBpbiB0aGUgcmVzdWx0aW5nIGxpc3QgY29ycmVzcG9uZHMgdG8gdGhlIGl0ZW0gd2l0aCB0aGUKKyAgICBzYW1lIGluZGV4IGluIHRoZSBhcmd1bWVudCBsaXN0LiAgRWFjaCBzdHJpbmcgZW5kcyBpbiBhIG5ld2xpbmU7CisgICAgdGhlIHN0cmluZ3MgbWF5IGNvbnRhaW4gaW50ZXJuYWwgbmV3bGluZXMgYXMgd2VsbCwgZm9yIHRob3NlIGl0ZW1zCisgICAgd2hvc2Ugc291cmNlIHRleHQgbGluZSBpcyBub3QgTm9uZS4KKyAgICAiIiIKKyAgICBsaXN0ID0gW10KKyAgICBmb3IgZmlsZW5hbWUsIGxpbmVubywgbmFtZSwgbGluZSBpbiBleHRyYWN0ZWRfbGlzdDoKKyAgICAgICAgaXRlbSA9ICcgIEZpbGUgIiVzIiwgbGluZSAlZCwgaW4gJXNcbicgJSAoZmlsZW5hbWUsbGluZW5vLG5hbWUpCisgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICBpdGVtID0gaXRlbSArICcgICAgJXNcbicgJSBsaW5lLnN0cmlwKCkKKyAgICAgICAgbGlzdC5hcHBlbmQoaXRlbSkKKyAgICByZXR1cm4gbGlzdAorCisKK2RlZiBwcmludF90Yih0YiwgbGltaXQ9Tm9uZSwgZmlsZT1Ob25lKToKKyAgICAiIiJQcmludCB1cCB0byAnbGltaXQnIHN0YWNrIHRyYWNlIGVudHJpZXMgZnJvbSB0aGUgdHJhY2ViYWNrICd0YicuCisKKyAgICBJZiAnbGltaXQnIGlzIG9taXR0ZWQgb3IgTm9uZSwgYWxsIGVudHJpZXMgYXJlIHByaW50ZWQuICBJZiAnZmlsZScKKyAgICBpcyBvbWl0dGVkIG9yIE5vbmUsIHRoZSBvdXRwdXQgZ29lcyB0byBzeXMuc3RkZXJyOyBvdGhlcndpc2UKKyAgICAnZmlsZScgc2hvdWxkIGJlIGFuIG9wZW4gZmlsZSBvciBmaWxlLWxpa2Ugb2JqZWN0IHdpdGggYSB3cml0ZSgpCisgICAgbWV0aG9kLgorICAgICIiIgorICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgZmlsZSA9IHN5cy5zdGRlcnIKKyAgICBpZiBsaW1pdCBpcyBOb25lOgorICAgICAgICBpZiBoYXNhdHRyKHN5cywgJ3RyYWNlYmFja2xpbWl0Jyk6CisgICAgICAgICAgICBsaW1pdCA9IHN5cy50cmFjZWJhY2tsaW1pdAorICAgIG4gPSAwCisgICAgd2hpbGUgdGIgaXMgbm90IE5vbmUgYW5kIChsaW1pdCBpcyBOb25lIG9yIG4gPCBsaW1pdCk6CisgICAgICAgIGYgPSB0Yi50Yl9mcmFtZQorICAgICAgICBsaW5lbm8gPSB0Yi50Yl9saW5lbm8KKyAgICAgICAgY28gPSBmLmZfY29kZQorICAgICAgICBmaWxlbmFtZSA9IGNvLmNvX2ZpbGVuYW1lCisgICAgICAgIG5hbWUgPSBjby5jb19uYW1lCisgICAgICAgIF9wcmludChmaWxlLAorICAgICAgICAgICAgICAgJyAgRmlsZSAiJXMiLCBsaW5lICVkLCBpbiAlcycgJSAoZmlsZW5hbWUsIGxpbmVubywgbmFtZSkpCisgICAgICAgIGxpbmVjYWNoZS5jaGVja2NhY2hlKGZpbGVuYW1lKQorICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubywgZi5mX2dsb2JhbHMpCisgICAgICAgIGlmIGxpbmU6IF9wcmludChmaWxlLCAnICAgICcgKyBsaW5lLnN0cmlwKCkpCisgICAgICAgIHRiID0gdGIudGJfbmV4dAorICAgICAgICBuID0gbisxCisKK2RlZiBmb3JtYXRfdGIodGIsIGxpbWl0ID0gTm9uZSk6CisgICAgIiIiQSBzaG9ydGhhbmQgZm9yICdmb3JtYXRfbGlzdChleHRyYWN0X3N0YWNrKGYsIGxpbWl0KSkuIiIiCisgICAgcmV0dXJuIGZvcm1hdF9saXN0KGV4dHJhY3RfdGIodGIsIGxpbWl0KSkKKworZGVmIGV4dHJhY3RfdGIodGIsIGxpbWl0ID0gTm9uZSk6CisgICAgIiIiUmV0dXJuIGxpc3Qgb2YgdXAgdG8gbGltaXQgcHJlLXByb2Nlc3NlZCBlbnRyaWVzIGZyb20gdHJhY2ViYWNrLgorCisgICAgVGhpcyBpcyB1c2VmdWwgZm9yIGFsdGVybmF0ZSBmb3JtYXR0aW5nIG9mIHN0YWNrIHRyYWNlcy4gIElmCisgICAgJ2xpbWl0JyBpcyBvbWl0dGVkIG9yIE5vbmUsIGFsbCBlbnRyaWVzIGFyZSBleHRyYWN0ZWQuICBBCisgICAgcHJlLXByb2Nlc3NlZCBzdGFjayB0cmFjZSBlbnRyeSBpcyBhIHF1YWRydXBsZSAoZmlsZW5hbWUsIGxpbmUKKyAgICBudW1iZXIsIGZ1bmN0aW9uIG5hbWUsIHRleHQpIHJlcHJlc2VudGluZyB0aGUgaW5mb3JtYXRpb24gdGhhdCBpcworICAgIHVzdWFsbHkgcHJpbnRlZCBmb3IgYSBzdGFjayB0cmFjZS4gIFRoZSB0ZXh0IGlzIGEgc3RyaW5nIHdpdGgKKyAgICBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIHN0cmlwcGVkOyBpZiB0aGUgc291cmNlIGlzIG5vdAorICAgIGF2YWlsYWJsZSBpdCBpcyBOb25lLgorICAgICIiIgorICAgIGlmIGxpbWl0IGlzIE5vbmU6CisgICAgICAgIGlmIGhhc2F0dHIoc3lzLCAndHJhY2ViYWNrbGltaXQnKToKKyAgICAgICAgICAgIGxpbWl0ID0gc3lzLnRyYWNlYmFja2xpbWl0CisgICAgbGlzdCA9IFtdCisgICAgbiA9IDAKKyAgICB3aGlsZSB0YiBpcyBub3QgTm9uZSBhbmQgKGxpbWl0IGlzIE5vbmUgb3IgbiA8IGxpbWl0KToKKyAgICAgICAgZiA9IHRiLnRiX2ZyYW1lCisgICAgICAgIGxpbmVubyA9IHRiLnRiX2xpbmVubworICAgICAgICBjbyA9IGYuZl9jb2RlCisgICAgICAgIGZpbGVuYW1lID0gY28uY29fZmlsZW5hbWUKKyAgICAgICAgbmFtZSA9IGNvLmNvX25hbWUKKyAgICAgICAgbGluZWNhY2hlLmNoZWNrY2FjaGUoZmlsZW5hbWUpCisgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vLCBmLmZfZ2xvYmFscykKKyAgICAgICAgaWYgbGluZTogbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICBlbHNlOiBsaW5lID0gTm9uZQorICAgICAgICBsaXN0LmFwcGVuZCgoZmlsZW5hbWUsIGxpbmVubywgbmFtZSwgbGluZSkpCisgICAgICAgIHRiID0gdGIudGJfbmV4dAorICAgICAgICBuID0gbisxCisgICAgcmV0dXJuIGxpc3QKKworCitkZWYgcHJpbnRfZXhjZXB0aW9uKGV0eXBlLCB2YWx1ZSwgdGIsIGxpbWl0PU5vbmUsIGZpbGU9Tm9uZSk6CisgICAgIiIiUHJpbnQgZXhjZXB0aW9uIHVwIHRvICdsaW1pdCcgc3RhY2sgdHJhY2UgZW50cmllcyBmcm9tICd0YicgdG8gJ2ZpbGUnLgorCisgICAgVGhpcyBkaWZmZXJzIGZyb20gcHJpbnRfdGIoKSBpbiB0aGUgZm9sbG93aW5nIHdheXM6ICgxKSBpZgorICAgIHRyYWNlYmFjayBpcyBub3QgTm9uZSwgaXQgcHJpbnRzIGEgaGVhZGVyICJUcmFjZWJhY2sgKG1vc3QgcmVjZW50CisgICAgY2FsbCBsYXN0KToiOyAoMikgaXQgcHJpbnRzIHRoZSBleGNlcHRpb24gdHlwZSBhbmQgdmFsdWUgYWZ0ZXIgdGhlCisgICAgc3RhY2sgdHJhY2U7ICgzKSBpZiB0eXBlIGlzIFN5bnRheEVycm9yIGFuZCB2YWx1ZSBoYXMgdGhlCisgICAgYXBwcm9wcmlhdGUgZm9ybWF0LCBpdCBwcmludHMgdGhlIGxpbmUgd2hlcmUgdGhlIHN5bnRheCBlcnJvcgorICAgIG9jY3VycmVkIHdpdGggYSBjYXJldCBvbiB0aGUgbmV4dCBsaW5lIGluZGljYXRpbmcgdGhlIGFwcHJveGltYXRlCisgICAgcG9zaXRpb24gb2YgdGhlIGVycm9yLgorICAgICIiIgorICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgZmlsZSA9IHN5cy5zdGRlcnIKKyAgICBpZiB0YjoKKyAgICAgICAgX3ByaW50KGZpbGUsICdUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6JykKKyAgICAgICAgcHJpbnRfdGIodGIsIGxpbWl0LCBmaWxlKQorICAgIGxpbmVzID0gZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KGV0eXBlLCB2YWx1ZSkKKyAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgX3ByaW50KGZpbGUsIGxpbmUsICcnKQorCitkZWYgZm9ybWF0X2V4Y2VwdGlvbihldHlwZSwgdmFsdWUsIHRiLCBsaW1pdCA9IE5vbmUpOgorICAgICIiIkZvcm1hdCBhIHN0YWNrIHRyYWNlIGFuZCB0aGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uLgorCisgICAgVGhlIGFyZ3VtZW50cyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnRzCisgICAgdG8gcHJpbnRfZXhjZXB0aW9uKCkuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdCBvZiBzdHJpbmdzLCBlYWNoCisgICAgZW5kaW5nIGluIGEgbmV3bGluZSBhbmQgc29tZSBjb250YWluaW5nIGludGVybmFsIG5ld2xpbmVzLiAgV2hlbgorICAgIHRoZXNlIGxpbmVzIGFyZSBjb25jYXRlbmF0ZWQgYW5kIHByaW50ZWQsIGV4YWN0bHkgdGhlIHNhbWUgdGV4dCBpcworICAgIHByaW50ZWQgYXMgZG9lcyBwcmludF9leGNlcHRpb24oKS4KKyAgICAiIiIKKyAgICBpZiB0YjoKKyAgICAgICAgbGlzdCA9IFsnVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuJ10KKyAgICAgICAgbGlzdCA9IGxpc3QgKyBmb3JtYXRfdGIodGIsIGxpbWl0KQorICAgIGVsc2U6CisgICAgICAgIGxpc3QgPSBbXQorICAgIGxpc3QgPSBsaXN0ICsgZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KGV0eXBlLCB2YWx1ZSkKKyAgICByZXR1cm4gbGlzdAorCitkZWYgZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KGV0eXBlLCB2YWx1ZSk6CisgICAgIiIiRm9ybWF0IHRoZSBleGNlcHRpb24gcGFydCBvZiBhIHRyYWNlYmFjay4KKworICAgIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBleGNlcHRpb24gdHlwZSBhbmQgdmFsdWUgc3VjaCBhcyBnaXZlbiBieQorICAgIHN5cy5sYXN0X3R5cGUgYW5kIHN5cy5sYXN0X3ZhbHVlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdCBvZgorICAgIHN0cmluZ3MsIGVhY2ggZW5kaW5nIGluIGEgbmV3bGluZS4KKworICAgIE5vcm1hbGx5LCB0aGUgbGlzdCBjb250YWlucyBhIHNpbmdsZSBzdHJpbmc7IGhvd2V2ZXIsIGZvcgorICAgIFN5bnRheEVycm9yIGV4Y2VwdGlvbnMsIGl0IGNvbnRhaW5zIHNldmVyYWwgbGluZXMgdGhhdCAod2hlbgorICAgIHByaW50ZWQpIGRpc3BsYXkgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgdGhlIHN5bnRheAorICAgIGVycm9yIG9jY3VycmVkLgorCisgICAgVGhlIG1lc3NhZ2UgaW5kaWNhdGluZyB3aGljaCBleGNlcHRpb24gb2NjdXJyZWQgaXMgYWx3YXlzIHRoZSBsYXN0CisgICAgc3RyaW5nIGluIHRoZSBsaXN0LgorCisgICAgIiIiCisKKyAgICAjIEFuIGluc3RhbmNlIHNob3VsZCBub3QgaGF2ZSBhIG1lYW5pbmdmdWwgdmFsdWUgcGFyYW1ldGVyLCBidXQKKyAgICAjIHNvbWV0aW1lcyBkb2VzLCBwYXJ0aWN1bGFybHkgZm9yIHN0cmluZyBleGNlcHRpb25zLCBzdWNoIGFzCisgICAgIyA+Pj4gcmFpc2Ugc3RyaW5nMSwgc3RyaW5nMiAgIyBkZXByZWNhdGVkCisgICAgIworICAgICMgQ2xlYXIgdGhlc2Ugb3V0IGZpcnN0IGJlY2F1c2UgaXNzdWJ0eXBlKHN0cmluZzEsIFN5bnRheEVycm9yKQorICAgICMgd291bGQgcmFpc2UgYW5vdGhlciBleGNlcHRpb24gYW5kIG1hc2sgdGhlIG9yaWdpbmFsIHByb2JsZW0uCisgICAgaWYgKGlzaW5zdGFuY2UoZXR5cGUsIEJhc2VFeGNlcHRpb24pIG9yCisgICAgICAgIGlzaW5zdGFuY2UoZXR5cGUsIHR5cGVzLkluc3RhbmNlVHlwZSkgb3IKKyAgICAgICAgZXR5cGUgaXMgTm9uZSBvciB0eXBlKGV0eXBlKSBpcyBzdHIpOgorICAgICAgICByZXR1cm4gW19mb3JtYXRfZmluYWxfZXhjX2xpbmUoZXR5cGUsIHZhbHVlKV0KKworICAgIHN0eXBlID0gZXR5cGUuX19uYW1lX18KKworICAgIGlmIG5vdCBpc3N1YmNsYXNzKGV0eXBlLCBTeW50YXhFcnJvcik6CisgICAgICAgIHJldHVybiBbX2Zvcm1hdF9maW5hbF9leGNfbGluZShzdHlwZSwgdmFsdWUpXQorCisgICAgIyBJdCB3YXMgYSBzeW50YXggZXJyb3I7IHNob3cgZXhhY3RseSB3aGVyZSB0aGUgcHJvYmxlbSB3YXMgZm91bmQuCisgICAgbGluZXMgPSBbXQorICAgIHRyeToKKyAgICAgICAgbXNnLCAoZmlsZW5hbWUsIGxpbmVubywgb2Zmc2V0LCBiYWRsaW5lKSA9IHZhbHVlLmFyZ3MKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZSBvciAiPHN0cmluZz4iCisgICAgICAgIGxpbmVzLmFwcGVuZCgnICBGaWxlICIlcyIsIGxpbmUgJWRcbicgJSAoZmlsZW5hbWUsIGxpbmVubykpCisgICAgICAgIGlmIGJhZGxpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyAgICAlc1xuJyAlIGJhZGxpbmUuc3RyaXAoKSkKKyAgICAgICAgICAgIGlmIG9mZnNldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjYXJldHNwYWNlID0gYmFkbGluZS5yc3RyaXAoJ1xuJylbOm9mZnNldF0ubHN0cmlwKCkKKyAgICAgICAgICAgICAgICAjIG5vbi1zcGFjZSB3aGl0ZXNwYWNlIChsaWtlcyB0YWJzKSBtdXN0IGJlIGtlcHQgZm9yIGFsaWdubWVudAorICAgICAgICAgICAgICAgIGNhcmV0c3BhY2UgPSAoKGMuaXNzcGFjZSgpIGFuZCBjIG9yICcgJykgZm9yIGMgaW4gY2FyZXRzcGFjZSkKKyAgICAgICAgICAgICAgICAjIG9ubHkgdGhyZWUgc3BhY2VzIHRvIGFjY291bnQgZm9yIG9mZnNldDEgPT0gcG9zIDAKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoJyAgICVzXlxuJyAlICcnLmpvaW4oY2FyZXRzcGFjZSkpCisgICAgICAgIHZhbHVlID0gbXNnCisKKyAgICBsaW5lcy5hcHBlbmQoX2Zvcm1hdF9maW5hbF9leGNfbGluZShzdHlwZSwgdmFsdWUpKQorICAgIHJldHVybiBsaW5lcworCitkZWYgX2Zvcm1hdF9maW5hbF9leGNfbGluZShldHlwZSwgdmFsdWUpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYSBzaW5nbGUgbGluZSAtLSBub3JtYWwgY2FzZSBmb3IgZm9ybWF0X2V4Y2VwdGlvbl9vbmx5IiIiCisgICAgdmFsdWVzdHIgPSBfc29tZV9zdHIodmFsdWUpCisgICAgaWYgdmFsdWUgaXMgTm9uZSBvciBub3QgdmFsdWVzdHI6CisgICAgICAgIGxpbmUgPSAiJXNcbiIgJSBldHlwZQorICAgIGVsc2U6CisgICAgICAgIGxpbmUgPSAiJXM6ICVzXG4iICUgKGV0eXBlLCB2YWx1ZXN0cikKKyAgICByZXR1cm4gbGluZQorCitkZWYgX3NvbWVfc3RyKHZhbHVlKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBzdHIodmFsdWUpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcGFzcworICAgIHRyeToKKyAgICAgICAgdmFsdWUgPSB1bmljb2RlKHZhbHVlKQorICAgICAgICByZXR1cm4gdmFsdWUuZW5jb2RlKCJhc2NpaSIsICJiYWNrc2xhc2hyZXBsYWNlIikKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBwYXNzCisgICAgcmV0dXJuICc8dW5wcmludGFibGUgJXMgb2JqZWN0PicgJSB0eXBlKHZhbHVlKS5fX25hbWVfXworCisKK2RlZiBwcmludF9leGMobGltaXQ9Tm9uZSwgZmlsZT1Ob25lKToKKyAgICAiIiJTaG9ydGhhbmQgZm9yICdwcmludF9leGNlcHRpb24oc3lzLmV4Y190eXBlLCBzeXMuZXhjX3ZhbHVlLCBzeXMuZXhjX3RyYWNlYmFjaywgbGltaXQsIGZpbGUpJy4KKyAgICAoSW4gZmFjdCwgaXQgdXNlcyBzeXMuZXhjX2luZm8oKSB0byByZXRyaWV2ZSB0aGUgc2FtZSBpbmZvcm1hdGlvbgorICAgIGluIGEgdGhyZWFkLXNhZmUgd2F5LikiIiIKKyAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCisgICAgdHJ5OgorICAgICAgICBldHlwZSwgdmFsdWUsIHRiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgcHJpbnRfZXhjZXB0aW9uKGV0eXBlLCB2YWx1ZSwgdGIsIGxpbWl0LCBmaWxlKQorICAgIGZpbmFsbHk6CisgICAgICAgIGV0eXBlID0gdmFsdWUgPSB0YiA9IE5vbmUKKworCitkZWYgZm9ybWF0X2V4YyhsaW1pdD1Ob25lKToKKyAgICAiIiJMaWtlIHByaW50X2V4YygpIGJ1dCByZXR1cm4gYSBzdHJpbmcuIiIiCisgICAgdHJ5OgorICAgICAgICBldHlwZSwgdmFsdWUsIHRiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oZm9ybWF0X2V4Y2VwdGlvbihldHlwZSwgdmFsdWUsIHRiLCBsaW1pdCkpCisgICAgZmluYWxseToKKyAgICAgICAgZXR5cGUgPSB2YWx1ZSA9IHRiID0gTm9uZQorCisKK2RlZiBwcmludF9sYXN0KGxpbWl0PU5vbmUsIGZpbGU9Tm9uZSk6CisgICAgIiIiVGhpcyBpcyBhIHNob3J0aGFuZCBmb3IgJ3ByaW50X2V4Y2VwdGlvbihzeXMubGFzdF90eXBlLAorICAgIHN5cy5sYXN0X3ZhbHVlLCBzeXMubGFzdF90cmFjZWJhY2ssIGxpbWl0LCBmaWxlKScuIiIiCisgICAgaWYgbm90IGhhc2F0dHIoc3lzLCAibGFzdF90eXBlIik6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vIGxhc3QgZXhjZXB0aW9uIikKKyAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCisgICAgcHJpbnRfZXhjZXB0aW9uKHN5cy5sYXN0X3R5cGUsIHN5cy5sYXN0X3ZhbHVlLCBzeXMubGFzdF90cmFjZWJhY2ssCisgICAgICAgICAgICAgICAgICAgIGxpbWl0LCBmaWxlKQorCisKK2RlZiBwcmludF9zdGFjayhmPU5vbmUsIGxpbWl0PU5vbmUsIGZpbGU9Tm9uZSk6CisgICAgIiIiUHJpbnQgYSBzdGFjayB0cmFjZSBmcm9tIGl0cyBpbnZvY2F0aW9uIHBvaW50LgorCisgICAgVGhlIG9wdGlvbmFsICdmJyBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZQorICAgIHN0YWNrIGZyYW1lIGF0IHdoaWNoIHRvIHN0YXJ0LiBUaGUgb3B0aW9uYWwgJ2xpbWl0JyBhbmQgJ2ZpbGUnCisgICAgYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3IgcHJpbnRfZXhjZXB0aW9uKCkuCisgICAgIiIiCisgICAgaWYgZiBpcyBOb25lOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBaZXJvRGl2aXNpb25FcnJvcgorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBmID0gc3lzLmV4Y19pbmZvKClbMl0udGJfZnJhbWUuZl9iYWNrCisgICAgcHJpbnRfbGlzdChleHRyYWN0X3N0YWNrKGYsIGxpbWl0KSwgZmlsZSkKKworZGVmIGZvcm1hdF9zdGFjayhmPU5vbmUsIGxpbWl0PU5vbmUpOgorICAgICIiIlNob3J0aGFuZCBmb3IgJ2Zvcm1hdF9saXN0KGV4dHJhY3Rfc3RhY2soZiwgbGltaXQpKScuIiIiCisgICAgaWYgZiBpcyBOb25lOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBaZXJvRGl2aXNpb25FcnJvcgorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBmID0gc3lzLmV4Y19pbmZvKClbMl0udGJfZnJhbWUuZl9iYWNrCisgICAgcmV0dXJuIGZvcm1hdF9saXN0KGV4dHJhY3Rfc3RhY2soZiwgbGltaXQpKQorCitkZWYgZXh0cmFjdF9zdGFjayhmPU5vbmUsIGxpbWl0ID0gTm9uZSk6CisgICAgIiIiRXh0cmFjdCB0aGUgcmF3IHRyYWNlYmFjayBmcm9tIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lLgorCisgICAgVGhlIHJldHVybiB2YWx1ZSBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIGZvciBleHRyYWN0X3RiKCkuICBUaGUKKyAgICBvcHRpb25hbCAnZicgYW5kICdsaW1pdCcgYXJndW1lbnRzIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyBmb3IKKyAgICBwcmludF9zdGFjaygpLiAgRWFjaCBpdGVtIGluIHRoZSBsaXN0IGlzIGEgcXVhZHJ1cGxlIChmaWxlbmFtZSwKKyAgICBsaW5lIG51bWJlciwgZnVuY3Rpb24gbmFtZSwgdGV4dCksIGFuZCB0aGUgZW50cmllcyBhcmUgaW4gb3JkZXIKKyAgICBmcm9tIG9sZGVzdCB0byBuZXdlc3Qgc3RhY2sgZnJhbWUuCisgICAgIiIiCisgICAgaWYgZiBpcyBOb25lOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBaZXJvRGl2aXNpb25FcnJvcgorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBmID0gc3lzLmV4Y19pbmZvKClbMl0udGJfZnJhbWUuZl9iYWNrCisgICAgaWYgbGltaXQgaXMgTm9uZToKKyAgICAgICAgaWYgaGFzYXR0cihzeXMsICd0cmFjZWJhY2tsaW1pdCcpOgorICAgICAgICAgICAgbGltaXQgPSBzeXMudHJhY2ViYWNrbGltaXQKKyAgICBsaXN0ID0gW10KKyAgICBuID0gMAorICAgIHdoaWxlIGYgaXMgbm90IE5vbmUgYW5kIChsaW1pdCBpcyBOb25lIG9yIG4gPCBsaW1pdCk6CisgICAgICAgIGxpbmVubyA9IGYuZl9saW5lbm8KKyAgICAgICAgY28gPSBmLmZfY29kZQorICAgICAgICBmaWxlbmFtZSA9IGNvLmNvX2ZpbGVuYW1lCisgICAgICAgIG5hbWUgPSBjby5jb19uYW1lCisgICAgICAgIGxpbmVjYWNoZS5jaGVja2NhY2hlKGZpbGVuYW1lKQorICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubywgZi5mX2dsb2JhbHMpCisgICAgICAgIGlmIGxpbmU6IGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgZWxzZTogbGluZSA9IE5vbmUKKyAgICAgICAgbGlzdC5hcHBlbmQoKGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxpbmUpKQorICAgICAgICBmID0gZi5mX2JhY2sKKyAgICAgICAgbiA9IG4rMQorICAgIGxpc3QucmV2ZXJzZSgpCisgICAgcmV0dXJuIGxpc3QKKworZGVmIHRiX2xpbmVubyh0Yik6CisgICAgIiIiQ2FsY3VsYXRlIGNvcnJlY3QgbGluZSBudW1iZXIgb2YgdHJhY2ViYWNrIGdpdmVuIGluIHRiLgorCisgICAgT2Jzb2xldGUgaW4gMi4zLgorICAgICIiIgorICAgIHJldHVybiB0Yi50Yl9saW5lbm8KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdHJhY2ViYWNrLnB5YyBiL2xpYi9weXRob24yLjcvdHJhY2ViYWNrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODEzYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90cmFjZWJhY2sucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdHJhY2ViYWNrLnB5byBiL2xpYi9weXRob24yLjcvdHJhY2ViYWNrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODEzYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90cmFjZWJhY2sucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdHR5LnB5IGIvbGliL3B5dGhvbjIuNy90dHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyZWI2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdHR5LnB5CkBAIC0wLDAgKzEsMzYgQEAKKyIiIlRlcm1pbmFsIHV0aWxpdGllcy4iIiIKKworIyBBdXRob3I6IFN0ZWVuIEx1bWhvbHQuCisKK2Zyb20gdGVybWlvcyBpbXBvcnQgKgorCitfX2FsbF9fID0gWyJzZXRyYXciLCAic2V0Y2JyZWFrIl0KKworIyBJbmRleGVzIGZvciB0ZXJtaW9zIGxpc3QuCitJRkxBRyA9IDAKK09GTEFHID0gMQorQ0ZMQUcgPSAyCitMRkxBRyA9IDMKK0lTUEVFRCA9IDQKK09TUEVFRCA9IDUKK0NDID0gNgorCitkZWYgc2V0cmF3KGZkLCB3aGVuPVRDU0FGTFVTSCk6CisgICAgIiIiUHV0IHRlcm1pbmFsIGludG8gYSByYXcgbW9kZS4iIiIKKyAgICBtb2RlID0gdGNnZXRhdHRyKGZkKQorICAgIG1vZGVbSUZMQUddID0gbW9kZVtJRkxBR10gJiB+KEJSS0lOVCB8IElDUk5MIHwgSU5QQ0sgfCBJU1RSSVAgfCBJWE9OKQorICAgIG1vZGVbT0ZMQUddID0gbW9kZVtPRkxBR10gJiB+KE9QT1NUKQorICAgIG1vZGVbQ0ZMQUddID0gbW9kZVtDRkxBR10gJiB+KENTSVpFIHwgUEFSRU5CKQorICAgIG1vZGVbQ0ZMQUddID0gbW9kZVtDRkxBR10gfCBDUzgKKyAgICBtb2RlW0xGTEFHXSA9IG1vZGVbTEZMQUddICYgfihFQ0hPIHwgSUNBTk9OIHwgSUVYVEVOIHwgSVNJRykKKyAgICBtb2RlW0NDXVtWTUlOXSA9IDEKKyAgICBtb2RlW0NDXVtWVElNRV0gPSAwCisgICAgdGNzZXRhdHRyKGZkLCB3aGVuLCBtb2RlKQorCitkZWYgc2V0Y2JyZWFrKGZkLCB3aGVuPVRDU0FGTFVTSCk6CisgICAgIiIiUHV0IHRlcm1pbmFsIGludG8gYSBjYnJlYWsgbW9kZS4iIiIKKyAgICBtb2RlID0gdGNnZXRhdHRyKGZkKQorICAgIG1vZGVbTEZMQUddID0gbW9kZVtMRkxBR10gJiB+KEVDSE8gfCBJQ0FOT04pCisgICAgbW9kZVtDQ11bVk1JTl0gPSAxCisgICAgbW9kZVtDQ11bVlRJTUVdID0gMAorICAgIHRjc2V0YXR0cihmZCwgd2hlbiwgbW9kZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdHR5LnB5YyBiL2xpYi9weXRob24yLjcvdHR5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk1NzliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90dHkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdHR5LnB5byBiL2xpYi9weXRob24yLjcvdHR5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk1NzliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90dHkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdHlwZXMucHkgYi9saWIvcHl0aG9uMi43L3R5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTBlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3R5cGVzLnB5CkBAIC0wLDAgKzEsODQgQEAKKyIiIkRlZmluZSBuYW1lcyBmb3IgYWxsIHR5cGUgc3ltYm9scyBrbm93biBpbiB0aGUgc3RhbmRhcmQgaW50ZXJwcmV0ZXIuCisKK1R5cGVzIHRoYXQgYXJlIHBhcnQgb2Ygb3B0aW9uYWwgbW9kdWxlcyAoZS5nLiBhcnJheSkgYXJlIG5vdCBsaXN0ZWQuCisiIiIKK2ltcG9ydCBzeXMKKworIyBJdGVyYXRvcnMgaW4gUHl0aG9uIGFyZW4ndCBhIG1hdHRlciBvZiB0eXBlIGJ1dCBvZiBwcm90b2NvbC4gIEEgbGFyZ2UKKyMgYW5kIGNoYW5naW5nIG51bWJlciBvZiBidWlsdGluIHR5cGVzIGltcGxlbWVudCAqc29tZSogZmxhdm9yIG9mCisjIGl0ZXJhdG9yLiAgRG9uJ3QgY2hlY2sgdGhlIHR5cGUhICBVc2UgaGFzYXR0ciB0byBjaGVjayBmb3IgYm90aAorIyAiX19pdGVyX18iIGFuZCAibmV4dCIgYXR0cmlidXRlcyBpbnN0ZWFkLgorCitOb25lVHlwZSA9IHR5cGUoTm9uZSkKK1R5cGVUeXBlID0gdHlwZQorT2JqZWN0VHlwZSA9IG9iamVjdAorCitJbnRUeXBlID0gaW50CitMb25nVHlwZSA9IGxvbmcKK0Zsb2F0VHlwZSA9IGZsb2F0CitCb29sZWFuVHlwZSA9IGJvb2wKK3RyeToKKyAgICBDb21wbGV4VHlwZSA9IGNvbXBsZXgKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcGFzcworCitTdHJpbmdUeXBlID0gc3RyCisKKyMgU3RyaW5nVHlwZXMgaXMgYWxyZWFkeSBvdXRkYXRlZC4gIEluc3RlYWQgb2Ygd3JpdGluZyAidHlwZSh4KSBpbgorIyB0eXBlcy5TdHJpbmdUeXBlcyIsIHlvdSBzaG91bGQgdXNlICJpc2luc3RhbmNlKHgsIGJhc2VzdHJpbmcpIi4gIEJ1dAorIyB3ZSBrZWVwIGFyb3VuZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjIuCit0cnk6CisgICAgVW5pY29kZVR5cGUgPSB1bmljb2RlCisgICAgU3RyaW5nVHlwZXMgPSAoU3RyaW5nVHlwZSwgVW5pY29kZVR5cGUpCitleGNlcHQgTmFtZUVycm9yOgorICAgIFN0cmluZ1R5cGVzID0gKFN0cmluZ1R5cGUsKQorCitCdWZmZXJUeXBlID0gYnVmZmVyCisKK1R1cGxlVHlwZSA9IHR1cGxlCitMaXN0VHlwZSA9IGxpc3QKK0RpY3RUeXBlID0gRGljdGlvbmFyeVR5cGUgPSBkaWN0CisKK2RlZiBfZigpOiBwYXNzCitGdW5jdGlvblR5cGUgPSB0eXBlKF9mKQorTGFtYmRhVHlwZSA9IHR5cGUobGFtYmRhOiBOb25lKSAgICAgICAgICMgU2FtZSBhcyBGdW5jdGlvblR5cGUKK0NvZGVUeXBlID0gdHlwZShfZi5mdW5jX2NvZGUpCisKK2RlZiBfZygpOgorICAgIHlpZWxkIDEKK0dlbmVyYXRvclR5cGUgPSB0eXBlKF9nKCkpCisKK2NsYXNzIF9DOgorICAgIGRlZiBfbShzZWxmKTogcGFzcworQ2xhc3NUeXBlID0gdHlwZShfQykKK1VuYm91bmRNZXRob2RUeXBlID0gdHlwZShfQy5fbSkgICAgICAgICAjIFNhbWUgYXMgTWV0aG9kVHlwZQorX3ggPSBfQygpCitJbnN0YW5jZVR5cGUgPSB0eXBlKF94KQorTWV0aG9kVHlwZSA9IHR5cGUoX3guX20pCisKK0J1aWx0aW5GdW5jdGlvblR5cGUgPSB0eXBlKGxlbikKK0J1aWx0aW5NZXRob2RUeXBlID0gdHlwZShbXS5hcHBlbmQpICAgICAjIFNhbWUgYXMgQnVpbHRpbkZ1bmN0aW9uVHlwZQorCitNb2R1bGVUeXBlID0gdHlwZShzeXMpCitGaWxlVHlwZSA9IGZpbGUKK1hSYW5nZVR5cGUgPSB4cmFuZ2UKKwordHJ5OgorICAgIHJhaXNlIFR5cGVFcnJvcgorZXhjZXB0IFR5cGVFcnJvcjoKKyAgICB0YiA9IHN5cy5leGNfaW5mbygpWzJdCisgICAgVHJhY2ViYWNrVHlwZSA9IHR5cGUodGIpCisgICAgRnJhbWVUeXBlID0gdHlwZSh0Yi50Yl9mcmFtZSkKKyAgICBkZWwgdGIKKworU2xpY2VUeXBlID0gc2xpY2UKK0VsbGlwc2lzVHlwZSA9IHR5cGUoRWxsaXBzaXMpCisKK0RpY3RQcm94eVR5cGUgPSB0eXBlKFR5cGVUeXBlLl9fZGljdF9fKQorTm90SW1wbGVtZW50ZWRUeXBlID0gdHlwZShOb3RJbXBsZW1lbnRlZCkKKworIyBGb3IgSnl0aG9uLCB0aGUgZm9sbG93aW5nIHR3byB0eXBlcyBhcmUgaWRlbnRpY2FsCitHZXRTZXREZXNjcmlwdG9yVHlwZSA9IHR5cGUoRnVuY3Rpb25UeXBlLmZ1bmNfY29kZSkKK01lbWJlckRlc2NyaXB0b3JUeXBlID0gdHlwZShGdW5jdGlvblR5cGUuZnVuY19nbG9iYWxzKQorCitkZWwgc3lzLCBfZiwgX2csIF9DLCBfeCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm90IGZvciBleHBvcnQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdHlwZXMucHljIGIvbGliL3B5dGhvbjIuNy90eXBlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkNWQ3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdHlwZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdHlwZXMucHlvIGIvbGliL3B5dGhvbjIuNy90eXBlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkNWQ3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdHlwZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMWEzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNjkgQEAKKyIiIgorUHl0aG9uIHVuaXQgdGVzdGluZyBmcmFtZXdvcmssIGJhc2VkIG9uIEVyaWNoIEdhbW1hJ3MgSlVuaXQgYW5kIEtlbnQgQmVjaydzCitTbWFsbHRhbGsgdGVzdGluZyBmcmFtZXdvcmsuCisKK1RoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBjb3JlIGZyYW1ld29yayBjbGFzc2VzIHRoYXQgZm9ybSB0aGUgYmFzaXMgb2YKK3NwZWNpZmljIHRlc3QgY2FzZXMgYW5kIHN1aXRlcyAoVGVzdENhc2UsIFRlc3RTdWl0ZSBldGMuKSwgYW5kIGFsc28gYQordGV4dC1iYXNlZCB1dGlsaXR5IGNsYXNzIGZvciBydW5uaW5nIHRoZSB0ZXN0cyBhbmQgcmVwb3J0aW5nIHRoZSByZXN1bHRzCisgKFRleHRUZXN0UnVubmVyKS4KKworU2ltcGxlIHVzYWdlOgorCisgICAgaW1wb3J0IHVuaXR0ZXN0CisKKyAgICBjbGFzcyBJbnRlZ2VyQXJpdGhtZW50aWNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgIGRlZiB0ZXN0QWRkKHNlbGYpOiAgIyMgdGVzdCBtZXRob2QgbmFtZXMgYmVnaW4gJ3Rlc3QqJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMSArIDIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwICsgMSwgMSkKKyAgICAgICAgZGVmIHRlc3RNdWx0aXBseShzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAgKiAxMCksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg1ICogOCksIDQwKQorCisgICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAgICAgdW5pdHRlc3QubWFpbigpCisKK0Z1cnRoZXIgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBidW5kbGVkIGRvY3VtZW50YXRpb24sIGFuZCBmcm9tCisKKyAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3VuaXR0ZXN0Lmh0bWwKKworQ29weXJpZ2h0IChjKSAxOTk5LTIwMDMgU3RldmUgUHVyY2VsbAorQ29weXJpZ2h0IChjKSAyMDAzLTIwMTAgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KK1RoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgbWF5IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQeXRob24gaXRzZWxmLCBzbyBsb25nIGFzIHRoaXMgY29weXJpZ2h0IG1lc3NhZ2UKK2FuZCBkaXNjbGFpbWVyIGFyZSByZXRhaW5lZCBpbiB0aGVpciBvcmlnaW5hbCBmb3JtLgorCitJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBUTyBBTlkgUEFSVFkgRk9SIERJUkVDVCwgSU5ESVJFQ1QsCitTUEVDSUFMLCBJTkNJREVOVEFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRgorVEhJUyBDT0RFLCBFVkVOIElGIFRIRSBBVVRIT1IgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSAorREFNQUdFLgorCitUSEUgQVVUSE9SIFNQRUNJRklDQUxMWSBESVNDTEFJTVMgQU5ZIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBDT0RFIFBST1ZJREVEIEhFUkVVTkRFUiBJUyBPTiBBTiAiQVMgSVMiIEJBU0lTLAorQU5EIFRIRVJFIElTIE5PIE9CTElHQVRJT04gV0hBVFNPRVZFUiBUTyBQUk9WSURFIE1BSU5URU5BTkNFLAorU1VQUE9SVCwgVVBEQVRFUywgRU5IQU5DRU1FTlRTLCBPUiBNT0RJRklDQVRJT05TLgorIiIiCisKK19fYWxsX18gPSBbJ1Rlc3RSZXN1bHQnLCAnVGVzdENhc2UnLCAnVGVzdFN1aXRlJywKKyAgICAgICAgICAgJ1RleHRUZXN0UnVubmVyJywgJ1Rlc3RMb2FkZXInLCAnRnVuY3Rpb25UZXN0Q2FzZScsICdtYWluJywKKyAgICAgICAgICAgJ2RlZmF1bHRUZXN0TG9hZGVyJywgJ1NraXBUZXN0JywgJ3NraXAnLCAnc2tpcElmJywgJ3NraXBVbmxlc3MnLAorICAgICAgICAgICAnZXhwZWN0ZWRGYWlsdXJlJywgJ1RleHRUZXN0UmVzdWx0JywgJ2luc3RhbGxIYW5kbGVyJywKKyAgICAgICAgICAgJ3JlZ2lzdGVyUmVzdWx0JywgJ3JlbW92ZVJlc3VsdCcsICdyZW1vdmVIYW5kbGVyJ10KKworIyBFeHBvc2Ugb2Jzb2xldGUgZnVuY3Rpb25zIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorX19hbGxfXy5leHRlbmQoWydnZXRUZXN0Q2FzZU5hbWVzJywgJ21ha2VTdWl0ZScsICdmaW5kVGVzdENhc2VzJ10pCisKK19fdW5pdHRlc3QgPSBUcnVlCisKK2Zyb20gLnJlc3VsdCBpbXBvcnQgVGVzdFJlc3VsdAorZnJvbSAuY2FzZSBpbXBvcnQgKFRlc3RDYXNlLCBGdW5jdGlvblRlc3RDYXNlLCBTa2lwVGVzdCwgc2tpcCwgc2tpcElmLAorICAgICAgICAgICAgICAgICAgIHNraXBVbmxlc3MsIGV4cGVjdGVkRmFpbHVyZSkKK2Zyb20gLnN1aXRlIGltcG9ydCBCYXNlVGVzdFN1aXRlLCBUZXN0U3VpdGUKK2Zyb20gLmxvYWRlciBpbXBvcnQgKFRlc3RMb2FkZXIsIGRlZmF1bHRUZXN0TG9hZGVyLCBtYWtlU3VpdGUsIGdldFRlc3RDYXNlTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICBmaW5kVGVzdENhc2VzKQorZnJvbSAubWFpbiBpbXBvcnQgVGVzdFByb2dyYW0sIG1haW4KK2Zyb20gLnJ1bm5lciBpbXBvcnQgVGV4dFRlc3RSdW5uZXIsIFRleHRUZXN0UmVzdWx0Citmcm9tIC5zaWduYWxzIGltcG9ydCBpbnN0YWxsSGFuZGxlciwgcmVnaXN0ZXJSZXN1bHQsIHJlbW92ZVJlc3VsdCwgcmVtb3ZlSGFuZGxlcgorCisjIGRlcHJlY2F0ZWQKK19UZXh0VGVzdFJlc3VsdCA9IFRleHRUZXN0UmVzdWx0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OThkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OThkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L19fbWFpbl9fLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX21haW5fXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzIwMDUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX21haW5fXy5weQpAQCAtMCwwICsxLDEyIEBACisiIiJNYWluIGVudHJ5IHBvaW50IiIiCisKK2ltcG9ydCBzeXMKK2lmIHN5cy5hcmd2WzBdLmVuZHN3aXRoKCJfX21haW5fXy5weSIpOgorICAgIHN5cy5hcmd2WzBdID0gInB5dGhvbiAtbSB1bml0dGVzdCIKKworX191bml0dGVzdCA9IFRydWUKKworZnJvbSAubWFpbiBpbXBvcnQgbWFpbiwgVGVzdFByb2dyYW0sIFVTQUdFX0FTX01BSU4KK1Rlc3RQcm9ncmFtLlVTQUdFID0gVVNBR0VfQVNfTUFJTgorCittYWluKG1vZHVsZT1Ob25lKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX21haW5fXy5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L19fbWFpbl9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjExZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX21haW5fXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX21haW5fXy5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L19fbWFpbl9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjExZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX21haW5fXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9jYXNlLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9jYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwY2I0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L2Nhc2UucHkKQEAgLTAsMCArMSwxMDc2IEBACisiIiJUZXN0IGNhc2UgaW1wbGVtZW50YXRpb24iIiIKKworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgc3lzCitpbXBvcnQgZnVuY3Rvb2xzCitpbXBvcnQgZGlmZmxpYgoraW1wb3J0IHBwcmludAoraW1wb3J0IHJlCitpbXBvcnQgdHlwZXMKK2ltcG9ydCB3YXJuaW5ncworCitmcm9tIC4gaW1wb3J0IHJlc3VsdAorZnJvbSAudXRpbCBpbXBvcnQgKAorICAgIHN0cmNsYXNzLCBzYWZlX3JlcHIsIHVub3JkZXJhYmxlX2xpc3RfZGlmZmVyZW5jZSwKKyAgICBfY291bnRfZGlmZl9hbGxfcHVycG9zZSwgX2NvdW50X2RpZmZfaGFzaGFibGUKKykKKworCitfX3VuaXR0ZXN0ID0gVHJ1ZQorCisKK0RJRkZfT01JVFRFRCA9ICgnXG5EaWZmIGlzICVzIGNoYXJhY3RlcnMgbG9uZy4gJworICAgICAgICAgICAgICAgICAnU2V0IHNlbGYubWF4RGlmZiB0byBOb25lIHRvIHNlZSBpdC4nKQorCitjbGFzcyBTa2lwVGVzdChFeGNlcHRpb24pOgorICAgICIiIgorICAgIFJhaXNlIHRoaXMgZXhjZXB0aW9uIGluIGEgdGVzdCB0byBza2lwIGl0LgorCisgICAgVXN1YWxseSB5b3UgY2FuIHVzZSBUZXN0Q2FzZS5za2lwVGVzdCgpIG9yIG9uZSBvZiB0aGUgc2tpcHBpbmcgZGVjb3JhdG9ycworICAgIGluc3RlYWQgb2YgcmFpc2luZyB0aGlzIGRpcmVjdGx5LgorICAgICIiIgorICAgIHBhc3MKKworY2xhc3MgX0V4cGVjdGVkRmFpbHVyZShFeGNlcHRpb24pOgorICAgICIiIgorICAgIFJhaXNlIHRoaXMgd2hlbiBhIHRlc3QgaXMgZXhwZWN0ZWQgdG8gZmFpbC4KKworICAgIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4Y19pbmZvKToKKyAgICAgICAgc3VwZXIoX0V4cGVjdGVkRmFpbHVyZSwgc2VsZikuX19pbml0X18oKQorICAgICAgICBzZWxmLmV4Y19pbmZvID0gZXhjX2luZm8KKworY2xhc3MgX1VuZXhwZWN0ZWRTdWNjZXNzKEV4Y2VwdGlvbik6CisgICAgIiIiCisgICAgVGhlIHRlc3Qgd2FzIHN1cHBvc2VkIHRvIGZhaWwsIGJ1dCBpdCBkaWRuJ3QhCisgICAgIiIiCisgICAgcGFzcworCitkZWYgX2lkKG9iaik6CisgICAgcmV0dXJuIG9iagorCitkZWYgc2tpcChyZWFzb24pOgorICAgICIiIgorICAgIFVuY29uZGl0aW9uYWxseSBza2lwIGEgdGVzdC4KKyAgICAiIiIKKyAgICBkZWYgZGVjb3JhdG9yKHRlc3RfaXRlbSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRlc3RfaXRlbSwgKHR5cGUsIHR5cGVzLkNsYXNzVHlwZSkpOgorICAgICAgICAgICAgQGZ1bmN0b29scy53cmFwcyh0ZXN0X2l0ZW0pCisgICAgICAgICAgICBkZWYgc2tpcF93cmFwcGVyKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgcmFpc2UgU2tpcFRlc3QocmVhc29uKQorICAgICAgICAgICAgdGVzdF9pdGVtID0gc2tpcF93cmFwcGVyCisKKyAgICAgICAgdGVzdF9pdGVtLl9fdW5pdHRlc3Rfc2tpcF9fID0gVHJ1ZQorICAgICAgICB0ZXN0X2l0ZW0uX191bml0dGVzdF9za2lwX3doeV9fID0gcmVhc29uCisgICAgICAgIHJldHVybiB0ZXN0X2l0ZW0KKyAgICByZXR1cm4gZGVjb3JhdG9yCisKK2RlZiBza2lwSWYoY29uZGl0aW9uLCByZWFzb24pOgorICAgICIiIgorICAgIFNraXAgYSB0ZXN0IGlmIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4KKyAgICAiIiIKKyAgICBpZiBjb25kaXRpb246CisgICAgICAgIHJldHVybiBza2lwKHJlYXNvbikKKyAgICByZXR1cm4gX2lkCisKK2RlZiBza2lwVW5sZXNzKGNvbmRpdGlvbiwgcmVhc29uKToKKyAgICAiIiIKKyAgICBTa2lwIGEgdGVzdCB1bmxlc3MgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLgorICAgICIiIgorICAgIGlmIG5vdCBjb25kaXRpb246CisgICAgICAgIHJldHVybiBza2lwKHJlYXNvbikKKyAgICByZXR1cm4gX2lkCisKKworZGVmIGV4cGVjdGVkRmFpbHVyZShmdW5jKToKKyAgICBAZnVuY3Rvb2xzLndyYXBzKGZ1bmMpCisgICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICByYWlzZSBfRXhwZWN0ZWRGYWlsdXJlKHN5cy5leGNfaW5mbygpKQorICAgICAgICByYWlzZSBfVW5leHBlY3RlZFN1Y2Nlc3MKKyAgICByZXR1cm4gd3JhcHBlcgorCisKK2NsYXNzIF9Bc3NlcnRSYWlzZXNDb250ZXh0KG9iamVjdCk6CisgICAgIiIiQSBjb250ZXh0IG1hbmFnZXIgdXNlZCB0byBpbXBsZW1lbnQgVGVzdENhc2UuYXNzZXJ0UmFpc2VzKiBtZXRob2RzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkLCB0ZXN0X2Nhc2UsIGV4cGVjdGVkX3JlZ2V4cD1Ob25lKToKKyAgICAgICAgc2VsZi5leHBlY3RlZCA9IGV4cGVjdGVkCisgICAgICAgIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiA9IHRlc3RfY2FzZS5mYWlsdXJlRXhjZXB0aW9uCisgICAgICAgIHNlbGYuZXhwZWN0ZWRfcmVnZXhwID0gZXhwZWN0ZWRfcmVnZXhwCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRiKToKKyAgICAgICAgaWYgZXhjX3R5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBleGNfbmFtZSA9IHNlbGYuZXhwZWN0ZWQuX19uYW1lX18KKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBleGNfbmFtZSA9IHN0cihzZWxmLmV4cGVjdGVkKQorICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJ7MH0gbm90IHJhaXNlZCIuZm9ybWF0KGV4Y19uYW1lKSkKKyAgICAgICAgaWYgbm90IGlzc3ViY2xhc3MoZXhjX3R5cGUsIHNlbGYuZXhwZWN0ZWQpOgorICAgICAgICAgICAgIyBsZXQgdW5leHBlY3RlZCBleGNlcHRpb25zIHBhc3MgdGhyb3VnaAorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHNlbGYuZXhjZXB0aW9uID0gZXhjX3ZhbHVlICMgc3RvcmUgZm9yIGxhdGVyIHJldHJpZXZhbAorICAgICAgICBpZiBzZWxmLmV4cGVjdGVkX3JlZ2V4cCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICBleHBlY3RlZF9yZWdleHAgPSBzZWxmLmV4cGVjdGVkX3JlZ2V4cAorICAgICAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkX3JlZ2V4cCwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBleHBlY3RlZF9yZWdleHAgPSByZS5jb21waWxlKGV4cGVjdGVkX3JlZ2V4cCkKKyAgICAgICAgaWYgbm90IGV4cGVjdGVkX3JlZ2V4cC5zZWFyY2goc3RyKGV4Y192YWx1ZSkpOgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKCciJXMiIGRvZXMgbm90IG1hdGNoICIlcyInICUKKyAgICAgICAgICAgICAgICAgICAgIChleHBlY3RlZF9yZWdleHAucGF0dGVybiwgc3RyKGV4Y192YWx1ZSkpKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIFRlc3RDYXNlKG9iamVjdCk6CisgICAgIiIiQSBjbGFzcyB3aG9zZSBpbnN0YW5jZXMgYXJlIHNpbmdsZSB0ZXN0IGNhc2VzLgorCisgICAgQnkgZGVmYXVsdCwgdGhlIHRlc3QgY29kZSBpdHNlbGYgc2hvdWxkIGJlIHBsYWNlZCBpbiBhIG1ldGhvZCBuYW1lZAorICAgICdydW5UZXN0Jy4KKworICAgIElmIHRoZSBmaXh0dXJlIG1heSBiZSB1c2VkIGZvciBtYW55IHRlc3QgY2FzZXMsIGNyZWF0ZSBhcworICAgIG1hbnkgdGVzdCBtZXRob2RzIGFzIGFyZSBuZWVkZWQuIFdoZW4gaW5zdGFudGlhdGluZyBzdWNoIGEgVGVzdENhc2UKKyAgICBzdWJjbGFzcywgc3BlY2lmeSBpbiB0aGUgY29uc3RydWN0b3IgYXJndW1lbnRzIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IG1ldGhvZAorICAgIHRoYXQgdGhlIGluc3RhbmNlIGlzIHRvIGV4ZWN1dGUuCisKKyAgICBUZXN0IGF1dGhvcnMgc2hvdWxkIHN1YmNsYXNzIFRlc3RDYXNlIGZvciB0aGVpciBvd24gdGVzdHMuIENvbnN0cnVjdGlvbgorICAgIGFuZCBkZWNvbnN0cnVjdGlvbiBvZiB0aGUgdGVzdCdzIGVudmlyb25tZW50ICgnZml4dHVyZScpIGNhbiBiZQorICAgIGltcGxlbWVudGVkIGJ5IG92ZXJyaWRpbmcgdGhlICdzZXRVcCcgYW5kICd0ZWFyRG93bicgbWV0aG9kcyByZXNwZWN0aXZlbHkuCisKKyAgICBJZiBpdCBpcyBuZWNlc3NhcnkgdG8gb3ZlcnJpZGUgdGhlIF9faW5pdF9fIG1ldGhvZCwgdGhlIGJhc2UgY2xhc3MKKyAgICBfX2luaXRfXyBtZXRob2QgbXVzdCBhbHdheXMgYmUgY2FsbGVkLiBJdCBpcyBpbXBvcnRhbnQgdGhhdCBzdWJjbGFzc2VzCisgICAgc2hvdWxkIG5vdCBjaGFuZ2UgdGhlIHNpZ25hdHVyZSBvZiB0aGVpciBfX2luaXRfXyBtZXRob2QsIHNpbmNlIGluc3RhbmNlcworICAgIG9mIHRoZSBjbGFzc2VzIGFyZSBpbnN0YW50aWF0ZWQgYXV0b21hdGljYWxseSBieSBwYXJ0cyBvZiB0aGUgZnJhbWV3b3JrCisgICAgaW4gb3JkZXIgdG8gYmUgcnVuLgorCisgICAgV2hlbiBzdWJjbGFzc2luZyBUZXN0Q2FzZSwgeW91IGNhbiBzZXQgdGhlc2UgYXR0cmlidXRlczoKKyAgICAqIGZhaWx1cmVFeGNlcHRpb246IGRldGVybWluZXMgd2hpY2ggZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIHdoZW4KKyAgICAgICAgdGhlIGluc3RhbmNlJ3MgYXNzZXJ0aW9uIG1ldGhvZHMgZmFpbDsgdGVzdCBtZXRob2RzIHJhaXNpbmcgdGhpcworICAgICAgICBleGNlcHRpb24gd2lsbCBiZSBkZWVtZWQgdG8gaGF2ZSAnZmFpbGVkJyByYXRoZXIgdGhhbiAnZXJyb3JlZCcuCisgICAgKiBsb25nTWVzc2FnZTogZGV0ZXJtaW5lcyB3aGV0aGVyIGxvbmcgbWVzc2FnZXMgKGluY2x1ZGluZyByZXByIG9mCisgICAgICAgIG9iamVjdHMgdXNlZCBpbiBhc3NlcnQgbWV0aG9kcykgd2lsbCBiZSBwcmludGVkIG9uIGZhaWx1cmUgaW4gKmFkZGl0aW9uKgorICAgICAgICB0byBhbnkgZXhwbGljaXQgbWVzc2FnZSBwYXNzZWQuCisgICAgKiBtYXhEaWZmOiBzZXRzIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIGRpZmYgaW4gZmFpbHVyZSBtZXNzYWdlcworICAgICAgICBieSBhc3NlcnQgbWV0aG9kcyB1c2luZyBkaWZmbGliLiBJdCBpcyBsb29rZWQgdXAgYXMgYW4gaW5zdGFuY2UKKyAgICAgICAgYXR0cmlidXRlIHNvIGNhbiBiZSBjb25maWd1cmVkIGJ5IGluZGl2aWR1YWwgdGVzdHMgaWYgcmVxdWlyZWQuCisgICAgIiIiCisKKyAgICBmYWlsdXJlRXhjZXB0aW9uID0gQXNzZXJ0aW9uRXJyb3IKKworICAgIGxvbmdNZXNzYWdlID0gRmFsc2UKKworICAgIG1heERpZmYgPSA4MCo4CisKKyAgICAjIElmIGEgc3RyaW5nIGlzIGxvbmdlciB0aGFuIF9kaWZmVGhyZXNob2xkLCB1c2Ugbm9ybWFsIGNvbXBhcmlzb24gaW5zdGVhZAorICAgICMgb2YgZGlmZmxpYi4gIFNlZSAjMTE3NjMuCisgICAgX2RpZmZUaHJlc2hvbGQgPSAyKioxNgorCisgICAgIyBBdHRyaWJ1dGUgdXNlZCBieSBUZXN0U3VpdGUgZm9yIGNsYXNzU2V0VXAKKworICAgIF9jbGFzc1NldHVwRmFpbGVkID0gRmFsc2UKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPSdydW5UZXN0Jyk6CisgICAgICAgICIiIkNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgdGhhdCB3aWxsIHVzZSB0aGUgbmFtZWQgdGVzdAorICAgICAgICAgICBtZXRob2Qgd2hlbiBleGVjdXRlZC4gUmFpc2VzIGEgVmFsdWVFcnJvciBpZiB0aGUgaW5zdGFuY2UgZG9lcworICAgICAgICAgICBub3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3Rlc3RNZXRob2ROYW1lID0gbWV0aG9kTmFtZQorICAgICAgICBzZWxmLl9yZXN1bHRGb3JEb0NsZWFudXBzID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0TWV0aG9kID0gZ2V0YXR0cihzZWxmLCBtZXRob2ROYW1lKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJubyBzdWNoIHRlc3QgbWV0aG9kIGluICVzOiAlcyIgJQorICAgICAgICAgICAgICAgICAgKHNlbGYuX19jbGFzc19fLCBtZXRob2ROYW1lKSkKKyAgICAgICAgc2VsZi5fdGVzdE1ldGhvZERvYyA9IHRlc3RNZXRob2QuX19kb2NfXworICAgICAgICBzZWxmLl9jbGVhbnVwcyA9IFtdCisKKyAgICAgICAgIyBNYXAgdHlwZXMgdG8gY3VzdG9tIGFzc2VydEVxdWFsIGZ1bmN0aW9ucyB0aGF0IHdpbGwgY29tcGFyZQorICAgICAgICAjIGluc3RhbmNlcyBvZiBzYWlkIHR5cGUgaW4gbW9yZSBkZXRhaWwgdG8gZ2VuZXJhdGUgYSBtb3JlIHVzZWZ1bAorICAgICAgICAjIGVycm9yIG1lc3NhZ2UuCisgICAgICAgIHNlbGYuX3R5cGVfZXF1YWxpdHlfZnVuY3MgPSB7fQorICAgICAgICBzZWxmLmFkZFR5cGVFcXVhbGl0eUZ1bmMoZGljdCwgJ2Fzc2VydERpY3RFcXVhbCcpCisgICAgICAgIHNlbGYuYWRkVHlwZUVxdWFsaXR5RnVuYyhsaXN0LCAnYXNzZXJ0TGlzdEVxdWFsJykKKyAgICAgICAgc2VsZi5hZGRUeXBlRXF1YWxpdHlGdW5jKHR1cGxlLCAnYXNzZXJ0VHVwbGVFcXVhbCcpCisgICAgICAgIHNlbGYuYWRkVHlwZUVxdWFsaXR5RnVuYyhzZXQsICdhc3NlcnRTZXRFcXVhbCcpCisgICAgICAgIHNlbGYuYWRkVHlwZUVxdWFsaXR5RnVuYyhmcm96ZW5zZXQsICdhc3NlcnRTZXRFcXVhbCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYWRkVHlwZUVxdWFsaXR5RnVuYyh1bmljb2RlLCAnYXNzZXJ0TXVsdGlMaW5lRXF1YWwnKQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgIyBObyB1bmljb2RlIHN1cHBvcnQgaW4gdGhpcyBidWlsZAorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGFkZFR5cGVFcXVhbGl0eUZ1bmMoc2VsZiwgdHlwZW9iaiwgZnVuY3Rpb24pOgorICAgICAgICAiIiJBZGQgYSB0eXBlIHNwZWNpZmljIGFzc2VydEVxdWFsIHN0eWxlIGZ1bmN0aW9uIHRvIGNvbXBhcmUgYSB0eXBlLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGZvciB1c2UgYnkgVGVzdENhc2Ugc3ViY2xhc3NlcyB0aGF0IG5lZWQgdG8gcmVnaXN0ZXIKKyAgICAgICAgdGhlaXIgb3duIHR5cGUgZXF1YWxpdHkgZnVuY3Rpb25zIHRvIHByb3ZpZGUgbmljZXIgZXJyb3IgbWVzc2FnZXMuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIHR5cGVvYmo6IFRoZSBkYXRhIHR5cGUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG9uIHdoZW4gYm90aCB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgYXJlIG9mIHRoZSBzYW1lIHR5cGUgaW4gYXNzZXJ0RXF1YWwoKS4KKyAgICAgICAgICAgIGZ1bmN0aW9uOiBUaGUgY2FsbGFibGUgdGFraW5nIHR3byBhcmd1bWVudHMgYW5kIGFuIG9wdGlvbmFsCisgICAgICAgICAgICAgICAgICAgIG1zZz0gYXJndW1lbnQgdGhhdCByYWlzZXMgc2VsZi5mYWlsdXJlRXhjZXB0aW9uIHdpdGggYQorICAgICAgICAgICAgICAgICAgICB1c2VmdWwgZXJyb3IgbWVzc2FnZSB3aGVuIHRoZSB0d28gYXJndW1lbnRzIGFyZSBub3QgZXF1YWwuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl90eXBlX2VxdWFsaXR5X2Z1bmNzW3R5cGVvYmpdID0gZnVuY3Rpb24KKworICAgIGRlZiBhZGRDbGVhbnVwKHNlbGYsIGZ1bmN0aW9uLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiJBZGQgYSBmdW5jdGlvbiwgd2l0aCBhcmd1bWVudHMsIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB0ZXN0IGlzCisgICAgICAgIGNvbXBsZXRlZC4gRnVuY3Rpb25zIGFkZGVkIGFyZSBjYWxsZWQgb24gYSBMSUZPIGJhc2lzIGFuZCBhcmUKKyAgICAgICAgY2FsbGVkIGFmdGVyIHRlYXJEb3duIG9uIHRlc3QgZmFpbHVyZSBvciBzdWNjZXNzLgorCisgICAgICAgIENsZWFudXAgaXRlbXMgYXJlIGNhbGxlZCBldmVuIGlmIHNldFVwIGZhaWxzICh1bmxpa2UgdGVhckRvd24pLiIiIgorICAgICAgICBzZWxmLl9jbGVhbnVwcy5hcHBlbmQoKGZ1bmN0aW9uLCBhcmdzLCBrd2FyZ3MpKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiSG9vayBtZXRob2QgZm9yIHNldHRpbmcgdXAgdGhlIHRlc3QgZml4dHVyZSBiZWZvcmUgZXhlcmNpc2luZyBpdC4iCisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIkhvb2sgbWV0aG9kIGZvciBkZWNvbnN0cnVjdGluZyB0aGUgdGVzdCBmaXh0dXJlIGFmdGVyIHRlc3RpbmcgaXQuIgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICAiSG9vayBtZXRob2QgZm9yIHNldHRpbmcgdXAgY2xhc3MgZml4dHVyZSBiZWZvcmUgcnVubmluZyB0ZXN0cyBpbiB0aGUgY2xhc3MuIgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgIkhvb2sgbWV0aG9kIGZvciBkZWNvbnN0cnVjdGluZyB0aGUgY2xhc3MgZml4dHVyZSBhZnRlciBydW5uaW5nIGFsbCB0ZXN0cyBpbiB0aGUgY2xhc3MuIgorCisgICAgZGVmIGNvdW50VGVzdENhc2VzKHNlbGYpOgorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIGRlZmF1bHRUZXN0UmVzdWx0KHNlbGYpOgorICAgICAgICByZXR1cm4gcmVzdWx0LlRlc3RSZXN1bHQoKQorCisgICAgZGVmIHNob3J0RGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgICIiIlJldHVybnMgYSBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGVzdCwgb3IgTm9uZSBpZiBubworICAgICAgICBkZXNjcmlwdGlvbiBoYXMgYmVlbiBwcm92aWRlZC4KKworICAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBsaW5lIG9mCisgICAgICAgIHRoZSBzcGVjaWZpZWQgdGVzdCBtZXRob2QncyBkb2NzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICBkb2MgPSBzZWxmLl90ZXN0TWV0aG9kRG9jCisgICAgICAgIHJldHVybiBkb2MgYW5kIGRvYy5zcGxpdCgiXG4iKVswXS5zdHJpcCgpIG9yIE5vbmUKKworCisgICAgZGVmIGlkKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzLiVzIiAlIChzdHJjbGFzcyhzZWxmLl9fY2xhc3NfXyksIHNlbGYuX3Rlc3RNZXRob2ROYW1lKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHR5cGUoc2VsZikgaXMgbm90IHR5cGUob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Rlc3RNZXRob2ROYW1lID09IG90aGVyLl90ZXN0TWV0aG9kTmFtZQorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaCgodHlwZShzZWxmKSwgc2VsZi5fdGVzdE1ldGhvZE5hbWUpKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiJXMgKCVzKSIgJSAoc2VsZi5fdGVzdE1ldGhvZE5hbWUsIHN0cmNsYXNzKHNlbGYuX19jbGFzc19fKSkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8JXMgdGVzdE1ldGhvZD0lcz4iICUgXAorICAgICAgICAgICAgICAgKHN0cmNsYXNzKHNlbGYuX19jbGFzc19fKSwgc2VsZi5fdGVzdE1ldGhvZE5hbWUpCisKKyAgICBkZWYgX2FkZFNraXAoc2VsZiwgcmVzdWx0LCByZWFzb24pOgorICAgICAgICBhZGRTa2lwID0gZ2V0YXR0cihyZXN1bHQsICdhZGRTa2lwJywgTm9uZSkKKyAgICAgICAgaWYgYWRkU2tpcCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFkZFNraXAoc2VsZiwgcmVhc29uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigiVGVzdFJlc3VsdCBoYXMgbm8gYWRkU2tpcCBtZXRob2QsIHNraXBzIG5vdCByZXBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nLCAyKQorICAgICAgICAgICAgcmVzdWx0LmFkZFN1Y2Nlc3Moc2VsZikKKworICAgIGRlZiBydW4oc2VsZiwgcmVzdWx0PU5vbmUpOgorICAgICAgICBvcmlnX3Jlc3VsdCA9IHJlc3VsdAorICAgICAgICBpZiByZXN1bHQgaXMgTm9uZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZGVmYXVsdFRlc3RSZXN1bHQoKQorICAgICAgICAgICAgc3RhcnRUZXN0UnVuID0gZ2V0YXR0cihyZXN1bHQsICdzdGFydFRlc3RSdW4nLCBOb25lKQorICAgICAgICAgICAgaWYgc3RhcnRUZXN0UnVuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHN0YXJ0VGVzdFJ1bigpCisKKyAgICAgICAgc2VsZi5fcmVzdWx0Rm9yRG9DbGVhbnVwcyA9IHJlc3VsdAorICAgICAgICByZXN1bHQuc3RhcnRUZXN0KHNlbGYpCisKKyAgICAgICAgdGVzdE1ldGhvZCA9IGdldGF0dHIoc2VsZiwgc2VsZi5fdGVzdE1ldGhvZE5hbWUpCisgICAgICAgIGlmIChnZXRhdHRyKHNlbGYuX19jbGFzc19fLCAiX191bml0dGVzdF9za2lwX18iLCBGYWxzZSkgb3IKKyAgICAgICAgICAgIGdldGF0dHIodGVzdE1ldGhvZCwgIl9fdW5pdHRlc3Rfc2tpcF9fIiwgRmFsc2UpKToKKyAgICAgICAgICAgICMgSWYgdGhlIGNsYXNzIG9yIG1ldGhvZCB3YXMgc2tpcHBlZC4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBza2lwX3doeSA9IChnZXRhdHRyKHNlbGYuX19jbGFzc19fLCAnX191bml0dGVzdF9za2lwX3doeV9fJywgJycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZ2V0YXR0cih0ZXN0TWV0aG9kLCAnX191bml0dGVzdF9za2lwX3doeV9fJywgJycpKQorICAgICAgICAgICAgICAgIHNlbGYuX2FkZFNraXAocmVzdWx0LCBza2lwX3doeSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcmVzdWx0LnN0b3BUZXN0KHNlbGYpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3VjY2VzcyA9IEZhbHNlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRVcCgpCisgICAgICAgICAgICBleGNlcHQgU2tpcFRlc3QgYXMgZToKKyAgICAgICAgICAgICAgICBzZWxmLl9hZGRTa2lwKHJlc3VsdCwgc3RyKGUpKQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEVycm9yKHNlbGYsIHN5cy5leGNfaW5mbygpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRlc3RNZXRob2QoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBleGNlcHQgc2VsZi5mYWlsdXJlRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkRmFpbHVyZShzZWxmLCBzeXMuZXhjX2luZm8oKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgX0V4cGVjdGVkRmFpbHVyZSBhcyBlOgorICAgICAgICAgICAgICAgICAgICBhZGRFeHBlY3RlZEZhaWx1cmUgPSBnZXRhdHRyKHJlc3VsdCwgJ2FkZEV4cGVjdGVkRmFpbHVyZScsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgIGlmIGFkZEV4cGVjdGVkRmFpbHVyZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEV4cGVjdGVkRmFpbHVyZShzZWxmLCBlLmV4Y19pbmZvKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiVGVzdFJlc3VsdCBoYXMgbm8gYWRkRXhwZWN0ZWRGYWlsdXJlIG1ldGhvZCwgcmVwb3J0aW5nIGFzIHBhc3NlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZFN1Y2Nlc3Moc2VsZikKKyAgICAgICAgICAgICAgICBleGNlcHQgX1VuZXhwZWN0ZWRTdWNjZXNzOgorICAgICAgICAgICAgICAgICAgICBhZGRVbmV4cGVjdGVkU3VjY2VzcyA9IGdldGF0dHIocmVzdWx0LCAnYWRkVW5leHBlY3RlZFN1Y2Nlc3MnLCBOb25lKQorICAgICAgICAgICAgICAgICAgICBpZiBhZGRVbmV4cGVjdGVkU3VjY2VzcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFVuZXhwZWN0ZWRTdWNjZXNzKHNlbGYpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKCJUZXN0UmVzdWx0IGhhcyBubyBhZGRVbmV4cGVjdGVkU3VjY2VzcyBtZXRob2QsIHJlcG9ydGluZyBhcyBmYWlsdXJlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEZhaWx1cmUoc2VsZiwgc3lzLmV4Y19pbmZvKCkpCisgICAgICAgICAgICAgICAgZXhjZXB0IFNraXBUZXN0IGFzIGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2FkZFNraXAocmVzdWx0LCBzdHIoZSkpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkRXJyb3Ioc2VsZiwgc3lzLmV4Y19pbmZvKCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IFRydWUKKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZWFyRG93bigpCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEVycm9yKHNlbGYsIHN5cy5leGNfaW5mbygpKQorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gRmFsc2UKKworICAgICAgICAgICAgY2xlYW5VcFN1Y2Nlc3MgPSBzZWxmLmRvQ2xlYW51cHMoKQorICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGNsZWFuVXBTdWNjZXNzCisgICAgICAgICAgICBpZiBzdWNjZXNzOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRTdWNjZXNzKHNlbGYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICByZXN1bHQuc3RvcFRlc3Qoc2VsZikKKyAgICAgICAgICAgIGlmIG9yaWdfcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc3RvcFRlc3RSdW4gPSBnZXRhdHRyKHJlc3VsdCwgJ3N0b3BUZXN0UnVuJywgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiBzdG9wVGVzdFJ1biBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc3RvcFRlc3RSdW4oKQorCisgICAgZGVmIGRvQ2xlYW51cHMoc2VsZik6CisgICAgICAgICIiIkV4ZWN1dGUgYWxsIGNsZWFudXAgZnVuY3Rpb25zLiBOb3JtYWxseSBjYWxsZWQgZm9yIHlvdSBhZnRlcgorICAgICAgICB0ZWFyRG93bi4iIiIKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fcmVzdWx0Rm9yRG9DbGVhbnVwcworICAgICAgICBvayA9IFRydWUKKyAgICAgICAgd2hpbGUgc2VsZi5fY2xlYW51cHM6CisgICAgICAgICAgICBmdW5jdGlvbiwgYXJncywga3dhcmdzID0gc2VsZi5fY2xlYW51cHMucG9wKC0xKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIG9rID0gRmFsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkRXJyb3Ioc2VsZiwgc3lzLmV4Y19pbmZvKCkpCisgICAgICAgIHJldHVybiBvaworCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICByZXR1cm4gc2VsZi5ydW4oKmFyZ3MsICoqa3dkcykKKworICAgIGRlZiBkZWJ1ZyhzZWxmKToKKyAgICAgICAgIiIiUnVuIHRoZSB0ZXN0IHdpdGhvdXQgY29sbGVjdGluZyBlcnJvcnMgaW4gYSBUZXN0UmVzdWx0IiIiCisgICAgICAgIHNlbGYuc2V0VXAoKQorICAgICAgICBnZXRhdHRyKHNlbGYsIHNlbGYuX3Rlc3RNZXRob2ROYW1lKSgpCisgICAgICAgIHNlbGYudGVhckRvd24oKQorICAgICAgICB3aGlsZSBzZWxmLl9jbGVhbnVwczoKKyAgICAgICAgICAgIGZ1bmN0aW9uLCBhcmdzLCBrd2FyZ3MgPSBzZWxmLl9jbGVhbnVwcy5wb3AoLTEpCisgICAgICAgICAgICBmdW5jdGlvbigqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgc2tpcFRlc3Qoc2VsZiwgcmVhc29uKToKKyAgICAgICAgIiIiU2tpcCB0aGlzIHRlc3QuIiIiCisgICAgICAgIHJhaXNlIFNraXBUZXN0KHJlYXNvbikKKworICAgIGRlZiBmYWlsKHNlbGYsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiRmFpbCBpbW1lZGlhdGVseSwgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4iIiIKKyAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKG1zZykKKworICAgIGRlZiBhc3NlcnRGYWxzZShzZWxmLCBleHByLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkNoZWNrIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UuIiIiCisgICAgICAgIGlmIGV4cHI6CisgICAgICAgICAgICBtc2cgPSBzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgIiVzIGlzIG5vdCBmYWxzZSIgJSBzYWZlX3JlcHIoZXhwcikpCisgICAgICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24obXNnKQorCisgICAgZGVmIGFzc2VydFRydWUoc2VsZiwgZXhwciwgbXNnPU5vbmUpOgorICAgICAgICAiIiJDaGVjayB0aGF0IHRoZSBleHByZXNzaW9uIGlzIHRydWUuIiIiCisgICAgICAgIGlmIG5vdCBleHByOgorICAgICAgICAgICAgbXNnID0gc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csICIlcyBpcyBub3QgdHJ1ZSIgJSBzYWZlX3JlcHIoZXhwcikpCisgICAgICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24obXNnKQorCisgICAgZGVmIF9mb3JtYXRNZXNzYWdlKHNlbGYsIG1zZywgc3RhbmRhcmRNc2cpOgorICAgICAgICAiIiJIb25vdXIgdGhlIGxvbmdNZXNzYWdlIGF0dHJpYnV0ZSB3aGVuIGdlbmVyYXRpbmcgZmFpbHVyZSBtZXNzYWdlcy4KKyAgICAgICAgSWYgbG9uZ01lc3NhZ2UgaXMgRmFsc2UgdGhpcyBtZWFuczoKKyAgICAgICAgKiBVc2Ugb25seSBhbiBleHBsaWNpdCBtZXNzYWdlIGlmIGl0IGlzIHByb3ZpZGVkCisgICAgICAgICogT3RoZXJ3aXNlIHVzZSB0aGUgc3RhbmRhcmQgbWVzc2FnZSBmb3IgdGhlIGFzc2VydAorCisgICAgICAgIElmIGxvbmdNZXNzYWdlIGlzIFRydWU6CisgICAgICAgICogVXNlIHRoZSBzdGFuZGFyZCBtZXNzYWdlCisgICAgICAgICogSWYgYW4gZXhwbGljaXQgbWVzc2FnZSBpcyBwcm92aWRlZCwgcGx1cyAnIDogJyBhbmQgdGhlIGV4cGxpY2l0IG1lc3NhZ2UKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLmxvbmdNZXNzYWdlOgorICAgICAgICAgICAgcmV0dXJuIG1zZyBvciBzdGFuZGFyZE1zZworICAgICAgICBpZiBtc2cgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzdGFuZGFyZE1zZworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIGRvbid0IHN3aXRjaCB0byAne30nIGZvcm1hdHRpbmcgaW4gUHl0aG9uIDIuWAorICAgICAgICAgICAgIyBpdCBjaGFuZ2VzIHRoZSB3YXkgdW5pY29kZSBpbnB1dCBpcyBoYW5kbGVkCisgICAgICAgICAgICByZXR1cm4gJyVzIDogJXMnICUgKHN0YW5kYXJkTXNnLCBtc2cpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gICclcyA6ICVzJyAlIChzYWZlX3JlcHIoc3RhbmRhcmRNc2cpLCBzYWZlX3JlcHIobXNnKSkKKworCisgICAgZGVmIGFzc2VydFJhaXNlcyhzZWxmLCBleGNDbGFzcywgY2FsbGFibGVPYmo9Tm9uZSwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiRmFpbCB1bmxlc3MgYW4gZXhjZXB0aW9uIG9mIGNsYXNzIGV4Y0NsYXNzIGlzIHJhaXNlZAorICAgICAgICAgICBieSBjYWxsYWJsZU9iaiB3aGVuIGludm9rZWQgd2l0aCBhcmd1bWVudHMgYXJncyBhbmQga2V5d29yZAorICAgICAgICAgICBhcmd1bWVudHMga3dhcmdzLiBJZiBhIGRpZmZlcmVudCB0eXBlIG9mIGV4Y2VwdGlvbiBpcworICAgICAgICAgICByYWlzZWQsIGl0IHdpbGwgbm90IGJlIGNhdWdodCwgYW5kIHRoZSB0ZXN0IGNhc2Ugd2lsbCBiZQorICAgICAgICAgICBkZWVtZWQgdG8gaGF2ZSBzdWZmZXJlZCBhbiBlcnJvciwgZXhhY3RseSBhcyBmb3IgYW4KKyAgICAgICAgICAgdW5leHBlY3RlZCBleGNlcHRpb24uCisKKyAgICAgICAgICAgSWYgY2FsbGVkIHdpdGggY2FsbGFibGVPYmogb21pdHRlZCBvciBOb25lLCB3aWxsIHJldHVybiBhCisgICAgICAgICAgIGNvbnRleHQgb2JqZWN0IHVzZWQgbGlrZSB0aGlzOjoKKworICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU29tZUV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgICAgIGRvX3NvbWV0aGluZygpCisKKyAgICAgICAgICAgVGhlIGNvbnRleHQgbWFuYWdlciBrZWVwcyBhIHJlZmVyZW5jZSB0byB0aGUgZXhjZXB0aW9uIGFzCisgICAgICAgICAgIHRoZSAnZXhjZXB0aW9uJyBhdHRyaWJ1dGUuIFRoaXMgYWxsb3dzIHlvdSB0byBpbnNwZWN0IHRoZQorICAgICAgICAgICBleGNlcHRpb24gYWZ0ZXIgdGhlIGFzc2VydGlvbjo6CisKKyAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU29tZUV4Y2VwdGlvbikgYXMgY206CisgICAgICAgICAgICAgICAgICAgZG9fc29tZXRoaW5nKCkKKyAgICAgICAgICAgICAgIHRoZV9leGNlcHRpb24gPSBjbS5leGNlcHRpb24KKyAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhlX2V4Y2VwdGlvbi5lcnJvcl9jb2RlLCAzKQorICAgICAgICAiIiIKKyAgICAgICAgY29udGV4dCA9IF9Bc3NlcnRSYWlzZXNDb250ZXh0KGV4Y0NsYXNzLCBzZWxmKQorICAgICAgICBpZiBjYWxsYWJsZU9iaiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQKKyAgICAgICAgd2l0aCBjb250ZXh0OgorICAgICAgICAgICAgY2FsbGFibGVPYmooKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIF9nZXRBc3NlcnRFcXVhbGl0eUZ1bmMoc2VsZiwgZmlyc3QsIHNlY29uZCk6CisgICAgICAgICIiIkdldCBhIGRldGFpbGVkIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHRoZSB0eXBlcyBvZiB0aGUgdHdvIGFyZ3MuCisKKyAgICAgICAgUmV0dXJuczogQSBjYWxsYWJsZSBhY2NlcHRpbmcgKGZpcnN0LCBzZWNvbmQsIG1zZz1Ob25lKSB0aGF0IHdpbGwKKyAgICAgICAgcmFpc2UgYSBmYWlsdXJlIGV4Y2VwdGlvbiBpZiBmaXJzdCAhPSBzZWNvbmQgd2l0aCBhIHVzZWZ1bCBodW1hbgorICAgICAgICByZWFkYWJsZSBlcnJvciBtZXNzYWdlIGZvciB0aG9zZSB0eXBlcy4KKyAgICAgICAgIiIiCisgICAgICAgICMKKyAgICAgICAgIyBOT1RFKGdyZWdvcnkucC5zbWl0aCk6IEkgY29uc2lkZXJlZCBpc2luc3RhbmNlKGZpcnN0LCB0eXBlKHNlY29uZCkpCisgICAgICAgICMgYW5kIHZpY2UgdmVyc2EuICBJIG9wdGVkIGZvciB0aGUgY29uc2VydmF0aXZlIGFwcHJvYWNoIGluIGNhc2UKKyAgICAgICAgIyBzdWJjbGFzc2VzIGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgY29tcGFyZWQgaW4gZGV0YWlsIHRvIHRoZWlyIHN1cGVyCisgICAgICAgICMgY2xhc3MgaW5zdGFuY2VzIHVzaW5nIGEgdHlwZSBlcXVhbGl0eSBmdW5jLiAgVGhpcyBtZWFucyB0ZXN0aW5nCisgICAgICAgICMgc3VidHlwZXMgd29uJ3QgYXV0b21hZ2ljYWxseSB1c2UgdGhlIGRldGFpbGVkIGNvbXBhcmlzb24uICBDYWxsZXJzCisgICAgICAgICMgc2hvdWxkIHVzZSB0aGVpciB0eXBlIHNwZWNpZmljIGFzc2VydFNwYW1FcXVhbCBtZXRob2QgdG8gY29tcGFyZQorICAgICAgICAjIHN1YmNsYXNzZXMgaWYgdGhlIGRldGFpbGVkIGNvbXBhcmlzb24gaXMgZGVzaXJlZCBhbmQgYXBwcm9wcmlhdGUuCisgICAgICAgICMgU2VlIHRoZSBkaXNjdXNzaW9uIGluIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyNTc4LgorICAgICAgICAjCisgICAgICAgIGlmIHR5cGUoZmlyc3QpIGlzIHR5cGUoc2Vjb25kKToKKyAgICAgICAgICAgIGFzc2VydGVyID0gc2VsZi5fdHlwZV9lcXVhbGl0eV9mdW5jcy5nZXQodHlwZShmaXJzdCkpCisgICAgICAgICAgICBpZiBhc3NlcnRlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFzc2VydGVyLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0ZXIgPSBnZXRhdHRyKHNlbGYsIGFzc2VydGVyKQorICAgICAgICAgICAgICAgIHJldHVybiBhc3NlcnRlcgorCisgICAgICAgIHJldHVybiBzZWxmLl9iYXNlQXNzZXJ0RXF1YWwKKworICAgIGRlZiBfYmFzZUFzc2VydEVxdWFsKHNlbGYsIGZpcnN0LCBzZWNvbmQsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiVGhlIGRlZmF1bHQgYXNzZXJ0RXF1YWwgaW1wbGVtZW50YXRpb24sIG5vdCB0eXBlIHNwZWNpZmljLiIiIgorICAgICAgICBpZiBub3QgZmlyc3QgPT0gc2Vjb25kOgorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAnJXMgIT0gJXMnICUgKHNhZmVfcmVwcihmaXJzdCksIHNhZmVfcmVwcihzZWNvbmQpKQorICAgICAgICAgICAgbXNnID0gc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKQorICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKG1zZykKKworICAgIGRlZiBhc3NlcnRFcXVhbChzZWxmLCBmaXJzdCwgc2Vjb25kLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkZhaWwgaWYgdGhlIHR3byBvYmplY3RzIGFyZSB1bmVxdWFsIGFzIGRldGVybWluZWQgYnkgdGhlICc9PScKKyAgICAgICAgICAgb3BlcmF0b3IuCisgICAgICAgICIiIgorICAgICAgICBhc3NlcnRpb25fZnVuYyA9IHNlbGYuX2dldEFzc2VydEVxdWFsaXR5RnVuYyhmaXJzdCwgc2Vjb25kKQorICAgICAgICBhc3NlcnRpb25fZnVuYyhmaXJzdCwgc2Vjb25kLCBtc2c9bXNnKQorCisgICAgZGVmIGFzc2VydE5vdEVxdWFsKHNlbGYsIGZpcnN0LCBzZWNvbmQsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiRmFpbCBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGVxdWFsIGFzIGRldGVybWluZWQgYnkgdGhlICchPScKKyAgICAgICAgICAgb3BlcmF0b3IuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgZmlyc3QgIT0gc2Vjb25kOgorICAgICAgICAgICAgbXNnID0gc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csICclcyA9PSAlcycgJSAoc2FmZV9yZXByKGZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3JlcHIoc2Vjb25kKSkpCisgICAgICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24obXNnKQorCisKKyAgICBkZWYgYXNzZXJ0QWxtb3N0RXF1YWwoc2VsZiwgZmlyc3QsIHNlY29uZCwgcGxhY2VzPU5vbmUsIG1zZz1Ob25lLCBkZWx0YT1Ob25lKToKKyAgICAgICAgIiIiRmFpbCBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIHVuZXF1YWwgYXMgZGV0ZXJtaW5lZCBieSB0aGVpcgorICAgICAgICAgICBkaWZmZXJlbmNlIHJvdW5kZWQgdG8gdGhlIGdpdmVuIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcworICAgICAgICAgICAoZGVmYXVsdCA3KSBhbmQgY29tcGFyaW5nIHRvIHplcm8sIG9yIGJ5IGNvbXBhcmluZyB0aGF0IHRoZQorICAgICAgICAgICBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cyBpcyBtb3JlIHRoYW4gdGhlIGdpdmVuIGRlbHRhLgorCisgICAgICAgICAgIE5vdGUgdGhhdCBkZWNpbWFsIHBsYWNlcyAoZnJvbSB6ZXJvKSBhcmUgdXN1YWxseSBub3QgdGhlIHNhbWUKKyAgICAgICAgICAgYXMgc2lnbmlmaWNhbnQgZGlnaXRzIChtZWFzdXJlZCBmcm9tIHRoZSBtb3N0IHNpZ25maWNhbnQgZGlnaXQpLgorCisgICAgICAgICAgIElmIHRoZSB0d28gb2JqZWN0cyBjb21wYXJlIGVxdWFsIHRoZW4gdGhleSB3aWxsIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAgY29tcGFyZSBhbG1vc3QgZXF1YWwuCisgICAgICAgICIiIgorICAgICAgICBpZiBmaXJzdCA9PSBzZWNvbmQ6CisgICAgICAgICAgICAjIHNob3J0Y3V0CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgZGVsdGEgaXMgbm90IE5vbmUgYW5kIHBsYWNlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigic3BlY2lmeSBkZWx0YSBvciBwbGFjZXMgbm90IGJvdGgiKQorCisgICAgICAgIGlmIGRlbHRhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgYWJzKGZpcnN0IC0gc2Vjb25kKSA8PSBkZWx0YToKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAnJXMgIT0gJXMgd2l0aGluICVzIGRlbHRhJyAlIChzYWZlX3JlcHIoZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3JlcHIoc2Vjb25kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9yZXByKGRlbHRhKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHBsYWNlcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHBsYWNlcyA9IDcKKworICAgICAgICAgICAgaWYgcm91bmQoYWJzKHNlY29uZC1maXJzdCksIHBsYWNlcykgPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAnJXMgIT0gJXMgd2l0aGluICVyIHBsYWNlcycgJSAoc2FmZV9yZXByKGZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3JlcHIoc2Vjb25kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZXMpCisgICAgICAgIG1zZyA9IHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykKKyAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKG1zZykKKworICAgIGRlZiBhc3NlcnROb3RBbG1vc3RFcXVhbChzZWxmLCBmaXJzdCwgc2Vjb25kLCBwbGFjZXM9Tm9uZSwgbXNnPU5vbmUsIGRlbHRhPU5vbmUpOgorICAgICAgICAiIiJGYWlsIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgZXF1YWwgYXMgZGV0ZXJtaW5lZCBieSB0aGVpcgorICAgICAgICAgICBkaWZmZXJlbmNlIHJvdW5kZWQgdG8gdGhlIGdpdmVuIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcworICAgICAgICAgICAoZGVmYXVsdCA3KSBhbmQgY29tcGFyaW5nIHRvIHplcm8sIG9yIGJ5IGNvbXBhcmluZyB0aGF0IHRoZQorICAgICAgICAgICBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cyBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIGRlbHRhLgorCisgICAgICAgICAgIE5vdGUgdGhhdCBkZWNpbWFsIHBsYWNlcyAoZnJvbSB6ZXJvKSBhcmUgdXN1YWxseSBub3QgdGhlIHNhbWUKKyAgICAgICAgICAgYXMgc2lnbmlmaWNhbnQgZGlnaXRzIChtZWFzdXJlZCBmcm9tIHRoZSBtb3N0IHNpZ25maWNhbnQgZGlnaXQpLgorCisgICAgICAgICAgIE9iamVjdHMgdGhhdCBhcmUgZXF1YWwgYXV0b21hdGljYWxseSBmYWlsLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZGVsdGEgaXMgbm90IE5vbmUgYW5kIHBsYWNlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigic3BlY2lmeSBkZWx0YSBvciBwbGFjZXMgbm90IGJvdGgiKQorICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5vdCAoZmlyc3QgPT0gc2Vjb25kKSBhbmQgYWJzKGZpcnN0IC0gc2Vjb25kKSA+IGRlbHRhOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAnJXMgPT0gJXMgd2l0aGluICVzIGRlbHRhJyAlIChzYWZlX3JlcHIoZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3JlcHIoc2Vjb25kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9yZXByKGRlbHRhKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHBsYWNlcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHBsYWNlcyA9IDcKKyAgICAgICAgICAgIGlmIG5vdCAoZmlyc3QgPT0gc2Vjb25kKSBhbmQgcm91bmQoYWJzKHNlY29uZC1maXJzdCksIHBsYWNlcykgIT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzID09ICVzIHdpdGhpbiAlciBwbGFjZXMnICUgKHNhZmVfcmVwcihmaXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3JlcHIoc2Vjb25kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlcykKKworICAgICAgICBtc2cgPSBzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpCisgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbihtc2cpCisKKyAgICAjIFN5bm9ueW1zIGZvciBhc3NlcnRpb24gbWV0aG9kcworCisgICAgIyBUaGUgcGx1cmFscyBhcmUgdW5kb2N1bWVudGVkLiAgS2VlcCB0aGVtIHRoYXQgd2F5IHRvIGRpc2NvdXJhZ2UgdXNlLgorICAgICMgRG8gbm90IGFkZCBtb3JlLiAgRG8gbm90IHJlbW92ZS4KKyAgICAjIEdvaW5nIHRocm91Z2ggYSBkZXByZWNhdGlvbiBjeWNsZSBvbiB0aGVzZSB3b3VsZCBhbm5veSBtYW55IHBlb3BsZS4KKyAgICBhc3NlcnRFcXVhbHMgPSBhc3NlcnRFcXVhbAorICAgIGFzc2VydE5vdEVxdWFscyA9IGFzc2VydE5vdEVxdWFsCisgICAgYXNzZXJ0QWxtb3N0RXF1YWxzID0gYXNzZXJ0QWxtb3N0RXF1YWwKKyAgICBhc3NlcnROb3RBbG1vc3RFcXVhbHMgPSBhc3NlcnROb3RBbG1vc3RFcXVhbAorICAgIGFzc2VydF8gPSBhc3NlcnRUcnVlCisKKyAgICAjIFRoZXNlIGZhaWwqIGFzc2VydGlvbiBtZXRob2QgbmFtZXMgYXJlIHBlbmRpbmcgZGVwcmVjYXRpb24gYW5kIHdpbGwKKyAgICAjIGJlIGEgRGVwcmVjYXRpb25XYXJuaW5nIGluIDMuMjsgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI1NzgKKyAgICBkZWYgX2RlcHJlY2F0ZShvcmlnaW5hbF9mdW5jKToKKyAgICAgICAgZGVmIGRlcHJlY2F0ZWRfZnVuYygqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAnUGxlYXNlIHVzZSB7MH0gaW5zdGVhZC4nLmZvcm1hdChvcmlnaW5hbF9mdW5jLl9fbmFtZV9fKSwKKyAgICAgICAgICAgICAgICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsX2Z1bmMoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICByZXR1cm4gZGVwcmVjYXRlZF9mdW5jCisKKyAgICBmYWlsVW5sZXNzRXF1YWwgPSBfZGVwcmVjYXRlKGFzc2VydEVxdWFsKQorICAgIGZhaWxJZkVxdWFsID0gX2RlcHJlY2F0ZShhc3NlcnROb3RFcXVhbCkKKyAgICBmYWlsVW5sZXNzQWxtb3N0RXF1YWwgPSBfZGVwcmVjYXRlKGFzc2VydEFsbW9zdEVxdWFsKQorICAgIGZhaWxJZkFsbW9zdEVxdWFsID0gX2RlcHJlY2F0ZShhc3NlcnROb3RBbG1vc3RFcXVhbCkKKyAgICBmYWlsVW5sZXNzID0gX2RlcHJlY2F0ZShhc3NlcnRUcnVlKQorICAgIGZhaWxVbmxlc3NSYWlzZXMgPSBfZGVwcmVjYXRlKGFzc2VydFJhaXNlcykKKyAgICBmYWlsSWYgPSBfZGVwcmVjYXRlKGFzc2VydEZhbHNlKQorCisgICAgZGVmIGFzc2VydFNlcXVlbmNlRXF1YWwoc2VsZiwgc2VxMSwgc2VxMiwgbXNnPU5vbmUsIHNlcV90eXBlPU5vbmUpOgorICAgICAgICAiIiJBbiBlcXVhbGl0eSBhc3NlcnRpb24gZm9yIG9yZGVyZWQgc2VxdWVuY2VzIChsaWtlIGxpc3RzIGFuZCB0dXBsZXMpLgorCisgICAgICAgIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBmdW5jdGlvbiwgYSB2YWxpZCBvcmRlcmVkIHNlcXVlbmNlIHR5cGUgaXMgb25lCisgICAgICAgIHdoaWNoIGNhbiBiZSBpbmRleGVkLCBoYXMgYSBsZW5ndGgsIGFuZCBoYXMgYW4gZXF1YWxpdHkgb3BlcmF0b3IuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIHNlcTE6IFRoZSBmaXJzdCBzZXF1ZW5jZSB0byBjb21wYXJlLgorICAgICAgICAgICAgc2VxMjogVGhlIHNlY29uZCBzZXF1ZW5jZSB0byBjb21wYXJlLgorICAgICAgICAgICAgc2VxX3R5cGU6IFRoZSBleHBlY3RlZCBkYXRhdHlwZSBvZiB0aGUgc2VxdWVuY2VzLCBvciBOb25lIGlmIG5vCisgICAgICAgICAgICAgICAgICAgIGRhdGF0eXBlIHNob3VsZCBiZSBlbmZvcmNlZC4KKyAgICAgICAgICAgIG1zZzogT3B0aW9uYWwgbWVzc2FnZSB0byB1c2Ugb24gZmFpbHVyZSBpbnN0ZWFkIG9mIGEgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlcV90eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VxX3R5cGVfbmFtZSA9IHNlcV90eXBlLl9fbmFtZV9fCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZXExLCBzZXFfdHlwZSk6CisgICAgICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKCdGaXJzdCBzZXF1ZW5jZSBpcyBub3QgYSAlczogJXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VxX3R5cGVfbmFtZSwgc2FmZV9yZXByKHNlcTEpKSkKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlcTIsIHNlcV90eXBlKToKKyAgICAgICAgICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24oJ1NlY29uZCBzZXF1ZW5jZSBpcyBub3QgYSAlczogJXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc2VxX3R5cGVfbmFtZSwgc2FmZV9yZXByKHNlcTIpKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlcV90eXBlX25hbWUgPSAic2VxdWVuY2UiCisKKyAgICAgICAgZGlmZmVyaW5nID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsZW4xID0gbGVuKHNlcTEpCisgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBOb3RJbXBsZW1lbnRlZEVycm9yKToKKyAgICAgICAgICAgIGRpZmZlcmluZyA9ICdGaXJzdCAlcyBoYXMgbm8gbGVuZ3RoLiAgICBOb24tc2VxdWVuY2U/JyAlICgKKyAgICAgICAgICAgICAgICAgICAgc2VxX3R5cGVfbmFtZSkKKworICAgICAgICBpZiBkaWZmZXJpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsZW4yID0gbGVuKHNlcTIpCisgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgTm90SW1wbGVtZW50ZWRFcnJvcik6CisgICAgICAgICAgICAgICAgZGlmZmVyaW5nID0gJ1NlY29uZCAlcyBoYXMgbm8gbGVuZ3RoLiAgICBOb24tc2VxdWVuY2U/JyAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcV90eXBlX25hbWUpCisKKyAgICAgICAgaWYgZGlmZmVyaW5nIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZXExID09IHNlcTI6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHNlcTFfcmVwciA9IHNhZmVfcmVwcihzZXExKQorICAgICAgICAgICAgc2VxMl9yZXByID0gc2FmZV9yZXByKHNlcTIpCisgICAgICAgICAgICBpZiBsZW4oc2VxMV9yZXByKSA+IDMwOgorICAgICAgICAgICAgICAgIHNlcTFfcmVwciA9IHNlcTFfcmVwcls6MzBdICsgJy4uLicKKyAgICAgICAgICAgIGlmIGxlbihzZXEyX3JlcHIpID4gMzA6CisgICAgICAgICAgICAgICAgc2VxMl9yZXByID0gc2VxMl9yZXByWzozMF0gKyAnLi4uJworICAgICAgICAgICAgZWxlbWVudHMgPSAoc2VxX3R5cGVfbmFtZS5jYXBpdGFsaXplKCksIHNlcTFfcmVwciwgc2VxMl9yZXByKQorICAgICAgICAgICAgZGlmZmVyaW5nID0gJyVzcyBkaWZmZXI6ICVzICE9ICVzXG4nICUgZWxlbWVudHMKKworICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKG1pbihsZW4xLCBsZW4yKSk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpdGVtMSA9IHNlcTFbaV0KKyAgICAgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgSW5kZXhFcnJvciwgTm90SW1wbGVtZW50ZWRFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIGRpZmZlcmluZyArPSAoJ1xuVW5hYmxlIHRvIGluZGV4IGVsZW1lbnQgJWQgb2YgZmlyc3QgJXNcbicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGksIHNlcV90eXBlX25hbWUpKQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpdGVtMiA9IHNlcTJbaV0KKyAgICAgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgSW5kZXhFcnJvciwgTm90SW1wbGVtZW50ZWRFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIGRpZmZlcmluZyArPSAoJ1xuVW5hYmxlIHRvIGluZGV4IGVsZW1lbnQgJWQgb2Ygc2Vjb25kICVzXG4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLCBzZXFfdHlwZV9uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgIGlmIGl0ZW0xICE9IGl0ZW0yOgorICAgICAgICAgICAgICAgICAgICBkaWZmZXJpbmcgKz0gKCdcbkZpcnN0IGRpZmZlcmluZyBlbGVtZW50ICVkOlxuJXNcbiVzXG4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLCBpdGVtMSwgaXRlbTIpKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiAobGVuMSA9PSBsZW4yIGFuZCBzZXFfdHlwZSBpcyBOb25lIGFuZAorICAgICAgICAgICAgICAgICAgICB0eXBlKHNlcTEpICE9IHR5cGUoc2VxMikpOgorICAgICAgICAgICAgICAgICAgICAjIFRoZSBzZXF1ZW5jZXMgYXJlIHRoZSBzYW1lLCBidXQgaGF2ZSBkaWZmZXJpbmcgdHlwZXMuCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBpZiBsZW4xID4gbGVuMjoKKyAgICAgICAgICAgICAgICBkaWZmZXJpbmcgKz0gKCdcbkZpcnN0ICVzIGNvbnRhaW5zICVkIGFkZGl0aW9uYWwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudHMuXG4nICUgKHNlcV90eXBlX25hbWUsIGxlbjEgLSBsZW4yKSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRpZmZlcmluZyArPSAoJ0ZpcnN0IGV4dHJhIGVsZW1lbnQgJWQ6XG4lc1xuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbjIsIHNlcTFbbGVuMl0pKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBJbmRleEVycm9yLCBOb3RJbXBsZW1lbnRlZEVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgZGlmZmVyaW5nICs9ICgnVW5hYmxlIHRvIGluZGV4IGVsZW1lbnQgJWQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvZiBmaXJzdCAlc1xuJyAlIChsZW4yLCBzZXFfdHlwZV9uYW1lKSkKKyAgICAgICAgICAgIGVsaWYgbGVuMSA8IGxlbjI6CisgICAgICAgICAgICAgICAgZGlmZmVyaW5nICs9ICgnXG5TZWNvbmQgJXMgY29udGFpbnMgJWQgYWRkaXRpb25hbCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50cy5cbicgJSAoc2VxX3R5cGVfbmFtZSwgbGVuMiAtIGxlbjEpKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGlmZmVyaW5nICs9ICgnRmlyc3QgZXh0cmEgZWxlbWVudCAlZDpcbiVzXG4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGVuMSwgc2VxMltsZW4xXSkpCisgICAgICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIEluZGV4RXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBkaWZmZXJpbmcgKz0gKCdVbmFibGUgdG8gaW5kZXggZWxlbWVudCAlZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29mIHNlY29uZCAlc1xuJyAlIChsZW4xLCBzZXFfdHlwZV9uYW1lKSkKKyAgICAgICAgc3RhbmRhcmRNc2cgPSBkaWZmZXJpbmcKKyAgICAgICAgZGlmZk1zZyA9ICdcbicgKyAnXG4nLmpvaW4oCisgICAgICAgICAgICBkaWZmbGliLm5kaWZmKHBwcmludC5wZm9ybWF0KHNlcTEpLnNwbGl0bGluZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHByaW50LnBmb3JtYXQoc2VxMikuc3BsaXRsaW5lcygpKSkKKyAgICAgICAgc3RhbmRhcmRNc2cgPSBzZWxmLl90cnVuY2F0ZU1lc3NhZ2Uoc3RhbmRhcmRNc2csIGRpZmZNc2cpCisgICAgICAgIG1zZyA9IHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykKKyAgICAgICAgc2VsZi5mYWlsKG1zZykKKworICAgIGRlZiBfdHJ1bmNhdGVNZXNzYWdlKHNlbGYsIG1lc3NhZ2UsIGRpZmYpOgorICAgICAgICBtYXhfZGlmZiA9IHNlbGYubWF4RGlmZgorICAgICAgICBpZiBtYXhfZGlmZiBpcyBOb25lIG9yIGxlbihkaWZmKSA8PSBtYXhfZGlmZjoKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlICsgZGlmZgorICAgICAgICByZXR1cm4gbWVzc2FnZSArIChESUZGX09NSVRURUQgJSBsZW4oZGlmZikpCisKKyAgICBkZWYgYXNzZXJ0TGlzdEVxdWFsKHNlbGYsIGxpc3QxLCBsaXN0MiwgbXNnPU5vbmUpOgorICAgICAgICAiIiJBIGxpc3Qtc3BlY2lmaWMgZXF1YWxpdHkgYXNzZXJ0aW9uLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBsaXN0MTogVGhlIGZpcnN0IGxpc3QgdG8gY29tcGFyZS4KKyAgICAgICAgICAgIGxpc3QyOiBUaGUgc2Vjb25kIGxpc3QgdG8gY29tcGFyZS4KKyAgICAgICAgICAgIG1zZzogT3B0aW9uYWwgbWVzc2FnZSB0byB1c2Ugb24gZmFpbHVyZSBpbnN0ZWFkIG9mIGEgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlcy4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKGxpc3QxLCBsaXN0MiwgbXNnLCBzZXFfdHlwZT1saXN0KQorCisgICAgZGVmIGFzc2VydFR1cGxlRXF1YWwoc2VsZiwgdHVwbGUxLCB0dXBsZTIsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiQSB0dXBsZS1zcGVjaWZpYyBlcXVhbGl0eSBhc3NlcnRpb24uCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIHR1cGxlMTogVGhlIGZpcnN0IHR1cGxlIHRvIGNvbXBhcmUuCisgICAgICAgICAgICB0dXBsZTI6IFRoZSBzZWNvbmQgdHVwbGUgdG8gY29tcGFyZS4KKyAgICAgICAgICAgIG1zZzogT3B0aW9uYWwgbWVzc2FnZSB0byB1c2Ugb24gZmFpbHVyZSBpbnN0ZWFkIG9mIGEgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbCh0dXBsZTEsIHR1cGxlMiwgbXNnLCBzZXFfdHlwZT10dXBsZSkKKworICAgIGRlZiBhc3NlcnRTZXRFcXVhbChzZWxmLCBzZXQxLCBzZXQyLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkEgc2V0LXNwZWNpZmljIGVxdWFsaXR5IGFzc2VydGlvbi4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgc2V0MTogVGhlIGZpcnN0IHNldCB0byBjb21wYXJlLgorICAgICAgICAgICAgc2V0MjogVGhlIHNlY29uZCBzZXQgdG8gY29tcGFyZS4KKyAgICAgICAgICAgIG1zZzogT3B0aW9uYWwgbWVzc2FnZSB0byB1c2Ugb24gZmFpbHVyZSBpbnN0ZWFkIG9mIGEgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlcy4KKworICAgICAgICBhc3NlcnRTZXRFcXVhbCB1c2VzIGR1Y2t0eXBpbmcgdG8gc3VwcG9ydCBkaWZmZXJlbnQgdHlwZXMgb2Ygc2V0cywgYW5kCisgICAgICAgIGlzIG9wdGltaXplZCBmb3Igc2V0cyBzcGVjaWZpY2FsbHkgKHBhcmFtZXRlcnMgbXVzdCBzdXBwb3J0IGEKKyAgICAgICAgZGlmZmVyZW5jZSBtZXRob2QpLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGlmZmVyZW5jZTEgPSBzZXQxLmRpZmZlcmVuY2Uoc2V0MikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnaW52YWxpZCB0eXBlIHdoZW4gYXR0ZW1wdGluZyBzZXQgZGlmZmVyZW5jZTogJXMnICUgZSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdmaXJzdCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHNldCBkaWZmZXJlbmNlOiAlcycgJSBlKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRpZmZlcmVuY2UyID0gc2V0Mi5kaWZmZXJlbmNlKHNldDEpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2ludmFsaWQgdHlwZSB3aGVuIGF0dGVtcHRpbmcgc2V0IGRpZmZlcmVuY2U6ICVzJyAlIGUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnc2Vjb25kIGFyZ3VtZW50IGRvZXMgbm90IHN1cHBvcnQgc2V0IGRpZmZlcmVuY2U6ICVzJyAlIGUpCisKKyAgICAgICAgaWYgbm90IChkaWZmZXJlbmNlMSBvciBkaWZmZXJlbmNlMik6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGlmIGRpZmZlcmVuY2UxOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKCdJdGVtcyBpbiB0aGUgZmlyc3Qgc2V0IGJ1dCBub3QgdGhlIHNlY29uZDonKQorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZGlmZmVyZW5jZTE6CisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKHJlcHIoaXRlbSkpCisgICAgICAgIGlmIGRpZmZlcmVuY2UyOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKCdJdGVtcyBpbiB0aGUgc2Vjb25kIHNldCBidXQgbm90IHRoZSBmaXJzdDonKQorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZGlmZmVyZW5jZTI6CisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKHJlcHIoaXRlbSkpCisKKyAgICAgICAgc3RhbmRhcmRNc2cgPSAnXG4nLmpvaW4obGluZXMpCisgICAgICAgIHNlbGYuZmFpbChzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpKQorCisgICAgZGVmIGFzc2VydEluKHNlbGYsIG1lbWJlciwgY29udGFpbmVyLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkp1c3QgbGlrZSBzZWxmLmFzc2VydFRydWUoYSBpbiBiKSwgYnV0IHdpdGggYSBuaWNlciBkZWZhdWx0IG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIG1lbWJlciBub3QgaW4gY29udGFpbmVyOgorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAnJXMgbm90IGZvdW5kIGluICVzJyAlIChzYWZlX3JlcHIobWVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9yZXByKGNvbnRhaW5lcikpCisgICAgICAgICAgICBzZWxmLmZhaWwoc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKSkKKworICAgIGRlZiBhc3NlcnROb3RJbihzZWxmLCBtZW1iZXIsIGNvbnRhaW5lciwgbXNnPU5vbmUpOgorICAgICAgICAiIiJKdXN0IGxpa2Ugc2VsZi5hc3NlcnRUcnVlKGEgbm90IGluIGIpLCBidXQgd2l0aCBhIG5pY2VyIGRlZmF1bHQgbWVzc2FnZS4iIiIKKyAgICAgICAgaWYgbWVtYmVyIGluIGNvbnRhaW5lcjoKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzIHVuZXhwZWN0ZWRseSBmb3VuZCBpbiAlcycgJSAoc2FmZV9yZXByKG1lbWJlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfcmVwcihjb250YWluZXIpKQorICAgICAgICAgICAgc2VsZi5mYWlsKHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykpCisKKyAgICBkZWYgYXNzZXJ0SXMoc2VsZiwgZXhwcjEsIGV4cHIyLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkp1c3QgbGlrZSBzZWxmLmFzc2VydFRydWUoYSBpcyBiKSwgYnV0IHdpdGggYSBuaWNlciBkZWZhdWx0IG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIGV4cHIxIGlzIG5vdCBleHByMjoKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzIGlzIG5vdCAlcycgJSAoc2FmZV9yZXByKGV4cHIxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfcmVwcihleHByMikpCisgICAgICAgICAgICBzZWxmLmZhaWwoc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKSkKKworICAgIGRlZiBhc3NlcnRJc05vdChzZWxmLCBleHByMSwgZXhwcjIsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiSnVzdCBsaWtlIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIG5vdCBiKSwgYnV0IHdpdGggYSBuaWNlciBkZWZhdWx0IG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIGV4cHIxIGlzIGV4cHIyOgorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAndW5leHBlY3RlZGx5IGlkZW50aWNhbDogJXMnICUgKHNhZmVfcmVwcihleHByMSksKQorICAgICAgICAgICAgc2VsZi5mYWlsKHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykpCisKKyAgICBkZWYgYXNzZXJ0RGljdEVxdWFsKHNlbGYsIGQxLCBkMiwgbXNnPU5vbmUpOgorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZDEsIGRpY3QsICdGaXJzdCBhcmd1bWVudCBpcyBub3QgYSBkaWN0aW9uYXJ5JykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQyLCBkaWN0LCAnU2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBhIGRpY3Rpb25hcnknKQorCisgICAgICAgIGlmIGQxICE9IGQyOgorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAnJXMgIT0gJXMnICUgKHNhZmVfcmVwcihkMSwgVHJ1ZSksIHNhZmVfcmVwcihkMiwgVHJ1ZSkpCisgICAgICAgICAgICBkaWZmID0gKCdcbicgKyAnXG4nLmpvaW4oZGlmZmxpYi5uZGlmZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwcmludC5wZm9ybWF0KGQxKS5zcGxpdGxpbmVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHJpbnQucGZvcm1hdChkMikuc3BsaXRsaW5lcygpKSkpCisgICAgICAgICAgICBzdGFuZGFyZE1zZyA9IHNlbGYuX3RydW5jYXRlTWVzc2FnZShzdGFuZGFyZE1zZywgZGlmZikKKyAgICAgICAgICAgIHNlbGYuZmFpbChzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpKQorCisgICAgZGVmIGFzc2VydERpY3RDb250YWluc1N1YnNldChzZWxmLCBleHBlY3RlZCwgYWN0dWFsLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkNoZWNrcyB3aGV0aGVyIGFjdHVhbCBpcyBhIHN1cGVyc2V0IG9mIGV4cGVjdGVkLiIiIgorICAgICAgICBtaXNzaW5nID0gW10KKyAgICAgICAgbWlzbWF0Y2hlZCA9IFtdCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGV4cGVjdGVkLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBhY3R1YWw6CisgICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoa2V5KQorICAgICAgICAgICAgZWxpZiB2YWx1ZSAhPSBhY3R1YWxba2V5XToKKyAgICAgICAgICAgICAgICBtaXNtYXRjaGVkLmFwcGVuZCgnJXMsIGV4cGVjdGVkOiAlcywgYWN0dWFsOiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzYWZlX3JlcHIoa2V5KSwgc2FmZV9yZXByKHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9yZXByKGFjdHVhbFtrZXldKSkpCisKKyAgICAgICAgaWYgbm90IChtaXNzaW5nIG9yIG1pc21hdGNoZWQpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc3RhbmRhcmRNc2cgPSAnJworICAgICAgICBpZiBtaXNzaW5nOgorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAnTWlzc2luZzogJXMnICUgJywnLmpvaW4oc2FmZV9yZXByKG0pIGZvciBtIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZykKKyAgICAgICAgaWYgbWlzbWF0Y2hlZDoKKyAgICAgICAgICAgIGlmIHN0YW5kYXJkTXNnOgorICAgICAgICAgICAgICAgIHN0YW5kYXJkTXNnICs9ICc7ICcKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnICs9ICdNaXNtYXRjaGVkIHZhbHVlczogJXMnICUgJywnLmpvaW4obWlzbWF0Y2hlZCkKKworICAgICAgICBzZWxmLmZhaWwoc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKSkKKworICAgIGRlZiBhc3NlcnRJdGVtc0VxdWFsKHNlbGYsIGV4cGVjdGVkX3NlcSwgYWN0dWFsX3NlcSwgbXNnPU5vbmUpOgorICAgICAgICAiIiJBbiB1bm9yZGVyZWQgc2VxdWVuY2Ugc3BlY2lmaWMgY29tcGFyaXNvbi4gSXQgYXNzZXJ0cyB0aGF0CisgICAgICAgIGFjdHVhbF9zZXEgYW5kIGV4cGVjdGVkX3NlcSBoYXZlIHRoZSBzYW1lIGVsZW1lbnQgY291bnRzLgorICAgICAgICBFcXVpdmFsZW50IHRvOjoKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDb3VudGVyKGl0ZXIoYWN0dWFsX3NlcSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudGVyKGl0ZXIoZXhwZWN0ZWRfc2VxKSkpCisKKyAgICAgICAgQXNzZXJ0cyB0aGF0IGVhY2ggZWxlbWVudCBoYXMgdGhlIHNhbWUgY291bnQgaW4gYm90aCBzZXF1ZW5jZXMuCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgICAgICAtIFswLCAxLCAxXSBhbmQgWzEsIDAsIDFdIGNvbXBhcmUgZXF1YWwuCisgICAgICAgICAgICAtIFswLCAwLCAxXSBhbmQgWzAsIDFdIGNvbXBhcmUgdW5lcXVhbC4KKyAgICAgICAgIiIiCisgICAgICAgIGZpcnN0X3NlcSwgc2Vjb25kX3NlcSA9IGxpc3QoZXhwZWN0ZWRfc2VxKSwgbGlzdChhY3R1YWxfc2VxKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBpZiBzeXMucHkza3dhcm5pbmc6CisgICAgICAgICAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZyByYWlzZWQgZHVyaW5nIHRoZSBzb3J0aW5nCisgICAgICAgICAgICAgICAgZm9yIF9tc2cgaW4gWyIoY29kZXxkaWN0fHR5cGUpIGluZXF1YWxpdHkgY29tcGFyaXNvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVpbHRpbl9mdW5jdGlvbl9vcl9tZXRob2Qgb3JkZXIgY29tcGFyaXNvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGFyaW5nIHVuZXF1YWwgdHlwZXMiXToKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIF9tc2csIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGNvbGxlY3Rpb25zLkNvdW50ZXIoZmlyc3Rfc2VxKQorICAgICAgICAgICAgICAgIHNlY29uZCA9IGNvbGxlY3Rpb25zLkNvdW50ZXIoc2Vjb25kX3NlcSkKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBIYW5kbGUgY2FzZSB3aXRoIHVuaGFzaGFibGUgZWxlbWVudHMKKyAgICAgICAgICAgICAgICBkaWZmZXJlbmNlcyA9IF9jb3VudF9kaWZmX2FsbF9wdXJwb3NlKGZpcnN0X3NlcSwgc2Vjb25kX3NlcSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgZmlyc3QgPT0gc2Vjb25kOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBkaWZmZXJlbmNlcyA9IF9jb3VudF9kaWZmX2hhc2hhYmxlKGZpcnN0X3NlcSwgc2Vjb25kX3NlcSkKKworICAgICAgICBpZiBkaWZmZXJlbmNlczoKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJ0VsZW1lbnQgY291bnRzIHdlcmUgbm90IGVxdWFsOlxuJworICAgICAgICAgICAgbGluZXMgPSBbJ0ZpcnN0IGhhcyAlZCwgU2Vjb25kIGhhcyAlZDogICVyJyAlIGRpZmYgZm9yIGRpZmYgaW4gZGlmZmVyZW5jZXNdCisgICAgICAgICAgICBkaWZmTXNnID0gJ1xuJy5qb2luKGxpbmVzKQorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSBzZWxmLl90cnVuY2F0ZU1lc3NhZ2Uoc3RhbmRhcmRNc2csIGRpZmZNc2cpCisgICAgICAgICAgICBtc2cgPSBzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpCisgICAgICAgICAgICBzZWxmLmZhaWwobXNnKQorCisgICAgZGVmIGFzc2VydE11bHRpTGluZUVxdWFsKHNlbGYsIGZpcnN0LCBzZWNvbmQsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiQXNzZXJ0IHRoYXQgdHdvIG11bHRpLWxpbmUgc3RyaW5ncyBhcmUgZXF1YWwuIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmaXJzdCwgYmFzZXN0cmluZywKKyAgICAgICAgICAgICAgICAnRmlyc3QgYXJndW1lbnQgaXMgbm90IGEgc3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlY29uZCwgYmFzZXN0cmluZywKKyAgICAgICAgICAgICAgICAnU2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBhIHN0cmluZycpCisKKyAgICAgICAgaWYgZmlyc3QgIT0gc2Vjb25kOgorICAgICAgICAgICAgIyBkb24ndCB1c2UgZGlmZmxpYiBpZiB0aGUgc3RyaW5ncyBhcmUgdG9vIGxvbmcKKyAgICAgICAgICAgIGlmIChsZW4oZmlyc3QpID4gc2VsZi5fZGlmZlRocmVzaG9sZCBvcgorICAgICAgICAgICAgICAgIGxlbihzZWNvbmQpID4gc2VsZi5fZGlmZlRocmVzaG9sZCk6CisgICAgICAgICAgICAgICAgc2VsZi5fYmFzZUFzc2VydEVxdWFsKGZpcnN0LCBzZWNvbmQsIG1zZykKKyAgICAgICAgICAgIGZpcnN0bGluZXMgPSBmaXJzdC5zcGxpdGxpbmVzKFRydWUpCisgICAgICAgICAgICBzZWNvbmRsaW5lcyA9IHNlY29uZC5zcGxpdGxpbmVzKFRydWUpCisgICAgICAgICAgICBpZiBsZW4oZmlyc3RsaW5lcykgPT0gMSBhbmQgZmlyc3Quc3RyaXAoJ1xyXG4nKSA9PSBmaXJzdDoKKyAgICAgICAgICAgICAgICBmaXJzdGxpbmVzID0gW2ZpcnN0ICsgJ1xuJ10KKyAgICAgICAgICAgICAgICBzZWNvbmRsaW5lcyA9IFtzZWNvbmQgKyAnXG4nXQorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAnJXMgIT0gJXMnICUgKHNhZmVfcmVwcihmaXJzdCwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9yZXByKHNlY29uZCwgVHJ1ZSkpCisgICAgICAgICAgICBkaWZmID0gJ1xuJyArICcnLmpvaW4oZGlmZmxpYi5uZGlmZihmaXJzdGxpbmVzLCBzZWNvbmRsaW5lcykpCisgICAgICAgICAgICBzdGFuZGFyZE1zZyA9IHNlbGYuX3RydW5jYXRlTWVzc2FnZShzdGFuZGFyZE1zZywgZGlmZikKKyAgICAgICAgICAgIHNlbGYuZmFpbChzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpKQorCisgICAgZGVmIGFzc2VydExlc3Moc2VsZiwgYSwgYiwgbXNnPU5vbmUpOgorICAgICAgICAiIiJKdXN0IGxpa2Ugc2VsZi5hc3NlcnRUcnVlKGEgPCBiKSwgYnV0IHdpdGggYSBuaWNlciBkZWZhdWx0IG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIG5vdCBhIDwgYjoKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzIG5vdCBsZXNzIHRoYW4gJXMnICUgKHNhZmVfcmVwcihhKSwgc2FmZV9yZXByKGIpKQorICAgICAgICAgICAgc2VsZi5mYWlsKHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykpCisKKyAgICBkZWYgYXNzZXJ0TGVzc0VxdWFsKHNlbGYsIGEsIGIsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiSnVzdCBsaWtlIHNlbGYuYXNzZXJ0VHJ1ZShhIDw9IGIpLCBidXQgd2l0aCBhIG5pY2VyIGRlZmF1bHQgbWVzc2FnZS4iIiIKKyAgICAgICAgaWYgbm90IGEgPD0gYjoKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzIG5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnICUgKHNhZmVfcmVwcihhKSwgc2FmZV9yZXByKGIpKQorICAgICAgICAgICAgc2VsZi5mYWlsKHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykpCisKKyAgICBkZWYgYXNzZXJ0R3JlYXRlcihzZWxmLCBhLCBiLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkp1c3QgbGlrZSBzZWxmLmFzc2VydFRydWUoYSA+IGIpLCBidXQgd2l0aCBhIG5pY2VyIGRlZmF1bHQgbWVzc2FnZS4iIiIKKyAgICAgICAgaWYgbm90IGEgPiBiOgorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAnJXMgbm90IGdyZWF0ZXIgdGhhbiAlcycgJSAoc2FmZV9yZXByKGEpLCBzYWZlX3JlcHIoYikpCisgICAgICAgICAgICBzZWxmLmZhaWwoc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKSkKKworICAgIGRlZiBhc3NlcnRHcmVhdGVyRXF1YWwoc2VsZiwgYSwgYiwgbXNnPU5vbmUpOgorICAgICAgICAiIiJKdXN0IGxpa2Ugc2VsZi5hc3NlcnRUcnVlKGEgPj0gYiksIGJ1dCB3aXRoIGEgbmljZXIgZGVmYXVsdCBtZXNzYWdlLiIiIgorICAgICAgICBpZiBub3QgYSA+PSBiOgorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAnJXMgbm90IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycgJSAoc2FmZV9yZXByKGEpLCBzYWZlX3JlcHIoYikpCisgICAgICAgICAgICBzZWxmLmZhaWwoc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKSkKKworICAgIGRlZiBhc3NlcnRJc05vbmUoc2VsZiwgb2JqLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIlNhbWUgYXMgc2VsZi5hc3NlcnRUcnVlKG9iaiBpcyBOb25lKSwgd2l0aCBhIG5pY2VyIGRlZmF1bHQgbWVzc2FnZS4iIiIKKyAgICAgICAgaWYgb2JqIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAnJXMgaXMgbm90IE5vbmUnICUgKHNhZmVfcmVwcihvYmopLCkKKyAgICAgICAgICAgIHNlbGYuZmFpbChzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpKQorCisgICAgZGVmIGFzc2VydElzTm90Tm9uZShzZWxmLCBvYmosIG1zZz1Ob25lKToKKyAgICAgICAgIiIiSW5jbHVkZWQgZm9yIHN5bW1ldHJ5IHdpdGggYXNzZXJ0SXNOb25lLiIiIgorICAgICAgICBpZiBvYmogaXMgTm9uZToKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJ3VuZXhwZWN0ZWRseSBOb25lJworICAgICAgICAgICAgc2VsZi5mYWlsKHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykpCisKKyAgICBkZWYgYXNzZXJ0SXNJbnN0YW5jZShzZWxmLCBvYmosIGNscywgbXNnPU5vbmUpOgorICAgICAgICAiIiJTYW1lIGFzIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG9iaiwgY2xzKSksIHdpdGggYSBuaWNlcgorICAgICAgICBkZWZhdWx0IG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG9iaiwgY2xzKToKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiAlcicgJSAoc2FmZV9yZXByKG9iaiksIGNscykKKyAgICAgICAgICAgIHNlbGYuZmFpbChzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpKQorCisgICAgZGVmIGFzc2VydE5vdElzSW5zdGFuY2Uoc2VsZiwgb2JqLCBjbHMsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiSW5jbHVkZWQgZm9yIHN5bW1ldHJ5IHdpdGggYXNzZXJ0SXNJbnN0YW5jZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGNscyk6CisgICAgICAgICAgICBzdGFuZGFyZE1zZyA9ICclcyBpcyBhbiBpbnN0YW5jZSBvZiAlcicgJSAoc2FmZV9yZXByKG9iaiksIGNscykKKyAgICAgICAgICAgIHNlbGYuZmFpbChzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpKQorCisgICAgZGVmIGFzc2VydFJhaXNlc1JlZ2V4cChzZWxmLCBleHBlY3RlZF9leGNlcHRpb24sIGV4cGVjdGVkX3JlZ2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhYmxlX29iaj1Ob25lLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiJBc3NlcnRzIHRoYXQgdGhlIG1lc3NhZ2UgaW4gYSByYWlzZWQgZXhjZXB0aW9uIG1hdGNoZXMgYSByZWdleHAuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIGV4cGVjdGVkX2V4Y2VwdGlvbjogRXhjZXB0aW9uIGNsYXNzIGV4cGVjdGVkIHRvIGJlIHJhaXNlZC4KKyAgICAgICAgICAgIGV4cGVjdGVkX3JlZ2V4cDogUmVnZXhwIChyZSBwYXR0ZXJuIG9iamVjdCBvciBzdHJpbmcpIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIHRvIGJlIGZvdW5kIGluIGVycm9yIG1lc3NhZ2UuCisgICAgICAgICAgICBjYWxsYWJsZV9vYmo6IEZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4KKyAgICAgICAgICAgIGFyZ3M6IEV4dHJhIGFyZ3MuCisgICAgICAgICAgICBrd2FyZ3M6IEV4dHJhIGt3YXJncy4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbnRleHQgPSBfQXNzZXJ0UmFpc2VzQ29udGV4dChleHBlY3RlZF9leGNlcHRpb24sIHNlbGYsIGV4cGVjdGVkX3JlZ2V4cCkKKyAgICAgICAgaWYgY2FsbGFibGVfb2JqIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dAorICAgICAgICB3aXRoIGNvbnRleHQ6CisgICAgICAgICAgICBjYWxsYWJsZV9vYmooKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGFzc2VydFJlZ2V4cE1hdGNoZXMoc2VsZiwgdGV4dCwgZXhwZWN0ZWRfcmVnZXhwLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkZhaWwgdGhlIHRlc3QgdW5sZXNzIHRoZSB0ZXh0IG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZF9yZWdleHAsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgZXhwZWN0ZWRfcmVnZXhwID0gcmUuY29tcGlsZShleHBlY3RlZF9yZWdleHApCisgICAgICAgIGlmIG5vdCBleHBlY3RlZF9yZWdleHAuc2VhcmNoKHRleHQpOgorICAgICAgICAgICAgbXNnID0gbXNnIG9yICJSZWdleHAgZGlkbid0IG1hdGNoIgorICAgICAgICAgICAgbXNnID0gJyVzOiAlciBub3QgZm91bmQgaW4gJXInICUgKG1zZywgZXhwZWN0ZWRfcmVnZXhwLnBhdHRlcm4sIHRleHQpCisgICAgICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24obXNnKQorCisgICAgZGVmIGFzc2VydE5vdFJlZ2V4cE1hdGNoZXMoc2VsZiwgdGV4dCwgdW5leHBlY3RlZF9yZWdleHAsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiRmFpbCB0aGUgdGVzdCBpZiB0aGUgdGV4dCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UodW5leHBlY3RlZF9yZWdleHAsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgdW5leHBlY3RlZF9yZWdleHAgPSByZS5jb21waWxlKHVuZXhwZWN0ZWRfcmVnZXhwKQorICAgICAgICBtYXRjaCA9IHVuZXhwZWN0ZWRfcmVnZXhwLnNlYXJjaCh0ZXh0KQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIG1zZyA9IG1zZyBvciAiUmVnZXhwIG1hdGNoZWQiCisgICAgICAgICAgICBtc2cgPSAnJXM6ICVyIG1hdGNoZXMgJXIgaW4gJXInICUgKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFttYXRjaC5zdGFydCgpOm1hdGNoLmVuZCgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5leHBlY3RlZF9yZWdleHAucGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCkKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbihtc2cpCisKKworY2xhc3MgRnVuY3Rpb25UZXN0Q2FzZShUZXN0Q2FzZSk6CisgICAgIiIiQSB0ZXN0IGNhc2UgdGhhdCB3cmFwcyBhIHRlc3QgZnVuY3Rpb24uCisKKyAgICBUaGlzIGlzIHVzZWZ1bCBmb3Igc2xpcHBpbmcgcHJlLWV4aXN0aW5nIHRlc3QgZnVuY3Rpb25zIGludG8gdGhlCisgICAgdW5pdHRlc3QgZnJhbWV3b3JrLiBPcHRpb25hbGx5LCBzZXQtdXAgYW5kIHRpZHktdXAgZnVuY3Rpb25zIGNhbiBiZQorICAgIHN1cHBsaWVkLiBBcyB3aXRoIFRlc3RDYXNlLCB0aGUgdGlkeS11cCAoJ3RlYXJEb3duJykgZnVuY3Rpb24gd2lsbAorICAgIGFsd2F5cyBiZSBjYWxsZWQgaWYgdGhlIHNldC11cCAoJ3NldFVwJykgZnVuY3Rpb24gcmFuIHN1Y2Nlc3NmdWxseS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0RnVuYywgc2V0VXA9Tm9uZSwgdGVhckRvd249Tm9uZSwgZGVzY3JpcHRpb249Tm9uZSk6CisgICAgICAgIHN1cGVyKEZ1bmN0aW9uVGVzdENhc2UsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5fc2V0VXBGdW5jID0gc2V0VXAKKyAgICAgICAgc2VsZi5fdGVhckRvd25GdW5jID0gdGVhckRvd24KKyAgICAgICAgc2VsZi5fdGVzdEZ1bmMgPSB0ZXN0RnVuYworICAgICAgICBzZWxmLl9kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3NldFVwRnVuYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3NldFVwRnVuYygpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3RlYXJEb3duRnVuYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3RlYXJEb3duRnVuYygpCisKKyAgICBkZWYgcnVuVGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdEZ1bmMoKQorCisgICAgZGVmIGlkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdGVzdEZ1bmMuX19uYW1lX18KKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NldFVwRnVuYyA9PSBvdGhlci5fc2V0VXBGdW5jIGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLl90ZWFyRG93bkZ1bmMgPT0gb3RoZXIuX3RlYXJEb3duRnVuYyBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5fdGVzdEZ1bmMgPT0gb3RoZXIuX3Rlc3RGdW5jIGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLl9kZXNjcmlwdGlvbiA9PSBvdGhlci5fZGVzY3JpcHRpb24KKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goKHR5cGUoc2VsZiksIHNlbGYuX3NldFVwRnVuYywgc2VsZi5fdGVhckRvd25GdW5jLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVzdEZ1bmMsIHNlbGYuX2Rlc2NyaXB0aW9uKSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzICglcykiICUgKHN0cmNsYXNzKHNlbGYuX19jbGFzc19fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZXN0RnVuYy5fX25hbWVfXykKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8JXMgdGVjPSVzPiIgJSAoc3RyY2xhc3Moc2VsZi5fX2NsYXNzX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3RGdW5jKQorCisgICAgZGVmIHNob3J0RGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2Rlc2NyaXB0aW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Rlc2NyaXB0aW9uCisgICAgICAgIGRvYyA9IHNlbGYuX3Rlc3RGdW5jLl9fZG9jX18KKyAgICAgICAgcmV0dXJuIGRvYyBhbmQgZG9jLnNwbGl0KCJcbiIpWzBdLnN0cmlwKCkgb3IgTm9uZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9jYXNlLnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvY2FzZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1MTI0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvY2FzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9jYXNlLnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvY2FzZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1MTI0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvY2FzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9sb2FkZXIucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L2xvYWRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODhmNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9sb2FkZXIucHkKQEAgLTAsMCArMSwzMTQgQEAKKyIiIkxvYWRpbmcgdW5pdHRlc3RzLiIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHR5cGVzCisKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCBjbXBfdG9fa2V5IGFzIF9DbXBUb0tleQorZnJvbSBmbm1hdGNoIGltcG9ydCBmbm1hdGNoCisKK2Zyb20gLiBpbXBvcnQgY2FzZSwgc3VpdGUKKworX191bml0dGVzdCA9IFRydWUKKworIyB3aGF0IGFib3V0IC5weWMgb3IgLnB5byAoZXRjKQorIyB3ZSB3b3VsZCBuZWVkIHRvIGF2b2lkIGxvYWRpbmcgdGhlIHNhbWUgdGVzdHMgbXVsdGlwbGUgdGltZXMKKyMgZnJvbSAnLnB5JywgJy5weWMnICphbmQqICcucHlvJworVkFMSURfTU9EVUxFX05BTUUgPSByZS5jb21waWxlKHInW19hLXpdXHcqXC5weSQnLCByZS5JR05PUkVDQVNFKQorCisKK2RlZiBfbWFrZV9mYWlsZWRfaW1wb3J0X3Rlc3QobmFtZSwgc3VpdGVDbGFzcyk6CisgICAgbWVzc2FnZSA9ICdGYWlsZWQgdG8gaW1wb3J0IHRlc3QgbW9kdWxlOiAlc1xuJXMnICUgKG5hbWUsIHRyYWNlYmFjay5mb3JtYXRfZXhjKCkpCisgICAgcmV0dXJuIF9tYWtlX2ZhaWxlZF90ZXN0KCdNb2R1bGVJbXBvcnRGYWlsdXJlJywgbmFtZSwgSW1wb3J0RXJyb3IobWVzc2FnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1aXRlQ2xhc3MpCisKK2RlZiBfbWFrZV9mYWlsZWRfbG9hZF90ZXN0cyhuYW1lLCBleGNlcHRpb24sIHN1aXRlQ2xhc3MpOgorICAgIHJldHVybiBfbWFrZV9mYWlsZWRfdGVzdCgnTG9hZFRlc3RzRmFpbHVyZScsIG5hbWUsIGV4Y2VwdGlvbiwgc3VpdGVDbGFzcykKKworZGVmIF9tYWtlX2ZhaWxlZF90ZXN0KGNsYXNzbmFtZSwgbWV0aG9kbmFtZSwgZXhjZXB0aW9uLCBzdWl0ZUNsYXNzKToKKyAgICBkZWYgdGVzdEZhaWx1cmUoc2VsZik6CisgICAgICAgIHJhaXNlIGV4Y2VwdGlvbgorICAgIGF0dHJzID0ge21ldGhvZG5hbWU6IHRlc3RGYWlsdXJlfQorICAgIFRlc3RDbGFzcyA9IHR5cGUoY2xhc3NuYW1lLCAoY2FzZS5UZXN0Q2FzZSwpLCBhdHRycykKKyAgICByZXR1cm4gc3VpdGVDbGFzcygoVGVzdENsYXNzKG1ldGhvZG5hbWUpLCkpCisKKworY2xhc3MgVGVzdExvYWRlcihvYmplY3QpOgorICAgICIiIgorICAgIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGxvYWRpbmcgdGVzdHMgYWNjb3JkaW5nIHRvIHZhcmlvdXMgY3JpdGVyaWEKKyAgICBhbmQgcmV0dXJuaW5nIHRoZW0gd3JhcHBlZCBpbiBhIFRlc3RTdWl0ZQorICAgICIiIgorICAgIHRlc3RNZXRob2RQcmVmaXggPSAndGVzdCcKKyAgICBzb3J0VGVzdE1ldGhvZHNVc2luZyA9IGNtcAorICAgIHN1aXRlQ2xhc3MgPSBzdWl0ZS5UZXN0U3VpdGUKKyAgICBfdG9wX2xldmVsX2RpciA9IE5vbmUKKworICAgIGRlZiBsb2FkVGVzdHNGcm9tVGVzdENhc2Uoc2VsZiwgdGVzdENhc2VDbGFzcyk6CisgICAgICAgICIiIlJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBjb250YWluZWQgaW4gdGVzdENhc2VDbGFzcyIiIgorICAgICAgICBpZiBpc3N1YmNsYXNzKHRlc3RDYXNlQ2xhc3MsIHN1aXRlLlRlc3RTdWl0ZSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlRlc3QgY2FzZXMgc2hvdWxkIG5vdCBiZSBkZXJpdmVkIGZyb20gVGVzdFN1aXRlLiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIE1heWJlIHlvdSBtZWFudCB0byBkZXJpdmUgZnJvbSBUZXN0Q2FzZT8iKQorICAgICAgICB0ZXN0Q2FzZU5hbWVzID0gc2VsZi5nZXRUZXN0Q2FzZU5hbWVzKHRlc3RDYXNlQ2xhc3MpCisgICAgICAgIGlmIG5vdCB0ZXN0Q2FzZU5hbWVzIGFuZCBoYXNhdHRyKHRlc3RDYXNlQ2xhc3MsICdydW5UZXN0Jyk6CisgICAgICAgICAgICB0ZXN0Q2FzZU5hbWVzID0gWydydW5UZXN0J10KKyAgICAgICAgbG9hZGVkX3N1aXRlID0gc2VsZi5zdWl0ZUNsYXNzKG1hcCh0ZXN0Q2FzZUNsYXNzLCB0ZXN0Q2FzZU5hbWVzKSkKKyAgICAgICAgcmV0dXJuIGxvYWRlZF9zdWl0ZQorCisgICAgZGVmIGxvYWRUZXN0c0Zyb21Nb2R1bGUoc2VsZiwgbW9kdWxlLCB1c2VfbG9hZF90ZXN0cz1UcnVlKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gbW9kdWxlIiIiCisgICAgICAgIHRlc3RzID0gW10KKyAgICAgICAgZm9yIG5hbWUgaW4gZGlyKG1vZHVsZSk6CisgICAgICAgICAgICBvYmogPSBnZXRhdHRyKG1vZHVsZSwgbmFtZSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyhvYmosIGNhc2UuVGVzdENhc2UpOgorICAgICAgICAgICAgICAgIHRlc3RzLmFwcGVuZChzZWxmLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShvYmopKQorCisgICAgICAgIGxvYWRfdGVzdHMgPSBnZXRhdHRyKG1vZHVsZSwgJ2xvYWRfdGVzdHMnLCBOb25lKQorICAgICAgICB0ZXN0cyA9IHNlbGYuc3VpdGVDbGFzcyh0ZXN0cykKKyAgICAgICAgaWYgdXNlX2xvYWRfdGVzdHMgYW5kIGxvYWRfdGVzdHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRfdGVzdHMoc2VsZiwgdGVzdHMsIE5vbmUpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgIHJldHVybiBfbWFrZV9mYWlsZWRfbG9hZF90ZXN0cyhtb2R1bGUuX19uYW1lX18sIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3VpdGVDbGFzcykKKyAgICAgICAgcmV0dXJuIHRlc3RzCisKKyAgICBkZWYgbG9hZFRlc3RzRnJvbU5hbWUoc2VsZiwgbmFtZSwgbW9kdWxlPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdWl0ZSBvZiBhbGwgdGVzdHMgY2FzZXMgZ2l2ZW4gYSBzdHJpbmcgc3BlY2lmaWVyLgorCisgICAgICAgIFRoZSBuYW1lIG1heSByZXNvbHZlIGVpdGhlciB0byBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEKKyAgICAgICAgdGVzdCBtZXRob2Qgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaAorICAgICAgICByZXR1cm5zIGEgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLgorCisgICAgICAgIFRoZSBtZXRob2Qgb3B0aW9uYWxseSByZXNvbHZlcyB0aGUgbmFtZXMgcmVsYXRpdmUgdG8gYSBnaXZlbiBtb2R1bGUuCisgICAgICAgICIiIgorICAgICAgICBwYXJ0cyA9IG5hbWUuc3BsaXQoJy4nKQorICAgICAgICBpZiBtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgICAgIHBhcnRzX2NvcHkgPSBwYXJ0c1s6XQorICAgICAgICAgICAgd2hpbGUgcGFydHNfY29weToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18oJy4nLmpvaW4ocGFydHNfY29weSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgICAgICBkZWwgcGFydHNfY29weVstMV0KKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHBhcnRzX2NvcHk6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgcGFydHMgPSBwYXJ0c1sxOl0KKyAgICAgICAgb2JqID0gbW9kdWxlCisgICAgICAgIGZvciBwYXJ0IGluIHBhcnRzOgorICAgICAgICAgICAgcGFyZW50LCBvYmogPSBvYmosIGdldGF0dHIob2JqLCBwYXJ0KQorCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCB0eXBlcy5Nb2R1bGVUeXBlKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRUZXN0c0Zyb21Nb2R1bGUob2JqKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyhvYmosIGNhc2UuVGVzdENhc2UpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZFRlc3RzRnJvbVRlc3RDYXNlKG9iaikKKyAgICAgICAgZWxpZiAoaXNpbnN0YW5jZShvYmosIHR5cGVzLlVuYm91bmRNZXRob2RUeXBlKSBhbmQKKyAgICAgICAgICAgICAgaXNpbnN0YW5jZShwYXJlbnQsIHR5cGUpIGFuZAorICAgICAgICAgICAgICBpc3N1YmNsYXNzKHBhcmVudCwgY2FzZS5UZXN0Q2FzZSkpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3VpdGVDbGFzcyhbcGFyZW50KG9iai5fX25hbWVfXyldKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBzdWl0ZS5UZXN0U3VpdGUpOgorICAgICAgICAgICAgcmV0dXJuIG9iagorICAgICAgICBlbGlmIGhhc2F0dHIob2JqLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgIHRlc3QgPSBvYmooKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0LCBzdWl0ZS5UZXN0U3VpdGUpOgorICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0CisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodGVzdCwgY2FzZS5UZXN0Q2FzZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3VpdGVDbGFzcyhbdGVzdF0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2FsbGluZyAlcyByZXR1cm5lZCAlcywgbm90IGEgdGVzdCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqLCB0ZXN0KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZG9uJ3Qga25vdyBob3cgdG8gbWFrZSB0ZXN0IGZyb206ICVzIiAlIG9iaikKKworICAgIGRlZiBsb2FkVGVzdHNGcm9tTmFtZXMoc2VsZiwgbmFtZXMsIG1vZHVsZT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGZvdW5kIHVzaW5nIHRoZSBnaXZlbiBzZXF1ZW5jZQorICAgICAgICBvZiBzdHJpbmcgc3BlY2lmaWVycy4gU2VlICdsb2FkVGVzdHNGcm9tTmFtZSgpJy4KKyAgICAgICAgIiIiCisgICAgICAgIHN1aXRlcyA9IFtzZWxmLmxvYWRUZXN0c0Zyb21OYW1lKG5hbWUsIG1vZHVsZSkgZm9yIG5hbWUgaW4gbmFtZXNdCisgICAgICAgIHJldHVybiBzZWxmLnN1aXRlQ2xhc3Moc3VpdGVzKQorCisgICAgZGVmIGdldFRlc3RDYXNlTmFtZXMoc2VsZiwgdGVzdENhc2VDbGFzcyk6CisgICAgICAgICIiIlJldHVybiBhIHNvcnRlZCBzZXF1ZW5jZSBvZiBtZXRob2QgbmFtZXMgZm91bmQgd2l0aGluIHRlc3RDYXNlQ2xhc3MKKyAgICAgICAgIiIiCisgICAgICAgIGRlZiBpc1Rlc3RNZXRob2QoYXR0cm5hbWUsIHRlc3RDYXNlQ2xhc3M9dGVzdENhc2VDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9c2VsZi50ZXN0TWV0aG9kUHJlZml4KToKKyAgICAgICAgICAgIHJldHVybiBhdHRybmFtZS5zdGFydHN3aXRoKHByZWZpeCkgYW5kIFwKKyAgICAgICAgICAgICAgICBoYXNhdHRyKGdldGF0dHIodGVzdENhc2VDbGFzcywgYXR0cm5hbWUpLCAnX19jYWxsX18nKQorICAgICAgICB0ZXN0Rm5OYW1lcyA9IGZpbHRlcihpc1Rlc3RNZXRob2QsIGRpcih0ZXN0Q2FzZUNsYXNzKSkKKyAgICAgICAgaWYgc2VsZi5zb3J0VGVzdE1ldGhvZHNVc2luZzoKKyAgICAgICAgICAgIHRlc3RGbk5hbWVzLnNvcnQoa2V5PV9DbXBUb0tleShzZWxmLnNvcnRUZXN0TWV0aG9kc1VzaW5nKSkKKyAgICAgICAgcmV0dXJuIHRlc3RGbk5hbWVzCisKKyAgICBkZWYgZGlzY292ZXIoc2VsZiwgc3RhcnRfZGlyLCBwYXR0ZXJuPSd0ZXN0Ki5weScsIHRvcF9sZXZlbF9kaXI9Tm9uZSk6CisgICAgICAgICIiIkZpbmQgYW5kIHJldHVybiBhbGwgdGVzdCBtb2R1bGVzIGZyb20gdGhlIHNwZWNpZmllZCBzdGFydAorICAgICAgICBkaXJlY3RvcnksIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzIHRvIGZpbmQgdGhlbS4gT25seSB0ZXN0IGZpbGVzCisgICAgICAgIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4gd2lsbCBiZSBsb2FkZWQuIChVc2luZyBzaGVsbCBzdHlsZSBwYXR0ZXJuCisgICAgICAgIG1hdGNoaW5nLikKKworICAgICAgICBBbGwgdGVzdCBtb2R1bGVzIG11c3QgYmUgaW1wb3J0YWJsZSBmcm9tIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHByb2plY3QuCisgICAgICAgIElmIHRoZSBzdGFydCBkaXJlY3RvcnkgaXMgbm90IHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IHRoZW4gdGhlIHRvcAorICAgICAgICBsZXZlbCBkaXJlY3RvcnkgbXVzdCBiZSBzcGVjaWZpZWQgc2VwYXJhdGVseS4KKworICAgICAgICBJZiBhIHRlc3QgcGFja2FnZSBuYW1lIChkaXJlY3Rvcnkgd2l0aCAnX19pbml0X18ucHknKSBtYXRjaGVzIHRoZQorICAgICAgICBwYXR0ZXJuIHRoZW4gdGhlIHBhY2thZ2Ugd2lsbCBiZSBjaGVja2VkIGZvciBhICdsb2FkX3Rlc3RzJyBmdW5jdGlvbi4gSWYKKyAgICAgICAgdGhpcyBleGlzdHMgdGhlbiBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoIGxvYWRlciwgdGVzdHMsIHBhdHRlcm4uCisKKyAgICAgICAgSWYgbG9hZF90ZXN0cyBleGlzdHMgdGhlbiBkaXNjb3ZlcnkgZG9lcyAgKm5vdCogcmVjdXJzZSBpbnRvIHRoZSBwYWNrYWdlLAorICAgICAgICBsb2FkX3Rlc3RzIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIGFsbCB0ZXN0cyBpbiB0aGUgcGFja2FnZS4KKworICAgICAgICBUaGUgcGF0dGVybiBpcyBkZWxpYmVyYXRlbHkgbm90IHN0b3JlZCBhcyBhIGxvYWRlciBhdHRyaWJ1dGUgc28gdGhhdAorICAgICAgICBwYWNrYWdlcyBjYW4gY29udGludWUgZGlzY292ZXJ5IHRoZW1zZWx2ZXMuIHRvcF9sZXZlbF9kaXIgaXMgc3RvcmVkIHNvCisgICAgICAgIGxvYWRfdGVzdHMgZG9lcyBub3QgbmVlZCB0byBwYXNzIHRoaXMgYXJndW1lbnQgaW4gdG8gbG9hZGVyLmRpc2NvdmVyKCkuCisgICAgICAgICIiIgorICAgICAgICBzZXRfaW1wbGljaXRfdG9wID0gRmFsc2UKKyAgICAgICAgaWYgdG9wX2xldmVsX2RpciBpcyBOb25lIGFuZCBzZWxmLl90b3BfbGV2ZWxfZGlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBtYWtlIHRvcF9sZXZlbF9kaXIgb3B0aW9uYWwgaWYgY2FsbGVkIGZyb20gbG9hZF90ZXN0cyBpbiBhIHBhY2thZ2UKKyAgICAgICAgICAgIHRvcF9sZXZlbF9kaXIgPSBzZWxmLl90b3BfbGV2ZWxfZGlyCisgICAgICAgIGVsaWYgdG9wX2xldmVsX2RpciBpcyBOb25lOgorICAgICAgICAgICAgc2V0X2ltcGxpY2l0X3RvcCA9IFRydWUKKyAgICAgICAgICAgIHRvcF9sZXZlbF9kaXIgPSBzdGFydF9kaXIKKworICAgICAgICB0b3BfbGV2ZWxfZGlyID0gb3MucGF0aC5hYnNwYXRoKHRvcF9sZXZlbF9kaXIpCisKKyAgICAgICAgaWYgbm90IHRvcF9sZXZlbF9kaXIgaW4gc3lzLnBhdGg6CisgICAgICAgICAgICAjIGFsbCB0ZXN0IG1vZHVsZXMgbXVzdCBiZSBpbXBvcnRhYmxlIGZyb20gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkKKyAgICAgICAgICAgICMgc2hvdWxkIHdlICp1bmNvbmRpdGlvbmFsbHkqIHB1dCB0aGUgc3RhcnQgZGlyZWN0b3J5IGluIGZpcnN0CisgICAgICAgICAgICAjIGluIHN5cy5wYXRoIHRvIG1pbmltaXNlIGxpa2VsaWhvb2Qgb2YgY29uZmxpY3RzIGJldHdlZW4gaW5zdGFsbGVkCisgICAgICAgICAgICAjIG1vZHVsZXMgYW5kIGRldmVsb3BtZW50IHZlcnNpb25zPworICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHRvcF9sZXZlbF9kaXIpCisgICAgICAgIHNlbGYuX3RvcF9sZXZlbF9kaXIgPSB0b3BfbGV2ZWxfZGlyCisKKyAgICAgICAgaXNfbm90X2ltcG9ydGFibGUgPSBGYWxzZQorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguYWJzcGF0aChzdGFydF9kaXIpKToKKyAgICAgICAgICAgIHN0YXJ0X2RpciA9IG9zLnBhdGguYWJzcGF0aChzdGFydF9kaXIpCisgICAgICAgICAgICBpZiBzdGFydF9kaXIgIT0gdG9wX2xldmVsX2RpcjoKKyAgICAgICAgICAgICAgICBpc19ub3RfaW1wb3J0YWJsZSA9IG5vdCBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oc3RhcnRfZGlyLCAnX19pbml0X18ucHknKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgc3VwcG9ydCBmb3IgZGlzY292ZXJ5IGZyb20gZG90dGVkIG1vZHVsZSBuYW1lcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIF9faW1wb3J0X18oc3RhcnRfZGlyKQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIGlzX25vdF9pbXBvcnRhYmxlID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0aGVfbW9kdWxlID0gc3lzLm1vZHVsZXNbc3RhcnRfZGlyXQorICAgICAgICAgICAgICAgIHRvcF9wYXJ0ID0gc3RhcnRfZGlyLnNwbGl0KCcuJylbMF0KKyAgICAgICAgICAgICAgICBzdGFydF9kaXIgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKCh0aGVfbW9kdWxlLl9fZmlsZV9fKSkpCisgICAgICAgICAgICAgICAgaWYgc2V0X2ltcGxpY2l0X3RvcDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fdG9wX2xldmVsX2RpciA9IHNlbGYuX2dldF9kaXJlY3RvcnlfY29udGFpbmluZ19tb2R1bGUodG9wX3BhcnQpCisgICAgICAgICAgICAgICAgICAgIHN5cy5wYXRoLnJlbW92ZSh0b3BfbGV2ZWxfZGlyKQorCisgICAgICAgIGlmIGlzX25vdF9pbXBvcnRhYmxlOgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoJ1N0YXJ0IGRpcmVjdG9yeSBpcyBub3QgaW1wb3J0YWJsZTogJXInICUgc3RhcnRfZGlyKQorCisgICAgICAgIHRlc3RzID0gbGlzdChzZWxmLl9maW5kX3Rlc3RzKHN0YXJ0X2RpciwgcGF0dGVybikpCisgICAgICAgIHJldHVybiBzZWxmLnN1aXRlQ2xhc3ModGVzdHMpCisKKyAgICBkZWYgX2dldF9kaXJlY3RvcnlfY29udGFpbmluZ19tb2R1bGUoc2VsZiwgbW9kdWxlX25hbWUpOgorICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0KKyAgICAgICAgZnVsbF9wYXRoID0gb3MucGF0aC5hYnNwYXRoKG1vZHVsZS5fX2ZpbGVfXykKKworICAgICAgICBpZiBvcy5wYXRoLmJhc2VuYW1lKGZ1bGxfcGF0aCkubG93ZXIoKS5zdGFydHN3aXRoKCdfX2luaXRfXy5weScpOgorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoZnVsbF9wYXRoKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgaGVyZSB3ZSBoYXZlIGJlZW4gZ2l2ZW4gYSBtb2R1bGUgcmF0aGVyIHRoYW4gYSBwYWNrYWdlIC0gc28KKyAgICAgICAgICAgICMgYWxsIHdlIGNhbiBkbyBpcyBzZWFyY2ggdGhlICpzYW1lKiBkaXJlY3RvcnkgdGhlIG1vZHVsZSBpcyBpbgorICAgICAgICAgICAgIyBzaG91bGQgYW4gZXhjZXB0aW9uIGJlIHJhaXNlZCBpbnN0ZWFkCisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKGZ1bGxfcGF0aCkKKworICAgIGRlZiBfZ2V0X25hbWVfZnJvbV9wYXRoKHNlbGYsIHBhdGgpOgorICAgICAgICBwYXRoID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLm5vcm1wYXRoKHBhdGgpKVswXQorCisgICAgICAgIF9yZWxwYXRoID0gb3MucGF0aC5yZWxwYXRoKHBhdGgsIHNlbGYuX3RvcF9sZXZlbF9kaXIpCisgICAgICAgIGFzc2VydCBub3Qgb3MucGF0aC5pc2FicyhfcmVscGF0aCksICJQYXRoIG11c3QgYmUgd2l0aGluIHRoZSBwcm9qZWN0IgorICAgICAgICBhc3NlcnQgbm90IF9yZWxwYXRoLnN0YXJ0c3dpdGgoJy4uJyksICJQYXRoIG11c3QgYmUgd2l0aGluIHRoZSBwcm9qZWN0IgorCisgICAgICAgIG5hbWUgPSBfcmVscGF0aC5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLicpCisgICAgICAgIHJldHVybiBuYW1lCisKKyAgICBkZWYgX2dldF9tb2R1bGVfZnJvbV9uYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBfX2ltcG9ydF9fKG5hbWUpCisgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tuYW1lXQorCisgICAgZGVmIF9tYXRjaF9wYXRoKHNlbGYsIHBhdGgsIGZ1bGxfcGF0aCwgcGF0dGVybik6CisgICAgICAgICMgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gdXNlIGFsdGVybmF0aXZlIG1hdGNoaW5nIHN0cmF0ZWd5CisgICAgICAgIHJldHVybiBmbm1hdGNoKHBhdGgsIHBhdHRlcm4pCisKKyAgICBkZWYgX2ZpbmRfdGVzdHMoc2VsZiwgc3RhcnRfZGlyLCBwYXR0ZXJuKToKKyAgICAgICAgIiIiVXNlZCBieSBkaXNjb3ZlcnkuIFlpZWxkcyB0ZXN0IHN1aXRlcyBpdCBsb2Fkcy4iIiIKKyAgICAgICAgcGF0aHMgPSBvcy5saXN0ZGlyKHN0YXJ0X2RpcikKKworICAgICAgICBmb3IgcGF0aCBpbiBwYXRoczoKKyAgICAgICAgICAgIGZ1bGxfcGF0aCA9IG9zLnBhdGguam9pbihzdGFydF9kaXIsIHBhdGgpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmdWxsX3BhdGgpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBWQUxJRF9NT0RVTEVfTkFNRS5tYXRjaChwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgIyB2YWxpZCBQeXRob24gaWRlbnRpZmllcnMgb25seQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9tYXRjaF9wYXRoKHBhdGgsIGZ1bGxfcGF0aCwgcGF0dGVybik6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgIyBpZiB0aGUgdGVzdCBmaWxlIG1hdGNoZXMsIGxvYWQgaXQKKyAgICAgICAgICAgICAgICBuYW1lID0gc2VsZi5fZ2V0X25hbWVfZnJvbV9wYXRoKGZ1bGxfcGF0aCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZSA9IHNlbGYuX2dldF9tb2R1bGVfZnJvbV9uYW1lKG5hbWUpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBfbWFrZV9mYWlsZWRfaW1wb3J0X3Rlc3QobmFtZSwgc2VsZi5zdWl0ZUNsYXNzKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1vZF9maWxlID0gb3MucGF0aC5hYnNwYXRoKGdldGF0dHIobW9kdWxlLCAnX19maWxlX18nLCBmdWxsX3BhdGgpKQorICAgICAgICAgICAgICAgICAgICByZWFscGF0aCA9IG9zLnBhdGguc3BsaXRleHQobW9kX2ZpbGUpWzBdCisgICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoX25vZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmdWxsX3BhdGgpWzBdCisgICAgICAgICAgICAgICAgICAgIGlmIHJlYWxwYXRoLmxvd2VyKCkgIT0gZnVsbHBhdGhfbm9leHQubG93ZXIoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUocmVhbHBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShmdWxsX3BhdGgpKVswXQorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZGlyID0gb3MucGF0aC5kaXJuYW1lKGZ1bGxfcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICgiJXIgbW9kdWxlIGluY29ycmVjdGx5IGltcG9ydGVkIGZyb20gJXIuIEV4cGVjdGVkICVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklzIHRoaXMgbW9kdWxlIGdsb2JhbGx5IGluc3RhbGxlZD8iKQorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IobXNnICUgKG1vZF9uYW1lLCBtb2R1bGVfZGlyLCBleHBlY3RlZF9kaXIpKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmxvYWRUZXN0c0Zyb21Nb2R1bGUobW9kdWxlKQorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKGZ1bGxfcGF0aCk6CisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihmdWxsX3BhdGgsICdfX2luaXRfXy5weScpKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGxvYWRfdGVzdHMgPSBOb25lCisgICAgICAgICAgICAgICAgdGVzdHMgPSBOb25lCisgICAgICAgICAgICAgICAgaWYgZm5tYXRjaChwYXRoLCBwYXR0ZXJuKToKKyAgICAgICAgICAgICAgICAgICAgIyBvbmx5IGNoZWNrIGxvYWRfdGVzdHMgaWYgdGhlIHBhY2thZ2UgZGlyZWN0b3J5IGl0c2VsZiBtYXRjaGVzIHRoZSBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHNlbGYuX2dldF9uYW1lX2Zyb21fcGF0aChmdWxsX3BhdGgpCisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UgPSBzZWxmLl9nZXRfbW9kdWxlX2Zyb21fbmFtZShuYW1lKQorICAgICAgICAgICAgICAgICAgICBsb2FkX3Rlc3RzID0gZ2V0YXR0cihwYWNrYWdlLCAnbG9hZF90ZXN0cycsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgIHRlc3RzID0gc2VsZi5sb2FkVGVzdHNGcm9tTW9kdWxlKHBhY2thZ2UsIHVzZV9sb2FkX3Rlc3RzPUZhbHNlKQorCisgICAgICAgICAgICAgICAgaWYgbG9hZF90ZXN0cyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0cyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdGVzdHMgbG9hZGVkIGZyb20gcGFja2FnZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0cworICAgICAgICAgICAgICAgICAgICAjIHJlY3Vyc2UgaW50byB0aGUgcGFja2FnZQorICAgICAgICAgICAgICAgICAgICBmb3IgdGVzdCBpbiBzZWxmLl9maW5kX3Rlc3RzKGZ1bGxfcGF0aCwgcGF0dGVybik6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgbG9hZF90ZXN0cyhzZWxmLCB0ZXN0cywgcGF0dGVybikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIF9tYWtlX2ZhaWxlZF9sb2FkX3Rlc3RzKHBhY2thZ2UuX19uYW1lX18sIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN1aXRlQ2xhc3MpCisKK2RlZmF1bHRUZXN0TG9hZGVyID0gVGVzdExvYWRlcigpCisKKworZGVmIF9tYWtlTG9hZGVyKHByZWZpeCwgc29ydFVzaW5nLCBzdWl0ZUNsYXNzPU5vbmUpOgorICAgIGxvYWRlciA9IFRlc3RMb2FkZXIoKQorICAgIGxvYWRlci5zb3J0VGVzdE1ldGhvZHNVc2luZyA9IHNvcnRVc2luZworICAgIGxvYWRlci50ZXN0TWV0aG9kUHJlZml4ID0gcHJlZml4CisgICAgaWYgc3VpdGVDbGFzczoKKyAgICAgICAgbG9hZGVyLnN1aXRlQ2xhc3MgPSBzdWl0ZUNsYXNzCisgICAgcmV0dXJuIGxvYWRlcgorCitkZWYgZ2V0VGVzdENhc2VOYW1lcyh0ZXN0Q2FzZUNsYXNzLCBwcmVmaXgsIHNvcnRVc2luZz1jbXApOgorICAgIHJldHVybiBfbWFrZUxvYWRlcihwcmVmaXgsIHNvcnRVc2luZykuZ2V0VGVzdENhc2VOYW1lcyh0ZXN0Q2FzZUNsYXNzKQorCitkZWYgbWFrZVN1aXRlKHRlc3RDYXNlQ2xhc3MsIHByZWZpeD0ndGVzdCcsIHNvcnRVc2luZz1jbXAsCisgICAgICAgICAgICAgIHN1aXRlQ2xhc3M9c3VpdGUuVGVzdFN1aXRlKToKKyAgICByZXR1cm4gX21ha2VMb2FkZXIocHJlZml4LCBzb3J0VXNpbmcsIHN1aXRlQ2xhc3MpLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZSh0ZXN0Q2FzZUNsYXNzKQorCitkZWYgZmluZFRlc3RDYXNlcyhtb2R1bGUsIHByZWZpeD0ndGVzdCcsIHNvcnRVc2luZz1jbXAsCisgICAgICAgICAgICAgICAgICBzdWl0ZUNsYXNzPXN1aXRlLlRlc3RTdWl0ZSk6CisgICAgcmV0dXJuIF9tYWtlTG9hZGVyKHByZWZpeCwgc29ydFVzaW5nLCBzdWl0ZUNsYXNzKS5sb2FkVGVzdHNGcm9tTW9kdWxlKG1vZHVsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbG9hZGVyLnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbG9hZGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzc1ZTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9sb2FkZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbG9hZGVyLnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbG9hZGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjNiODk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9sb2FkZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbWFpbi5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbWFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjUzNjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9tYWluLnB5CkBAIC0wLDAgKzEsMjM2IEBACisiIiJVbml0dGVzdCBtYWluIHByb2dyYW0iIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdHlwZXMKKworZnJvbSAuIGltcG9ydCBsb2FkZXIsIHJ1bm5lcgorZnJvbSAuc2lnbmFscyBpbXBvcnQgaW5zdGFsbEhhbmRsZXIKKworX191bml0dGVzdCA9IFRydWUKKworRkFJTEZBU1QgICAgID0gIiAgLWYsIC0tZmFpbGZhc3QgICBTdG9wIG9uIGZpcnN0IGZhaWx1cmVcbiIKK0NBVENIQlJFQUsgICA9ICIgIC1jLCAtLWNhdGNoICAgICAgQ2F0Y2ggY29udHJvbC1DIGFuZCBkaXNwbGF5IHJlc3VsdHNcbiIKK0JVRkZFUk9VVFBVVCA9ICIgIC1iLCAtLWJ1ZmZlciAgICAgQnVmZmVyIHN0ZG91dCBhbmQgc3RkZXJyIGR1cmluZyB0ZXN0IHJ1bnNcbiIKKworVVNBR0VfQVNfTUFJTiA9ICIiIlwKK1VzYWdlOiAlKHByb2dOYW1lKXMgW29wdGlvbnNdIFt0ZXN0c10KKworT3B0aW9uczoKKyAgLWgsIC0taGVscCAgICAgICBTaG93IHRoaXMgbWVzc2FnZQorICAtdiwgLS12ZXJib3NlICAgIFZlcmJvc2Ugb3V0cHV0CisgIC1xLCAtLXF1aWV0ICAgICAgTWluaW1hbCBvdXRwdXQKKyUoZmFpbGZhc3QpcyUoY2F0Y2hicmVhaylzJShidWZmZXIpcworRXhhbXBsZXM6CisgICUocHJvZ05hbWUpcyB0ZXN0X21vZHVsZSAgICAgICAgICAgICAgIC0gcnVuIHRlc3RzIGZyb20gdGVzdF9tb2R1bGUKKyAgJShwcm9nTmFtZSlzIG1vZHVsZS5UZXN0Q2xhc3MgICAgICAgICAgLSBydW4gdGVzdHMgZnJvbSBtb2R1bGUuVGVzdENsYXNzCisgICUocHJvZ05hbWUpcyBtb2R1bGUuQ2xhc3MudGVzdF9tZXRob2QgIC0gcnVuIHNwZWNpZmllZCB0ZXN0IG1ldGhvZAorCitbdGVzdHNdIGNhbiBiZSBhIGxpc3Qgb2YgYW55IG51bWJlciBvZiB0ZXN0IG1vZHVsZXMsIGNsYXNzZXMgYW5kIHRlc3QKK21ldGhvZHMuCisKK0FsdGVybmF0aXZlIFVzYWdlOiAlKHByb2dOYW1lKXMgZGlzY292ZXIgW29wdGlvbnNdCisKK09wdGlvbnM6CisgIC12LCAtLXZlcmJvc2UgICAgVmVyYm9zZSBvdXRwdXQKKyUoZmFpbGZhc3QpcyUoY2F0Y2hicmVhaylzJShidWZmZXIpcyAgLXMgZGlyZWN0b3J5ICAgICBEaXJlY3RvcnkgdG8gc3RhcnQgZGlzY292ZXJ5ICgnLicgZGVmYXVsdCkKKyAgLXAgcGF0dGVybiAgICAgICBQYXR0ZXJuIHRvIG1hdGNoIHRlc3QgZmlsZXMgKCd0ZXN0Ki5weScgZGVmYXVsdCkKKyAgLXQgZGlyZWN0b3J5ICAgICBUb3AgbGV2ZWwgZGlyZWN0b3J5IG9mIHByb2plY3QgKGRlZmF1bHQgdG8KKyAgICAgICAgICAgICAgICAgICBzdGFydCBkaXJlY3RvcnkpCisKK0ZvciB0ZXN0IGRpc2NvdmVyeSBhbGwgdGVzdCBtb2R1bGVzIG11c3QgYmUgaW1wb3J0YWJsZSBmcm9tIHRoZSB0b3AKK2xldmVsIGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdC4KKyIiIgorCitVU0FHRV9GUk9NX01PRFVMRSA9ICIiIlwKK1VzYWdlOiAlKHByb2dOYW1lKXMgW29wdGlvbnNdIFt0ZXN0XSBbLi4uXQorCitPcHRpb25zOgorICAtaCwgLS1oZWxwICAgICAgIFNob3cgdGhpcyBtZXNzYWdlCisgIC12LCAtLXZlcmJvc2UgICAgVmVyYm9zZSBvdXRwdXQKKyAgLXEsIC0tcXVpZXQgICAgICBNaW5pbWFsIG91dHB1dAorJShmYWlsZmFzdClzJShjYXRjaGJyZWFrKXMlKGJ1ZmZlcilzCitFeGFtcGxlczoKKyAgJShwcm9nTmFtZSlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gcnVuIGRlZmF1bHQgc2V0IG9mIHRlc3RzCisgICUocHJvZ05hbWUpcyBNeVRlc3RTdWl0ZSAgICAgICAgICAgICAgICAgICAtIHJ1biBzdWl0ZSAnTXlUZXN0U3VpdGUnCisgICUocHJvZ05hbWUpcyBNeVRlc3RDYXNlLnRlc3RTb21ldGhpbmcgICAgICAtIHJ1biBNeVRlc3RDYXNlLnRlc3RTb21ldGhpbmcKKyAgJShwcm9nTmFtZSlzIE15VGVzdENhc2UgICAgICAgICAgICAgICAgICAgIC0gcnVuIGFsbCAndGVzdConIHRlc3QgbWV0aG9kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBNeVRlc3RDYXNlCisiIiIKKworCisKK2NsYXNzIFRlc3RQcm9ncmFtKG9iamVjdCk6CisgICAgIiIiQSBjb21tYW5kLWxpbmUgcHJvZ3JhbSB0aGF0IHJ1bnMgYSBzZXQgb2YgdGVzdHM7IHRoaXMgaXMgcHJpbWFyaWx5CisgICAgICAgZm9yIG1ha2luZyB0ZXN0IG1vZHVsZXMgY29udmVuaWVudGx5IGV4ZWN1dGFibGUuCisgICAgIiIiCisgICAgVVNBR0UgPSBVU0FHRV9GUk9NX01PRFVMRQorCisgICAgIyBkZWZhdWx0cyBmb3IgdGVzdGluZworICAgIGZhaWxmYXN0ID0gY2F0Y2hicmVhayA9IGJ1ZmZlciA9IHByb2dOYW1lID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZT0nX19tYWluX18nLCBkZWZhdWx0VGVzdD1Ob25lLCBhcmd2PU5vbmUsCisgICAgICAgICAgICAgICAgICAgIHRlc3RSdW5uZXI9Tm9uZSwgdGVzdExvYWRlcj1sb2FkZXIuZGVmYXVsdFRlc3RMb2FkZXIsCisgICAgICAgICAgICAgICAgICAgIGV4aXQ9VHJ1ZSwgdmVyYm9zaXR5PTEsIGZhaWxmYXN0PU5vbmUsIGNhdGNoYnJlYWs9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyPU5vbmUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG1vZHVsZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBzZWxmLm1vZHVsZSA9IF9faW1wb3J0X18obW9kdWxlKQorICAgICAgICAgICAgZm9yIHBhcnQgaW4gbW9kdWxlLnNwbGl0KCcuJylbMTpdOgorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlID0gZ2V0YXR0cihzZWxmLm1vZHVsZSwgcGFydCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubW9kdWxlID0gbW9kdWxlCisgICAgICAgIGlmIGFyZ3YgaXMgTm9uZToKKyAgICAgICAgICAgIGFyZ3YgPSBzeXMuYXJndgorCisgICAgICAgIHNlbGYuZXhpdCA9IGV4aXQKKyAgICAgICAgc2VsZi5mYWlsZmFzdCA9IGZhaWxmYXN0CisgICAgICAgIHNlbGYuY2F0Y2hicmVhayA9IGNhdGNoYnJlYWsKKyAgICAgICAgc2VsZi52ZXJib3NpdHkgPSB2ZXJib3NpdHkKKyAgICAgICAgc2VsZi5idWZmZXIgPSBidWZmZXIKKyAgICAgICAgc2VsZi5kZWZhdWx0VGVzdCA9IGRlZmF1bHRUZXN0CisgICAgICAgIHNlbGYudGVzdFJ1bm5lciA9IHRlc3RSdW5uZXIKKyAgICAgICAgc2VsZi50ZXN0TG9hZGVyID0gdGVzdExvYWRlcgorICAgICAgICBzZWxmLnByb2dOYW1lID0gb3MucGF0aC5iYXNlbmFtZShhcmd2WzBdKQorICAgICAgICBzZWxmLnBhcnNlQXJncyhhcmd2KQorICAgICAgICBzZWxmLnJ1blRlc3RzKCkKKworICAgIGRlZiB1c2FnZUV4aXQoc2VsZiwgbXNnPU5vbmUpOgorICAgICAgICBpZiBtc2c6CisgICAgICAgICAgICBwcmludCBtc2cKKyAgICAgICAgdXNhZ2UgPSB7J3Byb2dOYW1lJzogc2VsZi5wcm9nTmFtZSwgJ2NhdGNoYnJlYWsnOiAnJywgJ2ZhaWxmYXN0JzogJycsCisgICAgICAgICAgICAgICAgICdidWZmZXInOiAnJ30KKyAgICAgICAgaWYgc2VsZi5mYWlsZmFzdCAhPSBGYWxzZToKKyAgICAgICAgICAgIHVzYWdlWydmYWlsZmFzdCddID0gRkFJTEZBU1QKKyAgICAgICAgaWYgc2VsZi5jYXRjaGJyZWFrICE9IEZhbHNlOgorICAgICAgICAgICAgdXNhZ2VbJ2NhdGNoYnJlYWsnXSA9IENBVENIQlJFQUsKKyAgICAgICAgaWYgc2VsZi5idWZmZXIgIT0gRmFsc2U6CisgICAgICAgICAgICB1c2FnZVsnYnVmZmVyJ10gPSBCVUZGRVJPVVRQVVQKKyAgICAgICAgcHJpbnQgc2VsZi5VU0FHRSAlIHVzYWdlCisgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICBkZWYgcGFyc2VBcmdzKHNlbGYsIGFyZ3YpOgorICAgICAgICBpZiBsZW4oYXJndikgPiAxIGFuZCBhcmd2WzFdLmxvd2VyKCkgPT0gJ2Rpc2NvdmVyJzoKKyAgICAgICAgICAgIHNlbGYuX2RvX2Rpc2NvdmVyeShhcmd2WzI6XSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGltcG9ydCBnZXRvcHQKKyAgICAgICAgbG9uZ19vcHRzID0gWydoZWxwJywgJ3ZlcmJvc2UnLCAncXVpZXQnLCAnZmFpbGZhc3QnLCAnY2F0Y2gnLCAnYnVmZmVyJ10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3B0aW9ucywgYXJncyA9IGdldG9wdC5nZXRvcHQoYXJndlsxOl0sICdoSHZxZmNiJywgbG9uZ19vcHRzKQorICAgICAgICAgICAgZm9yIG9wdCwgdmFsdWUgaW4gb3B0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBvcHQgaW4gKCctaCcsJy1IJywnLS1oZWxwJyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudXNhZ2VFeGl0KCkKKyAgICAgICAgICAgICAgICBpZiBvcHQgaW4gKCctcScsJy0tcXVpZXQnKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi52ZXJib3NpdHkgPSAwCisgICAgICAgICAgICAgICAgaWYgb3B0IGluICgnLXYnLCctLXZlcmJvc2UnKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi52ZXJib3NpdHkgPSAyCisgICAgICAgICAgICAgICAgaWYgb3B0IGluICgnLWYnLCctLWZhaWxmYXN0Jyk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZmFpbGZhc3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbGZhc3QgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICMgU2hvdWxkIHRoaXMgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIC1mIGlzIG5vdCB2YWxpZD8KKyAgICAgICAgICAgICAgICBpZiBvcHQgaW4gKCctYycsJy0tY2F0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5jYXRjaGJyZWFrIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhdGNoYnJlYWsgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICMgU2hvdWxkIHRoaXMgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIC1jIGlzIG5vdCB2YWxpZD8KKyAgICAgICAgICAgICAgICBpZiBvcHQgaW4gKCctYicsJy0tYnVmZmVyJyk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuYnVmZmVyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgIyBTaG91bGQgdGhpcyByYWlzZSBhbiBleGNlcHRpb24gaWYgLWIgaXMgbm90IHZhbGlkPworICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID09IDAgYW5kIHNlbGYuZGVmYXVsdFRlc3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIGNyZWF0ZVRlc3RzIHdpbGwgbG9hZCB0ZXN0cyBmcm9tIHNlbGYubW9kdWxlCisgICAgICAgICAgICAgICAgc2VsZi50ZXN0TmFtZXMgPSBOb25lCisgICAgICAgICAgICBlbGlmIGxlbihhcmdzKSA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi50ZXN0TmFtZXMgPSBhcmdzCisgICAgICAgICAgICAgICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAgICAgICAgICAgICAgICAgIyB0byBzdXBwb3J0IHB5dGhvbiAtbSB1bml0dGVzdCAuLi4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYudGVzdE5hbWVzID0gKHNlbGYuZGVmYXVsdFRlc3QsKQorICAgICAgICAgICAgc2VsZi5jcmVhdGVUZXN0cygpCisgICAgICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHNlbGYudXNhZ2VFeGl0KG1zZykKKworICAgIGRlZiBjcmVhdGVUZXN0cyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi50ZXN0TmFtZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGVzdCA9IHNlbGYudGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYubW9kdWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ZXN0ID0gc2VsZi50ZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhzZWxmLnRlc3ROYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUpCisKKyAgICBkZWYgX2RvX2Rpc2NvdmVyeShzZWxmLCBhcmd2LCBMb2FkZXI9Tm9uZSk6CisgICAgICAgIGlmIExvYWRlciBpcyBOb25lOgorICAgICAgICAgICAgTG9hZGVyID0gbGFtYmRhOiBzZWxmLnRlc3RMb2FkZXIKKworICAgICAgICAjIGhhbmRsZSBjb21tYW5kIGxpbmUgYXJncyBmb3IgdGVzdCBkaXNjb3ZlcnkKKyAgICAgICAgc2VsZi5wcm9nTmFtZSA9ICclcyBkaXNjb3ZlcicgJSBzZWxmLnByb2dOYW1lCisgICAgICAgIGltcG9ydCBvcHRwYXJzZQorICAgICAgICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoKQorICAgICAgICBwYXJzZXIucHJvZyA9IHNlbGYucHJvZ05hbWUKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oJy12JywgJy0tdmVyYm9zZScsIGRlc3Q9J3ZlcmJvc2UnLCBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdWZXJib3NlIG91dHB1dCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgICAgIGlmIHNlbGYuZmFpbGZhc3QgIT0gRmFsc2U6CisgICAgICAgICAgICBwYXJzZXIuYWRkX29wdGlvbignLWYnLCAnLS1mYWlsZmFzdCcsIGRlc3Q9J2ZhaWxmYXN0JywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1N0b3Agb24gZmlyc3QgZmFpbCBvciBlcnJvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgICAgICBpZiBzZWxmLmNhdGNoYnJlYWsgIT0gRmFsc2U6CisgICAgICAgICAgICBwYXJzZXIuYWRkX29wdGlvbignLWMnLCAnLS1jYXRjaCcsIGRlc3Q9J2NhdGNoYnJlYWsnLCBkZWZhdWx0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nQ2F0Y2ggY3RybC1DIGFuZCBkaXNwbGF5IHJlc3VsdHMgc28gZmFyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgICAgIGlmIHNlbGYuYnVmZmVyICE9IEZhbHNlOgorICAgICAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1iJywgJy0tYnVmZmVyJywgZGVzdD0nYnVmZmVyJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0J1ZmZlciBzdGRvdXQgYW5kIHN0ZGVyciBkdXJpbmcgdGVzdHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1zJywgJy0tc3RhcnQtZGlyZWN0b3J5JywgZGVzdD0nc3RhcnQnLCBkZWZhdWx0PScuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRGlyZWN0b3J5IHRvIHN0YXJ0IGRpc2NvdmVyeSAoJy4nIGRlZmF1bHQpIikKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1wJywgJy0tcGF0dGVybicsIGRlc3Q9J3BhdHRlcm4nLCBkZWZhdWx0PSd0ZXN0Ki5weScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlBhdHRlcm4gdG8gbWF0Y2ggdGVzdHMgKCd0ZXN0Ki5weScgZGVmYXVsdCkiKQorICAgICAgICBwYXJzZXIuYWRkX29wdGlvbignLXQnLCAnLS10b3AtbGV2ZWwtZGlyZWN0b3J5JywgZGVzdD0ndG9wJywgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdUb3AgbGV2ZWwgZGlyZWN0b3J5IG9mIHByb2plY3QgKGRlZmF1bHRzIHRvIHN0YXJ0IGRpcmVjdG9yeSknKQorCisgICAgICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2KQorICAgICAgICBpZiBsZW4oYXJncykgPiAzOgorICAgICAgICAgICAgc2VsZi51c2FnZUV4aXQoKQorCisgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiB6aXAoKCdzdGFydCcsICdwYXR0ZXJuJywgJ3RvcCcpLCBhcmdzKToKKyAgICAgICAgICAgIHNldGF0dHIob3B0aW9ucywgbmFtZSwgdmFsdWUpCisKKyAgICAgICAgIyBvbmx5IHNldCBvcHRpb25zIGZyb20gdGhlIHBhcnNpbmcgaGVyZQorICAgICAgICAjIGlmIHRoZXkgd2VyZW4ndCBzZXQgZXhwbGljaXRseSBpbiB0aGUgY29uc3RydWN0b3IKKyAgICAgICAgaWYgc2VsZi5mYWlsZmFzdCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5mYWlsZmFzdCA9IG9wdGlvbnMuZmFpbGZhc3QKKyAgICAgICAgaWYgc2VsZi5jYXRjaGJyZWFrIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmNhdGNoYnJlYWsgPSBvcHRpb25zLmNhdGNoYnJlYWsKKyAgICAgICAgaWYgc2VsZi5idWZmZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gb3B0aW9ucy5idWZmZXIKKworICAgICAgICBpZiBvcHRpb25zLnZlcmJvc2U6CisgICAgICAgICAgICBzZWxmLnZlcmJvc2l0eSA9IDIKKworICAgICAgICBzdGFydF9kaXIgPSBvcHRpb25zLnN0YXJ0CisgICAgICAgIHBhdHRlcm4gPSBvcHRpb25zLnBhdHRlcm4KKyAgICAgICAgdG9wX2xldmVsX2RpciA9IG9wdGlvbnMudG9wCisKKyAgICAgICAgbG9hZGVyID0gTG9hZGVyKCkKKyAgICAgICAgc2VsZi50ZXN0ID0gbG9hZGVyLmRpc2NvdmVyKHN0YXJ0X2RpciwgcGF0dGVybiwgdG9wX2xldmVsX2RpcikKKworICAgIGRlZiBydW5UZXN0cyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jYXRjaGJyZWFrOgorICAgICAgICAgICAgaW5zdGFsbEhhbmRsZXIoKQorICAgICAgICBpZiBzZWxmLnRlc3RSdW5uZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGVzdFJ1bm5lciA9IHJ1bm5lci5UZXh0VGVzdFJ1bm5lcgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYudGVzdFJ1bm5lciwgKHR5cGUsIHR5cGVzLkNsYXNzVHlwZSkpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRlc3RSdW5uZXIgPSBzZWxmLnRlc3RSdW5uZXIodmVyYm9zaXR5PXNlbGYudmVyYm9zaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGZhc3Q9c2VsZi5mYWlsZmFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcj1zZWxmLmJ1ZmZlcikKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBkaWRuJ3QgYWNjZXB0IHRoZSB2ZXJib3NpdHksIGJ1ZmZlciBvciBmYWlsZmFzdCBhcmd1bWVudHMKKyAgICAgICAgICAgICAgICB0ZXN0UnVubmVyID0gc2VsZi50ZXN0UnVubmVyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgaXQgaXMgYXNzdW1lZCB0byBiZSBhIFRlc3RSdW5uZXIgaW5zdGFuY2UKKyAgICAgICAgICAgIHRlc3RSdW5uZXIgPSBzZWxmLnRlc3RSdW5uZXIKKyAgICAgICAgc2VsZi5yZXN1bHQgPSB0ZXN0UnVubmVyLnJ1bihzZWxmLnRlc3QpCisgICAgICAgIGlmIHNlbGYuZXhpdDoKKyAgICAgICAgICAgIHN5cy5leGl0KG5vdCBzZWxmLnJlc3VsdC53YXNTdWNjZXNzZnVsKCkpCisKK21haW4gPSBUZXN0UHJvZ3JhbQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9tYWluLnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbWFpbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ4Yjg1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbWFpbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9tYWluLnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbWFpbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ4Yjg1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbWFpbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9yZXN1bHQucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Jlc3VsdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2MxN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9yZXN1bHQucHkKQEAgLTAsMCArMSwxOTMgQEAKKyIiIlRlc3QgcmVzdWx0IG9iamVjdCIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0cmFjZWJhY2sKKworZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworZnJvbSAuIGltcG9ydCB1dGlsCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKKworX191bml0dGVzdCA9IFRydWUKKworZGVmIGZhaWxmYXN0KG1ldGhvZCk6CisgICAgQHdyYXBzKG1ldGhvZCkKKyAgICBkZWYgaW5uZXIoc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICdmYWlsZmFzdCcsIEZhbHNlKToKKyAgICAgICAgICAgIHNlbGYuc3RvcCgpCisgICAgICAgIHJldHVybiBtZXRob2Qoc2VsZiwgKmFyZ3MsICoqa3cpCisgICAgcmV0dXJuIGlubmVyCisKK1NURE9VVF9MSU5FID0gJ1xuU3Rkb3V0OlxuJXMnCitTVERFUlJfTElORSA9ICdcblN0ZGVycjpcbiVzJworCisKK2NsYXNzIFRlc3RSZXN1bHQob2JqZWN0KToKKyAgICAiIiJIb2xkZXIgZm9yIHRlc3QgcmVzdWx0IGluZm9ybWF0aW9uLgorCisgICAgVGVzdCByZXN1bHRzIGFyZSBhdXRvbWF0aWNhbGx5IG1hbmFnZWQgYnkgdGhlIFRlc3RDYXNlIGFuZCBUZXN0U3VpdGUKKyAgICBjbGFzc2VzLCBhbmQgZG8gbm90IG5lZWQgdG8gYmUgZXhwbGljaXRseSBtYW5pcHVsYXRlZCBieSB3cml0ZXJzIG9mIHRlc3RzLgorCisgICAgRWFjaCBpbnN0YW5jZSBob2xkcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRlc3RzIHJ1biwgYW5kIGNvbGxlY3Rpb25zIG9mCisgICAgZmFpbHVyZXMgYW5kIGVycm9ycyB0aGF0IG9jY3VycmVkIGFtb25nIHRob3NlIHRlc3QgcnVucy4gVGhlIGNvbGxlY3Rpb25zCisgICAgY29udGFpbiB0dXBsZXMgb2YgKHRlc3RjYXNlLCBleGNlcHRpb25pbmZvKSwgd2hlcmUgZXhjZXB0aW9uaW5mbyBpcyB0aGUKKyAgICBmb3JtYXR0ZWQgdHJhY2ViYWNrIG9mIHRoZSBlcnJvciB0aGF0IG9jY3VycmVkLgorICAgICIiIgorICAgIF9wcmV2aW91c1Rlc3RDbGFzcyA9IE5vbmUKKyAgICBfdGVzdFJ1bkVudGVyZWQgPSBGYWxzZQorICAgIF9tb2R1bGVTZXRVcEZhaWxlZCA9IEZhbHNlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbT1Ob25lLCBkZXNjcmlwdGlvbnM9Tm9uZSwgdmVyYm9zaXR5PU5vbmUpOgorICAgICAgICBzZWxmLmZhaWxmYXN0ID0gRmFsc2UKKyAgICAgICAgc2VsZi5mYWlsdXJlcyA9IFtdCisgICAgICAgIHNlbGYuZXJyb3JzID0gW10KKyAgICAgICAgc2VsZi50ZXN0c1J1biA9IDAKKyAgICAgICAgc2VsZi5za2lwcGVkID0gW10KKyAgICAgICAgc2VsZi5leHBlY3RlZEZhaWx1cmVzID0gW10KKyAgICAgICAgc2VsZi51bmV4cGVjdGVkU3VjY2Vzc2VzID0gW10KKyAgICAgICAgc2VsZi5zaG91bGRTdG9wID0gRmFsc2UKKyAgICAgICAgc2VsZi5idWZmZXIgPSBGYWxzZQorICAgICAgICBzZWxmLl9zdGRvdXRfYnVmZmVyID0gTm9uZQorICAgICAgICBzZWxmLl9zdGRlcnJfYnVmZmVyID0gTm9uZQorICAgICAgICBzZWxmLl9vcmlnaW5hbF9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHNlbGYuX29yaWdpbmFsX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgc2VsZi5fbWlycm9yT3V0cHV0ID0gRmFsc2UKKworICAgIGRlZiBwcmludEVycm9ycyhzZWxmKToKKyAgICAgICAgIkNhbGxlZCBieSBUZXN0UnVubmVyIGFmdGVyIHRlc3QgcnVuIgorCisgICAgZGVmIHN0YXJ0VGVzdChzZWxmLCB0ZXN0KToKKyAgICAgICAgIkNhbGxlZCB3aGVuIHRoZSBnaXZlbiB0ZXN0IGlzIGFib3V0IHRvIGJlIHJ1biIKKyAgICAgICAgc2VsZi50ZXN0c1J1biArPSAxCisgICAgICAgIHNlbGYuX21pcnJvck91dHB1dCA9IEZhbHNlCisgICAgICAgIHNlbGYuX3NldHVwU3Rkb3V0KCkKKworICAgIGRlZiBfc2V0dXBTdGRvdXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYnVmZmVyOgorICAgICAgICAgICAgaWYgc2VsZi5fc3RkZXJyX2J1ZmZlciBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuX3N0ZGVycl9idWZmZXIgPSBTdHJpbmdJTygpCisgICAgICAgICAgICAgICAgc2VsZi5fc3Rkb3V0X2J1ZmZlciA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLl9zdGRvdXRfYnVmZmVyCisgICAgICAgICAgICBzeXMuc3RkZXJyID0gc2VsZi5fc3RkZXJyX2J1ZmZlcgorCisgICAgZGVmIHN0YXJ0VGVzdFJ1bihzZWxmKToKKyAgICAgICAgIiIiQ2FsbGVkIG9uY2UgYmVmb3JlIGFueSB0ZXN0cyBhcmUgZXhlY3V0ZWQuCisKKyAgICAgICAgU2VlIHN0YXJ0VGVzdCBmb3IgYSBtZXRob2QgY2FsbGVkIGJlZm9yZSBlYWNoIHRlc3QuCisgICAgICAgICIiIgorCisgICAgZGVmIHN0b3BUZXN0KHNlbGYsIHRlc3QpOgorICAgICAgICAiIiJDYWxsZWQgd2hlbiB0aGUgZ2l2ZW4gdGVzdCBoYXMgYmVlbiBydW4iIiIKKyAgICAgICAgc2VsZi5fcmVzdG9yZVN0ZG91dCgpCisgICAgICAgIHNlbGYuX21pcnJvck91dHB1dCA9IEZhbHNlCisKKyAgICBkZWYgX3Jlc3RvcmVTdGRvdXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYnVmZmVyOgorICAgICAgICAgICAgaWYgc2VsZi5fbWlycm9yT3V0cHV0OgorICAgICAgICAgICAgICAgIG91dHB1dCA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICAgICAgICAgIGVycm9yID0gc3lzLnN0ZGVyci5nZXR2YWx1ZSgpCisgICAgICAgICAgICAgICAgaWYgb3V0cHV0OgorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3V0cHV0LmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ICs9ICdcbicKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fb3JpZ2luYWxfc3Rkb3V0LndyaXRlKFNURE9VVF9MSU5FICUgb3V0cHV0KQorICAgICAgICAgICAgICAgIGlmIGVycm9yOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZXJyb3IuZW5kc3dpdGgoJ1xuJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciArPSAnXG4nCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX29yaWdpbmFsX3N0ZGVyci53cml0ZShTVERFUlJfTElORSAlIGVycm9yKQorCisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5fb3JpZ2luYWxfc3Rkb3V0CisgICAgICAgICAgICBzeXMuc3RkZXJyID0gc2VsZi5fb3JpZ2luYWxfc3RkZXJyCisgICAgICAgICAgICBzZWxmLl9zdGRvdXRfYnVmZmVyLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuX3N0ZG91dF9idWZmZXIudHJ1bmNhdGUoKQorICAgICAgICAgICAgc2VsZi5fc3RkZXJyX2J1ZmZlci5zZWVrKDApCisgICAgICAgICAgICBzZWxmLl9zdGRlcnJfYnVmZmVyLnRydW5jYXRlKCkKKworICAgIGRlZiBzdG9wVGVzdFJ1bihzZWxmKToKKyAgICAgICAgIiIiQ2FsbGVkIG9uY2UgYWZ0ZXIgYWxsIHRlc3RzIGFyZSBleGVjdXRlZC4KKworICAgICAgICBTZWUgc3RvcFRlc3QgZm9yIGEgbWV0aG9kIGNhbGxlZCBhZnRlciBlYWNoIHRlc3QuCisgICAgICAgICIiIgorCisgICAgQGZhaWxmYXN0CisgICAgZGVmIGFkZEVycm9yKHNlbGYsIHRlc3QsIGVycik6CisgICAgICAgICIiIkNhbGxlZCB3aGVuIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4gJ2VycicgaXMgYSB0dXBsZSBvZiB2YWx1ZXMgYXMKKyAgICAgICAgcmV0dXJuZWQgYnkgc3lzLmV4Y19pbmZvKCkuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoKHRlc3QsIHNlbGYuX2V4Y19pbmZvX3RvX3N0cmluZyhlcnIsIHRlc3QpKSkKKyAgICAgICAgc2VsZi5fbWlycm9yT3V0cHV0ID0gVHJ1ZQorCisgICAgQGZhaWxmYXN0CisgICAgZGVmIGFkZEZhaWx1cmUoc2VsZiwgdGVzdCwgZXJyKToKKyAgICAgICAgIiIiQ2FsbGVkIHdoZW4gYW4gZXJyb3IgaGFzIG9jY3VycmVkLiAnZXJyJyBpcyBhIHR1cGxlIG9mIHZhbHVlcyBhcworICAgICAgICByZXR1cm5lZCBieSBzeXMuZXhjX2luZm8oKS4iIiIKKyAgICAgICAgc2VsZi5mYWlsdXJlcy5hcHBlbmQoKHRlc3QsIHNlbGYuX2V4Y19pbmZvX3RvX3N0cmluZyhlcnIsIHRlc3QpKSkKKyAgICAgICAgc2VsZi5fbWlycm9yT3V0cHV0ID0gVHJ1ZQorCisgICAgZGVmIGFkZFN1Y2Nlc3Moc2VsZiwgdGVzdCk6CisgICAgICAgICJDYWxsZWQgd2hlbiBhIHRlc3QgaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBhZGRTa2lwKHNlbGYsIHRlc3QsIHJlYXNvbik6CisgICAgICAgICIiIkNhbGxlZCB3aGVuIGEgdGVzdCBpcyBza2lwcGVkLiIiIgorICAgICAgICBzZWxmLnNraXBwZWQuYXBwZW5kKCh0ZXN0LCByZWFzb24pKQorCisgICAgZGVmIGFkZEV4cGVjdGVkRmFpbHVyZShzZWxmLCB0ZXN0LCBlcnIpOgorICAgICAgICAiIiJDYWxsZWQgd2hlbiBhbiBleHBlY3RlZCBmYWlsdXJlL2Vycm9yIG9jY3VyZWQuIiIiCisgICAgICAgIHNlbGYuZXhwZWN0ZWRGYWlsdXJlcy5hcHBlbmQoCisgICAgICAgICAgICAodGVzdCwgc2VsZi5fZXhjX2luZm9fdG9fc3RyaW5nKGVyciwgdGVzdCkpKQorCisgICAgQGZhaWxmYXN0CisgICAgZGVmIGFkZFVuZXhwZWN0ZWRTdWNjZXNzKHNlbGYsIHRlc3QpOgorICAgICAgICAiIiJDYWxsZWQgd2hlbiBhIHRlc3Qgd2FzIGV4cGVjdGVkIHRvIGZhaWwsIGJ1dCBzdWNjZWVkLiIiIgorICAgICAgICBzZWxmLnVuZXhwZWN0ZWRTdWNjZXNzZXMuYXBwZW5kKHRlc3QpCisKKyAgICBkZWYgd2FzU3VjY2Vzc2Z1bChzZWxmKToKKyAgICAgICAgIlRlbGxzIHdoZXRoZXIgb3Igbm90IHRoaXMgcmVzdWx0IHdhcyBhIHN1Y2Nlc3MiCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5mYWlsdXJlcykgPT0gbGVuKHNlbGYuZXJyb3JzKSA9PSAwCisKKyAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgIkluZGljYXRlcyB0aGF0IHRoZSB0ZXN0cyBzaG91bGQgYmUgYWJvcnRlZCIKKyAgICAgICAgc2VsZi5zaG91bGRTdG9wID0gVHJ1ZQorCisgICAgZGVmIF9leGNfaW5mb190b19zdHJpbmcoc2VsZiwgZXJyLCB0ZXN0KToKKyAgICAgICAgIiIiQ29udmVydHMgYSBzeXMuZXhjX2luZm8oKS1zdHlsZSB0dXBsZSBvZiB2YWx1ZXMgaW50byBhIHN0cmluZy4iIiIKKyAgICAgICAgZXhjdHlwZSwgdmFsdWUsIHRiID0gZXJyCisgICAgICAgICMgU2tpcCB0ZXN0IHJ1bm5lciB0cmFjZWJhY2sgbGV2ZWxzCisgICAgICAgIHdoaWxlIHRiIGFuZCBzZWxmLl9pc19yZWxldmFudF90Yl9sZXZlbCh0Yik6CisgICAgICAgICAgICB0YiA9IHRiLnRiX25leHQKKworICAgICAgICBpZiBleGN0eXBlIGlzIHRlc3QuZmFpbHVyZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgICMgU2tpcCBhc3NlcnQqKCkgdHJhY2ViYWNrIGxldmVscworICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5fY291bnRfcmVsZXZhbnRfdGJfbGV2ZWxzKHRiKQorICAgICAgICAgICAgbXNnTGluZXMgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbihleGN0eXBlLCB2YWx1ZSwgdGIsIGxlbmd0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZ0xpbmVzID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb24oZXhjdHlwZSwgdmFsdWUsIHRiKQorCisgICAgICAgIGlmIHNlbGYuYnVmZmVyOgorICAgICAgICAgICAgb3V0cHV0ID0gc3lzLnN0ZG91dC5nZXR2YWx1ZSgpCisgICAgICAgICAgICBlcnJvciA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICAgICAgaWYgb3V0cHV0OgorICAgICAgICAgICAgICAgIGlmIG5vdCBvdXRwdXQuZW5kc3dpdGgoJ1xuJyk6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSAnXG4nCisgICAgICAgICAgICAgICAgbXNnTGluZXMuYXBwZW5kKFNURE9VVF9MSU5FICUgb3V0cHV0KQorICAgICAgICAgICAgaWYgZXJyb3I6CisgICAgICAgICAgICAgICAgaWYgbm90IGVycm9yLmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgICAgICAgICBlcnJvciArPSAnXG4nCisgICAgICAgICAgICAgICAgbXNnTGluZXMuYXBwZW5kKFNUREVSUl9MSU5FICUgZXJyb3IpCisgICAgICAgIHJldHVybiAnJy5qb2luKG1zZ0xpbmVzKQorCisKKyAgICBkZWYgX2lzX3JlbGV2YW50X3RiX2xldmVsKHNlbGYsIHRiKToKKyAgICAgICAgcmV0dXJuICdfX3VuaXR0ZXN0JyBpbiB0Yi50Yl9mcmFtZS5mX2dsb2JhbHMKKworICAgIGRlZiBfY291bnRfcmVsZXZhbnRfdGJfbGV2ZWxzKHNlbGYsIHRiKToKKyAgICAgICAgbGVuZ3RoID0gMAorICAgICAgICB3aGlsZSB0YiBhbmQgbm90IHNlbGYuX2lzX3JlbGV2YW50X3RiX2xldmVsKHRiKToKKyAgICAgICAgICAgIGxlbmd0aCArPSAxCisgICAgICAgICAgICB0YiA9IHRiLnRiX25leHQKKyAgICAgICAgcmV0dXJuIGxlbmd0aAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gKCI8JXMgcnVuPSVpIGVycm9ycz0laSBmYWlsdXJlcz0laT4iICUKKyAgICAgICAgICAgICAgICh1dGlsLnN0cmNsYXNzKHNlbGYuX19jbGFzc19fKSwgc2VsZi50ZXN0c1J1biwgbGVuKHNlbGYuZXJyb3JzKSwKKyAgICAgICAgICAgICAgICBsZW4oc2VsZi5mYWlsdXJlcykpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9yZXN1bHQucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9yZXN1bHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Mjg3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Jlc3VsdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9yZXN1bHQucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9yZXN1bHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4Mjg3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Jlc3VsdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9ydW5uZXIucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3J1bm5lci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjMyZmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9ydW5uZXIucHkKQEAgLTAsMCArMSwxOTYgQEAKKyIiIlJ1bm5pbmcgdGVzdHMiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKKworZnJvbSAuIGltcG9ydCByZXN1bHQKK2Zyb20gLnNpZ25hbHMgaW1wb3J0IHJlZ2lzdGVyUmVzdWx0CisKK19fdW5pdHRlc3QgPSBUcnVlCisKKworY2xhc3MgX1dyaXRlbG5EZWNvcmF0b3Iob2JqZWN0KToKKyAgICAiIiJVc2VkIHRvIGRlY29yYXRlIGZpbGUtbGlrZSBvYmplY3RzIHdpdGggYSBoYW5keSAnd3JpdGVsbicgbWV0aG9kIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsc3RyZWFtKToKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgaWYgYXR0ciBpbiAoJ3N0cmVhbScsICdfX2dldHN0YXRlX18nKToKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKGF0dHIpCisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc3RyZWFtLGF0dHIpCisKKyAgICBkZWYgd3JpdGVsbihzZWxmLCBhcmc9Tm9uZSk6CisgICAgICAgIGlmIGFyZzoKKyAgICAgICAgICAgIHNlbGYud3JpdGUoYXJnKQorICAgICAgICBzZWxmLndyaXRlKCdcbicpICMgdGV4dC1tb2RlIHN0cmVhbXMgdHJhbnNsYXRlIHRvIFxyXG4gaWYgbmVlZGVkCisKKworY2xhc3MgVGV4dFRlc3RSZXN1bHQocmVzdWx0LlRlc3RSZXN1bHQpOgorICAgICIiIkEgdGVzdCByZXN1bHQgY2xhc3MgdGhhdCBjYW4gcHJpbnQgZm9ybWF0dGVkIHRleHQgcmVzdWx0cyB0byBhIHN0cmVhbS4KKworICAgIFVzZWQgYnkgVGV4dFRlc3RSdW5uZXIuCisgICAgIiIiCisgICAgc2VwYXJhdG9yMSA9ICc9JyAqIDcwCisgICAgc2VwYXJhdG9yMiA9ICctJyAqIDcwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBkZXNjcmlwdGlvbnMsIHZlcmJvc2l0eSk6CisgICAgICAgIHN1cGVyKFRleHRUZXN0UmVzdWx0LCBzZWxmKS5fX2luaXRfXyhzdHJlYW0sIGRlc2NyaXB0aW9ucywgdmVyYm9zaXR5KQorICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQorICAgICAgICBzZWxmLnNob3dBbGwgPSB2ZXJib3NpdHkgPiAxCisgICAgICAgIHNlbGYuZG90cyA9IHZlcmJvc2l0eSA9PSAxCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb25zID0gZGVzY3JpcHRpb25zCisKKyAgICBkZWYgZ2V0RGVzY3JpcHRpb24oc2VsZiwgdGVzdCk6CisgICAgICAgIGRvY19maXJzdF9saW5lID0gdGVzdC5zaG9ydERlc2NyaXB0aW9uKCkKKyAgICAgICAgaWYgc2VsZi5kZXNjcmlwdGlvbnMgYW5kIGRvY19maXJzdF9saW5lOgorICAgICAgICAgICAgcmV0dXJuICdcbicuam9pbigoc3RyKHRlc3QpLCBkb2NfZmlyc3RfbGluZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc3RyKHRlc3QpCisKKyAgICBkZWYgc3RhcnRUZXN0KHNlbGYsIHRlc3QpOgorICAgICAgICBzdXBlcihUZXh0VGVzdFJlc3VsdCwgc2VsZikuc3RhcnRUZXN0KHRlc3QpCisgICAgICAgIGlmIHNlbGYuc2hvd0FsbDoKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKHNlbGYuZ2V0RGVzY3JpcHRpb24odGVzdCkpCisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgiIC4uLiAiKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0uZmx1c2goKQorCisgICAgZGVmIGFkZFN1Y2Nlc3Moc2VsZiwgdGVzdCk6CisgICAgICAgIHN1cGVyKFRleHRUZXN0UmVzdWx0LCBzZWxmKS5hZGRTdWNjZXNzKHRlc3QpCisgICAgICAgIGlmIHNlbGYuc2hvd0FsbDoKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oIm9rIikKKyAgICAgICAgZWxpZiBzZWxmLmRvdHM6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgnLicpCisgICAgICAgICAgICBzZWxmLnN0cmVhbS5mbHVzaCgpCisKKyAgICBkZWYgYWRkRXJyb3Ioc2VsZiwgdGVzdCwgZXJyKToKKyAgICAgICAgc3VwZXIoVGV4dFRlc3RSZXN1bHQsIHNlbGYpLmFkZEVycm9yKHRlc3QsIGVycikKKyAgICAgICAgaWYgc2VsZi5zaG93QWxsOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigiRVJST1IiKQorICAgICAgICBlbGlmIHNlbGYuZG90czoKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKCdFJykKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLmZsdXNoKCkKKworICAgIGRlZiBhZGRGYWlsdXJlKHNlbGYsIHRlc3QsIGVycik6CisgICAgICAgIHN1cGVyKFRleHRUZXN0UmVzdWx0LCBzZWxmKS5hZGRGYWlsdXJlKHRlc3QsIGVycikKKyAgICAgICAgaWYgc2VsZi5zaG93QWxsOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigiRkFJTCIpCisgICAgICAgIGVsaWYgc2VsZi5kb3RzOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoJ0YnKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0uZmx1c2goKQorCisgICAgZGVmIGFkZFNraXAoc2VsZiwgdGVzdCwgcmVhc29uKToKKyAgICAgICAgc3VwZXIoVGV4dFRlc3RSZXN1bHQsIHNlbGYpLmFkZFNraXAodGVzdCwgcmVhc29uKQorICAgICAgICBpZiBzZWxmLnNob3dBbGw6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCJza2lwcGVkIHswIXJ9Ii5mb3JtYXQocmVhc29uKSkKKyAgICAgICAgZWxpZiBzZWxmLmRvdHM6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgicyIpCisgICAgICAgICAgICBzZWxmLnN0cmVhbS5mbHVzaCgpCisKKyAgICBkZWYgYWRkRXhwZWN0ZWRGYWlsdXJlKHNlbGYsIHRlc3QsIGVycik6CisgICAgICAgIHN1cGVyKFRleHRUZXN0UmVzdWx0LCBzZWxmKS5hZGRFeHBlY3RlZEZhaWx1cmUodGVzdCwgZXJyKQorICAgICAgICBpZiBzZWxmLnNob3dBbGw6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCJleHBlY3RlZCBmYWlsdXJlIikKKyAgICAgICAgZWxpZiBzZWxmLmRvdHM6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgieCIpCisgICAgICAgICAgICBzZWxmLnN0cmVhbS5mbHVzaCgpCisKKyAgICBkZWYgYWRkVW5leHBlY3RlZFN1Y2Nlc3Moc2VsZiwgdGVzdCk6CisgICAgICAgIHN1cGVyKFRleHRUZXN0UmVzdWx0LCBzZWxmKS5hZGRVbmV4cGVjdGVkU3VjY2Vzcyh0ZXN0KQorICAgICAgICBpZiBzZWxmLnNob3dBbGw6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCJ1bmV4cGVjdGVkIHN1Y2Nlc3MiKQorICAgICAgICBlbGlmIHNlbGYuZG90czoKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKCJ1IikKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLmZsdXNoKCkKKworICAgIGRlZiBwcmludEVycm9ycyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kb3RzIG9yIHNlbGYuc2hvd0FsbDoKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oKQorICAgICAgICBzZWxmLnByaW50RXJyb3JMaXN0KCdFUlJPUicsIHNlbGYuZXJyb3JzKQorICAgICAgICBzZWxmLnByaW50RXJyb3JMaXN0KCdGQUlMJywgc2VsZi5mYWlsdXJlcykKKworICAgIGRlZiBwcmludEVycm9yTGlzdChzZWxmLCBmbGF2b3VyLCBlcnJvcnMpOgorICAgICAgICBmb3IgdGVzdCwgZXJyIGluIGVycm9yczoKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oc2VsZi5zZXBhcmF0b3IxKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigiJXM6ICVzIiAlIChmbGF2b3VyLHNlbGYuZ2V0RGVzY3JpcHRpb24odGVzdCkpKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbihzZWxmLnNlcGFyYXRvcjIpCisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCIlcyIgJSBlcnIpCisKKworY2xhc3MgVGV4dFRlc3RSdW5uZXIob2JqZWN0KToKKyAgICAiIiJBIHRlc3QgcnVubmVyIGNsYXNzIHRoYXQgZGlzcGxheXMgcmVzdWx0cyBpbiB0ZXh0dWFsIGZvcm0uCisKKyAgICBJdCBwcmludHMgb3V0IHRoZSBuYW1lcyBvZiB0ZXN0cyBhcyB0aGV5IGFyZSBydW4sIGVycm9ycyBhcyB0aGV5CisgICAgb2NjdXIsIGFuZCBhIHN1bW1hcnkgb2YgdGhlIHJlc3VsdHMgYXQgdGhlIGVuZCBvZiB0aGUgdGVzdCBydW4uCisgICAgIiIiCisgICAgcmVzdWx0Y2xhc3MgPSBUZXh0VGVzdFJlc3VsdAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbT1zeXMuc3RkZXJyLCBkZXNjcmlwdGlvbnM9VHJ1ZSwgdmVyYm9zaXR5PTEsCisgICAgICAgICAgICAgICAgIGZhaWxmYXN0PUZhbHNlLCBidWZmZXI9RmFsc2UsIHJlc3VsdGNsYXNzPU5vbmUpOgorICAgICAgICBzZWxmLnN0cmVhbSA9IF9Xcml0ZWxuRGVjb3JhdG9yKHN0cmVhbSkKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbnMgPSBkZXNjcmlwdGlvbnMKKyAgICAgICAgc2VsZi52ZXJib3NpdHkgPSB2ZXJib3NpdHkKKyAgICAgICAgc2VsZi5mYWlsZmFzdCA9IGZhaWxmYXN0CisgICAgICAgIHNlbGYuYnVmZmVyID0gYnVmZmVyCisgICAgICAgIGlmIHJlc3VsdGNsYXNzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5yZXN1bHRjbGFzcyA9IHJlc3VsdGNsYXNzCisKKyAgICBkZWYgX21ha2VSZXN1bHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJlc3VsdGNsYXNzKHNlbGYuc3RyZWFtLCBzZWxmLmRlc2NyaXB0aW9ucywgc2VsZi52ZXJib3NpdHkpCisKKyAgICBkZWYgcnVuKHNlbGYsIHRlc3QpOgorICAgICAgICAiUnVuIHRoZSBnaXZlbiB0ZXN0IGNhc2Ugb3IgdGVzdCBzdWl0ZS4iCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX21ha2VSZXN1bHQoKQorICAgICAgICByZWdpc3RlclJlc3VsdChyZXN1bHQpCisgICAgICAgIHJlc3VsdC5mYWlsZmFzdCA9IHNlbGYuZmFpbGZhc3QKKyAgICAgICAgcmVzdWx0LmJ1ZmZlciA9IHNlbGYuYnVmZmVyCisgICAgICAgIHN0YXJ0VGltZSA9IHRpbWUudGltZSgpCisgICAgICAgIHN0YXJ0VGVzdFJ1biA9IGdldGF0dHIocmVzdWx0LCAnc3RhcnRUZXN0UnVuJywgTm9uZSkKKyAgICAgICAgaWYgc3RhcnRUZXN0UnVuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc3RhcnRUZXN0UnVuKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdChyZXN1bHQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzdG9wVGVzdFJ1biA9IGdldGF0dHIocmVzdWx0LCAnc3RvcFRlc3RSdW4nLCBOb25lKQorICAgICAgICAgICAgaWYgc3RvcFRlc3RSdW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc3RvcFRlc3RSdW4oKQorICAgICAgICBzdG9wVGltZSA9IHRpbWUudGltZSgpCisgICAgICAgIHRpbWVUYWtlbiA9IHN0b3BUaW1lIC0gc3RhcnRUaW1lCisgICAgICAgIHJlc3VsdC5wcmludEVycm9ycygpCisgICAgICAgIGlmIGhhc2F0dHIocmVzdWx0LCAnc2VwYXJhdG9yMicpOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbihyZXN1bHQuc2VwYXJhdG9yMikKKyAgICAgICAgcnVuID0gcmVzdWx0LnRlc3RzUnVuCisgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oIlJhbiAlZCB0ZXN0JXMgaW4gJS4zZnMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocnVuLCBydW4gIT0gMSBhbmQgInMiIG9yICIiLCB0aW1lVGFrZW4pKQorICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCkKKworICAgICAgICBleHBlY3RlZEZhaWxzID0gdW5leHBlY3RlZFN1Y2Nlc3NlcyA9IHNraXBwZWQgPSAwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdHMgPSBtYXAobGVuLCAocmVzdWx0LmV4cGVjdGVkRmFpbHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC51bmV4cGVjdGVkU3VjY2Vzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2tpcHBlZCkpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV4cGVjdGVkRmFpbHMsIHVuZXhwZWN0ZWRTdWNjZXNzZXMsIHNraXBwZWQgPSByZXN1bHRzCisKKyAgICAgICAgaW5mb3MgPSBbXQorICAgICAgICBpZiBub3QgcmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKCJGQUlMRUQiKQorICAgICAgICAgICAgZmFpbGVkLCBlcnJvcmVkID0gbWFwKGxlbiwgKHJlc3VsdC5mYWlsdXJlcywgcmVzdWx0LmVycm9ycykpCisgICAgICAgICAgICBpZiBmYWlsZWQ6CisgICAgICAgICAgICAgICAgaW5mb3MuYXBwZW5kKCJmYWlsdXJlcz0lZCIgJSBmYWlsZWQpCisgICAgICAgICAgICBpZiBlcnJvcmVkOgorICAgICAgICAgICAgICAgIGluZm9zLmFwcGVuZCgiZXJyb3JzPSVkIiAlIGVycm9yZWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgiT0siKQorICAgICAgICBpZiBza2lwcGVkOgorICAgICAgICAgICAgaW5mb3MuYXBwZW5kKCJza2lwcGVkPSVkIiAlIHNraXBwZWQpCisgICAgICAgIGlmIGV4cGVjdGVkRmFpbHM6CisgICAgICAgICAgICBpbmZvcy5hcHBlbmQoImV4cGVjdGVkIGZhaWx1cmVzPSVkIiAlIGV4cGVjdGVkRmFpbHMpCisgICAgICAgIGlmIHVuZXhwZWN0ZWRTdWNjZXNzZXM6CisgICAgICAgICAgICBpbmZvcy5hcHBlbmQoInVuZXhwZWN0ZWQgc3VjY2Vzc2VzPSVkIiAlIHVuZXhwZWN0ZWRTdWNjZXNzZXMpCisgICAgICAgIGlmIGluZm9zOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigiICglcykiICUgKCIsICIuam9pbihpbmZvcyksKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKCJcbiIpCisgICAgICAgIHJldHVybiByZXN1bHQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcnVubmVyLnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcnVubmVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTAyNGQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9ydW5uZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcnVubmVyLnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcnVubmVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTAyNGQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9ydW5uZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc2lnbmFscy5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc2lnbmFscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmE1ZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9zaWduYWxzLnB5CkBAIC0wLDAgKzEsNzEgQEAKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCB3ZWFrcmVmCisKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCB3cmFwcworCitfX3VuaXR0ZXN0ID0gVHJ1ZQorCisKK2NsYXNzIF9JbnRlcnJ1cHRIYW5kbGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlZmF1bHRfaGFuZGxlcik6CisgICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5vcmlnaW5hbF9oYW5kbGVyID0gZGVmYXVsdF9oYW5kbGVyCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZGVmYXVsdF9oYW5kbGVyLCBpbnQpOgorICAgICAgICAgICAgaWYgZGVmYXVsdF9oYW5kbGVyID09IHNpZ25hbC5TSUdfREZMOgorICAgICAgICAgICAgICAgICMgUHJldGVuZCBpdCdzIHNpZ25hbC5kZWZhdWx0X2ludF9oYW5kbGVyIGluc3RlYWQuCisgICAgICAgICAgICAgICAgZGVmYXVsdF9oYW5kbGVyID0gc2lnbmFsLmRlZmF1bHRfaW50X2hhbmRsZXIKKyAgICAgICAgICAgIGVsaWYgZGVmYXVsdF9oYW5kbGVyID09IHNpZ25hbC5TSUdfSUdOOgorICAgICAgICAgICAgICAgICMgTm90IHF1aXRlIHRoZSBzYW1lIHRoaW5nIGFzIFNJR19JR04sIGJ1dCB0aGUgY2xvc2VzdCB3ZQorICAgICAgICAgICAgICAgICMgY2FuIG1ha2UgaXQ6IGRvIG5vdGhpbmcuCisgICAgICAgICAgICAgICAgZGVmIGRlZmF1bHRfaGFuZGxlcih1bnVzZWRfc2lnbnVtLCB1bnVzZWRfZnJhbWUpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZXhwZWN0ZWQgU0lHSU5UIHNpZ25hbCBoYW5kbGVyIHRvIGJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpZ25hbC5TSUdfSUdOLCBzaWduYWwuU0lHX0RGTCwgb3IgYSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsYWJsZSBvYmplY3QiKQorICAgICAgICBzZWxmLmRlZmF1bHRfaGFuZGxlciA9IGRlZmF1bHRfaGFuZGxlcgorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHNpZ251bSwgZnJhbWUpOgorICAgICAgICBpbnN0YWxsZWRfaGFuZGxlciA9IHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCkKKyAgICAgICAgaWYgaW5zdGFsbGVkX2hhbmRsZXIgaXMgbm90IHNlbGY6CisgICAgICAgICAgICAjIGlmIHdlIGFyZW4ndCB0aGUgaW5zdGFsbGVkIGhhbmRsZXIsIHRoZW4gZGVsZWdhdGUgaW1tZWRpYXRlbHkKKyAgICAgICAgICAgICMgdG8gdGhlIGRlZmF1bHQgaGFuZGxlcgorICAgICAgICAgICAgc2VsZi5kZWZhdWx0X2hhbmRsZXIoc2lnbnVtLCBmcmFtZSkKKworICAgICAgICBpZiBzZWxmLmNhbGxlZDoKKyAgICAgICAgICAgIHNlbGYuZGVmYXVsdF9oYW5kbGVyKHNpZ251bSwgZnJhbWUpCisgICAgICAgIHNlbGYuY2FsbGVkID0gVHJ1ZQorICAgICAgICBmb3IgcmVzdWx0IGluIF9yZXN1bHRzLmtleXMoKToKKyAgICAgICAgICAgIHJlc3VsdC5zdG9wKCkKKworX3Jlc3VsdHMgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKK2RlZiByZWdpc3RlclJlc3VsdChyZXN1bHQpOgorICAgIF9yZXN1bHRzW3Jlc3VsdF0gPSAxCisKK2RlZiByZW1vdmVSZXN1bHQocmVzdWx0KToKKyAgICByZXR1cm4gYm9vbChfcmVzdWx0cy5wb3AocmVzdWx0LCBOb25lKSkKKworX2ludGVycnVwdF9oYW5kbGVyID0gTm9uZQorZGVmIGluc3RhbGxIYW5kbGVyKCk6CisgICAgZ2xvYmFsIF9pbnRlcnJ1cHRfaGFuZGxlcgorICAgIGlmIF9pbnRlcnJ1cHRfaGFuZGxlciBpcyBOb25lOgorICAgICAgICBkZWZhdWx0X2hhbmRsZXIgPSBzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpCisgICAgICAgIF9pbnRlcnJ1cHRfaGFuZGxlciA9IF9JbnRlcnJ1cHRIYW5kbGVyKGRlZmF1bHRfaGFuZGxlcikKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBfaW50ZXJydXB0X2hhbmRsZXIpCisKKworZGVmIHJlbW92ZUhhbmRsZXIobWV0aG9kPU5vbmUpOgorICAgIGlmIG1ldGhvZCBpcyBub3QgTm9uZToKKyAgICAgICAgQHdyYXBzKG1ldGhvZCkKKyAgICAgICAgZGVmIGlubmVyKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICBpbml0aWFsID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKQorICAgICAgICAgICAgcmVtb3ZlSGFuZGxlcigpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgaW5pdGlhbCkKKyAgICAgICAgcmV0dXJuIGlubmVyCisKKyAgICBnbG9iYWwgX2ludGVycnVwdF9oYW5kbGVyCisgICAgaWYgX2ludGVycnVwdF9oYW5kbGVyIGlzIG5vdCBOb25lOgorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsIF9pbnRlcnJ1cHRfaGFuZGxlci5vcmlnaW5hbF9oYW5kbGVyKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9zaWduYWxzLnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc2lnbmFscy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE5ZGRmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc2lnbmFscy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9zaWduYWxzLnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc2lnbmFscy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE5ZGRmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc2lnbmFscy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9zdWl0ZS5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzYWY1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc3VpdGUucHkKQEAgLTAsMCArMSwzMDMgQEAKKyIiIlRlc3RTdWl0ZSIiIgorCitpbXBvcnQgc3lzCisKK2Zyb20gLiBpbXBvcnQgY2FzZQorZnJvbSAuIGltcG9ydCB1dGlsCisKK19fdW5pdHRlc3QgPSBUcnVlCisKKworZGVmIF9jYWxsX2lmX2V4aXN0cyhwYXJlbnQsIGF0dHIpOgorICAgIGZ1bmMgPSBnZXRhdHRyKHBhcmVudCwgYXR0ciwgbGFtYmRhOiBOb25lKQorICAgIGZ1bmMoKQorCisKK2NsYXNzIEJhc2VUZXN0U3VpdGUob2JqZWN0KToKKyAgICAiIiJBIHNpbXBsZSB0ZXN0IHN1aXRlIHRoYXQgZG9lc24ndCBwcm92aWRlIGNsYXNzIG9yIG1vZHVsZSBzaGFyZWQgZml4dHVyZXMuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RzPSgpKToKKyAgICAgICAgc2VsZi5fdGVzdHMgPSBbXQorICAgICAgICBzZWxmLmFkZFRlc3RzKHRlc3RzKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIjwlcyB0ZXN0cz0lcz4iICUgKHV0aWwuc3RyY2xhc3Moc2VsZi5fX2NsYXNzX18pLCBsaXN0KHNlbGYpKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZikgPT0gbGlzdChvdGhlcikKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKKworICAgICMgQ2FuJ3QgZ3VhcmFudGVlIGhhc2ggaW52YXJpYW50LCBzbyBmbGFnIGFzIHVuaGFzaGFibGUKKyAgICBfX2hhc2hfXyA9IE5vbmUKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5fdGVzdHMpCisKKyAgICBkZWYgY291bnRUZXN0Q2FzZXMoc2VsZik6CisgICAgICAgIGNhc2VzID0gMAorICAgICAgICBmb3IgdGVzdCBpbiBzZWxmOgorICAgICAgICAgICAgY2FzZXMgKz0gdGVzdC5jb3VudFRlc3RDYXNlcygpCisgICAgICAgIHJldHVybiBjYXNlcworCisgICAgZGVmIGFkZFRlc3Qoc2VsZiwgdGVzdCk6CisgICAgICAgICMgc2FuaXR5IGNoZWNrcworICAgICAgICBpZiBub3QgaGFzYXR0cih0ZXN0LCAnX19jYWxsX18nKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigie30gaXMgbm90IGNhbGxhYmxlIi5mb3JtYXQocmVwcih0ZXN0KSkpCisgICAgICAgIGlmIGlzaW5zdGFuY2UodGVzdCwgdHlwZSkgYW5kIGlzc3ViY2xhc3ModGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FzZS5UZXN0Q2FzZSwgVGVzdFN1aXRlKSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlRlc3RDYXNlcyBhbmQgVGVzdFN1aXRlcyBtdXN0IGJlIGluc3RhbnRpYXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gYWRkVGVzdCgpIikKKyAgICAgICAgc2VsZi5fdGVzdHMuYXBwZW5kKHRlc3QpCisKKyAgICBkZWYgYWRkVGVzdHMoc2VsZiwgdGVzdHMpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHRlc3RzLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidGVzdHMgbXVzdCBiZSBhbiBpdGVyYWJsZSBvZiB0ZXN0cywgbm90IGEgc3RyaW5nIikKKyAgICAgICAgZm9yIHRlc3QgaW4gdGVzdHM6CisgICAgICAgICAgICBzZWxmLmFkZFRlc3QodGVzdCkKKworICAgIGRlZiBydW4oc2VsZiwgcmVzdWx0KToKKyAgICAgICAgZm9yIHRlc3QgaW4gc2VsZjoKKyAgICAgICAgICAgIGlmIHJlc3VsdC5zaG91bGRTdG9wOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0ZXN0KHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICByZXR1cm4gc2VsZi5ydW4oKmFyZ3MsICoqa3dkcykKKworICAgIGRlZiBkZWJ1ZyhzZWxmKToKKyAgICAgICAgIiIiUnVuIHRoZSB0ZXN0cyB3aXRob3V0IGNvbGxlY3RpbmcgZXJyb3JzIGluIGEgVGVzdFJlc3VsdCIiIgorICAgICAgICBmb3IgdGVzdCBpbiBzZWxmOgorICAgICAgICAgICAgdGVzdC5kZWJ1ZygpCisKKworY2xhc3MgVGVzdFN1aXRlKEJhc2VUZXN0U3VpdGUpOgorICAgICIiIkEgdGVzdCBzdWl0ZSBpcyBhIGNvbXBvc2l0ZSB0ZXN0IGNvbnNpc3Rpbmcgb2YgYSBudW1iZXIgb2YgVGVzdENhc2VzLgorCisgICAgRm9yIHVzZSwgY3JlYXRlIGFuIGluc3RhbmNlIG9mIFRlc3RTdWl0ZSwgdGhlbiBhZGQgdGVzdCBjYXNlIGluc3RhbmNlcy4KKyAgICBXaGVuIGFsbCB0ZXN0cyBoYXZlIGJlZW4gYWRkZWQsIHRoZSBzdWl0ZSBjYW4gYmUgcGFzc2VkIHRvIGEgdGVzdAorICAgIHJ1bm5lciwgc3VjaCBhcyBUZXh0VGVzdFJ1bm5lci4gSXQgd2lsbCBydW4gdGhlIGluZGl2aWR1YWwgdGVzdCBjYXNlcworICAgIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgYWRkZWQsIGFnZ3JlZ2F0aW5nIHRoZSByZXN1bHRzLiBXaGVuCisgICAgc3ViY2xhc3NpbmcsIGRvIG5vdCBmb3JnZXQgdG8gY2FsbCB0aGUgYmFzZSBjbGFzcyBjb25zdHJ1Y3Rvci4KKyAgICAiIiIKKworICAgIGRlZiBydW4oc2VsZiwgcmVzdWx0LCBkZWJ1Zz1GYWxzZSk6CisgICAgICAgIHRvcExldmVsID0gRmFsc2UKKyAgICAgICAgaWYgZ2V0YXR0cihyZXN1bHQsICdfdGVzdFJ1bkVudGVyZWQnLCBGYWxzZSkgaXMgRmFsc2U6CisgICAgICAgICAgICByZXN1bHQuX3Rlc3RSdW5FbnRlcmVkID0gdG9wTGV2ZWwgPSBUcnVlCisKKyAgICAgICAgZm9yIHRlc3QgaW4gc2VsZjoKKyAgICAgICAgICAgIGlmIHJlc3VsdC5zaG91bGRTdG9wOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGlmIF9pc25vdHN1aXRlKHRlc3QpOgorICAgICAgICAgICAgICAgIHNlbGYuX3RlYXJEb3duUHJldmlvdXNDbGFzcyh0ZXN0LCByZXN1bHQpCisgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlTW9kdWxlRml4dHVyZSh0ZXN0LCByZXN1bHQpCisgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlQ2xhc3NTZXRVcCh0ZXN0LCByZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0Ll9wcmV2aW91c1Rlc3RDbGFzcyA9IHRlc3QuX19jbGFzc19fCisKKyAgICAgICAgICAgICAgICBpZiAoZ2V0YXR0cih0ZXN0Ll9fY2xhc3NfXywgJ19jbGFzc1NldHVwRmFpbGVkJywgRmFsc2UpIG9yCisgICAgICAgICAgICAgICAgICAgIGdldGF0dHIocmVzdWx0LCAnX21vZHVsZVNldFVwRmFpbGVkJywgRmFsc2UpKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgbm90IGRlYnVnOgorICAgICAgICAgICAgICAgIHRlc3QocmVzdWx0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0ZXN0LmRlYnVnKCkKKworICAgICAgICBpZiB0b3BMZXZlbDoKKyAgICAgICAgICAgIHNlbGYuX3RlYXJEb3duUHJldmlvdXNDbGFzcyhOb25lLCByZXN1bHQpCisgICAgICAgICAgICBzZWxmLl9oYW5kbGVNb2R1bGVUZWFyRG93bihyZXN1bHQpCisgICAgICAgICAgICByZXN1bHQuX3Rlc3RSdW5FbnRlcmVkID0gRmFsc2UKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGRlYnVnKHNlbGYpOgorICAgICAgICAiIiJSdW4gdGhlIHRlc3RzIHdpdGhvdXQgY29sbGVjdGluZyBlcnJvcnMgaW4gYSBUZXN0UmVzdWx0IiIiCisgICAgICAgIGRlYnVnID0gX0RlYnVnUmVzdWx0KCkKKyAgICAgICAgc2VsZi5ydW4oZGVidWcsIFRydWUpCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgZGVmIF9oYW5kbGVDbGFzc1NldFVwKHNlbGYsIHRlc3QsIHJlc3VsdCk6CisgICAgICAgIHByZXZpb3VzQ2xhc3MgPSBnZXRhdHRyKHJlc3VsdCwgJ19wcmV2aW91c1Rlc3RDbGFzcycsIE5vbmUpCisgICAgICAgIGN1cnJlbnRDbGFzcyA9IHRlc3QuX19jbGFzc19fCisgICAgICAgIGlmIGN1cnJlbnRDbGFzcyA9PSBwcmV2aW91c0NsYXNzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHJlc3VsdC5fbW9kdWxlU2V0VXBGYWlsZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgZ2V0YXR0cihjdXJyZW50Q2xhc3MsICJfX3VuaXR0ZXN0X3NraXBfXyIsIEZhbHNlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5fY2xhc3NTZXR1cEZhaWxlZCA9IEZhbHNlCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAjIHRlc3QgbWF5IGFjdHVhbGx5IGJlIGEgZnVuY3Rpb24KKyAgICAgICAgICAgICMgc28gaXRzIGNsYXNzIHdpbGwgYmUgYSBidWlsdGluLXR5cGUKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZXRVcENsYXNzID0gZ2V0YXR0cihjdXJyZW50Q2xhc3MsICdzZXRVcENsYXNzJywgTm9uZSkKKyAgICAgICAgaWYgc2V0VXBDbGFzcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIF9jYWxsX2lmX2V4aXN0cyhyZXN1bHQsICdfc2V0dXBTdGRvdXQnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNldFVwQ2xhc3MoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0LCBfRGVidWdSZXN1bHQpOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGN1cnJlbnRDbGFzcy5fY2xhc3NTZXR1cEZhaWxlZCA9IFRydWUKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB1dGlsLnN0cmNsYXNzKGN1cnJlbnRDbGFzcykKKyAgICAgICAgICAgICAgICBlcnJvck5hbWUgPSAnc2V0VXBDbGFzcyAoJXMpJyAlIGNsYXNzTmFtZQorICAgICAgICAgICAgICAgIHNlbGYuX2FkZENsYXNzT3JNb2R1bGVMZXZlbEV4Y2VwdGlvbihyZXN1bHQsIGUsIGVycm9yTmFtZSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgX2NhbGxfaWZfZXhpc3RzKHJlc3VsdCwgJ19yZXN0b3JlU3Rkb3V0JykKKworICAgIGRlZiBfZ2V0X3ByZXZpb3VzX21vZHVsZShzZWxmLCByZXN1bHQpOgorICAgICAgICBwcmV2aW91c01vZHVsZSA9IE5vbmUKKyAgICAgICAgcHJldmlvdXNDbGFzcyA9IGdldGF0dHIocmVzdWx0LCAnX3ByZXZpb3VzVGVzdENsYXNzJywgTm9uZSkKKyAgICAgICAgaWYgcHJldmlvdXNDbGFzcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByZXZpb3VzTW9kdWxlID0gcHJldmlvdXNDbGFzcy5fX21vZHVsZV9fCisgICAgICAgIHJldHVybiBwcmV2aW91c01vZHVsZQorCisKKyAgICBkZWYgX2hhbmRsZU1vZHVsZUZpeHR1cmUoc2VsZiwgdGVzdCwgcmVzdWx0KToKKyAgICAgICAgcHJldmlvdXNNb2R1bGUgPSBzZWxmLl9nZXRfcHJldmlvdXNfbW9kdWxlKHJlc3VsdCkKKyAgICAgICAgY3VycmVudE1vZHVsZSA9IHRlc3QuX19jbGFzc19fLl9fbW9kdWxlX18KKyAgICAgICAgaWYgY3VycmVudE1vZHVsZSA9PSBwcmV2aW91c01vZHVsZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuX2hhbmRsZU1vZHVsZVRlYXJEb3duKHJlc3VsdCkKKworICAgICAgICByZXN1bHQuX21vZHVsZVNldFVwRmFpbGVkID0gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbY3VycmVudE1vZHVsZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNldFVwTW9kdWxlID0gZ2V0YXR0cihtb2R1bGUsICdzZXRVcE1vZHVsZScsIE5vbmUpCisgICAgICAgIGlmIHNldFVwTW9kdWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgX2NhbGxfaWZfZXhpc3RzKHJlc3VsdCwgJ19zZXR1cFN0ZG91dCcpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2V0VXBNb2R1bGUoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlc3VsdCwgX0RlYnVnUmVzdWx0KToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICByZXN1bHQuX21vZHVsZVNldFVwRmFpbGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVycm9yTmFtZSA9ICdzZXRVcE1vZHVsZSAoJXMpJyAlIGN1cnJlbnRNb2R1bGUKKyAgICAgICAgICAgICAgICBzZWxmLl9hZGRDbGFzc09yTW9kdWxlTGV2ZWxFeGNlcHRpb24ocmVzdWx0LCBlLCBlcnJvck5hbWUpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIF9jYWxsX2lmX2V4aXN0cyhyZXN1bHQsICdfcmVzdG9yZVN0ZG91dCcpCisKKyAgICBkZWYgX2FkZENsYXNzT3JNb2R1bGVMZXZlbEV4Y2VwdGlvbihzZWxmLCByZXN1bHQsIGV4Y2VwdGlvbiwgZXJyb3JOYW1lKToKKyAgICAgICAgZXJyb3IgPSBfRXJyb3JIb2xkZXIoZXJyb3JOYW1lKQorICAgICAgICBhZGRTa2lwID0gZ2V0YXR0cihyZXN1bHQsICdhZGRTa2lwJywgTm9uZSkKKyAgICAgICAgaWYgYWRkU2tpcCBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShleGNlcHRpb24sIGNhc2UuU2tpcFRlc3QpOgorICAgICAgICAgICAgYWRkU2tpcChlcnJvciwgc3RyKGV4Y2VwdGlvbikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXN1bHQuYWRkRXJyb3IoZXJyb3IsIHN5cy5leGNfaW5mbygpKQorCisgICAgZGVmIF9oYW5kbGVNb2R1bGVUZWFyRG93bihzZWxmLCByZXN1bHQpOgorICAgICAgICBwcmV2aW91c01vZHVsZSA9IHNlbGYuX2dldF9wcmV2aW91c19tb2R1bGUocmVzdWx0KQorICAgICAgICBpZiBwcmV2aW91c01vZHVsZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHJlc3VsdC5fbW9kdWxlU2V0VXBGYWlsZWQ6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1twcmV2aW91c01vZHVsZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdGVhckRvd25Nb2R1bGUgPSBnZXRhdHRyKG1vZHVsZSwgJ3RlYXJEb3duTW9kdWxlJywgTm9uZSkKKyAgICAgICAgaWYgdGVhckRvd25Nb2R1bGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfY2FsbF9pZl9leGlzdHMocmVzdWx0LCAnX3NldHVwU3Rkb3V0JykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ZWFyRG93bk1vZHVsZSgpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXN1bHQsIF9EZWJ1Z1Jlc3VsdCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgZXJyb3JOYW1lID0gJ3RlYXJEb3duTW9kdWxlICglcyknICUgcHJldmlvdXNNb2R1bGUKKyAgICAgICAgICAgICAgICBzZWxmLl9hZGRDbGFzc09yTW9kdWxlTGV2ZWxFeGNlcHRpb24ocmVzdWx0LCBlLCBlcnJvck5hbWUpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIF9jYWxsX2lmX2V4aXN0cyhyZXN1bHQsICdfcmVzdG9yZVN0ZG91dCcpCisKKyAgICBkZWYgX3RlYXJEb3duUHJldmlvdXNDbGFzcyhzZWxmLCB0ZXN0LCByZXN1bHQpOgorICAgICAgICBwcmV2aW91c0NsYXNzID0gZ2V0YXR0cihyZXN1bHQsICdfcHJldmlvdXNUZXN0Q2xhc3MnLCBOb25lKQorICAgICAgICBjdXJyZW50Q2xhc3MgPSB0ZXN0Ll9fY2xhc3NfXworICAgICAgICBpZiBjdXJyZW50Q2xhc3MgPT0gcHJldmlvdXNDbGFzczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBnZXRhdHRyKHByZXZpb3VzQ2xhc3MsICdfY2xhc3NTZXR1cEZhaWxlZCcsIEZhbHNlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBnZXRhdHRyKHJlc3VsdCwgJ19tb2R1bGVTZXRVcEZhaWxlZCcsIEZhbHNlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBnZXRhdHRyKHByZXZpb3VzQ2xhc3MsICJfX3VuaXR0ZXN0X3NraXBfXyIsIEZhbHNlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRlYXJEb3duQ2xhc3MgPSBnZXRhdHRyKHByZXZpb3VzQ2xhc3MsICd0ZWFyRG93bkNsYXNzJywgTm9uZSkKKyAgICAgICAgaWYgdGVhckRvd25DbGFzcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIF9jYWxsX2lmX2V4aXN0cyhyZXN1bHQsICdfc2V0dXBTdGRvdXQnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRlYXJEb3duQ2xhc3MoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlc3VsdCwgX0RlYnVnUmVzdWx0KToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSB1dGlsLnN0cmNsYXNzKHByZXZpb3VzQ2xhc3MpCisgICAgICAgICAgICAgICAgZXJyb3JOYW1lID0gJ3RlYXJEb3duQ2xhc3MgKCVzKScgJSBjbGFzc05hbWUKKyAgICAgICAgICAgICAgICBzZWxmLl9hZGRDbGFzc09yTW9kdWxlTGV2ZWxFeGNlcHRpb24ocmVzdWx0LCBlLCBlcnJvck5hbWUpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIF9jYWxsX2lmX2V4aXN0cyhyZXN1bHQsICdfcmVzdG9yZVN0ZG91dCcpCisKKworY2xhc3MgX0Vycm9ySG9sZGVyKG9iamVjdCk6CisgICAgIiIiCisgICAgUGxhY2Vob2xkZXIgZm9yIGEgVGVzdENhc2UgaW5zaWRlIGEgcmVzdWx0LiBBcyBmYXIgYXMgYSBUZXN0UmVzdWx0CisgICAgaXMgY29uY2VybmVkLCB0aGlzIGxvb2tzIGV4YWN0bHkgbGlrZSBhIHVuaXQgdGVzdC4gVXNlZCB0byBpbnNlcnQKKyAgICBhcmJpdHJhcnkgZXJyb3JzIGludG8gYSB0ZXN0IHN1aXRlIHJ1bi4KKyAgICAiIiIKKyAgICAjIEluc3BpcmVkIGJ5IHRoZSBFcnJvckhvbGRlciBmcm9tIFR3aXN0ZWQ6CisgICAgIyBodHRwOi8vdHdpc3RlZG1hdHJpeC5jb20vdHJhYy9icm93c2VyL3RydW5rL3R3aXN0ZWQvdHJpYWwvcnVubmVyLnB5CisKKyAgICAjIGF0dHJpYnV0ZSB1c2VkIGJ5IFRlc3RSZXN1bHQuX2V4Y19pbmZvX3RvX3N0cmluZworICAgIGZhaWx1cmVFeGNlcHRpb24gPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVzY3JpcHRpb24pOgorICAgICAgICBzZWxmLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24KKworICAgIGRlZiBpZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGVzY3JpcHRpb24KKworICAgIGRlZiBzaG9ydERlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIjxFcnJvckhvbGRlciBkZXNjcmlwdGlvbj0lcj4iICUgKHNlbGYuZGVzY3JpcHRpb24sKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmlkKCkKKworICAgIGRlZiBydW4oc2VsZiwgcmVzdWx0KToKKyAgICAgICAgIyBjb3VsZCBjYWxsIHJlc3VsdC5hZGRFcnJvciguLi4pIC0gYnV0IHRoaXMgdGVzdC1saWtlIG9iamVjdAorICAgICAgICAjIHNob3VsZG4ndCBiZSBydW4gYW55d2F5CisgICAgICAgIHBhc3MKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCByZXN1bHQpOgorICAgICAgICByZXR1cm4gc2VsZi5ydW4ocmVzdWx0KQorCisgICAgZGVmIGNvdW50VGVzdENhc2VzKHNlbGYpOgorICAgICAgICByZXR1cm4gMAorCitkZWYgX2lzbm90c3VpdGUodGVzdCk6CisgICAgIkEgY3J1ZGUgd2F5IHRvIHRlbGwgYXBhcnQgdGVzdGNhc2VzIGFuZCBzdWl0ZXMgd2l0aCBkdWNrLXR5cGluZyIKKyAgICB0cnk6CisgICAgICAgIGl0ZXIodGVzdCkKKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCisKK2NsYXNzIF9EZWJ1Z1Jlc3VsdChvYmplY3QpOgorICAgICJVc2VkIGJ5IHRoZSBUZXN0U3VpdGUgdG8gaG9sZCBwcmV2aW91cyBjbGFzcyB3aGVuIHJ1bm5pbmcgaW4gZGVidWcuIgorICAgIF9wcmV2aW91c1Rlc3RDbGFzcyA9IE5vbmUKKyAgICBfbW9kdWxlU2V0VXBGYWlsZWQgPSBGYWxzZQorICAgIHNob3VsZFN0b3AgPSBGYWxzZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9zdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3N1aXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM1NTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9zdWl0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9zdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3N1aXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjM1NTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9zdWl0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjczMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvX19pbml0X18ucHkKQEAgLTAsMCArMSwyMSBAQAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworCitoZXJlID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKQorbG9hZGVyID0gdW5pdHRlc3QuZGVmYXVsdFRlc3RMb2FkZXIKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGZvciBmbiBpbiBvcy5saXN0ZGlyKGhlcmUpOgorICAgICAgICBpZiBmbi5zdGFydHN3aXRoKCJ0ZXN0IikgYW5kIGZuLmVuZHN3aXRoKCIucHkiKToKKyAgICAgICAgICAgIG1vZG5hbWUgPSAidW5pdHRlc3QudGVzdC4iICsgZm5bOi0zXQorICAgICAgICAgICAgX19pbXBvcnRfXyhtb2RuYW1lKQorICAgICAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kbmFtZV0KKyAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUobW9kdWxlKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InN1aXRlIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZGY2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZGY2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9kdW1teS5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9kdW1teS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGYxNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L2R1bW15LnB5CkBAIC0wLDAgKzEgQEAKKyMgRW1wdHkgbW9kdWxlIGZvciB0ZXN0aW5nIHRoZSBsb2FkaW5nIG9mIG1vZHVsZXMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9kdW1teS5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvZHVtbXkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjc3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvZHVtbXkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9kdW1teS5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvZHVtbXkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxYjc3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvZHVtbXkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9zdXBwb3J0LnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3N1cHBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjZjAzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9zdXBwb3J0LnB5CkBAIC0wLDAgKzEsMTE5IEBACitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBUZXN0SGFzaGluZyhvYmplY3QpOgorICAgICIiIlVzZWQgYXMgYSBtaXhpbiBmb3IgVGVzdENhc2UiIiIKKworICAgICMgQ2hlY2sgZm9yIGEgdmFsaWQgX19oYXNoX18gaW1wbGVtZW50YXRpb24KKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYpOgorICAgICAgICBmb3Igb2JqXzEsIG9ial8yIGluIHNlbGYuZXFfcGFpcnM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgbm90IGhhc2gob2JqXzEpID09IGhhc2gob2JqXzIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVyIGFuZCAlciBkbyBub3QgaGFzaCBlcXVhbCIgJSAob2JqXzEsIG9ial8yKSkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlByb2JsZW0gaGFzaGluZyAlciBhbmQgJXI6ICVzIiAlIChvYmpfMSwgb2JqXzIsIGUpKQorCisgICAgICAgIGZvciBvYmpfMSwgb2JqXzIgaW4gc2VsZi5uZV9wYWlyczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBoYXNoKG9ial8xKSA9PSBoYXNoKG9ial8yKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlcyBhbmQgJXMgaGFzaCBlcXVhbCwgYnV0IHNob3VsZG4ndCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9ial8xLCBvYmpfMikpCisgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJQcm9ibGVtIGhhc2hpbmcgJXMgYW5kICVzOiAlcyIgJSAob2JqXzEsIG9ial8yLCBlKSkKKworCitjbGFzcyBUZXN0RXF1YWxpdHkob2JqZWN0KToKKyAgICAiIiJVc2VkIGFzIGEgbWl4aW4gZm9yIFRlc3RDYXNlIiIiCisKKyAgICAjIENoZWNrIGZvciBhIHZhbGlkIF9fZXFfXyBpbXBsZW1lbnRhdGlvbgorICAgIGRlZiB0ZXN0X2VxKHNlbGYpOgorICAgICAgICBmb3Igb2JqXzEsIG9ial8yIGluIHNlbGYuZXFfcGFpcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9ial8xLCBvYmpfMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqXzIsIG9ial8xKQorCisgICAgIyBDaGVjayBmb3IgYSB2YWxpZCBfX25lX18gaW1wbGVtZW50YXRpb24KKyAgICBkZWYgdGVzdF9uZShzZWxmKToKKyAgICAgICAgZm9yIG9ial8xLCBvYmpfMiBpbiBzZWxmLm5lX3BhaXJzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvYmpfMSwgb2JqXzIpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG9ial8yLCBvYmpfMSkKKworCitjbGFzcyBMb2dnaW5nUmVzdWx0KHVuaXR0ZXN0LlRlc3RSZXN1bHQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2cpOgorICAgICAgICBzZWxmLl9ldmVudHMgPSBsb2cKKyAgICAgICAgc3VwZXIoTG9nZ2luZ1Jlc3VsdCwgc2VsZikuX19pbml0X18oKQorCisgICAgZGVmIHN0YXJ0VGVzdChzZWxmLCB0ZXN0KToKKyAgICAgICAgc2VsZi5fZXZlbnRzLmFwcGVuZCgnc3RhcnRUZXN0JykKKyAgICAgICAgc3VwZXIoTG9nZ2luZ1Jlc3VsdCwgc2VsZikuc3RhcnRUZXN0KHRlc3QpCisKKyAgICBkZWYgc3RhcnRUZXN0UnVuKHNlbGYpOgorICAgICAgICBzZWxmLl9ldmVudHMuYXBwZW5kKCdzdGFydFRlc3RSdW4nKQorICAgICAgICBzdXBlcihMb2dnaW5nUmVzdWx0LCBzZWxmKS5zdGFydFRlc3RSdW4oKQorCisgICAgZGVmIHN0b3BUZXN0KHNlbGYsIHRlc3QpOgorICAgICAgICBzZWxmLl9ldmVudHMuYXBwZW5kKCdzdG9wVGVzdCcpCisgICAgICAgIHN1cGVyKExvZ2dpbmdSZXN1bHQsIHNlbGYpLnN0b3BUZXN0KHRlc3QpCisKKyAgICBkZWYgc3RvcFRlc3RSdW4oc2VsZik6CisgICAgICAgIHNlbGYuX2V2ZW50cy5hcHBlbmQoJ3N0b3BUZXN0UnVuJykKKyAgICAgICAgc3VwZXIoTG9nZ2luZ1Jlc3VsdCwgc2VsZikuc3RvcFRlc3RSdW4oKQorCisgICAgZGVmIGFkZEZhaWx1cmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9ldmVudHMuYXBwZW5kKCdhZGRGYWlsdXJlJykKKyAgICAgICAgc3VwZXIoTG9nZ2luZ1Jlc3VsdCwgc2VsZikuYWRkRmFpbHVyZSgqYXJncykKKworICAgIGRlZiBhZGRTdWNjZXNzKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fZXZlbnRzLmFwcGVuZCgnYWRkU3VjY2VzcycpCisgICAgICAgIHN1cGVyKExvZ2dpbmdSZXN1bHQsIHNlbGYpLmFkZFN1Y2Nlc3MoKmFyZ3MpCisKKyAgICBkZWYgYWRkRXJyb3Ioc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9ldmVudHMuYXBwZW5kKCdhZGRFcnJvcicpCisgICAgICAgIHN1cGVyKExvZ2dpbmdSZXN1bHQsIHNlbGYpLmFkZEVycm9yKCphcmdzKQorCisgICAgZGVmIGFkZFNraXAoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9ldmVudHMuYXBwZW5kKCdhZGRTa2lwJykKKyAgICAgICAgc3VwZXIoTG9nZ2luZ1Jlc3VsdCwgc2VsZikuYWRkU2tpcCgqYXJncykKKworICAgIGRlZiBhZGRFeHBlY3RlZEZhaWx1cmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9ldmVudHMuYXBwZW5kKCdhZGRFeHBlY3RlZEZhaWx1cmUnKQorICAgICAgICBzdXBlcihMb2dnaW5nUmVzdWx0LCBzZWxmKS5hZGRFeHBlY3RlZEZhaWx1cmUoKmFyZ3MpCisKKyAgICBkZWYgYWRkVW5leHBlY3RlZFN1Y2Nlc3Moc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9ldmVudHMuYXBwZW5kKCdhZGRVbmV4cGVjdGVkU3VjY2VzcycpCisgICAgICAgIHN1cGVyKExvZ2dpbmdSZXN1bHQsIHNlbGYpLmFkZFVuZXhwZWN0ZWRTdWNjZXNzKCphcmdzKQorCisKK2NsYXNzIFJlc3VsdFdpdGhOb1N0YXJ0VGVzdFJ1blN0b3BUZXN0UnVuKG9iamVjdCk6CisgICAgIiIiQW4gb2JqZWN0IGhvbm91cmluZyBUZXN0UmVzdWx0IGJlZm9yZSBzdGFydFRlc3RSdW4vc3RvcFRlc3RSdW4uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZmFpbHVyZXMgPSBbXQorICAgICAgICBzZWxmLmVycm9ycyA9IFtdCisgICAgICAgIHNlbGYudGVzdHNSdW4gPSAwCisgICAgICAgIHNlbGYuc2tpcHBlZCA9IFtdCisgICAgICAgIHNlbGYuZXhwZWN0ZWRGYWlsdXJlcyA9IFtdCisgICAgICAgIHNlbGYudW5leHBlY3RlZFN1Y2Nlc3NlcyA9IFtdCisgICAgICAgIHNlbGYuc2hvdWxkU3RvcCA9IEZhbHNlCisKKyAgICBkZWYgc3RhcnRUZXN0KHNlbGYsIHRlc3QpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgc3RvcFRlc3Qoc2VsZiwgdGVzdCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBhZGRFcnJvcihzZWxmLCB0ZXN0KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGFkZEZhaWx1cmUoc2VsZiwgdGVzdCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBhZGRTdWNjZXNzKHNlbGYsIHRlc3QpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd2FzU3VjY2Vzc2Z1bChzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9zdXBwb3J0LnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9zdXBwb3J0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmU1NTViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3N1cHBvcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9zdXBwb3J0LnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9zdXBwb3J0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmU1NTViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3N1cHBvcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Fzc2VydGlvbnMucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9hc3NlcnRpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYmE2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9hc3NlcnRpb25zLnB5CkBAIC0wLDAgKzEsMjg2IEBACitpbXBvcnQgZGF0ZXRpbWUKKworaW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdF9Bc3NlcnRpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9BbG1vc3RFcXVhbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgxLjAwMDAwMDAxLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90QWxtb3N0RXF1YWwoMS4wMDAwMDAxLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCwgMS4wMDAwMDAxLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RBbG1vc3RFcXVhbCwgMS4wMDAwMDAwMSwgMS4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoMS4xLCAxLjAsIHBsYWNlcz0wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwsIDEuMSwgMS4wLCBwbGFjZXM9MSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDAsIC4xKy4xaiwgcGxhY2VzPTApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90QWxtb3N0RXF1YWwoMCwgLjErLjFqLCBwbGFjZXM9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsLCAwLCAuMSsuMWosIHBsYWNlcz0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90QWxtb3N0RXF1YWwsIDAsIC4xKy4xaiwgcGxhY2VzPTApCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdCgnaW5mJyksIGZsb2F0KCdpbmYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydE5vdEFsbW9zdEVxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCgnaW5mJyksIGZsb2F0KCdpbmYnKSkKKworICAgIGRlZiB0ZXN0X0Ftb3N0RXF1YWxXaXRoRGVsdGEoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoMS4xLCAxLjAsIGRlbHRhPTAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgxLjAsIDEuMSwgZGVsdGE9MC41KQorICAgICAgICBzZWxmLmFzc2VydE5vdEFsbW9zdEVxdWFsKDEuMSwgMS4wLCBkZWx0YT0wLjA1KQorICAgICAgICBzZWxmLmFzc2VydE5vdEFsbW9zdEVxdWFsKDEuMCwgMS4xLCBkZWx0YT0wLjA1KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xLCAxLjAsIGRlbHRhPTAuMDUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnROb3RBbG1vc3RFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xLCAxLjAsIGRlbHRhPTAuNSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMSwgMS4wLCBwbGFjZXM9MiwgZGVsdGE9MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmFzc2VydE5vdEFsbW9zdEVxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEsIDEuMCwgcGxhY2VzPTIsIGRlbHRhPTIpCisKKyAgICAgICAgZmlyc3QgPSBkYXRldGltZS5kYXRldGltZS5ub3coKQorICAgICAgICBzZWNvbmQgPSBmaXJzdCArIGRhdGV0aW1lLnRpbWVkZWx0YShzZWNvbmRzPTEwKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZpcnN0LCBzZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGE9ZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9MjApKQorICAgICAgICBzZWxmLmFzc2VydE5vdEFsbW9zdEVxdWFsKGZpcnN0LCBzZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGE9ZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9NSkpCisKKyAgICBkZWYgdGVzdF9hc3NlcnRSYWlzZXMoc2VsZik6CisgICAgICAgIGRlZiBfcmFpc2UoZSk6CisgICAgICAgICAgICByYWlzZSBlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBfcmFpc2UsIEtleUVycm9yKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgX3JhaXNlLCBLZXlFcnJvcigia2V5IikpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IE5vbmUpCisgICAgICAgIGV4Y2VwdCBzZWxmLmZhaWx1cmVFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIktleUVycm9yIG5vdCByYWlzZWQiLCBlLmFyZ3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImFzc2VydFJhaXNlcygpIGRpZG4ndCBmYWlsIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIF9yYWlzZSwgVmFsdWVFcnJvcikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImFzc2VydFJhaXNlcygpIGRpZG4ndCBsZXQgZXhjZXB0aW9uIHBhc3MgdGhyb3VnaCIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoY20uZXhjZXB0aW9uLCBlKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoImtleSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigiS2V5RXJyb3Igbm90IHJhaXNlZCIsIGUuYXJncykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiYXNzZXJ0UmFpc2VzKCkgZGlkbid0IGZhaWwiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJhc3NlcnRSYWlzZXMoKSBkaWRuJ3QgbGV0IGV4Y2VwdGlvbiBwYXNzIHRocm91Z2giKQorCisgICAgZGVmIHRlc3RBc3NlcnROb3RSZWdleHBNYXRjaGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE5vdFJlZ2V4cE1hdGNoZXMoJ0FsYSBtYSBrb3RhJywgcidyKycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90UmVnZXhwTWF0Y2hlcygnQWxhIG1hIGtvdGEnLCByJ2sudCcsICdNZXNzYWdlJykKKyAgICAgICAgZXhjZXB0IHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIidrb3QnIiwgZS5hcmdzWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignTWVzc2FnZScsIGUuYXJnc1swXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnYXNzZXJ0Tm90UmVnZXhwTWF0Y2hlcyBzaG91bGQgaGF2ZSBmYWlsZWQuJykKKworCitjbGFzcyBUZXN0TG9uZ01lc3NhZ2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCB0aGUgaW5kaXZpZHVhbCBhc3NlcnRzIGhvbm91ciBsb25nTWVzc2FnZS4KKyAgICBUaGlzIGFjdHVhbGx5IHRlc3RzIGFsbCB0aGUgbWVzc2FnZSBiZWhhdmlvdXIgZm9yCisgICAgYXNzZXJ0cyB0aGF0IHVzZSBsb25nTWVzc2FnZS4iIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdGFibGVUZXN0RmFsc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgbG9uZ01lc3NhZ2UgPSBGYWxzZQorICAgICAgICAgICAgZmFpbHVyZUV4Y2VwdGlvbiA9IHNlbGYuZmFpbHVyZUV4Y2VwdGlvbgorCisgICAgICAgICAgICBkZWYgdGVzdFRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIFRlc3RhYmxlVGVzdFRydWUodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgbG9uZ01lc3NhZ2UgPSBUcnVlCisgICAgICAgICAgICBmYWlsdXJlRXhjZXB0aW9uID0gc2VsZi5mYWlsdXJlRXhjZXB0aW9uCisKKyAgICAgICAgICAgIGRlZiB0ZXN0VGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi50ZXN0YWJsZVRydWUgPSBUZXN0YWJsZVRlc3RUcnVlKCd0ZXN0VGVzdCcpCisgICAgICAgIHNlbGYudGVzdGFibGVGYWxzZSA9IFRlc3RhYmxlVGVzdEZhbHNlKCd0ZXN0VGVzdCcpCisKKyAgICBkZWYgdGVzdERlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodW5pdHRlc3QuVGVzdENhc2UubG9uZ01lc3NhZ2UpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRNc2coc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ZXN0YWJsZUZhbHNlLl9mb3JtYXRNZXNzYWdlKE5vbmUsICJmb28iKSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ZXN0YWJsZUZhbHNlLl9mb3JtYXRNZXNzYWdlKCJmb28iLCAiYmFyIiksICJmb28iKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ZXN0YWJsZVRydWUuX2Zvcm1hdE1lc3NhZ2UoTm9uZSwgImZvbyIpLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRlc3RhYmxlVHJ1ZS5fZm9ybWF0TWVzc2FnZSgiZm9vIiwgImJhciIpLCAiYmFyIDogZm9vIikKKworICAgICAgICAjIFRoaXMgYmxvd3MgdXAgaWYgX2Zvcm1hdE1lc3NhZ2UgdXNlcyBzdHJpbmcgY29uY2F0ZW5hdGlvbgorICAgICAgICBzZWxmLnRlc3RhYmxlVHJ1ZS5fZm9ybWF0TWVzc2FnZShvYmplY3QoKSwgJ2ZvbycpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRNZXNzYWdlX3VuaWNvZGVfZXJyb3Ioc2VsZik6CisgICAgICAgIG9uZSA9ICcnLmpvaW4oY2hyKGkpIGZvciBpIGluIHJhbmdlKDI1NSkpCisgICAgICAgICMgdGhpcyB1c2VkIHRvIGNhdXNlIGEgVW5pY29kZURlY29kZUVycm9yIGNvbnN0cnVjdGluZyBtc2cKKyAgICAgICAgc2VsZi50ZXN0YWJsZVRydWUuX2Zvcm1hdE1lc3NhZ2Uob25lLCB1J1x1RkZGRCcpCisKKyAgICBkZWYgYXNzZXJ0TWVzc2FnZXMoc2VsZiwgbWV0aG9kTmFtZSwgYXJncywgZXJyb3JzKToKKyAgICAgICAgZGVmIGdldE1ldGhvZChpKToKKyAgICAgICAgICAgIHVzZVRlc3RhYmxlRmFsc2UgID0gaSA8IDIKKyAgICAgICAgICAgIGlmIHVzZVRlc3RhYmxlRmFsc2U6CisgICAgICAgICAgICAgICAgdGVzdCA9IHNlbGYudGVzdGFibGVGYWxzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0ZXN0ID0gc2VsZi50ZXN0YWJsZVRydWUKKyAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHRlc3QsIG1ldGhvZE5hbWUpCisKKyAgICAgICAgZm9yIGksIGV4cGVjdGVkX3JlZ2V4cCBpbiBlbnVtZXJhdGUoZXJyb3JzKToKKyAgICAgICAgICAgIHRlc3RNZXRob2QgPSBnZXRNZXRob2QoaSkKKyAgICAgICAgICAgIGt3YXJncyA9IHt9CisgICAgICAgICAgICB3aXRoTXNnID0gaSAlIDIKKyAgICAgICAgICAgIGlmIHdpdGhNc2c6CisgICAgICAgICAgICAgICAga3dhcmdzID0geyJtc2ciOiAib29wcyJ9CisKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9yZWdleHA9ZXhwZWN0ZWRfcmVnZXhwKToKKyAgICAgICAgICAgICAgICB0ZXN0TWV0aG9kKCphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0QXNzZXJ0VHJ1ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0VHJ1ZScsIChGYWxzZSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiXkZhbHNlIGlzIG5vdCB0cnVlJCIsICJeb29wcyQiLCAiXkZhbHNlIGlzIG5vdCB0cnVlJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJeRmFsc2UgaXMgbm90IHRydWUgOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3RBc3NlcnRGYWxzZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0RmFsc2UnLCAoVHJ1ZSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiXlRydWUgaXMgbm90IGZhbHNlJCIsICJeb29wcyQiLCAiXlRydWUgaXMgbm90IGZhbHNlJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJeVHJ1ZSBpcyBub3QgZmFsc2UgOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3ROb3RFcXVhbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0Tm90RXF1YWwnLCAoMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJeMSA9PSAxJCIsICJeb29wcyQiLCAiXjEgPT0gMSQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXjEgPT0gMSA6IG9vcHMkIl0pCisKKyAgICBkZWYgdGVzdEFsbW9zdEVxdWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnRBbG1vc3RFcXVhbCcsICgxLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl4xICE9IDIgd2l0aGluIDcgcGxhY2VzJCIsICJeb29wcyQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXjEgIT0gMiB3aXRoaW4gNyBwbGFjZXMkIiwgIl4xICE9IDIgd2l0aGluIDcgcGxhY2VzIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0Tm90QWxtb3N0RXF1YWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydE5vdEFsbW9zdEVxdWFsJywgKDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiXjEgPT0gMSB3aXRoaW4gNyBwbGFjZXMkIiwgIl5vb3BzJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJeMSA9PSAxIHdpdGhpbiA3IHBsYWNlcyQiLCAiXjEgPT0gMSB3aXRoaW4gNyBwbGFjZXMgOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3RfYmFzZUFzc2VydEVxdWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdfYmFzZUFzc2VydEVxdWFsJywgKDEsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiXjEgIT0gMiQiLCAiXm9vcHMkIiwgIl4xICE9IDIkIiwgIl4xICE9IDIgOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3RBc3NlcnRTZXF1ZW5jZUVxdWFsKHNlbGYpOgorICAgICAgICAjIEVycm9yIG1lc3NhZ2VzIGFyZSBtdWx0aWxpbmUgc28gbm90IHRlc3Rpbmcgb24gZnVsbCBtZXNzYWdlCisgICAgICAgICMgYXNzZXJ0VHVwbGVFcXVhbCBhbmQgYXNzZXJ0TGlzdEVxdWFsIGRlbGVnYXRlIHRvIHRoaXMgbWV0aG9kCisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydFNlcXVlbmNlRXF1YWwnLCAoW10sIFtOb25lXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJcKyBcW05vbmVcXSQiLCAiXm9vcHMkIiwgciJcKyBcW05vbmVcXSQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIlwrIFxbTm9uZVxdIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0U2V0RXF1YWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydFNldEVxdWFsJywgKHNldCgpLCBzZXQoW05vbmVdKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJOb25lJCIsICJeb29wcyQiLCAiTm9uZSQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uZSA6IG9vcHMkIl0pCisKKyAgICBkZWYgdGVzdEFzc2VydEluKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnRJbicsIChOb25lLCBbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydeTm9uZSBub3QgZm91bmQgaW4gXFtcXSQnLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ15Ob25lIG5vdCBmb3VuZCBpbiBcW1xdJCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdeTm9uZSBub3QgZm91bmQgaW4gXFtcXSA6IG9vcHMkJ10pCisKKyAgICBkZWYgdGVzdEFzc2VydE5vdEluKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnROb3RJbicsIChOb25lLCBbTm9uZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnXk5vbmUgdW5leHBlY3RlZGx5IGZvdW5kIGluIFxbTm9uZVxdJCcsICJeb29wcyQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXk5vbmUgdW5leHBlY3RlZGx5IGZvdW5kIGluIFxbTm9uZVxdJCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdeTm9uZSB1bmV4cGVjdGVkbHkgZm91bmQgaW4gXFtOb25lXF0gOiBvb3BzJCddKQorCisgICAgZGVmIHRlc3RBc3NlcnREaWN0RXF1YWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydERpY3RFcXVhbCcsICh7fSwgeydrZXknOiAndmFsdWUnfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3IiXCsgXHsna2V5JzogJ3ZhbHVlJ1x9JCIsICJeb29wcyQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCsgXHsna2V5JzogJ3ZhbHVlJ1x9JCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcKyBceydrZXknOiAndmFsdWUnXH0gOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3RBc3NlcnREaWN0Q29udGFpbnNTdWJzZXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydERpY3RDb250YWluc1N1YnNldCcsICh7J2tleSc6ICd2YWx1ZSd9LCB7fSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJeTWlzc2luZzogJ2tleSckIiwgIl5vb3BzJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJeTWlzc2luZzogJ2tleSckIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl5NaXNzaW5nOiAna2V5JyA6IG9vcHMkIl0pCisKKyAgICBkZWYgdGVzdEFzc2VydE11bHRpTGluZUVxdWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnRNdWx0aUxpbmVFcXVhbCcsICgiIiwgImZvbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyIlwrIGZvbyQiLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJcKyBmb28kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJcKyBmb28gOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3RBc3NlcnRMZXNzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnRMZXNzJywgKDIsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiXjIgbm90IGxlc3MgdGhhbiAxJCIsICJeb29wcyQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXjIgbm90IGxlc3MgdGhhbiAxJCIsICJeMiBub3QgbGVzcyB0aGFuIDEgOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3RBc3NlcnRMZXNzRXF1YWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydExlc3NFcXVhbCcsICgyLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl4yIG5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMSQiLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl4yIG5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMSQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXjIgbm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byAxIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0R3JlYXRlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0R3JlYXRlcicsICgxLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl4xIG5vdCBncmVhdGVyIHRoYW4gMiQiLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl4xIG5vdCBncmVhdGVyIHRoYW4gMiQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXjEgbm90IGdyZWF0ZXIgdGhhbiAyIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0R3JlYXRlckVxdWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnRHcmVhdGVyRXF1YWwnLCAoMSwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJeMSBub3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDIkIiwgIl5vb3BzJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJeMSBub3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDIkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl4xIG5vdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMiA6IG9vcHMkIl0pCisKKyAgICBkZWYgdGVzdEFzc2VydElzTm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0SXNOb25lJywgKCdub3QgTm9uZScsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl4nbm90IE5vbmUnIGlzIG5vdCBOb25lJCIsICJeb29wcyQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXidub3QgTm9uZScgaXMgbm90IE5vbmUkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl4nbm90IE5vbmUnIGlzIG5vdCBOb25lIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0SXNOb3ROb25lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnRJc05vdE5vbmUnLCAoTm9uZSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiXnVuZXhwZWN0ZWRseSBOb25lJCIsICJeb29wcyQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXnVuZXhwZWN0ZWRseSBOb25lJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJedW5leHBlY3RlZGx5IE5vbmUgOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3RBc3NlcnRJcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0SXMnLCAoTm9uZSwgJ2ZvbycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiXk5vbmUgaXMgbm90ICdmb28nJCIsICJeb29wcyQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXk5vbmUgaXMgbm90ICdmb28nJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJeTm9uZSBpcyBub3QgJ2ZvbycgOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3RBc3NlcnRJc05vdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0SXNOb3QnLCAoTm9uZSwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJedW5leHBlY3RlZGx5IGlkZW50aWNhbDogTm9uZSQiLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl51bmV4cGVjdGVkbHkgaWRlbnRpY2FsOiBOb25lJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJedW5leHBlY3RlZGx5IGlkZW50aWNhbDogTm9uZSA6IG9vcHMkIl0pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Fzc2VydGlvbnMucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfYXNzZXJ0aW9ucy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyOTc3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Fzc2VydGlvbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Fzc2VydGlvbnMucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfYXNzZXJ0aW9ucy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGMyOTc3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Fzc2VydGlvbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2JyZWFrLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfYnJlYWsucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiOTFjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2JyZWFrLnB5CkBAIC0wLDAgKzEsMjg0IEBACitpbXBvcnQgZ2MKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHdlYWtyZWYKKworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKKworaW1wb3J0IHVuaXR0ZXN0CisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2tpbGwnKSwgIlRlc3QgcmVxdWlyZXMgb3Mua2lsbCIpCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSJ3aW4zMiIsICJUZXN0IGNhbm5vdCBydW4gb24gV2luZG93cyIpCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAnZnJlZWJzZDYnLCAiVGVzdCBraWxscyByZWdydGVzdCBvbiBmcmVlYnNkNiAiCisgICAgImlmIHRocmVhZHMgaGF2ZSBiZWVuIHVzZWQiKQorY2xhc3MgVGVzdEJyZWFrKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBpbnRfaGFuZGxlciA9IE5vbmUKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fZGVmYXVsdF9oYW5kbGVyID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKQorICAgICAgICBpZiBzZWxmLmludF9oYW5kbGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBzZWxmLmludF9oYW5kbGVyKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsIHNlbGYuX2RlZmF1bHRfaGFuZGxlcikKKyAgICAgICAgdW5pdHRlc3Quc2lnbmFscy5fcmVzdWx0cyA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoKQorICAgICAgICB1bml0dGVzdC5zaWduYWxzLl9pbnRlcnJ1cHRfaGFuZGxlciA9IE5vbmUKKworCisgICAgZGVmIHRlc3RJbnN0YWxsSGFuZGxlcihzZWxmKToKKyAgICAgICAgZGVmYXVsdF9oYW5kbGVyID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKQorICAgICAgICB1bml0dGVzdC5pbnN0YWxsSGFuZGxlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKSwgZGVmYXVsdF9oYW5kbGVyKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCisgICAgICAgICAgICBvcy5raWxsKHBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJLZXlib2FyZEludGVycnVwdCBub3QgaGFuZGxlZCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVuaXR0ZXN0LnNpZ25hbHMuX2ludGVycnVwdF9oYW5kbGVyLmNhbGxlZCkKKworICAgIGRlZiB0ZXN0UmVnaXN0ZXJSZXN1bHQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICB1bml0dGVzdC5yZWdpc3RlclJlc3VsdChyZXN1bHQpCisKKyAgICAgICAgZm9yIHJlZiBpbiB1bml0dGVzdC5zaWduYWxzLl9yZXN1bHRzOgorICAgICAgICAgICAgaWYgcmVmIGlzIHJlc3VsdDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiByZWYgaXMgbm90IHJlc3VsdDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm9kZCBvYmplY3QgaW4gcmVzdWx0IHNldCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJlc3VsdCBub3QgZm91bmQiKQorCisKKyAgICBkZWYgdGVzdEludGVycnVwdENhdWdodChzZWxmKToKKyAgICAgICAgZGVmYXVsdF9oYW5kbGVyID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKQorCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICB1bml0dGVzdC5pbnN0YWxsSGFuZGxlcigpCisgICAgICAgIHVuaXR0ZXN0LnJlZ2lzdGVyUmVzdWx0KHJlc3VsdCkKKworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCksIGRlZmF1bHRfaGFuZGxlcikKKworICAgICAgICBkZWYgdGVzdChyZXN1bHQpOgorICAgICAgICAgICAgcGlkID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgICAgIG9zLmtpbGwocGlkLCBzaWduYWwuU0lHSU5UKQorICAgICAgICAgICAgcmVzdWx0LmJyZWFrQ2F1Z2h0ID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC5zaG91bGRTdG9wKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3QocmVzdWx0KQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIktleWJvYXJkSW50ZXJydXB0IG5vdCBoYW5kbGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC5icmVha0NhdWdodCkKKworCisgICAgZGVmIHRlc3RTZWNvbmRJbnRlcnJ1cHQoc2VsZik6CisgICAgICAgICMgQ2FuJ3QgdXNlIHNraXBJZiBkZWNvcmF0b3IgYmVjYXVzZSB0aGUgc2lnbmFsIGhhbmRsZXIgbWF5IGhhdmUKKyAgICAgICAgIyBiZWVuIGNoYW5nZWQgYWZ0ZXIgZGVmaW5pbmcgdGhpcyBtZXRob2QuCisgICAgICAgIGlmIHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCkgPT0gc2lnbmFsLlNJR19JR046CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJ0ZXN0IHJlcXVpcmVzIFNJR0lOVCB0byBub3QgYmUgaWdub3JlZCIpCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICB1bml0dGVzdC5pbnN0YWxsSGFuZGxlcigpCisgICAgICAgIHVuaXR0ZXN0LnJlZ2lzdGVyUmVzdWx0KHJlc3VsdCkKKworICAgICAgICBkZWYgdGVzdChyZXN1bHQpOgorICAgICAgICAgICAgcGlkID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgICAgIG9zLmtpbGwocGlkLCBzaWduYWwuU0lHSU5UKQorICAgICAgICAgICAgcmVzdWx0LmJyZWFrQ2F1Z2h0ID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC5zaG91bGRTdG9wKQorICAgICAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdJTlQpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNlY29uZCBLZXlib2FyZEludGVycnVwdCBub3QgcmFpc2VkIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0KHJlc3VsdCkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTZWNvbmQgS2V5Ym9hcmRJbnRlcnJ1cHQgbm90IHJhaXNlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuYnJlYWtDYXVnaHQpCisKKworICAgIGRlZiB0ZXN0VHdvUmVzdWx0cyhzZWxmKToKKyAgICAgICAgdW5pdHRlc3QuaW5zdGFsbEhhbmRsZXIoKQorCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICB1bml0dGVzdC5yZWdpc3RlclJlc3VsdChyZXN1bHQpCisgICAgICAgIG5ld19oYW5kbGVyID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKQorCisgICAgICAgIHJlc3VsdDIgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgdW5pdHRlc3QucmVnaXN0ZXJSZXN1bHQocmVzdWx0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpLCBuZXdfaGFuZGxlcikKKworICAgICAgICByZXN1bHQzID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisKKyAgICAgICAgZGVmIHRlc3QocmVzdWx0KToKKyAgICAgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCisgICAgICAgICAgICBvcy5raWxsKHBpZCwgc2lnbmFsLlNJR0lOVCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0KHJlc3VsdCkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJLZXlib2FyZEludGVycnVwdCBub3QgaGFuZGxlZCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC5zaG91bGRTdG9wKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0Mi5zaG91bGRTdG9wKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3VsdDMuc2hvdWxkU3RvcCkKKworCisgICAgZGVmIHRlc3RIYW5kbGVyUmVwbGFjZWRCdXRDYWxsZWQoc2VsZik6CisgICAgICAgICMgQ2FuJ3QgdXNlIHNraXBJZiBkZWNvcmF0b3IgYmVjYXVzZSB0aGUgc2lnbmFsIGhhbmRsZXIgbWF5IGhhdmUKKyAgICAgICAgIyBiZWVuIGNoYW5nZWQgYWZ0ZXIgZGVmaW5pbmcgdGhpcyBtZXRob2QuCisgICAgICAgIGlmIHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCkgPT0gc2lnbmFsLlNJR19JR046CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJ0ZXN0IHJlcXVpcmVzIFNJR0lOVCB0byBub3QgYmUgaWdub3JlZCIpCisgICAgICAgICMgSWYgb3VyIGhhbmRsZXIgaGFzIGJlZW4gcmVwbGFjZWQgKGlzIG5vIGxvbmdlciBpbnN0YWxsZWQpIGJ1dCBpcworICAgICAgICAjIGNhbGxlZCBieSB0aGUgKm5ldyogaGFuZGxlciwgdGhlbiBpdCBpc24ndCBzYWZlIHRvIGRlbGF5IHRoZQorICAgICAgICAjIFNJR0lOVCBhbmQgd2Ugc2hvdWxkIGltbWVkaWF0ZWx5IGRlbGVnYXRlIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIKKyAgICAgICAgdW5pdHRlc3QuaW5zdGFsbEhhbmRsZXIoKQorCisgICAgICAgIGhhbmRsZXIgPSBzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpCisgICAgICAgIGRlZiBuZXdfaGFuZGxlcihmcmFtZSwgc2lnbnVtKToKKyAgICAgICAgICAgIGhhbmRsZXIoZnJhbWUsIHNpZ251bSkKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBuZXdfaGFuZGxlcikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQorICAgICAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdJTlQpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmVwbGFjZWQgYnV0IGRlbGVnYXRlZCBoYW5kbGVyIGRvZXNuJ3QgcmFpc2UgaW50ZXJydXB0IikKKworICAgIGRlZiB0ZXN0UnVubmVyKHNlbGYpOgorICAgICAgICAjIENyZWF0aW5nIGEgVGV4dFRlc3RSdW5uZXIgd2l0aCB0aGUgYXBwcm9wcmlhdGUgYXJndW1lbnQgc2hvdWxkCisgICAgICAgICMgcmVnaXN0ZXIgdGhlIFRleHRUZXN0UmVzdWx0IGl0IGNyZWF0ZXMKKyAgICAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoc3RyZWFtPVN0cmluZ0lPKCkpCisKKyAgICAgICAgcmVzdWx0ID0gcnVubmVyLnJ1bih1bml0dGVzdC5UZXN0U3VpdGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihyZXN1bHQsIHVuaXR0ZXN0LnNpZ25hbHMuX3Jlc3VsdHMpCisKKyAgICBkZWYgdGVzdFdlYWtSZWZlcmVuY2VzKHNlbGYpOgorICAgICAgICAjIENhbGxpbmcgcmVnaXN0ZXJSZXN1bHQgb24gYSByZXN1bHQgc2hvdWxkIG5vdCBrZWVwIGl0IGFsaXZlCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICB1bml0dGVzdC5yZWdpc3RlclJlc3VsdChyZXN1bHQpCisKKyAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYocmVzdWx0KQorICAgICAgICBkZWwgcmVzdWx0CisKKyAgICAgICAgIyBGb3Igbm9uLXJlZmVyZW5jZSBjb3VudGluZyBpbXBsZW1lbnRhdGlvbnMKKyAgICAgICAgZ2MuY29sbGVjdCgpO2djLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZWYoKSkKKworCisgICAgZGVmIHRlc3RSZW1vdmVSZXN1bHQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICB1bml0dGVzdC5yZWdpc3RlclJlc3VsdChyZXN1bHQpCisKKyAgICAgICAgdW5pdHRlc3QuaW5zdGFsbEhhbmRsZXIoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pdHRlc3QucmVtb3ZlUmVzdWx0KHJlc3VsdCkpCisKKyAgICAgICAgIyBTaG91bGQgdGhpcyByYWlzZSBhbiBlcnJvciBpbnN0ZWFkPworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHVuaXR0ZXN0LnJlbW92ZVJlc3VsdCh1bml0dGVzdC5UZXN0UmVzdWx0KCkpKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCisgICAgICAgICAgICBvcy5raWxsKHBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0LnNob3VsZFN0b3ApCisKKyAgICBkZWYgdGVzdE1haW5JbnN0YWxsc0hhbmRsZXIoc2VsZik6CisgICAgICAgIGZhaWxmYXN0ID0gb2JqZWN0KCkKKyAgICAgICAgdGVzdCA9IG9iamVjdCgpCisgICAgICAgIHZlcmJvc2l0eSA9IG9iamVjdCgpCisgICAgICAgIHJlc3VsdCA9IG9iamVjdCgpCisgICAgICAgIGRlZmF1bHRfaGFuZGxlciA9IHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCkKKworICAgICAgICBjbGFzcyBGYWtlUnVubmVyKG9iamVjdCk6CisgICAgICAgICAgICBpbml0QXJncyA9IFtdCisgICAgICAgICAgICBydW5BcmdzID0gW10KKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuaW5pdEFyZ3MuYXBwZW5kKChhcmdzLCBrd2FyZ3MpKQorICAgICAgICAgICAgZGVmIHJ1bihzZWxmLCB0ZXN0KToKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bkFyZ3MuYXBwZW5kKHRlc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgICAgIGNsYXNzIFByb2dyYW0odW5pdHRlc3QuVGVzdFByb2dyYW0pOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhdGNoYnJlYWspOgorICAgICAgICAgICAgICAgIHNlbGYuZXhpdCA9IEZhbHNlCisgICAgICAgICAgICAgICAgc2VsZi52ZXJib3NpdHkgPSB2ZXJib3NpdHkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxmYXN0ID0gZmFpbGZhc3QKKyAgICAgICAgICAgICAgICBzZWxmLmNhdGNoYnJlYWsgPSBjYXRjaGJyZWFrCisgICAgICAgICAgICAgICAgc2VsZi50ZXN0UnVubmVyID0gRmFrZVJ1bm5lcgorICAgICAgICAgICAgICAgIHNlbGYudGVzdCA9IHRlc3QKKyAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IE5vbmUKKworICAgICAgICBwID0gUHJvZ3JhbShGYWxzZSkKKyAgICAgICAgcC5ydW5UZXN0cygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWtlUnVubmVyLmluaXRBcmdzLCBbKCgpLCB7J2J1ZmZlcic6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJib3NpdHknOiB2ZXJib3NpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWlsZmFzdCc6IGZhaWxmYXN0fSldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZha2VSdW5uZXIucnVuQXJncywgW3Rlc3RdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucmVzdWx0LCByZXN1bHQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpLCBkZWZhdWx0X2hhbmRsZXIpCisKKyAgICAgICAgRmFrZVJ1bm5lci5pbml0QXJncyA9IFtdCisgICAgICAgIEZha2VSdW5uZXIucnVuQXJncyA9IFtdCisgICAgICAgIHAgPSBQcm9ncmFtKFRydWUpCisgICAgICAgIHAucnVuVGVzdHMoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFrZVJ1bm5lci5pbml0QXJncywgWygoKSwgeydidWZmZXInOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyYm9zaXR5JzogdmVyYm9zaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFpbGZhc3QnOiBmYWlsZmFzdH0pXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWtlUnVubmVyLnJ1bkFyZ3MsIFt0ZXN0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnJlc3VsdCwgcmVzdWx0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKSwgZGVmYXVsdF9oYW5kbGVyKQorCisgICAgZGVmIHRlc3RSZW1vdmVIYW5kbGVyKHNlbGYpOgorICAgICAgICBkZWZhdWx0X2hhbmRsZXIgPSBzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpCisgICAgICAgIHVuaXR0ZXN0Lmluc3RhbGxIYW5kbGVyKCkKKyAgICAgICAgdW5pdHRlc3QucmVtb3ZlSGFuZGxlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKSwgZGVmYXVsdF9oYW5kbGVyKQorCisgICAgICAgICMgY2hlY2sgdGhhdCBjYWxsaW5nIHJlbW92ZUhhbmRsZXIgbXVsdGlwbGUgdGltZXMgaGFzIG5vIGlsbC1lZmZlY3QKKyAgICAgICAgdW5pdHRlc3QucmVtb3ZlSGFuZGxlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKSwgZGVmYXVsdF9oYW5kbGVyKQorCisgICAgZGVmIHRlc3RSZW1vdmVIYW5kbGVyQXNEZWNvcmF0b3Ioc2VsZik6CisgICAgICAgIGRlZmF1bHRfaGFuZGxlciA9IHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCkKKyAgICAgICAgdW5pdHRlc3QuaW5zdGFsbEhhbmRsZXIoKQorCisgICAgICAgIEB1bml0dGVzdC5yZW1vdmVIYW5kbGVyCisgICAgICAgIGRlZiB0ZXN0KCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCksIGRlZmF1bHRfaGFuZGxlcikKKworICAgICAgICB0ZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpLCBkZWZhdWx0X2hhbmRsZXIpCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdraWxsJyksICJUZXN0IHJlcXVpcmVzIG9zLmtpbGwiKQorQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0id2luMzIiLCAiVGVzdCBjYW5ub3QgcnVuIG9uIFdpbmRvd3MiKQorQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gJ2ZyZWVic2Q2JywgIlRlc3Qga2lsbHMgcmVncnRlc3Qgb24gZnJlZWJzZDYgIgorICAgICJpZiB0aHJlYWRzIGhhdmUgYmVlbiB1c2VkIikKK2NsYXNzIFRlc3RCcmVha0RlZmF1bHRJbnRIYW5kbGVyKFRlc3RCcmVhayk6CisgICAgaW50X2hhbmRsZXIgPSBzaWduYWwuZGVmYXVsdF9pbnRfaGFuZGxlcgorCitAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAna2lsbCcpLCAiVGVzdCByZXF1aXJlcyBvcy5raWxsIikKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09IndpbjMyIiwgIlRlc3QgY2Fubm90IHJ1biBvbiBXaW5kb3dzIikKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICdmcmVlYnNkNicsICJUZXN0IGtpbGxzIHJlZ3J0ZXN0IG9uIGZyZWVic2Q2ICIKKyAgICAiaWYgdGhyZWFkcyBoYXZlIGJlZW4gdXNlZCIpCitjbGFzcyBUZXN0QnJlYWtTaWduYWxJZ25vcmVkKFRlc3RCcmVhayk6CisgICAgaW50X2hhbmRsZXIgPSBzaWduYWwuU0lHX0lHTgorCitAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAna2lsbCcpLCAiVGVzdCByZXF1aXJlcyBvcy5raWxsIikKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09IndpbjMyIiwgIlRlc3QgY2Fubm90IHJ1biBvbiBXaW5kb3dzIikKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICdmcmVlYnNkNicsICJUZXN0IGtpbGxzIHJlZ3J0ZXN0IG9uIGZyZWVic2Q2ICIKKyAgICAiaWYgdGhyZWFkcyBoYXZlIGJlZW4gdXNlZCIpCitjbGFzcyBUZXN0QnJlYWtTaWduYWxEZWZhdWx0KFRlc3RCcmVhayk6CisgICAgaW50X2hhbmRsZXIgPSBzaWduYWwuU0lHX0RGTApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfYnJlYWsucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfYnJlYWsucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODhmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9icmVhay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfYnJlYWsucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfYnJlYWsucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhODhmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9icmVhay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfY2FzZS5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Nhc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyYjAxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Nhc2UucHkKQEAgLTAsMCArMSwxMTI0IEBACitpbXBvcnQgZGlmZmxpYgoraW1wb3J0IHBwcmludAoraW1wb3J0IHBpY2tsZQoraW1wb3J0IHJlCitpbXBvcnQgc3lzCisKK2Zyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIC5zdXBwb3J0IGltcG9ydCAoCisgICAgVGVzdEVxdWFsaXR5LCBUZXN0SGFzaGluZywgTG9nZ2luZ1Jlc3VsdCwgUmVzdWx0V2l0aE5vU3RhcnRUZXN0UnVuU3RvcFRlc3RSdW4KKykKKworCitjbGFzcyBUZXN0KG9iamVjdCk6CisgICAgIktlZXAgdGhlc2UgVGVzdENhc2UgY2xhc3NlcyBvdXQgb2YgdGhlIG1haW4gbmFtZXNwYWNlIgorCisgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgZGVmIHJ1blRlc3Qoc2VsZik6IHBhc3MKKyAgICAgICAgZGVmIHRlc3QxKHNlbGYpOiBwYXNzCisKKyAgICBjbGFzcyBCYXIoRm9vKToKKyAgICAgICAgZGVmIHRlc3QyKHNlbGYpOiBwYXNzCisKKyAgICBjbGFzcyBMb2dnaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAiIiJBIHRlc3QgY2FzZSB3aGljaCBsb2dzIGl0cyBjYWxscy4iIiIKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZXZlbnRzKToKKyAgICAgICAgICAgIHN1cGVyKFRlc3QuTG9nZ2luZ1Rlc3RDYXNlLCBzZWxmKS5fX2luaXRfXygndGVzdCcpCisgICAgICAgICAgICBzZWxmLmV2ZW50cyA9IGV2ZW50cworCisgICAgICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZCgnc2V0VXAnKQorCisgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKCd0ZXN0JykKKworICAgICAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICAgICBzZWxmLmV2ZW50cy5hcHBlbmQoJ3RlYXJEb3duJykKKworCitjbGFzcyBUZXN0X1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlLCBUZXN0RXF1YWxpdHksIFRlc3RIYXNoaW5nKToKKworICAgICMjIyBTZXQgdXAgYXR0cmlidXRlcyB1c2VkIGJ5IGluaGVyaXRlZCB0ZXN0cworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICMgVXNlZCBieSBUZXN0SGFzaGluZy50ZXN0X2hhc2ggYW5kIFRlc3RFcXVhbGl0eS50ZXN0X2VxCisgICAgZXFfcGFpcnMgPSBbKFRlc3QuRm9vKCd0ZXN0MScpLCBUZXN0LkZvbygndGVzdDEnKSldCisKKyAgICAjIFVzZWQgYnkgVGVzdEVxdWFsaXR5LnRlc3RfbmUKKyAgICBuZV9wYWlycyA9IFsoVGVzdC5Gb28oJ3Rlc3QxJyksIFRlc3QuRm9vKCdydW5UZXN0JykpCisgICAgICAgICAgICAgICAsKFRlc3QuRm9vKCd0ZXN0MScpLCBUZXN0LkJhcigndGVzdDEnKSkKKyAgICAgICAgICAgICAgICwoVGVzdC5Gb28oJ3Rlc3QxJyksIFRlc3QuQmFyKCd0ZXN0MicpKV0KKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIyMgL1NldCB1cCBhdHRyaWJ1dGVzIHVzZWQgYnkgaW5oZXJpdGVkIHRlc3RzCisKKworICAgICMgImNsYXNzIFRlc3RDYXNlKFttZXRob2ROYW1lXSkiCisgICAgIyAuLi4KKyAgICAjICJFYWNoIGluc3RhbmNlIG9mIFRlc3RDYXNlIHdpbGwgcnVuIGEgc2luZ2xlIHRlc3QgbWV0aG9kOiB0aGUKKyAgICAjIG1ldGhvZCBuYW1lZCBtZXRob2ROYW1lLiIKKyAgICAjIC4uLgorICAgICMgIm1ldGhvZE5hbWUgZGVmYXVsdHMgdG8gInJ1blRlc3QiLiIKKyAgICAjCisgICAgIyBNYWtlIHN1cmUgaXQgcmVhbGx5IGlzIG9wdGlvbmFsLCBhbmQgdGhhdCBpdCBkZWZhdWx0cyB0byB0aGUgcHJvcGVyCisgICAgIyB0aGluZy4KKyAgICBkZWYgdGVzdF9pbml0X19ub190ZXN0X25hbWUoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHJ1blRlc3Qoc2VsZik6IHJhaXNlIFR5cGVFcnJvcigpCisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKTogcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVGVzdCgpLmlkKClbLTEzOl0sICcuVGVzdC5ydW5UZXN0JykKKworICAgICMgImNsYXNzIFRlc3RDYXNlKFttZXRob2ROYW1lXSkiCisgICAgIyAuLi4KKyAgICAjICJFYWNoIGluc3RhbmNlIG9mIFRlc3RDYXNlIHdpbGwgcnVuIGEgc2luZ2xlIHRlc3QgbWV0aG9kOiB0aGUKKyAgICAjIG1ldGhvZCBuYW1lZCBtZXRob2ROYW1lLiIKKyAgICBkZWYgdGVzdF9pbml0X190ZXN0X25hbWVfX3ZhbGlkKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBydW5UZXN0KHNlbGYpOiByYWlzZSBUeXBlRXJyb3IoKQorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6IHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRlc3QoJ3Rlc3QnKS5pZCgpWy0xMDpdLCAnLlRlc3QudGVzdCcpCisKKyAgICAjICJjbGFzcyBUZXN0Q2FzZShbbWV0aG9kTmFtZV0pIgorICAgICMgLi4uCisgICAgIyAiRWFjaCBpbnN0YW5jZSBvZiBUZXN0Q2FzZSB3aWxsIHJ1biBhIHNpbmdsZSB0ZXN0IG1ldGhvZDogdGhlCisgICAgIyBtZXRob2QgbmFtZWQgbWV0aG9kTmFtZS4iCisgICAgZGVmIHRlc3RfaW5pdF9fdGVzdF9uYW1lX19pbnZhbGlkKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBydW5UZXN0KHNlbGYpOiByYWlzZSBUeXBlRXJyb3IoKQorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6IHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBUZXN0KCd0ZXN0Zm9vJykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkZhaWxlZCB0byByYWlzZSBWYWx1ZUVycm9yIikKKworICAgICMgIlJldHVybiB0aGUgbnVtYmVyIG9mIHRlc3RzIHJlcHJlc2VudGVkIGJ5IHRoZSB0aGlzIHRlc3Qgb2JqZWN0LiBGb3IKKyAgICAjIFRlc3RDYXNlIGluc3RhbmNlcywgdGhpcyB3aWxsIGFsd2F5cyBiZSAxIgorICAgIGRlZiB0ZXN0X2NvdW50VGVzdENhc2VzKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6IHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZvbygndGVzdCcpLmNvdW50VGVzdENhc2VzKCksIDEpCisKKyAgICAjICJSZXR1cm4gdGhlIGRlZmF1bHQgdHlwZSBvZiB0ZXN0IHJlc3VsdCBvYmplY3QgdG8gYmUgdXNlZCB0byBydW4gdGhpcworICAgICMgdGVzdC4gRm9yIFRlc3RDYXNlIGluc3RhbmNlcywgdGhpcyB3aWxsIGFsd2F5cyBiZQorICAgICMgdW5pdHRlc3QuVGVzdFJlc3VsdDsgIHN1YmNsYXNzZXMgb2YgVGVzdENhc2Ugc2hvdWxkCisgICAgIyBvdmVycmlkZSB0aGlzIGFzIG5lY2Vzc2FyeS4iCisgICAgZGVmIHRlc3RfZGVmYXVsdFRlc3RSZXN1bHQoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgcnVuVGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmVzdWx0ID0gRm9vKCkuZGVmYXVsdFRlc3RSZXN1bHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgdW5pdHRlc3QuVGVzdFJlc3VsdCkKKworICAgICMgIldoZW4gYSBzZXRVcCgpIG1ldGhvZCBpcyBkZWZpbmVkLCB0aGUgdGVzdCBydW5uZXIgd2lsbCBydW4gdGhhdCBtZXRob2QKKyAgICAjIHByaW9yIHRvIGVhY2ggdGVzdC4gTGlrZXdpc2UsIGlmIGEgdGVhckRvd24oKSBtZXRob2QgaXMgZGVmaW5lZCwgdGhlCisgICAgIyB0ZXN0IHJ1bm5lciB3aWxsIGludm9rZSB0aGF0IG1ldGhvZCBhZnRlciBlYWNoIHRlc3QuIEluIHRoZSBleGFtcGxlLAorICAgICMgc2V0VXAoKSB3YXMgdXNlZCB0byBjcmVhdGUgYSBmcmVzaCBzZXF1ZW5jZSBmb3IgZWFjaCB0ZXN0LiIKKyAgICAjCisgICAgIyBNYWtlIHN1cmUgdGhlIHByb3BlciBjYWxsIG9yZGVyIGlzIG1haW50YWluZWQsIGV2ZW4gaWYgc2V0VXAoKSByYWlzZXMKKyAgICAjIGFuIGV4Y2VwdGlvbi4KKyAgICBkZWYgdGVzdF9ydW5fY2FsbF9vcmRlcl9fZXJyb3JfaW5fc2V0VXAoc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorCisgICAgICAgIGNsYXNzIEZvbyhUZXN0LkxvZ2dpbmdUZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICAgICAgICAgc3VwZXIoRm9vLCBzZWxmKS5zZXRVcCgpCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdyYWlzZWQgYnkgRm9vLnNldFVwJykKKworICAgICAgICBGb28oZXZlbnRzKS5ydW4ocmVzdWx0KQorICAgICAgICBleHBlY3RlZCA9IFsnc3RhcnRUZXN0JywgJ3NldFVwJywgJ2FkZEVycm9yJywgJ3N0b3BUZXN0J10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgIyAiV2l0aCBhIHRlbXBvcmFyeSByZXN1bHQgc3RvcFRlc3RSdW4gaXMgY2FsbGVkIHdoZW4gc2V0VXAgZXJyb3JzLgorICAgIGRlZiB0ZXN0X3J1bl9jYWxsX29yZGVyX19lcnJvcl9pbl9zZXRVcF9kZWZhdWx0X3Jlc3VsdChzZWxmKToKKyAgICAgICAgZXZlbnRzID0gW10KKworICAgICAgICBjbGFzcyBGb28oVGVzdC5Mb2dnaW5nVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIGRlZmF1bHRUZXN0UmVzdWx0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBMb2dnaW5nUmVzdWx0KHNlbGYuZXZlbnRzKQorCisgICAgICAgICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICAgICAgICAgc3VwZXIoRm9vLCBzZWxmKS5zZXRVcCgpCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdyYWlzZWQgYnkgRm9vLnNldFVwJykKKworICAgICAgICBGb28oZXZlbnRzKS5ydW4oKQorICAgICAgICBleHBlY3RlZCA9IFsnc3RhcnRUZXN0UnVuJywgJ3N0YXJ0VGVzdCcsICdzZXRVcCcsICdhZGRFcnJvcicsCisgICAgICAgICAgICAgICAgICAgICdzdG9wVGVzdCcsICdzdG9wVGVzdFJ1biddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKworICAgICMgIldoZW4gYSBzZXRVcCgpIG1ldGhvZCBpcyBkZWZpbmVkLCB0aGUgdGVzdCBydW5uZXIgd2lsbCBydW4gdGhhdCBtZXRob2QKKyAgICAjIHByaW9yIHRvIGVhY2ggdGVzdC4gTGlrZXdpc2UsIGlmIGEgdGVhckRvd24oKSBtZXRob2QgaXMgZGVmaW5lZCwgdGhlCisgICAgIyB0ZXN0IHJ1bm5lciB3aWxsIGludm9rZSB0aGF0IG1ldGhvZCBhZnRlciBlYWNoIHRlc3QuIEluIHRoZSBleGFtcGxlLAorICAgICMgc2V0VXAoKSB3YXMgdXNlZCB0byBjcmVhdGUgYSBmcmVzaCBzZXF1ZW5jZSBmb3IgZWFjaCB0ZXN0LiIKKyAgICAjCisgICAgIyBNYWtlIHN1cmUgdGhlIHByb3BlciBjYWxsIG9yZGVyIGlzIG1haW50YWluZWQsIGV2ZW4gaWYgdGhlIHRlc3QgcmFpc2VzCisgICAgIyBhbiBlcnJvciAoYXMgb3Bwb3NlZCB0byBhIGZhaWx1cmUpLgorICAgIGRlZiB0ZXN0X3J1bl9jYWxsX29yZGVyX19lcnJvcl9pbl90ZXN0KHNlbGYpOgorICAgICAgICBldmVudHMgPSBbXQorICAgICAgICByZXN1bHQgPSBMb2dnaW5nUmVzdWx0KGV2ZW50cykKKworICAgICAgICBjbGFzcyBGb28oVGVzdC5Mb2dnaW5nVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgc3VwZXIoRm9vLCBzZWxmKS50ZXN0KCkKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3JhaXNlZCBieSBGb28udGVzdCcpCisKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ3N0YXJ0VGVzdCcsICdzZXRVcCcsICd0ZXN0JywgJ2FkZEVycm9yJywgJ3RlYXJEb3duJywKKyAgICAgICAgICAgICAgICAgICAgJ3N0b3BUZXN0J10KKyAgICAgICAgRm9vKGV2ZW50cykucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgIyAiV2l0aCBhIGRlZmF1bHQgcmVzdWx0LCBhbiBlcnJvciBpbiB0aGUgdGVzdCBzdGlsbCByZXN1bHRzIGluIHN0b3BUZXN0UnVuCisgICAgIyBiZWluZyBjYWxsZWQuIgorICAgIGRlZiB0ZXN0X3J1bl9jYWxsX29yZGVyX19lcnJvcl9pbl90ZXN0X2RlZmF1bHRfcmVzdWx0KHNlbGYpOgorICAgICAgICBldmVudHMgPSBbXQorCisgICAgICAgIGNsYXNzIEZvbyhUZXN0LkxvZ2dpbmdUZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgZGVmYXVsdFRlc3RSZXN1bHQoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIExvZ2dpbmdSZXN1bHQoc2VsZi5ldmVudHMpCisKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHN1cGVyKEZvbywgc2VsZikudGVzdCgpCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdyYWlzZWQgYnkgRm9vLnRlc3QnKQorCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3RSdW4nLCAnc3RhcnRUZXN0JywgJ3NldFVwJywgJ3Rlc3QnLCAnYWRkRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAndGVhckRvd24nLCAnc3RvcFRlc3QnLCAnc3RvcFRlc3RSdW4nXQorICAgICAgICBGb28oZXZlbnRzKS5ydW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgZXhwZWN0ZWQpCisKKyAgICAjICJXaGVuIGEgc2V0VXAoKSBtZXRob2QgaXMgZGVmaW5lZCwgdGhlIHRlc3QgcnVubmVyIHdpbGwgcnVuIHRoYXQgbWV0aG9kCisgICAgIyBwcmlvciB0byBlYWNoIHRlc3QuIExpa2V3aXNlLCBpZiBhIHRlYXJEb3duKCkgbWV0aG9kIGlzIGRlZmluZWQsIHRoZQorICAgICMgdGVzdCBydW5uZXIgd2lsbCBpbnZva2UgdGhhdCBtZXRob2QgYWZ0ZXIgZWFjaCB0ZXN0LiBJbiB0aGUgZXhhbXBsZSwKKyAgICAjIHNldFVwKCkgd2FzIHVzZWQgdG8gY3JlYXRlIGEgZnJlc2ggc2VxdWVuY2UgZm9yIGVhY2ggdGVzdC4iCisgICAgIworICAgICMgTWFrZSBzdXJlIHRoZSBwcm9wZXIgY2FsbCBvcmRlciBpcyBtYWludGFpbmVkLCBldmVuIGlmIHRoZSB0ZXN0IHNpZ25hbHMKKyAgICAjIGEgZmFpbHVyZSAoYXMgb3Bwb3NlZCB0byBhbiBlcnJvcikuCisgICAgZGVmIHRlc3RfcnVuX2NhbGxfb3JkZXJfX2ZhaWx1cmVfaW5fdGVzdChzZWxmKToKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisKKyAgICAgICAgY2xhc3MgRm9vKFRlc3QuTG9nZ2luZ1Rlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHN1cGVyKEZvbywgc2VsZikudGVzdCgpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdyYWlzZWQgYnkgRm9vLnRlc3QnKQorCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3QnLCAnc2V0VXAnLCAndGVzdCcsICdhZGRGYWlsdXJlJywgJ3RlYXJEb3duJywKKyAgICAgICAgICAgICAgICAgICAgJ3N0b3BUZXN0J10KKyAgICAgICAgRm9vKGV2ZW50cykucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgIyAiV2hlbiBhIHRlc3QgZmFpbHMgd2l0aCBhIGRlZmF1bHQgcmVzdWx0IHN0b3BUZXN0UnVuIGlzIHN0aWxsIGNhbGxlZC4iCisgICAgZGVmIHRlc3RfcnVuX2NhbGxfb3JkZXJfX2ZhaWx1cmVfaW5fdGVzdF9kZWZhdWx0X3Jlc3VsdChzZWxmKToKKworICAgICAgICBjbGFzcyBGb28oVGVzdC5Mb2dnaW5nVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIGRlZmF1bHRUZXN0UmVzdWx0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBMb2dnaW5nUmVzdWx0KHNlbGYuZXZlbnRzKQorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgc3VwZXIoRm9vLCBzZWxmKS50ZXN0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ3JhaXNlZCBieSBGb28udGVzdCcpCisKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ3N0YXJ0VGVzdFJ1bicsICdzdGFydFRlc3QnLCAnc2V0VXAnLCAndGVzdCcsICdhZGRGYWlsdXJlJywKKyAgICAgICAgICAgICAgICAgICAgJ3RlYXJEb3duJywgJ3N0b3BUZXN0JywgJ3N0b3BUZXN0UnVuJ10KKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgRm9vKGV2ZW50cykucnVuKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgIyAiV2hlbiBhIHNldFVwKCkgbWV0aG9kIGlzIGRlZmluZWQsIHRoZSB0ZXN0IHJ1bm5lciB3aWxsIHJ1biB0aGF0IG1ldGhvZAorICAgICMgcHJpb3IgdG8gZWFjaCB0ZXN0LiBMaWtld2lzZSwgaWYgYSB0ZWFyRG93bigpIG1ldGhvZCBpcyBkZWZpbmVkLCB0aGUKKyAgICAjIHRlc3QgcnVubmVyIHdpbGwgaW52b2tlIHRoYXQgbWV0aG9kIGFmdGVyIGVhY2ggdGVzdC4gSW4gdGhlIGV4YW1wbGUsCisgICAgIyBzZXRVcCgpIHdhcyB1c2VkIHRvIGNyZWF0ZSBhIGZyZXNoIHNlcXVlbmNlIGZvciBlYWNoIHRlc3QuIgorICAgICMKKyAgICAjIE1ha2Ugc3VyZSB0aGUgcHJvcGVyIGNhbGwgb3JkZXIgaXMgbWFpbnRhaW5lZCwgZXZlbiBpZiB0ZWFyRG93bigpIHJhaXNlcworICAgICMgYW4gZXhjZXB0aW9uLgorICAgIGRlZiB0ZXN0X3J1bl9jYWxsX29yZGVyX19lcnJvcl9pbl90ZWFyRG93bihzZWxmKToKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisKKyAgICAgICAgY2xhc3MgRm9vKFRlc3QuTG9nZ2luZ1Rlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgICAgICAgICBzdXBlcihGb28sIHNlbGYpLnRlYXJEb3duKCkKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3JhaXNlZCBieSBGb28udGVhckRvd24nKQorCisgICAgICAgIEZvbyhldmVudHMpLnJ1bihyZXN1bHQpCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3QnLCAnc2V0VXAnLCAndGVzdCcsICd0ZWFyRG93bicsICdhZGRFcnJvcicsCisgICAgICAgICAgICAgICAgICAgICdzdG9wVGVzdCddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKworICAgICMgIldoZW4gdGVhckRvd24gZXJyb3JzIHdpdGggYSBkZWZhdWx0IHJlc3VsdCBzdG9wVGVzdFJ1biBpcyBzdGlsbCBjYWxsZWQuIgorICAgIGRlZiB0ZXN0X3J1bl9jYWxsX29yZGVyX19lcnJvcl9pbl90ZWFyRG93bl9kZWZhdWx0X3Jlc3VsdChzZWxmKToKKworICAgICAgICBjbGFzcyBGb28oVGVzdC5Mb2dnaW5nVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIGRlZmF1bHRUZXN0UmVzdWx0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBMb2dnaW5nUmVzdWx0KHNlbGYuZXZlbnRzKQorICAgICAgICAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAgICAgICAgIHN1cGVyKEZvbywgc2VsZikudGVhckRvd24oKQorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigncmFpc2VkIGJ5IEZvby50ZWFyRG93bicpCisKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgRm9vKGV2ZW50cykucnVuKCkKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ3N0YXJ0VGVzdFJ1bicsICdzdGFydFRlc3QnLCAnc2V0VXAnLCAndGVzdCcsICd0ZWFyRG93bicsCisgICAgICAgICAgICAgICAgICAgICdhZGRFcnJvcicsICdzdG9wVGVzdCcsICdzdG9wVGVzdFJ1biddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKworICAgICMgIlRlc3RDYXNlLnJ1bigpIHN0aWxsIHdvcmtzIHdoZW4gdGhlIGRlZmF1bHRUZXN0UmVzdWx0IGlzIGEgVGVzdFJlc3VsdAorICAgICMgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHN0YXJ0VGVzdFJ1biBhbmQgc3RvcFRlc3RSdW4uCisgICAgZGVmIHRlc3RfcnVuX2NhbGxfb3JkZXJfZGVmYXVsdF9yZXN1bHQoc2VsZik6CisKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBkZWZhdWx0VGVzdFJlc3VsdChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0V2l0aE5vU3RhcnRUZXN0UnVuU3RvcFRlc3RSdW4oKQorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIEZvbygndGVzdCcpLnJ1bigpCisKKyAgICAjICJUaGlzIGNsYXNzIGF0dHJpYnV0ZSBnaXZlcyB0aGUgZXhjZXB0aW9uIHJhaXNlZCBieSB0aGUgdGVzdCgpIG1ldGhvZC4KKyAgICAjIElmIGEgdGVzdCBmcmFtZXdvcmsgbmVlZHMgdG8gdXNlIGEgc3BlY2lhbGl6ZWQgZXhjZXB0aW9uLCBwb3NzaWJseSB0bworICAgICMgY2FycnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgaXQgbXVzdCBzdWJjbGFzcyB0aGlzIGV4Y2VwdGlvbiBpbgorICAgICMgb3JkZXIgdG8gYGBwbGF5IGZhaXInJyB3aXRoIHRoZSBmcmFtZXdvcmsuICBUaGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGlzCisgICAgIyBhdHRyaWJ1dGUgaXMgQXNzZXJ0aW9uRXJyb3IiCisgICAgZGVmIHRlc3RfZmFpbHVyZUV4Y2VwdGlvbl9fZGVmYXVsdChzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoRm9vKCd0ZXN0JykuZmFpbHVyZUV4Y2VwdGlvbiBpcyBBc3NlcnRpb25FcnJvcikKKworICAgICMgIlRoaXMgY2xhc3MgYXR0cmlidXRlIGdpdmVzIHRoZSBleGNlcHRpb24gcmFpc2VkIGJ5IHRoZSB0ZXN0KCkgbWV0aG9kLgorICAgICMgSWYgYSB0ZXN0IGZyYW1ld29yayBuZWVkcyB0byB1c2UgYSBzcGVjaWFsaXplZCBleGNlcHRpb24sIHBvc3NpYmx5IHRvCisgICAgIyBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBpdCBtdXN0IHN1YmNsYXNzIHRoaXMgZXhjZXB0aW9uIGluCisgICAgIyBvcmRlciB0byBgYHBsYXkgZmFpcicnIHdpdGggdGhlIGZyYW1ld29yay4iCisgICAgIworICAgICMgTWFrZSBzdXJlIFRlc3RDYXNlLnJ1bigpIHJlc3BlY3RzIHRoZSBkZXNpZ25hdGVkIGZhaWx1cmVFeGNlcHRpb24KKyAgICBkZWYgdGVzdF9mYWlsdXJlRXhjZXB0aW9uX19zdWJjbGFzc2luZ19fZXhwbGljaXRfcmFpc2Uoc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoKQorCisgICAgICAgICAgICBmYWlsdXJlRXhjZXB0aW9uID0gUnVudGltZUVycm9yCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEZvbygndGVzdCcpLmZhaWx1cmVFeGNlcHRpb24gaXMgUnVudGltZUVycm9yKQorCisKKyAgICAgICAgRm9vKCd0ZXN0JykucnVuKHJlc3VsdCkKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ3N0YXJ0VGVzdCcsICdhZGRGYWlsdXJlJywgJ3N0b3BUZXN0J10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgIyAiVGhpcyBjbGFzcyBhdHRyaWJ1dGUgZ2l2ZXMgdGhlIGV4Y2VwdGlvbiByYWlzZWQgYnkgdGhlIHRlc3QoKSBtZXRob2QuCisgICAgIyBJZiBhIHRlc3QgZnJhbWV3b3JrIG5lZWRzIHRvIHVzZSBhIHNwZWNpYWxpemVkIGV4Y2VwdGlvbiwgcG9zc2libHkgdG8KKyAgICAjIGNhcnJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIGl0IG11c3Qgc3ViY2xhc3MgdGhpcyBleGNlcHRpb24gaW4KKyAgICAjIG9yZGVyIHRvIGBgcGxheSBmYWlyJycgd2l0aCB0aGUgZnJhbWV3b3JrLiIKKyAgICAjCisgICAgIyBNYWtlIHN1cmUgVGVzdENhc2UucnVuKCkgcmVzcGVjdHMgdGhlIGRlc2lnbmF0ZWQgZmFpbHVyZUV4Y2VwdGlvbgorICAgIGRlZiB0ZXN0X2ZhaWx1cmVFeGNlcHRpb25fX3N1YmNsYXNzaW5nX19pbXBsaWNpdF9yYWlzZShzZWxmKToKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZm9vIikKKworICAgICAgICAgICAgZmFpbHVyZUV4Y2VwdGlvbiA9IFJ1bnRpbWVFcnJvcgorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGb28oJ3Rlc3QnKS5mYWlsdXJlRXhjZXB0aW9uIGlzIFJ1bnRpbWVFcnJvcikKKworCisgICAgICAgIEZvbygndGVzdCcpLnJ1bihyZXN1bHQpCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3QnLCAnYWRkRmFpbHVyZScsICdzdG9wVGVzdCddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKworICAgICMgIlRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4iCisgICAgZGVmIHRlc3Rfc2V0VXAoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgcnVuVGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyAuLi4gYW5kIG5vdGhpbmcgc2hvdWxkIGhhcHBlbgorICAgICAgICBGb28oKS5zZXRVcCgpCisKKyAgICAjICJUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIgorICAgIGRlZiB0ZXN0X3RlYXJEb3duKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgLi4uIGFuZCBub3RoaW5nIHNob3VsZCBoYXBwZW4KKyAgICAgICAgRm9vKCkudGVhckRvd24oKQorCisgICAgIyAiUmV0dXJuIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBzcGVjaWZpYyB0ZXN0IGNhc2UuIgorICAgICMKKyAgICAjIEJlY2F1c2Ugb2YgdGhlIHZhZ3VlIG5hdHVyZSBvZiB0aGUgZG9jcywgSSdtIG5vdCBnb2luZyB0byBsb2NrIHRoaXMKKyAgICAjIHRlc3QgZG93biB0b28gbXVjaC4gUmVhbGx5IGFsbCB0aGF0IGNhbiBiZSBhc3NlcnRlZCBpcyB0aGF0IHRoZSBpZCgpCisgICAgIyB3aWxsIGJlIGEgc3RyaW5nIChlaXRoZXIgOC1ieXRlIG9yIHVuaWNvZGUgLS0gYWdhaW4sIGJlY2F1c2UgdGhlIGRvY3MKKyAgICAjIGp1c3Qgc2F5ICJzdHJpbmciKQorICAgIGRlZiB0ZXN0X2lkKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShGb28oKS5pZCgpLCBiYXNlc3RyaW5nKQorCisgICAgIyAiSWYgcmVzdWx0IGlzIG9taXR0ZWQgb3IgTm9uZSwgYSB0ZW1wb3JhcnkgcmVzdWx0IG9iamVjdCBpcyBjcmVhdGVkCisgICAgIyBhbmQgdXNlZCwgYnV0IGlzIG5vdCBtYWRlIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyLiBBcyBUZXN0Q2FzZSBvd25zIHRoZQorICAgICMgdGVtcG9yYXJ5IHJlc3VsdCBzdGFydFRlc3RSdW4gYW5kIHN0b3BUZXN0UnVuIGFyZSBjYWxsZWQuCisKKyAgICBkZWYgdGVzdF9ydW5fX3VzZXNfZGVmYXVsdFRlc3RSZXN1bHQoc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoJ3Rlc3QnKQorCisgICAgICAgICAgICBkZWYgZGVmYXVsdFRlc3RSZXN1bHQoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorCisgICAgICAgICMgTWFrZSBydW4oKSBmaW5kIGEgcmVzdWx0IG9iamVjdCBvbiBpdHMgb3duCisgICAgICAgIEZvbygndGVzdCcpLnJ1bigpCisKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ3N0YXJ0VGVzdFJ1bicsICdzdGFydFRlc3QnLCAndGVzdCcsICdhZGRTdWNjZXNzJywKKyAgICAgICAgICAgICdzdG9wVGVzdCcsICdzdG9wVGVzdFJ1biddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0U2hvcnREZXNjcmlwdGlvbldpdGhvdXREb2NzdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuc2hvcnREZXNjcmlwdGlvbigpKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RTaG9ydERlc2NyaXB0aW9uV2l0aE9uZUxpbmVEb2NzdHJpbmcoc2VsZik6CisgICAgICAgICIiIlRlc3RzIHNob3J0RGVzY3JpcHRpb24oKSBmb3IgYSBtZXRob2Qgd2l0aCBhIGRvY3N0cmluZy4iIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICBzZWxmLnNob3J0RGVzY3JpcHRpb24oKSwKKyAgICAgICAgICAgICAgICAnVGVzdHMgc2hvcnREZXNjcmlwdGlvbigpIGZvciBhIG1ldGhvZCB3aXRoIGEgZG9jc3RyaW5nLicpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdFNob3J0RGVzY3JpcHRpb25XaXRoTXVsdGlMaW5lRG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJUZXN0cyBzaG9ydERlc2NyaXB0aW9uKCkgZm9yIGEgbWV0aG9kIHdpdGggYSBsb25nZXIgZG9jc3RyaW5nLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGVuc3VyZXMgdGhhdCBvbmx5IHRoZSBmaXJzdCBsaW5lIG9mIGEgZG9jc3RyaW5nIGlzCisgICAgICAgIHJldHVybmVkIHVzZWQgaW4gdGhlIHNob3J0IGRlc2NyaXB0aW9uLCBubyBtYXR0ZXIgaG93IGxvbmcgdGhlCisgICAgICAgIHdob2xlIHRoaW5nIGlzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICBzZWxmLnNob3J0RGVzY3JpcHRpb24oKSwKKyAgICAgICAgICAgICAgICAgJ1Rlc3RzIHNob3J0RGVzY3JpcHRpb24oKSBmb3IgYSBtZXRob2Qgd2l0aCBhIGxvbmdlciAnCisgICAgICAgICAgICAgICAgICdkb2NzdHJpbmcuJykKKworICAgIGRlZiB0ZXN0QWRkVHlwZUVxdWFsaXR5RnVuYyhzZWxmKToKKyAgICAgICAgY2xhc3MgU2FkU25ha2Uob2JqZWN0KToKKyAgICAgICAgICAgICIiIkR1bW15IGNsYXNzIGZvciB0ZXN0X2FkZFR5cGVFcXVhbGl0eUZ1bmMuIiIiCisgICAgICAgIHMxLCBzMiA9IFNhZFNuYWtlKCksIFNhZFNuYWtlKCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzMSwgczIpCisgICAgICAgIGRlZiBBbGxTbmFrZXNDcmVhdGVkRXF1YWwoYSwgYiwgbXNnPU5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIHR5cGUoYSkgaXMgdHlwZShiKSBpcyBTYWRTbmFrZQorICAgICAgICBzZWxmLmFkZFR5cGVFcXVhbGl0eUZ1bmMoU2FkU25ha2UsIEFsbFNuYWtlc0NyZWF0ZWRFcXVhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMSwgczIpCisgICAgICAgICMgTm8gdGhpcyBkb2Vzbid0IGNsZWFuIHVwIGFuZCByZW1vdmUgdGhlIFNhZFNuYWtlIGVxdWFsaXR5IGZ1bmMKKyAgICAgICAgIyBmcm9tIHRoaXMgVGVzdENhc2UgaW5zdGFuY2UgYnV0IHNpbmNlIGl0cyBhIGxvY2FsIG5vdGhpbmcgZWxzZQorICAgICAgICAjIHdpbGwgZXZlciBub3RpY2UgdGhhdC4KKworICAgIGRlZiB0ZXN0QXNzZXJ0SXMoc2VsZik6CisgICAgICAgIHRoaW5nID0gb2JqZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0aGluZywgdGhpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJcywgdGhpbmcsIG9iamVjdCgpKQorCisgICAgZGVmIHRlc3RBc3NlcnRJc05vdChzZWxmKToKKyAgICAgICAgdGhpbmcgPSBvYmplY3QoKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KHRoaW5nLCBvYmplY3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydElzTm90LCB0aGluZywgdGhpbmcpCisKKyAgICBkZWYgdGVzdEFzc2VydElzSW5zdGFuY2Uoc2VsZik6CisgICAgICAgIHRoaW5nID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHRoaW5nLCBsaXN0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcsIGRpY3QpCisKKyAgICBkZWYgdGVzdEFzc2VydE5vdElzSW5zdGFuY2Uoc2VsZik6CisgICAgICAgIHRoaW5nID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHRoaW5nLCBkaWN0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpbmcsIGxpc3QpCisKKyAgICBkZWYgdGVzdEFzc2VydEluKHNlbGYpOgorICAgICAgICBhbmltYWxzID0geydtb25rZXknOiAnYmFuYW5hJywgJ2Nvdyc6ICdncmFzcycsICdzZWFsJzogJ2Zpc2gnfQorCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigyLCBbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ21vbmtleScsIGFuaW1hbHMpCisKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignZCcsICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDAsIFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignb3R0ZXInLCBhbmltYWxzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJbiwgJ3gnLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEluLCA0LCBbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJbiwgJ2VsZXBoYW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWFscykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0Tm90SW4sICdjJywgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnROb3RJbiwgMSwgWzEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0Tm90SW4sICdjb3cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYWxzKQorCisgICAgZGVmIHRlc3RBc3NlcnREaWN0Q29udGFpbnNTdWJzZXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RGljdENvbnRhaW5zU3Vic2V0KHt9LCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnREaWN0Q29udGFpbnNTdWJzZXQoe30sIHsnYSc6IDF9KQorICAgICAgICBzZWxmLmFzc2VydERpY3RDb250YWluc1N1YnNldCh7J2EnOiAxfSwgeydhJzogMX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RGljdENvbnRhaW5zU3Vic2V0KHsnYSc6IDF9LCB7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBzZWxmLmFzc2VydERpY3RDb250YWluc1N1YnNldCh7J2EnOiAxLCAnYic6IDJ9LCB7J2EnOiAxLCAnYic6IDJ9KQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RGljdENvbnRhaW5zU3Vic2V0KHsxOiAib25lIn0sIHt9KQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RGljdENvbnRhaW5zU3Vic2V0KHsnYSc6IDJ9LCB7J2EnOiAxfSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbik6CisgICAgICAgICAgICBzZWxmLmFzc2VydERpY3RDb250YWluc1N1YnNldCh7J2MnOiAxfSwgeydhJzogMX0pCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24pOgorICAgICAgICAgICAgc2VsZi5hc3NlcnREaWN0Q29udGFpbnNTdWJzZXQoeydhJzogMSwgJ2MnOiAxfSwgeydhJzogMX0pCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24pOgorICAgICAgICAgICAgc2VsZi5hc3NlcnREaWN0Q29udGFpbnNTdWJzZXQoeydhJzogMSwgJ2MnOiAxfSwgeydhJzogMX0pCisKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCIiLCBVbmljb2RlV2FybmluZykpOgorICAgICAgICAgICAgb25lID0gJycuam9pbihjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMjU1KSkKKyAgICAgICAgICAgICMgdGhpcyB1c2VkIHRvIGNhdXNlIGEgVW5pY29kZURlY29kZUVycm9yIGNvbnN0cnVjdGluZyB0aGUgZmFpbHVyZSBtc2cKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydERpY3RDb250YWluc1N1YnNldCh7J2Zvbyc6IG9uZX0sIHsnZm9vJzogdSdcdUZGRkQnfSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0RXF1YWwoc2VsZik6CisgICAgICAgIGVxdWFsX3BhaXJzID0gWworICAgICAgICAgICAgICAgICgoKSwgKCkpLAorICAgICAgICAgICAgICAgICh7fSwge30pLAorICAgICAgICAgICAgICAgIChbXSwgW10pLAorICAgICAgICAgICAgICAgIChzZXQoKSwgc2V0KCkpLAorICAgICAgICAgICAgICAgIChmcm96ZW5zZXQoKSwgZnJvemVuc2V0KCkpXQorICAgICAgICBmb3IgYSwgYiBpbiBlcXVhbF9wYWlyczoKKyAgICAgICAgICAgICMgVGhpcyBtZXNzIG9mIHRyeSBleGNlcHRzIGlzIHRvIHRlc3QgdGhlIGFzc2VydEVxdWFsIGJlaGF2aW9yCisgICAgICAgICAgICAjIGl0c2VsZi4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisgICAgICAgICAgICBleGNlcHQgc2VsZi5mYWlsdXJlRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnYXNzZXJ0RXF1YWwoJXIsICVyKSBmYWlsZWQnICUgKGEsIGIpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYiwgbXNnPSdmb28nKQorICAgICAgICAgICAgZXhjZXB0IHNlbGYuZmFpbHVyZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ2Fzc2VydEVxdWFsKCVyLCAlcikgd2l0aCBtc2c9IGZhaWxlZCcgJSAoYSwgYikpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiLCAnZm9vJykKKyAgICAgICAgICAgIGV4Y2VwdCBzZWxmLmZhaWx1cmVFeGNlcHRpb246CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdhc3NlcnRFcXVhbCglciwgJXIpIHdpdGggdGhpcmQgcGFyYW1ldGVyIGZhaWxlZCcgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAoYSwgYikpCisKKyAgICAgICAgdW5lcXVhbF9wYWlycyA9IFsKKyAgICAgICAgICAgICAgICgoKSwgW10pLAorICAgICAgICAgICAgICAgKHt9LCBzZXQoKSksCisgICAgICAgICAgICAgICAoc2V0KFs0LDFdKSwgZnJvemVuc2V0KFs0LDJdKSksCisgICAgICAgICAgICAgICAoZnJvemVuc2V0KFs0LDVdKSwgc2V0KFsyLDNdKSksCisgICAgICAgICAgICAgICAoc2V0KFszLDRdKSwgc2V0KFs1LDRdKSldCisgICAgICAgIGZvciBhLCBiIGluIHVuZXF1YWxfcGFpcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0RXF1YWwsIGEsIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0RXF1YWwsIGEsIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRFcXVhbCwgYSwgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nZm9vJykKKworICAgIGRlZiB0ZXN0RXF1YWxpdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TGlzdEVxdWFsKFtdLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUdXBsZUVxdWFsKCgpLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCAoKSkKKworICAgICAgICBhID0gWzAsICdhJywgW11dCisgICAgICAgIGIgPSBbXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh1bml0dGVzdC5UZXN0Q2FzZS5mYWlsdXJlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbCwgYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModW5pdHRlc3QuVGVzdENhc2UuZmFpbHVyZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwsIHR1cGxlKGEpLCB0dXBsZShiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModW5pdHRlc3QuVGVzdENhc2UuZmFpbHVyZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsLCBhLCB0dXBsZShiKSkKKworICAgICAgICBiLmV4dGVuZChhKQorICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbChhLCBiKQorICAgICAgICBzZWxmLmFzc2VydFR1cGxlRXF1YWwodHVwbGUoYSksIHR1cGxlKGIpKQorICAgICAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoYSwgdHVwbGUoYikpCisgICAgICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbCh0dXBsZShhKSwgYikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGlzdEVxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhLCB0dXBsZShiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydFR1cGxlRXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlKGEpLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGlzdEVxdWFsLCBOb25lLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0VHVwbGVFcXVhbCwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGUoYikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCB0dXBsZShiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExpc3RFcXVhbCwgMSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydFR1cGxlRXF1YWwsIDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKHt9LCB7fSkKKworICAgICAgICBjID0geyAneCc6IDEgfQorICAgICAgICBkID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModW5pdHRlc3QuVGVzdENhc2UuZmFpbHVyZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwsIGMsIGQpCisKKyAgICAgICAgZC51cGRhdGUoYykKKyAgICAgICAgc2VsZi5hc3NlcnREaWN0RXF1YWwoYywgZCkKKworICAgICAgICBkWyd4J10gPSAwCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHVuaXR0ZXN0LlRlc3RDYXNlLmZhaWx1cmVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsLCBjLCBkLCAnVGhlc2UgYXJlIHVuZXF1YWwnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnREaWN0RXF1YWwsIE5vbmUsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnREaWN0RXF1YWwsIFtdLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0RGljdEVxdWFsLCAxLCAxKQorCisgICAgZGVmIHRlc3RBc3NlcnRTZXF1ZW5jZUVxdWFsTWF4RGlmZihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1heERpZmYsIDgwKjgpCisgICAgICAgIHNlcTEgPSAnYScgKyAneCcgKiA4MCoqMgorICAgICAgICBzZXEyID0gJ2InICsgJ3gnICogODAqKjIKKyAgICAgICAgZGlmZiA9ICdcbicuam9pbihkaWZmbGliLm5kaWZmKHBwcmludC5wZm9ybWF0KHNlcTEpLnNwbGl0bGluZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwcmludC5wZm9ybWF0KHNlcTIpLnNwbGl0bGluZXMoKSkpCisgICAgICAgICMgdGhlICsxIGlzIHRoZSBsZWFkaW5nIFxuIGFkZGVkIGJ5IGFzc2VydFNlcXVlbmNlRXF1YWwKKyAgICAgICAgb21pdHRlZCA9IHVuaXR0ZXN0LmNhc2UuRElGRl9PTUlUVEVEICUgKGxlbihkaWZmKSArIDEsKQorCisgICAgICAgIHNlbGYubWF4RGlmZiA9IGxlbihkaWZmKS8vMgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoc2VxMSwgc2VxMikKKyAgICAgICAgZXhjZXB0IHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgbXNnID0gZS5hcmdzWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2Fzc2VydFNlcXVlbmNlRXF1YWwgZGlkIG5vdCBmYWlsLicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obXNnKSA8IGxlbihkaWZmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihvbWl0dGVkLCBtc2cpCisKKyAgICAgICAgc2VsZi5tYXhEaWZmID0gbGVuKGRpZmYpICogMgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoc2VxMSwgc2VxMikKKyAgICAgICAgZXhjZXB0IHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgbXNnID0gZS5hcmdzWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2Fzc2VydFNlcXVlbmNlRXF1YWwgZGlkIG5vdCBmYWlsLicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obXNnKSA+IGxlbihkaWZmKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihvbWl0dGVkLCBtc2cpCisKKyAgICAgICAgc2VsZi5tYXhEaWZmID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoc2VxMSwgc2VxMikKKyAgICAgICAgZXhjZXB0IHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgbXNnID0gZS5hcmdzWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2Fzc2VydFNlcXVlbmNlRXF1YWwgZGlkIG5vdCBmYWlsLicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obXNnKSA+IGxlbihkaWZmKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihvbWl0dGVkLCBtc2cpCisKKyAgICBkZWYgdGVzdFRydW5jYXRlTWVzc2FnZShzZWxmKToKKyAgICAgICAgc2VsZi5tYXhEaWZmID0gMQorICAgICAgICBtZXNzYWdlID0gc2VsZi5fdHJ1bmNhdGVNZXNzYWdlKCdmb28nLCAnYmFyJykKKyAgICAgICAgb21pdHRlZCA9IHVuaXR0ZXN0LmNhc2UuRElGRl9PTUlUVEVEICUgbGVuKCdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsICdmb28nICsgb21pdHRlZCkKKworICAgICAgICBzZWxmLm1heERpZmYgPSBOb25lCisgICAgICAgIG1lc3NhZ2UgPSBzZWxmLl90cnVuY2F0ZU1lc3NhZ2UoJ2ZvbycsICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsICdmb29iYXInKQorCisgICAgICAgIHNlbGYubWF4RGlmZiA9IDQKKyAgICAgICAgbWVzc2FnZSA9IHNlbGYuX3RydW5jYXRlTWVzc2FnZSgnZm9vJywgJ2JhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgJ2Zvb2JhcicpCisKKyAgICBkZWYgdGVzdEFzc2VydERpY3RFcXVhbFRydW5jYXRlcyhzZWxmKToKKyAgICAgICAgdGVzdCA9IHVuaXR0ZXN0LlRlc3RDYXNlKCdhc3NlcnRFcXVhbCcpCisgICAgICAgIGRlZiB0cnVuY2F0ZShtc2csIGRpZmYpOgorICAgICAgICAgICAgcmV0dXJuICdmb28nCisgICAgICAgIHRlc3QuX3RydW5jYXRlTWVzc2FnZSA9IHRydW5jYXRlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3QuYXNzZXJ0RGljdEVxdWFsKHt9LCB7MTogMH0pCisgICAgICAgIGV4Y2VwdCBzZWxmLmZhaWx1cmVFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGUpLCAnZm9vJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnYXNzZXJ0RGljdEVxdWFsIGRpZCBub3QgZmFpbCcpCisKKyAgICBkZWYgdGVzdEFzc2VydE11bHRpTGluZUVxdWFsVHJ1bmNhdGVzKHNlbGYpOgorICAgICAgICB0ZXN0ID0gdW5pdHRlc3QuVGVzdENhc2UoJ2Fzc2VydEVxdWFsJykKKyAgICAgICAgZGVmIHRydW5jYXRlKG1zZywgZGlmZik6CisgICAgICAgICAgICByZXR1cm4gJ2ZvbycKKyAgICAgICAgdGVzdC5fdHJ1bmNhdGVNZXNzYWdlID0gdHJ1bmNhdGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdC5hc3NlcnRNdWx0aUxpbmVFcXVhbCgnZm9vJywgJ2JhcicpCisgICAgICAgIGV4Y2VwdCBzZWxmLmZhaWx1cmVFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGUpLCAnZm9vJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnYXNzZXJ0TXVsdGlMaW5lRXF1YWwgZGlkIG5vdCBmYWlsJykKKworICAgIGRlZiB0ZXN0QXNzZXJ0RXF1YWxfZGlmZlRocmVzaG9sZChzZWxmKToKKyAgICAgICAgIyBjaGVjayB0aHJlc2hvbGQgdmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kaWZmVGhyZXNob2xkLCAyKioxNikKKyAgICAgICAgIyBkaXNhYmxlIG1hZERpZmYgdG8gZ2V0IGRpZmYgbWFya2VycworICAgICAgICBzZWxmLm1heERpZmYgPSBOb25lCisKKyAgICAgICAgIyBzZXQgYSBsb3dlciB0aHJlc2hvbGQgdmFsdWUgYW5kIGFkZCBhIGNsZWFudXAgdG8gcmVzdG9yZSBpdAorICAgICAgICBvbGRfdGhyZXNob2xkID0gc2VsZi5fZGlmZlRocmVzaG9sZAorICAgICAgICBzZWxmLl9kaWZmVGhyZXNob2xkID0gMioqOAorICAgICAgICBzZWxmLmFkZENsZWFudXAobGFtYmRhOiBzZXRhdHRyKHNlbGYsICdfZGlmZlRocmVzaG9sZCcsIG9sZF90aHJlc2hvbGQpKQorCisgICAgICAgICMgdW5kZXIgdGhlIHRocmVzaG9sZDogZGlmZiBtYXJrZXIgKF4pIGluIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgcyA9IHUneCcgKiAoMioqNykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24pIGFzIGNtOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzICsgJ2EnLCBzICsgJ2InKQorICAgICAgICBzZWxmLmFzc2VydEluKCdeJywgc3RyKGNtLmV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocyArICdhJywgcyArICdhJykKKworICAgICAgICAjIG92ZXIgdGhlIHRocmVzaG9sZDogZGlmZiBub3QgdXNlZCBhbmQgbWFya2VyICheKSBub3QgaW4gZXJyb3IgbWVzc2FnZQorICAgICAgICBzID0gdSd4JyAqICgyKio5KQorICAgICAgICAjIGlmIHRoZSBwYXRoIHRoYXQgdXNlcyBkaWZmbGliIGlzIHRha2VuLCBfdHJ1bmNhdGVNZXNzYWdlIHdpbGwgYmUKKyAgICAgICAgIyBjYWxsZWQgLS0gcmVwbGFjZSBpdCB3aXRoIGV4cGxvZGluZ1RydW5jYXRpb24gdG8gdmVyaWZ5IHRoYXQgdGhpcworICAgICAgICAjIGRvZXNuJ3QgaGFwcGVuCisgICAgICAgIGRlZiBleHBsb2RpbmdUcnVuY2F0aW9uKG1lc3NhZ2UsIGRpZmYpOgorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoJ3RoaXMgc2hvdWxkIG5vdCBiZSByYWlzZWQnKQorICAgICAgICBvbGRfdHJ1bmNhdGUgPSBzZWxmLl90cnVuY2F0ZU1lc3NhZ2UKKyAgICAgICAgc2VsZi5fdHJ1bmNhdGVNZXNzYWdlID0gZXhwbG9kaW5nVHJ1bmNhdGlvbgorICAgICAgICBzZWxmLmFkZENsZWFudXAobGFtYmRhOiBzZXRhdHRyKHNlbGYsICdfdHJ1bmNhdGVNZXNzYWdlJywgb2xkX3RydW5jYXRlKSkKKworICAgICAgICBzMSwgczIgPSBzICsgJ2EnLCBzICsgJ2InCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uKSBhcyBjbToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczEsIHMyKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdeJywgc3RyKGNtLmV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNtLmV4Y2VwdGlvbiksICclciAhPSAlcicgJSAoczEsIHMyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzICsgJ2EnLCBzICsgJ2EnKQorCisgICAgZGVmIHRlc3RBc3NlcnRJdGVtc0VxdWFsKHNlbGYpOgorICAgICAgICBhID0gb2JqZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKFsxLCAyLCAzXSwgWzMsIDIsIDFdKQorICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwoWydmb28nLCAnYmFyJywgJ2JheiddLCBbJ2JhcicsICdiYXonLCAnZm9vJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChbYSwgYSwgMiwgMiwgM10sIChhLCAyLCAzLCBhLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKFsxLCAiMiIsICJhIiwgImEiXSwgWyJhIiwgIjIiLCBUcnVlLCAiYSJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWzEsIDJdICsgWzNdICogMTAwLCBbMV0gKiAxMDAgKyBbMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJdGVtc0VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbMSwgIjIiLCAiYSIsICJhIl0sIFsiYSIsICIyIiwgVHJ1ZSwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJdGVtc0VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbMTBdLCBbMTAsIDExXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEl0ZW1zRXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMCwgMTFdLCBbMTBdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWzEwLCAxMSwgMTBdLCBbMTAsIDExXSkKKworICAgICAgICAjIFRlc3QgdGhhdCBzZXF1ZW5jZXMgb2YgdW5oYXNoYWJsZSBvYmplY3RzIGNhbiBiZSB0ZXN0ZWQgZm9yIHNhbWVuZXNzOgorICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwoW1sxLCAyXSwgWzMsIDRdLCAwXSwgW0ZhbHNlLCBbMywgNF0sIFsxLCAyXV0pCisgICAgICAgICMgVGVzdCB0aGF0IGl0ZXJhdG9yIG9mIHVuaGFzaGFibGUgb2JqZWN0cyBjYW4gYmUgdGVzdGVkIGZvciBzYW1lbmVzczoKKyAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKGl0ZXIoWzEsIDIsIFtdLCAzLCA0XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyKFsxLCAyLCBbXSwgMywgNF0pKQorCisgICAgICAgICMgaGFzaGFibGUgdHlwZXMsIGJ1dCBub3Qgb3JkZXJhYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJdGVtc0VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2Rpdm1vZCwgJ3gnLCAxLCA1aiwgMmosIGZyb3plbnNldCgpXSkKKyAgICAgICAgIyBjb21wYXJpbmcgZGljdHMKKyAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKFt7J2EnOiAxfSwgeydiJzogMn1dLCBbeydiJzogMn0sIHsnYSc6IDF9XSkKKyAgICAgICAgIyBjb21wYXJpbmcgaGV0ZXJvZ2Vub3VzIG5vbi1oYXNoYWJsZSBzZXF1ZW5jZXMKKyAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKFsxLCAneCcsIGRpdm1vZCwgW11dLCBbZGl2bW9kLCBbXSwgJ3gnLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEl0ZW1zRXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCBbZGl2bW9kLCBbXSwgJ3gnLCAxLCA1aiwgMmosIHNldCgpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEl0ZW1zRXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtbMV1dLCBbWzJdXSkKKworICAgICAgICAjIFNhbWUgZWxlbWVudHMsIGJ1dCBub3Qgc2FtZSBzZXF1ZW5jZSBsZW5ndGgKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEl0ZW1zRXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsxLCAxLCAyXSwgWzIsIDFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWzEsIDEsICIyIiwgImEiLCAiYSJdLCBbIjIiLCAiMiIsIFRydWUsICJhIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJdGVtc0VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbMSwgeydiJzogMn0sIE5vbmUsIFRydWVdLCBbeydiJzogMn0sIFRydWUsIE5vbmVdKQorCisgICAgICAgICMgU2FtZSBlbGVtZW50cyB3aGljaCBkb24ndCByZWxpYWJseSBjb21wYXJlLCBpbgorICAgICAgICAjIGRpZmZlcmVudCBvcmRlciwgc2VlIGlzc3VlIDEwMjQyCisgICAgICAgIGEgPSBbezIsNH0sIHsxLDJ9XQorICAgICAgICBiID0gYVs6Oi0xXQorICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwoYSwgYikKKworICAgICAgICAjIHRlc3QgdXRpbGl0eSBmdW5jdGlvbnMgc3VwcG9ydGluZyBhc3NlcnRJdGVtc0VxdWFsKCkKKworICAgICAgICBkaWZmcyA9IHNldCh1bml0dGVzdC51dGlsLl9jb3VudF9kaWZmX2FsbF9wdXJwb3NlKCdhYWFiY2NkJywgJ2FiYmJjY2UnKSkKKyAgICAgICAgZXhwZWN0ZWQgPSB7KDMsMSwnYScpLCAoMSwzLCdiJyksICgxLDAsJ2QnKSwgKDAsMSwnZScpfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpZmZzLCBleHBlY3RlZCkKKworICAgICAgICBkaWZmcyA9IHVuaXR0ZXN0LnV0aWwuX2NvdW50X2RpZmZfYWxsX3B1cnBvc2UoW1tdXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlmZnMsIFsoMSwgMCwgW10pXSkKKworICAgICAgICBkaWZmcyA9IHNldCh1bml0dGVzdC51dGlsLl9jb3VudF9kaWZmX2hhc2hhYmxlKCdhYWFiY2NkJywgJ2FiYmJjY2UnKSkKKyAgICAgICAgZXhwZWN0ZWQgPSB7KDMsMSwnYScpLCAoMSwzLCdiJyksICgxLDAsJ2QnKSwgKDAsMSwnZScpfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpZmZzLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0QXNzZXJ0U2V0RXF1YWwoc2VsZik6CisgICAgICAgIHNldDEgPSBzZXQoKQorICAgICAgICBzZXQyID0gc2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChzZXQxLCBzZXQyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRTZXRFcXVhbCwgTm9uZSwgc2V0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydFNldEVxdWFsLCBbXSwgc2V0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydFNldEVxdWFsLCBzZXQxLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0U2V0RXF1YWwsIHNldDEsIFtdKQorCisgICAgICAgIHNldDEgPSBzZXQoWydhJ10pCisgICAgICAgIHNldDIgPSBzZXQoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0U2V0RXF1YWwsIHNldDEsIHNldDIpCisKKyAgICAgICAgc2V0MSA9IHNldChbJ2EnXSkKKyAgICAgICAgc2V0MiA9IHNldChbJ2EnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChzZXQxLCBzZXQyKQorCisgICAgICAgIHNldDEgPSBzZXQoWydhJ10pCisgICAgICAgIHNldDIgPSBzZXQoWydhJywgJ2InXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydFNldEVxdWFsLCBzZXQxLCBzZXQyKQorCisgICAgICAgIHNldDEgPSBzZXQoWydhJ10pCisgICAgICAgIHNldDIgPSBmcm96ZW5zZXQoWydhJywgJ2InXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydFNldEVxdWFsLCBzZXQxLCBzZXQyKQorCisgICAgICAgIHNldDEgPSBzZXQoWydhJywgJ2InXSkKKyAgICAgICAgc2V0MiA9IGZyb3plbnNldChbJ2EnLCAnYiddKQorICAgICAgICBzZWxmLmFzc2VydFNldEVxdWFsKHNldDEsIHNldDIpCisKKyAgICAgICAgc2V0MSA9IHNldCgpCisgICAgICAgIHNldDIgPSAiZm9vIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0U2V0RXF1YWwsIHNldDEsIHNldDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRTZXRFcXVhbCwgc2V0Miwgc2V0MSkKKworICAgICAgICAjIG1ha2Ugc3VyZSBhbnkgc3RyaW5nIGZvcm1hdHRpbmcgaXMgdHVwbGUtc2FmZQorICAgICAgICBzZXQxID0gc2V0KFsoMCwgMSksICgyLCAzKV0pCisgICAgICAgIHNldDIgPSBzZXQoWyg0LCA1KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRTZXRFcXVhbCwgc2V0MSwgc2V0MikKKworICAgIGRlZiB0ZXN0SW5lcXVhbGl0eShzZWxmKToKKyAgICAgICAgIyBUcnkgaW50cworICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoMiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoMiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoMSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRHcmVhdGVyLCAxLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlciwgMSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCwgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExlc3MsIDIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzLCAxLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGVzc0VxdWFsLCAyLCAxKQorCisgICAgICAgICMgVHJ5IEZsb2F0cworICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoMS4xLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKDEuMSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCgxLjAsIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKDEuMCwgMS4xKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgxLjAsIDEuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoMS4wLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRHcmVhdGVyLCAxLjAsIDEuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXIsIDEuMCwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsLCAxLjAsIDEuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExlc3MsIDEuMSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGVzcywgMS4wLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzRXF1YWwsIDEuMSwgMS4wKQorCisgICAgICAgICMgVHJ5IFN0cmluZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKCdidWcnLCAnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoJ2J1ZycsICdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCgnYW50JywgJ2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcygnYW50JywgJ2J1ZycpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKCdhbnQnLCAnYnVnJykKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoJ2FudCcsICdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlciwgJ2FudCcsICdidWcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlciwgJ2FudCcsICdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsLCAnYW50JywgJ2J1ZycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzLCAnYnVnJywgJ2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzLCAnYW50JywgJ2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzRXF1YWwsICdidWcnLCAnYW50JykKKworICAgICAgICAjIFRyeSBVbmljb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcih1J2J1ZycsIHUnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwodSdidWcnLCB1J2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKHUnYW50JywgdSdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydExlc3ModSdhbnQnLCB1J2J1ZycpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHUnYW50JywgdSdidWcnKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCh1J2FudCcsIHUnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXIsIHUnYW50JywgdSdidWcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlciwgdSdhbnQnLCB1J2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwsIHUnYW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdSdidWcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGVzcywgdSdidWcnLCB1J2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzLCB1J2FudCcsIHUnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExlc3NFcXVhbCwgdSdidWcnLCB1J2FudCcpCisKKyAgICAgICAgIyBUcnkgTWl4ZWQgU3RyaW5nL1VuaWNvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKCdidWcnLCB1J2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcih1J2J1ZycsICdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCgnYnVnJywgdSdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCh1J2J1ZycsICdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCgnYW50JywgdSdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCh1J2FudCcsICdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydExlc3MoJ2FudCcsIHUnYnVnJykKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKHUnYW50JywgJ2J1ZycpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKCdhbnQnLCB1J2J1ZycpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHUnYW50JywgJ2J1ZycpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKCdhbnQnLCB1J2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHUnYW50JywgJ2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRHcmVhdGVyLCAnYW50JywgdSdidWcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlciwgdSdhbnQnLCAnYnVnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXIsICdhbnQnLCB1J2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRHcmVhdGVyLCB1J2FudCcsICdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsLCAnYW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdSdidWcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsLCB1J2FudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdidWcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGVzcywgJ2J1ZycsIHUnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExlc3MsIHUnYnVnJywgJ2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzLCAnYW50JywgdSdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGVzcywgdSdhbnQnLCAnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExlc3NFcXVhbCwgJ2J1ZycsIHUnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExlc3NFcXVhbCwgdSdidWcnLCAnYW50JykKKworICAgIGRlZiB0ZXN0QXNzZXJ0TXVsdGlMaW5lRXF1YWwoc2VsZik6CisgICAgICAgIHNhbXBsZV90ZXh0ID0gYiIiIlwKK2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvMi4zL2xpYi9tb2R1bGUtdW5pdHRlc3QuaHRtbAordGVzdCBjYXNlCisgICAgQSB0ZXN0IGNhc2UgaXMgdGhlIHNtYWxsZXN0IHVuaXQgb2YgdGVzdGluZy4gWy4uLl0KKyIiIgorICAgICAgICByZXZpc2VkX3NhbXBsZV90ZXh0ID0gYiIiIlwKK2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvMi40LjEvbGliL21vZHVsZS11bml0dGVzdC5odG1sCit0ZXN0IGNhc2UKKyAgICBBIHRlc3QgY2FzZSBpcyB0aGUgc21hbGxlc3QgdW5pdCBvZiB0ZXN0aW5nLiBbLi4uXSBZb3UgbWF5IHByb3ZpZGUgeW91cgorICAgIG93biBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90IHN1YmNsYXNzIGZyb20gVGVzdENhc2UsIG9mIGNvdXJzZS4KKyIiIgorICAgICAgICBzYW1wbGVfdGV4dF9lcnJvciA9IGIiIiJcCistIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvMi4zL2xpYi9tb2R1bGUtdW5pdHRlc3QuaHRtbAorPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorKyBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzIuNC4xL2xpYi9tb2R1bGUtdW5pdHRlc3QuaHRtbAorPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eCisgIHRlc3QgY2FzZQorLSAgICAgQSB0ZXN0IGNhc2UgaXMgdGhlIHNtYWxsZXN0IHVuaXQgb2YgdGVzdGluZy4gWy4uLl0KKysgICAgIEEgdGVzdCBjYXNlIGlzIHRoZSBzbWFsbGVzdCB1bml0IG9mIHRlc3RpbmcuIFsuLi5dIFlvdSBtYXkgcHJvdmlkZSB5b3VyCis/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrKysrKysrKysrKysrKysrKysrKworKyAgICAgb3duIGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3Qgc3ViY2xhc3MgZnJvbSBUZXN0Q2FzZSwgb2YgY291cnNlLgorIiIiCisgICAgICAgIHNlbGYubWF4RGlmZiA9IE5vbmUKKyAgICAgICAgZm9yIHR5cGVfY2hhbmdlciBpbiAobGFtYmRhIHg6IHgsIGxhbWJkYSB4OiB4LmRlY29kZSgndXRmOCcpKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE11bHRpTGluZUVxdWFsKHR5cGVfY2hhbmdlcihzYW1wbGVfdGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX2NoYW5nZXIocmV2aXNlZF9zYW1wbGVfdGV4dCkpCisgICAgICAgICAgICBleGNlcHQgc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgICMgbmVlZCB0byByZW1vdmUgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICBlcnJvciA9IHN0cihlKS5lbmNvZGUoJ3V0ZjgnKS5zcGxpdCgnXG4nLCAxKVsxXQorCisgICAgICAgICAgICAgICAgIyBhc3NlcnRNdWx0aUxpbmVFcXVhbCBpcyBob29rZWQgdXAgYXMgdGhlIGRlZmF1bHQgZm9yCisgICAgICAgICAgICAgICAgIyB1bmljb2RlIHN0cmluZ3MgLSBzbyB3ZSBjYW4ndCB1c2UgaXQgZm9yIHRoaXMgY2hlY2sKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2FtcGxlX3RleHRfZXJyb3IgPT0gZXJyb3IpCisKKyAgICBkZWYgdGVzdEFzZXJ0RXF1YWxTaW5nbGVMaW5lKHNlbGYpOgorICAgICAgICBzYW1wbGVfdGV4dCA9IHUibGFkZW4gc3dhbGxvd3MgZmx5IHNsb3dseSIKKyAgICAgICAgcmV2aXNlZF9zYW1wbGVfdGV4dCA9IHUidW5sYWRlbiBzd2FsbG93cyBmbHkgcXVpY2tseSIKKyAgICAgICAgc2FtcGxlX3RleHRfZXJyb3IgPSAiIiJcCistIGxhZGVuIHN3YWxsb3dzIGZseSBzbG93bHkKKz8gICAgICAgICAgICAgICAgICAgIF5eXl4KKysgdW5sYWRlbiBzd2FsbG93cyBmbHkgcXVpY2tseQorPyArKyAgICAgICAgICAgICAgICAgICBeXl5eXgorIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FtcGxlX3RleHQsIHJldmlzZWRfc2FtcGxlX3RleHQpCisgICAgICAgIGV4Y2VwdCBzZWxmLmZhaWx1cmVFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIGVycm9yID0gc3RyKGUpLnNwbGl0KCdcbicsIDEpWzFdCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2FtcGxlX3RleHRfZXJyb3IgPT0gZXJyb3IpCisKKyAgICBkZWYgdGVzdEFzc2VydElzTm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydElzTm9uZSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKCdEalpvUGxvR2VhcnMgb24gUmFpbHMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0SXNOb3ROb25lLCBOb25lKQorCisgICAgZGVmIHRlc3RBc3NlcnRSZWdleHBNYXRjaGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMoJ2FzZGZhYmFzZGYnLCByJ2FiKycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnc2FhYXMnLCByJ2FhYWEnKQorCisgICAgZGVmIHRlc3RBc3NlcnRSYWlzZXNSZWdleHAoc2VsZik6CisgICAgICAgIGNsYXNzIEV4Y2VwdGlvbk1vY2soRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgU3R1YigpOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uTW9jaygnV2UgZXhwZWN0JykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChFeGNlcHRpb25Nb2NrLCByZS5jb21waWxlKCdleHBlY3QkJyksIFN0dWIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKEV4Y2VwdGlvbk1vY2ssICdleHBlY3QkJywgU3R1YikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoRXhjZXB0aW9uTW9jaywgdSdleHBlY3QkJywgU3R1YikKKworICAgIGRlZiB0ZXN0QXNzZXJ0Tm90UmFpc2VzUmVnZXhwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWx1cmVFeGNlcHRpb24sICdeRXhjZXB0aW9uIG5vdCByYWlzZWQkJywKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCwgRXhjZXB0aW9uLCByZS5jb21waWxlKCd4JyksCisgICAgICAgICAgICAgICAgbGFtYmRhOiBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWx1cmVFeGNlcHRpb24sICdeRXhjZXB0aW9uIG5vdCByYWlzZWQkJywKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCwgRXhjZXB0aW9uLCAneCcsCisgICAgICAgICAgICAgICAgbGFtYmRhOiBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWx1cmVFeGNlcHRpb24sICdeRXhjZXB0aW9uIG5vdCByYWlzZWQkJywKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCwgRXhjZXB0aW9uLCB1J3gnLAorICAgICAgICAgICAgICAgIGxhbWJkYTogTm9uZSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0UmFpc2VzUmVnZXhwTWlzbWF0Y2goc2VsZik6CisgICAgICAgIGRlZiBTdHViKCk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ1VuZXhwZWN0ZWQnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAorICAgICAgICAgICAgICAgIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICByJyJcXkV4cGVjdGVkXCQiIGRvZXMgbm90IG1hdGNoICJVbmV4cGVjdGVkIicsCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAsIEV4Y2VwdGlvbiwgJ15FeHBlY3RlZCQnLAorICAgICAgICAgICAgICAgIFN0dWIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAorICAgICAgICAgICAgICAgIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICByJyJcXkV4cGVjdGVkXCQiIGRvZXMgbm90IG1hdGNoICJVbmV4cGVjdGVkIicsCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAsIEV4Y2VwdGlvbiwgdSdeRXhwZWN0ZWQkJywKKyAgICAgICAgICAgICAgICBTdHViKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWx1cmVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgciciXF5FeHBlY3RlZFwkIiBkb2VzIG5vdCBtYXRjaCAiVW5leHBlY3RlZCInLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwLCBFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgcmUuY29tcGlsZSgnXkV4cGVjdGVkJCcpLCBTdHViKQorCisgICAgZGVmIHRlc3RBc3NlcnRSYWlzZXNFeGNWYWx1ZShzZWxmKToKKyAgICAgICAgY2xhc3MgRXhjZXB0aW9uTW9jayhFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBTdHViKGZvbyk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb25Nb2NrKGZvbykKKyAgICAgICAgdiA9ICJwYXJ0aWN1bGFyIHZhbHVlIgorCisgICAgICAgIGN0eCA9IHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbk1vY2spCisgICAgICAgIHdpdGggY3R4OgorICAgICAgICAgICAgU3R1Yih2KQorICAgICAgICBlID0gY3R4LmV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZSwgRXhjZXB0aW9uTW9jaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sIHYpCisKKyAgICBkZWYgdGVzdFN5bm9ueW1Bc3NlcnRNZXRob2ROYW1lcyhzZWxmKToKKyAgICAgICAgIiIiVGVzdCB1bmRvY3VtZW50ZWQgbWV0aG9kIG5hbWUgc3lub255bXMuCisKKyAgICAgICAgUGxlYXNlIGRvIG5vdCB1c2UgdGhlc2UgbWV0aG9kcyBuYW1lcyBpbiB5b3VyIG93biBjb2RlLgorCisgICAgICAgIFRoaXMgdGVzdCBjb25maXJtcyB0aGVpciBjb250aW51ZWQgZXhpc3RlbmNlIGFuZCBmdW5jdGlvbmFsaXR5CisgICAgICAgIGluIG9yZGVyIHRvIGF2b2lkIGJyZWFraW5nIGV4aXN0aW5nIGNvZGUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFscygzLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygzLCAzKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFscygyLjAsIDIuMCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RBbG1vc3RFcXVhbHMoMy4wLCA1LjApCisgICAgICAgIHNlbGYuYXNzZXJ0XyhUcnVlKQorCisgICAgZGVmIHRlc3RQZW5kaW5nRGVwcmVjYXRpb25NZXRob2ROYW1lcyhzZWxmKToKKyAgICAgICAgIiIiVGVzdCBmYWlsKiBtZXRob2RzIHBlbmRpbmcgZGVwcmVjYXRpb24sIHRoZXkgd2lsbCB3YXJuIGluIDMuMi4KKworICAgICAgICBEbyBub3QgdXNlIHRoZXNlIG1ldGhvZHMuICBUaGV5IHdpbGwgZ28gYXdheSBpbiAzLjMuCisgICAgICAgICIiIgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5mYWlsSWZFcXVhbCgzLCA1KQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMywgMykKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0FsbW9zdEVxdWFsKDIuMCwgMi4wKQorICAgICAgICAgICAgc2VsZi5mYWlsSWZBbG1vc3RFcXVhbCgzLjAsIDUuMCkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhUcnVlKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhIF86IDMuMTQgKyB1J3NwYW0nKQorICAgICAgICAgICAgc2VsZi5mYWlsSWYoRmFsc2UpCisKKyAgICBkZWYgdGVzdERlZXBjb3B5KHNlbGYpOgorICAgICAgICAjIElzc3VlOiA1NjYwCisgICAgICAgIGNsYXNzIFRlc3RhYmxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdE5vdGhpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRlc3QgPSBUZXN0YWJsZVRlc3QoJ3Rlc3ROb3RoaW5nJykKKworICAgICAgICAjIFRoaXMgc2hvdWxkbid0IGJsb3cgdXAKKyAgICAgICAgZGVlcGNvcHkodGVzdCkKKworICAgIGRlZiB0ZXN0S2V5Ym9hcmRJbnRlcnJ1cHQoc2VsZik6CisgICAgICAgIGRlZiBfcmFpc2Uoc2VsZj1Ob25lKToKKyAgICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgICAgIGRlZiBub3RoaW5nKHNlbGYpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIFRlc3QxKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHRlc3Rfc29tZXRoaW5nID0gX3JhaXNlCisKKyAgICAgICAgY2xhc3MgVGVzdDIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgc2V0VXAgPSBfcmFpc2UKKyAgICAgICAgICAgIHRlc3Rfc29tZXRoaW5nID0gbm90aGluZworCisgICAgICAgIGNsYXNzIFRlc3QzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHRlc3Rfc29tZXRoaW5nID0gbm90aGluZworICAgICAgICAgICAgdGVhckRvd24gPSBfcmFpc2UKKworICAgICAgICBjbGFzcyBUZXN0NCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF9zb21ldGhpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKF9yYWlzZSkKKworICAgICAgICBmb3Iga2xhc3MgaW4gKFRlc3QxLCBUZXN0MiwgVGVzdDMsIFRlc3Q0KToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5Ym9hcmRJbnRlcnJ1cHQpOgorICAgICAgICAgICAgICAgIGtsYXNzKCd0ZXN0X3NvbWV0aGluZycpLnJ1bigpCisKKyAgICBkZWYgdGVzdFN5c3RlbUV4aXQoc2VsZik6CisgICAgICAgIGRlZiBfcmFpc2Uoc2VsZj1Ob25lKToKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQKKyAgICAgICAgZGVmIG5vdGhpbmcoc2VsZik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgVGVzdDEodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgdGVzdF9zb21ldGhpbmcgPSBfcmFpc2UKKworICAgICAgICBjbGFzcyBUZXN0Mih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBzZXRVcCA9IF9yYWlzZQorICAgICAgICAgICAgdGVzdF9zb21ldGhpbmcgPSBub3RoaW5nCisKKyAgICAgICAgY2xhc3MgVGVzdDModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgdGVzdF9zb21ldGhpbmcgPSBub3RoaW5nCisgICAgICAgICAgICB0ZWFyRG93biA9IF9yYWlzZQorCisgICAgICAgIGNsYXNzIFRlc3Q0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X3NvbWV0aGluZyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAoX3JhaXNlKQorCisgICAgICAgIGZvciBrbGFzcyBpbiAoVGVzdDEsIFRlc3QyLCBUZXN0MywgVGVzdDQpOgorICAgICAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgICAgICBrbGFzcygndGVzdF9zb21ldGhpbmcnKS5ydW4ocmVzdWx0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMSkKKworICAgIGRlZiB0ZXN0UGlja2xlKHNlbGYpOgorICAgICAgICAjIElzc3VlIDEwMzI2CisKKyAgICAgICAgIyBDYW4ndCB1c2UgVGVzdENhc2UgY2xhc3NlcyBkZWZpbmVkIGluIFRlc3QgY2xhc3MgYXMKKyAgICAgICAgIyBwaWNrbGUgZG9lcyBub3Qgd29yayB3aXRoIGlubmVyIGNsYXNzZXMKKyAgICAgICAgdGVzdCA9IHVuaXR0ZXN0LlRlc3RDYXNlKCdydW4nKQorICAgICAgICBmb3IgcHJvdG9jb2wgaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKworICAgICAgICAgICAgIyBibGV3IHVwIHByaW9yIHRvIGZpeAorICAgICAgICAgICAgcGlja2xlZF90ZXN0ID0gcGlja2xlLmR1bXBzKHRlc3QsIHByb3RvY29sPXByb3RvY29sKQorCisgICAgICAgICAgICB1bnBpY2tsZWRfdGVzdCA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkX3Rlc3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3QsIHVucGlja2xlZF90ZXN0KQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9jYXNlLnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Nhc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODMyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9jYXNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9jYXNlLnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Nhc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODMyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9jYXNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9kaXNjb3ZlcnkucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9kaXNjb3ZlcnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwMzFhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Rpc2NvdmVyeS5weQpAQCAtMCwwICsxLDM3NiBAQAoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworaW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdERpc2NvdmVyeSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIEhlYXZpbHkgbW9ja2VkIHRlc3RzIHNvIEkgY2FuIGF2b2lkIGhpdHRpbmcgdGhlIGZpbGVzeXN0ZW0KKyAgICBkZWYgdGVzdF9nZXRfbmFtZV9mcm9tX3BhdGgoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIGxvYWRlci5fdG9wX2xldmVsX2RpciA9ICcvZm9vJworICAgICAgICBuYW1lID0gbG9hZGVyLl9nZXRfbmFtZV9mcm9tX3BhdGgoJy9mb28vYmFyL2Jhei5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZSwgJ2Jhci5iYXonKQorCisgICAgICAgIGlmIG5vdCBfX2RlYnVnX186CisgICAgICAgICAgICAjIGFzc2VydHMgYXJlIG9mZgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvcik6CisgICAgICAgICAgICBsb2FkZXIuX2dldF9uYW1lX2Zyb21fcGF0aCgnL2Jhci9iYXoucHknKQorCisgICAgZGVmIHRlc3RfZmluZF90ZXN0cyhzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgb3JpZ2luYWxfbGlzdGRpciA9IG9zLmxpc3RkaXIKKyAgICAgICAgZGVmIHJlc3RvcmVfbGlzdGRpcigpOgorICAgICAgICAgICAgb3MubGlzdGRpciA9IG9yaWdpbmFsX2xpc3RkaXIKKyAgICAgICAgb3JpZ2luYWxfaXNmaWxlID0gb3MucGF0aC5pc2ZpbGUKKyAgICAgICAgZGVmIHJlc3RvcmVfaXNmaWxlKCk6CisgICAgICAgICAgICBvcy5wYXRoLmlzZmlsZSA9IG9yaWdpbmFsX2lzZmlsZQorICAgICAgICBvcmlnaW5hbF9pc2RpciA9IG9zLnBhdGguaXNkaXIKKyAgICAgICAgZGVmIHJlc3RvcmVfaXNkaXIoKToKKyAgICAgICAgICAgIG9zLnBhdGguaXNkaXIgPSBvcmlnaW5hbF9pc2RpcgorCisgICAgICAgIHBhdGhfbGlzdHMgPSBbWyd0ZXN0MS5weScsICd0ZXN0Mi5weScsICdub3RfYV90ZXN0LnB5JywgJ3Rlc3RfZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QuZm9vJywgJ3Rlc3Qtbm90LWEtbW9kdWxlLnB5JywgJ2Fub3RoZXJfZGlyJ10sCisgICAgICAgICAgICAgICAgICAgICAgWyd0ZXN0My5weScsICd0ZXN0NC5weScsIF1dCisgICAgICAgIG9zLmxpc3RkaXIgPSBsYW1iZGEgcGF0aDogcGF0aF9saXN0cy5wb3AoMCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVfbGlzdGRpcikKKworICAgICAgICBkZWYgaXNkaXIocGF0aCk6CisgICAgICAgICAgICByZXR1cm4gcGF0aC5lbmRzd2l0aCgnZGlyJykKKyAgICAgICAgb3MucGF0aC5pc2RpciA9IGlzZGlyCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChyZXN0b3JlX2lzZGlyKQorCisgICAgICAgIGRlZiBpc2ZpbGUocGF0aCk6CisgICAgICAgICAgICAjIGFub3RoZXJfZGlyIGlzIG5vdCBhIHBhY2thZ2UgYW5kIHNvIHNob3VsZG4ndCBiZSByZWN1cnNlZCBpbnRvCisgICAgICAgICAgICByZXR1cm4gbm90IHBhdGguZW5kc3dpdGgoJ2RpcicpIGFuZCBub3QgJ2Fub3RoZXJfZGlyJyBpbiBwYXRoCisgICAgICAgIG9zLnBhdGguaXNmaWxlID0gaXNmaWxlCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChyZXN0b3JlX2lzZmlsZSkKKworICAgICAgICBsb2FkZXIuX2dldF9tb2R1bGVfZnJvbV9uYW1lID0gbGFtYmRhIHBhdGg6IHBhdGggKyAnIG1vZHVsZScKKyAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUgPSBsYW1iZGEgbW9kdWxlOiBtb2R1bGUgKyAnIHRlc3RzJworCisgICAgICAgIHRvcF9sZXZlbCA9IG9zLnBhdGguYWJzcGF0aCgnL2ZvbycpCisgICAgICAgIGxvYWRlci5fdG9wX2xldmVsX2RpciA9IHRvcF9sZXZlbAorICAgICAgICBzdWl0ZSA9IGxpc3QobG9hZGVyLl9maW5kX3Rlc3RzKHRvcF9sZXZlbCwgJ3Rlc3QqLnB5JykpCisKKyAgICAgICAgZXhwZWN0ZWQgPSBbbmFtZSArICcgbW9kdWxlIHRlc3RzJyBmb3IgbmFtZSBpbgorICAgICAgICAgICAgICAgICAgICAoJ3Rlc3QxJywgJ3Rlc3QyJyldCisgICAgICAgIGV4cGVjdGVkLmV4dGVuZChbKCd0ZXN0X2Rpci4lcycgJSBuYW1lKSArICcgbW9kdWxlIHRlc3RzJyBmb3IgbmFtZSBpbgorICAgICAgICAgICAgICAgICAgICAoJ3Rlc3QzJywgJ3Rlc3Q0JyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2ZpbmRfdGVzdHNfd2l0aF9wYWNrYWdlKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICBvcmlnaW5hbF9saXN0ZGlyID0gb3MubGlzdGRpcgorICAgICAgICBkZWYgcmVzdG9yZV9saXN0ZGlyKCk6CisgICAgICAgICAgICBvcy5saXN0ZGlyID0gb3JpZ2luYWxfbGlzdGRpcgorICAgICAgICBvcmlnaW5hbF9pc2ZpbGUgPSBvcy5wYXRoLmlzZmlsZQorICAgICAgICBkZWYgcmVzdG9yZV9pc2ZpbGUoKToKKyAgICAgICAgICAgIG9zLnBhdGguaXNmaWxlID0gb3JpZ2luYWxfaXNmaWxlCisgICAgICAgIG9yaWdpbmFsX2lzZGlyID0gb3MucGF0aC5pc2RpcgorICAgICAgICBkZWYgcmVzdG9yZV9pc2RpcigpOgorICAgICAgICAgICAgb3MucGF0aC5pc2RpciA9IG9yaWdpbmFsX2lzZGlyCisKKyAgICAgICAgZGlyZWN0b3JpZXMgPSBbJ2FfZGlyZWN0b3J5JywgJ3Rlc3RfZGlyZWN0b3J5JywgJ3Rlc3RfZGlyZWN0b3J5MiddCisgICAgICAgIHBhdGhfbGlzdHMgPSBbZGlyZWN0b3JpZXMsIFtdLCBbXSwgW11dCisgICAgICAgIG9zLmxpc3RkaXIgPSBsYW1iZGEgcGF0aDogcGF0aF9saXN0cy5wb3AoMCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVfbGlzdGRpcikKKworICAgICAgICBvcy5wYXRoLmlzZGlyID0gbGFtYmRhIHBhdGg6IFRydWUKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVfaXNkaXIpCisKKyAgICAgICAgb3MucGF0aC5pc2ZpbGUgPSBsYW1iZGEgcGF0aDogb3MucGF0aC5iYXNlbmFtZShwYXRoKSBub3QgaW4gZGlyZWN0b3JpZXMKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVfaXNmaWxlKQorCisgICAgICAgIGNsYXNzIE1vZHVsZShvYmplY3QpOgorICAgICAgICAgICAgcGF0aHMgPSBbXQorICAgICAgICAgICAgbG9hZF90ZXN0c19hcmdzID0gW10KKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgorICAgICAgICAgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgICAgICAgICBzZWxmLnBhdGhzLmFwcGVuZChwYXRoKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguYmFzZW5hbWUocGF0aCkgPT0gJ3Rlc3RfZGlyZWN0b3J5JzoKKyAgICAgICAgICAgICAgICAgICAgZGVmIGxvYWRfdGVzdHMobG9hZGVyLCB0ZXN0cywgcGF0dGVybik6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRfdGVzdHNfYXJncy5hcHBlbmQoKGxvYWRlciwgdGVzdHMsIHBhdHRlcm4pKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdsb2FkX3Rlc3RzJworICAgICAgICAgICAgICAgICAgICBzZWxmLmxvYWRfdGVzdHMgPSBsb2FkX3Rlc3RzCisKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhdGggPT0gb3RoZXIucGF0aAorCisgICAgICAgICAgICAjIFNpbGVuY2UgcHkzayB3YXJuaW5nCisgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUKKworICAgICAgICBsb2FkZXIuX2dldF9tb2R1bGVfZnJvbV9uYW1lID0gbGFtYmRhIG5hbWU6IE1vZHVsZShuYW1lKQorICAgICAgICBkZWYgbG9hZFRlc3RzRnJvbU1vZHVsZShtb2R1bGUsIHVzZV9sb2FkX3Rlc3RzKToKKyAgICAgICAgICAgIGlmIHVzZV9sb2FkX3Rlc3RzOgorICAgICAgICAgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbigndXNlX2xvYWRfdGVzdHMgc2hvdWxkIGJlIEZhbHNlIGZvciBwYWNrYWdlcycpCisgICAgICAgICAgICByZXR1cm4gbW9kdWxlLnBhdGggKyAnIG1vZHVsZSB0ZXN0cycKKyAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUgPSBsb2FkVGVzdHNGcm9tTW9kdWxlCisKKyAgICAgICAgbG9hZGVyLl90b3BfbGV2ZWxfZGlyID0gJy9mb28nCisgICAgICAgICMgdGhpcyB0aW1lIG5vICcucHknIG9uIHRoZSBwYXR0ZXJuIHNvIHRoYXQgaXQgY2FuIG1hdGNoCisgICAgICAgICMgYSB0ZXN0IHBhY2thZ2UKKyAgICAgICAgc3VpdGUgPSBsaXN0KGxvYWRlci5fZmluZF90ZXN0cygnL2ZvbycsICd0ZXN0KicpKQorCisgICAgICAgICMgV2Ugc2hvdWxkIGhhdmUgbG9hZGVkIHRlc3RzIGZyb20gdGhlIHRlc3RfZGlyZWN0b3J5IHBhY2thZ2UgYnkgY2FsbGluZyBsb2FkX3Rlc3RzCisgICAgICAgICMgYW5kIGRpcmVjdGx5IGZyb20gdGhlIHRlc3RfZGlyZWN0b3J5MiBwYWNrYWdlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgWydsb2FkX3Rlc3RzJywgJ3Rlc3RfZGlyZWN0b3J5MicgKyAnIG1vZHVsZSB0ZXN0cyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE1vZHVsZS5wYXRocywgWyd0ZXN0X2RpcmVjdG9yeScsICd0ZXN0X2RpcmVjdG9yeTInXSkKKworICAgICAgICAjIGxvYWRfdGVzdHMgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQgb25jZSB3aXRoIGxvYWRlciwgdGVzdHMgYW5kIHBhdHRlcm4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNb2R1bGUubG9hZF90ZXN0c19hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsobG9hZGVyLCAndGVzdF9kaXJlY3RvcnknICsgJyBtb2R1bGUgdGVzdHMnLCAndGVzdConKV0pCisKKyAgICBkZWYgdGVzdF9kaXNjb3ZlcihzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgb3JpZ2luYWxfaXNmaWxlID0gb3MucGF0aC5pc2ZpbGUKKyAgICAgICAgb3JpZ2luYWxfaXNkaXIgPSBvcy5wYXRoLmlzZGlyCisgICAgICAgIGRlZiByZXN0b3JlX2lzZmlsZSgpOgorICAgICAgICAgICAgb3MucGF0aC5pc2ZpbGUgPSBvcmlnaW5hbF9pc2ZpbGUKKworICAgICAgICBvcy5wYXRoLmlzZmlsZSA9IGxhbWJkYSBwYXRoOiBGYWxzZQorICAgICAgICBzZWxmLmFkZENsZWFudXAocmVzdG9yZV9pc2ZpbGUpCisKKyAgICAgICAgb3JpZ19zeXNfcGF0aCA9IHN5cy5wYXRoWzpdCisgICAgICAgIGRlZiByZXN0b3JlX3BhdGgoKToKKyAgICAgICAgICAgIHN5cy5wYXRoWzpdID0gb3JpZ19zeXNfcGF0aAorICAgICAgICBzZWxmLmFkZENsZWFudXAocmVzdG9yZV9wYXRoKQorCisgICAgICAgIGZ1bGxfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLm5vcm1wYXRoKCcvZm9vJykpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpOgorICAgICAgICAgICAgbG9hZGVyLmRpc2NvdmVyKCcvZm9vL2JhcicsIHRvcF9sZXZlbF9kaXI9Jy9mb28nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLl90b3BfbGV2ZWxfZGlyLCBmdWxsX3BhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oZnVsbF9wYXRoLCBzeXMucGF0aCkKKworICAgICAgICBvcy5wYXRoLmlzZmlsZSA9IGxhbWJkYSBwYXRoOiBUcnVlCisgICAgICAgIG9zLnBhdGguaXNkaXIgPSBsYW1iZGEgcGF0aDogVHJ1ZQorCisgICAgICAgIGRlZiByZXN0b3JlX2lzZGlyKCk6CisgICAgICAgICAgICBvcy5wYXRoLmlzZGlyID0gb3JpZ2luYWxfaXNkaXIKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVfaXNkaXIpCisKKyAgICAgICAgX2ZpbmRfdGVzdHNfYXJncyA9IFtdCisgICAgICAgIGRlZiBfZmluZF90ZXN0cyhzdGFydF9kaXIsIHBhdHRlcm4pOgorICAgICAgICAgICAgX2ZpbmRfdGVzdHNfYXJncy5hcHBlbmQoKHN0YXJ0X2RpciwgcGF0dGVybikpCisgICAgICAgICAgICByZXR1cm4gWyd0ZXN0cyddCisgICAgICAgIGxvYWRlci5fZmluZF90ZXN0cyA9IF9maW5kX3Rlc3RzCisgICAgICAgIGxvYWRlci5zdWl0ZUNsYXNzID0gc3RyCisKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIuZGlzY292ZXIoJy9mb28vYmFyL2JheicsICdwYXR0ZXJuJywgJy9mb28vYmFyJykKKworICAgICAgICB0b3BfbGV2ZWxfZGlyID0gb3MucGF0aC5hYnNwYXRoKCcvZm9vL2JhcicpCisgICAgICAgIHN0YXJ0X2RpciA9IG9zLnBhdGguYWJzcGF0aCgnL2Zvby9iYXIvYmF6JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZSwgIlsndGVzdHMnXSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLl90b3BfbGV2ZWxfZGlyLCB0b3BfbGV2ZWxfZGlyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9maW5kX3Rlc3RzX2FyZ3MsIFsoc3RhcnRfZGlyLCAncGF0dGVybicpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbih0b3BfbGV2ZWxfZGlyLCBzeXMucGF0aCkKKworICAgIGRlZiB0ZXN0X2Rpc2NvdmVyX3dpdGhfbW9kdWxlc190aGF0X2ZhaWxfdG9faW1wb3J0KHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICBsaXN0ZGlyID0gb3MubGlzdGRpcgorICAgICAgICBvcy5saXN0ZGlyID0gbGFtYmRhIF86IFsndGVzdF90aGlzX2RvZXNfbm90X2V4aXN0LnB5J10KKyAgICAgICAgaXNmaWxlID0gb3MucGF0aC5pc2ZpbGUKKyAgICAgICAgb3MucGF0aC5pc2ZpbGUgPSBsYW1iZGEgXzogVHJ1ZQorICAgICAgICBvcmlnX3N5c19wYXRoID0gc3lzLnBhdGhbOl0KKyAgICAgICAgZGVmIHJlc3RvcmUoKToKKyAgICAgICAgICAgIG9zLnBhdGguaXNmaWxlID0gaXNmaWxlCisgICAgICAgICAgICBvcy5saXN0ZGlyID0gbGlzdGRpcgorICAgICAgICAgICAgc3lzLnBhdGhbOl0gPSBvcmlnX3N5c19wYXRoCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChyZXN0b3JlKQorCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmRpc2NvdmVyKCcuJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihvcy5nZXRjd2QoKSwgc3lzLnBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGUuY291bnRUZXN0Q2FzZXMoKSwgMSkKKyAgICAgICAgdGVzdCA9IGxpc3QobGlzdChzdWl0ZSlbMF0pWzBdICMgZXh0cmFjdCB0ZXN0IGZyb20gc3VpdGUKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKKyAgICAgICAgICAgIHRlc3QudGVzdF90aGlzX2RvZXNfbm90X2V4aXN0KCkKKworICAgIGRlZiB0ZXN0X2NvbW1hbmRfbGluZV9oYW5kbGluZ19wYXJzZUFyZ3Moc2VsZik6CisgICAgICAgICMgSGFoYSAtIHRha2UgdGhhdCB1bmluc3RhbnRpYWJsZSBjbGFzcworICAgICAgICBwcm9ncmFtID0gb2JqZWN0Ll9fbmV3X18odW5pdHRlc3QuVGVzdFByb2dyYW0pCisKKyAgICAgICAgYXJncyA9IFtdCisgICAgICAgIGRlZiBkb19kaXNjb3ZlcnkoYXJndik6CisgICAgICAgICAgICBhcmdzLmV4dGVuZChhcmd2KQorICAgICAgICBwcm9ncmFtLl9kb19kaXNjb3ZlcnkgPSBkb19kaXNjb3ZlcnkKKyAgICAgICAgcHJvZ3JhbS5wYXJzZUFyZ3MoWydzb21ldGhpbmcnLCAnZGlzY292ZXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbXSkKKworICAgICAgICBwcm9ncmFtLnBhcnNlQXJncyhbJ3NvbWV0aGluZycsICdkaXNjb3ZlcicsICdmb28nLCAnYmFyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgWydmb28nLCAnYmFyJ10pCisKKyAgICBkZWYgdGVzdF9jb21tYW5kX2xpbmVfaGFuZGxpbmdfZG9fZGlzY292ZXJ5X3Rvb19tYW55X2FyZ3VtZW50cyhzZWxmKToKKyAgICAgICAgY2xhc3MgU3RvcChFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWYgdXNhZ2VFeGl0KCk6CisgICAgICAgICAgICByYWlzZSBTdG9wCisKKyAgICAgICAgcHJvZ3JhbSA9IG9iamVjdC5fX25ld19fKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKQorICAgICAgICBwcm9ncmFtLnVzYWdlRXhpdCA9IHVzYWdlRXhpdAorICAgICAgICBwcm9ncmFtLnRlc3RMb2FkZXIgPSBOb25lCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTdG9wKToKKyAgICAgICAgICAgICMgdG9vIG1hbnkgYXJncworICAgICAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFsnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJ10pCisKKworICAgIGRlZiB0ZXN0X2NvbW1hbmRfbGluZV9oYW5kbGluZ19kb19kaXNjb3ZlcnlfdXNlc19kZWZhdWx0X2xvYWRlcihzZWxmKToKKyAgICAgICAgcHJvZ3JhbSA9IG9iamVjdC5fX25ld19fKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKQorCisgICAgICAgIGNsYXNzIExvYWRlcihvYmplY3QpOgorICAgICAgICAgICAgYXJncyA9IFtdCisgICAgICAgICAgICBkZWYgZGlzY292ZXIoc2VsZiwgc3RhcnRfZGlyLCBwYXR0ZXJuLCB0b3BfbGV2ZWxfZGlyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFyZ3MuYXBwZW5kKChzdGFydF9kaXIsIHBhdHRlcm4sIHRvcF9sZXZlbF9kaXIpKQorICAgICAgICAgICAgICAgIHJldHVybiAndGVzdHMnCisKKyAgICAgICAgcHJvZ3JhbS50ZXN0TG9hZGVyID0gTG9hZGVyKCkKKyAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFsnLXYnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMb2FkZXIuYXJncywgWygnLicsICd0ZXN0Ki5weScsIE5vbmUpXSkKKworICAgIGRlZiB0ZXN0X2NvbW1hbmRfbGluZV9oYW5kbGluZ19kb19kaXNjb3ZlcnlfY2FsbHNfbG9hZGVyKHNlbGYpOgorICAgICAgICBwcm9ncmFtID0gb2JqZWN0Ll9fbmV3X18odW5pdHRlc3QuVGVzdFByb2dyYW0pCisKKyAgICAgICAgY2xhc3MgTG9hZGVyKG9iamVjdCk6CisgICAgICAgICAgICBhcmdzID0gW10KKyAgICAgICAgICAgIGRlZiBkaXNjb3ZlcihzZWxmLCBzdGFydF9kaXIsIHBhdHRlcm4sIHRvcF9sZXZlbF9kaXIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXJncy5hcHBlbmQoKHN0YXJ0X2RpciwgcGF0dGVybiwgdG9wX2xldmVsX2RpcikpCisgICAgICAgICAgICAgICAgcmV0dXJuICd0ZXN0cycKKworICAgICAgICBwcm9ncmFtLl9kb19kaXNjb3ZlcnkoWyctdiddLCBMb2FkZXI9TG9hZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2dyYW0udmVyYm9zaXR5LCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2dyYW0udGVzdCwgJ3Rlc3RzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMb2FkZXIuYXJncywgWygnLicsICd0ZXN0Ki5weScsIE5vbmUpXSkKKworICAgICAgICBMb2FkZXIuYXJncyA9IFtdCisgICAgICAgIHByb2dyYW0gPSBvYmplY3QuX19uZXdfXyh1bml0dGVzdC5UZXN0UHJvZ3JhbSkKKyAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFsnLS12ZXJib3NlJ10sIExvYWRlcj1Mb2FkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvZ3JhbS50ZXN0LCAndGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExvYWRlci5hcmdzLCBbKCcuJywgJ3Rlc3QqLnB5JywgTm9uZSldKQorCisgICAgICAgIExvYWRlci5hcmdzID0gW10KKyAgICAgICAgcHJvZ3JhbSA9IG9iamVjdC5fX25ld19fKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKQorICAgICAgICBwcm9ncmFtLl9kb19kaXNjb3ZlcnkoW10sIExvYWRlcj1Mb2FkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvZ3JhbS50ZXN0LCAndGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExvYWRlci5hcmdzLCBbKCcuJywgJ3Rlc3QqLnB5JywgTm9uZSldKQorCisgICAgICAgIExvYWRlci5hcmdzID0gW10KKyAgICAgICAgcHJvZ3JhbSA9IG9iamVjdC5fX25ld19fKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKQorICAgICAgICBwcm9ncmFtLl9kb19kaXNjb3ZlcnkoWydmaXNoJ10sIExvYWRlcj1Mb2FkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvZ3JhbS50ZXN0LCAndGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExvYWRlci5hcmdzLCBbKCdmaXNoJywgJ3Rlc3QqLnB5JywgTm9uZSldKQorCisgICAgICAgIExvYWRlci5hcmdzID0gW10KKyAgICAgICAgcHJvZ3JhbSA9IG9iamVjdC5fX25ld19fKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKQorICAgICAgICBwcm9ncmFtLl9kb19kaXNjb3ZlcnkoWydmaXNoJywgJ2VnZ3MnXSwgTG9hZGVyPUxvYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9ncmFtLnRlc3QsICd0ZXN0cycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTG9hZGVyLmFyZ3MsIFsoJ2Zpc2gnLCAnZWdncycsIE5vbmUpXSkKKworICAgICAgICBMb2FkZXIuYXJncyA9IFtdCisgICAgICAgIHByb2dyYW0gPSBvYmplY3QuX19uZXdfXyh1bml0dGVzdC5UZXN0UHJvZ3JhbSkKKyAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFsnZmlzaCcsICdlZ2dzJywgJ2hhbSddLCBMb2FkZXI9TG9hZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2dyYW0udGVzdCwgJ3Rlc3RzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMb2FkZXIuYXJncywgWygnZmlzaCcsICdlZ2dzJywgJ2hhbScpXSkKKworICAgICAgICBMb2FkZXIuYXJncyA9IFtdCisgICAgICAgIHByb2dyYW0gPSBvYmplY3QuX19uZXdfXyh1bml0dGVzdC5UZXN0UHJvZ3JhbSkKKyAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFsnLXMnLCAnZmlzaCddLCBMb2FkZXI9TG9hZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2dyYW0udGVzdCwgJ3Rlc3RzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMb2FkZXIuYXJncywgWygnZmlzaCcsICd0ZXN0Ki5weScsIE5vbmUpXSkKKworICAgICAgICBMb2FkZXIuYXJncyA9IFtdCisgICAgICAgIHByb2dyYW0gPSBvYmplY3QuX19uZXdfXyh1bml0dGVzdC5UZXN0UHJvZ3JhbSkKKyAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFsnLXQnLCAnZmlzaCddLCBMb2FkZXI9TG9hZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2dyYW0udGVzdCwgJ3Rlc3RzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMb2FkZXIuYXJncywgWygnLicsICd0ZXN0Ki5weScsICdmaXNoJyldKQorCisgICAgICAgIExvYWRlci5hcmdzID0gW10KKyAgICAgICAgcHJvZ3JhbSA9IG9iamVjdC5fX25ld19fKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKQorICAgICAgICBwcm9ncmFtLl9kb19kaXNjb3ZlcnkoWyctcCcsICdmaXNoJ10sIExvYWRlcj1Mb2FkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvZ3JhbS50ZXN0LCAndGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExvYWRlci5hcmdzLCBbKCcuJywgJ2Zpc2gnLCBOb25lKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvZ3JhbS5mYWlsZmFzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwcm9ncmFtLmNhdGNoYnJlYWspCisKKyAgICAgICAgTG9hZGVyLmFyZ3MgPSBbXQorICAgICAgICBwcm9ncmFtID0gb2JqZWN0Ll9fbmV3X18odW5pdHRlc3QuVGVzdFByb2dyYW0pCisgICAgICAgIHByb2dyYW0uX2RvX2Rpc2NvdmVyeShbJy1wJywgJ2VnZ3MnLCAnLXMnLCAnZmlzaCcsICctdicsICctZicsICctYyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9hZGVyPUxvYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9ncmFtLnRlc3QsICd0ZXN0cycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTG9hZGVyLmFyZ3MsIFsoJ2Zpc2gnLCAnZWdncycsIE5vbmUpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9ncmFtLnZlcmJvc2l0eSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb2dyYW0uZmFpbGZhc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm9ncmFtLmNhdGNoYnJlYWspCisKKyAgICBkZWYgdGVzdF9kZXRlY3RfbW9kdWxlX2NsYXNoKHNlbGYpOgorICAgICAgICBjbGFzcyBNb2R1bGUob2JqZWN0KToKKyAgICAgICAgICAgIF9fZmlsZV9fID0gJ2Jhci9mb28ucHknCisgICAgICAgIHN5cy5tb2R1bGVzWydmb28nXSA9IE1vZHVsZQorICAgICAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmFic3BhdGgoJ2ZvbycpCisgICAgICAgIG9yaWdpbmFsX2xpc3RkaXIgPSBvcy5saXN0ZGlyCisgICAgICAgIG9yaWdpbmFsX2lzZmlsZSA9IG9zLnBhdGguaXNmaWxlCisgICAgICAgIG9yaWdpbmFsX2lzZGlyID0gb3MucGF0aC5pc2RpcgorCisgICAgICAgIGRlZiBjbGVhbnVwKCk6CisgICAgICAgICAgICBvcy5saXN0ZGlyID0gb3JpZ2luYWxfbGlzdGRpcgorICAgICAgICAgICAgb3MucGF0aC5pc2ZpbGUgPSBvcmlnaW5hbF9pc2ZpbGUKKyAgICAgICAgICAgIG9zLnBhdGguaXNkaXIgPSBvcmlnaW5hbF9pc2RpcgorICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzWydmb28nXQorICAgICAgICAgICAgaWYgZnVsbF9wYXRoIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgICAgIHN5cy5wYXRoLnJlbW92ZShmdWxsX3BhdGgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChjbGVhbnVwKQorCisgICAgICAgIGRlZiBsaXN0ZGlyKF8pOgorICAgICAgICAgICAgcmV0dXJuIFsnZm9vLnB5J10KKyAgICAgICAgZGVmIGlzZmlsZShfKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGRlZiBpc2RpcihfKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIG9zLmxpc3RkaXIgPSBsaXN0ZGlyCisgICAgICAgIG9zLnBhdGguaXNmaWxlID0gaXNmaWxlCisgICAgICAgIG9zLnBhdGguaXNkaXIgPSBpc2RpcgorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIG1vZF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoJ2JhcicpCisgICAgICAgIGV4cGVjdGVkX2RpciA9IG9zLnBhdGguYWJzcGF0aCgnZm9vJykKKyAgICAgICAgbXNnID0gcmUuZXNjYXBlKHIiJ2ZvbycgbW9kdWxlIGluY29ycmVjdGx5IGltcG9ydGVkIGZyb20gJXIuIEV4cGVjdGVkICVyLiAiCisgICAgICAgICAgICAgICAgIklzIHRoaXMgbW9kdWxlIGdsb2JhbGx5IGluc3RhbGxlZD8iICUgKG1vZF9kaXIsIGV4cGVjdGVkX2RpcikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAorICAgICAgICAgICAgSW1wb3J0RXJyb3IsICdeJXMkJyAlIG1zZywgbG9hZGVyLmRpc2NvdmVyLAorICAgICAgICAgICAgc3RhcnRfZGlyPSdmb28nLCBwYXR0ZXJuPSdmb28ucHknCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMucGF0aFswXSwgZnVsbF9wYXRoKQorCisKKyAgICBkZWYgdGVzdF9kaXNjb3ZlcnlfZnJvbV9kb3R0ZWRfcGF0aChzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgdGVzdHMgPSBbc2VsZl0KKyAgICAgICAgZXhwZWN0ZWRQYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZSh1bml0dGVzdC50ZXN0Ll9fZmlsZV9fKSkKKworICAgICAgICBzZWxmLndhc1J1biA9IEZhbHNlCisgICAgICAgIGRlZiBfZmluZF90ZXN0cyhzdGFydF9kaXIsIHBhdHRlcm4pOgorICAgICAgICAgICAgc2VsZi53YXNSdW4gPSBUcnVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXJ0X2RpciwgZXhwZWN0ZWRQYXRoKQorICAgICAgICAgICAgcmV0dXJuIHRlc3RzCisgICAgICAgIGxvYWRlci5fZmluZF90ZXN0cyA9IF9maW5kX3Rlc3RzCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmRpc2NvdmVyKCd1bml0dGVzdC50ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYud2FzUnVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlLl90ZXN0cywgdGVzdHMpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Rpc2NvdmVyeS5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9kaXNjb3ZlcnkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjQ4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9kaXNjb3ZlcnkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Rpc2NvdmVyeS5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9kaXNjb3ZlcnkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYjQ4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9kaXNjb3ZlcnkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Z1bmN0aW9udGVzdGNhc2UucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9mdW5jdGlvbnRlc3RjYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZGQ4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9mdW5jdGlvbnRlc3RjYXNlLnB5CkBAIC0wLDAgKzEsMTQ4IEBACitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSAuc3VwcG9ydCBpbXBvcnQgTG9nZ2luZ1Jlc3VsdAorCisKK2NsYXNzIFRlc3RfRnVuY3Rpb25UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjICJSZXR1cm4gdGhlIG51bWJlciBvZiB0ZXN0cyByZXByZXNlbnRlZCBieSB0aGUgdGhpcyB0ZXN0IG9iamVjdC4gRm9yCisgICAgIyBUZXN0Q2FzZSBpbnN0YW5jZXMsIHRoaXMgd2lsbCBhbHdheXMgYmUgMSIKKyAgICBkZWYgdGVzdF9jb3VudFRlc3RDYXNlcyhzZWxmKToKKyAgICAgICAgdGVzdCA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdC5jb3VudFRlc3RDYXNlcygpLCAxKQorCisgICAgIyAiV2hlbiBhIHNldFVwKCkgbWV0aG9kIGlzIGRlZmluZWQsIHRoZSB0ZXN0IHJ1bm5lciB3aWxsIHJ1biB0aGF0IG1ldGhvZAorICAgICMgcHJpb3IgdG8gZWFjaCB0ZXN0LiBMaWtld2lzZSwgaWYgYSB0ZWFyRG93bigpIG1ldGhvZCBpcyBkZWZpbmVkLCB0aGUKKyAgICAjIHRlc3QgcnVubmVyIHdpbGwgaW52b2tlIHRoYXQgbWV0aG9kIGFmdGVyIGVhY2ggdGVzdC4gSW4gdGhlIGV4YW1wbGUsCisgICAgIyBzZXRVcCgpIHdhcyB1c2VkIHRvIGNyZWF0ZSBhIGZyZXNoIHNlcXVlbmNlIGZvciBlYWNoIHRlc3QuIgorICAgICMKKyAgICAjIE1ha2Ugc3VyZSB0aGUgcHJvcGVyIGNhbGwgb3JkZXIgaXMgbWFpbnRhaW5lZCwgZXZlbiBpZiBzZXRVcCgpIHJhaXNlcworICAgICMgYW4gZXhjZXB0aW9uLgorICAgIGRlZiB0ZXN0X3J1bl9jYWxsX29yZGVyX19lcnJvcl9pbl9zZXRVcChzZWxmKToKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisKKyAgICAgICAgZGVmIHNldFVwKCk6CisgICAgICAgICAgICBldmVudHMuYXBwZW5kKCdzZXRVcCcpCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3JhaXNlZCBieSBzZXRVcCcpCisKKyAgICAgICAgZGVmIHRlc3QoKToKKyAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoJ3Rlc3QnKQorCisgICAgICAgIGRlZiB0ZWFyRG93bigpOgorICAgICAgICAgICAgZXZlbnRzLmFwcGVuZCgndGVhckRvd24nKQorCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3QnLCAnc2V0VXAnLCAnYWRkRXJyb3InLCAnc3RvcFRlc3QnXQorICAgICAgICB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKHRlc3QsIHNldFVwLCB0ZWFyRG93bikucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgIyAiV2hlbiBhIHNldFVwKCkgbWV0aG9kIGlzIGRlZmluZWQsIHRoZSB0ZXN0IHJ1bm5lciB3aWxsIHJ1biB0aGF0IG1ldGhvZAorICAgICMgcHJpb3IgdG8gZWFjaCB0ZXN0LiBMaWtld2lzZSwgaWYgYSB0ZWFyRG93bigpIG1ldGhvZCBpcyBkZWZpbmVkLCB0aGUKKyAgICAjIHRlc3QgcnVubmVyIHdpbGwgaW52b2tlIHRoYXQgbWV0aG9kIGFmdGVyIGVhY2ggdGVzdC4gSW4gdGhlIGV4YW1wbGUsCisgICAgIyBzZXRVcCgpIHdhcyB1c2VkIHRvIGNyZWF0ZSBhIGZyZXNoIHNlcXVlbmNlIGZvciBlYWNoIHRlc3QuIgorICAgICMKKyAgICAjIE1ha2Ugc3VyZSB0aGUgcHJvcGVyIGNhbGwgb3JkZXIgaXMgbWFpbnRhaW5lZCwgZXZlbiBpZiB0aGUgdGVzdCByYWlzZXMKKyAgICAjIGFuIGVycm9yIChhcyBvcHBvc2VkIHRvIGEgZmFpbHVyZSkuCisgICAgZGVmIHRlc3RfcnVuX2NhbGxfb3JkZXJfX2Vycm9yX2luX3Rlc3Qoc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorCisgICAgICAgIGRlZiBzZXRVcCgpOgorICAgICAgICAgICAgZXZlbnRzLmFwcGVuZCgnc2V0VXAnKQorCisgICAgICAgIGRlZiB0ZXN0KCk6CisgICAgICAgICAgICBldmVudHMuYXBwZW5kKCd0ZXN0JykKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigncmFpc2VkIGJ5IHRlc3QnKQorCisgICAgICAgIGRlZiB0ZWFyRG93bigpOgorICAgICAgICAgICAgZXZlbnRzLmFwcGVuZCgndGVhckRvd24nKQorCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3QnLCAnc2V0VXAnLCAndGVzdCcsICdhZGRFcnJvcicsICd0ZWFyRG93bicsCisgICAgICAgICAgICAgICAgICAgICdzdG9wVGVzdCddCisgICAgICAgIHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UodGVzdCwgc2V0VXAsIHRlYXJEb3duKS5ydW4ocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgZXhwZWN0ZWQpCisKKyAgICAjICJXaGVuIGEgc2V0VXAoKSBtZXRob2QgaXMgZGVmaW5lZCwgdGhlIHRlc3QgcnVubmVyIHdpbGwgcnVuIHRoYXQgbWV0aG9kCisgICAgIyBwcmlvciB0byBlYWNoIHRlc3QuIExpa2V3aXNlLCBpZiBhIHRlYXJEb3duKCkgbWV0aG9kIGlzIGRlZmluZWQsIHRoZQorICAgICMgdGVzdCBydW5uZXIgd2lsbCBpbnZva2UgdGhhdCBtZXRob2QgYWZ0ZXIgZWFjaCB0ZXN0LiBJbiB0aGUgZXhhbXBsZSwKKyAgICAjIHNldFVwKCkgd2FzIHVzZWQgdG8gY3JlYXRlIGEgZnJlc2ggc2VxdWVuY2UgZm9yIGVhY2ggdGVzdC4iCisgICAgIworICAgICMgTWFrZSBzdXJlIHRoZSBwcm9wZXIgY2FsbCBvcmRlciBpcyBtYWludGFpbmVkLCBldmVuIGlmIHRoZSB0ZXN0IHNpZ25hbHMKKyAgICAjIGEgZmFpbHVyZSAoYXMgb3Bwb3NlZCB0byBhbiBlcnJvcikuCisgICAgZGVmIHRlc3RfcnVuX2NhbGxfb3JkZXJfX2ZhaWx1cmVfaW5fdGVzdChzZWxmKToKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisKKyAgICAgICAgZGVmIHNldFVwKCk6CisgICAgICAgICAgICBldmVudHMuYXBwZW5kKCdzZXRVcCcpCisKKyAgICAgICAgZGVmIHRlc3QoKToKKyAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoJ3Rlc3QnKQorICAgICAgICAgICAgc2VsZi5mYWlsKCdyYWlzZWQgYnkgdGVzdCcpCisKKyAgICAgICAgZGVmIHRlYXJEb3duKCk6CisgICAgICAgICAgICBldmVudHMuYXBwZW5kKCd0ZWFyRG93bicpCisKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ3N0YXJ0VGVzdCcsICdzZXRVcCcsICd0ZXN0JywgJ2FkZEZhaWx1cmUnLCAndGVhckRvd24nLAorICAgICAgICAgICAgICAgICAgICAnc3RvcFRlc3QnXQorICAgICAgICB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKHRlc3QsIHNldFVwLCB0ZWFyRG93bikucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgIyAiV2hlbiBhIHNldFVwKCkgbWV0aG9kIGlzIGRlZmluZWQsIHRoZSB0ZXN0IHJ1bm5lciB3aWxsIHJ1biB0aGF0IG1ldGhvZAorICAgICMgcHJpb3IgdG8gZWFjaCB0ZXN0LiBMaWtld2lzZSwgaWYgYSB0ZWFyRG93bigpIG1ldGhvZCBpcyBkZWZpbmVkLCB0aGUKKyAgICAjIHRlc3QgcnVubmVyIHdpbGwgaW52b2tlIHRoYXQgbWV0aG9kIGFmdGVyIGVhY2ggdGVzdC4gSW4gdGhlIGV4YW1wbGUsCisgICAgIyBzZXRVcCgpIHdhcyB1c2VkIHRvIGNyZWF0ZSBhIGZyZXNoIHNlcXVlbmNlIGZvciBlYWNoIHRlc3QuIgorICAgICMKKyAgICAjIE1ha2Ugc3VyZSB0aGUgcHJvcGVyIGNhbGwgb3JkZXIgaXMgbWFpbnRhaW5lZCwgZXZlbiBpZiB0ZWFyRG93bigpIHJhaXNlcworICAgICMgYW4gZXhjZXB0aW9uLgorICAgIGRlZiB0ZXN0X3J1bl9jYWxsX29yZGVyX19lcnJvcl9pbl90ZWFyRG93bihzZWxmKToKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisKKyAgICAgICAgZGVmIHNldFVwKCk6CisgICAgICAgICAgICBldmVudHMuYXBwZW5kKCdzZXRVcCcpCisKKyAgICAgICAgZGVmIHRlc3QoKToKKyAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoJ3Rlc3QnKQorCisgICAgICAgIGRlZiB0ZWFyRG93bigpOgorICAgICAgICAgICAgZXZlbnRzLmFwcGVuZCgndGVhckRvd24nKQorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdyYWlzZWQgYnkgdGVhckRvd24nKQorCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3QnLCAnc2V0VXAnLCAndGVzdCcsICd0ZWFyRG93bicsICdhZGRFcnJvcicsCisgICAgICAgICAgICAgICAgICAgICdzdG9wVGVzdCddCisgICAgICAgIHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UodGVzdCwgc2V0VXAsIHRlYXJEb3duKS5ydW4ocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgZXhwZWN0ZWQpCisKKyAgICAjICJSZXR1cm4gYSBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIHNwZWNpZmljIHRlc3QgY2FzZS4iCisgICAgIworICAgICMgQmVjYXVzZSBvZiB0aGUgdmFndWUgbmF0dXJlIG9mIHRoZSBkb2NzLCBJJ20gbm90IGdvaW5nIHRvIGxvY2sgdGhpcworICAgICMgdGVzdCBkb3duIHRvbyBtdWNoLiBSZWFsbHkgYWxsIHRoYXQgY2FuIGJlIGFzc2VydGVkIGlzIHRoYXQgdGhlIGlkKCkKKyAgICAjIHdpbGwgYmUgYSBzdHJpbmcgKGVpdGhlciA4LWJ5dGUgb3IgdW5pY29kZSAtLSBhZ2FpbiwgYmVjYXVzZSB0aGUgZG9jcworICAgICMganVzdCBzYXkgInN0cmluZyIpCisgICAgZGVmIHRlc3RfaWQoc2VsZik6CisgICAgICAgIHRlc3QgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodGVzdC5pZCgpLCBiYXNlc3RyaW5nKQorCisgICAgIyAiUmV0dXJucyBhIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0LCBvciBOb25lIGlmIG5vIGRlc2NyaXB0aW9uCisgICAgIyBoYXMgYmVlbiBwcm92aWRlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucworICAgICMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHRlc3QgbWV0aG9kJ3MgZG9jc3RyaW5nLCBpZiBhdmFpbGFibGUsIG9yIE5vbmUuIgorICAgIGRlZiB0ZXN0X3Nob3J0RGVzY3JpcHRpb25fX25vX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgdGVzdCA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdC5zaG9ydERlc2NyaXB0aW9uKCksIE5vbmUpCisKKyAgICAjICJSZXR1cm5zIGEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIHRlc3QsIG9yIE5vbmUgaWYgbm8gZGVzY3JpcHRpb24KKyAgICAjIGhhcyBiZWVuIHByb3ZpZGVkLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgIyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgdGVzdCBtZXRob2QncyBkb2NzdHJpbmcsIGlmIGF2YWlsYWJsZSwgb3IgTm9uZS4iCisgICAgZGVmIHRlc3Rfc2hvcnREZXNjcmlwdGlvbl9fc2luZ2xlbGluZV9kb2NzdHJpbmcoc2VsZik6CisgICAgICAgIGRlc2MgPSAidGhpcyB0ZXN0cyBmb28iCisgICAgICAgIHRlc3QgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSwgZGVzY3JpcHRpb249ZGVzYykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3Quc2hvcnREZXNjcmlwdGlvbigpLCAidGhpcyB0ZXN0cyBmb28iKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9mdW5jdGlvbnRlc3RjYXNlLnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Z1bmN0aW9udGVzdGNhc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTMwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9mdW5jdGlvbnRlc3RjYXNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9mdW5jdGlvbnRlc3RjYXNlLnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Z1bmN0aW9udGVzdGNhc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTMwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9mdW5jdGlvbnRlc3RjYXNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9sb2FkZXIucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9sb2FkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0NGEyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2xvYWRlci5weQpAQCAtMCwwICsxLDEyODYgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworCisKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFRlc3RfVGVzdExvYWRlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIyMgVGVzdHMgZm9yIFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgIyAiUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGNvbnRhaW5lZCBpbiB0aGUgVGVzdENhc2UtZGVyaXZlZAorICAgICMgY2xhc3MgdGVzdENhc2VDbGFzcyIKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tVGVzdENhc2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgZm9vX2JhcihzZWxmKTogcGFzcworCisgICAgICAgIHRlc3RzID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtGb28oJ3Rlc3RfMScpLCBGb28oJ3Rlc3RfMicpXSkKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEZvbyksIHRlc3RzKQorCisgICAgIyAiUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGNvbnRhaW5lZCBpbiB0aGUgVGVzdENhc2UtZGVyaXZlZAorICAgICMgY2xhc3MgdGVzdENhc2VDbGFzcyIKKyAgICAjCisgICAgIyBNYWtlIHN1cmUgaXQgZG9lcyB0aGUgcmlnaHQgdGhpbmcgZXZlbiBpZiBubyB0ZXN0cyB3ZXJlIGZvdW5kCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbVRlc3RDYXNlX19ub19tYXRjaGVzKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIGZvb19iYXIoc2VsZik6IHBhc3MKKworICAgICAgICBlbXB0eV9zdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShGb28pLCBlbXB0eV9zdWl0ZSkKKworICAgICMgIlJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBjb250YWluZWQgaW4gdGhlIFRlc3RDYXNlLWRlcml2ZWQKKyAgICAjIGNsYXNzIHRlc3RDYXNlQ2xhc3MiCisgICAgIworICAgICMgV2hhdCBoYXBwZW5zIGlmIGxvYWRUZXN0c0Zyb21UZXN0Q2FzZSgpIGlzIGdpdmVuIGFuIG9iamVjdAorICAgICMgdGhhdCBpc24ndCBhIHN1YmNsYXNzIG9mIFRlc3RDYXNlPyBTcGVjaWZpY2FsbHksIHdoYXQgaGFwcGVucworICAgICMgaWYgdGVzdENhc2VDbGFzcyBpcyBhIHN1YmNsYXNzIG9mIFRlc3RTdWl0ZT8KKyAgICAjCisgICAgIyBUaGlzIGlzIGNoZWNrZWQgZm9yIHNwZWNpZmljYWxseSBpbiB0aGUgY29kZSwgc28gd2UgYmV0dGVyIGFkZCBhCisgICAgIyB0ZXN0IGZvciBpdC4KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tVGVzdENhc2VfX1Rlc3RTdWl0ZV9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgTm90QVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RTdWl0ZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoTm90QVRlc3RDYXNlKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdTaG91bGQgcmFpc2UgVHlwZUVycm9yJykKKworICAgICMgIlJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBjb250YWluZWQgaW4gdGhlIFRlc3RDYXNlLWRlcml2ZWQKKyAgICAjIGNsYXNzIHRlc3RDYXNlQ2xhc3MiCisgICAgIworICAgICMgTWFrZSBzdXJlIGxvYWRUZXN0c0Zyb21UZXN0Q2FzZSgpIHBpY2tzIHVwIHRoZSBkZWZhdWx0IHRlc3QgbWV0aG9kCisgICAgIyBuYW1lIChhcyBzcGVjaWZpZWQgYnkgVGVzdENhc2UpLCBldmVuIHRob3VnaCB0aGUgbWV0aG9kIG5hbWUgZG9lcworICAgICMgbm90IG1hdGNoIHRoZSBkZWZhdWx0IFRlc3RMb2FkZXIudGVzdE1ldGhvZFByZWZpeCBzdHJpbmcKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tVGVzdENhc2VfX2RlZmF1bHRfbWV0aG9kX25hbWUoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgcnVuVGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgICMgVGhpcyBoYXMgdG8gYmUgZmFsc2UgZm9yIHRoZSB0ZXN0IHRvIHN1Y2NlZWQKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgncnVuVGVzdCcuc3RhcnRzd2l0aChsb2FkZXIudGVzdE1ldGhvZFByZWZpeCkpCisKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW0ZvbygncnVuVGVzdCcpXSkKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIyMgL1Rlc3RzIGZvciBUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZQorCisgICAgIyMjIFRlc3RzIGZvciBUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICAjICJUaGlzIG1ldGhvZCBzZWFyY2hlcyBgbW9kdWxlYCBmb3IgY2xhc3NlcyBkZXJpdmVkIGZyb20gVGVzdENhc2UiCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU1vZHVsZV9fVGVzdENhc2Vfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgTXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIG0udGVzdGNhc2VfMSA9IE15VGVzdENhc2UKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShtKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIGxvYWRlci5zdWl0ZUNsYXNzKQorCisgICAgICAgIGV4cGVjdGVkID0gW2xvYWRlci5zdWl0ZUNsYXNzKFtNeVRlc3RDYXNlKCd0ZXN0JyldKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgZXhwZWN0ZWQpCisKKyAgICAjICJUaGlzIG1ldGhvZCBzZWFyY2hlcyBgbW9kdWxlYCBmb3IgY2xhc3NlcyBkZXJpdmVkIGZyb20gVGVzdENhc2UiCisgICAgIworICAgICMgV2hhdCBoYXBwZW5zIGlmIG5vIHRlc3RzIGFyZSBmb3VuZCAobm8gVGVzdENhc2UgaW5zdGFuY2VzKT8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTW9kdWxlX19ub19UZXN0Q2FzZV9pbnN0YW5jZXMoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShtKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIGxvYWRlci5zdWl0ZUNsYXNzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbXSkKKworICAgICMgIlRoaXMgbWV0aG9kIHNlYXJjaGVzIGBtb2R1bGVgIGZvciBjbGFzc2VzIGRlcml2ZWQgZnJvbSBUZXN0Q2FzZSIKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgaWYgbm8gdGVzdHMgYXJlIGZvdW5kIChUZXN0Q2FzZXMgaW5zdGFuY2VzLCBidXQgbm8gdGVzdHMpPworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21Nb2R1bGVfX25vX1Rlc3RDYXNlX3Rlc3RzKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBtLnRlc3RjYXNlXzEgPSBNeVRlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUobSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbbG9hZGVyLnN1aXRlQ2xhc3MoKV0pCisKKyAgICAjICJUaGlzIG1ldGhvZCBzZWFyY2hlcyBgbW9kdWxlYCBmb3IgY2xhc3NlcyBkZXJpdmVkIGZyb20gVGVzdENhc2UicworICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyBpZiBsb2FkVGVzdHNGcm9tTW9kdWxlKCkgaXMgZ2l2ZW4gc29tZXRoaW5nIG90aGVyCisgICAgIyB0aGFuIGEgbW9kdWxlPworICAgICMKKyAgICAjIFhYWCBDdXJyZW50bHksIGl0IHN1Y2NlZWRzIGFueXdheS4gVGhpcyBmbGV4aWJpbGl0eQorICAgICMgc2hvdWxkIGVpdGhlciBiZSBkb2N1bWVudGVkIG9yIGxvYWRUZXN0c0Zyb21Nb2R1bGUoKSBzaG91bGQKKyAgICAjIHJhaXNlIGEgVHlwZUVycm9yCisgICAgIworICAgICMgWFhYIENlcnRhaW4gcGVvcGxlIGFyZSB1c2luZyB0aGlzIGJlaGF2aW91ci4gV2UnbGwgYWRkIGEgdGVzdCBmb3IgaXQKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTW9kdWxlX19ub3RfYV9tb2R1bGUoc2VsZik6CisgICAgICAgIGNsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIE5vdEFNb2R1bGUob2JqZWN0KToKKyAgICAgICAgICAgIHRlc3RfMiA9IE15VGVzdENhc2UKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShOb3RBTW9kdWxlKQorCisgICAgICAgIHJlZmVyZW5jZSA9IFt1bml0dGVzdC5UZXN0U3VpdGUoW015VGVzdENhc2UoJ3Rlc3QnKV0pXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCByZWZlcmVuY2UpCisKKworICAgICMgQ2hlY2sgdGhhdCBsb2FkVGVzdHNGcm9tTW9kdWxlIGhvbm9ycyAob3Igbm90KSBhIG1vZHVsZQorICAgICMgd2l0aCBhIGxvYWRfdGVzdHMgZnVuY3Rpb24uCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU1vZHVsZV9fbG9hZF90ZXN0cyhzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbS50ZXN0Y2FzZV8xID0gTXlUZXN0Q2FzZQorCisgICAgICAgIGxvYWRfdGVzdHNfYXJncyA9IFtdCisgICAgICAgIGRlZiBsb2FkX3Rlc3RzKGxvYWRlciwgdGVzdHMsIHBhdHRlcm4pOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHRlc3RzLCB1bml0dGVzdC5UZXN0U3VpdGUpCisgICAgICAgICAgICBsb2FkX3Rlc3RzX2FyZ3MuZXh0ZW5kKChsb2FkZXIsIHRlc3RzLCBwYXR0ZXJuKSkKKyAgICAgICAgICAgIHJldHVybiB0ZXN0cworICAgICAgICBtLmxvYWRfdGVzdHMgPSBsb2FkX3Rlc3RzCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUobSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCB1bml0dGVzdC5UZXN0U3VpdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZF90ZXN0c19hcmdzLCBbbG9hZGVyLCBzdWl0ZSwgTm9uZV0pCisKKyAgICAgICAgbG9hZF90ZXN0c19hcmdzID0gW10KKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShtLCB1c2VfbG9hZF90ZXN0cz1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkX3Rlc3RzX2FyZ3MsIFtdKQorCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU1vZHVsZV9fZmF1bHR5X2xvYWRfdGVzdHMoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKworICAgICAgICBkZWYgbG9hZF90ZXN0cyhsb2FkZXIsIHRlc3RzLCBwYXR0ZXJuKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignc29tZSBmYWlsdXJlJykKKyAgICAgICAgbS5sb2FkX3Rlc3RzID0gbG9hZF90ZXN0cworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgdW5pdHRlc3QuVGVzdFN1aXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlLmNvdW50VGVzdENhc2VzKCksIDEpCisgICAgICAgIHRlc3QgPSBsaXN0KHN1aXRlKVswXQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgInNvbWUgZmFpbHVyZSIsIHRlc3QubSkKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIyMgL1Rlc3RzIGZvciBUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUoKQorCisgICAgIyMjIFRlc3RzIGZvciBUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCkKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSBlaXRoZXIgdG8KKyAgICAjIGEgbW9kdWxlLCBhIHRlc3QgY2FzZSBjbGFzcywgYSBUZXN0U3VpdGUgaW5zdGFuY2UsIGEgdGVzdCBtZXRob2QKKyAgICAjIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhCisgICAgIyBUZXN0Q2FzZSBvciBUZXN0U3VpdGUgaW5zdGFuY2UuIgorICAgICMKKyAgICAjIElzIFZhbHVlRXJyb3IgcmFpc2VkIGluIHJlc3BvbnNlIHRvIGFuIGVtcHR5IG5hbWU/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVfX2VtcHR5X25hbWUoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgnJykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIkVtcHR5IG1vZHVsZSBuYW1lIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSBmYWlsZWQgdG8gcmFpc2UgVmFsdWVFcnJvciIpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSBlaXRoZXIgdG8KKyAgICAjIGEgbW9kdWxlLCBhIHRlc3QgY2FzZSBjbGFzcywgYSBUZXN0U3VpdGUgaW5zdGFuY2UsIGEgdGVzdCBtZXRob2QKKyAgICAjIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhCisgICAgIyBUZXN0Q2FzZSBvciBUZXN0U3VpdGUgaW5zdGFuY2UuIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyB3aGVuIHRoZSBuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycz8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fbWFsZm9ybWVkX25hbWUoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgICMgWFhYIFNob3VsZCB0aGlzIHJhaXNlIFZhbHVlRXJyb3Igb3IgSW1wb3J0RXJyb3I/CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgnYWJjICgpIC8vJykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSBmYWlsZWQgdG8gcmFpc2UgVmFsdWVFcnJvciIpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSAuLi4gdG8gYQorICAgICMgbW9kdWxlIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyB3aGVuIGEgbW9kdWxlIGJ5IHRoYXQgbmFtZSBjYW4ndCBiZSBmb3VuZD8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fdW5rbm93bl9tb2R1bGVfbmFtZShzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCdzZGFzZmFzZmFzZGYnKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIk5vIG1vZHVsZSBuYW1lZCBzZGFzZmFzZmFzZGYiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lIGZhaWxlZCB0byByYWlzZSBJbXBvcnRFcnJvciIpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSBlaXRoZXIgdG8KKyAgICAjIGEgbW9kdWxlLCBhIHRlc3QgY2FzZSBjbGFzcywgYSBUZXN0U3VpdGUgaW5zdGFuY2UsIGEgdGVzdCBtZXRob2QKKyAgICAjIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhCisgICAgIyBUZXN0Q2FzZSBvciBUZXN0U3VpdGUgaW5zdGFuY2UuIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyB3aGVuIHRoZSBtb2R1bGUgaXMgZm91bmQsIGJ1dCB0aGUgYXR0cmlidXRlIGNhbid0PworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lX191bmtub3duX2F0dHJfbmFtZShzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCd1bml0dGVzdC5zZGFzZmFzZmFzZGYnKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIidtb2R1bGUnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzZGFzZmFzZmFzZGYnIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSBmYWlsZWQgdG8gcmFpc2UgQXR0cmlidXRlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgd2hlbiB3ZSBwcm92aWRlIHRoZSBtb2R1bGUsIGJ1dCB0aGUgYXR0cmlidXRlIGNhbid0IGJlCisgICAgIyBmb3VuZD8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fcmVsYXRpdmVfdW5rbm93bl9uYW1lKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ3NkYXNmYXNmYXNkZicsIHVuaXR0ZXN0KQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIidtb2R1bGUnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzZGFzZmFzZmFzZGYnIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSBmYWlsZWQgdG8gcmFpc2UgQXR0cmlidXRlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjIC4uLgorICAgICMgIlRoZSBtZXRob2Qgb3B0aW9uYWxseSByZXNvbHZlcyBuYW1lIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBtb2R1bGUiCisgICAgIworICAgICMgRG9lcyBsb2FkVGVzdHNGcm9tTmFtZSByYWlzZSBWYWx1ZUVycm9yIHdoZW4gcGFzc2VkIGFuIGVtcHR5CisgICAgIyBuYW1lIHJlbGF0aXZlIHRvIGEgcHJvdmlkZWQgbW9kdWxlPworICAgICMKKyAgICAjIFhYWCBTaG91bGQgcHJvYmFibHkgcmFpc2UgYSBWYWx1ZUVycm9yIGluc3RlYWQgb2YgYW4gQXR0cmlidXRlRXJyb3IKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fcmVsYXRpdmVfZW1wdHlfbmFtZShzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCcnLCB1bml0dGVzdCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJGYWlsZWQgdG8gcmFpc2UgQXR0cmlidXRlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjIC4uLgorICAgICMgIlRoZSBtZXRob2Qgb3B0aW9uYWxseSByZXNvbHZlcyBuYW1lIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBtb2R1bGUiCisgICAgIworICAgICMgV2hhdCBoYXBwZW5zIHdoZW4gYW4gaW1wb3NzaWJsZSBuYW1lIGlzIGdpdmVuLCByZWxhdGl2ZSB0byB0aGUgcHJvdmlkZWQKKyAgICAjIGBtb2R1bGVgPworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lX19yZWxhdGl2ZV9tYWxmb3JtZWRfbmFtZShzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgIyBYWFggU2hvdWxkIHRoaXMgcmFpc2UgQXR0cmlidXRlRXJyb3Igb3IgVmFsdWVFcnJvcj8KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCdhYmMgKCkgLy8nLCB1bml0dGVzdCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSBmYWlsZWQgdG8gcmFpc2UgVmFsdWVFcnJvciIpCisKKyAgICAjICJUaGUgbWV0aG9kIG9wdGlvbmFsbHkgcmVzb2x2ZXMgbmFtZSByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gbW9kdWxlIgorICAgICMKKyAgICAjIERvZXMgbG9hZFRlc3RzRnJvbU5hbWUgcmFpc2UgVHlwZUVycm9yIHdoZW4gdGhlIGBtb2R1bGVgIGFyZ3VtZW50CisgICAgIyBpc24ndCBhIG1vZHVsZSBvYmplY3Q/CisgICAgIworICAgICMgWFhYIEFjY2VwdHMgdGhlIG5vdC1hLW1vZHVsZSBvYmplY3QsIGlnbm9ybmluZyB0aGUgb2JqZWN0J3MgdHlwZQorICAgICMgVGhpcyBzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIG9yIHRoZSBtZXRob2QgbmFtZSBzaG91bGQgYmUgY2hhbmdlZAorICAgICMKKyAgICAjIFhYWCBTb21lIHBlb3BsZSBhcmUgcmVseWluZyBvbiB0aGlzLCBzbyBrZWVwIGl0IGZvciBub3cKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fcmVsYXRpdmVfbm90X2FfbW9kdWxlKHNlbGYpOgorICAgICAgICBjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBOb3RBTW9kdWxlKG9iamVjdCk6CisgICAgICAgICAgICB0ZXN0XzIgPSBNeVRlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCd0ZXN0XzInLCBOb3RBTW9kdWxlKQorCisgICAgICAgIHJlZmVyZW5jZSA9IFtNeVRlc3RDYXNlKCd0ZXN0JyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIHJlZmVyZW5jZSkKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIGVpdGhlciB0bworICAgICMgYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFRlc3RTdWl0ZSBpbnN0YW5jZSwgYSB0ZXN0IG1ldGhvZAorICAgICMgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEKKyAgICAjIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4iCisgICAgIworICAgICMgRG9lcyBpdCByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIG5hbWUgcmVzb2x2ZXMgdG8gYW4gaW52YWxpZAorICAgICMgb2JqZWN0PworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lX19yZWxhdGl2ZV9iYWRfb2JqZWN0KHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIG0udGVzdGNhc2VfMSA9IG9iamVjdCgpCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgndGVzdGNhc2VfMScsIG0pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBUeXBlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5CisgICAgIyByZXNvbHZlIGVpdGhlciB0byAuLi4gYSB0ZXN0IGNhc2UgY2xhc3MiCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVfX3JlbGF0aXZlX1Rlc3RDYXNlX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBtLnRlc3RjYXNlXzEgPSBNeVRlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCd0ZXN0Y2FzZV8xJywgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW015VGVzdENhc2UoJ3Rlc3QnKV0pCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSBlaXRoZXIgdG8KKyAgICAjIGEgbW9kdWxlLCBhIHRlc3QgY2FzZSBjbGFzcywgYSBUZXN0U3VpdGUgaW5zdGFuY2UsIGEgdGVzdCBtZXRob2QKKyAgICAjIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhCisgICAgIyBUZXN0Q2FzZSBvciBUZXN0U3VpdGUgaW5zdGFuY2UuIgorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lX19yZWxhdGl2ZV9UZXN0U3VpdGUoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgTXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIG0udGVzdHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtNeVRlc3RDYXNlKCd0ZXN0JyldKQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgndGVzdHN1aXRlJywgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbTXlUZXN0Q2FzZSgndGVzdCcpXSkKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIC4uLiB0bworICAgICMgLi4uIGEgdGVzdCBtZXRob2Qgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzIgorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lX19yZWxhdGl2ZV90ZXN0bWV0aG9kKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBtLnRlc3RjYXNlXzEgPSBNeVRlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCd0ZXN0Y2FzZV8xLnRlc3QnLCBtKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIGxvYWRlci5zdWl0ZUNsYXNzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFtNeVRlc3RDYXNlKCd0ZXN0JyldKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjCisgICAgIyBEb2VzIGxvYWRUZXN0c0Zyb21OYW1lKCkgcmFpc2UgdGhlIHByb3BlciBleGNlcHRpb24gd2hlbiB0cnlpbmcgdG8KKyAgICAjIHJlc29sdmUgImEgdGVzdCBtZXRob2Qgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzIiB0aGF0IGRvZXNuJ3QgZXhpc3QKKyAgICAjIGZvciB0aGUgZ2l2ZW4gbmFtZSAocmVsYXRpdmUgdG8gYSBwcm92aWRlZCBtb2R1bGUpPworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lX19yZWxhdGl2ZV9pbnZhbGlkX3Rlc3RtZXRob2Qoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgTXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIG0udGVzdGNhc2VfMSA9IE15VGVzdENhc2UKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCd0ZXN0Y2FzZV8xLnRlc3Rmb28nLCBtKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgInR5cGUgb2JqZWN0ICdNeVRlc3RDYXNlJyBoYXMgbm8gYXR0cmlidXRlICd0ZXN0Zm9vJyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkZhaWxlZCB0byByYWlzZSBBdHRyaWJ1dGVFcnJvciIpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSAuLi4gdG8KKyAgICAjIC4uLiBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEgLi4uIFRlc3RTdWl0ZSBpbnN0YW5jZSIKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fY2FsbGFibGVfX1Rlc3RTdWl0ZShzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICB0ZXN0Y2FzZV8xID0gdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZShsYW1iZGE6IE5vbmUpCisgICAgICAgIHRlc3RjYXNlXzIgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKyAgICAgICAgZGVmIHJldHVybl9UZXN0U3VpdGUoKToKKyAgICAgICAgICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoW3Rlc3RjYXNlXzEsIHRlc3RjYXNlXzJdKQorICAgICAgICBtLnJldHVybl9UZXN0U3VpdGUgPSByZXR1cm5fVGVzdFN1aXRlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCdyZXR1cm5fVGVzdFN1aXRlJywgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW3Rlc3RjYXNlXzEsIHRlc3RjYXNlXzJdKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgLi4uIHRvCisgICAgIyAuLi4gYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhIFRlc3RDYXNlIC4uLiBpbnN0YW5jZSIKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fY2FsbGFibGVfX1Rlc3RDYXNlX2luc3RhbmNlKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIHRlc3RjYXNlXzEgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKyAgICAgICAgZGVmIHJldHVybl9UZXN0Q2FzZSgpOgorICAgICAgICAgICAgcmV0dXJuIHRlc3RjYXNlXzEKKyAgICAgICAgbS5yZXR1cm5fVGVzdENhc2UgPSByZXR1cm5fVGVzdENhc2UKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ3JldHVybl9UZXN0Q2FzZScsIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFt0ZXN0Y2FzZV8xXSkKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIC4uLiB0bworICAgICMgLi4uIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYSBUZXN0Q2FzZSAuLi4gaW5zdGFuY2UiCisgICAgIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgI092ZXJyaWRlIHRoZSBzdWl0ZUNsYXNzIGF0dHJpYnV0ZSB0byBlbnN1cmUgdGhhdCB0aGUgc3VpdGVDbGFzcworICAgICNhdHRyaWJ1dGUgaXMgdXNlZAorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lX19jYWxsYWJsZV9fVGVzdENhc2VfaW5zdGFuY2VfUHJvcGVyU3VpdGVDbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgU3ViVGVzdFN1aXRlKHVuaXR0ZXN0LlRlc3RTdWl0ZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgdGVzdGNhc2VfMSA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorICAgICAgICBkZWYgcmV0dXJuX1Rlc3RDYXNlKCk6CisgICAgICAgICAgICByZXR1cm4gdGVzdGNhc2VfMQorICAgICAgICBtLnJldHVybl9UZXN0Q2FzZSA9IHJldHVybl9UZXN0Q2FzZQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBsb2FkZXIuc3VpdGVDbGFzcyA9IFN1YlRlc3RTdWl0ZQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgncmV0dXJuX1Rlc3RDYXNlJywgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW3Rlc3RjYXNlXzFdKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgLi4uIHRvCisgICAgIyAuLi4gYSB0ZXN0IG1ldGhvZCB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MiCisgICAgIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgI092ZXJyaWRlIHRoZSBzdWl0ZUNsYXNzIGF0dHJpYnV0ZSB0byBlbnN1cmUgdGhhdCB0aGUgc3VpdGVDbGFzcworICAgICNhdHRyaWJ1dGUgaXMgdXNlZAorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lX19yZWxhdGl2ZV90ZXN0bWV0aG9kX1Byb3BlclN1aXRlQ2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIFN1YlRlc3RTdWl0ZSh1bml0dGVzdC5UZXN0U3VpdGUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBtLnRlc3RjYXNlXzEgPSBNeVRlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIGxvYWRlci5zdWl0ZUNsYXNzPVN1YlRlc3RTdWl0ZQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgndGVzdGNhc2VfMS50ZXN0JywgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbTXlUZXN0Q2FzZSgndGVzdCcpXSkKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIC4uLiB0bworICAgICMgLi4uIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYSBUZXN0Q2FzZSBvciBUZXN0U3VpdGUgaW5zdGFuY2UiCisgICAgIworICAgICMgV2hhdCBoYXBwZW5zIGlmIHRoZSBjYWxsYWJsZSByZXR1cm5zIHNvbWV0aGluZyBlbHNlPworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lX19jYWxsYWJsZV9fd3JvbmdfdHlwZShzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBkZWYgcmV0dXJuX3dyb25nKCk6CisgICAgICAgICAgICByZXR1cm4gNgorICAgICAgICBtLnJldHVybl93cm9uZyA9IHJldHVybl93cm9uZworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ3JldHVybl93cm9uZycsIG0pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUgZmFpbGVkIHRvIHJhaXNlIFR5cGVFcnJvciIpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIGNhbiByZWZlciB0byBtb2R1bGVzIGFuZCBwYWNrYWdlcyB3aGljaCBoYXZlIG5vdCBiZWVuCisgICAgIyBpbXBvcnRlZDsgdGhleSB3aWxsIGJlIGltcG9ydGVkIGFzIGEgc2lkZS1lZmZlY3QiCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVfX21vZHVsZV9ub3RfbG9hZGVkKHNlbGYpOgorICAgICAgICAjIFdlJ3JlIGdvaW5nIHRvIHRyeSB0byBsb2FkIHRoaXMgbW9kdWxlIGFzIGEgc2lkZS1lZmZlY3QsIHNvIGl0CisgICAgICAgICMgYmV0dGVyIG5vdCBiZSBsb2FkZWQgYmVmb3JlIHdlIHRyeS4KKyAgICAgICAgIworICAgICAgICBtb2R1bGVfbmFtZSA9ICd1bml0dGVzdC50ZXN0LmR1bW15JworICAgICAgICBzeXMubW9kdWxlcy5wb3AobW9kdWxlX25hbWUsIE5vbmUpCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKG1vZHVsZV9uYW1lKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIGxvYWRlci5zdWl0ZUNsYXNzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW10pCisKKyAgICAgICAgICAgICMgbW9kdWxlIHNob3VsZCBub3cgYmUgbG9hZGVkLCB0aGFua3MgdG8gbG9hZFRlc3RzRnJvbU5hbWUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihtb2R1bGVfbmFtZSwgc3lzLm1vZHVsZXMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBtb2R1bGVfbmFtZSBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbW9kdWxlX25hbWVdCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyMjIFRlc3RzIGZvciBUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCkKKworICAgICMjIyBUZXN0cyBmb3IgVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoKQorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICMgIlNpbWlsYXIgdG8gbG9hZFRlc3RzRnJvbU5hbWUoKSwgYnV0IHRha2VzIGEgc2VxdWVuY2Ugb2YgbmFtZXMgcmF0aGVyCisgICAgIyB0aGFuIGEgc2luZ2xlIG5hbWUuIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyBpZiB0aGF0IHNlcXVlbmNlIG9mIG5hbWVzIGlzIGVtcHR5PworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lc19fZW1wdHlfbmFtZV9saXN0KHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFtdKQorCisgICAgIyAiU2ltaWxhciB0byBsb2FkVGVzdHNGcm9tTmFtZSgpLCBidXQgdGFrZXMgYSBzZXF1ZW5jZSBvZiBuYW1lcyByYXRoZXIKKyAgICAjIHRoYW4gYSBzaW5nbGUgbmFtZS4iCisgICAgIyAuLi4KKyAgICAjICJUaGUgbWV0aG9kIG9wdGlvbmFsbHkgcmVzb2x2ZXMgbmFtZSByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gbW9kdWxlIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyBpZiB0aGF0IHNlcXVlbmNlIG9mIG5hbWVzIGlzIGVtcHR5PworICAgICMKKyAgICAjIFhYWCBTaG91bGQgdGhpcyByYWlzZSBhIFZhbHVlRXJyb3Igb3IganVzdCByZXR1cm4gYW4gZW1wdHkgVGVzdFN1aXRlPworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lc19fcmVsYXRpdmVfZW1wdHlfbmFtZV9saXN0KHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoW10sIHVuaXR0ZXN0KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIGxvYWRlci5zdWl0ZUNsYXNzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbXSkKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIGVpdGhlciB0bworICAgICMgYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFRlc3RTdWl0ZSBpbnN0YW5jZSwgYSB0ZXN0IG1ldGhvZAorICAgICMgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEKKyAgICAjIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4iCisgICAgIworICAgICMgSXMgVmFsdWVFcnJvciByYWlzZWQgaW4gcmVzcG9uc2UgdG8gYW4gZW1wdHkgbmFtZT8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX2VtcHR5X25hbWUoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWycnXSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIkVtcHR5IG1vZHVsZSBuYW1lIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMgZmFpbGVkIHRvIHJhaXNlIFZhbHVlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgd2hlbiBwcmVzZW50ZWQgd2l0aCBhbiBpbXBvc3NpYmxlIG1vZHVsZSBuYW1lPworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lc19fbWFsZm9ybWVkX25hbWUoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgICMgWFhYIFNob3VsZCB0aGlzIHJhaXNlIFZhbHVlRXJyb3Igb3IgSW1wb3J0RXJyb3I/CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWydhYmMgKCkgLy8nXSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMgZmFpbGVkIHRvIHJhaXNlIFZhbHVlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgd2hlbiBubyBtb2R1bGUgY2FuIGJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gbmFtZT8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX3Vua25vd25fbW9kdWxlX25hbWUoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWydzZGFzZmFzZmFzZGYnXSkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICJObyBtb2R1bGUgbmFtZWQgc2Rhc2Zhc2Zhc2RmIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMgZmFpbGVkIHRvIHJhaXNlIEltcG9ydEVycm9yIikKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIGVpdGhlciB0bworICAgICMgYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFRlc3RTdWl0ZSBpbnN0YW5jZSwgYSB0ZXN0IG1ldGhvZAorICAgICMgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEKKyAgICAjIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4iCisgICAgIworICAgICMgV2hhdCBoYXBwZW5zIHdoZW4gdGhlIG1vZHVsZSBjYW4gYmUgZm91bmQsIGJ1dCBub3QgdGhlIGF0dHJpYnV0ZT8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX3Vua25vd25fYXR0cl9uYW1lKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsndW5pdHRlc3Quc2Rhc2Zhc2Zhc2RmJywgJ3VuaXR0ZXN0J10pCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGUpLCAiJ21vZHVsZScgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3NkYXNmYXNmYXNkZiciKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyBmYWlsZWQgdG8gcmFpc2UgQXR0cmlidXRlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjIC4uLgorICAgICMgIlRoZSBtZXRob2Qgb3B0aW9uYWxseSByZXNvbHZlcyBuYW1lIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBtb2R1bGUiCisgICAgIworICAgICMgV2hhdCBoYXBwZW5zIHdoZW4gZ2l2ZW4gYW4gdW5rbm93biBhdHRyaWJ1dGUgb24gYSBzcGVjaWZpZWQgYG1vZHVsZWAKKyAgICAjIGFyZ3VtZW50PworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lc19fdW5rbm93bl9uYW1lX3JlbGF0aXZlXzEoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWydzZGFzZmFzZmFzZGYnXSwgdW5pdHRlc3QpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGUpLCAiJ21vZHVsZScgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3NkYXNmYXNmYXNkZiciKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lIGZhaWxlZCB0byByYWlzZSBBdHRyaWJ1dGVFcnJvciIpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSBlaXRoZXIgdG8KKyAgICAjIGEgbW9kdWxlLCBhIHRlc3QgY2FzZSBjbGFzcywgYSBUZXN0U3VpdGUgaW5zdGFuY2UsIGEgdGVzdCBtZXRob2QKKyAgICAjIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhCisgICAgIyBUZXN0Q2FzZSBvciBUZXN0U3VpdGUgaW5zdGFuY2UuIgorICAgICMgLi4uCisgICAgIyAiVGhlIG1ldGhvZCBvcHRpb25hbGx5IHJlc29sdmVzIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG1vZHVsZSIKKyAgICAjCisgICAgIyBEbyB1bmtub3duIGF0dHJpYnV0ZXMgKHJlbGF0aXZlIHRvIGEgcHJvdmlkZWQgbW9kdWxlKSBzdGlsbCByYWlzZSBhbgorICAgICMgZXhjZXB0aW9uIGV2ZW4gaW4gdGhlIHByZXNlbmNlIG9mIHZhbGlkIGF0dHJpYnV0ZSBuYW1lcz8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX3Vua25vd25fbmFtZV9yZWxhdGl2ZV8yKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsnVGVzdENhc2UnLCAnc2Rhc2Zhc2Zhc2RmJ10sIHVuaXR0ZXN0KQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIidtb2R1bGUnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzZGFzZmFzZmFzZGYnIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSBmYWlsZWQgdG8gcmFpc2UgQXR0cmlidXRlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjIC4uLgorICAgICMgIlRoZSBtZXRob2Qgb3B0aW9uYWxseSByZXNvbHZlcyBuYW1lIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBtb2R1bGUiCisgICAgIworICAgICMgV2hhdCBoYXBwZW5zIHdoZW4gZmFjZWQgd2l0aCB0aGUgZW1wdHkgc3RyaW5nPworICAgICMKKyAgICAjIFhYWCBUaGlzIGN1cnJlbnRseSByYWlzZXMgQXR0cmlidXRlRXJyb3IsIHRob3VnaCBWYWx1ZUVycm9yIGlzIHByb2JhYmx5CisgICAgIyBtb3JlIGFwcHJvcHJpYXRlCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX19yZWxhdGl2ZV9lbXB0eV9uYW1lKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsnJ10sIHVuaXR0ZXN0KQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkZhaWxlZCB0byByYWlzZSBWYWx1ZUVycm9yIikKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIGVpdGhlciB0bworICAgICMgYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFRlc3RTdWl0ZSBpbnN0YW5jZSwgYSB0ZXN0IG1ldGhvZAorICAgICMgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEKKyAgICAjIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4iCisgICAgIyAuLi4KKyAgICAjICJUaGUgbWV0aG9kIG9wdGlvbmFsbHkgcmVzb2x2ZXMgbmFtZSByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gbW9kdWxlIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyB3aGVuIHByZXNlbnRlZCB3aXRoIGFuIGltcG9zc2libGUgYXR0cmlidXRlIG5hbWU/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX19yZWxhdGl2ZV9tYWxmb3JtZWRfbmFtZShzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgIyBYWFggU2hvdWxkIHRoaXMgcmFpc2UgQXR0cmlidXRlRXJyb3Igb3IgVmFsdWVFcnJvcj8KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ2FiYyAoKSAvLyddLCB1bml0dGVzdCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMgZmFpbGVkIHRvIHJhaXNlIFZhbHVlRXJyb3IiKQorCisgICAgIyAiVGhlIG1ldGhvZCBvcHRpb25hbGx5IHJlc29sdmVzIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG1vZHVsZSIKKyAgICAjCisgICAgIyBEb2VzIGxvYWRUZXN0c0Zyb21OYW1lcygpIG1ha2Ugc3VyZSB0aGUgcHJvdmlkZWQgYG1vZHVsZWAgaXMgaW4gZmFjdAorICAgICMgYSBtb2R1bGU/CisgICAgIworICAgICMgWFhYIFRoaXMgdmFsaWRhdGlvbiBpcyBjdXJyZW50bHkgbm90IGRvbmUuIFRoaXMgZmxleGliaWxpdHkgc2hvdWxkCisgICAgIyBlaXRoZXIgYmUgZG9jdW1lbnRlZCBvciBhIFR5cGVFcnJvciBzaG91bGQgYmUgcmFpc2VkLgorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lc19fcmVsYXRpdmVfbm90X2FfbW9kdWxlKHNlbGYpOgorICAgICAgICBjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBOb3RBTW9kdWxlKG9iamVjdCk6CisgICAgICAgICAgICB0ZXN0XzIgPSBNeVRlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ3Rlc3RfMiddLCBOb3RBTW9kdWxlKQorCisgICAgICAgIHJlZmVyZW5jZSA9IFt1bml0dGVzdC5UZXN0U3VpdGUoW015VGVzdENhc2UoJ3Rlc3QnKV0pXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCByZWZlcmVuY2UpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSBlaXRoZXIgdG8KKyAgICAjIGEgbW9kdWxlLCBhIHRlc3QgY2FzZSBjbGFzcywgYSBUZXN0U3VpdGUgaW5zdGFuY2UsIGEgdGVzdCBtZXRob2QKKyAgICAjIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhCisgICAgIyBUZXN0Q2FzZSBvciBUZXN0U3VpdGUgaW5zdGFuY2UuIgorICAgICMKKyAgICAjIERvZXMgaXQgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBuYW1lIHJlc29sdmVzIHRvIGFuIGludmFsaWQKKyAgICAjIG9iamVjdD8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX3JlbGF0aXZlX2JhZF9vYmplY3Qoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgbS50ZXN0Y2FzZV8xID0gb2JqZWN0KCkKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ3Rlc3RjYXNlXzEnXSwgbSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIFR5cGVFcnJvciIpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSAuLi4gdG8KKyAgICAjIC4uLiBhIHRlc3QgY2FzZSBjbGFzcyIKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX3JlbGF0aXZlX1Rlc3RDYXNlX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBtLnRlc3RjYXNlXzEgPSBNeVRlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ3Rlc3RjYXNlXzEnXSwgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKworICAgICAgICBleHBlY3RlZCA9IGxvYWRlci5zdWl0ZUNsYXNzKFtNeVRlc3RDYXNlKCd0ZXN0JyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbZXhwZWN0ZWRdKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgLi4uIHRvCisgICAgIyAuLi4gYSBUZXN0U3VpdGUgaW5zdGFuY2UiCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX19yZWxhdGl2ZV9UZXN0U3VpdGUoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgTXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIG0udGVzdHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtNeVRlc3RDYXNlKCd0ZXN0JyldKQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWyd0ZXN0c3VpdGUnXSwgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbbS50ZXN0c3VpdGVdKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgLi4uIHRvIC4uLiBhCisgICAgIyB0ZXN0IG1ldGhvZCB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MiCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX19yZWxhdGl2ZV90ZXN0bWV0aG9kKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBtLnRlc3RjYXNlXzEgPSBNeVRlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ3Rlc3RjYXNlXzEudGVzdCddLCBtKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIGxvYWRlci5zdWl0ZUNsYXNzKQorCisgICAgICAgIHJlZl9zdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbTXlUZXN0Q2FzZSgndGVzdCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW3JlZl9zdWl0ZV0pCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSAuLi4gdG8gLi4uIGEKKyAgICAjIHRlc3QgbWV0aG9kIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcyIKKyAgICAjCisgICAgIyBEb2VzIHRoZSBtZXRob2QgZ3JhY2VmdWxseSBoYW5kbGUgbmFtZXMgdGhhdCBpbml0aWFsbHkgbG9vayBsaWtlIHRoZXkKKyAgICAjIHJlc29sdmUgdG8gImEgdGVzdCBtZXRob2Qgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzIiBidXQgZG9uJ3Q/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX19yZWxhdGl2ZV9pbnZhbGlkX3Rlc3RtZXRob2Qoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgTXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIG0udGVzdGNhc2VfMSA9IE15VGVzdENhc2UKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ3Rlc3RjYXNlXzEudGVzdGZvbyddLCBtKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgInR5cGUgb2JqZWN0ICdNeVRlc3RDYXNlJyBoYXMgbm8gYXR0cmlidXRlICd0ZXN0Zm9vJyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkZhaWxlZCB0byByYWlzZSBBdHRyaWJ1dGVFcnJvciIpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSAuLi4gdG8KKyAgICAjIC4uLiBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEgLi4uIFRlc3RTdWl0ZSBpbnN0YW5jZSIKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX2NhbGxhYmxlX19UZXN0U3VpdGUoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgdGVzdGNhc2VfMSA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorICAgICAgICB0ZXN0Y2FzZV8yID0gdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZShsYW1iZGE6IE5vbmUpCisgICAgICAgIGRlZiByZXR1cm5fVGVzdFN1aXRlKCk6CisgICAgICAgICAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKFt0ZXN0Y2FzZV8xLCB0ZXN0Y2FzZV8yXSkKKyAgICAgICAgbS5yZXR1cm5fVGVzdFN1aXRlID0gcmV0dXJuX1Rlc3RTdWl0ZQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWydyZXR1cm5fVGVzdFN1aXRlJ10sIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisKKyAgICAgICAgZXhwZWN0ZWQgPSB1bml0dGVzdC5UZXN0U3VpdGUoW3Rlc3RjYXNlXzEsIHRlc3RjYXNlXzJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbZXhwZWN0ZWRdKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgLi4uIHRvCisgICAgIyAuLi4gYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhIFRlc3RDYXNlIC4uLiBpbnN0YW5jZSIKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX2NhbGxhYmxlX19UZXN0Q2FzZV9pbnN0YW5jZShzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICB0ZXN0Y2FzZV8xID0gdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZShsYW1iZGE6IE5vbmUpCisgICAgICAgIGRlZiByZXR1cm5fVGVzdENhc2UoKToKKyAgICAgICAgICAgIHJldHVybiB0ZXN0Y2FzZV8xCisgICAgICAgIG0ucmV0dXJuX1Rlc3RDYXNlID0gcmV0dXJuX1Rlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ3JldHVybl9UZXN0Q2FzZSddLCBtKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIGxvYWRlci5zdWl0ZUNsYXNzKQorCisgICAgICAgIHJlZl9zdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbdGVzdGNhc2VfMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFtyZWZfc3VpdGVdKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgLi4uIHRvCisgICAgIyAuLi4gYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZSIKKyAgICAjCisgICAgIyBBcmUgc3RhdGljbWV0aG9kcyBoYW5kbGVkIGNvcnJlY3RseT8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX2NhbGxhYmxlX19jYWxsX3N0YXRpY21ldGhvZChzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBUZXN0MSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdGVzdGNhc2VfMSA9IFRlc3QxKCd0ZXN0JykKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiBmb28oKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVzdGNhc2VfMQorICAgICAgICBtLkZvbyA9IEZvbworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWydGb28uZm9vJ10sIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisKKyAgICAgICAgcmVmX3N1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFt0ZXN0Y2FzZV8xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW3JlZl9zdWl0ZV0pCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSAuLi4gdG8KKyAgICAjIC4uLiBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyB3aGVuIHRoZSBjYWxsYWJsZSByZXR1cm5zIHNvbWV0aGluZyBlbHNlPworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lc19fY2FsbGFibGVfX3dyb25nX3R5cGUoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgZGVmIHJldHVybl93cm9uZygpOgorICAgICAgICAgICAgcmV0dXJuIDYKKyAgICAgICAgbS5yZXR1cm5fd3JvbmcgPSByZXR1cm5fd3JvbmcKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ3JldHVybl93cm9uZyddLCBtKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyBmYWlsZWQgdG8gcmFpc2UgVHlwZUVycm9yIikKKworICAgICMgIlRoZSBzcGVjaWZpZXIgY2FuIHJlZmVyIHRvIG1vZHVsZXMgYW5kIHBhY2thZ2VzIHdoaWNoIGhhdmUgbm90IGJlZW4KKyAgICAjIGltcG9ydGVkOyB0aGV5IHdpbGwgYmUgaW1wb3J0ZWQgYXMgYSBzaWRlLWVmZmVjdCIKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX21vZHVsZV9ub3RfbG9hZGVkKHNlbGYpOgorICAgICAgICAjIFdlJ3JlIGdvaW5nIHRvIHRyeSB0byBsb2FkIHRoaXMgbW9kdWxlIGFzIGEgc2lkZS1lZmZlY3QsIHNvIGl0CisgICAgICAgICMgYmV0dGVyIG5vdCBiZSBsb2FkZWQgYmVmb3JlIHdlIHRyeS4KKyAgICAgICAgIworICAgICAgICBtb2R1bGVfbmFtZSA9ICd1bml0dGVzdC50ZXN0LmR1bW15JworICAgICAgICBzeXMubW9kdWxlcy5wb3AobW9kdWxlX25hbWUsIE5vbmUpCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbbW9kdWxlX25hbWVdKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIGxvYWRlci5zdWl0ZUNsYXNzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW3VuaXR0ZXN0LlRlc3RTdWl0ZSgpXSkKKworICAgICAgICAgICAgIyBtb2R1bGUgc2hvdWxkIG5vdyBiZSBsb2FkZWQsIHRoYW5rcyB0byBsb2FkVGVzdHNGcm9tTmFtZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKG1vZHVsZV9uYW1lLCBzeXMubW9kdWxlcykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG1vZHVsZV9uYW1lIGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0KKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIyMgL1Rlc3RzIGZvciBUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcygpCisKKyAgICAjIyMgVGVzdHMgZm9yIFRlc3RMb2FkZXIuZ2V0VGVzdENhc2VOYW1lcygpCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgIyAiUmV0dXJuIGEgc29ydGVkIHNlcXVlbmNlIG9mIG1ldGhvZCBuYW1lcyBmb3VuZCB3aXRoaW4gdGVzdENhc2VDbGFzcyIKKyAgICAjCisgICAgIyBUZXN0LmZvb2JhciBpcyBkZWZpbmVkIHRvIG1ha2Ugc3VyZSBnZXRUZXN0Q2FzZU5hbWVzKCkgcmVzcGVjdHMKKyAgICAjIGxvYWRlci50ZXN0TWV0aG9kUHJlZml4CisgICAgZGVmIHRlc3RfZ2V0VGVzdENhc2VOYW1lcyhzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgZm9vYmFyKHNlbGYpOiBwYXNzCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIuZ2V0VGVzdENhc2VOYW1lcyhUZXN0KSwgWyd0ZXN0XzEnLCAndGVzdF8yJ10pCisKKyAgICAjICJSZXR1cm4gYSBzb3J0ZWQgc2VxdWVuY2Ugb2YgbWV0aG9kIG5hbWVzIGZvdW5kIHdpdGhpbiB0ZXN0Q2FzZUNsYXNzIgorICAgICMKKyAgICAjIERvZXMgZ2V0VGVzdENhc2VOYW1lcygpIGJlaGF2ZSBhcHByb3ByaWF0ZWx5IGlmIG5vIHRlc3RzIGFyZSBmb3VuZD8KKyAgICBkZWYgdGVzdF9nZXRUZXN0Q2FzZU5hbWVzX19ub190ZXN0cyhzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgZm9vYmFyKHNlbGYpOiBwYXNzCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIuZ2V0VGVzdENhc2VOYW1lcyhUZXN0KSwgW10pCisKKyAgICAjICJSZXR1cm4gYSBzb3J0ZWQgc2VxdWVuY2Ugb2YgbWV0aG9kIG5hbWVzIGZvdW5kIHdpdGhpbiB0ZXN0Q2FzZUNsYXNzIgorICAgICMKKyAgICAjIEFyZSBub3QtVGVzdENhc2VzIGhhbmRsZWQgZ3JhY2VmdWxseT8KKyAgICAjCisgICAgIyBYWFggVGhpcyBzaG91bGQgcmFpc2UgYSBUeXBlRXJyb3IsIG5vdCByZXR1cm4gYSBsaXN0CisgICAgIworICAgICMgWFhYIEl0J3MgdG9vIGxhdGUgaW4gdGhlIDIuNSByZWxlYXNlIGN5Y2xlIHRvIGZpeCB0aGlzLCBidXQgaXQgc2hvdWxkCisgICAgIyBwcm9iYWJseSBiZSByZXZpc2l0ZWQgZm9yIDIuNgorICAgIGRlZiB0ZXN0X2dldFRlc3RDYXNlTmFtZXNfX25vdF9hX1Rlc3RDYXNlKHNlbGYpOgorICAgICAgICBjbGFzcyBCYWRDYXNlKGludCk6CisgICAgICAgICAgICBkZWYgdGVzdF9mb28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBuYW1lcyA9IGxvYWRlci5nZXRUZXN0Q2FzZU5hbWVzKEJhZENhc2UpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lcywgWyd0ZXN0X2ZvbyddKQorCisgICAgIyAiUmV0dXJuIGEgc29ydGVkIHNlcXVlbmNlIG9mIG1ldGhvZCBuYW1lcyBmb3VuZCB3aXRoaW4gdGVzdENhc2VDbGFzcyIKKyAgICAjCisgICAgIyBNYWtlIHN1cmUgaW5oZXJpdGVkIG5hbWVzIGFyZSBoYW5kbGVkLgorICAgICMKKyAgICAjIFRlc3RQLmZvb2JhciBpcyBkZWZpbmVkIHRvIG1ha2Ugc3VyZSBnZXRUZXN0Q2FzZU5hbWVzKCkgcmVzcGVjdHMKKyAgICAjIGxvYWRlci50ZXN0TWV0aG9kUHJlZml4CisgICAgZGVmIHRlc3RfZ2V0VGVzdENhc2VOYW1lc19faW5oZXJpdGFuY2Uoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3RQKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0XzIoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBmb29iYXIoc2VsZik6IHBhc3MKKworICAgICAgICBjbGFzcyBUZXN0QyhUZXN0UCk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8zKHNlbGYpOiBwYXNzCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgbmFtZXMgPSBbJ3Rlc3RfMScsICd0ZXN0XzInLCAndGVzdF8zJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIuZ2V0VGVzdENhc2VOYW1lcyhUZXN0QyksIG5hbWVzKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMjIyAvVGVzdHMgZm9yIFRlc3RMb2FkZXIuZ2V0VGVzdENhc2VOYW1lcygpCisKKyAgICAjIyMgVGVzdHMgZm9yIFRlc3RMb2FkZXIudGVzdE1ldGhvZFByZWZpeAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICMgIlN0cmluZyBnaXZpbmcgdGhlIHByZWZpeCBvZiBtZXRob2QgbmFtZXMgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcworICAgICMgdGVzdCBtZXRob2RzIgorICAgICMKKyAgICAjIEltcGxpY2l0IGluIHRoZSBkb2N1bWVudGF0aW9uIGlzIHRoYXQgdGVzdE1ldGhvZFByZWZpeCBpcyByZXNwZWN0ZWQgYnkKKyAgICAjIGFsbCBsb2FkVGVzdHNGcm9tKiBtZXRob2RzLgorICAgIGRlZiB0ZXN0X3Rlc3RNZXRob2RQcmVmaXhfX2xvYWRUZXN0c0Zyb21UZXN0Q2FzZShzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0XzIoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBmb29fYmFyKHNlbGYpOiBwYXNzCisKKyAgICAgICAgdGVzdHNfMSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbRm9vKCdmb29fYmFyJyldKQorICAgICAgICB0ZXN0c18yID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtGb28oJ3Rlc3RfMScpLCBGb28oJ3Rlc3RfMicpXSkKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgbG9hZGVyLnRlc3RNZXRob2RQcmVmaXggPSAnZm9vJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoRm9vKSwgdGVzdHNfMSkKKworICAgICAgICBsb2FkZXIudGVzdE1ldGhvZFByZWZpeCA9ICd0ZXN0JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoRm9vKSwgdGVzdHNfMikKKworICAgICMgIlN0cmluZyBnaXZpbmcgdGhlIHByZWZpeCBvZiBtZXRob2QgbmFtZXMgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcworICAgICMgdGVzdCBtZXRob2RzIgorICAgICMKKyAgICAjIEltcGxpY2l0IGluIHRoZSBkb2N1bWVudGF0aW9uIGlzIHRoYXQgdGVzdE1ldGhvZFByZWZpeCBpcyByZXNwZWN0ZWQgYnkKKyAgICAjIGFsbCBsb2FkVGVzdHNGcm9tKiBtZXRob2RzLgorICAgIGRlZiB0ZXN0X3Rlc3RNZXRob2RQcmVmaXhfX2xvYWRUZXN0c0Zyb21Nb2R1bGUoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0XzIoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBmb29fYmFyKHNlbGYpOiBwYXNzCisgICAgICAgIG0uRm9vID0gRm9vCisKKyAgICAgICAgdGVzdHNfMSA9IFt1bml0dGVzdC5UZXN0U3VpdGUoW0ZvbygnZm9vX2JhcicpXSldCisgICAgICAgIHRlc3RzXzIgPSBbdW5pdHRlc3QuVGVzdFN1aXRlKFtGb28oJ3Rlc3RfMScpLCBGb28oJ3Rlc3RfMicpXSldCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIGxvYWRlci50ZXN0TWV0aG9kUHJlZml4ID0gJ2ZvbycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKG0pKSwgdGVzdHNfMSkKKworICAgICAgICBsb2FkZXIudGVzdE1ldGhvZFByZWZpeCA9ICd0ZXN0JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUobSkpLCB0ZXN0c18yKQorCisgICAgIyAiU3RyaW5nIGdpdmluZyB0aGUgcHJlZml4IG9mIG1ldGhvZCBuYW1lcyB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzCisgICAgIyB0ZXN0IG1ldGhvZHMiCisgICAgIworICAgICMgSW1wbGljaXQgaW4gdGhlIGRvY3VtZW50YXRpb24gaXMgdGhhdCB0ZXN0TWV0aG9kUHJlZml4IGlzIHJlc3BlY3RlZCBieQorICAgICMgYWxsIGxvYWRUZXN0c0Zyb20qIG1ldGhvZHMuCisgICAgZGVmIHRlc3RfdGVzdE1ldGhvZFByZWZpeF9fbG9hZFRlc3RzRnJvbU5hbWUoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0XzIoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBmb29fYmFyKHNlbGYpOiBwYXNzCisgICAgICAgIG0uRm9vID0gRm9vCisKKyAgICAgICAgdGVzdHNfMSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbRm9vKCdmb29fYmFyJyldKQorICAgICAgICB0ZXN0c18yID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtGb28oJ3Rlc3RfMScpLCBGb28oJ3Rlc3RfMicpXSkKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgbG9hZGVyLnRlc3RNZXRob2RQcmVmaXggPSAnZm9vJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgnRm9vJywgbSksIHRlc3RzXzEpCisKKyAgICAgICAgbG9hZGVyLnRlc3RNZXRob2RQcmVmaXggPSAndGVzdCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ0ZvbycsIG0pLCB0ZXN0c18yKQorCisgICAgIyAiU3RyaW5nIGdpdmluZyB0aGUgcHJlZml4IG9mIG1ldGhvZCBuYW1lcyB3aGljaCB3aWxsIGJlIGludGVycHJldGVkIGFzCisgICAgIyB0ZXN0IG1ldGhvZHMiCisgICAgIworICAgICMgSW1wbGljaXQgaW4gdGhlIGRvY3VtZW50YXRpb24gaXMgdGhhdCB0ZXN0TWV0aG9kUHJlZml4IGlzIHJlc3BlY3RlZCBieQorICAgICMgYWxsIGxvYWRUZXN0c0Zyb20qIG1ldGhvZHMuCisgICAgZGVmIHRlc3RfdGVzdE1ldGhvZFByZWZpeF9fbG9hZFRlc3RzRnJvbU5hbWVzKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgZm9vX2JhcihzZWxmKTogcGFzcworICAgICAgICBtLkZvbyA9IEZvbworCisgICAgICAgIHRlc3RzXzEgPSB1bml0dGVzdC5UZXN0U3VpdGUoW3VuaXR0ZXN0LlRlc3RTdWl0ZShbRm9vKCdmb29fYmFyJyldKV0pCisgICAgICAgIHRlc3RzXzIgPSB1bml0dGVzdC5UZXN0U3VpdGUoW0ZvbygndGVzdF8xJyksIEZvbygndGVzdF8yJyldKQorICAgICAgICB0ZXN0c18yID0gdW5pdHRlc3QuVGVzdFN1aXRlKFt0ZXN0c18yXSkKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgbG9hZGVyLnRlc3RNZXRob2RQcmVmaXggPSAnZm9vJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWydGb28nXSwgbSksIHRlc3RzXzEpCisKKyAgICAgICAgbG9hZGVyLnRlc3RNZXRob2RQcmVmaXggPSAndGVzdCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsnRm9vJ10sIG0pLCB0ZXN0c18yKQorCisgICAgIyAiVGhlIGRlZmF1bHQgdmFsdWUgaXMgJ3Rlc3QnIgorICAgIGRlZiB0ZXN0X3Rlc3RNZXRob2RQcmVmaXhfX2RlZmF1bHRfdmFsdWUoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobG9hZGVyLnRlc3RNZXRob2RQcmVmaXggPT0gJ3Rlc3QnKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMjIyAvVGVzdHMgZm9yIFRlc3RMb2FkZXIudGVzdE1ldGhvZFByZWZpeAorCisgICAgIyMjIFRlc3RzIGZvciBUZXN0TG9hZGVyLnNvcnRUZXN0TWV0aG9kc1VzaW5nCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgIyAiRnVuY3Rpb24gdG8gYmUgdXNlZCB0byBjb21wYXJlIG1ldGhvZCBuYW1lcyB3aGVuIHNvcnRpbmcgdGhlbSBpbgorICAgICMgZ2V0VGVzdENhc2VOYW1lcygpIGFuZCBhbGwgdGhlIGxvYWRUZXN0c0Zyb21YKCkgbWV0aG9kcyIKKyAgICBkZWYgdGVzdF9zb3J0VGVzdE1ldGhvZHNVc2luZ19fbG9hZFRlc3RzRnJvbVRlc3RDYXNlKHNlbGYpOgorICAgICAgICBkZWYgcmV2ZXJzZWRfY21wKHgsIHkpOgorICAgICAgICAgICAgcmV0dXJuIC1jbXAoeCwgeSkKKworICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBsb2FkZXIuc29ydFRlc3RNZXRob2RzVXNpbmcgPSByZXZlcnNlZF9jbXAKKworICAgICAgICB0ZXN0cyA9IGxvYWRlci5zdWl0ZUNsYXNzKFtGb28oJ3Rlc3RfMicpLCBGb28oJ3Rlc3RfMScpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEZvbyksIHRlc3RzKQorCisgICAgIyAiRnVuY3Rpb24gdG8gYmUgdXNlZCB0byBjb21wYXJlIG1ldGhvZCBuYW1lcyB3aGVuIHNvcnRpbmcgdGhlbSBpbgorICAgICMgZ2V0VGVzdENhc2VOYW1lcygpIGFuZCBhbGwgdGhlIGxvYWRUZXN0c0Zyb21YKCkgbWV0aG9kcyIKKyAgICBkZWYgdGVzdF9zb3J0VGVzdE1ldGhvZHNVc2luZ19fbG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmKToKKyAgICAgICAgZGVmIHJldmVyc2VkX2NtcCh4LCB5KToKKyAgICAgICAgICAgIHJldHVybiAtY21wKHgsIHkpCisKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworICAgICAgICBtLkZvbyA9IEZvbworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBsb2FkZXIuc29ydFRlc3RNZXRob2RzVXNpbmcgPSByZXZlcnNlZF9jbXAKKworICAgICAgICB0ZXN0cyA9IFtsb2FkZXIuc3VpdGVDbGFzcyhbRm9vKCd0ZXN0XzInKSwgRm9vKCd0ZXN0XzEnKV0pXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUobSkpLCB0ZXN0cykKKworICAgICMgIkZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gY29tcGFyZSBtZXRob2QgbmFtZXMgd2hlbiBzb3J0aW5nIHRoZW0gaW4KKyAgICAjIGdldFRlc3RDYXNlTmFtZXMoKSBhbmQgYWxsIHRoZSBsb2FkVGVzdHNGcm9tWCgpIG1ldGhvZHMiCisgICAgZGVmIHRlc3Rfc29ydFRlc3RNZXRob2RzVXNpbmdfX2xvYWRUZXN0c0Zyb21OYW1lKHNlbGYpOgorICAgICAgICBkZWYgcmV2ZXJzZWRfY21wKHgsIHkpOgorICAgICAgICAgICAgcmV0dXJuIC1jbXAoeCwgeSkKKworICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgIG0uRm9vID0gRm9vCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIGxvYWRlci5zb3J0VGVzdE1ldGhvZHNVc2luZyA9IHJldmVyc2VkX2NtcAorCisgICAgICAgIHRlc3RzID0gbG9hZGVyLnN1aXRlQ2xhc3MoW0ZvbygndGVzdF8yJyksIEZvbygndGVzdF8xJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgnRm9vJywgbSksIHRlc3RzKQorCisgICAgIyAiRnVuY3Rpb24gdG8gYmUgdXNlZCB0byBjb21wYXJlIG1ldGhvZCBuYW1lcyB3aGVuIHNvcnRpbmcgdGhlbSBpbgorICAgICMgZ2V0VGVzdENhc2VOYW1lcygpIGFuZCBhbGwgdGhlIGxvYWRUZXN0c0Zyb21YKCkgbWV0aG9kcyIKKyAgICBkZWYgdGVzdF9zb3J0VGVzdE1ldGhvZHNVc2luZ19fbG9hZFRlc3RzRnJvbU5hbWVzKHNlbGYpOgorICAgICAgICBkZWYgcmV2ZXJzZWRfY21wKHgsIHkpOgorICAgICAgICAgICAgcmV0dXJuIC1jbXAoeCwgeSkKKworICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgIG0uRm9vID0gRm9vCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIGxvYWRlci5zb3J0VGVzdE1ldGhvZHNVc2luZyA9IHJldmVyc2VkX2NtcAorCisgICAgICAgIHRlc3RzID0gW2xvYWRlci5zdWl0ZUNsYXNzKFtGb28oJ3Rlc3RfMicpLCBGb28oJ3Rlc3RfMScpXSldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsnRm9vJ10sIG0pKSwgdGVzdHMpCisKKyAgICAjICJGdW5jdGlvbiB0byBiZSB1c2VkIHRvIGNvbXBhcmUgbWV0aG9kIG5hbWVzIHdoZW4gc29ydGluZyB0aGVtIGluCisgICAgIyBnZXRUZXN0Q2FzZU5hbWVzKCkiCisgICAgIworICAgICMgRG9lcyBpdCBhY3R1YWxseSBhZmZlY3QgZ2V0VGVzdENhc2VOYW1lcygpPworICAgIGRlZiB0ZXN0X3NvcnRUZXN0TWV0aG9kc1VzaW5nX19nZXRUZXN0Q2FzZU5hbWVzKHNlbGYpOgorICAgICAgICBkZWYgcmV2ZXJzZWRfY21wKHgsIHkpOgorICAgICAgICAgICAgcmV0dXJuIC1jbXAoeCwgeSkKKworICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBsb2FkZXIuc29ydFRlc3RNZXRob2RzVXNpbmcgPSByZXZlcnNlZF9jbXAKKworICAgICAgICB0ZXN0X25hbWVzID0gWyd0ZXN0XzInLCAndGVzdF8xJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIuZ2V0VGVzdENhc2VOYW1lcyhGb28pLCB0ZXN0X25hbWVzKQorCisgICAgIyAiVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIGJ1aWx0LWluIGNtcCgpIGZ1bmN0aW9uIgorICAgIGRlZiB0ZXN0X3NvcnRUZXN0TWV0aG9kc1VzaW5nX19kZWZhdWx0X3ZhbHVlKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvYWRlci5zb3J0VGVzdE1ldGhvZHNVc2luZyBpcyBjbXApCisKKyAgICAjICJpdCBjYW4gYmUgc2V0IHRvIE5vbmUgdG8gZGlzYWJsZSB0aGUgc29ydC4iCisgICAgIworICAgICMgWFhYIEhvdyBpcyB0aGlzIGRpZmZlcmVudCBmcm9tIHJlYXNzaWduaW5nIGNtcD8gQXJlIHRoZSB0ZXN0cyByZXR1cm5lZAorICAgICMgaW4gYSByYW5kb20gb3JkZXIgb3Igc29tZXRoaW5nPyBUaGlzIGJlaGF2aW91ciBzaG91bGQgZGllCisgICAgZGVmIHRlc3Rfc29ydFRlc3RNZXRob2RzVXNpbmdfX05vbmUoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIGxvYWRlci5zb3J0VGVzdE1ldGhvZHNVc2luZyA9IE5vbmUKKworICAgICAgICB0ZXN0X25hbWVzID0gWyd0ZXN0XzInLCAndGVzdF8xJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobG9hZGVyLmdldFRlc3RDYXNlTmFtZXMoRm9vKSksIHNldCh0ZXN0X25hbWVzKSkKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIyMgL1Rlc3RzIGZvciBUZXN0TG9hZGVyLnNvcnRUZXN0TWV0aG9kc1VzaW5nCisKKyAgICAjIyMgVGVzdHMgZm9yIFRlc3RMb2FkZXIuc3VpdGVDbGFzcworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICMgIkNhbGxhYmxlIG9iamVjdCB0aGF0IGNvbnN0cnVjdHMgYSB0ZXN0IHN1aXRlIGZyb20gYSBsaXN0IG9mIHRlc3RzLiIKKyAgICBkZWYgdGVzdF9zdWl0ZUNsYXNzX19sb2FkVGVzdHNGcm9tVGVzdENhc2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgZm9vX2JhcihzZWxmKTogcGFzcworCisgICAgICAgIHRlc3RzID0gW0ZvbygndGVzdF8xJyksIEZvbygndGVzdF8yJyldCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIGxvYWRlci5zdWl0ZUNsYXNzID0gbGlzdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoRm9vKSwgdGVzdHMpCisKKyAgICAjIEl0IGlzIGltcGxpY2l0IGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBUZXN0TG9hZGVyLnN1aXRlQ2xhc3MgdGhhdAorICAgICMgYWxsIFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbSogbWV0aG9kcyByZXNwZWN0IGl0LiBMZXQncyBtYWtlIHN1cmUKKyAgICBkZWYgdGVzdF9zdWl0ZUNsYXNzX19sb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgZm9vX2JhcihzZWxmKTogcGFzcworICAgICAgICBtLkZvbyA9IEZvbworCisgICAgICAgIHRlc3RzID0gW1tGb28oJ3Rlc3RfMScpLCBGb28oJ3Rlc3RfMicpXV0KKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgbG9hZGVyLnN1aXRlQ2xhc3MgPSBsaXN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUobSksIHRlc3RzKQorCisgICAgIyBJdCBpcyBpbXBsaWNpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgVGVzdExvYWRlci5zdWl0ZUNsYXNzIHRoYXQKKyAgICAjIGFsbCBUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb20qIG1ldGhvZHMgcmVzcGVjdCBpdC4gTGV0J3MgbWFrZSBzdXJlCisgICAgZGVmIHRlc3Rfc3VpdGVDbGFzc19fbG9hZFRlc3RzRnJvbU5hbWUoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0XzIoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBmb29fYmFyKHNlbGYpOiBwYXNzCisgICAgICAgIG0uRm9vID0gRm9vCisKKyAgICAgICAgdGVzdHMgPSBbRm9vKCd0ZXN0XzEnKSwgRm9vKCd0ZXN0XzInKV0KKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgbG9hZGVyLnN1aXRlQ2xhc3MgPSBsaXN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCdGb28nLCBtKSwgdGVzdHMpCisKKyAgICAjIEl0IGlzIGltcGxpY2l0IGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBUZXN0TG9hZGVyLnN1aXRlQ2xhc3MgdGhhdAorICAgICMgYWxsIFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbSogbWV0aG9kcyByZXNwZWN0IGl0LiBMZXQncyBtYWtlIHN1cmUKKyAgICBkZWYgdGVzdF9zdWl0ZUNsYXNzX19sb2FkVGVzdHNGcm9tTmFtZXMoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0XzIoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBmb29fYmFyKHNlbGYpOiBwYXNzCisgICAgICAgIG0uRm9vID0gRm9vCisKKyAgICAgICAgdGVzdHMgPSBbW0ZvbygndGVzdF8xJyksIEZvbygndGVzdF8yJyldXQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBsb2FkZXIuc3VpdGVDbGFzcyA9IGxpc3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsnRm9vJ10sIG0pLCB0ZXN0cykKKworICAgICMgIlRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSBUZXN0U3VpdGUgY2xhc3MiCisgICAgZGVmIHRlc3Rfc3VpdGVDbGFzc19fZGVmYXVsdF92YWx1ZShzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2FkZXIuc3VpdGVDbGFzcyBpcyB1bml0dGVzdC5UZXN0U3VpdGUpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2xvYWRlci5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9sb2FkZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjJhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9sb2FkZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2xvYWRlci5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9sb2FkZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZjJhMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9sb2FkZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Byb2dyYW0ucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9wcm9ncmFtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDkwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9wcm9ncmFtLnB5CkBAIC0wLDAgKzEsMjU1IEBACitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBUZXN0X1Rlc3RQcm9ncmFtKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Rpc2NvdmVyeV9mcm9tX2RvdHRlZF9wYXRoKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICB0ZXN0cyA9IFtzZWxmXQorICAgICAgICBleHBlY3RlZFBhdGggPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKHVuaXR0ZXN0LnRlc3QuX19maWxlX18pKQorCisgICAgICAgIHNlbGYud2FzUnVuID0gRmFsc2UKKyAgICAgICAgZGVmIF9maW5kX3Rlc3RzKHN0YXJ0X2RpciwgcGF0dGVybik6CisgICAgICAgICAgICBzZWxmLndhc1J1biA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhcnRfZGlyLCBleHBlY3RlZFBhdGgpCisgICAgICAgICAgICByZXR1cm4gdGVzdHMKKyAgICAgICAgbG9hZGVyLl9maW5kX3Rlc3RzID0gX2ZpbmRfdGVzdHMKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIuZGlzY292ZXIoJ3VuaXR0ZXN0LnRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi53YXNSdW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGUuX3Rlc3RzLCB0ZXN0cykKKworICAgICMgSG9ycmlibGUgd2hpdGUgYm94IHRlc3QKKyAgICBkZWYgdGVzdE5vRXhpdChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gb2JqZWN0KCkKKyAgICAgICAgdGVzdCA9IG9iamVjdCgpCisKKyAgICAgICAgY2xhc3MgRmFrZVJ1bm5lcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIHJ1bihzZWxmLCB0ZXN0KToKKyAgICAgICAgICAgICAgICBzZWxmLnRlc3QgPSB0ZXN0CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgICAgIHJ1bm5lciA9IEZha2VSdW5uZXIoKQorCisgICAgICAgIG9sZFBhcnNlQXJncyA9IHVuaXR0ZXN0LlRlc3RQcm9ncmFtLnBhcnNlQXJncworICAgICAgICBkZWYgcmVzdG9yZVBhcnNlQXJncygpOgorICAgICAgICAgICAgdW5pdHRlc3QuVGVzdFByb2dyYW0ucGFyc2VBcmdzID0gb2xkUGFyc2VBcmdzCisgICAgICAgIHVuaXR0ZXN0LlRlc3RQcm9ncmFtLnBhcnNlQXJncyA9IGxhbWJkYSAqYXJnczogTm9uZQorICAgICAgICBzZWxmLmFkZENsZWFudXAocmVzdG9yZVBhcnNlQXJncykKKworICAgICAgICBkZWYgcmVtb3ZlVGVzdCgpOgorICAgICAgICAgICAgZGVsIHVuaXR0ZXN0LlRlc3RQcm9ncmFtLnRlc3QKKyAgICAgICAgdW5pdHRlc3QuVGVzdFByb2dyYW0udGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlbW92ZVRlc3QpCisKKyAgICAgICAgcHJvZ3JhbSA9IHVuaXR0ZXN0LlRlc3RQcm9ncmFtKHRlc3RSdW5uZXI9cnVubmVyLCBleGl0PUZhbHNlLCB2ZXJib3NpdHk9MikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2dyYW0ucmVzdWx0LCByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVubmVyLnRlc3QsIHRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvZ3JhbS52ZXJib3NpdHksIDIpCisKKyAgICBjbGFzcyBGb29CYXIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBkZWYgdGVzdFBhc3Moc2VsZik6CisgICAgICAgICAgICBhc3NlcnQgVHJ1ZQorICAgICAgICBkZWYgdGVzdEZhaWwoc2VsZik6CisgICAgICAgICAgICBhc3NlcnQgRmFsc2UKKworICAgIGNsYXNzIEZvb0JhckxvYWRlcih1bml0dGVzdC5UZXN0TG9hZGVyKToKKyAgICAgICAgIiIiVGVzdCBsb2FkZXIgdGhhdCByZXR1cm5zIGEgc3VpdGUgY29udGFpbmluZyBGb29CYXIuIiIiCisgICAgICAgIGRlZiBsb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYsIG1vZHVsZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zdWl0ZUNsYXNzKAorICAgICAgICAgICAgICAgIFtzZWxmLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0X1Rlc3RQcm9ncmFtLkZvb0JhcildKQorCisKKyAgICBkZWYgdGVzdF9Ob25FeGl0KHNlbGYpOgorICAgICAgICBwcm9ncmFtID0gdW5pdHRlc3QubWFpbihleGl0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2PVsiZm9vYmFyIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoc3RyZWFtPVN0cmluZ0lPKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0TG9hZGVyPXNlbGYuRm9vQmFyTG9hZGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHByb2dyYW0sICdyZXN1bHQnKSkKKworCisgICAgZGVmIHRlc3RfRXhpdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBTeXN0ZW1FeGl0LAorICAgICAgICAgICAgdW5pdHRlc3QubWFpbiwKKyAgICAgICAgICAgIGFyZ3Y9WyJmb29iYXIiXSwKKyAgICAgICAgICAgIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoc3RyZWFtPVN0cmluZ0lPKCkpLAorICAgICAgICAgICAgZXhpdD1UcnVlLAorICAgICAgICAgICAgdGVzdExvYWRlcj1zZWxmLkZvb0JhckxvYWRlcigpKQorCisKKyAgICBkZWYgdGVzdF9FeGl0QXNEZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFN5c3RlbUV4aXQsCisgICAgICAgICAgICB1bml0dGVzdC5tYWluLAorICAgICAgICAgICAgYXJndj1bImZvb2JhciJdLAorICAgICAgICAgICAgdGVzdFJ1bm5lcj11bml0dGVzdC5UZXh0VGVzdFJ1bm5lcihzdHJlYW09U3RyaW5nSU8oKSksCisgICAgICAgICAgICB0ZXN0TG9hZGVyPXNlbGYuRm9vQmFyTG9hZGVyKCkpCisKKworY2xhc3MgSW5pdGlhbGlzYWJsZVByb2dyYW0odW5pdHRlc3QuVGVzdFByb2dyYW0pOgorICAgIGV4aXQgPSBGYWxzZQorICAgIHJlc3VsdCA9IE5vbmUKKyAgICB2ZXJib3NpdHkgPSAxCisgICAgZGVmYXVsdFRlc3QgPSBOb25lCisgICAgdGVzdFJ1bm5lciA9IE5vbmUKKyAgICB0ZXN0TG9hZGVyID0gdW5pdHRlc3QuZGVmYXVsdFRlc3RMb2FkZXIKKyAgICBwcm9nTmFtZSA9ICd0ZXN0JworICAgIHRlc3QgPSAndGVzdCcKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBwYXNzCisKK1JFU1VMVCA9IG9iamVjdCgpCisKK2NsYXNzIEZha2VSdW5uZXIob2JqZWN0KToKKyAgICBpbml0QXJncyA9IE5vbmUKKyAgICB0ZXN0ID0gTm9uZQorICAgIHJhaXNlRXJyb3IgPSBGYWxzZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgRmFrZVJ1bm5lci5pbml0QXJncyA9IGt3YXJncworICAgICAgICBpZiBGYWtlUnVubmVyLnJhaXNlRXJyb3I6CisgICAgICAgICAgICBGYWtlUnVubmVyLnJhaXNlRXJyb3IgPSBGYWxzZQorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCisKKyAgICBkZWYgcnVuKHNlbGYsIHRlc3QpOgorICAgICAgICBGYWtlUnVubmVyLnRlc3QgPSB0ZXN0CisgICAgICAgIHJldHVybiBSRVNVTFQKKworY2xhc3MgVGVzdENvbW1hbmRMaW5lQXJncyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucHJvZ3JhbSA9IEluaXRpYWxpc2FibGVQcm9ncmFtKCkKKyAgICAgICAgc2VsZi5wcm9ncmFtLmNyZWF0ZVRlc3RzID0gbGFtYmRhOiBOb25lCisgICAgICAgIEZha2VSdW5uZXIuaW5pdEFyZ3MgPSBOb25lCisgICAgICAgIEZha2VSdW5uZXIudGVzdCA9IE5vbmUKKyAgICAgICAgRmFrZVJ1bm5lci5yYWlzZUVycm9yID0gRmFsc2UKKworICAgIGRlZiB0ZXN0SGVscEFuZFVua25vd24oc2VsZik6CisgICAgICAgIHByb2dyYW0gPSBzZWxmLnByb2dyYW0KKyAgICAgICAgZGVmIHVzYWdlRXhpdChtc2c9Tm9uZSk6CisgICAgICAgICAgICBwcm9ncmFtLm1zZyA9IG1zZworICAgICAgICAgICAgcHJvZ3JhbS5leGl0ID0gVHJ1ZQorICAgICAgICBwcm9ncmFtLnVzYWdlRXhpdCA9IHVzYWdlRXhpdAorCisgICAgICAgIGZvciBvcHQgaW4gJy1oJywgJy1IJywgJy0taGVscCc6CisgICAgICAgICAgICBwcm9ncmFtLmV4aXQgPSBGYWxzZQorICAgICAgICAgICAgcHJvZ3JhbS5wYXJzZUFyZ3MoW05vbmUsIG9wdF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvZ3JhbS5leGl0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocHJvZ3JhbS5tc2cpCisKKyAgICAgICAgcHJvZ3JhbS5wYXJzZUFyZ3MoW05vbmUsICctJCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvZ3JhbS5leGl0KQorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShwcm9ncmFtLm1zZykKKworICAgIGRlZiB0ZXN0VmVyYm9zaXR5KHNlbGYpOgorICAgICAgICBwcm9ncmFtID0gc2VsZi5wcm9ncmFtCisKKyAgICAgICAgZm9yIG9wdCBpbiAnLXEnLCAnLS1xdWlldCc6CisgICAgICAgICAgICBwcm9ncmFtLnZlcmJvc2l0eSA9IDEKKyAgICAgICAgICAgIHByb2dyYW0ucGFyc2VBcmdzKFtOb25lLCBvcHRdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9ncmFtLnZlcmJvc2l0eSwgMCkKKworICAgICAgICBmb3Igb3B0IGluICctdicsICctLXZlcmJvc2UnOgorICAgICAgICAgICAgcHJvZ3JhbS52ZXJib3NpdHkgPSAxCisgICAgICAgICAgICBwcm9ncmFtLnBhcnNlQXJncyhbTm9uZSwgb3B0XSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvZ3JhbS52ZXJib3NpdHksIDIpCisKKyAgICBkZWYgdGVzdEJ1ZmZlckNhdGNoRmFpbGZhc3Qoc2VsZik6CisgICAgICAgIHByb2dyYW0gPSBzZWxmLnByb2dyYW0KKyAgICAgICAgZm9yIGFyZywgYXR0ciBpbiAoKCdidWZmZXInLCAnYnVmZmVyJyksICgnZmFpbGZhc3QnLCAnZmFpbGZhc3QnKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJ2NhdGNoJywgJ2NhdGNoYnJlYWsnKSk6CisgICAgICAgICAgICBpZiBhdHRyID09ICdjYXRjaCcgYW5kIG5vdCBoYXNJbnN0YWxsSGFuZGxlcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBzaG9ydF9vcHQgPSAnLSVzJyAlIGFyZ1swXQorICAgICAgICAgICAgbG9uZ19vcHQgPSAnLS0lcycgJSBhcmcKKyAgICAgICAgICAgIGZvciBvcHQgaW4gc2hvcnRfb3B0LCBsb25nX29wdDoKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHByb2dyYW0sIGF0dHIsIE5vbmUpCisKKyAgICAgICAgICAgICAgICBwcm9ncmFtLnBhcnNlQXJncyhbTm9uZSwgb3B0XSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2V0YXR0cihwcm9ncmFtLCBhdHRyKSkKKworICAgICAgICAgICAgZm9yIG9wdCBpbiBzaG9ydF9vcHQsIGxvbmdfb3B0OgorICAgICAgICAgICAgICAgIG5vdF9ub25lID0gb2JqZWN0KCkKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHByb2dyYW0sIGF0dHIsIG5vdF9ub25lKQorCisgICAgICAgICAgICAgICAgcHJvZ3JhbS5wYXJzZUFyZ3MoW05vbmUsIG9wdF0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKHByb2dyYW0sIGF0dHIpLCBub3Rfbm9uZSkKKworICAgIGRlZiB0ZXN0UnVuVGVzdHNSdW5uZXJDbGFzcyhzZWxmKToKKyAgICAgICAgcHJvZ3JhbSA9IHNlbGYucHJvZ3JhbQorCisgICAgICAgIHByb2dyYW0udGVzdFJ1bm5lciA9IEZha2VSdW5uZXIKKyAgICAgICAgcHJvZ3JhbS52ZXJib3NpdHkgPSAndmVyYm9zaXR5JworICAgICAgICBwcm9ncmFtLmZhaWxmYXN0ID0gJ2ZhaWxmYXN0JworICAgICAgICBwcm9ncmFtLmJ1ZmZlciA9ICdidWZmZXInCisKKyAgICAgICAgcHJvZ3JhbS5ydW5UZXN0cygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWtlUnVubmVyLmluaXRBcmdzLCB7J3ZlcmJvc2l0eSc6ICd2ZXJib3NpdHknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhaWxmYXN0JzogJ2ZhaWxmYXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidWZmZXInOiAnYnVmZmVyJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFrZVJ1bm5lci50ZXN0LCAndGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocHJvZ3JhbS5yZXN1bHQsIFJFU1VMVCkKKworICAgIGRlZiB0ZXN0UnVuVGVzdHNSdW5uZXJJbnN0YW5jZShzZWxmKToKKyAgICAgICAgcHJvZ3JhbSA9IHNlbGYucHJvZ3JhbQorCisgICAgICAgIHByb2dyYW0udGVzdFJ1bm5lciA9IEZha2VSdW5uZXIoKQorICAgICAgICBGYWtlUnVubmVyLmluaXRBcmdzID0gTm9uZQorCisgICAgICAgIHByb2dyYW0ucnVuVGVzdHMoKQorCisgICAgICAgICMgQSBuZXcgRmFrZVJ1bm5lciBzaG91bGQgbm90IGhhdmUgYmVlbiBpbnN0YW50aWF0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoRmFrZVJ1bm5lci5pbml0QXJncykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZha2VSdW5uZXIudGVzdCwgJ3Rlc3QnKQorICAgICAgICBzZWxmLmFzc2VydElzKHByb2dyYW0ucmVzdWx0LCBSRVNVTFQpCisKKyAgICBkZWYgdGVzdFJ1blRlc3RzT2xkUnVubmVyQ2xhc3Moc2VsZik6CisgICAgICAgIHByb2dyYW0gPSBzZWxmLnByb2dyYW0KKworICAgICAgICBGYWtlUnVubmVyLnJhaXNlRXJyb3IgPSBUcnVlCisgICAgICAgIHByb2dyYW0udGVzdFJ1bm5lciA9IEZha2VSdW5uZXIKKyAgICAgICAgcHJvZ3JhbS52ZXJib3NpdHkgPSAndmVyYm9zaXR5JworICAgICAgICBwcm9ncmFtLmZhaWxmYXN0ID0gJ2ZhaWxmYXN0JworICAgICAgICBwcm9ncmFtLmJ1ZmZlciA9ICdidWZmZXInCisgICAgICAgIHByb2dyYW0udGVzdCA9ICd0ZXN0JworCisgICAgICAgIHByb2dyYW0ucnVuVGVzdHMoKQorCisgICAgICAgICMgSWYgaW5pdGlhbGl6aW5nIHJhaXNlcyBhIHR5cGUgZXJyb3IgaXQgc2hvdWxkIGJlIHJldHJpZWQKKyAgICAgICAgIyB3aXRob3V0IHRoZSBuZXcga2V5d29yZCBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWtlUnVubmVyLmluaXRBcmdzLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWtlUnVubmVyLnRlc3QsICd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhwcm9ncmFtLnJlc3VsdCwgUkVTVUxUKQorCisgICAgZGVmIHRlc3RDYXRjaEJyZWFrSW5zdGFsbHNIYW5kbGVyKHNlbGYpOgorICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1sndW5pdHRlc3QubWFpbiddCisgICAgICAgIG9yaWdpbmFsID0gbW9kdWxlLmluc3RhbGxIYW5kbGVyCisgICAgICAgIGRlZiByZXN0b3JlKCk6CisgICAgICAgICAgICBtb2R1bGUuaW5zdGFsbEhhbmRsZXIgPSBvcmlnaW5hbAorICAgICAgICBzZWxmLmFkZENsZWFudXAocmVzdG9yZSkKKworICAgICAgICBzZWxmLmluc3RhbGxlZCA9IEZhbHNlCisgICAgICAgIGRlZiBmYWtlSW5zdGFsbEhhbmRsZXIoKToKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbGVkID0gVHJ1ZQorICAgICAgICBtb2R1bGUuaW5zdGFsbEhhbmRsZXIgPSBmYWtlSW5zdGFsbEhhbmRsZXIKKworICAgICAgICBwcm9ncmFtID0gc2VsZi5wcm9ncmFtCisgICAgICAgIHByb2dyYW0uY2F0Y2hicmVhayA9IFRydWUKKworICAgICAgICBwcm9ncmFtLnRlc3RSdW5uZXIgPSBGYWtlUnVubmVyCisKKyAgICAgICAgcHJvZ3JhbS5ydW5UZXN0cygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmluc3RhbGxlZCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcHJvZ3JhbS5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9wcm9ncmFtLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWE5ZDBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcHJvZ3JhbS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcHJvZ3JhbS5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9wcm9ncmFtLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjNlMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcHJvZ3JhbS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcmVzdWx0LnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcmVzdWx0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNjhjMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9yZXN1bHQucHkKQEAgLTAsMCArMSw1NjcgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZXh0d3JhcAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFRlc3RfVGVzdFJlc3VsdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBOb3RlOiB0aGVyZSBhcmUgbm90IHNlcGFyYXRlIHRlc3RzIGZvciBUZXN0UmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSwKKyAgICAjIFRlc3RSZXN1bHQuZXJyb3JzLCBUZXN0UmVzdWx0LmZhaWx1cmVzLCBUZXN0UmVzdWx0LnRlc3RzUnVuIG9yCisgICAgIyBUZXN0UmVzdWx0LnNob3VsZFN0b3AgYmVjYXVzZSB0aGVzZSBvbmx5IGhhdmUgbWVhbmluZyBpbiB0ZXJtcyBvZgorICAgICMgb3RoZXIgVGVzdFJlc3VsdCBtZXRob2RzLgorICAgICMKKyAgICAjIEFjY29yZGluZ2x5LCB0ZXN0cyBmb3IgdGhlIGFmb3JlbmFtZWQgYXR0cmlidXRlcyBhcmUgaW5jb3Jwb3JhdGVkCisgICAgIyBpbiB3aXRoIHRoZSB0ZXN0cyBmb3IgdGhlIGRlZmluaW5nIG1ldGhvZHMuCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZmFpbHVyZXMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2hvdWxkU3RvcCwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlc3VsdC5fc3Rkb3V0X2J1ZmZlcikKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmVzdWx0Ll9zdGRlcnJfYnVmZmVyKQorCisKKyAgICAjICJUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHNpZ25hbCB0aGF0IHRoZSBzZXQgb2YgdGVzdHMgYmVpbmcKKyAgICAjIHJ1biBzaG91bGQgYmUgYWJvcnRlZCBieSBzZXR0aW5nIHRoZSBUZXN0UmVzdWx0J3Mgc2hvdWxkU3RvcAorICAgICMgYXR0cmlidXRlIHRvIFRydWUuIgorICAgIGRlZiB0ZXN0X3N0b3Aoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorCisgICAgICAgIHJlc3VsdC5zdG9wKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5zaG91bGRTdG9wLCBUcnVlKQorCisgICAgIyAiQ2FsbGVkIHdoZW4gdGhlIHRlc3QgY2FzZSB0ZXN0IGlzIGFib3V0IHRvIGJlIHJ1bi4gVGhlIGRlZmF1bHQKKyAgICAjIGltcGxlbWVudGF0aW9uIHNpbXBseSBpbmNyZW1lbnRzIHRoZSBpbnN0YW5jZSdzIHRlc3RzUnVuIGNvdW50ZXIuIgorICAgIGRlZiB0ZXN0X3N0YXJ0VGVzdChzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRlc3QgPSBGb28oJ3Rlc3RfMScpCisKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisKKyAgICAgICAgcmVzdWx0LnN0YXJ0VGVzdCh0ZXN0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmZhaWx1cmVzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnNob3VsZFN0b3AsIEZhbHNlKQorCisgICAgICAgIHJlc3VsdC5zdG9wVGVzdCh0ZXN0KQorCisgICAgIyAiQ2FsbGVkIGFmdGVyIHRoZSB0ZXN0IGNhc2UgdGVzdCBoYXMgYmVlbiBleGVjdXRlZCwgcmVnYXJkbGVzcyBvZgorICAgICMgdGhlIG91dGNvbWUuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4iCisgICAgZGVmIHRlc3Rfc3RvcFRlc3Qoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0ZXN0ID0gRm9vKCd0ZXN0XzEnKQorCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorCisgICAgICAgIHJlc3VsdC5zdGFydFRlc3QodGVzdCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5mYWlsdXJlcyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5zaG91bGRTdG9wLCBGYWxzZSkKKworICAgICAgICByZXN1bHQuc3RvcFRlc3QodGVzdCkKKworICAgICAgICAjIFNhbWUgdGVzdHMgYXMgYWJvdmU7IG1ha2Ugc3VyZSBub3RoaW5nIGhhcyBjaGFuZ2VkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmZhaWx1cmVzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnNob3VsZFN0b3AsIEZhbHNlKQorCisgICAgIyAiQ2FsbGVkIGJlZm9yZSBhbmQgYWZ0ZXIgdGVzdHMgYXJlIHJ1bi4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiIKKyAgICBkZWYgdGVzdF9zdGFydFRlc3RSdW5fc3RvcFRlc3RSdW4oc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICByZXN1bHQuc3RhcnRUZXN0UnVuKCkKKyAgICAgICAgcmVzdWx0LnN0b3BUZXN0UnVuKCkKKworICAgICMgImFkZFN1Y2Nlc3ModGVzdCkiCisgICAgIyAuLi4KKyAgICAjICJDYWxsZWQgd2hlbiB0aGUgdGVzdCBjYXNlIHRlc3Qgc3VjY2VlZHMiCisgICAgIyAuLi4KKyAgICAjICJ3YXNTdWNjZXNzZnVsKCkgLSBSZXR1cm5zIFRydWUgaWYgYWxsIHRlc3RzIHJ1biBzbyBmYXIgaGF2ZSBwYXNzZWQsCisgICAgIyBvdGhlcndpc2UgcmV0dXJucyBGYWxzZSIKKyAgICAjIC4uLgorICAgICMgInRlc3RzUnVuIC0gVGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0cyBydW4gc28gZmFyLiIKKyAgICAjIC4uLgorICAgICMgImVycm9ycyAtIEEgbGlzdCBjb250YWluaW5nIDItdHVwbGVzIG9mIFRlc3RDYXNlIGluc3RhbmNlcyBhbmQKKyAgICAjIGZvcm1hdHRlZCB0cmFjZWJhY2tzLiBFYWNoIHR1cGxlIHJlcHJlc2VudHMgYSB0ZXN0IHdoaWNoIHJhaXNlZCBhbgorICAgICMgdW5leHBlY3RlZCBleGNlcHRpb24uIENvbnRhaW5zIGZvcm1hdHRlZAorICAgICMgdHJhY2ViYWNrcyBpbnN0ZWFkIG9mIHN5cy5leGNfaW5mbygpIHJlc3VsdHMuIgorICAgICMgLi4uCisgICAgIyAiZmFpbHVyZXMgLSBBIGxpc3QgY29udGFpbmluZyAyLXR1cGxlcyBvZiBUZXN0Q2FzZSBpbnN0YW5jZXMgYW5kCisgICAgIyBmb3JtYXR0ZWQgdHJhY2ViYWNrcy4gRWFjaCB0dXBsZSByZXByZXNlbnRzIGEgdGVzdCB3aGVyZSBhIGZhaWx1cmUgd2FzCisgICAgIyBleHBsaWNpdGx5IHNpZ25hbGxlZCB1c2luZyB0aGUgVGVzdENhc2UuZmFpbCooKSBvciBUZXN0Q2FzZS5hc3NlcnQqKCkKKyAgICAjIG1ldGhvZHMuIENvbnRhaW5zIGZvcm1hdHRlZCB0cmFjZWJhY2tzIGluc3RlYWQKKyAgICAjIG9mIHN5cy5leGNfaW5mbygpIHJlc3VsdHMuIgorICAgIGRlZiB0ZXN0X2FkZFN1Y2Nlc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0ZXN0ID0gRm9vKCd0ZXN0XzEnKQorCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorCisgICAgICAgIHJlc3VsdC5zdGFydFRlc3QodGVzdCkKKyAgICAgICAgcmVzdWx0LmFkZFN1Y2Nlc3ModGVzdCkKKyAgICAgICAgcmVzdWx0LnN0b3BUZXN0KHRlc3QpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZmFpbHVyZXMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2hvdWxkU3RvcCwgRmFsc2UpCisKKyAgICAjICJhZGRGYWlsdXJlKHRlc3QsIGVycikiCisgICAgIyAuLi4KKyAgICAjICJDYWxsZWQgd2hlbiB0aGUgdGVzdCBjYXNlIHRlc3Qgc2lnbmFscyBhIGZhaWx1cmUuIGVyciBpcyBhIHR1cGxlIG9mCisgICAgIyB0aGUgZm9ybSByZXR1cm5lZCBieSBzeXMuZXhjX2luZm8oKTogKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spIgorICAgICMgLi4uCisgICAgIyAid2FzU3VjY2Vzc2Z1bCgpIC0gUmV0dXJucyBUcnVlIGlmIGFsbCB0ZXN0cyBydW4gc28gZmFyIGhhdmUgcGFzc2VkLAorICAgICMgb3RoZXJ3aXNlIHJldHVybnMgRmFsc2UiCisgICAgIyAuLi4KKyAgICAjICJ0ZXN0c1J1biAtIFRoZSB0b3RhbCBudW1iZXIgb2YgdGVzdHMgcnVuIHNvIGZhci4iCisgICAgIyAuLi4KKyAgICAjICJlcnJvcnMgLSBBIGxpc3QgY29udGFpbmluZyAyLXR1cGxlcyBvZiBUZXN0Q2FzZSBpbnN0YW5jZXMgYW5kCisgICAgIyBmb3JtYXR0ZWQgdHJhY2ViYWNrcy4gRWFjaCB0dXBsZSByZXByZXNlbnRzIGEgdGVzdCB3aGljaCByYWlzZWQgYW4KKyAgICAjIHVuZXhwZWN0ZWQgZXhjZXB0aW9uLiBDb250YWlucyBmb3JtYXR0ZWQKKyAgICAjIHRyYWNlYmFja3MgaW5zdGVhZCBvZiBzeXMuZXhjX2luZm8oKSByZXN1bHRzLiIKKyAgICAjIC4uLgorICAgICMgImZhaWx1cmVzIC0gQSBsaXN0IGNvbnRhaW5pbmcgMi10dXBsZXMgb2YgVGVzdENhc2UgaW5zdGFuY2VzIGFuZAorICAgICMgZm9ybWF0dGVkIHRyYWNlYmFja3MuIEVhY2ggdHVwbGUgcmVwcmVzZW50cyBhIHRlc3Qgd2hlcmUgYSBmYWlsdXJlIHdhcworICAgICMgZXhwbGljaXRseSBzaWduYWxsZWQgdXNpbmcgdGhlIFRlc3RDYXNlLmZhaWwqKCkgb3IgVGVzdENhc2UuYXNzZXJ0KigpCisgICAgIyBtZXRob2RzLiBDb250YWlucyBmb3JtYXR0ZWQgdHJhY2ViYWNrcyBpbnN0ZWFkCisgICAgIyBvZiBzeXMuZXhjX2luZm8oKSByZXN1bHRzLiIKKyAgICBkZWYgdGVzdF9hZGRGYWlsdXJlKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdGVzdCA9IEZvbygndGVzdF8xJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdC5mYWlsKCJmb28iKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBleGNfaW5mb190dXBsZSA9IHN5cy5leGNfaW5mbygpCisKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisKKyAgICAgICAgcmVzdWx0LnN0YXJ0VGVzdCh0ZXN0KQorICAgICAgICByZXN1bHQuYWRkRmFpbHVyZSh0ZXN0LCBleGNfaW5mb190dXBsZSkKKyAgICAgICAgcmVzdWx0LnN0b3BUZXN0KHRlc3QpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmZhaWx1cmVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnNob3VsZFN0b3AsIEZhbHNlKQorCisgICAgICAgIHRlc3RfY2FzZSwgZm9ybWF0dGVkX2V4YyA9IHJlc3VsdC5mYWlsdXJlc1swXQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGVzdF9jYXNlIGlzIHRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmb3JtYXR0ZWRfZXhjLCBzdHIpCisKKyAgICAjICJhZGRFcnJvcih0ZXN0LCBlcnIpIgorICAgICMgLi4uCisgICAgIyAiQ2FsbGVkIHdoZW4gdGhlIHRlc3QgY2FzZSB0ZXN0IHJhaXNlcyBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBlcnIKKyAgICAjIGlzIGEgdHVwbGUgb2YgdGhlIGZvcm0gcmV0dXJuZWQgYnkgc3lzLmV4Y19pbmZvKCk6CisgICAgIyAodHlwZSwgdmFsdWUsIHRyYWNlYmFjaykiCisgICAgIyAuLi4KKyAgICAjICJ3YXNTdWNjZXNzZnVsKCkgLSBSZXR1cm5zIFRydWUgaWYgYWxsIHRlc3RzIHJ1biBzbyBmYXIgaGF2ZSBwYXNzZWQsCisgICAgIyBvdGhlcndpc2UgcmV0dXJucyBGYWxzZSIKKyAgICAjIC4uLgorICAgICMgInRlc3RzUnVuIC0gVGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0cyBydW4gc28gZmFyLiIKKyAgICAjIC4uLgorICAgICMgImVycm9ycyAtIEEgbGlzdCBjb250YWluaW5nIDItdHVwbGVzIG9mIFRlc3RDYXNlIGluc3RhbmNlcyBhbmQKKyAgICAjIGZvcm1hdHRlZCB0cmFjZWJhY2tzLiBFYWNoIHR1cGxlIHJlcHJlc2VudHMgYSB0ZXN0IHdoaWNoIHJhaXNlZCBhbgorICAgICMgdW5leHBlY3RlZCBleGNlcHRpb24uIENvbnRhaW5zIGZvcm1hdHRlZAorICAgICMgdHJhY2ViYWNrcyBpbnN0ZWFkIG9mIHN5cy5leGNfaW5mbygpIHJlc3VsdHMuIgorICAgICMgLi4uCisgICAgIyAiZmFpbHVyZXMgLSBBIGxpc3QgY29udGFpbmluZyAyLXR1cGxlcyBvZiBUZXN0Q2FzZSBpbnN0YW5jZXMgYW5kCisgICAgIyBmb3JtYXR0ZWQgdHJhY2ViYWNrcy4gRWFjaCB0dXBsZSByZXByZXNlbnRzIGEgdGVzdCB3aGVyZSBhIGZhaWx1cmUgd2FzCisgICAgIyBleHBsaWNpdGx5IHNpZ25hbGxlZCB1c2luZyB0aGUgVGVzdENhc2UuZmFpbCooKSBvciBUZXN0Q2FzZS5hc3NlcnQqKCkKKyAgICAjIG1ldGhvZHMuIENvbnRhaW5zIGZvcm1hdHRlZCB0cmFjZWJhY2tzIGluc3RlYWQKKyAgICAjIG9mIHN5cy5leGNfaW5mbygpIHJlc3VsdHMuIgorICAgIGRlZiB0ZXN0X2FkZEVycm9yKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdGVzdCA9IEZvbygndGVzdF8xJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZXhjX2luZm9fdHVwbGUgPSBzeXMuZXhjX2luZm8oKQorCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorCisgICAgICAgIHJlc3VsdC5zdGFydFRlc3QodGVzdCkKKyAgICAgICAgcmVzdWx0LmFkZEVycm9yKHRlc3QsIGV4Y19pbmZvX3R1cGxlKQorICAgICAgICByZXN1bHQuc3RvcFRlc3QodGVzdCkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZmFpbHVyZXMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2hvdWxkU3RvcCwgRmFsc2UpCisKKyAgICAgICAgdGVzdF9jYXNlLCBmb3JtYXR0ZWRfZXhjID0gcmVzdWx0LmVycm9yc1swXQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGVzdF9jYXNlIGlzIHRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmb3JtYXR0ZWRfZXhjLCBzdHIpCisKKyAgICBkZWYgdGVzdEdldERlc2NyaXB0aW9uV2l0aG91dERvY3N0cmluZyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGV4dFRlc3RSZXN1bHQoTm9uZSwgVHJ1ZSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICByZXN1bHQuZ2V0RGVzY3JpcHRpb24oc2VsZiksCisgICAgICAgICAgICAgICAgJ3Rlc3RHZXREZXNjcmlwdGlvbldpdGhvdXREb2NzdHJpbmcgKCcgKyBfX25hbWVfXyArCisgICAgICAgICAgICAgICAgJy5UZXN0X1Rlc3RSZXN1bHQpJykKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0R2V0RGVzY3JpcHRpb25XaXRoT25lTGluZURvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiVGVzdHMgZ2V0RGVzY3JpcHRpb24oKSBmb3IgYSBtZXRob2Qgd2l0aCBhIGRvY3N0cmluZy4iIiIKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGV4dFRlc3RSZXN1bHQoTm9uZSwgVHJ1ZSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICByZXN1bHQuZ2V0RGVzY3JpcHRpb24oc2VsZiksCisgICAgICAgICAgICAgICAoJ3Rlc3RHZXREZXNjcmlwdGlvbldpdGhPbmVMaW5lRG9jc3RyaW5nICcKKyAgICAgICAgICAgICAgICAnKCcgKyBfX25hbWVfXyArICcuVGVzdF9UZXN0UmVzdWx0KVxuJworICAgICAgICAgICAgICAgICdUZXN0cyBnZXREZXNjcmlwdGlvbigpIGZvciBhIG1ldGhvZCB3aXRoIGEgZG9jc3RyaW5nLicpKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RHZXREZXNjcmlwdGlvbldpdGhNdWx0aUxpbmVEb2NzdHJpbmcoc2VsZik6CisgICAgICAgICIiIlRlc3RzIGdldERlc2NyaXB0aW9uKCkgZm9yIGEgbWV0aG9kIHdpdGggYSBsb25nZXIgZG9jc3RyaW5nLgorICAgICAgICBUaGUgc2Vjb25kIGxpbmUgb2YgdGhlIGRvY3N0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRleHRUZXN0UmVzdWx0KE5vbmUsIFRydWUsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgcmVzdWx0LmdldERlc2NyaXB0aW9uKHNlbGYpLAorICAgICAgICAgICAgICAgKCd0ZXN0R2V0RGVzY3JpcHRpb25XaXRoTXVsdGlMaW5lRG9jc3RyaW5nICcKKyAgICAgICAgICAgICAgICAnKCcgKyBfX25hbWVfXyArICcuVGVzdF9UZXN0UmVzdWx0KVxuJworICAgICAgICAgICAgICAgICdUZXN0cyBnZXREZXNjcmlwdGlvbigpIGZvciBhIG1ldGhvZCB3aXRoIGEgbG9uZ2VyICcKKyAgICAgICAgICAgICAgICAnZG9jc3RyaW5nLicpKQorCisgICAgZGVmIHRlc3RTdGFja0ZyYW1lVHJpbW1pbmcoc2VsZik6CisgICAgICAgIGNsYXNzIEZyYW1lKG9iamVjdCk6CisgICAgICAgICAgICBjbGFzcyB0Yl9mcmFtZShvYmplY3QpOgorICAgICAgICAgICAgICAgIGZfZ2xvYmFscyA9IHt9CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3VsdC5faXNfcmVsZXZhbnRfdGJfbGV2ZWwoRnJhbWUpKQorCisgICAgICAgIEZyYW1lLnRiX2ZyYW1lLmZfZ2xvYmFsc1snX191bml0dGVzdCddID0gVHJ1ZQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0Ll9pc19yZWxldmFudF90Yl9sZXZlbChGcmFtZSkpCisKKyAgICBkZWYgdGVzdEZhaWxGYXN0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgcmVzdWx0Ll9leGNfaW5mb190b19zdHJpbmcgPSBsYW1iZGEgKl86ICcnCisgICAgICAgIHJlc3VsdC5mYWlsZmFzdCA9IFRydWUKKyAgICAgICAgcmVzdWx0LmFkZEVycm9yKE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuc2hvdWxkU3RvcCkKKworICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgcmVzdWx0Ll9leGNfaW5mb190b19zdHJpbmcgPSBsYW1iZGEgKl86ICcnCisgICAgICAgIHJlc3VsdC5mYWlsZmFzdCA9IFRydWUKKyAgICAgICAgcmVzdWx0LmFkZEZhaWx1cmUoTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC5zaG91bGRTdG9wKQorCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICByZXN1bHQuX2V4Y19pbmZvX3RvX3N0cmluZyA9IGxhbWJkYSAqXzogJycKKyAgICAgICAgcmVzdWx0LmZhaWxmYXN0ID0gVHJ1ZQorICAgICAgICByZXN1bHQuYWRkVW5leHBlY3RlZFN1Y2Nlc3MoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC5zaG91bGRTdG9wKQorCisgICAgZGVmIHRlc3RGYWlsRmFzdFNldEJ5UnVubmVyKHNlbGYpOgorICAgICAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcihzdHJlYW09U3RyaW5nSU8oKSwgZmFpbGZhc3Q9VHJ1ZSkKKyAgICAgICAgZGVmIHRlc3QocmVzdWx0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuZmFpbGZhc3QpCisgICAgICAgIHJ1bm5lci5ydW4odGVzdCkKKworCitjbGFzc0RpY3QgPSBkaWN0KHVuaXR0ZXN0LlRlc3RSZXN1bHQuX19kaWN0X18pCitmb3IgbSBpbiAoJ2FkZFNraXAnLCAnYWRkRXhwZWN0ZWRGYWlsdXJlJywgJ2FkZFVuZXhwZWN0ZWRTdWNjZXNzJywKKyAgICAgICAgICAgJ19faW5pdF9fJyk6CisgICAgZGVsIGNsYXNzRGljdFttXQorCitkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtPU5vbmUsIGRlc2NyaXB0aW9ucz1Ob25lLCB2ZXJib3NpdHk9Tm9uZSk6CisgICAgc2VsZi5mYWlsdXJlcyA9IFtdCisgICAgc2VsZi5lcnJvcnMgPSBbXQorICAgIHNlbGYudGVzdHNSdW4gPSAwCisgICAgc2VsZi5zaG91bGRTdG9wID0gRmFsc2UKKyAgICBzZWxmLmJ1ZmZlciA9IEZhbHNlCisKK2NsYXNzRGljdFsnX19pbml0X18nXSA9IF9faW5pdF9fCitPbGRSZXN1bHQgPSB0eXBlKCdPbGRSZXN1bHQnLCAob2JqZWN0LCksIGNsYXNzRGljdCkKKworY2xhc3MgVGVzdF9PbGRUZXN0UmVzdWx0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBhc3NlcnRPbGRSZXN1bHRXYXJuaW5nKHNlbGYsIHRlc3QsIGZhaWx1cmVzKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCJUZXN0UmVzdWx0IGhhcyBubyBhZGQuKyBtZXRob2QsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nKSk6CisgICAgICAgICAgICByZXN1bHQgPSBPbGRSZXN1bHQoKQorICAgICAgICAgICAgdGVzdC5ydW4ocmVzdWx0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmZhaWx1cmVzKSwgZmFpbHVyZXMpCisKKyAgICBkZWYgdGVzdE9sZFRlc3RSZXN1bHQoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RTa2lwKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ2Zvb2JhcicpCisgICAgICAgICAgICBAdW5pdHRlc3QuZXhwZWN0ZWRGYWlsdXJlCisgICAgICAgICAgICBkZWYgdGVzdEV4cGVjdGVkRmFpbChzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgICAgIEB1bml0dGVzdC5leHBlY3RlZEZhaWx1cmUKKyAgICAgICAgICAgIGRlZiB0ZXN0VW5leHBlY3RlZFN1Y2Nlc3Moc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGZvciB0ZXN0X25hbWUsIHNob3VsZF9wYXNzIGluICgoJ3Rlc3RTa2lwJywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3Rlc3RFeHBlY3RlZEZhaWwnLCBUcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgndGVzdFVuZXhwZWN0ZWRTdWNjZXNzJywgRmFsc2UpKToKKyAgICAgICAgICAgIHRlc3QgPSBUZXN0KHRlc3RfbmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0T2xkUmVzdWx0V2FybmluZyh0ZXN0LCBpbnQobm90IHNob3VsZF9wYXNzKSkKKworICAgIGRlZiB0ZXN0T2xkVGVzdFRlc3VsdFNldHVwKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdubyByZWFzb24nKQorICAgICAgICAgICAgZGVmIHRlc3RGb28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydE9sZFJlc3VsdFdhcm5pbmcoVGVzdCgndGVzdEZvbycpLCAwKQorCisgICAgZGVmIHRlc3RPbGRUZXN0UmVzdWx0Q2xhc3Moc2VsZik6CisgICAgICAgIEB1bml0dGVzdC5za2lwKCdubyByZWFzb24nKQorICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0Rm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRPbGRSZXN1bHRXYXJuaW5nKFRlc3QoJ3Rlc3RGb28nKSwgMCkKKworICAgIGRlZiB0ZXN0T2xkUmVzdWx0V2l0aFJ1bm5lcihzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdEZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHJlc3VsdGNsYXNzPU9sZFJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbT1TdHJpbmdJTygpKQorICAgICAgICAjIFRoaXMgd2lsbCByYWlzZSBhbiBleGNlcHRpb24gaWYgVGV4dFRlc3RSdW5uZXIgY2FuJ3QgaGFuZGxlIG9sZAorICAgICAgICAjIHRlc3QgcmVzdWx0IG9iamVjdHMKKyAgICAgICAgcnVubmVyLnJ1bihUZXN0KCd0ZXN0Rm9vJykpCisKKworY2xhc3MgTW9ja1RyYWNlYmFjayhvYmplY3QpOgorICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZm9ybWF0X2V4Y2VwdGlvbigqXyk6CisgICAgICAgIHJldHVybiBbJ0EgdHJhY2ViYWNrJ10KKworZGVmIHJlc3RvcmVfdHJhY2ViYWNrKCk6CisgICAgdW5pdHRlc3QucmVzdWx0LnRyYWNlYmFjayA9IHRyYWNlYmFjaworCisKK2NsYXNzIFRlc3RPdXRwdXRCdWZmZXJpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9yZWFsX291dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5fcmVhbF9lcnIgPSBzeXMuc3RkZXJyCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLl9yZWFsX291dAorICAgICAgICBzeXMuc3RkZXJyID0gc2VsZi5fcmVhbF9lcnIKKworICAgIGRlZiB0ZXN0QnVmZmVyT3V0cHV0T2ZmKHNlbGYpOgorICAgICAgICByZWFsX291dCA9IHNlbGYuX3JlYWxfb3V0CisgICAgICAgIHJlYWxfZXJyID0gc2VsZi5fcmVhbF9lcnIKKworICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHQuYnVmZmVyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocmVhbF9vdXQsIHN5cy5zdGRvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocmVhbF9lcnIsIHN5cy5zdGRlcnIpCisKKyAgICAgICAgcmVzdWx0LnN0YXJ0VGVzdChzZWxmKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocmVhbF9vdXQsIHN5cy5zdGRvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocmVhbF9lcnIsIHN5cy5zdGRlcnIpCisKKyAgICBkZWYgdGVzdEJ1ZmZlck91dHB1dFN0YXJ0VGVzdEFkZFN1Y2Nlc3Moc2VsZik6CisgICAgICAgIHJlYWxfb3V0ID0gc2VsZi5fcmVhbF9vdXQKKyAgICAgICAgcmVhbF9lcnIgPSBzZWxmLl9yZWFsX2VycgorCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3VsdC5idWZmZXIpCisKKyAgICAgICAgcmVzdWx0LmJ1ZmZlciA9IFRydWUKKworICAgICAgICBzZWxmLmFzc2VydElzKHJlYWxfb3V0LCBzeXMuc3Rkb3V0KQorICAgICAgICBzZWxmLmFzc2VydElzKHJlYWxfZXJyLCBzeXMuc3RkZXJyKQorCisgICAgICAgIHJlc3VsdC5zdGFydFRlc3Qoc2VsZikKKworICAgICAgICBzZWxmLmFzc2VydElzTm90KHJlYWxfb3V0LCBzeXMuc3Rkb3V0KQorICAgICAgICBzZWxmLmFzc2VydElzTm90KHJlYWxfZXJyLCBzeXMuc3RkZXJyKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3lzLnN0ZG91dCwgU3RyaW5nSU8pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzeXMuc3RkZXJyLCBTdHJpbmdJTykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChzeXMuc3Rkb3V0LCBzeXMuc3RkZXJyKQorCisgICAgICAgIG91dF9zdHJlYW0gPSBzeXMuc3Rkb3V0CisgICAgICAgIGVycl9zdHJlYW0gPSBzeXMuc3RkZXJyCisKKyAgICAgICAgcmVzdWx0Ll9vcmlnaW5hbF9zdGRvdXQgPSBTdHJpbmdJTygpCisgICAgICAgIHJlc3VsdC5fb3JpZ2luYWxfc3RkZXJyID0gU3RyaW5nSU8oKQorCisgICAgICAgIHByaW50ICdmb28nCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICdiYXInCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRfc3RyZWFtLmdldHZhbHVlKCksICdmb29cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyX3N0cmVhbS5nZXR2YWx1ZSgpLCAnYmFyXG4nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0Ll9vcmlnaW5hbF9zdGRvdXQuZ2V0dmFsdWUoKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0Ll9vcmlnaW5hbF9zdGRlcnIuZ2V0dmFsdWUoKSwgJycpCisKKyAgICAgICAgcmVzdWx0LmFkZFN1Y2Nlc3Moc2VsZikKKyAgICAgICAgcmVzdWx0LnN0b3BUZXN0KHNlbGYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzeXMuc3Rkb3V0LCByZXN1bHQuX29yaWdpbmFsX3N0ZG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzeXMuc3RkZXJyLCByZXN1bHQuX29yaWdpbmFsX3N0ZGVycikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5fb3JpZ2luYWxfc3Rkb3V0LmdldHZhbHVlKCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5fb3JpZ2luYWxfc3RkZXJyLmdldHZhbHVlKCksICcnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0X3N0cmVhbS5nZXR2YWx1ZSgpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJfc3RyZWFtLmdldHZhbHVlKCksICcnKQorCisKKyAgICBkZWYgZ2V0U3RhcnRlZFJlc3VsdChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHJlc3VsdC5idWZmZXIgPSBUcnVlCisgICAgICAgIHJlc3VsdC5zdGFydFRlc3Qoc2VsZikKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHRlc3RCdWZmZXJPdXRwdXRBZGRFcnJvck9yRmFpbHVyZShzZWxmKToKKyAgICAgICAgdW5pdHRlc3QucmVzdWx0LnRyYWNlYmFjayA9IE1vY2tUcmFjZWJhY2sKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVfdHJhY2ViYWNrKQorCisgICAgICAgIGZvciBtZXNzYWdlX2F0dHIsIGFkZF9hdHRyLCBpbmNsdWRlX2Vycm9yIGluIFsKKyAgICAgICAgICAgICgnZXJyb3JzJywgJ2FkZEVycm9yJywgVHJ1ZSksCisgICAgICAgICAgICAoJ2ZhaWx1cmVzJywgJ2FkZEZhaWx1cmUnLCBGYWxzZSksCisgICAgICAgICAgICAoJ2Vycm9ycycsICdhZGRFcnJvcicsIFRydWUpLAorICAgICAgICAgICAgKCdmYWlsdXJlcycsICdhZGRGYWlsdXJlJywgRmFsc2UpCisgICAgICAgIF06CisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmdldFN0YXJ0ZWRSZXN1bHQoKQorICAgICAgICAgICAgYnVmZmVyZWRfb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgYnVmZmVyZWRfZXJyID0gc3lzLnN0ZGVycgorICAgICAgICAgICAgcmVzdWx0Ll9vcmlnaW5hbF9zdGRvdXQgPSBTdHJpbmdJTygpCisgICAgICAgICAgICByZXN1bHQuX29yaWdpbmFsX3N0ZGVyciA9IFN0cmluZ0lPKCkKKworICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dCwgJ2ZvbycKKyAgICAgICAgICAgIGlmIGluY2x1ZGVfZXJyb3I6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgJ2JhcicKKworCisgICAgICAgICAgICBhZGRGdW5jdGlvbiA9IGdldGF0dHIocmVzdWx0LCBhZGRfYXR0cikKKyAgICAgICAgICAgIGFkZEZ1bmN0aW9uKHNlbGYsIChOb25lLCBOb25lLCBOb25lKSkKKyAgICAgICAgICAgIHJlc3VsdC5zdG9wVGVzdChzZWxmKQorCisgICAgICAgICAgICByZXN1bHRfbGlzdCA9IGdldGF0dHIocmVzdWx0LCBtZXNzYWdlX2F0dHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHRfbGlzdCksIDEpCisKKyAgICAgICAgICAgIHRlc3QsIG1lc3NhZ2UgPSByZXN1bHRfbGlzdFswXQorICAgICAgICAgICAgZXhwZWN0ZWRPdXRNZXNzYWdlID0gdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICAgICAgICAgIFN0ZG91dDoKKyAgICAgICAgICAgICAgICBmb28KKyAgICAgICAgICAgICIiIikKKyAgICAgICAgICAgIGV4cGVjdGVkRXJyTWVzc2FnZSA9ICcnCisgICAgICAgICAgICBpZiBpbmNsdWRlX2Vycm9yOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkRXJyTWVzc2FnZSA9IHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgICAgICAgICBTdGRlcnI6CisgICAgICAgICAgICAgICAgYmFyCisgICAgICAgICAgICAiIiIpCisgICAgICAgICAgICBleHBlY3RlZEZ1bGxNZXNzYWdlID0gJ0EgdHJhY2ViYWNrJXMlcycgJSAoZXhwZWN0ZWRPdXRNZXNzYWdlLCBleHBlY3RlZEVyck1lc3NhZ2UpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModGVzdCwgc2VsZikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0Ll9vcmlnaW5hbF9zdGRvdXQuZ2V0dmFsdWUoKSwgZXhwZWN0ZWRPdXRNZXNzYWdlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuX29yaWdpbmFsX3N0ZGVyci5nZXR2YWx1ZSgpLCBleHBlY3RlZEVyck1lc3NhZ2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydE11bHRpTGluZUVxdWFsKG1lc3NhZ2UsIGV4cGVjdGVkRnVsbE1lc3NhZ2UpCisKKyAgICBkZWYgdGVzdEJ1ZmZlclNldHVwQ2xhc3Moc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICByZXN1bHQuYnVmZmVyID0gVHJ1ZQorCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgMS8vMAorICAgICAgICAgICAgZGVmIHRlc3RfZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoW0ZvbygndGVzdF9mb28nKV0pCisgICAgICAgIHN1aXRlKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDEpCisKKyAgICBkZWYgdGVzdEJ1ZmZlclRlYXJEb3duQ2xhc3Moc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICByZXN1bHQuYnVmZmVyID0gVHJ1ZQorCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgMS8vMAorICAgICAgICAgICAgZGVmIHRlc3RfZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoW0ZvbygndGVzdF9mb28nKV0pCisgICAgICAgIHN1aXRlKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDEpCisKKyAgICBkZWYgdGVzdEJ1ZmZlclNldFVwTW9kdWxlKHNlbGYpOgorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgcmVzdWx0LmJ1ZmZlciA9IFRydWUKKworICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgTW9kdWxlKG9iamVjdCk6CisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgc2V0VXBNb2R1bGUoKToKKyAgICAgICAgICAgICAgICAxLy8wCisKKyAgICAgICAgRm9vLl9fbW9kdWxlX18gPSAnTW9kdWxlJworICAgICAgICBzeXMubW9kdWxlc1snTW9kdWxlJ10gPSBNb2R1bGUKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN5cy5tb2R1bGVzLnBvcCwgJ01vZHVsZScpCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtGb28oJ3Rlc3RfZm9vJyldKQorICAgICAgICBzdWl0ZShyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAxKQorCisgICAgZGVmIHRlc3RCdWZmZXJUZWFyRG93bk1vZHVsZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHJlc3VsdC5idWZmZXIgPSBUcnVlCisKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X2ZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIE1vZHVsZShvYmplY3QpOgorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHRlYXJEb3duTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgMS8vMAorCisgICAgICAgIEZvby5fX21vZHVsZV9fID0gJ01vZHVsZScKKyAgICAgICAgc3lzLm1vZHVsZXNbJ01vZHVsZSddID0gTW9kdWxlCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzeXMubW9kdWxlcy5wb3AsICdNb2R1bGUnKQorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbRm9vKCd0ZXN0X2ZvbycpXSkKKyAgICAgICAgc3VpdGUocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcmVzdWx0LnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Jlc3VsdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjYTA2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Jlc3VsdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcmVzdWx0LnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Jlc3VsdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjYTA2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Jlc3VsdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcnVubmVyLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcnVubmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxY2VmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9ydW5uZXIucHkKQEAgLTAsMCArMSwyNjYgQEAKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBwaWNrbGUKKworZnJvbSAuc3VwcG9ydCBpbXBvcnQgTG9nZ2luZ1Jlc3VsdCwgUmVzdWx0V2l0aE5vU3RhcnRUZXN0UnVuU3RvcFRlc3RSdW4KKworCitjbGFzcyBUZXN0Q2xlYW5VcCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdENsZWFuVXAoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3RhYmxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdE5vdGhpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRlc3QgPSBUZXN0YWJsZVRlc3QoJ3Rlc3ROb3RoaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0Ll9jbGVhbnVwcywgW10pCisKKyAgICAgICAgY2xlYW51cHMgPSBbXQorCisgICAgICAgIGRlZiBjbGVhbnVwMSgqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgY2xlYW51cHMuYXBwZW5kKCgxLCBhcmdzLCBrd2FyZ3MpKQorCisgICAgICAgIGRlZiBjbGVhbnVwMigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgY2xlYW51cHMuYXBwZW5kKCgyLCBhcmdzLCBrd2FyZ3MpKQorCisgICAgICAgIHRlc3QuYWRkQ2xlYW51cChjbGVhbnVwMSwgMSwgMiwgMywgZm91cj0naGVsbG8nLCBmaXZlPSdnb29kYnllJykKKyAgICAgICAgdGVzdC5hZGRDbGVhbnVwKGNsZWFudXAyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdC5fY2xlYW51cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhjbGVhbnVwMSwgKDEsIDIsIDMpLCBkaWN0KGZvdXI9J2hlbGxvJywgZml2ZT0nZ29vZGJ5ZScpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsZWFudXAyLCAoKSwge30pXSkKKworICAgICAgICByZXN1bHQgPSB0ZXN0LmRvQ2xlYW51cHMoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xlYW51cHMsIFsoMiwgKCksIHt9KSwgKDEsICgxLCAyLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QoZm91cj0naGVsbG8nLCBmaXZlPSdnb29kYnllJykpXSkKKworICAgIGRlZiB0ZXN0Q2xlYW5VcFdpdGhFcnJvcnMoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3RhYmxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdE5vdGhpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIE1vY2tSZXN1bHQob2JqZWN0KToKKyAgICAgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgICAgICBkZWYgYWRkRXJyb3Ioc2VsZiwgdGVzdCwgZXhjX2luZm8pOgorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JzLmFwcGVuZCgodGVzdCwgZXhjX2luZm8pKQorCisgICAgICAgIHJlc3VsdCA9IE1vY2tSZXN1bHQoKQorICAgICAgICB0ZXN0ID0gVGVzdGFibGVUZXN0KCd0ZXN0Tm90aGluZycpCisgICAgICAgIHRlc3QuX3Jlc3VsdEZvckRvQ2xlYW51cHMgPSByZXN1bHQKKworICAgICAgICBleGMxID0gRXhjZXB0aW9uKCdmb28nKQorICAgICAgICBleGMyID0gRXhjZXB0aW9uKCdiYXInKQorICAgICAgICBkZWYgY2xlYW51cDEoKToKKyAgICAgICAgICAgIHJhaXNlIGV4YzEKKworICAgICAgICBkZWYgY2xlYW51cDIoKToKKyAgICAgICAgICAgIHJhaXNlIGV4YzIKKworICAgICAgICB0ZXN0LmFkZENsZWFudXAoY2xlYW51cDEpCisgICAgICAgIHRlc3QuYWRkQ2xlYW51cChjbGVhbnVwMikKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHRlc3QuZG9DbGVhbnVwcygpKQorCisgICAgICAgICh0ZXN0MSwgKFR5cGUxLCBpbnN0YW5jZTEsIF8pKSwgKHRlc3QyLCAoVHlwZTIsIGluc3RhbmNlMiwgXykpID0gcmV2ZXJzZWQoTW9ja1Jlc3VsdC5lcnJvcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHRlc3QxLCBUeXBlMSwgaW5zdGFuY2UxKSwgKHRlc3QsIEV4Y2VwdGlvbiwgZXhjMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHRlc3QyLCBUeXBlMiwgaW5zdGFuY2UyKSwgKHRlc3QsIEV4Y2VwdGlvbiwgZXhjMikpCisKKyAgICBkZWYgdGVzdENsZWFudXBJblJ1bihzZWxmKToKKyAgICAgICAgYmxvd1VwID0gRmFsc2UKKyAgICAgICAgb3JkZXJpbmcgPSBbXQorCisgICAgICAgIGNsYXNzIFRlc3RhYmxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICAgICAgICAgb3JkZXJpbmcuYXBwZW5kKCdzZXRVcCcpCisgICAgICAgICAgICAgICAgaWYgYmxvd1VwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ2ZvbycpCisKKyAgICAgICAgICAgIGRlZiB0ZXN0Tm90aGluZyhzZWxmKToKKyAgICAgICAgICAgICAgICBvcmRlcmluZy5hcHBlbmQoJ3Rlc3QnKQorCisgICAgICAgICAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICAgICAgICAgb3JkZXJpbmcuYXBwZW5kKCd0ZWFyRG93bicpCisKKyAgICAgICAgdGVzdCA9IFRlc3RhYmxlVGVzdCgndGVzdE5vdGhpbmcnKQorCisgICAgICAgIGRlZiBjbGVhbnVwMSgpOgorICAgICAgICAgICAgb3JkZXJpbmcuYXBwZW5kKCdjbGVhbnVwMScpCisgICAgICAgIGRlZiBjbGVhbnVwMigpOgorICAgICAgICAgICAgb3JkZXJpbmcuYXBwZW5kKCdjbGVhbnVwMicpCisgICAgICAgIHRlc3QuYWRkQ2xlYW51cChjbGVhbnVwMSkKKyAgICAgICAgdGVzdC5hZGRDbGVhbnVwKGNsZWFudXAyKQorCisgICAgICAgIGRlZiBzdWNjZXNzKHNvbWVfdGVzdCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvbWVfdGVzdCwgdGVzdCkKKyAgICAgICAgICAgIG9yZGVyaW5nLmFwcGVuZCgnc3VjY2VzcycpCisKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHJlc3VsdC5hZGRTdWNjZXNzID0gc3VjY2VzcworCisgICAgICAgIHRlc3QucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmRlcmluZywgWydzZXRVcCcsICd0ZXN0JywgJ3RlYXJEb3duJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbGVhbnVwMicsICdjbGVhbnVwMScsICdzdWNjZXNzJ10pCisKKyAgICAgICAgYmxvd1VwID0gVHJ1ZQorICAgICAgICBvcmRlcmluZyA9IFtdCisgICAgICAgIHRlc3QgPSBUZXN0YWJsZVRlc3QoJ3Rlc3ROb3RoaW5nJykKKyAgICAgICAgdGVzdC5hZGRDbGVhbnVwKGNsZWFudXAxKQorICAgICAgICB0ZXN0LnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JkZXJpbmcsIFsnc2V0VXAnLCAnY2xlYW51cDEnXSkKKworICAgIGRlZiB0ZXN0VGVzdENhc2VEZWJ1Z0V4ZWN1dGVzQ2xlYW51cHMoc2VsZik6CisgICAgICAgIG9yZGVyaW5nID0gW10KKworICAgICAgICBjbGFzcyBUZXN0YWJsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAgICAgICAgIG9yZGVyaW5nLmFwcGVuZCgnc2V0VXAnKQorICAgICAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChjbGVhbnVwMSkKKworICAgICAgICAgICAgZGVmIHRlc3ROb3RoaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgIG9yZGVyaW5nLmFwcGVuZCgndGVzdCcpCisKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgICAgICAgICBvcmRlcmluZy5hcHBlbmQoJ3RlYXJEb3duJykKKworICAgICAgICB0ZXN0ID0gVGVzdGFibGVUZXN0KCd0ZXN0Tm90aGluZycpCisKKyAgICAgICAgZGVmIGNsZWFudXAxKCk6CisgICAgICAgICAgICBvcmRlcmluZy5hcHBlbmQoJ2NsZWFudXAxJykKKyAgICAgICAgICAgIHRlc3QuYWRkQ2xlYW51cChjbGVhbnVwMikKKyAgICAgICAgZGVmIGNsZWFudXAyKCk6CisgICAgICAgICAgICBvcmRlcmluZy5hcHBlbmQoJ2NsZWFudXAyJykKKworICAgICAgICB0ZXN0LmRlYnVnKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmRlcmluZywgWydzZXRVcCcsICd0ZXN0JywgJ3RlYXJEb3duJywgJ2NsZWFudXAxJywgJ2NsZWFudXAyJ10pCisKKworY2xhc3MgVGVzdF9UZXh0VGVzdFJ1bm5lcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIFRleHRUZXN0UnVubmVyLiIiIgorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJ1bm5lci5mYWlsZmFzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW5uZXIuYnVmZmVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bm5lci52ZXJib3NpdHksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW5uZXIuZGVzY3JpcHRpb25zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bm5lci5yZXN1bHRjbGFzcywgdW5pdHRlc3QuVGV4dFRlc3RSZXN1bHQpCisKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX2luaGVyaXRhbmNlKHNlbGYpOgorICAgICAgICBjbGFzcyBBUmVzdWx0KHVuaXR0ZXN0LlRlc3RSZXN1bHQpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZGVzY3JpcHRpb25zLCB2ZXJib3NpdHkpOgorICAgICAgICAgICAgICAgIHN1cGVyKEFSZXN1bHQsIHNlbGYpLl9faW5pdF9fKHN0cmVhbSwgZGVzY3JpcHRpb25zLCB2ZXJib3NpdHkpCisKKyAgICAgICAgY2xhc3MgQVRleHRSZXN1bHQodW5pdHRlc3QuVGV4dFRlc3RSZXN1bHQsIEFSZXN1bHQpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgVGhpcyB1c2VkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiBkdWUgdG8gVGV4dFRlc3RSZXN1bHQgbm90IHBhc3NpbmcKKyAgICAgICAgIyBvbiBhcmd1bWVudHMgaW4gaXRzIF9faW5pdF9fIHN1cGVyIGNhbGwKKyAgICAgICAgQVRleHRSZXN1bHQoTm9uZSwgTm9uZSwgTm9uZSkKKworCisgICAgZGVmIHRlc3RCdWZmZXJBbmRGYWlsZmFzdChzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdEZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcihzdHJlYW09U3RyaW5nSU8oKSwgZmFpbGZhc3Q9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI9VHJ1ZSkKKyAgICAgICAgIyBVc2Ugb3VyIHJlc3VsdCBvYmplY3QKKyAgICAgICAgcnVubmVyLl9tYWtlUmVzdWx0ID0gbGFtYmRhOiByZXN1bHQKKyAgICAgICAgcnVubmVyLnJ1bihUZXN0KCd0ZXN0Rm9vJykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC5mYWlsZmFzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC5idWZmZXIpCisKKyAgICBkZWYgdGVzdFJ1bm5lclJlZ2lzdGVyc1Jlc3VsdChzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdEZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIG9yaWdpbmFsUmVnaXN0ZXJSZXN1bHQgPSB1bml0dGVzdC5ydW5uZXIucmVnaXN0ZXJSZXN1bHQKKyAgICAgICAgZGVmIGNsZWFudXAoKToKKyAgICAgICAgICAgIHVuaXR0ZXN0LnJ1bm5lci5yZWdpc3RlclJlc3VsdCA9IG9yaWdpbmFsUmVnaXN0ZXJSZXN1bHQKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGNsZWFudXApCisKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHN0cmVhbT1TdHJpbmdJTygpKQorICAgICAgICAjIFVzZSBvdXIgcmVzdWx0IG9iamVjdAorICAgICAgICBydW5uZXIuX21ha2VSZXN1bHQgPSBsYW1iZGE6IHJlc3VsdAorCisgICAgICAgIHNlbGYud2FzUmVnaXN0ZXJlZCA9IDAKKyAgICAgICAgZGVmIGZha2VSZWdpc3RlclJlc3VsdCh0aGlzUmVzdWx0KToKKyAgICAgICAgICAgIHNlbGYud2FzUmVnaXN0ZXJlZCArPSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRoaXNSZXN1bHQsIHJlc3VsdCkKKyAgICAgICAgdW5pdHRlc3QucnVubmVyLnJlZ2lzdGVyUmVzdWx0ID0gZmFrZVJlZ2lzdGVyUmVzdWx0CisKKyAgICAgICAgcnVubmVyLnJ1bih1bml0dGVzdC5UZXN0U3VpdGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndhc1JlZ2lzdGVyZWQsIDEpCisKKyAgICBkZWYgdGVzdF93b3Jrc193aXRoX3Jlc3VsdF93aXRob3V0X3N0YXJ0VGVzdFJ1bl9zdG9wVGVzdFJ1bihzZWxmKToKKyAgICAgICAgY2xhc3MgT2xkVGV4dFJlc3VsdChSZXN1bHRXaXRoTm9TdGFydFRlc3RSdW5TdG9wVGVzdFJ1bik6CisgICAgICAgICAgICBzZXBhcmF0b3IyID0gJycKKyAgICAgICAgICAgIGRlZiBwcmludEVycm9ycyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgUnVubmVyKHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzdXBlcihSdW5uZXIsIHNlbGYpLl9faW5pdF9fKFN0cmluZ0lPKCkpCisKKyAgICAgICAgICAgIGRlZiBfbWFrZVJlc3VsdChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gT2xkVGV4dFJlc3VsdCgpCisKKyAgICAgICAgcnVubmVyID0gUnVubmVyKCkKKyAgICAgICAgcnVubmVyLnJ1bih1bml0dGVzdC5UZXN0U3VpdGUoKSkKKworICAgIGRlZiB0ZXN0X3N0YXJ0VGVzdFJ1bl9zdG9wVGVzdFJ1bl9jYWxsZWQoc2VsZik6CisgICAgICAgIGNsYXNzIExvZ2dpbmdUZXh0UmVzdWx0KExvZ2dpbmdSZXN1bHQpOgorICAgICAgICAgICAgc2VwYXJhdG9yMiA9ICcnCisgICAgICAgICAgICBkZWYgcHJpbnRFcnJvcnMoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIExvZ2dpbmdSdW5uZXIodW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV2ZW50cyk6CisgICAgICAgICAgICAgICAgc3VwZXIoTG9nZ2luZ1J1bm5lciwgc2VsZikuX19pbml0X18oU3RyaW5nSU8oKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9ldmVudHMgPSBldmVudHMKKworICAgICAgICAgICAgZGVmIF9tYWtlUmVzdWx0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBMb2dnaW5nVGV4dFJlc3VsdChzZWxmLl9ldmVudHMpCisKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcnVubmVyID0gTG9nZ2luZ1J1bm5lcihldmVudHMpCisgICAgICAgIHJ1bm5lci5ydW4odW5pdHRlc3QuVGVzdFN1aXRlKCkpCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3RSdW4nLCAnc3RvcFRlc3RSdW4nXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9waWNrbGVfdW5waWNrbGUoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzcxOTc6IGEgVGV4dFRlc3RSdW5uZXIgc2hvdWxkIGJlICh1bilwaWNrbGVhYmxlLiBUaGlzIGlzCisgICAgICAgICMgcmVxdWlyZWQgYnkgdGVzdF9tdWx0aXByb2Nlc3NpbmcgdW5kZXIgV2luZG93cyAoaW4gdmVyYm9zZSBtb2RlKS4KKyAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8gYXMgUGlja2xlYWJsZUlPCisgICAgICAgICMgY1N0cmluZ0lPIG9iamVjdHMgYXJlIG5vdCBwaWNrbGVhYmxlLCBidXQgU3RyaW5nSU8gb2JqZWN0cyBhcmUuCisgICAgICAgIHN0cmVhbSA9IFBpY2tsZWFibGVJTygiZm9vIikKKyAgICAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoc3RyZWFtKQorICAgICAgICBmb3IgcHJvdG9jb2wgaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgIHMgPSBwaWNrbGUuZHVtcHMocnVubmVyLCBwcm90b2NvbD1wcm90b2NvbCkKKyAgICAgICAgICAgIG9iaiA9IHBpY2tsZS5sb2FkcyhzKQorICAgICAgICAgICAgIyBTdHJpbmdJTyBvYmplY3RzIG5ldmVyIGNvbXBhcmUgZXF1YWwsIGEgY2hlYXAgdGVzdCBpbnN0ZWFkLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouc3RyZWFtLmdldHZhbHVlKCksIHN0cmVhbS5nZXR2YWx1ZSgpKQorCisgICAgZGVmIHRlc3RfcmVzdWx0Y2xhc3Moc2VsZik6CisgICAgICAgIGRlZiBNb2NrUmVzdWx0Q2xhc3MoKmFyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIGFyZ3MKKyAgICAgICAgU1RSRUFNID0gb2JqZWN0KCkKKyAgICAgICAgREVTQ1JJUFRJT05TID0gb2JqZWN0KCkKKyAgICAgICAgVkVSQk9TSVRZID0gb2JqZWN0KCkKKyAgICAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoU1RSRUFNLCBERVNDUklQVElPTlMsIFZFUkJPU0lUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Y2xhc3M9TW9ja1Jlc3VsdENsYXNzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bm5lci5yZXN1bHRjbGFzcywgTW9ja1Jlc3VsdENsYXNzKQorCisgICAgICAgIGV4cGVjdGVkcmVzdWx0ID0gKHJ1bm5lci5zdHJlYW0sIERFU0NSSVBUSU9OUywgVkVSQk9TSVRZKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bm5lci5fbWFrZVJlc3VsdCgpLCBleHBlY3RlZHJlc3VsdCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcnVubmVyLnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3J1bm5lci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhYzJkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3J1bm5lci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcnVubmVyLnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3J1bm5lci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhYzJkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3J1bm5lci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2V0dXBzLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2V0dXBzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NTY4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zZXR1cHMucHkKQEAgLTAsMCArMSw1MDggQEAKK2ltcG9ydCBzeXMKKworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2ltcG9ydCB1bml0dGVzdAorCisKK2RlZiByZXN1bHRGYWN0b3J5KCpfKToKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisKKworY2xhc3MgVGVzdFNldHVwcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgZ2V0UnVubmVyKHNlbGYpOgorICAgICAgICByZXR1cm4gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIocmVzdWx0Y2xhc3M9cmVzdWx0RmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbT1TdHJpbmdJTygpKQorICAgIGRlZiBydW5UZXN0cyhzZWxmLCAqY2FzZXMpOgorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgICAgIGZvciBjYXNlIGluIGNhc2VzOgorICAgICAgICAgICAgdGVzdHMgPSB1bml0dGVzdC5kZWZhdWx0VGVzdExvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoY2FzZSkKKyAgICAgICAgICAgIHN1aXRlLmFkZFRlc3RzKHRlc3RzKQorCisgICAgICAgIHJ1bm5lciA9IHNlbGYuZ2V0UnVubmVyKCkKKworICAgICAgICAjIGNyZWF0aW5nIGEgbmVzdGVkIHN1aXRlIGV4cG9zZXMgc29tZSBwb3RlbnRpYWwgYnVncworICAgICAgICByZWFsU3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgICAgICByZWFsU3VpdGUuYWRkVGVzdChzdWl0ZSkKKyAgICAgICAgIyBhZGRpbmcgZW1wdHkgc3VpdGVzIHRvIHRoZSBlbmQgZXhwb3NlcyBwb3RlbnRpYWwgYnVncworICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0LlRlc3RTdWl0ZSgpKQorICAgICAgICByZWFsU3VpdGUuYWRkVGVzdCh1bml0dGVzdC5UZXN0U3VpdGUoKSkKKyAgICAgICAgcmV0dXJuIHJ1bm5lci5ydW4ocmVhbFN1aXRlKQorCisgICAgZGVmIHRlc3Rfc2V0dXBfY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgc2V0VXBDYWxsZWQgPSAwCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgVGVzdC5zZXRVcENhbGxlZCArPSAxCisgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2Uuc2V0VXBDbGFzcygpCisgICAgICAgICAgICBkZWYgdGVzdF9vbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfdHdvKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXN1bHQgPSBzZWxmLnJ1blRlc3RzKFRlc3QpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUZXN0LnNldFVwQ2FsbGVkLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDApCisKKyAgICBkZWYgdGVzdF90ZWFyZG93bl9jbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICB0ZWFyRG93bkNhbGxlZCA9IDAKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICBUZXN0LnRlYXJEb3duQ2FsbGVkICs9IDEKKyAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS50ZWFyRG93bkNsYXNzKCkKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHJlc3VsdCA9IHNlbGYucnVuVGVzdHMoVGVzdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRlc3QudGVhckRvd25DYWxsZWQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMCkKKworICAgIGRlZiB0ZXN0X3RlYXJkb3duX2NsYXNzX3R3b19jbGFzc2VzKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHRlYXJEb3duQ2FsbGVkID0gMAorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIFRlc3QudGVhckRvd25DYWxsZWQgKz0gMQorICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLnRlYXJEb3duQ2xhc3MoKQorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgVGVzdDIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgdGVhckRvd25DYWxsZWQgPSAwCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgVGVzdDIudGVhckRvd25DYWxsZWQgKz0gMQorICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLnRlYXJEb3duQ2xhc3MoKQorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5ydW5UZXN0cyhUZXN0LCBUZXN0MikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRlc3QudGVhckRvd25DYWxsZWQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVGVzdDIudGVhckRvd25DYWxsZWQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMCkKKworICAgIGRlZiB0ZXN0X2Vycm9yX2luX3NldHVwY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEJyb2tlblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZm9vJykKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHJlc3VsdCA9IHNlbGYucnVuVGVzdHMoQnJva2VuVGVzdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDEpCisgICAgICAgIGVycm9yLCBfID0gcmVzdWx0LmVycm9yc1swXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlcnJvciksCisgICAgICAgICAgICAgICAgICAgICdzZXRVcENsYXNzICglcy5Ccm9rZW5UZXN0KScgJSBfX25hbWVfXykKKworICAgIGRlZiB0ZXN0X2Vycm9yX2luX3RlYXJkb3duX2NsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHRvcm5Eb3duID0gMAorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIFRlc3QudG9ybkRvd24gKz0gMQorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZm9vJykKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIFRlc3QyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHRvcm5Eb3duID0gMAorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIFRlc3QyLnRvcm5Eb3duICs9IDEKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2ZvbycpCisgICAgICAgICAgICBkZWYgdGVzdF9vbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfdHdvKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXN1bHQgPSBzZWxmLnJ1blRlc3RzKFRlc3QsIFRlc3QyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVGVzdC50b3JuRG93biwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUZXN0Mi50b3JuRG93biwgMSkKKworICAgICAgICBlcnJvciwgXyA9IHJlc3VsdC5lcnJvcnNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAndGVhckRvd25DbGFzcyAoJXMuVGVzdCknICUgX19uYW1lX18pCisKKyAgICBkZWYgdGVzdF9jbGFzc19ub3RfdG9ybmRvd25fd2hlbl9zZXR1cF9mYWlscyhzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICB0b3JuRG93biA9IEZhbHNlCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgVGVzdC50b3JuRG93biA9IFRydWUKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2ZvbycpCisgICAgICAgICAgICBkZWYgdGVzdF9vbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYucnVuVGVzdHMoVGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShUZXN0LnRvcm5Eb3duKQorCisgICAgZGVmIHRlc3RfY2xhc3Nfbm90X3NldHVwX29yX3Rvcm5kb3duX3doZW5fc2tpcHBlZChzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBjbGFzc1NldFVwID0gRmFsc2UKKyAgICAgICAgICAgIHRvcm5Eb3duID0gRmFsc2UKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICBUZXN0LmNsYXNzU2V0VXAgPSBUcnVlCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgVGVzdC50b3JuRG93biA9IFRydWUKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgVGVzdCA9IHVuaXR0ZXN0LnNraXAoImhvcCIpKFRlc3QpCisgICAgICAgIHNlbGYucnVuVGVzdHMoVGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShUZXN0LmNsYXNzU2V0VXApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoVGVzdC50b3JuRG93bikKKworICAgIGRlZiB0ZXN0X3NldHVwX3RlYXJkb3duX29yZGVyX3dpdGhfcGF0aG9sb2dpY2FsX3N1aXRlKHNlbGYpOgorICAgICAgICByZXN1bHRzID0gW10KKworICAgICAgICBjbGFzcyBNb2R1bGUxKG9iamVjdCk6CisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgc2V0VXBNb2R1bGUoKToKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgnTW9kdWxlMS5zZXRVcE1vZHVsZScpCisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25Nb2R1bGUoKToKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgnTW9kdWxlMS50ZWFyRG93bk1vZHVsZScpCisKKyAgICAgICAgY2xhc3MgTW9kdWxlMihvYmplY3QpOgorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ01vZHVsZTIuc2V0VXBNb2R1bGUnKQorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHRlYXJEb3duTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ01vZHVsZTIudGVhckRvd25Nb2R1bGUnKQorCisgICAgICAgIGNsYXNzIFRlc3QxKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgnc2V0dXAgMScpCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ3RlYXJkb3duIDEnKQorICAgICAgICAgICAgZGVmIHRlc3RPbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ1Rlc3QxLnRlc3RPbmUnKQorICAgICAgICAgICAgZGVmIHRlc3RUd28oc2VsZik6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ1Rlc3QxLnRlc3RUd28nKQorCisgICAgICAgIGNsYXNzIFRlc3QyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgnc2V0dXAgMicpCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ3RlYXJkb3duIDInKQorICAgICAgICAgICAgZGVmIHRlc3RPbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ1Rlc3QyLnRlc3RPbmUnKQorICAgICAgICAgICAgZGVmIHRlc3RUd28oc2VsZik6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ1Rlc3QyLnRlc3RUd28nKQorCisgICAgICAgIGNsYXNzIFRlc3QzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgnc2V0dXAgMycpCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ3RlYXJkb3duIDMnKQorICAgICAgICAgICAgZGVmIHRlc3RPbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ1Rlc3QzLnRlc3RPbmUnKQorICAgICAgICAgICAgZGVmIHRlc3RUd28oc2VsZik6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ1Rlc3QzLnRlc3RUd28nKQorCisgICAgICAgIFRlc3QxLl9fbW9kdWxlX18gPSBUZXN0Mi5fX21vZHVsZV9fID0gJ01vZHVsZScKKyAgICAgICAgVGVzdDMuX19tb2R1bGVfXyA9ICdNb2R1bGUyJworICAgICAgICBzeXMubW9kdWxlc1snTW9kdWxlJ10gPSBNb2R1bGUxCisgICAgICAgIHN5cy5tb2R1bGVzWydNb2R1bGUyJ10gPSBNb2R1bGUyCisKKyAgICAgICAgZmlyc3QgPSB1bml0dGVzdC5UZXN0U3VpdGUoKFRlc3QxKCd0ZXN0T25lJyksKSkKKyAgICAgICAgc2Vjb25kID0gdW5pdHRlc3QuVGVzdFN1aXRlKChUZXN0MSgndGVzdFR3bycpLCkpCisgICAgICAgIHRoaXJkID0gdW5pdHRlc3QuVGVzdFN1aXRlKChUZXN0MigndGVzdE9uZScpLCkpCisgICAgICAgIGZvdXJ0aCA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgoVGVzdDIoJ3Rlc3RUd28nKSwpKQorICAgICAgICBmaWZ0aCA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgoVGVzdDMoJ3Rlc3RPbmUnKSwpKQorICAgICAgICBzaXh0aCA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgoVGVzdDMoJ3Rlc3RUd28nKSwpKQorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgoZmlyc3QsIHNlY29uZCwgdGhpcmQsIGZvdXJ0aCwgZmlmdGgsIHNpeHRoKSkKKworICAgICAgICBydW5uZXIgPSBzZWxmLmdldFJ1bm5lcigpCisgICAgICAgIHJlc3VsdCA9IHJ1bm5lci5ydW4oc3VpdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgWydNb2R1bGUxLnNldFVwTW9kdWxlJywgJ3NldHVwIDEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnVGVzdDEudGVzdE9uZScsICdUZXN0MS50ZXN0VHdvJywgJ3RlYXJkb3duIDEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0dXAgMicsICdUZXN0Mi50ZXN0T25lJywgJ1Rlc3QyLnRlc3RUd28nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVhcmRvd24gMicsICdNb2R1bGUxLnRlYXJEb3duTW9kdWxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ01vZHVsZTIuc2V0VXBNb2R1bGUnLCAnc2V0dXAgMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdUZXN0My50ZXN0T25lJywgJ1Rlc3QzLnRlc3RUd28nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVhcmRvd24gMycsICdNb2R1bGUyLnRlYXJEb3duTW9kdWxlJ10pCisKKyAgICBkZWYgdGVzdF9zZXR1cF9tb2R1bGUoc2VsZik6CisgICAgICAgIGNsYXNzIE1vZHVsZShvYmplY3QpOgorICAgICAgICAgICAgbW9kdWxlU2V0dXAgPSAwCisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgc2V0VXBNb2R1bGUoKToKKyAgICAgICAgICAgICAgICBNb2R1bGUubW9kdWxlU2V0dXAgKz0gMQorCisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIFRlc3QuX19tb2R1bGVfXyA9ICdNb2R1bGUnCisgICAgICAgIHN5cy5tb2R1bGVzWydNb2R1bGUnXSA9IE1vZHVsZQorCisgICAgICAgIHJlc3VsdCA9IHNlbGYucnVuVGVzdHMoVGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNb2R1bGUubW9kdWxlU2V0dXAsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMCkKKworICAgIGRlZiB0ZXN0X2Vycm9yX2luX3NldHVwX21vZHVsZShzZWxmKToKKyAgICAgICAgY2xhc3MgTW9kdWxlKG9iamVjdCk6CisgICAgICAgICAgICBtb2R1bGVTZXR1cCA9IDAKKyAgICAgICAgICAgIG1vZHVsZVRvcm5Eb3duID0gMAorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgTW9kdWxlLm1vZHVsZVNldHVwICs9IDEKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2ZvbycpCisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25Nb2R1bGUoKToKKyAgICAgICAgICAgICAgICBNb2R1bGUubW9kdWxlVG9ybkRvd24gKz0gMQorCisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgY2xhc3NTZXRVcCA9IEZhbHNlCisgICAgICAgICAgICBjbGFzc1Rvcm5Eb3duID0gRmFsc2UKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICBUZXN0LmNsYXNzU2V0VXAgPSBUcnVlCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgVGVzdC5jbGFzc1Rvcm5Eb3duID0gVHJ1ZQorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgVGVzdDIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIFRlc3QuX19tb2R1bGVfXyA9ICdNb2R1bGUnCisgICAgICAgIFRlc3QyLl9fbW9kdWxlX18gPSAnTW9kdWxlJworICAgICAgICBzeXMubW9kdWxlc1snTW9kdWxlJ10gPSBNb2R1bGUKKworICAgICAgICByZXN1bHQgPSBzZWxmLnJ1blRlc3RzKFRlc3QsIFRlc3QyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE1vZHVsZS5tb2R1bGVTZXR1cCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNb2R1bGUubW9kdWxlVG9ybkRvd24sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCAwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFRlc3QuY2xhc3NTZXRVcCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShUZXN0LmNsYXNzVG9ybkRvd24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAxKQorICAgICAgICBlcnJvciwgXyA9IHJlc3VsdC5lcnJvcnNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZXJyb3IpLCAnc2V0VXBNb2R1bGUgKE1vZHVsZSknKQorCisgICAgZGVmIHRlc3RfdGVzdGNhc2Vfd2l0aF9taXNzaW5nX21vZHVsZShzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF9vbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfdHdvKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgVGVzdC5fX21vZHVsZV9fID0gJ01vZHVsZScKKyAgICAgICAgc3lzLm1vZHVsZXMucG9wKCdNb2R1bGUnLCBOb25lKQorCisgICAgICAgIHJlc3VsdCA9IHNlbGYucnVuVGVzdHMoVGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDIpCisKKyAgICBkZWYgdGVzdF90ZWFyZG93bl9tb2R1bGUoc2VsZik6CisgICAgICAgIGNsYXNzIE1vZHVsZShvYmplY3QpOgorICAgICAgICAgICAgbW9kdWxlVG9ybkRvd24gPSAwCisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25Nb2R1bGUoKToKKyAgICAgICAgICAgICAgICBNb2R1bGUubW9kdWxlVG9ybkRvd24gKz0gMQorCisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIFRlc3QuX19tb2R1bGVfXyA9ICdNb2R1bGUnCisgICAgICAgIHN5cy5tb2R1bGVzWydNb2R1bGUnXSA9IE1vZHVsZQorCisgICAgICAgIHJlc3VsdCA9IHNlbGYucnVuVGVzdHMoVGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNb2R1bGUubW9kdWxlVG9ybkRvd24sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMCkKKworICAgIGRlZiB0ZXN0X2Vycm9yX2luX3RlYXJkb3duX21vZHVsZShzZWxmKToKKyAgICAgICAgY2xhc3MgTW9kdWxlKG9iamVjdCk6CisgICAgICAgICAgICBtb2R1bGVUb3JuRG93biA9IDAKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bk1vZHVsZSgpOgorICAgICAgICAgICAgICAgIE1vZHVsZS5tb2R1bGVUb3JuRG93biArPSAxCisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdmb28nKQorCisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgY2xhc3NTZXRVcCA9IEZhbHNlCisgICAgICAgICAgICBjbGFzc1Rvcm5Eb3duID0gRmFsc2UKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICBUZXN0LmNsYXNzU2V0VXAgPSBUcnVlCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgVGVzdC5jbGFzc1Rvcm5Eb3duID0gVHJ1ZQorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgVGVzdDIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIFRlc3QuX19tb2R1bGVfXyA9ICdNb2R1bGUnCisgICAgICAgIFRlc3QyLl9fbW9kdWxlX18gPSAnTW9kdWxlJworICAgICAgICBzeXMubW9kdWxlc1snTW9kdWxlJ10gPSBNb2R1bGUKKworICAgICAgICByZXN1bHQgPSBzZWxmLnJ1blRlc3RzKFRlc3QsIFRlc3QyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE1vZHVsZS5tb2R1bGVUb3JuRG93biwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShUZXN0LmNsYXNzU2V0VXApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShUZXN0LmNsYXNzVG9ybkRvd24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAxKQorICAgICAgICBlcnJvciwgXyA9IHJlc3VsdC5lcnJvcnNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZXJyb3IpLCAndGVhckRvd25Nb2R1bGUgKE1vZHVsZSknKQorCisgICAgZGVmIHRlc3Rfc2tpcHRlc3RfaW5fc2V0dXBjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ2ZvbycpCisgICAgICAgICAgICBkZWYgdGVzdF9vbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfdHdvKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXN1bHQgPSBzZWxmLnJ1blRlc3RzKFRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LnNraXBwZWQpLCAxKQorICAgICAgICBza2lwcGVkID0gcmVzdWx0LnNraXBwZWRbMF1bMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoc2tpcHBlZCksICdzZXRVcENsYXNzICglcy5UZXN0KScgJSBfX25hbWVfXykKKworICAgIGRlZiB0ZXN0X3NraXB0ZXN0X2luX3NldHVwbW9kdWxlKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIE1vZHVsZShvYmplY3QpOgorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ2ZvbycpCisKKyAgICAgICAgVGVzdC5fX21vZHVsZV9fID0gJ01vZHVsZScKKyAgICAgICAgc3lzLm1vZHVsZXNbJ01vZHVsZSddID0gTW9kdWxlCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5ydW5UZXN0cyhUZXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5za2lwcGVkKSwgMSkKKyAgICAgICAgc2tpcHBlZCA9IHJlc3VsdC5za2lwcGVkWzBdWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHNraXBwZWQpLCAnc2V0VXBNb2R1bGUgKE1vZHVsZSknKQorCisgICAgZGVmIHRlc3Rfc3VpdGVfZGVidWdfZXhlY3V0ZXNfc2V0dXBzX2FuZF90ZWFyZG93bnMoc2VsZik6CisgICAgICAgIG9yZGVyaW5nID0gW10KKworICAgICAgICBjbGFzcyBNb2R1bGUob2JqZWN0KToKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcE1vZHVsZSgpOgorICAgICAgICAgICAgICAgIG9yZGVyaW5nLmFwcGVuZCgnc2V0VXBNb2R1bGUnKQorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHRlYXJEb3duTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgb3JkZXJpbmcuYXBwZW5kKCd0ZWFyRG93bk1vZHVsZScpCisKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgb3JkZXJpbmcuYXBwZW5kKCdzZXRVcENsYXNzJykKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICBvcmRlcmluZy5hcHBlbmQoJ3RlYXJEb3duQ2xhc3MnKQorICAgICAgICAgICAgZGVmIHRlc3Rfc29tZXRoaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgIG9yZGVyaW5nLmFwcGVuZCgndGVzdF9zb21ldGhpbmcnKQorCisgICAgICAgIFRlc3QuX19tb2R1bGVfXyA9ICdNb2R1bGUnCisgICAgICAgIHN5cy5tb2R1bGVzWydNb2R1bGUnXSA9IE1vZHVsZQorCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuZGVmYXVsdFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3QpCisgICAgICAgIHN1aXRlLmRlYnVnKCkKKyAgICAgICAgZXhwZWN0ZWRPcmRlciA9IFsnc2V0VXBNb2R1bGUnLCAnc2V0VXBDbGFzcycsICd0ZXN0X3NvbWV0aGluZycsICd0ZWFyRG93bkNsYXNzJywgJ3RlYXJEb3duTW9kdWxlJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmRlcmluZywgZXhwZWN0ZWRPcmRlcikKKworICAgIGRlZiB0ZXN0X3N1aXRlX2RlYnVnX3Byb3BhZ2F0ZXNfZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgY2xhc3MgTW9kdWxlKG9iamVjdCk6CisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgc2V0VXBNb2R1bGUoKToKKyAgICAgICAgICAgICAgICBpZiBwaGFzZSA9PSAwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3NldFVwTW9kdWxlJykKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bk1vZHVsZSgpOgorICAgICAgICAgICAgICAgIGlmIHBoYXNlID09IDE6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigndGVhckRvd25Nb2R1bGUnKQorCisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIGlmIHBoYXNlID09IDI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignc2V0VXBDbGFzcycpCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgaWYgcGhhc2UgPT0gMzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCd0ZWFyRG93bkNsYXNzJykKKyAgICAgICAgICAgIGRlZiB0ZXN0X3NvbWV0aGluZyhzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBwaGFzZSA9PSA0OgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3Rlc3Rfc29tZXRoaW5nJykKKworICAgICAgICBUZXN0Ll9fbW9kdWxlX18gPSAnTW9kdWxlJworICAgICAgICBzeXMubW9kdWxlc1snTW9kdWxlJ10gPSBNb2R1bGUKKworICAgICAgICBfc3VpdGUgPSB1bml0dGVzdC5kZWZhdWx0VGVzdExvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdCkKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KF9zdWl0ZSkKKworICAgICAgICBtZXNzYWdlcyA9ICgnc2V0VXBNb2R1bGUnLCAndGVhckRvd25Nb2R1bGUnLCAnc2V0VXBDbGFzcycsICd0ZWFyRG93bkNsYXNzJywgJ3Rlc3Rfc29tZXRoaW5nJykKKyAgICAgICAgZm9yIHBoYXNlLCBtc2cgaW4gZW51bWVyYXRlKG1lc3NhZ2VzKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoRXhjZXB0aW9uLCBtc2cpOgorICAgICAgICAgICAgICAgIHN1aXRlLmRlYnVnKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3NldHVwcy5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zZXR1cHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNmM5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zZXR1cHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3NldHVwcy5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zZXR1cHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNmM5YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zZXR1cHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3NraXBwaW5nLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2tpcHBpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY2MzlkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3NraXBwaW5nLnB5CkBAIC0wLDAgKzEsMTY4IEBACitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSAuc3VwcG9ydCBpbXBvcnQgTG9nZ2luZ1Jlc3VsdAorCisKK2NsYXNzIFRlc3RfVGVzdFNraXBwaW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3NraXBwaW5nKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Rfc2tpcF9tZShzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJza2lwIikKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisgICAgICAgIHRlc3QgPSBGb28oInRlc3Rfc2tpcF9tZSIpCisgICAgICAgIHRlc3QucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIFsnc3RhcnRUZXN0JywgJ2FkZFNraXAnLCAnc3RvcFRlc3QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2tpcHBlZCwgWyh0ZXN0LCAic2tpcCIpXSkKKworICAgICAgICAjIFRyeSBsZXR0aW5nIHNldFVwIHNraXAgdGhlIHRlc3Qgbm93LgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInRlc3RpbmciKQorICAgICAgICAgICAgZGVmIHRlc3Rfbm90aGluZyhzZWxmKTogcGFzcworICAgICAgICBldmVudHMgPSBbXQorICAgICAgICByZXN1bHQgPSBMb2dnaW5nUmVzdWx0KGV2ZW50cykKKyAgICAgICAgdGVzdCA9IEZvbygidGVzdF9ub3RoaW5nIikKKyAgICAgICAgdGVzdC5ydW4ocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgWydzdGFydFRlc3QnLCAnYWRkU2tpcCcsICdzdG9wVGVzdCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5za2lwcGVkLCBbKHRlc3QsICJ0ZXN0aW5nIildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMSkKKworICAgIGRlZiB0ZXN0X3NraXBwaW5nX2RlY29yYXRvcnMoc2VsZik6CisgICAgICAgIG9wX3RhYmxlID0gKCh1bml0dGVzdC5za2lwVW5sZXNzLCBGYWxzZSwgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICh1bml0dGVzdC5za2lwSWYsIFRydWUsIEZhbHNlKSkKKyAgICAgICAgZm9yIGRlY28sIGRvX3NraXAsIGRvbnRfc2tpcCBpbiBvcF90YWJsZToKKyAgICAgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICAgICAgQGRlY28oZG9fc2tpcCwgInRlc3RpbmciKQorICAgICAgICAgICAgICAgIGRlZiB0ZXN0X3NraXAoc2VsZik6IHBhc3MKKworICAgICAgICAgICAgICAgIEBkZWNvKGRvbnRfc2tpcCwgInRlc3RpbmciKQorICAgICAgICAgICAgICAgIGRlZiB0ZXN0X2RvbnRfc2tpcChzZWxmKTogcGFzcworICAgICAgICAgICAgdGVzdF9kb19za2lwID0gRm9vKCJ0ZXN0X3NraXAiKQorICAgICAgICAgICAgdGVzdF9kb250X3NraXAgPSBGb28oInRlc3RfZG9udF9za2lwIikKKyAgICAgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFt0ZXN0X2RvX3NraXAsIHRlc3RfZG9udF9za2lwXSkKKyAgICAgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgICAgICByZXN1bHQgPSBMb2dnaW5nUmVzdWx0KGV2ZW50cykKKyAgICAgICAgICAgIHN1aXRlLnJ1bihyZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuc2tpcHBlZCksIDEpCisgICAgICAgICAgICBleHBlY3RlZCA9IFsnc3RhcnRUZXN0JywgJ2FkZFNraXAnLCAnc3RvcFRlc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YXJ0VGVzdCcsICdhZGRTdWNjZXNzJywgJ3N0b3BUZXN0J10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2tpcHBlZCwgWyh0ZXN0X2RvX3NraXAsICJ0ZXN0aW5nIildKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpCisKKyAgICBkZWYgdGVzdF9za2lwX2NsYXNzKHNlbGYpOgorICAgICAgICBAdW5pdHRlc3Quc2tpcCgidGVzdGluZyIpCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlY29yZC5hcHBlbmQoMSkKKyAgICAgICAgcmVjb3JkID0gW10KKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHRlc3QgPSBGb28oInRlc3RfMSIpCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFt0ZXN0XSkKKyAgICAgICAgc3VpdGUucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2tpcHBlZCwgWyh0ZXN0LCAidGVzdGluZyIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNvcmQsIFtdKQorCisgICAgZGVmIHRlc3Rfc2tpcF9ub25fdW5pdHRlc3RfY2xhc3Nfb2xkX3N0eWxlKHNlbGYpOgorICAgICAgICBAdW5pdHRlc3Quc2tpcCgidGVzdGluZyIpCisgICAgICAgIGNsYXNzIE1peGluOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgICAgICAgICByZWNvcmQuYXBwZW5kKDEpCisgICAgICAgIGNsYXNzIEZvbyhNaXhpbiwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgcGFzcworICAgICAgICByZWNvcmQgPSBbXQorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgdGVzdCA9IEZvbygidGVzdF8xIikKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoW3Rlc3RdKQorICAgICAgICBzdWl0ZS5ydW4ocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5za2lwcGVkLCBbKHRlc3QsICJ0ZXN0aW5nIildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY29yZCwgW10pCisKKyAgICBkZWYgdGVzdF9za2lwX25vbl91bml0dGVzdF9jbGFzc19uZXdfc3R5bGUoc2VsZik6CisgICAgICAgIEB1bml0dGVzdC5za2lwKCJ0ZXN0aW5nIikKKyAgICAgICAgY2xhc3MgTWl4aW4ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZCgxKQorICAgICAgICBjbGFzcyBGb28oTWl4aW4sIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmVjb3JkID0gW10KKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHRlc3QgPSBGb28oInRlc3RfMSIpCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFt0ZXN0XSkKKyAgICAgICAgc3VpdGUucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2tpcHBlZCwgWyh0ZXN0LCAidGVzdGluZyIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNvcmQsIFtdKQorCisgICAgZGVmIHRlc3RfZXhwZWN0ZWRfZmFpbHVyZShzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIEB1bml0dGVzdC5leHBlY3RlZEZhaWx1cmUKKyAgICAgICAgICAgIGRlZiB0ZXN0X2RpZShzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImhlbHAgbWUhIikKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisgICAgICAgIHRlc3QgPSBGb28oInRlc3RfZGllIikKKyAgICAgICAgdGVzdC5ydW4ocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ3N0YXJ0VGVzdCcsICdhZGRFeHBlY3RlZEZhaWx1cmUnLCAnc3RvcFRlc3QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZXhwZWN0ZWRGYWlsdXJlc1swXVswXSwgdGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpCisKKyAgICBkZWYgdGVzdF91bmV4cGVjdGVkX3N1Y2Nlc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBAdW5pdHRlc3QuZXhwZWN0ZWRGYWlsdXJlCisgICAgICAgICAgICBkZWYgdGVzdF9kaWUoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBldmVudHMgPSBbXQorICAgICAgICByZXN1bHQgPSBMb2dnaW5nUmVzdWx0KGV2ZW50cykKKyAgICAgICAgdGVzdCA9IEZvbygidGVzdF9kaWUiKQorICAgICAgICB0ZXN0LnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnc3RhcnRUZXN0JywgJ2FkZFVuZXhwZWN0ZWRTdWNjZXNzJywgJ3N0b3BUZXN0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0LmZhaWx1cmVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC51bmV4cGVjdGVkU3VjY2Vzc2VzLCBbdGVzdF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKQorCisgICAgZGVmIHRlc3Rfc2tpcF9kb2VzbnRfcnVuX3NldHVwKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgd2FzU2V0VXAgPSBGYWxzZQorICAgICAgICAgICAgd2FzVG9ybkRvd24gPSBGYWxzZQorICAgICAgICAgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAgICAgICAgIEZvby53YXNTZXRVcCA9IFRydWUKKyAgICAgICAgICAgIGRlZiB0b3JuRG93bihzZWxmKToKKyAgICAgICAgICAgICAgICBGb28ud2FzVG9ybkRvd24gPSBUcnVlCisgICAgICAgICAgICBAdW5pdHRlc3Quc2tpcCgndGVzdGluZycpCisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgdGVzdCA9IEZvbygidGVzdF8xIikKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoW3Rlc3RdKQorICAgICAgICBzdWl0ZS5ydW4ocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5za2lwcGVkLCBbKHRlc3QsICJ0ZXN0aW5nIildKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEZvby53YXNTZXRVcCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGb28ud2FzVG9ybkRvd24pCisKKyAgICBkZWYgdGVzdF9kZWNvcmF0ZWRfc2tpcChzZWxmKToKKyAgICAgICAgZGVmIGRlY29yYXRvcihmdW5jKToKKyAgICAgICAgICAgIGRlZiBpbm5lcigqYSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmEpCisgICAgICAgICAgICByZXR1cm4gaW5uZXIKKworICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgQGRlY29yYXRvcgorICAgICAgICAgICAgQHVuaXR0ZXN0LnNraXAoJ3Rlc3RpbmcnKQorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHRlc3QgPSBGb28oInRlc3RfMSIpCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFt0ZXN0XSkKKyAgICAgICAgc3VpdGUucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2tpcHBlZCwgWyh0ZXN0LCAidGVzdGluZyIpXSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2tpcHBpbmcucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2tpcHBpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNjRmYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9za2lwcGluZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2tpcHBpbmcucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2tpcHBpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNjRmYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9za2lwcGluZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc3VpdGUucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zdWl0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmZiNTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc3VpdGUucHkKQEAgLTAsMCArMSwzNjcgQEAKK2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgc3lzCitmcm9tIC5zdXBwb3J0IGltcG9ydCBMb2dnaW5nUmVzdWx0LCBUZXN0RXF1YWxpdHkKKworCisjIyMgU3VwcG9ydCBjb2RlIGZvciBUZXN0X1Rlc3RTdWl0ZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBUZXN0KG9iamVjdCk6CisgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgIGRlZiB0ZXN0XzMoc2VsZik6IHBhc3MKKyAgICAgICAgZGVmIHJ1blRlc3Qoc2VsZik6IHBhc3MKKworZGVmIF9ta19UZXN0U3VpdGUoKm5hbWVzKToKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKFRlc3QuRm9vKG4pIGZvciBuIGluIG5hbWVzKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworY2xhc3MgVGVzdF9UZXN0U3VpdGUodW5pdHRlc3QuVGVzdENhc2UsIFRlc3RFcXVhbGl0eSk6CisKKyAgICAjIyMgU2V0IHVwIGF0dHJpYnV0ZXMgbmVlZGVkIGJ5IGluaGVyaXRlZCB0ZXN0cworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICMgVXNlZCBieSBUZXN0RXF1YWxpdHkudGVzdF9lcQorICAgIGVxX3BhaXJzID0gWyh1bml0dGVzdC5UZXN0U3VpdGUoKSwgdW5pdHRlc3QuVGVzdFN1aXRlKCkpLAorICAgICAgICAgICAgICAgICh1bml0dGVzdC5UZXN0U3VpdGUoKSwgdW5pdHRlc3QuVGVzdFN1aXRlKFtdKSksCisgICAgICAgICAgICAgICAoX21rX1Rlc3RTdWl0ZSgndGVzdF8xJyksIF9ta19UZXN0U3VpdGUoJ3Rlc3RfMScpKV0KKworICAgICMgVXNlZCBieSBUZXN0RXF1YWxpdHkudGVzdF9uZQorICAgIG5lX3BhaXJzID0gWyh1bml0dGVzdC5UZXN0U3VpdGUoKSwgX21rX1Rlc3RTdWl0ZSgndGVzdF8xJykpLAorICAgICAgICAgICAgICAgICh1bml0dGVzdC5UZXN0U3VpdGUoW10pLCBfbWtfVGVzdFN1aXRlKCd0ZXN0XzEnKSksCisgICAgICAgICAgICAgICAgKF9ta19UZXN0U3VpdGUoJ3Rlc3RfMScsICd0ZXN0XzInKSwgX21rX1Rlc3RTdWl0ZSgndGVzdF8xJywgJ3Rlc3RfMycpKSwKKyAgICAgICAgICAgICAgICAoX21rX1Rlc3RTdWl0ZSgndGVzdF8xJyksIF9ta19UZXN0U3VpdGUoJ3Rlc3RfMicpKV0KKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIyMgL1NldCB1cCBhdHRyaWJ1dGVzIG5lZWRlZCBieSBpbmhlcml0ZWQgdGVzdHMKKworICAgICMjIyBUZXN0cyBmb3IgVGVzdFN1aXRlLl9faW5pdF9fCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgIyAiY2xhc3MgVGVzdFN1aXRlKFt0ZXN0c10pIgorICAgICMKKyAgICAjIFRoZSB0ZXN0cyBpdGVyYWJsZSBzaG91bGQgYmUgb3B0aW9uYWwKKyAgICBkZWYgdGVzdF9pbml0X190ZXN0c19vcHRpb25hbChzZWxmKToKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGUuY291bnRUZXN0Q2FzZXMoKSwgMCkKKworICAgICMgImNsYXNzIFRlc3RTdWl0ZShbdGVzdHNdKSIKKyAgICAjIC4uLgorICAgICMgIklmIHRlc3RzIGlzIGdpdmVuLCBpdCBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mIGluZGl2aWR1YWwgdGVzdCBjYXNlcworICAgICMgb3Igb3RoZXIgdGVzdCBzdWl0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIHN1aXRlIGluaXRpYWxseSIKKyAgICAjCisgICAgIyBUZXN0U3VpdGUgc2hvdWxkIGRlYWwgd2l0aCBlbXB0eSB0ZXN0cyBpdGVyYWJsZXMgYnkgYWxsb3dpbmcgdGhlCisgICAgIyBjcmVhdGlvbiBvZiBhbiBlbXB0eSBzdWl0ZQorICAgIGRlZiB0ZXN0X2luaXRfX2VtcHR5X3Rlc3RzKHNlbGYpOgorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlLmNvdW50VGVzdENhc2VzKCksIDApCisKKyAgICAjICJjbGFzcyBUZXN0U3VpdGUoW3Rlc3RzXSkiCisgICAgIyAuLi4KKyAgICAjICJJZiB0ZXN0cyBpcyBnaXZlbiwgaXQgbXVzdCBiZSBhbiBpdGVyYWJsZSBvZiBpbmRpdmlkdWFsIHRlc3QgY2FzZXMKKyAgICAjIG9yIG90aGVyIHRlc3Qgc3VpdGVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSBzdWl0ZSBpbml0aWFsbHkiCisgICAgIworICAgICMgVGVzdFN1aXRlIHNob3VsZCBhbGxvdyBhbnkgaXRlcmFibGUgdG8gcHJvdmlkZSB0ZXN0cworICAgIGRlZiB0ZXN0X2luaXRfX3Rlc3RzX2Zyb21fYW55X2l0ZXJhYmxlKHNlbGYpOgorICAgICAgICBkZWYgdGVzdHMoKToKKyAgICAgICAgICAgIHlpZWxkIHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorICAgICAgICAgICAgeWllbGQgdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZShsYW1iZGE6IE5vbmUpCisKKyAgICAgICAgc3VpdGVfMSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSh0ZXN0cygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlXzEuY291bnRUZXN0Q2FzZXMoKSwgMikKKworICAgICAgICBzdWl0ZV8yID0gdW5pdHRlc3QuVGVzdFN1aXRlKHN1aXRlXzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGVfMi5jb3VudFRlc3RDYXNlcygpLCAyKQorCisgICAgICAgIHN1aXRlXzMgPSB1bml0dGVzdC5UZXN0U3VpdGUoc2V0KHN1aXRlXzEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlXzMuY291bnRUZXN0Q2FzZXMoKSwgMikKKworICAgICMgImNsYXNzIFRlc3RTdWl0ZShbdGVzdHNdKSIKKyAgICAjIC4uLgorICAgICMgIklmIHRlc3RzIGlzIGdpdmVuLCBpdCBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mIGluZGl2aWR1YWwgdGVzdCBjYXNlcworICAgICMgb3Igb3RoZXIgdGVzdCBzdWl0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIHN1aXRlIGluaXRpYWxseSIKKyAgICAjCisgICAgIyBEb2VzIFRlc3RTdWl0ZSgpIGFsc28gYWxsb3cgb3RoZXIgVGVzdFN1aXRlKCkgaW5zdGFuY2VzIHRvIGJlIHByZXNlbnQKKyAgICAjIGluIHRoZSB0ZXN0cyBpdGVyYWJsZT8KKyAgICBkZWYgdGVzdF9pbml0X19UZXN0U3VpdGVfaW5zdGFuY2VzX2luX3Rlc3RzKHNlbGYpOgorICAgICAgICBkZWYgdGVzdHMoKToKKyAgICAgICAgICAgIGZ0YyA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorICAgICAgICAgICAgeWllbGQgdW5pdHRlc3QuVGVzdFN1aXRlKFtmdGNdKQorICAgICAgICAgICAgeWllbGQgdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZShsYW1iZGE6IE5vbmUpCisKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUodGVzdHMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZS5jb3VudFRlc3RDYXNlcygpLCAyKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMjIyAvVGVzdHMgZm9yIFRlc3RTdWl0ZS5fX2luaXRfXworCisgICAgIyBDb250YWluZXIgdHlwZXMgc2hvdWxkIHN1cHBvcnQgdGhlIGl0ZXIgcHJvdG9jb2wKKyAgICBkZWYgdGVzdF9pdGVyKHNlbGYpOgorICAgICAgICB0ZXN0MSA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorICAgICAgICB0ZXN0MiA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgodGVzdDEsIHRlc3QyKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbdGVzdDEsIHRlc3QyXSkKKworICAgICMgIlJldHVybiB0aGUgbnVtYmVyIG9mIHRlc3RzIHJlcHJlc2VudGVkIGJ5IHRoZSB0aGlzIHRlc3Qgb2JqZWN0LgorICAgICMgLi4udGhpcyBtZXRob2QgaXMgYWxzbyBpbXBsZW1lbnRlZCBieSB0aGUgVGVzdFN1aXRlIGNsYXNzLCB3aGljaCBjYW4KKyAgICAjIHJldHVybiBsYXJnZXIgW2dyZWF0ZXIgdGhhbiAxXSB2YWx1ZXMiCisgICAgIworICAgICMgUHJlc3VtYWJseSBhbiBlbXB0eSBUZXN0U3VpdGUgcmV0dXJucyAwPworICAgIGRlZiB0ZXN0X2NvdW50VGVzdENhc2VzX3plcm9fc2ltcGxlKHNlbGYpOgorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZS5jb3VudFRlc3RDYXNlcygpLCAwKQorCisgICAgIyAiUmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgcmVwcmVzZW50ZWQgYnkgdGhlIHRoaXMgdGVzdCBvYmplY3QuCisgICAgIyAuLi50aGlzIG1ldGhvZCBpcyBhbHNvIGltcGxlbWVudGVkIGJ5IHRoZSBUZXN0U3VpdGUgY2xhc3MsIHdoaWNoIGNhbgorICAgICMgcmV0dXJuIGxhcmdlciBbZ3JlYXRlciB0aGFuIDFdIHZhbHVlcyIKKyAgICAjCisgICAgIyBQcmVzdW1hYmx5IGFuIGVtcHR5IFRlc3RTdWl0ZSAoZXZlbiBpZiBpdCBjb250YWlucyBvdGhlciBlbXB0eQorICAgICMgVGVzdFN1aXRlIGluc3RhbmNlcykgcmV0dXJucyAwPworICAgIGRlZiB0ZXN0X2NvdW50VGVzdENhc2VzX3plcm9fbmVzdGVkKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0MSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoW3VuaXR0ZXN0LlRlc3RTdWl0ZSgpXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlLmNvdW50VGVzdENhc2VzKCksIDApCisKKyAgICAjICJSZXR1cm4gdGhlIG51bWJlciBvZiB0ZXN0cyByZXByZXNlbnRlZCBieSB0aGUgdGhpcyB0ZXN0IG9iamVjdC4KKyAgICAjIC4uLnRoaXMgbWV0aG9kIGlzIGFsc28gaW1wbGVtZW50ZWQgYnkgdGhlIFRlc3RTdWl0ZSBjbGFzcywgd2hpY2ggY2FuCisgICAgIyByZXR1cm4gbGFyZ2VyIFtncmVhdGVyIHRoYW4gMV0gdmFsdWVzIgorICAgIGRlZiB0ZXN0X2NvdW50VGVzdENhc2VzX3NpbXBsZShzZWxmKToKKyAgICAgICAgdGVzdDEgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKyAgICAgICAgdGVzdDIgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKHRlc3QxLCB0ZXN0MikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZS5jb3VudFRlc3RDYXNlcygpLCAyKQorCisgICAgIyAiUmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgcmVwcmVzZW50ZWQgYnkgdGhlIHRoaXMgdGVzdCBvYmplY3QuCisgICAgIyAuLi50aGlzIG1ldGhvZCBpcyBhbHNvIGltcGxlbWVudGVkIGJ5IHRoZSBUZXN0U3VpdGUgY2xhc3MsIHdoaWNoIGNhbgorICAgICMgcmV0dXJuIGxhcmdlciBbZ3JlYXRlciB0aGFuIDFdIHZhbHVlcyIKKyAgICAjCisgICAgIyBNYWtlIHN1cmUgdGhpcyBob2xkcyBmb3IgbmVzdGVkIFRlc3RTdWl0ZSBpbnN0YW5jZXMsIHRvbworICAgIGRlZiB0ZXN0X2NvdW50VGVzdENhc2VzX25lc3RlZChzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdDEodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3QxKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdDIoc2VsZik6IHBhc3MKKworICAgICAgICB0ZXN0MiA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorICAgICAgICB0ZXN0MyA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorICAgICAgICBjaGlsZCA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgoVGVzdDEoJ3Rlc3QyJyksIHRlc3QyKSkKKyAgICAgICAgcGFyZW50ID0gdW5pdHRlc3QuVGVzdFN1aXRlKCh0ZXN0MywgY2hpbGQsIFRlc3QxKCd0ZXN0MScpKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmVudC5jb3VudFRlc3RDYXNlcygpLCA0KQorCisgICAgIyAiUnVuIHRoZSB0ZXN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdWl0ZSwgY29sbGVjdGluZyB0aGUgcmVzdWx0IGludG8KKyAgICAjIHRoZSB0ZXN0IHJlc3VsdCBvYmplY3QgcGFzc2VkIGFzIHJlc3VsdC4iCisgICAgIworICAgICMgQW5kIGlmIHRoZXJlIGFyZSBubyB0ZXN0cz8gV2hhdCB0aGVuPworICAgIGRlZiB0ZXN0X3J1bl9fZW1wdHlfc3VpdGUoc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgICAgICBzdWl0ZS5ydW4ocmVzdWx0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBbXSkKKworICAgICMgIk5vdGUgdGhhdCB1bmxpa2UgVGVzdENhc2UucnVuKCksIFRlc3RTdWl0ZS5ydW4oKSByZXF1aXJlcyB0aGUKKyAgICAjICJyZXN1bHQgb2JqZWN0IHRvIGJlIHBhc3NlZCBpbi4iCisgICAgZGVmIHRlc3RfcnVuX19yZXF1aXJlc19yZXN1bHQoc2VsZik6CisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzdWl0ZS5ydW4oKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJGYWlsZWQgdG8gcmFpc2UgVHlwZUVycm9yIikKKworICAgICMgIlJ1biB0aGUgdGVzdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3VpdGUsIGNvbGxlY3RpbmcgdGhlIHJlc3VsdCBpbnRvCisgICAgIyB0aGUgdGVzdCByZXN1bHQgb2JqZWN0IHBhc3NlZCBhcyByZXN1bHQuIgorICAgIGRlZiB0ZXN0X3J1bihzZWxmKToKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisKKyAgICAgICAgY2xhc3MgTG9nZ2luZ0Nhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHJ1bihzZWxmLCByZXN1bHQpOgorICAgICAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoJ3J1biAlcycgJSBzZWxmLl90ZXN0TWV0aG9kTmFtZSkKKworICAgICAgICAgICAgZGVmIHRlc3QxKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdDIoc2VsZik6IHBhc3MKKworICAgICAgICB0ZXN0cyA9IFtMb2dnaW5nQ2FzZSgndGVzdDEnKSwgTG9nZ2luZ0Nhc2UoJ3Rlc3QyJyldCisKKyAgICAgICAgdW5pdHRlc3QuVGVzdFN1aXRlKHRlc3RzKS5ydW4ocmVzdWx0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBbJ3J1biB0ZXN0MScsICdydW4gdGVzdDInXSkKKworICAgICMgIkFkZCBhIFRlc3RDYXNlIC4uLiB0byB0aGUgc3VpdGUiCisgICAgZGVmIHRlc3RfYWRkVGVzdF9fVGVzdENhc2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKTogcGFzcworCisgICAgICAgIHRlc3QgPSBGb28oJ3Rlc3QnKQorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh0ZXN0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGUuY291bnRUZXN0Q2FzZXMoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW3Rlc3RdKQorCisgICAgIyAiQWRkIGEgLi4uIFRlc3RTdWl0ZSB0byB0aGUgc3VpdGUiCisgICAgZGVmIHRlc3RfYWRkVGVzdF9fVGVzdFN1aXRlKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6IHBhc3MKKworICAgICAgICBzdWl0ZV8yID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtGb28oJ3Rlc3QnKV0pCisKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KHN1aXRlXzIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZS5jb3VudFRlc3RDYXNlcygpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbc3VpdGVfMl0pCisKKyAgICAjICJBZGQgYWxsIHRoZSB0ZXN0cyBmcm9tIGFuIGl0ZXJhYmxlIG9mIFRlc3RDYXNlIGFuZCBUZXN0U3VpdGUKKyAgICAjIGluc3RhbmNlcyB0byB0aGlzIHRlc3Qgc3VpdGUuIgorICAgICMKKyAgICAjICJUaGlzIGlzIGVxdWl2YWxlbnQgdG8gaXRlcmF0aW5nIG92ZXIgdGVzdHMsIGNhbGxpbmcgYWRkVGVzdCgpIGZvcgorICAgICMgZWFjaCBlbGVtZW50IgorICAgIGRlZiB0ZXN0X2FkZFRlc3RzKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworCisgICAgICAgIHRlc3RfMSA9IEZvbygndGVzdF8xJykKKyAgICAgICAgdGVzdF8yID0gRm9vKCd0ZXN0XzInKQorICAgICAgICBpbm5lcl9zdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbdGVzdF8yXSkKKworICAgICAgICBkZWYgZ2VuKCk6CisgICAgICAgICAgICB5aWVsZCB0ZXN0XzEKKyAgICAgICAgICAgIHlpZWxkIHRlc3RfMgorICAgICAgICAgICAgeWllbGQgaW5uZXJfc3VpdGUKKworICAgICAgICBzdWl0ZV8xID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICAgICAgc3VpdGVfMS5hZGRUZXN0cyhnZW4oKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGVfMSksIGxpc3QoZ2VuKCkpKQorCisgICAgICAgICMgIlRoaXMgaXMgZXF1aXZhbGVudCB0byBpdGVyYXRpbmcgb3ZlciB0ZXN0cywgY2FsbGluZyBhZGRUZXN0KCkgZm9yCisgICAgICAgICMgZWFjaCBlbGVtZW50IgorICAgICAgICBzdWl0ZV8yID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICAgICAgZm9yIHQgaW4gZ2VuKCk6CisgICAgICAgICAgICBzdWl0ZV8yLmFkZFRlc3QodCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlXzEsIHN1aXRlXzIpCisKKyAgICAjICJBZGQgYWxsIHRoZSB0ZXN0cyBmcm9tIGFuIGl0ZXJhYmxlIG9mIFRlc3RDYXNlIGFuZCBUZXN0U3VpdGUKKyAgICAjIGluc3RhbmNlcyB0byB0aGlzIHRlc3Qgc3VpdGUuIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyBpZiBpdCBkb2Vzbid0IGdldCBhbiBpdGVyYWJsZT8KKyAgICBkZWYgdGVzdF9hZGRUZXN0X19ub25pdGVyYWJsZShzZWxmKToKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1aXRlLmFkZFRlc3RzKDUpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkZhaWxlZCB0byByYWlzZSBUeXBlRXJyb3IiKQorCisgICAgZGVmIHRlc3RfYWRkVGVzdF9fbm9uY2FsbGFibGUoc2VsZik6CisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdWl0ZS5hZGRUZXN0LCA1KQorCisgICAgZGVmIHRlc3RfYWRkVGVzdF9fY2FzZXN1aXRlY2xhc3Moc2VsZik6CisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdWl0ZS5hZGRUZXN0LCBUZXN0X1Rlc3RTdWl0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdWl0ZS5hZGRUZXN0LCB1bml0dGVzdC5UZXN0U3VpdGUpCisKKyAgICBkZWYgdGVzdF9hZGRUZXN0c19fc3RyaW5nKHNlbGYpOgorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3VpdGUuYWRkVGVzdHMsICJmb28iKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb25faW5fc3VpdGUoc2VsZik6CisgICAgICAgIGRlZiBmKF8pOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgICAgIHN1aXRlLmFkZFRlc3QoZikKKworICAgICAgICAjIHdoZW4gdGhlIGJ1ZyBpcyBmaXhlZCB0aGlzIGxpbmUgd2lsbCBub3QgY3Jhc2gKKyAgICAgICAgc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKworCisKKyAgICBkZWYgdGVzdF9iYXNldGVzdHN1aXRlKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHdhc1NldFVwID0gRmFsc2UKKyAgICAgICAgICAgIHdhc1Rvcm5Eb3duID0gRmFsc2UKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICBjbHMud2FzU2V0VXAgPSBUcnVlCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgY2xzLndhc1Rvcm5Eb3duID0gVHJ1ZQorICAgICAgICAgICAgZGVmIHRlc3RQYXNzKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0RmFpbChzZWxmKToKKyAgICAgICAgICAgICAgICBmYWlsCisgICAgICAgIGNsYXNzIE1vZHVsZShvYmplY3QpOgorICAgICAgICAgICAgd2FzU2V0VXAgPSBGYWxzZQorICAgICAgICAgICAgd2FzVG9ybkRvd24gPSBGYWxzZQorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgTW9kdWxlLndhc1NldFVwID0gVHJ1ZQorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHRlYXJEb3duTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgTW9kdWxlLndhc1Rvcm5Eb3duID0gVHJ1ZQorCisgICAgICAgIFRlc3QuX19tb2R1bGVfXyA9ICdNb2R1bGUnCisgICAgICAgIHN5cy5tb2R1bGVzWydNb2R1bGUnXSA9IE1vZHVsZQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3lzLm1vZHVsZXMucG9wLCAnTW9kdWxlJykKKworICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LkJhc2VUZXN0U3VpdGUoKQorICAgICAgICBzdWl0ZS5hZGRUZXN0cyhbVGVzdCgndGVzdFBhc3MnKSwgVGVzdCgndGVzdEZhaWwnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGUuY291bnRUZXN0Q2FzZXMoKSwgMikKKworICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgc3VpdGUucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShNb2R1bGUud2FzU2V0VXApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoTW9kdWxlLndhc1Rvcm5Eb3duKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFRlc3Qud2FzU2V0VXApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoVGVzdC53YXNUb3JuRG93bikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5mYWlsdXJlcyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCAyKQorCisKKyAgICBkZWYgdGVzdF9vdmVycmlkaW5nX2NhbGwoc2VsZik6CisgICAgICAgIGNsYXNzIE15U3VpdGUodW5pdHRlc3QuVGVzdFN1aXRlKToKKyAgICAgICAgICAgIGNhbGxlZCA9IEZhbHNlCisgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICAgICAgICAgIHNlbGYuY2FsbGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RTdWl0ZS5fX2NhbGxfXyhzZWxmLCAqYXJncywgKiprdykKKworICAgICAgICBzdWl0ZSA9IE15U3VpdGUoKQorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgd3JhcHBlciA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgICAgIHdyYXBwZXIuYWRkVGVzdChzdWl0ZSkKKyAgICAgICAgd3JhcHBlcihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWl0ZS5jYWxsZWQpCisKKyAgICAgICAgIyByZXVzaW5nIHJlc3VsdHMgc2hvdWxkIGJlIHBlcm1pdHRlZCBldmVuIGlmIGFib21pbmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHQuX3Rlc3RSdW5FbnRlcmVkKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zdWl0ZS5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyMzQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3N1aXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zdWl0ZS5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEyMzQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3N1aXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3V0aWwucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIwYTAyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdXRpbC5weQpAQCAtMCwwICsxLDE1NiBAQAorIiIiVmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucy4iIiIKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUsIE9yZGVyZWREaWN0CisKKworX191bml0dGVzdCA9IFRydWUKKworX01BWF9MRU5HVEggPSA4MAorZGVmIHNhZmVfcmVwcihvYmosIHNob3J0PUZhbHNlKToKKyAgICB0cnk6CisgICAgICAgIHJlc3VsdCA9IHJlcHIob2JqKQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHJlc3VsdCA9IG9iamVjdC5fX3JlcHJfXyhvYmopCisgICAgaWYgbm90IHNob3J0IG9yIGxlbihyZXN1bHQpIDwgX01BWF9MRU5HVEg6CisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICByZXR1cm4gcmVzdWx0WzpfTUFYX0xFTkdUSF0gKyAnIFt0cnVuY2F0ZWRdLi4uJworCisKK2RlZiBzdHJjbGFzcyhjbHMpOgorICAgIHJldHVybiAiJXMuJXMiICUgKGNscy5fX21vZHVsZV9fLCBjbHMuX19uYW1lX18pCisKK2RlZiBzb3J0ZWRfbGlzdF9kaWZmZXJlbmNlKGV4cGVjdGVkLCBhY3R1YWwpOgorICAgICIiIkZpbmRzIGVsZW1lbnRzIGluIG9ubHkgb25lIG9yIHRoZSBvdGhlciBvZiB0d28sIHNvcnRlZCBpbnB1dCBsaXN0cy4KKworICAgIFJldHVybnMgYSB0d28tZWxlbWVudCB0dXBsZSBvZiBsaXN0cy4gICAgVGhlIGZpcnN0IGxpc3QgY29udGFpbnMgdGhvc2UKKyAgICBlbGVtZW50cyBpbiB0aGUgImV4cGVjdGVkIiBsaXN0IGJ1dCBub3QgaW4gdGhlICJhY3R1YWwiIGxpc3QsIGFuZCB0aGUKKyAgICBzZWNvbmQgY29udGFpbnMgdGhvc2UgZWxlbWVudHMgaW4gdGhlICJhY3R1YWwiIGxpc3QgYnV0IG5vdCBpbiB0aGUKKyAgICAiZXhwZWN0ZWQiIGxpc3QuICAgIER1cGxpY2F0ZSBlbGVtZW50cyBpbiBlaXRoZXIgaW5wdXQgbGlzdCBhcmUgaWdub3JlZC4KKyAgICAiIiIKKyAgICBpID0gaiA9IDAKKyAgICBtaXNzaW5nID0gW10KKyAgICB1bmV4cGVjdGVkID0gW10KKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBlID0gZXhwZWN0ZWRbaV0KKyAgICAgICAgICAgIGEgPSBhY3R1YWxbal0KKyAgICAgICAgICAgIGlmIGUgPCBhOgorICAgICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKGUpCisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAgICAgd2hpbGUgZXhwZWN0ZWRbaV0gPT0gZToKKyAgICAgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBlbGlmIGUgPiBhOgorICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWQuYXBwZW5kKGEpCisgICAgICAgICAgICAgICAgaiArPSAxCisgICAgICAgICAgICAgICAgd2hpbGUgYWN0dWFsW2pdID09IGE6CisgICAgICAgICAgICAgICAgICAgIGogKz0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIGV4cGVjdGVkW2ldID09IGU6CisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBqICs9IDEKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgYWN0dWFsW2pdID09IGE6CisgICAgICAgICAgICAgICAgICAgICAgICBqICs9IDEKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBtaXNzaW5nLmV4dGVuZChleHBlY3RlZFtpOl0pCisgICAgICAgICAgICB1bmV4cGVjdGVkLmV4dGVuZChhY3R1YWxbajpdKQorICAgICAgICAgICAgYnJlYWsKKyAgICByZXR1cm4gbWlzc2luZywgdW5leHBlY3RlZAorCisKK2RlZiB1bm9yZGVyYWJsZV9saXN0X2RpZmZlcmVuY2UoZXhwZWN0ZWQsIGFjdHVhbCwgaWdub3JlX2R1cGxpY2F0ZT1GYWxzZSk6CisgICAgIiIiU2FtZSBiZWhhdmlvciBhcyBzb3J0ZWRfbGlzdF9kaWZmZXJlbmNlIGJ1dAorICAgIGZvciBsaXN0cyBvZiB1bm9yZGVyYWJsZSBpdGVtcyAobGlrZSBkaWN0cykuCisKKyAgICBBcyBpdCBkb2VzIGEgbGluZWFyIHNlYXJjaCBwZXIgaXRlbSAocmVtb3ZlKSBpdAorICAgIGhhcyBPKG4qbikgcGVyZm9ybWFuY2UuCisgICAgIiIiCisgICAgbWlzc2luZyA9IFtdCisgICAgdW5leHBlY3RlZCA9IFtdCisgICAgd2hpbGUgZXhwZWN0ZWQ6CisgICAgICAgIGl0ZW0gPSBleHBlY3RlZC5wb3AoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhY3R1YWwucmVtb3ZlKGl0ZW0pCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoaXRlbSkKKyAgICAgICAgaWYgaWdub3JlX2R1cGxpY2F0ZToKKyAgICAgICAgICAgIGZvciBsc3QgaW4gZXhwZWN0ZWQsIGFjdHVhbDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICBsc3QucmVtb3ZlKGl0ZW0pCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICBpZiBpZ25vcmVfZHVwbGljYXRlOgorICAgICAgICB3aGlsZSBhY3R1YWw6CisgICAgICAgICAgICBpdGVtID0gYWN0dWFsLnBvcCgpCisgICAgICAgICAgICB1bmV4cGVjdGVkLmFwcGVuZChpdGVtKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIGFjdHVhbC5yZW1vdmUoaXRlbSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIG1pc3NpbmcsIHVuZXhwZWN0ZWQKKworICAgICMgYW55dGhpbmcgbGVmdCBpbiBhY3R1YWwgaXMgdW5leHBlY3RlZAorICAgIHJldHVybiBtaXNzaW5nLCBhY3R1YWwKKworX01pc21hdGNoID0gbmFtZWR0dXBsZSgnTWlzbWF0Y2gnLCAnYWN0dWFsIGV4cGVjdGVkIHZhbHVlJykKKworZGVmIF9jb3VudF9kaWZmX2FsbF9wdXJwb3NlKGFjdHVhbCwgZXhwZWN0ZWQpOgorICAgICdSZXR1cm5zIGxpc3Qgb2YgKGNudF9hY3QsIGNudF9leHAsIGVsZW0pIHRyaXBsZXMgd2hlcmUgdGhlIGNvdW50cyBkaWZmZXInCisgICAgIyBlbGVtZW50cyBuZWVkIG5vdCBiZSBoYXNoYWJsZQorICAgIHMsIHQgPSBsaXN0KGFjdHVhbCksIGxpc3QoZXhwZWN0ZWQpCisgICAgbSwgbiA9IGxlbihzKSwgbGVuKHQpCisgICAgTlVMTCA9IG9iamVjdCgpCisgICAgcmVzdWx0ID0gW10KKyAgICBmb3IgaSwgZWxlbSBpbiBlbnVtZXJhdGUocyk6CisgICAgICAgIGlmIGVsZW0gaXMgTlVMTDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGNudF9zID0gY250X3QgPSAwCisgICAgICAgIGZvciBqIGluIHJhbmdlKGksIG0pOgorICAgICAgICAgICAgaWYgc1tqXSA9PSBlbGVtOgorICAgICAgICAgICAgICAgIGNudF9zICs9IDEKKyAgICAgICAgICAgICAgICBzW2pdID0gTlVMTAorICAgICAgICBmb3Igaiwgb3RoZXJfZWxlbSBpbiBlbnVtZXJhdGUodCk6CisgICAgICAgICAgICBpZiBvdGhlcl9lbGVtID09IGVsZW06CisgICAgICAgICAgICAgICAgY250X3QgKz0gMQorICAgICAgICAgICAgICAgIHRbal0gPSBOVUxMCisgICAgICAgIGlmIGNudF9zICE9IGNudF90OgorICAgICAgICAgICAgZGlmZiA9IF9NaXNtYXRjaChjbnRfcywgY250X3QsIGVsZW0pCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGRpZmYpCisKKyAgICBmb3IgaSwgZWxlbSBpbiBlbnVtZXJhdGUodCk6CisgICAgICAgIGlmIGVsZW0gaXMgTlVMTDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGNudF90ID0gMAorICAgICAgICBmb3IgaiBpbiByYW5nZShpLCBuKToKKyAgICAgICAgICAgIGlmIHRbal0gPT0gZWxlbToKKyAgICAgICAgICAgICAgICBjbnRfdCArPSAxCisgICAgICAgICAgICAgICAgdFtqXSA9IE5VTEwKKyAgICAgICAgZGlmZiA9IF9NaXNtYXRjaCgwLCBjbnRfdCwgZWxlbSkKKyAgICAgICAgcmVzdWx0LmFwcGVuZChkaWZmKQorICAgIHJldHVybiByZXN1bHQKKworZGVmIF9vcmRlcmVkX2NvdW50KGl0ZXJhYmxlKToKKyAgICAnUmV0dXJuIGRpY3Qgb2YgZWxlbWVudCBjb3VudHMsIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZmlyc3Qgc2VlbicKKyAgICBjID0gT3JkZXJlZERpY3QoKQorICAgIGZvciBlbGVtIGluIGl0ZXJhYmxlOgorICAgICAgICBjW2VsZW1dID0gYy5nZXQoZWxlbSwgMCkgKyAxCisgICAgcmV0dXJuIGMKKworZGVmIF9jb3VudF9kaWZmX2hhc2hhYmxlKGFjdHVhbCwgZXhwZWN0ZWQpOgorICAgICdSZXR1cm5zIGxpc3Qgb2YgKGNudF9hY3QsIGNudF9leHAsIGVsZW0pIHRyaXBsZXMgd2hlcmUgdGhlIGNvdW50cyBkaWZmZXInCisgICAgIyBlbGVtZW50cyBtdXN0IGJlIGhhc2hhYmxlCisgICAgcywgdCA9IF9vcmRlcmVkX2NvdW50KGFjdHVhbCksIF9vcmRlcmVkX2NvdW50KGV4cGVjdGVkKQorICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIGVsZW0sIGNudF9zIGluIHMuaXRlbXMoKToKKyAgICAgICAgY250X3QgPSB0LmdldChlbGVtLCAwKQorICAgICAgICBpZiBjbnRfcyAhPSBjbnRfdDoKKyAgICAgICAgICAgIGRpZmYgPSBfTWlzbWF0Y2goY250X3MsIGNudF90LCBlbGVtKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChkaWZmKQorICAgIGZvciBlbGVtLCBjbnRfdCBpbiB0Lml0ZW1zKCk6CisgICAgICAgIGlmIGVsZW0gbm90IGluIHM6CisgICAgICAgICAgICBkaWZmID0gX01pc21hdGNoKDAsIGNudF90LCBlbGVtKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChkaWZmKQorICAgIHJldHVybiByZXN1bHQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdXRpbC5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMGIwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdXRpbC5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMGIwY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXJsbGliLnB5IGIvbGliL3B5dGhvbjIuNy91cmxsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2NTVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXJsbGliLnB5CkBAIC0wLDAgKzEsMTYxNiBAQAorIiIiT3BlbiBhbiBhcmJpdHJhcnkgVVJMLgorCitTZWUgdGhlIGZvbGxvd2luZyBkb2N1bWVudCBmb3IgbW9yZSBpbmZvIG9uIFVSTHM6CisiTmFtZXMgYW5kIEFkZHJlc3NlcywgVVJJcywgVVJMcywgVVJOcywgVVJDcyIsIGF0CitodHRwOi8vd3d3LnczLm9yZy9wdWIvV1dXL0FkZHJlc3NpbmcvT3ZlcnZpZXcuaHRtbAorCitTZWUgYWxzbyB0aGUgSFRUUCBzcGVjIChmcm9tIHdoaWNoIHRoZSBlcnJvciBjb2RlcyBhcmUgZGVyaXZlZCk6CisiSFRUUCAtIEh5cGVydGV4dCBUcmFuc2ZlciBQcm90b2NvbCIsIGF0CitodHRwOi8vd3d3LnczLm9yZy9wdWIvV1dXL1Byb3RvY29scy8KKworUmVsYXRlZCBzdGFuZGFyZHMgYW5kIHNwZWNzOgorLSBSRkMxODA4OiB0aGUgInJlbGF0aXZlIFVSTCIgc3BlYy4gKGF1dGhvcml0YXRpdmUgc3RhdHVzKQorLSBSRkMxNzM4IC0gdGhlICJVUkwgc3RhbmRhcmQiLiAoYXV0aG9yaXRhdGl2ZSBzdGF0dXMpCistIFJGQzE2MzAgLSB0aGUgIlVSSSBzcGVjIi4gKGluZm9ybWF0aW9uYWwgc3RhdHVzKQorCitUaGUgb2JqZWN0IHJldHVybmVkIGJ5IFVSTG9wZW5lcigpLm9wZW4oZmlsZSkgd2lsbCBkaWZmZXIgcGVyCitwcm90b2NvbC4gIEFsbCB5b3Uga25vdyBpcyB0aGF0IGlzIGhhcyBtZXRob2RzIHJlYWQoKSwgcmVhZGxpbmUoKSwKK3JlYWRsaW5lcygpLCBmaWxlbm8oKSwgY2xvc2UoKSBhbmQgaW5mbygpLiAgVGhlIHJlYWQqKCksIGZpbGVubygpCithbmQgY2xvc2UoKSBtZXRob2RzIHdvcmsgbGlrZSB0aG9zZSBvZiBvcGVuIGZpbGVzLgorVGhlIGluZm8oKSBtZXRob2QgcmV0dXJucyBhIG1pbWV0b29scy5NZXNzYWdlIG9iamVjdCB3aGljaCBjYW4gYmUKK3VzZWQgdG8gcXVlcnkgdmFyaW91cyBpbmZvIGFib3V0IHRoZSBvYmplY3QsIGlmIGF2YWlsYWJsZS4KKyhtaW1ldG9vbHMuTWVzc2FnZSBvYmplY3RzIGFyZSBxdWVyaWVkIHdpdGggdGhlIGdldGhlYWRlcigpIG1ldGhvZC4pCisiIiIKKworaW1wb3J0IHN0cmluZworaW1wb3J0IHNvY2tldAoraW1wb3J0IG9zCitpbXBvcnQgdGltZQoraW1wb3J0IHN5cworaW1wb3J0IGJhc2U2NAoraW1wb3J0IHJlCisKK2Zyb20gdXJscGFyc2UgaW1wb3J0IHVybGpvaW4gYXMgYmFzZWpvaW4KKworX19hbGxfXyA9IFsidXJsb3BlbiIsICJVUkxvcGVuZXIiLCAiRmFuY3lVUkxvcGVuZXIiLCAidXJscmV0cmlldmUiLAorICAgICAgICAgICAidXJsY2xlYW51cCIsICJxdW90ZSIsICJxdW90ZV9wbHVzIiwgInVucXVvdGUiLCAidW5xdW90ZV9wbHVzIiwKKyAgICAgICAgICAgInVybGVuY29kZSIsICJ1cmwycGF0aG5hbWUiLCAicGF0aG5hbWUydXJsIiwgInNwbGl0dGFnIiwKKyAgICAgICAgICAgImxvY2FsaG9zdCIsICJ0aGlzaG9zdCIsICJmdHBlcnJvcnMiLCAiYmFzZWpvaW4iLCAidW53cmFwIiwKKyAgICAgICAgICAgInNwbGl0dHlwZSIsICJzcGxpdGhvc3QiLCAic3BsaXR1c2VyIiwgInNwbGl0cGFzc3dkIiwgInNwbGl0cG9ydCIsCisgICAgICAgICAgICJzcGxpdG5wb3J0IiwgInNwbGl0cXVlcnkiLCAic3BsaXRhdHRyIiwgInNwbGl0dmFsdWUiLAorICAgICAgICAgICAiZ2V0cHJveGllcyJdCisKK19fdmVyc2lvbl9fID0gJzEuMTcnICAgICMgWFhYIFRoaXMgdmVyc2lvbiBpcyBub3QgYWx3YXlzIHVwZGF0ZWQgOi0oCisKK01BWEZUUENBQ0hFID0gMTAgICAgICAgICMgVHJpbSB0aGUgZnRwIGNhY2hlIGJleW9uZCB0aGlzIHNpemUKKworIyBIZWxwZXIgZm9yIG5vbi11bml4IHN5c3RlbXMKK2lmIG9zLm5hbWUgPT0gJ250JzoKKyAgICBmcm9tIG50dXJsMnBhdGggaW1wb3J0IHVybDJwYXRobmFtZSwgcGF0aG5hbWUydXJsCitlbGlmIG9zLm5hbWUgPT0gJ3Jpc2Nvcyc6CisgICAgZnJvbSByb3VybDJwYXRoIGltcG9ydCB1cmwycGF0aG5hbWUsIHBhdGhuYW1lMnVybAorZWxzZToKKyAgICBkZWYgdXJsMnBhdGhuYW1lKHBhdGhuYW1lKToKKyAgICAgICAgIiIiT1Mtc3BlY2lmaWMgY29udmVyc2lvbiBmcm9tIGEgcmVsYXRpdmUgVVJMIG9mIHRoZSAnZmlsZScgc2NoZW1lCisgICAgICAgIHRvIGEgZmlsZSBzeXN0ZW0gcGF0aDsgbm90IHJlY29tbWVuZGVkIGZvciBnZW5lcmFsIHVzZS4iIiIKKyAgICAgICAgcmV0dXJuIHVucXVvdGUocGF0aG5hbWUpCisKKyAgICBkZWYgcGF0aG5hbWUydXJsKHBhdGhuYW1lKToKKyAgICAgICAgIiIiT1Mtc3BlY2lmaWMgY29udmVyc2lvbiBmcm9tIGEgZmlsZSBzeXN0ZW0gcGF0aCB0byBhIHJlbGF0aXZlIFVSTAorICAgICAgICBvZiB0aGUgJ2ZpbGUnIHNjaGVtZTsgbm90IHJlY29tbWVuZGVkIGZvciBnZW5lcmFsIHVzZS4iIiIKKyAgICAgICAgcmV0dXJuIHF1b3RlKHBhdGhuYW1lKQorCisjIFRoaXMgcmVhbGx5IGNvbnNpc3RzIG9mIHR3byBwaWVjZXM6CisjICgxKSBhIGNsYXNzIHdoaWNoIGhhbmRsZXMgb3BlbmluZyBvZiBhbGwgc29ydHMgb2YgVVJMcworIyAgICAgKHBsdXMgYXNzb3J0ZWQgdXRpbGl0aWVzIGV0Yy4pCisjICgyKSBhIHNldCBvZiBmdW5jdGlvbnMgZm9yIHBhcnNpbmcgVVJMcworIyBYWFggU2hvdWxkIHRoZXNlIGJlIHNlcGFyYXRlZCBvdXQgaW50byBkaWZmZXJlbnQgbW9kdWxlcz8KKworCisjIFNob3J0Y3V0IGZvciBiYXNpYyB1c2FnZQorX3VybG9wZW5lciA9IE5vbmUKK2RlZiB1cmxvcGVuKHVybCwgZGF0YT1Ob25lLCBwcm94aWVzPU5vbmUpOgorICAgICIiIkNyZWF0ZSBhIGZpbGUtbGlrZSBvYmplY3QgZm9yIHRoZSBzcGVjaWZpZWQgVVJMIHRvIHJlYWQgZnJvbS4iIiIKKyAgICBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaworICAgIHdhcm5weTNrKCJ1cmxsaWIudXJsb3BlbigpIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCBpbiAiCisgICAgICAgICAgICAgImZhdm9yIG9mIHVybGxpYjIudXJsb3BlbigpIiwgc3RhY2tsZXZlbD0yKQorCisgICAgZ2xvYmFsIF91cmxvcGVuZXIKKyAgICBpZiBwcm94aWVzIGlzIG5vdCBOb25lOgorICAgICAgICBvcGVuZXIgPSBGYW5jeVVSTG9wZW5lcihwcm94aWVzPXByb3hpZXMpCisgICAgZWxpZiBub3QgX3VybG9wZW5lcjoKKyAgICAgICAgb3BlbmVyID0gRmFuY3lVUkxvcGVuZXIoKQorICAgICAgICBfdXJsb3BlbmVyID0gb3BlbmVyCisgICAgZWxzZToKKyAgICAgICAgb3BlbmVyID0gX3VybG9wZW5lcgorICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIG9wZW5lci5vcGVuKHVybCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gb3BlbmVyLm9wZW4odXJsLCBkYXRhKQorZGVmIHVybHJldHJpZXZlKHVybCwgZmlsZW5hbWU9Tm9uZSwgcmVwb3J0aG9vaz1Ob25lLCBkYXRhPU5vbmUpOgorICAgIGdsb2JhbCBfdXJsb3BlbmVyCisgICAgaWYgbm90IF91cmxvcGVuZXI6CisgICAgICAgIF91cmxvcGVuZXIgPSBGYW5jeVVSTG9wZW5lcigpCisgICAgcmV0dXJuIF91cmxvcGVuZXIucmV0cmlldmUodXJsLCBmaWxlbmFtZSwgcmVwb3J0aG9vaywgZGF0YSkKK2RlZiB1cmxjbGVhbnVwKCk6CisgICAgaWYgX3VybG9wZW5lcjoKKyAgICAgICAgX3VybG9wZW5lci5jbGVhbnVwKCkKKyAgICBfc2FmZV9xdW90ZXJzLmNsZWFyKCkKKyAgICBmdHBjYWNoZS5jbGVhcigpCisKKyMgY2hlY2sgZm9yIFNTTAordHJ5OgorICAgIGltcG9ydCBzc2wKK2V4Y2VwdDoKKyAgICBfaGF2ZV9zc2wgPSBGYWxzZQorZWxzZToKKyAgICBfaGF2ZV9zc2wgPSBUcnVlCisKKyMgZXhjZXB0aW9uIHJhaXNlZCB3aGVuIGRvd25sb2FkZWQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBjb250ZW50LWxlbmd0aAorY2xhc3MgQ29udGVudFRvb1Nob3J0RXJyb3IoSU9FcnJvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIGNvbnRlbnQpOgorICAgICAgICBJT0Vycm9yLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYuY29udGVudCA9IGNvbnRlbnQKKworZnRwY2FjaGUgPSB7fQorY2xhc3MgVVJMb3BlbmVyOgorICAgICIiIkNsYXNzIHRvIG9wZW4gVVJMcy4KKyAgICBUaGlzIGlzIGEgY2xhc3MgcmF0aGVyIHRoYW4ganVzdCBhIHN1YnJvdXRpbmUgYmVjYXVzZSB3ZSBtYXkgbmVlZAorICAgIG1vcmUgdGhhbiBvbmUgc2V0IG9mIGdsb2JhbCBwcm90b2NvbC1zcGVjaWZpYyBvcHRpb25zLgorICAgIE5vdGUgLS0gdGhpcyBpcyBhIGJhc2UgY2xhc3MgZm9yIHRob3NlIHdobyBkb24ndCB3YW50IHRoZQorICAgIGF1dG9tYXRpYyBoYW5kbGluZyBvZiBlcnJvcnMgdHlwZSAzMDIgKHJlbG9jYXRlZCkgYW5kIDQwMQorICAgIChhdXRob3JpemF0aW9uIG5lZWRlZCkuIiIiCisKKyAgICBfX3RlbXBmaWxlcyA9IE5vbmUKKworICAgIHZlcnNpb24gPSAiUHl0aG9uLXVybGxpYi8lcyIgJSBfX3ZlcnNpb25fXworCisgICAgIyBDb25zdHJ1Y3RvcgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm94aWVzPU5vbmUsICoqeDUwOSk6CisgICAgICAgIGlmIHByb3hpZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHByb3hpZXMgPSBnZXRwcm94aWVzKCkKKyAgICAgICAgYXNzZXJ0IGhhc2F0dHIocHJveGllcywgJ2hhc19rZXknKSwgInByb3hpZXMgbXVzdCBiZSBhIG1hcHBpbmciCisgICAgICAgIHNlbGYucHJveGllcyA9IHByb3hpZXMKKyAgICAgICAgc2VsZi5rZXlfZmlsZSA9IHg1MDkuZ2V0KCdrZXlfZmlsZScpCisgICAgICAgIHNlbGYuY2VydF9maWxlID0geDUwOS5nZXQoJ2NlcnRfZmlsZScpCisgICAgICAgIHNlbGYuYWRkaGVhZGVycyA9IFsoJ1VzZXItQWdlbnQnLCBzZWxmLnZlcnNpb24pXQorICAgICAgICBzZWxmLl9fdGVtcGZpbGVzID0gW10KKyAgICAgICAgc2VsZi5fX3VubGluayA9IG9zLnVubGluayAjIFNlZSBjbGVhbnVwKCkKKyAgICAgICAgc2VsZi50ZW1wY2FjaGUgPSBOb25lCisgICAgICAgICMgVW5kb2N1bWVudGVkIGZlYXR1cmU6IGlmIHlvdSBhc3NpZ24ge30gdG8gdGVtcGNhY2hlLAorICAgICAgICAjIGl0IGlzIHVzZWQgdG8gY2FjaGUgZmlsZXMgcmV0cmlldmVkIHdpdGgKKyAgICAgICAgIyBzZWxmLnJldHJpZXZlKCkuICBUaGlzIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQKKyAgICAgICAgIyBzaW5jZSBpdCBkb2VzIG5vdCB3b3JrIGZvciBjaGFuZ2luZyBkb2N1bWVudHMgKGFuZCBJCisgICAgICAgICMgaGF2ZW4ndCBnb3QgdGhlIGxvZ2ljIHRvIGNoZWNrIGV4cGlyYXRpb24gaGVhZGVycworICAgICAgICAjIHlldCkuCisgICAgICAgIHNlbGYuZnRwY2FjaGUgPSBmdHBjYWNoZQorICAgICAgICAjIFVuZG9jdW1lbnRlZCBmZWF0dXJlOiB5b3UgY2FuIHVzZSBhIGRpZmZlcmVudAorICAgICAgICAjIGZ0cCBjYWNoZSBieSBhc3NpZ25pbmcgdG8gdGhlIC5mdHBjYWNoZSBtZW1iZXI7CisgICAgICAgICMgaW4gY2FzZSB5b3Ugd2FudCBsb2dpY2FsbHkgaW5kZXBlbmRlbnQgVVJMIG9wZW5lcnMKKyAgICAgICAgIyBYWFggVGhpcyBpcyBub3QgdGhyZWFkc2FmZS4gIEJhaC4KKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbGVhbnVwKCkKKworICAgIGRlZiBjbGVhbnVwKHNlbGYpOgorICAgICAgICAjIFRoaXMgY29kZSBzb21ldGltZXMgcnVucyB3aGVuIHRoZSByZXN0IG9mIHRoaXMgbW9kdWxlCisgICAgICAgICMgaGFzIGFscmVhZHkgYmVlbiBkZWxldGVkLCBzbyBpdCBjYW4ndCB1c2UgYW55IGdsb2JhbHMKKyAgICAgICAgIyBvciBpbXBvcnQgYW55dGhpbmcuCisgICAgICAgIGlmIHNlbGYuX190ZW1wZmlsZXM6CisgICAgICAgICAgICBmb3IgZmlsZSBpbiBzZWxmLl9fdGVtcGZpbGVzOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fX3VubGluayhmaWxlKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWwgc2VsZi5fX3RlbXBmaWxlc1s6XQorICAgICAgICBpZiBzZWxmLnRlbXBjYWNoZToKKyAgICAgICAgICAgIHNlbGYudGVtcGNhY2hlLmNsZWFyKCkKKworICAgIGRlZiBhZGRoZWFkZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJBZGQgYSBoZWFkZXIgdG8gYmUgdXNlZCBieSB0aGUgSFRUUCBpbnRlcmZhY2Ugb25seQorICAgICAgICBlLmcuIHUuYWRkaGVhZGVyKCdBY2NlcHQnLCAnc291bmQvYmFzaWMnKSIiIgorICAgICAgICBzZWxmLmFkZGhlYWRlcnMuYXBwZW5kKGFyZ3MpCisKKyAgICAjIEV4dGVybmFsIGludGVyZmFjZQorICAgIGRlZiBvcGVuKHNlbGYsIGZ1bGx1cmwsIGRhdGE9Tm9uZSk6CisgICAgICAgICIiIlVzZSBVUkxvcGVuZXIoKS5vcGVuKGZpbGUpIGluc3RlYWQgb2Ygb3BlbihmaWxlLCAncicpLiIiIgorICAgICAgICBmdWxsdXJsID0gdW53cmFwKHRvQnl0ZXMoZnVsbHVybCkpCisgICAgICAgICMgcGVyY2VudCBlbmNvZGUgdXJsLCBmaXhpbmcgbGFtZSBzZXJ2ZXIgZXJyb3JzIGZvciBlLmcsIGxpa2Ugc3BhY2UKKyAgICAgICAgIyB3aXRoaW4gdXJsIHBhdGhzLgorICAgICAgICBmdWxsdXJsID0gcXVvdGUoZnVsbHVybCwgc2FmZT0iJS86PSY/fiMrISQsOydAKCkqW118IikKKyAgICAgICAgaWYgc2VsZi50ZW1wY2FjaGUgYW5kIGZ1bGx1cmwgaW4gc2VsZi50ZW1wY2FjaGU6CisgICAgICAgICAgICBmaWxlbmFtZSwgaGVhZGVycyA9IHNlbGYudGVtcGNhY2hlW2Z1bGx1cmxdCisgICAgICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICdyYicpCisgICAgICAgICAgICByZXR1cm4gYWRkaW5mb3VybChmcCwgaGVhZGVycywgZnVsbHVybCkKKyAgICAgICAgdXJsdHlwZSwgdXJsID0gc3BsaXR0eXBlKGZ1bGx1cmwpCisgICAgICAgIGlmIG5vdCB1cmx0eXBlOgorICAgICAgICAgICAgdXJsdHlwZSA9ICdmaWxlJworICAgICAgICBpZiB1cmx0eXBlIGluIHNlbGYucHJveGllczoKKyAgICAgICAgICAgIHByb3h5ID0gc2VsZi5wcm94aWVzW3VybHR5cGVdCisgICAgICAgICAgICB1cmx0eXBlLCBwcm94eWhvc3QgPSBzcGxpdHR5cGUocHJveHkpCisgICAgICAgICAgICBob3N0LCBzZWxlY3RvciA9IHNwbGl0aG9zdChwcm94eWhvc3QpCisgICAgICAgICAgICB1cmwgPSAoaG9zdCwgZnVsbHVybCkgIyBTaWduYWwgc3BlY2lhbCBjYXNlIHRvIG9wZW5fKigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcm94eSA9IE5vbmUKKyAgICAgICAgbmFtZSA9ICdvcGVuXycgKyB1cmx0eXBlCisgICAgICAgIHNlbGYudHlwZSA9IHVybHR5cGUKKyAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnLScsICdfJykKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgbmFtZSk6CisgICAgICAgICAgICBpZiBwcm94eToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGVuX3Vua25vd25fcHJveHkocHJveHksIGZ1bGx1cmwsIGRhdGEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm9wZW5fdW5rbm93bihmdWxsdXJsLCBkYXRhKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgbmFtZSkodXJsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBuYW1lKSh1cmwsIGRhdGEpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICgnc29ja2V0IGVycm9yJywgbXNnKSwgc3lzLmV4Y19pbmZvKClbMl0KKworICAgIGRlZiBvcGVuX3Vua25vd24oc2VsZiwgZnVsbHVybCwgZGF0YT1Ob25lKToKKyAgICAgICAgIiIiT3ZlcnJpZGFibGUgaW50ZXJmYWNlIHRvIG9wZW4gdW5rbm93biBVUkwgdHlwZS4iIiIKKyAgICAgICAgdHlwZSwgdXJsID0gc3BsaXR0eXBlKGZ1bGx1cmwpCisgICAgICAgIHJhaXNlIElPRXJyb3IsICgndXJsIGVycm9yJywgJ3Vua25vd24gdXJsIHR5cGUnLCB0eXBlKQorCisgICAgZGVmIG9wZW5fdW5rbm93bl9wcm94eShzZWxmLCBwcm94eSwgZnVsbHVybCwgZGF0YT1Ob25lKToKKyAgICAgICAgIiIiT3ZlcnJpZGFibGUgaW50ZXJmYWNlIHRvIG9wZW4gdW5rbm93biBVUkwgdHlwZS4iIiIKKyAgICAgICAgdHlwZSwgdXJsID0gc3BsaXR0eXBlKGZ1bGx1cmwpCisgICAgICAgIHJhaXNlIElPRXJyb3IsICgndXJsIGVycm9yJywgJ2ludmFsaWQgcHJveHkgZm9yICVzJyAlIHR5cGUsIHByb3h5KQorCisgICAgIyBFeHRlcm5hbCBpbnRlcmZhY2UKKyAgICBkZWYgcmV0cmlldmUoc2VsZiwgdXJsLCBmaWxlbmFtZT1Ob25lLCByZXBvcnRob29rPU5vbmUsIGRhdGE9Tm9uZSk6CisgICAgICAgICIiInJldHJpZXZlKHVybCkgcmV0dXJucyAoZmlsZW5hbWUsIGhlYWRlcnMpIGZvciBhIGxvY2FsIG9iamVjdAorICAgICAgICBvciAodGVtcGZpbGVuYW1lLCBoZWFkZXJzKSBmb3IgYSByZW1vdGUgb2JqZWN0LiIiIgorICAgICAgICB1cmwgPSB1bndyYXAodG9CeXRlcyh1cmwpKQorICAgICAgICBpZiBzZWxmLnRlbXBjYWNoZSBhbmQgdXJsIGluIHNlbGYudGVtcGNhY2hlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGVtcGNhY2hlW3VybF0KKyAgICAgICAgdHlwZSwgdXJsMSA9IHNwbGl0dHlwZSh1cmwpCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmUgYW5kIChub3QgdHlwZSBvciB0eXBlID09ICdmaWxlJyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnAgPSBzZWxmLm9wZW5fbG9jYWxfZmlsZSh1cmwxKQorICAgICAgICAgICAgICAgIGhkcnMgPSBmcC5pbmZvKCkKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHVybDJwYXRobmFtZShzcGxpdGhvc3QodXJsMSlbMV0pLCBoZHJzCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGZwID0gc2VsZi5vcGVuKHVybCwgZGF0YSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaGVhZGVycyA9IGZwLmluZm8oKQorICAgICAgICAgICAgaWYgZmlsZW5hbWU6CisgICAgICAgICAgICAgICAgdGZwID0gb3BlbihmaWxlbmFtZSwgJ3diJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaW1wb3J0IHRlbXBmaWxlCisgICAgICAgICAgICAgICAgZ2FyYmFnZSwgcGF0aCA9IHNwbGl0dHlwZSh1cmwpCisgICAgICAgICAgICAgICAgZ2FyYmFnZSwgcGF0aCA9IHNwbGl0aG9zdChwYXRoIG9yICIiKQorICAgICAgICAgICAgICAgIHBhdGgsIGdhcmJhZ2UgPSBzcGxpdHF1ZXJ5KHBhdGggb3IgIiIpCisgICAgICAgICAgICAgICAgcGF0aCwgZ2FyYmFnZSA9IHNwbGl0YXR0cihwYXRoIG9yICIiKQorICAgICAgICAgICAgICAgIHN1ZmZpeCA9IG9zLnBhdGguc3BsaXRleHQocGF0aClbMV0KKyAgICAgICAgICAgICAgICAoZmQsIGZpbGVuYW1lKSA9IHRlbXBmaWxlLm1rc3RlbXAoc3VmZml4KQorICAgICAgICAgICAgICAgIHNlbGYuX190ZW1wZmlsZXMuYXBwZW5kKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIHRmcCA9IG9zLmZkb3BlbihmZCwgJ3diJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmaWxlbmFtZSwgaGVhZGVycworICAgICAgICAgICAgICAgIGlmIHNlbGYudGVtcGNhY2hlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRlbXBjYWNoZVt1cmxdID0gcmVzdWx0CisgICAgICAgICAgICAgICAgYnMgPSAxMDI0KjgKKyAgICAgICAgICAgICAgICBzaXplID0gLTEKKyAgICAgICAgICAgICAgICByZWFkID0gMAorICAgICAgICAgICAgICAgIGJsb2NrbnVtID0gMAorICAgICAgICAgICAgICAgIGlmICJjb250ZW50LWxlbmd0aCIgaW4gaGVhZGVyczoKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGludChoZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdKQorICAgICAgICAgICAgICAgIGlmIHJlcG9ydGhvb2s6CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydGhvb2soYmxvY2tudW0sIGJzLCBzaXplKQorICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gZnAucmVhZChicykKKyAgICAgICAgICAgICAgICAgICAgaWYgYmxvY2sgPT0gIiI6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICByZWFkICs9IGxlbihibG9jaykKKyAgICAgICAgICAgICAgICAgICAgdGZwLndyaXRlKGJsb2NrKQorICAgICAgICAgICAgICAgICAgICBibG9ja251bSArPSAxCisgICAgICAgICAgICAgICAgICAgIGlmIHJlcG9ydGhvb2s6CisgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRob29rKGJsb2NrbnVtLCBicywgc2l6ZSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdGZwLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICAjIHJhaXNlIGV4Y2VwdGlvbiBpZiBhY3R1YWwgc2l6ZSBkb2VzIG5vdCBtYXRjaCBjb250ZW50LWxlbmd0aCBoZWFkZXIKKyAgICAgICAgaWYgc2l6ZSA+PSAwIGFuZCByZWFkIDwgc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIENvbnRlbnRUb29TaG9ydEVycm9yKCJyZXRyaWV2YWwgaW5jb21wbGV0ZTogZ290IG9ubHkgJWkgb3V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiAlaSBieXRlcyIgJSAocmVhZCwgc2l6ZSksIHJlc3VsdCkKKworICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAjIEVhY2ggbWV0aG9kIG5hbWVkIG9wZW5fPHR5cGU+IGtub3dzIGhvdyB0byBvcGVuIHRoYXQgdHlwZSBvZiBVUkwKKworICAgIGRlZiBvcGVuX2h0dHAoc2VsZiwgdXJsLCBkYXRhPU5vbmUpOgorICAgICAgICAiIiJVc2UgSFRUUCBwcm90b2NvbC4iIiIKKyAgICAgICAgaW1wb3J0IGh0dHBsaWIKKyAgICAgICAgdXNlcl9wYXNzd2QgPSBOb25lCisgICAgICAgIHByb3h5X3Bhc3N3ZD0gTm9uZQorICAgICAgICBpZiBpc2luc3RhbmNlKHVybCwgc3RyKToKKyAgICAgICAgICAgIGhvc3QsIHNlbGVjdG9yID0gc3BsaXRob3N0KHVybCkKKyAgICAgICAgICAgIGlmIGhvc3Q6CisgICAgICAgICAgICAgICAgdXNlcl9wYXNzd2QsIGhvc3QgPSBzcGxpdHVzZXIoaG9zdCkKKyAgICAgICAgICAgICAgICBob3N0ID0gdW5xdW90ZShob3N0KQorICAgICAgICAgICAgcmVhbGhvc3QgPSBob3N0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBob3N0LCBzZWxlY3RvciA9IHVybAorICAgICAgICAgICAgIyBjaGVjayB3aGV0aGVyIHRoZSBwcm94eSBjb250YWlucyBhdXRob3JpemF0aW9uIGluZm9ybWF0aW9uCisgICAgICAgICAgICBwcm94eV9wYXNzd2QsIGhvc3QgPSBzcGxpdHVzZXIoaG9zdCkKKyAgICAgICAgICAgICMgbm93IHdlIHByb2NlZWQgd2l0aCB0aGUgdXJsIHdlIHdhbnQgdG8gb2J0YWluCisgICAgICAgICAgICB1cmx0eXBlLCByZXN0ID0gc3BsaXR0eXBlKHNlbGVjdG9yKQorICAgICAgICAgICAgdXJsID0gcmVzdAorICAgICAgICAgICAgdXNlcl9wYXNzd2QgPSBOb25lCisgICAgICAgICAgICBpZiB1cmx0eXBlLmxvd2VyKCkgIT0gJ2h0dHAnOgorICAgICAgICAgICAgICAgIHJlYWxob3N0ID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZWFsaG9zdCwgcmVzdCA9IHNwbGl0aG9zdChyZXN0KQorICAgICAgICAgICAgICAgIGlmIHJlYWxob3N0OgorICAgICAgICAgICAgICAgICAgICB1c2VyX3Bhc3N3ZCwgcmVhbGhvc3QgPSBzcGxpdHVzZXIocmVhbGhvc3QpCisgICAgICAgICAgICAgICAgaWYgdXNlcl9wYXNzd2Q6CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gIiVzOi8vJXMlcyIgJSAodXJsdHlwZSwgcmVhbGhvc3QsIHJlc3QpCisgICAgICAgICAgICAgICAgaWYgcHJveHlfYnlwYXNzKHJlYWxob3N0KToKKyAgICAgICAgICAgICAgICAgICAgaG9zdCA9IHJlYWxob3N0CisKKyAgICAgICAgICAgICNwcmludCAicHJveHkgdmlhIGh0dHA6IiwgaG9zdCwgc2VsZWN0b3IKKyAgICAgICAgaWYgbm90IGhvc3Q6IHJhaXNlIElPRXJyb3IsICgnaHR0cCBlcnJvcicsICdubyBob3N0IGdpdmVuJykKKworICAgICAgICBpZiBwcm94eV9wYXNzd2Q6CisgICAgICAgICAgICBwcm94eV9wYXNzd2QgPSB1bnF1b3RlKHByb3h5X3Bhc3N3ZCkKKyAgICAgICAgICAgIHByb3h5X2F1dGggPSBiYXNlNjQuYjY0ZW5jb2RlKHByb3h5X3Bhc3N3ZCkuc3RyaXAoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJveHlfYXV0aCA9IE5vbmUKKworICAgICAgICBpZiB1c2VyX3Bhc3N3ZDoKKyAgICAgICAgICAgIHVzZXJfcGFzc3dkID0gdW5xdW90ZSh1c2VyX3Bhc3N3ZCkKKyAgICAgICAgICAgIGF1dGggPSBiYXNlNjQuYjY0ZW5jb2RlKHVzZXJfcGFzc3dkKS5zdHJpcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhdXRoID0gTm9uZQorICAgICAgICBoID0gaHR0cGxpYi5IVFRQKGhvc3QpCisgICAgICAgIGlmIGRhdGEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBoLnB1dHJlcXVlc3QoJ1BPU1QnLCBzZWxlY3RvcikKKyAgICAgICAgICAgIGgucHV0aGVhZGVyKCdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykKKyAgICAgICAgICAgIGgucHV0aGVhZGVyKCdDb250ZW50LUxlbmd0aCcsICclZCcgJSBsZW4oZGF0YSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoLnB1dHJlcXVlc3QoJ0dFVCcsIHNlbGVjdG9yKQorICAgICAgICBpZiBwcm94eV9hdXRoOiBoLnB1dGhlYWRlcignUHJveHktQXV0aG9yaXphdGlvbicsICdCYXNpYyAlcycgJSBwcm94eV9hdXRoKQorICAgICAgICBpZiBhdXRoOiBoLnB1dGhlYWRlcignQXV0aG9yaXphdGlvbicsICdCYXNpYyAlcycgJSBhdXRoKQorICAgICAgICBpZiByZWFsaG9zdDogaC5wdXRoZWFkZXIoJ0hvc3QnLCByZWFsaG9zdCkKKyAgICAgICAgZm9yIGFyZ3MgaW4gc2VsZi5hZGRoZWFkZXJzOiBoLnB1dGhlYWRlcigqYXJncykKKyAgICAgICAgaC5lbmRoZWFkZXJzKGRhdGEpCisgICAgICAgIGVycmNvZGUsIGVycm1zZywgaGVhZGVycyA9IGguZ2V0cmVwbHkoKQorICAgICAgICBmcCA9IGguZ2V0ZmlsZSgpCisgICAgICAgIGlmIGVycmNvZGUgPT0gLTE6CisgICAgICAgICAgICBpZiBmcDogZnAuY2xvc2UoKQorICAgICAgICAgICAgIyBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBIVFRQIHN0YXR1cyBsaW5lCisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAoJ2h0dHAgcHJvdG9jb2wgZXJyb3InLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnb3QgYSBiYWQgc3RhdHVzIGxpbmUnLCBOb25lKQorICAgICAgICAjIEFjY29yZGluZyB0byBSRkMgMjYxNiwgIjJ4eCIgY29kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2xpZW50J3MKKyAgICAgICAgIyByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQsIHVuZGVyc3Rvb2QsIGFuZCBhY2NlcHRlZC4KKyAgICAgICAgaWYgKDIwMCA8PSBlcnJjb2RlIDwgMzAwKToKKyAgICAgICAgICAgIHJldHVybiBhZGRpbmZvdXJsKGZwLCBoZWFkZXJzLCAiaHR0cDoiICsgdXJsLCBlcnJjb2RlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmh0dHBfZXJyb3IodXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5odHRwX2Vycm9yKHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycywgZGF0YSkKKworICAgIGRlZiBodHRwX2Vycm9yKHNlbGYsIHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycywgZGF0YT1Ob25lKToKKyAgICAgICAgIiIiSGFuZGxlIGh0dHAgZXJyb3JzLgorICAgICAgICBEZXJpdmVkIGNsYXNzIGNhbiBvdmVycmlkZSB0aGlzLCBvciBwcm92aWRlIHNwZWNpZmljIGhhbmRsZXJzCisgICAgICAgIG5hbWVkIGh0dHBfZXJyb3JfREREIHdoZXJlIERERCBpcyB0aGUgMy1kaWdpdCBlcnJvciBjb2RlLiIiIgorICAgICAgICAjIEZpcnN0IGNoZWNrIGlmIHRoZXJlJ3MgYSBzcGVjaWZpYyBoYW5kbGVyIGZvciB0aGlzIGVycm9yCisgICAgICAgIG5hbWUgPSAnaHR0cF9lcnJvcl8lZCcgJSBlcnJjb2RlCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgbmFtZSk6CisgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsIG5hbWUpCisgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kKHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kKHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycywgZGF0YSkKKyAgICAgICAgICAgIGlmIHJlc3VsdDogcmV0dXJuIHJlc3VsdAorICAgICAgICByZXR1cm4gc2VsZi5odHRwX2Vycm9yX2RlZmF1bHQodXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzKQorCisgICAgZGVmIGh0dHBfZXJyb3JfZGVmYXVsdChzZWxmLCB1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMpOgorICAgICAgICAiIiJEZWZhdWx0IGVycm9yIGhhbmRsZXI6IGNsb3NlIHRoZSBjb25uZWN0aW9uIGFuZCByYWlzZSBJT0Vycm9yLiIiIgorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHJhaXNlIElPRXJyb3IsICgnaHR0cCBlcnJvcicsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKKworICAgIGlmIF9oYXZlX3NzbDoKKyAgICAgICAgZGVmIG9wZW5faHR0cHMoc2VsZiwgdXJsLCBkYXRhPU5vbmUpOgorICAgICAgICAgICAgIiIiVXNlIEhUVFBTIHByb3RvY29sLiIiIgorCisgICAgICAgICAgICBpbXBvcnQgaHR0cGxpYgorICAgICAgICAgICAgdXNlcl9wYXNzd2QgPSBOb25lCisgICAgICAgICAgICBwcm94eV9wYXNzd2QgPSBOb25lCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHVybCwgc3RyKToKKyAgICAgICAgICAgICAgICBob3N0LCBzZWxlY3RvciA9IHNwbGl0aG9zdCh1cmwpCisgICAgICAgICAgICAgICAgaWYgaG9zdDoKKyAgICAgICAgICAgICAgICAgICAgdXNlcl9wYXNzd2QsIGhvc3QgPSBzcGxpdHVzZXIoaG9zdCkKKyAgICAgICAgICAgICAgICAgICAgaG9zdCA9IHVucXVvdGUoaG9zdCkKKyAgICAgICAgICAgICAgICByZWFsaG9zdCA9IGhvc3QKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaG9zdCwgc2VsZWN0b3IgPSB1cmwKKyAgICAgICAgICAgICAgICAjIGhlcmUsIHdlIGRldGVybWluZSwgd2hldGhlciB0aGUgcHJveHkgY29udGFpbnMgYXV0aG9yaXphdGlvbiBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIHByb3h5X3Bhc3N3ZCwgaG9zdCA9IHNwbGl0dXNlcihob3N0KQorICAgICAgICAgICAgICAgIHVybHR5cGUsIHJlc3QgPSBzcGxpdHR5cGUoc2VsZWN0b3IpCisgICAgICAgICAgICAgICAgdXJsID0gcmVzdAorICAgICAgICAgICAgICAgIHVzZXJfcGFzc3dkID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIHVybHR5cGUubG93ZXIoKSAhPSAnaHR0cHMnOgorICAgICAgICAgICAgICAgICAgICByZWFsaG9zdCA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZWFsaG9zdCwgcmVzdCA9IHNwbGl0aG9zdChyZXN0KQorICAgICAgICAgICAgICAgICAgICBpZiByZWFsaG9zdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfcGFzc3dkLCByZWFsaG9zdCA9IHNwbGl0dXNlcihyZWFsaG9zdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdXNlcl9wYXNzd2Q6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9ICIlczovLyVzJXMiICUgKHVybHR5cGUsIHJlYWxob3N0LCByZXN0KQorICAgICAgICAgICAgICAgICNwcmludCAicHJveHkgdmlhIGh0dHBzOiIsIGhvc3QsIHNlbGVjdG9yCisgICAgICAgICAgICBpZiBub3QgaG9zdDogcmFpc2UgSU9FcnJvciwgKCdodHRwcyBlcnJvcicsICdubyBob3N0IGdpdmVuJykKKyAgICAgICAgICAgIGlmIHByb3h5X3Bhc3N3ZDoKKyAgICAgICAgICAgICAgICBwcm94eV9wYXNzd2QgPSB1bnF1b3RlKHByb3h5X3Bhc3N3ZCkKKyAgICAgICAgICAgICAgICBwcm94eV9hdXRoID0gYmFzZTY0LmI2NGVuY29kZShwcm94eV9wYXNzd2QpLnN0cmlwKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJveHlfYXV0aCA9IE5vbmUKKyAgICAgICAgICAgIGlmIHVzZXJfcGFzc3dkOgorICAgICAgICAgICAgICAgIHVzZXJfcGFzc3dkID0gdW5xdW90ZSh1c2VyX3Bhc3N3ZCkKKyAgICAgICAgICAgICAgICBhdXRoID0gYmFzZTY0LmI2NGVuY29kZSh1c2VyX3Bhc3N3ZCkuc3RyaXAoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhdXRoID0gTm9uZQorICAgICAgICAgICAgaCA9IGh0dHBsaWIuSFRUUFMoaG9zdCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9maWxlPXNlbGYua2V5X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X2ZpbGU9c2VsZi5jZXJ0X2ZpbGUpCisgICAgICAgICAgICBpZiBkYXRhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGgucHV0cmVxdWVzdCgnUE9TVCcsIHNlbGVjdG9yKQorICAgICAgICAgICAgICAgIGgucHV0aGVhZGVyKCdDb250ZW50LVR5cGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKQorICAgICAgICAgICAgICAgIGgucHV0aGVhZGVyKCdDb250ZW50LUxlbmd0aCcsICclZCcgJSBsZW4oZGF0YSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGgucHV0cmVxdWVzdCgnR0VUJywgc2VsZWN0b3IpCisgICAgICAgICAgICBpZiBwcm94eV9hdXRoOiBoLnB1dGhlYWRlcignUHJveHktQXV0aG9yaXphdGlvbicsICdCYXNpYyAlcycgJSBwcm94eV9hdXRoKQorICAgICAgICAgICAgaWYgYXV0aDogaC5wdXRoZWFkZXIoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJXMnICUgYXV0aCkKKyAgICAgICAgICAgIGlmIHJlYWxob3N0OiBoLnB1dGhlYWRlcignSG9zdCcsIHJlYWxob3N0KQorICAgICAgICAgICAgZm9yIGFyZ3MgaW4gc2VsZi5hZGRoZWFkZXJzOiBoLnB1dGhlYWRlcigqYXJncykKKyAgICAgICAgICAgIGguZW5kaGVhZGVycyhkYXRhKQorICAgICAgICAgICAgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzID0gaC5nZXRyZXBseSgpCisgICAgICAgICAgICBmcCA9IGguZ2V0ZmlsZSgpCisgICAgICAgICAgICBpZiBlcnJjb2RlID09IC0xOgorICAgICAgICAgICAgICAgIGlmIGZwOiBmcC5jbG9zZSgpCisgICAgICAgICAgICAgICAgIyBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBIVFRQIHN0YXR1cyBsaW5lCisgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgKCdodHRwIHByb3RvY29sIGVycm9yJywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dvdCBhIGJhZCBzdGF0dXMgbGluZScsIE5vbmUpCisgICAgICAgICAgICAjIEFjY29yZGluZyB0byBSRkMgMjYxNiwgIjJ4eCIgY29kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2xpZW50J3MKKyAgICAgICAgICAgICMgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkLCB1bmRlcnN0b29kLCBhbmQgYWNjZXB0ZWQuCisgICAgICAgICAgICBpZiAoMjAwIDw9IGVycmNvZGUgPCAzMDApOgorICAgICAgICAgICAgICAgIHJldHVybiBhZGRpbmZvdXJsKGZwLCBoZWFkZXJzLCAiaHR0cHM6IiArIHVybCwgZXJyY29kZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5odHRwX2Vycm9yKHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5odHRwX2Vycm9yKHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKQorCisgICAgZGVmIG9wZW5fZmlsZShzZWxmLCB1cmwpOgorICAgICAgICAiIiJVc2UgbG9jYWwgZmlsZSBvciBGVFAgZGVwZW5kaW5nIG9uIGZvcm0gb2YgVVJMLiIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh1cmwsIHN0cik6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAoJ2ZpbGUgZXJyb3InLCAncHJveHkgc3VwcG9ydCBmb3IgZmlsZSBwcm90b2NvbCBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkJykKKyAgICAgICAgaWYgdXJsWzoyXSA9PSAnLy8nIGFuZCB1cmxbMjozXSAhPSAnLycgYW5kIHVybFsyOjEyXS5sb3dlcigpICE9ICdsb2NhbGhvc3QvJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm9wZW5fZnRwKHVybCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm9wZW5fbG9jYWxfZmlsZSh1cmwpCisKKyAgICBkZWYgb3Blbl9sb2NhbF9maWxlKHNlbGYsIHVybCk6CisgICAgICAgICIiIlVzZSBsb2NhbCBmaWxlLiIiIgorICAgICAgICBpbXBvcnQgbWltZXR5cGVzLCBtaW1ldG9vbHMsIGVtYWlsLnV0aWxzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBob3N0LCBmaWxlID0gc3BsaXRob3N0KHVybCkKKyAgICAgICAgbG9jYWxuYW1lID0gdXJsMnBhdGhuYW1lKGZpbGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN0YXRzID0gb3Muc3RhdChsb2NhbG5hbWUpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcihlLmVycm5vLCBlLnN0cmVycm9yLCBlLmZpbGVuYW1lKQorICAgICAgICBzaXplID0gc3RhdHMuc3Rfc2l6ZQorICAgICAgICBtb2RpZmllZCA9IGVtYWlsLnV0aWxzLmZvcm1hdGRhdGUoc3RhdHMuc3RfbXRpbWUsIHVzZWdtdD1UcnVlKQorICAgICAgICBtdHlwZSA9IG1pbWV0eXBlcy5ndWVzc190eXBlKHVybClbMF0KKyAgICAgICAgaGVhZGVycyA9IG1pbWV0b29scy5NZXNzYWdlKFN0cmluZ0lPKAorICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJXNcbkNvbnRlbnQtTGVuZ3RoOiAlZFxuTGFzdC1tb2RpZmllZDogJXNcbicgJQorICAgICAgICAgICAgKG10eXBlIG9yICd0ZXh0L3BsYWluJywgc2l6ZSwgbW9kaWZpZWQpKSkKKyAgICAgICAgaWYgbm90IGhvc3Q6CisgICAgICAgICAgICB1cmxmaWxlID0gZmlsZQorICAgICAgICAgICAgaWYgZmlsZVs6MV0gPT0gJy8nOgorICAgICAgICAgICAgICAgIHVybGZpbGUgPSAnZmlsZTovLycgKyBmaWxlCisgICAgICAgICAgICBlbGlmIGZpbGVbOjJdID09ICcuLyc6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibG9jYWwgZmlsZSB1cmwgbWF5IHN0YXJ0IHdpdGggLyBvciBmaWxlOi4gVW5rbm93biB1cmwgb2YgdHlwZTogJXMiICUgdXJsKQorICAgICAgICAgICAgcmV0dXJuIGFkZGluZm91cmwob3Blbihsb2NhbG5hbWUsICdyYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycywgdXJsZmlsZSkKKyAgICAgICAgaG9zdCwgcG9ydCA9IHNwbGl0cG9ydChob3N0KQorICAgICAgICBpZiBub3QgcG9ydCBcCisgICAgICAgICAgIGFuZCBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShob3N0KSBpbiAobG9jYWxob3N0KCksIHRoaXNob3N0KCkpOgorICAgICAgICAgICAgdXJsZmlsZSA9IGZpbGUKKyAgICAgICAgICAgIGlmIGZpbGVbOjFdID09ICcvJzoKKyAgICAgICAgICAgICAgICB1cmxmaWxlID0gJ2ZpbGU6Ly8nICsgZmlsZQorICAgICAgICAgICAgcmV0dXJuIGFkZGluZm91cmwob3Blbihsb2NhbG5hbWUsICdyYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycywgdXJsZmlsZSkKKyAgICAgICAgcmFpc2UgSU9FcnJvciwgKCdsb2NhbCBmaWxlIGVycm9yJywgJ25vdCBvbiBsb2NhbCBob3N0JykKKworICAgIGRlZiBvcGVuX2Z0cChzZWxmLCB1cmwpOgorICAgICAgICAiIiJVc2UgRlRQIHByb3RvY29sLiIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh1cmwsIHN0cik6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAoJ2Z0cCBlcnJvcicsICdwcm94eSBzdXBwb3J0IGZvciBmdHAgcHJvdG9jb2wgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCcpCisgICAgICAgIGltcG9ydCBtaW1ldHlwZXMsIG1pbWV0b29scworICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgaG9zdCwgcGF0aCA9IHNwbGl0aG9zdCh1cmwpCisgICAgICAgIGlmIG5vdCBob3N0OiByYWlzZSBJT0Vycm9yLCAoJ2Z0cCBlcnJvcicsICdubyBob3N0IGdpdmVuJykKKyAgICAgICAgaG9zdCwgcG9ydCA9IHNwbGl0cG9ydChob3N0KQorICAgICAgICB1c2VyLCBob3N0ID0gc3BsaXR1c2VyKGhvc3QpCisgICAgICAgIGlmIHVzZXI6IHVzZXIsIHBhc3N3ZCA9IHNwbGl0cGFzc3dkKHVzZXIpCisgICAgICAgIGVsc2U6IHBhc3N3ZCA9IE5vbmUKKyAgICAgICAgaG9zdCA9IHVucXVvdGUoaG9zdCkKKyAgICAgICAgdXNlciA9IHVzZXIgb3IgJycKKyAgICAgICAgcGFzc3dkID0gcGFzc3dkIG9yICcnCisgICAgICAgIGhvc3QgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShob3N0KQorICAgICAgICBpZiBub3QgcG9ydDoKKyAgICAgICAgICAgIGltcG9ydCBmdHBsaWIKKyAgICAgICAgICAgIHBvcnQgPSBmdHBsaWIuRlRQX1BPUlQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBvcnQgPSBpbnQocG9ydCkKKyAgICAgICAgcGF0aCwgYXR0cnMgPSBzcGxpdGF0dHIocGF0aCkKKyAgICAgICAgcGF0aCA9IHVucXVvdGUocGF0aCkKKyAgICAgICAgZGlycyA9IHBhdGguc3BsaXQoJy8nKQorICAgICAgICBkaXJzLCBmaWxlID0gZGlyc1s6LTFdLCBkaXJzWy0xXQorICAgICAgICBpZiBkaXJzIGFuZCBub3QgZGlyc1swXTogZGlycyA9IGRpcnNbMTpdCisgICAgICAgIGlmIGRpcnMgYW5kIG5vdCBkaXJzWzBdOiBkaXJzWzBdID0gJy8nCisgICAgICAgIGtleSA9IHVzZXIsIGhvc3QsIHBvcnQsICcvJy5qb2luKGRpcnMpCisgICAgICAgICMgWFhYIHRocmVhZCB1bnNhZmUhCisgICAgICAgIGlmIGxlbihzZWxmLmZ0cGNhY2hlKSA+IE1BWEZUUENBQ0hFOgorICAgICAgICAgICAgIyBQcnVuZSB0aGUgY2FjaGUsIHJhdGhlciBhcmJpdHJhcmlseQorICAgICAgICAgICAgZm9yIGsgaW4gc2VsZi5mdHBjYWNoZS5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgayAhPSBrZXk6CisgICAgICAgICAgICAgICAgICAgIHYgPSBzZWxmLmZ0cGNhY2hlW2tdCisgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLmZ0cGNhY2hlW2tdCisgICAgICAgICAgICAgICAgICAgIHYuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3Qga2V5IGluIHNlbGYuZnRwY2FjaGU6CisgICAgICAgICAgICAgICAgc2VsZi5mdHBjYWNoZVtrZXldID0gXAorICAgICAgICAgICAgICAgICAgICBmdHB3cmFwcGVyKHVzZXIsIHBhc3N3ZCwgaG9zdCwgcG9ydCwgZGlycykKKyAgICAgICAgICAgIGlmIG5vdCBmaWxlOiB0eXBlID0gJ0QnCisgICAgICAgICAgICBlbHNlOiB0eXBlID0gJ0knCisgICAgICAgICAgICBmb3IgYXR0ciBpbiBhdHRyczoKKyAgICAgICAgICAgICAgICBhdHRyLCB2YWx1ZSA9IHNwbGl0dmFsdWUoYXR0cikKKyAgICAgICAgICAgICAgICBpZiBhdHRyLmxvd2VyKCkgPT0gJ3R5cGUnIGFuZCBcCisgICAgICAgICAgICAgICAgICAgdmFsdWUgaW4gKCdhJywgJ0EnLCAnaScsICdJJywgJ2QnLCAnRCcpOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gdmFsdWUudXBwZXIoKQorICAgICAgICAgICAgKGZwLCByZXRybGVuKSA9IHNlbGYuZnRwY2FjaGVba2V5XS5yZXRyZmlsZShmaWxlLCB0eXBlKQorICAgICAgICAgICAgbXR5cGUgPSBtaW1ldHlwZXMuZ3Vlc3NfdHlwZSgiZnRwOiIgKyB1cmwpWzBdCisgICAgICAgICAgICBoZWFkZXJzID0gIiIKKyAgICAgICAgICAgIGlmIG10eXBlOgorICAgICAgICAgICAgICAgIGhlYWRlcnMgKz0gIkNvbnRlbnQtVHlwZTogJXNcbiIgJSBtdHlwZQorICAgICAgICAgICAgaWYgcmV0cmxlbiBpcyBub3QgTm9uZSBhbmQgcmV0cmxlbiA+PSAwOgorICAgICAgICAgICAgICAgIGhlYWRlcnMgKz0gIkNvbnRlbnQtTGVuZ3RoOiAlZFxuIiAlIHJldHJsZW4KKyAgICAgICAgICAgIGhlYWRlcnMgPSBtaW1ldG9vbHMuTWVzc2FnZShTdHJpbmdJTyhoZWFkZXJzKSkKKyAgICAgICAgICAgIHJldHVybiBhZGRpbmZvdXJsKGZwLCBoZWFkZXJzLCAiZnRwOiIgKyB1cmwpCisgICAgICAgIGV4Y2VwdCBmdHBlcnJvcnMoKSwgbXNnOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgKCdmdHAgZXJyb3InLCBtc2cpLCBzeXMuZXhjX2luZm8oKVsyXQorCisgICAgZGVmIG9wZW5fZGF0YShzZWxmLCB1cmwsIGRhdGE9Tm9uZSk6CisgICAgICAgICIiIlVzZSAiZGF0YSIgVVJMLiIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh1cmwsIHN0cik6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAoJ2RhdGEgZXJyb3InLCAncHJveHkgc3VwcG9ydCBmb3IgZGF0YSBwcm90b2NvbCBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkJykKKyAgICAgICAgIyBpZ25vcmUgUE9TVGVkIGRhdGEKKyAgICAgICAgIworICAgICAgICAjIHN5bnRheCBvZiBkYXRhIFVSTHM6CisgICAgICAgICMgZGF0YXVybCAgIDo9ICJkYXRhOiIgWyBtZWRpYXR5cGUgXSBbICI7YmFzZTY0IiBdICIsIiBkYXRhCisgICAgICAgICMgbWVkaWF0eXBlIDo9IFsgdHlwZSAiLyIgc3VidHlwZSBdICooICI7IiBwYXJhbWV0ZXIgKQorICAgICAgICAjIGRhdGEgICAgICA6PSAqdXJsY2hhcgorICAgICAgICAjIHBhcmFtZXRlciA6PSBhdHRyaWJ1dGUgIj0iIHZhbHVlCisgICAgICAgIGltcG9ydCBtaW1ldG9vbHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFt0eXBlLCBkYXRhXSA9IHVybC5zcGxpdCgnLCcsIDEpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgKCdkYXRhIGVycm9yJywgJ2JhZCBkYXRhIFVSTCcpCisgICAgICAgIGlmIG5vdCB0eXBlOgorICAgICAgICAgICAgdHlwZSA9ICd0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUknCisgICAgICAgIHNlbWkgPSB0eXBlLnJmaW5kKCc7JykKKyAgICAgICAgaWYgc2VtaSA+PSAwIGFuZCAnPScgbm90IGluIHR5cGVbc2VtaTpdOgorICAgICAgICAgICAgZW5jb2RpbmcgPSB0eXBlW3NlbWkrMTpdCisgICAgICAgICAgICB0eXBlID0gdHlwZVs6c2VtaV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gJycKKyAgICAgICAgbXNnID0gW10KKyAgICAgICAgbXNnLmFwcGVuZCgnRGF0ZTogJXMnJXRpbWUuc3RyZnRpbWUoJyVhLCAlZCAlYiAlWSAlSDolTTolUyBHTVQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLmdtdGltZSh0aW1lLnRpbWUoKSkpKQorICAgICAgICBtc2cuYXBwZW5kKCdDb250ZW50LXR5cGU6ICVzJyAlIHR5cGUpCisgICAgICAgIGlmIGVuY29kaW5nID09ICdiYXNlNjQnOgorICAgICAgICAgICAgZGF0YSA9IGJhc2U2NC5kZWNvZGVzdHJpbmcoZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEgPSB1bnF1b3RlKGRhdGEpCisgICAgICAgIG1zZy5hcHBlbmQoJ0NvbnRlbnQtTGVuZ3RoOiAlZCcgJSBsZW4oZGF0YSkpCisgICAgICAgIG1zZy5hcHBlbmQoJycpCisgICAgICAgIG1zZy5hcHBlbmQoZGF0YSkKKyAgICAgICAgbXNnID0gJ1xuJy5qb2luKG1zZykKKyAgICAgICAgZiA9IFN0cmluZ0lPKG1zZykKKyAgICAgICAgaGVhZGVycyA9IG1pbWV0b29scy5NZXNzYWdlKGYsIDApCisgICAgICAgICNmLmZpbGVubyA9IE5vbmUgICAgICMgbmVlZGVkIGZvciBhZGRpbmZvdXJsCisgICAgICAgIHJldHVybiBhZGRpbmZvdXJsKGYsIGhlYWRlcnMsIHVybCkKKworCitjbGFzcyBGYW5jeVVSTG9wZW5lcihVUkxvcGVuZXIpOgorICAgICIiIkRlcml2ZWQgY2xhc3Mgd2l0aCBoYW5kbGVycyBmb3IgZXJyb3JzIHdlIGNhbiBoYW5kbGUgKHBlcmhhcHMpLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIFVSTG9wZW5lci5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuYXV0aF9jYWNoZSA9IHt9CisgICAgICAgIHNlbGYudHJpZXMgPSAwCisgICAgICAgIHNlbGYubWF4dHJpZXMgPSAxMAorCisgICAgZGVmIGh0dHBfZXJyb3JfZGVmYXVsdChzZWxmLCB1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMpOgorICAgICAgICAiIiJEZWZhdWx0IGVycm9yIGhhbmRsaW5nIC0tIGRvbid0IHJhaXNlIGFuIGV4Y2VwdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuIGFkZGluZm91cmwoZnAsIGhlYWRlcnMsICJodHRwOiIgKyB1cmwsIGVycmNvZGUpCisKKyAgICBkZWYgaHR0cF9lcnJvcl8zMDIoc2VsZiwgdXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzLCBkYXRhPU5vbmUpOgorICAgICAgICAiIiJFcnJvciAzMDIgLS0gcmVsb2NhdGVkICh0ZW1wb3JhcmlseSkuIiIiCisgICAgICAgIHNlbGYudHJpZXMgKz0gMQorICAgICAgICBpZiBzZWxmLm1heHRyaWVzIGFuZCBzZWxmLnRyaWVzID49IHNlbGYubWF4dHJpZXM6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICJodHRwX2Vycm9yXzUwMCIpOgorICAgICAgICAgICAgICAgIG1ldGggPSBzZWxmLmh0dHBfZXJyb3JfNTAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1ldGggPSBzZWxmLmh0dHBfZXJyb3JfZGVmYXVsdAorICAgICAgICAgICAgc2VsZi50cmllcyA9IDAKKyAgICAgICAgICAgIHJldHVybiBtZXRoKHVybCwgZnAsIDUwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcm5hbCBTZXJ2ZXIgRXJyb3I6IFJlZGlyZWN0IFJlY3Vyc2lvbiIsIGhlYWRlcnMpCisgICAgICAgIHJlc3VsdCA9IHNlbGYucmVkaXJlY3RfaW50ZXJuYWwodXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpCisgICAgICAgIHNlbGYudHJpZXMgPSAwCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiByZWRpcmVjdF9pbnRlcm5hbChzZWxmLCB1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMsIGRhdGEpOgorICAgICAgICBpZiAnbG9jYXRpb24nIGluIGhlYWRlcnM6CisgICAgICAgICAgICBuZXd1cmwgPSBoZWFkZXJzWydsb2NhdGlvbiddCisgICAgICAgIGVsaWYgJ3VyaScgaW4gaGVhZGVyczoKKyAgICAgICAgICAgIG5ld3VybCA9IGhlYWRlcnNbJ3VyaSddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAjIEluIGNhc2UgdGhlIHNlcnZlciBzZW50IGEgcmVsYXRpdmUgVVJMLCBqb2luIHdpdGggb3JpZ2luYWw6CisgICAgICAgIG5ld3VybCA9IGJhc2Vqb2luKHNlbGYudHlwZSArICI6IiArIHVybCwgbmV3dXJsKQorCisgICAgICAgICMgRm9yIHNlY3VyaXR5IHJlYXNvbnMgd2UgZG8gbm90IGFsbG93IHJlZGlyZWN0cyB0byBwcm90b2NvbHMKKyAgICAgICAgIyBvdGhlciB0aGFuIEhUVFAsIEhUVFBTIG9yIEZUUC4KKyAgICAgICAgbmV3dXJsX2xvd2VyID0gbmV3dXJsLmxvd2VyKCkKKyAgICAgICAgaWYgbm90IChuZXd1cmxfbG93ZXIuc3RhcnRzd2l0aCgnaHR0cDovLycpIG9yCisgICAgICAgICAgICAgICAgbmV3dXJsX2xvd2VyLnN0YXJ0c3dpdGgoJ2h0dHBzOi8vJykgb3IKKyAgICAgICAgICAgICAgICBuZXd1cmxfbG93ZXIuc3RhcnRzd2l0aCgnZnRwOi8vJykpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigncmVkaXJlY3QgZXJyb3InLCBlcnJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJtc2cgKyAiIC0gUmVkaXJlY3Rpb24gdG8gdXJsICclcycgaXMgbm90IGFsbG93ZWQiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3dXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzKQorCisgICAgICAgIHJldHVybiBzZWxmLm9wZW4obmV3dXJsKQorCisgICAgZGVmIGh0dHBfZXJyb3JfMzAxKHNlbGYsIHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycywgZGF0YT1Ob25lKToKKyAgICAgICAgIiIiRXJyb3IgMzAxIC0tIGFsc28gcmVsb2NhdGVkIChwZXJtYW5lbnRseSkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmh0dHBfZXJyb3JfMzAyKHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycywgZGF0YSkKKworICAgIGRlZiBodHRwX2Vycm9yXzMwMyhzZWxmLCB1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMsIGRhdGE9Tm9uZSk6CisgICAgICAgICIiIkVycm9yIDMwMyAtLSBhbHNvIHJlbG9jYXRlZCAoZXNzZW50aWFsbHkgaWRlbnRpY2FsIHRvIDMwMikuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmh0dHBfZXJyb3JfMzAyKHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycywgZGF0YSkKKworICAgIGRlZiBodHRwX2Vycm9yXzMwNyhzZWxmLCB1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMsIGRhdGE9Tm9uZSk6CisgICAgICAgICIiIkVycm9yIDMwNyAtLSByZWxvY2F0ZWQsIGJ1dCB0dXJuIFBPU1QgaW50byBlcnJvci4iIiIKKyAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuaHR0cF9lcnJvcl8zMDIodXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzLCBkYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuaHR0cF9lcnJvcl9kZWZhdWx0KHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKKworICAgIGRlZiBodHRwX2Vycm9yXzQwMShzZWxmLCB1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMsIGRhdGE9Tm9uZSk6CisgICAgICAgICIiIkVycm9yIDQwMSAtLSBhdXRoZW50aWNhdGlvbiByZXF1aXJlZC4KKyAgICAgICAgVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyBCYXNpYyBhdXRoZW50aWNhdGlvbiBvbmx5LiIiIgorICAgICAgICBpZiBub3QgJ3d3dy1hdXRoZW50aWNhdGUnIGluIGhlYWRlcnM6CisgICAgICAgICAgICBVUkxvcGVuZXIuaHR0cF9lcnJvcl9kZWZhdWx0KHNlbGYsIHVybCwgZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKKyAgICAgICAgc3R1ZmYgPSBoZWFkZXJzWyd3d3ctYXV0aGVudGljYXRlJ10KKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIG1hdGNoID0gcmUubWF0Y2goJ1sgXHRdKihbXiBcdF0rKVsgXHRdK3JlYWxtPSIoW14iXSopIicsIHN0dWZmKQorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICBVUkxvcGVuZXIuaHR0cF9lcnJvcl9kZWZhdWx0KHNlbGYsIHVybCwgZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKKyAgICAgICAgc2NoZW1lLCByZWFsbSA9IG1hdGNoLmdyb3VwcygpCisgICAgICAgIGlmIHNjaGVtZS5sb3dlcigpICE9ICdiYXNpYyc6CisgICAgICAgICAgICBVUkxvcGVuZXIuaHR0cF9lcnJvcl9kZWZhdWx0KHNlbGYsIHVybCwgZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKKyAgICAgICAgbmFtZSA9ICdyZXRyeV8nICsgc2VsZi50eXBlICsgJ19iYXNpY19hdXRoJworICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLG5hbWUpKHVybCwgcmVhbG0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLG5hbWUpKHVybCwgcmVhbG0sIGRhdGEpCisKKyAgICBkZWYgaHR0cF9lcnJvcl80MDcoc2VsZiwgdXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzLCBkYXRhPU5vbmUpOgorICAgICAgICAiIiJFcnJvciA0MDcgLS0gcHJveHkgYXV0aGVudGljYXRpb24gcmVxdWlyZWQuCisgICAgICAgIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgQmFzaWMgYXV0aGVudGljYXRpb24gb25seS4iIiIKKyAgICAgICAgaWYgbm90ICdwcm94eS1hdXRoZW50aWNhdGUnIGluIGhlYWRlcnM6CisgICAgICAgICAgICBVUkxvcGVuZXIuaHR0cF9lcnJvcl9kZWZhdWx0KHNlbGYsIHVybCwgZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKKyAgICAgICAgc3R1ZmYgPSBoZWFkZXJzWydwcm94eS1hdXRoZW50aWNhdGUnXQorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgbWF0Y2ggPSByZS5tYXRjaCgnWyBcdF0qKFteIFx0XSspWyBcdF0rcmVhbG09IihbXiJdKikiJywgc3R1ZmYpCisgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgIFVSTG9wZW5lci5odHRwX2Vycm9yX2RlZmF1bHQoc2VsZiwgdXJsLCBmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzKQorICAgICAgICBzY2hlbWUsIHJlYWxtID0gbWF0Y2guZ3JvdXBzKCkKKyAgICAgICAgaWYgc2NoZW1lLmxvd2VyKCkgIT0gJ2Jhc2ljJzoKKyAgICAgICAgICAgIFVSTG9wZW5lci5odHRwX2Vycm9yX2RlZmF1bHQoc2VsZiwgdXJsLCBmcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzKQorICAgICAgICBuYW1lID0gJ3JldHJ5X3Byb3h5XycgKyBzZWxmLnR5cGUgKyAnX2Jhc2ljX2F1dGgnCisgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsbmFtZSkodXJsLCByZWFsbSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsbmFtZSkodXJsLCByZWFsbSwgZGF0YSkKKworICAgIGRlZiByZXRyeV9wcm94eV9odHRwX2Jhc2ljX2F1dGgoc2VsZiwgdXJsLCByZWFsbSwgZGF0YT1Ob25lKToKKyAgICAgICAgaG9zdCwgc2VsZWN0b3IgPSBzcGxpdGhvc3QodXJsKQorICAgICAgICBuZXd1cmwgPSAnaHR0cDovLycgKyBob3N0ICsgc2VsZWN0b3IKKyAgICAgICAgcHJveHkgPSBzZWxmLnByb3hpZXNbJ2h0dHAnXQorICAgICAgICB1cmx0eXBlLCBwcm94eWhvc3QgPSBzcGxpdHR5cGUocHJveHkpCisgICAgICAgIHByb3h5aG9zdCwgcHJveHlzZWxlY3RvciA9IHNwbGl0aG9zdChwcm94eWhvc3QpCisgICAgICAgIGkgPSBwcm94eWhvc3QuZmluZCgnQCcpICsgMQorICAgICAgICBwcm94eWhvc3QgPSBwcm94eWhvc3RbaTpdCisgICAgICAgIHVzZXIsIHBhc3N3ZCA9IHNlbGYuZ2V0X3VzZXJfcGFzc3dkKHByb3h5aG9zdCwgcmVhbG0sIGkpCisgICAgICAgIGlmIG5vdCAodXNlciBvciBwYXNzd2QpOiByZXR1cm4gTm9uZQorICAgICAgICBwcm94eWhvc3QgPSBxdW90ZSh1c2VyLCBzYWZlPScnKSArICc6JyArIHF1b3RlKHBhc3N3ZCwgc2FmZT0nJykgKyAnQCcgKyBwcm94eWhvc3QKKyAgICAgICAgc2VsZi5wcm94aWVzWydodHRwJ10gPSAnaHR0cDovLycgKyBwcm94eWhvc3QgKyBwcm94eXNlbGVjdG9yCisgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm9wZW4obmV3dXJsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYub3BlbihuZXd1cmwsIGRhdGEpCisKKyAgICBkZWYgcmV0cnlfcHJveHlfaHR0cHNfYmFzaWNfYXV0aChzZWxmLCB1cmwsIHJlYWxtLCBkYXRhPU5vbmUpOgorICAgICAgICBob3N0LCBzZWxlY3RvciA9IHNwbGl0aG9zdCh1cmwpCisgICAgICAgIG5ld3VybCA9ICdodHRwczovLycgKyBob3N0ICsgc2VsZWN0b3IKKyAgICAgICAgcHJveHkgPSBzZWxmLnByb3hpZXNbJ2h0dHBzJ10KKyAgICAgICAgdXJsdHlwZSwgcHJveHlob3N0ID0gc3BsaXR0eXBlKHByb3h5KQorICAgICAgICBwcm94eWhvc3QsIHByb3h5c2VsZWN0b3IgPSBzcGxpdGhvc3QocHJveHlob3N0KQorICAgICAgICBpID0gcHJveHlob3N0LmZpbmQoJ0AnKSArIDEKKyAgICAgICAgcHJveHlob3N0ID0gcHJveHlob3N0W2k6XQorICAgICAgICB1c2VyLCBwYXNzd2QgPSBzZWxmLmdldF91c2VyX3Bhc3N3ZChwcm94eWhvc3QsIHJlYWxtLCBpKQorICAgICAgICBpZiBub3QgKHVzZXIgb3IgcGFzc3dkKTogcmV0dXJuIE5vbmUKKyAgICAgICAgcHJveHlob3N0ID0gcXVvdGUodXNlciwgc2FmZT0nJykgKyAnOicgKyBxdW90ZShwYXNzd2QsIHNhZmU9JycpICsgJ0AnICsgcHJveHlob3N0CisgICAgICAgIHNlbGYucHJveGllc1snaHR0cHMnXSA9ICdodHRwczovLycgKyBwcm94eWhvc3QgKyBwcm94eXNlbGVjdG9yCisgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm9wZW4obmV3dXJsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYub3BlbihuZXd1cmwsIGRhdGEpCisKKyAgICBkZWYgcmV0cnlfaHR0cF9iYXNpY19hdXRoKHNlbGYsIHVybCwgcmVhbG0sIGRhdGE9Tm9uZSk6CisgICAgICAgIGhvc3QsIHNlbGVjdG9yID0gc3BsaXRob3N0KHVybCkKKyAgICAgICAgaSA9IGhvc3QuZmluZCgnQCcpICsgMQorICAgICAgICBob3N0ID0gaG9zdFtpOl0KKyAgICAgICAgdXNlciwgcGFzc3dkID0gc2VsZi5nZXRfdXNlcl9wYXNzd2QoaG9zdCwgcmVhbG0sIGkpCisgICAgICAgIGlmIG5vdCAodXNlciBvciBwYXNzd2QpOiByZXR1cm4gTm9uZQorICAgICAgICBob3N0ID0gcXVvdGUodXNlciwgc2FmZT0nJykgKyAnOicgKyBxdW90ZShwYXNzd2QsIHNhZmU9JycpICsgJ0AnICsgaG9zdAorICAgICAgICBuZXd1cmwgPSAnaHR0cDovLycgKyBob3N0ICsgc2VsZWN0b3IKKyAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYub3BlbihuZXd1cmwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGVuKG5ld3VybCwgZGF0YSkKKworICAgIGRlZiByZXRyeV9odHRwc19iYXNpY19hdXRoKHNlbGYsIHVybCwgcmVhbG0sIGRhdGE9Tm9uZSk6CisgICAgICAgIGhvc3QsIHNlbGVjdG9yID0gc3BsaXRob3N0KHVybCkKKyAgICAgICAgaSA9IGhvc3QuZmluZCgnQCcpICsgMQorICAgICAgICBob3N0ID0gaG9zdFtpOl0KKyAgICAgICAgdXNlciwgcGFzc3dkID0gc2VsZi5nZXRfdXNlcl9wYXNzd2QoaG9zdCwgcmVhbG0sIGkpCisgICAgICAgIGlmIG5vdCAodXNlciBvciBwYXNzd2QpOiByZXR1cm4gTm9uZQorICAgICAgICBob3N0ID0gcXVvdGUodXNlciwgc2FmZT0nJykgKyAnOicgKyBxdW90ZShwYXNzd2QsIHNhZmU9JycpICsgJ0AnICsgaG9zdAorICAgICAgICBuZXd1cmwgPSAnaHR0cHM6Ly8nICsgaG9zdCArIHNlbGVjdG9yCisgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm9wZW4obmV3dXJsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYub3BlbihuZXd1cmwsIGRhdGEpCisKKyAgICBkZWYgZ2V0X3VzZXJfcGFzc3dkKHNlbGYsIGhvc3QsIHJlYWxtLCBjbGVhcl9jYWNoZT0wKToKKyAgICAgICAga2V5ID0gcmVhbG0gKyAnQCcgKyBob3N0Lmxvd2VyKCkKKyAgICAgICAgaWYga2V5IGluIHNlbGYuYXV0aF9jYWNoZToKKyAgICAgICAgICAgIGlmIGNsZWFyX2NhY2hlOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmF1dGhfY2FjaGVba2V5XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5hdXRoX2NhY2hlW2tleV0KKyAgICAgICAgdXNlciwgcGFzc3dkID0gc2VsZi5wcm9tcHRfdXNlcl9wYXNzd2QoaG9zdCwgcmVhbG0pCisgICAgICAgIGlmIHVzZXIgb3IgcGFzc3dkOiBzZWxmLmF1dGhfY2FjaGVba2V5XSA9ICh1c2VyLCBwYXNzd2QpCisgICAgICAgIHJldHVybiB1c2VyLCBwYXNzd2QKKworICAgIGRlZiBwcm9tcHRfdXNlcl9wYXNzd2Qoc2VsZiwgaG9zdCwgcmVhbG0pOgorICAgICAgICAiIiJPdmVycmlkZSB0aGlzIGluIGEgR1VJIGVudmlyb25tZW50ISIiIgorICAgICAgICBpbXBvcnQgZ2V0cGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICB1c2VyID0gcmF3X2lucHV0KCJFbnRlciB1c2VybmFtZSBmb3IgJXMgYXQgJXM6ICIgJSAocmVhbG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCkpCisgICAgICAgICAgICBwYXNzd2QgPSBnZXRwYXNzLmdldHBhc3MoIkVudGVyIHBhc3N3b3JkIGZvciAlcyBpbiAlcyBhdCAlczogIiAlCisgICAgICAgICAgICAgICAgKHVzZXIsIHJlYWxtLCBob3N0KSkKKyAgICAgICAgICAgIHJldHVybiB1c2VyLCBwYXNzd2QKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCisKKworIyBVdGlsaXR5IGZ1bmN0aW9ucworCitfbG9jYWxob3N0ID0gTm9uZQorZGVmIGxvY2FsaG9zdCgpOgorICAgICIiIlJldHVybiB0aGUgSVAgYWRkcmVzcyBvZiB0aGUgbWFnaWMgaG9zdG5hbWUgJ2xvY2FsaG9zdCcuIiIiCisgICAgZ2xvYmFsIF9sb2NhbGhvc3QKKyAgICBpZiBfbG9jYWxob3N0IGlzIE5vbmU6CisgICAgICAgIF9sb2NhbGhvc3QgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZSgnbG9jYWxob3N0JykKKyAgICByZXR1cm4gX2xvY2FsaG9zdAorCitfdGhpc2hvc3QgPSBOb25lCitkZWYgdGhpc2hvc3QoKToKKyAgICAiIiJSZXR1cm4gdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgaG9zdC4iIiIKKyAgICBnbG9iYWwgX3RoaXNob3N0CisgICAgaWYgX3RoaXNob3N0IGlzIE5vbmU6CisgICAgICAgIF90aGlzaG9zdCA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgIHJldHVybiBfdGhpc2hvc3QKKworX2Z0cGVycm9ycyA9IE5vbmUKK2RlZiBmdHBlcnJvcnMoKToKKyAgICAiIiJSZXR1cm4gdGhlIHNldCBvZiBlcnJvcnMgcmFpc2VkIGJ5IHRoZSBGVFAgY2xhc3MuIiIiCisgICAgZ2xvYmFsIF9mdHBlcnJvcnMKKyAgICBpZiBfZnRwZXJyb3JzIGlzIE5vbmU6CisgICAgICAgIGltcG9ydCBmdHBsaWIKKyAgICAgICAgX2Z0cGVycm9ycyA9IGZ0cGxpYi5hbGxfZXJyb3JzCisgICAgcmV0dXJuIF9mdHBlcnJvcnMKKworX25vaGVhZGVycyA9IE5vbmUKK2RlZiBub2hlYWRlcnMoKToKKyAgICAiIiJSZXR1cm4gYW4gZW1wdHkgbWltZXRvb2xzLk1lc3NhZ2Ugb2JqZWN0LiIiIgorICAgIGdsb2JhbCBfbm9oZWFkZXJzCisgICAgaWYgX25vaGVhZGVycyBpcyBOb25lOgorICAgICAgICBpbXBvcnQgbWltZXRvb2xzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBfbm9oZWFkZXJzID0gbWltZXRvb2xzLk1lc3NhZ2UoU3RyaW5nSU8oKSwgMCkKKyAgICAgICAgX25vaGVhZGVycy5mcC5jbG9zZSgpICAgIyBSZWN5Y2xlIGZpbGUgZGVzY3JpcHRvcgorICAgIHJldHVybiBfbm9oZWFkZXJzCisKKworIyBVdGlsaXR5IGNsYXNzZXMKKworY2xhc3MgZnRwd3JhcHBlcjoKKyAgICAiIiJDbGFzcyB1c2VkIGJ5IG9wZW5fZnRwKCkgZm9yIGNhY2hlIG9mIG9wZW4gRlRQIGNvbm5lY3Rpb25zLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVzZXIsIHBhc3N3ZCwgaG9zdCwgcG9ydCwgZGlycywKKyAgICAgICAgICAgICAgICAgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQ9VHJ1ZSk6CisgICAgICAgIHNlbGYudXNlciA9IHVzZXIKKyAgICAgICAgc2VsZi5wYXNzd2QgPSBwYXNzd2QKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuZGlycyA9IGRpcnMKKyAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICAgICAgICBzZWxmLnJlZmNvdW50ID0gMAorICAgICAgICBzZWxmLmtlZXBhbGl2ZSA9IHBlcnNpc3RlbnQKKyAgICAgICAgc2VsZi5pbml0KCkKKworICAgIGRlZiBpbml0KHNlbGYpOgorICAgICAgICBpbXBvcnQgZnRwbGliCisgICAgICAgIHNlbGYuYnVzeSA9IDAKKyAgICAgICAgc2VsZi5mdHAgPSBmdHBsaWIuRlRQKCkKKyAgICAgICAgc2VsZi5mdHAuY29ubmVjdChzZWxmLmhvc3QsIHNlbGYucG9ydCwgc2VsZi50aW1lb3V0KQorICAgICAgICBzZWxmLmZ0cC5sb2dpbihzZWxmLnVzZXIsIHNlbGYucGFzc3dkKQorICAgICAgICBmb3IgZGlyIGluIHNlbGYuZGlyczoKKyAgICAgICAgICAgIHNlbGYuZnRwLmN3ZChkaXIpCisKKyAgICBkZWYgcmV0cmZpbGUoc2VsZiwgZmlsZSwgdHlwZSk6CisgICAgICAgIGltcG9ydCBmdHBsaWIKKyAgICAgICAgc2VsZi5lbmR0cmFuc2ZlcigpCisgICAgICAgIGlmIHR5cGUgaW4gKCdkJywgJ0QnKTogY21kID0gJ1RZUEUgQSc7IGlzZGlyID0gMQorICAgICAgICBlbHNlOiBjbWQgPSAnVFlQRSAnICsgdHlwZTsgaXNkaXIgPSAwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZnRwLnZvaWRjbWQoY21kKQorICAgICAgICBleGNlcHQgZnRwbGliLmFsbF9lcnJvcnM6CisgICAgICAgICAgICBzZWxmLmluaXQoKQorICAgICAgICAgICAgc2VsZi5mdHAudm9pZGNtZChjbWQpCisgICAgICAgIGNvbm4gPSBOb25lCisgICAgICAgIGlmIGZpbGUgYW5kIG5vdCBpc2RpcjoKKyAgICAgICAgICAgICMgVHJ5IHRvIHJldHJpZXZlIGFzIGEgZmlsZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNtZCA9ICdSRVRSICcgKyBmaWxlCisgICAgICAgICAgICAgICAgY29ubiwgcmV0cmxlbiA9IHNlbGYuZnRwLm50cmFuc2ZlcmNtZChjbWQpCisgICAgICAgICAgICBleGNlcHQgZnRwbGliLmVycm9yX3Blcm0sIHJlYXNvbjoKKyAgICAgICAgICAgICAgICBpZiBzdHIocmVhc29uKVs6M10gIT0gJzU1MCc6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICgnZnRwIGVycm9yJywgcmVhc29uKSwgc3lzLmV4Y19pbmZvKClbMl0KKyAgICAgICAgaWYgbm90IGNvbm46CisgICAgICAgICAgICAjIFNldCB0cmFuc2ZlciBtb2RlIHRvIEFTQ0lJIQorICAgICAgICAgICAgc2VsZi5mdHAudm9pZGNtZCgnVFlQRSBBJykKKyAgICAgICAgICAgICMgVHJ5IGEgZGlyZWN0b3J5IGxpc3RpbmcuIFZlcmlmeSB0aGF0IGRpcmVjdG9yeSBleGlzdHMuCisgICAgICAgICAgICBpZiBmaWxlOgorICAgICAgICAgICAgICAgIHB3ZCA9IHNlbGYuZnRwLnB3ZCgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZ0cC5jd2QoZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGZ0cGxpYi5lcnJvcl9wZXJtLCByZWFzb246CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAoJ2Z0cCBlcnJvcicsIHJlYXNvbiksIHN5cy5leGNfaW5mbygpWzJdCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mdHAuY3dkKHB3ZCkKKyAgICAgICAgICAgICAgICBjbWQgPSAnTElTVCAnICsgZmlsZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjbWQgPSAnTElTVCcKKyAgICAgICAgICAgIGNvbm4sIHJldHJsZW4gPSBzZWxmLmZ0cC5udHJhbnNmZXJjbWQoY21kKQorICAgICAgICBzZWxmLmJ1c3kgPSAxCisgICAgICAgIGZ0cG9iaiA9IGFkZGNsb3NlaG9vayhjb25uLm1ha2VmaWxlKCdyYicpLCBzZWxmLmZpbGVfY2xvc2UpCisgICAgICAgIHNlbGYucmVmY291bnQgKz0gMQorICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgIyBQYXNzIGJhY2sgYm90aCBhIHN1aXRhYmx5IGRlY29yYXRlZCBvYmplY3QgYW5kIGEgcmV0cmlldmFsIGxlbmd0aAorICAgICAgICByZXR1cm4gKGZ0cG9iaiwgcmV0cmxlbikKKworICAgIGRlZiBlbmR0cmFuc2ZlcihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuYnVzeToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmJ1c3kgPSAwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZnRwLnZvaWRyZXNwKCkKKyAgICAgICAgZXhjZXB0IGZ0cGVycm9ycygpOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmtlZXBhbGl2ZSA9IEZhbHNlCisgICAgICAgIGlmIHNlbGYucmVmY291bnQgPD0gMDoKKyAgICAgICAgICAgIHNlbGYucmVhbF9jbG9zZSgpCisKKyAgICBkZWYgZmlsZV9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5lbmR0cmFuc2ZlcigpCisgICAgICAgIHNlbGYucmVmY291bnQgLT0gMQorICAgICAgICBpZiBzZWxmLnJlZmNvdW50IDw9IDAgYW5kIG5vdCBzZWxmLmtlZXBhbGl2ZToKKyAgICAgICAgICAgIHNlbGYucmVhbF9jbG9zZSgpCisKKyAgICBkZWYgcmVhbF9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5lbmR0cmFuc2ZlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZnRwLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IGZ0cGVycm9ycygpOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBhZGRiYXNlOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGFkZGluZm8gYW5kIGFkZGNsb3NlaG9vay4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCk6CisgICAgICAgIHNlbGYuZnAgPSBmcAorICAgICAgICBzZWxmLnJlYWQgPSBzZWxmLmZwLnJlYWQKKyAgICAgICAgc2VsZi5yZWFkbGluZSA9IHNlbGYuZnAucmVhZGxpbmUKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLmZwLCAicmVhZGxpbmVzIik6IHNlbGYucmVhZGxpbmVzID0gc2VsZi5mcC5yZWFkbGluZXMKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLmZwLCAiZmlsZW5vIik6CisgICAgICAgICAgICBzZWxmLmZpbGVubyA9IHNlbGYuZnAuZmlsZW5vCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZpbGVubyA9IGxhbWJkYTogTm9uZQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuZnAsICJfX2l0ZXJfXyIpOgorICAgICAgICAgICAgc2VsZi5fX2l0ZXJfXyA9IHNlbGYuZnAuX19pdGVyX18KKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5mcCwgIm5leHQiKToKKyAgICAgICAgICAgICAgICBzZWxmLm5leHQgPSBzZWxmLmZwLm5leHQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8JXMgYXQgJXIgd2hvc2UgZnAgPSAlcj4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQoc2VsZiksIHNlbGYuZnApCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYucmVhZCA9IE5vbmUKKyAgICAgICAgc2VsZi5yZWFkbGluZSA9IE5vbmUKKyAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBOb25lCisgICAgICAgIHNlbGYuZmlsZW5vID0gTm9uZQorICAgICAgICBpZiBzZWxmLmZwOiBzZWxmLmZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mcCA9IE5vbmUKKworY2xhc3MgYWRkY2xvc2Vob29rKGFkZGJhc2UpOgorICAgICIiIkNsYXNzIHRvIGFkZCBhIGNsb3NlIGhvb2sgdG8gYW4gb3BlbiBmaWxlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZwLCBjbG9zZWhvb2ssICpob29rYXJncyk6CisgICAgICAgIGFkZGJhc2UuX19pbml0X18oc2VsZiwgZnApCisgICAgICAgIHNlbGYuY2xvc2Vob29rID0gY2xvc2Vob29rCisgICAgICAgIHNlbGYuaG9va2FyZ3MgPSBob29rYXJncworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlaG9vazoKKyAgICAgICAgICAgIHNlbGYuY2xvc2Vob29rKCpzZWxmLmhvb2thcmdzKQorICAgICAgICAgICAgc2VsZi5jbG9zZWhvb2sgPSBOb25lCisgICAgICAgICAgICBzZWxmLmhvb2thcmdzID0gTm9uZQorICAgICAgICBhZGRiYXNlLmNsb3NlKHNlbGYpCisKK2NsYXNzIGFkZGluZm8oYWRkYmFzZSk6CisgICAgIiIiY2xhc3MgdG8gYWRkIGFuIGluZm8oKSBtZXRob2QgdG8gYW4gb3BlbiBmaWxlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZwLCBoZWFkZXJzKToKKyAgICAgICAgYWRkYmFzZS5fX2luaXRfXyhzZWxmLCBmcCkKKyAgICAgICAgc2VsZi5oZWFkZXJzID0gaGVhZGVycworCisgICAgZGVmIGluZm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMKKworY2xhc3MgYWRkaW5mb3VybChhZGRiYXNlKToKKyAgICAiIiJjbGFzcyB0byBhZGQgaW5mbygpIGFuZCBnZXR1cmwoKSBtZXRob2RzIHRvIGFuIG9wZW4gZmlsZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCwgaGVhZGVycywgdXJsLCBjb2RlPU5vbmUpOgorICAgICAgICBhZGRiYXNlLl9faW5pdF9fKHNlbGYsIGZwKQorICAgICAgICBzZWxmLmhlYWRlcnMgPSBoZWFkZXJzCisgICAgICAgIHNlbGYudXJsID0gdXJsCisgICAgICAgIHNlbGYuY29kZSA9IGNvZGUKKworICAgIGRlZiBpbmZvKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5oZWFkZXJzCisKKyAgICBkZWYgZ2V0Y29kZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29kZQorCisgICAgZGVmIGdldHVybChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudXJsCisKKworIyBVdGlsaXRpZXMgdG8gcGFyc2UgVVJMcyAobW9zdCBvZiB0aGVzZSByZXR1cm4gTm9uZSBmb3IgbWlzc2luZyBwYXJ0cyk6CisjIHVud3JhcCgnPFVSTDp0eXBlOi8vaG9zdC9wYXRoPicpIC0tPiAndHlwZTovL2hvc3QvcGF0aCcKKyMgc3BsaXR0eXBlKCd0eXBlOm9wYXF1ZXN0cmluZycpIC0tPiAndHlwZScsICdvcGFxdWVzdHJpbmcnCisjIHNwbGl0aG9zdCgnLy9ob3N0Wzpwb3J0XS9wYXRoJykgLS0+ICdob3N0Wzpwb3J0XScsICcvcGF0aCcKKyMgc3BsaXR1c2VyKCd1c2VyWzpwYXNzd2RdQGhvc3RbOnBvcnRdJykgLS0+ICd1c2VyWzpwYXNzd2RdJywgJ2hvc3RbOnBvcnRdJworIyBzcGxpdHBhc3N3ZCgndXNlcjpwYXNzd2QnKSAtPiAndXNlcicsICdwYXNzd2QnCisjIHNwbGl0cG9ydCgnaG9zdDpwb3J0JykgLS0+ICdob3N0JywgJ3BvcnQnCisjIHNwbGl0cXVlcnkoJy9wYXRoP3F1ZXJ5JykgLS0+ICcvcGF0aCcsICdxdWVyeScKKyMgc3BsaXR0YWcoJy9wYXRoI3RhZycpIC0tPiAnL3BhdGgnLCAndGFnJworIyBzcGxpdGF0dHIoJy9wYXRoO2F0dHIxPXZhbHVlMTthdHRyMj12YWx1ZTI7Li4uJykgLT4KKyMgICAnL3BhdGgnLCBbJ2F0dHIxPXZhbHVlMScsICdhdHRyMj12YWx1ZTInLCAuLi5dCisjIHNwbGl0dmFsdWUoJ2F0dHI9dmFsdWUnKSAtLT4gJ2F0dHInLCAndmFsdWUnCisjIHVucXVvdGUoJ2FiYyUyMGRlZicpIC0+ICdhYmMgZGVmJworIyBxdW90ZSgnYWJjIGRlZicpIC0+ICdhYmMlMjBkZWYnKQorCit0cnk6CisgICAgdW5pY29kZQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBkZWYgX2lzX3VuaWNvZGUoeCk6CisgICAgICAgIHJldHVybiAwCitlbHNlOgorICAgIGRlZiBfaXNfdW5pY29kZSh4KToKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgdW5pY29kZSkKKworZGVmIHRvQnl0ZXModXJsKToKKyAgICAiIiJ0b0J5dGVzKHUiVVJMIikgLS0+ICdVUkwnLiIiIgorICAgICMgTW9zdCBVUkwgc2NoZW1lcyByZXF1aXJlIEFTQ0lJLiBJZiB0aGF0IGNoYW5nZXMsIHRoZSBjb252ZXJzaW9uCisgICAgIyBjYW4gYmUgcmVsYXhlZAorICAgIGlmIF9pc191bmljb2RlKHVybCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVybCA9IHVybC5lbmNvZGUoIkFTQ0lJIikKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiVVJMICIgKyByZXByKHVybCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY29udGFpbnMgbm9uLUFTQ0lJIGNoYXJhY3RlcnMiKQorICAgIHJldHVybiB1cmwKKworZGVmIHVud3JhcCh1cmwpOgorICAgICIiInVud3JhcCgnPFVSTDp0eXBlOi8vaG9zdC9wYXRoPicpIC0tPiAndHlwZTovL2hvc3QvcGF0aCcuIiIiCisgICAgdXJsID0gdXJsLnN0cmlwKCkKKyAgICBpZiB1cmxbOjFdID09ICc8JyBhbmQgdXJsWy0xOl0gPT0gJz4nOgorICAgICAgICB1cmwgPSB1cmxbMTotMV0uc3RyaXAoKQorICAgIGlmIHVybFs6NF0gPT0gJ1VSTDonOiB1cmwgPSB1cmxbNDpdLnN0cmlwKCkKKyAgICByZXR1cm4gdXJsCisKK190eXBlcHJvZyA9IE5vbmUKK2RlZiBzcGxpdHR5cGUodXJsKToKKyAgICAiIiJzcGxpdHR5cGUoJ3R5cGU6b3BhcXVlc3RyaW5nJykgLS0+ICd0eXBlJywgJ29wYXF1ZXN0cmluZycuIiIiCisgICAgZ2xvYmFsIF90eXBlcHJvZworICAgIGlmIF90eXBlcHJvZyBpcyBOb25lOgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgX3R5cGVwcm9nID0gcmUuY29tcGlsZSgnXihbXi86XSspOicpCisKKyAgICBtYXRjaCA9IF90eXBlcHJvZy5tYXRjaCh1cmwpCisgICAgaWYgbWF0Y2g6CisgICAgICAgIHNjaGVtZSA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgIHJldHVybiBzY2hlbWUubG93ZXIoKSwgdXJsW2xlbihzY2hlbWUpICsgMTpdCisgICAgcmV0dXJuIE5vbmUsIHVybAorCitfaG9zdHByb2cgPSBOb25lCitkZWYgc3BsaXRob3N0KHVybCk6CisgICAgIiIic3BsaXRob3N0KCcvL2hvc3RbOnBvcnRdL3BhdGgnKSAtLT4gJ2hvc3RbOnBvcnRdJywgJy9wYXRoJy4iIiIKKyAgICBnbG9iYWwgX2hvc3Rwcm9nCisgICAgaWYgX2hvc3Rwcm9nIGlzIE5vbmU6CisgICAgICAgIGltcG9ydCByZQorICAgICAgICBfaG9zdHByb2cgPSByZS5jb21waWxlKCdeLy8oW14vP10qKSguKikkJykKKworICAgIG1hdGNoID0gX2hvc3Rwcm9nLm1hdGNoKHVybCkKKyAgICBpZiBtYXRjaDoKKyAgICAgICAgaG9zdF9wb3J0ID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgcGF0aCA9IG1hdGNoLmdyb3VwKDIpCisgICAgICAgIGlmIHBhdGggYW5kIG5vdCBwYXRoLnN0YXJ0c3dpdGgoJy8nKToKKyAgICAgICAgICAgIHBhdGggPSAnLycgKyBwYXRoCisgICAgICAgIHJldHVybiBob3N0X3BvcnQsIHBhdGgKKyAgICByZXR1cm4gTm9uZSwgdXJsCisKK191c2VycHJvZyA9IE5vbmUKK2RlZiBzcGxpdHVzZXIoaG9zdCk6CisgICAgIiIic3BsaXR1c2VyKCd1c2VyWzpwYXNzd2RdQGhvc3RbOnBvcnRdJykgLS0+ICd1c2VyWzpwYXNzd2RdJywgJ2hvc3RbOnBvcnRdJy4iIiIKKyAgICBnbG9iYWwgX3VzZXJwcm9nCisgICAgaWYgX3VzZXJwcm9nIGlzIE5vbmU6CisgICAgICAgIGltcG9ydCByZQorICAgICAgICBfdXNlcnByb2cgPSByZS5jb21waWxlKCdeKC4qKUAoLiopJCcpCisKKyAgICBtYXRjaCA9IF91c2VycHJvZy5tYXRjaChob3N0KQorICAgIGlmIG1hdGNoOiByZXR1cm4gbWF0Y2guZ3JvdXAoMSwgMikKKyAgICByZXR1cm4gTm9uZSwgaG9zdAorCitfcGFzc3dkcHJvZyA9IE5vbmUKK2RlZiBzcGxpdHBhc3N3ZCh1c2VyKToKKyAgICAiIiJzcGxpdHBhc3N3ZCgndXNlcjpwYXNzd2QnKSAtPiAndXNlcicsICdwYXNzd2QnLiIiIgorICAgIGdsb2JhbCBfcGFzc3dkcHJvZworICAgIGlmIF9wYXNzd2Rwcm9nIGlzIE5vbmU6CisgICAgICAgIGltcG9ydCByZQorICAgICAgICBfcGFzc3dkcHJvZyA9IHJlLmNvbXBpbGUoJ14oW146XSopOiguKikkJyxyZS5TKQorCisgICAgbWF0Y2ggPSBfcGFzc3dkcHJvZy5tYXRjaCh1c2VyKQorICAgIGlmIG1hdGNoOiByZXR1cm4gbWF0Y2guZ3JvdXAoMSwgMikKKyAgICByZXR1cm4gdXNlciwgTm9uZQorCisjIHNwbGl0dGFnKCcvcGF0aCN0YWcnKSAtLT4gJy9wYXRoJywgJ3RhZycKK19wb3J0cHJvZyA9IE5vbmUKK2RlZiBzcGxpdHBvcnQoaG9zdCk6CisgICAgIiIic3BsaXRwb3J0KCdob3N0OnBvcnQnKSAtLT4gJ2hvc3QnLCAncG9ydCcuIiIiCisgICAgZ2xvYmFsIF9wb3J0cHJvZworICAgIGlmIF9wb3J0cHJvZyBpcyBOb25lOgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgX3BvcnRwcm9nID0gcmUuY29tcGlsZSgnXiguKik6KFswLTldKykkJykKKworICAgIG1hdGNoID0gX3BvcnRwcm9nLm1hdGNoKGhvc3QpCisgICAgaWYgbWF0Y2g6IHJldHVybiBtYXRjaC5ncm91cCgxLCAyKQorICAgIHJldHVybiBob3N0LCBOb25lCisKK19ucG9ydHByb2cgPSBOb25lCitkZWYgc3BsaXRucG9ydChob3N0LCBkZWZwb3J0PS0xKToKKyAgICAiIiJTcGxpdCBob3N0IGFuZCBwb3J0LCByZXR1cm5pbmcgbnVtZXJpYyBwb3J0LgorICAgIFJldHVybiBnaXZlbiBkZWZhdWx0IHBvcnQgaWYgbm8gJzonIGZvdW5kOyBkZWZhdWx0cyB0byAtMS4KKyAgICBSZXR1cm4gbnVtZXJpY2FsIHBvcnQgaWYgYSB2YWxpZCBudW1iZXIgYXJlIGZvdW5kIGFmdGVyICc6Jy4KKyAgICBSZXR1cm4gTm9uZSBpZiAnOicgYnV0IG5vdCBhIHZhbGlkIG51bWJlci4iIiIKKyAgICBnbG9iYWwgX25wb3J0cHJvZworICAgIGlmIF9ucG9ydHByb2cgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIF9ucG9ydHByb2cgPSByZS5jb21waWxlKCdeKC4qKTooLiopJCcpCisKKyAgICBtYXRjaCA9IF9ucG9ydHByb2cubWF0Y2goaG9zdCkKKyAgICBpZiBtYXRjaDoKKyAgICAgICAgaG9zdCwgcG9ydCA9IG1hdGNoLmdyb3VwKDEsIDIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBwb3J0OiByYWlzZSBWYWx1ZUVycm9yLCAibm8gZGlnaXRzIgorICAgICAgICAgICAgbnBvcnQgPSBpbnQocG9ydCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBucG9ydCA9IE5vbmUKKyAgICAgICAgcmV0dXJuIGhvc3QsIG5wb3J0CisgICAgcmV0dXJuIGhvc3QsIGRlZnBvcnQKKworX3F1ZXJ5cHJvZyA9IE5vbmUKK2RlZiBzcGxpdHF1ZXJ5KHVybCk6CisgICAgIiIic3BsaXRxdWVyeSgnL3BhdGg/cXVlcnknKSAtLT4gJy9wYXRoJywgJ3F1ZXJ5Jy4iIiIKKyAgICBnbG9iYWwgX3F1ZXJ5cHJvZworICAgIGlmIF9xdWVyeXByb2cgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIF9xdWVyeXByb2cgPSByZS5jb21waWxlKCdeKC4qKVw/KFteP10qKSQnKQorCisgICAgbWF0Y2ggPSBfcXVlcnlwcm9nLm1hdGNoKHVybCkKKyAgICBpZiBtYXRjaDogcmV0dXJuIG1hdGNoLmdyb3VwKDEsIDIpCisgICAgcmV0dXJuIHVybCwgTm9uZQorCitfdGFncHJvZyA9IE5vbmUKK2RlZiBzcGxpdHRhZyh1cmwpOgorICAgICIiInNwbGl0dGFnKCcvcGF0aCN0YWcnKSAtLT4gJy9wYXRoJywgJ3RhZycuIiIiCisgICAgZ2xvYmFsIF90YWdwcm9nCisgICAgaWYgX3RhZ3Byb2cgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIF90YWdwcm9nID0gcmUuY29tcGlsZSgnXiguKikjKFteI10qKSQnKQorCisgICAgbWF0Y2ggPSBfdGFncHJvZy5tYXRjaCh1cmwpCisgICAgaWYgbWF0Y2g6IHJldHVybiBtYXRjaC5ncm91cCgxLCAyKQorICAgIHJldHVybiB1cmwsIE5vbmUKKworZGVmIHNwbGl0YXR0cih1cmwpOgorICAgICIiInNwbGl0YXR0cignL3BhdGg7YXR0cjE9dmFsdWUxO2F0dHIyPXZhbHVlMjsuLi4nKSAtPgorICAgICAgICAnL3BhdGgnLCBbJ2F0dHIxPXZhbHVlMScsICdhdHRyMj12YWx1ZTInLCAuLi5dLiIiIgorICAgIHdvcmRzID0gdXJsLnNwbGl0KCc7JykKKyAgICByZXR1cm4gd29yZHNbMF0sIHdvcmRzWzE6XQorCitfdmFsdWVwcm9nID0gTm9uZQorZGVmIHNwbGl0dmFsdWUoYXR0cik6CisgICAgIiIic3BsaXR2YWx1ZSgnYXR0cj12YWx1ZScpIC0tPiAnYXR0cicsICd2YWx1ZScuIiIiCisgICAgZ2xvYmFsIF92YWx1ZXByb2cKKyAgICBpZiBfdmFsdWVwcm9nIGlzIE5vbmU6CisgICAgICAgIGltcG9ydCByZQorICAgICAgICBfdmFsdWVwcm9nID0gcmUuY29tcGlsZSgnXihbXj1dKik9KC4qKSQnKQorCisgICAgbWF0Y2ggPSBfdmFsdWVwcm9nLm1hdGNoKGF0dHIpCisgICAgaWYgbWF0Y2g6IHJldHVybiBtYXRjaC5ncm91cCgxLCAyKQorICAgIHJldHVybiBhdHRyLCBOb25lCisKKyMgdXJscGFyc2UgY29udGFpbnMgYSBkdXBsaWNhdGUgb2YgdGhpcyBtZXRob2QgdG8gYXZvaWQgYSBjaXJjdWxhciBpbXBvcnQuICBJZgorIyB5b3UgdXBkYXRlIHRoaXMgbWV0aG9kLCBhbHNvIHVwZGF0ZSB0aGUgY29weSBpbiB1cmxwYXJzZS4gIFRoaXMgY29kZQorIyBkdXBsaWNhdGlvbiBkb2VzIG5vdCBleGlzdCBpbiBQeXRob24zLgorCitfaGV4ZGlnID0gJzAxMjM0NTY3ODlBQkNERUZhYmNkZWYnCitfaGV4dG9jaHIgPSBkaWN0KChhICsgYiwgY2hyKGludChhICsgYiwgMTYpKSkKKyAgICAgICAgICAgICAgICAgZm9yIGEgaW4gX2hleGRpZyBmb3IgYiBpbiBfaGV4ZGlnKQorX2FzY2lpcmUgPSByZS5jb21waWxlKCcoW1x4MDAtXHg3Zl0rKScpCisKK2RlZiB1bnF1b3RlKHMpOgorICAgICIiInVucXVvdGUoJ2FiYyUyMGRlZicpIC0+ICdhYmMgZGVmJy4iIiIKKyAgICBpZiBfaXNfdW5pY29kZShzKToKKyAgICAgICAgaWYgJyUnIG5vdCBpbiBzOgorICAgICAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgYml0cyA9IF9hc2NpaXJlLnNwbGl0KHMpCisgICAgICAgIHJlcyA9IFtiaXRzWzBdXQorICAgICAgICBhcHBlbmQgPSByZXMuYXBwZW5kCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihiaXRzKSwgMik6CisgICAgICAgICAgICBhcHBlbmQodW5xdW90ZShzdHIoYml0c1tpXSkpLmRlY29kZSgnbGF0aW4xJykpCisgICAgICAgICAgICBhcHBlbmQoYml0c1tpICsgMV0pCisgICAgICAgIHJldHVybiAnJy5qb2luKHJlcykKKworICAgIGJpdHMgPSBzLnNwbGl0KCclJykKKyAgICAjIGZhc3RwYXRoCisgICAgaWYgbGVuKGJpdHMpID09IDE6CisgICAgICAgIHJldHVybiBzCisgICAgcmVzID0gW2JpdHNbMF1dCisgICAgYXBwZW5kID0gcmVzLmFwcGVuZAorICAgIGZvciBpdGVtIGluIGJpdHNbMTpdOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBhcHBlbmQoX2hleHRvY2hyW2l0ZW1bOjJdXSkKKyAgICAgICAgICAgIGFwcGVuZChpdGVtWzI6XSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgYXBwZW5kKCclJykKKyAgICAgICAgICAgIGFwcGVuZChpdGVtKQorICAgIHJldHVybiAnJy5qb2luKHJlcykKKworZGVmIHVucXVvdGVfcGx1cyhzKToKKyAgICAiIiJ1bnF1b3RlKCclN2UvYWJjK2RlZicpIC0+ICd+L2FiYyBkZWYnIiIiCisgICAgcyA9IHMucmVwbGFjZSgnKycsICcgJykKKyAgICByZXR1cm4gdW5xdW90ZShzKQorCithbHdheXNfc2FmZSA9ICgnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCisgICAgICAgICAgICAgICAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCisgICAgICAgICAgICAgICAnMDEyMzQ1Njc4OScgJ18uLScpCitfc2FmZV9tYXAgPSB7fQorZm9yIGksIGMgaW4gemlwKHhyYW5nZSgyNTYpLCBzdHIoYnl0ZWFycmF5KHhyYW5nZSgyNTYpKSkpOgorICAgIF9zYWZlX21hcFtjXSA9IGMgaWYgKGkgPCAxMjggYW5kIGMgaW4gYWx3YXlzX3NhZmUpIGVsc2UgJyV7OjAyWH0nLmZvcm1hdChpKQorX3NhZmVfcXVvdGVycyA9IHt9CisKK2RlZiBxdW90ZShzLCBzYWZlPScvJyk6CisgICAgIiIicXVvdGUoJ2FiYyBkZWYnKSAtPiAnYWJjJTIwZGVmJworCisgICAgRWFjaCBwYXJ0IG9mIGEgVVJMLCBlLmcuIHRoZSBwYXRoIGluZm8sIHRoZSBxdWVyeSwgZXRjLiwgaGFzIGEKKyAgICBkaWZmZXJlbnQgc2V0IG9mIHJlc2VydmVkIGNoYXJhY3RlcnMgdGhhdCBtdXN0IGJlIHF1b3RlZC4KKworICAgIFJGQyAyMzk2IFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMgKFVSSSk6IEdlbmVyaWMgU3ludGF4IGxpc3RzCisgICAgdGhlIGZvbGxvd2luZyByZXNlcnZlZCBjaGFyYWN0ZXJzLgorCisgICAgcmVzZXJ2ZWQgICAgPSAiOyIgfCAiLyIgfCAiPyIgfCAiOiIgfCAiQCIgfCAiJiIgfCAiPSIgfCAiKyIgfAorICAgICAgICAgICAgICAgICAgIiQiIHwgIiwiCisKKyAgICBFYWNoIG9mIHRoZXNlIGNoYXJhY3RlcnMgaXMgcmVzZXJ2ZWQgaW4gc29tZSBjb21wb25lbnQgb2YgYSBVUkwsCisgICAgYnV0IG5vdCBuZWNlc3NhcmlseSBpbiBhbGwgb2YgdGhlbS4KKworICAgIEJ5IGRlZmF1bHQsIHRoZSBxdW90ZSBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgcXVvdGluZyB0aGUgcGF0aAorICAgIHNlY3Rpb24gb2YgYSBVUkwuICBUaHVzLCBpdCB3aWxsIG5vdCBlbmNvZGUgJy8nLiAgVGhpcyBjaGFyYWN0ZXIKKyAgICBpcyByZXNlcnZlZCwgYnV0IGluIHR5cGljYWwgdXNhZ2UgdGhlIHF1b3RlIGZ1bmN0aW9uIGlzIGJlaW5nCisgICAgY2FsbGVkIG9uIGEgcGF0aCB3aGVyZSB0aGUgZXhpc3Rpbmcgc2xhc2ggY2hhcmFjdGVycyBhcmUgdXNlZCBhcworICAgIHJlc2VydmVkIGNoYXJhY3RlcnMuCisgICAgIiIiCisgICAgIyBmYXN0cGF0aAorICAgIGlmIG5vdCBzOgorICAgICAgICBpZiBzIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ05vbmUgb2JqZWN0IGNhbm5vdCBiZSBxdW90ZWQnKQorICAgICAgICByZXR1cm4gcworICAgIGNhY2hla2V5ID0gKHNhZmUsIGFsd2F5c19zYWZlKQorICAgIHRyeToKKyAgICAgICAgKHF1b3Rlciwgc2FmZSkgPSBfc2FmZV9xdW90ZXJzW2NhY2hla2V5XQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgc2FmZV9tYXAgPSBfc2FmZV9tYXAuY29weSgpCisgICAgICAgIHNhZmVfbWFwLnVwZGF0ZShbKGMsIGMpIGZvciBjIGluIHNhZmVdKQorICAgICAgICBxdW90ZXIgPSBzYWZlX21hcC5fX2dldGl0ZW1fXworICAgICAgICBzYWZlID0gYWx3YXlzX3NhZmUgKyBzYWZlCisgICAgICAgIF9zYWZlX3F1b3RlcnNbY2FjaGVrZXldID0gKHF1b3Rlciwgc2FmZSkKKyAgICBpZiBub3Qgcy5yc3RyaXAoc2FmZSk6CisgICAgICAgIHJldHVybiBzCisgICAgcmV0dXJuICcnLmpvaW4obWFwKHF1b3RlciwgcykpCisKK2RlZiBxdW90ZV9wbHVzKHMsIHNhZmU9JycpOgorICAgICIiIlF1b3RlIHRoZSBxdWVyeSBmcmFnbWVudCBvZiBhIFVSTDsgcmVwbGFjaW5nICcgJyB3aXRoICcrJyIiIgorICAgIGlmICcgJyBpbiBzOgorICAgICAgICBzID0gcXVvdGUocywgc2FmZSArICcgJykKKyAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgnICcsICcrJykKKyAgICByZXR1cm4gcXVvdGUocywgc2FmZSkKKworZGVmIHVybGVuY29kZShxdWVyeSwgZG9zZXE9MCk6CisgICAgIiIiRW5jb2RlIGEgc2VxdWVuY2Ugb2YgdHdvLWVsZW1lbnQgdHVwbGVzIG9yIGRpY3Rpb25hcnkgaW50byBhIFVSTCBxdWVyeSBzdHJpbmcuCisKKyAgICBJZiBhbnkgdmFsdWVzIGluIHRoZSBxdWVyeSBhcmcgYXJlIHNlcXVlbmNlcyBhbmQgZG9zZXEgaXMgdHJ1ZSwgZWFjaAorICAgIHNlcXVlbmNlIGVsZW1lbnQgaXMgY29udmVydGVkIHRvIGEgc2VwYXJhdGUgcGFyYW1ldGVyLgorCisgICAgSWYgdGhlIHF1ZXJ5IGFyZyBpcyBhIHNlcXVlbmNlIG9mIHR3by1lbGVtZW50IHR1cGxlcywgdGhlIG9yZGVyIG9mIHRoZQorICAgIHBhcmFtZXRlcnMgaW4gdGhlIG91dHB1dCB3aWxsIG1hdGNoIHRoZSBvcmRlciBvZiBwYXJhbWV0ZXJzIGluIHRoZQorICAgIGlucHV0LgorICAgICIiIgorCisgICAgaWYgaGFzYXR0cihxdWVyeSwiaXRlbXMiKToKKyAgICAgICAgIyBtYXBwaW5nIG9iamVjdHMKKyAgICAgICAgcXVlcnkgPSBxdWVyeS5pdGVtcygpCisgICAgZWxzZToKKyAgICAgICAgIyBpdCdzIGEgYm90aGVyIGF0IHRpbWVzIHRoYXQgc3RyaW5ncyBhbmQgc3RyaW5nLWxpa2Ugb2JqZWN0cyBhcmUKKyAgICAgICAgIyBzZXF1ZW5jZXMuLi4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBub24tc2VxdWVuY2UgaXRlbXMgc2hvdWxkIG5vdCB3b3JrIHdpdGggbGVuKCkKKyAgICAgICAgICAgICMgbm9uLWVtcHR5IHN0cmluZ3Mgd2lsbCBmYWlsIHRoaXMKKyAgICAgICAgICAgIGlmIGxlbihxdWVyeSkgYW5kIG5vdCBpc2luc3RhbmNlKHF1ZXJ5WzBdLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCisgICAgICAgICAgICAjIHplcm8tbGVuZ3RoIHNlcXVlbmNlcyBvZiBhbGwgdHlwZXMgd2lsbCBnZXQgaGVyZSBhbmQgc3VjY2VlZCwKKyAgICAgICAgICAgICMgYnV0IHRoYXQncyBhIG1pbm9yIG5pdCAtIHNpbmNlIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgIyBhbGxvd2VkIGVtcHR5IGRpY3RzIHRoYXQgdHlwZSBvZiBiZWhhdmlvciBwcm9iYWJseSBzaG91bGQgYmUKKyAgICAgICAgICAgICMgcHJlc2VydmVkIGZvciBjb25zaXN0ZW5jeQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgdHksdmEsdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAibm90IGEgdmFsaWQgbm9uLXN0cmluZyBzZXF1ZW5jZSBvciBtYXBwaW5nIG9iamVjdCIsIHRiCisKKyAgICBsID0gW10KKyAgICBpZiBub3QgZG9zZXE6CisgICAgICAgICMgcHJlc2VydmUgb2xkIGJlaGF2aW9yCisgICAgICAgIGZvciBrLCB2IGluIHF1ZXJ5OgorICAgICAgICAgICAgayA9IHF1b3RlX3BsdXMoc3RyKGspKQorICAgICAgICAgICAgdiA9IHF1b3RlX3BsdXMoc3RyKHYpKQorICAgICAgICAgICAgbC5hcHBlbmQoayArICc9JyArIHYpCisgICAgZWxzZToKKyAgICAgICAgZm9yIGssIHYgaW4gcXVlcnk6CisgICAgICAgICAgICBrID0gcXVvdGVfcGx1cyhzdHIoaykpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsIHN0cik6CisgICAgICAgICAgICAgICAgdiA9IHF1b3RlX3BsdXModikKKyAgICAgICAgICAgICAgICBsLmFwcGVuZChrICsgJz0nICsgdikKKyAgICAgICAgICAgIGVsaWYgX2lzX3VuaWNvZGUodik6CisgICAgICAgICAgICAgICAgIyBpcyB0aGVyZSBhIHJlYXNvbmFibGUgd2F5IHRvIGNvbnZlcnQgdG8gQVNDSUk/CisgICAgICAgICAgICAgICAgIyBlbmNvZGUgZ2VuZXJhdGVzIGEgc3RyaW5nLCBidXQgInJlcGxhY2UiIG9yICJpZ25vcmUiCisgICAgICAgICAgICAgICAgIyBsb3NlIGluZm9ybWF0aW9uIGFuZCAic3RyaWN0IiBjYW4gcmFpc2UgVW5pY29kZUVycm9yCisgICAgICAgICAgICAgICAgdiA9IHF1b3RlX3BsdXModi5lbmNvZGUoIkFTQ0lJIiwicmVwbGFjZSIpKQorICAgICAgICAgICAgICAgIGwuYXBwZW5kKGsgKyAnPScgKyB2KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgaXMgdGhpcyBhIHN1ZmZpY2llbnQgdGVzdCBmb3Igc2VxdWVuY2UtbmVzcz8KKyAgICAgICAgICAgICAgICAgICAgbGVuKHYpCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyBub3QgYSBzZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICB2ID0gcXVvdGVfcGx1cyhzdHIodikpCisgICAgICAgICAgICAgICAgICAgIGwuYXBwZW5kKGsgKyAnPScgKyB2KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgbG9vcCBvdmVyIHRoZSBzZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICBmb3IgZWx0IGluIHY6CisgICAgICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZChrICsgJz0nICsgcXVvdGVfcGx1cyhzdHIoZWx0KSkpCisgICAgcmV0dXJuICcmJy5qb2luKGwpCisKKyMgUHJveHkgaGFuZGxpbmcKK2RlZiBnZXRwcm94aWVzX2Vudmlyb25tZW50KCk6CisgICAgIiIiUmV0dXJuIGEgZGljdGlvbmFyeSBvZiBzY2hlbWUgLT4gcHJveHkgc2VydmVyIFVSTCBtYXBwaW5ncy4KKworICAgIFNjYW4gdGhlIGVudmlyb25tZW50IGZvciB2YXJpYWJsZXMgbmFtZWQgPHNjaGVtZT5fcHJveHk7CisgICAgdGhpcyBzZWVtcyB0byBiZSB0aGUgc3RhbmRhcmQgY29udmVudGlvbi4gIElmIHlvdSBuZWVkIGEKKyAgICBkaWZmZXJlbnQgd2F5LCB5b3UgY2FuIHBhc3MgYSBwcm94aWVzIGRpY3Rpb25hcnkgdG8gdGhlCisgICAgW0ZhbmN5XVVSTG9wZW5lciBjb25zdHJ1Y3Rvci4KKworICAgICIiIgorICAgIHByb3hpZXMgPSB7fQorICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBvcy5lbnZpcm9uLml0ZW1zKCk6CisgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgaWYgdmFsdWUgYW5kIG5hbWVbLTY6XSA9PSAnX3Byb3h5JzoKKyAgICAgICAgICAgIHByb3hpZXNbbmFtZVs6LTZdXSA9IHZhbHVlCisgICAgcmV0dXJuIHByb3hpZXMKKworZGVmIHByb3h5X2J5cGFzc19lbnZpcm9ubWVudChob3N0KToKKyAgICAiIiJUZXN0IGlmIHByb3hpZXMgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBhIHBhcnRpY3VsYXIgaG9zdC4KKworICAgIENoZWNrcyB0aGUgZW52aXJvbm1lbnQgZm9yIGEgdmFyaWFibGUgbmFtZWQgbm9fcHJveHksIHdoaWNoIHNob3VsZAorICAgIGJlIGEgbGlzdCBvZiBETlMgc3VmZml4ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcywgb3IgJyonIGZvciBhbGwgaG9zdHMuCisgICAgIiIiCisgICAgbm9fcHJveHkgPSBvcy5lbnZpcm9uLmdldCgnbm9fcHJveHknLCAnJykgb3Igb3MuZW52aXJvbi5nZXQoJ05PX1BST1hZJywgJycpCisgICAgIyAnKicgaXMgc3BlY2lhbCBjYXNlIGZvciBhbHdheXMgYnlwYXNzCisgICAgaWYgbm9fcHJveHkgPT0gJyonOgorICAgICAgICByZXR1cm4gMQorICAgICMgc3RyaXAgcG9ydCBvZmYgaG9zdAorICAgIGhvc3Rvbmx5LCBwb3J0ID0gc3BsaXRwb3J0KGhvc3QpCisgICAgIyBjaGVjayBpZiB0aGUgaG9zdCBlbmRzIHdpdGggYW55IG9mIHRoZSBETlMgc3VmZml4ZXMKKyAgICBub19wcm94eV9saXN0ID0gW3Byb3h5LnN0cmlwKCkgZm9yIHByb3h5IGluIG5vX3Byb3h5LnNwbGl0KCcsJyldCisgICAgZm9yIG5hbWUgaW4gbm9fcHJveHlfbGlzdDoKKyAgICAgICAgaWYgbmFtZSBhbmQgKGhvc3Rvbmx5LmVuZHN3aXRoKG5hbWUpIG9yIGhvc3QuZW5kc3dpdGgobmFtZSkpOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAjIG90aGVyd2lzZSwgZG9uJ3QgYnlwYXNzCisgICAgcmV0dXJuIDAKKworCitpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgZnJvbSBfc2Nwcm94eSBpbXBvcnQgX2dldF9wcm94eV9zZXR0aW5ncywgX2dldF9wcm94aWVzCisKKyAgICBkZWYgcHJveHlfYnlwYXNzX21hY29zeF9zeXNjb25mKGhvc3QpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIFRydWUgaWZmIHRoaXMgaG9zdCBzaG91bGRuJ3QgYmUgYWNjZXNzZWQgdXNpbmcgYSBwcm94eQorCisgICAgICAgIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgTWFjT1NYIGZyYW1ld29yayBTeXN0ZW1Db25maWd1cmF0aW9uCisgICAgICAgIHRvIGZldGNoIHRoZSBwcm94eSBpbmZvcm1hdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCByZQorICAgICAgICBpbXBvcnQgc29ja2V0CisgICAgICAgIGZyb20gZm5tYXRjaCBpbXBvcnQgZm5tYXRjaAorCisgICAgICAgIGhvc3Rvbmx5LCBwb3J0ID0gc3BsaXRwb3J0KGhvc3QpCisKKyAgICAgICAgZGVmIGlwMm51bShpcEFkZHIpOgorICAgICAgICAgICAgcGFydHMgPSBpcEFkZHIuc3BsaXQoJy4nKQorICAgICAgICAgICAgcGFydHMgPSBtYXAoaW50LCBwYXJ0cykKKyAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgIT0gNDoKKyAgICAgICAgICAgICAgICBwYXJ0cyA9IChwYXJ0cyArIFswLCAwLCAwLCAwXSlbOjRdCisgICAgICAgICAgICByZXR1cm4gKHBhcnRzWzBdIDw8IDI0KSB8IChwYXJ0c1sxXSA8PCAxNikgfCAocGFydHNbMl0gPDwgOCkgfCBwYXJ0c1szXQorCisgICAgICAgIHByb3h5X3NldHRpbmdzID0gX2dldF9wcm94eV9zZXR0aW5ncygpCisKKyAgICAgICAgIyBDaGVjayBmb3Igc2ltcGxlIGhvc3QgbmFtZXM6CisgICAgICAgIGlmICcuJyBub3QgaW4gaG9zdDoKKyAgICAgICAgICAgIGlmIHByb3h5X3NldHRpbmdzWydleGNsdWRlX3NpbXBsZSddOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgaG9zdElQID0gTm9uZQorCisgICAgICAgIGZvciB2YWx1ZSBpbiBwcm94eV9zZXR0aW5ncy5nZXQoJ2V4Y2VwdGlvbnMnLCAoKSk6CisgICAgICAgICAgICAjIEl0ZW1zIGluIHRoZSBsaXN0IGFyZSBzdHJpbmdzIGxpa2UgdGhlc2U6ICoubG9jYWwsIDE2OS4yNTQvMTYKKyAgICAgICAgICAgIGlmIG5vdCB2YWx1ZTogY29udGludWUKKworICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHIiKFxkKyg/OlwuXGQrKSopKC9cZCspPyIsIHZhbHVlKQorICAgICAgICAgICAgaWYgbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBob3N0SVAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaG9zdElQID0gc29ja2V0LmdldGhvc3RieW5hbWUoaG9zdG9ubHkpCisgICAgICAgICAgICAgICAgICAgICAgICBob3N0SVAgPSBpcDJudW0oaG9zdElQKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGJhc2UgPSBpcDJudW0obS5ncm91cCgxKSkKKyAgICAgICAgICAgICAgICBtYXNrID0gbS5ncm91cCgyKQorICAgICAgICAgICAgICAgIGlmIG1hc2sgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbWFzayA9IDggKiAobS5ncm91cCgxKS5jb3VudCgnLicpICsgMSkKKworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPSBpbnQobWFza1sxOl0pCisgICAgICAgICAgICAgICAgbWFzayA9IDMyIC0gbWFzaworCisgICAgICAgICAgICAgICAgaWYgKGhvc3RJUCA+PiBtYXNrKSA9PSAoYmFzZSA+PiBtYXNrKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAgICAgZWxpZiBmbm1hdGNoKGhvc3QsIHZhbHVlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGdldHByb3hpZXNfbWFjb3N4X3N5c2NvbmYoKToKKyAgICAgICAgIiIiUmV0dXJuIGEgZGljdGlvbmFyeSBvZiBzY2hlbWUgLT4gcHJveHkgc2VydmVyIFVSTCBtYXBwaW5ncy4KKworICAgICAgICBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIE1hY09TWCBmcmFtZXdvcmsgU3lzdGVtQ29uZmlndXJhdGlvbgorICAgICAgICB0byBmZXRjaCB0aGUgcHJveHkgaW5mb3JtYXRpb24uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gX2dldF9wcm94aWVzKCkKKworICAgIGRlZiBwcm94eV9ieXBhc3MoaG9zdCk6CisgICAgICAgIGlmIGdldHByb3hpZXNfZW52aXJvbm1lbnQoKToKKyAgICAgICAgICAgIHJldHVybiBwcm94eV9ieXBhc3NfZW52aXJvbm1lbnQoaG9zdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBwcm94eV9ieXBhc3NfbWFjb3N4X3N5c2NvbmYoaG9zdCkKKworICAgIGRlZiBnZXRwcm94aWVzKCk6CisgICAgICAgIHJldHVybiBnZXRwcm94aWVzX2Vudmlyb25tZW50KCkgb3IgZ2V0cHJveGllc19tYWNvc3hfc3lzY29uZigpCisKK2VsaWYgb3MubmFtZSA9PSAnbnQnOgorICAgIGRlZiBnZXRwcm94aWVzX3JlZ2lzdHJ5KCk6CisgICAgICAgICIiIlJldHVybiBhIGRpY3Rpb25hcnkgb2Ygc2NoZW1lIC0+IHByb3h5IHNlcnZlciBVUkwgbWFwcGluZ3MuCisKKyAgICAgICAgV2luMzIgdXNlcyB0aGUgcmVnaXN0cnkgdG8gc3RvcmUgcHJveGllcy4KKworICAgICAgICAiIiIKKyAgICAgICAgcHJveGllcyA9IHt9CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBfd2lucmVnCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICMgU3RkIG1vZHVsZSwgc28gc2hvdWxkIGJlIGFyb3VuZCAtIGJ1dCB5b3UgbmV2ZXIga25vdyEKKyAgICAgICAgICAgIHJldHVybiBwcm94aWVzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGludGVybmV0U2V0dGluZ3MgPSBfd2lucmVnLk9wZW5LZXkoX3dpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKKyAgICAgICAgICAgICAgICByJ1NvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEludGVybmV0IFNldHRpbmdzJykKKyAgICAgICAgICAgIHByb3h5RW5hYmxlID0gX3dpbnJlZy5RdWVyeVZhbHVlRXgoaW50ZXJuZXRTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Byb3h5RW5hYmxlJylbMF0KKyAgICAgICAgICAgIGlmIHByb3h5RW5hYmxlOgorICAgICAgICAgICAgICAgICMgUmV0dXJuZWQgYXMgVW5pY29kZSBidXQgcHJvYmxlbXMgaWYgbm90IGNvbnZlcnRlZCB0byBBU0NJSQorICAgICAgICAgICAgICAgIHByb3h5U2VydmVyID0gc3RyKF93aW5yZWcuUXVlcnlWYWx1ZUV4KGludGVybmV0U2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Byb3h5U2VydmVyJylbMF0pCisgICAgICAgICAgICAgICAgaWYgJz0nIGluIHByb3h5U2VydmVyOgorICAgICAgICAgICAgICAgICAgICAjIFBlci1wcm90b2NvbCBzZXR0aW5ncworICAgICAgICAgICAgICAgICAgICBmb3IgcCBpbiBwcm94eVNlcnZlci5zcGxpdCgnOycpOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2wsIGFkZHJlc3MgPSBwLnNwbGl0KCc9JywgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgU2VlIGlmIGFkZHJlc3MgaGFzIGEgdHlwZTovLyBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCByZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlLm1hdGNoKCdeKFteLzpdKyk6Ly8nLCBhZGRyZXNzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gJyVzOi8vJXMnICUgKHByb3RvY29sLCBhZGRyZXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJveGllc1twcm90b2NvbF0gPSBhZGRyZXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBVc2Ugb25lIHNldHRpbmcgZm9yIGFsbCBwcm90b2NvbHMKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJveHlTZXJ2ZXJbOjVdID09ICdodHRwOic6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm94aWVzWydodHRwJ10gPSBwcm94eVNlcnZlcgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJveGllc1snaHR0cCddID0gJ2h0dHA6Ly8lcycgJSBwcm94eVNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgICAgcHJveGllc1snaHR0cHMnXSA9ICdodHRwczovLyVzJyAlIHByb3h5U2VydmVyCisgICAgICAgICAgICAgICAgICAgICAgICBwcm94aWVzWydmdHAnXSA9ICdmdHA6Ly8lcycgJSBwcm94eVNlcnZlcgorICAgICAgICAgICAgaW50ZXJuZXRTZXR0aW5ncy5DbG9zZSgpCisgICAgICAgIGV4Y2VwdCAoV2luZG93c0Vycm9yLCBWYWx1ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAgICAgIyBFaXRoZXIgcmVnaXN0cnkga2V5IG5vdCBmb3VuZCBldGMsIG9yIHRoZSB2YWx1ZSBpbiBhbgorICAgICAgICAgICAgIyB1bmV4cGVjdGVkIGZvcm1hdC4KKyAgICAgICAgICAgICMgcHJveGllcyBhbHJlYWR5IHNldCB1cCB0byBiZSBlbXB0eSBzbyBub3RoaW5nIHRvIGRvCisgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBwcm94aWVzCisKKyAgICBkZWYgZ2V0cHJveGllcygpOgorICAgICAgICAiIiJSZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIHNjaGVtZSAtPiBwcm94eSBzZXJ2ZXIgVVJMIG1hcHBpbmdzLgorCisgICAgICAgIFJldHVybnMgc2V0dGluZ3MgZ2F0aGVyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQsIGlmIHNwZWNpZmllZCwKKyAgICAgICAgb3IgdGhlIHJlZ2lzdHJ5LgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gZ2V0cHJveGllc19lbnZpcm9ubWVudCgpIG9yIGdldHByb3hpZXNfcmVnaXN0cnkoKQorCisgICAgZGVmIHByb3h5X2J5cGFzc19yZWdpc3RyeShob3N0KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IF93aW5yZWcKKyAgICAgICAgICAgIGltcG9ydCByZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAjIFN0ZCBtb2R1bGVzLCBzbyBzaG91bGQgYmUgYXJvdW5kIC0gYnV0IHlvdSBuZXZlciBrbm93IQorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW50ZXJuZXRTZXR0aW5ncyA9IF93aW5yZWcuT3BlbktleShfd2lucmVnLkhLRVlfQ1VSUkVOVF9VU0VSLAorICAgICAgICAgICAgICAgIHInU29mdHdhcmVcTWljcm9zb2Z0XFdpbmRvd3NcQ3VycmVudFZlcnNpb25cSW50ZXJuZXQgU2V0dGluZ3MnKQorICAgICAgICAgICAgcHJveHlFbmFibGUgPSBfd2lucmVnLlF1ZXJ5VmFsdWVFeChpbnRlcm5ldFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHJveHlFbmFibGUnKVswXQorICAgICAgICAgICAgcHJveHlPdmVycmlkZSA9IHN0cihfd2lucmVnLlF1ZXJ5VmFsdWVFeChpbnRlcm5ldFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHJveHlPdmVycmlkZScpWzBdKQorICAgICAgICAgICAgIyBeXl5eIFJldHVybmVkIGFzIFVuaWNvZGUgYnV0IHByb2JsZW1zIGlmIG5vdCBjb252ZXJ0ZWQgdG8gQVNDSUkKKyAgICAgICAgZXhjZXB0IFdpbmRvd3NFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGlmIG5vdCBwcm94eUVuYWJsZSBvciBub3QgcHJveHlPdmVycmlkZToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICMgdHJ5IHRvIG1ha2UgYSBob3N0IGxpc3QgZnJvbSBuYW1lIGFuZCBJUCBhZGRyZXNzLgorICAgICAgICByYXdIb3N0LCBwb3J0ID0gc3BsaXRwb3J0KGhvc3QpCisgICAgICAgIGhvc3QgPSBbcmF3SG9zdF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYWRkciA9IHNvY2tldC5nZXRob3N0YnluYW1lKHJhd0hvc3QpCisgICAgICAgICAgICBpZiBhZGRyICE9IHJhd0hvc3Q6CisgICAgICAgICAgICAgICAgaG9zdC5hcHBlbmQoYWRkcikKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnFkbiA9IHNvY2tldC5nZXRmcWRuKHJhd0hvc3QpCisgICAgICAgICAgICBpZiBmcWRuICE9IHJhd0hvc3Q6CisgICAgICAgICAgICAgICAgaG9zdC5hcHBlbmQoZnFkbikKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBtYWtlIGEgY2hlY2sgdmFsdWUgbGlzdCBmcm9tIHRoZSByZWdpc3RyeSBlbnRyeTogcmVwbGFjZSB0aGUKKyAgICAgICAgIyAnPGxvY2FsPicgc3RyaW5nIGJ5IHRoZSBsb2NhbGhvc3QgZW50cnkgYW5kIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgICMgY2Fub25pY2FsIGVudHJ5LgorICAgICAgICBwcm94eU92ZXJyaWRlID0gcHJveHlPdmVycmlkZS5zcGxpdCgnOycpCisgICAgICAgICMgbm93IGNoZWNrIGlmIHdlIG1hdGNoIG9uZSBvZiB0aGUgcmVnaXN0cnkgdmFsdWVzLgorICAgICAgICBmb3IgdGVzdCBpbiBwcm94eU92ZXJyaWRlOgorICAgICAgICAgICAgaWYgdGVzdCA9PSAnPGxvY2FsPic6CisgICAgICAgICAgICAgICAgaWYgJy4nIG5vdCBpbiByYXdIb3N0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgdGVzdCA9IHRlc3QucmVwbGFjZSgiLiIsIHIiXC4iKSAgICAgIyBtYXNrIGRvdHMKKyAgICAgICAgICAgIHRlc3QgPSB0ZXN0LnJlcGxhY2UoIioiLCByIi4qIikgICAgICMgY2hhbmdlIGdsb2Igc2VxdWVuY2UKKyAgICAgICAgICAgIHRlc3QgPSB0ZXN0LnJlcGxhY2UoIj8iLCByIi4iKSAgICAgICMgY2hhbmdlIGdsb2IgY2hhcgorICAgICAgICAgICAgZm9yIHZhbCBpbiBob3N0OgorICAgICAgICAgICAgICAgICMgcHJpbnQgIiVzIDwtLT4gJXMiICUoIHRlc3QsIHZhbCApCisgICAgICAgICAgICAgICAgaWYgcmUubWF0Y2godGVzdCwgdmFsLCByZS5JKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBwcm94eV9ieXBhc3MoaG9zdCk6CisgICAgICAgICIiIlJldHVybiBhIGRpY3Rpb25hcnkgb2Ygc2NoZW1lIC0+IHByb3h5IHNlcnZlciBVUkwgbWFwcGluZ3MuCisKKyAgICAgICAgUmV0dXJucyBzZXR0aW5ncyBnYXRoZXJlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgaWYgc3BlY2lmaWVkLAorICAgICAgICBvciB0aGUgcmVnaXN0cnkuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGdldHByb3hpZXNfZW52aXJvbm1lbnQoKToKKyAgICAgICAgICAgIHJldHVybiBwcm94eV9ieXBhc3NfZW52aXJvbm1lbnQoaG9zdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBwcm94eV9ieXBhc3NfcmVnaXN0cnkoaG9zdCkKKworZWxzZToKKyAgICAjIEJ5IGRlZmF1bHQgdXNlIGVudmlyb25tZW50IHZhcmlhYmxlcworICAgIGdldHByb3hpZXMgPSBnZXRwcm94aWVzX2Vudmlyb25tZW50CisgICAgcHJveHlfYnlwYXNzID0gcHJveHlfYnlwYXNzX2Vudmlyb25tZW50CisKKyMgVGVzdCBhbmQgdGltZSBxdW90ZSgpIGFuZCB1bnF1b3RlKCkKK2RlZiB0ZXN0MSgpOgorICAgIHMgPSAnJworICAgIGZvciBpIGluIHJhbmdlKDI1Nik6IHMgPSBzICsgY2hyKGkpCisgICAgcyA9IHMqNAorICAgIHQwID0gdGltZS50aW1lKCkKKyAgICBxcyA9IHF1b3RlKHMpCisgICAgdXFzID0gdW5xdW90ZShxcykKKyAgICB0MSA9IHRpbWUudGltZSgpCisgICAgaWYgdXFzICE9IHM6CisgICAgICAgIHByaW50ICdXcm9uZyEnCisgICAgcHJpbnQgcmVwcihzKQorICAgIHByaW50IHJlcHIocXMpCisgICAgcHJpbnQgcmVwcih1cXMpCisgICAgcHJpbnQgcm91bmQodDEgLSB0MCwgMyksICdzZWMnCisKKworZGVmIHJlcG9ydGhvb2soYmxvY2tudW0sIGJsb2Nrc2l6ZSwgdG90YWxzaXplKToKKyAgICAjIFJlcG9ydCBkdXJpbmcgcmVtb3RlIHRyYW5zZmVycworICAgIHByaW50ICJCbG9jayBudW1iZXI6ICVkLCBCbG9jayBzaXplOiAlZCwgVG90YWwgc2l6ZTogJWQiICUgKAorICAgICAgICBibG9ja251bSwgYmxvY2tzaXplLCB0b3RhbHNpemUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VybGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3VybGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlYjk1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXJsbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VybGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3VybGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjYjc2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXJsbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VybGxpYjIucHkgYi9saWIvcHl0aG9uMi43L3VybGxpYjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFkZWI3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXJsbGliMi5weQpAQCAtMCwwICsxLDE0NzAgQEAKKyIiIkFuIGV4dGVuc2libGUgbGlicmFyeSBmb3Igb3BlbmluZyBVUkxzIHVzaW5nIGEgdmFyaWV0eSBvZiBwcm90b2NvbHMKKworVGhlIHNpbXBsZXN0IHdheSB0byB1c2UgdGhpcyBtb2R1bGUgaXMgdG8gY2FsbCB0aGUgdXJsb3BlbiBmdW5jdGlvbiwKK3doaWNoIGFjY2VwdHMgYSBzdHJpbmcgY29udGFpbmluZyBhIFVSTCBvciBhIFJlcXVlc3Qgb2JqZWN0IChkZXNjcmliZWQKK2JlbG93KS4gIEl0IG9wZW5zIHRoZSBVUkwgYW5kIHJldHVybnMgdGhlIHJlc3VsdHMgYXMgZmlsZS1saWtlCitvYmplY3Q7IHRoZSByZXR1cm5lZCBvYmplY3QgaGFzIHNvbWUgZXh0cmEgbWV0aG9kcyBkZXNjcmliZWQgYmVsb3cuCisKK1RoZSBPcGVuZXJEaXJlY3RvciBtYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiBIYW5kbGVyIG9iamVjdHMgdGhhdCBkbworYWxsIHRoZSBhY3R1YWwgd29yay4gIEVhY2ggSGFuZGxlciBpbXBsZW1lbnRzIGEgcGFydGljdWxhciBwcm90b2NvbCBvcgorb3B0aW9uLiAgVGhlIE9wZW5lckRpcmVjdG9yIGlzIGEgY29tcG9zaXRlIG9iamVjdCB0aGF0IGludm9rZXMgdGhlCitIYW5kbGVycyBuZWVkZWQgdG8gb3BlbiB0aGUgcmVxdWVzdGVkIFVSTC4gIEZvciBleGFtcGxlLCB0aGUKK0hUVFBIYW5kbGVyIHBlcmZvcm1zIEhUVFAgR0VUIGFuZCBQT1NUIHJlcXVlc3RzIGFuZCBkZWFscyB3aXRoCitub24tZXJyb3IgcmV0dXJucy4gIFRoZSBIVFRQUmVkaXJlY3RIYW5kbGVyIGF1dG9tYXRpY2FsbHkgZGVhbHMgd2l0aAorSFRUUCAzMDEsIDMwMiwgMzAzIGFuZCAzMDcgcmVkaXJlY3QgZXJyb3JzLCBhbmQgdGhlIEhUVFBEaWdlc3RBdXRoSGFuZGxlcgorZGVhbHMgd2l0aCBkaWdlc3QgYXV0aGVudGljYXRpb24uCisKK3VybG9wZW4odXJsLCBkYXRhPU5vbmUpIC0tIEJhc2ljIHVzYWdlIGlzIHRoZSBzYW1lIGFzIG9yaWdpbmFsCit1cmxsaWIuICBwYXNzIHRoZSB1cmwgYW5kIG9wdGlvbmFsbHkgZGF0YSB0byBwb3N0IHRvIGFuIEhUVFAgVVJMLCBhbmQKK2dldCBhIGZpbGUtbGlrZSBvYmplY3QgYmFjay4gIE9uZSBkaWZmZXJlbmNlIGlzIHRoYXQgeW91IGNhbiBhbHNvIHBhc3MKK2EgUmVxdWVzdCBpbnN0YW5jZSBpbnN0ZWFkIG9mIFVSTC4gIFJhaXNlcyBhIFVSTEVycm9yIChzdWJjbGFzcyBvZgorSU9FcnJvcik7IGZvciBIVFRQIGVycm9ycywgcmFpc2VzIGFuIEhUVFBFcnJvciwgd2hpY2ggY2FuIGFsc28gYmUKK3RyZWF0ZWQgYXMgYSB2YWxpZCByZXNwb25zZS4KKworYnVpbGRfb3BlbmVyIC0tIEZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIG5ldyBPcGVuZXJEaXJlY3RvciBpbnN0YW5jZS4KK1dpbGwgaW5zdGFsbCB0aGUgZGVmYXVsdCBoYW5kbGVycy4gIEFjY2VwdHMgb25lIG9yIG1vcmUgSGFuZGxlcnMgYXMKK2FyZ3VtZW50cywgZWl0aGVyIGluc3RhbmNlcyBvciBIYW5kbGVyIGNsYXNzZXMgdGhhdCBpdCB3aWxsCitpbnN0YW50aWF0ZS4gIElmIG9uZSBvZiB0aGUgYXJndW1lbnQgaXMgYSBzdWJjbGFzcyBvZiB0aGUgZGVmYXVsdAoraGFuZGxlciwgdGhlIGFyZ3VtZW50IHdpbGwgYmUgaW5zdGFsbGVkIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQuCisKK2luc3RhbGxfb3BlbmVyIC0tIEluc3RhbGxzIGEgbmV3IG9wZW5lciBhcyB0aGUgZGVmYXVsdCBvcGVuZXIuCisKK29iamVjdHMgb2YgaW50ZXJlc3Q6CisKK09wZW5lckRpcmVjdG9yIC0tIFNldHMgdXAgdGhlIFVzZXIgQWdlbnQgYXMgdGhlIFB5dGhvbi11cmxsaWIgY2xpZW50IGFuZCBtYW5hZ2VzCit0aGUgSGFuZGxlciBjbGFzc2VzLCB3aGlsZSBkZWFsaW5nIHdpdGggcmVxdWVzdHMgYW5kIHJlc3BvbnNlcy4KKworUmVxdWVzdCAtLSBBbiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIHN0YXRlIG9mIGEgcmVxdWVzdC4gIFRoZQorc3RhdGUgY2FuIGJlIGFzIHNpbXBsZSBhcyB0aGUgVVJMLiAgSXQgY2FuIGFsc28gaW5jbHVkZSBleHRyYSBIVFRQCitoZWFkZXJzLCBlLmcuIGEgVXNlci1BZ2VudC4KKworQmFzZUhhbmRsZXIgLS0KKworZXhjZXB0aW9uczoKK1VSTEVycm9yIC0tIEEgc3ViY2xhc3Mgb2YgSU9FcnJvciwgaW5kaXZpZHVhbCBwcm90b2NvbHMgaGF2ZSB0aGVpciBvd24KK3NwZWNpZmljIHN1YmNsYXNzLgorCitIVFRQRXJyb3IgLS0gQWxzbyBhIHZhbGlkIEhUVFAgcmVzcG9uc2UsIHNvIHlvdSBjYW4gdHJlYXQgYW4gSFRUUCBlcnJvcgorYXMgYW4gZXhjZXB0aW9uYWwgZXZlbnQgb3IgdmFsaWQgcmVzcG9uc2UuCisKK2ludGVybmFsczoKK0Jhc2VIYW5kbGVyIGFuZCBwYXJlbnQKK19jYWxsX2NoYWluIGNvbnZlbnRpb25zCisKK0V4YW1wbGUgdXNhZ2U6CisKK2ltcG9ydCB1cmxsaWIyCisKKyMgc2V0IHVwIGF1dGhlbnRpY2F0aW9uIGluZm8KK2F1dGhpbmZvID0gdXJsbGliMi5IVFRQQmFzaWNBdXRoSGFuZGxlcigpCithdXRoaW5mby5hZGRfcGFzc3dvcmQocmVhbG09J1BEUSBBcHBsaWNhdGlvbicsCisgICAgICAgICAgICAgICAgICAgICAgdXJpPSdodHRwczovL21haGxlcjo4MDkyL3NpdGUtdXBkYXRlcy5weScsCisgICAgICAgICAgICAgICAgICAgICAgdXNlcj0na2xlbScsCisgICAgICAgICAgICAgICAgICAgICAgcGFzc3dkPSdnZWhlaW0kcGFyb2xlJykKKworcHJveHlfc3VwcG9ydCA9IHVybGxpYjIuUHJveHlIYW5kbGVyKHsiaHR0cCIgOiAiaHR0cDovL2FoYWQtaGFhbTozMTI4In0pCisKKyMgYnVpbGQgYSBuZXcgb3BlbmVyIHRoYXQgYWRkcyBhdXRoZW50aWNhdGlvbiBhbmQgY2FjaGluZyBGVFAgaGFuZGxlcnMKK29wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKHByb3h5X3N1cHBvcnQsIGF1dGhpbmZvLCB1cmxsaWIyLkNhY2hlRlRQSGFuZGxlcikKKworIyBpbnN0YWxsIGl0Cit1cmxsaWIyLmluc3RhbGxfb3BlbmVyKG9wZW5lcikKKworZiA9IHVybGxpYjIudXJsb3BlbignaHR0cDovL3d3dy5weXRob24ub3JnLycpCisKKworIiIiCisKKyMgWFhYIGlzc3VlczoKKyMgSWYgYW4gYXV0aGVudGljYXRpb24gZXJyb3IgaGFuZGxlciB0aGF0IHRyaWVzIHRvIHBlcmZvcm0KKyMgYXV0aGVudGljYXRpb24gZm9yIHNvbWUgcmVhc29uIGJ1dCBmYWlscywgaG93IHNob3VsZCB0aGUgZXJyb3IgYmUKKyMgc2lnbmFsbGVkPyAgVGhlIGNsaWVudCBuZWVkcyB0byBrbm93IHRoZSBIVFRQIGVycm9yIGNvZGUuICBCdXQgaWYKKyMgdGhlIGhhbmRsZXIga25vd3MgdGhhdCB0aGUgcHJvYmxlbSB3YXMsIGUuZy4sIHRoYXQgaXQgZGlkbid0IGtub3cKKyMgdGhhdCBoYXNoIGFsZ28gdGhhdCByZXF1ZXN0ZWQgaW4gdGhlIGNoYWxsZW5nZSwgaXQgd291bGQgYmUgZ29vZCB0bworIyBwYXNzIHRoYXQgaW5mb3JtYXRpb24gYWxvbmcgdG8gdGhlIGNsaWVudCwgdG9vLgorIyBmdHAgZXJyb3JzIGFyZW4ndCBoYW5kbGVkIGNsZWFubHkKKyMgY2hlY2sgZGlnZXN0IGFnYWluc3QgY29ycmVjdCAoaS5lLiBub24tYXBhY2hlKSBpbXBsZW1lbnRhdGlvbgorCisjIFBvc3NpYmxlIGV4dGVuc2lvbnM6CisjIGNvbXBsZXggcHJveGllcyAgWFhYIG5vdCBzdXJlIHdoYXQgZXhhY3RseSB3YXMgbWVhbnQgYnkgdGhpcworIyBhYnN0cmFjdCBmYWN0b3J5IGZvciBvcGVuZXIKKworaW1wb3J0IGJhc2U2NAoraW1wb3J0IGhhc2hsaWIKK2ltcG9ydCBodHRwbGliCitpbXBvcnQgbWltZXRvb2xzCitpbXBvcnQgb3MKK2ltcG9ydCBwb3NpeHBhdGgKK2ltcG9ydCByYW5kb20KK2ltcG9ydCByZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB1cmxwYXJzZQoraW1wb3J0IGJpc2VjdAoraW1wb3J0IHdhcm5pbmdzCisKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitmcm9tIHVybGxpYiBpbXBvcnQgKHVud3JhcCwgdW5xdW90ZSwgc3BsaXR0eXBlLCBzcGxpdGhvc3QsIHF1b3RlLAorICAgICBhZGRpbmZvdXJsLCBzcGxpdHBvcnQsIHNwbGl0dGFnLCB0b0J5dGVzLAorICAgICBzcGxpdGF0dHIsIGZ0cHdyYXBwZXIsIHNwbGl0dXNlciwgc3BsaXRwYXNzd2QsIHNwbGl0dmFsdWUpCisKKyMgc3VwcG9ydCBmb3IgRmlsZUhhbmRsZXIsIHByb3hpZXMgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcworZnJvbSB1cmxsaWIgaW1wb3J0IGxvY2FsaG9zdCwgdXJsMnBhdGhuYW1lLCBnZXRwcm94aWVzLCBwcm94eV9ieXBhc3MKKworIyB1c2VkIGluIFVzZXItQWdlbnQgaGVhZGVyIHNlbnQKK19fdmVyc2lvbl9fID0gc3lzLnZlcnNpb25bOjNdCisKK19vcGVuZXIgPSBOb25lCitkZWYgdXJsb3Blbih1cmwsIGRhdGE9Tm9uZSwgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQpOgorICAgIGdsb2JhbCBfb3BlbmVyCisgICAgaWYgX29wZW5lciBpcyBOb25lOgorICAgICAgICBfb3BlbmVyID0gYnVpbGRfb3BlbmVyKCkKKyAgICByZXR1cm4gX29wZW5lci5vcGVuKHVybCwgZGF0YSwgdGltZW91dCkKKworZGVmIGluc3RhbGxfb3BlbmVyKG9wZW5lcik6CisgICAgZ2xvYmFsIF9vcGVuZXIKKyAgICBfb3BlbmVyID0gb3BlbmVyCisKKyMgZG8gdGhlc2UgZXJyb3IgY2xhc3NlcyBtYWtlIHNlbnNlPworIyBtYWtlIHN1cmUgYWxsIG9mIHRoZSBJT0Vycm9yIHN0dWZmIGlzIG92ZXJyaWRkZW4uICB3ZSBqdXN0IHdhbnQgdG8gYmUKKyMgc3VidHlwZXMuCisKK2NsYXNzIFVSTEVycm9yKElPRXJyb3IpOgorICAgICMgVVJMRXJyb3IgaXMgYSBzdWItdHlwZSBvZiBJT0Vycm9yLCBidXQgaXQgZG9lc24ndCBzaGFyZSBhbnkgb2YKKyAgICAjIHRoZSBpbXBsZW1lbnRhdGlvbi4gIG5lZWQgdG8gb3ZlcnJpZGUgX19pbml0X18gYW5kIF9fc3RyX18uCisgICAgIyBJdCBzZXRzIHNlbGYuYXJncyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIEVudmlyb25tZW50RXJyb3IKKyAgICAjIHN1YmNsYXNzZXMsIGJ1dCBhcmdzIGRvZXNuJ3QgaGF2ZSB0aGUgdHlwaWNhbCBmb3JtYXQgd2l0aCBlcnJubyBpbgorICAgICMgc2xvdCAwIGFuZCBzdHJlcnJvciBpbiBzbG90IDEuICBUaGlzIG1heSBiZSBiZXR0ZXIgdGhhbiBub3RoaW5nLgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWFzb24pOgorICAgICAgICBzZWxmLmFyZ3MgPSByZWFzb24sCisgICAgICAgIHNlbGYucmVhc29uID0gcmVhc29uCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8dXJsb3BlbiBlcnJvciAlcz4nICUgc2VsZi5yZWFzb24KKworY2xhc3MgSFRUUEVycm9yKFVSTEVycm9yLCBhZGRpbmZvdXJsKToKKyAgICAiIiJSYWlzZWQgd2hlbiBIVFRQIGVycm9yIG9jY3VycywgYnV0IGFsc28gYWN0cyBsaWtlIG5vbi1lcnJvciByZXR1cm4iIiIKKyAgICBfX3N1cGVyX2luaXQgPSBhZGRpbmZvdXJsLl9faW5pdF9fCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBjb2RlLCBtc2csIGhkcnMsIGZwKToKKyAgICAgICAgc2VsZi5jb2RlID0gY29kZQorICAgICAgICBzZWxmLm1zZyA9IG1zZworICAgICAgICBzZWxmLmhkcnMgPSBoZHJzCisgICAgICAgIHNlbGYuZnAgPSBmcAorICAgICAgICBzZWxmLmZpbGVuYW1lID0gdXJsCisgICAgICAgICMgVGhlIGFkZGluZm91cmwgY2xhc3NlcyBkZXBlbmQgb24gZnAgYmVpbmcgYSB2YWxpZCBmaWxlCisgICAgICAgICMgb2JqZWN0LiAgSW4gc29tZSBjYXNlcywgdGhlIEhUVFBFcnJvciBtYXkgbm90IGhhdmUgYSB2YWxpZAorICAgICAgICAjIGZpbGUgb2JqZWN0LiAgSWYgdGhpcyBoYXBwZW5zLCB0aGUgc2ltcGxlc3Qgd29ya2Fyb3VuZCBpcyB0bworICAgICAgICAjIG5vdCBpbml0aWFsaXplIHRoZSBiYXNlIGNsYXNzZXMuCisgICAgICAgIGlmIGZwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fX3N1cGVyX2luaXQoZnAsIGhkcnMsIHVybCwgY29kZSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJ0hUVFAgRXJyb3IgJXM6ICVzJyAlIChzZWxmLmNvZGUsIHNlbGYubXNnKQorCisgICAgIyBzaW5jZSBVUkxFcnJvciBzcGVjaWZpZXMgYSAucmVhc29uIGF0dHJpYnV0ZSwgSFRUUEVycm9yIHNob3VsZCBhbHNvCisgICAgIyAgcHJvdmlkZSB0aGlzIGF0dHJpYnV0ZS4gU2VlIGlzc3VlMTMyMTEgZm8gZGlzY3Vzc2lvbi4KKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcmVhc29uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5tc2cKKworICAgIGRlZiBpbmZvKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5oZHJzCisKKyMgY29waWVkIGZyb20gY29va2llbGliLnB5CitfY3V0X3BvcnRfcmUgPSByZS5jb21waWxlKHIiOlxkKyQiKQorZGVmIHJlcXVlc3RfaG9zdChyZXF1ZXN0KToKKyAgICAiIiJSZXR1cm4gcmVxdWVzdC1ob3N0LCBhcyBkZWZpbmVkIGJ5IFJGQyAyOTY1LgorCisgICAgVmFyaWF0aW9uIGZyb20gUkZDOiByZXR1cm5lZCB2YWx1ZSBpcyBsb3dlcmNhc2VkLCBmb3IgY29udmVuaWVudAorICAgIGNvbXBhcmlzb24uCisKKyAgICAiIiIKKyAgICB1cmwgPSByZXF1ZXN0LmdldF9mdWxsX3VybCgpCisgICAgaG9zdCA9IHVybHBhcnNlLnVybHBhcnNlKHVybClbMV0KKyAgICBpZiBob3N0ID09ICIiOgorICAgICAgICBob3N0ID0gcmVxdWVzdC5nZXRfaGVhZGVyKCJIb3N0IiwgIiIpCisKKyAgICAjIHJlbW92ZSBwb3J0LCBpZiBwcmVzZW50CisgICAgaG9zdCA9IF9jdXRfcG9ydF9yZS5zdWIoIiIsIGhvc3QsIDEpCisgICAgcmV0dXJuIGhvc3QubG93ZXIoKQorCitjbGFzcyBSZXF1ZXN0OgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgZGF0YT1Ob25lLCBoZWFkZXJzPXt9LAorICAgICAgICAgICAgICAgICBvcmlnaW5fcmVxX2hvc3Q9Tm9uZSwgdW52ZXJpZmlhYmxlPUZhbHNlKToKKyAgICAgICAgIyB1bndyYXAoJzxVUkw6dHlwZTovL2hvc3QvcGF0aD4nKSAtLT4gJ3R5cGU6Ly9ob3N0L3BhdGgnCisgICAgICAgIHNlbGYuX19vcmlnaW5hbCA9IHVud3JhcCh1cmwpCisgICAgICAgIHNlbGYuX19vcmlnaW5hbCwgc2VsZi5fX2ZyYWdtZW50ID0gc3BsaXR0YWcoc2VsZi5fX29yaWdpbmFsKQorICAgICAgICBzZWxmLnR5cGUgPSBOb25lCisgICAgICAgICMgc2VsZi5fX3JfdHlwZSBpcyB3aGF0J3MgbGVmdCBhZnRlciBkb2luZyB0aGUgc3BsaXR0eXBlCisgICAgICAgIHNlbGYuaG9zdCA9IE5vbmUKKyAgICAgICAgc2VsZi5wb3J0ID0gTm9uZQorICAgICAgICBzZWxmLl90dW5uZWxfaG9zdCA9IE5vbmUKKyAgICAgICAgc2VsZi5kYXRhID0gZGF0YQorICAgICAgICBzZWxmLmhlYWRlcnMgPSB7fQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBoZWFkZXJzLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFkZF9oZWFkZXIoa2V5LCB2YWx1ZSkKKyAgICAgICAgc2VsZi51bnJlZGlyZWN0ZWRfaGRycyA9IHt9CisgICAgICAgIGlmIG9yaWdpbl9yZXFfaG9zdCBpcyBOb25lOgorICAgICAgICAgICAgb3JpZ2luX3JlcV9ob3N0ID0gcmVxdWVzdF9ob3N0KHNlbGYpCisgICAgICAgIHNlbGYub3JpZ2luX3JlcV9ob3N0ID0gb3JpZ2luX3JlcV9ob3N0CisgICAgICAgIHNlbGYudW52ZXJpZmlhYmxlID0gdW52ZXJpZmlhYmxlCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgICMgWFhYIHRoaXMgaXMgYSBmYWxsYmFjayBtZWNoYW5pc20gdG8gZ3VhcmQgYWdhaW5zdCB0aGVzZQorICAgICAgICAjIG1ldGhvZHMgZ2V0dGluZyBjYWxsZWQgaW4gYSBub24tc3RhbmRhcmQgb3JkZXIuICB0aGlzIG1heSBiZQorICAgICAgICAjIHRvbyBjb21wbGljYXRlZCBhbmQvb3IgdW5uZWNlc3NhcnkuCisgICAgICAgICMgWFhYIHNob3VsZCB0aGUgX19yX1hYWCBhdHRyaWJ1dGVzIGJlIHB1YmxpYz8KKyAgICAgICAgaWYgYXR0cls6MTJdID09ICdfUmVxdWVzdF9fcl8nOgorICAgICAgICAgICAgbmFtZSA9IGF0dHJbMTI6XQorICAgICAgICAgICAgaWYgaGFzYXR0cihSZXF1ZXN0LCAnZ2V0XycgKyBuYW1lKToKKyAgICAgICAgICAgICAgICBnZXRhdHRyKHNlbGYsICdnZXRfJyArIG5hbWUpKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBhdHRyKQorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgYXR0cgorCisgICAgZGVmIGdldF9tZXRob2Qoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFzX2RhdGEoKToKKyAgICAgICAgICAgIHJldHVybiAiUE9TVCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiR0VUIgorCisgICAgIyBYWFggdGhlc2UgaGVscGVyIG1ldGhvZHMgYXJlIGxhbWUKKworICAgIGRlZiBhZGRfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5kYXRhID0gZGF0YQorCisgICAgZGVmIGhhc19kYXRhKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhIGlzIG5vdCBOb25lCisKKyAgICBkZWYgZ2V0X2RhdGEoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEKKworICAgIGRlZiBnZXRfZnVsbF91cmwoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX19mcmFnbWVudDoKKyAgICAgICAgICAgIHJldHVybiAnJXMjJXMnICUgKHNlbGYuX19vcmlnaW5hbCwgc2VsZi5fX2ZyYWdtZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19vcmlnaW5hbAorCisgICAgZGVmIGdldF90eXBlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudHlwZSwgc2VsZi5fX3JfdHlwZSA9IHNwbGl0dHlwZShzZWxmLl9fb3JpZ2luYWwpCisgICAgICAgICAgICBpZiBzZWxmLnR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidW5rbm93biB1cmwgdHlwZTogJXMiICUgc2VsZi5fX29yaWdpbmFsCisgICAgICAgIHJldHVybiBzZWxmLnR5cGUKKworICAgIGRlZiBnZXRfaG9zdChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5ob3N0IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmhvc3QsIHNlbGYuX19yX2hvc3QgPSBzcGxpdGhvc3Qoc2VsZi5fX3JfdHlwZSkKKyAgICAgICAgICAgIGlmIHNlbGYuaG9zdDoKKyAgICAgICAgICAgICAgICBzZWxmLmhvc3QgPSB1bnF1b3RlKHNlbGYuaG9zdCkKKyAgICAgICAgcmV0dXJuIHNlbGYuaG9zdAorCisgICAgZGVmIGdldF9zZWxlY3RvcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yX2hvc3QKKworICAgIGRlZiBzZXRfcHJveHkoc2VsZiwgaG9zdCwgdHlwZSk6CisgICAgICAgIGlmIHNlbGYudHlwZSA9PSAnaHR0cHMnIGFuZCBub3Qgc2VsZi5fdHVubmVsX2hvc3Q6CisgICAgICAgICAgICBzZWxmLl90dW5uZWxfaG9zdCA9IHNlbGYuaG9zdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICAgICAgc2VsZi5fX3JfaG9zdCA9IHNlbGYuX19vcmlnaW5hbAorCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKworICAgIGRlZiBoYXNfcHJveHkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fcl9ob3N0ID09IHNlbGYuX19vcmlnaW5hbAorCisgICAgZGVmIGdldF9vcmlnaW5fcmVxX2hvc3Qoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm9yaWdpbl9yZXFfaG9zdAorCisgICAgZGVmIGlzX3VudmVyaWZpYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudW52ZXJpZmlhYmxlCisKKyAgICBkZWYgYWRkX2hlYWRlcihzZWxmLCBrZXksIHZhbCk6CisgICAgICAgICMgdXNlZnVsIGZvciBzb21ldGhpbmcgbGlrZSBhdXRoZW50aWNhdGlvbgorICAgICAgICBzZWxmLmhlYWRlcnNba2V5LmNhcGl0YWxpemUoKV0gPSB2YWwKKworICAgIGRlZiBhZGRfdW5yZWRpcmVjdGVkX2hlYWRlcihzZWxmLCBrZXksIHZhbCk6CisgICAgICAgICMgd2lsbCBub3QgYmUgYWRkZWQgdG8gYSByZWRpcmVjdGVkIHJlcXVlc3QKKyAgICAgICAgc2VsZi51bnJlZGlyZWN0ZWRfaGRyc1trZXkuY2FwaXRhbGl6ZSgpXSA9IHZhbAorCisgICAgZGVmIGhhc19oZWFkZXIoc2VsZiwgaGVhZGVyX25hbWUpOgorICAgICAgICByZXR1cm4gKGhlYWRlcl9uYW1lIGluIHNlbGYuaGVhZGVycyBvcgorICAgICAgICAgICAgICAgIGhlYWRlcl9uYW1lIGluIHNlbGYudW5yZWRpcmVjdGVkX2hkcnMpCisKKyAgICBkZWYgZ2V0X2hlYWRlcihzZWxmLCBoZWFkZXJfbmFtZSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycy5nZXQoCisgICAgICAgICAgICBoZWFkZXJfbmFtZSwKKyAgICAgICAgICAgIHNlbGYudW5yZWRpcmVjdGVkX2hkcnMuZ2V0KGhlYWRlcl9uYW1lLCBkZWZhdWx0KSkKKworICAgIGRlZiBoZWFkZXJfaXRlbXMoc2VsZik6CisgICAgICAgIGhkcnMgPSBzZWxmLnVucmVkaXJlY3RlZF9oZHJzLmNvcHkoKQorICAgICAgICBoZHJzLnVwZGF0ZShzZWxmLmhlYWRlcnMpCisgICAgICAgIHJldHVybiBoZHJzLml0ZW1zKCkKKworY2xhc3MgT3BlbmVyRGlyZWN0b3I6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBjbGllbnRfdmVyc2lvbiA9ICJQeXRob24tdXJsbGliLyVzIiAlIF9fdmVyc2lvbl9fCisgICAgICAgIHNlbGYuYWRkaGVhZGVycyA9IFsoJ1VzZXItYWdlbnQnLCBjbGllbnRfdmVyc2lvbildCisgICAgICAgICMgc2VsZi5oYW5kbGVycyBpcyByZXRhaW5lZCBvbmx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgICAgIHNlbGYuaGFuZGxlcnMgPSBbXQorICAgICAgICAjIG1hbmFnZSB0aGUgaW5kaXZpZHVhbCBoYW5kbGVycworICAgICAgICBzZWxmLmhhbmRsZV9vcGVuID0ge30KKyAgICAgICAgc2VsZi5oYW5kbGVfZXJyb3IgPSB7fQorICAgICAgICBzZWxmLnByb2Nlc3NfcmVzcG9uc2UgPSB7fQorICAgICAgICBzZWxmLnByb2Nlc3NfcmVxdWVzdCA9IHt9CisKKyAgICBkZWYgYWRkX2hhbmRsZXIoc2VsZiwgaGFuZGxlcik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKGhhbmRsZXIsICJhZGRfcGFyZW50Iik6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4cGVjdGVkIEJhc2VIYW5kbGVyIGluc3RhbmNlLCBnb3QgJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKGhhbmRsZXIpKQorCisgICAgICAgIGFkZGVkID0gRmFsc2UKKyAgICAgICAgZm9yIG1ldGggaW4gZGlyKGhhbmRsZXIpOgorICAgICAgICAgICAgaWYgbWV0aCBpbiBbInJlZGlyZWN0X3JlcXVlc3QiLCAiZG9fb3BlbiIsICJwcm94eV9vcGVuIl06CisgICAgICAgICAgICAgICAgIyBvb3BzLCBjb2luY2lkZW50YWwgbWF0Y2gKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpID0gbWV0aC5maW5kKCJfIikKKyAgICAgICAgICAgIHByb3RvY29sID0gbWV0aFs6aV0KKyAgICAgICAgICAgIGNvbmRpdGlvbiA9IG1ldGhbaSsxOl0KKworICAgICAgICAgICAgaWYgY29uZGl0aW9uLnN0YXJ0c3dpdGgoImVycm9yIik6CisgICAgICAgICAgICAgICAgaiA9IGNvbmRpdGlvbi5maW5kKCJfIikgKyBpICsgMQorICAgICAgICAgICAgICAgIGtpbmQgPSBtZXRoW2orMTpdCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBraW5kID0gaW50KGtpbmQpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBsb29rdXAgPSBzZWxmLmhhbmRsZV9lcnJvci5nZXQocHJvdG9jb2wsIHt9KQorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yW3Byb3RvY29sXSA9IGxvb2t1cAorICAgICAgICAgICAgZWxpZiBjb25kaXRpb24gPT0gIm9wZW4iOgorICAgICAgICAgICAgICAgIGtpbmQgPSBwcm90b2NvbAorICAgICAgICAgICAgICAgIGxvb2t1cCA9IHNlbGYuaGFuZGxlX29wZW4KKyAgICAgICAgICAgIGVsaWYgY29uZGl0aW9uID09ICJyZXNwb25zZSI6CisgICAgICAgICAgICAgICAga2luZCA9IHByb3RvY29sCisgICAgICAgICAgICAgICAgbG9va3VwID0gc2VsZi5wcm9jZXNzX3Jlc3BvbnNlCisgICAgICAgICAgICBlbGlmIGNvbmRpdGlvbiA9PSAicmVxdWVzdCI6CisgICAgICAgICAgICAgICAga2luZCA9IHByb3RvY29sCisgICAgICAgICAgICAgICAgbG9va3VwID0gc2VsZi5wcm9jZXNzX3JlcXVlc3QKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaGFuZGxlcnMgPSBsb29rdXAuc2V0ZGVmYXVsdChraW5kLCBbXSkKKyAgICAgICAgICAgIGlmIGhhbmRsZXJzOgorICAgICAgICAgICAgICAgIGJpc2VjdC5pbnNvcnQoaGFuZGxlcnMsIGhhbmRsZXIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGhhbmRsZXJzLmFwcGVuZChoYW5kbGVyKQorICAgICAgICAgICAgYWRkZWQgPSBUcnVlCisKKyAgICAgICAgaWYgYWRkZWQ6CisgICAgICAgICAgICBiaXNlY3QuaW5zb3J0KHNlbGYuaGFuZGxlcnMsIGhhbmRsZXIpCisgICAgICAgICAgICBoYW5kbGVyLmFkZF9wYXJlbnQoc2VsZikKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIyBPbmx5IGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICAgICAgIHBhc3MKKworICAgIGRlZiBfY2FsbF9jaGFpbihzZWxmLCBjaGFpbiwga2luZCwgbWV0aF9uYW1lLCAqYXJncyk6CisgICAgICAgICMgSGFuZGxlcnMgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIG5vIG9uZSBlbHNlIHNob3VsZCB0cnkgdG8gaGFuZGxlCisgICAgICAgICMgdGhlIHJlcXVlc3QsIG9yIHJldHVybiBOb25lIGlmIHRoZXkgY2FuJ3QgYnV0IGFub3RoZXIgaGFuZGxlcgorICAgICAgICAjIGNvdWxkLiAgT3RoZXJ3aXNlLCB0aGV5IHJldHVybiB0aGUgcmVzcG9uc2UuCisgICAgICAgIGhhbmRsZXJzID0gY2hhaW4uZ2V0KGtpbmQsICgpKQorICAgICAgICBmb3IgaGFuZGxlciBpbiBoYW5kbGVyczoKKyAgICAgICAgICAgIGZ1bmMgPSBnZXRhdHRyKGhhbmRsZXIsIG1ldGhfbmFtZSkKKworICAgICAgICAgICAgcmVzdWx0ID0gZnVuYygqYXJncykKKyAgICAgICAgICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgb3BlbihzZWxmLCBmdWxsdXJsLCBkYXRhPU5vbmUsIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VUKToKKyAgICAgICAgIyBhY2NlcHQgYSBVUkwgb3IgYSBSZXF1ZXN0IG9iamVjdAorICAgICAgICBpZiBpc2luc3RhbmNlKGZ1bGx1cmwsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgcmVxID0gUmVxdWVzdChmdWxsdXJsLCBkYXRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVxID0gZnVsbHVybAorICAgICAgICAgICAgaWYgZGF0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXEuYWRkX2RhdGEoZGF0YSkKKworICAgICAgICByZXEudGltZW91dCA9IHRpbWVvdXQKKyAgICAgICAgcHJvdG9jb2wgPSByZXEuZ2V0X3R5cGUoKQorCisgICAgICAgICMgcHJlLXByb2Nlc3MgcmVxdWVzdAorICAgICAgICBtZXRoX25hbWUgPSBwcm90b2NvbCsiX3JlcXVlc3QiCisgICAgICAgIGZvciBwcm9jZXNzb3IgaW4gc2VsZi5wcm9jZXNzX3JlcXVlc3QuZ2V0KHByb3RvY29sLCBbXSk6CisgICAgICAgICAgICBtZXRoID0gZ2V0YXR0cihwcm9jZXNzb3IsIG1ldGhfbmFtZSkKKyAgICAgICAgICAgIHJlcSA9IG1ldGgocmVxKQorCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5fb3BlbihyZXEsIGRhdGEpCisKKyAgICAgICAgIyBwb3N0LXByb2Nlc3MgcmVzcG9uc2UKKyAgICAgICAgbWV0aF9uYW1lID0gcHJvdG9jb2wrIl9yZXNwb25zZSIKKyAgICAgICAgZm9yIHByb2Nlc3NvciBpbiBzZWxmLnByb2Nlc3NfcmVzcG9uc2UuZ2V0KHByb3RvY29sLCBbXSk6CisgICAgICAgICAgICBtZXRoID0gZ2V0YXR0cihwcm9jZXNzb3IsIG1ldGhfbmFtZSkKKyAgICAgICAgICAgIHJlc3BvbnNlID0gbWV0aChyZXEsIHJlc3BvbnNlKQorCisgICAgICAgIHJldHVybiByZXNwb25zZQorCisgICAgZGVmIF9vcGVuKHNlbGYsIHJlcSwgZGF0YT1Ob25lKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fY2FsbF9jaGFpbihzZWxmLmhhbmRsZV9vcGVuLCAnZGVmYXVsdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHRfb3BlbicsIHJlcSkKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgICAgIHByb3RvY29sID0gcmVxLmdldF90eXBlKCkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fY2FsbF9jaGFpbihzZWxmLmhhbmRsZV9vcGVuLCBwcm90b2NvbCwgcHJvdG9jb2wgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfb3BlbicsIHJlcSkKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsX2NoYWluKHNlbGYuaGFuZGxlX29wZW4sICd1bmtub3duJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Vua25vd25fb3BlbicsIHJlcSkKKworICAgIGRlZiBlcnJvcihzZWxmLCBwcm90bywgKmFyZ3MpOgorICAgICAgICBpZiBwcm90byBpbiAoJ2h0dHAnLCAnaHR0cHMnKToKKyAgICAgICAgICAgICMgWFhYIGh0dHBbc10gcHJvdG9jb2xzIGFyZSBzcGVjaWFsLWNhc2VkCisgICAgICAgICAgICBkaWN0ID0gc2VsZi5oYW5kbGVfZXJyb3JbJ2h0dHAnXSAjIGh0dHBzIGlzIG5vdCBkaWZmZXJlbnQgdGhhbiBodHRwCisgICAgICAgICAgICBwcm90byA9IGFyZ3NbMl0gICMgWVVDSyEKKyAgICAgICAgICAgIG1ldGhfbmFtZSA9ICdodHRwX2Vycm9yXyVzJyAlIHByb3RvCisgICAgICAgICAgICBodHRwX2VyciA9IDEKKyAgICAgICAgICAgIG9yaWdfYXJncyA9IGFyZ3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRpY3QgPSBzZWxmLmhhbmRsZV9lcnJvcgorICAgICAgICAgICAgbWV0aF9uYW1lID0gcHJvdG8gKyAnX2Vycm9yJworICAgICAgICAgICAgaHR0cF9lcnIgPSAwCisgICAgICAgIGFyZ3MgPSAoZGljdCwgcHJvdG8sIG1ldGhfbmFtZSkgKyBhcmdzCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX2NhbGxfY2hhaW4oKmFyZ3MpCisgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICAgICBpZiBodHRwX2VycjoKKyAgICAgICAgICAgIGFyZ3MgPSAoZGljdCwgJ2RlZmF1bHQnLCAnaHR0cF9lcnJvcl9kZWZhdWx0JykgKyBvcmlnX2FyZ3MKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jYWxsX2NoYWluKCphcmdzKQorCisjIFhYWCBwcm9iYWJseSBhbHNvIHdhbnQgYW4gYWJzdHJhY3QgZmFjdG9yeSB0aGF0IGtub3dzIHdoZW4gaXQgbWFrZXMKKyMgc2Vuc2UgdG8gc2tpcCBhIHN1cGVyY2xhc3MgaW4gZmF2b3Igb2YgYSBzdWJjbGFzcyBhbmQgd2hlbiBpdCBtaWdodAorIyBtYWtlIHNlbnNlIHRvIGluY2x1ZGUgYm90aAorCitkZWYgYnVpbGRfb3BlbmVyKCpoYW5kbGVycyk6CisgICAgIiIiQ3JlYXRlIGFuIG9wZW5lciBvYmplY3QgZnJvbSBhIGxpc3Qgb2YgaGFuZGxlcnMuCisKKyAgICBUaGUgb3BlbmVyIHdpbGwgdXNlIHNldmVyYWwgZGVmYXVsdCBoYW5kbGVycywgaW5jbHVkaW5nIHN1cHBvcnQKKyAgICBmb3IgSFRUUCwgRlRQIGFuZCB3aGVuIGFwcGxpY2FibGUsIEhUVFBTLgorCisgICAgSWYgYW55IG9mIHRoZSBoYW5kbGVycyBwYXNzZWQgYXMgYXJndW1lbnRzIGFyZSBzdWJjbGFzc2VzIG9mIHRoZQorICAgIGRlZmF1bHQgaGFuZGxlcnMsIHRoZSBkZWZhdWx0IGhhbmRsZXJzIHdpbGwgbm90IGJlIHVzZWQuCisgICAgIiIiCisgICAgaW1wb3J0IHR5cGVzCisgICAgZGVmIGlzY2xhc3Mob2JqKToKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqLCAodHlwZXMuQ2xhc3NUeXBlLCB0eXBlKSkKKworICAgIG9wZW5lciA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICBkZWZhdWx0X2NsYXNzZXMgPSBbUHJveHlIYW5kbGVyLCBVbmtub3duSGFuZGxlciwgSFRUUEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyLCBIVFRQUmVkaXJlY3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICBGVFBIYW5kbGVyLCBGaWxlSGFuZGxlciwgSFRUUEVycm9yUHJvY2Vzc29yXQorICAgIGlmIGhhc2F0dHIoaHR0cGxpYiwgJ0hUVFBTJyk6CisgICAgICAgIGRlZmF1bHRfY2xhc3Nlcy5hcHBlbmQoSFRUUFNIYW5kbGVyKQorICAgIHNraXAgPSBzZXQoKQorICAgIGZvciBrbGFzcyBpbiBkZWZhdWx0X2NsYXNzZXM6CisgICAgICAgIGZvciBjaGVjayBpbiBoYW5kbGVyczoKKyAgICAgICAgICAgIGlmIGlzY2xhc3MoY2hlY2spOgorICAgICAgICAgICAgICAgIGlmIGlzc3ViY2xhc3MoY2hlY2ssIGtsYXNzKToKKyAgICAgICAgICAgICAgICAgICAgc2tpcC5hZGQoa2xhc3MpCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoY2hlY2ssIGtsYXNzKToKKyAgICAgICAgICAgICAgICBza2lwLmFkZChrbGFzcykKKyAgICBmb3Iga2xhc3MgaW4gc2tpcDoKKyAgICAgICAgZGVmYXVsdF9jbGFzc2VzLnJlbW92ZShrbGFzcykKKworICAgIGZvciBrbGFzcyBpbiBkZWZhdWx0X2NsYXNzZXM6CisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihrbGFzcygpKQorCisgICAgZm9yIGggaW4gaGFuZGxlcnM6CisgICAgICAgIGlmIGlzY2xhc3MoaCk6CisgICAgICAgICAgICBoID0gaCgpCisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihoKQorICAgIHJldHVybiBvcGVuZXIKKworY2xhc3MgQmFzZUhhbmRsZXI6CisgICAgaGFuZGxlcl9vcmRlciA9IDUwMAorCisgICAgZGVmIGFkZF9wYXJlbnQoc2VsZiwgcGFyZW50KToKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIyBPbmx5IGV4aXN0cyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICAgICAgcGFzcworCisgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG90aGVyLCAiaGFuZGxlcl9vcmRlciIpOgorICAgICAgICAgICAgIyBUcnkgdG8gcHJlc2VydmUgdGhlIG9sZCBiZWhhdmlvciBvZiBoYXZpbmcgY3VzdG9tIGNsYXNzZXMKKyAgICAgICAgICAgICMgaW5zZXJ0ZWQgYWZ0ZXIgZGVmYXVsdCBvbmVzICh3b3JrcyBvbmx5IGZvciBjdXN0b20gdXNlcgorICAgICAgICAgICAgIyBjbGFzc2VzIHdoaWNoIGFyZSBub3QgYXdhcmUgb2YgaGFuZGxlcl9vcmRlcikuCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGVyX29yZGVyIDwgb3RoZXIuaGFuZGxlcl9vcmRlcgorCisKK2NsYXNzIEhUVFBFcnJvclByb2Nlc3NvcihCYXNlSGFuZGxlcik6CisgICAgIiIiUHJvY2VzcyBIVFRQIGVycm9yIHJlc3BvbnNlcy4iIiIKKyAgICBoYW5kbGVyX29yZGVyID0gMTAwMCAgIyBhZnRlciBhbGwgb3RoZXIgcHJvY2Vzc2luZworCisgICAgZGVmIGh0dHBfcmVzcG9uc2Uoc2VsZiwgcmVxdWVzdCwgcmVzcG9uc2UpOgorICAgICAgICBjb2RlLCBtc2csIGhkcnMgPSByZXNwb25zZS5jb2RlLCByZXNwb25zZS5tc2csIHJlc3BvbnNlLmluZm8oKQorCisgICAgICAgICMgQWNjb3JkaW5nIHRvIFJGQyAyNjE2LCAiMnh4IiBjb2RlIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQncworICAgICAgICAjIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCwgdW5kZXJzdG9vZCwgYW5kIGFjY2VwdGVkLgorICAgICAgICBpZiBub3QgKDIwMCA8PSBjb2RlIDwgMzAwKToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5wYXJlbnQuZXJyb3IoCisgICAgICAgICAgICAgICAgJ2h0dHAnLCByZXF1ZXN0LCByZXNwb25zZSwgY29kZSwgbXNnLCBoZHJzKQorCisgICAgICAgIHJldHVybiByZXNwb25zZQorCisgICAgaHR0cHNfcmVzcG9uc2UgPSBodHRwX3Jlc3BvbnNlCisKK2NsYXNzIEhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyKEJhc2VIYW5kbGVyKToKKyAgICBkZWYgaHR0cF9lcnJvcl9kZWZhdWx0KHNlbGYsIHJlcSwgZnAsIGNvZGUsIG1zZywgaGRycyk6CisgICAgICAgIHJhaXNlIEhUVFBFcnJvcihyZXEuZ2V0X2Z1bGxfdXJsKCksIGNvZGUsIG1zZywgaGRycywgZnApCisKK2NsYXNzIEhUVFBSZWRpcmVjdEhhbmRsZXIoQmFzZUhhbmRsZXIpOgorICAgICMgbWF4aW11bSBudW1iZXIgb2YgcmVkaXJlY3Rpb25zIHRvIGFueSBzaW5nbGUgVVJMCisgICAgIyB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBzdGF0ZSB0aGF0IGNvb2tpZXMgaW50cm9kdWNlCisgICAgbWF4X3JlcGVhdHMgPSA0CisgICAgIyBtYXhpbXVtIHRvdGFsIG51bWJlciBvZiByZWRpcmVjdGlvbnMgKHJlZ2FyZGxlc3Mgb2YgVVJMKSBiZWZvcmUKKyAgICAjIGFzc3VtaW5nIHdlJ3JlIGluIGEgbG9vcAorICAgIG1heF9yZWRpcmVjdGlvbnMgPSAxMAorCisgICAgZGVmIHJlZGlyZWN0X3JlcXVlc3Qoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLCBoZWFkZXJzLCBuZXd1cmwpOgorICAgICAgICAiIiJSZXR1cm4gYSBSZXF1ZXN0IG9yIE5vbmUgaW4gcmVzcG9uc2UgdG8gYSByZWRpcmVjdC4KKworICAgICAgICBUaGlzIGlzIGNhbGxlZCBieSB0aGUgaHR0cF9lcnJvcl8zMHggbWV0aG9kcyB3aGVuIGEKKyAgICAgICAgcmVkaXJlY3Rpb24gcmVzcG9uc2UgaXMgcmVjZWl2ZWQuICBJZiBhIHJlZGlyZWN0aW9uIHNob3VsZAorICAgICAgICB0YWtlIHBsYWNlLCByZXR1cm4gYSBuZXcgUmVxdWVzdCB0byBhbGxvdyBodHRwX2Vycm9yXzMweCB0bworICAgICAgICBwZXJmb3JtIHRoZSByZWRpcmVjdC4gIE90aGVyd2lzZSwgcmFpc2UgSFRUUEVycm9yIGlmIG5vLW9uZQorICAgICAgICBlbHNlIHNob3VsZCB0cnkgdG8gaGFuZGxlIHRoaXMgdXJsLiAgUmV0dXJuIE5vbmUgaWYgeW91IGNhbid0CisgICAgICAgIGJ1dCBhbm90aGVyIEhhbmRsZXIgbWlnaHQuCisgICAgICAgICIiIgorICAgICAgICBtID0gcmVxLmdldF9tZXRob2QoKQorICAgICAgICBpZiAoY29kZSBpbiAoMzAxLCAzMDIsIDMwMywgMzA3KSBhbmQgbSBpbiAoIkdFVCIsICJIRUFEIikKKyAgICAgICAgICAgIG9yIGNvZGUgaW4gKDMwMSwgMzAyLCAzMDMpIGFuZCBtID09ICJQT1NUIik6CisgICAgICAgICAgICAjIFN0cmljdGx5IChhY2NvcmRpbmcgdG8gUkZDIDI2MTYpLCAzMDEgb3IgMzAyIGluIHJlc3BvbnNlCisgICAgICAgICAgICAjIHRvIGEgUE9TVCBNVVNUIE5PVCBjYXVzZSBhIHJlZGlyZWN0aW9uIHdpdGhvdXQgY29uZmlybWF0aW9uCisgICAgICAgICAgICAjIGZyb20gdGhlIHVzZXIgKG9mIHVybGxpYjIsIGluIHRoaXMgY2FzZSkuICBJbiBwcmFjdGljZSwKKyAgICAgICAgICAgICMgZXNzZW50aWFsbHkgYWxsIGNsaWVudHMgZG8gcmVkaXJlY3QgaW4gdGhpcyBjYXNlLCBzbyB3ZQorICAgICAgICAgICAgIyBkbyB0aGUgc2FtZS4KKyAgICAgICAgICAgICMgYmUgY29uY2lsaWFudCB3aXRoIFVSSXMgY29udGFpbmluZyBhIHNwYWNlCisgICAgICAgICAgICBuZXd1cmwgPSBuZXd1cmwucmVwbGFjZSgnICcsICclMjAnKQorICAgICAgICAgICAgbmV3aGVhZGVycyA9IGRpY3QoKGssdikgZm9yIGssdiBpbiByZXEuaGVhZGVycy5pdGVtcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBrLmxvd2VyKCkgbm90IGluICgiY29udGVudC1sZW5ndGgiLCAiY29udGVudC10eXBlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgcmV0dXJuIFJlcXVlc3QobmV3dXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1uZXdoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luX3JlcV9ob3N0PXJlcS5nZXRfb3JpZ2luX3JlcV9ob3N0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnZlcmlmaWFibGU9VHJ1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEhUVFBFcnJvcihyZXEuZ2V0X2Z1bGxfdXJsKCksIGNvZGUsIG1zZywgaGVhZGVycywgZnApCisKKyAgICAjIEltcGxlbWVudGF0aW9uIG5vdGU6IFRvIGF2b2lkIHRoZSBzZXJ2ZXIgc2VuZGluZyB1cyBpbnRvIGFuCisgICAgIyBpbmZpbml0ZSBsb29wLCB0aGUgcmVxdWVzdCBvYmplY3QgbmVlZHMgdG8gdHJhY2sgd2hhdCBVUkxzIHdlCisgICAgIyBoYXZlIGFscmVhZHkgc2Vlbi4gIERvIHRoaXMgYnkgYWRkaW5nIGEgaGFuZGxlci1zcGVjaWZpYworICAgICMgYXR0cmlidXRlIHRvIHRoZSBSZXF1ZXN0IG9iamVjdC4KKyAgICBkZWYgaHR0cF9lcnJvcl8zMDIoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLCBoZWFkZXJzKToKKyAgICAgICAgIyBTb21lIHNlcnZlcnMgKGluY29ycmVjdGx5KSByZXR1cm4gbXVsdGlwbGUgTG9jYXRpb24gaGVhZGVycworICAgICAgICAjIChzbyBwcm9iYWJseSBzYW1lIGdvZXMgZm9yIFVSSSkuICBVc2UgZmlyc3QgaGVhZGVyLgorICAgICAgICBpZiAnbG9jYXRpb24nIGluIGhlYWRlcnM6CisgICAgICAgICAgICBuZXd1cmwgPSBoZWFkZXJzLmdldGhlYWRlcnMoJ2xvY2F0aW9uJylbMF0KKyAgICAgICAgZWxpZiAndXJpJyBpbiBoZWFkZXJzOgorICAgICAgICAgICAgbmV3dXJsID0gaGVhZGVycy5nZXRoZWFkZXJzKCd1cmknKVswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBmaXggYSBwb3NzaWJsZSBtYWxmb3JtZWQgVVJMCisgICAgICAgIHVybHBhcnRzID0gdXJscGFyc2UudXJscGFyc2UobmV3dXJsKQorICAgICAgICBpZiBub3QgdXJscGFydHMucGF0aDoKKyAgICAgICAgICAgIHVybHBhcnRzID0gbGlzdCh1cmxwYXJ0cykKKyAgICAgICAgICAgIHVybHBhcnRzWzJdID0gIi8iCisgICAgICAgIG5ld3VybCA9IHVybHBhcnNlLnVybHVucGFyc2UodXJscGFydHMpCisKKyAgICAgICAgbmV3dXJsID0gdXJscGFyc2UudXJsam9pbihyZXEuZ2V0X2Z1bGxfdXJsKCksIG5ld3VybCkKKworICAgICAgICAjIEZvciBzZWN1cml0eSByZWFzb25zIHdlIGRvIG5vdCBhbGxvdyByZWRpcmVjdHMgdG8gcHJvdG9jb2xzCisgICAgICAgICMgb3RoZXIgdGhhbiBIVFRQLCBIVFRQUyBvciBGVFAuCisgICAgICAgIG5ld3VybF9sb3dlciA9IG5ld3VybC5sb3dlcigpCisgICAgICAgIGlmIG5vdCAobmV3dXJsX2xvd2VyLnN0YXJ0c3dpdGgoJ2h0dHA6Ly8nKSBvcgorICAgICAgICAgICAgICAgIG5ld3VybF9sb3dlci5zdGFydHN3aXRoKCdodHRwczovLycpIG9yCisgICAgICAgICAgICAgICAgbmV3dXJsX2xvd2VyLnN0YXJ0c3dpdGgoJ2Z0cDovLycpKToKKyAgICAgICAgICAgIHJhaXNlIEhUVFBFcnJvcihuZXd1cmwsIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnICsgIiAtIFJlZGlyZWN0aW9uIHRvIHVybCAnJXMnIGlzIG5vdCBhbGxvd2VkIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3dXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsIGZwKQorCisgICAgICAgICMgWFhYIFByb2JhYmx5IHdhbnQgdG8gZm9yZ2V0IGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudAorICAgICAgICAjIHJlcXVlc3QsIGFsdGhvdWdoIHRoYXQgbWlnaHQgaW50ZXJhY3QgcG9vcmx5IHdpdGggb3RoZXIKKyAgICAgICAgIyBoYW5kbGVycyB0aGF0IGFsc28gdXNlIGhhbmRsZXItc3BlY2lmaWMgcmVxdWVzdCBhdHRyaWJ1dGVzCisgICAgICAgIG5ldyA9IHNlbGYucmVkaXJlY3RfcmVxdWVzdChyZXEsIGZwLCBjb2RlLCBtc2csIGhlYWRlcnMsIG5ld3VybCkKKyAgICAgICAgaWYgbmV3IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIGxvb3AgZGV0ZWN0aW9uCisgICAgICAgICMgLnJlZGlyZWN0X2RpY3QgaGFzIGEga2V5IHVybCBpZiB1cmwgd2FzIHByZXZpb3VzbHkgdmlzaXRlZC4KKyAgICAgICAgaWYgaGFzYXR0cihyZXEsICdyZWRpcmVjdF9kaWN0Jyk6CisgICAgICAgICAgICB2aXNpdGVkID0gbmV3LnJlZGlyZWN0X2RpY3QgPSByZXEucmVkaXJlY3RfZGljdAorICAgICAgICAgICAgaWYgKHZpc2l0ZWQuZ2V0KG5ld3VybCwgMCkgPj0gc2VsZi5tYXhfcmVwZWF0cyBvcgorICAgICAgICAgICAgICAgIGxlbih2aXNpdGVkKSA+PSBzZWxmLm1heF9yZWRpcmVjdGlvbnMpOgorICAgICAgICAgICAgICAgIHJhaXNlIEhUVFBFcnJvcihyZXEuZ2V0X2Z1bGxfdXJsKCksIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5mX21zZyArIG1zZywgaGVhZGVycywgZnApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2aXNpdGVkID0gbmV3LnJlZGlyZWN0X2RpY3QgPSByZXEucmVkaXJlY3RfZGljdCA9IHt9CisgICAgICAgIHZpc2l0ZWRbbmV3dXJsXSA9IHZpc2l0ZWQuZ2V0KG5ld3VybCwgMCkgKyAxCisKKyAgICAgICAgIyBEb24ndCBjbG9zZSB0aGUgZnAgdW50aWwgd2UgYXJlIHN1cmUgdGhhdCB3ZSB3b24ndCB1c2UgaXQKKyAgICAgICAgIyB3aXRoIEhUVFBFcnJvci4KKyAgICAgICAgZnAucmVhZCgpCisgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQub3BlbihuZXcsIHRpbWVvdXQ9cmVxLnRpbWVvdXQpCisKKyAgICBodHRwX2Vycm9yXzMwMSA9IGh0dHBfZXJyb3JfMzAzID0gaHR0cF9lcnJvcl8zMDcgPSBodHRwX2Vycm9yXzMwMgorCisgICAgaW5mX21zZyA9ICJUaGUgSFRUUCBzZXJ2ZXIgcmV0dXJuZWQgYSByZWRpcmVjdCBlcnJvciB0aGF0IHdvdWxkICIgXAorICAgICAgICAgICAgICAibGVhZCB0byBhbiBpbmZpbml0ZSBsb29wLlxuIiBcCisgICAgICAgICAgICAgICJUaGUgbGFzdCAzMHggZXJyb3IgbWVzc2FnZSB3YXM6XG4iCisKKworZGVmIF9wYXJzZV9wcm94eShwcm94eSk6CisgICAgIiIiUmV0dXJuIChzY2hlbWUsIHVzZXIsIHBhc3N3b3JkLCBob3N0L3BvcnQpIGdpdmVuIGEgVVJMIG9yIGFuIGF1dGhvcml0eS4KKworICAgIElmIGEgVVJMIGlzIHN1cHBsaWVkLCBpdCBtdXN0IGhhdmUgYW4gYXV0aG9yaXR5IChob3N0OnBvcnQpIGNvbXBvbmVudC4KKyAgICBBY2NvcmRpbmcgdG8gUkZDIDM5ODYsIGhhdmluZyBhbiBhdXRob3JpdHkgY29tcG9uZW50IG1lYW5zIHRoZSBVUkwgbXVzdAorICAgIGhhdmUgdHdvIHNsYXNoZXMgYWZ0ZXIgdGhlIHNjaGVtZToKKworICAgID4+PiBfcGFyc2VfcHJveHkoJ2ZpbGU6L2Z0cC5leGFtcGxlLmNvbS8nKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBWYWx1ZUVycm9yOiBwcm94eSBVUkwgd2l0aCBubyBhdXRob3JpdHk6ICdmaWxlOi9mdHAuZXhhbXBsZS5jb20vJworCisgICAgVGhlIGZpcnN0IHRocmVlIGl0ZW1zIG9mIHRoZSByZXR1cm5lZCB0dXBsZSBtYXkgYmUgTm9uZS4KKworICAgIEV4YW1wbGVzIG9mIGF1dGhvcml0eSBwYXJzaW5nOgorCisgICAgPj4+IF9wYXJzZV9wcm94eSgncHJveHkuZXhhbXBsZS5jb20nKQorICAgIChOb25lLCBOb25lLCBOb25lLCAncHJveHkuZXhhbXBsZS5jb20nKQorICAgID4+PiBfcGFyc2VfcHJveHkoJ3Byb3h5LmV4YW1wbGUuY29tOjMxMjgnKQorICAgIChOb25lLCBOb25lLCBOb25lLCAncHJveHkuZXhhbXBsZS5jb206MzEyOCcpCisKKyAgICBUaGUgYXV0aG9yaXR5IGNvbXBvbmVudCBtYXkgb3B0aW9uYWxseSBpbmNsdWRlIHVzZXJpbmZvIChhc3N1bWVkIHRvIGJlCisgICAgdXNlcm5hbWU6cGFzc3dvcmQpOgorCisgICAgPj4+IF9wYXJzZV9wcm94eSgnam9lOnBhc3N3b3JkQHByb3h5LmV4YW1wbGUuY29tJykKKyAgICAoTm9uZSwgJ2pvZScsICdwYXNzd29yZCcsICdwcm94eS5leGFtcGxlLmNvbScpCisgICAgPj4+IF9wYXJzZV9wcm94eSgnam9lOnBhc3N3b3JkQHByb3h5LmV4YW1wbGUuY29tOjMxMjgnKQorICAgIChOb25lLCAnam9lJywgJ3Bhc3N3b3JkJywgJ3Byb3h5LmV4YW1wbGUuY29tOjMxMjgnKQorCisgICAgU2FtZSBleGFtcGxlcywgYnV0IHdpdGggVVJMcyBpbnN0ZWFkOgorCisgICAgPj4+IF9wYXJzZV9wcm94eSgnaHR0cDovL3Byb3h5LmV4YW1wbGUuY29tLycpCisgICAgKCdodHRwJywgTm9uZSwgTm9uZSwgJ3Byb3h5LmV4YW1wbGUuY29tJykKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdodHRwOi8vcHJveHkuZXhhbXBsZS5jb206MzEyOC8nKQorICAgICgnaHR0cCcsIE5vbmUsIE5vbmUsICdwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdodHRwOi8vam9lOnBhc3N3b3JkQHByb3h5LmV4YW1wbGUuY29tLycpCisgICAgKCdodHRwJywgJ2pvZScsICdwYXNzd29yZCcsICdwcm94eS5leGFtcGxlLmNvbScpCisgICAgPj4+IF9wYXJzZV9wcm94eSgnaHR0cDovL2pvZTpwYXNzd29yZEBwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKyAgICAoJ2h0dHAnLCAnam9lJywgJ3Bhc3N3b3JkJywgJ3Byb3h5LmV4YW1wbGUuY29tOjMxMjgnKQorCisgICAgRXZlcnl0aGluZyBhZnRlciB0aGUgYXV0aG9yaXR5IGlzIGlnbm9yZWQ6CisKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdmdHA6Ly9qb2U6cGFzc3dvcmRAcHJveHkuZXhhbXBsZS5jb20vcnViYmlzaDozMTI4JykKKyAgICAoJ2Z0cCcsICdqb2UnLCAncGFzc3dvcmQnLCAncHJveHkuZXhhbXBsZS5jb20nKQorCisgICAgVGVzdCBmb3Igbm8gdHJhaWxpbmcgJy8nIGNhc2U6CisKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdodHRwOi8vam9lOnBhc3N3b3JkQHByb3h5LmV4YW1wbGUuY29tJykKKyAgICAoJ2h0dHAnLCAnam9lJywgJ3Bhc3N3b3JkJywgJ3Byb3h5LmV4YW1wbGUuY29tJykKKworICAgICIiIgorICAgIHNjaGVtZSwgcl9zY2hlbWUgPSBzcGxpdHR5cGUocHJveHkpCisgICAgaWYgbm90IHJfc2NoZW1lLnN0YXJ0c3dpdGgoIi8iKToKKyAgICAgICAgIyBhdXRob3JpdHkKKyAgICAgICAgc2NoZW1lID0gTm9uZQorICAgICAgICBhdXRob3JpdHkgPSBwcm94eQorICAgIGVsc2U6CisgICAgICAgICMgVVJMCisgICAgICAgIGlmIG5vdCByX3NjaGVtZS5zdGFydHN3aXRoKCIvLyIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicHJveHkgVVJMIHdpdGggbm8gYXV0aG9yaXR5OiAlciIgJSBwcm94eSkKKyAgICAgICAgIyBXZSBoYXZlIGFuIGF1dGhvcml0eSwgc28gZm9yIFJGQyAzOTg2LWNvbXBsaWFudCBVUkxzIChieSBzcyAzLgorICAgICAgICAjIGFuZCAzLjMuKSwgcGF0aCBpcyBlbXB0eSBvciBzdGFydHMgd2l0aCAnLycKKyAgICAgICAgZW5kID0gcl9zY2hlbWUuZmluZCgiLyIsIDIpCisgICAgICAgIGlmIGVuZCA9PSAtMToKKyAgICAgICAgICAgIGVuZCA9IE5vbmUKKyAgICAgICAgYXV0aG9yaXR5ID0gcl9zY2hlbWVbMjplbmRdCisgICAgdXNlcmluZm8sIGhvc3Rwb3J0ID0gc3BsaXR1c2VyKGF1dGhvcml0eSkKKyAgICBpZiB1c2VyaW5mbyBpcyBub3QgTm9uZToKKyAgICAgICAgdXNlciwgcGFzc3dvcmQgPSBzcGxpdHBhc3N3ZCh1c2VyaW5mbykKKyAgICBlbHNlOgorICAgICAgICB1c2VyID0gcGFzc3dvcmQgPSBOb25lCisgICAgcmV0dXJuIHNjaGVtZSwgdXNlciwgcGFzc3dvcmQsIGhvc3Rwb3J0CisKK2NsYXNzIFByb3h5SGFuZGxlcihCYXNlSGFuZGxlcik6CisgICAgIyBQcm94aWVzIG11c3QgYmUgaW4gZnJvbnQKKyAgICBoYW5kbGVyX29yZGVyID0gMTAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJveGllcz1Ob25lKToKKyAgICAgICAgaWYgcHJveGllcyBpcyBOb25lOgorICAgICAgICAgICAgcHJveGllcyA9IGdldHByb3hpZXMoKQorICAgICAgICBhc3NlcnQgaGFzYXR0cihwcm94aWVzLCAnaGFzX2tleScpLCAicHJveGllcyBtdXN0IGJlIGEgbWFwcGluZyIKKyAgICAgICAgc2VsZi5wcm94aWVzID0gcHJveGllcworICAgICAgICBmb3IgdHlwZSwgdXJsIGluIHByb3hpZXMuaXRlbXMoKToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgJyVzX29wZW4nICUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHIsIHByb3h5PXVybCwgdHlwZT10eXBlLCBtZXRoPXNlbGYucHJveHlfb3BlbjogXAorICAgICAgICAgICAgICAgICAgICBtZXRoKHIsIHByb3h5LCB0eXBlKSkKKworICAgIGRlZiBwcm94eV9vcGVuKHNlbGYsIHJlcSwgcHJveHksIHR5cGUpOgorICAgICAgICBvcmlnX3R5cGUgPSByZXEuZ2V0X3R5cGUoKQorICAgICAgICBwcm94eV90eXBlLCB1c2VyLCBwYXNzd29yZCwgaG9zdHBvcnQgPSBfcGFyc2VfcHJveHkocHJveHkpCisKKyAgICAgICAgaWYgcHJveHlfdHlwZSBpcyBOb25lOgorICAgICAgICAgICAgcHJveHlfdHlwZSA9IG9yaWdfdHlwZQorCisgICAgICAgIGlmIHJlcS5ob3N0IGFuZCBwcm94eV9ieXBhc3MocmVxLmhvc3QpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBpZiB1c2VyIGFuZCBwYXNzd29yZDoKKyAgICAgICAgICAgIHVzZXJfcGFzcyA9ICclczolcycgJSAodW5xdW90ZSh1c2VyKSwgdW5xdW90ZShwYXNzd29yZCkpCisgICAgICAgICAgICBjcmVkcyA9IGJhc2U2NC5iNjRlbmNvZGUodXNlcl9wYXNzKS5zdHJpcCgpCisgICAgICAgICAgICByZXEuYWRkX2hlYWRlcignUHJveHktYXV0aG9yaXphdGlvbicsICdCYXNpYyAnICsgY3JlZHMpCisgICAgICAgIGhvc3Rwb3J0ID0gdW5xdW90ZShob3N0cG9ydCkKKyAgICAgICAgcmVxLnNldF9wcm94eShob3N0cG9ydCwgcHJveHlfdHlwZSkKKworICAgICAgICBpZiBvcmlnX3R5cGUgPT0gcHJveHlfdHlwZSBvciBvcmlnX3R5cGUgPT0gJ2h0dHBzJzoKKyAgICAgICAgICAgICMgbGV0IG90aGVyIGhhbmRsZXJzIHRha2UgY2FyZSBvZiBpdAorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgbmVlZCB0byBzdGFydCBvdmVyLCBiZWNhdXNlIHRoZSBvdGhlciBoYW5kbGVycyBkb24ndAorICAgICAgICAgICAgIyBncm9rIHRoZSBwcm94eSdzIFVSTCB0eXBlCisgICAgICAgICAgICAjIGUuZy4gaWYgd2UgaGF2ZSBhIGNvbnN0cnVjdG9yIGFyZyBwcm94aWVzIGxpa2Ugc286CisgICAgICAgICAgICAjIHsnaHR0cCc6ICdmdHA6Ly9wcm94eS5leGFtcGxlLmNvbSd9LCB3ZSBtYXkgZW5kIHVwIHR1cm5pbmcKKyAgICAgICAgICAgICMgYSByZXF1ZXN0IGZvciBodHRwOi8vYWNtZS5leGFtcGxlLmNvbS9hIGludG8gb25lIGZvcgorICAgICAgICAgICAgIyBmdHA6Ly9wcm94eS5leGFtcGxlLmNvbS9hCisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQub3BlbihyZXEsIHRpbWVvdXQ9cmVxLnRpbWVvdXQpCisKK2NsYXNzIEhUVFBQYXNzd29yZE1ncjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5wYXNzd2QgPSB7fQorCisgICAgZGVmIGFkZF9wYXNzd29yZChzZWxmLCByZWFsbSwgdXJpLCB1c2VyLCBwYXNzd2QpOgorICAgICAgICAjIHVyaSBjb3VsZCBiZSBhIHNpbmdsZSBVUkkgb3IgYSBzZXF1ZW5jZQorICAgICAgICBpZiBpc2luc3RhbmNlKHVyaSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICB1cmkgPSBbdXJpXQorICAgICAgICBpZiBub3QgcmVhbG0gaW4gc2VsZi5wYXNzd2Q6CisgICAgICAgICAgICBzZWxmLnBhc3N3ZFtyZWFsbV0gPSB7fQorICAgICAgICBmb3IgZGVmYXVsdF9wb3J0IGluIFRydWUsIEZhbHNlOgorICAgICAgICAgICAgcmVkdWNlZF91cmkgPSB0dXBsZSgKKyAgICAgICAgICAgICAgICBbc2VsZi5yZWR1Y2VfdXJpKHUsIGRlZmF1bHRfcG9ydCkgZm9yIHUgaW4gdXJpXSkKKyAgICAgICAgICAgIHNlbGYucGFzc3dkW3JlYWxtXVtyZWR1Y2VkX3VyaV0gPSAodXNlciwgcGFzc3dkKQorCisgICAgZGVmIGZpbmRfdXNlcl9wYXNzd29yZChzZWxmLCByZWFsbSwgYXV0aHVyaSk6CisgICAgICAgIGRvbWFpbnMgPSBzZWxmLnBhc3N3ZC5nZXQocmVhbG0sIHt9KQorICAgICAgICBmb3IgZGVmYXVsdF9wb3J0IGluIFRydWUsIEZhbHNlOgorICAgICAgICAgICAgcmVkdWNlZF9hdXRodXJpID0gc2VsZi5yZWR1Y2VfdXJpKGF1dGh1cmksIGRlZmF1bHRfcG9ydCkKKyAgICAgICAgICAgIGZvciB1cmlzLCBhdXRoaW5mbyBpbiBkb21haW5zLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIGZvciB1cmkgaW4gdXJpczoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5pc19zdWJ1cmkodXJpLCByZWR1Y2VkX2F1dGh1cmkpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1dGhpbmZvCisgICAgICAgIHJldHVybiBOb25lLCBOb25lCisKKyAgICBkZWYgcmVkdWNlX3VyaShzZWxmLCB1cmksIGRlZmF1bHRfcG9ydD1UcnVlKToKKyAgICAgICAgIiIiQWNjZXB0IGF1dGhvcml0eSBvciBVUkkgYW5kIGV4dHJhY3Qgb25seSB0aGUgYXV0aG9yaXR5IGFuZCBwYXRoLiIiIgorICAgICAgICAjIG5vdGUgSFRUUCBVUkxzIGRvIG5vdCBoYXZlIGEgdXNlcmluZm8gY29tcG9uZW50CisgICAgICAgIHBhcnRzID0gdXJscGFyc2UudXJsc3BsaXQodXJpKQorICAgICAgICBpZiBwYXJ0c1sxXToKKyAgICAgICAgICAgICMgVVJJCisgICAgICAgICAgICBzY2hlbWUgPSBwYXJ0c1swXQorICAgICAgICAgICAgYXV0aG9yaXR5ID0gcGFydHNbMV0KKyAgICAgICAgICAgIHBhdGggPSBwYXJ0c1syXSBvciAnLycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgaG9zdCBvciBob3N0OnBvcnQKKyAgICAgICAgICAgIHNjaGVtZSA9IE5vbmUKKyAgICAgICAgICAgIGF1dGhvcml0eSA9IHVyaQorICAgICAgICAgICAgcGF0aCA9ICcvJworICAgICAgICBob3N0LCBwb3J0ID0gc3BsaXRwb3J0KGF1dGhvcml0eSkKKyAgICAgICAgaWYgZGVmYXVsdF9wb3J0IGFuZCBwb3J0IGlzIE5vbmUgYW5kIHNjaGVtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRwb3J0ID0geyJodHRwIjogODAsCisgICAgICAgICAgICAgICAgICAgICAiaHR0cHMiOiA0NDMsCisgICAgICAgICAgICAgICAgICAgICB9LmdldChzY2hlbWUpCisgICAgICAgICAgICBpZiBkcG9ydCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBhdXRob3JpdHkgPSAiJXM6JWQiICUgKGhvc3QsIGRwb3J0KQorICAgICAgICByZXR1cm4gYXV0aG9yaXR5LCBwYXRoCisKKyAgICBkZWYgaXNfc3VidXJpKHNlbGYsIGJhc2UsIHRlc3QpOgorICAgICAgICAiIiJDaGVjayBpZiB0ZXN0IGlzIGJlbG93IGJhc2UgaW4gYSBVUkkgdHJlZQorCisgICAgICAgIEJvdGggYXJncyBtdXN0IGJlIFVSSXMgaW4gcmVkdWNlZCBmb3JtLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgYmFzZSA9PSB0ZXN0OgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgaWYgYmFzZVswXSAhPSB0ZXN0WzBdOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGNvbW1vbiA9IHBvc2l4cGF0aC5jb21tb25wcmVmaXgoKGJhc2VbMV0sIHRlc3RbMV0pKQorICAgICAgICBpZiBsZW4oY29tbW9uKSA9PSBsZW4oYmFzZVsxXSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworCitjbGFzcyBIVFRQUGFzc3dvcmRNZ3JXaXRoRGVmYXVsdFJlYWxtKEhUVFBQYXNzd29yZE1ncik6CisKKyAgICBkZWYgZmluZF91c2VyX3Bhc3N3b3JkKHNlbGYsIHJlYWxtLCBhdXRodXJpKToKKyAgICAgICAgdXNlciwgcGFzc3dvcmQgPSBIVFRQUGFzc3dvcmRNZ3IuZmluZF91c2VyX3Bhc3N3b3JkKHNlbGYsIHJlYWxtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aHVyaSkKKyAgICAgICAgaWYgdXNlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiB1c2VyLCBwYXNzd29yZAorICAgICAgICByZXR1cm4gSFRUUFBhc3N3b3JkTWdyLmZpbmRfdXNlcl9wYXNzd29yZChzZWxmLCBOb25lLCBhdXRodXJpKQorCisKK2NsYXNzIEFic3RyYWN0QmFzaWNBdXRoSGFuZGxlcjoKKworICAgICMgWFhYIHRoaXMgYWxsb3dzIGZvciBtdWx0aXBsZSBhdXRoLXNjaGVtZXMsIGJ1dCB3aWxsIHN0dXBpZGx5IHBpY2sKKyAgICAjIHRoZSBsYXN0IG9uZSB3aXRoIGEgcmVhbG0gc3BlY2lmaWVkLgorCisgICAgIyBhbGxvdyBmb3IgZG91YmxlLSBhbmQgc2luZ2xlLXF1b3RlZCByZWFsbSB2YWx1ZXMKKyAgICAjIChzaW5nbGUgcXVvdGVzIGFyZSBhIHZpb2xhdGlvbiBvZiB0aGUgUkZDLCBidXQgYXBwZWFyIGluIHRoZSB3aWxkKQorICAgIHJ4ID0gcmUuY29tcGlsZSgnKD86LiosKSpbIFx0XSooW14gXHRdKylbIFx0XSsnCisgICAgICAgICAgICAgICAgICAgICdyZWFsbT0oWyJcJ10/KShbXiJcJ10qKVxcMicsIHJlLkkpCisKKyAgICAjIFhYWCBjb3VsZCBwcmUtZW1wdGl2ZWx5IHNlbmQgYXV0aCBpbmZvIGFscmVhZHkgYWNjZXB0ZWQgKFJGQyAyNjE3LAorICAgICMgZW5kIG9mIHNlY3Rpb24gMiwgYW5kIHNlY3Rpb24gMS4yIGltbWVkaWF0ZWx5IGFmdGVyICJjcmVkZW50aWFscyIKKyAgICAjIHByb2R1Y3Rpb24pLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhc3N3b3JkX21ncj1Ob25lKToKKyAgICAgICAgaWYgcGFzc3dvcmRfbWdyIGlzIE5vbmU6CisgICAgICAgICAgICBwYXNzd29yZF9tZ3IgPSBIVFRQUGFzc3dvcmRNZ3IoKQorICAgICAgICBzZWxmLnBhc3N3ZCA9IHBhc3N3b3JkX21ncgorICAgICAgICBzZWxmLmFkZF9wYXNzd29yZCA9IHNlbGYucGFzc3dkLmFkZF9wYXNzd29yZAorICAgICAgICBzZWxmLnJldHJpZWQgPSAwCisKKyAgICBkZWYgcmVzZXRfcmV0cnlfY291bnQoc2VsZik6CisgICAgICAgIHNlbGYucmV0cmllZCA9IDAKKworICAgIGRlZiBodHRwX2Vycm9yX2F1dGhfcmVxZWQoc2VsZiwgYXV0aHJlcSwgaG9zdCwgcmVxLCBoZWFkZXJzKToKKyAgICAgICAgIyBob3N0IG1heSBiZSBhbiBhdXRob3JpdHkgKHdpdGhvdXQgdXNlcmluZm8pIG9yIGEgVVJMIHdpdGggYW4KKyAgICAgICAgIyBhdXRob3JpdHkKKyAgICAgICAgIyBYWFggY291bGQgYmUgbXVsdGlwbGUgaGVhZGVycworICAgICAgICBhdXRocmVxID0gaGVhZGVycy5nZXQoYXV0aHJlcSwgTm9uZSkKKworICAgICAgICBpZiBzZWxmLnJldHJpZWQgPiA1OgorICAgICAgICAgICAgIyByZXRyeSBzZW5kaW5nIHRoZSB1c2VybmFtZTpwYXNzd29yZCA1IHRpbWVzIGJlZm9yZSBmYWlsaW5nLgorICAgICAgICAgICAgcmFpc2UgSFRUUEVycm9yKHJlcS5nZXRfZnVsbF91cmwoKSwgNDAxLCAiYmFzaWMgYXV0aCBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsIE5vbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJldHJpZWQgKz0gMQorCisgICAgICAgIGlmIGF1dGhyZXE6CisgICAgICAgICAgICBtbyA9IEFic3RyYWN0QmFzaWNBdXRoSGFuZGxlci5yeC5zZWFyY2goYXV0aHJlcSkKKyAgICAgICAgICAgIGlmIG1vOgorICAgICAgICAgICAgICAgIHNjaGVtZSwgcXVvdGUsIHJlYWxtID0gbW8uZ3JvdXBzKCkKKyAgICAgICAgICAgICAgICBpZiBxdW90ZSBub3QgaW4gWyciJywgIiciXToKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiQmFzaWMgQXV0aCBSZWFsbSB3YXMgdW5xdW90ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJXYXJuaW5nLCAyKQorICAgICAgICAgICAgICAgIGlmIHNjaGVtZS5sb3dlcigpID09ICdiYXNpYyc6CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXRyeV9odHRwX2Jhc2ljX2F1dGgoaG9zdCwgcmVxLCByZWFsbSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzcG9uc2UgYW5kIHJlc3BvbnNlLmNvZGUgIT0gNDAxOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXRyaWVkID0gMAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworICAgIGRlZiByZXRyeV9odHRwX2Jhc2ljX2F1dGgoc2VsZiwgaG9zdCwgcmVxLCByZWFsbSk6CisgICAgICAgIHVzZXIsIHB3ID0gc2VsZi5wYXNzd2QuZmluZF91c2VyX3Bhc3N3b3JkKHJlYWxtLCBob3N0KQorICAgICAgICBpZiBwdyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhdyA9ICIlczolcyIgJSAodXNlciwgcHcpCisgICAgICAgICAgICBhdXRoID0gJ0Jhc2ljICVzJyAlIGJhc2U2NC5iNjRlbmNvZGUocmF3KS5zdHJpcCgpCisgICAgICAgICAgICBpZiByZXEuaGVhZGVycy5nZXQoc2VsZi5hdXRoX2hlYWRlciwgTm9uZSkgPT0gYXV0aDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKHNlbGYuYXV0aF9oZWFkZXIsIGF1dGgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQub3BlbihyZXEsIHRpbWVvdXQ9cmVxLnRpbWVvdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIEhUVFBCYXNpY0F1dGhIYW5kbGVyKEFic3RyYWN0QmFzaWNBdXRoSGFuZGxlciwgQmFzZUhhbmRsZXIpOgorCisgICAgYXV0aF9oZWFkZXIgPSAnQXV0aG9yaXphdGlvbicKKworICAgIGRlZiBodHRwX2Vycm9yXzQwMShzZWxmLCByZXEsIGZwLCBjb2RlLCBtc2csIGhlYWRlcnMpOgorICAgICAgICB1cmwgPSByZXEuZ2V0X2Z1bGxfdXJsKCkKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmh0dHBfZXJyb3JfYXV0aF9yZXFlZCgnd3d3LWF1dGhlbnRpY2F0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsLCByZXEsIGhlYWRlcnMpCisgICAgICAgIHNlbGYucmVzZXRfcmV0cnlfY291bnQoKQorICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworCitjbGFzcyBQcm94eUJhc2ljQXV0aEhhbmRsZXIoQWJzdHJhY3RCYXNpY0F1dGhIYW5kbGVyLCBCYXNlSGFuZGxlcik6CisKKyAgICBhdXRoX2hlYWRlciA9ICdQcm94eS1hdXRob3JpemF0aW9uJworCisgICAgZGVmIGh0dHBfZXJyb3JfNDA3KHNlbGYsIHJlcSwgZnAsIGNvZGUsIG1zZywgaGVhZGVycyk6CisgICAgICAgICMgaHR0cF9lcnJvcl9hdXRoX3JlcWVkIHJlcXVpcmVzIHRoYXQgdGhlcmUgaXMgbm8gdXNlcmluZm8gY29tcG9uZW50IGluCisgICAgICAgICMgYXV0aG9yaXR5LiAgQXNzdW1lIHRoZXJlIGlzbid0IG9uZSwgc2luY2UgdXJsbGliMiBkb2VzIG5vdCAoYW5kCisgICAgICAgICMgc2hvdWxkIG5vdCwgUkZDIDM5ODYgcy4gMy4yLjEpIHN1cHBvcnQgcmVxdWVzdHMgZm9yIFVSTHMgY29udGFpbmluZworICAgICAgICAjIHVzZXJpbmZvLgorICAgICAgICBhdXRob3JpdHkgPSByZXEuZ2V0X2hvc3QoKQorICAgICAgICByZXNwb25zZSA9IHNlbGYuaHR0cF9lcnJvcl9hdXRoX3JlcWVkKCdwcm94eS1hdXRoZW50aWNhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5LCByZXEsIGhlYWRlcnMpCisgICAgICAgIHNlbGYucmVzZXRfcmV0cnlfY291bnQoKQorICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworCitkZWYgcmFuZG9tYnl0ZXMobik6CisgICAgIiIiUmV0dXJuIG4gcmFuZG9tIGJ5dGVzLiIiIgorICAgICMgVXNlIC9kZXYvdXJhbmRvbSBpZiBpdCBpcyBhdmFpbGFibGUuICBGYWxsIGJhY2sgdG8gcmFuZG9tIG1vZHVsZQorICAgICMgaWYgbm90LiAgSXQgbWlnaHQgYmUgd29ydGh3aGlsZSB0byBleHRlbmQgdGhpcyBmdW5jdGlvbiB0byB1c2UKKyAgICAjIG90aGVyIHBsYXRmb3JtLXNwZWNpZmljIG1lY2hhbmlzbXMgZm9yIGdldHRpbmcgcmFuZG9tIGJ5dGVzLgorICAgIGlmIG9zLnBhdGguZXhpc3RzKCIvZGV2L3VyYW5kb20iKToKKyAgICAgICAgZiA9IG9wZW4oIi9kZXYvdXJhbmRvbSIpCisgICAgICAgIHMgPSBmLnJlYWQobikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHJldHVybiBzCisgICAgZWxzZToKKyAgICAgICAgTCA9IFtjaHIocmFuZG9tLnJhbmRyYW5nZSgwLCAyNTYpKSBmb3IgaSBpbiByYW5nZShuKV0KKyAgICAgICAgcmV0dXJuICIiLmpvaW4oTCkKKworY2xhc3MgQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlcjoKKyAgICAjIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBpcyBzcGVjaWZpZWQgaW4gUkZDIDI2MTcuCisKKyAgICAjIFhYWCBUaGUgY2xpZW50IGRvZXMgbm90IGluc3BlY3QgdGhlIEF1dGhlbnRpY2F0aW9uLUluZm8gaGVhZGVyCisgICAgIyBpbiBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UuCisKKyAgICAjIFhYWCBJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gdGVzdCB0aGlzIGltcGxlbWVudGF0aW9uIGFnYWluc3QKKyAgICAjIGEgbW9jayBzZXJ2ZXIgdGhhdCBqdXN0IGdlbmVyYXRlcyBhIHN0YXRpYyBzZXQgb2YgY2hhbGxlbmdlcy4KKworICAgICMgWFhYIHFvcD0iYXV0aC1pbnQiIHN1cHBvcnRzIGlzIHNoYWt5CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFzc3dkPU5vbmUpOgorICAgICAgICBpZiBwYXNzd2QgaXMgTm9uZToKKyAgICAgICAgICAgIHBhc3N3ZCA9IEhUVFBQYXNzd29yZE1ncigpCisgICAgICAgIHNlbGYucGFzc3dkID0gcGFzc3dkCisgICAgICAgIHNlbGYuYWRkX3Bhc3N3b3JkID0gc2VsZi5wYXNzd2QuYWRkX3Bhc3N3b3JkCisgICAgICAgIHNlbGYucmV0cmllZCA9IDAKKyAgICAgICAgc2VsZi5ub25jZV9jb3VudCA9IDAKKyAgICAgICAgc2VsZi5sYXN0X25vbmNlID0gTm9uZQorCisgICAgZGVmIHJlc2V0X3JldHJ5X2NvdW50KHNlbGYpOgorICAgICAgICBzZWxmLnJldHJpZWQgPSAwCisKKyAgICBkZWYgaHR0cF9lcnJvcl9hdXRoX3JlcWVkKHNlbGYsIGF1dGhfaGVhZGVyLCBob3N0LCByZXEsIGhlYWRlcnMpOgorICAgICAgICBhdXRocmVxID0gaGVhZGVycy5nZXQoYXV0aF9oZWFkZXIsIE5vbmUpCisgICAgICAgIGlmIHNlbGYucmV0cmllZCA+IDU6CisgICAgICAgICAgICAjIERvbid0IGZhaWwgZW5kbGVzc2x5IC0gaWYgd2UgZmFpbGVkIG9uY2UsIHdlJ2xsIHByb2JhYmx5CisgICAgICAgICAgICAjIGZhaWwgYSBzZWNvbmQgdGltZS4gSG0uIFVubGVzcyB0aGUgUGFzc3dvcmQgTWFuYWdlciBpcworICAgICAgICAgICAgIyBwcm9tcHRpbmcgZm9yIHRoZSBpbmZvcm1hdGlvbi4gQ3JhcC4gVGhpcyBpc24ndCBncmVhdAorICAgICAgICAgICAgIyBidXQgaXQncyBiZXR0ZXIgdGhhbiB0aGUgY3VycmVudCAncmVwZWF0IHVudGlsIHJlY3Vyc2lvbgorICAgICAgICAgICAgIyBkZXB0aCBleGNlZWRlZCcgYXBwcm9hY2ggPHdpbms+CisgICAgICAgICAgICByYWlzZSBIVFRQRXJyb3IocmVxLmdldF9mdWxsX3VybCgpLCA0MDEsICJkaWdlc3QgYXV0aCBmYWlsZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsIE5vbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJldHJpZWQgKz0gMQorICAgICAgICBpZiBhdXRocmVxOgorICAgICAgICAgICAgc2NoZW1lID0gYXV0aHJlcS5zcGxpdCgpWzBdCisgICAgICAgICAgICBpZiBzY2hlbWUubG93ZXIoKSA9PSAnZGlnZXN0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXRyeV9odHRwX2RpZ2VzdF9hdXRoKHJlcSwgYXV0aHJlcSkKKworICAgIGRlZiByZXRyeV9odHRwX2RpZ2VzdF9hdXRoKHNlbGYsIHJlcSwgYXV0aCk6CisgICAgICAgIHRva2VuLCBjaGFsbGVuZ2UgPSBhdXRoLnNwbGl0KCcgJywgMSkKKyAgICAgICAgY2hhbCA9IHBhcnNlX2tlcXZfbGlzdChwYXJzZV9odHRwX2xpc3QoY2hhbGxlbmdlKSkKKyAgICAgICAgYXV0aCA9IHNlbGYuZ2V0X2F1dGhvcml6YXRpb24ocmVxLCBjaGFsKQorICAgICAgICBpZiBhdXRoOgorICAgICAgICAgICAgYXV0aF92YWwgPSAnRGlnZXN0ICVzJyAlIGF1dGgKKyAgICAgICAgICAgIGlmIHJlcS5oZWFkZXJzLmdldChzZWxmLmF1dGhfaGVhZGVyLCBOb25lKSA9PSBhdXRoX3ZhbDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKHNlbGYuYXV0aF9oZWFkZXIsIGF1dGhfdmFsKQorICAgICAgICAgICAgcmVzcCA9IHNlbGYucGFyZW50Lm9wZW4ocmVxLCB0aW1lb3V0PXJlcS50aW1lb3V0KQorICAgICAgICAgICAgcmV0dXJuIHJlc3AKKworICAgIGRlZiBnZXRfY25vbmNlKHNlbGYsIG5vbmNlKToKKyAgICAgICAgIyBUaGUgY25vbmNlLXZhbHVlIGlzIGFuIG9wYXF1ZQorICAgICAgICAjIHF1b3RlZCBzdHJpbmcgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBhbmQgdXNlZCBieSBib3RoIGNsaWVudAorICAgICAgICAjIGFuZCBzZXJ2ZXIgdG8gYXZvaWQgY2hvc2VuIHBsYWludGV4dCBhdHRhY2tzLCB0byBwcm92aWRlIG11dHVhbAorICAgICAgICAjIGF1dGhlbnRpY2F0aW9uLCBhbmQgdG8gcHJvdmlkZSBzb21lIG1lc3NhZ2UgaW50ZWdyaXR5IHByb3RlY3Rpb24uCisgICAgICAgICMgVGhpcyBpc24ndCBhIGZhYnVsb3VzIGVmZm9ydCwgYnV0IGl0J3MgcHJvYmFibHkgR29vZCBFbm91Z2guCisgICAgICAgIGRpZyA9IGhhc2hsaWIuc2hhMSgiJXM6JXM6JXM6JXMiICUgKHNlbGYubm9uY2VfY291bnQsIG5vbmNlLCB0aW1lLmN0aW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbWJ5dGVzKDgpKSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgcmV0dXJuIGRpZ1s6MTZdCisKKyAgICBkZWYgZ2V0X2F1dGhvcml6YXRpb24oc2VsZiwgcmVxLCBjaGFsKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVhbG0gPSBjaGFsWydyZWFsbSddCisgICAgICAgICAgICBub25jZSA9IGNoYWxbJ25vbmNlJ10KKyAgICAgICAgICAgIHFvcCA9IGNoYWwuZ2V0KCdxb3AnKQorICAgICAgICAgICAgYWxnb3JpdGhtID0gY2hhbC5nZXQoJ2FsZ29yaXRobScsICdNRDUnKQorICAgICAgICAgICAgIyBtb2RfZGlnZXN0IGRvZXNuJ3Qgc2VuZCBhbiBvcGFxdWUsIGV2ZW4gdGhvdWdoIGl0IGlzbid0CisgICAgICAgICAgICAjIHN1cHBvc2VkIHRvIGJlIG9wdGlvbmFsCisgICAgICAgICAgICBvcGFxdWUgPSBjaGFsLmdldCgnb3BhcXVlJywgTm9uZSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBILCBLRCA9IHNlbGYuZ2V0X2FsZ29yaXRobV9pbXBscyhhbGdvcml0aG0pCisgICAgICAgIGlmIEggaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgdXNlciwgcHcgPSBzZWxmLnBhc3N3ZC5maW5kX3VzZXJfcGFzc3dvcmQocmVhbG0sIHJlcS5nZXRfZnVsbF91cmwoKSkKKyAgICAgICAgaWYgdXNlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIFhYWCBub3QgaW1wbGVtZW50ZWQgeWV0CisgICAgICAgIGlmIHJlcS5oYXNfZGF0YSgpOgorICAgICAgICAgICAgZW50ZGlnID0gc2VsZi5nZXRfZW50aXR5X2RpZ2VzdChyZXEuZ2V0X2RhdGEoKSwgY2hhbCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVudGRpZyA9IE5vbmUKKworICAgICAgICBBMSA9ICIlczolczolcyIgJSAodXNlciwgcmVhbG0sIHB3KQorICAgICAgICBBMiA9ICIlczolcyIgJSAocmVxLmdldF9tZXRob2QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICMgWFhYIHNlbGVjdG9yOiB3aGF0IGFib3V0IHByb3hpZXMgYW5kIGZ1bGwgdXJscworICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldF9zZWxlY3RvcigpKQorICAgICAgICBpZiBxb3AgPT0gJ2F1dGgnOgorICAgICAgICAgICAgaWYgbm9uY2UgPT0gc2VsZi5sYXN0X25vbmNlOgorICAgICAgICAgICAgICAgIHNlbGYubm9uY2VfY291bnQgKz0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLm5vbmNlX2NvdW50ID0gMQorICAgICAgICAgICAgICAgIHNlbGYubGFzdF9ub25jZSA9IG5vbmNlCisKKyAgICAgICAgICAgIG5jdmFsdWUgPSAnJTA4eCcgJSBzZWxmLm5vbmNlX2NvdW50CisgICAgICAgICAgICBjbm9uY2UgPSBzZWxmLmdldF9jbm9uY2Uobm9uY2UpCisgICAgICAgICAgICBub25jZWJpdCA9ICIlczolczolczolczolcyIgJSAobm9uY2UsIG5jdmFsdWUsIGNub25jZSwgcW9wLCBIKEEyKSkKKyAgICAgICAgICAgIHJlc3BkaWcgPSBLRChIKEExKSwgbm9uY2ViaXQpCisgICAgICAgIGVsaWYgcW9wIGlzIE5vbmU6CisgICAgICAgICAgICByZXNwZGlnID0gS0QoSChBMSksICIlczolcyIgJSAobm9uY2UsIEgoQTIpKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgWFhYIGhhbmRsZSBhdXRoLWludC4KKyAgICAgICAgICAgIHJhaXNlIFVSTEVycm9yKCJxb3AgJyVzJyBpcyBub3Qgc3VwcG9ydGVkLiIgJSBxb3ApCisKKyAgICAgICAgIyBYWFggc2hvdWxkIHRoZSBwYXJ0aWFsIGRpZ2VzdHMgYmUgZW5jb2RlZCB0b28/CisKKyAgICAgICAgYmFzZSA9ICd1c2VybmFtZT0iJXMiLCByZWFsbT0iJXMiLCBub25jZT0iJXMiLCB1cmk9IiVzIiwgJyBcCisgICAgICAgICAgICAgICAncmVzcG9uc2U9IiVzIicgJSAodXNlciwgcmVhbG0sIG5vbmNlLCByZXEuZ2V0X3NlbGVjdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcGRpZykKKyAgICAgICAgaWYgb3BhcXVlOgorICAgICAgICAgICAgYmFzZSArPSAnLCBvcGFxdWU9IiVzIicgJSBvcGFxdWUKKyAgICAgICAgaWYgZW50ZGlnOgorICAgICAgICAgICAgYmFzZSArPSAnLCBkaWdlc3Q9IiVzIicgJSBlbnRkaWcKKyAgICAgICAgYmFzZSArPSAnLCBhbGdvcml0aG09IiVzIicgJSBhbGdvcml0aG0KKyAgICAgICAgaWYgcW9wOgorICAgICAgICAgICAgYmFzZSArPSAnLCBxb3A9YXV0aCwgbmM9JXMsIGNub25jZT0iJXMiJyAlIChuY3ZhbHVlLCBjbm9uY2UpCisgICAgICAgIHJldHVybiBiYXNlCisKKyAgICBkZWYgZ2V0X2FsZ29yaXRobV9pbXBscyhzZWxmLCBhbGdvcml0aG0pOgorICAgICAgICAjIGFsZ29yaXRobSBzaG91bGQgYmUgY2FzZS1pbnNlbnNpdGl2ZSBhY2NvcmRpbmcgdG8gUkZDMjYxNworICAgICAgICBhbGdvcml0aG0gPSBhbGdvcml0aG0udXBwZXIoKQorICAgICAgICAjIGxhbWJkYXMgYXNzdW1lIGRpZ2VzdCBtb2R1bGVzIGFyZSBpbXBvcnRlZCBhdCB0aGUgdG9wIGxldmVsCisgICAgICAgIGlmIGFsZ29yaXRobSA9PSAnTUQ1JzoKKyAgICAgICAgICAgIEggPSBsYW1iZGEgeDogaGFzaGxpYi5tZDUoeCkuaGV4ZGlnZXN0KCkKKyAgICAgICAgZWxpZiBhbGdvcml0aG0gPT0gJ1NIQSc6CisgICAgICAgICAgICBIID0gbGFtYmRhIHg6IGhhc2hsaWIuc2hhMSh4KS5oZXhkaWdlc3QoKQorICAgICAgICAjIFhYWCBNRDUtc2VzcworICAgICAgICBLRCA9IGxhbWJkYSBzLCBkOiBIKCIlczolcyIgJSAocywgZCkpCisgICAgICAgIHJldHVybiBILCBLRAorCisgICAgZGVmIGdldF9lbnRpdHlfZGlnZXN0KHNlbGYsIGRhdGEsIGNoYWwpOgorICAgICAgICAjIFhYWCBub3QgaW1wbGVtZW50ZWQgeWV0CisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgSFRUUERpZ2VzdEF1dGhIYW5kbGVyKEJhc2VIYW5kbGVyLCBBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyKToKKyAgICAiIiJBbiBhdXRoZW50aWNhdGlvbiBwcm90b2NvbCBkZWZpbmVkIGJ5IFJGQyAyMDY5CisKKyAgICBEaWdlc3QgYXV0aGVudGljYXRpb24gaW1wcm92ZXMgb24gYmFzaWMgYXV0aGVudGljYXRpb24gYmVjYXVzZSBpdAorICAgIGRvZXMgbm90IHRyYW5zbWl0IHBhc3N3b3JkcyBpbiB0aGUgY2xlYXIuCisgICAgIiIiCisKKyAgICBhdXRoX2hlYWRlciA9ICdBdXRob3JpemF0aW9uJworICAgIGhhbmRsZXJfb3JkZXIgPSA0OTAgICMgYmVmb3JlIEJhc2ljIGF1dGgKKworICAgIGRlZiBodHRwX2Vycm9yXzQwMShzZWxmLCByZXEsIGZwLCBjb2RlLCBtc2csIGhlYWRlcnMpOgorICAgICAgICBob3N0ID0gdXJscGFyc2UudXJscGFyc2UocmVxLmdldF9mdWxsX3VybCgpKVsxXQorICAgICAgICByZXRyeSA9IHNlbGYuaHR0cF9lcnJvcl9hdXRoX3JlcWVkKCd3d3ctYXV0aGVudGljYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0LCByZXEsIGhlYWRlcnMpCisgICAgICAgIHNlbGYucmVzZXRfcmV0cnlfY291bnQoKQorICAgICAgICByZXR1cm4gcmV0cnkKKworCitjbGFzcyBQcm94eURpZ2VzdEF1dGhIYW5kbGVyKEJhc2VIYW5kbGVyLCBBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyKToKKworICAgIGF1dGhfaGVhZGVyID0gJ1Byb3h5LUF1dGhvcml6YXRpb24nCisgICAgaGFuZGxlcl9vcmRlciA9IDQ5MCAgIyBiZWZvcmUgQmFzaWMgYXV0aAorCisgICAgZGVmIGh0dHBfZXJyb3JfNDA3KHNlbGYsIHJlcSwgZnAsIGNvZGUsIG1zZywgaGVhZGVycyk6CisgICAgICAgIGhvc3QgPSByZXEuZ2V0X2hvc3QoKQorICAgICAgICByZXRyeSA9IHNlbGYuaHR0cF9lcnJvcl9hdXRoX3JlcWVkKCdwcm94eS1hdXRoZW50aWNhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QsIHJlcSwgaGVhZGVycykKKyAgICAgICAgc2VsZi5yZXNldF9yZXRyeV9jb3VudCgpCisgICAgICAgIHJldHVybiByZXRyeQorCitjbGFzcyBBYnN0cmFjdEhUVFBIYW5kbGVyKEJhc2VIYW5kbGVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWJ1Z2xldmVsPTApOgorICAgICAgICBzZWxmLl9kZWJ1Z2xldmVsID0gZGVidWdsZXZlbAorCisgICAgZGVmIHNldF9odHRwX2RlYnVnbGV2ZWwoc2VsZiwgbGV2ZWwpOgorICAgICAgICBzZWxmLl9kZWJ1Z2xldmVsID0gbGV2ZWwKKworICAgIGRlZiBkb19yZXF1ZXN0XyhzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgaG9zdCA9IHJlcXVlc3QuZ2V0X2hvc3QoKQorICAgICAgICBpZiBub3QgaG9zdDoKKyAgICAgICAgICAgIHJhaXNlIFVSTEVycm9yKCdubyBob3N0IGdpdmVuJykKKworICAgICAgICBpZiByZXF1ZXN0Lmhhc19kYXRhKCk6ICAjIFBPU1QKKyAgICAgICAgICAgIGRhdGEgPSByZXF1ZXN0LmdldF9kYXRhKCkKKyAgICAgICAgICAgIGlmIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoJ0NvbnRlbnQtdHlwZScpOgorICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICdDb250ZW50LXR5cGUnLAorICAgICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykKKyAgICAgICAgICAgIGlmIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoJ0NvbnRlbnQtbGVuZ3RoJyk6CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtbGVuZ3RoJywgJyVkJyAlIGxlbihkYXRhKSkKKworICAgICAgICBzZWxfaG9zdCA9IGhvc3QKKyAgICAgICAgaWYgcmVxdWVzdC5oYXNfcHJveHkoKToKKyAgICAgICAgICAgIHNjaGVtZSwgc2VsID0gc3BsaXR0eXBlKHJlcXVlc3QuZ2V0X3NlbGVjdG9yKCkpCisgICAgICAgICAgICBzZWxfaG9zdCwgc2VsX3BhdGggPSBzcGxpdGhvc3Qoc2VsKQorCisgICAgICAgIGlmIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoJ0hvc3QnKToKKyAgICAgICAgICAgIHJlcXVlc3QuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoJ0hvc3QnLCBzZWxfaG9zdCkKKyAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNlbGYucGFyZW50LmFkZGhlYWRlcnM6CisgICAgICAgICAgICBuYW1lID0gbmFtZS5jYXBpdGFsaXplKCkKKyAgICAgICAgICAgIGlmIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIobmFtZSk6CisgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcihuYW1lLCB2YWx1ZSkKKworICAgICAgICByZXR1cm4gcmVxdWVzdAorCisgICAgZGVmIGRvX29wZW4oc2VsZiwgaHR0cF9jbGFzcywgcmVxKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGFkZGluZm91cmwgb2JqZWN0IGZvciB0aGUgcmVxdWVzdCwgdXNpbmcgaHR0cF9jbGFzcy4KKworICAgICAgICBodHRwX2NsYXNzIG11c3QgaW1wbGVtZW50IHRoZSBIVFRQQ29ubmVjdGlvbiBBUEkgZnJvbSBodHRwbGliLgorICAgICAgICBUaGUgYWRkaW5mb3VybCByZXR1cm4gdmFsdWUgaXMgYSBmaWxlLWxpa2Ugb2JqZWN0LiAgSXQgYWxzbworICAgICAgICBoYXMgbWV0aG9kcyBhbmQgYXR0cmlidXRlcyBpbmNsdWRpbmc6CisgICAgICAgICAgICAtIGluZm8oKTogcmV0dXJuIGEgbWltZXRvb2xzLk1lc3NhZ2Ugb2JqZWN0IGZvciB0aGUgaGVhZGVycworICAgICAgICAgICAgLSBnZXR1cmwoKTogcmV0dXJuIHRoZSBvcmlnaW5hbCByZXF1ZXN0IFVSTAorICAgICAgICAgICAgLSBjb2RlOiBIVFRQIHN0YXR1cyBjb2RlCisgICAgICAgICIiIgorICAgICAgICBob3N0ID0gcmVxLmdldF9ob3N0KCkKKyAgICAgICAgaWYgbm90IGhvc3Q6CisgICAgICAgICAgICByYWlzZSBVUkxFcnJvcignbm8gaG9zdCBnaXZlbicpCisKKyAgICAgICAgaCA9IGh0dHBfY2xhc3MoaG9zdCwgdGltZW91dD1yZXEudGltZW91dCkgIyB3aWxsIHBhcnNlIGhvc3Q6cG9ydAorICAgICAgICBoLnNldF9kZWJ1Z2xldmVsKHNlbGYuX2RlYnVnbGV2ZWwpCisKKyAgICAgICAgaGVhZGVycyA9IGRpY3QocmVxLnVucmVkaXJlY3RlZF9oZHJzKQorICAgICAgICBoZWFkZXJzLnVwZGF0ZShkaWN0KChrLCB2KSBmb3IgaywgdiBpbiByZXEuaGVhZGVycy5pdGVtcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgayBub3QgaW4gaGVhZGVycykpCisKKyAgICAgICAgIyBXZSB3YW50IHRvIG1ha2UgYW4gSFRUUC8xLjEgcmVxdWVzdCwgYnV0IHRoZSBhZGRpbmZvdXJsCisgICAgICAgICMgY2xhc3MgaXNuJ3QgcHJlcGFyZWQgdG8gZGVhbCB3aXRoIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLgorICAgICAgICAjIEl0IHdpbGwgdHJ5IHRvIHJlYWQgYWxsIHJlbWFpbmluZyBkYXRhIGZyb20gdGhlIHNvY2tldCwKKyAgICAgICAgIyB3aGljaCB3aWxsIGJsb2NrIHdoaWxlIHRoZSBzZXJ2ZXIgd2FpdHMgZm9yIHRoZSBuZXh0IHJlcXVlc3QuCisgICAgICAgICMgU28gbWFrZSBzdXJlIHRoZSBjb25uZWN0aW9uIGdldHMgY2xvc2VkIGFmdGVyIHRoZSAob25seSkKKyAgICAgICAgIyByZXF1ZXN0LgorICAgICAgICBoZWFkZXJzWyJDb25uZWN0aW9uIl0gPSAiY2xvc2UiCisgICAgICAgIGhlYWRlcnMgPSBkaWN0KAorICAgICAgICAgICAgKG5hbWUudGl0bGUoKSwgdmFsKSBmb3IgbmFtZSwgdmFsIGluIGhlYWRlcnMuaXRlbXMoKSkKKworICAgICAgICBpZiByZXEuX3R1bm5lbF9ob3N0OgorICAgICAgICAgICAgdHVubmVsX2hlYWRlcnMgPSB7fQorICAgICAgICAgICAgcHJveHlfYXV0aF9oZHIgPSAiUHJveHktQXV0aG9yaXphdGlvbiIKKyAgICAgICAgICAgIGlmIHByb3h5X2F1dGhfaGRyIGluIGhlYWRlcnM6CisgICAgICAgICAgICAgICAgdHVubmVsX2hlYWRlcnNbcHJveHlfYXV0aF9oZHJdID0gaGVhZGVyc1twcm94eV9hdXRoX2hkcl0KKyAgICAgICAgICAgICAgICAjIFByb3h5LUF1dGhvcml6YXRpb24gc2hvdWxkIG5vdCBiZSBzZW50IHRvIG9yaWdpbgorICAgICAgICAgICAgICAgICMgc2VydmVyLgorICAgICAgICAgICAgICAgIGRlbCBoZWFkZXJzW3Byb3h5X2F1dGhfaGRyXQorICAgICAgICAgICAgaC5zZXRfdHVubmVsKHJlcS5fdHVubmVsX2hvc3QsIGhlYWRlcnM9dHVubmVsX2hlYWRlcnMpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaC5yZXF1ZXN0KHJlcS5nZXRfbWV0aG9kKCksIHJlcS5nZXRfc2VsZWN0b3IoKSwgcmVxLmRhdGEsIGhlYWRlcnMpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGVycjogIyBYWFggd2hhdCBlcnJvcj8KKyAgICAgICAgICAgIGguY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UgVVJMRXJyb3IoZXJyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHIgPSBoLmdldHJlc3BvbnNlKGJ1ZmZlcmluZz1UcnVlKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogIyBidWZmZXJpbmcga3cgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgIHIgPSBoLmdldHJlc3BvbnNlKCkKKworICAgICAgICAjIFBpY2sgYXBhcnQgdGhlIEhUVFBSZXNwb25zZSBvYmplY3QgdG8gZ2V0IHRoZSBhZGRpbmZvdXJsCisgICAgICAgICMgb2JqZWN0IGluaXRpYWxpemVkIHByb3Blcmx5LgorCisgICAgICAgICMgV3JhcCB0aGUgSFRUUFJlc3BvbnNlIG9iamVjdCBpbiBzb2NrZXQncyBmaWxlIG9iamVjdCBhZGFwdGVyCisgICAgICAgICMgZm9yIFdpbmRvd3MuICBUaGF0IGFkYXB0ZXIgY2FsbHMgcmVjdigpLCBzbyBkZWxlZ2F0ZSByZWN2KCkKKyAgICAgICAgIyB0byByZWFkKCkuICBUaGlzIHdlaXJkIHdyYXBwaW5nIGFsbG93cyB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvCisgICAgICAgICMgaGF2ZSByZWFkbGluZSgpIGFuZCByZWFkbGluZXMoKSBtZXRob2RzLgorCisgICAgICAgICMgWFhYIEl0IG1pZ2h0IGJlIGJldHRlciB0byBleHRyYWN0IHRoZSByZWFkIGJ1ZmZlcmluZyBjb2RlCisgICAgICAgICMgb3V0IG9mIHNvY2tldC5fZmlsZW9iamVjdCgpIGFuZCBpbnRvIGEgYmFzZSBjbGFzcy4KKworICAgICAgICByLnJlY3YgPSByLnJlYWQKKyAgICAgICAgZnAgPSBzb2NrZXQuX2ZpbGVvYmplY3QociwgY2xvc2U9VHJ1ZSkKKworICAgICAgICByZXNwID0gYWRkaW5mb3VybChmcCwgci5tc2csIHJlcS5nZXRfZnVsbF91cmwoKSkKKyAgICAgICAgcmVzcC5jb2RlID0gci5zdGF0dXMKKyAgICAgICAgcmVzcC5tc2cgPSByLnJlYXNvbgorICAgICAgICByZXR1cm4gcmVzcAorCisKK2NsYXNzIEhUVFBIYW5kbGVyKEFic3RyYWN0SFRUUEhhbmRsZXIpOgorCisgICAgZGVmIGh0dHBfb3BlbihzZWxmLCByZXEpOgorICAgICAgICByZXR1cm4gc2VsZi5kb19vcGVuKGh0dHBsaWIuSFRUUENvbm5lY3Rpb24sIHJlcSkKKworICAgIGh0dHBfcmVxdWVzdCA9IEFic3RyYWN0SFRUUEhhbmRsZXIuZG9fcmVxdWVzdF8KKworaWYgaGFzYXR0cihodHRwbGliLCAnSFRUUFMnKToKKyAgICBjbGFzcyBIVFRQU0hhbmRsZXIoQWJzdHJhY3RIVFRQSGFuZGxlcik6CisKKyAgICAgICAgZGVmIGh0dHBzX29wZW4oc2VsZiwgcmVxKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRvX29wZW4oaHR0cGxpYi5IVFRQU0Nvbm5lY3Rpb24sIHJlcSkKKworICAgICAgICBodHRwc19yZXF1ZXN0ID0gQWJzdHJhY3RIVFRQSGFuZGxlci5kb19yZXF1ZXN0XworCitjbGFzcyBIVFRQQ29va2llUHJvY2Vzc29yKEJhc2VIYW5kbGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29va2llamFyPU5vbmUpOgorICAgICAgICBpbXBvcnQgY29va2llbGliCisgICAgICAgIGlmIGNvb2tpZWphciBpcyBOb25lOgorICAgICAgICAgICAgY29va2llamFyID0gY29va2llbGliLkNvb2tpZUphcigpCisgICAgICAgIHNlbGYuY29va2llamFyID0gY29va2llamFyCisKKyAgICBkZWYgaHR0cF9yZXF1ZXN0KHNlbGYsIHJlcXVlc3QpOgorICAgICAgICBzZWxmLmNvb2tpZWphci5hZGRfY29va2llX2hlYWRlcihyZXF1ZXN0KQorICAgICAgICByZXR1cm4gcmVxdWVzdAorCisgICAgZGVmIGh0dHBfcmVzcG9uc2Uoc2VsZiwgcmVxdWVzdCwgcmVzcG9uc2UpOgorICAgICAgICBzZWxmLmNvb2tpZWphci5leHRyYWN0X2Nvb2tpZXMocmVzcG9uc2UsIHJlcXVlc3QpCisgICAgICAgIHJldHVybiByZXNwb25zZQorCisgICAgaHR0cHNfcmVxdWVzdCA9IGh0dHBfcmVxdWVzdAorICAgIGh0dHBzX3Jlc3BvbnNlID0gaHR0cF9yZXNwb25zZQorCitjbGFzcyBVbmtub3duSGFuZGxlcihCYXNlSGFuZGxlcik6CisgICAgZGVmIHVua25vd25fb3BlbihzZWxmLCByZXEpOgorICAgICAgICB0eXBlID0gcmVxLmdldF90eXBlKCkKKyAgICAgICAgcmFpc2UgVVJMRXJyb3IoJ3Vua25vd24gdXJsIHR5cGU6ICVzJyAlIHR5cGUpCisKK2RlZiBwYXJzZV9rZXF2X2xpc3QobCk6CisgICAgIiIiUGFyc2UgbGlzdCBvZiBrZXk9dmFsdWUgc3RyaW5ncyB3aGVyZSBrZXlzIGFyZSBub3QgZHVwbGljYXRlZC4iIiIKKyAgICBwYXJzZWQgPSB7fQorICAgIGZvciBlbHQgaW4gbDoKKyAgICAgICAgaywgdiA9IGVsdC5zcGxpdCgnPScsIDEpCisgICAgICAgIGlmIHZbMF0gPT0gJyInIGFuZCB2Wy0xXSA9PSAnIic6CisgICAgICAgICAgICB2ID0gdlsxOi0xXQorICAgICAgICBwYXJzZWRba10gPSB2CisgICAgcmV0dXJuIHBhcnNlZAorCitkZWYgcGFyc2VfaHR0cF9saXN0KHMpOgorICAgICIiIlBhcnNlIGxpc3RzIGFzIGRlc2NyaWJlZCBieSBSRkMgMjA2OCBTZWN0aW9uIDIuCisKKyAgICBJbiBwYXJ0aWN1bGFyLCBwYXJzZSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMgd2hlcmUgdGhlIGVsZW1lbnRzIG9mCisgICAgdGhlIGxpc3QgbWF5IGluY2x1ZGUgcXVvdGVkLXN0cmluZ3MuICBBIHF1b3RlZC1zdHJpbmcgY291bGQKKyAgICBjb250YWluIGEgY29tbWEuICBBIG5vbi1xdW90ZWQgc3RyaW5nIGNvdWxkIGhhdmUgcXVvdGVzIGluIHRoZQorICAgIG1pZGRsZS4gIE5laXRoZXIgY29tbWFzIG5vciBxdW90ZXMgY291bnQgaWYgdGhleSBhcmUgZXNjYXBlZC4KKyAgICBPbmx5IGRvdWJsZS1xdW90ZXMgY291bnQsIG5vdCBzaW5nbGUtcXVvdGVzLgorICAgICIiIgorICAgIHJlcyA9IFtdCisgICAgcGFydCA9ICcnCisKKyAgICBlc2NhcGUgPSBxdW90ZSA9IEZhbHNlCisgICAgZm9yIGN1ciBpbiBzOgorICAgICAgICBpZiBlc2NhcGU6CisgICAgICAgICAgICBwYXJ0ICs9IGN1cgorICAgICAgICAgICAgZXNjYXBlID0gRmFsc2UKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIHF1b3RlOgorICAgICAgICAgICAgaWYgY3VyID09ICdcXCc6CisgICAgICAgICAgICAgICAgZXNjYXBlID0gVHJ1ZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIGN1ciA9PSAnIic6CisgICAgICAgICAgICAgICAgcXVvdGUgPSBGYWxzZQorICAgICAgICAgICAgcGFydCArPSBjdXIKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgY3VyID09ICcsJzoKKyAgICAgICAgICAgIHJlcy5hcHBlbmQocGFydCkKKyAgICAgICAgICAgIHBhcnQgPSAnJworICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBjdXIgPT0gJyInOgorICAgICAgICAgICAgcXVvdGUgPSBUcnVlCisKKyAgICAgICAgcGFydCArPSBjdXIKKworICAgICMgYXBwZW5kIGxhc3QgcGFydAorICAgIGlmIHBhcnQ6CisgICAgICAgIHJlcy5hcHBlbmQocGFydCkKKworICAgIHJldHVybiBbcGFydC5zdHJpcCgpIGZvciBwYXJ0IGluIHJlc10KKworZGVmIF9zYWZlX2dldGhvc3RieW5hbWUoaG9zdCk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gc29ja2V0LmdldGhvc3RieW5hbWUoaG9zdCkKKyAgICBleGNlcHQgc29ja2V0LmdhaWVycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorCitjbGFzcyBGaWxlSGFuZGxlcihCYXNlSGFuZGxlcik6CisgICAgIyBVc2UgbG9jYWwgZmlsZSBvciBGVFAgZGVwZW5kaW5nIG9uIGZvcm0gb2YgVVJMCisgICAgZGVmIGZpbGVfb3BlbihzZWxmLCByZXEpOgorICAgICAgICB1cmwgPSByZXEuZ2V0X3NlbGVjdG9yKCkKKyAgICAgICAgaWYgdXJsWzoyXSA9PSAnLy8nIGFuZCB1cmxbMjozXSAhPSAnLycgYW5kIChyZXEuaG9zdCBhbmQKKyAgICAgICAgICAgICAgICByZXEuaG9zdCAhPSAnbG9jYWxob3N0Jyk6CisgICAgICAgICAgICByZXEudHlwZSA9ICdmdHAnCisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnQub3BlbihyZXEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGVuX2xvY2FsX2ZpbGUocmVxKQorCisgICAgIyBuYW1lcyBmb3IgdGhlIGxvY2FsaG9zdAorICAgIG5hbWVzID0gTm9uZQorICAgIGRlZiBnZXRfbmFtZXMoc2VsZik6CisgICAgICAgIGlmIEZpbGVIYW5kbGVyLm5hbWVzIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgRmlsZUhhbmRsZXIubmFtZXMgPSB0dXBsZSgKKyAgICAgICAgICAgICAgICAgICAgc29ja2V0LmdldGhvc3RieW5hbWVfZXgoJ2xvY2FsaG9zdCcpWzJdICsKKyAgICAgICAgICAgICAgICAgICAgc29ja2V0LmdldGhvc3RieW5hbWVfZXgoc29ja2V0LmdldGhvc3RuYW1lKCkpWzJdKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5nYWllcnJvcjoKKyAgICAgICAgICAgICAgICBGaWxlSGFuZGxlci5uYW1lcyA9IChzb2NrZXQuZ2V0aG9zdGJ5bmFtZSgnbG9jYWxob3N0JyksKQorICAgICAgICByZXR1cm4gRmlsZUhhbmRsZXIubmFtZXMKKworICAgICMgbm90IGVudGlyZWx5IHN1cmUgd2hhdCB0aGUgcnVsZXMgYXJlIGhlcmUKKyAgICBkZWYgb3Blbl9sb2NhbF9maWxlKHNlbGYsIHJlcSk6CisgICAgICAgIGltcG9ydCBlbWFpbC51dGlscworICAgICAgICBpbXBvcnQgbWltZXR5cGVzCisgICAgICAgIGhvc3QgPSByZXEuZ2V0X2hvc3QoKQorICAgICAgICBmaWxlbmFtZSA9IHJlcS5nZXRfc2VsZWN0b3IoKQorICAgICAgICBsb2NhbGZpbGUgPSB1cmwycGF0aG5hbWUoZmlsZW5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN0YXRzID0gb3Muc3RhdChsb2NhbGZpbGUpCisgICAgICAgICAgICBzaXplID0gc3RhdHMuc3Rfc2l6ZQorICAgICAgICAgICAgbW9kaWZpZWQgPSBlbWFpbC51dGlscy5mb3JtYXRkYXRlKHN0YXRzLnN0X210aW1lLCB1c2VnbXQ9VHJ1ZSkKKyAgICAgICAgICAgIG10eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUoZmlsZW5hbWUpWzBdCisgICAgICAgICAgICBoZWFkZXJzID0gbWltZXRvb2xzLk1lc3NhZ2UoU3RyaW5nSU8oCisgICAgICAgICAgICAgICAgJ0NvbnRlbnQtdHlwZTogJXNcbkNvbnRlbnQtbGVuZ3RoOiAlZFxuTGFzdC1tb2RpZmllZDogJXNcbicgJQorICAgICAgICAgICAgICAgIChtdHlwZSBvciAndGV4dC9wbGFpbicsIHNpemUsIG1vZGlmaWVkKSkpCisgICAgICAgICAgICBpZiBob3N0OgorICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQgPSBzcGxpdHBvcnQoaG9zdCkKKyAgICAgICAgICAgIGlmIG5vdCBob3N0IG9yIFwKKyAgICAgICAgICAgICAgICAobm90IHBvcnQgYW5kIF9zYWZlX2dldGhvc3RieW5hbWUoaG9zdCkgaW4gc2VsZi5nZXRfbmFtZXMoKSk6CisgICAgICAgICAgICAgICAgaWYgaG9zdDoKKyAgICAgICAgICAgICAgICAgICAgb3JpZ3VybCA9ICdmaWxlOi8vJyArIGhvc3QgKyBmaWxlbmFtZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG9yaWd1cmwgPSAnZmlsZTovLycgKyBmaWxlbmFtZQorICAgICAgICAgICAgICAgIHJldHVybiBhZGRpbmZvdXJsKG9wZW4obG9jYWxmaWxlLCAncmInKSwgaGVhZGVycywgb3JpZ3VybCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICMgdXJsbGliMiB1c2VycyBzaG91bGRuJ3QgZXhwZWN0IE9TRXJyb3JzIGNvbWluZyBmcm9tIHVybG9wZW4oKQorICAgICAgICAgICAgcmFpc2UgVVJMRXJyb3IobXNnKQorICAgICAgICByYWlzZSBVUkxFcnJvcignZmlsZSBub3Qgb24gbG9jYWwgaG9zdCcpCisKK2NsYXNzIEZUUEhhbmRsZXIoQmFzZUhhbmRsZXIpOgorICAgIGRlZiBmdHBfb3BlbihzZWxmLCByZXEpOgorICAgICAgICBpbXBvcnQgZnRwbGliCisgICAgICAgIGltcG9ydCBtaW1ldHlwZXMKKyAgICAgICAgaG9zdCA9IHJlcS5nZXRfaG9zdCgpCisgICAgICAgIGlmIG5vdCBob3N0OgorICAgICAgICAgICAgcmFpc2UgVVJMRXJyb3IoJ2Z0cCBlcnJvcjogbm8gaG9zdCBnaXZlbicpCisgICAgICAgIGhvc3QsIHBvcnQgPSBzcGxpdHBvcnQoaG9zdCkKKyAgICAgICAgaWYgcG9ydCBpcyBOb25lOgorICAgICAgICAgICAgcG9ydCA9IGZ0cGxpYi5GVFBfUE9SVAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcG9ydCA9IGludChwb3J0KQorCisgICAgICAgICMgdXNlcm5hbWUvcGFzc3dvcmQgaGFuZGxpbmcKKyAgICAgICAgdXNlciwgaG9zdCA9IHNwbGl0dXNlcihob3N0KQorICAgICAgICBpZiB1c2VyOgorICAgICAgICAgICAgdXNlciwgcGFzc3dkID0gc3BsaXRwYXNzd2QodXNlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhc3N3ZCA9IE5vbmUKKyAgICAgICAgaG9zdCA9IHVucXVvdGUoaG9zdCkKKyAgICAgICAgdXNlciA9IHVzZXIgb3IgJycKKyAgICAgICAgcGFzc3dkID0gcGFzc3dkIG9yICcnCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaG9zdCA9IHNvY2tldC5nZXRob3N0YnluYW1lKGhvc3QpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHJhaXNlIFVSTEVycm9yKG1zZykKKyAgICAgICAgcGF0aCwgYXR0cnMgPSBzcGxpdGF0dHIocmVxLmdldF9zZWxlY3RvcigpKQorICAgICAgICBkaXJzID0gcGF0aC5zcGxpdCgnLycpCisgICAgICAgIGRpcnMgPSBtYXAodW5xdW90ZSwgZGlycykKKyAgICAgICAgZGlycywgZmlsZSA9IGRpcnNbOi0xXSwgZGlyc1stMV0KKyAgICAgICAgaWYgZGlycyBhbmQgbm90IGRpcnNbMF06CisgICAgICAgICAgICBkaXJzID0gZGlyc1sxOl0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZncgPSBzZWxmLmNvbm5lY3RfZnRwKHVzZXIsIHBhc3N3ZCwgaG9zdCwgcG9ydCwgZGlycywgcmVxLnRpbWVvdXQpCisgICAgICAgICAgICB0eXBlID0gZmlsZSBhbmQgJ0knIG9yICdEJworICAgICAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CisgICAgICAgICAgICAgICAgYXR0ciwgdmFsdWUgPSBzcGxpdHZhbHVlKGF0dHIpCisgICAgICAgICAgICAgICAgaWYgYXR0ci5sb3dlcigpID09ICd0eXBlJyBhbmQgXAorICAgICAgICAgICAgICAgICAgIHZhbHVlIGluICgnYScsICdBJywgJ2knLCAnSScsICdkJywgJ0QnKToKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHZhbHVlLnVwcGVyKCkKKyAgICAgICAgICAgIGZwLCByZXRybGVuID0gZncucmV0cmZpbGUoZmlsZSwgdHlwZSkKKyAgICAgICAgICAgIGhlYWRlcnMgPSAiIgorICAgICAgICAgICAgbXR5cGUgPSBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShyZXEuZ2V0X2Z1bGxfdXJsKCkpWzBdCisgICAgICAgICAgICBpZiBtdHlwZToKKyAgICAgICAgICAgICAgICBoZWFkZXJzICs9ICJDb250ZW50LXR5cGU6ICVzXG4iICUgbXR5cGUKKyAgICAgICAgICAgIGlmIHJldHJsZW4gaXMgbm90IE5vbmUgYW5kIHJldHJsZW4gPj0gMDoKKyAgICAgICAgICAgICAgICBoZWFkZXJzICs9ICJDb250ZW50LWxlbmd0aDogJWRcbiIgJSByZXRybGVuCisgICAgICAgICAgICBzZiA9IFN0cmluZ0lPKGhlYWRlcnMpCisgICAgICAgICAgICBoZWFkZXJzID0gbWltZXRvb2xzLk1lc3NhZ2Uoc2YpCisgICAgICAgICAgICByZXR1cm4gYWRkaW5mb3VybChmcCwgaGVhZGVycywgcmVxLmdldF9mdWxsX3VybCgpKQorICAgICAgICBleGNlcHQgZnRwbGliLmFsbF9lcnJvcnMsIG1zZzoKKyAgICAgICAgICAgIHJhaXNlIFVSTEVycm9yLCAoJ2Z0cCBlcnJvcjogJXMnICUgbXNnKSwgc3lzLmV4Y19pbmZvKClbMl0KKworICAgIGRlZiBjb25uZWN0X2Z0cChzZWxmLCB1c2VyLCBwYXNzd2QsIGhvc3QsIHBvcnQsIGRpcnMsIHRpbWVvdXQpOgorICAgICAgICBmdyA9IGZ0cHdyYXBwZXIodXNlciwgcGFzc3dkLCBob3N0LCBwb3J0LCBkaXJzLCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVudD1GYWxzZSkKKyMjICAgICAgICBmdy5mdHAuc2V0X2RlYnVnbGV2ZWwoMSkKKyAgICAgICAgcmV0dXJuIGZ3CisKK2NsYXNzIENhY2hlRlRQSGFuZGxlcihGVFBIYW5kbGVyKToKKyAgICAjIFhYWCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgcGx1Z2dhYmxlIGNhY2hlIHN0cmF0ZWdpZXMKKyAgICAjIFhYWCB0aGlzIHN0dWZmIGlzIGRlZmluaXRlbHkgbm90IHRocmVhZCBzYWZlCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNhY2hlID0ge30KKyAgICAgICAgc2VsZi50aW1lb3V0ID0ge30KKyAgICAgICAgc2VsZi5zb29uZXN0ID0gMAorICAgICAgICBzZWxmLmRlbGF5ID0gNjAKKyAgICAgICAgc2VsZi5tYXhfY29ubnMgPSAxNgorCisgICAgZGVmIHNldFRpbWVvdXQoc2VsZiwgdCk6CisgICAgICAgIHNlbGYuZGVsYXkgPSB0CisKKyAgICBkZWYgc2V0TWF4Q29ubnMoc2VsZiwgbSk6CisgICAgICAgIHNlbGYubWF4X2Nvbm5zID0gbQorCisgICAgZGVmIGNvbm5lY3RfZnRwKHNlbGYsIHVzZXIsIHBhc3N3ZCwgaG9zdCwgcG9ydCwgZGlycywgdGltZW91dCk6CisgICAgICAgIGtleSA9IHVzZXIsIGhvc3QsIHBvcnQsICcvJy5qb2luKGRpcnMpLCB0aW1lb3V0CisgICAgICAgIGlmIGtleSBpbiBzZWxmLmNhY2hlOgorICAgICAgICAgICAgc2VsZi50aW1lb3V0W2tleV0gPSB0aW1lLnRpbWUoKSArIHNlbGYuZGVsYXkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2FjaGVba2V5XSA9IGZ0cHdyYXBwZXIodXNlciwgcGFzc3dkLCBob3N0LCBwb3J0LCBkaXJzLCB0aW1lb3V0KQorICAgICAgICAgICAgc2VsZi50aW1lb3V0W2tleV0gPSB0aW1lLnRpbWUoKSArIHNlbGYuZGVsYXkKKyAgICAgICAgc2VsZi5jaGVja19jYWNoZSgpCisgICAgICAgIHJldHVybiBzZWxmLmNhY2hlW2tleV0KKworICAgIGRlZiBjaGVja19jYWNoZShzZWxmKToKKyAgICAgICAgIyBmaXJzdCBjaGVjayBmb3Igb2xkIG9uZXMKKyAgICAgICAgdCA9IHRpbWUudGltZSgpCisgICAgICAgIGlmIHNlbGYuc29vbmVzdCA8PSB0OgorICAgICAgICAgICAgZm9yIGssIHYgaW4gc2VsZi50aW1lb3V0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgdiA8IHQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FjaGVba10uY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5jYWNoZVtrXQorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi50aW1lb3V0W2tdCisgICAgICAgIHNlbGYuc29vbmVzdCA9IG1pbihzZWxmLnRpbWVvdXQudmFsdWVzKCkpCisKKyAgICAgICAgIyB0aGVuIGNoZWNrIHRoZSBzaXplCisgICAgICAgIGlmIGxlbihzZWxmLmNhY2hlKSA9PSBzZWxmLm1heF9jb25uczoKKyAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYudGltZW91dC5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIHYgPT0gc2VsZi5zb29uZXN0OgorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5jYWNoZVtrXQorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi50aW1lb3V0W2tdCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzZWxmLnNvb25lc3QgPSBtaW4oc2VsZi50aW1lb3V0LnZhbHVlcygpKQorCisgICAgZGVmIGNsZWFyX2NhY2hlKHNlbGYpOgorICAgICAgICBmb3IgY29ubiBpbiBzZWxmLmNhY2hlLnZhbHVlcygpOgorICAgICAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgIHNlbGYuY2FjaGUuY2xlYXIoKQorICAgICAgICBzZWxmLnRpbWVvdXQuY2xlYXIoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91cmxsaWIyLnB5YyBiL2xpYi9weXRob24yLjcvdXJsbGliMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiMzQ4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXJsbGliMi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91cmxsaWIyLnB5byBiL2xpYi9weXRob24yLjcvdXJsbGliMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1NDY5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXJsbGliMi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91cmxwYXJzZS5weSBiL2xpYi9weXRob24yLjcvdXJscGFyc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNlOTgyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXJscGFyc2UucHkKQEAgLTAsMCArMSw0MjcgQEAKKyIiIlBhcnNlIChhYnNvbHV0ZSBhbmQgcmVsYXRpdmUpIFVSTHMuCisKK3VybHBhcnNlIG1vZHVsZSBpcyBiYXNlZCB1cG9uIHRoZSBmb2xsb3dpbmcgUkZDIHNwZWNpZmljYXRpb25zLgorCitSRkMgMzk4NiAoU1RENjYpOiAiVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycyIgYnkgVC4gQmVybmVycy1MZWUsIFIuIEZpZWxkaW5nCithbmQgTC4gIE1hc2ludGVyLCBKYW51YXJ5IDIwMDUuCisKK1JGQyAyNzMyIDogIkZvcm1hdCBmb3IgTGl0ZXJhbCBJUHY2IEFkZHJlc3NlcyBpbiBVUkwncyBieSBSLkhpbmRlbiwgQi5DYXJwZW50ZXIKK2FuZCBMLk1hc2ludGVyLCBEZWNlbWJlciAxOTk5LgorCitSRkMgMjM5NjogICJVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzIChVUkkpIjogR2VuZXJpYyBTeW50YXggYnkgVC4KK0Jlcm5lcnMtTGVlLCBSLiBGaWVsZGluZywgYW5kIEwuIE1hc2ludGVyLCBBdWd1c3QgMTk5OC4KKworUkZDIDIzNjg6ICJUaGUgbWFpbHRvIFVSTCBzY2hlbWUiLCBieSBQLkhvZmZtYW4gLCBMIE1hc2ludGVyLCBKLiBad2luc2tpLCBKdWx5IDE5OTguCisKK1JGQyAxODA4OiAiUmVsYXRpdmUgVW5pZm9ybSBSZXNvdXJjZSBMb2NhdG9ycyIsIGJ5IFIuIEZpZWxkaW5nLCBVQyBJcnZpbmUsIEp1bmUKKzE5OTUuCisKK1JGQyAxNzM4OiAiVW5pZm9ybSBSZXNvdXJjZSBMb2NhdG9ycyAoVVJMKSIgYnkgVC4gQmVybmVycy1MZWUsIEwuIE1hc2ludGVyLCBNLgorTWNDYWhpbGwsIERlY2VtYmVyIDE5OTQKKworUkZDIDM5ODYgaXMgY29uc2lkZXJlZCB0aGUgY3VycmVudCBzdGFuZGFyZCBhbmQgYW55IGZ1dHVyZSBjaGFuZ2VzIHRvCit1cmxwYXJzZSBtb2R1bGUgc2hvdWxkIGNvbmZvcm0gd2l0aCBpdC4gIFRoZSB1cmxwYXJzZSBtb2R1bGUgaXMKK2N1cnJlbnRseSBub3QgZW50aXJlbHkgY29tcGxpYW50IHdpdGggdGhpcyBSRkMgZHVlIHRvIGRlZmFjdG8KK3NjZW5hcmlvcyBmb3IgcGFyc2luZywgYW5kIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLCBzb21lCitwYXJzaW5nIHF1aXJrcyBmcm9tIG9sZGVyIFJGQ3MgYXJlIHJldGFpbmVkLiBUaGUgdGVzdGNhc2VzIGluCit0ZXN0X3VybHBhcnNlLnB5IHByb3ZpZGVzIGEgZ29vZCBpbmRpY2F0b3Igb2YgcGFyc2luZyBiZWhhdmlvci4KKworIiIiCisKK2ltcG9ydCByZQorCitfX2FsbF9fID0gWyJ1cmxwYXJzZSIsICJ1cmx1bnBhcnNlIiwgInVybGpvaW4iLCAidXJsZGVmcmFnIiwKKyAgICAgICAgICAgInVybHNwbGl0IiwgInVybHVuc3BsaXQiLCAicGFyc2VfcXMiLCAicGFyc2VfcXNsIl0KKworIyBBIGNsYXNzaWZpY2F0aW9uIG9mIHNjaGVtZXMgKCcnIG1lYW5zIGFwcGx5IGJ5IGRlZmF1bHQpCit1c2VzX3JlbGF0aXZlID0gWydmdHAnLCAnaHR0cCcsICdnb3BoZXInLCAnbm50cCcsICdpbWFwJywKKyAgICAgICAgICAgICAgICAgJ3dhaXMnLCAnZmlsZScsICdodHRwcycsICdzaHR0cCcsICdtbXMnLAorICAgICAgICAgICAgICAgICAncHJvc3Blcm8nLCAncnRzcCcsICdydHNwdScsICcnLCAnc2Z0cCcsCisgICAgICAgICAgICAgICAgICdzdm4nLCAnc3ZuK3NzaCddCit1c2VzX25ldGxvYyA9IFsnZnRwJywgJ2h0dHAnLCAnZ29waGVyJywgJ25udHAnLCAndGVsbmV0JywKKyAgICAgICAgICAgICAgICdpbWFwJywgJ3dhaXMnLCAnZmlsZScsICdtbXMnLCAnaHR0cHMnLCAnc2h0dHAnLAorICAgICAgICAgICAgICAgJ3NuZXdzJywgJ3Byb3NwZXJvJywgJ3J0c3AnLCAncnRzcHUnLCAncnN5bmMnLCAnJywKKyAgICAgICAgICAgICAgICdzdm4nLCAnc3ZuK3NzaCcsICdzZnRwJywnbmZzJywnZ2l0JywgJ2dpdCtzc2gnXQordXNlc19wYXJhbXMgPSBbJ2Z0cCcsICdoZGwnLCAncHJvc3Blcm8nLCAnaHR0cCcsICdpbWFwJywKKyAgICAgICAgICAgICAgICdodHRwcycsICdzaHR0cCcsICdydHNwJywgJ3J0c3B1JywgJ3NpcCcsICdzaXBzJywKKyAgICAgICAgICAgICAgICdtbXMnLCAnJywgJ3NmdHAnLCAndGVsJ10KKworIyBUaGVzZSBhcmUgbm90IGFjdHVhbGx5IHVzZWQgYW55bW9yZSwgYnV0IHNob3VsZCBzdGF5IGZvciBiYWNrd2FyZHMKKyMgY29tcGF0aWJpbGl0eS4gIChUaGV5IGFyZSB1bmRvY3VtZW50ZWQsIGJ1dCBoYXZlIGEgcHVibGljLWxvb2tpbmcgbmFtZS4pCitub25faGllcmFyY2hpY2FsID0gWydnb3BoZXInLCAnaGRsJywgJ21haWx0bycsICduZXdzJywKKyAgICAgICAgICAgICAgICAgICAgJ3RlbG5ldCcsICd3YWlzJywgJ2ltYXAnLCAnc25ld3MnLCAnc2lwJywgJ3NpcHMnXQordXNlc19xdWVyeSA9IFsnaHR0cCcsICd3YWlzJywgJ2ltYXAnLCAnaHR0cHMnLCAnc2h0dHAnLCAnbW1zJywKKyAgICAgICAgICAgICAgJ2dvcGhlcicsICdydHNwJywgJ3J0c3B1JywgJ3NpcCcsICdzaXBzJywgJyddCit1c2VzX2ZyYWdtZW50ID0gWydmdHAnLCAnaGRsJywgJ2h0dHAnLCAnZ29waGVyJywgJ25ld3MnLAorICAgICAgICAgICAgICAgICAnbm50cCcsICd3YWlzJywgJ2h0dHBzJywgJ3NodHRwJywgJ3NuZXdzJywKKyAgICAgICAgICAgICAgICAgJ2ZpbGUnLCAncHJvc3Blcm8nLCAnJ10KKworIyBDaGFyYWN0ZXJzIHZhbGlkIGluIHNjaGVtZSBuYW1lcworc2NoZW1lX2NoYXJzID0gKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKKyAgICAgICAgICAgICAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCisgICAgICAgICAgICAgICAgJzAxMjM0NTY3ODknCisgICAgICAgICAgICAgICAgJystLicpCisKK01BWF9DQUNIRV9TSVpFID0gMjAKK19wYXJzZV9jYWNoZSA9IHt9CisKK2RlZiBjbGVhcl9jYWNoZSgpOgorICAgICIiIkNsZWFyIHRoZSBwYXJzZSBjYWNoZS4iIiIKKyAgICBfcGFyc2VfY2FjaGUuY2xlYXIoKQorCisKK2NsYXNzIFJlc3VsdE1peGluKG9iamVjdCk6CisgICAgIiIiU2hhcmVkIG1ldGhvZHMgZm9yIHRoZSBwYXJzZWQgcmVzdWx0IG9iamVjdHMuIiIiCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdXNlcm5hbWUoc2VsZik6CisgICAgICAgIG5ldGxvYyA9IHNlbGYubmV0bG9jCisgICAgICAgIGlmICJAIiBpbiBuZXRsb2M6CisgICAgICAgICAgICB1c2VyaW5mbyA9IG5ldGxvYy5yc3BsaXQoIkAiLCAxKVswXQorICAgICAgICAgICAgaWYgIjoiIGluIHVzZXJpbmZvOgorICAgICAgICAgICAgICAgIHVzZXJpbmZvID0gdXNlcmluZm8uc3BsaXQoIjoiLCAxKVswXQorICAgICAgICAgICAgcmV0dXJuIHVzZXJpbmZvCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcGFzc3dvcmQoc2VsZik6CisgICAgICAgIG5ldGxvYyA9IHNlbGYubmV0bG9jCisgICAgICAgIGlmICJAIiBpbiBuZXRsb2M6CisgICAgICAgICAgICB1c2VyaW5mbyA9IG5ldGxvYy5yc3BsaXQoIkAiLCAxKVswXQorICAgICAgICAgICAgaWYgIjoiIGluIHVzZXJpbmZvOgorICAgICAgICAgICAgICAgIHJldHVybiB1c2VyaW5mby5zcGxpdCgiOiIsIDEpWzFdCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgaG9zdG5hbWUoc2VsZik6CisgICAgICAgIG5ldGxvYyA9IHNlbGYubmV0bG9jLnNwbGl0KCdAJylbLTFdCisgICAgICAgIGlmICdbJyBpbiBuZXRsb2MgYW5kICddJyBpbiBuZXRsb2M6CisgICAgICAgICAgICByZXR1cm4gbmV0bG9jLnNwbGl0KCddJylbMF1bMTpdLmxvd2VyKCkKKyAgICAgICAgZWxpZiAnOicgaW4gbmV0bG9jOgorICAgICAgICAgICAgcmV0dXJuIG5ldGxvYy5zcGxpdCgnOicpWzBdLmxvd2VyKCkKKyAgICAgICAgZWxpZiBuZXRsb2MgPT0gJyc6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG5ldGxvYy5sb3dlcigpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcG9ydChzZWxmKToKKyAgICAgICAgbmV0bG9jID0gc2VsZi5uZXRsb2Muc3BsaXQoJ0AnKVstMV0uc3BsaXQoJ10nKVstMV0KKyAgICAgICAgaWYgJzonIGluIG5ldGxvYzoKKyAgICAgICAgICAgIHBvcnQgPSBuZXRsb2Muc3BsaXQoJzonKVsxXQorICAgICAgICAgICAgcG9ydCA9IGludChwb3J0LCAxMCkKKyAgICAgICAgICAgICMgdmVyaWZ5IGxlZ2FsIHBvcnQKKyAgICAgICAgICAgIGlmICgwIDw9IHBvcnQgPD0gNjU1MzUpOgorICAgICAgICAgICAgICAgIHJldHVybiBwb3J0CisgICAgICAgIHJldHVybiBOb25lCisKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKKworY2xhc3MgU3BsaXRSZXN1bHQobmFtZWR0dXBsZSgnU3BsaXRSZXN1bHQnLCAnc2NoZW1lIG5ldGxvYyBwYXRoIHF1ZXJ5IGZyYWdtZW50JyksIFJlc3VsdE1peGluKToKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBkZWYgZ2V0dXJsKHNlbGYpOgorICAgICAgICByZXR1cm4gdXJsdW5zcGxpdChzZWxmKQorCisKK2NsYXNzIFBhcnNlUmVzdWx0KG5hbWVkdHVwbGUoJ1BhcnNlUmVzdWx0JywgJ3NjaGVtZSBuZXRsb2MgcGF0aCBwYXJhbXMgcXVlcnkgZnJhZ21lbnQnKSwgUmVzdWx0TWl4aW4pOgorCisgICAgX19zbG90c19fID0gKCkKKworICAgIGRlZiBnZXR1cmwoc2VsZik6CisgICAgICAgIHJldHVybiB1cmx1bnBhcnNlKHNlbGYpCisKKworZGVmIHVybHBhcnNlKHVybCwgc2NoZW1lPScnLCBhbGxvd19mcmFnbWVudHM9VHJ1ZSk6CisgICAgIiIiUGFyc2UgYSBVUkwgaW50byA2IGNvbXBvbmVudHM6CisgICAgPHNjaGVtZT46Ly88bmV0bG9jPi88cGF0aD47PHBhcmFtcz4/PHF1ZXJ5PiM8ZnJhZ21lbnQ+CisgICAgUmV0dXJuIGEgNi10dXBsZTogKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkuCisgICAgTm90ZSB0aGF0IHdlIGRvbid0IGJyZWFrIHRoZSBjb21wb25lbnRzIHVwIGluIHNtYWxsZXIgYml0cworICAgIChlLmcuIG5ldGxvYyBpcyBhIHNpbmdsZSBzdHJpbmcpIGFuZCB3ZSBkb24ndCBleHBhbmQgJSBlc2NhcGVzLiIiIgorICAgIHR1cGxlID0gdXJsc3BsaXQodXJsLCBzY2hlbWUsIGFsbG93X2ZyYWdtZW50cykKKyAgICBzY2hlbWUsIG5ldGxvYywgdXJsLCBxdWVyeSwgZnJhZ21lbnQgPSB0dXBsZQorICAgIGlmIHNjaGVtZSBpbiB1c2VzX3BhcmFtcyBhbmQgJzsnIGluIHVybDoKKyAgICAgICAgdXJsLCBwYXJhbXMgPSBfc3BsaXRwYXJhbXModXJsKQorICAgIGVsc2U6CisgICAgICAgIHBhcmFtcyA9ICcnCisgICAgcmV0dXJuIFBhcnNlUmVzdWx0KHNjaGVtZSwgbmV0bG9jLCB1cmwsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50KQorCitkZWYgX3NwbGl0cGFyYW1zKHVybCk6CisgICAgaWYgJy8nICBpbiB1cmw6CisgICAgICAgIGkgPSB1cmwuZmluZCgnOycsIHVybC5yZmluZCgnLycpKQorICAgICAgICBpZiBpIDwgMDoKKyAgICAgICAgICAgIHJldHVybiB1cmwsICcnCisgICAgZWxzZToKKyAgICAgICAgaSA9IHVybC5maW5kKCc7JykKKyAgICByZXR1cm4gdXJsWzppXSwgdXJsW2krMTpdCisKK2RlZiBfc3BsaXRuZXRsb2ModXJsLCBzdGFydD0wKToKKyAgICBkZWxpbSA9IGxlbih1cmwpICAgIyBwb3NpdGlvbiBvZiBlbmQgb2YgZG9tYWluIHBhcnQgb2YgdXJsLCBkZWZhdWx0IGlzIGVuZAorICAgIGZvciBjIGluICcvPyMnOiAgICAjIGxvb2sgZm9yIGRlbGltaXRlcnM7IHRoZSBvcmRlciBpcyBOT1QgaW1wb3J0YW50CisgICAgICAgIHdkZWxpbSA9IHVybC5maW5kKGMsIHN0YXJ0KSAgICAgICAgIyBmaW5kIGZpcnN0IG9mIHRoaXMgZGVsaW0KKyAgICAgICAgaWYgd2RlbGltID49IDA6ICAgICAgICAgICAgICAgICAgICAjIGlmIGZvdW5kCisgICAgICAgICAgICBkZWxpbSA9IG1pbihkZWxpbSwgd2RlbGltKSAgICAgIyB1c2UgZWFybGllc3QgZGVsaW0gcG9zaXRpb24KKyAgICByZXR1cm4gdXJsW3N0YXJ0OmRlbGltXSwgdXJsW2RlbGltOl0gICAjIHJldHVybiAoZG9tYWluLCByZXN0KQorCitkZWYgdXJsc3BsaXQodXJsLCBzY2hlbWU9JycsIGFsbG93X2ZyYWdtZW50cz1UcnVlKToKKyAgICAiIiJQYXJzZSBhIFVSTCBpbnRvIDUgY29tcG9uZW50czoKKyAgICA8c2NoZW1lPjovLzxuZXRsb2M+LzxwYXRoPj88cXVlcnk+IzxmcmFnbWVudD4KKyAgICBSZXR1cm4gYSA1LXR1cGxlOiAoc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCkuCisgICAgTm90ZSB0aGF0IHdlIGRvbid0IGJyZWFrIHRoZSBjb21wb25lbnRzIHVwIGluIHNtYWxsZXIgYml0cworICAgIChlLmcuIG5ldGxvYyBpcyBhIHNpbmdsZSBzdHJpbmcpIGFuZCB3ZSBkb24ndCBleHBhbmQgJSBlc2NhcGVzLiIiIgorICAgIGFsbG93X2ZyYWdtZW50cyA9IGJvb2woYWxsb3dfZnJhZ21lbnRzKQorICAgIGtleSA9IHVybCwgc2NoZW1lLCBhbGxvd19mcmFnbWVudHMsIHR5cGUodXJsKSwgdHlwZShzY2hlbWUpCisgICAgY2FjaGVkID0gX3BhcnNlX2NhY2hlLmdldChrZXksIE5vbmUpCisgICAgaWYgY2FjaGVkOgorICAgICAgICByZXR1cm4gY2FjaGVkCisgICAgaWYgbGVuKF9wYXJzZV9jYWNoZSkgPj0gTUFYX0NBQ0hFX1NJWkU6ICMgYXZvaWQgcnVuYXdheSBncm93dGgKKyAgICAgICAgY2xlYXJfY2FjaGUoKQorICAgIG5ldGxvYyA9IHF1ZXJ5ID0gZnJhZ21lbnQgPSAnJworICAgIGkgPSB1cmwuZmluZCgnOicpCisgICAgaWYgaSA+IDA6CisgICAgICAgIGlmIHVybFs6aV0gPT0gJ2h0dHAnOiAjIG9wdGltaXplIHRoZSBjb21tb24gY2FzZQorICAgICAgICAgICAgc2NoZW1lID0gdXJsWzppXS5sb3dlcigpCisgICAgICAgICAgICB1cmwgPSB1cmxbaSsxOl0KKyAgICAgICAgICAgIGlmIHVybFs6Ml0gPT0gJy8vJzoKKyAgICAgICAgICAgICAgICBuZXRsb2MsIHVybCA9IF9zcGxpdG5ldGxvYyh1cmwsIDIpCisgICAgICAgICAgICAgICAgaWYgKCgnWycgaW4gbmV0bG9jIGFuZCAnXScgbm90IGluIG5ldGxvYykgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICgnXScgaW4gbmV0bG9jIGFuZCAnWycgbm90IGluIG5ldGxvYykpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIElQdjYgVVJMIikKKyAgICAgICAgICAgIGlmIGFsbG93X2ZyYWdtZW50cyBhbmQgJyMnIGluIHVybDoKKyAgICAgICAgICAgICAgICB1cmwsIGZyYWdtZW50ID0gdXJsLnNwbGl0KCcjJywgMSkKKyAgICAgICAgICAgIGlmICc/JyBpbiB1cmw6CisgICAgICAgICAgICAgICAgdXJsLCBxdWVyeSA9IHVybC5zcGxpdCgnPycsIDEpCisgICAgICAgICAgICB2ID0gU3BsaXRSZXN1bHQoc2NoZW1lLCBuZXRsb2MsIHVybCwgcXVlcnksIGZyYWdtZW50KQorICAgICAgICAgICAgX3BhcnNlX2NhY2hlW2tleV0gPSB2CisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICBmb3IgYyBpbiB1cmxbOmldOgorICAgICAgICAgICAgaWYgYyBub3QgaW4gc2NoZW1lX2NoYXJzOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG1ha2Ugc3VyZSAidXJsIiBpcyBub3QgYWN0dWFsbHkgYSBwb3J0IG51bWJlciAoaW4gd2hpY2ggY2FzZQorICAgICAgICAgICAgIyAic2NoZW1lIiBpcyByZWFsbHkgcGFydCBvZiB0aGUgcGF0aCkKKyAgICAgICAgICAgIHJlc3QgPSB1cmxbaSsxOl0KKyAgICAgICAgICAgIGlmIG5vdCByZXN0IG9yIGFueShjIG5vdCBpbiAnMDEyMzQ1Njc4OScgZm9yIGMgaW4gcmVzdCk6CisgICAgICAgICAgICAgICAgIyBub3QgYSBwb3J0IG51bWJlcgorICAgICAgICAgICAgICAgIHNjaGVtZSwgdXJsID0gdXJsWzppXS5sb3dlcigpLCByZXN0CisKKyAgICBpZiB1cmxbOjJdID09ICcvLyc6CisgICAgICAgIG5ldGxvYywgdXJsID0gX3NwbGl0bmV0bG9jKHVybCwgMikKKyAgICAgICAgaWYgKCgnWycgaW4gbmV0bG9jIGFuZCAnXScgbm90IGluIG5ldGxvYykgb3IKKyAgICAgICAgICAgICAgICAoJ10nIGluIG5ldGxvYyBhbmQgJ1snIG5vdCBpbiBuZXRsb2MpKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgSVB2NiBVUkwiKQorICAgIGlmIGFsbG93X2ZyYWdtZW50cyBhbmQgJyMnIGluIHVybDoKKyAgICAgICAgdXJsLCBmcmFnbWVudCA9IHVybC5zcGxpdCgnIycsIDEpCisgICAgaWYgJz8nIGluIHVybDoKKyAgICAgICAgdXJsLCBxdWVyeSA9IHVybC5zcGxpdCgnPycsIDEpCisgICAgdiA9IFNwbGl0UmVzdWx0KHNjaGVtZSwgbmV0bG9jLCB1cmwsIHF1ZXJ5LCBmcmFnbWVudCkKKyAgICBfcGFyc2VfY2FjaGVba2V5XSA9IHYKKyAgICByZXR1cm4gdgorCitkZWYgdXJsdW5wYXJzZShkYXRhKToKKyAgICAiIiJQdXQgYSBwYXJzZWQgVVJMIGJhY2sgdG9nZXRoZXIgYWdhaW4uICBUaGlzIG1heSByZXN1bHQgaW4gYQorICAgIHNsaWdodGx5IGRpZmZlcmVudCwgYnV0IGVxdWl2YWxlbnQgVVJMLCBpZiB0aGUgVVJMIHRoYXQgd2FzIHBhcnNlZAorICAgIG9yaWdpbmFsbHkgaGFkIHJlZHVuZGFudCBkZWxpbWl0ZXJzLCBlLmcuIGEgPyB3aXRoIGFuIGVtcHR5IHF1ZXJ5CisgICAgKHRoZSBkcmFmdCBzdGF0ZXMgdGhhdCB0aGVzZSBhcmUgZXF1aXZhbGVudCkuIiIiCisgICAgc2NoZW1lLCBuZXRsb2MsIHVybCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQgPSBkYXRhCisgICAgaWYgcGFyYW1zOgorICAgICAgICB1cmwgPSAiJXM7JXMiICUgKHVybCwgcGFyYW1zKQorICAgIHJldHVybiB1cmx1bnNwbGl0KChzY2hlbWUsIG5ldGxvYywgdXJsLCBxdWVyeSwgZnJhZ21lbnQpKQorCitkZWYgdXJsdW5zcGxpdChkYXRhKToKKyAgICAiIiJDb21iaW5lIHRoZSBlbGVtZW50cyBvZiBhIHR1cGxlIGFzIHJldHVybmVkIGJ5IHVybHNwbGl0KCkgaW50byBhCisgICAgY29tcGxldGUgVVJMIGFzIGEgc3RyaW5nLiBUaGUgZGF0YSBhcmd1bWVudCBjYW4gYmUgYW55IGZpdmUtaXRlbSBpdGVyYWJsZS4KKyAgICBUaGlzIG1heSByZXN1bHQgaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQsIGJ1dCBlcXVpdmFsZW50IFVSTCwgaWYgdGhlIFVSTCB0aGF0CisgICAgd2FzIHBhcnNlZCBvcmlnaW5hbGx5IGhhZCB1bm5lY2Vzc2FyeSBkZWxpbWl0ZXJzIChmb3IgZXhhbXBsZSwgYSA/IHdpdGggYW4KKyAgICBlbXB0eSBxdWVyeTsgdGhlIFJGQyBzdGF0ZXMgdGhhdCB0aGVzZSBhcmUgZXF1aXZhbGVudCkuIiIiCisgICAgc2NoZW1lLCBuZXRsb2MsIHVybCwgcXVlcnksIGZyYWdtZW50ID0gZGF0YQorICAgIGlmIG5ldGxvYyBvciAoc2NoZW1lIGFuZCBzY2hlbWUgaW4gdXNlc19uZXRsb2MgYW5kIHVybFs6Ml0gIT0gJy8vJyk6CisgICAgICAgIGlmIHVybCBhbmQgdXJsWzoxXSAhPSAnLyc6IHVybCA9ICcvJyArIHVybAorICAgICAgICB1cmwgPSAnLy8nICsgKG5ldGxvYyBvciAnJykgKyB1cmwKKyAgICBpZiBzY2hlbWU6CisgICAgICAgIHVybCA9IHNjaGVtZSArICc6JyArIHVybAorICAgIGlmIHF1ZXJ5OgorICAgICAgICB1cmwgPSB1cmwgKyAnPycgKyBxdWVyeQorICAgIGlmIGZyYWdtZW50OgorICAgICAgICB1cmwgPSB1cmwgKyAnIycgKyBmcmFnbWVudAorICAgIHJldHVybiB1cmwKKworZGVmIHVybGpvaW4oYmFzZSwgdXJsLCBhbGxvd19mcmFnbWVudHM9VHJ1ZSk6CisgICAgIiIiSm9pbiBhIGJhc2UgVVJMIGFuZCBhIHBvc3NpYmx5IHJlbGF0aXZlIFVSTCB0byBmb3JtIGFuIGFic29sdXRlCisgICAgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGxhdHRlci4iIiIKKyAgICBpZiBub3QgYmFzZToKKyAgICAgICAgcmV0dXJuIHVybAorICAgIGlmIG5vdCB1cmw6CisgICAgICAgIHJldHVybiBiYXNlCisgICAgYnNjaGVtZSwgYm5ldGxvYywgYnBhdGgsIGJwYXJhbXMsIGJxdWVyeSwgYmZyYWdtZW50ID0gXAorICAgICAgICAgICAgdXJscGFyc2UoYmFzZSwgJycsIGFsbG93X2ZyYWdtZW50cykKKyAgICBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQgPSBcCisgICAgICAgICAgICB1cmxwYXJzZSh1cmwsIGJzY2hlbWUsIGFsbG93X2ZyYWdtZW50cykKKyAgICBpZiBzY2hlbWUgIT0gYnNjaGVtZSBvciBzY2hlbWUgbm90IGluIHVzZXNfcmVsYXRpdmU6CisgICAgICAgIHJldHVybiB1cmwKKyAgICBpZiBzY2hlbWUgaW4gdXNlc19uZXRsb2M6CisgICAgICAgIGlmIG5ldGxvYzoKKyAgICAgICAgICAgIHJldHVybiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkpCisgICAgICAgIG5ldGxvYyA9IGJuZXRsb2MKKyAgICBpZiBwYXRoWzoxXSA9PSAnLyc6CisgICAgICAgIHJldHVybiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgcXVlcnksIGZyYWdtZW50KSkKKyAgICBpZiBub3QgcGF0aCBhbmQgbm90IHBhcmFtczoKKyAgICAgICAgcGF0aCA9IGJwYXRoCisgICAgICAgIHBhcmFtcyA9IGJwYXJhbXMKKyAgICAgICAgaWYgbm90IHF1ZXJ5OgorICAgICAgICAgICAgcXVlcnkgPSBicXVlcnkKKyAgICAgICAgcmV0dXJuIHVybHVucGFyc2UoKHNjaGVtZSwgbmV0bG9jLCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQpKQorICAgIHNlZ21lbnRzID0gYnBhdGguc3BsaXQoJy8nKVs6LTFdICsgcGF0aC5zcGxpdCgnLycpCisgICAgIyBYWFggVGhlIHN0dWZmIGJlbG93IGlzIGJvZ3VzIGluIHZhcmlvdXMgd2F5cy4uLgorICAgIGlmIHNlZ21lbnRzWy0xXSA9PSAnLic6CisgICAgICAgIHNlZ21lbnRzWy0xXSA9ICcnCisgICAgd2hpbGUgJy4nIGluIHNlZ21lbnRzOgorICAgICAgICBzZWdtZW50cy5yZW1vdmUoJy4nKQorICAgIHdoaWxlIDE6CisgICAgICAgIGkgPSAxCisgICAgICAgIG4gPSBsZW4oc2VnbWVudHMpIC0gMQorICAgICAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgICAgIGlmIChzZWdtZW50c1tpXSA9PSAnLi4nCisgICAgICAgICAgICAgICAgYW5kIHNlZ21lbnRzW2ktMV0gbm90IGluICgnJywgJy4uJykpOgorICAgICAgICAgICAgICAgIGRlbCBzZWdtZW50c1tpLTE6aSsxXQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpID0gaSsxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBicmVhaworICAgIGlmIHNlZ21lbnRzID09IFsnJywgJy4uJ106CisgICAgICAgIHNlZ21lbnRzWy0xXSA9ICcnCisgICAgZWxpZiBsZW4oc2VnbWVudHMpID49IDIgYW5kIHNlZ21lbnRzWy0xXSA9PSAnLi4nOgorICAgICAgICBzZWdtZW50c1stMjpdID0gWycnXQorICAgIHJldHVybiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgJy8nLmpvaW4oc2VnbWVudHMpLAorICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkpCisKK2RlZiB1cmxkZWZyYWcodXJsKToKKyAgICAiIiJSZW1vdmVzIGFueSBleGlzdGluZyBmcmFnbWVudCBmcm9tIFVSTC4KKworICAgIFJldHVybnMgYSB0dXBsZSBvZiB0aGUgZGVmcmFnbWVudGVkIFVSTCBhbmQgdGhlIGZyYWdtZW50LiAgSWYKKyAgICB0aGUgVVJMIGNvbnRhaW5lZCBubyBmcmFnbWVudHMsIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUKKyAgICBlbXB0eSBzdHJpbmcuCisgICAgIiIiCisgICAgaWYgJyMnIGluIHVybDoKKyAgICAgICAgcywgbiwgcCwgYSwgcSwgZnJhZyA9IHVybHBhcnNlKHVybCkKKyAgICAgICAgZGVmcmFnID0gdXJsdW5wYXJzZSgocywgbiwgcCwgYSwgcSwgJycpKQorICAgICAgICByZXR1cm4gZGVmcmFnLCBmcmFnCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHVybCwgJycKKwordHJ5OgorICAgIHVuaWNvZGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZGVmIF9pc191bmljb2RlKHgpOgorICAgICAgICByZXR1cm4gMAorZWxzZToKKyAgICBkZWYgX2lzX3VuaWNvZGUoeCk6CisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKHgsIHVuaWNvZGUpCisKKyMgdW5xdW90ZSBtZXRob2QgZm9yIHBhcnNlX3FzIGFuZCBwYXJzZV9xc2wKKyMgQ2Fubm90IHVzZSBkaXJlY3RseSBmcm9tIHVybGxpYiBhcyBpdCB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhciByZWZlcmVuY2UKKyMgYmVjYXVzZSB1cmxsaWIgdXNlcyB1cmxwYXJzZSBtZXRob2RzICh1cmxqb2luKS4gIElmIHlvdSB1cGRhdGUgdGhpcyBmdW5jdGlvbiwKKyMgdXBkYXRlIGl0IGFsc28gaW4gdXJsbGliLiAgVGhpcyBjb2RlIGR1cGxpY2F0aW9uIGRvZXMgbm90IGV4aXN0aW4gaW4gUHl0aG9uMy4KKworX2hleGRpZyA9ICcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJworX2hleHRvY2hyID0gZGljdCgoYStiLCBjaHIoaW50KGErYiwxNikpKQorICAgICAgICAgICAgICAgICBmb3IgYSBpbiBfaGV4ZGlnIGZvciBiIGluIF9oZXhkaWcpCitfYXNjaWlyZSA9IHJlLmNvbXBpbGUoJyhbXHgwMC1ceDdmXSspJykKKworZGVmIHVucXVvdGUocyk6CisgICAgIiIidW5xdW90ZSgnYWJjJTIwZGVmJykgLT4gJ2FiYyBkZWYnLiIiIgorICAgIGlmIF9pc191bmljb2RlKHMpOgorICAgICAgICBpZiAnJScgbm90IGluIHM6CisgICAgICAgICAgICByZXR1cm4gcworICAgICAgICBiaXRzID0gX2FzY2lpcmUuc3BsaXQocykKKyAgICAgICAgcmVzID0gW2JpdHNbMF1dCisgICAgICAgIGFwcGVuZCA9IHJlcy5hcHBlbmQKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKGJpdHMpLCAyKToKKyAgICAgICAgICAgIGFwcGVuZCh1bnF1b3RlKHN0cihiaXRzW2ldKSkuZGVjb2RlKCdsYXRpbjEnKSkKKyAgICAgICAgICAgIGFwcGVuZChiaXRzW2kgKyAxXSkKKyAgICAgICAgcmV0dXJuICcnLmpvaW4ocmVzKQorCisgICAgYml0cyA9IHMuc3BsaXQoJyUnKQorICAgICMgZmFzdHBhdGgKKyAgICBpZiBsZW4oYml0cykgPT0gMToKKyAgICAgICAgcmV0dXJuIHMKKyAgICByZXMgPSBbYml0c1swXV0KKyAgICBhcHBlbmQgPSByZXMuYXBwZW5kCisgICAgZm9yIGl0ZW0gaW4gYml0c1sxOl06CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFwcGVuZChfaGV4dG9jaHJbaXRlbVs6Ml1dKQorICAgICAgICAgICAgYXBwZW5kKGl0ZW1bMjpdKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBhcHBlbmQoJyUnKQorICAgICAgICAgICAgYXBwZW5kKGl0ZW0pCisgICAgcmV0dXJuICcnLmpvaW4ocmVzKQorCitkZWYgcGFyc2VfcXMocXMsIGtlZXBfYmxhbmtfdmFsdWVzPTAsIHN0cmljdF9wYXJzaW5nPTApOgorICAgICIiIlBhcnNlIGEgcXVlcnkgZ2l2ZW4gYXMgYSBzdHJpbmcgYXJndW1lbnQuCisKKyAgICAgICAgQXJndW1lbnRzOgorCisgICAgICAgIHFzOiBwZXJjZW50LWVuY29kZWQgcXVlcnkgc3RyaW5nIHRvIGJlIHBhcnNlZAorCisgICAgICAgIGtlZXBfYmxhbmtfdmFsdWVzOiBmbGFnIGluZGljYXRpbmcgd2hldGhlciBibGFuayB2YWx1ZXMgaW4KKyAgICAgICAgICAgIHBlcmNlbnQtZW5jb2RlZCBxdWVyaWVzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGJsYW5rIHN0cmluZ3MuCisgICAgICAgICAgICBBIHRydWUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgYmxhbmtzIHNob3VsZCBiZSByZXRhaW5lZCBhcworICAgICAgICAgICAgYmxhbmsgc3RyaW5ncy4gIFRoZSBkZWZhdWx0IGZhbHNlIHZhbHVlIGluZGljYXRlcyB0aGF0CisgICAgICAgICAgICBibGFuayB2YWx1ZXMgYXJlIHRvIGJlIGlnbm9yZWQgYW5kIHRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlCisgICAgICAgICAgICBub3QgaW5jbHVkZWQuCisKKyAgICAgICAgc3RyaWN0X3BhcnNpbmc6IGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGRvIHdpdGggcGFyc2luZyBlcnJvcnMuCisgICAgICAgICAgICBJZiBmYWxzZSAodGhlIGRlZmF1bHQpLCBlcnJvcnMgYXJlIHNpbGVudGx5IGlnbm9yZWQuCisgICAgICAgICAgICBJZiB0cnVlLCBlcnJvcnMgcmFpc2UgYSBWYWx1ZUVycm9yIGV4Y2VwdGlvbi4KKyAgICAiIiIKKyAgICBkaWN0ID0ge30KKyAgICBmb3IgbmFtZSwgdmFsdWUgaW4gcGFyc2VfcXNsKHFzLCBrZWVwX2JsYW5rX3ZhbHVlcywgc3RyaWN0X3BhcnNpbmcpOgorICAgICAgICBpZiBuYW1lIGluIGRpY3Q6CisgICAgICAgICAgICBkaWN0W25hbWVdLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRpY3RbbmFtZV0gPSBbdmFsdWVdCisgICAgcmV0dXJuIGRpY3QKKworZGVmIHBhcnNlX3FzbChxcywga2VlcF9ibGFua192YWx1ZXM9MCwgc3RyaWN0X3BhcnNpbmc9MCk6CisgICAgIiIiUGFyc2UgYSBxdWVyeSBnaXZlbiBhcyBhIHN0cmluZyBhcmd1bWVudC4KKworICAgIEFyZ3VtZW50czoKKworICAgIHFzOiBwZXJjZW50LWVuY29kZWQgcXVlcnkgc3RyaW5nIHRvIGJlIHBhcnNlZAorCisgICAga2VlcF9ibGFua192YWx1ZXM6IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGJsYW5rIHZhbHVlcyBpbgorICAgICAgICBwZXJjZW50LWVuY29kZWQgcXVlcmllcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBibGFuayBzdHJpbmdzLiAgQQorICAgICAgICB0cnVlIHZhbHVlIGluZGljYXRlcyB0aGF0IGJsYW5rcyBzaG91bGQgYmUgcmV0YWluZWQgYXMgYmxhbmsKKyAgICAgICAgc3RyaW5ncy4gIFRoZSBkZWZhdWx0IGZhbHNlIHZhbHVlIGluZGljYXRlcyB0aGF0IGJsYW5rIHZhbHVlcworICAgICAgICBhcmUgdG8gYmUgaWdub3JlZCBhbmQgdHJlYXRlZCBhcyBpZiB0aGV5IHdlcmUgIG5vdCBpbmNsdWRlZC4KKworICAgIHN0cmljdF9wYXJzaW5nOiBmbGFnIGluZGljYXRpbmcgd2hhdCB0byBkbyB3aXRoIHBhcnNpbmcgZXJyb3JzLiBJZgorICAgICAgICBmYWxzZSAodGhlIGRlZmF1bHQpLCBlcnJvcnMgYXJlIHNpbGVudGx5IGlnbm9yZWQuIElmIHRydWUsCisgICAgICAgIGVycm9ycyByYWlzZSBhIFZhbHVlRXJyb3IgZXhjZXB0aW9uLgorCisgICAgUmV0dXJucyBhIGxpc3QsIGFzIEctZCBpbnRlbmRlZC4KKyAgICAiIiIKKyAgICBwYWlycyA9IFtzMiBmb3IgczEgaW4gcXMuc3BsaXQoJyYnKSBmb3IgczIgaW4gczEuc3BsaXQoJzsnKV0KKyAgICByID0gW10KKyAgICBmb3IgbmFtZV92YWx1ZSBpbiBwYWlyczoKKyAgICAgICAgaWYgbm90IG5hbWVfdmFsdWUgYW5kIG5vdCBzdHJpY3RfcGFyc2luZzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG52ID0gbmFtZV92YWx1ZS5zcGxpdCgnPScsIDEpCisgICAgICAgIGlmIGxlbihudikgIT0gMjoKKyAgICAgICAgICAgIGlmIHN0cmljdF9wYXJzaW5nOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJiYWQgcXVlcnkgZmllbGQ6ICVyIiAlIChuYW1lX3ZhbHVlLCkKKyAgICAgICAgICAgICMgSGFuZGxlIGNhc2Ugb2YgYSBjb250cm9sLW5hbWUgd2l0aCBubyBlcXVhbCBzaWduCisgICAgICAgICAgICBpZiBrZWVwX2JsYW5rX3ZhbHVlczoKKyAgICAgICAgICAgICAgICBudi5hcHBlbmQoJycpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGxlbihudlsxXSkgb3Iga2VlcF9ibGFua192YWx1ZXM6CisgICAgICAgICAgICBuYW1lID0gdW5xdW90ZShudlswXS5yZXBsYWNlKCcrJywgJyAnKSkKKyAgICAgICAgICAgIHZhbHVlID0gdW5xdW90ZShudlsxXS5yZXBsYWNlKCcrJywgJyAnKSkKKyAgICAgICAgICAgIHIuYXBwZW5kKChuYW1lLCB2YWx1ZSkpCisKKyAgICByZXR1cm4gcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91cmxwYXJzZS5weWMgYi9saWIvcHl0aG9uMi43L3VybHBhcnNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQxZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91cmxwYXJzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91cmxwYXJzZS5weW8gYi9saWIvcHl0aG9uMi43L3VybHBhcnNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQxZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91cmxwYXJzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91c2VyLnB5IGIvbGliL3B5dGhvbjIuNy91c2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NmYwYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VzZXIucHkKQEAgLTAsMCArMSw0OCBAQAorIiIiSG9vayB0byBhbGxvdyB1c2VyLXNwZWNpZmllZCBjdXN0b21pemF0aW9uIGNvZGUgdG8gcnVuLgorCitBcyBhIHBvbGljeSwgUHl0aG9uIGRvZXNuJ3QgcnVuIHVzZXItc3BlY2lmaWVkIGNvZGUgb24gc3RhcnR1cCBvZgorUHl0aG9uIHByb2dyYW1zIChpbnRlcmFjdGl2ZSBzZXNzaW9ucyBleGVjdXRlIHRoZSBzY3JpcHQgc3BlY2lmaWVkIGluCit0aGUgUFlUSE9OU1RBUlRVUCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBpdCBleGlzdHMpLgorCitIb3dldmVyLCBzb21lIHByb2dyYW1zIG9yIHNpdGVzIG1heSBmaW5kIGl0IGNvbnZlbmllbnQgdG8gYWxsb3cgdXNlcnMKK3RvIGhhdmUgYSBzdGFuZGFyZCBjdXN0b21pemF0aW9uIGZpbGUsIHdoaWNoIGdldHMgcnVuIHdoZW4gYSBwcm9ncmFtCityZXF1ZXN0cyBpdC4gIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgc3VjaCBhIG1lY2hhbmlzbS4gIEEgcHJvZ3JhbQordGhhdCB3aXNoZXMgdG8gdXNlIHRoZSBtZWNoYW5pc20gbXVzdCBleGVjdXRlIHRoZSBzdGF0ZW1lbnQKKworICAgIGltcG9ydCB1c2VyCisKK1RoZSB1c2VyIG1vZHVsZSBsb29rcyBmb3IgYSBmaWxlIC5weXRob25yYy5weSBpbiB0aGUgdXNlcidzIGhvbWUKK2RpcmVjdG9yeSBhbmQgaWYgaXQgY2FuIGJlIG9wZW5lZCwgZXhlY2ZpbGUoKXMgaXQgaW4gaXRzIG93biBnbG9iYWwKK25hbWVzcGFjZS4gIEVycm9ycyBkdXJpbmcgdGhpcyBwaGFzZSBhcmUgbm90IGNhdWdodDsgdGhhdCdzIHVwIHRvIHRoZQorcHJvZ3JhbSB0aGF0IGltcG9ydHMgdGhlIHVzZXIgbW9kdWxlLCBpZiBpdCB3aXNoZXMuCisKK1RoZSB1c2VyJ3MgLnB5dGhvbnJjLnB5IGNvdWxkIGNvbmNlaXZhYmx5IHRlc3QgZm9yIHN5cy52ZXJzaW9uIGlmIGl0Cit3aXNoZXMgdG8gZG8gZGlmZmVyZW50IHRoaW5ncyBkZXBlbmRpbmcgb24gdGhlIFB5dGhvbiB2ZXJzaW9uLgorCisiIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIHVzZXIgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCIsIHN0YWNrbGV2ZWw9MikKK2RlbCB3YXJucHkzaworCitpbXBvcnQgb3MKKworaG9tZSA9IG9zLmN1cmRpciAgICAgICAgICAgICAgICAgICAgICAgICMgRGVmYXVsdAoraWYgJ0hPTUUnIGluIG9zLmVudmlyb246CisgICAgaG9tZSA9IG9zLmVudmlyb25bJ0hPTUUnXQorZWxpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgaG9tZSA9IG9zLnBhdGguZXhwYW5kdXNlcigifi8iKQorZWxpZiBvcy5uYW1lID09ICdudCc6ICAgICAgICAgICAgICAgICAgICMgQ29udHJpYnV0ZWQgYnkgSmVmZiBCYXVlcgorICAgIGlmICdIT01FUEFUSCcgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgaWYgJ0hPTUVEUklWRScgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGhvbWUgPSBvcy5lbnZpcm9uWydIT01FRFJJVkUnXSArIG9zLmVudmlyb25bJ0hPTUVQQVRIJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhvbWUgPSBvcy5lbnZpcm9uWydIT01FUEFUSCddCisKK3B5dGhvbnJjID0gb3MucGF0aC5qb2luKGhvbWUsICIucHl0aG9ucmMucHkiKQordHJ5OgorICAgIGYgPSBvcGVuKHB5dGhvbnJjKQorZXhjZXB0IElPRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBmLmNsb3NlKCkKKyAgICBleGVjZmlsZShweXRob25yYykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXNlci5weWMgYi9saWIvcHl0aG9uMi43L3VzZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjYxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VzZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXNlci5weW8gYi9saWIvcHl0aG9uMi43L3VzZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MjYxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VzZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXUucHkgYi9saWIvcHl0aG9uMi43L3V1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY4ZmE0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3V1LnB5CkBAIC0wLDAgKzEsMTk2IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgQ29weXJpZ2h0IDE5OTQgYnkgTGFuY2UgRWxsaW5naG91c2UKKyMgQ2F0aGVkcmFsIENpdHksIENhbGlmb3JuaWEgUmVwdWJsaWMsIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4KKyMgICAgICAgICAgICAgICAgICAgICAgICBBbGwgUmlnaHRzIFJlc2VydmVkCisjIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCisjIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyMgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisjIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgTGFuY2UgRWxsaW5naG91c2UKKyMgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCisjIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisjIExBTkNFIEVMTElOR0hPVVNFIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTworIyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisjIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIExBTkNFIEVMTElOR0hPVVNFIENFTlRSVU0gQkUgTElBQkxFCisjIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisjIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorIyBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVAorIyBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorIworIyBNb2RpZmllZCBieSBKYWNrIEphbnNlbiwgQ1dJLCBKdWx5IDE5OTU6CisjIC0gVXNlIGJpbmFzY2lpIG1vZHVsZSB0byBkbyB0aGUgYWN0dWFsIGxpbmUtYnktbGluZSBjb252ZXJzaW9uCisjICAgYmV0d2VlbiBhc2NpaSBhbmQgYmluYXJ5LiBUaGlzIHJlc3VsdHMgaW4gYSAxMDAwLWZvbGQgc3BlZWR1cC4gVGhlIEMKKyMgICB2ZXJzaW9uIGlzIHN0aWxsIDUgdGltZXMgZmFzdGVyLCB0aG91Z2guCisjIC0gQXJndW1lbnRzIG1vcmUgY29tcGxpYW50IHdpdGggcHl0aG9uIHN0YW5kYXJkCisKKyIiIkltcGxlbWVudGF0aW9uIG9mIHRoZSBVVWVuY29kZSBhbmQgVVVkZWNvZGUgZnVuY3Rpb25zLgorCitlbmNvZGUoaW5fZmlsZSwgb3V0X2ZpbGUgWyxuYW1lLCBtb2RlXSkKK2RlY29kZShpbl9maWxlIFssIG91dF9maWxlLCBtb2RlXSkKKyIiIgorCitpbXBvcnQgYmluYXNjaWkKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCitfX2FsbF9fID0gWyJFcnJvciIsICJlbmNvZGUiLCAiZGVjb2RlIl0KKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2RlZiBlbmNvZGUoaW5fZmlsZSwgb3V0X2ZpbGUsIG5hbWU9Tm9uZSwgbW9kZT1Ob25lKToKKyAgICAiIiJVdWVuY29kZSBmaWxlIiIiCisgICAgIworICAgICMgSWYgaW5fZmlsZSBpcyBhIHBhdGhuYW1lIG9wZW4gaXQgYW5kIGNoYW5nZSBkZWZhdWx0cworICAgICMKKyAgICBvcGVuZWRfZmlsZXMgPSBbXQorICAgIHRyeToKKyAgICAgICAgaWYgaW5fZmlsZSA9PSAnLSc6CisgICAgICAgICAgICBpbl9maWxlID0gc3lzLnN0ZGluCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpbl9maWxlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5iYXNlbmFtZShpbl9maWxlKQorICAgICAgICAgICAgaWYgbW9kZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbW9kZSA9IG9zLnN0YXQoaW5fZmlsZSkuc3RfbW9kZQorICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaW5fZmlsZSA9IG9wZW4oaW5fZmlsZSwgJ3JiJykKKyAgICAgICAgICAgIG9wZW5lZF9maWxlcy5hcHBlbmQoaW5fZmlsZSkKKyAgICAgICAgIworICAgICAgICAjIE9wZW4gb3V0X2ZpbGUgaWYgaXQgaXMgYSBwYXRobmFtZQorICAgICAgICAjCisgICAgICAgIGlmIG91dF9maWxlID09ICctJzoKKyAgICAgICAgICAgIG91dF9maWxlID0gc3lzLnN0ZG91dAorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3V0X2ZpbGUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgb3V0X2ZpbGUgPSBvcGVuKG91dF9maWxlLCAnd2InKQorICAgICAgICAgICAgb3BlbmVkX2ZpbGVzLmFwcGVuZChvdXRfZmlsZSkKKyAgICAgICAgIworICAgICAgICAjIFNldCBkZWZhdWx0cyBmb3IgbmFtZSBhbmQgbW9kZQorICAgICAgICAjCisgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIG5hbWUgPSAnLScKKyAgICAgICAgaWYgbW9kZSBpcyBOb25lOgorICAgICAgICAgICAgbW9kZSA9IDA2NjYKKyAgICAgICAgIworICAgICAgICAjIFdyaXRlIHRoZSBkYXRhCisgICAgICAgICMKKyAgICAgICAgb3V0X2ZpbGUud3JpdGUoJ2JlZ2luICVvICVzXG4nICUgKChtb2RlJjA3NzcpLG5hbWUpKQorICAgICAgICBkYXRhID0gaW5fZmlsZS5yZWFkKDQ1KQorICAgICAgICB3aGlsZSBsZW4oZGF0YSkgPiAwOgorICAgICAgICAgICAgb3V0X2ZpbGUud3JpdGUoYmluYXNjaWkuYjJhX3V1KGRhdGEpKQorICAgICAgICAgICAgZGF0YSA9IGluX2ZpbGUucmVhZCg0NSkKKyAgICAgICAgb3V0X2ZpbGUud3JpdGUoJyBcbmVuZFxuJykKKyAgICBmaW5hbGx5OgorICAgICAgICBmb3IgZiBpbiBvcGVuZWRfZmlsZXM6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworCitkZWYgZGVjb2RlKGluX2ZpbGUsIG91dF9maWxlPU5vbmUsIG1vZGU9Tm9uZSwgcXVpZXQ9MCk6CisgICAgIiIiRGVjb2RlIHV1ZW5jb2RlZCBmaWxlIiIiCisgICAgIworICAgICMgT3BlbiB0aGUgaW5wdXQgZmlsZSwgaWYgbmVlZGVkLgorICAgICMKKyAgICBvcGVuZWRfZmlsZXMgPSBbXQorICAgIGlmIGluX2ZpbGUgPT0gJy0nOgorICAgICAgICBpbl9maWxlID0gc3lzLnN0ZGluCisgICAgZWxpZiBpc2luc3RhbmNlKGluX2ZpbGUsIGJhc2VzdHJpbmcpOgorICAgICAgICBpbl9maWxlID0gb3Blbihpbl9maWxlKQorICAgICAgICBvcGVuZWRfZmlsZXMuYXBwZW5kKGluX2ZpbGUpCisgICAgdHJ5OgorICAgICAgICAjCisgICAgICAgICMgUmVhZCB1bnRpbCBhIGJlZ2luIGlzIGVuY291bnRlcmVkIG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgZmlsZQorICAgICAgICAjCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBoZHIgPSBpbl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBoZHI6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoJ05vIHZhbGlkIGJlZ2luIGxpbmUgZm91bmQgaW4gaW5wdXQgZmlsZScpCisgICAgICAgICAgICBpZiBub3QgaGRyLnN0YXJ0c3dpdGgoJ2JlZ2luJyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGhkcmZpZWxkcyA9IGhkci5zcGxpdCgnICcsIDIpCisgICAgICAgICAgICBpZiBsZW4oaGRyZmllbGRzKSA9PSAzIGFuZCBoZHJmaWVsZHNbMF0gPT0gJ2JlZ2luJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGludChoZHJmaWVsZHNbMV0sIDgpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgb3V0X2ZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgIG91dF9maWxlID0gaGRyZmllbGRzWzJdLnJzdHJpcCgpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvdXRfZmlsZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoJ0Nhbm5vdCBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZTogJXMnICUgb3V0X2ZpbGUpCisgICAgICAgIGlmIG1vZGUgaXMgTm9uZToKKyAgICAgICAgICAgIG1vZGUgPSBpbnQoaGRyZmllbGRzWzFdLCA4KQorICAgICAgICAjCisgICAgICAgICMgT3BlbiB0aGUgb3V0cHV0IGZpbGUKKyAgICAgICAgIworICAgICAgICBpZiBvdXRfZmlsZSA9PSAnLSc6CisgICAgICAgICAgICBvdXRfZmlsZSA9IHN5cy5zdGRvdXQKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG91dF9maWxlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGZwID0gb3BlbihvdXRfZmlsZSwgJ3diJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmNobW9kKG91dF9maWxlLCBtb2RlKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIG91dF9maWxlID0gZnAKKyAgICAgICAgICAgIG9wZW5lZF9maWxlcy5hcHBlbmQob3V0X2ZpbGUpCisgICAgICAgICMKKyAgICAgICAgIyBNYWluIGRlY29kaW5nIGxvb3AKKyAgICAgICAgIworICAgICAgICBzID0gaW5fZmlsZS5yZWFkbGluZSgpCisgICAgICAgIHdoaWxlIHMgYW5kIHMuc3RyaXAoKSAhPSAnZW5kJzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkYXRhID0gYmluYXNjaWkuYTJiX3V1KHMpCisgICAgICAgICAgICBleGNlcHQgYmluYXNjaWkuRXJyb3IsIHY6CisgICAgICAgICAgICAgICAgIyBXb3JrYXJvdW5kIGZvciBicm9rZW4gdXVlbmNvZGVycyBieSAvRnJlZHJpayBMdW5kaAorICAgICAgICAgICAgICAgIG5ieXRlcyA9ICgoKG9yZChzWzBdKS0zMikgJiA2MykgKiA0ICsgNSkgLy8gMworICAgICAgICAgICAgICAgIGRhdGEgPSBiaW5hc2NpaS5hMmJfdXUoc1s6bmJ5dGVzXSkKKyAgICAgICAgICAgICAgICBpZiBub3QgcXVpZXQ6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldhcm5pbmc6ICVzXG4iICUgdikKKyAgICAgICAgICAgIG91dF9maWxlLndyaXRlKGRhdGEpCisgICAgICAgICAgICBzID0gaW5fZmlsZS5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBzOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IoJ1RydW5jYXRlZCBpbnB1dCBmaWxlJykKKyAgICBmaW5hbGx5OgorICAgICAgICBmb3IgZiBpbiBvcGVuZWRfZmlsZXM6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworZGVmIHRlc3QoKToKKyAgICAiIiJ1dWVuY29kZS91dWRlY29kZSBtYWluIHByb2dyYW0iIiIKKworICAgIGltcG9ydCBvcHRwYXJzZQorICAgIHBhcnNlciA9IG9wdHBhcnNlLk9wdGlvblBhcnNlcih1c2FnZT0ndXNhZ2U6ICVwcm9nIFstZF0gWy10XSBbaW5wdXQgW291dHB1dF1dJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLWQnLCAnLS1kZWNvZGUnLCBkZXN0PSdkZWNvZGUnLCBoZWxwPSdEZWNvZGUgKGluc3RlYWQgb2YgZW5jb2RlKT8nLCBkZWZhdWx0PUZhbHNlLCBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctdCcsICctLXRleHQnLCBkZXN0PSd0ZXh0JywgaGVscD0nZGF0YSBpcyB0ZXh0LCBlbmNvZGVkIGZvcm1hdCB1bml4LWNvbXBhdGlibGUgdGV4dD8nLCBkZWZhdWx0PUZhbHNlLCBhY3Rpb249J3N0b3JlX3RydWUnKQorCisgICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgIGlmIGxlbihhcmdzKSA+IDI6CisgICAgICAgIHBhcnNlci5lcnJvcignaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMnKQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgaW5wdXQgPSBzeXMuc3RkaW4KKyAgICBvdXRwdXQgPSBzeXMuc3Rkb3V0CisgICAgaWYgbGVuKGFyZ3MpID4gMDoKKyAgICAgICAgaW5wdXQgPSBhcmdzWzBdCisgICAgaWYgbGVuKGFyZ3MpID4gMToKKyAgICAgICAgb3V0cHV0ID0gYXJnc1sxXQorCisgICAgaWYgb3B0aW9ucy5kZWNvZGU6CisgICAgICAgIGlmIG9wdGlvbnMudGV4dDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3V0cHV0LCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBvcGVuKG91dHB1dCwgJ3cnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCBzeXMuYXJndlswXSwgJzogY2Fubm90IGRvIC10IHRvIHN0ZG91dCcKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICBkZWNvZGUoaW5wdXQsIG91dHB1dCkKKyAgICBlbHNlOgorICAgICAgICBpZiBvcHRpb25zLnRleHQ6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGlucHV0LCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICBpbnB1dCA9IG9wZW4oaW5wdXQsICdyJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgc3lzLmFyZ3ZbMF0sICc6IGNhbm5vdCBkbyAtdCBmcm9tIHN0ZGluJworICAgICAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIGVuY29kZShpbnB1dCwgb3V0cHV0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91dS5weWMgYi9saWIvcHl0aG9uMi43L3V1LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzg4MzUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91dS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91dS5weW8gYi9saWIvcHl0aG9uMi43L3V1LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzg4MzUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91dS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91dWlkLnB5IGIvbGliL3B5dGhvbjIuNy91dWlkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZDBjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3V1aWQucHkKQEAgLTAsMCArMSw1NjAgQEAKK3IiIiJVVUlEIG9iamVjdHMgKHVuaXZlcnNhbGx5IHVuaXF1ZSBpZGVudGlmaWVycykgYWNjb3JkaW5nIHRvIFJGQyA0MTIyLgorCitUaGlzIG1vZHVsZSBwcm92aWRlcyBpbW11dGFibGUgVVVJRCBvYmplY3RzIChjbGFzcyBVVUlEKSBhbmQgdGhlIGZ1bmN0aW9ucwordXVpZDEoKSwgdXVpZDMoKSwgdXVpZDQoKSwgdXVpZDUoKSBmb3IgZ2VuZXJhdGluZyB2ZXJzaW9uIDEsIDMsIDQsIGFuZCA1CitVVUlEcyBhcyBzcGVjaWZpZWQgaW4gUkZDIDQxMjIuCisKK0lmIGFsbCB5b3Ugd2FudCBpcyBhIHVuaXF1ZSBJRCwgeW91IHNob3VsZCBwcm9iYWJseSBjYWxsIHV1aWQxKCkgb3IgdXVpZDQoKS4KK05vdGUgdGhhdCB1dWlkMSgpIG1heSBjb21wcm9taXNlIHByaXZhY3kgc2luY2UgaXQgY3JlYXRlcyBhIFVVSUQgY29udGFpbmluZwordGhlIGNvbXB1dGVyJ3MgbmV0d29yayBhZGRyZXNzLiAgdXVpZDQoKSBjcmVhdGVzIGEgcmFuZG9tIFVVSUQuCisKK1R5cGljYWwgdXNhZ2U6CisKKyAgICA+Pj4gaW1wb3J0IHV1aWQKKworICAgICMgbWFrZSBhIFVVSUQgYmFzZWQgb24gdGhlIGhvc3QgSUQgYW5kIGN1cnJlbnQgdGltZQorICAgID4+PiB1dWlkLnV1aWQxKCkKKyAgICBVVUlEKCdhODA5OGMxYS1mODZlLTExZGEtYmQxYS0wMDExMjQ0NGJlMWUnKQorCisgICAgIyBtYWtlIGEgVVVJRCB1c2luZyBhbiBNRDUgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUKKyAgICA+Pj4gdXVpZC51dWlkMyh1dWlkLk5BTUVTUEFDRV9ETlMsICdweXRob24ub3JnJykKKyAgICBVVUlEKCc2ZmE0NTllYS1lZThhLTNjYTQtODk0ZS1kYjc3ZTE2MDM1NWUnKQorCisgICAgIyBtYWtlIGEgcmFuZG9tIFVVSUQKKyAgICA+Pj4gdXVpZC51dWlkNCgpCisgICAgVVVJRCgnMTZmZDI3MDYtOGJhZi00MzNiLTgyZWItOGM3ZmFkYTg0N2RhJykKKworICAgICMgbWFrZSBhIFVVSUQgdXNpbmcgYSBTSEEtMSBoYXNoIG9mIGEgbmFtZXNwYWNlIFVVSUQgYW5kIGEgbmFtZQorICAgID4+PiB1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX0ROUywgJ3B5dGhvbi5vcmcnKQorICAgIFVVSUQoJzg4NjMxM2UxLTNiOGEtNTM3Mi05YjkwLTBjOWFlZTE5OWU1ZCcpCisKKyAgICAjIG1ha2UgYSBVVUlEIGZyb20gYSBzdHJpbmcgb2YgaGV4IGRpZ2l0cyAoYnJhY2VzIGFuZCBoeXBoZW5zIGlnbm9yZWQpCisgICAgPj4+IHggPSB1dWlkLlVVSUQoJ3swMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGZ9JykKKworICAgICMgY29udmVydCBhIFVVSUQgdG8gYSBzdHJpbmcgb2YgaGV4IGRpZ2l0cyBpbiBzdGFuZGFyZCBmb3JtCisgICAgPj4+IHN0cih4KQorICAgICcwMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGYnCisKKyAgICAjIGdldCB0aGUgcmF3IDE2IGJ5dGVzIG9mIHRoZSBVVUlECisgICAgPj4+IHguYnl0ZXMKKyAgICAnXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHRcblx4MGJceDBjXHJceDBlXHgwZicKKworICAgICMgbWFrZSBhIFVVSUQgZnJvbSBhIDE2LWJ5dGUgc3RyaW5nCisgICAgPj4+IHV1aWQuVVVJRChieXRlcz14LmJ5dGVzKQorICAgIFVVSUQoJzAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZicpCisiIiIKKworX19hdXRob3JfXyA9ICdLYS1QaW5nIFllZSA8cGluZ0B6ZXN0eS5jYT4nCisKK1JFU0VSVkVEX05DUywgUkZDXzQxMjIsIFJFU0VSVkVEX01JQ1JPU09GVCwgUkVTRVJWRURfRlVUVVJFID0gWworICAgICdyZXNlcnZlZCBmb3IgTkNTIGNvbXBhdGliaWxpdHknLCAnc3BlY2lmaWVkIGluIFJGQyA0MTIyJywKKyAgICAncmVzZXJ2ZWQgZm9yIE1pY3Jvc29mdCBjb21wYXRpYmlsaXR5JywgJ3Jlc2VydmVkIGZvciBmdXR1cmUgZGVmaW5pdGlvbiddCisKK2NsYXNzIFVVSUQob2JqZWN0KToKKyAgICAiIiJJbnN0YW5jZXMgb2YgdGhlIFVVSUQgY2xhc3MgcmVwcmVzZW50IFVVSURzIGFzIHNwZWNpZmllZCBpbiBSRkMgNDEyMi4KKyAgICBVVUlEIG9iamVjdHMgYXJlIGltbXV0YWJsZSwgaGFzaGFibGUsIGFuZCB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLgorICAgIENvbnZlcnRpbmcgYSBVVUlEIHRvIGEgc3RyaW5nIHdpdGggc3RyKCkgeWllbGRzIHNvbWV0aGluZyBpbiB0aGUgZm9ybQorICAgICcxMjM0NTY3OC0xMjM0LTEyMzQtMTIzNC0xMjM0NTY3ODlhYmMnLiAgVGhlIFVVSUQgY29uc3RydWN0b3IgYWNjZXB0cworICAgIGZpdmUgcG9zc2libGUgZm9ybXM6IGEgc2ltaWxhciBzdHJpbmcgb2YgaGV4YWRlY2ltYWwgZGlnaXRzLCBvciBhIHR1cGxlCisgICAgb2Ygc2l4IGludGVnZXIgZmllbGRzICh3aXRoIDMyLWJpdCwgMTYtYml0LCAxNi1iaXQsIDgtYml0LCA4LWJpdCwgYW5kCisgICAgNDgtYml0IHZhbHVlcyByZXNwZWN0aXZlbHkpIGFzIGFuIGFyZ3VtZW50IG5hbWVkICdmaWVsZHMnLCBvciBhIHN0cmluZworICAgIG9mIDE2IGJ5dGVzICh3aXRoIGFsbCB0aGUgaW50ZWdlciBmaWVsZHMgaW4gYmlnLWVuZGlhbiBvcmRlcikgYXMgYW4KKyAgICBhcmd1bWVudCBuYW1lZCAnYnl0ZXMnLCBvciBhIHN0cmluZyBvZiAxNiBieXRlcyAod2l0aCB0aGUgZmlyc3QgdGhyZWUKKyAgICBmaWVsZHMgaW4gbGl0dGxlLWVuZGlhbiBvcmRlcikgYXMgYW4gYXJndW1lbnQgbmFtZWQgJ2J5dGVzX2xlJywgb3IgYQorICAgIHNpbmdsZSAxMjgtYml0IGludGVnZXIgYXMgYW4gYXJndW1lbnQgbmFtZWQgJ2ludCcuCisKKyAgICBVVUlEcyBoYXZlIHRoZXNlIHJlYWQtb25seSBhdHRyaWJ1dGVzOgorCisgICAgICAgIGJ5dGVzICAgICAgIHRoZSBVVUlEIGFzIGEgMTYtYnl0ZSBzdHJpbmcgKGNvbnRhaW5pbmcgdGhlIHNpeAorICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyIGZpZWxkcyBpbiBiaWctZW5kaWFuIGJ5dGUgb3JkZXIpCisKKyAgICAgICAgYnl0ZXNfbGUgICAgdGhlIFVVSUQgYXMgYSAxNi1ieXRlIHN0cmluZyAod2l0aCB0aW1lX2xvdywgdGltZV9taWQsCisgICAgICAgICAgICAgICAgICAgIGFuZCB0aW1lX2hpX3ZlcnNpb24gaW4gbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyKQorCisgICAgICAgIGZpZWxkcyAgICAgIGEgdHVwbGUgb2YgdGhlIHNpeCBpbnRlZ2VyIGZpZWxkcyBvZiB0aGUgVVVJRCwKKyAgICAgICAgICAgICAgICAgICAgd2hpY2ggYXJlIGFsc28gYXZhaWxhYmxlIGFzIHNpeCBpbmRpdmlkdWFsIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgYW5kIHR3byBkZXJpdmVkIGF0dHJpYnV0ZXM6CisKKyAgICAgICAgICAgIHRpbWVfbG93ICAgICAgICAgICAgICAgIHRoZSBmaXJzdCAzMiBiaXRzIG9mIHRoZSBVVUlECisgICAgICAgICAgICB0aW1lX21pZCAgICAgICAgICAgICAgICB0aGUgbmV4dCAxNiBiaXRzIG9mIHRoZSBVVUlECisgICAgICAgICAgICB0aW1lX2hpX3ZlcnNpb24gICAgICAgICB0aGUgbmV4dCAxNiBiaXRzIG9mIHRoZSBVVUlECisgICAgICAgICAgICBjbG9ja19zZXFfaGlfdmFyaWFudCAgICB0aGUgbmV4dCA4IGJpdHMgb2YgdGhlIFVVSUQKKyAgICAgICAgICAgIGNsb2NrX3NlcV9sb3cgICAgICAgICAgIHRoZSBuZXh0IDggYml0cyBvZiB0aGUgVVVJRAorICAgICAgICAgICAgbm9kZSAgICAgICAgICAgICAgICAgICAgdGhlIGxhc3QgNDggYml0cyBvZiB0aGUgVVVJRAorCisgICAgICAgICAgICB0aW1lICAgICAgICAgICAgICAgICAgICB0aGUgNjAtYml0IHRpbWVzdGFtcAorICAgICAgICAgICAgY2xvY2tfc2VxICAgICAgICAgICAgICAgdGhlIDE0LWJpdCBzZXF1ZW5jZSBudW1iZXIKKworICAgICAgICBoZXggICAgICAgICB0aGUgVVVJRCBhcyBhIDMyLWNoYXJhY3RlciBoZXhhZGVjaW1hbCBzdHJpbmcKKworICAgICAgICBpbnQgICAgICAgICB0aGUgVVVJRCBhcyBhIDEyOC1iaXQgaW50ZWdlcgorCisgICAgICAgIHVybiAgICAgICAgIHRoZSBVVUlEIGFzIGEgVVJOIGFzIHNwZWNpZmllZCBpbiBSRkMgNDEyMgorCisgICAgICAgIHZhcmlhbnQgICAgIHRoZSBVVUlEIHZhcmlhbnQgKG9uZSBvZiB0aGUgY29uc3RhbnRzIFJFU0VSVkVEX05DUywKKyAgICAgICAgICAgICAgICAgICAgUkZDXzQxMjIsIFJFU0VSVkVEX01JQ1JPU09GVCwgb3IgUkVTRVJWRURfRlVUVVJFKQorCisgICAgICAgIHZlcnNpb24gICAgIHRoZSBVVUlEIHZlcnNpb24gbnVtYmVyICgxIHRocm91Z2ggNSwgbWVhbmluZ2Z1bCBvbmx5CisgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHZhcmlhbnQgaXMgUkZDXzQxMjIpCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGV4PU5vbmUsIGJ5dGVzPU5vbmUsIGJ5dGVzX2xlPU5vbmUsIGZpZWxkcz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQ9Tm9uZSwgdmVyc2lvbj1Ob25lKToKKyAgICAgICAgciIiIkNyZWF0ZSBhIFVVSUQgZnJvbSBlaXRoZXIgYSBzdHJpbmcgb2YgMzIgaGV4YWRlY2ltYWwgZGlnaXRzLAorICAgICAgICBhIHN0cmluZyBvZiAxNiBieXRlcyBhcyB0aGUgJ2J5dGVzJyBhcmd1bWVudCwgYSBzdHJpbmcgb2YgMTYgYnl0ZXMKKyAgICAgICAgaW4gbGl0dGxlLWVuZGlhbiBvcmRlciBhcyB0aGUgJ2J5dGVzX2xlJyBhcmd1bWVudCwgYSB0dXBsZSBvZiBzaXgKKyAgICAgICAgaW50ZWdlcnMgKDMyLWJpdCB0aW1lX2xvdywgMTYtYml0IHRpbWVfbWlkLCAxNi1iaXQgdGltZV9oaV92ZXJzaW9uLAorICAgICAgICA4LWJpdCBjbG9ja19zZXFfaGlfdmFyaWFudCwgOC1iaXQgY2xvY2tfc2VxX2xvdywgNDgtYml0IG5vZGUpIGFzCisgICAgICAgIHRoZSAnZmllbGRzJyBhcmd1bWVudCwgb3IgYSBzaW5nbGUgMTI4LWJpdCBpbnRlZ2VyIGFzIHRoZSAnaW50JworICAgICAgICBhcmd1bWVudC4gIFdoZW4gYSBzdHJpbmcgb2YgaGV4IGRpZ2l0cyBpcyBnaXZlbiwgY3VybHkgYnJhY2VzLAorICAgICAgICBoeXBoZW5zLCBhbmQgYSBVUk4gcHJlZml4IGFyZSBhbGwgb3B0aW9uYWwuICBGb3IgZXhhbXBsZSwgdGhlc2UKKyAgICAgICAgZXhwcmVzc2lvbnMgYWxsIHlpZWxkIHRoZSBzYW1lIFVVSUQ6CisKKyAgICAgICAgVVVJRCgnezEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OH0nKQorICAgICAgICBVVUlEKCcxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3OCcpCisgICAgICAgIFVVSUQoJ3Vybjp1dWlkOjEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcpCisgICAgICAgIFVVSUQoYnl0ZXM9J1x4MTJceDM0XHg1Nlx4NzgnKjQpCisgICAgICAgIFVVSUQoYnl0ZXNfbGU9J1x4NzhceDU2XHgzNFx4MTJceDM0XHgxMlx4NzhceDU2JyArCisgICAgICAgICAgICAgICAgICAgICAgJ1x4MTJceDM0XHg1Nlx4NzhceDEyXHgzNFx4NTZceDc4JykKKyAgICAgICAgVVVJRChmaWVsZHM9KDB4MTIzNDU2NzgsIDB4MTIzNCwgMHg1Njc4LCAweDEyLCAweDM0LCAweDU2NzgxMjM0NTY3OCkpCisgICAgICAgIFVVSUQoaW50PTB4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgpCisKKyAgICAgICAgRXhhY3RseSBvbmUgb2YgJ2hleCcsICdieXRlcycsICdieXRlc19sZScsICdmaWVsZHMnLCBvciAnaW50JyBtdXN0CisgICAgICAgIGJlIGdpdmVuLiAgVGhlICd2ZXJzaW9uJyBhcmd1bWVudCBpcyBvcHRpb25hbDsgaWYgZ2l2ZW4sIHRoZSByZXN1bHRpbmcKKyAgICAgICAgVVVJRCB3aWxsIGhhdmUgaXRzIHZhcmlhbnQgYW5kIHZlcnNpb24gc2V0IGFjY29yZGluZyB0byBSRkMgNDEyMiwKKyAgICAgICAgb3ZlcnJpZGluZyB0aGUgZ2l2ZW4gJ2hleCcsICdieXRlcycsICdieXRlc19sZScsICdmaWVsZHMnLCBvciAnaW50Jy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgW2hleCwgYnl0ZXMsIGJ5dGVzX2xlLCBmaWVsZHMsIGludF0uY291bnQoTm9uZSkgIT0gNDoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbmVlZCBvbmUgb2YgaGV4LCBieXRlcywgYnl0ZXNfbGUsIGZpZWxkcywgb3IgaW50JykKKyAgICAgICAgaWYgaGV4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaGV4ID0gaGV4LnJlcGxhY2UoJ3VybjonLCAnJykucmVwbGFjZSgndXVpZDonLCAnJykKKyAgICAgICAgICAgIGhleCA9IGhleC5zdHJpcCgne30nKS5yZXBsYWNlKCctJywgJycpCisgICAgICAgICAgICBpZiBsZW4oaGV4KSAhPSAzMjoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdiYWRseSBmb3JtZWQgaGV4YWRlY2ltYWwgVVVJRCBzdHJpbmcnKQorICAgICAgICAgICAgaW50ID0gbG9uZyhoZXgsIDE2KQorICAgICAgICBpZiBieXRlc19sZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGxlbihieXRlc19sZSkgIT0gMTY6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignYnl0ZXNfbGUgaXMgbm90IGEgMTYtY2hhciBzdHJpbmcnKQorICAgICAgICAgICAgYnl0ZXMgPSAoYnl0ZXNfbGVbM10gKyBieXRlc19sZVsyXSArIGJ5dGVzX2xlWzFdICsgYnl0ZXNfbGVbMF0gKworICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfbGVbNV0gKyBieXRlc19sZVs0XSArIGJ5dGVzX2xlWzddICsgYnl0ZXNfbGVbNl0gKworICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfbGVbODpdKQorICAgICAgICBpZiBieXRlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGxlbihieXRlcykgIT0gMTY6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignYnl0ZXMgaXMgbm90IGEgMTYtY2hhciBzdHJpbmcnKQorICAgICAgICAgICAgaW50ID0gbG9uZygoJyUwMngnKjE2KSAlIHR1cGxlKG1hcChvcmQsIGJ5dGVzKSksIDE2KQorICAgICAgICBpZiBmaWVsZHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBsZW4oZmllbGRzKSAhPSA2OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkcyBpcyBub3QgYSA2LXR1cGxlJykKKyAgICAgICAgICAgICh0aW1lX2xvdywgdGltZV9taWQsIHRpbWVfaGlfdmVyc2lvbiwKKyAgICAgICAgICAgICBjbG9ja19zZXFfaGlfdmFyaWFudCwgY2xvY2tfc2VxX2xvdywgbm9kZSkgPSBmaWVsZHMKKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IHRpbWVfbG93IDwgMTw8MzJMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkIDEgb3V0IG9mIHJhbmdlIChuZWVkIGEgMzItYml0IHZhbHVlKScpCisgICAgICAgICAgICBpZiBub3QgMCA8PSB0aW1lX21pZCA8IDE8PDE2TDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmaWVsZCAyIG91dCBvZiByYW5nZSAobmVlZCBhIDE2LWJpdCB2YWx1ZSknKQorICAgICAgICAgICAgaWYgbm90IDAgPD0gdGltZV9oaV92ZXJzaW9uIDwgMTw8MTZMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkIDMgb3V0IG9mIHJhbmdlIChuZWVkIGEgMTYtYml0IHZhbHVlKScpCisgICAgICAgICAgICBpZiBub3QgMCA8PSBjbG9ja19zZXFfaGlfdmFyaWFudCA8IDE8PDhMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkIDQgb3V0IG9mIHJhbmdlIChuZWVkIGFuIDgtYml0IHZhbHVlKScpCisgICAgICAgICAgICBpZiBub3QgMCA8PSBjbG9ja19zZXFfbG93IDwgMTw8OEw6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZmllbGQgNSBvdXQgb2YgcmFuZ2UgKG5lZWQgYW4gOC1iaXQgdmFsdWUpJykKKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IG5vZGUgPCAxPDw0OEw6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZmllbGQgNiBvdXQgb2YgcmFuZ2UgKG5lZWQgYSA0OC1iaXQgdmFsdWUpJykKKyAgICAgICAgICAgIGNsb2NrX3NlcSA9IChjbG9ja19zZXFfaGlfdmFyaWFudCA8PCA4TCkgfCBjbG9ja19zZXFfbG93CisgICAgICAgICAgICBpbnQgPSAoKHRpbWVfbG93IDw8IDk2TCkgfCAodGltZV9taWQgPDwgODBMKSB8CisgICAgICAgICAgICAgICAgICAgKHRpbWVfaGlfdmVyc2lvbiA8PCA2NEwpIHwgKGNsb2NrX3NlcSA8PCA0OEwpIHwgbm9kZSkKKyAgICAgICAgaWYgaW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbm90IDAgPD0gaW50IDwgMTw8MTI4TDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnQgaXMgb3V0IG9mIHJhbmdlIChuZWVkIGEgMTI4LWJpdCB2YWx1ZSknKQorICAgICAgICBpZiB2ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbm90IDEgPD0gdmVyc2lvbiA8PSA1OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2lsbGVnYWwgdmVyc2lvbiBudW1iZXInKQorICAgICAgICAgICAgIyBTZXQgdGhlIHZhcmlhbnQgdG8gUkZDIDQxMjIuCisgICAgICAgICAgICBpbnQgJj0gfigweGMwMDAgPDwgNDhMKQorICAgICAgICAgICAgaW50IHw9IDB4ODAwMCA8PCA0OEwKKyAgICAgICAgICAgICMgU2V0IHRoZSB2ZXJzaW9uIG51bWJlci4KKyAgICAgICAgICAgIGludCAmPSB+KDB4ZjAwMCA8PCA2NEwpCisgICAgICAgICAgICBpbnQgfD0gdmVyc2lvbiA8PCA3NkwKKyAgICAgICAgc2VsZi5fX2RpY3RfX1snaW50J10gPSBpbnQKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVVVJRCk6CisgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuaW50LCBvdGhlci5pbnQpCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaChzZWxmLmludCkKKworICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbnQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICdVVUlEKCVyKScgJSBzdHIoc2VsZikKKworICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVVVJRCBvYmplY3RzIGFyZSBpbW11dGFibGUnKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGhleCA9ICclMDMyeCcgJSBzZWxmLmludAorICAgICAgICByZXR1cm4gJyVzLSVzLSVzLSVzLSVzJyAlICgKKyAgICAgICAgICAgIGhleFs6OF0sIGhleFs4OjEyXSwgaGV4WzEyOjE2XSwgaGV4WzE2OjIwXSwgaGV4WzIwOl0pCisKKyAgICBkZWYgZ2V0X2J5dGVzKHNlbGYpOgorICAgICAgICBieXRlcyA9ICcnCisgICAgICAgIGZvciBzaGlmdCBpbiByYW5nZSgwLCAxMjgsIDgpOgorICAgICAgICAgICAgYnl0ZXMgPSBjaHIoKHNlbGYuaW50ID4+IHNoaWZ0KSAmIDB4ZmYpICsgYnl0ZXMKKyAgICAgICAgcmV0dXJuIGJ5dGVzCisKKyAgICBieXRlcyA9IHByb3BlcnR5KGdldF9ieXRlcykKKworICAgIGRlZiBnZXRfYnl0ZXNfbGUoc2VsZik6CisgICAgICAgIGJ5dGVzID0gc2VsZi5ieXRlcworICAgICAgICByZXR1cm4gKGJ5dGVzWzNdICsgYnl0ZXNbMl0gKyBieXRlc1sxXSArIGJ5dGVzWzBdICsKKyAgICAgICAgICAgICAgICBieXRlc1s1XSArIGJ5dGVzWzRdICsgYnl0ZXNbN10gKyBieXRlc1s2XSArIGJ5dGVzWzg6XSkKKworICAgIGJ5dGVzX2xlID0gcHJvcGVydHkoZ2V0X2J5dGVzX2xlKQorCisgICAgZGVmIGdldF9maWVsZHMoc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi50aW1lX2xvdywgc2VsZi50aW1lX21pZCwgc2VsZi50aW1lX2hpX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgc2VsZi5jbG9ja19zZXFfaGlfdmFyaWFudCwgc2VsZi5jbG9ja19zZXFfbG93LCBzZWxmLm5vZGUpCisKKyAgICBmaWVsZHMgPSBwcm9wZXJ0eShnZXRfZmllbGRzKQorCisgICAgZGVmIGdldF90aW1lX2xvdyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW50ID4+IDk2TAorCisgICAgdGltZV9sb3cgPSBwcm9wZXJ0eShnZXRfdGltZV9sb3cpCisKKyAgICBkZWYgZ2V0X3RpbWVfbWlkKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuaW50ID4+IDgwTCkgJiAweGZmZmYKKworICAgIHRpbWVfbWlkID0gcHJvcGVydHkoZ2V0X3RpbWVfbWlkKQorCisgICAgZGVmIGdldF90aW1lX2hpX3ZlcnNpb24oc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi5pbnQgPj4gNjRMKSAmIDB4ZmZmZgorCisgICAgdGltZV9oaV92ZXJzaW9uID0gcHJvcGVydHkoZ2V0X3RpbWVfaGlfdmVyc2lvbikKKworICAgIGRlZiBnZXRfY2xvY2tfc2VxX2hpX3ZhcmlhbnQoc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi5pbnQgPj4gNTZMKSAmIDB4ZmYKKworICAgIGNsb2NrX3NlcV9oaV92YXJpYW50ID0gcHJvcGVydHkoZ2V0X2Nsb2NrX3NlcV9oaV92YXJpYW50KQorCisgICAgZGVmIGdldF9jbG9ja19zZXFfbG93KHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuaW50ID4+IDQ4TCkgJiAweGZmCisKKyAgICBjbG9ja19zZXFfbG93ID0gcHJvcGVydHkoZ2V0X2Nsb2NrX3NlcV9sb3cpCisKKyAgICBkZWYgZ2V0X3RpbWUoc2VsZik6CisgICAgICAgIHJldHVybiAoKChzZWxmLnRpbWVfaGlfdmVyc2lvbiAmIDB4MGZmZkwpIDw8IDQ4TCkgfAorICAgICAgICAgICAgICAgIChzZWxmLnRpbWVfbWlkIDw8IDMyTCkgfCBzZWxmLnRpbWVfbG93KQorCisgICAgdGltZSA9IHByb3BlcnR5KGdldF90aW1lKQorCisgICAgZGVmIGdldF9jbG9ja19zZXEoc2VsZik6CisgICAgICAgIHJldHVybiAoKChzZWxmLmNsb2NrX3NlcV9oaV92YXJpYW50ICYgMHgzZkwpIDw8IDhMKSB8CisgICAgICAgICAgICAgICAgc2VsZi5jbG9ja19zZXFfbG93KQorCisgICAgY2xvY2tfc2VxID0gcHJvcGVydHkoZ2V0X2Nsb2NrX3NlcSkKKworICAgIGRlZiBnZXRfbm9kZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW50ICYgMHhmZmZmZmZmZmZmZmYKKworICAgIG5vZGUgPSBwcm9wZXJ0eShnZXRfbm9kZSkKKworICAgIGRlZiBnZXRfaGV4KHNlbGYpOgorICAgICAgICByZXR1cm4gJyUwMzJ4JyAlIHNlbGYuaW50CisKKyAgICBoZXggPSBwcm9wZXJ0eShnZXRfaGV4KQorCisgICAgZGVmIGdldF91cm4oc2VsZik6CisgICAgICAgIHJldHVybiAndXJuOnV1aWQ6JyArIHN0cihzZWxmKQorCisgICAgdXJuID0gcHJvcGVydHkoZ2V0X3VybikKKworICAgIGRlZiBnZXRfdmFyaWFudChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuaW50ICYgKDB4ODAwMCA8PCA0OEwpOgorICAgICAgICAgICAgcmV0dXJuIFJFU0VSVkVEX05DUworICAgICAgICBlbGlmIG5vdCBzZWxmLmludCAmICgweDQwMDAgPDwgNDhMKToKKyAgICAgICAgICAgIHJldHVybiBSRkNfNDEyMgorICAgICAgICBlbGlmIG5vdCBzZWxmLmludCAmICgweDIwMDAgPDwgNDhMKToKKyAgICAgICAgICAgIHJldHVybiBSRVNFUlZFRF9NSUNST1NPRlQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBSRVNFUlZFRF9GVVRVUkUKKworICAgIHZhcmlhbnQgPSBwcm9wZXJ0eShnZXRfdmFyaWFudCkKKworICAgIGRlZiBnZXRfdmVyc2lvbihzZWxmKToKKyAgICAgICAgIyBUaGUgdmVyc2lvbiBiaXRzIGFyZSBvbmx5IG1lYW5pbmdmdWwgZm9yIFJGQyA0MTIyIFVVSURzLgorICAgICAgICBpZiBzZWxmLnZhcmlhbnQgPT0gUkZDXzQxMjI6CisgICAgICAgICAgICByZXR1cm4gaW50KChzZWxmLmludCA+PiA3NkwpICYgMHhmKQorCisgICAgdmVyc2lvbiA9IHByb3BlcnR5KGdldF92ZXJzaW9uKQorCitkZWYgX2ZpbmRfbWFjKGNvbW1hbmQsIGFyZ3MsIGh3X2lkZW50aWZpZXJzLCBnZXRfaW5kZXgpOgorICAgIGltcG9ydCBvcworICAgIGZvciBkaXIgaW4gWycnLCAnL3NiaW4vJywgJy91c3Ivc2JpbiddOgorICAgICAgICBleGVjdXRhYmxlID0gb3MucGF0aC5qb2luKGRpciwgY29tbWFuZCkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGV4ZWN1dGFibGUpOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIExDX0FMTCB0byBnZXQgRW5nbGlzaCBvdXRwdXQsIDI+L2Rldi9udWxsIHRvCisgICAgICAgICAgICAjIHByZXZlbnQgb3V0cHV0IG9uIHN0ZGVycgorICAgICAgICAgICAgY21kID0gJ0xDX0FMTD1DICVzICVzIDI+L2Rldi9udWxsJyAlIChleGVjdXRhYmxlLCBhcmdzKQorICAgICAgICAgICAgd2l0aCBvcy5wb3BlbihjbWQpIGFzIHBpcGU6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gcGlwZToKKyAgICAgICAgICAgICAgICAgICAgd29yZHMgPSBsaW5lLmxvd2VyKCkuc3BsaXQoKQorICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4od29yZHMpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdvcmRzW2ldIGluIGh3X2lkZW50aWZpZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRzW2dldF9pbmRleChpKV0ucmVwbGFjZSgnOicsICcnKSwgMTYpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgY29udGludWUKKyAgICByZXR1cm4gTm9uZQorCitkZWYgX2lmY29uZmlnX2dldG5vZGUoKToKKyAgICAiIiJHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb24gVW5peCBieSBydW5uaW5nIGlmY29uZmlnLiIiIgorCisgICAgIyBUaGlzIHdvcmtzIG9uIExpbnV4ICgnJyBvciAnLWEnKSwgVHJ1NjQgKCctYXYnKSwgYnV0IG5vdCBhbGwgVW5peGVzLgorICAgIGZvciBhcmdzIGluICgnJywgJy1hJywgJy1hdicpOgorICAgICAgICBtYWMgPSBfZmluZF9tYWMoJ2lmY29uZmlnJywgYXJncywgWydod2FkZHInLCAnZXRoZXInXSwgbGFtYmRhIGk6IGkrMSkKKyAgICAgICAgaWYgbWFjOgorICAgICAgICAgICAgcmV0dXJuIG1hYworCisgICAgaW1wb3J0IHNvY2tldAorICAgIGlwX2FkZHIgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKworICAgICMgVHJ5IGdldHRpbmcgdGhlIE1BQyBhZGRyIGZyb20gYXJwIGJhc2VkIG9uIG91ciBJUCBhZGRyZXNzIChTb2xhcmlzKS4KKyAgICBtYWMgPSBfZmluZF9tYWMoJ2FycCcsICctYW4nLCBbaXBfYWRkcl0sIGxhbWJkYSBpOiAtMSkKKyAgICBpZiBtYWM6CisgICAgICAgIHJldHVybiBtYWMKKworICAgICMgVGhpcyBtaWdodCB3b3JrIG9uIEhQLVVYLgorICAgIG1hYyA9IF9maW5kX21hYygnbGFuc2NhbicsICctYWknLCBbJ2xhbjAnXSwgbGFtYmRhIGk6IDApCisgICAgaWYgbWFjOgorICAgICAgICByZXR1cm4gbWFjCisKKyAgICByZXR1cm4gTm9uZQorCitkZWYgX2lwY29uZmlnX2dldG5vZGUoKToKKyAgICAiIiJHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb24gV2luZG93cyBieSBydW5uaW5nIGlwY29uZmlnLmV4ZS4iIiIKKyAgICBpbXBvcnQgb3MsIHJlCisgICAgZGlycyA9IFsnJywgcidjOlx3aW5kb3dzXHN5c3RlbTMyJywgcidjOlx3aW5udFxzeXN0ZW0zMiddCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgY3R5cGVzCisgICAgICAgIGJ1ZmZlciA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcigzMDApCisgICAgICAgIGN0eXBlcy53aW5kbGwua2VybmVsMzIuR2V0U3lzdGVtRGlyZWN0b3J5QShidWZmZXIsIDMwMCkKKyAgICAgICAgZGlycy5pbnNlcnQoMCwgYnVmZmVyLnZhbHVlLmRlY29kZSgnbWJjcycpKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworICAgIGZvciBkaXIgaW4gZGlyczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGlwZSA9IG9zLnBvcGVuKG9zLnBhdGguam9pbihkaXIsICdpcGNvbmZpZycpICsgJyAvYWxsJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gcGlwZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGxpbmUuc3BsaXQoJzonKVstMV0uc3RyaXAoKS5sb3dlcigpCisgICAgICAgICAgICAgICAgaWYgcmUubWF0Y2goJyhbMC05YS1mXVswLTlhLWZdLSl7NX1bMC05YS1mXVswLTlhLWZdJywgdmFsdWUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50KHZhbHVlLnJlcGxhY2UoJy0nLCAnJyksIDE2KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcGlwZS5jbG9zZSgpCisKK2RlZiBfbmV0Ymlvc19nZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9uIFdpbmRvd3MgdXNpbmcgTmV0QklPUyBjYWxscy4KKyAgICBTZWUgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xMTg2MjMgZm9yIGRldGFpbHMuIiIiCisgICAgaW1wb3J0IHdpbjMyd25ldCwgbmV0YmlvcworICAgIG5jYiA9IG5ldGJpb3MuTkNCKCkKKyAgICBuY2IuQ29tbWFuZCA9IG5ldGJpb3MuTkNCRU5VTQorICAgIG5jYi5CdWZmZXIgPSBhZGFwdGVycyA9IG5ldGJpb3MuTEFOQV9FTlVNKCkKKyAgICBhZGFwdGVycy5fcGFjaygpCisgICAgaWYgd2luMzJ3bmV0Lk5ldGJpb3MobmNiKSAhPSAwOgorICAgICAgICByZXR1cm4KKyAgICBhZGFwdGVycy5fdW5wYWNrKCkKKyAgICBmb3IgaSBpbiByYW5nZShhZGFwdGVycy5sZW5ndGgpOgorICAgICAgICBuY2IuUmVzZXQoKQorICAgICAgICBuY2IuQ29tbWFuZCA9IG5ldGJpb3MuTkNCUkVTRVQKKyAgICAgICAgbmNiLkxhbmFfbnVtID0gb3JkKGFkYXB0ZXJzLmxhbmFbaV0pCisgICAgICAgIGlmIHdpbjMyd25ldC5OZXRiaW9zKG5jYikgIT0gMDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG5jYi5SZXNldCgpCisgICAgICAgIG5jYi5Db21tYW5kID0gbmV0Ymlvcy5OQ0JBU1RBVAorICAgICAgICBuY2IuTGFuYV9udW0gPSBvcmQoYWRhcHRlcnMubGFuYVtpXSkKKyAgICAgICAgbmNiLkNhbGxuYW1lID0gJyonLmxqdXN0KDE2KQorICAgICAgICBuY2IuQnVmZmVyID0gc3RhdHVzID0gbmV0Ymlvcy5BREFQVEVSX1NUQVRVUygpCisgICAgICAgIGlmIHdpbjMyd25ldC5OZXRiaW9zKG5jYikgIT0gMDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHN0YXR1cy5fdW5wYWNrKCkKKyAgICAgICAgYnl0ZXMgPSBtYXAob3JkLCBzdGF0dXMuYWRhcHRlcl9hZGRyZXNzKQorICAgICAgICByZXR1cm4gKChieXRlc1swXTw8NDBMKSArIChieXRlc1sxXTw8MzJMKSArIChieXRlc1syXTw8MjRMKSArCisgICAgICAgICAgICAgICAgKGJ5dGVzWzNdPDwxNkwpICsgKGJ5dGVzWzRdPDw4TCkgKyBieXRlc1s1XSkKKworIyBUaGFua3MgdG8gVGhvbWFzIEhlbGxlciBmb3IgY3R5cGVzIGFuZCBmb3IgaGlzIGhlbHAgd2l0aCBpdHMgdXNlIGhlcmUuCisKKyMgSWYgY3R5cGVzIGlzIGF2YWlsYWJsZSwgdXNlIGl0IHRvIGZpbmQgc3lzdGVtIHJvdXRpbmVzIGZvciBVVUlEIGdlbmVyYXRpb24uCitfdXVpZF9nZW5lcmF0ZV9yYW5kb20gPSBfdXVpZF9nZW5lcmF0ZV90aW1lID0gX1V1aWRDcmVhdGUgPSBOb25lCit0cnk6CisgICAgaW1wb3J0IGN0eXBlcywgY3R5cGVzLnV0aWwKKworICAgICMgVGhlIHV1aWRfZ2VuZXJhdGVfKiByb3V0aW5lcyBhcmUgcHJvdmlkZWQgYnkgbGlidXVpZCBvbiBhdCBsZWFzdAorICAgICMgTGludXggYW5kIEZyZWVCU0QsIGFuZCBwcm92aWRlZCBieSBsaWJjIG9uIE1hYyBPUyBYLgorICAgIGZvciBsaWJuYW1lIGluIFsndXVpZCcsICdjJ106CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpYiA9IGN0eXBlcy5DRExMKGN0eXBlcy51dGlsLmZpbmRfbGlicmFyeShsaWJuYW1lKSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgaGFzYXR0cihsaWIsICd1dWlkX2dlbmVyYXRlX3JhbmRvbScpOgorICAgICAgICAgICAgX3V1aWRfZ2VuZXJhdGVfcmFuZG9tID0gbGliLnV1aWRfZ2VuZXJhdGVfcmFuZG9tCisgICAgICAgIGlmIGhhc2F0dHIobGliLCAndXVpZF9nZW5lcmF0ZV90aW1lJyk6CisgICAgICAgICAgICBfdXVpZF9nZW5lcmF0ZV90aW1lID0gbGliLnV1aWRfZ2VuZXJhdGVfdGltZQorCisgICAgIyBUaGUgdXVpZF9nZW5lcmF0ZV8qIGZ1bmN0aW9ucyBhcmUgYnJva2VuIG9uIE1hY09TIFggMTAuNSwgYXMgbm90ZWQKKyAgICAjIGluIGlzc3VlICM4NjIxIHRoZSBmdW5jdGlvbiBnZW5lcmF0ZXMgdGhlIHNhbWUgc2VxdWVuY2Ugb2YgdmFsdWVzCisgICAgIyBpbiB0aGUgcGFyZW50IHByb2Nlc3MgYW5kIGFsbCBjaGlsZHJlbiBjcmVhdGVkIHVzaW5nIGZvcmsgKHVubGVzcworICAgICMgdGhvc2UgY2hpbGRyZW4gdXNlIGV4ZWMgYXMgd2VsbCkuCisgICAgIworICAgICMgQXNzdW1lIHRoYXQgdGhlIHV1aWRfZ2VuZXJhdGUgZnVuY3Rpb25zIGFyZSBicm9rZW4gZnJvbSAxMC41IG9ud2FyZCwKKyAgICAjIHRoZSB0ZXN0IGNhbiBiZSBhZGp1c3RlZCB3aGVuIGEgbGF0ZXIgdmVyc2lvbiBpcyBmaXhlZC4KKyAgICBpbXBvcnQgc3lzCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaWYgaW50KG9zLnVuYW1lKClbMl0uc3BsaXQoJy4nKVswXSkgPj0gOToKKyAgICAgICAgICAgIF91dWlkX2dlbmVyYXRlX3JhbmRvbSA9IF91dWlkX2dlbmVyYXRlX3RpbWUgPSBOb25lCisKKyAgICAjIE9uIFdpbmRvd3MgcHJpb3IgdG8gMjAwMCwgVXVpZENyZWF0ZSBnaXZlcyBhIFVVSUQgY29udGFpbmluZyB0aGUKKyAgICAjIGhhcmR3YXJlIGFkZHJlc3MuICBPbiBXaW5kb3dzIDIwMDAgYW5kIGxhdGVyLCBVdWlkQ3JlYXRlIG1ha2VzIGEKKyAgICAjIHJhbmRvbSBVVUlEIGFuZCBVdWlkQ3JlYXRlU2VxdWVudGlhbCBnaXZlcyBhIFVVSUQgY29udGFpbmluZyB0aGUKKyAgICAjIGhhcmR3YXJlIGFkZHJlc3MuICBUaGVzZSByb3V0aW5lcyBhcmUgcHJvdmlkZWQgYnkgdGhlIFJQQyBydW50aW1lLgorICAgICMgTk9URTogIGF0IGxlYXN0IG9uIFRpbSdzIFdpblhQIFBybyBTUDIgZGVza3RvcCBib3gsIHdoaWxlIHRoZSBsYXN0CisgICAgIyA2IGJ5dGVzIHJldHVybmVkIGJ5IFV1aWRDcmVhdGVTZXF1ZW50aWFsIGFyZSBmaXhlZCwgdGhleSBkb24ndCBhcHBlYXIKKyAgICAjIHRvIGJlYXIgYW55IHJlbGF0aW9uc2hpcCB0byB0aGUgTUFDIGFkZHJlc3Mgb2YgYW55IG5ldHdvcmsgZGV2aWNlCisgICAgIyBvbiB0aGUgYm94LgorICAgIHRyeToKKyAgICAgICAgbGliID0gY3R5cGVzLndpbmRsbC5ycGNydDQKKyAgICBleGNlcHQ6CisgICAgICAgIGxpYiA9IE5vbmUKKyAgICBfVXVpZENyZWF0ZSA9IGdldGF0dHIobGliLCAnVXVpZENyZWF0ZVNlcXVlbnRpYWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGxpYiwgJ1V1aWRDcmVhdGUnLCBOb25lKSkKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2RlZiBfdW5peGRsbF9nZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9uIFVuaXggdXNpbmcgY3R5cGVzLiIiIgorICAgIF9idWZmZXIgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIoMTYpCisgICAgX3V1aWRfZ2VuZXJhdGVfdGltZShfYnVmZmVyKQorICAgIHJldHVybiBVVUlEKGJ5dGVzPV9idWZmZXIucmF3KS5ub2RlCisKK2RlZiBfd2luZGxsX2dldG5vZGUoKToKKyAgICAiIiJHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb24gV2luZG93cyB1c2luZyBjdHlwZXMuIiIiCisgICAgX2J1ZmZlciA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcigxNikKKyAgICBpZiBfVXVpZENyZWF0ZShfYnVmZmVyKSA9PSAwOgorICAgICAgICByZXR1cm4gVVVJRChieXRlcz1fYnVmZmVyLnJhdykubm9kZQorCitkZWYgX3JhbmRvbV9nZXRub2RlKCk6CisgICAgIiIiR2V0IGEgcmFuZG9tIG5vZGUgSUQsIHdpdGggZWlnaHRoIGJpdCBzZXQgYXMgc3VnZ2VzdGVkIGJ5IFJGQyA0MTIyLiIiIgorICAgIGltcG9ydCByYW5kb20KKyAgICByZXR1cm4gcmFuZG9tLnJhbmRyYW5nZSgwLCAxPDw0OEwpIHwgMHgwMTAwMDAwMDAwMDBMCisKK19ub2RlID0gTm9uZQorCitkZWYgZ2V0bm9kZSgpOgorICAgICIiIkdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBhcyBhIDQ4LWJpdCBwb3NpdGl2ZSBpbnRlZ2VyLgorCisgICAgVGhlIGZpcnN0IHRpbWUgdGhpcyBydW5zLCBpdCBtYXkgbGF1bmNoIGEgc2VwYXJhdGUgcHJvZ3JhbSwgd2hpY2ggY291bGQKKyAgICBiZSBxdWl0ZSBzbG93LiAgSWYgYWxsIGF0dGVtcHRzIHRvIG9idGFpbiB0aGUgaGFyZHdhcmUgYWRkcmVzcyBmYWlsLCB3ZQorICAgIGNob29zZSBhIHJhbmRvbSA0OC1iaXQgbnVtYmVyIHdpdGggaXRzIGVpZ2h0aCBiaXQgc2V0IHRvIDEgYXMgcmVjb21tZW5kZWQKKyAgICBpbiBSRkMgNDEyMi4KKyAgICAiIiIKKworICAgIGdsb2JhbCBfbm9kZQorICAgIGlmIF9ub2RlIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gX25vZGUKKworICAgIGltcG9ydCBzeXMKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgZ2V0dGVycyA9IFtfd2luZGxsX2dldG5vZGUsIF9uZXRiaW9zX2dldG5vZGUsIF9pcGNvbmZpZ19nZXRub2RlXQorICAgIGVsc2U6CisgICAgICAgIGdldHRlcnMgPSBbX3VuaXhkbGxfZ2V0bm9kZSwgX2lmY29uZmlnX2dldG5vZGVdCisKKyAgICBmb3IgZ2V0dGVyIGluIGdldHRlcnMgKyBbX3JhbmRvbV9nZXRub2RlXToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX25vZGUgPSBnZXR0ZXIoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBfbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBfbm9kZQorCitfbGFzdF90aW1lc3RhbXAgPSBOb25lCisKK2RlZiB1dWlkMShub2RlPU5vbmUsIGNsb2NrX3NlcT1Ob25lKToKKyAgICAiIiJHZW5lcmF0ZSBhIFVVSUQgZnJvbSBhIGhvc3QgSUQsIHNlcXVlbmNlIG51bWJlciwgYW5kIHRoZSBjdXJyZW50IHRpbWUuCisgICAgSWYgJ25vZGUnIGlzIG5vdCBnaXZlbiwgZ2V0bm9kZSgpIGlzIHVzZWQgdG8gb2J0YWluIHRoZSBoYXJkd2FyZQorICAgIGFkZHJlc3MuICBJZiAnY2xvY2tfc2VxJyBpcyBnaXZlbiwgaXQgaXMgdXNlZCBhcyB0aGUgc2VxdWVuY2UgbnVtYmVyOworICAgIG90aGVyd2lzZSBhIHJhbmRvbSAxNC1iaXQgc2VxdWVuY2UgbnVtYmVyIGlzIGNob3Nlbi4iIiIKKworICAgICMgV2hlbiB0aGUgc3lzdGVtIHByb3ZpZGVzIGEgdmVyc2lvbi0xIFVVSUQgZ2VuZXJhdG9yLCB1c2UgaXQgKGJ1dCBkb24ndAorICAgICMgdXNlIFV1aWRDcmVhdGUgaGVyZSBiZWNhdXNlIGl0cyBVVUlEcyBkb24ndCBjb25mb3JtIHRvIFJGQyA0MTIyKS4KKyAgICBpZiBfdXVpZF9nZW5lcmF0ZV90aW1lIGFuZCBub2RlIGlzIGNsb2NrX3NlcSBpcyBOb25lOgorICAgICAgICBfYnVmZmVyID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKDE2KQorICAgICAgICBfdXVpZF9nZW5lcmF0ZV90aW1lKF9idWZmZXIpCisgICAgICAgIHJldHVybiBVVUlEKGJ5dGVzPV9idWZmZXIucmF3KQorCisgICAgZ2xvYmFsIF9sYXN0X3RpbWVzdGFtcAorICAgIGltcG9ydCB0aW1lCisgICAgbmFub3NlY29uZHMgPSBpbnQodGltZS50aW1lKCkgKiAxZTkpCisgICAgIyAweDAxYjIxZGQyMTM4MTQwMDAgaXMgdGhlIG51bWJlciBvZiAxMDAtbnMgaW50ZXJ2YWxzIGJldHdlZW4gdGhlCisgICAgIyBVVUlEIGVwb2NoIDE1ODItMTAtMTUgMDA6MDA6MDAgYW5kIHRoZSBVbml4IGVwb2NoIDE5NzAtMDEtMDEgMDA6MDA6MDAuCisgICAgdGltZXN0YW1wID0gaW50KG5hbm9zZWNvbmRzLy8xMDApICsgMHgwMWIyMWRkMjEzODE0MDAwTAorICAgIGlmIF9sYXN0X3RpbWVzdGFtcCBpcyBub3QgTm9uZSBhbmQgdGltZXN0YW1wIDw9IF9sYXN0X3RpbWVzdGFtcDoKKyAgICAgICAgdGltZXN0YW1wID0gX2xhc3RfdGltZXN0YW1wICsgMQorICAgIF9sYXN0X3RpbWVzdGFtcCA9IHRpbWVzdGFtcAorICAgIGlmIGNsb2NrX3NlcSBpcyBOb25lOgorICAgICAgICBpbXBvcnQgcmFuZG9tCisgICAgICAgIGNsb2NrX3NlcSA9IHJhbmRvbS5yYW5kcmFuZ2UoMTw8MTRMKSAjIGluc3RlYWQgb2Ygc3RhYmxlIHN0b3JhZ2UKKyAgICB0aW1lX2xvdyA9IHRpbWVzdGFtcCAmIDB4ZmZmZmZmZmZMCisgICAgdGltZV9taWQgPSAodGltZXN0YW1wID4+IDMyTCkgJiAweGZmZmZMCisgICAgdGltZV9oaV92ZXJzaW9uID0gKHRpbWVzdGFtcCA+PiA0OEwpICYgMHgwZmZmTAorICAgIGNsb2NrX3NlcV9sb3cgPSBjbG9ja19zZXEgJiAweGZmTAorICAgIGNsb2NrX3NlcV9oaV92YXJpYW50ID0gKGNsb2NrX3NlcSA+PiA4TCkgJiAweDNmTAorICAgIGlmIG5vZGUgaXMgTm9uZToKKyAgICAgICAgbm9kZSA9IGdldG5vZGUoKQorICAgIHJldHVybiBVVUlEKGZpZWxkcz0odGltZV9sb3csIHRpbWVfbWlkLCB0aW1lX2hpX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9ja19zZXFfaGlfdmFyaWFudCwgY2xvY2tfc2VxX2xvdywgbm9kZSksIHZlcnNpb249MSkKKworZGVmIHV1aWQzKG5hbWVzcGFjZSwgbmFtZSk6CisgICAgIiIiR2VuZXJhdGUgYSBVVUlEIGZyb20gdGhlIE1ENSBoYXNoIG9mIGEgbmFtZXNwYWNlIFVVSUQgYW5kIGEgbmFtZS4iIiIKKyAgICBmcm9tIGhhc2hsaWIgaW1wb3J0IG1kNQorICAgIGhhc2ggPSBtZDUobmFtZXNwYWNlLmJ5dGVzICsgbmFtZSkuZGlnZXN0KCkKKyAgICByZXR1cm4gVVVJRChieXRlcz1oYXNoWzoxNl0sIHZlcnNpb249MykKKworZGVmIHV1aWQ0KCk6CisgICAgIiIiR2VuZXJhdGUgYSByYW5kb20gVVVJRC4iIiIKKworICAgICMgV2hlbiB0aGUgc3lzdGVtIHByb3ZpZGVzIGEgdmVyc2lvbi00IFVVSUQgZ2VuZXJhdG9yLCB1c2UgaXQuCisgICAgaWYgX3V1aWRfZ2VuZXJhdGVfcmFuZG9tOgorICAgICAgICBfYnVmZmVyID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKDE2KQorICAgICAgICBfdXVpZF9nZW5lcmF0ZV9yYW5kb20oX2J1ZmZlcikKKyAgICAgICAgcmV0dXJuIFVVSUQoYnl0ZXM9X2J1ZmZlci5yYXcpCisKKyAgICAjIE90aGVyd2lzZSwgZ2V0IHJhbmRvbW5lc3MgZnJvbSB1cmFuZG9tIG9yIHRoZSAncmFuZG9tJyBtb2R1bGUuCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgcmV0dXJuIFVVSUQoYnl0ZXM9b3MudXJhbmRvbSgxNiksIHZlcnNpb249NCkKKyAgICBleGNlcHQ6CisgICAgICAgIGltcG9ydCByYW5kb20KKyAgICAgICAgYnl0ZXMgPSBbY2hyKHJhbmRvbS5yYW5kcmFuZ2UoMjU2KSkgZm9yIGkgaW4gcmFuZ2UoMTYpXQorICAgICAgICByZXR1cm4gVVVJRChieXRlcz1ieXRlcywgdmVyc2lvbj00KQorCitkZWYgdXVpZDUobmFtZXNwYWNlLCBuYW1lKToKKyAgICAiIiJHZW5lcmF0ZSBhIFVVSUQgZnJvbSB0aGUgU0hBLTEgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUuIiIiCisgICAgZnJvbSBoYXNobGliIGltcG9ydCBzaGExCisgICAgaGFzaCA9IHNoYTEobmFtZXNwYWNlLmJ5dGVzICsgbmFtZSkuZGlnZXN0KCkKKyAgICByZXR1cm4gVVVJRChieXRlcz1oYXNoWzoxNl0sIHZlcnNpb249NSkKKworIyBUaGUgZm9sbG93aW5nIHN0YW5kYXJkIFVVSURzIGFyZSBmb3IgdXNlIHdpdGggdXVpZDMoKSBvciB1dWlkNSgpLgorCitOQU1FU1BBQ0VfRE5TID0gVVVJRCgnNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JykKK05BTUVTUEFDRV9VUkwgPSBVVUlEKCc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnKQorTkFNRVNQQUNFX09JRCA9IFVVSUQoJzZiYTdiODEyLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcpCitOQU1FU1BBQ0VfWDUwMCA9IFVVSUQoJzZiYTdiODE0LTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3V1aWQucHljIGIvbGliL3B5dGhvbjIuNy91dWlkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ1NGYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91dWlkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3V1aWQucHlvIGIvbGliL3B5dGhvbjIuNy91dWlkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQ1NGYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91dWlkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3dhcm5pbmdzLnB5IGIvbGliL3B5dGhvbjIuNy93YXJuaW5ncy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGI3MGFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93YXJuaW5ncy5weQpAQCAtMCwwICsxLDQwMCBAQAorIiIiUHl0aG9uIHBhcnQgb2YgdGhlIHdhcm5pbmdzIHN1YnN5c3RlbS4iIiIKKworIyBOb3RlOiBmdW5jdGlvbiBsZXZlbCBpbXBvcnRzIHNob3VsZCAqbm90KiBiZSB1c2VkCisjIGluIHRoaXMgbW9kdWxlIGFzIGl0IG1heSBjYXVzZSBpbXBvcnQgbG9jayBkZWFkbG9jay4KKyMgU2VlIGJ1ZyA2ODM2NTguCitpbXBvcnQgbGluZWNhY2hlCitpbXBvcnQgc3lzCitpbXBvcnQgdHlwZXMKKworX19hbGxfXyA9IFsid2FybiIsICJzaG93d2FybmluZyIsICJmb3JtYXR3YXJuaW5nIiwgImZpbHRlcndhcm5pbmdzIiwKKyAgICAgICAgICAgInJlc2V0d2FybmluZ3MiLCAiY2F0Y2hfd2FybmluZ3MiXQorCisKK2RlZiB3YXJucHkzayhtZXNzYWdlLCBjYXRlZ29yeT1Ob25lLCBzdGFja2xldmVsPTEpOgorICAgICIiIklzc3VlIGEgZGVwcmVjYXRpb24gd2FybmluZyBmb3IgUHl0aG9uIDMueCByZWxhdGVkIGNoYW5nZXMuCisKKyAgICBXYXJuaW5ncyBhcmUgb21pdHRlZCB1bmxlc3MgUHl0aG9uIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgLTMgb3B0aW9uLgorICAgICIiIgorICAgIGlmIHN5cy5weTNrd2FybmluZzoKKyAgICAgICAgaWYgY2F0ZWdvcnkgaXMgTm9uZToKKyAgICAgICAgICAgIGNhdGVnb3J5ID0gRGVwcmVjYXRpb25XYXJuaW5nCisgICAgICAgIHdhcm4obWVzc2FnZSwgY2F0ZWdvcnksIHN0YWNrbGV2ZWwrMSkKKworZGVmIF9zaG93X3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwgbGluZT1Ob25lKToKKyAgICAiIiJIb29rIHRvIHdyaXRlIGEgd2FybmluZyB0byBhIGZpbGU7IHJlcGxhY2UgaWYgeW91IGxpa2UuIiIiCisgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICBmaWxlID0gc3lzLnN0ZGVycgorICAgIHRyeToKKyAgICAgICAgZmlsZS53cml0ZShmb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lKSkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcGFzcyAjIHRoZSBmaWxlIChwcm9iYWJseSBzdGRlcnIpIGlzIGludmFsaWQgLSB0aGlzIHdhcm5pbmcgZ2V0cyBsb3N0LgorIyBLZWVwIGEgd29ya2luZyB2ZXJzaW9uIGFyb3VuZCBpbiBjYXNlIHRoZSBkZXByZWNhdGlvbiBvZiB0aGUgb2xkIEFQSSBpcworIyB0cmlnZ2VyZWQuCitzaG93d2FybmluZyA9IF9zaG93X3dhcm5pbmcKKworZGVmIGZvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGxpbmU9Tm9uZSk6CisgICAgIiIiRnVuY3Rpb24gdG8gZm9ybWF0IGEgd2FybmluZyB0aGUgc3RhbmRhcmQgd2F5LiIiIgorICAgIHMgPSAgIiVzOiVzOiAlczogJXNcbiIgJSAoZmlsZW5hbWUsIGxpbmVubywgY2F0ZWdvcnkuX19uYW1lX18sIG1lc3NhZ2UpCisgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pIGlmIGxpbmUgaXMgTm9uZSBlbHNlIGxpbmUKKyAgICBpZiBsaW5lOgorICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgIHMgKz0gIiAgJXNcbiIgJSBsaW5lCisgICAgcmV0dXJuIHMKKworZGVmIGZpbHRlcndhcm5pbmdzKGFjdGlvbiwgbWVzc2FnZT0iIiwgY2F0ZWdvcnk9V2FybmluZywgbW9kdWxlPSIiLCBsaW5lbm89MCwKKyAgICAgICAgICAgICAgICAgICBhcHBlbmQ9MCk6CisgICAgIiIiSW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIGxpc3Qgb2Ygd2FybmluZ3MgZmlsdGVycyAoYXQgdGhlIGZyb250KS4KKworICAgICdhY3Rpb24nIC0tIG9uZSBvZiAiZXJyb3IiLCAiaWdub3JlIiwgImFsd2F5cyIsICJkZWZhdWx0IiwgIm1vZHVsZSIsCisgICAgICAgICAgICAgICAgb3IgIm9uY2UiCisgICAgJ21lc3NhZ2UnIC0tIGEgcmVnZXggdGhhdCB0aGUgd2FybmluZyBtZXNzYWdlIG11c3QgbWF0Y2gKKyAgICAnY2F0ZWdvcnknIC0tIGEgY2xhc3MgdGhhdCB0aGUgd2FybmluZyBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YKKyAgICAnbW9kdWxlJyAtLSBhIHJlZ2V4IHRoYXQgdGhlIG1vZHVsZSBuYW1lIG11c3QgbWF0Y2gKKyAgICAnbGluZW5vJyAtLSBhbiBpbnRlZ2VyIGxpbmUgbnVtYmVyLCAwIG1hdGNoZXMgYWxsIHdhcm5pbmdzCisgICAgJ2FwcGVuZCcgLS0gaWYgdHJ1ZSwgYXBwZW5kIHRvIHRoZSBsaXN0IG9mIGZpbHRlcnMKKyAgICAiIiIKKyAgICBpbXBvcnQgcmUKKyAgICBhc3NlcnQgYWN0aW9uIGluICgiZXJyb3IiLCAiaWdub3JlIiwgImFsd2F5cyIsICJkZWZhdWx0IiwgIm1vZHVsZSIsCisgICAgICAgICAgICAgICAgICAgICAgIm9uY2UiKSwgImludmFsaWQgYWN0aW9uOiAlciIgJSAoYWN0aW9uLCkKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShtZXNzYWdlLCBiYXNlc3RyaW5nKSwgIm1lc3NhZ2UgbXVzdCBiZSBhIHN0cmluZyIKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShjYXRlZ29yeSwgKHR5cGUsIHR5cGVzLkNsYXNzVHlwZSkpLCBcCisgICAgICAgICAgICJjYXRlZ29yeSBtdXN0IGJlIGEgY2xhc3MiCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoY2F0ZWdvcnksIFdhcm5pbmcpLCAiY2F0ZWdvcnkgbXVzdCBiZSBhIFdhcm5pbmcgc3ViY2xhc3MiCisgICAgYXNzZXJ0IGlzaW5zdGFuY2UobW9kdWxlLCBiYXNlc3RyaW5nKSwgIm1vZHVsZSBtdXN0IGJlIGEgc3RyaW5nIgorICAgIGFzc2VydCBpc2luc3RhbmNlKGxpbmVubywgaW50KSBhbmQgbGluZW5vID49IDAsIFwKKyAgICAgICAgICAgImxpbmVubyBtdXN0IGJlIGFuIGludCA+PSAwIgorICAgIGl0ZW0gPSAoYWN0aW9uLCByZS5jb21waWxlKG1lc3NhZ2UsIHJlLkkpLCBjYXRlZ29yeSwKKyAgICAgICAgICAgIHJlLmNvbXBpbGUobW9kdWxlKSwgbGluZW5vKQorICAgIGlmIGFwcGVuZDoKKyAgICAgICAgZmlsdGVycy5hcHBlbmQoaXRlbSkKKyAgICBlbHNlOgorICAgICAgICBmaWx0ZXJzLmluc2VydCgwLCBpdGVtKQorCitkZWYgc2ltcGxlZmlsdGVyKGFjdGlvbiwgY2F0ZWdvcnk9V2FybmluZywgbGluZW5vPTAsIGFwcGVuZD0wKToKKyAgICAiIiJJbnNlcnQgYSBzaW1wbGUgZW50cnkgaW50byB0aGUgbGlzdCBvZiB3YXJuaW5ncyBmaWx0ZXJzIChhdCB0aGUgZnJvbnQpLgorCisgICAgQSBzaW1wbGUgZmlsdGVyIG1hdGNoZXMgYWxsIG1vZHVsZXMgYW5kIG1lc3NhZ2VzLgorICAgICdhY3Rpb24nIC0tIG9uZSBvZiAiZXJyb3IiLCAiaWdub3JlIiwgImFsd2F5cyIsICJkZWZhdWx0IiwgIm1vZHVsZSIsCisgICAgICAgICAgICAgICAgb3IgIm9uY2UiCisgICAgJ2NhdGVnb3J5JyAtLSBhIGNsYXNzIHRoYXQgdGhlIHdhcm5pbmcgbXVzdCBiZSBhIHN1YmNsYXNzIG9mCisgICAgJ2xpbmVubycgLS0gYW4gaW50ZWdlciBsaW5lIG51bWJlciwgMCBtYXRjaGVzIGFsbCB3YXJuaW5ncworICAgICdhcHBlbmQnIC0tIGlmIHRydWUsIGFwcGVuZCB0byB0aGUgbGlzdCBvZiBmaWx0ZXJzCisgICAgIiIiCisgICAgYXNzZXJ0IGFjdGlvbiBpbiAoImVycm9yIiwgImlnbm9yZSIsICJhbHdheXMiLCAiZGVmYXVsdCIsICJtb2R1bGUiLAorICAgICAgICAgICAgICAgICAgICAgICJvbmNlIiksICJpbnZhbGlkIGFjdGlvbjogJXIiICUgKGFjdGlvbiwpCisgICAgYXNzZXJ0IGlzaW5zdGFuY2UobGluZW5vLCBpbnQpIGFuZCBsaW5lbm8gPj0gMCwgXAorICAgICAgICAgICAibGluZW5vIG11c3QgYmUgYW4gaW50ID49IDAiCisgICAgaXRlbSA9IChhY3Rpb24sIE5vbmUsIGNhdGVnb3J5LCBOb25lLCBsaW5lbm8pCisgICAgaWYgYXBwZW5kOgorICAgICAgICBmaWx0ZXJzLmFwcGVuZChpdGVtKQorICAgIGVsc2U6CisgICAgICAgIGZpbHRlcnMuaW5zZXJ0KDAsIGl0ZW0pCisKK2RlZiByZXNldHdhcm5pbmdzKCk6CisgICAgIiIiQ2xlYXIgdGhlIGxpc3Qgb2Ygd2FybmluZyBmaWx0ZXJzLCBzbyB0aGF0IG5vIGZpbHRlcnMgYXJlIGFjdGl2ZS4iIiIKKyAgICBmaWx0ZXJzWzpdID0gW10KKworY2xhc3MgX09wdGlvbkVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHVzZWQgYnkgb3B0aW9uIHByb2Nlc3NpbmcgaGVscGVycy4iIiIKKyAgICBwYXNzCisKKyMgSGVscGVyIHRvIHByb2Nlc3MgLVcgb3B0aW9ucyBwYXNzZWQgdmlhIHN5cy53YXJub3B0aW9ucworZGVmIF9wcm9jZXNzb3B0aW9ucyhhcmdzKToKKyAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9zZXRvcHRpb24oYXJnKQorICAgICAgICBleGNlcHQgX09wdGlvbkVycm9yLCBtc2c6CisgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJJbnZhbGlkIC1XIG9wdGlvbiBpZ25vcmVkOiIsIG1zZworCisjIEhlbHBlciBmb3IgX3Byb2Nlc3NvcHRpb25zKCkKK2RlZiBfc2V0b3B0aW9uKGFyZyk6CisgICAgaW1wb3J0IHJlCisgICAgcGFydHMgPSBhcmcuc3BsaXQoJzonKQorICAgIGlmIGxlbihwYXJ0cykgPiA1OgorICAgICAgICByYWlzZSBfT3B0aW9uRXJyb3IoInRvbyBtYW55IGZpZWxkcyAobWF4IDUpOiAlciIgJSAoYXJnLCkpCisgICAgd2hpbGUgbGVuKHBhcnRzKSA8IDU6CisgICAgICAgIHBhcnRzLmFwcGVuZCgnJykKKyAgICBhY3Rpb24sIG1lc3NhZ2UsIGNhdGVnb3J5LCBtb2R1bGUsIGxpbmVubyA9IFtzLnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcyBpbiBwYXJ0c10KKyAgICBhY3Rpb24gPSBfZ2V0YWN0aW9uKGFjdGlvbikKKyAgICBtZXNzYWdlID0gcmUuZXNjYXBlKG1lc3NhZ2UpCisgICAgY2F0ZWdvcnkgPSBfZ2V0Y2F0ZWdvcnkoY2F0ZWdvcnkpCisgICAgbW9kdWxlID0gcmUuZXNjYXBlKG1vZHVsZSkKKyAgICBpZiBtb2R1bGU6CisgICAgICAgIG1vZHVsZSA9IG1vZHVsZSArICckJworICAgIGlmIGxpbmVubzoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGluZW5vID0gaW50KGxpbmVubykKKyAgICAgICAgICAgIGlmIGxpbmVubyA8IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgcmFpc2UgX09wdGlvbkVycm9yKCJpbnZhbGlkIGxpbmVubyAlciIgJSAobGluZW5vLCkpCisgICAgZWxzZToKKyAgICAgICAgbGluZW5vID0gMAorICAgIGZpbHRlcndhcm5pbmdzKGFjdGlvbiwgbWVzc2FnZSwgY2F0ZWdvcnksIG1vZHVsZSwgbGluZW5vKQorCisjIEhlbHBlciBmb3IgX3NldG9wdGlvbigpCitkZWYgX2dldGFjdGlvbihhY3Rpb24pOgorICAgIGlmIG5vdCBhY3Rpb246CisgICAgICAgIHJldHVybiAiZGVmYXVsdCIKKyAgICBpZiBhY3Rpb24gPT0gImFsbCI6IHJldHVybiAiYWx3YXlzIiAjIEFsaWFzCisgICAgZm9yIGEgaW4gKCdkZWZhdWx0JywgJ2Fsd2F5cycsICdpZ25vcmUnLCAnbW9kdWxlJywgJ29uY2UnLCAnZXJyb3InKToKKyAgICAgICAgaWYgYS5zdGFydHN3aXRoKGFjdGlvbik6CisgICAgICAgICAgICByZXR1cm4gYQorICAgIHJhaXNlIF9PcHRpb25FcnJvcigiaW52YWxpZCBhY3Rpb246ICVyIiAlIChhY3Rpb24sKSkKKworIyBIZWxwZXIgZm9yIF9zZXRvcHRpb24oKQorZGVmIF9nZXRjYXRlZ29yeShjYXRlZ29yeSk6CisgICAgaW1wb3J0IHJlCisgICAgaWYgbm90IGNhdGVnb3J5OgorICAgICAgICByZXR1cm4gV2FybmluZworICAgIGlmIHJlLm1hdGNoKCJeW2EtekEtWjAtOV9dKyQiLCBjYXRlZ29yeSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNhdCA9IGV2YWwoY2F0ZWdvcnkpCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICByYWlzZSBfT3B0aW9uRXJyb3IoInVua25vd24gd2FybmluZyBjYXRlZ29yeTogJXIiICUgKGNhdGVnb3J5LCkpCisgICAgZWxzZToKKyAgICAgICAgaSA9IGNhdGVnb3J5LnJmaW5kKCIuIikKKyAgICAgICAgbW9kdWxlID0gY2F0ZWdvcnlbOmldCisgICAgICAgIGtsYXNzID0gY2F0ZWdvcnlbaSsxOl0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbSA9IF9faW1wb3J0X18obW9kdWxlLCBOb25lLCBOb25lLCBba2xhc3NdKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByYWlzZSBfT3B0aW9uRXJyb3IoImludmFsaWQgbW9kdWxlIG5hbWU6ICVyIiAlIChtb2R1bGUsKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2F0ID0gZ2V0YXR0cihtLCBrbGFzcykKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgX09wdGlvbkVycm9yKCJ1bmtub3duIHdhcm5pbmcgY2F0ZWdvcnk6ICVyIiAlIChjYXRlZ29yeSwpKQorICAgIGlmIG5vdCBpc3N1YmNsYXNzKGNhdCwgV2FybmluZyk6CisgICAgICAgIHJhaXNlIF9PcHRpb25FcnJvcigiaW52YWxpZCB3YXJuaW5nIGNhdGVnb3J5OiAlciIgJSAoY2F0ZWdvcnksKSkKKyAgICByZXR1cm4gY2F0CisKKworIyBDb2RlIHR5cGljYWxseSByZXBsYWNlZCBieSBfd2FybmluZ3MKK2RlZiB3YXJuKG1lc3NhZ2UsIGNhdGVnb3J5PU5vbmUsIHN0YWNrbGV2ZWw9MSk6CisgICAgIiIiSXNzdWUgYSB3YXJuaW5nLCBvciBtYXliZSBpZ25vcmUgaXQgb3IgcmFpc2UgYW4gZXhjZXB0aW9uLiIiIgorICAgICMgQ2hlY2sgaWYgbWVzc2FnZSBpcyBhbHJlYWR5IGEgV2FybmluZyBvYmplY3QKKyAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIFdhcm5pbmcpOgorICAgICAgICBjYXRlZ29yeSA9IG1lc3NhZ2UuX19jbGFzc19fCisgICAgIyBDaGVjayBjYXRlZ29yeSBhcmd1bWVudAorICAgIGlmIGNhdGVnb3J5IGlzIE5vbmU6CisgICAgICAgIGNhdGVnb3J5ID0gVXNlcldhcm5pbmcKKyAgICBhc3NlcnQgaXNzdWJjbGFzcyhjYXRlZ29yeSwgV2FybmluZykKKyAgICAjIEdldCBjb250ZXh0IGluZm9ybWF0aW9uCisgICAgdHJ5OgorICAgICAgICBjYWxsZXIgPSBzeXMuX2dldGZyYW1lKHN0YWNrbGV2ZWwpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIGdsb2JhbHMgPSBzeXMuX19kaWN0X18KKyAgICAgICAgbGluZW5vID0gMQorICAgIGVsc2U6CisgICAgICAgIGdsb2JhbHMgPSBjYWxsZXIuZl9nbG9iYWxzCisgICAgICAgIGxpbmVubyA9IGNhbGxlci5mX2xpbmVubworICAgIGlmICdfX25hbWVfXycgaW4gZ2xvYmFsczoKKyAgICAgICAgbW9kdWxlID0gZ2xvYmFsc1snX19uYW1lX18nXQorICAgIGVsc2U6CisgICAgICAgIG1vZHVsZSA9ICI8c3RyaW5nPiIKKyAgICBmaWxlbmFtZSA9IGdsb2JhbHMuZ2V0KCdfX2ZpbGVfXycpCisgICAgaWYgZmlsZW5hbWU6CisgICAgICAgIGZubCA9IGZpbGVuYW1lLmxvd2VyKCkKKyAgICAgICAgaWYgZm5sLmVuZHN3aXRoKCgiLnB5YyIsICIucHlvIikpOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVs6LTFdCisgICAgZWxzZToKKyAgICAgICAgaWYgbW9kdWxlID09ICJfX21haW5fXyI6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBzeXMuYXJndlswXQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICMgZW1iZWRkZWQgaW50ZXJwcmV0ZXJzIGRvbid0IGhhdmUgc3lzLmFyZ3YsIHNlZSBidWcgIzgzOTE1MQorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gJ19fbWFpbl9fJworICAgICAgICBpZiBub3QgZmlsZW5hbWU6CisgICAgICAgICAgICBmaWxlbmFtZSA9IG1vZHVsZQorICAgIHJlZ2lzdHJ5ID0gZ2xvYmFscy5zZXRkZWZhdWx0KCJfX3dhcm5pbmdyZWdpc3RyeV9fIiwge30pCisgICAgd2Fybl9leHBsaWNpdChtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlLCByZWdpc3RyeSwKKyAgICAgICAgICAgICAgICAgIGdsb2JhbHMpCisKK2RlZiB3YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLAorICAgICAgICAgICAgICAgICAgbW9kdWxlPU5vbmUsIHJlZ2lzdHJ5PU5vbmUsIG1vZHVsZV9nbG9iYWxzPU5vbmUpOgorICAgIGxpbmVubyA9IGludChsaW5lbm8pCisgICAgaWYgbW9kdWxlIGlzIE5vbmU6CisgICAgICAgIG1vZHVsZSA9IGZpbGVuYW1lIG9yICI8dW5rbm93bj4iCisgICAgICAgIGlmIG1vZHVsZVstMzpdLmxvd2VyKCkgPT0gIi5weSI6CisgICAgICAgICAgICBtb2R1bGUgPSBtb2R1bGVbOi0zXSAjIFhYWCBXaGF0IGFib3V0IGxlYWRpbmcgcGF0aG5hbWU/CisgICAgaWYgcmVnaXN0cnkgaXMgTm9uZToKKyAgICAgICAgcmVnaXN0cnkgPSB7fQorICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgV2FybmluZyk6CisgICAgICAgIHRleHQgPSBzdHIobWVzc2FnZSkKKyAgICAgICAgY2F0ZWdvcnkgPSBtZXNzYWdlLl9fY2xhc3NfXworICAgIGVsc2U6CisgICAgICAgIHRleHQgPSBtZXNzYWdlCisgICAgICAgIG1lc3NhZ2UgPSBjYXRlZ29yeShtZXNzYWdlKQorICAgIGtleSA9ICh0ZXh0LCBjYXRlZ29yeSwgbGluZW5vKQorICAgICMgUXVpY2sgdGVzdCBmb3IgY29tbW9uIGNhc2UKKyAgICBpZiByZWdpc3RyeS5nZXQoa2V5KToKKyAgICAgICAgcmV0dXJuCisgICAgIyBTZWFyY2ggdGhlIGZpbHRlcnMKKyAgICBmb3IgaXRlbSBpbiBmaWx0ZXJzOgorICAgICAgICBhY3Rpb24sIG1zZywgY2F0LCBtb2QsIGxuID0gaXRlbQorICAgICAgICBpZiAoKG1zZyBpcyBOb25lIG9yIG1zZy5tYXRjaCh0ZXh0KSkgYW5kCisgICAgICAgICAgICBpc3N1YmNsYXNzKGNhdGVnb3J5LCBjYXQpIGFuZAorICAgICAgICAgICAgKG1vZCBpcyBOb25lIG9yIG1vZC5tYXRjaChtb2R1bGUpKSBhbmQKKyAgICAgICAgICAgIChsbiA9PSAwIG9yIGxpbmVubyA9PSBsbikpOgorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICBhY3Rpb24gPSBkZWZhdWx0YWN0aW9uCisgICAgIyBFYXJseSBleGl0IGFjdGlvbnMKKyAgICBpZiBhY3Rpb24gPT0gImlnbm9yZSI6CisgICAgICAgIHJlZ2lzdHJ5W2tleV0gPSAxCisgICAgICAgIHJldHVybgorCisgICAgIyBQcmltZSB0aGUgbGluZWNhY2hlIGZvciBmb3JtYXR0aW5nLCBpbiBjYXNlIHRoZQorICAgICMgImZpbGUiIGlzIGFjdHVhbGx5IGluIGEgemlwZmlsZSBvciBzb21ldGhpbmcuCisgICAgbGluZWNhY2hlLmdldGxpbmVzKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscykKKworICAgIGlmIGFjdGlvbiA9PSAiZXJyb3IiOgorICAgICAgICByYWlzZSBtZXNzYWdlCisgICAgIyBPdGhlciBhY3Rpb25zCisgICAgaWYgYWN0aW9uID09ICJvbmNlIjoKKyAgICAgICAgcmVnaXN0cnlba2V5XSA9IDEKKyAgICAgICAgb25jZWtleSA9ICh0ZXh0LCBjYXRlZ29yeSkKKyAgICAgICAgaWYgb25jZXJlZ2lzdHJ5LmdldChvbmNla2V5KToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBvbmNlcmVnaXN0cnlbb25jZWtleV0gPSAxCisgICAgZWxpZiBhY3Rpb24gPT0gImFsd2F5cyI6CisgICAgICAgIHBhc3MKKyAgICBlbGlmIGFjdGlvbiA9PSAibW9kdWxlIjoKKyAgICAgICAgcmVnaXN0cnlba2V5XSA9IDEKKyAgICAgICAgYWx0a2V5ID0gKHRleHQsIGNhdGVnb3J5LCAwKQorICAgICAgICBpZiByZWdpc3RyeS5nZXQoYWx0a2V5KToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByZWdpc3RyeVthbHRrZXldID0gMQorICAgIGVsaWYgYWN0aW9uID09ICJkZWZhdWx0IjoKKyAgICAgICAgcmVnaXN0cnlba2V5XSA9IDEKKyAgICBlbHNlOgorICAgICAgICAjIFVucmVjb2duaXplZCBhY3Rpb25zIGFyZSBlcnJvcnMKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICAgICAiVW5yZWNvZ25pemVkIGFjdGlvbiAoJXIpIGluIHdhcm5pbmdzLmZpbHRlcnM6XG4gJXMiICUKKyAgICAgICAgICAgICAgKGFjdGlvbiwgaXRlbSkpCisgICAgIyBQcmludCBtZXNzYWdlIGFuZCBjb250ZXh0CisgICAgc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8pCisKKworY2xhc3MgV2FybmluZ01lc3NhZ2Uob2JqZWN0KToKKworICAgICIiIkhvbGRzIHRoZSByZXN1bHQgb2YgYSBzaW5nbGUgc2hvd3dhcm5pbmcoKSBjYWxsLiIiIgorCisgICAgX1dBUk5JTkdfREVUQUlMUyA9ICgibWVzc2FnZSIsICJjYXRlZ29yeSIsICJmaWxlbmFtZSIsICJsaW5lbm8iLCAiZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAibGluZSIpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIGZpbGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgbGluZT1Ob25lKToKKyAgICAgICAgbG9jYWxfdmFsdWVzID0gbG9jYWxzKCkKKyAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5fV0FSTklOR19ERVRBSUxTOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCBsb2NhbF92YWx1ZXNbYXR0cl0pCisgICAgICAgIHNlbGYuX2NhdGVnb3J5X25hbWUgPSBjYXRlZ29yeS5fX25hbWVfXyBpZiBjYXRlZ29yeSBlbHNlIE5vbmUKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gKCJ7bWVzc2FnZSA6ICVyLCBjYXRlZ29yeSA6ICVyLCBmaWxlbmFtZSA6ICVyLCBsaW5lbm8gOiAlcywgIgorICAgICAgICAgICAgICAgICAgICAibGluZSA6ICVyfSIgJSAoc2VsZi5tZXNzYWdlLCBzZWxmLl9jYXRlZ29yeV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgc2VsZi5saW5lbm8sIHNlbGYubGluZSkpCisKKworY2xhc3MgY2F0Y2hfd2FybmluZ3Mob2JqZWN0KToKKworICAgICIiIkEgY29udGV4dCBtYW5hZ2VyIHRoYXQgY29waWVzIGFuZCByZXN0b3JlcyB0aGUgd2FybmluZ3MgZmlsdGVyIHVwb24KKyAgICBleGl0aW5nIHRoZSBjb250ZXh0LgorCisgICAgVGhlICdyZWNvcmQnIGFyZ3VtZW50IHNwZWNpZmllcyB3aGV0aGVyIHdhcm5pbmdzIHNob3VsZCBiZSBjYXB0dXJlZCBieSBhCisgICAgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIHdhcm5pbmdzLnNob3d3YXJuaW5nKCkgYW5kIGJlIGFwcGVuZGVkIHRvIGEgbGlzdAorICAgIHJldHVybmVkIGJ5IHRoZSBjb250ZXh0IG1hbmFnZXIuIE90aGVyd2lzZSBOb25lIGlzIHJldHVybmVkIGJ5IHRoZSBjb250ZXh0CisgICAgbWFuYWdlci4gVGhlIG9iamVjdHMgYXBwZW5kZWQgdG8gdGhlIGxpc3QgYXJlIGFyZ3VtZW50cyB3aG9zZSBhdHRyaWJ1dGVzCisgICAgbWlycm9yIHRoZSBhcmd1bWVudHMgdG8gc2hvd3dhcm5pbmcoKS4KKworICAgIFRoZSAnbW9kdWxlJyBhcmd1bWVudCBpcyB0byBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlIG1vZHVsZSB0byB0aGUgbW9kdWxlCisgICAgbmFtZWQgJ3dhcm5pbmdzJyBhbmQgaW1wb3J0ZWQgdW5kZXIgdGhhdCBuYW1lLiBUaGlzIGFyZ3VtZW50IGlzIG9ubHkgdXNlZnVsCisgICAgd2hlbiB0ZXN0aW5nIHRoZSB3YXJuaW5ncyBtb2R1bGUgaXRzZWxmLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVjb3JkPUZhbHNlLCBtb2R1bGU9Tm9uZSk6CisgICAgICAgICIiIlNwZWNpZnkgd2hldGhlciB0byByZWNvcmQgd2FybmluZ3MgYW5kIGlmIGFuIGFsdGVybmF0aXZlIG1vZHVsZQorICAgICAgICBzaG91bGQgYmUgdXNlZCBvdGhlciB0aGFuIHN5cy5tb2R1bGVzWyd3YXJuaW5ncyddLgorCisgICAgICAgIEZvciBjb21wYXRpYmlsaXR5IHdpdGggUHl0aG9uIDMuMCwgcGxlYXNlIGNvbnNpZGVyIGFsbCBhcmd1bWVudHMgdG8gYmUKKyAgICAgICAga2V5d29yZC1vbmx5LgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9yZWNvcmQgPSByZWNvcmQKKyAgICAgICAgc2VsZi5fbW9kdWxlID0gc3lzLm1vZHVsZXNbJ3dhcm5pbmdzJ10gaWYgbW9kdWxlIGlzIE5vbmUgZWxzZSBtb2R1bGUKKyAgICAgICAgc2VsZi5fZW50ZXJlZCA9IEZhbHNlCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGFyZ3MgPSBbXQorICAgICAgICBpZiBzZWxmLl9yZWNvcmQ6CisgICAgICAgICAgICBhcmdzLmFwcGVuZCgicmVjb3JkPVRydWUiKQorICAgICAgICBpZiBzZWxmLl9tb2R1bGUgaXMgbm90IHN5cy5tb2R1bGVzWyd3YXJuaW5ncyddOgorICAgICAgICAgICAgYXJncy5hcHBlbmQoIm1vZHVsZT0lciIgJSBzZWxmLl9tb2R1bGUpCisgICAgICAgIG5hbWUgPSB0eXBlKHNlbGYpLl9fbmFtZV9fCisgICAgICAgIHJldHVybiAiJXMoJXMpIiAlIChuYW1lLCAiLCAiLmpvaW4oYXJncykpCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9lbnRlcmVkOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgZW50ZXIgJXIgdHdpY2UiICUgc2VsZikKKyAgICAgICAgc2VsZi5fZW50ZXJlZCA9IFRydWUKKyAgICAgICAgc2VsZi5fZmlsdGVycyA9IHNlbGYuX21vZHVsZS5maWx0ZXJzCisgICAgICAgIHNlbGYuX21vZHVsZS5maWx0ZXJzID0gc2VsZi5fZmlsdGVyc1s6XQorICAgICAgICBzZWxmLl9zaG93d2FybmluZyA9IHNlbGYuX21vZHVsZS5zaG93d2FybmluZworICAgICAgICBpZiBzZWxmLl9yZWNvcmQ6CisgICAgICAgICAgICBsb2cgPSBbXQorICAgICAgICAgICAgZGVmIHNob3d3YXJuaW5nKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgbG9nLmFwcGVuZChXYXJuaW5nTWVzc2FnZSgqYXJncywgKiprd2FyZ3MpKQorICAgICAgICAgICAgc2VsZi5fbW9kdWxlLnNob3d3YXJuaW5nID0gc2hvd3dhcm5pbmcKKyAgICAgICAgICAgIHJldHVybiBsb2cKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2VudGVyZWQ6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNhbm5vdCBleGl0ICVyIHdpdGhvdXQgZW50ZXJpbmcgZmlyc3QiICUgc2VsZikKKyAgICAgICAgc2VsZi5fbW9kdWxlLmZpbHRlcnMgPSBzZWxmLl9maWx0ZXJzCisgICAgICAgIHNlbGYuX21vZHVsZS5zaG93d2FybmluZyA9IHNlbGYuX3Nob3d3YXJuaW5nCisKKworIyBmaWx0ZXJzIGNvbnRhaW5zIGEgc2VxdWVuY2Ugb2YgZmlsdGVyIDUtdHVwbGVzCisjIFRoZSBjb21wb25lbnRzIG9mIHRoZSA1LXR1cGxlIGFyZToKKyMgLSBhbiBhY3Rpb246IGVycm9yLCBpZ25vcmUsIGFsd2F5cywgZGVmYXVsdCwgbW9kdWxlLCBvciBvbmNlCisjIC0gYSBjb21waWxlZCByZWdleCB0aGF0IG11c3QgbWF0Y2ggdGhlIHdhcm5pbmcgbWVzc2FnZQorIyAtIGEgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSB3YXJuaW5nIGNhdGVnb3J5CisjIC0gYSBjb21waWxlZCByZWdleCB0aGF0IG11c3QgbWF0Y2ggdGhlIG1vZHVsZSB0aGF0IGlzIGJlaW5nIHdhcm5lZAorIyAtIGEgbGluZSBudW1iZXIgZm9yIHRoZSBsaW5lIGJlaW5nIHdhcm5pbmcsIG9yIDAgdG8gbWVhbiBhbnkgbGluZQorIyBJZiBlaXRoZXIgaWYgdGhlIGNvbXBpbGVkIHJlZ2V4cyBhcmUgTm9uZSwgbWF0Y2ggYW55dGhpbmcuCitfd2FybmluZ3NfZGVmYXVsdHMgPSBGYWxzZQordHJ5OgorICAgIGZyb20gX3dhcm5pbmdzIGltcG9ydCAoZmlsdGVycywgZGVmYXVsdF9hY3Rpb24sIG9uY2VfcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fybiwgd2Fybl9leHBsaWNpdCkKKyAgICBkZWZhdWx0YWN0aW9uID0gZGVmYXVsdF9hY3Rpb24KKyAgICBvbmNlcmVnaXN0cnkgPSBvbmNlX3JlZ2lzdHJ5CisgICAgX3dhcm5pbmdzX2RlZmF1bHRzID0gVHJ1ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZpbHRlcnMgPSBbXQorICAgIGRlZmF1bHRhY3Rpb24gPSAiZGVmYXVsdCIKKyAgICBvbmNlcmVnaXN0cnkgPSB7fQorCisKKyMgTW9kdWxlIGluaXRpYWxpemF0aW9uCitfcHJvY2Vzc29wdGlvbnMoc3lzLndhcm5vcHRpb25zKQoraWYgbm90IF93YXJuaW5nc19kZWZhdWx0czoKKyAgICBzaWxlbmNlID0gW0ltcG9ydFdhcm5pbmcsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmddCisgICAgIyBEb24ndCBzaWxlbmNlIERlcHJlY2F0aW9uV2FybmluZyBpZiAtMyBvciAtUSB3YXMgdXNlZC4KKyAgICBpZiBub3Qgc3lzLnB5M2t3YXJuaW5nIGFuZCBub3Qgc3lzLmZsYWdzLmRpdmlzaW9uX3dhcm5pbmc6CisgICAgICAgIHNpbGVuY2UuYXBwZW5kKERlcHJlY2F0aW9uV2FybmluZykKKyAgICBmb3IgY2xzIGluIHNpbGVuY2U6CisgICAgICAgIHNpbXBsZWZpbHRlcigiaWdub3JlIiwgY2F0ZWdvcnk9Y2xzKQorICAgIGJ5dGVzX3dhcm5pbmcgPSBzeXMuZmxhZ3MuYnl0ZXNfd2FybmluZworICAgIGlmIGJ5dGVzX3dhcm5pbmcgPiAxOgorICAgICAgICBieXRlc19hY3Rpb24gPSAiZXJyb3IiCisgICAgZWxpZiBieXRlc193YXJuaW5nOgorICAgICAgICBieXRlc19hY3Rpb24gPSAiZGVmYXVsdCIKKyAgICBlbHNlOgorICAgICAgICBieXRlc19hY3Rpb24gPSAiaWdub3JlIgorICAgIHNpbXBsZWZpbHRlcihieXRlc19hY3Rpb24sIGNhdGVnb3J5PUJ5dGVzV2FybmluZywgYXBwZW5kPTEpCitkZWwgX3dhcm5pbmdzX2RlZmF1bHRzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3dhcm5pbmdzLnB5YyBiL2xpYi9weXRob24yLjcvd2FybmluZ3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiOGY2OTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dhcm5pbmdzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3dhcm5pbmdzLnB5byBiL2xpYi9weXRob24yLjcvd2FybmluZ3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZjNiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dhcm5pbmdzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3dhdmUucHkgYi9saWIvcHl0aG9uMi43L3dhdmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiMTFkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd2F2ZS5weQpAQCAtMCwwICsxLDUwNCBAQAorIiIiU3R1ZmYgdG8gcGFyc2UgV0FWRSBmaWxlcy4KKworVXNhZ2UuCisKK1JlYWRpbmcgV0FWRSBmaWxlczoKKyAgICAgIGYgPSB3YXZlLm9wZW4oZmlsZSwgJ3InKQord2hlcmUgZmlsZSBpcyBlaXRoZXIgdGhlIG5hbWUgb2YgYSBmaWxlIG9yIGFuIG9wZW4gZmlsZSBwb2ludGVyLgorVGhlIG9wZW4gZmlsZSBwb2ludGVyIG11c3QgaGF2ZSBtZXRob2RzIHJlYWQoKSwgc2VlaygpLCBhbmQgY2xvc2UoKS4KK1doZW4gdGhlIHNldHBvcygpIGFuZCByZXdpbmQoKSBtZXRob2RzIGFyZSBub3QgdXNlZCwgdGhlIHNlZWsoKQorbWV0aG9kIGlzIG5vdCAgbmVjZXNzYXJ5LgorCitUaGlzIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB3aXRoIHRoZSBmb2xsb3dpbmcgcHVibGljIG1ldGhvZHM6CisgICAgICBnZXRuY2hhbm5lbHMoKSAgLS0gcmV0dXJucyBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgKDEgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgbW9ubywgMiBmb3Igc3RlcmVvKQorICAgICAgZ2V0c2FtcHdpZHRoKCkgIC0tIHJldHVybnMgc2FtcGxlIHdpZHRoIGluIGJ5dGVzCisgICAgICBnZXRmcmFtZXJhdGUoKSAgLS0gcmV0dXJucyBzYW1wbGluZyBmcmVxdWVuY3kKKyAgICAgIGdldG5mcmFtZXMoKSAgICAtLSByZXR1cm5zIG51bWJlciBvZiBhdWRpbyBmcmFtZXMKKyAgICAgIGdldGNvbXB0eXBlKCkgICAtLSByZXR1cm5zIGNvbXByZXNzaW9uIHR5cGUgKCdOT05FJyBmb3IgbGluZWFyIHNhbXBsZXMpCisgICAgICBnZXRjb21wbmFtZSgpICAgLS0gcmV0dXJucyBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb24gdHlwZSAoJ25vdCBjb21wcmVzc2VkJyBsaW5lYXIgc2FtcGxlcykKKyAgICAgIGdldHBhcmFtcygpICAgICAtLSByZXR1cm5zIGEgdHVwbGUgY29uc2lzdGluZyBvZiBhbGwgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUgaW4gdGhlIGFib3ZlIG9yZGVyCisgICAgICBnZXRtYXJrZXJzKCkgICAgLS0gcmV0dXJucyBOb25lIChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIGFpZmMgbW9kdWxlKQorICAgICAgZ2V0bWFyayhpZCkgICAgIC0tIHJhaXNlcyBhbiBlcnJvciBzaW5jZSB0aGUgbWFyayBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBhaWZjIG1vZHVsZSkKKyAgICAgIHJlYWRmcmFtZXMobikgICAtLSByZXR1cm5zIGF0IG1vc3QgbiBmcmFtZXMgb2YgYXVkaW8KKyAgICAgIHJld2luZCgpICAgICAgICAtLSByZXdpbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXVkaW8gc3RyZWFtCisgICAgICBzZXRwb3MocG9zKSAgICAgLS0gc2VlayB0byB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uCisgICAgICB0ZWxsKCkgICAgICAgICAgLS0gcmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uCisgICAgICBjbG9zZSgpICAgICAgICAgLS0gY2xvc2UgdGhlIGluc3RhbmNlIChtYWtlIGl0IHVudXNhYmxlKQorVGhlIHBvc2l0aW9uIHJldHVybmVkIGJ5IHRlbGwoKSBhbmQgdGhlIHBvc2l0aW9uIGdpdmVuIHRvIHNldHBvcygpCithcmUgY29tcGF0aWJsZSBhbmQgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGggdGhlIGFjdHVhbCBwb3NpdGlvbiBpbiB0aGUKK2ZpbGUuCitUaGUgY2xvc2UoKSBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgY2xhc3MgaW5zdGFuY2UKK2lzIGRlc3Ryb3llZC4KKworV3JpdGluZyBXQVZFIGZpbGVzOgorICAgICAgZiA9IHdhdmUub3BlbihmaWxlLCAndycpCit3aGVyZSBmaWxlIGlzIGVpdGhlciB0aGUgbmFtZSBvZiBhIGZpbGUgb3IgYW4gb3BlbiBmaWxlIHBvaW50ZXIuCitUaGUgb3BlbiBmaWxlIHBvaW50ZXIgbXVzdCBoYXZlIG1ldGhvZHMgd3JpdGUoKSwgdGVsbCgpLCBzZWVrKCksIGFuZAorY2xvc2UoKS4KKworVGhpcyByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEgY2xhc3Mgd2l0aCB0aGUgZm9sbG93aW5nIHB1YmxpYyBtZXRob2RzOgorICAgICAgc2V0bmNoYW5uZWxzKG4pIC0tIHNldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICBzZXRzYW1wd2lkdGgobikgLS0gc2V0IHRoZSBzYW1wbGUgd2lkdGgKKyAgICAgIHNldGZyYW1lcmF0ZShuKSAtLSBzZXQgdGhlIGZyYW1lIHJhdGUKKyAgICAgIHNldG5mcmFtZXMobikgICAtLSBzZXQgdGhlIG51bWJlciBvZiBmcmFtZXMKKyAgICAgIHNldGNvbXB0eXBlKHR5cGUsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgLS0gc2V0IHRoZSBjb21wcmVzc2lvbiB0eXBlIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICBodW1hbi1yZWFkYWJsZSBjb21wcmVzc2lvbiB0eXBlCisgICAgICBzZXRwYXJhbXModHVwbGUpCisgICAgICAgICAgICAgICAgICAgICAgLS0gc2V0IGFsbCBwYXJhbWV0ZXJzIGF0IG9uY2UKKyAgICAgIHRlbGwoKSAgICAgICAgICAtLSByZXR1cm4gY3VycmVudCBwb3NpdGlvbiBpbiBvdXRwdXQgZmlsZQorICAgICAgd3JpdGVmcmFtZXNyYXcoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAtLSB3cml0ZSBhdWRpbyBmcmFtZXMgd2l0aG91dCBwYXRoaW5nIHVwIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgaGVhZGVyCisgICAgICB3cml0ZWZyYW1lcyhkYXRhKQorICAgICAgICAgICAgICAgICAgICAgIC0tIHdyaXRlIGF1ZGlvIGZyYW1lcyBhbmQgcGF0Y2ggdXAgdGhlIGZpbGUgaGVhZGVyCisgICAgICBjbG9zZSgpICAgICAgICAgLS0gcGF0Y2ggdXAgdGhlIGZpbGUgaGVhZGVyIGFuZCBjbG9zZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgZmlsZQorWW91IHNob3VsZCBzZXQgdGhlIHBhcmFtZXRlcnMgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZWZyYW1lc3JhdyBvcgord3JpdGVmcmFtZXMuICBUaGUgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldCwKK2J1dCB3aGVuIGl0IGlzIHNldCB0byB0aGUgY29ycmVjdCB2YWx1ZSwgdGhlIGhlYWRlciBkb2VzIG5vdCBoYXZlIHRvCitiZSBwYXRjaGVkIHVwLgorSXQgaXMgYmVzdCB0byBmaXJzdCBzZXQgYWxsIHBhcmFtZXRlcnMsIHBlcmhhcHMgcG9zc2libHkgdGhlCitjb21wcmVzc2lvbiB0eXBlLCBhbmQgdGhlbiB3cml0ZSBhdWRpbyBmcmFtZXMgdXNpbmcgd3JpdGVmcmFtZXNyYXcuCitXaGVuIGFsbCBmcmFtZXMgaGF2ZSBiZWVuIHdyaXR0ZW4sIGVpdGhlciBjYWxsIHdyaXRlZnJhbWVzKCcnKSBvcgorY2xvc2UoKSB0byBwYXRjaCB1cCB0aGUgc2l6ZXMgaW4gdGhlIGhlYWRlci4KK1RoZSBjbG9zZSgpIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBjbGFzcyBpbnN0YW5jZQoraXMgZGVzdHJveWVkLgorIiIiCisKK2ltcG9ydCBfX2J1aWx0aW5fXworCitfX2FsbF9fID0gWyJvcGVuIiwgIm9wZW5mcCIsICJFcnJvciJdCisKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitXQVZFX0ZPUk1BVF9QQ00gPSAweDAwMDEKKworX2FycmF5X2ZtdHMgPSBOb25lLCAnYicsICdoJywgTm9uZSwgJ2wnCisKKyMgRGV0ZXJtaW5lIGVuZGlhbi1uZXNzCitpbXBvcnQgc3RydWN0CitpZiBzdHJ1Y3QucGFjaygiaCIsIDEpID09ICJcMDAwXDAwMSI6CisgICAgYmlnX2VuZGlhbiA9IDEKK2Vsc2U6CisgICAgYmlnX2VuZGlhbiA9IDAKKworZnJvbSBjaHVuayBpbXBvcnQgQ2h1bmsKKworY2xhc3MgV2F2ZV9yZWFkOgorICAgICIiIlZhcmlhYmxlcyB1c2VkIGluIHRoaXMgY2xhc3M6CisKKyAgICBUaGVzZSB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSB0byB0aGUgdXNlciB0aG91Z2ggYXBwcm9wcmlhdGUKKyAgICBtZXRob2RzIG9mIHRoaXMgY2xhc3M6CisgICAgX2ZpbGUgLS0gdGhlIG9wZW4gZmlsZSB3aXRoIG1ldGhvZHMgcmVhZCgpLCBjbG9zZSgpLCBhbmQgc2VlaygpCisgICAgICAgICAgICAgIHNldCB0aHJvdWdoIHRoZSBfX2luaXRfXygpIG1ldGhvZAorICAgIF9uY2hhbm5lbHMgLS0gdGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscworICAgICAgICAgICAgICBhdmFpbGFibGUgdGhyb3VnaCB0aGUgZ2V0bmNoYW5uZWxzKCkgbWV0aG9kCisgICAgX25mcmFtZXMgLS0gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMKKyAgICAgICAgICAgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGdldG5mcmFtZXMoKSBtZXRob2QKKyAgICBfc2FtcHdpZHRoIC0tIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGF1ZGlvIHNhbXBsZQorICAgICAgICAgICAgICBhdmFpbGFibGUgdGhyb3VnaCB0aGUgZ2V0c2FtcHdpZHRoKCkgbWV0aG9kCisgICAgX2ZyYW1lcmF0ZSAtLSB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5CisgICAgICAgICAgICAgIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBnZXRmcmFtZXJhdGUoKSBtZXRob2QKKyAgICBfY29tcHR5cGUgLS0gdGhlIEFJRkYtQyBjb21wcmVzc2lvbiB0eXBlICgnTk9ORScgaWYgQUlGRikKKyAgICAgICAgICAgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGdldGNvbXB0eXBlKCkgbWV0aG9kCisgICAgX2NvbXBuYW1lIC0tIHRoZSBodW1hbi1yZWFkYWJsZSBBSUZGLUMgY29tcHJlc3Npb24gdHlwZQorICAgICAgICAgICAgICBhdmFpbGFibGUgdGhyb3VnaCB0aGUgZ2V0Y29tcHR5cGUoKSBtZXRob2QKKyAgICBfc291bmRwb3MgLS0gdGhlIHBvc2l0aW9uIGluIHRoZSBhdWRpbyBzdHJlYW0KKyAgICAgICAgICAgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHRlbGwoKSBtZXRob2QsIHNldCB0aHJvdWdoIHRoZQorICAgICAgICAgICAgICBzZXRwb3MoKSBtZXRob2QKKworICAgIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCBpbnRlcm5hbGx5IG9ubHk6CisgICAgX2ZtdF9jaHVua19yZWFkIC0tIDEgaWZmIHRoZSBGTVQgY2h1bmsgaGFzIGJlZW4gcmVhZAorICAgIF9kYXRhX3NlZWtfbmVlZGVkIC0tIDEgaWZmIHBvc2l0aW9uZWQgY29ycmVjdGx5IGluIGF1ZGlvCisgICAgICAgICAgICAgIGZpbGUgZm9yIHJlYWRmcmFtZXMoKQorICAgIF9kYXRhX2NodW5rIC0tIGluc3RhbnRpYXRpb24gb2YgYSBjaHVuayBjbGFzcyBmb3IgdGhlIERBVEEgY2h1bmsKKyAgICBfZnJhbWVzaXplIC0tIHNpemUgb2Ygb25lIGZyYW1lIGluIHRoZSBmaWxlCisgICAgIiIiCisKKyAgICBkZWYgaW5pdGZwKHNlbGYsIGZpbGUpOgorICAgICAgICBzZWxmLl9jb252ZXJ0ID0gTm9uZQorICAgICAgICBzZWxmLl9zb3VuZHBvcyA9IDAKKyAgICAgICAgc2VsZi5fZmlsZSA9IENodW5rKGZpbGUsIGJpZ2VuZGlhbiA9IDApCisgICAgICAgIGlmIHNlbGYuX2ZpbGUuZ2V0bmFtZSgpICE9ICdSSUZGJzoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnZmlsZSBkb2VzIG5vdCBzdGFydCB3aXRoIFJJRkYgaWQnCisgICAgICAgIGlmIHNlbGYuX2ZpbGUucmVhZCg0KSAhPSAnV0FWRSc6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ25vdCBhIFdBVkUgZmlsZScKKyAgICAgICAgc2VsZi5fZm10X2NodW5rX3JlYWQgPSAwCisgICAgICAgIHNlbGYuX2RhdGFfY2h1bmsgPSBOb25lCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBzZWxmLl9kYXRhX3NlZWtfbmVlZGVkID0gMQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNodW5rID0gQ2h1bmsoc2VsZi5fZmlsZSwgYmlnZW5kaWFuID0gMCkKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY2h1bmtuYW1lID0gY2h1bmsuZ2V0bmFtZSgpCisgICAgICAgICAgICBpZiBjaHVua25hbWUgPT0gJ2ZtdCAnOgorICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRfZm10X2NodW5rKGNodW5rKQorICAgICAgICAgICAgICAgIHNlbGYuX2ZtdF9jaHVua19yZWFkID0gMQorICAgICAgICAgICAgZWxpZiBjaHVua25hbWUgPT0gJ2RhdGEnOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9mbXRfY2h1bmtfcmVhZDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdkYXRhIGNodW5rIGJlZm9yZSBmbXQgY2h1bmsnCisgICAgICAgICAgICAgICAgc2VsZi5fZGF0YV9jaHVuayA9IGNodW5rCisgICAgICAgICAgICAgICAgc2VsZi5fbmZyYW1lcyA9IGNodW5rLmNodW5rc2l6ZSAvLyBzZWxmLl9mcmFtZXNpemUKKyAgICAgICAgICAgICAgICBzZWxmLl9kYXRhX3NlZWtfbmVlZGVkID0gMAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBjaHVuay5za2lwKCkKKyAgICAgICAgaWYgbm90IHNlbGYuX2ZtdF9jaHVua19yZWFkIG9yIG5vdCBzZWxmLl9kYXRhX2NodW5rOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdmbXQgY2h1bmsgYW5kL29yIGRhdGEgY2h1bmsgbWlzc2luZycKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmKToKKyAgICAgICAgc2VsZi5faV9vcGVuZWRfdGhlX2ZpbGUgPSBOb25lCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZiwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBmID0gX19idWlsdGluX18ub3BlbihmLCAncmInKQorICAgICAgICAgICAgc2VsZi5faV9vcGVuZWRfdGhlX2ZpbGUgPSBmCisgICAgICAgICMgZWxzZSwgYXNzdW1lIGl0IGlzIGFuIG9wZW4gZmlsZSBvYmplY3QgYWxyZWFkeQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmluaXRmcChmKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpZiBzZWxmLl9pX29wZW5lZF90aGVfZmlsZToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgIworICAgICMgVXNlciB2aXNpYmxlIG1ldGhvZHMuCisgICAgIworICAgIGRlZiBnZXRmcChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUKKworICAgIGRlZiByZXdpbmQoc2VsZik6CisgICAgICAgIHNlbGYuX2RhdGFfc2Vla19uZWVkZWQgPSAxCisgICAgICAgIHNlbGYuX3NvdW5kcG9zID0gMAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9pX29wZW5lZF90aGVfZmlsZToKKyAgICAgICAgICAgIHNlbGYuX2lfb3BlbmVkX3RoZV9maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuX2lfb3BlbmVkX3RoZV9maWxlID0gTm9uZQorICAgICAgICBzZWxmLl9maWxlID0gTm9uZQorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zb3VuZHBvcworCisgICAgZGVmIGdldG5jaGFubmVscyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25jaGFubmVscworCisgICAgZGVmIGdldG5mcmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uZnJhbWVzCisKKyAgICBkZWYgZ2V0c2FtcHdpZHRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc2FtcHdpZHRoCisKKyAgICBkZWYgZ2V0ZnJhbWVyYXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZnJhbWVyYXRlCisKKyAgICBkZWYgZ2V0Y29tcHR5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb21wdHlwZQorCisgICAgZGVmIGdldGNvbXBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29tcG5hbWUKKworICAgIGRlZiBnZXRwYXJhbXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmdldG5jaGFubmVscygpLCBzZWxmLmdldHNhbXB3aWR0aCgpLCBcCisgICAgICAgICAgICAgICBzZWxmLmdldGZyYW1lcmF0ZSgpLCBzZWxmLmdldG5mcmFtZXMoKSwgXAorICAgICAgICAgICAgICAgc2VsZi5nZXRjb21wdHlwZSgpLCBzZWxmLmdldGNvbXBuYW1lKCkKKworICAgIGRlZiBnZXRtYXJrZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGdldG1hcmsoc2VsZiwgaWQpOgorICAgICAgICByYWlzZSBFcnJvciwgJ25vIG1hcmtzJworCisgICAgZGVmIHNldHBvcyhzZWxmLCBwb3MpOgorICAgICAgICBpZiBwb3MgPCAwIG9yIHBvcyA+IHNlbGYuX25mcmFtZXM6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3Bvc2l0aW9uIG5vdCBpbiByYW5nZScKKyAgICAgICAgc2VsZi5fc291bmRwb3MgPSBwb3MKKyAgICAgICAgc2VsZi5fZGF0YV9zZWVrX25lZWRlZCA9IDEKKworICAgIGRlZiByZWFkZnJhbWVzKHNlbGYsIG5mcmFtZXMpOgorICAgICAgICBpZiBzZWxmLl9kYXRhX3NlZWtfbmVlZGVkOgorICAgICAgICAgICAgc2VsZi5fZGF0YV9jaHVuay5zZWVrKDAsIDApCisgICAgICAgICAgICBwb3MgPSBzZWxmLl9zb3VuZHBvcyAqIHNlbGYuX2ZyYW1lc2l6ZQorICAgICAgICAgICAgaWYgcG9zOgorICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFfY2h1bmsuc2Vlayhwb3MsIDApCisgICAgICAgICAgICBzZWxmLl9kYXRhX3NlZWtfbmVlZGVkID0gMAorICAgICAgICBpZiBuZnJhbWVzID09IDA6CisgICAgICAgICAgICByZXR1cm4gJycKKyAgICAgICAgaWYgc2VsZi5fc2FtcHdpZHRoID4gMSBhbmQgYmlnX2VuZGlhbjoKKyAgICAgICAgICAgICMgdW5mb3J0dW5hdGVseSB0aGUgZnJvbWZpbGUoKSBtZXRob2QgZG9lcyBub3QgdGFrZQorICAgICAgICAgICAgIyBzb21ldGhpbmcgdGhhdCBvbmx5IGxvb2tzIGxpa2UgYSBmaWxlIG9iamVjdCwgc28KKyAgICAgICAgICAgICMgd2UgaGF2ZSB0byByZWFjaCBpbnRvIHRoZSBpbm5hcmRzIG9mIHRoZSBjaHVuayBvYmplY3QKKyAgICAgICAgICAgIGltcG9ydCBhcnJheQorICAgICAgICAgICAgY2h1bmsgPSBzZWxmLl9kYXRhX2NodW5rCisgICAgICAgICAgICBkYXRhID0gYXJyYXkuYXJyYXkoX2FycmF5X2ZtdHNbc2VsZi5fc2FtcHdpZHRoXSkKKyAgICAgICAgICAgIG5pdGVtcyA9IG5mcmFtZXMgKiBzZWxmLl9uY2hhbm5lbHMKKyAgICAgICAgICAgIGlmIG5pdGVtcyAqIHNlbGYuX3NhbXB3aWR0aCA+IGNodW5rLmNodW5rc2l6ZSAtIGNodW5rLnNpemVfcmVhZDoKKyAgICAgICAgICAgICAgICBuaXRlbXMgPSAoY2h1bmsuY2h1bmtzaXplIC0gY2h1bmsuc2l6ZV9yZWFkKSAvIHNlbGYuX3NhbXB3aWR0aAorICAgICAgICAgICAgZGF0YS5mcm9tZmlsZShjaHVuay5maWxlLmZpbGUsIG5pdGVtcykKKyAgICAgICAgICAgICMgInRlbGwiIGRhdGEgY2h1bmsgaG93IG11Y2ggd2FzIHJlYWQKKyAgICAgICAgICAgIGNodW5rLnNpemVfcmVhZCA9IGNodW5rLnNpemVfcmVhZCArIG5pdGVtcyAqIHNlbGYuX3NhbXB3aWR0aAorICAgICAgICAgICAgIyBkbyB0aGUgc2FtZSBmb3IgdGhlIG91dGVybW9zdCBjaHVuaworICAgICAgICAgICAgY2h1bmsgPSBjaHVuay5maWxlCisgICAgICAgICAgICBjaHVuay5zaXplX3JlYWQgPSBjaHVuay5zaXplX3JlYWQgKyBuaXRlbXMgKiBzZWxmLl9zYW1wd2lkdGgKKyAgICAgICAgICAgIGRhdGEuYnl0ZXN3YXAoKQorICAgICAgICAgICAgZGF0YSA9IGRhdGEudG9zdHJpbmcoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2RhdGFfY2h1bmsucmVhZChuZnJhbWVzICogc2VsZi5fZnJhbWVzaXplKQorICAgICAgICBpZiBzZWxmLl9jb252ZXJ0IGFuZCBkYXRhOgorICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2NvbnZlcnQoZGF0YSkKKyAgICAgICAgc2VsZi5fc291bmRwb3MgPSBzZWxmLl9zb3VuZHBvcyArIGxlbihkYXRhKSAvLyAoc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fc2FtcHdpZHRoKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgIworICAgICMgSW50ZXJuYWwgbWV0aG9kcy4KKyAgICAjCisKKyAgICBkZWYgX3JlYWRfZm10X2NodW5rKHNlbGYsIGNodW5rKToKKyAgICAgICAgd0Zvcm1hdFRhZywgc2VsZi5fbmNoYW5uZWxzLCBzZWxmLl9mcmFtZXJhdGUsIGR3QXZnQnl0ZXNQZXJTZWMsIHdCbG9ja0FsaWduID0gc3RydWN0LnVucGFjaygnPEhITExIJywgY2h1bmsucmVhZCgxNCkpCisgICAgICAgIGlmIHdGb3JtYXRUYWcgPT0gV0FWRV9GT1JNQVRfUENNOgorICAgICAgICAgICAgc2FtcHdpZHRoID0gc3RydWN0LnVucGFjaygnPEgnLCBjaHVuay5yZWFkKDIpKVswXQorICAgICAgICAgICAgc2VsZi5fc2FtcHdpZHRoID0gKHNhbXB3aWR0aCArIDcpIC8vIDgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAndW5rbm93biBmb3JtYXQ6ICVyJyAlICh3Rm9ybWF0VGFnLCkKKyAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fc2FtcHdpZHRoCisgICAgICAgIHNlbGYuX2NvbXB0eXBlID0gJ05PTkUnCisgICAgICAgIHNlbGYuX2NvbXBuYW1lID0gJ25vdCBjb21wcmVzc2VkJworCitjbGFzcyBXYXZlX3dyaXRlOgorICAgICIiIlZhcmlhYmxlcyB1c2VkIGluIHRoaXMgY2xhc3M6CisKKyAgICBUaGVzZSB2YXJpYWJsZXMgYXJlIHVzZXIgc2V0dGFibGUgdGhyb3VnaCBhcHByb3ByaWF0ZSBtZXRob2RzCisgICAgb2YgdGhpcyBjbGFzczoKKyAgICBfZmlsZSAtLSB0aGUgb3BlbiBmaWxlIHdpdGggbWV0aG9kcyB3cml0ZSgpLCBjbG9zZSgpLCB0ZWxsKCksIHNlZWsoKQorICAgICAgICAgICAgICBzZXQgdGhyb3VnaCB0aGUgX19pbml0X18oKSBtZXRob2QKKyAgICBfY29tcHR5cGUgLS0gdGhlIEFJRkYtQyBjb21wcmVzc2lvbiB0eXBlICgnTk9ORScgaW4gQUlGRikKKyAgICAgICAgICAgICAgc2V0IHRocm91Z2ggdGhlIHNldGNvbXB0eXBlKCkgb3Igc2V0cGFyYW1zKCkgbWV0aG9kCisgICAgX2NvbXBuYW1lIC0tIHRoZSBodW1hbi1yZWFkYWJsZSBBSUZGLUMgY29tcHJlc3Npb24gdHlwZQorICAgICAgICAgICAgICBzZXQgdGhyb3VnaCB0aGUgc2V0Y29tcHR5cGUoKSBvciBzZXRwYXJhbXMoKSBtZXRob2QKKyAgICBfbmNoYW5uZWxzIC0tIHRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMKKyAgICAgICAgICAgICAgc2V0IHRocm91Z2ggdGhlIHNldG5jaGFubmVscygpIG9yIHNldHBhcmFtcygpIG1ldGhvZAorICAgIF9zYW1wd2lkdGggLS0gdGhlIG51bWJlciBvZiBieXRlcyBwZXIgYXVkaW8gc2FtcGxlCisgICAgICAgICAgICAgIHNldCB0aHJvdWdoIHRoZSBzZXRzYW1wd2lkdGgoKSBvciBzZXRwYXJhbXMoKSBtZXRob2QKKyAgICBfZnJhbWVyYXRlIC0tIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kKKyAgICAgICAgICAgICAgc2V0IHRocm91Z2ggdGhlIHNldGZyYW1lcmF0ZSgpIG9yIHNldHBhcmFtcygpIG1ldGhvZAorICAgIF9uZnJhbWVzIC0tIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gdG8gdGhlIGhlYWRlcgorICAgICAgICAgICAgICBzZXQgdGhyb3VnaCB0aGUgc2V0bmZyYW1lcygpIG9yIHNldHBhcmFtcygpIG1ldGhvZAorCisgICAgVGhlc2UgdmFyaWFibGVzIGFyZSB1c2VkIGludGVybmFsbHkgb25seToKKyAgICBfZGF0YWxlbmd0aCAtLSB0aGUgc2l6ZSBvZiB0aGUgYXVkaW8gc2FtcGxlcyB3cml0dGVuIHRvIHRoZSBoZWFkZXIKKyAgICBfbmZyYW1lc3dyaXR0ZW4gLS0gdGhlIG51bWJlciBvZiBmcmFtZXMgYWN0dWFsbHkgd3JpdHRlbgorICAgIF9kYXRhd3JpdHRlbiAtLSB0aGUgc2l6ZSBvZiB0aGUgYXVkaW8gc2FtcGxlcyBhY3R1YWxseSB3cml0dGVuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZik6CisgICAgICAgIHNlbGYuX2lfb3BlbmVkX3RoZV9maWxlID0gTm9uZQorICAgICAgICBpZiBpc2luc3RhbmNlKGYsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgZiA9IF9fYnVpbHRpbl9fLm9wZW4oZiwgJ3diJykKKyAgICAgICAgICAgIHNlbGYuX2lfb3BlbmVkX3RoZV9maWxlID0gZgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmluaXRmcChmKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpZiBzZWxmLl9pX29wZW5lZF90aGVfZmlsZToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgaW5pdGZwKHNlbGYsIGZpbGUpOgorICAgICAgICBzZWxmLl9maWxlID0gZmlsZQorICAgICAgICBzZWxmLl9jb252ZXJ0ID0gTm9uZQorICAgICAgICBzZWxmLl9uY2hhbm5lbHMgPSAwCisgICAgICAgIHNlbGYuX3NhbXB3aWR0aCA9IDAKKyAgICAgICAgc2VsZi5fZnJhbWVyYXRlID0gMAorICAgICAgICBzZWxmLl9uZnJhbWVzID0gMAorICAgICAgICBzZWxmLl9uZnJhbWVzd3JpdHRlbiA9IDAKKyAgICAgICAgc2VsZi5fZGF0YXdyaXR0ZW4gPSAwCisgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSAwCisgICAgICAgIHNlbGYuX2hlYWRlcndyaXR0ZW4gPSBGYWxzZQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgIworICAgICMgVXNlciB2aXNpYmxlIG1ldGhvZHMuCisgICAgIworICAgIGRlZiBzZXRuY2hhbm5lbHMoc2VsZiwgbmNoYW5uZWxzKToKKyAgICAgICAgaWYgc2VsZi5fZGF0YXdyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgaWYgbmNoYW5uZWxzIDwgMToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnYmFkICMgb2YgY2hhbm5lbHMnCisgICAgICAgIHNlbGYuX25jaGFubmVscyA9IG5jaGFubmVscworCisgICAgZGVmIGdldG5jaGFubmVscyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX25jaGFubmVsczoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnbnVtYmVyIG9mIGNoYW5uZWxzIG5vdCBzZXQnCisgICAgICAgIHJldHVybiBzZWxmLl9uY2hhbm5lbHMKKworICAgIGRlZiBzZXRzYW1wd2lkdGgoc2VsZiwgc2FtcHdpZHRoKToKKyAgICAgICAgaWYgc2VsZi5fZGF0YXdyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgaWYgc2FtcHdpZHRoIDwgMSBvciBzYW1wd2lkdGggPiA0OgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdiYWQgc2FtcGxlIHdpZHRoJworICAgICAgICBzZWxmLl9zYW1wd2lkdGggPSBzYW1wd2lkdGgKKworICAgIGRlZiBnZXRzYW1wd2lkdGgoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9zYW1wd2lkdGg6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3NhbXBsZSB3aWR0aCBub3Qgc2V0JworICAgICAgICByZXR1cm4gc2VsZi5fc2FtcHdpZHRoCisKKyAgICBkZWYgc2V0ZnJhbWVyYXRlKHNlbGYsIGZyYW1lcmF0ZSk6CisgICAgICAgIGlmIHNlbGYuX2RhdGF3cml0dGVuOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY2hhbmdlIHBhcmFtZXRlcnMgYWZ0ZXIgc3RhcnRpbmcgdG8gd3JpdGUnCisgICAgICAgIGlmIGZyYW1lcmF0ZSA8PSAwOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdiYWQgZnJhbWUgcmF0ZScKKyAgICAgICAgc2VsZi5fZnJhbWVyYXRlID0gZnJhbWVyYXRlCisKKyAgICBkZWYgZ2V0ZnJhbWVyYXRlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZnJhbWVyYXRlOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdmcmFtZSByYXRlIG5vdCBzZXQnCisgICAgICAgIHJldHVybiBzZWxmLl9mcmFtZXJhdGUKKworICAgIGRlZiBzZXRuZnJhbWVzKHNlbGYsIG5mcmFtZXMpOgorICAgICAgICBpZiBzZWxmLl9kYXRhd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBzZWxmLl9uZnJhbWVzID0gbmZyYW1lcworCisgICAgZGVmIGdldG5mcmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uZnJhbWVzd3JpdHRlbgorCisgICAgZGVmIHNldGNvbXB0eXBlKHNlbGYsIGNvbXB0eXBlLCBjb21wbmFtZSk6CisgICAgICAgIGlmIHNlbGYuX2RhdGF3cml0dGVuOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY2hhbmdlIHBhcmFtZXRlcnMgYWZ0ZXIgc3RhcnRpbmcgdG8gd3JpdGUnCisgICAgICAgIGlmIGNvbXB0eXBlIG5vdCBpbiAoJ05PTkUnLCk6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3Vuc3VwcG9ydGVkIGNvbXByZXNzaW9uIHR5cGUnCisgICAgICAgIHNlbGYuX2NvbXB0eXBlID0gY29tcHR5cGUKKyAgICAgICAgc2VsZi5fY29tcG5hbWUgPSBjb21wbmFtZQorCisgICAgZGVmIGdldGNvbXB0eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29tcHR5cGUKKworICAgIGRlZiBnZXRjb21wbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBuYW1lCisKKyAgICBkZWYgc2V0cGFyYW1zKHNlbGYsIHBhcmFtcyk6CisgICAgICAgIG5jaGFubmVscywgc2FtcHdpZHRoLCBmcmFtZXJhdGUsIG5mcmFtZXMsIGNvbXB0eXBlLCBjb21wbmFtZSA9IHBhcmFtcworICAgICAgICBpZiBzZWxmLl9kYXRhd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBzZWxmLnNldG5jaGFubmVscyhuY2hhbm5lbHMpCisgICAgICAgIHNlbGYuc2V0c2FtcHdpZHRoKHNhbXB3aWR0aCkKKyAgICAgICAgc2VsZi5zZXRmcmFtZXJhdGUoZnJhbWVyYXRlKQorICAgICAgICBzZWxmLnNldG5mcmFtZXMobmZyYW1lcykKKyAgICAgICAgc2VsZi5zZXRjb21wdHlwZShjb21wdHlwZSwgY29tcG5hbWUpCisKKyAgICBkZWYgZ2V0cGFyYW1zKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fbmNoYW5uZWxzIG9yIG5vdCBzZWxmLl9zYW1wd2lkdGggb3Igbm90IHNlbGYuX2ZyYW1lcmF0ZToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnbm90IGFsbCBwYXJhbWV0ZXJzIHNldCcKKyAgICAgICAgcmV0dXJuIHNlbGYuX25jaGFubmVscywgc2VsZi5fc2FtcHdpZHRoLCBzZWxmLl9mcmFtZXJhdGUsIFwKKyAgICAgICAgICAgICAgc2VsZi5fbmZyYW1lcywgc2VsZi5fY29tcHR5cGUsIHNlbGYuX2NvbXBuYW1lCisKKyAgICBkZWYgc2V0bWFyayhzZWxmLCBpZCwgcG9zLCBuYW1lKToKKyAgICAgICAgcmFpc2UgRXJyb3IsICdzZXRtYXJrKCkgbm90IHN1cHBvcnRlZCcKKworICAgIGRlZiBnZXRtYXJrKHNlbGYsIGlkKToKKyAgICAgICAgcmFpc2UgRXJyb3IsICdubyBtYXJrcycKKworICAgIGRlZiBnZXRtYXJrZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uZnJhbWVzd3JpdHRlbgorCisgICAgZGVmIHdyaXRlZnJhbWVzcmF3KHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9lbnN1cmVfaGVhZGVyX3dyaXR0ZW4obGVuKGRhdGEpKQorICAgICAgICBuZnJhbWVzID0gbGVuKGRhdGEpIC8vIChzZWxmLl9zYW1wd2lkdGggKiBzZWxmLl9uY2hhbm5lbHMpCisgICAgICAgIGlmIHNlbGYuX2NvbnZlcnQ6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5fY29udmVydChkYXRhKQorICAgICAgICBpZiBzZWxmLl9zYW1wd2lkdGggPiAxIGFuZCBiaWdfZW5kaWFuOgorICAgICAgICAgICAgaW1wb3J0IGFycmF5CisgICAgICAgICAgICBkYXRhID0gYXJyYXkuYXJyYXkoX2FycmF5X2ZtdHNbc2VsZi5fc2FtcHdpZHRoXSwgZGF0YSkKKyAgICAgICAgICAgIGRhdGEuYnl0ZXN3YXAoKQorICAgICAgICAgICAgZGF0YS50b2ZpbGUoc2VsZi5fZmlsZSkKKyAgICAgICAgICAgIHNlbGYuX2RhdGF3cml0dGVuID0gc2VsZi5fZGF0YXdyaXR0ZW4gKyBsZW4oZGF0YSkgKiBzZWxmLl9zYW1wd2lkdGgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIHNlbGYuX2RhdGF3cml0dGVuID0gc2VsZi5fZGF0YXdyaXR0ZW4gKyBsZW4oZGF0YSkKKyAgICAgICAgc2VsZi5fbmZyYW1lc3dyaXR0ZW4gPSBzZWxmLl9uZnJhbWVzd3JpdHRlbiArIG5mcmFtZXMKKworICAgIGRlZiB3cml0ZWZyYW1lcyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi53cml0ZWZyYW1lc3JhdyhkYXRhKQorICAgICAgICBpZiBzZWxmLl9kYXRhbGVuZ3RoICE9IHNlbGYuX2RhdGF3cml0dGVuOgorICAgICAgICAgICAgc2VsZi5fcGF0Y2hoZWFkZXIoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9maWxlOgorICAgICAgICAgICAgc2VsZi5fZW5zdXJlX2hlYWRlcl93cml0dGVuKDApCisgICAgICAgICAgICBpZiBzZWxmLl9kYXRhbGVuZ3RoICE9IHNlbGYuX2RhdGF3cml0dGVuOgorICAgICAgICAgICAgICAgIHNlbGYuX3BhdGNoaGVhZGVyKCkKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5fZmlsZSA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5faV9vcGVuZWRfdGhlX2ZpbGU6CisgICAgICAgICAgICBzZWxmLl9pX29wZW5lZF90aGVfZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLl9pX29wZW5lZF90aGVfZmlsZSA9IE5vbmUKKworICAgICMKKyAgICAjIEludGVybmFsIG1ldGhvZHMuCisgICAgIworCisgICAgZGVmIF9lbnN1cmVfaGVhZGVyX3dyaXR0ZW4oc2VsZiwgZGF0YXNpemUpOgorICAgICAgICBpZiBub3Qgc2VsZi5faGVhZGVyd3JpdHRlbjoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9uY2hhbm5lbHM6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICcjIGNoYW5uZWxzIG5vdCBzcGVjaWZpZWQnCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fc2FtcHdpZHRoOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnc2FtcGxlIHdpZHRoIG5vdCBzcGVjaWZpZWQnCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZnJhbWVyYXRlOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnc2FtcGxpbmcgcmF0ZSBub3Qgc3BlY2lmaWVkJworICAgICAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVyKGRhdGFzaXplKQorCisgICAgZGVmIF93cml0ZV9oZWFkZXIoc2VsZiwgaW5pdGxlbmd0aCk6CisgICAgICAgIGFzc2VydCBub3Qgc2VsZi5faGVhZGVyd3JpdHRlbgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdSSUZGJykKKyAgICAgICAgaWYgbm90IHNlbGYuX25mcmFtZXM6CisgICAgICAgICAgICBzZWxmLl9uZnJhbWVzID0gaW5pdGxlbmd0aCAvIChzZWxmLl9uY2hhbm5lbHMgKiBzZWxmLl9zYW1wd2lkdGgpCisgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBzZWxmLl9uZnJhbWVzICogc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fc2FtcHdpZHRoCisgICAgICAgIHNlbGYuX2Zvcm1fbGVuZ3RoX3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoc3RydWN0LnBhY2soJzxMNHM0c0xISExMSEg0cycsCisgICAgICAgICAgICAzNiArIHNlbGYuX2RhdGFsZW5ndGgsICdXQVZFJywgJ2ZtdCAnLCAxNiwKKyAgICAgICAgICAgIFdBVkVfRk9STUFUX1BDTSwgc2VsZi5fbmNoYW5uZWxzLCBzZWxmLl9mcmFtZXJhdGUsCisgICAgICAgICAgICBzZWxmLl9uY2hhbm5lbHMgKiBzZWxmLl9mcmFtZXJhdGUgKiBzZWxmLl9zYW1wd2lkdGgsCisgICAgICAgICAgICBzZWxmLl9uY2hhbm5lbHMgKiBzZWxmLl9zYW1wd2lkdGgsCisgICAgICAgICAgICBzZWxmLl9zYW1wd2lkdGggKiA4LCAnZGF0YScpKQorICAgICAgICBzZWxmLl9kYXRhX2xlbmd0aF9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBzZWxmLl9maWxlLndyaXRlKHN0cnVjdC5wYWNrKCc8TCcsIHNlbGYuX2RhdGFsZW5ndGgpKQorICAgICAgICBzZWxmLl9oZWFkZXJ3cml0dGVuID0gVHJ1ZQorCisgICAgZGVmIF9wYXRjaGhlYWRlcihzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2hlYWRlcndyaXR0ZW4KKyAgICAgICAgaWYgc2VsZi5fZGF0YXdyaXR0ZW4gPT0gc2VsZi5fZGF0YWxlbmd0aDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBjdXJwb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoc2VsZi5fZm9ybV9sZW5ndGhfcG9zLCAwKQorICAgICAgICBzZWxmLl9maWxlLndyaXRlKHN0cnVjdC5wYWNrKCc8TCcsIDM2ICsgc2VsZi5fZGF0YXdyaXR0ZW4pKQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoc2VsZi5fZGF0YV9sZW5ndGhfcG9zLCAwKQorICAgICAgICBzZWxmLl9maWxlLndyaXRlKHN0cnVjdC5wYWNrKCc8TCcsIHNlbGYuX2RhdGF3cml0dGVuKSkKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKGN1cnBvcywgMCkKKyAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCA9IHNlbGYuX2RhdGF3cml0dGVuCisKK2RlZiBvcGVuKGYsIG1vZGU9Tm9uZSk6CisgICAgaWYgbW9kZSBpcyBOb25lOgorICAgICAgICBpZiBoYXNhdHRyKGYsICdtb2RlJyk6CisgICAgICAgICAgICBtb2RlID0gZi5tb2RlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2RlID0gJ3JiJworICAgIGlmIG1vZGUgaW4gKCdyJywgJ3JiJyk6CisgICAgICAgIHJldHVybiBXYXZlX3JlYWQoZikKKyAgICBlbGlmIG1vZGUgaW4gKCd3JywgJ3diJyk6CisgICAgICAgIHJldHVybiBXYXZlX3dyaXRlKGYpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgRXJyb3IsICJtb2RlIG11c3QgYmUgJ3InLCAncmInLCAndycsIG9yICd3YiciCisKK29wZW5mcCA9IG9wZW4gIyBCL1cgY29tcGF0aWJpbGl0eQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93YXZlLnB5YyBiL2xpYi9weXRob24yLjcvd2F2ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczNDM3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd2F2ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93YXZlLnB5byBiL2xpYi9weXRob24yLjcvd2F2ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU5OTEzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd2F2ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93ZWFrcmVmLnB5IGIvbGliL3B5dGhvbjIuNy93ZWFrcmVmLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YzYwZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dlYWtyZWYucHkKQEAgLTAsMCArMSwzNzkgQEAKKyIiIldlYWsgcmVmZXJlbmNlIHN1cHBvcnQgZm9yIFB5dGhvbi4KKworVGhpcyBtb2R1bGUgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgUEVQIDIwNToKKworaHR0cDovL3d3dy5weXRob24ub3JnL2Rldi9wZXBzL3BlcC0wMjA1LworIiIiCisKKyMgTmFtaW5nIGNvbnZlbnRpb246IFZhcmlhYmxlcyBuYW1lZCAid3IiIGFyZSB3ZWFrIHJlZmVyZW5jZSBvYmplY3RzOworIyB0aGV5IGFyZSBjYWxsZWQgdGhpcyBpbnN0ZWFkIG9mICJyZWYiIHRvIGF2b2lkIG5hbWUgY29sbGlzaW9ucyB3aXRoCisjIHRoZSBtb2R1bGUtZ2xvYmFsIHJlZigpIGZ1bmN0aW9uIGltcG9ydGVkIGZyb20gX3dlYWtyZWYuCisKK2ltcG9ydCBVc2VyRGljdAorCitmcm9tIF93ZWFrcmVmIGltcG9ydCAoCisgICAgIGdldHdlYWtyZWZjb3VudCwKKyAgICAgZ2V0d2Vha3JlZnMsCisgICAgIHJlZiwKKyAgICAgcHJveHksCisgICAgIENhbGxhYmxlUHJveHlUeXBlLAorICAgICBQcm94eVR5cGUsCisgICAgIFJlZmVyZW5jZVR5cGUpCisKK2Zyb20gX3dlYWtyZWZzZXQgaW1wb3J0IFdlYWtTZXQKKworZnJvbSBleGNlcHRpb25zIGltcG9ydCBSZWZlcmVuY2VFcnJvcgorCisKK1Byb3h5VHlwZXMgPSAoUHJveHlUeXBlLCBDYWxsYWJsZVByb3h5VHlwZSkKKworX19hbGxfXyA9IFsicmVmIiwgInByb3h5IiwgImdldHdlYWtyZWZjb3VudCIsICJnZXR3ZWFrcmVmcyIsCisgICAgICAgICAgICJXZWFrS2V5RGljdGlvbmFyeSIsICJSZWZlcmVuY2VFcnJvciIsICJSZWZlcmVuY2VUeXBlIiwgIlByb3h5VHlwZSIsCisgICAgICAgICAgICJDYWxsYWJsZVByb3h5VHlwZSIsICJQcm94eVR5cGVzIiwgIldlYWtWYWx1ZURpY3Rpb25hcnkiLCAnV2Vha1NldCddCisKKworY2xhc3MgV2Vha1ZhbHVlRGljdGlvbmFyeShVc2VyRGljdC5Vc2VyRGljdCk6CisgICAgIiIiTWFwcGluZyBjbGFzcyB0aGF0IHJlZmVyZW5jZXMgdmFsdWVzIHdlYWtseS4KKworICAgIEVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnkgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiBubyBzdHJvbmcKKyAgICByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIGV4aXN0cyBhbnltb3JlCisgICAgIiIiCisgICAgIyBXZSBpbmhlcml0IHRoZSBjb25zdHJ1Y3RvciB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHRoZSBpbnB1dAorICAgICMgZGljdGlvbmFyeTsgc2luY2UgaXQgdXNlcyBvdXIgLnVwZGF0ZSgpIG1ldGhvZCwgd2UgZ2V0IHRoZSByaWdodAorICAgICMgY2hlY2tzIChpZiB0aGUgb3RoZXIgZGljdGlvbmFyeSBpcyBhIFdlYWtWYWx1ZURpY3Rpb25hcnksCisgICAgIyBvYmplY3RzIGFyZSB1bndyYXBwZWQgb24gdGhlIHdheSBvdXQsIGFuZCB3ZSBhbHdheXMgd3JhcCBvbiB0aGUKKyAgICAjIHdheSBpbikuCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICBkZWYgcmVtb3ZlKHdyLCBzZWxmcmVmPXJlZihzZWxmKSk6CisgICAgICAgICAgICBzZWxmID0gc2VsZnJlZigpCisgICAgICAgICAgICBpZiBzZWxmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmRhdGFbd3Iua2V5XQorICAgICAgICBzZWxmLl9yZW1vdmUgPSByZW1vdmUKKyAgICAgICAgVXNlckRpY3QuVXNlckRpY3QuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgbyA9IHNlbGYuZGF0YVtrZXldKCkKKyAgICAgICAgaWYgbyBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IsIGtleQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG8KKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbyA9IHNlbGYuZGF0YVtrZXldKCkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBvIGlzIG5vdCBOb25lCisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvID0gc2VsZi5kYXRhW2tleV0oKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIG8gaXMgbm90IE5vbmUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8V2Vha1ZhbHVlRGljdGlvbmFyeSBhdCAlcz4iICUgaWQoc2VsZikKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgc2VsZi5kYXRhW2tleV0gPSBLZXllZFJlZih2YWx1ZSwgc2VsZi5fcmVtb3ZlLCBrZXkpCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgbmV3ID0gV2Vha1ZhbHVlRGljdGlvbmFyeSgpCisgICAgICAgIGZvciBrZXksIHdyIGluIHNlbGYuZGF0YS5pdGVtcygpOgorICAgICAgICAgICAgbyA9IHdyKCkKKyAgICAgICAgICAgIGlmIG8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbmV3W2tleV0gPSBvCisgICAgICAgIHJldHVybiBuZXcKKworICAgIF9fY29weV9fID0gY29weQorCisgICAgZGVmIF9fZGVlcGNvcHlfXyhzZWxmLCBtZW1vKToKKyAgICAgICAgZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQorICAgICAgICBuZXcgPSBzZWxmLl9fY2xhc3NfXygpCisgICAgICAgIGZvciBrZXksIHdyIGluIHNlbGYuZGF0YS5pdGVtcygpOgorICAgICAgICAgICAgbyA9IHdyKCkKKyAgICAgICAgICAgIGlmIG8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbmV3W2RlZXBjb3B5KGtleSwgbWVtbyldID0gbworICAgICAgICByZXR1cm4gbmV3CisKKyAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3IgPSBzZWxmLmRhdGFba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbyA9IHdyKCkKKyAgICAgICAgICAgIGlmIG8gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuCisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIG8KKworICAgIGRlZiBpdGVtcyhzZWxmKToKKyAgICAgICAgTCA9IFtdCisgICAgICAgIGZvciBrZXksIHdyIGluIHNlbGYuZGF0YS5pdGVtcygpOgorICAgICAgICAgICAgbyA9IHdyKCkKKyAgICAgICAgICAgIGlmIG8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgTC5hcHBlbmQoKGtleSwgbykpCisgICAgICAgIHJldHVybiBMCisKKyAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgorICAgICAgICBmb3Igd3IgaW4gc2VsZi5kYXRhLml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgICAgIHZhbHVlID0gd3IoKQorICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgeWllbGQgd3Iua2V5LCB2YWx1ZQorCisgICAgZGVmIGl0ZXJrZXlzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLml0ZXJrZXlzKCkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pdGVya2V5cygpCisKKyAgICBkZWYgaXRlcnZhbHVlcmVmcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgeWllbGRzIHRoZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcy4KKworICAgICAgICBUaGUgcmVmZXJlbmNlcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgJ2xpdmUnIGF0IHRoZSB0aW1lCisgICAgICAgIHRoZXkgYXJlIHVzZWQsIHNvIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgcmVmZXJlbmNlcyBuZWVkcworICAgICAgICB0byBiZSBjaGVja2VkIGJlZm9yZSBiZWluZyB1c2VkLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZAorICAgICAgICBjcmVhdGluZyByZWZlcmVuY2VzIHRoYXQgd2lsbCBjYXVzZSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgdG8KKyAgICAgICAga2VlcCB0aGUgdmFsdWVzIGFyb3VuZCBsb25nZXIgdGhhbiBuZWVkZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuaXRlcnZhbHVlcygpCisKKyAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKKyAgICAgICAgZm9yIHdyIGluIHNlbGYuZGF0YS5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICBvYmogPSB3cigpCisgICAgICAgICAgICBpZiBvYmogaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgeWllbGQgb2JqCisKKyAgICBkZWYgcG9waXRlbShzZWxmKToKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGtleSwgd3IgPSBzZWxmLmRhdGEucG9waXRlbSgpCisgICAgICAgICAgICBvID0gd3IoKQorICAgICAgICAgICAgaWYgbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4ga2V5LCBvCisKKyAgICBkZWYgcG9wKHNlbGYsIGtleSwgKmFyZ3MpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvID0gc2VsZi5kYXRhLnBvcChrZXkpKCkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgICAgICByZXR1cm4gYXJnc1swXQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgaWYgbyBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IsIGtleQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG8KKworICAgIGRlZiBzZXRkZWZhdWx0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3IgPSBzZWxmLmRhdGFba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLmRhdGFba2V5XSA9IEtleWVkUmVmKGRlZmF1bHQsIHNlbGYuX3JlbW92ZSwga2V5KQorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiB3cigpCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIGRpY3Q9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICBkID0gc2VsZi5kYXRhCisgICAgICAgIGlmIGRpY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihkaWN0LCAiaXRlbXMiKToKKyAgICAgICAgICAgICAgICBkaWN0ID0gdHlwZSh7fSkoZGljdCkKKyAgICAgICAgICAgIGZvciBrZXksIG8gaW4gZGljdC5pdGVtcygpOgorICAgICAgICAgICAgICAgIGRba2V5XSA9IEtleWVkUmVmKG8sIHNlbGYuX3JlbW92ZSwga2V5KQorICAgICAgICBpZiBsZW4oa3dhcmdzKToKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKGt3YXJncykKKworICAgIGRlZiB2YWx1ZXJlZnMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMuCisKKyAgICAgICAgVGhlIHJlZmVyZW5jZXMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlICdsaXZlJyBhdCB0aGUgdGltZQorICAgICAgICB0aGV5IGFyZSB1c2VkLCBzbyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIHJlZmVyZW5jZXMgbmVlZHMKKyAgICAgICAgdG8gYmUgY2hlY2tlZCBiZWZvcmUgYmVpbmcgdXNlZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQKKyAgICAgICAgY3JlYXRpbmcgcmVmZXJlbmNlcyB0aGF0IHdpbGwgY2F1c2UgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvCisgICAgICAgIGtlZXAgdGhlIHZhbHVlcyBhcm91bmQgbG9uZ2VyIHRoYW4gbmVlZGVkLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnZhbHVlcygpCisKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIHdyIGluIHNlbGYuZGF0YS52YWx1ZXMoKToKKyAgICAgICAgICAgIG8gPSB3cigpCisgICAgICAgICAgICBpZiBvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIEwuYXBwZW5kKG8pCisgICAgICAgIHJldHVybiBMCisKKworY2xhc3MgS2V5ZWRSZWYocmVmKToKKyAgICAiIiJTcGVjaWFsaXplZCByZWZlcmVuY2UgdGhhdCBpbmNsdWRlcyBhIGtleSBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZS4KKworICAgIFRoaXMgaXMgdXNlZCBpbiB0aGUgV2Vha1ZhbHVlRGljdGlvbmFyeSB0byBhdm9pZCBoYXZpbmcgdG8gY3JlYXRlCisgICAgYSBmdW5jdGlvbiBvYmplY3QgZm9yIGVhY2gga2V5IHN0b3JlZCBpbiB0aGUgbWFwcGluZy4gIEEgc2hhcmVkCisgICAgY2FsbGJhY2sgb2JqZWN0IGNhbiB1c2UgdGhlICdrZXknIGF0dHJpYnV0ZSBvZiBhIEtleWVkUmVmIGluc3RlYWQKKyAgICBvZiBnZXR0aW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBrZXkgZnJvbSBhbiBlbmNsb3Npbmcgc2NvcGUuCisKKyAgICAiIiIKKworICAgIF9fc2xvdHNfXyA9ICJrZXkiLAorCisgICAgZGVmIF9fbmV3X18odHlwZSwgb2IsIGNhbGxiYWNrLCBrZXkpOgorICAgICAgICBzZWxmID0gcmVmLl9fbmV3X18odHlwZSwgb2IsIGNhbGxiYWNrKQorICAgICAgICBzZWxmLmtleSA9IGtleQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iLCBjYWxsYmFjaywga2V5KToKKyAgICAgICAgc3VwZXIoS2V5ZWRSZWYsICBzZWxmKS5fX2luaXRfXyhvYiwgY2FsbGJhY2spCisKKworY2xhc3MgV2Vha0tleURpY3Rpb25hcnkoVXNlckRpY3QuVXNlckRpY3QpOgorICAgICIiIiBNYXBwaW5nIGNsYXNzIHRoYXQgcmVmZXJlbmNlcyBrZXlzIHdlYWtseS4KKworICAgIEVudHJpZXMgaW4gdGhlIGRpY3Rpb25hcnkgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiB0aGVyZSBpcyBubworICAgIGxvbmdlciBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIGtleS4gVGhpcyBjYW4gYmUgdXNlZCB0bworICAgIGFzc29jaWF0ZSBhZGRpdGlvbmFsIGRhdGEgd2l0aCBhbiBvYmplY3Qgb3duZWQgYnkgb3RoZXIgcGFydHMgb2YKKyAgICBhbiBhcHBsaWNhdGlvbiB3aXRob3V0IGFkZGluZyBhdHRyaWJ1dGVzIHRvIHRob3NlIG9iamVjdHMuIFRoaXMKKyAgICBjYW4gYmUgZXNwZWNpYWxseSB1c2VmdWwgd2l0aCBvYmplY3RzIHRoYXQgb3ZlcnJpZGUgYXR0cmlidXRlCisgICAgYWNjZXNzZXMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGljdD1Ob25lKToKKyAgICAgICAgc2VsZi5kYXRhID0ge30KKyAgICAgICAgZGVmIHJlbW92ZShrLCBzZWxmcmVmPXJlZihzZWxmKSk6CisgICAgICAgICAgICBzZWxmID0gc2VsZnJlZigpCisgICAgICAgICAgICBpZiBzZWxmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmRhdGFba10KKyAgICAgICAgc2VsZi5fcmVtb3ZlID0gcmVtb3ZlCisgICAgICAgIGlmIGRpY3QgaXMgbm90IE5vbmU6IHNlbGYudXBkYXRlKGRpY3QpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgZGVsIHNlbGYuZGF0YVtyZWYoa2V5KV0KKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhW3JlZihrZXkpXQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIjxXZWFrS2V5RGljdGlvbmFyeSBhdCAlcz4iICUgaWQoc2VsZikKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgc2VsZi5kYXRhW3JlZihrZXksIHNlbGYuX3JlbW92ZSldID0gdmFsdWUKKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICBuZXcgPSBXZWFrS2V5RGljdGlvbmFyeSgpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuZGF0YS5pdGVtcygpOgorICAgICAgICAgICAgbyA9IGtleSgpCisgICAgICAgICAgICBpZiBvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG5ld1tvXSA9IHZhbHVlCisgICAgICAgIHJldHVybiBuZXcKKworICAgIF9fY29weV9fID0gY29weQorCisgICAgZGVmIF9fZGVlcGNvcHlfXyhzZWxmLCBtZW1vKToKKyAgICAgICAgZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQorICAgICAgICBuZXcgPSBzZWxmLl9fY2xhc3NfXygpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuZGF0YS5pdGVtcygpOgorICAgICAgICAgICAgbyA9IGtleSgpCisgICAgICAgICAgICBpZiBvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG5ld1tvXSA9IGRlZXBjb3B5KHZhbHVlLCBtZW1vKQorICAgICAgICByZXR1cm4gbmV3CisKKyAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5nZXQocmVmKGtleSksZGVmYXVsdCkKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyID0gcmVmKGtleSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiB3ciBpbiBzZWxmLmRhdGEKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3IgPSByZWYoa2V5KQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgcmV0dXJuIHdyIGluIHNlbGYuZGF0YQorCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5kYXRhLml0ZW1zKCk6CisgICAgICAgICAgICBvID0ga2V5KCkKKyAgICAgICAgICAgIGlmIG8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgTC5hcHBlbmQoKG8sIHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIEwKKworICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CisgICAgICAgIGZvciB3ciwgdmFsdWUgaW4gc2VsZi5kYXRhLml0ZXJpdGVtcygpOgorICAgICAgICAgICAga2V5ID0gd3IoKQorICAgICAgICAgICAgaWYga2V5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHlpZWxkIGtleSwgdmFsdWUKKworICAgIGRlZiBpdGVya2V5cmVmcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgeWllbGRzIHRoZSB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIGtleXMuCisKKyAgICAgICAgVGhlIHJlZmVyZW5jZXMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlICdsaXZlJyBhdCB0aGUgdGltZQorICAgICAgICB0aGV5IGFyZSB1c2VkLCBzbyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIHJlZmVyZW5jZXMgbmVlZHMKKyAgICAgICAgdG8gYmUgY2hlY2tlZCBiZWZvcmUgYmVpbmcgdXNlZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQKKyAgICAgICAgY3JlYXRpbmcgcmVmZXJlbmNlcyB0aGF0IHdpbGwgY2F1c2UgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvCisgICAgICAgIGtlZXAgdGhlIGtleXMgYXJvdW5kIGxvbmdlciB0aGFuIG5lZWRlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pdGVya2V5cygpCisKKyAgICBkZWYgaXRlcmtleXMoc2VsZik6CisgICAgICAgIGZvciB3ciBpbiBzZWxmLmRhdGEuaXRlcmtleXMoKToKKyAgICAgICAgICAgIG9iaiA9IHdyKCkKKyAgICAgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB5aWVsZCBvYmoKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaXRlcmtleXMoKQorCisgICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuaXRlcnZhbHVlcygpCisKKyAgICBkZWYga2V5cmVmcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gdGhlIGtleXMuCisKKyAgICAgICAgVGhlIHJlZmVyZW5jZXMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlICdsaXZlJyBhdCB0aGUgdGltZQorICAgICAgICB0aGV5IGFyZSB1c2VkLCBzbyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIHJlZmVyZW5jZXMgbmVlZHMKKyAgICAgICAgdG8gYmUgY2hlY2tlZCBiZWZvcmUgYmVpbmcgdXNlZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQKKyAgICAgICAgY3JlYXRpbmcgcmVmZXJlbmNlcyB0aGF0IHdpbGwgY2F1c2UgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvCisgICAgICAgIGtlZXAgdGhlIGtleXMgYXJvdW5kIGxvbmdlciB0aGFuIG5lZWRlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5rZXlzKCkKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIHdyIGluIHNlbGYuZGF0YS5rZXlzKCk6CisgICAgICAgICAgICBvID0gd3IoKQorICAgICAgICAgICAgaWYgbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBMLmFwcGVuZChvKQorICAgICAgICByZXR1cm4gTAorCisgICAgZGVmIHBvcGl0ZW0oc2VsZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBrZXksIHZhbHVlID0gc2VsZi5kYXRhLnBvcGl0ZW0oKQorICAgICAgICAgICAgbyA9IGtleSgpCisgICAgICAgICAgICBpZiBvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBvLCB2YWx1ZQorCisgICAgZGVmIHBvcChzZWxmLCBrZXksICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5wb3AocmVmKGtleSksICphcmdzKQorCisgICAgZGVmIHNldGRlZmF1bHQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnNldGRlZmF1bHQocmVmKGtleSwgc2VsZi5fcmVtb3ZlKSxkZWZhdWx0KQorCisgICAgZGVmIHVwZGF0ZShzZWxmLCBkaWN0PU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgZCA9IHNlbGYuZGF0YQorICAgICAgICBpZiBkaWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoZGljdCwgIml0ZW1zIik6CisgICAgICAgICAgICAgICAgZGljdCA9IHR5cGUoe30pKGRpY3QpCisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgZFtyZWYoa2V5LCBzZWxmLl9yZW1vdmUpXSA9IHZhbHVlCisgICAgICAgIGlmIGxlbihrd2FyZ3MpOgorICAgICAgICAgICAgc2VsZi51cGRhdGUoa3dhcmdzKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93ZWFrcmVmLnB5YyBiL2xpYi9weXRob24yLjcvd2Vha3JlZi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0ZTM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd2Vha3JlZi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93ZWFrcmVmLnB5byBiL2xpYi9weXRob24yLjcvd2Vha3JlZi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0ZTM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd2Vha3JlZi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93ZWJicm93c2VyLnB5IGIvbGliL3B5dGhvbjIuNy93ZWJicm93c2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjcyYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dlYmJyb3dzZXIucHkKQEAgLTAsMCArMSw3MDQgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIkludGVyZmFjZXMgZm9yIGxhdW5jaGluZyBhbmQgcmVtb3RlbHkgY29udHJvbGxpbmcgV2ViIGJyb3dzZXJzLiIiIgorIyBNYWludGFpbmVkIGJ5IEdlb3JnIEJyYW5kbC4KKworaW1wb3J0IG9zCitpbXBvcnQgc2hsZXgKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdGF0CitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHRpbWUKKworX19hbGxfXyA9IFsiRXJyb3IiLCAib3BlbiIsICJvcGVuX25ldyIsICJvcGVuX25ld190YWIiLCAiZ2V0IiwgInJlZ2lzdGVyIl0KKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK19icm93c2VycyA9IHt9ICAgICAgICAgICMgRGljdGlvbmFyeSBvZiBhdmFpbGFibGUgYnJvd3NlciBjb250cm9sbGVycworX3RyeW9yZGVyID0gW10gICAgICAgICAgIyBQcmVmZXJlbmNlIG9yZGVyIG9mIGF2YWlsYWJsZSBicm93c2VycworCitkZWYgcmVnaXN0ZXIobmFtZSwga2xhc3MsIGluc3RhbmNlPU5vbmUsIHVwZGF0ZV90cnlvcmRlcj0xKToKKyAgICAiIiJSZWdpc3RlciBhIGJyb3dzZXIgY29ubmVjdG9yIGFuZCwgb3B0aW9uYWxseSwgY29ubmVjdGlvbi4iIiIKKyAgICBfYnJvd3NlcnNbbmFtZS5sb3dlcigpXSA9IFtrbGFzcywgaW5zdGFuY2VdCisgICAgaWYgdXBkYXRlX3RyeW9yZGVyID4gMDoKKyAgICAgICAgX3RyeW9yZGVyLmFwcGVuZChuYW1lKQorICAgIGVsaWYgdXBkYXRlX3RyeW9yZGVyIDwgMDoKKyAgICAgICAgX3RyeW9yZGVyLmluc2VydCgwLCBuYW1lKQorCitkZWYgZ2V0KHVzaW5nPU5vbmUpOgorICAgICIiIlJldHVybiBhIGJyb3dzZXIgbGF1bmNoZXIgaW5zdGFuY2UgYXBwcm9wcmlhdGUgZm9yIHRoZSBlbnZpcm9ubWVudC4iIiIKKyAgICBpZiB1c2luZyBpcyBub3QgTm9uZToKKyAgICAgICAgYWx0ZXJuYXRpdmVzID0gW3VzaW5nXQorICAgIGVsc2U6CisgICAgICAgIGFsdGVybmF0aXZlcyA9IF90cnlvcmRlcgorICAgIGZvciBicm93c2VyIGluIGFsdGVybmF0aXZlczoKKyAgICAgICAgaWYgJyVzJyBpbiBicm93c2VyOgorICAgICAgICAgICAgIyBVc2VyIGdhdmUgdXMgYSBjb21tYW5kIGxpbmUsIHNwbGl0IGl0IGludG8gbmFtZSBhbmQgYXJncworICAgICAgICAgICAgYnJvd3NlciA9IHNobGV4LnNwbGl0KGJyb3dzZXIpCisgICAgICAgICAgICBpZiBicm93c2VyWy0xXSA9PSAnJic6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJhY2tncm91bmRCcm93c2VyKGJyb3dzZXJbOi0xXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIEdlbmVyaWNCcm93c2VyKGJyb3dzZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFVzZXIgZ2F2ZSB1cyBhIGJyb3dzZXIgbmFtZSBvciBwYXRoLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBfYnJvd3NlcnNbYnJvd3Nlci5sb3dlcigpXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBfc3ludGhlc2l6ZShicm93c2VyKQorICAgICAgICAgICAgaWYgY29tbWFuZFsxXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZFsxXQorICAgICAgICAgICAgZWxpZiBjb21tYW5kWzBdIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBjb21tYW5kWzBdKCkKKyAgICByYWlzZSBFcnJvcigiY291bGQgbm90IGxvY2F0ZSBydW5uYWJsZSBicm93c2VyIikKKworIyBQbGVhc2Ugbm90ZTogdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uIGhpZGVzIGEgYnVpbHRpbiBmdW5jdGlvbi4KKyMgSXQgaXMgcmVjb21tZW5kZWQgb25lIGRvZXMgImltcG9ydCB3ZWJicm93c2VyIiBhbmQgdXNlcyB3ZWJicm93c2VyLm9wZW4odXJsKQorIyBpbnN0ZWFkIG9mICJmcm9tIHdlYmJyb3dzZXIgaW1wb3J0ICoiLgorCitkZWYgb3Blbih1cmwsIG5ldz0wLCBhdXRvcmFpc2U9VHJ1ZSk6CisgICAgZm9yIG5hbWUgaW4gX3RyeW9yZGVyOgorICAgICAgICBicm93c2VyID0gZ2V0KG5hbWUpCisgICAgICAgIGlmIGJyb3dzZXIub3Blbih1cmwsIG5ldywgYXV0b3JhaXNlKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBvcGVuX25ldyh1cmwpOgorICAgIHJldHVybiBvcGVuKHVybCwgMSkKKworZGVmIG9wZW5fbmV3X3RhYih1cmwpOgorICAgIHJldHVybiBvcGVuKHVybCwgMikKKworCitkZWYgX3N5bnRoZXNpemUoYnJvd3NlciwgdXBkYXRlX3RyeW9yZGVyPTEpOgorICAgICIiIkF0dGVtcHQgdG8gc3ludGhlc2l6ZSBhIGNvbnRyb2xsZXIgYmFzZSBvbiBleGlzdGluZyBjb250cm9sbGVycy4KKworICAgIFRoaXMgaXMgdXNlZnVsIHRvIGNyZWF0ZSBhIGNvbnRyb2xsZXIgd2hlbiBhIHVzZXIgc3BlY2lmaWVzIGEgcGF0aCB0bworICAgIGFuIGVudHJ5IGluIHRoZSBCUk9XU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIC0tIHdlIGNhbiBjb3B5IGEgZ2VuZXJhbAorICAgIGNvbnRyb2xsZXIgdG8gb3BlcmF0ZSB1c2luZyBhIHNwZWNpZmljIGluc3RhbGxhdGlvbiBvZiB0aGUgZGVzaXJlZAorICAgIGJyb3dzZXIgaW4gdGhpcyB3YXkuCisKKyAgICBJZiB3ZSBjYW4ndCBjcmVhdGUgYSBjb250cm9sbGVyIGluIHRoaXMgd2F5LCBvciBpZiB0aGVyZSBpcyBubworICAgIGV4ZWN1dGFibGUgZm9yIHRoZSByZXF1ZXN0ZWQgYnJvd3NlciwgcmV0dXJuIFtOb25lLCBOb25lXS4KKworICAgICIiIgorICAgIGNtZCA9IGJyb3dzZXIuc3BsaXQoKVswXQorICAgIGlmIG5vdCBfaXNjb21tYW5kKGNtZCk6CisgICAgICAgIHJldHVybiBbTm9uZSwgTm9uZV0KKyAgICBuYW1lID0gb3MucGF0aC5iYXNlbmFtZShjbWQpCisgICAgdHJ5OgorICAgICAgICBjb21tYW5kID0gX2Jyb3dzZXJzW25hbWUubG93ZXIoKV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJldHVybiBbTm9uZSwgTm9uZV0KKyAgICAjIG5vdyBhdHRlbXB0IHRvIGNsb25lIHRvIGZpdCB0aGUgbmV3IG5hbWU6CisgICAgY29udHJvbGxlciA9IGNvbW1hbmRbMV0KKyAgICBpZiBjb250cm9sbGVyIGFuZCBuYW1lLmxvd2VyKCkgPT0gY29udHJvbGxlci5iYXNlbmFtZToKKyAgICAgICAgaW1wb3J0IGNvcHkKKyAgICAgICAgY29udHJvbGxlciA9IGNvcHkuY29weShjb250cm9sbGVyKQorICAgICAgICBjb250cm9sbGVyLm5hbWUgPSBicm93c2VyCisgICAgICAgIGNvbnRyb2xsZXIuYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGJyb3dzZXIpCisgICAgICAgIHJlZ2lzdGVyKGJyb3dzZXIsIE5vbmUsIGNvbnRyb2xsZXIsIHVwZGF0ZV90cnlvcmRlcikKKyAgICAgICAgcmV0dXJuIFtOb25lLCBjb250cm9sbGVyXQorICAgIHJldHVybiBbTm9uZSwgTm9uZV0KKworCitpZiBzeXMucGxhdGZvcm1bOjNdID09ICJ3aW4iOgorICAgIGRlZiBfaXNleGVjdXRhYmxlKGNtZCk6CisgICAgICAgIGNtZCA9IGNtZC5sb3dlcigpCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNtZCkgYW5kIGNtZC5lbmRzd2l0aCgoIi5leGUiLCAiLmJhdCIpKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGZvciBleHQgaW4gIi5leGUiLCAiLmJhdCI6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShjbWQgKyBleHQpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorZWxzZToKKyAgICBkZWYgX2lzZXhlY3V0YWJsZShjbWQpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShjbWQpOgorICAgICAgICAgICAgbW9kZSA9IG9zLnN0YXQoY21kKVtzdGF0LlNUX01PREVdCisgICAgICAgICAgICBpZiBtb2RlICYgc3RhdC5TX0lYVVNSIG9yIG1vZGUgJiBzdGF0LlNfSVhHUlAgb3IgbW9kZSAmIHN0YXQuU19JWE9USDoKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworZGVmIF9pc2NvbW1hbmQoY21kKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBjbWQgaXMgZXhlY3V0YWJsZSBvciBjYW4gYmUgZm91bmQgb24gdGhlIGV4ZWN1dGFibGUKKyAgICBzZWFyY2ggcGF0aC4iIiIKKyAgICBpZiBfaXNleGVjdXRhYmxlKGNtZCk6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgcGF0aCA9IG9zLmVudmlyb24uZ2V0KCJQQVRIIikKKyAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZm9yIGQgaW4gcGF0aC5zcGxpdChvcy5wYXRoc2VwKToKKyAgICAgICAgZXhlID0gb3MucGF0aC5qb2luKGQsIGNtZCkKKyAgICAgICAgaWYgX2lzZXhlY3V0YWJsZShleGUpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCisjIEdlbmVyYWwgcGFyZW50IGNsYXNzZXMKKworY2xhc3MgQmFzZUJyb3dzZXIob2JqZWN0KToKKyAgICAiIiJQYXJlbnQgY2xhc3MgZm9yIGFsbCBicm93c2Vycy4gRG8gbm90IHVzZSBkaXJlY3RseS4iIiIKKworICAgIGFyZ3MgPSBbJyVzJ10KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lPSIiKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmJhc2VuYW1lID0gbmFtZQorCisgICAgZGVmIG9wZW4oc2VsZiwgdXJsLCBuZXc9MCwgYXV0b3JhaXNlPVRydWUpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgb3Blbl9uZXcoc2VsZiwgdXJsKToKKyAgICAgICAgcmV0dXJuIHNlbGYub3Blbih1cmwsIDEpCisKKyAgICBkZWYgb3Blbl9uZXdfdGFiKHNlbGYsIHVybCk6CisgICAgICAgIHJldHVybiBzZWxmLm9wZW4odXJsLCAyKQorCisKK2NsYXNzIEdlbmVyaWNCcm93c2VyKEJhc2VCcm93c2VyKToKKyAgICAiIiJDbGFzcyBmb3IgYWxsIGJyb3dzZXJzIHN0YXJ0ZWQgd2l0aCBhIGNvbW1hbmQKKyAgICAgICBhbmQgd2l0aG91dCByZW1vdGUgZnVuY3Rpb25hbGl0eS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgICAgIHNlbGYuYXJncyA9IFsiJXMiXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBuYW1lIHNob3VsZCBiZSBhIGxpc3Qgd2l0aCBhcmd1bWVudHMKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWVbMF0KKyAgICAgICAgICAgIHNlbGYuYXJncyA9IG5hbWVbMTpdCisgICAgICAgIHNlbGYuYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGYubmFtZSkKKworICAgIGRlZiBvcGVuKHNlbGYsIHVybCwgbmV3PTAsIGF1dG9yYWlzZT1UcnVlKToKKyAgICAgICAgY21kbGluZSA9IFtzZWxmLm5hbWVdICsgW2FyZy5yZXBsYWNlKCIlcyIsIHVybCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhcmcgaW4gc2VsZi5hcmdzXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nOgorICAgICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZGxpbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZGxpbmUsIGNsb3NlX2Zkcz1UcnVlKQorICAgICAgICAgICAgcmV0dXJuIG5vdCBwLndhaXQoKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisKK2NsYXNzIEJhY2tncm91bmRCcm93c2VyKEdlbmVyaWNCcm93c2VyKToKKyAgICAiIiJDbGFzcyBmb3IgYWxsIGJyb3dzZXJzIHdoaWNoIGFyZSB0byBiZSBzdGFydGVkIGluIHRoZQorICAgICAgIGJhY2tncm91bmQuIiIiCisKKyAgICBkZWYgb3BlbihzZWxmLCB1cmwsIG5ldz0wLCBhdXRvcmFpc2U9VHJ1ZSk6CisgICAgICAgIGNtZGxpbmUgPSBbc2VsZi5uYW1lXSArIFthcmcucmVwbGFjZSgiJXMiLCB1cmwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXJnIGluIHNlbGYuYXJnc10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnd2luJzoKKyAgICAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWRsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZXRzaWQgPSBnZXRhdHRyKG9zLCAnc2V0c2lkJywgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2V0c2lkOgorICAgICAgICAgICAgICAgICAgICBzZXRzaWQgPSBnZXRhdHRyKG9zLCAnc2V0cGdycCcsIE5vbmUpCisgICAgICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kbGluZSwgY2xvc2VfZmRzPVRydWUsIHByZWV4ZWNfZm49c2V0c2lkKQorICAgICAgICAgICAgcmV0dXJuIChwLnBvbGwoKSBpcyBOb25lKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisKK2NsYXNzIFVuaXhCcm93c2VyKEJhc2VCcm93c2VyKToKKyAgICAiIiJQYXJlbnQgY2xhc3MgZm9yIGFsbCBVbml4IGJyb3dzZXJzIHdpdGggcmVtb3RlIGZ1bmN0aW9uYWxpdHkuIiIiCisKKyAgICByYWlzZV9vcHRzID0gTm9uZQorICAgIHJlbW90ZV9hcmdzID0gWyclYWN0aW9uJywgJyVzJ10KKyAgICByZW1vdGVfYWN0aW9uID0gTm9uZQorICAgIHJlbW90ZV9hY3Rpb25fbmV3d2luID0gTm9uZQorICAgIHJlbW90ZV9hY3Rpb25fbmV3dGFiID0gTm9uZQorICAgIGJhY2tncm91bmQgPSBGYWxzZQorICAgIHJlZGlyZWN0X3N0ZG91dCA9IFRydWUKKworICAgIGRlZiBfaW52b2tlKHNlbGYsIGFyZ3MsIHJlbW90ZSwgYXV0b3JhaXNlKToKKyAgICAgICAgcmFpc2Vfb3B0ID0gW10KKyAgICAgICAgaWYgcmVtb3RlIGFuZCBzZWxmLnJhaXNlX29wdHM6CisgICAgICAgICAgICAjIHVzZSBhdXRvcmFpc2UgYXJndW1lbnQgb25seSBmb3IgcmVtb3RlIGludm9jYXRpb24KKyAgICAgICAgICAgIGF1dG9yYWlzZSA9IGludChhdXRvcmFpc2UpCisgICAgICAgICAgICBvcHQgPSBzZWxmLnJhaXNlX29wdHNbYXV0b3JhaXNlXQorICAgICAgICAgICAgaWYgb3B0OiByYWlzZV9vcHQgPSBbb3B0XQorCisgICAgICAgIGNtZGxpbmUgPSBbc2VsZi5uYW1lXSArIHJhaXNlX29wdCArIGFyZ3MKKworICAgICAgICBpZiByZW1vdGUgb3Igc2VsZi5iYWNrZ3JvdW5kOgorICAgICAgICAgICAgaW5vdXQgPSBmaWxlKG9zLmRldm51bGwsICJyKyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGZvciBUVFkgYnJvd3NlcnMsIHdlIG5lZWQgc3RkaW4vb3V0CisgICAgICAgICAgICBpbm91dCA9IE5vbmUKKyAgICAgICAgIyBpZiBwb3NzaWJsZSwgcHV0IGJyb3dzZXIgaW4gc2VwYXJhdGUgcHJvY2VzcyBncm91cCwgc28KKyAgICAgICAgIyBrZXlib2FyZCBpbnRlcnJ1cHRzIGRvbid0IGFmZmVjdCBicm93c2VyIGFzIHdlbGwgYXMgUHl0aG9uCisgICAgICAgIHNldHNpZCA9IGdldGF0dHIob3MsICdzZXRzaWQnLCBOb25lKQorICAgICAgICBpZiBub3Qgc2V0c2lkOgorICAgICAgICAgICAgc2V0c2lkID0gZ2V0YXR0cihvcywgJ3NldHBncnAnLCBOb25lKQorCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZGxpbmUsIGNsb3NlX2Zkcz1UcnVlLCBzdGRpbj1pbm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PShzZWxmLnJlZGlyZWN0X3N0ZG91dCBhbmQgaW5vdXQgb3IgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1pbm91dCwgcHJlZXhlY19mbj1zZXRzaWQpCisgICAgICAgIGlmIHJlbW90ZToKKyAgICAgICAgICAgICMgd2FpdCBmaXZlIHNlY29uZHMuIElmIHRoZSBzdWJwcm9jZXNzIGlzIG5vdCBmaW5pc2hlZCwgdGhlCisgICAgICAgICAgICAjIHJlbW90ZSBpbnZvY2F0aW9uIGhhcyAoaG9wZWZ1bGx5KSBzdGFydGVkIGEgbmV3IGluc3RhbmNlLgorICAgICAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICAgICAgcmMgPSBwLnBvbGwoKQorICAgICAgICAgICAgaWYgcmMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDQpCisgICAgICAgICAgICAgICAgcmMgPSBwLnBvbGwoKQorICAgICAgICAgICAgICAgIGlmIHJjIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAjIGlmIHJlbW90ZSBjYWxsIGZhaWxlZCwgb3BlbigpIHdpbGwgdHJ5IGRpcmVjdCBpbnZvY2F0aW9uCisgICAgICAgICAgICByZXR1cm4gbm90IHJjCisgICAgICAgIGVsaWYgc2VsZi5iYWNrZ3JvdW5kOgorICAgICAgICAgICAgaWYgcC5wb2xsKCkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBub3QgcC53YWl0KCkKKworICAgIGRlZiBvcGVuKHNlbGYsIHVybCwgbmV3PTAsIGF1dG9yYWlzZT1UcnVlKToKKyAgICAgICAgaWYgbmV3ID09IDA6CisgICAgICAgICAgICBhY3Rpb24gPSBzZWxmLnJlbW90ZV9hY3Rpb24KKyAgICAgICAgZWxpZiBuZXcgPT0gMToKKyAgICAgICAgICAgIGFjdGlvbiA9IHNlbGYucmVtb3RlX2FjdGlvbl9uZXd3aW4KKyAgICAgICAgZWxpZiBuZXcgPT0gMjoKKyAgICAgICAgICAgIGlmIHNlbGYucmVtb3RlX2FjdGlvbl9uZXd0YWIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBzZWxmLnJlbW90ZV9hY3Rpb25fbmV3d2luCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFjdGlvbiA9IHNlbGYucmVtb3RlX2FjdGlvbl9uZXd0YWIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yKCJCYWQgJ25ldycgcGFyYW1ldGVyIHRvIG9wZW4oKTsgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgMCwgMSwgb3IgMiwgZ290ICVzIiAlIG5ldykKKworICAgICAgICBhcmdzID0gW2FyZy5yZXBsYWNlKCIlcyIsIHVybCkucmVwbGFjZSgiJWFjdGlvbiIsIGFjdGlvbikKKyAgICAgICAgICAgICAgICBmb3IgYXJnIGluIHNlbGYucmVtb3RlX2FyZ3NdCisgICAgICAgIHN1Y2Nlc3MgPSBzZWxmLl9pbnZva2UoYXJncywgVHJ1ZSwgYXV0b3JhaXNlKQorICAgICAgICBpZiBub3Qgc3VjY2VzczoKKyAgICAgICAgICAgICMgcmVtb3RlIGludm9jYXRpb24gZmFpbGVkLCB0cnkgc3RyYWlnaHQgd2F5CisgICAgICAgICAgICBhcmdzID0gW2FyZy5yZXBsYWNlKCIlcyIsIHVybCkgZm9yIGFyZyBpbiBzZWxmLmFyZ3NdCisgICAgICAgICAgICByZXR1cm4gc2VsZi5faW52b2tlKGFyZ3MsIEZhbHNlLCBGYWxzZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKworY2xhc3MgTW96aWxsYShVbml4QnJvd3Nlcik6CisgICAgIiIiTGF1bmNoZXIgY2xhc3MgZm9yIE1vemlsbGEvTmV0c2NhcGUgYnJvd3NlcnMuIiIiCisKKyAgICByYWlzZV9vcHRzID0gWyItbm9yYWlzZSIsICItcmFpc2UiXQorICAgIHJlbW90ZV9hcmdzID0gWyctcmVtb3RlJywgJ29wZW5VUkwoJXMlYWN0aW9uKSddCisgICAgcmVtb3RlX2FjdGlvbiA9ICIiCisgICAgcmVtb3RlX2FjdGlvbl9uZXd3aW4gPSAiLG5ldy13aW5kb3ciCisgICAgcmVtb3RlX2FjdGlvbl9uZXd0YWIgPSAiLG5ldy10YWIiCisgICAgYmFja2dyb3VuZCA9IFRydWUKKworTmV0c2NhcGUgPSBNb3ppbGxhCisKKworY2xhc3MgR2FsZW9uKFVuaXhCcm93c2VyKToKKyAgICAiIiJMYXVuY2hlciBjbGFzcyBmb3IgR2FsZW9uL0VwaXBoYW55IGJyb3dzZXJzLiIiIgorCisgICAgcmFpc2Vfb3B0cyA9IFsiLW5vcmFpc2UiLCAiIl0KKyAgICByZW1vdGVfYXJncyA9IFsnJWFjdGlvbicsICclcyddCisgICAgcmVtb3RlX2FjdGlvbiA9ICItbiIKKyAgICByZW1vdGVfYWN0aW9uX25ld3dpbiA9ICItdyIKKyAgICBiYWNrZ3JvdW5kID0gVHJ1ZQorCisKK2NsYXNzIENocm9tZShVbml4QnJvd3Nlcik6CisgICAgIkxhdW5jaGVyIGNsYXNzIGZvciBHb29nbGUgQ2hyb21lIGJyb3dzZXIuIgorCisgICAgcmVtb3RlX2FyZ3MgPSBbJyVhY3Rpb24nLCAnJXMnXQorICAgIHJlbW90ZV9hY3Rpb24gPSAiIgorICAgIHJlbW90ZV9hY3Rpb25fbmV3d2luID0gIi0tbmV3LXdpbmRvdyIKKyAgICByZW1vdGVfYWN0aW9uX25ld3RhYiA9ICIiCisgICAgYmFja2dyb3VuZCA9IFRydWUKKworQ2hyb21pdW0gPSBDaHJvbWUKKworCitjbGFzcyBPcGVyYShVbml4QnJvd3Nlcik6CisgICAgIkxhdW5jaGVyIGNsYXNzIGZvciBPcGVyYSBicm93c2VyLiIKKworICAgIHJhaXNlX29wdHMgPSBbIi1ub3JhaXNlIiwgIiJdCisgICAgcmVtb3RlX2FyZ3MgPSBbJy1yZW1vdGUnLCAnb3BlblVSTCglcyVhY3Rpb24pJ10KKyAgICByZW1vdGVfYWN0aW9uID0gIiIKKyAgICByZW1vdGVfYWN0aW9uX25ld3dpbiA9ICIsbmV3LXdpbmRvdyIKKyAgICByZW1vdGVfYWN0aW9uX25ld3RhYiA9ICIsbmV3LXBhZ2UiCisgICAgYmFja2dyb3VuZCA9IFRydWUKKworCitjbGFzcyBFbGlua3MoVW5peEJyb3dzZXIpOgorICAgICJMYXVuY2hlciBjbGFzcyBmb3IgRWxpbmtzIGJyb3dzZXJzLiIKKworICAgIHJlbW90ZV9hcmdzID0gWyctcmVtb3RlJywgJ29wZW5VUkwoJXMlYWN0aW9uKSddCisgICAgcmVtb3RlX2FjdGlvbiA9ICIiCisgICAgcmVtb3RlX2FjdGlvbl9uZXd3aW4gPSAiLG5ldy13aW5kb3ciCisgICAgcmVtb3RlX2FjdGlvbl9uZXd0YWIgPSAiLG5ldy10YWIiCisgICAgYmFja2dyb3VuZCA9IEZhbHNlCisKKyAgICAjIGVsaW5rcyBkb2Vzbid0IGxpa2UgaXRzIHN0ZG91dCB0byBiZSByZWRpcmVjdGVkIC0KKyAgICAjIGl0IHVzZXMgcmVkaXJlY3RlZCBzdGRvdXQgYXMgYSBzaWduYWwgdG8gZG8gLWR1bXAKKyAgICByZWRpcmVjdF9zdGRvdXQgPSBGYWxzZQorCisKK2NsYXNzIEtvbnF1ZXJvcihCYXNlQnJvd3Nlcik6CisgICAgIiIiQ29udHJvbGxlciBmb3IgdGhlIEtERSBGaWxlIE1hbmFnZXIgKGtmbSwgb3IgS29ucXVlcm9yKS4KKworICAgIFNlZSB0aGUgb3V0cHV0IG9mIGBga2ZtY2xpZW50IC0tY29tbWFuZHNgYAorICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBLb25xdWVyb3IgcmVtb3RlLWNvbnRyb2wgaW50ZXJmYWNlLgorICAgICIiIgorCisgICAgZGVmIG9wZW4oc2VsZiwgdXJsLCBuZXc9MCwgYXV0b3JhaXNlPVRydWUpOgorICAgICAgICAjIFhYWCBDdXJyZW50bHkgSSBrbm93IG5vIHdheSB0byBwcmV2ZW50IEtGTSBmcm9tIG9wZW5pbmcgYSBuZXcgd2luLgorICAgICAgICBpZiBuZXcgPT0gMjoKKyAgICAgICAgICAgIGFjdGlvbiA9ICJuZXdUYWIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhY3Rpb24gPSAib3BlblVSTCIKKworICAgICAgICBkZXZudWxsID0gZmlsZShvcy5kZXZudWxsLCAicisiKQorICAgICAgICAjIGlmIHBvc3NpYmxlLCBwdXQgYnJvd3NlciBpbiBzZXBhcmF0ZSBwcm9jZXNzIGdyb3VwLCBzbworICAgICAgICAjIGtleWJvYXJkIGludGVycnVwdHMgZG9uJ3QgYWZmZWN0IGJyb3dzZXIgYXMgd2VsbCBhcyBQeXRob24KKyAgICAgICAgc2V0c2lkID0gZ2V0YXR0cihvcywgJ3NldHNpZCcsIE5vbmUpCisgICAgICAgIGlmIG5vdCBzZXRzaWQ6CisgICAgICAgICAgICBzZXRzaWQgPSBnZXRhdHRyKG9zLCAnc2V0cGdycCcsIE5vbmUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWyJrZm1jbGllbnQiLCBhY3Rpb24sIHVybF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV9mZHM9VHJ1ZSwgc3RkaW49ZGV2bnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1kZXZudWxsLCBzdGRlcnI9ZGV2bnVsbCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAjIGZhbGwgdGhyb3VnaCB0byBuZXh0IHZhcmlhbnQKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHAud2FpdCgpCisgICAgICAgICAgICAjIGtmbWNsaWVudCdzIHJldHVybiBjb2RlIHVuZm9ydHVuYXRlbHkgaGFzIG5vIG1lYW5pbmcgYXMgaXQgc2VlbXMKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWyJrb25xdWVyb3IiLCAiLS1zaWxlbnQiLCB1cmxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VfZmRzPVRydWUsIHN0ZGluPWRldm51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9ZGV2bnVsbCwgc3RkZXJyPWRldm51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVleGVjX2ZuPXNldHNpZCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAjIGZhbGwgdGhyb3VnaCB0byBuZXh0IHZhcmlhbnQKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHAucG9sbCgpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBTaG91bGQgYmUgcnVubmluZyBub3cuCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbImtmbSIsICItZCIsIHVybF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV9mZHM9VHJ1ZSwgc3RkaW49ZGV2bnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1kZXZudWxsLCBzdGRlcnI9ZGV2bnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWV4ZWNfZm49c2V0c2lkKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIChwLnBvbGwoKSBpcyBOb25lKQorCisKK2NsYXNzIEdyYWlsKEJhc2VCcm93c2VyKToKKyAgICAjIFRoZXJlIHNob3VsZCBiZSBhIHdheSB0byBtYWludGFpbiBhIGNvbm5lY3Rpb24gdG8gR3JhaWwsIGJ1dCB0aGUKKyAgICAjIEdyYWlsIHJlbW90ZSBjb250cm9sIHByb3RvY29sIGRvZXNuJ3QgcmVhbGx5IGFsbG93IHRoYXQgYXQgdGhpcworICAgICMgcG9pbnQuICBJdCBwcm9iYWJseSBuZXZlciB3aWxsIQorICAgIGRlZiBfZmluZF9ncmFpbF9yYyhzZWxmKToKKyAgICAgICAgaW1wb3J0IGdsb2IKKyAgICAgICAgaW1wb3J0IHB3ZAorICAgICAgICBpbXBvcnQgc29ja2V0CisgICAgICAgIGltcG9ydCB0ZW1wZmlsZQorICAgICAgICB0ZW1wZGlyID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLmdldHRlbXBkaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLmdyYWlsLXVuaXgiKQorICAgICAgICB1c2VyID0gcHdkLmdldHB3dWlkKG9zLmdldHVpZCgpKVswXQorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCB1c2VyICsgIi0qIikKKyAgICAgICAgbWF5YmVzID0gZ2xvYi5nbG9iKGZpbGVuYW1lKQorICAgICAgICBpZiBub3QgbWF5YmVzOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgZm9yIGZuIGluIG1heWJlczoKKyAgICAgICAgICAgICMgbmVlZCB0byBQSU5HIGVhY2ggb25lIHVudGlsIHdlIGZpbmQgb25lIHRoYXQncyBsaXZlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcy5jb25uZWN0KGZuKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICAjIG5vIGdvb2Q7IGF0dGVtcHQgdG8gY2xlYW4gaXQgb3V0LCBidXQgZG9uJ3QgZmFpbDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmbikKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcworCisgICAgZGVmIF9yZW1vdGUoc2VsZiwgYWN0aW9uKToKKyAgICAgICAgcyA9IHNlbGYuX2ZpbmRfZ3JhaWxfcmMoKQorICAgICAgICBpZiBub3QgczoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHMuc2VuZChhY3Rpb24pCisgICAgICAgIHMuY2xvc2UoKQorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIG9wZW4oc2VsZiwgdXJsLCBuZXc9MCwgYXV0b3JhaXNlPVRydWUpOgorICAgICAgICBpZiBuZXc6CisgICAgICAgICAgICBvayA9IHNlbGYuX3JlbW90ZSgiTE9BRE5FVyAiICsgdXJsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2sgPSBzZWxmLl9yZW1vdGUoIkxPQUQgIiArIHVybCkKKyAgICAgICAgcmV0dXJuIG9rCisKKworIworIyBQbGF0Zm9ybSBzdXBwb3J0IGZvciBVbml4CisjCisKKyMgVGhlc2UgYXJlIHRoZSByaWdodCB0ZXN0cyBiZWNhdXNlIGFsbCB0aGVzZSBVbml4IGJyb3dzZXJzIHJlcXVpcmUgZWl0aGVyCisjIGEgY29uc29sZSB0ZXJtaW5hbCBvciBhbiBYIGRpc3BsYXkgdG8gcnVuLgorCitkZWYgcmVnaXN0ZXJfWF9icm93c2VycygpOgorCisgICAgIyB1c2UgeGRnLW9wZW4gaWYgYXJvdW5kCisgICAgaWYgX2lzY29tbWFuZCgieGRnLW9wZW4iKToKKyAgICAgICAgcmVnaXN0ZXIoInhkZy1vcGVuIiwgTm9uZSwgQmFja2dyb3VuZEJyb3dzZXIoInhkZy1vcGVuIikpCisKKyAgICAjIFRoZSBkZWZhdWx0IEdOT01FMyBicm93c2VyCisgICAgaWYgIkdOT01FX0RFU0tUT1BfU0VTU0lPTl9JRCIgaW4gb3MuZW52aXJvbiBhbmQgX2lzY29tbWFuZCgiZ3Zmcy1vcGVuIik6CisgICAgICAgIHJlZ2lzdGVyKCJndmZzLW9wZW4iLCBOb25lLCBCYWNrZ3JvdW5kQnJvd3NlcigiZ3Zmcy1vcGVuIikpCisKKyAgICAjIFRoZSBkZWZhdWx0IEdOT01FIGJyb3dzZXIKKyAgICBpZiAiR05PTUVfREVTS1RPUF9TRVNTSU9OX0lEIiBpbiBvcy5lbnZpcm9uIGFuZCBfaXNjb21tYW5kKCJnbm9tZS1vcGVuIik6CisgICAgICAgIHJlZ2lzdGVyKCJnbm9tZS1vcGVuIiwgTm9uZSwgQmFja2dyb3VuZEJyb3dzZXIoImdub21lLW9wZW4iKSkKKworICAgICMgVGhlIGRlZmF1bHQgS0RFIGJyb3dzZXIKKyAgICBpZiAiS0RFX0ZVTExfU0VTU0lPTiIgaW4gb3MuZW52aXJvbiBhbmQgX2lzY29tbWFuZCgia2ZtY2xpZW50Iik6CisgICAgICAgIHJlZ2lzdGVyKCJrZm1jbGllbnQiLCBLb25xdWVyb3IsIEtvbnF1ZXJvcigia2ZtY2xpZW50IikpCisKKyAgICBpZiBfaXNjb21tYW5kKCJ4LXd3dy1icm93c2VyIik6CisgICAgICAgIHJlZ2lzdGVyKCJ4LXd3dy1icm93c2VyIiwgTm9uZSwgQmFja2dyb3VuZEJyb3dzZXIoIngtd3d3LWJyb3dzZXIiKSkKKworICAgICMgVGhlIE1vemlsbGEvTmV0c2NhcGUgYnJvd3NlcnMKKyAgICBmb3IgYnJvd3NlciBpbiAoIm1vemlsbGEtZmlyZWZveCIsICJmaXJlZm94IiwKKyAgICAgICAgICAgICAgICAgICAgIm1vemlsbGEtZmlyZWJpcmQiLCAiZmlyZWJpcmQiLAorICAgICAgICAgICAgICAgICAgICAiaWNld2Vhc2VsIiwgImljZWFwZSIsCisgICAgICAgICAgICAgICAgICAgICJzZWFtb25rZXkiLCAibW96aWxsYSIsICJuZXRzY2FwZSIpOgorICAgICAgICBpZiBfaXNjb21tYW5kKGJyb3dzZXIpOgorICAgICAgICAgICAgcmVnaXN0ZXIoYnJvd3NlciwgTm9uZSwgTW96aWxsYShicm93c2VyKSkKKworICAgICMgS29ucXVlcm9yL2tmbSwgdGhlIEtERSBicm93c2VyLgorICAgIGlmIF9pc2NvbW1hbmQoImtmbSIpOgorICAgICAgICByZWdpc3Rlcigia2ZtIiwgS29ucXVlcm9yLCBLb25xdWVyb3IoImtmbSIpKQorICAgIGVsaWYgX2lzY29tbWFuZCgia29ucXVlcm9yIik6CisgICAgICAgIHJlZ2lzdGVyKCJrb25xdWVyb3IiLCBLb25xdWVyb3IsIEtvbnF1ZXJvcigia29ucXVlcm9yIikpCisKKyAgICAjIEdub21lJ3MgR2FsZW9uIGFuZCBFcGlwaGFueQorICAgIGZvciBicm93c2VyIGluICgiZ2FsZW9uIiwgImVwaXBoYW55Iik6CisgICAgICAgIGlmIF9pc2NvbW1hbmQoYnJvd3Nlcik6CisgICAgICAgICAgICByZWdpc3Rlcihicm93c2VyLCBOb25lLCBHYWxlb24oYnJvd3NlcikpCisKKyAgICAjIFNraXBzdG9uZSwgYW5vdGhlciBHdGsvTW96aWxsYSBiYXNlZCBicm93c2VyCisgICAgaWYgX2lzY29tbWFuZCgic2tpcHN0b25lIik6CisgICAgICAgIHJlZ2lzdGVyKCJza2lwc3RvbmUiLCBOb25lLCBCYWNrZ3JvdW5kQnJvd3Nlcigic2tpcHN0b25lIikpCisKKyAgICAjIEdvb2dsZSBDaHJvbWUvQ2hyb21pdW0gYnJvd3NlcnMKKyAgICBmb3IgYnJvd3NlciBpbiAoImdvb2dsZS1jaHJvbWUiLCAiY2hyb21lIiwgImNocm9taXVtIiwgImNocm9taXVtLWJyb3dzZXIiKToKKyAgICAgICAgaWYgX2lzY29tbWFuZChicm93c2VyKToKKyAgICAgICAgICAgIHJlZ2lzdGVyKGJyb3dzZXIsIE5vbmUsIENocm9tZShicm93c2VyKSkKKworICAgICMgT3BlcmEsIHF1aXRlIHBvcHVsYXIKKyAgICBpZiBfaXNjb21tYW5kKCJvcGVyYSIpOgorICAgICAgICByZWdpc3Rlcigib3BlcmEiLCBOb25lLCBPcGVyYSgib3BlcmEiKSkKKworICAgICMgTmV4dCwgTW9zYWljIC0tIG9sZCBidXQgc3RpbGwgaW4gdXNlLgorICAgIGlmIF9pc2NvbW1hbmQoIm1vc2FpYyIpOgorICAgICAgICByZWdpc3RlcigibW9zYWljIiwgTm9uZSwgQmFja2dyb3VuZEJyb3dzZXIoIm1vc2FpYyIpKQorCisgICAgIyBHcmFpbCwgdGhlIFB5dGhvbiBicm93c2VyLiBEb2VzIGFueWJvZHkgc3RpbGwgdXNlIGl0PworICAgIGlmIF9pc2NvbW1hbmQoImdyYWlsIik6CisgICAgICAgIHJlZ2lzdGVyKCJncmFpbCIsIEdyYWlsLCBOb25lKQorCisjIFByZWZlciBYIGJyb3dzZXJzIGlmIHByZXNlbnQKK2lmIG9zLmVudmlyb24uZ2V0KCJESVNQTEFZIik6CisgICAgcmVnaXN0ZXJfWF9icm93c2VycygpCisKKyMgQWxzbyB0cnkgY29uc29sZSBicm93c2VycworaWYgb3MuZW52aXJvbi5nZXQoIlRFUk0iKToKKyAgICBpZiBfaXNjb21tYW5kKCJ3d3ctYnJvd3NlciIpOgorICAgICAgICByZWdpc3Rlcigid3d3LWJyb3dzZXIiLCBOb25lLCBHZW5lcmljQnJvd3Nlcigid3d3LWJyb3dzZXIiKSkKKyAgICAjIFRoZSBMaW5rcy9lbGlua3MgYnJvd3NlcnMgPGh0dHA6Ly9hcnRheC5rYXJsaW4ubWZmLmN1bmkuY3ovfm1pa3VsYXMvbGlua3MvPgorICAgIGlmIF9pc2NvbW1hbmQoImxpbmtzIik6CisgICAgICAgIHJlZ2lzdGVyKCJsaW5rcyIsIE5vbmUsIEdlbmVyaWNCcm93c2VyKCJsaW5rcyIpKQorICAgIGlmIF9pc2NvbW1hbmQoImVsaW5rcyIpOgorICAgICAgICByZWdpc3RlcigiZWxpbmtzIiwgTm9uZSwgRWxpbmtzKCJlbGlua3MiKSkKKyAgICAjIFRoZSBMeW54IGJyb3dzZXIgPGh0dHA6Ly9seW54LmlzYy5vcmcvPiwgPGh0dHA6Ly9seW54LmJyb3dzZXIub3JnLz4KKyAgICBpZiBfaXNjb21tYW5kKCJseW54Iik6CisgICAgICAgIHJlZ2lzdGVyKCJseW54IiwgTm9uZSwgR2VuZXJpY0Jyb3dzZXIoImx5bngiKSkKKyAgICAjIFRoZSB3M20gYnJvd3NlciA8aHR0cDovL3czbS5zb3VyY2Vmb3JnZS5uZXQvPgorICAgIGlmIF9pc2NvbW1hbmQoInczbSIpOgorICAgICAgICByZWdpc3RlcigidzNtIiwgTm9uZSwgR2VuZXJpY0Jyb3dzZXIoInczbSIpKQorCisjCisjIFBsYXRmb3JtIHN1cHBvcnQgZm9yIFdpbmRvd3MKKyMKKworaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAid2luIjoKKyAgICBjbGFzcyBXaW5kb3dzRGVmYXVsdChCYXNlQnJvd3Nlcik6CisgICAgICAgIGRlZiBvcGVuKHNlbGYsIHVybCwgbmV3PTAsIGF1dG9yYWlzZT1UcnVlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5zdGFydGZpbGUodXJsKQorICAgICAgICAgICAgZXhjZXB0IFdpbmRvd3NFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFtFcnJvciAyMl0gTm8gYXBwbGljYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICAjIGZpbGUgZm9yIHRoaXMgb3BlcmF0aW9uOiAnPFVSTD4nCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBfdHJ5b3JkZXIgPSBbXQorICAgIF9icm93c2VycyA9IHt9CisKKyAgICAjIEZpcnN0IHRyeSB0byB1c2UgdGhlIGRlZmF1bHQgV2luZG93cyBicm93c2VyCisgICAgcmVnaXN0ZXIoIndpbmRvd3MtZGVmYXVsdCIsIFdpbmRvd3NEZWZhdWx0KQorCisgICAgIyBEZXRlY3Qgc29tZSBjb21tb24gV2luZG93cyBicm93c2VycywgZmFsbGJhY2sgdG8gSUUKKyAgICBpZXhwbG9yZSA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uLmdldCgiUFJPR1JBTUZJTEVTIiwgIkM6XFxQcm9ncmFtIEZpbGVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmV0IEV4cGxvcmVyXFxJRVhQTE9SRS5FWEUiKQorICAgIGZvciBicm93c2VyIGluICgiZmlyZWZveCIsICJmaXJlYmlyZCIsICJzZWFtb25rZXkiLCAibW96aWxsYSIsCisgICAgICAgICAgICAgICAgICAgICJuZXRzY2FwZSIsICJvcGVyYSIsIGlleHBsb3JlKToKKyAgICAgICAgaWYgX2lzY29tbWFuZChicm93c2VyKToKKyAgICAgICAgICAgIHJlZ2lzdGVyKGJyb3dzZXIsIE5vbmUsIEJhY2tncm91bmRCcm93c2VyKGJyb3dzZXIpKQorCisjCisjIFBsYXRmb3JtIHN1cHBvcnQgZm9yIE1hY09TCisjCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAjIEFkYXB0ZWQgZnJvbSBwYXRjaCBzdWJtaXR0ZWQgdG8gU291cmNlRm9yZ2UgYnkgU3RldmVuIEouIEJ1cnIKKyAgICBjbGFzcyBNYWNPU1goQmFzZUJyb3dzZXIpOgorICAgICAgICAiIiJMYXVuY2hlciBjbGFzcyBmb3IgQXF1YSBicm93c2VycyBvbiBNYWMgT1MgWAorCisgICAgICAgIE9wdGlvbmFsbHkgc3BlY2lmeSBhIGJyb3dzZXIgbmFtZSBvbiBpbnN0YW50aWF0aW9uLiAgTm90ZSB0aGF0IHRoaXMKKyAgICAgICAgd2lsbCBub3Qgd29yayBmb3IgQXF1YSBicm93c2VycyBpZiB0aGUgdXNlciBoYXMgbW92ZWQgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgIHBhY2thZ2UgYWZ0ZXIgaW5zdGFsbGF0aW9uLgorCisgICAgICAgIElmIG5vIGJyb3dzZXIgaXMgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBicm93c2VyLCBhcyBzcGVjaWZpZWQgaW4gdGhlCisgICAgICAgIEludGVybmV0IFN5c3RlbSBQcmVmZXJlbmNlcyBwYW5lbCwgd2lsbCBiZSB1c2VkLgorICAgICAgICAiIiIKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorCisgICAgICAgIGRlZiBvcGVuKHNlbGYsIHVybCwgbmV3PTAsIGF1dG9yYWlzZT1UcnVlKToKKyAgICAgICAgICAgIGFzc2VydCAiJyIgbm90IGluIHVybAorICAgICAgICAgICAgIyBoYWNrIGZvciBsb2NhbCB1cmxzCisgICAgICAgICAgICBpZiBub3QgJzonIGluIHVybDoKKyAgICAgICAgICAgICAgICB1cmwgPSAnZmlsZTonK3VybAorCisgICAgICAgICAgICAjIG5ldyBtdXN0IGJlIDAgb3IgMQorICAgICAgICAgICAgbmV3ID0gaW50KGJvb2wobmV3KSkKKyAgICAgICAgICAgIGlmIHNlbGYubmFtZSA9PSAiZGVmYXVsdCI6CisgICAgICAgICAgICAgICAgIyBVc2VyIGNhbGxlZCBvcGVuLCBvcGVuX25ldyBvciBnZXQgd2l0aG91dCBhIGJyb3dzZXIgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgc2NyaXB0ID0gJ29wZW4gbG9jYXRpb24gIiVzIicgJSB1cmwucmVwbGFjZSgnIicsICclMjInKSAjIG9wZW5zIGluIGRlZmF1bHQgYnJvd3NlcgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFVzZXIgY2FsbGVkIGdldCBhbmQgY2hvc2UgYSBicm93c2VyCisgICAgICAgICAgICAgICAgaWYgc2VsZi5uYW1lID09ICJPbW5pV2ViIjoKKyAgICAgICAgICAgICAgICAgICAgdG9XaW5kb3cgPSAiIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgSW5jbHVkZSB0b1dpbmRvdyBwYXJhbWV0ZXIgb2YgT3BlblVSTCBjb21tYW5kIGZvciBicm93c2VycworICAgICAgICAgICAgICAgICAgICAjIHRoYXQgc3VwcG9ydCBpdC4gIDAgPT0gbmV3IHdpbmRvdzsgLTEgPT0gZXhpc3RpbmcKKyAgICAgICAgICAgICAgICAgICAgdG9XaW5kb3cgPSAidG9XaW5kb3cgJWQiICUgKG5ldyAtIDEpCisgICAgICAgICAgICAgICAgY21kID0gJ09wZW5VUkwgIiVzIicgJSB1cmwucmVwbGFjZSgnIicsICclMjInKQorICAgICAgICAgICAgICAgIHNjcmlwdCA9ICcnJ3RlbGwgYXBwbGljYXRpb24gIiVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlcyAlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCB0ZWxsJycnICUgKHNlbGYubmFtZSwgY21kLCB0b1dpbmRvdykKKyAgICAgICAgICAgICMgT3BlbiBwaXBlIHRvIEFwcGxlU2NyaXB0IHRocm91Z2ggb3Nhc2NyaXB0IGNvbW1hbmQKKyAgICAgICAgICAgIG9zYXBpcGUgPSBvcy5wb3Blbigib3Nhc2NyaXB0IiwgInciKQorICAgICAgICAgICAgaWYgb3NhcGlwZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgIyBXcml0ZSBzY3JpcHQgdG8gb3Nhc2NyaXB0J3Mgc3RkaW4KKyAgICAgICAgICAgIG9zYXBpcGUud3JpdGUoc2NyaXB0KQorICAgICAgICAgICAgcmMgPSBvc2FwaXBlLmNsb3NlKCkKKyAgICAgICAgICAgIHJldHVybiBub3QgcmMKKworICAgIGNsYXNzIE1hY09TWE9TQVNjcmlwdChCYXNlQnJvd3Nlcik6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCisKKyAgICAgICAgZGVmIG9wZW4oc2VsZiwgdXJsLCBuZXc9MCwgYXV0b3JhaXNlPVRydWUpOgorICAgICAgICAgICAgaWYgc2VsZi5fbmFtZSA9PSAnZGVmYXVsdCc6CisgICAgICAgICAgICAgICAgc2NyaXB0ID0gJ29wZW4gbG9jYXRpb24gIiVzIicgJSB1cmwucmVwbGFjZSgnIicsICclMjInKSAjIG9wZW5zIGluIGRlZmF1bHQgYnJvd3NlcgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzY3JpcHQgPSAnJycKKyAgICAgICAgICAgICAgICAgICB0ZWxsIGFwcGxpY2F0aW9uICIlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgb3BlbiBsb2NhdGlvbiAiJXMiCisgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgICAgICAgICAgJycnJShzZWxmLl9uYW1lLCB1cmwucmVwbGFjZSgnIicsICclMjInKSkKKworICAgICAgICAgICAgb3NhcGlwZSA9IG9zLnBvcGVuKCJvc2FzY3JpcHQiLCAidyIpCisgICAgICAgICAgICBpZiBvc2FwaXBlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgICAgIG9zYXBpcGUud3JpdGUoc2NyaXB0KQorICAgICAgICAgICAgcmMgPSBvc2FwaXBlLmNsb3NlKCkKKyAgICAgICAgICAgIHJldHVybiBub3QgcmMKKworCisgICAgIyBEb24ndCBjbGVhciBfdHJ5b3JkZXIgb3IgX2Jyb3dzZXJzIHNpbmNlIE9TIFggY2FuIHVzZSBhYm92ZSBVbml4IHN1cHBvcnQKKyAgICAjIChidXQgd2UgcHJlZmVyIHVzaW5nIHRoZSBPUyBYIHNwZWNpZmljIHN0dWZmKQorICAgIHJlZ2lzdGVyKCJzYWZhcmkiLCBOb25lLCBNYWNPU1hPU0FTY3JpcHQoJ3NhZmFyaScpLCAtMSkKKyAgICByZWdpc3RlcigiZmlyZWZveCIsIE5vbmUsIE1hY09TWE9TQVNjcmlwdCgnZmlyZWZveCcpLCAtMSkKKyAgICByZWdpc3RlcigiTWFjT1NYIiwgTm9uZSwgTWFjT1NYT1NBU2NyaXB0KCdkZWZhdWx0JyksIC0xKQorCisKKyMKKyMgUGxhdGZvcm0gc3VwcG9ydCBmb3IgT1MvMgorIworCitpZiBzeXMucGxhdGZvcm1bOjNdID09ICJvczIiIGFuZCBfaXNjb21tYW5kKCJuZXRzY2FwZSIpOgorICAgIF90cnlvcmRlciA9IFtdCisgICAgX2Jyb3dzZXJzID0ge30KKyAgICByZWdpc3Rlcigib3MybmV0c2NhcGUiLCBOb25lLAorICAgICAgICAgICAgIEdlbmVyaWNCcm93c2VyKFsic3RhcnQiLCAibmV0c2NhcGUiLCAiJXMiXSksIC0xKQorCisKKyMgT0ssIG5vdyB0aGF0IHdlIGtub3cgd2hhdCB0aGUgZGVmYXVsdCBwcmVmZXJlbmNlIG9yZGVycyBmb3IgZWFjaAorIyBwbGF0Zm9ybSBhcmUsIGFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgdGhlbSB3aXRoIHRoZSBCUk9XU0VSIHZhcmlhYmxlLgoraWYgIkJST1dTRVIiIGluIG9zLmVudmlyb246CisgICAgX3VzZXJjaG9pY2VzID0gb3MuZW52aXJvblsiQlJPV1NFUiJdLnNwbGl0KG9zLnBhdGhzZXApCisgICAgX3VzZXJjaG9pY2VzLnJldmVyc2UoKQorCisgICAgIyBUcmVhdCBjaG9pY2VzIGluIHNhbWUgd2F5IGFzIGlmIHBhc3NlZCBpbnRvIGdldCgpIGJ1dCBkbyByZWdpc3RlcgorICAgICMgYW5kIHByZXBlbmQgdG8gX3RyeW9yZGVyCisgICAgZm9yIGNtZGxpbmUgaW4gX3VzZXJjaG9pY2VzOgorICAgICAgICBpZiBjbWRsaW5lICE9ICcnOgorICAgICAgICAgICAgY21kID0gX3N5bnRoZXNpemUoY21kbGluZSwgLTEpCisgICAgICAgICAgICBpZiBjbWRbMV0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZWdpc3RlcihjbWRsaW5lLCBOb25lLCBHZW5lcmljQnJvd3NlcihjbWRsaW5lKSwgLTEpCisgICAgY21kbGluZSA9IE5vbmUgIyB0byBtYWtlIGRlbCB3b3JrIGlmIF91c2VyY2hvaWNlcyB3YXMgZW1wdHkKKyAgICBkZWwgY21kbGluZQorICAgIGRlbCBfdXNlcmNob2ljZXMKKworIyB3aGF0IHRvIGRvIGlmIF90cnlvcmRlciBpcyBub3cgZW1wdHk/CisKKworZGVmIG1haW4oKToKKyAgICBpbXBvcnQgZ2V0b3B0CisgICAgdXNhZ2UgPSAiIiJVc2FnZTogJXMgWy1uIHwgLXRdIHVybAorICAgIC1uOiBvcGVuIG5ldyB3aW5kb3cKKyAgICAtdDogb3BlbiBuZXcgdGFiIiIiICUgc3lzLmFyZ3ZbMF0KKyAgICB0cnk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ250ZCcpCisgICAgZXhjZXB0IGdldG9wdC5lcnJvciwgbXNnOgorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsIG1zZworICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsIHVzYWdlCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgbmV3X3dpbiA9IDAKKyAgICBmb3IgbywgYSBpbiBvcHRzOgorICAgICAgICBpZiBvID09ICctbic6IG5ld193aW4gPSAxCisgICAgICAgIGVsaWYgbyA9PSAnLXQnOiBuZXdfd2luID0gMgorICAgIGlmIGxlbihhcmdzKSAhPSAxOgorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsIHVzYWdlCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICB1cmwgPSBhcmdzWzBdCisgICAgb3Blbih1cmwsIG5ld193aW4pCisKKyAgICBwcmludCAiXGEiCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3dlYmJyb3dzZXIucHljIGIvbGliL3B5dGhvbjIuNy93ZWJicm93c2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA2OGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93ZWJicm93c2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3dlYmJyb3dzZXIucHlvIGIvbGliL3B5dGhvbjIuNy93ZWJicm93c2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGFlMzAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93ZWJicm93c2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3doaWNoZGIucHkgYi9saWIvcHl0aG9uMi43L3doaWNoZGIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3MTQzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd2hpY2hkYi5weQpAQCAtMCwwICsxLDExNyBAQAorIyAhL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiR3Vlc3Mgd2hpY2ggZGIgcGFja2FnZSB0byB1c2UgdG8gb3BlbiBhIGRiIGZpbGUuIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN0cnVjdAoraW1wb3J0IHN5cworCit0cnk6CisgICAgaW1wb3J0IGRibQorICAgIF9kYm1lcnJvciA9IGRibS5lcnJvcgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGRibSA9IE5vbmUKKyAgICAjIGp1c3Qgc29tZSBzb3J0IG9mIHZhbGlkIGV4Y2VwdGlvbiB3aGljaCBtaWdodCBiZSByYWlzZWQgaW4gdGhlCisgICAgIyBkYm0gdGVzdAorICAgIF9kYm1lcnJvciA9IElPRXJyb3IKKworZGVmIHdoaWNoZGIoZmlsZW5hbWUpOgorICAgICIiIkd1ZXNzIHdoaWNoIGRiIHBhY2thZ2UgdG8gdXNlIHRvIG9wZW4gYSBkYiBmaWxlLgorCisgICAgUmV0dXJuIHZhbHVlczoKKworICAgIC0gTm9uZSBpZiB0aGUgZGF0YWJhc2UgZmlsZSBjYW4ndCBiZSByZWFkOworICAgIC0gZW1wdHkgc3RyaW5nIGlmIHRoZSBmaWxlIGNhbiBiZSByZWFkIGJ1dCBjYW4ndCBiZSByZWNvZ25pemVkCisgICAgLSB0aGUgbW9kdWxlIG5hbWUgKGUuZy4gImRibSIgb3IgImdkYm0iKSBpZiByZWNvZ25pemVkLgorCisgICAgSW1wb3J0aW5nIHRoZSBnaXZlbiBtb2R1bGUgbWF5IHN0aWxsIGZhaWwsIGFuZCBvcGVuaW5nIHRoZQorICAgIGRhdGFiYXNlIHVzaW5nIHRoYXQgbW9kdWxlIG1heSBzdGlsbCBmYWlsLgorICAgICIiIgorCisgICAgIyBDaGVjayBmb3IgZGJtIGZpcnN0IC0tIHRoaXMgaGFzIGEgLnBhZyBhbmQgYSAuZGlyIGZpbGUKKyAgICB0cnk6CisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lICsgb3MuZXh0c2VwICsgInBhZyIsICJyYiIpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAjIGRibSBsaW5rZWQgd2l0aCBnZGJtIG9uIE9TLzIgZG9lc24ndCBoYXZlIC5kaXIgZmlsZQorICAgICAgICBpZiBub3QgKGRibS5saWJyYXJ5ID09ICJHTlUgZ2RibSIgYW5kIHN5cy5wbGF0Zm9ybSA9PSAib3MyZW14Iik6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSArIG9zLmV4dHNlcCArICJkaXIiLCAicmIiKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHJldHVybiAiZGJtIgorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAjIHNvbWUgZGJtIGVtdWxhdGlvbnMgYmFzZWQgb24gQmVya2VsZXkgREIgZ2VuZXJhdGUgYSAuZGIgZmlsZQorICAgICAgICAjIHNvbWUgZG8gbm90LCBidXQgdGhleSBzaG91bGQgYmUgY2F1Z2h0IGJ5IHRoZSBkYmhhc2ggY2hlY2tzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lICsgb3MuZXh0c2VwICsgImRiIiwgInJiIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgIyBndWFyYW50ZWUgd2UgY2FuIGFjdHVhbGx5IG9wZW4gdGhlIGZpbGUgdXNpbmcgZGJtCisgICAgICAgICAgICAjIGtpbmQgb2Ygb3ZlcmtpbGwsIGJ1dCBzaW5jZSB3ZSBhcmUgZGVhbGluZyB3aXRoIGVtdWxhdGlvbnMKKyAgICAgICAgICAgICMgaXQgc2VlbXMgbGlrZSBhIHBydWRlbnQgc3RlcAorICAgICAgICAgICAgaWYgZGJtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGQgPSBkYm0ub3BlbihmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBkLmNsb3NlKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gImRibSIKKyAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBfZGJtZXJyb3IpOgorICAgICAgICAgICAgcGFzcworCisgICAgIyBDaGVjayBmb3IgZHVtYmRibSBuZXh0IC0tIHRoaXMgaGFzIGEgLmRpciBhbmQgYSAuZGF0IGZpbGUKKyAgICB0cnk6CisgICAgICAgICMgRmlyc3QgY2hlY2sgZm9yIHByZXNlbmNlIG9mIGZpbGVzCisgICAgICAgIG9zLnN0YXQoZmlsZW5hbWUgKyBvcy5leHRzZXAgKyAiZGF0IikKKyAgICAgICAgc2l6ZSA9IG9zLnN0YXQoZmlsZW5hbWUgKyBvcy5leHRzZXAgKyAiZGlyIikuc3Rfc2l6ZQorICAgICAgICAjIGR1bWJkYm0gZmlsZXMgd2l0aCBubyBrZXlzIGFyZSBlbXB0eQorICAgICAgICBpZiBzaXplID09IDA6CisgICAgICAgICAgICByZXR1cm4gImR1bWJkYm0iCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lICsgb3MuZXh0c2VwICsgImRpciIsICJyYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGYucmVhZCgxKSBpbiAoIiciLCAnIicpOgorICAgICAgICAgICAgICAgIHJldHVybiAiZHVtYmRibSIKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CisgICAgICAgIHBhc3MKKworICAgICMgU2VlIGlmIHRoZSBmaWxlIGV4aXN0cywgcmV0dXJuIE5vbmUgaWYgbm90CisgICAgdHJ5OgorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgInJiIikKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgUmVhZCB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgLS0gdGhlIG1hZ2ljIG51bWJlcgorICAgIHMxNiA9IGYucmVhZCgxNikKKyAgICBmLmNsb3NlKCkKKyAgICBzID0gczE2WzA6NF0KKworICAgICMgUmV0dXJuICIiIGlmIG5vdCBhdCBsZWFzdCA0IGJ5dGVzCisgICAgaWYgbGVuKHMpICE9IDQ6CisgICAgICAgIHJldHVybiAiIgorCisgICAgIyBDb252ZXJ0IHRvIDQtYnl0ZSBpbnQgaW4gbmF0aXZlIGJ5dGUgb3JkZXIgLS0gcmV0dXJuICIiIGlmIGltcG9zc2libGUKKyAgICB0cnk6CisgICAgICAgIChtYWdpYywpID0gc3RydWN0LnVucGFjaygiPWwiLCBzKQorICAgIGV4Y2VwdCBzdHJ1Y3QuZXJyb3I6CisgICAgICAgIHJldHVybiAiIgorCisgICAgIyBDaGVjayBmb3IgR05VIGRibQorICAgIGlmIG1hZ2ljIGluICgweDEzNTc5YWNlLCAweDEzNTc5YWNkLCAweDEzNTc5YWNmKToKKyAgICAgICAgcmV0dXJuICJnZGJtIgorCisgICAgIyBDaGVjayBmb3Igb2xkIEJlcmtlbGV5IGRiIGhhc2ggZmlsZSBmb3JtYXQgdjIKKyAgICBpZiBtYWdpYyBpbiAoMHgwMDA2MTU2MSwgMHg2MTE1MDYwMCk6CisgICAgICAgIHJldHVybiAiYnNkZGIxODUiCisKKyAgICAjIExhdGVyIHZlcnNpb25zIG9mIEJlcmtlbGV5IGRiIGhhc2ggZmlsZSBoYXZlIGEgMTItYnl0ZSBwYWQgaW4KKyAgICAjIGZyb250IG9mIHRoZSBmaWxlIHR5cGUKKyAgICB0cnk6CisgICAgICAgIChtYWdpYywpID0gc3RydWN0LnVucGFjaygiPWwiLCBzMTZbLTQ6XSkKKyAgICBleGNlcHQgc3RydWN0LmVycm9yOgorICAgICAgICByZXR1cm4gIiIKKworICAgICMgQ2hlY2sgZm9yIEJTRCBoYXNoCisgICAgaWYgbWFnaWMgaW4gKDB4MDAwNjE1NjEsIDB4NjExNTA2MDApOgorICAgICAgICByZXR1cm4gImRiaGFzaCIKKworICAgICMgVW5rbm93bgorICAgIHJldHVybiAiIgorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGZvciBmaWxlbmFtZSBpbiBzeXMuYXJndlsxOl06CisgICAgICAgIHByaW50IHdoaWNoZGIoZmlsZW5hbWUpIG9yICJVTktOT1dOIiwgZmlsZW5hbWUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd2hpY2hkYi5weWMgYi9saWIvcHl0aG9uMi43L3doaWNoZGIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2JkZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3doaWNoZGIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd2hpY2hkYi5weW8gYi9saWIvcHl0aG9uMi43L3doaWNoZGIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2JkZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3doaWNoZGIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi5lZ2ctaW5mbyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi5lZ2ctaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGI3ODkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmLmVnZy1pbmZvCkBAIC0wLDAgKzEsOCBAQAorTWV0YWRhdGEtVmVyc2lvbjogMS4wCitOYW1lOiB3c2dpcmVmCitWZXJzaW9uOiAwLjEuMgorU3VtbWFyeTogV1NHSSAoUEVQIDMzMykgUmVmZXJlbmNlIExpYnJhcnkKK0F1dGhvcjogUGhpbGxpcCBKLiBFYnkKK0F1dGhvci1lbWFpbDogd2ViLXNpZ0BweXRob24ub3JnCitMaWNlbnNlOiBQU0Ygb3IgWlBMCitQbGF0Zm9ybTogVU5LTk9XTgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YzU3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvX19pbml0X18ucHkKQEAgLTAsMCArMSwyMyBAQAorIiIid3NnaXJlZiAtLSBhIFdTR0kgKFBFUCAzMzMpIFJlZmVyZW5jZSBMaWJyYXJ5CisKK0N1cnJlbnQgQ29udGVudHM6CisKKyogdXRpbCAtLSBNaXNjZWxsYW5lb3VzIHVzZWZ1bCBmdW5jdGlvbnMgYW5kIHdyYXBwZXJzCisKKyogaGVhZGVycyAtLSBNYW5hZ2UgcmVzcG9uc2UgaGVhZGVycworCisqIGhhbmRsZXJzIC0tIGJhc2UgY2xhc3NlcyBmb3Igc2VydmVyL2dhdGV3YXkgaW1wbGVtZW50YXRpb25zCisKKyogc2ltcGxlX3NlcnZlciAtLSBhIHNpbXBsZSBCYXNlSFRUUFNlcnZlciB0aGF0IHN1cHBvcnRzIFdTR0kKKworKiB2YWxpZGF0ZSAtLSB2YWxpZGF0aW9uIHdyYXBwZXIgdGhhdCBzaXRzIGJldHdlZW4gYW4gYXBwIGFuZCBhIHNlcnZlcgorICB0byBkZXRlY3QgZXJyb3JzIGluIGVpdGhlcgorCitUby1EbzoKKworKiBjZ2lfZ2F0ZXdheSAtLSBSdW4gV1NHSSBhcHBzIHVuZGVyIENHSSAocGVuZGluZyBhIGRlcGxveW1lbnQgc3RhbmRhcmQpCisKKyogY2dpX3dyYXBwZXIgLS0gUnVuIENHSSBhcHBzIHVuZGVyIFdTR0kKKworKiByb3V0ZXIgLS0gYSBzaW1wbGUgbWlkZGxld2FyZSBjb21wb25lbnQgdGhhdCBoYW5kbGVzIFVSTCB0cmF2ZXJzYWwKKyIiIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyZDY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyZDY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hhbmRsZXJzLnB5IGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hhbmRsZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYjU3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvaGFuZGxlcnMucHkKQEAgLTAsMCArMSw0NTAgQEAKKyIiIkJhc2UgY2xhc3NlcyBmb3Igc2VydmVyL2dhdGV3YXkgaW1wbGVtZW50YXRpb25zIiIiCisKK2Zyb20gdHlwZXMgaW1wb3J0IFN0cmluZ1R5cGUKK2Zyb20gdXRpbCBpbXBvcnQgRmlsZVdyYXBwZXIsIGd1ZXNzX3NjaGVtZSwgaXNfaG9wX2J5X2hvcAorZnJvbSBoZWFkZXJzIGltcG9ydCBIZWFkZXJzCisKK2ltcG9ydCBzeXMsIG9zLCB0aW1lCisKK19fYWxsX18gPSBbJ0Jhc2VIYW5kbGVyJywgJ1NpbXBsZUhhbmRsZXInLCAnQmFzZUNHSUhhbmRsZXInLCAnQ0dJSGFuZGxlciddCisKK3RyeToKKyAgICBkaWN0CitleGNlcHQgTmFtZUVycm9yOgorICAgIGRlZiBkaWN0KGl0ZW1zKToKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGZvciBrLHYgaW4gaXRlbXM6CisgICAgICAgICAgICBkW2tdID0gdgorICAgICAgICByZXR1cm4gZAorCisjIFVuY29tbWVudCBmb3IgMi4yIGNvbXBhdGliaWxpdHkuCisjdHJ5OgorIyAgICBUcnVlCisjICAgIEZhbHNlCisjZXhjZXB0IE5hbWVFcnJvcjoKKyMgICAgVHJ1ZSA9IG5vdCBOb25lCisjICAgIEZhbHNlID0gbm90IFRydWUKKworCisjIFdlZWtkYXkgYW5kIG1vbnRoIG5hbWVzIGZvciBIVFRQIGRhdGUvdGltZSBmb3JtYXR0aW5nOyBhbHdheXMgRW5nbGlzaCEKK193ZWVrZGF5bmFtZSA9IFsiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiLCAiU3VuIl0KK19tb250aG5hbWUgPSBbTm9uZSwgIyBEdW1teSBzbyB3ZSBjYW4gdXNlIDEtYmFzZWQgbW9udGggbnVtYmVycworICAgICAgICAgICAgICAiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLAorICAgICAgICAgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiXQorCitkZWYgZm9ybWF0X2RhdGVfdGltZSh0aW1lc3RhbXApOgorICAgIHllYXIsIG1vbnRoLCBkYXksIGhoLCBtbSwgc3MsIHdkLCB5LCB6ID0gdGltZS5nbXRpbWUodGltZXN0YW1wKQorICAgIHJldHVybiAiJXMsICUwMmQgJTNzICU0ZCAlMDJkOiUwMmQ6JTAyZCBHTVQiICUgKAorICAgICAgICBfd2Vla2RheW5hbWVbd2RdLCBkYXksIF9tb250aG5hbWVbbW9udGhdLCB5ZWFyLCBoaCwgbW0sIHNzCisgICAgKQorCisKK2NsYXNzIEJhc2VIYW5kbGVyOgorICAgICIiIk1hbmFnZSB0aGUgaW52b2NhdGlvbiBvZiBhIFdTR0kgYXBwbGljYXRpb24iIiIKKworICAgICMgQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOyBjYW4gb3ZlcnJpZGUgcGVyLXN1YmNsYXNzIG9yIHBlci1pbnN0YW5jZQorICAgIHdzZ2lfdmVyc2lvbiA9ICgxLDApCisgICAgd3NnaV9tdWx0aXRocmVhZCA9IFRydWUKKyAgICB3c2dpX211bHRpcHJvY2VzcyA9IFRydWUKKyAgICB3c2dpX3J1bl9vbmNlID0gRmFsc2UKKworICAgIG9yaWdpbl9zZXJ2ZXIgPSBUcnVlICAgICMgV2UgYXJlIHRyYW5zbWl0dGluZyBkaXJlY3QgdG8gY2xpZW50CisgICAgaHR0cF92ZXJzaW9uICA9ICIxLjAiICAgIyBWZXJzaW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlc3BvbnNlCisgICAgc2VydmVyX3NvZnR3YXJlID0gTm9uZSAgIyBTdHJpbmcgbmFtZSBvZiBzZXJ2ZXIgc29mdHdhcmUsIGlmIGFueQorCisgICAgIyBvc19lbnZpcm9uIGlzIHVzZWQgdG8gc3VwcGx5IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgT1MgZW52aXJvbm1lbnQ6CisgICAgIyBieSBkZWZhdWx0IGl0J3MgYSBjb3B5IG9mICdvcy5lbnZpcm9uJyBhcyBvZiBpbXBvcnQgdGltZSwgYnV0IHlvdSBjYW4KKyAgICAjIG92ZXJyaWRlIHRoaXMgaW4gZS5nLiB5b3VyIF9faW5pdF9fIG1ldGhvZC4KKyAgICBvc19lbnZpcm9uID0gZGljdChvcy5lbnZpcm9uLml0ZW1zKCkpCisKKyAgICAjIENvbGxhYm9yYXRvciBjbGFzc2VzCisgICAgd3NnaV9maWxlX3dyYXBwZXIgPSBGaWxlV3JhcHBlciAgICAgIyBzZXQgdG8gTm9uZSB0byBkaXNhYmxlCisgICAgaGVhZGVyc19jbGFzcyA9IEhlYWRlcnMgICAgICAgICAgICAgIyBtdXN0IGJlIGEgSGVhZGVycy1saWtlIGNsYXNzCisKKyAgICAjIEVycm9yIGhhbmRsaW5nIChhbHNvIHBlci1zdWJjbGFzcyBvciBwZXItaW5zdGFuY2UpCisgICAgdHJhY2ViYWNrX2xpbWl0ID0gTm9uZSAgIyBQcmludCBlbnRpcmUgdHJhY2ViYWNrIHRvIHNlbGYuZ2V0X3N0ZGVycigpCisgICAgZXJyb3Jfc3RhdHVzID0gIjUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IiCisgICAgZXJyb3JfaGVhZGVycyA9IFsoJ0NvbnRlbnQtVHlwZScsJ3RleHQvcGxhaW4nKV0KKyAgICBlcnJvcl9ib2R5ID0gIkEgc2VydmVyIGVycm9yIG9jY3VycmVkLiAgUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuIgorCisgICAgIyBTdGF0ZSB2YXJpYWJsZXMgKGRvbid0IG1lc3Mgd2l0aCB0aGVzZSkKKyAgICBzdGF0dXMgPSByZXN1bHQgPSBOb25lCisgICAgaGVhZGVyc19zZW50ID0gRmFsc2UKKyAgICBoZWFkZXJzID0gTm9uZQorICAgIGJ5dGVzX3NlbnQgPSAwCisKKyAgICBkZWYgcnVuKHNlbGYsIGFwcGxpY2F0aW9uKToKKyAgICAgICAgIiIiSW52b2tlIHRoZSBhcHBsaWNhdGlvbiIiIgorICAgICAgICAjIE5vdGUgdG8gc2VsZjogZG9uJ3QgbW92ZSB0aGUgY2xvc2UoKSEgIEFzeW5jaHJvbm91cyBzZXJ2ZXJzIHNob3VsZG4ndAorICAgICAgICAjIGNhbGwgY2xvc2UoKSBmcm9tIGZpbmlzaF9yZXNwb25zZSgpLCBzbyBpZiB5b3UgY2xvc2UoKSBhbnl3aGVyZSBidXQKKyAgICAgICAgIyB0aGUgZG91YmxlLWVycm9yIGJyYW5jaCBoZXJlLCB5b3UnbGwgYnJlYWsgYXN5bmNocm9ub3VzIHNlcnZlcnMgYnkKKyAgICAgICAgIyBwcmVtYXR1cmVseSBjbG9zaW5nLiAgQXN5bmMgc2VydmVycyBtdXN0IHJldHVybiBmcm9tICdydW4oKScgd2l0aG91dAorICAgICAgICAjIGNsb3NpbmcgaWYgdGhlcmUgbWlnaHQgc3RpbGwgYmUgb3V0cHV0IHRvIGl0ZXJhdGUgb3Zlci4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXR1cF9lbnZpcm9uKCkKKyAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gYXBwbGljYXRpb24oc2VsZi5lbnZpcm9uLCBzZWxmLnN0YXJ0X3Jlc3BvbnNlKQorICAgICAgICAgICAgc2VsZi5maW5pc2hfcmVzcG9uc2UoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZXJyb3IoKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICMgSWYgd2UgZ2V0IGFuIGVycm9yIGhhbmRsaW5nIGFuIGVycm9yLCBqdXN0IGdpdmUgdXAgYWxyZWFkeSEKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICByYWlzZSAgICMgLi4uYW5kIGxldCB0aGUgYWN0dWFsIHNlcnZlciBmaWd1cmUgaXQgb3V0LgorCisKKyAgICBkZWYgc2V0dXBfZW52aXJvbihzZWxmKToKKyAgICAgICAgIiIiU2V0IHVwIHRoZSBlbnZpcm9ubWVudCBmb3Igb25lIHJlcXVlc3QiIiIKKworICAgICAgICBlbnYgPSBzZWxmLmVudmlyb24gPSBzZWxmLm9zX2Vudmlyb24uY29weSgpCisgICAgICAgIHNlbGYuYWRkX2NnaV92YXJzKCkKKworICAgICAgICBlbnZbJ3dzZ2kuaW5wdXQnXSAgICAgICAgPSBzZWxmLmdldF9zdGRpbigpCisgICAgICAgIGVudlsnd3NnaS5lcnJvcnMnXSAgICAgICA9IHNlbGYuZ2V0X3N0ZGVycigpCisgICAgICAgIGVudlsnd3NnaS52ZXJzaW9uJ10gICAgICA9IHNlbGYud3NnaV92ZXJzaW9uCisgICAgICAgIGVudlsnd3NnaS5ydW5fb25jZSddICAgICA9IHNlbGYud3NnaV9ydW5fb25jZQorICAgICAgICBlbnZbJ3dzZ2kudXJsX3NjaGVtZSddICAgPSBzZWxmLmdldF9zY2hlbWUoKQorICAgICAgICBlbnZbJ3dzZ2kubXVsdGl0aHJlYWQnXSAgPSBzZWxmLndzZ2lfbXVsdGl0aHJlYWQKKyAgICAgICAgZW52Wyd3c2dpLm11bHRpcHJvY2VzcyddID0gc2VsZi53c2dpX211bHRpcHJvY2VzcworCisgICAgICAgIGlmIHNlbGYud3NnaV9maWxlX3dyYXBwZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBlbnZbJ3dzZ2kuZmlsZV93cmFwcGVyJ10gPSBzZWxmLndzZ2lfZmlsZV93cmFwcGVyCisKKyAgICAgICAgaWYgc2VsZi5vcmlnaW5fc2VydmVyIGFuZCBzZWxmLnNlcnZlcl9zb2Z0d2FyZToKKyAgICAgICAgICAgIGVudi5zZXRkZWZhdWx0KCdTRVJWRVJfU09GVFdBUkUnLHNlbGYuc2VydmVyX3NvZnR3YXJlKQorCisKKyAgICBkZWYgZmluaXNoX3Jlc3BvbnNlKHNlbGYpOgorICAgICAgICAiIiJTZW5kIGFueSBpdGVyYWJsZSBkYXRhLCB0aGVuIGNsb3NlIHNlbGYgYW5kIHRoZSBpdGVyYWJsZQorCisgICAgICAgIFN1YmNsYXNzZXMgaW50ZW5kZWQgZm9yIHVzZSBpbiBhc3luY2hyb25vdXMgc2VydmVycyB3aWxsCisgICAgICAgIHdhbnQgdG8gcmVkZWZpbmUgdGhpcyBtZXRob2QsIHN1Y2ggdGhhdCBpdCBzZXRzIHVwIGNhbGxiYWNrcworICAgICAgICBpbiB0aGUgZXZlbnQgbG9vcCB0byBpdGVyYXRlIG92ZXIgdGhlIGRhdGEsIGFuZCB0byBjYWxsCisgICAgICAgICdzZWxmLmNsb3NlKCknIG9uY2UgdGhlIHJlc3BvbnNlIGlzIGZpbmlzaGVkLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHNlbGYucmVzdWx0X2lzX2ZpbGUoKSBvciBub3Qgc2VsZi5zZW5kZmlsZSgpOgorICAgICAgICAgICAgICAgIGZvciBkYXRhIGluIHNlbGYucmVzdWx0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgc2VsZi5maW5pc2hfY29udGVudCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKworCisgICAgZGVmIGdldF9zY2hlbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgVVJMIHNjaGVtZSBiZWluZyB1c2VkIiIiCisgICAgICAgIHJldHVybiBndWVzc19zY2hlbWUoc2VsZi5lbnZpcm9uKQorCisKKyAgICBkZWYgc2V0X2NvbnRlbnRfbGVuZ3RoKHNlbGYpOgorICAgICAgICAiIiJDb21wdXRlIENvbnRlbnQtTGVuZ3RoIG9yIHN3aXRjaCB0byBjaHVua2VkIGVuY29kaW5nIGlmIHBvc3NpYmxlIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJsb2NrcyA9IGxlbihzZWxmLnJlc3VsdCkKKyAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsQXR0cmlidXRlRXJyb3IsTm90SW1wbGVtZW50ZWRFcnJvcik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBibG9ja3M9PTE6CisgICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gc3RyKHNlbGYuYnl0ZXNfc2VudCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBYWFggVHJ5IGZvciBjaHVua2VkIGVuY29kaW5nIGlmIG9yaWdpbiBzZXJ2ZXIgYW5kIGNsaWVudCBpcyAxLjEKKworCisgICAgZGVmIGNsZWFudXBfaGVhZGVycyhzZWxmKToKKyAgICAgICAgIiIiTWFrZSBhbnkgbmVjZXNzYXJ5IGhlYWRlciBjaGFuZ2VzIG9yIGRlZmF1bHRzCisKKyAgICAgICAgU3ViY2xhc3NlcyBjYW4gZXh0ZW5kIHRoaXMgdG8gYWRkIG90aGVyIGRlZmF1bHRzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgJ0NvbnRlbnQtTGVuZ3RoJyBub3QgaW4gc2VsZi5oZWFkZXJzOgorICAgICAgICAgICAgc2VsZi5zZXRfY29udGVudF9sZW5ndGgoKQorCisgICAgZGVmIHN0YXJ0X3Jlc3BvbnNlKHNlbGYsIHN0YXR1cywgaGVhZGVycyxleGNfaW5mbz1Ob25lKToKKyAgICAgICAgIiIiJ3N0YXJ0X3Jlc3BvbnNlKCknIGNhbGxhYmxlIGFzIHNwZWNpZmllZCBieSBQRVAgMzMzIiIiCisKKyAgICAgICAgaWYgZXhjX2luZm86CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5oZWFkZXJzX3NlbnQ6CisgICAgICAgICAgICAgICAgICAgICMgUmUtcmFpc2Ugb3JpZ2luYWwgZXhjZXB0aW9uIGlmIGhlYWRlcnMgc2VudAorICAgICAgICAgICAgICAgICAgICByYWlzZSBleGNfaW5mb1swXSwgZXhjX2luZm9bMV0sIGV4Y19pbmZvWzJdCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGV4Y19pbmZvID0gTm9uZSAgICAgICAgIyBhdm9pZCBkYW5nbGluZyBjaXJjdWxhciByZWYKKyAgICAgICAgZWxpZiBzZWxmLmhlYWRlcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiSGVhZGVycyBhbHJlYWR5IHNldCEiKQorCisgICAgICAgIGFzc2VydCB0eXBlKHN0YXR1cykgaXMgU3RyaW5nVHlwZSwiU3RhdHVzIG11c3QgYmUgYSBzdHJpbmciCisgICAgICAgIGFzc2VydCBsZW4oc3RhdHVzKT49NCwiU3RhdHVzIG11c3QgYmUgYXQgbGVhc3QgNCBjaGFyYWN0ZXJzIgorICAgICAgICBhc3NlcnQgaW50KHN0YXR1c1s6M10pLCJTdGF0dXMgbWVzc2FnZSBtdXN0IGJlZ2luIHcvMy1kaWdpdCBjb2RlIgorICAgICAgICBhc3NlcnQgc3RhdHVzWzNdPT0iICIsICJTdGF0dXMgbWVzc2FnZSBtdXN0IGhhdmUgYSBzcGFjZSBhZnRlciBjb2RlIgorICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICBmb3IgbmFtZSx2YWwgaW4gaGVhZGVyczoKKyAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZShuYW1lKSBpcyBTdHJpbmdUeXBlLCJIZWFkZXIgbmFtZXMgbXVzdCBiZSBzdHJpbmdzIgorICAgICAgICAgICAgICAgIGFzc2VydCB0eXBlKHZhbCkgaXMgU3RyaW5nVHlwZSwiSGVhZGVyIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MiCisgICAgICAgICAgICAgICAgYXNzZXJ0IG5vdCBpc19ob3BfYnlfaG9wKG5hbWUpLCJIb3AtYnktaG9wIGhlYWRlcnMgbm90IGFsbG93ZWQiCisgICAgICAgIHNlbGYuc3RhdHVzID0gc3RhdHVzCisgICAgICAgIHNlbGYuaGVhZGVycyA9IHNlbGYuaGVhZGVyc19jbGFzcyhoZWFkZXJzKQorICAgICAgICByZXR1cm4gc2VsZi53cml0ZQorCisKKyAgICBkZWYgc2VuZF9wcmVhbWJsZShzZWxmKToKKyAgICAgICAgIiIiVHJhbnNtaXQgdmVyc2lvbi9zdGF0dXMvZGF0ZS9zZXJ2ZXIsIHZpYSBzZWxmLl93cml0ZSgpIiIiCisgICAgICAgIGlmIHNlbGYub3JpZ2luX3NlcnZlcjoKKyAgICAgICAgICAgIGlmIHNlbGYuY2xpZW50X2lzX21vZGVybigpOgorICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlKCdIVFRQLyVzICVzXHJcbicgJSAoc2VsZi5odHRwX3ZlcnNpb24sc2VsZi5zdGF0dXMpKQorICAgICAgICAgICAgICAgIGlmICdEYXRlJyBub3QgaW4gc2VsZi5oZWFkZXJzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICdEYXRlOiAlc1xyXG4nICUgZm9ybWF0X2RhdGVfdGltZSh0aW1lLnRpbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuc2VydmVyX3NvZnR3YXJlIGFuZCAnU2VydmVyJyBub3QgaW4gc2VsZi5oZWFkZXJzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZSgnU2VydmVyOiAlc1xyXG4nICUgc2VsZi5zZXJ2ZXJfc29mdHdhcmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl93cml0ZSgnU3RhdHVzOiAlc1xyXG4nICUgc2VsZi5zdGF0dXMpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgICIiIid3cml0ZSgpJyBjYWxsYWJsZSBhcyBzcGVjaWZpZWQgYnkgUEVQIDMzMyIiIgorCisgICAgICAgIGFzc2VydCB0eXBlKGRhdGEpIGlzIFN0cmluZ1R5cGUsIndyaXRlKCkgYXJndW1lbnQgbXVzdCBiZSBzdHJpbmciCisKKyAgICAgICAgaWYgbm90IHNlbGYuc3RhdHVzOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIndyaXRlKCkgYmVmb3JlIHN0YXJ0X3Jlc3BvbnNlKCkiKQorCisgICAgICAgIGVsaWYgbm90IHNlbGYuaGVhZGVyc19zZW50OgorICAgICAgICAgICAgIyBCZWZvcmUgdGhlIGZpcnN0IG91dHB1dCwgc2VuZCB0aGUgc3RvcmVkIGhlYWRlcnMKKyAgICAgICAgICAgIHNlbGYuYnl0ZXNfc2VudCA9IGxlbihkYXRhKSAgICAjIG1ha2Ugc3VyZSB3ZSBrbm93IGNvbnRlbnQtbGVuZ3RoCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVycygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmJ5dGVzX3NlbnQgKz0gbGVuKGRhdGEpCisKKyAgICAgICAgIyBYWFggY2hlY2sgQ29udGVudC1MZW5ndGggYW5kIHRydW5jYXRlIGlmIHRvbyBtYW55IGJ5dGVzIHdyaXR0ZW4/CisgICAgICAgIHNlbGYuX3dyaXRlKGRhdGEpCisgICAgICAgIHNlbGYuX2ZsdXNoKCkKKworCisgICAgZGVmIHNlbmRmaWxlKHNlbGYpOgorICAgICAgICAiIiJQbGF0Zm9ybS1zcGVjaWZpYyBmaWxlIHRyYW5zbWlzc2lvbgorCisgICAgICAgIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHN1YmNsYXNzZXMgdG8gc3VwcG9ydCBwbGF0Zm9ybS1zcGVjaWZpYworICAgICAgICBmaWxlIHRyYW5zbWlzc2lvbi4gIEl0IGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBhcHBsaWNhdGlvbidzCisgICAgICAgIHJldHVybiBpdGVyYWJsZSAoJ3NlbGYucmVzdWx0JykgaXMgYW4gaW5zdGFuY2Ugb2YKKyAgICAgICAgJ3NlbGYud3NnaV9maWxlX3dyYXBwZXInLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSB0cnVlIHZhbHVlIGlmIGl0IHdhcyBhYmxlIHRvIGFjdHVhbGx5CisgICAgICAgIHRyYW5zbWl0IHRoZSB3cmFwcGVkIGZpbGUtbGlrZSBvYmplY3QgdXNpbmcgYSBwbGF0Zm9ybS1zcGVjaWZpYworICAgICAgICBhcHByb2FjaC4gIEl0IHNob3VsZCByZXR1cm4gYSBmYWxzZSB2YWx1ZSBpZiBub3JtYWwgaXRlcmF0aW9uCisgICAgICAgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuICBBbiBleGNlcHRpb24gY2FuIGJlIHJhaXNlZCB0byBpbmRpY2F0ZQorICAgICAgICB0aGF0IHRyYW5zbWlzc2lvbiB3YXMgYXR0ZW1wdGVkLCBidXQgZmFpbGVkLgorCisgICAgICAgIE5PVEU6IHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsICdzZWxmLnNlbmRfaGVhZGVycygpJyBpZgorICAgICAgICAnc2VsZi5oZWFkZXJzX3NlbnQnIGlzIGZhbHNlIGFuZCBpdCBpcyBnb2luZyB0byBhdHRlbXB0IGRpcmVjdAorICAgICAgICB0cmFuc21pc3Npb24gb2YgdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gRmFsc2UgICAjIE5vIHBsYXRmb3JtLXNwZWNpZmljIHRyYW5zbWlzc2lvbiBieSBkZWZhdWx0CisKKworICAgIGRlZiBmaW5pc2hfY29udGVudChzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIGhlYWRlcnMgYW5kIGNvbnRlbnQgaGF2ZSBib3RoIGJlZW4gc2VudCIiIgorICAgICAgICBpZiBub3Qgc2VsZi5oZWFkZXJzX3NlbnQ6CisgICAgICAgICAgICAjIE9ubHkgemVybyBDb250ZW50LUxlbmd0aCBpZiBub3Qgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiAoc28KKyAgICAgICAgICAgICMgdGhhdCBIRUFEIHJlcXVlc3RzIGNhbiBiZSBzYXRpc2ZpZWQgcHJvcGVybHksIHNlZSAjMzgzOSkKKyAgICAgICAgICAgIHNlbGYuaGVhZGVycy5zZXRkZWZhdWx0KCdDb250ZW50LUxlbmd0aCcsICIwIikKKyAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXJzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhc3MgIyBYWFggY2hlY2sgaWYgY29udGVudC1sZW5ndGggd2FzIHRvbyBzaG9ydD8KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIGl0ZXJhYmxlIChpZiBuZWVkZWQpIGFuZCByZXNldCBhbGwgaW5zdGFuY2UgdmFycworCisgICAgICAgIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gYWxzbyBkcm9wIHRoZSBjbGllbnQgY29ubmVjdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5yZXN1bHQsJ2Nsb3NlJyk6CisgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSBzZWxmLmhlYWRlcnMgPSBzZWxmLnN0YXR1cyA9IHNlbGYuZW52aXJvbiA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuYnl0ZXNfc2VudCA9IDA7IHNlbGYuaGVhZGVyc19zZW50ID0gRmFsc2UKKworCisgICAgZGVmIHNlbmRfaGVhZGVycyhzZWxmKToKKyAgICAgICAgIiIiVHJhbnNtaXQgaGVhZGVycyB0byB0aGUgY2xpZW50LCB2aWEgc2VsZi5fd3JpdGUoKSIiIgorICAgICAgICBzZWxmLmNsZWFudXBfaGVhZGVycygpCisgICAgICAgIHNlbGYuaGVhZGVyc19zZW50ID0gVHJ1ZQorICAgICAgICBpZiBub3Qgc2VsZi5vcmlnaW5fc2VydmVyIG9yIHNlbGYuY2xpZW50X2lzX21vZGVybigpOgorICAgICAgICAgICAgc2VsZi5zZW5kX3ByZWFtYmxlKCkKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlKHN0cihzZWxmLmhlYWRlcnMpKQorCisKKyAgICBkZWYgcmVzdWx0X2lzX2ZpbGUoc2VsZik6CisgICAgICAgICIiIlRydWUgaWYgJ3NlbGYucmVzdWx0JyBpcyBhbiBpbnN0YW5jZSBvZiAnc2VsZi53c2dpX2ZpbGVfd3JhcHBlciciIiIKKyAgICAgICAgd3JhcHBlciA9IHNlbGYud3NnaV9maWxlX3dyYXBwZXIKKyAgICAgICAgcmV0dXJuIHdyYXBwZXIgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2Uoc2VsZi5yZXN1bHQsd3JhcHBlcikKKworCisgICAgZGVmIGNsaWVudF9pc19tb2Rlcm4oc2VsZik6CisgICAgICAgICIiIlRydWUgaWYgY2xpZW50IGNhbiBhY2NlcHQgc3RhdHVzIGFuZCBoZWFkZXJzIiIiCisgICAgICAgIHJldHVybiBzZWxmLmVudmlyb25bJ1NFUlZFUl9QUk9UT0NPTCddLnVwcGVyKCkgIT0gJ0hUVFAvMC45JworCisKKyAgICBkZWYgbG9nX2V4Y2VwdGlvbihzZWxmLGV4Y19pbmZvKToKKyAgICAgICAgIiIiTG9nIHRoZSAnZXhjX2luZm8nIHR1cGxlIGluIHRoZSBzZXJ2ZXIgbG9nCisKKyAgICAgICAgU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcmV0YXJnZXQgdGhlIG91dHB1dCBvciBjaGFuZ2UgaXRzIGZvcm1hdC4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdHJhY2ViYWNrIGltcG9ydCBwcmludF9leGNlcHRpb24KKyAgICAgICAgICAgIHN0ZGVyciA9IHNlbGYuZ2V0X3N0ZGVycigpCisgICAgICAgICAgICBwcmludF9leGNlcHRpb24oCisgICAgICAgICAgICAgICAgZXhjX2luZm9bMF0sIGV4Y19pbmZvWzFdLCBleGNfaW5mb1syXSwKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlYmFja19saW1pdCwgc3RkZXJyCisgICAgICAgICAgICApCisgICAgICAgICAgICBzdGRlcnIuZmx1c2goKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZXhjX2luZm8gPSBOb25lCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICAiIiJMb2cgY3VycmVudCBlcnJvciwgYW5kIHNlbmQgZXJyb3Igb3V0cHV0IHRvIGNsaWVudCBpZiBwb3NzaWJsZSIiIgorICAgICAgICBzZWxmLmxvZ19leGNlcHRpb24oc3lzLmV4Y19pbmZvKCkpCisgICAgICAgIGlmIG5vdCBzZWxmLmhlYWRlcnNfc2VudDoKKyAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gc2VsZi5lcnJvcl9vdXRwdXQoc2VsZi5lbnZpcm9uLCBzZWxmLnN0YXJ0X3Jlc3BvbnNlKQorICAgICAgICAgICAgc2VsZi5maW5pc2hfcmVzcG9uc2UoKQorICAgICAgICAjIFhYWCBlbHNlOiBhdHRlbXB0IGFkdmFuY2VkIHJlY292ZXJ5IHRlY2huaXF1ZXMgZm9yIEhUTUwgb3IgdGV4dD8KKworICAgIGRlZiBlcnJvcl9vdXRwdXQoc2VsZiwgZW52aXJvbiwgc3RhcnRfcmVzcG9uc2UpOgorICAgICAgICAiIiJXU0dJIG1pbmktYXBwIHRvIGNyZWF0ZSBlcnJvciBvdXRwdXQKKworICAgICAgICBCeSBkZWZhdWx0LCB0aGlzIGp1c3QgdXNlcyB0aGUgJ2Vycm9yX3N0YXR1cycsICdlcnJvcl9oZWFkZXJzJywKKyAgICAgICAgYW5kICdlcnJvcl9ib2R5JyBhdHRyaWJ1dGVzIHRvIGdlbmVyYXRlIGFuIG91dHB1dCBwYWdlLiAgSXQgY2FuCisgICAgICAgIGJlIG92ZXJyaWRkZW4gaW4gYSBzdWJjbGFzcyB0byBkeW5hbWljYWxseSBnZW5lcmF0ZSBkaWFnbm9zdGljcywKKyAgICAgICAgY2hvb3NlIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UgZm9yIHRoZSB1c2VyJ3MgcHJlZmVycmVkIGxhbmd1YWdlLCBldGMuCisKKyAgICAgICAgTm90ZSwgaG93ZXZlciwgdGhhdCBpdCdzIG5vdCByZWNvbW1lbmRlZCBmcm9tIGEgc2VjdXJpdHkgcGVyc3BlY3RpdmUgdG8KKyAgICAgICAgc3BpdCBvdXQgZGlhZ25vc3RpY3MgdG8gYW55IG9sZCB1c2VyOyBpZGVhbGx5LCB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8KKyAgICAgICAgc29tZXRoaW5nIHNwZWNpYWwgdG8gZW5hYmxlIGRpYWdub3N0aWMgb3V0cHV0LCB3aGljaCBpcyB3aHkgd2UgZG9uJ3QKKyAgICAgICAgaW5jbHVkZSBhbnkgaGVyZSEKKyAgICAgICAgIiIiCisgICAgICAgIHN0YXJ0X3Jlc3BvbnNlKHNlbGYuZXJyb3Jfc3RhdHVzLHNlbGYuZXJyb3JfaGVhZGVyc1s6XSxzeXMuZXhjX2luZm8oKSkKKyAgICAgICAgcmV0dXJuIFtzZWxmLmVycm9yX2JvZHldCisKKworICAgICMgUHVyZSBhYnN0cmFjdCBtZXRob2RzOyAqbXVzdCogYmUgb3ZlcnJpZGRlbiBpbiBzdWJjbGFzc2VzCisKKyAgICBkZWYgX3dyaXRlKHNlbGYsZGF0YSk6CisgICAgICAgICIiIk92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIGJ1ZmZlciBkYXRhIGZvciBzZW5kIHRvIGNsaWVudAorCisgICAgICAgIEl0J3Mgb2theSBpZiB0aGlzIG1ldGhvZCBhY3R1YWxseSB0cmFuc21pdHMgdGhlIGRhdGE7IEJhc2VIYW5kbGVyCisgICAgICAgIGp1c3Qgc2VwYXJhdGVzIHdyaXRlIGFuZCBmbHVzaCBvcGVyYXRpb25zIGZvciBncmVhdGVyIGVmZmljaWVuY3kKKyAgICAgICAgd2hlbiB0aGUgdW5kZXJseWluZyBzeXN0ZW0gYWN0dWFsbHkgaGFzIHN1Y2ggYSBkaXN0aW5jdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBfZmx1c2goc2VsZik6CisgICAgICAgICIiIk92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIGZvcmNlIHNlbmRpbmcgb2YgcmVjZW50ICdfd3JpdGUoKScgY2FsbHMKKworICAgICAgICBJdCdzIG9rYXkgaWYgdGhpcyBtZXRob2QgaXMgYSBuby1vcCAoaS5lLiwgaWYgJ193cml0ZSgpJyBhY3R1YWxseQorICAgICAgICBzZW5kcyB0aGUgZGF0YS4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBnZXRfc3RkaW4oc2VsZik6CisgICAgICAgICIiIk92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIHJldHVybiBzdWl0YWJsZSAnd3NnaS5pbnB1dCciIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGdldF9zdGRlcnIoc2VsZik6CisgICAgICAgICIiIk92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIHJldHVybiBzdWl0YWJsZSAnd3NnaS5lcnJvcnMnIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBhZGRfY2dpX3ZhcnMoc2VsZik6CisgICAgICAgICIiIk92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIGluc2VydCBDR0kgdmFyaWFibGVzIGluICdzZWxmLmVudmlyb24nIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCitjbGFzcyBTaW1wbGVIYW5kbGVyKEJhc2VIYW5kbGVyKToKKyAgICAiIiJIYW5kbGVyIHRoYXQncyBqdXN0IGluaXRpYWxpemVkIHdpdGggc3RyZWFtcywgZW52aXJvbm1lbnQsIGV0Yy4KKworICAgIFRoaXMgaGFuZGxlciBzdWJjbGFzcyBpcyBpbnRlbmRlZCBmb3Igc3luY2hyb25vdXMgSFRUUC8xLjAgb3JpZ2luIHNlcnZlcnMsCisgICAgYW5kIGhhbmRsZXMgc2VuZGluZyB0aGUgZW50aXJlIHJlc3BvbnNlIG91dHB1dCwgZ2l2ZW4gdGhlIGNvcnJlY3QgaW5wdXRzLgorCisgICAgVXNhZ2U6OgorCisgICAgICAgIGhhbmRsZXIgPSBTaW1wbGVIYW5kbGVyKAorICAgICAgICAgICAgaW5wLG91dCxlcnIsZW52LCBtdWx0aXRocmVhZD1GYWxzZSwgbXVsdGlwcm9jZXNzPVRydWUKKyAgICAgICAgKQorICAgICAgICBoYW5kbGVyLnJ1bihhcHApIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZixzdGRpbixzdGRvdXQsc3RkZXJyLGVudmlyb24sCisgICAgICAgIG11bHRpdGhyZWFkPVRydWUsIG11bHRpcHJvY2Vzcz1GYWxzZQorICAgICk6CisgICAgICAgIHNlbGYuc3RkaW4gPSBzdGRpbgorICAgICAgICBzZWxmLnN0ZG91dCA9IHN0ZG91dAorICAgICAgICBzZWxmLnN0ZGVyciA9IHN0ZGVycgorICAgICAgICBzZWxmLmJhc2VfZW52ID0gZW52aXJvbgorICAgICAgICBzZWxmLndzZ2lfbXVsdGl0aHJlYWQgPSBtdWx0aXRocmVhZAorICAgICAgICBzZWxmLndzZ2lfbXVsdGlwcm9jZXNzID0gbXVsdGlwcm9jZXNzCisKKyAgICBkZWYgZ2V0X3N0ZGluKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdGRpbgorCisgICAgZGVmIGdldF9zdGRlcnIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN0ZGVycgorCisgICAgZGVmIGFkZF9jZ2lfdmFycyhzZWxmKToKKyAgICAgICAgc2VsZi5lbnZpcm9uLnVwZGF0ZShzZWxmLmJhc2VfZW52KQorCisgICAgZGVmIF93cml0ZShzZWxmLGRhdGEpOgorICAgICAgICBzZWxmLnN0ZG91dC53cml0ZShkYXRhKQorICAgICAgICBzZWxmLl93cml0ZSA9IHNlbGYuc3Rkb3V0LndyaXRlCisKKyAgICBkZWYgX2ZsdXNoKHNlbGYpOgorICAgICAgICBzZWxmLnN0ZG91dC5mbHVzaCgpCisgICAgICAgIHNlbGYuX2ZsdXNoID0gc2VsZi5zdGRvdXQuZmx1c2gKKworCitjbGFzcyBCYXNlQ0dJSGFuZGxlcihTaW1wbGVIYW5kbGVyKToKKworICAgICIiIkNHSS1saWtlIHN5c3RlbXMgdXNpbmcgaW5wdXQvb3V0cHV0L2Vycm9yIHN0cmVhbXMgYW5kIGVudmlyb24gbWFwcGluZworCisgICAgVXNhZ2U6OgorCisgICAgICAgIGhhbmRsZXIgPSBCYXNlQ0dJSGFuZGxlcihpbnAsb3V0LGVycixlbnYpCisgICAgICAgIGhhbmRsZXIucnVuKGFwcCkKKworICAgIFRoaXMgaGFuZGxlciBjbGFzcyBpcyB1c2VmdWwgZm9yIGdhdGV3YXkgcHJvdG9jb2xzIGxpa2UgUmVhZHlFeGVjIGFuZAorICAgIEZhc3RDR0ksIHRoYXQgaGF2ZSB1c2FibGUgaW5wdXQvb3V0cHV0L2Vycm9yIHN0cmVhbXMgYW5kIGFuIGVudmlyb25tZW50CisgICAgbWFwcGluZy4gIEl0J3MgYWxzbyB0aGUgYmFzZSBjbGFzcyBmb3IgQ0dJSGFuZGxlciwgd2hpY2gganVzdCB1c2VzCisgICAgc3lzLnN0ZGluLCBvcy5lbnZpcm9uLCBhbmQgc28gb24uCisKKyAgICBUaGUgY29uc3RydWN0b3IgYWxzbyB0YWtlcyBrZXl3b3JkIGFyZ3VtZW50cyAnbXVsdGl0aHJlYWQnIGFuZAorICAgICdtdWx0aXByb2Nlc3MnIChkZWZhdWx0aW5nIHRvICdUcnVlJyBhbmQgJ0ZhbHNlJyByZXNwZWN0aXZlbHkpIHRvIGNvbnRyb2wKKyAgICB0aGUgY29uZmlndXJhdGlvbiBzZW50IHRvIHRoZSBhcHBsaWNhdGlvbi4gIEl0IHNldHMgJ29yaWdpbl9zZXJ2ZXInIHRvCisgICAgRmFsc2UgKHRvIGVuYWJsZSBDR0ktbGlrZSBvdXRwdXQpLCBhbmQgYXNzdW1lcyB0aGF0ICd3c2dpLnJ1bl9vbmNlJyBpcworICAgIEZhbHNlLgorICAgICIiIgorCisgICAgb3JpZ2luX3NlcnZlciA9IEZhbHNlCisKKworY2xhc3MgQ0dJSGFuZGxlcihCYXNlQ0dJSGFuZGxlcik6CisKKyAgICAiIiJDR0ktYmFzZWQgaW52b2NhdGlvbiB2aWEgc3lzLnN0ZGluL3N0ZG91dC9zdGRlcnIgYW5kIG9zLmVudmlyb24KKworICAgIFVzYWdlOjoKKworICAgICAgICBDR0lIYW5kbGVyKCkucnVuKGFwcCkKKworICAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBjbGFzcyBhbmQgQmFzZUNHSUhhbmRsZXIgaXMgdGhhdCBpdCBhbHdheXMKKyAgICB1c2VzICd3c2dpLnJ1bl9vbmNlJyBvZiAnVHJ1ZScsICd3c2dpLm11bHRpdGhyZWFkJyBvZiAnRmFsc2UnLCBhbmQKKyAgICAnd3NnaS5tdWx0aXByb2Nlc3MnIG9mICdUcnVlJy4gIEl0IGRvZXMgbm90IHRha2UgYW55IGluaXRpYWxpemF0aW9uCisgICAgcGFyYW1ldGVycywgYnV0IGFsd2F5cyB1c2VzICdzeXMuc3RkaW4nLCAnb3MuZW52aXJvbicsIGFuZCBmcmllbmRzLgorCisgICAgSWYgeW91IG5lZWQgdG8gb3ZlcnJpZGUgYW55IG9mIHRoZXNlIHBhcmFtZXRlcnMsIHVzZSBCYXNlQ0dJSGFuZGxlcgorICAgIGluc3RlYWQuCisgICAgIiIiCisKKyAgICB3c2dpX3J1bl9vbmNlID0gVHJ1ZQorICAgICMgRG8gbm90IGFsbG93IG9zLmVudmlyb24gdG8gbGVhayBiZXR3ZWVuIHJlcXVlc3RzIGluIEdvb2dsZSBBcHAgRW5naW5lCisgICAgIyBhbmQgb3RoZXIgbXVsdGktcnVuIENHSSB1c2UgY2FzZXMuICBUaGlzIGlzIG5vdCBlYXNpbHkgdGVzdGFibGUuCisgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTcyNTAKKyAgICBvc19lbnZpcm9uID0ge30KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQmFzZUNHSUhhbmRsZXIuX19pbml0X18oCisgICAgICAgICAgICBzZWxmLCBzeXMuc3RkaW4sIHN5cy5zdGRvdXQsIHN5cy5zdGRlcnIsIGRpY3Qob3MuZW52aXJvbi5pdGVtcygpKSwKKyAgICAgICAgICAgIG11bHRpdGhyZWFkPUZhbHNlLCBtdWx0aXByb2Nlc3M9VHJ1ZQorICAgICAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3dzZ2lyZWYvaGFuZGxlcnMucHljIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hhbmRsZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjE5MDc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hhbmRsZXJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3dzZ2lyZWYvaGFuZGxlcnMucHlvIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hhbmRsZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjEyZDIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hhbmRsZXJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3dzZ2lyZWYvaGVhZGVycy5weSBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9oZWFkZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOGM2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvaGVhZGVycy5weQpAQCAtMCwwICsxLDE2OSBAQAorIiIiTWFuYWdlIEhUVFAgUmVzcG9uc2UgSGVhZGVycworCitNdWNoIG9mIHRoaXMgbW9kdWxlIGlzIHJlZC1oYW5kZWRseSBwaWxmZXJlZCBmcm9tIGVtYWlsLm1lc3NhZ2UgaW4gdGhlIHN0ZGxpYiwKK3NvIHBvcnRpb25zIGFyZSBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kIHdlcmUKK3dyaXR0ZW4gYnkgQmFycnkgV2Fyc2F3LgorIiIiCisKK2Zyb20gdHlwZXMgaW1wb3J0IExpc3RUeXBlLCBUdXBsZVR5cGUKKworIyBSZWd1bGFyIGV4cHJlc3Npb24gdGhhdCBtYXRjaGVzIGBzcGVjaWFsJyBjaGFyYWN0ZXJzIGluIHBhcmFtZXRlcnMsIHRoZQorIyBleGlzdGVuY2Ugb2Ygd2hpY2ggZm9yY2UgcXVvdGluZyBvZiB0aGUgcGFyYW1ldGVyIHZhbHVlLgoraW1wb3J0IHJlCit0c3BlY2lhbHMgPSByZS5jb21waWxlKHInWyBcKFwpPD5ALDs6XFwiL1xbXF1cPz1dJykKKworZGVmIF9mb3JtYXRwYXJhbShwYXJhbSwgdmFsdWU9Tm9uZSwgcXVvdGU9MSk6CisgICAgIiIiQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZm9ybWF0IGFuZCByZXR1cm4gYSBrZXk9dmFsdWUgcGFpci4KKworICAgIFRoaXMgd2lsbCBxdW90ZSB0aGUgdmFsdWUgaWYgbmVlZGVkIG9yIGlmIHF1b3RlIGlzIHRydWUuCisgICAgIiIiCisgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIGxlbih2YWx1ZSkgPiAwOgorICAgICAgICBpZiBxdW90ZSBvciB0c3BlY2lhbHMuc2VhcmNoKHZhbHVlKToKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFwnLCAnXFxcXCcpLnJlcGxhY2UoJyInLCByJ1wiJykKKyAgICAgICAgICAgIHJldHVybiAnJXM9IiVzIicgJSAocGFyYW0sIHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICclcz0lcycgJSAocGFyYW0sIHZhbHVlKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBwYXJhbQorCisKK2NsYXNzIEhlYWRlcnM6CisKKyAgICAiIiJNYW5hZ2UgYSBjb2xsZWN0aW9uIG9mIEhUVFAgcmVzcG9uc2UgaGVhZGVycyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsaGVhZGVycyk6CisgICAgICAgIGlmIHR5cGUoaGVhZGVycykgaXMgbm90IExpc3RUeXBlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJIZWFkZXJzIG11c3QgYmUgYSBsaXN0IG9mIG5hbWUvdmFsdWUgdHVwbGVzIikKKyAgICAgICAgc2VsZi5faGVhZGVycyA9IGhlYWRlcnMKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBoZWFkZXJzLCBpbmNsdWRpbmcgZHVwbGljYXRlcy4iIiIKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9oZWFkZXJzKQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIG5hbWUsIHZhbCk6CisgICAgICAgICIiIlNldCB0aGUgdmFsdWUgb2YgYSBoZWFkZXIuIiIiCisgICAgICAgIGRlbCBzZWxmW25hbWVdCisgICAgICAgIHNlbGYuX2hlYWRlcnMuYXBwZW5kKChuYW1lLCB2YWwpKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsbmFtZSk6CisgICAgICAgICIiIkRlbGV0ZSBhbGwgb2NjdXJyZW5jZXMgb2YgYSBoZWFkZXIsIGlmIHByZXNlbnQuCisKKyAgICAgICAgRG9lcyAqbm90KiByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGhlYWRlciBpcyBtaXNzaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQorICAgICAgICBzZWxmLl9oZWFkZXJzWzpdID0gW2t2IGZvciBrdiBpbiBzZWxmLl9oZWFkZXJzIGlmIGt2WzBdLmxvd2VyKCkgIT0gbmFtZV0KKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLG5hbWUpOgorICAgICAgICAiIiJHZXQgdGhlIGZpcnN0IGhlYWRlciB2YWx1ZSBmb3IgJ25hbWUnCisKKyAgICAgICAgUmV0dXJuIE5vbmUgaWYgdGhlIGhlYWRlciBpcyBtaXNzaW5nIGluc3RlYWQgb2YgcmFpc2luZyBhbiBleGNlcHRpb24uCisKKyAgICAgICAgTm90ZSB0aGF0IGlmIHRoZSBoZWFkZXIgYXBwZWFyZWQgbXVsdGlwbGUgdGltZXMsIHRoZSBmaXJzdCBleGFjdGx5IHdoaWNoCisgICAgICAgIG9jY3VycmFuY2UgZ2V0cyByZXR1cm5lZCBpcyB1bmRlZmluZWQuICBVc2UgZ2V0YWxsKCkgdG8gZ2V0IGFsbAorICAgICAgICB0aGUgdmFsdWVzIG1hdGNoaW5nIGEgaGVhZGVyIGZpZWxkIG5hbWUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXQobmFtZSkKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBjb250YWlucyB0aGUgaGVhZGVyLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXQobmFtZSkgaXMgbm90IE5vbmUKKworICAgIF9fY29udGFpbnNfXyA9IGhhc19rZXkKKworCisgICAgZGVmIGdldF9hbGwoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBuYW1lZCBmaWVsZC4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwgaGVhZGVyCisgICAgICAgIGxpc3Qgb3Igd2VyZSBhZGRlZCB0byB0aGlzIGluc3RhbmNlLCBhbmQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcy4gIEFueQorICAgICAgICBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgaGVhZGVyIGxpc3QuCisgICAgICAgIElmIG5vIGZpZWxkcyBleGlzdCB3aXRoIHRoZSBnaXZlbiBuYW1lLCByZXR1cm5zIGFuIGVtcHR5IGxpc3QuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIHJldHVybiBba3ZbMV0gZm9yIGt2IGluIHNlbGYuX2hlYWRlcnMgaWYga3ZbMF0ubG93ZXIoKT09bmFtZV0KKworCisgICAgZGVmIGdldChzZWxmLG5hbWUsZGVmYXVsdD1Ob25lKToKKyAgICAgICAgIiIiR2V0IHRoZSBmaXJzdCBoZWFkZXIgdmFsdWUgZm9yICduYW1lJywgb3IgcmV0dXJuICdkZWZhdWx0JyIiIgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIGZvciBrLHYgaW4gc2VsZi5faGVhZGVyczoKKyAgICAgICAgICAgIGlmIGsubG93ZXIoKT09bmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICByZXR1cm4gZGVmYXVsdAorCisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIGhlYWRlciBmaWVsZCBuYW1lcy4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwgaGVhZGVyCisgICAgICAgIGxpc3QsIG9yIHdlcmUgYWRkZWQgdG8gdGhpcyBpbnN0YW5jZSwgYW5kIG1heSBjb250YWluIGR1cGxpY2F0ZXMuCisgICAgICAgIEFueSBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgaGVhZGVyCisgICAgICAgIGxpc3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gW2sgZm9yIGssIHYgaW4gc2VsZi5faGVhZGVyc10KKworICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIGhlYWRlciB2YWx1ZXMuCisKKyAgICAgICAgVGhlc2Ugd2lsbCBiZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsIGhlYWRlcgorICAgICAgICBsaXN0LCBvciB3ZXJlIGFkZGVkIHRvIHRoaXMgaW5zdGFuY2UsIGFuZCBtYXkgY29udGFpbiBkdXBsaWNhdGVzLgorICAgICAgICBBbnkgZmllbGRzIGRlbGV0ZWQgYW5kIHJlLWluc2VydGVkIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGhlYWRlcgorICAgICAgICBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFt2IGZvciBrLCB2IGluIHNlbGYuX2hlYWRlcnNdCisKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgICIiIkdldCBhbGwgdGhlIGhlYWRlciBmaWVsZHMgYW5kIHZhbHVlcy4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGluIHRoZSBvcmlnaW5hbCBoZWFkZXIKKyAgICAgICAgbGlzdCwgb3Igd2VyZSBhZGRlZCB0byB0aGlzIGluc3RhbmNlLCBhbmQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcy4KKyAgICAgICAgQW55IGZpZWxkcyBkZWxldGVkIGFuZCByZS1pbnNlcnRlZCBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBoZWFkZXIKKyAgICAgICAgbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9oZWFkZXJzWzpdCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiSGVhZGVycyglcikiICUgc2VsZi5faGVhZGVycworCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICIiInN0cigpIHJldHVybnMgdGhlIGZvcm1hdHRlZCBoZWFkZXJzLCBjb21wbGV0ZSB3aXRoIGVuZCBsaW5lLAorICAgICAgICBzdWl0YWJsZSBmb3IgZGlyZWN0IEhUVFAgdHJhbnNtaXNzaW9uLiIiIgorICAgICAgICByZXR1cm4gJ1xyXG4nLmpvaW4oWyIlczogJXMiICUga3YgZm9yIGt2IGluIHNlbGYuX2hlYWRlcnNdK1snJywnJ10pCisKKyAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLG5hbWUsdmFsdWUpOgorICAgICAgICAiIiJSZXR1cm4gZmlyc3QgbWF0Y2hpbmcgaGVhZGVyIHZhbHVlIGZvciAnbmFtZScsIG9yICd2YWx1ZScKKworICAgICAgICBJZiB0aGVyZSBpcyBubyBoZWFkZXIgbmFtZWQgJ25hbWUnLCBhZGQgYSBuZXcgaGVhZGVyIHdpdGggbmFtZSAnbmFtZScKKyAgICAgICAgYW5kIHZhbHVlICd2YWx1ZScuIiIiCisgICAgICAgIHJlc3VsdCA9IHNlbGYuZ2V0KG5hbWUpCisgICAgICAgIGlmIHJlc3VsdCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5faGVhZGVycy5hcHBlbmQoKG5hbWUsdmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgYWRkX2hlYWRlcihzZWxmLCBfbmFtZSwgX3ZhbHVlLCAqKl9wYXJhbXMpOgorICAgICAgICAiIiJFeHRlbmRlZCBoZWFkZXIgc2V0dGluZy4KKworICAgICAgICBfbmFtZSBpcyB0aGUgaGVhZGVyIGZpZWxkIHRvIGFkZC4gIGtleXdvcmQgYXJndW1lbnRzIGNhbiBiZSB1c2VkIHRvIHNldAorICAgICAgICBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBoZWFkZXIgZmllbGQsIHdpdGggdW5kZXJzY29yZXMgY29udmVydGVkCisgICAgICAgIHRvIGRhc2hlcy4gIE5vcm1hbGx5IHRoZSBwYXJhbWV0ZXIgd2lsbCBiZSBhZGRlZCBhcyBrZXk9InZhbHVlIiB1bmxlc3MKKyAgICAgICAgdmFsdWUgaXMgTm9uZSwgaW4gd2hpY2ggY2FzZSBvbmx5IHRoZSBrZXkgd2lsbCBiZSBhZGRlZC4KKworICAgICAgICBFeGFtcGxlOgorCisgICAgICAgIGguYWRkX2hlYWRlcignY29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywgZmlsZW5hbWU9J2J1ZC5naWYnKQorCisgICAgICAgIE5vdGUgdGhhdCB1bmxpa2UgdGhlIGNvcnJlc3BvbmRpbmcgJ2VtYWlsLm1lc3NhZ2UnIG1ldGhvZCwgdGhpcyBkb2VzCisgICAgICAgICpub3QqIGhhbmRsZSAnKGNoYXJzZXQsIGxhbmd1YWdlLCB2YWx1ZSknIHR1cGxlczogYWxsIHZhbHVlcyBtdXN0IGJlCisgICAgICAgIHN0cmluZ3Mgb3IgTm9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIHBhcnRzID0gW10KKyAgICAgICAgaWYgX3ZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcGFydHMuYXBwZW5kKF92YWx1ZSkKKyAgICAgICAgZm9yIGssIHYgaW4gX3BhcmFtcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgdiBpcyBOb25lOgorICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChrLnJlcGxhY2UoJ18nLCAnLScpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoX2Zvcm1hdHBhcmFtKGsucmVwbGFjZSgnXycsICctJyksIHYpKQorICAgICAgICBzZWxmLl9oZWFkZXJzLmFwcGVuZCgoX25hbWUsICI7ICIuam9pbihwYXJ0cykpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hlYWRlcnMucHljIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hlYWRlcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZWVkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvaGVhZGVycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hlYWRlcnMucHlvIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hlYWRlcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZWVkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvaGVhZGVycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvc2ltcGxlX3NlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmEzODViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkKQEAgLTAsMCArMSwxNTUgQEAKKyIiIkJhc2VIVFRQU2VydmVyIHRoYXQgaW1wbGVtZW50cyB0aGUgUHl0aG9uIFdTR0kgcHJvdG9jb2wgKFBFUCAzMzMsIHJldiAxLjIxKQorCitUaGlzIGlzIGJvdGggYW4gZXhhbXBsZSBvZiBob3cgV1NHSSBjYW4gYmUgaW1wbGVtZW50ZWQsIGFuZCBhIGJhc2lzIGZvciBydW5uaW5nCitzaW1wbGUgd2ViIGFwcGxpY2F0aW9ucyBvbiBhIGxvY2FsIG1hY2hpbmUsIHN1Y2ggYXMgbWlnaHQgYmUgZG9uZSB3aGVuIHRlc3RpbmcKK29yIGRlYnVnZ2luZyBhbiBhcHBsaWNhdGlvbi4gIEl0IGhhcyBub3QgYmVlbiByZXZpZXdlZCBmb3Igc2VjdXJpdHkgaXNzdWVzLAoraG93ZXZlciwgYW5kIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSAicmVhbCIgd2ViIHNlcnZlciBmb3IKK3Byb2R1Y3Rpb24gdXNlLgorCitGb3IgZXhhbXBsZSB1c2FnZSwgc2VlIHRoZSAnaWYgX19uYW1lX189PSJfX21haW5fXyInIGJsb2NrIGF0IHRoZSBlbmQgb2YgdGhlCittb2R1bGUuICBTZWUgYWxzbyB0aGUgQmFzZUhUVFBTZXJ2ZXIgbW9kdWxlIGRvY3MgZm9yIG90aGVyIEFQSSBpbmZvcm1hdGlvbi4KKyIiIgorCitmcm9tIEJhc2VIVFRQU2VydmVyIGltcG9ydCBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyLCBIVFRQU2VydmVyCitpbXBvcnQgdXJsbGliLCBzeXMKK2Zyb20gd3NnaXJlZi5oYW5kbGVycyBpbXBvcnQgU2ltcGxlSGFuZGxlcgorCitfX3ZlcnNpb25fXyA9ICIwLjEiCitfX2FsbF9fID0gWydXU0dJU2VydmVyJywgJ1dTR0lSZXF1ZXN0SGFuZGxlcicsICdkZW1vX2FwcCcsICdtYWtlX3NlcnZlciddCisKKworc2VydmVyX3ZlcnNpb24gPSAiV1NHSVNlcnZlci8iICsgX192ZXJzaW9uX18KK3N5c192ZXJzaW9uID0gIlB5dGhvbi8iICsgc3lzLnZlcnNpb24uc3BsaXQoKVswXQorc29mdHdhcmVfdmVyc2lvbiA9IHNlcnZlcl92ZXJzaW9uICsgJyAnICsgc3lzX3ZlcnNpb24KKworCitjbGFzcyBTZXJ2ZXJIYW5kbGVyKFNpbXBsZUhhbmRsZXIpOgorCisgICAgc2VydmVyX3NvZnR3YXJlID0gc29mdHdhcmVfdmVyc2lvbgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnJlcXVlc3RfaGFuZGxlci5sb2dfcmVxdWVzdCgKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cy5zcGxpdCgnICcsMSlbMF0sIHNlbGYuYnl0ZXNfc2VudAorICAgICAgICAgICAgKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgU2ltcGxlSGFuZGxlci5jbG9zZShzZWxmKQorCisKKworY2xhc3MgV1NHSVNlcnZlcihIVFRQU2VydmVyKToKKworICAgICIiIkJhc2VIVFRQU2VydmVyIHRoYXQgaW1wbGVtZW50cyB0aGUgUHl0aG9uIFdTR0kgcHJvdG9jb2wiIiIKKworICAgIGFwcGxpY2F0aW9uID0gTm9uZQorCisgICAgZGVmIHNlcnZlcl9iaW5kKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBzZXJ2ZXJfYmluZCB0byBzdG9yZSB0aGUgc2VydmVyIG5hbWUuIiIiCisgICAgICAgIEhUVFBTZXJ2ZXIuc2VydmVyX2JpbmQoc2VsZikKKyAgICAgICAgc2VsZi5zZXR1cF9lbnZpcm9uKCkKKworICAgIGRlZiBzZXR1cF9lbnZpcm9uKHNlbGYpOgorICAgICAgICAjIFNldCB1cCBiYXNlIGVudmlyb25tZW50CisgICAgICAgIGVudiA9IHNlbGYuYmFzZV9lbnZpcm9uID0ge30KKyAgICAgICAgZW52WydTRVJWRVJfTkFNRSddID0gc2VsZi5zZXJ2ZXJfbmFtZQorICAgICAgICBlbnZbJ0dBVEVXQVlfSU5URVJGQUNFJ10gPSAnQ0dJLzEuMScKKyAgICAgICAgZW52WydTRVJWRVJfUE9SVCddID0gc3RyKHNlbGYuc2VydmVyX3BvcnQpCisgICAgICAgIGVudlsnUkVNT1RFX0hPU1QnXT0nJworICAgICAgICBlbnZbJ0NPTlRFTlRfTEVOR1RIJ109JycKKyAgICAgICAgZW52WydTQ1JJUFRfTkFNRSddID0gJycKKworICAgIGRlZiBnZXRfYXBwKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5hcHBsaWNhdGlvbgorCisgICAgZGVmIHNldF9hcHAoc2VsZixhcHBsaWNhdGlvbik6CisgICAgICAgIHNlbGYuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbgorCisKKworY2xhc3MgV1NHSVJlcXVlc3RIYW5kbGVyKEJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOgorCisgICAgc2VydmVyX3ZlcnNpb24gPSAiV1NHSVNlcnZlci8iICsgX192ZXJzaW9uX18KKworICAgIGRlZiBnZXRfZW52aXJvbihzZWxmKToKKyAgICAgICAgZW52ID0gc2VsZi5zZXJ2ZXIuYmFzZV9lbnZpcm9uLmNvcHkoKQorICAgICAgICBlbnZbJ1NFUlZFUl9QUk9UT0NPTCddID0gc2VsZi5yZXF1ZXN0X3ZlcnNpb24KKyAgICAgICAgZW52WydSRVFVRVNUX01FVEhPRCddID0gc2VsZi5jb21tYW5kCisgICAgICAgIGlmICc/JyBpbiBzZWxmLnBhdGg6CisgICAgICAgICAgICBwYXRoLHF1ZXJ5ID0gc2VsZi5wYXRoLnNwbGl0KCc/JywxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aCxxdWVyeSA9IHNlbGYucGF0aCwnJworCisgICAgICAgIGVudlsnUEFUSF9JTkZPJ10gPSB1cmxsaWIudW5xdW90ZShwYXRoKQorICAgICAgICBlbnZbJ1FVRVJZX1NUUklORyddID0gcXVlcnkKKworICAgICAgICBob3N0ID0gc2VsZi5hZGRyZXNzX3N0cmluZygpCisgICAgICAgIGlmIGhvc3QgIT0gc2VsZi5jbGllbnRfYWRkcmVzc1swXToKKyAgICAgICAgICAgIGVudlsnUkVNT1RFX0hPU1QnXSA9IGhvc3QKKyAgICAgICAgZW52WydSRU1PVEVfQUREUiddID0gc2VsZi5jbGllbnRfYWRkcmVzc1swXQorCisgICAgICAgIGlmIHNlbGYuaGVhZGVycy50eXBlaGVhZGVyIGlzIE5vbmU6CisgICAgICAgICAgICBlbnZbJ0NPTlRFTlRfVFlQRSddID0gc2VsZi5oZWFkZXJzLnR5cGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVudlsnQ09OVEVOVF9UWVBFJ10gPSBzZWxmLmhlYWRlcnMudHlwZWhlYWRlcgorCisgICAgICAgIGxlbmd0aCA9IHNlbGYuaGVhZGVycy5nZXRoZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJykKKyAgICAgICAgaWYgbGVuZ3RoOgorICAgICAgICAgICAgZW52WydDT05URU5UX0xFTkdUSCddID0gbGVuZ3RoCisKKyAgICAgICAgZm9yIGggaW4gc2VsZi5oZWFkZXJzLmhlYWRlcnM6CisgICAgICAgICAgICBrLHYgPSBoLnNwbGl0KCc6JywxKQorICAgICAgICAgICAgaz1rLnJlcGxhY2UoJy0nLCdfJykudXBwZXIoKTsgdj12LnN0cmlwKCkKKyAgICAgICAgICAgIGlmIGsgaW4gZW52OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICAgICAgICAgICAgICAgICAjIHNraXAgY29udGVudCBsZW5ndGgsIHR5cGUsZXRjLgorICAgICAgICAgICAgaWYgJ0hUVFBfJytrIGluIGVudjoKKyAgICAgICAgICAgICAgICBlbnZbJ0hUVFBfJytrXSArPSAnLCcrdiAgICAgIyBjb21tYS1zZXBhcmF0ZSBtdWx0aXBsZSBoZWFkZXJzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVudlsnSFRUUF8nK2tdID0gdgorICAgICAgICByZXR1cm4gZW52CisKKyAgICBkZWYgZ2V0X3N0ZGVycihzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5zdGRlcnIKKworICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgICIiIkhhbmRsZSBhIHNpbmdsZSBIVFRQIHJlcXVlc3QiIiIKKworICAgICAgICBzZWxmLnJhd19yZXF1ZXN0bGluZSA9IHNlbGYucmZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBub3Qgc2VsZi5wYXJzZV9yZXF1ZXN0KCk6ICMgQW4gZXJyb3IgY29kZSBoYXMgYmVlbiBzZW50LCBqdXN0IGV4aXQKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGhhbmRsZXIgPSBTZXJ2ZXJIYW5kbGVyKAorICAgICAgICAgICAgc2VsZi5yZmlsZSwgc2VsZi53ZmlsZSwgc2VsZi5nZXRfc3RkZXJyKCksIHNlbGYuZ2V0X2Vudmlyb24oKQorICAgICAgICApCisgICAgICAgIGhhbmRsZXIucmVxdWVzdF9oYW5kbGVyID0gc2VsZiAgICAgICMgYmFja3BvaW50ZXIgZm9yIGxvZ2dpbmcKKyAgICAgICAgaGFuZGxlci5ydW4oc2VsZi5zZXJ2ZXIuZ2V0X2FwcCgpKQorCisKKworZGVmIGRlbW9fYXBwKGVudmlyb24sc3RhcnRfcmVzcG9uc2UpOgorICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgc3Rkb3V0ID0gU3RyaW5nSU8oKQorICAgIHByaW50ID4+c3Rkb3V0LCAiSGVsbG8gd29ybGQhIgorICAgIHByaW50ID4+c3Rkb3V0CisgICAgaCA9IGVudmlyb24uaXRlbXMoKTsgaC5zb3J0KCkKKyAgICBmb3Igayx2IGluIGg6CisgICAgICAgIHByaW50ID4+c3Rkb3V0LCBrLCc9JywgcmVwcih2KQorICAgIHN0YXJ0X3Jlc3BvbnNlKCIyMDAgT0siLCBbKCdDb250ZW50LVR5cGUnLCd0ZXh0L3BsYWluJyldKQorICAgIHJldHVybiBbc3Rkb3V0LmdldHZhbHVlKCldCisKKworZGVmIG1ha2Vfc2VydmVyKAorICAgIGhvc3QsIHBvcnQsIGFwcCwgc2VydmVyX2NsYXNzPVdTR0lTZXJ2ZXIsIGhhbmRsZXJfY2xhc3M9V1NHSVJlcXVlc3RIYW5kbGVyCispOgorICAgICIiIkNyZWF0ZSBhIG5ldyBXU0dJIHNlcnZlciBsaXN0ZW5pbmcgb24gYGhvc3RgIGFuZCBgcG9ydGAgZm9yIGBhcHBgIiIiCisgICAgc2VydmVyID0gc2VydmVyX2NsYXNzKChob3N0LCBwb3J0KSwgaGFuZGxlcl9jbGFzcykKKyAgICBzZXJ2ZXIuc2V0X2FwcChhcHApCisgICAgcmV0dXJuIHNlcnZlcgorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaHR0cGQgPSBtYWtlX3NlcnZlcignJywgODAwMCwgZGVtb19hcHApCisgICAgc2EgPSBodHRwZC5zb2NrZXQuZ2V0c29ja25hbWUoKQorICAgIHByaW50ICJTZXJ2aW5nIEhUVFAgb24iLCBzYVswXSwgInBvcnQiLCBzYVsxXSwgIi4uLiIKKyAgICBpbXBvcnQgd2ViYnJvd3NlcgorICAgIHdlYmJyb3dzZXIub3BlbignaHR0cDovL2xvY2FsaG9zdDo4MDAwL3h5ej9hYmMnKQorICAgIGh0dHBkLmhhbmRsZV9yZXF1ZXN0KCkgICMgc2VydmUgb25lIHJlcXVlc3QsIHRoZW4gZXhpdApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHljIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzQxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvc2ltcGxlX3NlcnZlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHlvIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzQxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvc2ltcGxlX3NlcnZlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL3V0aWwucHkgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTRiMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3V0aWwucHkKQEAgLTAsMCArMSwxNjUgQEAKKyIiIk1pc2NlbGxhbmVvdXMgV1NHSS1yZWxhdGVkIFV0aWxpdGllcyIiIgorCitpbXBvcnQgcG9zaXhwYXRoCisKK19fYWxsX18gPSBbCisgICAgJ0ZpbGVXcmFwcGVyJywgJ2d1ZXNzX3NjaGVtZScsICdhcHBsaWNhdGlvbl91cmknLCAncmVxdWVzdF91cmknLAorICAgICdzaGlmdF9wYXRoX2luZm8nLCAnc2V0dXBfdGVzdGluZ19kZWZhdWx0cycsCitdCisKKworY2xhc3MgRmlsZVdyYXBwZXI6CisgICAgIiIiV3JhcHBlciB0byBjb252ZXJ0IGZpbGUtbGlrZSBvYmplY3RzIHRvIGl0ZXJhYmxlcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVsaWtlLCBibGtzaXplPTgxOTIpOgorICAgICAgICBzZWxmLmZpbGVsaWtlID0gZmlsZWxpa2UKKyAgICAgICAgc2VsZi5ibGtzaXplID0gYmxrc2l6ZQorICAgICAgICBpZiBoYXNhdHRyKGZpbGVsaWtlLCdjbG9zZScpOgorICAgICAgICAgICAgc2VsZi5jbG9zZSA9IGZpbGVsaWtlLmNsb3NlCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZixrZXkpOgorICAgICAgICBkYXRhID0gc2VsZi5maWxlbGlrZS5yZWFkKHNlbGYuYmxrc2l6ZSkKKyAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5maWxlbGlrZS5yZWFkKHNlbGYuYmxrc2l6ZSkKKyAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworZGVmIGd1ZXNzX3NjaGVtZShlbnZpcm9uKToKKyAgICAiIiJSZXR1cm4gYSBndWVzcyBmb3Igd2hldGhlciAnd3NnaS51cmxfc2NoZW1lJyBzaG91bGQgYmUgJ2h0dHAnIG9yICdodHRwcycKKyAgICAiIiIKKyAgICBpZiBlbnZpcm9uLmdldCgiSFRUUFMiKSBpbiAoJ3llcycsJ29uJywnMScpOgorICAgICAgICByZXR1cm4gJ2h0dHBzJworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnaHR0cCcKKworZGVmIGFwcGxpY2F0aW9uX3VyaShlbnZpcm9uKToKKyAgICAiIiJSZXR1cm4gdGhlIGFwcGxpY2F0aW9uJ3MgYmFzZSBVUkkgKG5vIFBBVEhfSU5GTyBvciBRVUVSWV9TVFJJTkcpIiIiCisgICAgdXJsID0gZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ10rJzovLycKKyAgICBmcm9tIHVybGxpYiBpbXBvcnQgcXVvdGUKKworICAgIGlmIGVudmlyb24uZ2V0KCdIVFRQX0hPU1QnKToKKyAgICAgICAgdXJsICs9IGVudmlyb25bJ0hUVFBfSE9TVCddCisgICAgZWxzZToKKyAgICAgICAgdXJsICs9IGVudmlyb25bJ1NFUlZFUl9OQU1FJ10KKworICAgICAgICBpZiBlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXSA9PSAnaHR0cHMnOgorICAgICAgICAgICAgaWYgZW52aXJvblsnU0VSVkVSX1BPUlQnXSAhPSAnNDQzJzoKKyAgICAgICAgICAgICAgICB1cmwgKz0gJzonICsgZW52aXJvblsnU0VSVkVSX1BPUlQnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgZW52aXJvblsnU0VSVkVSX1BPUlQnXSAhPSAnODAnOgorICAgICAgICAgICAgICAgIHVybCArPSAnOicgKyBlbnZpcm9uWydTRVJWRVJfUE9SVCddCisKKyAgICB1cmwgKz0gcXVvdGUoZW52aXJvbi5nZXQoJ1NDUklQVF9OQU1FJykgb3IgJy8nKQorICAgIHJldHVybiB1cmwKKworZGVmIHJlcXVlc3RfdXJpKGVudmlyb24sIGluY2x1ZGVfcXVlcnk9MSk6CisgICAgIiIiUmV0dXJuIHRoZSBmdWxsIHJlcXVlc3QgVVJJLCBvcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgcXVlcnkgc3RyaW5nIiIiCisgICAgdXJsID0gYXBwbGljYXRpb25fdXJpKGVudmlyb24pCisgICAgZnJvbSB1cmxsaWIgaW1wb3J0IHF1b3RlCisgICAgcGF0aF9pbmZvID0gcXVvdGUoZW52aXJvbi5nZXQoJ1BBVEhfSU5GTycsJycpLHNhZmU9Jy87PSwnKQorICAgIGlmIG5vdCBlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnKToKKyAgICAgICAgdXJsICs9IHBhdGhfaW5mb1sxOl0KKyAgICBlbHNlOgorICAgICAgICB1cmwgKz0gcGF0aF9pbmZvCisgICAgaWYgaW5jbHVkZV9xdWVyeSBhbmQgZW52aXJvbi5nZXQoJ1FVRVJZX1NUUklORycpOgorICAgICAgICB1cmwgKz0gJz8nICsgZW52aXJvblsnUVVFUllfU1RSSU5HJ10KKyAgICByZXR1cm4gdXJsCisKK2RlZiBzaGlmdF9wYXRoX2luZm8oZW52aXJvbik6CisgICAgIiIiU2hpZnQgYSBuYW1lIGZyb20gUEFUSF9JTkZPIHRvIFNDUklQVF9OQU1FLCByZXR1cm5pbmcgaXQKKworICAgIElmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgcGF0aCBzZWdtZW50cyBpbiBQQVRIX0lORk8sIHJldHVybiBOb25lLgorICAgIE5vdGU6ICdlbnZpcm9uJyBpcyBtb2RpZmllZCBpbi1wbGFjZTsgdXNlIGEgY29weSBpZiB5b3UgbmVlZCB0byBrZWVwCisgICAgdGhlIG9yaWdpbmFsIFBBVEhfSU5GTyBvciBTQ1JJUFRfTkFNRS4KKworICAgIE5vdGU6IHdoZW4gUEFUSF9JTkZPIGlzIGp1c3QgYSAnLycsIHRoaXMgcmV0dXJucyAnJyBhbmQgYXBwZW5kcyBhIHRyYWlsaW5nCisgICAgJy8nIHRvIFNDUklQVF9OQU1FLCBldmVuIHRob3VnaCBlbXB0eSBwYXRoIHNlZ21lbnRzIGFyZSBub3JtYWxseSBpZ25vcmVkLAorICAgIGFuZCBTQ1JJUFRfTkFNRSBkb2Vzbid0IG5vcm1hbGx5IGVuZCBpbiBhICcvJy4gIFRoaXMgaXMgaW50ZW50aW9uYWwKKyAgICBiZWhhdmlvciwgdG8gZW5zdXJlIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICAgICcveCcgYW5kICcveC8nIHdoZW4gdHJhdmVyc2luZyB0byBvYmplY3RzLgorICAgICIiIgorICAgIHBhdGhfaW5mbyA9IGVudmlyb24uZ2V0KCdQQVRIX0lORk8nLCcnKQorICAgIGlmIG5vdCBwYXRoX2luZm86CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBwYXRoX3BhcnRzID0gcGF0aF9pbmZvLnNwbGl0KCcvJykKKyAgICBwYXRoX3BhcnRzWzE6LTFdID0gW3AgZm9yIHAgaW4gcGF0aF9wYXJ0c1sxOi0xXSBpZiBwIGFuZCBwICE9ICcuJ10KKyAgICBuYW1lID0gcGF0aF9wYXJ0c1sxXQorICAgIGRlbCBwYXRoX3BhcnRzWzFdCisKKyAgICBzY3JpcHRfbmFtZSA9IGVudmlyb24uZ2V0KCdTQ1JJUFRfTkFNRScsJycpCisgICAgc2NyaXB0X25hbWUgPSBwb3NpeHBhdGgubm9ybXBhdGgoc2NyaXB0X25hbWUrJy8nK25hbWUpCisgICAgaWYgc2NyaXB0X25hbWUuZW5kc3dpdGgoJy8nKToKKyAgICAgICAgc2NyaXB0X25hbWUgPSBzY3JpcHRfbmFtZVs6LTFdCisgICAgaWYgbm90IG5hbWUgYW5kIG5vdCBzY3JpcHRfbmFtZS5lbmRzd2l0aCgnLycpOgorICAgICAgICBzY3JpcHRfbmFtZSArPSAnLycKKworICAgIGVudmlyb25bJ1NDUklQVF9OQU1FJ10gPSBzY3JpcHRfbmFtZQorICAgIGVudmlyb25bJ1BBVEhfSU5GTyddICAgPSAnLycuam9pbihwYXRoX3BhcnRzKQorCisgICAgIyBTcGVjaWFsIGNhc2U6ICcvLicgb24gUEFUSF9JTkZPIGRvZXNuJ3QgZ2V0IHN0cmlwcGVkLAorICAgICMgYmVjYXVzZSB3ZSBkb24ndCBzdHJpcCB0aGUgbGFzdCBlbGVtZW50IG9mIFBBVEhfSU5GTworICAgICMgaWYgdGhlcmUncyBvbmx5IG9uZSBwYXRoIHBhcnQgbGVmdC4gIEluc3RlYWQgb2YgZml4aW5nIHRoaXMKKyAgICAjIGFib3ZlLCB3ZSBmaXggaXQgaGVyZSBzbyB0aGF0IFBBVEhfSU5GTyBnZXRzIG5vcm1hbGl6ZWQgdG8KKyAgICAjIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUgZW52aXJvbi4KKyAgICBpZiBuYW1lPT0nLic6CisgICAgICAgIG5hbWUgPSBOb25lCisgICAgcmV0dXJuIG5hbWUKKworZGVmIHNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoZW52aXJvbik6CisgICAgIiIiVXBkYXRlICdlbnZpcm9uJyB3aXRoIHRyaXZpYWwgZGVmYXVsdHMgZm9yIHRlc3RpbmcgcHVycG9zZXMKKworICAgIFRoaXMgYWRkcyB2YXJpb3VzIHBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIFdTR0ksIGluY2x1ZGluZyBIVFRQX0hPU1QsCisgICAgU0VSVkVSX05BTUUsIFNFUlZFUl9QT1JULCBSRVFVRVNUX01FVEhPRCwgU0NSSVBUX05BTUUsIFBBVEhfSU5GTywKKyAgICBhbmQgYWxsIG9mIHRoZSB3c2dpLiogdmFyaWFibGVzLiAgSXQgb25seSBzdXBwbGllcyBkZWZhdWx0IHZhbHVlcywKKyAgICBhbmQgZG9lcyBub3QgcmVwbGFjZSBhbnkgZXhpc3Rpbmcgc2V0dGluZ3MgZm9yIHRoZXNlIHZhcmlhYmxlcy4KKworICAgIFRoaXMgcm91dGluZSBpcyBpbnRlbmRlZCB0byBtYWtlIGl0IGVhc2llciBmb3IgdW5pdCB0ZXN0cyBvZiBXU0dJCisgICAgc2VydmVycyBhbmQgYXBwbGljYXRpb25zIHRvIHNldCB1cCBkdW1teSBlbnZpcm9ubWVudHMuICBJdCBzaG91bGQgKm5vdCoKKyAgICBiZSB1c2VkIGJ5IGFjdHVhbCBXU0dJIHNlcnZlcnMgb3IgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgZGF0YSBpcyBmYWtlIQorICAgICIiIgorCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdTRVJWRVJfTkFNRScsJzEyNy4wLjAuMScpCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdTRVJWRVJfUFJPVE9DT0wnLCdIVFRQLzEuMCcpCisKKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ0hUVFBfSE9TVCcsZW52aXJvblsnU0VSVkVSX05BTUUnXSkKKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ1JFUVVFU1RfTUVUSE9EJywnR0VUJykKKworICAgIGlmICdTQ1JJUFRfTkFNRScgbm90IGluIGVudmlyb24gYW5kICdQQVRIX0lORk8nIG5vdCBpbiBlbnZpcm9uOgorICAgICAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ1NDUklQVF9OQU1FJywnJykKKyAgICAgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdQQVRIX0lORk8nLCcvJykKKworICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS52ZXJzaW9uJywgKDEsMCkpCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCd3c2dpLnJ1bl9vbmNlJywgMCkKKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ3dzZ2kubXVsdGl0aHJlYWQnLCAwKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS5tdWx0aXByb2Nlc3MnLCAwKQorCisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ3dzZ2kuaW5wdXQnLCBTdHJpbmdJTygiIikpCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCd3c2dpLmVycm9ycycsIFN0cmluZ0lPKCkpCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCd3c2dpLnVybF9zY2hlbWUnLGd1ZXNzX3NjaGVtZShlbnZpcm9uKSkKKworICAgIGlmIGVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddPT0naHR0cCc6CisgICAgICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnU0VSVkVSX1BPUlQnLCAnODAnKQorICAgIGVsaWYgZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ109PSdodHRwcyc6CisgICAgICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnU0VSVkVSX1BPUlQnLCAnNDQzJykKKworCisKK19ob3BwaXNoID0geworICAgICdjb25uZWN0aW9uJzoxLCAna2VlcC1hbGl2ZSc6MSwgJ3Byb3h5LWF1dGhlbnRpY2F0ZSc6MSwKKyAgICAncHJveHktYXV0aG9yaXphdGlvbic6MSwgJ3RlJzoxLCAndHJhaWxlcnMnOjEsICd0cmFuc2Zlci1lbmNvZGluZyc6MSwKKyAgICAndXBncmFkZSc6MQorfS5fX2NvbnRhaW5zX18KKworZGVmIGlzX2hvcF9ieV9ob3AoaGVhZGVyX25hbWUpOgorICAgICIiIlJldHVybiB0cnVlIGlmICdoZWFkZXJfbmFtZScgaXMgYW4gSFRUUC8xLjEgIkhvcC1ieS1Ib3AiIGhlYWRlciIiIgorICAgIHJldHVybiBfaG9wcGlzaChoZWFkZXJfbmFtZS5sb3dlcigpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL3V0aWwucHljIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDczZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvdXRpbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL3V0aWwucHlvIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDczZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvdXRpbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL3ZhbGlkYXRlLnB5IGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3ZhbGlkYXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTg5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvdmFsaWRhdGUucHkKQEAgLTAsMCArMSw0MzIgQEAKKyMgKGMpIDIwMDUgSWFuIEJpY2tpbmcgYW5kIGNvbnRyaWJ1dG9yczsgd3JpdHRlbiBmb3IgUGFzdGUgKGh0dHA6Ly9weXRob25wYXN0ZS5vcmcpCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKKyMgQWxzbyBsaWNlbmNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIDIuMDogaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2FwYWNoZTIuMC5waHAKKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50CisiIiIKK01pZGRsZXdhcmUgdG8gY2hlY2sgZm9yIG9iZWRpZW5jZSB0byB0aGUgV1NHSSBzcGVjaWZpY2F0aW9uLgorCitTb21lIG9mIHRoZSB0aGluZ3MgdGhpcyBjaGVja3M6CisKKyogU2lnbmF0dXJlIG9mIHRoZSBhcHBsaWNhdGlvbiBhbmQgc3RhcnRfcmVzcG9uc2UgKGluY2x1ZGluZyB0aGF0CisgIGtleXdvcmQgYXJndW1lbnRzIGFyZSBub3QgdXNlZCkuCisKKyogRW52aXJvbm1lbnQgY2hlY2tzOgorCisgIC0gRW52aXJvbm1lbnQgaXMgYSBkaWN0aW9uYXJ5IChhbmQgbm90IGEgc3ViY2xhc3MpLgorCisgIC0gVGhhdCBhbGwgdGhlIHJlcXVpcmVkIGtleXMgYXJlIGluIHRoZSBlbnZpcm9ubWVudDogUkVRVUVTVF9NRVRIT0QsCisgICAgU0VSVkVSX05BTUUsIFNFUlZFUl9QT1JULCB3c2dpLnZlcnNpb24sIHdzZ2kuaW5wdXQsIHdzZ2kuZXJyb3JzLAorICAgIHdzZ2kubXVsdGl0aHJlYWQsIHdzZ2kubXVsdGlwcm9jZXNzLCB3c2dpLnJ1bl9vbmNlCisKKyAgLSBUaGF0IEhUVFBfQ09OVEVOVF9UWVBFIGFuZCBIVFRQX0NPTlRFTlRfTEVOR1RIIGFyZSBub3QgaW4gdGhlCisgICAgZW52aXJvbm1lbnQgKHRoZXNlIGhlYWRlcnMgc2hvdWxkIGFwcGVhciBhcyBDT05URU5UX0xFTkdUSCBhbmQKKyAgICBDT05URU5UX1RZUEUpLgorCisgIC0gV2FybnMgaWYgUVVFUllfU1RSSU5HIGlzIG1pc3NpbmcsIGFzIHRoZSBjZ2kgbW9kdWxlIGFjdHMKKyAgICB1bnByZWRpY3RhYmx5IGluIHRoYXQgY2FzZS4KKworICAtIFRoYXQgQ0dJLXN0eWxlIHZhcmlhYmxlcyAodGhhdCBkb24ndCBjb250YWluIGEgLikgaGF2ZQorICAgIChub24tdW5pY29kZSkgc3RyaW5nIHZhbHVlcworCisgIC0gVGhhdCB3c2dpLnZlcnNpb24gaXMgYSB0dXBsZQorCisgIC0gVGhhdCB3c2dpLnVybF9zY2hlbWUgaXMgJ2h0dHAnIG9yICdodHRwcycgKEBAOiBpcyB0aGlzIHRvbworICAgIHJlc3RyaWN0aXZlPykKKworICAtIFdhcm5zIGlmIHRoZSBSRVFVRVNUX01FVEhPRCBpcyBub3Qga25vd24gKEBAOiBwcm9iYWJseSB0b28KKyAgICByZXN0cmljdGl2ZSkuCisKKyAgLSBUaGF0IFNDUklQVF9OQU1FIGFuZCBQQVRIX0lORk8gYXJlIGVtcHR5IG9yIHN0YXJ0IHdpdGggLworCisgIC0gVGhhdCBhdCBsZWFzdCBvbmUgb2YgU0NSSVBUX05BTUUgb3IgUEFUSF9JTkZPIGFyZSBzZXQuCisKKyAgLSBUaGF0IENPTlRFTlRfTEVOR1RIIGlzIGEgcG9zaXRpdmUgaW50ZWdlci4KKworICAtIFRoYXQgU0NSSVBUX05BTUUgaXMgbm90ICcvJyAoaXQgc2hvdWxkIGJlICcnLCBhbmQgUEFUSF9JTkZPIHNob3VsZAorICAgIGJlICcvJykuCisKKyAgLSBUaGF0IHdzZ2kuaW5wdXQgaGFzIHRoZSBtZXRob2RzIHJlYWQsIHJlYWRsaW5lLCByZWFkbGluZXMsIGFuZAorICAgIF9faXRlcl9fCisKKyAgLSBUaGF0IHdzZ2kuZXJyb3JzIGhhcyB0aGUgbWV0aG9kcyBmbHVzaCwgd3JpdGUsIHdyaXRlbGluZXMKKworKiBUaGUgc3RhdHVzIGlzIGEgc3RyaW5nLCBjb250YWlucyBhIHNwYWNlLCBzdGFydHMgd2l0aCBhbiBpbnRlZ2VyLAorICBhbmQgdGhhdCBpbnRlZ2VyIGlzIGluIHJhbmdlICg+IDEwMCkuCisKKyogVGhhdCB0aGUgaGVhZGVycyBpcyBhIGxpc3QgKG5vdCBhIHN1YmNsYXNzLCBub3QgYW5vdGhlciBraW5kIG9mCisgIHNlcXVlbmNlKS4KKworKiBUaGF0IHRoZSBpdGVtcyBvZiB0aGUgaGVhZGVycyBhcmUgdHVwbGVzIG9mIHN0cmluZ3MuCisKKyogVGhhdCB0aGVyZSBpcyBubyAnc3RhdHVzJyBoZWFkZXIgKHRoYXQgaXMgdXNlZCBpbiBDR0ksIGJ1dCBub3QgaW4KKyAgV1NHSSkuCisKKyogVGhhdCB0aGUgaGVhZGVycyBkb24ndCBjb250YWluIG5ld2xpbmVzIG9yIGNvbG9ucywgZW5kIGluIF8gb3IgLSwgb3IKKyAgY29udGFpbiBjaGFyYWN0ZXJzIGNvZGVzIGJlbG93IDAzNy4KKworKiBUaGF0IENvbnRlbnQtVHlwZSBpcyBnaXZlbiBpZiB0aGVyZSBpcyBjb250ZW50IChDR0kgb2Z0ZW4gaGFzIGEKKyAgZGVmYXVsdCBjb250ZW50IHR5cGUsIGJ1dCBXU0dJIGRvZXMgbm90KS4KKworKiBUaGF0IG5vIENvbnRlbnQtVHlwZSBpcyBnaXZlbiB3aGVuIHRoZXJlIGlzIG5vIGNvbnRlbnQgKEBAOiBpcyB0aGlzCisgIHRvbyByZXN0cmljdGl2ZT8pCisKKyogVGhhdCB0aGUgZXhjX2luZm8gYXJndW1lbnQgdG8gc3RhcnRfcmVzcG9uc2UgaXMgYSB0dXBsZSBvciBOb25lLgorCisqIFRoYXQgYWxsIGNhbGxzIHRvIHRoZSB3cml0ZXIgYXJlIHdpdGggc3RyaW5ncywgYW5kIG5vIG90aGVyIG1ldGhvZHMKKyAgb24gdGhlIHdyaXRlciBhcmUgYWNjZXNzZWQuCisKKyogVGhhdCB3c2dpLmlucHV0IGlzIHVzZWQgcHJvcGVybHk6CisKKyAgLSAucmVhZCgpIGlzIGNhbGxlZCB3aXRoIHplcm8gb3Igb25lIGFyZ3VtZW50CisKKyAgLSBUaGF0IGl0IHJldHVybnMgYSBzdHJpbmcKKworICAtIFRoYXQgcmVhZGxpbmUsIHJlYWRsaW5lcywgYW5kIF9faXRlcl9fIHJldHVybiBzdHJpbmdzCisKKyAgLSBUaGF0IC5jbG9zZSgpIGlzIG5vdCBjYWxsZWQKKworICAtIE5vIG90aGVyIG1ldGhvZHMgYXJlIHByb3ZpZGVkCisKKyogVGhhdCB3c2dpLmVycm9ycyBpcyB1c2VkIHByb3Blcmx5OgorCisgIC0gLndyaXRlKCkgYW5kIC53cml0ZWxpbmVzKCkgaXMgY2FsbGVkIHdpdGggYSBzdHJpbmcKKworICAtIFRoYXQgLmNsb3NlKCkgaXMgbm90IGNhbGxlZCwgYW5kIG5vIG90aGVyIG1ldGhvZHMgYXJlIHByb3ZpZGVkLgorCisqIFRoZSByZXNwb25zZSBpdGVyYXRvcjoKKworICAtIFRoYXQgaXQgaXMgbm90IGEgc3RyaW5nIChpdCBzaG91bGQgYmUgYSBsaXN0IG9mIGEgc2luZ2xlIHN0cmluZzsgYQorICAgIHN0cmluZyB3aWxsIHdvcmssIGJ1dCBwZXJmb3JtIGhvcnJpYmx5KS4KKworICAtIFRoYXQgLm5leHQoKSByZXR1cm5zIGEgc3RyaW5nCisKKyAgLSBUaGF0IHRoZSBpdGVyYXRvciBpcyBub3QgaXRlcmF0ZWQgb3ZlciB1bnRpbCBzdGFydF9yZXNwb25zZSBoYXMKKyAgICBiZWVuIGNhbGxlZCAodGhhdCBjYW4gc2lnbmFsIGVpdGhlciBhIHNlcnZlciBvciBhcHBsaWNhdGlvbgorICAgIGVycm9yKS4KKworICAtIFRoYXQgLmNsb3NlKCkgaXMgY2FsbGVkIChkb2Vzbid0IHJhaXNlIGV4Y2VwdGlvbiwgb25seSBwcmludHMgdG8KKyAgICBzeXMuc3RkZXJyLCBiZWNhdXNlIHdlIG9ubHkga25vdyBpdCBpc24ndCBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0CisgICAgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQpLgorIiIiCitfX2FsbF9fID0gWyd2YWxpZGF0b3InXQorCisKK2ltcG9ydCByZQoraW1wb3J0IHN5cworZnJvbSB0eXBlcyBpbXBvcnQgRGljdFR5cGUsIFN0cmluZ1R5cGUsIFR1cGxlVHlwZSwgTGlzdFR5cGUKK2ltcG9ydCB3YXJuaW5ncworCitoZWFkZXJfcmUgPSByZS5jb21waWxlKHInXlthLXpBLVpdW2EtekEtWjAtOVwtX10qJCcpCitiYWRfaGVhZGVyX3ZhbHVlX3JlID0gcmUuY29tcGlsZShyJ1tcMDAwLVwwMzddJykKKworY2xhc3MgV1NHSVdhcm5pbmcoV2FybmluZyk6CisgICAgIiIiCisgICAgUmFpc2VkIGluIHJlc3BvbnNlIHRvIFdTR0ktc3BlYy1yZWxhdGVkIHdhcm5pbmdzCisgICAgIiIiCisKK2RlZiBhc3NlcnRfKGNvbmQsICphcmdzKToKKyAgICBpZiBub3QgY29uZDoKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoKmFyZ3MpCisKK2RlZiB2YWxpZGF0b3IoYXBwbGljYXRpb24pOgorCisgICAgIiIiCisgICAgV2hlbiBhcHBsaWVkIGJldHdlZW4gYSBXU0dJIHNlcnZlciBhbmQgYSBXU0dJIGFwcGxpY2F0aW9uLCB0aGlzCisgICAgbWlkZGxld2FyZSB3aWxsIGNoZWNrIGZvciBXU0dJIGNvbXBsaWFuY3kgb24gYSBudW1iZXIgb2YgbGV2ZWxzLgorICAgIFRoaXMgbWlkZGxld2FyZSBkb2VzIG5vdCBtb2RpZnkgdGhlIHJlcXVlc3Qgb3IgcmVzcG9uc2UgaW4gYW55CisgICAgd2F5LCBidXQgd2lsbCByYWlzZSBhbiBBc3NlcnRpb25FcnJvciBpZiBhbnl0aGluZyBzZWVtcyBvZmYKKyAgICAoZXhjZXB0IGZvciBhIGZhaWx1cmUgdG8gY2xvc2UgdGhlIGFwcGxpY2F0aW9uIGl0ZXJhdG9yLCB3aGljaAorICAgIHdpbGwgYmUgcHJpbnRlZCB0byBzdGRlcnIgLS0gdGhlcmUncyBubyB3YXkgdG8gcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgYXQgdGhhdCBwb2ludCkuCisgICAgIiIiCisKKyAgICBkZWYgbGludF9hcHAoKmFyZ3MsICoqa3cpOgorICAgICAgICBhc3NlcnRfKGxlbihhcmdzKSA9PSAyLCAiVHdvIGFyZ3VtZW50cyByZXF1aXJlZCIpCisgICAgICAgIGFzc2VydF8obm90IGt3LCAiTm8ga2V5d29yZCBhcmd1bWVudHMgYWxsb3dlZCIpCisgICAgICAgIGVudmlyb24sIHN0YXJ0X3Jlc3BvbnNlID0gYXJncworCisgICAgICAgIGNoZWNrX2Vudmlyb24oZW52aXJvbikKKworICAgICAgICAjIFdlIHVzZSB0aGlzIHRvIGNoZWNrIGlmIHRoZSBhcHBsaWNhdGlvbiByZXR1cm5zIHdpdGhvdXQKKyAgICAgICAgIyBjYWxsaW5nIHN0YXJ0X3Jlc3BvbnNlOgorICAgICAgICBzdGFydF9yZXNwb25zZV9zdGFydGVkID0gW10KKworICAgICAgICBkZWYgc3RhcnRfcmVzcG9uc2Vfd3JhcHBlcigqYXJncywgKiprdyk6CisgICAgICAgICAgICBhc3NlcnRfKGxlbihhcmdzKSA9PSAyIG9yIGxlbihhcmdzKSA9PSAzLCAoCisgICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50czogJXMiICUgKGFyZ3MsKSkpCisgICAgICAgICAgICBhc3NlcnRfKG5vdCBrdywgIk5vIGtleXdvcmQgYXJndW1lbnRzIGFsbG93ZWQiKQorICAgICAgICAgICAgc3RhdHVzID0gYXJnc1swXQorICAgICAgICAgICAgaGVhZGVycyA9IGFyZ3NbMV0KKyAgICAgICAgICAgIGlmIGxlbihhcmdzKSA9PSAzOgorICAgICAgICAgICAgICAgIGV4Y19pbmZvID0gYXJnc1syXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleGNfaW5mbyA9IE5vbmUKKworICAgICAgICAgICAgY2hlY2tfc3RhdHVzKHN0YXR1cykKKyAgICAgICAgICAgIGNoZWNrX2hlYWRlcnMoaGVhZGVycykKKyAgICAgICAgICAgIGNoZWNrX2NvbnRlbnRfdHlwZShzdGF0dXMsIGhlYWRlcnMpCisgICAgICAgICAgICBjaGVja19leGNfaW5mbyhleGNfaW5mbykKKworICAgICAgICAgICAgc3RhcnRfcmVzcG9uc2Vfc3RhcnRlZC5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgIHJldHVybiBXcml0ZVdyYXBwZXIoc3RhcnRfcmVzcG9uc2UoKmFyZ3MpKQorCisgICAgICAgIGVudmlyb25bJ3dzZ2kuaW5wdXQnXSA9IElucHV0V3JhcHBlcihlbnZpcm9uWyd3c2dpLmlucHV0J10pCisgICAgICAgIGVudmlyb25bJ3dzZ2kuZXJyb3JzJ10gPSBFcnJvcldyYXBwZXIoZW52aXJvblsnd3NnaS5lcnJvcnMnXSkKKworICAgICAgICBpdGVyYXRvciA9IGFwcGxpY2F0aW9uKGVudmlyb24sIHN0YXJ0X3Jlc3BvbnNlX3dyYXBwZXIpCisgICAgICAgIGFzc2VydF8oaXRlcmF0b3IgaXMgbm90IE5vbmUgYW5kIGl0ZXJhdG9yICE9IEZhbHNlLAorICAgICAgICAgICAgIlRoZSBhcHBsaWNhdGlvbiBtdXN0IHJldHVybiBhbiBpdGVyYXRvciwgaWYgb25seSBhbiBlbXB0eSBsaXN0IikKKworICAgICAgICBjaGVja19pdGVyYXRvcihpdGVyYXRvcikKKworICAgICAgICByZXR1cm4gSXRlcmF0b3JXcmFwcGVyKGl0ZXJhdG9yLCBzdGFydF9yZXNwb25zZV9zdGFydGVkKQorCisgICAgcmV0dXJuIGxpbnRfYXBwCisKK2NsYXNzIElucHV0V3JhcHBlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3c2dpX2lucHV0KToKKyAgICAgICAgc2VsZi5pbnB1dCA9IHdzZ2lfaW5wdXQKKworICAgIGRlZiByZWFkKHNlbGYsICphcmdzKToKKyAgICAgICAgYXNzZXJ0XyhsZW4oYXJncykgPD0gMSkKKyAgICAgICAgdiA9IHNlbGYuaW5wdXQucmVhZCgqYXJncykKKyAgICAgICAgYXNzZXJ0Xyh0eXBlKHYpIGlzIHR5cGUoIiIpKQorICAgICAgICByZXR1cm4gdgorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICB2ID0gc2VsZi5pbnB1dC5yZWFkbGluZSgpCisgICAgICAgIGFzc2VydF8odHlwZSh2KSBpcyB0eXBlKCIiKSkKKyAgICAgICAgcmV0dXJuIHYKKworICAgIGRlZiByZWFkbGluZXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBhc3NlcnRfKGxlbihhcmdzKSA8PSAxKQorICAgICAgICBsaW5lcyA9IHNlbGYuaW5wdXQucmVhZGxpbmVzKCphcmdzKQorICAgICAgICBhc3NlcnRfKHR5cGUobGluZXMpIGlzIHR5cGUoW10pKQorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIGFzc2VydF8odHlwZShsaW5lKSBpcyB0eXBlKCIiKSkKKyAgICAgICAgcmV0dXJuIGxpbmVzCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHlpZWxkIGxpbmUKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgYXNzZXJ0XygwLCAiaW5wdXQuY2xvc2UoKSBtdXN0IG5vdCBiZSBjYWxsZWQiKQorCitjbGFzcyBFcnJvcldyYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd3NnaV9lcnJvcnMpOgorICAgICAgICBzZWxmLmVycm9ycyA9IHdzZ2lfZXJyb3JzCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CisgICAgICAgIGFzc2VydF8odHlwZShzKSBpcyB0eXBlKCIiKSkKKyAgICAgICAgc2VsZi5lcnJvcnMud3JpdGUocykKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5lcnJvcnMuZmx1c2goKQorCisgICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgc2VxKToKKyAgICAgICAgZm9yIGxpbmUgaW4gc2VxOgorICAgICAgICAgICAgc2VsZi53cml0ZShsaW5lKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBhc3NlcnRfKDAsICJlcnJvcnMuY2xvc2UoKSBtdXN0IG5vdCBiZSBjYWxsZWQiKQorCitjbGFzcyBXcml0ZVdyYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd3NnaV93cml0ZXIpOgorICAgICAgICBzZWxmLndyaXRlciA9IHdzZ2lfd3JpdGVyCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcyk6CisgICAgICAgIGFzc2VydF8odHlwZShzKSBpcyB0eXBlKCIiKSkKKyAgICAgICAgc2VsZi53cml0ZXIocykKKworY2xhc3MgUGFydGlhbEl0ZXJhdG9yV3JhcHBlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3c2dpX2l0ZXJhdG9yKToKKyAgICAgICAgc2VsZi5pdGVyYXRvciA9IHdzZ2lfaXRlcmF0b3IKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgIyBXZSB3YW50IHRvIG1ha2Ugc3VyZSBfX2l0ZXJfXyBpcyBjYWxsZWQKKyAgICAgICAgcmV0dXJuIEl0ZXJhdG9yV3JhcHBlcihzZWxmLml0ZXJhdG9yLCBOb25lKQorCitjbGFzcyBJdGVyYXRvcldyYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd3NnaV9pdGVyYXRvciwgY2hlY2tfc3RhcnRfcmVzcG9uc2UpOgorICAgICAgICBzZWxmLm9yaWdpbmFsX2l0ZXJhdG9yID0gd3NnaV9pdGVyYXRvcgorICAgICAgICBzZWxmLml0ZXJhdG9yID0gaXRlcih3c2dpX2l0ZXJhdG9yKQorICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuY2hlY2tfc3RhcnRfcmVzcG9uc2UgPSBjaGVja19zdGFydF9yZXNwb25zZQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGFzc2VydF8obm90IHNlbGYuY2xvc2VkLAorICAgICAgICAgICAgIkl0ZXJhdG9yIHJlYWQgYWZ0ZXIgY2xvc2VkIikKKyAgICAgICAgdiA9IHNlbGYuaXRlcmF0b3IubmV4dCgpCisgICAgICAgIGlmIHNlbGYuY2hlY2tfc3RhcnRfcmVzcG9uc2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhc3NlcnRfKHNlbGYuY2hlY2tfc3RhcnRfcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgIlRoZSBhcHBsaWNhdGlvbiByZXR1cm5zIGFuZCB3ZSBzdGFydGVkIGl0ZXJhdGluZyBvdmVyIGl0cyBib2R5LCBidXQgc3RhcnRfcmVzcG9uc2UgaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQiKQorICAgICAgICAgICAgc2VsZi5jaGVja19zdGFydF9yZXNwb25zZSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHYKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5vcmlnaW5hbF9pdGVyYXRvciwgJ2Nsb3NlJyk6CisgICAgICAgICAgICBzZWxmLm9yaWdpbmFsX2l0ZXJhdG9yLmNsb3NlKCkKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKAorICAgICAgICAgICAgICAgICJJdGVyYXRvciBnYXJiYWdlIGNvbGxlY3RlZCB3aXRob3V0IGJlaW5nIGNsb3NlZCIpCisgICAgICAgIGFzc2VydF8oc2VsZi5jbG9zZWQsCisgICAgICAgICAgICAiSXRlcmF0b3IgZ2FyYmFnZSBjb2xsZWN0ZWQgd2l0aG91dCBiZWluZyBjbG9zZWQiKQorCitkZWYgY2hlY2tfZW52aXJvbihlbnZpcm9uKToKKyAgICBhc3NlcnRfKHR5cGUoZW52aXJvbikgaXMgRGljdFR5cGUsCisgICAgICAgICJFbnZpcm9ubWVudCBpcyBub3Qgb2YgdGhlIHJpZ2h0IHR5cGU6ICVyIChlbnZpcm9ubWVudDogJXIpIgorICAgICAgICAlICh0eXBlKGVudmlyb24pLCBlbnZpcm9uKSkKKworICAgIGZvciBrZXkgaW4gWydSRVFVRVNUX01FVEhPRCcsICdTRVJWRVJfTkFNRScsICdTRVJWRVJfUE9SVCcsCisgICAgICAgICAgICAgICAgJ3dzZ2kudmVyc2lvbicsICd3c2dpLmlucHV0JywgJ3dzZ2kuZXJyb3JzJywKKyAgICAgICAgICAgICAgICAnd3NnaS5tdWx0aXRocmVhZCcsICd3c2dpLm11bHRpcHJvY2VzcycsCisgICAgICAgICAgICAgICAgJ3dzZ2kucnVuX29uY2UnXToKKyAgICAgICAgYXNzZXJ0XyhrZXkgaW4gZW52aXJvbiwKKyAgICAgICAgICAgICJFbnZpcm9ubWVudCBtaXNzaW5nIHJlcXVpcmVkIGtleTogJXIiICUgKGtleSwpKQorCisgICAgZm9yIGtleSBpbiBbJ0hUVFBfQ09OVEVOVF9UWVBFJywgJ0hUVFBfQ09OVEVOVF9MRU5HVEgnXToKKyAgICAgICAgYXNzZXJ0XyhrZXkgbm90IGluIGVudmlyb24sCisgICAgICAgICAgICAiRW52aXJvbm1lbnQgc2hvdWxkIG5vdCBoYXZlIHRoZSBrZXk6ICVzICIKKyAgICAgICAgICAgICIodXNlICVzIGluc3RlYWQpIiAlIChrZXksIGtleVs1Ol0pKQorCisgICAgaWYgJ1FVRVJZX1NUUklORycgbm90IGluIGVudmlyb246CisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAnUVVFUllfU1RSSU5HIGlzIG5vdCBpbiB0aGUgV1NHSSBlbnZpcm9ubWVudDsgdGhlIGNnaSAnCisgICAgICAgICAgICAnbW9kdWxlIHdpbGwgdXNlIHN5cy5hcmd2IHdoZW4gdGhpcyB2YXJpYWJsZSBpcyBtaXNzaW5nLCAnCisgICAgICAgICAgICAnc28gYXBwbGljYXRpb24gZXJyb3JzIGFyZSBtb3JlIGxpa2VseScsCisgICAgICAgICAgICBXU0dJV2FybmluZykKKworICAgIGZvciBrZXkgaW4gZW52aXJvbi5rZXlzKCk6CisgICAgICAgIGlmICcuJyBpbiBrZXk6CisgICAgICAgICAgICAjIEV4dGVuc2lvbiwgd2UgZG9uJ3QgY2FyZSBhYm91dCBpdHMgdHlwZQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYXNzZXJ0Xyh0eXBlKGVudmlyb25ba2V5XSkgaXMgU3RyaW5nVHlwZSwKKyAgICAgICAgICAgICJFbnZpcm9ubWVudGFsIHZhcmlhYmxlICVzIGlzIG5vdCBhIHN0cmluZzogJXIgKHZhbHVlOiAlcikiCisgICAgICAgICAgICAlIChrZXksIHR5cGUoZW52aXJvbltrZXldKSwgZW52aXJvbltrZXldKSkKKworICAgIGFzc2VydF8odHlwZShlbnZpcm9uWyd3c2dpLnZlcnNpb24nXSkgaXMgVHVwbGVUeXBlLAorICAgICAgICAid3NnaS52ZXJzaW9uIHNob3VsZCBiZSBhIHR1cGxlICglcikiICUgKGVudmlyb25bJ3dzZ2kudmVyc2lvbiddLCkpCisgICAgYXNzZXJ0XyhlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXSBpbiAoJ2h0dHAnLCAnaHR0cHMnKSwKKyAgICAgICAgIndzZ2kudXJsX3NjaGVtZSB1bmtub3duOiAlciIgJSBlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXSkKKworICAgIGNoZWNrX2lucHV0KGVudmlyb25bJ3dzZ2kuaW5wdXQnXSkKKyAgICBjaGVja19lcnJvcnMoZW52aXJvblsnd3NnaS5lcnJvcnMnXSkKKworICAgICMgQEA6IHRoZXNlIG5lZWQgZmlsbGluZyBvdXQ6CisgICAgaWYgZW52aXJvblsnUkVRVUVTVF9NRVRIT0QnXSBub3QgaW4gKAorICAgICAgICAnR0VUJywgJ0hFQUQnLCAnUE9TVCcsICdPUFRJT05TJywnUFVUJywnREVMRVRFJywnVFJBQ0UnKToKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICJVbmtub3duIFJFUVVFU1RfTUVUSE9EOiAlciIgJSBlbnZpcm9uWydSRVFVRVNUX01FVEhPRCddLAorICAgICAgICAgICAgV1NHSVdhcm5pbmcpCisKKyAgICBhc3NlcnRfKG5vdCBlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnKQorICAgICAgICAgICAgb3IgZW52aXJvblsnU0NSSVBUX05BTUUnXS5zdGFydHN3aXRoKCcvJyksCisgICAgICAgICJTQ1JJUFRfTkFNRSBkb2Vzbid0IHN0YXJ0IHdpdGggLzogJXIiICUgZW52aXJvblsnU0NSSVBUX05BTUUnXSkKKyAgICBhc3NlcnRfKG5vdCBlbnZpcm9uLmdldCgnUEFUSF9JTkZPJykKKyAgICAgICAgICAgIG9yIGVudmlyb25bJ1BBVEhfSU5GTyddLnN0YXJ0c3dpdGgoJy8nKSwKKyAgICAgICAgIlBBVEhfSU5GTyBkb2Vzbid0IHN0YXJ0IHdpdGggLzogJXIiICUgZW52aXJvblsnUEFUSF9JTkZPJ10pCisgICAgaWYgZW52aXJvbi5nZXQoJ0NPTlRFTlRfTEVOR1RIJyk6CisgICAgICAgIGFzc2VydF8oaW50KGVudmlyb25bJ0NPTlRFTlRfTEVOR1RIJ10pID49IDAsCisgICAgICAgICAgICAiSW52YWxpZCBDT05URU5UX0xFTkdUSDogJXIiICUgZW52aXJvblsnQ09OVEVOVF9MRU5HVEgnXSkKKworICAgIGlmIG5vdCBlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnKToKKyAgICAgICAgYXNzZXJ0XygnUEFUSF9JTkZPJyBpbiBlbnZpcm9uLAorICAgICAgICAgICAgIk9uZSBvZiBTQ1JJUFRfTkFNRSBvciBQQVRIX0lORk8gYXJlIHJlcXVpcmVkIChQQVRIX0lORk8gIgorICAgICAgICAgICAgInNob3VsZCBhdCBsZWFzdCBiZSAnLycgaWYgU0NSSVBUX05BTUUgaXMgZW1wdHkpIikKKyAgICBhc3NlcnRfKGVudmlyb24uZ2V0KCdTQ1JJUFRfTkFNRScpICE9ICcvJywKKyAgICAgICAgIlNDUklQVF9OQU1FIGNhbm5vdCBiZSAnLyc7IGl0IHNob3VsZCBpbnN0ZWFkIGJlICcnLCBhbmQgIgorICAgICAgICAiUEFUSF9JTkZPIHNob3VsZCBiZSAnLyciKQorCitkZWYgY2hlY2tfaW5wdXQod3NnaV9pbnB1dCk6CisgICAgZm9yIGF0dHIgaW4gWydyZWFkJywgJ3JlYWRsaW5lJywgJ3JlYWRsaW5lcycsICdfX2l0ZXJfXyddOgorICAgICAgICBhc3NlcnRfKGhhc2F0dHIod3NnaV9pbnB1dCwgYXR0ciksCisgICAgICAgICAgICAid3NnaS5pbnB1dCAoJXIpIGRvZXNuJ3QgaGF2ZSB0aGUgYXR0cmlidXRlICVzIgorICAgICAgICAgICAgJSAod3NnaV9pbnB1dCwgYXR0cikpCisKK2RlZiBjaGVja19lcnJvcnMod3NnaV9lcnJvcnMpOgorICAgIGZvciBhdHRyIGluIFsnZmx1c2gnLCAnd3JpdGUnLCAnd3JpdGVsaW5lcyddOgorICAgICAgICBhc3NlcnRfKGhhc2F0dHIod3NnaV9lcnJvcnMsIGF0dHIpLAorICAgICAgICAgICAgIndzZ2kuZXJyb3JzICglcikgZG9lc24ndCBoYXZlIHRoZSBhdHRyaWJ1dGUgJXMiCisgICAgICAgICAgICAlICh3c2dpX2Vycm9ycywgYXR0cikpCisKK2RlZiBjaGVja19zdGF0dXMoc3RhdHVzKToKKyAgICBhc3NlcnRfKHR5cGUoc3RhdHVzKSBpcyBTdHJpbmdUeXBlLAorICAgICAgICAiU3RhdHVzIG11c3QgYmUgYSBzdHJpbmcgKG5vdCAlcikiICUgc3RhdHVzKQorICAgICMgSW1wbGljaXRseSBjaGVjayB0aGF0IHdlIGNhbiB0dXJuIGl0IGludG8gYW4gaW50ZWdlcjoKKyAgICBzdGF0dXNfY29kZSA9IHN0YXR1cy5zcGxpdChOb25lLCAxKVswXQorICAgIGFzc2VydF8obGVuKHN0YXR1c19jb2RlKSA9PSAzLAorICAgICAgICAiU3RhdHVzIGNvZGVzIG11c3QgYmUgdGhyZWUgY2hhcmFjdGVyczogJXIiICUgc3RhdHVzX2NvZGUpCisgICAgc3RhdHVzX2ludCA9IGludChzdGF0dXNfY29kZSkKKyAgICBhc3NlcnRfKHN0YXR1c19pbnQgPj0gMTAwLCAiU3RhdHVzIGNvZGUgaXMgaW52YWxpZDogJXIiICUgc3RhdHVzX2ludCkKKyAgICBpZiBsZW4oc3RhdHVzKSA8IDQgb3Igc3RhdHVzWzNdICE9ICcgJzoKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICJUaGUgc3RhdHVzIHN0cmluZyAoJXIpIHNob3VsZCBiZSBhIHRocmVlLWRpZ2l0IGludGVnZXIgIgorICAgICAgICAgICAgImZvbGxvd2VkIGJ5IGEgc2luZ2xlIHNwYWNlIGFuZCBhIHN0YXR1cyBleHBsYW5hdGlvbiIKKyAgICAgICAgICAgICUgc3RhdHVzLCBXU0dJV2FybmluZykKKworZGVmIGNoZWNrX2hlYWRlcnMoaGVhZGVycyk6CisgICAgYXNzZXJ0Xyh0eXBlKGhlYWRlcnMpIGlzIExpc3RUeXBlLAorICAgICAgICAiSGVhZGVycyAoJXIpIG11c3QgYmUgb2YgdHlwZSBsaXN0OiAlciIKKyAgICAgICAgJSAoaGVhZGVycywgdHlwZShoZWFkZXJzKSkpCisgICAgaGVhZGVyX25hbWVzID0ge30KKyAgICBmb3IgaXRlbSBpbiBoZWFkZXJzOgorICAgICAgICBhc3NlcnRfKHR5cGUoaXRlbSkgaXMgVHVwbGVUeXBlLAorICAgICAgICAgICAgIkluZGl2aWR1YWwgaGVhZGVycyAoJXIpIG11c3QgYmUgb2YgdHlwZSB0dXBsZTogJXIiCisgICAgICAgICAgICAlIChpdGVtLCB0eXBlKGl0ZW0pKSkKKyAgICAgICAgYXNzZXJ0XyhsZW4oaXRlbSkgPT0gMikKKyAgICAgICAgbmFtZSwgdmFsdWUgPSBpdGVtCisgICAgICAgIGFzc2VydF8obmFtZS5sb3dlcigpICE9ICdzdGF0dXMnLAorICAgICAgICAgICAgIlRoZSBTdGF0dXMgaGVhZGVyIGNhbm5vdCBiZSB1c2VkOyBpdCBjb25mbGljdHMgd2l0aCBDR0kgIgorICAgICAgICAgICAgInNjcmlwdCwgYW5kIEhUVFAgc3RhdHVzIGlzIG5vdCBnaXZlbiB0aHJvdWdoIGhlYWRlcnMgIgorICAgICAgICAgICAgIih2YWx1ZTogJXIpLiIgJSB2YWx1ZSkKKyAgICAgICAgaGVhZGVyX25hbWVzW25hbWUubG93ZXIoKV0gPSBOb25lCisgICAgICAgIGFzc2VydF8oJ1xuJyBub3QgaW4gbmFtZSBhbmQgJzonIG5vdCBpbiBuYW1lLAorICAgICAgICAgICAgIkhlYWRlciBuYW1lcyBtYXkgbm90IGNvbnRhaW4gJzonIG9yICdcXG4nOiAlciIgJSBuYW1lKQorICAgICAgICBhc3NlcnRfKGhlYWRlcl9yZS5zZWFyY2gobmFtZSksICJCYWQgaGVhZGVyIG5hbWU6ICVyIiAlIG5hbWUpCisgICAgICAgIGFzc2VydF8obm90IG5hbWUuZW5kc3dpdGgoJy0nKSBhbmQgbm90IG5hbWUuZW5kc3dpdGgoJ18nKSwKKyAgICAgICAgICAgICJOYW1lcyBtYXkgbm90IGVuZCBpbiAnLScgb3IgJ18nOiAlciIgJSBuYW1lKQorICAgICAgICBpZiBiYWRfaGVhZGVyX3ZhbHVlX3JlLnNlYXJjaCh2YWx1ZSk6CisgICAgICAgICAgICBhc3NlcnRfKDAsICJCYWQgaGVhZGVyIHZhbHVlOiAlciAoYmFkIGNoYXI6ICVyKSIKKyAgICAgICAgICAgICUgKHZhbHVlLCBiYWRfaGVhZGVyX3ZhbHVlX3JlLnNlYXJjaCh2YWx1ZSkuZ3JvdXAoMCkpKQorCitkZWYgY2hlY2tfY29udGVudF90eXBlKHN0YXR1cywgaGVhZGVycyk6CisgICAgY29kZSA9IGludChzdGF0dXMuc3BsaXQoTm9uZSwgMSlbMF0pCisgICAgIyBAQDogbmVlZCBvbmUgbW9yZSBwZXJzb24gdG8gdmVyaWZ5IHRoaXMgaW50ZXJwcmV0YXRpb24gb2YgUkZDIDI2MTYKKyAgICAjICAgICBodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwKKyAgICBOT19NRVNTQUdFX0JPRFkgPSAoMjA0LCAzMDQpCisgICAgZm9yIG5hbWUsIHZhbHVlIGluIGhlYWRlcnM6CisgICAgICAgIGlmIG5hbWUubG93ZXIoKSA9PSAnY29udGVudC10eXBlJzoKKyAgICAgICAgICAgIGlmIGNvZGUgbm90IGluIE5PX01FU1NBR0VfQk9EWToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGFzc2VydF8oMCwgKCJDb250ZW50LVR5cGUgaGVhZGVyIGZvdW5kIGluIGEgJXMgcmVzcG9uc2UsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCBtdXN0IG5vdCByZXR1cm4gY29udGVudC4iKSAlIGNvZGUpCisgICAgaWYgY29kZSBub3QgaW4gTk9fTUVTU0FHRV9CT0RZOgorICAgICAgICBhc3NlcnRfKDAsICJObyBDb250ZW50LVR5cGUgaGVhZGVyIGZvdW5kIGluIGhlYWRlcnMgKCVzKSIgJSBoZWFkZXJzKQorCitkZWYgY2hlY2tfZXhjX2luZm8oZXhjX2luZm8pOgorICAgIGFzc2VydF8oZXhjX2luZm8gaXMgTm9uZSBvciB0eXBlKGV4Y19pbmZvKSBpcyB0eXBlKCgpKSwKKyAgICAgICAgImV4Y19pbmZvICglcikgaXMgbm90IGEgdHVwbGU6ICVyIiAlIChleGNfaW5mbywgdHlwZShleGNfaW5mbykpKQorICAgICMgTW9yZSBleGNfaW5mbyBjaGVja3M/CisKK2RlZiBjaGVja19pdGVyYXRvcihpdGVyYXRvcik6CisgICAgIyBUZWNobmljYWxseSBhIHN0cmluZyBpcyBsZWdhbCwgd2hpY2ggaXMgd2h5IGl0J3MgYSByZWFsbHkgYmFkCisgICAgIyBpZGVhLCBiZWNhdXNlIGl0IG1heSBjYXVzZSB0aGUgcmVzcG9uc2UgdG8gYmUgcmV0dXJuZWQKKyAgICAjIGNoYXJhY3Rlci1ieS1jaGFyYWN0ZXIKKyAgICBhc3NlcnRfKG5vdCBpc2luc3RhbmNlKGl0ZXJhdG9yLCBzdHIpLAorICAgICAgICAiWW91IHNob3VsZCBub3QgcmV0dXJuIGEgc3RyaW5nIGFzIHlvdXIgYXBwbGljYXRpb24gaXRlcmF0b3IsICIKKyAgICAgICAgImluc3RlYWQgcmV0dXJuIGEgc2luZ2xlLWl0ZW0gbGlzdCBjb250YWluaW5nIHRoYXQgc3RyaW5nLiIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3dzZ2lyZWYvdmFsaWRhdGUucHljIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3ZhbGlkYXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzZkMDNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3ZhbGlkYXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3dzZ2lyZWYvdmFsaWRhdGUucHlvIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3ZhbGlkYXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzZkMDNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3ZhbGlkYXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3hkcmxpYi5weSBiL2xpYi9weXRob24yLjcveGRybGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMTcyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3hkcmxpYi5weQpAQCAtMCwwICsxLDIzMSBAQAorIiIiSW1wbGVtZW50cyAoYSBzdWJzZXQgb2YpIFN1biBYRFIgLS0gZVh0ZXJuYWwgRGF0YSBSZXByZXNlbnRhdGlvbi4KKworU2VlOiBSRkMgMTAxNAorCisiIiIKKworaW1wb3J0IHN0cnVjdAordHJ5OgorICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBfU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBfU3RyaW5nSU8KKworX19hbGxfXyA9IFsiRXJyb3IiLCAiUGFja2VyIiwgIlVucGFja2VyIiwgIkNvbnZlcnNpb25FcnJvciJdCisKKyMgZXhjZXB0aW9ucworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gY2xhc3MgZm9yIHRoaXMgbW9kdWxlLiBVc2U6CisKKyAgICBleGNlcHQgeGRybGliLkVycm9yLCB2YXI6CisgICAgICAgICMgdmFyIGhhcyB0aGUgRXJyb3IgaW5zdGFuY2UgZm9yIHRoZSBleGNlcHRpb24KKworICAgIFB1YmxpYyBpdmFyczoKKyAgICAgICAgbXNnIC0tIGNvbnRhaW5zIHRoZSBtZXNzYWdlCisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbXNnKToKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiByZXByKHNlbGYubXNnKQorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYubXNnKQorCisKK2NsYXNzIENvbnZlcnNpb25FcnJvcihFcnJvcik6CisgICAgcGFzcworCisKKworY2xhc3MgUGFja2VyOgorICAgICIiIlBhY2sgdmFyaW91cyBkYXRhIHJlcHJlc2VudGF0aW9ucyBpbnRvIGEgYnVmZmVyLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnJlc2V0KCkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5fX2J1ZiA9IF9TdHJpbmdJTygpCisKKyAgICBkZWYgZ2V0X2J1ZmZlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19idWYuZ2V0dmFsdWUoKQorICAgICMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICBnZXRfYnVmID0gZ2V0X2J1ZmZlcgorCisgICAgZGVmIHBhY2tfdWludChzZWxmLCB4KToKKyAgICAgICAgc2VsZi5fX2J1Zi53cml0ZShzdHJ1Y3QucGFjaygnPkwnLCB4KSkKKworICAgIGRlZiBwYWNrX2ludChzZWxmLCB4KToKKyAgICAgICAgc2VsZi5fX2J1Zi53cml0ZShzdHJ1Y3QucGFjaygnPmwnLCB4KSkKKworICAgIHBhY2tfZW51bSA9IHBhY2tfaW50CisKKyAgICBkZWYgcGFja19ib29sKHNlbGYsIHgpOgorICAgICAgICBpZiB4OiBzZWxmLl9fYnVmLndyaXRlKCdcMFwwXDBcMScpCisgICAgICAgIGVsc2U6IHNlbGYuX19idWYud3JpdGUoJ1wwXDBcMFwwJykKKworICAgIGRlZiBwYWNrX3VoeXBlcihzZWxmLCB4KToKKyAgICAgICAgc2VsZi5wYWNrX3VpbnQoeD4+MzIgJiAweGZmZmZmZmZmTCkKKyAgICAgICAgc2VsZi5wYWNrX3VpbnQoeCAmIDB4ZmZmZmZmZmZMKQorCisgICAgcGFja19oeXBlciA9IHBhY2tfdWh5cGVyCisKKyAgICBkZWYgcGFja19mbG9hdChzZWxmLCB4KToKKyAgICAgICAgdHJ5OiBzZWxmLl9fYnVmLndyaXRlKHN0cnVjdC5wYWNrKCc+ZicsIHgpKQorICAgICAgICBleGNlcHQgc3RydWN0LmVycm9yLCBtc2c6CisgICAgICAgICAgICByYWlzZSBDb252ZXJzaW9uRXJyb3IsIG1zZworCisgICAgZGVmIHBhY2tfZG91YmxlKHNlbGYsIHgpOgorICAgICAgICB0cnk6IHNlbGYuX19idWYud3JpdGUoc3RydWN0LnBhY2soJz5kJywgeCkpCisgICAgICAgIGV4Y2VwdCBzdHJ1Y3QuZXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHJhaXNlIENvbnZlcnNpb25FcnJvciwgbXNnCisKKyAgICBkZWYgcGFja19mc3RyaW5nKHNlbGYsIG4sIHMpOgorICAgICAgICBpZiBuIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdmc3RyaW5nIHNpemUgbXVzdCBiZSBub25uZWdhdGl2ZScKKyAgICAgICAgZGF0YSA9IHNbOm5dCisgICAgICAgIG4gPSAoKG4rMykvLzQpKjQKKyAgICAgICAgZGF0YSA9IGRhdGEgKyAobiAtIGxlbihkYXRhKSkgKiAnXDAnCisgICAgICAgIHNlbGYuX19idWYud3JpdGUoZGF0YSkKKworICAgIHBhY2tfZm9wYXF1ZSA9IHBhY2tfZnN0cmluZworCisgICAgZGVmIHBhY2tfc3RyaW5nKHNlbGYsIHMpOgorICAgICAgICBuID0gbGVuKHMpCisgICAgICAgIHNlbGYucGFja191aW50KG4pCisgICAgICAgIHNlbGYucGFja19mc3RyaW5nKG4sIHMpCisKKyAgICBwYWNrX29wYXF1ZSA9IHBhY2tfc3RyaW5nCisgICAgcGFja19ieXRlcyA9IHBhY2tfc3RyaW5nCisKKyAgICBkZWYgcGFja19saXN0KHNlbGYsIGxpc3QsIHBhY2tfaXRlbSk6CisgICAgICAgIGZvciBpdGVtIGluIGxpc3Q6CisgICAgICAgICAgICBzZWxmLnBhY2tfdWludCgxKQorICAgICAgICAgICAgcGFja19pdGVtKGl0ZW0pCisgICAgICAgIHNlbGYucGFja191aW50KDApCisKKyAgICBkZWYgcGFja19mYXJyYXkoc2VsZiwgbiwgbGlzdCwgcGFja19pdGVtKToKKyAgICAgICAgaWYgbGVuKGxpc3QpICE9IG46CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnd3JvbmcgYXJyYXkgc2l6ZScKKyAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdDoKKyAgICAgICAgICAgIHBhY2tfaXRlbShpdGVtKQorCisgICAgZGVmIHBhY2tfYXJyYXkoc2VsZiwgbGlzdCwgcGFja19pdGVtKToKKyAgICAgICAgbiA9IGxlbihsaXN0KQorICAgICAgICBzZWxmLnBhY2tfdWludChuKQorICAgICAgICBzZWxmLnBhY2tfZmFycmF5KG4sIGxpc3QsIHBhY2tfaXRlbSkKKworCisKK2NsYXNzIFVucGFja2VyOgorICAgICIiIlVucGFja3MgdmFyaW91cyBkYXRhIHJlcHJlc2VudGF0aW9ucyBmcm9tIHRoZSBnaXZlbiBidWZmZXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYucmVzZXQoZGF0YSkKKworICAgIGRlZiByZXNldChzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fX2J1ZiA9IGRhdGEKKyAgICAgICAgc2VsZi5fX3BvcyA9IDAKKworICAgIGRlZiBnZXRfcG9zaXRpb24oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fcG9zCisKKyAgICBkZWYgc2V0X3Bvc2l0aW9uKHNlbGYsIHBvc2l0aW9uKToKKyAgICAgICAgc2VsZi5fX3BvcyA9IHBvc2l0aW9uCisKKyAgICBkZWYgZ2V0X2J1ZmZlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19idWYKKworICAgIGRlZiBkb25lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9fcG9zIDwgbGVuKHNlbGYuX19idWYpOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IoJ3VuZXh0cmFjdGVkIGRhdGEgcmVtYWlucycpCisKKyAgICBkZWYgdW5wYWNrX3VpbnQoc2VsZik6CisgICAgICAgIGkgPSBzZWxmLl9fcG9zCisgICAgICAgIHNlbGYuX19wb3MgPSBqID0gaSs0CisgICAgICAgIGRhdGEgPSBzZWxmLl9fYnVmW2k6al0KKyAgICAgICAgaWYgbGVuKGRhdGEpIDwgNDoKKyAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgICAgIHggPSBzdHJ1Y3QudW5wYWNrKCc+TCcsIGRhdGEpWzBdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBpbnQoeCkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICByZXR1cm4geAorCisgICAgZGVmIHVucGFja19pbnQoc2VsZik6CisgICAgICAgIGkgPSBzZWxmLl9fcG9zCisgICAgICAgIHNlbGYuX19wb3MgPSBqID0gaSs0CisgICAgICAgIGRhdGEgPSBzZWxmLl9fYnVmW2k6al0KKyAgICAgICAgaWYgbGVuKGRhdGEpIDwgNDoKKyAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCc+bCcsIGRhdGEpWzBdCisKKyAgICB1bnBhY2tfZW51bSA9IHVucGFja19pbnQKKworICAgIGRlZiB1bnBhY2tfYm9vbChzZWxmKToKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi51bnBhY2tfaW50KCkpCisKKyAgICBkZWYgdW5wYWNrX3VoeXBlcihzZWxmKToKKyAgICAgICAgaGkgPSBzZWxmLnVucGFja191aW50KCkKKyAgICAgICAgbG8gPSBzZWxmLnVucGFja191aW50KCkKKyAgICAgICAgcmV0dXJuIGxvbmcoaGkpPDwzMiB8IGxvCisKKyAgICBkZWYgdW5wYWNrX2h5cGVyKHNlbGYpOgorICAgICAgICB4ID0gc2VsZi51bnBhY2tfdWh5cGVyKCkKKyAgICAgICAgaWYgeCA+PSAweDgwMDAwMDAwMDAwMDAwMDBMOgorICAgICAgICAgICAgeCA9IHggLSAweDEwMDAwMDAwMDAwMDAwMDAwTAorICAgICAgICByZXR1cm4geAorCisgICAgZGVmIHVucGFja19mbG9hdChzZWxmKToKKyAgICAgICAgaSA9IHNlbGYuX19wb3MKKyAgICAgICAgc2VsZi5fX3BvcyA9IGogPSBpKzQKKyAgICAgICAgZGF0YSA9IHNlbGYuX19idWZbaTpqXQorICAgICAgICBpZiBsZW4oZGF0YSkgPCA0OgorICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKKyAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJz5mJywgZGF0YSlbMF0KKworICAgIGRlZiB1bnBhY2tfZG91YmxlKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5fX3BvcworICAgICAgICBzZWxmLl9fcG9zID0gaiA9IGkrOAorICAgICAgICBkYXRhID0gc2VsZi5fX2J1ZltpOmpdCisgICAgICAgIGlmIGxlbihkYXRhKSA8IDg6CisgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPmQnLCBkYXRhKVswXQorCisgICAgZGVmIHVucGFja19mc3RyaW5nKHNlbGYsIG4pOgorICAgICAgICBpZiBuIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdmc3RyaW5nIHNpemUgbXVzdCBiZSBub25uZWdhdGl2ZScKKyAgICAgICAgaSA9IHNlbGYuX19wb3MKKyAgICAgICAgaiA9IGkgKyAobiszKS8vNCo0CisgICAgICAgIGlmIGogPiBsZW4oc2VsZi5fX2J1Zik6CisgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICBzZWxmLl9fcG9zID0gagorICAgICAgICByZXR1cm4gc2VsZi5fX2J1ZltpOmkrbl0KKworICAgIHVucGFja19mb3BhcXVlID0gdW5wYWNrX2ZzdHJpbmcKKworICAgIGRlZiB1bnBhY2tfc3RyaW5nKHNlbGYpOgorICAgICAgICBuID0gc2VsZi51bnBhY2tfdWludCgpCisgICAgICAgIHJldHVybiBzZWxmLnVucGFja19mc3RyaW5nKG4pCisKKyAgICB1bnBhY2tfb3BhcXVlID0gdW5wYWNrX3N0cmluZworICAgIHVucGFja19ieXRlcyA9IHVucGFja19zdHJpbmcKKworICAgIGRlZiB1bnBhY2tfbGlzdChzZWxmLCB1bnBhY2tfaXRlbSk6CisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgeCA9IHNlbGYudW5wYWNrX3VpbnQoKQorICAgICAgICAgICAgaWYgeCA9PSAwOiBicmVhaworICAgICAgICAgICAgaWYgeCAhPSAxOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbnZlcnNpb25FcnJvciwgJzAgb3IgMSBleHBlY3RlZCwgZ290ICVyJyAlICh4LCkKKyAgICAgICAgICAgIGl0ZW0gPSB1bnBhY2tfaXRlbSgpCisgICAgICAgICAgICBsaXN0LmFwcGVuZChpdGVtKQorICAgICAgICByZXR1cm4gbGlzdAorCisgICAgZGVmIHVucGFja19mYXJyYXkoc2VsZiwgbiwgdW5wYWNrX2l0ZW0pOgorICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CisgICAgICAgICAgICBsaXN0LmFwcGVuZCh1bnBhY2tfaXRlbSgpKQorICAgICAgICByZXR1cm4gbGlzdAorCisgICAgZGVmIHVucGFja19hcnJheShzZWxmLCB1bnBhY2tfaXRlbSk6CisgICAgICAgIG4gPSBzZWxmLnVucGFja191aW50KCkKKyAgICAgICAgcmV0dXJuIHNlbGYudW5wYWNrX2ZhcnJheShuLCB1bnBhY2tfaXRlbSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveGRybGliLnB5YyBiL2xpYi9weXRob24yLjcveGRybGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2JhMzJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94ZHJsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveGRybGliLnB5byBiL2xpYi9weXRob24yLjcveGRybGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2JhMzJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94ZHJsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVlZDk4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNDEgQEAKKyIiIkNvcmUgWE1MIHN1cHBvcnQgZm9yIFB5dGhvbi4KKworVGhpcyBwYWNrYWdlIGNvbnRhaW5zIGZvdXIgc3ViLXBhY2thZ2VzOgorCitkb20gLS0gVGhlIFczQyBEb2N1bWVudCBPYmplY3QgTW9kZWwuICBUaGlzIHN1cHBvcnRzIERPTSBMZXZlbCAxICsKKyAgICAgICBOYW1lc3BhY2VzLgorCitwYXJzZXJzIC0tIFB5dGhvbiB3cmFwcGVycyBmb3IgWE1MIHBhcnNlcnMgKGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIEV4cGF0KS4KKworc2F4IC0tIFRoZSBTaW1wbGUgQVBJIGZvciBYTUwsIGRldmVsb3BlZCBieSBYTUwtRGV2LCBsZWQgYnkgRGF2aWQKKyAgICAgICBNZWdnaW5zb24gYW5kIHBvcnRlZCB0byBQeXRob24gYnkgTGFycyBNYXJpdXMgR2Fyc2hvbC4gIFRoaXMKKyAgICAgICBzdXBwb3J0cyB0aGUgU0FYIDIgQVBJLgorCitldHJlZSAtLSBUaGUgRWxlbWVudFRyZWUgWE1MIGxpYnJhcnkuICBUaGlzIGlzIGEgc3Vic2V0IG9mIHRoZSBmdWxsCisgICAgICAgRWxlbWVudFRyZWUgWE1MIHJlbGVhc2UuCisKKyIiIgorCisKK19fYWxsX18gPSBbImRvbSIsICJwYXJzZXJzIiwgInNheCIsICJldHJlZSJdCisKK19NSU5JTVVNX1hNTFBMVVNfVkVSU0lPTiA9ICgwLCA4LCA0KQorCisKK3RyeToKKyAgICBpbXBvcnQgX3htbHBsdXMKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIHRyeToKKyAgICAgICAgdiA9IF94bWxwbHVzLnZlcnNpb25faW5mbworICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgIyBfeG1scGx1cyBpcyB0b28gb2xkOyBpZ25vcmUgaXQKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGlmIHYgPj0gX01JTklNVU1fWE1MUExVU19WRVJTSU9OOgorICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgX3htbHBsdXMuX19wYXRoX18uZXh0ZW5kKF9fcGF0aF9fKQorICAgICAgICAgICAgc3lzLm1vZHVsZXNbX19uYW1lX19dID0gX3htbHBsdXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlbCB2CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3htbC9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlZDllMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3htbC9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlZDllMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9kb20vTm9kZUZpbHRlci5weSBiL2xpYi9weXRob24yLjcveG1sL2RvbS9Ob2RlRmlsdGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMDUyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vTm9kZUZpbHRlci5weQpAQCAtMCwwICsxLDI3IEBACisjIFRoaXMgaXMgdGhlIFB5dGhvbiBtYXBwaW5nIGZvciBpbnRlcmZhY2UgTm9kZUZpbHRlciBmcm9tCisjIERPTTItVHJhdmVyc2FsLVJhbmdlLiBJdCBjb250YWlucyBvbmx5IGNvbnN0YW50cy4KKworY2xhc3MgTm9kZUZpbHRlcjoKKyAgICAiIiIKKyAgICBUaGlzIGlzIHRoZSBET00yIE5vZGVGaWx0ZXIgaW50ZXJmYWNlLiBJdCBjb250YWlucyBvbmx5IGNvbnN0YW50cy4KKyAgICAiIiIKKyAgICBGSUxURVJfQUNDRVBUID0gMQorICAgIEZJTFRFUl9SRUpFQ1QgPSAyCisgICAgRklMVEVSX1NLSVAgICA9IDMKKworICAgIFNIT1dfQUxMICAgICAgICAgICAgICAgICAgICA9IDB4RkZGRkZGRkZMCisgICAgU0hPV19FTEVNRU5UICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwMQorICAgIFNIT1dfQVRUUklCVVRFICAgICAgICAgICAgICA9IDB4MDAwMDAwMDIKKyAgICBTSE9XX1RFWFQgICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDA0CisgICAgU0hPV19DREFUQV9TRUNUSU9OICAgICAgICAgID0gMHgwMDAwMDAwOAorICAgIFNIT1dfRU5USVRZX1JFRkVSRU5DRSAgICAgICA9IDB4MDAwMDAwMTAKKyAgICBTSE9XX0VOVElUWSAgICAgICAgICAgICAgICAgPSAweDAwMDAwMDIwCisgICAgU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OID0gMHgwMDAwMDA0MAorICAgIFNIT1dfQ09NTUVOVCAgICAgICAgICAgICAgICA9IDB4MDAwMDAwODAKKyAgICBTSE9XX0RPQ1VNRU5UICAgICAgICAgICAgICAgPSAweDAwMDAwMTAwCisgICAgU0hPV19ET0NVTUVOVF9UWVBFICAgICAgICAgID0gMHgwMDAwMDIwMAorICAgIFNIT1dfRE9DVU1FTlRfRlJBR01FTlQgICAgICA9IDB4MDAwMDA0MDAKKyAgICBTSE9XX05PVEFUSU9OICAgICAgICAgICAgICAgPSAweDAwMDAwODAwCisKKyAgICBkZWYgYWNjZXB0Tm9kZShzZWxmLCBub2RlKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL05vZGVGaWx0ZXIucHljIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL05vZGVGaWx0ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNGVmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vTm9kZUZpbHRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL05vZGVGaWx0ZXIucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL05vZGVGaWx0ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNGVmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vTm9kZUZpbHRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNjNkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vX19pbml0X18ucHkKQEAgLTAsMCArMSwxMzkgQEAKKyIiIlczQyBEb2N1bWVudCBPYmplY3QgTW9kZWwgaW1wbGVtZW50YXRpb24gZm9yIFB5dGhvbi4KKworVGhlIFB5dGhvbiBtYXBwaW5nIG9mIHRoZSBEb2N1bWVudCBPYmplY3QgTW9kZWwgaXMgZG9jdW1lbnRlZCBpbiB0aGUKK1B5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSBpbiB0aGUgc2VjdGlvbiBvbiB0aGUgeG1sLmRvbSBwYWNrYWdlLgorCitUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBtb2R1bGVzOgorCittaW5pZG9tIC0tIEEgc2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBMZXZlbCAxIERPTSB3aXRoIG5hbWVzcGFjZQorICAgICAgICAgICBzdXBwb3J0IGFkZGVkIChiYXNlZCBvbiB0aGUgTGV2ZWwgMiBzcGVjaWZpY2F0aW9uKSBhbmQgb3RoZXIKKyAgICAgICAgICAgbWlub3IgTGV2ZWwgMiBmdW5jdGlvbmFsaXR5LgorCitwdWxsZG9tIC0tIERPTSBidWlsZGVyIHN1cHBvcnRpbmcgb24tZGVtYW5kIHRyZWUtYnVpbGRpbmcgZm9yIHNlbGVjdGVkCisgICAgICAgICAgIHN1YnRyZWVzIG9mIHRoZSBkb2N1bWVudC4KKworIiIiCisKKworY2xhc3MgTm9kZToKKyAgICAiIiJDbGFzcyBnaXZpbmcgdGhlIE5vZGVUeXBlIGNvbnN0YW50cy4iIiIKKworICAgICMgRE9NIGltcGxlbWVudGF0aW9ucyBtYXkgdXNlIHRoaXMgYXMgYSBiYXNlIGNsYXNzIGZvciB0aGVpciBvd24KKyAgICAjIE5vZGUgaW1wbGVtZW50YXRpb25zLiAgSWYgdGhleSBkb24ndCwgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGhlcmUKKyAgICAjIHNob3VsZCBzdGlsbCBiZSB1c2VkIGFzIHRoZSBjYW5vbmljYWwgZGVmaW5pdGlvbnMgYXMgdGhleSBtYXRjaAorICAgICMgdGhlIHZhbHVlcyBnaXZlbiBpbiB0aGUgVzNDIHJlY29tbWVuZGF0aW9uLiAgQ2xpZW50IGNvZGUgY2FuCisgICAgIyBzYWZlbHkgcmVmZXIgdG8gdGhlc2UgdmFsdWVzIGluIGFsbCB0ZXN0cyBvZiBOb2RlLm5vZGVUeXBlCisgICAgIyB2YWx1ZXMuCisKKyAgICBFTEVNRU5UX05PREUgICAgICAgICAgICAgICAgPSAxCisgICAgQVRUUklCVVRFX05PREUgICAgICAgICAgICAgID0gMgorICAgIFRFWFRfTk9ERSAgICAgICAgICAgICAgICAgICA9IDMKKyAgICBDREFUQV9TRUNUSU9OX05PREUgICAgICAgICAgPSA0CisgICAgRU5USVRZX1JFRkVSRU5DRV9OT0RFICAgICAgID0gNQorICAgIEVOVElUWV9OT0RFICAgICAgICAgICAgICAgICA9IDYKKyAgICBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgPSA3CisgICAgQ09NTUVOVF9OT0RFICAgICAgICAgICAgICAgID0gOAorICAgIERPQ1VNRU5UX05PREUgICAgICAgICAgICAgICA9IDkKKyAgICBET0NVTUVOVF9UWVBFX05PREUgICAgICAgICAgPSAxMAorICAgIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICA9IDExCisgICAgTk9UQVRJT05fTk9ERSAgICAgICAgICAgICAgID0gMTIKKworCisjRXhjZXB0aW9uQ29kZQorSU5ERVhfU0laRV9FUlIgICAgICAgICAgICAgICAgID0gMQorRE9NU1RSSU5HX1NJWkVfRVJSICAgICAgICAgICAgID0gMgorSElFUkFSQ0hZX1JFUVVFU1RfRVJSICAgICAgICAgID0gMworV1JPTkdfRE9DVU1FTlRfRVJSICAgICAgICAgICAgID0gNAorSU5WQUxJRF9DSEFSQUNURVJfRVJSICAgICAgICAgID0gNQorTk9fREFUQV9BTExPV0VEX0VSUiAgICAgICAgICAgID0gNgorTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSICAgID0gNworTk9UX0ZPVU5EX0VSUiAgICAgICAgICAgICAgICAgID0gOAorTk9UX1NVUFBPUlRFRF9FUlIgICAgICAgICAgICAgID0gOQorSU5VU0VfQVRUUklCVVRFX0VSUiAgICAgICAgICAgID0gMTAKK0lOVkFMSURfU1RBVEVfRVJSICAgICAgICAgICAgICA9IDExCitTWU5UQVhfRVJSICAgICAgICAgICAgICAgICAgICAgPSAxMgorSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSICAgICAgID0gMTMKK05BTUVTUEFDRV9FUlIgICAgICAgICAgICAgICAgICA9IDE0CitJTlZBTElEX0FDQ0VTU19FUlIgICAgICAgICAgICAgPSAxNQorVkFMSURBVElPTl9FUlIgICAgICAgICAgICAgICAgID0gMTYKKworCitjbGFzcyBET01FeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBET00gZXhjZXB0aW9ucy4KKyAgICBFeGNlcHRpb25zIHdpdGggc3BlY2lmaWMgY29kZXMgYXJlIHNwZWNpYWxpemF0aW9ucyBvZiB0aGlzIGNsYXNzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgaWYgc2VsZi5fX2NsYXNzX18gaXMgRE9NRXhjZXB0aW9uOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICAgICAgICJET01FeGNlcHRpb24gc2hvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHkiKQorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCisKKyAgICBkZWYgX2dldF9jb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb2RlCisKKworY2xhc3MgSW5kZXhTaXplRXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IElOREVYX1NJWkVfRVJSCisKK2NsYXNzIERvbXN0cmluZ1NpemVFcnIoRE9NRXhjZXB0aW9uKToKKyAgICBjb2RlID0gRE9NU1RSSU5HX1NJWkVfRVJSCisKK2NsYXNzIEhpZXJhcmNoeVJlcXVlc3RFcnIoRE9NRXhjZXB0aW9uKToKKyAgICBjb2RlID0gSElFUkFSQ0hZX1JFUVVFU1RfRVJSCisKK2NsYXNzIFdyb25nRG9jdW1lbnRFcnIoRE9NRXhjZXB0aW9uKToKKyAgICBjb2RlID0gV1JPTkdfRE9DVU1FTlRfRVJSCisKK2NsYXNzIEludmFsaWRDaGFyYWN0ZXJFcnIoRE9NRXhjZXB0aW9uKToKKyAgICBjb2RlID0gSU5WQUxJRF9DSEFSQUNURVJfRVJSCisKK2NsYXNzIE5vRGF0YUFsbG93ZWRFcnIoRE9NRXhjZXB0aW9uKToKKyAgICBjb2RlID0gTk9fREFUQV9BTExPV0VEX0VSUgorCitjbGFzcyBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoRE9NRXhjZXB0aW9uKToKKyAgICBjb2RlID0gTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSCisKK2NsYXNzIE5vdEZvdW5kRXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IE5PVF9GT1VORF9FUlIKKworY2xhc3MgTm90U3VwcG9ydGVkRXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IE5PVF9TVVBQT1JURURfRVJSCisKK2NsYXNzIEludXNlQXR0cmlidXRlRXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IElOVVNFX0FUVFJJQlVURV9FUlIKKworY2xhc3MgSW52YWxpZFN0YXRlRXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IElOVkFMSURfU1RBVEVfRVJSCisKK2NsYXNzIFN5bnRheEVycihET01FeGNlcHRpb24pOgorICAgIGNvZGUgPSBTWU5UQVhfRVJSCisKK2NsYXNzIEludmFsaWRNb2RpZmljYXRpb25FcnIoRE9NRXhjZXB0aW9uKToKKyAgICBjb2RlID0gSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSCisKK2NsYXNzIE5hbWVzcGFjZUVycihET01FeGNlcHRpb24pOgorICAgIGNvZGUgPSBOQU1FU1BBQ0VfRVJSCisKK2NsYXNzIEludmFsaWRBY2Nlc3NFcnIoRE9NRXhjZXB0aW9uKToKKyAgICBjb2RlID0gSU5WQUxJRF9BQ0NFU1NfRVJSCisKK2NsYXNzIFZhbGlkYXRpb25FcnIoRE9NRXhjZXB0aW9uKToKKyAgICBjb2RlID0gVkFMSURBVElPTl9FUlIKKworY2xhc3MgVXNlckRhdGFIYW5kbGVyOgorICAgICIiIkNsYXNzIGdpdmluZyB0aGUgb3BlcmF0aW9uIGNvbnN0YW50cyBmb3IgVXNlckRhdGFIYW5kbGVyLmhhbmRsZSgpLiIiIgorCisgICAgIyBCYXNlZCBvbiBET00gTGV2ZWwgMyAoV0QgOSBBcHJpbCAyMDAyKQorCisgICAgTk9ERV9DTE9ORUQgICA9IDEKKyAgICBOT0RFX0lNUE9SVEVEID0gMgorICAgIE5PREVfREVMRVRFRCAgPSAzCisgICAgTk9ERV9SRU5BTUVEICA9IDQKKworWE1MX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCitYTUxOU19OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iCitYSFRNTF9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKK0VNUFRZX05BTUVTUEFDRSA9IE5vbmUKK0VNUFRZX1BSRUZJWCA9IE5vbmUKKworZnJvbSBkb21yZWcgaW1wb3J0IGdldERPTUltcGxlbWVudGF0aW9uLHJlZ2lzdGVyRE9NSW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3htbC9kb20vX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODYzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3htbC9kb20vX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODYzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9kb21yZWcucHkgYi9saWIvcHl0aG9uMi43L3htbC9kb20vZG9tcmVnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjM2FjZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vZG9tcmVnLnB5CkBAIC0wLDAgKzEsOTkgQEAKKyIiIlJlZ2lzdHJhdGlvbiBmYWNpbGl0aWVzIGZvciBET00uIFRoaXMgbW9kdWxlIHNob3VsZCBub3QgYmUgdXNlZAorZGlyZWN0bHkuIEluc3RlYWQsIHRoZSBmdW5jdGlvbnMgZ2V0RE9NSW1wbGVtZW50YXRpb24gYW5kCityZWdpc3RlckRPTUltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBpbXBvcnRlZCBmcm9tIHhtbC5kb20uIiIiCisKK2Zyb20geG1sLmRvbS5taW5pY29tcGF0IGltcG9ydCAqICAjIGlzaW5zdGFuY2UsIFN0cmluZ1R5cGVzCisKKyMgVGhpcyBpcyBhIGxpc3Qgb2Ygd2VsbC1rbm93biBpbXBsZW1lbnRhdGlvbnMuICBXZWxsLWtub3duIG5hbWVzCisjIHNob3VsZCBiZSBwdWJsaXNoZWQgYnkgcG9zdGluZyB0byB4bWwtc2lnQHB5dGhvbi5vcmcsIGFuZCBhcmUKKyMgc3Vic2VxdWVudGx5IHJlY29yZGVkIGluIHRoaXMgZmlsZS4KKword2VsbF9rbm93bl9pbXBsZW1lbnRhdGlvbnMgPSB7CisgICAgJ21pbmlkb20nOid4bWwuZG9tLm1pbmlkb20nLAorICAgICc0RE9NJzogJ3htbC5kb20uRE9NSW1wbGVtZW50YXRpb24nLAorICAgIH0KKworIyBET00gaW1wbGVtZW50YXRpb25zIG5vdCBvZmZpY2lhbGx5IHJlZ2lzdGVyZWQgc2hvdWxkIHJlZ2lzdGVyCisjIHRoZW1zZWx2ZXMgd2l0aCB0aGVpcgorCityZWdpc3RlcmVkID0ge30KKworZGVmIHJlZ2lzdGVyRE9NSW1wbGVtZW50YXRpb24obmFtZSwgZmFjdG9yeSk6CisgICAgIiIicmVnaXN0ZXJET01JbXBsZW1lbnRhdGlvbihuYW1lLCBmYWN0b3J5KQorCisgICAgUmVnaXN0ZXIgdGhlIGZhY3RvcnkgZnVuY3Rpb24gd2l0aCB0aGUgbmFtZS4gVGhlIGZhY3RvcnkgZnVuY3Rpb24KKyAgICBzaG91bGQgcmV0dXJuIGFuIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZSBET01JbXBsZW1lbnRhdGlvbgorICAgIGludGVyZmFjZS4gVGhlIGZhY3RvcnkgZnVuY3Rpb24gY2FuIGVpdGhlciByZXR1cm4gdGhlIHNhbWUgb2JqZWN0LAorICAgIG9yIGEgbmV3IG9uZSAoZS5nLiBpZiB0aGF0IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHNvbWUKKyAgICBjdXN0b21pemF0aW9uKS4iIiIKKworICAgIHJlZ2lzdGVyZWRbbmFtZV0gPSBmYWN0b3J5CisKK2RlZiBfZ29vZF9lbm91Z2goZG9tLCBmZWF0dXJlcyk6CisgICAgIl9nb29kX2Vub3VnaChkb20sIGZlYXR1cmVzKSAtPiBSZXR1cm4gMSBpZiB0aGUgZG9tIG9mZmVycyB0aGUgZmVhdHVyZXMiCisgICAgZm9yIGYsdiBpbiBmZWF0dXJlczoKKyAgICAgICAgaWYgbm90IGRvbS5oYXNGZWF0dXJlKGYsdik6CisgICAgICAgICAgICByZXR1cm4gMAorICAgIHJldHVybiAxCisKK2RlZiBnZXRET01JbXBsZW1lbnRhdGlvbihuYW1lID0gTm9uZSwgZmVhdHVyZXMgPSAoKSk6CisgICAgIiIiZ2V0RE9NSW1wbGVtZW50YXRpb24obmFtZSA9IE5vbmUsIGZlYXR1cmVzID0gKCkpIC0+IERPTSBpbXBsZW1lbnRhdGlvbi4KKworICAgIFJldHVybiBhIHN1aXRhYmxlIERPTSBpbXBsZW1lbnRhdGlvbi4gVGhlIG5hbWUgaXMgZWl0aGVyCisgICAgd2VsbC1rbm93biwgdGhlIG1vZHVsZSBuYW1lIG9mIGEgRE9NIGltcGxlbWVudGF0aW9uLCBvciBOb25lLiBJZgorICAgIGl0IGlzIG5vdCBOb25lLCBpbXBvcnRzIHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZSBhbmQgcmV0dXJucworICAgIERPTUltcGxlbWVudGF0aW9uIG9iamVjdCBpZiB0aGUgaW1wb3J0IHN1Y2NlZWRzLgorCisgICAgSWYgbmFtZSBpcyBub3QgZ2l2ZW4sIGNvbnNpZGVyIHRoZSBhdmFpbGFibGUgaW1wbGVtZW50YXRpb25zIHRvCisgICAgZmluZCBvbmUgd2l0aCB0aGUgcmVxdWlyZWQgZmVhdHVyZSBzZXQuIElmIG5vIGltcGxlbWVudGF0aW9uIGNhbgorICAgIGJlIGZvdW5kLCByYWlzZSBhbiBJbXBvcnRFcnJvci4gVGhlIGZlYXR1cmVzIGxpc3QgbXVzdCBiZSBhIHNlcXVlbmNlCisgICAgb2YgKGZlYXR1cmUsIHZlcnNpb24pIHBhaXJzIHdoaWNoIGFyZSBwYXNzZWQgdG8gaGFzRmVhdHVyZS4iIiIKKworICAgIGltcG9ydCBvcworICAgIGNyZWF0b3IgPSBOb25lCisgICAgbW9kID0gd2VsbF9rbm93bl9pbXBsZW1lbnRhdGlvbnMuZ2V0KG5hbWUpCisgICAgaWYgbW9kOgorICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKG1vZCwge30sIHt9LCBbJ2dldERPTUltcGxlbWVudGF0aW9uJ10pCisgICAgICAgIHJldHVybiBtb2QuZ2V0RE9NSW1wbGVtZW50YXRpb24oKQorICAgIGVsaWYgbmFtZToKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRbbmFtZV0oKQorICAgIGVsaWYgIlBZVEhPTl9ET00iIGluIG9zLmVudmlyb246CisgICAgICAgIHJldHVybiBnZXRET01JbXBsZW1lbnRhdGlvbihuYW1lID0gb3MuZW52aXJvblsiUFlUSE9OX0RPTSJdKQorCisgICAgIyBVc2VyIGRpZCBub3Qgc3BlY2lmeSBhIG5hbWUsIHRyeSBpbXBsZW1lbnRhdGlvbnMgaW4gYXJiaXRyYXJ5CisgICAgIyBvcmRlciwgcmV0dXJuaW5nIHRoZSBvbmUgdGhhdCBoYXMgdGhlIHJlcXVpcmVkIGZlYXR1cmVzCisgICAgaWYgaXNpbnN0YW5jZShmZWF0dXJlcywgU3RyaW5nVHlwZXMpOgorICAgICAgICBmZWF0dXJlcyA9IF9wYXJzZV9mZWF0dXJlX3N0cmluZyhmZWF0dXJlcykKKyAgICBmb3IgY3JlYXRvciBpbiByZWdpc3RlcmVkLnZhbHVlcygpOgorICAgICAgICBkb20gPSBjcmVhdG9yKCkKKyAgICAgICAgaWYgX2dvb2RfZW5vdWdoKGRvbSwgZmVhdHVyZXMpOgorICAgICAgICAgICAgcmV0dXJuIGRvbQorCisgICAgZm9yIGNyZWF0b3IgaW4gd2VsbF9rbm93bl9pbXBsZW1lbnRhdGlvbnMua2V5cygpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkb20gPSBnZXRET01JbXBsZW1lbnRhdGlvbihuYW1lID0gY3JlYXRvcikKKyAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3I6ICMgdHlwaWNhbGx5IEltcG9ydEVycm9yLCBvciBBdHRyaWJ1dGVFcnJvcgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgX2dvb2RfZW5vdWdoKGRvbSwgZmVhdHVyZXMpOgorICAgICAgICAgICAgcmV0dXJuIGRvbQorCisgICAgcmFpc2UgSW1wb3J0RXJyb3IsIm5vIHN1aXRhYmxlIERPTSBpbXBsZW1lbnRhdGlvbiBmb3VuZCIKKworZGVmIF9wYXJzZV9mZWF0dXJlX3N0cmluZyhzKToKKyAgICBmZWF0dXJlcyA9IFtdCisgICAgcGFydHMgPSBzLnNwbGl0KCkKKyAgICBpID0gMAorICAgIGxlbmd0aCA9IGxlbihwYXJ0cykKKyAgICB3aGlsZSBpIDwgbGVuZ3RoOgorICAgICAgICBmZWF0dXJlID0gcGFydHNbaV0KKyAgICAgICAgaWYgZmVhdHVyZVswXSBpbiAiMDEyMzQ1Njc4OSI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiYmFkIGZlYXR1cmUgbmFtZTogJXIiICUgKGZlYXR1cmUsKQorICAgICAgICBpID0gaSArIDEKKyAgICAgICAgdmVyc2lvbiA9IE5vbmUKKyAgICAgICAgaWYgaSA8IGxlbmd0aDoKKyAgICAgICAgICAgIHYgPSBwYXJ0c1tpXQorICAgICAgICAgICAgaWYgdlswXSBpbiAiMDEyMzQ1Njc4OSI6CisgICAgICAgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHYKKyAgICAgICAgZmVhdHVyZXMuYXBwZW5kKChmZWF0dXJlLCB2ZXJzaW9uKSkKKyAgICByZXR1cm4gdHVwbGUoZmVhdHVyZXMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9kb20vZG9tcmVnLnB5YyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9kb21yZWcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NmE1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vZG9tcmVnLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9kb20vZG9tcmVnLnB5byBiL2xpYi9weXRob24yLjcveG1sL2RvbS9kb21yZWcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NmE1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vZG9tcmVnLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9kb20vZXhwYXRidWlsZGVyLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL2V4cGF0YnVpbGRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmJhODc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL2V4cGF0YnVpbGRlci5weQpAQCAtMCwwICsxLDk4MyBAQAorIiIiRmFjaWxpdHkgdG8gdXNlIHRoZSBFeHBhdCBwYXJzZXIgdG8gbG9hZCBhIG1pbmlkb20gaW5zdGFuY2UKK2Zyb20gYSBzdHJpbmcgb3IgZmlsZS4KKworVGhpcyBhdm9pZHMgYWxsIHRoZSBvdmVyaGVhZCBvZiBTQVggYW5kIHB1bGxkb20gdG8gZ2FpbiBwZXJmb3JtYW5jZS4KKyIiIgorCisjIFdhcm5pbmchCisjCisjIFRoaXMgbW9kdWxlIGlzIHRpZ2h0bHkgYm91bmQgdG8gdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgdGhlCisjIG1pbmlkb20gRE9NIGFuZCBjYW4ndCBiZSB1c2VkIHdpdGggb3RoZXIgRE9NIGltcGxlbWVudGF0aW9ucy4gIFRoaXMKKyMgaXMgZHVlLCBpbiBwYXJ0LCB0byBhIGxhY2sgb2YgYXBwcm9wcmlhdGUgbWV0aG9kcyBpbiB0aGUgRE9NICh0aGVyZSBpcworIyBubyB3YXkgdG8gY3JlYXRlIEVudGl0eSBhbmQgTm90YXRpb24gbm9kZXMgdmlhIHRoZSBET00gTGV2ZWwgMgorIyBpbnRlcmZhY2UpLCBhbmQgZm9yIHBlcmZvcm1hbmNlLiAgVGhlIGxhdGVyIGlzIHRoZSBjYXVzZSBvZiBzb21lIGZhaXJseQorIyBjcnlwdGljIGNvZGUuCisjCisjIFBlcmZvcm1hbmNlIGhhY2tzOgorIworIyAgIC0gIC5jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyKCkgaGFzIGFuIGV4dHJhIGNhc2UgaW4gd2hpY2ggY29udGludWluZworIyAgICAgIGRhdGEgaXMgYXBwZW5kZWQgdG8gYW4gZXhpc3RpbmcgVGV4dCBub2RlOyB0aGlzIGNhbiBiZSBhCisjICAgICAgc3BlZWR1cCBzaW5jZSBweWV4cGF0IGNhbiBicmVhayB1cCBjaGFyYWN0ZXIgZGF0YSBpbnRvIG11bHRpcGxlCisjICAgICAgY2FsbGJhY2tzIGV2ZW4gdGhvdWdoIHdlIHNldCB0aGUgYnVmZmVyX3RleHQgYXR0cmlidXRlIG9uIHRoZQorIyAgICAgIHBhcnNlci4gIFRoaXMgYWxzbyBnaXZlcyB1cyB0aGUgYWR2YW50YWdlIHRoYXQgd2UgZG9uJ3QgbmVlZCBhCisjICAgICAgc2VwYXJhdGUgbm9ybWFsaXphdGlvbiBwYXNzLgorIworIyAgIC0gIERldGVybWluaW5nIHRoYXQgYSBub2RlIGV4aXN0cyBpcyBkb25lIHVzaW5nIGFuIGlkZW50aXR5IGNvbXBhcmlzb24KKyMgICAgICB3aXRoIE5vbmUgcmF0aGVyIHRoYW4gYSB0cnV0aCB0ZXN0OyB0aGlzIGF2b2lkcyBzZWFyY2hpbmcgZm9yIGFuZAorIyAgICAgIGNhbGxpbmcgYW55IG1ldGhvZHMgb24gdGhlIG5vZGUgb2JqZWN0IGlmIGl0IGV4aXN0cy4gIChBIHJhdGhlcgorIyAgICAgIG5pY2Ugc3BlZWR1cCBpcyBhY2hpZXZlZCB0aGlzIHdheSBhcyB3ZWxsISkKKworZnJvbSB4bWwuZG9tIGltcG9ydCB4bWxidWlsZGVyLCBtaW5pZG9tLCBOb2RlCitmcm9tIHhtbC5kb20gaW1wb3J0IEVNUFRZX05BTUVTUEFDRSwgRU1QVFlfUFJFRklYLCBYTUxOU19OQU1FU1BBQ0UKK2Zyb20geG1sLnBhcnNlcnMgaW1wb3J0IGV4cGF0Citmcm9tIHhtbC5kb20ubWluaWRvbSBpbXBvcnQgX2FwcGVuZF9jaGlsZCwgX3NldF9hdHRyaWJ1dGVfbm9kZQorZnJvbSB4bWwuZG9tLk5vZGVGaWx0ZXIgaW1wb3J0IE5vZGVGaWx0ZXIKKworZnJvbSB4bWwuZG9tLm1pbmljb21wYXQgaW1wb3J0ICoKKworVEVYVF9OT0RFID0gTm9kZS5URVhUX05PREUKK0NEQVRBX1NFQ1RJT05fTk9ERSA9IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFCitET0NVTUVOVF9OT0RFID0gTm9kZS5ET0NVTUVOVF9OT0RFCisKK0ZJTFRFUl9BQ0NFUFQgPSB4bWxidWlsZGVyLkRPTUJ1aWxkZXJGaWx0ZXIuRklMVEVSX0FDQ0VQVAorRklMVEVSX1JFSkVDVCA9IHhtbGJ1aWxkZXIuRE9NQnVpbGRlckZpbHRlci5GSUxURVJfUkVKRUNUCitGSUxURVJfU0tJUCA9IHhtbGJ1aWxkZXIuRE9NQnVpbGRlckZpbHRlci5GSUxURVJfU0tJUAorRklMVEVSX0lOVEVSUlVQVCA9IHhtbGJ1aWxkZXIuRE9NQnVpbGRlckZpbHRlci5GSUxURVJfSU5URVJSVVBUCisKK3RoZURPTUltcGxlbWVudGF0aW9uID0gbWluaWRvbS5nZXRET01JbXBsZW1lbnRhdGlvbigpCisKKyMgRXhwYXQgdHlwZW5hbWUgLT4gVHlwZUluZm8KK190eXBlaW5mb19tYXAgPSB7CisgICAgIkNEQVRBIjogICAgbWluaWRvbS5UeXBlSW5mbyhOb25lLCAiY2RhdGEiKSwKKyAgICAiRU5VTSI6ICAgICBtaW5pZG9tLlR5cGVJbmZvKE5vbmUsICJlbnVtZXJhdGlvbiIpLAorICAgICJFTlRJVFkiOiAgIG1pbmlkb20uVHlwZUluZm8oTm9uZSwgImVudGl0eSIpLAorICAgICJFTlRJVElFUyI6IG1pbmlkb20uVHlwZUluZm8oTm9uZSwgImVudGl0aWVzIiksCisgICAgIklEIjogICAgICAgbWluaWRvbS5UeXBlSW5mbyhOb25lLCAiaWQiKSwKKyAgICAiSURSRUYiOiAgICBtaW5pZG9tLlR5cGVJbmZvKE5vbmUsICJpZHJlZiIpLAorICAgICJJRFJFRlMiOiAgIG1pbmlkb20uVHlwZUluZm8oTm9uZSwgImlkcmVmcyIpLAorICAgICJOTVRPS0VOIjogIG1pbmlkb20uVHlwZUluZm8oTm9uZSwgIm5tdG9rZW4iKSwKKyAgICAiTk1UT0tFTlMiOiBtaW5pZG9tLlR5cGVJbmZvKE5vbmUsICJubXRva2VucyIpLAorICAgIH0KKworY2xhc3MgRWxlbWVudEluZm8ob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAnX2F0dHJfaW5mbycsICdfbW9kZWwnLCAndGFnTmFtZScKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YWdOYW1lLCBtb2RlbD1Ob25lKToKKyAgICAgICAgc2VsZi50YWdOYW1lID0gdGFnTmFtZQorICAgICAgICBzZWxmLl9hdHRyX2luZm8gPSBbXQorICAgICAgICBzZWxmLl9tb2RlbCA9IG1vZGVsCisKKyAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXR0cl9pbmZvLCBzZWxmLl9tb2RlbCwgc2VsZi50YWdOYW1lCisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgc2VsZi5fYXR0cl9pbmZvLCBzZWxmLl9tb2RlbCwgc2VsZi50YWdOYW1lID0gc3RhdGUKKworICAgIGRlZiBnZXRBdHRyaWJ1dGVUeXBlKHNlbGYsIGFuYW1lKToKKyAgICAgICAgZm9yIGluZm8gaW4gc2VsZi5fYXR0cl9pbmZvOgorICAgICAgICAgICAgaWYgaW5mb1sxXSA9PSBhbmFtZToKKyAgICAgICAgICAgICAgICB0ID0gaW5mb1stMl0KKyAgICAgICAgICAgICAgICBpZiB0WzBdID09ICIoIjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90eXBlaW5mb19tYXBbIkVOVU0iXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdHlwZWluZm9fbWFwW2luZm9bLTJdXQorICAgICAgICByZXR1cm4gbWluaWRvbS5fbm9fdHlwZQorCisgICAgZGVmIGdldEF0dHJpYnV0ZVR5cGVOUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CisgICAgICAgIHJldHVybiBtaW5pZG9tLl9ub190eXBlCisKKyAgICBkZWYgaXNFbGVtZW50Q29udGVudChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fbW9kZWw6CisgICAgICAgICAgICB0eXBlID0gc2VsZi5fbW9kZWxbMF0KKyAgICAgICAgICAgIHJldHVybiB0eXBlIG5vdCBpbiAoZXhwYXQubW9kZWwuWE1MX0NUWVBFX0FOWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYXQubW9kZWwuWE1MX0NUWVBFX01JWEVEKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgaXNFbXB0eShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fbW9kZWw6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbW9kZWxbMF0gPT0gZXhwYXQubW9kZWwuWE1MX0NUWVBFX0VNUFRZCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBpc0lkKHNlbGYsIGFuYW1lKToKKyAgICAgICAgZm9yIGluZm8gaW4gc2VsZi5fYXR0cl9pbmZvOgorICAgICAgICAgICAgaWYgaW5mb1sxXSA9PSBhbmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5mb1stMl0gPT0gIklEIgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBpc0lkTlMoc2VsZiwgZXVyaSwgZW5hbWUsIGF1cmksIGFuYW1lKToKKyAgICAgICAgIyBub3Qgc3VyZSB0aGlzIGlzIG1lYW5pbmdmdWwKKyAgICAgICAgcmV0dXJuIHNlbGYuaXNJZCgoYXVyaSwgYW5hbWUpKQorCitkZWYgX2ludGVybihidWlsZGVyLCBzKToKKyAgICByZXR1cm4gYnVpbGRlci5faW50ZXJuX3NldGRlZmF1bHQocywgcykKKworZGVmIF9wYXJzZV9uc19uYW1lKGJ1aWxkZXIsIG5hbWUpOgorICAgIGFzc2VydCAnICcgaW4gbmFtZQorICAgIHBhcnRzID0gbmFtZS5zcGxpdCgnICcpCisgICAgaW50ZXJuID0gYnVpbGRlci5faW50ZXJuX3NldGRlZmF1bHQKKyAgICBpZiBsZW4ocGFydHMpID09IDM6CisgICAgICAgIHVyaSwgbG9jYWxuYW1lLCBwcmVmaXggPSBwYXJ0cworICAgICAgICBwcmVmaXggPSBpbnRlcm4ocHJlZml4LCBwcmVmaXgpCisgICAgICAgIHFuYW1lID0gIiVzOiVzIiAlIChwcmVmaXgsIGxvY2FsbmFtZSkKKyAgICAgICAgcW5hbWUgPSBpbnRlcm4ocW5hbWUsIHFuYW1lKQorICAgICAgICBsb2NhbG5hbWUgPSBpbnRlcm4obG9jYWxuYW1lLCBsb2NhbG5hbWUpCisgICAgZWxzZToKKyAgICAgICAgdXJpLCBsb2NhbG5hbWUgPSBwYXJ0cworICAgICAgICBwcmVmaXggPSBFTVBUWV9QUkVGSVgKKyAgICAgICAgcW5hbWUgPSBsb2NhbG5hbWUgPSBpbnRlcm4obG9jYWxuYW1lLCBsb2NhbG5hbWUpCisgICAgcmV0dXJuIGludGVybih1cmksIHVyaSksIGxvY2FsbmFtZSwgcHJlZml4LCBxbmFtZQorCisKK2NsYXNzIEV4cGF0QnVpbGRlcjoKKyAgICAiIiJEb2N1bWVudCBidWlsZGVyIHRoYXQgdXNlcyBFeHBhdCB0byBidWlsZCBhIFBhcnNlZFhNTC5ET00gZG9jdW1lbnQKKyAgICBpbnN0YW5jZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zPU5vbmUpOgorICAgICAgICBpZiBvcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICBvcHRpb25zID0geG1sYnVpbGRlci5PcHRpb25zKCkKKyAgICAgICAgc2VsZi5fb3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgICAgaWYgc2VsZi5fb3B0aW9ucy5maWx0ZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9maWx0ZXIgPSBGaWx0ZXJWaXNpYmlsaXR5Q29udHJvbGxlcihzZWxmLl9vcHRpb25zLmZpbHRlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2ZpbHRlciA9IE5vbmUKKyAgICAgICAgICAgICMgVGhpcyAqcmVhbGx5KiBkb2Vzbid0IGRvIGFueXRoaW5nIGluIHRoaXMgY2FzZSwgc28KKyAgICAgICAgICAgICMgb3ZlcnJpZGUgaXQgd2l0aCBzb21ldGhpbmcgZmFzdCAmIG1pbmltYWwuCisgICAgICAgICAgICBzZWxmLl9maW5pc2hfc3RhcnRfZWxlbWVudCA9IGlkCisgICAgICAgIHNlbGYuX3BhcnNlciA9IE5vbmUKKyAgICAgICAgc2VsZi5yZXNldCgpCisKKyAgICBkZWYgY3JlYXRlUGFyc2VyKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgcGFyc2VyIG9iamVjdC4iIiIKKyAgICAgICAgcmV0dXJuIGV4cGF0LlBhcnNlckNyZWF0ZSgpCisKKyAgICBkZWYgZ2V0UGFyc2VyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHBhcnNlciBvYmplY3QsIGNyZWF0aW5nIGEgbmV3IG9uZSBpZiBuZWVkZWQuIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9wYXJzZXI6CisgICAgICAgICAgICBzZWxmLl9wYXJzZXIgPSBzZWxmLmNyZWF0ZVBhcnNlcigpCisgICAgICAgICAgICBzZWxmLl9pbnRlcm5fc2V0ZGVmYXVsdCA9IHNlbGYuX3BhcnNlci5pbnRlcm4uc2V0ZGVmYXVsdAorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLmJ1ZmZlcl90ZXh0ID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLm9yZGVyZWRfYXR0cmlidXRlcyA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5zcGVjaWZpZWRfYXR0cmlidXRlcyA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbChzZWxmLl9wYXJzZXIpCisgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZXIKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgIiIiRnJlZSBhbGwgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQgZHVyaW5nIERPTSBjb25zdHJ1Y3Rpb24uIiIiCisgICAgICAgIHNlbGYuZG9jdW1lbnQgPSB0aGVET01JbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudCgKKyAgICAgICAgICAgIEVNUFRZX05BTUVTUEFDRSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5jdXJOb2RlID0gc2VsZi5kb2N1bWVudAorICAgICAgICBzZWxmLl9lbGVtX2luZm8gPSBzZWxmLmRvY3VtZW50Ll9lbGVtX2luZm8KKyAgICAgICAgc2VsZi5fY2RhdGEgPSBGYWxzZQorCisgICAgZGVmIGluc3RhbGwoc2VsZiwgcGFyc2VyKToKKyAgICAgICAgIiIiSW5zdGFsbCB0aGUgY2FsbGJhY2tzIG5lZWRlZCB0byBidWlsZCB0aGUgRE9NIGludG8gdGhlIHBhcnNlci4iIiIKKyAgICAgICAgIyBUaGlzIGNyZWF0ZXMgY2lyY3VsYXIgcmVmZXJlbmNlcyEKKyAgICAgICAgcGFyc2VyLlN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyID0gc2VsZi5zdGFydF9kb2N0eXBlX2RlY2xfaGFuZGxlcgorICAgICAgICBwYXJzZXIuU3RhcnRFbGVtZW50SGFuZGxlciA9IHNlbGYuZmlyc3RfZWxlbWVudF9oYW5kbGVyCisgICAgICAgIHBhcnNlci5FbmRFbGVtZW50SGFuZGxlciA9IHNlbGYuZW5kX2VsZW1lbnRfaGFuZGxlcgorICAgICAgICBwYXJzZXIuUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciA9IHNlbGYucGlfaGFuZGxlcgorICAgICAgICBpZiBzZWxmLl9vcHRpb25zLmVudGl0aWVzOgorICAgICAgICAgICAgcGFyc2VyLkVudGl0eURlY2xIYW5kbGVyID0gc2VsZi5lbnRpdHlfZGVjbF9oYW5kbGVyCisgICAgICAgIHBhcnNlci5Ob3RhdGlvbkRlY2xIYW5kbGVyID0gc2VsZi5ub3RhdGlvbl9kZWNsX2hhbmRsZXIKKyAgICAgICAgaWYgc2VsZi5fb3B0aW9ucy5jb21tZW50czoKKyAgICAgICAgICAgIHBhcnNlci5Db21tZW50SGFuZGxlciA9IHNlbGYuY29tbWVudF9oYW5kbGVyCisgICAgICAgIGlmIHNlbGYuX29wdGlvbnMuY2RhdGFfc2VjdGlvbnM6CisgICAgICAgICAgICBwYXJzZXIuU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyID0gc2VsZi5zdGFydF9jZGF0YV9zZWN0aW9uX2hhbmRsZXIKKyAgICAgICAgICAgIHBhcnNlci5FbmRDZGF0YVNlY3Rpb25IYW5kbGVyID0gc2VsZi5lbmRfY2RhdGFfc2VjdGlvbl9oYW5kbGVyCisgICAgICAgICAgICBwYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBzZWxmLmNoYXJhY3Rlcl9kYXRhX2hhbmRsZXJfY2RhdGEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IHNlbGYuY2hhcmFjdGVyX2RhdGFfaGFuZGxlcgorICAgICAgICBwYXJzZXIuRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyID0gc2VsZi5leHRlcm5hbF9lbnRpdHlfcmVmX2hhbmRsZXIKKyAgICAgICAgcGFyc2VyLlhtbERlY2xIYW5kbGVyID0gc2VsZi54bWxfZGVjbF9oYW5kbGVyCisgICAgICAgIHBhcnNlci5FbGVtZW50RGVjbEhhbmRsZXIgPSBzZWxmLmVsZW1lbnRfZGVjbF9oYW5kbGVyCisgICAgICAgIHBhcnNlci5BdHRsaXN0RGVjbEhhbmRsZXIgPSBzZWxmLmF0dGxpc3RfZGVjbF9oYW5kbGVyCisKKyAgICBkZWYgcGFyc2VGaWxlKHNlbGYsIGZpbGUpOgorICAgICAgICAiIiJQYXJzZSBhIGRvY3VtZW50IGZyb20gYSBmaWxlIG9iamVjdCwgcmV0dXJuaW5nIHRoZSBkb2N1bWVudAorICAgICAgICBub2RlLiIiIgorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcigpCisgICAgICAgIGZpcnN0X2J1ZmZlciA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBmaWxlLnJlYWQoMTYqMTAyNCkKKyAgICAgICAgICAgICAgICBpZiBub3QgYnVmZmVyOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHBhcnNlci5QYXJzZShidWZmZXIsIDApCisgICAgICAgICAgICAgICAgaWYgZmlyc3RfYnVmZmVyIGFuZCBzZWxmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2V0dXBfc3Vic2V0KGJ1ZmZlcikKKyAgICAgICAgICAgICAgICBmaXJzdF9idWZmZXIgPSBGYWxzZQorICAgICAgICAgICAgcGFyc2VyLlBhcnNlKCIiLCBUcnVlKQorICAgICAgICBleGNlcHQgUGFyc2VFc2NhcGU6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRvYyA9IHNlbGYuZG9jdW1lbnQKKyAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgIHNlbGYuX3BhcnNlciA9IE5vbmUKKyAgICAgICAgcmV0dXJuIGRvYworCisgICAgZGVmIHBhcnNlU3RyaW5nKHNlbGYsIHN0cmluZyk6CisgICAgICAgICIiIlBhcnNlIGEgZG9jdW1lbnQgZnJvbSBhIHN0cmluZywgcmV0dXJuaW5nIHRoZSBkb2N1bWVudCBub2RlLiIiIgorICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlci5QYXJzZShzdHJpbmcsIFRydWUpCisgICAgICAgICAgICBzZWxmLl9zZXR1cF9zdWJzZXQoc3RyaW5nKQorICAgICAgICBleGNlcHQgUGFyc2VFc2NhcGU6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRvYyA9IHNlbGYuZG9jdW1lbnQKKyAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgIHNlbGYuX3BhcnNlciA9IE5vbmUKKyAgICAgICAgcmV0dXJuIGRvYworCisgICAgZGVmIF9zZXR1cF9zdWJzZXQoc2VsZiwgYnVmZmVyKToKKyAgICAgICAgIiIiTG9hZCB0aGUgaW50ZXJuYWwgc3Vic2V0IGlmIHRoZXJlIG1pZ2h0IGJlIG9uZS4iIiIKKyAgICAgICAgaWYgc2VsZi5kb2N1bWVudC5kb2N0eXBlOgorICAgICAgICAgICAgZXh0cmFjdG9yID0gSW50ZXJuYWxTdWJzZXRFeHRyYWN0b3IoKQorICAgICAgICAgICAgZXh0cmFjdG9yLnBhcnNlU3RyaW5nKGJ1ZmZlcikKKyAgICAgICAgICAgIHN1YnNldCA9IGV4dHJhY3Rvci5nZXRTdWJzZXQoKQorICAgICAgICAgICAgc2VsZi5kb2N1bWVudC5kb2N0eXBlLmludGVybmFsU3Vic2V0ID0gc3Vic2V0CisKKyAgICBkZWYgc3RhcnRfZG9jdHlwZV9kZWNsX2hhbmRsZXIoc2VsZiwgZG9jdHlwZU5hbWUsIHN5c3RlbUlkLCBwdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2ludGVybmFsX3N1YnNldCk6CisgICAgICAgIGRvY3R5cGUgPSBzZWxmLmRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50VHlwZSgKKyAgICAgICAgICAgIGRvY3R5cGVOYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpCisgICAgICAgIGRvY3R5cGUub3duZXJEb2N1bWVudCA9IHNlbGYuZG9jdW1lbnQKKyAgICAgICAgX2FwcGVuZF9jaGlsZChzZWxmLmRvY3VtZW50LCBkb2N0eXBlKQorICAgICAgICBzZWxmLmRvY3VtZW50LmRvY3R5cGUgPSBkb2N0eXBlCisgICAgICAgIGlmIHNlbGYuX2ZpbHRlciBhbmQgc2VsZi5fZmlsdGVyLmFjY2VwdE5vZGUoZG9jdHlwZSkgPT0gRklMVEVSX1JFSkVDVDoKKyAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQuZG9jdHlwZSA9IE5vbmUKKyAgICAgICAgICAgIGRlbCBzZWxmLmRvY3VtZW50LmNoaWxkTm9kZXNbLTFdCisgICAgICAgICAgICBkb2N0eXBlID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLkVudGl0eURlY2xIYW5kbGVyID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLk5vdGF0aW9uRGVjbEhhbmRsZXIgPSBOb25lCisgICAgICAgIGlmIGhhc19pbnRlcm5hbF9zdWJzZXQ6CisgICAgICAgICAgICBpZiBkb2N0eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGRvY3R5cGUuZW50aXRpZXMuX3NlcSA9IFtdCisgICAgICAgICAgICAgICAgZG9jdHlwZS5ub3RhdGlvbnMuX3NlcSA9IFtdCisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuQ29tbWVudEhhbmRsZXIgPSBOb25lCisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5FbmREb2N0eXBlRGVjbEhhbmRsZXIgPSBzZWxmLmVuZF9kb2N0eXBlX2RlY2xfaGFuZGxlcgorCisgICAgZGVmIGVuZF9kb2N0eXBlX2RlY2xfaGFuZGxlcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fb3B0aW9ucy5jb21tZW50czoKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5Db21tZW50SGFuZGxlciA9IHNlbGYuY29tbWVudF9oYW5kbGVyCisgICAgICAgIHNlbGYuX3BhcnNlci5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyID0gc2VsZi5waV9oYW5kbGVyCisgICAgICAgIGlmIG5vdCAoc2VsZi5fZWxlbV9pbmZvIG9yIHNlbGYuX2ZpbHRlcik6CisgICAgICAgICAgICBzZWxmLl9maW5pc2hfZW5kX2VsZW1lbnQgPSBpZAorCisgICAgZGVmIHBpX2hhbmRsZXIoc2VsZiwgdGFyZ2V0LCBkYXRhKToKKyAgICAgICAgbm9kZSA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSkKKyAgICAgICAgX2FwcGVuZF9jaGlsZChzZWxmLmN1ck5vZGUsIG5vZGUpCisgICAgICAgIGlmIHNlbGYuX2ZpbHRlciBhbmQgc2VsZi5fZmlsdGVyLmFjY2VwdE5vZGUobm9kZSkgPT0gRklMVEVSX1JFSkVDVDoKKyAgICAgICAgICAgIHNlbGYuY3VyTm9kZS5yZW1vdmVDaGlsZChub2RlKQorCisgICAgZGVmIGNoYXJhY3Rlcl9kYXRhX2hhbmRsZXJfY2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIGNoaWxkTm9kZXMgPSBzZWxmLmN1ck5vZGUuY2hpbGROb2RlcworICAgICAgICBpZiBzZWxmLl9jZGF0YToKKyAgICAgICAgICAgIGlmICggIHNlbGYuX2NkYXRhX2NvbnRpbnVlCisgICAgICAgICAgICAgICAgICBhbmQgY2hpbGROb2Rlc1stMV0ubm9kZVR5cGUgPT0gQ0RBVEFfU0VDVElPTl9OT0RFKToKKyAgICAgICAgICAgICAgICBjaGlsZE5vZGVzWy0xXS5hcHBlbmREYXRhKGRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBub2RlID0gc2VsZi5kb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oZGF0YSkKKyAgICAgICAgICAgIHNlbGYuX2NkYXRhX2NvbnRpbnVlID0gVHJ1ZQorICAgICAgICBlbGlmIGNoaWxkTm9kZXMgYW5kIGNoaWxkTm9kZXNbLTFdLm5vZGVUeXBlID09IFRFWFRfTk9ERToKKyAgICAgICAgICAgIG5vZGUgPSBjaGlsZE5vZGVzWy0xXQorICAgICAgICAgICAgdmFsdWUgPSBub2RlLmRhdGEgKyBkYXRhCisgICAgICAgICAgICBkID0gbm9kZS5fX2RpY3RfXworICAgICAgICAgICAgZFsnZGF0YSddID0gZFsnbm9kZVZhbHVlJ10gPSB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBub2RlID0gbWluaWRvbS5UZXh0KCkKKyAgICAgICAgICAgIGQgPSBub2RlLl9fZGljdF9fCisgICAgICAgICAgICBkWydkYXRhJ10gPSBkWydub2RlVmFsdWUnXSA9IGRhdGEKKyAgICAgICAgICAgIGRbJ293bmVyRG9jdW1lbnQnXSA9IHNlbGYuZG9jdW1lbnQKKyAgICAgICAgX2FwcGVuZF9jaGlsZChzZWxmLmN1ck5vZGUsIG5vZGUpCisKKyAgICBkZWYgY2hhcmFjdGVyX2RhdGFfaGFuZGxlcihzZWxmLCBkYXRhKToKKyAgICAgICAgY2hpbGROb2RlcyA9IHNlbGYuY3VyTm9kZS5jaGlsZE5vZGVzCisgICAgICAgIGlmIGNoaWxkTm9kZXMgYW5kIGNoaWxkTm9kZXNbLTFdLm5vZGVUeXBlID09IFRFWFRfTk9ERToKKyAgICAgICAgICAgIG5vZGUgPSBjaGlsZE5vZGVzWy0xXQorICAgICAgICAgICAgZCA9IG5vZGUuX19kaWN0X18KKyAgICAgICAgICAgIGRbJ2RhdGEnXSA9IGRbJ25vZGVWYWx1ZSddID0gbm9kZS5kYXRhICsgZGF0YQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG5vZGUgPSBtaW5pZG9tLlRleHQoKQorICAgICAgICBkID0gbm9kZS5fX2RpY3RfXworICAgICAgICBkWydkYXRhJ10gPSBkWydub2RlVmFsdWUnXSA9IG5vZGUuZGF0YSArIGRhdGEKKyAgICAgICAgZFsnb3duZXJEb2N1bWVudCddID0gc2VsZi5kb2N1bWVudAorICAgICAgICBfYXBwZW5kX2NoaWxkKHNlbGYuY3VyTm9kZSwgbm9kZSkKKworICAgIGRlZiBlbnRpdHlfZGVjbF9oYW5kbGVyKHNlbGYsIGVudGl0eU5hbWUsIGlzX3BhcmFtZXRlcl9lbnRpdHksIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsIHN5c3RlbUlkLCBwdWJsaWNJZCwgbm90YXRpb25OYW1lKToKKyAgICAgICAgaWYgaXNfcGFyYW1ldGVyX2VudGl0eToKKyAgICAgICAgICAgICMgd2UgZG9uJ3QgY2FyZSBhYm91dCBwYXJhbWV0ZXIgZW50aXRpZXMgZm9yIHRoZSBET00KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgc2VsZi5fb3B0aW9ucy5lbnRpdGllczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBub2RlID0gc2VsZi5kb2N1bWVudC5fY3JlYXRlX2VudGl0eShlbnRpdHlOYW1lLCBwdWJsaWNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtSWQsIG5vdGF0aW9uTmFtZSkKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIGludGVybmFsIGVudGl0eQorICAgICAgICAgICAgIyBub2RlICpzaG91bGQqIGJlIHJlYWRvbmx5LCBidXQgd2UnbGwgY2hlYXQKKyAgICAgICAgICAgIGNoaWxkID0gc2VsZi5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSkKKyAgICAgICAgICAgIG5vZGUuY2hpbGROb2Rlcy5hcHBlbmQoY2hpbGQpCisgICAgICAgIHNlbGYuZG9jdW1lbnQuZG9jdHlwZS5lbnRpdGllcy5fc2VxLmFwcGVuZChub2RlKQorICAgICAgICBpZiBzZWxmLl9maWx0ZXIgYW5kIHNlbGYuX2ZpbHRlci5hY2NlcHROb2RlKG5vZGUpID09IEZJTFRFUl9SRUpFQ1Q6CisgICAgICAgICAgICBkZWwgc2VsZi5kb2N1bWVudC5kb2N0eXBlLmVudGl0aWVzLl9zZXFbLTFdCisKKyAgICBkZWYgbm90YXRpb25fZGVjbF9oYW5kbGVyKHNlbGYsIG5vdGF0aW9uTmFtZSwgYmFzZSwgc3lzdGVtSWQsIHB1YmxpY0lkKToKKyAgICAgICAgbm9kZSA9IHNlbGYuZG9jdW1lbnQuX2NyZWF0ZV9ub3RhdGlvbihub3RhdGlvbk5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkKKyAgICAgICAgc2VsZi5kb2N1bWVudC5kb2N0eXBlLm5vdGF0aW9ucy5fc2VxLmFwcGVuZChub2RlKQorICAgICAgICBpZiBzZWxmLl9maWx0ZXIgYW5kIHNlbGYuX2ZpbHRlci5hY2NlcHROb2RlKG5vZGUpID09IEZJTFRFUl9BQ0NFUFQ6CisgICAgICAgICAgICBkZWwgc2VsZi5kb2N1bWVudC5kb2N0eXBlLm5vdGF0aW9ucy5fc2VxWy0xXQorCisgICAgZGVmIGNvbW1lbnRfaGFuZGxlcihzZWxmLCBkYXRhKToKKyAgICAgICAgbm9kZSA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlQ29tbWVudChkYXRhKQorICAgICAgICBfYXBwZW5kX2NoaWxkKHNlbGYuY3VyTm9kZSwgbm9kZSkKKyAgICAgICAgaWYgc2VsZi5fZmlsdGVyIGFuZCBzZWxmLl9maWx0ZXIuYWNjZXB0Tm9kZShub2RlKSA9PSBGSUxURVJfUkVKRUNUOgorICAgICAgICAgICAgc2VsZi5jdXJOb2RlLnJlbW92ZUNoaWxkKG5vZGUpCisKKyAgICBkZWYgc3RhcnRfY2RhdGFfc2VjdGlvbl9oYW5kbGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9jZGF0YSA9IFRydWUKKyAgICAgICAgc2VsZi5fY2RhdGFfY29udGludWUgPSBGYWxzZQorCisgICAgZGVmIGVuZF9jZGF0YV9zZWN0aW9uX2hhbmRsZXIoc2VsZik6CisgICAgICAgIHNlbGYuX2NkYXRhID0gRmFsc2UKKyAgICAgICAgc2VsZi5fY2RhdGFfY29udGludWUgPSBGYWxzZQorCisgICAgZGVmIGV4dGVybmFsX2VudGl0eV9yZWZfaGFuZGxlcihzZWxmLCBjb250ZXh0LCBiYXNlLCBzeXN0ZW1JZCwgcHVibGljSWQpOgorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIGZpcnN0X2VsZW1lbnRfaGFuZGxlcihzZWxmLCBuYW1lLCBhdHRyaWJ1dGVzKToKKyAgICAgICAgaWYgc2VsZi5fZmlsdGVyIGlzIE5vbmUgYW5kIG5vdCBzZWxmLl9lbGVtX2luZm86CisgICAgICAgICAgICBzZWxmLl9maW5pc2hfZW5kX2VsZW1lbnQgPSBpZAorICAgICAgICBzZWxmLmdldFBhcnNlcigpLlN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzZWxmLnN0YXJ0X2VsZW1lbnRfaGFuZGxlcgorICAgICAgICBzZWxmLnN0YXJ0X2VsZW1lbnRfaGFuZGxlcihuYW1lLCBhdHRyaWJ1dGVzKQorCisgICAgZGVmIHN0YXJ0X2VsZW1lbnRfaGFuZGxlcihzZWxmLCBuYW1lLCBhdHRyaWJ1dGVzKToKKyAgICAgICAgbm9kZSA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKQorICAgICAgICBfYXBwZW5kX2NoaWxkKHNlbGYuY3VyTm9kZSwgbm9kZSkKKyAgICAgICAgc2VsZi5jdXJOb2RlID0gbm9kZQorCisgICAgICAgIGlmIGF0dHJpYnV0ZXM6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oYXR0cmlidXRlcyksIDIpOgorICAgICAgICAgICAgICAgIGEgPSBtaW5pZG9tLkF0dHIoYXR0cmlidXRlc1tpXSwgRU1QVFlfTkFNRVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgRU1QVFlfUFJFRklYKQorICAgICAgICAgICAgICAgIHZhbHVlID0gYXR0cmlidXRlc1tpKzFdCisgICAgICAgICAgICAgICAgZCA9IGEuY2hpbGROb2Rlc1swXS5fX2RpY3RfXworICAgICAgICAgICAgICAgIGRbJ2RhdGEnXSA9IGRbJ25vZGVWYWx1ZSddID0gdmFsdWUKKyAgICAgICAgICAgICAgICBkID0gYS5fX2RpY3RfXworICAgICAgICAgICAgICAgIGRbJ3ZhbHVlJ10gPSBkWydub2RlVmFsdWUnXSA9IHZhbHVlCisgICAgICAgICAgICAgICAgZFsnb3duZXJEb2N1bWVudCddID0gc2VsZi5kb2N1bWVudAorICAgICAgICAgICAgICAgIF9zZXRfYXR0cmlidXRlX25vZGUobm9kZSwgYSkKKworICAgICAgICBpZiBub2RlIGlzIG5vdCBzZWxmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDoKKyAgICAgICAgICAgIHNlbGYuX2ZpbmlzaF9zdGFydF9lbGVtZW50KG5vZGUpCisKKyAgICBkZWYgX2ZpbmlzaF9zdGFydF9lbGVtZW50KHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBzZWxmLl9maWx0ZXI6CisgICAgICAgICAgICAjIFRvIGJlIGdlbmVyYWwsIHdlJ2QgaGF2ZSB0byBjYWxsIGlzU2FtZU5vZGUoKSwgYnV0IHRoaXMKKyAgICAgICAgICAgICMgaXMgc3VmZmljaWVudCBmb3IgbWluaWRvbToKKyAgICAgICAgICAgIGlmIG5vZGUgaXMgc2VsZi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBmaWx0ID0gc2VsZi5fZmlsdGVyLnN0YXJ0Q29udGFpbmVyKG5vZGUpCisgICAgICAgICAgICBpZiBmaWx0ID09IEZJTFRFUl9SRUpFQ1Q6CisgICAgICAgICAgICAgICAgIyBpZ25vcmUgdGhpcyBub2RlICYgYWxsIGRlc2NlbmRlbnRzCisgICAgICAgICAgICAgICAgUmVqZWN0ZXIoc2VsZikKKyAgICAgICAgICAgIGVsaWYgZmlsdCA9PSBGSUxURVJfU0tJUDoKKyAgICAgICAgICAgICAgICAjIGlnbm9yZSB0aGlzIG5vZGUsIGJ1dCBtYWtlIGl0J3MgY2hpbGRyZW4gYmVjb21lCisgICAgICAgICAgICAgICAgIyBjaGlsZHJlbiBvZiB0aGUgcGFyZW50IG5vZGUKKyAgICAgICAgICAgICAgICBTa2lwcGVyKHNlbGYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5jdXJOb2RlID0gbm9kZS5wYXJlbnROb2RlCisgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSkKKyAgICAgICAgICAgIG5vZGUudW5saW5rKCkKKworICAgICMgSWYgdGhpcyBldmVyIGNoYW5nZXMsIE5hbWVzcGFjZXMuZW5kX2VsZW1lbnRfaGFuZGxlcigpIG5lZWRzIHRvCisgICAgIyBiZSBjaGFuZ2VkIHRvIG1hdGNoLgorICAgICMKKyAgICBkZWYgZW5kX2VsZW1lbnRfaGFuZGxlcihzZWxmLCBuYW1lKToKKyAgICAgICAgY3VyTm9kZSA9IHNlbGYuY3VyTm9kZQorICAgICAgICBzZWxmLmN1ck5vZGUgPSBjdXJOb2RlLnBhcmVudE5vZGUKKyAgICAgICAgc2VsZi5fZmluaXNoX2VuZF9lbGVtZW50KGN1ck5vZGUpCisKKyAgICBkZWYgX2ZpbmlzaF9lbmRfZWxlbWVudChzZWxmLCBjdXJOb2RlKToKKyAgICAgICAgaW5mbyA9IHNlbGYuX2VsZW1faW5mby5nZXQoY3VyTm9kZS50YWdOYW1lKQorICAgICAgICBpZiBpbmZvOgorICAgICAgICAgICAgc2VsZi5faGFuZGxlX3doaXRlX3RleHRfbm9kZXMoY3VyTm9kZSwgaW5mbykKKyAgICAgICAgaWYgc2VsZi5fZmlsdGVyOgorICAgICAgICAgICAgaWYgY3VyTm9kZSBpcyBzZWxmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHNlbGYuX2ZpbHRlci5hY2NlcHROb2RlKGN1ck5vZGUpID09IEZJTFRFUl9SRUpFQ1Q6CisgICAgICAgICAgICAgICAgc2VsZi5jdXJOb2RlLnJlbW92ZUNoaWxkKGN1ck5vZGUpCisgICAgICAgICAgICAgICAgY3VyTm9kZS51bmxpbmsoKQorCisgICAgZGVmIF9oYW5kbGVfd2hpdGVfdGV4dF9ub2RlcyhzZWxmLCBub2RlLCBpbmZvKToKKyAgICAgICAgaWYgKHNlbGYuX29wdGlvbnMud2hpdGVzcGFjZV9pbl9lbGVtZW50X2NvbnRlbnQKKyAgICAgICAgICAgIG9yIG5vdCBpbmZvLmlzRWxlbWVudENvbnRlbnQoKSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIFdlIGhhdmUgZWxlbWVudCB0eXBlIGluZm9ybWF0aW9uIGFuZCBzaG91bGQgcmVtb3ZlIGlnbm9yYWJsZQorICAgICAgICAjIHdoaXRlc3BhY2U7IGlkZW50aWZ5IGZvciB0ZXh0IG5vZGVzIHdoaWNoIGNvbnRhaW4gb25seQorICAgICAgICAjIHdoaXRlc3BhY2UuCisgICAgICAgIEwgPSBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5jaGlsZE5vZGVzOgorICAgICAgICAgICAgaWYgY2hpbGQubm9kZVR5cGUgPT0gVEVYVF9OT0RFIGFuZCBub3QgY2hpbGQuZGF0YS5zdHJpcCgpOgorICAgICAgICAgICAgICAgIEwuYXBwZW5kKGNoaWxkKQorCisgICAgICAgICMgUmVtb3ZlIGlnbm9yYWJsZSB3aGl0ZXNwYWNlIGZyb20gdGhlIHRyZWUuCisgICAgICAgIGZvciBjaGlsZCBpbiBMOgorICAgICAgICAgICAgbm9kZS5yZW1vdmVDaGlsZChjaGlsZCkKKworICAgIGRlZiBlbGVtZW50X2RlY2xfaGFuZGxlcihzZWxmLCBuYW1lLCBtb2RlbCk6CisgICAgICAgIGluZm8gPSBzZWxmLl9lbGVtX2luZm8uZ2V0KG5hbWUpCisgICAgICAgIGlmIGluZm8gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2VsZW1faW5mb1tuYW1lXSA9IEVsZW1lbnRJbmZvKG5hbWUsIG1vZGVsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IGluZm8uX21vZGVsIGlzIE5vbmUKKyAgICAgICAgICAgIGluZm8uX21vZGVsID0gbW9kZWwKKworICAgIGRlZiBhdHRsaXN0X2RlY2xfaGFuZGxlcihzZWxmLCBlbGVtLCBuYW1lLCB0eXBlLCBkZWZhdWx0LCByZXF1aXJlZCk6CisgICAgICAgIGluZm8gPSBzZWxmLl9lbGVtX2luZm8uZ2V0KGVsZW0pCisgICAgICAgIGlmIGluZm8gaXMgTm9uZToKKyAgICAgICAgICAgIGluZm8gPSBFbGVtZW50SW5mbyhlbGVtKQorICAgICAgICAgICAgc2VsZi5fZWxlbV9pbmZvW2VsZW1dID0gaW5mbworICAgICAgICBpbmZvLl9hdHRyX2luZm8uYXBwZW5kKAorICAgICAgICAgICAgW05vbmUsIG5hbWUsIE5vbmUsIE5vbmUsIGRlZmF1bHQsIDAsIHR5cGUsIHJlcXVpcmVkXSkKKworICAgIGRlZiB4bWxfZGVjbF9oYW5kbGVyKHNlbGYsIHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lKToKKyAgICAgICAgc2VsZi5kb2N1bWVudC52ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICBzZWxmLmRvY3VtZW50LmVuY29kaW5nID0gZW5jb2RpbmcKKyAgICAgICAgIyBUaGlzIGlzIHN0aWxsIGEgbGl0dGxlIHVnbHksIHRoYW5rcyB0byB0aGUgcHlleHBhdCBBUEkuIDstKAorICAgICAgICBpZiBzdGFuZGFsb25lID49IDA6CisgICAgICAgICAgICBpZiBzdGFuZGFsb25lOgorICAgICAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQuc3RhbmRhbG9uZSA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5kb2N1bWVudC5zdGFuZGFsb25lID0gRmFsc2UKKworCisjIERvbid0IGluY2x1ZGUgRklMVEVSX0lOVEVSUlVQVCwgc2luY2UgdGhhdCdzIGNoZWNrZWQgc2VwYXJhdGVseQorIyB3aGVyZSBhbGxvd2VkLgorX0FMTE9XRURfRklMVEVSX1JFVFVSTlMgPSAoRklMVEVSX0FDQ0VQVCwgRklMVEVSX1JFSkVDVCwgRklMVEVSX1NLSVApCisKK2NsYXNzIEZpbHRlclZpc2liaWxpdHlDb250cm9sbGVyKG9iamVjdCk6CisgICAgIiIiV3JhcHBlciBhcm91bmQgYSBET01CdWlsZGVyRmlsdGVyIHdoaWNoIGltcGxlbWVudHMgdGhlIGNoZWNrcworICAgIHRvIG1ha2UgdGhlIHdoYXRUb1Nob3cgZmlsdGVyIGF0dHJpYnV0ZSB3b3JrLiIiIgorCisgICAgX19zbG90c19fID0gJ2ZpbHRlcicsCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsdGVyKToKKyAgICAgICAgc2VsZi5maWx0ZXIgPSBmaWx0ZXIKKworICAgIGRlZiBzdGFydENvbnRhaW5lcihzZWxmLCBub2RlKToKKyAgICAgICAgbWFzayA9IHNlbGYuX25vZGV0eXBlX21hc2tbbm9kZS5ub2RlVHlwZV0KKyAgICAgICAgaWYgc2VsZi5maWx0ZXIud2hhdFRvU2hvdyAmIG1hc2s6CisgICAgICAgICAgICB2YWwgPSBzZWxmLmZpbHRlci5zdGFydENvbnRhaW5lcihub2RlKQorICAgICAgICAgICAgaWYgdmFsID09IEZJTFRFUl9JTlRFUlJVUFQ6CisgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFc2NhcGUKKyAgICAgICAgICAgIGlmIHZhbCBub3QgaW4gX0FMTE9XRURfRklMVEVSX1JFVFVSTlM6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJzdGFydENvbnRhaW5lcigpIHJldHVybmVkIGlsbGVnYWwgdmFsdWU6ICIgKyByZXByKHZhbCkKKyAgICAgICAgICAgIHJldHVybiB2YWwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGSUxURVJfQUNDRVBUCisKKyAgICBkZWYgYWNjZXB0Tm9kZShzZWxmLCBub2RlKToKKyAgICAgICAgbWFzayA9IHNlbGYuX25vZGV0eXBlX21hc2tbbm9kZS5ub2RlVHlwZV0KKyAgICAgICAgaWYgc2VsZi5maWx0ZXIud2hhdFRvU2hvdyAmIG1hc2s6CisgICAgICAgICAgICB2YWwgPSBzZWxmLmZpbHRlci5hY2NlcHROb2RlKG5vZGUpCisgICAgICAgICAgICBpZiB2YWwgPT0gRklMVEVSX0lOVEVSUlVQVDoKKyAgICAgICAgICAgICAgICByYWlzZSBQYXJzZUVzY2FwZQorICAgICAgICAgICAgaWYgdmFsID09IEZJTFRFUl9TS0lQOgorICAgICAgICAgICAgICAgICMgbW92ZSBhbGwgY2hpbGQgbm9kZXMgdG8gdGhlIHBhcmVudCwgYW5kIHJlbW92ZSB0aGlzIG5vZGUKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGUKKyAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5jaGlsZE5vZGVzWzpdOgorICAgICAgICAgICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpCisgICAgICAgICAgICAgICAgIyBub2RlIGlzIGhhbmRsZWQgYnkgdGhlIGNhbGxlcgorICAgICAgICAgICAgICAgIHJldHVybiBGSUxURVJfUkVKRUNUCisgICAgICAgICAgICBpZiB2YWwgbm90IGluIF9BTExPV0VEX0ZJTFRFUl9SRVRVUk5TOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAiYWNjZXB0Tm9kZSgpIHJldHVybmVkIGlsbGVnYWwgdmFsdWU6ICIgKyByZXByKHZhbCkKKyAgICAgICAgICAgIHJldHVybiB2YWwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGSUxURVJfQUNDRVBUCisKKyAgICBfbm9kZXR5cGVfbWFzayA9IHsKKyAgICAgICAgTm9kZS5FTEVNRU5UX05PREU6ICAgICAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULAorICAgICAgICBOb2RlLkFUVFJJQlVURV9OT0RFOiAgICAgICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0FUVFJJQlVURSwKKyAgICAgICAgTm9kZS5URVhUX05PREU6ICAgICAgICAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19URVhULAorICAgICAgICBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERTogICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04sCisgICAgICAgIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOiAgICAgICBOb2RlRmlsdGVyLlNIT1dfRU5USVRZX1JFRkVSRU5DRSwKKyAgICAgICAgTm9kZS5FTlRJVFlfTk9ERTogICAgICAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19FTlRJVFksCisgICAgICAgIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOiBOb2RlRmlsdGVyLlNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiwKKyAgICAgICAgTm9kZS5DT01NRU5UX05PREU6ICAgICAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19DT01NRU5ULAorICAgICAgICBOb2RlLkRPQ1VNRU5UX05PREU6ICAgICAgICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5ULAorICAgICAgICBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERTogICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX1RZUEUsCisgICAgICAgIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTogICAgICBOb2RlRmlsdGVyLlNIT1dfRE9DVU1FTlRfRlJBR01FTlQsCisgICAgICAgIE5vZGUuTk9UQVRJT05fTk9ERTogICAgICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfTk9UQVRJT04sCisgICAgICAgIH0KKworCitjbGFzcyBGaWx0ZXJDcnV0Y2gob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAnX2J1aWxkZXInLCAnX2xldmVsJywgJ19vbGRfc3RhcnQnLCAnX29sZF9lbmQnCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnVpbGRlcik6CisgICAgICAgIHNlbGYuX2xldmVsID0gMAorICAgICAgICBzZWxmLl9idWlsZGVyID0gYnVpbGRlcgorICAgICAgICBwYXJzZXIgPSBidWlsZGVyLl9wYXJzZXIKKyAgICAgICAgc2VsZi5fb2xkX3N0YXJ0ID0gcGFyc2VyLlN0YXJ0RWxlbWVudEhhbmRsZXIKKyAgICAgICAgc2VsZi5fb2xkX2VuZCA9IHBhcnNlci5FbmRFbGVtZW50SGFuZGxlcgorICAgICAgICBwYXJzZXIuU3RhcnRFbGVtZW50SGFuZGxlciA9IHNlbGYuc3RhcnRfZWxlbWVudF9oYW5kbGVyCisgICAgICAgIHBhcnNlci5FbmRFbGVtZW50SGFuZGxlciA9IHNlbGYuZW5kX2VsZW1lbnRfaGFuZGxlcgorCitjbGFzcyBSZWplY3RlcihGaWx0ZXJDcnV0Y2gpOgorICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnVpbGRlcik6CisgICAgICAgIEZpbHRlckNydXRjaC5fX2luaXRfXyhzZWxmLCBidWlsZGVyKQorICAgICAgICBwYXJzZXIgPSBidWlsZGVyLl9wYXJzZXIKKyAgICAgICAgZm9yIG5hbWUgaW4gKCJQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICJDb21tZW50SGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAiQ2hhcmFjdGVyRGF0YUhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAiRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAiRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgICAgICBzZXRhdHRyKHBhcnNlciwgbmFtZSwgTm9uZSkKKworICAgIGRlZiBzdGFydF9lbGVtZW50X2hhbmRsZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9sZXZlbCA9IHNlbGYuX2xldmVsICsgMQorCisgICAgZGVmIGVuZF9lbGVtZW50X2hhbmRsZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLl9sZXZlbCA9PSAwOgorICAgICAgICAgICAgIyByZXN0b3JlIHRoZSBvbGQgaGFuZGxlcnMKKyAgICAgICAgICAgIHBhcnNlciA9IHNlbGYuX2J1aWxkZXIuX3BhcnNlcgorICAgICAgICAgICAgc2VsZi5fYnVpbGRlci5pbnN0YWxsKHBhcnNlcikKKyAgICAgICAgICAgIHBhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyID0gc2VsZi5fb2xkX3N0YXJ0CisgICAgICAgICAgICBwYXJzZXIuRW5kRWxlbWVudEhhbmRsZXIgPSBzZWxmLl9vbGRfZW5kCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9sZXZlbCA9IHNlbGYuX2xldmVsIC0gMQorCitjbGFzcyBTa2lwcGVyKEZpbHRlckNydXRjaCk6CisgICAgX19zbG90c19fID0gKCkKKworICAgIGRlZiBzdGFydF9lbGVtZW50X2hhbmRsZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBub2RlID0gc2VsZi5fYnVpbGRlci5jdXJOb2RlCisgICAgICAgIHNlbGYuX29sZF9zdGFydCgqYXJncykKKyAgICAgICAgaWYgc2VsZi5fYnVpbGRlci5jdXJOb2RlIGlzIG5vdCBub2RlOgorICAgICAgICAgICAgc2VsZi5fbGV2ZWwgPSBzZWxmLl9sZXZlbCArIDEKKworICAgIGRlZiBlbmRfZWxlbWVudF9oYW5kbGVyKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5fbGV2ZWwgPT0gMDoKKyAgICAgICAgICAgICMgV2UncmUgcG9wcGluZyBiYWNrIG91dCBvZiB0aGUgbm9kZSB3ZSdyZSBza2lwcGluZywgc28gd2UKKyAgICAgICAgICAgICMgc2hvdWxkbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYnV0IHJlc2V0IHRoZSBoYW5kbGVycy4KKyAgICAgICAgICAgIHNlbGYuX2J1aWxkZXIuX3BhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyID0gc2VsZi5fb2xkX3N0YXJ0CisgICAgICAgICAgICBzZWxmLl9idWlsZGVyLl9wYXJzZXIuRW5kRWxlbWVudEhhbmRsZXIgPSBzZWxmLl9vbGRfZW5kCisgICAgICAgICAgICBzZWxmLl9idWlsZGVyID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbGV2ZWwgPSBzZWxmLl9sZXZlbCAtIDEKKyAgICAgICAgICAgIHNlbGYuX29sZF9lbmQoKmFyZ3MpCisKKworIyBmcmFtZXdvcmsgZG9jdW1lbnQgdXNlZCBieSB0aGUgZnJhZ21lbnQgYnVpbGRlci4KKyMgVGFrZXMgYSBzdHJpbmcgZm9yIHRoZSBkb2N0eXBlLCBzdWJzZXQgc3RyaW5nLCBhbmQgbmFtZXNwYWNlIGF0dHJzIHN0cmluZy4KKworX0ZSQUdNRU5UX0JVSUxERVJfSU5URVJOQUxfU1lTVEVNX0lEID0gXAorICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvZW50aXRpZXMvZnJhZ21lbnQtYnVpbGRlci9pbnRlcm5hbCIKKworX0ZSQUdNRU5UX0JVSUxERVJfVEVNUExBVEUgPSAoCisgICAgJycnXAorPCFET0NUWVBFIHdyYXBwZXIKKyAgJSVzIFsKKyAgPCFFTlRJVFkgZnJhZ21lbnQtYnVpbGRlci1pbnRlcm5hbAorICAgIFNZU1RFTSAiJXMiPgorJSVzCitdPgorPHdyYXBwZXIgJSVzCis+JmZyYWdtZW50LWJ1aWxkZXItaW50ZXJuYWw7PC93cmFwcGVyPicnJworICAgICUgX0ZSQUdNRU5UX0JVSUxERVJfSU5URVJOQUxfU1lTVEVNX0lEKQorCisKK2NsYXNzIEZyYWdtZW50QnVpbGRlcihFeHBhdEJ1aWxkZXIpOgorICAgICIiIkJ1aWxkZXIgd2hpY2ggY29uc3RydWN0cyBkb2N1bWVudCBmcmFnbWVudHMgZ2l2ZW4gWE1MIHNvdXJjZQorICAgIHRleHQgYW5kIGEgY29udGV4dCBub2RlLgorCisgICAgVGhlIGNvbnRleHQgbm9kZSBpcyBleHBlY3RlZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgd2hpY2ggYXJlIGluIHNjb3BlIGF0IHRoZSBzdGFydCBvZiB0aGUKKyAgICBmcmFnbWVudC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb250ZXh0LCBvcHRpb25zPU5vbmUpOgorICAgICAgICBpZiBjb250ZXh0Lm5vZGVUeXBlID09IERPQ1VNRU5UX05PREU6CisgICAgICAgICAgICBzZWxmLm9yaWdpbmFsRG9jdW1lbnQgPSBjb250ZXh0CisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBjb250ZXh0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm9yaWdpbmFsRG9jdW1lbnQgPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQKKyAgICAgICAgICAgIHNlbGYuY29udGV4dCA9IGNvbnRleHQKKyAgICAgICAgRXhwYXRCdWlsZGVyLl9faW5pdF9fKHNlbGYsIG9wdGlvbnMpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIEV4cGF0QnVpbGRlci5yZXNldChzZWxmKQorICAgICAgICBzZWxmLmZyYWdtZW50ID0gTm9uZQorCisgICAgZGVmIHBhcnNlRmlsZShzZWxmLCBmaWxlKToKKyAgICAgICAgIiIiUGFyc2UgYSBkb2N1bWVudCBmcmFnbWVudCBmcm9tIGEgZmlsZSBvYmplY3QsIHJldHVybmluZyB0aGUKKyAgICAgICAgZnJhZ21lbnQgbm9kZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VTdHJpbmcoZmlsZS5yZWFkKCkpCisKKyAgICBkZWYgcGFyc2VTdHJpbmcoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgIiIiUGFyc2UgYSBkb2N1bWVudCBmcmFnbWVudCBmcm9tIGEgc3RyaW5nLCByZXR1cm5pbmcgdGhlCisgICAgICAgIGZyYWdtZW50IG5vZGUuIiIiCisgICAgICAgIHNlbGYuX3NvdXJjZSA9IHN0cmluZworICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcigpCisgICAgICAgIGRvY3R5cGUgPSBzZWxmLm9yaWdpbmFsRG9jdW1lbnQuZG9jdHlwZQorICAgICAgICBpZGVudCA9ICIiCisgICAgICAgIGlmIGRvY3R5cGU6CisgICAgICAgICAgICBzdWJzZXQgPSBkb2N0eXBlLmludGVybmFsU3Vic2V0IG9yIHNlbGYuX2dldERlY2xhcmF0aW9ucygpCisgICAgICAgICAgICBpZiBkb2N0eXBlLnB1YmxpY0lkOgorICAgICAgICAgICAgICAgIGlkZW50ID0gKCdQVUJMSUMgIiVzIiAiJXMiJworICAgICAgICAgICAgICAgICAgICAgICAgICUgKGRvY3R5cGUucHVibGljSWQsIGRvY3R5cGUuc3lzdGVtSWQpKQorICAgICAgICAgICAgZWxpZiBkb2N0eXBlLnN5c3RlbUlkOgorICAgICAgICAgICAgICAgIGlkZW50ID0gJ1NZU1RFTSAiJXMiJyAlIGRvY3R5cGUuc3lzdGVtSWQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1YnNldCA9ICIiCisgICAgICAgIG5zYXR0cnMgPSBzZWxmLl9nZXROU2F0dHJzKCkgIyBnZXQgbnMgZGVjbHMgZnJvbSBub2RlJ3MgYW5jZXN0b3JzCisgICAgICAgIGRvY3VtZW50ID0gX0ZSQUdNRU5UX0JVSUxERVJfVEVNUExBVEUgJSAoaWRlbnQsIHN1YnNldCwgbnNhdHRycykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFyc2VyLlBhcnNlKGRvY3VtZW50LCAxKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGZyYWdtZW50ID0gc2VsZi5mcmFnbWVudAorICAgICAgICBzZWxmLnJlc2V0KCkKKyMjICAgICAgICAgc2VsZi5fcGFyc2VyID0gTm9uZQorICAgICAgICByZXR1cm4gZnJhZ21lbnQKKworICAgIGRlZiBfZ2V0RGVjbGFyYXRpb25zKHNlbGYpOgorICAgICAgICAiIiJSZS1jcmVhdGUgdGhlIGludGVybmFsIHN1YnNldCBmcm9tIHRoZSBEb2N1bWVudFR5cGUgbm9kZS4KKworICAgICAgICBUaGlzIGlzIG9ubHkgbmVlZGVkIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSB0aGUKKyAgICAgICAgaW50ZXJuYWxTdWJzZXQgYXMgYSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICBkb2N0eXBlID0gc2VsZi5jb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdHlwZQorICAgICAgICBzID0gIiIKKyAgICAgICAgaWYgZG9jdHlwZToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGRvY3R5cGUubm90YXRpb25zLmxlbmd0aCk6CisgICAgICAgICAgICAgICAgbm90YXRpb24gPSBkb2N0eXBlLm5vdGF0aW9ucy5pdGVtKGkpCisgICAgICAgICAgICAgICAgaWYgczoKKyAgICAgICAgICAgICAgICAgICAgcyA9IHMgKyAiXG4gICIKKyAgICAgICAgICAgICAgICBzID0gIiVzPCFOT1RBVElPTiAlcyIgJSAocywgbm90YXRpb24ubm9kZU5hbWUpCisgICAgICAgICAgICAgICAgaWYgbm90YXRpb24ucHVibGljSWQ6CisgICAgICAgICAgICAgICAgICAgIHMgPSAnJXMgUFVCTElDICIlcyJcbiAgICAgICAgICAgICAiJXMiPicgXAorICAgICAgICAgICAgICAgICAgICAgICAgJSAocywgbm90YXRpb24ucHVibGljSWQsIG5vdGF0aW9uLnN5c3RlbUlkKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHMgPSAnJXMgU1lTVEVNICIlcyI+JyAlIChzLCBub3RhdGlvbi5zeXN0ZW1JZCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGRvY3R5cGUuZW50aXRpZXMubGVuZ3RoKToKKyAgICAgICAgICAgICAgICBlbnRpdHkgPSBkb2N0eXBlLmVudGl0aWVzLml0ZW0oaSkKKyAgICAgICAgICAgICAgICBpZiBzOgorICAgICAgICAgICAgICAgICAgICBzID0gcyArICJcbiAgIgorICAgICAgICAgICAgICAgIHMgPSAiJXM8IUVOVElUWSAlcyIgJSAocywgZW50aXR5Lm5vZGVOYW1lKQorICAgICAgICAgICAgICAgIGlmIGVudGl0eS5wdWJsaWNJZDoKKyAgICAgICAgICAgICAgICAgICAgcyA9ICclcyBQVUJMSUMgIiVzIlxuICAgICAgICAgICAgICIlcyInIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICUgKHMsIGVudGl0eS5wdWJsaWNJZCwgZW50aXR5LnN5c3RlbUlkKQorICAgICAgICAgICAgICAgIGVsaWYgZW50aXR5LnN5c3RlbUlkOgorICAgICAgICAgICAgICAgICAgICBzID0gJyVzIFNZU1RFTSAiJXMiJyAlIChzLCBlbnRpdHkuc3lzdGVtSWQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcyA9ICclcyAiJXMiJyAlIChzLCBlbnRpdHkuZmlyc3RDaGlsZC5kYXRhKQorICAgICAgICAgICAgICAgIGlmIGVudGl0eS5ub3RhdGlvbk5hbWU6CisgICAgICAgICAgICAgICAgICAgIHMgPSAiJXMgTk9UQVRJT04gJXMiICUgKHMsIGVudGl0eS5ub3RhdGlvbk5hbWUpCisgICAgICAgICAgICAgICAgcyA9IHMgKyAiPiIKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBfZ2V0TlNhdHRycyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIiCisKKyAgICBkZWYgZXh0ZXJuYWxfZW50aXR5X3JlZl9oYW5kbGVyKHNlbGYsIGNvbnRleHQsIGJhc2UsIHN5c3RlbUlkLCBwdWJsaWNJZCk6CisgICAgICAgIGlmIHN5c3RlbUlkID09IF9GUkFHTUVOVF9CVUlMREVSX0lOVEVSTkFMX1NZU1RFTV9JRDoKKyAgICAgICAgICAgICMgdGhpcyBlbnRyZWYgaXMgdGhlIG9uZSB0aGF0IHdlIG1hZGUgdG8gcHV0IHRoZSBzdWJ0cmVlCisgICAgICAgICAgICAjIGluOyBhbGwgb2Ygb3VyIGdpdmVuIGlucHV0IGlzIHBhcnNlZCBpbiBoZXJlLgorICAgICAgICAgICAgb2xkX2RvY3VtZW50ID0gc2VsZi5kb2N1bWVudAorICAgICAgICAgICAgb2xkX2N1cl9ub2RlID0gc2VsZi5jdXJOb2RlCisgICAgICAgICAgICBwYXJzZXIgPSBzZWxmLl9wYXJzZXIuRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUoY29udGV4dCkKKyAgICAgICAgICAgICMgcHV0IHRoZSByZWFsIGRvY3VtZW50IGJhY2ssIHBhcnNlIGludG8gdGhlIGZyYWdtZW50IHRvIHJldHVybgorICAgICAgICAgICAgc2VsZi5kb2N1bWVudCA9IHNlbGYub3JpZ2luYWxEb2N1bWVudAorICAgICAgICAgICAgc2VsZi5mcmFnbWVudCA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCisgICAgICAgICAgICBzZWxmLmN1ck5vZGUgPSBzZWxmLmZyYWdtZW50CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFyc2VyLlBhcnNlKHNlbGYuX3NvdXJjZSwgMSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2VsZi5jdXJOb2RlID0gb2xkX2N1cl9ub2RlCisgICAgICAgICAgICAgICAgc2VsZi5kb2N1bWVudCA9IG9sZF9kb2N1bWVudAorICAgICAgICAgICAgICAgIHNlbGYuX3NvdXJjZSA9IE5vbmUKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEV4cGF0QnVpbGRlci5leHRlcm5hbF9lbnRpdHlfcmVmX2hhbmRsZXIoCisgICAgICAgICAgICAgICAgc2VsZiwgY29udGV4dCwgYmFzZSwgc3lzdGVtSWQsIHB1YmxpY0lkKQorCisKK2NsYXNzIE5hbWVzcGFjZXM6CisgICAgIiIiTWl4LWluIGNsYXNzIGZvciBidWlsZGVyczsgYWRkcyBzdXBwb3J0IGZvciBuYW1lc3BhY2VzLiIiIgorCisgICAgZGVmIF9pbml0TmFtZXNwYWNlcyhzZWxmKToKKyAgICAgICAgIyBsaXN0IG9mIChwcmVmaXgsIHVyaSkgbnMgZGVjbGFyYXRpb25zLiAgTmFtZXNwYWNlIGF0dHJzIGFyZQorICAgICAgICAjIGNvbnN0cnVjdGVkIGZyb20gdGhpcyBhbmQgYWRkZWQgdG8gdGhlIGVsZW1lbnQncyBhdHRycy4KKyAgICAgICAgc2VsZi5fbnNfb3JkZXJlZF9wcmVmaXhlcyA9IFtdCisKKyAgICBkZWYgY3JlYXRlUGFyc2VyKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgbmFtZXNwYWNlLWhhbmRsaW5nIHBhcnNlci4iIiIKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKG5hbWVzcGFjZV9zZXBhcmF0b3I9IiAiKQorICAgICAgICBwYXJzZXIubmFtZXNwYWNlX3ByZWZpeGVzID0gVHJ1ZQorICAgICAgICByZXR1cm4gcGFyc2VyCisKKyAgICBkZWYgaW5zdGFsbChzZWxmLCBwYXJzZXIpOgorICAgICAgICAiIiJJbnNlcnQgdGhlIG5hbWVzcGFjZS1oYW5kbGVycyBvbnRvIHRoZSBwYXJzZXIuIiIiCisgICAgICAgIEV4cGF0QnVpbGRlci5pbnN0YWxsKHNlbGYsIHBhcnNlcikKKyAgICAgICAgaWYgc2VsZi5fb3B0aW9ucy5uYW1lc3BhY2VfZGVjbGFyYXRpb25zOgorICAgICAgICAgICAgcGFyc2VyLlN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgPSAoCisgICAgICAgICAgICAgICAgc2VsZi5zdGFydF9uYW1lc3BhY2VfZGVjbF9oYW5kbGVyKQorCisgICAgZGVmIHN0YXJ0X25hbWVzcGFjZV9kZWNsX2hhbmRsZXIoc2VsZiwgcHJlZml4LCB1cmkpOgorICAgICAgICAiIiJQdXNoIHRoaXMgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIG9uIG91ciBzdG9yYWdlLiIiIgorICAgICAgICBzZWxmLl9uc19vcmRlcmVkX3ByZWZpeGVzLmFwcGVuZCgocHJlZml4LCB1cmkpKQorCisgICAgZGVmIHN0YXJ0X2VsZW1lbnRfaGFuZGxlcihzZWxmLCBuYW1lLCBhdHRyaWJ1dGVzKToKKyAgICAgICAgaWYgJyAnIGluIG5hbWU6CisgICAgICAgICAgICB1cmksIGxvY2FsbmFtZSwgcHJlZml4LCBxbmFtZSA9IF9wYXJzZV9uc19uYW1lKHNlbGYsIG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1cmkgPSBFTVBUWV9OQU1FU1BBQ0UKKyAgICAgICAgICAgIHFuYW1lID0gbmFtZQorICAgICAgICAgICAgbG9jYWxuYW1lID0gTm9uZQorICAgICAgICAgICAgcHJlZml4ID0gRU1QVFlfUFJFRklYCisgICAgICAgIG5vZGUgPSBtaW5pZG9tLkVsZW1lbnQocW5hbWUsIHVyaSwgcHJlZml4LCBsb2NhbG5hbWUpCisgICAgICAgIG5vZGUub3duZXJEb2N1bWVudCA9IHNlbGYuZG9jdW1lbnQKKyAgICAgICAgX2FwcGVuZF9jaGlsZChzZWxmLmN1ck5vZGUsIG5vZGUpCisgICAgICAgIHNlbGYuY3VyTm9kZSA9IG5vZGUKKworICAgICAgICBpZiBzZWxmLl9uc19vcmRlcmVkX3ByZWZpeGVzOgorICAgICAgICAgICAgZm9yIHByZWZpeCwgdXJpIGluIHNlbGYuX25zX29yZGVyZWRfcHJlZml4ZXM6CisgICAgICAgICAgICAgICAgaWYgcHJlZml4OgorICAgICAgICAgICAgICAgICAgICBhID0gbWluaWRvbS5BdHRyKF9pbnRlcm4oc2VsZiwgJ3htbG5zOicgKyBwcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTE5TX05BTUVTUEFDRSwgcHJlZml4LCAieG1sbnMiKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGEgPSBtaW5pZG9tLkF0dHIoInhtbG5zIiwgWE1MTlNfTkFNRVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4bWxucyIsIEVNUFRZX1BSRUZJWCkKKyAgICAgICAgICAgICAgICBkID0gYS5jaGlsZE5vZGVzWzBdLl9fZGljdF9fCisgICAgICAgICAgICAgICAgZFsnZGF0YSddID0gZFsnbm9kZVZhbHVlJ10gPSB1cmkKKyAgICAgICAgICAgICAgICBkID0gYS5fX2RpY3RfXworICAgICAgICAgICAgICAgIGRbJ3ZhbHVlJ10gPSBkWydub2RlVmFsdWUnXSA9IHVyaQorICAgICAgICAgICAgICAgIGRbJ293bmVyRG9jdW1lbnQnXSA9IHNlbGYuZG9jdW1lbnQKKyAgICAgICAgICAgICAgICBfc2V0X2F0dHJpYnV0ZV9ub2RlKG5vZGUsIGEpCisgICAgICAgICAgICBkZWwgc2VsZi5fbnNfb3JkZXJlZF9wcmVmaXhlc1s6XQorCisgICAgICAgIGlmIGF0dHJpYnV0ZXM6CisgICAgICAgICAgICBfYXR0cnMgPSBub2RlLl9hdHRycworICAgICAgICAgICAgX2F0dHJzTlMgPSBub2RlLl9hdHRyc05TCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oYXR0cmlidXRlcyksIDIpOgorICAgICAgICAgICAgICAgIGFuYW1lID0gYXR0cmlidXRlc1tpXQorICAgICAgICAgICAgICAgIHZhbHVlID0gYXR0cmlidXRlc1tpKzFdCisgICAgICAgICAgICAgICAgaWYgJyAnIGluIGFuYW1lOgorICAgICAgICAgICAgICAgICAgICB1cmksIGxvY2FsbmFtZSwgcHJlZml4LCBxbmFtZSA9IF9wYXJzZV9uc19uYW1lKHNlbGYsIGFuYW1lKQorICAgICAgICAgICAgICAgICAgICBhID0gbWluaWRvbS5BdHRyKHFuYW1lLCB1cmksIGxvY2FsbmFtZSwgcHJlZml4KQorICAgICAgICAgICAgICAgICAgICBfYXR0cnNbcW5hbWVdID0gYQorICAgICAgICAgICAgICAgICAgICBfYXR0cnNOU1sodXJpLCBsb2NhbG5hbWUpXSA9IGEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhID0gbWluaWRvbS5BdHRyKGFuYW1lLCBFTVBUWV9OQU1FU1BBQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5hbWUsIEVNUFRZX1BSRUZJWCkKKyAgICAgICAgICAgICAgICAgICAgX2F0dHJzW2FuYW1lXSA9IGEKKyAgICAgICAgICAgICAgICAgICAgX2F0dHJzTlNbKEVNUFRZX05BTUVTUEFDRSwgYW5hbWUpXSA9IGEKKyAgICAgICAgICAgICAgICBkID0gYS5jaGlsZE5vZGVzWzBdLl9fZGljdF9fCisgICAgICAgICAgICAgICAgZFsnZGF0YSddID0gZFsnbm9kZVZhbHVlJ10gPSB2YWx1ZQorICAgICAgICAgICAgICAgIGQgPSBhLl9fZGljdF9fCisgICAgICAgICAgICAgICAgZFsnb3duZXJEb2N1bWVudCddID0gc2VsZi5kb2N1bWVudAorICAgICAgICAgICAgICAgIGRbJ3ZhbHVlJ10gPSBkWydub2RlVmFsdWUnXSA9IHZhbHVlCisgICAgICAgICAgICAgICAgZFsnb3duZXJFbGVtZW50J10gPSBub2RlCisKKyAgICBpZiBfX2RlYnVnX186CisgICAgICAgICMgVGhpcyBvbmx5IGFkZHMgc29tZSBhc3NlcnRzIHRvIHRoZSBvcmlnaW5hbAorICAgICAgICAjIGVuZF9lbGVtZW50X2hhbmRsZXIoKSwgc28gd2Ugb25seSBkZWZpbmUgdGhpcyB3aGVuIC1PIGlzIG5vdAorICAgICAgICAjIHVzZWQuICBJZiBjaGFuZ2luZyBvbmUsIGJlIHN1cmUgdG8gY2hlY2sgdGhlIG90aGVyIHRvIHNlZSBpZgorICAgICAgICAjIGl0IG5lZWRzIHRvIGJlIGNoYW5nZWQgYXMgd2VsbC4KKyAgICAgICAgIworICAgICAgICBkZWYgZW5kX2VsZW1lbnRfaGFuZGxlcihzZWxmLCBuYW1lKToKKyAgICAgICAgICAgIGN1ck5vZGUgPSBzZWxmLmN1ck5vZGUKKyAgICAgICAgICAgIGlmICcgJyBpbiBuYW1lOgorICAgICAgICAgICAgICAgIHVyaSwgbG9jYWxuYW1lLCBwcmVmaXgsIHFuYW1lID0gX3BhcnNlX25zX25hbWUoc2VsZiwgbmFtZSkKKyAgICAgICAgICAgICAgICBhc3NlcnQgKGN1ck5vZGUubmFtZXNwYWNlVVJJID09IHVyaQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGN1ck5vZGUubG9jYWxOYW1lID09IGxvY2FsbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGN1ck5vZGUucHJlZml4ID09IHByZWZpeCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50IHN0YWNrIG1lc3NlZCB1cCEgKG5hbWVzcGFjZSkiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFzc2VydCBjdXJOb2RlLm5vZGVOYW1lID09IG5hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnQgc3RhY2sgbWVzc2VkIHVwIC0gYmFkIG5vZGVOYW1lIgorICAgICAgICAgICAgICAgIGFzc2VydCBjdXJOb2RlLm5hbWVzcGFjZVVSSSA9PSBFTVBUWV9OQU1FU1BBQ0UsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnQgc3RhY2sgbWVzc2VkIHVwIC0gYmFkIG5hbWVzcGFjZVVSSSIKKyAgICAgICAgICAgIHNlbGYuY3VyTm9kZSA9IGN1ck5vZGUucGFyZW50Tm9kZQorICAgICAgICAgICAgc2VsZi5fZmluaXNoX2VuZF9lbGVtZW50KGN1ck5vZGUpCisKKworY2xhc3MgRXhwYXRCdWlsZGVyTlMoTmFtZXNwYWNlcywgRXhwYXRCdWlsZGVyKToKKyAgICAiIiJEb2N1bWVudCBidWlsZGVyIHRoYXQgc3VwcG9ydHMgbmFtZXNwYWNlcy4iIiIKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgRXhwYXRCdWlsZGVyLnJlc2V0KHNlbGYpCisgICAgICAgIHNlbGYuX2luaXROYW1lc3BhY2VzKCkKKworCitjbGFzcyBGcmFnbWVudEJ1aWxkZXJOUyhOYW1lc3BhY2VzLCBGcmFnbWVudEJ1aWxkZXIpOgorICAgICIiIkZyYWdtZW50IGJ1aWxkZXIgdGhhdCBzdXBwb3J0cyBuYW1lc3BhY2VzLiIiIgorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBGcmFnbWVudEJ1aWxkZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5faW5pdE5hbWVzcGFjZXMoKQorCisgICAgZGVmIF9nZXROU2F0dHJzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gc3RyaW5nIG9mIG5hbWVzcGFjZSBhdHRyaWJ1dGVzIGZyb20gdGhpcyBlbGVtZW50IGFuZAorICAgICAgICBhbmNlc3RvcnMuIiIiCisgICAgICAgICMgWFhYIFRoaXMgbmVlZHMgdG8gYmUgcmUtd3JpdHRlbiB0byB3YWxrIHRoZSBhbmNlc3RvcnMgb2YgdGhlCisgICAgICAgICMgY29udGV4dCB0byBidWlsZCB1cCB0aGUgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGZyb20KKyAgICAgICAgIyBkZWNsYXJhdGlvbnMsIGVsZW1lbnRzLCBhbmQgYXR0cmlidXRlcyBmb3VuZCBpbiBjb250ZXh0LgorICAgICAgICAjIE90aGVyd2lzZSB3ZSBoYXZlIHRvIHN0b3JlIGEgYnVuY2ggbW9yZSBkYXRhIG9uIHRoZSBET00KKyAgICAgICAgIyAodGhvdWdoIHRoYXQgKm1pZ2h0KiBiZSBtb3JlIHJlbGlhYmxlIC0tIG5vdCBjbGVhcikuCisgICAgICAgIGF0dHJzID0gIiIKKyAgICAgICAgY29udGV4dCA9IHNlbGYuY29udGV4dAorICAgICAgICBMID0gW10KKyAgICAgICAgd2hpbGUgY29udGV4dDoKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoY29udGV4dCwgJ19uc19wcmVmaXhfdXJpJyk6CisgICAgICAgICAgICAgICAgZm9yIHByZWZpeCwgdXJpIGluIGNvbnRleHQuX25zX3ByZWZpeF91cmkuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgIyBhZGQgZXZlcnkgbmV3IE5TIGRlY2wgZnJvbSBjb250ZXh0IHRvIEwgYW5kIGF0dHJzIHN0cmluZworICAgICAgICAgICAgICAgICAgICBpZiBwcmVmaXggaW4gTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIEwuYXBwZW5kKHByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJlZml4OgorICAgICAgICAgICAgICAgICAgICAgICAgZGVjbG5hbWUgPSAieG1sbnM6IiArIHByZWZpeAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVjbG5hbWUgPSAieG1sbnMiCisgICAgICAgICAgICAgICAgICAgIGlmIGF0dHJzOgorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMgPSAiJXNcbiAgICAlcz0nJXMnIiAlIChhdHRycywgZGVjbG5hbWUsIHVyaSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzID0gIiAlcz0nJXMnIiAlIChkZWNsbmFtZSwgdXJpKQorICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQucGFyZW50Tm9kZQorICAgICAgICByZXR1cm4gYXR0cnMKKworCitjbGFzcyBQYXJzZUVzY2FwZShFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgdG8gc2hvcnQtY2lyY3VpdCBwYXJzaW5nIGluIEludGVybmFsU3Vic2V0RXh0cmFjdG9yLiIiIgorICAgIHBhc3MKKworY2xhc3MgSW50ZXJuYWxTdWJzZXRFeHRyYWN0b3IoRXhwYXRCdWlsZGVyKToKKyAgICAiIiJYTUwgcHJvY2Vzc29yIHdoaWNoIGNhbiByaXAgb3V0IHRoZSBpbnRlcm5hbCBkb2N1bWVudCB0eXBlIHN1YnNldC4iIiIKKworICAgIHN1YnNldCA9IE5vbmUKKworICAgIGRlZiBnZXRTdWJzZXQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgaW50ZXJuYWwgc3Vic2V0IGFzIGEgc3RyaW5nLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5zdWJzZXQKKworICAgIGRlZiBwYXJzZUZpbGUoc2VsZiwgZmlsZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEV4cGF0QnVpbGRlci5wYXJzZUZpbGUoc2VsZiwgZmlsZSkKKyAgICAgICAgZXhjZXB0IFBhcnNlRXNjYXBlOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHBhcnNlU3RyaW5nKHNlbGYsIHN0cmluZyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEV4cGF0QnVpbGRlci5wYXJzZVN0cmluZyhzZWxmLCBzdHJpbmcpCisgICAgICAgIGV4Y2VwdCBQYXJzZUVzY2FwZToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBpbnN0YWxsKHNlbGYsIHBhcnNlcik6CisgICAgICAgIHBhcnNlci5TdGFydERvY3R5cGVEZWNsSGFuZGxlciA9IHNlbGYuc3RhcnRfZG9jdHlwZV9kZWNsX2hhbmRsZXIKKyAgICAgICAgcGFyc2VyLlN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzZWxmLnN0YXJ0X2VsZW1lbnRfaGFuZGxlcgorCisgICAgZGVmIHN0YXJ0X2RvY3R5cGVfZGVjbF9oYW5kbGVyKHNlbGYsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2ludGVybmFsX3N1YnNldCk6CisgICAgICAgIGlmIGhhc19pbnRlcm5hbF9zdWJzZXQ6CisgICAgICAgICAgICBwYXJzZXIgPSBzZWxmLmdldFBhcnNlcigpCisgICAgICAgICAgICBzZWxmLnN1YnNldCA9IFtdCisgICAgICAgICAgICBwYXJzZXIuRGVmYXVsdEhhbmRsZXIgPSBzZWxmLnN1YnNldC5hcHBlbmQKKyAgICAgICAgICAgIHBhcnNlci5FbmREb2N0eXBlRGVjbEhhbmRsZXIgPSBzZWxmLmVuZF9kb2N0eXBlX2RlY2xfaGFuZGxlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUGFyc2VFc2NhcGUoKQorCisgICAgZGVmIGVuZF9kb2N0eXBlX2RlY2xfaGFuZGxlcihzZWxmKToKKyAgICAgICAgcyA9ICcnLmpvaW4oc2VsZi5zdWJzZXQpLnJlcGxhY2UoJ1xyXG4nLCAnXG4nKS5yZXBsYWNlKCdccicsICdcbicpCisgICAgICAgIHNlbGYuc3Vic2V0ID0gcworICAgICAgICByYWlzZSBQYXJzZUVzY2FwZSgpCisKKyAgICBkZWYgc3RhcnRfZWxlbWVudF9oYW5kbGVyKHNlbGYsIG5hbWUsIGF0dHJzKToKKyAgICAgICAgcmFpc2UgUGFyc2VFc2NhcGUoKQorCisKK2RlZiBwYXJzZShmaWxlLCBuYW1lc3BhY2VzPVRydWUpOgorICAgICIiIlBhcnNlIGEgZG9jdW1lbnQsIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIERvY3VtZW50IG5vZGUuCisKKyAgICAnZmlsZScgbWF5IGJlIGVpdGhlciBhIGZpbGUgbmFtZSBvciBhbiBvcGVuIGZpbGUgb2JqZWN0LgorICAgICIiIgorICAgIGlmIG5hbWVzcGFjZXM6CisgICAgICAgIGJ1aWxkZXIgPSBFeHBhdEJ1aWxkZXJOUygpCisgICAgZWxzZToKKyAgICAgICAgYnVpbGRlciA9IEV4cGF0QnVpbGRlcigpCisKKyAgICBpZiBpc2luc3RhbmNlKGZpbGUsIFN0cmluZ1R5cGVzKToKKyAgICAgICAgZnAgPSBvcGVuKGZpbGUsICdyYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IGJ1aWxkZXIucGFyc2VGaWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgIGVsc2U6CisgICAgICAgIHJlc3VsdCA9IGJ1aWxkZXIucGFyc2VGaWxlKGZpbGUpCisgICAgcmV0dXJuIHJlc3VsdAorCisKK2RlZiBwYXJzZVN0cmluZyhzdHJpbmcsIG5hbWVzcGFjZXM9VHJ1ZSk6CisgICAgIiIiUGFyc2UgYSBkb2N1bWVudCBmcm9tIGEgc3RyaW5nLCByZXR1cm5pbmcgdGhlIHJlc3VsdGluZworICAgIERvY3VtZW50IG5vZGUuCisgICAgIiIiCisgICAgaWYgbmFtZXNwYWNlczoKKyAgICAgICAgYnVpbGRlciA9IEV4cGF0QnVpbGRlck5TKCkKKyAgICBlbHNlOgorICAgICAgICBidWlsZGVyID0gRXhwYXRCdWlsZGVyKCkKKyAgICByZXR1cm4gYnVpbGRlci5wYXJzZVN0cmluZyhzdHJpbmcpCisKKworZGVmIHBhcnNlRnJhZ21lbnQoZmlsZSwgY29udGV4dCwgbmFtZXNwYWNlcz1UcnVlKToKKyAgICAiIiJQYXJzZSBhIGZyYWdtZW50IG9mIGEgZG9jdW1lbnQsIGdpdmVuIHRoZSBjb250ZXh0IGZyb20gd2hpY2ggaXQKKyAgICB3YXMgb3JpZ2luYWxseSBleHRyYWN0ZWQuICBjb250ZXh0IHNob3VsZCBiZSB0aGUgcGFyZW50IG9mIHRoZQorICAgIG5vZGUocykgd2hpY2ggYXJlIGluIHRoZSBmcmFnbWVudC4KKworICAgICdmaWxlJyBtYXkgYmUgZWl0aGVyIGEgZmlsZSBuYW1lIG9yIGFuIG9wZW4gZmlsZSBvYmplY3QuCisgICAgIiIiCisgICAgaWYgbmFtZXNwYWNlczoKKyAgICAgICAgYnVpbGRlciA9IEZyYWdtZW50QnVpbGRlck5TKGNvbnRleHQpCisgICAgZWxzZToKKyAgICAgICAgYnVpbGRlciA9IEZyYWdtZW50QnVpbGRlcihjb250ZXh0KQorCisgICAgaWYgaXNpbnN0YW5jZShmaWxlLCBTdHJpbmdUeXBlcyk6CisgICAgICAgIGZwID0gb3BlbihmaWxlLCAncmInKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSBidWlsZGVyLnBhcnNlRmlsZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICBlbHNlOgorICAgICAgICByZXN1bHQgPSBidWlsZGVyLnBhcnNlRmlsZShmaWxlKQorICAgIHJldHVybiByZXN1bHQKKworCitkZWYgcGFyc2VGcmFnbWVudFN0cmluZyhzdHJpbmcsIGNvbnRleHQsIG5hbWVzcGFjZXM9VHJ1ZSk6CisgICAgIiIiUGFyc2UgYSBmcmFnbWVudCBvZiBhIGRvY3VtZW50IGZyb20gYSBzdHJpbmcsIGdpdmVuIHRoZSBjb250ZXh0CisgICAgZnJvbSB3aGljaCBpdCB3YXMgb3JpZ2luYWxseSBleHRyYWN0ZWQuICBjb250ZXh0IHNob3VsZCBiZSB0aGUKKyAgICBwYXJlbnQgb2YgdGhlIG5vZGUocykgd2hpY2ggYXJlIGluIHRoZSBmcmFnbWVudC4KKyAgICAiIiIKKyAgICBpZiBuYW1lc3BhY2VzOgorICAgICAgICBidWlsZGVyID0gRnJhZ21lbnRCdWlsZGVyTlMoY29udGV4dCkKKyAgICBlbHNlOgorICAgICAgICBidWlsZGVyID0gRnJhZ21lbnRCdWlsZGVyKGNvbnRleHQpCisgICAgcmV0dXJuIGJ1aWxkZXIucGFyc2VTdHJpbmcoc3RyaW5nKQorCisKK2RlZiBtYWtlQnVpbGRlcihvcHRpb25zKToKKyAgICAiIiJDcmVhdGUgYSBidWlsZGVyIGJhc2VkIG9uIGFuIE9wdGlvbnMgb2JqZWN0LiIiIgorICAgIGlmIG9wdGlvbnMubmFtZXNwYWNlczoKKyAgICAgICAgcmV0dXJuIEV4cGF0QnVpbGRlck5TKG9wdGlvbnMpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIEV4cGF0QnVpbGRlcihvcHRpb25zKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL2V4cGF0YnVpbGRlci5weWMgYi9saWIvcHl0aG9uMi43L3htbC9kb20vZXhwYXRidWlsZGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGE4YjkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL2V4cGF0YnVpbGRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL2V4cGF0YnVpbGRlci5weW8gYi9saWIvcHl0aG9uMi43L3htbC9kb20vZXhwYXRidWlsZGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjc4ODlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL2V4cGF0YnVpbGRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmljb21wYXQucHkgYi9saWIvcHl0aG9uMi43L3htbC9kb20vbWluaWNvbXBhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTRjYjRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmljb21wYXQucHkKQEAgLTAsMCArMSwxMTAgQEAKKyIiIlB5dGhvbiB2ZXJzaW9uIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBmb3IgbWluaWRvbS4iIiIKKworIyBUaGlzIG1vZHVsZSBzaG91bGQgb25seSBiZSBpbXBvcnRlZCB1c2luZyAiaW1wb3J0ICoiLgorIworIyBUaGUgZm9sbG93aW5nIG5hbWVzIGFyZSBkZWZpbmVkOgorIworIyAgIE5vZGVMaXN0ICAgICAgLS0gbGlnaHRlc3QgcG9zc2libGUgTm9kZUxpc3QgaW1wbGVtZW50YXRpb24KKyMKKyMgICBFbXB0eU5vZGVMaXN0IC0tIGxpZ2h0ZXN0IHBvc3NpYmxlIE5vZGVMaXN0IHRoYXQgaXMgZ3VhcmFudGVlZCB0bworIyAgICAgICAgICAgICAgICAgICAgcmVtYWluIGVtcHR5IChpbW11dGFibGUpCisjCisjICAgU3RyaW5nVHlwZXMgICAtLSB0dXBsZSBvZiBkZWZpbmVkIHN0cmluZyB0eXBlcworIworIyAgIGRlZnByb3BlcnR5ICAgLS0gZnVuY3Rpb24gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEdldGF0dHJNYWdpYzsKKyMgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZXNlIHRvZ2V0aGVyIGlzIG5lZWRlZCB0byBtYWtlIHRoZW0gd29yaworIyAgICAgICAgICAgICAgICAgICAgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUgaW4gYm90aCBQeXRob24gMi4yKworIyAgICAgICAgICAgICAgICAgICAgYW5kIG9sZGVyIHZlcnNpb25zLiAgRm9yIGV4YW1wbGU6CisjCisjICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgTXlDbGFzcyhHZXRhdHRyTWFnaWMpOgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgX2dldF9teWF0dHIoc2VsZik6CisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc29tZXRoaW5nCisjCisjICAgICAgICAgICAgICAgICAgICAgICAgZGVmcHJvcGVydHkoTXlDbGFzcywgIm15YXR0ciIsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybiBzb21lIHZhbHVlIikKKyMKKyMgICAgICAgICAgICAgICAgICAgIEZvciBQeXRob24gMi4yIGFuZCBuZXdlciwgdGhpcyB3aWxsIGNvbnN0cnVjdCBhCisjICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBvYmplY3Qgb24gdGhlIGNsYXNzLCB3aGljaCBhdm9pZHMKKyMgICAgICAgICAgICAgICAgICAgIG5lZWRpbmcgdG8gb3ZlcnJpZGUgX19nZXRhdHRyX18oKS4gIEl0IHdpbGwgb25seQorIyAgICAgICAgICAgICAgICAgICAgd29yayBmb3IgcmVhZC1vbmx5IGF0dHJpYnV0ZXMuCisjCisjICAgICAgICAgICAgICAgICAgICBGb3Igb2xkZXIgdmVyc2lvbnMgb2YgUHl0aG9uLCBpbmhlcml0aW5nIGZyb20KKyMgICAgICAgICAgICAgICAgICAgIEdldGF0dHJNYWdpYyB3aWxsIHVzZSB0aGUgdHJhZGl0aW9uYWwKKyMgICAgICAgICAgICAgICAgICAgIF9fZ2V0YXR0cl9fKCkgaGFja2VyeSB0byBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCwKKyMgICAgICAgICAgICAgICAgICAgIGJ1dCBsZXNzIGVmZmljaWVudGx5LgorIworIyAgICAgICAgICAgICAgICAgICAgZGVmcHJvcGVydHkoKSBzaG91bGQgYmUgdXNlZCBmb3IgZWFjaCB2ZXJzaW9uIG9mCisjICAgICAgICAgICAgICAgICAgICB0aGUgcmVsZXZhbnQgX2dldF88cHJvcGVydHk+KCkgZnVuY3Rpb24uCisKK19fYWxsX18gPSBbIk5vZGVMaXN0IiwgIkVtcHR5Tm9kZUxpc3QiLCAiU3RyaW5nVHlwZXMiLCAiZGVmcHJvcGVydHkiXQorCitpbXBvcnQgeG1sLmRvbQorCit0cnk6CisgICAgdW5pY29kZQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBTdHJpbmdUeXBlcyA9IHR5cGUoJycpLAorZWxzZToKKyAgICBTdHJpbmdUeXBlcyA9IHR5cGUoJycpLCB0eXBlKHVuaWNvZGUoJycpKQorCisKK2NsYXNzIE5vZGVMaXN0KGxpc3QpOgorICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBkZWYgaXRlbShzZWxmLCBpbmRleCk6CisgICAgICAgIGlmIDAgPD0gaW5kZXggPCBsZW4oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZltpbmRleF0KKworICAgIGRlZiBfZ2V0X2xlbmd0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmKQorCisgICAgZGVmIF9zZXRfbGVuZ3RoKHNlbGYsIHZhbHVlKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCisgICAgICAgICAgICAiYXR0ZW1wdCB0byBtb2RpZnkgcmVhZC1vbmx5IGF0dHJpYnV0ZSAnbGVuZ3RoJyIpCisKKyAgICBsZW5ndGggPSBwcm9wZXJ0eShfZ2V0X2xlbmd0aCwgX3NldF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgZG9jPSJUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBOb2RlTGlzdC4iKQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZikKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICBzZWxmWzpdID0gc3RhdGUKKworCitjbGFzcyBFbXB0eU5vZGVMaXN0KHR1cGxlKToKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBOTCA9IE5vZGVMaXN0KCkKKyAgICAgICAgTkwuZXh0ZW5kKG90aGVyKQorICAgICAgICByZXR1cm4gTkwKKworICAgIGRlZiBfX3JhZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIE5MID0gTm9kZUxpc3QoKQorICAgICAgICBOTC5leHRlbmQob3RoZXIpCisgICAgICAgIHJldHVybiBOTAorCisgICAgZGVmIGl0ZW0oc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9nZXRfbGVuZ3RoKHNlbGYpOgorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIF9zZXRfbGVuZ3RoKHNlbGYsIHZhbHVlKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCisgICAgICAgICAgICAiYXR0ZW1wdCB0byBtb2RpZnkgcmVhZC1vbmx5IGF0dHJpYnV0ZSAnbGVuZ3RoJyIpCisKKyAgICBsZW5ndGggPSBwcm9wZXJ0eShfZ2V0X2xlbmd0aCwgX3NldF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgZG9jPSJUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBOb2RlTGlzdC4iKQorCisKK2RlZiBkZWZwcm9wZXJ0eShrbGFzcywgbmFtZSwgZG9jKToKKyAgICBnZXQgPSBnZXRhdHRyKGtsYXNzLCAoIl9nZXRfIiArIG5hbWUpKS5pbV9mdW5jCisgICAgZGVmIHNldChzZWxmLCB2YWx1ZSwgbmFtZT1uYW1lKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCisgICAgICAgICAgICAiYXR0ZW1wdCB0byBtb2RpZnkgcmVhZC1vbmx5IGF0dHJpYnV0ZSAiICsgcmVwcihuYW1lKSkKKyAgICBhc3NlcnQgbm90IGhhc2F0dHIoa2xhc3MsICJfc2V0XyIgKyBuYW1lKSwgXAorICAgICAgICAgICAiZXhwZWN0ZWQgbm90IHRvIGZpbmQgX3NldF8iICsgbmFtZQorICAgIHByb3AgPSBwcm9wZXJ0eShnZXQsIHNldCwgZG9jPWRvYykKKyAgICBzZXRhdHRyKGtsYXNzLCBuYW1lLCBwcm9wKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmljb21wYXQucHljIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmljb21wYXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzU4YjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vbWluaWNvbXBhdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmljb21wYXQucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmljb21wYXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MGZlNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vbWluaWNvbXBhdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmlkb20ucHkgYi9saWIvcHl0aG9uMi43L3htbC9kb20vbWluaWRvbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGVkMjMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmlkb20ucHkKQEAgLTAsMCArMSwxOTQ0IEBACisiIiJTaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIExldmVsIDEgRE9NLgorCitOYW1lc3BhY2VzIGFuZCBvdGhlciBtaW5vciBMZXZlbCAyIGZlYXR1cmVzIGFyZSBhbHNvIHN1cHBvcnRlZC4KKworcGFyc2UoImZvby54bWwiKQorCitwYXJzZVN0cmluZygiPGZvbz48YmFyLz48L2Zvbz4iKQorCitUb2RvOgorPT09PT0KKyAqIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGdldHRpbmcgZWxlbWVudHMgYW5kIHRleHQuCisgKiBtb3JlIHRlc3RpbmcKKyAqIGJyaW5nIHNvbWUgb2YgdGhlIHdyaXRlciBhbmQgbGluZWFyaXplciBjb2RlIGludG8gY29uZm9ybWFuY2Ugd2l0aCB0aGlzCisgICAgICAgIGludGVyZmFjZQorICogU0FYIDIgbmFtZXNwYWNlcworIiIiCisKK2ltcG9ydCB4bWwuZG9tCisKK2Zyb20geG1sLmRvbSBpbXBvcnQgRU1QVFlfTkFNRVNQQUNFLCBFTVBUWV9QUkVGSVgsIFhNTE5TX05BTUVTUEFDRSwgZG9tcmVnCitmcm9tIHhtbC5kb20ubWluaWNvbXBhdCBpbXBvcnQgKgorZnJvbSB4bWwuZG9tLnhtbGJ1aWxkZXIgaW1wb3J0IERPTUltcGxlbWVudGF0aW9uTFMsIERvY3VtZW50TFMKKworIyBUaGlzIGlzIHVzZWQgYnkgdGhlIElELWNhY2hlIGludmFsaWRhdGlvbiBjaGVja3M7IHRoZSBsaXN0IGlzbid0CisjIGFjdHVhbGx5IGNvbXBsZXRlLCBzaW5jZSB0aGUgbm9kZXMgYmVpbmcgY2hlY2tlZCB3aWxsIG5ldmVyIGJlIHRoZQorIyBET0NVTUVOVF9OT0RFIG9yIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUuICAoVGhlIG5vZGUgYmVpbmcgY2hlY2tlZCBpcworIyB0aGUgbm9kZSBiZWluZyBhZGRlZCBvciByZW1vdmVkLCBub3QgdGhlIG5vZGUgYmVpbmcgbW9kaWZpZWQuKQorIworX25vZGVUeXBlc193aXRoX2NoaWxkcmVuID0gKHhtbC5kb20uTm9kZS5FTEVNRU5UX05PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sLmRvbS5Ob2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkKKworCitjbGFzcyBOb2RlKHhtbC5kb20uTm9kZSk6CisgICAgbmFtZXNwYWNlVVJJID0gTm9uZSAjIHRoaXMgaXMgbm9uLW51bGwgb25seSBmb3IgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMKKyAgICBwYXJlbnROb2RlID0gTm9uZQorICAgIG93bmVyRG9jdW1lbnQgPSBOb25lCisgICAgbmV4dFNpYmxpbmcgPSBOb25lCisgICAgcHJldmlvdXNTaWJsaW5nID0gTm9uZQorCisgICAgcHJlZml4ID0gRU1QVFlfUFJFRklYICMgbm9uLW51bGwgb25seSBmb3IgTlMgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMKKworICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB0b3htbChzZWxmLCBlbmNvZGluZyA9IE5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi50b3ByZXR0eXhtbCgiIiwgIiIsIGVuY29kaW5nKQorCisgICAgZGVmIHRvcHJldHR5eG1sKHNlbGYsIGluZGVudD0iXHQiLCBuZXdsPSJcbiIsIGVuY29kaW5nID0gTm9uZSk6CisgICAgICAgICMgaW5kZW50ID0gdGhlIGluZGVudGF0aW9uIHN0cmluZyB0byBwcmVwZW5kLCBwZXIgbGV2ZWwKKyAgICAgICAgIyBuZXdsID0gdGhlIG5ld2xpbmUgc3RyaW5nIHRvIGFwcGVuZAorICAgICAgICB3cml0ZXIgPSBfZ2V0X1N0cmluZ0lPKCkKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpbXBvcnQgY29kZWNzCisgICAgICAgICAgICAjIENhbid0IHVzZSBjb2RlY3MuZ2V0d3JpdGVyIHRvIHByZXNlcnZlIDIuMCBjb21wYXRpYmlsaXR5CisgICAgICAgICAgICB3cml0ZXIgPSBjb2RlY3MubG9va3VwKGVuY29kaW5nKVszXSh3cml0ZXIpCisgICAgICAgIGlmIHNlbGYubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFOgorICAgICAgICAgICAgIyBDYW4gcGFzcyBlbmNvZGluZyBvbmx5IHRvIGRvY3VtZW50LCB0byBwdXQgaXQgaW50byBYTUwgaGVhZGVyCisgICAgICAgICAgICBzZWxmLndyaXRleG1sKHdyaXRlciwgIiIsIGluZGVudCwgbmV3bCwgZW5jb2RpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRleG1sKHdyaXRlciwgIiIsIGluZGVudCwgbmV3bCkKKyAgICAgICAgcmV0dXJuIHdyaXRlci5nZXR2YWx1ZSgpCisKKyAgICBkZWYgaGFzQ2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGlsZE5vZGVzOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9nZXRfY2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2hpbGROb2RlcworCisgICAgZGVmIF9nZXRfZmlyc3RDaGlsZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGlsZE5vZGVzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hpbGROb2Rlc1swXQorCisgICAgZGVmIF9nZXRfbGFzdENoaWxkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNoaWxkTm9kZXM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jaGlsZE5vZGVzWy0xXQorCisgICAgZGVmIGluc2VydEJlZm9yZShzZWxmLCBuZXdDaGlsZCwgcmVmQ2hpbGQpOgorICAgICAgICBpZiBuZXdDaGlsZC5ub2RlVHlwZSA9PSBzZWxmLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6CisgICAgICAgICAgICBmb3IgYyBpbiB0dXBsZShuZXdDaGlsZC5jaGlsZE5vZGVzKToKKyAgICAgICAgICAgICAgICBzZWxmLmluc2VydEJlZm9yZShjLCByZWZDaGlsZCkKKyAgICAgICAgICAgICMjIyBUaGUgRE9NIGRvZXMgbm90IGNsZWFybHkgc3BlY2lmeSB3aGF0IHRvIHJldHVybiBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIHJldHVybiBuZXdDaGlsZAorICAgICAgICBpZiBuZXdDaGlsZC5ub2RlVHlwZSBub3QgaW4gc2VsZi5fY2hpbGRfbm9kZV90eXBlczoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgICAgICAiJXMgY2Fubm90IGJlIGNoaWxkIG9mICVzIiAlIChyZXByKG5ld0NoaWxkKSwgcmVwcihzZWxmKSkpCisgICAgICAgIGlmIG5ld0NoaWxkLnBhcmVudE5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBuZXdDaGlsZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5ld0NoaWxkKQorICAgICAgICBpZiByZWZDaGlsZCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5hcHBlbmRDaGlsZChuZXdDaGlsZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbmRleCA9IHNlbGYuY2hpbGROb2Rlcy5pbmRleChyZWZDaGlsZCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICAgICAgaWYgbmV3Q2hpbGQubm9kZVR5cGUgaW4gX25vZGVUeXBlc193aXRoX2NoaWxkcmVuOgorICAgICAgICAgICAgICAgIF9jbGVhcl9pZF9jYWNoZShzZWxmKQorICAgICAgICAgICAgc2VsZi5jaGlsZE5vZGVzLmluc2VydChpbmRleCwgbmV3Q2hpbGQpCisgICAgICAgICAgICBuZXdDaGlsZC5uZXh0U2libGluZyA9IHJlZkNoaWxkCisgICAgICAgICAgICByZWZDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBuZXdDaGlsZAorICAgICAgICAgICAgaWYgaW5kZXg6CisgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYuY2hpbGROb2Rlc1tpbmRleC0xXQorICAgICAgICAgICAgICAgIG5vZGUubmV4dFNpYmxpbmcgPSBuZXdDaGlsZAorICAgICAgICAgICAgICAgIG5ld0NoaWxkLnByZXZpb3VzU2libGluZyA9IG5vZGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV3Q2hpbGQucHJldmlvdXNTaWJsaW5nID0gTm9uZQorICAgICAgICAgICAgbmV3Q2hpbGQucGFyZW50Tm9kZSA9IHNlbGYKKyAgICAgICAgcmV0dXJuIG5ld0NoaWxkCisKKyAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gc2VsZi5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgorICAgICAgICAgICAgZm9yIGMgaW4gdHVwbGUobm9kZS5jaGlsZE5vZGVzKToKKyAgICAgICAgICAgICAgICBzZWxmLmFwcGVuZENoaWxkKGMpCisgICAgICAgICAgICAjIyMgVGhlIERPTSBkb2VzIG5vdCBjbGVhcmx5IHNwZWNpZnkgd2hhdCB0byByZXR1cm4gaW4gdGhpcyBjYXNlCisgICAgICAgICAgICByZXR1cm4gbm9kZQorICAgICAgICBpZiBub2RlLm5vZGVUeXBlIG5vdCBpbiBzZWxmLl9jaGlsZF9ub2RlX3R5cGVzOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgICAgICIlcyBjYW5ub3QgYmUgY2hpbGQgb2YgJXMiICUgKHJlcHIobm9kZSksIHJlcHIoc2VsZikpKQorICAgICAgICBlbGlmIG5vZGUubm9kZVR5cGUgaW4gX25vZGVUeXBlc193aXRoX2NoaWxkcmVuOgorICAgICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYpCisgICAgICAgIGlmIG5vZGUucGFyZW50Tm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKQorICAgICAgICBfYXBwZW5kX2NoaWxkKHNlbGYsIG5vZGUpCisgICAgICAgIG5vZGUubmV4dFNpYmxpbmcgPSBOb25lCisgICAgICAgIHJldHVybiBub2RlCisKKyAgICBkZWYgcmVwbGFjZUNoaWxkKHNlbGYsIG5ld0NoaWxkLCBvbGRDaGlsZCk6CisgICAgICAgIGlmIG5ld0NoaWxkLm5vZGVUeXBlID09IHNlbGYuRE9DVU1FTlRfRlJBR01FTlRfTk9ERToKKyAgICAgICAgICAgIHJlZkNoaWxkID0gb2xkQ2hpbGQubmV4dFNpYmxpbmcKKyAgICAgICAgICAgIHNlbGYucmVtb3ZlQ2hpbGQob2xkQ2hpbGQpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsIHJlZkNoaWxkKQorICAgICAgICBpZiBuZXdDaGlsZC5ub2RlVHlwZSBub3QgaW4gc2VsZi5fY2hpbGRfbm9kZV90eXBlczoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgICAgICAiJXMgY2Fubm90IGJlIGNoaWxkIG9mICVzIiAlIChyZXByKG5ld0NoaWxkKSwgcmVwcihzZWxmKSkpCisgICAgICAgIGlmIG5ld0NoaWxkIGlzIG9sZENoaWxkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5ld0NoaWxkLnBhcmVudE5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBuZXdDaGlsZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5ld0NoaWxkKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbmRleCA9IHNlbGYuY2hpbGROb2Rlcy5pbmRleChvbGRDaGlsZCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgc2VsZi5jaGlsZE5vZGVzW2luZGV4XSA9IG5ld0NoaWxkCisgICAgICAgIG5ld0NoaWxkLnBhcmVudE5vZGUgPSBzZWxmCisgICAgICAgIG9sZENoaWxkLnBhcmVudE5vZGUgPSBOb25lCisgICAgICAgIGlmIChuZXdDaGlsZC5ub2RlVHlwZSBpbiBfbm9kZVR5cGVzX3dpdGhfY2hpbGRyZW4KKyAgICAgICAgICAgIG9yIG9sZENoaWxkLm5vZGVUeXBlIGluIF9ub2RlVHlwZXNfd2l0aF9jaGlsZHJlbik6CisgICAgICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZikKKyAgICAgICAgbmV3Q2hpbGQubmV4dFNpYmxpbmcgPSBvbGRDaGlsZC5uZXh0U2libGluZworICAgICAgICBuZXdDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBvbGRDaGlsZC5wcmV2aW91c1NpYmxpbmcKKyAgICAgICAgb2xkQ2hpbGQubmV4dFNpYmxpbmcgPSBOb25lCisgICAgICAgIG9sZENoaWxkLnByZXZpb3VzU2libGluZyA9IE5vbmUKKyAgICAgICAgaWYgbmV3Q2hpbGQucHJldmlvdXNTaWJsaW5nOgorICAgICAgICAgICAgbmV3Q2hpbGQucHJldmlvdXNTaWJsaW5nLm5leHRTaWJsaW5nID0gbmV3Q2hpbGQKKyAgICAgICAgaWYgbmV3Q2hpbGQubmV4dFNpYmxpbmc6CisgICAgICAgICAgICBuZXdDaGlsZC5uZXh0U2libGluZy5wcmV2aW91c1NpYmxpbmcgPSBuZXdDaGlsZAorICAgICAgICByZXR1cm4gb2xkQ2hpbGQKKworICAgIGRlZiByZW1vdmVDaGlsZChzZWxmLCBvbGRDaGlsZCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2hpbGROb2Rlcy5yZW1vdmUob2xkQ2hpbGQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgIGlmIG9sZENoaWxkLm5leHRTaWJsaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb2xkQ2hpbGQubmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nID0gb2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nCisgICAgICAgIGlmIG9sZENoaWxkLnByZXZpb3VzU2libGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9sZENoaWxkLnByZXZpb3VzU2libGluZy5uZXh0U2libGluZyA9IG9sZENoaWxkLm5leHRTaWJsaW5nCisgICAgICAgIG9sZENoaWxkLm5leHRTaWJsaW5nID0gb2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nID0gTm9uZQorICAgICAgICBpZiBvbGRDaGlsZC5ub2RlVHlwZSBpbiBfbm9kZVR5cGVzX3dpdGhfY2hpbGRyZW46CisgICAgICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZikKKworICAgICAgICBvbGRDaGlsZC5wYXJlbnROb2RlID0gTm9uZQorICAgICAgICByZXR1cm4gb2xkQ2hpbGQKKworICAgIGRlZiBub3JtYWxpemUoc2VsZik6CisgICAgICAgIEwgPSBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZE5vZGVzOgorICAgICAgICAgICAgaWYgY2hpbGQubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREU6CisgICAgICAgICAgICAgICAgaWYgbm90IGNoaWxkLmRhdGE6CisgICAgICAgICAgICAgICAgICAgICMgZW1wdHkgdGV4dCBub2RlOyBkaXNjYXJkCisgICAgICAgICAgICAgICAgICAgIGlmIEw6CisgICAgICAgICAgICAgICAgICAgICAgICBMWy0xXS5uZXh0U2libGluZyA9IGNoaWxkLm5leHRTaWJsaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIGNoaWxkLm5leHRTaWJsaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQubmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nID0gY2hpbGQucHJldmlvdXNTaWJsaW5nCisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnVubGluaygpCisgICAgICAgICAgICAgICAgZWxpZiBMIGFuZCBMWy0xXS5ub2RlVHlwZSA9PSBjaGlsZC5ub2RlVHlwZToKKyAgICAgICAgICAgICAgICAgICAgIyBjb2xsYXBzZSB0ZXh0IG5vZGUKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IExbLTFdCisgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YSA9IG5vZGUuZGF0YSArIGNoaWxkLmRhdGEKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5uZXh0U2libGluZyA9IGNoaWxkLm5leHRTaWJsaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIGNoaWxkLm5leHRTaWJsaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQubmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nID0gbm9kZQorICAgICAgICAgICAgICAgICAgICBjaGlsZC51bmxpbmsoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIEwuYXBwZW5kKGNoaWxkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBMLmFwcGVuZChjaGlsZCkKKyAgICAgICAgICAgICAgICBpZiBjaGlsZC5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQubm9ybWFsaXplKCkKKyAgICAgICAgc2VsZi5jaGlsZE5vZGVzWzpdID0gTAorCisgICAgZGVmIGNsb25lTm9kZShzZWxmLCBkZWVwKToKKyAgICAgICAgcmV0dXJuIF9jbG9uZV9ub2RlKHNlbGYsIGRlZXAsIHNlbGYub3duZXJEb2N1bWVudCBvciBzZWxmKQorCisgICAgZGVmIGlzU3VwcG9ydGVkKHNlbGYsIGZlYXR1cmUsIHZlcnNpb24pOgorICAgICAgICByZXR1cm4gc2VsZi5vd25lckRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoZmVhdHVyZSwgdmVyc2lvbikKKworICAgIGRlZiBfZ2V0X2xvY2FsTmFtZShzZWxmKToKKyAgICAgICAgIyBPdmVycmlkZGVuIGluIEVsZW1lbnQgYW5kIEF0dHIgd2hlcmUgbG9jYWxOYW1lIGNhbiBiZSBOb24tTnVsbAorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBOb2RlIGludGVyZmFjZXMgZnJvbSBMZXZlbCAzIChXRCA5IEFwcmlsIDIwMDIpCisKKyAgICBkZWYgaXNTYW1lTm9kZShzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmIGlzIG90aGVyCisKKyAgICBkZWYgZ2V0SW50ZXJmYWNlKHNlbGYsIGZlYXR1cmUpOgorICAgICAgICBpZiBzZWxmLmlzU3VwcG9ydGVkKGZlYXR1cmUsIE5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIFRoZSAidXNlciBkYXRhIiBmdW5jdGlvbnMgdXNlIGEgZGljdGlvbmFyeSB0aGF0IGlzIG9ubHkgcHJlc2VudAorICAgICMgaWYgc29tZSB1c2VyIGRhdGEgaGFzIGJlZW4gc2V0LCBzbyBiZSBjYXJlZnVsIG5vdCB0byBhc3N1bWUgaXQKKyAgICAjIGV4aXN0cy4KKworICAgIGRlZiBnZXRVc2VyRGF0YShzZWxmLCBrZXkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdXNlcl9kYXRhW2tleV1bMF0KKyAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgS2V5RXJyb3IpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBzZXRVc2VyRGF0YShzZWxmLCBrZXksIGRhdGEsIGhhbmRsZXIpOgorICAgICAgICBvbGQgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGQgPSBzZWxmLl91c2VyX2RhdGEKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgZCA9IHt9CisgICAgICAgICAgICBzZWxmLl91c2VyX2RhdGEgPSBkCisgICAgICAgIGlmIGtleSBpbiBkOgorICAgICAgICAgICAgb2xkID0gZFtrZXldWzBdCisgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgICMgaWdub3JlIGhhbmRsZXJzIHBhc3NlZCBmb3IgTm9uZQorICAgICAgICAgICAgaGFuZGxlciA9IE5vbmUKKyAgICAgICAgICAgIGlmIG9sZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBkZWwgZFtrZXldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkW2tleV0gPSAoZGF0YSwgaGFuZGxlcikKKyAgICAgICAgcmV0dXJuIG9sZAorCisgICAgZGVmIF9jYWxsX3VzZXJfZGF0YV9oYW5kbGVyKHNlbGYsIG9wZXJhdGlvbiwgc3JjLCBkc3QpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICJfdXNlcl9kYXRhIik6CisgICAgICAgICAgICBmb3Iga2V5LCAoZGF0YSwgaGFuZGxlcikgaW4gc2VsZi5fdXNlcl9kYXRhLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgaGFuZGxlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5oYW5kbGUob3BlcmF0aW9uLCBrZXksIGRhdGEsIHNyYywgZHN0KQorCisgICAgIyBtaW5pZG9tLXNwZWNpZmljIEFQSToKKworICAgIGRlZiB1bmxpbmsoc2VsZik6CisgICAgICAgIHNlbGYucGFyZW50Tm9kZSA9IHNlbGYub3duZXJEb2N1bWVudCA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5jaGlsZE5vZGVzOgorICAgICAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuY2hpbGROb2RlczoKKyAgICAgICAgICAgICAgICBjaGlsZC51bmxpbmsoKQorICAgICAgICAgICAgc2VsZi5jaGlsZE5vZGVzID0gTm9kZUxpc3QoKQorICAgICAgICBzZWxmLnByZXZpb3VzU2libGluZyA9IE5vbmUKKyAgICAgICAgc2VsZi5uZXh0U2libGluZyA9IE5vbmUKKworZGVmcHJvcGVydHkoTm9kZSwgImZpcnN0Q2hpbGQiLCBkb2M9IkZpcnN0IGNoaWxkIG5vZGUsIG9yIE5vbmUuIikKK2RlZnByb3BlcnR5KE5vZGUsICJsYXN0Q2hpbGQiLCAgZG9jPSJMYXN0IGNoaWxkIG5vZGUsIG9yIE5vbmUuIikKK2RlZnByb3BlcnR5KE5vZGUsICJsb2NhbE5hbWUiLCAgZG9jPSJOYW1lc3BhY2UtbG9jYWwgbmFtZSBvZiB0aGlzIG5vZGUuIikKKworCitkZWYgX2FwcGVuZF9jaGlsZChzZWxmLCBub2RlKToKKyAgICAjIGZhc3QgcGF0aCB3aXRoIGxlc3MgY2hlY2tzOyB1c2FibGUgYnkgRE9NIGJ1aWxkZXJzIGlmIGNhcmVmdWwKKyAgICBjaGlsZE5vZGVzID0gc2VsZi5jaGlsZE5vZGVzCisgICAgaWYgY2hpbGROb2RlczoKKyAgICAgICAgbGFzdCA9IGNoaWxkTm9kZXNbLTFdCisgICAgICAgIG5vZGUuX19kaWN0X19bInByZXZpb3VzU2libGluZyJdID0gbGFzdAorICAgICAgICBsYXN0Ll9fZGljdF9fWyJuZXh0U2libGluZyJdID0gbm9kZQorICAgIGNoaWxkTm9kZXMuYXBwZW5kKG5vZGUpCisgICAgbm9kZS5fX2RpY3RfX1sicGFyZW50Tm9kZSJdID0gc2VsZgorCitkZWYgX2luX2RvY3VtZW50KG5vZGUpOgorICAgICMgcmV0dXJuIFRydWUgaWZmIG5vZGUgaXMgcGFydCBvZiBhIGRvY3VtZW50IHRyZWUKKyAgICB3aGlsZSBub2RlIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfTk9ERToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGUKKyAgICByZXR1cm4gRmFsc2UKKworZGVmIF93cml0ZV9kYXRhKHdyaXRlciwgZGF0YSk6CisgICAgIldyaXRlcyBkYXRhY2hhcnMgdG8gd3JpdGVyLiIKKyAgICBpZiBkYXRhOgorICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCImIiwgIiZhbXA7IikucmVwbGFjZSgiPCIsICImbHQ7IikuIFwKKyAgICAgICAgICAgICAgICAgICAgcmVwbGFjZSgiXCIiLCAiJnF1b3Q7IikucmVwbGFjZSgiPiIsICImZ3Q7IikKKyAgICAgICAgd3JpdGVyLndyaXRlKGRhdGEpCisKK2RlZiBfZ2V0X2VsZW1lbnRzX2J5X3RhZ05hbWVfaGVscGVyKHBhcmVudCwgbmFtZSwgcmMpOgorICAgIGZvciBub2RlIGluIHBhcmVudC5jaGlsZE5vZGVzOgorICAgICAgICBpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFIGFuZCBcCisgICAgICAgICAgICAobmFtZSA9PSAiKiIgb3Igbm9kZS50YWdOYW1lID09IG5hbWUpOgorICAgICAgICAgICAgcmMuYXBwZW5kKG5vZGUpCisgICAgICAgIF9nZXRfZWxlbWVudHNfYnlfdGFnTmFtZV9oZWxwZXIobm9kZSwgbmFtZSwgcmMpCisgICAgcmV0dXJuIHJjCisKK2RlZiBfZ2V0X2VsZW1lbnRzX2J5X3RhZ05hbWVfbnNfaGVscGVyKHBhcmVudCwgbnNVUkksIGxvY2FsTmFtZSwgcmMpOgorICAgIGZvciBub2RlIGluIHBhcmVudC5jaGlsZE5vZGVzOgorICAgICAgICBpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgaWYgKChsb2NhbE5hbWUgPT0gIioiIG9yIG5vZGUubG9jYWxOYW1lID09IGxvY2FsTmFtZSkgYW5kCisgICAgICAgICAgICAgICAgKG5zVVJJID09ICIqIiBvciBub2RlLm5hbWVzcGFjZVVSSSA9PSBuc1VSSSkpOgorICAgICAgICAgICAgICAgIHJjLmFwcGVuZChub2RlKQorICAgICAgICAgICAgX2dldF9lbGVtZW50c19ieV90YWdOYW1lX25zX2hlbHBlcihub2RlLCBuc1VSSSwgbG9jYWxOYW1lLCByYykKKyAgICByZXR1cm4gcmMKKworY2xhc3MgRG9jdW1lbnRGcmFnbWVudChOb2RlKToKKyAgICBub2RlVHlwZSA9IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERQorICAgIG5vZGVOYW1lID0gIiNkb2N1bWVudC1mcmFnbWVudCIKKyAgICBub2RlVmFsdWUgPSBOb25lCisgICAgYXR0cmlidXRlcyA9IE5vbmUKKyAgICBwYXJlbnROb2RlID0gTm9uZQorICAgIF9jaGlsZF9ub2RlX3R5cGVzID0gKE5vZGUuRUxFTUVOVF9OT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUuVEVYVF9OT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUuQ09NTUVOVF9OT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUuTk9UQVRJT05fTk9ERSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGlsZE5vZGVzID0gTm9kZUxpc3QoKQorCisKK2NsYXNzIEF0dHIoTm9kZSk6CisgICAgbm9kZVR5cGUgPSBOb2RlLkFUVFJJQlVURV9OT0RFCisgICAgYXR0cmlidXRlcyA9IE5vbmUKKyAgICBvd25lckVsZW1lbnQgPSBOb25lCisgICAgc3BlY2lmaWVkID0gRmFsc2UKKyAgICBfaXNfaWQgPSBGYWxzZQorCisgICAgX2NoaWxkX25vZGVfdHlwZXMgPSAoTm9kZS5URVhUX05PREUsIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHFOYW1lLCBuYW1lc3BhY2VVUkk9RU1QVFlfTkFNRVNQQUNFLCBsb2NhbE5hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgcHJlZml4PU5vbmUpOgorICAgICAgICAjIHNraXAgc2V0YXR0ciBmb3IgcGVyZm9ybWFuY2UKKyAgICAgICAgZCA9IHNlbGYuX19kaWN0X18KKyAgICAgICAgZFsibm9kZU5hbWUiXSA9IGRbIm5hbWUiXSA9IHFOYW1lCisgICAgICAgIGRbIm5hbWVzcGFjZVVSSSJdID0gbmFtZXNwYWNlVVJJCisgICAgICAgIGRbInByZWZpeCJdID0gcHJlZml4CisgICAgICAgIGRbJ2NoaWxkTm9kZXMnXSA9IE5vZGVMaXN0KCkKKworICAgICAgICAjIEFkZCB0aGUgc2luZ2xlIGNoaWxkIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cgorICAgICAgICBzZWxmLmNoaWxkTm9kZXMuYXBwZW5kKFRleHQoKSkKKworICAgICAgICAjIG5vZGVWYWx1ZSBhbmQgdmFsdWUgYXJlIHNldCBlbHNld2hlcmUKKworICAgIGRlZiBfZ2V0X2xvY2FsTmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubm9kZU5hbWUuc3BsaXQoIjoiLCAxKVstMV0KKworICAgIGRlZiBfZ2V0X25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKKworICAgIGRlZiBfZ2V0X3NwZWNpZmllZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3BlY2lmaWVkCisKKyAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICBkID0gc2VsZi5fX2RpY3RfXworICAgICAgICBpZiBuYW1lIGluICgidmFsdWUiLCAibm9kZVZhbHVlIik6CisgICAgICAgICAgICBkWyJ2YWx1ZSJdID0gZFsibm9kZVZhbHVlIl0gPSB2YWx1ZQorICAgICAgICAgICAgZDIgPSBzZWxmLmNoaWxkTm9kZXNbMF0uX19kaWN0X18KKyAgICAgICAgICAgIGQyWyJkYXRhIl0gPSBkMlsibm9kZVZhbHVlIl0gPSB2YWx1ZQorICAgICAgICAgICAgaWYgc2VsZi5vd25lckVsZW1lbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYub3duZXJFbGVtZW50KQorICAgICAgICBlbGlmIG5hbWUgaW4gKCJuYW1lIiwgIm5vZGVOYW1lIik6CisgICAgICAgICAgICBkWyJuYW1lIl0gPSBkWyJub2RlTmFtZSJdID0gdmFsdWUKKyAgICAgICAgICAgIGlmIHNlbGYub3duZXJFbGVtZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIF9jbGVhcl9pZF9jYWNoZShzZWxmLm93bmVyRWxlbWVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRbbmFtZV0gPSB2YWx1ZQorCisgICAgZGVmIF9zZXRfcHJlZml4KHNlbGYsIHByZWZpeCk6CisgICAgICAgIG5zdXJpID0gc2VsZi5uYW1lc3BhY2VVUkkKKyAgICAgICAgaWYgcHJlZml4ID09ICJ4bWxucyI6CisgICAgICAgICAgICBpZiBuc3VyaSBhbmQgbnN1cmkgIT0gWE1MTlNfTkFNRVNQQUNFOgorICAgICAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTmFtZXNwYWNlRXJyKAorICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCB1c2Ugb2YgJ3htbG5zJyBwcmVmaXggZm9yIHRoZSB3cm9uZyBuYW1lc3BhY2UiKQorICAgICAgICBkID0gc2VsZi5fX2RpY3RfXworICAgICAgICBkWydwcmVmaXgnXSA9IHByZWZpeAorICAgICAgICBpZiBwcmVmaXggaXMgTm9uZToKKyAgICAgICAgICAgIG5ld05hbWUgPSBzZWxmLmxvY2FsTmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV3TmFtZSA9ICIlczolcyIgJSAocHJlZml4LCBzZWxmLmxvY2FsTmFtZSkKKyAgICAgICAgaWYgc2VsZi5vd25lckVsZW1lbnQ6CisgICAgICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZi5vd25lckVsZW1lbnQpCisgICAgICAgIGRbJ25vZGVOYW1lJ10gPSBkWyduYW1lJ10gPSBuZXdOYW1lCisKKyAgICBkZWYgX3NldF92YWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIGQgPSBzZWxmLl9fZGljdF9fCisgICAgICAgIGRbJ3ZhbHVlJ10gPSBkWydub2RlVmFsdWUnXSA9IHZhbHVlCisgICAgICAgIGlmIHNlbGYub3duZXJFbGVtZW50OgorICAgICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYub3duZXJFbGVtZW50KQorICAgICAgICBzZWxmLmNoaWxkTm9kZXNbMF0uZGF0YSA9IHZhbHVlCisKKyAgICBkZWYgdW5saW5rKHNlbGYpOgorICAgICAgICAjIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY2FsbCB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAjIHNpbmNlIG1vc3Qgb2YgdGhhdCBpcyBub3QgbmVlZGVkLCBhbmQgdGhlIGV4cGVuc2Ugb2YgdGhlCisgICAgICAgICMgbWV0aG9kIGNhbGwgaXMgbm90IHdhcnJhbnRlZC4gIFdlIGR1cGxpY2F0ZSB0aGUgcmVtb3ZhbCBvZgorICAgICAgICAjIGNoaWxkcmVuLCBidXQgdGhhdCdzIGFsbCB3ZSBuZWVkZWQgZnJvbSB0aGUgYmFzZSBjbGFzcy4KKyAgICAgICAgZWxlbSA9IHNlbGYub3duZXJFbGVtZW50CisgICAgICAgIGlmIGVsZW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkZWwgZWxlbS5fYXR0cnNbc2VsZi5ub2RlTmFtZV0KKyAgICAgICAgICAgIGRlbCBlbGVtLl9hdHRyc05TWyhzZWxmLm5hbWVzcGFjZVVSSSwgc2VsZi5sb2NhbE5hbWUpXQorICAgICAgICAgICAgaWYgc2VsZi5faXNfaWQ6CisgICAgICAgICAgICAgICAgc2VsZi5faXNfaWQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGVsZW0uX21hZ2ljX2lkX25vZGVzIC09IDEKKyAgICAgICAgICAgICAgICBzZWxmLm93bmVyRG9jdW1lbnQuX21hZ2ljX2lkX2NvdW50IC09IDEKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuY2hpbGROb2RlczoKKyAgICAgICAgICAgIGNoaWxkLnVubGluaygpCisgICAgICAgIGRlbCBzZWxmLmNoaWxkTm9kZXNbOl0KKworICAgIGRlZiBfZ2V0X2lzSWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2lzX2lkOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZG9jID0gc2VsZi5vd25lckRvY3VtZW50CisgICAgICAgIGVsZW0gPSBzZWxmLm93bmVyRWxlbWVudAorICAgICAgICBpZiBkb2MgaXMgTm9uZSBvciBlbGVtIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpbmZvID0gZG9jLl9nZXRfZWxlbV9pbmZvKGVsZW0pCisgICAgICAgIGlmIGluZm8gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLm5hbWVzcGFjZVVSSToKKyAgICAgICAgICAgIHJldHVybiBpbmZvLmlzSWROUyhzZWxmLm5hbWVzcGFjZVVSSSwgc2VsZi5sb2NhbE5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gaW5mby5pc0lkKHNlbGYubm9kZU5hbWUpCisKKyAgICBkZWYgX2dldF9zY2hlbWFUeXBlKHNlbGYpOgorICAgICAgICBkb2MgPSBzZWxmLm93bmVyRG9jdW1lbnQKKyAgICAgICAgZWxlbSA9IHNlbGYub3duZXJFbGVtZW50CisgICAgICAgIGlmIGRvYyBpcyBOb25lIG9yIGVsZW0gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBfbm9fdHlwZQorCisgICAgICAgIGluZm8gPSBkb2MuX2dldF9lbGVtX2luZm8oZWxlbSkKKyAgICAgICAgaWYgaW5mbyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIF9ub190eXBlCisgICAgICAgIGlmIHNlbGYubmFtZXNwYWNlVVJJOgorICAgICAgICAgICAgcmV0dXJuIGluZm8uZ2V0QXR0cmlidXRlVHlwZU5TKHNlbGYubmFtZXNwYWNlVVJJLCBzZWxmLmxvY2FsTmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBpbmZvLmdldEF0dHJpYnV0ZVR5cGUoc2VsZi5ub2RlTmFtZSkKKworZGVmcHJvcGVydHkoQXR0ciwgImlzSWQiLCAgICAgICBkb2M9IlRydWUgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgYW4gSUQuIikKK2RlZnByb3BlcnR5KEF0dHIsICJsb2NhbE5hbWUiLCAgZG9jPSJOYW1lc3BhY2UtbG9jYWwgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4iKQorZGVmcHJvcGVydHkoQXR0ciwgInNjaGVtYVR5cGUiLCBkb2M9IlNjaGVtYSB0eXBlIGZvciB0aGlzIGF0dHJpYnV0ZS4iKQorCisKK2NsYXNzIE5hbWVkTm9kZU1hcChvYmplY3QpOgorICAgICIiIlRoZSBhdHRyaWJ1dGUgbGlzdCBpcyBhIHRyYW5zaWVudCBpbnRlcmZhY2UgdG8gdGhlIHVuZGVybHlpbmcKKyAgICBkaWN0aW9uYXJpZXMuICBNdXRhdGlvbnMgaGVyZSB3aWxsIGNoYW5nZSB0aGUgdW5kZXJseWluZyBlbGVtZW50J3MKKyAgICBkaWN0aW9uYXJ5LgorCisgICAgT3JkZXJpbmcgaXMgaW1wb3NlZCBhcnRpZmljaWFsbHkgYW5kIGRvZXMgbm90IHJlZmxlY3QgdGhlIG9yZGVyIG9mCisgICAgYXR0cmlidXRlcyBhcyBmb3VuZCBpbiBhbiBpbnB1dCBkb2N1bWVudC4KKyAgICAiIiIKKworICAgIF9fc2xvdHNfXyA9ICgnX2F0dHJzJywgJ19hdHRyc05TJywgJ19vd25lckVsZW1lbnQnKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGF0dHJzLCBhdHRyc05TLCBvd25lckVsZW1lbnQpOgorICAgICAgICBzZWxmLl9hdHRycyA9IGF0dHJzCisgICAgICAgIHNlbGYuX2F0dHJzTlMgPSBhdHRyc05TCisgICAgICAgIHNlbGYuX293bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudAorCisgICAgZGVmIF9nZXRfbGVuZ3RoKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2F0dHJzKQorCisgICAgZGVmIGl0ZW0oc2VsZiwgaW5kZXgpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZltzZWxmLl9hdHRycy5rZXlzKClbaW5kZXhdXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgIEwgPSBbXQorICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLl9hdHRycy52YWx1ZXMoKToKKyAgICAgICAgICAgIEwuYXBwZW5kKChub2RlLm5vZGVOYW1lLCBub2RlLnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIEwKKworICAgIGRlZiBpdGVtc05TKHNlbGYpOgorICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5fYXR0cnMudmFsdWVzKCk6CisgICAgICAgICAgICBMLmFwcGVuZCgoKG5vZGUubmFtZXNwYWNlVVJJLCBub2RlLmxvY2FsTmFtZSksIG5vZGUudmFsdWUpKQorICAgICAgICByZXR1cm4gTAorCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIFN0cmluZ1R5cGVzKToKKyAgICAgICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5fYXR0cnMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5fYXR0cnNOUworCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRycy5rZXlzKCkKKworICAgIGRlZiBrZXlzTlMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc05TLmtleXMoKQorCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzLnZhbHVlcygpCisKKyAgICBkZWYgZ2V0KHNlbGYsIG5hbWUsIHZhbHVlPU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnMuZ2V0KG5hbWUsIHZhbHVlKQorCisgICAgX19sZW5fXyA9IF9nZXRfbGVuZ3RoCisKKyAgICBfX2hhc2hfXyA9IE5vbmUgIyBNdXRhYmxlIHR5cGUgY2FuJ3QgYmUgY29ycmVjdGx5IGhhc2hlZAorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgc2VsZi5fYXR0cnMgaXMgZ2V0YXR0cihvdGhlciwgIl9hdHRycyIsIE5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbXAoaWQoc2VsZiksIGlkKG90aGVyKSkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBhdHRuYW1lX29yX3R1cGxlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhdHRuYW1lX29yX3R1cGxlLCB0dXBsZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNOU1thdHRuYW1lX29yX3R1cGxlXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzW2F0dG5hbWVfb3JfdHVwbGVdCisKKyAgICAjIHNhbWUgYXMgc2V0CisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGF0dG5hbWUsIHZhbHVlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgU3RyaW5nVHlwZXMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLl9hdHRyc1thdHRuYW1lXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIG5vZGUgPSBBdHRyKGF0dG5hbWUpCisgICAgICAgICAgICAgICAgbm9kZS5vd25lckRvY3VtZW50ID0gc2VsZi5fb3duZXJFbGVtZW50Lm93bmVyRG9jdW1lbnQKKyAgICAgICAgICAgICAgICBzZWxmLnNldE5hbWVkSXRlbShub2RlKQorICAgICAgICAgICAgbm9kZS52YWx1ZSA9IHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQXR0cik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAidmFsdWUgbXVzdCBiZSBhIHN0cmluZyBvciBBdHRyIG9iamVjdCIKKyAgICAgICAgICAgIG5vZGUgPSB2YWx1ZQorICAgICAgICAgICAgc2VsZi5zZXROYW1lZEl0ZW0obm9kZSkKKworICAgIGRlZiBnZXROYW1lZEl0ZW0oc2VsZiwgbmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1tuYW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGdldE5hbWVkSXRlbU5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzTlNbKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiByZW1vdmVOYW1lZEl0ZW0oc2VsZiwgbmFtZSk6CisgICAgICAgIG4gPSBzZWxmLmdldE5hbWVkSXRlbShuYW1lKQorICAgICAgICBpZiBuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYuX293bmVyRWxlbWVudCkKKyAgICAgICAgICAgIGRlbCBzZWxmLl9hdHRyc1tuLm5vZGVOYW1lXQorICAgICAgICAgICAgZGVsIHNlbGYuX2F0dHJzTlNbKG4ubmFtZXNwYWNlVVJJLCBuLmxvY2FsTmFtZSldCisgICAgICAgICAgICBpZiAnb3duZXJFbGVtZW50JyBpbiBuLl9fZGljdF9fOgorICAgICAgICAgICAgICAgIG4uX19kaWN0X19bJ293bmVyRWxlbWVudCddID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQorCisgICAgZGVmIHJlbW92ZU5hbWVkSXRlbU5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKToKKyAgICAgICAgbiA9IHNlbGYuZ2V0TmFtZWRJdGVtTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpCisgICAgICAgIGlmIG4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZi5fb3duZXJFbGVtZW50KQorICAgICAgICAgICAgZGVsIHNlbGYuX2F0dHJzTlNbKG4ubmFtZXNwYWNlVVJJLCBuLmxvY2FsTmFtZSldCisgICAgICAgICAgICBkZWwgc2VsZi5fYXR0cnNbbi5ub2RlTmFtZV0KKyAgICAgICAgICAgIGlmICdvd25lckVsZW1lbnQnIGluIG4uX19kaWN0X186CisgICAgICAgICAgICAgICAgbi5fX2RpY3RfX1snb3duZXJFbGVtZW50J10gPSBOb25lCisgICAgICAgICAgICByZXR1cm4gbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCisKKyAgICBkZWYgc2V0TmFtZWRJdGVtKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCBBdHRyKToKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgICAgICAiJXMgY2Fubm90IGJlIGNoaWxkIG9mICVzIiAlIChyZXByKG5vZGUpLCByZXByKHNlbGYpKSkKKyAgICAgICAgb2xkID0gc2VsZi5fYXR0cnMuZ2V0KG5vZGUubmFtZSkKKyAgICAgICAgaWYgb2xkOgorICAgICAgICAgICAgb2xkLnVubGluaygpCisgICAgICAgIHNlbGYuX2F0dHJzW25vZGUubmFtZV0gPSBub2RlCisgICAgICAgIHNlbGYuX2F0dHJzTlNbKG5vZGUubmFtZXNwYWNlVVJJLCBub2RlLmxvY2FsTmFtZSldID0gbm9kZQorICAgICAgICBub2RlLm93bmVyRWxlbWVudCA9IHNlbGYuX293bmVyRWxlbWVudAorICAgICAgICBfY2xlYXJfaWRfY2FjaGUobm9kZS5vd25lckVsZW1lbnQpCisgICAgICAgIHJldHVybiBvbGQKKworICAgIGRlZiBzZXROYW1lZEl0ZW1OUyhzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2V0TmFtZWRJdGVtKG5vZGUpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgYXR0bmFtZV9vcl90dXBsZSk6CisgICAgICAgIG5vZGUgPSBzZWxmW2F0dG5hbWVfb3JfdHVwbGVdCisgICAgICAgIF9jbGVhcl9pZF9jYWNoZShub2RlLm93bmVyRWxlbWVudCkKKyAgICAgICAgbm9kZS51bmxpbmsoKQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzLCBzZWxmLl9hdHRyc05TLCBzZWxmLl9vd25lckVsZW1lbnQKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICBzZWxmLl9hdHRycywgc2VsZi5fYXR0cnNOUywgc2VsZi5fb3duZXJFbGVtZW50ID0gc3RhdGUKKworZGVmcHJvcGVydHkoTmFtZWROb2RlTWFwLCAibGVuZ3RoIiwKKyAgICAgICAgICAgIGRvYz0iTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBOYW1lZE5vZGVNYXAuIikKKworQXR0cmlidXRlTGlzdCA9IE5hbWVkTm9kZU1hcAorCisKK2NsYXNzIFR5cGVJbmZvKG9iamVjdCk6CisgICAgX19zbG90c19fID0gJ25hbWVzcGFjZScsICduYW1lJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWVzcGFjZSwgbmFtZSk6CisgICAgICAgIHNlbGYubmFtZXNwYWNlID0gbmFtZXNwYWNlCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5uYW1lc3BhY2U6CisgICAgICAgICAgICByZXR1cm4gIjxUeXBlSW5mbyAlciAoZnJvbSAlcik+IiAlIChzZWxmLm5hbWUsIHNlbGYubmFtZXNwYWNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICI8VHlwZUluZm8gJXI+IiAlIHNlbGYubmFtZQorCisgICAgZGVmIF9nZXRfbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorCisgICAgZGVmIF9nZXRfbmFtZXNwYWNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lc3BhY2UKKworX25vX3R5cGUgPSBUeXBlSW5mbyhOb25lLCBOb25lKQorCitjbGFzcyBFbGVtZW50KE5vZGUpOgorICAgIG5vZGVUeXBlID0gTm9kZS5FTEVNRU5UX05PREUKKyAgICBub2RlVmFsdWUgPSBOb25lCisgICAgc2NoZW1hVHlwZSA9IF9ub190eXBlCisKKyAgICBfbWFnaWNfaWRfbm9kZXMgPSAwCisKKyAgICBfY2hpbGRfbm9kZV90eXBlcyA9IChOb2RlLkVMRU1FTlRfTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLkNPTU1FTlRfTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLlRFWFRfTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YWdOYW1lLCBuYW1lc3BhY2VVUkk9RU1QVFlfTkFNRVNQQUNFLCBwcmVmaXg9Tm9uZSwKKyAgICAgICAgICAgICAgICAgbG9jYWxOYW1lPU5vbmUpOgorICAgICAgICBzZWxmLnRhZ05hbWUgPSBzZWxmLm5vZGVOYW1lID0gdGFnTmFtZQorICAgICAgICBzZWxmLnByZWZpeCA9IHByZWZpeAorICAgICAgICBzZWxmLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSQorICAgICAgICBzZWxmLmNoaWxkTm9kZXMgPSBOb2RlTGlzdCgpCisKKyAgICAgICAgc2VsZi5fYXR0cnMgPSB7fSAgICMgYXR0cmlidXRlcyBhcmUgZG91YmxlLWluZGV4ZWQ6CisgICAgICAgIHNlbGYuX2F0dHJzTlMgPSB7fSAjICAgIHRhZ05hbWUgLT4gQXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIFVSSSxsb2NhbE5hbWUgLT4gQXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBmdXR1cmU6IGNvbnNpZGVyIGxhenkgZ2VuZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvZiBhdHRyaWJ1dGUgb2JqZWN0cyB0aGlzIGlzIHRvbyB0cmlja3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9yIG5vdyBiZWNhdXNlIG9mIGhlYWRhY2hlcyB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5hbWVzcGFjZXMuCisKKyAgICBkZWYgX2dldF9sb2NhbE5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRhZ05hbWUuc3BsaXQoIjoiLCAxKVstMV0KKworICAgIGRlZiBfZ2V0X3RhZ05hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRhZ05hbWUKKworICAgIGRlZiB1bmxpbmsoc2VsZik6CisgICAgICAgIGZvciBhdHRyIGluIHNlbGYuX2F0dHJzLnZhbHVlcygpOgorICAgICAgICAgICAgYXR0ci51bmxpbmsoKQorICAgICAgICBzZWxmLl9hdHRycyA9IE5vbmUKKyAgICAgICAgc2VsZi5fYXR0cnNOUyA9IE5vbmUKKyAgICAgICAgTm9kZS51bmxpbmsoc2VsZikKKworICAgIGRlZiBnZXRBdHRyaWJ1dGUoc2VsZiwgYXR0bmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1thdHRuYW1lXS52YWx1ZQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gIiIKKworICAgIGRlZiBnZXRBdHRyaWJ1dGVOUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc05TWyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSldLnZhbHVlCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAiIgorCisgICAgZGVmIHNldEF0dHJpYnV0ZShzZWxmLCBhdHRuYW1lLCB2YWx1ZSk6CisgICAgICAgIGF0dHIgPSBzZWxmLmdldEF0dHJpYnV0ZU5vZGUoYXR0bmFtZSkKKyAgICAgICAgaWYgYXR0ciBpcyBOb25lOgorICAgICAgICAgICAgYXR0ciA9IEF0dHIoYXR0bmFtZSkKKyAgICAgICAgICAgICMgZm9yIHBlcmZvcm1hbmNlCisgICAgICAgICAgICBkID0gYXR0ci5fX2RpY3RfXworICAgICAgICAgICAgZFsidmFsdWUiXSA9IGRbIm5vZGVWYWx1ZSJdID0gdmFsdWUKKyAgICAgICAgICAgIGRbIm93bmVyRG9jdW1lbnQiXSA9IHNlbGYub3duZXJEb2N1bWVudAorICAgICAgICAgICAgc2VsZi5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpCisgICAgICAgIGVsaWYgdmFsdWUgIT0gYXR0ci52YWx1ZToKKyAgICAgICAgICAgIGQgPSBhdHRyLl9fZGljdF9fCisgICAgICAgICAgICBkWyJ2YWx1ZSJdID0gZFsibm9kZVZhbHVlIl0gPSB2YWx1ZQorICAgICAgICAgICAgaWYgYXR0ci5pc0lkOgorICAgICAgICAgICAgICAgIF9jbGVhcl9pZF9jYWNoZShzZWxmKQorCisgICAgZGVmIHNldEF0dHJpYnV0ZU5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSwgdmFsdWUpOgorICAgICAgICBwcmVmaXgsIGxvY2FsbmFtZSA9IF9uc3NwbGl0KHF1YWxpZmllZE5hbWUpCisgICAgICAgIGF0dHIgPSBzZWxmLmdldEF0dHJpYnV0ZU5vZGVOUyhuYW1lc3BhY2VVUkksIGxvY2FsbmFtZSkKKyAgICAgICAgaWYgYXR0ciBpcyBOb25lOgorICAgICAgICAgICAgIyBmb3IgcGVyZm9ybWFuY2UKKyAgICAgICAgICAgIGF0dHIgPSBBdHRyKHF1YWxpZmllZE5hbWUsIG5hbWVzcGFjZVVSSSwgbG9jYWxuYW1lLCBwcmVmaXgpCisgICAgICAgICAgICBkID0gYXR0ci5fX2RpY3RfXworICAgICAgICAgICAgZFsicHJlZml4Il0gPSBwcmVmaXgKKyAgICAgICAgICAgIGRbIm5vZGVOYW1lIl0gPSBxdWFsaWZpZWROYW1lCisgICAgICAgICAgICBkWyJ2YWx1ZSJdID0gZFsibm9kZVZhbHVlIl0gPSB2YWx1ZQorICAgICAgICAgICAgZFsib3duZXJEb2N1bWVudCJdID0gc2VsZi5vd25lckRvY3VtZW50CisgICAgICAgICAgICBzZWxmLnNldEF0dHJpYnV0ZU5vZGUoYXR0cikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGQgPSBhdHRyLl9fZGljdF9fCisgICAgICAgICAgICBpZiB2YWx1ZSAhPSBhdHRyLnZhbHVlOgorICAgICAgICAgICAgICAgIGRbInZhbHVlIl0gPSBkWyJub2RlVmFsdWUiXSA9IHZhbHVlCisgICAgICAgICAgICAgICAgaWYgYXR0ci5pc0lkOgorICAgICAgICAgICAgICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZikKKyAgICAgICAgICAgIGlmIGF0dHIucHJlZml4ICE9IHByZWZpeDoKKyAgICAgICAgICAgICAgICBkWyJwcmVmaXgiXSA9IHByZWZpeAorICAgICAgICAgICAgICAgIGRbIm5vZGVOYW1lIl0gPSBxdWFsaWZpZWROYW1lCisKKyAgICBkZWYgZ2V0QXR0cmlidXRlTm9kZShzZWxmLCBhdHRybmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRycy5nZXQoYXR0cm5hbWUpCisKKyAgICBkZWYgZ2V0QXR0cmlidXRlTm9kZU5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzTlMuZ2V0KChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSkpCisKKyAgICBkZWYgc2V0QXR0cmlidXRlTm9kZShzZWxmLCBhdHRyKToKKyAgICAgICAgaWYgYXR0ci5vd25lckVsZW1lbnQgbm90IGluIChOb25lLCBzZWxmKToKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW51c2VBdHRyaWJ1dGVFcnIoImF0dHJpYnV0ZSBub2RlIGFscmVhZHkgb3duZWQiKQorICAgICAgICBvbGQxID0gc2VsZi5fYXR0cnMuZ2V0KGF0dHIubmFtZSwgTm9uZSkKKyAgICAgICAgaWYgb2xkMSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucmVtb3ZlQXR0cmlidXRlTm9kZShvbGQxKQorICAgICAgICBvbGQyID0gc2VsZi5fYXR0cnNOUy5nZXQoKGF0dHIubmFtZXNwYWNlVVJJLCBhdHRyLmxvY2FsTmFtZSksIE5vbmUpCisgICAgICAgIGlmIG9sZDIgaXMgbm90IE5vbmUgYW5kIG9sZDIgaXMgbm90IG9sZDE6CisgICAgICAgICAgICBzZWxmLnJlbW92ZUF0dHJpYnV0ZU5vZGUob2xkMikKKyAgICAgICAgX3NldF9hdHRyaWJ1dGVfbm9kZShzZWxmLCBhdHRyKQorCisgICAgICAgIGlmIG9sZDEgaXMgbm90IGF0dHI6CisgICAgICAgICAgICAjIEl0IG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIHBhcnQgb2YgdGhpcyBub2RlLCBpbiB3aGljaCBjYXNlCisgICAgICAgICAgICAjIGl0IGRvZXNuJ3QgcmVwcmVzZW50IGEgY2hhbmdlLCBhbmQgc2hvdWxkIG5vdCBiZSByZXR1cm5lZC4KKyAgICAgICAgICAgIHJldHVybiBvbGQxCisgICAgICAgIGlmIG9sZDIgaXMgbm90IGF0dHI6CisgICAgICAgICAgICByZXR1cm4gb2xkMgorCisgICAgc2V0QXR0cmlidXRlTm9kZU5TID0gc2V0QXR0cmlidXRlTm9kZQorCisgICAgZGVmIHJlbW92ZUF0dHJpYnV0ZShzZWxmLCBuYW1lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXR0ciA9IHNlbGYuX2F0dHJzW25hbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICBzZWxmLnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cikKKworICAgIGRlZiByZW1vdmVBdHRyaWJ1dGVOUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGF0dHIgPSBzZWxmLl9hdHRyc05TWyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICBzZWxmLnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cikKKworICAgIGRlZiByZW1vdmVBdHRyaWJ1dGVOb2RlKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub2RlIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fYXR0cnNbbm9kZS5uYW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYpCisgICAgICAgIG5vZGUudW5saW5rKCkKKyAgICAgICAgIyBSZXN0b3JlIHRoaXMgc2luY2UgdGhlIG5vZGUgaXMgc3RpbGwgdXNlZnVsIGFuZCBvdGhlcndpc2UKKyAgICAgICAgIyB1bmxpbmtlZAorICAgICAgICBub2RlLm93bmVyRG9jdW1lbnQgPSBzZWxmLm93bmVyRG9jdW1lbnQKKworICAgIHJlbW92ZUF0dHJpYnV0ZU5vZGVOUyA9IHJlbW92ZUF0dHJpYnV0ZU5vZGUKKworICAgIGRlZiBoYXNBdHRyaWJ1dGUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBuYW1lIGluIHNlbGYuX2F0dHJzCisKKyAgICBkZWYgaGFzQXR0cmlidXRlTlMoc2VsZiwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOgorICAgICAgICByZXR1cm4gKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKSBpbiBzZWxmLl9hdHRyc05TCisKKyAgICBkZWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBfZ2V0X2VsZW1lbnRzX2J5X3RhZ05hbWVfaGVscGVyKHNlbGYsIG5hbWUsIE5vZGVMaXN0KCkpCisKKyAgICBkZWYgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CisgICAgICAgIHJldHVybiBfZ2V0X2VsZW1lbnRzX2J5X3RhZ05hbWVfbnNfaGVscGVyKAorICAgICAgICAgICAgc2VsZiwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIE5vZGVMaXN0KCkpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPERPTSBFbGVtZW50OiAlcyBhdCAlI3g+IiAlIChzZWxmLnRhZ05hbWUsIGlkKHNlbGYpKQorCisgICAgZGVmIHdyaXRleG1sKHNlbGYsIHdyaXRlciwgaW5kZW50PSIiLCBhZGRpbmRlbnQ9IiIsIG5ld2w9IiIpOgorICAgICAgICAjIGluZGVudCA9IGN1cnJlbnQgaW5kZW50YXRpb24KKyAgICAgICAgIyBhZGRpbmRlbnQgPSBpbmRlbnRhdGlvbiB0byBhZGQgdG8gaGlnaGVyIGxldmVscworICAgICAgICAjIG5ld2wgPSBuZXdsaW5lIHN0cmluZworICAgICAgICB3cml0ZXIud3JpdGUoaW5kZW50KyI8IiArIHNlbGYudGFnTmFtZSkKKworICAgICAgICBhdHRycyA9IHNlbGYuX2dldF9hdHRyaWJ1dGVzKCkKKyAgICAgICAgYV9uYW1lcyA9IGF0dHJzLmtleXMoKQorICAgICAgICBhX25hbWVzLnNvcnQoKQorCisgICAgICAgIGZvciBhX25hbWUgaW4gYV9uYW1lczoKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiICVzPVwiIiAlIGFfbmFtZSkKKyAgICAgICAgICAgIF93cml0ZV9kYXRhKHdyaXRlciwgYXR0cnNbYV9uYW1lXS52YWx1ZSkKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiXCIiKQorICAgICAgICBpZiBzZWxmLmNoaWxkTm9kZXM6CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIj4iKQorICAgICAgICAgICAgaWYgKGxlbihzZWxmLmNoaWxkTm9kZXMpID09IDEgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5jaGlsZE5vZGVzWzBdLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKToKKyAgICAgICAgICAgICAgICBzZWxmLmNoaWxkTm9kZXNbMF0ud3JpdGV4bWwod3JpdGVyLCAnJywgJycsICcnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUobmV3bCkKKyAgICAgICAgICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLmNoaWxkTm9kZXM6CisgICAgICAgICAgICAgICAgICAgIG5vZGUud3JpdGV4bWwod3JpdGVyLCBpbmRlbnQrYWRkaW5kZW50LCBhZGRpbmRlbnQsIG5ld2wpCisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGluZGVudCkKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiPC8lcz4lcyIgJSAoc2VsZi50YWdOYW1lLCBuZXdsKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiLz4lcyIlKG5ld2wpKQorCisgICAgZGVmIF9nZXRfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIE5hbWVkTm9kZU1hcChzZWxmLl9hdHRycywgc2VsZi5fYXR0cnNOUywgc2VsZikKKworICAgIGRlZiBoYXNBdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9hdHRyczoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICMgRE9NIExldmVsIDMgYXR0cmlidXRlcywgYmFzZWQgb24gdGhlIDIyIE9jdCAyMDAyIGRyYWZ0CisKKyAgICBkZWYgc2V0SWRBdHRyaWJ1dGUoc2VsZiwgbmFtZSk6CisgICAgICAgIGlkQXR0ciA9IHNlbGYuZ2V0QXR0cmlidXRlTm9kZShuYW1lKQorICAgICAgICBzZWxmLnNldElkQXR0cmlidXRlTm9kZShpZEF0dHIpCisKKyAgICBkZWYgc2V0SWRBdHRyaWJ1dGVOUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CisgICAgICAgIGlkQXR0ciA9IHNlbGYuZ2V0QXR0cmlidXRlTm9kZU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKQorICAgICAgICBzZWxmLnNldElkQXR0cmlidXRlTm9kZShpZEF0dHIpCisKKyAgICBkZWYgc2V0SWRBdHRyaWJ1dGVOb2RlKHNlbGYsIGlkQXR0cik6CisgICAgICAgIGlmIGlkQXR0ciBpcyBOb25lIG9yIG5vdCBzZWxmLmlzU2FtZU5vZGUoaWRBdHRyLm93bmVyRWxlbWVudCk6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgaWYgX2dldF9jb250YWluaW5nX2VudHJlZihzZWxmKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKCkKKyAgICAgICAgaWYgbm90IGlkQXR0ci5faXNfaWQ6CisgICAgICAgICAgICBpZEF0dHIuX19kaWN0X19bJ19pc19pZCddID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5fbWFnaWNfaWRfbm9kZXMgKz0gMQorICAgICAgICAgICAgc2VsZi5vd25lckRvY3VtZW50Ll9tYWdpY19pZF9jb3VudCArPSAxCisgICAgICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZikKKworZGVmcHJvcGVydHkoRWxlbWVudCwgImF0dHJpYnV0ZXMiLAorICAgICAgICAgICAgZG9jPSJOYW1lZE5vZGVNYXAgb2YgYXR0cmlidXRlcyBvbiB0aGUgZWxlbWVudC4iKQorZGVmcHJvcGVydHkoRWxlbWVudCwgImxvY2FsTmFtZSIsCisgICAgICAgICAgICBkb2M9Ik5hbWVzcGFjZS1sb2NhbCBuYW1lIG9mIHRoaXMgZWxlbWVudC4iKQorCisKK2RlZiBfc2V0X2F0dHJpYnV0ZV9ub2RlKGVsZW1lbnQsIGF0dHIpOgorICAgIF9jbGVhcl9pZF9jYWNoZShlbGVtZW50KQorICAgIGVsZW1lbnQuX2F0dHJzW2F0dHIubmFtZV0gPSBhdHRyCisgICAgZWxlbWVudC5fYXR0cnNOU1soYXR0ci5uYW1lc3BhY2VVUkksIGF0dHIubG9jYWxOYW1lKV0gPSBhdHRyCisKKyAgICAjIFRoaXMgY3JlYXRlcyBhIGNpcmN1bGFyIHJlZmVyZW5jZSwgYnV0IEVsZW1lbnQudW5saW5rKCkKKyAgICAjIGJyZWFrcyB0aGUgY3ljbGUgc2luY2UgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIGF0dHJpYnV0ZQorICAgICMgZGljdGlvbmFyaWVzIGFyZSB0b3NzZWQuCisgICAgYXR0ci5fX2RpY3RfX1snb3duZXJFbGVtZW50J10gPSBlbGVtZW50CisKKworY2xhc3MgQ2hpbGRsZXNzOgorICAgICIiIk1peGluIHRoYXQgbWFrZXMgY2hpbGRsZXNzLW5lc3MgZWFzeSB0byBpbXBsZW1lbnQgYW5kIGF2b2lkcworICAgIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBOb2RlIG1ldGhvZHMgdGhhdCBkZWFsIHdpdGggY2hpbGRyZW4uCisgICAgIiIiCisKKyAgICBhdHRyaWJ1dGVzID0gTm9uZQorICAgIGNoaWxkTm9kZXMgPSBFbXB0eU5vZGVMaXN0KCkKKyAgICBmaXJzdENoaWxkID0gTm9uZQorICAgIGxhc3RDaGlsZCA9IE5vbmUKKworICAgIGRlZiBfZ2V0X2ZpcnN0Q2hpbGQoc2VsZik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX2dldF9sYXN0Q2hpbGQoc2VsZik6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgIHNlbGYubm9kZU5hbWUgKyAiIG5vZGVzIGNhbm5vdCBoYXZlIGNoaWxkcmVuIikKKworICAgIGRlZiBoYXNDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbmV3Q2hpbGQsIHJlZkNoaWxkKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgc2VsZi5ub2RlTmFtZSArICIgbm9kZXMgZG8gbm90IGhhdmUgY2hpbGRyZW4iKQorCisgICAgZGVmIHJlbW92ZUNoaWxkKHNlbGYsIG9sZENoaWxkKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigKKyAgICAgICAgICAgIHNlbGYubm9kZU5hbWUgKyAiIG5vZGVzIGRvIG5vdCBoYXZlIGNoaWxkcmVuIikKKworICAgIGRlZiBub3JtYWxpemUoc2VsZik6CisgICAgICAgICMgRm9yIGNoaWxkbGVzcyBub2Rlcywgbm9ybWFsaXplKCkgaGFzIG5vdGhpbmcgdG8gZG8uCisgICAgICAgIHBhc3MKKworICAgIGRlZiByZXBsYWNlQ2hpbGQoc2VsZiwgbmV3Q2hpbGQsIG9sZENoaWxkKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgc2VsZi5ub2RlTmFtZSArICIgbm9kZXMgZG8gbm90IGhhdmUgY2hpbGRyZW4iKQorCisKK2NsYXNzIFByb2Nlc3NpbmdJbnN0cnVjdGlvbihDaGlsZGxlc3MsIE5vZGUpOgorICAgIG5vZGVUeXBlID0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXQsIGRhdGEpOgorICAgICAgICBzZWxmLnRhcmdldCA9IHNlbGYubm9kZU5hbWUgPSB0YXJnZXQKKyAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5ub2RlVmFsdWUgPSBkYXRhCisKKyAgICBkZWYgX2dldF9kYXRhKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhCisgICAgZGVmIF9zZXRfZGF0YShzZWxmLCB2YWx1ZSk6CisgICAgICAgIGQgPSBzZWxmLl9fZGljdF9fCisgICAgICAgIGRbJ2RhdGEnXSA9IGRbJ25vZGVWYWx1ZSddID0gdmFsdWUKKworICAgIGRlZiBfZ2V0X3RhcmdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGFyZ2V0CisgICAgZGVmIF9zZXRfdGFyZ2V0KHNlbGYsIHZhbHVlKToKKyAgICAgICAgZCA9IHNlbGYuX19kaWN0X18KKyAgICAgICAgZFsndGFyZ2V0J10gPSBkWydub2RlTmFtZSddID0gdmFsdWUKKworICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgIGlmIG5hbWUgPT0gImRhdGEiIG9yIG5hbWUgPT0gIm5vZGVWYWx1ZSI6CisgICAgICAgICAgICBzZWxmLl9fZGljdF9fWydkYXRhJ10gPSBzZWxmLl9fZGljdF9fWydub2RlVmFsdWUnXSA9IHZhbHVlCisgICAgICAgIGVsaWYgbmFtZSA9PSAidGFyZ2V0IiBvciBuYW1lID09ICJub2RlTmFtZSI6CisgICAgICAgICAgICBzZWxmLl9fZGljdF9fWyd0YXJnZXQnXSA9IHNlbGYuX19kaWN0X19bJ25vZGVOYW1lJ10gPSB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX2RpY3RfX1tuYW1lXSA9IHZhbHVlCisKKyAgICBkZWYgd3JpdGV4bWwoc2VsZiwgd3JpdGVyLCBpbmRlbnQ9IiIsIGFkZGluZGVudD0iIiwgbmV3bD0iIik6CisgICAgICAgIHdyaXRlci53cml0ZSgiJXM8PyVzICVzPz4lcyIgJSAoaW5kZW50LHNlbGYudGFyZ2V0LCBzZWxmLmRhdGEsIG5ld2wpKQorCisKK2NsYXNzIENoYXJhY3RlckRhdGEoQ2hpbGRsZXNzLCBOb2RlKToKKyAgICBkZWYgX2dldF9sZW5ndGgoc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5kYXRhKQorICAgIF9fbGVuX18gPSBfZ2V0X2xlbmd0aAorCisgICAgZGVmIF9nZXRfZGF0YShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19kaWN0X19bJ2RhdGEnXQorICAgIGRlZiBfc2V0X2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIGQgPSBzZWxmLl9fZGljdF9fCisgICAgICAgIGRbJ2RhdGEnXSA9IGRbJ25vZGVWYWx1ZSddID0gZGF0YQorCisgICAgX2dldF9ub2RlVmFsdWUgPSBfZ2V0X2RhdGEKKyAgICBfc2V0X25vZGVWYWx1ZSA9IF9zZXRfZGF0YQorCisgICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgaWYgbmFtZSA9PSAiZGF0YSIgb3IgbmFtZSA9PSAibm9kZVZhbHVlIjoKKyAgICAgICAgICAgIHNlbGYuX19kaWN0X19bJ2RhdGEnXSA9IHNlbGYuX19kaWN0X19bJ25vZGVWYWx1ZSddID0gdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX19kaWN0X19bbmFtZV0gPSB2YWx1ZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5kYXRhCisgICAgICAgIGlmIGxlbihkYXRhKSA+IDEwOgorICAgICAgICAgICAgZG90ZG90ZG90ID0gIi4uLiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRvdGRvdGRvdCA9ICIiCisgICAgICAgIHJldHVybiAnPERPTSAlcyBub2RlICIlciVzIj4nICUgKAorICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGRhdGFbMDoxMF0sIGRvdGRvdGRvdCkKKworICAgIGRlZiBzdWJzdHJpbmdEYXRhKHNlbGYsIG9mZnNldCwgY291bnQpOgorICAgICAgICBpZiBvZmZzZXQgPCAwOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgbmVnYXRpdmUiKQorICAgICAgICBpZiBvZmZzZXQgPj0gbGVuKHNlbGYuZGF0YSk6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBiZXlvbmQgZW5kIG9mIGRhdGEiKQorICAgICAgICBpZiBjb3VudCA8IDA6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigiY291bnQgY2Fubm90IGJlIG5lZ2F0aXZlIikKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtvZmZzZXQ6b2Zmc2V0K2NvdW50XQorCisgICAgZGVmIGFwcGVuZERhdGEoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhICsgYXJnCisKKyAgICBkZWYgaW5zZXJ0RGF0YShzZWxmLCBvZmZzZXQsIGFyZyk6CisgICAgICAgIGlmIG9mZnNldCA8IDA6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgIGlmIG9mZnNldCA+PSBsZW4oc2VsZi5kYXRhKToKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIGJleW9uZCBlbmQgb2YgZGF0YSIpCisgICAgICAgIGlmIGFyZzoKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9ICIlcyVzJXMiICUgKAorICAgICAgICAgICAgICAgIHNlbGYuZGF0YVs6b2Zmc2V0XSwgYXJnLCBzZWxmLmRhdGFbb2Zmc2V0Ol0pCisKKyAgICBkZWYgZGVsZXRlRGF0YShzZWxmLCBvZmZzZXQsIGNvdW50KToKKyAgICAgICAgaWYgb2Zmc2V0IDwgMDoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIikKKyAgICAgICAgaWYgb2Zmc2V0ID49IGxlbihzZWxmLmRhdGEpOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgYmV5b25kIGVuZCBvZiBkYXRhIikKKyAgICAgICAgaWYgY291bnQgPCAwOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoImNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgIGlmIGNvdW50OgorICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhWzpvZmZzZXRdICsgc2VsZi5kYXRhW29mZnNldCtjb3VudDpdCisKKyAgICBkZWYgcmVwbGFjZURhdGEoc2VsZiwgb2Zmc2V0LCBjb3VudCwgYXJnKToKKyAgICAgICAgaWYgb2Zmc2V0IDwgMDoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIikKKyAgICAgICAgaWYgb2Zmc2V0ID49IGxlbihzZWxmLmRhdGEpOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgYmV5b25kIGVuZCBvZiBkYXRhIikKKyAgICAgICAgaWYgY291bnQgPCAwOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoImNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgIGlmIGNvdW50OgorICAgICAgICAgICAgc2VsZi5kYXRhID0gIiVzJXMlcyIgJSAoCisgICAgICAgICAgICAgICAgc2VsZi5kYXRhWzpvZmZzZXRdLCBhcmcsIHNlbGYuZGF0YVtvZmZzZXQrY291bnQ6XSkKKworZGVmcHJvcGVydHkoQ2hhcmFjdGVyRGF0YSwgImxlbmd0aCIsIGRvYz0iTGVuZ3RoIG9mIHRoZSBzdHJpbmcgZGF0YS4iKQorCisKK2NsYXNzIFRleHQoQ2hhcmFjdGVyRGF0YSk6CisgICAgIyBNYWtlIHN1cmUgd2UgZG9uJ3QgYWRkIGFuIGluc3RhbmNlIF9fZGljdF9fIGlmIHdlIGRvbid0IGFscmVhZHkKKyAgICAjIGhhdmUgb25lLCBhdCBsZWFzdCB3aGVuIHRoYXQncyBwb3NzaWJsZToKKyAgICAjIFhYWCB0aGlzIGRvZXMgbm90IHdvcmssIENoYXJhY3RlckRhdGEgaXMgYW4gb2xkLXN0eWxlIGNsYXNzCisgICAgIyBfX3Nsb3RzX18gPSAoKQorCisgICAgbm9kZVR5cGUgPSBOb2RlLlRFWFRfTk9ERQorICAgIG5vZGVOYW1lID0gIiN0ZXh0IgorICAgIGF0dHJpYnV0ZXMgPSBOb25lCisKKyAgICBkZWYgc3BsaXRUZXh0KHNlbGYsIG9mZnNldCk6CisgICAgICAgIGlmIG9mZnNldCA8IDAgb3Igb2Zmc2V0ID4gbGVuKHNlbGYuZGF0YSk6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigiaWxsZWdhbCBvZmZzZXQgdmFsdWUiKQorICAgICAgICBuZXdUZXh0ID0gc2VsZi5fX2NsYXNzX18oKQorICAgICAgICBuZXdUZXh0LmRhdGEgPSBzZWxmLmRhdGFbb2Zmc2V0Ol0KKyAgICAgICAgbmV3VGV4dC5vd25lckRvY3VtZW50ID0gc2VsZi5vd25lckRvY3VtZW50CisgICAgICAgIG5leHQgPSBzZWxmLm5leHRTaWJsaW5nCisgICAgICAgIGlmIHNlbGYucGFyZW50Tm9kZSBhbmQgc2VsZiBpbiBzZWxmLnBhcmVudE5vZGUuY2hpbGROb2RlczoKKyAgICAgICAgICAgIGlmIG5leHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobmV3VGV4dCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuZXdUZXh0LCBuZXh0KQorICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFbOm9mZnNldF0KKyAgICAgICAgcmV0dXJuIG5ld1RleHQKKworICAgIGRlZiB3cml0ZXhtbChzZWxmLCB3cml0ZXIsIGluZGVudD0iIiwgYWRkaW5kZW50PSIiLCBuZXdsPSIiKToKKyAgICAgICAgX3dyaXRlX2RhdGEod3JpdGVyLCAiJXMlcyVzIiAlIChpbmRlbnQsIHNlbGYuZGF0YSwgbmV3bCkpCisKKyAgICAjIERPTSBMZXZlbCAzIChXRCA5IEFwcmlsIDIwMDIpCisKKyAgICBkZWYgX2dldF93aG9sZVRleHQoc2VsZik6CisgICAgICAgIEwgPSBbc2VsZi5kYXRhXQorICAgICAgICBuID0gc2VsZi5wcmV2aW91c1NpYmxpbmcKKyAgICAgICAgd2hpbGUgbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG4ubm9kZVR5cGUgaW4gKE5vZGUuVEVYVF9OT0RFLCBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSk6CisgICAgICAgICAgICAgICAgTC5pbnNlcnQoMCwgbi5kYXRhKQorICAgICAgICAgICAgICAgIG4gPSBuLnByZXZpb3VzU2libGluZworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBuID0gc2VsZi5uZXh0U2libGluZworICAgICAgICB3aGlsZSBuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbi5ub2RlVHlwZSBpbiAoTm9kZS5URVhUX05PREUsIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKToKKyAgICAgICAgICAgICAgICBMLmFwcGVuZChuLmRhdGEpCisgICAgICAgICAgICAgICAgbiA9IG4ubmV4dFNpYmxpbmcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oTCkKKworICAgIGRlZiByZXBsYWNlV2hvbGVUZXh0KHNlbGYsIGNvbnRlbnQpOgorICAgICAgICAjIFhYWCBUaGlzIG5lZWRzIHRvIGJlIHNlcmlvdXNseSBjaGFuZ2VkIGlmIG1pbmlkb20gZXZlcgorICAgICAgICAjIHN1cHBvcnRzIEVudGl0eVJlZmVyZW5jZSBub2Rlcy4KKyAgICAgICAgcGFyZW50ID0gc2VsZi5wYXJlbnROb2RlCisgICAgICAgIG4gPSBzZWxmLnByZXZpb3VzU2libGluZworICAgICAgICB3aGlsZSBuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbi5ub2RlVHlwZSBpbiAoTm9kZS5URVhUX05PREUsIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKToKKyAgICAgICAgICAgICAgICBuZXh0ID0gbi5wcmV2aW91c1NpYmxpbmcKKyAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQobikKKyAgICAgICAgICAgICAgICBuID0gbmV4dAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBuID0gc2VsZi5uZXh0U2libGluZworICAgICAgICBpZiBub3QgY29udGVudDoKKyAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChzZWxmKQorICAgICAgICB3aGlsZSBuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbi5ub2RlVHlwZSBpbiAoTm9kZS5URVhUX05PREUsIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKToKKyAgICAgICAgICAgICAgICBuZXh0ID0gbi5uZXh0U2libGluZworICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChuKQorICAgICAgICAgICAgICAgIG4gPSBuZXh0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGNvbnRlbnQ6CisgICAgICAgICAgICBkID0gc2VsZi5fX2RpY3RfXworICAgICAgICAgICAgZFsnZGF0YSddID0gY29udGVudAorICAgICAgICAgICAgZFsnbm9kZVZhbHVlJ10gPSBjb250ZW50CisgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfZ2V0X2lzV2hpdGVzcGFjZUluRWxlbWVudENvbnRlbnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZGF0YS5zdHJpcCgpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsZW0gPSBfZ2V0X2NvbnRhaW5pbmdfZWxlbWVudChzZWxmKQorICAgICAgICBpZiBlbGVtIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaW5mbyA9IHNlbGYub3duZXJEb2N1bWVudC5fZ2V0X2VsZW1faW5mbyhlbGVtKQorICAgICAgICBpZiBpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBpbmZvLmlzRWxlbWVudENvbnRlbnQoKQorCitkZWZwcm9wZXJ0eShUZXh0LCAiaXNXaGl0ZXNwYWNlSW5FbGVtZW50Q29udGVudCIsCisgICAgICAgICAgICBkb2M9IlRydWUgaWZmIHRoaXMgdGV4dCBub2RlIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZSIKKyAgICAgICAgICAgICAgICAiIGFuZCBpcyBpbiBlbGVtZW50IGNvbnRlbnQuIikKK2RlZnByb3BlcnR5KFRleHQsICJ3aG9sZVRleHQiLAorICAgICAgICAgICAgZG9jPSJUaGUgdGV4dCBvZiBhbGwgbG9naWNhbGx5LWFkamFjZW50IHRleHQgbm9kZXMuIikKKworCitkZWYgX2dldF9jb250YWluaW5nX2VsZW1lbnQobm9kZSk6CisgICAgYyA9IG5vZGUucGFyZW50Tm9kZQorICAgIHdoaWxlIGMgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIGMubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREU6CisgICAgICAgICAgICByZXR1cm4gYworICAgICAgICBjID0gYy5wYXJlbnROb2RlCisgICAgcmV0dXJuIE5vbmUKKworZGVmIF9nZXRfY29udGFpbmluZ19lbnRyZWYobm9kZSk6CisgICAgYyA9IG5vZGUucGFyZW50Tm9kZQorICAgIHdoaWxlIGMgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIGMubm9kZVR5cGUgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREU6CisgICAgICAgICAgICByZXR1cm4gYworICAgICAgICBjID0gYy5wYXJlbnROb2RlCisgICAgcmV0dXJuIE5vbmUKKworCitjbGFzcyBDb21tZW50KENoaWxkbGVzcywgQ2hhcmFjdGVyRGF0YSk6CisgICAgbm9kZVR5cGUgPSBOb2RlLkNPTU1FTlRfTk9ERQorICAgIG5vZGVOYW1lID0gIiNjb21tZW50IgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLm5vZGVWYWx1ZSA9IGRhdGEKKworICAgIGRlZiB3cml0ZXhtbChzZWxmLCB3cml0ZXIsIGluZGVudD0iIiwgYWRkaW5kZW50PSIiLCBuZXdsPSIiKToKKyAgICAgICAgaWYgIi0tIiBpbiBzZWxmLmRhdGE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCInLS0nIGlzIG5vdCBhbGxvd2VkIGluIGEgY29tbWVudCBub2RlIikKKyAgICAgICAgd3JpdGVyLndyaXRlKCIlczwhLS0lcy0tPiVzIiAlIChpbmRlbnQsIHNlbGYuZGF0YSwgbmV3bCkpCisKKworY2xhc3MgQ0RBVEFTZWN0aW9uKFRleHQpOgorICAgICMgTWFrZSBzdXJlIHdlIGRvbid0IGFkZCBhbiBpbnN0YW5jZSBfX2RpY3RfXyBpZiB3ZSBkb24ndCBhbHJlYWR5CisgICAgIyBoYXZlIG9uZSwgYXQgbGVhc3Qgd2hlbiB0aGF0J3MgcG9zc2libGU6CisgICAgIyBYWFggdGhpcyBkb2VzIG5vdCB3b3JrLCBUZXh0IGlzIGFuIG9sZC1zdHlsZSBjbGFzcworICAgICMgX19zbG90c19fID0gKCkKKworICAgIG5vZGVUeXBlID0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUKKyAgICBub2RlTmFtZSA9ICIjY2RhdGEtc2VjdGlvbiIKKworICAgIGRlZiB3cml0ZXhtbChzZWxmLCB3cml0ZXIsIGluZGVudD0iIiwgYWRkaW5kZW50PSIiLCBuZXdsPSIiKToKKyAgICAgICAgaWYgc2VsZi5kYXRhLmZpbmQoIl1dPiIpID49IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCInXV0+JyBub3QgYWxsb3dlZCBpbiBhIENEQVRBIHNlY3Rpb24iKQorICAgICAgICB3cml0ZXIud3JpdGUoIjwhW0NEQVRBWyVzXV0+IiAlIHNlbGYuZGF0YSkKKworCitjbGFzcyBSZWFkT25seVNlcXVlbnRpYWxOYW1lZE5vZGVNYXAob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAnX3NlcScsCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VxPSgpKToKKyAgICAgICAgIyBzZXEgc2hvdWxkIGJlIGEgbGlzdCBvciB0dXBsZQorICAgICAgICBzZWxmLl9zZXEgPSBzZXEKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3NlcSkKKworICAgIGRlZiBfZ2V0X2xlbmd0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9zZXEpCisKKyAgICBkZWYgZ2V0TmFtZWRJdGVtKHNlbGYsIG5hbWUpOgorICAgICAgICBmb3IgbiBpbiBzZWxmLl9zZXE6CisgICAgICAgICAgICBpZiBuLm5vZGVOYW1lID09IG5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG4KKworICAgIGRlZiBnZXROYW1lZEl0ZW1OUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CisgICAgICAgIGZvciBuIGluIHNlbGYuX3NlcToKKyAgICAgICAgICAgIGlmIG4ubmFtZXNwYWNlVVJJID09IG5hbWVzcGFjZVVSSSBhbmQgbi5sb2NhbE5hbWUgPT0gbG9jYWxOYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBuCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZV9vcl90dXBsZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZV9vcl90dXBsZSwgdHVwbGUpOgorICAgICAgICAgICAgbm9kZSA9IHNlbGYuZ2V0TmFtZWRJdGVtTlMoKm5hbWVfb3JfdHVwbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBub2RlID0gc2VsZi5nZXROYW1lZEl0ZW0obmFtZV9vcl90dXBsZSkKKyAgICAgICAgaWYgbm9kZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IsIG5hbWVfb3JfdHVwbGUKKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiBpdGVtKHNlbGYsIGluZGV4KToKKyAgICAgICAgaWYgaW5kZXggPCAwOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NlcVtpbmRleF0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHJlbW92ZU5hbWVkSXRlbShzZWxmLCBuYW1lKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCisgICAgICAgICAgICAiTmFtZWROb2RlTWFwIGluc3RhbmNlIGlzIHJlYWQtb25seSIpCisKKyAgICBkZWYgcmVtb3ZlTmFtZWRJdGVtTlMoc2VsZiwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOgorICAgICAgICByYWlzZSB4bWwuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKKyAgICAgICAgICAgICJOYW1lZE5vZGVNYXAgaW5zdGFuY2UgaXMgcmVhZC1vbmx5IikKKworICAgIGRlZiBzZXROYW1lZEl0ZW0oc2VsZiwgbm9kZSk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAorICAgICAgICAgICAgIk5hbWVkTm9kZU1hcCBpbnN0YW5jZSBpcyByZWFkLW9ubHkiKQorCisgICAgZGVmIHNldE5hbWVkSXRlbU5TKHNlbGYsIG5vZGUpOgorICAgICAgICByYWlzZSB4bWwuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKKyAgICAgICAgICAgICJOYW1lZE5vZGVNYXAgaW5zdGFuY2UgaXMgcmVhZC1vbmx5IikKKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgIHJldHVybiBbc2VsZi5fc2VxXQorCisgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgIHNlbGYuX3NlcSA9IHN0YXRlWzBdCisKK2RlZnByb3BlcnR5KFJlYWRPbmx5U2VxdWVudGlhbE5hbWVkTm9kZU1hcCwgImxlbmd0aCIsCisgICAgICAgICAgICBkb2M9Ik51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBOYW1lZE5vZGVNYXAuIikKKworCitjbGFzcyBJZGVudGlmaWVkOgorICAgICIiIk1peC1pbiBjbGFzcyB0aGF0IHN1cHBvcnRzIHRoZSBwdWJsaWNJZCBhbmQgc3lzdGVtSWQgYXR0cmlidXRlcy4iIiIKKworICAgICMgWFhYIHRoaXMgZG9lcyBub3Qgd29yaywgdGhpcyBpcyBhbiBvbGQtc3R5bGUgY2xhc3MKKyAgICAjIF9fc2xvdHNfXyA9ICdwdWJsaWNJZCcsICdzeXN0ZW1JZCcKKworICAgIGRlZiBfaWRlbnRpZmllZF9taXhpbl9pbml0KHNlbGYsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CisgICAgICAgIHNlbGYucHVibGljSWQgPSBwdWJsaWNJZAorICAgICAgICBzZWxmLnN5c3RlbUlkID0gc3lzdGVtSWQKKworICAgIGRlZiBfZ2V0X3B1YmxpY0lkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wdWJsaWNJZAorCisgICAgZGVmIF9nZXRfc3lzdGVtSWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN5c3RlbUlkCisKK2NsYXNzIERvY3VtZW50VHlwZShJZGVudGlmaWVkLCBDaGlsZGxlc3MsIE5vZGUpOgorICAgIG5vZGVUeXBlID0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUKKyAgICBub2RlVmFsdWUgPSBOb25lCisgICAgbmFtZSA9IE5vbmUKKyAgICBwdWJsaWNJZCA9IE5vbmUKKyAgICBzeXN0ZW1JZCA9IE5vbmUKKyAgICBpbnRlcm5hbFN1YnNldCA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBxdWFsaWZpZWROYW1lKToKKyAgICAgICAgc2VsZi5lbnRpdGllcyA9IFJlYWRPbmx5U2VxdWVudGlhbE5hbWVkTm9kZU1hcCgpCisgICAgICAgIHNlbGYubm90YXRpb25zID0gUmVhZE9ubHlTZXF1ZW50aWFsTmFtZWROb2RlTWFwKCkKKyAgICAgICAgaWYgcXVhbGlmaWVkTmFtZToKKyAgICAgICAgICAgIHByZWZpeCwgbG9jYWxuYW1lID0gX25zc3BsaXQocXVhbGlmaWVkTmFtZSkKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IGxvY2FsbmFtZQorICAgICAgICBzZWxmLm5vZGVOYW1lID0gc2VsZi5uYW1lCisKKyAgICBkZWYgX2dldF9pbnRlcm5hbFN1YnNldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW50ZXJuYWxTdWJzZXQKKworICAgIGRlZiBjbG9uZU5vZGUoc2VsZiwgZGVlcCk6CisgICAgICAgIGlmIHNlbGYub3duZXJEb2N1bWVudCBpcyBOb25lOgorICAgICAgICAgICAgIyBpdCdzIG9rCisgICAgICAgICAgICBjbG9uZSA9IERvY3VtZW50VHlwZShOb25lKQorICAgICAgICAgICAgY2xvbmUubmFtZSA9IHNlbGYubmFtZQorICAgICAgICAgICAgY2xvbmUubm9kZU5hbWUgPSBzZWxmLm5hbWUKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9IHhtbC5kb20uVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVECisgICAgICAgICAgICBpZiBkZWVwOgorICAgICAgICAgICAgICAgIGNsb25lLmVudGl0aWVzLl9zZXEgPSBbXQorICAgICAgICAgICAgICAgIGNsb25lLm5vdGF0aW9ucy5fc2VxID0gW10KKyAgICAgICAgICAgICAgICBmb3IgbiBpbiBzZWxmLm5vdGF0aW9ucy5fc2VxOgorICAgICAgICAgICAgICAgICAgICBub3RhdGlvbiA9IE5vdGF0aW9uKG4ubm9kZU5hbWUsIG4ucHVibGljSWQsIG4uc3lzdGVtSWQpCisgICAgICAgICAgICAgICAgICAgIGNsb25lLm5vdGF0aW9ucy5fc2VxLmFwcGVuZChub3RhdGlvbikKKyAgICAgICAgICAgICAgICAgICAgbi5fY2FsbF91c2VyX2RhdGFfaGFuZGxlcihvcGVyYXRpb24sIG4sIG5vdGF0aW9uKQorICAgICAgICAgICAgICAgIGZvciBlIGluIHNlbGYuZW50aXRpZXMuX3NlcToKKyAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gRW50aXR5KGUubm9kZU5hbWUsIGUucHVibGljSWQsIGUuc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5vdGF0aW9uTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZW50aXR5LmFjdHVhbEVuY29kaW5nID0gZS5hY3R1YWxFbmNvZGluZworICAgICAgICAgICAgICAgICAgICBlbnRpdHkuZW5jb2RpbmcgPSBlLmVuY29kaW5nCisgICAgICAgICAgICAgICAgICAgIGVudGl0eS52ZXJzaW9uID0gZS52ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIGNsb25lLmVudGl0aWVzLl9zZXEuYXBwZW5kKGVudGl0eSkKKyAgICAgICAgICAgICAgICAgICAgZS5fY2FsbF91c2VyX2RhdGFfaGFuZGxlcihvcGVyYXRpb24sIG4sIGVudGl0eSkKKyAgICAgICAgICAgIHNlbGYuX2NhbGxfdXNlcl9kYXRhX2hhbmRsZXIob3BlcmF0aW9uLCBzZWxmLCBjbG9uZSkKKyAgICAgICAgICAgIHJldHVybiBjbG9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiB3cml0ZXhtbChzZWxmLCB3cml0ZXIsIGluZGVudD0iIiwgYWRkaW5kZW50PSIiLCBuZXdsPSIiKToKKyAgICAgICAgd3JpdGVyLndyaXRlKCI8IURPQ1RZUEUgIikKKyAgICAgICAgd3JpdGVyLndyaXRlKHNlbGYubmFtZSkKKyAgICAgICAgaWYgc2VsZi5wdWJsaWNJZDoKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiJXMgIFBVQkxJQyAnJXMnJXMgICclcyciCisgICAgICAgICAgICAgICAgICAgICAgICAgJSAobmV3bCwgc2VsZi5wdWJsaWNJZCwgbmV3bCwgc2VsZi5zeXN0ZW1JZCkpCisgICAgICAgIGVsaWYgc2VsZi5zeXN0ZW1JZDoKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiJXMgIFNZU1RFTSAnJXMnIiAlIChuZXdsLCBzZWxmLnN5c3RlbUlkKSkKKyAgICAgICAgaWYgc2VsZi5pbnRlcm5hbFN1YnNldCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiIFsiKQorICAgICAgICAgICAgd3JpdGVyLndyaXRlKHNlbGYuaW50ZXJuYWxTdWJzZXQpCisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIl0iKQorICAgICAgICB3cml0ZXIud3JpdGUoIj4iK25ld2wpCisKK2NsYXNzIEVudGl0eShJZGVudGlmaWVkLCBOb2RlKToKKyAgICBhdHRyaWJ1dGVzID0gTm9uZQorICAgIG5vZGVUeXBlID0gTm9kZS5FTlRJVFlfTk9ERQorICAgIG5vZGVWYWx1ZSA9IE5vbmUKKworICAgIGFjdHVhbEVuY29kaW5nID0gTm9uZQorICAgIGVuY29kaW5nID0gTm9uZQorICAgIHZlcnNpb24gPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBub3RhdGlvbik6CisgICAgICAgIHNlbGYubm9kZU5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYubm90YXRpb25OYW1lID0gbm90YXRpb24KKyAgICAgICAgc2VsZi5jaGlsZE5vZGVzID0gTm9kZUxpc3QoKQorICAgICAgICBzZWxmLl9pZGVudGlmaWVkX21peGluX2luaXQocHVibGljSWQsIHN5c3RlbUlkKQorCisgICAgZGVmIF9nZXRfYWN0dWFsRW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmFjdHVhbEVuY29kaW5nCisKKyAgICBkZWYgX2dldF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RpbmcKKworICAgIGRlZiBfZ2V0X3ZlcnNpb24oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZlcnNpb24KKworICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBuZXdDaGlsZCk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgICJjYW5ub3QgYXBwZW5kIGNoaWxkcmVuIHRvIGFuIGVudGl0eSBub2RlIikKKworICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbmV3Q2hpbGQsIHJlZkNoaWxkKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgImNhbm5vdCBpbnNlcnQgY2hpbGRyZW4gYmVsb3cgYW4gZW50aXR5IG5vZGUiKQorCisgICAgZGVmIHJlbW92ZUNoaWxkKHNlbGYsIG9sZENoaWxkKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgImNhbm5vdCByZW1vdmUgY2hpbGRyZW4gZnJvbSBhbiBlbnRpdHkgbm9kZSIpCisKKyAgICBkZWYgcmVwbGFjZUNoaWxkKHNlbGYsIG5ld0NoaWxkLCBvbGRDaGlsZCk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgICJjYW5ub3QgcmVwbGFjZSBjaGlsZHJlbiBvZiBhbiBlbnRpdHkgbm9kZSIpCisKK2NsYXNzIE5vdGF0aW9uKElkZW50aWZpZWQsIENoaWxkbGVzcywgTm9kZSk6CisgICAgbm9kZVR5cGUgPSBOb2RlLk5PVEFUSU9OX05PREUKKyAgICBub2RlVmFsdWUgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKToKKyAgICAgICAgc2VsZi5ub2RlTmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5faWRlbnRpZmllZF9taXhpbl9pbml0KHB1YmxpY0lkLCBzeXN0ZW1JZCkKKworCitjbGFzcyBET01JbXBsZW1lbnRhdGlvbihET01JbXBsZW1lbnRhdGlvbkxTKToKKyAgICBfZmVhdHVyZXMgPSBbKCJjb3JlIiwgIjEuMCIpLAorICAgICAgICAgICAgICAgICAoImNvcmUiLCAiMi4wIiksCisgICAgICAgICAgICAgICAgICgiY29yZSIsIE5vbmUpLAorICAgICAgICAgICAgICAgICAoInhtbCIsICIxLjAiKSwKKyAgICAgICAgICAgICAgICAgKCJ4bWwiLCAiMi4wIiksCisgICAgICAgICAgICAgICAgICgieG1sIiwgTm9uZSksCisgICAgICAgICAgICAgICAgICgibHMtbG9hZCIsICIzLjAiKSwKKyAgICAgICAgICAgICAgICAgKCJscy1sb2FkIiwgTm9uZSksCisgICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiBoYXNGZWF0dXJlKHNlbGYsIGZlYXR1cmUsIHZlcnNpb24pOgorICAgICAgICBpZiB2ZXJzaW9uID09ICIiOgorICAgICAgICAgICAgdmVyc2lvbiA9IE5vbmUKKyAgICAgICAgcmV0dXJuIChmZWF0dXJlLmxvd2VyKCksIHZlcnNpb24pIGluIHNlbGYuX2ZlYXR1cmVzCisKKyAgICBkZWYgY3JlYXRlRG9jdW1lbnQoc2VsZiwgbmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lLCBkb2N0eXBlKToKKyAgICAgICAgaWYgZG9jdHlwZSBhbmQgZG9jdHlwZS5wYXJlbnROb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Xcm9uZ0RvY3VtZW50RXJyKAorICAgICAgICAgICAgICAgICJkb2N0eXBlIG9iamVjdCBvd25lZCBieSBhbm90aGVyIERPTSB0cmVlIikKKyAgICAgICAgZG9jID0gc2VsZi5fY3JlYXRlX2RvY3VtZW50KCkKKworICAgICAgICBhZGRfcm9vdF9lbGVtZW50ID0gbm90IChuYW1lc3BhY2VVUkkgaXMgTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcXVhbGlmaWVkTmFtZSBpcyBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBkb2N0eXBlIGlzIE5vbmUpCisKKyAgICAgICAgaWYgbm90IHF1YWxpZmllZE5hbWUgYW5kIGFkZF9yb290X2VsZW1lbnQ6CisgICAgICAgICAgICAjIFRoZSBzcGVjIGlzIHVuY2xlYXIgd2hhdCB0byByYWlzZSBoZXJlOyBTeW50YXhFcnIKKyAgICAgICAgICAgICMgd291bGQgYmUgdGhlIG90aGVyIG9idmlvdXMgY2FuZGlkYXRlLiBTaW5jZSBYZXJjZXMgcmFpc2VzCisgICAgICAgICAgICAjIEludmFsaWRDaGFyYWN0ZXJFcnIsIGFuZCBzaW5jZSBTeW50YXhFcnIgaXMgbm90IGxpc3RlZAorICAgICAgICAgICAgIyBmb3IgY3JlYXRlRG9jdW1lbnQsIHRoYXQgc2VlbXMgdG8gYmUgdGhlIGJldHRlciBjaG9pY2UuCisgICAgICAgICAgICAjIFhYWDogbmVlZCB0byBjaGVjayBmb3IgaWxsZWdhbCBjaGFyYWN0ZXJzIGhlcmUgYW5kIGluCisgICAgICAgICAgICAjIGNyZWF0ZUVsZW1lbnQuCisKKyAgICAgICAgICAgICMgRE9NIExldmVsIElJSSBjbGVhcnMgdGhpcyB1cCB3aGVuIHRhbGtpbmcgYWJvdXQgdGhlIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgIyBvZiB0aGlzIGZ1bmN0aW9uLiAgSWYgbmFtZXNwYWNlVVJJLCBxTmFtZSBhbmQgRG9jVHlwZSBhcmUKKyAgICAgICAgICAgICMgTnVsbCB0aGUgZG9jdW1lbnQgaXMgcmV0dXJuZWQgd2l0aG91dCBhIGRvY3VtZW50IGVsZW1lbnQKKyAgICAgICAgICAgICMgT3RoZXJ3aXNlIGlmIGRvY3R5cGUgb3IgbmFtZXNwYWNlVVJJIGFyZSBub3QgTm9uZQorICAgICAgICAgICAgIyBUaGVuIHdlIGdvIGJhY2sgdG8gdGhlIGFib3ZlIHByb2JsZW0KKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW52YWxpZENoYXJhY3RlckVycigiRWxlbWVudCB3aXRoIG5vIG5hbWUiKQorCisgICAgICAgIGlmIGFkZF9yb290X2VsZW1lbnQ6CisgICAgICAgICAgICBwcmVmaXgsIGxvY2FsbmFtZSA9IF9uc3NwbGl0KHF1YWxpZmllZE5hbWUpCisgICAgICAgICAgICBpZiBwcmVmaXggPT0gInhtbCIgXAorICAgICAgICAgICAgICAgYW5kIG5hbWVzcGFjZVVSSSAhPSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjoKKyAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5hbWVzcGFjZUVycigiaWxsZWdhbCB1c2Ugb2YgJ3htbCcgcHJlZml4IikKKyAgICAgICAgICAgIGlmIHByZWZpeCBhbmQgbm90IG5hbWVzcGFjZVVSSToKKyAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5hbWVzcGFjZUVycigKKyAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgdXNlIG9mIHByZWZpeCB3aXRob3V0IG5hbWVzcGFjZXMiKQorICAgICAgICAgICAgZWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKQorICAgICAgICAgICAgaWYgZG9jdHlwZToKKyAgICAgICAgICAgICAgICBkb2MuYXBwZW5kQ2hpbGQoZG9jdHlwZSkKKyAgICAgICAgICAgIGRvYy5hcHBlbmRDaGlsZChlbGVtZW50KQorCisgICAgICAgIGlmIGRvY3R5cGU6CisgICAgICAgICAgICBkb2N0eXBlLnBhcmVudE5vZGUgPSBkb2N0eXBlLm93bmVyRG9jdW1lbnQgPSBkb2MKKworICAgICAgICBkb2MuZG9jdHlwZSA9IGRvY3R5cGUKKyAgICAgICAgZG9jLmltcGxlbWVudGF0aW9uID0gc2VsZgorICAgICAgICByZXR1cm4gZG9jCisKKyAgICBkZWYgY3JlYXRlRG9jdW1lbnRUeXBlKHNlbGYsIHF1YWxpZmllZE5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CisgICAgICAgIGRvY3R5cGUgPSBEb2N1bWVudFR5cGUocXVhbGlmaWVkTmFtZSkKKyAgICAgICAgZG9jdHlwZS5wdWJsaWNJZCA9IHB1YmxpY0lkCisgICAgICAgIGRvY3R5cGUuc3lzdGVtSWQgPSBzeXN0ZW1JZAorICAgICAgICByZXR1cm4gZG9jdHlwZQorCisgICAgIyBET00gTGV2ZWwgMyAoV0QgOSBBcHJpbCAyMDAyKQorCisgICAgZGVmIGdldEludGVyZmFjZShzZWxmLCBmZWF0dXJlKToKKyAgICAgICAgaWYgc2VsZi5oYXNGZWF0dXJlKGZlYXR1cmUsIE5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIGludGVybmFsCisgICAgZGVmIF9jcmVhdGVfZG9jdW1lbnQoc2VsZik6CisgICAgICAgIHJldHVybiBEb2N1bWVudCgpCisKK2NsYXNzIEVsZW1lbnRJbmZvKG9iamVjdCk6CisgICAgIiIiT2JqZWN0IHRoYXQgcmVwcmVzZW50cyBjb250ZW50LW1vZGVsIGluZm9ybWF0aW9uIGZvciBhbiBlbGVtZW50LgorCisgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgdXNlZCBpbiBwcmFjdGljZTsgRE9NCisgICAgYnVpbGRlcnMgc2hvdWxkIHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIHdoaWNoIGRvIHRoZSByaWdodCB0aGluZworICAgIHVzaW5nIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBpdC4KKworICAgICIiIgorCisgICAgX19zbG90c19fID0gJ3RhZ05hbWUnLAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLnRhZ05hbWUgPSBuYW1lCisKKyAgICBkZWYgZ2V0QXR0cmlidXRlVHlwZShzZWxmLCBhbmFtZSk6CisgICAgICAgIHJldHVybiBfbm9fdHlwZQorCisgICAgZGVmIGdldEF0dHJpYnV0ZVR5cGVOUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CisgICAgICAgIHJldHVybiBfbm9fdHlwZQorCisgICAgZGVmIGlzRWxlbWVudENvbnRlbnQoc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGlzRW1wdHkoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdHJ1ZSBpZmYgdGhpcyBlbGVtZW50IGlzIGRlY2xhcmVkIHRvIGhhdmUgYW4gRU1QVFkKKyAgICAgICAgY29udGVudCBtb2RlbC4iIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgaXNJZChzZWxmLCBhbmFtZSk6CisgICAgICAgICIiIlJldHVybnMgdHJ1ZSBpZmYgdGhlIG5hbWVkIGF0dHJpYnV0ZSBpcyBhIERURC1zdHlsZSBJRC4iIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgaXNJZE5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKToKKyAgICAgICAgIiIiUmV0dXJucyB0cnVlIGlmZiB0aGUgaWRlbnRpZmllZCBhdHRyaWJ1dGUgaXMgYSBEVEQtc3R5bGUgSUQuIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGFnTmFtZQorCisgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgIHNlbGYudGFnTmFtZSA9IHN0YXRlCisKK2RlZiBfY2xlYXJfaWRfY2FjaGUobm9kZSk6CisgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX05PREU6CisgICAgICAgIG5vZGUuX2lkX2NhY2hlLmNsZWFyKCkKKyAgICAgICAgbm9kZS5faWRfc2VhcmNoX3N0YWNrID0gTm9uZQorICAgIGVsaWYgX2luX2RvY3VtZW50KG5vZGUpOgorICAgICAgICBub2RlLm93bmVyRG9jdW1lbnQuX2lkX2NhY2hlLmNsZWFyKCkKKyAgICAgICAgbm9kZS5vd25lckRvY3VtZW50Ll9pZF9zZWFyY2hfc3RhY2s9IE5vbmUKKworY2xhc3MgRG9jdW1lbnQoTm9kZSwgRG9jdW1lbnRMUyk6CisgICAgX2NoaWxkX25vZGVfdHlwZXMgPSAoTm9kZS5FTEVNRU5UX05PREUsIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUuQ09NTUVOVF9OT0RFLCBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkKKworICAgIG5vZGVUeXBlID0gTm9kZS5ET0NVTUVOVF9OT0RFCisgICAgbm9kZU5hbWUgPSAiI2RvY3VtZW50IgorICAgIG5vZGVWYWx1ZSA9IE5vbmUKKyAgICBhdHRyaWJ1dGVzID0gTm9uZQorICAgIGRvY3R5cGUgPSBOb25lCisgICAgcGFyZW50Tm9kZSA9IE5vbmUKKyAgICBwcmV2aW91c1NpYmxpbmcgPSBuZXh0U2libGluZyA9IE5vbmUKKworICAgIGltcGxlbWVudGF0aW9uID0gRE9NSW1wbGVtZW50YXRpb24oKQorCisgICAgIyBEb2N1bWVudCBhdHRyaWJ1dGVzIGZyb20gTGV2ZWwgMyAoV0QgOSBBcHJpbCAyMDAyKQorCisgICAgYWN0dWFsRW5jb2RpbmcgPSBOb25lCisgICAgZW5jb2RpbmcgPSBOb25lCisgICAgc3RhbmRhbG9uZSA9IE5vbmUKKyAgICB2ZXJzaW9uID0gTm9uZQorICAgIHN0cmljdEVycm9yQ2hlY2tpbmcgPSBGYWxzZQorICAgIGVycm9ySGFuZGxlciA9IE5vbmUKKyAgICBkb2N1bWVudFVSSSA9IE5vbmUKKworICAgIF9tYWdpY19pZF9jb3VudCA9IDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGlsZE5vZGVzID0gTm9kZUxpc3QoKQorICAgICAgICAjIG1hcHBpbmcgb2YgKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKSAtPiBFbGVtZW50SW5mbworICAgICAgICAjICAgICAgICBhbmQgdGFnTmFtZSAtPiBFbGVtZW50SW5mbworICAgICAgICBzZWxmLl9lbGVtX2luZm8gPSB7fQorICAgICAgICBzZWxmLl9pZF9jYWNoZSA9IHt9CisgICAgICAgIHNlbGYuX2lkX3NlYXJjaF9zdGFjayA9IE5vbmUKKworICAgIGRlZiBfZ2V0X2VsZW1faW5mbyhzZWxmLCBlbGVtZW50KToKKyAgICAgICAgaWYgZWxlbWVudC5uYW1lc3BhY2VVUkk6CisgICAgICAgICAgICBrZXkgPSBlbGVtZW50Lm5hbWVzcGFjZVVSSSwgZWxlbWVudC5sb2NhbE5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGtleSA9IGVsZW1lbnQudGFnTmFtZQorICAgICAgICByZXR1cm4gc2VsZi5fZWxlbV9pbmZvLmdldChrZXkpCisKKyAgICBkZWYgX2dldF9hY3R1YWxFbmNvZGluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYWN0dWFsRW5jb2RpbmcKKworICAgIGRlZiBfZ2V0X2RvY3R5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRvY3R5cGUKKworICAgIGRlZiBfZ2V0X2RvY3VtZW50VVJJKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kb2N1bWVudFVSSQorCisgICAgZGVmIF9nZXRfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmVuY29kaW5nCisKKyAgICBkZWYgX2dldF9lcnJvckhhbmRsZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmVycm9ySGFuZGxlcgorCisgICAgZGVmIF9nZXRfc3RhbmRhbG9uZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RhbmRhbG9uZQorCisgICAgZGVmIF9nZXRfc3RyaWN0RXJyb3JDaGVja2luZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RyaWN0RXJyb3JDaGVja2luZworCisgICAgZGVmIF9nZXRfdmVyc2lvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmVyc2lvbgorCisgICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub2RlLm5vZGVUeXBlIG5vdCBpbiBzZWxmLl9jaGlsZF9ub2RlX3R5cGVzOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgICAgICIlcyBjYW5ub3QgYmUgY2hpbGQgb2YgJXMiICUgKHJlcHIobm9kZSksIHJlcHIoc2VsZikpKQorICAgICAgICBpZiBub2RlLnBhcmVudE5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIFRoaXMgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgdGhlIG5leHQgdGVzdCBzaW5jZSB0aGlzCisgICAgICAgICAgICAjIG1heSAqYmUqIHRoZSBkb2N1bWVudCBlbGVtZW50LCBpbiB3aGljaCBjYXNlIGl0IHNob3VsZAorICAgICAgICAgICAgIyBlbmQgdXAgcmUtb3JkZXJlZCB0byB0aGUgZW5kLgorICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpCisKKyAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSBcCisgICAgICAgICAgIGFuZCBzZWxmLl9nZXRfZG9jdW1lbnRFbGVtZW50KCk6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgICAgICAgICAgInR3byBkb2N1bWVudCBlbGVtZW50cyBkaXNhbGxvd2VkIikKKyAgICAgICAgcmV0dXJuIE5vZGUuYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSkKKworICAgIGRlZiByZW1vdmVDaGlsZChzZWxmLCBvbGRDaGlsZCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2hpbGROb2Rlcy5yZW1vdmUob2xkQ2hpbGQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgIG9sZENoaWxkLm5leHRTaWJsaW5nID0gb2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nID0gTm9uZQorICAgICAgICBvbGRDaGlsZC5wYXJlbnROb2RlID0gTm9uZQorICAgICAgICBpZiBzZWxmLmRvY3VtZW50RWxlbWVudCBpcyBvbGRDaGlsZDoKKyAgICAgICAgICAgIHNlbGYuZG9jdW1lbnRFbGVtZW50ID0gTm9uZQorCisgICAgICAgIHJldHVybiBvbGRDaGlsZAorCisgICAgZGVmIF9nZXRfZG9jdW1lbnRFbGVtZW50KHNlbGYpOgorICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLmNoaWxkTm9kZXM6CisgICAgICAgICAgICBpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgICAgIHJldHVybiBub2RlCisKKyAgICBkZWYgdW5saW5rKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRvY3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmRvY3R5cGUudW5saW5rKCkKKyAgICAgICAgICAgIHNlbGYuZG9jdHlwZSA9IE5vbmUKKyAgICAgICAgTm9kZS51bmxpbmsoc2VsZikKKworICAgIGRlZiBjbG9uZU5vZGUoc2VsZiwgZGVlcCk6CisgICAgICAgIGlmIG5vdCBkZWVwOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgY2xvbmUgPSBzZWxmLmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50KE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIGNsb25lLmVuY29kaW5nID0gc2VsZi5lbmNvZGluZworICAgICAgICBjbG9uZS5zdGFuZGFsb25lID0gc2VsZi5zdGFuZGFsb25lCisgICAgICAgIGNsb25lLnZlcnNpb24gPSBzZWxmLnZlcnNpb24KKyAgICAgICAgZm9yIG4gaW4gc2VsZi5jaGlsZE5vZGVzOgorICAgICAgICAgICAgY2hpbGRjbG9uZSA9IF9jbG9uZV9ub2RlKG4sIGRlZXAsIGNsb25lKQorICAgICAgICAgICAgYXNzZXJ0IGNoaWxkY2xvbmUub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKGNsb25lKQorICAgICAgICAgICAgY2xvbmUuY2hpbGROb2Rlcy5hcHBlbmQoY2hpbGRjbG9uZSkKKyAgICAgICAgICAgIGlmIGNoaWxkY2xvbmUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFOgorICAgICAgICAgICAgICAgIGFzc2VydCBjbG9uZS5kb2N1bWVudEVsZW1lbnQgaXMgTm9uZQorICAgICAgICAgICAgZWxpZiBjaGlsZGNsb25lLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgorICAgICAgICAgICAgICAgIGFzc2VydCBjbG9uZS5kb2N0eXBlIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBjbG9uZS5kb2N0eXBlID0gY2hpbGRjbG9uZQorICAgICAgICAgICAgY2hpbGRjbG9uZS5wYXJlbnROb2RlID0gY2xvbmUKKyAgICAgICAgc2VsZi5fY2FsbF91c2VyX2RhdGFfaGFuZGxlcih4bWwuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBjbG9uZSkKKyAgICAgICAgcmV0dXJuIGNsb25lCisKKyAgICBkZWYgY3JlYXRlRG9jdW1lbnRGcmFnbWVudChzZWxmKToKKyAgICAgICAgZCA9IERvY3VtZW50RnJhZ21lbnQoKQorICAgICAgICBkLm93bmVyRG9jdW1lbnQgPSBzZWxmCisgICAgICAgIHJldHVybiBkCisKKyAgICBkZWYgY3JlYXRlRWxlbWVudChzZWxmLCB0YWdOYW1lKToKKyAgICAgICAgZSA9IEVsZW1lbnQodGFnTmFtZSkKKyAgICAgICAgZS5vd25lckRvY3VtZW50ID0gc2VsZgorICAgICAgICByZXR1cm4gZQorCisgICAgZGVmIGNyZWF0ZVRleHROb2RlKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCBTdHJpbmdUeXBlcyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJub2RlIGNvbnRlbnRzIG11c3QgYmUgYSBzdHJpbmciCisgICAgICAgIHQgPSBUZXh0KCkKKyAgICAgICAgdC5kYXRhID0gZGF0YQorICAgICAgICB0Lm93bmVyRG9jdW1lbnQgPSBzZWxmCisgICAgICAgIHJldHVybiB0CisKKyAgICBkZWYgY3JlYXRlQ0RBVEFTZWN0aW9uKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkYXRhLCBTdHJpbmdUeXBlcyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJub2RlIGNvbnRlbnRzIG11c3QgYmUgYSBzdHJpbmciCisgICAgICAgIGMgPSBDREFUQVNlY3Rpb24oKQorICAgICAgICBjLmRhdGEgPSBkYXRhCisgICAgICAgIGMub3duZXJEb2N1bWVudCA9IHNlbGYKKyAgICAgICAgcmV0dXJuIGMKKworICAgIGRlZiBjcmVhdGVDb21tZW50KHNlbGYsIGRhdGEpOgorICAgICAgICBjID0gQ29tbWVudChkYXRhKQorICAgICAgICBjLm93bmVyRG9jdW1lbnQgPSBzZWxmCisgICAgICAgIHJldHVybiBjCisKKyAgICBkZWYgY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHNlbGYsIHRhcmdldCwgZGF0YSk6CisgICAgICAgIHAgPSBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkYXRhKQorICAgICAgICBwLm93bmVyRG9jdW1lbnQgPSBzZWxmCisgICAgICAgIHJldHVybiBwCisKKyAgICBkZWYgY3JlYXRlQXR0cmlidXRlKHNlbGYsIHFOYW1lKToKKyAgICAgICAgYSA9IEF0dHIocU5hbWUpCisgICAgICAgIGEub3duZXJEb2N1bWVudCA9IHNlbGYKKyAgICAgICAgYS52YWx1ZSA9ICIiCisgICAgICAgIHJldHVybiBhCisKKyAgICBkZWYgY3JlYXRlRWxlbWVudE5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSk6CisgICAgICAgIHByZWZpeCwgbG9jYWxOYW1lID0gX25zc3BsaXQocXVhbGlmaWVkTmFtZSkKKyAgICAgICAgZSA9IEVsZW1lbnQocXVhbGlmaWVkTmFtZSwgbmFtZXNwYWNlVVJJLCBwcmVmaXgpCisgICAgICAgIGUub3duZXJEb2N1bWVudCA9IHNlbGYKKyAgICAgICAgcmV0dXJuIGUKKworICAgIGRlZiBjcmVhdGVBdHRyaWJ1dGVOUyhzZWxmLCBuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUpOgorICAgICAgICBwcmVmaXgsIGxvY2FsTmFtZSA9IF9uc3NwbGl0KHF1YWxpZmllZE5hbWUpCisgICAgICAgIGEgPSBBdHRyKHF1YWxpZmllZE5hbWUsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBwcmVmaXgpCisgICAgICAgIGEub3duZXJEb2N1bWVudCA9IHNlbGYKKyAgICAgICAgYS52YWx1ZSA9ICIiCisgICAgICAgIHJldHVybiBhCisKKyAgICAjIEEgY291cGxlIG9mIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGhlbHBlcnMgdG8gY3JlYXRlIG5vZGUgdHlwZXMKKyAgICAjIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFczQyBET00gc3BlY3M6CisKKyAgICBkZWYgX2NyZWF0ZV9lbnRpdHkoc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBub3RhdGlvbk5hbWUpOgorICAgICAgICBlID0gRW50aXR5KG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbm90YXRpb25OYW1lKQorICAgICAgICBlLm93bmVyRG9jdW1lbnQgPSBzZWxmCisgICAgICAgIHJldHVybiBlCisKKyAgICBkZWYgX2NyZWF0ZV9ub3RhdGlvbihzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgorICAgICAgICBuID0gTm90YXRpb24obmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKQorICAgICAgICBuLm93bmVyRG9jdW1lbnQgPSBzZWxmCisgICAgICAgIHJldHVybiBuCisKKyAgICBkZWYgZ2V0RWxlbWVudEJ5SWQoc2VsZiwgaWQpOgorICAgICAgICBpZiBpZCBpbiBzZWxmLl9pZF9jYWNoZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9pZF9jYWNoZVtpZF0KKyAgICAgICAgaWYgbm90IChzZWxmLl9lbGVtX2luZm8gb3Igc2VsZi5fbWFnaWNfaWRfY291bnQpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBzdGFjayA9IHNlbGYuX2lkX3NlYXJjaF9zdGFjaworICAgICAgICBpZiBzdGFjayBpcyBOb25lOgorICAgICAgICAgICAgIyB3ZSBuZXZlciBzZWFyY2hlZCBiZWZvcmUsIG9yIHRoZSBjYWNoZSBoYXMgYmVlbiBjbGVhcmVkCisgICAgICAgICAgICBzdGFjayA9IFtzZWxmLmRvY3VtZW50RWxlbWVudF0KKyAgICAgICAgICAgIHNlbGYuX2lkX3NlYXJjaF9zdGFjayA9IHN0YWNrCisgICAgICAgIGVsaWYgbm90IHN0YWNrOgorICAgICAgICAgICAgIyBQcmV2aW91cyBzZWFyY2ggd2FzIGNvbXBsZXRlZCBhbmQgY2FjaGUgaXMgc3RpbGwgdmFsaWQ7CisgICAgICAgICAgICAjIG5vIG1hdGNoaW5nIG5vZGUuCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHJlc3VsdCA9IE5vbmUKKyAgICAgICAgd2hpbGUgc3RhY2s6CisgICAgICAgICAgICBub2RlID0gc3RhY2sucG9wKCkKKyAgICAgICAgICAgICMgYWRkIGNoaWxkIGVsZW1lbnRzIHRvIHN0YWNrIGZvciBjb250aW51ZWQgc2VhcmNoaW5nCisgICAgICAgICAgICBzdGFjay5leHRlbmQoW2NoaWxkIGZvciBjaGlsZCBpbiBub2RlLmNoaWxkTm9kZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hpbGQubm9kZVR5cGUgaW4gX25vZGVUeXBlc193aXRoX2NoaWxkcmVuXSkKKyAgICAgICAgICAgICMgY2hlY2sgdGhpcyBub2RlCisgICAgICAgICAgICBpbmZvID0gc2VsZi5fZ2V0X2VsZW1faW5mbyhub2RlKQorICAgICAgICAgICAgaWYgaW5mbzoKKyAgICAgICAgICAgICAgICAjIFdlIGhhdmUgdG8gcHJvY2VzcyBhbGwgSUQgYXR0cmlidXRlcyBiZWZvcmUKKyAgICAgICAgICAgICAgICAjIHJldHVybmluZyBpbiBvcmRlciB0byBnZXQgYWxsIHRoZSBhdHRyaWJ1dGVzIHNldCB0bworICAgICAgICAgICAgICAgICMgYmUgSURzIHVzaW5nIEVsZW1lbnQuc2V0SWRBdHRyaWJ1dGUqKCkuCisgICAgICAgICAgICAgICAgZm9yIGF0dHIgaW4gbm9kZS5hdHRyaWJ1dGVzLnZhbHVlcygpOgorICAgICAgICAgICAgICAgICAgICBpZiBhdHRyLm5hbWVzcGFjZVVSSToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGluZm8uaXNJZE5TKGF0dHIubmFtZXNwYWNlVVJJLCBhdHRyLmxvY2FsTmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faWRfY2FjaGVbYXR0ci52YWx1ZV0gPSBub2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXR0ci52YWx1ZSA9PSBpZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbm9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbm90IG5vZGUuX21hZ2ljX2lkX25vZGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbGlmIGluZm8uaXNJZChhdHRyLm5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faWRfY2FjaGVbYXR0ci52YWx1ZV0gPSBub2RlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBhdHRyLnZhbHVlID09IGlkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbm90IG5vZGUuX21hZ2ljX2lkX25vZGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsaWYgYXR0ci5faXNfaWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pZF9jYWNoZVthdHRyLnZhbHVlXSA9IG5vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGF0dHIudmFsdWUgPT0gaWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbm9kZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBub2RlLl9tYWdpY19pZF9ub2RlcyA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIG5vZGUuX21hZ2ljX2lkX25vZGVzOgorICAgICAgICAgICAgICAgIGZvciBhdHRyIGluIG5vZGUuYXR0cmlidXRlcy52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgYXR0ci5faXNfaWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pZF9jYWNoZVthdHRyLnZhbHVlXSA9IG5vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGF0dHIudmFsdWUgPT0gaWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbm9kZQorICAgICAgICAgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBnZXRFbGVtZW50c0J5VGFnTmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIF9nZXRfZWxlbWVudHNfYnlfdGFnTmFtZV9oZWxwZXIoc2VsZiwgbmFtZSwgTm9kZUxpc3QoKSkKKworICAgIGRlZiBnZXRFbGVtZW50c0J5VGFnTmFtZU5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKToKKyAgICAgICAgcmV0dXJuIF9nZXRfZWxlbWVudHNfYnlfdGFnTmFtZV9uc19oZWxwZXIoCisgICAgICAgICAgICBzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgTm9kZUxpc3QoKSkKKworICAgIGRlZiBpc1N1cHBvcnRlZChzZWxmLCBmZWF0dXJlLCB2ZXJzaW9uKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZShmZWF0dXJlLCB2ZXJzaW9uKQorCisgICAgZGVmIGltcG9ydE5vZGUoc2VsZiwgbm9kZSwgZGVlcCk6CisgICAgICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoImNhbm5vdCBpbXBvcnQgZG9jdW1lbnQgbm9kZXMiKQorICAgICAgICBlbGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycigiY2Fubm90IGltcG9ydCBkb2N1bWVudCB0eXBlIG5vZGVzIikKKyAgICAgICAgcmV0dXJuIF9jbG9uZV9ub2RlKG5vZGUsIGRlZXAsIHNlbGYpCisKKyAgICBkZWYgd3JpdGV4bWwoc2VsZiwgd3JpdGVyLCBpbmRlbnQ9IiIsIGFkZGluZGVudD0iIiwgbmV3bD0iIiwKKyAgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBOb25lKToKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgnPD94bWwgdmVyc2lvbj0iMS4wIiA/PicrbmV3bCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJXMiPz4lcycgJSAoZW5jb2RpbmcsIG5ld2wpKQorICAgICAgICBmb3Igbm9kZSBpbiBzZWxmLmNoaWxkTm9kZXM6CisgICAgICAgICAgICBub2RlLndyaXRleG1sKHdyaXRlciwgaW5kZW50LCBhZGRpbmRlbnQsIG5ld2wpCisKKyAgICAjIERPTSBMZXZlbCAzIChXRCA5IEFwcmlsIDIwMDIpCisKKyAgICBkZWYgcmVuYW1lTm9kZShzZWxmLCBuLCBuYW1lc3BhY2VVUkksIG5hbWUpOgorICAgICAgICBpZiBuLm93bmVyRG9jdW1lbnQgaXMgbm90IHNlbGY6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLldyb25nRG9jdW1lbnRFcnIoCisgICAgICAgICAgICAgICAgImNhbm5vdCByZW5hbWUgbm9kZXMgZnJvbSBvdGhlciBkb2N1bWVudHM7XG4iCisgICAgICAgICAgICAgICAgImV4cGVjdGVkICVzLFxuZm91bmQgJXMiICUgKHNlbGYsIG4ub3duZXJEb2N1bWVudCkpCisgICAgICAgIGlmIG4ubm9kZVR5cGUgbm90IGluIChOb2RlLkVMRU1FTlRfTk9ERSwgTm9kZS5BVFRSSUJVVEVfTk9ERSk6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycigKKyAgICAgICAgICAgICAgICAicmVuYW1lTm9kZSgpIG9ubHkgYXBwbGllcyB0byBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMiKQorICAgICAgICBpZiBuYW1lc3BhY2VVUkkgIT0gRU1QVFlfTkFNRVNQQUNFOgorICAgICAgICAgICAgaWYgJzonIGluIG5hbWU6CisgICAgICAgICAgICAgICAgcHJlZml4LCBsb2NhbE5hbWUgPSBuYW1lLnNwbGl0KCc6JywgMSkKKyAgICAgICAgICAgICAgICBpZiAoICBwcmVmaXggPT0gInhtbG5zIgorICAgICAgICAgICAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VVUkkgIT0geG1sLmRvbS5YTUxOU19OQU1FU1BBQ0UpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5hbWVzcGFjZUVycigKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHVzZSBvZiAneG1sbnMnIHByZWZpeCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmICggIG5hbWUgPT0gInhtbG5zIgorICAgICAgICAgICAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VVUkkgIT0geG1sLmRvbS5YTUxOU19OQU1FU1BBQ0UKKyAgICAgICAgICAgICAgICAgICAgICBhbmQgbi5ub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5OYW1lc3BhY2VFcnIoCisgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCB1c2Ugb2YgdGhlICd4bWxucycgYXR0cmlidXRlIikKKyAgICAgICAgICAgICAgICBwcmVmaXggPSBOb25lCisgICAgICAgICAgICAgICAgbG9jYWxOYW1lID0gbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJlZml4ID0gTm9uZQorICAgICAgICAgICAgbG9jYWxOYW1lID0gTm9uZQorICAgICAgICBpZiBuLm5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREU6CisgICAgICAgICAgICBlbGVtZW50ID0gbi5vd25lckVsZW1lbnQKKyAgICAgICAgICAgIGlmIGVsZW1lbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaXNfaWQgPSBuLl9pc19pZAorICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTm9kZShuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZWxlbWVudCA9IE5vbmUKKyAgICAgICAgIyBhdm9pZCBfX3NldGF0dHJfXworICAgICAgICBkID0gbi5fX2RpY3RfXworICAgICAgICBkWydwcmVmaXgnXSA9IHByZWZpeAorICAgICAgICBkWydsb2NhbE5hbWUnXSA9IGxvY2FsTmFtZQorICAgICAgICBkWyduYW1lc3BhY2VVUkknXSA9IG5hbWVzcGFjZVVSSQorICAgICAgICBkWydub2RlTmFtZSddID0gbmFtZQorICAgICAgICBpZiBuLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgZFsndGFnTmFtZSddID0gbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBhdHRyaWJ1dGUgbm9kZQorICAgICAgICAgICAgZFsnbmFtZSddID0gbmFtZQorICAgICAgICAgICAgaWYgZWxlbWVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUobikKKyAgICAgICAgICAgICAgICBpZiBpc19pZDoKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRJZEF0dHJpYnV0ZU5vZGUobikKKyAgICAgICAgIyBJdCdzIG5vdCBjbGVhciBmcm9tIGEgc2VtYW50aWMgcGVyc3BlY3RpdmUgd2hldGhlciB3ZSBzaG91bGQKKyAgICAgICAgIyBjYWxsIHRoZSB1c2VyIGRhdGEgaGFuZGxlcnMgZm9yIHRoZSBOT0RFX1JFTkFNRUQgZXZlbnQgc2luY2UKKyAgICAgICAgIyB3ZSdyZSByZS11c2luZyB0aGUgZXhpc3Rpbmcgbm9kZS4gIFRoZSBkcmFmdCBzcGVjIGhhcyBiZWVuCisgICAgICAgICMgaW50ZXJwcmV0ZWQgYXMgbWVhbmluZyAibm8sIGRvbid0IGNhbGwgdGhlIGhhbmRsZXIgdW5sZXNzIGEKKyAgICAgICAgIyBuZXcgbm9kZSBpcyBjcmVhdGVkLiIKKyAgICAgICAgcmV0dXJuIG4KKworZGVmcHJvcGVydHkoRG9jdW1lbnQsICJkb2N1bWVudEVsZW1lbnQiLAorICAgICAgICAgICAgZG9jPSJUb3AtbGV2ZWwgZWxlbWVudCBvZiB0aGlzIGRvY3VtZW50LiIpCisKKworZGVmIF9jbG9uZV9ub2RlKG5vZGUsIGRlZXAsIG5ld093bmVyRG9jdW1lbnQpOgorICAgICIiIgorICAgIENsb25lIGEgbm9kZSBhbmQgZ2l2ZSBpdCB0aGUgbmV3IG93bmVyIGRvY3VtZW50LgorICAgIENhbGxlZCBieSBOb2RlLmNsb25lTm9kZSBhbmQgRG9jdW1lbnQuaW1wb3J0Tm9kZQorICAgICIiIgorICAgIGlmIG5vZGUub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKG5ld093bmVyRG9jdW1lbnQpOgorICAgICAgICBvcGVyYXRpb24gPSB4bWwuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRAorICAgIGVsc2U6CisgICAgICAgIG9wZXJhdGlvbiA9IHhtbC5kb20uVXNlckRhdGFIYW5kbGVyLk5PREVfSU1QT1JURUQKKyAgICBpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICBjbG9uZSA9IG5ld093bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5vZGUubmFtZXNwYWNlVVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZU5hbWUpCisgICAgICAgIGZvciBhdHRyIGluIG5vZGUuYXR0cmlidXRlcy52YWx1ZXMoKToKKyAgICAgICAgICAgIGNsb25lLnNldEF0dHJpYnV0ZU5TKGF0dHIubmFtZXNwYWNlVVJJLCBhdHRyLm5vZGVOYW1lLCBhdHRyLnZhbHVlKQorICAgICAgICAgICAgYSA9IGNsb25lLmdldEF0dHJpYnV0ZU5vZGVOUyhhdHRyLm5hbWVzcGFjZVVSSSwgYXR0ci5sb2NhbE5hbWUpCisgICAgICAgICAgICBhLnNwZWNpZmllZCA9IGF0dHIuc3BlY2lmaWVkCisKKyAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgICAgIGZvciBjaGlsZCBpbiBub2RlLmNoaWxkTm9kZXM6CisgICAgICAgICAgICAgICAgYyA9IF9jbG9uZV9ub2RlKGNoaWxkLCBkZWVwLCBuZXdPd25lckRvY3VtZW50KQorICAgICAgICAgICAgICAgIGNsb25lLmFwcGVuZENoaWxkKGMpCisKKyAgICBlbGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgorICAgICAgICBjbG9uZSA9IG5ld093bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCisgICAgICAgIGlmIGRlZXA6CisgICAgICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5jaGlsZE5vZGVzOgorICAgICAgICAgICAgICAgIGMgPSBfY2xvbmVfbm9kZShjaGlsZCwgZGVlcCwgbmV3T3duZXJEb2N1bWVudCkKKyAgICAgICAgICAgICAgICBjbG9uZS5hcHBlbmRDaGlsZChjKQorCisgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFOgorICAgICAgICBjbG9uZSA9IG5ld093bmVyRG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobm9kZS5kYXRhKQorICAgIGVsaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERToKKyAgICAgICAgY2xvbmUgPSBuZXdPd25lckRvY3VtZW50LmNyZWF0ZUNEQVRBU2VjdGlvbihub2RlLmRhdGEpCisgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgorICAgICAgICBjbG9uZSA9IG5ld093bmVyRG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKG5vZGUudGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YSkKKyAgICBlbGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5DT01NRU5UX05PREU6CisgICAgICAgIGNsb25lID0gbmV3T3duZXJEb2N1bWVudC5jcmVhdGVDb21tZW50KG5vZGUuZGF0YSkKKyAgICBlbGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERToKKyAgICAgICAgY2xvbmUgPSBuZXdPd25lckRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZU5TKG5vZGUubmFtZXNwYWNlVVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlTmFtZSkKKyAgICAgICAgY2xvbmUuc3BlY2lmaWVkID0gVHJ1ZQorICAgICAgICBjbG9uZS52YWx1ZSA9IG5vZGUudmFsdWUKKyAgICBlbGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6CisgICAgICAgIGFzc2VydCBub2RlLm93bmVyRG9jdW1lbnQgaXMgbm90IG5ld093bmVyRG9jdW1lbnQKKyAgICAgICAgb3BlcmF0aW9uID0geG1sLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9JTVBPUlRFRAorICAgICAgICBjbG9uZSA9IG5ld093bmVyRG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnRUeXBlKAorICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnB1YmxpY0lkLCBub2RlLnN5c3RlbUlkKQorICAgICAgICBjbG9uZS5vd25lckRvY3VtZW50ID0gbmV3T3duZXJEb2N1bWVudAorICAgICAgICBpZiBkZWVwOgorICAgICAgICAgICAgY2xvbmUuZW50aXRpZXMuX3NlcSA9IFtdCisgICAgICAgICAgICBjbG9uZS5ub3RhdGlvbnMuX3NlcSA9IFtdCisgICAgICAgICAgICBmb3IgbiBpbiBub2RlLm5vdGF0aW9ucy5fc2VxOgorICAgICAgICAgICAgICAgIG5vdGF0aW9uID0gTm90YXRpb24obi5ub2RlTmFtZSwgbi5wdWJsaWNJZCwgbi5zeXN0ZW1JZCkKKyAgICAgICAgICAgICAgICBub3RhdGlvbi5vd25lckRvY3VtZW50ID0gbmV3T3duZXJEb2N1bWVudAorICAgICAgICAgICAgICAgIGNsb25lLm5vdGF0aW9ucy5fc2VxLmFwcGVuZChub3RhdGlvbikKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG4sICdfY2FsbF91c2VyX2RhdGFfaGFuZGxlcicpOgorICAgICAgICAgICAgICAgICAgICBuLl9jYWxsX3VzZXJfZGF0YV9oYW5kbGVyKG9wZXJhdGlvbiwgbiwgbm90YXRpb24pCisgICAgICAgICAgICBmb3IgZSBpbiBub2RlLmVudGl0aWVzLl9zZXE6CisgICAgICAgICAgICAgICAgZW50aXR5ID0gRW50aXR5KGUubm9kZU5hbWUsIGUucHVibGljSWQsIGUuc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUubm90YXRpb25OYW1lKQorICAgICAgICAgICAgICAgIGVudGl0eS5hY3R1YWxFbmNvZGluZyA9IGUuYWN0dWFsRW5jb2RpbmcKKyAgICAgICAgICAgICAgICBlbnRpdHkuZW5jb2RpbmcgPSBlLmVuY29kaW5nCisgICAgICAgICAgICAgICAgZW50aXR5LnZlcnNpb24gPSBlLnZlcnNpb24KKyAgICAgICAgICAgICAgICBlbnRpdHkub3duZXJEb2N1bWVudCA9IG5ld093bmVyRG9jdW1lbnQKKyAgICAgICAgICAgICAgICBjbG9uZS5lbnRpdGllcy5fc2VxLmFwcGVuZChlbnRpdHkpCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihlLCAnX2NhbGxfdXNlcl9kYXRhX2hhbmRsZXInKToKKyAgICAgICAgICAgICAgICAgICAgZS5fY2FsbF91c2VyX2RhdGFfaGFuZGxlcihvcGVyYXRpb24sIG4sIGVudGl0eSkKKyAgICBlbHNlOgorICAgICAgICAjIE5vdGUgdGhlIGNsb25pbmcgb2YgRG9jdW1lbnQgYW5kIERvY3VtZW50VHlwZSBub2RlcyBpcworICAgICAgICAjIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLiAgbWluaWRvbSBoYW5kbGVzIHRob3NlIGNhc2VzCisgICAgICAgICMgZGlyZWN0bHkgaW4gdGhlIGNsb25lTm9kZSgpIG1ldGhvZHMuCisgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKCJDYW5ub3QgY2xvbmUgbm9kZSAlcyIgJSByZXByKG5vZGUpKQorCisgICAgIyBDaGVjayBmb3IgX2NhbGxfdXNlcl9kYXRhX2hhbmRsZXIoKSBzaW5jZSB0aGlzIGNvdWxkIGNvbmNlaXZhYmx5CisgICAgIyB1c2VkIHdpdGggb3RoZXIgRE9NIGltcGxlbWVudGF0aW9ucyAob25lIG9mIHRoZSBGb3VyVGhvdWdodAorICAgICMgRE9NcywgcGVyaGFwcz8pLgorICAgIGlmIGhhc2F0dHIobm9kZSwgJ19jYWxsX3VzZXJfZGF0YV9oYW5kbGVyJyk6CisgICAgICAgIG5vZGUuX2NhbGxfdXNlcl9kYXRhX2hhbmRsZXIob3BlcmF0aW9uLCBub2RlLCBjbG9uZSkKKyAgICByZXR1cm4gY2xvbmUKKworCitkZWYgX25zc3BsaXQocXVhbGlmaWVkTmFtZSk6CisgICAgZmllbGRzID0gcXVhbGlmaWVkTmFtZS5zcGxpdCgnOicsIDEpCisgICAgaWYgbGVuKGZpZWxkcykgPT0gMjoKKyAgICAgICAgcmV0dXJuIGZpZWxkcworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAoTm9uZSwgZmllbGRzWzBdKQorCisKK2RlZiBfZ2V0X1N0cmluZ0lPKCk6CisgICAgIyB3ZSBjYW4ndCB1c2UgY1N0cmluZ0lPIHNpbmNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBVbmljb2RlIHN0cmluZ3MKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgIHJldHVybiBTdHJpbmdJTygpCisKK2RlZiBfZG9fcHVsbGRvbV9wYXJzZShmdW5jLCBhcmdzLCBrd2FyZ3MpOgorICAgIGV2ZW50cyA9IGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQorICAgIHRva3R5cGUsIHJvb3ROb2RlID0gZXZlbnRzLmdldEV2ZW50KCkKKyAgICBldmVudHMuZXhwYW5kTm9kZShyb290Tm9kZSkKKyAgICBldmVudHMuY2xlYXIoKQorICAgIHJldHVybiByb290Tm9kZQorCitkZWYgcGFyc2UoZmlsZSwgcGFyc2VyPU5vbmUsIGJ1ZnNpemU9Tm9uZSk6CisgICAgIiIiUGFyc2UgYSBmaWxlIGludG8gYSBET00gYnkgZmlsZW5hbWUgb3IgZmlsZSBvYmplY3QuIiIiCisgICAgaWYgcGFyc2VyIGlzIE5vbmUgYW5kIG5vdCBidWZzaXplOgorICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IGV4cGF0YnVpbGRlcgorICAgICAgICByZXR1cm4gZXhwYXRidWlsZGVyLnBhcnNlKGZpbGUpCisgICAgZWxzZToKKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBwdWxsZG9tCisgICAgICAgIHJldHVybiBfZG9fcHVsbGRvbV9wYXJzZShwdWxsZG9tLnBhcnNlLCAoZmlsZSwpLAorICAgICAgICAgICAgeydwYXJzZXInOiBwYXJzZXIsICdidWZzaXplJzogYnVmc2l6ZX0pCisKK2RlZiBwYXJzZVN0cmluZyhzdHJpbmcsIHBhcnNlcj1Ob25lKToKKyAgICAiIiJQYXJzZSBhIGZpbGUgaW50byBhIERPTSBmcm9tIGEgc3RyaW5nLiIiIgorICAgIGlmIHBhcnNlciBpcyBOb25lOgorICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IGV4cGF0YnVpbGRlcgorICAgICAgICByZXR1cm4gZXhwYXRidWlsZGVyLnBhcnNlU3RyaW5nKHN0cmluZykKKyAgICBlbHNlOgorICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IHB1bGxkb20KKyAgICAgICAgcmV0dXJuIF9kb19wdWxsZG9tX3BhcnNlKHB1bGxkb20ucGFyc2VTdHJpbmcsIChzdHJpbmcsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsncGFyc2VyJzogcGFyc2VyfSkKKworZGVmIGdldERPTUltcGxlbWVudGF0aW9uKGZlYXR1cmVzPU5vbmUpOgorICAgIGlmIGZlYXR1cmVzOgorICAgICAgICBpZiBpc2luc3RhbmNlKGZlYXR1cmVzLCBTdHJpbmdUeXBlcyk6CisgICAgICAgICAgICBmZWF0dXJlcyA9IGRvbXJlZy5fcGFyc2VfZmVhdHVyZV9zdHJpbmcoZmVhdHVyZXMpCisgICAgICAgIGZvciBmLCB2IGluIGZlYXR1cmVzOgorICAgICAgICAgICAgaWYgbm90IERvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoZiwgdik6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gRG9jdW1lbnQuaW1wbGVtZW50YXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pZG9tLnB5YyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pZG9tLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDc2OWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmlkb20ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pZG9tLnB5byBiL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pZG9tLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGUyZDFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmlkb20ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9wdWxsZG9tLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL3B1bGxkb20ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmNDliNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9wdWxsZG9tLnB5CkBAIC0wLDAgKzEsMzUxIEBACitpbXBvcnQgeG1sLnNheAoraW1wb3J0IHhtbC5zYXguaGFuZGxlcgoraW1wb3J0IHR5cGVzCisKK3RyeToKKyAgICBfU3RyaW5nVHlwZXMgPSBbdHlwZXMuU3RyaW5nVHlwZSwgdHlwZXMuVW5pY29kZVR5cGVdCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgX1N0cmluZ1R5cGVzID0gW3R5cGVzLlN0cmluZ1R5cGVdCisKK1NUQVJUX0VMRU1FTlQgPSAiU1RBUlRfRUxFTUVOVCIKK0VORF9FTEVNRU5UID0gIkVORF9FTEVNRU5UIgorQ09NTUVOVCA9ICJDT01NRU5UIgorU1RBUlRfRE9DVU1FTlQgPSAiU1RBUlRfRE9DVU1FTlQiCitFTkRfRE9DVU1FTlQgPSAiRU5EX0RPQ1VNRU5UIgorUFJPQ0VTU0lOR19JTlNUUlVDVElPTiA9ICJQUk9DRVNTSU5HX0lOU1RSVUNUSU9OIgorSUdOT1JBQkxFX1dISVRFU1BBQ0UgPSAiSUdOT1JBQkxFX1dISVRFU1BBQ0UiCitDSEFSQUNURVJTID0gIkNIQVJBQ1RFUlMiCisKK2NsYXNzIFB1bGxET00oeG1sLnNheC5Db250ZW50SGFuZGxlcik6CisgICAgX2xvY2F0b3IgPSBOb25lCisgICAgZG9jdW1lbnQgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZG9jdW1lbnRGYWN0b3J5PU5vbmUpOgorICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IFhNTF9OQU1FU1BBQ0UKKyAgICAgICAgc2VsZi5kb2N1bWVudEZhY3RvcnkgPSBkb2N1bWVudEZhY3RvcnkKKyAgICAgICAgc2VsZi5maXJzdEV2ZW50ID0gW05vbmUsIE5vbmVdCisgICAgICAgIHNlbGYubGFzdEV2ZW50ID0gc2VsZi5maXJzdEV2ZW50CisgICAgICAgIHNlbGYuZWxlbWVudFN0YWNrID0gW10KKyAgICAgICAgc2VsZi5wdXNoID0gc2VsZi5lbGVtZW50U3RhY2suYXBwZW5kCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucG9wID0gc2VsZi5lbGVtZW50U3RhY2sucG9wCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICMgdXNlIGNsYXNzJyBwb3AgaW5zdGVhZAorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLl9uc19jb250ZXh0cyA9IFt7WE1MX05BTUVTUEFDRToneG1sJ31dICMgY29udGFpbnMgdXJpIC0+IHByZWZpeCBkaWN0cworICAgICAgICBzZWxmLl9jdXJyZW50X2NvbnRleHQgPSBzZWxmLl9uc19jb250ZXh0c1stMV0KKyAgICAgICAgc2VsZi5wZW5kaW5nX2V2ZW50cyA9IFtdCisKKyAgICBkZWYgcG9wKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmVsZW1lbnRTdGFja1stMV0KKyAgICAgICAgZGVsIHNlbGYuZWxlbWVudFN0YWNrWy0xXQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgc2V0RG9jdW1lbnRMb2NhdG9yKHNlbGYsIGxvY2F0b3IpOgorICAgICAgICBzZWxmLl9sb2NhdG9yID0gbG9jYXRvcgorCisgICAgZGVmIHN0YXJ0UHJlZml4TWFwcGluZyhzZWxmLCBwcmVmaXgsIHVyaSk6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdfeG1sbnNfYXR0cnMnKToKKyAgICAgICAgICAgIHNlbGYuX3htbG5zX2F0dHJzID0gW10KKyAgICAgICAgc2VsZi5feG1sbnNfYXR0cnMuYXBwZW5kKChwcmVmaXggb3IgJ3htbG5zJywgdXJpKSkKKyAgICAgICAgc2VsZi5fbnNfY29udGV4dHMuYXBwZW5kKHNlbGYuX2N1cnJlbnRfY29udGV4dC5jb3B5KCkpCisgICAgICAgIHNlbGYuX2N1cnJlbnRfY29udGV4dFt1cmldID0gcHJlZml4IG9yIE5vbmUKKworICAgIGRlZiBlbmRQcmVmaXhNYXBwaW5nKHNlbGYsIHByZWZpeCk6CisgICAgICAgIHNlbGYuX2N1cnJlbnRfY29udGV4dCA9IHNlbGYuX25zX2NvbnRleHRzLnBvcCgpCisKKyAgICBkZWYgc3RhcnRFbGVtZW50TlMoc2VsZiwgbmFtZSwgdGFnTmFtZSAsIGF0dHJzKToKKyAgICAgICAgIyBSZXRyaWV2ZSB4bWwgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZXMuCisgICAgICAgIHhtbG5zX3VyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLycKKyAgICAgICAgeG1sbnNfYXR0cnMgPSBnZXRhdHRyKHNlbGYsICdfeG1sbnNfYXR0cnMnLCBOb25lKQorICAgICAgICBpZiB4bWxuc19hdHRycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBhbmFtZSwgdmFsdWUgaW4geG1sbnNfYXR0cnM6CisgICAgICAgICAgICAgICAgYXR0cnMuX2F0dHJzWyh4bWxuc191cmksIGFuYW1lKV0gPSB2YWx1ZQorICAgICAgICAgICAgc2VsZi5feG1sbnNfYXR0cnMgPSBbXQorICAgICAgICB1cmksIGxvY2FsbmFtZSA9IG5hbWUKKyAgICAgICAgaWYgdXJpOgorICAgICAgICAgICAgIyBXaGVuIHVzaW5nIG5hbWVzcGFjZXMsIHRoZSByZWFkZXIgbWF5IG9yIG1heSBub3QKKyAgICAgICAgICAgICMgcHJvdmlkZSB1cyB3aXRoIHRoZSBvcmlnaW5hbCBuYW1lLiBJZiBub3QsIGNyZWF0ZQorICAgICAgICAgICAgIyAqYSogdmFsaWQgdGFnTmFtZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRleHQuCisgICAgICAgICAgICBpZiB0YWdOYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcHJlZml4ID0gc2VsZi5fY3VycmVudF9jb250ZXh0W3VyaV0KKyAgICAgICAgICAgICAgICBpZiBwcmVmaXg6CisgICAgICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBwcmVmaXggKyAiOiIgKyBsb2NhbG5hbWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0YWdOYW1lID0gbG9jYWxuYW1lCisgICAgICAgICAgICBpZiBzZWxmLmRvY3VtZW50OgorICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIHRhZ05hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLmJ1aWxkRG9jdW1lbnQodXJpLCB0YWdOYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBXaGVuIHRoZSB0YWduYW1lIGlzIG5vdCBwcmVmaXhlZCwgaXQganVzdCBhcHBlYXJzIGFzCisgICAgICAgICAgICAjIGxvY2FsbmFtZQorICAgICAgICAgICAgaWYgc2VsZi5kb2N1bWVudDoKKyAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KGxvY2FsbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYuYnVpbGREb2N1bWVudChOb25lLCBsb2NhbG5hbWUpCisKKyAgICAgICAgZm9yIGFuYW1lLHZhbHVlIGluIGF0dHJzLml0ZW1zKCk6CisgICAgICAgICAgICBhX3VyaSwgYV9sb2NhbG5hbWUgPSBhbmFtZQorICAgICAgICAgICAgaWYgYV91cmkgPT0geG1sbnNfdXJpOgorICAgICAgICAgICAgICAgIGlmIGFfbG9jYWxuYW1lID09ICd4bWxucyc6CisgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gYV9sb2NhbG5hbWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBxbmFtZSA9ICd4bWxuczonICsgYV9sb2NhbG5hbWUKKyAgICAgICAgICAgICAgICBhdHRyID0gc2VsZi5kb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGVOUyhhX3VyaSwgcW5hbWUpCisgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOb2RlTlMoYXR0cikKKyAgICAgICAgICAgIGVsaWYgYV91cmk6CisgICAgICAgICAgICAgICAgcHJlZml4ID0gc2VsZi5fY3VycmVudF9jb250ZXh0W2FfdXJpXQorICAgICAgICAgICAgICAgIGlmIHByZWZpeDoKKyAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSBwcmVmaXggKyAiOiIgKyBhX2xvY2FsbmFtZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gYV9sb2NhbG5hbWUKKyAgICAgICAgICAgICAgICBhdHRyID0gc2VsZi5kb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGVOUyhhX3VyaSwgcW5hbWUpCisgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGVOb2RlTlMoYXR0cikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXR0ciA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGFfbG9jYWxuYW1lKQorICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlTm9kZShhdHRyKQorICAgICAgICAgICAgYXR0ci52YWx1ZSA9IHZhbHVlCisKKyAgICAgICAgc2VsZi5sYXN0RXZlbnRbMV0gPSBbKFNUQVJUX0VMRU1FTlQsIG5vZGUpLCBOb25lXQorICAgICAgICBzZWxmLmxhc3RFdmVudCA9IHNlbGYubGFzdEV2ZW50WzFdCisgICAgICAgIHNlbGYucHVzaChub2RlKQorCisgICAgZGVmIGVuZEVsZW1lbnROUyhzZWxmLCBuYW1lLCB0YWdOYW1lKToKKyAgICAgICAgc2VsZi5sYXN0RXZlbnRbMV0gPSBbKEVORF9FTEVNRU5ULCBzZWxmLnBvcCgpKSwgTm9uZV0KKyAgICAgICAgc2VsZi5sYXN0RXZlbnQgPSBzZWxmLmxhc3RFdmVudFsxXQorCisgICAgZGVmIHN0YXJ0RWxlbWVudChzZWxmLCBuYW1lLCBhdHRycyk6CisgICAgICAgIGlmIHNlbGYuZG9jdW1lbnQ6CisgICAgICAgICAgICBub2RlID0gc2VsZi5kb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBub2RlID0gc2VsZi5idWlsZERvY3VtZW50KE5vbmUsIG5hbWUpCisKKyAgICAgICAgZm9yIGFuYW1lLHZhbHVlIGluIGF0dHJzLml0ZW1zKCk6CisgICAgICAgICAgICBhdHRyID0gc2VsZi5kb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoYW5hbWUpCisgICAgICAgICAgICBhdHRyLnZhbHVlID0gdmFsdWUKKyAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlTm9kZShhdHRyKQorCisgICAgICAgIHNlbGYubGFzdEV2ZW50WzFdID0gWyhTVEFSVF9FTEVNRU5ULCBub2RlKSwgTm9uZV0KKyAgICAgICAgc2VsZi5sYXN0RXZlbnQgPSBzZWxmLmxhc3RFdmVudFsxXQorICAgICAgICBzZWxmLnB1c2gobm9kZSkKKworICAgIGRlZiBlbmRFbGVtZW50KHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLmxhc3RFdmVudFsxXSA9IFsoRU5EX0VMRU1FTlQsIHNlbGYucG9wKCkpLCBOb25lXQorICAgICAgICBzZWxmLmxhc3RFdmVudCA9IHNlbGYubGFzdEV2ZW50WzFdCisKKyAgICBkZWYgY29tbWVudChzZWxmLCBzKToKKyAgICAgICAgaWYgc2VsZi5kb2N1bWVudDoKKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUNvbW1lbnQocykKKyAgICAgICAgICAgIHNlbGYubGFzdEV2ZW50WzFdID0gWyhDT01NRU5ULCBub2RlKSwgTm9uZV0KKyAgICAgICAgICAgIHNlbGYubGFzdEV2ZW50ID0gc2VsZi5sYXN0RXZlbnRbMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV2ZW50ID0gWyhDT01NRU5ULCBzKSwgTm9uZV0KKyAgICAgICAgICAgIHNlbGYucGVuZGluZ19ldmVudHMuYXBwZW5kKGV2ZW50KQorCisgICAgZGVmIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihzZWxmLCB0YXJnZXQsIGRhdGEpOgorICAgICAgICBpZiBzZWxmLmRvY3VtZW50OgorICAgICAgICAgICAgbm9kZSA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSkKKyAgICAgICAgICAgIHNlbGYubGFzdEV2ZW50WzFdID0gWyhQUk9DRVNTSU5HX0lOU1RSVUNUSU9OLCBub2RlKSwgTm9uZV0KKyAgICAgICAgICAgIHNlbGYubGFzdEV2ZW50ID0gc2VsZi5sYXN0RXZlbnRbMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV2ZW50ID0gWyhQUk9DRVNTSU5HX0lOU1RSVUNUSU9OLCB0YXJnZXQsIGRhdGEpLCBOb25lXQorICAgICAgICAgICAgc2VsZi5wZW5kaW5nX2V2ZW50cy5hcHBlbmQoZXZlbnQpCisKKyAgICBkZWYgaWdub3JhYmxlV2hpdGVzcGFjZShzZWxmLCBjaGFycyk6CisgICAgICAgIG5vZGUgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoYXJzKQorICAgICAgICBzZWxmLmxhc3RFdmVudFsxXSA9IFsoSUdOT1JBQkxFX1dISVRFU1BBQ0UsIG5vZGUpLCBOb25lXQorICAgICAgICBzZWxmLmxhc3RFdmVudCA9IHNlbGYubGFzdEV2ZW50WzFdCisKKyAgICBkZWYgY2hhcmFjdGVycyhzZWxmLCBjaGFycyk6CisgICAgICAgIG5vZGUgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoYXJzKQorICAgICAgICBzZWxmLmxhc3RFdmVudFsxXSA9IFsoQ0hBUkFDVEVSUywgbm9kZSksIE5vbmVdCisgICAgICAgIHNlbGYubGFzdEV2ZW50ID0gc2VsZi5sYXN0RXZlbnRbMV0KKworICAgIGRlZiBzdGFydERvY3VtZW50KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRvY3VtZW50RmFjdG9yeSBpcyBOb25lOgorICAgICAgICAgICAgaW1wb3J0IHhtbC5kb20ubWluaWRvbQorICAgICAgICAgICAgc2VsZi5kb2N1bWVudEZhY3RvcnkgPSB4bWwuZG9tLm1pbmlkb20uRG9jdW1lbnQuaW1wbGVtZW50YXRpb24KKworICAgIGRlZiBidWlsZERvY3VtZW50KHNlbGYsIHVyaSwgdGFnbmFtZSk6CisgICAgICAgICMgQ2FuJ3QgZG8gdGhhdCBpbiBzdGFydERvY3VtZW50LCBzaW5jZSB3ZSBuZWVkIHRoZSB0YWduYW1lCisgICAgICAgICMgWFhYOiBvYnRhaW4gRG9jdW1lbnRUeXBlCisgICAgICAgIG5vZGUgPSBzZWxmLmRvY3VtZW50RmFjdG9yeS5jcmVhdGVEb2N1bWVudCh1cmksIHRhZ25hbWUsIE5vbmUpCisgICAgICAgIHNlbGYuZG9jdW1lbnQgPSBub2RlCisgICAgICAgIHNlbGYubGFzdEV2ZW50WzFdID0gWyhTVEFSVF9ET0NVTUVOVCwgbm9kZSksIE5vbmVdCisgICAgICAgIHNlbGYubGFzdEV2ZW50ID0gc2VsZi5sYXN0RXZlbnRbMV0KKyAgICAgICAgc2VsZi5wdXNoKG5vZGUpCisgICAgICAgICMgUHV0IGV2ZXJ5dGhpbmcgd2UgaGF2ZSBzZWVuIHNvIGZhciBpbnRvIHRoZSBkb2N1bWVudAorICAgICAgICBmb3IgZSBpbiBzZWxmLnBlbmRpbmdfZXZlbnRzOgorICAgICAgICAgICAgaWYgZVswXVswXSA9PSBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OOgorICAgICAgICAgICAgICAgIF8sdGFyZ2V0LGRhdGEgPSBlWzBdCisgICAgICAgICAgICAgICAgbiA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSkKKyAgICAgICAgICAgICAgICBlWzBdID0gKFBST0NFU1NJTkdfSU5TVFJVQ1RJT04sIG4pCisgICAgICAgICAgICBlbGlmIGVbMF1bMF0gPT0gQ09NTUVOVDoKKyAgICAgICAgICAgICAgICBuID0gc2VsZi5kb2N1bWVudC5jcmVhdGVDb21tZW50KGVbMF1bMV0pCisgICAgICAgICAgICAgICAgZVswXSA9IChDT01NRU5ULCBuKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiVW5rbm93biBwZW5kaW5nIGV2ZW50ICIsZVswXVswXSkKKyAgICAgICAgICAgIHNlbGYubGFzdEV2ZW50WzFdID0gZQorICAgICAgICAgICAgc2VsZi5sYXN0RXZlbnQgPSBlCisgICAgICAgIHNlbGYucGVuZGluZ19ldmVudHMgPSBOb25lCisgICAgICAgIHJldHVybiBub2RlLmZpcnN0Q2hpbGQKKworICAgIGRlZiBlbmREb2N1bWVudChzZWxmKToKKyAgICAgICAgc2VsZi5sYXN0RXZlbnRbMV0gPSBbKEVORF9ET0NVTUVOVCwgc2VsZi5kb2N1bWVudCksIE5vbmVdCisgICAgICAgIHNlbGYucG9wKCkKKworICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgImNsZWFyKCk6IEV4cGxpY2l0bHkgcmVsZWFzZSBwYXJzaW5nIHN0cnVjdHVyZXMiCisgICAgICAgIHNlbGYuZG9jdW1lbnQgPSBOb25lCisKK2NsYXNzIEVycm9ySGFuZGxlcjoKKyAgICBkZWYgd2FybmluZyhzZWxmLCBleGNlcHRpb24pOgorICAgICAgICBwcmludCBleGNlcHRpb24KKyAgICBkZWYgZXJyb3Ioc2VsZiwgZXhjZXB0aW9uKToKKyAgICAgICAgcmFpc2UgZXhjZXB0aW9uCisgICAgZGVmIGZhdGFsRXJyb3Ioc2VsZiwgZXhjZXB0aW9uKToKKyAgICAgICAgcmFpc2UgZXhjZXB0aW9uCisKK2NsYXNzIERPTUV2ZW50U3RyZWFtOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIHBhcnNlciwgYnVmc2l6ZSk6CisgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCisgICAgICAgIHNlbGYucGFyc2VyID0gcGFyc2VyCisgICAgICAgIHNlbGYuYnVmc2l6ZSA9IGJ1ZnNpemUKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZi5wYXJzZXIsICdmZWVkJyk6CisgICAgICAgICAgICBzZWxmLmdldEV2ZW50ID0gc2VsZi5fc2x1cnAKKyAgICAgICAgc2VsZi5yZXNldCgpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYucHVsbGRvbSA9IFB1bGxET00oKQorICAgICAgICAjIFRoaXMgY29udGVudCBoYW5kbGVyIHJlbGllcyBvbiBuYW1lc3BhY2Ugc3VwcG9ydAorICAgICAgICBzZWxmLnBhcnNlci5zZXRGZWF0dXJlKHhtbC5zYXguaGFuZGxlci5mZWF0dXJlX25hbWVzcGFjZXMsIDEpCisgICAgICAgIHNlbGYucGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHNlbGYucHVsbGRvbSkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBwb3MpOgorICAgICAgICByYyA9IHNlbGYuZ2V0RXZlbnQoKQorICAgICAgICBpZiByYzoKKyAgICAgICAgICAgIHJldHVybiByYworICAgICAgICByYWlzZSBJbmRleEVycm9yCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgcmMgPSBzZWxmLmdldEV2ZW50KCkKKyAgICAgICAgaWYgcmM6CisgICAgICAgICAgICByZXR1cm4gcmMKKyAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGV4cGFuZE5vZGUoc2VsZiwgbm9kZSk6CisgICAgICAgIGV2ZW50ID0gc2VsZi5nZXRFdmVudCgpCisgICAgICAgIHBhcmVudHMgPSBbbm9kZV0KKyAgICAgICAgd2hpbGUgZXZlbnQ6CisgICAgICAgICAgICB0b2tlbiwgY3VyX25vZGUgPSBldmVudAorICAgICAgICAgICAgaWYgY3VyX25vZGUgaXMgbm9kZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHRva2VuICE9IEVORF9FTEVNRU5UOgorICAgICAgICAgICAgICAgIHBhcmVudHNbLTFdLmFwcGVuZENoaWxkKGN1cl9ub2RlKQorICAgICAgICAgICAgaWYgdG9rZW4gPT0gU1RBUlRfRUxFTUVOVDoKKyAgICAgICAgICAgICAgICBwYXJlbnRzLmFwcGVuZChjdXJfbm9kZSkKKyAgICAgICAgICAgIGVsaWYgdG9rZW4gPT0gRU5EX0VMRU1FTlQ6CisgICAgICAgICAgICAgICAgZGVsIHBhcmVudHNbLTFdCisgICAgICAgICAgICBldmVudCA9IHNlbGYuZ2V0RXZlbnQoKQorCisgICAgZGVmIGdldEV2ZW50KHNlbGYpOgorICAgICAgICAjIHVzZSBJbmNyZW1lbnRhbFBhcnNlciBpbnRlcmZhY2UsIHNvIHdlIGdldCB0aGUgZGVzaXJlZAorICAgICAgICAjIHB1bGwgZWZmZWN0CisgICAgICAgIGlmIG5vdCBzZWxmLnB1bGxkb20uZmlyc3RFdmVudFsxXToKKyAgICAgICAgICAgIHNlbGYucHVsbGRvbS5sYXN0RXZlbnQgPSBzZWxmLnB1bGxkb20uZmlyc3RFdmVudAorICAgICAgICB3aGlsZSBub3Qgc2VsZi5wdWxsZG9tLmZpcnN0RXZlbnRbMV06CisgICAgICAgICAgICBidWYgPSBzZWxmLnN0cmVhbS5yZWFkKHNlbGYuYnVmc2l6ZSkKKyAgICAgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJzZXIuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBzZWxmLnBhcnNlci5mZWVkKGJ1ZikKKyAgICAgICAgcmMgPSBzZWxmLnB1bGxkb20uZmlyc3RFdmVudFsxXVswXQorICAgICAgICBzZWxmLnB1bGxkb20uZmlyc3RFdmVudFsxXSA9IHNlbGYucHVsbGRvbS5maXJzdEV2ZW50WzFdWzFdCisgICAgICAgIHJldHVybiByYworCisgICAgZGVmIF9zbHVycChzZWxmKToKKyAgICAgICAgIiIiIEZhbGxiYWNrIHJlcGxhY2VtZW50IGZvciBnZXRFdmVudCgpIHVzaW5nIHRoZQorICAgICAgICAgICAgc3RhbmRhcmQgU0FYMiBpbnRlcmZhY2UsIHdoaWNoIG1lYW5zIHdlIHNsdXJwIHRoZQorICAgICAgICAgICAgU0FYIGV2ZW50cyBpbnRvIG1lbW9yeSAobm8gcGVyZm9ybWFuY2UgZ2FpbiwgYnV0CisgICAgICAgICAgICB3ZSBhcmUgY29tcGF0aWJsZSB0byBhbGwgU0FYIHBhcnNlcnMpLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5wYXJzZXIucGFyc2Uoc2VsZi5zdHJlYW0pCisgICAgICAgIHNlbGYuZ2V0RXZlbnQgPSBzZWxmLl9lbWl0CisgICAgICAgIHJldHVybiBzZWxmLl9lbWl0KCkKKworICAgIGRlZiBfZW1pdChzZWxmKToKKyAgICAgICAgIiIiIEZhbGxiYWNrIHJlcGxhY2VtZW50IGZvciBnZXRFdmVudCgpIHRoYXQgZW1pdHMKKyAgICAgICAgICAgIHRoZSBldmVudHMgdGhhdCBfc2x1cnAoKSByZWFkIHByZXZpb3VzbHkuCisgICAgICAgICIiIgorICAgICAgICByYyA9IHNlbGYucHVsbGRvbS5maXJzdEV2ZW50WzFdWzBdCisgICAgICAgIHNlbGYucHVsbGRvbS5maXJzdEV2ZW50WzFdID0gc2VsZi5wdWxsZG9tLmZpcnN0RXZlbnRbMV1bMV0KKyAgICAgICAgcmV0dXJuIHJjCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgICIiImNsZWFyKCk6IEV4cGxpY2l0bHkgcmVsZWFzZSBwYXJzaW5nIG9iamVjdHMiIiIKKyAgICAgICAgc2VsZi5wdWxsZG9tLmNsZWFyKCkKKyAgICAgICAgZGVsIHNlbGYucHVsbGRvbQorICAgICAgICBzZWxmLnBhcnNlciA9IE5vbmUKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBOb25lCisKK2NsYXNzIFNBWDJET00oUHVsbERPTSk6CisKKyAgICBkZWYgc3RhcnRFbGVtZW50TlMoc2VsZiwgbmFtZSwgdGFnTmFtZSAsIGF0dHJzKToKKyAgICAgICAgUHVsbERPTS5zdGFydEVsZW1lbnROUyhzZWxmLCBuYW1lLCB0YWdOYW1lLCBhdHRycykKKyAgICAgICAgY3VyTm9kZSA9IHNlbGYuZWxlbWVudFN0YWNrWy0xXQorICAgICAgICBwYXJlbnROb2RlID0gc2VsZi5lbGVtZW50U3RhY2tbLTJdCisgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY3VyTm9kZSkKKworICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpOgorICAgICAgICBQdWxsRE9NLnN0YXJ0RWxlbWVudChzZWxmLCBuYW1lLCBhdHRycykKKyAgICAgICAgY3VyTm9kZSA9IHNlbGYuZWxlbWVudFN0YWNrWy0xXQorICAgICAgICBwYXJlbnROb2RlID0gc2VsZi5lbGVtZW50U3RhY2tbLTJdCisgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoY3VyTm9kZSkKKworICAgIGRlZiBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oc2VsZiwgdGFyZ2V0LCBkYXRhKToKKyAgICAgICAgUHVsbERPTS5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oc2VsZiwgdGFyZ2V0LCBkYXRhKQorICAgICAgICBub2RlID0gc2VsZi5sYXN0RXZlbnRbMF1bMV0KKyAgICAgICAgcGFyZW50Tm9kZSA9IHNlbGYuZWxlbWVudFN0YWNrWy0xXQorICAgICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5vZGUpCisKKyAgICBkZWYgaWdub3JhYmxlV2hpdGVzcGFjZShzZWxmLCBjaGFycyk6CisgICAgICAgIFB1bGxET00uaWdub3JhYmxlV2hpdGVzcGFjZShzZWxmLCBjaGFycykKKyAgICAgICAgbm9kZSA9IHNlbGYubGFzdEV2ZW50WzBdWzFdCisgICAgICAgIHBhcmVudE5vZGUgPSBzZWxmLmVsZW1lbnRTdGFja1stMV0KKyAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChub2RlKQorCisgICAgZGVmIGNoYXJhY3RlcnMoc2VsZiwgY2hhcnMpOgorICAgICAgICBQdWxsRE9NLmNoYXJhY3RlcnMoc2VsZiwgY2hhcnMpCisgICAgICAgIG5vZGUgPSBzZWxmLmxhc3RFdmVudFswXVsxXQorICAgICAgICBwYXJlbnROb2RlID0gc2VsZi5lbGVtZW50U3RhY2tbLTFdCisgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobm9kZSkKKworCitkZWZhdWx0X2J1ZnNpemUgPSAoMiAqKiAxNCkgLSAyMAorCitkZWYgcGFyc2Uoc3RyZWFtX29yX3N0cmluZywgcGFyc2VyPU5vbmUsIGJ1ZnNpemU9Tm9uZSk6CisgICAgaWYgYnVmc2l6ZSBpcyBOb25lOgorICAgICAgICBidWZzaXplID0gZGVmYXVsdF9idWZzaXplCisgICAgaWYgdHlwZShzdHJlYW1fb3Jfc3RyaW5nKSBpbiBfU3RyaW5nVHlwZXM6CisgICAgICAgIHN0cmVhbSA9IG9wZW4oc3RyZWFtX29yX3N0cmluZykKKyAgICBlbHNlOgorICAgICAgICBzdHJlYW0gPSBzdHJlYW1fb3Jfc3RyaW5nCisgICAgaWYgbm90IHBhcnNlcjoKKyAgICAgICAgcGFyc2VyID0geG1sLnNheC5tYWtlX3BhcnNlcigpCisgICAgcmV0dXJuIERPTUV2ZW50U3RyZWFtKHN0cmVhbSwgcGFyc2VyLCBidWZzaXplKQorCitkZWYgcGFyc2VTdHJpbmcoc3RyaW5nLCBwYXJzZXI9Tm9uZSk6CisgICAgdHJ5OgorICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKKyAgICBidWZzaXplID0gbGVuKHN0cmluZykKKyAgICBidWYgPSBTdHJpbmdJTyhzdHJpbmcpCisgICAgaWYgbm90IHBhcnNlcjoKKyAgICAgICAgcGFyc2VyID0geG1sLnNheC5tYWtlX3BhcnNlcigpCisgICAgcmV0dXJuIERPTUV2ZW50U3RyZWFtKGJ1ZiwgcGFyc2VyLCBidWZzaXplKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL3B1bGxkb20ucHljIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL3B1bGxkb20ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjkzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vcHVsbGRvbS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL3B1bGxkb20ucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL3B1bGxkb20ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjkzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vcHVsbGRvbS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL3htbGJ1aWxkZXIucHkgYi9saWIvcHl0aG9uMi43L3htbC9kb20veG1sYnVpbGRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzdjNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL3htbGJ1aWxkZXIucHkKQEAgLTAsMCArMSwzODYgQEAKKyIiIkltcGxlbWVudGF0aW9uIG9mIHRoZSBET00gTGV2ZWwgMyAnTFMtTG9hZCcgZmVhdHVyZS4iIiIKKworaW1wb3J0IGNvcHkKK2ltcG9ydCB4bWwuZG9tCisKK2Zyb20geG1sLmRvbS5Ob2RlRmlsdGVyIGltcG9ydCBOb2RlRmlsdGVyCisKKworX19hbGxfXyA9IFsiRE9NQnVpbGRlciIsICJET01FbnRpdHlSZXNvbHZlciIsICJET01JbnB1dFNvdXJjZSJdCisKKworY2xhc3MgT3B0aW9uczoKKyAgICAiIiJGZWF0dXJlcyBvYmplY3QgdGhhdCBoYXMgdmFyaWFibGVzIHNldCBmb3IgZWFjaCBET01CdWlsZGVyIGZlYXR1cmUuCisKKyAgICBUaGUgRE9NQnVpbGRlciBjbGFzcyB1c2VzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgdG8gcGFzcyBzZXR0aW5ncyB0bworICAgIHRoZSBFeHBhdEJ1aWxkZXIgY2xhc3MuCisgICAgIiIiCisKKyAgICAjIE5vdGUgdGhhdCB0aGUgRE9NQnVpbGRlciBjbGFzcyBpbiBMb2FkU2F2ZSBjb25zdHJhaW5zIHdoaWNoIG9mIHRoZXNlCisgICAgIyB2YWx1ZXMgY2FuIGJlIHNldCB1c2luZyB0aGUgRE9NIExldmVsIDMgTG9hZFNhdmUgZmVhdHVyZS4KKworICAgIG5hbWVzcGFjZXMgPSAxCisgICAgbmFtZXNwYWNlX2RlY2xhcmF0aW9ucyA9IFRydWUKKyAgICB2YWxpZGF0aW9uID0gRmFsc2UKKyAgICBleHRlcm5hbF9wYXJhbWV0ZXJfZW50aXRpZXMgPSBUcnVlCisgICAgZXh0ZXJuYWxfZ2VuZXJhbF9lbnRpdGllcyA9IFRydWUKKyAgICBleHRlcm5hbF9kdGRfc3Vic2V0ID0gVHJ1ZQorICAgIHZhbGlkYXRlX2lmX3NjaGVtYSA9IEZhbHNlCisgICAgdmFsaWRhdGUgPSBGYWxzZQorICAgIGRhdGF0eXBlX25vcm1hbGl6YXRpb24gPSBGYWxzZQorICAgIGNyZWF0ZV9lbnRpdHlfcmVmX25vZGVzID0gVHJ1ZQorICAgIGVudGl0aWVzID0gVHJ1ZQorICAgIHdoaXRlc3BhY2VfaW5fZWxlbWVudF9jb250ZW50ID0gVHJ1ZQorICAgIGNkYXRhX3NlY3Rpb25zID0gVHJ1ZQorICAgIGNvbW1lbnRzID0gVHJ1ZQorICAgIGNoYXJzZXRfb3ZlcnJpZGVzX3htbF9lbmNvZGluZyA9IFRydWUKKyAgICBpbmZvc2V0ID0gRmFsc2UKKyAgICBzdXBwb3J0ZWRfbWVkaWF0eXBlc19vbmx5ID0gRmFsc2UKKworICAgIGVycm9ySGFuZGxlciA9IE5vbmUKKyAgICBmaWx0ZXIgPSBOb25lCisKKworY2xhc3MgRE9NQnVpbGRlcjoKKyAgICBlbnRpdHlSZXNvbHZlciA9IE5vbmUKKyAgICBlcnJvckhhbmRsZXIgPSBOb25lCisgICAgZmlsdGVyID0gTm9uZQorCisgICAgQUNUSU9OX1JFUExBQ0UgPSAxCisgICAgQUNUSU9OX0FQUEVORF9BU19DSElMRFJFTiA9IDIKKyAgICBBQ1RJT05fSU5TRVJUX0FGVEVSID0gMworICAgIEFDVElPTl9JTlNFUlRfQkVGT1JFID0gNAorCisgICAgX2xlZ2FsX2FjdGlvbnMgPSAoQUNUSU9OX1JFUExBQ0UsIEFDVElPTl9BUFBFTkRfQVNfQ0hJTERSRU4sCisgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0lOU0VSVF9BRlRFUiwgQUNUSU9OX0lOU0VSVF9CRUZPUkUpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX29wdGlvbnMgPSBPcHRpb25zKCkKKworICAgIGRlZiBfZ2V0X2VudGl0eVJlc29sdmVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lbnRpdHlSZXNvbHZlcgorICAgIGRlZiBfc2V0X2VudGl0eVJlc29sdmVyKHNlbGYsIGVudGl0eVJlc29sdmVyKToKKyAgICAgICAgc2VsZi5lbnRpdHlSZXNvbHZlciA9IGVudGl0eVJlc29sdmVyCisKKyAgICBkZWYgX2dldF9lcnJvckhhbmRsZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmVycm9ySGFuZGxlcgorICAgIGRlZiBfc2V0X2Vycm9ySGFuZGxlcihzZWxmLCBlcnJvckhhbmRsZXIpOgorICAgICAgICBzZWxmLmVycm9ySGFuZGxlciA9IGVycm9ySGFuZGxlcgorCisgICAgZGVmIF9nZXRfZmlsdGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5maWx0ZXIKKyAgICBkZWYgX3NldF9maWx0ZXIoc2VsZiwgZmlsdGVyKToKKyAgICAgICAgc2VsZi5maWx0ZXIgPSBmaWx0ZXIKKworICAgIGRlZiBzZXRGZWF0dXJlKHNlbGYsIG5hbWUsIHN0YXRlKToKKyAgICAgICAgaWYgc2VsZi5zdXBwb3J0c0ZlYXR1cmUobmFtZSk6CisgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlIGFuZCAxIG9yIDAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZXR0aW5ncyA9IHNlbGYuX3NldHRpbmdzWyhfbmFtZV94Zm9ybShuYW1lKSwgc3RhdGUpXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKAorICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgZmVhdHVyZTogJXIiICUgKG5hbWUsKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNldHRpbmdzOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYuX29wdGlvbnMsIG5hbWUsIHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigidW5rbm93biBmZWF0dXJlOiAiICsgcmVwcihuYW1lKSkKKworICAgIGRlZiBzdXBwb3J0c0ZlYXR1cmUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBoYXNhdHRyKHNlbGYuX29wdGlvbnMsIF9uYW1lX3hmb3JtKG5hbWUpKQorCisgICAgZGVmIGNhblNldEZlYXR1cmUoc2VsZiwgbmFtZSwgc3RhdGUpOgorICAgICAgICBrZXkgPSAoX25hbWVfeGZvcm0obmFtZSksIHN0YXRlIGFuZCAxIG9yIDApCisgICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5fc2V0dGluZ3MKKworICAgICMgVGhpcyBkaWN0aW9uYXJ5IG1hcHMgZnJvbSAoZmVhdHVyZSx2YWx1ZSkgdG8gYSBsaXN0IG9mCisgICAgIyAob3B0aW9uLHZhbHVlKSBwYWlycyB0aGF0IHNob3VsZCBiZSBzZXQgb24gdGhlIE9wdGlvbnMgb2JqZWN0LgorICAgICMgSWYgYSAoZmVhdHVyZSx2YWx1ZSkgc2V0dGluZyBpcyBub3QgaW4gdGhpcyBkaWN0aW9uYXJ5LCBpdCBpcworICAgICMgbm90IHN1cHBvcnRlZCBieSB0aGUgRE9NQnVpbGRlci4KKyAgICAjCisgICAgX3NldHRpbmdzID0geworICAgICAgICAoIm5hbWVzcGFjZV9kZWNsYXJhdGlvbnMiLCAwKTogWworICAgICAgICAgICAgKCJuYW1lc3BhY2VfZGVjbGFyYXRpb25zIiwgMCldLAorICAgICAgICAoIm5hbWVzcGFjZV9kZWNsYXJhdGlvbnMiLCAxKTogWworICAgICAgICAgICAgKCJuYW1lc3BhY2VfZGVjbGFyYXRpb25zIiwgMSldLAorICAgICAgICAoInZhbGlkYXRpb24iLCAwKTogWworICAgICAgICAgICAgKCJ2YWxpZGF0aW9uIiwgMCldLAorICAgICAgICAoImV4dGVybmFsX2dlbmVyYWxfZW50aXRpZXMiLCAwKTogWworICAgICAgICAgICAgKCJleHRlcm5hbF9nZW5lcmFsX2VudGl0aWVzIiwgMCldLAorICAgICAgICAoImV4dGVybmFsX2dlbmVyYWxfZW50aXRpZXMiLCAxKTogWworICAgICAgICAgICAgKCJleHRlcm5hbF9nZW5lcmFsX2VudGl0aWVzIiwgMSldLAorICAgICAgICAoImV4dGVybmFsX3BhcmFtZXRlcl9lbnRpdGllcyIsIDApOiBbCisgICAgICAgICAgICAoImV4dGVybmFsX3BhcmFtZXRlcl9lbnRpdGllcyIsIDApXSwKKyAgICAgICAgKCJleHRlcm5hbF9wYXJhbWV0ZXJfZW50aXRpZXMiLCAxKTogWworICAgICAgICAgICAgKCJleHRlcm5hbF9wYXJhbWV0ZXJfZW50aXRpZXMiLCAxKV0sCisgICAgICAgICgidmFsaWRhdGVfaWZfc2NoZW1hIiwgMCk6IFsKKyAgICAgICAgICAgICgidmFsaWRhdGVfaWZfc2NoZW1hIiwgMCldLAorICAgICAgICAoImNyZWF0ZV9lbnRpdHlfcmVmX25vZGVzIiwgMCk6IFsKKyAgICAgICAgICAgICgiY3JlYXRlX2VudGl0eV9yZWZfbm9kZXMiLCAwKV0sCisgICAgICAgICgiY3JlYXRlX2VudGl0eV9yZWZfbm9kZXMiLCAxKTogWworICAgICAgICAgICAgKCJjcmVhdGVfZW50aXR5X3JlZl9ub2RlcyIsIDEpXSwKKyAgICAgICAgKCJlbnRpdGllcyIsIDApOiBbCisgICAgICAgICAgICAoImNyZWF0ZV9lbnRpdHlfcmVmX25vZGVzIiwgMCksCisgICAgICAgICAgICAoImVudGl0aWVzIiwgMCldLAorICAgICAgICAoImVudGl0aWVzIiwgMSk6IFsKKyAgICAgICAgICAgICgiZW50aXRpZXMiLCAxKV0sCisgICAgICAgICgid2hpdGVzcGFjZV9pbl9lbGVtZW50X2NvbnRlbnQiLCAwKTogWworICAgICAgICAgICAgKCJ3aGl0ZXNwYWNlX2luX2VsZW1lbnRfY29udGVudCIsIDApXSwKKyAgICAgICAgKCJ3aGl0ZXNwYWNlX2luX2VsZW1lbnRfY29udGVudCIsIDEpOiBbCisgICAgICAgICAgICAoIndoaXRlc3BhY2VfaW5fZWxlbWVudF9jb250ZW50IiwgMSldLAorICAgICAgICAoImNkYXRhX3NlY3Rpb25zIiwgMCk6IFsKKyAgICAgICAgICAgICgiY2RhdGFfc2VjdGlvbnMiLCAwKV0sCisgICAgICAgICgiY2RhdGFfc2VjdGlvbnMiLCAxKTogWworICAgICAgICAgICAgKCJjZGF0YV9zZWN0aW9ucyIsIDEpXSwKKyAgICAgICAgKCJjb21tZW50cyIsIDApOiBbCisgICAgICAgICAgICAoImNvbW1lbnRzIiwgMCldLAorICAgICAgICAoImNvbW1lbnRzIiwgMSk6IFsKKyAgICAgICAgICAgICgiY29tbWVudHMiLCAxKV0sCisgICAgICAgICgiY2hhcnNldF9vdmVycmlkZXNfeG1sX2VuY29kaW5nIiwgMCk6IFsKKyAgICAgICAgICAgICgiY2hhcnNldF9vdmVycmlkZXNfeG1sX2VuY29kaW5nIiwgMCldLAorICAgICAgICAoImNoYXJzZXRfb3ZlcnJpZGVzX3htbF9lbmNvZGluZyIsIDEpOiBbCisgICAgICAgICAgICAoImNoYXJzZXRfb3ZlcnJpZGVzX3htbF9lbmNvZGluZyIsIDEpXSwKKyAgICAgICAgKCJpbmZvc2V0IiwgMCk6IFtdLAorICAgICAgICAoImluZm9zZXQiLCAxKTogWworICAgICAgICAgICAgKCJuYW1lc3BhY2VfZGVjbGFyYXRpb25zIiwgMCksCisgICAgICAgICAgICAoInZhbGlkYXRlX2lmX3NjaGVtYSIsIDApLAorICAgICAgICAgICAgKCJjcmVhdGVfZW50aXR5X3JlZl9ub2RlcyIsIDApLAorICAgICAgICAgICAgKCJlbnRpdGllcyIsIDApLAorICAgICAgICAgICAgKCJjZGF0YV9zZWN0aW9ucyIsIDApLAorICAgICAgICAgICAgKCJkYXRhdHlwZV9ub3JtYWxpemF0aW9uIiwgMSksCisgICAgICAgICAgICAoIndoaXRlc3BhY2VfaW5fZWxlbWVudF9jb250ZW50IiwgMSksCisgICAgICAgICAgICAoImNvbW1lbnRzIiwgMSksCisgICAgICAgICAgICAoImNoYXJzZXRfb3ZlcnJpZGVzX3htbF9lbmNvZGluZyIsIDEpXSwKKyAgICAgICAgKCJzdXBwb3J0ZWRfbWVkaWF0eXBlc19vbmx5IiwgMCk6IFsKKyAgICAgICAgICAgICgic3VwcG9ydGVkX21lZGlhdHlwZXNfb25seSIsIDApXSwKKyAgICAgICAgKCJuYW1lc3BhY2VzIiwgMCk6IFsKKyAgICAgICAgICAgICgibmFtZXNwYWNlcyIsIDApXSwKKyAgICAgICAgKCJuYW1lc3BhY2VzIiwgMSk6IFsKKyAgICAgICAgICAgICgibmFtZXNwYWNlcyIsIDEpXSwKKyAgICB9CisKKyAgICBkZWYgZ2V0RmVhdHVyZShzZWxmLCBuYW1lKToKKyAgICAgICAgeG5hbWUgPSBfbmFtZV94Zm9ybShuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9vcHRpb25zLCB4bmFtZSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgaWYgbmFtZSA9PSAiaW5mb3NldCI6CisgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHNlbGYuX29wdGlvbnMKKyAgICAgICAgICAgICAgICByZXR1cm4gKG9wdGlvbnMuZGF0YXR5cGVfbm9ybWFsaXphdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9wdGlvbnMud2hpdGVzcGFjZV9pbl9lbGVtZW50X2NvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvcHRpb25zLmNvbW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb3B0aW9ucy5jaGFyc2V0X292ZXJyaWRlc194bWxfZW5jb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgKG9wdGlvbnMubmFtZXNwYWNlX2RlY2xhcmF0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igb3B0aW9ucy52YWxpZGF0ZV9pZl9zY2hlbWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG9wdGlvbnMuY3JlYXRlX2VudGl0eV9yZWZfbm9kZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG9wdGlvbnMuZW50aXRpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG9wdGlvbnMuY2RhdGFfc2VjdGlvbnMpKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigiZmVhdHVyZSAlcyBub3Qga25vd24iICUgcmVwcihuYW1lKSkKKworICAgIGRlZiBwYXJzZVVSSShzZWxmLCB1cmkpOgorICAgICAgICBpZiBzZWxmLmVudGl0eVJlc29sdmVyOgorICAgICAgICAgICAgaW5wdXQgPSBzZWxmLmVudGl0eVJlc29sdmVyLnJlc29sdmVFbnRpdHkoTm9uZSwgdXJpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5wdXQgPSBET01FbnRpdHlSZXNvbHZlcigpLnJlc29sdmVFbnRpdHkoTm9uZSwgdXJpKQorICAgICAgICByZXR1cm4gc2VsZi5wYXJzZShpbnB1dCkKKworICAgIGRlZiBwYXJzZShzZWxmLCBpbnB1dCk6CisgICAgICAgIG9wdGlvbnMgPSBjb3B5LmNvcHkoc2VsZi5fb3B0aW9ucykKKyAgICAgICAgb3B0aW9ucy5maWx0ZXIgPSBzZWxmLmZpbHRlcgorICAgICAgICBvcHRpb25zLmVycm9ySGFuZGxlciA9IHNlbGYuZXJyb3JIYW5kbGVyCisgICAgICAgIGZwID0gaW5wdXQuYnl0ZVN0cmVhbQorICAgICAgICBpZiBmcCBpcyBOb25lIGFuZCBvcHRpb25zLnN5c3RlbUlkOgorICAgICAgICAgICAgaW1wb3J0IHVybGxpYjIKKyAgICAgICAgICAgIGZwID0gdXJsbGliMi51cmxvcGVuKGlucHV0LnN5c3RlbUlkKQorICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VfYnl0ZXN0cmVhbShmcCwgb3B0aW9ucykKKworICAgIGRlZiBwYXJzZVdpdGhDb250ZXh0KHNlbGYsIGlucHV0LCBjbm9kZSwgYWN0aW9uKToKKyAgICAgICAgaWYgYWN0aW9uIG5vdCBpbiBzZWxmLl9sZWdhbF9hY3Rpb25zOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm90IGEgbGVnYWwgYWN0aW9uIikKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiSGF2ZW4ndCB3cml0dGVuIHRoaXMgeWV0Li4uIikKKworICAgIGRlZiBfcGFyc2VfYnl0ZXN0cmVhbShzZWxmLCBzdHJlYW0sIG9wdGlvbnMpOgorICAgICAgICBpbXBvcnQgeG1sLmRvbS5leHBhdGJ1aWxkZXIKKyAgICAgICAgYnVpbGRlciA9IHhtbC5kb20uZXhwYXRidWlsZGVyLm1ha2VCdWlsZGVyKG9wdGlvbnMpCisgICAgICAgIHJldHVybiBidWlsZGVyLnBhcnNlRmlsZShzdHJlYW0pCisKKworZGVmIF9uYW1lX3hmb3JtKG5hbWUpOgorICAgIHJldHVybiBuYW1lLmxvd2VyKCkucmVwbGFjZSgnLScsICdfJykKKworCitjbGFzcyBET01FbnRpdHlSZXNvbHZlcihvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9ICdfb3BlbmVyJywKKworICAgIGRlZiByZXNvbHZlRW50aXR5KHNlbGYsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CisgICAgICAgIGFzc2VydCBzeXN0ZW1JZCBpcyBub3QgTm9uZQorICAgICAgICBzb3VyY2UgPSBET01JbnB1dFNvdXJjZSgpCisgICAgICAgIHNvdXJjZS5wdWJsaWNJZCA9IHB1YmxpY0lkCisgICAgICAgIHNvdXJjZS5zeXN0ZW1JZCA9IHN5c3RlbUlkCisgICAgICAgIHNvdXJjZS5ieXRlU3RyZWFtID0gc2VsZi5fZ2V0X29wZW5lcigpLm9wZW4oc3lzdGVtSWQpCisKKyAgICAgICAgIyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nIGlmIHRoZSB0cmFuc3BvcnQgcHJvdmlkZWQgaXQKKyAgICAgICAgc291cmNlLmVuY29kaW5nID0gc2VsZi5fZ3Vlc3NfbWVkaWFfZW5jb2Rpbmcoc291cmNlKQorCisgICAgICAgICMgZGV0ZXJtaW5lIHRoZSBiYXNlIFVSSSBpcyB3ZSBjYW4KKyAgICAgICAgaW1wb3J0IHBvc2l4cGF0aCwgdXJscGFyc2UKKyAgICAgICAgcGFydHMgPSB1cmxwYXJzZS51cmxwYXJzZShzeXN0ZW1JZCkKKyAgICAgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50ID0gcGFydHMKKyAgICAgICAgIyBYWFggc2hvdWxkIHdlIGNoZWNrIHRoZSBzY2hlbWUgaGVyZSBhcyB3ZWxsPworICAgICAgICBpZiBwYXRoIGFuZCBub3QgcGF0aC5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgcGF0aCA9IHBvc2l4cGF0aC5kaXJuYW1lKHBhdGgpICsgIi8iCisgICAgICAgICAgICBwYXJ0cyA9IHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudAorICAgICAgICAgICAgc291cmNlLmJhc2VVUkkgPSB1cmxwYXJzZS51cmx1bnBhcnNlKHBhcnRzKQorCisgICAgICAgIHJldHVybiBzb3VyY2UKKworICAgIGRlZiBfZ2V0X29wZW5lcihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX29wZW5lcgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBzZWxmLl9vcGVuZXIgPSBzZWxmLl9jcmVhdGVfb3BlbmVyKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9vcGVuZXIKKworICAgIGRlZiBfY3JlYXRlX29wZW5lcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHVybGxpYjIKKyAgICAgICAgcmV0dXJuIHVybGxpYjIuYnVpbGRfb3BlbmVyKCkKKworICAgIGRlZiBfZ3Vlc3NfbWVkaWFfZW5jb2Rpbmcoc2VsZiwgc291cmNlKToKKyAgICAgICAgaW5mbyA9IHNvdXJjZS5ieXRlU3RyZWFtLmluZm8oKQorICAgICAgICBpZiAiQ29udGVudC1UeXBlIiBpbiBpbmZvOgorICAgICAgICAgICAgZm9yIHBhcmFtIGluIGluZm8uZ2V0cGxpc3QoKToKKyAgICAgICAgICAgICAgICBpZiBwYXJhbS5zdGFydHN3aXRoKCJjaGFyc2V0PSIpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW0uc3BsaXQoIj0iLCAxKVsxXS5sb3dlcigpCisKKworY2xhc3MgRE9NSW5wdXRTb3VyY2Uob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAoJ2J5dGVTdHJlYW0nLCAnY2hhcmFjdGVyU3RyZWFtJywgJ3N0cmluZ0RhdGEnLAorICAgICAgICAgICAgICAgICAnZW5jb2RpbmcnLCAncHVibGljSWQnLCAnc3lzdGVtSWQnLCAnYmFzZVVSSScpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYnl0ZVN0cmVhbSA9IE5vbmUKKyAgICAgICAgc2VsZi5jaGFyYWN0ZXJTdHJlYW0gPSBOb25lCisgICAgICAgIHNlbGYuc3RyaW5nRGF0YSA9IE5vbmUKKyAgICAgICAgc2VsZi5lbmNvZGluZyA9IE5vbmUKKyAgICAgICAgc2VsZi5wdWJsaWNJZCA9IE5vbmUKKyAgICAgICAgc2VsZi5zeXN0ZW1JZCA9IE5vbmUKKyAgICAgICAgc2VsZi5iYXNlVVJJID0gTm9uZQorCisgICAgZGVmIF9nZXRfYnl0ZVN0cmVhbShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYnl0ZVN0cmVhbQorICAgIGRlZiBfc2V0X2J5dGVTdHJlYW0oc2VsZiwgYnl0ZVN0cmVhbSk6CisgICAgICAgIHNlbGYuYnl0ZVN0cmVhbSA9IGJ5dGVTdHJlYW0KKworICAgIGRlZiBfZ2V0X2NoYXJhY3RlclN0cmVhbShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2hhcmFjdGVyU3RyZWFtCisgICAgZGVmIF9zZXRfY2hhcmFjdGVyU3RyZWFtKHNlbGYsIGNoYXJhY3RlclN0cmVhbSk6CisgICAgICAgIHNlbGYuY2hhcmFjdGVyU3RyZWFtID0gY2hhcmFjdGVyU3RyZWFtCisKKyAgICBkZWYgX2dldF9zdHJpbmdEYXRhKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdHJpbmdEYXRhCisgICAgZGVmIF9zZXRfc3RyaW5nRGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5zdHJpbmdEYXRhID0gZGF0YQorCisgICAgZGVmIF9nZXRfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmVuY29kaW5nCisgICAgZGVmIF9zZXRfZW5jb2Rpbmcoc2VsZiwgZW5jb2RpbmcpOgorICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKworICAgIGRlZiBfZ2V0X3B1YmxpY0lkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wdWJsaWNJZAorICAgIGRlZiBfc2V0X3B1YmxpY0lkKHNlbGYsIHB1YmxpY0lkKToKKyAgICAgICAgc2VsZi5wdWJsaWNJZCA9IHB1YmxpY0lkCisKKyAgICBkZWYgX2dldF9zeXN0ZW1JZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3lzdGVtSWQKKyAgICBkZWYgX3NldF9zeXN0ZW1JZChzZWxmLCBzeXN0ZW1JZCk6CisgICAgICAgIHNlbGYuc3lzdGVtSWQgPSBzeXN0ZW1JZAorCisgICAgZGVmIF9nZXRfYmFzZVVSSShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzZVVSSQorICAgIGRlZiBfc2V0X2Jhc2VVUkkoc2VsZiwgdXJpKToKKyAgICAgICAgc2VsZi5iYXNlVVJJID0gdXJpCisKKworY2xhc3MgRE9NQnVpbGRlckZpbHRlcjoKKyAgICAiIiJFbGVtZW50IGZpbHRlciB3aGljaCBjYW4gYmUgdXNlZCB0byB0YWlsb3IgY29uc3RydWN0aW9uIG9mCisgICAgYSBET00gaW5zdGFuY2UuCisgICAgIiIiCisKKyAgICAjIFRoZXJlJ3MgcmVhbGx5IG5vIG5lZWQgZm9yIHRoaXMgY2xhc3M7IGNvbmNyZXRlIGltcGxlbWVudGF0aW9ucworICAgICMgc2hvdWxkIGp1c3QgaW1wbGVtZW50IHRoZSBlbmRFbGVtZW50KCkgYW5kIHN0YXJ0RWxlbWVudCgpCisgICAgIyBtZXRob2RzIGFzIGFwcHJvcHJpYXRlLiAgVXNpbmcgdGhpcyBtYWtlcyBpdCBlYXN5IHRvIG9ubHkKKyAgICAjIGltcGxlbWVudCBvbmUgb2YgdGhlbS4KKworICAgIEZJTFRFUl9BQ0NFUFQgPSAxCisgICAgRklMVEVSX1JFSkVDVCA9IDIKKyAgICBGSUxURVJfU0tJUCA9IDMKKyAgICBGSUxURVJfSU5URVJSVVBUID0gNAorCisgICAgd2hhdFRvU2hvdyA9IE5vZGVGaWx0ZXIuU0hPV19BTEwKKworICAgIGRlZiBfZ2V0X3doYXRUb1Nob3coc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLndoYXRUb1Nob3cKKworICAgIGRlZiBhY2NlcHROb2RlKHNlbGYsIGVsZW1lbnQpOgorICAgICAgICByZXR1cm4gc2VsZi5GSUxURVJfQUNDRVBUCisKKyAgICBkZWYgc3RhcnRDb250YWluZXIoc2VsZiwgZWxlbWVudCk6CisgICAgICAgIHJldHVybiBzZWxmLkZJTFRFUl9BQ0NFUFQKKworZGVsIE5vZGVGaWx0ZXIKKworCitjbGFzcyBEb2N1bWVudExTOgorICAgICIiIk1peGluIHRvIGNyZWF0ZSBkb2N1bWVudHMgdGhhdCBjb25mb3JtIHRvIHRoZSBsb2FkL3NhdmUgc3BlYy4iIiIKKworICAgIGFzeW5jID0gRmFsc2UKKworICAgIGRlZiBfZ2V0X2FzeW5jKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBkZWYgX3NldF9hc3luYyhzZWxmLCBhc3luYyk6CisgICAgICAgIGlmIGFzeW5jOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoCisgICAgICAgICAgICAgICAgImFzeW5jaHJvbm91cyBkb2N1bWVudCBsb2FkaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKQorCisgICAgZGVmIGFib3J0KHNlbGYpOgorICAgICAgICAjIFdoYXQgZG9lcyBpdCBtZWFuIHRvICJjbGVhciIgYSBkb2N1bWVudD8gIERvZXMgdGhlCisgICAgICAgICMgZG9jdW1lbnRFbGVtZW50IGRpc2FwcGVhcj8KKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgICAgICJoYXZlbid0IGZpZ3VyZWQgb3V0IHdoYXQgdGhpcyBtZWFucyB5ZXQiKQorCisgICAgZGVmIGxvYWQoc2VsZiwgdXJpKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiaGF2ZW4ndCB3cml0dGVuIHRoaXMgeWV0IikKKworICAgIGRlZiBsb2FkWE1MKHNlbGYsIHNvdXJjZSk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoImhhdmVuJ3Qgd3JpdHRlbiB0aGlzIHlldCIpCisKKyAgICBkZWYgc2F2ZVhNTChzZWxmLCBzbm9kZSk6CisgICAgICAgIGlmIHNub2RlIGlzIE5vbmU6CisgICAgICAgICAgICBzbm9kZSA9IHNlbGYKKyAgICAgICAgZWxpZiBzbm9kZS5vd25lckRvY3VtZW50IGlzIG5vdCBzZWxmOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Xcm9uZ0RvY3VtZW50RXJyKCkKKyAgICAgICAgcmV0dXJuIHNub2RlLnRveG1sKCkKKworCitjbGFzcyBET01JbXBsZW1lbnRhdGlvbkxTOgorICAgIE1PREVfU1lOQ0hST05PVVMgPSAxCisgICAgTU9ERV9BU1lOQ0hST05PVVMgPSAyCisKKyAgICBkZWYgY3JlYXRlRE9NQnVpbGRlcihzZWxmLCBtb2RlLCBzY2hlbWFUeXBlKToKKyAgICAgICAgaWYgc2NoZW1hVHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKAorICAgICAgICAgICAgICAgICJzY2hlbWFUeXBlIG5vdCB5ZXQgc3VwcG9ydGVkIikKKyAgICAgICAgaWYgbW9kZSA9PSBzZWxmLk1PREVfU1lOQ0hST05PVVM6CisgICAgICAgICAgICByZXR1cm4gRE9NQnVpbGRlcigpCisgICAgICAgIGlmIG1vZGUgPT0gc2VsZi5NT0RFX0FTWU5DSFJPTk9VUzoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKAorICAgICAgICAgICAgICAgICJhc3luY2hyb25vdXMgYnVpbGRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQiKQorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIHZhbHVlIGZvciBtb2RlIikKKworICAgIGRlZiBjcmVhdGVET01Xcml0ZXIoc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICAgICAidGhlIHdyaXRlciBpbnRlcmZhY2UgaGFzbid0IGJlZW4gd3JpdHRlbiB5ZXQhIikKKworICAgIGRlZiBjcmVhdGVET01JbnB1dFNvdXJjZShzZWxmKToKKyAgICAgICAgcmV0dXJuIERPTUlucHV0U291cmNlKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS94bWxidWlsZGVyLnB5YyBiL2xpYi9weXRob24yLjcveG1sL2RvbS94bWxidWlsZGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWU2MTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL3htbGJ1aWxkZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS94bWxidWlsZGVyLnB5byBiL2xpYi9weXRob24yLjcveG1sL2RvbS94bWxidWlsZGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzkzMWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL3htbGJ1aWxkZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudEluY2x1ZGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmZDc1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5CkBAIC0wLDAgKzEsMTQzIEBACisjCisjIEVsZW1lbnRUcmVlCisjICRJZDogRWxlbWVudEluY2x1ZGUucHkgMzM3NSAyMDA4LTAyLTEzIDA4OjA1OjA4WiBmcmVkcmlrICQKKyMKKyMgbGltaXRlZCB4aW5jbHVkZSBzdXBwb3J0IGZvciBlbGVtZW50IHRyZWVzCisjCisjIGhpc3Rvcnk6CisjIDIwMDMtMDgtMTUgZmwgICBjcmVhdGVkCisjIDIwMDMtMTEtMTQgZmwgICBmaXhlZCBkZWZhdWx0IGxvYWRlcgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBieSBGcmVkcmlrIEx1bmRoLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgZnJlZHJpa0BweXRob253YXJlLmNvbQorIyBodHRwOi8vd3d3LnB5dGhvbndhcmUuY29tCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBFbGVtZW50VHJlZSB0b29sa2l0IGlzCisjCisjIENvcHlyaWdodCAoYykgMTk5OS0yMDA4IGJ5IEZyZWRyaWsgTHVuZGgKKyMKKyMgQnkgb2J0YWluaW5nLCB1c2luZywgYW5kL29yIGNvcHlpbmcgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgaXRzCisjIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiwgeW91IGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwKKyMgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKKyMgaXRzIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzCisjIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4KKyMgYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbgorIyBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YKKyMgU2VjcmV0IExhYnMgQUIgb3IgdGhlIGF1dGhvciBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKKyMgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4KKyMgcHJpb3IgcGVybWlzc2lvbi4KKyMKKyMgU0VDUkVUIExBQlMgQUIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJECisjIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5ULQorIyBBQklMSVRZIEFORCBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0VDUkVUIExBQlMgQUIgT1IgVEhFIEFVVEhPUgorIyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZCisjIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorIyBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUworIyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFCisjIE9GIFRISVMgU09GVFdBUkUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorIyBTZWUgaHR0cDovL3d3dy5weXRob24ub3JnL3BzZi9saWNlbnNlIGZvciBsaWNlbnNpbmcgZGV0YWlscy4KKworIyMKKyMgTGltaXRlZCBYSW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgRWxlbWVudFRyZWUgcGFja2FnZS4KKyMjCisKK2ltcG9ydCBjb3B5Citmcm9tIC4gaW1wb3J0IEVsZW1lbnRUcmVlCisKK1hJTkNMVURFID0gIntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlfSIKKworWElOQ0xVREVfSU5DTFVERSA9IFhJTkNMVURFICsgImluY2x1ZGUiCitYSU5DTFVERV9GQUxMQkFDSyA9IFhJTkNMVURFICsgImZhbGxiYWNrIgorCisjIworIyBGYXRhbCBpbmNsdWRlIGVycm9yLgorCitjbGFzcyBGYXRhbEluY2x1ZGVFcnJvcihTeW50YXhFcnJvcik6CisgICAgcGFzcworCisjIworIyBEZWZhdWx0IGxvYWRlci4gIFRoaXMgbG9hZGVyIHJlYWRzIGFuIGluY2x1ZGVkIHJlc291cmNlIGZyb20gZGlzay4KKyMKKyMgQHBhcmFtIGhyZWYgUmVzb3VyY2UgcmVmZXJlbmNlLgorIyBAcGFyYW0gcGFyc2UgUGFyc2UgbW9kZS4gIEVpdGhlciAieG1sIiBvciAidGV4dCIuCisjIEBwYXJhbSBlbmNvZGluZyBPcHRpb25hbCB0ZXh0IGVuY29kaW5nLgorIyBAcmV0dXJuIFRoZSBleHBhbmRlZCByZXNvdXJjZS4gIElmIHRoZSBwYXJzZSBtb2RlIGlzICJ4bWwiLCB0aGlzCisjICAgIGlzIGFuIEVsZW1lbnRUcmVlIGluc3RhbmNlLiAgSWYgdGhlIHBhcnNlIG1vZGUgaXMgInRleHQiLCB0aGlzCisjICAgIGlzIGEgVW5pY29kZSBzdHJpbmcuICBJZiB0aGUgbG9hZGVyIGZhaWxzLCBpdCBjYW4gcmV0dXJuIE5vbmUKKyMgICAgb3IgcmFpc2UgYW4gSU9FcnJvciBleGNlcHRpb24uCisjIEB0aHJvd3MgSU9FcnJvciBJZiB0aGUgbG9hZGVyIGZhaWxzIHRvIGxvYWQgdGhlIHJlc291cmNlLgorCitkZWYgZGVmYXVsdF9sb2FkZXIoaHJlZiwgcGFyc2UsIGVuY29kaW5nPU5vbmUpOgorICAgIGZpbGUgPSBvcGVuKGhyZWYpCisgICAgaWYgcGFyc2UgPT0gInhtbCI6CisgICAgICAgIGRhdGEgPSBFbGVtZW50VHJlZS5wYXJzZShmaWxlKS5nZXRyb290KCkKKyAgICBlbHNlOgorICAgICAgICBkYXRhID0gZmlsZS5yZWFkKCkKKyAgICAgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoZW5jb2RpbmcpCisgICAgZmlsZS5jbG9zZSgpCisgICAgcmV0dXJuIGRhdGEKKworIyMKKyMgRXhwYW5kIFhJbmNsdWRlIGRpcmVjdGl2ZXMuCisjCisjIEBwYXJhbSBlbGVtIFJvb3QgZWxlbWVudC4KKyMgQHBhcmFtIGxvYWRlciBPcHRpb25hbCByZXNvdXJjZSBsb2FkZXIuICBJZiBvbWl0dGVkLCBpdCBkZWZhdWx0cworIyAgICAgdG8ge0BsaW5rIGRlZmF1bHRfbG9hZGVyfS4gIElmIGdpdmVuLCBpdCBzaG91bGQgYmUgYSBjYWxsYWJsZQorIyAgICAgdGhhdCBpbXBsZW1lbnRzIHRoZSBzYW1lIGludGVyZmFjZSBhcyA8Yj5kZWZhdWx0X2xvYWRlcjwvYj4uCisjIEB0aHJvd3MgRmF0YWxJbmNsdWRlRXJyb3IgSWYgdGhlIGZ1bmN0aW9uIGZhaWxzIHRvIGluY2x1ZGUgYSBnaXZlbgorIyAgICAgcmVzb3VyY2UsIG9yIGlmIHRoZSB0cmVlIGNvbnRhaW5zIG1hbGZvcm1lZCBYSW5jbHVkZSBlbGVtZW50cy4KKyMgQHRocm93cyBJT0Vycm9yIElmIHRoZSBmdW5jdGlvbiBmYWlscyB0byBsb2FkIGEgZ2l2ZW4gcmVzb3VyY2UuCisKK2RlZiBpbmNsdWRlKGVsZW0sIGxvYWRlcj1Ob25lKToKKyAgICBpZiBsb2FkZXIgaXMgTm9uZToKKyAgICAgICAgbG9hZGVyID0gZGVmYXVsdF9sb2FkZXIKKyAgICAjIGxvb2sgZm9yIHhpbmNsdWRlIGVsZW1lbnRzCisgICAgaSA9IDAKKyAgICB3aGlsZSBpIDwgbGVuKGVsZW0pOgorICAgICAgICBlID0gZWxlbVtpXQorICAgICAgICBpZiBlLnRhZyA9PSBYSU5DTFVERV9JTkNMVURFOgorICAgICAgICAgICAgIyBwcm9jZXNzIHhpbmNsdWRlIGRpcmVjdGl2ZQorICAgICAgICAgICAgaHJlZiA9IGUuZ2V0KCJocmVmIikKKyAgICAgICAgICAgIHBhcnNlID0gZS5nZXQoInBhcnNlIiwgInhtbCIpCisgICAgICAgICAgICBpZiBwYXJzZSA9PSAieG1sIjoKKyAgICAgICAgICAgICAgICBub2RlID0gbG9hZGVyKGhyZWYsIHBhcnNlKQorICAgICAgICAgICAgICAgIGlmIG5vZGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRmF0YWxJbmNsdWRlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGxvYWQgJXIgYXMgJXIiICUgKGhyZWYsIHBhcnNlKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIG5vZGUgPSBjb3B5LmNvcHkobm9kZSkKKyAgICAgICAgICAgICAgICBpZiBlLnRhaWw6CisgICAgICAgICAgICAgICAgICAgIG5vZGUudGFpbCA9IChub2RlLnRhaWwgb3IgIiIpICsgZS50YWlsCisgICAgICAgICAgICAgICAgZWxlbVtpXSA9IG5vZGUKKyAgICAgICAgICAgIGVsaWYgcGFyc2UgPT0gInRleHQiOgorICAgICAgICAgICAgICAgIHRleHQgPSBsb2FkZXIoaHJlZiwgcGFyc2UsIGUuZ2V0KCJlbmNvZGluZyIpKQorICAgICAgICAgICAgICAgIGlmIHRleHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRmF0YWxJbmNsdWRlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGxvYWQgJXIgYXMgJXIiICUgKGhyZWYsIHBhcnNlKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGlmIGk6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBlbGVtW2ktMV0KKyAgICAgICAgICAgICAgICAgICAgbm9kZS50YWlsID0gKG5vZGUudGFpbCBvciAiIikgKyB0ZXh0ICsgKGUudGFpbCBvciAiIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlbGVtLnRleHQgPSAoZWxlbS50ZXh0IG9yICIiKSArIHRleHQgKyAoZS50YWlsIG9yICIiKQorICAgICAgICAgICAgICAgIGRlbCBlbGVtW2ldCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRmF0YWxJbmNsdWRlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHBhcnNlIHR5cGUgaW4geGk6aW5jbHVkZSB0YWcgKCVyKSIgJSBwYXJzZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgZWxpZiBlLnRhZyA9PSBYSU5DTFVERV9GQUxMQkFDSzoKKyAgICAgICAgICAgIHJhaXNlIEZhdGFsSW5jbHVkZUVycm9yKAorICAgICAgICAgICAgICAgICJ4aTpmYWxsYmFjayB0YWcgbXVzdCBiZSBjaGlsZCBvZiB4aTppbmNsdWRlICglcikiICUgZS50YWcKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbmNsdWRlKGUsIGxvYWRlcikKKyAgICAgICAgaSA9IGkgKyAxCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50SW5jbHVkZS5weWMgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50SW5jbHVkZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkOTIwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50SW5jbHVkZS5weW8gYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50SW5jbHVkZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkOTIwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50UGF0aC5weSBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRQYXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNjI2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50UGF0aC5weQpAQCAtMCwwICsxLDMwMyBAQAorIworIyBFbGVtZW50VHJlZQorIyAkSWQ6IEVsZW1lbnRQYXRoLnB5IDMzNzUgMjAwOC0wMi0xMyAwODowNTowOFogZnJlZHJpayAkCisjCisjIGxpbWl0ZWQgeHBhdGggc3VwcG9ydCBmb3IgZWxlbWVudCB0cmVlcworIworIyBoaXN0b3J5OgorIyAyMDAzLTA1LTIzIGZsICAgY3JlYXRlZAorIyAyMDAzLTA1LTI4IGZsICAgYWRkZWQgc3VwcG9ydCBmb3IgLy8gZXRjCisjIDIwMDMtMDgtMjcgZmwgICBmaXhlZCBwYXJzaW5nIG9mIHBlcmlvZHMgaW4gZWxlbWVudCBuYW1lcworIyAyMDA3LTA5LTEwIGZsICAgbmV3IHNlbGVjdGlvbiBlbmdpbmUKKyMgMjAwNy0wOS0xMiBmbCAgIGZpeGVkIHBhcmVudCBzZWxlY3RvcgorIyAyMDA3LTA5LTEzIGZsICAgYWRkZWQgaXRlcmZpbmQ7IGNoYW5nZWQgZmluZGFsbCB0byByZXR1cm4gYSBsaXN0CisjIDIwMDctMTEtMzAgZmwgICBhZGRlZCBuYW1lc3BhY2VzIHN1cHBvcnQKKyMgMjAwOS0xMC0zMCBmbCAgIGFkZGVkIGNoaWxkIGVsZW1lbnQgdmFsdWUgZmlsdGVyCisjCisjIENvcHlyaWdodCAoYykgMjAwMy0yMDA5IGJ5IEZyZWRyaWsgTHVuZGguICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBmcmVkcmlrQHB5dGhvbndhcmUuY29tCisjIGh0dHA6Ly93d3cucHl0aG9ud2FyZS5jb20KKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIEVsZW1lbnRUcmVlIHRvb2xraXQgaXMKKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDkgYnkgRnJlZHJpayBMdW5kaAorIworIyBCeSBvYnRhaW5pbmcsIHVzaW5nLCBhbmQvb3IgY29weWluZyB0aGlzIHNvZnR3YXJlIGFuZC9vciBpdHMKKyMgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uLCB5b3UgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLAorIyBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zOgorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorIyBpdHMgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMKKyMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbgorIyBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uCisjIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZgorIyBTZWNyZXQgTGFicyBBQiBvciB0aGUgYXV0aG9yIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eQorIyBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbgorIyBwcmlvciBwZXJtaXNzaW9uLgorIworIyBTRUNSRVQgTEFCUyBBQiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQKKyMgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlQtCisjIEFCSUxJVFkgQU5EIEZJVE5FU1MuICBJTiBOTyBFVkVOVCBTSEFMTCBTRUNSRVQgTEFCUyBBQiBPUiBUSEUgQVVUSE9SCisjIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkKKyMgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisjIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCisjIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyMgT0YgVEhJUyBTT0ZUV0FSRS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisjIFNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHNmL2xpY2Vuc2UgZm9yIGxpY2Vuc2luZyBkZXRhaWxzLgorCisjIworIyBJbXBsZW1lbnRhdGlvbiBtb2R1bGUgZm9yIFhQYXRoIHN1cHBvcnQuICBUaGVyZSdzIHVzdWFsbHkgbm8gcmVhc29uCisjIHRvIGltcG9ydCB0aGlzIG1vZHVsZSBkaXJlY3RseTsgdGhlIDxiPkVsZW1lbnRUcmVlPC9iPiBkb2VzIHRoaXMgZm9yCisjIHlvdSwgaWYgbmVlZGVkLgorIyMKKworaW1wb3J0IHJlCisKK3hwYXRoX3Rva2VuaXplcl9yZSA9IHJlLmNvbXBpbGUoCisgICAgIigiCisgICAgIidbXiddKid8XCJbXlwiXSpcInwiCisgICAgIjo6fCIKKyAgICAiLy8/fCIKKyAgICAiXC5cLnwiCisgICAgIlwoXCl8IgorICAgICJbLy4qOlxbXF1cKFwpQD1dKXwiCisgICAgIigoPzpce1tefV0rXH0pP1teL1xbXF1cKFwpQD1cc10rKXwiCisgICAgIlxzKyIKKyAgICApCisKK2RlZiB4cGF0aF90b2tlbml6ZXIocGF0dGVybiwgbmFtZXNwYWNlcz1Ob25lKToKKyAgICBmb3IgdG9rZW4gaW4geHBhdGhfdG9rZW5pemVyX3JlLmZpbmRhbGwocGF0dGVybik6CisgICAgICAgIHRhZyA9IHRva2VuWzFdCisgICAgICAgIGlmIHRhZyBhbmQgdGFnWzBdICE9ICJ7IiBhbmQgIjoiIGluIHRhZzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwcmVmaXgsIHVyaSA9IHRhZy5zcGxpdCgiOiIsIDEpCisgICAgICAgICAgICAgICAgaWYgbm90IG5hbWVzcGFjZXM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yCisgICAgICAgICAgICAgICAgeWllbGQgdG9rZW5bMF0sICJ7JXN9JXMiICUgKG5hbWVzcGFjZXNbcHJlZml4XSwgdXJpKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCJwcmVmaXggJXIgbm90IGZvdW5kIGluIHByZWZpeCBtYXAiICUgcHJlZml4KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeWllbGQgdG9rZW4KKworZGVmIGdldF9wYXJlbnRfbWFwKGNvbnRleHQpOgorICAgIHBhcmVudF9tYXAgPSBjb250ZXh0LnBhcmVudF9tYXAKKyAgICBpZiBwYXJlbnRfbWFwIGlzIE5vbmU6CisgICAgICAgIGNvbnRleHQucGFyZW50X21hcCA9IHBhcmVudF9tYXAgPSB7fQorICAgICAgICBmb3IgcCBpbiBjb250ZXh0LnJvb3QuaXRlcigpOgorICAgICAgICAgICAgZm9yIGUgaW4gcDoKKyAgICAgICAgICAgICAgICBwYXJlbnRfbWFwW2VdID0gcAorICAgIHJldHVybiBwYXJlbnRfbWFwCisKK2RlZiBwcmVwYXJlX2NoaWxkKG5leHQsIHRva2VuKToKKyAgICB0YWcgPSB0b2tlblsxXQorICAgIGRlZiBzZWxlY3QoY29udGV4dCwgcmVzdWx0KToKKyAgICAgICAgZm9yIGVsZW0gaW4gcmVzdWx0OgorICAgICAgICAgICAgZm9yIGUgaW4gZWxlbToKKyAgICAgICAgICAgICAgICBpZiBlLnRhZyA9PSB0YWc6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGUKKyAgICByZXR1cm4gc2VsZWN0CisKK2RlZiBwcmVwYXJlX3N0YXIobmV4dCwgdG9rZW4pOgorICAgIGRlZiBzZWxlY3QoY29udGV4dCwgcmVzdWx0KToKKyAgICAgICAgZm9yIGVsZW0gaW4gcmVzdWx0OgorICAgICAgICAgICAgZm9yIGUgaW4gZWxlbToKKyAgICAgICAgICAgICAgICB5aWVsZCBlCisgICAgcmV0dXJuIHNlbGVjdAorCitkZWYgcHJlcGFyZV9zZWxmKG5leHQsIHRva2VuKToKKyAgICBkZWYgc2VsZWN0KGNvbnRleHQsIHJlc3VsdCk6CisgICAgICAgIGZvciBlbGVtIGluIHJlc3VsdDoKKyAgICAgICAgICAgIHlpZWxkIGVsZW0KKyAgICByZXR1cm4gc2VsZWN0CisKK2RlZiBwcmVwYXJlX2Rlc2NlbmRhbnQobmV4dCwgdG9rZW4pOgorICAgIHRva2VuID0gbmV4dCgpCisgICAgaWYgdG9rZW5bMF0gPT0gIioiOgorICAgICAgICB0YWcgPSAiKiIKKyAgICBlbGlmIG5vdCB0b2tlblswXToKKyAgICAgICAgdGFnID0gdG9rZW5bMV0KKyAgICBlbHNlOgorICAgICAgICByYWlzZSBTeW50YXhFcnJvcigiaW52YWxpZCBkZXNjZW5kYW50IikKKyAgICBkZWYgc2VsZWN0KGNvbnRleHQsIHJlc3VsdCk6CisgICAgICAgIGZvciBlbGVtIGluIHJlc3VsdDoKKyAgICAgICAgICAgIGZvciBlIGluIGVsZW0uaXRlcih0YWcpOgorICAgICAgICAgICAgICAgIGlmIGUgaXMgbm90IGVsZW06CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGUKKyAgICByZXR1cm4gc2VsZWN0CisKK2RlZiBwcmVwYXJlX3BhcmVudChuZXh0LCB0b2tlbik6CisgICAgZGVmIHNlbGVjdChjb250ZXh0LCByZXN1bHQpOgorICAgICAgICAjIEZJWE1FOiByYWlzZSBlcnJvciBpZiAuLiBpcyBhcHBsaWVkIGF0IHRvcGxldmVsPworICAgICAgICBwYXJlbnRfbWFwID0gZ2V0X3BhcmVudF9tYXAoY29udGV4dCkKKyAgICAgICAgcmVzdWx0X21hcCA9IHt9CisgICAgICAgIGZvciBlbGVtIGluIHJlc3VsdDoKKyAgICAgICAgICAgIGlmIGVsZW0gaW4gcGFyZW50X21hcDoKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnRfbWFwW2VsZW1dCisgICAgICAgICAgICAgICAgaWYgcGFyZW50IG5vdCBpbiByZXN1bHRfbWFwOgorICAgICAgICAgICAgICAgICAgICByZXN1bHRfbWFwW3BhcmVudF0gPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHBhcmVudAorICAgIHJldHVybiBzZWxlY3QKKworZGVmIHByZXBhcmVfcHJlZGljYXRlKG5leHQsIHRva2VuKToKKyAgICAjIEZJWE1FOiByZXBsYWNlIHdpdGggcmVhbCBwYXJzZXIhISEgcmVmczoKKyAgICAjIGh0dHA6Ly9lZmZib3Qub3JnL3pvbmUvc2ltcGxlLWl0ZXJhdG9yLXBhcnNlci5odG0KKyAgICAjIGh0dHA6Ly9qYXZhc2NyaXB0LmNyb2NrZm9yZC5jb20vdGRvcC90ZG9wLmh0bWwKKyAgICBzaWduYXR1cmUgPSBbXQorICAgIHByZWRpY2F0ZSA9IFtdCisgICAgd2hpbGUgMToKKyAgICAgICAgdG9rZW4gPSBuZXh0KCkKKyAgICAgICAgaWYgdG9rZW5bMF0gPT0gIl0iOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgdG9rZW5bMF0gYW5kIHRva2VuWzBdWzoxXSBpbiAiJ1wiIjoKKyAgICAgICAgICAgIHRva2VuID0gIiciLCB0b2tlblswXVsxOi0xXQorICAgICAgICBzaWduYXR1cmUuYXBwZW5kKHRva2VuWzBdIG9yICItIikKKyAgICAgICAgcHJlZGljYXRlLmFwcGVuZCh0b2tlblsxXSkKKyAgICBzaWduYXR1cmUgPSAiIi5qb2luKHNpZ25hdHVyZSkKKyAgICAjIHVzZSBzaWduYXR1cmUgdG8gZGV0ZXJtaW5lIHByZWRpY2F0ZSB0eXBlCisgICAgaWYgc2lnbmF0dXJlID09ICJALSI6CisgICAgICAgICMgW0BhdHRyaWJ1dGVdIHByZWRpY2F0ZQorICAgICAgICBrZXkgPSBwcmVkaWNhdGVbMV0KKyAgICAgICAgZGVmIHNlbGVjdChjb250ZXh0LCByZXN1bHQpOgorICAgICAgICAgICAgZm9yIGVsZW0gaW4gcmVzdWx0OgorICAgICAgICAgICAgICAgIGlmIGVsZW0uZ2V0KGtleSkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW0KKyAgICAgICAgcmV0dXJuIHNlbGVjdAorICAgIGlmIHNpZ25hdHVyZSA9PSAiQC09JyI6CisgICAgICAgICMgW0BhdHRyaWJ1dGU9J3ZhbHVlJ10KKyAgICAgICAga2V5ID0gcHJlZGljYXRlWzFdCisgICAgICAgIHZhbHVlID0gcHJlZGljYXRlWy0xXQorICAgICAgICBkZWYgc2VsZWN0KGNvbnRleHQsIHJlc3VsdCk6CisgICAgICAgICAgICBmb3IgZWxlbSBpbiByZXN1bHQ6CisgICAgICAgICAgICAgICAgaWYgZWxlbS5nZXQoa2V5KSA9PSB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbQorICAgICAgICByZXR1cm4gc2VsZWN0CisgICAgaWYgc2lnbmF0dXJlID09ICItIiBhbmQgbm90IHJlLm1hdGNoKCJcZCskIiwgcHJlZGljYXRlWzBdKToKKyAgICAgICAgIyBbdGFnXQorICAgICAgICB0YWcgPSBwcmVkaWNhdGVbMF0KKyAgICAgICAgZGVmIHNlbGVjdChjb250ZXh0LCByZXN1bHQpOgorICAgICAgICAgICAgZm9yIGVsZW0gaW4gcmVzdWx0OgorICAgICAgICAgICAgICAgIGlmIGVsZW0uZmluZCh0YWcpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtCisgICAgICAgIHJldHVybiBzZWxlY3QKKyAgICBpZiBzaWduYXR1cmUgPT0gIi09JyIgYW5kIG5vdCByZS5tYXRjaCgiXGQrJCIsIHByZWRpY2F0ZVswXSk6CisgICAgICAgICMgW3RhZz0ndmFsdWUnXQorICAgICAgICB0YWcgPSBwcmVkaWNhdGVbMF0KKyAgICAgICAgdmFsdWUgPSBwcmVkaWNhdGVbLTFdCisgICAgICAgIGRlZiBzZWxlY3QoY29udGV4dCwgcmVzdWx0KToKKyAgICAgICAgICAgIGZvciBlbGVtIGluIHJlc3VsdDoKKyAgICAgICAgICAgICAgICBmb3IgZSBpbiBlbGVtLmZpbmRhbGwodGFnKToKKyAgICAgICAgICAgICAgICAgICAgaWYgIiIuam9pbihlLml0ZXJ0ZXh0KCkpID09IHZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIHNlbGVjdAorICAgIGlmIHNpZ25hdHVyZSA9PSAiLSIgb3Igc2lnbmF0dXJlID09ICItKCkiIG9yIHNpZ25hdHVyZSA9PSAiLSgpLSI6CisgICAgICAgICMgW2luZGV4XSBvciBbbGFzdCgpXSBvciBbbGFzdCgpLWluZGV4XQorICAgICAgICBpZiBzaWduYXR1cmUgPT0gIi0iOgorICAgICAgICAgICAgaW5kZXggPSBpbnQocHJlZGljYXRlWzBdKSAtIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHByZWRpY2F0ZVswXSAhPSAibGFzdCI6CisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoInVuc3VwcG9ydGVkIGZ1bmN0aW9uIikKKyAgICAgICAgICAgIGlmIHNpZ25hdHVyZSA9PSAiLSgpLSI6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGludChwcmVkaWNhdGVbMl0pIC0gMQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigidW5zdXBwb3J0ZWQgZXhwcmVzc2lvbiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGluZGV4ID0gLTEKKyAgICAgICAgZGVmIHNlbGVjdChjb250ZXh0LCByZXN1bHQpOgorICAgICAgICAgICAgcGFyZW50X21hcCA9IGdldF9wYXJlbnRfbWFwKGNvbnRleHQpCisgICAgICAgICAgICBmb3IgZWxlbSBpbiByZXN1bHQ6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnRfbWFwW2VsZW1dCisgICAgICAgICAgICAgICAgICAgICMgRklYTUU6IHdoYXQgaWYgdGhlIHNlbGVjdG9yIGlzICIqIiA/CisgICAgICAgICAgICAgICAgICAgIGVsZW1zID0gbGlzdChwYXJlbnQuZmluZGFsbChlbGVtLnRhZykpCisgICAgICAgICAgICAgICAgICAgIGlmIGVsZW1zW2luZGV4XSBpcyBlbGVtOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoSW5kZXhFcnJvciwgS2V5RXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBzZWxlY3QKKyAgICByYWlzZSBTeW50YXhFcnJvcigiaW52YWxpZCBwcmVkaWNhdGUiKQorCitvcHMgPSB7CisgICAgIiI6IHByZXBhcmVfY2hpbGQsCisgICAgIioiOiBwcmVwYXJlX3N0YXIsCisgICAgIi4iOiBwcmVwYXJlX3NlbGYsCisgICAgIi4uIjogcHJlcGFyZV9wYXJlbnQsCisgICAgIi8vIjogcHJlcGFyZV9kZXNjZW5kYW50LAorICAgICJbIjogcHJlcGFyZV9wcmVkaWNhdGUsCisgICAgfQorCitfY2FjaGUgPSB7fQorCitjbGFzcyBfU2VsZWN0b3JDb250ZXh0OgorICAgIHBhcmVudF9tYXAgPSBOb25lCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3QpOgorICAgICAgICBzZWxmLnJvb3QgPSByb290CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMKKyMgR2VuZXJhdGUgYWxsIG1hdGNoaW5nIG9iamVjdHMuCisKK2RlZiBpdGVyZmluZChlbGVtLCBwYXRoLCBuYW1lc3BhY2VzPU5vbmUpOgorICAgICMgY29tcGlsZSBzZWxlY3RvciBwYXR0ZXJuCisgICAgaWYgcGF0aFstMTpdID09ICIvIjoKKyAgICAgICAgcGF0aCA9IHBhdGggKyAiKiIgIyBpbXBsaWNpdCBhbGwgKEZJWE1FOiBrZWVwIHRoaXM/KQorICAgIHRyeToKKyAgICAgICAgc2VsZWN0b3IgPSBfY2FjaGVbcGF0aF0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIGlmIGxlbihfY2FjaGUpID4gMTAwOgorICAgICAgICAgICAgX2NhY2hlLmNsZWFyKCkKKyAgICAgICAgaWYgcGF0aFs6MV0gPT0gIi8iOgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoImNhbm5vdCB1c2UgYWJzb2x1dGUgcGF0aCBvbiBlbGVtZW50IikKKyAgICAgICAgbmV4dCA9IGl0ZXIoeHBhdGhfdG9rZW5pemVyKHBhdGgsIG5hbWVzcGFjZXMpKS5uZXh0CisgICAgICAgIHRva2VuID0gbmV4dCgpCisgICAgICAgIHNlbGVjdG9yID0gW10KKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxlY3Rvci5hcHBlbmQob3BzW3Rva2VuWzBdXShuZXh0LCB0b2tlbikpCisgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigiaW52YWxpZCBwYXRoIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0b2tlbiA9IG5leHQoKQorICAgICAgICAgICAgICAgIGlmIHRva2VuWzBdID09ICIvIjoKKyAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBuZXh0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIF9jYWNoZVtwYXRoXSA9IHNlbGVjdG9yCisgICAgIyBleGVjdXRlIHNlbGVjdG9yIHBhdHRlcm4KKyAgICByZXN1bHQgPSBbZWxlbV0KKyAgICBjb250ZXh0ID0gX1NlbGVjdG9yQ29udGV4dChlbGVtKQorICAgIGZvciBzZWxlY3QgaW4gc2VsZWN0b3I6CisgICAgICAgIHJlc3VsdCA9IHNlbGVjdChjb250ZXh0LCByZXN1bHQpCisgICAgcmV0dXJuIHJlc3VsdAorCisjIworIyBGaW5kIGZpcnN0IG1hdGNoaW5nIG9iamVjdC4KKworZGVmIGZpbmQoZWxlbSwgcGF0aCwgbmFtZXNwYWNlcz1Ob25lKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBpdGVyZmluZChlbGVtLCBwYXRoLCBuYW1lc3BhY2VzKS5uZXh0KCkKKyAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworIyMKKyMgRmluZCBhbGwgbWF0Y2hpbmcgb2JqZWN0cy4KKworZGVmIGZpbmRhbGwoZWxlbSwgcGF0aCwgbmFtZXNwYWNlcz1Ob25lKToKKyAgICByZXR1cm4gbGlzdChpdGVyZmluZChlbGVtLCBwYXRoLCBuYW1lc3BhY2VzKSkKKworIyMKKyMgRmluZCB0ZXh0IGZvciBmaXJzdCBtYXRjaGluZyBvYmplY3QuCisKK2RlZiBmaW5kdGV4dChlbGVtLCBwYXRoLCBkZWZhdWx0PU5vbmUsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgdHJ5OgorICAgICAgICBlbGVtID0gaXRlcmZpbmQoZWxlbSwgcGF0aCwgbmFtZXNwYWNlcykubmV4dCgpCisgICAgICAgIHJldHVybiBlbGVtLnRleHQgb3IgIiIKKyAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRQYXRoLnB5YyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRQYXRoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTY0OTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudFBhdGgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRQYXRoLnB5byBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRQYXRoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTY0OTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudFBhdGgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudFRyZWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0NjhjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5CkBAIC0wLDAgKzEsMTY2NyBAQAorIworIyBFbGVtZW50VHJlZQorIyAkSWQ6IEVsZW1lbnRUcmVlLnB5IDM0NDAgMjAwOC0wNy0xOCAxNDo0NTowMVogZnJlZHJpayAkCisjCisjIGxpZ2h0LXdlaWdodCBYTUwgc3VwcG9ydCBmb3IgUHl0aG9uIDIuMyBhbmQgbGF0ZXIuCisjCisjIGhpc3RvcnkgKHNpbmNlIDEuMi42KToKKyMgMjAwNS0xMS0xMiBmbCAgIGFkZGVkIHRvc3RyaW5nbGlzdC9mcm9tc3RyaW5nbGlzdCBoZWxwZXJzCisjIDIwMDYtMDctMDUgZmwgICBtZXJnZWQgaW4gc2VsZWN0ZWQgY2hhbmdlcyBmcm9tIHRoZSAxLjMgc2FuZGJveAorIyAyMDA2LTA3LTA1IGZsICAgcmVtb3ZlZCBzdXBwb3J0IGZvciAyLjEgYW5kIGVhcmxpZXIKKyMgMjAwNy0wNi0yMSBmbCAgIGFkZGVkIGRlcHJlY2F0aW9uL2Z1dHVyZSB3YXJuaW5ncworIyAyMDA3LTA4LTI1IGZsICAgYWRkZWQgZG9jdHlwZSBob29rLCBhZGRlZCBwYXJzZXIgdmVyc2lvbiBhdHRyaWJ1dGUgZXRjCisjIDIwMDctMDgtMjYgZmwgICBhZGRlZCBuZXcgc2VyaWFsaXplciBjb2RlIChiZXR0ZXIgbmFtZXNwYWNlIGhhbmRsaW5nLCBldGMpCisjIDIwMDctMDgtMjcgZmwgICB3YXJuIGZvciBicm9rZW4gL3RhZyBzZWFyY2hlcyBvbiB0cmVlIGxldmVsCisjIDIwMDctMDktMDIgZmwgICBhZGRlZCBodG1sL3RleHQgbWV0aG9kcyB0byBzZXJpYWxpemVyIChleHBlcmltZW50YWwpCisjIDIwMDctMDktMDUgZmwgICBhZGRlZCBtZXRob2QgYXJndW1lbnQgdG8gdG9zdHJpbmcvdG9zdHJpbmdsaXN0CisjIDIwMDctMDktMDYgZmwgICBpbXByb3ZlZCBlcnJvciBoYW5kbGluZworIyAyMDA3LTA5LTEzIGZsICAgYWRkZWQgaXRlcnRleHQsIGl0ZXJmaW5kOyBhc3NvcnRlZCBjbGVhbnVwcworIyAyMDA3LTEyLTE1IGZsICAgYWRkZWQgQzE0TiBob29rcywgY29weSBtZXRob2QgKGV4cGVyaW1lbnRhbCkKKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDggYnkgRnJlZHJpayBMdW5kaC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIGZyZWRyaWtAcHl0aG9ud2FyZS5jb20KKyMgaHR0cDovL3d3dy5weXRob253YXJlLmNvbQorIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgRWxlbWVudFRyZWUgdG9vbGtpdCBpcworIworIyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwOCBieSBGcmVkcmlrIEx1bmRoCisjCisjIEJ5IG9idGFpbmluZywgdXNpbmcsIGFuZC9vciBjb3B5aW5nIHRoaXMgc29mdHdhcmUgYW5kL29yIGl0cworIyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24sIHlvdSBhZ3JlZSB0aGF0IHlvdSBoYXZlIHJlYWQsIHVuZGVyc3Rvb2QsCisjIGFuZCB3aWxsIGNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnM6CisjCisjIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisjIGl0cyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcworIyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluCisjIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24KKyMgbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mCisjIFNlY3JldCBMYWJzIEFCIG9yIHRoZSBhdXRob3Igbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5CisjIHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuCisjIHByaW9yIHBlcm1pc3Npb24uCisjCisjIFNFQ1JFVCBMQUJTIEFCIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRAorIyBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVC0KKyMgQUJJTElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIFNFQ1JFVCBMQUJTIEFCIE9SIFRIRSBBVVRIT1IKKyMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWQorIyBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyMgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKKyMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorIyBPRiBUSElTIFNPRlRXQVJFLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKyMgU2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9wc2YvbGljZW5zZSBmb3IgbGljZW5zaW5nIGRldGFpbHMuCisKK19fYWxsX18gPSBbCisgICAgIyBwdWJsaWMgc3ltYm9scworICAgICJDb21tZW50IiwKKyAgICAiZHVtcCIsCisgICAgIkVsZW1lbnQiLCAiRWxlbWVudFRyZWUiLAorICAgICJmcm9tc3RyaW5nIiwgImZyb21zdHJpbmdsaXN0IiwKKyAgICAiaXNlbGVtZW50IiwgIml0ZXJwYXJzZSIsCisgICAgInBhcnNlIiwgIlBhcnNlRXJyb3IiLAorICAgICJQSSIsICJQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24iLAorICAgICJRTmFtZSIsCisgICAgIlN1YkVsZW1lbnQiLAorICAgICJ0b3N0cmluZyIsICJ0b3N0cmluZ2xpc3QiLAorICAgICJUcmVlQnVpbGRlciIsCisgICAgIlZFUlNJT04iLAorICAgICJYTUwiLAorICAgICJYTUxQYXJzZXIiLCAiWE1MVHJlZUJ1aWxkZXIiLAorICAgIF0KKworVkVSU0lPTiA9ICIxLjMuMCIKKworIyMKKyMgVGhlIDxiPkVsZW1lbnQ8L2I+IHR5cGUgaXMgYSBmbGV4aWJsZSBjb250YWluZXIgb2JqZWN0LCBkZXNpZ25lZCB0bworIyBzdG9yZSBoaWVyYXJjaGljYWwgZGF0YSBzdHJ1Y3R1cmVzIGluIG1lbW9yeS4gVGhlIHR5cGUgY2FuIGJlCisjIGRlc2NyaWJlZCBhcyBhIGNyb3NzIGJldHdlZW4gYSBsaXN0IGFuZCBhIGRpY3Rpb25hcnkuCisjIDxwPgorIyBFYWNoIGVsZW1lbnQgaGFzIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIGl0OgorIyA8dWw+CisjIDxsaT5hIDxpPnRhZzwvaT4uIFRoaXMgaXMgYSBzdHJpbmcgaWRlbnRpZnlpbmcgd2hhdCBraW5kIG9mIGRhdGEKKyMgdGhpcyBlbGVtZW50IHJlcHJlc2VudHMgKHRoZSBlbGVtZW50IHR5cGUsIGluIG90aGVyIHdvcmRzKS48L2xpPgorIyA8bGk+YSBudW1iZXIgb2YgPGk+YXR0cmlidXRlczwvaT4sIHN0b3JlZCBpbiBhIFB5dGhvbiBkaWN0aW9uYXJ5LjwvbGk+CisjIDxsaT5hIDxpPnRleHQ8L2k+IHN0cmluZy48L2xpPgorIyA8bGk+YW4gb3B0aW9uYWwgPGk+dGFpbDwvaT4gc3RyaW5nLjwvbGk+CisjIDxsaT5hIG51bWJlciBvZiA8aT5jaGlsZCBlbGVtZW50czwvaT4sIHN0b3JlZCBpbiBhIFB5dGhvbiBzZXF1ZW5jZTwvbGk+CisjIDwvdWw+CisjCisjIFRvIGNyZWF0ZSBhbiBlbGVtZW50IGluc3RhbmNlLCB1c2UgdGhlIHtAbGluayAjRWxlbWVudH0gY29uc3RydWN0b3IKKyMgb3IgdGhlIHtAbGluayAjU3ViRWxlbWVudH0gZmFjdG9yeSBmdW5jdGlvbi4KKyMgPHA+CisjIFRoZSB7QGxpbmsgI0VsZW1lbnRUcmVlfSBjbGFzcyBjYW4gYmUgdXNlZCB0byB3cmFwIGFuIGVsZW1lbnQKKyMgc3RydWN0dXJlLCBhbmQgY29udmVydCBpdCBmcm9tIGFuZCB0byBYTUwuCisjIworCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2ltcG9ydCB3YXJuaW5ncworCisKK2NsYXNzIF9TaW1wbGVFbGVtZW50UGF0aChvYmplY3QpOgorICAgICMgZW11bGF0ZSBwcmUtMS4yIGZpbmQvZmluZHRleHQvZmluZGFsbCBiZWhhdmlvdXIKKyAgICBkZWYgZmluZChzZWxmLCBlbGVtZW50LCB0YWcsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgICAgIGZvciBlbGVtIGluIGVsZW1lbnQ6CisgICAgICAgICAgICBpZiBlbGVtLnRhZyA9PSB0YWc6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0KKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBkZWYgZmluZHRleHQoc2VsZiwgZWxlbWVudCwgdGFnLCBkZWZhdWx0PU5vbmUsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgICAgIGVsZW0gPSBzZWxmLmZpbmQoZWxlbWVudCwgdGFnKQorICAgICAgICBpZiBlbGVtIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgICAgICByZXR1cm4gZWxlbS50ZXh0IG9yICIiCisgICAgZGVmIGl0ZXJmaW5kKHNlbGYsIGVsZW1lbnQsIHRhZywgbmFtZXNwYWNlcz1Ob25lKToKKyAgICAgICAgaWYgdGFnWzozXSA9PSAiLi8vIjoKKyAgICAgICAgICAgIGZvciBlbGVtIGluIGVsZW1lbnQuaXRlcih0YWdbMzpdKToKKyAgICAgICAgICAgICAgICB5aWVsZCBlbGVtCisgICAgICAgIGZvciBlbGVtIGluIGVsZW1lbnQ6CisgICAgICAgICAgICBpZiBlbGVtLnRhZyA9PSB0YWc6CisgICAgICAgICAgICAgICAgeWllbGQgZWxlbQorICAgIGRlZiBmaW5kYWxsKHNlbGYsIGVsZW1lbnQsIHRhZywgbmFtZXNwYWNlcz1Ob25lKToKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyZmluZChlbGVtZW50LCB0YWcsIG5hbWVzcGFjZXMpKQorCit0cnk6CisgICAgZnJvbSAuIGltcG9ydCBFbGVtZW50UGF0aAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIEVsZW1lbnRQYXRoID0gX1NpbXBsZUVsZW1lbnRQYXRoKCkKKworIyMKKyMgUGFyc2VyIGVycm9yLiAgVGhpcyBpcyBhIHN1YmNsYXNzIG9mIDxiPlN5bnRheEVycm9yPC9iPi4KKyMgPHA+CisjIEluIGFkZGl0aW9uIHRvIHRoZSBleGNlcHRpb24gdmFsdWUsIGFuIGV4Y2VwdGlvbiBpbnN0YW5jZSBjb250YWlucyBhCisjIHNwZWNpZmljIGV4Y2VwdGlvbiBjb2RlIGluIHRoZSA8Yj5jb2RlPC9iPiBhdHRyaWJ1dGUsIGFuZCB0aGUgbGluZSBhbmQKKyMgY29sdW1uIG9mIHRoZSBlcnJvciBpbiB0aGUgPGI+cG9zaXRpb248L2I+IGF0dHJpYnV0ZS4KKworY2xhc3MgUGFyc2VFcnJvcihTeW50YXhFcnJvcik6CisgICAgcGFzcworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIENoZWNrcyBpZiBhbiBvYmplY3QgYXBwZWFycyB0byBiZSBhIHZhbGlkIGVsZW1lbnQgb2JqZWN0LgorIworIyBAcGFyYW0gQW4gZWxlbWVudCBpbnN0YW5jZS4KKyMgQHJldHVybiBBIHRydWUgdmFsdWUgaWYgdGhpcyBpcyBhbiBlbGVtZW50IG9iamVjdC4KKyMgQGRlZnJldHVybiBmbGFnCisKK2RlZiBpc2VsZW1lbnQoZWxlbWVudCk6CisgICAgIyBGSVhNRTogbm90IHN1cmUgYWJvdXQgdGhpczsgbWlnaHQgYmUgYSBiZXR0ZXIgaWRlYSB0byBsb29rCisgICAgIyBmb3IgdGFnL2F0dHJpYi90ZXh0IGF0dHJpYnV0ZXMKKyAgICByZXR1cm4gaXNpbnN0YW5jZShlbGVtZW50LCBFbGVtZW50KSBvciBoYXNhdHRyKGVsZW1lbnQsICJ0YWciKQorCisjIworIyBFbGVtZW50IGNsYXNzLiAgVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBFbGVtZW50IGludGVyZmFjZSwgYW5kCisjIHByb3ZpZGVzIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlLgorIyA8cD4KKyMgVGhlIGVsZW1lbnQgbmFtZSwgYXR0cmlidXRlIG5hbWVzLCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUKKyMgZWl0aGVyIEFTQ0lJIHN0cmluZ3MgKG9yZGluYXJ5IFB5dGhvbiBzdHJpbmdzIGNvbnRhaW5pbmcgb25seSA3LWJpdAorIyBBU0NJSSBjaGFyYWN0ZXJzKSBvciBVbmljb2RlIHN0cmluZ3MuCisjCisjIEBwYXJhbSB0YWcgVGhlIGVsZW1lbnQgbmFtZS4KKyMgQHBhcmFtIGF0dHJpYiBBbiBvcHRpb25hbCBkaWN0aW9uYXJ5LCBjb250YWluaW5nIGVsZW1lbnQgYXR0cmlidXRlcy4KKyMgQHBhcmFtICoqZXh0cmEgQWRkaXRpb25hbCBhdHRyaWJ1dGVzLCBnaXZlbiBhcyBrZXl3b3JkIGFyZ3VtZW50cy4KKyMgQHNlZSBFbGVtZW50CisjIEBzZWUgU3ViRWxlbWVudAorIyBAc2VlIENvbW1lbnQKKyMgQHNlZSBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KKworY2xhc3MgRWxlbWVudChvYmplY3QpOgorICAgICMgPHRhZyBhdHRyaWI+dGV4dDxjaGlsZC8+Li4uPC90YWc+dGFpbAorCisgICAgIyMKKyAgICAjIChBdHRyaWJ1dGUpIEVsZW1lbnQgdGFnLgorCisgICAgdGFnID0gTm9uZQorCisgICAgIyMKKyAgICAjIChBdHRyaWJ1dGUpIEVsZW1lbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkuICBXaGVyZSBwb3NzaWJsZSwgdXNlCisgICAgIyB7QGxpbmsgI0VsZW1lbnQuZ2V0fSwKKyAgICAjIHtAbGluayAjRWxlbWVudC5zZXR9LAorICAgICMge0BsaW5rICNFbGVtZW50LmtleXN9LCBhbmQKKyAgICAjIHtAbGluayAjRWxlbWVudC5pdGVtc30gdG8gYWNjZXNzCisgICAgIyBlbGVtZW50IGF0dHJpYnV0ZXMuCisKKyAgICBhdHRyaWIgPSBOb25lCisKKyAgICAjIworICAgICMgKEF0dHJpYnV0ZSkgVGV4dCBiZWZvcmUgZmlyc3Qgc3ViZWxlbWVudC4gIFRoaXMgaXMgZWl0aGVyIGEKKyAgICAjIHN0cmluZyBvciB0aGUgdmFsdWUgTm9uZS4gIE5vdGUgdGhhdCBpZiB0aGVyZSB3YXMgbm8gdGV4dCwgdGhpcworICAgICMgYXR0cmlidXRlIG1heSBiZSBlaXRoZXIgTm9uZSBvciBhbiBlbXB0eSBzdHJpbmcsIGRlcGVuZGluZyBvbgorICAgICMgdGhlIHBhcnNlci4KKworICAgIHRleHQgPSBOb25lCisKKyAgICAjIworICAgICMgKEF0dHJpYnV0ZSkgVGV4dCBhZnRlciB0aGlzIGVsZW1lbnQncyBlbmQgdGFnLCBidXQgYmVmb3JlIHRoZQorICAgICMgbmV4dCBzaWJsaW5nIGVsZW1lbnQncyBzdGFydCB0YWcuICBUaGlzIGlzIGVpdGhlciBhIHN0cmluZyBvcgorICAgICMgdGhlIHZhbHVlIE5vbmUuICBOb3RlIHRoYXQgaWYgdGhlcmUgd2FzIG5vIHRleHQsIHRoaXMgYXR0cmlidXRlCisgICAgIyBtYXkgYmUgZWl0aGVyIE5vbmUgb3IgYW4gZW1wdHkgc3RyaW5nLCBkZXBlbmRpbmcgb24gdGhlIHBhcnNlci4KKworICAgIHRhaWwgPSBOb25lICMgdGV4dCBhZnRlciBlbmQgdGFnLCBpZiBhbnkKKworICAgICMgY29uc3RydWN0b3IKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YWcsIGF0dHJpYj17fSwgKipleHRyYSk6CisgICAgICAgIGF0dHJpYiA9IGF0dHJpYi5jb3B5KCkKKyAgICAgICAgYXR0cmliLnVwZGF0ZShleHRyYSkKKyAgICAgICAgc2VsZi50YWcgPSB0YWcKKyAgICAgICAgc2VsZi5hdHRyaWIgPSBhdHRyaWIKKyAgICAgICAgc2VsZi5fY2hpbGRyZW4gPSBbXQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIjxFbGVtZW50ICVzIGF0IDB4JXg+IiAlIChyZXByKHNlbGYudGFnKSwgaWQoc2VsZikpCisKKyAgICAjIworICAgICMgQ3JlYXRlcyBhIG5ldyBlbGVtZW50IG9iamVjdCBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoaXMgZWxlbWVudC4KKyAgICAjCisgICAgIyBAcGFyYW0gdGFnIEVsZW1lbnQgdGFnLgorICAgICMgQHBhcmFtIGF0dHJpYiBFbGVtZW50IGF0dHJpYnV0ZXMsIGdpdmVuIGFzIGEgZGljdGlvbmFyeS4KKyAgICAjIEByZXR1cm4gQSBuZXcgZWxlbWVudCBpbnN0YW5jZS4KKworICAgIGRlZiBtYWtlZWxlbWVudChzZWxmLCB0YWcsIGF0dHJpYik6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyh0YWcsIGF0dHJpYikKKworICAgICMjCisgICAgIyAoRXhwZXJpbWVudGFsKSBDb3BpZXMgdGhlIGN1cnJlbnQgZWxlbWVudC4gIFRoaXMgY3JlYXRlcyBhCisgICAgIyBzaGFsbG93IGNvcHk7IHN1YmVsZW1lbnRzIHdpbGwgYmUgc2hhcmVkIHdpdGggdGhlIG9yaWdpbmFsIHRyZWUuCisgICAgIworICAgICMgQHJldHVybiBBIG5ldyBlbGVtZW50IGluc3RhbmNlLgorCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgIGVsZW0gPSBzZWxmLm1ha2VlbGVtZW50KHNlbGYudGFnLCBzZWxmLmF0dHJpYikKKyAgICAgICAgZWxlbS50ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIGVsZW0udGFpbCA9IHNlbGYudGFpbAorICAgICAgICBlbGVtWzpdID0gc2VsZgorICAgICAgICByZXR1cm4gZWxlbQorCisgICAgIyMKKyAgICAjIFJldHVybnMgdGhlIG51bWJlciBvZiBzdWJlbGVtZW50cy4gIE5vdGUgdGhhdCB0aGlzIG9ubHkgY291bnRzCisgICAgIyBmdWxsIGVsZW1lbnRzOyB0byBjaGVjayBpZiB0aGVyZSdzIGFueSBjb250ZW50IGluIGFuIGVsZW1lbnQsIHlvdQorICAgICMgaGF2ZSB0byBjaGVjayBib3RoIHRoZSBsZW5ndGggYW5kIHRoZSA8Yj50ZXh0PC9iPiBhdHRyaWJ1dGUuCisgICAgIworICAgICMgQHJldHVybiBUaGUgbnVtYmVyIG9mIHN1YmVsZW1lbnRzLgorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fY2hpbGRyZW4pCisKKyAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAiVGhlIGJlaGF2aW9yIG9mIHRoaXMgbWV0aG9kIHdpbGwgY2hhbmdlIGluIGZ1dHVyZSB2ZXJzaW9ucy4gICIKKyAgICAgICAgICAgICJVc2Ugc3BlY2lmaWMgJ2xlbihlbGVtKScgb3IgJ2VsZW0gaXMgbm90IE5vbmUnIHRlc3QgaW5zdGVhZC4iLAorICAgICAgICAgICAgRnV0dXJlV2FybmluZywgc3RhY2tsZXZlbD0yCisgICAgICAgICAgICApCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fY2hpbGRyZW4pICE9IDAgIyBlbXVsYXRlIG9sZCBiZWhhdmlvdXIsIGZvciBub3cKKworICAgICMjCisgICAgIyBSZXR1cm5zIHRoZSBnaXZlbiBzdWJlbGVtZW50LCBieSBpbmRleC4KKyAgICAjCisgICAgIyBAcGFyYW0gaW5kZXggV2hhdCBzdWJlbGVtZW50IHRvIHJldHVybi4KKyAgICAjIEByZXR1cm4gVGhlIGdpdmVuIHN1YmVsZW1lbnQuCisgICAgIyBAZXhjZXB0aW9uIEluZGV4RXJyb3IgSWYgdGhlIGdpdmVuIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRyZW5baW5kZXhdCisKKyAgICAjIworICAgICMgUmVwbGFjZXMgdGhlIGdpdmVuIHN1YmVsZW1lbnQsIGJ5IGluZGV4LgorICAgICMKKyAgICAjIEBwYXJhbSBpbmRleCBXaGF0IHN1YmVsZW1lbnQgdG8gcmVwbGFjZS4KKyAgICAjIEBwYXJhbSBlbGVtZW50IFRoZSBuZXcgZWxlbWVudCB2YWx1ZS4KKyAgICAjIEBleGNlcHRpb24gSW5kZXhFcnJvciBJZiB0aGUgZ2l2ZW4gZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBpbmRleCwgZWxlbWVudCk6CisgICAgICAgICMgaWYgaXNpbnN0YW5jZShpbmRleCwgc2xpY2UpOgorICAgICAgICAjICAgICBmb3IgZWx0IGluIGVsZW1lbnQ6CisgICAgICAgICMgICAgICAgICBhc3NlcnQgaXNlbGVtZW50KGVsdCkKKyAgICAgICAgIyBlbHNlOgorICAgICAgICAjICAgICBhc3NlcnQgaXNlbGVtZW50KGVsZW1lbnQpCisgICAgICAgIHNlbGYuX2NoaWxkcmVuW2luZGV4XSA9IGVsZW1lbnQKKworICAgICMjCisgICAgIyBEZWxldGVzIHRoZSBnaXZlbiBzdWJlbGVtZW50LCBieSBpbmRleC4KKyAgICAjCisgICAgIyBAcGFyYW0gaW5kZXggV2hhdCBzdWJlbGVtZW50IHRvIGRlbGV0ZS4KKyAgICAjIEBleGNlcHRpb24gSW5kZXhFcnJvciBJZiB0aGUgZ2l2ZW4gZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgIGRlbCBzZWxmLl9jaGlsZHJlbltpbmRleF0KKworICAgICMjCisgICAgIyBBZGRzIGEgc3ViZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoaXMgZWxlbWVudC4gIEluIGRvY3VtZW50IG9yZGVyLAorICAgICMgdGhlIG5ldyBlbGVtZW50IHdpbGwgYXBwZWFyIGFmdGVyIHRoZSBsYXN0IGV4aXN0aW5nIHN1YmVsZW1lbnQgKG9yCisgICAgIyBkaXJlY3RseSBhZnRlciB0aGUgdGV4dCwgaWYgaXQncyB0aGUgZmlyc3Qgc3ViZWxlbWVudCksIGJ1dCBiZWZvcmUKKyAgICAjIHRoZSBlbmQgdGFnIGZvciB0aGlzIGVsZW1lbnQuCisgICAgIworICAgICMgQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gYWRkLgorCisgICAgZGVmIGFwcGVuZChzZWxmLCBlbGVtZW50KToKKyAgICAgICAgIyBhc3NlcnQgaXNlbGVtZW50KGVsZW1lbnQpCisgICAgICAgIHNlbGYuX2NoaWxkcmVuLmFwcGVuZChlbGVtZW50KQorCisgICAgIyMKKyAgICAjIEFwcGVuZHMgc3ViZWxlbWVudHMgZnJvbSBhIHNlcXVlbmNlLgorICAgICMKKyAgICAjIEBwYXJhbSBlbGVtZW50cyBBIHNlcXVlbmNlIG9iamVjdCB3aXRoIHplcm8gb3IgbW9yZSBlbGVtZW50cy4KKyAgICAjIEBzaW5jZSAxLjMKKworICAgIGRlZiBleHRlbmQoc2VsZiwgZWxlbWVudHMpOgorICAgICAgICAjIGZvciBlbGVtZW50IGluIGVsZW1lbnRzOgorICAgICAgICAjICAgICBhc3NlcnQgaXNlbGVtZW50KGVsZW1lbnQpCisgICAgICAgIHNlbGYuX2NoaWxkcmVuLmV4dGVuZChlbGVtZW50cykKKworICAgICMjCisgICAgIyBJbnNlcnRzIGEgc3ViZWxlbWVudCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gaW4gdGhpcyBlbGVtZW50LgorICAgICMKKyAgICAjIEBwYXJhbSBpbmRleCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBzdWJlbGVtZW50LgorCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgZWxlbWVudCk6CisgICAgICAgICMgYXNzZXJ0IGlzZWxlbWVudChlbGVtZW50KQorICAgICAgICBzZWxmLl9jaGlsZHJlbi5pbnNlcnQoaW5kZXgsIGVsZW1lbnQpCisKKyAgICAjIworICAgICMgUmVtb3ZlcyBhIG1hdGNoaW5nIHN1YmVsZW1lbnQuICBVbmxpa2UgdGhlIDxiPmZpbmQ8L2I+IG1ldGhvZHMsCisgICAgIyB0aGlzIG1ldGhvZCBjb21wYXJlcyBlbGVtZW50cyBiYXNlZCBvbiBpZGVudGl0eSwgbm90IG9uIHRhZworICAgICMgdmFsdWUgb3IgY29udGVudHMuICBUbyByZW1vdmUgc3ViZWxlbWVudHMgYnkgb3RoZXIgbWVhbnMsIHRoZQorICAgICMgZWFzaWVzdCB3YXkgaXMgb2Z0ZW4gdG8gdXNlIGEgbGlzdCBjb21wcmVoZW5zaW9uIHRvIHNlbGVjdCB3aGF0CisgICAgIyBlbGVtZW50cyB0byBrZWVwLCBhbmQgdXNlIHNsaWNlIGFzc2lnbm1lbnQgdG8gdXBkYXRlIHRoZSBwYXJlbnQKKyAgICAjIGVsZW1lbnQuCisgICAgIworICAgICMgQHBhcmFtIGVsZW1lbnQgV2hhdCBlbGVtZW50IHRvIHJlbW92ZS4KKyAgICAjIEBleGNlcHRpb24gVmFsdWVFcnJvciBJZiBhIG1hdGNoaW5nIGVsZW1lbnQgY291bGQgbm90IGJlIGZvdW5kLgorCisgICAgZGVmIHJlbW92ZShzZWxmLCBlbGVtZW50KToKKyAgICAgICAgIyBhc3NlcnQgaXNlbGVtZW50KGVsZW1lbnQpCisgICAgICAgIHNlbGYuX2NoaWxkcmVuLnJlbW92ZShlbGVtZW50KQorCisgICAgIyMKKyAgICAjIChEZXByZWNhdGVkKSBSZXR1cm5zIGFsbCBzdWJlbGVtZW50cy4gIFRoZSBlbGVtZW50cyBhcmUgcmV0dXJuZWQKKyAgICAjIGluIGRvY3VtZW50IG9yZGVyLgorICAgICMKKyAgICAjIEByZXR1cm4gQSBsaXN0IG9mIHN1YmVsZW1lbnRzLgorICAgICMgQGRlZnJldHVybiBsaXN0IG9mIEVsZW1lbnQgaW5zdGFuY2VzCisKKyAgICBkZWYgZ2V0Y2hpbGRyZW4oc2VsZik6CisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAiVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gICIKKyAgICAgICAgICAgICJVc2UgJ2xpc3QoZWxlbSknIG9yIGl0ZXJhdGlvbiBvdmVyIGVsZW0gaW5zdGVhZC4iLAorICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIKKyAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkcmVuCisKKyAgICAjIworICAgICMgRmluZHMgdGhlIGZpcnN0IG1hdGNoaW5nIHN1YmVsZW1lbnQsIGJ5IHRhZyBuYW1lIG9yIHBhdGguCisgICAgIworICAgICMgQHBhcmFtIHBhdGggV2hhdCBlbGVtZW50IHRvIGxvb2sgZm9yLgorICAgICMgQGtleXBhcmFtIG5hbWVzcGFjZXMgT3B0aW9uYWwgbmFtZXNwYWNlIHByZWZpeCBtYXAuCisgICAgIyBAcmV0dXJuIFRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50LCBvciBOb25lIGlmIG5vIGVsZW1lbnQgd2FzIGZvdW5kLgorICAgICMgQGRlZnJldHVybiBFbGVtZW50IG9yIE5vbmUKKworICAgIGRlZiBmaW5kKHNlbGYsIHBhdGgsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgICAgIHJldHVybiBFbGVtZW50UGF0aC5maW5kKHNlbGYsIHBhdGgsIG5hbWVzcGFjZXMpCisKKyAgICAjIworICAgICMgRmluZHMgdGV4dCBmb3IgdGhlIGZpcnN0IG1hdGNoaW5nIHN1YmVsZW1lbnQsIGJ5IHRhZyBuYW1lIG9yIHBhdGguCisgICAgIworICAgICMgQHBhcmFtIHBhdGggV2hhdCBlbGVtZW50IHRvIGxvb2sgZm9yLgorICAgICMgQHBhcmFtIGRlZmF1bHQgV2hhdCB0byByZXR1cm4gaWYgdGhlIGVsZW1lbnQgd2FzIG5vdCBmb3VuZC4KKyAgICAjIEBrZXlwYXJhbSBuYW1lc3BhY2VzIE9wdGlvbmFsIG5hbWVzcGFjZSBwcmVmaXggbWFwLgorICAgICMgQHJldHVybiBUaGUgdGV4dCBjb250ZW50IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50LCBvciB0aGUKKyAgICAjICAgICBkZWZhdWx0IHZhbHVlIG5vIGVsZW1lbnQgd2FzIGZvdW5kLiAgTm90ZSB0aGF0IGlmIHRoZSBlbGVtZW50CisgICAgIyAgICAgaXMgZm91bmQsIGJ1dCBoYXMgbm8gdGV4dCBjb250ZW50LCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuCisgICAgIyAgICAgZW1wdHkgc3RyaW5nLgorICAgICMgQGRlZnJldHVybiBzdHJpbmcKKworICAgIGRlZiBmaW5kdGV4dChzZWxmLCBwYXRoLCBkZWZhdWx0PU5vbmUsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgICAgIHJldHVybiBFbGVtZW50UGF0aC5maW5kdGV4dChzZWxmLCBwYXRoLCBkZWZhdWx0LCBuYW1lc3BhY2VzKQorCisgICAgIyMKKyAgICAjIEZpbmRzIGFsbCBtYXRjaGluZyBzdWJlbGVtZW50cywgYnkgdGFnIG5hbWUgb3IgcGF0aC4KKyAgICAjCisgICAgIyBAcGFyYW0gcGF0aCBXaGF0IGVsZW1lbnQgdG8gbG9vayBmb3IuCisgICAgIyBAa2V5cGFyYW0gbmFtZXNwYWNlcyBPcHRpb25hbCBuYW1lc3BhY2UgcHJlZml4IG1hcC4KKyAgICAjIEByZXR1cm4gQSBsaXN0IG9yIG90aGVyIHNlcXVlbmNlIGNvbnRhaW5pbmcgYWxsIG1hdGNoaW5nIGVsZW1lbnRzLAorICAgICMgICAgaW4gZG9jdW1lbnQgb3JkZXIuCisgICAgIyBAZGVmcmV0dXJuIGxpc3Qgb2YgRWxlbWVudCBpbnN0YW5jZXMKKworICAgIGRlZiBmaW5kYWxsKHNlbGYsIHBhdGgsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgICAgIHJldHVybiBFbGVtZW50UGF0aC5maW5kYWxsKHNlbGYsIHBhdGgsIG5hbWVzcGFjZXMpCisKKyAgICAjIworICAgICMgRmluZHMgYWxsIG1hdGNoaW5nIHN1YmVsZW1lbnRzLCBieSB0YWcgbmFtZSBvciBwYXRoLgorICAgICMKKyAgICAjIEBwYXJhbSBwYXRoIFdoYXQgZWxlbWVudCB0byBsb29rIGZvci4KKyAgICAjIEBrZXlwYXJhbSBuYW1lc3BhY2VzIE9wdGlvbmFsIG5hbWVzcGFjZSBwcmVmaXggbWFwLgorICAgICMgQHJldHVybiBBbiBpdGVyYXRvciBvciBzZXF1ZW5jZSBjb250YWluaW5nIGFsbCBtYXRjaGluZyBlbGVtZW50cywKKyAgICAjICAgIGluIGRvY3VtZW50IG9yZGVyLgorICAgICMgQGRlZnJldHVybiBhIGdlbmVyYXRlZCBzZXF1ZW5jZSBvZiBFbGVtZW50IGluc3RhbmNlcworCisgICAgZGVmIGl0ZXJmaW5kKHNlbGYsIHBhdGgsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgICAgIHJldHVybiBFbGVtZW50UGF0aC5pdGVyZmluZChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzKQorCisgICAgIyMKKyAgICAjIFJlc2V0cyBhbiBlbGVtZW50LiAgVGhpcyBmdW5jdGlvbiByZW1vdmVzIGFsbCBzdWJlbGVtZW50cywgY2xlYXJzCisgICAgIyBhbGwgYXR0cmlidXRlcywgYW5kIHNldHMgdGhlIDxiPnRleHQ8L2I+IGFuZCA8Yj50YWlsPC9iPiBhdHRyaWJ1dGVzCisgICAgIyB0byBOb25lLgorCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLmF0dHJpYi5jbGVhcigpCisgICAgICAgIHNlbGYuX2NoaWxkcmVuID0gW10KKyAgICAgICAgc2VsZi50ZXh0ID0gc2VsZi50YWlsID0gTm9uZQorCisgICAgIyMKKyAgICAjIEdldHMgYW4gZWxlbWVudCBhdHRyaWJ1dGUuICBFcXVpdmFsZW50IHRvIDxiPmF0dHJpYi5nZXQ8L2I+LCBidXQKKyAgICAjIHNvbWUgaW1wbGVtZW50YXRpb25zIG1heSBoYW5kbGUgdGhpcyBhIGJpdCBtb3JlIGVmZmljaWVudGx5LgorICAgICMKKyAgICAjIEBwYXJhbSBrZXkgV2hhdCBhdHRyaWJ1dGUgdG8gbG9vayBmb3IuCisgICAgIyBAcGFyYW0gZGVmYXVsdCBXaGF0IHRvIHJldHVybiBpZiB0aGUgYXR0cmlidXRlIHdhcyBub3QgZm91bmQuCisgICAgIyBAcmV0dXJuIFRoZSBhdHRyaWJ1dGUgdmFsdWUsIG9yIHRoZSBkZWZhdWx0IHZhbHVlLCBpZiB0aGUKKyAgICAjICAgICBhdHRyaWJ1dGUgd2FzIG5vdCBmb3VuZC4KKyAgICAjIEBkZWZyZXR1cm4gc3RyaW5nIG9yIE5vbmUKKworICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5hdHRyaWIuZ2V0KGtleSwgZGVmYXVsdCkKKworICAgICMjCisgICAgIyBTZXRzIGFuIGVsZW1lbnQgYXR0cmlidXRlLiAgRXF1aXZhbGVudCB0byA8Yj5hdHRyaWJba2V5XSA9IHZhbHVlPC9iPiwKKyAgICAjIGJ1dCBzb21lIGltcGxlbWVudGF0aW9ucyBtYXkgaGFuZGxlIHRoaXMgYSBiaXQgbW9yZSBlZmZpY2llbnRseS4KKyAgICAjCisgICAgIyBAcGFyYW0ga2V5IFdoYXQgYXR0cmlidXRlIHRvIHNldC4KKyAgICAjIEBwYXJhbSB2YWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlLgorCisgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgc2VsZi5hdHRyaWJba2V5XSA9IHZhbHVlCisKKyAgICAjIworICAgICMgR2V0cyBhIGxpc3Qgb2YgYXR0cmlidXRlIG5hbWVzLiAgVGhlIG5hbWVzIGFyZSByZXR1cm5lZCBpbiBhbgorICAgICMgYXJiaXRyYXJ5IG9yZGVyIChqdXN0IGxpa2UgZm9yIGFuIG9yZGluYXJ5IFB5dGhvbiBkaWN0aW9uYXJ5KS4KKyAgICAjIEVxdWl2YWxlbnQgdG8gPGI+YXR0cmliLmtleXMoKTwvYj4uCisgICAgIworICAgICMgQHJldHVybiBBIGxpc3Qgb2YgZWxlbWVudCBhdHRyaWJ1dGUgbmFtZXMuCisgICAgIyBAZGVmcmV0dXJuIGxpc3Qgb2Ygc3RyaW5ncworCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmF0dHJpYi5rZXlzKCkKKworICAgICMjCisgICAgIyBHZXRzIGVsZW1lbnQgYXR0cmlidXRlcywgYXMgYSBzZXF1ZW5jZS4gIFRoZSBhdHRyaWJ1dGVzIGFyZQorICAgICMgcmV0dXJuZWQgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyLiAgRXF1aXZhbGVudCB0byA8Yj5hdHRyaWIuaXRlbXMoKTwvYj4uCisgICAgIworICAgICMgQHJldHVybiBBIGxpc3Qgb2YgKG5hbWUsIHZhbHVlKSB0dXBsZXMgZm9yIGFsbCBhdHRyaWJ1dGVzLgorICAgICMgQGRlZnJldHVybiBsaXN0IG9mIChzdHJpbmcsIHN0cmluZykgdHVwbGVzCisKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmF0dHJpYi5pdGVtcygpCisKKyAgICAjIworICAgICMgQ3JlYXRlcyBhIHRyZWUgaXRlcmF0b3IuICBUaGUgaXRlcmF0b3IgbG9vcHMgb3ZlciB0aGlzIGVsZW1lbnQKKyAgICAjIGFuZCBhbGwgc3ViZWxlbWVudHMsIGluIGRvY3VtZW50IG9yZGVyLCBhbmQgcmV0dXJucyBhbGwgZWxlbWVudHMKKyAgICAjIHdpdGggYSBtYXRjaGluZyB0YWcuCisgICAgIyA8cD4KKyAgICAjIElmIHRoZSB0cmVlIHN0cnVjdHVyZSBpcyBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLCBuZXcgb3IgcmVtb3ZlZAorICAgICMgZWxlbWVudHMgbWF5IG9yIG1heSBub3QgYmUgaW5jbHVkZWQuICBUbyBnZXQgYSBzdGFibGUgc2V0LCB1c2UgdGhlCisgICAgIyBsaXN0KCkgZnVuY3Rpb24gb24gdGhlIGl0ZXJhdG9yLCBhbmQgbG9vcCBvdmVyIHRoZSByZXN1bHRpbmcgbGlzdC4KKyAgICAjCisgICAgIyBAcGFyYW0gdGFnIFdoYXQgdGFncyB0byBsb29rIGZvciAoZGVmYXVsdCBpcyB0byByZXR1cm4gYWxsIGVsZW1lbnRzKS4KKyAgICAjIEByZXR1cm4gQW4gaXRlcmF0b3IgY29udGFpbmluZyBhbGwgdGhlIG1hdGNoaW5nIGVsZW1lbnRzLgorICAgICMgQGRlZnJldHVybiBpdGVyYXRvcgorCisgICAgZGVmIGl0ZXIoc2VsZiwgdGFnPU5vbmUpOgorICAgICAgICBpZiB0YWcgPT0gIioiOgorICAgICAgICAgICAgdGFnID0gTm9uZQorICAgICAgICBpZiB0YWcgaXMgTm9uZSBvciBzZWxmLnRhZyA9PSB0YWc6CisgICAgICAgICAgICB5aWVsZCBzZWxmCisgICAgICAgIGZvciBlIGluIHNlbGYuX2NoaWxkcmVuOgorICAgICAgICAgICAgZm9yIGUgaW4gZS5pdGVyKHRhZyk6CisgICAgICAgICAgICAgICAgeWllbGQgZQorCisgICAgIyBjb21wYXRpYmlsaXR5CisgICAgZGVmIGdldGl0ZXJhdG9yKHNlbGYsIHRhZz1Ob25lKToKKyAgICAgICAgIyBDaGFuZ2UgZm9yIGEgRGVwcmVjYXRpb25XYXJuaW5nIGluIDEuNAorICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgIlRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuICAiCisgICAgICAgICAgICAiVXNlICdlbGVtLml0ZXIoKScgb3IgJ2xpc3QoZWxlbS5pdGVyKCkpJyBpbnN0ZWFkLiIsCisgICAgICAgICAgICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIKKyAgICAgICAgKQorICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXIodGFnKSkKKworICAgICMjCisgICAgIyBDcmVhdGVzIGEgdGV4dCBpdGVyYXRvci4gIFRoZSBpdGVyYXRvciBsb29wcyBvdmVyIHRoaXMgZWxlbWVudAorICAgICMgYW5kIGFsbCBzdWJlbGVtZW50cywgaW4gZG9jdW1lbnQgb3JkZXIsIGFuZCByZXR1cm5zIGFsbCBpbm5lcgorICAgICMgdGV4dC4KKyAgICAjCisgICAgIyBAcmV0dXJuIEFuIGl0ZXJhdG9yIGNvbnRhaW5pbmcgYWxsIGlubmVyIHRleHQuCisgICAgIyBAZGVmcmV0dXJuIGl0ZXJhdG9yCisKKyAgICBkZWYgaXRlcnRleHQoc2VsZik6CisgICAgICAgIHRhZyA9IHNlbGYudGFnCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRhZywgYmFzZXN0cmluZykgYW5kIHRhZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnRleHQ6CisgICAgICAgICAgICB5aWVsZCBzZWxmLnRleHQKKyAgICAgICAgZm9yIGUgaW4gc2VsZjoKKyAgICAgICAgICAgIGZvciBzIGluIGUuaXRlcnRleHQoKToKKyAgICAgICAgICAgICAgICB5aWVsZCBzCisgICAgICAgICAgICBpZiBlLnRhaWw6CisgICAgICAgICAgICAgICAgeWllbGQgZS50YWlsCisKKyMgY29tcGF0aWJpbGl0eQorX0VsZW1lbnQgPSBfRWxlbWVudEludGVyZmFjZSA9IEVsZW1lbnQKKworIyMKKyMgU3ViZWxlbWVudCBmYWN0b3J5LiAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGFuIGVsZW1lbnQgaW5zdGFuY2UsIGFuZAorIyBhcHBlbmRzIGl0IHRvIGFuIGV4aXN0aW5nIGVsZW1lbnQuCisjIDxwPgorIyBUaGUgZWxlbWVudCBuYW1lLCBhdHRyaWJ1dGUgbmFtZXMsIGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZQorIyBlaXRoZXIgOC1iaXQgQVNDSUkgc3RyaW5ncyBvciBVbmljb2RlIHN0cmluZ3MuCisjCisjIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBlbGVtZW50LgorIyBAcGFyYW0gdGFnIFRoZSBzdWJlbGVtZW50IG5hbWUuCisjIEBwYXJhbSBhdHRyaWIgQW4gb3B0aW9uYWwgZGljdGlvbmFyeSwgY29udGFpbmluZyBlbGVtZW50IGF0dHJpYnV0ZXMuCisjIEBwYXJhbSAqKmV4dHJhIEFkZGl0aW9uYWwgYXR0cmlidXRlcywgZ2l2ZW4gYXMga2V5d29yZCBhcmd1bWVudHMuCisjIEByZXR1cm4gQW4gZWxlbWVudCBpbnN0YW5jZS4KKyMgQGRlZnJldHVybiBFbGVtZW50CisKK2RlZiBTdWJFbGVtZW50KHBhcmVudCwgdGFnLCBhdHRyaWI9e30sICoqZXh0cmEpOgorICAgIGF0dHJpYiA9IGF0dHJpYi5jb3B5KCkKKyAgICBhdHRyaWIudXBkYXRlKGV4dHJhKQorICAgIGVsZW1lbnQgPSBwYXJlbnQubWFrZWVsZW1lbnQodGFnLCBhdHRyaWIpCisgICAgcGFyZW50LmFwcGVuZChlbGVtZW50KQorICAgIHJldHVybiBlbGVtZW50CisKKyMjCisjIENvbW1lbnQgZWxlbWVudCBmYWN0b3J5LiAgVGhpcyBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZXMgYSBzcGVjaWFsCisjIGVsZW1lbnQgdGhhdCB3aWxsIGJlIHNlcmlhbGl6ZWQgYXMgYW4gWE1MIGNvbW1lbnQgYnkgdGhlIHN0YW5kYXJkCisjIHNlcmlhbGl6ZXIuCisjIDxwPgorIyBUaGUgY29tbWVudCBzdHJpbmcgY2FuIGJlIGVpdGhlciBhbiA4LWJpdCBBU0NJSSBzdHJpbmcgb3IgYSBVbmljb2RlCisjIHN0cmluZy4KKyMKKyMgQHBhcmFtIHRleHQgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29tbWVudCBzdHJpbmcuCisjIEByZXR1cm4gQW4gZWxlbWVudCBpbnN0YW5jZSwgcmVwcmVzZW50aW5nIGEgY29tbWVudC4KKyMgQGRlZnJldHVybiBFbGVtZW50CisKK2RlZiBDb21tZW50KHRleHQ9Tm9uZSk6CisgICAgZWxlbWVudCA9IEVsZW1lbnQoQ29tbWVudCkKKyAgICBlbGVtZW50LnRleHQgPSB0ZXh0CisgICAgcmV0dXJuIGVsZW1lbnQKKworIyMKKyMgUEkgZWxlbWVudCBmYWN0b3J5LiAgVGhpcyBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZXMgYSBzcGVjaWFsIGVsZW1lbnQKKyMgdGhhdCB3aWxsIGJlIHNlcmlhbGl6ZWQgYXMgYW4gWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYnkgdGhlIHN0YW5kYXJkCisjIHNlcmlhbGl6ZXIuCisjCisjIEBwYXJhbSB0YXJnZXQgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgUEkgdGFyZ2V0LgorIyBAcGFyYW0gdGV4dCBBIHN0cmluZyBjb250YWluaW5nIHRoZSBQSSBjb250ZW50cywgaWYgYW55LgorIyBAcmV0dXJuIEFuIGVsZW1lbnQgaW5zdGFuY2UsIHJlcHJlc2VudGluZyBhIFBJLgorIyBAZGVmcmV0dXJuIEVsZW1lbnQKKworZGVmIFByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIHRleHQ9Tm9uZSk6CisgICAgZWxlbWVudCA9IEVsZW1lbnQoUHJvY2Vzc2luZ0luc3RydWN0aW9uKQorICAgIGVsZW1lbnQudGV4dCA9IHRhcmdldAorICAgIGlmIHRleHQ6CisgICAgICAgIGVsZW1lbnQudGV4dCA9IGVsZW1lbnQudGV4dCArICIgIiArIHRleHQKKyAgICByZXR1cm4gZWxlbWVudAorCitQSSA9IFByb2Nlc3NpbmdJbnN0cnVjdGlvbgorCisjIworIyBRTmFtZSB3cmFwcGVyLiAgVGhpcyBjYW4gYmUgdXNlZCB0byB3cmFwIGEgUU5hbWUgYXR0cmlidXRlIHZhbHVlLCBpbgorIyBvcmRlciB0byBnZXQgcHJvcGVyIG5hbWVzcGFjZSBoYW5kbGluZyBvbiBvdXRwdXQuCisjCisjIEBwYXJhbSB0ZXh0IEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFFOYW1lIHZhbHVlLCBpbiB0aGUgZm9ybSB7dXJpfWxvY2FsLAorIyAgICAgb3IsIGlmIHRoZSB0YWcgYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBVUkkgcGFydCBvZiBhIFFOYW1lLgorIyBAcGFyYW0gdGFnIE9wdGlvbmFsIHRhZy4gIElmIGdpdmVuLCB0aGUgZmlyc3QgYXJndW1lbnQgaXMgaW50ZXJwcmV0ZWQgYXMKKyMgICAgIGFuIFVSSSwgYW5kIHRoaXMgYXJndW1lbnQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBsb2NhbCBuYW1lLgorIyBAcmV0dXJuIEFuIG9wYXF1ZSBvYmplY3QsIHJlcHJlc2VudGluZyB0aGUgUU5hbWUuCisKK2NsYXNzIFFOYW1lKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHRfb3JfdXJpLCB0YWc9Tm9uZSk6CisgICAgICAgIGlmIHRhZzoKKyAgICAgICAgICAgIHRleHRfb3JfdXJpID0gInslc30lcyIgJSAodGV4dF9vcl91cmksIHRhZykKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dF9vcl91cmkKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGV4dAorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goc2VsZi50ZXh0KQorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgUU5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLnRleHQsIG90aGVyLnRleHQpCisgICAgICAgIHJldHVybiBjbXAoc2VsZi50ZXh0LCBvdGhlcikKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIworIyBFbGVtZW50VHJlZSB3cmFwcGVyIGNsYXNzLiAgVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGVudGlyZSBlbGVtZW50CisjIGhpZXJhcmNoeSwgYW5kIGFkZHMgc29tZSBleHRyYSBzdXBwb3J0IGZvciBzZXJpYWxpemF0aW9uIHRvIGFuZCBmcm9tCisjIHN0YW5kYXJkIFhNTC4KKyMKKyMgQHBhcmFtIGVsZW1lbnQgT3B0aW9uYWwgcm9vdCBlbGVtZW50LgorIyBAa2V5cGFyYW0gZmlsZSBPcHRpb25hbCBmaWxlIGhhbmRsZSBvciBmaWxlIG5hbWUuICBJZiBnaXZlbiwgdGhlCisjICAgICB0cmVlIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoaXMgWE1MIGZpbGUuCisKK2NsYXNzIEVsZW1lbnRUcmVlKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbWVudD1Ob25lLCBmaWxlPU5vbmUpOgorICAgICAgICAjIGFzc2VydCBlbGVtZW50IGlzIE5vbmUgb3IgaXNlbGVtZW50KGVsZW1lbnQpCisgICAgICAgIHNlbGYuX3Jvb3QgPSBlbGVtZW50ICMgZmlyc3Qgbm9kZQorICAgICAgICBpZiBmaWxlOgorICAgICAgICAgICAgc2VsZi5wYXJzZShmaWxlKQorCisgICAgIyMKKyAgICAjIEdldHMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhpcyB0cmVlLgorICAgICMKKyAgICAjIEByZXR1cm4gQW4gZWxlbWVudCBpbnN0YW5jZS4KKyAgICAjIEBkZWZyZXR1cm4gRWxlbWVudAorCisgICAgZGVmIGdldHJvb3Qoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9yb290CisKKyAgICAjIworICAgICMgUmVwbGFjZXMgdGhlIHJvb3QgZWxlbWVudCBmb3IgdGhpcyB0cmVlLiAgVGhpcyBkaXNjYXJkcyB0aGUKKyAgICAjIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIHRyZWUsIGFuZCByZXBsYWNlcyBpdCB3aXRoIHRoZSBnaXZlbgorICAgICMgZWxlbWVudC4gIFVzZSB3aXRoIGNhcmUuCisgICAgIworICAgICMgQHBhcmFtIGVsZW1lbnQgQW4gZWxlbWVudCBpbnN0YW5jZS4KKworICAgIGRlZiBfc2V0cm9vdChzZWxmLCBlbGVtZW50KToKKyAgICAgICAgIyBhc3NlcnQgaXNlbGVtZW50KGVsZW1lbnQpCisgICAgICAgIHNlbGYuX3Jvb3QgPSBlbGVtZW50CisKKyAgICAjIworICAgICMgTG9hZHMgYW4gZXh0ZXJuYWwgWE1MIGRvY3VtZW50IGludG8gdGhpcyBlbGVtZW50IHRyZWUuCisgICAgIworICAgICMgQHBhcmFtIHNvdXJjZSBBIGZpbGUgbmFtZSBvciBmaWxlIG9iamVjdC4gIElmIGEgZmlsZSBvYmplY3QgaXMKKyAgICAjICAgICBnaXZlbiwgaXQgb25seSBoYXMgdG8gaW1wbGVtZW50IGEgPGI+cmVhZChuKTwvYj4gbWV0aG9kLgorICAgICMgQGtleXBhcmFtIHBhcnNlciBBbiBvcHRpb25hbCBwYXJzZXIgaW5zdGFuY2UuICBJZiBub3QgZ2l2ZW4sIHRoZQorICAgICMgICAgIHN0YW5kYXJkIHtAbGluayBYTUxQYXJzZXJ9IHBhcnNlciBpcyB1c2VkLgorICAgICMgQHJldHVybiBUaGUgZG9jdW1lbnQgcm9vdCBlbGVtZW50LgorICAgICMgQGRlZnJldHVybiBFbGVtZW50CisgICAgIyBAZXhjZXB0aW9uIFBhcnNlRXJyb3IgSWYgdGhlIHBhcnNlciBmYWlscyB0byBwYXJzZSB0aGUgZG9jdW1lbnQuCisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgc291cmNlLCBwYXJzZXI9Tm9uZSk6CisgICAgICAgIGNsb3NlX3NvdXJjZSA9IEZhbHNlCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNvdXJjZSwgInJlYWQiKToKKyAgICAgICAgICAgIHNvdXJjZSA9IG9wZW4oc291cmNlLCAicmIiKQorICAgICAgICAgICAgY2xvc2Vfc291cmNlID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3QgcGFyc2VyOgorICAgICAgICAgICAgICAgIHBhcnNlciA9IFhNTFBhcnNlcih0YXJnZXQ9VHJlZUJ1aWxkZXIoKSkKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgZGF0YSA9IHNvdXJjZS5yZWFkKDY1NTM2KQorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHBhcnNlci5mZWVkKGRhdGEpCisgICAgICAgICAgICBzZWxmLl9yb290ID0gcGFyc2VyLmNsb3NlKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yb290CisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBjbG9zZV9zb3VyY2U6CisgICAgICAgICAgICAgICAgc291cmNlLmNsb3NlKCkKKworICAgICMjCisgICAgIyBDcmVhdGVzIGEgdHJlZSBpdGVyYXRvciBmb3IgdGhlIHJvb3QgZWxlbWVudC4gIFRoZSBpdGVyYXRvciBsb29wcworICAgICMgb3ZlciBhbGwgZWxlbWVudHMgaW4gdGhpcyB0cmVlLCBpbiBkb2N1bWVudCBvcmRlci4KKyAgICAjCisgICAgIyBAcGFyYW0gdGFnIFdoYXQgdGFncyB0byBsb29rIGZvciAoZGVmYXVsdCBpcyB0byByZXR1cm4gYWxsIGVsZW1lbnRzKQorICAgICMgQHJldHVybiBBbiBpdGVyYXRvci4KKyAgICAjIEBkZWZyZXR1cm4gaXRlcmF0b3IKKworICAgIGRlZiBpdGVyKHNlbGYsIHRhZz1Ob25lKToKKyAgICAgICAgIyBhc3NlcnQgc2VsZi5fcm9vdCBpcyBub3QgTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5fcm9vdC5pdGVyKHRhZykKKworICAgICMgY29tcGF0aWJpbGl0eQorICAgIGRlZiBnZXRpdGVyYXRvcihzZWxmLCB0YWc9Tm9uZSk6CisgICAgICAgICMgQ2hhbmdlIGZvciBhIERlcHJlY2F0aW9uV2FybmluZyBpbiAxLjQKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICJUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLiAgIgorICAgICAgICAgICAgIlVzZSAndHJlZS5pdGVyKCknIG9yICdsaXN0KHRyZWUuaXRlcigpKScgaW5zdGVhZC4iLAorICAgICAgICAgICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yCisgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyKHRhZykpCisKKyAgICAjIworICAgICMgU2FtZSBhcyBnZXRyb290KCkuZmluZChwYXRoKSwgc3RhcnRpbmcgYXQgdGhlIHJvb3Qgb2YgdGhlCisgICAgIyB0cmVlLgorICAgICMKKyAgICAjIEBwYXJhbSBwYXRoIFdoYXQgZWxlbWVudCB0byBsb29rIGZvci4KKyAgICAjIEBrZXlwYXJhbSBuYW1lc3BhY2VzIE9wdGlvbmFsIG5hbWVzcGFjZSBwcmVmaXggbWFwLgorICAgICMgQHJldHVybiBUaGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCwgb3IgTm9uZSBpZiBubyBlbGVtZW50IHdhcyBmb3VuZC4KKyAgICAjIEBkZWZyZXR1cm4gRWxlbWVudCBvciBOb25lCisKKyAgICBkZWYgZmluZChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzPU5vbmUpOgorICAgICAgICAjIGFzc2VydCBzZWxmLl9yb290IGlzIG5vdCBOb25lCisgICAgICAgIGlmIHBhdGhbOjFdID09ICIvIjoKKyAgICAgICAgICAgIHBhdGggPSAiLiIgKyBwYXRoCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJUaGlzIHNlYXJjaCBpcyBicm9rZW4gaW4gMS4zIGFuZCBlYXJsaWVyLCBhbmQgd2lsbCBiZSAiCisgICAgICAgICAgICAgICAgImZpeGVkIGluIGEgZnV0dXJlIHZlcnNpb24uICBJZiB5b3UgcmVseSBvbiB0aGUgY3VycmVudCAiCisgICAgICAgICAgICAgICAgImJlaGF2aW91ciwgY2hhbmdlIGl0IHRvICVyIiAlIHBhdGgsCisgICAgICAgICAgICAgICAgRnV0dXJlV2FybmluZywgc3RhY2tsZXZlbD0yCisgICAgICAgICAgICAgICAgKQorICAgICAgICByZXR1cm4gc2VsZi5fcm9vdC5maW5kKHBhdGgsIG5hbWVzcGFjZXMpCisKKyAgICAjIworICAgICMgU2FtZSBhcyBnZXRyb290KCkuZmluZHRleHQocGF0aCksIHN0YXJ0aW5nIGF0IHRoZSByb290IG9mIHRoZSB0cmVlLgorICAgICMKKyAgICAjIEBwYXJhbSBwYXRoIFdoYXQgZWxlbWVudCB0byBsb29rIGZvci4KKyAgICAjIEBwYXJhbSBkZWZhdWx0IFdoYXQgdG8gcmV0dXJuIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgZm91bmQuCisgICAgIyBAa2V5cGFyYW0gbmFtZXNwYWNlcyBPcHRpb25hbCBuYW1lc3BhY2UgcHJlZml4IG1hcC4KKyAgICAjIEByZXR1cm4gVGhlIHRleHQgY29udGVudCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCwgb3IgdGhlCisgICAgIyAgICAgZGVmYXVsdCB2YWx1ZSBubyBlbGVtZW50IHdhcyBmb3VuZC4gIE5vdGUgdGhhdCBpZiB0aGUgZWxlbWVudAorICAgICMgICAgIGlzIGZvdW5kLCBidXQgaGFzIG5vIHRleHQgY29udGVudCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbgorICAgICMgICAgIGVtcHR5IHN0cmluZy4KKyAgICAjIEBkZWZyZXR1cm4gc3RyaW5nCisKKyAgICBkZWYgZmluZHRleHQoc2VsZiwgcGF0aCwgZGVmYXVsdD1Ob25lLCBuYW1lc3BhY2VzPU5vbmUpOgorICAgICAgICAjIGFzc2VydCBzZWxmLl9yb290IGlzIG5vdCBOb25lCisgICAgICAgIGlmIHBhdGhbOjFdID09ICIvIjoKKyAgICAgICAgICAgIHBhdGggPSAiLiIgKyBwYXRoCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJUaGlzIHNlYXJjaCBpcyBicm9rZW4gaW4gMS4zIGFuZCBlYXJsaWVyLCBhbmQgd2lsbCBiZSAiCisgICAgICAgICAgICAgICAgImZpeGVkIGluIGEgZnV0dXJlIHZlcnNpb24uICBJZiB5b3UgcmVseSBvbiB0aGUgY3VycmVudCAiCisgICAgICAgICAgICAgICAgImJlaGF2aW91ciwgY2hhbmdlIGl0IHRvICVyIiAlIHBhdGgsCisgICAgICAgICAgICAgICAgRnV0dXJlV2FybmluZywgc3RhY2tsZXZlbD0yCisgICAgICAgICAgICAgICAgKQorICAgICAgICByZXR1cm4gc2VsZi5fcm9vdC5maW5kdGV4dChwYXRoLCBkZWZhdWx0LCBuYW1lc3BhY2VzKQorCisgICAgIyMKKyAgICAjIFNhbWUgYXMgZ2V0cm9vdCgpLmZpbmRhbGwocGF0aCksIHN0YXJ0aW5nIGF0IHRoZSByb290IG9mIHRoZSB0cmVlLgorICAgICMKKyAgICAjIEBwYXJhbSBwYXRoIFdoYXQgZWxlbWVudCB0byBsb29rIGZvci4KKyAgICAjIEBrZXlwYXJhbSBuYW1lc3BhY2VzIE9wdGlvbmFsIG5hbWVzcGFjZSBwcmVmaXggbWFwLgorICAgICMgQHJldHVybiBBIGxpc3Qgb3IgaXRlcmF0b3IgY29udGFpbmluZyBhbGwgbWF0Y2hpbmcgZWxlbWVudHMsCisgICAgIyAgICBpbiBkb2N1bWVudCBvcmRlci4KKyAgICAjIEBkZWZyZXR1cm4gbGlzdCBvZiBFbGVtZW50IGluc3RhbmNlcworCisgICAgZGVmIGZpbmRhbGwoc2VsZiwgcGF0aCwgbmFtZXNwYWNlcz1Ob25lKToKKyAgICAgICAgIyBhc3NlcnQgc2VsZi5fcm9vdCBpcyBub3QgTm9uZQorICAgICAgICBpZiBwYXRoWzoxXSA9PSAiLyI6CisgICAgICAgICAgICBwYXRoID0gIi4iICsgcGF0aAorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAiVGhpcyBzZWFyY2ggaXMgYnJva2VuIGluIDEuMyBhbmQgZWFybGllciwgYW5kIHdpbGwgYmUgIgorICAgICAgICAgICAgICAgICJmaXhlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiAgSWYgeW91IHJlbHkgb24gdGhlIGN1cnJlbnQgIgorICAgICAgICAgICAgICAgICJiZWhhdmlvdXIsIGNoYW5nZSBpdCB0byAlciIgJSBwYXRoLAorICAgICAgICAgICAgICAgIEZ1dHVyZVdhcm5pbmcsIHN0YWNrbGV2ZWw9MgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Jvb3QuZmluZGFsbChwYXRoLCBuYW1lc3BhY2VzKQorCisgICAgIyMKKyAgICAjIEZpbmRzIGFsbCBtYXRjaGluZyBzdWJlbGVtZW50cywgYnkgdGFnIG5hbWUgb3IgcGF0aC4KKyAgICAjIFNhbWUgYXMgZ2V0cm9vdCgpLml0ZXJmaW5kKHBhdGgpLgorICAgICMKKyAgICAjIEBwYXJhbSBwYXRoIFdoYXQgZWxlbWVudCB0byBsb29rIGZvci4KKyAgICAjIEBrZXlwYXJhbSBuYW1lc3BhY2VzIE9wdGlvbmFsIG5hbWVzcGFjZSBwcmVmaXggbWFwLgorICAgICMgQHJldHVybiBBbiBpdGVyYXRvciBvciBzZXF1ZW5jZSBjb250YWluaW5nIGFsbCBtYXRjaGluZyBlbGVtZW50cywKKyAgICAjICAgIGluIGRvY3VtZW50IG9yZGVyLgorICAgICMgQGRlZnJldHVybiBhIGdlbmVyYXRlZCBzZXF1ZW5jZSBvZiBFbGVtZW50IGluc3RhbmNlcworCisgICAgZGVmIGl0ZXJmaW5kKHNlbGYsIHBhdGgsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgICAgICMgYXNzZXJ0IHNlbGYuX3Jvb3QgaXMgbm90IE5vbmUKKyAgICAgICAgaWYgcGF0aFs6MV0gPT0gIi8iOgorICAgICAgICAgICAgcGF0aCA9ICIuIiArIHBhdGgKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIlRoaXMgc2VhcmNoIGlzIGJyb2tlbiBpbiAxLjMgYW5kIGVhcmxpZXIsIGFuZCB3aWxsIGJlICIKKyAgICAgICAgICAgICAgICAiZml4ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gIElmIHlvdSByZWx5IG9uIHRoZSBjdXJyZW50ICIKKyAgICAgICAgICAgICAgICAiYmVoYXZpb3VyLCBjaGFuZ2UgaXQgdG8gJXIiICUgcGF0aCwKKyAgICAgICAgICAgICAgICBGdXR1cmVXYXJuaW5nLCBzdGFja2xldmVsPTIKKyAgICAgICAgICAgICAgICApCisgICAgICAgIHJldHVybiBzZWxmLl9yb290Lml0ZXJmaW5kKHBhdGgsIG5hbWVzcGFjZXMpCisKKyAgICAjIworICAgICMgV3JpdGVzIHRoZSBlbGVtZW50IHRyZWUgdG8gYSBmaWxlLCBhcyBYTUwuCisgICAgIworICAgICMgQGRlZiB3cml0ZShmaWxlLCAqKm9wdGlvbnMpCisgICAgIyBAcGFyYW0gZmlsZSBBIGZpbGUgbmFtZSwgb3IgYSBmaWxlIG9iamVjdCBvcGVuZWQgZm9yIHdyaXRpbmcuCisgICAgIyBAcGFyYW0gKipvcHRpb25zIE9wdGlvbnMsIGdpdmVuIGFzIGtleXdvcmQgYXJndW1lbnRzLgorICAgICMgQGtleXBhcmFtIGVuY29kaW5nIE9wdGlvbmFsIG91dHB1dCBlbmNvZGluZyAoZGVmYXVsdCBpcyBVUy1BU0NJSSkuCisgICAgIyBAa2V5cGFyYW0geG1sX2RlY2xhcmF0aW9uIENvbnRyb2xzIGlmIGFuIFhNTCBkZWNsYXJhdGlvbiBzaG91bGQKKyAgICAjICAgICBiZSBhZGRlZCB0byB0aGUgZmlsZS4gIFVzZSBGYWxzZSBmb3IgbmV2ZXIsIFRydWUgZm9yIGFsd2F5cywKKyAgICAjICAgICBOb25lIGZvciBvbmx5IGlmIG5vdCBVUy1BU0NJSSBvciBVVEYtOC4gIE5vbmUgaXMgZGVmYXVsdC4KKyAgICAjIEBrZXlwYXJhbSBkZWZhdWx0X25hbWVzcGFjZSBTZXRzIHRoZSBkZWZhdWx0IFhNTCBuYW1lc3BhY2UgKGZvciAieG1sbnMiKS4KKyAgICAjIEBrZXlwYXJhbSBtZXRob2QgT3B0aW9uYWwgb3V0cHV0IG1ldGhvZCAoInhtbCIsICJodG1sIiwgInRleHQiIG9yCisgICAgIyAgICAgImMxNG4iOyBkZWZhdWx0IGlzICJ4bWwiKS4KKworICAgIGRlZiB3cml0ZShzZWxmLCBmaWxlX29yX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAjIGtleXdvcmQgYXJndW1lbnRzCisgICAgICAgICAgICAgIGVuY29kaW5nPU5vbmUsCisgICAgICAgICAgICAgIHhtbF9kZWNsYXJhdGlvbj1Ob25lLAorICAgICAgICAgICAgICBkZWZhdWx0X25hbWVzcGFjZT1Ob25lLAorICAgICAgICAgICAgICBtZXRob2Q9Tm9uZSk6CisgICAgICAgICMgYXNzZXJ0IHNlbGYuX3Jvb3QgaXMgbm90IE5vbmUKKyAgICAgICAgaWYgbm90IG1ldGhvZDoKKyAgICAgICAgICAgIG1ldGhvZCA9ICJ4bWwiCisgICAgICAgIGVsaWYgbWV0aG9kIG5vdCBpbiBfc2VyaWFsaXplOgorICAgICAgICAgICAgIyBGSVhNRTogcmFpc2UgYW4gSW1wb3J0RXJyb3IgZm9yIGMxNG4gaWYgRWxlbWVudEMxNE4gaXMgbWlzc2luZz8KKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24gbWV0aG9kICVyIiAlIG1ldGhvZCkKKyAgICAgICAgaWYgaGFzYXR0cihmaWxlX29yX2ZpbGVuYW1lLCAid3JpdGUiKToKKyAgICAgICAgICAgIGZpbGUgPSBmaWxlX29yX2ZpbGVuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlID0gb3BlbihmaWxlX29yX2ZpbGVuYW1lLCAid2IiKQorICAgICAgICB3cml0ZSA9IGZpbGUud3JpdGUKKyAgICAgICAgaWYgbm90IGVuY29kaW5nOgorICAgICAgICAgICAgaWYgbWV0aG9kID09ICJjMTRuIjoKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9ICJ1dGYtOCIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSAidXMtYXNjaWkiCisgICAgICAgIGVsaWYgeG1sX2RlY2xhcmF0aW9uIG9yICh4bWxfZGVjbGFyYXRpb24gaXMgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nIG5vdCBpbiAoInV0Zi04IiwgInVzLWFzY2lpIikpOgorICAgICAgICAgICAgaWYgbWV0aG9kID09ICJ4bWwiOgorICAgICAgICAgICAgICAgIHdyaXRlKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSclcyc/PlxuIiAlIGVuY29kaW5nKQorICAgICAgICBpZiBtZXRob2QgPT0gInRleHQiOgorICAgICAgICAgICAgX3NlcmlhbGl6ZV90ZXh0KHdyaXRlLCBzZWxmLl9yb290LCBlbmNvZGluZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHFuYW1lcywgbmFtZXNwYWNlcyA9IF9uYW1lc3BhY2VzKAorICAgICAgICAgICAgICAgIHNlbGYuX3Jvb3QsIGVuY29kaW5nLCBkZWZhdWx0X25hbWVzcGFjZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlcmlhbGl6ZSA9IF9zZXJpYWxpemVbbWV0aG9kXQorICAgICAgICAgICAgc2VyaWFsaXplKHdyaXRlLCBzZWxmLl9yb290LCBlbmNvZGluZywgcW5hbWVzLCBuYW1lc3BhY2VzKQorICAgICAgICBpZiBmaWxlX29yX2ZpbGVuYW1lIGlzIG5vdCBmaWxlOgorICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisKKyAgICBkZWYgd3JpdGVfYzE0bihzZWxmLCBmaWxlKToKKyAgICAgICAgIyBseG1sLmV0cmVlIGNvbXBhdGliaWxpdHkuICB1c2Ugb3V0cHV0IG1ldGhvZCBpbnN0ZWFkCisgICAgICAgIHJldHVybiBzZWxmLndyaXRlKGZpbGUsIG1ldGhvZD0iYzE0biIpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgc2VyaWFsaXphdGlvbiBzdXBwb3J0CisKK2RlZiBfbmFtZXNwYWNlcyhlbGVtLCBlbmNvZGluZywgZGVmYXVsdF9uYW1lc3BhY2U9Tm9uZSk6CisgICAgIyBpZGVudGlmeSBuYW1lc3BhY2VzIHVzZWQgaW4gdGhpcyB0cmVlCisKKyAgICAjIG1hcHMgcW5hbWVzIHRvICplbmNvZGVkKiBwcmVmaXg6bG9jYWwgbmFtZXMKKyAgICBxbmFtZXMgPSB7Tm9uZTogTm9uZX0KKworICAgICMgbWFwcyB1cmk6cyB0byBwcmVmaXhlcworICAgIG5hbWVzcGFjZXMgPSB7fQorICAgIGlmIGRlZmF1bHRfbmFtZXNwYWNlOgorICAgICAgICBuYW1lc3BhY2VzW2RlZmF1bHRfbmFtZXNwYWNlXSA9ICIiCisKKyAgICBkZWYgZW5jb2RlKHRleHQpOgorICAgICAgICByZXR1cm4gdGV4dC5lbmNvZGUoZW5jb2RpbmcpCisKKyAgICBkZWYgYWRkX3FuYW1lKHFuYW1lKToKKyAgICAgICAgIyBjYWxjdWxhdGUgc2VyaWFsaXplZCBxbmFtZSByZXByZXNlbnRhdGlvbgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBxbmFtZVs6MV0gPT0gInsiOgorICAgICAgICAgICAgICAgIHVyaSwgdGFnID0gcW5hbWVbMTpdLnJzcGxpdCgifSIsIDEpCisgICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZXNwYWNlcy5nZXQodXJpKQorICAgICAgICAgICAgICAgIGlmIHByZWZpeCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBfbmFtZXNwYWNlX21hcC5nZXQodXJpKQorICAgICAgICAgICAgICAgICAgICBpZiBwcmVmaXggaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCA9ICJucyVkIiAlIGxlbihuYW1lc3BhY2VzKQorICAgICAgICAgICAgICAgICAgICBpZiBwcmVmaXggIT0gInhtbCI6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VzW3VyaV0gPSBwcmVmaXgKKyAgICAgICAgICAgICAgICBpZiBwcmVmaXg6CisgICAgICAgICAgICAgICAgICAgIHFuYW1lc1txbmFtZV0gPSBlbmNvZGUoIiVzOiVzIiAlIChwcmVmaXgsIHRhZykpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcW5hbWVzW3FuYW1lXSA9IGVuY29kZSh0YWcpICMgZGVmYXVsdCBlbGVtZW50CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGRlZmF1bHRfbmFtZXNwYWNlOgorICAgICAgICAgICAgICAgICAgICAjIEZJWE1FOiBjYW4gdGhpcyBiZSBoYW5kbGVkIGluIFhNTCAxLjA/CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IHVzZSBub24tcXVhbGlmaWVkIG5hbWVzIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfbmFtZXNwYWNlIG9wdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBxbmFtZXNbcW5hbWVdID0gZW5jb2RlKHFuYW1lKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgX3JhaXNlX3NlcmlhbGl6YXRpb25fZXJyb3IocW5hbWUpCisKKyAgICAjIHBvcHVsYXRlIHFuYW1lIGFuZCBuYW1lc3BhY2VzIHRhYmxlCisgICAgdHJ5OgorICAgICAgICBpdGVyYXRlID0gZWxlbS5pdGVyCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBpdGVyYXRlID0gZWxlbS5nZXRpdGVyYXRvciAjIGNFVCBjb21wYXRpYmlsaXR5CisgICAgZm9yIGVsZW0gaW4gaXRlcmF0ZSgpOgorICAgICAgICB0YWcgPSBlbGVtLnRhZworICAgICAgICBpZiBpc2luc3RhbmNlKHRhZywgUU5hbWUpOgorICAgICAgICAgICAgaWYgdGFnLnRleHQgbm90IGluIHFuYW1lczoKKyAgICAgICAgICAgICAgICBhZGRfcW5hbWUodGFnLnRleHQpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh0YWcsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgaWYgdGFnIG5vdCBpbiBxbmFtZXM6CisgICAgICAgICAgICAgICAgYWRkX3FuYW1lKHRhZykKKyAgICAgICAgZWxpZiB0YWcgaXMgbm90IE5vbmUgYW5kIHRhZyBpcyBub3QgQ29tbWVudCBhbmQgdGFnIGlzIG5vdCBQSToKKyAgICAgICAgICAgIF9yYWlzZV9zZXJpYWxpemF0aW9uX2Vycm9yKHRhZykKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZWxlbS5pdGVtcygpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIFFOYW1lKToKKyAgICAgICAgICAgICAgICBrZXkgPSBrZXkudGV4dAorICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBxbmFtZXM6CisgICAgICAgICAgICAgICAgYWRkX3FuYW1lKGtleSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIFFOYW1lKSBhbmQgdmFsdWUudGV4dCBub3QgaW4gcW5hbWVzOgorICAgICAgICAgICAgICAgIGFkZF9xbmFtZSh2YWx1ZS50ZXh0KQorICAgICAgICB0ZXh0ID0gZWxlbS50ZXh0CisgICAgICAgIGlmIGlzaW5zdGFuY2UodGV4dCwgUU5hbWUpIGFuZCB0ZXh0LnRleHQgbm90IGluIHFuYW1lczoKKyAgICAgICAgICAgIGFkZF9xbmFtZSh0ZXh0LnRleHQpCisgICAgcmV0dXJuIHFuYW1lcywgbmFtZXNwYWNlcworCitkZWYgX3NlcmlhbGl6ZV94bWwod3JpdGUsIGVsZW0sIGVuY29kaW5nLCBxbmFtZXMsIG5hbWVzcGFjZXMpOgorICAgIHRhZyA9IGVsZW0udGFnCisgICAgdGV4dCA9IGVsZW0udGV4dAorICAgIGlmIHRhZyBpcyBDb21tZW50OgorICAgICAgICB3cml0ZSgiPCEtLSVzLS0+IiAlIF9lbmNvZGUodGV4dCwgZW5jb2RpbmcpKQorICAgIGVsaWYgdGFnIGlzIFByb2Nlc3NpbmdJbnN0cnVjdGlvbjoKKyAgICAgICAgd3JpdGUoIjw/JXM/PiIgJSBfZW5jb2RlKHRleHQsIGVuY29kaW5nKSkKKyAgICBlbHNlOgorICAgICAgICB0YWcgPSBxbmFtZXNbdGFnXQorICAgICAgICBpZiB0YWcgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHRleHQ6CisgICAgICAgICAgICAgICAgd3JpdGUoX2VzY2FwZV9jZGF0YSh0ZXh0LCBlbmNvZGluZykpCisgICAgICAgICAgICBmb3IgZSBpbiBlbGVtOgorICAgICAgICAgICAgICAgIF9zZXJpYWxpemVfeG1sKHdyaXRlLCBlLCBlbmNvZGluZywgcW5hbWVzLCBOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd3JpdGUoIjwiICsgdGFnKQorICAgICAgICAgICAgaXRlbXMgPSBlbGVtLml0ZW1zKCkKKyAgICAgICAgICAgIGlmIGl0ZW1zIG9yIG5hbWVzcGFjZXM6CisgICAgICAgICAgICAgICAgaWYgbmFtZXNwYWNlczoKKyAgICAgICAgICAgICAgICAgICAgZm9yIHYsIGsgaW4gc29ydGVkKG5hbWVzcGFjZXMuaXRlbXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1sYW1iZGEgeDogeFsxXSk6ICAjIHNvcnQgb24gcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBrOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSAiOiIgKyBrCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSgiIHhtbG5zJXM9XCIlc1wiIiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLmVuY29kZShlbmNvZGluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZV9hdHRyaWIodiwgZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBzb3J0ZWQoaXRlbXMpOiAgIyBsZXhpY2FsIG9yZGVyCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaywgUU5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgayA9IGsudGV4dAorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsIFFOYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBxbmFtZXNbdi50ZXh0XQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IF9lc2NhcGVfYXR0cmliKHYsIGVuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICB3cml0ZSgiICVzPVwiJXNcIiIgJSAocW5hbWVzW2tdLCB2KSkKKyAgICAgICAgICAgIGlmIHRleHQgb3IgbGVuKGVsZW0pOgorICAgICAgICAgICAgICAgIHdyaXRlKCI+IikKKyAgICAgICAgICAgICAgICBpZiB0ZXh0OgorICAgICAgICAgICAgICAgICAgICB3cml0ZShfZXNjYXBlX2NkYXRhKHRleHQsIGVuY29kaW5nKSkKKyAgICAgICAgICAgICAgICBmb3IgZSBpbiBlbGVtOgorICAgICAgICAgICAgICAgICAgICBfc2VyaWFsaXplX3htbCh3cml0ZSwgZSwgZW5jb2RpbmcsIHFuYW1lcywgTm9uZSkKKyAgICAgICAgICAgICAgICB3cml0ZSgiPC8iICsgdGFnICsgIj4iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3cml0ZSgiIC8+IikKKyAgICBpZiBlbGVtLnRhaWw6CisgICAgICAgIHdyaXRlKF9lc2NhcGVfY2RhdGEoZWxlbS50YWlsLCBlbmNvZGluZykpCisKK0hUTUxfRU1QVFkgPSAoImFyZWEiLCAiYmFzZSIsICJiYXNlZm9udCIsICJiciIsICJjb2wiLCAiZnJhbWUiLCAiaHIiLAorICAgICAgICAgICAgICAiaW1nIiwgImlucHV0IiwgImlzaW5kZXgiLCAibGluayIsICJtZXRhIiwgInBhcmFtIikKKwordHJ5OgorICAgIEhUTUxfRU1QVFkgPSBzZXQoSFRNTF9FTVBUWSkKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcGFzcworCitkZWYgX3NlcmlhbGl6ZV9odG1sKHdyaXRlLCBlbGVtLCBlbmNvZGluZywgcW5hbWVzLCBuYW1lc3BhY2VzKToKKyAgICB0YWcgPSBlbGVtLnRhZworICAgIHRleHQgPSBlbGVtLnRleHQKKyAgICBpZiB0YWcgaXMgQ29tbWVudDoKKyAgICAgICAgd3JpdGUoIjwhLS0lcy0tPiIgJSBfZXNjYXBlX2NkYXRhKHRleHQsIGVuY29kaW5nKSkKKyAgICBlbGlmIHRhZyBpcyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246CisgICAgICAgIHdyaXRlKCI8PyVzPz4iICUgX2VzY2FwZV9jZGF0YSh0ZXh0LCBlbmNvZGluZykpCisgICAgZWxzZToKKyAgICAgICAgdGFnID0gcW5hbWVzW3RhZ10KKyAgICAgICAgaWYgdGFnIGlzIE5vbmU6CisgICAgICAgICAgICBpZiB0ZXh0OgorICAgICAgICAgICAgICAgIHdyaXRlKF9lc2NhcGVfY2RhdGEodGV4dCwgZW5jb2RpbmcpKQorICAgICAgICAgICAgZm9yIGUgaW4gZWxlbToKKyAgICAgICAgICAgICAgICBfc2VyaWFsaXplX2h0bWwod3JpdGUsIGUsIGVuY29kaW5nLCBxbmFtZXMsIE5vbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3cml0ZSgiPCIgKyB0YWcpCisgICAgICAgICAgICBpdGVtcyA9IGVsZW0uaXRlbXMoKQorICAgICAgICAgICAgaWYgaXRlbXMgb3IgbmFtZXNwYWNlczoKKyAgICAgICAgICAgICAgICBpZiBuYW1lc3BhY2VzOgorICAgICAgICAgICAgICAgICAgICBmb3IgdiwgayBpbiBzb3J0ZWQobmFtZXNwYWNlcy5pdGVtcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PWxhbWJkYSB4OiB4WzFdKTogICMgc29ydCBvbiBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGs6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9ICI6IiArIGsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKCIgeG1sbnMlcz1cIiVzXCIiICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsuZW5jb2RlKGVuY29kaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZXNjYXBlX2F0dHJpYih2LCBlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIHNvcnRlZChpdGVtcyk6ICAjIGxleGljYWwgb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBRTmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBrID0gay50ZXh0CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodiwgUU5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHFuYW1lc1t2LnRleHRdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gX2VzY2FwZV9hdHRyaWJfaHRtbCh2LCBlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgIyBGSVhNRTogaGFuZGxlIGJvb2xlYW4gYXR0cmlidXRlcworICAgICAgICAgICAgICAgICAgICB3cml0ZSgiICVzPVwiJXNcIiIgJSAocW5hbWVzW2tdLCB2KSkKKyAgICAgICAgICAgIHdyaXRlKCI+IikKKyAgICAgICAgICAgIHRhZyA9IHRhZy5sb3dlcigpCisgICAgICAgICAgICBpZiB0ZXh0OgorICAgICAgICAgICAgICAgIGlmIHRhZyA9PSAic2NyaXB0IiBvciB0YWcgPT0gInN0eWxlIjoKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoX2VuY29kZSh0ZXh0LCBlbmNvZGluZykpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoX2VzY2FwZV9jZGF0YSh0ZXh0LCBlbmNvZGluZykpCisgICAgICAgICAgICBmb3IgZSBpbiBlbGVtOgorICAgICAgICAgICAgICAgIF9zZXJpYWxpemVfaHRtbCh3cml0ZSwgZSwgZW5jb2RpbmcsIHFuYW1lcywgTm9uZSkKKyAgICAgICAgICAgIGlmIHRhZyBub3QgaW4gSFRNTF9FTVBUWToKKyAgICAgICAgICAgICAgICB3cml0ZSgiPC8iICsgdGFnICsgIj4iKQorICAgIGlmIGVsZW0udGFpbDoKKyAgICAgICAgd3JpdGUoX2VzY2FwZV9jZGF0YShlbGVtLnRhaWwsIGVuY29kaW5nKSkKKworZGVmIF9zZXJpYWxpemVfdGV4dCh3cml0ZSwgZWxlbSwgZW5jb2RpbmcpOgorICAgIGZvciBwYXJ0IGluIGVsZW0uaXRlcnRleHQoKToKKyAgICAgICAgd3JpdGUocGFydC5lbmNvZGUoZW5jb2RpbmcpKQorICAgIGlmIGVsZW0udGFpbDoKKyAgICAgICAgd3JpdGUoZWxlbS50YWlsLmVuY29kZShlbmNvZGluZykpCisKK19zZXJpYWxpemUgPSB7CisgICAgInhtbCI6IF9zZXJpYWxpemVfeG1sLAorICAgICJodG1sIjogX3NlcmlhbGl6ZV9odG1sLAorICAgICJ0ZXh0IjogX3NlcmlhbGl6ZV90ZXh0LAorIyB0aGlzIG9wdGlvbmFsIG1ldGhvZCBpcyBpbXBvcnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBtb2R1bGUKKyMgICAiYzE0biI6IF9zZXJpYWxpemVfYzE0biwKK30KKworIyMKKyMgUmVnaXN0ZXJzIGEgbmFtZXNwYWNlIHByZWZpeC4gIFRoZSByZWdpc3RyeSBpcyBnbG9iYWwsIGFuZCBhbnkKKyMgZXhpc3RpbmcgbWFwcGluZyBmb3IgZWl0aGVyIHRoZSBnaXZlbiBwcmVmaXggb3IgdGhlIG5hbWVzcGFjZSBVUkkKKyMgd2lsbCBiZSByZW1vdmVkLgorIworIyBAcGFyYW0gcHJlZml4IE5hbWVzcGFjZSBwcmVmaXguCisjIEBwYXJhbSB1cmkgTmFtZXNwYWNlIHVyaS4gIFRhZ3MgYW5kIGF0dHJpYnV0ZXMgaW4gdGhpcyBuYW1lc3BhY2UKKyMgICAgIHdpbGwgYmUgc2VyaWFsaXplZCB3aXRoIHRoZSBnaXZlbiBwcmVmaXgsIGlmIGF0IGFsbCBwb3NzaWJsZS4KKyMgQGV4Y2VwdGlvbiBWYWx1ZUVycm9yIElmIHRoZSBwcmVmaXggaXMgcmVzZXJ2ZWQsIG9yIGlzIG90aGVyd2lzZQorIyAgICAgaW52YWxpZC4KKworZGVmIHJlZ2lzdGVyX25hbWVzcGFjZShwcmVmaXgsIHVyaSk6CisgICAgaWYgcmUubWF0Y2goIm5zXGQrJCIsIHByZWZpeCk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlByZWZpeCBmb3JtYXQgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZSIpCisgICAgZm9yIGssIHYgaW4gX25hbWVzcGFjZV9tYXAuaXRlbXMoKToKKyAgICAgICAgaWYgayA9PSB1cmkgb3IgdiA9PSBwcmVmaXg6CisgICAgICAgICAgICBkZWwgX25hbWVzcGFjZV9tYXBba10KKyAgICBfbmFtZXNwYWNlX21hcFt1cmldID0gcHJlZml4CisKK19uYW1lc3BhY2VfbWFwID0geworICAgICMgIndlbGwta25vd24iIG5hbWVzcGFjZSBwcmVmaXhlcworICAgICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiOiAieG1sIiwKKyAgICAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI6ICJodG1sIiwKKyAgICAiaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI6ICJyZGYiLAorICAgICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI6ICJ3c2RsIiwKKyAgICAjIHhtbCBzY2hlbWEKKyAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiOiAieHMiLAorICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI6ICJ4c2kiLAorICAgICMgZHVibGluIGNvcmUKKyAgICAiaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iOiAiZGMiLAorfQorCitkZWYgX3JhaXNlX3NlcmlhbGl6YXRpb25fZXJyb3IodGV4dCk6CisgICAgcmFpc2UgVHlwZUVycm9yKAorICAgICAgICAiY2Fubm90IHNlcmlhbGl6ZSAlciAodHlwZSAlcykiICUgKHRleHQsIHR5cGUodGV4dCkuX19uYW1lX18pCisgICAgICAgICkKKworZGVmIF9lbmNvZGUodGV4dCwgZW5jb2RpbmcpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHRleHQuZW5jb2RlKGVuY29kaW5nLCAieG1sY2hhcnJlZnJlcGxhY2UiKQorICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgIF9yYWlzZV9zZXJpYWxpemF0aW9uX2Vycm9yKHRleHQpCisKK2RlZiBfZXNjYXBlX2NkYXRhKHRleHQsIGVuY29kaW5nKToKKyAgICAjIGVzY2FwZSBjaGFyYWN0ZXIgZGF0YQorICAgIHRyeToKKyAgICAgICAgIyBpdCdzIHdvcnRoIGF2b2lkaW5nIGRvLW5vdGhpbmcgY2FsbHMgZm9yIHN0cmluZ3MgdGhhdCBhcmUKKyAgICAgICAgIyBzaG9ydGVyIHRoYW4gNTAwIGNoYXJhY3Rlciwgb3Igc28uICBhc3N1bWUgdGhhdCdzLCBieSBmYXIsCisgICAgICAgICMgdGhlIG1vc3QgY29tbW9uIGNhc2UgaW4gbW9zdCBhcHBsaWNhdGlvbnMuCisgICAgICAgIGlmICImIiBpbiB0ZXh0OgorICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiJiIsICImYW1wOyIpCisgICAgICAgIGlmICI8IiBpbiB0ZXh0OgorICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiPCIsICImbHQ7IikKKyAgICAgICAgaWYgIj4iIGluIHRleHQ6CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCI+IiwgIiZndDsiKQorICAgICAgICByZXR1cm4gdGV4dC5lbmNvZGUoZW5jb2RpbmcsICJ4bWxjaGFycmVmcmVwbGFjZSIpCisgICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgX3JhaXNlX3NlcmlhbGl6YXRpb25fZXJyb3IodGV4dCkKKworZGVmIF9lc2NhcGVfYXR0cmliKHRleHQsIGVuY29kaW5nKToKKyAgICAjIGVzY2FwZSBhdHRyaWJ1dGUgdmFsdWUKKyAgICB0cnk6CisgICAgICAgIGlmICImIiBpbiB0ZXh0OgorICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiJiIsICImYW1wOyIpCisgICAgICAgIGlmICI8IiBpbiB0ZXh0OgorICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiPCIsICImbHQ7IikKKyAgICAgICAgaWYgIj4iIGluIHRleHQ6CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCI+IiwgIiZndDsiKQorICAgICAgICBpZiAiXCIiIGluIHRleHQ6CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCJcIiIsICImcXVvdDsiKQorICAgICAgICBpZiAiXG4iIGluIHRleHQ6CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCJcbiIsICImIzEwOyIpCisgICAgICAgIHJldHVybiB0ZXh0LmVuY29kZShlbmNvZGluZywgInhtbGNoYXJyZWZyZXBsYWNlIikKKyAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICBfcmFpc2Vfc2VyaWFsaXphdGlvbl9lcnJvcih0ZXh0KQorCitkZWYgX2VzY2FwZV9hdHRyaWJfaHRtbCh0ZXh0LCBlbmNvZGluZyk6CisgICAgIyBlc2NhcGUgYXR0cmlidXRlIHZhbHVlCisgICAgdHJ5OgorICAgICAgICBpZiAiJiIgaW4gdGV4dDoKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIiYiLCAiJmFtcDsiKQorICAgICAgICBpZiAiPiIgaW4gdGV4dDoKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIj4iLCAiJmd0OyIpCisgICAgICAgIGlmICJcIiIgaW4gdGV4dDoKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIlwiIiwgIiZxdW90OyIpCisgICAgICAgIHJldHVybiB0ZXh0LmVuY29kZShlbmNvZGluZywgInhtbGNoYXJyZWZyZXBsYWNlIikKKyAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICBfcmFpc2Vfc2VyaWFsaXphdGlvbl9lcnJvcih0ZXh0KQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIEdlbmVyYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBYTUwgZWxlbWVudCwgaW5jbHVkaW5nIGFsbAorIyBzdWJlbGVtZW50cy4KKyMKKyMgQHBhcmFtIGVsZW1lbnQgQW4gRWxlbWVudCBpbnN0YW5jZS4KKyMgQGtleXBhcmFtIGVuY29kaW5nIE9wdGlvbmFsIG91dHB1dCBlbmNvZGluZyAoZGVmYXVsdCBpcyBVUy1BU0NJSSkuCisjIEBrZXlwYXJhbSBtZXRob2QgT3B0aW9uYWwgb3V0cHV0IG1ldGhvZCAoInhtbCIsICJodG1sIiwgInRleHQiIG9yCisjICAgICAiYzE0biI7IGRlZmF1bHQgaXMgInhtbCIpLgorIyBAcmV0dXJuIEFuIGVuY29kZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFhNTCBkYXRhLgorIyBAZGVmcmV0dXJuIHN0cmluZworCitkZWYgdG9zdHJpbmcoZWxlbWVudCwgZW5jb2Rpbmc9Tm9uZSwgbWV0aG9kPU5vbmUpOgorICAgIGNsYXNzIGR1bW15OgorICAgICAgICBwYXNzCisgICAgZGF0YSA9IFtdCisgICAgZmlsZSA9IGR1bW15KCkKKyAgICBmaWxlLndyaXRlID0gZGF0YS5hcHBlbmQKKyAgICBFbGVtZW50VHJlZShlbGVtZW50KS53cml0ZShmaWxlLCBlbmNvZGluZywgbWV0aG9kPW1ldGhvZCkKKyAgICByZXR1cm4gIiIuam9pbihkYXRhKQorCisjIworIyBHZW5lcmF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gWE1MIGVsZW1lbnQsIGluY2x1ZGluZyBhbGwKKyMgc3ViZWxlbWVudHMuICBUaGUgc3RyaW5nIGlzIHJldHVybmVkIGFzIGEgc2VxdWVuY2Ugb2Ygc3RyaW5nIGZyYWdtZW50cy4KKyMKKyMgQHBhcmFtIGVsZW1lbnQgQW4gRWxlbWVudCBpbnN0YW5jZS4KKyMgQGtleXBhcmFtIGVuY29kaW5nIE9wdGlvbmFsIG91dHB1dCBlbmNvZGluZyAoZGVmYXVsdCBpcyBVUy1BU0NJSSkuCisjIEBrZXlwYXJhbSBtZXRob2QgT3B0aW9uYWwgb3V0cHV0IG1ldGhvZCAoInhtbCIsICJodG1sIiwgInRleHQiIG9yCisjICAgICAiYzE0biI7IGRlZmF1bHQgaXMgInhtbCIpLgorIyBAcmV0dXJuIEEgc2VxdWVuY2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIFhNTCBkYXRhLgorIyBAZGVmcmV0dXJuIHNlcXVlbmNlCisjIEBzaW5jZSAxLjMKKworZGVmIHRvc3RyaW5nbGlzdChlbGVtZW50LCBlbmNvZGluZz1Ob25lLCBtZXRob2Q9Tm9uZSk6CisgICAgY2xhc3MgZHVtbXk6CisgICAgICAgIHBhc3MKKyAgICBkYXRhID0gW10KKyAgICBmaWxlID0gZHVtbXkoKQorICAgIGZpbGUud3JpdGUgPSBkYXRhLmFwcGVuZAorICAgIEVsZW1lbnRUcmVlKGVsZW1lbnQpLndyaXRlKGZpbGUsIGVuY29kaW5nLCBtZXRob2Q9bWV0aG9kKQorICAgICMgRklYTUU6IG1lcmdlIHNtYWxsIGZyYWdtZW50cyBpbnRvIGxhcmdlciBwYXJ0cworICAgIHJldHVybiBkYXRhCisKKyMjCisjIFdyaXRlcyBhbiBlbGVtZW50IHRyZWUgb3IgZWxlbWVudCBzdHJ1Y3R1cmUgdG8gc3lzLnN0ZG91dC4gIFRoaXMKKyMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBvbmx5LgorIyA8cD4KKyMgVGhlIGV4YWN0IG91dHB1dCBmb3JtYXQgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiAgSW4gdGhpcworIyB2ZXJzaW9uLCBpdCdzIHdyaXR0ZW4gYXMgYW4gb3JkaW5hcnkgWE1MIGZpbGUuCisjCisjIEBwYXJhbSBlbGVtIEFuIGVsZW1lbnQgdHJlZSBvciBhbiBpbmRpdmlkdWFsIGVsZW1lbnQuCisKK2RlZiBkdW1wKGVsZW0pOgorICAgICMgZGVidWdnaW5nCisgICAgaWYgbm90IGlzaW5zdGFuY2UoZWxlbSwgRWxlbWVudFRyZWUpOgorICAgICAgICBlbGVtID0gRWxlbWVudFRyZWUoZWxlbSkKKyAgICBlbGVtLndyaXRlKHN5cy5zdGRvdXQpCisgICAgdGFpbCA9IGVsZW0uZ2V0cm9vdCgpLnRhaWwKKyAgICBpZiBub3QgdGFpbCBvciB0YWlsWy0xXSAhPSAiXG4iOgorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiIpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcGFyc2luZworCisjIworIyBQYXJzZXMgYW4gWE1MIGRvY3VtZW50IGludG8gYW4gZWxlbWVudCB0cmVlLgorIworIyBAcGFyYW0gc291cmNlIEEgZmlsZW5hbWUgb3IgZmlsZSBvYmplY3QgY29udGFpbmluZyBYTUwgZGF0YS4KKyMgQHBhcmFtIHBhcnNlciBBbiBvcHRpb25hbCBwYXJzZXIgaW5zdGFuY2UuICBJZiBub3QgZ2l2ZW4sIHRoZQorIyAgICAgc3RhbmRhcmQge0BsaW5rIFhNTFBhcnNlcn0gcGFyc2VyIGlzIHVzZWQuCisjIEByZXR1cm4gQW4gRWxlbWVudFRyZWUgaW5zdGFuY2UKKworZGVmIHBhcnNlKHNvdXJjZSwgcGFyc2VyPU5vbmUpOgorICAgIHRyZWUgPSBFbGVtZW50VHJlZSgpCisgICAgdHJlZS5wYXJzZShzb3VyY2UsIHBhcnNlcikKKyAgICByZXR1cm4gdHJlZQorCisjIworIyBQYXJzZXMgYW4gWE1MIGRvY3VtZW50IGludG8gYW4gZWxlbWVudCB0cmVlIGluY3JlbWVudGFsbHksIGFuZCByZXBvcnRzCisjIHdoYXQncyBnb2luZyBvbiB0byB0aGUgdXNlci4KKyMKKyMgQHBhcmFtIHNvdXJjZSBBIGZpbGVuYW1lIG9yIGZpbGUgb2JqZWN0IGNvbnRhaW5pbmcgWE1MIGRhdGEuCisjIEBwYXJhbSBldmVudHMgQSBsaXN0IG9mIGV2ZW50cyB0byByZXBvcnQgYmFjay4gIElmIG9taXR0ZWQsIG9ubHkgImVuZCIKKyMgICAgIGV2ZW50cyBhcmUgcmVwb3J0ZWQuCisjIEBwYXJhbSBwYXJzZXIgQW4gb3B0aW9uYWwgcGFyc2VyIGluc3RhbmNlLiAgSWYgbm90IGdpdmVuLCB0aGUKKyMgICAgIHN0YW5kYXJkIHtAbGluayBYTUxQYXJzZXJ9IHBhcnNlciBpcyB1c2VkLgorIyBAcmV0dXJuIEEgKGV2ZW50LCBlbGVtKSBpdGVyYXRvci4KKworZGVmIGl0ZXJwYXJzZShzb3VyY2UsIGV2ZW50cz1Ob25lLCBwYXJzZXI9Tm9uZSk6CisgICAgY2xvc2Vfc291cmNlID0gRmFsc2UKKyAgICBpZiBub3QgaGFzYXR0cihzb3VyY2UsICJyZWFkIik6CisgICAgICAgIHNvdXJjZSA9IG9wZW4oc291cmNlLCAicmIiKQorICAgICAgICBjbG9zZV9zb3VyY2UgPSBUcnVlCisgICAgaWYgbm90IHBhcnNlcjoKKyAgICAgICAgcGFyc2VyID0gWE1MUGFyc2VyKHRhcmdldD1UcmVlQnVpbGRlcigpKQorICAgIHJldHVybiBfSXRlclBhcnNlSXRlcmF0b3Ioc291cmNlLCBldmVudHMsIHBhcnNlciwgY2xvc2Vfc291cmNlKQorCitjbGFzcyBfSXRlclBhcnNlSXRlcmF0b3Iob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb3VyY2UsIGV2ZW50cywgcGFyc2VyLCBjbG9zZV9zb3VyY2U9RmFsc2UpOgorICAgICAgICBzZWxmLl9maWxlID0gc291cmNlCisgICAgICAgIHNlbGYuX2Nsb3NlX2ZpbGUgPSBjbG9zZV9zb3VyY2UKKyAgICAgICAgc2VsZi5fZXZlbnRzID0gW10KKyAgICAgICAgc2VsZi5faW5kZXggPSAwCisgICAgICAgIHNlbGYuX2Vycm9yID0gTm9uZQorICAgICAgICBzZWxmLnJvb3QgPSBzZWxmLl9yb290ID0gTm9uZQorICAgICAgICBzZWxmLl9wYXJzZXIgPSBwYXJzZXIKKyAgICAgICAgIyB3aXJlIHVwIHRoZSBwYXJzZXIgZm9yIGV2ZW50IHJlcG9ydGluZworICAgICAgICBwYXJzZXIgPSBzZWxmLl9wYXJzZXIuX3BhcnNlcgorICAgICAgICBhcHBlbmQgPSBzZWxmLl9ldmVudHMuYXBwZW5kCisgICAgICAgIGlmIGV2ZW50cyBpcyBOb25lOgorICAgICAgICAgICAgZXZlbnRzID0gWyJlbmQiXQorICAgICAgICBmb3IgZXZlbnQgaW4gZXZlbnRzOgorICAgICAgICAgICAgaWYgZXZlbnQgPT0gInN0YXJ0IjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBhcnNlci5vcmRlcmVkX2F0dHJpYnV0ZXMgPSAxCisgICAgICAgICAgICAgICAgICAgIHBhcnNlci5zcGVjaWZpZWRfYXR0cmlidXRlcyA9IDEKKyAgICAgICAgICAgICAgICAgICAgZGVmIGhhbmRsZXIodGFnLCBhdHRyaWJfaW4sIGV2ZW50PWV2ZW50LCBhcHBlbmQ9YXBwZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydD1zZWxmLl9wYXJzZXIuX3N0YXJ0X2xpc3QpOgorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKChldmVudCwgc3RhcnQodGFnLCBhdHRyaWJfaW4pKSkKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLlN0YXJ0RWxlbWVudEhhbmRsZXIgPSBoYW5kbGVyCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBkZWYgaGFuZGxlcih0YWcsIGF0dHJpYl9pbiwgZXZlbnQ9ZXZlbnQsIGFwcGVuZD1hcHBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0PXNlbGYuX3BhcnNlci5fc3RhcnQpOgorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kKChldmVudCwgc3RhcnQodGFnLCBhdHRyaWJfaW4pKSkKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLlN0YXJ0RWxlbWVudEhhbmRsZXIgPSBoYW5kbGVyCisgICAgICAgICAgICBlbGlmIGV2ZW50ID09ICJlbmQiOgorICAgICAgICAgICAgICAgIGRlZiBoYW5kbGVyKHRhZywgZXZlbnQ9ZXZlbnQsIGFwcGVuZD1hcHBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kPXNlbGYuX3BhcnNlci5fZW5kKToKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKChldmVudCwgZW5kKHRhZykpKQorICAgICAgICAgICAgICAgIHBhcnNlci5FbmRFbGVtZW50SGFuZGxlciA9IGhhbmRsZXIKKyAgICAgICAgICAgIGVsaWYgZXZlbnQgPT0gInN0YXJ0LW5zIjoKKyAgICAgICAgICAgICAgICBkZWYgaGFuZGxlcihwcmVmaXgsIHVyaSwgZXZlbnQ9ZXZlbnQsIGFwcGVuZD1hcHBlbmQpOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB1cmkgPSAodXJpIG9yICIiKS5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKChldmVudCwgKHByZWZpeCBvciAiIiwgdXJpIG9yICIiKSkpCisgICAgICAgICAgICAgICAgcGFyc2VyLlN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBoYW5kbGVyCisgICAgICAgICAgICBlbGlmIGV2ZW50ID09ICJlbmQtbnMiOgorICAgICAgICAgICAgICAgIGRlZiBoYW5kbGVyKHByZWZpeCwgZXZlbnQ9ZXZlbnQsIGFwcGVuZD1hcHBlbmQpOgorICAgICAgICAgICAgICAgICAgICBhcHBlbmQoKGV2ZW50LCBOb25lKSkKKyAgICAgICAgICAgICAgICBwYXJzZXIuRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBoYW5kbGVyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24gZXZlbnQgJXIiICUgZXZlbnQpCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpdGVtID0gc2VsZi5fZXZlbnRzW3NlbGYuX2luZGV4XQorICAgICAgICAgICAgICAgIHNlbGYuX2luZGV4ICs9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgc2VsZi5fZXJyb3I6CisgICAgICAgICAgICAgICAgZSA9IHNlbGYuX2Vycm9yCisgICAgICAgICAgICAgICAgc2VsZi5fZXJyb3IgPSBOb25lCisgICAgICAgICAgICAgICAgcmFpc2UgZQorICAgICAgICAgICAgaWYgc2VsZi5fcGFyc2VyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5yb290ID0gc2VsZi5fcm9vdAorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2Nsb3NlX2ZpbGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICMgbG9hZCBldmVudCBidWZmZXIKKyAgICAgICAgICAgIGRlbCBzZWxmLl9ldmVudHNbOl0KKyAgICAgICAgICAgIHNlbGYuX2luZGV4ID0gMAorICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2ZpbGUucmVhZCgxNjM4NCkKKyAgICAgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZXIuZmVlZChkYXRhKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBleGM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Vycm9yID0gZXhjCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX3Jvb3QgPSBzZWxmLl9wYXJzZXIuY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlciA9IE5vbmUKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworIyMKKyMgUGFyc2VzIGFuIFhNTCBkb2N1bWVudCBmcm9tIGEgc3RyaW5nIGNvbnN0YW50LiAgVGhpcyBmdW5jdGlvbiBjYW4KKyMgYmUgdXNlZCB0byBlbWJlZCAiWE1MIGxpdGVyYWxzIiBpbiBQeXRob24gY29kZS4KKyMKKyMgQHBhcmFtIHNvdXJjZSBBIHN0cmluZyBjb250YWluaW5nIFhNTCBkYXRhLgorIyBAcGFyYW0gcGFyc2VyIEFuIG9wdGlvbmFsIHBhcnNlciBpbnN0YW5jZS4gIElmIG5vdCBnaXZlbiwgdGhlCisjICAgICBzdGFuZGFyZCB7QGxpbmsgWE1MUGFyc2VyfSBwYXJzZXIgaXMgdXNlZC4KKyMgQHJldHVybiBBbiBFbGVtZW50IGluc3RhbmNlLgorIyBAZGVmcmV0dXJuIEVsZW1lbnQKKworZGVmIFhNTCh0ZXh0LCBwYXJzZXI9Tm9uZSk6CisgICAgaWYgbm90IHBhcnNlcjoKKyAgICAgICAgcGFyc2VyID0gWE1MUGFyc2VyKHRhcmdldD1UcmVlQnVpbGRlcigpKQorICAgIHBhcnNlci5mZWVkKHRleHQpCisgICAgcmV0dXJuIHBhcnNlci5jbG9zZSgpCisKKyMjCisjIFBhcnNlcyBhbiBYTUwgZG9jdW1lbnQgZnJvbSBhIHN0cmluZyBjb25zdGFudCwgYW5kIGFsc28gcmV0dXJucworIyBhIGRpY3Rpb25hcnkgd2hpY2ggbWFwcyBmcm9tIGVsZW1lbnQgaWQ6cyB0byBlbGVtZW50cy4KKyMKKyMgQHBhcmFtIHNvdXJjZSBBIHN0cmluZyBjb250YWluaW5nIFhNTCBkYXRhLgorIyBAcGFyYW0gcGFyc2VyIEFuIG9wdGlvbmFsIHBhcnNlciBpbnN0YW5jZS4gIElmIG5vdCBnaXZlbiwgdGhlCisjICAgICBzdGFuZGFyZCB7QGxpbmsgWE1MUGFyc2VyfSBwYXJzZXIgaXMgdXNlZC4KKyMgQHJldHVybiBBIHR1cGxlIGNvbnRhaW5pbmcgYW4gRWxlbWVudCBpbnN0YW5jZSBhbmQgYSBkaWN0aW9uYXJ5LgorIyBAZGVmcmV0dXJuIChFbGVtZW50LCBkaWN0aW9uYXJ5KQorCitkZWYgWE1MSUQodGV4dCwgcGFyc2VyPU5vbmUpOgorICAgIGlmIG5vdCBwYXJzZXI6CisgICAgICAgIHBhcnNlciA9IFhNTFBhcnNlcih0YXJnZXQ9VHJlZUJ1aWxkZXIoKSkKKyAgICBwYXJzZXIuZmVlZCh0ZXh0KQorICAgIHRyZWUgPSBwYXJzZXIuY2xvc2UoKQorICAgIGlkcyA9IHt9CisgICAgZm9yIGVsZW0gaW4gdHJlZS5pdGVyKCk6CisgICAgICAgIGlkID0gZWxlbS5nZXQoImlkIikKKyAgICAgICAgaWYgaWQ6CisgICAgICAgICAgICBpZHNbaWRdID0gZWxlbQorICAgIHJldHVybiB0cmVlLCBpZHMKKworIyMKKyMgUGFyc2VzIGFuIFhNTCBkb2N1bWVudCBmcm9tIGEgc3RyaW5nIGNvbnN0YW50LiAgU2FtZSBhcyB7QGxpbmsgI1hNTH0uCisjCisjIEBkZWYgZnJvbXN0cmluZyh0ZXh0KQorIyBAcGFyYW0gc291cmNlIEEgc3RyaW5nIGNvbnRhaW5pbmcgWE1MIGRhdGEuCisjIEByZXR1cm4gQW4gRWxlbWVudCBpbnN0YW5jZS4KKyMgQGRlZnJldHVybiBFbGVtZW50CisKK2Zyb21zdHJpbmcgPSBYTUwKKworIyMKKyMgUGFyc2VzIGFuIFhNTCBkb2N1bWVudCBmcm9tIGEgc2VxdWVuY2Ugb2Ygc3RyaW5nIGZyYWdtZW50cy4KKyMKKyMgQHBhcmFtIHNlcXVlbmNlIEEgbGlzdCBvciBvdGhlciBzZXF1ZW5jZSBjb250YWluaW5nIFhNTCBkYXRhIGZyYWdtZW50cy4KKyMgQHBhcmFtIHBhcnNlciBBbiBvcHRpb25hbCBwYXJzZXIgaW5zdGFuY2UuICBJZiBub3QgZ2l2ZW4sIHRoZQorIyAgICAgc3RhbmRhcmQge0BsaW5rIFhNTFBhcnNlcn0gcGFyc2VyIGlzIHVzZWQuCisjIEByZXR1cm4gQW4gRWxlbWVudCBpbnN0YW5jZS4KKyMgQGRlZnJldHVybiBFbGVtZW50CisjIEBzaW5jZSAxLjMKKworZGVmIGZyb21zdHJpbmdsaXN0KHNlcXVlbmNlLCBwYXJzZXI9Tm9uZSk6CisgICAgaWYgbm90IHBhcnNlcjoKKyAgICAgICAgcGFyc2VyID0gWE1MUGFyc2VyKHRhcmdldD1UcmVlQnVpbGRlcigpKQorICAgIGZvciB0ZXh0IGluIHNlcXVlbmNlOgorICAgICAgICBwYXJzZXIuZmVlZCh0ZXh0KQorICAgIHJldHVybiBwYXJzZXIuY2xvc2UoKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIEdlbmVyaWMgZWxlbWVudCBzdHJ1Y3R1cmUgYnVpbGRlci4gIFRoaXMgYnVpbGRlciBjb252ZXJ0cyBhIHNlcXVlbmNlCisjIG9mIHtAbGluayAjVHJlZUJ1aWxkZXIuc3RhcnR9LCB7QGxpbmsgI1RyZWVCdWlsZGVyLmRhdGF9LCBhbmQge0BsaW5rCisjICNUcmVlQnVpbGRlci5lbmR9IG1ldGhvZCBjYWxscyB0byBhIHdlbGwtZm9ybWVkIGVsZW1lbnQgc3RydWN0dXJlLgorIyA8cD4KKyMgWW91IGNhbiB1c2UgdGhpcyBjbGFzcyB0byBidWlsZCBhbiBlbGVtZW50IHN0cnVjdHVyZSB1c2luZyBhIGN1c3RvbSBYTUwKKyMgcGFyc2VyLCBvciBhIHBhcnNlciBmb3Igc29tZSBvdGhlciBYTUwtbGlrZSBmb3JtYXQuCisjCisjIEBwYXJhbSBlbGVtZW50X2ZhY3RvcnkgT3B0aW9uYWwgZWxlbWVudCBmYWN0b3J5LiAgVGhpcyBmYWN0b3J5CisjICAgIGlzIGNhbGxlZCB0byBjcmVhdGUgbmV3IEVsZW1lbnQgaW5zdGFuY2VzLCBhcyBuZWNlc3NhcnkuCisKK2NsYXNzIFRyZWVCdWlsZGVyKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWxlbWVudF9mYWN0b3J5PU5vbmUpOgorICAgICAgICBzZWxmLl9kYXRhID0gW10gIyBkYXRhIGNvbGxlY3RvcgorICAgICAgICBzZWxmLl9lbGVtID0gW10gIyBlbGVtZW50IHN0YWNrCisgICAgICAgIHNlbGYuX2xhc3QgPSBOb25lICMgbGFzdCBlbGVtZW50CisgICAgICAgIHNlbGYuX3RhaWwgPSBOb25lICMgdHJ1ZSBpZiB3ZSdyZSBhZnRlciBhbiBlbmQgdGFnCisgICAgICAgIGlmIGVsZW1lbnRfZmFjdG9yeSBpcyBOb25lOgorICAgICAgICAgICAgZWxlbWVudF9mYWN0b3J5ID0gRWxlbWVudAorICAgICAgICBzZWxmLl9mYWN0b3J5ID0gZWxlbWVudF9mYWN0b3J5CisKKyAgICAjIworICAgICMgRmx1c2hlcyB0aGUgYnVpbGRlciBidWZmZXJzLCBhbmQgcmV0dXJucyB0aGUgdG9wbGV2ZWwgZG9jdW1lbnQKKyAgICAjIGVsZW1lbnQuCisgICAgIworICAgICMgQHJldHVybiBBbiBFbGVtZW50IGluc3RhbmNlLgorICAgICMgQGRlZnJldHVybiBFbGVtZW50CisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5fZWxlbSkgPT0gMCwgIm1pc3NpbmcgZW5kIHRhZ3MiCisgICAgICAgIGFzc2VydCBzZWxmLl9sYXN0IGlzIG5vdCBOb25lLCAibWlzc2luZyB0b3BsZXZlbCBlbGVtZW50IgorICAgICAgICByZXR1cm4gc2VsZi5fbGFzdAorCisgICAgZGVmIF9mbHVzaChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZGF0YToKKyAgICAgICAgICAgIGlmIHNlbGYuX2xhc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgdGV4dCA9ICIiLmpvaW4oc2VsZi5fZGF0YSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl90YWlsOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5fbGFzdC50YWlsIGlzIE5vbmUsICJpbnRlcm5hbCBlcnJvciAodGFpbCkiCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhc3QudGFpbCA9IHRleHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5fbGFzdC50ZXh0IGlzIE5vbmUsICJpbnRlcm5hbCBlcnJvciAodGV4dCkiCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhc3QudGV4dCA9IHRleHQKKyAgICAgICAgICAgIHNlbGYuX2RhdGEgPSBbXQorCisgICAgIyMKKyAgICAjIEFkZHMgdGV4dCB0byB0aGUgY3VycmVudCBlbGVtZW50LgorICAgICMKKyAgICAjIEBwYXJhbSBkYXRhIEEgc3RyaW5nLiAgVGhpcyBzaG91bGQgYmUgZWl0aGVyIGFuIDgtYml0IHN0cmluZworICAgICMgICAgY29udGFpbmluZyBBU0NJSSB0ZXh0LCBvciBhIFVuaWNvZGUgc3RyaW5nLgorCisgICAgZGVmIGRhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX2RhdGEuYXBwZW5kKGRhdGEpCisKKyAgICAjIworICAgICMgT3BlbnMgYSBuZXcgZWxlbWVudC4KKyAgICAjCisgICAgIyBAcGFyYW0gdGFnIFRoZSBlbGVtZW50IG5hbWUuCisgICAgIyBAcGFyYW0gYXR0cmliIEEgZGljdGlvbmFyeSBjb250YWluaW5nIGVsZW1lbnQgYXR0cmlidXRlcy4KKyAgICAjIEByZXR1cm4gVGhlIG9wZW5lZCBlbGVtZW50LgorICAgICMgQGRlZnJldHVybiBFbGVtZW50CisKKyAgICBkZWYgc3RhcnQoc2VsZiwgdGFnLCBhdHRycyk6CisgICAgICAgIHNlbGYuX2ZsdXNoKCkKKyAgICAgICAgc2VsZi5fbGFzdCA9IGVsZW0gPSBzZWxmLl9mYWN0b3J5KHRhZywgYXR0cnMpCisgICAgICAgIGlmIHNlbGYuX2VsZW06CisgICAgICAgICAgICBzZWxmLl9lbGVtWy0xXS5hcHBlbmQoZWxlbSkKKyAgICAgICAgc2VsZi5fZWxlbS5hcHBlbmQoZWxlbSkKKyAgICAgICAgc2VsZi5fdGFpbCA9IDAKKyAgICAgICAgcmV0dXJuIGVsZW0KKworICAgICMjCisgICAgIyBDbG9zZXMgdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgICAjCisgICAgIyBAcGFyYW0gdGFnIFRoZSBlbGVtZW50IG5hbWUuCisgICAgIyBAcmV0dXJuIFRoZSBjbG9zZWQgZWxlbWVudC4KKyAgICAjIEBkZWZyZXR1cm4gRWxlbWVudAorCisgICAgZGVmIGVuZChzZWxmLCB0YWcpOgorICAgICAgICBzZWxmLl9mbHVzaCgpCisgICAgICAgIHNlbGYuX2xhc3QgPSBzZWxmLl9lbGVtLnBvcCgpCisgICAgICAgIGFzc2VydCBzZWxmLl9sYXN0LnRhZyA9PSB0YWcsXAorICAgICAgICAgICAgICAgImVuZCB0YWcgbWlzbWF0Y2ggKGV4cGVjdGVkICVzLCBnb3QgJXMpIiAlICgKKyAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0LnRhZywgdGFnKQorICAgICAgICBzZWxmLl90YWlsID0gMQorICAgICAgICByZXR1cm4gc2VsZi5fbGFzdAorCisjIworIyBFbGVtZW50IHN0cnVjdHVyZSBidWlsZGVyIGZvciBYTUwgc291cmNlIGRhdGEsIGJhc2VkIG9uIHRoZQorIyA8Yj5leHBhdDwvYj4gcGFyc2VyLgorIworIyBAa2V5cGFyYW0gdGFyZ2V0IFRhcmdldCBvYmplY3QuICBJZiBvbWl0dGVkLCB0aGUgYnVpbGRlciB1c2VzIGFuCisjICAgICBpbnN0YW5jZSBvZiB0aGUgc3RhbmRhcmQge0BsaW5rICNUcmVlQnVpbGRlcn0gY2xhc3MuCisjIEBrZXlwYXJhbSBodG1sIFByZWRlZmluZSBIVE1MIGVudGl0aWVzLiAgVGhpcyBmbGFnIGlzIG5vdCBzdXBwb3J0ZWQKKyMgICAgIGJ5IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLgorIyBAa2V5cGFyYW0gZW5jb2RpbmcgT3B0aW9uYWwgZW5jb2RpbmcuICBJZiBnaXZlbiwgdGhlIHZhbHVlIG92ZXJyaWRlcworIyAgICAgdGhlIGVuY29kaW5nIHNwZWNpZmllZCBpbiB0aGUgWE1MIGZpbGUuCisjIEBzZWUgI0VsZW1lbnRUcmVlCisjIEBzZWUgI1RyZWVCdWlsZGVyCisKK2NsYXNzIFhNTFBhcnNlcihvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGh0bWw9MCwgdGFyZ2V0PU5vbmUsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHhtbC5wYXJzZXJzIGltcG9ydCBleHBhdAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IHB5ZXhwYXQgYXMgZXhwYXQKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIk5vIG1vZHVsZSBuYW1lZCBleHBhdDsgdXNlIFNpbXBsZVhNTFRyZWVCdWlsZGVyIGluc3RlYWQiCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKGVuY29kaW5nLCAifSIpCisgICAgICAgIGlmIHRhcmdldCBpcyBOb25lOgorICAgICAgICAgICAgdGFyZ2V0ID0gVHJlZUJ1aWxkZXIoKQorICAgICAgICAjIHVuZGVyc2NvcmVkIG5hbWVzIGFyZSBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSBvbmx5CisgICAgICAgIHNlbGYucGFyc2VyID0gc2VsZi5fcGFyc2VyID0gcGFyc2VyCisgICAgICAgIHNlbGYudGFyZ2V0ID0gc2VsZi5fdGFyZ2V0ID0gdGFyZ2V0CisgICAgICAgIHNlbGYuX2Vycm9yID0gZXhwYXQuZXJyb3IKKyAgICAgICAgc2VsZi5fbmFtZXMgPSB7fSAjIG5hbWUgbWVtbyBjYWNoZQorICAgICAgICAjIGNhbGxiYWNrcworICAgICAgICBwYXJzZXIuRGVmYXVsdEhhbmRsZXJFeHBhbmQgPSBzZWxmLl9kZWZhdWx0CisgICAgICAgIHBhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyID0gc2VsZi5fc3RhcnQKKyAgICAgICAgcGFyc2VyLkVuZEVsZW1lbnRIYW5kbGVyID0gc2VsZi5fZW5kCisgICAgICAgIHBhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IHNlbGYuX2RhdGEKKyAgICAgICAgIyBvcHRpb25hbCBjYWxsYmFja3MKKyAgICAgICAgcGFyc2VyLkNvbW1lbnRIYW5kbGVyID0gc2VsZi5fY29tbWVudAorICAgICAgICBwYXJzZXIuUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciA9IHNlbGYuX3BpCisgICAgICAgICMgbGV0IGV4cGF0IGRvIHRoZSBidWZmZXJpbmcsIGlmIHN1cHBvcnRlZAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuYnVmZmVyX3RleHQgPSAxCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyB1c2UgbmV3LXN0eWxlIGF0dHJpYnV0ZSBoYW5kbGluZywgaWYgc3VwcG9ydGVkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5vcmRlcmVkX2F0dHJpYnV0ZXMgPSAxCisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuc3BlY2lmaWVkX2F0dHJpYnV0ZXMgPSAxCisgICAgICAgICAgICBwYXJzZXIuU3RhcnRFbGVtZW50SGFuZGxlciA9IHNlbGYuX3N0YXJ0X2xpc3QKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLl9kb2N0eXBlID0gTm9uZQorICAgICAgICBzZWxmLmVudGl0eSA9IHt9CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9ICJFeHBhdCAlZC4lZC4lZCIgJSBleHBhdC52ZXJzaW9uX2luZm8KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcyAjIHVua25vd24KKworICAgIGRlZiBfcmFpc2VlcnJvcihzZWxmLCB2YWx1ZSk6CisgICAgICAgIGVyciA9IFBhcnNlRXJyb3IodmFsdWUpCisgICAgICAgIGVyci5jb2RlID0gdmFsdWUuY29kZQorICAgICAgICBlcnIucG9zaXRpb24gPSB2YWx1ZS5saW5lbm8sIHZhbHVlLm9mZnNldAorICAgICAgICByYWlzZSBlcnIKKworICAgIGRlZiBfZml4dGV4dChzZWxmLCB0ZXh0KToKKyAgICAgICAgIyBjb252ZXJ0IHRleHQgc3RyaW5nIHRvIGFzY2lpLCBpZiBwb3NzaWJsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gdGV4dC5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiB0ZXh0CisKKyAgICBkZWYgX2ZpeG5hbWUoc2VsZiwga2V5KToKKyAgICAgICAgIyBleHBhbmQgcW5hbWUsIGFuZCBjb252ZXJ0IG5hbWUgc3RyaW5nIHRvIGFzY2lpLCBpZiBwb3NzaWJsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lID0gc2VsZi5fbmFtZXNba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBuYW1lID0ga2V5CisgICAgICAgICAgICBpZiAifSIgaW4gbmFtZToKKyAgICAgICAgICAgICAgICBuYW1lID0gInsiICsgbmFtZQorICAgICAgICAgICAgc2VsZi5fbmFtZXNba2V5XSA9IG5hbWUgPSBzZWxmLl9maXh0ZXh0KG5hbWUpCisgICAgICAgIHJldHVybiBuYW1lCisKKyAgICBkZWYgX3N0YXJ0KHNlbGYsIHRhZywgYXR0cmliX2luKToKKyAgICAgICAgZml4bmFtZSA9IHNlbGYuX2ZpeG5hbWUKKyAgICAgICAgZml4dGV4dCA9IHNlbGYuX2ZpeHRleHQKKyAgICAgICAgdGFnID0gZml4bmFtZSh0YWcpCisgICAgICAgIGF0dHJpYiA9IHt9CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGF0dHJpYl9pbi5pdGVtcygpOgorICAgICAgICAgICAgYXR0cmliW2ZpeG5hbWUoa2V5KV0gPSBmaXh0ZXh0KHZhbHVlKQorICAgICAgICByZXR1cm4gc2VsZi50YXJnZXQuc3RhcnQodGFnLCBhdHRyaWIpCisKKyAgICBkZWYgX3N0YXJ0X2xpc3Qoc2VsZiwgdGFnLCBhdHRyaWJfaW4pOgorICAgICAgICBmaXhuYW1lID0gc2VsZi5fZml4bmFtZQorICAgICAgICBmaXh0ZXh0ID0gc2VsZi5fZml4dGV4dAorICAgICAgICB0YWcgPSBmaXhuYW1lKHRhZykKKyAgICAgICAgYXR0cmliID0ge30KKyAgICAgICAgaWYgYXR0cmliX2luOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGF0dHJpYl9pbiksIDIpOgorICAgICAgICAgICAgICAgIGF0dHJpYltmaXhuYW1lKGF0dHJpYl9pbltpXSldID0gZml4dGV4dChhdHRyaWJfaW5baSsxXSkKKyAgICAgICAgcmV0dXJuIHNlbGYudGFyZ2V0LnN0YXJ0KHRhZywgYXR0cmliKQorCisgICAgZGVmIF9kYXRhKHNlbGYsIHRleHQpOgorICAgICAgICByZXR1cm4gc2VsZi50YXJnZXQuZGF0YShzZWxmLl9maXh0ZXh0KHRleHQpKQorCisgICAgZGVmIF9lbmQoc2VsZiwgdGFnKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGFyZ2V0LmVuZChzZWxmLl9maXhuYW1lKHRhZykpCisKKyAgICBkZWYgX2NvbW1lbnQoc2VsZiwgZGF0YSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbW1lbnQgPSBzZWxmLnRhcmdldC5jb21tZW50CisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjb21tZW50KHNlbGYuX2ZpeHRleHQoZGF0YSkpCisKKyAgICBkZWYgX3BpKHNlbGYsIHRhcmdldCwgZGF0YSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBpID0gc2VsZi50YXJnZXQucGkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHBpKHNlbGYuX2ZpeHRleHQodGFyZ2V0KSwgc2VsZi5fZml4dGV4dChkYXRhKSkKKworICAgIGRlZiBfZGVmYXVsdChzZWxmLCB0ZXh0KToKKyAgICAgICAgcHJlZml4ID0gdGV4dFs6MV0KKyAgICAgICAgaWYgcHJlZml4ID09ICImIjoKKyAgICAgICAgICAgICMgZGVhbCB3aXRoIHVuZGVmaW5lZCBlbnRpdGllcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0LmRhdGEoc2VsZi5lbnRpdHlbdGV4dFsxOi0xXV0pCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgZnJvbSB4bWwucGFyc2VycyBpbXBvcnQgZXhwYXQKKyAgICAgICAgICAgICAgICBlcnIgPSBleHBhdC5lcnJvcigKKyAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCBlbnRpdHkgJXM6IGxpbmUgJWQsIGNvbHVtbiAlZCIgJQorICAgICAgICAgICAgICAgICAgICAodGV4dCwgc2VsZi5fcGFyc2VyLkVycm9yTGluZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyc2VyLkVycm9yQ29sdW1uTnVtYmVyKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgZXJyLmNvZGUgPSAxMSAjIFhNTF9FUlJPUl9VTkRFRklORURfRU5USVRZCisgICAgICAgICAgICAgICAgZXJyLmxpbmVubyA9IHNlbGYuX3BhcnNlci5FcnJvckxpbmVOdW1iZXIKKyAgICAgICAgICAgICAgICBlcnIub2Zmc2V0ID0gc2VsZi5fcGFyc2VyLkVycm9yQ29sdW1uTnVtYmVyCisgICAgICAgICAgICAgICAgcmFpc2UgZXJyCisgICAgICAgIGVsaWYgcHJlZml4ID09ICI8IiBhbmQgdGV4dFs6OV0gPT0gIjwhRE9DVFlQRSI6CisgICAgICAgICAgICBzZWxmLl9kb2N0eXBlID0gW10gIyBpbnNpZGUgYSBkb2N0eXBlIGRlY2xhcmF0aW9uCisgICAgICAgIGVsaWYgc2VsZi5fZG9jdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgcGFyc2UgZG9jdHlwZSBjb250ZW50cworICAgICAgICAgICAgaWYgcHJlZml4ID09ICI+IjoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb2N0eXBlID0gTm9uZQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgdGV4dCA9IHRleHQuc3RyaXAoKQorICAgICAgICAgICAgaWYgbm90IHRleHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLl9kb2N0eXBlLmFwcGVuZCh0ZXh0KQorICAgICAgICAgICAgbiA9IGxlbihzZWxmLl9kb2N0eXBlKQorICAgICAgICAgICAgaWYgbiA+IDI6CisgICAgICAgICAgICAgICAgdHlwZSA9IHNlbGYuX2RvY3R5cGVbMV0KKyAgICAgICAgICAgICAgICBpZiB0eXBlID09ICJQVUJMSUMiIGFuZCBuID09IDQ6CisgICAgICAgICAgICAgICAgICAgIG5hbWUsIHR5cGUsIHB1YmlkLCBzeXN0ZW0gPSBzZWxmLl9kb2N0eXBlCisgICAgICAgICAgICAgICAgZWxpZiB0eXBlID09ICJTWVNURU0iIGFuZCBuID09IDM6CisgICAgICAgICAgICAgICAgICAgIG5hbWUsIHR5cGUsIHN5c3RlbSA9IHNlbGYuX2RvY3R5cGUKKyAgICAgICAgICAgICAgICAgICAgcHViaWQgPSBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgaWYgcHViaWQ6CisgICAgICAgICAgICAgICAgICAgIHB1YmlkID0gcHViaWRbMTotMV0KKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYudGFyZ2V0LCAiZG9jdHlwZSIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRhcmdldC5kb2N0eXBlKG5hbWUsIHB1YmlkLCBzeXN0ZW1bMTotMV0pCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLmRvY3R5cGUgaXMgbm90IHNlbGYuX1hNTFBhcnNlcl9fZG9jdHlwZToKKyAgICAgICAgICAgICAgICAgICAgIyB3YXJuIGFib3V0IGRlcHJlY2F0ZWQgY2FsbAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9YTUxQYXJzZXJfX2RvY3R5cGUobmFtZSwgcHViaWQsIHN5c3RlbVsxOi0xXSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kb2N0eXBlKG5hbWUsIHB1YmlkLCBzeXN0ZW1bMTotMV0pCisgICAgICAgICAgICAgICAgc2VsZi5fZG9jdHlwZSA9IE5vbmUKKworICAgICMjCisgICAgIyAoRGVwcmVjYXRlZCkgSGFuZGxlcyBhIGRvY3R5cGUgZGVjbGFyYXRpb24uCisgICAgIworICAgICMgQHBhcmFtIG5hbWUgRG9jdHlwZSBuYW1lLgorICAgICMgQHBhcmFtIHB1YmlkIFB1YmxpYyBpZGVudGlmaWVyLgorICAgICMgQHBhcmFtIHN5c3RlbSBTeXN0ZW0gaWRlbnRpZmllci4KKworICAgIGRlZiBkb2N0eXBlKHNlbGYsIG5hbWUsIHB1YmlkLCBzeXN0ZW0pOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBvZiBYTUxQYXJzZXIgaXMgZGVwcmVjYXRlZC4iIiIKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICJUaGlzIG1ldGhvZCBvZiBYTUxQYXJzZXIgaXMgZGVwcmVjYXRlZC4gIERlZmluZSBkb2N0eXBlKCkgIgorICAgICAgICAgICAgIm1ldGhvZCBvbiB0aGUgVHJlZUJ1aWxkZXIgdGFyZ2V0LiIsCisgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICApCisKKyAgICAjIHNlbnRpbmVsLCBpZiBkb2N0eXBlIGlzIHJlZGVmaW5lZCBpbiBhIHN1YmNsYXNzCisgICAgX19kb2N0eXBlID0gZG9jdHlwZQorCisgICAgIyMKKyAgICAjIEZlZWRzIGRhdGEgdG8gdGhlIHBhcnNlci4KKyAgICAjCisgICAgIyBAcGFyYW0gZGF0YSBFbmNvZGVkIGRhdGEuCisKKyAgICBkZWYgZmVlZChzZWxmLCBkYXRhKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLlBhcnNlKGRhdGEsIDApCisgICAgICAgIGV4Y2VwdCBzZWxmLl9lcnJvciwgdjoKKyAgICAgICAgICAgIHNlbGYuX3JhaXNlZXJyb3IodikKKworICAgICMjCisgICAgIyBGaW5pc2hlcyBmZWVkaW5nIGRhdGEgdG8gdGhlIHBhcnNlci4KKyAgICAjCisgICAgIyBAcmV0dXJuIEFuIGVsZW1lbnQgc3RydWN0dXJlLgorICAgICMgQGRlZnJldHVybiBFbGVtZW50CisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5QYXJzZSgiIiwgMSkgIyBlbmQgb2YgZGF0YQorICAgICAgICBleGNlcHQgc2VsZi5fZXJyb3IsIHY6CisgICAgICAgICAgICBzZWxmLl9yYWlzZWVycm9yKHYpCisgICAgICAgIHRyZWUgPSBzZWxmLnRhcmdldC5jbG9zZSgpCisgICAgICAgIGRlbCBzZWxmLnRhcmdldCwgc2VsZi5fcGFyc2VyICMgZ2V0IHJpZCBvZiBjaXJjdWxhciByZWZlcmVuY2VzCisgICAgICAgIHJldHVybiB0cmVlCisKKyMgY29tcGF0aWJpbGl0eQorWE1MVHJlZUJ1aWxkZXIgPSBYTUxQYXJzZXIKKworIyB3b3JrYXJvdW5kIGNpcmN1bGFyIGltcG9ydC4KK3RyeToKKyAgICBmcm9tIEVsZW1lbnRDMTROIGltcG9ydCBfc2VyaWFsaXplX2MxNG4KKyAgICBfc2VyaWFsaXplWyJjMTRuIl0gPSBfc2VyaWFsaXplX2MxNG4KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50VHJlZS5weWMgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50VHJlZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIxZjE3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50VHJlZS5weW8gYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50VHJlZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiYjU0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZmQ4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9fX2luaXRfXy5weQpAQCAtMCwwICsxLDMzIEBACisjICRJZDogX19pbml0X18ucHkgMzM3NSAyMDA4LTAyLTEzIDA4OjA1OjA4WiBmcmVkcmlrICQKKyMgZWxlbWVudHRyZWUgcGFja2FnZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBFbGVtZW50VHJlZSB0b29sa2l0IGlzCisjCisjIENvcHlyaWdodCAoYykgMTk5OS0yMDA4IGJ5IEZyZWRyaWsgTHVuZGgKKyMKKyMgQnkgb2J0YWluaW5nLCB1c2luZywgYW5kL29yIGNvcHlpbmcgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgaXRzCisjIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiwgeW91IGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwKKyMgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKKyMgaXRzIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzCisjIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4KKyMgYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbgorIyBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YKKyMgU2VjcmV0IExhYnMgQUIgb3IgdGhlIGF1dGhvciBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKKyMgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4KKyMgcHJpb3IgcGVybWlzc2lvbi4KKyMKKyMgU0VDUkVUIExBQlMgQUIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJECisjIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5ULQorIyBBQklMSVRZIEFORCBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0VDUkVUIExBQlMgQUIgT1IgVEhFIEFVVEhPUgorIyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZCisjIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorIyBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUworIyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFCisjIE9GIFRISVMgU09GVFdBUkUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorIyBTZWUgaHR0cDovL3d3dy5weXRob24ub3JnL3BzZi9saWNlbnNlIGZvciBsaWNlbnNpbmcgZGV0YWlscy4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2V0cmVlL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQxZGIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2V0cmVlL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQxZGIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2V0cmVlL2NFbGVtZW50VHJlZS5weSBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL2NFbGVtZW50VHJlZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmYxMjdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvY0VsZW1lbnRUcmVlLnB5CkBAIC0wLDAgKzEsMyBAQAorIyBXcmFwcGVyIG1vZHVsZSBmb3IgX2VsZW1lbnR0cmVlCisKK2Zyb20gX2VsZW1lbnR0cmVlIGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9jRWxlbWVudFRyZWUucHljIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvY0VsZW1lbnRUcmVlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjE5YjQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvY0VsZW1lbnRUcmVlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9jRWxlbWVudFRyZWUucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvY0VsZW1lbnRUcmVlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjE5YjQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvY0VsZW1lbnRUcmVlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjMxNGEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDggQEAKKyIiIlB5dGhvbiBpbnRlcmZhY2VzIHRvIFhNTCBwYXJzZXJzLgorCitUaGlzIHBhY2thZ2UgY29udGFpbnMgb25lIG1vZHVsZToKKworZXhwYXQgLS0gUHl0aG9uIHdyYXBwZXIgZm9yIEphbWVzIENsYXJrJ3MgRXhwYXQgcGFyc2VyLCB3aXRoIG5hbWVzcGFjZQorICAgICAgICAgc3VwcG9ydC4KKworIiIiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcveG1sL3BhcnNlcnMvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MGRjN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcveG1sL3BhcnNlcnMvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MGRjN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL2V4cGF0LnB5IGIvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9leHBhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI1Yzc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9leHBhdC5weQpAQCAtMCwwICsxLDQgQEAKKyIiIkludGVyZmFjZSB0byB0aGUgRXhwYXQgbm9uLXZhbGlkYXRpbmcgWE1MIHBhcnNlci4iIiIKK19fdmVyc2lvbl9fID0gJyRSZXZpc2lvbjogMTc2NDAgJCcKKworZnJvbSBweWV4cGF0IGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL2V4cGF0LnB5YyBiL2xpYi9weXRob24yLjcveG1sL3BhcnNlcnMvZXhwYXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MzIzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL2V4cGF0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL2V4cGF0LnB5byBiL2xpYi9weXRob24yLjcveG1sL3BhcnNlcnMvZXhwYXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MzIzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL2V4cGF0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L3htbC9zYXgvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1YjY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDEwOCBAQAorIiIiU2ltcGxlIEFQSSBmb3IgWE1MIChTQVgpIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24uCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTQVggMiBpbnRlcmZhY2U7CitpbmZvcm1hdGlvbiBhYm91dCB0aGUgSmF2YSB2ZXJzaW9uIG9mIHRoZSBpbnRlcmZhY2UgY2FuIGJlIGZvdW5kIGF0CitodHRwOi8vd3d3Lm1lZ2dpbnNvbi5jb20vU0FYLy4gIFRoZSBQeXRob24gdmVyc2lvbiBvZiB0aGUgaW50ZXJmYWNlIGlzCitkb2N1bWVudGVkIGF0IDwuLi4+LgorCitUaGlzIHBhY2thZ2UgY29udGFpbnMgdGhlIGZvbGxvd2luZyBtb2R1bGVzOgorCitoYW5kbGVyIC0tIEJhc2UgY2xhc3NlcyBhbmQgY29uc3RhbnRzIHdoaWNoIGRlZmluZSB0aGUgU0FYIDIgQVBJIGZvcgorICAgICAgICAgICB0aGUgJ2NsaWVudC1zaWRlJyBvZiBTQVggZm9yIFB5dGhvbi4KKworc2F4dXRpbHMgLS0gSW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbnZlbmllbmNlIGNsYXNzZXMgY29tbW9ubHkgdXNlZCB0bworICAgICAgICAgICAgd29yayB3aXRoIFNBWC4KKworeG1scmVhZGVyIC0tIEJhc2UgY2xhc3NlcyBhbmQgY29uc3RhbnRzIHdoaWNoIGRlZmluZSB0aGUgU0FYIDIgQVBJIGZvcgorICAgICAgICAgICAgIHRoZSBwYXJzZXJzIHVzZWQgd2l0aCBTQVggZm9yIFB5dGhvbi4KKworZXhwYXRyZWFkZXIgLS0gRHJpdmVyIHRoYXQgYWxsb3dzIHVzZSBvZiB0aGUgRXhwYXQgcGFyc2VyIHdpdGggU0FYLgorIiIiCisKK2Zyb20geG1scmVhZGVyIGltcG9ydCBJbnB1dFNvdXJjZQorZnJvbSBoYW5kbGVyIGltcG9ydCBDb250ZW50SGFuZGxlciwgRXJyb3JIYW5kbGVyCitmcm9tIF9leGNlcHRpb25zIGltcG9ydCBTQVhFeGNlcHRpb24sIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBWFJlYWRlck5vdEF2YWlsYWJsZQorCisKK2RlZiBwYXJzZShzb3VyY2UsIGhhbmRsZXIsIGVycm9ySGFuZGxlcj1FcnJvckhhbmRsZXIoKSk6CisgICAgcGFyc2VyID0gbWFrZV9wYXJzZXIoKQorICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKQorICAgIHBhcnNlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKQorICAgIHBhcnNlci5wYXJzZShzb3VyY2UpCisKK2RlZiBwYXJzZVN0cmluZyhzdHJpbmcsIGhhbmRsZXIsIGVycm9ySGFuZGxlcj1FcnJvckhhbmRsZXIoKSk6CisgICAgdHJ5OgorICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKKyAgICBpZiBlcnJvckhhbmRsZXIgaXMgTm9uZToKKyAgICAgICAgZXJyb3JIYW5kbGVyID0gRXJyb3JIYW5kbGVyKCkKKyAgICBwYXJzZXIgPSBtYWtlX3BhcnNlcigpCisgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpCisgICAgcGFyc2VyLnNldEVycm9ySGFuZGxlcihlcnJvckhhbmRsZXIpCisKKyAgICBpbnBzcmMgPSBJbnB1dFNvdXJjZSgpCisgICAgaW5wc3JjLnNldEJ5dGVTdHJlYW0oU3RyaW5nSU8oc3RyaW5nKSkKKyAgICBwYXJzZXIucGFyc2UoaW5wc3JjKQorCisjIHRoaXMgaXMgdGhlIHBhcnNlciBsaXN0IHVzZWQgYnkgdGhlIG1ha2VfcGFyc2VyIGZ1bmN0aW9uIGlmIG5vCisjIGFsdGVybmF0aXZlcyBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycyB0byB0aGUgZnVuY3Rpb24KKworZGVmYXVsdF9wYXJzZXJfbGlzdCA9IFsieG1sLnNheC5leHBhdHJlYWRlciJdCisKKyMgdGVsbCBtb2R1bGVmaW5kZXIgdGhhdCBpbXBvcnRpbmcgc2F4IHBvdGVudGlhbGx5IGltcG9ydHMgZXhwYXRyZWFkZXIKK19mYWxzZSA9IDAKK2lmIF9mYWxzZToKKyAgICBpbXBvcnQgeG1sLnNheC5leHBhdHJlYWRlcgorCitpbXBvcnQgb3MsIHN5cworaWYgIlBZX1NBWF9QQVJTRVIiIGluIG9zLmVudmlyb246CisgICAgZGVmYXVsdF9wYXJzZXJfbGlzdCA9IG9zLmVudmlyb25bIlBZX1NBWF9QQVJTRVIiXS5zcGxpdCgiLCIpCitkZWwgb3MKKworX2tleSA9ICJweXRob24ueG1sLnNheC5wYXJzZXIiCitpZiBzeXMucGxhdGZvcm1bOjRdID09ICJqYXZhIiBhbmQgc3lzLnJlZ2lzdHJ5LmNvbnRhaW5zS2V5KF9rZXkpOgorICAgIGRlZmF1bHRfcGFyc2VyX2xpc3QgPSBzeXMucmVnaXN0cnkuZ2V0UHJvcGVydHkoX2tleSkuc3BsaXQoIiwiKQorCisKK2RlZiBtYWtlX3BhcnNlcihwYXJzZXJfbGlzdCA9IFtdKToKKyAgICAiIiJDcmVhdGVzIGFuZCByZXR1cm5zIGEgU0FYIHBhcnNlci4KKworICAgIENyZWF0ZXMgdGhlIGZpcnN0IHBhcnNlciBpdCBpcyBhYmxlIHRvIGluc3RhbnRpYXRlIG9mIHRoZSBvbmVzCisgICAgZ2l2ZW4gaW4gdGhlIGxpc3QgY3JlYXRlZCBieSBkb2luZyBwYXJzZXJfbGlzdCArCisgICAgZGVmYXVsdF9wYXJzZXJfbGlzdC4gIFRoZSBsaXN0cyBtdXN0IGNvbnRhaW4gdGhlIG5hbWVzIG9mIFB5dGhvbgorICAgIG1vZHVsZXMgY29udGFpbmluZyBib3RoIGEgU0FYIHBhcnNlciBhbmQgYSBjcmVhdGVfcGFyc2VyIGZ1bmN0aW9uLiIiIgorCisgICAgZm9yIHBhcnNlcl9uYW1lIGluIHBhcnNlcl9saXN0ICsgZGVmYXVsdF9wYXJzZXJfbGlzdDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVfcGFyc2VyKHBhcnNlcl9uYW1lKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsZToKKyAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgIGlmIHBhcnNlcl9uYW1lIGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgICAgICMgVGhlIHBhcnNlciBtb2R1bGUgd2FzIGZvdW5kLCBidXQgaW1wb3J0aW5nIGl0CisgICAgICAgICAgICAgICAgIyBmYWlsZWQgdW5leHBlY3RlZGx5LCBwYXNzIHRoaXMgZXhjZXB0aW9uIHRocm91Z2gKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgU0FYUmVhZGVyTm90QXZhaWxhYmxlOgorICAgICAgICAgICAgIyBUaGUgcGFyc2VyIG1vZHVsZSBkZXRlY3RlZCB0aGF0IGl0IHdvbid0IHdvcmsgcHJvcGVybHksCisgICAgICAgICAgICAjIHNvIHRyeSB0aGUgbmV4dCBvbmUKKyAgICAgICAgICAgIHBhc3MKKworICAgIHJhaXNlIFNBWFJlYWRlck5vdEF2YWlsYWJsZSgiTm8gcGFyc2VycyBmb3VuZCIsIE5vbmUpCisKKyMgLS0tIEludGVybmFsIHV0aWxpdHkgbWV0aG9kcyB1c2VkIGJ5IG1ha2VfcGFyc2VyCisKK2lmIHN5cy5wbGF0Zm9ybVsgOiA0XSA9PSAiamF2YSI6CisgICAgZGVmIF9jcmVhdGVfcGFyc2VyKHBhcnNlcl9uYW1lKToKKyAgICAgICAgZnJvbSBvcmcucHl0aG9uLmNvcmUgaW1wb3J0IGltcAorICAgICAgICBkcnZfbW9kdWxlID0gaW1wLmltcG9ydE5hbWUocGFyc2VyX25hbWUsIDAsIGdsb2JhbHMoKSkKKyAgICAgICAgcmV0dXJuIGRydl9tb2R1bGUuY3JlYXRlX3BhcnNlcigpCisKK2Vsc2U6CisgICAgZGVmIF9jcmVhdGVfcGFyc2VyKHBhcnNlcl9uYW1lKToKKyAgICAgICAgZHJ2X21vZHVsZSA9IF9faW1wb3J0X18ocGFyc2VyX25hbWUse30se30sWydjcmVhdGVfcGFyc2VyJ10pCisgICAgICAgIHJldHVybiBkcnZfbW9kdWxlLmNyZWF0ZV9wYXJzZXIoKQorCitkZWwgc3lzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTQzNzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTQzNzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvX2V4Y2VwdGlvbnMucHkgYi9saWIvcHl0aG9uMi43L3htbC9zYXgvX2V4Y2VwdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliMmJhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9fZXhjZXB0aW9ucy5weQpAQCAtMCwwICsxLDEzMSBAQAorIiIiRGlmZmVyZW50IGtpbmRzIG9mIFNBWCBFeGNlcHRpb25zIiIiCitpbXBvcnQgc3lzCitpZiBzeXMucGxhdGZvcm1bOjRdID09ICJqYXZhIjoKKyAgICBmcm9tIGphdmEubGFuZyBpbXBvcnQgRXhjZXB0aW9uCitkZWwgc3lzCisKKyMgPT09PT0gU0FYRVhDRVBUSU9OID09PT09CisKK2NsYXNzIFNBWEV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgICIiIkVuY2Fwc3VsYXRlIGFuIFhNTCBlcnJvciBvciB3YXJuaW5nLiBUaGlzIGNsYXNzIGNhbiBjb250YWluCisgICAgYmFzaWMgZXJyb3Igb3Igd2FybmluZyBpbmZvcm1hdGlvbiBmcm9tIGVpdGhlciB0aGUgWE1MIHBhcnNlciBvcgorICAgIHRoZSBhcHBsaWNhdGlvbjogeW91IGNhbiBzdWJjbGFzcyBpdCB0byBwcm92aWRlIGFkZGl0aW9uYWwKKyAgICBmdW5jdGlvbmFsaXR5LCBvciB0byBhZGQgbG9jYWxpemF0aW9uLiBOb3RlIHRoYXQgYWx0aG91Z2ggeW91IHdpbGwKKyAgICByZWNlaXZlIGEgU0FYRXhjZXB0aW9uIGFzIHRoZSBhcmd1bWVudCB0byB0aGUgaGFuZGxlcnMgaW4gdGhlCisgICAgRXJyb3JIYW5kbGVyIGludGVyZmFjZSwgeW91IGFyZSBub3QgYWN0dWFsbHkgcmVxdWlyZWQgdG8gcmFpc2UKKyAgICB0aGUgZXhjZXB0aW9uOyBpbnN0ZWFkLCB5b3UgY2FuIHNpbXBseSByZWFkIHRoZSBpbmZvcm1hdGlvbiBpbgorICAgIGl0LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgZXhjZXB0aW9uPU5vbmUpOgorICAgICAgICAiIiJDcmVhdGVzIGFuIGV4Y2VwdGlvbi4gVGhlIG1lc3NhZ2UgaXMgcmVxdWlyZWQsIGJ1dCB0aGUgZXhjZXB0aW9uCisgICAgICAgIGlzIG9wdGlvbmFsLiIiIgorICAgICAgICBzZWxmLl9tc2cgPSBtc2cKKyAgICAgICAgc2VsZi5fZXhjZXB0aW9uID0gZXhjZXB0aW9uCisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtc2cpCisKKyAgICBkZWYgZ2V0TWVzc2FnZShzZWxmKToKKyAgICAgICAgIlJldHVybiBhIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX21zZworCisgICAgZGVmIGdldEV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgIlJldHVybiB0aGUgZW1iZWRkZWQgZXhjZXB0aW9uLCBvciBOb25lIGlmIHRoZXJlIHdhcyBub25lLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4Y2VwdGlvbgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICJDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGV4Y2VwdGlvbi4iCisgICAgICAgIHJldHVybiBzZWxmLl9tc2cKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpeCk6CisgICAgICAgICIiIkF2b2lkcyB3ZWlyZCBlcnJvciBtZXNzYWdlcyBpZiBzb21lb25lIGRvZXMgZXhjZXB0aW9uW2l4XSBieQorICAgICAgICBtaXN0YWtlLCBzaW5jZSBFeGNlcHRpb24gaGFzIF9fZ2V0aXRlbV9fIGRlZmluZWQuIiIiCisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJfX2dldGl0ZW1fXyIpCisKKworIyA9PT09PSBTQVhQQVJTRUVYQ0VQVElPTiA9PT09PQorCitjbGFzcyBTQVhQYXJzZUV4Y2VwdGlvbihTQVhFeGNlcHRpb24pOgorICAgICIiIkVuY2Fwc3VsYXRlIGFuIFhNTCBwYXJzZSBlcnJvciBvciB3YXJuaW5nLgorCisgICAgVGhpcyBleGNlcHRpb24gd2lsbCBpbmNsdWRlIGluZm9ybWF0aW9uIGZvciBsb2NhdGluZyB0aGUgZXJyb3IgaW4KKyAgICB0aGUgb3JpZ2luYWwgWE1MIGRvY3VtZW50LiBOb3RlIHRoYXQgYWx0aG91Z2ggdGhlIGFwcGxpY2F0aW9uIHdpbGwKKyAgICByZWNlaXZlIGEgU0FYUGFyc2VFeGNlcHRpb24gYXMgdGhlIGFyZ3VtZW50IHRvIHRoZSBoYW5kbGVycyBpbiB0aGUKKyAgICBFcnJvckhhbmRsZXIgaW50ZXJmYWNlLCB0aGUgYXBwbGljYXRpb24gaXMgbm90IGFjdHVhbGx5IHJlcXVpcmVkCisgICAgdG8gcmFpc2UgdGhlIGV4Y2VwdGlvbjsgaW5zdGVhZCwgaXQgY2FuIHNpbXBseSByZWFkIHRoZQorICAgIGluZm9ybWF0aW9uIGluIGl0IGFuZCB0YWtlIGEgZGlmZmVyZW50IGFjdGlvbi4KKworICAgIFNpbmNlIHRoaXMgZXhjZXB0aW9uIGlzIGEgc3ViY2xhc3Mgb2YgU0FYRXhjZXB0aW9uLCBpdCBpbmhlcml0cworICAgIHRoZSBhYmlsaXR5IHRvIHdyYXAgYW5vdGhlciBleGNlcHRpb24uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbXNnLCBleGNlcHRpb24sIGxvY2F0b3IpOgorICAgICAgICAiQ3JlYXRlcyB0aGUgZXhjZXB0aW9uLiBUaGUgZXhjZXB0aW9uIHBhcmFtZXRlciBpcyBhbGxvd2VkIHRvIGJlIE5vbmUuIgorICAgICAgICBTQVhFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbXNnLCBleGNlcHRpb24pCisgICAgICAgIHNlbGYuX2xvY2F0b3IgPSBsb2NhdG9yCisKKyAgICAgICAgIyBXZSBuZWVkIHRvIGNhY2hlIHRoaXMgc3R1ZmYgYXQgY29uc3RydWN0aW9uIHRpbWUuCisgICAgICAgICMgSWYgdGhpcyBleGNlcHRpb24gaXMgcmFpc2VkLCB0aGUgb2JqZWN0cyB0aHJvdWdoIHdoaWNoIHdlIG11c3QKKyAgICAgICAgIyB0cmF2ZXJzZSB0byBnZXQgdGhpcyBpbmZvcm1hdGlvbiBtYXkgYmUgZGVsZXRlZCBieSB0aGUgdGltZQorICAgICAgICAjIGl0IGdldHMgY2F1Z2h0LgorICAgICAgICBzZWxmLl9zeXN0ZW1JZCA9IHNlbGYuX2xvY2F0b3IuZ2V0U3lzdGVtSWQoKQorICAgICAgICBzZWxmLl9jb2xudW0gPSBzZWxmLl9sb2NhdG9yLmdldENvbHVtbk51bWJlcigpCisgICAgICAgIHNlbGYuX2xpbmVudW0gPSBzZWxmLl9sb2NhdG9yLmdldExpbmVOdW1iZXIoKQorCisgICAgZGVmIGdldENvbHVtbk51bWJlcihzZWxmKToKKyAgICAgICAgIiIiVGhlIGNvbHVtbiBudW1iZXIgb2YgdGhlIGVuZCBvZiB0aGUgdGV4dCB3aGVyZSB0aGUgZXhjZXB0aW9uCisgICAgICAgIG9jY3VycmVkLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY29sbnVtCisKKyAgICBkZWYgZ2V0TGluZU51bWJlcihzZWxmKToKKyAgICAgICAgIlRoZSBsaW5lIG51bWJlciBvZiB0aGUgZW5kIG9mIHRoZSB0ZXh0IHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuIgorICAgICAgICByZXR1cm4gc2VsZi5fbGluZW51bQorCisgICAgZGVmIGdldFB1YmxpY0lkKHNlbGYpOgorICAgICAgICAiR2V0IHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgZW50aXR5IHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuIgorICAgICAgICByZXR1cm4gc2VsZi5fbG9jYXRvci5nZXRQdWJsaWNJZCgpCisKKyAgICBkZWYgZ2V0U3lzdGVtSWQoc2VsZik6CisgICAgICAgICJHZXQgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBlbnRpdHkgd2hlcmUgdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZC4iCisgICAgICAgIHJldHVybiBzZWxmLl9zeXN0ZW1JZAorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICJDcmVhdGUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGV4Y2VwdGlvbi4iCisgICAgICAgIHN5c2lkID0gc2VsZi5nZXRTeXN0ZW1JZCgpCisgICAgICAgIGlmIHN5c2lkIGlzIE5vbmU6CisgICAgICAgICAgICBzeXNpZCA9ICI8dW5rbm93bj4iCisgICAgICAgIGxpbmVudW0gPSBzZWxmLmdldExpbmVOdW1iZXIoKQorICAgICAgICBpZiBsaW5lbnVtIGlzIE5vbmU6CisgICAgICAgICAgICBsaW5lbnVtID0gIj8iCisgICAgICAgIGNvbG51bSA9IHNlbGYuZ2V0Q29sdW1uTnVtYmVyKCkKKyAgICAgICAgaWYgY29sbnVtIGlzIE5vbmU6CisgICAgICAgICAgICBjb2xudW0gPSAiPyIKKyAgICAgICAgcmV0dXJuICIlczolczolczogJXMiICUgKHN5c2lkLCBsaW5lbnVtLCBjb2xudW0sIHNlbGYuX21zZykKKworCisjID09PT09IFNBWE5PVFJFQ09HTklaRURFWENFUFRJT04gPT09PT0KKworY2xhc3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbihTQVhFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiBjbGFzcyBmb3IgYW4gdW5yZWNvZ25pemVkIGlkZW50aWZpZXIuCisKKyAgICBBbiBYTUxSZWFkZXIgd2lsbCByYWlzZSB0aGlzIGV4Y2VwdGlvbiB3aGVuIGl0IGlzIGNvbmZyb250ZWQgd2l0aCBhbgorICAgIHVucmVjb2duaXplZCBmZWF0dXJlIG9yIHByb3BlcnR5LiBTQVggYXBwbGljYXRpb25zIGFuZCBleHRlbnNpb25zIG1heQorICAgIHVzZSB0aGlzIGNsYXNzIGZvciBzaW1pbGFyIHB1cnBvc2VzLiIiIgorCisKKyMgPT09PT0gU0FYTk9UU1VQUE9SVEVERVhDRVBUSU9OID09PT09CisKK2NsYXNzIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTQVhFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiBjbGFzcyBmb3IgYW4gdW5zdXBwb3J0ZWQgb3BlcmF0aW9uLgorCisgICAgQW4gWE1MUmVhZGVyIHdpbGwgcmFpc2UgdGhpcyBleGNlcHRpb24gd2hlbiBhIHNlcnZpY2UgaXQgY2Fubm90CisgICAgcGVyZm9ybSBpcyByZXF1ZXN0ZWQgKHNwZWNpZmljYWxseSBzZXR0aW5nIGEgc3RhdGUgb3IgdmFsdWUpLiBTQVgKKyAgICBhcHBsaWNhdGlvbnMgYW5kIGV4dGVuc2lvbnMgbWF5IHVzZSB0aGlzIGNsYXNzIGZvciBzaW1pbGFyCisgICAgcHVycG9zZXMuIiIiCisKKyMgPT09PT0gU0FYTk9UU1VQUE9SVEVERVhDRVBUSU9OID09PT09CisKK2NsYXNzIFNBWFJlYWRlck5vdEF2YWlsYWJsZShTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiBjbGFzcyBmb3IgYSBtaXNzaW5nIGRyaXZlci4KKworICAgIEFuIFhNTFJlYWRlciBtb2R1bGUgKGRyaXZlcikgc2hvdWxkIHJhaXNlIHRoaXMgZXhjZXB0aW9uIHdoZW4gaXQKKyAgICBpcyBmaXJzdCBpbXBvcnRlZCwgZS5nLiB3aGVuIGEgc3VwcG9ydCBtb2R1bGUgY2Fubm90IGJlIGltcG9ydGVkLgorICAgIEl0IGFsc28gbWF5IGJlIHJhaXNlZCBkdXJpbmcgcGFyc2luZywgZS5nLiBpZiBleGVjdXRpbmcgYW4gZXh0ZXJuYWwKKyAgICBwcm9ncmFtIGlzIG5vdCBwZXJtaXR0ZWQuIiIiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvX2V4Y2VwdGlvbnMucHljIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L19leGNlcHRpb25zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWEyNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L19leGNlcHRpb25zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvX2V4Y2VwdGlvbnMucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L19leGNlcHRpb25zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWEyNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L19leGNlcHRpb25zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvZXhwYXRyZWFkZXIucHkgYi9saWIvcHl0aG9uMi43L3htbC9zYXgvZXhwYXRyZWFkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlM2U3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9leHBhdHJlYWRlci5weQpAQCAtMCwwICsxLDQxNyBAQAorIiIiCitTQVggZHJpdmVyIGZvciB0aGUgcHlleHBhdCBDIG1vZHVsZS4gIFRoaXMgZHJpdmVyIHdvcmtzIHdpdGgKK3B5ZXhwYXQuX192ZXJzaW9uX18gPT0gJzIuMjInLgorIiIiCisKK3ZlcnNpb24gPSAiMC4yMCIKKworZnJvbSB4bWwuc2F4Ll9leGNlcHRpb25zIGltcG9ydCAqCitmcm9tIHhtbC5zYXguaGFuZGxlciBpbXBvcnQgZmVhdHVyZV92YWxpZGF0aW9uLCBmZWF0dXJlX25hbWVzcGFjZXMKK2Zyb20geG1sLnNheC5oYW5kbGVyIGltcG9ydCBmZWF0dXJlX25hbWVzcGFjZV9wcmVmaXhlcworZnJvbSB4bWwuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfZXh0ZXJuYWxfZ2VzLCBmZWF0dXJlX2V4dGVybmFsX3BlcworZnJvbSB4bWwuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfc3RyaW5nX2ludGVybmluZworZnJvbSB4bWwuc2F4LmhhbmRsZXIgaW1wb3J0IHByb3BlcnR5X3htbF9zdHJpbmcsIHByb3BlcnR5X2ludGVybmluZ19kaWN0CisKKyMgeG1sLnBhcnNlcnMuZXhwYXQgZG9lcyBub3QgcmFpc2UgSW1wb3J0RXJyb3IgaW4gSnl0aG9uCitpbXBvcnQgc3lzCitpZiBzeXMucGxhdGZvcm1bOjRdID09ICJqYXZhIjoKKyAgICByYWlzZSBTQVhSZWFkZXJOb3RBdmFpbGFibGUoImV4cGF0IG5vdCBhdmFpbGFibGUgaW4gSmF2YSIsIE5vbmUpCitkZWwgc3lzCisKK3RyeToKKyAgICBmcm9tIHhtbC5wYXJzZXJzIGltcG9ydCBleHBhdAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHJhaXNlIFNBWFJlYWRlck5vdEF2YWlsYWJsZSgiZXhwYXQgbm90IHN1cHBvcnRlZCIsIE5vbmUpCitlbHNlOgorICAgIGlmIG5vdCBoYXNhdHRyKGV4cGF0LCAiUGFyc2VyQ3JlYXRlIik6CisgICAgICAgIHJhaXNlIFNBWFJlYWRlck5vdEF2YWlsYWJsZSgiZXhwYXQgbm90IHN1cHBvcnRlZCIsIE5vbmUpCitmcm9tIHhtbC5zYXggaW1wb3J0IHhtbHJlYWRlciwgc2F4dXRpbHMsIGhhbmRsZXIKKworQXR0cmlidXRlc0ltcGwgPSB4bWxyZWFkZXIuQXR0cmlidXRlc0ltcGwKK0F0dHJpYnV0ZXNOU0ltcGwgPSB4bWxyZWFkZXIuQXR0cmlidXRlc05TSW1wbAorCisjIElmIHdlJ3JlIHVzaW5nIGEgc3VmZmljaWVudGx5IHJlY2VudCB2ZXJzaW9uIG9mIFB5dGhvbiwgd2UgY2FuIHVzZQorIyB3ZWFrIHJlZmVyZW5jZXMgdG8gYXZvaWQgY3ljbGVzIGJldHdlZW4gdGhlIHBhcnNlciBhbmQgY29udGVudAorIyBoYW5kbGVyLCBvdGhlcndpc2Ugd2UnbGwganVzdCBoYXZlIHRvIHByZXRlbmQuCit0cnk6CisgICAgaW1wb3J0IF93ZWFrcmVmCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZGVmIF9ta3Byb3h5KG8pOgorICAgICAgICByZXR1cm4gbworZWxzZToKKyAgICBpbXBvcnQgd2Vha3JlZgorICAgIF9ta3Byb3h5ID0gd2Vha3JlZi5wcm94eQorICAgIGRlbCB3ZWFrcmVmLCBfd2Vha3JlZgorCisjIC0tLSBFeHBhdExvY2F0b3IKKworY2xhc3MgRXhwYXRMb2NhdG9yKHhtbHJlYWRlci5Mb2NhdG9yKToKKyAgICAiIiJMb2NhdG9yIGZvciB1c2Ugd2l0aCB0aGUgRXhwYXRQYXJzZXIgY2xhc3MuCisKKyAgICBUaGlzIHVzZXMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgcGFyc2VyIG9iamVjdCB0byBhdm9pZCBjcmVhdGluZworICAgIGEgY2lyY3VsYXIgcmVmZXJlbmNlIGJldHdlZW4gdGhlIHBhcnNlciBhbmQgdGhlIGNvbnRlbnQgaGFuZGxlci4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyKToKKyAgICAgICAgc2VsZi5fcmVmID0gX21rcHJveHkocGFyc2VyKQorCisgICAgZGVmIGdldENvbHVtbk51bWJlcihzZWxmKToKKyAgICAgICAgcGFyc2VyID0gc2VsZi5fcmVmCisgICAgICAgIGlmIHBhcnNlci5fcGFyc2VyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gcGFyc2VyLl9wYXJzZXIuRXJyb3JDb2x1bW5OdW1iZXIKKworICAgIGRlZiBnZXRMaW5lTnVtYmVyKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBzZWxmLl9yZWYKKyAgICAgICAgaWYgcGFyc2VyLl9wYXJzZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHJldHVybiBwYXJzZXIuX3BhcnNlci5FcnJvckxpbmVOdW1iZXIKKworICAgIGRlZiBnZXRQdWJsaWNJZChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gc2VsZi5fcmVmCisgICAgICAgIGlmIHBhcnNlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHBhcnNlci5fc291cmNlLmdldFB1YmxpY0lkKCkKKworICAgIGRlZiBnZXRTeXN0ZW1JZChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gc2VsZi5fcmVmCisgICAgICAgIGlmIHBhcnNlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHBhcnNlci5fc291cmNlLmdldFN5c3RlbUlkKCkKKworCisjIC0tLSBFeHBhdFBhcnNlcgorCitjbGFzcyBFeHBhdFBhcnNlcih4bWxyZWFkZXIuSW5jcmVtZW50YWxQYXJzZXIsIHhtbHJlYWRlci5Mb2NhdG9yKToKKyAgICAiIiJTQVggZHJpdmVyIGZvciB0aGUgcHlleHBhdCBDIG1vZHVsZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lc3BhY2VIYW5kbGluZz0wLCBidWZzaXplPTIqKjE2LTIwKToKKyAgICAgICAgeG1scmVhZGVyLkluY3JlbWVudGFsUGFyc2VyLl9faW5pdF9fKHNlbGYsIGJ1ZnNpemUpCisgICAgICAgIHNlbGYuX3NvdXJjZSA9IHhtbHJlYWRlci5JbnB1dFNvdXJjZSgpCisgICAgICAgIHNlbGYuX3BhcnNlciA9IE5vbmUKKyAgICAgICAgc2VsZi5fbmFtZXNwYWNlcyA9IG5hbWVzcGFjZUhhbmRsaW5nCisgICAgICAgIHNlbGYuX2xleF9oYW5kbGVyX3Byb3AgPSBOb25lCisgICAgICAgIHNlbGYuX3BhcnNpbmcgPSAwCisgICAgICAgIHNlbGYuX2VudGl0eV9zdGFjayA9IFtdCisgICAgICAgIHNlbGYuX2V4dGVybmFsX2dlcyA9IDEKKyAgICAgICAgc2VsZi5faW50ZXJuaW5nID0gTm9uZQorCisgICAgIyBYTUxSZWFkZXIgbWV0aG9kcworCisgICAgZGVmIHBhcnNlKHNlbGYsIHNvdXJjZSk6CisgICAgICAgICJQYXJzZSBhbiBYTUwgZG9jdW1lbnQgZnJvbSBhIFVSTCBvciBhbiBJbnB1dFNvdXJjZS4iCisgICAgICAgIHNvdXJjZSA9IHNheHV0aWxzLnByZXBhcmVfaW5wdXRfc291cmNlKHNvdXJjZSkKKworICAgICAgICBzZWxmLl9zb3VyY2UgPSBzb3VyY2UKKyAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5zZXREb2N1bWVudExvY2F0b3IoRXhwYXRMb2NhdG9yKHNlbGYpKQorICAgICAgICB4bWxyZWFkZXIuSW5jcmVtZW50YWxQYXJzZXIucGFyc2Uoc2VsZiwgc291cmNlKQorCisgICAgZGVmIHByZXBhcmVQYXJzZXIoc2VsZiwgc291cmNlKToKKyAgICAgICAgaWYgc291cmNlLmdldFN5c3RlbUlkKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBiYXNlID0gc291cmNlLmdldFN5c3RlbUlkKCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYmFzZSwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgYmFzZSA9IGJhc2UuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuU2V0QmFzZShiYXNlKQorCisgICAgIyBSZWRlZmluZWQgc2V0Q29udGVudEhhbmRsZXIgdG8gYWxsb3cgY2hhbmdpbmcgaGFuZGxlcnMgZHVyaW5nIHBhcnNpbmcKKworICAgIGRlZiBzZXRDb250ZW50SGFuZGxlcihzZWxmLCBoYW5kbGVyKToKKyAgICAgICAgeG1scmVhZGVyLkluY3JlbWVudGFsUGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHNlbGYsIGhhbmRsZXIpCisgICAgICAgIGlmIHNlbGYuX3BhcnNpbmc6CisgICAgICAgICAgICBzZWxmLl9yZXNldF9jb250X2hhbmRsZXIoKQorCisgICAgZGVmIGdldEZlYXR1cmUoc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgPT0gZmVhdHVyZV9uYW1lc3BhY2VzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX25hbWVzcGFjZXMKKyAgICAgICAgZWxpZiBuYW1lID09IGZlYXR1cmVfc3RyaW5nX2ludGVybmluZzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9pbnRlcm5pbmcgaXMgbm90IE5vbmUKKyAgICAgICAgZWxpZiBuYW1lIGluIChmZWF0dXJlX3ZhbGlkYXRpb24sIGZlYXR1cmVfZXh0ZXJuYWxfcGVzLAorICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfbmFtZXNwYWNlX3ByZWZpeGVzKToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGVsaWYgbmFtZSA9PSBmZWF0dXJlX2V4dGVybmFsX2dlczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9leHRlcm5hbF9nZXMKKyAgICAgICAgcmFpc2UgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbigiRmVhdHVyZSAnJXMnIG5vdCByZWNvZ25pemVkIiAlIG5hbWUpCisKKyAgICBkZWYgc2V0RmVhdHVyZShzZWxmLCBuYW1lLCBzdGF0ZSk6CisgICAgICAgIGlmIHNlbGYuX3BhcnNpbmc6CisgICAgICAgICAgICByYWlzZSBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIkNhbm5vdCBzZXQgZmVhdHVyZXMgd2hpbGUgcGFyc2luZyIpCisKKyAgICAgICAgaWYgbmFtZSA9PSBmZWF0dXJlX25hbWVzcGFjZXM6CisgICAgICAgICAgICBzZWxmLl9uYW1lc3BhY2VzID0gc3RhdGUKKyAgICAgICAgZWxpZiBuYW1lID09IGZlYXR1cmVfZXh0ZXJuYWxfZ2VzOgorICAgICAgICAgICAgc2VsZi5fZXh0ZXJuYWxfZ2VzID0gc3RhdGUKKyAgICAgICAgZWxpZiBuYW1lID09IGZlYXR1cmVfc3RyaW5nX2ludGVybmluZzoKKyAgICAgICAgICAgIGlmIHN0YXRlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2ludGVybmluZyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnRlcm5pbmcgPSB7fQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9pbnRlcm5pbmcgPSBOb25lCisgICAgICAgIGVsaWYgbmFtZSA9PSBmZWF0dXJlX3ZhbGlkYXRpb246CisgICAgICAgICAgICBpZiBzdGF0ZToKKyAgICAgICAgICAgICAgICByYWlzZSBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJleHBhdCBkb2VzIG5vdCBzdXBwb3J0IHZhbGlkYXRpb24iKQorICAgICAgICBlbGlmIG5hbWUgPT0gZmVhdHVyZV9leHRlcm5hbF9wZXM6CisgICAgICAgICAgICBpZiBzdGF0ZToKKyAgICAgICAgICAgICAgICByYWlzZSBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJleHBhdCBkb2VzIG5vdCByZWFkIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdGllcyIpCisgICAgICAgIGVsaWYgbmFtZSA9PSBmZWF0dXJlX25hbWVzcGFjZV9wcmVmaXhlczoKKyAgICAgICAgICAgIGlmIHN0YXRlOgorICAgICAgICAgICAgICAgIHJhaXNlIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgImV4cGF0IGRvZXMgbm90IHJlcG9ydCBuYW1lc3BhY2UgcHJlZml4ZXMiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRmVhdHVyZSAnJXMnIG5vdCByZWNvZ25pemVkIiAlIG5hbWUpCisKKyAgICBkZWYgZ2V0UHJvcGVydHkoc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgPT0gaGFuZGxlci5wcm9wZXJ0eV9sZXhpY2FsX2hhbmRsZXI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbGV4X2hhbmRsZXJfcHJvcAorICAgICAgICBlbGlmIG5hbWUgPT0gcHJvcGVydHlfaW50ZXJuaW5nX2RpY3Q6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5faW50ZXJuaW5nCisgICAgICAgIGVsaWYgbmFtZSA9PSBwcm9wZXJ0eV94bWxfc3RyaW5nOgorICAgICAgICAgICAgaWYgc2VsZi5fcGFyc2VyOgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fcGFyc2VyLCAiR2V0SW5wdXRDb250ZXh0Iik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZXIuR2V0SW5wdXRDb250ZXh0KCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoaXMgdmVyc2lvbiBvZiBleHBhdCBkb2VzIG5vdCBzdXBwb3J0IGdldHRpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAiIHRoZSBYTUwgc3RyaW5nIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiWE1MIHN0cmluZyBjYW5ub3QgYmUgcmV0dXJuZWQgd2hlbiBub3QgcGFyc2luZyIpCisgICAgICAgIHJhaXNlIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24oIlByb3BlcnR5ICclcycgbm90IHJlY29nbml6ZWQiICUgbmFtZSkKKworICAgIGRlZiBzZXRQcm9wZXJ0eShzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgIGlmIG5hbWUgPT0gaGFuZGxlci5wcm9wZXJ0eV9sZXhpY2FsX2hhbmRsZXI6CisgICAgICAgICAgICBzZWxmLl9sZXhfaGFuZGxlcl9wcm9wID0gdmFsdWUKKyAgICAgICAgICAgIGlmIHNlbGYuX3BhcnNpbmc6CisgICAgICAgICAgICAgICAgc2VsZi5fcmVzZXRfbGV4X2hhbmRsZXJfcHJvcCgpCisgICAgICAgIGVsaWYgbmFtZSA9PSBwcm9wZXJ0eV9pbnRlcm5pbmdfZGljdDoKKyAgICAgICAgICAgIHNlbGYuX2ludGVybmluZyA9IHZhbHVlCisgICAgICAgIGVsaWYgbmFtZSA9PSBwcm9wZXJ0eV94bWxfc3RyaW5nOgorICAgICAgICAgICAgcmFpc2UgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJQcm9wZXJ0eSAnJXMnIGNhbm5vdCBiZSBzZXQiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbigiUHJvcGVydHkgJyVzJyBub3QgcmVjb2duaXplZCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lKQorCisgICAgIyBJbmNyZW1lbnRhbFBhcnNlciBtZXRob2RzCisKKyAgICBkZWYgZmVlZChzZWxmLCBkYXRhLCBpc0ZpbmFsID0gMCk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9wYXJzaW5nOgorICAgICAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgICAgICBzZWxmLl9wYXJzaW5nID0gMQorICAgICAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLnN0YXJ0RG9jdW1lbnQoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgVGhlIGlzRmluYWwgcGFyYW1ldGVyIGlzIGludGVybmFsIHRvIHRoZSBleHBhdCByZWFkZXIuCisgICAgICAgICAgICAjIElmIGl0IGlzIHNldCB0byB0cnVlLCBleHBhdCB3aWxsIGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBlbnRpcmUKKyAgICAgICAgICAgICMgZG9jdW1lbnQuIFdoZW4gZmVlZGluZyBjaHVua3MsIHRoZXkgYXJlIG5vdCBub3JtYWxseSBmaW5hbCAtCisgICAgICAgICAgICAjIGV4Y2VwdCB3aGVuIGludm9rZWQgZnJvbSBjbG9zZS4KKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5QYXJzZShkYXRhLCBpc0ZpbmFsKQorICAgICAgICBleGNlcHQgZXhwYXQuZXJyb3IsIGU6CisgICAgICAgICAgICBleGMgPSBTQVhQYXJzZUV4Y2VwdGlvbihleHBhdC5FcnJvclN0cmluZyhlLmNvZGUpLCBlLCBzZWxmKQorICAgICAgICAgICAgIyBGSVhNRTogd2hlbiB0byBpbnZva2UgZXJyb3IoKT8KKyAgICAgICAgICAgIHNlbGYuX2Vycl9oYW5kbGVyLmZhdGFsRXJyb3IoZXhjKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9lbnRpdHlfc3RhY2s6CisgICAgICAgICAgICAjIElmIHdlIGFyZSBjb21wbGV0aW5nIGFuIGV4dGVybmFsIGVudGl0eSwgZG8gbm90aGluZyBoZXJlCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5mZWVkKCIiLCBpc0ZpbmFsID0gMSkKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLmVuZERvY3VtZW50KCkKKyAgICAgICAgc2VsZi5fcGFyc2luZyA9IDAKKyAgICAgICAgIyBicmVhayBjeWNsZSBjcmVhdGVkIGJ5IGV4cGF0IGhhbmRsZXJzIHBvaW50aW5nIHRvIG91ciBtZXRob2RzCisgICAgICAgIHNlbGYuX3BhcnNlciA9IE5vbmUKKworICAgIGRlZiBfcmVzZXRfY29udF9oYW5kbGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9wYXJzZXIuUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KKyAgICAgICAgc2VsZi5fcGFyc2VyLkNoYXJhY3RlckRhdGFIYW5kbGVyID0gc2VsZi5fY29udF9oYW5kbGVyLmNoYXJhY3RlcnMKKworICAgIGRlZiBfcmVzZXRfbGV4X2hhbmRsZXJfcHJvcChzZWxmKToKKyAgICAgICAgbGV4ID0gc2VsZi5fbGV4X2hhbmRsZXJfcHJvcAorICAgICAgICBwYXJzZXIgPSBzZWxmLl9wYXJzZXIKKyAgICAgICAgaWYgbGV4IGlzIE5vbmU6CisgICAgICAgICAgICBwYXJzZXIuQ29tbWVudEhhbmRsZXIgPSBOb25lCisgICAgICAgICAgICBwYXJzZXIuU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyID0gTm9uZQorICAgICAgICAgICAgcGFyc2VyLkVuZENkYXRhU2VjdGlvbkhhbmRsZXIgPSBOb25lCisgICAgICAgICAgICBwYXJzZXIuU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgPSBOb25lCisgICAgICAgICAgICBwYXJzZXIuRW5kRG9jdHlwZURlY2xIYW5kbGVyID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyc2VyLkNvbW1lbnRIYW5kbGVyID0gbGV4LmNvbW1lbnQKKyAgICAgICAgICAgIHBhcnNlci5TdGFydENkYXRhU2VjdGlvbkhhbmRsZXIgPSBsZXguc3RhcnRDREFUQQorICAgICAgICAgICAgcGFyc2VyLkVuZENkYXRhU2VjdGlvbkhhbmRsZXIgPSBsZXguZW5kQ0RBVEEKKyAgICAgICAgICAgIHBhcnNlci5TdGFydERvY3R5cGVEZWNsSGFuZGxlciA9IHNlbGYuc3RhcnRfZG9jdHlwZV9kZWNsCisgICAgICAgICAgICBwYXJzZXIuRW5kRG9jdHlwZURlY2xIYW5kbGVyID0gbGV4LmVuZERURAorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9uYW1lc3BhY2VzOgorICAgICAgICAgICAgc2VsZi5fcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKHNlbGYuX3NvdXJjZS5nZXRFbmNvZGluZygpLCAiICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuPXNlbGYuX2ludGVybmluZykKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5uYW1lc3BhY2VfcHJlZml4ZXMgPSAxCisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuU3RhcnRFbGVtZW50SGFuZGxlciA9IHNlbGYuc3RhcnRfZWxlbWVudF9ucworICAgICAgICAgICAgc2VsZi5fcGFyc2VyLkVuZEVsZW1lbnRIYW5kbGVyID0gc2VsZi5lbmRfZWxlbWVudF9ucworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKHNlbGYuX3NvdXJjZS5nZXRFbmNvZGluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybiA9IHNlbGYuX2ludGVybmluZykKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyID0gc2VsZi5zdGFydF9lbGVtZW50CisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuRW5kRWxlbWVudEhhbmRsZXIgPSBzZWxmLmVuZF9lbGVtZW50CisKKyAgICAgICAgc2VsZi5fcmVzZXRfY29udF9oYW5kbGVyKCkKKyAgICAgICAgc2VsZi5fcGFyc2VyLlVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgPSBzZWxmLnVucGFyc2VkX2VudGl0eV9kZWNsCisgICAgICAgIHNlbGYuX3BhcnNlci5Ob3RhdGlvbkRlY2xIYW5kbGVyID0gc2VsZi5ub3RhdGlvbl9kZWNsCisgICAgICAgIHNlbGYuX3BhcnNlci5TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyID0gc2VsZi5zdGFydF9uYW1lc3BhY2VfZGVjbAorICAgICAgICBzZWxmLl9wYXJzZXIuRW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIgPSBzZWxmLmVuZF9uYW1lc3BhY2VfZGVjbAorCisgICAgICAgIHNlbGYuX2RlY2xfaGFuZGxlcl9wcm9wID0gTm9uZQorICAgICAgICBpZiBzZWxmLl9sZXhfaGFuZGxlcl9wcm9wOgorICAgICAgICAgICAgc2VsZi5fcmVzZXRfbGV4X2hhbmRsZXJfcHJvcCgpCisjICAgICAgICAgc2VsZi5fcGFyc2VyLkRlZmF1bHRIYW5kbGVyID0KKyMgICAgICAgICBzZWxmLl9wYXJzZXIuRGVmYXVsdEhhbmRsZXJFeHBhbmQgPQorIyAgICAgICAgIHNlbGYuX3BhcnNlci5Ob3RTdGFuZGFsb25lSGFuZGxlciA9CisgICAgICAgIHNlbGYuX3BhcnNlci5FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgPSBzZWxmLmV4dGVybmFsX2VudGl0eV9yZWYKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLlNraXBwZWRFbnRpdHlIYW5kbGVyID0gc2VsZi5za2lwcGVkX2VudGl0eV9oYW5kbGVyCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICMgVGhpcyBweWV4cGF0IGRvZXMgbm90IHN1cHBvcnQgU2tpcHBlZEVudGl0eQorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLl9wYXJzZXIuU2V0UGFyYW1FbnRpdHlQYXJzaW5nKAorICAgICAgICAgICAgZXhwYXQuWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX1VOTEVTU19TVEFOREFMT05FKQorCisgICAgICAgIHNlbGYuX3BhcnNpbmcgPSAwCisgICAgICAgIHNlbGYuX2VudGl0eV9zdGFjayA9IFtdCisKKyAgICAjIExvY2F0b3IgbWV0aG9kcworCisgICAgZGVmIGdldENvbHVtbk51bWJlcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcGFyc2VyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VyLkVycm9yQ29sdW1uTnVtYmVyCisKKyAgICBkZWYgZ2V0TGluZU51bWJlcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcGFyc2VyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VyLkVycm9yTGluZU51bWJlcgorCisgICAgZGVmIGdldFB1YmxpY0lkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc291cmNlLmdldFB1YmxpY0lkKCkKKworICAgIGRlZiBnZXRTeXN0ZW1JZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NvdXJjZS5nZXRTeXN0ZW1JZCgpCisKKyAgICAjIGV2ZW50IGhhbmRsZXJzCisgICAgZGVmIHN0YXJ0X2VsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuc3RhcnRFbGVtZW50KG5hbWUsIEF0dHJpYnV0ZXNJbXBsKGF0dHJzKSkKKworICAgIGRlZiBlbmRfZWxlbWVudChzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLmVuZEVsZW1lbnQobmFtZSkKKworICAgIGRlZiBzdGFydF9lbGVtZW50X25zKHNlbGYsIG5hbWUsIGF0dHJzKToKKyAgICAgICAgcGFpciA9IG5hbWUuc3BsaXQoKQorICAgICAgICBpZiBsZW4ocGFpcikgPT0gMToKKyAgICAgICAgICAgICMgbm8gbmFtZXNwYWNlCisgICAgICAgICAgICBwYWlyID0gKE5vbmUsIG5hbWUpCisgICAgICAgIGVsaWYgbGVuKHBhaXIpID09IDM6CisgICAgICAgICAgICBwYWlyID0gcGFpclswXSwgcGFpclsxXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBkZWZhdWx0IG5hbWVzcGFjZQorICAgICAgICAgICAgcGFpciA9IHR1cGxlKHBhaXIpCisKKyAgICAgICAgbmV3YXR0cnMgPSB7fQorICAgICAgICBxbmFtZXMgPSB7fQorICAgICAgICBmb3IgKGFuYW1lLCB2YWx1ZSkgaW4gYXR0cnMuaXRlbXMoKToKKyAgICAgICAgICAgIHBhcnRzID0gYW5hbWUuc3BsaXQoKQorICAgICAgICAgICAgbGVuZ3RoID0gbGVuKHBhcnRzKQorICAgICAgICAgICAgaWYgbGVuZ3RoID09IDE6CisgICAgICAgICAgICAgICAgIyBubyBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICBxbmFtZSA9IGFuYW1lCisgICAgICAgICAgICAgICAgYXBhaXIgPSAoTm9uZSwgYW5hbWUpCisgICAgICAgICAgICBlbGlmIGxlbmd0aCA9PSAzOgorICAgICAgICAgICAgICAgIHFuYW1lID0gIiVzOiVzIiAlIChwYXJ0c1syXSwgcGFydHNbMV0pCisgICAgICAgICAgICAgICAgYXBhaXIgPSBwYXJ0c1swXSwgcGFydHNbMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBkZWZhdWx0IG5hbWVzcGFjZQorICAgICAgICAgICAgICAgIHFuYW1lID0gcGFydHNbMV0KKyAgICAgICAgICAgICAgICBhcGFpciA9IHR1cGxlKHBhcnRzKQorCisgICAgICAgICAgICBuZXdhdHRyc1thcGFpcl0gPSB2YWx1ZQorICAgICAgICAgICAgcW5hbWVzW2FwYWlyXSA9IHFuYW1lCisKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLnN0YXJ0RWxlbWVudE5TKHBhaXIsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzTlNJbXBsKG5ld2F0dHJzLCBxbmFtZXMpKQorCisgICAgZGVmIGVuZF9lbGVtZW50X25zKHNlbGYsIG5hbWUpOgorICAgICAgICBwYWlyID0gbmFtZS5zcGxpdCgpCisgICAgICAgIGlmIGxlbihwYWlyKSA9PSAxOgorICAgICAgICAgICAgcGFpciA9IChOb25lLCBuYW1lKQorICAgICAgICBlbGlmIGxlbihwYWlyKSA9PSAzOgorICAgICAgICAgICAgcGFpciA9IHBhaXJbMF0sIHBhaXJbMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhaXIgPSB0dXBsZShwYWlyKQorCisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5lbmRFbGVtZW50TlMocGFpciwgTm9uZSkKKworICAgICMgdGhpcyBpcyBub3QgdXNlZCAoY2FsbCBkaXJlY3RseSB0byBDb250ZW50SGFuZGxlcikKKyAgICBkZWYgcHJvY2Vzc2luZ19pbnN0cnVjdGlvbihzZWxmLCB0YXJnZXQsIGRhdGEpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSkKKworICAgICMgdGhpcyBpcyBub3QgdXNlZCAoY2FsbCBkaXJlY3RseSB0byBDb250ZW50SGFuZGxlcikKKyAgICBkZWYgY2hhcmFjdGVyX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5jaGFyYWN0ZXJzKGRhdGEpCisKKyAgICBkZWYgc3RhcnRfbmFtZXNwYWNlX2RlY2woc2VsZiwgcHJlZml4LCB1cmkpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKHByZWZpeCwgdXJpKQorCisgICAgZGVmIGVuZF9uYW1lc3BhY2VfZGVjbChzZWxmLCBwcmVmaXgpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuZW5kUHJlZml4TWFwcGluZyhwcmVmaXgpCisKKyAgICBkZWYgc3RhcnRfZG9jdHlwZV9kZWNsKHNlbGYsIG5hbWUsIHN5c2lkLCBwdWJpZCwgaGFzX2ludGVybmFsX3N1YnNldCk6CisgICAgICAgIHNlbGYuX2xleF9oYW5kbGVyX3Byb3Auc3RhcnREVEQobmFtZSwgcHViaWQsIHN5c2lkKQorCisgICAgZGVmIHVucGFyc2VkX2VudGl0eV9kZWNsKHNlbGYsIG5hbWUsIGJhc2UsIHN5c2lkLCBwdWJpZCwgbm90YXRpb25fbmFtZSk6CisgICAgICAgIHNlbGYuX2R0ZF9oYW5kbGVyLnVucGFyc2VkRW50aXR5RGVjbChuYW1lLCBwdWJpZCwgc3lzaWQsIG5vdGF0aW9uX25hbWUpCisKKyAgICBkZWYgbm90YXRpb25fZGVjbChzZWxmLCBuYW1lLCBiYXNlLCBzeXNpZCwgcHViaWQpOgorICAgICAgICBzZWxmLl9kdGRfaGFuZGxlci5ub3RhdGlvbkRlY2wobmFtZSwgcHViaWQsIHN5c2lkKQorCisgICAgZGVmIGV4dGVybmFsX2VudGl0eV9yZWYoc2VsZiwgY29udGV4dCwgYmFzZSwgc3lzaWQsIHB1YmlkKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2V4dGVybmFsX2dlczoKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgc291cmNlID0gc2VsZi5fZW50X2hhbmRsZXIucmVzb2x2ZUVudGl0eShwdWJpZCwgc3lzaWQpCisgICAgICAgIHNvdXJjZSA9IHNheHV0aWxzLnByZXBhcmVfaW5wdXRfc291cmNlKHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc291cmNlLmdldFN5c3RlbUlkKCkgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpCisKKyAgICAgICAgc2VsZi5fZW50aXR5X3N0YWNrLmFwcGVuZCgoc2VsZi5fcGFyc2VyLCBzZWxmLl9zb3VyY2UpKQorICAgICAgICBzZWxmLl9wYXJzZXIgPSBzZWxmLl9wYXJzZXIuRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUoY29udGV4dCkKKyAgICAgICAgc2VsZi5fc291cmNlID0gc291cmNlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeG1scmVhZGVyLkluY3JlbWVudGFsUGFyc2VyLnBhcnNlKHNlbGYsIHNvdXJjZSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuIDAgICMgRklYTUU6IHNhdmUgZXJyb3IgaW5mbyBoZXJlPworCisgICAgICAgIChzZWxmLl9wYXJzZXIsIHNlbGYuX3NvdXJjZSkgPSBzZWxmLl9lbnRpdHlfc3RhY2tbLTFdCisgICAgICAgIGRlbCBzZWxmLl9lbnRpdHlfc3RhY2tbLTFdCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgc2tpcHBlZF9lbnRpdHlfaGFuZGxlcihzZWxmLCBuYW1lLCBpc19wZSk6CisgICAgICAgIGlmIGlzX3BlOgorICAgICAgICAgICAgIyBUaGUgU0FYIHNwZWMgcmVxdWlyZXMgdG8gcmVwb3J0IHNraXBwZWQgUEVzIHdpdGggYSAnJScKKyAgICAgICAgICAgIG5hbWUgPSAnJScrbmFtZQorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuc2tpcHBlZEVudGl0eShuYW1lKQorCisjIC0tLQorCitkZWYgY3JlYXRlX3BhcnNlcigqYXJncywgKiprd2FyZ3MpOgorICAgIHJldHVybiBFeHBhdFBhcnNlcigqYXJncywgKiprd2FyZ3MpCisKKyMgLS0tCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaW1wb3J0IHhtbC5zYXguc2F4dXRpbHMKKyAgICBwID0gY3JlYXRlX3BhcnNlcigpCisgICAgcC5zZXRDb250ZW50SGFuZGxlcih4bWwuc2F4LnNheHV0aWxzLlhNTEdlbmVyYXRvcigpKQorICAgIHAuc2V0RXJyb3JIYW5kbGVyKHhtbC5zYXguRXJyb3JIYW5kbGVyKCkpCisgICAgcC5wYXJzZSgiaHR0cDovL3d3dy5pYmlibGlvLm9yZy94bWwvZXhhbXBsZXMvc2hha2VzcGVhcmUvaGFtbGV0LnhtbCIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvZXhwYXRyZWFkZXIucHljIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L2V4cGF0cmVhZGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2ZmMjZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L2V4cGF0cmVhZGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvZXhwYXRyZWFkZXIucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L2V4cGF0cmVhZGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2ZmMjZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L2V4cGF0cmVhZGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvaGFuZGxlci5weSBiL2xpYi9weXRob24yLjcveG1sL3NheC9oYW5kbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZTkxYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9zYXgvaGFuZGxlci5weQpAQCAtMCwwICsxLDM0MiBAQAorIiIiCitUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgY29yZSBjbGFzc2VzIG9mIHZlcnNpb24gMi4wIG9mIFNBWCBmb3IgUHl0aG9uLgorVGhpcyBmaWxlIHByb3ZpZGVzIG9ubHkgZGVmYXVsdCBjbGFzc2VzIHdpdGggYWJzb2x1dGVseSBtaW5pbXVtCitmdW5jdGlvbmFsaXR5LCBmcm9tIHdoaWNoIGRyaXZlcnMgYW5kIGFwcGxpY2F0aW9ucyBjYW4gYmUgc3ViY2xhc3NlZC4KKworTWFueSBvZiB0aGVzZSBjbGFzc2VzIGFyZSBlbXB0eSBhbmQgYXJlIGluY2x1ZGVkIG9ubHkgYXMgZG9jdW1lbnRhdGlvbgorb2YgdGhlIGludGVyZmFjZXMuCisKKyRJZCQKKyIiIgorCit2ZXJzaW9uID0gJzIuMGJldGEnCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIEhBTkRMRVIgSU5URVJGQUNFUworIworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyA9PT09PSBFUlJPUkhBTkRMRVIgPT09PT0KKworY2xhc3MgRXJyb3JIYW5kbGVyOgorICAgICIiIkJhc2ljIGludGVyZmFjZSBmb3IgU0FYIGVycm9yIGhhbmRsZXJzLgorCisgICAgSWYgeW91IGNyZWF0ZSBhbiBvYmplY3QgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLCB0aGVuCisgICAgcmVnaXN0ZXIgdGhlIG9iamVjdCB3aXRoIHlvdXIgWE1MUmVhZGVyLCB0aGUgcGFyc2VyIHdpbGwgY2FsbCB0aGUKKyAgICBtZXRob2RzIGluIHlvdXIgb2JqZWN0IHRvIHJlcG9ydCBhbGwgd2FybmluZ3MgYW5kIGVycm9ycy4gVGhlcmUKKyAgICBhcmUgdGhyZWUgbGV2ZWxzIG9mIGVycm9ycyBhdmFpbGFibGU6IHdhcm5pbmdzLCAocG9zc2libHkpCisgICAgcmVjb3ZlcmFibGUgZXJyb3JzLCBhbmQgdW5yZWNvdmVyYWJsZSBlcnJvcnMuIEFsbCBtZXRob2RzIHRha2UgYQorICAgIFNBWFBhcnNlRXhjZXB0aW9uIGFzIHRoZSBvbmx5IHBhcmFtZXRlci4iIiIKKworICAgIGRlZiBlcnJvcihzZWxmLCBleGNlcHRpb24pOgorICAgICAgICAiSGFuZGxlIGEgcmVjb3ZlcmFibGUgZXJyb3IuIgorICAgICAgICByYWlzZSBleGNlcHRpb24KKworICAgIGRlZiBmYXRhbEVycm9yKHNlbGYsIGV4Y2VwdGlvbik6CisgICAgICAgICJIYW5kbGUgYSBub24tcmVjb3ZlcmFibGUgZXJyb3IuIgorICAgICAgICByYWlzZSBleGNlcHRpb24KKworICAgIGRlZiB3YXJuaW5nKHNlbGYsIGV4Y2VwdGlvbik6CisgICAgICAgICJIYW5kbGUgYSB3YXJuaW5nLiIKKyAgICAgICAgcHJpbnQgZXhjZXB0aW9uCisKKworIyA9PT09PSBDT05URU5USEFORExFUiA9PT09PQorCitjbGFzcyBDb250ZW50SGFuZGxlcjoKKyAgICAiIiJJbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBsb2dpY2FsIGRvY3VtZW50IGNvbnRlbnQgZXZlbnRzLgorCisgICAgVGhpcyBpcyB0aGUgbWFpbiBjYWxsYmFjayBpbnRlcmZhY2UgaW4gU0FYLCBhbmQgdGhlIG9uZSBtb3N0CisgICAgaW1wb3J0YW50IHRvIGFwcGxpY2F0aW9ucy4gVGhlIG9yZGVyIG9mIGV2ZW50cyBpbiB0aGlzIGludGVyZmFjZQorICAgIG1pcnJvcnMgdGhlIG9yZGVyIG9mIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgZG9jdW1lbnQuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2xvY2F0b3IgPSBOb25lCisKKyAgICBkZWYgc2V0RG9jdW1lbnRMb2NhdG9yKHNlbGYsIGxvY2F0b3IpOgorICAgICAgICAiIiJDYWxsZWQgYnkgdGhlIHBhcnNlciB0byBnaXZlIHRoZSBhcHBsaWNhdGlvbiBhIGxvY2F0b3IgZm9yCisgICAgICAgIGxvY2F0aW5nIHRoZSBvcmlnaW4gb2YgZG9jdW1lbnQgZXZlbnRzLgorCisgICAgICAgIFNBWCBwYXJzZXJzIGFyZSBzdHJvbmdseSBlbmNvdXJhZ2VkICh0aG91Z2ggbm90IGFic29sdXRlbHkKKyAgICAgICAgcmVxdWlyZWQpIHRvIHN1cHBseSBhIGxvY2F0b3I6IGlmIGl0IGRvZXMgc28sIGl0IG11c3Qgc3VwcGx5CisgICAgICAgIHRoZSBsb2NhdG9yIHRvIHRoZSBhcHBsaWNhdGlvbiBieSBpbnZva2luZyB0aGlzIG1ldGhvZCBiZWZvcmUKKyAgICAgICAgaW52b2tpbmcgYW55IG9mIHRoZSBvdGhlciBtZXRob2RzIGluIHRoZSBEb2N1bWVudEhhbmRsZXIKKyAgICAgICAgaW50ZXJmYWNlLgorCisgICAgICAgIFRoZSBsb2NhdG9yIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gZGV0ZXJtaW5lIHRoZSBlbmQKKyAgICAgICAgcG9zaXRpb24gb2YgYW55IGRvY3VtZW50LXJlbGF0ZWQgZXZlbnQsIGV2ZW4gaWYgdGhlIHBhcnNlciBpcworICAgICAgICBub3QgcmVwb3J0aW5nIGFuIGVycm9yLiBUeXBpY2FsbHksIHRoZSBhcHBsaWNhdGlvbiB3aWxsIHVzZQorICAgICAgICB0aGlzIGluZm9ybWF0aW9uIGZvciByZXBvcnRpbmcgaXRzIG93biBlcnJvcnMgKHN1Y2ggYXMKKyAgICAgICAgY2hhcmFjdGVyIGNvbnRlbnQgdGhhdCBkb2VzIG5vdCBtYXRjaCBhbiBhcHBsaWNhdGlvbidzCisgICAgICAgIGJ1c2luZXNzIHJ1bGVzKS4gVGhlIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IHRoZSBsb2NhdG9yIGlzCisgICAgICAgIHByb2JhYmx5IG5vdCBzdWZmaWNpZW50IGZvciB1c2Ugd2l0aCBhIHNlYXJjaCBlbmdpbmUuCisKKyAgICAgICAgTm90ZSB0aGF0IHRoZSBsb2NhdG9yIHdpbGwgcmV0dXJuIGNvcnJlY3QgaW5mb3JtYXRpb24gb25seQorICAgICAgICBkdXJpbmcgdGhlIGludm9jYXRpb24gb2YgdGhlIGV2ZW50cyBpbiB0aGlzIGludGVyZmFjZS4gVGhlCisgICAgICAgIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYXR0ZW1wdCB0byB1c2UgaXQgYXQgYW55IG90aGVyIHRpbWUuIiIiCisgICAgICAgIHNlbGYuX2xvY2F0b3IgPSBsb2NhdG9yCisKKyAgICBkZWYgc3RhcnREb2N1bWVudChzZWxmKToKKyAgICAgICAgIiIiUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGJlZ2lubmluZyBvZiBhIGRvY3VtZW50LgorCisgICAgICAgIFRoZSBTQVggcGFyc2VyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG9ubHkgb25jZSwgYmVmb3JlIGFueQorICAgICAgICBvdGhlciBtZXRob2RzIGluIHRoaXMgaW50ZXJmYWNlIG9yIGluIERUREhhbmRsZXIgKGV4Y2VwdCBmb3IKKyAgICAgICAgc2V0RG9jdW1lbnRMb2NhdG9yKS4iIiIKKworICAgIGRlZiBlbmREb2N1bWVudChzZWxmKToKKyAgICAgICAgIiIiUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIGVuZCBvZiBhIGRvY3VtZW50LgorCisgICAgICAgIFRoZSBTQVggcGFyc2VyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG9ubHkgb25jZSwgYW5kIGl0IHdpbGwKKyAgICAgICAgYmUgdGhlIGxhc3QgbWV0aG9kIGludm9rZWQgZHVyaW5nIHRoZSBwYXJzZS4gVGhlIHBhcnNlciBzaGFsbAorICAgICAgICBub3QgaW52b2tlIHRoaXMgbWV0aG9kIHVudGlsIGl0IGhhcyBlaXRoZXIgYWJhbmRvbmVkIHBhcnNpbmcKKyAgICAgICAgKGJlY2F1c2Ugb2YgYW4gdW5yZWNvdmVyYWJsZSBlcnJvcikgb3IgcmVhY2hlZCB0aGUgZW5kIG9mCisgICAgICAgIGlucHV0LiIiIgorCisgICAgZGVmIHN0YXJ0UHJlZml4TWFwcGluZyhzZWxmLCBwcmVmaXgsIHVyaSk6CisgICAgICAgICIiIkJlZ2luIHRoZSBzY29wZSBvZiBhIHByZWZpeC1VUkkgTmFtZXNwYWNlIG1hcHBpbmcuCisKKyAgICAgICAgVGhlIGluZm9ybWF0aW9uIGZyb20gdGhpcyBldmVudCBpcyBub3QgbmVjZXNzYXJ5IGZvciBub3JtYWwKKyAgICAgICAgTmFtZXNwYWNlIHByb2Nlc3Npbmc6IHRoZSBTQVggWE1MIHJlYWRlciB3aWxsIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgcmVwbGFjZSBwcmVmaXhlcyBmb3IgZWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzIHdoZW4gdGhlCisgICAgICAgIGh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIGZlYXR1cmUgaXMgdHJ1ZSAodGhlCisgICAgICAgIGRlZmF1bHQpLgorCisgICAgICAgIFRoZXJlIGFyZSBjYXNlcywgaG93ZXZlciwgd2hlbiBhcHBsaWNhdGlvbnMgbmVlZCB0byB1c2UKKyAgICAgICAgcHJlZml4ZXMgaW4gY2hhcmFjdGVyIGRhdGEgb3IgaW4gYXR0cmlidXRlIHZhbHVlcywgd2hlcmUgdGhleQorICAgICAgICBjYW5ub3Qgc2FmZWx5IGJlIGV4cGFuZGVkIGF1dG9tYXRpY2FsbHk7IHRoZQorICAgICAgICBzdGFydC9lbmRQcmVmaXhNYXBwaW5nIGV2ZW50IHN1cHBsaWVzIHRoZSBpbmZvcm1hdGlvbiB0byB0aGUKKyAgICAgICAgYXBwbGljYXRpb24gdG8gZXhwYW5kIHByZWZpeGVzIGluIHRob3NlIGNvbnRleHRzIGl0c2VsZiwgaWYKKyAgICAgICAgbmVjZXNzYXJ5LgorCisgICAgICAgIE5vdGUgdGhhdCBzdGFydC9lbmRQcmVmaXhNYXBwaW5nIGV2ZW50cyBhcmUgbm90IGd1YXJhbnRlZWQgdG8KKyAgICAgICAgYmUgcHJvcGVybHkgbmVzdGVkIHJlbGF0aXZlIHRvIGVhY2gtb3RoZXI6IGFsbAorICAgICAgICBzdGFydFByZWZpeE1hcHBpbmcgZXZlbnRzIHdpbGwgb2NjdXIgYmVmb3JlIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgIHN0YXJ0RWxlbWVudCBldmVudCwgYW5kIGFsbCBlbmRQcmVmaXhNYXBwaW5nIGV2ZW50cyB3aWxsIG9jY3VyCisgICAgICAgIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGVuZEVsZW1lbnQgZXZlbnQsIGJ1dCB0aGVpciBvcmRlciBpcworICAgICAgICBub3QgZ3VhcmFudGVlZC4iIiIKKworICAgIGRlZiBlbmRQcmVmaXhNYXBwaW5nKHNlbGYsIHByZWZpeCk6CisgICAgICAgICIiIkVuZCB0aGUgc2NvcGUgb2YgYSBwcmVmaXgtVVJJIG1hcHBpbmcuCisKKyAgICAgICAgU2VlIHN0YXJ0UHJlZml4TWFwcGluZyBmb3IgZGV0YWlscy4gVGhpcyBldmVudCB3aWxsIGFsd2F5cworICAgICAgICBvY2N1ciBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBlbmRFbGVtZW50IGV2ZW50LCBidXQgdGhlIG9yZGVyCisgICAgICAgIG9mIGVuZFByZWZpeE1hcHBpbmcgZXZlbnRzIGlzIG5vdCBvdGhlcndpc2UgZ3VhcmFudGVlZC4iIiIKKworICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpOgorICAgICAgICAiIiJTaWduYWxzIHRoZSBzdGFydCBvZiBhbiBlbGVtZW50IGluIG5vbi1uYW1lc3BhY2UgbW9kZS4KKworICAgICAgICBUaGUgbmFtZSBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIHJhdyBYTUwgMS4wIG5hbWUgb2YgdGhlCisgICAgICAgIGVsZW1lbnQgdHlwZSBhcyBhIHN0cmluZyBhbmQgdGhlIGF0dHJzIHBhcmFtZXRlciBob2xkcyBhbgorICAgICAgICBpbnN0YW5jZSBvZiB0aGUgQXR0cmlidXRlcyBjbGFzcyBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGVzIG9mCisgICAgICAgIHRoZSBlbGVtZW50LiIiIgorCisgICAgZGVmIGVuZEVsZW1lbnQoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlNpZ25hbHMgdGhlIGVuZCBvZiBhbiBlbGVtZW50IGluIG5vbi1uYW1lc3BhY2UgbW9kZS4KKworICAgICAgICBUaGUgbmFtZSBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZSwganVzdAorICAgICAgICBhcyB3aXRoIHRoZSBzdGFydEVsZW1lbnQgZXZlbnQuIiIiCisKKyAgICBkZWYgc3RhcnRFbGVtZW50TlMoc2VsZiwgbmFtZSwgcW5hbWUsIGF0dHJzKToKKyAgICAgICAgIiIiU2lnbmFscyB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudCBpbiBuYW1lc3BhY2UgbW9kZS4KKworICAgICAgICBUaGUgbmFtZSBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZSBhcyBhCisgICAgICAgICh1cmksIGxvY2FsbmFtZSkgdHVwbGUsIHRoZSBxbmFtZSBwYXJhbWV0ZXIgdGhlIHJhdyBYTUwgMS4wCisgICAgICAgIG5hbWUgdXNlZCBpbiB0aGUgc291cmNlIGRvY3VtZW50LCBhbmQgdGhlIGF0dHJzIHBhcmFtZXRlcgorICAgICAgICBob2xkcyBhbiBpbnN0YW5jZSBvZiB0aGUgQXR0cmlidXRlcyBjbGFzcyBjb250YWluaW5nIHRoZQorICAgICAgICBhdHRyaWJ1dGVzIG9mIHRoZSBlbGVtZW50LgorCisgICAgICAgIFRoZSB1cmkgcGFydCBvZiB0aGUgbmFtZSB0dXBsZSBpcyBOb25lIGZvciBlbGVtZW50cyB3aGljaCBoYXZlCisgICAgICAgIG5vIG5hbWVzcGFjZS4iIiIKKworICAgIGRlZiBlbmRFbGVtZW50TlMoc2VsZiwgbmFtZSwgcW5hbWUpOgorICAgICAgICAiIiJTaWduYWxzIHRoZSBlbmQgb2YgYW4gZWxlbWVudCBpbiBuYW1lc3BhY2UgbW9kZS4KKworICAgICAgICBUaGUgbmFtZSBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZSwganVzdAorICAgICAgICBhcyB3aXRoIHRoZSBzdGFydEVsZW1lbnROUyBldmVudC4iIiIKKworICAgIGRlZiBjaGFyYWN0ZXJzKHNlbGYsIGNvbnRlbnQpOgorICAgICAgICAiIiJSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBjaGFyYWN0ZXIgZGF0YS4KKworICAgICAgICBUaGUgUGFyc2VyIHdpbGwgY2FsbCB0aGlzIG1ldGhvZCB0byByZXBvcnQgZWFjaCBjaHVuayBvZgorICAgICAgICBjaGFyYWN0ZXIgZGF0YS4gU0FYIHBhcnNlcnMgbWF5IHJldHVybiBhbGwgY29udGlndW91cworICAgICAgICBjaGFyYWN0ZXIgZGF0YSBpbiBhIHNpbmdsZSBjaHVuaywgb3IgdGhleSBtYXkgc3BsaXQgaXQgaW50bworICAgICAgICBzZXZlcmFsIGNodW5rczsgaG93ZXZlciwgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzIGluIGFueSBzaW5nbGUKKyAgICAgICAgZXZlbnQgbXVzdCBjb21lIGZyb20gdGhlIHNhbWUgZXh0ZXJuYWwgZW50aXR5IHNvIHRoYXQgdGhlCisgICAgICAgIExvY2F0b3IgcHJvdmlkZXMgdXNlZnVsIGluZm9ybWF0aW9uLiIiIgorCisgICAgZGVmIGlnbm9yYWJsZVdoaXRlc3BhY2Uoc2VsZiwgd2hpdGVzcGFjZSk6CisgICAgICAgICIiIlJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGlnbm9yYWJsZSB3aGl0ZXNwYWNlIGluIGVsZW1lbnQgY29udGVudC4KKworICAgICAgICBWYWxpZGF0aW5nIFBhcnNlcnMgbXVzdCB1c2UgdGhpcyBtZXRob2QgdG8gcmVwb3J0IGVhY2ggY2h1bmsKKyAgICAgICAgb2YgaWdub3JhYmxlIHdoaXRlc3BhY2UgKHNlZSB0aGUgVzNDIFhNTCAxLjAgcmVjb21tZW5kYXRpb24sCisgICAgICAgIHNlY3Rpb24gMi4xMCk6IG5vbi12YWxpZGF0aW5nIHBhcnNlcnMgbWF5IGFsc28gdXNlIHRoaXMgbWV0aG9kCisgICAgICAgIGlmIHRoZXkgYXJlIGNhcGFibGUgb2YgcGFyc2luZyBhbmQgdXNpbmcgY29udGVudCBtb2RlbHMuCisKKyAgICAgICAgU0FYIHBhcnNlcnMgbWF5IHJldHVybiBhbGwgY29udGlndW91cyB3aGl0ZXNwYWNlIGluIGEgc2luZ2xlCisgICAgICAgIGNodW5rLCBvciB0aGV5IG1heSBzcGxpdCBpdCBpbnRvIHNldmVyYWwgY2h1bmtzOyBob3dldmVyLCBhbGwKKyAgICAgICAgb2YgdGhlIGNoYXJhY3RlcnMgaW4gYW55IHNpbmdsZSBldmVudCBtdXN0IGNvbWUgZnJvbSB0aGUgc2FtZQorICAgICAgICBleHRlcm5hbCBlbnRpdHksIHNvIHRoYXQgdGhlIExvY2F0b3IgcHJvdmlkZXMgdXNlZnVsCisgICAgICAgIGluZm9ybWF0aW9uLiIiIgorCisgICAgZGVmIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihzZWxmLCB0YXJnZXQsIGRhdGEpOgorICAgICAgICAiIiJSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCisKKyAgICAgICAgVGhlIFBhcnNlciB3aWxsIGludm9rZSB0aGlzIG1ldGhvZCBvbmNlIGZvciBlYWNoIHByb2Nlc3NpbmcKKyAgICAgICAgaW5zdHJ1Y3Rpb24gZm91bmQ6IG5vdGUgdGhhdCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBtYXkgb2NjdXIKKyAgICAgICAgYmVmb3JlIG9yIGFmdGVyIHRoZSBtYWluIGRvY3VtZW50IGVsZW1lbnQuCisKKyAgICAgICAgQSBTQVggcGFyc2VyIHNob3VsZCBuZXZlciByZXBvcnQgYW4gWE1MIGRlY2xhcmF0aW9uIChYTUwgMS4wLAorICAgICAgICBzZWN0aW9uIDIuOCkgb3IgYSB0ZXh0IGRlY2xhcmF0aW9uIChYTUwgMS4wLCBzZWN0aW9uIDQuMy4xKQorICAgICAgICB1c2luZyB0aGlzIG1ldGhvZC4iIiIKKworICAgIGRlZiBza2lwcGVkRW50aXR5KHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBhIHNraXBwZWQgZW50aXR5LgorCisgICAgICAgIFRoZSBQYXJzZXIgd2lsbCBpbnZva2UgdGhpcyBtZXRob2Qgb25jZSBmb3IgZWFjaCBlbnRpdHkKKyAgICAgICAgc2tpcHBlZC4gTm9uLXZhbGlkYXRpbmcgcHJvY2Vzc29ycyBtYXkgc2tpcCBlbnRpdGllcyBpZiB0aGV5CisgICAgICAgIGhhdmUgbm90IHNlZW4gdGhlIGRlY2xhcmF0aW9ucyAoYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZQorICAgICAgICBlbnRpdHkgd2FzIGRlY2xhcmVkIGluIGFuIGV4dGVybmFsIERURCBzdWJzZXQpLiBBbGwgcHJvY2Vzc29ycworICAgICAgICBtYXkgc2tpcCBleHRlcm5hbCBlbnRpdGllcywgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgdGhlCisgICAgICAgIGh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9leHRlcm5hbC1nZW5lcmFsLWVudGl0aWVzIGFuZCB0aGUKKyAgICAgICAgaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL2V4dGVybmFsLXBhcmFtZXRlci1lbnRpdGllcworICAgICAgICBwcm9wZXJ0aWVzLiIiIgorCisKKyMgPT09PT0gRFRESGFuZGxlciA9PT09PQorCitjbGFzcyBEVERIYW5kbGVyOgorICAgICIiIkhhbmRsZSBEVEQgZXZlbnRzLgorCisgICAgVGhpcyBpbnRlcmZhY2Ugc3BlY2lmaWVzIG9ubHkgdGhvc2UgRFREIGV2ZW50cyByZXF1aXJlZCBmb3IgYmFzaWMKKyAgICBwYXJzaW5nICh1bnBhcnNlZCBlbnRpdGllcyBhbmQgYXR0cmlidXRlcykuIiIiCisKKyAgICBkZWYgbm90YXRpb25EZWNsKHNlbGYsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CisgICAgICAgICJIYW5kbGUgYSBub3RhdGlvbiBkZWNsYXJhdGlvbiBldmVudC4iCisKKyAgICBkZWYgdW5wYXJzZWRFbnRpdHlEZWNsKHNlbGYsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbmRhdGEpOgorICAgICAgICAiSGFuZGxlIGFuIHVucGFyc2VkIGVudGl0eSBkZWNsYXJhdGlvbiBldmVudC4iCisKKworIyA9PT09PSBFTlRJVFlSRVNPTFZFUiA9PT09PQorCitjbGFzcyBFbnRpdHlSZXNvbHZlcjoKKyAgICAiIiJCYXNpYyBpbnRlcmZhY2UgZm9yIHJlc29sdmluZyBlbnRpdGllcy4gSWYgeW91IGNyZWF0ZSBhbiBvYmplY3QKKyAgICBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UsIHRoZW4gcmVnaXN0ZXIgdGhlIG9iamVjdCB3aXRoIHlvdXIKKyAgICBQYXJzZXIsIHRoZSBwYXJzZXIgd2lsbCBjYWxsIHRoZSBtZXRob2QgaW4geW91ciBvYmplY3QgdG8KKyAgICByZXNvbHZlIGFsbCBleHRlcm5hbCBlbnRpdGllcy4gTm90ZSB0aGF0IERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMKKyAgICB0aGlzIGludGVyZmFjZSB3aXRoIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4iIiIKKworICAgIGRlZiByZXNvbHZlRW50aXR5KHNlbGYsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CisgICAgICAgICIiIlJlc29sdmUgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIGFuIGVudGl0eSBhbmQgcmV0dXJuIGVpdGhlcgorICAgICAgICB0aGUgc3lzdGVtIGlkZW50aWZpZXIgdG8gcmVhZCBmcm9tIGFzIGEgc3RyaW5nLCBvciBhbiBJbnB1dFNvdXJjZQorICAgICAgICB0byByZWFkIGZyb20uIiIiCisgICAgICAgIHJldHVybiBzeXN0ZW1JZAorCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIENPUkUgRkVBVFVSRVMKKyMKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2ZlYXR1cmVfbmFtZXNwYWNlcyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIKKyMgdHJ1ZTogUGVyZm9ybSBOYW1lc3BhY2UgcHJvY2Vzc2luZyAoZGVmYXVsdCkuCisjIGZhbHNlOiBPcHRpb25hbGx5IGRvIG5vdCBwZXJmb3JtIE5hbWVzcGFjZSBwcm9jZXNzaW5nCisjICAgICAgICAoaW1wbGllcyBuYW1lc3BhY2UtcHJlZml4ZXMpLgorIyBhY2Nlc3M6IChwYXJzaW5nKSByZWFkLW9ubHk7IChub3QgcGFyc2luZykgcmVhZC93cml0ZQorCitmZWF0dXJlX25hbWVzcGFjZV9wcmVmaXhlcyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIgorIyB0cnVlOiBSZXBvcnQgdGhlIG9yaWdpbmFsIHByZWZpeGVkIG5hbWVzIGFuZCBhdHRyaWJ1dGVzIHVzZWQgZm9yIE5hbWVzcGFjZQorIyAgICAgICBkZWNsYXJhdGlvbnMuCisjIGZhbHNlOiBEbyBub3QgcmVwb3J0IGF0dHJpYnV0ZXMgdXNlZCBmb3IgTmFtZXNwYWNlIGRlY2xhcmF0aW9ucywgYW5kCisjICAgICAgICBvcHRpb25hbGx5IGRvIG5vdCByZXBvcnQgb3JpZ2luYWwgcHJlZml4ZWQgbmFtZXMgKGRlZmF1bHQpLgorIyBhY2Nlc3M6IChwYXJzaW5nKSByZWFkLW9ubHk7IChub3QgcGFyc2luZykgcmVhZC93cml0ZQorCitmZWF0dXJlX3N0cmluZ19pbnRlcm5pbmcgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3N0cmluZy1pbnRlcm5pbmciCisjIHRydWU6IEFsbCBlbGVtZW50IG5hbWVzLCBwcmVmaXhlcywgYXR0cmlidXRlIG5hbWVzLCBOYW1lc3BhY2UgVVJJcywgYW5kCisjICAgICAgIGxvY2FsIG5hbWVzIGFyZSBpbnRlcm5lZCB1c2luZyB0aGUgYnVpbHQtaW4gaW50ZXJuIGZ1bmN0aW9uLgorIyBmYWxzZTogTmFtZXMgYXJlIG5vdCBuZWNlc3NhcmlseSBpbnRlcm5lZCwgYWx0aG91Z2ggdGhleSBtYXkgYmUgKGRlZmF1bHQpLgorIyBhY2Nlc3M6IChwYXJzaW5nKSByZWFkLW9ubHk7IChub3QgcGFyc2luZykgcmVhZC93cml0ZQorCitmZWF0dXJlX3ZhbGlkYXRpb24gPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iCisjIHRydWU6IFJlcG9ydCBhbGwgdmFsaWRhdGlvbiBlcnJvcnMgKGltcGxpZXMgZXh0ZXJuYWwtZ2VuZXJhbC1lbnRpdGllcyBhbmQKKyMgICAgICAgZXh0ZXJuYWwtcGFyYW1ldGVyLWVudGl0aWVzKS4KKyMgZmFsc2U6IERvIG5vdCByZXBvcnQgdmFsaWRhdGlvbiBlcnJvcnMuCisjIGFjY2VzczogKHBhcnNpbmcpIHJlYWQtb25seTsgKG5vdCBwYXJzaW5nKSByZWFkL3dyaXRlCisKK2ZlYXR1cmVfZXh0ZXJuYWxfZ2VzID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9leHRlcm5hbC1nZW5lcmFsLWVudGl0aWVzIgorIyB0cnVlOiBJbmNsdWRlIGFsbCBleHRlcm5hbCBnZW5lcmFsICh0ZXh0KSBlbnRpdGllcy4KKyMgZmFsc2U6IERvIG5vdCBpbmNsdWRlIGV4dGVybmFsIGdlbmVyYWwgZW50aXRpZXMuCisjIGFjY2VzczogKHBhcnNpbmcpIHJlYWQtb25seTsgKG5vdCBwYXJzaW5nKSByZWFkL3dyaXRlCisKK2ZlYXR1cmVfZXh0ZXJuYWxfcGVzID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9leHRlcm5hbC1wYXJhbWV0ZXItZW50aXRpZXMiCisjIHRydWU6IEluY2x1ZGUgYWxsIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdGllcywgaW5jbHVkaW5nIHRoZSBleHRlcm5hbAorIyAgICAgICBEVEQgc3Vic2V0LgorIyBmYWxzZTogRG8gbm90IGluY2x1ZGUgYW55IGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdGllcywgZXZlbiB0aGUgZXh0ZXJuYWwKKyMgICAgICAgIERURCBzdWJzZXQuCisjIGFjY2VzczogKHBhcnNpbmcpIHJlYWQtb25seTsgKG5vdCBwYXJzaW5nKSByZWFkL3dyaXRlCisKK2FsbF9mZWF0dXJlcyA9IFtmZWF0dXJlX25hbWVzcGFjZXMsCisgICAgICAgICAgICAgICAgZmVhdHVyZV9uYW1lc3BhY2VfcHJlZml4ZXMsCisgICAgICAgICAgICAgICAgZmVhdHVyZV9zdHJpbmdfaW50ZXJuaW5nLAorICAgICAgICAgICAgICAgIGZlYXR1cmVfdmFsaWRhdGlvbiwKKyAgICAgICAgICAgICAgICBmZWF0dXJlX2V4dGVybmFsX2dlcywKKyAgICAgICAgICAgICAgICBmZWF0dXJlX2V4dGVybmFsX3Blc10KKworCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBDT1JFIFBST1BFUlRJRVMKKyMKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3Byb3BlcnR5X2xleGljYWxfaGFuZGxlciA9ICJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9sZXhpY2FsLWhhbmRsZXIiCisjIGRhdGEgdHlwZTogeG1sLnNheC5zYXgybGliLkxleGljYWxIYW5kbGVyCisjIGRlc2NyaXB0aW9uOiBBbiBvcHRpb25hbCBleHRlbnNpb24gaGFuZGxlciBmb3IgbGV4aWNhbCBldmVudHMgbGlrZSBjb21tZW50cy4KKyMgYWNjZXNzOiByZWFkL3dyaXRlCisKK3Byb3BlcnR5X2RlY2xhcmF0aW9uX2hhbmRsZXIgPSAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIKKyMgZGF0YSB0eXBlOiB4bWwuc2F4LnNheDJsaWIuRGVjbEhhbmRsZXIKKyMgZGVzY3JpcHRpb246IEFuIG9wdGlvbmFsIGV4dGVuc2lvbiBoYW5kbGVyIGZvciBEVEQtcmVsYXRlZCBldmVudHMgb3RoZXIKKyMgICAgICAgICAgICAgIHRoYW4gbm90YXRpb25zIGFuZCB1bnBhcnNlZCBlbnRpdGllcy4KKyMgYWNjZXNzOiByZWFkL3dyaXRlCisKK3Byb3BlcnR5X2RvbV9ub2RlID0gImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2RvbS1ub2RlIgorIyBkYXRhIHR5cGU6IG9yZy53M2MuZG9tLk5vZGUKKyMgZGVzY3JpcHRpb246IFdoZW4gcGFyc2luZywgdGhlIGN1cnJlbnQgRE9NIG5vZGUgYmVpbmcgdmlzaXRlZCBpZiB0aGlzIGlzCisjICAgICAgICAgICAgICBhIERPTSBpdGVyYXRvcjsgd2hlbiBub3QgcGFyc2luZywgdGhlIHJvb3QgRE9NIG5vZGUgZm9yCisjICAgICAgICAgICAgICBpdGVyYXRpb24uCisjIGFjY2VzczogKHBhcnNpbmcpIHJlYWQtb25seTsgKG5vdCBwYXJzaW5nKSByZWFkL3dyaXRlCisKK3Byb3BlcnR5X3htbF9zdHJpbmcgPSAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMveG1sLXN0cmluZyIKKyMgZGF0YSB0eXBlOiBTdHJpbmcKKyMgZGVzY3JpcHRpb246IFRoZSBsaXRlcmFsIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHRoYXQgd2FzIHRoZSBzb3VyY2UgZm9yCisjICAgICAgICAgICAgICB0aGUgY3VycmVudCBldmVudC4KKyMgYWNjZXNzOiByZWFkLW9ubHkKKworcHJvcGVydHlfZW5jb2RpbmcgPSAiaHR0cDovL3d3dy5weXRob24ub3JnL3NheC9wcm9wZXJ0aWVzL2VuY29kaW5nIgorIyBkYXRhIHR5cGU6IFN0cmluZworIyBkZXNjcmlwdGlvbjogVGhlIG5hbWUgb2YgdGhlIGVuY29kaW5nIHRvIGFzc3VtZSBmb3IgaW5wdXQgZGF0YS4KKyMgYWNjZXNzOiB3cml0ZTogc2V0IHRoZSBlbmNvZGluZywgZS5nLiBlc3RhYmxpc2hlZCBieSBhIGhpZ2hlci1sZXZlbAorIyAgICAgICAgICAgICAgICBwcm90b2NvbC4gTWF5IGNoYW5nZSBkdXJpbmcgcGFyc2luZyAoZS5nLiBhZnRlcgorIyAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIGEgTUVUQSB0YWcpCisjICAgICAgICAgcmVhZDogIHJldHVybiB0aGUgY3VycmVudCBlbmNvZGluZyAocG9zc2libHkgZXN0YWJsaXNoZWQgdGhyb3VnaAorIyAgICAgICAgICAgICAgICBhdXRvLWRldGVjdGlvbi4KKyMgaW5pdGlhbCB2YWx1ZTogVVRGLTgKKyMKKworcHJvcGVydHlfaW50ZXJuaW5nX2RpY3QgPSAiaHR0cDovL3d3dy5weXRob24ub3JnL3NheC9wcm9wZXJ0aWVzL2ludGVybmluZy1kaWN0IgorIyBkYXRhIHR5cGU6IERpY3Rpb25hcnkKKyMgZGVzY3JpcHRpb246IFRoZSBkaWN0aW9uYXJ5IHVzZWQgdG8gaW50ZXJuIGNvbW1vbiBzdHJpbmdzIGluIHRoZSBkb2N1bWVudAorIyBhY2Nlc3M6IHdyaXRlOiBSZXF1ZXN0IHRoYXQgdGhlIHBhcnNlciB1c2VzIGEgc3BlY2lmaWMgZGljdGlvbmFyeSwgdG8KKyMgICAgICAgICAgICAgICAgYWxsb3cgaW50ZXJuaW5nIGFjcm9zcyBkaWZmZXJlbnQgZG9jdW1lbnRzCisjICAgICAgICAgcmVhZDogIHJldHVybiB0aGUgY3VycmVudCBpbnRlcm5pbmcgZGljdGlvbmFyeSwgb3IgTm9uZQorIworCithbGxfcHJvcGVydGllcyA9IFtwcm9wZXJ0eV9sZXhpY2FsX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9kb21fbm9kZSwKKyAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2RlY2xhcmF0aW9uX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV94bWxfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9pbnRlcm5pbmdfZGljdF0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL3NheC9oYW5kbGVyLnB5YyBiL2xpYi9weXRob24yLjcveG1sL3NheC9oYW5kbGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGJkNTNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L2hhbmRsZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL3NheC9oYW5kbGVyLnB5byBiL2xpYi9weXRob24yLjcveG1sL3NheC9oYW5kbGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGJkNTNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L2hhbmRsZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL3NheC9zYXh1dGlscy5weSBiL2xpYi9weXRob24yLjcveG1sL3NheC9zYXh1dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDgxYThlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L3NheHV0aWxzLnB5CkBAIC0wLDAgKzEsMzQ2IEBACisiIiJcCitBIGxpYnJhcnkgb2YgdXNlZnVsIGhlbHBlciBjbGFzc2VzIHRvIHRoZSBTQVggY2xhc3NlcywgZm9yIHRoZQorY29udmVuaWVuY2Ugb2YgYXBwbGljYXRpb24gYW5kIGRyaXZlciB3cml0ZXJzLgorIiIiCisKK2ltcG9ydCBvcywgdXJscGFyc2UsIHVybGxpYiwgdHlwZXMKK2ltcG9ydCBpbworaW1wb3J0IHN5cworaW1wb3J0IGhhbmRsZXIKK2ltcG9ydCB4bWxyZWFkZXIKKwordHJ5OgorICAgIF9TdHJpbmdUeXBlcyA9IFt0eXBlcy5TdHJpbmdUeXBlLCB0eXBlcy5Vbmljb2RlVHlwZV0KK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICBfU3RyaW5nVHlwZXMgPSBbdHlwZXMuU3RyaW5nVHlwZV0KKworZGVmIF9fZGljdF9yZXBsYWNlKHMsIGQpOgorICAgICIiIlJlcGxhY2Ugc3Vic3RyaW5ncyBvZiBhIHN0cmluZyB1c2luZyBhIGRpY3Rpb25hcnkuIiIiCisgICAgZm9yIGtleSwgdmFsdWUgaW4gZC5pdGVtcygpOgorICAgICAgICBzID0gcy5yZXBsYWNlKGtleSwgdmFsdWUpCisgICAgcmV0dXJuIHMKKworZGVmIGVzY2FwZShkYXRhLCBlbnRpdGllcz17fSk6CisgICAgIiIiRXNjYXBlICYsIDwsIGFuZCA+IGluIGEgc3RyaW5nIG9mIGRhdGEuCisKKyAgICBZb3UgY2FuIGVzY2FwZSBvdGhlciBzdHJpbmdzIG9mIGRhdGEgYnkgcGFzc2luZyBhIGRpY3Rpb25hcnkgYXMKKyAgICB0aGUgb3B0aW9uYWwgZW50aXRpZXMgcGFyYW1ldGVyLiAgVGhlIGtleXMgYW5kIHZhbHVlcyBtdXN0IGFsbCBiZQorICAgIHN0cmluZ3M7IGVhY2gga2V5IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZS4KKyAgICAiIiIKKworICAgICMgbXVzdCBkbyBhbXBlcnNhbmQgZmlyc3QKKyAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCImIiwgIiZhbXA7IikKKyAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCI+IiwgIiZndDsiKQorICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIjwiLCAiJmx0OyIpCisgICAgaWYgZW50aXRpZXM6CisgICAgICAgIGRhdGEgPSBfX2RpY3RfcmVwbGFjZShkYXRhLCBlbnRpdGllcykKKyAgICByZXR1cm4gZGF0YQorCitkZWYgdW5lc2NhcGUoZGF0YSwgZW50aXRpZXM9e30pOgorICAgICIiIlVuZXNjYXBlICZhbXA7LCAmbHQ7LCBhbmQgJmd0OyBpbiBhIHN0cmluZyBvZiBkYXRhLgorCisgICAgWW91IGNhbiB1bmVzY2FwZSBvdGhlciBzdHJpbmdzIG9mIGRhdGEgYnkgcGFzc2luZyBhIGRpY3Rpb25hcnkgYXMKKyAgICB0aGUgb3B0aW9uYWwgZW50aXRpZXMgcGFyYW1ldGVyLiAgVGhlIGtleXMgYW5kIHZhbHVlcyBtdXN0IGFsbCBiZQorICAgIHN0cmluZ3M7IGVhY2gga2V5IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZS4KKyAgICAiIiIKKyAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCImbHQ7IiwgIjwiKQorICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIiZndDsiLCAiPiIpCisgICAgaWYgZW50aXRpZXM6CisgICAgICAgIGRhdGEgPSBfX2RpY3RfcmVwbGFjZShkYXRhLCBlbnRpdGllcykKKyAgICAjIG11c3QgZG8gYW1wZXJzYW5kIGxhc3QKKyAgICByZXR1cm4gZGF0YS5yZXBsYWNlKCImYW1wOyIsICImIikKKworZGVmIHF1b3RlYXR0cihkYXRhLCBlbnRpdGllcz17fSk6CisgICAgIiIiRXNjYXBlIGFuZCBxdW90ZSBhbiBhdHRyaWJ1dGUgdmFsdWUuCisKKyAgICBFc2NhcGUgJiwgPCwgYW5kID4gaW4gYSBzdHJpbmcgb2YgZGF0YSwgdGhlbiBxdW90ZSBpdCBmb3IgdXNlIGFzCisgICAgYW4gYXR0cmlidXRlIHZhbHVlLiAgVGhlIFwiIGNoYXJhY3RlciB3aWxsIGJlIGVzY2FwZWQgYXMgd2VsbCwgaWYKKyAgICBuZWNlc3NhcnkuCisKKyAgICBZb3UgY2FuIGVzY2FwZSBvdGhlciBzdHJpbmdzIG9mIGRhdGEgYnkgcGFzc2luZyBhIGRpY3Rpb25hcnkgYXMKKyAgICB0aGUgb3B0aW9uYWwgZW50aXRpZXMgcGFyYW1ldGVyLiAgVGhlIGtleXMgYW5kIHZhbHVlcyBtdXN0IGFsbCBiZQorICAgIHN0cmluZ3M7IGVhY2gga2V5IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZS4KKyAgICAiIiIKKyAgICBlbnRpdGllcyA9IGVudGl0aWVzLmNvcHkoKQorICAgIGVudGl0aWVzLnVwZGF0ZSh7J1xuJzogJyYjMTA7JywgJ1xyJzogJyYjMTM7JywgJ1x0JzonJiM5Oyd9KQorICAgIGRhdGEgPSBlc2NhcGUoZGF0YSwgZW50aXRpZXMpCisgICAgaWYgJyInIGluIGRhdGE6CisgICAgICAgIGlmICInIiBpbiBkYXRhOgorICAgICAgICAgICAgZGF0YSA9ICciJXMiJyAlIGRhdGEucmVwbGFjZSgnIicsICImcXVvdDsiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YSA9ICInJXMnIiAlIGRhdGEKKyAgICBlbHNlOgorICAgICAgICBkYXRhID0gJyIlcyInICUgZGF0YQorICAgIHJldHVybiBkYXRhCisKKworZGVmIF9nZXR0ZXh0d3JpdGVyKG91dCwgZW5jb2RpbmcpOgorICAgIGlmIG91dCBpcyBOb25lOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIG91dCA9IHN5cy5zdGRvdXQKKworICAgIGlmIGlzaW5zdGFuY2Uob3V0LCBpby5SYXdJT0Jhc2UpOgorICAgICAgICBidWZmZXIgPSBpby5CdWZmZXJlZElPQmFzZShvdXQpCisgICAgICAgICMgS2VlcCB0aGUgb3JpZ2luYWwgZmlsZSBvcGVuIHdoZW4gdGhlIFRleHRJT1dyYXBwZXIgaXMKKyAgICAgICAgIyBkZXN0cm95ZWQKKyAgICAgICAgYnVmZmVyLmNsb3NlID0gbGFtYmRhOiBOb25lCisgICAgZWxzZToKKyAgICAgICAgIyBUaGlzIGlzIHRvIGhhbmRsZSBwYXNzZWQgb2JqZWN0cyB0aGF0IGFyZW4ndCBpbiB0aGUKKyAgICAgICAgIyBJT0Jhc2UgaGllcmFyY2h5LCBidXQganVzdCBoYXZlIGEgd3JpdGUgbWV0aG9kCisgICAgICAgIGJ1ZmZlciA9IGlvLkJ1ZmZlcmVkSU9CYXNlKCkKKyAgICAgICAgYnVmZmVyLndyaXRhYmxlID0gbGFtYmRhOiBUcnVlCisgICAgICAgIGJ1ZmZlci53cml0ZSA9IG91dC53cml0ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFRleHRJT1dyYXBwZXIgdXNlcyB0aGlzIG1ldGhvZHMgdG8gZGV0ZXJtaW5lCisgICAgICAgICAgICAjIGlmIEJPTSAoZm9yIFVURi0xNiwgZXRjKSBzaG91bGQgYmUgYWRkZWQKKyAgICAgICAgICAgIGJ1ZmZlci5zZWVrYWJsZSA9IG91dC5zZWVrYWJsZQorICAgICAgICAgICAgYnVmZmVyLnRlbGwgPSBvdXQudGVsbAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgIyB3cmFwIGEgYmluYXJ5IHdyaXRlciB3aXRoIFRleHRJT1dyYXBwZXIKKyAgICBjbGFzcyBVbmJ1ZmZlcmVkVGV4dElPV3JhcHBlcihpby5UZXh0SU9XcmFwcGVyKToKKyAgICAgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICAgICAgc3VwZXIoVW5idWZmZXJlZFRleHRJT1dyYXBwZXIsIHNlbGYpLndyaXRlKHMpCisgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICByZXR1cm4gVW5idWZmZXJlZFRleHRJT1dyYXBwZXIoYnVmZmVyLCBlbmNvZGluZz1lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzPSd4bWxjaGFycmVmcmVwbGFjZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmU9J1xuJykKKworY2xhc3MgWE1MR2VuZXJhdG9yKGhhbmRsZXIuQ29udGVudEhhbmRsZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG91dD1Ob25lLCBlbmNvZGluZz0iaXNvLTg4NTktMSIpOgorICAgICAgICBoYW5kbGVyLkNvbnRlbnRIYW5kbGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIG91dCA9IF9nZXR0ZXh0d3JpdGVyKG91dCwgZW5jb2RpbmcpCisgICAgICAgIHNlbGYuX3dyaXRlID0gb3V0LndyaXRlCisgICAgICAgIHNlbGYuX2ZsdXNoID0gb3V0LmZsdXNoCisgICAgICAgIHNlbGYuX25zX2NvbnRleHRzID0gW3t9XSAjIGNvbnRhaW5zIHVyaSAtPiBwcmVmaXggZGljdHMKKyAgICAgICAgc2VsZi5fY3VycmVudF9jb250ZXh0ID0gc2VsZi5fbnNfY29udGV4dHNbLTFdCisgICAgICAgIHNlbGYuX3VuZGVjbGFyZWRfbnNfbWFwcyA9IFtdCisgICAgICAgIHNlbGYuX2VuY29kaW5nID0gZW5jb2RpbmcKKworICAgIGRlZiBfcW5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkJ1aWxkcyBhIHF1YWxpZmllZCBuYW1lIGZyb20gYSAobnNfdXJsLCBsb2NhbG5hbWUpIHBhaXIiIiIKKyAgICAgICAgaWYgbmFtZVswXToKKyAgICAgICAgICAgICMgUGVyIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSwgVGhlICd4bWwnIHByZWZpeCBpcworICAgICAgICAgICAgIyBib3VuZCBieSBkZWZpbml0aW9uIHRvIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS4gIEl0CisgICAgICAgICAgICAjIGRvZXMgbm90IG5lZWQgdG8gYmUgZGVjbGFyZWQgYW5kIHdpbGwgbm90IHVzdWFsbHkgYmUgZm91bmQgaW4KKyAgICAgICAgICAgICMgc2VsZi5fY3VycmVudF9jb250ZXh0LgorICAgICAgICAgICAgaWYgJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScgPT0gbmFtZVswXToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ3htbDonICsgbmFtZVsxXQorICAgICAgICAgICAgIyBUaGUgbmFtZSBpcyBpbiBhIG5vbi1lbXB0eSBuYW1lc3BhY2UKKyAgICAgICAgICAgIHByZWZpeCA9IHNlbGYuX2N1cnJlbnRfY29udGV4dFtuYW1lWzBdXQorICAgICAgICAgICAgaWYgcHJlZml4OgorICAgICAgICAgICAgICAgICMgSWYgaXQgaXMgbm90IHRoZSBkZWZhdWx0IG5hbWVzcGFjZSwgcHJlcGVuZCB0aGUgcHJlZml4CisgICAgICAgICAgICAgICAgcmV0dXJuIHByZWZpeCArICI6IiArIG5hbWVbMV0KKyAgICAgICAgIyBSZXR1cm4gdGhlIHVucXVhbGlmaWVkIG5hbWUKKyAgICAgICAgcmV0dXJuIG5hbWVbMV0KKworICAgICMgQ29udGVudEhhbmRsZXIgbWV0aG9kcworCisgICAgZGVmIHN0YXJ0RG9jdW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuX3dyaXRlKHUnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJXMiPz5cbicgJQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZW5jb2RpbmcpCisKKyAgICBkZWYgZW5kRG9jdW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuX2ZsdXNoKCkKKworICAgIGRlZiBzdGFydFByZWZpeE1hcHBpbmcoc2VsZiwgcHJlZml4LCB1cmkpOgorICAgICAgICBzZWxmLl9uc19jb250ZXh0cy5hcHBlbmQoc2VsZi5fY3VycmVudF9jb250ZXh0LmNvcHkoKSkKKyAgICAgICAgc2VsZi5fY3VycmVudF9jb250ZXh0W3VyaV0gPSBwcmVmaXgKKyAgICAgICAgc2VsZi5fdW5kZWNsYXJlZF9uc19tYXBzLmFwcGVuZCgocHJlZml4LCB1cmkpKQorCisgICAgZGVmIGVuZFByZWZpeE1hcHBpbmcoc2VsZiwgcHJlZml4KToKKyAgICAgICAgc2VsZi5fY3VycmVudF9jb250ZXh0ID0gc2VsZi5fbnNfY29udGV4dHNbLTFdCisgICAgICAgIGRlbCBzZWxmLl9uc19jb250ZXh0c1stMV0KKworICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpOgorICAgICAgICBzZWxmLl93cml0ZSh1JzwnICsgbmFtZSkKKyAgICAgICAgZm9yIChuYW1lLCB2YWx1ZSkgaW4gYXR0cnMuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlKHUnICVzPSVzJyAlIChuYW1lLCBxdW90ZWF0dHIodmFsdWUpKSkKKyAgICAgICAgc2VsZi5fd3JpdGUodSc+JykKKworICAgIGRlZiBlbmRFbGVtZW50KHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLl93cml0ZSh1JzwvJXM+JyAlIG5hbWUpCisKKyAgICBkZWYgc3RhcnRFbGVtZW50TlMoc2VsZiwgbmFtZSwgcW5hbWUsIGF0dHJzKToKKyAgICAgICAgc2VsZi5fd3JpdGUodSc8JyArIHNlbGYuX3FuYW1lKG5hbWUpKQorCisgICAgICAgIGZvciBwcmVmaXgsIHVyaSBpbiBzZWxmLl91bmRlY2xhcmVkX25zX21hcHM6CisgICAgICAgICAgICBpZiBwcmVmaXg6CisgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGUodScgeG1sbnM6JXM9IiVzIicgJSAocHJlZml4LCB1cmkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl93cml0ZSh1JyB4bWxucz0iJXMiJyAlIHVyaSkKKyAgICAgICAgc2VsZi5fdW5kZWNsYXJlZF9uc19tYXBzID0gW10KKworICAgICAgICBmb3IgKG5hbWUsIHZhbHVlKSBpbiBhdHRycy5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5fd3JpdGUodScgJXM9JXMnICUgKHNlbGYuX3FuYW1lKG5hbWUpLCBxdW90ZWF0dHIodmFsdWUpKSkKKyAgICAgICAgc2VsZi5fd3JpdGUodSc+JykKKworICAgIGRlZiBlbmRFbGVtZW50TlMoc2VsZiwgbmFtZSwgcW5hbWUpOgorICAgICAgICBzZWxmLl93cml0ZSh1JzwvJXM+JyAlIHNlbGYuX3FuYW1lKG5hbWUpKQorCisgICAgZGVmIGNoYXJhY3RlcnMoc2VsZiwgY29udGVudCk6CisgICAgICAgIHNlbGYuX3dyaXRlKGVzY2FwZSh1bmljb2RlKGNvbnRlbnQpKSkKKworICAgIGRlZiBpZ25vcmFibGVXaGl0ZXNwYWNlKHNlbGYsIGNvbnRlbnQpOgorICAgICAgICBzZWxmLl93cml0ZSh1bmljb2RlKGNvbnRlbnQpKQorCisgICAgZGVmIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihzZWxmLCB0YXJnZXQsIGRhdGEpOgorICAgICAgICBzZWxmLl93cml0ZSh1Jzw/JXMgJXM/PicgJSAodGFyZ2V0LCBkYXRhKSkKKworCitjbGFzcyBYTUxGaWx0ZXJCYXNlKHhtbHJlYWRlci5YTUxSZWFkZXIpOgorICAgICIiIlRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gc2l0IGJldHdlZW4gYW4gWE1MUmVhZGVyIGFuZCB0aGUKKyAgICBjbGllbnQgYXBwbGljYXRpb24ncyBldmVudCBoYW5kbGVycy4gIEJ5IGRlZmF1bHQsIGl0IGRvZXMgbm90aGluZworICAgIGJ1dCBwYXNzIHJlcXVlc3RzIHVwIHRvIHRoZSByZWFkZXIgYW5kIGV2ZW50cyBvbiB0byB0aGUgaGFuZGxlcnMKKyAgICB1bm1vZGlmaWVkLCBidXQgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgc3BlY2lmaWMgbWV0aG9kcyB0byBtb2RpZnkKKyAgICB0aGUgZXZlbnQgc3RyZWFtIG9yIHRoZSBjb25maWd1cmF0aW9uIHJlcXVlc3RzIGFzIHRoZXkgcGFzcworICAgIHRocm91Z2guIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50ID0gTm9uZSk6CisgICAgICAgIHhtbHJlYWRlci5YTUxSZWFkZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fcGFyZW50ID0gcGFyZW50CisKKyAgICAjIEVycm9ySGFuZGxlciBtZXRob2RzCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgZXhjZXB0aW9uKToKKyAgICAgICAgc2VsZi5fZXJyX2hhbmRsZXIuZXJyb3IoZXhjZXB0aW9uKQorCisgICAgZGVmIGZhdGFsRXJyb3Ioc2VsZiwgZXhjZXB0aW9uKToKKyAgICAgICAgc2VsZi5fZXJyX2hhbmRsZXIuZmF0YWxFcnJvcihleGNlcHRpb24pCisKKyAgICBkZWYgd2FybmluZyhzZWxmLCBleGNlcHRpb24pOgorICAgICAgICBzZWxmLl9lcnJfaGFuZGxlci53YXJuaW5nKGV4Y2VwdGlvbikKKworICAgICMgQ29udGVudEhhbmRsZXIgbWV0aG9kcworCisgICAgZGVmIHNldERvY3VtZW50TG9jYXRvcihzZWxmLCBsb2NhdG9yKToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLnNldERvY3VtZW50TG9jYXRvcihsb2NhdG9yKQorCisgICAgZGVmIHN0YXJ0RG9jdW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5zdGFydERvY3VtZW50KCkKKworICAgIGRlZiBlbmREb2N1bWVudChzZWxmKToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLmVuZERvY3VtZW50KCkKKworICAgIGRlZiBzdGFydFByZWZpeE1hcHBpbmcoc2VsZiwgcHJlZml4LCB1cmkpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuc3RhcnRQcmVmaXhNYXBwaW5nKHByZWZpeCwgdXJpKQorCisgICAgZGVmIGVuZFByZWZpeE1hcHBpbmcoc2VsZiwgcHJlZml4KToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcocHJlZml4KQorCisgICAgZGVmIHN0YXJ0RWxlbWVudChzZWxmLCBuYW1lLCBhdHRycyk6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5zdGFydEVsZW1lbnQobmFtZSwgYXR0cnMpCisKKyAgICBkZWYgZW5kRWxlbWVudChzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLmVuZEVsZW1lbnQobmFtZSkKKworICAgIGRlZiBzdGFydEVsZW1lbnROUyhzZWxmLCBuYW1lLCBxbmFtZSwgYXR0cnMpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuc3RhcnRFbGVtZW50TlMobmFtZSwgcW5hbWUsIGF0dHJzKQorCisgICAgZGVmIGVuZEVsZW1lbnROUyhzZWxmLCBuYW1lLCBxbmFtZSk6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5lbmRFbGVtZW50TlMobmFtZSwgcW5hbWUpCisKKyAgICBkZWYgY2hhcmFjdGVycyhzZWxmLCBjb250ZW50KToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLmNoYXJhY3RlcnMoY29udGVudCkKKworICAgIGRlZiBpZ25vcmFibGVXaGl0ZXNwYWNlKHNlbGYsIGNoYXJzKToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLmlnbm9yYWJsZVdoaXRlc3BhY2UoY2hhcnMpCisKKyAgICBkZWYgcHJvY2Vzc2luZ0luc3RydWN0aW9uKHNlbGYsIHRhcmdldCwgZGF0YSk6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5wcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCBkYXRhKQorCisgICAgZGVmIHNraXBwZWRFbnRpdHkoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5za2lwcGVkRW50aXR5KG5hbWUpCisKKyAgICAjIERUREhhbmRsZXIgbWV0aG9kcworCisgICAgZGVmIG5vdGF0aW9uRGVjbChzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgorICAgICAgICBzZWxmLl9kdGRfaGFuZGxlci5ub3RhdGlvbkRlY2wobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKQorCisgICAgZGVmIHVucGFyc2VkRW50aXR5RGVjbChzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG5kYXRhKToKKyAgICAgICAgc2VsZi5fZHRkX2hhbmRsZXIudW5wYXJzZWRFbnRpdHlEZWNsKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbmRhdGEpCisKKyAgICAjIEVudGl0eVJlc29sdmVyIG1ldGhvZHMKKworICAgIGRlZiByZXNvbHZlRW50aXR5KHNlbGYsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CisgICAgICAgIHJldHVybiBzZWxmLl9lbnRfaGFuZGxlci5yZXNvbHZlRW50aXR5KHB1YmxpY0lkLCBzeXN0ZW1JZCkKKworICAgICMgWE1MUmVhZGVyIG1ldGhvZHMKKworICAgIGRlZiBwYXJzZShzZWxmLCBzb3VyY2UpOgorICAgICAgICBzZWxmLl9wYXJlbnQuc2V0Q29udGVudEhhbmRsZXIoc2VsZikKKyAgICAgICAgc2VsZi5fcGFyZW50LnNldEVycm9ySGFuZGxlcihzZWxmKQorICAgICAgICBzZWxmLl9wYXJlbnQuc2V0RW50aXR5UmVzb2x2ZXIoc2VsZikKKyAgICAgICAgc2VsZi5fcGFyZW50LnNldERUREhhbmRsZXIoc2VsZikKKyAgICAgICAgc2VsZi5fcGFyZW50LnBhcnNlKHNvdXJjZSkKKworICAgIGRlZiBzZXRMb2NhbGUoc2VsZiwgbG9jYWxlKToKKyAgICAgICAgc2VsZi5fcGFyZW50LnNldExvY2FsZShsb2NhbGUpCisKKyAgICBkZWYgZ2V0RmVhdHVyZShzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudC5nZXRGZWF0dXJlKG5hbWUpCisKKyAgICBkZWYgc2V0RmVhdHVyZShzZWxmLCBuYW1lLCBzdGF0ZSk6CisgICAgICAgIHNlbGYuX3BhcmVudC5zZXRGZWF0dXJlKG5hbWUsIHN0YXRlKQorCisgICAgZGVmIGdldFByb3BlcnR5KHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcGFyZW50LmdldFByb3BlcnR5KG5hbWUpCisKKyAgICBkZWYgc2V0UHJvcGVydHkoc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICBzZWxmLl9wYXJlbnQuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpCisKKyAgICAjIFhNTEZpbHRlciBtZXRob2RzCisKKyAgICBkZWYgZ2V0UGFyZW50KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcGFyZW50CisKKyAgICBkZWYgc2V0UGFyZW50KHNlbGYsIHBhcmVudCk6CisgICAgICAgIHNlbGYuX3BhcmVudCA9IHBhcmVudAorCisjIC0tLSBVdGlsaXR5IGZ1bmN0aW9ucworCitkZWYgcHJlcGFyZV9pbnB1dF9zb3VyY2Uoc291cmNlLCBiYXNlID0gIiIpOgorICAgICIiIlRoaXMgZnVuY3Rpb24gdGFrZXMgYW4gSW5wdXRTb3VyY2UgYW5kIGFuIG9wdGlvbmFsIGJhc2UgVVJMIGFuZAorICAgIHJldHVybnMgYSBmdWxseSByZXNvbHZlZCBJbnB1dFNvdXJjZSBvYmplY3QgcmVhZHkgZm9yIHJlYWRpbmcuIiIiCisKKyAgICBpZiB0eXBlKHNvdXJjZSkgaW4gX1N0cmluZ1R5cGVzOgorICAgICAgICBzb3VyY2UgPSB4bWxyZWFkZXIuSW5wdXRTb3VyY2Uoc291cmNlKQorICAgIGVsaWYgaGFzYXR0cihzb3VyY2UsICJyZWFkIik6CisgICAgICAgIGYgPSBzb3VyY2UKKyAgICAgICAgc291cmNlID0geG1scmVhZGVyLklucHV0U291cmNlKCkKKyAgICAgICAgc291cmNlLnNldEJ5dGVTdHJlYW0oZikKKyAgICAgICAgaWYgaGFzYXR0cihmLCAibmFtZSIpOgorICAgICAgICAgICAgc291cmNlLnNldFN5c3RlbUlkKGYubmFtZSkKKworICAgIGlmIHNvdXJjZS5nZXRCeXRlU3RyZWFtKCkgaXMgTm9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzaWQgPSBzb3VyY2UuZ2V0U3lzdGVtSWQoKQorICAgICAgICAgICAgYmFzZWhlYWQgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5ub3JtcGF0aChiYXNlKSkKKyAgICAgICAgICAgIGVuY29kaW5nID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHN5c2lkLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShiYXNlaGVhZCwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VoZWFkID0gYmFzZWhlYWQuZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzaWQgPSBzeXNpZC5lbmNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYmFzZWhlYWQsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzeXNpZCA9IHN5c2lkLmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VoZWFkID0gYmFzZWhlYWQuZW5jb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgc3lzaWRmaWxlbmFtZSA9IG9zLnBhdGguam9pbihiYXNlaGVhZCwgc3lzaWQpCisgICAgICAgICAgICBpc2ZpbGUgPSBvcy5wYXRoLmlzZmlsZShzeXNpZGZpbGVuYW1lKQorICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgaXNmaWxlID0gRmFsc2UKKyAgICAgICAgaWYgaXNmaWxlOgorICAgICAgICAgICAgc291cmNlLnNldFN5c3RlbUlkKHN5c2lkZmlsZW5hbWUpCisgICAgICAgICAgICBmID0gb3BlbihzeXNpZGZpbGVuYW1lLCAicmIiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc291cmNlLnNldFN5c3RlbUlkKHVybHBhcnNlLnVybGpvaW4oYmFzZSwgc291cmNlLmdldFN5c3RlbUlkKCkpKQorICAgICAgICAgICAgZiA9IHVybGxpYi51cmxvcGVuKHNvdXJjZS5nZXRTeXN0ZW1JZCgpKQorCisgICAgICAgIHNvdXJjZS5zZXRCeXRlU3RyZWFtKGYpCisKKyAgICByZXR1cm4gc291cmNlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvc2F4dXRpbHMucHljIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L3NheHV0aWxzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjU0YjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L3NheHV0aWxzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvc2F4dXRpbHMucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L3NheHV0aWxzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjU0YjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L3NheHV0aWxzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgveG1scmVhZGVyLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L3htbHJlYWRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGFhMzlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L3htbHJlYWRlci5weQpAQCAtMCwwICsxLDM4MSBAQAorIiIiQW4gWE1MIFJlYWRlciBpcyB0aGUgU0FYIDIgbmFtZSBmb3IgYW4gWE1MIHBhcnNlci4gWE1MIFBhcnNlcnMKK3Nob3VsZCBiZSBiYXNlZCBvbiB0aGlzIGNvZGUuICIiIgorCitpbXBvcnQgaGFuZGxlcgorCitmcm9tIF9leGNlcHRpb25zIGltcG9ydCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24KKworCisjID09PT09IFhNTFJFQURFUiA9PT09PQorCitjbGFzcyBYTUxSZWFkZXI6CisgICAgIiIiSW50ZXJmYWNlIGZvciByZWFkaW5nIGFuIFhNTCBkb2N1bWVudCB1c2luZyBjYWxsYmFja3MuCisKKyAgICBYTUxSZWFkZXIgaXMgdGhlIGludGVyZmFjZSB0aGF0IGFuIFhNTCBwYXJzZXIncyBTQVgyIGRyaXZlciBtdXN0CisgICAgaW1wbGVtZW50LiBUaGlzIGludGVyZmFjZSBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gc2V0IGFuZCBxdWVyeQorICAgIGZlYXR1cmVzIGFuZCBwcm9wZXJ0aWVzIGluIHRoZSBwYXJzZXIsIHRvIHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzCisgICAgZm9yIGRvY3VtZW50IHByb2Nlc3NpbmcsIGFuZCB0byBpbml0aWF0ZSBhIGRvY3VtZW50IHBhcnNlLgorCisgICAgQWxsIFNBWCBpbnRlcmZhY2VzIGFyZSBhc3N1bWVkIHRvIGJlIHN5bmNocm9ub3VzOiB0aGUgcGFyc2UKKyAgICBtZXRob2RzIG11c3Qgbm90IHJldHVybiB1bnRpbCBwYXJzaW5nIGlzIGNvbXBsZXRlLCBhbmQgcmVhZGVycworICAgIG11c3Qgd2FpdCBmb3IgYW4gZXZlbnQtaGFuZGxlciBjYWxsYmFjayB0byByZXR1cm4gYmVmb3JlIHJlcG9ydGluZworICAgIHRoZSBuZXh0IGV2ZW50LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIgPSBoYW5kbGVyLkNvbnRlbnRIYW5kbGVyKCkKKyAgICAgICAgc2VsZi5fZHRkX2hhbmRsZXIgPSBoYW5kbGVyLkRUREhhbmRsZXIoKQorICAgICAgICBzZWxmLl9lbnRfaGFuZGxlciA9IGhhbmRsZXIuRW50aXR5UmVzb2x2ZXIoKQorICAgICAgICBzZWxmLl9lcnJfaGFuZGxlciA9IGhhbmRsZXIuRXJyb3JIYW5kbGVyKCkKKworICAgIGRlZiBwYXJzZShzZWxmLCBzb3VyY2UpOgorICAgICAgICAiUGFyc2UgYW4gWE1MIGRvY3VtZW50IGZyb20gYSBzeXN0ZW0gaWRlbnRpZmllciBvciBhbiBJbnB1dFNvdXJjZS4iCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIlRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQhIikKKworICAgIGRlZiBnZXRDb250ZW50SGFuZGxlcihzZWxmKToKKyAgICAgICAgIlJldHVybnMgdGhlIGN1cnJlbnQgQ29udGVudEhhbmRsZXIuIgorICAgICAgICByZXR1cm4gc2VsZi5fY29udF9oYW5kbGVyCisKKyAgICBkZWYgc2V0Q29udGVudEhhbmRsZXIoc2VsZiwgaGFuZGxlcik6CisgICAgICAgICJSZWdpc3RlcnMgYSBuZXcgb2JqZWN0IHRvIHJlY2VpdmUgZG9jdW1lbnQgY29udGVudCBldmVudHMuIgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIgPSBoYW5kbGVyCisKKyAgICBkZWYgZ2V0RFRESGFuZGxlcihzZWxmKToKKyAgICAgICAgIlJldHVybnMgdGhlIGN1cnJlbnQgRFREIGhhbmRsZXIuIgorICAgICAgICByZXR1cm4gc2VsZi5fZHRkX2hhbmRsZXIKKworICAgIGRlZiBzZXREVERIYW5kbGVyKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICAiUmVnaXN0ZXIgYW4gb2JqZWN0IHRvIHJlY2VpdmUgYmFzaWMgRFRELXJlbGF0ZWQgZXZlbnRzLiIKKyAgICAgICAgc2VsZi5fZHRkX2hhbmRsZXIgPSBoYW5kbGVyCisKKyAgICBkZWYgZ2V0RW50aXR5UmVzb2x2ZXIoc2VsZik6CisgICAgICAgICJSZXR1cm5zIHRoZSBjdXJyZW50IEVudGl0eVJlc29sdmVyLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2VudF9oYW5kbGVyCisKKyAgICBkZWYgc2V0RW50aXR5UmVzb2x2ZXIoc2VsZiwgcmVzb2x2ZXIpOgorICAgICAgICAiUmVnaXN0ZXIgYW4gb2JqZWN0IHRvIHJlc29sdmUgZXh0ZXJuYWwgZW50aXRpZXMuIgorICAgICAgICBzZWxmLl9lbnRfaGFuZGxlciA9IHJlc29sdmVyCisKKyAgICBkZWYgZ2V0RXJyb3JIYW5kbGVyKHNlbGYpOgorICAgICAgICAiUmV0dXJucyB0aGUgY3VycmVudCBFcnJvckhhbmRsZXIuIgorICAgICAgICByZXR1cm4gc2VsZi5fZXJyX2hhbmRsZXIKKworICAgIGRlZiBzZXRFcnJvckhhbmRsZXIoc2VsZiwgaGFuZGxlcik6CisgICAgICAgICJSZWdpc3RlciBhbiBvYmplY3QgdG8gcmVjZWl2ZSBlcnJvci1tZXNzYWdlIGV2ZW50cy4iCisgICAgICAgIHNlbGYuX2Vycl9oYW5kbGVyID0gaGFuZGxlcgorCisgICAgZGVmIHNldExvY2FsZShzZWxmLCBsb2NhbGUpOgorICAgICAgICAiIiJBbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBzZXQgdGhlIGxvY2FsZSBmb3IgZXJyb3JzIGFuZCB3YXJuaW5ncy4KKworICAgICAgICBTQVggcGFyc2VycyBhcmUgbm90IHJlcXVpcmVkIHRvIHByb3ZpZGUgbG9jYWxpemF0aW9uIGZvciBlcnJvcnMKKyAgICAgICAgYW5kIHdhcm5pbmdzOyBpZiB0aGV5IGNhbm5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgbG9jYWxlLAorICAgICAgICBob3dldmVyLCB0aGV5IG11c3QgcmFpc2UgYSBTQVggZXhjZXB0aW9uLiBBcHBsaWNhdGlvbnMgbWF5CisgICAgICAgIHJlcXVlc3QgYSBsb2NhbGUgY2hhbmdlIGluIHRoZSBtaWRkbGUgb2YgYSBwYXJzZS4iIiIKKyAgICAgICAgcmFpc2UgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJMb2NhbGUgc3VwcG9ydCBub3QgaW1wbGVtZW50ZWQiKQorCisgICAgZGVmIGdldEZlYXR1cmUoc2VsZiwgbmFtZSk6CisgICAgICAgICJMb29rcyB1cCBhbmQgcmV0dXJucyB0aGUgc3RhdGUgb2YgYSBTQVgyIGZlYXR1cmUuIgorICAgICAgICByYWlzZSBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKCJGZWF0dXJlICclcycgbm90IHJlY29nbml6ZWQiICUgbmFtZSkKKworICAgIGRlZiBzZXRGZWF0dXJlKHNlbGYsIG5hbWUsIHN0YXRlKToKKyAgICAgICAgIlNldHMgdGhlIHN0YXRlIG9mIGEgU0FYMiBmZWF0dXJlLiIKKyAgICAgICAgcmFpc2UgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbigiRmVhdHVyZSAnJXMnIG5vdCByZWNvZ25pemVkIiAlIG5hbWUpCisKKyAgICBkZWYgZ2V0UHJvcGVydHkoc2VsZiwgbmFtZSk6CisgICAgICAgICJMb29rcyB1cCBhbmQgcmV0dXJucyB0aGUgdmFsdWUgb2YgYSBTQVgyIHByb3BlcnR5LiIKKyAgICAgICAgcmFpc2UgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbigiUHJvcGVydHkgJyVzJyBub3QgcmVjb2duaXplZCIgJSBuYW1lKQorCisgICAgZGVmIHNldFByb3BlcnR5KHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgIlNldHMgdGhlIHZhbHVlIG9mIGEgU0FYMiBwcm9wZXJ0eS4iCisgICAgICAgIHJhaXNlIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24oIlByb3BlcnR5ICclcycgbm90IHJlY29nbml6ZWQiICUgbmFtZSkKKworY2xhc3MgSW5jcmVtZW50YWxQYXJzZXIoWE1MUmVhZGVyKToKKyAgICAiIiJUaGlzIGludGVyZmFjZSBhZGRzIHRocmVlIGV4dHJhIG1ldGhvZHMgdG8gdGhlIFhNTFJlYWRlcgorICAgIGludGVyZmFjZSB0aGF0IGFsbG93IFhNTCBwYXJzZXJzIHRvIHN1cHBvcnQgaW5jcmVtZW50YWwKKyAgICBwYXJzaW5nLiBTdXBwb3J0IGZvciB0aGlzIGludGVyZmFjZSBpcyBvcHRpb25hbCwgc2luY2Ugbm90IGFsbAorICAgIHVuZGVybHlpbmcgWE1MIHBhcnNlcnMgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHkuCisKKyAgICBXaGVuIHRoZSBwYXJzZXIgaXMgaW5zdGFudGlhdGVkIGl0IGlzIHJlYWR5IHRvIGJlZ2luIGFjY2VwdGluZworICAgIGRhdGEgZnJvbSB0aGUgZmVlZCBtZXRob2QgaW1tZWRpYXRlbHkuIEFmdGVyIHBhcnNpbmcgaGFzIGJlZW4KKyAgICBmaW5pc2hlZCB3aXRoIGEgY2FsbCB0byBjbG9zZSB0aGUgcmVzZXQgbWV0aG9kIG11c3QgYmUgY2FsbGVkIHRvCisgICAgbWFrZSB0aGUgcGFyc2VyIHJlYWR5IHRvIGFjY2VwdCBuZXcgZGF0YSwgZWl0aGVyIGZyb20gZmVlZCBvcgorICAgIHVzaW5nIHRoZSBwYXJzZSBtZXRob2QuCisKKyAgICBOb3RlIHRoYXQgdGhlc2UgbWV0aG9kcyBtdXN0IF9ub3RfIGJlIGNhbGxlZCBkdXJpbmcgcGFyc2luZywgdGhhdAorICAgIGlzLCBhZnRlciBwYXJzZSBoYXMgYmVlbiBjYWxsZWQgYW5kIGJlZm9yZSBpdCByZXR1cm5zLgorCisgICAgQnkgZGVmYXVsdCwgdGhlIGNsYXNzIGFsc28gaW1wbGVtZW50cyB0aGUgcGFyc2UgbWV0aG9kIG9mIHRoZSBYTUxSZWFkZXIKKyAgICBpbnRlcmZhY2UgdXNpbmcgdGhlIGZlZWQsIGNsb3NlIGFuZCByZXNldCBtZXRob2RzIG9mIHRoZQorICAgIEluY3JlbWVudGFsUGFyc2VyIGludGVyZmFjZSBhcyBhIGNvbnZlbmllbmNlIHRvIFNBWCAyLjAgZHJpdmVyCisgICAgd3JpdGVycy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBidWZzaXplPTIqKjE2KToKKyAgICAgICAgc2VsZi5fYnVmc2l6ZSA9IGJ1ZnNpemUKKyAgICAgICAgWE1MUmVhZGVyLl9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgc291cmNlKToKKyAgICAgICAgaW1wb3J0IHNheHV0aWxzCisgICAgICAgIHNvdXJjZSA9IHNheHV0aWxzLnByZXBhcmVfaW5wdXRfc291cmNlKHNvdXJjZSkKKworICAgICAgICBzZWxmLnByZXBhcmVQYXJzZXIoc291cmNlKQorICAgICAgICBmaWxlID0gc291cmNlLmdldEJ5dGVTdHJlYW0oKQorICAgICAgICBidWZmZXIgPSBmaWxlLnJlYWQoc2VsZi5fYnVmc2l6ZSkKKyAgICAgICAgd2hpbGUgYnVmZmVyICE9ICIiOgorICAgICAgICAgICAgc2VsZi5mZWVkKGJ1ZmZlcikKKyAgICAgICAgICAgIGJ1ZmZlciA9IGZpbGUucmVhZChzZWxmLl9idWZzaXplKQorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBmZWVkKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBnaXZlcyB0aGUgcmF3IFhNTCBkYXRhIGluIHRoZSBkYXRhIHBhcmFtZXRlciB0bworICAgICAgICB0aGUgcGFyc2VyIGFuZCBtYWtlcyBpdCBwYXJzZSB0aGUgZGF0YSwgZW1pdHRpbmcgdGhlCisgICAgICAgIGNvcnJlc3BvbmRpbmcgZXZlbnRzLiBJdCBpcyBhbGxvd2VkIGZvciBYTUwgY29uc3RydWN0cyB0byBiZQorICAgICAgICBzcGxpdCBhY3Jvc3Mgc2V2ZXJhbCBjYWxscyB0byBmZWVkLgorCisgICAgICAgIGZlZWQgbWF5IHJhaXNlIFNBWEV4Y2VwdGlvbi4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCEiKQorCisgICAgZGVmIHByZXBhcmVQYXJzZXIoc2VsZiwgc291cmNlKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBwYXJzZSBpbXBsZW1lbnRhdGlvbiB0byBhbGxvdworICAgICAgICB0aGUgU0FYIDIuMCBkcml2ZXIgdG8gcHJlcGFyZSBpdHNlbGYgZm9yIHBhcnNpbmcuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoInByZXBhcmVQYXJzZXIgbXVzdCBiZSBvdmVycmlkZGVuISIpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBlbnRpcmUgWE1MIGRvY3VtZW50IGhhcyBiZWVuCisgICAgICAgIHBhc3NlZCB0byB0aGUgcGFyc2VyIHRocm91Z2ggdGhlIGZlZWQgbWV0aG9kLCB0byBub3RpZnkgdGhlCisgICAgICAgIHBhcnNlciB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIGRhdGEuIFRoaXMgYWxsb3dzIHRoZSBwYXJzZXIgdG8KKyAgICAgICAgZG8gdGhlIGZpbmFsIGNoZWNrcyBvbiB0aGUgZG9jdW1lbnQgYW5kIGVtcHR5IHRoZSBpbnRlcm5hbAorICAgICAgICBkYXRhIGJ1ZmZlci4KKworICAgICAgICBUaGUgcGFyc2VyIHdpbGwgbm90IGJlIHJlYWR5IHRvIHBhcnNlIGFub3RoZXIgZG9jdW1lbnQgdW50aWwKKyAgICAgICAgdGhlIHJlc2V0IG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQuCisKKyAgICAgICAgY2xvc2UgbWF5IHJhaXNlIFNBWEV4Y2VwdGlvbi4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCEiKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgY2xvc2UgaGFzIGJlZW4gY2FsbGVkIHRvIHJlc2V0CisgICAgICAgIHRoZSBwYXJzZXIgc28gdGhhdCBpdCBpcyByZWFkeSB0byBwYXJzZSBuZXcgZG9jdW1lbnRzLiBUaGUKKyAgICAgICAgcmVzdWx0cyBvZiBjYWxsaW5nIHBhcnNlIG9yIGZlZWQgYWZ0ZXIgY2xvc2Ugd2l0aG91dCBjYWxsaW5nCisgICAgICAgIHJlc2V0IGFyZSB1bmRlZmluZWQuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIlRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQhIikKKworIyA9PT09PSBMT0NBVE9SID09PT09CisKK2NsYXNzIExvY2F0b3I6CisgICAgIiIiSW50ZXJmYWNlIGZvciBhc3NvY2lhdGluZyBhIFNBWCBldmVudCB3aXRoIGEgZG9jdW1lbnQKKyAgICBsb2NhdGlvbi4gQSBsb2NhdG9yIG9iamVjdCB3aWxsIHJldHVybiB2YWxpZCByZXN1bHRzIG9ubHkgZHVyaW5nCisgICAgY2FsbHMgdG8gRG9jdW1lbnRIYW5kbGVyIG1ldGhvZHM7IGF0IGFueSBvdGhlciB0aW1lLCB0aGUKKyAgICByZXN1bHRzIGFyZSB1bnByZWRpY3RhYmxlLiIiIgorCisgICAgZGVmIGdldENvbHVtbk51bWJlcihzZWxmKToKKyAgICAgICAgIlJldHVybiB0aGUgY29sdW1uIG51bWJlciB3aGVyZSB0aGUgY3VycmVudCBldmVudCBlbmRzLiIKKyAgICAgICAgcmV0dXJuIC0xCisKKyAgICBkZWYgZ2V0TGluZU51bWJlcihzZWxmKToKKyAgICAgICAgIlJldHVybiB0aGUgbGluZSBudW1iZXIgd2hlcmUgdGhlIGN1cnJlbnQgZXZlbnQgZW5kcy4iCisgICAgICAgIHJldHVybiAtMQorCisgICAgZGVmIGdldFB1YmxpY0lkKHNlbGYpOgorICAgICAgICAiUmV0dXJuIHRoZSBwdWJsaWMgaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuIgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGdldFN5c3RlbUlkKHNlbGYpOgorICAgICAgICAiUmV0dXJuIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBmb3IgdGhlIGN1cnJlbnQgZXZlbnQuIgorICAgICAgICByZXR1cm4gTm9uZQorCisjID09PT09IElOUFVUU09VUkNFID09PT09CisKK2NsYXNzIElucHV0U291cmNlOgorICAgICIiIkVuY2Fwc3VsYXRpb24gb2YgdGhlIGluZm9ybWF0aW9uIG5lZWRlZCBieSB0aGUgWE1MUmVhZGVyIHRvCisgICAgcmVhZCBlbnRpdGllcy4KKworICAgIFRoaXMgY2xhc3MgbWF5IGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHB1YmxpYyBpZGVudGlmaWVyLAorICAgIHN5c3RlbSBpZGVudGlmaWVyLCBieXRlIHN0cmVhbSAocG9zc2libHkgd2l0aCBjaGFyYWN0ZXIgZW5jb2RpbmcKKyAgICBpbmZvcm1hdGlvbikgYW5kL29yIHRoZSBjaGFyYWN0ZXIgc3RyZWFtIG9mIGFuIGVudGl0eS4KKworICAgIEFwcGxpY2F0aW9ucyB3aWxsIGNyZWF0ZSBvYmplY3RzIG9mIHRoaXMgY2xhc3MgZm9yIHVzZSBpbiB0aGUKKyAgICBYTUxSZWFkZXIucGFyc2UgbWV0aG9kIGFuZCBmb3IgcmV0dXJuaW5nIGZyb20KKyAgICBFbnRpdHlSZXNvbHZlci5yZXNvbHZlRW50aXR5LgorCisgICAgQW4gSW5wdXRTb3VyY2UgYmVsb25ncyB0byB0aGUgYXBwbGljYXRpb24sIHRoZSBYTUxSZWFkZXIgaXMgbm90CisgICAgYWxsb3dlZCB0byBtb2RpZnkgSW5wdXRTb3VyY2Ugb2JqZWN0cyBwYXNzZWQgdG8gaXQgZnJvbSB0aGUKKyAgICBhcHBsaWNhdGlvbiwgYWx0aG91Z2ggaXQgbWF5IG1ha2UgY29waWVzIGFuZCBtb2RpZnkgdGhvc2UuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3lzdGVtX2lkID0gTm9uZSk6CisgICAgICAgIHNlbGYuX19zeXN0ZW1faWQgPSBzeXN0ZW1faWQKKyAgICAgICAgc2VsZi5fX3B1YmxpY19pZCA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2VuY29kaW5nICA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2J5dGVmaWxlICA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2NoYXJmaWxlICA9IE5vbmUKKworICAgIGRlZiBzZXRQdWJsaWNJZChzZWxmLCBwdWJsaWNfaWQpOgorICAgICAgICAiU2V0cyB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhpcyBJbnB1dFNvdXJjZS4iCisgICAgICAgIHNlbGYuX19wdWJsaWNfaWQgPSBwdWJsaWNfaWQKKworICAgIGRlZiBnZXRQdWJsaWNJZChzZWxmKToKKyAgICAgICAgIlJldHVybnMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoaXMgSW5wdXRTb3VyY2UuIgorICAgICAgICByZXR1cm4gc2VsZi5fX3B1YmxpY19pZAorCisgICAgZGVmIHNldFN5c3RlbUlkKHNlbGYsIHN5c3RlbV9pZCk6CisgICAgICAgICJTZXRzIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGlzIElucHV0U291cmNlLiIKKyAgICAgICAgc2VsZi5fX3N5c3RlbV9pZCA9IHN5c3RlbV9pZAorCisgICAgZGVmIGdldFN5c3RlbUlkKHNlbGYpOgorICAgICAgICAiUmV0dXJucyB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgdGhpcyBJbnB1dFNvdXJjZS4iCisgICAgICAgIHJldHVybiBzZWxmLl9fc3lzdGVtX2lkCisKKyAgICBkZWYgc2V0RW5jb2Rpbmcoc2VsZiwgZW5jb2RpbmcpOgorICAgICAgICAiIiJTZXRzIHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhpcyBJbnB1dFNvdXJjZS4KKworICAgICAgICBUaGUgZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyBhY2NlcHRhYmxlIGZvciBhbiBYTUwgZW5jb2RpbmcKKyAgICAgICAgZGVjbGFyYXRpb24gKHNlZSBzZWN0aW9uIDQuMy4zIG9mIHRoZSBYTUwgcmVjb21tZW5kYXRpb24pLgorCisgICAgICAgIFRoZSBlbmNvZGluZyBhdHRyaWJ1dGUgb2YgdGhlIElucHV0U291cmNlIGlzIGlnbm9yZWQgaWYgdGhlCisgICAgICAgIElucHV0U291cmNlIGFsc28gY29udGFpbnMgYSBjaGFyYWN0ZXIgc3RyZWFtLiIiIgorICAgICAgICBzZWxmLl9fZW5jb2RpbmcgPSBlbmNvZGluZworCisgICAgZGVmIGdldEVuY29kaW5nKHNlbGYpOgorICAgICAgICAiR2V0IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhpcyBJbnB1dFNvdXJjZS4iCisgICAgICAgIHJldHVybiBzZWxmLl9fZW5jb2RpbmcKKworICAgIGRlZiBzZXRCeXRlU3RyZWFtKHNlbGYsIGJ5dGVmaWxlKToKKyAgICAgICAgIiIiU2V0IHRoZSBieXRlIHN0cmVhbSAoYSBQeXRob24gZmlsZS1saWtlIG9iamVjdCB3aGljaCBkb2VzCisgICAgICAgIG5vdCBwZXJmb3JtIGJ5dGUtdG8tY2hhcmFjdGVyIGNvbnZlcnNpb24pIGZvciB0aGlzIGlucHV0CisgICAgICAgIHNvdXJjZS4KKworICAgICAgICBUaGUgU0FYIHBhcnNlciB3aWxsIGlnbm9yZSB0aGlzIGlmIHRoZXJlIGlzIGFsc28gYSBjaGFyYWN0ZXIKKyAgICAgICAgc3RyZWFtIHNwZWNpZmllZCwgYnV0IGl0IHdpbGwgdXNlIGEgYnl0ZSBzdHJlYW0gaW4gcHJlZmVyZW5jZQorICAgICAgICB0byBvcGVuaW5nIGEgVVJJIGNvbm5lY3Rpb24gaXRzZWxmLgorCisgICAgICAgIElmIHRoZSBhcHBsaWNhdGlvbiBrbm93cyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoZSBieXRlCisgICAgICAgIHN0cmVhbSwgaXQgc2hvdWxkIHNldCBpdCB3aXRoIHRoZSBzZXRFbmNvZGluZyBtZXRob2QuIiIiCisgICAgICAgIHNlbGYuX19ieXRlZmlsZSA9IGJ5dGVmaWxlCisKKyAgICBkZWYgZ2V0Qnl0ZVN0cmVhbShzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBieXRlIHN0cmVhbSBmb3IgdGhpcyBpbnB1dCBzb3VyY2UuCisKKyAgICAgICAgVGhlIGdldEVuY29kaW5nIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGZvcgorICAgICAgICB0aGlzIGJ5dGUgc3RyZWFtLCBvciBOb25lIGlmIHVua25vd24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fYnl0ZWZpbGUKKworICAgIGRlZiBzZXRDaGFyYWN0ZXJTdHJlYW0oc2VsZiwgY2hhcmZpbGUpOgorICAgICAgICAiIiJTZXQgdGhlIGNoYXJhY3RlciBzdHJlYW0gZm9yIHRoaXMgaW5wdXQgc291cmNlLiAoVGhlIHN0cmVhbQorICAgICAgICBtdXN0IGJlIGEgUHl0aG9uIDIuMCBVbmljb2RlLXdyYXBwZWQgZmlsZS1saWtlIHRoYXQgcGVyZm9ybXMKKyAgICAgICAgY29udmVyc2lvbiB0byBVbmljb2RlIHN0cmluZ3MuKQorCisgICAgICAgIElmIHRoZXJlIGlzIGEgY2hhcmFjdGVyIHN0cmVhbSBzcGVjaWZpZWQsIHRoZSBTQVggcGFyc2VyIHdpbGwKKyAgICAgICAgaWdub3JlIGFueSBieXRlIHN0cmVhbSBhbmQgd2lsbCBub3QgYXR0ZW1wdCB0byBvcGVuIGEgVVJJCisgICAgICAgIGNvbm5lY3Rpb24gdG8gdGhlIHN5c3RlbSBpZGVudGlmaWVyLiIiIgorICAgICAgICBzZWxmLl9fY2hhcmZpbGUgPSBjaGFyZmlsZQorCisgICAgZGVmIGdldENoYXJhY3RlclN0cmVhbShzZWxmKToKKyAgICAgICAgIkdldCB0aGUgY2hhcmFjdGVyIHN0cmVhbSBmb3IgdGhpcyBpbnB1dCBzb3VyY2UuIgorICAgICAgICByZXR1cm4gc2VsZi5fX2NoYXJmaWxlCisKKyMgPT09PT0gQVRUUklCVVRFU0lNUEwgPT09PT0KKworY2xhc3MgQXR0cmlidXRlc0ltcGw6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXR0cnMpOgorICAgICAgICAiIiJOb24tTlMtYXdhcmUgaW1wbGVtZW50YXRpb24uCisKKyAgICAgICAgYXR0cnMgc2hvdWxkIGJlIG9mIHRoZSBmb3JtIHtuYW1lIDogdmFsdWV9LiIiIgorICAgICAgICBzZWxmLl9hdHRycyA9IGF0dHJzCisKKyAgICBkZWYgZ2V0TGVuZ3RoKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2F0dHJzKQorCisgICAgZGVmIGdldFR5cGUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiAiQ0RBVEEiCisKKyAgICBkZWYgZ2V0VmFsdWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1tuYW1lXQorCisgICAgZGVmIGdldFZhbHVlQnlRTmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzW25hbWVdCisKKyAgICBkZWYgZ2V0TmFtZUJ5UU5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5vdCBuYW1lIGluIHNlbGYuX2F0dHJzOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IsIG5hbWUKKyAgICAgICAgcmV0dXJuIG5hbWUKKworICAgIGRlZiBnZXRRTmFtZUJ5TmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbm90IG5hbWUgaW4gc2VsZi5fYXR0cnM6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvciwgbmFtZQorICAgICAgICByZXR1cm4gbmFtZQorCisgICAgZGVmIGdldE5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnMua2V5cygpCisKKyAgICBkZWYgZ2V0UU5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnMua2V5cygpCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9hdHRycykKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzW25hbWVdCisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzLmtleXMoKQorCisgICAgZGVmIGhhc19rZXkoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBuYW1lIGluIHNlbGYuX2F0dHJzCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gbmFtZSBpbiBzZWxmLl9hdHRycworCisgICAgZGVmIGdldChzZWxmLCBuYW1lLCBhbHRlcm5hdGl2ZT1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzLmdldChuYW1lLCBhbHRlcm5hdGl2ZSkKKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fYXR0cnMpCisKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRycy5pdGVtcygpCisKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnMudmFsdWVzKCkKKworIyA9PT09PSBBVFRSSUJVVEVTTlNJTVBMID09PT09CisKK2NsYXNzIEF0dHJpYnV0ZXNOU0ltcGwoQXR0cmlidXRlc0ltcGwpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGF0dHJzLCBxbmFtZXMpOgorICAgICAgICAiIiJOUy1hd2FyZSBpbXBsZW1lbnRhdGlvbi4KKworICAgICAgICBhdHRycyBzaG91bGQgYmUgb2YgdGhlIGZvcm0geyhuc191cmksIGxuYW1lKTogdmFsdWUsIC4uLn0uCisgICAgICAgIHFuYW1lcyBvZiB0aGUgZm9ybSB7KG5zX3VyaSwgbG5hbWUpOiBxbmFtZSwgLi4ufS4iIiIKKyAgICAgICAgc2VsZi5fYXR0cnMgPSBhdHRycworICAgICAgICBzZWxmLl9xbmFtZXMgPSBxbmFtZXMKKworICAgIGRlZiBnZXRWYWx1ZUJ5UU5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIGZvciAobnNuYW1lLCBxbmFtZSkgaW4gc2VsZi5fcW5hbWVzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBxbmFtZSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1tuc25hbWVdCisKKyAgICAgICAgcmFpc2UgS2V5RXJyb3IsIG5hbWUKKworICAgIGRlZiBnZXROYW1lQnlRTmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgZm9yIChuc25hbWUsIHFuYW1lKSBpbiBzZWxmLl9xbmFtZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHFuYW1lID09IG5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5zbmFtZQorCisgICAgICAgIHJhaXNlIEtleUVycm9yLCBuYW1lCisKKyAgICBkZWYgZ2V0UU5hbWVCeU5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9xbmFtZXNbbmFtZV0KKworICAgIGRlZiBnZXRRTmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9xbmFtZXMudmFsdWVzKCkKKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fYXR0cnMsIHNlbGYuX3FuYW1lcykKKworCitkZWYgX3Rlc3QoKToKKyAgICBYTUxSZWFkZXIoKQorICAgIEluY3JlbWVudGFsUGFyc2VyKCkKKyAgICBMb2NhdG9yKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgveG1scmVhZGVyLnB5YyBiL2xpYi9weXRob24yLjcveG1sL3NheC94bWxyZWFkZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzhhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9zYXgveG1scmVhZGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgveG1scmVhZGVyLnB5byBiL2xpYi9weXRob24yLjcveG1sL3NheC94bWxyZWFkZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzhhN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9zYXgveG1scmVhZGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbGxpYi5weSBiL2xpYi9weXRob24yLjcveG1sbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZWU4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbGxpYi5weQpAQCAtMCwwICsxLDkzMCBAQAorIiIiQSBwYXJzZXIgZm9yIFhNTCwgdXNpbmcgdGhlIGRlcml2ZWQgY2xhc3MgYXMgc3RhdGljIERURC4iIiIKKworIyBBdXRob3I6IFNqb2VyZCBNdWxsZW5kZXIuCisKK2ltcG9ydCByZQoraW1wb3J0IHN0cmluZworCitpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLndhcm4oIlRoZSB4bWxsaWIgbW9kdWxlIGlzIG9ic29sZXRlLiAgVXNlIHhtbC5zYXggaW5zdGVhZC4iLAorICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCitkZWwgd2FybmluZ3MKKwordmVyc2lvbiA9ICcwLjMnCisKK2NsYXNzIEVycm9yKFJ1bnRpbWVFcnJvcik6CisgICAgcGFzcworCisjIFJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlZCBmb3IgcGFyc2luZworCitfUyA9ICdbIFx0XHJcbl0rJyAgICAgICAgICAgICAgICAgICAgICAgIyB3aGl0ZSBzcGFjZQorX29wUyA9ICdbIFx0XHJcbl0qJyAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgd2hpdGUgc3BhY2UKK19OYW1lID0gJ1thLXpBLVpfOl1bLWEtekEtWjAtOS5fOl0qJyAgICAjIHZhbGlkIFhNTCBuYW1lCitfUVN0ciA9ICIoPzonW14nXSonfFwiW15cIl0qXCIpIiAgICAgICAgIyBxdW90ZWQgWE1MIHN0cmluZworaWxsZWdhbCA9IHJlLmNvbXBpbGUoJ1teXHRcclxuIC1cMTc2XDI0MC1cMzc3XScpICMgaWxsZWdhbCBjaGFycyBpbiBjb250ZW50CitpbnRlcmVzdGluZyA9IHJlLmNvbXBpbGUoJ1tdJjxdJykKKworYW1wID0gcmUuY29tcGlsZSgnJicpCityZWYgPSByZS5jb21waWxlKCcmKCcgKyBfTmFtZSArICd8I1swLTldK3wjeFswLTlhLWZBLUZdKylbXi1hLXpBLVowLTkuXzpdJykKK2VudGl0eXJlZiA9IHJlLmNvbXBpbGUoJyYoP1A8bmFtZT4nICsgX05hbWUgKyAnKVteLWEtekEtWjAtOS5fOl0nKQorY2hhcnJlZiA9IHJlLmNvbXBpbGUoJyYjKD9QPGNoYXI+WzAtOV0rW14wLTldfHhbMC05YS1mQS1GXStbXjAtOWEtZkEtRl0pJykKK3NwYWNlID0gcmUuY29tcGlsZShfUyArICckJykKK25ld2xpbmUgPSByZS5jb21waWxlKCdcbicpCisKK2F0dHJmaW5kID0gcmUuY29tcGlsZSgKKyAgICBfUyArICcoP1A8bmFtZT4nICsgX05hbWUgKyAnKScKKyAgICAnKCcgKyBfb3BTICsgJz0nICsgX29wUyArCisgICAgJyg/UDx2YWx1ZT4nK19RU3RyKyd8Wy1hLXpBLVowLTkuOisqJT8hXChcKV8jPX5dKykpPycpCitzdGFydHRhZ29wZW4gPSByZS5jb21waWxlKCc8JyArIF9OYW1lKQorc3RhcnR0YWdlbmQgPSByZS5jb21waWxlKF9vcFMgKyAnKD9QPHNsYXNoPi8/KT4nKQorc3RhcnR0YWdtYXRjaCA9IHJlLmNvbXBpbGUoJzwoP1A8dGFnbmFtZT4nK19OYW1lKycpJworICAgICAgICAgICAgICAgICAgICAgICcoP1A8YXR0cnM+KD86JythdHRyZmluZC5wYXR0ZXJuKycpKiknKworICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dGFnZW5kLnBhdHRlcm4pCitlbmR0YWdvcGVuID0gcmUuY29tcGlsZSgnPC8nKQorZW5kYnJhY2tldCA9IHJlLmNvbXBpbGUoX29wUyArICc+JykKK2VuZGJyYWNrZXRmaW5kID0gcmUuY29tcGlsZSgnKD86W14+XCciXXwnK19RU3RyKycpKj4nKQordGFnZmluZCA9IHJlLmNvbXBpbGUoX05hbWUpCitjZGF0YW9wZW4gPSByZS5jb21waWxlKHInPCFcW0NEQVRBXFsnKQorY2RhdGFjbG9zZSA9IHJlLmNvbXBpbGUocidcXVxdPicpCisjIHRoaXMgbWF0Y2hlcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyMgU1lTVEVNIFN5c3RlbUxpdGVyYWwKKyMgUFVCTElDIFB1YmlkTGl0ZXJhbCBTeXN0ZW1MaXRlcmFsCitfU3lzdGVtTGl0ZXJhbCA9ICcoP1A8JXM+JytfUVN0cisnKScKK19QdWJsaWNMaXRlcmFsID0gJyg/UDwlcz4iWy1cJ1woXCkrLC4vOj0/OyEqI0AkXyUlIFxuXHJhLXpBLVowLTldKiJ8JyBcCisgICAgICAgICAgICAgICAgICAgICAgICAiJ1stXChcKSssLi86PT87ISojQCRfJSUgXG5ccmEtekEtWjAtOV0qJykiCitfRXh0ZXJuYWxJZCA9ICcoPzpTWVNURU18JyBcCisgICAgICAgICAgICAgICAgICdQVUJMSUMnK19TK19QdWJsaWNMaXRlcmFsJSdwdWJpZCcrIFwKKyAgICAgICAgICAgICAgJyknK19TK19TeXN0ZW1MaXRlcmFsJSdzeXNsaXQnCitkb2N0eXBlID0gcmUuY29tcGlsZSgnPCFET0NUWVBFJytfUysnKD9QPG5hbWU+JytfTmFtZSsnKScKKyAgICAgICAgICAgICAgICAgICAgICcoPzonK19TK19FeHRlcm5hbElkKycpPycrX29wUykKK3htbGRlY2wgPSByZS5jb21waWxlKCc8XD94bWwnK19TKworICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nK19vcFMrJz0nK19vcFMrJyg/UDx2ZXJzaW9uPicrX1FTdHIrJyknKworICAgICAgICAgICAgICAgICAgICAgJyg/OicrX1MrJ2VuY29kaW5nJytfb3BTKyc9Jytfb3BTKworICAgICAgICAgICAgICAgICAgICAgICAgIig/UDxlbmNvZGluZz4nW0EtWmEtel1bLUEtWmEtejAtOS5fXSonfCIKKyAgICAgICAgICAgICAgICAgICAgICAgICciW0EtWmEtel1bLUEtWmEtejAtOS5fXSoiKSk/JworICAgICAgICAgICAgICAgICAgICAgJyg/OicrX1MrJ3N0YW5kYWxvbmUnK19vcFMrJz0nK19vcFMrCisgICAgICAgICAgICAgICAgICAgICAgICAnKD9QPHN0YW5kYWxvbmU+XCcoPzp5ZXN8bm8pXCd8Iig/Onllc3xubykiKSk/JysKKyAgICAgICAgICAgICAgICAgICAgIF9vcFMrJ1w/PicpCitwcm9jb3BlbiA9IHJlLmNvbXBpbGUocic8XD8oP1A8cHJvYz4nICsgX05hbWUgKyAnKScgKyBfb3BTKQorcHJvY2Nsb3NlID0gcmUuY29tcGlsZShfb3BTICsgcidcPz4nKQorY29tbWVudG9wZW4gPSByZS5jb21waWxlKCc8IS0tJykKK2NvbW1lbnRjbG9zZSA9IHJlLmNvbXBpbGUoJy0tPicpCitkb3VibGVkYXNoID0gcmUuY29tcGlsZSgnLS0nKQorYXR0cnRyYW5zID0gc3RyaW5nLm1ha2V0cmFucygnIFxyXG5cdCcsICcgICAgJykKKworIyBkZWZpbml0aW9ucyBmb3IgWE1MIG5hbWVzcGFjZXMKK19OQ05hbWUgPSAnW2EtekEtWl9dWy1hLXpBLVowLTkuX10qJyAgICAjIFhNTCBOYW1lLCBtaW51cyB0aGUgIjoiCituY25hbWUgPSByZS5jb21waWxlKF9OQ05hbWUgKyAnJCcpCitxbmFtZSA9IHJlLmNvbXBpbGUoJyg/Oig/UDxwcmVmaXg+JyArIF9OQ05hbWUgKyAnKTopPycgIyBvcHRpb25hbCBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAnKD9QPGxvY2FsPicgKyBfTkNOYW1lICsgJykkJykKKworeG1sbnMgPSByZS5jb21waWxlKCd4bWxucyg/OjooP1A8bmNuYW1lPicrX05DTmFtZSsnKSk/JCcpCisKKyMgWE1MIHBhcnNlciBiYXNlIGNsYXNzIC0tIGZpbmQgdGFncyBhbmQgY2FsbCBoYW5kbGVyIGZ1bmN0aW9ucy4KKyMgVXNhZ2U6IHAgPSBYTUxQYXJzZXIoKTsgcC5mZWVkKGRhdGEpOyAuLi47IHAuY2xvc2UoKS4KKyMgVGhlIGR0ZCBpcyBkZWZpbmVkIGJ5IGRlcml2aW5nIGEgY2xhc3Mgd2hpY2ggZGVmaW5lcyBtZXRob2RzIHdpdGgKKyMgc3BlY2lhbCBuYW1lcyB0byBoYW5kbGUgdGFnczogc3RhcnRfZm9vIGFuZCBlbmRfZm9vIHRvIGhhbmRsZSA8Zm9vPgorIyBhbmQgPC9mb28+LCByZXNwZWN0aXZlbHkuICBUaGUgZGF0YSBiZXR3ZWVuIHRhZ3MgaXMgcGFzc2VkIHRvIHRoZQorIyBwYXJzZXIgYnkgY2FsbGluZyBzZWxmLmhhbmRsZV9kYXRhKCkgd2l0aCBzb21lIGRhdGEgYXMgYXJndW1lbnQgKHRoZQorIyBkYXRhIG1heSBiZSBzcGxpdCB1cCBpbiBhcmJpdHJhcnkgY2h1bmtzKS4KKworY2xhc3MgWE1MUGFyc2VyOgorICAgIGF0dHJpYnV0ZXMgPSB7fSAgICAgICAgICAgICAgICAgICAgICMgZGVmYXVsdCwgdG8gYmUgb3ZlcnJpZGRlbgorICAgIGVsZW1lbnRzID0ge30gICAgICAgICAgICAgICAgICAgICAgICMgZGVmYXVsdCwgdG8gYmUgb3ZlcnJpZGRlbgorCisgICAgIyBwYXJzaW5nIG9wdGlvbnMsIHNldHRhYmxlIHVzaW5nIGtleXdvcmQgYXJncyBpbiBfX2luaXRfXworICAgIF9fYWNjZXB0X3VucXVvdGVkX2F0dHJpYnV0ZXMgPSAwCisgICAgX19hY2NlcHRfbWlzc2luZ19lbmR0YWdfbmFtZSA9IDAKKyAgICBfX21hcF9jYXNlID0gMAorICAgIF9fYWNjZXB0X3V0ZjggPSAwCisgICAgX190cmFuc2xhdGVfYXR0cmlidXRlX3JlZmVyZW5jZXMgPSAxCisKKyAgICAjIEludGVyZmFjZSAtLSBpbml0aWFsaXplIGFuZCByZXNldCB0aGlzIGluc3RhbmNlCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3cpOgorICAgICAgICBzZWxmLl9fZml4ZWQgPSAwCisgICAgICAgIGlmICdhY2NlcHRfdW5xdW90ZWRfYXR0cmlidXRlcycgaW4ga3c6CisgICAgICAgICAgICBzZWxmLl9fYWNjZXB0X3VucXVvdGVkX2F0dHJpYnV0ZXMgPSBrd1snYWNjZXB0X3VucXVvdGVkX2F0dHJpYnV0ZXMnXQorICAgICAgICBpZiAnYWNjZXB0X21pc3NpbmdfZW5kdGFnX25hbWUnIGluIGt3OgorICAgICAgICAgICAgc2VsZi5fX2FjY2VwdF9taXNzaW5nX2VuZHRhZ19uYW1lID0ga3dbJ2FjY2VwdF9taXNzaW5nX2VuZHRhZ19uYW1lJ10KKyAgICAgICAgaWYgJ21hcF9jYXNlJyBpbiBrdzoKKyAgICAgICAgICAgIHNlbGYuX19tYXBfY2FzZSA9IGt3WydtYXBfY2FzZSddCisgICAgICAgIGlmICdhY2NlcHRfdXRmOCcgaW4ga3c6CisgICAgICAgICAgICBzZWxmLl9fYWNjZXB0X3V0ZjggPSBrd1snYWNjZXB0X3V0ZjgnXQorICAgICAgICBpZiAndHJhbnNsYXRlX2F0dHJpYnV0ZV9yZWZlcmVuY2VzJyBpbiBrdzoKKyAgICAgICAgICAgIHNlbGYuX190cmFuc2xhdGVfYXR0cmlidXRlX3JlZmVyZW5jZXMgPSBrd1sndHJhbnNsYXRlX2F0dHJpYnV0ZV9yZWZlcmVuY2VzJ10KKyAgICAgICAgc2VsZi5yZXNldCgpCisKKyAgICBkZWYgX19maXhlbGVtZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5fX2ZpeGVkID0gMQorICAgICAgICBzZWxmLmVsZW1lbnRzID0ge30KKyAgICAgICAgc2VsZi5fX2ZpeGRpY3Qoc2VsZi5fX2RpY3RfXykKKyAgICAgICAgc2VsZi5fX2ZpeGNsYXNzKHNlbGYuX19jbGFzc19fKQorCisgICAgZGVmIF9fZml4Y2xhc3Moc2VsZiwga2wpOgorICAgICAgICBzZWxmLl9fZml4ZGljdChrbC5fX2RpY3RfXykKKyAgICAgICAgZm9yIGsgaW4ga2wuX19iYXNlc19fOgorICAgICAgICAgICAgc2VsZi5fX2ZpeGNsYXNzKGspCisKKyAgICBkZWYgX19maXhkaWN0KHNlbGYsIGRpY3QpOgorICAgICAgICBmb3Iga2V5IGluIGRpY3Qua2V5cygpOgorICAgICAgICAgICAgaWYga2V5Wzo2XSA9PSAnc3RhcnRfJzoKKyAgICAgICAgICAgICAgICB0YWcgPSBrZXlbNjpdCisgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCA9IHNlbGYuZWxlbWVudHMuZ2V0KHRhZywgKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgICAgIGlmIHN0YXJ0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudHNbdGFnXSA9IGdldGF0dHIoc2VsZiwga2V5KSwgZW5kCisgICAgICAgICAgICBlbGlmIGtleVs6NF0gPT0gJ2VuZF8nOgorICAgICAgICAgICAgICAgIHRhZyA9IGtleVs0Ol0KKyAgICAgICAgICAgICAgICBzdGFydCwgZW5kID0gc2VsZi5lbGVtZW50cy5nZXQodGFnLCAoTm9uZSwgTm9uZSkpCisgICAgICAgICAgICAgICAgaWYgZW5kIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZWxlbWVudHNbdGFnXSA9IHN0YXJ0LCBnZXRhdHRyKHNlbGYsIGtleSkKKworICAgICMgSW50ZXJmYWNlIC0tIHJlc2V0IHRoaXMgaW5zdGFuY2UuICBMb3NlcyBhbGwgdW5wcm9jZXNzZWQgZGF0YQorICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5yYXdkYXRhID0gJycKKyAgICAgICAgc2VsZi5zdGFjayA9IFtdCisgICAgICAgIHNlbGYubm9tb3JldGFncyA9IDAKKyAgICAgICAgc2VsZi5saXRlcmFsID0gMAorICAgICAgICBzZWxmLmxpbmVubyA9IDEKKyAgICAgICAgc2VsZi5fX2F0X3N0YXJ0ID0gMQorICAgICAgICBzZWxmLl9fc2Vlbl9kb2N0eXBlID0gTm9uZQorICAgICAgICBzZWxmLl9fc2Vlbl9zdGFydHRhZyA9IDAKKyAgICAgICAgc2VsZi5fX3VzZV9uYW1lc3BhY2VzID0gMAorICAgICAgICBzZWxmLl9fbmFtZXNwYWNlcyA9IHsneG1sJzpOb25lfSAgICMgeG1sIGlzIGltcGxpY2l0bHkgZGVjbGFyZWQKKyAgICAgICAgIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGhhY2s6IGlmIGVsZW1lbnRzIG5vdCBvdmVycmlkZGVuLAorICAgICAgICAjIGZpbGwgaXQgaW4gb3Vyc2VsdmVzCisgICAgICAgIGlmIHNlbGYuZWxlbWVudHMgaXMgWE1MUGFyc2VyLmVsZW1lbnRzOgorICAgICAgICAgICAgc2VsZi5fX2ZpeGVsZW1lbnRzKCkKKworICAgICMgRm9yIGRlcml2ZWQgY2xhc3NlcyBvbmx5IC0tIGVudGVyIGxpdGVyYWwgbW9kZSAoQ0RBVEEpIHRpbGwgRU9GCisgICAgZGVmIHNldG5vbW9yZXRhZ3Moc2VsZik6CisgICAgICAgIHNlbGYubm9tb3JldGFncyA9IHNlbGYubGl0ZXJhbCA9IDEKKworICAgICMgRm9yIGRlcml2ZWQgY2xhc3NlcyBvbmx5IC0tIGVudGVyIGxpdGVyYWwgbW9kZSAoQ0RBVEEpCisgICAgZGVmIHNldGxpdGVyYWwoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLmxpdGVyYWwgPSAxCisKKyAgICAjIEludGVyZmFjZSAtLSBmZWVkIHNvbWUgZGF0YSB0byB0aGUgcGFyc2VyLiAgQ2FsbCB0aGlzIGFzCisgICAgIyBvZnRlbiBhcyB5b3Ugd2FudCwgd2l0aCBhcyBsaXR0bGUgb3IgYXMgbXVjaCB0ZXh0IGFzIHlvdQorICAgICMgd2FudCAobWF5IGluY2x1ZGUgJ1xuJykuICAoVGhpcyBqdXN0IHNhdmVzIHRoZSB0ZXh0LCBhbGwgdGhlCisgICAgIyBwcm9jZXNzaW5nIGlzIGRvbmUgYnkgZ29haGVhZCgpLikKKyAgICBkZWYgZmVlZChzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5yYXdkYXRhID0gc2VsZi5yYXdkYXRhICsgZGF0YQorICAgICAgICBzZWxmLmdvYWhlYWQoMCkKKworICAgICMgSW50ZXJmYWNlIC0tIGhhbmRsZSB0aGUgcmVtYWluaW5nIGRhdGEKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZ29haGVhZCgxKQorICAgICAgICBpZiBzZWxmLl9fZml4ZWQ6CisgICAgICAgICAgICBzZWxmLl9fZml4ZWQgPSAwCisgICAgICAgICAgICAjIHJlbW92ZSBzZWxmLmVsZW1lbnRzIHNvIHRoYXQgd2UgZG9uJ3QgbGVhaworICAgICAgICAgICAgZGVsIHNlbGYuZWxlbWVudHMKKworICAgICMgSW50ZXJmYWNlIC0tIHRyYW5zbGF0ZSByZWZlcmVuY2VzCisgICAgZGVmIHRyYW5zbGF0ZV9yZWZlcmVuY2VzKHNlbGYsIGRhdGEsIGFsbCA9IDEpOgorICAgICAgICBpZiBub3Qgc2VsZi5fX3RyYW5zbGF0ZV9hdHRyaWJ1dGVfcmVmZXJlbmNlczoKKyAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgIGkgPSAwCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICByZXMgPSBhbXAuc2VhcmNoKGRhdGEsIGkpCisgICAgICAgICAgICBpZiByZXMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICAgICAgcyA9IHJlcy5zdGFydCgwKQorICAgICAgICAgICAgcmVzID0gcmVmLm1hdGNoKGRhdGEsIHMpCisgICAgICAgICAgICBpZiByZXMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigiYm9ndXMgYCYnIikKKyAgICAgICAgICAgICAgICBpID0gcysxCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGkgPSByZXMuZW5kKDApCisgICAgICAgICAgICBzdHIgPSByZXMuZ3JvdXAoMSkKKyAgICAgICAgICAgIHJlc2NhbiA9IDAKKyAgICAgICAgICAgIGlmIHN0clswXSA9PSAnIyc6CisgICAgICAgICAgICAgICAgaWYgc3RyWzFdID09ICd4JzoKKyAgICAgICAgICAgICAgICAgICAgc3RyID0gY2hyKGludChzdHJbMjpdLCAxNikpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3RyID0gY2hyKGludChzdHJbMTpdKSkKKyAgICAgICAgICAgICAgICBpZiBkYXRhW2kgLSAxXSAhPSAnOyc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJgOycgbWlzc2luZyBhZnRlciBjaGFyIHJlZmVyZW5jZSIpCisgICAgICAgICAgICAgICAgICAgIGkgPSBpLTEKKyAgICAgICAgICAgIGVsaWYgYWxsOgorICAgICAgICAgICAgICAgIGlmIHN0ciBpbiBzZWxmLmVudGl0eWRlZnM6CisgICAgICAgICAgICAgICAgICAgIHN0ciA9IHNlbGYuZW50aXR5ZGVmc1tzdHJdCisgICAgICAgICAgICAgICAgICAgIHJlc2NhbiA9IDEKKyAgICAgICAgICAgICAgICBlbGlmIGRhdGFbaSAtIDFdICE9ICc7JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoImJvZ3VzIGAmJyIpCisgICAgICAgICAgICAgICAgICAgIGkgPSBzICsgMSAjIGp1c3QgcGFzdCB0aGUgJgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJyZWZlcmVuY2UgdG8gdW5rbm93biBlbnRpdHkgYCYlczsnIiAlIHN0cikKKyAgICAgICAgICAgICAgICAgICAgc3RyID0gJyYnICsgc3RyICsgJzsnCisgICAgICAgICAgICBlbGlmIGRhdGFbaSAtIDFdICE9ICc7JzoKKyAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigiYm9ndXMgYCYnIikKKyAgICAgICAgICAgICAgICBpID0gcyArIDEgIyBqdXN0IHBhc3QgdGhlICYKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIHdoZW4gd2UgZ2V0IGhlcmUsIHN0ciBjb250YWlucyB0aGUgdHJhbnNsYXRlZCB0ZXh0IGFuZCBpIHBvaW50cworICAgICAgICAgICAgIyB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgdGhhdCBpcyB0byBiZSByZXBsYWNlZAorICAgICAgICAgICAgZGF0YSA9IGRhdGFbOnNdICsgc3RyICsgZGF0YVtpOl0KKyAgICAgICAgICAgIGlmIHJlc2NhbjoKKyAgICAgICAgICAgICAgICBpID0gcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpID0gcyArIGxlbihzdHIpCisKKyAgICAjIEludGVyZmFjZSAtIHJldHVybiBhIGRpY3Rpb25hcnkgb2YgYWxsIG5hbWVzcGFjZXMgY3VycmVudGx5IHZhbGlkCisgICAgZGVmIGdldG5hbWVzcGFjZShzZWxmKToKKyAgICAgICAgbnNkaWN0ID0ge30KKyAgICAgICAgZm9yIHQsIGQsIG5zdCBpbiBzZWxmLnN0YWNrOgorICAgICAgICAgICAgbnNkaWN0LnVwZGF0ZShkKQorICAgICAgICByZXR1cm4gbnNkaWN0CisKKyAgICAjIEludGVybmFsIC0tIGhhbmRsZSBkYXRhIGFzIGZhciBhcyByZWFzb25hYmxlLiAgTWF5IGxlYXZlIHN0YXRlCisgICAgIyBhbmQgZGF0YSB0byBiZSBwcm9jZXNzZWQgYnkgYSBzdWJzZXF1ZW50IGNhbGwuICBJZiAnZW5kJyBpcworICAgICMgdHJ1ZSwgZm9yY2UgaGFuZGxpbmcgYWxsIGRhdGEgYXMgaWYgZm9sbG93ZWQgYnkgRU9GIG1hcmtlci4KKyAgICBkZWYgZ29haGVhZChzZWxmLCBlbmQpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGkgPSAwCisgICAgICAgIG4gPSBsZW4ocmF3ZGF0YSkKKyAgICAgICAgd2hpbGUgaSA8IG46CisgICAgICAgICAgICBpZiBpID4gMDoKKyAgICAgICAgICAgICAgICBzZWxmLl9fYXRfc3RhcnQgPSAwCisgICAgICAgICAgICBpZiBzZWxmLm5vbW9yZXRhZ3M6CisgICAgICAgICAgICAgICAgZGF0YSA9IHJhd2RhdGFbaTpuXQorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoZGF0YSkKKyAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgZGF0YS5jb3VudCgnXG4nKQorICAgICAgICAgICAgICAgIGkgPSBuCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHJlcyA9IGludGVyZXN0aW5nLnNlYXJjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgaWYgcmVzOgorICAgICAgICAgICAgICAgIGogPSByZXMuc3RhcnQoMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaiA9IG4KKyAgICAgICAgICAgIGlmIGkgPCBqOgorICAgICAgICAgICAgICAgIGRhdGEgPSByYXdkYXRhW2k6al0KKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9fYXRfc3RhcnQgYW5kIHNwYWNlLm1hdGNoKGRhdGEpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdpbGxlZ2FsIGRhdGEgYXQgc3RhcnQgb2YgZmlsZScpCisgICAgICAgICAgICAgICAgc2VsZi5fX2F0X3N0YXJ0ID0gMAorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnN0YWNrIGFuZCBzcGFjZS5tYXRjaChkYXRhKSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignZGF0YSBub3QgaW4gY29udGVudCcpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX19hY2NlcHRfdXRmOCBhbmQgaWxsZWdhbC5zZWFyY2goZGF0YSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdpbGxlZ2FsIGNoYXJhY3RlciBpbiBjb250ZW50JykKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKGRhdGEpCisgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIGRhdGEuY291bnQoJ1xuJykKKyAgICAgICAgICAgIGkgPSBqCisgICAgICAgICAgICBpZiBpID09IG46IGJyZWFrCisgICAgICAgICAgICBpZiByYXdkYXRhW2ldID09ICc8JzoKKyAgICAgICAgICAgICAgICBpZiBzdGFydHRhZ29wZW4ubWF0Y2gocmF3ZGF0YSwgaSk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByYXdkYXRhW2ldCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgZGF0YS5jb3VudCgnXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgayA9IHNlbGYucGFyc2Vfc3RhcnR0YWcoaSkKKyAgICAgICAgICAgICAgICAgICAgaWYgayA8IDA6IGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX19zZWVuX3N0YXJ0dGFnID0gMQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgcmF3ZGF0YVtpOmtdLmNvdW50KCdcbicpCisgICAgICAgICAgICAgICAgICAgIGkgPSBrCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgZW5kdGFnb3Blbi5tYXRjaChyYXdkYXRhLCBpKToKKyAgICAgICAgICAgICAgICAgICAgayA9IHNlbGYucGFyc2VfZW5kdGFnKGkpCisgICAgICAgICAgICAgICAgICAgIGlmIGsgPCAwOiBicmVhaworICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgcmF3ZGF0YVtpOmtdLmNvdW50KCdcbicpCisgICAgICAgICAgICAgICAgICAgIGkgPSAgaworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGNvbW1lbnRvcGVuLm1hdGNoKHJhd2RhdGEsIGkpOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmxpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmF3ZGF0YVtpXQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIGRhdGEuY291bnQoJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX2NvbW1lbnQoaSkKKyAgICAgICAgICAgICAgICAgICAgaWYgayA8IDA6IGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyByYXdkYXRhW2k6a10uY291bnQoJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgaSA9IGsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBjZGF0YW9wZW4ubWF0Y2gocmF3ZGF0YSwgaSk6CisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX2NkYXRhKGkpCisgICAgICAgICAgICAgICAgICAgIGlmIGsgPCAwOiBicmVhaworICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgcmF3ZGF0YVtpOmtdLmNvdW50KCdcbicpCisgICAgICAgICAgICAgICAgICAgIGkgPSBrCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcmVzID0geG1sZGVjbC5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgICAgIGlmIHJlczoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX19hdF9zdGFydDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCI8P3htbD8+IGRlY2xhcmF0aW9uIG5vdCBhdCBzdGFydCBvZiBkb2N1bWVudCIpCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24sIGVuY29kaW5nLCBzdGFuZGFsb25lID0gcmVzLmdyb3VwKCd2ZXJzaW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0YW5kYWxvbmUnKQorICAgICAgICAgICAgICAgICAgICBpZiB2ZXJzaW9uWzE6LTFdICE9ICcxLjAnOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IoJ29ubHkgWE1MIHZlcnNpb24gMS4wIHN1cHBvcnRlZCcpCisgICAgICAgICAgICAgICAgICAgIGlmIGVuY29kaW5nOiBlbmNvZGluZyA9IGVuY29kaW5nWzE6LTFdCisgICAgICAgICAgICAgICAgICAgIGlmIHN0YW5kYWxvbmU6IHN0YW5kYWxvbmUgPSBzdGFuZGFsb25lWzE6LTFdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX3htbChlbmNvZGluZywgc3RhbmRhbG9uZSkKKyAgICAgICAgICAgICAgICAgICAgaSA9IHJlcy5lbmQoMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICByZXMgPSBwcm9jb3Blbi5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgICAgIGlmIHJlczoKKyAgICAgICAgICAgICAgICAgICAgayA9IHNlbGYucGFyc2VfcHJvYyhpKQorICAgICAgICAgICAgICAgICAgICBpZiBrIDwgMDogYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIHJhd2RhdGFbaTprXS5jb3VudCgnXG4nKQorICAgICAgICAgICAgICAgICAgICBpID0gaworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJlcyA9IGRvY3R5cGUubWF0Y2gocmF3ZGF0YSwgaSkKKyAgICAgICAgICAgICAgICBpZiByZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYubGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByYXdkYXRhW2ldCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgZGF0YS5jb3VudCgnXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fX3NlZW5fZG9jdHlwZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdtdWx0aXBsZSBET0NUWVBFIGVsZW1lbnRzJykKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fX3NlZW5fc3RhcnR0YWc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignRE9DVFlQRSBub3QgYXQgYmVnaW5uaW5nIG9mIGRvY3VtZW50JykKKyAgICAgICAgICAgICAgICAgICAgayA9IHNlbGYucGFyc2VfZG9jdHlwZShyZXMpCisgICAgICAgICAgICAgICAgICAgIGlmIGsgPCAwOiBicmVhaworICAgICAgICAgICAgICAgICAgICBzZWxmLl9fc2Vlbl9kb2N0eXBlID0gcmVzLmdyb3VwKCduYW1lJykKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fX21hcF9jYXNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX3NlZW5fZG9jdHlwZSA9IHNlbGYuX19zZWVuX2RvY3R5cGUubG93ZXIoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgcmF3ZGF0YVtpOmtdLmNvdW50KCdcbicpCisgICAgICAgICAgICAgICAgICAgIGkgPSBrCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHJhd2RhdGFbaV0gPT0gJyYnOgorICAgICAgICAgICAgICAgIGlmIHNlbGYubGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJhd2RhdGFbaV0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShkYXRhKQorICAgICAgICAgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcmVzID0gY2hhcnJlZi5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgICAgIGlmIHJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaSA9IHJlcy5lbmQoMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmF3ZGF0YVtpLTFdICE9ICc7JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJgOycgbWlzc2luZyBpbiBjaGFycmVmIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpLTEKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuc3RhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignZGF0YSBub3QgaW4gY29udGVudCcpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2NoYXJyZWYocmVzLmdyb3VwKCdjaGFyJylbOi0xXSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIHJlcy5ncm91cCgwKS5jb3VudCgnXG4nKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJlcyA9IGVudGl0eXJlZi5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgICAgIGlmIHJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaSA9IHJlcy5lbmQoMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmF3ZGF0YVtpLTFdICE9ICc7JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJgOycgbWlzc2luZyBpbiBlbnRpdHlyZWYiKQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGktMQorICAgICAgICAgICAgICAgICAgICBuYW1lID0gcmVzLmdyb3VwKCduYW1lJykKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fX21hcF9jYXNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQorICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIGluIHNlbGYuZW50aXR5ZGVmczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmF3ZGF0YSA9IHJhd2RhdGEgPSByYXdkYXRhWzpyZXMuc3RhcnQoMCldICsgc2VsZi5lbnRpdHlkZWZzW25hbWVdICsgcmF3ZGF0YVtpOl0KKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBsZW4ocmF3ZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSByZXMuc3RhcnQoMCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudW5rbm93bl9lbnRpdHlyZWYobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIHJlcy5ncm91cCgwKS5jb3VudCgnXG4nKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiByYXdkYXRhW2ldID09ICddJzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmxpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByYXdkYXRhW2ldCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIG4taSA8IDM6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgY2RhdGFjbG9zZS5tYXRjaChyYXdkYXRhLCBpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoImJvZ3VzIGBdXT4nIikKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaV0pCisgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKCduZWl0aGVyIDwgbm9yICYgPz8nKQorICAgICAgICAgICAgIyBXZSBnZXQgaGVyZSBvbmx5IGlmIGluY29tcGxldGUgbWF0Y2hlcyBidXQKKyAgICAgICAgICAgICMgbm90aGluZyBlbHNlCisgICAgICAgICAgICBicmVhaworICAgICAgICAjIGVuZCB3aGlsZQorICAgICAgICBpZiBpID4gMDoKKyAgICAgICAgICAgIHNlbGYuX19hdF9zdGFydCA9IDAKKyAgICAgICAgaWYgZW5kIGFuZCBpIDwgbjoKKyAgICAgICAgICAgIGRhdGEgPSByYXdkYXRhW2ldCisgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigiYm9ndXMgYCVzJyIgJSBkYXRhKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX19hY2NlcHRfdXRmOCBhbmQgaWxsZWdhbC5zZWFyY2goZGF0YSk6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ2lsbGVnYWwgY2hhcmFjdGVyIGluIGNvbnRlbnQnKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShkYXRhKQorICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIGRhdGEuY291bnQoJ1xuJykKKyAgICAgICAgICAgIHNlbGYucmF3ZGF0YSA9IHJhd2RhdGFbaSsxOl0KKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdvYWhlYWQoZW5kKQorICAgICAgICBzZWxmLnJhd2RhdGEgPSByYXdkYXRhW2k6XQorICAgICAgICBpZiBlbmQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fX3NlZW5fc3RhcnR0YWc6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ25vIGVsZW1lbnRzIGluIGZpbGUnKQorICAgICAgICAgICAgaWYgc2VsZi5zdGFjazoKKyAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignbWlzc2luZyBlbmQgdGFncycpCisgICAgICAgICAgICAgICAgd2hpbGUgc2VsZi5zdGFjazoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maW5pc2hfZW5kdGFnKHNlbGYuc3RhY2tbLTFdWzBdKQorCisgICAgIyBJbnRlcm5hbCAtLSBwYXJzZSBjb21tZW50LCByZXR1cm4gbGVuZ3RoIG9yIC0xIGlmIG5vdCB0ZXJtaW5hdGVkCisgICAgZGVmIHBhcnNlX2NvbW1lbnQoc2VsZiwgaSk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgaWYgcmF3ZGF0YVtpOmkrNF0gIT0gJzwhLS0nOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IoJ3VuZXhwZWN0ZWQgY2FsbCB0byBoYW5kbGVfY29tbWVudCcpCisgICAgICAgIHJlcyA9IGNvbW1lbnRjbG9zZS5zZWFyY2gocmF3ZGF0YSwgaSs0KQorICAgICAgICBpZiByZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBpZiBkb3VibGVkYXNoLnNlYXJjaChyYXdkYXRhLCBpKzQsIHJlcy5zdGFydCgwKSk6CisgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigiYC0tJyBpbnNpZGUgY29tbWVudCIpCisgICAgICAgIGlmIHJhd2RhdGFbcmVzLnN0YXJ0KDApLTFdID09ICctJzoKKyAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdjb21tZW50IGNhbm5vdCBlbmQgaW4gdGhyZWUgZGFzaGVzJykKKyAgICAgICAgaWYgbm90IHNlbGYuX19hY2NlcHRfdXRmOCBhbmQgXAorICAgICAgICAgICBpbGxlZ2FsLnNlYXJjaChyYXdkYXRhLCBpKzQsIHJlcy5zdGFydCgwKSk6CisgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignaWxsZWdhbCBjaGFyYWN0ZXIgaW4gY29tbWVudCcpCisgICAgICAgIHNlbGYuaGFuZGxlX2NvbW1lbnQocmF3ZGF0YVtpKzQ6IHJlcy5zdGFydCgwKV0pCisgICAgICAgIHJldHVybiByZXMuZW5kKDApCisKKyAgICAjIEludGVybmFsIC0tIGhhbmRsZSBET0NUWVBFIHRhZywgcmV0dXJuIGxlbmd0aCBvciAtMSBpZiBub3QgdGVybWluYXRlZAorICAgIGRlZiBwYXJzZV9kb2N0eXBlKHNlbGYsIHJlcyk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgbiA9IGxlbihyYXdkYXRhKQorICAgICAgICBuYW1lID0gcmVzLmdyb3VwKCduYW1lJykKKyAgICAgICAgaWYgc2VsZi5fX21hcF9jYXNlOgorICAgICAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQorICAgICAgICBwdWJpZCwgc3lzbGl0ID0gcmVzLmdyb3VwKCdwdWJpZCcsICdzeXNsaXQnKQorICAgICAgICBpZiBwdWJpZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHB1YmlkID0gcHViaWRbMTotMV0gICAgICAgICAjIHJlbW92ZSBxdW90ZXMKKyAgICAgICAgICAgIHB1YmlkID0gJyAnLmpvaW4ocHViaWQuc3BsaXQoKSkgIyBub3JtYWxpemUKKyAgICAgICAgaWYgc3lzbGl0IGlzIG5vdCBOb25lOiBzeXNsaXQgPSBzeXNsaXRbMTotMV0gIyByZW1vdmUgcXVvdGVzCisgICAgICAgIGogPSBrID0gcmVzLmVuZCgwKQorICAgICAgICBpZiBrID49IG46CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgaWYgcmF3ZGF0YVtrXSA9PSAnWyc6CisgICAgICAgICAgICBsZXZlbCA9IDAKKyAgICAgICAgICAgIGsgPSBrKzEKKyAgICAgICAgICAgIGRxID0gc3EgPSAwCisgICAgICAgICAgICB3aGlsZSBrIDwgbjoKKyAgICAgICAgICAgICAgICBjID0gcmF3ZGF0YVtrXQorICAgICAgICAgICAgICAgIGlmIG5vdCBzcSBhbmQgYyA9PSAnIic6CisgICAgICAgICAgICAgICAgICAgIGRxID0gbm90IGRxCisgICAgICAgICAgICAgICAgZWxpZiBub3QgZHEgYW5kIGMgPT0gIiciOgorICAgICAgICAgICAgICAgICAgICBzcSA9IG5vdCBzcQorICAgICAgICAgICAgICAgIGVsaWYgc3Egb3IgZHE6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbGlmIGxldmVsIDw9IDAgYW5kIGMgPT0gJ10nOgorICAgICAgICAgICAgICAgICAgICByZXMgPSBlbmRicmFja2V0Lm1hdGNoKHJhd2RhdGEsIGsrMSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZG9jdHlwZShuYW1lLCBwdWJpZCwgc3lzbGl0LCByYXdkYXRhW2orMTprXSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5lbmQoMCkKKyAgICAgICAgICAgICAgICBlbGlmIGMgPT0gJzwnOgorICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsICsgMQorICAgICAgICAgICAgICAgIGVsaWYgYyA9PSAnPic6CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gbGV2ZWwgLSAxCisgICAgICAgICAgICAgICAgICAgIGlmIGxldmVsIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJib2d1cyBgPicgaW4gRE9DVFlQRSIpCisgICAgICAgICAgICAgICAgayA9IGsrMQorICAgICAgICByZXMgPSBlbmRicmFja2V0ZmluZC5tYXRjaChyYXdkYXRhLCBrKQorICAgICAgICBpZiByZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBpZiBlbmRicmFja2V0Lm1hdGNoKHJhd2RhdGEsIGspIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignZ2FyYmFnZSBpbiBET0NUWVBFJykKKyAgICAgICAgc2VsZi5oYW5kbGVfZG9jdHlwZShuYW1lLCBwdWJpZCwgc3lzbGl0LCBOb25lKQorICAgICAgICByZXR1cm4gcmVzLmVuZCgwKQorCisgICAgIyBJbnRlcm5hbCAtLSBoYW5kbGUgQ0RBVEEgdGFnLCByZXR1cm4gbGVuZ3RoIG9yIC0xIGlmIG5vdCB0ZXJtaW5hdGVkCisgICAgZGVmIHBhcnNlX2NkYXRhKHNlbGYsIGkpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGlmIHJhd2RhdGFbaTppKzldICE9ICc8IVtDREFUQVsnOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IoJ3VuZXhwZWN0ZWQgY2FsbCB0byBwYXJzZV9jZGF0YScpCisgICAgICAgIHJlcyA9IGNkYXRhY2xvc2Uuc2VhcmNoKHJhd2RhdGEsIGkrOSkKKyAgICAgICAgaWYgcmVzIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgaWYgbm90IHNlbGYuX19hY2NlcHRfdXRmOCBhbmQgXAorICAgICAgICAgICBpbGxlZ2FsLnNlYXJjaChyYXdkYXRhLCBpKzksIHJlcy5zdGFydCgwKSk6CisgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignaWxsZWdhbCBjaGFyYWN0ZXIgaW4gQ0RBVEEnKQorICAgICAgICBpZiBub3Qgc2VsZi5zdGFjazoKKyAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdDREFUQSBub3QgaW4gY29udGVudCcpCisgICAgICAgIHNlbGYuaGFuZGxlX2NkYXRhKHJhd2RhdGFbaSs5OnJlcy5zdGFydCgwKV0pCisgICAgICAgIHJldHVybiByZXMuZW5kKDApCisKKyAgICBfX3htbF9uYW1lc3BhY2VfYXR0cmlidXRlcyA9IHsnbnMnOk5vbmUsICdzcmMnOk5vbmUsICdwcmVmaXgnOk5vbmV9CisgICAgIyBJbnRlcm5hbCAtLSBoYW5kbGUgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhZworICAgIGRlZiBwYXJzZV9wcm9jKHNlbGYsIGkpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGVuZCA9IHByb2NjbG9zZS5zZWFyY2gocmF3ZGF0YSwgaSkKKyAgICAgICAgaWYgZW5kIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgaiA9IGVuZC5zdGFydCgwKQorICAgICAgICBpZiBub3Qgc2VsZi5fX2FjY2VwdF91dGY4IGFuZCBpbGxlZ2FsLnNlYXJjaChyYXdkYXRhLCBpKzIsIGopOgorICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ2lsbGVnYWwgY2hhcmFjdGVyIGluIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24nKQorICAgICAgICByZXMgPSB0YWdmaW5kLm1hdGNoKHJhd2RhdGEsIGkrMikKKyAgICAgICAgaWYgcmVzIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBFcnJvcigndW5leHBlY3RlZCBjYWxsIHRvIHBhcnNlX3Byb2MnKQorICAgICAgICBrID0gcmVzLmVuZCgwKQorICAgICAgICBuYW1lID0gcmVzLmdyb3VwKDApCisgICAgICAgIGlmIHNlbGYuX19tYXBfY2FzZToKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgaWYgbmFtZSA9PSAneG1sOm5hbWVzcGFjZSc6CisgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignb2xkLWZhc2hpb25lZCBuYW1lc3BhY2UgZGVjbGFyYXRpb24nKQorICAgICAgICAgICAgc2VsZi5fX3VzZV9uYW1lc3BhY2VzID0gLTEKKyAgICAgICAgICAgICMgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCisgICAgICAgICAgICAjIHRoaXMgbXVzdCBjb21lIGFmdGVyIHRoZSA8P3htbD8+IGRlY2xhcmF0aW9uIChpZiBhbnkpCisgICAgICAgICAgICAjIGFuZCBiZWZvcmUgdGhlIDwhRE9DVFlQRT4gKGlmIGFueSkuCisgICAgICAgICAgICBpZiBzZWxmLl9fc2Vlbl9kb2N0eXBlIG9yIHNlbGYuX19zZWVuX3N0YXJ0dGFnOgorICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCd4bWw6bmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRvbyBsYXRlIGluIGRvY3VtZW50JykKKyAgICAgICAgICAgIGF0dHJkaWN0LCBuYW1lc3BhY2UsIGsgPSBzZWxmLnBhcnNlX2F0dHJpYnV0ZXMobmFtZSwgaywgaikKKyAgICAgICAgICAgIGlmIG5hbWVzcGFjZToKKyAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGluc2lkZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24nKQorICAgICAgICAgICAgZm9yIGF0dHJuYW1lIGluIGF0dHJkaWN0LmtleXMoKToKKyAgICAgICAgICAgICAgICBpZiBub3QgYXR0cm5hbWUgaW4gc2VsZi5fX3htbF9uYW1lc3BhY2VfYXR0cmlidXRlczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoInVua25vd24gYXR0cmlidXRlIGAlcycgaW4geG1sOm5hbWVzcGFjZSB0YWciICUgYXR0cm5hbWUpCisgICAgICAgICAgICBpZiBub3QgJ25zJyBpbiBhdHRyZGljdCBvciBub3QgJ3ByZWZpeCcgaW4gYXR0cmRpY3Q6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ3htbDpuYW1lc3BhY2Ugd2l0aG91dCByZXF1aXJlZCBhdHRyaWJ1dGVzJykKKyAgICAgICAgICAgIHByZWZpeCA9IGF0dHJkaWN0LmdldCgncHJlZml4JykKKyAgICAgICAgICAgIGlmIG5jbmFtZS5tYXRjaChwcmVmaXgpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ3htbDpuYW1lc3BhY2UgaWxsZWdhbCBwcmVmaXggdmFsdWUnKQorICAgICAgICAgICAgICAgIHJldHVybiBlbmQuZW5kKDApCisgICAgICAgICAgICBpZiBwcmVmaXggaW4gc2VsZi5fX25hbWVzcGFjZXM6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ3htbDpuYW1lc3BhY2UgcHJlZml4IG5vdCB1bmlxdWUnKQorICAgICAgICAgICAgc2VsZi5fX25hbWVzcGFjZXNbcHJlZml4XSA9IGF0dHJkaWN0WyducyddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBuYW1lLmxvd2VyKCkgPT0gJ3htbCc6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ2lsbGVnYWwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQgbmFtZScpCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9wcm9jKG5hbWUsIHJhd2RhdGFbazpqXSkKKyAgICAgICAgcmV0dXJuIGVuZC5lbmQoMCkKKworICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgYXR0cmlidXRlcyBiZXR3ZWVuIGkgYW5kIGoKKyAgICBkZWYgcGFyc2VfYXR0cmlidXRlcyhzZWxmLCB0YWcsIGksIGopOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGF0dHJkaWN0ID0ge30KKyAgICAgICAgbmFtZXNwYWNlID0ge30KKyAgICAgICAgd2hpbGUgaSA8IGo6CisgICAgICAgICAgICByZXMgPSBhdHRyZmluZC5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgaWYgcmVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGF0dHJuYW1lLCBhdHRydmFsdWUgPSByZXMuZ3JvdXAoJ25hbWUnLCAndmFsdWUnKQorICAgICAgICAgICAgaWYgc2VsZi5fX21hcF9jYXNlOgorICAgICAgICAgICAgICAgIGF0dHJuYW1lID0gYXR0cm5hbWUubG93ZXIoKQorICAgICAgICAgICAgaSA9IHJlcy5lbmQoMCkKKyAgICAgICAgICAgIGlmIGF0dHJ2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJubyB2YWx1ZSBzcGVjaWZpZWQgZm9yIGF0dHJpYnV0ZSBgJXMnIiAlIGF0dHJuYW1lKQorICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IGF0dHJuYW1lCisgICAgICAgICAgICBlbGlmIGF0dHJ2YWx1ZVs6MV0gPT0gIiciID09IGF0dHJ2YWx1ZVstMTpdIG9yIFwKKyAgICAgICAgICAgICAgICAgYXR0cnZhbHVlWzoxXSA9PSAnIicgPT0gYXR0cnZhbHVlWy0xOl06CisgICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gYXR0cnZhbHVlWzE6LTFdCisgICAgICAgICAgICBlbGlmIG5vdCBzZWxmLl9fYWNjZXB0X3VucXVvdGVkX2F0dHJpYnV0ZXM6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoImF0dHJpYnV0ZSBgJXMnIHZhbHVlIG5vdCBxdW90ZWQiICUgYXR0cm5hbWUpCisgICAgICAgICAgICByZXMgPSB4bWxucy5tYXRjaChhdHRybmFtZSkKKyAgICAgICAgICAgIGlmIHJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgorICAgICAgICAgICAgICAgIG5jbmFtZSA9IHJlcy5ncm91cCgnbmNuYW1lJykKKyAgICAgICAgICAgICAgICBuYW1lc3BhY2VbbmNuYW1lIG9yICcnXSA9IGF0dHJ2YWx1ZSBvciBOb25lCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX191c2VfbmFtZXNwYWNlczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fX3VzZV9uYW1lc3BhY2VzID0gbGVuKHNlbGYuc3RhY2spKzEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgJzwnIGluIGF0dHJ2YWx1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigiYDwnIGlsbGVnYWwgaW4gYXR0cmlidXRlIHZhbHVlIikKKyAgICAgICAgICAgIGlmIGF0dHJuYW1lIGluIGF0dHJkaWN0OgorICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJhdHRyaWJ1dGUgYCVzJyBzcGVjaWZpZWQgdHdpY2UiICUgYXR0cm5hbWUpCisgICAgICAgICAgICBhdHRydmFsdWUgPSBhdHRydmFsdWUudHJhbnNsYXRlKGF0dHJ0cmFucykKKyAgICAgICAgICAgIGF0dHJkaWN0W2F0dHJuYW1lXSA9IHNlbGYudHJhbnNsYXRlX3JlZmVyZW5jZXMoYXR0cnZhbHVlKQorICAgICAgICByZXR1cm4gYXR0cmRpY3QsIG5hbWVzcGFjZSwgaQorCisgICAgIyBJbnRlcm5hbCAtLSBoYW5kbGUgc3RhcnR0YWcsIHJldHVybiBsZW5ndGggb3IgLTEgaWYgbm90IHRlcm1pbmF0ZWQKKyAgICBkZWYgcGFyc2Vfc3RhcnR0YWcoc2VsZiwgaSk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgIyBpIHBvaW50cyB0byBzdGFydCBvZiB0YWcKKyAgICAgICAgZW5kID0gZW5kYnJhY2tldGZpbmQubWF0Y2gocmF3ZGF0YSwgaSsxKQorICAgICAgICBpZiBlbmQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICB0YWcgPSBzdGFydHRhZ21hdGNoLm1hdGNoKHJhd2RhdGEsIGkpCisgICAgICAgIGlmIHRhZyBpcyBOb25lIG9yIHRhZy5lbmQoMCkgIT0gZW5kLmVuZCgwKToKKyAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdnYXJiYWdlIGluIHN0YXJ0dGFnJykKKyAgICAgICAgICAgIHJldHVybiBlbmQuZW5kKDApCisgICAgICAgIG5zdGFnID0gdGFnbmFtZSA9IHRhZy5ncm91cCgndGFnbmFtZScpCisgICAgICAgIGlmIHNlbGYuX19tYXBfY2FzZToKKyAgICAgICAgICAgIG5zdGFnID0gdGFnbmFtZSA9IG5zdGFnLmxvd2VyKCkKKyAgICAgICAgaWYgbm90IHNlbGYuX19zZWVuX3N0YXJ0dGFnIGFuZCBzZWxmLl9fc2Vlbl9kb2N0eXBlIGFuZCBcCisgICAgICAgICAgIHRhZ25hbWUgIT0gc2VsZi5fX3NlZW5fZG9jdHlwZToKKyAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdzdGFydHRhZyBkb2VzIG5vdCBtYXRjaCBET0NUWVBFJykKKyAgICAgICAgaWYgc2VsZi5fX3NlZW5fc3RhcnR0YWcgYW5kIG5vdCBzZWxmLnN0YWNrOgorICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ211bHRpcGxlIGVsZW1lbnRzIG9uIHRvcCBsZXZlbCcpCisgICAgICAgIGssIGogPSB0YWcuc3BhbignYXR0cnMnKQorICAgICAgICBhdHRyZGljdCwgbnNkaWN0LCBrID0gc2VsZi5wYXJzZV9hdHRyaWJ1dGVzKHRhZ25hbWUsIGssIGopCisgICAgICAgIHNlbGYuc3RhY2suYXBwZW5kKCh0YWduYW1lLCBuc2RpY3QsIG5zdGFnKSkKKyAgICAgICAgaWYgc2VsZi5fX3VzZV9uYW1lc3BhY2VzOgorICAgICAgICAgICAgcmVzID0gcW5hbWUubWF0Y2godGFnbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlcyA9IE5vbmUKKyAgICAgICAgaWYgcmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJlZml4LCBuc3RhZyA9IHJlcy5ncm91cCgncHJlZml4JywgJ2xvY2FsJykKKyAgICAgICAgICAgIGlmIHByZWZpeCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHByZWZpeCA9ICcnCisgICAgICAgICAgICBucyA9IE5vbmUKKyAgICAgICAgICAgIGZvciB0LCBkLCBuc3QgaW4gc2VsZi5zdGFjazoKKyAgICAgICAgICAgICAgICBpZiBwcmVmaXggaW4gZDoKKyAgICAgICAgICAgICAgICAgICAgbnMgPSBkW3ByZWZpeF0KKyAgICAgICAgICAgIGlmIG5zIGlzIE5vbmUgYW5kIHByZWZpeCAhPSAnJzoKKyAgICAgICAgICAgICAgICBucyA9IHNlbGYuX19uYW1lc3BhY2VzLmdldChwcmVmaXgpCisgICAgICAgICAgICBpZiBucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBuc3RhZyA9IG5zICsgJyAnICsgbnN0YWcKKyAgICAgICAgICAgIGVsaWYgcHJlZml4ICE9ICcnOgorICAgICAgICAgICAgICAgIG5zdGFnID0gcHJlZml4ICsgJzonICsgbnN0YWcgIyB1bmRvIHNwbGl0CisgICAgICAgICAgICBzZWxmLnN0YWNrWy0xXSA9IHRhZ25hbWUsIG5zZGljdCwgbnN0YWcKKyAgICAgICAgIyB0cmFuc2xhdGUgbmFtZXNwYWNlIG9mIGF0dHJpYnV0ZXMKKyAgICAgICAgYXR0cm5hbWVtYXAgPSB7fSAjIG1hcCBmcm9tIG5ldyBuYW1lIHRvIG9sZCBuYW1lICh1c2VkIGZvciBlcnJvciByZXBvcnRpbmcpCisgICAgICAgIGZvciBrZXkgaW4gYXR0cmRpY3Qua2V5cygpOgorICAgICAgICAgICAgYXR0cm5hbWVtYXBba2V5XSA9IGtleQorICAgICAgICBpZiBzZWxmLl9fdXNlX25hbWVzcGFjZXM6CisgICAgICAgICAgICBuYXR0cmRpY3QgPSB7fQorICAgICAgICAgICAgZm9yIGtleSwgdmFsIGluIGF0dHJkaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgb2tleSA9IGtleQorICAgICAgICAgICAgICAgIHJlcyA9IHFuYW1lLm1hdGNoKGtleSkKKyAgICAgICAgICAgICAgICBpZiByZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGFwcmVmaXgsIGtleSA9IHJlcy5ncm91cCgncHJlZml4JywgJ2xvY2FsJykKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fX21hcF9jYXNlOgorICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5Lmxvd2VyKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgYXByZWZpeCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFucyA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0LCBkLCBuc3QgaW4gc2VsZi5zdGFjazoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhcHJlZml4IGluIGQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFucyA9IGRbYXByZWZpeF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFucyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFucyA9IHNlbGYuX19uYW1lc3BhY2VzLmdldChhcHJlZml4KQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYW5zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGFucyArICcgJyArIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBhcHJlZml4ICsgJzonICsga2V5CisgICAgICAgICAgICAgICAgbmF0dHJkaWN0W2tleV0gPSB2YWwKKyAgICAgICAgICAgICAgICBhdHRybmFtZW1hcFtrZXldID0gb2tleQorICAgICAgICAgICAgYXR0cmRpY3QgPSBuYXR0cmRpY3QKKyAgICAgICAgYXR0cmlidXRlcyA9IHNlbGYuYXR0cmlidXRlcy5nZXQobnN0YWcpCisgICAgICAgIGlmIGF0dHJpYnV0ZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3Iga2V5IGluIGF0dHJkaWN0LmtleXMoKToKKyAgICAgICAgICAgICAgICBpZiBub3Qga2V5IGluIGF0dHJpYnV0ZXM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJ1bmtub3duIGF0dHJpYnV0ZSBgJXMnIGluIHRhZyBgJXMnIiAlIChhdHRybmFtZW1hcFtrZXldLCB0YWduYW1lKSkKKyAgICAgICAgICAgIGZvciBrZXksIHZhbCBpbiBhdHRyaWJ1dGVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lIGFuZCBub3Qga2V5IGluIGF0dHJkaWN0OgorICAgICAgICAgICAgICAgICAgICBhdHRyZGljdFtrZXldID0gdmFsCisgICAgICAgIG1ldGhvZCA9IHNlbGYuZWxlbWVudHMuZ2V0KG5zdGFnLCAoTm9uZSwgTm9uZSkpWzBdCisgICAgICAgIHNlbGYuZmluaXNoX3N0YXJ0dGFnKG5zdGFnLCBhdHRyZGljdCwgbWV0aG9kKQorICAgICAgICBpZiB0YWcuZ3JvdXAoJ3NsYXNoJykgPT0gJy8nOgorICAgICAgICAgICAgc2VsZi5maW5pc2hfZW5kdGFnKHRhZ25hbWUpCisgICAgICAgIHJldHVybiB0YWcuZW5kKDApCisKKyAgICAjIEludGVybmFsIC0tIHBhcnNlIGVuZHRhZworICAgIGRlZiBwYXJzZV9lbmR0YWcoc2VsZiwgaSk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgZW5kID0gZW5kYnJhY2tldGZpbmQubWF0Y2gocmF3ZGF0YSwgaSsxKQorICAgICAgICBpZiBlbmQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICByZXMgPSB0YWdmaW5kLm1hdGNoKHJhd2RhdGEsIGkrMikKKyAgICAgICAgaWYgcmVzIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmxpdGVyYWw6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBpKzEKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9fYWNjZXB0X21pc3NpbmdfZW5kdGFnX25hbWU6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ25vIG5hbWUgc3BlY2lmaWVkIGluIGVuZCB0YWcnKQorICAgICAgICAgICAgdGFnID0gc2VsZi5zdGFja1stMV1bMF0KKyAgICAgICAgICAgIGsgPSBpKzIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRhZyA9IHJlcy5ncm91cCgwKQorICAgICAgICAgICAgaWYgc2VsZi5fX21hcF9jYXNlOgorICAgICAgICAgICAgICAgIHRhZyA9IHRhZy5sb3dlcigpCisgICAgICAgICAgICBpZiBzZWxmLmxpdGVyYWw6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuc3RhY2sgb3IgdGFnICE9IHNlbGYuc3RhY2tbLTFdWzBdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaV0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpKzEKKyAgICAgICAgICAgIGsgPSByZXMuZW5kKDApCisgICAgICAgIGlmIGVuZGJyYWNrZXQubWF0Y2gocmF3ZGF0YSwgaykgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdnYXJiYWdlIGluIGVuZCB0YWcnKQorICAgICAgICBzZWxmLmZpbmlzaF9lbmR0YWcodGFnKQorICAgICAgICByZXR1cm4gZW5kLmVuZCgwKQorCisgICAgIyBJbnRlcm5hbCAtLSBmaW5pc2ggcHJvY2Vzc2luZyBvZiBzdGFydCB0YWcKKyAgICBkZWYgZmluaXNoX3N0YXJ0dGFnKHNlbGYsIHRhZ25hbWUsIGF0dHJkaWN0LCBtZXRob2QpOgorICAgICAgICBpZiBtZXRob2QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9zdGFydHRhZyh0YWduYW1lLCBtZXRob2QsIGF0dHJkaWN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi51bmtub3duX3N0YXJ0dGFnKHRhZ25hbWUsIGF0dHJkaWN0KQorCisgICAgIyBJbnRlcm5hbCAtLSBmaW5pc2ggcHJvY2Vzc2luZyBvZiBlbmQgdGFnCisgICAgZGVmIGZpbmlzaF9lbmR0YWcoc2VsZiwgdGFnKToKKyAgICAgICAgc2VsZi5saXRlcmFsID0gMAorICAgICAgICBpZiBub3QgdGFnOgorICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ25hbWUtbGVzcyBlbmQgdGFnJykKKyAgICAgICAgICAgIGZvdW5kID0gbGVuKHNlbGYuc3RhY2spIC0gMQorICAgICAgICAgICAgaWYgZm91bmQgPCAwOgorICAgICAgICAgICAgICAgIHNlbGYudW5rbm93bl9lbmR0YWcodGFnKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm91bmQgPSAtMQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuc3RhY2spKToKKyAgICAgICAgICAgICAgICBpZiB0YWcgPT0gc2VsZi5zdGFja1tpXVswXToKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBpCisgICAgICAgICAgICBpZiBmb3VuZCA9PSAtMToKKyAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigndW5vcGVuZWQgZW5kIHRhZycpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHdoaWxlIGxlbihzZWxmLnN0YWNrKSA+IGZvdW5kOgorICAgICAgICAgICAgaWYgZm91bmQgPCBsZW4oc2VsZi5zdGFjaykgLSAxOgorICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdtaXNzaW5nIGNsb3NlIHRhZyBmb3IgJXMnICUgc2VsZi5zdGFja1stMV1bMl0pCisgICAgICAgICAgICBuc3RhZyA9IHNlbGYuc3RhY2tbLTFdWzJdCisgICAgICAgICAgICBtZXRob2QgPSBzZWxmLmVsZW1lbnRzLmdldChuc3RhZywgKE5vbmUsIE5vbmUpKVsxXQorICAgICAgICAgICAgaWYgbWV0aG9kIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2VuZHRhZyhuc3RhZywgbWV0aG9kKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnVua25vd25fZW5kdGFnKG5zdGFnKQorICAgICAgICAgICAgaWYgc2VsZi5fX3VzZV9uYW1lc3BhY2VzID09IGxlbihzZWxmLnN0YWNrKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fdXNlX25hbWVzcGFjZXMgPSAwCisgICAgICAgICAgICBkZWwgc2VsZi5zdGFja1stMV0KKworICAgICMgT3ZlcnJpZGFibGUgLS0gaGFuZGxlIHhtbCBwcm9jZXNzaW5nIGluc3RydWN0aW9uCisgICAgZGVmIGhhbmRsZV94bWwoc2VsZiwgZW5jb2RpbmcsIHN0YW5kYWxvbmUpOgorICAgICAgICBwYXNzCisKKyAgICAjIE92ZXJyaWRhYmxlIC0tIGhhbmRsZSBET0NUWVBFCisgICAgZGVmIGhhbmRsZV9kb2N0eXBlKHNlbGYsIHRhZywgcHViaWQsIHN5c2xpdCwgZGF0YSk6CisgICAgICAgIHBhc3MKKworICAgICMgT3ZlcnJpZGFibGUgLS0gaGFuZGxlIHN0YXJ0IHRhZworICAgIGRlZiBoYW5kbGVfc3RhcnR0YWcoc2VsZiwgdGFnLCBtZXRob2QsIGF0dHJzKToKKyAgICAgICAgbWV0aG9kKGF0dHJzKQorCisgICAgIyBPdmVycmlkYWJsZSAtLSBoYW5kbGUgZW5kIHRhZworICAgIGRlZiBoYW5kbGVfZW5kdGFnKHNlbGYsIHRhZywgbWV0aG9kKToKKyAgICAgICAgbWV0aG9kKCkKKworICAgICMgRXhhbXBsZSAtLSBoYW5kbGUgY2hhcmFjdGVyIHJlZmVyZW5jZSwgbm8gbmVlZCB0byBvdmVycmlkZQorICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbmFtZVswXSA9PSAneCc6CisgICAgICAgICAgICAgICAgbiA9IGludChuYW1lWzE6XSwgMTYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG4gPSBpbnQobmFtZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBzZWxmLnVua25vd25fY2hhcnJlZihuYW1lKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCAwIDw9IG4gPD0gMjU1OgorICAgICAgICAgICAgc2VsZi51bmtub3duX2NoYXJyZWYobmFtZSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKGNocihuKSkKKworICAgICMgRGVmaW5pdGlvbiBvZiBlbnRpdGllcyAtLSBkZXJpdmVkIGNsYXNzZXMgbWF5IG92ZXJyaWRlCisgICAgZW50aXR5ZGVmcyA9IHsnbHQnOiAnJiM2MDsnLCAgICAgICAgIyBtdXN0IHVzZSBjaGFycmVmCisgICAgICAgICAgICAgICAgICAnZ3QnOiAnJiM2MjsnLAorICAgICAgICAgICAgICAgICAgJ2FtcCc6ICcmIzM4OycsICAgICAgICMgbXVzdCB1c2UgY2hhcnJlZgorICAgICAgICAgICAgICAgICAgJ3F1b3QnOiAnJiMzNDsnLAorICAgICAgICAgICAgICAgICAgJ2Fwb3MnOiAnJiMzOTsnLAorICAgICAgICAgICAgICAgICAgfQorCisgICAgIyBFeGFtcGxlIC0tIGhhbmRsZSBkYXRhLCBzaG91bGQgYmUgb3ZlcnJpZGRlbgorICAgIGRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgcGFzcworCisgICAgIyBFeGFtcGxlIC0tIGhhbmRsZSBjZGF0YSwgY291bGQgYmUgb3ZlcnJpZGRlbgorICAgIGRlZiBoYW5kbGVfY2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHBhc3MKKworICAgICMgRXhhbXBsZSAtLSBoYW5kbGUgY29tbWVudCwgY291bGQgYmUgb3ZlcnJpZGRlbgorICAgIGRlZiBoYW5kbGVfY29tbWVudChzZWxmLCBkYXRhKToKKyAgICAgICAgcGFzcworCisgICAgIyBFeGFtcGxlIC0tIGhhbmRsZSBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgY291bGQgYmUgb3ZlcnJpZGRlbgorICAgIGRlZiBoYW5kbGVfcHJvYyhzZWxmLCBuYW1lLCBkYXRhKToKKyAgICAgICAgcGFzcworCisgICAgIyBFeGFtcGxlIC0tIGhhbmRsZSByZWxhdGl2ZWx5IGhhcm1sZXNzIHN5bnRheCBlcnJvcnMsIGNvdWxkIGJlIG92ZXJyaWRkZW4KKyAgICBkZWYgc3ludGF4X2Vycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICByYWlzZSBFcnJvcignU3ludGF4IGVycm9yIGF0IGxpbmUgJWQ6ICVzJyAlIChzZWxmLmxpbmVubywgbWVzc2FnZSkpCisKKyAgICAjIFRvIGJlIG92ZXJyaWRkZW4gLS0gaGFuZGxlcnMgZm9yIHVua25vd24gb2JqZWN0cworICAgIGRlZiB1bmtub3duX3N0YXJ0dGFnKHNlbGYsIHRhZywgYXR0cnMpOiBwYXNzCisgICAgZGVmIHVua25vd25fZW5kdGFnKHNlbGYsIHRhZyk6IHBhc3MKKyAgICBkZWYgdW5rbm93bl9jaGFycmVmKHNlbGYsIHJlZik6IHBhc3MKKyAgICBkZWYgdW5rbm93bl9lbnRpdHlyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJyZWZlcmVuY2UgdG8gdW5rbm93biBlbnRpdHkgYCYlczsnIiAlIG5hbWUpCisKKworY2xhc3MgVGVzdFhNTFBhcnNlcihYTUxQYXJzZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3cpOgorICAgICAgICBzZWxmLnRlc3RkYXRhID0gIiIKKyAgICAgICAgWE1MUGFyc2VyLl9faW5pdF9fKHNlbGYsICoqa3cpCisKKyAgICBkZWYgaGFuZGxlX3htbChzZWxmLCBlbmNvZGluZywgc3RhbmRhbG9uZSk6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBwcmludCAneG1sOiBlbmNvZGluZyA9JyxlbmNvZGluZywnc3RhbmRhbG9uZSA9JyxzdGFuZGFsb25lCisKKyAgICBkZWYgaGFuZGxlX2RvY3R5cGUoc2VsZiwgdGFnLCBwdWJpZCwgc3lzbGl0LCBkYXRhKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHByaW50ICdET0NUWVBFOicsdGFnLCByZXByKGRhdGEpCisKKyAgICBkZWYgaGFuZGxlX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYudGVzdGRhdGEgPSBzZWxmLnRlc3RkYXRhICsgZGF0YQorICAgICAgICBpZiBsZW4ocmVwcihzZWxmLnRlc3RkYXRhKSkgPj0gNzA6CisgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYudGVzdGRhdGEKKyAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgIHNlbGYudGVzdGRhdGEgPSAiIgorICAgICAgICAgICAgcHJpbnQgJ2RhdGE6JywgcmVwcihkYXRhKQorCisgICAgZGVmIGhhbmRsZV9jZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHByaW50ICdjZGF0YTonLCByZXByKGRhdGEpCisKKyAgICBkZWYgaGFuZGxlX3Byb2Moc2VsZiwgbmFtZSwgZGF0YSk6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBwcmludCAncHJvY2Vzc2luZzonLG5hbWUscmVwcihkYXRhKQorCisgICAgZGVmIGhhbmRsZV9jb21tZW50KHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgciA9IHJlcHIoZGF0YSkKKyAgICAgICAgaWYgbGVuKHIpID4gNjg6CisgICAgICAgICAgICByID0gcls6MzJdICsgJy4uLicgKyByWy0zMjpdCisgICAgICAgIHByaW50ICdjb21tZW50OicsIHIKKworICAgIGRlZiBzeW50YXhfZXJyb3Ioc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIHByaW50ICdlcnJvciBhdCBsaW5lICVkOicgJSBzZWxmLmxpbmVubywgbWVzc2FnZQorCisgICAgZGVmIHVua25vd25fc3RhcnR0YWcoc2VsZiwgdGFnLCBhdHRycyk6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBpZiBub3QgYXR0cnM6CisgICAgICAgICAgICBwcmludCAnc3RhcnQgdGFnOiA8JyArIHRhZyArICc+JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgJ3N0YXJ0IHRhZzogPCcgKyB0YWcsCisgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gYXR0cnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBwcmludCBuYW1lICsgJz0nICsgJyInICsgdmFsdWUgKyAnIicsCisgICAgICAgICAgICBwcmludCAnPicKKworICAgIGRlZiB1bmtub3duX2VuZHRhZyhzZWxmLCB0YWcpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgcHJpbnQgJ2VuZCB0YWc6IDwvJyArIHRhZyArICc+JworCisgICAgZGVmIHVua25vd25fZW50aXR5cmVmKHNlbGYsIHJlZik6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBwcmludCAnKioqIHVua25vd24gZW50aXR5IHJlZjogJicgKyByZWYgKyAnOycKKworICAgIGRlZiB1bmtub3duX2NoYXJyZWYoc2VsZiwgcmVmKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHByaW50ICcqKiogdW5rbm93biBjaGFyIHJlZjogJiMnICsgcmVmICsgJzsnCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIFhNTFBhcnNlci5jbG9zZShzZWxmKQorICAgICAgICBzZWxmLmZsdXNoKCkKKworZGVmIHRlc3QoYXJncyA9IE5vbmUpOgorICAgIGltcG9ydCBzeXMsIGdldG9wdAorICAgIGZyb20gdGltZSBpbXBvcnQgdGltZQorCisgICAgaWYgbm90IGFyZ3M6CisgICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKworICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3MsICdzdCcpCisgICAga2xhc3MgPSBUZXN0WE1MUGFyc2VyCisgICAgZG9fdGltZSA9IDAKKyAgICBmb3IgbywgYSBpbiBvcHRzOgorICAgICAgICBpZiBvID09ICctcyc6CisgICAgICAgICAgICBrbGFzcyA9IFhNTFBhcnNlcgorICAgICAgICBlbGlmIG8gPT0gJy10JzoKKyAgICAgICAgICAgIGRvX3RpbWUgPSAxCisKKyAgICBpZiBhcmdzOgorICAgICAgICBmaWxlID0gYXJnc1swXQorICAgIGVsc2U6CisgICAgICAgIGZpbGUgPSAndGVzdC54bWwnCisKKyAgICBpZiBmaWxlID09ICctJzoKKyAgICAgICAgZiA9IHN5cy5zdGRpbgorICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGUsICdyJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHByaW50IGZpbGUsICI6IiwgbXNnCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgZGF0YSA9IGYucmVhZCgpCisgICAgaWYgZiBpcyBub3Qgc3lzLnN0ZGluOgorICAgICAgICBmLmNsb3NlKCkKKworICAgIHggPSBrbGFzcygpCisgICAgdDAgPSB0aW1lKCkKKyAgICB0cnk6CisgICAgICAgIGlmIGRvX3RpbWU6CisgICAgICAgICAgICB4LmZlZWQoZGF0YSkKKyAgICAgICAgICAgIHguY2xvc2UoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGMgaW4gZGF0YToKKyAgICAgICAgICAgICAgICB4LmZlZWQoYykKKyAgICAgICAgICAgIHguY2xvc2UoKQorICAgIGV4Y2VwdCBFcnJvciwgbXNnOgorICAgICAgICB0MSA9IHRpbWUoKQorICAgICAgICBwcmludCBtc2cKKyAgICAgICAgaWYgZG9fdGltZToKKyAgICAgICAgICAgIHByaW50ICd0b3RhbCB0aW1lOiAlZycgJSAodDEtdDApCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgdDEgPSB0aW1lKCkKKyAgICBpZiBkb190aW1lOgorICAgICAgICBwcmludCAndG90YWwgdGltZTogJWcnICUgKHQxLXQwKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3htbGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5NzY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3htbGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5NzY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbHJwY2xpYi5weSBiL2xpYi9weXRob24yLjcveG1scnBjbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5M2VhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbHJwY2xpYi5weQpAQCAtMCwwICsxLDE2MzkgQEAKKyMKKyMgWE1MLVJQQyBDTElFTlQgTElCUkFSWQorIyAkSWQkCisjCisjIGFuIFhNTC1SUEMgY2xpZW50IGludGVyZmFjZSBmb3IgUHl0aG9uLgorIworIyB0aGUgbWFyc2hhbGxpbmcgYW5kIHJlc3BvbnNlIHBhcnNlciBjb2RlIGNhbiBhbHNvIGJlIHVzZWQgdG8KKyMgaW1wbGVtZW50IFhNTC1SUEMgc2VydmVycy4KKyMKKyMgTm90ZXM6CisjIHRoaXMgdmVyc2lvbiBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggUHl0aG9uIDIuMSBvciBuZXdlci4KKyMKKyMgSGlzdG9yeToKKyMgMTk5OS0wMS0xNCBmbCAgQ3JlYXRlZAorIyAxOTk5LTAxLTE1IGZsICBDaGFuZ2VkIGRhdGVUaW1lIHRvIHVzZSBsb2NhbHRpbWUKKyMgMTk5OS0wMS0xNiBmbCAgQWRkZWQgQmluYXJ5L2Jhc2U2NCBlbGVtZW50LCBkZWZhdWx0IHRvIFJQQzIgc2VydmljZQorIyAxOTk5LTAxLTE5IGZsICBGaXhlZCBhcnJheSBkYXRhIGVsZW1lbnQgKGZyb20gU2tpcCBNb250YW5hcm8pCisjIDE5OTktMDEtMjEgZmwgIEZpeGVkIGRhdGVUaW1lIGNvbnN0cnVjdG9yLCBldGMuCisjIDE5OTktMDItMDIgZmwgIEFkZGVkIGZhdWx0IGhhbmRsaW5nLCBoYW5kbGUgZW1wdHkgc2VxdWVuY2VzLCBldGMuCisjIDE5OTktMDItMTAgZmwgIEZpeGVkIHByb2JsZW0gd2l0aCBlbXB0eSByZXNwb25zZXMgKGZyb20gU2tpcCBNb250YW5hcm8pCisjIDE5OTktMDYtMjAgZmwgIFNwZWVkIGltcHJvdmVtZW50cywgcGx1Z2dhYmxlIHBhcnNlcnMvdHJhbnNwb3J0cyAoMC45LjgpCisjIDIwMDAtMTEtMjggZmwgIENoYW5nZWQgYm9vbGVhbiB0byBjaGVjayB0aGUgdHJ1dGggdmFsdWUgb2YgaXRzIGFyZ3VtZW50CisjIDIwMDEtMDItMjQgZmwgIEFkZGVkIGVuY29kaW5nL1VuaWNvZGUvU2FmZVRyYW5zcG9ydCBwYXRjaGVzCisjIDIwMDEtMDItMjYgZmwgIEFkZGVkIGNvbXBhcmUgc3VwcG9ydCB0byB3cmFwcGVycyAoMC45LjkvMS4wYjEpCisjIDIwMDEtMDMtMjggZmwgIE1ha2Ugc3VyZSByZXNwb25zZSB0dXBsZSBpcyBhIHNpbmdsZXRvbgorIyAyMDAxLTAzLTI5IGZsICBEb24ndCByZXF1aXJlIGVtcHR5IHBhcmFtcyBlbGVtZW50IChmcm9tIE5pY2hvbGFzIFJpbGV5KQorIyAyMDAxLTA2LTEwIGZsICBGb2xkZWQgaW4gX3htbHJwY2xpYiBhY2NlbGVyYXRvciBzdXBwb3J0ICgxLjBiMikKKyMgMjAwMS0wOC0yMCBmbCAgQmFzZSB4bWxycGNsaWIuRXJyb3Igb24gYnVpbHQtaW4gRXhjZXB0aW9uIChmcm9tIFBhdWwgUHJlc2NvZCkKKyMgMjAwMS0wOS0wMyBmbCAgQWxsb3cgVHJhbnNwb3J0IHN1YmNsYXNzIHRvIG92ZXJyaWRlIGdldHBhcnNlcgorIyAyMDAxLTA5LTEwIGZsICBMYXp5IGltcG9ydCBvZiB1cmxsaWIsIGNnaSwgeG1sbGliICgyMHggaW1wb3J0IHNwZWVkdXApCisjIDIwMDEtMTAtMDEgZmwgIFJlbW92ZSBjb250YWluZXJzIGZyb20gbWVtbyBjYWNoZSB3aGVuIGRvbmUgd2l0aCB0aGVtCisjIDIwMDEtMTAtMDEgZmwgIFVzZSBmYXN0ZXIgZXNjYXBlIG1ldGhvZCAoODAlIGR1bXBzIHNwZWVkdXApCisjIDIwMDEtMTAtMDIgZmwgIE1vcmUgZHVtcHMgbWljcm90dW5pbmcKKyMgMjAwMS0xMC0wNCBmbCAgTWFrZSBzdXJlIGltcG9ydCBleHBhdCBnZXRzIGEgcGFyc2VyIChmcm9tIEd1aWRvIHZhbiBSb3NzdW0pCisjIDIwMDEtMTAtMTAgc20gIEFsbG93IGxvbmcgaW50cyB0byBiZSBwYXNzZWQgYXMgaW50cyBpZiB0aGV5IGRvbid0IG92ZXJmbG93CisjIDIwMDEtMTAtMTcgc20gIFRlc3QgZm9yIGludCBhbmQgbG9uZyBvdmVyZmxvdyAoYWxsb3dzIHVzZSBvbiA2NC1iaXQgc3lzdGVtcykKKyMgMjAwMS0xMS0xMiBmbCAgVXNlIHJlcHIoKSB0byBtYXJzaGFsIGRvdWJsZXMgKGZyb20gUGF1bCBGZWxpeCkKKyMgMjAwMi0wMy0xNyBmbCAgQXZvaWQgYnVmZmVyZWQgcmVhZCB3aGVuIHBvc3NpYmxlIChmcm9tIEphbWVzIFJ1Y2tlcikKKyMgMjAwMi0wNC0wNyBmbCAgQWRkZWQgcHl0aG9uZG9jIGNvbW1lbnRzCisjIDIwMDItMDQtMTYgZmwgIEFkZGVkIF9fc3RyX18gbWV0aG9kcyB0byBkYXRldGltZS9iaW5hcnkgd3JhcHBlcnMKKyMgMjAwMi0wNS0xNSBmbCAgQWRkZWQgZXJyb3IgY29uc3RhbnRzIChmcm9tIEFuZHJldyBLdWNobGluZykKKyMgMjAwMi0wNi0yNyBmbCAgTWVyZ2VkIHdpdGggUHl0aG9uIENWUyB2ZXJzaW9uCisjIDIwMDItMTAtMjIgZmwgIEFkZGVkIGJhc2ljIGF1dGhlbnRpY2F0aW9uIChiYXNlZCBvbiBjb2RlIGZyb20gUGhpbGxpcCBFYnkpCisjIDIwMDMtMDEtMjIgc20gIEFkZCBzdXBwb3J0IGZvciB0aGUgYm9vbCB0eXBlCisjIDIwMDMtMDItMjcgZ3ZyIFJlbW92ZSBhcHBseSBjYWxscworIyAyMDAzLTA0LTI0IHNtICBVc2UgY1N0cmluZ0lPIGlmIGF2YWlsYWJsZQorIyAyMDAzLTA0LTI1IGFrICBBZGQgc3VwcG9ydCBmb3IgbmlsCisjIDIwMDMtMDYtMTUgZ24gIEFkZCBzdXBwb3J0IGZvciB0aW1lLnN0cnVjdF90aW1lCisjIDIwMDMtMDctMTIgZ3AgIENvcnJlY3QgbWFyc2hhbGxpbmcgb2YgRmF1bHRzCisjIDIwMDMtMTAtMzEgbXZsIEFkZCBtdWx0aWNhbGwgc3VwcG9ydAorIyAyMDA0LTA4LTIwIG12bCBCdW1wIG1pbmltdW0gc3VwcG9ydGVkIFB5dGhvbiB2ZXJzaW9uIHRvIDIuMQorIworIyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMiBieSBTZWNyZXQgTGFicyBBQi4KKyMgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDIgYnkgRnJlZHJpayBMdW5kaC4KKyMKKyMgaW5mb0BweXRob253YXJlLmNvbQorIyBodHRwOi8vd3d3LnB5dGhvbndhcmUuY29tCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBYTUwtUlBDIGNsaWVudCBpbnRlcmZhY2UgaXMKKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDIgYnkgU2VjcmV0IExhYnMgQUIKKyMgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDIgYnkgRnJlZHJpayBMdW5kaAorIworIyBCeSBvYnRhaW5pbmcsIHVzaW5nLCBhbmQvb3IgY29weWluZyB0aGlzIHNvZnR3YXJlIGFuZC9vciBpdHMKKyMgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uLCB5b3UgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLAorIyBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zOgorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorIyBpdHMgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMKKyMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbgorIyBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uCisjIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZgorIyBTZWNyZXQgTGFicyBBQiBvciB0aGUgYXV0aG9yIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eQorIyBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbgorIyBwcmlvciBwZXJtaXNzaW9uLgorIworIyBTRUNSRVQgTEFCUyBBQiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQKKyMgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlQtCisjIEFCSUxJVFkgQU5EIEZJVE5FU1MuICBJTiBOTyBFVkVOVCBTSEFMTCBTRUNSRVQgTEFCUyBBQiBPUiBUSEUgQVVUSE9SCisjIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkKKyMgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisjIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCisjIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyMgT0YgVEhJUyBTT0ZUV0FSRS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIworIyB0aGluZ3MgdG8gbG9vayBpbnRvIHNvbWUgZGF5OgorCisjIFRPRE86IHNvcnQgb3V0IFRydWUvRmFsc2UvYm9vbGVhbiBpc3N1ZXMgZm9yIFB5dGhvbiAyLjMKKworIiIiCitBbiBYTUwtUlBDIGNsaWVudCBpbnRlcmZhY2UgZm9yIFB5dGhvbi4KKworVGhlIG1hcnNoYWxsaW5nIGFuZCByZXNwb25zZSBwYXJzZXIgY29kZSBjYW4gYWxzbyBiZSB1c2VkIHRvCitpbXBsZW1lbnQgWE1MLVJQQyBzZXJ2ZXJzLgorCitFeHBvcnRlZCBleGNlcHRpb25zOgorCisgIEVycm9yICAgICAgICAgIEJhc2UgY2xhc3MgZm9yIGNsaWVudCBlcnJvcnMKKyAgUHJvdG9jb2xFcnJvciAgSW5kaWNhdGVzIGFuIEhUVFAgcHJvdG9jb2wgZXJyb3IKKyAgUmVzcG9uc2VFcnJvciAgSW5kaWNhdGVzIGEgYnJva2VuIHJlc3BvbnNlIHBhY2thZ2UKKyAgRmF1bHQgICAgICAgICAgSW5kaWNhdGVzIGFuIFhNTC1SUEMgZmF1bHQgcGFja2FnZQorCitFeHBvcnRlZCBjbGFzc2VzOgorCisgIFNlcnZlclByb3h5ICAgIFJlcHJlc2VudHMgYSBsb2dpY2FsIGNvbm5lY3Rpb24gdG8gYW4gWE1MLVJQQyBzZXJ2ZXIKKworICBNdWx0aUNhbGwgICAgICBFeGVjdXRvciBvZiBib3hjYXJlZCB4bWxycGMgcmVxdWVzdHMKKyAgQm9vbGVhbiAgICAgICAgYm9vbGVhbiB3cmFwcGVyIHRvIGdlbmVyYXRlIGEgImJvb2xlYW4iIFhNTC1SUEMgdmFsdWUKKyAgRGF0ZVRpbWUgICAgICAgZGF0ZVRpbWUgd3JhcHBlciBmb3IgYW4gSVNPIDg2MDEgc3RyaW5nIG9yIHRpbWUgdHVwbGUgb3IKKyAgICAgICAgICAgICAgICAgbG9jYWx0aW1lIGludGVnZXIgdmFsdWUgdG8gZ2VuZXJhdGUgYSAiZGF0ZVRpbWUuaXNvODYwMSIKKyAgICAgICAgICAgICAgICAgWE1MLVJQQyB2YWx1ZQorICBCaW5hcnkgICAgICAgICBiaW5hcnkgZGF0YSB3cmFwcGVyCisKKyAgU2xvd1BhcnNlciAgICAgU2xvdyBidXQgc2FmZSBzdGFuZGFyZCBwYXJzZXIgKGJhc2VkIG9uIHhtbGxpYikKKyAgTWFyc2hhbGxlciAgICAgR2VuZXJhdGUgYW4gWE1MLVJQQyBwYXJhbXMgY2h1bmsgZnJvbSBhIFB5dGhvbiBkYXRhIHN0cnVjdHVyZQorICBVbm1hcnNoYWxsZXIgICBVbm1hcnNoYWwgYW4gWE1MLVJQQyByZXNwb25zZSBmcm9tIGluY29taW5nIFhNTCBldmVudCBtZXNzYWdlCisgIFRyYW5zcG9ydCAgICAgIEhhbmRsZXMgYW4gSFRUUCB0cmFuc2FjdGlvbiB0byBhbiBYTUwtUlBDIHNlcnZlcgorICBTYWZlVHJhbnNwb3J0ICBIYW5kbGVzIGFuIEhUVFBTIHRyYW5zYWN0aW9uIHRvIGFuIFhNTC1SUEMgc2VydmVyCisKK0V4cG9ydGVkIGNvbnN0YW50czoKKworICBUcnVlCisgIEZhbHNlCisKK0V4cG9ydGVkIGZ1bmN0aW9uczoKKworICBib29sZWFuICAgICAgICBDb252ZXJ0IGFueSBQeXRob24gdmFsdWUgdG8gYW4gWE1MLVJQQyBib29sZWFuCisgIGdldHBhcnNlciAgICAgIENyZWF0ZSBpbnN0YW5jZSBvZiB0aGUgZmFzdGVzdCBhdmFpbGFibGUgcGFyc2VyICYgYXR0YWNoCisgICAgICAgICAgICAgICAgIHRvIGFuIHVubWFyc2hhbGxpbmcgb2JqZWN0CisgIGR1bXBzICAgICAgICAgIENvbnZlcnQgYW4gYXJndW1lbnQgdHVwbGUgb3IgYSBGYXVsdCBpbnN0YW5jZSB0byBhbiBYTUwtUlBDCisgICAgICAgICAgICAgICAgIHJlcXVlc3QgKG9yIHJlc3BvbnNlLCBpZiB0aGUgbWV0aG9kcmVzcG9uc2Ugb3B0aW9uIGlzIHVzZWQpLgorICBsb2FkcyAgICAgICAgICBDb252ZXJ0IGFuIFhNTC1SUEMgcGFja2V0IHRvIHVubWFyc2hhbGxlZCBkYXRhIHBsdXMgYSBtZXRob2QKKyAgICAgICAgICAgICAgICAgbmFtZSAoTm9uZSBpZiBub3QgcHJlc2VudCkuCisiIiIKKworaW1wb3J0IHJlLCBzdHJpbmcsIHRpbWUsIG9wZXJhdG9yCisKK2Zyb20gdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBlcnJubworaW1wb3J0IGh0dHBsaWIKK3RyeToKKyAgICBpbXBvcnQgZ3ppcAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGd6aXAgPSBOb25lICNweXRob24gY2FuIGJlIGJ1aWx0IHdpdGhvdXQgemxpYi9nemlwIHN1cHBvcnQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBJbnRlcm5hbCBzdHVmZgorCit0cnk6CisgICAgdW5pY29kZQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICB1bmljb2RlID0gTm9uZSAjIHVuaWNvZGUgc3VwcG9ydCBub3QgYXZhaWxhYmxlCisKK3RyeToKKyAgICBpbXBvcnQgZGF0ZXRpbWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBkYXRldGltZSA9IE5vbmUKKwordHJ5OgorICAgIF9ib29sX2lzX2J1aWx0aW4gPSBGYWxzZS5fX2NsYXNzX18uX19uYW1lX18gPT0gImJvb2wiCitleGNlcHQgTmFtZUVycm9yOgorICAgIF9ib29sX2lzX2J1aWx0aW4gPSAwCisKK2RlZiBfZGVjb2RlKGRhdGEsIGVuY29kaW5nLCBpczhiaXQ9cmUuY29tcGlsZSgiW1x4ODAtXHhmZl0iKS5zZWFyY2gpOgorICAgICMgZGVjb2RlIG5vbi1hc2NpaSBzdHJpbmcgKGlmIHBvc3NpYmxlKQorICAgIGlmIHVuaWNvZGUgYW5kIGVuY29kaW5nIGFuZCBpczhiaXQoZGF0YSk6CisgICAgICAgIGRhdGEgPSB1bmljb2RlKGRhdGEsIGVuY29kaW5nKQorICAgIHJldHVybiBkYXRhCisKK2RlZiBlc2NhcGUocywgcmVwbGFjZT1zdHJpbmcucmVwbGFjZSk6CisgICAgcyA9IHJlcGxhY2UocywgIiYiLCAiJmFtcDsiKQorICAgIHMgPSByZXBsYWNlKHMsICI8IiwgIiZsdDsiKQorICAgIHJldHVybiByZXBsYWNlKHMsICI+IiwgIiZndDsiLCkKKworaWYgdW5pY29kZToKKyAgICBkZWYgX3N0cmluZ2lmeShzdHJpbmcpOgorICAgICAgICAjIGNvbnZlcnQgdG8gNy1iaXQgYXNjaWkgaWYgcG9zc2libGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcKK2Vsc2U6CisgICAgZGVmIF9zdHJpbmdpZnkoc3RyaW5nKToKKyAgICAgICAgcmV0dXJuIHN0cmluZworCitfX3ZlcnNpb25fXyA9ICIxLjAuMSIKKworIyB4bWxycGMgaW50ZWdlciBsaW1pdHMKK01BWElOVCA9ICAyTCoqMzEtMQorTUlOSU5UID0gLTJMKiozMQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEVycm9yIGNvbnN0YW50cyAoZnJvbSBEYW4gTGliYnkncyBzcGVjaWZpY2F0aW9uIGF0CisjIGh0dHA6Ly94bWxycGMtZXBpLnNvdXJjZWZvcmdlLm5ldC9zcGVjcy9yZmMuZmF1bHRfY29kZXMucGhwKQorCisjIFJhbmdlcyBvZiBlcnJvcnMKK1BBUlNFX0VSUk9SICAgICAgID0gLTMyNzAwCitTRVJWRVJfRVJST1IgICAgICA9IC0zMjYwMAorQVBQTElDQVRJT05fRVJST1IgPSAtMzI1MDAKK1NZU1RFTV9FUlJPUiAgICAgID0gLTMyNDAwCitUUkFOU1BPUlRfRVJST1IgICA9IC0zMjMwMAorCisjIFNwZWNpZmljIGVycm9ycworTk9UX1dFTExGT1JNRURfRVJST1IgID0gLTMyNzAwCitVTlNVUFBPUlRFRF9FTkNPRElORyAgPSAtMzI3MDEKK0lOVkFMSURfRU5DT0RJTkdfQ0hBUiA9IC0zMjcwMgorSU5WQUxJRF9YTUxSUEMgICAgICAgID0gLTMyNjAwCitNRVRIT0RfTk9UX0ZPVU5EICAgICAgPSAtMzI2MDEKK0lOVkFMSURfTUVUSE9EX1BBUkFNUyA9IC0zMjYwMgorSU5URVJOQUxfRVJST1IgICAgICAgID0gLTMyNjAzCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhjZXB0aW9ucworCisjIworIyBCYXNlIGNsYXNzIGZvciBhbGwga2luZHMgb2YgY2xpZW50LXNpZGUgZXJyb3JzLgorCitjbGFzcyBFcnJvcihFeGNlcHRpb24pOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGNsaWVudCBlcnJvcnMuIiIiCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiByZXByKHNlbGYpCisKKyMjCisjIEluZGljYXRlcyBhbiBIVFRQLWxldmVsIHByb3RvY29sIGVycm9yLiAgVGhpcyBpcyByYWlzZWQgYnkgdGhlIEhUVFAKKyMgdHJhbnNwb3J0IGxheWVyLCBpZiB0aGUgc2VydmVyIHJldHVybnMgYW4gZXJyb3IgY29kZSBvdGhlciB0aGFuIDIwMAorIyAoT0spLgorIworIyBAcGFyYW0gdXJsIFRoZSB0YXJnZXQgVVJMLgorIyBAcGFyYW0gZXJyY29kZSBUaGUgSFRUUCBlcnJvciBjb2RlLgorIyBAcGFyYW0gZXJybXNnIFRoZSBIVFRQIGVycm9yIG1lc3NhZ2UuCisjIEBwYXJhbSBoZWFkZXJzIFRoZSBIVFRQIGhlYWRlciBkaWN0aW9uYXJ5LgorCitjbGFzcyBQcm90b2NvbEVycm9yKEVycm9yKToKKyAgICAiIiJJbmRpY2F0ZXMgYW4gSFRUUCBwcm90b2NvbCBlcnJvci4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMpOgorICAgICAgICBFcnJvci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnVybCA9IHVybAorICAgICAgICBzZWxmLmVycmNvZGUgPSBlcnJjb2RlCisgICAgICAgIHNlbGYuZXJybXNnID0gZXJybXNnCisgICAgICAgIHNlbGYuaGVhZGVycyA9IGhlYWRlcnMKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAiPFByb3RvY29sRXJyb3IgZm9yICVzOiAlcyAlcz4iICUKKyAgICAgICAgICAgIChzZWxmLnVybCwgc2VsZi5lcnJjb2RlLCBzZWxmLmVycm1zZykKKyAgICAgICAgICAgICkKKworIyMKKyMgSW5kaWNhdGVzIGEgYnJva2VuIFhNTC1SUEMgcmVzcG9uc2UgcGFja2FnZS4gIFRoaXMgZXhjZXB0aW9uIGlzCisjIHJhaXNlZCBieSB0aGUgdW5tYXJzaGFsbGluZyBsYXllciwgaWYgdGhlIFhNTC1SUEMgcmVzcG9uc2UgaXMKKyMgbWFsZm9ybWVkLgorCitjbGFzcyBSZXNwb25zZUVycm9yKEVycm9yKToKKyAgICAiIiJJbmRpY2F0ZXMgYSBicm9rZW4gcmVzcG9uc2UgcGFja2FnZS4iIiIKKyAgICBwYXNzCisKKyMjCisjIEluZGljYXRlcyBhbiBYTUwtUlBDIGZhdWx0IHJlc3BvbnNlIHBhY2thZ2UuICBUaGlzIGV4Y2VwdGlvbiBpcworIyByYWlzZWQgYnkgdGhlIHVubWFyc2hhbGxpbmcgbGF5ZXIsIGlmIHRoZSBYTUwtUlBDIHJlc3BvbnNlIGNvbnRhaW5zCisjIGEgZmF1bHQgc3RyaW5nLiAgVGhpcyBleGNlcHRpb24gY2FuIGFsc28gdXNlZCBhcyBhIGNsYXNzLCB0bworIyBnZW5lcmF0ZSBhIGZhdWx0IFhNTC1SUEMgbWVzc2FnZS4KKyMKKyMgQHBhcmFtIGZhdWx0Q29kZSBUaGUgWE1MLVJQQyBmYXVsdCBjb2RlLgorIyBAcGFyYW0gZmF1bHRTdHJpbmcgVGhlIFhNTC1SUEMgZmF1bHQgc3RyaW5nLgorCitjbGFzcyBGYXVsdChFcnJvcik6CisgICAgIiIiSW5kaWNhdGVzIGFuIFhNTC1SUEMgZmF1bHQgcGFja2FnZS4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmF1bHRDb2RlLCBmYXVsdFN0cmluZywgKipleHRyYSk6CisgICAgICAgIEVycm9yLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuZmF1bHRDb2RlID0gZmF1bHRDb2RlCisgICAgICAgIHNlbGYuZmF1bHRTdHJpbmcgPSBmYXVsdFN0cmluZworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICI8RmF1bHQgJXM6ICVzPiIgJQorICAgICAgICAgICAgKHNlbGYuZmF1bHRDb2RlLCByZXByKHNlbGYuZmF1bHRTdHJpbmcpKQorICAgICAgICAgICAgKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNwZWNpYWwgdmFsdWVzCisKKyMjCisjIFdyYXBwZXIgZm9yIFhNTC1SUEMgYm9vbGVhbiB2YWx1ZXMuICBVc2UgdGhlIHhtbHJwY2xpYi5UcnVlIGFuZAorIyB4bWxycGNsaWIuRmFsc2UgY29uc3RhbnRzLCBvciB0aGUgeG1scnBjbGliLmJvb2xlYW4oKSBmdW5jdGlvbiwgdG8KKyMgZ2VuZXJhdGUgYm9vbGVhbiBYTUwtUlBDIHZhbHVlcy4KKyMKKyMgQHBhcmFtIHZhbHVlIEEgYm9vbGVhbiB2YWx1ZS4gIEFueSB0cnVlIHZhbHVlIGlzIGludGVycHJldGVkIGFzIFRydWUsCisjICAgICAgICAgICAgICBhbGwgb3RoZXIgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBGYWxzZS4KKworZnJvbSBzeXMgaW1wb3J0IG1vZHVsZXMKK21vZF9kaWN0ID0gbW9kdWxlc1tfX25hbWVfX10uX19kaWN0X18KK2lmIF9ib29sX2lzX2J1aWx0aW46CisgICAgYm9vbGVhbiA9IEJvb2xlYW4gPSBib29sCisgICAgIyB0byBhdm9pZCBicmVha2luZyBjb2RlIHdoaWNoIHJlZmVyZW5jZXMgeG1scnBjbGliLntUcnVlLEZhbHNlfQorICAgIG1vZF9kaWN0WydUcnVlJ10gPSBUcnVlCisgICAgbW9kX2RpY3RbJ0ZhbHNlJ10gPSBGYWxzZQorZWxzZToKKyAgICBjbGFzcyBCb29sZWFuOgorICAgICAgICAiIiJCb29sZWFuLXZhbHVlIHdyYXBwZXIuCisKKyAgICAgICAgVXNlIFRydWUgb3IgRmFsc2UgdG8gZ2VuZXJhdGUgYSAiYm9vbGVhbiIgWE1MLVJQQyB2YWx1ZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlID0gMCk6CisgICAgICAgICAgICBzZWxmLnZhbHVlID0gb3BlcmF0b3IudHJ1dGgodmFsdWUpCisKKyAgICAgICAgZGVmIGVuY29kZShzZWxmLCBvdXQpOgorICAgICAgICAgICAgb3V0LndyaXRlKCI8dmFsdWU+PGJvb2xlYW4+JWQ8L2Jvb2xlYW4+PC92YWx1ZT5cbiIgJSBzZWxmLnZhbHVlKQorCisgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIEJvb2xlYW4pOgorICAgICAgICAgICAgICAgIG90aGVyID0gb3RoZXIudmFsdWUKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi52YWx1ZSwgb3RoZXIpCisKKyAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi52YWx1ZToKKyAgICAgICAgICAgICAgICByZXR1cm4gIjxCb29sZWFuIFRydWUgYXQgJXg+IiAlIGlkKHNlbGYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAiPEJvb2xlYW4gRmFsc2UgYXQgJXg+IiAlIGlkKHNlbGYpCisKKyAgICAgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQorCisgICAgICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCisKKyAgICBtb2RfZGljdFsnVHJ1ZSddID0gQm9vbGVhbigxKQorICAgIG1vZF9kaWN0WydGYWxzZSddID0gQm9vbGVhbigwKQorCisgICAgIyMKKyAgICAjIE1hcCB0cnVlIG9yIGZhbHNlIHZhbHVlIHRvIFhNTC1SUEMgYm9vbGVhbiB2YWx1ZXMuCisgICAgIworICAgICMgQGRlZiBib29sZWFuKHZhbHVlKQorICAgICMgQHBhcmFtIHZhbHVlIEEgYm9vbGVhbiB2YWx1ZS4gIEFueSB0cnVlIHZhbHVlIGlzIG1hcHBlZCB0byBUcnVlLAorICAgICMgICAgICAgICAgICAgIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byBGYWxzZS4KKyAgICAjIEByZXR1cm4geG1scnBjbGliLlRydWUgb3IgeG1scnBjbGliLkZhbHNlLgorICAgICMgQHNlZSBCb29sZWFuCisgICAgIyBAc2VlIFRydWUKKyAgICAjIEBzZWUgRmFsc2UKKworICAgIGRlZiBib29sZWFuKHZhbHVlLCBfdHJ1ZWZhbHNlPShGYWxzZSwgVHJ1ZSkpOgorICAgICAgICAiIiJDb252ZXJ0IGFueSBQeXRob24gdmFsdWUgdG8gWE1MLVJQQyAnYm9vbGVhbicuIiIiCisgICAgICAgIHJldHVybiBfdHJ1ZWZhbHNlW29wZXJhdG9yLnRydXRoKHZhbHVlKV0KKworZGVsIG1vZHVsZXMsIG1vZF9kaWN0CisKKyMjCisjIFdyYXBwZXIgZm9yIFhNTC1SUEMgRGF0ZVRpbWUgdmFsdWVzLiAgVGhpcyBjb252ZXJ0cyBhIHRpbWUgdmFsdWUgdG8KKyMgdGhlIGZvcm1hdCB1c2VkIGJ5IFhNTC1SUEMuCisjIDxwPgorIyBUaGUgdmFsdWUgY2FuIGJlIGdpdmVuIGFzIGEgc3RyaW5nIGluIHRoZSBmb3JtYXQKKyMgInl5eXltbWRkVGhoOm1tOnNzIiwgYXMgYSA5LWl0ZW0gdGltZSB0dXBsZSAoYXMgcmV0dXJuZWQgYnkKKyMgdGltZS5sb2NhbHRpbWUoKSksIG9yIGFuIGludGVnZXIgdmFsdWUgKGFzIHJldHVybmVkIGJ5IHRpbWUudGltZSgpKS4KKyMgVGhlIHdyYXBwZXIgdXNlcyB0aW1lLmxvY2FsdGltZSgpIHRvIGNvbnZlcnQgYW4gaW50ZWdlciB0byBhIHRpbWUKKyMgdHVwbGUuCisjCisjIEBwYXJhbSB2YWx1ZSBUaGUgdGltZSwgZ2l2ZW4gYXMgYW4gSVNPIDg2MDEgc3RyaW5nLCBhIHRpbWUKKyMgICAgICAgICAgICAgIHR1cGxlLCBvciBhIGludGVnZXIgdGltZSB2YWx1ZS4KKworZGVmIF9zdHJmdGltZSh2YWx1ZSk6CisgICAgaWYgZGF0ZXRpbWU6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGRhdGV0aW1lLmRhdGV0aW1lKToKKyAgICAgICAgICAgIHJldHVybiAiJTA0ZCUwMmQlMDJkVCUwMmQ6JTAyZDolMDJkIiAlICgKKyAgICAgICAgICAgICAgICB2YWx1ZS55ZWFyLCB2YWx1ZS5tb250aCwgdmFsdWUuZGF5LAorICAgICAgICAgICAgICAgIHZhbHVlLmhvdXIsIHZhbHVlLm1pbnV0ZSwgdmFsdWUuc2Vjb25kKQorCisgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIChUdXBsZVR5cGUsIHRpbWUuc3RydWN0X3RpbWUpKToKKyAgICAgICAgaWYgdmFsdWUgPT0gMDoKKyAgICAgICAgICAgIHZhbHVlID0gdGltZS50aW1lKCkKKyAgICAgICAgdmFsdWUgPSB0aW1lLmxvY2FsdGltZSh2YWx1ZSkKKworICAgIHJldHVybiAiJTA0ZCUwMmQlMDJkVCUwMmQ6JTAyZDolMDJkIiAlIHZhbHVlWzo2XQorCitjbGFzcyBEYXRlVGltZToKKyAgICAiIiJEYXRlVGltZSB3cmFwcGVyIGZvciBhbiBJU08gODYwMSBzdHJpbmcgb3IgdGltZSB0dXBsZSBvcgorICAgIGxvY2FsdGltZSBpbnRlZ2VyIHZhbHVlIHRvIGdlbmVyYXRlICdkYXRlVGltZS5pc284NjAxJyBYTUwtUlBDCisgICAgdmFsdWUuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9MCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIFN0cmluZ1R5cGUpOgorICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnZhbHVlID0gX3N0cmZ0aW1lKHZhbHVlKQorCisgICAgZGVmIG1ha2VfY29tcGFyYWJsZShzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIERhdGVUaW1lKToKKyAgICAgICAgICAgIHMgPSBzZWxmLnZhbHVlCisgICAgICAgICAgICBvID0gb3RoZXIudmFsdWUKKyAgICAgICAgZWxpZiBkYXRldGltZSBhbmQgaXNpbnN0YW5jZShvdGhlciwgZGF0ZXRpbWUuZGF0ZXRpbWUpOgorICAgICAgICAgICAgcyA9IHNlbGYudmFsdWUKKyAgICAgICAgICAgIG8gPSBvdGhlci5zdHJmdGltZSgiJVklbSVkVCVIOiVNOiVTIikKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCAoc3RyLCB1bmljb2RlKSk6CisgICAgICAgICAgICBzID0gc2VsZi52YWx1ZQorICAgICAgICAgICAgbyA9IG90aGVyCisgICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgInRpbWV0dXBsZSIpOgorICAgICAgICAgICAgcyA9IHNlbGYudGltZXR1cGxlKCkKKyAgICAgICAgICAgIG8gPSBvdGhlci50aW1ldHVwbGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3R5cGUgPSAoaGFzYXR0cihvdGhlciwgIl9fY2xhc3NfXyIpCisgICAgICAgICAgICAgICAgICAgICBhbmQgb3RoZXIuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgICAgICAgICAgICAgICBvciB0eXBlKG90aGVyKSkKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuJ3QgY29tcGFyZSAlcyBhbmQgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIG90eXBlKSkKKyAgICAgICAgcmV0dXJuIHMsIG8KKworICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICBzLCBvID0gc2VsZi5tYWtlX2NvbXBhcmFibGUob3RoZXIpCisgICAgICAgIHJldHVybiBzIDwgbworCisgICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHMsIG8gPSBzZWxmLm1ha2VfY29tcGFyYWJsZShvdGhlcikKKyAgICAgICAgcmV0dXJuIHMgPD0gbworCisgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHMsIG8gPSBzZWxmLm1ha2VfY29tcGFyYWJsZShvdGhlcikKKyAgICAgICAgcmV0dXJuIHMgPiBvCisKKyAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcywgbyA9IHNlbGYubWFrZV9jb21wYXJhYmxlKG90aGVyKQorICAgICAgICByZXR1cm4gcyA+PSBvCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcywgbyA9IHNlbGYubWFrZV9jb21wYXJhYmxlKG90aGVyKQorICAgICAgICByZXR1cm4gcyA9PSBvCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcywgbyA9IHNlbGYubWFrZV9jb21wYXJhYmxlKG90aGVyKQorICAgICAgICByZXR1cm4gcyAhPSBvCisKKyAgICBkZWYgdGltZXR1cGxlKHNlbGYpOgorICAgICAgICByZXR1cm4gdGltZS5zdHJwdGltZShzZWxmLnZhbHVlLCAiJVklbSVkVCVIOiVNOiVTIikKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcywgbyA9IHNlbGYubWFrZV9jb21wYXJhYmxlKG90aGVyKQorICAgICAgICByZXR1cm4gY21wKHMsIG8pCisKKyAgICAjIworICAgICMgR2V0IGRhdGUvdGltZSB2YWx1ZS4KKyAgICAjCisgICAgIyBAcmV0dXJuIERhdGUvdGltZSB2YWx1ZSwgYXMgYW4gSVNPIDg2MDEgc3RyaW5nLgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPERhdGVUaW1lICVzIGF0ICV4PiIgJSAocmVwcihzZWxmLnZhbHVlKSwgaWQoc2VsZikpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGRhdGEpOgorICAgICAgICBkYXRhID0gc3RyKGRhdGEpCisgICAgICAgIHNlbGYudmFsdWUgPSBzdHJpbmcuc3RyaXAoZGF0YSkKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgb3V0KToKKyAgICAgICAgb3V0LndyaXRlKCI8dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+IikKKyAgICAgICAgb3V0LndyaXRlKHNlbGYudmFsdWUpCisgICAgICAgIG91dC53cml0ZSgiPC9kYXRlVGltZS5pc284NjAxPjwvdmFsdWU+XG4iKQorCitkZWYgX2RhdGV0aW1lKGRhdGEpOgorICAgICMgZGVjb2RlIHhtbCBlbGVtZW50IGNvbnRlbnRzIGludG8gYSBEYXRlVGltZSBzdHJ1Y3R1cmUuCisgICAgdmFsdWUgPSBEYXRlVGltZSgpCisgICAgdmFsdWUuZGVjb2RlKGRhdGEpCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBfZGF0ZXRpbWVfdHlwZShkYXRhKToKKyAgICB0ID0gdGltZS5zdHJwdGltZShkYXRhLCAiJVklbSVkVCVIOiVNOiVTIikKKyAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZXRpbWUoKnR1cGxlKHQpWzo2XSkKKworIyMKKyMgV3JhcHBlciBmb3IgYmluYXJ5IGRhdGEuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHRyYW5zcG9ydCBhbnkga2luZAorIyBvZiBiaW5hcnkgZGF0YSBvdmVyIFhNTC1SUEMsIHVzaW5nIEJBU0U2NCBlbmNvZGluZy4KKyMKKyMgQHBhcmFtIGRhdGEgQW4gOC1iaXQgc3RyaW5nIGNvbnRhaW5pbmcgYXJiaXRyYXJ5IGRhdGEuCisKK2ltcG9ydCBiYXNlNjQKK3RyeToKKyAgICBpbXBvcnQgY1N0cmluZ0lPIGFzIFN0cmluZ0lPCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IFN0cmluZ0lPCisKK2NsYXNzIEJpbmFyeToKKyAgICAiIiJXcmFwcGVyIGZvciBiaW5hcnkgZGF0YS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhPU5vbmUpOgorICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCisKKyAgICAjIworICAgICMgR2V0IGJ1ZmZlciBjb250ZW50cy4KKyAgICAjCisgICAgIyBAcmV0dXJuIEJ1ZmZlciBjb250ZW50cywgYXMgYW4gOC1iaXQgc3RyaW5nLgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEgb3IgIiIKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgQmluYXJ5KToKKyAgICAgICAgICAgIG90aGVyID0gb3RoZXIuZGF0YQorICAgICAgICByZXR1cm4gY21wKHNlbGYuZGF0YSwgb3RoZXIpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmRhdGEgPSBiYXNlNjQuZGVjb2Rlc3RyaW5nKGRhdGEpCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIG91dCk6CisgICAgICAgIG91dC53cml0ZSgiPHZhbHVlPjxiYXNlNjQ+XG4iKQorICAgICAgICBiYXNlNjQuZW5jb2RlKFN0cmluZ0lPLlN0cmluZ0lPKHNlbGYuZGF0YSksIG91dCkKKyAgICAgICAgb3V0LndyaXRlKCI8L2Jhc2U2ND48L3ZhbHVlPlxuIikKKworZGVmIF9iaW5hcnkoZGF0YSk6CisgICAgIyBkZWNvZGUgeG1sIGVsZW1lbnQgY29udGVudHMgaW50byBhIEJpbmFyeSBzdHJ1Y3R1cmUKKyAgICB2YWx1ZSA9IEJpbmFyeSgpCisgICAgdmFsdWUuZGVjb2RlKGRhdGEpCisgICAgcmV0dXJuIHZhbHVlCisKK1dSQVBQRVJTID0gKERhdGVUaW1lLCBCaW5hcnkpCitpZiBub3QgX2Jvb2xfaXNfYnVpbHRpbjoKKyAgICBXUkFQUEVSUyA9IFdSQVBQRVJTICsgKEJvb2xlYW4sKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFhNTCBwYXJzZXJzCisKK3RyeToKKyAgICAjIG9wdGlvbmFsIHhtbHJwY2xpYiBhY2NlbGVyYXRvcgorICAgIGltcG9ydCBfeG1scnBjbGliCisgICAgRmFzdFBhcnNlciA9IF94bWxycGNsaWIuUGFyc2VyCisgICAgRmFzdFVubWFyc2hhbGxlciA9IF94bWxycGNsaWIuVW5tYXJzaGFsbGVyCitleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBJbXBvcnRFcnJvcik6CisgICAgRmFzdFBhcnNlciA9IEZhc3RVbm1hcnNoYWxsZXIgPSBOb25lCisKK3RyeToKKyAgICBpbXBvcnQgX3htbHJwY2xpYgorICAgIEZhc3RNYXJzaGFsbGVyID0gX3htbHJwY2xpYi5NYXJzaGFsbGVyCitleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBJbXBvcnRFcnJvcik6CisgICAgRmFzdE1hcnNoYWxsZXIgPSBOb25lCisKK3RyeToKKyAgICBmcm9tIHhtbC5wYXJzZXJzIGltcG9ydCBleHBhdAorICAgIGlmIG5vdCBoYXNhdHRyKGV4cGF0LCAiUGFyc2VyQ3JlYXRlIik6CisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgRXhwYXRQYXJzZXIgPSBOb25lICMgZXhwYXQgbm90IGF2YWlsYWJsZQorZWxzZToKKyAgICBjbGFzcyBFeHBhdFBhcnNlcjoKKyAgICAgICAgIyBmYXN0IGV4cGF0IHBhcnNlciBmb3IgUHl0aG9uIDIuMCBhbmQgbGF0ZXIuCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXQpOgorICAgICAgICAgICAgc2VsZi5fcGFyc2VyID0gcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKE5vbmUsIE5vbmUpCisgICAgICAgICAgICBzZWxmLl90YXJnZXQgPSB0YXJnZXQKKyAgICAgICAgICAgIHBhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyID0gdGFyZ2V0LnN0YXJ0CisgICAgICAgICAgICBwYXJzZXIuRW5kRWxlbWVudEhhbmRsZXIgPSB0YXJnZXQuZW5kCisgICAgICAgICAgICBwYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSB0YXJnZXQuZGF0YQorICAgICAgICAgICAgZW5jb2RpbmcgPSBOb25lCisgICAgICAgICAgICBpZiBub3QgcGFyc2VyLnJldHVybnNfdW5pY29kZToKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9ICJ1dGYtOCIKKyAgICAgICAgICAgIHRhcmdldC54bWwoZW5jb2RpbmcsIE5vbmUpCisKKyAgICAgICAgZGVmIGZlZWQoc2VsZiwgZGF0YSk6CisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuUGFyc2UoZGF0YSwgMCkKKworICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuUGFyc2UoIiIsIDEpICMgZW5kIG9mIGRhdGEKKyAgICAgICAgICAgIGRlbCBzZWxmLl90YXJnZXQsIHNlbGYuX3BhcnNlciAjIGdldCByaWQgb2YgY2lyY3VsYXIgcmVmZXJlbmNlcworCitjbGFzcyBTbG93UGFyc2VyOgorICAgICIiIkRlZmF1bHQgWE1MIHBhcnNlciAoYmFzZWQgb24geG1sbGliLlhNTFBhcnNlcikuIiIiCisgICAgIyB0aGlzIGlzIHRoZSBzbG93ZXN0IHBhcnNlci4KKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZ2V0KToKKyAgICAgICAgaW1wb3J0IHhtbGxpYiAjIGxhenkgc3ViY2xhc3NpbmcgKCEpCisgICAgICAgIGlmIHhtbGxpYi5YTUxQYXJzZXIgbm90IGluIFNsb3dQYXJzZXIuX19iYXNlc19fOgorICAgICAgICAgICAgU2xvd1BhcnNlci5fX2Jhc2VzX18gPSAoeG1sbGliLlhNTFBhcnNlciwpCisgICAgICAgIHNlbGYuaGFuZGxlX3htbCA9IHRhcmdldC54bWwKKyAgICAgICAgc2VsZi51bmtub3duX3N0YXJ0dGFnID0gdGFyZ2V0LnN0YXJ0CisgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEgPSB0YXJnZXQuZGF0YQorICAgICAgICBzZWxmLmhhbmRsZV9jZGF0YSA9IHRhcmdldC5kYXRhCisgICAgICAgIHNlbGYudW5rbm93bl9lbmR0YWcgPSB0YXJnZXQuZW5kCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHhtbGxpYi5YTUxQYXJzZXIuX19pbml0X18oc2VsZiwgYWNjZXB0X3V0Zjg9MSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHhtbGxpYi5YTUxQYXJzZXIuX19pbml0X18oc2VsZikgIyBwcmUtMi4wCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgWE1MLVJQQyBtYXJzaGFsbGluZyBhbmQgdW5tYXJzaGFsbGluZyBjb2RlCisKKyMjCisjIFhNTC1SUEMgbWFyc2hhbGxlci4KKyMKKyMgQHBhcmFtIGVuY29kaW5nIERlZmF1bHQgZW5jb2RpbmcgZm9yIDgtYml0IHN0cmluZ3MuICBUaGUgZGVmYXVsdAorIyAgICAgdmFsdWUgaXMgTm9uZSAoaW50ZXJwcmV0ZWQgYXMgVVRGLTgpLgorIyBAc2VlIGR1bXBzCisKK2NsYXNzIE1hcnNoYWxsZXI6CisgICAgIiIiR2VuZXJhdGUgYW4gWE1MLVJQQyBwYXJhbXMgY2h1bmsgZnJvbSBhIFB5dGhvbiBkYXRhIHN0cnVjdHVyZS4KKworICAgIENyZWF0ZSBhIE1hcnNoYWxsZXIgaW5zdGFuY2UgZm9yIGVhY2ggc2V0IG9mIHBhcmFtZXRlcnMsIGFuZCB1c2UKKyAgICB0aGUgImR1bXBzIiBtZXRob2QgdG8gY29udmVydCB5b3VyIGRhdGEgKHJlcHJlc2VudGVkIGFzIGEgdHVwbGUpCisgICAgdG8gYW4gWE1MLVJQQyBwYXJhbXMgY2h1bmsuICBUbyB3cml0ZSBhIGZhdWx0IHJlc3BvbnNlLCBwYXNzIGEKKyAgICBGYXVsdCBpbnN0YW5jZSBpbnN0ZWFkLiAgWW91IG1heSBwcmVmZXIgdG8gdXNlIHRoZSAiZHVtcHMiIG1vZHVsZQorICAgIGZ1bmN0aW9uIGZvciB0aGlzIHB1cnBvc2UuCisgICAgIiIiCisKKyAgICAjIGJ5IHRoZSB3YXksIGlmIHlvdSBkb24ndCB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbiBpbiBoZXJlLAorICAgICMgdGhhdCdzIHBlcmZlY3RseSBvay4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbmNvZGluZz1Ob25lLCBhbGxvd19ub25lPTApOgorICAgICAgICBzZWxmLm1lbW8gPSB7fQorICAgICAgICBzZWxmLmRhdGEgPSBOb25lCisgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZworICAgICAgICBzZWxmLmFsbG93X25vbmUgPSBhbGxvd19ub25lCisKKyAgICBkaXNwYXRjaCA9IHt9CisKKyAgICBkZWYgZHVtcHMoc2VsZiwgdmFsdWVzKToKKyAgICAgICAgb3V0ID0gW10KKyAgICAgICAgd3JpdGUgPSBvdXQuYXBwZW5kCisgICAgICAgIGR1bXAgPSBzZWxmLl9fZHVtcAorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlcywgRmF1bHQpOgorICAgICAgICAgICAgIyBmYXVsdCBpbnN0YW5jZQorICAgICAgICAgICAgd3JpdGUoIjxmYXVsdD5cbiIpCisgICAgICAgICAgICBkdW1wKHsnZmF1bHRDb2RlJzogdmFsdWVzLmZhdWx0Q29kZSwKKyAgICAgICAgICAgICAgICAgICdmYXVsdFN0cmluZyc6IHZhbHVlcy5mYXVsdFN0cmluZ30sCisgICAgICAgICAgICAgICAgIHdyaXRlKQorICAgICAgICAgICAgd3JpdGUoIjwvZmF1bHQ+XG4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBwYXJhbWV0ZXIgYmxvY2sKKyAgICAgICAgICAgICMgRklYTUU6IHRoZSB4bWwtcnBjIHNwZWNpZmljYXRpb24gYWxsb3dzIHVzIHRvIGxlYXZlIG91dAorICAgICAgICAgICAgIyB0aGUgZW50aXJlIDxwYXJhbXM+IGJsb2NrIGlmIHRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgIyBob3dldmVyLCBjaGFuZ2luZyB0aGlzIG1heSBicmVhayBvbGRlciBjb2RlIChpbmNsdWRpbmcKKyAgICAgICAgICAgICMgb2xkIHZlcnNpb25zIG9mIHhtbHJwY2xpYi5weSksIHNvIHRoaXMgaXMgYmV0dGVyIGxlZnQgYXMKKyAgICAgICAgICAgICMgaXMgZm9yIG5vdy4gIFNlZSBAWE1MUlBDMyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gL0YKKyAgICAgICAgICAgIHdyaXRlKCI8cGFyYW1zPlxuIikKKyAgICAgICAgICAgIGZvciB2IGluIHZhbHVlczoKKyAgICAgICAgICAgICAgICB3cml0ZSgiPHBhcmFtPlxuIikKKyAgICAgICAgICAgICAgICBkdW1wKHYsIHdyaXRlKQorICAgICAgICAgICAgICAgIHdyaXRlKCI8L3BhcmFtPlxuIikKKyAgICAgICAgICAgIHdyaXRlKCI8L3BhcmFtcz5cbiIpCisgICAgICAgIHJlc3VsdCA9IHN0cmluZy5qb2luKG91dCwgIiIpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2R1bXAoc2VsZiwgdmFsdWUsIHdyaXRlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IHNlbGYuZGlzcGF0Y2hbdHlwZSh2YWx1ZSldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICMgY2hlY2sgaWYgdGhpcyBvYmplY3QgY2FuIGJlIG1hcnNoYWxsZWQgYXMgYSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZS5fX2RpY3RfXworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImNhbm5vdCBtYXJzaGFsICVzIG9iamVjdHMiICUgdHlwZSh2YWx1ZSkKKyAgICAgICAgICAgICMgY2hlY2sgaWYgdGhpcyBjbGFzcyBpcyBhIHN1Yi1jbGFzcyBvZiBhIGJhc2ljIHR5cGUsCisgICAgICAgICAgICAjIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cgdG8gbWFyc2hhbCB0aGVzZSB0eXBlcworICAgICAgICAgICAgIyAoZS5nLiBhIHN0cmluZyBzdWItY2xhc3MpCisgICAgICAgICAgICBmb3IgdHlwZV8gaW4gdHlwZSh2YWx1ZSkuX19tcm9fXzoKKyAgICAgICAgICAgICAgICBpZiB0eXBlXyBpbiBzZWxmLmRpc3BhdGNoLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiY2Fubm90IG1hcnNoYWwgJXMgb2JqZWN0cyIgJSB0eXBlKHZhbHVlKQorICAgICAgICAgICAgZiA9IHNlbGYuZGlzcGF0Y2hbSW5zdGFuY2VUeXBlXQorICAgICAgICBmKHNlbGYsIHZhbHVlLCB3cml0ZSkKKworICAgIGRlZiBkdW1wX25pbCAoc2VsZiwgdmFsdWUsIHdyaXRlKToKKyAgICAgICAgaWYgbm90IHNlbGYuYWxsb3dfbm9uZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImNhbm5vdCBtYXJzaGFsIE5vbmUgdW5sZXNzIGFsbG93X25vbmUgaXMgZW5hYmxlZCIKKyAgICAgICAgd3JpdGUoIjx2YWx1ZT48bmlsLz48L3ZhbHVlPiIpCisgICAgZGlzcGF0Y2hbTm9uZVR5cGVdID0gZHVtcF9uaWwKKworICAgIGRlZiBkdW1wX2ludChzZWxmLCB2YWx1ZSwgd3JpdGUpOgorICAgICAgICAjIGluIGNhc2UgaW50cyBhcmUgPiAzMiBiaXRzCisgICAgICAgIGlmIHZhbHVlID4gTUFYSU5UIG9yIHZhbHVlIDwgTUlOSU5UOgorICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvciwgImludCBleGNlZWRzIFhNTC1SUEMgbGltaXRzIgorICAgICAgICB3cml0ZSgiPHZhbHVlPjxpbnQ+IikKKyAgICAgICAgd3JpdGUoc3RyKHZhbHVlKSkKKyAgICAgICAgd3JpdGUoIjwvaW50PjwvdmFsdWU+XG4iKQorICAgIGRpc3BhdGNoW0ludFR5cGVdID0gZHVtcF9pbnQKKworICAgIGlmIF9ib29sX2lzX2J1aWx0aW46CisgICAgICAgIGRlZiBkdW1wX2Jvb2woc2VsZiwgdmFsdWUsIHdyaXRlKToKKyAgICAgICAgICAgIHdyaXRlKCI8dmFsdWU+PGJvb2xlYW4+IikKKyAgICAgICAgICAgIHdyaXRlKHZhbHVlIGFuZCAiMSIgb3IgIjAiKQorICAgICAgICAgICAgd3JpdGUoIjwvYm9vbGVhbj48L3ZhbHVlPlxuIikKKyAgICAgICAgZGlzcGF0Y2hbYm9vbF0gPSBkdW1wX2Jvb2wKKworICAgIGRlZiBkdW1wX2xvbmcoc2VsZiwgdmFsdWUsIHdyaXRlKToKKyAgICAgICAgaWYgdmFsdWUgPiBNQVhJTlQgb3IgdmFsdWUgPCBNSU5JTlQ6CisgICAgICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yLCAibG9uZyBpbnQgZXhjZWVkcyBYTUwtUlBDIGxpbWl0cyIKKyAgICAgICAgd3JpdGUoIjx2YWx1ZT48aW50PiIpCisgICAgICAgIHdyaXRlKHN0cihpbnQodmFsdWUpKSkKKyAgICAgICAgd3JpdGUoIjwvaW50PjwvdmFsdWU+XG4iKQorICAgIGRpc3BhdGNoW0xvbmdUeXBlXSA9IGR1bXBfbG9uZworCisgICAgZGVmIGR1bXBfZG91YmxlKHNlbGYsIHZhbHVlLCB3cml0ZSk6CisgICAgICAgIHdyaXRlKCI8dmFsdWU+PGRvdWJsZT4iKQorICAgICAgICB3cml0ZShyZXByKHZhbHVlKSkKKyAgICAgICAgd3JpdGUoIjwvZG91YmxlPjwvdmFsdWU+XG4iKQorICAgIGRpc3BhdGNoW0Zsb2F0VHlwZV0gPSBkdW1wX2RvdWJsZQorCisgICAgZGVmIGR1bXBfc3RyaW5nKHNlbGYsIHZhbHVlLCB3cml0ZSwgZXNjYXBlPWVzY2FwZSk6CisgICAgICAgIHdyaXRlKCI8dmFsdWU+PHN0cmluZz4iKQorICAgICAgICB3cml0ZShlc2NhcGUodmFsdWUpKQorICAgICAgICB3cml0ZSgiPC9zdHJpbmc+PC92YWx1ZT5cbiIpCisgICAgZGlzcGF0Y2hbU3RyaW5nVHlwZV0gPSBkdW1wX3N0cmluZworCisgICAgaWYgdW5pY29kZToKKyAgICAgICAgZGVmIGR1bXBfdW5pY29kZShzZWxmLCB2YWx1ZSwgd3JpdGUsIGVzY2FwZT1lc2NhcGUpOgorICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgIHdyaXRlKCI8dmFsdWU+PHN0cmluZz4iKQorICAgICAgICAgICAgd3JpdGUoZXNjYXBlKHZhbHVlKSkKKyAgICAgICAgICAgIHdyaXRlKCI8L3N0cmluZz48L3ZhbHVlPlxuIikKKyAgICAgICAgZGlzcGF0Y2hbVW5pY29kZVR5cGVdID0gZHVtcF91bmljb2RlCisKKyAgICBkZWYgZHVtcF9hcnJheShzZWxmLCB2YWx1ZSwgd3JpdGUpOgorICAgICAgICBpID0gaWQodmFsdWUpCisgICAgICAgIGlmIGkgaW4gc2VsZi5tZW1vOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiY2Fubm90IG1hcnNoYWwgcmVjdXJzaXZlIHNlcXVlbmNlcyIKKyAgICAgICAgc2VsZi5tZW1vW2ldID0gTm9uZQorICAgICAgICBkdW1wID0gc2VsZi5fX2R1bXAKKyAgICAgICAgd3JpdGUoIjx2YWx1ZT48YXJyYXk+PGRhdGE+XG4iKQorICAgICAgICBmb3IgdiBpbiB2YWx1ZToKKyAgICAgICAgICAgIGR1bXAodiwgd3JpdGUpCisgICAgICAgIHdyaXRlKCI8L2RhdGE+PC9hcnJheT48L3ZhbHVlPlxuIikKKyAgICAgICAgZGVsIHNlbGYubWVtb1tpXQorICAgIGRpc3BhdGNoW1R1cGxlVHlwZV0gPSBkdW1wX2FycmF5CisgICAgZGlzcGF0Y2hbTGlzdFR5cGVdID0gZHVtcF9hcnJheQorCisgICAgZGVmIGR1bXBfc3RydWN0KHNlbGYsIHZhbHVlLCB3cml0ZSwgZXNjYXBlPWVzY2FwZSk6CisgICAgICAgIGkgPSBpZCh2YWx1ZSkKKyAgICAgICAgaWYgaSBpbiBzZWxmLm1lbW86CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJjYW5ub3QgbWFyc2hhbCByZWN1cnNpdmUgZGljdGlvbmFyaWVzIgorICAgICAgICBzZWxmLm1lbW9baV0gPSBOb25lCisgICAgICAgIGR1bXAgPSBzZWxmLl9fZHVtcAorICAgICAgICB3cml0ZSgiPHZhbHVlPjxzdHJ1Y3Q+XG4iKQorICAgICAgICBmb3IgaywgdiBpbiB2YWx1ZS5pdGVtcygpOgorICAgICAgICAgICAgd3JpdGUoIjxtZW1iZXI+XG4iKQorICAgICAgICAgICAgaWYgdHlwZShrKSBpcyBub3QgU3RyaW5nVHlwZToKKyAgICAgICAgICAgICAgICBpZiB1bmljb2RlIGFuZCB0eXBlKGspIGlzIFVuaWNvZGVUeXBlOgorICAgICAgICAgICAgICAgICAgICBrID0gay5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJkaWN0aW9uYXJ5IGtleSBtdXN0IGJlIHN0cmluZyIKKyAgICAgICAgICAgIHdyaXRlKCI8bmFtZT4lczwvbmFtZT5cbiIgJSBlc2NhcGUoaykpCisgICAgICAgICAgICBkdW1wKHYsIHdyaXRlKQorICAgICAgICAgICAgd3JpdGUoIjwvbWVtYmVyPlxuIikKKyAgICAgICAgd3JpdGUoIjwvc3RydWN0PjwvdmFsdWU+XG4iKQorICAgICAgICBkZWwgc2VsZi5tZW1vW2ldCisgICAgZGlzcGF0Y2hbRGljdFR5cGVdID0gZHVtcF9zdHJ1Y3QKKworICAgIGlmIGRhdGV0aW1lOgorICAgICAgICBkZWYgZHVtcF9kYXRldGltZShzZWxmLCB2YWx1ZSwgd3JpdGUpOgorICAgICAgICAgICAgd3JpdGUoIjx2YWx1ZT48ZGF0ZVRpbWUuaXNvODYwMT4iKQorICAgICAgICAgICAgd3JpdGUoX3N0cmZ0aW1lKHZhbHVlKSkKKyAgICAgICAgICAgIHdyaXRlKCI8L2RhdGVUaW1lLmlzbzg2MDE+PC92YWx1ZT5cbiIpCisgICAgICAgIGRpc3BhdGNoW2RhdGV0aW1lLmRhdGV0aW1lXSA9IGR1bXBfZGF0ZXRpbWUKKworICAgIGRlZiBkdW1wX2luc3RhbmNlKHNlbGYsIHZhbHVlLCB3cml0ZSk6CisgICAgICAgICMgY2hlY2sgZm9yIHNwZWNpYWwgd3JhcHBlcnMKKyAgICAgICAgaWYgdmFsdWUuX19jbGFzc19fIGluIFdSQVBQRVJTOgorICAgICAgICAgICAgc2VsZi53cml0ZSA9IHdyaXRlCisgICAgICAgICAgICB2YWx1ZS5lbmNvZGUoc2VsZikKKyAgICAgICAgICAgIGRlbCBzZWxmLndyaXRlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHN0b3JlIGluc3RhbmNlIGF0dHJpYnV0ZXMgYXMgYSBzdHJ1Y3QgKHJlYWxseT8pCisgICAgICAgICAgICBzZWxmLmR1bXBfc3RydWN0KHZhbHVlLl9fZGljdF9fLCB3cml0ZSkKKyAgICBkaXNwYXRjaFtJbnN0YW5jZVR5cGVdID0gZHVtcF9pbnN0YW5jZQorCisjIworIyBYTUwtUlBDIHVubWFyc2hhbGxlci4KKyMKKyMgQHNlZSBsb2FkcworCitjbGFzcyBVbm1hcnNoYWxsZXI6CisgICAgIiIiVW5tYXJzaGFsIGFuIFhNTC1SUEMgcmVzcG9uc2UsIGJhc2VkIG9uIGluY29taW5nIFhNTCBldmVudAorICAgIG1lc3NhZ2VzIChzdGFydCwgZGF0YSwgZW5kKS4gIENhbGwgY2xvc2UoKSB0byBnZXQgdGhlIHJlc3VsdGluZworICAgIGRhdGEgc3RydWN0dXJlLgorCisgICAgTm90ZSB0aGF0IHRoaXMgcmVhZGVyIGlzIGZhaXJseSB0b2xlcmFudCwgYW5kIGdsYWRseSBhY2NlcHRzIGJvZ3VzCisgICAgWE1MLVJQQyBkYXRhIHdpdGhvdXQgY29tcGxhaW5pbmcgKGJ1dCBub3QgYm9ndXMgWE1MKS4KKyAgICAiIiIKKworICAgICMgYW5kIGFnYWluLCBpZiB5b3UgZG9uJ3QgdW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24gaW4gaGVyZSwKKyAgICAjIHRoYXQncyBwZXJmZWN0bHkgb2suCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXNlX2RhdGV0aW1lPTApOgorICAgICAgICBzZWxmLl90eXBlID0gTm9uZQorICAgICAgICBzZWxmLl9zdGFjayA9IFtdCisgICAgICAgIHNlbGYuX21hcmtzID0gW10KKyAgICAgICAgc2VsZi5fZGF0YSA9IFtdCisgICAgICAgIHNlbGYuX21ldGhvZG5hbWUgPSBOb25lCisgICAgICAgIHNlbGYuX2VuY29kaW5nID0gInV0Zi04IgorICAgICAgICBzZWxmLmFwcGVuZCA9IHNlbGYuX3N0YWNrLmFwcGVuZAorICAgICAgICBzZWxmLl91c2VfZGF0ZXRpbWUgPSB1c2VfZGF0ZXRpbWUKKyAgICAgICAgaWYgdXNlX2RhdGV0aW1lIGFuZCBub3QgZGF0ZXRpbWU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidGhlIGRhdGV0aW1lIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAjIHJldHVybiByZXNwb25zZSB0dXBsZSBhbmQgdGFyZ2V0IG1ldGhvZAorICAgICAgICBpZiBzZWxmLl90eXBlIGlzIE5vbmUgb3Igc2VsZi5fbWFya3M6CisgICAgICAgICAgICByYWlzZSBSZXNwb25zZUVycm9yKCkKKyAgICAgICAgaWYgc2VsZi5fdHlwZSA9PSAiZmF1bHQiOgorICAgICAgICAgICAgcmFpc2UgRmF1bHQoKipzZWxmLl9zdGFja1swXSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYuX3N0YWNrKQorCisgICAgZGVmIGdldG1ldGhvZG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9tZXRob2RuYW1lCisKKyAgICAjCisgICAgIyBldmVudCBoYW5kbGVycworCisgICAgZGVmIHhtbChzZWxmLCBlbmNvZGluZywgc3RhbmRhbG9uZSk6CisgICAgICAgIHNlbGYuX2VuY29kaW5nID0gZW5jb2RpbmcKKyAgICAgICAgIyBGSVhNRTogYXNzZXJ0IHN0YW5kYWxvbmUgPT0gMSA/Pz8KKworICAgIGRlZiBzdGFydChzZWxmLCB0YWcsIGF0dHJzKToKKyAgICAgICAgIyBwcmVwYXJlIHRvIGhhbmRsZSB0aGlzIGVsZW1lbnQKKyAgICAgICAgaWYgdGFnID09ICJhcnJheSIgb3IgdGFnID09ICJzdHJ1Y3QiOgorICAgICAgICAgICAgc2VsZi5fbWFya3MuYXBwZW5kKGxlbihzZWxmLl9zdGFjaykpCisgICAgICAgIHNlbGYuX2RhdGEgPSBbXQorICAgICAgICBzZWxmLl92YWx1ZSA9ICh0YWcgPT0gInZhbHVlIikKKworICAgIGRlZiBkYXRhKHNlbGYsIHRleHQpOgorICAgICAgICBzZWxmLl9kYXRhLmFwcGVuZCh0ZXh0KQorCisgICAgZGVmIGVuZChzZWxmLCB0YWcsIGpvaW49c3RyaW5nLmpvaW4pOgorICAgICAgICAjIGNhbGwgdGhlIGFwcHJvcHJpYXRlIGVuZCB0YWcgaGFuZGxlcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gc2VsZi5kaXNwYXRjaFt0YWddCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MgIyB1bmtub3duIHRhZyA/CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZihzZWxmLCBqb2luKHNlbGYuX2RhdGEsICIiKSkKKworICAgICMKKyAgICAjIGFjY2VsZXJhdG9yIHN1cHBvcnQKKworICAgIGRlZiBlbmRfZGlzcGF0Y2goc2VsZiwgdGFnLCBkYXRhKToKKyAgICAgICAgIyBkaXNwYXRjaCBkYXRhCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBzZWxmLmRpc3BhdGNoW3RhZ10KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcyAjIHVua25vd24gdGFnID8KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBmKHNlbGYsIGRhdGEpCisKKyAgICAjCisgICAgIyBlbGVtZW50IGRlY29kZXJzCisKKyAgICBkaXNwYXRjaCA9IHt9CisKKyAgICBkZWYgZW5kX25pbCAoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKE5vbmUpCisgICAgICAgIHNlbGYuX3ZhbHVlID0gMAorICAgIGRpc3BhdGNoWyJuaWwiXSA9IGVuZF9uaWwKKworICAgIGRlZiBlbmRfYm9vbGVhbihzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgZGF0YSA9PSAiMCI6CisgICAgICAgICAgICBzZWxmLmFwcGVuZChGYWxzZSkKKyAgICAgICAgZWxpZiBkYXRhID09ICIxIjoKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kKFRydWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJiYWQgYm9vbGVhbiB2YWx1ZSIKKyAgICAgICAgc2VsZi5fdmFsdWUgPSAwCisgICAgZGlzcGF0Y2hbImJvb2xlYW4iXSA9IGVuZF9ib29sZWFuCisKKyAgICBkZWYgZW5kX2ludChzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoaW50KGRhdGEpKQorICAgICAgICBzZWxmLl92YWx1ZSA9IDAKKyAgICBkaXNwYXRjaFsiaTQiXSA9IGVuZF9pbnQKKyAgICBkaXNwYXRjaFsiaTgiXSA9IGVuZF9pbnQKKyAgICBkaXNwYXRjaFsiaW50Il0gPSBlbmRfaW50CisKKyAgICBkZWYgZW5kX2RvdWJsZShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoZmxvYXQoZGF0YSkpCisgICAgICAgIHNlbGYuX3ZhbHVlID0gMAorICAgIGRpc3BhdGNoWyJkb3VibGUiXSA9IGVuZF9kb3VibGUKKworICAgIGRlZiBlbmRfc3RyaW5nKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBzZWxmLl9lbmNvZGluZzoKKyAgICAgICAgICAgIGRhdGEgPSBfZGVjb2RlKGRhdGEsIHNlbGYuX2VuY29kaW5nKQorICAgICAgICBzZWxmLmFwcGVuZChfc3RyaW5naWZ5KGRhdGEpKQorICAgICAgICBzZWxmLl92YWx1ZSA9IDAKKyAgICBkaXNwYXRjaFsic3RyaW5nIl0gPSBlbmRfc3RyaW5nCisgICAgZGlzcGF0Y2hbIm5hbWUiXSA9IGVuZF9zdHJpbmcgIyBzdHJ1Y3Qga2V5cyBhcmUgYWx3YXlzIHN0cmluZ3MKKworICAgIGRlZiBlbmRfYXJyYXkoc2VsZiwgZGF0YSk6CisgICAgICAgIG1hcmsgPSBzZWxmLl9tYXJrcy5wb3AoKQorICAgICAgICAjIG1hcCBhcnJheXMgdG8gUHl0aG9uIGxpc3RzCisgICAgICAgIHNlbGYuX3N0YWNrW21hcms6XSA9IFtzZWxmLl9zdGFja1ttYXJrOl1dCisgICAgICAgIHNlbGYuX3ZhbHVlID0gMAorICAgIGRpc3BhdGNoWyJhcnJheSJdID0gZW5kX2FycmF5CisKKyAgICBkZWYgZW5kX3N0cnVjdChzZWxmLCBkYXRhKToKKyAgICAgICAgbWFyayA9IHNlbGYuX21hcmtzLnBvcCgpCisgICAgICAgICMgbWFwIHN0cnVjdHMgdG8gUHl0aG9uIGRpY3Rpb25hcmllcworICAgICAgICBkaWN0ID0ge30KKyAgICAgICAgaXRlbXMgPSBzZWxmLl9zdGFja1ttYXJrOl0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGl0ZW1zKSwgMik6CisgICAgICAgICAgICBkaWN0W19zdHJpbmdpZnkoaXRlbXNbaV0pXSA9IGl0ZW1zW2krMV0KKyAgICAgICAgc2VsZi5fc3RhY2tbbWFyazpdID0gW2RpY3RdCisgICAgICAgIHNlbGYuX3ZhbHVlID0gMAorICAgIGRpc3BhdGNoWyJzdHJ1Y3QiXSA9IGVuZF9zdHJ1Y3QKKworICAgIGRlZiBlbmRfYmFzZTY0KHNlbGYsIGRhdGEpOgorICAgICAgICB2YWx1ZSA9IEJpbmFyeSgpCisgICAgICAgIHZhbHVlLmRlY29kZShkYXRhKQorICAgICAgICBzZWxmLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgc2VsZi5fdmFsdWUgPSAwCisgICAgZGlzcGF0Y2hbImJhc2U2NCJdID0gZW5kX2Jhc2U2NAorCisgICAgZGVmIGVuZF9kYXRlVGltZShzZWxmLCBkYXRhKToKKyAgICAgICAgdmFsdWUgPSBEYXRlVGltZSgpCisgICAgICAgIHZhbHVlLmRlY29kZShkYXRhKQorICAgICAgICBpZiBzZWxmLl91c2VfZGF0ZXRpbWU6CisgICAgICAgICAgICB2YWx1ZSA9IF9kYXRldGltZV90eXBlKGRhdGEpCisgICAgICAgIHNlbGYuYXBwZW5kKHZhbHVlKQorICAgIGRpc3BhdGNoWyJkYXRlVGltZS5pc284NjAxIl0gPSBlbmRfZGF0ZVRpbWUKKworICAgIGRlZiBlbmRfdmFsdWUoc2VsZiwgZGF0YSk6CisgICAgICAgICMgaWYgd2Ugc3R1bWJsZSB1cG9uIGEgdmFsdWUgZWxlbWVudCB3aXRoIG5vIGludGVybmFsCisgICAgICAgICMgZWxlbWVudHMsIHRyZWF0IGl0IGFzIGEgc3RyaW5nIGVsZW1lbnQKKyAgICAgICAgaWYgc2VsZi5fdmFsdWU6CisgICAgICAgICAgICBzZWxmLmVuZF9zdHJpbmcoZGF0YSkKKyAgICBkaXNwYXRjaFsidmFsdWUiXSA9IGVuZF92YWx1ZQorCisgICAgZGVmIGVuZF9wYXJhbXMoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX3R5cGUgPSAicGFyYW1zIgorICAgIGRpc3BhdGNoWyJwYXJhbXMiXSA9IGVuZF9wYXJhbXMKKworICAgIGRlZiBlbmRfZmF1bHQoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX3R5cGUgPSAiZmF1bHQiCisgICAgZGlzcGF0Y2hbImZhdWx0Il0gPSBlbmRfZmF1bHQKKworICAgIGRlZiBlbmRfbWV0aG9kTmFtZShzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgc2VsZi5fZW5jb2Rpbmc6CisgICAgICAgICAgICBkYXRhID0gX2RlY29kZShkYXRhLCBzZWxmLl9lbmNvZGluZykKKyAgICAgICAgc2VsZi5fbWV0aG9kbmFtZSA9IGRhdGEKKyAgICAgICAgc2VsZi5fdHlwZSA9ICJtZXRob2ROYW1lIiAjIG5vIHBhcmFtcworICAgIGRpc3BhdGNoWyJtZXRob2ROYW1lIl0gPSBlbmRfbWV0aG9kTmFtZQorCisjIyBNdWx0aWNhbGwgc3VwcG9ydAorIworCitjbGFzcyBfTXVsdGlDYWxsTWV0aG9kOgorICAgICMgc29tZSBsZXNzZXIgbWFnaWMgdG8gc3RvcmUgY2FsbHMgbWFkZSB0byBhIE11bHRpQ2FsbCBvYmplY3QKKyAgICAjIGZvciBiYXRjaCBleGVjdXRpb24KKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FsbF9saXN0LCBuYW1lKToKKyAgICAgICAgc2VsZi5fX2NhbGxfbGlzdCA9IGNhbGxfbGlzdAorICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBfTXVsdGlDYWxsTWV0aG9kKHNlbGYuX19jYWxsX2xpc3QsICIlcy4lcyIgJSAoc2VsZi5fX25hbWUsIG5hbWUpKQorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX19jYWxsX2xpc3QuYXBwZW5kKChzZWxmLl9fbmFtZSwgYXJncykpCisKK2NsYXNzIE11bHRpQ2FsbEl0ZXJhdG9yOgorICAgICIiIkl0ZXJhdGVzIG92ZXIgdGhlIHJlc3VsdHMgb2YgYSBtdWx0aWNhbGwuIEV4Y2VwdGlvbnMgYXJlCisgICAgcmFpc2VkIGluIHJlc3BvbnNlIHRvIHhtbHJwYyBmYXVsdHMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVzdWx0cyk6CisgICAgICAgIHNlbGYucmVzdWx0cyA9IHJlc3VsdHMKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgaXRlbSA9IHNlbGYucmVzdWx0c1tpXQorICAgICAgICBpZiB0eXBlKGl0ZW0pID09IHR5cGUoe30pOgorICAgICAgICAgICAgcmFpc2UgRmF1bHQoaXRlbVsnZmF1bHRDb2RlJ10sIGl0ZW1bJ2ZhdWx0U3RyaW5nJ10pCisgICAgICAgIGVsaWYgdHlwZShpdGVtKSA9PSB0eXBlKFtdKToKKyAgICAgICAgICAgIHJldHVybiBpdGVtWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLFwKKyAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIHR5cGUgaW4gbXVsdGljYWxsIHJlc3VsdCIKKworY2xhc3MgTXVsdGlDYWxsOgorICAgICIiInNlcnZlciAtPiBhIG9iamVjdCB1c2VkIHRvIGJveGNhciBtZXRob2QgY2FsbHMKKworICAgIHNlcnZlciBzaG91bGQgYmUgYSBTZXJ2ZXJQcm94eSBvYmplY3QuCisKKyAgICBNZXRob2RzIGNhbiBiZSBhZGRlZCB0byB0aGUgTXVsdGlDYWxsIHVzaW5nIG5vcm1hbAorICAgIG1ldGhvZCBjYWxsIHN5bnRheCBlLmcuOgorCisgICAgbXVsdGljYWxsID0gTXVsdGlDYWxsKHNlcnZlcl9wcm94eSkKKyAgICBtdWx0aWNhbGwuYWRkKDIsMykKKyAgICBtdWx0aWNhbGwuZ2V0X2FkZHJlc3MoIkd1aWRvIikKKworICAgIFRvIGV4ZWN1dGUgdGhlIG11bHRpY2FsbCwgY2FsbCB0aGUgTXVsdGlDYWxsIG9iamVjdCBlLmcuOgorCisgICAgYWRkX3Jlc3VsdCwgYWRkcmVzcyA9IG11bHRpY2FsbCgpCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyKToKKyAgICAgICAgc2VsZi5fX3NlcnZlciA9IHNlcnZlcgorICAgICAgICBzZWxmLl9fY2FsbF9saXN0ID0gW10KKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8TXVsdGlDYWxsIGF0ICV4PiIgJSBpZChzZWxmKQorCisgICAgX19zdHJfXyA9IF9fcmVwcl9fCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBfTXVsdGlDYWxsTWV0aG9kKHNlbGYuX19jYWxsX2xpc3QsIG5hbWUpCisKKyAgICBkZWYgX19jYWxsX18oc2VsZik6CisgICAgICAgIG1hcnNoYWxsZWRfbGlzdCA9IFtdCisgICAgICAgIGZvciBuYW1lLCBhcmdzIGluIHNlbGYuX19jYWxsX2xpc3Q6CisgICAgICAgICAgICBtYXJzaGFsbGVkX2xpc3QuYXBwZW5kKHsnbWV0aG9kTmFtZScgOiBuYW1lLCAncGFyYW1zJyA6IGFyZ3N9KQorCisgICAgICAgIHJldHVybiBNdWx0aUNhbGxJdGVyYXRvcihzZWxmLl9fc2VydmVyLnN5c3RlbS5tdWx0aWNhbGwobWFyc2hhbGxlZF9saXN0KSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb252ZW5pZW5jZSBmdW5jdGlvbnMKKworIyMKKyMgQ3JlYXRlIGEgcGFyc2VyIG9iamVjdCwgYW5kIGNvbm5lY3QgaXQgdG8gYW4gdW5tYXJzaGFsbGluZyBpbnN0YW5jZS4KKyMgVGhpcyBmdW5jdGlvbiBwaWNrcyB0aGUgZmFzdGVzdCBhdmFpbGFibGUgWE1MIHBhcnNlci4KKyMKKyMgcmV0dXJuIEEgKHBhcnNlciwgdW5tYXJzaGFsbGVyKSB0dXBsZS4KKworZGVmIGdldHBhcnNlcih1c2VfZGF0ZXRpbWU9MCk6CisgICAgIiIiZ2V0cGFyc2VyKCkgLT4gcGFyc2VyLCB1bm1hcnNoYWxsZXIKKworICAgIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZmFzdGVzdCBhdmFpbGFibGUgcGFyc2VyLCBhbmQgYXR0YWNoIGl0CisgICAgdG8gYW4gdW5tYXJzaGFsbGluZyBvYmplY3QuICBSZXR1cm4gYm90aCBvYmplY3RzLgorICAgICIiIgorICAgIGlmIHVzZV9kYXRldGltZSBhbmQgbm90IGRhdGV0aW1lOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidGhlIGRhdGV0aW1lIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIgorICAgIGlmIEZhc3RQYXJzZXIgYW5kIEZhc3RVbm1hcnNoYWxsZXI6CisgICAgICAgIGlmIHVzZV9kYXRldGltZToKKyAgICAgICAgICAgIG1rZGF0ZXRpbWUgPSBfZGF0ZXRpbWVfdHlwZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWtkYXRldGltZSA9IF9kYXRldGltZQorICAgICAgICB0YXJnZXQgPSBGYXN0VW5tYXJzaGFsbGVyKFRydWUsIEZhbHNlLCBfYmluYXJ5LCBta2RhdGV0aW1lLCBGYXVsdCkKKyAgICAgICAgcGFyc2VyID0gRmFzdFBhcnNlcih0YXJnZXQpCisgICAgZWxzZToKKyAgICAgICAgdGFyZ2V0ID0gVW5tYXJzaGFsbGVyKHVzZV9kYXRldGltZT11c2VfZGF0ZXRpbWUpCisgICAgICAgIGlmIEZhc3RQYXJzZXI6CisgICAgICAgICAgICBwYXJzZXIgPSBGYXN0UGFyc2VyKHRhcmdldCkKKyAgICAgICAgZWxpZiBFeHBhdFBhcnNlcjoKKyAgICAgICAgICAgIHBhcnNlciA9IEV4cGF0UGFyc2VyKHRhcmdldCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcnNlciA9IFNsb3dQYXJzZXIodGFyZ2V0KQorICAgIHJldHVybiBwYXJzZXIsIHRhcmdldAorCisjIworIyBDb252ZXJ0IGEgUHl0aG9uIHR1cGxlIG9yIGEgRmF1bHQgaW5zdGFuY2UgdG8gYW4gWE1MLVJQQyBwYWNrZXQuCisjCisjIEBkZWYgZHVtcHMocGFyYW1zLCAqKm9wdGlvbnMpCisjIEBwYXJhbSBwYXJhbXMgQSB0dXBsZSBvciBGYXVsdCBpbnN0YW5jZS4KKyMgQGtleXBhcmFtIG1ldGhvZG5hbWUgSWYgZ2l2ZW4sIGNyZWF0ZSBhIG1ldGhvZENhbGwgcmVxdWVzdCBmb3IKKyMgICAgIHRoaXMgbWV0aG9kIG5hbWUuCisjIEBrZXlwYXJhbSBtZXRob2RyZXNwb25zZSBJZiBnaXZlbiwgY3JlYXRlIGEgbWV0aG9kUmVzcG9uc2UgcGFja2V0LgorIyAgICAgSWYgdXNlZCB3aXRoIGEgdHVwbGUsIHRoZSB0dXBsZSBtdXN0IGJlIGEgc2luZ2xldG9uICh0aGF0IGlzLAorIyAgICAgaXQgbXVzdCBjb250YWluIGV4YWN0bHkgb25lIGVsZW1lbnQpLgorIyBAa2V5cGFyYW0gZW5jb2RpbmcgVGhlIHBhY2tldCBlbmNvZGluZy4KKyMgQHJldHVybiBBIHN0cmluZyBjb250YWluaW5nIG1hcnNoYWxsZWQgZGF0YS4KKworZGVmIGR1bXBzKHBhcmFtcywgbWV0aG9kbmFtZT1Ob25lLCBtZXRob2RyZXNwb25zZT1Ob25lLCBlbmNvZGluZz1Ob25lLAorICAgICAgICAgIGFsbG93X25vbmU9MCk6CisgICAgIiIiZGF0YSBbLG9wdGlvbnNdIC0+IG1hcnNoYWxsZWQgZGF0YQorCisgICAgQ29udmVydCBhbiBhcmd1bWVudCB0dXBsZSBvciBhIEZhdWx0IGluc3RhbmNlIHRvIGFuIFhNTC1SUEMKKyAgICByZXF1ZXN0IChvciByZXNwb25zZSwgaWYgdGhlIG1ldGhvZHJlc3BvbnNlIG9wdGlvbiBpcyB1c2VkKS4KKworICAgIEluIGFkZGl0aW9uIHRvIHRoZSBkYXRhIG9iamVjdCwgdGhlIGZvbGxvd2luZyBvcHRpb25zIGNhbiBiZSBnaXZlbgorICAgIGFzIGtleXdvcmQgYXJndW1lbnRzOgorCisgICAgICAgIG1ldGhvZG5hbWU6IHRoZSBtZXRob2QgbmFtZSBmb3IgYSBtZXRob2RDYWxsIHBhY2tldAorCisgICAgICAgIG1ldGhvZHJlc3BvbnNlOiB0cnVlIHRvIGNyZWF0ZSBhIG1ldGhvZFJlc3BvbnNlIHBhY2tldC4KKyAgICAgICAgSWYgdGhpcyBvcHRpb24gaXMgdXNlZCB3aXRoIGEgdHVwbGUsIHRoZSB0dXBsZSBtdXN0IGJlCisgICAgICAgIGEgc2luZ2xldG9uIChpLmUuIGl0IGNhbiBjb250YWluIG9ubHkgb25lIGVsZW1lbnQpLgorCisgICAgICAgIGVuY29kaW5nOiB0aGUgcGFja2V0IGVuY29kaW5nIChkZWZhdWx0IGlzIFVURi04KQorCisgICAgQWxsIDgtYml0IHN0cmluZ3MgaW4gdGhlIGRhdGEgc3RydWN0dXJlIGFyZSBhc3N1bWVkIHRvIHVzZSB0aGUKKyAgICBwYWNrZXQgZW5jb2RpbmcuICBVbmljb2RlIHN0cmluZ3MgYXJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkLAorICAgIHdoZXJlIG5lY2Vzc2FyeS4KKyAgICAiIiIKKworICAgIGFzc2VydCBpc2luc3RhbmNlKHBhcmFtcywgVHVwbGVUeXBlKSBvciBpc2luc3RhbmNlKHBhcmFtcywgRmF1bHQpLFwKKyAgICAgICAgICAgImFyZ3VtZW50IG11c3QgYmUgdHVwbGUgb3IgRmF1bHQgaW5zdGFuY2UiCisKKyAgICBpZiBpc2luc3RhbmNlKHBhcmFtcywgRmF1bHQpOgorICAgICAgICBtZXRob2RyZXNwb25zZSA9IDEKKyAgICBlbGlmIG1ldGhvZHJlc3BvbnNlIGFuZCBpc2luc3RhbmNlKHBhcmFtcywgVHVwbGVUeXBlKToKKyAgICAgICAgYXNzZXJ0IGxlbihwYXJhbXMpID09IDEsICJyZXNwb25zZSB0dXBsZSBtdXN0IGJlIGEgc2luZ2xldG9uIgorCisgICAgaWYgbm90IGVuY29kaW5nOgorICAgICAgICBlbmNvZGluZyA9ICJ1dGYtOCIKKworICAgIGlmIEZhc3RNYXJzaGFsbGVyOgorICAgICAgICBtID0gRmFzdE1hcnNoYWxsZXIoZW5jb2RpbmcpCisgICAgZWxzZToKKyAgICAgICAgbSA9IE1hcnNoYWxsZXIoZW5jb2RpbmcsIGFsbG93X25vbmUpCisKKyAgICBkYXRhID0gbS5kdW1wcyhwYXJhbXMpCisKKyAgICBpZiBlbmNvZGluZyAhPSAidXRmLTgiOgorICAgICAgICB4bWxoZWFkZXIgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nJXMnPz5cbiIgJSBzdHIoZW5jb2RpbmcpCisgICAgZWxzZToKKyAgICAgICAgeG1saGVhZGVyID0gIjw/eG1sIHZlcnNpb249JzEuMCc/PlxuIiAjIHV0Zi04IGlzIGRlZmF1bHQKKworICAgICMgc3RhbmRhcmQgWE1MLVJQQyB3cmFwcGluZ3MKKyAgICBpZiBtZXRob2RuYW1lOgorICAgICAgICAjIGEgbWV0aG9kIGNhbGwKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobWV0aG9kbmFtZSwgU3RyaW5nVHlwZSk6CisgICAgICAgICAgICBtZXRob2RuYW1lID0gbWV0aG9kbmFtZS5lbmNvZGUoZW5jb2RpbmcpCisgICAgICAgIGRhdGEgPSAoCisgICAgICAgICAgICB4bWxoZWFkZXIsCisgICAgICAgICAgICAiPG1ldGhvZENhbGw+XG4iCisgICAgICAgICAgICAiPG1ldGhvZE5hbWU+IiwgbWV0aG9kbmFtZSwgIjwvbWV0aG9kTmFtZT5cbiIsCisgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgIjwvbWV0aG9kQ2FsbD5cbiIKKyAgICAgICAgICAgICkKKyAgICBlbGlmIG1ldGhvZHJlc3BvbnNlOgorICAgICAgICAjIGEgbWV0aG9kIHJlc3BvbnNlLCBvciBhIGZhdWx0IHN0cnVjdHVyZQorICAgICAgICBkYXRhID0gKAorICAgICAgICAgICAgeG1saGVhZGVyLAorICAgICAgICAgICAgIjxtZXRob2RSZXNwb25zZT5cbiIsCisgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgIjwvbWV0aG9kUmVzcG9uc2U+XG4iCisgICAgICAgICAgICApCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGRhdGEgIyByZXR1cm4gYXMgaXMKKyAgICByZXR1cm4gc3RyaW5nLmpvaW4oZGF0YSwgIiIpCisKKyMjCisjIENvbnZlcnQgYW4gWE1MLVJQQyBwYWNrZXQgdG8gYSBQeXRob24gb2JqZWN0LiAgSWYgdGhlIFhNTC1SUEMgcGFja2V0CisjIHJlcHJlc2VudHMgYSBmYXVsdCBjb25kaXRpb24sIHRoaXMgZnVuY3Rpb24gcmFpc2VzIGEgRmF1bHQgZXhjZXB0aW9uLgorIworIyBAcGFyYW0gZGF0YSBBbiBYTUwtUlBDIHBhY2tldCwgZ2l2ZW4gYXMgYW4gOC1iaXQgc3RyaW5nLgorIyBAcmV0dXJuIEEgdHVwbGUgY29udGFpbmluZyB0aGUgdW5wYWNrZWQgZGF0YSwgYW5kIHRoZSBtZXRob2QgbmFtZQorIyAgICAgKE5vbmUgaWYgbm90IHByZXNlbnQpLgorIyBAc2VlIEZhdWx0CisKK2RlZiBsb2FkcyhkYXRhLCB1c2VfZGF0ZXRpbWU9MCk6CisgICAgIiIiZGF0YSAtPiB1bm1hcnNoYWxsZWQgZGF0YSwgbWV0aG9kIG5hbWUKKworICAgIENvbnZlcnQgYW4gWE1MLVJQQyBwYWNrZXQgdG8gdW5tYXJzaGFsbGVkIGRhdGEgcGx1cyBhIG1ldGhvZAorICAgIG5hbWUgKE5vbmUgaWYgbm90IHByZXNlbnQpLgorCisgICAgSWYgdGhlIFhNTC1SUEMgcGFja2V0IHJlcHJlc2VudHMgYSBmYXVsdCBjb25kaXRpb24sIHRoaXMgZnVuY3Rpb24KKyAgICByYWlzZXMgYSBGYXVsdCBleGNlcHRpb24uCisgICAgIiIiCisgICAgcCwgdSA9IGdldHBhcnNlcih1c2VfZGF0ZXRpbWU9dXNlX2RhdGV0aW1lKQorICAgIHAuZmVlZChkYXRhKQorICAgIHAuY2xvc2UoKQorICAgIHJldHVybiB1LmNsb3NlKCksIHUuZ2V0bWV0aG9kbmFtZSgpCisKKyMjCisjIEVuY29kZSBhIHN0cmluZyB1c2luZyB0aGUgZ3ppcCBjb250ZW50IGVuY29kaW5nIHN1Y2ggYXMgc3BlY2lmaWVkIGJ5IHRoZQorIyBDb250ZW50LUVuY29kaW5nOiBnemlwCisjIGluIHRoZSBIVFRQIGhlYWRlciwgYXMgZGVzY3JpYmVkIGluIFJGQyAxOTUyCisjCisjIEBwYXJhbSBkYXRhIHRoZSB1bmVuY29kZWQgZGF0YQorIyBAcmV0dXJuIHRoZSBlbmNvZGVkIGRhdGEKKworZGVmIGd6aXBfZW5jb2RlKGRhdGEpOgorICAgICIiImRhdGEgLT4gZ3ppcCBlbmNvZGVkIGRhdGEKKworICAgIEVuY29kZSBkYXRhIHVzaW5nIHRoZSBnemlwIGNvbnRlbnQgZW5jb2RpbmcgYXMgZGVzY3JpYmVkIGluIFJGQyAxOTUyCisgICAgIiIiCisgICAgaWYgbm90IGd6aXA6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgIGd6ZiA9IGd6aXAuR3ppcEZpbGUobW9kZT0id2IiLCBmaWxlb2JqPWYsIGNvbXByZXNzbGV2ZWw9MSkKKyAgICBnemYud3JpdGUoZGF0YSkKKyAgICBnemYuY2xvc2UoKQorICAgIGVuY29kZWQgPSBmLmdldHZhbHVlKCkKKyAgICBmLmNsb3NlKCkKKyAgICByZXR1cm4gZW5jb2RlZAorCisjIworIyBEZWNvZGUgYSBzdHJpbmcgdXNpbmcgdGhlIGd6aXAgY29udGVudCBlbmNvZGluZyBzdWNoIGFzIHNwZWNpZmllZCBieSB0aGUKKyMgQ29udGVudC1FbmNvZGluZzogZ3ppcAorIyBpbiB0aGUgSFRUUCBoZWFkZXIsIGFzIGRlc2NyaWJlZCBpbiBSRkMgMTk1MgorIworIyBAcGFyYW0gZGF0YSBUaGUgZW5jb2RlZCBkYXRhCisjIEByZXR1cm4gdGhlIHVuZW5jb2RlZCBkYXRhCisjIEByYWlzZXMgVmFsdWVFcnJvciBpZiBkYXRhIGlzIG5vdCBjb3JyZWN0bHkgY29kZWQuCisKK2RlZiBnemlwX2RlY29kZShkYXRhKToKKyAgICAiIiJnemlwIGVuY29kZWQgZGF0YSAtPiB1bmVuY29kZWQgZGF0YQorCisgICAgRGVjb2RlIGRhdGEgdXNpbmcgdGhlIGd6aXAgY29udGVudCBlbmNvZGluZyBhcyBkZXNjcmliZWQgaW4gUkZDIDE5NTIKKyAgICAiIiIKKyAgICBpZiBub3QgZ3ppcDoKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQorICAgIGd6ZiA9IGd6aXAuR3ppcEZpbGUobW9kZT0icmIiLCBmaWxlb2JqPWYpCisgICAgdHJ5OgorICAgICAgICBkZWNvZGVkID0gZ3pmLnJlYWQoKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGRhdGEiKQorICAgIGYuY2xvc2UoKQorICAgIGd6Zi5jbG9zZSgpCisgICAgcmV0dXJuIGRlY29kZWQKKworIyMKKyMgUmV0dXJuIGEgZGVjb2RlZCBmaWxlLWxpa2Ugb2JqZWN0IGZvciB0aGUgZ3ppcCBlbmNvZGluZworIyBhcyBkZXNjcmliZWQgaW4gUkZDIDE5NTIuCisjCisjIEBwYXJhbSByZXNwb25zZSBBIHN0cmVhbSBzdXBwb3J0aW5nIGEgcmVhZCgpIG1ldGhvZAorIyBAcmV0dXJuIGEgZmlsZS1saWtlIG9iamVjdCB0aGF0IHRoZSBkZWNvZGVkIGRhdGEgY2FuIGJlIHJlYWQoKSBmcm9tCisKK2NsYXNzIEd6aXBEZWNvZGVkUmVzcG9uc2UoZ3ppcC5HemlwRmlsZSBpZiBnemlwIGVsc2Ugb2JqZWN0KToKKyAgICAiIiJhIGZpbGUtbGlrZSBvYmplY3QgdG8gZGVjb2RlIGEgcmVzcG9uc2UgZW5jb2RlZCB3aXRoIHRoZSBnemlwCisgICAgbWV0aG9kLCBhcyBkZXNjcmliZWQgaW4gUkZDIDE5NTIuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlc3BvbnNlKToKKyAgICAgICAgI3Jlc3BvbnNlIGRvZXNuJ3Qgc3VwcG9ydCB0ZWxsKCkgYW5kIHJlYWQoKSwgcmVxdWlyZWQgYnkKKyAgICAgICAgI0d6aXBGaWxlCisgICAgICAgIGlmIG5vdCBnemlwOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgICAgICBzZWxmLnN0cmluZ2lvID0gU3RyaW5nSU8uU3RyaW5nSU8ocmVzcG9uc2UucmVhZCgpKQorICAgICAgICBnemlwLkd6aXBGaWxlLl9faW5pdF9fKHNlbGYsIG1vZGU9InJiIiwgZmlsZW9iaj1zZWxmLnN0cmluZ2lvKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBnemlwLkd6aXBGaWxlLmNsb3NlKHNlbGYpCisgICAgICAgIHNlbGYuc3RyaW5naW8uY2xvc2UoKQorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcmVxdWVzdCBkaXNwYXRjaGVyCisKK2NsYXNzIF9NZXRob2Q6CisgICAgIyBzb21lIG1hZ2ljIHRvIGJpbmQgYW4gWE1MLVJQQyBtZXRob2QgdG8gYW4gUlBDIHNlcnZlci4KKyAgICAjIHN1cHBvcnRzICJuZXN0ZWQiIG1ldGhvZHMgKGUuZy4gZXhhbXBsZXMuZ2V0U3RhdGVOYW1lKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZW5kLCBuYW1lKToKKyAgICAgICAgc2VsZi5fX3NlbmQgPSBzZW5kCisgICAgICAgIHNlbGYuX19uYW1lID0gbmFtZQorICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIF9NZXRob2Qoc2VsZi5fX3NlbmQsICIlcy4lcyIgJSAoc2VsZi5fX25hbWUsIG5hbWUpKQorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9fc2VuZChzZWxmLl9fbmFtZSwgYXJncykKKworIyMKKyMgU3RhbmRhcmQgdHJhbnNwb3J0IGNsYXNzIGZvciBYTUwtUlBDIG92ZXIgSFRUUC4KKyMgPHA+CisjIFlvdSBjYW4gY3JlYXRlIGN1c3RvbSB0cmFuc3BvcnRzIGJ5IHN1YmNsYXNzaW5nIHRoaXMgbWV0aG9kLCBhbmQKKyMgb3ZlcnJpZGluZyBzZWxlY3RlZCBtZXRob2RzLgorCitjbGFzcyBUcmFuc3BvcnQ6CisgICAgIiIiSGFuZGxlcyBhbiBIVFRQIHRyYW5zYWN0aW9uIHRvIGFuIFhNTC1SUEMgc2VydmVyLiIiIgorCisgICAgIyBjbGllbnQgaWRlbnRpZmllciAobWF5IGJlIG92ZXJyaWRkZW4pCisgICAgdXNlcl9hZ2VudCA9ICJ4bWxycGNsaWIucHkvJXMgKGJ5IHd3dy5weXRob253YXJlLmNvbSkiICUgX192ZXJzaW9uX18KKworICAgICNpZiB0cnVlLCB3ZSdsbCByZXF1ZXN0IGd6aXAgZW5jb2RpbmcKKyAgICBhY2NlcHRfZ3ppcF9lbmNvZGluZyA9IFRydWUKKworICAgICMgaWYgcG9zaXRpdmUsIGVuY29kZSByZXF1ZXN0IHVzaW5nIGd6aXAgaWYgaXQgZXhjZWVkcyB0aGlzIHRocmVzaG9sZAorICAgICMgbm90ZSB0aGF0IG1hbnkgc2VydmVyIHdpbGwgZ2V0IGNvbmZ1c2VkLCBzbyBvbmx5IHVzZSBpdCBpZiB5b3Uga25vdworICAgICMgdGhhdCB0aGV5IGNhbiBkZWNvZGUgc3VjaCBhIHJlcXVlc3QKKyAgICBlbmNvZGVfdGhyZXNob2xkID0gTm9uZSAjTm9uZSA9IGRvbid0IGVuY29kZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVzZV9kYXRldGltZT0wKToKKyAgICAgICAgc2VsZi5fdXNlX2RhdGV0aW1lID0gdXNlX2RhdGV0aW1lCisgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24gPSAoTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5fZXh0cmFfaGVhZGVycyA9IFtdCisgICAgIyMKKyAgICAjIFNlbmQgYSBjb21wbGV0ZSByZXF1ZXN0LCBhbmQgcGFyc2UgdGhlIHJlc3BvbnNlLgorICAgICMgUmV0cnkgcmVxdWVzdCBpZiBhIGNhY2hlZCBjb25uZWN0aW9uIGhhcyBkaXNjb25uZWN0ZWQuCisgICAgIworICAgICMgQHBhcmFtIGhvc3QgVGFyZ2V0IGhvc3QuCisgICAgIyBAcGFyYW0gaGFuZGxlciBUYXJnZXQgUFJDIGhhbmRsZXIuCisgICAgIyBAcGFyYW0gcmVxdWVzdF9ib2R5IFhNTC1SUEMgcmVxdWVzdCBib2R5LgorICAgICMgQHBhcmFtIHZlcmJvc2UgRGVidWdnaW5nIGZsYWcuCisgICAgIyBAcmV0dXJuIFBhcnNlZCByZXNwb25zZS4KKworICAgIGRlZiByZXF1ZXN0KHNlbGYsIGhvc3QsIGhhbmRsZXIsIHJlcXVlc3RfYm9keSwgdmVyYm9zZT0wKToKKyAgICAgICAgI3JldHJ5IHJlcXVlc3Qgb25jZSBpZiBjYWNoZWQgY29ubmVjdGlvbiBoYXMgZ29uZSBjb2xkCisgICAgICAgIGZvciBpIGluICgwLCAxKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zaW5nbGVfcmVxdWVzdChob3N0LCBoYW5kbGVyLCByZXF1ZXN0X2JvZHksIHZlcmJvc2UpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgorICAgICAgICAgICAgICAgIGlmIGkgb3IgZS5lcnJubyBub3QgaW4gKGVycm5vLkVDT05OUkVTRVQsIGVycm5vLkVDT05OQUJPUlRFRCwgZXJybm8uRVBJUEUpOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0IGh0dHBsaWIuQmFkU3RhdHVzTGluZTogI2Nsb3NlIGFmdGVyIHdlIHNlbnQgcmVxdWVzdAorICAgICAgICAgICAgICAgIGlmIGk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAjIworICAgICMgU2VuZCBhIGNvbXBsZXRlIHJlcXVlc3QsIGFuZCBwYXJzZSB0aGUgcmVzcG9uc2UuCisgICAgIworICAgICMgQHBhcmFtIGhvc3QgVGFyZ2V0IGhvc3QuCisgICAgIyBAcGFyYW0gaGFuZGxlciBUYXJnZXQgUFJDIGhhbmRsZXIuCisgICAgIyBAcGFyYW0gcmVxdWVzdF9ib2R5IFhNTC1SUEMgcmVxdWVzdCBib2R5LgorICAgICMgQHBhcmFtIHZlcmJvc2UgRGVidWdnaW5nIGZsYWcuCisgICAgIyBAcmV0dXJuIFBhcnNlZCByZXNwb25zZS4KKworICAgIGRlZiBzaW5nbGVfcmVxdWVzdChzZWxmLCBob3N0LCBoYW5kbGVyLCByZXF1ZXN0X2JvZHksIHZlcmJvc2U9MCk6CisgICAgICAgICMgaXNzdWUgWE1MLVJQQyByZXF1ZXN0CisKKyAgICAgICAgaCA9IHNlbGYubWFrZV9jb25uZWN0aW9uKGhvc3QpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBoLnNldF9kZWJ1Z2xldmVsKDEpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZW5kX3JlcXVlc3QoaCwgaGFuZGxlciwgcmVxdWVzdF9ib2R5KQorICAgICAgICAgICAgc2VsZi5zZW5kX2hvc3QoaCwgaG9zdCkKKyAgICAgICAgICAgIHNlbGYuc2VuZF91c2VyX2FnZW50KGgpCisgICAgICAgICAgICBzZWxmLnNlbmRfY29udGVudChoLCByZXF1ZXN0X2JvZHkpCisKKyAgICAgICAgICAgIHJlc3BvbnNlID0gaC5nZXRyZXNwb25zZShidWZmZXJpbmc9VHJ1ZSkKKyAgICAgICAgICAgIGlmIHJlc3BvbnNlLnN0YXR1cyA9PSAyMDA6CisgICAgICAgICAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX3Jlc3BvbnNlKHJlc3BvbnNlKQorICAgICAgICBleGNlcHQgRmF1bHQ6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgIyBBbGwgdW5leHBlY3RlZCBlcnJvcnMgbGVhdmUgY29ubmVjdGlvbiBpbgorICAgICAgICAgICAgIyBhIHN0cmFuZ2Ugc3RhdGUsIHNvIHdlIGNsZWFyIGl0LgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICByYWlzZQorCisgICAgICAgICNkaXNjYXJkIGFueSByZXNwb25zZSBkYXRhIGFuZCByYWlzZSBleGNlcHRpb24KKyAgICAgICAgaWYgKHJlc3BvbnNlLmdldGhlYWRlcigiY29udGVudC1sZW5ndGgiLCAwKSk6CisgICAgICAgICAgICByZXNwb25zZS5yZWFkKCkKKyAgICAgICAgcmFpc2UgUHJvdG9jb2xFcnJvcigKKyAgICAgICAgICAgIGhvc3QgKyBoYW5kbGVyLAorICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5yZWFzb24sCisgICAgICAgICAgICByZXNwb25zZS5tc2csCisgICAgICAgICAgICApCisKKyAgICAjIworICAgICMgQ3JlYXRlIHBhcnNlci4KKyAgICAjCisgICAgIyBAcmV0dXJuIEEgMi10dXBsZSBjb250YWluaW5nIGEgcGFyc2VyIGFuZCBhIHVubWFyc2hhbGxlci4KKworICAgIGRlZiBnZXRwYXJzZXIoc2VsZik6CisgICAgICAgICMgZ2V0IHBhcnNlciBhbmQgdW5tYXJzaGFsbGVyCisgICAgICAgIHJldHVybiBnZXRwYXJzZXIodXNlX2RhdGV0aW1lPXNlbGYuX3VzZV9kYXRldGltZSkKKworICAgICMjCisgICAgIyBHZXQgYXV0aG9yaXphdGlvbiBpbmZvIGZyb20gaG9zdCBwYXJhbWV0ZXIKKyAgICAjIEhvc3QgbWF5IGJlIGEgc3RyaW5nLCBvciBhIChob3N0LCB4NTA5LWRpY3QpIHR1cGxlOyBpZiBhIHN0cmluZywKKyAgICAjIGl0IGlzIGNoZWNrZWQgZm9yIGEgInVzZXI6cHdAaG9zdCIgZm9ybWF0LCBhbmQgYSAiQmFzaWMKKyAgICAjIEF1dGhlbnRpY2F0aW9uIiBoZWFkZXIgaXMgYWRkZWQgaWYgYXBwcm9wcmlhdGUuCisgICAgIworICAgICMgQHBhcmFtIGhvc3QgSG9zdCBkZXNjcmlwdG9yIChVUkwgb3IgKFVSTCwgeDUwOSBpbmZvKSB0dXBsZSkuCisgICAgIyBAcmV0dXJuIEEgMy10dXBsZSBjb250YWluaW5nIChhY3R1YWwgaG9zdCwgZXh0cmEgaGVhZGVycywKKyAgICAjICAgICB4NTA5IGluZm8pLiAgVGhlIGhlYWRlciBhbmQgeDUwOSBmaWVsZHMgbWF5IGJlIE5vbmUuCisKKyAgICBkZWYgZ2V0X2hvc3RfaW5mbyhzZWxmLCBob3N0KToKKworICAgICAgICB4NTA5ID0ge30KKyAgICAgICAgaWYgaXNpbnN0YW5jZShob3N0LCBUdXBsZVR5cGUpOgorICAgICAgICAgICAgaG9zdCwgeDUwOSA9IGhvc3QKKworICAgICAgICBpbXBvcnQgdXJsbGliCisgICAgICAgIGF1dGgsIGhvc3QgPSB1cmxsaWIuc3BsaXR1c2VyKGhvc3QpCisKKyAgICAgICAgaWYgYXV0aDoKKyAgICAgICAgICAgIGltcG9ydCBiYXNlNjQKKyAgICAgICAgICAgIGF1dGggPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKHVybGxpYi51bnF1b3RlKGF1dGgpKQorICAgICAgICAgICAgYXV0aCA9IHN0cmluZy5qb2luKHN0cmluZy5zcGxpdChhdXRoKSwgIiIpICMgZ2V0IHJpZCBvZiB3aGl0ZXNwYWNlCisgICAgICAgICAgICBleHRyYV9oZWFkZXJzID0gWworICAgICAgICAgICAgICAgICgiQXV0aG9yaXphdGlvbiIsICJCYXNpYyAiICsgYXV0aCkKKyAgICAgICAgICAgICAgICBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleHRyYV9oZWFkZXJzID0gTm9uZQorCisgICAgICAgIHJldHVybiBob3N0LCBleHRyYV9oZWFkZXJzLCB4NTA5CisKKyAgICAjIworICAgICMgQ29ubmVjdCB0byBzZXJ2ZXIuCisgICAgIworICAgICMgQHBhcmFtIGhvc3QgVGFyZ2V0IGhvc3QuCisgICAgIyBAcmV0dXJuIEEgY29ubmVjdGlvbiBoYW5kbGUuCisKKyAgICBkZWYgbWFrZV9jb25uZWN0aW9uKHNlbGYsIGhvc3QpOgorICAgICAgICAjcmV0dXJuIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gaWYgcG9zc2libGUuICBUaGlzIGFsbG93cworICAgICAgICAjSFRUUC8xLjEga2VlcC1hbGl2ZS4KKyAgICAgICAgaWYgc2VsZi5fY29ubmVjdGlvbiBhbmQgaG9zdCA9PSBzZWxmLl9jb25uZWN0aW9uWzBdOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Nvbm5lY3Rpb25bMV0KKworICAgICAgICAjIGNyZWF0ZSBhIEhUVFAgY29ubmVjdGlvbiBvYmplY3QgZnJvbSBhIGhvc3QgZGVzY3JpcHRvcgorICAgICAgICBjaG9zdCwgc2VsZi5fZXh0cmFfaGVhZGVycywgeDUwOSA9IHNlbGYuZ2V0X2hvc3RfaW5mbyhob3N0KQorICAgICAgICAjc3RvcmUgdGhlIGhvc3QgYXJndW1lbnQgYWxvbmcgd2l0aCB0aGUgY29ubmVjdGlvbiBvYmplY3QKKyAgICAgICAgc2VsZi5fY29ubmVjdGlvbiA9IGhvc3QsIGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oY2hvc3QpCisgICAgICAgIHJldHVybiBzZWxmLl9jb25uZWN0aW9uWzFdCisKKyAgICAjIworICAgICMgQ2xlYXIgYW55IGNhY2hlZCBjb25uZWN0aW9uIG9iamVjdC4KKyAgICAjIFVzZWQgaW4gdGhlIGV2ZW50IG9mIHNvY2tldCBlcnJvcnMuCisgICAgIworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY29ubmVjdGlvblsxXToKKyAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb25bMV0uY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5fY29ubmVjdGlvbiA9IChOb25lLCBOb25lKQorCisgICAgIyMKKyAgICAjIFNlbmQgcmVxdWVzdCBoZWFkZXIuCisgICAgIworICAgICMgQHBhcmFtIGNvbm5lY3Rpb24gQ29ubmVjdGlvbiBoYW5kbGUuCisgICAgIyBAcGFyYW0gaGFuZGxlciBUYXJnZXQgUlBDIGhhbmRsZXIuCisgICAgIyBAcGFyYW0gcmVxdWVzdF9ib2R5IFhNTC1SUEMgYm9keS4KKworICAgIGRlZiBzZW5kX3JlcXVlc3Qoc2VsZiwgY29ubmVjdGlvbiwgaGFuZGxlciwgcmVxdWVzdF9ib2R5KToKKyAgICAgICAgaWYgKHNlbGYuYWNjZXB0X2d6aXBfZW5jb2RpbmcgYW5kIGd6aXApOgorICAgICAgICAgICAgY29ubmVjdGlvbi5wdXRyZXF1ZXN0KCJQT1NUIiwgaGFuZGxlciwgc2tpcF9hY2NlcHRfZW5jb2Rpbmc9VHJ1ZSkKKyAgICAgICAgICAgIGNvbm5lY3Rpb24ucHV0aGVhZGVyKCJBY2NlcHQtRW5jb2RpbmciLCAiZ3ppcCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb25uZWN0aW9uLnB1dHJlcXVlc3QoIlBPU1QiLCBoYW5kbGVyKQorCisgICAgIyMKKyAgICAjIFNlbmQgaG9zdCBuYW1lLgorICAgICMKKyAgICAjIEBwYXJhbSBjb25uZWN0aW9uIENvbm5lY3Rpb24gaGFuZGxlLgorICAgICMgQHBhcmFtIGhvc3QgSG9zdCBuYW1lLgorICAgICMKKyAgICAjIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lc24ndCBhY3R1YWxseSBhZGQgdGhlICJIb3N0IgorICAgICMgaGVhZGVyIGFueW1vcmUsIGl0IGlzIGRvbmUgYXMgcGFydCBvZiB0aGUgY29ubmVjdGlvbi5wdXRyZXF1ZXN0KCkgaW4KKyAgICAjIHNlbmRfcmVxdWVzdCgpIGFib3ZlLgorCisgICAgZGVmIHNlbmRfaG9zdChzZWxmLCBjb25uZWN0aW9uLCBob3N0KToKKyAgICAgICAgZXh0cmFfaGVhZGVycyA9IHNlbGYuX2V4dHJhX2hlYWRlcnMKKyAgICAgICAgaWYgZXh0cmFfaGVhZGVyczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0cmFfaGVhZGVycywgRGljdFR5cGUpOgorICAgICAgICAgICAgICAgIGV4dHJhX2hlYWRlcnMgPSBleHRyYV9oZWFkZXJzLml0ZW1zKCkKKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGV4dHJhX2hlYWRlcnM6CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5wdXRoZWFkZXIoa2V5LCB2YWx1ZSkKKworICAgICMjCisgICAgIyBTZW5kIHVzZXItYWdlbnQgaWRlbnRpZmllci4KKyAgICAjCisgICAgIyBAcGFyYW0gY29ubmVjdGlvbiBDb25uZWN0aW9uIGhhbmRsZS4KKworICAgIGRlZiBzZW5kX3VzZXJfYWdlbnQoc2VsZiwgY29ubmVjdGlvbik6CisgICAgICAgIGNvbm5lY3Rpb24ucHV0aGVhZGVyKCJVc2VyLUFnZW50Iiwgc2VsZi51c2VyX2FnZW50KQorCisgICAgIyMKKyAgICAjIFNlbmQgcmVxdWVzdCBib2R5LgorICAgICMKKyAgICAjIEBwYXJhbSBjb25uZWN0aW9uIENvbm5lY3Rpb24gaGFuZGxlLgorICAgICMgQHBhcmFtIHJlcXVlc3RfYm9keSBYTUwtUlBDIHJlcXVlc3QgYm9keS4KKworICAgIGRlZiBzZW5kX2NvbnRlbnQoc2VsZiwgY29ubmVjdGlvbiwgcmVxdWVzdF9ib2R5KToKKyAgICAgICAgY29ubmVjdGlvbi5wdXRoZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L3htbCIpCisKKyAgICAgICAgI29wdGlvbmFsbHkgZW5jb2RlIHRoZSByZXF1ZXN0CisgICAgICAgIGlmIChzZWxmLmVuY29kZV90aHJlc2hvbGQgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICBzZWxmLmVuY29kZV90aHJlc2hvbGQgPCBsZW4ocmVxdWVzdF9ib2R5KSBhbmQKKyAgICAgICAgICAgIGd6aXApOgorICAgICAgICAgICAgY29ubmVjdGlvbi5wdXRoZWFkZXIoIkNvbnRlbnQtRW5jb2RpbmciLCAiZ3ppcCIpCisgICAgICAgICAgICByZXF1ZXN0X2JvZHkgPSBnemlwX2VuY29kZShyZXF1ZXN0X2JvZHkpCisKKyAgICAgICAgY29ubmVjdGlvbi5wdXRoZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIiwgc3RyKGxlbihyZXF1ZXN0X2JvZHkpKSkKKyAgICAgICAgY29ubmVjdGlvbi5lbmRoZWFkZXJzKHJlcXVlc3RfYm9keSkKKworICAgICMjCisgICAgIyBQYXJzZSByZXNwb25zZS4KKyAgICAjCisgICAgIyBAcGFyYW0gZmlsZSBTdHJlYW0uCisgICAgIyBAcmV0dXJuIFJlc3BvbnNlIHR1cGxlIGFuZCB0YXJnZXQgbWV0aG9kLgorCisgICAgZGVmIHBhcnNlX3Jlc3BvbnNlKHNlbGYsIHJlc3BvbnNlKToKKyAgICAgICAgIyByZWFkIHJlc3BvbnNlIGRhdGEgZnJvbSBodHRwcmVzcG9uc2UsIGFuZCBwYXJzZSBpdAorCisgICAgICAgICMgQ2hlY2sgZm9yIG5ldyBodHRwIHJlc3BvbnNlIG9iamVjdCwgZWxzZSBpdCBpcyBhIGZpbGUgb2JqZWN0CisgICAgICAgIGlmIGhhc2F0dHIocmVzcG9uc2UsJ2dldGhlYWRlcicpOgorICAgICAgICAgICAgaWYgcmVzcG9uc2UuZ2V0aGVhZGVyKCJDb250ZW50LUVuY29kaW5nIiwgIiIpID09ICJnemlwIjoKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBHemlwRGVjb2RlZFJlc3BvbnNlKHJlc3BvbnNlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSByZXNwb25zZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RyZWFtID0gcmVzcG9uc2UKKworICAgICAgICBwLCB1ID0gc2VsZi5nZXRwYXJzZXIoKQorCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBkYXRhID0gc3RyZWFtLnJlYWQoMTAyNCkKKyAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgImJvZHk6IiwgcmVwcihkYXRhKQorICAgICAgICAgICAgcC5mZWVkKGRhdGEpCisKKyAgICAgICAgaWYgc3RyZWFtIGlzIG5vdCByZXNwb25zZToKKyAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpCisgICAgICAgIHAuY2xvc2UoKQorCisgICAgICAgIHJldHVybiB1LmNsb3NlKCkKKworIyMKKyMgU3RhbmRhcmQgdHJhbnNwb3J0IGNsYXNzIGZvciBYTUwtUlBDIG92ZXIgSFRUUFMuCisKK2NsYXNzIFNhZmVUcmFuc3BvcnQoVHJhbnNwb3J0KToKKyAgICAiIiJIYW5kbGVzIGFuIEhUVFBTIHRyYW5zYWN0aW9uIHRvIGFuIFhNTC1SUEMgc2VydmVyLiIiIgorCisgICAgIyBGSVhNRTogbW9zdGx5IHVudGVzdGVkCisKKyAgICBkZWYgbWFrZV9jb25uZWN0aW9uKHNlbGYsIGhvc3QpOgorICAgICAgICBpZiBzZWxmLl9jb25uZWN0aW9uIGFuZCBob3N0ID09IHNlbGYuX2Nvbm5lY3Rpb25bMF06CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29ubmVjdGlvblsxXQorICAgICAgICAjIGNyZWF0ZSBhIEhUVFBTIGNvbm5lY3Rpb24gb2JqZWN0IGZyb20gYSBob3N0IGRlc2NyaXB0b3IKKyAgICAgICAgIyBob3N0IG1heSBiZSBhIHN0cmluZywgb3IgYSAoaG9zdCwgeDUwOS1kaWN0KSB0dXBsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBIVFRQUyA9IGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICAgICAgICAgInlvdXIgdmVyc2lvbiBvZiBodHRwbGliIGRvZXNuJ3Qgc3VwcG9ydCBIVFRQUyIKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjaG9zdCwgc2VsZi5fZXh0cmFfaGVhZGVycywgeDUwOSA9IHNlbGYuZ2V0X2hvc3RfaW5mbyhob3N0KQorICAgICAgICAgICAgc2VsZi5fY29ubmVjdGlvbiA9IGhvc3QsIEhUVFBTKGNob3N0LCBOb25lLCAqKih4NTA5IG9yIHt9KSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb25uZWN0aW9uWzFdCisKKyMjCisjIFN0YW5kYXJkIHNlcnZlciBwcm94eS4gIFRoaXMgY2xhc3MgZXN0YWJsaXNoZXMgYSB2aXJ0dWFsIGNvbm5lY3Rpb24KKyMgdG8gYW4gWE1MLVJQQyBzZXJ2ZXIuCisjIDxwPgorIyBUaGlzIGNsYXNzIGlzIGF2YWlsYWJsZSBhcyBTZXJ2ZXJQcm94eSBhbmQgU2VydmVyLiAgTmV3IGNvZGUgc2hvdWxkCisjIHVzZSBTZXJ2ZXJQcm94eSwgdG8gYXZvaWQgY29uZnVzaW9uLgorIworIyBAZGVmIFNlcnZlclByb3h5KHVyaSwgKipvcHRpb25zKQorIyBAcGFyYW0gdXJpIFRoZSBjb25uZWN0aW9uIHBvaW50IG9uIHRoZSBzZXJ2ZXIuCisjIEBrZXlwYXJhbSB0cmFuc3BvcnQgQSB0cmFuc3BvcnQgZmFjdG9yeSwgY29tcGF0aWJsZSB3aXRoIHRoZQorIyAgICBzdGFuZGFyZCB0cmFuc3BvcnQgY2xhc3MuCisjIEBrZXlwYXJhbSBlbmNvZGluZyBUaGUgZGVmYXVsdCBlbmNvZGluZyB1c2VkIGZvciA4LWJpdCBzdHJpbmdzCisjICAgIChkZWZhdWx0IGlzIFVURi04KS4KKyMgQGtleXBhcmFtIHZlcmJvc2UgVXNlIGEgdHJ1ZSB2YWx1ZSB0byBlbmFibGUgZGVidWdnaW5nIG91dHB1dC4KKyMgICAgKHByaW50ZWQgdG8gc3RhbmRhcmQgb3V0cHV0KS4KKyMgQHNlZSBUcmFuc3BvcnQKKworY2xhc3MgU2VydmVyUHJveHk6CisgICAgIiIidXJpIFssb3B0aW9uc10gLT4gYSBsb2dpY2FsIGNvbm5lY3Rpb24gdG8gYW4gWE1MLVJQQyBzZXJ2ZXIKKworICAgIHVyaSBpcyB0aGUgY29ubmVjdGlvbiBwb2ludCBvbiB0aGUgc2VydmVyLCBnaXZlbiBhcworICAgIHNjaGVtZTovL2hvc3QvdGFyZ2V0LgorCisgICAgVGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9uIGFsd2F5cyBzdXBwb3J0cyB0aGUgImh0dHAiIHNjaGVtZS4gIElmCisgICAgU1NMIHNvY2tldCBzdXBwb3J0IGlzIGF2YWlsYWJsZSAoUHl0aG9uIDIuMCksIGl0IGFsc28gc3VwcG9ydHMKKyAgICAiaHR0cHMiLgorCisgICAgSWYgdGhlIHRhcmdldCBwYXJ0IGFuZCB0aGUgc2xhc2ggcHJlY2VkaW5nIGl0IGFyZSBib3RoIG9taXR0ZWQsCisgICAgIi9SUEMyIiBpcyBhc3N1bWVkLgorCisgICAgVGhlIGZvbGxvd2luZyBvcHRpb25zIGNhbiBiZSBnaXZlbiBhcyBrZXl3b3JkIGFyZ3VtZW50czoKKworICAgICAgICB0cmFuc3BvcnQ6IGEgdHJhbnNwb3J0IGZhY3RvcnkKKyAgICAgICAgZW5jb2Rpbmc6IHRoZSByZXF1ZXN0IGVuY29kaW5nIChkZWZhdWx0IGlzIFVURi04KQorCisgICAgQWxsIDgtYml0IHN0cmluZ3MgcGFzc2VkIHRvIHRoZSBzZXJ2ZXIgcHJveHkgYXJlIGFzc3VtZWQgdG8gdXNlCisgICAgdGhlIGdpdmVuIGVuY29kaW5nLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVyaSwgdHJhbnNwb3J0PU5vbmUsIGVuY29kaW5nPU5vbmUsIHZlcmJvc2U9MCwKKyAgICAgICAgICAgICAgICAgYWxsb3dfbm9uZT0wLCB1c2VfZGF0ZXRpbWU9MCk6CisgICAgICAgICMgZXN0YWJsaXNoIGEgImxvZ2ljYWwiIHNlcnZlciBjb25uZWN0aW9uCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh1cmksIHVuaWNvZGUpOgorICAgICAgICAgICAgdXJpID0gdXJpLmVuY29kZSgnSVNPLTg4NTktMScpCisKKyAgICAgICAgIyBnZXQgdGhlIHVybAorICAgICAgICBpbXBvcnQgdXJsbGliCisgICAgICAgIHR5cGUsIHVyaSA9IHVybGxpYi5zcGxpdHR5cGUodXJpKQorICAgICAgICBpZiB0eXBlIG5vdCBpbiAoImh0dHAiLCAiaHR0cHMiKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJ1bnN1cHBvcnRlZCBYTUwtUlBDIHByb3RvY29sIgorICAgICAgICBzZWxmLl9faG9zdCwgc2VsZi5fX2hhbmRsZXIgPSB1cmxsaWIuc3BsaXRob3N0KHVyaSkKKyAgICAgICAgaWYgbm90IHNlbGYuX19oYW5kbGVyOgorICAgICAgICAgICAgc2VsZi5fX2hhbmRsZXIgPSAiL1JQQzIiCisKKyAgICAgICAgaWYgdHJhbnNwb3J0IGlzIE5vbmU6CisgICAgICAgICAgICBpZiB0eXBlID09ICJodHRwcyI6CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gU2FmZVRyYW5zcG9ydCh1c2VfZGF0ZXRpbWU9dXNlX2RhdGV0aW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cmFuc3BvcnQgPSBUcmFuc3BvcnQodXNlX2RhdGV0aW1lPXVzZV9kYXRldGltZSkKKyAgICAgICAgc2VsZi5fX3RyYW5zcG9ydCA9IHRyYW5zcG9ydAorCisgICAgICAgIHNlbGYuX19lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgIHNlbGYuX192ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBzZWxmLl9fYWxsb3dfbm9uZSA9IGFsbG93X25vbmUKKworICAgIGRlZiBfX2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9fdHJhbnNwb3J0LmNsb3NlKCkKKworICAgIGRlZiBfX3JlcXVlc3Qoc2VsZiwgbWV0aG9kbmFtZSwgcGFyYW1zKToKKyAgICAgICAgIyBjYWxsIGEgbWV0aG9kIG9uIHRoZSByZW1vdGUgc2VydmVyCisKKyAgICAgICAgcmVxdWVzdCA9IGR1bXBzKHBhcmFtcywgbWV0aG9kbmFtZSwgZW5jb2Rpbmc9c2VsZi5fX2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfbm9uZT1zZWxmLl9fYWxsb3dfbm9uZSkKKworICAgICAgICByZXNwb25zZSA9IHNlbGYuX190cmFuc3BvcnQucmVxdWVzdCgKKyAgICAgICAgICAgIHNlbGYuX19ob3N0LAorICAgICAgICAgICAgc2VsZi5fX2hhbmRsZXIsCisgICAgICAgICAgICByZXF1ZXN0LAorICAgICAgICAgICAgdmVyYm9zZT1zZWxmLl9fdmVyYm9zZQorICAgICAgICAgICAgKQorCisgICAgICAgIGlmIGxlbihyZXNwb25zZSkgPT0gMToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2VbMF0KKworICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICI8U2VydmVyUHJveHkgZm9yICVzJXM+IiAlCisgICAgICAgICAgICAoc2VsZi5fX2hvc3QsIHNlbGYuX19oYW5kbGVyKQorICAgICAgICAgICAgKQorCisgICAgX19zdHJfXyA9IF9fcmVwcl9fCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgICMgbWFnaWMgbWV0aG9kIGRpc3BhdGNoZXIKKyAgICAgICAgcmV0dXJuIF9NZXRob2Qoc2VsZi5fX3JlcXVlc3QsIG5hbWUpCisKKyAgICAjIG5vdGU6IHRvIGNhbGwgYSByZW1vdGUgb2JqZWN0IHdpdGggYW4gbm9uLXN0YW5kYXJkIG5hbWUsIHVzZQorICAgICMgcmVzdWx0IGdldGF0dHIoc2VydmVyLCAic3RyYW5nZS1weXRob24tbmFtZSIpKGFyZ3MpCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgYXR0cik6CisgICAgICAgICIiIkEgd29ya2Fyb3VuZCB0byBnZXQgc3BlY2lhbCBhdHRyaWJ1dGVzIG9uIHRoZSBTZXJ2ZXJQcm94eQorICAgICAgICAgICB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggdGhlIG1hZ2ljIF9fZ2V0YXR0cl9fCisgICAgICAgICIiIgorICAgICAgICBpZiBhdHRyID09ICJjbG9zZSI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2Nsb3NlCisgICAgICAgIGVsaWYgYXR0ciA9PSAidHJhbnNwb3J0IjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fdHJhbnNwb3J0CisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJBdHRyaWJ1dGUgJXIgbm90IGZvdW5kIiAlIChhdHRyLCkpCisKKyMgY29tcGF0aWJpbGl0eQorCitTZXJ2ZXIgPSBTZXJ2ZXJQcm94eQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHRlc3QgY29kZQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorCisgICAgIyBzaW1wbGUgdGVzdCBwcm9ncmFtIChmcm9tIHRoZSBYTUwtUlBDIHNwZWNpZmljYXRpb24pCisKKyAgICAjIHNlcnZlciA9IFNlcnZlclByb3h5KCJodHRwOi8vbG9jYWxob3N0OjgwMDAiKSAjIGxvY2FsIHNlcnZlcgorICAgIHNlcnZlciA9IFNlcnZlclByb3h5KCJodHRwOi8vdGltZS54bWxycGMuY29tL1JQQzIiKQorCisgICAgcHJpbnQgc2VydmVyCisKKyAgICB0cnk6CisgICAgICAgIHByaW50IHNlcnZlci5jdXJyZW50VGltZS5nZXRDdXJyZW50VGltZSgpCisgICAgZXhjZXB0IEVycm9yLCB2OgorICAgICAgICBwcmludCAiRVJST1IiLCB2CisKKyAgICBtdWx0aSA9IE11bHRpQ2FsbChzZXJ2ZXIpCisgICAgbXVsdGkuY3VycmVudFRpbWUuZ2V0Q3VycmVudFRpbWUoKQorICAgIG11bHRpLmN1cnJlbnRUaW1lLmdldEN1cnJlbnRUaW1lKCkKKyAgICB0cnk6CisgICAgICAgIGZvciByZXNwb25zZSBpbiBtdWx0aSgpOgorICAgICAgICAgICAgcHJpbnQgcmVzcG9uc2UKKyAgICBleGNlcHQgRXJyb3IsIHY6CisgICAgICAgIHByaW50ICJFUlJPUiIsIHYKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1scnBjbGliLnB5YyBiL2xpYi9weXRob24yLjcveG1scnBjbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODgzNTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWxycGNsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1scnBjbGliLnB5byBiL2xpYi9weXRob24yLjcveG1scnBjbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDY3NmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWxycGNsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvemlwZmlsZS5weSBiL2xpYi9weXRob24yLjcvemlwZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjM5MzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy96aXBmaWxlLnB5CkBAIC0wLDAgKzEsMTUyMyBAQAorIiIiCitSZWFkIGFuZCB3cml0ZSBaSVAgZmlsZXMuCisiIiIKK2ltcG9ydCBzdHJ1Y3QsIG9zLCB0aW1lLCBzeXMsIHNodXRpbAoraW1wb3J0IGJpbmFzY2lpLCBjU3RyaW5nSU8sIHN0YXQKK2ltcG9ydCBpbworaW1wb3J0IHJlCitpbXBvcnQgc3RyaW5nCisKK3RyeToKKyAgICBpbXBvcnQgemxpYiAjIFdlIG1heSBuZWVkIGl0cyBjb21wcmVzc2lvbiBtZXRob2QKKyAgICBjcmMzMiA9IHpsaWIuY3JjMzIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB6bGliID0gTm9uZQorICAgIGNyYzMyID0gYmluYXNjaWkuY3JjMzIKKworX19hbGxfXyA9IFsiQmFkWmlwZmlsZSIsICJlcnJvciIsICJaSVBfU1RPUkVEIiwgIlpJUF9ERUZMQVRFRCIsICJpc196aXBmaWxlIiwKKyAgICAgICAgICAgIlppcEluZm8iLCAiWmlwRmlsZSIsICJQeVppcEZpbGUiLCAiTGFyZ2VaaXBGaWxlIiBdCisKK2NsYXNzIEJhZFppcGZpbGUoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworY2xhc3MgTGFyZ2VaaXBGaWxlKEV4Y2VwdGlvbik6CisgICAgIiIiCisgICAgUmFpc2VkIHdoZW4gd3JpdGluZyBhIHppcGZpbGUsIHRoZSB6aXBmaWxlIHJlcXVpcmVzIFpJUDY0IGV4dGVuc2lvbnMKKyAgICBhbmQgdGhvc2UgZXh0ZW5zaW9ucyBhcmUgZGlzYWJsZWQuCisgICAgIiIiCisKK2Vycm9yID0gQmFkWmlwZmlsZSAgICAgICMgVGhlIGV4Y2VwdGlvbiByYWlzZWQgYnkgdGhpcyBtb2R1bGUKKworWklQNjRfTElNSVQgPSAoMSA8PCAzMSkgLSAxCitaSVBfRklMRUNPVU5UX0xJTUlUID0gMSA8PCAxNgorWklQX01BWF9DT01NRU5UID0gKDEgPDwgMTYpIC0gMQorCisjIGNvbnN0YW50cyBmb3IgWmlwIGZpbGUgY29tcHJlc3Npb24gbWV0aG9kcworWklQX1NUT1JFRCA9IDAKK1pJUF9ERUZMQVRFRCA9IDgKKyMgT3RoZXIgWklQIGNvbXByZXNzaW9uIG1ldGhvZHMgbm90IHN1cHBvcnRlZAorCisjIEJlbG93IGFyZSBzb21lIGZvcm1hdHMgYW5kIGFzc29jaWF0ZWQgZGF0YSBmb3IgcmVhZGluZy93cml0aW5nIGhlYWRlcnMgdXNpbmcKKyMgdGhlIHN0cnVjdCBtb2R1bGUuICBUaGUgbmFtZXMgYW5kIHN0cnVjdHVyZXMgb2YgaGVhZGVycy9yZWNvcmRzIGFyZSB0aG9zZSB1c2VkCisjIGluIHRoZSBQS1dBUkUgZGVzY3JpcHRpb24gb2YgdGhlIFpJUCBmaWxlIGZvcm1hdDoKKyMgICAgIGh0dHA6Ly93d3cucGt3YXJlLmNvbS9kb2N1bWVudHMvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQKKyMgKFVSTCB2YWxpZCBhcyBvZiBKYW51YXJ5IDIwMDgpCisKKyMgVGhlICJlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkiIHN0cnVjdHVyZSwgbWFnaWMgbnVtYmVyLCBzaXplLCBhbmQgaW5kaWNlcworIyAoc2VjdGlvbiBWLkkgaW4gdGhlIGZvcm1hdCBkb2N1bWVudCkKK3N0cnVjdEVuZEFyY2hpdmUgPSAiPDRzNEgyTEgiCitzdHJpbmdFbmRBcmNoaXZlID0gIlBLXDAwNVwwMDYiCitzaXplRW5kQ2VudERpciA9IHN0cnVjdC5jYWxjc2l6ZShzdHJ1Y3RFbmRBcmNoaXZlKQorCitfRUNEX1NJR05BVFVSRSA9IDAKK19FQ0RfRElTS19OVU1CRVIgPSAxCitfRUNEX0RJU0tfU1RBUlQgPSAyCitfRUNEX0VOVFJJRVNfVEhJU19ESVNLID0gMworX0VDRF9FTlRSSUVTX1RPVEFMID0gNAorX0VDRF9TSVpFID0gNQorX0VDRF9PRkZTRVQgPSA2CitfRUNEX0NPTU1FTlRfU0laRSA9IDcKKyMgVGhlc2UgbGFzdCB0d28gaW5kaWNlcyBhcmUgbm90IHBhcnQgb2YgdGhlIHN0cnVjdHVyZSBhcyBkZWZpbmVkIGluIHRoZQorIyBzcGVjLCBidXQgdGhleSBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoaXMgbW9kdWxlIGFzIGEgY29udmVuaWVuY2UKK19FQ0RfQ09NTUVOVCA9IDgKK19FQ0RfTE9DQVRJT04gPSA5CisKKyMgVGhlICJjZW50cmFsIGRpcmVjdG9yeSIgc3RydWN0dXJlLCBtYWdpYyBudW1iZXIsIHNpemUsIGFuZCBpbmRpY2VzCisjIG9mIGVudHJpZXMgaW4gdGhlIHN0cnVjdHVyZSAoc2VjdGlvbiBWLkYgaW4gdGhlIGZvcm1hdCBkb2N1bWVudCkKK3N0cnVjdENlbnRyYWxEaXIgPSAiPDRzNEI0SEwyTDVIMkwiCitzdHJpbmdDZW50cmFsRGlyID0gIlBLXDAwMVwwMDIiCitzaXplQ2VudHJhbERpciA9IHN0cnVjdC5jYWxjc2l6ZShzdHJ1Y3RDZW50cmFsRGlyKQorCisjIGluZGV4ZXMgb2YgZW50cmllcyBpbiB0aGUgY2VudHJhbCBkaXJlY3Rvcnkgc3RydWN0dXJlCitfQ0RfU0lHTkFUVVJFID0gMAorX0NEX0NSRUFURV9WRVJTSU9OID0gMQorX0NEX0NSRUFURV9TWVNURU0gPSAyCitfQ0RfRVhUUkFDVF9WRVJTSU9OID0gMworX0NEX0VYVFJBQ1RfU1lTVEVNID0gNAorX0NEX0ZMQUdfQklUUyA9IDUKK19DRF9DT01QUkVTU19UWVBFID0gNgorX0NEX1RJTUUgPSA3CitfQ0RfREFURSA9IDgKK19DRF9DUkMgPSA5CitfQ0RfQ09NUFJFU1NFRF9TSVpFID0gMTAKK19DRF9VTkNPTVBSRVNTRURfU0laRSA9IDExCitfQ0RfRklMRU5BTUVfTEVOR1RIID0gMTIKK19DRF9FWFRSQV9GSUVMRF9MRU5HVEggPSAxMworX0NEX0NPTU1FTlRfTEVOR1RIID0gMTQKK19DRF9ESVNLX05VTUJFUl9TVEFSVCA9IDE1CitfQ0RfSU5URVJOQUxfRklMRV9BVFRSSUJVVEVTID0gMTYKK19DRF9FWFRFUk5BTF9GSUxFX0FUVFJJQlVURVMgPSAxNworX0NEX0xPQ0FMX0hFQURFUl9PRkZTRVQgPSAxOAorCisjIFRoZSAibG9jYWwgZmlsZSBoZWFkZXIiIHN0cnVjdHVyZSwgbWFnaWMgbnVtYmVyLCBzaXplLCBhbmQgaW5kaWNlcworIyAoc2VjdGlvbiBWLkEgaW4gdGhlIGZvcm1hdCBkb2N1bWVudCkKK3N0cnVjdEZpbGVIZWFkZXIgPSAiPDRzMkI0SEwyTDJIIgorc3RyaW5nRmlsZUhlYWRlciA9ICJQS1wwMDNcMDA0Igorc2l6ZUZpbGVIZWFkZXIgPSBzdHJ1Y3QuY2FsY3NpemUoc3RydWN0RmlsZUhlYWRlcikKKworX0ZIX1NJR05BVFVSRSA9IDAKK19GSF9FWFRSQUNUX1ZFUlNJT04gPSAxCitfRkhfRVhUUkFDVF9TWVNURU0gPSAyCitfRkhfR0VORVJBTF9QVVJQT1NFX0ZMQUdfQklUUyA9IDMKK19GSF9DT01QUkVTU0lPTl9NRVRIT0QgPSA0CitfRkhfTEFTVF9NT0RfVElNRSA9IDUKK19GSF9MQVNUX01PRF9EQVRFID0gNgorX0ZIX0NSQyA9IDcKK19GSF9DT01QUkVTU0VEX1NJWkUgPSA4CitfRkhfVU5DT01QUkVTU0VEX1NJWkUgPSA5CitfRkhfRklMRU5BTUVfTEVOR1RIID0gMTAKK19GSF9FWFRSQV9GSUVMRF9MRU5HVEggPSAxMQorCisjIFRoZSAiWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IiIHN0cnVjdHVyZSwgbWFnaWMgbnVtYmVyLCBhbmQgc2l6ZQorc3RydWN0RW5kQXJjaGl2ZTY0TG9jYXRvciA9ICI8NHNMUUwiCitzdHJpbmdFbmRBcmNoaXZlNjRMb2NhdG9yID0gIlBLXHgwNlx4MDciCitzaXplRW5kQ2VudERpcjY0TG9jYXRvciA9IHN0cnVjdC5jYWxjc2l6ZShzdHJ1Y3RFbmRBcmNoaXZlNjRMb2NhdG9yKQorCisjIFRoZSAiWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IiByZWNvcmQsIG1hZ2ljIG51bWJlciwgc2l6ZSwgYW5kIGluZGljZXMKKyMgKHNlY3Rpb24gVi5HIGluIHRoZSBmb3JtYXQgZG9jdW1lbnQpCitzdHJ1Y3RFbmRBcmNoaXZlNjQgPSAiPDRzUTJIMkw0USIKK3N0cmluZ0VuZEFyY2hpdmU2NCA9ICJQS1x4MDZceDA2Igorc2l6ZUVuZENlbnREaXI2NCA9IHN0cnVjdC5jYWxjc2l6ZShzdHJ1Y3RFbmRBcmNoaXZlNjQpCisKK19DRDY0X1NJR05BVFVSRSA9IDAKK19DRDY0X0RJUkVDVE9SWV9SRUNTSVpFID0gMQorX0NENjRfQ1JFQVRFX1ZFUlNJT04gPSAyCitfQ0Q2NF9FWFRSQUNUX1ZFUlNJT04gPSAzCitfQ0Q2NF9ESVNLX05VTUJFUiA9IDQKK19DRDY0X0RJU0tfTlVNQkVSX1NUQVJUID0gNQorX0NENjRfTlVNQkVSX0VOVFJJRVNfVEhJU19ESVNLID0gNgorX0NENjRfTlVNQkVSX0VOVFJJRVNfVE9UQUwgPSA3CitfQ0Q2NF9ESVJFQ1RPUllfU0laRSA9IDgKK19DRDY0X09GRlNFVF9TVEFSVF9DRU5URElSID0gOQorCitkZWYgX2NoZWNrX3ppcGZpbGUoZnApOgorICAgIHRyeToKKyAgICAgICAgaWYgX0VuZFJlY0RhdGEoZnApOgorICAgICAgICAgICAgcmV0dXJuIFRydWUgICAgICAgICAjIGZpbGUgaGFzIGNvcnJlY3QgbWFnaWMgbnVtYmVyCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gRmFsc2UKKworZGVmIGlzX3ppcGZpbGUoZmlsZW5hbWUpOgorICAgICIiIlF1aWNrbHkgc2VlIGlmIGEgZmlsZSBpcyBhIFpJUCBmaWxlIGJ5IGNoZWNraW5nIHRoZSBtYWdpYyBudW1iZXIuCisKKyAgICBUaGUgZmlsZW5hbWUgYXJndW1lbnQgbWF5IGJlIGEgZmlsZSBvciBmaWxlLWxpa2Ugb2JqZWN0IHRvby4KKyAgICAiIiIKKyAgICByZXN1bHQgPSBGYWxzZQorICAgIHRyeToKKyAgICAgICAgaWYgaGFzYXR0cihmaWxlbmFtZSwgInJlYWQiKToKKyAgICAgICAgICAgIHJlc3VsdCA9IF9jaGVja196aXBmaWxlKGZwPWZpbGVuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiKSBhcyBmcDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBfY2hlY2tfemlwZmlsZShmcCkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcGFzcworICAgIHJldHVybiByZXN1bHQKKworZGVmIF9FbmRSZWNEYXRhNjQoZnBpbiwgb2Zmc2V0LCBlbmRyZWMpOgorICAgICIiIgorICAgIFJlYWQgdGhlIFpJUDY0IGVuZC1vZi1hcmNoaXZlIHJlY29yZHMgYW5kIHVzZSB0aGF0IHRvIHVwZGF0ZSBlbmRyZWMKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIGZwaW4uc2VlayhvZmZzZXQgLSBzaXplRW5kQ2VudERpcjY0TG9jYXRvciwgMikKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgIyBJZiB0aGUgc2VlayBmYWlscywgdGhlIGZpbGUgaXMgbm90IGxhcmdlIGVub3VnaCB0byBjb250YWluIGEgWklQNjQKKyAgICAgICAgIyBlbmQtb2YtYXJjaGl2ZSByZWNvcmQsIHNvIGp1c3QgcmV0dXJuIHRoZSBlbmQgcmVjb3JkIHdlIHdlcmUgZ2l2ZW4uCisgICAgICAgIHJldHVybiBlbmRyZWMKKworICAgIGRhdGEgPSBmcGluLnJlYWQoc2l6ZUVuZENlbnREaXI2NExvY2F0b3IpCisgICAgaWYgbGVuKGRhdGEpICE9IHNpemVFbmRDZW50RGlyNjRMb2NhdG9yOgorICAgICAgICByZXR1cm4gZW5kcmVjCisgICAgc2lnLCBkaXNrbm8sIHJlbG9mZiwgZGlza3MgPSBzdHJ1Y3QudW5wYWNrKHN0cnVjdEVuZEFyY2hpdmU2NExvY2F0b3IsIGRhdGEpCisgICAgaWYgc2lnICE9IHN0cmluZ0VuZEFyY2hpdmU2NExvY2F0b3I6CisgICAgICAgIHJldHVybiBlbmRyZWMKKworICAgIGlmIGRpc2tubyAhPSAwIG9yIGRpc2tzICE9IDE6CisgICAgICAgIHJhaXNlIEJhZFppcGZpbGUoInppcGZpbGVzIHRoYXQgc3BhbiBtdWx0aXBsZSBkaXNrcyBhcmUgbm90IHN1cHBvcnRlZCIpCisKKyAgICAjIEFzc3VtZSBubyAnemlwNjQgZXh0ZW5zaWJsZSBkYXRhJworICAgIGZwaW4uc2VlayhvZmZzZXQgLSBzaXplRW5kQ2VudERpcjY0TG9jYXRvciAtIHNpemVFbmRDZW50RGlyNjQsIDIpCisgICAgZGF0YSA9IGZwaW4ucmVhZChzaXplRW5kQ2VudERpcjY0KQorICAgIGlmIGxlbihkYXRhKSAhPSBzaXplRW5kQ2VudERpcjY0OgorICAgICAgICByZXR1cm4gZW5kcmVjCisgICAgc2lnLCBzeiwgY3JlYXRlX3ZlcnNpb24sIHJlYWRfdmVyc2lvbiwgZGlza19udW0sIGRpc2tfZGlyLCBcCisgICAgICAgICAgICBkaXJjb3VudCwgZGlyY291bnQyLCBkaXJzaXplLCBkaXJvZmZzZXQgPSBcCisgICAgICAgICAgICBzdHJ1Y3QudW5wYWNrKHN0cnVjdEVuZEFyY2hpdmU2NCwgZGF0YSkKKyAgICBpZiBzaWcgIT0gc3RyaW5nRW5kQXJjaGl2ZTY0OgorICAgICAgICByZXR1cm4gZW5kcmVjCisKKyAgICAjIFVwZGF0ZSB0aGUgb3JpZ2luYWwgZW5kcmVjIHVzaW5nIGRhdGEgZnJvbSB0aGUgWklQNjQgcmVjb3JkCisgICAgZW5kcmVjW19FQ0RfU0lHTkFUVVJFXSA9IHNpZworICAgIGVuZHJlY1tfRUNEX0RJU0tfTlVNQkVSXSA9IGRpc2tfbnVtCisgICAgZW5kcmVjW19FQ0RfRElTS19TVEFSVF0gPSBkaXNrX2RpcgorICAgIGVuZHJlY1tfRUNEX0VOVFJJRVNfVEhJU19ESVNLXSA9IGRpcmNvdW50CisgICAgZW5kcmVjW19FQ0RfRU5UUklFU19UT1RBTF0gPSBkaXJjb3VudDIKKyAgICBlbmRyZWNbX0VDRF9TSVpFXSA9IGRpcnNpemUKKyAgICBlbmRyZWNbX0VDRF9PRkZTRVRdID0gZGlyb2Zmc2V0CisgICAgcmV0dXJuIGVuZHJlYworCisKK2RlZiBfRW5kUmVjRGF0YShmcGluKToKKyAgICAiIiJSZXR1cm4gZGF0YSBmcm9tIHRoZSAiRW5kIG9mIENlbnRyYWwgRGlyZWN0b3J5IiByZWNvcmQsIG9yIE5vbmUuCisKKyAgICBUaGUgZGF0YSBpcyBhIGxpc3Qgb2YgdGhlIG5pbmUgaXRlbXMgaW4gdGhlIFpJUCAiRW5kIG9mIGNlbnRyYWwgZGlyIgorICAgIHJlY29yZCBmb2xsb3dlZCBieSBhIHRlbnRoIGl0ZW0sIHRoZSBmaWxlIHNlZWsgb2Zmc2V0IG9mIHRoaXMgcmVjb3JkLiIiIgorCisgICAgIyBEZXRlcm1pbmUgZmlsZSBzaXplCisgICAgZnBpbi5zZWVrKDAsIDIpCisgICAgZmlsZXNpemUgPSBmcGluLnRlbGwoKQorCisgICAgIyBDaGVjayB0byBzZWUgaWYgdGhpcyBpcyBaSVAgZmlsZSB3aXRoIG5vIGFyY2hpdmUgY29tbWVudCAodGhlCisgICAgIyAiZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IiBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHRoZSBsYXN0IGl0ZW0gaW4gdGhlCisgICAgIyBmaWxlIGlmIHRoaXMgaXMgdGhlIGNhc2UpLgorICAgIHRyeToKKyAgICAgICAgZnBpbi5zZWVrKC1zaXplRW5kQ2VudERpciwgMikKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBkYXRhID0gZnBpbi5yZWFkKCkKKyAgICBpZiAobGVuKGRhdGEpID09IHNpemVFbmRDZW50RGlyIGFuZAorICAgICAgICBkYXRhWzA6NF0gPT0gc3RyaW5nRW5kQXJjaGl2ZSBhbmQKKyAgICAgICAgZGF0YVstMjpdID09IGIiXDAwMFwwMDAiKToKKyAgICAgICAgIyB0aGUgc2lnbmF0dXJlIGlzIGNvcnJlY3QgYW5kIHRoZXJlJ3Mgbm8gY29tbWVudCwgdW5wYWNrIHN0cnVjdHVyZQorICAgICAgICBlbmRyZWMgPSBzdHJ1Y3QudW5wYWNrKHN0cnVjdEVuZEFyY2hpdmUsIGRhdGEpCisgICAgICAgIGVuZHJlYz1saXN0KGVuZHJlYykKKworICAgICAgICAjIEFwcGVuZCBhIGJsYW5rIGNvbW1lbnQgYW5kIHJlY29yZCBzdGFydCBvZmZzZXQKKyAgICAgICAgZW5kcmVjLmFwcGVuZCgiIikKKyAgICAgICAgZW5kcmVjLmFwcGVuZChmaWxlc2l6ZSAtIHNpemVFbmRDZW50RGlyKQorCisgICAgICAgICMgVHJ5IHRvIHJlYWQgdGhlICJaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkiIHN0cnVjdHVyZQorICAgICAgICByZXR1cm4gX0VuZFJlY0RhdGE2NChmcGluLCAtc2l6ZUVuZENlbnREaXIsIGVuZHJlYykKKworICAgICMgRWl0aGVyIHRoaXMgaXMgbm90IGEgWklQIGZpbGUsIG9yIGl0IGlzIGEgWklQIGZpbGUgd2l0aCBhbiBhcmNoaXZlCisgICAgIyBjb21tZW50LiAgU2VhcmNoIHRoZSBlbmQgb2YgdGhlIGZpbGUgZm9yIHRoZSAiZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IgorICAgICMgcmVjb3JkIHNpZ25hdHVyZS4gVGhlIGNvbW1lbnQgaXMgdGhlIGxhc3QgaXRlbSBpbiB0aGUgWklQIGZpbGUgYW5kIG1heSBiZQorICAgICMgdXAgdG8gNjRLIGxvbmcuICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlICJlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkiIG1hZ2ljCisgICAgIyBudW1iZXIgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBjb21tZW50LgorICAgIG1heENvbW1lbnRTdGFydCA9IG1heChmaWxlc2l6ZSAtICgxIDw8IDE2KSAtIHNpemVFbmRDZW50RGlyLCAwKQorICAgIGZwaW4uc2VlayhtYXhDb21tZW50U3RhcnQsIDApCisgICAgZGF0YSA9IGZwaW4ucmVhZCgpCisgICAgc3RhcnQgPSBkYXRhLnJmaW5kKHN0cmluZ0VuZEFyY2hpdmUpCisgICAgaWYgc3RhcnQgPj0gMDoKKyAgICAgICAgIyBmb3VuZCB0aGUgbWFnaWMgbnVtYmVyOyBhdHRlbXB0IHRvIHVucGFjayBhbmQgaW50ZXJwcmV0CisgICAgICAgIHJlY0RhdGEgPSBkYXRhW3N0YXJ0OnN0YXJ0K3NpemVFbmRDZW50RGlyXQorICAgICAgICBpZiBsZW4ocmVjRGF0YSkgIT0gc2l6ZUVuZENlbnREaXI6CisgICAgICAgICAgICAjIFppcCBmaWxlIGlzIGNvcnJ1cHRlZC4KKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVuZHJlYyA9IGxpc3Qoc3RydWN0LnVucGFjayhzdHJ1Y3RFbmRBcmNoaXZlLCByZWNEYXRhKSkKKyAgICAgICAgY29tbWVudFNpemUgPSBlbmRyZWNbX0VDRF9DT01NRU5UX1NJWkVdICNhcyBjbGFpbWVkIGJ5IHRoZSB6aXAgZmlsZQorICAgICAgICBjb21tZW50ID0gZGF0YVtzdGFydCtzaXplRW5kQ2VudERpcjpzdGFydCtzaXplRW5kQ2VudERpcitjb21tZW50U2l6ZV0KKyAgICAgICAgZW5kcmVjLmFwcGVuZChjb21tZW50KQorICAgICAgICBlbmRyZWMuYXBwZW5kKG1heENvbW1lbnRTdGFydCArIHN0YXJ0KQorCisgICAgICAgICMgVHJ5IHRvIHJlYWQgdGhlICJaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkiIHN0cnVjdHVyZQorICAgICAgICByZXR1cm4gX0VuZFJlY0RhdGE2NChmcGluLCBtYXhDb21tZW50U3RhcnQgKyBzdGFydCAtIGZpbGVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRyZWMpCisKKyAgICAjIFVuYWJsZSB0byBmaW5kIGEgdmFsaWQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHN0cnVjdHVyZQorICAgIHJldHVybiBOb25lCisKKworY2xhc3MgWmlwSW5mbyAob2JqZWN0KToKKyAgICAiIiJDbGFzcyB3aXRoIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyBlYWNoIGZpbGUgaW4gdGhlIFpJUCBhcmNoaXZlLiIiIgorCisgICAgX19zbG90c19fID0gKAorICAgICAgICAgICAgJ29yaWdfZmlsZW5hbWUnLAorICAgICAgICAgICAgJ2ZpbGVuYW1lJywKKyAgICAgICAgICAgICdkYXRlX3RpbWUnLAorICAgICAgICAgICAgJ2NvbXByZXNzX3R5cGUnLAorICAgICAgICAgICAgJ2NvbW1lbnQnLAorICAgICAgICAgICAgJ2V4dHJhJywKKyAgICAgICAgICAgICdjcmVhdGVfc3lzdGVtJywKKyAgICAgICAgICAgICdjcmVhdGVfdmVyc2lvbicsCisgICAgICAgICAgICAnZXh0cmFjdF92ZXJzaW9uJywKKyAgICAgICAgICAgICdyZXNlcnZlZCcsCisgICAgICAgICAgICAnZmxhZ19iaXRzJywKKyAgICAgICAgICAgICd2b2x1bWUnLAorICAgICAgICAgICAgJ2ludGVybmFsX2F0dHInLAorICAgICAgICAgICAgJ2V4dGVybmFsX2F0dHInLAorICAgICAgICAgICAgJ2hlYWRlcl9vZmZzZXQnLAorICAgICAgICAgICAgJ0NSQycsCisgICAgICAgICAgICAnY29tcHJlc3Nfc2l6ZScsCisgICAgICAgICAgICAnZmlsZV9zaXplJywKKyAgICAgICAgICAgICdfcmF3X3RpbWUnLAorICAgICAgICApCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWU9Ik5vTmFtZSIsIGRhdGVfdGltZT0oMTk4MCwxLDEsMCwwLDApKToKKyAgICAgICAgc2VsZi5vcmlnX2ZpbGVuYW1lID0gZmlsZW5hbWUgICAjIE9yaWdpbmFsIGZpbGUgbmFtZSBpbiBhcmNoaXZlCisKKyAgICAgICAgIyBUZXJtaW5hdGUgdGhlIGZpbGUgbmFtZSBhdCB0aGUgZmlyc3QgbnVsbCBieXRlLiAgTnVsbCBieXRlcyBpbiBmaWxlCisgICAgICAgICMgbmFtZXMgYXJlIHVzZWQgYXMgdHJpY2tzIGJ5IHZpcnVzZXMgaW4gYXJjaGl2ZXMuCisgICAgICAgIG51bGxfYnl0ZSA9IGZpbGVuYW1lLmZpbmQoY2hyKDApKQorICAgICAgICBpZiBudWxsX2J5dGUgPj0gMDoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbMDpudWxsX2J5dGVdCisgICAgICAgICMgVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSBwYXRocyBpbiBnZW5lcmF0ZWQgWklQIGZpbGVzIGFsd2F5cyB1c2UKKyAgICAgICAgIyBmb3J3YXJkIHNsYXNoZXMgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IsIGFzIHJlcXVpcmVkIGJ5IHRoZQorICAgICAgICAjIFpJUCBmb3JtYXQgc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgaWYgb3Muc2VwICE9ICIvIiBhbmQgb3Muc2VwIGluIGZpbGVuYW1lOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yZXBsYWNlKG9zLnNlcCwgIi8iKQorCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZSAgICAgICAgIyBOb3JtYWxpemVkIGZpbGUgbmFtZQorICAgICAgICBzZWxmLmRhdGVfdGltZSA9IGRhdGVfdGltZSAgICAgICMgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMKKworICAgICAgICBpZiBkYXRlX3RpbWVbMF0gPCAxOTgwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignWklQIGRvZXMgbm90IHN1cHBvcnQgdGltZXN0YW1wcyBiZWZvcmUgMTk4MCcpCisKKyAgICAgICAgIyBTdGFuZGFyZCB2YWx1ZXM6CisgICAgICAgIHNlbGYuY29tcHJlc3NfdHlwZSA9IFpJUF9TVE9SRUQgIyBUeXBlIG9mIGNvbXByZXNzaW9uIGZvciB0aGUgZmlsZQorICAgICAgICBzZWxmLmNvbW1lbnQgPSAiIiAgICAgICAgICAgICAgICMgQ29tbWVudCBmb3IgZWFjaCBmaWxlCisgICAgICAgIHNlbGYuZXh0cmEgPSAiIiAgICAgICAgICAgICAgICAgIyBaSVAgZXh0cmEgZGF0YQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlX3N5c3RlbSA9IDAgICAgICAgICAgIyBTeXN0ZW0gd2hpY2ggY3JlYXRlZCBaSVAgYXJjaGl2ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBBc3N1bWUgZXZlcnl0aGluZyBlbHNlIGlzIHVuaXgteQorICAgICAgICAgICAgc2VsZi5jcmVhdGVfc3lzdGVtID0gMyAgICAgICAgICAjIFN5c3RlbSB3aGljaCBjcmVhdGVkIFpJUCBhcmNoaXZlCisgICAgICAgIHNlbGYuY3JlYXRlX3ZlcnNpb24gPSAyMCAgICAgICAgIyBWZXJzaW9uIHdoaWNoIGNyZWF0ZWQgWklQIGFyY2hpdmUKKyAgICAgICAgc2VsZi5leHRyYWN0X3ZlcnNpb24gPSAyMCAgICAgICAjIFZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QgYXJjaGl2ZQorICAgICAgICBzZWxmLnJlc2VydmVkID0gMCAgICAgICAgICAgICAgICMgTXVzdCBiZSB6ZXJvCisgICAgICAgIHNlbGYuZmxhZ19iaXRzID0gMCAgICAgICAgICAgICAgIyBaSVAgZmxhZyBiaXRzCisgICAgICAgIHNlbGYudm9sdW1lID0gMCAgICAgICAgICAgICAgICAgIyBWb2x1bWUgbnVtYmVyIG9mIGZpbGUgaGVhZGVyCisgICAgICAgIHNlbGYuaW50ZXJuYWxfYXR0ciA9IDAgICAgICAgICAgIyBJbnRlcm5hbCBhdHRyaWJ1dGVzCisgICAgICAgIHNlbGYuZXh0ZXJuYWxfYXR0ciA9IDAgICAgICAgICAgIyBFeHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMKKyAgICAgICAgIyBPdGhlciBhdHRyaWJ1dGVzIGFyZSBzZXQgYnkgY2xhc3MgWmlwRmlsZToKKyAgICAgICAgIyBoZWFkZXJfb2Zmc2V0ICAgICAgICAgQnl0ZSBvZmZzZXQgdG8gdGhlIGZpbGUgaGVhZGVyCisgICAgICAgICMgQ1JDICAgICAgICAgICAgICAgICAgIENSQy0zMiBvZiB0aGUgdW5jb21wcmVzc2VkIGZpbGUKKyAgICAgICAgIyBjb21wcmVzc19zaXplICAgICAgICAgU2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBmaWxlCisgICAgICAgICMgZmlsZV9zaXplICAgICAgICAgICAgIFNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBmaWxlCisKKyAgICBkZWYgRmlsZUhlYWRlcihzZWxmLCB6aXA2ND1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBwZXItZmlsZSBoZWFkZXIgYXMgYSBzdHJpbmcuIiIiCisgICAgICAgIGR0ID0gc2VsZi5kYXRlX3RpbWUKKyAgICAgICAgZG9zZGF0ZSA9IChkdFswXSAtIDE5ODApIDw8IDkgfCBkdFsxXSA8PCA1IHwgZHRbMl0KKyAgICAgICAgZG9zdGltZSA9IGR0WzNdIDw8IDExIHwgZHRbNF0gPDwgNSB8IChkdFs1XSAvLyAyKQorICAgICAgICBpZiBzZWxmLmZsYWdfYml0cyAmIDB4MDg6CisgICAgICAgICAgICAjIFNldCB0aGVzZSB0byB6ZXJvIGJlY2F1c2Ugd2Ugd3JpdGUgdGhlbSBhZnRlciB0aGUgZmlsZSBkYXRhCisgICAgICAgICAgICBDUkMgPSBjb21wcmVzc19zaXplID0gZmlsZV9zaXplID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgQ1JDID0gc2VsZi5DUkMKKyAgICAgICAgICAgIGNvbXByZXNzX3NpemUgPSBzZWxmLmNvbXByZXNzX3NpemUKKyAgICAgICAgICAgIGZpbGVfc2l6ZSA9IHNlbGYuZmlsZV9zaXplCisKKyAgICAgICAgZXh0cmEgPSBzZWxmLmV4dHJhCisKKyAgICAgICAgaWYgemlwNjQgaXMgTm9uZToKKyAgICAgICAgICAgIHppcDY0ID0gZmlsZV9zaXplID4gWklQNjRfTElNSVQgb3IgY29tcHJlc3Nfc2l6ZSA+IFpJUDY0X0xJTUlUCisgICAgICAgIGlmIHppcDY0OgorICAgICAgICAgICAgZm10ID0gJzxISFFRJworICAgICAgICAgICAgZXh0cmEgPSBleHRyYSArIHN0cnVjdC5wYWNrKGZtdCwKKyAgICAgICAgICAgICAgICAgICAgMSwgc3RydWN0LmNhbGNzaXplKGZtdCktNCwgZmlsZV9zaXplLCBjb21wcmVzc19zaXplKQorICAgICAgICBpZiBmaWxlX3NpemUgPiBaSVA2NF9MSU1JVCBvciBjb21wcmVzc19zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICBpZiBub3QgemlwNjQ6CisgICAgICAgICAgICAgICAgcmFpc2UgTGFyZ2VaaXBGaWxlKCJGaWxlc2l6ZSB3b3VsZCByZXF1aXJlIFpJUDY0IGV4dGVuc2lvbnMiKQorICAgICAgICAgICAgIyBGaWxlIGlzIGxhcmdlciB0aGFuIHdoYXQgZml0cyBpbnRvIGEgNCBieXRlIGludGVnZXIsCisgICAgICAgICAgICAjIGZhbGwgYmFjayB0byB0aGUgWklQNjQgZXh0ZW5zaW9uCisgICAgICAgICAgICBmaWxlX3NpemUgPSAweGZmZmZmZmZmCisgICAgICAgICAgICBjb21wcmVzc19zaXplID0gMHhmZmZmZmZmZgorICAgICAgICAgICAgc2VsZi5leHRyYWN0X3ZlcnNpb24gPSBtYXgoNDUsIHNlbGYuZXh0cmFjdF92ZXJzaW9uKQorICAgICAgICAgICAgc2VsZi5jcmVhdGVfdmVyc2lvbiA9IG1heCg0NSwgc2VsZi5leHRyYWN0X3ZlcnNpb24pCisKKyAgICAgICAgZmlsZW5hbWUsIGZsYWdfYml0cyA9IHNlbGYuX2VuY29kZUZpbGVuYW1lRmxhZ3MoKQorICAgICAgICBoZWFkZXIgPSBzdHJ1Y3QucGFjayhzdHJ1Y3RGaWxlSGVhZGVyLCBzdHJpbmdGaWxlSGVhZGVyLAorICAgICAgICAgICAgICAgICBzZWxmLmV4dHJhY3RfdmVyc2lvbiwgc2VsZi5yZXNlcnZlZCwgZmxhZ19iaXRzLAorICAgICAgICAgICAgICAgICBzZWxmLmNvbXByZXNzX3R5cGUsIGRvc3RpbWUsIGRvc2RhdGUsIENSQywKKyAgICAgICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSwgZmlsZV9zaXplLAorICAgICAgICAgICAgICAgICBsZW4oZmlsZW5hbWUpLCBsZW4oZXh0cmEpKQorICAgICAgICByZXR1cm4gaGVhZGVyICsgZmlsZW5hbWUgKyBleHRyYQorCisgICAgZGVmIF9lbmNvZGVGaWxlbmFtZUZsYWdzKHNlbGYpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZmlsZW5hbWUsIHVuaWNvZGUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lLmVuY29kZSgnYXNjaWknKSwgc2VsZi5mbGFnX2JpdHMKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWUuZW5jb2RlKCd1dGYtOCcpLCBzZWxmLmZsYWdfYml0cyB8IDB4ODAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZSwgc2VsZi5mbGFnX2JpdHMKKworICAgIGRlZiBfZGVjb2RlRmlsZW5hbWUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZmxhZ19iaXRzICYgMHg4MDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lCisKKyAgICBkZWYgX2RlY29kZUV4dHJhKHNlbGYpOgorICAgICAgICAjIFRyeSB0byBkZWNvZGUgdGhlIGV4dHJhIGZpZWxkLgorICAgICAgICBleHRyYSA9IHNlbGYuZXh0cmEKKyAgICAgICAgdW5wYWNrID0gc3RydWN0LnVucGFjaworICAgICAgICB3aGlsZSBleHRyYToKKyAgICAgICAgICAgIHRwLCBsbiA9IHVucGFjaygnPEhIJywgZXh0cmFbOjRdKQorICAgICAgICAgICAgaWYgdHAgPT0gMToKKyAgICAgICAgICAgICAgICBpZiBsbiA+PSAyNDoKKyAgICAgICAgICAgICAgICAgICAgY291bnRzID0gdW5wYWNrKCc8UVFRJywgZXh0cmFbNDoyOF0pCisgICAgICAgICAgICAgICAgZWxpZiBsbiA9PSAxNjoKKyAgICAgICAgICAgICAgICAgICAgY291bnRzID0gdW5wYWNrKCc8UVEnLCBleHRyYVs0OjIwXSkKKyAgICAgICAgICAgICAgICBlbGlmIGxuID09IDg6CisgICAgICAgICAgICAgICAgICAgIGNvdW50cyA9IHVucGFjaygnPFEnLCBleHRyYVs0OjEyXSkKKyAgICAgICAgICAgICAgICBlbGlmIGxuID09IDA6CisgICAgICAgICAgICAgICAgICAgIGNvdW50cyA9ICgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiQ29ycnVwdCBleHRyYSBmaWVsZCAlcyIlKGxuLCkKKworICAgICAgICAgICAgICAgIGlkeCA9IDAKKworICAgICAgICAgICAgICAgICMgWklQNjQgZXh0ZW5zaW9uIChsYXJnZSBmaWxlcyBhbmQvb3IgbGFyZ2UgYXJjaGl2ZXMpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5maWxlX3NpemUgaW4gKDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZMKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlX3NpemUgPSBjb3VudHNbaWR4XQorICAgICAgICAgICAgICAgICAgICBpZHggKz0gMQorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jb21wcmVzc19zaXplID09IDB4RkZGRkZGRkZMOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbXByZXNzX3NpemUgPSBjb3VudHNbaWR4XQorICAgICAgICAgICAgICAgICAgICBpZHggKz0gMQorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5oZWFkZXJfb2Zmc2V0ID09IDB4ZmZmZmZmZmZMOgorICAgICAgICAgICAgICAgICAgICBvbGQgPSBzZWxmLmhlYWRlcl9vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJfb2Zmc2V0ID0gY291bnRzW2lkeF0KKyAgICAgICAgICAgICAgICAgICAgaWR4Kz0xCisKKyAgICAgICAgICAgIGV4dHJhID0gZXh0cmFbbG4rNDpdCisKKworY2xhc3MgX1ppcERlY3J5cHRlcjoKKyAgICAiIiJDbGFzcyB0byBoYW5kbGUgZGVjcnlwdGlvbiBvZiBmaWxlcyBzdG9yZWQgd2l0aGluIGEgWklQIGFyY2hpdmUuCisKKyAgICBaSVAgc3VwcG9ydHMgYSBwYXNzd29yZC1iYXNlZCBmb3JtIG9mIGVuY3J5cHRpb24uIEV2ZW4gdGhvdWdoIGtub3duCisgICAgcGxhaW50ZXh0IGF0dGFja3MgaGF2ZSBiZWVuIGZvdW5kIGFnYWluc3QgaXQsIGl0IGlzIHN0aWxsIHVzZWZ1bAorICAgIHRvIGJlIGFibGUgdG8gZ2V0IGRhdGEgb3V0IG9mIHN1Y2ggYSBmaWxlLgorCisgICAgVXNhZ2U6CisgICAgICAgIHpkID0gX1ppcERlY3J5cHRlcihteXB3ZCkKKyAgICAgICAgcGxhaW5fY2hhciA9IHpkKGN5cGhlcl9jaGFyKQorICAgICAgICBwbGFpbl90ZXh0ID0gbWFwKHpkLCBjeXBoZXJfdGV4dCkKKyAgICAiIiIKKworICAgIGRlZiBfR2VuZXJhdGVDUkNUYWJsZSgpOgorICAgICAgICAiIiJHZW5lcmF0ZSBhIENSQy0zMiB0YWJsZS4KKworICAgICAgICBaSVAgZW5jcnlwdGlvbiB1c2VzIHRoZSBDUkMzMiBvbmUtYnl0ZSBwcmltaXRpdmUgZm9yIHNjcmFtYmxpbmcgc29tZQorICAgICAgICBpbnRlcm5hbCBrZXlzLiBXZSBub3RpY2VkIHRoYXQgYSBkaXJlY3QgaW1wbGVtZW50YXRpb24gaXMgZmFzdGVyIHRoYW4KKyAgICAgICAgcmVseWluZyBvbiBiaW5hc2NpaS5jcmMzMigpLgorICAgICAgICAiIiIKKyAgICAgICAgcG9seSA9IDB4ZWRiODgzMjAKKyAgICAgICAgdGFibGUgPSBbMF0gKiAyNTYKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgIGNyYyA9IGkKKyAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKDgpOgorICAgICAgICAgICAgICAgIGlmIGNyYyAmIDE6CisgICAgICAgICAgICAgICAgICAgIGNyYyA9ICgoY3JjID4+IDEpICYgMHg3RkZGRkZGRikgXiBwb2x5CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY3JjID0gKChjcmMgPj4gMSkgJiAweDdGRkZGRkZGKQorICAgICAgICAgICAgdGFibGVbaV0gPSBjcmMKKyAgICAgICAgcmV0dXJuIHRhYmxlCisgICAgY3JjdGFibGUgPSBfR2VuZXJhdGVDUkNUYWJsZSgpCisKKyAgICBkZWYgX2NyYzMyKHNlbGYsIGNoLCBjcmMpOgorICAgICAgICAiIiJDb21wdXRlIHRoZSBDUkMzMiBwcmltaXRpdmUgb24gb25lIGJ5dGUuIiIiCisgICAgICAgIHJldHVybiAoKGNyYyA+PiA4KSAmIDB4ZmZmZmZmKSBeIHNlbGYuY3JjdGFibGVbKGNyYyBeIG9yZChjaCkpICYgMHhmZl0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwd2QpOgorICAgICAgICBzZWxmLmtleTAgPSAzMDU0MTk4OTYKKyAgICAgICAgc2VsZi5rZXkxID0gNTkxNzUxMDQ5CisgICAgICAgIHNlbGYua2V5MiA9IDg3ODA4MjE5MgorICAgICAgICBmb3IgcCBpbiBwd2Q6CisgICAgICAgICAgICBzZWxmLl9VcGRhdGVLZXlzKHApCisKKyAgICBkZWYgX1VwZGF0ZUtleXMoc2VsZiwgYyk6CisgICAgICAgIHNlbGYua2V5MCA9IHNlbGYuX2NyYzMyKGMsIHNlbGYua2V5MCkKKyAgICAgICAgc2VsZi5rZXkxID0gKHNlbGYua2V5MSArIChzZWxmLmtleTAgJiAyNTUpKSAmIDQyOTQ5NjcyOTUKKyAgICAgICAgc2VsZi5rZXkxID0gKHNlbGYua2V5MSAqIDEzNDc3NTgxMyArIDEpICYgNDI5NDk2NzI5NQorICAgICAgICBzZWxmLmtleTIgPSBzZWxmLl9jcmMzMihjaHIoKHNlbGYua2V5MSA+PiAyNCkgJiAyNTUpLCBzZWxmLmtleTIpCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgYyk6CisgICAgICAgICIiIkRlY3J5cHQgYSBzaW5nbGUgY2hhcmFjdGVyLiIiIgorICAgICAgICBjID0gb3JkKGMpCisgICAgICAgIGsgPSBzZWxmLmtleTIgfCAyCisgICAgICAgIGMgPSBjIF4gKCgoayAqIChrXjEpKSA+PiA4KSAmIDI1NSkKKyAgICAgICAgYyA9IGNocihjKQorICAgICAgICBzZWxmLl9VcGRhdGVLZXlzKGMpCisgICAgICAgIHJldHVybiBjCisKKworY29tcHJlc3Nvcl9uYW1lcyA9IHsKKyAgICAwOiAnc3RvcmUnLAorICAgIDE6ICdzaHJpbmsnLAorICAgIDI6ICdyZWR1Y2UnLAorICAgIDM6ICdyZWR1Y2UnLAorICAgIDQ6ICdyZWR1Y2UnLAorICAgIDU6ICdyZWR1Y2UnLAorICAgIDY6ICdpbXBsb2RlJywKKyAgICA3OiAndG9rZW5pemUnLAorICAgIDg6ICdkZWZsYXRlJywKKyAgICA5OiAnZGVmbGF0ZTY0JywKKyAgICAxMDogJ2ltcGxvZGUnLAorICAgIDEyOiAnYnppcDInLAorICAgIDE0OiAnbHptYScsCisgICAgMTg6ICd0ZXJzZScsCisgICAgMTk6ICdsejc3JywKKyAgICA5NzogJ3dhdnBhY2snLAorICAgIDk4OiAncHBtZCcsCit9CisKKworY2xhc3MgWmlwRXh0RmlsZShpby5CdWZmZXJlZElPQmFzZSk6CisgICAgIiIiRmlsZS1saWtlIG9iamVjdCBmb3IgcmVhZGluZyBhbiBhcmNoaXZlIG1lbWJlci4KKyAgICAgICBJcyByZXR1cm5lZCBieSBaaXBGaWxlLm9wZW4oKS4KKyAgICAiIiIKKworICAgICMgTWF4IHNpemUgc3VwcG9ydGVkIGJ5IGRlY29tcHJlc3Nvci4KKyAgICBNQVhfTiA9IDEgPDwgMzEgLSAxCisKKyAgICAjIFJlYWQgZnJvbSBjb21wcmVzc2VkIGZpbGVzIGluIDRrIGJsb2Nrcy4KKyAgICBNSU5fUkVBRF9TSVpFID0gNDA5NgorCisgICAgIyBTZWFyY2ggZm9yIHVuaXZlcnNhbCBuZXdsaW5lcyBvciBsaW5lIGNodW5rcy4KKyAgICBQQVRURVJOID0gcmUuY29tcGlsZShyJ14oP1A8Y2h1bms+W15cclxuXSspfCg/UDxuZXdsaW5lPlxufFxyXG4/KScpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaiwgbW9kZSwgemlwaW5mbywgZGVjcnlwdGVyPU5vbmUsCisgICAgICAgICAgICBjbG9zZV9maWxlb2JqPUZhbHNlKToKKyAgICAgICAgc2VsZi5fZmlsZW9iaiA9IGZpbGVvYmoKKyAgICAgICAgc2VsZi5fZGVjcnlwdGVyID0gZGVjcnlwdGVyCisgICAgICAgIHNlbGYuX2Nsb3NlX2ZpbGVvYmogPSBjbG9zZV9maWxlb2JqCisKKyAgICAgICAgc2VsZi5fY29tcHJlc3NfdHlwZSA9IHppcGluZm8uY29tcHJlc3NfdHlwZQorICAgICAgICBzZWxmLl9jb21wcmVzc19zaXplID0gemlwaW5mby5jb21wcmVzc19zaXplCisgICAgICAgIHNlbGYuX2NvbXByZXNzX2xlZnQgPSB6aXBpbmZvLmNvbXByZXNzX3NpemUKKworICAgICAgICBpZiBzZWxmLl9jb21wcmVzc190eXBlID09IFpJUF9ERUZMQVRFRDoKKyAgICAgICAgICAgIHNlbGYuX2RlY29tcHJlc3NvciA9IHpsaWIuZGVjb21wcmVzc29iaigtMTUpCisgICAgICAgIGVsaWYgc2VsZi5fY29tcHJlc3NfdHlwZSAhPSBaSVBfU1RPUkVEOgorICAgICAgICAgICAgZGVzY3IgPSBjb21wcmVzc29yX25hbWVzLmdldChzZWxmLl9jb21wcmVzc190eXBlKQorICAgICAgICAgICAgaWYgZGVzY3I6CisgICAgICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiY29tcHJlc3Npb24gdHlwZSAlZCAoJXMpIiAlIChzZWxmLl9jb21wcmVzc190eXBlLCBkZXNjcikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoImNvbXByZXNzaW9uIHR5cGUgJWQiICUgKHNlbGYuX2NvbXByZXNzX3R5cGUsKSkKKyAgICAgICAgc2VsZi5fdW5jb25zdW1lZCA9ICcnCisKKyAgICAgICAgc2VsZi5fcmVhZGJ1ZmZlciA9ICcnCisgICAgICAgIHNlbGYuX29mZnNldCA9IDAKKworICAgICAgICBzZWxmLl91bml2ZXJzYWwgPSAnVScgaW4gbW9kZQorICAgICAgICBzZWxmLm5ld2xpbmVzID0gTm9uZQorCisgICAgICAgICMgQWRqdXN0IHJlYWQgc2l6ZSBmb3IgZW5jcnlwdGVkIGZpbGVzIHNpbmNlIHRoZSBmaXJzdCAxMiBieXRlcworICAgICAgICAjIGFyZSBmb3IgdGhlIGVuY3J5cHRpb24vcGFzc3dvcmQgaW5mb3JtYXRpb24uCisgICAgICAgIGlmIHNlbGYuX2RlY3J5cHRlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2NvbXByZXNzX2xlZnQgLT0gMTIKKworICAgICAgICBzZWxmLm1vZGUgPSBtb2RlCisgICAgICAgIHNlbGYubmFtZSA9IHppcGluZm8uZmlsZW5hbWUKKworICAgICAgICBpZiBoYXNhdHRyKHppcGluZm8sICdDUkMnKToKKyAgICAgICAgICAgIHNlbGYuX2V4cGVjdGVkX2NyYyA9IHppcGluZm8uQ1JDCisgICAgICAgICAgICBzZWxmLl9ydW5uaW5nX2NyYyA9IGNyYzMyKGInJykgJiAweGZmZmZmZmZmCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9leHBlY3RlZF9jcmMgPSBOb25lCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgbGltaXQ9LTEpOgorICAgICAgICAiIiJSZWFkIGFuZCByZXR1cm4gYSBsaW5lIGZyb20gdGhlIHN0cmVhbS4KKworICAgICAgICBJZiBsaW1pdCBpcyBzcGVjaWZpZWQsIGF0IG1vc3QgbGltaXQgYnl0ZXMgd2lsbCBiZSByZWFkLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBub3Qgc2VsZi5fdW5pdmVyc2FsIGFuZCBsaW1pdCA8IDA6CisgICAgICAgICAgICAjIFNob3J0Y3V0IGNvbW1vbiBjYXNlIC0gbmV3bGluZSBmb3VuZCBpbiBidWZmZXIuCisgICAgICAgICAgICBpID0gc2VsZi5fcmVhZGJ1ZmZlci5maW5kKCdcbicsIHNlbGYuX29mZnNldCkgKyAxCisgICAgICAgICAgICBpZiBpID4gMDoKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5fcmVhZGJ1ZmZlcltzZWxmLl9vZmZzZXQ6IGldCisgICAgICAgICAgICAgICAgc2VsZi5fb2Zmc2V0ID0gaQorICAgICAgICAgICAgICAgIHJldHVybiBsaW5lCisKKyAgICAgICAgaWYgbm90IHNlbGYuX3VuaXZlcnNhbDoKKyAgICAgICAgICAgIHJldHVybiBpby5CdWZmZXJlZElPQmFzZS5yZWFkbGluZShzZWxmLCBsaW1pdCkKKworICAgICAgICBsaW5lID0gJycKKyAgICAgICAgd2hpbGUgbGltaXQgPCAwIG9yIGxlbihsaW5lKSA8IGxpbWl0OgorICAgICAgICAgICAgcmVhZGFoZWFkID0gc2VsZi5wZWVrKDIpCisgICAgICAgICAgICBpZiByZWFkYWhlYWQgPT0gJyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUKKworICAgICAgICAgICAgIworICAgICAgICAgICAgIyBTZWFyY2ggZm9yIHVuaXZlcnNhbCBuZXdsaW5lcyBvciBsaW5lIGNodW5rcy4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhlIHBhdHRlcm4gcmV0dXJucyBlaXRoZXIgYSBsaW5lIGNodW5rIG9yIGEgbmV3bGluZSwgYnV0IG5vdAorICAgICAgICAgICAgIyBib3RoLiBDb21iaW5lZCB3aXRoIHBlZWsoMiksIHdlIGFyZSBhc3N1cmVkIHRoYXQgdGhlIHNlcXVlbmNlCisgICAgICAgICAgICAjICdcclxuJyBpcyBhbHdheXMgcmV0cmlldmVkIGNvbXBsZXRlbHkgYW5kIG5ldmVyIHNwbGl0IGludG8KKyAgICAgICAgICAgICMgc2VwYXJhdGUgbmV3bGluZXMgLSAnXHInLCAnXG4nIGR1ZSB0byBjb2luY2lkZW50YWwgcmVhZGFoZWFkcy4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIG1hdGNoID0gc2VsZi5QQVRURVJOLnNlYXJjaChyZWFkYWhlYWQpCisgICAgICAgICAgICBuZXdsaW5lID0gbWF0Y2guZ3JvdXAoJ25ld2xpbmUnKQorICAgICAgICAgICAgaWYgbmV3bGluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLm5ld2xpbmVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubmV3bGluZXMgPSBbXQorICAgICAgICAgICAgICAgIGlmIG5ld2xpbmUgbm90IGluIHNlbGYubmV3bGluZXM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubmV3bGluZXMuYXBwZW5kKG5ld2xpbmUpCisgICAgICAgICAgICAgICAgc2VsZi5fb2Zmc2V0ICs9IGxlbihuZXdsaW5lKQorICAgICAgICAgICAgICAgIHJldHVybiBsaW5lICsgJ1xuJworCisgICAgICAgICAgICBjaHVuayA9IG1hdGNoLmdyb3VwKCdjaHVuaycpCisgICAgICAgICAgICBpZiBsaW1pdCA+PSAwOgorICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmtbOiBsaW1pdCAtIGxlbihsaW5lKV0KKworICAgICAgICAgICAgc2VsZi5fb2Zmc2V0ICs9IGxlbihjaHVuaykKKyAgICAgICAgICAgIGxpbmUgKz0gY2h1bmsKKworICAgICAgICByZXR1cm4gbGluZQorCisgICAgZGVmIHBlZWsoc2VsZiwgbj0xKToKKyAgICAgICAgIiIiUmV0dXJucyBidWZmZXJlZCBieXRlcyB3aXRob3V0IGFkdmFuY2luZyB0aGUgcG9zaXRpb24uIiIiCisgICAgICAgIGlmIG4gPiBsZW4oc2VsZi5fcmVhZGJ1ZmZlcikgLSBzZWxmLl9vZmZzZXQ6CisgICAgICAgICAgICBjaHVuayA9IHNlbGYucmVhZChuKQorICAgICAgICAgICAgc2VsZi5fb2Zmc2V0IC09IGxlbihjaHVuaykKKworICAgICAgICAjIFJldHVybiB1cCB0byA1MTIgYnl0ZXMgdG8gcmVkdWNlIGFsbG9jYXRpb24gb3ZlcmhlYWQgZm9yIHRpZ2h0IGxvb3BzLgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZGJ1ZmZlcltzZWxmLl9vZmZzZXQ6IHNlbGYuX29mZnNldCArIDUxMl0KKworICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZWFkKHNlbGYsIG49LTEpOgorICAgICAgICAiIiJSZWFkIGFuZCByZXR1cm4gdXAgdG8gbiBieXRlcy4KKyAgICAgICAgSWYgdGhlIGFyZ3VtZW50IGlzIG9taXR0ZWQsIE5vbmUsIG9yIG5lZ2F0aXZlLCBkYXRhIGlzIHJlYWQgYW5kIHJldHVybmVkIHVudGlsIEVPRiBpcyByZWFjaGVkLi4KKyAgICAgICAgIiIiCisgICAgICAgIGJ1ZiA9ICcnCisgICAgICAgIGlmIG4gaXMgTm9uZToKKyAgICAgICAgICAgIG4gPSAtMQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaWYgbiA8IDA6CisgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYucmVhZDEobikKKyAgICAgICAgICAgIGVsaWYgbiA+IGxlbihidWYpOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJlYWQxKG4gLSBsZW4oYnVmKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZgorICAgICAgICAgICAgaWYgbGVuKGRhdGEpID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZgorICAgICAgICAgICAgYnVmICs9IGRhdGEKKworICAgIGRlZiBfdXBkYXRlX2NyYyhzZWxmLCBuZXdkYXRhLCBlb2YpOgorICAgICAgICAjIFVwZGF0ZSB0aGUgQ1JDIHVzaW5nIHRoZSBnaXZlbiBkYXRhLgorICAgICAgICBpZiBzZWxmLl9leHBlY3RlZF9jcmMgaXMgTm9uZToKKyAgICAgICAgICAgICMgTm8gbmVlZCB0byBjb21wdXRlIHRoZSBDUkMgaWYgd2UgZG9uJ3QgaGF2ZSBhIHJlZmVyZW5jZSB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX3J1bm5pbmdfY3JjID0gY3JjMzIobmV3ZGF0YSwgc2VsZi5fcnVubmluZ19jcmMpICYgMHhmZmZmZmZmZgorICAgICAgICAjIENoZWNrIHRoZSBDUkMgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZQorICAgICAgICBpZiBlb2YgYW5kIHNlbGYuX3J1bm5pbmdfY3JjICE9IHNlbGYuX2V4cGVjdGVkX2NyYzoKKyAgICAgICAgICAgIHJhaXNlIEJhZFppcGZpbGUoIkJhZCBDUkMtMzIgZm9yIGZpbGUgJXIiICUgc2VsZi5uYW1lKQorCisgICAgZGVmIHJlYWQxKHNlbGYsIG4pOgorICAgICAgICAiIiJSZWFkIHVwIHRvIG4gYnl0ZXMgd2l0aCBhdCBtb3N0IG9uZSByZWFkKCkgc3lzdGVtIGNhbGwuIiIiCisKKyAgICAgICAgIyBTaW1wbGlmeSBhbGdvcml0aG0gKGJyYW5jaGluZykgYnkgdHJhbnNmb3JtaW5nIG5lZ2F0aXZlIG4gdG8gbGFyZ2Ugbi4KKyAgICAgICAgaWYgbiA8IDAgb3IgbiBpcyBOb25lOgorICAgICAgICAgICAgbiA9IHNlbGYuTUFYX04KKworICAgICAgICAjIEJ5dGVzIGF2YWlsYWJsZSBpbiByZWFkIGJ1ZmZlci4KKyAgICAgICAgbGVuX3JlYWRidWZmZXIgPSBsZW4oc2VsZi5fcmVhZGJ1ZmZlcikgLSBzZWxmLl9vZmZzZXQKKworICAgICAgICAjIFJlYWQgZnJvbSBmaWxlLgorICAgICAgICBpZiBzZWxmLl9jb21wcmVzc19sZWZ0ID4gMCBhbmQgbiA+IGxlbl9yZWFkYnVmZmVyICsgbGVuKHNlbGYuX3VuY29uc3VtZWQpOgorICAgICAgICAgICAgbmJ5dGVzID0gbiAtIGxlbl9yZWFkYnVmZmVyIC0gbGVuKHNlbGYuX3VuY29uc3VtZWQpCisgICAgICAgICAgICBuYnl0ZXMgPSBtYXgobmJ5dGVzLCBzZWxmLk1JTl9SRUFEX1NJWkUpCisgICAgICAgICAgICBuYnl0ZXMgPSBtaW4obmJ5dGVzLCBzZWxmLl9jb21wcmVzc19sZWZ0KQorCisgICAgICAgICAgICBkYXRhID0gc2VsZi5fZmlsZW9iai5yZWFkKG5ieXRlcykKKyAgICAgICAgICAgIHNlbGYuX2NvbXByZXNzX2xlZnQgLT0gbGVuKGRhdGEpCisKKyAgICAgICAgICAgIGlmIGRhdGEgYW5kIHNlbGYuX2RlY3J5cHRlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBkYXRhID0gJycuam9pbihtYXAoc2VsZi5fZGVjcnlwdGVyLCBkYXRhKSkKKworICAgICAgICAgICAgaWYgc2VsZi5fY29tcHJlc3NfdHlwZSA9PSBaSVBfU1RPUkVEOgorICAgICAgICAgICAgICAgIHNlbGYuX3VwZGF0ZV9jcmMoZGF0YSwgZW9mPShzZWxmLl9jb21wcmVzc19sZWZ0PT0wKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9yZWFkYnVmZmVyID0gc2VsZi5fcmVhZGJ1ZmZlcltzZWxmLl9vZmZzZXQ6XSArIGRhdGEKKyAgICAgICAgICAgICAgICBzZWxmLl9vZmZzZXQgPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgUHJlcGFyZSBkZWZsYXRlZCBieXRlcyBmb3IgZGVjb21wcmVzc2lvbi4KKyAgICAgICAgICAgICAgICBzZWxmLl91bmNvbnN1bWVkICs9IGRhdGEKKworICAgICAgICAjIEhhbmRsZSB1bmNvbnN1bWVkIGRhdGEuCisgICAgICAgIGlmIChsZW4oc2VsZi5fdW5jb25zdW1lZCkgPiAwIGFuZCBuID4gbGVuX3JlYWRidWZmZXIgYW5kCisgICAgICAgICAgICBzZWxmLl9jb21wcmVzc190eXBlID09IFpJUF9ERUZMQVRFRCk6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5fZGVjb21wcmVzc29yLmRlY29tcHJlc3MoCisgICAgICAgICAgICAgICAgc2VsZi5fdW5jb25zdW1lZCwKKyAgICAgICAgICAgICAgICBtYXgobiAtIGxlbl9yZWFkYnVmZmVyLCBzZWxmLk1JTl9SRUFEX1NJWkUpCisgICAgICAgICAgICApCisKKyAgICAgICAgICAgIHNlbGYuX3VuY29uc3VtZWQgPSBzZWxmLl9kZWNvbXByZXNzb3IudW5jb25zdW1lZF90YWlsCisgICAgICAgICAgICBlb2YgPSBsZW4oc2VsZi5fdW5jb25zdW1lZCkgPT0gMCBhbmQgc2VsZi5fY29tcHJlc3NfbGVmdCA9PSAwCisgICAgICAgICAgICBpZiBlb2Y6CisgICAgICAgICAgICAgICAgZGF0YSArPSBzZWxmLl9kZWNvbXByZXNzb3IuZmx1c2goKQorCisgICAgICAgICAgICBzZWxmLl91cGRhdGVfY3JjKGRhdGEsIGVvZj1lb2YpCisgICAgICAgICAgICBzZWxmLl9yZWFkYnVmZmVyID0gc2VsZi5fcmVhZGJ1ZmZlcltzZWxmLl9vZmZzZXQ6XSArIGRhdGEKKyAgICAgICAgICAgIHNlbGYuX29mZnNldCA9IDAKKworICAgICAgICAjIFJlYWQgZnJvbSBidWZmZXIuCisgICAgICAgIGRhdGEgPSBzZWxmLl9yZWFkYnVmZmVyW3NlbGYuX29mZnNldDogc2VsZi5fb2Zmc2V0ICsgbl0KKyAgICAgICAgc2VsZi5fb2Zmc2V0ICs9IGxlbihkYXRhKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICB0cnkgOgorICAgICAgICAgICAgaWYgc2VsZi5fY2xvc2VfZmlsZW9iajoKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlb2JqLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN1cGVyKFppcEV4dEZpbGUsIHNlbGYpLmNsb3NlKCkKKworCitjbGFzcyBaaXBGaWxlKG9iamVjdCk6CisgICAgIiIiIENsYXNzIHdpdGggbWV0aG9kcyB0byBvcGVuLCByZWFkLCB3cml0ZSwgY2xvc2UsIGxpc3QgemlwIGZpbGVzLgorCisgICAgeiA9IFppcEZpbGUoZmlsZSwgbW9kZT0iciIsIGNvbXByZXNzaW9uPVpJUF9TVE9SRUQsIGFsbG93WmlwNjQ9RmFsc2UpCisKKyAgICBmaWxlOiBFaXRoZXIgdGhlIHBhdGggdG8gdGhlIGZpbGUsIG9yIGEgZmlsZS1saWtlIG9iamVjdC4KKyAgICAgICAgICBJZiBpdCBpcyBhIHBhdGgsIHRoZSBmaWxlIHdpbGwgYmUgb3BlbmVkIGFuZCBjbG9zZWQgYnkgWmlwRmlsZS4KKyAgICBtb2RlOiBUaGUgbW9kZSBjYW4gYmUgZWl0aGVyIHJlYWQgInIiLCB3cml0ZSAidyIgb3IgYXBwZW5kICJhIi4KKyAgICBjb21wcmVzc2lvbjogWklQX1NUT1JFRCAobm8gY29tcHJlc3Npb24pIG9yIFpJUF9ERUZMQVRFRCAocmVxdWlyZXMgemxpYikuCisgICAgYWxsb3daaXA2NDogaWYgVHJ1ZSBaaXBGaWxlIHdpbGwgY3JlYXRlIGZpbGVzIHdpdGggWklQNjQgZXh0ZW5zaW9ucyB3aGVuCisgICAgICAgICAgICAgICAgbmVlZGVkLCBvdGhlcndpc2UgaXQgd2lsbCByYWlzZSBhbiBleGNlcHRpb24gd2hlbiB0aGlzIHdvdWxkCisgICAgICAgICAgICAgICAgYmUgbmVjZXNzYXJ5LgorCisgICAgIiIiCisKKyAgICBmcCA9IE5vbmUgICAgICAgICAgICAgICAgICAgIyBTZXQgaGVyZSBzaW5jZSBfX2RlbF9fIGNoZWNrcyBpdAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIG1vZGU9InIiLCBjb21wcmVzc2lvbj1aSVBfU1RPUkVELCBhbGxvd1ppcDY0PUZhbHNlKToKKyAgICAgICAgIiIiT3BlbiB0aGUgWklQIGZpbGUgd2l0aCBtb2RlIHJlYWQgInIiLCB3cml0ZSAidyIgb3IgYXBwZW5kICJhIi4iIiIKKyAgICAgICAgaWYgbW9kZSBub3QgaW4gKCJyIiwgInciLCAiYSIpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdaaXBGaWxlKCkgcmVxdWlyZXMgbW9kZSAiciIsICJ3Iiwgb3IgImEiJykKKworICAgICAgICBpZiBjb21wcmVzc2lvbiA9PSBaSVBfU1RPUkVEOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIGNvbXByZXNzaW9uID09IFpJUF9ERUZMQVRFRDoKKyAgICAgICAgICAgIGlmIG5vdCB6bGliOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcixcCisgICAgICAgICAgICAgICAgICAgICAgIkNvbXByZXNzaW9uIHJlcXVpcmVzIHRoZSAobWlzc2luZykgemxpYiBtb2R1bGUiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJUaGF0IGNvbXByZXNzaW9uIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIgorCisgICAgICAgIHNlbGYuX2FsbG93WmlwNjQgPSBhbGxvd1ppcDY0CisgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IEZhbHNlCisgICAgICAgIHNlbGYuZGVidWcgPSAwICAjIExldmVsIG9mIHByaW50aW5nOiAwIHRocm91Z2ggMworICAgICAgICBzZWxmLk5hbWVUb0luZm8gPSB7fSAgICAjIEZpbmQgZmlsZSBpbmZvIGdpdmVuIG5hbWUKKyAgICAgICAgc2VsZi5maWxlbGlzdCA9IFtdICAgICAgIyBMaXN0IG9mIFppcEluZm8gaW5zdGFuY2VzIGZvciBhcmNoaXZlCisgICAgICAgIHNlbGYuY29tcHJlc3Npb24gPSBjb21wcmVzc2lvbiAgIyBNZXRob2Qgb2YgY29tcHJlc3Npb24KKyAgICAgICAgc2VsZi5tb2RlID0ga2V5ID0gbW9kZS5yZXBsYWNlKCdiJywgJycpWzBdCisgICAgICAgIHNlbGYucHdkID0gTm9uZQorICAgICAgICBzZWxmLl9jb21tZW50ID0gJycKKworICAgICAgICAjIENoZWNrIGlmIHdlIHdlcmUgcGFzc2VkIGEgZmlsZS1saWtlIG9iamVjdAorICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgc2VsZi5fZmlsZVBhc3NlZCA9IDAKKyAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlCisgICAgICAgICAgICBtb2RlRGljdCA9IHsncicgOiAncmInLCAndyc6ICd3YicsICdhJyA6ICdyK2InfQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZnAgPSBvcGVuKGZpbGUsIG1vZGVEaWN0W21vZGVdKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgaWYgbW9kZSA9PSAnYSc6CisgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBrZXkgPSAndycKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcCA9IG9wZW4oZmlsZSwgbW9kZURpY3RbbW9kZV0pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVQYXNzZWQgPSAxCisgICAgICAgICAgICBzZWxmLmZwID0gZmlsZQorICAgICAgICAgICAgc2VsZi5maWxlbmFtZSA9IGdldGF0dHIoZmlsZSwgJ25hbWUnLCBOb25lKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGtleSA9PSAncic6CisgICAgICAgICAgICAgICAgc2VsZi5fUmVhbEdldENvbnRlbnRzKCkKKyAgICAgICAgICAgIGVsaWYga2V5ID09ICd3JzoKKyAgICAgICAgICAgICAgICAjIHNldCB0aGUgbW9kaWZpZWQgZmxhZyBzbyBjZW50cmFsIGRpcmVjdG9yeSBnZXRzIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAjIGV2ZW4gaWYgbm8gZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBhcmNoaXZlCisgICAgICAgICAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBrZXkgPT0gJ2EnOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgIyBTZWUgaWYgZmlsZSBpcyBhIHppcCBmaWxlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX1JlYWxHZXRDb250ZW50cygpCisgICAgICAgICAgICAgICAgICAgICMgc2VlayB0byBzdGFydCBvZiBkaXJlY3RvcnkgYW5kIG92ZXJ3cml0ZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmZwLnNlZWsoc2VsZi5zdGFydF9kaXIsIDApCisgICAgICAgICAgICAgICAgZXhjZXB0IEJhZFppcGZpbGU6CisgICAgICAgICAgICAgICAgICAgICMgZmlsZSBpcyBub3QgYSB6aXAgZmlsZSwganVzdCBhcHBlbmQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKDAsIDIpCisKKyAgICAgICAgICAgICAgICAgICAgIyBzZXQgdGhlIG1vZGlmaWVkIGZsYWcgc28gY2VudHJhbCBkaXJlY3RvcnkgZ2V0cyB3cml0dGVuCisgICAgICAgICAgICAgICAgICAgICMgZXZlbiBpZiBubyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGFyY2hpdmUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ01vZGUgbXVzdCBiZSAiciIsICJ3IiBvciAiYSInKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBmcCA9IHNlbGYuZnAKKyAgICAgICAgICAgIHNlbGYuZnAgPSBOb25lCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZmlsZVBhc3NlZDoKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgX1JlYWxHZXRDb250ZW50cyhzZWxmKToKKyAgICAgICAgIiIiUmVhZCBpbiB0aGUgdGFibGUgb2YgY29udGVudHMgZm9yIHRoZSBaSVAgZmlsZS4iIiIKKyAgICAgICAgZnAgPSBzZWxmLmZwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVuZHJlYyA9IF9FbmRSZWNEYXRhKGZwKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEJhZFppcGZpbGUoIkZpbGUgaXMgbm90IGEgemlwIGZpbGUiKQorICAgICAgICBpZiBub3QgZW5kcmVjOgorICAgICAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSwgIkZpbGUgaXMgbm90IGEgemlwIGZpbGUiCisgICAgICAgIGlmIHNlbGYuZGVidWcgPiAxOgorICAgICAgICAgICAgcHJpbnQgZW5kcmVjCisgICAgICAgIHNpemVfY2QgPSBlbmRyZWNbX0VDRF9TSVpFXSAgICAgICAgICAgICAjIGJ5dGVzIGluIGNlbnRyYWwgZGlyZWN0b3J5CisgICAgICAgIG9mZnNldF9jZCA9IGVuZHJlY1tfRUNEX09GRlNFVF0gICAgICAgICAjIG9mZnNldCBvZiBjZW50cmFsIGRpcmVjdG9yeQorICAgICAgICBzZWxmLl9jb21tZW50ID0gZW5kcmVjW19FQ0RfQ09NTUVOVF0gICAgIyBhcmNoaXZlIGNvbW1lbnQKKworICAgICAgICAjICJjb25jYXQiIGlzIHplcm8sIHVubGVzcyB6aXAgd2FzIGNvbmNhdGVuYXRlZCB0byBhbm90aGVyIGZpbGUKKyAgICAgICAgY29uY2F0ID0gZW5kcmVjW19FQ0RfTE9DQVRJT05dIC0gc2l6ZV9jZCAtIG9mZnNldF9jZAorICAgICAgICBpZiBlbmRyZWNbX0VDRF9TSUdOQVRVUkVdID09IHN0cmluZ0VuZEFyY2hpdmU2NDoKKyAgICAgICAgICAgICMgSWYgWmlwNjQgZXh0ZW5zaW9uIHN0cnVjdHVyZXMgYXJlIHByZXNlbnQsIGFjY291bnQgZm9yIHRoZW0KKyAgICAgICAgICAgIGNvbmNhdCAtPSAoc2l6ZUVuZENlbnREaXI2NCArIHNpemVFbmRDZW50RGlyNjRMb2NhdG9yKQorCisgICAgICAgIGlmIHNlbGYuZGVidWcgPiAyOgorICAgICAgICAgICAgaW5mZXJyZWQgPSBjb25jYXQgKyBvZmZzZXRfY2QKKyAgICAgICAgICAgIHByaW50ICJnaXZlbiwgaW5mZXJyZWQsIG9mZnNldCIsIG9mZnNldF9jZCwgaW5mZXJyZWQsIGNvbmNhdAorICAgICAgICAjIHNlbGYuc3RhcnRfZGlyOiAgUG9zaXRpb24gb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3RvcnkKKyAgICAgICAgc2VsZi5zdGFydF9kaXIgPSBvZmZzZXRfY2QgKyBjb25jYXQKKyAgICAgICAgZnAuc2VlayhzZWxmLnN0YXJ0X2RpciwgMCkKKyAgICAgICAgZGF0YSA9IGZwLnJlYWQoc2l6ZV9jZCkKKyAgICAgICAgZnAgPSBjU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKKyAgICAgICAgdG90YWwgPSAwCisgICAgICAgIHdoaWxlIHRvdGFsIDwgc2l6ZV9jZDoKKyAgICAgICAgICAgIGNlbnRkaXIgPSBmcC5yZWFkKHNpemVDZW50cmFsRGlyKQorICAgICAgICAgICAgaWYgbGVuKGNlbnRkaXIpICE9IHNpemVDZW50cmFsRGlyOgorICAgICAgICAgICAgICAgIHJhaXNlIEJhZFppcGZpbGUoIlRydW5jYXRlZCBjZW50cmFsIGRpcmVjdG9yeSIpCisgICAgICAgICAgICBjZW50ZGlyID0gc3RydWN0LnVucGFjayhzdHJ1Y3RDZW50cmFsRGlyLCBjZW50ZGlyKQorICAgICAgICAgICAgaWYgY2VudGRpcltfQ0RfU0lHTkFUVVJFXSAhPSBzdHJpbmdDZW50cmFsRGlyOgorICAgICAgICAgICAgICAgIHJhaXNlIEJhZFppcGZpbGUoIkJhZCBtYWdpYyBudW1iZXIgZm9yIGNlbnRyYWwgZGlyZWN0b3J5IikKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPiAyOgorICAgICAgICAgICAgICAgIHByaW50IGNlbnRkaXIKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZnAucmVhZChjZW50ZGlyW19DRF9GSUxFTkFNRV9MRU5HVEhdKQorICAgICAgICAgICAgIyBDcmVhdGUgWmlwSW5mbyBpbnN0YW5jZSB0byBzdG9yZSBmaWxlIGluZm9ybWF0aW9uCisgICAgICAgICAgICB4ID0gWmlwSW5mbyhmaWxlbmFtZSkKKyAgICAgICAgICAgIHguZXh0cmEgPSBmcC5yZWFkKGNlbnRkaXJbX0NEX0VYVFJBX0ZJRUxEX0xFTkdUSF0pCisgICAgICAgICAgICB4LmNvbW1lbnQgPSBmcC5yZWFkKGNlbnRkaXJbX0NEX0NPTU1FTlRfTEVOR1RIXSkKKyAgICAgICAgICAgIHguaGVhZGVyX29mZnNldCA9IGNlbnRkaXJbX0NEX0xPQ0FMX0hFQURFUl9PRkZTRVRdCisgICAgICAgICAgICAoeC5jcmVhdGVfdmVyc2lvbiwgeC5jcmVhdGVfc3lzdGVtLCB4LmV4dHJhY3RfdmVyc2lvbiwgeC5yZXNlcnZlZCwKKyAgICAgICAgICAgICAgICB4LmZsYWdfYml0cywgeC5jb21wcmVzc190eXBlLCB0LCBkLAorICAgICAgICAgICAgICAgIHguQ1JDLCB4LmNvbXByZXNzX3NpemUsIHguZmlsZV9zaXplKSA9IGNlbnRkaXJbMToxMl0KKyAgICAgICAgICAgIHgudm9sdW1lLCB4LmludGVybmFsX2F0dHIsIHguZXh0ZXJuYWxfYXR0ciA9IGNlbnRkaXJbMTU6MThdCisgICAgICAgICAgICAjIENvbnZlcnQgZGF0ZS90aW1lIGNvZGUgdG8gKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbiwgc2VjKQorICAgICAgICAgICAgeC5fcmF3X3RpbWUgPSB0CisgICAgICAgICAgICB4LmRhdGVfdGltZSA9ICggKGQ+PjkpKzE5ODAsIChkPj41KSYweEYsIGQmMHgxRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Pj4xMSwgKHQ+PjUpJjB4M0YsICh0JjB4MUYpICogMiApCisKKyAgICAgICAgICAgIHguX2RlY29kZUV4dHJhKCkKKyAgICAgICAgICAgIHguaGVhZGVyX29mZnNldCA9IHguaGVhZGVyX29mZnNldCArIGNvbmNhdAorICAgICAgICAgICAgeC5maWxlbmFtZSA9IHguX2RlY29kZUZpbGVuYW1lKCkKKyAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHgpCisgICAgICAgICAgICBzZWxmLk5hbWVUb0luZm9beC5maWxlbmFtZV0gPSB4CisKKyAgICAgICAgICAgICMgdXBkYXRlIHRvdGFsIGJ5dGVzIHJlYWQgZnJvbSBjZW50cmFsIGRpcmVjdG9yeQorICAgICAgICAgICAgdG90YWwgPSAodG90YWwgKyBzaXplQ2VudHJhbERpciArIGNlbnRkaXJbX0NEX0ZJTEVOQU1FX0xFTkdUSF0KKyAgICAgICAgICAgICAgICAgICAgICsgY2VudGRpcltfQ0RfRVhUUkFfRklFTERfTEVOR1RIXQorICAgICAgICAgICAgICAgICAgICAgKyBjZW50ZGlyW19DRF9DT01NRU5UX0xFTkdUSF0pCisKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPiAyOgorICAgICAgICAgICAgICAgIHByaW50ICJ0b3RhbCIsIHRvdGFsCisKKworICAgIGRlZiBuYW1lbGlzdChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBmaWxlIG5hbWVzIGluIHRoZSBhcmNoaXZlLiIiIgorICAgICAgICBsID0gW10KKyAgICAgICAgZm9yIGRhdGEgaW4gc2VsZi5maWxlbGlzdDoKKyAgICAgICAgICAgIGwuYXBwZW5kKGRhdGEuZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBsCisKKyAgICBkZWYgaW5mb2xpc3Qoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgY2xhc3MgWmlwSW5mbyBpbnN0YW5jZXMgZm9yIGZpbGVzIGluIHRoZQorICAgICAgICBhcmNoaXZlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5maWxlbGlzdAorCisgICAgZGVmIHByaW50ZGlyKHNlbGYpOgorICAgICAgICAiIiJQcmludCBhIHRhYmxlIG9mIGNvbnRlbnRzIGZvciB0aGUgemlwIGZpbGUuIiIiCisgICAgICAgIHByaW50ICIlLTQ2cyAlMTlzICUxMnMiICUgKCJGaWxlIE5hbWUiLCAiTW9kaWZpZWQgICAgIiwgIlNpemUiKQorICAgICAgICBmb3IgemluZm8gaW4gc2VsZi5maWxlbGlzdDoKKyAgICAgICAgICAgIGRhdGUgPSAiJWQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiAlIHppbmZvLmRhdGVfdGltZVs6Nl0KKyAgICAgICAgICAgIHByaW50ICIlLTQ2cyAlcyAlMTJkIiAlICh6aW5mby5maWxlbmFtZSwgZGF0ZSwgemluZm8uZmlsZV9zaXplKQorCisgICAgZGVmIHRlc3R6aXAoc2VsZik6CisgICAgICAgICIiIlJlYWQgYWxsIHRoZSBmaWxlcyBhbmQgY2hlY2sgdGhlIENSQy4iIiIKKyAgICAgICAgY2h1bmtfc2l6ZSA9IDIgKiogMjAKKyAgICAgICAgZm9yIHppbmZvIGluIHNlbGYuZmlsZWxpc3Q6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBSZWFkIGJ5IGNodW5rcywgdG8gYXZvaWQgYW4gT3ZlcmZsb3dFcnJvciBvciBhCisgICAgICAgICAgICAgICAgIyBNZW1vcnlFcnJvciB3aXRoIHZlcnkgbGFyZ2UgZW1iZWRkZWQgZmlsZXMuCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oemluZm8uZmlsZW5hbWUsICJyIikgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgZi5yZWFkKGNodW5rX3NpemUpOiAgICAgIyBDaGVjayBDUkMtMzIKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBCYWRaaXBmaWxlOgorICAgICAgICAgICAgICAgIHJldHVybiB6aW5mby5maWxlbmFtZQorCisgICAgZGVmIGdldGluZm8oc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgaW5zdGFuY2Ugb2YgWmlwSW5mbyBnaXZlbiAnbmFtZScuIiIiCisgICAgICAgIGluZm8gPSBzZWxmLk5hbWVUb0luZm8uZ2V0KG5hbWUpCisgICAgICAgIGlmIGluZm8gaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKAorICAgICAgICAgICAgICAgICdUaGVyZSBpcyBubyBpdGVtIG5hbWVkICVyIGluIHRoZSBhcmNoaXZlJyAlIG5hbWUpCisKKyAgICAgICAgcmV0dXJuIGluZm8KKworICAgIGRlZiBzZXRwYXNzd29yZChzZWxmLCBwd2QpOgorICAgICAgICAiIiJTZXQgZGVmYXVsdCBwYXNzd29yZCBmb3IgZW5jcnlwdGVkIGZpbGVzLiIiIgorICAgICAgICBzZWxmLnB3ZCA9IHB3ZAorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNvbW1lbnQoc2VsZik6CisgICAgICAgICIiIlRoZSBjb21tZW50IHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBaSVAgZmlsZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbW1lbnQKKworICAgIEBjb21tZW50LnNldHRlcgorICAgIGRlZiBjb21tZW50KHNlbGYsIGNvbW1lbnQpOgorICAgICAgICAjIGNoZWNrIGZvciB2YWxpZCBjb21tZW50IGxlbmd0aAorICAgICAgICBpZiBsZW4oY29tbWVudCkgPj0gWklQX01BWF9DT01NRU5UOgorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgICAgICBwcmludCgnQXJjaGl2ZSBjb21tZW50IGlzIHRvbyBsb25nOyB0cnVuY2F0aW5nIHRvICVkIGJ5dGVzJworICAgICAgICAgICAgICAgICAgICAgICAgJSBaSVBfTUFYX0NPTU1FTlQpCisgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudFs6WklQX01BWF9DT01NRU5UXQorICAgICAgICBzZWxmLl9jb21tZW50ID0gY29tbWVudAorICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlCisKKyAgICBkZWYgcmVhZChzZWxmLCBuYW1lLCBwd2Q9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBmaWxlIGJ5dGVzIChhcyBhIHN0cmluZykgZm9yIG5hbWUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLm9wZW4obmFtZSwgInIiLCBwd2QpLnJlYWQoKQorCisgICAgZGVmIG9wZW4oc2VsZiwgbmFtZSwgbW9kZT0iciIsIHB3ZD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGZpbGUtbGlrZSBvYmplY3QgZm9yICduYW1lJy4iIiIKKyAgICAgICAgaWYgbW9kZSBub3QgaW4gKCJyIiwgIlUiLCAiclUiKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ29wZW4oKSByZXF1aXJlcyBtb2RlICJyIiwgIlUiLCBvciAiclUiJworICAgICAgICBpZiBub3Qgc2VsZi5mcDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gcmVhZCBaSVAgYXJjaGl2ZSB0aGF0IHdhcyBhbHJlYWR5IGNsb3NlZCIKKworICAgICAgICAjIE9ubHkgb3BlbiBhIG5ldyBmaWxlIGZvciBpbnN0YW5jZXMgd2hlcmUgd2Ugd2VyZSBub3QKKyAgICAgICAgIyBnaXZlbiBhIGZpbGUgb2JqZWN0IGluIHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICBpZiBzZWxmLl9maWxlUGFzc2VkOgorICAgICAgICAgICAgemVmX2ZpbGUgPSBzZWxmLmZwCisgICAgICAgICAgICBzaG91bGRfY2xvc2UgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgemVmX2ZpbGUgPSBvcGVuKHNlbGYuZmlsZW5hbWUsICdyYicpCisgICAgICAgICAgICBzaG91bGRfY2xvc2UgPSBUcnVlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhbiBpbmZvIG9iamVjdAorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lLCBaaXBJbmZvKToKKyAgICAgICAgICAgICAgICAjICduYW1lJyBpcyBhbHJlYWR5IGFuIGluZm8gb2JqZWN0CisgICAgICAgICAgICAgICAgemluZm8gPSBuYW1lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgR2V0IGluZm8gb2JqZWN0IGZvciBuYW1lCisgICAgICAgICAgICAgICAgemluZm8gPSBzZWxmLmdldGluZm8obmFtZSkKKworICAgICAgICAgICAgemVmX2ZpbGUuc2Vlayh6aW5mby5oZWFkZXJfb2Zmc2V0LCAwKQorCisgICAgICAgICAgICAjIFNraXAgdGhlIGZpbGUgaGVhZGVyOgorICAgICAgICAgICAgZmhlYWRlciA9IHplZl9maWxlLnJlYWQoc2l6ZUZpbGVIZWFkZXIpCisgICAgICAgICAgICBpZiBsZW4oZmhlYWRlcikgIT0gc2l6ZUZpbGVIZWFkZXI6CisgICAgICAgICAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSgiVHJ1bmNhdGVkIGZpbGUgaGVhZGVyIikKKyAgICAgICAgICAgIGZoZWFkZXIgPSBzdHJ1Y3QudW5wYWNrKHN0cnVjdEZpbGVIZWFkZXIsIGZoZWFkZXIpCisgICAgICAgICAgICBpZiBmaGVhZGVyW19GSF9TSUdOQVRVUkVdICE9IHN0cmluZ0ZpbGVIZWFkZXI6CisgICAgICAgICAgICAgICAgcmFpc2UgQmFkWmlwZmlsZSgiQmFkIG1hZ2ljIG51bWJlciBmb3IgZmlsZSBoZWFkZXIiKQorCisgICAgICAgICAgICBmbmFtZSA9IHplZl9maWxlLnJlYWQoZmhlYWRlcltfRkhfRklMRU5BTUVfTEVOR1RIXSkKKyAgICAgICAgICAgIGlmIGZoZWFkZXJbX0ZIX0VYVFJBX0ZJRUxEX0xFTkdUSF06CisgICAgICAgICAgICAgICAgemVmX2ZpbGUucmVhZChmaGVhZGVyW19GSF9FWFRSQV9GSUVMRF9MRU5HVEhdKQorCisgICAgICAgICAgICBpZiBmbmFtZSAhPSB6aW5mby5vcmlnX2ZpbGVuYW1lOgorICAgICAgICAgICAgICAgIHJhaXNlIEJhZFppcGZpbGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICdGaWxlIG5hbWUgaW4gZGlyZWN0b3J5ICIlcyIgYW5kIGhlYWRlciAiJXMiIGRpZmZlci4nICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppbmZvLm9yaWdfZmlsZW5hbWUsIGZuYW1lKQorCisgICAgICAgICAgICAjIGNoZWNrIGZvciBlbmNyeXB0ZWQgZmxhZyAmIGhhbmRsZSBwYXNzd29yZAorICAgICAgICAgICAgaXNfZW5jcnlwdGVkID0gemluZm8uZmxhZ19iaXRzICYgMHgxCisgICAgICAgICAgICB6ZCA9IE5vbmUKKyAgICAgICAgICAgIGlmIGlzX2VuY3J5cHRlZDoKKyAgICAgICAgICAgICAgICBpZiBub3QgcHdkOgorICAgICAgICAgICAgICAgICAgICBwd2QgPSBzZWxmLnB3ZAorICAgICAgICAgICAgICAgIGlmIG5vdCBwd2Q6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkZpbGUgJXMgaXMgZW5jcnlwdGVkLCAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJwYXNzd29yZCByZXF1aXJlZCBmb3IgZXh0cmFjdGlvbiIgJSBuYW1lCisKKyAgICAgICAgICAgICAgICB6ZCA9IF9aaXBEZWNyeXB0ZXIocHdkKQorICAgICAgICAgICAgICAgICMgVGhlIGZpcnN0IDEyIGJ5dGVzIGluIHRoZSBjeXBoZXIgc3RyZWFtIGlzIGFuIGVuY3J5cHRpb24gaGVhZGVyCisgICAgICAgICAgICAgICAgIyAgdXNlZCB0byBzdHJlbmd0aGVuIHRoZSBhbGdvcml0aG0uIFRoZSBmaXJzdCAxMSBieXRlcyBhcmUKKyAgICAgICAgICAgICAgICAjICBjb21wbGV0ZWx5IHJhbmRvbSwgd2hpbGUgdGhlIDEydGggY29udGFpbnMgdGhlIE1TQiBvZiB0aGUgQ1JDLAorICAgICAgICAgICAgICAgICMgIG9yIHRoZSBNU0Igb2YgdGhlIGZpbGUgdGltZSBkZXBlbmRpbmcgb24gdGhlIGhlYWRlciB0eXBlCisgICAgICAgICAgICAgICAgIyAgYW5kIGlzIHVzZWQgdG8gY2hlY2sgdGhlIGNvcnJlY3RuZXNzIG9mIHRoZSBwYXNzd29yZC4KKyAgICAgICAgICAgICAgICBieXRlcyA9IHplZl9maWxlLnJlYWQoMTIpCisgICAgICAgICAgICAgICAgaCA9IG1hcCh6ZCwgYnl0ZXNbMDoxMl0pCisgICAgICAgICAgICAgICAgaWYgemluZm8uZmxhZ19iaXRzICYgMHg4OgorICAgICAgICAgICAgICAgICAgICAjIGNvbXBhcmUgYWdhaW5zdCB0aGUgZmlsZSB0eXBlIGZyb20gZXh0ZW5kZWQgbG9jYWwgaGVhZGVycworICAgICAgICAgICAgICAgICAgICBjaGVja19ieXRlID0gKHppbmZvLl9yYXdfdGltZSA+PiA4KSAmIDB4ZmYKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGNvbXBhcmUgYWdhaW5zdCB0aGUgQ1JDIG90aGVyd2lzZQorICAgICAgICAgICAgICAgICAgICBjaGVja19ieXRlID0gKHppbmZvLkNSQyA+PiAyNCkgJiAweGZmCisgICAgICAgICAgICAgICAgaWYgb3JkKGhbMTFdKSAhPSBjaGVja19ieXRlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkJhZCBwYXNzd29yZCBmb3IgZmlsZSIsIG5hbWUpCisKKyAgICAgICAgICAgIHJldHVybiBaaXBFeHRGaWxlKHplZl9maWxlLCBtb2RlLCB6aW5mbywgemQsCisgICAgICAgICAgICAgICAgICAgIGNsb3NlX2ZpbGVvYmo9c2hvdWxkX2Nsb3NlKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpZiBzaG91bGRfY2xvc2U6CisgICAgICAgICAgICAgICAgemVmX2ZpbGUuY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBleHRyYWN0KHNlbGYsIG1lbWJlciwgcGF0aD1Ob25lLCBwd2Q9Tm9uZSk6CisgICAgICAgICIiIkV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwKKyAgICAgICAgICAgdXNpbmcgaXRzIGZ1bGwgbmFtZS4gSXRzIGZpbGUgaW5mb3JtYXRpb24gaXMgZXh0cmFjdGVkIGFzIGFjY3VyYXRlbHkKKyAgICAgICAgICAgYXMgcG9zc2libGUuIGBtZW1iZXInIG1heSBiZSBhIGZpbGVuYW1lIG9yIGEgWmlwSW5mbyBvYmplY3QuIFlvdSBjYW4KKyAgICAgICAgICAgc3BlY2lmeSBhIGRpZmZlcmVudCBkaXJlY3RvcnkgdXNpbmcgYHBhdGgnLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobWVtYmVyLCBaaXBJbmZvKToKKyAgICAgICAgICAgIG1lbWJlciA9IHNlbGYuZ2V0aW5mbyhtZW1iZXIpCisKKyAgICAgICAgaWYgcGF0aCBpcyBOb25lOgorICAgICAgICAgICAgcGF0aCA9IG9zLmdldGN3ZCgpCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4dHJhY3RfbWVtYmVyKG1lbWJlciwgcGF0aCwgcHdkKQorCisgICAgZGVmIGV4dHJhY3RhbGwoc2VsZiwgcGF0aD1Ob25lLCBtZW1iZXJzPU5vbmUsIHB3ZD1Ob25lKToKKyAgICAgICAgIiIiRXh0cmFjdCBhbGwgbWVtYmVycyBmcm9tIHRoZSBhcmNoaXZlIHRvIHRoZSBjdXJyZW50IHdvcmtpbmcKKyAgICAgICAgICAgZGlyZWN0b3J5LiBgcGF0aCcgc3BlY2lmaWVzIGEgZGlmZmVyZW50IGRpcmVjdG9yeSB0byBleHRyYWN0IHRvLgorICAgICAgICAgICBgbWVtYmVycycgaXMgb3B0aW9uYWwgYW5kIG11c3QgYmUgYSBzdWJzZXQgb2YgdGhlIGxpc3QgcmV0dXJuZWQKKyAgICAgICAgICAgYnkgbmFtZWxpc3QoKS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG1lbWJlcnMgaXMgTm9uZToKKyAgICAgICAgICAgIG1lbWJlcnMgPSBzZWxmLm5hbWVsaXN0KCkKKworICAgICAgICBmb3IgemlwaW5mbyBpbiBtZW1iZXJzOgorICAgICAgICAgICAgc2VsZi5leHRyYWN0KHppcGluZm8sIHBhdGgsIHB3ZCkKKworICAgIGRlZiBfZXh0cmFjdF9tZW1iZXIoc2VsZiwgbWVtYmVyLCB0YXJnZXRwYXRoLCBwd2QpOgorICAgICAgICAiIiJFeHRyYWN0IHRoZSBaaXBJbmZvIG9iamVjdCAnbWVtYmVyJyB0byBhIHBoeXNpY2FsCisgICAgICAgICAgIGZpbGUgb24gdGhlIHBhdGggdGFyZ2V0cGF0aC4KKyAgICAgICAgIiIiCisgICAgICAgICMgYnVpbGQgdGhlIGRlc3RpbmF0aW9uIHBhdGhuYW1lLCByZXBsYWNpbmcKKyAgICAgICAgIyBmb3J3YXJkIHNsYXNoZXMgdG8gcGxhdGZvcm0gc3BlY2lmaWMgc2VwYXJhdG9ycy4KKyAgICAgICAgYXJjbmFtZSA9IG1lbWJlci5maWxlbmFtZS5yZXBsYWNlKCcvJywgb3MucGF0aC5zZXApCisKKyAgICAgICAgaWYgb3MucGF0aC5hbHRzZXA6CisgICAgICAgICAgICBhcmNuYW1lID0gYXJjbmFtZS5yZXBsYWNlKG9zLnBhdGguYWx0c2VwLCBvcy5wYXRoLnNlcCkKKyAgICAgICAgIyBpbnRlcnByZXQgYWJzb2x1dGUgcGF0aG5hbWUgYXMgcmVsYXRpdmUsIHJlbW92ZSBkcml2ZSBsZXR0ZXIgb3IKKyAgICAgICAgIyBVTkMgcGF0aCwgcmVkdW5kYW50IHNlcGFyYXRvcnMsICIuIiBhbmQgIi4uIiBjb21wb25lbnRzLgorICAgICAgICBhcmNuYW1lID0gb3MucGF0aC5zcGxpdGRyaXZlKGFyY25hbWUpWzFdCisgICAgICAgIGFyY25hbWUgPSBvcy5wYXRoLnNlcC5qb2luKHggZm9yIHggaW4gYXJjbmFtZS5zcGxpdChvcy5wYXRoLnNlcCkKKyAgICAgICAgICAgICAgICAgICAgaWYgeCBub3QgaW4gKCcnLCBvcy5wYXRoLmN1cmRpciwgb3MucGF0aC5wYXJkaXIpKQorICAgICAgICBpZiBvcy5wYXRoLnNlcCA9PSAnXFwnOgorICAgICAgICAgICAgIyBmaWx0ZXIgaWxsZWdhbCBjaGFyYWN0ZXJzIG9uIFdpbmRvd3MKKyAgICAgICAgICAgIGlsbGVnYWwgPSAnOjw+fCI/KicKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJjbmFtZSwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgdGFibGUgPSB7b3JkKGMpOiBvcmQoJ18nKSBmb3IgYyBpbiBpbGxlZ2FsfQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0YWJsZSA9IHN0cmluZy5tYWtldHJhbnMoaWxsZWdhbCwgJ18nICogbGVuKGlsbGVnYWwpKQorICAgICAgICAgICAgYXJjbmFtZSA9IGFyY25hbWUudHJhbnNsYXRlKHRhYmxlKQorICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgZG90cworICAgICAgICAgICAgYXJjbmFtZSA9ICh4LnJzdHJpcCgnLicpIGZvciB4IGluIGFyY25hbWUuc3BsaXQob3MucGF0aC5zZXApKQorICAgICAgICAgICAgYXJjbmFtZSA9IG9zLnBhdGguc2VwLmpvaW4oeCBmb3IgeCBpbiBhcmNuYW1lIGlmIHgpCisKKyAgICAgICAgdGFyZ2V0cGF0aCA9IG9zLnBhdGguam9pbih0YXJnZXRwYXRoLCBhcmNuYW1lKQorICAgICAgICB0YXJnZXRwYXRoID0gb3MucGF0aC5ub3JtcGF0aCh0YXJnZXRwYXRoKQorCisgICAgICAgICMgQ3JlYXRlIGFsbCB1cHBlciBkaXJlY3RvcmllcyBpZiBuZWNlc3NhcnkuCisgICAgICAgIHVwcGVyZGlycyA9IG9zLnBhdGguZGlybmFtZSh0YXJnZXRwYXRoKQorICAgICAgICBpZiB1cHBlcmRpcnMgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyh1cHBlcmRpcnMpOgorICAgICAgICAgICAgb3MubWFrZWRpcnModXBwZXJkaXJzKQorCisgICAgICAgIGlmIG1lbWJlci5maWxlbmFtZVstMV0gPT0gJy8nOgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIodGFyZ2V0cGF0aCk6CisgICAgICAgICAgICAgICAgb3MubWtkaXIodGFyZ2V0cGF0aCkKKyAgICAgICAgICAgIHJldHVybiB0YXJnZXRwYXRoCisKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4obWVtYmVyLCBwd2Q9cHdkKSBhcyBzb3VyY2UsIFwKKyAgICAgICAgICAgICBmaWxlKHRhcmdldHBhdGgsICJ3YiIpIGFzIHRhcmdldDoKKyAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZW9iaihzb3VyY2UsIHRhcmdldCkKKworICAgICAgICByZXR1cm4gdGFyZ2V0cGF0aAorCisgICAgZGVmIF93cml0ZWNoZWNrKHNlbGYsIHppbmZvKToKKyAgICAgICAgIiIiQ2hlY2sgZm9yIGVycm9ycyBiZWZvcmUgd3JpdGluZyBhIGZpbGUgdG8gdGhlIGFyY2hpdmUuIiIiCisgICAgICAgIGlmIHppbmZvLmZpbGVuYW1lIGluIHNlbGYuTmFtZVRvSW5mbzoKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6ICAgICAgIyBXYXJuaW5nIGZvciBkdXBsaWNhdGUgbmFtZXMKKyAgICAgICAgICAgICAgICBwcmludCAiRHVwbGljYXRlIG5hbWU6IiwgemluZm8uZmlsZW5hbWUKKyAgICAgICAgaWYgc2VsZi5tb2RlIG5vdCBpbiAoInciLCAiYSIpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAnd3JpdGUoKSByZXF1aXJlcyBtb2RlICJ3IiBvciAiYSInCisgICAgICAgIGlmIG5vdCBzZWxmLmZwOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byB3cml0ZSBaSVAgYXJjaGl2ZSB0aGF0IHdhcyBhbHJlYWR5IGNsb3NlZCIKKyAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfREVGTEFURUQgYW5kIG5vdCB6bGliOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiQ29tcHJlc3Npb24gcmVxdWlyZXMgdGhlIChtaXNzaW5nKSB6bGliIG1vZHVsZSIKKyAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSBub3QgaW4gKFpJUF9TVE9SRUQsIFpJUF9ERUZMQVRFRCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICJUaGF0IGNvbXByZXNzaW9uIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIgorICAgICAgICBpZiB6aW5mby5maWxlX3NpemUgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9hbGxvd1ppcDY0OgorICAgICAgICAgICAgICAgIHJhaXNlIExhcmdlWmlwRmlsZSgiRmlsZXNpemUgd291bGQgcmVxdWlyZSBaSVA2NCBleHRlbnNpb25zIikKKyAgICAgICAgaWYgemluZm8uaGVhZGVyX29mZnNldCA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2FsbG93WmlwNjQ6CisgICAgICAgICAgICAgICAgcmFpc2UgTGFyZ2VaaXBGaWxlKCJaaXBmaWxlIHNpemUgd291bGQgcmVxdWlyZSBaSVA2NCBleHRlbnNpb25zIikKKworICAgIGRlZiB3cml0ZShzZWxmLCBmaWxlbmFtZSwgYXJjbmFtZT1Ob25lLCBjb21wcmVzc190eXBlPU5vbmUpOgorICAgICAgICAiIiJQdXQgdGhlIGJ5dGVzIGZyb20gZmlsZW5hbWUgaW50byB0aGUgYXJjaGl2ZSB1bmRlciB0aGUgbmFtZQorICAgICAgICBhcmNuYW1lLiIiIgorICAgICAgICBpZiBub3Qgc2VsZi5mcDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHdyaXRlIHRvIFpJUCBhcmNoaXZlIHRoYXQgd2FzIGFscmVhZHkgY2xvc2VkIikKKworICAgICAgICBzdCA9IG9zLnN0YXQoZmlsZW5hbWUpCisgICAgICAgIGlzZGlyID0gc3RhdC5TX0lTRElSKHN0LnN0X21vZGUpCisgICAgICAgIG10aW1lID0gdGltZS5sb2NhbHRpbWUoc3Quc3RfbXRpbWUpCisgICAgICAgIGRhdGVfdGltZSA9IG10aW1lWzA6Nl0KKyAgICAgICAgIyBDcmVhdGUgWmlwSW5mbyBpbnN0YW5jZSB0byBzdG9yZSBmaWxlIGluZm9ybWF0aW9uCisgICAgICAgIGlmIGFyY25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGFyY25hbWUgPSBmaWxlbmFtZQorICAgICAgICBhcmNuYW1lID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLnNwbGl0ZHJpdmUoYXJjbmFtZSlbMV0pCisgICAgICAgIHdoaWxlIGFyY25hbWVbMF0gaW4gKG9zLnNlcCwgb3MuYWx0c2VwKToKKyAgICAgICAgICAgIGFyY25hbWUgPSBhcmNuYW1lWzE6XQorICAgICAgICBpZiBpc2RpcjoKKyAgICAgICAgICAgIGFyY25hbWUgKz0gJy8nCisgICAgICAgIHppbmZvID0gWmlwSW5mbyhhcmNuYW1lLCBkYXRlX3RpbWUpCisgICAgICAgIHppbmZvLmV4dGVybmFsX2F0dHIgPSAoc3RbMF0gJiAweEZGRkYpIDw8IDE2TCAgICAgICMgVW5peCBhdHRyaWJ1dGVzCisgICAgICAgIGlmIGNvbXByZXNzX3R5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBzZWxmLmNvbXByZXNzaW9uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gY29tcHJlc3NfdHlwZQorCisgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IHN0LnN0X3NpemUKKyAgICAgICAgemluZm8uZmxhZ19iaXRzID0gMHgwMAorICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkgICAgIyBTdGFydCBvZiBoZWFkZXIgYnl0ZXMKKworICAgICAgICBzZWxmLl93cml0ZWNoZWNrKHppbmZvKQorICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlCisKKyAgICAgICAgaWYgaXNkaXI6CisgICAgICAgICAgICB6aW5mby5maWxlX3NpemUgPSAwCisgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gMAorICAgICAgICAgICAgemluZm8uQ1JDID0gMAorICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoemluZm8pCisgICAgICAgICAgICBzZWxmLk5hbWVUb0luZm9bemluZm8uZmlsZW5hbWVdID0gemluZm8KKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcihGYWxzZSkpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIpIGFzIGZwOgorICAgICAgICAgICAgIyBNdXN0IG92ZXJ3cml0ZSBDUkMgYW5kIHNpemVzIHdpdGggY29ycmVjdCBkYXRhIGxhdGVyCisgICAgICAgICAgICB6aW5mby5DUkMgPSBDUkMgPSAwCisgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gY29tcHJlc3Nfc2l6ZSA9IDAKKyAgICAgICAgICAgICMgQ29tcHJlc3NlZCBzaXplIGNhbiBiZSBsYXJnZXIgdGhhbiB1bmNvbXByZXNzZWQgc2l6ZQorICAgICAgICAgICAgemlwNjQgPSBzZWxmLl9hbGxvd1ppcDY0IGFuZCBcCisgICAgICAgICAgICAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSAqIDEuMDUgPiBaSVA2NF9MSU1JVAorICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5GaWxlSGVhZGVyKHppcDY0KSkKKyAgICAgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgPT0gWklQX0RFRkxBVEVEOgorICAgICAgICAgICAgICAgIGNtcHIgPSB6bGliLmNvbXByZXNzb2JqKHpsaWIuWl9ERUZBVUxUX0NPTVBSRVNTSU9OLAorICAgICAgICAgICAgICAgICAgICAgemxpYi5ERUZMQVRFRCwgLTE1KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjbXByID0gTm9uZQorICAgICAgICAgICAgZmlsZV9zaXplID0gMAorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBidWYgPSBmcC5yZWFkKDEwMjQgKiA4KQorICAgICAgICAgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gZmlsZV9zaXplICsgbGVuKGJ1ZikKKyAgICAgICAgICAgICAgICBDUkMgPSBjcmMzMihidWYsIENSQykgJiAweGZmZmZmZmZmCisgICAgICAgICAgICAgICAgaWYgY21wcjoKKyAgICAgICAgICAgICAgICAgICAgYnVmID0gY21wci5jb21wcmVzcyhidWYpCisgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzX3NpemUgPSBjb21wcmVzc19zaXplICsgbGVuKGJ1ZikKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGJ1ZikKKyAgICAgICAgaWYgY21wcjoKKyAgICAgICAgICAgIGJ1ZiA9IGNtcHIuZmx1c2goKQorICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IGNvbXByZXNzX3NpemUgKyBsZW4oYnVmKQorICAgICAgICAgICAgc2VsZi5mcC53cml0ZShidWYpCisgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gY29tcHJlc3Nfc2l6ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IGZpbGVfc2l6ZQorICAgICAgICB6aW5mby5DUkMgPSBDUkMKKyAgICAgICAgemluZm8uZmlsZV9zaXplID0gZmlsZV9zaXplCisgICAgICAgIGlmIG5vdCB6aXA2NCBhbmQgc2VsZi5fYWxsb3daaXA2NDoKKyAgICAgICAgICAgIGlmIGZpbGVfc2l6ZSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignRmlsZSBzaXplIGhhcyBpbmNyZWFzZWQgZHVyaW5nIGNvbXByZXNzaW5nJykKKyAgICAgICAgICAgIGlmIGNvbXByZXNzX3NpemUgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0NvbXByZXNzZWQgc2l6ZSBsYXJnZXIgdGhhbiB1bmNvbXByZXNzZWQgc2l6ZScpCisgICAgICAgICMgU2VlayBiYWNrd2FyZHMgYW5kIHdyaXRlIGZpbGUgaGVhZGVyICh3aGljaCB3aWxsIG5vdyBpbmNsdWRlCisgICAgICAgICMgY29ycmVjdCBDUkMgYW5kIGZpbGUgc2l6ZXMpCisgICAgICAgIHBvc2l0aW9uID0gc2VsZi5mcC50ZWxsKCkgICAgICAgIyBQcmVzZXJ2ZSBjdXJyZW50IHBvc2l0aW9uIGluIGZpbGUKKyAgICAgICAgc2VsZi5mcC5zZWVrKHppbmZvLmhlYWRlcl9vZmZzZXQsIDApCisgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcih6aXA2NCkpCisgICAgICAgIHNlbGYuZnAuc2Vlayhwb3NpdGlvbiwgMCkKKyAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoemluZm8pCisgICAgICAgIHNlbGYuTmFtZVRvSW5mb1t6aW5mby5maWxlbmFtZV0gPSB6aW5mbworCisgICAgZGVmIHdyaXRlc3RyKHNlbGYsIHppbmZvX29yX2FyY25hbWUsIGJ5dGVzLCBjb21wcmVzc190eXBlPU5vbmUpOgorICAgICAgICAiIiJXcml0ZSBhIGZpbGUgaW50byB0aGUgYXJjaGl2ZS4gIFRoZSBjb250ZW50cyBpcyB0aGUgc3RyaW5nCisgICAgICAgICdieXRlcycuICAnemluZm9fb3JfYXJjbmFtZScgaXMgZWl0aGVyIGEgWmlwSW5mbyBpbnN0YW5jZSBvcgorICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZS4iIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoemluZm9fb3JfYXJjbmFtZSwgWmlwSW5mbyk6CisgICAgICAgICAgICB6aW5mbyA9IFppcEluZm8oZmlsZW5hbWU9emluZm9fb3JfYXJjbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlX3RpbWU9dGltZS5sb2NhbHRpbWUodGltZS50aW1lKCkpWzo2XSkKKworICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHNlbGYuY29tcHJlc3Npb24KKyAgICAgICAgICAgIHppbmZvLmV4dGVybmFsX2F0dHIgPSAwNjAwIDw8IDE2CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB6aW5mbyA9IHppbmZvX29yX2FyY25hbWUKKworICAgICAgICBpZiBub3Qgc2VsZi5mcDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHdyaXRlIHRvIFpJUCBhcmNoaXZlIHRoYXQgd2FzIGFscmVhZHkgY2xvc2VkIikKKworICAgICAgICBpZiBjb21wcmVzc190eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IGNvbXByZXNzX3R5cGUKKworICAgICAgICB6aW5mby5maWxlX3NpemUgPSBsZW4oYnl0ZXMpICAgICAgICAgICAgIyBVbmNvbXByZXNzZWQgc2l6ZQorICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkgICAgIyBTdGFydCBvZiBoZWFkZXIgYnl0ZXMKKyAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKKyAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQorICAgICAgICB6aW5mby5DUkMgPSBjcmMzMihieXRlcykgJiAweGZmZmZmZmZmICAgICAgICMgQ1JDLTMyIGNoZWNrc3VtCisgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgPT0gWklQX0RFRkxBVEVEOgorICAgICAgICAgICAgY28gPSB6bGliLmNvbXByZXNzb2JqKHpsaWIuWl9ERUZBVUxUX0NPTVBSRVNTSU9OLAorICAgICAgICAgICAgICAgICB6bGliLkRFRkxBVEVELCAtMTUpCisgICAgICAgICAgICBieXRlcyA9IGNvLmNvbXByZXNzKGJ5dGVzKSArIGNvLmZsdXNoKCkKKyAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSBsZW4oYnl0ZXMpICAgICMgQ29tcHJlc3NlZCBzaXplCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gemluZm8uZmlsZV9zaXplCisgICAgICAgIHppcDY0ID0gemluZm8uZmlsZV9zaXplID4gWklQNjRfTElNSVQgb3IgXAorICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPiBaSVA2NF9MSU1JVAorICAgICAgICBpZiB6aXA2NCBhbmQgbm90IHNlbGYuX2FsbG93WmlwNjQ6CisgICAgICAgICAgICByYWlzZSBMYXJnZVppcEZpbGUoIkZpbGVzaXplIHdvdWxkIHJlcXVpcmUgWklQNjQgZXh0ZW5zaW9ucyIpCisgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcih6aXA2NCkpCisgICAgICAgIHNlbGYuZnAud3JpdGUoYnl0ZXMpCisgICAgICAgIGlmIHppbmZvLmZsYWdfYml0cyAmIDB4MDg6CisgICAgICAgICAgICAjIFdyaXRlIENSQyBhbmQgZmlsZSBzaXplcyBhZnRlciB0aGUgZmlsZSBkYXRhCisgICAgICAgICAgICBmbXQgPSAnPExRUScgaWYgemlwNjQgZWxzZSAnPExMTCcKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoc3RydWN0LnBhY2soZm10LCB6aW5mby5DUkMsIHppbmZvLmNvbXByZXNzX3NpemUsCisgICAgICAgICAgICAgICAgICB6aW5mby5maWxlX3NpemUpKQorICAgICAgICBzZWxmLmZwLmZsdXNoKCkKKyAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoemluZm8pCisgICAgICAgIHNlbGYuTmFtZVRvSW5mb1t6aW5mby5maWxlbmFtZV0gPSB6aW5mbworCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICIiIkNhbGwgdGhlICJjbG9zZSgpIiBtZXRob2QgaW4gY2FzZSB0aGUgdXNlciBmb3Jnb3QuIiIiCisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgZmlsZSwgYW5kIGZvciBtb2RlICJ3IiBhbmQgImEiIHdyaXRlIHRoZSBlbmRpbmcKKyAgICAgICAgcmVjb3Jkcy4iIiIKKyAgICAgICAgaWYgc2VsZi5mcCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5tb2RlIGluICgidyIsICJhIikgYW5kIHNlbGYuX2RpZE1vZGlmeTogIyB3cml0ZSBlbmRpbmcgcmVjb3JkcworICAgICAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICAgICAgICAgIHBvczEgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICAgICAgICAgIGZvciB6aW5mbyBpbiBzZWxmLmZpbGVsaXN0OiAgICAgICAgICMgd3JpdGUgY2VudHJhbCBkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICAgICAgICAgICAgZHQgPSB6aW5mby5kYXRlX3RpbWUKKyAgICAgICAgICAgICAgICAgICAgZG9zZGF0ZSA9IChkdFswXSAtIDE5ODApIDw8IDkgfCBkdFsxXSA8PCA1IHwgZHRbMl0KKyAgICAgICAgICAgICAgICAgICAgZG9zdGltZSA9IGR0WzNdIDw8IDExIHwgZHRbNF0gPDwgNSB8IChkdFs1XSAvLyAyKQorICAgICAgICAgICAgICAgICAgICBleHRyYSA9IFtdCisgICAgICAgICAgICAgICAgICAgIGlmIHppbmZvLmZpbGVfc2l6ZSA+IFpJUDY0X0xJTUlUIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB6aW5mby5jb21wcmVzc19zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5hcHBlbmQoemluZm8uZmlsZV9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEuYXBwZW5kKHppbmZvLmNvbXByZXNzX3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX3NpemUgPSAweGZmZmZmZmZmCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc19zaXplID0gMHhmZmZmZmZmZgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gemluZm8uZmlsZV9zaXplCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc19zaXplID0gemluZm8uY29tcHJlc3Nfc2l6ZQorCisgICAgICAgICAgICAgICAgICAgIGlmIHppbmZvLmhlYWRlcl9vZmZzZXQgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZCh6aW5mby5oZWFkZXJfb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX29mZnNldCA9IDB4ZmZmZmZmZmZMCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfb2Zmc2V0ID0gemluZm8uaGVhZGVyX29mZnNldAorCisgICAgICAgICAgICAgICAgICAgIGV4dHJhX2RhdGEgPSB6aW5mby5leHRyYQorICAgICAgICAgICAgICAgICAgICBpZiBleHRyYToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQXBwZW5kIGEgWklQNjQgZmllbGQgdG8gdGhlIGV4dHJhJ3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2RhdGEgPSBzdHJ1Y3QucGFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxISCcgKyAnUScqbGVuKGV4dHJhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgOCpsZW4oZXh0cmEpLCAqZXh0cmEpICsgZXh0cmFfZGF0YQorCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0X3ZlcnNpb24gPSBtYXgoNDUsIHppbmZvLmV4dHJhY3RfdmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV92ZXJzaW9uID0gbWF4KDQ1LCB6aW5mby5jcmVhdGVfdmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RfdmVyc2lvbiA9IHppbmZvLmV4dHJhY3RfdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlX3ZlcnNpb24gPSB6aW5mby5jcmVhdGVfdmVyc2lvbgorCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBmbGFnX2JpdHMgPSB6aW5mby5fZW5jb2RlRmlsZW5hbWVGbGFncygpCisgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZGlyID0gc3RydWN0LnBhY2soc3RydWN0Q2VudHJhbERpciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0NlbnRyYWxEaXIsIGNyZWF0ZV92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgemluZm8uY3JlYXRlX3N5c3RlbSwgZXh0cmFjdF92ZXJzaW9uLCB6aW5mby5yZXNlcnZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfYml0cywgemluZm8uY29tcHJlc3NfdHlwZSwgZG9zdGltZSwgZG9zZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHppbmZvLkNSQywgY29tcHJlc3Nfc2l6ZSwgZmlsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGZpbGVuYW1lKSwgbGVuKGV4dHJhX2RhdGEpLCBsZW4oemluZm8uY29tbWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAwLCB6aW5mby5pbnRlcm5hbF9hdHRyLCB6aW5mby5leHRlcm5hbF9hdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX29mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IERlcHJlY2F0aW9uV2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgKHN0cnVjdENlbnRyYWxEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdDZW50cmFsRGlyLCBjcmVhdGVfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHppbmZvLmNyZWF0ZV9zeXN0ZW0sIGV4dHJhY3RfdmVyc2lvbiwgemluZm8ucmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICB6aW5mby5mbGFnX2JpdHMsIHppbmZvLmNvbXByZXNzX3R5cGUsIGRvc3RpbWUsIGRvc2RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICB6aW5mby5DUkMsIGNvbXByZXNzX3NpemUsIGZpbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbih6aW5mby5maWxlbmFtZSksIGxlbihleHRyYV9kYXRhKSwgbGVuKHppbmZvLmNvbW1lbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgemluZm8uaW50ZXJuYWxfYXR0ciwgemluZm8uZXh0ZXJuYWxfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9vZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGNlbnRkaXIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoZXh0cmFfZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5jb21tZW50KQorCisgICAgICAgICAgICAgICAgcG9zMiA9IHNlbGYuZnAudGVsbCgpCisgICAgICAgICAgICAgICAgIyBXcml0ZSBlbmQtb2YtemlwLWFyY2hpdmUgcmVjb3JkCisgICAgICAgICAgICAgICAgY2VudERpckNvdW50ID0gY291bnQKKyAgICAgICAgICAgICAgICBjZW50RGlyU2l6ZSA9IHBvczIgLSBwb3MxCisgICAgICAgICAgICAgICAgY2VudERpck9mZnNldCA9IHBvczEKKyAgICAgICAgICAgICAgICBpZiAoY2VudERpckNvdW50ID49IFpJUF9GSUxFQ09VTlRfTElNSVQgb3IKKyAgICAgICAgICAgICAgICAgICAgY2VudERpck9mZnNldCA+IFpJUDY0X0xJTUlUIG9yCisgICAgICAgICAgICAgICAgICAgIGNlbnREaXJTaXplID4gWklQNjRfTElNSVQpOgorICAgICAgICAgICAgICAgICAgICAjIE5lZWQgdG8gd3JpdGUgdGhlIFpJUDY0IGVuZC1vZi1hcmNoaXZlIHJlY29yZHMKKyAgICAgICAgICAgICAgICAgICAgemlwNjRlbmRyZWMgPSBzdHJ1Y3QucGFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RFbmRBcmNoaXZlNjQsIHN0cmluZ0VuZEFyY2hpdmU2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCwgNDUsIDQ1LCAwLCAwLCBjZW50RGlyQ291bnQsIGNlbnREaXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50RGlyU2l6ZSwgY2VudERpck9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aXA2NGVuZHJlYykKKworICAgICAgICAgICAgICAgICAgICB6aXA2NGxvY3JlYyA9IHN0cnVjdC5wYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdEVuZEFyY2hpdmU2NExvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nRW5kQXJjaGl2ZTY0TG9jYXRvciwgMCwgcG9zMiwgMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aXA2NGxvY3JlYykKKyAgICAgICAgICAgICAgICAgICAgY2VudERpckNvdW50ID0gbWluKGNlbnREaXJDb3VudCwgMHhGRkZGKQorICAgICAgICAgICAgICAgICAgICBjZW50RGlyU2l6ZSA9IG1pbihjZW50RGlyU2l6ZSwgMHhGRkZGRkZGRikKKyAgICAgICAgICAgICAgICAgICAgY2VudERpck9mZnNldCA9IG1pbihjZW50RGlyT2Zmc2V0LCAweEZGRkZGRkZGKQorCisgICAgICAgICAgICAgICAgZW5kcmVjID0gc3RydWN0LnBhY2soc3RydWN0RW5kQXJjaGl2ZSwgc3RyaW5nRW5kQXJjaGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGNlbnREaXJDb3VudCwgY2VudERpckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudERpclNpemUsIGNlbnREaXJPZmZzZXQsIGxlbihzZWxmLl9jb21tZW50KSkKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGVuZHJlYykKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHNlbGYuX2NvbW1lbnQpCisgICAgICAgICAgICAgICAgc2VsZi5mcC5mbHVzaCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcCA9IHNlbGYuZnAKKyAgICAgICAgICAgIHNlbGYuZnAgPSBOb25lCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZmlsZVBhc3NlZDoKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisKKworY2xhc3MgUHlaaXBGaWxlKFppcEZpbGUpOgorICAgICIiIkNsYXNzIHRvIGNyZWF0ZSBaSVAgYXJjaGl2ZXMgd2l0aCBQeXRob24gbGlicmFyeSBmaWxlcyBhbmQgcGFja2FnZXMuIiIiCisKKyAgICBkZWYgd3JpdGVweShzZWxmLCBwYXRobmFtZSwgYmFzZW5hbWUgPSAiIik6CisgICAgICAgICIiIkFkZCBhbGwgZmlsZXMgZnJvbSAicGF0aG5hbWUiIHRvIHRoZSBaSVAgYXJjaGl2ZS4KKworICAgICAgICBJZiBwYXRobmFtZSBpcyBhIHBhY2thZ2UgZGlyZWN0b3J5LCBzZWFyY2ggdGhlIGRpcmVjdG9yeSBhbmQKKyAgICAgICAgYWxsIHBhY2thZ2Ugc3ViZGlyZWN0b3JpZXMgcmVjdXJzaXZlbHkgZm9yIGFsbCAqLnB5IGFuZCBlbnRlcgorICAgICAgICB0aGUgbW9kdWxlcyBpbnRvIHRoZSBhcmNoaXZlLiAgSWYgcGF0aG5hbWUgaXMgYSBwbGFpbgorICAgICAgICBkaXJlY3RvcnksIGxpc3RkaXIgKi5weSBhbmQgZW50ZXIgYWxsIG1vZHVsZXMuICBFbHNlLCBwYXRobmFtZQorICAgICAgICBtdXN0IGJlIGEgUHl0aG9uICoucHkgZmlsZSBhbmQgdGhlIG1vZHVsZSB3aWxsIGJlIHB1dCBpbnRvIHRoZQorICAgICAgICBhcmNoaXZlLiAgQWRkZWQgbW9kdWxlcyBhcmUgYWx3YXlzIG1vZHVsZS5weW8gb3IgbW9kdWxlLnB5Yy4KKyAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBjb21waWxlIHRoZSBtb2R1bGUucHkgaW50byBtb2R1bGUucHljIGlmCisgICAgICAgIG5lY2Vzc2FyeS4KKyAgICAgICAgIiIiCisgICAgICAgIGRpciwgbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aG5hbWUpCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aG5hbWUpOgorICAgICAgICAgICAgaW5pdG5hbWUgPSBvcy5wYXRoLmpvaW4ocGF0aG5hbWUsICJfX2luaXRfXy5weSIpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShpbml0bmFtZSk6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgcGFja2FnZSBkaXJlY3RvcnksIGFkZCBpdAorICAgICAgICAgICAgICAgIGlmIGJhc2VuYW1lOgorICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZSA9ICIlcy8lcyIgJSAoYmFzZW5hbWUsIG5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUgPSBuYW1lCisgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkFkZGluZyBwYWNrYWdlIGluIiwgcGF0aG5hbWUsICJhcyIsIGJhc2VuYW1lCisgICAgICAgICAgICAgICAgZm5hbWUsIGFyY25hbWUgPSBzZWxmLl9nZXRfY29kZW5hbWUoaW5pdG5hbWVbMDotM10sIGJhc2VuYW1lKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJBZGRpbmciLCBhcmNuYW1lCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZShmbmFtZSwgYXJjbmFtZSkKKyAgICAgICAgICAgICAgICBkaXJsaXN0ID0gb3MubGlzdGRpcihwYXRobmFtZSkKKyAgICAgICAgICAgICAgICBkaXJsaXN0LnJlbW92ZSgiX19pbml0X18ucHkiKQorICAgICAgICAgICAgICAgICMgQWRkIGFsbCAqLnB5IGZpbGVzIGFuZCBwYWNrYWdlIHN1YmRpcmVjdG9yaWVzCisgICAgICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGRpcmxpc3Q6CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aG5hbWUsIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICByb290LCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHBhdGgsICJfX2luaXRfXy5weSIpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYSBwYWNrYWdlIGRpcmVjdG9yeSwgYWRkIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZXB5KHBhdGgsIGJhc2VuYW1lKSAgIyBSZWN1cnNpdmUgY2FsbAorICAgICAgICAgICAgICAgICAgICBlbGlmIGV4dCA9PSAiLnB5IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLCBhcmNuYW1lID0gc2VsZi5fZ2V0X2NvZGVuYW1lKHBhdGhbMDotM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiQWRkaW5nIiwgYXJjbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZShmbmFtZSwgYXJjbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIE5PVCBhIHBhY2thZ2UgZGlyZWN0b3J5LCBhZGQgaXRzIGZpbGVzIGF0IHRvcCBsZXZlbAorICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJBZGRpbmcgZmlsZXMgZnJvbSBkaXJlY3RvcnkiLCBwYXRobmFtZQorICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKHBhdGhuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRobmFtZSwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgIHJvb3QsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgIGlmIGV4dCA9PSAiLnB5IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLCBhcmNuYW1lID0gc2VsZi5fZ2V0X2NvZGVuYW1lKHBhdGhbMDotM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiQWRkaW5nIiwgYXJjbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZShmbmFtZSwgYXJjbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHBhdGhuYW1lWy0zOl0gIT0gIi5weSI6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgJ0ZpbGVzIGFkZGVkIHdpdGggd3JpdGVweSgpIG11c3QgZW5kIHdpdGggIi5weSInCisgICAgICAgICAgICBmbmFtZSwgYXJjbmFtZSA9IHNlbGYuX2dldF9jb2RlbmFtZShwYXRobmFtZVswOi0zXSwgYmFzZW5hbWUpCisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnOgorICAgICAgICAgICAgICAgIHByaW50ICJBZGRpbmcgZmlsZSIsIGFyY25hbWUKKyAgICAgICAgICAgIHNlbGYud3JpdGUoZm5hbWUsIGFyY25hbWUpCisKKyAgICBkZWYgX2dldF9jb2RlbmFtZShzZWxmLCBwYXRobmFtZSwgYmFzZW5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gKGZpbGVuYW1lLCBhcmNoaXZlbmFtZSkgZm9yIHRoZSBwYXRoLgorCisgICAgICAgIEdpdmVuIGEgbW9kdWxlIG5hbWUgcGF0aCwgcmV0dXJuIHRoZSBjb3JyZWN0IGZpbGUgcGF0aCBhbmQKKyAgICAgICAgYXJjaGl2ZSBuYW1lLCBjb21waWxpbmcgaWYgbmVjZXNzYXJ5LiAgRm9yIGV4YW1wbGUsIGdpdmVuCisgICAgICAgIC9weXRob24vbGliL3N0cmluZywgcmV0dXJuICgvcHl0aG9uL2xpYi9zdHJpbmcucHljLCBzdHJpbmcpLgorICAgICAgICAiIiIKKyAgICAgICAgZmlsZV9weSAgPSBwYXRobmFtZSArICIucHkiCisgICAgICAgIGZpbGVfcHljID0gcGF0aG5hbWUgKyAiLnB5YyIKKyAgICAgICAgZmlsZV9weW8gPSBwYXRobmFtZSArICIucHlvIgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmaWxlX3B5bykgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KGZpbGVfcHlvKS5zdF9tdGltZSA+PSBvcy5zdGF0KGZpbGVfcHkpLnN0X210aW1lOgorICAgICAgICAgICAgZm5hbWUgPSBmaWxlX3B5byAgICAjIFVzZSAucHlvIGZpbGUKKyAgICAgICAgZWxpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZmlsZV9weWMpIG9yIFwKKyAgICAgICAgICAgICBvcy5zdGF0KGZpbGVfcHljKS5zdF9tdGltZSA8IG9zLnN0YXQoZmlsZV9weSkuc3RfbXRpbWU6CisgICAgICAgICAgICBpbXBvcnQgcHlfY29tcGlsZQorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgICAgICBwcmludCAiQ29tcGlsaW5nIiwgZmlsZV9weQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHB5X2NvbXBpbGUuY29tcGlsZShmaWxlX3B5LCBmaWxlX3B5YywgTm9uZSwgVHJ1ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBweV9jb21waWxlLlB5Q29tcGlsZUVycm9yLGVycjoKKyAgICAgICAgICAgICAgICBwcmludCBlcnIubXNnCisgICAgICAgICAgICBmbmFtZSA9IGZpbGVfcHljCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbmFtZSA9IGZpbGVfcHljCisgICAgICAgIGFyY2hpdmVuYW1lID0gb3MucGF0aC5zcGxpdChmbmFtZSlbMV0KKyAgICAgICAgaWYgYmFzZW5hbWU6CisgICAgICAgICAgICBhcmNoaXZlbmFtZSA9ICIlcy8lcyIgJSAoYmFzZW5hbWUsIGFyY2hpdmVuYW1lKQorICAgICAgICByZXR1cm4gKGZuYW1lLCBhcmNoaXZlbmFtZSkKKworCitkZWYgbWFpbihhcmdzID0gTm9uZSk6CisgICAgaW1wb3J0IHRleHR3cmFwCisgICAgVVNBR0U9dGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgVXNhZ2U6CisgICAgICAgICAgICB6aXBmaWxlLnB5IC1sIHppcGZpbGUuemlwICAgICAgICAjIFNob3cgbGlzdGluZyBvZiBhIHppcGZpbGUKKyAgICAgICAgICAgIHppcGZpbGUucHkgLXQgemlwZmlsZS56aXAgICAgICAgICMgVGVzdCBpZiBhIHppcGZpbGUgaXMgdmFsaWQKKyAgICAgICAgICAgIHppcGZpbGUucHkgLWUgemlwZmlsZS56aXAgdGFyZ2V0ICMgRXh0cmFjdCB6aXBmaWxlIGludG8gdGFyZ2V0IGRpcgorICAgICAgICAgICAgemlwZmlsZS5weSAtYyB6aXBmaWxlLnppcCBzcmMgLi4uICMgQ3JlYXRlIHppcGZpbGUgZnJvbSBzb3VyY2VzCisgICAgICAgICIiIikKKyAgICBpZiBhcmdzIGlzIE5vbmU6CisgICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKworICAgIGlmIG5vdCBhcmdzIG9yIGFyZ3NbMF0gbm90IGluICgnLWwnLCAnLWMnLCAnLWUnLCAnLXQnKToKKyAgICAgICAgcHJpbnQgVVNBR0UKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGlmIGFyZ3NbMF0gPT0gJy1sJzoKKyAgICAgICAgaWYgbGVuKGFyZ3MpICE9IDI6CisgICAgICAgICAgICBwcmludCBVU0FHRQorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgd2l0aCBaaXBGaWxlKGFyZ3NbMV0sICdyJykgYXMgemY6CisgICAgICAgICAgICB6Zi5wcmludGRpcigpCisKKyAgICBlbGlmIGFyZ3NbMF0gPT0gJy10JzoKKyAgICAgICAgaWYgbGVuKGFyZ3MpICE9IDI6CisgICAgICAgICAgICBwcmludCBVU0FHRQorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgd2l0aCBaaXBGaWxlKGFyZ3NbMV0sICdyJykgYXMgemY6CisgICAgICAgICAgICBiYWRmaWxlID0gemYudGVzdHppcCgpCisgICAgICAgIGlmIGJhZGZpbGU6CisgICAgICAgICAgICBwcmludCgiVGhlIGZvbGxvd2luZyBlbmNsb3NlZCBmaWxlIGlzIGNvcnJ1cHRlZDogeyFyfSIuZm9ybWF0KGJhZGZpbGUpKQorICAgICAgICBwcmludCAiRG9uZSB0ZXN0aW5nIgorCisgICAgZWxpZiBhcmdzWzBdID09ICctZSc6CisgICAgICAgIGlmIGxlbihhcmdzKSAhPSAzOgorICAgICAgICAgICAgcHJpbnQgVVNBR0UKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICAgICAgd2l0aCBaaXBGaWxlKGFyZ3NbMV0sICdyJykgYXMgemY6CisgICAgICAgICAgICBvdXQgPSBhcmdzWzJdCisgICAgICAgICAgICBmb3IgcGF0aCBpbiB6Zi5uYW1lbGlzdCgpOgorICAgICAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCgnLi8nKToKKyAgICAgICAgICAgICAgICAgICAgdGd0ID0gb3MucGF0aC5qb2luKG91dCwgcGF0aFsyOl0pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGd0ID0gb3MucGF0aC5qb2luKG91dCwgcGF0aCkKKworICAgICAgICAgICAgICAgIHRndGRpciA9IG9zLnBhdGguZGlybmFtZSh0Z3QpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHRndGRpcik6CisgICAgICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKHRndGRpcikKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4odGd0LCAnd2InKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoemYucmVhZChwYXRoKSkKKworICAgIGVsaWYgYXJnc1swXSA9PSAnLWMnOgorICAgICAgICBpZiBsZW4oYXJncykgPCAzOgorICAgICAgICAgICAgcHJpbnQgVVNBR0UKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICAgICAgZGVmIGFkZFRvWmlwKHpmLCBwYXRoLCB6aXBwYXRoKToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgICAgIHpmLndyaXRlKHBhdGgsIHppcHBhdGgsIFpJUF9ERUZMQVRFRCkKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgICAgICAgICBmb3Igbm0gaW4gb3MubGlzdGRpcihwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgYWRkVG9aaXAoemYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHBhdGgsIG5tKSwgb3MucGF0aC5qb2luKHppcHBhdGgsIG5tKSkKKyAgICAgICAgICAgICMgZWxzZTogaWdub3JlCisKKyAgICAgICAgd2l0aCBaaXBGaWxlKGFyZ3NbMV0sICd3JywgYWxsb3daaXA2ND1UcnVlKSBhcyB6ZjoKKyAgICAgICAgICAgIGZvciBzcmMgaW4gYXJnc1syOl06CisgICAgICAgICAgICAgICAgYWRkVG9aaXAoemYsIHNyYywgb3MucGF0aC5iYXNlbmFtZShzcmMpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy96aXBmaWxlLnB5YyBiL2xpYi9weXRob24yLjcvemlwZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0YWViMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvemlwZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy96aXBmaWxlLnB5byBiL2xpYi9weXRob24yLjcvemlwZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0YWViMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvemlwZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2hhcmUvbWFuL21hbjEvcHl0aG9uLjEgYi9zaGFyZS9tYW4vbWFuMS9weXRob24uMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi44MjJkNjJmCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvbWFuL21hbjEvcHl0aG9uLjEKQEAgLTAsMCArMSBAQAorcHl0aG9uMi4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2hhcmUvbWFuL21hbjEvcHl0aG9uMi4xIGIvc2hhcmUvbWFuL21hbjEvcHl0aG9uMi4xCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmFmYzU2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9tYW4vbWFuMS9weXRob24yLjEKQEAgLTAsMCArMSBAQAorcHl0aG9uMi43LjEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zaGFyZS9tYW4vbWFuMS9weXRob24yLjcuMSBiL3NoYXJlL21hbi9tYW4xL3B5dGhvbjIuNy4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZWRiY2EKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9tYW4vbWFuMS9weXRob24yLjcuMQpAQCAtMCwwICsxLDQ3MyBAQAorLlRIIFBZVEhPTiAiMSIgIiREYXRlJCIKKworLlwiIFRvIHZpZXcgdGhpcyBmaWxlIHdoaWxlIGVkaXRpbmcsIHJ1biBpdCB0aHJvdWdoIGdyb2ZmOgorLlwiICAgZ3JvZmYgLVRhc2NpaSAtbWFuIHB5dGhvbi5tYW4gfCBsZXNzCisKKy5TSCBOQU1FCitweXRob24gXC0gYW4gaW50ZXJwcmV0ZWQsIGludGVyYWN0aXZlLCBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UKKy5TSCBTWU5PUFNJUworLkIgcHl0aG9uCitbCisuQiBcLUIKK10KK1sKKy5CIFwtZAorXQorWworLkIgXC1FCitdCitbCisuQiBcLWgKK10KK1sKKy5CIFwtaQorXQorWworLkIgXC1tIAorLkkgbW9kdWxlLW5hbWUKK10KKy5icgorICAgICAgIFsKKy5CIFwtTworXQorWworLkIgXC1PTworXQorWworLkIgXC1SCitdCitbCisuQiAtUQorLkkgYXJndW1lbnQKK10KK1sKKy5CIFwtcworXQorWworLkIgXC1TCitdCitbCisuQiBcLXQKK10KK1sKKy5CIFwtdQorXQorLmJyCisgICAgICAgWworLkIgXC12CitdCitbCisuQiBcLVYKK10KK1sKKy5CIFwtVworLkkgYXJndW1lbnQKK10KK1sKKy5CIFwteAorXQorWworLkIgXC0zCitdCitbCisuQiBcLT8KK10KKy5icgorICAgICAgIFsKKy5CIFwtYworLkkgY29tbWFuZAorfAorLkkgc2NyaXB0Cit8CitcLQorXQorWworLkkgYXJndW1lbnRzCitdCisuU0ggREVTQ1JJUFRJT04KK1B5dGhvbiBpcyBhbiBpbnRlcnByZXRlZCwgaW50ZXJhY3RpdmUsIG9iamVjdC1vcmllbnRlZCBwcm9ncmFtbWluZworbGFuZ3VhZ2UgdGhhdCBjb21iaW5lcyByZW1hcmthYmxlIHBvd2VyIHdpdGggdmVyeSBjbGVhciBzeW50YXguCitGb3IgYW4gaW50cm9kdWN0aW9uIHRvIHByb2dyYW1taW5nIGluIFB5dGhvbiB5b3UgYXJlIHJlZmVycmVkIHRvIHRoZQorUHl0aG9uIFR1dG9yaWFsLgorVGhlIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSBkb2N1bWVudHMgYnVpbHQtaW4gYW5kIHN0YW5kYXJkIHR5cGVzLAorY29uc3RhbnRzLCBmdW5jdGlvbnMgYW5kIG1vZHVsZXMuCitGaW5hbGx5LCB0aGUgUHl0aG9uIFJlZmVyZW5jZSBNYW51YWwgZGVzY3JpYmVzIHRoZSBzeW50YXggYW5kCitzZW1hbnRpY3Mgb2YgdGhlIGNvcmUgbGFuZ3VhZ2UgaW4gKHBlcmhhcHMgdG9vKSBtdWNoIGRldGFpbC4KKyhUaGVzZSBkb2N1bWVudHMgbWF5IGJlIGxvY2F0ZWQgdmlhIHRoZQorLkIgIklOVEVSTkVUIFJFU09VUkNFUyIKK2JlbG93OyB0aGV5IG1heSBiZSBpbnN0YWxsZWQgb24geW91ciBzeXN0ZW0gYXMgd2VsbC4pCisuUFAKK1B5dGhvbidzIGJhc2ljIHBvd2VyIGNhbiBiZSBleHRlbmRlZCB3aXRoIHlvdXIgb3duIG1vZHVsZXMgd3JpdHRlbiBpbgorQyBvciBDKysuCitPbiBtb3N0IHN5c3RlbXMgc3VjaCBtb2R1bGVzIG1heSBiZSBkeW5hbWljYWxseSBsb2FkZWQuCitQeXRob24gaXMgYWxzbyBhZGFwdGFibGUgYXMgYW4gZXh0ZW5zaW9uIGxhbmd1YWdlIGZvciBleGlzdGluZworYXBwbGljYXRpb25zLgorU2VlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uIGZvciBoaW50cy4KKy5QUAorRG9jdW1lbnRhdGlvbiBmb3IgaW5zdGFsbGVkIFB5dGhvbiBtb2R1bGVzIGFuZCBwYWNrYWdlcyBjYW4gYmUgCit2aWV3ZWQgYnkgcnVubmluZyB0aGUgCisuQiBweWRvYworcHJvZ3JhbS4gIAorLlNIIENPTU1BTkQgTElORSBPUFRJT05TCisuVFAKKy5CIFwtQgorRG9uJ3Qgd3JpdGUKKy5JIC5weVtjb10KK2ZpbGVzIG9uIGltcG9ydC4gU2VlIGFsc28gUFlUSE9ORE9OVFdSSVRFQllURUNPREUuCisuVFAKKy5CSSAiXC1jICIgY29tbWFuZAorU3BlY2lmeSB0aGUgY29tbWFuZCB0byBleGVjdXRlIChzZWUgbmV4dCBzZWN0aW9uKS4KK1RoaXMgdGVybWluYXRlcyB0aGUgb3B0aW9uIGxpc3QgKGZvbGxvd2luZyBvcHRpb25zIGFyZSBwYXNzZWQgYXMKK2FyZ3VtZW50cyB0byB0aGUgY29tbWFuZCkuCisuVFAKKy5CIFwtZAorVHVybiBvbiBwYXJzZXIgZGVidWdnaW5nIG91dHB1dCAoZm9yIHdpemFyZHMgb25seSwgZGVwZW5kaW5nIG9uCitjb21waWxhdGlvbiBvcHRpb25zKS4KKy5UUAorLkIgXC1FCitJZ25vcmUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGxpa2UgUFlUSE9OUEFUSCBhbmQgUFlUSE9OSE9NRSB0aGF0IG1vZGlmeQordGhlIGJlaGF2aW9yIG9mIHRoZSBpbnRlcnByZXRlci4KKy5UUAorLkIgXC1oICIsICIgXC0/ICIsICJcLVwtaGVscAorUHJpbnRzIHRoZSB1c2FnZSBmb3IgdGhlIGludGVycHJldGVyIGV4ZWN1dGFibGUgYW5kIGV4aXRzLgorLlRQCisuQiBcLWkKK1doZW4gYSBzY3JpcHQgaXMgcGFzc2VkIGFzIGZpcnN0IGFyZ3VtZW50IG9yIHRoZSBcZkJcLWNcZlAgb3B0aW9uIGlzCit1c2VkLCBlbnRlciBpbnRlcmFjdGl2ZSBtb2RlIGFmdGVyIGV4ZWN1dGluZyB0aGUgc2NyaXB0IG9yIHRoZQorY29tbWFuZC4gIEl0IGRvZXMgbm90IHJlYWQgdGhlICRQWVRIT05TVEFSVFVQIGZpbGUuICBUaGlzIGNhbiBiZQordXNlZnVsIHRvIGluc3BlY3QgZ2xvYmFsIHZhcmlhYmxlcyBvciBhIHN0YWNrIHRyYWNlIHdoZW4gYSBzY3JpcHQKK3JhaXNlcyBhbiBleGNlcHRpb24uCisuVFAKKy5CSSAiXC1tICIgbW9kdWxlLW5hbWUKK1NlYXJjaGVzIAorLkkgc3lzLnBhdGggCitmb3IgdGhlIG5hbWVkIG1vZHVsZSBhbmQgcnVucyB0aGUgY29ycmVzcG9uZGluZyAKKy5JIC5weSAKK2ZpbGUgYXMgYSBzY3JpcHQuCisuVFAKKy5CIFwtTworVHVybiBvbiBiYXNpYyBvcHRpbWl6YXRpb25zLiAgVGhpcyBjaGFuZ2VzIHRoZSBmaWxlbmFtZSBleHRlbnNpb24gZm9yCitjb21waWxlZCAoYnl0ZWNvZGUpIGZpbGVzIGZyb20KKy5JIC5weWMKK3RvIFxmSS5weW9cZlAuICBHaXZlbiB0d2ljZSwgY2F1c2VzIGRvY3N0cmluZ3MgdG8gYmUgZGlzY2FyZGVkLgorLlRQCisuQiBcLU9PCitEaXNjYXJkIGRvY3N0cmluZ3MgaW4gYWRkaXRpb24gdG8gdGhlIFxmQi1PXGZQIG9wdGltaXphdGlvbnMuCisuVFAKKy5CIFwtUgorVHVybiBvbiAiaGFzaCByYW5kb21pemF0aW9uIiwgc28gdGhhdCB0aGUgaGFzaCgpIHZhbHVlcyBvZiBzdHIsIGJ5dGVzIGFuZAorZGF0ZXRpbWUgb2JqZWN0cyBhcmUgInNhbHRlZCIgd2l0aCBhbiB1bnByZWRpY3RhYmxlIHBzZXVkby1yYW5kb20gdmFsdWUuCitBbHRob3VnaCB0aGV5IHJlbWFpbiBjb25zdGFudCB3aXRoaW4gYW4gaW5kaXZpZHVhbCBQeXRob24gcHJvY2VzcywgdGhleSBhcmUKK25vdCBwcmVkaWN0YWJsZSBiZXR3ZWVuIHJlcGVhdGVkIGludm9jYXRpb25zIG9mIFB5dGhvbi4KKy5JUAorVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHByb3RlY3Rpb24gYWdhaW5zdCBhIGRlbmlhbCBvZiBzZXJ2aWNlCitjYXVzZWQgYnkgY2FyZWZ1bGx5LWNob3NlbiBpbnB1dHMgdGhhdCBleHBsb2l0IHRoZSB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlCitvZiBhIGRpY3QgY29uc3RydWN0aW9uLCBPKG5eMikgY29tcGxleGl0eS4gIFNlZQoraHR0cDovL3d3dy5vY2VydC5vcmcvYWR2aXNvcmllcy9vY2VydC0yMDExLTAwMy5odG1sCitmb3IgZGV0YWlscy4KKy5UUAorLkJJICJcLVEgIiBhcmd1bWVudAorRGl2aXNpb24gY29udHJvbDsgc2VlIFBFUCAyMzguICBUaGUgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgIm9sZCIgKHRoZQorZGVmYXVsdCwgaW50L2ludCBhbmQgbG9uZy9sb25nIHJldHVybiBhbiBpbnQgb3IgbG9uZyksICJuZXciIChuZXcKK2RpdmlzaW9uIHNlbWFudGljcywgaS5lLiBpbnQvaW50IGFuZCBsb25nL2xvbmcgcmV0dXJucyBhIGZsb2F0KSwKKyJ3YXJuIiAob2xkIGRpdmlzaW9uIHNlbWFudGljcyB3aXRoIGEgd2FybmluZyBmb3IgaW50L2ludCBhbmQKK2xvbmcvbG9uZyksIG9yICJ3YXJuYWxsIiAob2xkIGRpdmlzaW9uIHNlbWFudGljcyB3aXRoIGEgd2FybmluZyBmb3IKK2FsbCB1c2Ugb2YgdGhlIGRpdmlzaW9uIG9wZXJhdG9yKS4gIEZvciBhIHVzZSBvZiAid2FybmFsbCIsIHNlZSB0aGUKK1Rvb2xzL3NjcmlwdHMvZml4ZGl2LnB5IHNjcmlwdC4KKy5UUAorLkIgXC1zCitEb24ndCBhZGQgdXNlciBzaXRlIGRpcmVjdG9yeSB0byBzeXMucGF0aC4KKy5UUAorLkIgXC1TCitEaXNhYmxlIHRoZSBpbXBvcnQgb2YgdGhlIG1vZHVsZQorLkkgc2l0ZQorYW5kIHRoZSBzaXRlLWRlcGVuZGVudCBtYW5pcHVsYXRpb25zIG9mCisuSSBzeXMucGF0aAordGhhdCBpdCBlbnRhaWxzLgorLlRQCisuQiBcLXQKK0lzc3VlIGEgd2FybmluZyB3aGVuIGEgc291cmNlIGZpbGUgbWl4ZXMgdGFicyBhbmQgc3BhY2VzIGZvcgoraW5kZW50YXRpb24gaW4gYSB3YXkgdGhhdCBtYWtlcyBpdCBkZXBlbmQgb24gdGhlIHdvcnRoIG9mIGEgdGFiCitleHByZXNzZWQgaW4gc3BhY2VzLiAgSXNzdWUgYW4gZXJyb3Igd2hlbiB0aGUgb3B0aW9uIGlzIGdpdmVuIHR3aWNlLgorLlRQCisuQiBcLXUKK0ZvcmNlIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyciB0byBiZSB0b3RhbGx5IHVuYnVmZmVyZWQuICBPbiBzeXN0ZW1zCit3aGVyZSBpdCBtYXR0ZXJzLCBhbHNvIHB1dCBzdGRpbiwgc3Rkb3V0IGFuZCBzdGRlcnIgaW4gYmluYXJ5IG1vZGUuCitOb3RlIHRoYXQgdGhlcmUgaXMgaW50ZXJuYWwgYnVmZmVyaW5nIGluIHhyZWFkbGluZXMoKSwgcmVhZGxpbmVzKCkgYW5kCitmaWxlLW9iamVjdCBpdGVyYXRvcnMgKCJmb3IgbGluZSBpbiBzeXMuc3RkaW4iKSB3aGljaCBpcyBub3QKK2luZmx1ZW5jZWQgYnkgdGhpcyBvcHRpb24uICBUbyB3b3JrIGFyb3VuZCB0aGlzLCB5b3Ugd2lsbCB3YW50IHRvIHVzZQorInN5cy5zdGRpbi5yZWFkbGluZSgpIiBpbnNpZGUgYSAid2hpbGUgMToiIGxvb3AuCisuVFAKKy5CIFwtdgorUHJpbnQgYSBtZXNzYWdlIGVhY2ggdGltZSBhIG1vZHVsZSBpcyBpbml0aWFsaXplZCwgc2hvd2luZyB0aGUgcGxhY2UKKyhmaWxlbmFtZSBvciBidWlsdC1pbiBtb2R1bGUpIGZyb20gd2hpY2ggaXQgaXMgbG9hZGVkLiAgV2hlbiBnaXZlbgordHdpY2UsIHByaW50IGEgbWVzc2FnZSBmb3IgZWFjaCBmaWxlIHRoYXQgaXMgY2hlY2tlZCBmb3Igd2hlbiAKK3NlYXJjaGluZyBmb3IgYSBtb2R1bGUuICBBbHNvIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIG1vZHVsZSBjbGVhbnVwCithdCBleGl0LgorLlRQCisuQiBcLVYgIiwgIiBcLVwtdmVyc2lvbgorUHJpbnRzIHRoZSBQeXRob24gdmVyc2lvbiBudW1iZXIgb2YgdGhlIGV4ZWN1dGFibGUgYW5kIGV4aXRzLgorLlRQCisuQkkgIlwtVyAiIGFyZ3VtZW50CitXYXJuaW5nIGNvbnRyb2wuICBQeXRob24gc29tZXRpbWVzIHByaW50cyB3YXJuaW5nIG1lc3NhZ2UgdG8KKy5JUiBzeXMuc3RkZXJyIC4KK0EgdHlwaWNhbCB3YXJuaW5nIG1lc3NhZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybToKKy5JQiBmaWxlICI6IiBsaW5lICI6ICIgY2F0ZWdvcnkgIjogIiBtZXNzYWdlLgorQnkgZGVmYXVsdCwgZWFjaCB3YXJuaW5nIGlzIHByaW50ZWQgb25jZSBmb3IgZWFjaCBzb3VyY2UgbGluZSB3aGVyZSBpdAorb2NjdXJzLiAgVGhpcyBvcHRpb24gY29udHJvbHMgaG93IG9mdGVuIHdhcm5pbmdzIGFyZSBwcmludGVkLgorTXVsdGlwbGUKKy5CIFwtVworb3B0aW9ucyBtYXkgYmUgZ2l2ZW47IHdoZW4gYSB3YXJuaW5nIG1hdGNoZXMgbW9yZSB0aGFuIG9uZQorb3B0aW9uLCB0aGUgYWN0aW9uIGZvciB0aGUgbGFzdCBtYXRjaGluZyBvcHRpb24gaXMgcGVyZm9ybWVkLgorSW52YWxpZAorLkIgXC1XCitvcHRpb25zIGFyZSBpZ25vcmVkIChhIHdhcm5pbmcgbWVzc2FnZSBpcyBwcmludGVkIGFib3V0IGludmFsaWQKK29wdGlvbnMgd2hlbiB0aGUgZmlyc3Qgd2FybmluZyBpcyBpc3N1ZWQpLiAgV2FybmluZ3MgY2FuIGFsc28gYmUKK2NvbnRyb2xsZWQgZnJvbSB3aXRoaW4gYSBQeXRob24gcHJvZ3JhbSB1c2luZyB0aGUKKy5JIHdhcm5pbmdzCittb2R1bGUuCisKK1RoZSBzaW1wbGVzdCBmb3JtIG9mCisuSSBhcmd1bWVudAoraXMgb25lIG9mIHRoZSBmb2xsb3dpbmcKKy5JIGFjdGlvbgorc3RyaW5ncyAob3IgYSB1bmlxdWUgYWJicmV2aWF0aW9uKToKKy5CIGlnbm9yZQordG8gaWdub3JlIGFsbCB3YXJuaW5nczsKKy5CIGRlZmF1bHQKK3RvIGV4cGxpY2l0bHkgcmVxdWVzdCB0aGUgZGVmYXVsdCBiZWhhdmlvciAocHJpbnRpbmcgZWFjaCB3YXJuaW5nIG9uY2UKK3BlciBzb3VyY2UgbGluZSk7CisuQiBhbGwKK3RvIHByaW50IGEgd2FybmluZyBlYWNoIHRpbWUgaXQgb2NjdXJzICh0aGlzIG1heSBnZW5lcmF0ZSBtYW55CittZXNzYWdlcyBpZiBhIHdhcm5pbmcgaXMgdHJpZ2dlcmVkIHJlcGVhdGVkbHkgZm9yIHRoZSBzYW1lIHNvdXJjZQorbGluZSwgc3VjaCBhcyBpbnNpZGUgYSBsb29wKTsKKy5CIG1vZHVsZQordG8gcHJpbnQgZWFjaCB3YXJuaW5nIG9ubHkgdGhlIGZpcnN0IHRpbWUgaXQgb2NjdXJzIGluIGVhY2gKK21vZHVsZTsKKy5CIG9uY2UKK3RvIHByaW50IGVhY2ggd2FybmluZyBvbmx5IHRoZSBmaXJzdCB0aW1lIGl0IG9jY3VycyBpbiB0aGUgcHJvZ3JhbTsgb3IKKy5CIGVycm9yCit0byByYWlzZSBhbiBleGNlcHRpb24gaW5zdGVhZCBvZiBwcmludGluZyBhIHdhcm5pbmcgbWVzc2FnZS4KKworVGhlIGZ1bGwgZm9ybSBvZgorLkkgYXJndW1lbnQKK2lzCisuSUIgYWN0aW9uIDogbWVzc2FnZSA6IGNhdGVnb3J5IDogbW9kdWxlIDogbGluZS4KK0hlcmUsCisuSSBhY3Rpb24KK2lzIGFzIGV4cGxhaW5lZCBhYm92ZSBidXQgb25seSBhcHBsaWVzIHRvIG1lc3NhZ2VzIHRoYXQgbWF0Y2ggdGhlCityZW1haW5pbmcgZmllbGRzLiAgRW1wdHkgZmllbGRzIG1hdGNoIGFsbCB2YWx1ZXM7IHRyYWlsaW5nIGVtcHR5CitmaWVsZHMgbWF5IGJlIG9taXR0ZWQuICBUaGUKKy5JIG1lc3NhZ2UKK2ZpZWxkIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2UgcHJpbnRlZDsgdGhpcyBtYXRjaCBpcworY2FzZS1pbnNlbnNpdGl2ZS4gIFRoZQorLkkgY2F0ZWdvcnkKK2ZpZWxkIG1hdGNoZXMgdGhlIHdhcm5pbmcgY2F0ZWdvcnkuICBUaGlzIG11c3QgYmUgYSBjbGFzcyBuYW1lOyB0aGUKK21hdGNoIHRlc3Qgd2hldGhlciB0aGUgYWN0dWFsIHdhcm5pbmcgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UgaXMgYQorc3ViY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCB3YXJuaW5nIGNhdGVnb3J5LiAgVGhlIGZ1bGwgY2xhc3MgbmFtZSBtdXN0CitiZSBnaXZlbi4gIFRoZQorLkkgbW9kdWxlCitmaWVsZCBtYXRjaGVzIHRoZSAoZnVsbHktcXVhbGlmaWVkKSBtb2R1bGUgbmFtZTsgdGhpcyBtYXRjaCBpcworY2FzZS1zZW5zaXRpdmUuICBUaGUKKy5JIGxpbmUKK2ZpZWxkIG1hdGNoZXMgdGhlIGxpbmUgbnVtYmVyLCB3aGVyZSB6ZXJvIG1hdGNoZXMgYWxsIGxpbmUgbnVtYmVycyBhbmQKK2lzIHRodXMgZXF1aXZhbGVudCB0byBhbiBvbWl0dGVkIGxpbmUgbnVtYmVyLgorLlRQCisuQiBcLXgKK1NraXAgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHNvdXJjZS4gIFRoaXMgaXMgaW50ZW5kZWQgZm9yIGEgRE9TCitzcGVjaWZpYyBoYWNrIG9ubHkuICBXYXJuaW5nOiB0aGUgbGluZSBudW1iZXJzIGluIGVycm9yIG1lc3NhZ2VzIHdpbGwKK2JlIG9mZiBieSBvbmUhCisuVFAKKy5CIFwtMworV2FybiBhYm91dCBQeXRob24gMy54IGluY29tcGF0aWJpbGl0aWVzIHRoYXQgMnRvMyBjYW5ub3QgdHJpdmlhbGx5IGZpeC4KKy5TSCBJTlRFUlBSRVRFUiBJTlRFUkZBQ0UKK1RoZSBpbnRlcnByZXRlciBpbnRlcmZhY2UgcmVzZW1ibGVzIHRoYXQgb2YgdGhlIFVOSVggc2hlbGw6IHdoZW4KK2NhbGxlZCB3aXRoIHN0YW5kYXJkIGlucHV0IGNvbm5lY3RlZCB0byBhIHR0eSBkZXZpY2UsIGl0IHByb21wdHMgZm9yCitjb21tYW5kcyBhbmQgZXhlY3V0ZXMgdGhlbSB1bnRpbCBhbiBFT0YgaXMgcmVhZDsgd2hlbiBjYWxsZWQgd2l0aCBhCitmaWxlIG5hbWUgYXJndW1lbnQgb3Igd2l0aCBhIGZpbGUgYXMgc3RhbmRhcmQgaW5wdXQsIGl0IHJlYWRzIGFuZAorZXhlY3V0ZXMgYQorLkkgc2NyaXB0Citmcm9tIHRoYXQgZmlsZTsKK3doZW4gY2FsbGVkIHdpdGgKKy5CIFwtYworLkkgY29tbWFuZCwKK2l0IGV4ZWN1dGVzIHRoZSBQeXRob24gc3RhdGVtZW50KHMpIGdpdmVuIGFzCisuSSBjb21tYW5kLgorSGVyZQorLkkgY29tbWFuZAorbWF5IGNvbnRhaW4gbXVsdGlwbGUgc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgbmV3bGluZXMuCitMZWFkaW5nIHdoaXRlc3BhY2UgaXMgc2lnbmlmaWNhbnQgaW4gUHl0aG9uIHN0YXRlbWVudHMhCitJbiBub24taW50ZXJhY3RpdmUgbW9kZSwgdGhlIGVudGlyZSBpbnB1dCBpcyBwYXJzZWQgYmVmb3JlIGl0IGlzCitleGVjdXRlZC4KKy5QUAorSWYgYXZhaWxhYmxlLCB0aGUgc2NyaXB0IG5hbWUgYW5kIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRoZXJlYWZ0ZXIgYXJlCitwYXNzZWQgdG8gdGhlIHNjcmlwdCBpbiB0aGUgUHl0aG9uIHZhcmlhYmxlCisuSSBzeXMuYXJndiAsCit3aGljaCBpcyBhIGxpc3Qgb2Ygc3RyaW5ncyAoeW91IG11c3QgZmlyc3QKKy5JIGltcG9ydCBzeXMKK3RvIGJlIGFibGUgdG8gYWNjZXNzIGl0KS4KK0lmIG5vIHNjcmlwdCBuYW1lIGlzIGdpdmVuLAorLkkgc3lzLmFyZ3ZbMF0KK2lzIGFuIGVtcHR5IHN0cmluZzsgaWYKKy5CIFwtYworaXMgdXNlZCwKKy5JIHN5cy5hcmd2WzBdCitjb250YWlucyB0aGUgc3RyaW5nCisuSSAnLWMnLgorTm90ZSB0aGF0IG9wdGlvbnMgaW50ZXJwcmV0ZWQgYnkgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpdHNlbGYKK2FyZSBub3QgcGxhY2VkIGluCisuSSBzeXMuYXJndi4KKy5QUAorSW4gaW50ZXJhY3RpdmUgbW9kZSwgdGhlIHByaW1hcnkgcHJvbXB0IGlzIGA+Pj4nOyB0aGUgc2Vjb25kIHByb21wdAorKHdoaWNoIGFwcGVhcnMgd2hlbiBhIGNvbW1hbmQgaXMgbm90IGNvbXBsZXRlKSBpcyBgLi4uJy4KK1RoZSBwcm9tcHRzIGNhbiBiZSBjaGFuZ2VkIGJ5IGFzc2lnbm1lbnQgdG8KKy5JIHN5cy5wczEKK29yCisuSSBzeXMucHMyLgorVGhlIGludGVycHJldGVyIHF1aXRzIHdoZW4gaXQgcmVhZHMgYW4gRU9GIGF0IGEgcHJvbXB0LgorV2hlbiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uIG9jY3VycywgYSBzdGFjayB0cmFjZSBpcyBwcmludGVkIGFuZAorY29udHJvbCByZXR1cm5zIHRvIHRoZSBwcmltYXJ5IHByb21wdDsgaW4gbm9uLWludGVyYWN0aXZlIG1vZGUsIHRoZQoraW50ZXJwcmV0ZXIgZXhpdHMgYWZ0ZXIgcHJpbnRpbmcgdGhlIHN0YWNrIHRyYWNlLgorVGhlIGludGVycnVwdCBzaWduYWwgcmFpc2VzIHRoZQorLkkgS2V5Ym9hcmRcJUludGVycnVwdAorZXhjZXB0aW9uOyBvdGhlciBVTklYIHNpZ25hbHMgYXJlIG5vdCBjYXVnaHQgKGV4Y2VwdCB0aGF0IFNJR1BJUEUgaXMKK3NvbWV0aW1lcyBpZ25vcmVkLCBpbiBmYXZvciBvZiB0aGUKKy5JIElPRXJyb3IKK2V4Y2VwdGlvbikuICBFcnJvciBtZXNzYWdlcyBhcmUgd3JpdHRlbiB0byBzdGRlcnIuCisuU0ggRklMRVMgQU5EIERJUkVDVE9SSUVTCitUaGVzZSBhcmUgc3ViamVjdCB0byBkaWZmZXJlbmNlIGRlcGVuZGluZyBvbiBsb2NhbCBpbnN0YWxsYXRpb24KK2NvbnZlbnRpb25zOyAke3ByZWZpeH0gYW5kICR7ZXhlY19wcmVmaXh9IGFyZSBpbnN0YWxsYXRpb24tZGVwZW5kZW50CithbmQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGZvciBHTlUgc29mdHdhcmU7IHRoZXkgbWF5IGJlIHRoZSBzYW1lLgorVGhlIGRlZmF1bHQgZm9yIGJvdGggaXMgXGZJL3Vzci9sb2NhbFxmUC4KKy5JUCBcZkkke2V4ZWNfcHJlZml4fS9iaW4vcHl0aG9uXGZQCitSZWNvbW1lbmRlZCBsb2NhdGlvbiBvZiB0aGUgaW50ZXJwcmV0ZXIuCisuUFAKKy5JICR7cHJlZml4fS9saWIvcHl0aG9uPHZlcnNpb24+CisuYnIKKy5JICR7ZXhlY19wcmVmaXh9L2xpYi9weXRob248dmVyc2lvbj4KKy5SUworUmVjb21tZW5kZWQgbG9jYXRpb25zIG9mIHRoZSBkaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBzdGFuZGFyZAorbW9kdWxlcy4KKy5SRQorLlBQCisuSSAke3ByZWZpeH0vaW5jbHVkZS9weXRob248dmVyc2lvbj4KKy5icgorLkkgJHtleGVjX3ByZWZpeH0vaW5jbHVkZS9weXRob248dmVyc2lvbj4KKy5SUworUmVjb21tZW5kZWQgbG9jYXRpb25zIG9mIHRoZSBkaXJlY3RvcmllcyBjb250YWluaW5nIHRoZSBpbmNsdWRlIGZpbGVzCituZWVkZWQgZm9yIGRldmVsb3BpbmcgUHl0aG9uIGV4dGVuc2lvbnMgYW5kIGVtYmVkZGluZyB0aGUKK2ludGVycHJldGVyLgorLlJFCisuSVAgXGZJfi8ucHl0aG9ucmMucHlcZlAKK1VzZXItc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZmlsZSBsb2FkZWQgYnkgdGhlIFxmSXVzZXJcZlAgbW9kdWxlOworbm90IHVzZWQgYnkgZGVmYXVsdCBvciBieSBtb3N0IGFwcGxpY2F0aW9ucy4KKy5TSCBFTlZJUk9OTUVOVCBWQVJJQUJMRVMKKy5JUCBQWVRIT05IT01FCitDaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBzdGFuZGFyZCBQeXRob24gbGlicmFyaWVzLiAgQnkgZGVmYXVsdCwgdGhlCitsaWJyYXJpZXMgYXJlIHNlYXJjaGVkIGluICR7cHJlZml4fS9saWIvcHl0aG9uPHZlcnNpb24+IGFuZAorJHtleGVjX3ByZWZpeH0vbGliL3B5dGhvbjx2ZXJzaW9uPiwgd2hlcmUgJHtwcmVmaXh9IGFuZCAke2V4ZWNfcHJlZml4fQorYXJlIGluc3RhbGxhdGlvbi1kZXBlbmRlbnQgZGlyZWN0b3JpZXMsIGJvdGggZGVmYXVsdGluZyB0bworXGZJL3Vzci9sb2NhbFxmUC4gIFdoZW4gJFBZVEhPTkhPTUUgaXMgc2V0IHRvIGEgc2luZ2xlIGRpcmVjdG9yeSwgaXRzIHZhbHVlCityZXBsYWNlcyBib3RoICR7cHJlZml4fSBhbmQgJHtleGVjX3ByZWZpeH0uICBUbyBzcGVjaWZ5IGRpZmZlcmVudCB2YWx1ZXMKK2ZvciB0aGVzZSwgc2V0ICRQWVRIT05IT01FIHRvICR7cHJlZml4fToke2V4ZWNfcHJlZml4fS4KKy5JUCBQWVRIT05QQVRICitBdWdtZW50cyB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgbW9kdWxlIGZpbGVzLgorVGhlIGZvcm1hdCBpcyB0aGUgc2FtZSBhcyB0aGUgc2hlbGwncyAkUEFUSDogb25lIG9yIG1vcmUgZGlyZWN0b3J5CitwYXRobmFtZXMgc2VwYXJhdGVkIGJ5IGNvbG9ucy4KK05vbi1leGlzdGVudCBkaXJlY3RvcmllcyBhcmUgc2lsZW50bHkgaWdub3JlZC4KK1RoZSBkZWZhdWx0IHNlYXJjaCBwYXRoIGlzIGluc3RhbGxhdGlvbiBkZXBlbmRlbnQsIGJ1dCBnZW5lcmFsbHkKK2JlZ2lucyB3aXRoICR7cHJlZml4fS9saWIvcHl0aG9uPHZlcnNpb24+IChzZWUgUFlUSE9OSE9NRSBhYm92ZSkuCitUaGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBpcyBhbHdheXMgYXBwZW5kZWQgdG8gJFBZVEhPTlBBVEguCitJZiBhIHNjcmlwdCBhcmd1bWVudCBpcyBnaXZlbiwgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBzY3JpcHQgaXMKK2luc2VydGVkIGluIHRoZSBwYXRoIGluIGZyb250IG9mICRQWVRIT05QQVRILgorVGhlIHNlYXJjaCBwYXRoIGNhbiBiZSBtYW5pcHVsYXRlZCBmcm9tIHdpdGhpbiBhIFB5dGhvbiBwcm9ncmFtIGFzIHRoZQordmFyaWFibGUKKy5JIHN5cy5wYXRoIC4KKy5JUCBQWVRIT05TVEFSVFVQCitJZiB0aGlzIGlzIHRoZSBuYW1lIG9mIGEgcmVhZGFibGUgZmlsZSwgdGhlIFB5dGhvbiBjb21tYW5kcyBpbiB0aGF0CitmaWxlIGFyZSBleGVjdXRlZCBiZWZvcmUgdGhlIGZpcnN0IHByb21wdCBpcyBkaXNwbGF5ZWQgaW4gaW50ZXJhY3RpdmUKK21vZGUuCitUaGUgZmlsZSBpcyBleGVjdXRlZCBpbiB0aGUgc2FtZSBuYW1lIHNwYWNlIHdoZXJlIGludGVyYWN0aXZlIGNvbW1hbmRzCithcmUgZXhlY3V0ZWQgc28gdGhhdCBvYmplY3RzIGRlZmluZWQgb3IgaW1wb3J0ZWQgaW4gaXQgY2FuIGJlIHVzZWQKK3dpdGhvdXQgcXVhbGlmaWNhdGlvbiBpbiB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbi4KK1lvdSBjYW4gYWxzbyBjaGFuZ2UgdGhlIHByb21wdHMKKy5JIHN5cy5wczEKK2FuZAorLkkgc3lzLnBzMgoraW4gdGhpcyBmaWxlLgorLklQIFBZVEhPTlkySworU2V0IHRoaXMgdG8gYSBub24tZW1wdHkgc3RyaW5nIHRvIGNhdXNlIHRoZSBcZkl0aW1lXGZQIG1vZHVsZSB0bworcmVxdWlyZSBkYXRlcyBzcGVjaWZpZWQgYXMgc3RyaW5ncyB0byBpbmNsdWRlIDQtZGlnaXQgeWVhcnMsIG90aGVyd2lzZQorMi1kaWdpdCB5ZWFycyBhcmUgY29udmVydGVkIGJhc2VkIG9uIHJ1bGVzIGRlc2NyaWJlZCBpbiB0aGUgXGZJdGltZVxmUAorbW9kdWxlIGRvY3VtZW50YXRpb24uCisuSVAgUFlUSE9OT1BUSU1JWkUKK0lmIHRoaXMgaXMgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyBpdCBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcKK3RoZSBcZkJcLU9cZlAgb3B0aW9uLiBJZiBzZXQgdG8gYW4gaW50ZWdlciwgaXQgaXMgZXF1aXZhbGVudCB0bworc3BlY2lmeWluZyBcZkJcLU9cZlAgbXVsdGlwbGUgdGltZXMuCisuSVAgUFlUSE9OREVCVUcKK0lmIHRoaXMgaXMgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyBpdCBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcKK3RoZSBcZkJcLWRcZlAgb3B0aW9uLiBJZiBzZXQgdG8gYW4gaW50ZWdlciwgaXQgaXMgZXF1aXZhbGVudCB0bworc3BlY2lmeWluZyBcZkJcLWRcZlAgbXVsdGlwbGUgdGltZXMuCisuSVAgUFlUSE9ORE9OVFdSSVRFQllURUNPREUKK0lmIHRoaXMgaXMgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyBpdCBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcKK3RoZSBcZkJcLUJcZlAgb3B0aW9uIChkb24ndCB0cnkgdG8gd3JpdGUKKy5JIC5weVtjb10KK2ZpbGVzKS4KKy5JUCBQWVRIT05JTlNQRUNUCitJZiB0aGlzIGlzIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgaXQgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nCit0aGUgXGZCXC1pXGZQIG9wdGlvbi4KKy5JUCBQWVRIT05JT0VOQ09ESU5HCitJZiB0aGlzIGlzIHNldCBiZWZvcmUgcnVubmluZyB0aGUgaW50ZXJwcmV0ZXIsIGl0IG92ZXJyaWRlcyB0aGUgZW5jb2RpbmcgdXNlZAorZm9yIHN0ZGluL3N0ZG91dC9zdGRlcnIsIGluIHRoZSBzeW50YXgKKy5JQiBlbmNvZGluZ25hbWUgIjoiIGVycm9yaGFuZGxlcgorVGhlCisuSUIgZXJyb3JoYW5kbGVyCitwYXJ0IGlzIG9wdGlvbmFsIGFuZCBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBzdHIuZW5jb2RlLiBGb3Igc3RkZXJyLCB0aGUKKy5JQiBlcnJvcmhhbmRsZXIKKyBwYXJ0IGlzIGlnbm9yZWQ7IHRoZSBoYW5kbGVyIHdpbGwgYWx3YXlzIGJlIFwnYmFja3NsYXNocmVwbGFjZVwnLgorLklQIFBZVEhPTk5PVVNFUlNJVEUKK0lmIHRoaXMgaXMgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyBpdCBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcgdGhlCitcZkJcLXNcZlAgb3B0aW9uIChEb24ndCBhZGQgdGhlIHVzZXIgc2l0ZSBkaXJlY3RvcnkgdG8gc3lzLnBhdGgpLgorLklQIFBZVEhPTlVOQlVGRkVSRUQKK0lmIHRoaXMgaXMgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyBpdCBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcKK3RoZSBcZkJcLXVcZlAgb3B0aW9uLgorLklQIFBZVEhPTlZFUkJPU0UKK0lmIHRoaXMgaXMgc2V0IHRvIGEgbm9uLWVtcHR5IHN0cmluZyBpdCBpcyBlcXVpdmFsZW50IHRvIHNwZWNpZnlpbmcKK3RoZSBcZkJcLXZcZlAgb3B0aW9uLiBJZiBzZXQgdG8gYW4gaW50ZWdlciwgaXQgaXMgZXF1aXZhbGVudCB0bworc3BlY2lmeWluZyBcZkJcLXZcZlAgbXVsdGlwbGUgdGltZXMuIAorLklQIFBZVEhPTldBUk5JTkdTCitJZiB0aGlzIGlzIHNldCB0byBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcgaXQgaXMgZXF1aXZhbGVudCB0bworc3BlY2lmeWluZyB0aGUgXGZCXC1XXGZQIG9wdGlvbiBmb3IgZWFjaCBzZXBhcmF0ZSB2YWx1ZS4KKy5JUCBQWVRIT05IQVNIU0VFRAorSWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gInJhbmRvbSIsIHRoZSBlZmZlY3QgaXMgdGhlIHNhbWUgYXMgc3BlY2lmeWluZwordGhlIFxmQi1SXGZQIG9wdGlvbjogYSByYW5kb20gdmFsdWUgaXMgdXNlZCB0byBzZWVkIHRoZSBoYXNoZXMgb2Ygc3RyLAorYnl0ZXMgYW5kIGRhdGV0aW1lIG9iamVjdHMuCisKK0lmIFBZVEhPTkhBU0hTRUVEIGlzIHNldCB0byBhbiBpbnRlZ2VyIHZhbHVlLCBpdCBpcyB1c2VkIGFzIGEgZml4ZWQgc2VlZCBmb3IKK2dlbmVyYXRpbmcgdGhlIGhhc2goKSBvZiB0aGUgdHlwZXMgY292ZXJlZCBieSB0aGUgaGFzaCByYW5kb21pemF0aW9uLiAgSXRzCitwdXJwb3NlIGlzIHRvIGFsbG93IHJlcGVhdGFibGUgaGFzaGluZywgc3VjaCBhcyBmb3Igc2VsZnRlc3RzIGZvciB0aGUKK2ludGVycHJldGVyIGl0c2VsZiwgb3IgdG8gYWxsb3cgYSBjbHVzdGVyIG9mIHB5dGhvbiBwcm9jZXNzZXMgdG8gc2hhcmUgaGFzaAordmFsdWVzLgorCitUaGUgaW50ZWdlciBtdXN0IGJlIGEgZGVjaW1hbCBudW1iZXIgaW4gdGhlIHJhbmdlIFswLDQyOTQ5NjcyOTVdLiAgU3BlY2lmeWluZwordGhlIHZhbHVlIDAgd2lsbCBsZWFkIHRvIHRoZSBzYW1lIGhhc2ggdmFsdWVzIGFzIHdoZW4gaGFzaCByYW5kb21pemF0aW9uIGlzCitkaXNhYmxlZC4KKy5TSCBBVVRIT1IKK1RoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjogaHR0cDovL3d3dy5weXRob24ub3JnL3BzZgorLlNIIElOVEVSTkVUIFJFU09VUkNFUworTWFpbiB3ZWJzaXRlOiAgaHR0cDovL3d3dy5weXRob24ub3JnLworLmJyCitEb2N1bWVudGF0aW9uOiAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8KKy5icgorRGV2ZWxvcGVyIHJlc291cmNlczogIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvZGV2Z3VpZGUvCisuYnIKK0Rvd25sb2FkczogIGh0dHA6Ly9weXRob24ub3JnL2Rvd25sb2FkLworLmJyCitNb2R1bGUgcmVwb3NpdG9yeTogIGh0dHA6Ly9weXBpLnB5dGhvbi5vcmcvCisuYnIKK05ld3Nncm91cHM6ICBjb21wLmxhbmcucHl0aG9uLCBjb21wLmxhbmcucHl0aG9uLmFubm91bmNlCisuU0ggTElDRU5TSU5HCitQeXRob24gaXMgZGlzdHJpYnV0ZWQgdW5kZXIgYW4gT3BlbiBTb3VyY2UgbGljZW5zZS4gIFNlZSB0aGUgZmlsZQorIkxJQ0VOU0UiIGluIHRoZSBQeXRob24gc291cmNlIGRpc3RyaWJ1dGlvbiBmb3IgaW5mb3JtYXRpb24gb24gdGVybXMgJgorY29uZGl0aW9ucyBmb3IgYWNjZXNzaW5nIGFuZCBvdGhlcndpc2UgdXNpbmcgUHl0aG9uIGFuZCBmb3IgYQorRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4KZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuNi9fX2luaXRfXy5weSBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuNi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjEzNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL2xpYnN0ZGN4eC9nY2MtNC42L19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKKwpkaWZmIC0tZ2l0IGEvc2hhcmUvcHJldHR5LXByaW50ZXJzL2xpYnN0ZGN4eC9nY2MtNC42L3ByaW50ZXJzLnB5IGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL2xpYnN0ZGN4eC9nY2MtNC42L3ByaW50ZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOTk5YmYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvbGlic3RkY3h4L2djYy00LjYvcHJpbnRlcnMucHkKQEAgLTAsMCArMSw4MDIgQEAKKyMgUHJldHR5LXByaW50ZXJzIGZvciBsaWJzdGMrKy4KKworIyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK2ltcG9ydCBnZGIKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCByZQorCitjbGFzcyBTdGRQb2ludGVyUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzbWFydCBwb2ludGVyIG9mIHNvbWUga2luZCIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIGlmIHNlbGYudmFsWydfTV9yZWZjb3VudCddWydfTV9waSddID09IDA6CisgICAgICAgICAgICByZXR1cm4gJyVzIChlbXB0eSkgJXMnICUgKHNlbGYudHlwZW5hbWUsIHNlbGYudmFsWydfTV9wdHInXSkKKyAgICAgICAgcmV0dXJuICclcyAoY291bnQgJWQpICVzJyAlIChzZWxmLnR5cGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmFsWydfTV9yZWZjb3VudCddWydfTV9waSddWydfTV91c2VfY291bnQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZhbFsnX01fcHRyJ10pCisKK2NsYXNzIFVuaXF1ZVBvaW50ZXJQcmludGVyOgorICAgICJQcmludCBhIHVuaXF1ZV9wdHIiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV90J10KKworY2xhc3MgU3RkTGlzdFByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpsaXN0IgorCisgICAgY2xhc3MgX2l0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXR5cGUsIGhlYWQpOgorICAgICAgICAgICAgc2VsZi5ub2RldHlwZSA9IG5vZGV0eXBlCisgICAgICAgICAgICBzZWxmLmJhc2UgPSBoZWFkWydfTV9uZXh0J10KKyAgICAgICAgICAgIHNlbGYuaGVhZCA9IGhlYWQuYWRkcmVzcworICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5iYXNlID09IHNlbGYuaGVhZDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICBlbHQgPSBzZWxmLmJhc2UuY2FzdChzZWxmLm5vZGV0eXBlKS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICBzZWxmLmJhc2UgPSBlbHRbJ19NX25leHQnXQorICAgICAgICAgICAgY291bnQgPSBzZWxmLmNvdW50CisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKyAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgY291bnQsIGVsdFsnX01fZGF0YSddKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiBjaGlsZHJlbihzZWxmKToKKyAgICAgICAgaXR5cGUgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgICMgSWYgdGhlIGluZmVyaW9yIHByb2dyYW0gaXMgY29tcGlsZWQgd2l0aCAtRF9HTElCQ1hYX0RFQlVHCisgICAgICAgICMgc29tZSBvZiB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscyBjaGFuZ2UuCisgICAgICAgIGlmIHNlbGYudHlwZW5hbWUgPT0gInN0ZDo6bGlzdCI6CisgICAgICAgICAgICBub2RldHlwZSA9IGdkYi5sb29rdXBfdHlwZSgnc3RkOjpfTGlzdF9ub2RlPCVzPicgJSBpdHlwZSkucG9pbnRlcigpCisgICAgICAgIGVsaWYgc2VsZi50eXBlbmFtZSA9PSAic3RkOjpfX2RlYnVnOjpsaXN0IjoKKyAgICAgICAgICAgIG5vZGV0eXBlID0gZ2RiLmxvb2t1cF90eXBlKCdzdGQ6Ol9fbm9ybTo6X0xpc3Rfbm9kZTwlcz4nICUgaXR5cGUpLnBvaW50ZXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkNhbm5vdCBjYXN0IGxpc3Qgbm9kZSBmb3IgbGlzdCBwcmludGVyLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXJhdG9yKG5vZGV0eXBlLCBzZWxmLnZhbFsnX01faW1wbCddWydfTV9ub2RlJ10pCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnZhbFsnX01faW1wbCddWydfTV9ub2RlJ10uYWRkcmVzcyA9PSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9ub2RlJ11bJ19NX25leHQnXToKKyAgICAgICAgICAgIHJldHVybiAnZW1wdHkgJXMnICUgKHNlbGYudHlwZW5hbWUpCisgICAgICAgIHJldHVybiAnJXMnICUgKHNlbGYudHlwZW5hbWUpCisKK2NsYXNzIFN0ZExpc3RJdGVyYXRvclByaW50ZXI6CisgICAgIlByaW50IHN0ZDo6bGlzdDo6aXRlcmF0b3IiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgaXR5cGUgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgICMgSWYgdGhlIGluZmVyaW9yIHByb2dyYW0gaXMgY29tcGlsZWQgd2l0aCAtRF9HTElCQ1hYX0RFQlVHCisgICAgICAgICMgc29tZSBvZiB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlscyBjaGFuZ2UuCisgICAgICAgIGlmIHNlbGYudHlwZW5hbWUgPT0gInN0ZDo6X0xpc3RfaXRlcmF0b3IiIG9yIHNlbGYudHlwZW5hbWUgPT0gInN0ZDo6X0xpc3RfY29uc3RfaXRlcmF0b3IiOgorICAgICAgICAgICAgbm9kZXR5cGUgPSBnZGIubG9va3VwX3R5cGUoJ3N0ZDo6X0xpc3Rfbm9kZTwlcz4nICUgaXR5cGUpLnBvaW50ZXIoKQorICAgICAgICBlbGlmIHNlbGYudHlwZW5hbWUgPT0gInN0ZDo6X19ub3JtOjpfTGlzdF9pdGVyYXRvciIgb3Igc2VsZi50eXBlbmFtZSA9PSAic3RkOjpfX25vcm06Ol9MaXN0X2NvbnN0X2l0ZXJhdG9yIjoKKyAgICAgICAgICAgIG5vZGV0eXBlID0gZ2RiLmxvb2t1cF90eXBlKCdzdGQ6Ol9fbm9ybTo6X0xpc3Rfbm9kZTwlcz4nICUgaXR5cGUpLnBvaW50ZXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkNhbm5vdCBjYXN0IGxpc3Qgbm9kZSBmb3IgbGlzdCBpdGVyYXRvciBwcmludGVyLiIKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9ub2RlJ10uY2FzdChub2RldHlwZSkuZGVyZWZlcmVuY2UoKVsnX01fZGF0YSddCisKK2NsYXNzIFN0ZFNsaXN0UHJpbnRlcjoKKyAgICAiUHJpbnQgYSBfX2dudV9jeHg6OnNsaXN0IgorCisgICAgY2xhc3MgX2l0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXR5cGUsIGhlYWQpOgorICAgICAgICAgICAgc2VsZi5ub2RldHlwZSA9IG5vZGV0eXBlCisgICAgICAgICAgICBzZWxmLmJhc2UgPSBoZWFkWydfTV9oZWFkJ11bJ19NX25leHQnXQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5iYXNlID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgZWx0ID0gc2VsZi5iYXNlLmNhc3Qoc2VsZi5ub2RldHlwZSkuZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgc2VsZi5iYXNlID0gZWx0WydfTV9uZXh0J10KKyAgICAgICAgICAgIGNvdW50ID0gc2VsZi5jb3VudAorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBlbHRbJ19NX2RhdGEnXSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIGNoaWxkcmVuKHNlbGYpOgorICAgICAgICBpdHlwZSA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMCkKKyAgICAgICAgbm9kZXR5cGUgPSBnZGIubG9va3VwX3R5cGUoJ19fZ251X2N4eDo6X1NsaXN0X25vZGU8JXM+JyAlIGl0eXBlKS5wb2ludGVyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXJhdG9yKG5vZGV0eXBlLCBzZWxmLnZhbCkKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIGlmIHNlbGYudmFsWydfTV9oZWFkJ11bJ19NX25leHQnXSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICdlbXB0eSBfX2dudV9jeHg6OnNsaXN0JworICAgICAgICByZXR1cm4gJ19fZ251X2N4eDo6c2xpc3QnCisKK2NsYXNzIFN0ZFNsaXN0SXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBfX2dudV9jeHg6OnNsaXN0OjppdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgaXR5cGUgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgIG5vZGV0eXBlID0gZ2RiLmxvb2t1cF90eXBlKCdfX2dudV9jeHg6Ol9TbGlzdF9ub2RlPCVzPicgJSBpdHlwZSkucG9pbnRlcigpCisgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01fbm9kZSddLmNhc3Qobm9kZXR5cGUpLmRlcmVmZXJlbmNlKClbJ19NX2RhdGEnXQorCitjbGFzcyBTdGRWZWN0b3JQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6dmVjdG9yIgorCisgICAgY2xhc3MgX2l0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18gKHNlbGYsIHN0YXJ0LCBmaW5pc2gsIGJpdHZlYyk6CisgICAgICAgICAgICBzZWxmLmJpdHZlYyA9IGJpdHZlYworICAgICAgICAgICAgaWYgYml0dmVjOgorICAgICAgICAgICAgICAgIHNlbGYuaXRlbSAgID0gc3RhcnRbJ19NX3AnXQorICAgICAgICAgICAgICAgIHNlbGYuc28gICAgID0gc3RhcnRbJ19NX29mZnNldCddCisgICAgICAgICAgICAgICAgc2VsZi5maW5pc2ggPSBmaW5pc2hbJ19NX3AnXQorICAgICAgICAgICAgICAgIHNlbGYuZm8gICAgID0gZmluaXNoWydfTV9vZmZzZXQnXQorICAgICAgICAgICAgICAgIGl0eXBlID0gc2VsZi5pdGVtLmRlcmVmZXJlbmNlKCkudHlwZQorICAgICAgICAgICAgICAgIHNlbGYuaXNpemUgPSA4ICogaXR5cGUuc2l6ZW9mCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuaXRlbSA9IHN0YXJ0CisgICAgICAgICAgICAgICAgc2VsZi5maW5pc2ggPSBmaW5pc2gKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGNvdW50ID0gc2VsZi5jb3VudAorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgICAgICBpZiBzZWxmLmJpdHZlYzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLml0ZW0gPT0gc2VsZi5maW5pc2ggYW5kIHNlbGYuc28gPj0gc2VsZi5mbzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIGVsdCA9IHNlbGYuaXRlbS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgaWYgZWx0ICYgKDEgPDwgc2VsZi5zbyk6CisgICAgICAgICAgICAgICAgICAgIG9iaXQgPSAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb2JpdCA9IDAKKyAgICAgICAgICAgICAgICBzZWxmLnNvID0gc2VsZi5zbyArIDEKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNvID49IHNlbGYuaXNpemU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaXRlbSA9IHNlbGYuaXRlbSArIDEKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zbyA9IDAKKyAgICAgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBvYml0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLml0ZW0gPT0gc2VsZi5maW5pc2g6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICAgICBlbHQgPSBzZWxmLml0ZW0uZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgIHNlbGYuaXRlbSA9IHNlbGYuaXRlbSArIDEKKyAgICAgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBlbHQpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorICAgICAgICBzZWxmLmlzX2Jvb2wgPSB2YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKS5jb2RlICA9PSBnZGIuVFlQRV9DT0RFX0JPT0wKKworICAgIGRlZiBjaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXJhdG9yKHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZhbFsnX01faW1wbCddWydfTV9maW5pc2gnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaXNfYm9vbCkKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIHN0YXJ0ID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fc3RhcnQnXQorICAgICAgICBmaW5pc2ggPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9maW5pc2gnXQorICAgICAgICBlbmQgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9lbmRfb2Zfc3RvcmFnZSddCisgICAgICAgIGlmIHNlbGYuaXNfYm9vbDoKKyAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fc3RhcnQnXVsnX01fcCddCisgICAgICAgICAgICBzbyAgICA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J11bJ19NX29mZnNldCddCisgICAgICAgICAgICBmaW5pc2ggPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9maW5pc2gnXVsnX01fcCddCisgICAgICAgICAgICBmbyAgICAgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9maW5pc2gnXVsnX01fb2Zmc2V0J10KKyAgICAgICAgICAgIGl0eXBlID0gc3RhcnQuZGVyZWZlcmVuY2UoKS50eXBlCisgICAgICAgICAgICBibCA9IDggKiBpdHlwZS5zaXplb2YKKyAgICAgICAgICAgIGxlbmd0aCAgID0gKGJsIC0gc28pICsgYmwgKiAoKGZpbmlzaCAtIHN0YXJ0KSAtIDEpICsgZm8KKyAgICAgICAgICAgIGNhcGFjaXR5ID0gYmwgKiAoZW5kIC0gc3RhcnQpCisgICAgICAgICAgICByZXR1cm4gKCclczxib29sPiBvZiBsZW5ndGggJWQsIGNhcGFjaXR5ICVkJworICAgICAgICAgICAgICAgICAgICAlIChzZWxmLnR5cGVuYW1lLCBpbnQgKGxlbmd0aCksIGludCAoY2FwYWNpdHkpKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAoJyVzIG9mIGxlbmd0aCAlZCwgY2FwYWNpdHkgJWQnCisgICAgICAgICAgICAgICAgICAgICUgKHNlbGYudHlwZW5hbWUsIGludCAoZmluaXNoIC0gc3RhcnQpLCBpbnQgKGVuZCAtIHN0YXJ0KSkpCisKKyAgICBkZWYgZGlzcGxheV9oaW50KHNlbGYpOgorICAgICAgICByZXR1cm4gJ2FycmF5JworCitjbGFzcyBTdGRWZWN0b3JJdGVyYXRvclByaW50ZXI6CisgICAgIlByaW50IHN0ZDo6dmVjdG9yOjppdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9jdXJyZW50J10uZGVyZWZlcmVuY2UoKQorCitjbGFzcyBTdGRUdXBsZVByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjp0dXBsZSIKKworICAgIGNsYXNzIF9pdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fIChzZWxmLCBoZWFkKToKKyAgICAgICAgICAgIHNlbGYuaGVhZCA9IGhlYWQKKworICAgICAgICAgICAgIyBTZXQgdGhlIGJhc2UgY2xhc3MgYXMgdGhlIGluaXRpYWwgaGVhZCBvZiB0aGUKKyAgICAgICAgICAgICMgdHVwbGUuCisgICAgICAgICAgICBub2RlcyA9IHNlbGYuaGVhZC50eXBlLmZpZWxkcyAoKQorICAgICAgICAgICAgaWYgbGVuIChub2RlcykgIT0gMToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiVG9wIG9mIHR1cGxlIHRyZWUgZG9lcyBub3QgY29uc2lzdCBvZiBhIHNpbmdsZSBub2RlLiIKKworICAgICAgICAgICAgIyBTZXQgdGhlIGFjdHVhbCBoZWFkIHRvIHRoZSBmaXJzdCBwYWlyLgorICAgICAgICAgICAgc2VsZi5oZWFkICA9IHNlbGYuaGVhZC5jYXN0IChub2Rlc1swXS50eXBlKQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18gKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgICAgICBub2RlcyA9IHNlbGYuaGVhZC50eXBlLmZpZWxkcyAoKQorICAgICAgICAgICAgIyBDaGVjayBmb3IgZnVydGhlciByZWN1cnNpb25zIGluIHRoZSBpbmhlcml0YW5jZSB0cmVlLgorICAgICAgICAgICAgaWYgbGVuIChub2RlcykgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAjIENoZWNrIHRoYXQgdGhpcyBpdGVyYXRpb24gaGFzIGFuIGV4cGVjdGVkIHN0cnVjdHVyZS4KKyAgICAgICAgICAgIGlmIGxlbiAobm9kZXMpICE9IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkNhbm5vdCBwYXJzZSBtb3JlIHRoYW4gMiBub2RlcyBpbiBhIHR1cGxlIHRyZWUuIgorCisgICAgICAgICAgICAjIC0gTGVmdCBub2RlIGlzIHRoZSBuZXh0IHJlY3Vyc2lvbiBwYXJlbnQuCisgICAgICAgICAgICAjIC0gUmlnaHQgbm9kZSBpcyB0aGUgYWN0dWFsIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGUgdHVwbGUuCisKKyAgICAgICAgICAgICMgUHJvY2VzcyByaWdodCBub2RlLgorICAgICAgICAgICAgaW1wbCA9IHNlbGYuaGVhZC5jYXN0IChub2Rlc1sxXS50eXBlKQorCisgICAgICAgICAgICAjIFByb2Nlc3MgbGVmdCBub2RlIGFuZCBzZXQgaXQgYXMgaGVhZC4KKyAgICAgICAgICAgIHNlbGYuaGVhZCAgPSBzZWxmLmhlYWQuY2FzdCAobm9kZXNbMF0udHlwZSkKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorCisgICAgICAgICAgICAjIEZpbmFsbHksIGNoZWNrIHRoZSBpbXBsZW1lbnRhdGlvbi4gIElmIGl0IGlzCisgICAgICAgICAgICAjIHdyYXBwZWQgaW4gX01faGVhZF9pbXBsIHJldHVybiB0aGF0LCBvdGhlcndpc2UgcmV0dXJuCisgICAgICAgICAgICAjIHRoZSB2YWx1ZSAiYXMgaXMiLgorICAgICAgICAgICAgZmllbGRzID0gaW1wbC50eXBlLmZpZWxkcyAoKQorICAgICAgICAgICAgaWYgbGVuIChmaWVsZHMpIDwgMSBvciBmaWVsZHNbMF0ubmFtZSAhPSAiX01faGVhZF9pbXBsIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIHNlbGYuY291bnQsIGltcGwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgc2VsZi5jb3VudCwgaW1wbFsnX01faGVhZF9pbXBsJ10pCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWw7CisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faXRlcmF0b3IgKHNlbGYudmFsKQorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHJldHVybiAnJXMgY29udGFpbmluZycgJSAoc2VsZi50eXBlbmFtZSkKKworY2xhc3MgU3RkU3RhY2tPclF1ZXVlUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OnN0YWNrIG9yIHN0ZDo6cXVldWUiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52aXN1YWxpemVyID0gZ2RiLmRlZmF1bHRfdmlzdWFsaXplcih2YWxbJ2MnXSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZpc3VhbGl6ZXIuY2hpbGRyZW4oKQorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHJldHVybiAnJXMgd3JhcHBpbmc6ICVzJyAlIChzZWxmLnR5cGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52aXN1YWxpemVyLnRvX3N0cmluZygpKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIgKHNlbGYudmlzdWFsaXplciwgJ2Rpc3BsYXlfaGludCcpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudmlzdWFsaXplci5kaXNwbGF5X2hpbnQgKCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworY2xhc3MgUmJ0cmVlSXRlcmF0b3I6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJidHJlZSk6CisgICAgICAgIHNlbGYuc2l6ZSA9IHJidHJlZVsnX01fdCddWydfTV9pbXBsJ11bJ19NX25vZGVfY291bnQnXQorICAgICAgICBzZWxmLm5vZGUgPSByYnRyZWVbJ19NX3QnXVsnX01faW1wbCddWydfTV9oZWFkZXInXVsnX01fbGVmdCddCisgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGludCAoc2VsZi5zaXplKQorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY291bnQgPT0gc2VsZi5zaXplOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICByZXN1bHQgPSBzZWxmLm5vZGUKKyAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgIGlmIHNlbGYuY291bnQgPCBzZWxmLnNpemU6CisgICAgICAgICAgICAjIENvbXB1dGUgdGhlIG5leHQgbm9kZS4KKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLm5vZGUKKyAgICAgICAgICAgIGlmIG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fcmlnaHQnXToKKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9yaWdodCddCisgICAgICAgICAgICAgICAgd2hpbGUgbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9sZWZ0J106CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmRlcmVmZXJlbmNlKClbJ19NX2xlZnQnXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBub2RlLmRlcmVmZXJlbmNlKClbJ19NX3BhcmVudCddCisgICAgICAgICAgICAgICAgd2hpbGUgbm9kZSA9PSBwYXJlbnQuZGVyZWZlcmVuY2UoKVsnX01fcmlnaHQnXToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZGVyZWZlcmVuY2UoKVsnX01fcGFyZW50J10KKyAgICAgICAgICAgICAgICBpZiBub2RlLmRlcmVmZXJlbmNlKClbJ19NX3JpZ2h0J10gIT0gcGFyZW50OgorICAgICAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50CisgICAgICAgICAgICBzZWxmLm5vZGUgPSBub2RlCisgICAgICAgIHJldHVybiByZXN1bHQKKworIyBUaGlzIGlzIGEgcHJldHR5IHByaW50ZXIgZm9yIHN0ZDo6X1JiX3RyZWVfaXRlcmF0b3IgKHdoaWNoIGlzCisjIHN0ZDo6bWFwOjppdGVyYXRvciksIGFuZCBoYXMgbm90aGluZyB0byBkbyB3aXRoIHRoZSBSYnRyZWVJdGVyYXRvcgorIyBjbGFzcyBhYm92ZS4KK2NsYXNzIFN0ZFJidHJlZUl0ZXJhdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgc3RkOjptYXA6Oml0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHZhbHVldHlwZSA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMCkKKyAgICAgICAgbm9kZXR5cGUgPSBnZGIubG9va3VwX3R5cGUoJ3N0ZDo6X1JiX3RyZWVfbm9kZSA8ICVzID4nICUgdmFsdWV0eXBlKQorICAgICAgICBub2RldHlwZSA9IG5vZGV0eXBlLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi52YWwuY2FzdChub2RldHlwZSkuZGVyZWZlcmVuY2UoKVsnX01fdmFsdWVfZmllbGQnXQorCitjbGFzcyBTdGREZWJ1Z0l0ZXJhdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBkZWJ1ZyBlbmFibGVkIHZlcnNpb24gb2YgYW4gaXRlcmF0b3IiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICAjIEp1c3Qgc3RyaXAgYXdheSB0aGUgZW5jYXBzdWxhdGluZyBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3IKKyAgICAjIGFuZCByZXR1cm4gdGhlIHdyYXBwZWQgaXRlcmF0b3IgdmFsdWUuCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIGl0eXBlID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX2N1cnJlbnQnXS5jYXN0KGl0eXBlKQorCitjbGFzcyBTdGRNYXBQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6bWFwIG9yIHN0ZDo6bXVsdGltYXAiCisKKyAgICAjIFR1cm4gYW4gUmJ0cmVlSXRlcmF0b3IgaW50byBhIHByZXR0eS1wcmludCBpdGVyYXRvci4KKyAgICBjbGFzcyBfaXRlcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJiaXRlciwgdHlwZSk6CisgICAgICAgICAgICBzZWxmLnJiaXRlciA9IHJiaXRlcgorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKyAgICAgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5jb3VudCAlIDIgPT0gMDoKKyAgICAgICAgICAgICAgICBuID0gc2VsZi5yYml0ZXIubmV4dCgpCisgICAgICAgICAgICAgICAgbiA9IG4uY2FzdChzZWxmLnR5cGUpLmRlcmVmZXJlbmNlKClbJ19NX3ZhbHVlX2ZpZWxkJ10KKyAgICAgICAgICAgICAgICBzZWxmLnBhaXIgPSBuCisgICAgICAgICAgICAgICAgaXRlbSA9IG5bJ2ZpcnN0J10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaXRlbSA9IHNlbGYucGFpclsnc2Vjb25kJ10KKyAgICAgICAgICAgIHJlc3VsdCA9ICgnWyVkXScgJSBzZWxmLmNvdW50LCBpdGVtKQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIChSYnRyZWVJdGVyYXRvciAoc2VsZi52YWwpKSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIGtleXR5cGUgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApLmNvbnN0KCkKKyAgICAgICAgdmFsdWV0eXBlID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgxKQorICAgICAgICBub2RldHlwZSA9IGdkYi5sb29rdXBfdHlwZSgnc3RkOjpfUmJfdHJlZV9ub2RlPCBzdGQ6OnBhaXI8ICVzLCAlcyA+ID4nICUgKGtleXR5cGUsIHZhbHVldHlwZSkpCisgICAgICAgIG5vZGV0eXBlID0gbm9kZXR5cGUucG9pbnRlcigpCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyIChSYnRyZWVJdGVyYXRvciAoc2VsZi52YWwpLCBub2RldHlwZSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ21hcCcKKworY2xhc3MgU3RkU2V0UHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OnNldCBvciBzdGQ6Om11bHRpc2V0IgorCisgICAgIyBUdXJuIGFuIFJidHJlZUl0ZXJhdG9yIGludG8gYSBwcmV0dHktcHJpbnQgaXRlcmF0b3IuCisgICAgY2xhc3MgX2l0ZXI6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCByYml0ZXIsIHR5cGUpOgorICAgICAgICAgICAgc2VsZi5yYml0ZXIgPSByYml0ZXIKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisgICAgICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGl0ZW0gPSBzZWxmLnJiaXRlci5uZXh0KCkKKyAgICAgICAgICAgIGl0ZW0gPSBpdGVtLmNhc3Qoc2VsZi50eXBlKS5kZXJlZmVyZW5jZSgpWydfTV92YWx1ZV9maWVsZCddCisgICAgICAgICAgICAjIEZJWE1FOiB0aGlzIGlzIHdlaXJkIC4uLiB3aGF0IHRvIGRvPworICAgICAgICAgICAgIyBNYXliZSBhICdzZXQnIGRpc3BsYXkgaGludD8KKyAgICAgICAgICAgIHJlc3VsdCA9ICgnWyVkXScgJSBzZWxmLmNvdW50LCBpdGVtKQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIChSYnRyZWVJdGVyYXRvciAoc2VsZi52YWwpKSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIGtleXR5cGUgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgIG5vZGV0eXBlID0gZ2RiLmxvb2t1cF90eXBlKCdzdGQ6Ol9SYl90cmVlX25vZGU8ICVzID4nICUga2V5dHlwZSkucG9pbnRlcigpCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyIChSYnRyZWVJdGVyYXRvciAoc2VsZi52YWwpLCBub2RldHlwZSkKKworY2xhc3MgU3RkQml0c2V0UHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OmJpdHNldCIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgIyBJZiB0ZW1wbGF0ZV9hcmd1bWVudCBoYW5kbGVkIHZhbHVlcywgd2UgY291bGQgcHJpbnQgdGhlCisgICAgICAgICMgc2l6ZS4gIE9yIHdlIGNvdWxkIHVzZSBhIHJlZ2V4cCBvbiB0aGUgdHlwZS4KKyAgICAgICAgcmV0dXJuICclcycgJSAoc2VsZi50eXBlbmFtZSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHdvcmRzID0gc2VsZi52YWxbJ19NX3cnXQorICAgICAgICB3dHlwZSA9IHdvcmRzLnR5cGUKKworICAgICAgICAjIFRoZSBfTV93IG1lbWJlciBjYW4gYmUgZWl0aGVyIGFuIHVuc2lnbmVkIGxvbmcsIG9yIGFuCisgICAgICAgICMgYXJyYXkuICBUaGlzIGRlcGVuZHMgb24gdGhlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHVzZWQuCisgICAgICAgICMgSWYgaXQgaXMgYSBzaW5nbGUgbG9uZywgY29udmVydCB0byBhIHNpbmdsZSBlbGVtZW50IGxpc3QuCisgICAgICAgIGlmIHd0eXBlLmNvZGUgPT0gZ2RiLlRZUEVfQ09ERV9BUlJBWToKKyAgICAgICAgICAgIHRzaXplID0gd3R5cGUudGFyZ2V0ICgpLnNpemVvZgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd29yZHMgPSBbd29yZHNdCisgICAgICAgICAgICB0c2l6ZSA9IHd0eXBlLnNpemVvZiAKKworICAgICAgICBud29yZHMgPSB3dHlwZS5zaXplb2YgLyB0c2l6ZQorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBieXRlID0gMAorICAgICAgICB3aGlsZSBieXRlIDwgbndvcmRzOgorICAgICAgICAgICAgdyA9IHdvcmRzW2J5dGVdCisgICAgICAgICAgICBiaXQgPSAwCisgICAgICAgICAgICB3aGlsZSB3ICE9IDA6CisgICAgICAgICAgICAgICAgaWYgKHcgJiAxKSAhPSAwOgorICAgICAgICAgICAgICAgICAgICAjIEFub3RoZXIgc3BvdCB3aGVyZSB3ZSBjb3VsZCB1c2UgJ3NldCc/CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKCdbJWRdJyAlIChieXRlICogdHNpemUgKiA4ICsgYml0KSwgMSkpCisgICAgICAgICAgICAgICAgYml0ID0gYml0ICsgMQorICAgICAgICAgICAgICAgIHcgPSB3ID4+IDEKKyAgICAgICAgICAgIGJ5dGUgPSBieXRlICsgMQorICAgICAgICByZXR1cm4gcmVzdWx0CisKK2NsYXNzIFN0ZERlcXVlUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OmRlcXVlIgorCisgICAgY2xhc3MgX2l0ZXI6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlLCBzdGFydCwgZW5kLCBsYXN0LCBidWZmZXJfc2l6ZSk6CisgICAgICAgICAgICBzZWxmLm5vZGUgPSBub2RlCisgICAgICAgICAgICBzZWxmLnAgPSBzdGFydAorICAgICAgICAgICAgc2VsZi5lbmQgPSBlbmQKKyAgICAgICAgICAgIHNlbGYubGFzdCA9IGxhc3QKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5wID09IHNlbGYubGFzdDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKKyAgICAgICAgICAgIHJlc3VsdCA9ICgnWyVkXScgJSBzZWxmLmNvdW50LCBzZWxmLnAuZGVyZWZlcmVuY2UoKSkKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorCisgICAgICAgICAgICAjIEFkdmFuY2UgdGhlICdjdXInIHBvaW50ZXIuCisgICAgICAgICAgICBzZWxmLnAgPSBzZWxmLnAgKyAxCisgICAgICAgICAgICBpZiBzZWxmLnAgPT0gc2VsZi5lbmQ6CisgICAgICAgICAgICAgICAgIyBJZiB3ZSBnb3QgdG8gdGhlIGVuZCBvZiB0aGlzIGJ1Y2tldCwgbW92ZSB0byB0aGUKKyAgICAgICAgICAgICAgICAjIG5leHQgYnVja2V0LgorICAgICAgICAgICAgICAgIHNlbGYubm9kZSA9IHNlbGYubm9kZSArIDEKKyAgICAgICAgICAgICAgICBzZWxmLnAgPSBzZWxmLm5vZGVbMF0KKyAgICAgICAgICAgICAgICBzZWxmLmVuZCA9IHNlbGYucCArIHNlbGYuYnVmZmVyX3NpemUKKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKyAgICAgICAgc2VsZi5lbHR0eXBlID0gdmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMCkKKyAgICAgICAgc2l6ZSA9IHNlbGYuZWx0dHlwZS5zaXplb2YKKyAgICAgICAgaWYgc2l6ZSA8IDUxMjoKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyX3NpemUgPSBpbnQgKDUxMiAvIHNpemUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gMQorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgc3RhcnQgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddCisgICAgICAgIGVuZCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2ZpbmlzaCddCisKKyAgICAgICAgZGVsdGFfbiA9IGVuZFsnX01fbm9kZSddIC0gc3RhcnRbJ19NX25vZGUnXSAtIDEKKyAgICAgICAgZGVsdGFfcyA9IHN0YXJ0WydfTV9sYXN0J10gLSBzdGFydFsnX01fY3VyJ10KKyAgICAgICAgZGVsdGFfZSA9IGVuZFsnX01fY3VyJ10gLSBlbmRbJ19NX2ZpcnN0J10KKworICAgICAgICBzaXplID0gc2VsZi5idWZmZXJfc2l6ZSAqIGRlbHRhX24gKyBkZWx0YV9zICsgZGVsdGFfZQorCisgICAgICAgIHJldHVybiAnJXMgd2l0aCAlZCBlbGVtZW50cycgJSAoc2VsZi50eXBlbmFtZSwgbG9uZyAoc2l6ZSkpCisKKyAgICBkZWYgY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHN0YXJ0ID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fc3RhcnQnXQorICAgICAgICBlbmQgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9maW5pc2gnXQorICAgICAgICByZXR1cm4gc2VsZi5faXRlcihzdGFydFsnX01fbm9kZSddLCBzdGFydFsnX01fY3VyJ10sIHN0YXJ0WydfTV9sYXN0J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFsnX01fY3VyJ10sIHNlbGYuYnVmZmVyX3NpemUpCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdhcnJheScKKworY2xhc3MgU3RkRGVxdWVJdGVyYXRvclByaW50ZXI6CisgICAgIlByaW50IHN0ZDo6ZGVxdWU6Oml0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX2N1ciddLmRlcmVmZXJlbmNlKCkKKworY2xhc3MgU3RkU3RyaW5nUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OmJhc2ljX3N0cmluZyBvZiBzb21lIGtpbmQiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlICZzdHJpbmcgd29ya3MsIHRvby4KKyAgICAgICAgdHlwZSA9IHNlbGYudmFsLnR5cGUKKyAgICAgICAgaWYgdHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfUkVGOgorICAgICAgICAgICAgdHlwZSA9IHR5cGUudGFyZ2V0ICgpCisKKyAgICAgICAgIyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNvIHRoYXQgdG9fc3RyaW5nIHJldHVybnMKKyAgICAgICAgIyB0aGUgc3RyaW5nIGFjY29yZGluZyB0byBsZW5ndGgsIG5vdCBhY2NvcmRpbmcgdG8gZmlyc3QgbnVsbAorICAgICAgICAjIGVuY291bnRlcmVkLgorICAgICAgICBwdHIgPSBzZWxmLnZhbCBbJ19NX2RhdGFwbHVzJ11bJ19NX3AnXQorICAgICAgICByZWFsdHlwZSA9IHR5cGUudW5xdWFsaWZpZWQgKCkuc3RyaXBfdHlwZWRlZnMgKCkKKyAgICAgICAgcmVwdHlwZSA9IGdkYi5sb29rdXBfdHlwZSAoc3RyIChyZWFsdHlwZSkgKyAnOjpfUmVwJykucG9pbnRlciAoKQorICAgICAgICBoZWFkZXIgPSBwdHIuY2FzdChyZXB0eXBlKSAtIDEKKyAgICAgICAgbGVuID0gaGVhZGVyLmRlcmVmZXJlbmNlICgpWydfTV9sZW5ndGgnXQorICAgICAgICBpZiBoYXNhdHRyKHB0ciwgImxhenlfc3RyaW5nIik6CisgICAgICAgICAgICByZXR1cm4gcHRyLmxhenlfc3RyaW5nIChsZW5ndGggPSBsZW4pCisgICAgICAgIHJldHVybiBwdHIuc3RyaW5nIChsZW5ndGggPSBsZW4pCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdzdHJpbmcnCisKK2NsYXNzIFRyMUhhc2h0YWJsZUl0ZXJhdG9yOgorICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgaGFzaCk6CisgICAgICAgIHNlbGYuY291bnQgPSAwCisgICAgICAgIHNlbGYubl9idWNrZXRzID0gaGFzaFsnX01fZWxlbWVudF9jb3VudCddCisgICAgICAgIGlmIHNlbGYubl9idWNrZXRzID09IDA6CisgICAgICAgICAgICBzZWxmLm5vZGUgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5idWNrZXQgPSBoYXNoWydfTV9idWNrZXRzJ10KKyAgICAgICAgICAgIHNlbGYubm9kZSA9IHNlbGYuYnVja2V0WzBdCisgICAgICAgICAgICBzZWxmLnVwZGF0ZSAoKQorCisgICAgZGVmIF9faXRlcl9fIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiB1cGRhdGUgKHNlbGYpOgorICAgICAgICAjIElmIHdlIGFkdmFuY2VkIG9mZiB0aGUgZW5kIG9mIHRoZSBjaGFpbiwgbW92ZSB0byB0aGUgbmV4dAorICAgICAgICAjIGJ1Y2tldC4KKyAgICAgICAgd2hpbGUgc2VsZi5ub2RlID09IDA6CisgICAgICAgICAgICBzZWxmLmJ1Y2tldCA9IHNlbGYuYnVja2V0ICsgMQorICAgICAgICAgICAgc2VsZi5ub2RlID0gc2VsZi5idWNrZXRbMF0KKworICAgICAgICMgSWYgd2UgYWR2YW5jZWQgb2ZmIHRoZSBlbmQgb2YgdGhlIGJ1Y2tldCBhcnJheSwgdGhlbgorICAgICAgICMgd2UncmUgZG9uZS4KKyAgICAgICAgaWYgc2VsZi5jb3VudCA9PSBzZWxmLm5fYnVja2V0czoKKyAgICAgICAgICAgIHNlbGYubm9kZSA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKworICAgIGRlZiBuZXh0IChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYubm9kZToKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmVzdWx0ID0gc2VsZi5ub2RlLmRlcmVmZXJlbmNlKClbJ19NX3YnXQorICAgICAgICBzZWxmLm5vZGUgPSBzZWxmLm5vZGUuZGVyZWZlcmVuY2UoKVsnX01fbmV4dCddCisgICAgICAgIHNlbGYudXBkYXRlICgpCisgICAgICAgIHJldHVybiByZXN1bHQKKworY2xhc3MgVHIxVW5vcmRlcmVkU2V0UHJpbnRlcjoKKyAgICAiUHJpbnQgYSB0cjE6OnVub3JkZXJlZF9zZXQiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsIHNlbGYudmFsWydfTV9lbGVtZW50X2NvdW50J10pCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGZvcm1hdF9jb3VudCAoaSk6CisgICAgICAgIHJldHVybiAnWyVkXScgJSBpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICBjb3VudGVyID0gaXRlcnRvb2xzLmltYXAgKHNlbGYuZm9ybWF0X2NvdW50LCBpdGVydG9vbHMuY291bnQoKSkKKyAgICAgICAgcmV0dXJuIGl0ZXJ0b29scy5pemlwIChjb3VudGVyLCBUcjFIYXNodGFibGVJdGVyYXRvciAoc2VsZi52YWwpKQorCitjbGFzcyBUcjFVbm9yZGVyZWRNYXBQcmludGVyOgorICAgICJQcmludCBhIHRyMTo6dW5vcmRlcmVkX21hcCIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHJldHVybiAnJXMgd2l0aCAlZCBlbGVtZW50cycgJSAoc2VsZi50eXBlbmFtZSwgc2VsZi52YWxbJ19NX2VsZW1lbnRfY291bnQnXSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZmxhdHRlbiAobGlzdCk6CisgICAgICAgIGZvciBlbHQgaW4gbGlzdDoKKyAgICAgICAgICAgIGZvciBpIGluIGVsdDoKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGZvcm1hdF9vbmUgKGVsdCk6CisgICAgICAgIHJldHVybiAoZWx0WydmaXJzdCddLCBlbHRbJ3NlY29uZCddKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBmb3JtYXRfY291bnQgKGkpOgorICAgICAgICByZXR1cm4gJ1slZF0nICUgaQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgY291bnRlciA9IGl0ZXJ0b29scy5pbWFwIChzZWxmLmZvcm1hdF9jb3VudCwgaXRlcnRvb2xzLmNvdW50KCkpCisgICAgICAgICMgTWFwIG92ZXIgdGhlIGhhc2ggdGFibGUgYW5kIGZsYXR0ZW4gdGhlIHJlc3VsdC4KKyAgICAgICAgZGF0YSA9IHNlbGYuZmxhdHRlbiAoaXRlcnRvb2xzLmltYXAgKHNlbGYuZm9ybWF0X29uZSwgVHIxSGFzaHRhYmxlSXRlcmF0b3IgKHNlbGYudmFsKSkpCisgICAgICAgICMgWmlwIHRoZSB0d28gaXRlcmF0b3JzIHRvZ2V0aGVyLgorICAgICAgICByZXR1cm4gaXRlcnRvb2xzLml6aXAgKGNvdW50ZXIsIGRhdGEpCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdtYXAnCisKK2RlZiByZWdpc3Rlcl9saWJzdGRjeHhfcHJpbnRlcnMgKG9iaik6CisgICAgIlJlZ2lzdGVyIGxpYnN0ZGMrKyBwcmV0dHktcHJpbnRlcnMgd2l0aCBvYmpmaWxlIE9iai4iCisKKyAgICBpZiBvYmogPT0gTm9uZToKKyAgICAgICAgb2JqID0gZ2RiCisKKyAgICBvYmoucHJldHR5X3ByaW50ZXJzLmFwcGVuZCAobG9va3VwX2Z1bmN0aW9uKQorCitkZWYgbG9va3VwX2Z1bmN0aW9uICh2YWwpOgorICAgICJMb29rLXVwIGFuZCByZXR1cm4gYSBwcmV0dHktcHJpbnRlciB0aGF0IGNhbiBwcmludCB2YWwuIgorCisgICAgIyBHZXQgdGhlIHR5cGUuCisgICAgdHlwZSA9IHZhbC50eXBlCisKKyAgICAjIElmIGl0IHBvaW50cyB0byBhIHJlZmVyZW5jZSwgZ2V0IHRoZSByZWZlcmVuY2UuCisgICAgaWYgdHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfUkVGOgorICAgICAgICB0eXBlID0gdHlwZS50YXJnZXQgKCkKKworICAgICMgR2V0IHRoZSB1bnF1YWxpZmllZCB0eXBlLCBzdHJpcHBlZCBvZiB0eXBlZGVmcy4KKyAgICB0eXBlID0gdHlwZS51bnF1YWxpZmllZCAoKS5zdHJpcF90eXBlZGVmcyAoKQorCisgICAgIyBHZXQgdGhlIHR5cGUgbmFtZS4gICAgCisgICAgdHlwZW5hbWUgPSB0eXBlLnRhZworICAgIGlmIHR5cGVuYW1lID09IE5vbmU6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIEl0ZXJhdGUgb3ZlciBsb2NhbCBkaWN0aW9uYXJ5IG9mIHR5cGVzIHRvIGRldGVybWluZQorICAgICMgaWYgYSBwcmludGVyIGlzIHJlZ2lzdGVyZWQgZm9yIHRoYXQgdHlwZS4gIFJldHVybiBhbgorICAgICMgaW5zdGFudGlhdGlvbiBvZiB0aGUgcHJpbnRlciBpZiBmb3VuZC4KKyAgICBmb3IgZnVuY3Rpb24gaW4gcHJldHR5X3ByaW50ZXJzX2RpY3Q6CisgICAgICAgIGlmIGZ1bmN0aW9uLnNlYXJjaCAodHlwZW5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIHByZXR0eV9wcmludGVyc19kaWN0W2Z1bmN0aW9uXSAodmFsKQorICAgICAgICAKKyAgICAjIENhbm5vdCBmaW5kIGEgcHJldHR5IHByaW50ZXIuICBSZXR1cm4gTm9uZS4KKyAgICByZXR1cm4gTm9uZQorCitkZWYgYnVpbGRfbGlic3RkY3h4X2RpY3Rpb25hcnkgKCk6CisgICAgIyBsaWJzdGRjKysgb2JqZWN0cyByZXF1aXJpbmcgcHJldHR5LXByaW50aW5nLgorICAgICMgSW4gb3JkZXIgZnJvbToKKyAgICAjIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9sYXRlc3QtZG94eWdlbi9hMDE4NDcuaHRtbAorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OmJhc2ljX3N0cmluZzwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkU3RyaW5nUHJpbnRlcih2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6Yml0c2V0PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRCaXRzZXRQcmludGVyKCJzdGQ6OmJpdHNldCIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpkZXF1ZTwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkRGVxdWVQcmludGVyKCJzdGQ6OmRlcXVlIiwgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Omxpc3Q8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZExpc3RQcmludGVyKCJzdGQ6Omxpc3QiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6bWFwPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRNYXBQcmludGVyKCJzdGQ6Om1hcCIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjptdWx0aW1hcDwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkTWFwUHJpbnRlcigic3RkOjptdWx0aW1hcCIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjptdWx0aXNldDwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkU2V0UHJpbnRlcigic3RkOjptdWx0aXNldCIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpwcmlvcml0eV9xdWV1ZTwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkU3RhY2tPclF1ZXVlUHJpbnRlcigic3RkOjpwcmlvcml0eV9xdWV1ZSIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpxdWV1ZTwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkU3RhY2tPclF1ZXVlUHJpbnRlcigic3RkOjpxdWV1ZSIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjp0dXBsZTwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkVHVwbGVQcmludGVyKCJzdGQ6OnR1cGxlIiwgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OnNldDwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkU2V0UHJpbnRlcigic3RkOjpzZXQiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6c3RhY2s8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIoInN0ZDo6c3RhY2siLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6dW5pcXVlX3B0cjwuKj4kJyldID0gVW5pcXVlUG9pbnRlclByaW50ZXIKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjp2ZWN0b3I8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFZlY3RvclByaW50ZXIoInN0ZDo6dmVjdG9yIiwgdmFsKQorICAgICMgdmVjdG9yPGJvb2w+CisKKyAgICAjIFByaW50ZXIgcmVnaXN0cmF0aW9ucyBmb3IgY2xhc3NlcyBjb21waWxlZCB3aXRoIC1EX0dMSUJDWFhfREVCVUcuCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19kZWJ1Zzo6Yml0c2V0PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRCaXRzZXRQcmludGVyKCJzdGQ6Ol9fZGVidWc6OmJpdHNldCIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX2RlYnVnOjpkZXF1ZTwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkRGVxdWVQcmludGVyKCJzdGQ6Ol9fZGVidWc6OmRlcXVlIiwgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9fZGVidWc6Omxpc3Q8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZExpc3RQcmludGVyKCJzdGQ6Ol9fZGVidWc6Omxpc3QiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19kZWJ1Zzo6bWFwPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRNYXBQcmludGVyKCJzdGQ6Ol9fZGVidWc6Om1hcCIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX2RlYnVnOjptdWx0aW1hcDwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkTWFwUHJpbnRlcigic3RkOjpfX2RlYnVnOjptdWx0aW1hcCIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX2RlYnVnOjptdWx0aXNldDwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkU2V0UHJpbnRlcigic3RkOjpfX2RlYnVnOjptdWx0aXNldCIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX2RlYnVnOjpwcmlvcml0eV9xdWV1ZTwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkU3RhY2tPclF1ZXVlUHJpbnRlcigic3RkOjpfX2RlYnVnOjpwcmlvcml0eV9xdWV1ZSIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX2RlYnVnOjpxdWV1ZTwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkU3RhY2tPclF1ZXVlUHJpbnRlcigic3RkOjpfX2RlYnVnOjpxdWV1ZSIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX2RlYnVnOjpzZXQ8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFNldFByaW50ZXIoInN0ZDo6X19kZWJ1Zzo6c2V0IiwgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9fZGVidWc6OnN0YWNrPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRTdGFja09yUXVldWVQcmludGVyKCJzdGQ6Ol9fZGVidWc6OnN0YWNrIiwgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9fZGVidWc6OnVuaXF1ZV9wdHI8Lio+JCcpXSA9IFVuaXF1ZVBvaW50ZXJQcmludGVyCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19kZWJ1Zzo6dmVjdG9yPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRWZWN0b3JQcmludGVyKCJzdGQ6Ol9fZGVidWc6OnZlY3RvciIsIHZhbCkKKworICAgICMgVGhlc2UgYXJlIHRoZSBUUjEgYW5kIEMrKzB4IHByaW50ZXJzLgorICAgICMgRm9yIGFycmF5IC0gdGhlIGRlZmF1bHQgR0RCIHByZXR0eS1wcmludGVyIHNlZW1zIHJlYXNvbmFibGUuCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6c2hhcmVkX3B0cjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkUG9pbnRlclByaW50ZXIgKCdzdGQ6OnNoYXJlZF9wdHInLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6d2Vha19wdHI8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFBvaW50ZXJQcmludGVyICgnc3RkOjp3ZWFrX3B0cicsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjp1bm9yZGVyZWRfbWFwPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBUcjFVbm9yZGVyZWRNYXBQcmludGVyICgnc3RkOjp1bm9yZGVyZWRfbWFwJywgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OnVub3JkZXJlZF9zZXQ8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFRyMVVub3JkZXJlZFNldFByaW50ZXIgKCdzdGQ6OnVub3JkZXJlZF9zZXQnLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6dW5vcmRlcmVkX211bHRpbWFwPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBUcjFVbm9yZGVyZWRNYXBQcmludGVyICgnc3RkOjp1bm9yZGVyZWRfbXVsdGltYXAnLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6dW5vcmRlcmVkX211bHRpc2V0PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBUcjFVbm9yZGVyZWRTZXRQcmludGVyICgnc3RkOjp1bm9yZGVyZWRfbXVsdGlzZXQnLCB2YWwpCisKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjp0cjE6OnNoYXJlZF9wdHI8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFBvaW50ZXJQcmludGVyICgnc3RkOjp0cjE6OnNoYXJlZF9wdHInLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6dHIxOjp3ZWFrX3B0cjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkUG9pbnRlclByaW50ZXIgKCdzdGQ6OnRyMTo6d2Vha19wdHInLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6dHIxOjp1bm9yZGVyZWRfbWFwPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBUcjFVbm9yZGVyZWRNYXBQcmludGVyICgnc3RkOjp0cjE6OnVub3JkZXJlZF9tYXAnLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6dHIxOjp1bm9yZGVyZWRfc2V0PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBUcjFVbm9yZGVyZWRTZXRQcmludGVyICgnc3RkOjp0cjE6OnVub3JkZXJlZF9zZXQnLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6dHIxOjp1bm9yZGVyZWRfbXVsdGltYXA8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFRyMVVub3JkZXJlZE1hcFByaW50ZXIgKCdzdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpbWFwJywgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpc2V0PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBUcjFVbm9yZGVyZWRTZXRQcmludGVyICgnc3RkOjp0cjE6OnVub3JkZXJlZF9tdWx0aXNldCcsIHZhbCkKKworICAgICMgVGhlc2UgYXJlIHRoZSBDKysweCBwcmludGVyIHJlZ2lzdHJhdGlvbnMgZm9yIC1EX0dMSUJDWFhfREVCVUcgY2FzZXMuCisgICAgIyBUaGUgdHIxIG5hbWVzcGFjZSBwcmludGVycyBkbyBub3Qgc2VlbSB0byBoYXZlIGFueSBkZWJ1ZworICAgICMgZXF1aXZhbGVudHMsIHNvIGRvIG5vIHJlZ2lzdGVyIHRoZW0uCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19kZWJ1Zzo6dW5vcmRlcmVkX21hcDwuKj4kJyldID0gbGFtYmRhIHZhbDogVHIxVW5vcmRlcmVkTWFwUHJpbnRlciAoJ3N0ZDo6X19kZWJ1Zzo6dW5vcmRlcmVkX21hcCcsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX2RlYnVnOjp1bm9yZGVyZWRfc2V0PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBUcjFVbm9yZGVyZWRTZXRQcmludGVyICgnc3RkOjpfX2RlYnVnOjp1bm9yZGVyZWRfc2V0JywgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9fZGVidWc6OnVub3JkZXJlZF9tdWx0aW1hcDwuKj4kJyldID0gbGFtYmRhIHZhbDogVHIxVW5vcmRlcmVkTWFwUHJpbnRlciAoJ3N0ZDo6X19kZWJ1Zzo6dW5vcmRlcmVkX211bHRpbWFwJywgIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX2RlYnVnOjp1bm9yZGVyZWRfbXVsdGlzZXQ8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFRyMVVub3JkZXJlZFNldFByaW50ZXIgKCdzdGQ6Ol9fZGVidWc6dW5vcmRlcmVkX211bHRpc2V0JywgdmFsKQorCisKKyAgICAjIEV4dGVuc2lvbnMuCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXl9fZ251X2N4eDo6c2xpc3Q8Lio+JCcpXSA9IFN0ZFNsaXN0UHJpbnRlcgorCisgICAgaWYgVHJ1ZToKKyAgICAgICAgIyBUaGVzZSBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LCBpZiBHREIgInByaW50ICppIiB3b3JrZWQuCisgICAgICAgICMgQnV0IGl0IG9mdGVuIGRvZXNuJ3QsIHNvIGhlcmUgdGhleSBhcmUuCisgICAgICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9MaXN0X2l0ZXJhdG9yPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRMaXN0SXRlcmF0b3JQcmludGVyKCJzdGQ6Ol9MaXN0X2l0ZXJhdG9yIix2YWwpCisgICAgICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9MaXN0X2NvbnN0X2l0ZXJhdG9yPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRMaXN0SXRlcmF0b3JQcmludGVyKCJzdGQ6Ol9MaXN0X2NvbnN0X2l0ZXJhdG9yIix2YWwpCisgICAgICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9SYl90cmVlX2l0ZXJhdG9yPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRSYnRyZWVJdGVyYXRvclByaW50ZXIodmFsKQorICAgICAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfUmJfdHJlZV9jb25zdF9pdGVyYXRvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkUmJ0cmVlSXRlcmF0b3JQcmludGVyKHZhbCkKKyAgICAgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X0RlcXVlX2l0ZXJhdG9yPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGREZXF1ZUl0ZXJhdG9yUHJpbnRlcih2YWwpCisgICAgICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9EZXF1ZV9jb25zdF9pdGVyYXRvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkRGVxdWVJdGVyYXRvclByaW50ZXIodmFsKQorICAgICAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdeX19nbnVfY3h4OjpfX25vcm1hbF9pdGVyYXRvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkVmVjdG9ySXRlcmF0b3JQcmludGVyKHZhbCkKKyAgICAgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXl9fZ251X2N4eDo6X1NsaXN0X2l0ZXJhdG9yPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRTbGlzdEl0ZXJhdG9yUHJpbnRlcih2YWwpCisKKyAgICAgICAgIyBEZWJ1ZyAoY29tcGlsZWQgd2l0aCAtRF9HTElCQ1hYX0RFQlVHKSBwcmludGVyIHJlZ2lzdHJhdGlvbnMuCisgICAgICAgICMgVGhlIFJiX3RyZWUgZGVidWcgaXRlcmF0b3Igd2hlbiB1bndyYXBwZWQgZnJvbSB0aGUgZW5jYXBzdWxhdGluZyBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3IKKyAgICAgICAgIyBkb2VzIG5vdCBoYXZlIHRoZSBfX25vcm0gbmFtZXNwYWNlLiBKdXN0IHVzZSB0aGUgZXhpc3RpbmcgcHJpbnRlciByZWdpc3RyYXRpb24gZm9yIHRoYXQuCisgICAgICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15fX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3I8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZERlYnVnSXRlcmF0b3JQcmludGVyKHZhbCkKKyAgICAgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19ub3JtOjpfTGlzdF9pdGVyYXRvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkTGlzdEl0ZXJhdG9yUHJpbnRlciAoInN0ZDo6X19ub3JtOjpfTGlzdF9pdGVyYXRvciIsdmFsKQorICAgICAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX25vcm06Ol9MaXN0X2NvbnN0X2l0ZXJhdG9yPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRMaXN0SXRlcmF0b3JQcmludGVyICgic3RkOjpfX25vcm06Ol9MaXN0X2NvbnN0X2l0ZXJhdG9yIix2YWwpCisgICAgICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9fbm9ybTo6X0RlcXVlX2NvbnN0X2l0ZXJhdG9yPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGREZXF1ZUl0ZXJhdG9yUHJpbnRlcih2YWwpCisgICAgICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9fbm9ybTo6X0RlcXVlX2l0ZXJhdG9yPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGREZXF1ZUl0ZXJhdG9yUHJpbnRlcih2YWwpCisKK3ByZXR0eV9wcmludGVyc19kaWN0ID0ge30KKworYnVpbGRfbGlic3RkY3h4X2RpY3Rpb25hcnkgKCkKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuNy9fX2luaXRfXy5weSBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuNy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjEzNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL2xpYnN0ZGN4eC9nY2MtNC43L19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKKwpkaWZmIC0tZ2l0IGEvc2hhcmUvcHJldHR5LXByaW50ZXJzL2xpYnN0ZGN4eC9nY2MtNC43L3ByaW50ZXJzLnB5IGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL2xpYnN0ZGN4eC9nY2MtNC43L3ByaW50ZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YzU0YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvbGlic3RkY3h4L2djYy00LjcvcHJpbnRlcnMucHkKQEAgLTAsMCArMSw5MjggQEAKKyMgUHJldHR5LXByaW50ZXJzIGZvciBsaWJzdGMrKy4KKworIyBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK2ltcG9ydCBnZGIKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCByZQorCisjIFRyeSB0byB1c2UgdGhlIG5ldy1zdHlsZSBwcmV0dHktcHJpbnRpbmcgaWYgYXZhaWxhYmxlLgorX3VzZV9nZGJfcHAgPSBUcnVlCit0cnk6CisgICAgaW1wb3J0IGdkYi5wcmludGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF91c2VfZ2RiX3BwID0gRmFsc2UKKworIyBTdGFydGluZyB3aXRoIHRoZSB0eXBlIE9SSUcsIHNlYXJjaCBmb3IgdGhlIG1lbWJlciB0eXBlIE5BTUUuICBUaGlzCisjIGhhbmRsZXMgc2VhcmNoaW5nIHVwd2FyZCB0aHJvdWdoIHN1cGVyY2xhc3Nlcy4gIFRoaXMgaXMgbmVlZGVkIHRvCisjIHdvcmsgYXJvdW5kIGh0dHA6Ly9zb3VyY2V3YXJlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTM2MTUuCitkZWYgZmluZF90eXBlKG9yaWcsIG5hbWUpOgorICAgIHR5cCA9IG9yaWcuc3RyaXBfdHlwZWRlZnMoKQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHNlYXJjaCA9IHN0cih0eXApICsgJzo6JyArIG5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGdkYi5sb29rdXBfdHlwZShzZWFyY2gpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgVGhlIHR5cGUgd2FzIG5vdCBmb3VuZCwgc28gdHJ5IHRoZSBzdXBlcmNsYXNzLiAgV2Ugb25seSBuZWVkCisgICAgICAgICMgdG8gY2hlY2sgdGhlIGZpcnN0IHN1cGVyY2xhc3MsIHNvIHdlIGRvbid0IGJvdGhlciB3aXRoCisgICAgICAgICMgYW55dGhpbmcgZmFuY2llciBoZXJlLgorICAgICAgICBmaWVsZCA9IHR5cC5maWVsZHMoKVswXQorICAgICAgICBpZiBub3QgZmllbGQuaXNfYmFzZV9jbGFzczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJDYW5ub3QgZmluZCB0eXBlICVzOjolcyIgJSAoc3RyKG9yaWcpLCBuYW1lKQorICAgICAgICB0eXAgPSBmaWVsZC50eXBlCisKK2NsYXNzIFNoYXJlZFBvaW50ZXJQcmludGVyOgorICAgICJQcmludCBhIHNoYXJlZF9wdHIgb3Igd2Vha19wdHIiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICBzdGF0ZSA9ICdlbXB0eScKKyAgICAgICAgcmVmY291bnRzID0gc2VsZi52YWxbJ19NX3JlZmNvdW50J11bJ19NX3BpJ10KKyAgICAgICAgaWYgcmVmY291bnRzICE9IDA6CisgICAgICAgICAgICB1c2Vjb3VudCA9IHJlZmNvdW50c1snX01fdXNlX2NvdW50J10KKyAgICAgICAgICAgIHdlYWtjb3VudCA9IHJlZmNvdW50c1snX01fd2Vha19jb3VudCddCisgICAgICAgICAgICBpZiB1c2Vjb3VudCA9PSAwOgorICAgICAgICAgICAgICAgIHN0YXRlID0gJ2V4cGlyZWQsIHdlYWsgJWQnICUgd2Vha2NvdW50CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXRlID0gJ2NvdW50ICVkLCB3ZWFrICVkJyAlICh1c2Vjb3VudCwgd2Vha2NvdW50IC0gMSkKKyAgICAgICAgcmV0dXJuICclcyAoJXMpICVzJyAlIChzZWxmLnR5cGVuYW1lLCBzdGF0ZSwgc2VsZi52YWxbJ19NX3B0ciddKQorCitjbGFzcyBVbmlxdWVQb2ludGVyUHJpbnRlcjoKKyAgICAiUHJpbnQgYSB1bmlxdWVfcHRyIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX3QnXQorCitjbGFzcyBTdGRMaXN0UHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6Omxpc3QiCisKKyAgICBjbGFzcyBfaXRlcmF0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RldHlwZSwgaGVhZCk6CisgICAgICAgICAgICBzZWxmLm5vZGV0eXBlID0gbm9kZXR5cGUKKyAgICAgICAgICAgIHNlbGYuYmFzZSA9IGhlYWRbJ19NX25leHQnXQorICAgICAgICAgICAgc2VsZi5oZWFkID0gaGVhZC5hZGRyZXNzCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLmJhc2UgPT0gc2VsZi5oZWFkOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIGVsdCA9IHNlbGYuYmFzZS5jYXN0KHNlbGYubm9kZXR5cGUpLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgIHNlbGYuYmFzZSA9IGVsdFsnX01fbmV4dCddCisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgZWx0WydfTV9kYXRhJ10pCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIGNoaWxkcmVuKHNlbGYpOgorICAgICAgICBub2RldHlwZSA9IGZpbmRfdHlwZShzZWxmLnZhbC50eXBlLCAnX05vZGUnKQorICAgICAgICBub2RldHlwZSA9IG5vZGV0eXBlLnN0cmlwX3R5cGVkZWZzKCkucG9pbnRlcigpCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyYXRvcihub2RldHlwZSwgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fbm9kZSddKQorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fbm9kZSddLmFkZHJlc3MgPT0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fbm9kZSddWydfTV9uZXh0J106CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5ICVzJyAlIChzZWxmLnR5cGVuYW1lKQorICAgICAgICByZXR1cm4gJyVzJyAlIChzZWxmLnR5cGVuYW1lKQorCitjbGFzcyBTdGRMaXN0SXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBzdGQ6Omxpc3Q6Oml0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIG5vZGV0eXBlID0gZmluZF90eXBlKHNlbGYudmFsLnR5cGUsICdfTm9kZScpCisgICAgICAgIG5vZGV0eXBlID0gbm9kZXR5cGUuc3RyaXBfdHlwZWRlZnMoKS5wb2ludGVyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9ub2RlJ10uY2FzdChub2RldHlwZSkuZGVyZWZlcmVuY2UoKVsnX01fZGF0YSddCisKK2NsYXNzIFN0ZFNsaXN0UHJpbnRlcjoKKyAgICAiUHJpbnQgYSBfX2dudV9jeHg6OnNsaXN0IgorCisgICAgY2xhc3MgX2l0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXR5cGUsIGhlYWQpOgorICAgICAgICAgICAgc2VsZi5ub2RldHlwZSA9IG5vZGV0eXBlCisgICAgICAgICAgICBzZWxmLmJhc2UgPSBoZWFkWydfTV9oZWFkJ11bJ19NX25leHQnXQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5iYXNlID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgZWx0ID0gc2VsZi5iYXNlLmNhc3Qoc2VsZi5ub2RldHlwZSkuZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgc2VsZi5iYXNlID0gZWx0WydfTV9uZXh0J10KKyAgICAgICAgICAgIGNvdW50ID0gc2VsZi5jb3VudAorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBlbHRbJ19NX2RhdGEnXSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiBjaGlsZHJlbihzZWxmKToKKyAgICAgICAgbm9kZXR5cGUgPSBmaW5kX3R5cGUoc2VsZi52YWwudHlwZSwgJ19Ob2RlJykKKyAgICAgICAgbm9kZXR5cGUgPSBub2RldHlwZS5zdHJpcF90eXBlZGVmcygpLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi5faXRlcmF0b3Iobm9kZXR5cGUsIHNlbGYudmFsKQorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi52YWxbJ19NX2hlYWQnXVsnX01fbmV4dCddID09IDA6CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5IF9fZ251X2N4eDo6c2xpc3QnCisgICAgICAgIHJldHVybiAnX19nbnVfY3h4OjpzbGlzdCcKKworY2xhc3MgU3RkU2xpc3RJdGVyYXRvclByaW50ZXI6CisgICAgIlByaW50IF9fZ251X2N4eDo6c2xpc3Q6Oml0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgbm9kZXR5cGUgPSBmaW5kX3R5cGUoc2VsZi52YWwudHlwZSwgJ19Ob2RlJykKKyAgICAgICAgbm9kZXR5cGUgPSBub2RldHlwZS5zdHJpcF90eXBlZGVmcygpLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX25vZGUnXS5jYXN0KG5vZGV0eXBlKS5kZXJlZmVyZW5jZSgpWydfTV9kYXRhJ10KKworY2xhc3MgU3RkVmVjdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OnZlY3RvciIKKworICAgIGNsYXNzIF9pdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fIChzZWxmLCBzdGFydCwgZmluaXNoLCBiaXR2ZWMpOgorICAgICAgICAgICAgc2VsZi5iaXR2ZWMgPSBiaXR2ZWMKKyAgICAgICAgICAgIGlmIGJpdHZlYzoKKyAgICAgICAgICAgICAgICBzZWxmLml0ZW0gICA9IHN0YXJ0WydfTV9wJ10KKyAgICAgICAgICAgICAgICBzZWxmLnNvICAgICA9IHN0YXJ0WydfTV9vZmZzZXQnXQorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoID0gZmluaXNoWydfTV9wJ10KKyAgICAgICAgICAgICAgICBzZWxmLmZvICAgICA9IGZpbmlzaFsnX01fb2Zmc2V0J10KKyAgICAgICAgICAgICAgICBpdHlwZSA9IHNlbGYuaXRlbS5kZXJlZmVyZW5jZSgpLnR5cGUKKyAgICAgICAgICAgICAgICBzZWxmLmlzaXplID0gOCAqIGl0eXBlLnNpemVvZgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLml0ZW0gPSBzdGFydAorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoID0gZmluaXNoCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgaWYgc2VsZi5iaXR2ZWM6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5pdGVtID09IHNlbGYuZmluaXNoIGFuZCBzZWxmLnNvID49IHNlbGYuZm86CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICAgICBlbHQgPSBzZWxmLml0ZW0uZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgIGlmIGVsdCAmICgxIDw8IHNlbGYuc28pOgorICAgICAgICAgICAgICAgICAgICBvYml0ID0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG9iaXQgPSAwCisgICAgICAgICAgICAgICAgc2VsZi5zbyA9IHNlbGYuc28gKyAxCisgICAgICAgICAgICAgICAgaWYgc2VsZi5zbyA+PSBzZWxmLmlzaXplOgorICAgICAgICAgICAgICAgICAgICBzZWxmLml0ZW0gPSBzZWxmLml0ZW0gKyAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc28gPSAwCisgICAgICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgb2JpdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5pdGVtID09IHNlbGYuZmluaXNoOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgZWx0ID0gc2VsZi5pdGVtLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICBzZWxmLml0ZW0gPSBzZWxmLml0ZW0gKyAxCisgICAgICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgZWx0KQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKyAgICAgICAgc2VsZi5pc19ib29sID0gdmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMCkuY29kZSAgPT0gZ2RiLlRZUEVfQ09ERV9CT09MCisKKyAgICBkZWYgY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyYXRvcihzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlzX2Jvb2wpCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICBzdGFydCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J10KKyAgICAgICAgZmluaXNoID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ10KKyAgICAgICAgZW5kID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZW5kX29mX3N0b3JhZ2UnXQorICAgICAgICBpZiBzZWxmLmlzX2Jvb2w6CisgICAgICAgICAgICBzdGFydCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J11bJ19NX3AnXQorICAgICAgICAgICAgc28gICAgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddWydfTV9vZmZzZXQnXQorICAgICAgICAgICAgZmluaXNoID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ11bJ19NX3AnXQorICAgICAgICAgICAgZm8gICAgID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ11bJ19NX29mZnNldCddCisgICAgICAgICAgICBpdHlwZSA9IHN0YXJ0LmRlcmVmZXJlbmNlKCkudHlwZQorICAgICAgICAgICAgYmwgPSA4ICogaXR5cGUuc2l6ZW9mCisgICAgICAgICAgICBsZW5ndGggICA9IChibCAtIHNvKSArIGJsICogKChmaW5pc2ggLSBzdGFydCkgLSAxKSArIGZvCisgICAgICAgICAgICBjYXBhY2l0eSA9IGJsICogKGVuZCAtIHN0YXJ0KQorICAgICAgICAgICAgcmV0dXJuICgnJXM8Ym9vbD4gb2YgbGVuZ3RoICVkLCBjYXBhY2l0eSAlZCcKKyAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi50eXBlbmFtZSwgaW50IChsZW5ndGgpLCBpbnQgKGNhcGFjaXR5KSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKCclcyBvZiBsZW5ndGggJWQsIGNhcGFjaXR5ICVkJworICAgICAgICAgICAgICAgICAgICAlIChzZWxmLnR5cGVuYW1lLCBpbnQgKGZpbmlzaCAtIHN0YXJ0KSwgaW50IChlbmQgLSBzdGFydCkpKQorCisgICAgZGVmIGRpc3BsYXlfaGludChzZWxmKToKKyAgICAgICAgcmV0dXJuICdhcnJheScKKworY2xhc3MgU3RkVmVjdG9ySXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBzdGQ6OnZlY3Rvcjo6aXRlcmF0b3IiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX2N1cnJlbnQnXS5kZXJlZmVyZW5jZSgpCisKK2NsYXNzIFN0ZFR1cGxlUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OnR1cGxlIgorCisgICAgY2xhc3MgX2l0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18gKHNlbGYsIGhlYWQpOgorICAgICAgICAgICAgc2VsZi5oZWFkID0gaGVhZAorCisgICAgICAgICAgICAjIFNldCB0aGUgYmFzZSBjbGFzcyBhcyB0aGUgaW5pdGlhbCBoZWFkIG9mIHRoZQorICAgICAgICAgICAgIyB0dXBsZS4KKyAgICAgICAgICAgIG5vZGVzID0gc2VsZi5oZWFkLnR5cGUuZmllbGRzICgpCisgICAgICAgICAgICBpZiBsZW4gKG5vZGVzKSA9PSAxOgorICAgICAgICAgICAgICAgICMgU2V0IHRoZSBhY3R1YWwgaGVhZCB0byB0aGUgZmlyc3QgcGFpci4KKyAgICAgICAgICAgICAgICBzZWxmLmhlYWQgID0gc2VsZi5oZWFkLmNhc3QgKG5vZGVzWzBdLnR5cGUpCisgICAgICAgICAgICBlbGlmIGxlbiAobm9kZXMpICE9IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIlRvcCBvZiB0dXBsZSB0cmVlIGRvZXMgbm90IGNvbnNpc3Qgb2YgYSBzaW5nbGUgbm9kZS4iCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyAoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0IChzZWxmKToKKyAgICAgICAgICAgIG5vZGVzID0gc2VsZi5oZWFkLnR5cGUuZmllbGRzICgpCisgICAgICAgICAgICAjIENoZWNrIGZvciBmdXJ0aGVyIHJlY3Vyc2lvbnMgaW4gdGhlIGluaGVyaXRhbmNlIHRyZWUuCisgICAgICAgICAgICBpZiBsZW4gKG5vZGVzKSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGlzIGl0ZXJhdGlvbiBoYXMgYW4gZXhwZWN0ZWQgc3RydWN0dXJlLgorICAgICAgICAgICAgaWYgbGVuIChub2RlcykgIT0gMjoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiQ2Fubm90IHBhcnNlIG1vcmUgdGhhbiAyIG5vZGVzIGluIGEgdHVwbGUgdHJlZS4iCisKKyAgICAgICAgICAgICMgLSBMZWZ0IG5vZGUgaXMgdGhlIG5leHQgcmVjdXJzaW9uIHBhcmVudC4KKyAgICAgICAgICAgICMgLSBSaWdodCBub2RlIGlzIHRoZSBhY3R1YWwgY2xhc3MgY29udGFpbmVkIGluIHRoZSB0dXBsZS4KKworICAgICAgICAgICAgIyBQcm9jZXNzIHJpZ2h0IG5vZGUuCisgICAgICAgICAgICBpbXBsID0gc2VsZi5oZWFkLmNhc3QgKG5vZGVzWzFdLnR5cGUpCisKKyAgICAgICAgICAgICMgUHJvY2VzcyBsZWZ0IG5vZGUgYW5kIHNldCBpdCBhcyBoZWFkLgorICAgICAgICAgICAgc2VsZi5oZWFkICA9IHNlbGYuaGVhZC5jYXN0IChub2Rlc1swXS50eXBlKQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisKKyAgICAgICAgICAgICMgRmluYWxseSwgY2hlY2sgdGhlIGltcGxlbWVudGF0aW9uLiAgSWYgaXQgaXMKKyAgICAgICAgICAgICMgd3JhcHBlZCBpbiBfTV9oZWFkX2ltcGwgcmV0dXJuIHRoYXQsIG90aGVyd2lzZSByZXR1cm4KKyAgICAgICAgICAgICMgdGhlIHZhbHVlICJhcyBpcyIuCisgICAgICAgICAgICBmaWVsZHMgPSBpbXBsLnR5cGUuZmllbGRzICgpCisgICAgICAgICAgICBpZiBsZW4gKGZpZWxkcykgPCAxIG9yIGZpZWxkc1swXS5uYW1lICE9ICJfTV9oZWFkX2ltcGwiOgorICAgICAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgc2VsZi5jb3VudCwgaW1wbCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBzZWxmLmNvdW50LCBpbXBsWydfTV9oZWFkX2ltcGwnXSkKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbDsKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyYXRvciAoc2VsZi52YWwpCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgaWYgbGVuIChzZWxmLnZhbC50eXBlLmZpZWxkcyAoKSkgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAnZW1wdHkgJXMnICUgKHNlbGYudHlwZW5hbWUpCisgICAgICAgIHJldHVybiAnJXMgY29udGFpbmluZycgJSAoc2VsZi50eXBlbmFtZSkKKworY2xhc3MgU3RkU3RhY2tPclF1ZXVlUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OnN0YWNrIG9yIHN0ZDo6cXVldWUiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52aXN1YWxpemVyID0gZ2RiLmRlZmF1bHRfdmlzdWFsaXplcih2YWxbJ2MnXSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZpc3VhbGl6ZXIuY2hpbGRyZW4oKQorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHJldHVybiAnJXMgd3JhcHBpbmc6ICVzJyAlIChzZWxmLnR5cGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52aXN1YWxpemVyLnRvX3N0cmluZygpKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIgKHNlbGYudmlzdWFsaXplciwgJ2Rpc3BsYXlfaGludCcpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudmlzdWFsaXplci5kaXNwbGF5X2hpbnQgKCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworY2xhc3MgUmJ0cmVlSXRlcmF0b3I6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJidHJlZSk6CisgICAgICAgIHNlbGYuc2l6ZSA9IHJidHJlZVsnX01fdCddWydfTV9pbXBsJ11bJ19NX25vZGVfY291bnQnXQorICAgICAgICBzZWxmLm5vZGUgPSByYnRyZWVbJ19NX3QnXVsnX01faW1wbCddWydfTV9oZWFkZXInXVsnX01fbGVmdCddCisgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGludCAoc2VsZi5zaXplKQorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY291bnQgPT0gc2VsZi5zaXplOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICByZXN1bHQgPSBzZWxmLm5vZGUKKyAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgIGlmIHNlbGYuY291bnQgPCBzZWxmLnNpemU6CisgICAgICAgICAgICAjIENvbXB1dGUgdGhlIG5leHQgbm9kZS4KKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLm5vZGUKKyAgICAgICAgICAgIGlmIG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fcmlnaHQnXToKKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9yaWdodCddCisgICAgICAgICAgICAgICAgd2hpbGUgbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9sZWZ0J106CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmRlcmVmZXJlbmNlKClbJ19NX2xlZnQnXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBub2RlLmRlcmVmZXJlbmNlKClbJ19NX3BhcmVudCddCisgICAgICAgICAgICAgICAgd2hpbGUgbm9kZSA9PSBwYXJlbnQuZGVyZWZlcmVuY2UoKVsnX01fcmlnaHQnXToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZGVyZWZlcmVuY2UoKVsnX01fcGFyZW50J10KKyAgICAgICAgICAgICAgICBpZiBub2RlLmRlcmVmZXJlbmNlKClbJ19NX3JpZ2h0J10gIT0gcGFyZW50OgorICAgICAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50CisgICAgICAgICAgICBzZWxmLm5vZGUgPSBub2RlCisgICAgICAgIHJldHVybiByZXN1bHQKKworIyBUaGlzIGlzIGEgcHJldHR5IHByaW50ZXIgZm9yIHN0ZDo6X1JiX3RyZWVfaXRlcmF0b3IgKHdoaWNoIGlzCisjIHN0ZDo6bWFwOjppdGVyYXRvciksIGFuZCBoYXMgbm90aGluZyB0byBkbyB3aXRoIHRoZSBSYnRyZWVJdGVyYXRvcgorIyBjbGFzcyBhYm92ZS4KK2NsYXNzIFN0ZFJidHJlZUl0ZXJhdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgc3RkOjptYXA6Oml0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICB0eXBlbmFtZSA9IHN0cihzZWxmLnZhbC50eXBlLnN0cmlwX3R5cGVkZWZzKCkpICsgJzo6X0xpbmtfdHlwZScKKyAgICAgICAgbm9kZXR5cGUgPSBnZGIubG9va3VwX3R5cGUodHlwZW5hbWUpLnN0cmlwX3R5cGVkZWZzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsLmNhc3Qobm9kZXR5cGUpLmRlcmVmZXJlbmNlKClbJ19NX3ZhbHVlX2ZpZWxkJ10KKworY2xhc3MgU3RkRGVidWdJdGVyYXRvclByaW50ZXI6CisgICAgIlByaW50IGEgZGVidWcgZW5hYmxlZCB2ZXJzaW9uIG9mIGFuIGl0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgICMgSnVzdCBzdHJpcCBhd2F5IHRoZSBlbmNhcHN1bGF0aW5nIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcgorICAgICMgYW5kIHJldHVybiB0aGUgd3JhcHBlZCBpdGVyYXRvciB2YWx1ZS4KKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgaXR5cGUgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01fY3VycmVudCddLmNhc3QoaXR5cGUpCisKK2NsYXNzIFN0ZE1hcFByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjptYXAgb3Igc3RkOjptdWx0aW1hcCIKKworICAgICMgVHVybiBhbiBSYnRyZWVJdGVyYXRvciBpbnRvIGEgcHJldHR5LXByaW50IGl0ZXJhdG9yLgorICAgIGNsYXNzIF9pdGVyOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcmJpdGVyLCB0eXBlKToKKyAgICAgICAgICAgIHNlbGYucmJpdGVyID0gcmJpdGVyCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorICAgICAgICAgICAgc2VsZi50eXBlID0gdHlwZQorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLmNvdW50ICUgMiA9PSAwOgorICAgICAgICAgICAgICAgIG4gPSBzZWxmLnJiaXRlci5uZXh0KCkKKyAgICAgICAgICAgICAgICBuID0gbi5jYXN0KHNlbGYudHlwZSkuZGVyZWZlcmVuY2UoKVsnX01fdmFsdWVfZmllbGQnXQorICAgICAgICAgICAgICAgIHNlbGYucGFpciA9IG4KKyAgICAgICAgICAgICAgICBpdGVtID0gblsnZmlyc3QnXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpdGVtID0gc2VsZi5wYWlyWydzZWNvbmQnXQorICAgICAgICAgICAgcmVzdWx0ID0gKCdbJWRdJyAlIHNlbGYuY291bnQsIGl0ZW0pCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHJldHVybiAnJXMgd2l0aCAlZCBlbGVtZW50cycgJSAoc2VsZi50eXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKFJidHJlZUl0ZXJhdG9yIChzZWxmLnZhbCkpKQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgcmVwX3R5cGUgPSBmaW5kX3R5cGUoc2VsZi52YWwudHlwZSwgJ19SZXBfdHlwZScpCisgICAgICAgIG5vZGUgPSBmaW5kX3R5cGUocmVwX3R5cGUsICdfTGlua190eXBlJykKKyAgICAgICAgbm9kZSA9IG5vZGUuc3RyaXBfdHlwZWRlZnMoKQorICAgICAgICByZXR1cm4gc2VsZi5faXRlciAoUmJ0cmVlSXRlcmF0b3IgKHNlbGYudmFsKSwgbm9kZSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ21hcCcKKworY2xhc3MgU3RkU2V0UHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OnNldCBvciBzdGQ6Om11bHRpc2V0IgorCisgICAgIyBUdXJuIGFuIFJidHJlZUl0ZXJhdG9yIGludG8gYSBwcmV0dHktcHJpbnQgaXRlcmF0b3IuCisgICAgY2xhc3MgX2l0ZXI6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCByYml0ZXIsIHR5cGUpOgorICAgICAgICAgICAgc2VsZi5yYml0ZXIgPSByYml0ZXIKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisgICAgICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGl0ZW0gPSBzZWxmLnJiaXRlci5uZXh0KCkKKyAgICAgICAgICAgIGl0ZW0gPSBpdGVtLmNhc3Qoc2VsZi50eXBlKS5kZXJlZmVyZW5jZSgpWydfTV92YWx1ZV9maWVsZCddCisgICAgICAgICAgICAjIEZJWE1FOiB0aGlzIGlzIHdlaXJkIC4uLiB3aGF0IHRvIGRvPworICAgICAgICAgICAgIyBNYXliZSBhICdzZXQnIGRpc3BsYXkgaGludD8KKyAgICAgICAgICAgIHJlc3VsdCA9ICgnWyVkXScgJSBzZWxmLmNvdW50LCBpdGVtKQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIChSYnRyZWVJdGVyYXRvciAoc2VsZi52YWwpKSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHJlcF90eXBlID0gZmluZF90eXBlKHNlbGYudmFsLnR5cGUsICdfUmVwX3R5cGUnKQorICAgICAgICBub2RlID0gZmluZF90eXBlKHJlcF90eXBlLCAnX0xpbmtfdHlwZScpCisgICAgICAgIG5vZGUgPSBub2RlLnN0cmlwX3R5cGVkZWZzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXIgKFJidHJlZUl0ZXJhdG9yIChzZWxmLnZhbCksIG5vZGUpCisKK2NsYXNzIFN0ZEJpdHNldFByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpiaXRzZXQiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgICMgSWYgdGVtcGxhdGVfYXJndW1lbnQgaGFuZGxlZCB2YWx1ZXMsIHdlIGNvdWxkIHByaW50IHRoZQorICAgICAgICAjIHNpemUuICBPciB3ZSBjb3VsZCB1c2UgYSByZWdleHAgb24gdGhlIHR5cGUuCisgICAgICAgIHJldHVybiAnJXMnICUgKHNlbGYudHlwZW5hbWUpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICB3b3JkcyA9IHNlbGYudmFsWydfTV93J10KKyAgICAgICAgd3R5cGUgPSB3b3Jkcy50eXBlCisKKyAgICAgICAgIyBUaGUgX01fdyBtZW1iZXIgY2FuIGJlIGVpdGhlciBhbiB1bnNpZ25lZCBsb25nLCBvciBhbgorICAgICAgICAjIGFycmF5LiAgVGhpcyBkZXBlbmRzIG9uIHRoZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB1c2VkLgorICAgICAgICAjIElmIGl0IGlzIGEgc2luZ2xlIGxvbmcsIGNvbnZlcnQgdG8gYSBzaW5nbGUgZWxlbWVudCBsaXN0LgorICAgICAgICBpZiB3dHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfQVJSQVk6CisgICAgICAgICAgICB0c2l6ZSA9IHd0eXBlLnRhcmdldCAoKS5zaXplb2YKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdvcmRzID0gW3dvcmRzXQorICAgICAgICAgICAgdHNpemUgPSB3dHlwZS5zaXplb2YgCisKKyAgICAgICAgbndvcmRzID0gd3R5cGUuc2l6ZW9mIC8gdHNpemUKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgYnl0ZSA9IDAKKyAgICAgICAgd2hpbGUgYnl0ZSA8IG53b3JkczoKKyAgICAgICAgICAgIHcgPSB3b3Jkc1tieXRlXQorICAgICAgICAgICAgYml0ID0gMAorICAgICAgICAgICAgd2hpbGUgdyAhPSAwOgorICAgICAgICAgICAgICAgIGlmICh3ICYgMSkgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBBbm90aGVyIHNwb3Qgd2hlcmUgd2UgY291bGQgdXNlICdzZXQnPworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCgnWyVkXScgJSAoYnl0ZSAqIHRzaXplICogOCArIGJpdCksIDEpKQorICAgICAgICAgICAgICAgIGJpdCA9IGJpdCArIDEKKyAgICAgICAgICAgICAgICB3ID0gdyA+PiAxCisgICAgICAgICAgICBieXRlID0gYnl0ZSArIDEKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCitjbGFzcyBTdGREZXF1ZVByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpkZXF1ZSIKKworICAgIGNsYXNzIF9pdGVyOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZSwgc3RhcnQsIGVuZCwgbGFzdCwgYnVmZmVyX3NpemUpOgorICAgICAgICAgICAgc2VsZi5ub2RlID0gbm9kZQorICAgICAgICAgICAgc2VsZi5wID0gc3RhcnQKKyAgICAgICAgICAgIHNlbGYuZW5kID0gZW5kCisgICAgICAgICAgICBzZWxmLmxhc3QgPSBsYXN0CisgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemUKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYucCA9PSBzZWxmLmxhc3Q6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCisgICAgICAgICAgICByZXN1bHQgPSAoJ1slZF0nICUgc2VsZi5jb3VudCwgc2VsZi5wLmRlcmVmZXJlbmNlKCkpCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKworICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSAnY3VyJyBwb2ludGVyLgorICAgICAgICAgICAgc2VsZi5wID0gc2VsZi5wICsgMQorICAgICAgICAgICAgaWYgc2VsZi5wID09IHNlbGYuZW5kOgorICAgICAgICAgICAgICAgICMgSWYgd2UgZ290IHRvIHRoZSBlbmQgb2YgdGhpcyBidWNrZXQsIG1vdmUgdG8gdGhlCisgICAgICAgICAgICAgICAgIyBuZXh0IGJ1Y2tldC4KKyAgICAgICAgICAgICAgICBzZWxmLm5vZGUgPSBzZWxmLm5vZGUgKyAxCisgICAgICAgICAgICAgICAgc2VsZi5wID0gc2VsZi5ub2RlWzBdCisgICAgICAgICAgICAgICAgc2VsZi5lbmQgPSBzZWxmLnAgKyBzZWxmLmJ1ZmZlcl9zaXplCisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisgICAgICAgIHNlbGYuZWx0dHlwZSA9IHZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgIHNpemUgPSBzZWxmLmVsdHR5cGUuc2l6ZW9mCisgICAgICAgIGlmIHNpemUgPCA1MTI6CisgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gaW50ICg1MTIgLyBzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZSA9IDEKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIHN0YXJ0ID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fc3RhcnQnXQorICAgICAgICBlbmQgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9maW5pc2gnXQorCisgICAgICAgIGRlbHRhX24gPSBlbmRbJ19NX25vZGUnXSAtIHN0YXJ0WydfTV9ub2RlJ10gLSAxCisgICAgICAgIGRlbHRhX3MgPSBzdGFydFsnX01fbGFzdCddIC0gc3RhcnRbJ19NX2N1ciddCisgICAgICAgIGRlbHRhX2UgPSBlbmRbJ19NX2N1ciddIC0gZW5kWydfTV9maXJzdCddCisKKyAgICAgICAgc2l6ZSA9IHNlbGYuYnVmZmVyX3NpemUgKiBkZWx0YV9uICsgZGVsdGFfcyArIGRlbHRhX2UKKworICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsIGxvbmcgKHNpemUpKQorCisgICAgZGVmIGNoaWxkcmVuKHNlbGYpOgorICAgICAgICBzdGFydCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J10KKyAgICAgICAgZW5kID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ10KKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXIoc3RhcnRbJ19NX25vZGUnXSwgc3RhcnRbJ19NX2N1ciddLCBzdGFydFsnX01fbGFzdCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRbJ19NX2N1ciddLCBzZWxmLmJ1ZmZlcl9zaXplKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnYXJyYXknCisKK2NsYXNzIFN0ZERlcXVlSXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBzdGQ6OmRlcXVlOjppdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01fY3VyJ10uZGVyZWZlcmVuY2UoKQorCitjbGFzcyBTdGRTdHJpbmdQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6YmFzaWNfc3RyaW5nIG9mIHNvbWUga2luZCIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlICZzdHJpbmcgd29ya3MsIHRvby4KKyAgICAgICAgdHlwZSA9IHNlbGYudmFsLnR5cGUKKyAgICAgICAgaWYgdHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfUkVGOgorICAgICAgICAgICAgdHlwZSA9IHR5cGUudGFyZ2V0ICgpCisKKyAgICAgICAgIyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNvIHRoYXQgdG9fc3RyaW5nIHJldHVybnMKKyAgICAgICAgIyB0aGUgc3RyaW5nIGFjY29yZGluZyB0byBsZW5ndGgsIG5vdCBhY2NvcmRpbmcgdG8gZmlyc3QgbnVsbAorICAgICAgICAjIGVuY291bnRlcmVkLgorICAgICAgICBwdHIgPSBzZWxmLnZhbCBbJ19NX2RhdGFwbHVzJ11bJ19NX3AnXQorICAgICAgICByZWFsdHlwZSA9IHR5cGUudW5xdWFsaWZpZWQgKCkuc3RyaXBfdHlwZWRlZnMgKCkKKyAgICAgICAgcmVwdHlwZSA9IGdkYi5sb29rdXBfdHlwZSAoc3RyIChyZWFsdHlwZSkgKyAnOjpfUmVwJykucG9pbnRlciAoKQorICAgICAgICBoZWFkZXIgPSBwdHIuY2FzdChyZXB0eXBlKSAtIDEKKyAgICAgICAgbGVuID0gaGVhZGVyLmRlcmVmZXJlbmNlICgpWydfTV9sZW5ndGgnXQorICAgICAgICBpZiBoYXNhdHRyKHB0ciwgImxhenlfc3RyaW5nIik6CisgICAgICAgICAgICByZXR1cm4gcHRyLmxhenlfc3RyaW5nIChsZW5ndGggPSBsZW4pCisgICAgICAgIHJldHVybiBwdHIuc3RyaW5nIChsZW5ndGggPSBsZW4pCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdzdHJpbmcnCisKK2NsYXNzIFRyMUhhc2h0YWJsZUl0ZXJhdG9yOgorICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgaGFzaCk6CisgICAgICAgIHNlbGYubm9kZSA9IGhhc2hbJ19NX2JlZm9yZV9iZWdpbiddWydfTV9ueHQnXQorICAgICAgICBzZWxmLm5vZGVfdHlwZSA9IGZpbmRfdHlwZShoYXNoLnR5cGUsICdfTm9kZScpLnBvaW50ZXIoKQorCisgICAgZGVmIF9faXRlcl9fIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0IChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5ub2RlID09IDA6CisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIG5vZGUgPSBzZWxmLm5vZGUuY2FzdChzZWxmLm5vZGVfdHlwZSkKKyAgICAgICAgcmVzdWx0ID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV92J10KKyAgICAgICAgc2VsZi5ub2RlID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9ueHQnXQorICAgICAgICByZXR1cm4gcmVzdWx0CisKK2NsYXNzIFRyMVVub3JkZXJlZFNldFByaW50ZXI6CisgICAgIlByaW50IGEgdHIxOjp1bm9yZGVyZWRfc2V0IgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgcmV0dXJuICclcyB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLCBzZWxmLnZhbFsnX01fZWxlbWVudF9jb3VudCddKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBmb3JtYXRfY291bnQgKGkpOgorICAgICAgICByZXR1cm4gJ1slZF0nICUgaQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgY291bnRlciA9IGl0ZXJ0b29scy5pbWFwIChzZWxmLmZvcm1hdF9jb3VudCwgaXRlcnRvb2xzLmNvdW50KCkpCisgICAgICAgIHJldHVybiBpdGVydG9vbHMuaXppcCAoY291bnRlciwgVHIxSGFzaHRhYmxlSXRlcmF0b3IgKHNlbGYudmFsKSkKKworY2xhc3MgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcjoKKyAgICAiUHJpbnQgYSB0cjE6OnVub3JkZXJlZF9tYXAiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsIHNlbGYudmFsWydfTV9lbGVtZW50X2NvdW50J10pCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGZsYXR0ZW4gKGxpc3QpOgorICAgICAgICBmb3IgZWx0IGluIGxpc3Q6CisgICAgICAgICAgICBmb3IgaSBpbiBlbHQ6CisgICAgICAgICAgICAgICAgeWllbGQgaQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBmb3JtYXRfb25lIChlbHQpOgorICAgICAgICByZXR1cm4gKGVsdFsnZmlyc3QnXSwgZWx0WydzZWNvbmQnXSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZm9ybWF0X2NvdW50IChpKToKKyAgICAgICAgcmV0dXJuICdbJWRdJyAlIGkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIGNvdW50ZXIgPSBpdGVydG9vbHMuaW1hcCAoc2VsZi5mb3JtYXRfY291bnQsIGl0ZXJ0b29scy5jb3VudCgpKQorICAgICAgICAjIE1hcCBvdmVyIHRoZSBoYXNoIHRhYmxlIGFuZCBmbGF0dGVuIHRoZSByZXN1bHQuCisgICAgICAgIGRhdGEgPSBzZWxmLmZsYXR0ZW4gKGl0ZXJ0b29scy5pbWFwIChzZWxmLmZvcm1hdF9vbmUsIFRyMUhhc2h0YWJsZUl0ZXJhdG9yIChzZWxmLnZhbCkpKQorICAgICAgICAjIFppcCB0aGUgdHdvIGl0ZXJhdG9ycyB0b2dldGhlci4KKyAgICAgICAgcmV0dXJuIGl0ZXJ0b29scy5pemlwIChjb3VudGVyLCBkYXRhKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnbWFwJworCitjbGFzcyBTdGRGb3J3YXJkTGlzdFByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpmb3J3YXJkX2xpc3QiCisKKyAgICBjbGFzcyBfaXRlcmF0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RldHlwZSwgaGVhZCk6CisgICAgICAgICAgICBzZWxmLm5vZGV0eXBlID0gbm9kZXR5cGUKKyAgICAgICAgICAgIHNlbGYuYmFzZSA9IGhlYWRbJ19NX25leHQnXQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5iYXNlID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgZWx0ID0gc2VsZi5iYXNlLmNhc3Qoc2VsZi5ub2RldHlwZSkuZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgc2VsZi5iYXNlID0gZWx0WydfTV9uZXh0J10KKyAgICAgICAgICAgIGNvdW50ID0gc2VsZi5jb3VudAorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBlbHRbJ19NX3ZhbHVlJ10pCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorCisgICAgZGVmIGNoaWxkcmVuKHNlbGYpOgorICAgICAgICBub2RldHlwZSA9IGZpbmRfdHlwZShzZWxmLnZhbC50eXBlLCAnX05vZGUnKQorICAgICAgICBub2RldHlwZSA9IG5vZGV0eXBlLnN0cmlwX3R5cGVkZWZzKCkucG9pbnRlcigpCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyYXRvcihub2RldHlwZSwgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01faGVhZCddKQorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01faGVhZCddWydfTV9uZXh0J10gPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAnZW1wdHkgJXMnICUgKHNlbGYudHlwZW5hbWUpCisgICAgICAgIHJldHVybiAnJXMnICUgKHNlbGYudHlwZW5hbWUpCisKKworIyBBICJyZWd1bGFyIGV4cHJlc3Npb24iIHByaW50ZXIgd2hpY2ggY29uZm9ybXMgdG8gdGhlCisjICJTdWJQcmV0dHlQcmludGVyIiBwcm90b2NvbCBmcm9tIGdkYi5wcmludGluZy4KK2NsYXNzIFJ4UHJpbnRlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBmdW5jdGlvbik6CisgICAgICAgIHN1cGVyKFJ4UHJpbnRlciwgc2VsZikuX19pbml0X18oKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZnVuY3Rpb24gPSBmdW5jdGlvbgorICAgICAgICBzZWxmLmVuYWJsZWQgPSBUcnVlCisKKyAgICBkZWYgaW52b2tlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgaWYgbm90IHNlbGYuZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLmZ1bmN0aW9uKHNlbGYubmFtZSwgdmFsdWUpCisKKyMgQSBwcmV0dHktcHJpbnRlciB0aGF0IGNvbmZvcm1zIHRvIHRoZSAiUHJldHR5UHJpbnRlciIgcHJvdG9jb2wgZnJvbQorIyBnZGIucHJpbnRpbmcuICBJdCBjYW4gYWxzbyBiZSB1c2VkIGRpcmVjdGx5IGFzIGFuIG9sZC1zdHlsZSBwcmludGVyLgorY2xhc3MgUHJpbnRlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgc3VwZXIoUHJpbnRlciwgc2VsZikuX19pbml0X18oKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuc3VicHJpbnRlcnMgPSBbXQorICAgICAgICBzZWxmLmxvb2t1cCA9IHt9CisgICAgICAgIHNlbGYuZW5hYmxlZCA9IFRydWUKKyAgICAgICAgc2VsZi5jb21waWxlZF9yeCA9IHJlLmNvbXBpbGUoJ14oW2EtekEtWjAtOV86XSspPC4qPiQnKQorCisgICAgZGVmIGFkZChzZWxmLCBuYW1lLCBmdW5jdGlvbik6CisgICAgICAgICMgQSBzbWFsbCBzYW5pdHkgY2hlY2suCisgICAgICAgICMgRklYTUUKKyAgICAgICAgaWYgbm90IHNlbGYuY29tcGlsZWRfcngubWF0Y2gobmFtZSArICc8PicpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ2xpYnN0ZGMrKyBwcm9ncmFtbWluZyBlcnJvcjogIiVzIiBkb2VzIG5vdCBtYXRjaCcgJSBuYW1lCisgICAgICAgIHByaW50ZXIgPSBSeFByaW50ZXIobmFtZSwgZnVuY3Rpb24pCisgICAgICAgIHNlbGYuc3VicHJpbnRlcnMuYXBwZW5kKHByaW50ZXIpCisgICAgICAgIHNlbGYubG9va3VwW25hbWVdID0gcHJpbnRlcgorCisgICAgIyBBZGQgYSBuYW1lIHVzaW5nIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OLgorICAgIGRlZiBhZGRfdmVyc2lvbihzZWxmLCBiYXNlLCBuYW1lLCBmdW5jdGlvbik6CisgICAgICAgIHNlbGYuYWRkKGJhc2UgKyBuYW1lLCBmdW5jdGlvbikKKyAgICAgICAgc2VsZi5hZGQoYmFzZSArICdfXzc6OicgKyBuYW1lLCBmdW5jdGlvbikKKworICAgICMgQWRkIGEgbmFtZSB1c2luZyBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSLgorICAgIGRlZiBhZGRfY29udGFpbmVyKHNlbGYsIGJhc2UsIG5hbWUsIGZ1bmN0aW9uKToKKyAgICAgICAgc2VsZi5hZGRfdmVyc2lvbihiYXNlLCBuYW1lLCBmdW5jdGlvbikKKyAgICAgICAgc2VsZi5hZGRfdmVyc2lvbihiYXNlICsgJ19fY3h4MTk5ODo6JywgbmFtZSwgZnVuY3Rpb24pCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGdldF9iYXNpY190eXBlKHR5cGUpOgorICAgICAgICAjIElmIGl0IHBvaW50cyB0byBhIHJlZmVyZW5jZSwgZ2V0IHRoZSByZWZlcmVuY2UuCisgICAgICAgIGlmIHR5cGUuY29kZSA9PSBnZGIuVFlQRV9DT0RFX1JFRjoKKyAgICAgICAgICAgIHR5cGUgPSB0eXBlLnRhcmdldCAoKQorCisgICAgICAgICMgR2V0IHRoZSB1bnF1YWxpZmllZCB0eXBlLCBzdHJpcHBlZCBvZiB0eXBlZGVmcy4KKyAgICAgICAgdHlwZSA9IHR5cGUudW5xdWFsaWZpZWQgKCkuc3RyaXBfdHlwZWRlZnMgKCkKKworICAgICAgICByZXR1cm4gdHlwZS50YWcKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCB2YWwpOgorICAgICAgICB0eXBlbmFtZSA9IHNlbGYuZ2V0X2Jhc2ljX3R5cGUodmFsLnR5cGUpCisgICAgICAgIGlmIG5vdCB0eXBlbmFtZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBBbGwgdGhlIHR5cGVzIHdlIG1hdGNoIGFyZSB0ZW1wbGF0ZSB0eXBlcywgc28gd2UgY2FuIHVzZSBhCisgICAgICAgICMgZGljdGlvbmFyeS4KKyAgICAgICAgbWF0Y2ggPSBzZWxmLmNvbXBpbGVkX3J4Lm1hdGNoKHR5cGVuYW1lKQorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGJhc2VuYW1lID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgaWYgYmFzZW5hbWUgaW4gc2VsZi5sb29rdXA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5sb29rdXBbYmFzZW5hbWVdLmludm9rZSh2YWwpCisKKyAgICAgICAgIyBDYW5ub3QgZmluZCBhIHByZXR0eSBwcmludGVyLiAgUmV0dXJuIE5vbmUuCisgICAgICAgIHJldHVybiBOb25lCisKK2xpYnN0ZGN4eF9wcmludGVyID0gTm9uZQorCitkZWYgcmVnaXN0ZXJfbGlic3RkY3h4X3ByaW50ZXJzIChvYmopOgorICAgICJSZWdpc3RlciBsaWJzdGRjKysgcHJldHR5LXByaW50ZXJzIHdpdGggb2JqZmlsZSBPYmouIgorCisgICAgZ2xvYmFsIF91c2VfZ2RiX3BwCisgICAgZ2xvYmFsIGxpYnN0ZGN4eF9wcmludGVyCisKKyAgICBpZiBfdXNlX2dkYl9wcDoKKyAgICAgICAgZ2RiLnByaW50aW5nLnJlZ2lzdGVyX3ByZXR0eV9wcmludGVyKG9iaiwgbGlic3RkY3h4X3ByaW50ZXIpCisgICAgZWxzZToKKyAgICAgICAgaWYgb2JqIGlzIE5vbmU6CisgICAgICAgICAgICBvYmogPSBnZGIKKyAgICAgICAgb2JqLnByZXR0eV9wcmludGVycy5hcHBlbmQobGlic3RkY3h4X3ByaW50ZXIpCisKK2RlZiBidWlsZF9saWJzdGRjeHhfZGljdGlvbmFyeSAoKToKKyAgICBnbG9iYWwgbGlic3RkY3h4X3ByaW50ZXIKKworICAgIGxpYnN0ZGN4eF9wcmludGVyID0gUHJpbnRlcigibGlic3RkYysrLXY2IikKKworICAgICMgRm9yIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OLgorICAgIHZlcnMgPSAnKF9fNzo6KT8nCisgICAgIyBGb3IgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUi4KKyAgICBjb250YWluZXIgPSAnKF9fY3h4MTk5ODo6JyArIHZlcnMgKyAnKT8nCisKKyAgICAjIGxpYnN0ZGMrKyBvYmplY3RzIHJlcXVpcmluZyBwcmV0dHktcHJpbnRpbmcuCisgICAgIyBJbiBvcmRlciBmcm9tOgorICAgICMgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL2xhdGVzdC1kb3h5Z2VuL2EwMTg0Ny5odG1sCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ2Jhc2ljX3N0cmluZycsIFN0ZFN0cmluZ1ByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnYml0c2V0JywgU3RkQml0c2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdkZXF1ZScsIFN0ZERlcXVlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdsaXN0JywgU3RkTGlzdFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnbWFwJywgU3RkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdtdWx0aW1hcCcsIFN0ZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnbXVsdGlzZXQnLCBTdGRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICdwcmlvcml0eV9xdWV1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkU3RhY2tPclF1ZXVlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjonLCAncXVldWUnLCBTdGRTdGFja09yUXVldWVQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICd0dXBsZScsIFN0ZFR1cGxlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdzZXQnLCBTdGRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICdzdGFjaycsIFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ3VuaXF1ZV9wdHInLCBVbmlxdWVQb2ludGVyUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICd2ZWN0b3InLCBTdGRWZWN0b3JQcmludGVyKQorICAgICMgdmVjdG9yPGJvb2w+CisKKyAgICAjIFByaW50ZXIgcmVnaXN0cmF0aW9ucyBmb3IgY2xhc3NlcyBjb21waWxlZCB3aXRoIC1EX0dMSUJDWFhfREVCVUcuCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OmJpdHNldCcsIFN0ZEJpdHNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OmRlcXVlJywgU3RkRGVxdWVQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjpsaXN0JywgU3RkTGlzdFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6Om1hcCcsIFN0ZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6Om11bHRpbWFwJywgU3RkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6bXVsdGlzZXQnLCBTdGRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjpwcmlvcml0eV9xdWV1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnF1ZXVlJywgU3RkU3RhY2tPclF1ZXVlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6c2V0JywgU3RkU2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6c3RhY2snLCBTdGRTdGFja09yUXVldWVQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjp1bmlxdWVfcHRyJywgVW5pcXVlUG9pbnRlclByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnZlY3RvcicsIFN0ZFZlY3RvclByaW50ZXIpCisKKyAgICAjIFRoZXNlIGFyZSB0aGUgVFIxIGFuZCBDKysweCBwcmludGVycy4KKyAgICAjIEZvciBhcnJheSAtIHRoZSBkZWZhdWx0IEdEQiBwcmV0dHktcHJpbnRlciBzZWVtcyByZWFzb25hYmxlLgorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICdzaGFyZWRfcHRyJywgU2hhcmVkUG9pbnRlclByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ3dlYWtfcHRyJywgU2hhcmVkUG9pbnRlclByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAndW5vcmRlcmVkX21hcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRNYXBQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ3Vub3JkZXJlZF9zZXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkU2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICd1bm9yZGVyZWRfbXVsdGltYXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICd1bm9yZGVyZWRfbXVsdGlzZXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkU2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdmb3J3YXJkX2xpc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkRm9yd2FyZExpc3RQcmludGVyKQorCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6dHIxOjonLCAnc2hhcmVkX3B0cicsIFNoYXJlZFBvaW50ZXJQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OnRyMTo6JywgJ3dlYWtfcHRyJywgU2hhcmVkUG9pbnRlclByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6dHIxOjonLCAndW5vcmRlcmVkX21hcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjp0cjE6OicsICd1bm9yZGVyZWRfc2V0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OnRyMTo6JywgJ3Vub3JkZXJlZF9tdWx0aW1hcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjp0cjE6OicsICd1bm9yZGVyZWRfbXVsdGlzZXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZFNldFByaW50ZXIpCisKKyAgICAjIFRoZXNlIGFyZSB0aGUgQysrMHggcHJpbnRlciByZWdpc3RyYXRpb25zIGZvciAtRF9HTElCQ1hYX0RFQlVHIGNhc2VzLgorICAgICMgVGhlIHRyMSBuYW1lc3BhY2UgcHJpbnRlcnMgZG8gbm90IHNlZW0gdG8gaGF2ZSBhbnkgZGVidWcKKyAgICAjIGVxdWl2YWxlbnRzLCBzbyBkbyBubyByZWdpc3RlciB0aGVtLgorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjp1bm9yZGVyZWRfbWFwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6dW5vcmRlcmVkX3NldCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZFNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnVub3JkZXJlZF9tdWx0aW1hcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnVub3JkZXJlZF9tdWx0aXNldCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZFNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OmZvcndhcmRfbGlzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZEZvcndhcmRMaXN0UHJpbnRlcikKKworCisgICAgIyBFeHRlbnNpb25zLgorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdfX2dudV9jeHg6OicsICdzbGlzdCcsIFN0ZFNsaXN0UHJpbnRlcikKKworICAgIGlmIFRydWU6CisgICAgICAgICMgVGhlc2Ugc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgaWYgR0RCICJwcmludCAqaSIgd29ya2VkLgorICAgICAgICAjIEJ1dCBpdCBvZnRlbiBkb2Vzbid0LCBzbyBoZXJlIHRoZXkgYXJlLgorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdfTGlzdF9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkTGlzdEl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnX0xpc3RfY29uc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZExpc3RJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICdfUmJfdHJlZV9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZFJidHJlZUl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ19SYl90cmVlX2NvbnN0X2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkUmJ0cmVlSXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdfRGVxdWVfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZERlcXVlSXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdfRGVxdWVfY29uc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZERlcXVlSXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignX19nbnVfY3h4OjonLCAnX19ub3JtYWxfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRWZWN0b3JJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdfX2dudV9jeHg6OicsICdfU2xpc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRTbGlzdEl0ZXJhdG9yUHJpbnRlcikKKworICAgICAgICAjIERlYnVnIChjb21waWxlZCB3aXRoIC1EX0dMSUJDWFhfREVCVUcpIHByaW50ZXIKKyAgICAgICAgIyByZWdpc3RyYXRpb25zLiAgVGhlIFJiX3RyZWUgZGVidWcgaXRlcmF0b3Igd2hlbiB1bndyYXBwZWQKKyAgICAgICAgIyBmcm9tIHRoZSBlbmNhcHN1bGF0aW5nIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvciBkb2VzIG5vdAorICAgICAgICAjIGhhdmUgdGhlIF9fbm9ybSBuYW1lc3BhY2UuIEp1c3QgdXNlIHRoZSBleGlzdGluZyBwcmludGVyCisgICAgICAgICMgcmVnaXN0cmF0aW9uIGZvciB0aGF0LgorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ19fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGREZWJ1Z0l0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fbm9ybTo6X0xpc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkTGlzdEl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fbm9ybTo6X0xpc3RfY29uc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkTGlzdEl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fbm9ybTo6X0RlcXVlX2NvbnN0X2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZERlcXVlSXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19ub3JtOjpfRGVxdWVfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkRGVxdWVJdGVyYXRvclByaW50ZXIpCisKK2J1aWxkX2xpYnN0ZGN4eF9kaWN0aW9uYXJ5ICgpCmRpZmYgLS1naXQgYS9zaGFyZS9wcmV0dHktcHJpbnRlcnMvbGlic3RkY3h4L2djYy00LjgvX19pbml0X18ucHkgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvbGlic3RkY3h4L2djYy00LjgvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxMzc4OQotLS0gL2Rldi9udWxsCisrKyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuOC9fX2luaXRfXy5weQpAQCAtMCwwICsxIEBACisKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuOC9wcmludGVycy5weSBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuOC9wcmludGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmYyMDA3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL2xpYnN0ZGN4eC9nY2MtNC44L3ByaW50ZXJzLnB5CkBAIC0wLDAgKzEsMTA0NCBAQAorIyBQcmV0dHktcHJpbnRlcnMgZm9yIGxpYnN0YysrLgorCisjIENvcHlyaWdodCAoQykgMjAwOC0yMDEzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitpbXBvcnQgZ2RiCitpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgcmUKKworIyBUcnkgdG8gdXNlIHRoZSBuZXctc3R5bGUgcHJldHR5LXByaW50aW5nIGlmIGF2YWlsYWJsZS4KK191c2VfZ2RiX3BwID0gVHJ1ZQordHJ5OgorICAgIGltcG9ydCBnZGIucHJpbnRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBfdXNlX2dkYl9wcCA9IEZhbHNlCisKKyMgVHJ5IHRvIGluc3RhbGwgdHlwZS1wcmludGVycy4KK191c2VfdHlwZV9wcmludGluZyA9IEZhbHNlCit0cnk6CisgICAgaW1wb3J0IGdkYi50eXBlcworICAgIGlmIGhhc2F0dHIoZ2RiLnR5cGVzLCAnVHlwZVByaW50ZXInKToKKyAgICAgICAgX3VzZV90eXBlX3ByaW50aW5nID0gVHJ1ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKKworIyBTdGFydGluZyB3aXRoIHRoZSB0eXBlIE9SSUcsIHNlYXJjaCBmb3IgdGhlIG1lbWJlciB0eXBlIE5BTUUuICBUaGlzCisjIGhhbmRsZXMgc2VhcmNoaW5nIHVwd2FyZCB0aHJvdWdoIHN1cGVyY2xhc3Nlcy4gIFRoaXMgaXMgbmVlZGVkIHRvCisjIHdvcmsgYXJvdW5kIGh0dHA6Ly9zb3VyY2V3YXJlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTM2MTUuCitkZWYgZmluZF90eXBlKG9yaWcsIG5hbWUpOgorICAgIHR5cCA9IG9yaWcuc3RyaXBfdHlwZWRlZnMoKQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHNlYXJjaCA9IHN0cih0eXApICsgJzo6JyArIG5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGdkYi5sb29rdXBfdHlwZShzZWFyY2gpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgVGhlIHR5cGUgd2FzIG5vdCBmb3VuZCwgc28gdHJ5IHRoZSBzdXBlcmNsYXNzLiAgV2Ugb25seSBuZWVkCisgICAgICAgICMgdG8gY2hlY2sgdGhlIGZpcnN0IHN1cGVyY2xhc3MsIHNvIHdlIGRvbid0IGJvdGhlciB3aXRoCisgICAgICAgICMgYW55dGhpbmcgZmFuY2llciBoZXJlLgorICAgICAgICBmaWVsZCA9IHR5cC5maWVsZHMoKVswXQorICAgICAgICBpZiBub3QgZmllbGQuaXNfYmFzZV9jbGFzczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJDYW5ub3QgZmluZCB0eXBlICVzOjolcyIgJSAoc3RyKG9yaWcpLCBuYW1lKQorICAgICAgICB0eXAgPSBmaWVsZC50eXBlCisKK2NsYXNzIFNoYXJlZFBvaW50ZXJQcmludGVyOgorICAgICJQcmludCBhIHNoYXJlZF9wdHIgb3Igd2Vha19wdHIiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICBzdGF0ZSA9ICdlbXB0eScKKyAgICAgICAgcmVmY291bnRzID0gc2VsZi52YWxbJ19NX3JlZmNvdW50J11bJ19NX3BpJ10KKyAgICAgICAgaWYgcmVmY291bnRzICE9IDA6CisgICAgICAgICAgICB1c2Vjb3VudCA9IHJlZmNvdW50c1snX01fdXNlX2NvdW50J10KKyAgICAgICAgICAgIHdlYWtjb3VudCA9IHJlZmNvdW50c1snX01fd2Vha19jb3VudCddCisgICAgICAgICAgICBpZiB1c2Vjb3VudCA9PSAwOgorICAgICAgICAgICAgICAgIHN0YXRlID0gJ2V4cGlyZWQsIHdlYWsgJWQnICUgd2Vha2NvdW50CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXRlID0gJ2NvdW50ICVkLCB3ZWFrICVkJyAlICh1c2Vjb3VudCwgd2Vha2NvdW50IC0gMSkKKyAgICAgICAgcmV0dXJuICclcyAoJXMpICVzJyAlIChzZWxmLnR5cGVuYW1lLCBzdGF0ZSwgc2VsZi52YWxbJ19NX3B0ciddKQorCitjbGFzcyBVbmlxdWVQb2ludGVyUHJpbnRlcjoKKyAgICAiUHJpbnQgYSB1bmlxdWVfcHRyIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICB2ID0gc2VsZi52YWxbJ19NX3QnXVsnX01faGVhZF9pbXBsJ10KKyAgICAgICAgcmV0dXJuICgnc3RkOjp1bmlxdWVfcHRyPCVzPiBjb250YWluaW5nICVzJyAlIChzdHIodi50eXBlLnRhcmdldCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIodikpKQorCitjbGFzcyBTdGRMaXN0UHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6Omxpc3QiCisKKyAgICBjbGFzcyBfaXRlcmF0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RldHlwZSwgaGVhZCk6CisgICAgICAgICAgICBzZWxmLm5vZGV0eXBlID0gbm9kZXR5cGUKKyAgICAgICAgICAgIHNlbGYuYmFzZSA9IGhlYWRbJ19NX25leHQnXQorICAgICAgICAgICAgc2VsZi5oZWFkID0gaGVhZC5hZGRyZXNzCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLmJhc2UgPT0gc2VsZi5oZWFkOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIGVsdCA9IHNlbGYuYmFzZS5jYXN0KHNlbGYubm9kZXR5cGUpLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgIHNlbGYuYmFzZSA9IGVsdFsnX01fbmV4dCddCisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgZWx0WydfTV9kYXRhJ10pCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIGNoaWxkcmVuKHNlbGYpOgorICAgICAgICBub2RldHlwZSA9IGZpbmRfdHlwZShzZWxmLnZhbC50eXBlLCAnX05vZGUnKQorICAgICAgICBub2RldHlwZSA9IG5vZGV0eXBlLnN0cmlwX3R5cGVkZWZzKCkucG9pbnRlcigpCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyYXRvcihub2RldHlwZSwgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fbm9kZSddKQorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fbm9kZSddLmFkZHJlc3MgPT0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fbm9kZSddWydfTV9uZXh0J106CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5ICVzJyAlIChzZWxmLnR5cGVuYW1lKQorICAgICAgICByZXR1cm4gJyVzJyAlIChzZWxmLnR5cGVuYW1lKQorCitjbGFzcyBTdGRMaXN0SXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBzdGQ6Omxpc3Q6Oml0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIG5vZGV0eXBlID0gZmluZF90eXBlKHNlbGYudmFsLnR5cGUsICdfTm9kZScpCisgICAgICAgIG5vZGV0eXBlID0gbm9kZXR5cGUuc3RyaXBfdHlwZWRlZnMoKS5wb2ludGVyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9ub2RlJ10uY2FzdChub2RldHlwZSkuZGVyZWZlcmVuY2UoKVsnX01fZGF0YSddCisKK2NsYXNzIFN0ZFNsaXN0UHJpbnRlcjoKKyAgICAiUHJpbnQgYSBfX2dudV9jeHg6OnNsaXN0IgorCisgICAgY2xhc3MgX2l0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXR5cGUsIGhlYWQpOgorICAgICAgICAgICAgc2VsZi5ub2RldHlwZSA9IG5vZGV0eXBlCisgICAgICAgICAgICBzZWxmLmJhc2UgPSBoZWFkWydfTV9oZWFkJ11bJ19NX25leHQnXQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5iYXNlID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgZWx0ID0gc2VsZi5iYXNlLmNhc3Qoc2VsZi5ub2RldHlwZSkuZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgc2VsZi5iYXNlID0gZWx0WydfTV9uZXh0J10KKyAgICAgICAgICAgIGNvdW50ID0gc2VsZi5jb3VudAorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBlbHRbJ19NX2RhdGEnXSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiBjaGlsZHJlbihzZWxmKToKKyAgICAgICAgbm9kZXR5cGUgPSBmaW5kX3R5cGUoc2VsZi52YWwudHlwZSwgJ19Ob2RlJykKKyAgICAgICAgbm9kZXR5cGUgPSBub2RldHlwZS5zdHJpcF90eXBlZGVmcygpLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi5faXRlcmF0b3Iobm9kZXR5cGUsIHNlbGYudmFsKQorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi52YWxbJ19NX2hlYWQnXVsnX01fbmV4dCddID09IDA6CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5IF9fZ251X2N4eDo6c2xpc3QnCisgICAgICAgIHJldHVybiAnX19nbnVfY3h4OjpzbGlzdCcKKworY2xhc3MgU3RkU2xpc3RJdGVyYXRvclByaW50ZXI6CisgICAgIlByaW50IF9fZ251X2N4eDo6c2xpc3Q6Oml0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgbm9kZXR5cGUgPSBmaW5kX3R5cGUoc2VsZi52YWwudHlwZSwgJ19Ob2RlJykKKyAgICAgICAgbm9kZXR5cGUgPSBub2RldHlwZS5zdHJpcF90eXBlZGVmcygpLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX25vZGUnXS5jYXN0KG5vZGV0eXBlKS5kZXJlZmVyZW5jZSgpWydfTV9kYXRhJ10KKworY2xhc3MgU3RkVmVjdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OnZlY3RvciIKKworICAgIGNsYXNzIF9pdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fIChzZWxmLCBzdGFydCwgZmluaXNoLCBiaXR2ZWMpOgorICAgICAgICAgICAgc2VsZi5iaXR2ZWMgPSBiaXR2ZWMKKyAgICAgICAgICAgIGlmIGJpdHZlYzoKKyAgICAgICAgICAgICAgICBzZWxmLml0ZW0gICA9IHN0YXJ0WydfTV9wJ10KKyAgICAgICAgICAgICAgICBzZWxmLnNvICAgICA9IHN0YXJ0WydfTV9vZmZzZXQnXQorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoID0gZmluaXNoWydfTV9wJ10KKyAgICAgICAgICAgICAgICBzZWxmLmZvICAgICA9IGZpbmlzaFsnX01fb2Zmc2V0J10KKyAgICAgICAgICAgICAgICBpdHlwZSA9IHNlbGYuaXRlbS5kZXJlZmVyZW5jZSgpLnR5cGUKKyAgICAgICAgICAgICAgICBzZWxmLmlzaXplID0gOCAqIGl0eXBlLnNpemVvZgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLml0ZW0gPSBzdGFydAorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoID0gZmluaXNoCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgaWYgc2VsZi5iaXR2ZWM6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5pdGVtID09IHNlbGYuZmluaXNoIGFuZCBzZWxmLnNvID49IHNlbGYuZm86CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICAgICBlbHQgPSBzZWxmLml0ZW0uZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgIGlmIGVsdCAmICgxIDw8IHNlbGYuc28pOgorICAgICAgICAgICAgICAgICAgICBvYml0ID0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG9iaXQgPSAwCisgICAgICAgICAgICAgICAgc2VsZi5zbyA9IHNlbGYuc28gKyAxCisgICAgICAgICAgICAgICAgaWYgc2VsZi5zbyA+PSBzZWxmLmlzaXplOgorICAgICAgICAgICAgICAgICAgICBzZWxmLml0ZW0gPSBzZWxmLml0ZW0gKyAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc28gPSAwCisgICAgICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgb2JpdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5pdGVtID09IHNlbGYuZmluaXNoOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgZWx0ID0gc2VsZi5pdGVtLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICBzZWxmLml0ZW0gPSBzZWxmLml0ZW0gKyAxCisgICAgICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgZWx0KQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKyAgICAgICAgc2VsZi5pc19ib29sID0gdmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMCkuY29kZSAgPT0gZ2RiLlRZUEVfQ09ERV9CT09MCisKKyAgICBkZWYgY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyYXRvcihzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlzX2Jvb2wpCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICBzdGFydCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J10KKyAgICAgICAgZmluaXNoID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ10KKyAgICAgICAgZW5kID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZW5kX29mX3N0b3JhZ2UnXQorICAgICAgICBpZiBzZWxmLmlzX2Jvb2w6CisgICAgICAgICAgICBzdGFydCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J11bJ19NX3AnXQorICAgICAgICAgICAgc28gICAgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddWydfTV9vZmZzZXQnXQorICAgICAgICAgICAgZmluaXNoID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ11bJ19NX3AnXQorICAgICAgICAgICAgZm8gICAgID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ11bJ19NX29mZnNldCddCisgICAgICAgICAgICBpdHlwZSA9IHN0YXJ0LmRlcmVmZXJlbmNlKCkudHlwZQorICAgICAgICAgICAgYmwgPSA4ICogaXR5cGUuc2l6ZW9mCisgICAgICAgICAgICBsZW5ndGggICA9IChibCAtIHNvKSArIGJsICogKChmaW5pc2ggLSBzdGFydCkgLSAxKSArIGZvCisgICAgICAgICAgICBjYXBhY2l0eSA9IGJsICogKGVuZCAtIHN0YXJ0KQorICAgICAgICAgICAgcmV0dXJuICgnJXM8Ym9vbD4gb2YgbGVuZ3RoICVkLCBjYXBhY2l0eSAlZCcKKyAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi50eXBlbmFtZSwgaW50IChsZW5ndGgpLCBpbnQgKGNhcGFjaXR5KSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKCclcyBvZiBsZW5ndGggJWQsIGNhcGFjaXR5ICVkJworICAgICAgICAgICAgICAgICAgICAlIChzZWxmLnR5cGVuYW1lLCBpbnQgKGZpbmlzaCAtIHN0YXJ0KSwgaW50IChlbmQgLSBzdGFydCkpKQorCisgICAgZGVmIGRpc3BsYXlfaGludChzZWxmKToKKyAgICAgICAgcmV0dXJuICdhcnJheScKKworY2xhc3MgU3RkVmVjdG9ySXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBzdGQ6OnZlY3Rvcjo6aXRlcmF0b3IiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX2N1cnJlbnQnXS5kZXJlZmVyZW5jZSgpCisKK2NsYXNzIFN0ZFR1cGxlUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OnR1cGxlIgorCisgICAgY2xhc3MgX2l0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18gKHNlbGYsIGhlYWQpOgorICAgICAgICAgICAgc2VsZi5oZWFkID0gaGVhZAorCisgICAgICAgICAgICAjIFNldCB0aGUgYmFzZSBjbGFzcyBhcyB0aGUgaW5pdGlhbCBoZWFkIG9mIHRoZQorICAgICAgICAgICAgIyB0dXBsZS4KKyAgICAgICAgICAgIG5vZGVzID0gc2VsZi5oZWFkLnR5cGUuZmllbGRzICgpCisgICAgICAgICAgICBpZiBsZW4gKG5vZGVzKSA9PSAxOgorICAgICAgICAgICAgICAgICMgU2V0IHRoZSBhY3R1YWwgaGVhZCB0byB0aGUgZmlyc3QgcGFpci4KKyAgICAgICAgICAgICAgICBzZWxmLmhlYWQgID0gc2VsZi5oZWFkLmNhc3QgKG5vZGVzWzBdLnR5cGUpCisgICAgICAgICAgICBlbGlmIGxlbiAobm9kZXMpICE9IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIlRvcCBvZiB0dXBsZSB0cmVlIGRvZXMgbm90IGNvbnNpc3Qgb2YgYSBzaW5nbGUgbm9kZS4iCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyAoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0IChzZWxmKToKKyAgICAgICAgICAgIG5vZGVzID0gc2VsZi5oZWFkLnR5cGUuZmllbGRzICgpCisgICAgICAgICAgICAjIENoZWNrIGZvciBmdXJ0aGVyIHJlY3Vyc2lvbnMgaW4gdGhlIGluaGVyaXRhbmNlIHRyZWUuCisgICAgICAgICAgICBpZiBsZW4gKG5vZGVzKSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGlzIGl0ZXJhdGlvbiBoYXMgYW4gZXhwZWN0ZWQgc3RydWN0dXJlLgorICAgICAgICAgICAgaWYgbGVuIChub2RlcykgIT0gMjoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiQ2Fubm90IHBhcnNlIG1vcmUgdGhhbiAyIG5vZGVzIGluIGEgdHVwbGUgdHJlZS4iCisKKyAgICAgICAgICAgICMgLSBMZWZ0IG5vZGUgaXMgdGhlIG5leHQgcmVjdXJzaW9uIHBhcmVudC4KKyAgICAgICAgICAgICMgLSBSaWdodCBub2RlIGlzIHRoZSBhY3R1YWwgY2xhc3MgY29udGFpbmVkIGluIHRoZSB0dXBsZS4KKworICAgICAgICAgICAgIyBQcm9jZXNzIHJpZ2h0IG5vZGUuCisgICAgICAgICAgICBpbXBsID0gc2VsZi5oZWFkLmNhc3QgKG5vZGVzWzFdLnR5cGUpCisKKyAgICAgICAgICAgICMgUHJvY2VzcyBsZWZ0IG5vZGUgYW5kIHNldCBpdCBhcyBoZWFkLgorICAgICAgICAgICAgc2VsZi5oZWFkICA9IHNlbGYuaGVhZC5jYXN0IChub2Rlc1swXS50eXBlKQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisKKyAgICAgICAgICAgICMgRmluYWxseSwgY2hlY2sgdGhlIGltcGxlbWVudGF0aW9uLiAgSWYgaXQgaXMKKyAgICAgICAgICAgICMgd3JhcHBlZCBpbiBfTV9oZWFkX2ltcGwgcmV0dXJuIHRoYXQsIG90aGVyd2lzZSByZXR1cm4KKyAgICAgICAgICAgICMgdGhlIHZhbHVlICJhcyBpcyIuCisgICAgICAgICAgICBmaWVsZHMgPSBpbXBsLnR5cGUuZmllbGRzICgpCisgICAgICAgICAgICBpZiBsZW4gKGZpZWxkcykgPCAxIG9yIGZpZWxkc1swXS5uYW1lICE9ICJfTV9oZWFkX2ltcGwiOgorICAgICAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgc2VsZi5jb3VudCwgaW1wbCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBzZWxmLmNvdW50LCBpbXBsWydfTV9oZWFkX2ltcGwnXSkKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbDsKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyYXRvciAoc2VsZi52YWwpCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgaWYgbGVuIChzZWxmLnZhbC50eXBlLmZpZWxkcyAoKSkgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAnZW1wdHkgJXMnICUgKHNlbGYudHlwZW5hbWUpCisgICAgICAgIHJldHVybiAnJXMgY29udGFpbmluZycgJSAoc2VsZi50eXBlbmFtZSkKKworY2xhc3MgU3RkU3RhY2tPclF1ZXVlUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OnN0YWNrIG9yIHN0ZDo6cXVldWUiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52aXN1YWxpemVyID0gZ2RiLmRlZmF1bHRfdmlzdWFsaXplcih2YWxbJ2MnXSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZpc3VhbGl6ZXIuY2hpbGRyZW4oKQorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHJldHVybiAnJXMgd3JhcHBpbmc6ICVzJyAlIChzZWxmLnR5cGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52aXN1YWxpemVyLnRvX3N0cmluZygpKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIgKHNlbGYudmlzdWFsaXplciwgJ2Rpc3BsYXlfaGludCcpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudmlzdWFsaXplci5kaXNwbGF5X2hpbnQgKCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworY2xhc3MgUmJ0cmVlSXRlcmF0b3I6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJidHJlZSk6CisgICAgICAgIHNlbGYuc2l6ZSA9IHJidHJlZVsnX01fdCddWydfTV9pbXBsJ11bJ19NX25vZGVfY291bnQnXQorICAgICAgICBzZWxmLm5vZGUgPSByYnRyZWVbJ19NX3QnXVsnX01faW1wbCddWydfTV9oZWFkZXInXVsnX01fbGVmdCddCisgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGludCAoc2VsZi5zaXplKQorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY291bnQgPT0gc2VsZi5zaXplOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICByZXN1bHQgPSBzZWxmLm5vZGUKKyAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgIGlmIHNlbGYuY291bnQgPCBzZWxmLnNpemU6CisgICAgICAgICAgICAjIENvbXB1dGUgdGhlIG5leHQgbm9kZS4KKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLm5vZGUKKyAgICAgICAgICAgIGlmIG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fcmlnaHQnXToKKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9yaWdodCddCisgICAgICAgICAgICAgICAgd2hpbGUgbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9sZWZ0J106CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmRlcmVmZXJlbmNlKClbJ19NX2xlZnQnXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBub2RlLmRlcmVmZXJlbmNlKClbJ19NX3BhcmVudCddCisgICAgICAgICAgICAgICAgd2hpbGUgbm9kZSA9PSBwYXJlbnQuZGVyZWZlcmVuY2UoKVsnX01fcmlnaHQnXToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZGVyZWZlcmVuY2UoKVsnX01fcGFyZW50J10KKyAgICAgICAgICAgICAgICBpZiBub2RlLmRlcmVmZXJlbmNlKClbJ19NX3JpZ2h0J10gIT0gcGFyZW50OgorICAgICAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50CisgICAgICAgICAgICBzZWxmLm5vZGUgPSBub2RlCisgICAgICAgIHJldHVybiByZXN1bHQKKworIyBUaGlzIGlzIGEgcHJldHR5IHByaW50ZXIgZm9yIHN0ZDo6X1JiX3RyZWVfaXRlcmF0b3IgKHdoaWNoIGlzCisjIHN0ZDo6bWFwOjppdGVyYXRvciksIGFuZCBoYXMgbm90aGluZyB0byBkbyB3aXRoIHRoZSBSYnRyZWVJdGVyYXRvcgorIyBjbGFzcyBhYm92ZS4KK2NsYXNzIFN0ZFJidHJlZUl0ZXJhdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgc3RkOjptYXA6Oml0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICB0eXBlbmFtZSA9IHN0cihzZWxmLnZhbC50eXBlLnN0cmlwX3R5cGVkZWZzKCkpICsgJzo6X0xpbmtfdHlwZScKKyAgICAgICAgbm9kZXR5cGUgPSBnZGIubG9va3VwX3R5cGUodHlwZW5hbWUpLnN0cmlwX3R5cGVkZWZzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsLmNhc3Qobm9kZXR5cGUpLmRlcmVmZXJlbmNlKClbJ19NX3ZhbHVlX2ZpZWxkJ10KKworY2xhc3MgU3RkRGVidWdJdGVyYXRvclByaW50ZXI6CisgICAgIlByaW50IGEgZGVidWcgZW5hYmxlZCB2ZXJzaW9uIG9mIGFuIGl0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgICMgSnVzdCBzdHJpcCBhd2F5IHRoZSBlbmNhcHN1bGF0aW5nIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcgorICAgICMgYW5kIHJldHVybiB0aGUgd3JhcHBlZCBpdGVyYXRvciB2YWx1ZS4KKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgaXR5cGUgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01fY3VycmVudCddLmNhc3QoaXR5cGUpCisKK2NsYXNzIFN0ZE1hcFByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjptYXAgb3Igc3RkOjptdWx0aW1hcCIKKworICAgICMgVHVybiBhbiBSYnRyZWVJdGVyYXRvciBpbnRvIGEgcHJldHR5LXByaW50IGl0ZXJhdG9yLgorICAgIGNsYXNzIF9pdGVyOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcmJpdGVyLCB0eXBlKToKKyAgICAgICAgICAgIHNlbGYucmJpdGVyID0gcmJpdGVyCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorICAgICAgICAgICAgc2VsZi50eXBlID0gdHlwZQorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLmNvdW50ICUgMiA9PSAwOgorICAgICAgICAgICAgICAgIG4gPSBzZWxmLnJiaXRlci5uZXh0KCkKKyAgICAgICAgICAgICAgICBuID0gbi5jYXN0KHNlbGYudHlwZSkuZGVyZWZlcmVuY2UoKVsnX01fdmFsdWVfZmllbGQnXQorICAgICAgICAgICAgICAgIHNlbGYucGFpciA9IG4KKyAgICAgICAgICAgICAgICBpdGVtID0gblsnZmlyc3QnXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpdGVtID0gc2VsZi5wYWlyWydzZWNvbmQnXQorICAgICAgICAgICAgcmVzdWx0ID0gKCdbJWRdJyAlIHNlbGYuY291bnQsIGl0ZW0pCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHJldHVybiAnJXMgd2l0aCAlZCBlbGVtZW50cycgJSAoc2VsZi50eXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKFJidHJlZUl0ZXJhdG9yIChzZWxmLnZhbCkpKQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgcmVwX3R5cGUgPSBmaW5kX3R5cGUoc2VsZi52YWwudHlwZSwgJ19SZXBfdHlwZScpCisgICAgICAgIG5vZGUgPSBmaW5kX3R5cGUocmVwX3R5cGUsICdfTGlua190eXBlJykKKyAgICAgICAgbm9kZSA9IG5vZGUuc3RyaXBfdHlwZWRlZnMoKQorICAgICAgICByZXR1cm4gc2VsZi5faXRlciAoUmJ0cmVlSXRlcmF0b3IgKHNlbGYudmFsKSwgbm9kZSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ21hcCcKKworY2xhc3MgU3RkU2V0UHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OnNldCBvciBzdGQ6Om11bHRpc2V0IgorCisgICAgIyBUdXJuIGFuIFJidHJlZUl0ZXJhdG9yIGludG8gYSBwcmV0dHktcHJpbnQgaXRlcmF0b3IuCisgICAgY2xhc3MgX2l0ZXI6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCByYml0ZXIsIHR5cGUpOgorICAgICAgICAgICAgc2VsZi5yYml0ZXIgPSByYml0ZXIKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisgICAgICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGl0ZW0gPSBzZWxmLnJiaXRlci5uZXh0KCkKKyAgICAgICAgICAgIGl0ZW0gPSBpdGVtLmNhc3Qoc2VsZi50eXBlKS5kZXJlZmVyZW5jZSgpWydfTV92YWx1ZV9maWVsZCddCisgICAgICAgICAgICAjIEZJWE1FOiB0aGlzIGlzIHdlaXJkIC4uLiB3aGF0IHRvIGRvPworICAgICAgICAgICAgIyBNYXliZSBhICdzZXQnIGRpc3BsYXkgaGludD8KKyAgICAgICAgICAgIHJlc3VsdCA9ICgnWyVkXScgJSBzZWxmLmNvdW50LCBpdGVtKQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIChSYnRyZWVJdGVyYXRvciAoc2VsZi52YWwpKSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHJlcF90eXBlID0gZmluZF90eXBlKHNlbGYudmFsLnR5cGUsICdfUmVwX3R5cGUnKQorICAgICAgICBub2RlID0gZmluZF90eXBlKHJlcF90eXBlLCAnX0xpbmtfdHlwZScpCisgICAgICAgIG5vZGUgPSBub2RlLnN0cmlwX3R5cGVkZWZzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXIgKFJidHJlZUl0ZXJhdG9yIChzZWxmLnZhbCksIG5vZGUpCisKK2NsYXNzIFN0ZEJpdHNldFByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpiaXRzZXQiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgICMgSWYgdGVtcGxhdGVfYXJndW1lbnQgaGFuZGxlZCB2YWx1ZXMsIHdlIGNvdWxkIHByaW50IHRoZQorICAgICAgICAjIHNpemUuICBPciB3ZSBjb3VsZCB1c2UgYSByZWdleHAgb24gdGhlIHR5cGUuCisgICAgICAgIHJldHVybiAnJXMnICUgKHNlbGYudHlwZW5hbWUpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICB3b3JkcyA9IHNlbGYudmFsWydfTV93J10KKyAgICAgICAgd3R5cGUgPSB3b3Jkcy50eXBlCisKKyAgICAgICAgIyBUaGUgX01fdyBtZW1iZXIgY2FuIGJlIGVpdGhlciBhbiB1bnNpZ25lZCBsb25nLCBvciBhbgorICAgICAgICAjIGFycmF5LiAgVGhpcyBkZXBlbmRzIG9uIHRoZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB1c2VkLgorICAgICAgICAjIElmIGl0IGlzIGEgc2luZ2xlIGxvbmcsIGNvbnZlcnQgdG8gYSBzaW5nbGUgZWxlbWVudCBsaXN0LgorICAgICAgICBpZiB3dHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfQVJSQVk6CisgICAgICAgICAgICB0c2l6ZSA9IHd0eXBlLnRhcmdldCAoKS5zaXplb2YKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdvcmRzID0gW3dvcmRzXQorICAgICAgICAgICAgdHNpemUgPSB3dHlwZS5zaXplb2YgCisKKyAgICAgICAgbndvcmRzID0gd3R5cGUuc2l6ZW9mIC8gdHNpemUKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgYnl0ZSA9IDAKKyAgICAgICAgd2hpbGUgYnl0ZSA8IG53b3JkczoKKyAgICAgICAgICAgIHcgPSB3b3Jkc1tieXRlXQorICAgICAgICAgICAgYml0ID0gMAorICAgICAgICAgICAgd2hpbGUgdyAhPSAwOgorICAgICAgICAgICAgICAgIGlmICh3ICYgMSkgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBBbm90aGVyIHNwb3Qgd2hlcmUgd2UgY291bGQgdXNlICdzZXQnPworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCgnWyVkXScgJSAoYnl0ZSAqIHRzaXplICogOCArIGJpdCksIDEpKQorICAgICAgICAgICAgICAgIGJpdCA9IGJpdCArIDEKKyAgICAgICAgICAgICAgICB3ID0gdyA+PiAxCisgICAgICAgICAgICBieXRlID0gYnl0ZSArIDEKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCitjbGFzcyBTdGREZXF1ZVByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpkZXF1ZSIKKworICAgIGNsYXNzIF9pdGVyOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZSwgc3RhcnQsIGVuZCwgbGFzdCwgYnVmZmVyX3NpemUpOgorICAgICAgICAgICAgc2VsZi5ub2RlID0gbm9kZQorICAgICAgICAgICAgc2VsZi5wID0gc3RhcnQKKyAgICAgICAgICAgIHNlbGYuZW5kID0gZW5kCisgICAgICAgICAgICBzZWxmLmxhc3QgPSBsYXN0CisgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemUKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYucCA9PSBzZWxmLmxhc3Q6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCisgICAgICAgICAgICByZXN1bHQgPSAoJ1slZF0nICUgc2VsZi5jb3VudCwgc2VsZi5wLmRlcmVmZXJlbmNlKCkpCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKworICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSAnY3VyJyBwb2ludGVyLgorICAgICAgICAgICAgc2VsZi5wID0gc2VsZi5wICsgMQorICAgICAgICAgICAgaWYgc2VsZi5wID09IHNlbGYuZW5kOgorICAgICAgICAgICAgICAgICMgSWYgd2UgZ290IHRvIHRoZSBlbmQgb2YgdGhpcyBidWNrZXQsIG1vdmUgdG8gdGhlCisgICAgICAgICAgICAgICAgIyBuZXh0IGJ1Y2tldC4KKyAgICAgICAgICAgICAgICBzZWxmLm5vZGUgPSBzZWxmLm5vZGUgKyAxCisgICAgICAgICAgICAgICAgc2VsZi5wID0gc2VsZi5ub2RlWzBdCisgICAgICAgICAgICAgICAgc2VsZi5lbmQgPSBzZWxmLnAgKyBzZWxmLmJ1ZmZlcl9zaXplCisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisgICAgICAgIHNlbGYuZWx0dHlwZSA9IHZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgIHNpemUgPSBzZWxmLmVsdHR5cGUuc2l6ZW9mCisgICAgICAgIGlmIHNpemUgPCA1MTI6CisgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gaW50ICg1MTIgLyBzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZSA9IDEKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIHN0YXJ0ID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fc3RhcnQnXQorICAgICAgICBlbmQgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9maW5pc2gnXQorCisgICAgICAgIGRlbHRhX24gPSBlbmRbJ19NX25vZGUnXSAtIHN0YXJ0WydfTV9ub2RlJ10gLSAxCisgICAgICAgIGRlbHRhX3MgPSBzdGFydFsnX01fbGFzdCddIC0gc3RhcnRbJ19NX2N1ciddCisgICAgICAgIGRlbHRhX2UgPSBlbmRbJ19NX2N1ciddIC0gZW5kWydfTV9maXJzdCddCisKKyAgICAgICAgc2l6ZSA9IHNlbGYuYnVmZmVyX3NpemUgKiBkZWx0YV9uICsgZGVsdGFfcyArIGRlbHRhX2UKKworICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsIGxvbmcgKHNpemUpKQorCisgICAgZGVmIGNoaWxkcmVuKHNlbGYpOgorICAgICAgICBzdGFydCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J10KKyAgICAgICAgZW5kID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ10KKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXIoc3RhcnRbJ19NX25vZGUnXSwgc3RhcnRbJ19NX2N1ciddLCBzdGFydFsnX01fbGFzdCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRbJ19NX2N1ciddLCBzZWxmLmJ1ZmZlcl9zaXplKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnYXJyYXknCisKK2NsYXNzIFN0ZERlcXVlSXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBzdGQ6OmRlcXVlOjppdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01fY3VyJ10uZGVyZWZlcmVuY2UoKQorCitjbGFzcyBTdGRTdHJpbmdQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6YmFzaWNfc3RyaW5nIG9mIHNvbWUga2luZCIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlICZzdHJpbmcgd29ya3MsIHRvby4KKyAgICAgICAgdHlwZSA9IHNlbGYudmFsLnR5cGUKKyAgICAgICAgaWYgdHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfUkVGOgorICAgICAgICAgICAgdHlwZSA9IHR5cGUudGFyZ2V0ICgpCisKKyAgICAgICAgIyBDYWxjdWxhdGUgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNvIHRoYXQgdG9fc3RyaW5nIHJldHVybnMKKyAgICAgICAgIyB0aGUgc3RyaW5nIGFjY29yZGluZyB0byBsZW5ndGgsIG5vdCBhY2NvcmRpbmcgdG8gZmlyc3QgbnVsbAorICAgICAgICAjIGVuY291bnRlcmVkLgorICAgICAgICBwdHIgPSBzZWxmLnZhbCBbJ19NX2RhdGFwbHVzJ11bJ19NX3AnXQorICAgICAgICByZWFsdHlwZSA9IHR5cGUudW5xdWFsaWZpZWQgKCkuc3RyaXBfdHlwZWRlZnMgKCkKKyAgICAgICAgcmVwdHlwZSA9IGdkYi5sb29rdXBfdHlwZSAoc3RyIChyZWFsdHlwZSkgKyAnOjpfUmVwJykucG9pbnRlciAoKQorICAgICAgICBoZWFkZXIgPSBwdHIuY2FzdChyZXB0eXBlKSAtIDEKKyAgICAgICAgbGVuID0gaGVhZGVyLmRlcmVmZXJlbmNlICgpWydfTV9sZW5ndGgnXQorICAgICAgICBpZiBoYXNhdHRyKHB0ciwgImxhenlfc3RyaW5nIik6CisgICAgICAgICAgICByZXR1cm4gcHRyLmxhenlfc3RyaW5nIChsZW5ndGggPSBsZW4pCisgICAgICAgIHJldHVybiBwdHIuc3RyaW5nIChsZW5ndGggPSBsZW4pCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdzdHJpbmcnCisKK2NsYXNzIFRyMUhhc2h0YWJsZUl0ZXJhdG9yOgorICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgaGFzaCk6CisgICAgICAgIHNlbGYubm9kZSA9IGhhc2hbJ19NX2JiZWdpbiddWydfTV9ub2RlJ11bJ19NX254dCddCisgICAgICAgIHNlbGYubm9kZV90eXBlID0gZmluZF90eXBlKGhhc2gudHlwZSwgJ19fbm9kZV90eXBlJykucG9pbnRlcigpCisKKyAgICBkZWYgX19pdGVyX18gKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQgKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm5vZGUgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgbm9kZSA9IHNlbGYubm9kZS5jYXN0KHNlbGYubm9kZV90eXBlKQorICAgICAgICByZXN1bHQgPSBub2RlLmRlcmVmZXJlbmNlKClbJ19NX3YnXQorICAgICAgICBzZWxmLm5vZGUgPSBub2RlLmRlcmVmZXJlbmNlKClbJ19NX254dCddCisgICAgICAgIHJldHVybiByZXN1bHQKKworY2xhc3MgVHIxVW5vcmRlcmVkU2V0UHJpbnRlcjoKKyAgICAiUHJpbnQgYSB0cjE6OnVub3JkZXJlZF9zZXQiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiBoYXNodGFibGUgKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnR5cGVuYW1lLnN0YXJ0c3dpdGgoJ3N0ZDo6dHIxJyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi52YWwKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9oJ10KKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsIHNlbGYuaGFzaHRhYmxlKClbJ19NX2VsZW1lbnRfY291bnQnXSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZm9ybWF0X2NvdW50IChpKToKKyAgICAgICAgcmV0dXJuICdbJWRdJyAlIGkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIGNvdW50ZXIgPSBpdGVydG9vbHMuaW1hcCAoc2VsZi5mb3JtYXRfY291bnQsIGl0ZXJ0b29scy5jb3VudCgpKQorICAgICAgICByZXR1cm4gaXRlcnRvb2xzLml6aXAgKGNvdW50ZXIsIFRyMUhhc2h0YWJsZUl0ZXJhdG9yIChzZWxmLmhhc2h0YWJsZSgpKSkKKworY2xhc3MgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcjoKKyAgICAiUHJpbnQgYSB0cjE6OnVub3JkZXJlZF9tYXAiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiBoYXNodGFibGUgKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnR5cGVuYW1lLnN0YXJ0c3dpdGgoJ3N0ZDo6dHIxJyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi52YWwKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9oJ10KKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsIHNlbGYuaGFzaHRhYmxlKClbJ19NX2VsZW1lbnRfY291bnQnXSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZmxhdHRlbiAobGlzdCk6CisgICAgICAgIGZvciBlbHQgaW4gbGlzdDoKKyAgICAgICAgICAgIGZvciBpIGluIGVsdDoKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGZvcm1hdF9vbmUgKGVsdCk6CisgICAgICAgIHJldHVybiAoZWx0WydmaXJzdCddLCBlbHRbJ3NlY29uZCddKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBmb3JtYXRfY291bnQgKGkpOgorICAgICAgICByZXR1cm4gJ1slZF0nICUgaQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgY291bnRlciA9IGl0ZXJ0b29scy5pbWFwIChzZWxmLmZvcm1hdF9jb3VudCwgaXRlcnRvb2xzLmNvdW50KCkpCisgICAgICAgICMgTWFwIG92ZXIgdGhlIGhhc2ggdGFibGUgYW5kIGZsYXR0ZW4gdGhlIHJlc3VsdC4KKyAgICAgICAgZGF0YSA9IHNlbGYuZmxhdHRlbiAoaXRlcnRvb2xzLmltYXAgKHNlbGYuZm9ybWF0X29uZSwgVHIxSGFzaHRhYmxlSXRlcmF0b3IgKHNlbGYuaGFzaHRhYmxlKCkpKSkKKyAgICAgICAgIyBaaXAgdGhlIHR3byBpdGVyYXRvcnMgdG9nZXRoZXIuCisgICAgICAgIHJldHVybiBpdGVydG9vbHMuaXppcCAoY291bnRlciwgZGF0YSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ21hcCcKKworY2xhc3MgU3RkRm9yd2FyZExpc3RQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6Zm9yd2FyZF9saXN0IgorCisgICAgY2xhc3MgX2l0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXR5cGUsIGhlYWQpOgorICAgICAgICAgICAgc2VsZi5ub2RldHlwZSA9IG5vZGV0eXBlCisgICAgICAgICAgICBzZWxmLmJhc2UgPSBoZWFkWydfTV9uZXh0J10KKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuYmFzZSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIGVsdCA9IHNlbGYuYmFzZS5jYXN0KHNlbGYubm9kZXR5cGUpLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgIHNlbGYuYmFzZSA9IGVsdFsnX01fbmV4dCddCisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgdmFscHRyID0gZWx0WydfTV9zdG9yYWdlJ10uYWRkcmVzcworICAgICAgICAgICAgdmFscHRyID0gdmFscHRyLmNhc3QoZWx0LnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMCkucG9pbnRlcigpKQorICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgdmFscHRyLmRlcmVmZXJlbmNlKCkpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorCisgICAgZGVmIGNoaWxkcmVuKHNlbGYpOgorICAgICAgICBub2RldHlwZSA9IGZpbmRfdHlwZShzZWxmLnZhbC50eXBlLCAnX05vZGUnKQorICAgICAgICBub2RldHlwZSA9IG5vZGV0eXBlLnN0cmlwX3R5cGVkZWZzKCkucG9pbnRlcigpCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyYXRvcihub2RldHlwZSwgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01faGVhZCddKQorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01faGVhZCddWydfTV9uZXh0J10gPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAnZW1wdHkgJXMnICUgKHNlbGYudHlwZW5hbWUpCisgICAgICAgIHJldHVybiAnJXMnICUgKHNlbGYudHlwZW5hbWUpCisKKworIyBBICJyZWd1bGFyIGV4cHJlc3Npb24iIHByaW50ZXIgd2hpY2ggY29uZm9ybXMgdG8gdGhlCisjICJTdWJQcmV0dHlQcmludGVyIiBwcm90b2NvbCBmcm9tIGdkYi5wcmludGluZy4KK2NsYXNzIFJ4UHJpbnRlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBmdW5jdGlvbik6CisgICAgICAgIHN1cGVyKFJ4UHJpbnRlciwgc2VsZikuX19pbml0X18oKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZnVuY3Rpb24gPSBmdW5jdGlvbgorICAgICAgICBzZWxmLmVuYWJsZWQgPSBUcnVlCisKKyAgICBkZWYgaW52b2tlKHNlbGYsIHZhbHVlKToKKyAgICAgICAgaWYgbm90IHNlbGYuZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLmZ1bmN0aW9uKHNlbGYubmFtZSwgdmFsdWUpCisKKyMgQSBwcmV0dHktcHJpbnRlciB0aGF0IGNvbmZvcm1zIHRvIHRoZSAiUHJldHR5UHJpbnRlciIgcHJvdG9jb2wgZnJvbQorIyBnZGIucHJpbnRpbmcuICBJdCBjYW4gYWxzbyBiZSB1c2VkIGRpcmVjdGx5IGFzIGFuIG9sZC1zdHlsZSBwcmludGVyLgorY2xhc3MgUHJpbnRlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgc3VwZXIoUHJpbnRlciwgc2VsZikuX19pbml0X18oKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuc3VicHJpbnRlcnMgPSBbXQorICAgICAgICBzZWxmLmxvb2t1cCA9IHt9CisgICAgICAgIHNlbGYuZW5hYmxlZCA9IFRydWUKKyAgICAgICAgc2VsZi5jb21waWxlZF9yeCA9IHJlLmNvbXBpbGUoJ14oW2EtekEtWjAtOV86XSspPC4qPiQnKQorCisgICAgZGVmIGFkZChzZWxmLCBuYW1lLCBmdW5jdGlvbik6CisgICAgICAgICMgQSBzbWFsbCBzYW5pdHkgY2hlY2suCisgICAgICAgICMgRklYTUUKKyAgICAgICAgaWYgbm90IHNlbGYuY29tcGlsZWRfcngubWF0Y2gobmFtZSArICc8PicpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ2xpYnN0ZGMrKyBwcm9ncmFtbWluZyBlcnJvcjogIiVzIiBkb2VzIG5vdCBtYXRjaCcgJSBuYW1lCisgICAgICAgIHByaW50ZXIgPSBSeFByaW50ZXIobmFtZSwgZnVuY3Rpb24pCisgICAgICAgIHNlbGYuc3VicHJpbnRlcnMuYXBwZW5kKHByaW50ZXIpCisgICAgICAgIHNlbGYubG9va3VwW25hbWVdID0gcHJpbnRlcgorCisgICAgIyBBZGQgYSBuYW1lIHVzaW5nIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OLgorICAgIGRlZiBhZGRfdmVyc2lvbihzZWxmLCBiYXNlLCBuYW1lLCBmdW5jdGlvbik6CisgICAgICAgIHNlbGYuYWRkKGJhc2UgKyBuYW1lLCBmdW5jdGlvbikKKyAgICAgICAgc2VsZi5hZGQoYmFzZSArICdfXzc6OicgKyBuYW1lLCBmdW5jdGlvbikKKworICAgICMgQWRkIGEgbmFtZSB1c2luZyBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSLgorICAgIGRlZiBhZGRfY29udGFpbmVyKHNlbGYsIGJhc2UsIG5hbWUsIGZ1bmN0aW9uKToKKyAgICAgICAgc2VsZi5hZGRfdmVyc2lvbihiYXNlLCBuYW1lLCBmdW5jdGlvbikKKyAgICAgICAgc2VsZi5hZGRfdmVyc2lvbihiYXNlICsgJ19fY3h4MTk5ODo6JywgbmFtZSwgZnVuY3Rpb24pCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGdldF9iYXNpY190eXBlKHR5cGUpOgorICAgICAgICAjIElmIGl0IHBvaW50cyB0byBhIHJlZmVyZW5jZSwgZ2V0IHRoZSByZWZlcmVuY2UuCisgICAgICAgIGlmIHR5cGUuY29kZSA9PSBnZGIuVFlQRV9DT0RFX1JFRjoKKyAgICAgICAgICAgIHR5cGUgPSB0eXBlLnRhcmdldCAoKQorCisgICAgICAgICMgR2V0IHRoZSB1bnF1YWxpZmllZCB0eXBlLCBzdHJpcHBlZCBvZiB0eXBlZGVmcy4KKyAgICAgICAgdHlwZSA9IHR5cGUudW5xdWFsaWZpZWQgKCkuc3RyaXBfdHlwZWRlZnMgKCkKKworICAgICAgICByZXR1cm4gdHlwZS50YWcKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCB2YWwpOgorICAgICAgICB0eXBlbmFtZSA9IHNlbGYuZ2V0X2Jhc2ljX3R5cGUodmFsLnR5cGUpCisgICAgICAgIGlmIG5vdCB0eXBlbmFtZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBBbGwgdGhlIHR5cGVzIHdlIG1hdGNoIGFyZSB0ZW1wbGF0ZSB0eXBlcywgc28gd2UgY2FuIHVzZSBhCisgICAgICAgICMgZGljdGlvbmFyeS4KKyAgICAgICAgbWF0Y2ggPSBzZWxmLmNvbXBpbGVkX3J4Lm1hdGNoKHR5cGVuYW1lKQorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGJhc2VuYW1lID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgaWYgYmFzZW5hbWUgaW4gc2VsZi5sb29rdXA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5sb29rdXBbYmFzZW5hbWVdLmludm9rZSh2YWwpCisKKyAgICAgICAgIyBDYW5ub3QgZmluZCBhIHByZXR0eSBwcmludGVyLiAgUmV0dXJuIE5vbmUuCisgICAgICAgIHJldHVybiBOb25lCisKK2xpYnN0ZGN4eF9wcmludGVyID0gTm9uZQorCitjbGFzcyBGaWx0ZXJpbmdUeXBlUHJpbnRlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXRjaCwgbmFtZSk6CisgICAgICAgIHNlbGYubWF0Y2ggPSBtYXRjaAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZW5hYmxlZCA9IFRydWUKKworICAgIGNsYXNzIF9yZWNvZ25pemVyKG9iamVjdCk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXRjaCwgbmFtZSk6CisgICAgICAgICAgICBzZWxmLm1hdGNoID0gbWF0Y2gKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgICAgIHNlbGYudHlwZV9vYmogPSBOb25lCisKKyAgICAgICAgZGVmIHJlY29nbml6ZShzZWxmLCB0eXBlX29iaik6CisgICAgICAgICAgICBpZiB0eXBlX29iai50YWcgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICAgICBpZiBzZWxmLnR5cGVfb2JqIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYubWF0Y2ggaW4gdHlwZV9vYmoudGFnOgorICAgICAgICAgICAgICAgICAgICAjIEZpbHRlciBkaWRuJ3QgbWF0Y2guCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnR5cGVfb2JqID0gZ2RiLmxvb2t1cF90eXBlKHNlbGYubmFtZSkuc3RyaXBfdHlwZWRlZnMoKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgc2VsZi50eXBlX29iaiA9PSB0eXBlX29iajoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGluc3RhbnRpYXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVjb2duaXplcihzZWxmLm1hdGNoLCBzZWxmLm5hbWUpCisKK2RlZiBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosIG1hdGNoLCBuYW1lKToKKyAgICBwcmludGVyID0gRmlsdGVyaW5nVHlwZVByaW50ZXIobWF0Y2gsICdzdGQ6OicgKyBuYW1lKQorICAgIGdkYi50eXBlcy5yZWdpc3Rlcl90eXBlX3ByaW50ZXIob2JqLCBwcmludGVyKQorCitkZWYgcmVnaXN0ZXJfdHlwZV9wcmludGVycyhvYmopOgorICAgIGdsb2JhbCBfdXNlX3R5cGVfcHJpbnRpbmcKKworICAgIGlmIG5vdCBfdXNlX3R5cGVfcHJpbnRpbmc6CisgICAgICAgIHJldHVybgorCisgICAgZm9yIHBmeCBpbiAoJycsICd3Jyk6CisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX3N0cmluZycsIHBmeCArICdzdHJpbmcnKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdiYXNpY19pb3MnLCBwZnggKyAnaW9zJykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnYmFzaWNfc3RyZWFtYnVmJywgcGZ4ICsgJ3N0cmVhbWJ1ZicpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX2lzdHJlYW0nLCBwZnggKyAnaXN0cmVhbScpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX29zdHJlYW0nLCBwZnggKyAnb3N0cmVhbScpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX2lvc3RyZWFtJywgcGZ4ICsgJ2lvc3RyZWFtJykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnYmFzaWNfc3RyaW5nYnVmJywgcGZ4ICsgJ3N0cmluZ2J1ZicpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX2lzdHJpbmdzdHJlYW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZ4ICsgJ2lzdHJpbmdzdHJlYW0nKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdiYXNpY19vc3RyaW5nc3RyZWFtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmeCArICdvc3RyaW5nc3RyZWFtJykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnYmFzaWNfc3RyaW5nc3RyZWFtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmeCArICdzdHJpbmdzdHJlYW0nKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdiYXNpY19maWxlYnVmJywgcGZ4ICsgJ2ZpbGVidWYnKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdiYXNpY19pZnN0cmVhbScsIHBmeCArICdpZnN0cmVhbScpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX29mc3RyZWFtJywgcGZ4ICsgJ29mc3RyZWFtJykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnYmFzaWNfZnN0cmVhbScsIHBmeCArICdmc3RyZWFtJykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnYmFzaWNfcmVnZXgnLCBwZnggKyAncmVnZXgnKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdzdWJfbWF0Y2gnLCBwZnggKyAnY3N1Yl9tYXRjaCcpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ3N1Yl9tYXRjaCcsIHBmeCArICdzc3ViX21hdGNoJykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnbWF0Y2hfcmVzdWx0cycsIHBmeCArICdjbWF0Y2gnKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdtYXRjaF9yZXN1bHRzJywgcGZ4ICsgJ3NtYXRjaCcpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ3JlZ2V4X2l0ZXJhdG9yJywgcGZ4ICsgJ2NyZWdleF9pdGVyYXRvcicpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ3JlZ2V4X2l0ZXJhdG9yJywgcGZ4ICsgJ3NyZWdleF9pdGVyYXRvcicpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ3JlZ2V4X3Rva2VuX2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmeCArICdjcmVnZXhfdG9rZW5faXRlcmF0b3InKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdyZWdleF90b2tlbl9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZnggKyAnc3JlZ2V4X3Rva2VuX2l0ZXJhdG9yJykKKworICAgICMgTm90ZSB0aGF0IHdlIGNhbid0IGhhdmUgYSBwcmludGVyIGZvciBzdGQ6OndzdHJlYW1wb3MsIGJlY2F1c2UKKyAgICAjIGl0IHNoYXJlcyB0aGUgc2FtZSB1bmRlcmx5aW5nIHR5cGUgYXMgc3RkOjpzdHJlYW1wb3MuCisgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnZnBvcycsICdzdHJlYW1wb3MnKQorICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX3N0cmluZycsICd1MTZzdHJpbmcnKQorICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX3N0cmluZycsICd1MzJzdHJpbmcnKQorCisgICAgZm9yIGR1ciBpbiAoJ25hbm9zZWNvbmRzJywgJ21pY3Jvc2Vjb25kcycsICdtaWxsaXNlY29uZHMnLAorICAgICAgICAgICAgICAgICdzZWNvbmRzJywgJ21pbnV0ZXMnLCAnaG91cnMnKToKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnZHVyYXRpb24nLCBkdXIpCisKKyAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZScsICdtaW5zdGRfcmFuZDAnKQorICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2xpbmVhcl9jb25ncnVlbnRpYWxfZW5naW5lJywgJ21pbnN0ZF9yYW5kJykKKyAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdtZXJzZW5uZV90d2lzdGVyX2VuZ2luZScsICdtdDE5OTM3JykKKyAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdtZXJzZW5uZV90d2lzdGVyX2VuZ2luZScsICdtdDE5OTM3XzY0JykKKyAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZScsICdyYW5sdXgyNF9iYXNlJykKKyAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdzdWJ0cmFjdF93aXRoX2NhcnJ5X2VuZ2luZScsICdyYW5sdXg0OF9iYXNlJykKKyAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdkaXNjYXJkX2Jsb2NrX2VuZ2luZScsICdyYW5sdXgyNCcpCisgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnZGlzY2FyZF9ibG9ja19lbmdpbmUnLCAncmFubHV4NDgnKQorICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ3NodWZmbGVfb3JkZXJfZW5naW5lJywgJ2tudXRoX2InKQorCitkZWYgcmVnaXN0ZXJfbGlic3RkY3h4X3ByaW50ZXJzIChvYmopOgorICAgICJSZWdpc3RlciBsaWJzdGRjKysgcHJldHR5LXByaW50ZXJzIHdpdGggb2JqZmlsZSBPYmouIgorCisgICAgZ2xvYmFsIF91c2VfZ2RiX3BwCisgICAgZ2xvYmFsIGxpYnN0ZGN4eF9wcmludGVyCisKKyAgICBpZiBfdXNlX2dkYl9wcDoKKyAgICAgICAgZ2RiLnByaW50aW5nLnJlZ2lzdGVyX3ByZXR0eV9wcmludGVyKG9iaiwgbGlic3RkY3h4X3ByaW50ZXIpCisgICAgZWxzZToKKyAgICAgICAgaWYgb2JqIGlzIE5vbmU6CisgICAgICAgICAgICBvYmogPSBnZGIKKyAgICAgICAgb2JqLnByZXR0eV9wcmludGVycy5hcHBlbmQobGlic3RkY3h4X3ByaW50ZXIpCisKKyAgICByZWdpc3Rlcl90eXBlX3ByaW50ZXJzKG9iaikKKworZGVmIGJ1aWxkX2xpYnN0ZGN4eF9kaWN0aW9uYXJ5ICgpOgorICAgIGdsb2JhbCBsaWJzdGRjeHhfcHJpbnRlcgorCisgICAgbGlic3RkY3h4X3ByaW50ZXIgPSBQcmludGVyKCJsaWJzdGRjKystdjYiKQorCisgICAgIyBGb3IgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX1ZFUlNJT04uCisgICAgdmVycyA9ICcoX183OjopPycKKyAgICAjIEZvciBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfQ09OVEFJTkVSLgorICAgIGNvbnRhaW5lciA9ICcoX19jeHgxOTk4OjonICsgdmVycyArICcpPycKKworICAgICMgbGlic3RkYysrIG9iamVjdHMgcmVxdWlyaW5nIHByZXR0eS1wcmludGluZy4KKyAgICAjIEluIG9yZGVyIGZyb206CisgICAgIyBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbGF0ZXN0LWRveHlnZW4vYTAxODQ3Lmh0bWwKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjonLCAnYmFzaWNfc3RyaW5nJywgU3RkU3RyaW5nUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdiaXRzZXQnLCBTdGRCaXRzZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ2RlcXVlJywgU3RkRGVxdWVQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ2xpc3QnLCBTdGRMaXN0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdtYXAnLCBTdGRNYXBQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ211bHRpbWFwJywgU3RkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdtdWx0aXNldCcsIFN0ZFNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ3ByaW9yaXR5X3F1ZXVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRTdGFja09yUXVldWVQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICdxdWV1ZScsIFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ3R1cGxlJywgU3RkVHVwbGVQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ3NldCcsIFN0ZFNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ3N0YWNrJywgU3RkU3RhY2tPclF1ZXVlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjonLCAndW5pcXVlX3B0cicsIFVuaXF1ZVBvaW50ZXJQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ3ZlY3RvcicsIFN0ZFZlY3RvclByaW50ZXIpCisgICAgIyB2ZWN0b3I8Ym9vbD4KKworICAgICMgUHJpbnRlciByZWdpc3RyYXRpb25zIGZvciBjbGFzc2VzIGNvbXBpbGVkIHdpdGggLURfR0xJQkNYWF9ERUJVRy4KKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6Yml0c2V0JywgU3RkQml0c2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6ZGVxdWUnLCBTdGREZXF1ZVByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6Omxpc3QnLCBTdGRMaXN0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6bWFwJywgU3RkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6bXVsdGltYXAnLCBTdGRNYXBQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjptdWx0aXNldCcsIFN0ZFNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnByaW9yaXR5X3F1ZXVlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkU3RhY2tPclF1ZXVlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6cXVldWUnLCBTdGRTdGFja09yUXVldWVQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjpzZXQnLCBTdGRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjpzdGFjaycsIFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnVuaXF1ZV9wdHInLCBVbmlxdWVQb2ludGVyUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6dmVjdG9yJywgU3RkVmVjdG9yUHJpbnRlcikKKworICAgICMgVGhlc2UgYXJlIHRoZSBUUjEgYW5kIEMrKzB4IHByaW50ZXJzLgorICAgICMgRm9yIGFycmF5IC0gdGhlIGRlZmF1bHQgR0RCIHByZXR0eS1wcmludGVyIHNlZW1zIHJlYXNvbmFibGUuCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ3NoYXJlZF9wdHInLCBTaGFyZWRQb2ludGVyUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjonLCAnd2Vha19wdHInLCBTaGFyZWRQb2ludGVyUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICd1bm9yZGVyZWRfbWFwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAndW5vcmRlcmVkX3NldCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ3Vub3JkZXJlZF9tdWx0aW1hcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRNYXBQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ3Vub3JkZXJlZF9tdWx0aXNldCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ2ZvcndhcmRfbGlzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRGb3J3YXJkTGlzdFByaW50ZXIpCisKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjp0cjE6OicsICdzaGFyZWRfcHRyJywgU2hhcmVkUG9pbnRlclByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6dHIxOjonLCAnd2Vha19wdHInLCBTaGFyZWRQb2ludGVyUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjp0cjE6OicsICd1bm9yZGVyZWRfbWFwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRNYXBQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OnRyMTo6JywgJ3Vub3JkZXJlZF9zZXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZFNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6dHIxOjonLCAndW5vcmRlcmVkX211bHRpbWFwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRNYXBQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OnRyMTo6JywgJ3Vub3JkZXJlZF9tdWx0aXNldCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkU2V0UHJpbnRlcikKKworICAgICMgVGhlc2UgYXJlIHRoZSBDKysweCBwcmludGVyIHJlZ2lzdHJhdGlvbnMgZm9yIC1EX0dMSUJDWFhfREVCVUcgY2FzZXMuCisgICAgIyBUaGUgdHIxIG5hbWVzcGFjZSBwcmludGVycyBkbyBub3Qgc2VlbSB0byBoYXZlIGFueSBkZWJ1ZworICAgICMgZXF1aXZhbGVudHMsIHNvIGRvIG5vIHJlZ2lzdGVyIHRoZW0uCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnVub3JkZXJlZF9tYXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRNYXBQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjp1bm9yZGVyZWRfc2V0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkU2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6dW5vcmRlcmVkX211bHRpbWFwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6dW5vcmRlcmVkX211bHRpc2V0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkU2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6Zm9yd2FyZF9saXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkRm9yd2FyZExpc3RQcmludGVyKQorCisKKyAgICAjIEV4dGVuc2lvbnMuCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ19fZ251X2N4eDo6JywgJ3NsaXN0JywgU3RkU2xpc3RQcmludGVyKQorCisgICAgaWYgVHJ1ZToKKyAgICAgICAgIyBUaGVzZSBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5LCBpZiBHREIgInByaW50ICppIiB3b3JrZWQuCisgICAgICAgICMgQnV0IGl0IG9mdGVuIGRvZXNuJ3QsIHNvIGhlcmUgdGhleSBhcmUuCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ19MaXN0X2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRMaXN0SXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdfTGlzdF9jb25zdF9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkTGlzdEl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ19SYl90cmVlX2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkUmJ0cmVlSXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjonLCAnX1JiX3RyZWVfY29uc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRSYnRyZWVJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ19EZXF1ZV9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkRGVxdWVJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ19EZXF1ZV9jb25zdF9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkRGVxdWVJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdfX2dudV9jeHg6OicsICdfX25vcm1hbF9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZFZlY3Rvckl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ19fZ251X2N4eDo6JywgJ19TbGlzdF9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZFNsaXN0SXRlcmF0b3JQcmludGVyKQorCisgICAgICAgICMgRGVidWcgKGNvbXBpbGVkIHdpdGggLURfR0xJQkNYWF9ERUJVRykgcHJpbnRlcgorICAgICAgICAjIHJlZ2lzdHJhdGlvbnMuICBUaGUgUmJfdHJlZSBkZWJ1ZyBpdGVyYXRvciB3aGVuIHVud3JhcHBlZAorICAgICAgICAjIGZyb20gdGhlIGVuY2Fwc3VsYXRpbmcgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yIGRvZXMgbm90CisgICAgICAgICMgaGF2ZSB0aGUgX19ub3JtIG5hbWVzcGFjZS4gSnVzdCB1c2UgdGhlIGV4aXN0aW5nIHByaW50ZXIKKyAgICAgICAgIyByZWdpc3RyYXRpb24gZm9yIHRoYXQuCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZERlYnVnSXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19ub3JtOjpfTGlzdF9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRMaXN0SXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19ub3JtOjpfTGlzdF9jb25zdF9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRMaXN0SXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19ub3JtOjpfRGVxdWVfY29uc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkRGVxdWVJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX25vcm06Ol9EZXF1ZV9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGREZXF1ZUl0ZXJhdG9yUHJpbnRlcikKKworYnVpbGRfbGlic3RkY3h4X2RpY3Rpb25hcnkgKCkKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0Ly5fQ09QWUlORyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0Ly5fQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDIzZmFiCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvLl9DT1BZSU5HCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0Ly5fQ2hhbmdlTG9nIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvLl9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxMTk4MAotLS0gL2Rldi9udWxsCisrKyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0Ly5fQ2hhbmdlTG9nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0Ly5fUkVBRE1FIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvLl9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2ZTQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0Ly5fUkVBRE1FCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L0NPUFlJTkcgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzI1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC9DT1BZSU5HCkBAIC0wLDAgKzEsNjc2IEBACisKKwkJICAgIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFCisJCSAgICAgICBWZXJzaW9uIDMsIDI5IEp1bmUgMjAwNworCisgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA8aHR0cDovL2ZzZi5vcmcvPgorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisJCQkgICAgUHJlYW1ibGUKKworICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgYSBmcmVlLCBjb3B5bGVmdCBsaWNlbnNlIGZvcgorc29mdHdhcmUgYW5kIG90aGVyIGtpbmRzIG9mIHdvcmtzLgorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhbmQgb3RoZXIgcHJhY3RpY2FsIHdvcmtzIGFyZSBkZXNpZ25lZAordG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIHRoZSB3b3Jrcy4gIEJ5IGNvbnRyYXN0LAordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8KK3NoYXJlIGFuZCBjaGFuZ2UgYWxsIHZlcnNpb25zIG9mIGEgcHJvZ3JhbS0tdG8gbWFrZSBzdXJlIGl0IHJlbWFpbnMgZnJlZQorc29mdHdhcmUgZm9yIGFsbCBpdHMgdXNlcnMuICBXZSwgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdXNlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vc3Qgb2Ygb3VyIHNvZnR3YXJlOyBpdCBhcHBsaWVzIGFsc28gdG8KK2FueSBvdGhlciB3b3JrIHJlbGVhc2VkIHRoaXMgd2F5IGJ5IGl0cyBhdXRob3JzLiAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoZW0gaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91Cit3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldworZnJlZSBwcm9ncmFtcywgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBwcmV2ZW50IG90aGVycyBmcm9tIGRlbnlpbmcgeW91Cit0aGVzZSByaWdodHMgb3IgYXNraW5nIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIFRoZXJlZm9yZSwgeW91IGhhdmUKK2NlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZgoreW91IG1vZGlmeSBpdDogcmVzcG9uc2liaWxpdGllcyB0byByZXNwZWN0IHRoZSBmcmVlZG9tIG9mIG90aGVycy4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBwYXNzIG9uIHRvIHRoZSByZWNpcGllbnRzIHRoZSBzYW1lCitmcmVlZG9tcyB0aGF0IHlvdSByZWNlaXZlZC4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZQorb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkKK2tub3cgdGhlaXIgcmlnaHRzLgorCisgIERldmVsb3BlcnMgdGhhdCB1c2UgdGhlIEdOVSBHUEwgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczoKKygxKSBhc3NlcnQgY29weXJpZ2h0IG9uIHRoZSBzb2Z0d2FyZSwgYW5kICgyKSBvZmZlciB5b3UgdGhpcyBMaWNlbnNlCitnaXZpbmcgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IGl0LgorCisgIEZvciB0aGUgZGV2ZWxvcGVycycgYW5kIGF1dGhvcnMnIHByb3RlY3Rpb24sIHRoZSBHUEwgY2xlYXJseSBleHBsYWlucwordGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiAgRm9yIGJvdGggdXNlcnMnIGFuZAorYXV0aG9ycycgc2FrZSwgdGhlIEdQTCByZXF1aXJlcyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIGJlIG1hcmtlZCBhcworY2hhbmdlZCwgc28gdGhhdCB0aGVpciBwcm9ibGVtcyB3aWxsIG5vdCBiZSBhdHRyaWJ1dGVkIGVycm9uZW91c2x5IHRvCithdXRob3JzIG9mIHByZXZpb3VzIHZlcnNpb25zLgorCisgIFNvbWUgZGV2aWNlcyBhcmUgZGVzaWduZWQgdG8gZGVueSB1c2VycyBhY2Nlc3MgdG8gaW5zdGFsbCBvciBydW4KK21vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBzb2Z0d2FyZSBpbnNpZGUgdGhlbSwgYWx0aG91Z2ggdGhlIG1hbnVmYWN0dXJlcgorY2FuIGRvIHNvLiAgVGhpcyBpcyBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSB3aXRoIHRoZSBhaW0gb2YKK3Byb3RlY3RpbmcgdXNlcnMnIGZyZWVkb20gdG8gY2hhbmdlIHRoZSBzb2Z0d2FyZS4gIFRoZSBzeXN0ZW1hdGljCitwYXR0ZXJuIG9mIHN1Y2ggYWJ1c2Ugb2NjdXJzIGluIHRoZSBhcmVhIG9mIHByb2R1Y3RzIGZvciBpbmRpdmlkdWFscyB0bwordXNlLCB3aGljaCBpcyBwcmVjaXNlbHkgd2hlcmUgaXQgaXMgbW9zdCB1bmFjY2VwdGFibGUuICBUaGVyZWZvcmUsIHdlCitoYXZlIGRlc2lnbmVkIHRoaXMgdmVyc2lvbiBvZiB0aGUgR1BMIHRvIHByb2hpYml0IHRoZSBwcmFjdGljZSBmb3IgdGhvc2UKK3Byb2R1Y3RzLiAgSWYgc3VjaCBwcm9ibGVtcyBhcmlzZSBzdWJzdGFudGlhbGx5IGluIG90aGVyIGRvbWFpbnMsIHdlCitzdGFuZCByZWFkeSB0byBleHRlbmQgdGhpcyBwcm92aXNpb24gdG8gdGhvc2UgZG9tYWlucyBpbiBmdXR1cmUgdmVyc2lvbnMKK29mIHRoZSBHUEwsIGFzIG5lZWRlZCB0byBwcm90ZWN0IHRoZSBmcmVlZG9tIG9mIHVzZXJzLgorCisgIEZpbmFsbHksIGV2ZXJ5IHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuCitTdGF0ZXMgc2hvdWxkIG5vdCBhbGxvdyBwYXRlbnRzIHRvIHJlc3RyaWN0IGRldmVsb3BtZW50IGFuZCB1c2Ugb2YKK3NvZnR3YXJlIG9uIGdlbmVyYWwtcHVycG9zZSBjb21wdXRlcnMsIGJ1dCBpbiB0aG9zZSB0aGF0IGRvLCB3ZSB3aXNoIHRvCithdm9pZCB0aGUgc3BlY2lhbCBkYW5nZXIgdGhhdCBwYXRlbnRzIGFwcGxpZWQgdG8gYSBmcmVlIHByb2dyYW0gY291bGQKK21ha2UgaXQgZWZmZWN0aXZlbHkgcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHRoZSBHUEwgYXNzdXJlcyB0aGF0CitwYXRlbnRzIGNhbm5vdCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgcHJvZ3JhbSBub24tZnJlZS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworCQkgICAgICAgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAwLiBEZWZpbml0aW9ucy4KKworICAiVGhpcyBMaWNlbnNlIiByZWZlcnMgdG8gdmVyc2lvbiAzIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICAiQ29weXJpZ2h0IiBhbHNvIG1lYW5zIGNvcHlyaWdodC1saWtlIGxhd3MgdGhhdCBhcHBseSB0byBvdGhlciBraW5kcyBvZgord29ya3MsIHN1Y2ggYXMgc2VtaWNvbmR1Y3RvciBtYXNrcy4KKyAKKyAgIlRoZSBQcm9ncmFtIiByZWZlcnMgdG8gYW55IGNvcHlyaWdodGFibGUgd29yayBsaWNlbnNlZCB1bmRlciB0aGlzCitMaWNlbnNlLiAgRWFjaCBsaWNlbnNlZSBpcyBhZGRyZXNzZWQgYXMgInlvdSIuICAiTGljZW5zZWVzIiBhbmQKKyJyZWNpcGllbnRzIiBtYXkgYmUgaW5kaXZpZHVhbHMgb3Igb3JnYW5pemF0aW9ucy4KKworICBUbyAibW9kaWZ5IiBhIHdvcmsgbWVhbnMgdG8gY29weSBmcm9tIG9yIGFkYXB0IGFsbCBvciBwYXJ0IG9mIHRoZSB3b3JrCitpbiBhIGZhc2hpb24gcmVxdWlyaW5nIGNvcHlyaWdodCBwZXJtaXNzaW9uLCBvdGhlciB0aGFuIHRoZSBtYWtpbmcgb2YgYW4KK2V4YWN0IGNvcHkuICBUaGUgcmVzdWx0aW5nIHdvcmsgaXMgY2FsbGVkIGEgIm1vZGlmaWVkIHZlcnNpb24iIG9mIHRoZQorZWFybGllciB3b3JrIG9yIGEgd29yayAiYmFzZWQgb24iIHRoZSBlYXJsaWVyIHdvcmsuCisKKyAgQSAiY292ZXJlZCB3b3JrIiBtZWFucyBlaXRoZXIgdGhlIHVubW9kaWZpZWQgUHJvZ3JhbSBvciBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLgorCisgIFRvICJwcm9wYWdhdGUiIGEgd29yayBtZWFucyB0byBkbyBhbnl0aGluZyB3aXRoIGl0IHRoYXQsIHdpdGhvdXQKK3Blcm1pc3Npb24sIHdvdWxkIG1ha2UgeW91IGRpcmVjdGx5IG9yIHNlY29uZGFyaWx5IGxpYWJsZSBmb3IKK2luZnJpbmdlbWVudCB1bmRlciBhcHBsaWNhYmxlIGNvcHlyaWdodCBsYXcsIGV4Y2VwdCBleGVjdXRpbmcgaXQgb24gYQorY29tcHV0ZXIgb3IgbW9kaWZ5aW5nIGEgcHJpdmF0ZSBjb3B5LiAgUHJvcGFnYXRpb24gaW5jbHVkZXMgY29weWluZywKK2Rpc3RyaWJ1dGlvbiAod2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiksIG1ha2luZyBhdmFpbGFibGUgdG8gdGhlCitwdWJsaWMsIGFuZCBpbiBzb21lIGNvdW50cmllcyBvdGhlciBhY3Rpdml0aWVzIGFzIHdlbGwuCisKKyAgVG8gImNvbnZleSIgYSB3b3JrIG1lYW5zIGFueSBraW5kIG9mIHByb3BhZ2F0aW9uIHRoYXQgZW5hYmxlcyBvdGhlcgorcGFydGllcyB0byBtYWtlIG9yIHJlY2VpdmUgY29waWVzLiAgTWVyZSBpbnRlcmFjdGlvbiB3aXRoIGEgdXNlciB0aHJvdWdoCithIGNvbXB1dGVyIG5ldHdvcmssIHdpdGggbm8gdHJhbnNmZXIgb2YgYSBjb3B5LCBpcyBub3QgY29udmV5aW5nLgorCisgIEFuIGludGVyYWN0aXZlIHVzZXIgaW50ZXJmYWNlIGRpc3BsYXlzICJBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzIgordG8gdGhlIGV4dGVudCB0aGF0IGl0IGluY2x1ZGVzIGEgY29udmVuaWVudCBhbmQgcHJvbWluZW50bHkgdmlzaWJsZQorZmVhdHVyZSB0aGF0ICgxKSBkaXNwbGF5cyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlLCBhbmQgKDIpCit0ZWxscyB0aGUgdXNlciB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGUgd29yayAoZXhjZXB0IHRvIHRoZQorZXh0ZW50IHRoYXQgd2FycmFudGllcyBhcmUgcHJvdmlkZWQpLCB0aGF0IGxpY2Vuc2VlcyBtYXkgY29udmV5IHRoZQord29yayB1bmRlciB0aGlzIExpY2Vuc2UsIGFuZCBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlLiAgSWYKK3RoZSBpbnRlcmZhY2UgcHJlc2VudHMgYSBsaXN0IG9mIHVzZXIgY29tbWFuZHMgb3Igb3B0aW9ucywgc3VjaCBhcyBhCittZW51LCBhIHByb21pbmVudCBpdGVtIGluIHRoZSBsaXN0IG1lZXRzIHRoaXMgY3JpdGVyaW9uLgorCisgIDEuIFNvdXJjZSBDb2RlLgorCisgIFRoZSAic291cmNlIGNvZGUiIGZvciBhIHdvcmsgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSB3b3JrCitmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMgdG8gaXQuICAiT2JqZWN0IGNvZGUiIG1lYW5zIGFueSBub24tc291cmNlCitmb3JtIG9mIGEgd29yay4KKworICBBICJTdGFuZGFyZCBJbnRlcmZhY2UiIG1lYW5zIGFuIGludGVyZmFjZSB0aGF0IGVpdGhlciBpcyBhbiBvZmZpY2lhbAorc3RhbmRhcmQgZGVmaW5lZCBieSBhIHJlY29nbml6ZWQgc3RhbmRhcmRzIGJvZHksIG9yLCBpbiB0aGUgY2FzZSBvZgoraW50ZXJmYWNlcyBzcGVjaWZpZWQgZm9yIGEgcGFydGljdWxhciBwcm9ncmFtbWluZyBsYW5ndWFnZSwgb25lIHRoYXQKK2lzIHdpZGVseSB1c2VkIGFtb25nIGRldmVsb3BlcnMgd29ya2luZyBpbiB0aGF0IGxhbmd1YWdlLgorCisgIFRoZSAiU3lzdGVtIExpYnJhcmllcyIgb2YgYW4gZXhlY3V0YWJsZSB3b3JrIGluY2x1ZGUgYW55dGhpbmcsIG90aGVyCit0aGFuIHRoZSB3b3JrIGFzIGEgd2hvbGUsIHRoYXQgKGEpIGlzIGluY2x1ZGVkIGluIHRoZSBub3JtYWwgZm9ybSBvZgorcGFja2FnaW5nIGEgTWFqb3IgQ29tcG9uZW50LCBidXQgd2hpY2ggaXMgbm90IHBhcnQgb2YgdGhhdCBNYWpvcgorQ29tcG9uZW50LCBhbmQgKGIpIHNlcnZlcyBvbmx5IHRvIGVuYWJsZSB1c2Ugb2YgdGhlIHdvcmsgd2l0aCB0aGF0CitNYWpvciBDb21wb25lbnQsIG9yIHRvIGltcGxlbWVudCBhIFN0YW5kYXJkIEludGVyZmFjZSBmb3Igd2hpY2ggYW4KK2ltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSB0byB0aGUgcHVibGljIGluIHNvdXJjZSBjb2RlIGZvcm0uICBBCisiTWFqb3IgQ29tcG9uZW50IiwgaW4gdGhpcyBjb250ZXh0LCBtZWFucyBhIG1ham9yIGVzc2VudGlhbCBjb21wb25lbnQKKyhrZXJuZWwsIHdpbmRvdyBzeXN0ZW0sIGFuZCBzbyBvbikgb2YgdGhlIHNwZWNpZmljIG9wZXJhdGluZyBzeXN0ZW0KKyhpZiBhbnkpIG9uIHdoaWNoIHRoZSBleGVjdXRhYmxlIHdvcmsgcnVucywgb3IgYSBjb21waWxlciB1c2VkIHRvCitwcm9kdWNlIHRoZSB3b3JrLCBvciBhbiBvYmplY3QgY29kZSBpbnRlcnByZXRlciB1c2VkIHRvIHJ1biBpdC4KKworICBUaGUgIkNvcnJlc3BvbmRpbmcgU291cmNlIiBmb3IgYSB3b3JrIGluIG9iamVjdCBjb2RlIGZvcm0gbWVhbnMgYWxsCit0aGUgc291cmNlIGNvZGUgbmVlZGVkIHRvIGdlbmVyYXRlLCBpbnN0YWxsLCBhbmQgKGZvciBhbiBleGVjdXRhYmxlCit3b3JrKSBydW4gdGhlIG9iamVjdCBjb2RlIGFuZCB0byBtb2RpZnkgdGhlIHdvcmssIGluY2x1ZGluZyBzY3JpcHRzIHRvCitjb250cm9sIHRob3NlIGFjdGl2aXRpZXMuICBIb3dldmVyLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSB3b3JrJ3MKK1N5c3RlbSBMaWJyYXJpZXMsIG9yIGdlbmVyYWwtcHVycG9zZSB0b29scyBvciBnZW5lcmFsbHkgYXZhaWxhYmxlIGZyZWUKK3Byb2dyYW1zIHdoaWNoIGFyZSB1c2VkIHVubW9kaWZpZWQgaW4gcGVyZm9ybWluZyB0aG9zZSBhY3Rpdml0aWVzIGJ1dAord2hpY2ggYXJlIG5vdCBwYXJ0IG9mIHRoZSB3b3JrLiAgRm9yIGV4YW1wbGUsIENvcnJlc3BvbmRpbmcgU291cmNlCitpbmNsdWRlcyBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcyBhc3NvY2lhdGVkIHdpdGggc291cmNlIGZpbGVzIGZvcgordGhlIHdvcmssIGFuZCB0aGUgc291cmNlIGNvZGUgZm9yIHNoYXJlZCBsaWJyYXJpZXMgYW5kIGR5bmFtaWNhbGx5CitsaW5rZWQgc3VicHJvZ3JhbXMgdGhhdCB0aGUgd29yayBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gcmVxdWlyZSwKK3N1Y2ggYXMgYnkgaW50aW1hdGUgZGF0YSBjb21tdW5pY2F0aW9uIG9yIGNvbnRyb2wgZmxvdyBiZXR3ZWVuIHRob3NlCitzdWJwcm9ncmFtcyBhbmQgb3RoZXIgcGFydHMgb2YgdGhlIHdvcmsuCisKKyAgVGhlIENvcnJlc3BvbmRpbmcgU291cmNlIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCB1c2VycworY2FuIHJlZ2VuZXJhdGUgYXV0b21hdGljYWxseSBmcm9tIG90aGVyIHBhcnRzIG9mIHRoZSBDb3JyZXNwb25kaW5nCitTb3VyY2UuCisKKyAgVGhlIENvcnJlc3BvbmRpbmcgU291cmNlIGZvciBhIHdvcmsgaW4gc291cmNlIGNvZGUgZm9ybSBpcyB0aGF0CitzYW1lIHdvcmsuCisKKyAgMi4gQmFzaWMgUGVybWlzc2lvbnMuCisKKyAgQWxsIHJpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSBhcmUgZ3JhbnRlZCBmb3IgdGhlIHRlcm0gb2YKK2NvcHlyaWdodCBvbiB0aGUgUHJvZ3JhbSwgYW5kIGFyZSBpcnJldm9jYWJsZSBwcm92aWRlZCB0aGUgc3RhdGVkCitjb25kaXRpb25zIGFyZSBtZXQuICBUaGlzIExpY2Vuc2UgZXhwbGljaXRseSBhZmZpcm1zIHlvdXIgdW5saW1pdGVkCitwZXJtaXNzaW9uIHRvIHJ1biB0aGUgdW5tb2RpZmllZCBQcm9ncmFtLiAgVGhlIG91dHB1dCBmcm9tIHJ1bm5pbmcgYQorY292ZXJlZCB3b3JrIGlzIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlIG9ubHkgaWYgdGhlIG91dHB1dCwgZ2l2ZW4gaXRzCitjb250ZW50LCBjb25zdGl0dXRlcyBhIGNvdmVyZWQgd29yay4gIFRoaXMgTGljZW5zZSBhY2tub3dsZWRnZXMgeW91cgorcmlnaHRzIG9mIGZhaXIgdXNlIG9yIG90aGVyIGVxdWl2YWxlbnQsIGFzIHByb3ZpZGVkIGJ5IGNvcHlyaWdodCBsYXcuCisKKyAgWW91IG1heSBtYWtlLCBydW4gYW5kIHByb3BhZ2F0ZSBjb3ZlcmVkIHdvcmtzIHRoYXQgeW91IGRvIG5vdAorY29udmV5LCB3aXRob3V0IGNvbmRpdGlvbnMgc28gbG9uZyBhcyB5b3VyIGxpY2Vuc2Ugb3RoZXJ3aXNlIHJlbWFpbnMKK2luIGZvcmNlLiAgWW91IG1heSBjb252ZXkgY292ZXJlZCB3b3JrcyB0byBvdGhlcnMgZm9yIHRoZSBzb2xlIHB1cnBvc2UKK29mIGhhdmluZyB0aGVtIG1ha2UgbW9kaWZpY2F0aW9ucyBleGNsdXNpdmVseSBmb3IgeW91LCBvciBwcm92aWRlIHlvdQord2l0aCBmYWNpbGl0aWVzIGZvciBydW5uaW5nIHRob3NlIHdvcmtzLCBwcm92aWRlZCB0aGF0IHlvdSBjb21wbHkgd2l0aAordGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBpbiBjb252ZXlpbmcgYWxsIG1hdGVyaWFsIGZvciB3aGljaCB5b3UgZG8KK25vdCBjb250cm9sIGNvcHlyaWdodC4gIFRob3NlIHRodXMgbWFraW5nIG9yIHJ1bm5pbmcgdGhlIGNvdmVyZWQgd29ya3MKK2ZvciB5b3UgbXVzdCBkbyBzbyBleGNsdXNpdmVseSBvbiB5b3VyIGJlaGFsZiwgdW5kZXIgeW91ciBkaXJlY3Rpb24KK2FuZCBjb250cm9sLCBvbiB0ZXJtcyB0aGF0IHByb2hpYml0IHRoZW0gZnJvbSBtYWtpbmcgYW55IGNvcGllcyBvZgoreW91ciBjb3B5cmlnaHRlZCBtYXRlcmlhbCBvdXRzaWRlIHRoZWlyIHJlbGF0aW9uc2hpcCB3aXRoIHlvdS4KKworICBDb252ZXlpbmcgdW5kZXIgYW55IG90aGVyIGNpcmN1bXN0YW5jZXMgaXMgcGVybWl0dGVkIHNvbGVseSB1bmRlcgordGhlIGNvbmRpdGlvbnMgc3RhdGVkIGJlbG93LiAgU3VibGljZW5zaW5nIGlzIG5vdCBhbGxvd2VkOyBzZWN0aW9uIDEwCittYWtlcyBpdCB1bm5lY2Vzc2FyeS4KKworICAzLiBQcm90ZWN0aW5nIFVzZXJzJyBMZWdhbCBSaWdodHMgRnJvbSBBbnRpLUNpcmN1bXZlbnRpb24gTGF3LgorCisgIE5vIGNvdmVyZWQgd29yayBzaGFsbCBiZSBkZWVtZWQgcGFydCBvZiBhbiBlZmZlY3RpdmUgdGVjaG5vbG9naWNhbAorbWVhc3VyZSB1bmRlciBhbnkgYXBwbGljYWJsZSBsYXcgZnVsZmlsbGluZyBvYmxpZ2F0aW9ucyB1bmRlciBhcnRpY2xlCisxMSBvZiB0aGUgV0lQTyBjb3B5cmlnaHQgdHJlYXR5IGFkb3B0ZWQgb24gMjAgRGVjZW1iZXIgMTk5Niwgb3IKK3NpbWlsYXIgbGF3cyBwcm9oaWJpdGluZyBvciByZXN0cmljdGluZyBjaXJjdW12ZW50aW9uIG9mIHN1Y2gKK21lYXN1cmVzLgorCisgIFdoZW4geW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgeW91IHdhaXZlIGFueSBsZWdhbCBwb3dlciB0byBmb3JiaWQKK2NpcmN1bXZlbnRpb24gb2YgdGVjaG5vbG9naWNhbCBtZWFzdXJlcyB0byB0aGUgZXh0ZW50IHN1Y2ggY2lyY3VtdmVudGlvbgoraXMgZWZmZWN0ZWQgYnkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIgdGhpcyBMaWNlbnNlIHdpdGggcmVzcGVjdCB0bwordGhlIGNvdmVyZWQgd29yaywgYW5kIHlvdSBkaXNjbGFpbSBhbnkgaW50ZW50aW9uIHRvIGxpbWl0IG9wZXJhdGlvbiBvcgorbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrIGFzIGEgbWVhbnMgb2YgZW5mb3JjaW5nLCBhZ2FpbnN0IHRoZSB3b3JrJ3MKK3VzZXJzLCB5b3VyIG9yIHRoaXJkIHBhcnRpZXMnIGxlZ2FsIHJpZ2h0cyB0byBmb3JiaWQgY2lyY3VtdmVudGlvbiBvZgordGVjaG5vbG9naWNhbCBtZWFzdXJlcy4KKworICA0LiBDb252ZXlpbmcgVmVyYmF0aW0gQ29waWVzLgorCisgIFlvdSBtYXkgY29udmV5IHZlcmJhdGltIGNvcGllcyBvZiB0aGUgUHJvZ3JhbSdzIHNvdXJjZSBjb2RlIGFzIHlvdQorcmVjZWl2ZSBpdCwgaW4gYW55IG1lZGl1bSwgcHJvdmlkZWQgdGhhdCB5b3UgY29uc3BpY3VvdXNseSBhbmQKK2FwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZTsKK2tlZXAgaW50YWN0IGFsbCBub3RpY2VzIHN0YXRpbmcgdGhhdCB0aGlzIExpY2Vuc2UgYW5kIGFueQorbm9uLXBlcm1pc3NpdmUgdGVybXMgYWRkZWQgaW4gYWNjb3JkIHdpdGggc2VjdGlvbiA3IGFwcGx5IHRvIHRoZSBjb2RlOwora2VlcCBpbnRhY3QgYWxsIG5vdGljZXMgb2YgdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbGwKK3JlY2lwaWVudHMgYSBjb3B5IG9mIHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBQcm9ncmFtLgorCisgIFlvdSBtYXkgY2hhcmdlIGFueSBwcmljZSBvciBubyBwcmljZSBmb3IgZWFjaCBjb3B5IHRoYXQgeW91IGNvbnZleSwKK2FuZCB5b3UgbWF5IG9mZmVyIHN1cHBvcnQgb3Igd2FycmFudHkgcHJvdGVjdGlvbiBmb3IgYSBmZWUuCisKKyAgNS4gQ29udmV5aW5nIE1vZGlmaWVkIFNvdXJjZSBWZXJzaW9ucy4KKworICBZb3UgbWF5IGNvbnZleSBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIG9yIHRoZSBtb2RpZmljYXRpb25zIHRvCitwcm9kdWNlIGl0IGZyb20gdGhlIFByb2dyYW0sIGluIHRoZSBmb3JtIG9mIHNvdXJjZSBjb2RlIHVuZGVyIHRoZQordGVybXMgb2Ygc2VjdGlvbiA0LCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICBhKSBUaGUgd29yayBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgbW9kaWZpZWQKKyAgICBpdCwgYW5kIGdpdmluZyBhIHJlbGV2YW50IGRhdGUuCisKKyAgICBiKSBUaGUgd29yayBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCBpdCBpcworICAgIHJlbGVhc2VkIHVuZGVyIHRoaXMgTGljZW5zZSBhbmQgYW55IGNvbmRpdGlvbnMgYWRkZWQgdW5kZXIgc2VjdGlvbgorICAgIDcuICBUaGlzIHJlcXVpcmVtZW50IG1vZGlmaWVzIHRoZSByZXF1aXJlbWVudCBpbiBzZWN0aW9uIDQgdG8KKyAgICAia2VlcCBpbnRhY3QgYWxsIG5vdGljZXMiLgorCisgICAgYykgWW91IG11c3QgbGljZW5zZSB0aGUgZW50aXJlIHdvcmssIGFzIGEgd2hvbGUsIHVuZGVyIHRoaXMKKyAgICBMaWNlbnNlIHRvIGFueW9uZSB3aG8gY29tZXMgaW50byBwb3NzZXNzaW9uIG9mIGEgY29weS4gIFRoaXMKKyAgICBMaWNlbnNlIHdpbGwgdGhlcmVmb3JlIGFwcGx5LCBhbG9uZyB3aXRoIGFueSBhcHBsaWNhYmxlIHNlY3Rpb24gNworICAgIGFkZGl0aW9uYWwgdGVybXMsIHRvIHRoZSB3aG9sZSBvZiB0aGUgd29yaywgYW5kIGFsbCBpdHMgcGFydHMsCisgICAgcmVnYXJkbGVzcyBvZiBob3cgdGhleSBhcmUgcGFja2FnZWQuICBUaGlzIExpY2Vuc2UgZ2l2ZXMgbm8KKyAgICBwZXJtaXNzaW9uIHRvIGxpY2Vuc2UgdGhlIHdvcmsgaW4gYW55IG90aGVyIHdheSwgYnV0IGl0IGRvZXMgbm90CisgICAgaW52YWxpZGF0ZSBzdWNoIHBlcm1pc3Npb24gaWYgeW91IGhhdmUgc2VwYXJhdGVseSByZWNlaXZlZCBpdC4KKworICAgIGQpIElmIHRoZSB3b3JrIGhhcyBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZXMsIGVhY2ggbXVzdCBkaXNwbGF5CisgICAgQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlczsgaG93ZXZlciwgaWYgdGhlIFByb2dyYW0gaGFzIGludGVyYWN0aXZlCisgICAgaW50ZXJmYWNlcyB0aGF0IGRvIG5vdCBkaXNwbGF5IEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXMsIHlvdXIKKyAgICB3b3JrIG5lZWQgbm90IG1ha2UgdGhlbSBkbyBzby4KKworICBBIGNvbXBpbGF0aW9uIG9mIGEgY292ZXJlZCB3b3JrIHdpdGggb3RoZXIgc2VwYXJhdGUgYW5kIGluZGVwZW5kZW50Cit3b3Jrcywgd2hpY2ggYXJlIG5vdCBieSB0aGVpciBuYXR1cmUgZXh0ZW5zaW9ucyBvZiB0aGUgY292ZXJlZCB3b3JrLAorYW5kIHdoaWNoIGFyZSBub3QgY29tYmluZWQgd2l0aCBpdCBzdWNoIGFzIHRvIGZvcm0gYSBsYXJnZXIgcHJvZ3JhbSwKK2luIG9yIG9uIGEgdm9sdW1lIG9mIGEgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtLCBpcyBjYWxsZWQgYW4KKyJhZ2dyZWdhdGUiIGlmIHRoZSBjb21waWxhdGlvbiBhbmQgaXRzIHJlc3VsdGluZyBjb3B5cmlnaHQgYXJlIG5vdAordXNlZCB0byBsaW1pdCB0aGUgYWNjZXNzIG9yIGxlZ2FsIHJpZ2h0cyBvZiB0aGUgY29tcGlsYXRpb24ncyB1c2VycworYmV5b25kIHdoYXQgdGhlIGluZGl2aWR1YWwgd29ya3MgcGVybWl0LiAgSW5jbHVzaW9uIG9mIGEgY292ZXJlZCB3b3JrCitpbiBhbiBhZ2dyZWdhdGUgZG9lcyBub3QgY2F1c2UgdGhpcyBMaWNlbnNlIHRvIGFwcGx5IHRvIHRoZSBvdGhlcgorcGFydHMgb2YgdGhlIGFnZ3JlZ2F0ZS4KKworICA2LiBDb252ZXlpbmcgTm9uLVNvdXJjZSBGb3Jtcy4KKworICBZb3UgbWF5IGNvbnZleSBhIGNvdmVyZWQgd29yayBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcworb2Ygc2VjdGlvbnMgNCBhbmQgNSwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBjb252ZXkgdGhlCittYWNoaW5lLXJlYWRhYmxlIENvcnJlc3BvbmRpbmcgU291cmNlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsCitpbiBvbmUgb2YgdGhlc2Ugd2F5czoKKworICAgIGEpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QKKyAgICAoaW5jbHVkaW5nIGEgcGh5c2ljYWwgZGlzdHJpYnV0aW9uIG1lZGl1bSksIGFjY29tcGFuaWVkIGJ5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZpeGVkIG9uIGEgZHVyYWJsZSBwaHlzaWNhbCBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZS4KKworICAgIGIpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgaW4sIG9yIGVtYm9kaWVkIGluLCBhIHBoeXNpY2FsIHByb2R1Y3QKKyAgICAoaW5jbHVkaW5nIGEgcGh5c2ljYWwgZGlzdHJpYnV0aW9uIG1lZGl1bSksIGFjY29tcGFuaWVkIGJ5IGEKKyAgICB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUgeWVhcnMgYW5kIHZhbGlkIGZvciBhcworICAgIGxvbmcgYXMgeW91IG9mZmVyIHNwYXJlIHBhcnRzIG9yIGN1c3RvbWVyIHN1cHBvcnQgZm9yIHRoYXQgcHJvZHVjdAorICAgIG1vZGVsLCB0byBnaXZlIGFueW9uZSB3aG8gcG9zc2Vzc2VzIHRoZSBvYmplY3QgY29kZSBlaXRoZXIgKDEpIGEKKyAgICBjb3B5IG9mIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYWxsIHRoZSBzb2Z0d2FyZSBpbiB0aGUKKyAgICBwcm9kdWN0IHRoYXQgaXMgY292ZXJlZCBieSB0aGlzIExpY2Vuc2UsIG9uIGEgZHVyYWJsZSBwaHlzaWNhbAorICAgIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZSwgZm9yIGEgcHJpY2Ugbm8KKyAgICBtb3JlIHRoYW4geW91ciByZWFzb25hYmxlIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHRoaXMKKyAgICBjb252ZXlpbmcgb2Ygc291cmNlLCBvciAoMikgYWNjZXNzIHRvIGNvcHkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgZnJvbSBhIG5ldHdvcmsgc2VydmVyIGF0IG5vIGNoYXJnZS4KKworICAgIGMpIENvbnZleSBpbmRpdmlkdWFsIGNvcGllcyBvZiB0aGUgb2JqZWN0IGNvZGUgd2l0aCBhIGNvcHkgb2YgdGhlCisgICAgd3JpdHRlbiBvZmZlciB0byBwcm92aWRlIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZS4gIFRoaXMKKyAgICBhbHRlcm5hdGl2ZSBpcyBhbGxvd2VkIG9ubHkgb2NjYXNpb25hbGx5IGFuZCBub25jb21tZXJjaWFsbHksIGFuZAorICAgIG9ubHkgaWYgeW91IHJlY2VpdmVkIHRoZSBvYmplY3QgY29kZSB3aXRoIHN1Y2ggYW4gb2ZmZXIsIGluIGFjY29yZAorICAgIHdpdGggc3Vic2VjdGlvbiA2Yi4KKworICAgIGQpIENvbnZleSB0aGUgb2JqZWN0IGNvZGUgYnkgb2ZmZXJpbmcgYWNjZXNzIGZyb20gYSBkZXNpZ25hdGVkCisgICAgcGxhY2UgKGdyYXRpcyBvciBmb3IgYSBjaGFyZ2UpLCBhbmQgb2ZmZXIgZXF1aXZhbGVudCBhY2Nlc3MgdG8gdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgaW4gdGhlIHNhbWUgd2F5IHRocm91Z2ggdGhlIHNhbWUgcGxhY2UgYXQgbm8KKyAgICBmdXJ0aGVyIGNoYXJnZS4gIFlvdSBuZWVkIG5vdCByZXF1aXJlIHJlY2lwaWVudHMgdG8gY29weSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBhbG9uZyB3aXRoIHRoZSBvYmplY3QgY29kZS4gIElmIHRoZSBwbGFjZSB0bworICAgIGNvcHkgdGhlIG9iamVjdCBjb2RlIGlzIGEgbmV0d29yayBzZXJ2ZXIsIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZQorICAgIG1heSBiZSBvbiBhIGRpZmZlcmVudCBzZXJ2ZXIgKG9wZXJhdGVkIGJ5IHlvdSBvciBhIHRoaXJkIHBhcnR5KQorICAgIHRoYXQgc3VwcG9ydHMgZXF1aXZhbGVudCBjb3B5aW5nIGZhY2lsaXRpZXMsIHByb3ZpZGVkIHlvdSBtYWludGFpbgorICAgIGNsZWFyIGRpcmVjdGlvbnMgbmV4dCB0byB0aGUgb2JqZWN0IGNvZGUgc2F5aW5nIHdoZXJlIHRvIGZpbmQgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBSZWdhcmRsZXNzIG9mIHdoYXQgc2VydmVyIGhvc3RzIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlLCB5b3UgcmVtYWluIG9ibGlnYXRlZCB0byBlbnN1cmUgdGhhdCBpdCBpcworICAgIGF2YWlsYWJsZSBmb3IgYXMgbG9uZyBhcyBuZWVkZWQgdG8gc2F0aXNmeSB0aGVzZSByZXF1aXJlbWVudHMuCisKKyAgICBlKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIHVzaW5nIHBlZXItdG8tcGVlciB0cmFuc21pc3Npb24sIHByb3ZpZGVkCisgICAgeW91IGluZm9ybSBvdGhlciBwZWVycyB3aGVyZSB0aGUgb2JqZWN0IGNvZGUgYW5kIENvcnJlc3BvbmRpbmcKKyAgICBTb3VyY2Ugb2YgdGhlIHdvcmsgYXJlIGJlaW5nIG9mZmVyZWQgdG8gdGhlIGdlbmVyYWwgcHVibGljIGF0IG5vCisgICAgY2hhcmdlIHVuZGVyIHN1YnNlY3Rpb24gNmQuCisKKyAgQSBzZXBhcmFibGUgcG9ydGlvbiBvZiB0aGUgb2JqZWN0IGNvZGUsIHdob3NlIHNvdXJjZSBjb2RlIGlzIGV4Y2x1ZGVkCitmcm9tIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBhcyBhIFN5c3RlbSBMaWJyYXJ5LCBuZWVkIG5vdCBiZQoraW5jbHVkZWQgaW4gY29udmV5aW5nIHRoZSBvYmplY3QgY29kZSB3b3JrLgorCisgIEEgIlVzZXIgUHJvZHVjdCIgaXMgZWl0aGVyICgxKSBhICJjb25zdW1lciBwcm9kdWN0Iiwgd2hpY2ggbWVhbnMgYW55Cit0YW5naWJsZSBwZXJzb25hbCBwcm9wZXJ0eSB3aGljaCBpcyBub3JtYWxseSB1c2VkIGZvciBwZXJzb25hbCwgZmFtaWx5LAorb3IgaG91c2Vob2xkIHB1cnBvc2VzLCBvciAoMikgYW55dGhpbmcgZGVzaWduZWQgb3Igc29sZCBmb3IgaW5jb3Jwb3JhdGlvbgoraW50byBhIGR3ZWxsaW5nLiAgSW4gZGV0ZXJtaW5pbmcgd2hldGhlciBhIHByb2R1Y3QgaXMgYSBjb25zdW1lciBwcm9kdWN0LAorZG91YnRmdWwgY2FzZXMgc2hhbGwgYmUgcmVzb2x2ZWQgaW4gZmF2b3Igb2YgY292ZXJhZ2UuICBGb3IgYSBwYXJ0aWN1bGFyCitwcm9kdWN0IHJlY2VpdmVkIGJ5IGEgcGFydGljdWxhciB1c2VyLCAibm9ybWFsbHkgdXNlZCIgcmVmZXJzIHRvIGEKK3R5cGljYWwgb3IgY29tbW9uIHVzZSBvZiB0aGF0IGNsYXNzIG9mIHByb2R1Y3QsIHJlZ2FyZGxlc3Mgb2YgdGhlIHN0YXR1cworb2YgdGhlIHBhcnRpY3VsYXIgdXNlciBvciBvZiB0aGUgd2F5IGluIHdoaWNoIHRoZSBwYXJ0aWN1bGFyIHVzZXIKK2FjdHVhbGx5IHVzZXMsIG9yIGV4cGVjdHMgb3IgaXMgZXhwZWN0ZWQgdG8gdXNlLCB0aGUgcHJvZHVjdC4gIEEgcHJvZHVjdAoraXMgYSBjb25zdW1lciBwcm9kdWN0IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcHJvZHVjdCBoYXMgc3Vic3RhbnRpYWwKK2NvbW1lcmNpYWwsIGluZHVzdHJpYWwgb3Igbm9uLWNvbnN1bWVyIHVzZXMsIHVubGVzcyBzdWNoIHVzZXMgcmVwcmVzZW50Cit0aGUgb25seSBzaWduaWZpY2FudCBtb2RlIG9mIHVzZSBvZiB0aGUgcHJvZHVjdC4KKworICAiSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIiBmb3IgYSBVc2VyIFByb2R1Y3QgbWVhbnMgYW55IG1ldGhvZHMsCitwcm9jZWR1cmVzLCBhdXRob3JpemF0aW9uIGtleXMsIG9yIG90aGVyIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGluc3RhbGwKK2FuZCBleGVjdXRlIG1vZGlmaWVkIHZlcnNpb25zIG9mIGEgY292ZXJlZCB3b3JrIGluIHRoYXQgVXNlciBQcm9kdWN0IGZyb20KK2EgbW9kaWZpZWQgdmVyc2lvbiBvZiBpdHMgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBUaGUgaW5mb3JtYXRpb24gbXVzdAorc3VmZmljZSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGludWVkIGZ1bmN0aW9uaW5nIG9mIHRoZSBtb2RpZmllZCBvYmplY3QKK2NvZGUgaXMgaW4gbm8gY2FzZSBwcmV2ZW50ZWQgb3IgaW50ZXJmZXJlZCB3aXRoIHNvbGVseSBiZWNhdXNlCittb2RpZmljYXRpb24gaGFzIGJlZW4gbWFkZS4KKworICBJZiB5b3UgY29udmV5IGFuIG9iamVjdCBjb2RlIHdvcmsgdW5kZXIgdGhpcyBzZWN0aW9uIGluLCBvciB3aXRoLCBvcgorc3BlY2lmaWNhbGx5IGZvciB1c2UgaW4sIGEgVXNlciBQcm9kdWN0LCBhbmQgdGhlIGNvbnZleWluZyBvY2N1cnMgYXMKK3BhcnQgb2YgYSB0cmFuc2FjdGlvbiBpbiB3aGljaCB0aGUgcmlnaHQgb2YgcG9zc2Vzc2lvbiBhbmQgdXNlIG9mIHRoZQorVXNlciBQcm9kdWN0IGlzIHRyYW5zZmVycmVkIHRvIHRoZSByZWNpcGllbnQgaW4gcGVycGV0dWl0eSBvciBmb3IgYQorZml4ZWQgdGVybSAocmVnYXJkbGVzcyBvZiBob3cgdGhlIHRyYW5zYWN0aW9uIGlzIGNoYXJhY3Rlcml6ZWQpLCB0aGUKK0NvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkIHVuZGVyIHRoaXMgc2VjdGlvbiBtdXN0IGJlIGFjY29tcGFuaWVkCitieSB0aGUgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uLiAgQnV0IHRoaXMgcmVxdWlyZW1lbnQgZG9lcyBub3QgYXBwbHkKK2lmIG5laXRoZXIgeW91IG5vciBhbnkgdGhpcmQgcGFydHkgcmV0YWlucyB0aGUgYWJpbGl0eSB0byBpbnN0YWxsCittb2RpZmllZCBvYmplY3QgY29kZSBvbiB0aGUgVXNlciBQcm9kdWN0IChmb3IgZXhhbXBsZSwgdGhlIHdvcmsgaGFzCitiZWVuIGluc3RhbGxlZCBpbiBST00pLgorCisgIFRoZSByZXF1aXJlbWVudCB0byBwcm92aWRlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiBkb2VzIG5vdCBpbmNsdWRlIGEKK3JlcXVpcmVtZW50IHRvIGNvbnRpbnVlIHRvIHByb3ZpZGUgc3VwcG9ydCBzZXJ2aWNlLCB3YXJyYW50eSwgb3IgdXBkYXRlcworZm9yIGEgd29yayB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGluc3RhbGxlZCBieSB0aGUgcmVjaXBpZW50LCBvciBmb3IKK3RoZSBVc2VyIFByb2R1Y3QgaW4gd2hpY2ggaXQgaGFzIGJlZW4gbW9kaWZpZWQgb3IgaW5zdGFsbGVkLiAgQWNjZXNzIHRvIGEKK25ldHdvcmsgbWF5IGJlIGRlbmllZCB3aGVuIHRoZSBtb2RpZmljYXRpb24gaXRzZWxmIG1hdGVyaWFsbHkgYW5kCithZHZlcnNlbHkgYWZmZWN0cyB0aGUgb3BlcmF0aW9uIG9mIHRoZSBuZXR3b3JrIG9yIHZpb2xhdGVzIHRoZSBydWxlcyBhbmQKK3Byb3RvY29scyBmb3IgY29tbXVuaWNhdGlvbiBhY3Jvc3MgdGhlIG5ldHdvcmsuCisKKyAgQ29ycmVzcG9uZGluZyBTb3VyY2UgY29udmV5ZWQsIGFuZCBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gcHJvdmlkZWQsCitpbiBhY2NvcmQgd2l0aCB0aGlzIHNlY3Rpb24gbXVzdCBiZSBpbiBhIGZvcm1hdCB0aGF0IGlzIHB1YmxpY2x5Citkb2N1bWVudGVkIChhbmQgd2l0aCBhbiBpbXBsZW1lbnRhdGlvbiBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbgorc291cmNlIGNvZGUgZm9ybSksIGFuZCBtdXN0IHJlcXVpcmUgbm8gc3BlY2lhbCBwYXNzd29yZCBvciBrZXkgZm9yCit1bnBhY2tpbmcsIHJlYWRpbmcgb3IgY29weWluZy4KKworICA3LiBBZGRpdGlvbmFsIFRlcm1zLgorCisgICJBZGRpdGlvbmFsIHBlcm1pc3Npb25zIiBhcmUgdGVybXMgdGhhdCBzdXBwbGVtZW50IHRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlIGJ5IG1ha2luZyBleGNlcHRpb25zIGZyb20gb25lIG9yIG1vcmUgb2YgaXRzIGNvbmRpdGlvbnMuCitBZGRpdGlvbmFsIHBlcm1pc3Npb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhlIGVudGlyZSBQcm9ncmFtIHNoYWxsCitiZSB0cmVhdGVkIGFzIHRob3VnaCB0aGV5IHdlcmUgaW5jbHVkZWQgaW4gdGhpcyBMaWNlbnNlLCB0byB0aGUgZXh0ZW50Cit0aGF0IHRoZXkgYXJlIHZhbGlkIHVuZGVyIGFwcGxpY2FibGUgbGF3LiAgSWYgYWRkaXRpb25hbCBwZXJtaXNzaW9ucworYXBwbHkgb25seSB0byBwYXJ0IG9mIHRoZSBQcm9ncmFtLCB0aGF0IHBhcnQgbWF5IGJlIHVzZWQgc2VwYXJhdGVseQordW5kZXIgdGhvc2UgcGVybWlzc2lvbnMsIGJ1dCB0aGUgZW50aXJlIFByb2dyYW0gcmVtYWlucyBnb3Zlcm5lZCBieQordGhpcyBMaWNlbnNlIHdpdGhvdXQgcmVnYXJkIHRvIHRoZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorCisgIFdoZW4geW91IGNvbnZleSBhIGNvcHkgb2YgYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgYXQgeW91ciBvcHRpb24KK3JlbW92ZSBhbnkgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBmcm9tIHRoYXQgY29weSwgb3IgZnJvbSBhbnkgcGFydCBvZgoraXQuICAoQWRkaXRpb25hbCBwZXJtaXNzaW9ucyBtYXkgYmUgd3JpdHRlbiB0byByZXF1aXJlIHRoZWlyIG93bgorcmVtb3ZhbCBpbiBjZXJ0YWluIGNhc2VzIHdoZW4geW91IG1vZGlmeSB0aGUgd29yay4pICBZb3UgbWF5IHBsYWNlCithZGRpdGlvbmFsIHBlcm1pc3Npb25zIG9uIG1hdGVyaWFsLCBhZGRlZCBieSB5b3UgdG8gYSBjb3ZlcmVkIHdvcmssCitmb3Igd2hpY2ggeW91IGhhdmUgb3IgY2FuIGdpdmUgYXBwcm9wcmlhdGUgY29weXJpZ2h0IHBlcm1pc3Npb24uCisKKyAgTm90d2l0aHN0YW5kaW5nIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLCBmb3IgbWF0ZXJpYWwgeW91CithZGQgdG8gYSBjb3ZlcmVkIHdvcmssIHlvdSBtYXkgKGlmIGF1dGhvcml6ZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIG9mCit0aGF0IG1hdGVyaWFsKSBzdXBwbGVtZW50IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2Ugd2l0aCB0ZXJtczoKKworICAgIGEpIERpc2NsYWltaW5nIHdhcnJhbnR5IG9yIGxpbWl0aW5nIGxpYWJpbGl0eSBkaWZmZXJlbnRseSBmcm9tIHRoZQorICAgIHRlcm1zIG9mIHNlY3Rpb25zIDE1IGFuZCAxNiBvZiB0aGlzIExpY2Vuc2U7IG9yCisKKyAgICBiKSBSZXF1aXJpbmcgcHJlc2VydmF0aW9uIG9mIHNwZWNpZmllZCByZWFzb25hYmxlIGxlZ2FsIG5vdGljZXMgb3IKKyAgICBhdXRob3IgYXR0cmlidXRpb25zIGluIHRoYXQgbWF0ZXJpYWwgb3IgaW4gdGhlIEFwcHJvcHJpYXRlIExlZ2FsCisgICAgTm90aWNlcyBkaXNwbGF5ZWQgYnkgd29ya3MgY29udGFpbmluZyBpdDsgb3IKKworICAgIGMpIFByb2hpYml0aW5nIG1pc3JlcHJlc2VudGF0aW9uIG9mIHRoZSBvcmlnaW4gb2YgdGhhdCBtYXRlcmlhbCwgb3IKKyAgICByZXF1aXJpbmcgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBvZiBzdWNoIG1hdGVyaWFsIGJlIG1hcmtlZCBpbgorICAgIHJlYXNvbmFibGUgd2F5cyBhcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgdmVyc2lvbjsgb3IKKworICAgIGQpIExpbWl0aW5nIHRoZSB1c2UgZm9yIHB1YmxpY2l0eSBwdXJwb3NlcyBvZiBuYW1lcyBvZiBsaWNlbnNvcnMgb3IKKyAgICBhdXRob3JzIG9mIHRoZSBtYXRlcmlhbDsgb3IKKworICAgIGUpIERlY2xpbmluZyB0byBncmFudCByaWdodHMgdW5kZXIgdHJhZGVtYXJrIGxhdyBmb3IgdXNlIG9mIHNvbWUKKyAgICB0cmFkZSBuYW1lcywgdHJhZGVtYXJrcywgb3Igc2VydmljZSBtYXJrczsgb3IKKworICAgIGYpIFJlcXVpcmluZyBpbmRlbW5pZmljYXRpb24gb2YgbGljZW5zb3JzIGFuZCBhdXRob3JzIG9mIHRoYXQKKyAgICBtYXRlcmlhbCBieSBhbnlvbmUgd2hvIGNvbnZleXMgdGhlIG1hdGVyaWFsIChvciBtb2RpZmllZCB2ZXJzaW9ucyBvZgorICAgIGl0KSB3aXRoIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIG9mIGxpYWJpbGl0eSB0byB0aGUgcmVjaXBpZW50LCBmb3IKKyAgICBhbnkgbGlhYmlsaXR5IHRoYXQgdGhlc2UgY29udHJhY3R1YWwgYXNzdW1wdGlvbnMgZGlyZWN0bHkgaW1wb3NlIG9uCisgICAgdGhvc2UgbGljZW5zb3JzIGFuZCBhdXRob3JzLgorCisgIEFsbCBvdGhlciBub24tcGVybWlzc2l2ZSBhZGRpdGlvbmFsIHRlcm1zIGFyZSBjb25zaWRlcmVkICJmdXJ0aGVyCityZXN0cmljdGlvbnMiIHdpdGhpbiB0aGUgbWVhbmluZyBvZiBzZWN0aW9uIDEwLiAgSWYgdGhlIFByb2dyYW0gYXMgeW91CityZWNlaXZlZCBpdCwgb3IgYW55IHBhcnQgb2YgaXQsIGNvbnRhaW5zIGEgbm90aWNlIHN0YXRpbmcgdGhhdCBpdCBpcworZ292ZXJuZWQgYnkgdGhpcyBMaWNlbnNlIGFsb25nIHdpdGggYSB0ZXJtIHRoYXQgaXMgYSBmdXJ0aGVyCityZXN0cmljdGlvbiwgeW91IG1heSByZW1vdmUgdGhhdCB0ZXJtLiAgSWYgYSBsaWNlbnNlIGRvY3VtZW50IGNvbnRhaW5zCithIGZ1cnRoZXIgcmVzdHJpY3Rpb24gYnV0IHBlcm1pdHMgcmVsaWNlbnNpbmcgb3IgY29udmV5aW5nIHVuZGVyIHRoaXMKK0xpY2Vuc2UsIHlvdSBtYXkgYWRkIHRvIGEgY292ZXJlZCB3b3JrIG1hdGVyaWFsIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcworb2YgdGhhdCBsaWNlbnNlIGRvY3VtZW50LCBwcm92aWRlZCB0aGF0IHRoZSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGRvZXMKK25vdCBzdXJ2aXZlIHN1Y2ggcmVsaWNlbnNpbmcgb3IgY29udmV5aW5nLgorCisgIElmIHlvdSBhZGQgdGVybXMgdG8gYSBjb3ZlcmVkIHdvcmsgaW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uLCB5b3UKK211c3QgcGxhY2UsIGluIHRoZSByZWxldmFudCBzb3VyY2UgZmlsZXMsIGEgc3RhdGVtZW50IG9mIHRoZQorYWRkaXRpb25hbCB0ZXJtcyB0aGF0IGFwcGx5IHRvIHRob3NlIGZpbGVzLCBvciBhIG5vdGljZSBpbmRpY2F0aW5nCit3aGVyZSB0byBmaW5kIHRoZSBhcHBsaWNhYmxlIHRlcm1zLgorCisgIEFkZGl0aW9uYWwgdGVybXMsIHBlcm1pc3NpdmUgb3Igbm9uLXBlcm1pc3NpdmUsIG1heSBiZSBzdGF0ZWQgaW4gdGhlCitmb3JtIG9mIGEgc2VwYXJhdGVseSB3cml0dGVuIGxpY2Vuc2UsIG9yIHN0YXRlZCBhcyBleGNlcHRpb25zOwordGhlIGFib3ZlIHJlcXVpcmVtZW50cyBhcHBseSBlaXRoZXIgd2F5LgorCisgIDguIFRlcm1pbmF0aW9uLgorCisgIFlvdSBtYXkgbm90IHByb3BhZ2F0ZSBvciBtb2RpZnkgYSBjb3ZlcmVkIHdvcmsgZXhjZXB0IGFzIGV4cHJlc3NseQorcHJvdmlkZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgQW55IGF0dGVtcHQgb3RoZXJ3aXNlIHRvIHByb3BhZ2F0ZSBvcgorbW9kaWZ5IGl0IGlzIHZvaWQsIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHlvdXIgcmlnaHRzIHVuZGVyCit0aGlzIExpY2Vuc2UgKGluY2x1ZGluZyBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgdW5kZXIgdGhlIHRoaXJkCitwYXJhZ3JhcGggb2Ygc2VjdGlvbiAxMSkuCisKKyAgSG93ZXZlciwgaWYgeW91IGNlYXNlIGFsbCB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlLCB0aGVuIHlvdXIKK2xpY2Vuc2UgZnJvbSBhIHBhcnRpY3VsYXIgY29weXJpZ2h0IGhvbGRlciBpcyByZWluc3RhdGVkIChhKQorcHJvdmlzaW9uYWxseSwgdW5sZXNzIGFuZCB1bnRpbCB0aGUgY29weXJpZ2h0IGhvbGRlciBleHBsaWNpdGx5IGFuZAorZmluYWxseSB0ZXJtaW5hdGVzIHlvdXIgbGljZW5zZSwgYW5kIChiKSBwZXJtYW5lbnRseSwgaWYgdGhlIGNvcHlyaWdodAoraG9sZGVyIGZhaWxzIHRvIG5vdGlmeSB5b3Ugb2YgdGhlIHZpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMKK3ByaW9yIHRvIDYwIGRheXMgYWZ0ZXIgdGhlIGNlc3NhdGlvbi4KKworICBNb3Jlb3ZlciwgeW91ciBsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMKK3JlaW5zdGF0ZWQgcGVybWFuZW50bHkgaWYgdGhlIGNvcHlyaWdodCBob2xkZXIgbm90aWZpZXMgeW91IG9mIHRoZQordmlvbGF0aW9uIGJ5IHNvbWUgcmVhc29uYWJsZSBtZWFucywgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB5b3UgaGF2ZQorcmVjZWl2ZWQgbm90aWNlIG9mIHZpb2xhdGlvbiBvZiB0aGlzIExpY2Vuc2UgKGZvciBhbnkgd29yaykgZnJvbSB0aGF0Citjb3B5cmlnaHQgaG9sZGVyLCBhbmQgeW91IGN1cmUgdGhlIHZpb2xhdGlvbiBwcmlvciB0byAzMCBkYXlzIGFmdGVyCit5b3VyIHJlY2VpcHQgb2YgdGhlIG5vdGljZS4KKworICBUZXJtaW5hdGlvbiBvZiB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIHNlY3Rpb24gZG9lcyBub3QgdGVybWluYXRlIHRoZQorbGljZW5zZXMgb2YgcGFydGllcyB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMgb3IgcmlnaHRzIGZyb20geW91IHVuZGVyCit0aGlzIExpY2Vuc2UuICBJZiB5b3VyIHJpZ2h0cyBoYXZlIGJlZW4gdGVybWluYXRlZCBhbmQgbm90IHBlcm1hbmVudGx5CityZWluc3RhdGVkLCB5b3UgZG8gbm90IHF1YWxpZnkgdG8gcmVjZWl2ZSBuZXcgbGljZW5zZXMgZm9yIHRoZSBzYW1lCittYXRlcmlhbCB1bmRlciBzZWN0aW9uIDEwLgorCisgIDkuIEFjY2VwdGFuY2UgTm90IFJlcXVpcmVkIGZvciBIYXZpbmcgQ29waWVzLgorCisgIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UgaW4gb3JkZXIgdG8gcmVjZWl2ZSBvcgorcnVuIGEgY29weSBvZiB0aGUgUHJvZ3JhbS4gIEFuY2lsbGFyeSBwcm9wYWdhdGlvbiBvZiBhIGNvdmVyZWQgd29yaworb2NjdXJyaW5nIHNvbGVseSBhcyBhIGNvbnNlcXVlbmNlIG9mIHVzaW5nIHBlZXItdG8tcGVlciB0cmFuc21pc3Npb24KK3RvIHJlY2VpdmUgYSBjb3B5IGxpa2V3aXNlIGRvZXMgbm90IHJlcXVpcmUgYWNjZXB0YW5jZS4gIEhvd2V2ZXIsCitub3RoaW5nIG90aGVyIHRoYW4gdGhpcyBMaWNlbnNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBwcm9wYWdhdGUgb3IKK21vZGlmeSBhbnkgY292ZXJlZCB3b3JrLiAgVGhlc2UgYWN0aW9ucyBpbmZyaW5nZSBjb3B5cmlnaHQgaWYgeW91IGRvCitub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkgbW9kaWZ5aW5nIG9yIHByb3BhZ2F0aW5nIGEKK2NvdmVyZWQgd29yaywgeW91IGluZGljYXRlIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGlzIExpY2Vuc2UgdG8gZG8gc28uCisKKyAgMTAuIEF1dG9tYXRpYyBMaWNlbnNpbmcgb2YgRG93bnN0cmVhbSBSZWNpcGllbnRzLgorCisgIEVhY2ggdGltZSB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkKK3JlY2VpdmVzIGEgbGljZW5zZSBmcm9tIHRoZSBvcmlnaW5hbCBsaWNlbnNvcnMsIHRvIHJ1biwgbW9kaWZ5IGFuZAorcHJvcGFnYXRlIHRoYXQgd29yaywgc3ViamVjdCB0byB0aGlzIExpY2Vuc2UuICBZb3UgYXJlIG5vdCByZXNwb25zaWJsZQorZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgd2l0aCB0aGlzIExpY2Vuc2UuCisKKyAgQW4gImVudGl0eSB0cmFuc2FjdGlvbiIgaXMgYSB0cmFuc2FjdGlvbiB0cmFuc2ZlcnJpbmcgY29udHJvbCBvZiBhbgorb3JnYW5pemF0aW9uLCBvciBzdWJzdGFudGlhbGx5IGFsbCBhc3NldHMgb2Ygb25lLCBvciBzdWJkaXZpZGluZyBhbgorb3JnYW5pemF0aW9uLCBvciBtZXJnaW5nIG9yZ2FuaXphdGlvbnMuICBJZiBwcm9wYWdhdGlvbiBvZiBhIGNvdmVyZWQKK3dvcmsgcmVzdWx0cyBmcm9tIGFuIGVudGl0eSB0cmFuc2FjdGlvbiwgZWFjaCBwYXJ0eSB0byB0aGF0Cit0cmFuc2FjdGlvbiB3aG8gcmVjZWl2ZXMgYSBjb3B5IG9mIHRoZSB3b3JrIGFsc28gcmVjZWl2ZXMgd2hhdGV2ZXIKK2xpY2Vuc2VzIHRvIHRoZSB3b3JrIHRoZSBwYXJ0eSdzIHByZWRlY2Vzc29yIGluIGludGVyZXN0IGhhZCBvciBjb3VsZAorZ2l2ZSB1bmRlciB0aGUgcHJldmlvdXMgcGFyYWdyYXBoLCBwbHVzIGEgcmlnaHQgdG8gcG9zc2Vzc2lvbiBvZiB0aGUKK0NvcnJlc3BvbmRpbmcgU291cmNlIG9mIHRoZSB3b3JrIGZyb20gdGhlIHByZWRlY2Vzc29yIGluIGludGVyZXN0LCBpZgordGhlIHByZWRlY2Vzc29yIGhhcyBpdCBvciBjYW4gZ2V0IGl0IHdpdGggcmVhc29uYWJsZSBlZmZvcnRzLgorCisgIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlciByZXN0cmljdGlvbnMgb24gdGhlIGV4ZXJjaXNlIG9mIHRoZQorcmlnaHRzIGdyYW50ZWQgb3IgYWZmaXJtZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgRm9yIGV4YW1wbGUsIHlvdSBtYXkKK25vdCBpbXBvc2UgYSBsaWNlbnNlIGZlZSwgcm95YWx0eSwgb3Igb3RoZXIgY2hhcmdlIGZvciBleGVyY2lzZSBvZgorcmlnaHRzIGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLCBhbmQgeW91IG1heSBub3QgaW5pdGlhdGUgbGl0aWdhdGlvbgorKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQKK2FueSBwYXRlbnQgY2xhaW0gaXMgaW5mcmluZ2VkIGJ5IG1ha2luZywgdXNpbmcsIHNlbGxpbmcsIG9mZmVyaW5nIGZvcgorc2FsZSwgb3IgaW1wb3J0aW5nIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uIG9mIGl0LgorCisgIDExLiBQYXRlbnRzLgorCisgIEEgImNvbnRyaWJ1dG9yIiBpcyBhIGNvcHlyaWdodCBob2xkZXIgd2hvIGF1dGhvcml6ZXMgdXNlIHVuZGVyIHRoaXMKK0xpY2Vuc2Ugb2YgdGhlIFByb2dyYW0gb3IgYSB3b3JrIG9uIHdoaWNoIHRoZSBQcm9ncmFtIGlzIGJhc2VkLiAgVGhlCit3b3JrIHRodXMgbGljZW5zZWQgaXMgY2FsbGVkIHRoZSBjb250cmlidXRvcidzICJjb250cmlidXRvciB2ZXJzaW9uIi4KKworICBBIGNvbnRyaWJ1dG9yJ3MgImVzc2VudGlhbCBwYXRlbnQgY2xhaW1zIiBhcmUgYWxsIHBhdGVudCBjbGFpbXMKK293bmVkIG9yIGNvbnRyb2xsZWQgYnkgdGhlIGNvbnRyaWJ1dG9yLCB3aGV0aGVyIGFscmVhZHkgYWNxdWlyZWQgb3IKK2hlcmVhZnRlciBhY3F1aXJlZCwgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgYnkgc29tZSBtYW5uZXIsIHBlcm1pdHRlZAorYnkgdGhpcyBMaWNlbnNlLCBvZiBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nIGl0cyBjb250cmlidXRvciB2ZXJzaW9uLAorYnV0IGRvIG5vdCBpbmNsdWRlIGNsYWltcyB0aGF0IHdvdWxkIGJlIGluZnJpbmdlZCBvbmx5IGFzIGEKK2NvbnNlcXVlbmNlIG9mIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb250cmlidXRvciB2ZXJzaW9uLiAgRm9yCitwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJjb250cm9sIiBpbmNsdWRlcyB0aGUgcmlnaHQgdG8gZ3JhbnQKK3BhdGVudCBzdWJsaWNlbnNlcyBpbiBhIG1hbm5lciBjb25zaXN0ZW50IHdpdGggdGhlIHJlcXVpcmVtZW50cyBvZgordGhpcyBMaWNlbnNlLgorCisgIEVhY2ggY29udHJpYnV0b3IgZ3JhbnRzIHlvdSBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlCitwYXRlbnQgbGljZW5zZSB1bmRlciB0aGUgY29udHJpYnV0b3IncyBlc3NlbnRpYWwgcGF0ZW50IGNsYWltcywgdG8KK21ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgZm9yIHNhbGUsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHJ1biwgbW9kaWZ5IGFuZAorcHJvcGFnYXRlIHRoZSBjb250ZW50cyBvZiBpdHMgY29udHJpYnV0b3IgdmVyc2lvbi4KKworICBJbiB0aGUgZm9sbG93aW5nIHRocmVlIHBhcmFncmFwaHMsIGEgInBhdGVudCBsaWNlbnNlIiBpcyBhbnkgZXhwcmVzcworYWdyZWVtZW50IG9yIGNvbW1pdG1lbnQsIGhvd2V2ZXIgZGVub21pbmF0ZWQsIG5vdCB0byBlbmZvcmNlIGEgcGF0ZW50Cisoc3VjaCBhcyBhbiBleHByZXNzIHBlcm1pc3Npb24gdG8gcHJhY3RpY2UgYSBwYXRlbnQgb3IgY292ZW5hbnQgbm90IHRvCitzdWUgZm9yIHBhdGVudCBpbmZyaW5nZW1lbnQpLiAgVG8gImdyYW50IiBzdWNoIGEgcGF0ZW50IGxpY2Vuc2UgdG8gYQorcGFydHkgbWVhbnMgdG8gbWFrZSBzdWNoIGFuIGFncmVlbWVudCBvciBjb21taXRtZW50IG5vdCB0byBlbmZvcmNlIGEKK3BhdGVudCBhZ2FpbnN0IHRoZSBwYXJ0eS4KKworICBJZiB5b3UgY29udmV5IGEgY292ZXJlZCB3b3JrLCBrbm93aW5nbHkgcmVseWluZyBvbiBhIHBhdGVudCBsaWNlbnNlLAorYW5kIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBpcyBub3QgYXZhaWxhYmxlIGZvciBhbnlvbmUKK3RvIGNvcHksIGZyZWUgb2YgY2hhcmdlIGFuZCB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLCB0aHJvdWdoIGEKK3B1YmxpY2x5IGF2YWlsYWJsZSBuZXR3b3JrIHNlcnZlciBvciBvdGhlciByZWFkaWx5IGFjY2Vzc2libGUgbWVhbnMsCit0aGVuIHlvdSBtdXN0IGVpdGhlciAoMSkgY2F1c2UgdGhlIENvcnJlc3BvbmRpbmcgU291cmNlIHRvIGJlIHNvCithdmFpbGFibGUsIG9yICgyKSBhcnJhbmdlIHRvIGRlcHJpdmUgeW91cnNlbGYgb2YgdGhlIGJlbmVmaXQgb2YgdGhlCitwYXRlbnQgbGljZW5zZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIHdvcmssIG9yICgzKSBhcnJhbmdlLCBpbiBhIG1hbm5lcgorY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlLCB0byBleHRlbmQgdGhlIHBhdGVudAorbGljZW5zZSB0byBkb3duc3RyZWFtIHJlY2lwaWVudHMuICAiS25vd2luZ2x5IHJlbHlpbmciIG1lYW5zIHlvdSBoYXZlCithY3R1YWwga25vd2xlZGdlIHRoYXQsIGJ1dCBmb3IgdGhlIHBhdGVudCBsaWNlbnNlLCB5b3VyIGNvbnZleWluZyB0aGUKK2NvdmVyZWQgd29yayBpbiBhIGNvdW50cnksIG9yIHlvdXIgcmVjaXBpZW50J3MgdXNlIG9mIHRoZSBjb3ZlcmVkIHdvcmsKK2luIGEgY291bnRyeSwgd291bGQgaW5mcmluZ2Ugb25lIG9yIG1vcmUgaWRlbnRpZmlhYmxlIHBhdGVudHMgaW4gdGhhdAorY291bnRyeSB0aGF0IHlvdSBoYXZlIHJlYXNvbiB0byBiZWxpZXZlIGFyZSB2YWxpZC4KKyAgCisgIElmLCBwdXJzdWFudCB0byBvciBpbiBjb25uZWN0aW9uIHdpdGggYSBzaW5nbGUgdHJhbnNhY3Rpb24gb3IKK2FycmFuZ2VtZW50LCB5b3UgY29udmV5LCBvciBwcm9wYWdhdGUgYnkgcHJvY3VyaW5nIGNvbnZleWFuY2Ugb2YsIGEKK2NvdmVyZWQgd29yaywgYW5kIGdyYW50IGEgcGF0ZW50IGxpY2Vuc2UgdG8gc29tZSBvZiB0aGUgcGFydGllcworcmVjZWl2aW5nIHRoZSBjb3ZlcmVkIHdvcmsgYXV0aG9yaXppbmcgdGhlbSB0byB1c2UsIHByb3BhZ2F0ZSwgbW9kaWZ5CitvciBjb252ZXkgYSBzcGVjaWZpYyBjb3B5IG9mIHRoZSBjb3ZlcmVkIHdvcmssIHRoZW4gdGhlIHBhdGVudCBsaWNlbnNlCit5b3UgZ3JhbnQgaXMgYXV0b21hdGljYWxseSBleHRlbmRlZCB0byBhbGwgcmVjaXBpZW50cyBvZiB0aGUgY292ZXJlZAord29yayBhbmQgd29ya3MgYmFzZWQgb24gaXQuCisKKyAgQSBwYXRlbnQgbGljZW5zZSBpcyAiZGlzY3JpbWluYXRvcnkiIGlmIGl0IGRvZXMgbm90IGluY2x1ZGUgd2l0aGluCit0aGUgc2NvcGUgb2YgaXRzIGNvdmVyYWdlLCBwcm9oaWJpdHMgdGhlIGV4ZXJjaXNlIG9mLCBvciBpcworY29uZGl0aW9uZWQgb24gdGhlIG5vbi1leGVyY2lzZSBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgcmlnaHRzIHRoYXQgYXJlCitzcGVjaWZpY2FsbHkgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBZb3UgbWF5IG5vdCBjb252ZXkgYSBjb3ZlcmVkCit3b3JrIGlmIHlvdSBhcmUgYSBwYXJ0eSB0byBhbiBhcnJhbmdlbWVudCB3aXRoIGEgdGhpcmQgcGFydHkgdGhhdCBpcworaW4gdGhlIGJ1c2luZXNzIG9mIGRpc3RyaWJ1dGluZyBzb2Z0d2FyZSwgdW5kZXIgd2hpY2ggeW91IG1ha2UgcGF5bWVudAordG8gdGhlIHRoaXJkIHBhcnR5IGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgeW91ciBhY3Rpdml0eSBvZiBjb252ZXlpbmcKK3RoZSB3b3JrLCBhbmQgdW5kZXIgd2hpY2ggdGhlIHRoaXJkIHBhcnR5IGdyYW50cywgdG8gYW55IG9mIHRoZQorcGFydGllcyB3aG8gd291bGQgcmVjZWl2ZSB0aGUgY292ZXJlZCB3b3JrIGZyb20geW91LCBhIGRpc2NyaW1pbmF0b3J5CitwYXRlbnQgbGljZW5zZSAoYSkgaW4gY29ubmVjdGlvbiB3aXRoIGNvcGllcyBvZiB0aGUgY292ZXJlZCB3b3JrCitjb252ZXllZCBieSB5b3UgKG9yIGNvcGllcyBtYWRlIGZyb20gdGhvc2UgY29waWVzKSwgb3IgKGIpIHByaW1hcmlseQorZm9yIGFuZCBpbiBjb25uZWN0aW9uIHdpdGggc3BlY2lmaWMgcHJvZHVjdHMgb3IgY29tcGlsYXRpb25zIHRoYXQKK2NvbnRhaW4gdGhlIGNvdmVyZWQgd29yaywgdW5sZXNzIHlvdSBlbnRlcmVkIGludG8gdGhhdCBhcnJhbmdlbWVudCwKK29yIHRoYXQgcGF0ZW50IGxpY2Vuc2Ugd2FzIGdyYW50ZWQsIHByaW9yIHRvIDI4IE1hcmNoIDIwMDcuCisKKyAgTm90aGluZyBpbiB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgY29uc3RydWVkIGFzIGV4Y2x1ZGluZyBvciBsaW1pdGluZworYW55IGltcGxpZWQgbGljZW5zZSBvciBvdGhlciBkZWZlbnNlcyB0byBpbmZyaW5nZW1lbnQgdGhhdCBtYXkKK290aGVyd2lzZSBiZSBhdmFpbGFibGUgdG8geW91IHVuZGVyIGFwcGxpY2FibGUgcGF0ZW50IGxhdy4KKworICAxMi4gTm8gU3VycmVuZGVyIG9mIE90aGVycycgRnJlZWRvbS4KKworICBJZiBjb25kaXRpb25zIGFyZSBpbXBvc2VkIG9uIHlvdSAod2hldGhlciBieSBjb3VydCBvcmRlciwgYWdyZWVtZW50IG9yCitvdGhlcndpc2UpIHRoYXQgY29udHJhZGljdCB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UsIHRoZXkgZG8gbm90CitleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiAgSWYgeW91IGNhbm5vdCBjb252ZXkgYQorY292ZXJlZCB3b3JrIHNvIGFzIHRvIHNhdGlzZnkgc2ltdWx0YW5lb3VzbHkgeW91ciBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzCitMaWNlbnNlIGFuZCBhbnkgb3RoZXIgcGVydGluZW50IG9ibGlnYXRpb25zLCB0aGVuIGFzIGEgY29uc2VxdWVuY2UgeW91IG1heQorbm90IGNvbnZleSBpdCBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgeW91IGFncmVlIHRvIHRlcm1zIHRoYXQgb2JsaWdhdGUgeW91Cit0byBjb2xsZWN0IGEgcm95YWx0eSBmb3IgZnVydGhlciBjb252ZXlpbmcgZnJvbSB0aG9zZSB0byB3aG9tIHlvdSBjb252ZXkKK3RoZSBQcm9ncmFtLCB0aGUgb25seSB3YXkgeW91IGNvdWxkIHNhdGlzZnkgYm90aCB0aG9zZSB0ZXJtcyBhbmQgdGhpcworTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20gY29udmV5aW5nIHRoZSBQcm9ncmFtLgorCisgIDEzLiBVc2Ugd2l0aCB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgeW91IGhhdmUKK3Blcm1pc3Npb24gdG8gbGluayBvciBjb21iaW5lIGFueSBjb3ZlcmVkIHdvcmsgd2l0aCBhIHdvcmsgbGljZW5zZWQKK3VuZGVyIHZlcnNpb24gMyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGludG8gYSBzaW5nbGUKK2NvbWJpbmVkIHdvcmssIGFuZCB0byBjb252ZXkgdGhlIHJlc3VsdGluZyB3b3JrLiAgVGhlIHRlcm1zIG9mIHRoaXMKK0xpY2Vuc2Ugd2lsbCBjb250aW51ZSB0byBhcHBseSB0byB0aGUgcGFydCB3aGljaCBpcyB0aGUgY292ZXJlZCB3b3JrLAorYnV0IHRoZSBzcGVjaWFsIHJlcXVpcmVtZW50cyBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorc2VjdGlvbiAxMywgY29uY2VybmluZyBpbnRlcmFjdGlvbiB0aHJvdWdoIGEgbmV0d29yayB3aWxsIGFwcGx5IHRvIHRoZQorY29tYmluYXRpb24gYXMgc3VjaC4KKworICAxNC4gUmV2aXNlZCBWZXJzaW9ucyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gIFN1Y2ggbmV3IHZlcnNpb25zIHdpbGwKK2JlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkgZGlmZmVyIGluIGRldGFpbCB0bworYWRkcmVzcyBuZXcgcHJvYmxlbXMgb3IgY29uY2VybnMuCisKKyAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuICBJZiB0aGUKK1Byb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBjZXJ0YWluIG51bWJlcmVkIHZlcnNpb24gb2YgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSAib3IgYW55IGxhdGVyIHZlcnNpb24iIGFwcGxpZXMgdG8gaXQsIHlvdSBoYXZlIHRoZQorb3B0aW9uIG9mIGZvbGxvd2luZyB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgbnVtYmVyZWQKK3ZlcnNpb24gb3Igb2YgYW55IGxhdGVyIHZlcnNpb24gcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCitGb3VuZGF0aW9uLiAgSWYgdGhlIFByb2dyYW0gZG9lcyBub3Qgc3BlY2lmeSBhIHZlcnNpb24gbnVtYmVyIG9mIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkCitieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIElmIHRoZSBQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgcHJveHkgY2FuIGRlY2lkZSB3aGljaCBmdXR1cmUKK3ZlcnNpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdXNlZCwgdGhhdCBwcm94eSdzCitwdWJsaWMgc3RhdGVtZW50IG9mIGFjY2VwdGFuY2Ugb2YgYSB2ZXJzaW9uIHBlcm1hbmVudGx5IGF1dGhvcml6ZXMgeW91Cit0byBjaG9vc2UgdGhhdCB2ZXJzaW9uIGZvciB0aGUgUHJvZ3JhbS4KKworICBMYXRlciBsaWNlbnNlIHZlcnNpb25zIG1heSBnaXZlIHlvdSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudAorcGVybWlzc2lvbnMuICBIb3dldmVyLCBubyBhZGRpdGlvbmFsIG9ibGlnYXRpb25zIGFyZSBpbXBvc2VkIG9uIGFueQorYXV0aG9yIG9yIGNvcHlyaWdodCBob2xkZXIgYXMgYSByZXN1bHQgb2YgeW91ciBjaG9vc2luZyB0byBmb2xsb3cgYQorbGF0ZXIgdmVyc2lvbi4KKworICAxNS4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4KKworICBUSEVSRSBJUyBOTyBXQVJSQU5UWSBGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZCitBUFBMSUNBQkxFIExBVy4gIEVYQ0VQVCBXSEVOIE9USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUCitIT0xERVJTIEFORC9PUiBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZCitPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1RIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKK1BVUlBPU0UuICBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNCitJUyBXSVRIIFlPVS4gIFNIT1VMRCBUSEUgUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YKK0FMTCBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxNi4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuCisKKyAgSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1PRElGSUVTIEFORC9PUiBDT05WRVlTCitUSEUgUFJPR1JBTSBBUyBQRVJNSVRURUQgQUJPVkUsIEJFIExJQUJMRSBUTyBZT1UgRk9SIERBTUFHRVMsIElOQ0xVRElORyBBTlkKK0dFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRQorVVNFIE9SIElOQUJJTElUWSBUTyBVU0UgVEhFIFBST0dSQU0gKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRgorREFUQSBPUiBEQVRBIEJFSU5HIFJFTkRFUkVEIElOQUNDVVJBVEUgT1IgTE9TU0VTIFNVU1RBSU5FRCBCWSBZT1UgT1IgVEhJUkQKK1BBUlRJRVMgT1IgQSBGQUlMVVJFIE9GIFRIRSBQUk9HUkFNIFRPIE9QRVJBVEUgV0lUSCBBTlkgT1RIRVIgUFJPR1JBTVMpLAorRVZFTiBJRiBTVUNIIEhPTERFUiBPUiBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorU1VDSCBEQU1BR0VTLgorCisgIDE3LiBJbnRlcnByZXRhdGlvbiBvZiBTZWN0aW9ucyAxNSBhbmQgMTYuCisKKyAgSWYgdGhlIGRpc2NsYWltZXIgb2Ygd2FycmFudHkgYW5kIGxpbWl0YXRpb24gb2YgbGlhYmlsaXR5IHByb3ZpZGVkCithYm92ZSBjYW5ub3QgYmUgZ2l2ZW4gbG9jYWwgbGVnYWwgZWZmZWN0IGFjY29yZGluZyB0byB0aGVpciB0ZXJtcywKK3Jldmlld2luZyBjb3VydHMgc2hhbGwgYXBwbHkgbG9jYWwgbGF3IHRoYXQgbW9zdCBjbG9zZWx5IGFwcHJveGltYXRlcworYW4gYWJzb2x1dGUgd2FpdmVyIG9mIGFsbCBjaXZpbCBsaWFiaWxpdHkgaW4gY29ubmVjdGlvbiB3aXRoIHRoZQorUHJvZ3JhbSwgdW5sZXNzIGEgd2FycmFudHkgb3IgYXNzdW1wdGlvbiBvZiBsaWFiaWxpdHkgYWNjb21wYW5pZXMgYQorY29weSBvZiB0aGUgUHJvZ3JhbSBpbiByZXR1cm4gZm9yIGEgZmVlLgorCisJCSAgICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKKwkgICAgSG93IHRvIEFwcGx5IFRoZXNlIFRlcm1zIHRvIFlvdXIgTmV3IFByb2dyYW1zCisKKyAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorcG9zc2libGUgdXNlIHRvIHRoZSBwdWJsaWMsIHRoZSBiZXN0IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gbWFrZSBpdAorZnJlZSBzb2Z0d2FyZSB3aGljaCBldmVyeW9uZSBjYW4gcmVkaXN0cmlidXRlIGFuZCBjaGFuZ2UgdW5kZXIgdGhlc2UgdGVybXMuCisKKyAgVG8gZG8gc28sIGF0dGFjaCB0aGUgZm9sbG93aW5nIG5vdGljZXMgdG8gdGhlIHByb2dyYW0uICBJdCBpcyBzYWZlc3QKK3RvIGF0dGFjaCB0aGVtIHRvIHRoZSBzdGFydCBvZiBlYWNoIHNvdXJjZSBmaWxlIHRvIG1vc3QgZWZmZWN0aXZlbHkKK3N0YXRlIHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworICBJZiB0aGUgcHJvZ3JhbSBkb2VzIHRlcm1pbmFsIGludGVyYWN0aW9uLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0Citub3RpY2UgbGlrZSB0aGlzIHdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICA8cHJvZ3JhbT4gIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisgICAgVGhpcyBwcm9ncmFtIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZSBgc2hvdyB3Jy4KKyAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0CisgICAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zOyB0eXBlIGBzaG93IGMnIGZvciBkZXRhaWxzLgorCitUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUgYXBwcm9wcmlhdGUKK3BhcnRzIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgT2YgY291cnNlLCB5b3VyIHByb2dyYW0ncyBjb21tYW5kcworbWlnaHQgYmUgZGlmZmVyZW50OyBmb3IgYSBHVUkgaW50ZXJmYWNlLCB5b3Ugd291bGQgdXNlIGFuICJhYm91dCBib3giLgorCisgIFlvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciBzY2hvb2wsCitpZiBhbnksIHRvIHNpZ24gYSAiY29weXJpZ2h0IGRpc2NsYWltZXIiIGZvciB0aGUgcHJvZ3JhbSwgaWYgbmVjZXNzYXJ5LgorRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgYW5kIGhvdyB0byBhcHBseSBhbmQgZm9sbG93IHRoZSBHTlUgR1BMLCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZG9lcyBub3QgcGVybWl0IGluY29ycG9yYXRpbmcgeW91ciBwcm9ncmFtCitpbnRvIHByb3ByaWV0YXJ5IHByb2dyYW1zLiAgSWYgeW91ciBwcm9ncmFtIGlzIGEgc3Vicm91dGluZSBsaWJyYXJ5LCB5b3UKK21heSBjb25zaWRlciBpdCBtb3JlIHVzZWZ1bCB0byBwZXJtaXQgbGlua2luZyBwcm9wcmlldGFyeSBhcHBsaWNhdGlvbnMgd2l0aAordGhlIGxpYnJhcnkuICBJZiB0aGlzIGlzIHdoYXQgeW91IHdhbnQgdG8gZG8sIHVzZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4gIEJ1dCBmaXJzdCwgcGxlYXNlIHJlYWQKKzxodHRwOi8vd3d3LmdudS5vcmcvcGhpbG9zb3BoeS93aHktbm90LWxncGwuaHRtbD4uCisKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L0NoYW5nZUxvZyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWZlMTYxCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTQgQEAKK2dwcGZzICgwLjIpCisKKyAgKiBBZGQgc3VwcG9ydCBmb3Igc3RkOjp0cjE6OnVub3JkZXJlZF97bXVsdGksfXttYXAsc2V0fSwgc3RkOjphdXRvX3B0ciwKKyAgICBzdGQ6OnRyMTo6c2hhcmVkX3B0ciBhbmQgc3RkOjp0cjE6OndlYWtfcHRyLgorICAqIEZpeCBkaXNwbGF5IG9mIGVtcHR5IHN0cmluZ3Mgd2l0aCBTVExwb3J0IDUuMC54IGlmCisgICAgX1NUTFBfRk9SQ0VfU1RSSU5HX1RFUk1JTkFUSU9OIGlzIG5vdCBlbmFibGVkLgorCisgLS0gSm9hY2hpbSBSZWljaGVsIDxqb2FjaGltLnJlaWNoZWxAZ214LmRlPiAgTW9uLCAwNCBPY3QgMjAxMCAyMDoxMDoxNCArMDIwMAorCitncHBmcyAoMC4xKQorCisgICogSW5pdGlhbCByZWxlYXNlLgorCisgLS0gSm9hY2hpbSBSZWljaGVsIDxqb2FjaGltLnJlaWNoZWxAZ214LmRlPiAgVGh1LCAzMCBTZXAgMjAxMCAxODo0MDo0MiArMDIwMApkaWZmIC0tZ2l0IGEvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvUkVBRE1FIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZjE4YzYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC9SRUFETUUKQEAgLTAsMCArMSw0MyBAQAorR0RCIHByZXR0eSBwcmludGVycyBmb3IgU1RMcG9ydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIHB5dGhvbiBtb2R1bGUgcHJvdmlkZXMgR0RCIHByZXR0eSBwcmludGVycyBmb3IgdGhlIGNvbnRhaW5lcnMgZnJvbQorU1RMcG9ydC4gSXQgaXMgYmFzZWQgb24gYSBzaW1pbGFyIHB5dGhvbiBtb2R1bGUgZm9yIGxpYnN0ZGMrKyBbMV0uIEl0IGhhcworYmVlbiB0ZXN0ZWQgd2l0aCBHREIgNy4wLjEvNy4yIGFuZCBTVExwb3J0IDQuNi4yLzUuMC4zLzUuMS43LzUuMi4xLgorCitbMV0gc3ZuOi8vZ2NjLmdudS5vcmcvc3ZuL2djYy90cnVuay9saWJzdGRjKystdjMvcHl0aG9uCisKKworSW5zdGFsbGF0aW9uCistLS0tLS0tLS0tLS0KKworVG8gaW5zdGFsbCB0aGUgcHl0aG9uIG1vZHVsZSBjb3B5IHRoZSAic3RscG9ydCIgc3ViZGlyZWN0b3J5IHRvIHNvbWUgcGxhY2UuCitUbyBlbmFibGUgdGhlIHByZXR0eSBwcmludGVyIGFkZCB0aGUgZm9sbG93aW5nIGNvZGUgdG8gJEhPTUUvLmdkYmluaXQ6CisKKyAgICBweXRob24KKyAgICBpbXBvcnQgc3lzCisKKyAgICBzeXMucGF0aC5pbnNlcnQgKDAsICcvcGF0aC90by9kaXIvY29udGFpbmluZy90aGUvc3RscG9ydC9kaXInKQorICAgIGltcG9ydCBzdGxwb3J0LnByaW50ZXJzCisgICAgc3RscG9ydC5wcmludGVycy5yZWdpc3Rlcl9zdGxwb3J0X3ByaW50ZXJzIChOb25lKQorCisgICAgIyBzZWUgdGhlIHB5dGhvbiBtb2R1bGUgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlc2Ugb3B0aW9ucworICAgICMgc3RscG9ydC5wcmludGVycy5zdGxwb3J0X3ZlcnNpb24gICAgICAgICAgID0gNS4yCisgICAgIyBzdGxwb3J0LnByaW50ZXJzLnByaW50X3ZlY3Rvcl93aXRoX2luZGljZXMgPSBGYWxzZQorICAgIAorICAgIGVuZAorCisKK1Rlc3RpbmcKKy0tLS0tLS0KKworVG8gdGVzdCB0aGUgcHJldHR5IHByaW50ZXJzLCBnbyB0byB0aGUgdGVzdCBkaXJlY3RvcnkgYW5kIHNldCB1cCB0aGUgU1RMcG9ydAorZGlyZWN0b3J5IGluIHRoZSBNYWtlZmlsZS4gQ2FsbGluZyBtYWtlIHNob3VsZCB0aGVuIGNvbXBpbGUgdHdvIGV4ZWN1dGFibGVzCisod2l0aCBhbmQgd2l0aG91dCAtRF9TVExQX0RFQlVHKSBhbmQgaW52b2tlIEdEQiB3aXRoIHRoZSBzdXBwbGllZCBzY3JpcHQuIElmCit0aGUgcHJldHR5IHByaW50ZXJzIHdvcmsgdGhlIHZhcmlhYmxlcyBmcm9tIHRlc3QuY3BwIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gYQorY29udmVuaWVudCB3YXkuCisKK05vdGUgdGhhdCBHREIgcHJlZmVycyBweXRob24gbW9kdWxlcyBmcm9tICRIT01FLy5nZGJpbml0IG92ZXIgdGhvc2UgZnJvbQorLmdkYmluaXQgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIElmIHlvdSBhZGFwdGVkICRIT01FLy5nZGJpbml0IGFzCitkZXNjcmliZWQgYWJvdmUgdGhlIGxvY2F0aW9uIHRoZXJlIHdpbGwgYmUgdXNlZC4gT3RoZXJ3aXNlLCB0ZXN0Ly5nZGJpbml0IHdpbGwKK2xvYWQgc3RscG9ydC9wcmludGVycy5weS4KZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3N0bHBvcnQvLl9fX2luaXRfXy5weSBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3N0bHBvcnQvLl9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTkxMmZjCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvc3RscG9ydC8uX19faW5pdF9fLnB5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3N0bHBvcnQvLl9wcmludGVycy5weSBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3N0bHBvcnQvLl9wcmludGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTVlYTQxCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvc3RscG9ydC8uX3ByaW50ZXJzLnB5CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3N0bHBvcnQvX19pbml0X18ucHkgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC9zdGxwb3J0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTM3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC9zdGxwb3J0L19faW5pdF9fLnB5CkBAIC0wLDAgKzEgQEAKKwpkaWZmIC0tZ2l0IGEvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvc3RscG9ydC9wcmludGVycy5weSBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3N0bHBvcnQvcHJpbnRlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxZDFjZAotLS0gL2Rldi9udWxsCisrKyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3N0bHBvcnQvcHJpbnRlcnMucHkKQEAgLTAsMCArMSw3MjYgQEAKKyMgR0RCIHByZXR0eSBwcmludGVycyBmb3IgU1RMcG9ydC4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorIyBDb3B5cmlnaHQgKEMpIDIwMTAgSm9hY2hpbSBSZWljaGVsCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisKKyMgcHlsaW50OiBkaXNhYmxlPUMwMTAzLEMwMTExLFIwMjAxLFIwOTAzCisKKworaW1wb3J0IGdkYgoraW1wb3J0IHJlCisKKworIyBTZXQgdGhlIFNUTHBvcnQgdmVyc2lvbiB3aGljaCBpcyBuZWVkZWQgZm9yIGEgZmV3IGZlYXR1cmVzLgorIworIyAtIGZvciBzdGQ6Omxpc3Q6CisjICAgU1RMcG9ydCBvbGRlciB0aGFuIDUuMD8KKyMgLSBmb3Igc3RkOjpkZXF1ZSwgc3RkOjpzdGFjaywgYW5kIHN0ZDo6cXVldWUgb24gNjRiaXQgc3lzdGVtczoKKyMgICBTVExwb3J0IG9sZGVyIHRoYW4gNS4yPworc3RscG9ydF92ZXJzaW9uID0gNS4yCisKKyMgSW5kaWNhdGVzIHdoZXRoZXIgc3RkOjp2ZWN0b3IgaXMgcHJpbnRlZCB3aXRoIGluZGljZXMuCitwcmludF92ZWN0b3Jfd2l0aF9pbmRpY2VzID0gRmFsc2UKKworCitkZWYgbG9va3VwX3N0bHBvcnRfdHlwZSAodHlwZW5hbWUpOgorICAgICJMb29rIHVwIGEgdHlwZSBpbiB0aGUgcHVibGljIFNUTHBvcnQgbmFtZXNwYWNlLiIKKworICAgIG5hbWVzcGFjZXMgPSBbJ3N0ZDo6JywgJ3N0bHBkX3N0ZDo6JywgJ3N0bHBfc3RkOjonLCAnX1NUTDo6J10KKyAgICBmb3IgbmFtZXNwYWNlIGluIG5hbWVzcGFjZXM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBnZGIubG9va3VwX3R5cGUgKG5hbWVzcGFjZSArIHR5cGVuYW1lKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcGFzcworCitkZWYgbG9va3VwX3N0bHBvcnRfcHJpdl90eXBlICh0eXBlbmFtZSk6CisgICAgIkxvb2sgdXAgYSB0eXBlIGluIHRoZSBwcml2YXRlIFNUTHBvcnQgbmFtZXNwYWNlLiIKKworICAgIG5hbWVzcGFjZXMgPSBbJ3N0ZDo6cHJpdjo6JywgJ3N0bHBkX3N0ZDo6cHJpdjo6JywgJ3N0bHBfc3RkOjpwcml2OjonLCAnc3RscGRfc3RkOjonLCAnc3RscF9zdGQ6OicsICdfU1RMOjonXQorICAgIGZvciBuYW1lc3BhY2UgaW4gbmFtZXNwYWNlczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGdkYi5sb29rdXBfdHlwZSAobmFtZXNwYWNlICsgdHlwZW5hbWUpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKworZGVmIGdldF9ub25fZGVidWdfaW1wbCAodmFsdWUsIG1lbWJlciA9IE5vbmUpOgorICAgICJSZXR1cm4gdGhlIG5vbi1kZWJ1ZyBpbXBsZW1lbnRhdGlvbiBvZiB2YWx1ZSBvciB2YWx1ZVttZW1iZXJdLiIKKyAgICBpZiBtZW1iZXI6CisgICAgICAgIHZhbHVlID0gdmFsdWVbbWVtYmVyXQorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHZhbHVlWydfTV9ub25fZGJnX2ltcGwnXQorICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgIHJldHVybiB2YWx1ZQorCisKK2NsYXNzIFJidHJlZUl0ZXJhdG9yOgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCByYnRyZWUpOgorICAgICAgICB0cmVlID0gZ2V0X25vbl9kZWJ1Z19pbXBsIChyYnRyZWUgLCAnX01fdCcpCisgICAgICAgIHNlbGYuc2l6ZSA9IHRyZWVbJ19NX25vZGVfY291bnQnXQorICAgICAgICBzZWxmLm5vZGUgPSB0cmVlWydfTV9oZWFkZXInXVsnX01fZGF0YSddWydfTV9sZWZ0J10KKyAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgIGRlZiBfX2l0ZXJfXyAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19sZW5fXyAoc2VsZik6CisgICAgICAgIHJldHVybiBpbnQgKHNlbGYuc2l6ZSkKKworICAgIGRlZiBuZXh0IChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jb3VudCA9PSBzZWxmLnNpemU6CisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHJlc3VsdCA9IHNlbGYubm9kZQorICAgICAgICBzZWxmLmNvdW50ICs9IDEKKyAgICAgICAgaWYgc2VsZi5jb3VudCA8IHNlbGYuc2l6ZToKKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLm5vZGUKKyAgICAgICAgICAgICMgSXMgdGhlcmUgYSByaWdodCBjaGlsZD8KKyAgICAgICAgICAgIGlmIG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fcmlnaHQnXToKKyAgICAgICAgICAgICAgICAjIFdhbGsgZG93biB0byBsZWZ0LW1vc3QgY2hpbGQgaW4gcmlnaHQgc3VidHJlZS4KKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9yaWdodCddCisgICAgICAgICAgICAgICAgd2hpbGUgbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9sZWZ0J106CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmRlcmVmZXJlbmNlKClbJ19NX2xlZnQnXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFdhbGsgdXAgdG8gZmlyc3QgcGFyZW50IHJlYWNoZWQgdmlhIGxlZnQgc3VidHJlZS4KKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBub2RlLmRlcmVmZXJlbmNlKClbJ19NX3BhcmVudCddCisgICAgICAgICAgICAgICAgd2hpbGUgbm9kZSA9PSBwYXJlbnQuZGVyZWZlcmVuY2UoKVsnX01fcmlnaHQnXToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudAorICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuZGVyZWZlcmVuY2UoKVsnX01fcGFyZW50J10KKyAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50CisgICAgICAgICAgICBzZWxmLm5vZGUgPSBub2RlCisgICAgICAgIHJldHVybiByZXN1bHQKKworCitjbGFzcyBCaXRzZXRQcmludGVyOgorICAgICJQcmV0dHkgcHJpbnRlciBmb3Igc3RkOjpiaXRzZXQuIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgICAgICA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgICMgSWYgdGVtcGxhdGVfYXJndW1lbnQgaGFuZGxlZCB2YWx1ZXMsIHdlIGNvdWxkIHByaW50IHRoZQorICAgICAgICAjIHNpemUuICBPciB3ZSBjb3VsZCB1c2UgYSByZWdleHAgb24gdGhlIHR5cGUuCisgICAgICAgIHJldHVybiAnJXMnICUgKHNlbGYudHlwZW5hbWUpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICB3b3JkcyA9IHNlbGYudmFsWydfTV93J10KKworICAgICAgICAjIFRoZSBfTV93IG1lbWJlciBjYW4gYmUgZWl0aGVyIGFuIHVuc2lnbmVkIGxvbmcsIG9yIGFuCisgICAgICAgICMgYXJyYXkuICBUaGlzIGRlcGVuZHMgb24gdGhlIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHVzZWQuCisgICAgICAgICMgSWYgaXQgaXMgYSBzaW5nbGUgbG9uZywgY29udmVydCB0byBhIHNpbmdsZSBlbGVtZW50IGxpc3QuCisgICAgICAgIGlmIHdvcmRzLnR5cGUuY29kZSA9PSBnZGIuVFlQRV9DT0RFX0FSUkFZOgorICAgICAgICAgICAgd29yZF9zaXplID0gd29yZHMudHlwZS50YXJnZXQgKCkuc2l6ZW9mCisgICAgICAgICAgICBuX3dvcmRzICAgPSB3b3Jkcy50eXBlLnNpemVvZiAvIHdvcmRfc2l6ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd29yZF9zaXplID0gd29yZHMudHlwZS5zaXplb2YgCisgICAgICAgICAgICBuX3dvcmRzICAgPSAxCisgICAgICAgICAgICB3b3JkcyAgICAgPSBbd29yZHNdCisKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgd29yZCA9IDAKKyAgICAgICAgd2hpbGUgd29yZCA8IG5fd29yZHM6CisgICAgICAgICAgICB3ID0gd29yZHNbd29yZF0KKyAgICAgICAgICAgIGJpdCA9IDAKKyAgICAgICAgICAgIHdoaWxlIHcgIT0gMDoKKyAgICAgICAgICAgICAgICBpZiB3ICYgMToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCAoKCdbJWRdJyAlICh3b3JkICogd29yZF9zaXplICogOCArIGJpdCksIDEpKQorICAgICAgICAgICAgICAgIGJpdCArPSAxCisgICAgICAgICAgICAgICAgdyA9IHcgPj4gMQorICAgICAgICAgICAgd29yZCArPSAxCisgICAgICAgIHJldHVybiByZXN1bHQKKworCitjbGFzcyBEZXF1ZVByaW50ZXI6CisgICAgIlByZXR0eSBwcmludGVyIGZvciBzdGQ6OmRlcXVlLiIKKworICAgIGNsYXNzIEl0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18gKHNlbGYsIHN0YXJ0X25vZGUsIHN0YXJ0X2N1ciwgc3RhcnRfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hfY3VyLCBidWZmZXJfc2l6ZSk6CisgICAgICAgICAgICBzZWxmLm5vZGUgICAgICAgID0gc3RhcnRfbm9kZQorICAgICAgICAgICAgc2VsZi5pdGVtICAgICAgICA9IHN0YXJ0X2N1cgorICAgICAgICAgICAgc2VsZi5ub2RlX2xhc3QgICA9IHN0YXJ0X2xhc3QKKyAgICAgICAgICAgIHNlbGYubGFzdCAgICAgICAgPSBmaW5pc2hfY3VyCisgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemUKKyAgICAgICAgICAgIHNlbGYuY291bnQgICAgICAgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fIChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQgKHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5pdGVtID09IHNlbGYubGFzdDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICByZXN1bHQgPSAoJ1slZF0nICUgc2VsZi5jb3VudCwgc2VsZi5pdGVtLmRlcmVmZXJlbmNlKCkpCisgICAgICAgICAgICBzZWxmLmNvdW50ICs9IDEKKyAgICAgICAgICAgIHNlbGYuaXRlbSAgKz0gMQorICAgICAgICAgICAgaWYgc2VsZi5pdGVtID09IHNlbGYubm9kZV9sYXN0OgorICAgICAgICAgICAgICAgIHNlbGYubm9kZSArPSAxCisgICAgICAgICAgICAgICAgc2VsZi5pdGVtID0gc2VsZi5ub2RlWzBdCisgICAgICAgICAgICAgICAgc2VsZi5ub2RlX2xhc3QgPSBzZWxmLml0ZW0gKyBzZWxmLmJ1ZmZlcl9zaXplCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSBnZXRfbm9uX2RlYnVnX2ltcGwgKHZhbCkKKyAgICAgICAgc2l6ZSA9IHZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApLnNpemVvZgorICAgICAgICAjIHNlZSBNQVhfQllURVMgaW4gc3RscG9ydC9zdGwvX2FsbG9jLmgKKyAgICAgICAgaWYgc3RscG9ydF92ZXJzaW9uIDwgNS4yOgorICAgICAgICAgICAgYmxvY2tzaXplID0gMTI4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBibG9ja3NpemUgPSAzMiAqIGdkYi5sb29rdXBfdHlwZSAoInZvaWQiKS5wb2ludGVyKCkuc2l6ZW9mCisgICAgICAgIGlmIHNpemUgPCBibG9ja3NpemU6CisgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gaW50IChibG9ja3NpemUgLyBzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZSA9IDEKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICBzdGFydCAgID0gc2VsZi52YWxbJ19NX3N0YXJ0J10KKyAgICAgICAgZmluaXNoICA9IHNlbGYudmFsWydfTV9maW5pc2gnXQorICAgICAgICBkZWx0YV9uID0gZmluaXNoWydfTV9ub2RlJ10gLSBzdGFydFsnX01fbm9kZSddIC0gMQorICAgICAgICBkZWx0YV9zID0gc3RhcnRbJ19NX2xhc3QnXSAtIHN0YXJ0WydfTV9jdXInXQorICAgICAgICBkZWx0YV9mID0gZmluaXNoWydfTV9jdXInXSAtIGZpbmlzaFsnX01fZmlyc3QnXQorICAgICAgICBpZiBkZWx0YV9uID09IC0xOgorICAgICAgICAgICAgc2l6ZSA9IGRlbHRhX2YKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNpemUgPSBzZWxmLmJ1ZmZlcl9zaXplICogZGVsdGFfbiArIGRlbHRhX3MgKyBkZWx0YV9mCisgICAgICAgIHRhMCA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQgKDApCisgICAgICAgIHJldHVybiAnJXM8JXM+IHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsIHRhMCwgaW50IChzaXplKSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHN0YXJ0ICA9IHNlbGYudmFsWydfTV9zdGFydCddCisgICAgICAgIGZpbmlzaCA9IHNlbGYudmFsWydfTV9maW5pc2gnXQorICAgICAgICByZXR1cm4gc2VsZi5JdGVyYXRvciAoc3RhcnRbJ19NX25vZGUnXSwgc3RhcnRbJ19NX2N1ciddLAorICAgICAgICAgICAgc3RhcnRbJ19NX2xhc3QnXSwgZmluaXNoWydfTV9jdXInXSwgc2VsZi5idWZmZXJfc2l6ZSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ2FycmF5JworCisKK2NsYXNzIExpc3RQcmludGVyOgorICAgICJQcmV0dHkgcHJpbnRlciBmb3Igc3RkOjpsaXN0LiIKKworICAgIGNsYXNzIEl0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18gKHNlbGYsIG5vZGVfdHlwZSwgaGVhZCk6CisgICAgICAgICAgICBzZWxmLm5vZGVfdHlwZSA9IG5vZGVfdHlwZQorICAgICAgICAgICAgIyBzZWUgZW1wdHkoKSBpbiBzdGxwb3J0L3N0bC9fbGlzdC5oCisgICAgICAgICAgICBpZiBzdGxwb3J0X3ZlcnNpb24gPCA1LjA6CisgICAgICAgICAgICAgICAgc2VsZi5zZW50aW5lbCA9IGhlYWQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zZW50aW5lbCA9IGhlYWQuYWRkcmVzcworICAgICAgICAgICAgc2VsZi5pdGVtICA9IGhlYWRbJ19NX25leHQnXQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18gKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLml0ZW0gPT0gc2VsZi5zZW50aW5lbDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICBub2RlID0gc2VsZi5pdGVtLmNhc3QgKHNlbGYubm9kZV90eXBlKS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICBzZWxmLml0ZW0gPSBub2RlWydfTV9uZXh0J10KKyAgICAgICAgICAgIGNvdW50ID0gc2VsZi5jb3VudAorICAgICAgICAgICAgc2VsZi5jb3VudCArPSAxCisgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBub2RlWydfTV9kYXRhJ10pCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IGdldF9ub25fZGVidWdfaW1wbCAodmFsKQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgdGEwICAgICAgID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorICAgICAgICBub2RlX3R5cGUgPSBsb29rdXBfc3RscG9ydF9wcml2X3R5cGUgKCdfTGlzdF9ub2RlPCVzPicgJSB0YTApLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi5JdGVyYXRvciAobm9kZV90eXBlLCBzZWxmLnZhbFsnX01fbm9kZSddWydfTV9kYXRhJ10pCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgdGEwID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMCkKKyAgICAgICAgIyBzZWUgZW1wdHkoKSBpbiBzdGxwb3J0L3N0bC9fbGlzdC5oCisgICAgICAgIGlmIHN0bHBvcnRfdmVyc2lvbiA8IDUuMDoKKyAgICAgICAgICAgIHNlbnRpbmVsID0gc2VsZi52YWxbJ19NX25vZGUnXVsnX01fZGF0YSddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZW50aW5lbCA9IHNlbGYudmFsWydfTV9ub2RlJ11bJ19NX2RhdGEnXS5hZGRyZXNzCisgICAgICAgIGlmIHNlbGYudmFsWydfTV9ub2RlJ11bJ19NX2RhdGEnXVsnX01fbmV4dCddID09IHNlbnRpbmVsOgorICAgICAgICAgICAgcmV0dXJuICdlbXB0eSAlczwlcz4nICUgKHNlbGYudHlwZW5hbWUsIHRhMCkKKyAgICAgICAgcmV0dXJuICclczwlcz4nICUgKHNlbGYudHlwZW5hbWUsIHRhMCkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ2FycmF5JworCisKK2NsYXNzIE1hcFByaW50ZXI6CisgICAgIlByZXR0eSBwcmludGVyIGZvciBzdGQ6Om1hcCBhbmQgc3RkOjptdWx0aW1hcC4iCisKKyAgICBjbGFzcyBJdGVyYXRvcjoKKworICAgICAgICBkZWYgX19pbml0X18gKHNlbGYsIHJiaXRlciwgbm9kZV90eXBlKToKKyAgICAgICAgICAgIHNlbGYucmJpdGVyICAgID0gcmJpdGVyCisgICAgICAgICAgICBzZWxmLm5vZGVfdHlwZSA9IG5vZGVfdHlwZQorICAgICAgICAgICAgc2VsZi5jb3VudCAgICAgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fIChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQgKHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5jb3VudCAlIDIgPT0gMDoKKyAgICAgICAgICAgICAgICBpdGVtID0gc2VsZi5yYml0ZXIubmV4dCgpLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICBzZWxmLnBhaXIgPSAoaXRlbS5jYXN0IChzZWxmLm5vZGVfdHlwZSkpWydfTV92YWx1ZV9maWVsZCddCisgICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYucGFpclsnZmlyc3QnXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi5wYWlyWydzZWNvbmQnXQorICAgICAgICAgICAgY291bnQgPSBzZWxmLmNvdW50CisgICAgICAgICAgICBzZWxmLmNvdW50ICs9IDEKKyAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgY291bnQsIGVsZW1lbnQpCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIGtleV90eXBlICAgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgwKQorICAgICAgICB2YWx1ZV90eXBlID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMSkKKyAgICAgICAgcGFpcl90eXBlICBcCisgICAgICAgICAgICA9IGxvb2t1cF9zdGxwb3J0X3R5cGUgKCdwYWlyPCVzIGNvbnN0LCVzPicgJSAoa2V5X3R5cGUsdmFsdWVfdHlwZSkpCisgICAgICAgIG5vZGVfdHlwZSAgXAorICAgICAgICAgICAgPSBsb29rdXBfc3RscG9ydF9wcml2X3R5cGUgKCdfUmJfdHJlZV9ub2RlPCVzID4nICUgc3RyIChwYWlyX3R5cGUpKQorICAgICAgICByZXR1cm4gc2VsZi5JdGVyYXRvciAoUmJ0cmVlSXRlcmF0b3IgKHNlbGYudmFsKSwgbm9kZV90eXBlKQorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHRhMCA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQgKDApCisgICAgICAgIGNvdW50ID0gZ2V0X25vbl9kZWJ1Z19pbXBsIChzZWxmLnZhbCwgJ19NX3QnKVsnX01fbm9kZV9jb3VudCddCisgICAgICAgIHJldHVybiAoJyVzPCVzPiB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLCB0YTAsIGNvdW50KSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ21hcCcKKworCitjbGFzcyBTZXRQcmludGVyOgorICAgICJQcmV0dHkgcHJpbnRlciBmb3Igc3RkOjpzZXQgYW5kIHN0ZDo6bXVsdGlzZXQuIgorCisgICAgY2xhc3MgSXRlcmF0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgcmJpdGVyLCBub2RlX3R5cGUpOgorICAgICAgICAgICAgc2VsZi5yYml0ZXIgICAgPSByYml0ZXIKKyAgICAgICAgICAgIHNlbGYubm9kZV90eXBlID0gbm9kZV90eXBlCisgICAgICAgICAgICBzZWxmLmNvdW50ICAgICA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18gKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgICAgICBpdGVtID0gc2VsZi5yYml0ZXIubmV4dCgpLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgIGVsZW1lbnQgPSAoaXRlbS5jYXN0IChzZWxmLm5vZGVfdHlwZSkpWydfTV92YWx1ZV9maWVsZCddCisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgKz0gMQorICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgZWxlbWVudCkKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgdmFsdWVfdHlwZSA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQgKDApCisgICAgICAgIG5vZGVfdHlwZSAgXAorICAgICAgICAgICAgPSBsb29rdXBfc3RscG9ydF9wcml2X3R5cGUgKCdfUmJfdHJlZV9ub2RlPCVzPicgJSAodmFsdWVfdHlwZSkpCisgICAgICAgIHJldHVybiBzZWxmLkl0ZXJhdG9yIChSYnRyZWVJdGVyYXRvciAoc2VsZi52YWwpLCBub2RlX3R5cGUpCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgdGEwID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMCkKKyAgICAgICAgY291bnQgPSBnZXRfbm9uX2RlYnVnX2ltcGwgKHNlbGYudmFsLCAnX01fdCcpWydfTV9ub2RlX2NvdW50J10KKyAgICAgICAgcmV0dXJuICgnJXM8JXM+IHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsIHRhMCwgY291bnQpKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnYXJyYXknCisKKworY2xhc3MgU2xpc3RQcmludGVyOgorICAgICJQcmV0dHkgcHJpbnRlciBmb3Igc3RkOjpzbGlzdC4iCisKKyAgICBjbGFzcyBJdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fIChzZWxmLCBub2RlX3R5cGUsIGhlYWQpOgorICAgICAgICAgICAgc2VsZi5ub2RlX3R5cGUgPSBub2RlX3R5cGUKKyAgICAgICAgICAgIHNlbGYuaXRlbSAgPSBoZWFkWydfTV9uZXh0J10KKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fIChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQgKHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5pdGVtID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgbm9kZSA9IHNlbGYuaXRlbS5jYXN0IChzZWxmLm5vZGVfdHlwZSkuZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgc2VsZi5pdGVtID0gbm9kZVsnX01fbmV4dCddCisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgKz0gMQorICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgbm9kZVsnX01fZGF0YSddKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSBnZXRfbm9uX2RlYnVnX2ltcGwgKHZhbCkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHRhMCAgICAgICA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMCkKKyAgICAgICAgbm9kZV90eXBlID0gbG9va3VwX3N0bHBvcnRfcHJpdl90eXBlICgnX1NsaXN0X25vZGU8JXM+JyAlIHRhMCkucG9pbnRlcigpCisgICAgICAgIHJldHVybiBzZWxmLkl0ZXJhdG9yIChub2RlX3R5cGUsIHNlbGYudmFsWydfTV9oZWFkJ11bJ19NX2RhdGEnXSkKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICB0YTAgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgwKQorICAgICAgICBpZiBzZWxmLnZhbFsnX01faGVhZCddWydfTV9kYXRhJ11bJ19NX25leHQnXSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICdlbXB0eSAlczwlcz4nICUgKHNlbGYudHlwZW5hbWUsIHRhMCkKKyAgICAgICAgcmV0dXJuICclczwlcz4nICUgKHNlbGYudHlwZW5hbWUsIHRhMCkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ2FycmF5JworCisKK2NsYXNzIFN0cmluZ1ByaW50ZXI6CisgICAgIlByZXR0eSBwcmludGVyIGZvciBzdGQ6OnN0cmluZyBvciBzdGQ6OndzdHJpbmcuIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCBfdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gZ2V0X25vbl9kZWJ1Z19pbXBsICh2YWwpCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBTVExwb3J0IDUuMiBhbmQgbGF0ZXIKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01fc3RhcnRfb2Zfc3RvcmFnZSddWydfTV9kYXRhJ10KKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFNUTHBvcnQgNS4wIGFuZCA1LjEgd2l0aCBzaG9ydCBzdHJpbmcgb3B0aW1pemF0aW9uCisgICAgICAgICAgICAgICAgc3RhdGljX2J1ZiA9IHNlbGYudmFsWydfTV9idWZmZXJzJ11bJ19NX3N0YXRpY19idWYnXQorICAgICAgICAgICAgICAgIGRhdGEgICAgICAgPSBzZWxmLnZhbFsnX01fZW5kX29mX3N0b3JhZ2UnXVsnX01fZGF0YSddCisgICAgICAgICAgICAgICAgaWYgc3RhdGljX2J1Zi5hZGRyZXNzICsgMSA9PSBkYXRhOgorICAgICAgICAgICAgICAgICAgICB0YTAgICAgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgwKQorICAgICAgICAgICAgICAgICAgICBzdGFydCAgPSBzdGF0aWNfYnVmLmNhc3QgKHRhMC5wb2ludGVyKCkpCisgICAgICAgICAgICAgICAgICAgIGZpbmlzaCA9IHNlbGYudmFsWydfTV9maW5pc2gnXQorICAgICAgICAgICAgICAgICAgICBpZiBzdGFydCA9PSBmaW5pc2g6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFNUTHBvcnQgNS4wIHdpdGhvdXQgX1NUTFBfRk9SQ0VfU1RSSU5HX1RFUk1JTkFUSU9OCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9idWZmZXJzJ11bJ19NX2R5bmFtaWNfYnVmJ10KKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgIyBTVExwb3J0IDUuMCBhbmQgNS4xIHdpdGhvdXQgc2hvcnQgc3RyaW5nIG9wdGltaXphdGlvbiwKKyAgICAgICAgICAgICAgICAjIGFuZCBTVExwb3J0IDQuNgorICAgICAgICAgICAgICAgIHN0YXJ0ICA9IHNlbGYudmFsWydfTV9zdGFydCddCisgICAgICAgICAgICAgICAgZmluaXNoID0gc2VsZi52YWxbJ19NX2ZpbmlzaCddCisgICAgICAgICAgICAgICAgaWYgc3RhcnQgPT0gZmluaXNoOgorICAgICAgICAgICAgICAgICAgICAjIFNUTHBvcnQgNS4wIHdpdGhvdXQgX1NUTFBfRk9SQ0VfU1RSSU5HX1RFUk1JTkFUSU9OCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICAgICAgICAgIHJldHVybiBzdGFydAorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnc3RyaW5nJworCisKK2NsYXNzIFZlY3RvclByaW50ZXI6CisgICAgIlByZXR0eSBwcmludGVyIGZvciBzdGQ6OnZlY3Rvci4iCisKKyAgICBjbGFzcyBJdGVyYXRvcjoKKworICAgICAgICBkZWYgX19pbml0X18gKHNlbGYsIHN0YXJ0LCBmaW5pc2gsIGJpdF92ZWN0b3IpOgorICAgICAgICAgICAgc2VsZi5iaXRfdmVjdG9yID0gYml0X3ZlY3RvcgorICAgICAgICAgICAgc2VsZi5jb3VudCAgICAgID0gMAorICAgICAgICAgICAgaWYgYml0X3ZlY3RvcjoKKyAgICAgICAgICAgICAgICBzZWxmLml0ZW0gICA9IHN0YXJ0WydfTV9wJ10KKyAgICAgICAgICAgICAgICBzZWxmLmlvICAgICA9IHN0YXJ0WydfTV9vZmZzZXQnXQorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoID0gZmluaXNoWydfTV9wJ10KKyAgICAgICAgICAgICAgICBzZWxmLmZvICAgICA9IGZpbmlzaFsnX01fb2Zmc2V0J10KKyAgICAgICAgICAgICAgICBzZWxmLmlzaXplICA9IDggKiBzZWxmLml0ZW0uZGVyZWZlcmVuY2UoKS50eXBlLnNpemVvZgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLml0ZW0gICA9IHN0YXJ0CisgICAgICAgICAgICAgICAgc2VsZi5maW5pc2ggPSBmaW5pc2gKKworICAgICAgICBkZWYgX19pdGVyX18gKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgKz0gMQorICAgICAgICAgICAgaWYgc2VsZi5iaXRfdmVjdG9yOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaXRlbSA9PSBzZWxmLmZpbmlzaCBhbmQgc2VsZi5pbyA9PSBzZWxmLmZvOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYuaXRlbS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAwCisgICAgICAgICAgICAgICAgaWYgZWxlbWVudCAmICgxIDw8IHNlbGYuaW8pOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IDEKKyAgICAgICAgICAgICAgICBzZWxmLmlvICs9IDEKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmlvID49IHNlbGYuaXNpemU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaXRlbSArPSAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW8gICA9ICAwCisgICAgICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgdmFsdWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaXRlbSA9PSBzZWxmLmZpbmlzaDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLml0ZW0uZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgIHNlbGYuaXRlbSArPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgZWxlbWVudCkKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IGdldF9ub25fZGVidWdfaW1wbCAodmFsKQorICAgICAgICBzZWxmLmJpdF92ZWN0b3IgXAorICAgICAgICAgICAgPSB2YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMCkuY29kZSA9PSBnZGIuVFlQRV9DT0RFX0JPT0wKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHN0YXJ0ICA9IHNlbGYudmFsWydfTV9zdGFydCddCisgICAgICAgIGZpbmlzaCA9IHNlbGYudmFsWydfTV9maW5pc2gnXQorICAgICAgICByZXR1cm4gc2VsZi5JdGVyYXRvciAoc3RhcnQsIGZpbmlzaCwgc2VsZi5iaXRfdmVjdG9yKQorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYml0X3ZlY3RvcjoKKyAgICAgICAgICAgIHN0YXJ0ICAgID0gc2VsZi52YWxbJ19NX3N0YXJ0J11bJ19NX3AnXQorICAgICAgICAgICAgc28gICAgICAgPSBzZWxmLnZhbFsnX01fc3RhcnQnXVsnX01fb2Zmc2V0J10KKyAgICAgICAgICAgIGZpbmlzaCAgID0gc2VsZi52YWxbJ19NX2ZpbmlzaCddWydfTV9wJ10KKyAgICAgICAgICAgIGZvICAgICAgID0gc2VsZi52YWxbJ19NX2ZpbmlzaCddWydfTV9vZmZzZXQnXQorICAgICAgICAgICAgZW5kICAgICAgPSBzZWxmLnZhbFsnX01fZW5kX29mX3N0b3JhZ2UnXVsnX01fZGF0YSddCisgICAgICAgICAgICBpc2l6ZSAgICA9IDggKiBzdGFydC5kZXJlZmVyZW5jZSgpLnR5cGUuc2l6ZW9mCisgICAgICAgICAgICBsZW5ndGggICA9IChpc2l6ZSAtIHNvKSArIGlzaXplICogKGZpbmlzaCAtIHN0YXJ0IC0gMSkgKyBmbworICAgICAgICAgICAgY2FwYWNpdHkgPSBpc2l6ZSAqIChlbmQgLSBzdGFydCkKKyAgICAgICAgICAgIHJldHVybiAoJyVzPGJvb2w+IG9mIGxlbmd0aCAlZCwgY2FwYWNpdHkgJWQnCisgICAgICAgICAgICAgICAgJSAoc2VsZi50eXBlbmFtZSwgbGVuZ3RoLCBjYXBhY2l0eSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGFydCAgICA9IHNlbGYudmFsWydfTV9zdGFydCddCisgICAgICAgICAgICBmaW5pc2ggICA9IHNlbGYudmFsWydfTV9maW5pc2gnXQorICAgICAgICAgICAgZW5kICAgICAgPSBzZWxmLnZhbFsnX01fZW5kX29mX3N0b3JhZ2UnXVsnX01fZGF0YSddCisgICAgICAgICAgICBsZW5ndGggICA9IGZpbmlzaCAtIHN0YXJ0CisgICAgICAgICAgICBjYXBhY2l0eSA9IGVuZCAtIHN0YXJ0CisgICAgICAgICAgICB0YTAgICAgICA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQgKDApCisgICAgICAgICAgICByZXR1cm4gKCclczwlcz4gb2YgbGVuZ3RoICVkLCBjYXBhY2l0eSAlZCcKKyAgICAgICAgICAgICAgICAlIChzZWxmLnR5cGVuYW1lLCB0YTAsIGxlbmd0aCwgY2FwYWNpdHkpKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIGlmIHByaW50X3ZlY3Rvcl93aXRoX2luZGljZXM6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdhcnJheScKKworCitjbGFzcyBXcmFwcGVyUHJpbnRlcjoKKyAgICAiUHJldHR5IHByaW50ZXIgZm9yIHN0ZDo6c3RhY2ssIHN0ZDo6cXVldWUsIGFuZCBzdGQ6OnByaW9yaXR5X3F1ZXVlLiIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorICAgICAgICBzZWxmLnZpc3VhbGl6ZXIgPSBnZGIuZGVmYXVsdF92aXN1YWxpemVyICh2YWxbJ2MnXSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZpc3VhbGl6ZXIuY2hpbGRyZW4oKQorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHRhMCA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQgKDApCisgICAgICAgIHJldHVybiAoJyVzPCVzPiwgd3JhcHBpbmcgJXMnCisgICAgICAgICAgICAlIChzZWxmLnR5cGVuYW1lLCB0YTAsIHNlbGYudmlzdWFsaXplci50b19zdHJpbmcoKSkpCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0ciAoc2VsZi52aXN1YWxpemVyLCAnZGlzcGxheV9oaW50Jyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi52aXN1YWxpemVyLmRpc3BsYXlfaGludCgpCisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgVW5vcmRlcmVkTWFwUHJpbnRlcjoKKyAgICAiIiJQcmV0dHkgcHJpbnRlciBmb3Igc3RkOjp0cjE6OnVub3JkZXJlZF9tYXAKKyAgICBhbmQgc3RkOjp0cjE6OnVub3JkZXJlZF9tdWx0aW1hcC4iIiIKKworICAgIGNsYXNzIEl0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18gKHNlbGYsIG5vZGVfdHlwZSwgaGVhZCk6CisgICAgICAgICAgICBzZWxmLm5vZGVfdHlwZSA9IG5vZGVfdHlwZQorICAgICAgICAgICAgc2VsZi5pdGVtICA9IGhlYWRbJ19NX25leHQnXQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18gKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLml0ZW0gPT0gMCBhbmQgc2VsZi5jb3VudCAlIDIgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICBpZiBzZWxmLmNvdW50ICUgMiA9PSAwOgorICAgICAgICAgICAgICAgIHNlbGYucGFpciA9IHNlbGYuaXRlbS5jYXN0IChzZWxmLm5vZGVfdHlwZSkuZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgIHNlbGYuaXRlbSA9IHNlbGYucGFpclsnX01fbmV4dCddCisgICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYucGFpclsnX01fZGF0YSddWydmaXJzdCddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLnBhaXJbJ19NX2RhdGEnXVsnc2Vjb25kJ10KKyAgICAgICAgICAgIGNvdW50ID0gc2VsZi5jb3VudAorICAgICAgICAgICAgc2VsZi5jb3VudCArPSAxCisgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBlbGVtZW50KQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSBnZXRfbm9uX2RlYnVnX2ltcGwgKHZhbCkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIGtleV90eXBlICAgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgwKQorICAgICAgICB2YWx1ZV90eXBlID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMSkKKyAgICAgICAgcGFpcl90eXBlICBcCisgICAgICAgICAgICA9IGxvb2t1cF9zdGxwb3J0X3R5cGUgKCdwYWlyPCVzIGNvbnN0LCVzPicgJSAoa2V5X3R5cGUsdmFsdWVfdHlwZSkpCisgICAgICAgIG5vZGVfdHlwZSAgXAorICAgICAgICAgICAgPSBsb29rdXBfc3RscG9ydF9wcml2X3R5cGUgKCdfU2xpc3Rfbm9kZTwlcyA+JworICAgICAgICAgICAgICAgICUgc3RyIChwYWlyX3R5cGUpKS5wb2ludGVyKCkKKyAgICAgICAgZWxlbWVudHMgPSBnZXRfbm9uX2RlYnVnX2ltcGwgKHNlbGYudmFsLCAnX01faHQnKVsnX01fZWxlbXMnXQorICAgICAgICByZXR1cm4gc2VsZi5JdGVyYXRvciAobm9kZV90eXBlLCBlbGVtZW50c1snX01faGVhZCddWydfTV9kYXRhJ10pCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgdGEwID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMCkKKyAgICAgICAgbGVuZ3RoID0gZ2V0X25vbl9kZWJ1Z19pbXBsIChzZWxmLnZhbCwgJ19NX2h0JylbJ19NX251bV9lbGVtZW50cyddCisgICAgICAgIGlmIGxlbmd0aCA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICdlbXB0eSAlczwlcz4nICUgKHNlbGYudHlwZW5hbWUsIHRhMCkKKyAgICAgICAgcmV0dXJuICclczwlcz4gd2l0aCAlZCBlbGVtZW50cycgJSAoc2VsZi50eXBlbmFtZSwgdGEwLCBsZW5ndGgpCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdtYXAnCisKKworY2xhc3MgVW5vcmRlcmVkU2V0UHJpbnRlcjoKKyAgICAiIiJQcmV0dHkgcHJpbnRlciBmb3Igc3RkOjp0cjE6OnVub3JkZXJlZF9zZXQKKyAgICBhbmQgc3RkOjp0cjE6OnVub3JkZXJlZF9tdWx0aXNldC4iIiIKKworICAgIGNsYXNzIEl0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18gKHNlbGYsIG5vZGVfdHlwZSwgaGVhZCk6CisgICAgICAgICAgICBzZWxmLm5vZGVfdHlwZSA9IG5vZGVfdHlwZQorICAgICAgICAgICAgc2VsZi5pdGVtICA9IGhlYWRbJ19NX25leHQnXQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18gKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLml0ZW0gPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICBub2RlID0gc2VsZi5pdGVtLmNhc3QgKHNlbGYubm9kZV90eXBlKS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICBzZWxmLml0ZW0gPSBub2RlWydfTV9uZXh0J10KKyAgICAgICAgICAgIGNvdW50ID0gc2VsZi5jb3VudAorICAgICAgICAgICAgc2VsZi5jb3VudCArPSAxCisgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBub2RlWydfTV9kYXRhJ10pCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IGdldF9ub25fZGVidWdfaW1wbCAodmFsKQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgdGEwID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorICAgICAgICBub2RlX3R5cGUgPSBsb29rdXBfc3RscG9ydF9wcml2X3R5cGUgKCdfU2xpc3Rfbm9kZTwlcz4nICUgdGEwKS5wb2ludGVyKCkKKyAgICAgICAgZWxlbWVudHMgPSBnZXRfbm9uX2RlYnVnX2ltcGwgKHNlbGYudmFsLCAnX01faHQnKVsnX01fZWxlbXMnXQorICAgICAgICByZXR1cm4gc2VsZi5JdGVyYXRvciAobm9kZV90eXBlLCBlbGVtZW50c1snX01faGVhZCddWydfTV9kYXRhJ10pCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgdGEwID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMCkKKyAgICAgICAgbGVuZ3RoID0gZ2V0X25vbl9kZWJ1Z19pbXBsIChzZWxmLnZhbCwgJ19NX2h0JylbJ19NX251bV9lbGVtZW50cyddCisgICAgICAgIGlmIGxlbmd0aCA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICdlbXB0eSAlczwlcz4nICUgKHNlbGYudHlwZW5hbWUsIHRhMCkKKyAgICAgICAgcmV0dXJuICclczwlcz4gd2l0aCAlZCBlbGVtZW50cycgJSAoc2VsZi50eXBlbmFtZSwgdGEwLCBsZW5ndGgpCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdhcnJheScKKworCitjbGFzcyBBdXRvcHRyUHJpbnRlcjoKKyAgICAiUHJldHR5IHByaW50ZXIgZm9yIHN0ZDo6YXV0b19wdHIuIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgdGEwID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMCkKKyAgICAgICAgcG9pbnRlciA9IHNlbGYudmFsWydfTV9wJ10uY2FzdCAodGEwLnBvaW50ZXIoKSkKKyAgICAgICAgaWYgcG9pbnRlciA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICgnJXM8JXM+IChlbXB0eSknICUgKHNlbGYudHlwZW5hbWUsIHRhMCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKCclczwlcz4sIHBvaW50aW5nIHRvICVzJworICAgICAgICAgICAgICAgICUgKHNlbGYudHlwZW5hbWUsIHRhMCwgcG9pbnRlci5kZXJlZmVyZW5jZSgpKSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIFNoYXJlZHB0clByaW50ZXI6CisgICAgIlByZXR0eSBwcmludGVyIGZvciBzdGQ6OnNoYXJlZF9wdHIgYW5kIHN0ZDo6d2Vha19wdHIuIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgdGEwID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMCkKKyAgICAgICAgcG9pbnRlciA9IHNlbGYudmFsWydweCddLmNhc3QgKHRhMC5wb2ludGVyKCkpCisgICAgICAgIGlmIHBvaW50ZXIgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAoJyVzPCVzPiAoZW1wdHkpJyAlIChzZWxmLnR5cGVuYW1lLCB0YTApKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY291bnQgPSBzZWxmLnZhbFsncG4nXVsncGlfJ11bJ3VzZV9jb3VudF8nXQorICAgICAgICAgICAgcmV0dXJuICgnJXM8JXM+IChjb3VudCAlZCksIHBvaW50aW5nIHRvICVzJworICAgICAgICAgICAgICAgICUgKHNlbGYudHlwZW5hbWUsIHRhMCwgY291bnQsIHBvaW50ZXIuZGVyZWZlcmVuY2UoKSkpCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitkZWYgbG9va3VwX2Z1bmN0aW9uICh2YWwpOgorICAgICJMb29rLXVwIGFuZCByZXR1cm4gYSBwcmV0dHktcHJpbnRlciB0aGF0IGNhbiBwcmludCB2YWwuIgorCisgICAgdHlwZSA9IHZhbC50eXBlCisgICAgaWYgdHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfUkVGOgorICAgICAgICB0eXBlID0gdHlwZS50YXJnZXQoKQorICAgIHR5cGUgPSB0eXBlLnVucXVhbGlmaWVkKCkuc3RyaXBfdHlwZWRlZnMoKQorCisgICAgdHlwZW5hbWUgPSB0eXBlLnRhZworICAgIGlmIHR5cGVuYW1lID09IE5vbmU6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBmb3IgZnVuY3Rpb24gaW4gcHJldHR5X3ByaW50ZXJzX2RpY3Q6CisgICAgICAgIGlmIGZ1bmN0aW9uLnNlYXJjaCAodHlwZW5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIHByZXR0eV9wcmludGVyc19kaWN0W2Z1bmN0aW9uXSAodmFsKQorICAgIHJldHVybiBOb25lCisKKworZGVmIHJlZ2lzdGVyX3N0bHBvcnRfcHJpbnRlcnMgKG9iaik6CisgICAgIlJlZ2lzdGVyIFNUTHBvcnQgcHJldHR5LXByaW50ZXJzIHdpdGggb2JqZWN0IGZpbGUgb2JqLiIKKworICAgIGlmIG9iaiA9PSBOb25lOgorICAgICAgICBvYmogPSBnZGIKKyAgICBvYmoucHJldHR5X3ByaW50ZXJzLmFwcGVuZCAobG9va3VwX2Z1bmN0aW9uKQorCisKKworcHJldHR5X3ByaW50ZXJzX2RpY3QgPSB7fQorCitkZWYgYWRkX2VudHJ5IChyZWdleCwgcHJpbnRlciwgdHlwZW5hbWUpOgorICAgIHByZWZpeCA9ICJeKHN0bHBkP19zdGR8X1NUTHxzdGQpOjoiCisgICAgc3VmZml4ID0gIjwuKj4kIgorICAgIGlmIHR5cGVuYW1lICE9IE5vbmU6CisgICAgICAgIHR5cGVuYW1lID0gInN0ZDo6IiArIHR5cGVuYW1lCisgICAgaWYgcmVnZXhbMDo1XSA9PSAiYm9vc3QiOgorICAgICAgICBwcmVmaXggPSAiIgorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUgKHByZWZpeCtyZWdleCtzdWZmaXgpXSBcCisgICAgICAgID0gbGFtYmRhIHZhbDogcHJpbnRlciAodHlwZW5hbWUsIHZhbCkKKworYWRkX2VudHJ5ICgiYmFzaWNfc3RyaW5nIiwgICBTdHJpbmdQcmludGVyLCAgTm9uZSkKK2FkZF9lbnRyeSAoImJpdHNldCIsICAgICAgICAgQml0c2V0UHJpbnRlciwgICJiaXRzZXQiKQorYWRkX2VudHJ5ICgiZGVxdWUiLCAgICAgICAgICBEZXF1ZVByaW50ZXIsICAgImRlcXVlIikKK2FkZF9lbnRyeSAoIm1hcCIsICAgICAgICAgICAgTWFwUHJpbnRlciwgICAgICJtYXAiKQorYWRkX2VudHJ5ICgibGlzdCIsICAgICAgICAgICBMaXN0UHJpbnRlciwgICAgImxpc3QiKQorYWRkX2VudHJ5ICgibXVsdGltYXAiLCAgICAgICBNYXBQcmludGVyLCAgICAgIm11bHRpbWFwIikKK2FkZF9lbnRyeSAoIm11bHRpc2V0IiwgICAgICAgU2V0UHJpbnRlciwgICAgICJtdWx0aXNldCIpCithZGRfZW50cnkgKCJxdWV1ZSIsICAgICAgICAgIFdyYXBwZXJQcmludGVyLCAicXVldWUiKQorYWRkX2VudHJ5ICgicHJpb3JpdHlfcXVldWUiLCBXcmFwcGVyUHJpbnRlciwgInByaW9yaXR5X3F1ZXVlIikKK2FkZF9lbnRyeSAoInNldCIsICAgICAgICAgICAgU2V0UHJpbnRlciwgICAgICJzZXQiKQorYWRkX2VudHJ5ICgic2xpc3QiLCAgICAgICAgICBTbGlzdFByaW50ZXIsICAgInNsaXN0IikKK2FkZF9lbnRyeSAoInN0YWNrIiwgICAgICAgICAgV3JhcHBlclByaW50ZXIsICJzdGFjayIpCithZGRfZW50cnkgKCJ2ZWN0b3IiLCAgICAgICAgIFZlY3RvclByaW50ZXIsICAidmVjdG9yIikKKworYWRkX2VudHJ5ICgidHIxOjp1bm9yZGVyZWRfbWFwIiwgICAgICBVbm9yZGVyZWRNYXBQcmludGVyLCAidHIxOjp1bm9yZGVyZWRfbWFwIikKK2FkZF9lbnRyeSAoInRyMTo6dW5vcmRlcmVkX211bHRpbWFwIiwgVW5vcmRlcmVkTWFwUHJpbnRlciwgInRyMTo6dW5vcmRlcmVkX211bHRpbWFwIikKK2FkZF9lbnRyeSAoInRyMTo6dW5vcmRlcmVkX3NldCIsICAgICAgVW5vcmRlcmVkU2V0UHJpbnRlciwgInRyMTo6dW5vcmRlcmVkX3NldCIpCithZGRfZW50cnkgKCJ0cjE6OnVub3JkZXJlZF9tdWx0aXNldCIsIFVub3JkZXJlZFNldFByaW50ZXIsICJ0cjE6OnVub3JkZXJlZF9tdWx0aXNldCIpCisKK2FkZF9lbnRyeSAoImF1dG9fcHRyIiwgICAgICAgICAgQXV0b3B0clByaW50ZXIsICAgImF1dG9fcHRyIikKK2FkZF9lbnRyeSAoImJvb3N0OjpzaGFyZWRfcHRyIiwgU2hhcmVkcHRyUHJpbnRlciwgInRyMTo6c2hhcmVkX3B0ciIpCithZGRfZW50cnkgKCJib29zdDo6d2Vha19wdHIiLCAgIFNoYXJlZHB0clByaW50ZXIsICJ0cjE6OndlYWtfcHRyIikKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvLl8uZ2RiaW5pdCBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvLl8uZ2RiaW5pdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmM4NGNmCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvdGVzdC8uXy5nZGJpbml0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvLl9NYWtlZmlsZSBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvLl9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzBhZDBhCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvdGVzdC8uX01ha2VmaWxlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvLl9zY3JpcHQgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC90ZXN0Ly5fc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjJhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC90ZXN0Ly5fc2NyaXB0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvLl90ZXN0LmNwcCBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvLl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDUzMGUzCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvdGVzdC8uX3Rlc3QuY3BwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvLmdkYmluaXQgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC90ZXN0Ly5nZGJpbml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNDJmNjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC90ZXN0Ly5nZGJpbml0CkBAIC0wLDAgKzEsMTIgQEAKK3B5dGhvbgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK3N5cy5wYXRoLmluc2VydCAoMCwgb3MuZ2V0Y3dkKCkgKyAnLy4uJykKK2ltcG9ydCBzdGxwb3J0LnByaW50ZXJzCitzdGxwb3J0LnByaW50ZXJzLnJlZ2lzdGVyX3N0bHBvcnRfcHJpbnRlcnMgKE5vbmUpCisKKyMgc3RscG9ydC5wcmludGVycy5zdGxwb3J0X3ZlcnNpb24gICAgICAgICAgID0gNS4yCisjIHN0bHBvcnQucHJpbnRlcnMucHJpbnRfdmVjdG9yX3dpdGhfaW5kaWNlcyA9IEZhbHNlCisKK2VuZApkaWZmIC0tZ2l0IGEvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvdGVzdC9NYWtlZmlsZSBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2OGZiNwotLS0gL2Rldi9udWxsCisrKyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvTWFrZWZpbGUKQEAgLTAsMCArMSwxMTcgQEAKK0NYWD1nKysKK0dEQj1nZGIKKworIyBBZGp1c3QgYW5kIHVuY29tbWVudCB0byBlbmFibGUgdGhlIGNvcnJlc3BvbmRpbmcgdGVzdHMKKyMgU1RMUE9SVDQ2X1JPT1RfRElSPS91c3IvbG9jYWwvc3RscG9ydC00LjYuMgorIyBTVExQT1JUNTBfUk9PVF9ESVI9L3Vzci9sb2NhbC9zdGxwb3J0LTUuMC4zCisjIFNUTFBPUlQ1MV9ST09UX0RJUj0vdXNyL2xvY2FsL3N0bHBvcnQtNS4xLjcKKyMgU1RMUE9SVDUyX1JPT1RfRElSPS91c3IvbG9jYWwvc3RscG9ydC01LjIuMQorCisjIFRvIGVuYWJsZSBCb29zdCBzdXBwb3J0IHlvdSBtaWdodCBuZWVkIHRvIHBhdGNoCisjICQoU1RMUE9SVDUyX1JPT1RfRElSKS9pbmNsdWRlL3N0bHBvcnQvc3RsL3R5cGVfdHJhaXRzLmgKKyMgdG8gaW5jbHVkZSA8Ym9vc3QvdHlwZV90cmFpdHMvcmVtb3ZlX2NvbnN0LmhwcD4uCisjIFNUTFBPUlQ1Ml9VU0VfQk9PU1RfU1VQUE9SVD0xCisKKworCisjIENvbW1vbiBmbGFncyBmb3IgU1RMcG9ydCA0LjYueCB0ZXN0cworU1RMUE9SVDQ2X0ZMQUdTID0gXAorICAkKENYWEZMQUdTKSAkKExERkxBR1MpIFwKKyAgLUkkKFNUTFBPUlQ0Nl9ST09UX0RJUikvaW5jbHVkZS9zdGxwb3J0IFwKKyAgLUwkKFNUTFBPUlQ0Nl9ST09UX0RJUikvbGliIFwKKyAgLVdsLC1SJChTVExQT1JUNDZfUk9PVF9ESVIpL2xpYiBcCisgIC1wdGhyZWFkCisKKyMgQ29tbW9uIGZsYWdzIGZvciBTVExwb3J0IDUuMC54IHRlc3RzCitTVExQT1JUNTBfRkxBR1MgPSBcCisgICQoQ1hYRkxBR1MpICQoTERGTEFHUykgXAorICAtSSQoU1RMUE9SVDUwX1JPT1RfRElSKS9pbmNsdWRlL3N0bHBvcnQgXAorICAtTCQoU1RMUE9SVDUwX1JPT1RfRElSKS9saWIgXAorICAtV2wsLVIkKFNUTFBPUlQ1MF9ST09UX0RJUikvbGliIFwKKyAgLXB0aHJlYWQKKworIyBDb21tb24gZmxhZ3MgZm9yIFNUTHBvcnQgNS4xLnggdGVzdHMKK1NUTFBPUlQ1MV9GTEFHUyA9IFwKKyAgJChDWFhGTEFHUykgJChMREZMQUdTKSBcCisgIC1JJChTVExQT1JUNTFfUk9PVF9ESVIpL2luY2x1ZGUvc3RscG9ydCBcCisgIC1MJChTVExQT1JUNTFfUk9PVF9ESVIpL2xpYiBcCisgIC1XbCwtUiQoU1RMUE9SVDUxX1JPT1RfRElSKS9saWIgXAorICAtcHRocmVhZAorCisjIENvbW1vbiBmbGFncyBmb3IgU1RMcG9ydCA1LjIueCB0ZXN0cworU1RMUE9SVDUyX0ZMQUdTID0gXAorICAkKENYWEZMQUdTKSAkKExERkxBR1MpIFwKKyAgLUkkKFNUTFBPUlQ1Ml9ST09UX0RJUikvaW5jbHVkZS9zdGxwb3J0IFwKKyAgLUwkKFNUTFBPUlQ1Ml9ST09UX0RJUikvbGliIFwKKyAgLVdsLC1SJChTVExQT1JUNTJfUk9PVF9ESVIpL2xpYiBcCisgIC1wdGhyZWFkCisKK2lmbmVxICgkKFNUTFBPUlQ1Ml9VU0VfQk9PU1RfU1VQUE9SVCksKQorU1RMUE9SVDUyX0ZMQUdTICs9IC1EX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQKK2VuZGlmCisKKworCisjIEFkZCBTVExwb3J0IDQuNi54IHRlc3RzIHRvICQoVEFSR0VUUykgKGlmIGVuYWJsZWQpCitpZm5lcSAoJChTVExQT1JUNDZfUk9PVF9ESVIpLCkKK1RBUkdFVFMgKz0gdGVzdF9zdGxwb3J0NDYgdGVzdF9zdGxwb3J0NDZkCitlbmRpZgorCisjIEFkZCBTVExwb3J0IDUuMC54IHRlc3RzIHRvICQoVEFSR0VUUykgKGlmIGVuYWJsZWQpCitpZm5lcSAoJChTVExQT1JUNTBfUk9PVF9ESVIpLCkKK1RBUkdFVFMgKz0gdGVzdF9zdGxwb3J0NTAgdGVzdF9zdGxwb3J0NTBkCitlbmRpZgorCisjIEFkZCBTVExwb3J0IDUuMS54IHRlc3RzIHRvICQoVEFSR0VUUykgKGlmIGVuYWJsZWQpCitpZm5lcSAoJChTVExQT1JUNTFfUk9PVF9ESVIpLCkKK1RBUkdFVFMgKz0gdGVzdF9zdGxwb3J0NTEgdGVzdF9zdGxwb3J0NTFkCitlbmRpZgorCisjIEFkZCBTVExwb3J0IDUuMi54IHRlc3RzIHRvICQoVEFSR0VUUykgKGlmIGVuYWJsZWQpCitpZm5lcSAoJChTVExQT1JUNTJfUk9PVF9ESVIpLCkKK1RBUkdFVFMgKz0gdGVzdF9zdGxwb3J0NTIgdGVzdF9zdGxwb3J0NTJkCitlbmRpZgorCisKKworZGVmYXVsdDogcnVuCitpZmVxICgkKFRBUkdFVFMpLCkKKwlAZWNobyAiWW91IG5lZWQgdG8gY29uZmlndXJlIHRoZSBTVExwb3J0IGRpcmVjdG9yeSBhdCB0aGUgc3RhcnQgb2YgdGhlIE1ha2VmaWxlLiIKK2VuZGlmCisKK3J1bjogYnVpbGQKK2lmbmVxICgkKFRBUkdFVFMpLCkKKwlmb3IgVEFSR0VUIGluICQoVEFSR0VUUyk7IGRvIFwKKwkgIGVjaG8gIlJ1bm5pbmcgdGVzdCBmb3IgJCRUQVJHRVQiOyBcCisJICAkKEdEQikgLWJhdGNoIC14IHNjcmlwdCAuLyQkVEFSR0VUOyBcCisJZG9uZQorZW5kaWYKKworYnVpbGQ6ICQoVEFSR0VUUykKKwordGVzdF9zdGxwb3J0NDY6IHRlc3QuY3BwIE1ha2VmaWxlCisJJChDWFgpIC1vICRAICQ8IC1nICQoU1RMUE9SVDQ2X0ZMQUdTKSAtbHN0bHBvcnRfZ2NjCisKK3Rlc3Rfc3RscG9ydDQ2ZDogdGVzdC5jcHAgTWFrZWZpbGUKKwkkKENYWCkgLW8gJEAgJDwgLWcgJChTVExQT1JUNDZfRkxBR1MpIC1sc3RscG9ydF9nY2Nfc3RsZGVidWcgLURfU1RMUF9ERUJVRworCit0ZXN0X3N0bHBvcnQ1MDogdGVzdC5jcHAgTWFrZWZpbGUKKwkkKENYWCkgLW8gJEAgJDwgLWcgJChTVExQT1JUNTBfRkxBR1MpIC1sc3RscG9ydAorCit0ZXN0X3N0bHBvcnQ1MGQ6IHRlc3QuY3BwIE1ha2VmaWxlCisJJChDWFgpIC1vICRAICQ8IC1nICQoU1RMUE9SVDUwX0ZMQUdTKSAtbHN0bHBvcnRzdGxnIC1EX1NUTFBfREVCVUcKKwordGVzdF9zdGxwb3J0NTE6IHRlc3QuY3BwIE1ha2VmaWxlCisJJChDWFgpIC1vICRAICQ8IC1nICQoU1RMUE9SVDUxX0ZMQUdTKSAtbHN0bHBvcnQKKwordGVzdF9zdGxwb3J0NTFkOiB0ZXN0LmNwcCBNYWtlZmlsZQorCSQoQ1hYKSAtbyAkQCAkPCAtZyAkKFNUTFBPUlQ1MV9GTEFHUykgLWxzdGxwb3J0c3RsZyAtRF9TVExQX0RFQlVHCisKK3Rlc3Rfc3RscG9ydDUyOiB0ZXN0LmNwcCBNYWtlZmlsZQorCSQoQ1hYKSAtbyAkQCAkPCAtZyAkKFNUTFBPUlQ1Ml9GTEFHUykgLWxzdGxwb3J0CisKK3Rlc3Rfc3RscG9ydDUyZDogdGVzdC5jcHAgTWFrZWZpbGUKKwkkKENYWCkgLW8gJEAgJDwgLWcgJChTVExQT1JUNTJfRkxBR1MpIC1sc3RscG9ydHN0bGcgLURfU1RMUF9ERUJVRworCitjbGVhbjoKKwlybSAtZiB0ZXN0X3N0bHBvcnQqCmRpZmYgLS1naXQgYS9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC90ZXN0L3NjcmlwdCBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3Qvc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOWZmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC90ZXN0L3NjcmlwdApAQCAtMCwwICsxLDQxIEBACitiIGZvbworcgorZmluCitwIHN0cmluZzEKK3Agc3RyaW5nMgorcCBzdHJpbmczCitwIHdzdHJpbmcxCitwIHdzdHJpbmcyCitwIHdzdHJpbmczCitwIHZlY3RvcjEKK3AgdmVjdG9yMgorcCBtYXAxCitwIG11bHRpbWFwMQorcCBzZXQxCitwIG11bHRpc2V0MQorcCBsaXN0MQorcCBsaXN0MgorcCBzbGlzdDEKK3Agc2xpc3QyCitwIGRlcXVlMQorcCBkZXF1ZTIKK3Agc3RhY2sxCitwIHF1ZXVlMQorcCBwcmlvcml0eV9xdWV1ZTEKK3AgYml0c2V0MQorcCBiaXRzZXQyCitwIHVub3JkZXJlZF9tYXAxCitwIHVub3JkZXJlZF9tYXAyCitwIHVub3JkZXJlZF9tdWx0aW1hcDEKK3AgdW5vcmRlcmVkX211bHRpbWFwMgorcCB1bm9yZGVyZWRfc2V0MQorcCB1bm9yZGVyZWRfc2V0MgorcCB1bm9yZGVyZWRfbXVsdGlzZXQxCitwIHVub3JkZXJlZF9tdWx0aXNldDIKK3AgYXV0b19wdHIxCitwIGF1dG9fcHRyMgorcCBzaGFyZWRfcHRyMQorcCBzaGFyZWRfcHRyMgorcCB3ZWFrX3B0cjEKK3Agd2Vha19wdHIyCitxCmRpZmYgLS1naXQgYS9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC90ZXN0L3Rlc3QuY3BwIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvdGVzdC90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTBlZjFmCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvdGVzdC90ZXN0LmNwcApAQCAtMCwwICsxLDE4MSBAQAorI2luY2x1ZGUgPGJpdHNldD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8c2V0PgorI2lmZGVmIF9TVExQT1JUX1ZFUlNJT04KKyNpbmNsdWRlIDxzbGlzdD4KKyNlbmRpZiAvLyBfU1RMUE9SVF9WRVJTSU9OCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0YWNrPgorI2lmIF9TVExQT1JUX1ZFUlNJT04gPj0gMHg1MjAKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjZW5kaWYgLy9fU1RMUE9SVF9WRVJTSU9OID49IDB4NTIwCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaWZkZWYgX1NUTFBPUlRfVkVSU0lPTgorI2RlZmluZSBTVERfVFIxIHN0ZDo6dHIxCisjZWxzZSAvLyBfU1RMUE9SVF9WRVJTSU9OCisjZGVmaW5lIFNURF9UUjEgc3RkCisjZW5kaWYgLy8gX1NUTFBPUlRfVkVSU0lPTgorCitzdHJ1Y3QgTGFyZ2UgeworICBjaGFyIG1fZm9vWzEwMF07Cit9OworCit2b2lkIGZvbygpIHsgfQorCitpbnQgbWFpbigpIHsKKworICBzdGQ6OnN0cmluZyBzdHJpbmcxID0gIiI7CisgIHN0ZDo6c3RyaW5nIHN0cmluZzIgPSAiYSBzaG9ydCBzdHJpbmciOworICBzdGQ6OnN0cmluZyBzdHJpbmczID0gImEgdmVyeSBsb25nIHN0cmluZyAuLi4iOworCisgIHN0ZDo6d3N0cmluZyB3c3RyaW5nMSA9IEwiIjsKKyAgc3RkOjp3c3RyaW5nIHdzdHJpbmcyID0gTCJhIHNob3J0IHN0cmluZyI7CisgIHN0ZDo6d3N0cmluZyB3c3RyaW5nMyA9IEwiYSB2ZXJ5IGxvbmcgc3RyaW5nIC4uLiI7CisKKyAgc3RkOjp2ZWN0b3I8aW50PiB2ZWN0b3IxOworICB2ZWN0b3IxLnB1c2hfYmFjayggMTAwKTsKKyAgdmVjdG9yMS5wdXNoX2JhY2soIDIwMCk7CisgIHZlY3RvcjEucHVzaF9iYWNrKCAzMDApOworCisgIHN0ZDo6dmVjdG9yPGJvb2w+IHZlY3RvcjI7CisgIHZlY3RvcjIucHVzaF9iYWNrKCB0cnVlKTsKKyAgdmVjdG9yMi5wdXNoX2JhY2soIGZhbHNlKTsKKyAgdmVjdG9yMi5wdXNoX2JhY2soIHRydWUpOworCisgIHN0ZDo6bWFwPGludCxpbnQ+IG1hcDE7CisgIG1hcDFbMV0gPSAtMTsKKyAgbWFwMVsyMV0gPSAtMjE7CisgIG1hcDFbNDJdID0gLTQyOworCisgIHN0ZDo6bXVsdGltYXA8aW50LGludD4gbXVsdGltYXAxOworICBtdWx0aW1hcDEuaW5zZXJ0IChzdGQ6OnBhaXI8aW50LGludD4gKDEsIC0xKSk7CisgIG11bHRpbWFwMS5pbnNlcnQgKHN0ZDo6cGFpcjxpbnQsaW50PiAoMSwgLTIpKTsKKyAgbXVsdGltYXAxLmluc2VydCAoc3RkOjpwYWlyPGludCxpbnQ+ICgyMSwgLTIxKSk7CisgIG11bHRpbWFwMS5pbnNlcnQgKHN0ZDo6cGFpcjxpbnQsaW50PiAoMjEsIC0yMikpOworICBtdWx0aW1hcDEuaW5zZXJ0IChzdGQ6OnBhaXI8aW50LGludD4gKDQyLCAtNDIpKTsKKyAgbXVsdGltYXAxLmluc2VydCAoc3RkOjpwYWlyPGludCxpbnQ+ICg0MiwgLTQzKSk7CisKKyAgc3RkOjpzZXQ8aW50PiBzZXQxOworICBzZXQxLmluc2VydCggMTAwKTsKKyAgc2V0MS5pbnNlcnQoIDIwMCk7CisgIHNldDEuaW5zZXJ0KCAzMDApOworCisgIHN0ZDo6bXVsdGlzZXQ8aW50PiBtdWx0aXNldDE7CisgIG11bHRpc2V0MS5pbnNlcnQoIDEwMCk7CisgIG11bHRpc2V0MS5pbnNlcnQoIDEwMCk7CisgIG11bHRpc2V0MS5pbnNlcnQoIDIwMCk7CisgIG11bHRpc2V0MS5pbnNlcnQoIDIwMCk7CisgIG11bHRpc2V0MS5pbnNlcnQoIDMwMCk7CisgIG11bHRpc2V0MS5pbnNlcnQoIDMwMCk7CisKKyAgc3RkOjpsaXN0PGludD4gbGlzdDE7CisgIHN0ZDo6bGlzdDxpbnQ+IGxpc3QyOworICBsaXN0MS5wdXNoX2JhY2soIDEwMCk7CisgIGxpc3QxLnB1c2hfYmFjayggMjAwKTsKKyAgbGlzdDEucHVzaF9iYWNrKCAzMDApOworCisjaWZkZWYgX1NUTFBPUlRfVkVSU0lPTgorICBzdGQ6OnNsaXN0PGludD4gc2xpc3QxOworICBzdGQ6OnNsaXN0PGludD4gc2xpc3QyOworICBzbGlzdDEucHVzaF9mcm9udCggMTAwKTsKKyAgc2xpc3QxLnB1c2hfZnJvbnQoIDIwMCk7CisgIHNsaXN0MS5wdXNoX2Zyb250KCAzMDApOworI2Vsc2UgLy8gX1NUTFBPUlRfVkVSU0lPTgorICBzdGQ6OnN0cmluZyBzbGlzdDEgPSAic3RkOjpzbGlzdCBub3Qgc3VwcG9ydGVkIjsKKyAgc3RkOjpzdHJpbmcgc2xpc3QyID0gInN0ZDo6c2xpc3Qgbm90IHN1cHBvcnRlZCI7CisjZW5kaWYgLy8gX1NUTFBPUlRfVkVSU0lPTgorCisgIHN0ZDo6ZGVxdWU8aW50PiBkZXF1ZTE7CisgIGRlcXVlMS5wdXNoX2Zyb250KCAxMDApOworICBkZXF1ZTEucHVzaF9mcm9udCggMjAwKTsKKyAgZGVxdWUxLnB1c2hfZnJvbnQoIDMwMCk7CisKKyAgc3RkOjpkZXF1ZTxMYXJnZT4gZGVxdWUyOworICBkZXF1ZTIucHVzaF9iYWNrKCBMYXJnZSgpKTsKKyAgZGVxdWUyLnB1c2hfYmFjayggTGFyZ2UoKSk7CisgIGRlcXVlMi5wdXNoX2Zyb250KCBMYXJnZSgpKTsKKworICBzdGQ6OnN0YWNrPGludD4gc3RhY2sxOworICBzdGFjazEucHVzaCggMTAwKTsKKyAgc3RhY2sxLnB1c2goIDIwMCk7CisgIHN0YWNrMS5wdXNoKCAzMDApOworCisgIHN0ZDo6cXVldWU8aW50PiBxdWV1ZTE7CisgIHF1ZXVlMS5wdXNoKCAxMDApOworICBxdWV1ZTEucHVzaCggMjAwKTsKKyAgcXVldWUxLnB1c2goIDMwMCk7CisKKyAgc3RkOjpwcmlvcml0eV9xdWV1ZTxpbnQ+IHByaW9yaXR5X3F1ZXVlMTsKKyAgcHJpb3JpdHlfcXVldWUxLnB1c2goIDIwMCk7CisgIHByaW9yaXR5X3F1ZXVlMS5wdXNoKCAxMDApOworICBwcmlvcml0eV9xdWV1ZTEucHVzaCggMzAwKTsKKworICBzdGQ6OmJpdHNldDwxMDA+IGJpdHNldDE7CisgIGJpdHNldDFbMl0gPSAxOworICBiaXRzZXQxWzQyXSA9IDE7CisgIGJpdHNldDFbNjRdID0gMTsKKyAgCisgIHN0ZDo6Yml0c2V0PDE+IGJpdHNldDI7CisgIGJpdHNldDJbMF0gPSAxOworCisjaWYgX1NUTFBPUlRfVkVSU0lPTiA+PSAweDUyMAorICBTVERfVFIxOjp1bm9yZGVyZWRfbWFwPGludCxpbnQ+IHVub3JkZXJlZF9tYXAxOworICBTVERfVFIxOjp1bm9yZGVyZWRfbWFwPGludCxpbnQ+IHVub3JkZXJlZF9tYXAyOworICBmb3IoIGludCBpID0gMDsgaSA8IDU7ICsraSkKKyAgICAgIHVub3JkZXJlZF9tYXAxW2kqaV0gPSAtaSppOworCisgIFNURF9UUjE6OnVub3JkZXJlZF9tdWx0aW1hcDxpbnQsaW50PiB1bm9yZGVyZWRfbXVsdGltYXAxOworICBTVERfVFIxOjp1bm9yZGVyZWRfbXVsdGltYXA8aW50LGludD4gdW5vcmRlcmVkX211bHRpbWFwMjsKKyAgZm9yKCBpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKKyAgICAgIHVub3JkZXJlZF9tdWx0aW1hcDEuaW5zZXJ0KCBzdGQ6OnBhaXI8aW50LGludD4oIGkqaSwgLWkqaSkpOworICAgICAgdW5vcmRlcmVkX211bHRpbWFwMS5pbnNlcnQoIHN0ZDo6cGFpcjxpbnQsaW50PiggaSppLCAgaSppKSk7CisgIH0KKworICBTVERfVFIxOjp1bm9yZGVyZWRfc2V0PGludD4gdW5vcmRlcmVkX3NldDE7CisgIFNURF9UUjE6OnVub3JkZXJlZF9zZXQ8aW50PiB1bm9yZGVyZWRfc2V0MjsKKyAgZm9yKCBpbnQgaSA9IDA7IGkgPCA1OyArK2kpCisgICAgICB1bm9yZGVyZWRfc2V0MS5pbnNlcnQoIGkqaSk7CisgIAorICBTVERfVFIxOjp1bm9yZGVyZWRfbXVsdGlzZXQ8aW50PiB1bm9yZGVyZWRfbXVsdGlzZXQxOworICBTVERfVFIxOjp1bm9yZGVyZWRfbXVsdGlzZXQ8aW50PiB1bm9yZGVyZWRfbXVsdGlzZXQyOworICBmb3IoIGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgICAgdW5vcmRlcmVkX211bHRpc2V0MS5pbnNlcnQoIC1pKmkpOworICAgICAgdW5vcmRlcmVkX211bHRpc2V0MS5pbnNlcnQoICBpKmkpOworICB9CisjZWxzZSAvLyBfU1RMUE9SVF9WRVJTSU9OIDwgMHg1MjAKKyAgc3RkOjpzdHJpbmcgdW5vcmRlcmVkX21hcDEgPSAic3RkOjp0cjE6OnVub3JkZXJlZF9tYXAgbm90IHN1cHBvcnRlZCI7CisgIHN0ZDo6c3RyaW5nIHVub3JkZXJlZF9tYXAyID0gInN0ZDo6dHIxOjp1bm9yZGVyZWRfbWFwIG5vdCBzdXBwb3J0ZWQiOworICBzdGQ6OnN0cmluZyB1bm9yZGVyZWRfbXVsdGltYXAxID0gInN0ZDo6dHIxOjp1bm9yZGVyZWRfbXVsdGltYXAgbm90IHN1cHBvcnRlZCI7CisgIHN0ZDo6c3RyaW5nIHVub3JkZXJlZF9tdWx0aW1hcDIgPSAic3RkOjp0cjE6OnVub3JkZXJlZF9tdWx0aW1hcCBub3Qgc3VwcG9ydGVkIjsKKyAgc3RkOjpzdHJpbmcgdW5vcmRlcmVkX3NldDEgPSAic3RkOjp0cjE6OnVub3JkZXJlZF9zZXQgbm90IHN1cHBvcnRlZCI7CisgIHN0ZDo6c3RyaW5nIHVub3JkZXJlZF9zZXQyID0gInN0ZDo6dHIxOjp1bm9yZGVyZWRfc2V0IG5vdCBzdXBwb3J0ZWQiOworICBzdGQ6OnN0cmluZyB1bm9yZGVyZWRfbXVsdGlzZXQxID0gInN0ZDo6dHIxOjp1bm9yZGVyZWRfbXVsdGlzZXQgbm90IHN1cHBvcnRlZCI7CisgIHN0ZDo6c3RyaW5nIHVub3JkZXJlZF9tdWx0aXNldDIgPSAic3RkOjp0cjE6OnVub3JkZXJlZF9tdWx0aXNldCBub3Qgc3VwcG9ydGVkIjsKKyNlbmRpZiAvLyBfU1RMUE9SVF9WRVJTSU9OIDwgMHg1MjAKKworICBzdGQ6OmF1dG9fcHRyPExhcmdlPiBhdXRvX3B0cjEoIG5ldyBMYXJnZSgpKTsKKyAgc3RkOjphdXRvX3B0cjxMYXJnZT4gYXV0b19wdHIyOworCisjaWZkZWYgX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQKKyAgU1REX1RSMTo6c2hhcmVkX3B0cjxMYXJnZT4gc2hhcmVkX3B0cjEoIG5ldyBMYXJnZSk7CisgIFNURF9UUjE6OnNoYXJlZF9wdHI8TGFyZ2U+IHNoYXJlZF9wdHIyOworICAKKyAgU1REX1RSMTo6d2Vha19wdHI8TGFyZ2U+IHdlYWtfcHRyMSggc2hhcmVkX3B0cjEpOworICBTVERfVFIxOjp3ZWFrX3B0cjxMYXJnZT4gd2Vha19wdHIyOworI2Vsc2UgLy8gX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQKKyAgc3RkOjpzdHJpbmcgc2hhcmVkX3B0cjEgPSAic3RkOjp0cjE6OnNoYXJlZF9wdHIgbm90IHN1cHBvcnRlZCI7CisgIHN0ZDo6c3RyaW5nIHNoYXJlZF9wdHIyID0gInN0ZDo6dHIxOjpzaGFyZWRfcHRyIG5vdCBzdXBwb3J0ZWQiOworCisgIHN0ZDo6c3RyaW5nIHdlYWtfcHRyMSA9ICJzdGQ6OnRyMTo6d2Vha19wdHIgbm90IHN1cHBvcnRlZCI7CisgIHN0ZDo6c3RyaW5nIHdlYWtfcHRyMiA9ICJzdGQ6OnRyMTo6d2Vha19wdHIgbm90IHN1cHBvcnRlZCI7CisjZW5kaWYgLy8gX1NUTFBfVVNFX0JPT1NUX1NVUFBPUlQKKyAgCisgIGZvbygpOworICByZXR1cm4gMDsKK30K